[
  {
    "path": ".gitattributes",
    "content": "src/test/resources/samples/* linguist-vendored\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.gradle/\n.idea/\n.sourcerer\nbuild/\nsourcerer-app.iml\nsourcerer-app.ipr\nsourcerer-app.iws\napp.iml\napp.ipr\napp.iws\n/confluence/target\n/dependencies\n/dist\n/gh-pages\n/ideaSDK\n/out\n/tmp\n*.versionsBackup\n/ultimate/dependencies\n/ultimate/ideaSDK\n/ultimate/out\n/ultimate/tmp\ntmp_repo\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Code of Conduct\n\nAs contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.\n\nWe are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.\n\nExamples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.\n\nThis Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at https://www.contributor-covenant.org/version/1/0/0/code-of-conduct.html\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contribution\n\nWe welcome contributions to [Sourcerer App](https://github.com/sourcerer-io/sourcerer-app) by the community.\n\nSee [README](https://github.com/sourcerer-io/sourcerer-app) for more information about prerequirements and building project.\n\n## How to report a problem\n\nPlease search before creating a new issue. Feel free to add issues related to the app or [sourcerer](https://sourcerer.io) site.\n\n## Submitting сhanges\n\n* Open a new issue in the [issue tracker](https://github.com/sourcerer-io/sourcerer-app/issues).\n* Fork and clone the repo with `git clone https://github.com/your-username/sourcerer-app.git`.\n* Create a new branch based off the `develop` branch.\n* Make changes.\n* Make sure all tests pass.\n* Submit a pull request, referencing any issues it addresses.\n\nWe will review your Pull Request as soon as possible. Thank you for contributing!\n\n## Integration testing\n\nWe will work on a special environment for contributors in the nearest future. For now one should use his personal or additional account on site.\n\n## Style guides\n### Commit messages\n\nFormat:\n```type(component): message (jira issue tag, github issue number with #)```\n\nMessage types:\n* **feat** is used when new feature is provided;\n* **wip** is used when making regular commit and changes don't match any other types;\n* **fix** is used when you fix a bug;\n* **chore** is used when changes are about organization, not about logic;\n* **docs** is used when you add/change documentation.\nComponent is a decomposition unit your commit affected. Write message in present simple.\n\nExamples:\nfeat(logger): add rotating\nchore: remove redundant commas, add copyright\nwip: pass models to routers\nfix: program exit is prevented when button is pressed (COMP-1, #123)\n\n### Kotlin style guide\n* Code has a column limit of 80 characters.\n* Inline comments should be indented with 2 spaces from code.\n\nWe are using [Kotlin Coding Conventions](https://kotlinlang.org/docs/reference/coding-conventions.html).\n\n## Code of conduct\nWe value input from each member of the community, however we urge you to abide by [code of conduct](https://github.com/sourcerer-io/sourcerer-app/blob/master/CODE_OF_CONDUCT.md).\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM nginx:1.13\n\nCOPY deploy/default.conf /etc/nginx/conf.d\n\nRUN mkdir /files\nCOPY build/libs/sourcerer-app.jar /files/download\nCOPY src/install/install /files/install\n"
  },
  {
    "path": "LICENSE.md",
    "content": "Copyright 2017 Sourcerer, Inc. https://sourcerer.io\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<h1 style=\"font-weight:normal\">\n  <a href=\"https://sourcerer.io\">\n    <img src=https://user-images.githubusercontent.com/20287615/34189346-d426d4c2-e4ef-11e7-9da4-cc76a1ed111d.png alt=\"Sourcerer\" width=35>\n  </a>\n  &nbsp;sourcerer.io&nbsp;\n  <a href=\"https://sourcerer.io/start\"><img src=https://img.shields.io/badge/sourcerer-start%20now-brightgreen.svg?colorA=087c08></a>\n  <a href=\"https://github.com/sourcerer-io/sourcerer-app/releases\"><img src=https://img.shields.io/github/release/sourcerer-io/sourcerer-app.svg?colorB=58839b></a>\n  <a href=\"https://github.com/sourcerer-io/sourcerer-app/blob/master/LICENSE.md\"><img src=https://img.shields.io/github/license/sourcerer-io/sourcerer-app.svg?colorB=ff0000></a>\n</h1>\n\nA visual profile for software engineers.\n<br>\n\n<p align=\"center\">\n  <img alt=\"sergey\" src=\"https://user-images.githubusercontent.com/20287615/47371068-c70f5a00-d6ef-11e8-8988-dcdca71bf83c.gif\">\n</p>\n\nFeatures\n========\n* Profile creation with a single click\n* Support of 100 languages (even exotic ones like COBOL)\n* Detection of more than [1,000 libraries](https://github.com/sourcerer-io/awesome-libraries) in code with per-line statistics\n* Visual presentation your development experience\n* *Finally!* Summary of all repositories you've contributed to :tada:\n* Interesting facts about yourself\n\nCreating your profile is just the first step for us at Sourcerer. Some of the things on our roadmap include:\n* Engineers to follow and learn from\n* Technology and libraries you should know about\n* Projects that could use your help\n\nGet started\n===========\nThe easiest way to get started is with your open source repos. Go to [sourcerer.io/start](https://sourcerer.io/start), and select *Build with GitHub* and watch your profile build. \n\nFor closed source repos, you will need to use this app. If you already created an account using GitHub, you would have received an email with credentials for the app. If not, You will need a new account, which you can get at [sourcerer.io/join](https://sourcerer.io/join).\n\nShowcase\n========\n<center>\n  <table>\n    <tr>\n      <td><a href=\"https://sourcerer.io/chdemko\"><img width=\"120\" alt=\"chdemko\" src=\"https://user-images.githubusercontent.com/20287615/42243607-c7f6c40c-7ec6-11e8-9f8e-d4450d1d92d1.png\"></a></td>\n      <td><a href=\"https://sourcerer.io/chendaniely\"><img width=\"120\" alt=\"chendaniely\" src=\"https://user-images.githubusercontent.com/20287615/42243623-d1bd479a-7ec6-11e8-983c-00945c926dc6.png\"></a></td>\n      <td><a href=\"https://sourcerer.io/lauragift21\"><img width=\"120\" alt=\"lauragift21\" src=\"https://user-images.githubusercontent.com/20287615/42243624-d1d24cd0-7ec6-11e8-84c0-3a1aad54a774.png\"></a></td>\n      <td><a href=\"https://sourcerer.io/maracuja-juice\"><img width=\"120\" alt=\"maracuja-juice\" src=\"https://user-images.githubusercontent.com/20287615/42243626-d1eb19c2-7ec6-11e8-8e94-fa02d8f11894.png\"></a></td>\n    </tr>\n    <tr>\n      <td><a href=\"https://sourcerer.io/marisbotero\"><img width=\"120\" alt=\"marisbotero\" src=\"https://user-images.githubusercontent.com/20287615/42243627-d203bb58-7ec6-11e8-945e-49b878f07436.png\"></a></td>\n      <td><a href=\"https://sourcerer.io/nordes\"><img width=\"120\" alt=\"nordes\" src=\"https://user-images.githubusercontent.com/20287615/42243628-d21df464-7ec6-11e8-9147-31b99ea3465d.png\"></a></td>\n      <td><a href=\"https://sourcerer.io/ppapadeas\"><img width=\"120\" alt=\"ppapadeas\" src=\"https://user-images.githubusercontent.com/20287615/42243629-d23b27e6-7ec6-11e8-92c1-0c3edc2f3dba.png\"></a></td>\n      <td><a href=\"https://sourcerer.io/praharshjain\"><img width=\"120\" alt=\"praharshjain\" src=\"https://user-images.githubusercontent.com/20287615/42243630-d2562abe-7ec6-11e8-8ad3-fd6ca3ddd413.png\"></a></td>\n    </tr>\n  </table>\n</center>\n\nRequirements\n============\n* Web browser\n\nor\n\n* Linux or macOS or Windows\n* Java 8+ Platform ([JRE](http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html) for Linux and Windows or [JDK](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) for macOS)\n* Bash for Windows (`git bash` should suffice)\n\nUsage\n=====\nTo install sourcerer run the following command in bash:\n\n```\ncurl -s https://sourcerer.io/app/install | bash\n```\n\nTo run wizard use `sourcerer` command for macOS and Linux, `java -jar sourcerer.jar` in folder `Users\\user\\.sourcerer` for Windows.\n\nUse parameter `--help` for additional info.\n\n\nInternals\n=========\nThe app looks at repos locally on your machine, and then sends stats to sourcerer.io. The best way to verify is to look at the code. Protobuf messages declared in [src/main/proto/sourcerer.proto](https://github.com/sourcerer-io/sourcerer-app/blob/develop/src/main/proto/sourcerer.proto) is a good start as it describes the client-server protocol.\nThe Sourcerer app does **NOT** upload source code anywhere, and it **NEVER** will.\n\nFAQ\n===\n### How can I process private repos?\nWe process only public repos using GitHub OAuth. To process private repos you need to run sourcerer app locally. See [Get started](#get-started) for instructions. Sourcerer app sends only statistical information to our servers and never sends code.\n\n### Why do you need GitHub permissions?\nWe use emails to identify commit authorship, read orgs access to get list of public repositories that you've contributed to. You also need to grant access to read this public information from an organization.\n\n### Other questions\nSee [sourcerer.io/faq](https://sourcerer.io/faq).\n\nContributing\n============\nWe love contributions! Check out the [Contribution guide](https://github.com/sourcerer-io/sourcerer-app/blob/master/CONTRIBUTING.md) for more information. Simplest and really helpful for the community would be contribution meta information to our [supported libraries list](https://github.com/sourcerer-io/awesome-libraries). If you an author of a library you show definitely add yours to the list or you can help to someone whose work you use.\n\n[![0](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/images/0)](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/links/0)\n[![1](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/images/1)](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/links/1)\n[![2](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/images/2)](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/links/2)\n[![3](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/images/3)](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/links/3)\n[![4](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/images/4)](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/links/4)\n[![5](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/images/5)](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/links/5)\n[![6](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/images/6)](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/links/6)\n[![7](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/images/7)](https://sourcerer.io/fame/sergey48k/sourcerer-io/sourcerer-app/links/7)\n\nBuild\n=====\nTo build and run this application locally, you'll need latest versions of Git, Gradle and JDK installed on your computer. From your command line:\n\n```\n# Clone this repository\n$ git clone https://github.com/sourcerer-io/sourcerer-app.git\n\n# Go into the repository\n$ cd sourcerer-app\n\n# Build\n$ gradle build\n\n# Run the app\n$ java -jar build/libs/sourcerer-app.jar\n```\n\nLicense\n=======\nSourcerer is under the MIT license. See the [LICENSE](https://github.com/sourcerer-io/sourcerer-app/blob/develop/LICENSE.md) for more information.\n\nLinks\n=====\n* [Sourcerer Site](https://sourcerer.io/)\n* [Sourcerer Blog](https://blog.sourcerer.io)\n* [Follow Sourcerer on Twitter](https://twitter.com/sourcerer_io)\n* [Follow Sourcerer on Facebook](https://www.facebook.com/sourcerer.io/)\n"
  },
  {
    "path": "build.gradle",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n\nbuildscript {\n    ext.kotlin_version = '1.2.31'\n    repositories {\n        mavenCentral()\n        jcenter()\n    }\n    dependencies {\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n        classpath \"com.google.protobuf:protobuf-gradle-plugin:0.8.10\"\n        classpath \"org.junit.platform:junit-platform-gradle-plugin:1.0.1\"\n    }\n}\n\nplugins {\n    id 'de.fuerstenau.buildconfig' version '1.1.8'\n}\n\napply plugin: \"idea\"\napply plugin: \"java\"\napply plugin: \"kotlin\"\napply plugin: \"application\"\napply plugin: \"com.google.protobuf\"\napply plugin: \"org.junit.platform.gradle.plugin\"\n\nbuildConfig {\n    clsName = 'BuildConfig'\n    packageName = 'app'\n\n    // API.\n    def apiBasePath = project.hasProperty('api') ? api : 'https://sourcerer.io/api/commit'\n    buildConfigField 'String', 'API_BASE_PATH', apiBasePath\n\n    // Common.\n    buildConfigField 'String', 'PROFILE_URL', 'https://sourcerer.io/'\n\n    // App version.\n    buildConfigField 'int', 'VERSION_CODE', '30'\n    buildConfigField 'String', 'VERSION', '0.3.18'\n\n    // Logging.\n    buildConfigField 'String', 'ENV', project.hasProperty('env') ? env : 'production'\n    buildConfigField 'String', 'LOG_LEVEL', project.hasProperty('log') ? log : 'info'\n    buildConfigField 'boolean', 'SILENT_USER_OUTPUT', project.hasProperty('silent') ? silent : 'false'\n    buildConfigField 'boolean', 'SENTRY_ENABLED', project.hasProperty('sentry') ? sentry : 'false'\n    buildConfigField 'String', 'SENTRY_DSN', 'https://0263d6473bd24a9ba40e25aa5fb0a242:c5451dc815074bff8ce3fb9f0851f2f5@sentry.io/233260'\n    buildConfigField 'boolean', 'PRINT_STACK_TRACE', 'false'\n\n    // Google Analytics.\n    buildConfigField 'String', 'GA_BASE_PATH', 'https://www.google-analytics.com'\n    buildConfigField 'String', 'GA_TRACKING_ID', 'UA-107129190-2'\n    buildConfigField 'boolean', 'IS_GA_ENABLED', 'true'\n\n    // Models storage path.\n    buildConfigField 'String', 'LIBRARY_MODELS_URL', 'https://storage.googleapis.com/sourcerer-app/library-models/v2/'\n\n    // Hashing.\n    buildConfigField 'boolean', 'COMMIT_HASHER_ENABLED', project.hasProperty('commit-hasher-enabled') ? project.property('commit-hasher-enabled').toString() : 'true'\n    buildConfigField 'boolean', 'FACT_HASHER_ENABLED', project.hasProperty('fact-hasher-enabled') ? project.property('fact-hasher-enabled').toString() : 'true'\n    buildConfigField 'boolean', 'LONGEVITY_ENABLED', project.hasProperty('longevity-enabled') ? project.property('longevity-enabled').toString() : 'false'\n    buildConfigField 'long', 'HEARTBEAT_RATE', project.hasProperty('heartbeat-rate') ? project.property('heartbeat-rate').toString() : '60000'\n    buildConfigField 'boolean', 'META_HASHER_ENABLED', project.hasProperty('meta-hasher-enabled') ? project.property('meta-hasher-enabled').toString() : 'true'\n    buildConfigField 'boolean', 'DISTANCES_ENABLED', project.hasProperty('distances-enabled') ? project.property('distances-enabled').toString() : 'true'\n\n    buildConfig\n}\n\njunitPlatform {\n    filters {\n        engines {\n            include 'spek'\n        }\n    }\n}\n\ntask cleanData {\n    delete 'build/libs/data'\n    delete 'build/kotlin/data'\n}\n\ntest.dependsOn cleanData\n\nmainClassName = \"app.MainKt\"\n\nrepositories {\n    mavenCentral()\n    jcenter()\n    maven { url \"https://dl.bintray.com/jetbrains/spek\" }\n    flatDir {\n        dirs 'libs'\n    }\n}\n\ndependencies {\n    compile \"org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version\"\n    compile \"org.jetbrains.kotlin:kotlin-reflect:$kotlin_version\"\n    compile \"com.beust:jcommander:1.72\"\n    compile 'com.google.protobuf:protobuf-java:3.5.1'\n    compile 'commons-codec:commons-codec:1.5'\n    compile 'com.fasterxml.jackson.core:jackson-databind:2.9.5'\n    compile 'com.fasterxml.jackson.module:jackson-module-kotlin:2.9.5'\n    compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.5'\n    compile 'io.reactivex.rxjava2:rxjava:2.1.12'\n    compile 'com.github.kittinunf.fuel:fuel:1.12.1'\n    compile 'com.github.kittinunf.fuel:fuel-rxjava:1.12.1'\n    compile 'org.eclipse.jgit:org.eclipse.jgit:4.9.0.201710071750-r'\n    compile 'org.slf4j:slf4j-nop:1.7.2'\n    compile 'io.sentry:sentry:1.7.3'\n    compile 'org.json:json:20180813'\n\n    testCompile 'commons-io:commons-io:2.6'\n    testCompile 'org.jetbrains.kotlin:kotlin-test'\n    testCompile 'org.jetbrains.spek:spek-api:1.1.5'\n    testCompile 'org.junit.platform:junit-platform-runner:1.0.1'\n    testRuntime 'org.jetbrains.spek:spek-junit-platform-engine:1.1.5'\n}\n\nprotobuf {\n    protoc {\n        artifact = \"com.google.protobuf:protoc:3.5.1\"\n    }\n}\n\nsourceSets.main.java.srcDirs += 'build/generated/source/proto/main/java'\nsourceSets.test.java.srcDirs += 'src/test/kotlin'\ncompileKotlin.dependsOn ':generateProto'\n\n// Include dependent libraries in archive.\njar {\n    manifest {\n        attributes \"Main-Class\": \"$mainClassName\"\n    }\n\n    from {\n        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }\n    } {\n        exclude \"META-INF/*.SF\"\n        exclude \"META-INF/*.DSA\"\n        exclude \"META-INF/*.RSA\"\n    }\n\n    baseName 'sourcerer-app'\n}\n"
  },
  {
    "path": "deploy/GradleDockerfile",
    "content": "FROM gradle:4.2.0\n\nUSER root\nWORKDIR /root/app\n"
  },
  {
    "path": "deploy/Jenkinsfile",
    "content": "// Copyright 2017 Sourcerer, Inc. All Rights Reserved.\n// Author: Maxim Rusak (maxim@sourcerer.io)\n\ndef label = \"sourcerer-app-${UUID.randomUUID().toString()}\"\n\ndef namespace = 'sandbox'\nif (env.BRANCH_NAME == 'master') {\n  namespace = 'production'\n} else if (env.BRANCH_NAME == 'develop') {\n  namespace = 'staging'\n}\n\npodTemplate(label: label,\n    containers: [\n        containerTemplate(name: 'jnlp', image: 'gcr.io/sourcerer-1377/jenkins-slave:v4', args: '${computer.jnlpmac} ${computer.name}'),\n        containerTemplate(name: 'gradle', image: 'gcr.io/sourcerer-1377/gradle:4.2.0', ttyEnabled: true, command: 'tail -f /dev/null')\n    ],\n    envVars: [\n      envVar(key: 'NAMESPACE', value: namespace),\n      envVar(key: 'CONTAINER_TAG', value: \"${namespace}.${env.BUILD_NUMBER}.${System.currentTimeMillis()}\")\n    ],\n    volumes: [\n        hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock'),\n        hostPathVolume(hostPath: '/usr/bin/docker', mountPath: '/usr/bin/docker')\n    ]\n) {\n  node(label) {\n    stage('checkout') {\n      checkout scm\n    }\n\n    stage('build jar and test') {\n      container('gradle') {\n        sh(\"./do.sh build_jar_inside\")\n      }\n    }\n\n    stage('build nginx') {\n      container('gradle') {\n        sh(\"./do.sh build_prod_inside\")\n      }\n    }\n\n    stage('push') {\n      sh(\"./do.sh push\")\n    }\n    \n    stage('deploy') {\n      println \"Deploying to ${namespace} kubernetes namespace\"\n      sh(\"./do.sh deploy\")\n    }\n  }\n}\n\n"
  },
  {
    "path": "deploy/default.conf",
    "content": "geo $dollar {\n    default \"$\";\n}\n\nserver {\n  listen       80 default_server;\n  server_name  _;\n\n  location /install {\n    alias /files/install;\n\n    sub_filter \"${dollar}SERVER_EXT\" 'https://$host';\n    sub_filter_types *;\n  }\n\n  location / {\n    root /files/;\n  }\n}\n"
  },
  {
    "path": "deploy/production_env.sh",
    "content": "export REPLICAS=\"2\"\n"
  },
  {
    "path": "deploy/sandbox_env.sh",
    "content": "export REPLICAS=\"1\"\n"
  },
  {
    "path": "deploy/sourcerer-app.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: sourcerer-app\n  labels:\n    app: sourcerer-app\nspec:\n  type: ClusterIP\n  ports:\n  - port: 80\n    targetPort: 80\n  selector:\n    app: sourcerer-app\n---\napiVersion: apps/v1beta1\nkind: Deployment\nmetadata:\n  name: sourcerer-app\nspec:\n  replicas: $REPLICAS\n  template:\n    metadata:\n      labels:\n        app: sourcerer-app\n    spec:\n      containers:\n      - name: sourcerer-app\n        image: gcr.io/sourcerer-1377/sourcerer-app:$CONTAINER_TAG\n        imagePullPolicy: Always\n        resources:\n          requests:\n            cpu: 100m\n            memory: 100Mi\n"
  },
  {
    "path": "deploy/staging_env.sh",
    "content": "export REPLICAS=\"0\"\n"
  },
  {
    "path": "do.sh",
    "content": "#!/bin/bash\n\n# Copyright 2017 Sourcerer, Inc. All Rights Reserved.\n# Author: Maxim Rusak (maxim@sourcerer.io)\n\nset -x\n\nfn_exists() {\n  type $1 2>/dev/null | grep -q 'is a function'\n}\n\nCOMMAND=$1\nshift\nARGUMENTS=${@}\n\nCONTAINER_TAG=\"${CONTAINER_TAG:-latest}\"\nNAMESPACE=\"${NAMESPACE:-sandbox}\"\nLOG=\"${LOG:-debug}\"\nVOLUME=\"${BUILD_VOLUME:-$PWD}\"\nPROJECT=sourcerer-app\nPORT=3182\nREPO_NAME=gcr.io/sourcerer-1377/$PROJECT:$CONTAINER_TAG\nGRADLE_VERSION=4.2.0\n\n#--------------------#\n#----- Commands -----#\n#--------------------#\n\n# run only inside build container\nbuild_jar_inside() {\n  if [ \"${NAMESPACE}\" == \"sandbox\" ]; then\n    API=\"https://sandbox.sourcerer/api/commit\"\n    LOG=\"debug\"\n  elif [ \"${NAMESPACE}\" == \"staging\" ]; then\n    API=\"https://staging.sourcerer/api/commit\"\n    LOG=\"info\"\n  elif [ \"${NAMESPACE}\" == \"local\" ]; then\n    API=\"http://localhost:3181\"\n    LOG=\"debug\"\n  else\n    API=\"https://sourcerer.io/api/commit\"\n    LOG=\"info\"\n  fi\n  gradle -Penv=${NAMESPACE} -Plog=${LOG} -Papi=${API} build\n}\n\nbuild_jar() {\n  docker run -i -v ${VOLUME}:/home/gradle/app --workdir=/home/gradle/app \\\n    -e LOG=${LOG} -e NAMESPACE=${NAMESPACE} \\\n    gradle:${GRADLE_VERSION} \\\n    ./do.sh build_jar_inside\n}\n\nbuild_prod_inside() {\n  docker build -t ${REPO_NAME} .\n}\n\ndeploy() {\n  source ./deploy/${NAMESPACE}_env.sh\n  envsubst < ./deploy/sourcerer-app.yaml > /tmp/deploy.yaml\n  kubectl --namespace=${NAMESPACE} apply -f /tmp/deploy.yaml\n}\n\n######################\n\nrun_jar() {\n  docker run -i -v ${VOLUME}:/app --workdir=/app gradle:${GRADLE_VERSION} \\\n    java -jar build/libs/app.jar\n}\n\nrun_prod() {\n  docker run -i -p ${PORT}:80 ${REPO_NAME}\n}\n\npush() {\n  gcloud docker -- push ${REPO_NAME}\n}\n\n#---------------------#\n#----- Execution -----#\n#---------------------#\n\nfn_exists ${COMMAND}\nif [ $? -eq 0 ]; then\n  ${COMMAND} ${ARGUMENTS}\nelse\n  echo \"Command not found\"\nfi\n"
  },
  {
    "path": "src/install/install",
    "content": "#!/usr/bin/env bash\n# Copyright 2017 Sourcerer, Inc. All Rights Reserved.\n# License: MIT, https://github.com/sourcerer-io/sourcerer-app/blob/master/LICENSE.md\n# Source code: https://github.com/sourcerer-io\n\necho \"Installing sourcerer app..\"\nSERVER=$SERVER_EXT\nDOWNLOAD_URL=$SERVER/app/download\nSCRIPT_DIR=$HOME/.sourcerer\nJAR_DIR=$SCRIPT_DIR\n\nif [ -f $SCRIPT_DIR/sourcerer ] ; then\n  read -p \"Previous version of sourcerer is detected. Reinstall it? [Y/n] \" yesno < /dev/tty\n  if [ \"$yesno\" ] && [ \"$yesno\" = \"n\" ] ; then\n    echo \"Exiting\"\n    exit\n  fi\nfi\n\nmkdir -p $SCRIPT_DIR\nmkdir -p $JAR_DIR\ncurl -s $DOWNLOAD_URL > $JAR_DIR/sourcerer.jar\n\ncat <<EOF > $SCRIPT_DIR/sourcerer\n#!/usr/bin/env bash\n# Copyright 2017 Sourcerer, Inc. All Rights Reserved.\n# License: MIT, https://github.com/sourcerer-io/sourcerer-app/blob/master/LICENSE.md\n# Source code: https://github.com/sourcerer-io\n\nif [ \"\\$1\" = \"--uninstall\" ] ; then\n  read -p \"The script will uninstall sourcerer app. Proceed? [Y/n] \" yesno < /dev/tty\n  if [ \"$yesno\" ] && [ \"$yesno\" = \"n\" ] ; then\n    echo \"Exiting\"\n    exit\n  fi\n\n  rm -f /usr/local/bin/sourcerer\n  rm $SCRIPT_DIR/sourcerer\n  rm -r $JAR_DIR\n\n  echo \"Done!\"\n  exit\nfi\n\nVERSION=0\nif which java > /dev/null ; then\n  VERSION_STR=\\$(java -version 2>&1 | awk -F '\"' '/version/ {print \\$2}')\n  MAJOR_VERSION=\\$(echo \\$VERSION_STR | cut -d. -f1)\n  MINOR_VERSION=\\$(echo \\$VERSION_STR | cut -d. -f2)\n\n  if [[ \"\\$MAJOR_VERSION\" = \"10\" || \"\\$MAJOR_VERSION\" > \"10\" ]]; then  # Format: 10\n    VERSION=10\n  elif [[ \"\\$MAJOR_VERSION\" = \"9\" ]]; then  # Format: 9.0.1\n    VERSION=9\n  elif [[ \"\\$MAJOR_VERSION\" = \"1\" && \"\\$MINOR_VERSION\" = \"8\" ]]; then  # Format: 1.8.1\n    VERSION=8\n  else\n    echo \"Installed $VERSION_STR version of Java is not supported.\"\n  fi\nfi\n\nif [ \\$VERSION = 0 ] ; then\n  if [ `uname` = \"Darwin\" ] ; then\n    echo \"Sourcerer requires JDK 8+ installed on the system. You can download it from:\"\n    echo \"http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html\"\n  else\n    echo \"Sourcerer requires JRE 8+ installed on the system. You can download it from:\"\n    echo \"http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html\"\n  fi\n  exit 1\nfi\n\n# Java 9 and 10 requires additional parameters.\nif [[ \\$VERSION = 9 ]] ; then\n  java --add-modules java.activation --add-opens java.base/java.nio=ALL-UNNAMED -jar $JAR_DIR/sourcerer.jar \"\\$@\"\nelif [[ \\$VERSION = 10 ]] ; then\n  java --add-opens java.base/java.nio=ALL-UNNAMED -jar $JAR_DIR/sourcerer.jar \"\\$@\"\nelse\n  java -jar $JAR_DIR/sourcerer.jar \"\\$@\"\nfi\nEOF\n\nchmod +x $SCRIPT_DIR/sourcerer\n\n{\n  rm -f /usr/local/bin/sourcerer 2> /dev/null &&\n  ln -s $SCRIPT_DIR/sourcerer /usr/local/bin/sourcerer 2> /dev/null &&\n  echo 'Done!' &&\n  echo 'Run sourcerer to start hashing your repos!'\n} || {\n  echo 'We installed app to ~/.sourcerer/sourcerer.'\n  echo 'You can add it to $PATH or run specified command to finish installation:'\n  echo \"sudo ln -s $SCRIPT_DIR/sourcerer /usr/local/bin/sourcerer\"\n  echo 'Then run sourcerer to start hashing your repos!'\n}\n"
  },
  {
    "path": "src/main/kotlin/app/Analytics.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app\n\nimport com.github.kittinunf.fuel.core.FuelError\nimport com.github.kittinunf.fuel.core.FuelManager\nimport com.github.kittinunf.fuel.core.Method\nimport com.github.kittinunf.fuel.core.Request\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\ntypealias Param = Pair<String, String>\n\n/**\n * Google Analytics events tracking.\n */\nobject Analytics {\n    private val IS_ENABLED = BuildConfig.IS_GA_ENABLED\n    private val BASE_PATH = BuildConfig.GA_BASE_PATH\n    private val BASE_URL = \"/virtual/app/\"\n    private val PROTOCOL_VERSION = \"1\"\n    private val TRACKING_ID = BuildConfig.GA_TRACKING_ID\n    private val DATA_SOURCE = \"app\"\n\n    private val HIT_PAGEVIEW = \"pageview\"\n    private val HIT_EXCEPTION = \"exception\"\n\n    private val fuelManager = FuelManager()\n\n    var uuid: String = \"\"  // Should be set on start of the app.\n    var username: String = \"\"  // Should be set on successful authorization.\n\n    init {\n        fuelManager.basePath = BASE_PATH\n    }\n\n    private fun post(params: List<Param>): Request {\n        return fuelManager.request(Method.POST, \"/collect\", params)\n    }\n\n    /**\n     * Google Analytics Measurement Protocol is used to track events.\n     * User iteration data is sent to GA endpoint via POST request.\n     * Events (or hits) mapped to virtual urls with \"Data Source\" parameter.\n     * Used parameters:\n     * - v: Protocol Version (Required)\n     * - tid: Tracking ID - used to specify GA account (Required)\n     * - cid: Client ID - anonymous client id (UUID type 4)\n     * - uid: User ID - username\n     * - t: Hit Type - type of event\n     * - dp: Document Path - virtual url\n     */\n    fun trackEvent(event: String, params: List<Param> = listOf()) {\n        if (!IS_ENABLED || (username.isEmpty() && uuid.isEmpty())) {\n            return\n        }\n\n        val idParams = mutableListOf<Param>()\n        if (uuid.isNotEmpty()) {\n            idParams.add(\"cid\" to uuid)\n        }\n        if (username.isNotEmpty()) {\n            idParams.add(\"uid\" to username)\n        }\n\n        val defaultParams = listOf(\"v\" to PROTOCOL_VERSION,\n                                   \"tid\" to TRACKING_ID,\n                                   \"ds\" to DATA_SOURCE,\n                                   \"t\" to HIT_PAGEVIEW,\n                                   \"dp\" to BASE_URL + event)\n\n        try {\n            // Send event to GA with united params.\n            val (_, _, result) = post(params +\n                defaultParams.filter { !params.contains(it) } +\n                idParams).responseString()\n            val (_, e) = result\n            if (e != null) { throw e }\n        } catch (e: Throwable) {\n            Logger.error(e, \"Error while sending GA report\", logOnly = true)\n        }\n    }\n\n    fun trackError(e: Throwable? = null) {\n        val url = if (e != null) getErrorUrl(e) else \"\"\n        val separator = if (url.isNotEmpty()) \"/\" else \"\"\n        trackEvent(\"error\" + separator + url, listOf(\"t\" to HIT_EXCEPTION))\n    }\n\n    private fun getErrorUrl(e: Throwable): String {\n        // Mapping for request exceptions.\n        when (e) {\n            is FuelError -> return \"request\"\n            is InvalidParameterException -> return \"request/parsing\"\n            is InvalidProtocolBufferException -> return \"request/parsing\"\n        }\n\n        // Get concrete class of exception name removing all common parts.\n        val name = e.javaClass.simpleName.replace(\"Exception\", \"\")\n                                         .replace(\"Error\", \"\")\n                                         .replace(\"Throwable\", \"\")\n\n        if (name.length == 0 || name.length == 1) {\n            return name\n        }\n\n        // Divide CamelCased words in class name by dashes.\n        val nameCapitalized = name.toUpperCase()\n        var url = name[0].toString()\n        for (i in 1..name.length - 1) {\n            if (name[i] == nameCapitalized[i]) {\n                url += \"-\"\n            }\n            url += name[i]\n        }\n\n        return url.toLowerCase()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/FactCodes.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app\n\nobject FactCodes {\n    val COMMIT_DAY_WEEK = 1  // Day of week fun fact and graph.\n    val COMMIT_DAY_TIME = 2  // Day time fun fact.\n\n    val COMMIT_LINE_NUM_AVG = 8  // Average number of lines per commit fun fact.\n    val COMMIT_NUM = 9  // Used for averaging COMMIT_LINE_NUM_AVG between repos.\n    // A map of line numbers to commits number. Used in a commit histogram.\n    val COMMIT_NUM_TO_LINE_NUM = 12\n    val COMMIT_SHARE = 16  // Used for commit share chart.\n    val COMMIT_SHARE_REPO_AVG = 17  // Used for commit share chart.\n    val LINE_LONGEVITY = 3  // Used for longevity graph.\n    val LINE_LONGEVITY_REPO = 4  // Used for longevity graph.\n    val LINE_LEN_AVG = 10  // Average length of line fun fact.\n    val LINE_NUM = 11  // Used for averaging LINE_LEN_AVG between repos.\n    val REPO_DATE_START = 5  // Repo summary info. Date of first contribution.\n    val REPO_DATE_END = 6  // Repo summary info. Date of last contribution.\n    val REPO_TEAM_SIZE = 7  // Repo summary info. Number of contributors.\n    val VARIABLE_NAMING = 13 // Variables naming fun fact.\n    val VARIABLE_NAMING_SNAKE_CASE = 0\n    val VARIABLE_NAMING_CAMEL_CASE = 1\n    val VARIABLE_NAMING_OTHER = 2\n    val INDENTATION = 14\n    val INDENTATION_TABS = 0\n    val INDENTATION_SPACES = 1\n\n    val COLLEAGUES = 15\n}\n"
  },
  {
    "path": "src/main/kotlin/app/Logger.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app\n\nimport io.sentry.Sentry\nimport io.sentry.context.Context\nimport io.sentry.event.Breadcrumb\nimport io.sentry.event.UserBuilder\nimport io.sentry.event.BreadcrumbBuilder\nimport java.util.*\n\n\n/**\n * Singleton class that logs events of different levels.\n */\nobject Logger {\n    object Events {\n        val START = \"start\"\n        val AUTH = \"auth\"\n        val CONFIG_SETUP = \"config/setup\"\n        val CONFIG_CHANGED = \"config/changed\"\n        val HASHING_REPO_SUCCESS = \"hashing/repo/success\"\n        val HASHING_SUCCESS = \"hashing/success\"\n        val EXIT = \"exit\"\n    }\n\n    /**\n     * Current log level. All that higher than this level will not be displayed.\n     */\n    @kotlin.PublishedApi\n    internal val LEVEL : Int\n\n    /**\n     * Error level.\n     */\n    @kotlin.PublishedApi\n    internal const val ERROR = 0\n\n    /**\n     * Warning level.\n     */\n    @kotlin.PublishedApi\n    internal const val WARN = 1\n\n    /**\n     * Information level.\n     */\n    @kotlin.PublishedApi\n    internal const val INFO = 2\n\n    /**\n     * Debug level.\n     */\n    @kotlin.PublishedApi\n    internal const val DEBUG = 3\n\n    /**\n     * Trace level. For extremely detailed and high volume debug logs.\n     */\n    @kotlin.PublishedApi\n    internal const val TRACE = 4\n\n    const val SILENT = BuildConfig.SILENT_USER_OUTPUT\n    const val SENTRY_ENABLED = BuildConfig.SENTRY_ENABLED\n\n    /**\n     * Print stack trace on error log.\n     */\n    private const val PRINT_STACK_TRACE = BuildConfig.PRINT_STACK_TRACE\n\n    /**\n     * Context of Sentry error reporting software for adding info.\n     */\n    private val sentryContext: Context?\n\n    /**\n     * Username used for error reporting.\n     */\n    var username: String? = null\n        set(value) {\n            if (SENTRY_ENABLED) {\n                sentryContext?.user = UserBuilder().setUsername(value).build()\n            }\n            Analytics.username = value ?: \"\"\n        }\n\n    var uuid: String? = null\n        set(value) {\n            Analytics.uuid = value ?: \"\"\n        }\n\n    init {\n        if (SENTRY_ENABLED) {\n            Sentry.init(BuildConfig.SENTRY_DSN)\n            sentryContext = Sentry.getContext()\n            addTags()\n        } else {\n            sentryContext = null\n        }\n        LEVEL = configLevelValue()\n    }\n\n    private fun configLevelValue() : Int {\n        val a = mapOf(\"trace\" to TRACE, \"debug\" to DEBUG, \"info\" to INFO,\n            \"warn\" to WARN, \"error\" to ERROR)\n        return a.getValue(BuildConfig.LOG_LEVEL)\n    }\n\n    /**\n     * Utils.\n     */\n    private fun Double.format(digits: Int, digitsFloating: Int) =\n        java.lang.String.format(\"%${digits}.${digitsFloating}f\", this)\n\n    private fun generateIndent(num: Int): String {\n        return 0.rangeTo(num).fold(\"\") { ind, _ -> ind + \" \" }\n    }\n\n    /**\n     * CLI messages and pretty printing.\n     */\n    fun print(message: Any, indentLine: Boolean = false) {\n        if (!SILENT) {\n            print(message.toString(), indentLine)\n        }\n    }\n\n    fun print(message: String, indentLine: Boolean = false) {\n        if (!SILENT) {\n            if (indentLine) {\n                println()\n            }\n            println(message)\n        }\n    }\n\n    fun printCommit(commitMessage: String, commitHash: String,\n                    percents: Double) {\n        if (!SILENT) {\n            val percentsStr = percents.format(6, 2)\n            val hash = commitHash.substring(0, 7)\n            val messageTrim = if (commitMessage.length > 59) {\n                commitMessage.substring(0, 56).plus(\"...\")\n            } else commitMessage\n            println(\" [$percentsStr%] * $hash $messageTrim\")\n        }\n    }\n\n    private val commitDetailIndent = generateIndent(10) + \"|\" +\n        generateIndent(8)\n    fun printCommitDetail(message: String) {\n        if (!SILENT) {\n            val messageTrim = if (message.length > 59) {\n                message.substring(0, 56).plus(\"...\")\n            } else message\n            println(commitDetailIndent + messageTrim)\n        }\n    }\n\n    /**\n     * Log error message with exception info.\n     * Don't log private information with this method.\n     *\n     * @property e the exception if presented.\n     * @property message the message for user and logs.\n     * @property logOnly only log to console, no additional actions.\n     */\n    fun error(e: Throwable, message: String = \"\", logOnly: Boolean = false) {\n        val finalMessage = if (message.isNotBlank()) { message + \": \" }\n        else { \"\" } + e.message\n        if (LEVEL >= ERROR) {\n            println(\"[e] $finalMessage\")\n            if (PRINT_STACK_TRACE) {\n                e.printStackTrace()\n            }\n        }\n        if (!logOnly) {\n            Analytics.trackError(e)\n            capture(e)\n        }\n        addBreadcrumb(finalMessage, Breadcrumb.Level.ERROR)\n    }\n\n    /**\n     * Log warning message. Don't log private information with this method.\n     */\n    inline fun warn(message: () -> String) {\n        val msg = message()\n        if (LEVEL >= WARN) {\n            println(\"[w] $msg.\")\n        }\n        addBreadcrumb(msg, Breadcrumb.Level.WARNING)\n    }\n\n    /**\n     * Log information message. Don't log private information with this method.\n     */\n    inline fun info(event: String = \"\", message: () -> String) {\n        val msg = message()\n        if (LEVEL >= INFO) {\n            println(\"[i] $msg.\")\n        }\n        if (event.isNotBlank()) {\n            Analytics.trackEvent(event)\n        }\n        addBreadcrumb(msg, Breadcrumb.Level.INFO)\n    }\n\n    /**\n     * Log debug message.\n     */\n    inline fun debug(message: () -> String) {\n        if (LEVEL >= DEBUG) {\n            println(\"[d] ${message()}.\")\n        }\n    }\n\n    /**\n     * Log trace message.\n     */\n    inline fun trace(message: () -> String) {\n        if (LEVEL >= TRACE) {\n            println(\"[t] ${message()}.\")\n        }\n    }\n\n    val isTrace: Boolean\n        inline get() = LEVEL >= TRACE\n\n    @kotlin.PublishedApi\n    internal fun addBreadcrumb(message: String, level: Breadcrumb.Level) {\n        if (SENTRY_ENABLED) {\n            sentryContext?.recordBreadcrumb(BreadcrumbBuilder()\n                .setMessage(message)\n                .setLevel(level)\n                .setTimestamp(Date())\n                .build())\n        }\n    }\n\n    private fun addTags() {\n        if (SENTRY_ENABLED) {\n            val default = \"unavailable\"\n            val osName = System.getProperty(\"os.name\", default)\n            val osVersion = System.getProperty(\"os.version\", default)\n            val javaVendor = System.getProperty(\"java.vendor\", default)\n            val javaVersion = System.getProperty(\"java.version\", default)\n\n            sentryContext?.addTag(\"environment\", BuildConfig.ENV)\n            sentryContext?.addTag(\"log-level\", BuildConfig.LOG_LEVEL)\n            sentryContext?.addTag(\"version\", BuildConfig.VERSION)\n            sentryContext?.addTag(\"version-code\", BuildConfig.VERSION_CODE\n                .toString())\n            sentryContext?.addTag(\"os-name\", osName)\n            sentryContext?.addTag(\"os-version\", osVersion)\n            sentryContext?.addTag(\"java-vendor\", javaVendor)\n            sentryContext?.addTag(\"java-version\", javaVersion)\n        }\n    }\n\n    private fun capture(e: Throwable) {\n        if (SENTRY_ENABLED) {\n            Sentry.capture(e)\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/Main.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app\n\nimport app.api.ServerApi\nimport app.config.FileConfigurator\nimport app.model.LocalRepo\nimport app.ui.ConsoleUi\nimport app.utils.CommandConfig\nimport app.utils.CommandAdd\nimport app.utils.CommandList\nimport app.utils.CommandRemove\nimport app.utils.FileHelper.toPath\nimport app.utils.Options\nimport app.utils.PasswordHelper\nimport app.utils.RepoHelper\nimport app.utils.UiHelper\nimport com.beust.jcommander.JCommander\nimport com.beust.jcommander.MissingCommandException\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.security.GeneralSecurityException\nimport javax.net.ssl.TrustManager\nimport javax.net.ssl.X509TrustManager\nimport java.security.cert.X509Certificate\nimport javax.net.ssl.HttpsURLConnection\nimport javax.net.ssl.SSLContext\n\nfun main(argv : Array<String>) {\n    Thread.setDefaultUncaughtExceptionHandler { _, e: Throwable ->\n        Logger.error(e, \"Uncaught exception\")\n    }\n    if (BuildConfig.ENV != \"production\") {\n        disableSslChecks()\n    }\n    Main(argv)\n}\n\nclass Main(argv: Array<String>) {\n    private val configurator = FileConfigurator()\n    private val api = ServerApi(configurator)\n\n    init {\n        Logger.uuid = configurator.getUuidPersistent()\n        Logger.info(Logger.Events.START) { \"App started\" }\n\n        val options = Options()\n        val commandAdd = CommandAdd()\n        val commandConfig = CommandConfig()\n        val commandList = CommandList()\n        val commandRemove = CommandRemove()\n        val jc: JCommander = JCommander.newBuilder()\n            .programName(\"sourcerer\")  // Used for usage method.\n            .addObject(options)\n            .addCommand(commandAdd.name, commandAdd)\n            .addCommand(commandConfig.name, commandConfig)\n            .addCommand(commandList.name, commandList)\n            .addCommand(commandRemove.name, commandRemove)\n            .build()\n\n        try {\n            jc.parse(*argv)\n            options.password = PasswordHelper.hashPassword(options.password)\n            configurator.setOptions(options)\n\n            if (options.help) {\n                showHelp(jc)\n            } else if (options.setup) {\n                doSetup()\n            } else when (jc.parsedCommand) {\n                commandAdd.name -> doAdd(commandAdd)\n                commandConfig.name -> doConfig(commandConfig)\n                commandList.name -> doList()\n                commandRemove.name -> doRemove(commandRemove)\n                else -> startUi()\n            }\n        } catch (e: MissingCommandException) {\n            Logger.warn { \"No such command: ${e.unknownCommand}\" }\n        }\n\n        Logger.info(Logger.Events.EXIT) { \"App finished\" }\n    }\n\n    private fun startUi() {\n        ConsoleUi(api, configurator)\n    }\n\n    private fun doAdd(commandAdd: CommandAdd) {\n        val paths = commandAdd.paths\n        paths.forEach {\n            val path = it.toPath()\n            val hashAll = commandAdd.hashAll\n            if (commandAdd.recursive) {\n                Files.walk(path)\n                        .filter { p -> RepoHelper.isValidGitRepo(p) }\n                        .forEach { p -> processPath(p, hashAll) }\n            } else {\n                processPath(path, hashAll)\n            }\n        }\n    }\n\n    private fun processPath(path: Path, hashAll: Boolean) {\n        if (RepoHelper.isValidRepo(path)) {\n            val localRepo = LocalRepo(path.toString())\n            localRepo.hashAllContributors = hashAll\n            configurator.addLocalRepoPersistent(localRepo)\n            configurator.saveToFile()\n            Logger.print(\"Added git repository at $path.\")\n            Logger.info(Logger.Events.CONFIG_CHANGED) { \"Config changed\" }\n        } else {\n            Logger.warn { \"No valid git repository found at specified path $path\" }\n        }\n    }\n\n    private fun doConfig(commandOptions: CommandConfig) {\n        val (key, value) = commandOptions.pair\n\n        if (!arrayListOf(\"username\", \"password\").contains(key)) {\n            Logger.warn { \"No such key $key\" }\n            return\n        }\n\n        when (key) {\n            \"username\" -> configurator.setUsernamePersistent(value)\n            \"password\" -> configurator.setPasswordPersistent(value)\n        }\n\n        configurator.saveToFile()\n\n        Logger.info(Logger.Events.CONFIG_CHANGED) { \"Config changed\" }\n    }\n\n    private fun doList() {\n        RepoHelper.printRepos(configurator.getLocalRepos(),\n                              \"Tracked repositories:\",\n                              \"No tracked repositories\")\n    }\n\n    private fun doRemove(commandRemove: CommandRemove) {\n        val path = commandRemove.path\n        // Don't validate because repository may be deleted already.\n        if (path != null) {\n            configurator.removeLocalRepoPersistent(LocalRepo(path))\n            configurator.saveToFile()\n            Logger.print(\"Repository removed from tracking list.\")\n\n            Logger.info(Logger.Events.CONFIG_CHANGED) { \"Config changed\" }\n        } else {\n            Logger.print(\"Repository not found in tracking list.\")\n        }\n    }\n\n    private fun doSetup() {\n        if (!configurator.isFirstLaunch()) {\n            if (UiHelper.confirm(\"Are you sure that you want to setup \"\n                + \"Sourcerer again?\", defaultIsYes = false)) {\n                configurator.resetAndSave()\n            }\n        }\n        startUi()\n    }\n\n    private fun showHelp(jc: JCommander) {\n        Logger.print(\"Sourcerer hashes your git repositories into intelligent \"\n            + \"engineering profiles.\")\n        Logger.print(\"If you don't have an account, please, proceed to \" +\n            \"https://sourcerer.io/join\")\n        Logger.print(\"More info at https://sourcerer.io and \" +\n            \"https://github.com/sourcerer-io\")\n        jc.usage()  // Will show detailed info about usage based on annotations.\n    }\n}\n\nfun disableSslChecks() {\n    // Create a trust manager that does not validate certificate chains.\n    val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {\n        override fun getAcceptedIssuers(): Array<X509Certificate> {\n            return arrayOf()\n        }\n        override fun checkClientTrusted(certs: Array<X509Certificate>,\n                                        authType: String) {}\n        override fun checkServerTrusted(certs: Array<X509Certificate>,\n                                        authType: String) {}\n    })\n\n    // Install the all-trusting trust manager.\n    try {\n        val sc = SSLContext.getInstance(\"SSL\")\n        sc.init(null, trustAllCerts, java.security.SecureRandom())\n        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())\n    } catch (e: GeneralSecurityException) {}\n\n    // Skip server name checking.\n    HttpsURLConnection.setDefaultHostnameVerifier { _, _ -> true }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/api/Api.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.api\n\nimport app.model.*\n\ninterface Api {\n    companion object {\n        val OUT_OF_DATE = 1\n        val STATUS_CLONING = 80\n        val PROCESS_STATUS_START = 100\n        val PROCESS_STATUS_COMPLETE = 200\n        val PROCESS_STATUS_FAIL = 1000\n        val CODE_SUCCESS = 0\n        val PROCESS_ERROR_TOO_MUCH_COMMITS = 4\n        val PROCESS_ERROR_NO_COMMITS = 5\n        val PROCESS_ERROR_PROCESSOR = 6\n        val PROCESS_ERROR_EMPTY_REPO = 8\n        val PROCESS_ERROR_NO_ACCESS = 9\n    }\n\n    fun authorize(): Result<Unit>\n    fun getUser(): Result<User>\n    fun postUser(user: User): Result<Unit>\n    fun postRepo(repo: Repo): Result<Repo>\n    fun postCommits(commitsList: List<Commit>): Result<Unit>\n    fun deleteCommits(commitsList: List<Commit>): Result<Unit>\n    fun postFacts(factsList: List<Fact>): Result<Unit>\n    fun postAuthors(authorsList: List<Author>): Result<Unit>\n    fun postProcessCreate(requestNumEntries: Int): Result<Process>\n    fun postProcess(processEntries: List<ProcessEntry>): Result<Unit>\n    fun postAuthorDistances(authorDistanceList: List<AuthorDistance>):\n            Result<Unit>\n}\n"
  },
  {
    "path": "src/main/kotlin/app/api/ApiError.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.api\n\nimport app.Logger\nimport app.model.Error\nimport app.model.Errors\nimport com.github.kittinunf.fuel.core.FuelError\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.nio.charset.Charset\nimport java.security.InvalidParameterException\n\nclass ApiError(exception: Exception) : Exception(exception.message) {\n    companion object {\n        private val AUTH_ERROR_CODES = listOf(401, 403)\n    }\n\n    // Response content.\n    var httpStatusCode: Int = 0\n    var httpResponseMessage: String = \"\"\n    var httpBodyMessage: String = \"\"\n\n    // Server errors from response.\n    var serverErrors = listOf<Error>()\n\n    // Type of errors.\n    var isParseError = false\n    var isAuthError: Boolean = false\n    get() = AUTH_ERROR_CODES.contains(httpStatusCode)\n\n    constructor(fuelError: FuelError) : this(fuelError as Exception) {\n        httpStatusCode = fuelError.response.statusCode\n        httpResponseMessage = fuelError.response.responseMessage\n        if (fuelError.response.headers[\"Content-Type\"]\n            ?.contains(\"application/octet-stream\") == true) {\n            try {\n                serverErrors = Errors(fuelError.response.data).errors\n            } catch (e: Exception) {\n                Logger.error(e, \"Error while parsing errors from server\")\n            }\n        } else {\n            httpBodyMessage = fuelError.response.data\n                .toString(Charset.defaultCharset())\n        }\n    }\n\n    constructor(parseException: InvalidProtocolBufferException) :\n            this(parseException as Exception) {\n        isParseError = true\n    }\n\n    constructor(parseException: InvalidParameterException) :\n            this(parseException as Exception) {\n        isParseError = true\n    }\n\n    fun isWithServerCode(serverErrorCode: Int): Boolean {\n        return serverErrors.find { error ->\n            error.code == serverErrorCode } != null\n    }\n}\n\nfun ApiError?.ifNotNullThrow() {\n    if (this != null) {\n        throw this\n    }\n}\n\nfun ApiError?.isWithServerCode(serverErrorCode: Int): Boolean {\n    if (this != null) {\n        return this.isWithServerCode(serverErrorCode)\n    }\n    return false\n}\n"
  },
  {
    "path": "src/main/kotlin/app/api/MockApi.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.api\n\nimport app.Logger\nimport app.model.*\n\nclass MockApi(  // GET requests.\n    var mockUser: User = User(),\n    var mockRepo: Repo = Repo(),\n    var mockProcessEntries: List<ProcessEntry> = listOf()) : Api {\n    // POST requests.\n    // In case of multiple requests.\n    var receivedRepos: MutableList<Repo> = mutableListOf()\n    var receivedAddedCommits: MutableList<Commit> = mutableListOf()\n    var receivedFacts: MutableList<Fact> = mutableListOf()\n    var receivedAuthors: MutableList<Author> = mutableListOf()\n    var receivedUsers: MutableList<User> = mutableListOf()\n    var receivedProcessCreate: MutableList<Process> = mutableListOf()\n    var receivedProcess: MutableList<Process> = mutableListOf()\n    var receivedDistances: MutableList<AuthorDistance> = mutableListOf()\n\n    // DELETE requests.\n    var receivedDeletedCommits: MutableList<Commit> = mutableListOf()\n\n    override fun authorize(): Result<Unit> {\n        Logger.debug { \"MockApi: authorize request\" }\n        return Result()\n    }\n\n    override fun getUser(): Result<User> {\n        Logger.debug { \"MockApi: getUser request\" }\n        return Result(mockUser)\n    }\n\n    override fun postUser(user: User): Result<Unit> {\n        Logger.debug { \"MockApi: postUser request\" }\n        receivedUsers.add(user)\n        return Result()\n    }\n\n    override fun postRepo(repo: Repo): Result<Repo> {\n        Logger.debug { \"MockApi: postRepo request\" }\n        receivedRepos.add(repo)\n        return Result(mockRepo)\n    }\n\n    override fun postCommits(commitsList: List<Commit>): Result<Unit> {\n        Logger.debug {\n            \"MockApi: postCommits request (${commitsList.size} commits)\"\n        }\n        receivedAddedCommits.addAll(commitsList)\n        return Result()\n    }\n\n    override fun deleteCommits(commitsList: List<Commit>): Result<Unit> {\n        Logger.debug {\n            \"MockApi: deleteCommits request (${commitsList.size} commits)\" }\n        receivedDeletedCommits.addAll(commitsList)\n        return Result()\n    }\n\n    override fun postFacts(factsList: List<Fact>): Result<Unit> {\n        Logger.debug { \"MockApi: postFacts request (${factsList.size} facts)\" }\n        receivedFacts.addAll(factsList)\n        return Result()\n    }\n\n    override fun postAuthors(authorsList: List<Author>): Result<Unit> {\n        Logger.debug { \"MockApi: postAuthors request (${authorsList.size} \" +\n            \"stats)\" }\n        receivedAuthors.addAll(authorsList)\n        return Result()\n    }\n\n    override fun postProcessCreate(requestNumEntries: Int): Result<Process> {\n        Logger.debug { \"MockApi: postProcessCreate request \" +\n            \"($requestNumEntries entries requested)\" }\n        receivedProcessCreate.add(\n            Process(requestNumEntries = requestNumEntries))\n        return Result(Process(entries = mockProcessEntries))\n    }\n\n    override fun postProcess(processEntries: List<ProcessEntry>): Result<Unit> {\n        Logger.debug { \"MockApi: postProcess request (${processEntries.size} \" +\n            \"entries updated)\" }\n        receivedProcess.add(Process(entries = processEntries))\n        return Result()\n    }\n\n    override fun postAuthorDistances(authorDistanceList:\n                                     List<AuthorDistance>): Result<Unit> {\n        Logger.debug { \"MockApi: postAuthorDistances request (${authorDistanceList\n                .size} distances)\" }\n        receivedDistances.addAll(authorDistanceList)\n        return Result()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/api/Result.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.api\n\ndata class Result<out T> (val data: T? = null, val error: ApiError? = null) {\n    fun getOrThrow(): T {\n        if (error == null) {\n            return data!!\n        }\n        throw error\n    }\n\n    fun onErrorThrow() {\n        if (error != null) {\n            throw error\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/api/ServerApi.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.api\n\nimport app.BuildConfig\nimport app.Logger\nimport app.config.Configurator\nimport app.model.*\nimport com.github.kittinunf.fuel.core.FuelManager\nimport com.github.kittinunf.fuel.core.Method\nimport com.github.kittinunf.fuel.core.Request\nimport com.github.kittinunf.fuel.core.Response\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\nclass ServerApi (private val configurator: Configurator) : Api {\n    companion object {\n        private val HEADER_VERSION_CODE = \"app-version-code\"\n        private val HEADER_CONTENT_TYPE = \"Content-Type\"\n        private val HEADER_CONTENT_TYPE_PROTO = \"application/octet-stream\"\n        private val HEADER_COOKIE = \"Cookie\"\n        private val HEADER_SET_COOKIE = \"Set-Cookie\"\n        private val KEY_TOKEN = \"Token=\"\n    }\n\n    val fuelManager = FuelManager()\n    private var token = \"\"\n\n    private fun cookieRequestInterceptor() = { req: Request ->\n        if (token.isNotEmpty()) {\n            req.header(Pair(HEADER_COOKIE, KEY_TOKEN + token))\n        }\n        req\n    }\n\n    private fun cookieResponseInterceptor() = { _: Request, res: Response ->\n        val newToken = res.headers[HEADER_SET_COOKIE]\n            ?.find { it.startsWith(KEY_TOKEN) }\n        if (newToken != null && newToken.isNotBlank()) {\n            token = newToken.substringAfter(KEY_TOKEN).substringBefore(';')\n        }\n        res\n    }\n\n    init {\n        fuelManager.basePath = BuildConfig.API_BASE_PATH\n        fuelManager.addRequestInterceptor { cookieRequestInterceptor() }\n        fuelManager.addResponseInterceptor { cookieResponseInterceptor() }\n    }\n\n    private val username\n        get() = configurator.getUsername()\n\n    private val password\n        get() = configurator.getPassword()\n\n    private fun post(path: String): Request {\n        return fuelManager.request(Method.POST, path)\n    }\n\n    private fun get(path: String): Request {\n        return fuelManager.request(Method.GET, path)\n    }\n\n    private fun delete(path: String): Request {\n        return fuelManager.request(Method.DELETE, path)\n    }\n\n    private fun createRequestGetToken(): Request {\n        return post(\"/auth\").authenticate(username, password)\n                            .header(getVersionCodeHeader())\n    }\n\n    private fun createRequestGetUser(): Request {\n        return get(\"/user\")\n    }\n\n    private fun createRequestPostUser(user: User): Request {\n        return post(\"/user\").header(getContentTypeHeader())\n                            .body(user.serialize())\n    }\n\n    private fun createRequestPostRepo(repo: Repo): Request {\n        return post(\"/repo\").header(getContentTypeHeader())\n                            .body(repo.serialize())\n    }\n\n    private fun createRequestPostCommits(commits: CommitGroup): Request {\n        return post(\"/commits\").header(getContentTypeHeader())\n                               .body(commits.serialize())\n    }\n\n    private fun createRequestDeleteCommits(commits: CommitGroup): Request {\n        return delete(\"/commits\").header(getContentTypeHeader())\n                                 .body(commits.serialize())\n    }\n\n    private fun createRequestPostFacts(facts: FactGroup): Request {\n        return post(\"/facts\").header(getContentTypeHeader())\n                             .body(facts.serialize())\n    }\n\n    private fun createRequestPostAuthors(authors: AuthorGroup): Request {\n        return post(\"/authors\").header(getContentTypeHeader())\n                               .body(authors.serialize())\n    }\n\n    private fun createRequestPostProcessCreate(process: Process): Request {\n        return post(\"/process/create\").header(getContentTypeHeader())\n                                      .body(process.serialize())\n    }\n\n    private fun createRequestPostProcess(process: Process): Request {\n        return post(\"/process\").header(getContentTypeHeader())\n                               .body(process.serialize())\n    }\n\n    private fun createRequestPostAuthorDistances(distances:\n        AuthorDistanceGroup): Request {\n        return post(\"/distances\").header(getContentTypeHeader())\n                .body(distances.serialize())\n    }\n\n    private fun <T> makeRequest(request: Request,\n                                requestName: String,\n                                parser: (ByteArray) -> T): Result<T> {\n        var error: ApiError? = null\n        var data: T? = null\n\n        try {\n            Logger.debug { \"Request $requestName initialized\" }\n            val (_, res, result) = request.responseString()\n            val (_, e) = result\n            if (e == null) {\n                Logger.debug { \"Request $requestName success\" }\n                data = parser(res.data)\n            } else {\n                error = ApiError(e)\n            }\n        } catch (e: InvalidProtocolBufferException) {\n            error = ApiError(e)\n        } catch (e: InvalidParameterException) {\n            error = ApiError(e)\n        }\n\n        return Result(data, error)\n    }\n\n    private fun getVersionCodeHeader(): Pair<String, String> {\n        return Pair(HEADER_VERSION_CODE, BuildConfig.VERSION_CODE.toString())\n    }\n\n    private fun getContentTypeHeader(): Pair<String, String> {\n        return Pair(HEADER_CONTENT_TYPE, HEADER_CONTENT_TYPE_PROTO)\n    }\n\n    override fun authorize(): Result<Unit> {\n        return makeRequest(createRequestGetToken(), \"getToken\", {})\n    }\n\n    override fun getUser(): Result<User> {\n        return makeRequest(createRequestGetUser(), \"getUser\",\n                           { body -> User(body) })\n    }\n\n    override fun postUser(user: User): Result<Unit> {\n        return makeRequest(createRequestPostUser(user), \"postUser\", {})\n    }\n\n    override fun postRepo(repo: Repo): Result<Repo> {\n        if (repo.rehash.isBlank()) {\n            throw IllegalArgumentException()\n        }\n\n        return makeRequest(createRequestPostRepo(repo), \"getRepo\",\n                           { body -> Repo(body) })\n    }\n\n    override fun postCommits(commitsList: List<Commit>): Result<Unit> {\n        val commits = CommitGroup(commitsList)\n        return makeRequest(createRequestPostCommits(commits),\n                           \"postCommits\", {})\n    }\n\n    override fun deleteCommits(commitsList: List<Commit>): Result<Unit> {\n        val commits = CommitGroup(commitsList)\n        return makeRequest(createRequestDeleteCommits(commits),\n                           \"deleteCommits\", {})\n    }\n\n    override fun postFacts(factsList: List<Fact>): Result<Unit> {\n        val facts = FactGroup(factsList)\n        return makeRequest(createRequestPostFacts(facts), \"postFacts\", {})\n    }\n\n    override fun postAuthors(authorsList: List<Author>): Result<Unit> {\n        val authors = AuthorGroup(authorsList)\n        return makeRequest(createRequestPostAuthors(authors), \"postAuthors\", {})\n    }\n\n    override fun postProcessCreate(requestNumEntries: Int): Result<Process> {\n        val process = Process(requestNumEntries = requestNumEntries)\n        return makeRequest(createRequestPostProcessCreate(process),\n                           \"postProcessCreate\", { body -> Process(body) })\n    }\n\n    override fun postProcess(processEntries: List<ProcessEntry>): Result<Unit> {\n        // TODO(anatoly): Restrict possible status and error codes on CS.\n        val process = Process(entries = processEntries)\n        return makeRequest(createRequestPostProcess(process), \"postProcess\", {})\n    }\n\n    override fun postAuthorDistances(authorDistanceList: List<AuthorDistance>):\n            Result<Unit> {\n        val distances = AuthorDistanceGroup(authorDistanceList)\n        return makeRequest(createRequestPostAuthorDistances(distances),\n                \"postDistances\", {})\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/config/Config.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.config\n\nimport app.model.LocalRepo\nimport app.utils.Options\n\n/**\n * Config data class.\n */\nclass Config (\n        var uuid: String = \"\",\n        var username: String = \"\",\n        var password: String = \"\",\n        var localRepos: MutableSet<LocalRepo> = mutableSetOf()\n) {\n    fun addRepo(repo: LocalRepo) {\n        localRepos.remove(repo)  // Fields may be updated.\n        localRepos.add(repo)\n    }\n\n    fun removeRepo(repo: LocalRepo) {\n        localRepos.remove(repo)\n    }\n\n    fun merge(config: Config): Config {\n        if (config.username.isNotEmpty()) {\n            username = config.username\n        }\n        if (config.password.isNotEmpty()) {\n            password = config.password\n        }\n        if (config.localRepos.isNotEmpty()) {\n            localRepos = config.localRepos\n        }\n\n        return this\n    }\n\n    fun merge(options: Options): Config {\n        if (options.username.isNotEmpty()) {\n            username = options.username\n        }\n        if (options.password.isNotEmpty()) {\n            password = options.password\n        }\n\n        return this\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/config/Configurator.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.config\n\nimport app.model.LocalRepo\nimport app.model.User\nimport app.utils.Options\n\ninterface Configurator {\n    fun setOptions(options: Options)\n    fun getUsername(): String\n    fun getPassword(): String\n    fun isValidCredentials(): Boolean\n    fun getLocalRepos(): List<LocalRepo>\n    fun getUser(): User\n    fun setUsernameCurrent(username: String)\n    fun setPasswordCurrent(password: String)\n    fun getUuidPersistent(): String\n    fun setUsernamePersistent(username: String)\n    fun setPasswordPersistent(password: String)\n    fun addLocalRepoPersistent(localRepo: LocalRepo)\n    fun removeLocalRepoPersistent(localRepo: LocalRepo)\n    fun setUser(user: User)\n    fun isFirstLaunch(): Boolean\n    fun loadFromFile()\n    fun saveToFile()\n    fun resetAndSave()\n}\n"
  },
  {
    "path": "src/main/kotlin/app/config/FileConfigurator.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.config\n\nimport app.Logger\nimport app.model.LocalRepo\nimport app.model.User\nimport app.utils.FileHelper\nimport app.utils.Options\nimport app.utils.PasswordHelper\nimport com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility\nimport com.fasterxml.jackson.annotation.PropertyAccessor\nimport com.fasterxml.jackson.core.JsonParseException\nimport com.fasterxml.jackson.databind.JsonMappingException\nimport com.fasterxml.jackson.databind.ObjectMapper\nimport com.fasterxml.jackson.dataformat.yaml.YAMLFactory\nimport com.fasterxml.jackson.module.kotlin.KotlinModule\nimport java.io.IOException\nimport java.nio.file.Files\nimport java.nio.file.InvalidPathException\nimport java.nio.file.NoSuchFileException\nimport java.util.UUID\n\n/**\n * Singleton class that manage configs and CLI options.\n */\nclass FileConfigurator : Configurator {\n    /**\n     * Persistent configuration file name.\n     */\n    private val CONFIG_FILE_NAME = \"config.yaml\"\n\n    // Config levels are presented in priority decreasing order.\n\n    /**\n     * Configuration based on CLI arguments or temporary user entered data.\n     */\n    private var current: Config = Config()\n\n    /**\n     * Persistent configuration saved in config file in YAML format.\n     */\n    private var persistent: Config = Config()\n\n    /**\n     * Default configuration.\n     */\n    private val default: Config = Config()\n\n    /**\n     * Merger of all configuration levels. Is used to get properties.\n     */\n    private val config: Config\n        get() = default.merge(persistent).merge(current)\n\n    /**\n     * Command-line arguments. Updates [current] on set.\n     */\n    private var options: Options = Options()\n\n    /**\n     * Used to temporarily save list of repos that known by server.\n     */\n    private var user: User = User()\n\n    /**\n     * Jackson's ObjectMapper.\n     */\n    private val mapper = createMapper()\n\n    /**\n     * Initializer that loads persistent config.\n     */\n    init {\n        loadFromFile()\n        assignUuidIfMissing()\n    }\n\n    /**\n     * Generates UUID for analytics on install.\n     */\n    private fun assignUuidIfMissing() {\n        if (persistent.uuid.isNotEmpty()) {\n            return\n        }\n        persistent.uuid = UUID.randomUUID().toString()\n    }\n\n    /**\n     * Creates and setups Jackson's ObjectMapper.\n     */\n    private fun createMapper(): ObjectMapper {\n        return ObjectMapper(YAMLFactory())  // Enable YAML parsing.\n                // Map only fields (not getters, etc).\n                .setVisibility(PropertyAccessor.ALL, Visibility.NONE)\n                .setVisibility(PropertyAccessor.FIELD, Visibility.ANY)\n                .registerModule(KotlinModule())  // Enable Kotlin support.\n    }\n\n    override fun setOptions(options: Options) {\n        current.merge(options)\n        this.options = options\n    }\n\n    /**\n     * Gets username from merger of all configuration levels.\n     */\n    override fun getUsername(): String {\n        return config.username\n    }\n\n    /**\n     * Gets hashed password from merger of all configuration levels.\n     */\n    override fun getPassword(): String {\n        return config.password\n    }\n\n    /**\n     * Checks for non empty credentials from merger of all configuration levels.\n     */\n    override fun isValidCredentials(): Boolean {\n        return config.username.isNotEmpty() && config.password.isNotEmpty()\n    }\n\n    /**\n     * Gets list of repos from merger of all configuration levels.\n     */\n    override fun getLocalRepos(): List<LocalRepo> {\n        return config.localRepos.toList()\n    }\n\n    /**\n     * Gets temprorary saved user information.\n     */\n    override fun getUser(): User {\n        return user\n    }\n\n    /**\n     * Sets username to current launch temprorary config.\n     */\n    override fun setUsernameCurrent(username: String) {\n        current.username = username\n    }\n\n    /**\n     * Sets and hashes password to current launch temprorary config.\n     */\n    override fun setPasswordCurrent(password: String) {\n        current.password = PasswordHelper.hashPassword(password)\n    }\n\n    /**\n     * Gets UUID.\n     */\n    override fun getUuidPersistent(): String {\n        return persistent.uuid\n    }\n\n    /**\n     * Sets username to persistent config. Use [saveToFile] to save.\n     */\n    override fun setUsernamePersistent(username: String) {\n        persistent.username = username\n    }\n\n    /**\n     * Sets and hashes password to persistent config. Use [saveToFile] to save.\n     */\n    override fun setPasswordPersistent(password: String) {\n        persistent.password = PasswordHelper.hashPassword(password)\n    }\n\n    /**\n     * Add repo to persistent config. Use [saveToFile] to save.\n     */\n    override fun addLocalRepoPersistent(localRepo: LocalRepo) {\n        persistent.addRepo(localRepo)\n    }\n\n    /**\n     * Remove repo from persistent config. Use [saveToFile] to save.\n     */\n    override fun removeLocalRepoPersistent(localRepo: LocalRepo) {\n        persistent.removeRepo(localRepo)\n    }\n\n    /**\n     * Temporarily sets info about user.\n     */\n    override fun setUser(user: User) {\n        this.user = user\n    }\n\n    /**\n     * Defines whether this is the first run. If any fields are defined then no.\n     */\n    override fun isFirstLaunch(): Boolean {\n        return persistent.password.isEmpty()\n                && persistent.username.isEmpty()\n                && persistent.localRepos.isEmpty()\n    }\n\n    /**\n     * Loads [persistent] configuration from config file.\n     */\n    override fun loadFromFile() {\n        // Сonfig initialization in case an exception is thrown.\n        var loadConfig = Config()\n\n        try {\n            loadConfig = Files.newBufferedReader(FileHelper\n                .getPath(CONFIG_FILE_NAME)).use {\n                mapper.readValue(it, Config::class.java)\n            }\n        } catch (e: IOException) {\n            if (e is NoSuchFileException){\n                Logger.warn { \"No config file found\" }\n            } else {\n                Logger.error(e, \"Cannot access config file\")\n            }\n        } catch (e: SecurityException) {\n            Logger.error(e, \"Cannot access config file\")\n        } catch (e: InvalidPathException) {\n            Logger.error(e, \"Cannot access config file\")\n        } catch (e: JsonParseException) {\n            Logger.error(e, \"Cannot parse config file\")\n        } catch (e: JsonMappingException) {\n            Logger.error(e, \"Cannot parse config file\")\n        } catch (e: IllegalStateException) {\n            Logger.error(e, \"Cannot parse config file\")\n        }\n\n        persistent = loadConfig\n    }\n\n    /**\n     * Saves [persistent] configuration to config file.\n     */\n    override fun saveToFile() {\n        try {\n            Files.newBufferedWriter(FileHelper.getPath(CONFIG_FILE_NAME)).use {\n                mapper.writeValue(it, persistent)\n            }\n        } catch (e: IOException) {\n            Logger.error(e, \"Cannot save config file\")\n        } catch (e: SecurityException) {\n            Logger.error(e, \"Cannot save config file\")\n        } catch (e: InvalidPathException) {\n            Logger.error(e, \"Cannot save config file\")\n        } catch (e: JsonParseException) {\n            Logger.error(e, \"Cannot parse config file\")\n        } catch (e: JsonMappingException) {\n            Logger.error(e, \"Cannot parse config file\")\n        } catch (e: IllegalStateException) {\n            Logger.error(e, \"Cannot parse config file\")\n        }\n    }\n\n    /**\n     * Resets all configurations, CLI options and config file.\n     */\n    override fun resetAndSave() {\n        options = Options()\n        persistent = Config()\n        saveToFile()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/config/MockConfigurator.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.config\n\nimport app.model.LocalRepo\nimport app.model.User\nimport app.utils.Options\n\nclass MockConfigurator(var mockUsername: String = \"\",\n                       var mockPassword: String = \"\",\n                       var mockIsValidCredentials: Boolean = true,\n                       var mockIsFirstLaunch: Boolean = true,\n                       var mockUser: User = User(),\n                       var mockLocalRepos: MutableList<LocalRepo> =\n                           mutableListOf(),\n                       var uuid: String = \"\") : Configurator {\n    var mockCurrent: Config = Config()\n    var mockPersistent: Config = Config()\n    var mockOptions: Options = Options()\n\n    override fun setOptions(options: Options) {\n        mockOptions = options\n    }\n\n    override fun getUsername(): String {\n        return mockUsername\n    }\n\n    override fun getPassword(): String {\n        return mockPassword\n    }\n\n    override fun isValidCredentials(): Boolean {\n        return mockIsValidCredentials\n    }\n\n    override fun getLocalRepos(): List<LocalRepo> {\n        return mockLocalRepos\n    }\n\n    override fun getUser(): User {\n        return mockUser\n    }\n\n    override fun setUsernameCurrent(username: String) {\n        mockCurrent.username = username\n    }\n\n    override fun setPasswordCurrent(password: String) {\n        mockCurrent.password = password\n    }\n\n    override fun getUuidPersistent(): String {\n        return uuid\n    }\n\n    override fun setUsernamePersistent(username: String) {\n        mockPersistent.username = username\n    }\n\n    override fun setPasswordPersistent(password: String) {\n        mockPersistent.password = password\n    }\n\n    override fun addLocalRepoPersistent(localRepo: LocalRepo) {\n        mockPersistent.localRepos.remove(localRepo)\n        mockPersistent.localRepos.add(localRepo)\n    }\n\n    override fun removeLocalRepoPersistent(localRepo: LocalRepo) {\n        mockPersistent.localRepos.remove(localRepo)\n    }\n\n    override fun setUser(user: User) {\n        mockUser = user\n    }\n\n    override fun isFirstLaunch(): Boolean {\n        return mockIsFirstLaunch\n    }\n\n    override fun loadFromFile() {}\n\n    override fun saveToFile() {}\n\n    override fun resetAndSave() {}\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/CExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nclass CExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.C\n        val importRegex = Regex(\"\"\"^([^\\n]*#include)\\s[^\\n]*\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\")\n        val extractImportRegex =\n            Regex(\"\"\"#include\\s+[\"<](\\w+)[/\\w+]*\\.\\w+[\">]\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = extractImportRegex.find(it)\n            if (res != null) {\n                val lineLib = res.groupValues.last()\n                imports.add(lineLib)\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        // TODO(lyaronskaya): Add C to libraries.\n        return super.mapImportToIndex(import, Lang.CPP, startsWith = true)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/CSharpExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nclass CSharpExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.CSHARP\n        val importRegex = Regex(\"\"\"^.*using\\s+(\\w+[.\\w+]*)\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\")\n        val extractImportRegex = Regex(\"\"\"using\\s+(\\w+[.\\w+]*)\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = extractImportRegex.find(it)\n            if (res != null) {\n                imports.add(res.groupValues[1])\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        return super.mapImportToIndex(import, lang, startsWith = true)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/ClassifierManager.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nimport app.BuildConfig\nimport app.Logger\nimport app.model.Classifier\nimport app.model.LibraryMeta\nimport app.utils.FileHelper\nimport org.apache.http.client.methods.HttpGet\nimport org.apache.http.impl.client.HttpClientBuilder\nimport java.io.FileOutputStream\n\nclass ClassifierManager {\n    companion object {\n        private const val CLASSIFIERS_DIR = \"classifiers\"\n        private const val DATA_EXT = \".pb\"\n        private const val LIBS_META_DIR = ClassifierManager.CLASSIFIERS_DIR\n        private const val LIBS_META_FILENAME = \"libraries_meta.pb\"\n    }\n\n    val cache = hashMapOf<String, Classifier>()\n    val libsMeta = getLibraryMeta()\n\n    /**\n     * Returns libraries used in a line.\n     */\n    fun estimate(line: List<String>, libraries: List<String>): List<String> {\n        return libraries.filter { libId ->\n            if (!cache.containsKey(libId)) {\n                // Library not downloaded from cloud storage.\n                if (FileHelper.notExists(libId + DATA_EXT, CLASSIFIERS_DIR)) {\n                    Logger.info { \"Downloading $libId classifier\" }\n                    downloadClassifier(libId)\n                    Logger.info { \"Finished downloading $libId classifier\" }\n                }\n\n                // Library not loaded from local storage.\n                Logger.info { \"Loading $libId evaluator\" }\n                loadClassifier(libId)\n                Logger.info { \"$libId evaluator ready\" }\n            }\n\n            // Check line for usage of a library.\n            val prediction = cache[libId]!!.evaluate(line)\n            // Prediction based on two classes.\n            val prob = prediction[cache[libId]!!.libraries.indexOf(libId)]\n            // Define lower bound of classifier output\n            // that depends on data used to create the model.\n            // TODO(lyaronskaya): move thresholds to protobuf.\n            if (libId == \"rb.rails\") {\n                prob > 0.91\n            } else if (libId == \"py.flask\") {\n                prob > 0.95\n            } else if (libId.startsWith(Lang.KOTLIN)) {\n                prob > 0.8\n            } else if (libId.startsWith(Lang.PLPGSQL)) {\n                prob > 0.7\n            } else if (libId.startsWith(Lang.PHP)) {\n                prob > 0.75\n            } else if (libId.startsWith(Lang.PYTHON)) {\n                prob > 0.75\n            } else if (libId.startsWith(Lang.SCALA)) {\n                prob > 0.85\n            } else if (libId.startsWith(Lang.GO)) {\n                prob > 0.75\n            } else if (libId.startsWith(Lang.JAVA)) {\n                prob > 0.9\n            } else if (libId.startsWith(Lang.CRYSTAL)) {\n                prob > 0.7\n            } else if (libId.startsWith(Lang.PERL)) {\n                prob > 0.8\n            } else if (libId.startsWith(\"rb.dry-\")) {\n                prob > 0.85\n            } else if (libId == \"js.q\") {\n                prob > 0.9\n            } else if (libId == \"cpp.gflags\") {\n                prob > 0.9\n            } else if (libId == \"dart.flutter\") {\n                prob > 0.85\n            }\n            else if (libId.startsWith(Lang.CPP)) {\n                prob > 0.8\n            }\n            else if (libId.startsWith(Lang.JAVASCRIPT)) {\n                prob > 0.7\n            }\n            else {\n                prob > 0.5\n            }\n        }\n    }\n\n    /**\n     * Downloads libraries from cloud.\n     */\n    private fun downloadClassifier(libId: String) {\n        val file = FileHelper.getFile(libId + DATA_EXT, CLASSIFIERS_DIR)\n        val langId = libId.split('.')[0]\n        val url = \"${BuildConfig.LIBRARY_MODELS_URL}$langId/$libId$DATA_EXT\"\n        val builder = HttpClientBuilder.create()\n        val client = builder.build()\n        try {\n            client.execute(HttpGet(url)).use { response ->\n                val entity = response.entity\n                if (entity != null) {\n                    FileOutputStream(file).use { outstream ->\n                        entity.writeTo(outstream)\n                        outstream.flush()\n                        outstream.close()\n                    }\n                }\n\n            }\n        } catch (e: Exception) {\n            Logger.error(e, \"Failed to download $libId classifier\")\n        }\n    }\n\n    /**\n     * Loads libraries from local storage to cache.\n     */\n    private fun loadClassifier(libId: String) {\n        val bytesArray = FileHelper.getFile(libId + DATA_EXT, CLASSIFIERS_DIR)\n            .readBytes()\n        cache[libId] = Classifier(bytesArray)\n    }\n\n    /**\n     * Downloads libraries meta data from cloud.\n     */\n    private fun downloadLibrariesMeta() {\n        val file = FileHelper.getFile(LIBS_META_FILENAME, LIBS_META_DIR)\n        val url = BuildConfig.LIBRARY_MODELS_URL + LIBS_META_FILENAME\n        val builder = HttpClientBuilder.create()\n        val client = builder.build()\n        try {\n            client.execute(HttpGet(url)).use { response ->\n                val entity = response.entity\n                if (entity != null) {\n                    FileOutputStream(file).use { outstream ->\n                        entity.writeTo(outstream)\n                        outstream.flush()\n                        outstream.close()\n                    }\n                }\n            }\n        } catch (e: Exception) {\n            Logger.error(e, \"Failed to download $LIBS_META_FILENAME\")\n        }\n    }\n\n    /**\n     * Loads libraries meta data from local storage.\n     */\n    private fun getLibraryMeta(): LibraryMeta {\n        Logger.info { \"Downloading $LIBS_META_FILENAME\" }\n        downloadLibrariesMeta()\n        Logger.info { \"Finished downloading $LIBS_META_FILENAME\" }\n\n        val bytesArray = FileHelper.getFile(LIBS_META_FILENAME,\n            LIBS_META_DIR).readBytes()\n        return LibraryMeta(bytesArray)\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/CommonExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffFile\n\nclass CommonExtractor(private val langName: String) : ExtractorInterface {\n    override fun extract(files: List<DiffFile>): List<CommitStats> {\n        files.map { file -> file.lang = langName }\n        return super.extract(files)\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/CppExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffFile\n\nclass CppExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.CPP\n        const val TEMPLATE = \"template\"\n        val importRegex = Regex(\"\"\"^([^\\n]*#include)\\s[^\\n]*\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\")\n        val extractImportRegex = Regex(\"\"\"#include\\s+[\"<](\\w+[/\\w+]*(\\.\\w+)?)[\">]\"\"\")\n        val templateRegex = Regex(\"\"\"template\\s*<\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = extractImportRegex.find(it)\n            if (res != null) {\n                val lineLib = res.groupValues\n                                 .last { !it.startsWith(\".\") && it != \"\"}\n                imports.add(lineLib)\n            }\n        }\n        return imports.toSet().toList()\n    }\n\n    override fun extract(files: List<DiffFile>): List<CommitStats> {\n        val stats = super.extract(files).toMutableList()\n\n        // Templates fun fact.\n        val allAdded = files.map{ file -> file.getAllAdded() }.flatten()\n        val allDeleted = files.map{ file -> file.getAllDeleted() }.flatten()\n\n        val templateAllAdded = allAdded.filter { isTemplate(it) }.size\n        val templateAllDeleted = allDeleted.filter { isTemplate(it) }.size\n\n        if (templateAllAdded > 0 || templateAllDeleted > 0) {\n            stats.add(CommitStats(\n                    templateAllAdded, templateAllDeleted, ExtractorInterface.TYPE_SYNTAX,\n                    tech = LANGUAGE_NAME + ExtractorInterface.SEPARATOR + TEMPLATE\n            ))\n        }\n\n        return stats\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        return super.mapImportToIndex(import, lang, startsWith = true)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n\n    private fun isTemplate(line: String): Boolean {\n        return line.contains(templateRegex)\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/CrystalExtractor.kt",
    "content": "// Copyright 2019 Sourcerer Inc. All Rights Reserved.\n// Author: Anton Maminov (anton.maminov@gmail.com)\n\npackage app.extractors\n\nclass CrystalExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.CRYSTAL\n        val importRegex = Regex(\"\"\"require\\s+\\\"(\\w+)\\\"\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*#)[^\\n]*\"\"\")\n        val extractImportRegex = Regex(\"\"\"require\\s+\\\"(.+)\\\"\"\"\")\n        val includeRegex = Regex(\"\"\"include\\s+(\\w+)::.+\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = extractImportRegex.find(it)\n            if (res != null) {\n                val lineLib = res.groupValues.last { it != \"\" }\n                imports.add(lineLib)\n            }\n        }\n\n        if (imports.isEmpty()) {\n            fileContent.forEach {\n                val res = includeRegex.find(it)\n                if (res != null) {\n                    imports.add(res.groupValues.last().toLowerCase())\n                }\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        return super.mapImportToIndex(import, lang, startsWith = true)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/CssExtractor.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffFile\n\nclass CssExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.CSS\n        val FILE_EXTS = listOf(\"css\", \"scss\", \"less\", \"sass\")\n    }\n\n    override fun extract(files: List<DiffFile>): List<CommitStats> {\n        files.map { file -> file.lang = LANGUAGE_NAME }\n        val stats = FILE_EXTS.filter { it != \"css\" }.map { extension ->\n            val result = files.filter { it.extension == extension }\n                .fold(Pair(0, 0)) { total, file ->\n                    val currentNumAdded = file.getAllAdded()\n                                              .filter { it.isNotBlank() }.size\n                    val currentNumDeleted = file.getAllDeleted()\n                                                .filter { it.isNotBlank() }.size\n                    Pair(total.first + currentNumAdded,\n                         total.second + currentNumDeleted)}.toList()\n\n            CommitStats(numLinesAdded = result[0],\n                        numLinesDeleted = result[1],\n                        type = ExtractorInterface.TYPE_LIBRARY,\n                        tech = extension)\n        }.filter { it.numLinesAdded > 0 || it.numLinesDeleted > 0 }\n\n        return stats + super.extract(files)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/DMExtractor.kt",
    "content": "// Copyright 2019 Sourcerer Inc. All Rights Reserved.\n// Author: Nickolas Gupton (nickolas@gupton.xyz)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffFile\n\nclass DMExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.DM\n    }\n\n    override fun extractLibStats(files: List<DiffFile>): List<CommitStats> {\n        val mapExtension = \".dmm\"\n        val spriteExtension = \".dmi\"\n\n        val mapFiles = files.filter { it.path.endsWith(mapExtension) }\n        val spriteFiles = files.filter { it.path.endsWith(spriteExtension) }\n\n        // Add stats from *.dmm files.\n        val mapStats = listOf(CommitStats(\n            numLinesAdded = mapFiles.map { it.getAllAdded().size }.sum(),\n            numLinesDeleted = mapFiles.map { it.getAllDeleted().size }.sum(),\n            type = ExtractorInterface.TYPE_LIBRARY,\n            tech = \"dm.byond-mapping\"\n        )).filter { it.numLinesAdded > 0 || it.numLinesDeleted > 0 }\n\n        // Add stats from *.dmi files.\n        val spriteStats = listOf(CommitStats(\n            numLinesAdded = spriteFiles.map { it.getAllAdded().size }.sum(),\n            numLinesDeleted = spriteFiles.map { it.getAllDeleted().size }.sum(),\n            type = ExtractorInterface.TYPE_LIBRARY,\n            tech = \"dm.byond-sprites\"\n        )).filter { it.numLinesAdded > 0 || it.numLinesDeleted > 0 }\n\n        return mapStats + spriteStats;\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/DartExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage app.extractors\n\nobject DartExtractor : ExtractorBase(\n    language = Lang.DART,\n    importRegex = Regex(\"\"\"^import ['\"](.+)['\"];$\"\"\"),\n    commentRegex = Regex(\"(//.+$)|(/[*].*?[*]/)\"))\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/DevopsExtractor.kt",
    "content": "// Copyright 2019 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffFile\n\nclass DevopsExtractor(private val techName: String) : ExtractorInterface {\n    companion object {\n        const val DEVOPS = \"devops.\"\n        const val JENKINS = \"jenkins\"\n        const val CIRCLECI = \"circleci\"\n        const val GITLAB_CI = \"gitlab-ci\"\n        const val GITHUB_ACTIONS = \"github-actions\"\n        const val TRAVIS = \"travis\"\n        const val K8S = \"k8s\"\n        const val DOCKER = \"docker\"\n        const val DRONE = \"drone\"\n    }\n\n    override fun extract(files: List<DiffFile>): List<CommitStats> {\n        return listOf(CommitStats(\n            numLinesAdded = files.map { it.getAllAdded().size }.sum(),\n            numLinesDeleted = files.map { it.getAllDeleted().size }.sum(),\n            type = ExtractorInterface.TYPE_LIBRARY,\n            tech = DEVOPS + techName\n        )).filter { it.numLinesAdded > 0 || it.numLinesDeleted > 0 }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/ElixirExtractor.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage app.extractors\n\nobject ElixirExtractor : ExtractorBase(\n    language = Lang.ELIXIR,\n    importRegex = Regex(\"\"\"^\\s+(?:use|import|require) ([a-zA-Z_][a-zA-Z0-9_]*)\"\"\"),\n    commentRegex = Regex(\"\"\"#.*$\"\"\"))\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/Extractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffFile\n\nclass Extractor : ExtractorInterface {\n    companion object {\n        val RESTRICTED_EXTS = listOf(\".min.js\")\n    }\n\n    override fun extract(files: List<DiffFile>): List<CommitStats> {\n        return files\n            .filter { file -> !RESTRICTED_EXTS.contains(file.extension) }\n            .mapNotNull { file ->\n                Heuristics.analyze(file)\n            }\n            .fold(mutableListOf()) { accStats, stats ->\n                accStats.addAll(stats)\n                accStats\n            }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/ExtractorBase.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage app.extractors\n\nopen class ExtractorBase(private val language: String,\n                         private val importRegex: Regex,\n                         private val commentRegex: Regex,\n                         private val importStartsWith: Boolean = false) :\n        ExtractorInterface {\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val line = commentRegex.replace(it, \"\")\n            val res = importRegex.find(line)\n            if (res != null) {\n                val lineLib = res.groupValues[1]\n                imports.add(lineLib)\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun mapImportToIndex(import: String, lang: String, startsWith: Boolean): String? {\n        return super.mapImportToIndex(import, lang, startsWith = importStartsWith)\n    }\n\n    override fun getLanguageName(): String? {\n        return language\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/ExtractorInterface.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.*\n\ninterface ExtractorInterface {\n    companion object {\n        const val TYPE_LANGUAGE = 1\n        const val TYPE_LIBRARY = 2\n        const val TYPE_KEYWORD = 3\n        const val TYPE_SYNTAX = 4\n        const val SEPARATOR = \">\"\n\n        private val classifierManager = ClassifierManager()\n\n        val stringRegex = Regex(\"\"\"(\".+?\"|'.+?')\"\"\")\n        val splitRegex = Regex(\"\"\"\\s|,|;|\\*|\\n|\\(|\\)|\\[|]|\\{|}|\\+|=|&|\\$|\"\"\" +\n            \"\"\"!=|\\.|>|<|#|@|:|\\?|!\"\"\")\n    }\n\n    // Identify libs used in a line with classifiers.\n    fun determineLibs(line: String, importedLibs: List<String>): List<String> {\n        val lang = getLanguageName()\n        if (lang != null) {\n            return classifierManager.estimate(tokenize(line), importedLibs)\n        }\n        return listOf()\n    }\n\n    // Should be defined for each language otherwise libs extraction disabled.\n    fun extractImports(fileContent: List<String>): List<String> {\n        return listOf()\n    }\n\n    // Should be defined for additional statistics like keywords.\n    fun extract(files: List<DiffFile>): List<CommitStats> {\n        val lang = getLanguageName()\n        if (lang != null) {\n            files.forEach { file -> file.lang = lang }\n        }\n\n        return extractLangStats(files) + extractLibStats(files)\n    }\n\n    fun extractLangStats(files: List<DiffFile>): List<CommitStats> {\n        return files.filter { file -> file.lang.isNotBlank() }\n            .groupBy { file -> file.lang }\n            .map { (language, files) -> CommitStats(\n                numLinesAdded = files.fold(0) { total, file ->\n                    total + file.getAllAdded().size },\n                numLinesDeleted = files.fold(0) { total, file ->\n                    total + file.getAllDeleted().size },\n                type = TYPE_LANGUAGE,\n                tech = language)\n            }\n    }\n\n    fun extractLibStats(files: List<DiffFile>): List<CommitStats> {\n        val oldLibs = extractLibsOfDiffs(files.map { Pair(it.lang, it.old) })\n        val newLibs = extractLibsOfDiffs(files.map { Pair(it.lang, it.new) })\n\n        val allLibsIds = oldLibs.keys + newLibs.keys\n\n        return allLibsIds.map { libId -> CommitStats(\n            numLinesAdded = newLibs.getOrDefault(libId, 0),\n            numLinesDeleted = oldLibs.getOrDefault(libId, 0),\n            type = TYPE_LIBRARY,\n            tech = libId\n        ) }.filter { it.numLinesAdded > 0 || it.numLinesDeleted > 0 }\n    }\n\n    fun extractLibsOfDiffs(diffs: List<Pair<String, DiffContent>>):\n        Map<String, Int> {\n        val libsCount = mutableMapOf<String, Int>()\n\n        // Extract imports from files.\n        diffs.forEach { (_, diff) ->\n            diff.imports = extractImports(diff.content)\n        }\n\n        // Skip library stats calculation if no imports found.\n        if (!diffs.any({ (_, diff) -> diff.imports.isNotEmpty() })) {\n            return mapOf()\n        }\n\n        // Determine libraries used in each line.\n        diffs.filter { (lang, _) -> lang.isNotBlank() }\n            .forEach { (lang, diff) ->\n                val importedLibs = diff.imports.mapNotNull { import ->\n                    mapImportToIndex(import, lang)\n                }\n\n                diff.getAllDiffs().forEach { line ->\n                    determineLibs(line, importedLibs).forEach { libId ->\n                        libsCount[libId] = libsCount.getOrDefault(libId, 0) + 1\n                    }\n                }\n            }\n\n        return libsCount\n    }\n\n    fun tokenize(line: String): List<String> {\n        // TODO(lyaronskaya): Multiline comment regex.\n\n        // TODO(anatoly): Optimize this regex, better to get rid of it.\n        val newLine = stringRegex.replace(line, \"\")\n\n        val tokens = newLine.split(' ', '[', ',', ';', '*', '\\n', ')', '(',\n            '[', ']', '}', '{', '+', '-', '=', '&', '$', '!', '.', '>', '<',\n            '#', '@', ':', '?', ']')\n            .filter {\n                it.isNotBlank() && !it.contains('\"') && !it.contains('\\'') &&\n                it != \"-\" && it != \"@\"\n            }\n\n        return tokens\n    }\n\n    fun getLanguageName(): String? {\n        return null\n    }\n\n    fun mapImportToIndex(import: String, lang: String,\n                         startsWith: Boolean = false): String? {\n        val libsMeta = classifierManager.libsMeta\n        if (!libsMeta.importToIndexMap.contains(lang)) return null\n\n        if (startsWith) {\n            val map = libsMeta.importToIndexMap[lang]\n            val baseImports = map!!.keys.filter { import.startsWith(it) }\n            if (baseImports.isEmpty()) {\n                return null\n            }\n            val baseImport = baseImports.reduce { acc, s ->\n                if (s.length > acc.length) s else acc\n            }\n            return map[baseImport]\n        }\n\n        return libsMeta.importToIndexMap[lang]!![import]\n    }\n\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/FSharpExtractor.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Tuomas Hietanen\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nclass FSharpExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.FSHARP\n        val importRegex = Regex(\"\"\"^.*open\\s+(\\w+[.\\w+]*)\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\")\n        val extractImportRegex = Regex(\"\"\"open\\s+(\\w+[.\\w+]*)\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = extractImportRegex.find(it)\n            if (res != null) {\n                imports.add(res.groupValues[1])\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        // The behaviour of fsharp library classifier is the same as for csharp.\n        return super.mapImportToIndex(import, Lang.CSHARP, startsWith = true)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/GoExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nclass GoExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.GO\n        val importRegex = Regex(\"\"\"^(.*import)\\s[^\\n]*\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\")\n        val singleImportRegex = Regex(\"\"\"import\\s+\"(.+?)\"\"\"\")\n        val multipleImportRegex = Regex(\"\"\"import[\\s\\t\\n]+\\((.+?)\\)\"\"\",\n                RegexOption.DOT_MATCHES_ALL)\n        val separatorsRegex = Regex(\"\"\"(\\t+|\\n+|\\s+|\")\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = singleImportRegex.find(it)\n            if (res != null) {\n                val lineLib = res.groupValues.last()\n                imports.add(lineLib)\n            }\n        }\n        val contentJoined = fileContent.joinToString(separator = \"\")\n        multipleImportRegex.findAll(contentJoined).forEach { matchResult ->\n            imports.addAll(matchResult.groupValues.last()\n                .split(separatorsRegex)\n                .filter { it.isNotEmpty() }\n                .map { it.replace(\"\\\"\", \"\") })\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        return super.mapImportToIndex(import, lang, startsWith = true)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/Heuristics.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.DiffFile\nimport app.model.CommitStats\n\nval ActionscriptRegex = Regex(\n    \"^\\\\s*(package\\\\s+[a-z0-9_\\\\.]+|import\\\\s+[a-zA-Z0-9_\\\\.]+;|class\\\\s+[A-Za-z0-9_]+\\\\s+extends\\\\s+[A-Za-z0-9_]+)\",\n    RegexOption.MULTILINE\n)\nval CoqRegex = Regex(\n    \"\"\"^Require\\s\"\"\",\n    RegexOption.MULTILINE\n)\nval CommonLispRegex = Regex(\n    \"^\\\\s*\\\\((defun|in-package|defpackage) \",\n    setOf(RegexOption.MULTILINE, RegexOption.IGNORE_CASE)\n)\nval CppRegex = Regex(\n    \"(template |class |namespace |#include <c?std[^.]+>)\",\n    RegexOption.MULTILINE\n)\nval DRegex = Regex(\n    \"^module\\\\s+[\\\\w.]*\\\\s*;|import\\\\s+[\\\\w\\\\s,.:]*;|\\\\w+\\\\s+\\\\w+\\\\s*\\\\(.*\\\\)(?:\\\\(.*\\\\))?\\\\s*\\\\{[^}]*\\\\}|unittest\\\\s*(?:\\\\(.*\\\\))?\\\\s*\\\\{[^}]*\\\\}\",\n    RegexOption.MULTILINE\n)\nval DtraceRegex = Regex(\n    \"^(\\\\w+:\\\\w*:\\\\w*:\\\\w*|BEGIN|END|provider\\\\s+|(tick|profile)-\\\\w+\\\\s+\\\\{[^}]*\\\\}|#pragma\\\\s+D\\\\s+(option|attributes|depends_on)\\\\s|#pragma\\\\s+ident\\\\s)\",\n    RegexOption.MULTILINE\n)\nval FilterscriptRegex = Regex(\n    \"#include|#pragma\\\\s+(rs|version)|__attribute__\"\n)\nval FSharpRegex = Regex(\n    \"^\\\\s*(#light|import|let|module|namespace|open|type)\",\n    RegexOption.MULTILINE\n)\nval ForthRegex = Regex(\n    \"^: \"\n)\nval ForthFsRegex = Regex(\n    \"^(: |new-device)\"\n)\nval FortranRegex = Regex(\n    \"^([c*][^abd-z]|      (subroutine|program|end|data)\\\\s|\\\\s*!)\",\n    RegexOption.IGNORE_CASE\n)\nval GlslRegex = Regex(\n    \"^\\\\s*(#version|precision|uniform|varying|vec[234])\",\n    RegexOption.IGNORE_CASE\n)\nval IdlRegex = Regex(\n    \"^\\\\s*function[ \\\\w,]+$\",\n    RegexOption.MULTILINE\n)\nval IniPropsRegex = Regex(\n    \"\\\\w+\\\\s*=\\\\s*\",\n    RegexOption.IGNORE_CASE\n)\nval LexRegex = Regex(\n    \"^(%[%{}]xs|<.*>)\",\n    RegexOption.MULTILINE\n)\nval LimboRegex = Regex(\n    \"^\\\\w+\\\\s*:\\\\s*module\\\\s*\\\\{\",\n    RegexOption.MULTILINE\n)\nval MathematicaRegex = Regex(\n    \"\\\\*\\\\)$\",\n    RegexOption.MULTILINE\n)\nval MatlabRegex = Regex(\n    \"\"\"(^\\s*%)|(^end$)\"\"\",\n    RegexOption.MULTILINE\n)\nval MRegexs = setOf(\n    Regex(\n        \"^\\\\s*;\",\n        RegexOption.MULTILINE\n    ),\n    Regex(\n        \"^\\\\w+\\\\s;\",\n        RegexOption.MULTILINE\n    )\n)\nval MakefileRegex = Regex(\n    \"([\\\\/\\\\\\\\].*:\\\\s+.*\\\\s\\\\\\\\$|: \\\\\\\\$|^ : |^[\\\\w\\\\s\\\\/\\\\\\\\.]+\\\\w+\\\\.\\\\w+\\\\s*:\\\\s+[\\\\w\\\\s\\\\/\\\\\\\\.]+\\\\w+\\\\.\\\\w+)\"\n)\nval MufRegex =Regex(\n    \"^: \",\n    RegexOption.MULTILINE\n)\nval NewLispRegex = Regex(\n    \"^\\\\s*\\\\(define \",\n    RegexOption.MULTILINE\n)\nval NotSqlRegex = Regex(\n    \"begin|boolean|package|exception\",\n    RegexOption.IGNORE_CASE\n)\nval ObjectiveCRegex = Regex(\n    \"^\\\\s*(@(interface|class|protocol|property|end|synchronised|selector|implementation)\\\\b|#import\\\\s+.+\\\\.h[\\\">])\",\n    RegexOption.MULTILINE\n)\nval OcamlRegex = Regex(\n    \"(^\\\\s*module)|let rec |match\\\\s+(\\\\S+\\\\s)+with\",\n    RegexOption.MULTILINE\n)\nval PascalRegex = Regex(\n    \"(^\\\\s*uses)|(function)|(program)\",\n    setOf(RegexOption.MULTILINE, RegexOption.IGNORE_CASE)\n)\nval Perl5Regex = Regex(\n    \"\\\\buse\\\\s+(?:strict\\\\b|v?5\\\\.)\"\n)\nval Perl6Regex = Regex(\n    \"^\\\\s*(?:use\\\\s+v6\\\\b|\\\\bmodule\\\\b|\\\\b(?:my\\\\s+)?class\\\\b)\",\n    RegexOption.MULTILINE\n)\nval PhpRegex = Regex(\n    \"^<\\\\?(?:php)?\"\n)\nval PhpIlluminateRegex = Regex(\n    \"(Auth|Bootstrap|Bus|Console|Events|Exceptions|Http|Providers\" +\n                \"|Support|Testing|Validation)\")\nval PicoLispRegex = Regex(\n    \"^\\\\((de|class|rel|code|data|must)\\\\s\",\n    RegexOption.MULTILINE\n)\nval PlpgsqlRegexs = setOf(\n    Regex(\n        \"^\\\\\\\\i\\\\b|AS \\\\$\\\\$|LANGUAGE '?plpgsql'?\",\n        setOf(RegexOption.MULTILINE, RegexOption.IGNORE_CASE)\n    ),\n    Regex(\n        \"SECURITY (DEFINER|INVOKER)\",\n        RegexOption.IGNORE_CASE\n    ),\n    Regex(\n        \"BEGIN( WORK| TRANSACTION)?;\",\n        RegexOption.IGNORE_CASE\n    )\n)\nval PlsqlRegexs = setOf(\n    Regex(\n        \"\\\\\\$\\\\\\$PLSQL_|XMLTYPE|sysdate|systimestamp|\\\\.nextval|connect by|AUTHID (DEFINER|CURRENT_USER)\",\n        RegexOption.IGNORE_CASE\n    ),\n    Regex(\n        \"constructor\\\\W+function\",\n        RegexOption.IGNORE_CASE\n    )\n)\nval PovRaySdlRegex = Regex(\n    \"^\\\\s*#(declare|local|macro|while)\\\\s\", RegexOption.MULTILINE\n)\nval PrologRegex = Regex(\n    \"^[^#]*:-\",\n    RegexOption.MULTILINE\n)\nval PythonRegex = Regex(\n    \"(^(import|from|class|def)\\\\s)\",\n    RegexOption.MULTILINE\n)\nval RRegex = Regex(\n    \"<-|^\\\\s*#\"\n)\nval RebolRegex = Regex(\n    \"\\\\bRebol\\\\b\",\n    RegexOption.IGNORE_CASE\n)\nval RoffRegex = Regex(\n    \"^\\\\.[a-z][a-z](\\\\s|$)\",\n    setOf(RegexOption.MULTILINE, RegexOption.IGNORE_CASE)\n)\nval RustRegex = Regex(\n    \"^(use |fn |mod |pub |macro_rules|impl|#!?\\\\[)\",\n    RegexOption.MULTILINE\n)\nval RenderscriptRegex = Regex(\n    \"#include|#pragma\\\\s+(rs|version)|__attribute__\"\n)\nval ScalaRegex = Regex(\n    \"^\\\\s*import (scala|java)\\\\./.match(data) || /^\\\\s*val\\\\s+\\\\w+\\\\s*=/.match(data) || /^\\\\s*class\\\\b\",\n    RegexOption.MULTILINE\n)\nval SmalltalkRegex = Regex(\n    \"![\\\\w\\\\s]+methodsFor: \"\n)\nval SqlplRegexs = setOf(\n    Regex(\n        \"(alter module)|(language sql)|(begin( NOT)+ atomic)\",\n        RegexOption.IGNORE_CASE\n    ),\n    Regex(\n        \"signal SQLSTATE '[0-9]+'\",\n        RegexOption.IGNORE_CASE\n    )\n)\nval StandardMlRegex = Regex(\n    \"=> |case\\\\s+(\\\\S+\\\\s)+of\"\n)\nval SupercolliderRegexs = setOf(\n    Regex(\"\\\\^(this|super)\\\\.\"),\n    Regex(\"^\\\\s*(\\\\+|\\\\*)\\\\s*\\\\w+\\\\s*\\\\{\", RegexOption.MULTILINE),\n    Regex(\"^\\\\s*~\\\\w+\\\\s*=\\\\.\", RegexOption.MULTILINE)\n)\nval TexRegex = Regex(\n    \"\\\\\\\\\\\\w+\\\\{\"\n)\nval TypescriptRegex = Regex(\n    \"^\\\\s*(import.+(from\\\\s+|require\\\\()['\\\"]react|\\\\/\\\\/\\\\/\\\\s*<reference\\\\s)\",\n    RegexOption.MULTILINE\n)\nval XmlPropsRegex = Regex(\n    \"^(\\\\s*)(<Project|<Import|<Property|<?xml|xmlns)\",\n    setOf(RegexOption.MULTILINE, RegexOption.IGNORE_CASE)\n)\nval XmltsRegex = Regex(\n    \"<TS\\\\b\"\n)\n// Mystical \\uFEFF 'ZERO WIDTH NO-BREAK SPACE' unicode character may appear\n// in beginning of files.\nval XmlRegex = Regex(\n    \"^\\\\uFEFF?\\\\s*<\\\\?xml\\\\s+version\",\n    setOf(RegexOption.MULTILINE, RegexOption.IGNORE_CASE)\n)\nval XpmRegex = Regex(\n    \"^\\\\s*\\\\/\\\\* XPM \\\\*\\\\/\",\n    RegexOption.MULTILINE\n)\n\nval k8sExp = { buf: String ->\n    // Required fields in k8s config: apiVersion, kind, metadata.\n    buf.contains(\"apiVersion\") && buf.contains(\"kind\")\n        && buf.contains(\"metadata\")\n}\n\nval bootstrapWebpackExp = { buf: String ->\n    // Handling php projects with bootstrap Webpack.\n    buf.contains(\"/******/ (function(modules) { // webpackBootstrap\")\n}\n\n/**\n * Heuristics to detect a programming language by file extension and content.\n * Inspired by GitHub Liguist heuristics (https://github.com/github/linguist).\n */\nobject Heuristics\n{\n    /**\n     * Returns a list of language commit stats extracted from the given file.\n     */\n    fun analyze(file: DiffFile) : List<CommitStats>? {\n        val buf = toBuf(file.new.content)\n        var extractor: ExtractorInterface? = null\n\n        // Look for an extractor by a file extension. If failed, then fallback\n        // to generic content analysis.\n        val extractorFactory = HeuristicsMap[file.extension]\n        if (extractorFactory != null) {\n            extractor = extractorFactory(buf, file.path.toLowerCase())\n        } else {\n            if (XmlRegex.containsMatchIn(buf)) {\n                extractor = CommonExtractor(Lang.XML)\n            }\n        }\n\n        return extractor?.extract(listOf(file))\n    }\n\n    /**\n     * Returns a portion of the file content not exceeding the limit.\n     */\n    private const val HEURISTICS_CONSIDER_BYTES = 50 * 1024\n    private fun toBuf(lines: List<String>) : String {\n        var buf = \"\"\n        for (line in lines) {\n            buf += \"$line\\n\"\n            if (buf.length > HEURISTICS_CONSIDER_BYTES) {\n                break\n            }\n        }\n        return buf\n    }\n}\n\n/**\n * A map of file extensions to language extracters.\n */\nval HeuristicsMap = mapOf<String, (String, String) -> ExtractorInterface?>(\n    \"4\" to { _, _ ->\n        CommonExtractor(Lang.ROFF)\n    },\n    \"4th\" to { _, _ ->\n        CommonExtractor(Lang.FORTH)\n    },\n    \"a51\" to { _, _ ->\n        CommonExtractor(Lang.ASSEMBLY)\n    },\n    \"al\" to { _, _ ->\n        PerlExtractor(Lang.PERL)\n    },\n    \"as\" to { buf, _ ->\n        if (ActionscriptRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.ACTIONSCRIPT)\n        } else CommonExtractor(Lang.ANGELSCRIPT)\n    },\n    \"asm\" to { _, _ ->\n        CommonExtractor(Lang.ASSEMBLY)\n    },\n    \"b\" to { _, _ ->\n        CommonExtractor(Lang.LIMBO)\n    },\n    \"bas\" to { _, _ ->\n        CommonExtractor(Lang.VISUALBASIC)\n    },\n    \"bat\" to { _, _ ->\n        CommonExtractor(Lang.DOSBATCH)\n    },\n    \"bbx\" to { _, _ ->\n        CommonExtractor(Lang.TEX)\n    },\n    \"bdy\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"boot\" to { _, _ ->\n        CommonExtractor(Lang.CLOJURE)\n    },\n    \"c\" to { _, _ ->\n        CExtractor()\n    },\n    \"cake\" to { _, _ ->\n        CSharpExtractor()\n    },\n    \"cbl\" to { _, _ ->\n        CommonExtractor(Lang.COBOL)\n    },\n    \"cbx\" to { _, _ ->\n        CommonExtractor(Lang.TEX)\n    },\n    \"cc\" to { _, _ ->\n        CppExtractor()\n    },\n    \"cgi\" to { buf, _ ->\n        if (Perl5Regex.containsMatchIn(buf)) {\n            PerlExtractor(Lang.PERL)\n        } else null\n    },\n    \"cl\" to { _, _ ->\n        CommonExtractor(Lang.COMMONLISP)\n    },\n    \"cl2\" to { _, _ ->\n        CommonExtractor(Lang.CLOJURE)\n    },\n    \"clj\" to { _, _ ->\n        CommonExtractor(Lang.CLOJURE)\n    },\n    \"cljc\" to { _, _ ->\n        CommonExtractor(Lang.CLOJURE)\n    },\n    \"cljscm\" to { _, _ ->\n        CommonExtractor(Lang.CLOJURE)\n    },\n    \"cljs\" to { _, _ ->\n        CommonExtractor(Lang.CLOJURE)\n    },\n    \"cljx\" to { _, _ ->\n        CommonExtractor(Lang.CLOJURE)\n    },\n    \"cls\" to { buf, _ ->\n        if (TexRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.TEX)\n        } else {\n            CommonExtractor(Lang.VISUALBASIC)\n        }\n    },\n    \"cob\" to { _, _ ->\n        CommonExtractor(Lang.COBOL)\n    },\n    \"coffee\" to { _, _ ->\n        CommonExtractor(Lang.COFFEESCRIPT)\n    },\n    \"cp\" to { _, _ ->\n        CppExtractor()\n    },\n    \"cpp\" to { _, _ ->\n        CppExtractor()\n    },\n    \"cr\" to { _, _ ->\n        CrystalExtractor()\n    },\n    \"cpy\" to { _, _ ->\n        CommonExtractor(Lang.COBOL)\n    },\n    \"cql\" to { _, _ ->\n        CommonExtractor(Lang.SQL)\n    },\n    \"cs\" to { buf, _ ->\n        if (SmalltalkRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.SMALLTALK)\n        } else {\n            CSharpExtractor()\n        }\n    },\n    \"cshtml\" to { _, _ ->\n        CSharpExtractor()\n    },\n    \"css\" to { _, _ ->\n        CssExtractor()\n    },\n    \"csx\" to { _, _ ->\n        CSharpExtractor()\n    },\n    \"cu\" to { _, _ ->\n        CommonExtractor(Lang.CUDA)\n    },\n    \"cuh\" to { _, _ ->\n        CommonExtractor(Lang.CUDA)\n    },\n    \"cxx\" to { _, _ ->\n        CppExtractor()\n    },\n    \"c++\" to { _, _ ->\n        CppExtractor()\n    },\n    \"d\" to { buf, _ ->\n        if (DRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.D)\n        } else if (DtraceRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.DTRACE)\n        } else if (MakefileRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.MAKEFILE)\n        } else null\n    },\n    \"dart\" to { _, _ ->\n        DartExtractor\n    },\n    \"db2\" to { _, _ ->\n        CommonExtractor(Lang.SQLPL)\n    },\n    \"ddl\" to { buf, _ ->\n        if (PlsqlRegexs.any { re -> re.containsMatchIn(buf)}) {\n            CommonExtractor(Lang.PLSQL)  // Oracle\n        } else if (!NotSqlRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.SQL)  // Generic SQL\n        } else null\n    },\n    \"dlm\" to { _, _ ->\n        CommonExtractor(Lang.IDL)\n    },\n    \"dm\" to { _, _ ->\n        DMExtractor()\n    },\n    \"dmm\" to { _, _ ->\n        DMExtractor()\n    },\n    \"dmi\" to { _, _ ->\n        DMExtractor()\n    },\n    \"dpr\" to { _, _ ->\n        CommonExtractor(Lang.PASCAL)\n    },\n    \"edn\" to { _, _ ->\n        CommonExtractor(Lang.CLOJURE)\n    },\n    \"el\" to { _, _ ->\n        CommonExtractor(Lang.EMACSLISP)\n    },\n    \"elc\" to { _, _ ->\n        CommonExtractor(Lang.EMACSLISP)\n    },\n    \"eliom\" to { _, _ ->\n        CommonExtractor(Lang.OCAML)\n    },\n    \"elm\" to { _, _ ->\n        CommonExtractor(Lang.ELM)\n    },\n    \"erl\" to { _, _ ->\n        CommonExtractor(Lang.ERLANG)\n    },\n    \"ex\" to { _, _ ->\n        ElixirExtractor\n    },\n    \"exs\" to { _, _ ->\n        ElixirExtractor\n    },\n    \"f\" to { buf, _ ->\n        if (ForthRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.FORTH)\n        } else if (buf.contains(\"flowop\")) {\n            CommonExtractor(Lang.FILEBENCHWML)\n        } else if (FortranRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.FORTRAN)\n        } else null\n    },\n    \"f03\" to { _, _ ->\n        CommonExtractor(Lang.FORTRAN)\n    },\n    \"f08\" to { _, _ ->\n        CommonExtractor(Lang.FORTRAN)\n    },\n    \"f15\" to { _, _ ->\n        CommonExtractor(Lang.FORTRAN)\n    },\n    \"f90\" to { _, _ ->\n        CommonExtractor(Lang.FORTRAN)\n    },\n    \"f95\" to { _, _ ->\n        CommonExtractor(Lang.FORTRAN)\n    },\n    \"factor\" to { _, _ ->\n        CommonExtractor(Lang.FACTOR)\n    },\n    \"fcgi\" to { buf, _ ->\n        if (Perl5Regex.containsMatchIn(buf)) {\n            PerlExtractor(Lang.PERL)\n        } else {\n            CommonExtractor(Lang.LUA)\n        }\n    },\n    \"fnc\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"for\" to { buf, _ ->\n        if (ForthRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.FORTH)\n        } else if (FortranRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.FORTRAN)\n        } else null\n    },\n    \"forth\" to { _, _ ->\n        CommonExtractor(Lang.FORTH)\n    },\n    \"fp\" to { _, _ ->\n        CommonExtractor(Lang.GLSL)\n    },\n    \"fr\" to { _, _ ->\n        CommonExtractor(Lang.FORTH)\n    },\n    \"frag\" to { _, _ ->\n        CommonExtractor(Lang.GLSL)\n    },\n    \"frg\" to { _, _ ->\n        CommonExtractor(Lang.GLSL)\n    },\n    \"frt\" to { _, _ ->\n        CommonExtractor(Lang.FORTH)\n    },\n    \"fs\" to { buf, _ ->\n        if (ForthFsRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.FORTH)\n        } else if (FSharpRegex.containsMatchIn(buf)) {\n            FSharpExtractor()\n        } else if (GlslRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.GLSL)\n        } else if (FilterscriptRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.FILTERSCRIPT)\n        } else null\n    },\n    \"fsh\" to { _, _ ->\n        CommonExtractor(Lang.GLSL)\n    },\n    \"fsx\" to { _, _ ->\n        FSharpExtractor()\n    },\n    \"fth\" to { _, _ ->\n        CommonExtractor(Lang.FORTH)\n    },\n    \"fxml\" to { _, _ ->\n        CommonExtractor(Lang.XML)\n    },\n    \"glsl\" to { _, _ ->\n        CommonExtractor(Lang.GLSL)\n    },\n    \"go\" to { _, _ ->\n        GoExtractor()\n    },\n    \"gradle\" to { _, _ ->\n        CommonExtractor(Lang.GRADLE)\n    },\n    \"groovy\" to { _, _ ->\n        CommonExtractor(Lang.GROOVY)\n    },\n    \"h\" to { buf, _ ->\n        if (ObjectiveCRegex.containsMatchIn(buf)) {\n            ObjectiveCExtractor()\n        } else if (CppRegex.containsMatchIn(buf)) {\n            CppExtractor()\n        } else CExtractor()\n    },\n    \"h++\" to { _, _ ->\n        CppExtractor()\n    },\n    \"hh\" to { _, _ ->\n        CppExtractor()\n    },\n    \"hic\" to { _, _ ->\n        CommonExtractor(Lang.CLOJURE)\n    },\n    \"hl\" to { _, _ ->\n        CommonExtractor(Lang.CLOJURE)\n    },\n    \"hpp\" to { _, _ ->\n        CppExtractor()\n    },\n    \"htm\" to { _, _ ->\n        CommonExtractor(Lang.HTML)\n    },\n    \"html\" to { _, _ ->\n        CommonExtractor(Lang.HTML)\n    },\n    \"hs\" to { _, _ ->\n        CommonExtractor(Lang.HASKELL)\n    },\n    \"hrl\" to { _, _ ->\n        CommonExtractor(Lang.ERLANG)\n    },\n    \"hx\" to { _, _ ->\n        CommonExtractor(Lang.HAXE)\n    },\n    \"hxx\" to { _, _ ->\n        CppExtractor()\n    },\n    \"hy\" to { _, _ ->\n        CommonExtractor(Lang.HY)\n    },\n    \"ijs\" to { _, _ ->\n        CommonExtractor(Lang.J)\n    },\n    \"inc\" to { buf, _ ->\n        if (PhpRegex.containsMatchIn(buf)) {\n            PhpExtractor()\n        } else if (PovRaySdlRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.POVRAYSDL)\n        } else if (PascalRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.PASCAL)\n        } else {\n            CommonExtractor(Lang.ASSEMBLY)\n        }\n    },\n    \"inl\" to { _, _ ->\n        CppExtractor()\n    },\n    \"ino\" to { _, _ ->\n        CommonExtractor(Lang.ARDUINO)\n    },\n    \"ipynb\" to { _, _ ->\n        IPythonExtractor()\n    },\n    \"java\" to { _, _ ->\n        JavaExtractor()\n    },\n    \"jl\" to { _, _ ->\n        CommonExtractor(Lang.JULIA)\n    },\n    \"js\" to { buf, _ ->\n        if (bootstrapWebpackExp(buf)) {\n            null\n        }\n        else JavascriptExtractor()\n    },\n    \"jsx\" to { _, _ ->\n        JavascriptExtractor()\n    },\n    \"kt\" to { _, _ ->\n        KotlinExtractor()\n    },\n    \"kojo\" to { _, _ ->\n        ScalaExtractor\n    },\n    \"l\" to { buf, _ ->\n        if (CommonLispRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.COMMONLISP)\n        } else if (LexRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.LEX)\n        } else if (RoffRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.ROFF)\n        } else if (PicoLispRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.PICOLISP)\n        } else null\n    },\n    \"lbx\" to { _, _ ->\n        CommonExtractor(Lang.TEX)\n    },\n    \"less\" to { _, _ ->\n        CssExtractor()\n    },\n    \"lhs\" to { _, _ ->\n        CommonExtractor(Lang.HASKELL)\n    },\n    \"lisp\" to { buf, _ ->\n        if (CommonLispRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.COMMONLISP)\n        } else if (NewLispRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.NEWLISP)\n        } else null\n    },\n    \"litcoffee\" to { _, _ ->\n        CommonExtractor(Lang.COFFEESCRIPT)\n    },\n    \"lsp\" to { buf, _ ->\n        if (CommonLispRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.COMMONLISP)\n        } else if (NewLispRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.NEWLISP)\n        } else null\n    },\n    \"lua\" to { _, _ ->\n        CommonExtractor(Lang.LUA)\n    },\n    \"m\" to { buf, _ ->\n        if (ObjectiveCRegex.containsMatchIn(buf)) {\n            ObjectiveCExtractor()\n        } else if (buf.contains(\":- module\")) {\n            CommonExtractor(Lang.MERCURY)\n        } else if (MufRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.MUF)\n        } else if (MRegexs.any { re -> re.containsMatchIn(buf)}) {\n            CommonExtractor(Lang.M)\n        } else if (MathematicaRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.MATHEMATICA)\n        } else if (MatlabRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.MATLAB)\n        } else if (LimboRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.LIMBO)\n        } else {\n            CommonExtractor(Lang.WOLFRAM)\n        }\n    },\n    \"make\" to { _, _ ->\n        CommonExtractor(Lang.MAKEFILE)\n    },\n    \"makefile\" to { _, _ ->\n        CommonExtractor(Lang.MAKEFILE)\n    },\n    \"mat\" to { _, _ ->\n        CommonExtractor(Lang.MATLAB)\n    },\n    \"mjml\" to { _, _ ->\n        CommonExtractor(Lang.XML)\n    },\n    \"ml\" to { buf, _ ->\n        if (OcamlRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.OCAML)\n        } else if (StandardMlRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.STANDARDML)\n        } else null\n    },\n    \"mli\" to { _, _ ->\n        CommonExtractor(Lang.OCAML)\n    },\n    \"mlx\" to { _, _ ->\n        CommonExtractor(Lang.MATLAB)\n    },\n    \"mm\" to { _, _ ->\n        ObjectiveCExtractor()\n    },\n    \"ms\" to { _, _ ->\n        CommonExtractor(Lang.ROFF)\n    },\n    \"mt\" to { _, _ ->\n        CommonExtractor(Lang.MATHEMATICA)\n    },\n    \"muf\" to { _, _ ->\n        CommonExtractor(Lang.MUF)\n    },\n    \"mysql\" to { _, _ ->\n        CommonExtractor(Lang.SQL)\n    },\n    \"n\" to { _, _ ->\n        CommonExtractor(Lang.ROFF)\n    },\n    \"nasm\" to { _, _ ->\n        CommonExtractor(Lang.ASSEMBLY)\n    },\n    \"nb\" to { buf, _ ->\n        if (MathematicaRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.MATHEMATICA)\n        } else CommonExtractor(Lang.WOLFRAM)\n    },\n    \"nl\" to { _, _ ->\n        CommonExtractor(Lang.NEWLISP)\n    },\n    \"nr\" to { _, _ ->\n        CommonExtractor(Lang.ROFF)\n    },\n    \"oxygene\" to { _, _ ->\n        CommonExtractor(Lang.OXYGENE)\n    },\n    \"P\" to { _, _ ->\n        CommonExtractor(Lang.PROLOG)\n    },\n    \"p6\" to { _, _ ->\n        PerlExtractor(Lang.PERL6)\n    },\n    \"p8\" to { _, _ ->\n        CommonExtractor(Lang.LUA)\n    },\n    \"pas\" to { _, _ ->\n        CommonExtractor(Lang.PASCAL)\n    },\n    \"pascal\" to { _, _ ->\n        CommonExtractor(Lang.PASCAL)\n    },\n    \"pck\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"pd_lua\" to { _, _ ->\n        CommonExtractor(Lang.LUA)\n    },\n    \"pde\" to { _, _ ->\n        CommonExtractor(Lang.PROCESSING)\n    },\n    \"php\" to { buf, path ->\n        if (buf.contains(\"<?hh\")) {\n            CommonExtractor(Lang.HACK)\n        } else if (PhpIlluminateRegex.containsMatchIn(path)) {\n            null\n        }\n        else {\n            PhpExtractor()\n        }\n    },\n    \"phtml\" to { _, _ ->\n        PhpExtractor()\n    },\n    \"php3\" to { _, _ ->\n        PhpExtractor()\n    },\n    \"php4\" to { _, _ ->\n        PhpExtractor()\n    },\n    \"php5\" to { _, _ ->\n        PhpExtractor()\n    },\n    \"phps\" to { _, _ ->\n        PhpExtractor()\n    },\n    \"pkb\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"pks\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"pl\" to { buf, _ ->\n        if (PrologRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.PROLOG)\n        } else if (Perl6Regex.containsMatchIn(buf)) {\n            PerlExtractor(Lang.PERL6)\n        } else {\n            PerlExtractor(Lang.PERL)\n        }\n    },\n    \"plb\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"pls\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"plsql\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"pm\" to { buf, _ ->\n        if (Perl5Regex.containsMatchIn(buf)) {\n            PerlExtractor(Lang.PERL)\n        } else if (Perl6Regex.containsMatchIn(buf)) {\n            PerlExtractor(Lang.PERL6)\n        } else if (XpmRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.XPM)\n        } else null\n    },\n    \"pm6\" to { _, _ ->\n        PerlExtractor(Lang.PERL6)\n    },\n    \"pom\" to { _, _ ->\n        CommonExtractor(Lang.MAVENPOM)\n    },\n    \"pov\" to { _, _ ->\n        CommonExtractor(Lang.POVRAYSDL)\n    },\n    \"pp\" to { buf, _ ->\n        if (PascalRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.PASCAL)\n        } else {\n            CommonExtractor(Lang.PUPPET)\n        }\n    },\n    \"prc\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"pro\" to { buf, _ ->\n        if (PrologRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.PROLOG)\n        } else if (buf.contains(\"last_client=\")) {\n            CommonExtractor(Lang.INI)\n        } else if (buf.contains(\"HEADERS\") || buf.contains(\"SOURCES\")) {\n            CommonExtractor(Lang.QMAKE)\n        } else if (IdlRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.IDL)\n        } else null\n    },\n    \"prolog\" to { _, _ ->\n        CommonExtractor(Lang.PROLOG)\n    },\n    \"props\" to { buf, _ ->\n        if (XmlPropsRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.XML)\n        } else if (IniPropsRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.INI)\n        } else null\n    },\n    \"ps1\" to { _, _ ->\n        CommonExtractor(Lang.POWERSHELL)\n    },\n    \"psd1\" to { _, _ ->\n        CommonExtractor(Lang.POWERSHELL)\n    },\n    \"psm1\" to { _, _ ->\n        CommonExtractor(Lang.POWERSHELL)\n    },\n    \"py\" to { _, _ ->\n        PythonExtractor()\n    },\n    \"py3\" to { _, _ ->\n        PythonExtractor()\n    },\n    \"qml\" to { _, _ ->\n        CommonExtractor(Lang.QML)\n    },\n    \"r\" to { buf, _ ->\n        if (RebolRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.REBOL)\n        } else if (RRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.R)\n        } else null\n    },\n    \"r2\" to { _, _ ->\n        CommonExtractor(Lang.REBOL)\n    },\n    \"r3\" to { _, _ ->\n        CommonExtractor(Lang.REBOL)\n    },\n    \"rb\" to { _, _ ->\n        RubyExtractor()\n    },\n    \"rbw\" to { _, _ ->\n        RubyExtractor()\n    },\n    \"rd\" to { _, _ ->\n        CommonExtractor(Lang.R)\n    },\n    \"re\" to { _, _ ->\n        CommonExtractor(Lang.OCAML)\n    },\n    \"reb\" to { _, _ ->\n        CommonExtractor(Lang.REBOL)\n    },\n    \"rebol\" to { _, _ ->\n        CommonExtractor(Lang.REBOL)\n    },\n    \"rno\" to { _, _ ->\n        CommonExtractor(Lang.ROFF)\n    },\n    \"rpy\" to { buf, _ ->\n        if (PythonRegex.containsMatchIn(buf)) {\n            PythonExtractor()\n        } else CommonExtractor(Lang.RENPY)\n    },\n    \"rs\" to { buf, _ ->\n        if (RustRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.RUST)\n        } else if (RenderscriptRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.RENDERSCRIPT)\n        } else null\n    },\n    \"rsh\" to { _, _ ->\n        CommonExtractor(Lang.RENDERSCRIPT)\n    },\n    \"rsx\" to { _, _ ->\n        CommonExtractor(Lang.R)\n    },\n    \"s\" to { _, _ ->\n        CommonExtractor(Lang.ASSEMBLY)\n    },\n    \"sas\" to { _, _ ->\n        CommonExtractor(Lang.SAS)\n    },\n    \"sass\" to { _, _ ->\n        CssExtractor()\n    },\n    \"sbt\" to { _, _ ->\n        ScalaExtractor\n    },\n    \"sc\" to { buf, _ ->\n        if (SupercolliderRegexs.any { re -> re.containsMatchIn(buf) }) {\n            CommonExtractor(Lang.SUPERCOLLIDER)\n        } else if (ScalaRegex.containsMatchIn(buf)) {\n            ScalaExtractor\n        } else null\n    },\n    \"scala\" to { _, _ ->\n        ScalaExtractor\n    },\n    \"scd\" to { _, _ ->\n        CommonExtractor(Lang.SUPERCOLLIDER)\n    },\n    \"sch\" to { _, _ ->\n        CommonExtractor(Lang.SCHEME)\n    },\n    \"scm\" to { _, _ ->\n        CommonExtractor(Lang.SCHEME)\n    },\n    \"scss\" to { _, _ ->\n        CssExtractor()\n    },\n    \"sexp\" to { _, _ ->\n        CommonExtractor(Lang.COMMONLISP)\n    },\n    \"sh\" to { _, _ ->\n        CommonExtractor(Lang.SHELL)\n    },\n    \"shader\" to { _, _ ->\n        CommonExtractor(Lang.GLSL)\n    },\n    \"sld\" to { _, _ ->\n        CommonExtractor(Lang.SCHEME)\n    },\n    \"sls\" to { _, _ ->\n        CommonExtractor(Lang.SCHEME)\n    },\n    \"sol\" to { _, _ ->\n        CommonExtractor(Lang.SOLIDITY)\n    },\n    \"spc\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"sps\" to { _, _ ->\n        CommonExtractor(Lang.SCHEME)\n    },\n    \"sql\" to { buf, _ ->\n        if (PlpgsqlRegexs.any { re -> re.containsMatchIn(buf)}) {\n            PlpgsqlExtractor  // PostgreSQL.\n        } else if (SqlplRegexs.any { re -> re.containsMatchIn(buf)}) {\n            CommonExtractor(Lang.SQLPL)  // IBM DB2.\n        } else if (PlsqlRegexs.any { re -> re.containsMatchIn(buf)}) {\n            CommonExtractor(Lang.PLSQL)  // Oracle.\n        } else {\n            CommonExtractor(Lang.SQL)  // Generic SQL.\n        }\n    },\n    \"ss\" to { _, _ ->\n        CommonExtractor(Lang.SCHEME)\n    },\n    \"st\" to { _, _ ->\n        CommonExtractor(Lang.SMALLTALK)\n    },\n    \"swift\" to { _, _ ->\n        SwiftExtractor\n    },\n    \"t\" to { buf, _ ->\n        if (Perl6Regex.containsMatchIn(buf)) {\n            PerlExtractor(Lang.PERL6)\n        } else {\n            PerlExtractor(Lang.PERL)\n        }\n    },\n    \"tab\" to { _, _ ->\n        CommonExtractor(Lang.SQL)\n    },\n    \"tcl\" to { _, _ ->\n        CommonExtractor(Lang.TCL)\n    },\n    \"tesc\" to { _, _ ->\n        CommonExtractor(Lang.GLSL)\n    },\n    \"tese\" to { _, _ ->\n        CommonExtractor(Lang.GLSL)\n    },\n    \"tex\" to { _, _ ->\n        CommonExtractor(Lang.TEX)\n    },\n    \"tmac\" to { _, _ ->\n        CommonExtractor(Lang.ROFF)\n    },\n    \"toc\" to { _, _ ->\n        CommonExtractor(Lang.TEX)\n    },\n    \"tpb\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"tps\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"trg\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"ts\" to { buf, _ ->\n        if (XmltsRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.XML)\n        } else {\n            TypescriptExtractor()\n        }\n    },\n    \"tsx\" to { buf, _ ->\n        if (TypescriptRegex.containsMatchIn(buf)) {\n            TypescriptExtractor()\n        } else if (XmlRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.XML)\n        } else null\n    },\n    \"udf\" to { _, _ ->\n        CommonExtractor(Lang.SQL)\n    },\n    \"ux\" to { _, _ ->\n        CommonExtractor(Lang.XML)\n    },\n    \"v\" to { buf, _ ->\n        if (CoqRegex.containsMatchIn(buf)) {\n            CommonExtractor(Lang.COQ)\n        } else {\n            CommonExtractor(Lang.VERILOG)\n        }\n    },\n    \"vb\" to { _, _ ->\n        CommonExtractor(Lang.VISUALBASIC)\n    },\n    \"vba\" to { _, _ ->\n        CommonExtractor(Lang.VBA)\n    },\n    \"vhdl\" to { _, _ ->\n        CommonExtractor(Lang.VHDL)\n    },\n    \"vbhtml\" to { _, _ ->\n        CommonExtractor(Lang.VISUALBASIC)\n    },\n    \"vim\" to { _, _ ->\n        CommonExtractor(Lang.VIML)\n    },\n    \"viw\" to { _, _ ->\n        CommonExtractor(Lang.SQL)\n    },\n    \"vrx\" to { _, _ ->\n        CommonExtractor(Lang.GLSL)\n    },\n    \"vsh\" to { _, _ ->\n        CommonExtractor(Lang.GLSL)\n    },\n    \"vue\" to { _, _ ->\n        JavascriptExtractor()\n    },\n    \"svelte\" to { _, _ ->\n        JavascriptExtractor()\n    },\n    \"vw\" to { _, _ ->\n        CommonExtractor(Lang.PLSQL)\n    },\n    \"wl\" to { _, _ ->\n        CommonExtractor(Lang.MATHEMATICA)\n    },\n    \"wlt\" to { _, _ ->\n        CommonExtractor(Lang.MATHEMATICA)\n    },\n    \"xml\" to { _, _ ->\n        CommonExtractor(Lang.XML)\n    },\n    \"xpm\" to { _, _ ->\n        CommonExtractor(Lang.XPM)\n    },\n    \"xtend\" to { _, _ ->\n        CommonExtractor(Lang.XTEND)\n    },\n    \"yap\" to { _, _ ->\n        CommonExtractor(Lang.PROLOG)\n    },\n    // DevOps.\n    \"yaml\" to { buf, _ ->\n        when {\n            k8sExp(buf) -> {\n                DevopsExtractor(DevopsExtractor.K8S)\n            }\n            else -> null\n        }\n    },\n    \"yml\" to { buf, path ->\n        when {\n            path.endsWith(\"docker-compose.yml\") -> {\n                DevopsExtractor(DevopsExtractor.DOCKER)\n            }\n            path.endsWith(\".gitlab-ci.yml\") -> {\n                DevopsExtractor(DevopsExtractor.GITLAB_CI)\n            }\n            path.endsWith(\".travis.yml\") -> {\n                DevopsExtractor(DevopsExtractor.TRAVIS)\n            }\n            path.endsWith(\".circleci/config.yml\") -> {\n                DevopsExtractor(DevopsExtractor.CIRCLECI)\n            }\n            path.endsWith(\".drone.yml\") -> {\n                DevopsExtractor(DevopsExtractor.DRONE)\n            }\n            path.contains(\".github/workflows/\") -> {\n                DevopsExtractor(DevopsExtractor.GITHUB_ACTIONS)\n            }\n            k8sExp(buf) -> {\n                DevopsExtractor(DevopsExtractor.K8S)\n            }\n            else -> null\n        }\n    },\n    \"json\" to { buf, _ ->\n        when {\n            k8sExp(buf) -> {\n                DevopsExtractor(DevopsExtractor.K8S)\n            }\n            else -> null\n        }\n    },\n    \"dockerfile\" to { _, _ ->\n        DevopsExtractor(DevopsExtractor.DOCKER)\n    },\n    \"jenkinsfile\" to { _, _ ->\n        DevopsExtractor(DevopsExtractor.JENKINS)\n    },\n    \"\" to { _, path ->\n        when {\n            path.endsWith(\"dockerfile\") -> {\n                DevopsExtractor(DevopsExtractor.DOCKER)\n            }\n            path.endsWith(\"jenkinsfile\") -> {\n                DevopsExtractor(DevopsExtractor.JENKINS)\n            }\n            else -> null\n        }\n    }\n)\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/IPythonExtractor.kt",
    "content": "// Copyright 2019 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffContent\nimport app.model.DiffFile\nimport app.model.DiffRange\nimport org.json.JSONObject\n\nclass IPythonExtractor : ExtractorInterface{\n    companion object {\n        const val LANGUAGE_NAME = Lang.PYTHON\n        private val pythonExtractor = PythonExtractor()\n    }\n\n    private fun getCodeContent(diffContent: DiffContent): DiffContent {\n        if (diffContent.content.isEmpty()) {\n            return diffContent\n        }\n\n        val code = JSONObject(\n            diffContent.content.joinToString(\"\\n\"))\n        .optJSONArray(\"cells\")?.let {\n            0.until(it.length()).map { i -> it.optJSONObject(i) }\n        }?.filter {\n            it.optString(\"cell_type\") == \"code\"\n        }?.filter {\n            it.optJSONArray(\"source\") != null\n        }?.map { it.optJSONArray(\"source\").map {line -> line.toString()}}\n\n        val content = code?.fold(mutableListOf()) {\n                acc: MutableList<String>, x: List<String> ->\n                acc.addAll(x)\n                acc\n            } ?: listOf<String>()\n\n        return DiffContent(content = content,\n                           ranges = listOf(DiffRange(0, content.size)),\n                           imports = diffContent.imports)\n    }\n\n    override fun extract(files: List<DiffFile>): List<CommitStats> {\n        files.forEach { file ->\n            file.old = getCodeContent(file.old)\n            file.new = getCodeContent(file.new)\n            file.lang = LANGUAGE_NAME\n        }\n        return pythonExtractor.extract(files)\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        return pythonExtractor.extractImports(fileContent)\n    }\n\n    override fun tokenize(line: String): List<String> {\n        return pythonExtractor.tokenize(line)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/JavaExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffFile\n\nclass JavaExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.JAVA\n        val KEYWORDS = listOf(\"abstract\", \"continue\", \"for\", \"new\", \"switch\",\n            \"assert\", \"default\", \"goto\", \"package\", \"synchronized\", \"boolean\",\n            \"do\", \"if\", \"private\", \"this\", \"break\", \"double\", \"implements\",\n            \"protected\", \"throw\", \"byte\", \"else\", \"import\", \"public\", \"throws\",\n            \"case\", \"enum\", \"instanceof\", \"return\", \"transient\", \"catch\",\n            \"extends\", \"int\", \"short\", \"try\", \"char\", \"final\", \"interface\",\n            \"static\", \"void\", \"class\", \"finally\", \"long\", \"strictfp\",\n            \"volatile\", \"const\", \"float\", \"native\", \"super\", \"while\")\n        val importRegex = Regex(\"\"\"^(.*import)\\s[^\\n]*\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\")\n        val packageRegex = Regex(\"\"\"^(.*package)\\s[^\\n]*\"\"\")\n        val extractImportRegex = Regex(\"\"\"import\\s+(\\w+[.\\w+]*)\"\"\")\n    }\n\n    override fun extract(files: List<DiffFile>): List<CommitStats> {\n        val stats = super.extract(files).toMutableList()\n\n        // Keywords stats.\n        val added = files.fold(mutableListOf<String>(), { total, file ->\n            total.addAll(file.getAllAdded())\n            total\n        })\n        val deleted = files.fold(mutableListOf<String>(), { total, file ->\n            total.addAll(file.getAllDeleted())\n            total\n        })\n\n        KEYWORDS.forEach { keyword ->\n            val totalAdded = added.count { line -> line.contains(keyword)}\n            val totalDeleted = deleted.count { line -> line.contains(keyword)}\n            if (totalAdded > 0 || totalDeleted > 0) {\n                stats.add(CommitStats(\n                    numLinesAdded = totalAdded,\n                    numLinesDeleted = totalDeleted,\n                    type = ExtractorInterface.TYPE_KEYWORD,\n                    tech = LANGUAGE_NAME + ExtractorInterface.SEPARATOR +\n                        keyword\n                ))\n            }\n        }\n\n        return stats\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = extractImportRegex.find(it)\n            if (res != null) {\n                val importedName = res.groupValues[1]\n                imports.add(importedName)\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        newLine = packageRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        return super.mapImportToIndex(import, lang, startsWith = true)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/JavascriptExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffFile\n\nclass JavascriptExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.JAVASCRIPT\n        val splitRegex = Regex(\"\"\"\\s+|,|;|:|\\*|\\n|\\(|\\)|\\[|]|\\{|}|\\+|=|\\.|>|<|#|@|\\$\"\"\")\n        val multilineCommentRegex = Regex(\"\"\"/\\*.+?\\*/\"\"\")\n        val twoOrMoreWordsRegex = Regex(\"\"\"(\".+?\\s.+?\"|'.+?\\s.+?')\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val line = fileContent.map { line -> commentRegex.replace(line, \"\") }\n                       .joinToString(separator = \" \").toLowerCase()\n        val fileTokens = multilineCommentRegex.replace(\n            twoOrMoreWordsRegex.replace(line, \"\"), \"\").split(splitRegex)\n        return fileTokens.distinct()\n    }\n\n    override fun extractLibStats(files: List<DiffFile>): List<CommitStats> {\n        val vueExtension = \".vue\"\n        val svelteExtension = \".svelte\"\n        val quasarConf = \"quasar.conf.js\"\n\n        val vueFiles = files.filter { it.path.endsWith(vueExtension) }\n        val svelteFiles = files.filter { it.path.endsWith(svelteExtension) }\n        val quasarFile = files.find { it.path.endsWith(quasarConf) }\n        val otherFiles = files.filter {\n            !it.path.endsWith(vueExtension) &&\n            !it.path.endsWith(svelteExtension) &&\n            !it.path.endsWith(quasarConf)\n        }\n\n        // Add stats from *.vue files.\n        val vueStats = listOf(CommitStats(\n            numLinesAdded = vueFiles.map { it.getAllAdded().size }.sum(),\n            numLinesDeleted = vueFiles.map { it.getAllDeleted().size }.sum(),\n            type = ExtractorInterface.TYPE_LIBRARY,\n            tech = \"js.vue\"\n        )).filter { it.numLinesAdded > 0 || it.numLinesDeleted > 0 }\n\n        // Add stats from *.svelte files.\n        val svelteStats = listOf(CommitStats(\n            numLinesAdded = svelteFiles.map { it.getAllAdded().size }.sum(),\n            numLinesDeleted = svelteFiles.map { it.getAllDeleted().size }.sum(),\n            type = ExtractorInterface.TYPE_LIBRARY,\n            tech = \"js.svelte\"\n        )).filter { it.numLinesAdded > 0 || it.numLinesDeleted > 0 }\n\n        var stats = vueStats + svelteStats + super.extractLibStats(otherFiles)\n        if (quasarFile == null) {\n            return stats;\n        }\n\n        val quasarStats = listOf(CommitStats(\n            numLinesAdded = quasarFile.getAllAdded().size,\n            numLinesDeleted = quasarFile.getAllDeleted().size,\n            type = ExtractorInterface.TYPE_LIBRARY,\n            tech = \"js.quasar\"\n        )).filter { it.numLinesAdded > 0 || it.numLinesDeleted > 0 }\n\n        return quasarStats + stats;\n    }\n\n    override fun tokenize(line: String): List<String> {\n        return super.tokenize(commentRegex.replace(line, \"\"))\n    }\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        return super.mapImportToIndex(import, lang, startsWith = true)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/KotlinExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nclass KotlinExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.KOTLIN\n        val importRegex = Regex(\"\"\"^(.*import)\\s[^\\n]*\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\")\n        val packageRegex = Regex(\"\"\"^(.*package)\\s[^\\n]*\"\"\")\n        val extractImportRegex = Regex(\"\"\"import\\s+(\\w+[.\\w+]*)\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = extractImportRegex.find(it)\n            if (res != null) {\n                val importedName = res.groupValues[1]\n                imports.add(importedName)\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        newLine = packageRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        return super.mapImportToIndex(import, lang, startsWith = true)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/Languages.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage app.extractors\n\nobject Lang {\n    const val ACTIONSCRIPT = \"actionscript\"  // ActionScript\n    const val ANGELSCRIPT = \"angelscript\"  // AngelScript\n    const val ASSEMBLY = \"assembly\"  // Assembly\n    const val ARDUINO = \"arduino\"  // Arduino\n    const val C = \"c\"  // C\n    const val COQ = \"coq\"  // Coq\n    const val CPP = \"cpp\"  // C++\n    const val CRYSTAL = \"crystal\"  // Crystal\n    const val CSHARP = \"csharp\"  // C#\n    const val CSS = \"css\"  // CSS\n    const val CLOJURE = \"clojure\"  // Clojure\n    const val COBOL = \"cobol\"  // COBOL\n    const val COFFEESCRIPT = \"coffeescript\"  // CoffeeScript\n    const val COMMONLISP = \"lisp\"  // Common Lisp\n    const val CUDA = \"cuda\"  // Cuda\n    const val D = \"d\"  // D\n    const val DART = \"dart\"  // Dart\n    const val DM = \"dm\"  // DM Language\n    const val DOSBATCH = \"dosbatch\"  // DOS Batch\n    const val DTRACE = \"dtrace\"  // DTrace\n    const val ELIXIR = \"elixir\"  // Elixir\n    const val ELM = \"elm\"  // Elm\n    const val EMACSLISP = \"emacslisp\"  // Emacs Lisp\n    const val ERLANG = \"erlang\"  // Erlang\n    const val FACTOR = \"factor\"  // Factor\n    const val FILEBENCHWML = \"filebench_wml\"  // Filebench WML\n    const val FILTERSCRIPT = \"filterscript\"  // Filterscript\n    const val FORTH = \"forth\"  // Forth\n    const val FORTRAN = \"fortran\"  // Fortran\n    const val FSHARP = \"fsharp\"  // F#\n    const val GLSL = \"glsl\"  // GLSL\n    const val GO = \"go\"  // Go\n    const val GRADLE = \"gradle\"  // Gradle\n    const val GROOVY = \"groovy\"  // Groovy\n    const val HACK = \"hack\"  // Hack\n    const val HASKELL = \"haskell\"  // Haskell\n    const val HAXE = \"haxe\"  // Haxe\n    const val HTML = \"html\"  // HTML\n    const val HY = \"hy\"  // Hy\n    const val IDL = \"idl\"  // IDL\n    const val INI = \"ini\"  // INI\n    const val J = \"j\"  // J\n    const val JAVA = \"java\"  // Java\n    const val JAVASCRIPT = \"javascript\"  // JavaScript\n    const val JULIA = \"julia\"  // Julia\n    const val KOTLIN = \"kotlin\"  // Kotlin\n    const val LIMBO = \"limbo\"  // Limbo\n    const val LEX = \"lex\"  // Lex\n    const val LUA = \"lua\"  // Lua\n    const val M = \"m\"  // M\n    const val MAKEFILE = \"makefile\"  // Makefile\n    const val MATHEMATICA = \"mathematica\"  // Mathematica\n    const val MATLAB = \"matlab\"  // Matlab\n    const val MAVENPOM = \"maven\"  // Maven POM\n    const val MUF = \"muf\"  // MUF\n    const val MERCURY = \"mercury\"  // Mercury\n    const val NEWLISP = \"newlisp\"  // NewLisp\n    const val OBJECTIVEC = \"objectivec\"  // Objective-C\n    const val OCAML = \"ocaml\"  // OCaml\n    const val OXYGENE = \"oxygene\"  // Oxygene\n    const val PASCAL = \"pascal\"  // Pascal\n    const val PERL = \"perl\"  // Perl\n    const val PERL6 = \"perl6\"  // Perl 6\n    const val PHP = \"php\"  // PHP\n    const val PICOLISP = \"picolisp\"  // PicoLisp\n    const val PLPGSQL = \"plpgsql\"  // PLpgSQL\n    const val PLSQL = \"plsql\"  // PLSQL\n    const val POVRAYSDL = \"pov-ray_sdl\"  // POV-Ray SDL\n    const val POWERSHELL = \"powershell\"  // PowerShell\n    const val PUPPET = \"puppet\"  // Puppet\n    const val PROCESSING = \"processing\"  // Processing\n    const val PROLOG = \"prolog\"  // Prolog\n    const val PYTHON = \"python\"  // Python\n    const val QMAKE = \"qmake\"  // QMake\n    const val QML = \"qml\"  // QML\n    const val R = \"r\"  // R\n    const val REBOL = \"rebol\"  // Rebol\n    const val RENDERSCRIPT = \"renderscript\"  // RenderScript\n    const val RENPY = \"renpy\"  // Ren'Py\n    const val ROFF = \"roff\"  // Roff\n    const val RUBY = \"ruby\"  // Ruby\n    const val RUST = \"rust\"  // Rust\n    const val SAS = \"sas\"  // SAS\n    const val SCALA = \"scala\"  // Scala\n    const val SCHEME = \"scheme\"  // Scheme\n    const val SHELL = \"shell\"  // Shell\n    const val SMALLTALK = \"smalltalk\"  // Smalltalk\n    const val SOLIDITY = \"solidity\"  // Solidity\n    const val SQL = \"sql\"  // SQL\n    const val SQLPL = \"sqlpl\"  // SQLPL\n    const val STANDARDML = \"standard_ml\"  // Standard ML\n    const val SUPERCOLLIDER = \"supercollider\"  // SuperCollider\n    const val SWIFT = \"swift\"  // Swift\n    const val TCL = \"tcl\"  // Tcl\n    const val TEX = \"tex\"  // TeX\n    const val TYPESCRIPT = \"typescript\"  // TypeScript\n    const val VERILOG = \"verilog\"  // Verilog\n    const val VISUALBASIC = \"visualbasic\"  // Visual Basic\n    const val VBA = \"visualbasicforapps\"  // Visual Basic for Applications\n    const val VHDL = \"vhdl\"  // VHDL\n    const val VIML = \"viml\"  // Vim L\n    const val VUE = \"vue\"  // Vue\n    const val SVELTE = \"svelte\" // Svelte\n    const val WOLFRAM = \"wolframlanguage\"  // Wolfram Language\n    const val XML = \"xml\"  // XML\n    const val XPM = \"xpm\"  // XPM\n    const val XTEND = \"xtend\"  // Xtend\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/ObjectiveCExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nclass ObjectiveCExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.OBJECTIVEC\n        val importRegex = Regex(\"\"\"^([^\\n]*[#@](import|include))\\s[^\\n]*\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\")\n        val sharpImportIncludeRegex =\n                Regex(\"\"\"[#@](import|include)\\s+[\"<](\\w+)[/\\w+]*\\.\\w+[\">]\"\"\")\n        val atImportRegex = Regex(\"\"\"@import\\s+(\\w+)\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = sharpImportIncludeRegex.findAll(it) +\n                atImportRegex.findAll(it)\n            if (res.toList().isNotEmpty()) {\n                val lineLib = res.toList().map { it.groupValues }.last().last()\n                imports.add(lineLib)\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/PerlExtractor.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage app.extractors\n\nclass PerlExtractor(private val language: String) : ExtractorBase(\n    language,\n    importRegex = Regex(\"\"\"^use (.+);\"\"\"),\n    commentRegex = Regex(\"\"\"([^\\n]*#.*$)\"\"\"),\n    importStartsWith = true) {\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        // Perl and Perl6 share libraries\n        return super.mapImportToIndex(import, Lang.PERL, startsWith)\n    }\n}"
  },
  {
    "path": "src/main/kotlin/app/extractors/PhpExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nclass PhpExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.PHP\n        val importRegex = Regex(\"\"\"^(.*require|require_once|include|\"\"\" +\n            \"\"\"include_once|use)\\s[^\\n]*\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\")\n        val useRegex = Regex(\"\"\"use\\s+(\\w+)[\\\\\\w+]*\"\"\")\n        val requireIncludeRegex = Regex(\"\"\"(require|require_once|include|\"\"\" +\n                \"\"\"\"include_once)\\s*[(]?'(\\w+)[.\\w+]*'[)]?\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = useRegex.findAll(it) + requireIncludeRegex.findAll(it)\n            if (res.toList().isNotEmpty()) {\n                val lineLib = res.toList().map { it.groupValues }.last().last()\n                imports.add(lineLib)\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/PlpgsqlExtractor.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage app.extractors\n\nobject PlpgsqlExtractor : ExtractorBase(\n    language = Lang.PLPGSQL,\n    importRegex = Regex(\"\"\".+CREATE (?:EXTENSION|LANGUAGE) ([a-zA-Z_][a-zA-Z0-9_]*)\"\"\"),\n    commentRegex = Regex(\"\"\"(--.*$)|(/[*].*?[*]/)\"\"\"))\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/PythonExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffFile\n\nclass PythonExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.PYTHON\n        const val COMPREHENSION_MAP = \"map\"\n        const val COMPREHENSION_LIST = \"list\"\n        val docImportRegex = Regex(\"\"\"^([^\\n]*#|\\s*\\\"\\\"\\\"|\\s*import|\"\"\" +\n            \"\"\"\\s*from)[^\\n]*\"\"\")\n        val commentRegex = Regex(\"\"\"^(.*#).*\"\"\")\n        val extractImportRegex = Regex(\"\"\"(from\\s+(\\w+)[.\\w+]*\\s+import|\"\"\" +\n            \"\"\"import\\s+(\\w+(,\\s*\\w+)*))(as\\s+)*\"\"\")\n        val mapRegex = Regex(\"\"\"(map\\([^,]+?,)\"\"\")\n        val listRegex = Regex(\"\"\"\\[.+? for .+? in .+?]\"\"\")\n        val lineEndRegex = Regex(\"\"\",\\s*\"\"\")\n    }\n\n    override fun extract(files: List<DiffFile>): List<CommitStats> {\n        val stats = super.extract(files).toMutableList()\n\n        // List comprehension fun fact.\n        val allAdded = files.map{ file -> file.getAllAdded() }.flatten()\n        val allDeleted = files.map{ file -> file.getAllDeleted() }.flatten()\n\n        val mapAllAdded = allAdded.fold(0) { total, line ->\n            total + mapRegex.findAll(line).toList().size }\n        val mapAllDeleted = allDeleted.fold(0) { total, line ->\n            total + mapRegex.findAll(line).toList().size }\n\n        val listAllAdded = allAdded.fold(0) { total, line ->\n            total + listRegex.findAll(line).toList().size }\n        val listAllDeleted = allDeleted.fold(0) { total, line ->\n            total + listRegex.findAll(line).toList().size }\n\n        if (mapAllAdded > 0 || mapAllDeleted > 0) {\n            stats.add(CommitStats(\n                mapAllAdded, mapAllDeleted, ExtractorInterface.TYPE_SYNTAX,\n                tech = LANGUAGE_NAME + ExtractorInterface.SEPARATOR +\n                    COMPREHENSION_MAP\n            ))\n        }\n\n        if (listAllAdded > 0 || listAllDeleted > 0) {\n            stats.add(CommitStats(\n                listAllAdded, listAllDeleted, ExtractorInterface.TYPE_SYNTAX,\n                tech = LANGUAGE_NAME + ExtractorInterface.SEPARATOR +\n                    COMPREHENSION_LIST\n            ))\n        }\n\n        return stats\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = extractImportRegex.find(it)\n            if (res != null) {\n                val lineLibs = res.groupValues.last {\n                    it != \"\" && !it.startsWith(',')\n                }.split(lineEndRegex)\n                imports.addAll(lineLibs)\n            }\n        }\n\n        val filteredImports = imports.filter { import ->\n            !import.endsWith(\"_pb\") && !import.endsWith(\"_pb2\")\n        }.toMutableList()\n        if (filteredImports.size < imports.size) {\n            filteredImports.add(\"pb\")\n        }\n        return filteredImports\n\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = docImportRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/RubyExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nclass RubyExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.RUBY\n        val importRegex = Regex(\"\"\"(require\\s+'(\\w+)'|load\\s+'(\\w+)\\.\\w+')\"\"\")\n        val commentRegex = Regex(\"\"\"^([^\\n]*#)[^\\n]*\"\"\")\n        val extractImportRegex =\n            Regex(\"\"\"(require\\s+'(.+)'|load\\s+'(\\w+)\\.\\w+')\"\"\")\n        val includeRegex = Regex(\"\"\"include\\s+(\\w+)::.+\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = extractImportRegex.find(it)\n            if (res != null) {\n                val lineLib = res.groupValues.last { it != \"\" }\n                imports.add(lineLib)\n            }\n        }\n\n        // Try to parse `include ` when imports are in external file.\n        if (imports.isEmpty()) {\n            fileContent.forEach {\n                val res = includeRegex.find(it)\n                if (res != null) {\n                    imports.add(res.groupValues.last().toLowerCase())\n                }\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n    \n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        return super.mapImportToIndex(import, lang, startsWith = true)\n    }\n\n    override fun determineLibs(line: String,\n                               importedLibs: List<String>): List<String> {\n        // TODO(lyaronskaya): Case with no imports.\n        val libraries = importedLibs + \"rb.rails\"\n\n        return super.determineLibs(line, libraries)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/RustExtractor.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage app.extractors\n\nclass RustExtractor : ExtractorInterface {\n    companion object {\n        const val LANGUAGE_NAME = Lang.RUST\n        val importRegex = Regex(\"\"\"^extern crate \\w+;$\"\"\")\n        val commentRegex = Regex(\"(//.+$)|(/[*].*?[*]/)\")\n        val extractImportRegex = Regex(\"\"\"^extern crate (\\w+);$\"\"\")\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        val imports = mutableSetOf<String>()\n\n        fileContent.forEach {\n            val res = extractImportRegex.find(it)\n            if (res != null) {\n                val lineLib = res.groupValues[1]\n                imports.add(lineLib)\n            }\n        }\n\n        return imports.toList()\n    }\n\n    override fun tokenize(line: String): List<String> {\n        var newLine = importRegex.replace(line, \"\")\n        newLine = commentRegex.replace(newLine, \"\")\n        return super.tokenize(newLine)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/ScalaExtractor.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage app.extractors\n\nobject ScalaExtractor : ExtractorBase(\n    language = Lang.SCALA,\n    importRegex = Regex(\"\"\"^import (?:_root_\\.)?((?:\\.?[a-z]+)+\\.)\"\"\"),\n    commentRegex = Regex(\"(//.+$)|(/[*].*?[*]/)\"),\n    importStartsWith = true)\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/SwiftExtractor.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.extractors\n\nobject SwiftExtractor : ExtractorBase(\n    language = Lang.SWIFT,\n    importRegex = Regex(\"\"\"import\\s+(\\w+)\"\"\"),\n    commentRegex = Regex(\"\"\"^([^\\n]*//)[^\\n]*\"\"\"))\n"
  },
  {
    "path": "src/main/kotlin/app/extractors/TypescriptExtractor.kt",
    "content": "// Copyright 2019 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.extractors\n\nimport app.model.CommitStats\nimport app.model.DiffFile\n\nclass TypescriptExtractor : ExtractorInterface{\n    companion object {\n        const val LANGUAGE_NAME = Lang.TYPESCRIPT\n        private val javascriptExtractor = JavascriptExtractor()\n    }\n\n    override fun extract(files: List<DiffFile>): List<CommitStats> {\n        files.forEach { file ->\n            file.lang = Lang.JAVASCRIPT\n        }\n        val libStats = javascriptExtractor.extractLibStats(files)\n\n        files.forEach { file ->\n            file.lang = LANGUAGE_NAME\n        }\n        return super.extractLangStats(files) + libStats\n    }\n\n    override fun extractImports(fileContent: List<String>): List<String> {\n        return javascriptExtractor.extractImports(fileContent)\n    }\n\n    override fun tokenize(line: String): List<String> {\n        return javascriptExtractor.tokenize(line)\n    }\n\n    override fun mapImportToIndex(import: String, lang: String,\n                                  startsWith: Boolean): String? {\n        return super.mapImportToIndex(import, Lang.JAVASCRIPT, startsWith = true)\n    }\n\n    override fun getLanguageName(): String? {\n        return LANGUAGE_NAME\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/hashers/AuthorDistanceHasher.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.hashers\n\nimport app.api.Api\nimport app.model.AuthorDistance\nimport app.model.Repo\nimport io.reactivex.Observable\nimport java.util.concurrent.TimeUnit\n\nclass AuthorDistanceHasher(\n        private val serverRepo: Repo,\n        private val api: Api,\n        private val emails: HashSet<String>,\n        private val userEmails: HashSet<String>) {\n    fun updateFromObservable(observable: Observable<JgitData>,\n                             onError: (Throwable) -> Unit) {\n        val authorScores = hashMapOf<String, Double>()\n        emails.forEach { authorScores[it] = 0.0 }\n\n        // Store the time of the earliest commit for a path by user.\n        val authorPathLastContribution = hashMapOf<String, Long>()\n\n        observable.subscribe({\n            val email =  it.email!!\n            val paths = it.paths!!\n            val time = it.date!!\n            if (email in userEmails) {\n                paths.forEach { path ->\n                    authorPathLastContribution[path] = time\n                }\n            }\n            else {\n                val score = paths\n                     .filter { path -> path in authorPathLastContribution }\n                     .filter { path ->\n                        val authorTime = authorPathLastContribution[path]!!\n                        val timeDelta = TimeUnit.DAYS.convert(\n                                authorTime - time, TimeUnit.SECONDS)\n                         timeDelta < 365\n                     }.size\n                authorScores[email] = authorScores[email]!! + score\n            }\n        }, onError, {\n            val stats = mutableListOf<AuthorDistance>()\n            authorScores.forEach { email, value ->\n                if (email !in userEmails) {\n                    stats.add(AuthorDistance(serverRepo, email, value))\n                }\n            }\n            postDistancesToServer(stats)\n        })\n    }\n\n    private fun postDistancesToServer(stats: List<AuthorDistance>) {\n        if (stats.isNotEmpty()) {\n            api.postAuthorDistances(stats).onErrorThrow()\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/hashers/CodeLongevity.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.hashers\n\nimport app.FactCodes\nimport app.Logger\nimport app.api.Api\nimport app.model.Author\nimport app.model.Repo\nimport app.model.Fact\nimport app.utils.FileHelper\nimport io.reactivex.Observable\nimport org.eclipse.jgit.diff.DiffEntry\nimport org.eclipse.jgit.diff.RawText\nimport org.eclipse.jgit.api.Git\nimport org.eclipse.jgit.lib.AnyObjectId\nimport org.eclipse.jgit.lib.Repository\nimport org.eclipse.jgit.revwalk.RevCommit\nimport org.eclipse.jgit.revwalk.RevWalk\nimport org.eclipse.jgit.treewalk.TreeWalk\n\nimport java.io.FileInputStream\nimport java.io.FileNotFoundException\nimport java.io.FileOutputStream\nimport java.io.ObjectOutputStream\nimport java.io.ObjectInputStream\nimport java.io.Serializable\nimport java.lang.Exception\nimport java.text.SimpleDateFormat\nimport java.util.Date\n\n/**\n * Represents a code line in a file revision.\n */\nclass RevCommitLine(val commit: RevCommit, val fileId: AnyObjectId,\n                    val file: String, val line: Int,\n                    val isDeleted: Boolean) {\n\n    val id : String\n        get() = \"${fileId.name}:$line\"\n}\n\n/**\n * Represents a code line in repo's history.\n *\n * TODO(Alex): the text arg is solely for testing proposes (remove it)\n */\nclass CodeLine(val repo: Repository,\n               val from: RevCommitLine, val to: RevCommitLine) {\n\n    // TODO(alex): oldId and newId may be computed as a hash built from commit,\n    // file name and line number, if we are going to send the data outside a\n    // local machine.\n\n    /**\n     * Id of the code line in a revision when the line was added. Used to\n     * identify a line and update its lifetime computed at the previous\n     * iteration.\n     */\n    val oldId : String\n        get() = from.id\n\n    /**\n     * Id of the code line in a revision, where the line was deleted, or a head\n     * revision, if the line is alive.\n     */\n    val newId : String\n        get() = to.id\n\n    /**\n     * The code line's age in seconds.\n     */\n    var age : Long = 0\n        get() {\n            if (field == 0L) {\n                field = (to.commit.commitTime - from.commit.commitTime).toLong()\n            }\n            return field\n        }\n\n    /**\n     * The code line text.\n     */\n    val text : String\n        get() = RawText(repo.open(from.fileId).bytes).getString(from.line)\n\n    /**\n     * Email address of the line's author.\n     */\n    val authorEmail : String\n        get() = from.commit.authorIdent.emailAddress\n\n    /**\n     * Email address of the line's changer.\n     */\n    val editorEmail : String?\n      get() = if (isDeleted) to.commit.authorIdent.emailAddress else null\n\n    /**\n     * A date when the line was changed.\n     */\n    val editDate : Date\n        get() = Date(to.commit.commitTime.toLong() * 1000)\n\n    /**\n     * True if the line is deleted.\n     */\n    val isDeleted : Boolean\n        get() = to.isDeleted\n\n    /**\n     * A pretty print of a code line; debugging.\n     */\n    override fun toString() : String {\n        val df = SimpleDateFormat(\"yyyy-MM-dd HH:mm z\")\n        val fd = df.format(Date(from.commit.commitTime.toLong() * 1000))\n        val td = df.format(Date(to.commit.commitTime.toLong() * 1000))\n        val fc = \"${from.commit.name} '${from.commit.shortMessage}'\"\n        val tc = \"${to.commit.name} '${to.commit.shortMessage}'\"\n        val revState = if (isDeleted) \"deleted in\" else \"last known as\"\n        val state = if (isDeleted) \"deleted\" else \"alive\"\n        return \"Line '$text' - '${from.file}:${from.line}' added in $fc $fd\\n\" +\n            \"  $revState '${to.file}:${to.line}' in $tc $td,\\n\" +\n            \"  age: $age s - $state\"\n    }\n}\n\n/**\n * Detects colleagues and their 'work vicinity' from commits.\n */\nclass Colleagues(private val serverRepo: Repo) {\n    // A map of <colleague_email1, colleague_email2> pairs to pairs of\n    // <month, time>, which indicates to a minimum time in ms between all line\n    // changes for these two colleagues in a given month (yyyy-mm).\n    private val map: HashMap<Pair<String, String>,\n                             HashMap<String, Long>> = hashMapOf()\n\n    fun collect(line: CodeLine) {\n        // TODO(alex): ignore same user emails\n        val authorEmail = line.authorEmail\n        val editorEmail = line.editorEmail\n        if (editorEmail == null || authorEmail == editorEmail) {\n            return\n        }\n        val emails = Pair(authorEmail, editorEmail)\n\n        val dates = map.getOrPut(emails, { hashMapOf() })\n        val month = SimpleDateFormat(\"yyyy-MM\").format(line.editDate)\n\n        Logger.trace { \"collected colleague, age: ${line.age}\" }\n        val vicinity = dates.getOrPut(month, { line.age })\n        if (vicinity > line.age) {\n            dates[month] = line.age\n        }\n    }\n\n    fun calculateAndSendFacts(api: Api) {\n        // Expose colleagues iff colleague1 edited colleague2 code and\n        // colleague2 edited colleauge1 code.\n        val auxHash = hashSetOf<Pair<String, String>>()\n        for ((pair, dates) in map) {\n            val email1 = pair.first\n            val email2 = pair.second\n            if (auxHash.contains(Pair(email2, email1))) {\n                continue\n            }\n\n            val min1 = dates.minBy { (_, vicinity) -> vicinity }!!\n            val dates2 = map[Pair(email2, email1)]\n            if (dates2 != null) {\n                auxHash.add(Pair(email1, email2))\n\n                val min2 = dates2.minBy { (_, vicinity) -> vicinity }!!\n                val min: Long =\n                    if (min1.value < min2.value) { min1.value }\n                    else { min2.value }\n\n                val stats = mutableListOf<Fact>()\n                stats.add(Fact(serverRepo,\n                               FactCodes.COLLEAGUES,\n                               value = email1,\n                               value2 = email2,\n                               value3 = min.toString()))\n\n                api.postFacts(stats).onErrorThrow()\n            }\n        }\n    }\n\n    /**\n     * Return colleagues in a form of <email, month, time> for the given\n     * email, where time indicates a minimal time in ms between all line edits\n     * by these colleagues in a given month (yyyy-mm).\n     */\n    fun get(email: String) : List<Triple<String, String, Long>> {\n        return map\n        .filter { (pair, _) -> pair.first == email || pair.second == email }\n        .flatMap { (pair, dates) ->\n            val colleagueEmail =\n                if (email == pair.first) pair.second else pair.first\n\n            val list = mutableListOf<Triple<String, String, Long>>()\n            dates.forEach { month, vicinity ->\n                list.add(Triple(colleagueEmail, month, vicinity))\n            }\n            return list\n        }\n    }\n}\n\n/**\n * A data class used to store line age information.\n */\nclass CodeLineAges : Serializable, Cloneable {\n    /**\n     * A pair of (line age sum, line count) representing an aggregated line\n     * ages.\n     */\n    data class AggrAge(var sum: Long = 0L, var count: Int = 0) : Serializable\n\n    /**\n     * A code line info: an (age, email) pair.\n     */\n    data class LineInfo(var age: Long, var email: String) : Serializable\n\n    /**\n     * Aggregated code line ages for user emails, collected from all deleted\n     * lines.\n     */\n    var aggrAges: HashMap<String, AggrAge> = hashMapOf()\n\n    /**\n     * A map of existing code lines ids to their ages at the revision.\n     */\n    var lastingLines: HashMap<String, LineInfo> = hashMapOf()\n\n    public override fun clone(): CodeLineAges {\n        val clone = CodeLineAges()\n        aggrAges.forEach { (email, age) ->\n            clone.aggrAges[email] = age.copy() }\n        lastingLines.forEach { (email, line) ->\n            clone.lastingLines[email] = line.copy() }\n        return clone\n    }\n}\n\n/**\n * Used to compute age of code lines in the repo.\n */\nclass CodeLongevity(\n    private val serverRepo: Repo,\n    private val emails: HashSet<String>,\n    private val git: Git) {\n\n    val repo: Repository = git.repository\n    val revWalk = RevWalk(repo)\n    val head: RevCommit =\n        try { revWalk.parseCommit(CommitCrawler.getDefaultBranchHead(git)) }\n        catch(e: Exception) { throw Exception(\"No branch\") }\n\n    val dataPath = FileHelper.getPath(serverRepo.rehash, \"longevity\")\n    val colleagues = Colleagues(serverRepo)\n\n    /**\n     * Updates code line age statistics on the server.\n     */\n    private fun calculateAndSendFacts(ages: CodeLineAges, api: Api) {\n        var repoTotal = 0\n        var repoSum: Long = 0\n        val aggrAges : HashMap<String, CodeLineAges.AggrAge> = hashMapOf()\n\n        ages.aggrAges.forEach { (email, aggrAge) ->\n            repoSum += aggrAge.sum\n            repoTotal += aggrAge.count\n            if (emails.contains(email)) {\n                aggrAges[email] = aggrAge\n            }\n        }\n\n        ages.lastingLines.forEach { (_, info) ->\n            val aggrAge =\n                aggrAges.getOrPut(info.email, { CodeLineAges.AggrAge() })\n            aggrAge.sum += info.age\n            aggrAge.count += 1\n\n            repoSum += info.age\n            repoTotal += 1\n        }\n\n        val secondsInDay = 86400\n        val repoAvg = if (repoTotal > 0) { repoSum / repoTotal } else 0\n        val stats = mutableListOf<Fact>()\n        stats.add(Fact(repo = serverRepo,\n                       code = FactCodes.LINE_LONGEVITY_REPO,\n                       value = repoAvg.toString()))\n        val repoAvgDays = repoAvg / secondsInDay\n        Logger.info { \"Repo average code line age is $repoAvgDays days, \" +\n            \"lines total: $repoTotal\" }\n\n        for (email in emails) {\n            val aggrAge = aggrAges[email] ?: CodeLineAges.AggrAge()\n            val avg = if (aggrAge.count > 0) { aggrAge.sum / aggrAge.count }\n                      else 0\n            stats.add(Fact(repo = serverRepo,\n                           code = FactCodes.LINE_LONGEVITY,\n                           value = avg.toString(),\n                           author = Author(email = email)))\n        }\n\n        if (stats.size > 0) {\n            api.postFacts(stats).onErrorThrow()\n            Logger.info { \"Sent ${stats.size} facts to server\" }\n        }\n\n        colleagues.calculateAndSendFacts(api)\n    }\n\n    /**\n     * Scans the repo to extract code line ages.\n     */\n    fun updateFromObservable(diffObservable: Observable<JgitData> =\n                                CommitCrawler.getJGitObservable(git),\n                             onError: (Throwable) -> Unit = {},\n                             api: Api,\n                             onDataComplete: (CodeLineAges) -> Unit = {}) {\n        var storedHead: RevCommit? = null\n        var ageData = CodeLineAges()\n\n        // Load existing age data if any. Expected format: commit id and\n        // CodeLineAges structure following it.\n        try {\n            val file = dataPath.toFile()\n            val iStream = ObjectInputStream(FileInputStream(file))\n            val storedHeadId = iStream.readUTF()\n            Logger.debug { \"Stored repo head: $storedHeadId\" }\n            storedHead = revWalk.parseCommit(repo.resolve(storedHeadId))\n            if (storedHead == head) {\n                return  // TODO(anatoly): Send saved stats in such case.\n            }\n            ageData = (iStream.readObject() ?: CodeLineAges()) as CodeLineAges\n        }\n        catch(e: FileNotFoundException) { }\n        catch(e: Exception) { Logger.error(e, \"Failed to read longevity \" +\n            \"data. CAUTION: data will be recomputed.\") }\n\n        // Update ages.\n        getLinesObservable(storedHead, diffObservable, onError).subscribe({\n            line ->\n            Logger.trace { \"Scanning: $line\" }\n            if (line.isDeleted) {\n                if (ageData.lastingLines.contains(line.oldId)) {\n                    line.age += ageData.lastingLines.remove(line.oldId)!!.age\n                }\n                val aggrAge = ageData.aggrAges.getOrPut(line.authorEmail,\n                        { CodeLineAges.AggrAge() } )\n                aggrAge.sum += line.age\n                aggrAge.count += 1\n\n                colleagues.collect(line)\n            } else {\n                var age = line.age\n                if (ageData.lastingLines.contains(line.oldId)) {\n                    age += ageData.lastingLines.remove(line.oldId)!!.age\n                }\n                ageData.lastingLines[line.newId] = CodeLineAges.LineInfo(age,\n                        line.authorEmail)\n            }\n        }, onError, {\n            // Store ages for subsequent runs.\n            try {\n                val file = dataPath.toFile()\n                val oStream = ObjectOutputStream(FileOutputStream(file))\n                oStream.writeUTF(head.name)\n                oStream.writeObject(ageData)\n            }\n            catch(e: Exception) {\n                Logger.error(e, \"Failed to save longevity data. \" +\n                    \"CAUTION: data will be recomputed on a next run.\")\n            }\n            onDataComplete(ageData)\n            calculateAndSendFacts(ageData, api)\n        })\n    }\n\n    /**\n     * Clears the stored age data if any.\n     */\n    fun dropSavedData() {\n        dataPath.toFile().delete()\n    }\n\n    /**\n     * Returns a list of code lines, both alive and deleted, between\n     * the revisions of the repo.\n     */\n    fun getLinesList(tail : RevCommit? = null,\n                     diffObservable: Observable<JgitData> =\n                        CommitCrawler.getJGitObservable(git),\n                     onError: (Throwable) -> Unit = {}) : List<CodeLine> {\n        val codeLines: MutableList<CodeLine> = mutableListOf()\n        getLinesObservable(tail, diffObservable, onError).blockingSubscribe {\n            line -> codeLines.add(line)\n        }\n        return codeLines\n    }\n\n    /**\n     * Returns an observable for for code lines, both alive and deleted, between\n     * the revisions of the repo.\n     */\n    fun getLinesObservable(tail : RevCommit? = null,\n                           diffObservable: Observable<JgitData>,\n                           onError: (Throwable) -> Unit)\n        : Observable<CodeLine> =\n        Observable.create { subscriber ->\n\n        val headWalk = TreeWalk(repo)\n            headWalk.isRecursive = true\n        headWalk.addTree(head.tree)\n\n        val files: MutableMap<String, ArrayList<RevCommitLine>> = mutableMapOf()\n\n        // Build a map of file names and their code lines.\n        while (headWalk.next()) {\n            try {\n                val path = headWalk.pathString\n                val fileId = headWalk.getObjectId(0)\n                val fileLoader = repo.open(fileId)\n                if (!RawText.isBinary(fileLoader.openStream())) {\n                    val fileText = RawText(fileLoader.bytes)\n                    val lines = ArrayList<RevCommitLine>(fileText.size())\n                    for (idx in 0 until fileText.size()) {\n                        lines.add(RevCommitLine(head, fileId, path, idx, false))\n                    }\n                    files[path] = lines\n                }\n            } catch (e: Exception) {\n                // TODO(anatoly): better fix of exceptions.\n            }\n        }\n\n        diffObservable\n        .takeWhile { (commit, _) -> commit != tail }\n        .subscribe( { (commit, diffs) ->\n            // A step back in commits history. Update the files map according\n            // to the diff. Traverse the diffs backwards to handle double\n            // renames properly.\n            // TODO(alex): cover file renames by tests (see APP-132 issue).\n            for ((diff, editList) in diffs!!.asReversed()) {\n                val oldPath = diff.oldPath\n                val oldId = diff.oldId.toObjectId()\n                val newPath = diff.newPath\n                val newId = diff.newId.toObjectId()\n                Logger.trace { \"old: '$oldPath', new: '$newPath'\" }\n\n                // File was deleted, initialize the line array in the files map.\n                if (diff.changeType == DiffEntry.ChangeType.DELETE) {\n                    val fileLoader = repo.open(oldId)\n                    val fileText = RawText(fileLoader.bytes)\n                    files[oldPath] = ArrayList(fileText.size())\n                }\n\n                // If a file was deleted, then the new path is /dev/null.\n                val path = if (newPath != DiffEntry.DEV_NULL) {\n                    newPath\n                } else {\n                    oldPath\n                }\n                val lines = files[path]!!\n\n\n                // Update the lines array according to diff insertions.\n                // Traverse the edit list backwards to keep indices of\n                // the edit list and the lines array in sync.\n                for (edit in editList.asReversed()) {\n                    // Insertion case: track the lines.\n                    val insCount = edit.lengthB\n                    if (insCount > 0) {\n                        val insStart = edit.beginB\n                        val insEnd = edit.endB\n                        Logger.trace { \"ins ($insStart, $insEnd)\" }\n\n                        for (idx in insStart until insEnd) {\n                            val from = RevCommitLine(commit!!, newId,\n                                                     newPath, idx, false)\n                            try {\n                                val to = lines[idx]\n                                val cl = CodeLine(repo, from, to)\n                                Logger.trace { \"Collected: $cl\" }\n                                subscriber.onNext(cl)\n                            }\n                            catch(e: IndexOutOfBoundsException) {\n                                Logger.error(e, \"No line at $idx; commit: \" +\n                                    \"${commit.name}; \" +\n                                    \"'${commit.shortMessage}'\")\n                                throw e\n                            }\n                        }\n                        lines.subList(insStart, insEnd).clear()\n                    }\n                }\n\n                // Update the lines array according to diff deletions.\n                for (edit in editList) {\n                    // Deletion case. Chase down the deleted lines through the\n                    // history.\n                    val delCount = edit.lengthA\n                    if (delCount > 0) {\n                        val delStart = edit.beginA\n                        val delEnd = edit.endA\n                        Logger.trace { \"del ($delStart, $delEnd)\" }\n\n                        val tmpLines = ArrayList<RevCommitLine>(delCount)\n                        for (idx in delStart until delEnd) {\n                            tmpLines.add(RevCommitLine(commit!!, oldId,\n                                                       oldPath, idx, true))\n                        }\n                        lines.addAll(delStart, tmpLines)\n                    }\n                }\n\n                // File was renamed, tweak the files map.\n                if (diff.changeType == DiffEntry.ChangeType.RENAME) {\n                    files[oldPath] = files.remove(newPath)!!\n                }\n            }\n        }, onError, {\n            // If a tail revision was given then the map has to contain\n            // unclaimed code lines, i.e. the lines added before the tail\n            // revision. Push them all into the result lines list, so the\n            // caller can update their ages properly.\n            if (tail != null) {\n                val tailWalk = TreeWalk(repo)\n                tailWalk.isRecursive = true\n                tailWalk.addTree(tail.tree)\n\n                while (tailWalk.next()) {\n                    val filePath = tailWalk.pathString\n                    val lines = files[filePath]\n                    if (lines != null) {\n                        val fileId = tailWalk.getObjectId(0)\n                        for (idx in 0 until lines.size) {\n                            val from = RevCommitLine(tail, fileId,\n                                filePath, idx, false)\n                            val cl = CodeLine(repo, from, lines[idx])\n                            Logger.trace { \"Collected (tail): $cl\" }\n                            subscriber.onNext(cl)\n                        }\n                    }\n                }\n            }\n            subscriber.onComplete()\n        })\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/hashers/CommitCrawler.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.hashers\n\nimport app.Logger\nimport app.model.Author\nimport app.model.Commit\nimport app.model.DiffContent\nimport app.model.DiffFile\nimport app.model.DiffRange\nimport app.model.Repo\nimport app.utils.EmptyRepoException\nimport io.reactivex.Observable\nimport java.io.BufferedReader\nimport java.io.InputStreamReader\nimport org.apache.commons.codec.digest.DigestUtils\nimport org.eclipse.jgit.api.Git\nimport org.eclipse.jgit.diff.DiffEntry\nimport org.eclipse.jgit.diff.DiffFormatter\nimport org.eclipse.jgit.diff.EditList\nimport org.eclipse.jgit.diff.RawText\nimport org.eclipse.jgit.lib.ObjectId\nimport org.eclipse.jgit.lib.Repository\nimport org.eclipse.jgit.revwalk.RevCommit\nimport org.eclipse.jgit.revwalk.RevWalk\nimport org.eclipse.jgit.treewalk.filter.PathFilter\nimport org.eclipse.jgit.treewalk.TreeWalk\nimport org.eclipse.jgit.util.io.DisabledOutputStream\nimport java.util.LinkedList\n\ndata class JgitData(var commit: RevCommit? = null,\n                    var list: List<JgitDiff>? = null,\n                    var paths: List<String>? = null,\n                    var date: Long? = null,\n                    var email: String? = null,\n                    var coauthors: List<Author>? = null)\n\ndata class JgitDiff(val diffEntry: DiffEntry, val editList: EditList)\n\n/**\n* Iterates over the diffs between commits in the repo's history.\n*/\nobject CommitCrawler {\n    private const val REMOTE_HEAD = \"refs/remotes/origin/HEAD\"\n    private const val REMOTE_MASTER_BRANCH = \"refs/remotes/origin/master\"\n    private const val LOCAL_MASTER_BRANCH = \"refs/heads/master\"\n    private const val LOCAL_HEAD = \"HEAD\"\n    private val REFS = listOf(REMOTE_HEAD, REMOTE_MASTER_BRANCH,\n                              LOCAL_MASTER_BRANCH, LOCAL_HEAD)\n    private val CONF_FILE_PATH = \".sourcerer-conf\"\n    private val MAX_DIFF_SIZE = 600000\n    private val coauthoredRegex = Regex(\"\"\"Co-authored-by: (.+) <(.+)>\"\"\")\n\n    fun getDefaultBranchHead(git: Git): ObjectId {\n        for (ref in REFS) {\n            val branch = git.repository.resolve(ref) ?: continue\n\n            Logger.debug { \"Hashing from $ref\" }\n            return branch\n        }\n        throw EmptyRepoException(\"No remote default, master or HEAD found\")\n    }\n\n    fun fetchRehashesAndAuthors(git: Git):\n        Triple<LinkedList<String>, HashSet<Author>, HashMap<String, Int>> {\n        val head: RevCommit = RevWalk(git.repository)\n            .parseCommit(getDefaultBranchHead(git))\n\n        val revWalk = RevWalk(git.repository)\n        revWalk.markStart(head)\n\n        val commitsRehashes = LinkedList<String>()\n        val emails = hashSetOf<String>()\n        val names = hashMapOf<String, String>()\n        val commitsCount = hashMapOf<String, Int>()\n        val coauthorsList = mutableListOf<Author>()\n\n        var commit: RevCommit? = revWalk.next()\n        while (commit != null) {\n            commitsRehashes.add(DigestUtils.sha256Hex(commit.name))\n            val email = commit.authorIdent.emailAddress.toLowerCase()\n            val name = commit.authorIdent.name\n            if (!emails.contains(email)) {\n                emails.add(email)\n                names[email] = name\n            } else {\n                if (name.length > names[email]!!.length) {\n                    names[email] = name\n                }\n            }\n            val coauthors = getCoauthors(commit.fullMessage)\n            coauthorsList.addAll(coauthors)\n\n            commitsCount[email] = commitsCount.getOrDefault(email, 0) + 1\n\n            commit.disposeBody()\n            commit = revWalk.next()\n        }\n        revWalk.dispose()\n\n        val authors = emails.map { email -> Author(names[email]!!, email) }\n            .toHashSet()\n        authors.addAll(coauthorsList)\n\n        return Triple(commitsRehashes, authors, commitsCount)\n    }\n\n    fun getJGitObservable(git: Git,\n                          totalCommitCount: Int = 0,\n                          extractCommit: Boolean = true,\n                          extractDiffs: Boolean = true,\n                          extractPaths: Boolean = false,\n                          extractDate: Boolean = false,\n                          extractEmail: Boolean = false,\n                          extractCoauthors: Boolean = false,\n                          filteredEmails: HashSet<String>? = null,\n                          tail : RevCommit? = null) :\n        Observable<JgitData> = Observable.create { subscriber ->\n        val repo: Repository = git.repository\n        val revWalk = RevWalk(repo)\n        val head: RevCommit =\n            try { revWalk.parseCommit(getDefaultBranchHead(git)) }\n            catch(e: Exception) { throw Exception(\"No head was found!\") }\n\n        val df = DiffFormatter(DisabledOutputStream.INSTANCE)\n        df.setRepository(repo)\n        df.isDetectRenames = true\n\n        val confTreeWalk = TreeWalk(repo)\n        confTreeWalk.addTree(head.getTree())\n        confTreeWalk.setFilter(PathFilter.create(CONF_FILE_PATH))\n\n        var ignoredPaths =\n            if (confTreeWalk.next()) {\n                getIgnoredPaths(repo, confTreeWalk.getObjectId(0))\n            }\n            else {\n                listOf()\n            }\n\n        var commitCount = 0\n        revWalk.markStart(head)\n        var commit: RevCommit? = revWalk.next()  // Move the walker to the head.\n        while (commit != null && commit != tail) {\n            commitCount++\n            val parentCommit: RevCommit? = revWalk.next()\n\n            // Smart casts are not yet supported for a mutable variable captured\n            // in an inline lambda, see\n            // https://youtrack.jetbrains.com/issue/KT-7186.\n            if (Logger.isTrace) {\n                val commitName = commit.name\n                val commitMsg = commit.shortMessage\n                Logger.trace { \"commit: $commitName; '$commitMsg'\" }\n                if (parentCommit != null) {\n                    val parentCommitName = parentCommit.name\n                    val parentCommitMsg = parentCommit.shortMessage\n                    Logger.trace { \"parent commit: $parentCommitName; \" +\n                        \"'$parentCommitMsg'\" }\n                }\n                else {\n                    Logger.trace { \"parent commit: null\" }\n                }\n            }\n\n            val perc = if (totalCommitCount != 0) {\n                (commitCount.toDouble() / totalCommitCount) * 100\n            } else 0.0\n            Logger.printCommit(commit.shortMessage, commit.name, perc)\n\n            val email = commit.authorIdent.emailAddress.toLowerCase()\n            if (filteredEmails != null && !filteredEmails.contains(email)) {\n                commit = parentCommit\n                continue\n            }\n            val paths = mutableListOf<String>()\n\n            val diffEntries = df.scan(parentCommit, commit)\n            .filter { diff ->\n                diff.changeType != DiffEntry.ChangeType.COPY\n            }\n            .filter { diff ->\n                val path = diff.newPath\n                for (cnv in VendorConventions) {\n                    if (cnv.containsMatchIn(path) ||\n                        cnv.containsMatchIn(diff.oldPath)) {\n                        return@filter false\n                    }\n                }\n\n                val fileId =\n                    if (path != DiffEntry.DEV_NULL) {\n                        diff.newId.toObjectId()\n                    } else {\n                        diff.oldId.toObjectId()\n                    }\n                val stream = try {\n                    repo.open(fileId).openStream()\n                } catch (e: Exception) {\n                    null\n                }\n                stream != null && !RawText.isBinary(stream)\n            }\n            .filter { diff ->\n                val filePath =\n                    if (diff.getNewPath() != DiffEntry.DEV_NULL) {\n                        diff.getNewPath()\n                    } else {\n                        diff.getOldPath()\n                    }\n\n                // Update ignored paths list. The config file has retroactive\n                // force, i.e. if it was added at this commit, then we presume\n                // it is applied to all commits, preceding this commit.\n                if (diff.getOldPath() == CONF_FILE_PATH) {\n                    ignoredPaths =\n                        getIgnoredPaths(repo, diff.getNewId().toObjectId())\n                }\n\n                if (!ignoredPaths.any { path ->\n                    if (path.endsWith(\"/\")) {\n                        filePath.startsWith(path)\n                    }\n                    else {\n                        path == filePath\n                    }\n                }) {\n                    paths.add(filePath)\n                    true\n                } else false\n            }\n\n            val jgitData = JgitData()\n            if (extractCommit) {\n                jgitData.commit = commit\n            }\n            if (extractDiffs) {\n                val diffEdits = diffEntries\n                .map { diff ->\n                    JgitDiff(diff, df.toFileHeader(diff).toEditList())\n                }\n                .filter { diff ->\n                    diff.editList.fold(0) { acc, edit ->\n                        acc + edit.lengthA + edit.lengthB\n                    } < MAX_DIFF_SIZE\n                }\n                jgitData.list = diffEdits\n            }\n            if (extractPaths) {\n                jgitData.paths = paths\n            }\n            if (extractDate) {\n                jgitData.date = commit.authorIdent.getWhen().time / 1000\n            }\n            if (extractEmail) {\n                jgitData.email = email\n            }\n            if (extractCoauthors) {\n                jgitData.coauthors = getCoauthors(commit.fullMessage)\n            }\n\n            subscriber.onNext(jgitData)\n            commit = parentCommit\n        }\n\n        subscriber.onComplete()\n    }\n\n    fun getObservable(git: Git,\n                      repo: Repo): Observable<Commit> {\n        return getObservable(git, getJGitObservable(git), repo)\n    }\n\n    fun getObservable(git: Git,\n                      jgitObservable: Observable<JgitData>,\n                      repo: Repo): Observable<Commit> {\n        return jgitObservable.map( { jgitData ->\n            // Mapping and stats extraction.\n            val commit = Commit(jgitData.commit!!, jgitData.coauthors)\n            commit.diffs = getDiffFiles(git.repository, jgitData.list!!)\n\n            // Count lines on all non-binary files. This is additional\n            // statistics to CommitStats because not all file extensions\n            // may be supported.\n            commit.numLinesAdded = commit.diffs.fold(0) { total, file ->\n                total + file.getAllAdded().size\n            }\n            commit.numLinesDeleted = commit.diffs.fold(0) { total, file ->\n                total + file.getAllDeleted().size\n            }\n            commit.repo = repo\n\n            commit\n        })\n    }\n\n    private fun getDiffFiles(jgitRepo: Repository,\n                             jgitDiffs: List<JgitDiff>) : List<DiffFile> {\n        return jgitDiffs\n            .map { (diff, edits) ->\n                // TODO(anatoly): Can produce exception for large object.\n                // Investigate for size.\n                val new = try {\n                    getContentByObjectId(jgitRepo, diff.newId.toObjectId())\n                } catch (e: Exception) {\n                    Logger.error(e)\n                    null\n                }\n                val old = try {\n                    getContentByObjectId(jgitRepo, diff.oldId.toObjectId())\n                } catch (e: Exception) {\n                    Logger.error(e)\n                    null\n                }\n\n                val diffFiles = mutableListOf<DiffFile>()\n                if (new != null && old != null) {\n                    val path = when (diff.changeType) {\n                        DiffEntry.ChangeType.DELETE -> diff.oldPath\n                        else -> diff.newPath\n                    }\n                    diffFiles.add(DiffFile(path = path,\n                        changeType = diff.changeType,\n                        old = DiffContent(old, edits.map { edit ->\n                            DiffRange(edit.beginA, edit.endA)\n                        }),\n                        new = DiffContent(new, edits.map { edit ->\n                            DiffRange(edit.beginB, edit.endB)\n                        })\n                    ))\n                }\n                diffFiles\n            }\n            .flatten()\n    }\n\n    private fun getContentByObjectId(repo: Repository,\n                                     objectId: ObjectId): List<String> {\n        return try {\n            val obj = repo.open(objectId)\n            val rawText = RawText(obj.bytes)\n            val content = ArrayList<String>(rawText.size())\n            for (i in 0..(rawText.size() - 1)) {\n                content.add(rawText.getString(i))\n            }\n            return content\n        } catch (e: Exception) {\n            listOf()\n        }\n    }\n\n    /**\n     * Return a list of paths that should be ignored in commit analysis.\n     */\n    private fun getIgnoredPaths(repo: Repository, objectId: ObjectId?): List<String> {\n        return try {\n            if (objectId == null) {\n                return listOf()\n            }\n\n            val list = mutableListOf<String>()\n            val fileLoader = repo.open(objectId)\n            val reader =\n                BufferedReader(InputStreamReader(fileLoader.openStream()))\n            var collectIgnored = false\n            for (line in reader.lines()) {\n                if (line == \"\" || line.startsWith(\"#\")) {\n                    continue\n                }\n\n                if (line.startsWith(\"[\")) {\n                    collectIgnored = (line == \"[ignore]\")\n                    continue\n                }\n\n                if (collectIgnored) {\n                    list.add(line)\n                }\n            }\n            list\n        }\n        catch(e: Exception) {\n            listOf()\n        }\n    }\n\n    private fun getCoauthors(message: String): List<Author> {\n        val coauthorsResult = coauthoredRegex.findAll(message)\n        val coauthors = mutableListOf<Author>()\n        if (coauthorsResult.toList().isNotEmpty()) {\n            coauthorsResult.toList().map { result ->\n                val coauthorName = result.groupValues[1]\n                val coauthorEmail = result.groupValues[2].toLowerCase()\n                coauthors.add(Author(coauthorName, coauthorEmail))\n            }\n        }\n        return coauthors\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/hashers/CommitHasher.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.hashers\n\nimport app.Logger\nimport app.api.Api\nimport app.extractors.Extractor\nimport app.model.Commit\nimport app.model.Repo\nimport io.reactivex.Observable\nimport java.util.concurrent.TimeUnit\n\n/**\n * CommitHasher hashes repository and uploads stats to server.\n */\nclass CommitHasher(private val serverRepo: Repo = Repo(),\n                   private val api: Api,\n                   private val rehashes: List<String>,\n                   private val emails: HashSet<String>) {\n\n    init {\n        // Delete locally missing commits from server. If found at least one\n        // common commit then preceding commits are not deleted because hash of\n        // a commit calculated including hashes of its parents.\n        val firstOverlapCommitRehash = findFirstOverlappingCommitRehash()\n        val deletedCommits = serverRepo.commits\n            .takeWhile { it.rehash != firstOverlapCommitRehash }\n        deleteCommitsOnServer(deletedCommits)\n    }\n\n    // Hash added and missing server commits and send them to server.\n    fun updateFromObservable(observable: Observable<Commit>,\n                             onError: (Throwable) -> Unit) {\n        val knownCommits = serverRepo.commits.toHashSet()\n\n        observable\n            // Don't hash known to server commits.\n            .filter { commit -> !knownCommits.contains(commit) }\n            // Hash only commits made by authors with specified emails.\n            .filter { commit -> emails.contains(commit.author.email) }\n            .map { commit ->\n                Logger.printCommitDetail(\"Extracting stats\")\n\n                // Mapping and stats extraction.\n                commit.stats = Extractor().extract(commit.diffs)\n                val statsNumStr = if (commit.stats.isNotEmpty()) {\n                    commit.stats.size.toString()\n                } else \"No\"\n\n                Logger.printCommitDetail(\"$statsNumStr technology stats found\")\n                Logger.debug { commit.stats.toString() }\n\n                commit\n            }\n            // Group ready commits by time and count. Max payload 10 mb,\n            // one commit with stats takes around 1 kb, so pack by max 1000\n            // with 10x margin of safety.\n            .buffer(20, TimeUnit.SECONDS, 1000)\n            .subscribe({ commitsBundle ->  // OnNext.\n                val coauthorsCommits = commitsBundle\n                    .filter { it.coauthors.isNotEmpty() }\n                    .fold(mutableListOf<Commit>()) { acc, commit ->\n                        acc.addAll(commit.coauthors.map { coauthor ->\n                            val newCommit = commit.copy()\n                            newCommit.author = coauthor\n                            newCommit\n                        })\n                        acc\n                    }\n                commitsBundle.addAll(coauthorsCommits)\n                postCommitsToServer(commitsBundle)  // Send ready commits.\n            }, onError)\n    }\n\n    private fun findFirstOverlappingCommitRehash(): String? {\n        val serverHistoryRehashes = serverRepo.commits\n                                              .map { commit -> commit.rehash }\n                                              .toHashSet()\n        return rehashes.firstOrNull { rehash ->\n            serverHistoryRehashes.contains(rehash)\n        }\n    }\n\n    private fun postCommitsToServer(commits: List<Commit>) {\n        if (commits.isNotEmpty()) {\n            api.postCommits(commits).onErrorThrow()\n            Logger.info { \"Sent ${commits.size} added commits to server\" }\n        }\n    }\n\n    private fun deleteCommitsOnServer(commits: List<Commit>) {\n        if (commits.isNotEmpty()) {\n            api.deleteCommits(commits).onErrorThrow()\n            Logger.info { \"Sent ${commits.size} deleted commits to server\" }\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/hashers/FactHasher.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.hashers\n\nimport app.FactCodes\nimport app.Logger\nimport app.api.Api\nimport app.extractors.Extractor\nimport app.model.Author\nimport app.model.Commit\nimport app.model.Fact\nimport app.model.Repo\nimport io.reactivex.Observable\nimport java.time.LocalDateTime\nimport java.time.ZoneOffset\n\n/**\n * CommitHasher hashes repository and uploads stats to server.\n */\nclass FactHasher(private val serverRepo: Repo = Repo(),\n                 private val api: Api,\n                 private val rehashes: List<String>,\n                 private val emails: HashSet<String>) {\n    private val fsDayWeek = hashMapOf<String, Array<Int>>()\n    private val fsDayTime = hashMapOf<String, Array<Int>>()\n    private val fsRepoDateStart = hashMapOf<String, Long>()\n    private val fsRepoDateEnd = hashMapOf<String, Long>()\n    private val fsCommitLineNumAvg = hashMapOf<String, Double>()\n    private val fsCommitNum = hashMapOf<String, Int>()\n    private val fsLineLenAvg = hashMapOf<String, Double>()\n    private val fsLineNum = hashMapOf<String, Long>()\n    private val fsLinesPerCommits = hashMapOf<String, Array<Int>>()\n    private val fsVariableNaming = hashMapOf<String, Array<Int>>()\n    private val fsIndentation = hashMapOf<String, Array<Int>>()\n\n    private val varNamingRegex = Regex(\"[a-z][A-Z]\")\n\n    init {\n        for (author in emails) {\n            fsDayWeek[author] = Array(7) { 0 }\n            fsDayTime[author] = Array(24) { 0 }\n            fsRepoDateStart[author] = -1\n            fsRepoDateEnd[author] = -1\n            fsCommitLineNumAvg[author] = 0.0\n            fsCommitNum[author] = 0\n            fsLineLenAvg[author] = 0.0\n            fsLineNum.put(author, 0)\n            // TODO(anatoly): Do the bin computations on the go.\n            fsLinesPerCommits[author] = Array(rehashes.size) {0}\n            fsVariableNaming.put(author, Array(3) { 0 })\n            fsIndentation.put(author, Array(2) { 0 })\n        }\n    }\n\n    fun updateFromObservable(observable: Observable<Commit>,\n                             onError: (Throwable) -> Unit) {\n        observable\n            .filter { commit -> emails.contains(commit.author.email) }\n            .subscribe(onNext, onError, {  // OnComplete.\n                try {\n                    postFactsToServer(createFacts())\n                } catch (e: Throwable) {\n                    onError(e)\n                }\n            })\n    }\n\n    private val onNext: (Commit) -> Unit =  { commit ->\n        // Calculate facts.\n        val email = commit.author.email\n        val timestamp = commit.dateTimestamp\n        val dateTime = LocalDateTime.ofEpochSecond(timestamp, 0,\n            ZoneOffset.ofTotalSeconds(commit.dateTimeZoneOffset * 60))\n\n        // DayWeek.\n        val factDayWeek = fsDayWeek[email] ?: Array(7) { 0 }\n        // The value is numbered from 1 (Monday) to 7 (Sunday).\n        factDayWeek[dateTime.dayOfWeek.value - 1] += 1\n        fsDayWeek[email] = factDayWeek\n\n        // DayTime.\n        val factDayTime = fsDayTime[email] ?: Array(24) { 0 }\n        // Hour from 0 to 23.\n        factDayTime[dateTime.hour] += 1\n        fsDayTime[email] = factDayTime\n\n        // RepoDateStart.\n        fsRepoDateStart[email] = timestamp\n\n        // RepoDateEnd.\n        if (fsRepoDateEnd[email]!! == -1L) {\n            fsRepoDateEnd[email] = timestamp\n        }\n\n        // Commits.\n        val numCommits = fsCommitNum[email]!! + 1\n        val numLinesCurrent = commit.numLinesAdded + commit.numLinesDeleted\n\n        fsCommitNum[email] = numCommits\n        fsCommitLineNumAvg[email] = calcIncAvg(fsCommitLineNumAvg[email]!!,\n            numLinesCurrent.toDouble(), numCommits.toLong())\n\n        val lines = commit.getAllAdded() + commit.getAllDeleted()\n        lines.forEachIndexed { index, line ->\n            fsLineLenAvg[email] = calcIncAvg(fsLineLenAvg[email]!!,\n                line.length.toDouble(), fsLineNum[email]!! + index + 1)\n        }\n        fsLineNum[email] = fsLineNum[email]!! + lines.size\n\n        fsLinesPerCommits[email]!![numCommits - 1] += lines.size\n\n        // Variable naming.\n        lines.forEach { line ->\n            val tokens = Extractor().tokenize(line)\n            val underscores = tokens.count { it.contains('_') }\n            val camelCases = tokens.count {\n                !it.contains('_') && it.contains(varNamingRegex)\n            }\n            val others = tokens.size - underscores - camelCases\n            fsVariableNaming[email]!![FactCodes.VARIABLE_NAMING_SNAKE_CASE] +=\n                underscores\n            fsVariableNaming[email]!![FactCodes.VARIABLE_NAMING_CAMEL_CASE] +=\n                camelCases\n            fsVariableNaming[email]!![FactCodes.VARIABLE_NAMING_OTHER] +=\n                others\n        }\n\n        // Indentation.\n        fsIndentation[email]!![FactCodes.INDENTATION_SPACES] +=\n            lines.count { it.isNotBlank() && it.startsWith(\" \") &&\n                !it.contains(\"\\t\")}\n        fsIndentation[email]!![FactCodes.INDENTATION_TABS] +=\n            lines.count { it.startsWith(\"\\t\") }\n    }\n\n    private fun createFacts(): List<Fact> {\n        val fs = mutableListOf<Fact>()\n        emails.forEach { email ->\n            val author = Author(email = email)\n            fsDayTime[email]?.forEachIndexed { hour, count -> if (count > 0) {\n                fs.add(Fact(serverRepo, FactCodes.COMMIT_DAY_TIME, hour,\n                            count.toString(), author))\n            }}\n            fsDayWeek[email]?.forEachIndexed { day, count -> if (count > 0) {\n                fs.add(Fact(serverRepo, FactCodes.COMMIT_DAY_WEEK, day,\n                            count.toString(), author))\n            }}\n            fsVariableNaming[email]?.forEachIndexed { naming, count ->\n                if (count > 0) {\n                    fs.add(Fact(serverRepo, FactCodes.VARIABLE_NAMING, naming,\n                            count.toString(), author))\n                }\n            }\n            fsIndentation[email]?.forEachIndexed { indentation, count ->\n                if (count > 0) {\n                    fs.add(Fact(serverRepo, FactCodes.INDENTATION, indentation,\n                            count.toString(), author))\n                }\n            }\n\n            fs.add(Fact(serverRepo, FactCodes.REPO_DATE_START, 0,\n                        fsRepoDateStart[email].toString(), author))\n            fs.add(Fact(serverRepo, FactCodes.REPO_DATE_END, 0,\n                        fsRepoDateEnd[email].toString(), author))\n            fs.add(Fact(serverRepo, FactCodes.COMMIT_NUM, 0,\n                        fsCommitNum[email].toString(), author))\n            fs.add(Fact(serverRepo, FactCodes.COMMIT_LINE_NUM_AVG, 0,\n                        fsCommitLineNumAvg[email].toString(), author))\n            fs.add(Fact(serverRepo, FactCodes.LINE_NUM, 0,\n                        fsLineNum[email].toString(), author))\n            fs.add(Fact(serverRepo, FactCodes.LINE_LEN_AVG, 0,\n                        fsLineLenAvg[email].toString(), author))\n            val linesPerCommits = fsLinesPerCommits[email]!!\n                .sliceArray(IntRange(0, fsCommitNum[email]!! - 1))\n            addCommitsPerLinesFacts(fs, linesPerCommits, author)\n        }\n        return fs\n    }\n\n    private fun postFactsToServer(facts: List<Fact>) {\n        if (facts.isNotEmpty()) {\n            api.postFacts(facts).onErrorThrow()\n            Logger.info { \"Sent ${facts.size} facts to server\" }\n        }\n    }\n\n    /**\n     * Computes the average of a numerical sequence.\n     * Calculated numbers is never bigger than maximum element of sequence.\n     * No overflow due to summing of elements.\n     * @param prev previous value of average\n     * @param element new element of sequence\n     * @param count number of element in sequence\n     * @return new value of average with considering of new element\n     */\n    private fun calcIncAvg(prev: Double, element: Double,\n                           count: Long): Double {\n        return prev * (1 - 1.0 / count) + element / count\n    }\n\n    private fun addCommitsPerLinesFacts(fs: MutableList<Fact>,\n                                        linesPerCommits: Array<Int>,\n                                        author: Author) {\n        if (linesPerCommits.isEmpty()) return\n\n        var max = linesPerCommits[0]\n        var min = linesPerCommits[0]\n        for (lines in linesPerCommits) {\n            if (lines > max) {\n                max = lines\n            }\n            if (lines < min) {\n                min = lines\n            }\n        }\n\n        val numBins = Math.min(10, max - min + 1)\n        val binSize = (max - min + 1) / numBins.toDouble()\n        val bins = Array(numBins) { 0 }\n        for (numLines in linesPerCommits) {\n            if (numLines == 0) {\n                continue\n            }\n\n            val binId = Math.floor((numLines - min) / binSize).toInt()\n            bins[binId]++\n        }\n\n        for ((binId, numCommits) in bins.withIndex()) {\n            if (numCommits == 0) {\n                continue\n            }\n\n            val numLines = Math.floor(min + binId * binSize).toInt()\n            fs.add(Fact(serverRepo, FactCodes.COMMIT_NUM_TO_LINE_NUM,\n                numLines, numCommits.toString(), author))\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/hashers/MetaHasher.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.hashers\n\nimport app.FactCodes\nimport app.Logger\nimport app.api.Api\nimport app.model.Author\nimport app.model.Fact\nimport app.model.Repo\nimport java.util.*\nimport kotlin.collections.HashSet\n\n/**\n * MetaHasher hashes repository and uploads stats to server.\n */\nclass MetaHasher(private val serverRepo: Repo = Repo(),\n                 private val api: Api) {\n    fun calculateAndSendFacts(authors: HashSet<Author>,\n                              commitsCount: HashMap<String, Int>,\n                              userEmails: List<String>) {\n        // Sometimes contributors use multiple emails to contribute to single\n        // project, as we don't know exactly who is who (except current user),\n        // let's at least filter authors by similarity.\n        val otherAuthors = authors.filter { author ->\n            !userEmails.contains(author.email)\n        }\n        // Current user may not be a contributor of repo.\n        val isUserAuthor = otherAuthors.size < authors.size\n        val numAuthors = getAuthorsNum(otherAuthors) +\n            if (isUserAuthor) 1 else 0\n\n        val facts = mutableListOf<Fact>()\n\n        // Repository facts: team size.\n        facts.add(FactCodes.REPO_TEAM_SIZE, 0, numAuthors)\n\n        // Repository facts: commit share.\n        val numAllCommits = commitsCount.values.fold(0) { acc, i -> acc + i  }\n        val avgCommits = Math.round(numAllCommits.toDouble() / numAuthors)\n            .toInt()\n        facts.add(FactCodes.COMMIT_SHARE_REPO_AVG, 0, avgCommits)\n\n        if (isUserAuthor) {\n            val numUserCommits = userEmails\n                .mapNotNull { email -> commitsCount[email] }\n                .fold(0) { acc, i -> acc + i }\n            val userEmail = userEmails.first()\n            facts.add(FactCodes.COMMIT_SHARE, 0, numUserCommits, userEmail)\n        }\n\n        postFactsToServer(facts)\n    }\n\n    private fun getAuthorsNum(authors: List<Author>): Int {\n        val names = authors.map { it.name }\n        val emails = authors.map { it.email.split(\"@\")[0] }\n        val namesQgrams = names.map { getThreegrams(it) }\n        val emailsQgrams = emails.map { getThreegrams(it) }\n\n        val results = Array(authors.size) { Array(authors.size) {0} }\n\n        for (i in 0..authors.size-2) {\n            for (j in i+1 until authors.size) {\n                if (isSameAuthor(namesQgrams[i], namesQgrams[j])) {\n                    results[j][i] = 1\n                }\n                if (isSameAuthor(emailsQgrams[i], emailsQgrams[j])) {\n                    results[j][i] = 1\n                }\n            }\n        }\n\n        return results.filter { it.sum() == 0 }.size\n    }\n\n    private fun isSameAuthor(firstThreegrams: Set<String>,\n                             secondThreegrams: Set<String>): Boolean {\n        val intersectionSize = firstThreegrams.intersect(secondThreegrams).size\n        val unionSize = firstThreegrams.union(secondThreegrams).size\n        val jaccardValue = intersectionSize.toFloat() / unionSize\n        return jaccardValue >= 0.3\n    }\n\n    private fun getThreegrams(str: String): Set<String> {\n        val threegrams = mutableSetOf<String>()\n        for (i in 0..str.length-3) {\n            threegrams.add(listOf(str[i], str[i+1], str[i+2]).joinToString(\"\"))\n        }\n        return threegrams\n    }\n\n    private fun postFactsToServer(facts: List<Fact>) {\n        if (facts.isNotEmpty()) {\n            api.postFacts(facts).onErrorThrow()\n            Logger.info { \"Sent ${facts.size} facts to server\" }\n        }\n    }\n\n    private fun MutableList<Fact>.add(code: Int, key: Int, value: Any,\n                                      email: String? = null) {\n        val fact = if (email != null) {\n            Fact(serverRepo, code, key, value.toString(), Author(email = email))\n        } else {\n            Fact(serverRepo, code, key, value.toString())\n        }\n\n        this.add(fact)\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/hashers/RepoHasher.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.hashers\n\nimport app.BuildConfig\nimport app.Logger\nimport app.api.Api\nimport app.config.Configurator\nimport app.model.Author\nimport app.model.LocalRepo\nimport app.model.ProcessEntry\nimport app.model.Repo\nimport app.utils.EmptyRepoException\nimport app.utils.FileHelper.toPath\nimport app.utils.HashingException\nimport app.utils.RepoHelper\nimport app.utils.batch\nimport org.eclipse.jgit.api.Git\nimport java.io.File\nimport java.io.IOException\nimport kotlin.collections.HashSet\n\nclass RepoHasher(private val api: Api,\n                 private val configurator: Configurator) {\n    fun update(localRepo: LocalRepo) {\n        Logger.debug { \"RepoHasher.update call: $localRepo\" }\n        val processEntryId = localRepo.processEntryId\n\n        if (!RepoHelper.isValidRepo(localRepo.path.toPath())) {\n            // TODO(anatoly): Send empty repo.\n            throw IllegalArgumentException(\"Invalid repo $localRepo\")\n        }\n\n        val git = loadGit(localRepo.path)\n        try {\n            Logger.info { \"Hashing of repo started\" }\n            updateProcess(processEntryId, Api.PROCESS_STATUS_START)\n\n            val (rehashes, authors, commitsCount) =\n                CommitCrawler.fetchRehashesAndAuthors(git)\n            localRepo.parseGitConfig(git.repository.config)\n            val serverRepo = initServerRepo(localRepo, rehashes.last,\n                processEntryId)\n\n            // Get repo setup (commits, emails to hash) from server.\n            postRepoFromServer(serverRepo)\n\n            // Send all repo emails for invites.\n            postAuthorsToServer(authors, serverRepo)\n\n            // Choose emails to filter commits with.\n            val emails = authors.map { author -> author.email }.toHashSet()\n            val filteredEmails = if (localRepo.hashAllContributors) {\n                emails\n            } else {\n                filterEmails(emails, serverRepo)\n            }\n\n            // Common error handling for subscribers.\n            // Exceptions can't be thrown out of reactive chain.\n            val errors = mutableListOf<Throwable>()\n            val onError: (Throwable) -> Unit = {\n                e -> errors.add(e)\n                Logger.error(e, \"Hashing error\")\n            }\n\n            // Only code longevity needs to calculate each commit, if it's\n            // disabled then read only author's emails.\n            val crawlerEmails = if (!BuildConfig.LONGEVITY_ENABLED) {\n                filteredEmails\n            } else null\n            val jgitObservable = CommitCrawler.getJGitObservable(git,\n                rehashes.size, filteredEmails = crawlerEmails,\n                extractCoauthors = true\n            ).publish()\n            val observable = CommitCrawler.getObservable(git,\n                jgitObservable, serverRepo)\n\n            // Hash by all plugins.\n            if (BuildConfig.COMMIT_HASHER_ENABLED) {\n                CommitHasher(serverRepo, api, rehashes, filteredEmails)\n                    .updateFromObservable(observable, onError)\n            }\n            if (BuildConfig.FACT_HASHER_ENABLED) {\n                FactHasher(serverRepo, api, rehashes, filteredEmails)\n                    .updateFromObservable(observable, onError)\n            }\n            if (BuildConfig.LONGEVITY_ENABLED) {\n                CodeLongevity(serverRepo, filteredEmails, git)\n                    .updateFromObservable(jgitObservable, onError, api)\n            }\n            if (BuildConfig.META_HASHER_ENABLED) {\n                val userEmail = configurator.getUser().emails.map { it.email }\n                MetaHasher(serverRepo, api)\n                    .calculateAndSendFacts(authors = authors,\n                                           commitsCount = commitsCount,\n                                           userEmails = userEmail)\n            }\n            if (BuildConfig.DISTANCES_ENABLED) {\n                val userEmails = configurator.getUser().emails.map { it.email }.toHashSet()\n                val pathsObservable = CommitCrawler.getJGitObservable(git,\n                        extractCommit = false, extractDate = true,\n                        extractDiffs = false, extractEmail = true,\n                        extractPaths = true)\n                AuthorDistanceHasher(serverRepo, api, emails, userEmails)\n                        .updateFromObservable(pathsObservable, onError)\n            }\n\n            // Start and synchronously wait until all subscribers complete.\n            Logger.print(\"Stats computation. May take a while...\")\n            jgitObservable.connect()\n\n            if (errors.isNotEmpty()) {\n                throw HashingException(errors)\n            }\n            Logger.info(Logger.Events.HASHING_REPO_SUCCESS)\n                { \"Hashing repo completed\" }\n            updateProcess(processEntryId, Api.PROCESS_STATUS_COMPLETE)\n        } catch (e: EmptyRepoException) {\n            updateProcess(processEntryId, Api.PROCESS_STATUS_FAIL,\n                Api.PROCESS_ERROR_EMPTY_REPO)\n            throw e\n        } catch (e: Throwable) {\n            updateProcess(processEntryId, Api.PROCESS_STATUS_FAIL)\n            throw e\n        } finally {\n            closeGit(git)\n        }\n    }\n\n    private fun loadGit(path: String): Git {\n        return try {\n            Git.open(File(path))\n        } catch (e: IOException) {\n            throw IllegalStateException(\"Cannot access repository at $path\")\n        }\n    }\n\n    private fun closeGit(git: Git) {\n        git.repository?.close()\n        git.close()\n    }\n\n    private fun postRepoFromServer(serverRepo: Repo) {\n        val repo = api.postRepo(serverRepo).getOrThrow()\n        serverRepo.commits = repo.commits\n        Logger.info {\n            \"Received repo from server with ${serverRepo.commits.size} commits\"\n        }\n        Logger.debug { serverRepo.toString() }\n    }\n\n    private fun postAuthorsToServer(authors: HashSet<Author>,\n                                    serverRepo: Repo) {\n        authors.forEach { author -> author.repo = serverRepo }\n        for (authorsBatch in authors.asSequence().batch(1000)) {\n            api.postAuthors(authorsBatch).onErrorThrow()\n        }\n    }\n\n    private fun initServerRepo(localRepo: LocalRepo,\n                               initCommitRehash: String,\n                               processEntryId: Int?): Repo {\n        val rehash = RepoHelper.calculateRepoRehash(initCommitRehash, localRepo)\n        val repo = Repo(initialCommitRehash = initCommitRehash,\n                        rehash = rehash,\n                        meta = localRepo.meta,\n                        processEntryId = processEntryId ?: 0)\n        Logger.debug { \"Local repo path: ${localRepo.path}\" }\n        Logger.debug { \"Repo remote: ${localRepo.remoteOrigin}\" }\n        Logger.debug { \"Repo rehash: $rehash\" }\n        return repo\n    }\n\n    private fun filterEmails(emails: HashSet<String>,\n                             serverRepo: Repo): HashSet<String> {\n        val knownEmails = hashSetOf<String>()\n        knownEmails.addAll(configurator.getUser().emails.map { it.email })\n        knownEmails.addAll(serverRepo.emails)\n\n        return knownEmails.filter { emails.contains(it) }.toHashSet()\n    }\n\n    private fun updateProcess(processEntryId: Int?, status: Int,\n                              errorCode: Int = 0) {\n        if (processEntryId == null) {\n            return\n        }\n\n        val processEntry = ProcessEntry(id = processEntryId, status = status,\n            errorCode = errorCode)\n        api.postProcess(listOf(processEntry)).onErrorThrow()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/hashers/Vendors.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io),\n\n// Inspired by GitHub Liguist heuristics (https://github.com/github/linguist).\n\npackage app.hashers\n\n/**\n * List of regexps that are matched against file pathname. Used to filter out\n * vendor specific files from the repo statistics.\n */\nval VendorConventions = listOf(\n    // Caches\n    Regex(\"\"\"(^|/)cache/\"\"\"),\n\n    // Dependencies\n    Regex(\"\"\"^[Dd]ependencies/\"\"\"),\n\n    // Distributions\n    Regex(\"\"\"(^|/)dist/\"\"\"),\n\n    // C deps\n    Regex(\"\"\"^deps/\"\"\"),\n    Regex(\"\"\"(^|/)configure$\"\"\"),\n    Regex(\"\"\"(^|/)config.guess$\"\"\"),\n    Regex(\"\"\"(^|/)config.sub$\"\"\"),\n\n    // stuff autogenerated by autoconf - still C deps\n    Regex(\"\"\"(^|/)aclocal.m4\"\"\"),\n    Regex(\"\"\"(^|/)libtool.m4\"\"\"),\n    Regex(\"\"\"(^|/)ltoptions.m4\"\"\"),\n    Regex(\"\"\"(^|/)ltsugar.m4\"\"\"),\n    Regex(\"\"\"(^|/)ltversion.m4\"\"\"),\n    Regex(\"\"\"(^|/)lt~obsolete.m4\"\"\"),\n\n    // Linters\n    Regex(\"\"\"cpplint.py\"\"\"),\n\n    // Node dependencies\n    Regex(\"\"\"node_modules/\"\"\"),\n\n    // Bower Components\n    Regex(\"\"\"bower_components/\"\"\"),\n\n    // Erlang bundles\n    Regex(\"\"\"^rebar$\"\"\"),\n    Regex(\"\"\"erlang.mk\"\"\"),\n\n    // Go dependencies\n    Regex(\"\"\"Godeps/_workspace/\"\"\"),\n\n    // GNU indent profiles\n    Regex(\"\"\".indent.pro\"\"\"),\n\n    // Minified JavaScript and CSS\n    Regex(\"\"\"(\\.|-)min\\.(js|css)$\"\"\"),\n\n    // Stylesheets imported from packages\n    Regex(\"\"\"([^\\s]*)import\\.(css|less|scss|styl)$\"\"\"),\n\n    // Bootstrap css and js\n    Regex(\"\"\"(^|/)bootstrap([^.]*)\\.(js|css|less|scss|styl)$\"\"\"),\n    Regex(\"\"\"(^|/)custom\\.bootstrap([^\\s]*)(js|css|less|scss|styl)$\"\"\"),\n\n    // Font Awesome\n    Regex(\"\"\"(^|/)font-awesome\\.(css|less|scss|styl)$\"\"\"),\n    Regex(\"\"\"(^|/)font-awesome/.*\\.(css|less|scss|styl)$\"\"\"),\n\n    // Foundation css\n    Regex(\"\"\"(^|/)foundation\\.(css|less|scss|styl)$\"\"\"),\n\n    // Normalize.css\n    Regex(\"\"\"(^|/)normalize\\.(css|less|scss|styl)$\"\"\"),\n\n    // Skeleton.css\n    Regex(\"\"\"(^|/)skeleton\\.(css|less|scss|styl)$\"\"\"),\n\n    // Bourbon css\n    Regex(\"\"\"(^|/)[Bb]ourbon/.*\\.(css|less|scss|styl)$\"\"\"),\n\n    // Animate.css\n    Regex(\"\"\"(^|/)animate\\.(css|less|scss|styl)$\"\"\"),\n\n    // Materialize.css\n    Regex(\"\"\"(^|/)materialize\\.(css|less|scss|styl|js)$\"\"\"),\n\n    // Select2\n    Regex(\"\"\"(^|/)select2/.*\\.(css|scss|js)$\"\"\"),\n\n    // Vendored dependencies\n    Regex(\"\"\"third[-_]?party/\"\"\"),\n    Regex(\"\"\"3rd[-_]?party/\"\"\"),\n    Regex(\"\"\"vendors?/\"\"\"),\n    Regex(\"\"\"extern(al)?/\"\"\"),\n    Regex(\"\"\"(^|/)[Vv]+endor/\"\"\"),\n\n    // Debian packaging\n    Regex(\"\"\"^debian/\"\"\"),\n\n    // Haxelib projects often contain a neko bytecode file named run.n\n    Regex(\"\"\"run.n$\"\"\"),\n\n    // Bootstrap Datepicker\n    Regex(\"\"\"bootstrap-datepicker/\"\"\"),\n\n    // Commonly Bundled JavaScript frameworks\n\n    // jQuery\n    Regex(\"\"\"(^|/)jquery([^.]*)\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)jquery\\-\\d\\.\\d+(\\.\\d+)?\\.js$\"\"\"),\n\n    // jQuery UI\n    Regex(\"\"\"(^|/)jquery\\-ui(\\-\\d\\.\\d+(\\.\\d+)?)?(\\.\\w+)?\\.(js|css)$\"\"\"),\n    Regex(\"\"\"(^|/)jquery\\.(ui|effects)\\.([^.]*)\\.(js|css)$\"\"\"),\n\n    // jQuery Gantt\n    Regex(\"\"\"jquery.fn.gantt.js\"\"\"),\n\n    // jQuery fancyBox\n    Regex(\"\"\"jquery.fancybox.(js|css)\"\"\"),\n\n    // Fuel UX\n    Regex(\"\"\"fuelux.js\"\"\"),\n\n    // jQuery File Upload\n    Regex(\"\"\"(^|/)jquery\\.fileupload(-\\w+)?\\.js$\"\"\"),\n\n    // jQuery dataTables\n    Regex(\"\"\"jquery.dataTables.js\"\"\"),\n\n    // bootboxjs\n    Regex(\"\"\"bootbox.js\"\"\"),\n\n    // pdf-worker\n    Regex(\"\"\"pdf.worker.js\"\"\"),\n\n    // Slick\n    Regex(\"\"\"(^|/)slick\\.\\w+.js$\"\"\"),\n\n    // Leaflet plugins\n    Regex(\"\"\"(^|/)Leaflet\\.Coordinates-\\d+\\.\\d+\\.\\d+\\.src\\.js$\"\"\"),\n    Regex(\"\"\"leaflet.draw-src.js\"\"\"),\n    Regex(\"\"\"leaflet.draw.css\"\"\"),\n    Regex(\"\"\"Control.FullScreen.css\"\"\"),\n    Regex(\"\"\"Control.FullScreen.js\"\"\"),\n    Regex(\"\"\"leaflet.spin.js\"\"\"),\n    Regex(\"\"\"wicket-leaflet.js\"\"\"),\n\n    // Sublime Text workspace files\n    Regex(\"\"\".sublime-project\"\"\"),\n    Regex(\"\"\".sublime-workspace\"\"\"),\n\n    // VS Code workspace files\n    Regex(\"\"\".vscode\"\"\"),\n\n    // Prototype\n    Regex(\"\"\"(^|/)prototype(.*)\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)effects\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)controls\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)dragdrop\\.js$\"\"\"),\n\n    // Typescript definition files\n    Regex(\"\"\"(.*?)\\.d\\.ts$\"\"\"),\n\n    // MooTools\n    Regex(\"\"\"(^|/)mootools([^.]*)\\d+\\.\\d+.\\d+([^.]*)\\.js$\"\"\"),\n\n    // Dojo\n    Regex(\"\"\"(^|/)dojo\\.js$\"\"\"),\n\n    // MochiKit\n    Regex(\"\"\"(^|/)MochiKit\\.js$\"\"\"),\n\n    // YUI\n    Regex(\"\"\"(^|/)yahoo-([^.]*)\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)yui([^.]*)\\.js$\"\"\"),\n\n    // WYS editors\n    Regex(\"\"\"(^|/)ckeditor\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)tiny_mce([^.]*)\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)tiny_mce/(langs|plugins|themes|utils)\"\"\"),\n\n    // Ace Editor\n    Regex(\"\"\"(^|/)ace-builds/\"\"\"),\n\n    // Fontello CSS files\n    Regex(\"\"\"(^|/)fontello(.*?)\\.css$\"\"\"),\n\n    // MathJax\n    Regex(\"\"\"(^|/)MathJax/\"\"\"),\n\n    // Chart.js\n    Regex(\"\"\"(^|/)Chart\\.js$\"\"\"),\n\n    // CodeMirror\n    Regex(\"\"\"(^|/)[Cc]ode[Mm]irror/(\\d+\\.\\d+/)?(lib|mode|theme|addon|keymap|demo)\"\"\"),\n\n    // SyntaxHighlighter - http://alexgorbatchev.com/\n    Regex(\"\"\"(^|/)shBrush([^.]*)\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)shCore\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)shLegacy\\.js$\"\"\"),\n\n    // AngularJS\n    Regex(\"\"\"(^|/)angular([^.]*)\\.js$\"\"\"),\n\n    // D3.js\n    Regex(\"\"\"(^|\\/)d3(\\.v\\d+)?([^.]*)\\.js$\"\"\"),\n\n    // React\n    Regex(\"\"\"(^|/)react(-[^.]*)?\\.js$\"\"\"),\n\n    // flow-typed\n    Regex(\"\"\"(^|/)flow-typed/.*\\.js$\"\"\"),\n\n    // Modernizr\n    Regex(\"\"\"(^|/)modernizr\\-\\d\\.\\d+(\\.\\d+)?\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)modernizr\\.custom\\.\\d+\\.js$\"\"\"),\n\n    // Knockout\n    Regex(\"\"\"(^|/)knockout-(\\d+\\.){3}(debug\\.)?js$\"\"\"),\n\n    // Python\n\n    // Sphinx\n    Regex(\"\"\"(^|/)docs?/_?(build|themes?|templates?|static)/\"\"\"),\n\n    // django\n    Regex(\"\"\"(^|/)admin_media/\"\"\"),\n    Regex(\"\"\"(^|/)env/\"\"\"),\n\n    // Fabric\n    Regex(\"\"\"^fabfile\\.py$\"\"\"),\n\n    // WAF\n    Regex(\"\"\"^waf$\"\"\"),\n\n    // .osx\n    Regex(\"\"\"^.osx$\"\"\"),\n\n    // Obj-C\n\n    // Xcode\n    Regex(\"\"\"\\.xctemplate/\"\"\"),\n    Regex(\"\"\"\\.imageset/\"\"\"),\n    Regex(\"\"\"\\.xc.*/\"\"\"),\n    Regex(\"\"\"(^|/)Info\\.plist$\"\"\"),\n    Regex(\"\"\"\\.storyboard$\"\"\"),\n\n    // Carthage\n    Regex(\"\"\"(^|/)Carthage/\"\"\"),\n\n    // Sparkle\n    Regex(\"\"\"(^|/)Sparkle/\"\"\"),\n\n    // Crashlytics\n    Regex(\"\"\"Crashlytics.framework/\"\"\"),\n\n    // Fabric\n    Regex(\"\"\"Fabric.framework/\"\"\"),\n\n    // BuddyBuild\n    Regex(\"\"\"BuddyBuildSDK.framework/\"\"\"),\n\n    // Realm\n    Regex(\"\"\"Realm.framework\"\"\"),\n\n    // RealmSwift\n    Regex(\"\"\"RealmSwift.framework\"\"\"),\n\n    // git config files\n    Regex(\"\"\"gitattributes$\"\"\"),\n    Regex(\"\"\"gitignore$\"\"\"),\n    Regex(\"\"\"gitmodules$\"\"\"),\n\n    // Groovy\n\n    // Gradle\n    Regex(\"\"\"(^|/)gradlew$\"\"\"),\n    Regex(\"\"\"(^|/)gradlew\\.bat$\"\"\"),\n    Regex(\"\"\"(^|/)gradle/wrapper/\"\"\"),\n\n    // Java\n\n    // Maven\n    Regex(\"\"\"(^|/)mvnw$\"\"\"),\n    Regex(\"\"\"(^|/)mvnw\\.cmd$\"\"\"),\n    Regex(\"\"\"(^|/)\\.mvn/wrapper/\"\"\"),\n\n    // .NET\n\n    // Visual Studio IntelliSense\n    Regex(\"\"\"-vsdoc\\.js$\"\"\"),\n    Regex(\"\"\"\\.intellisense\\.js$\"\"\"),\n\n    // jQuery validation plugin (MS bundles this with asp.net mvc),\n    Regex(\"\"\"(^|/)jquery([^.]*)\\.validate(\\.unobtrusive)?\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)jquery([^.]*)\\.unobtrusive\\-ajax\\.js$\"\"\"),\n\n    // Microsoft Ajax\n    Regex(\"\"\"(^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\\.debug)?\\.js$\"\"\"),\n\n    // NuGet\n    Regex(\"\"\"^[Pp]ackages\\/.+\\.\\d+\\/\"\"\"),\n\n    // ExtJS\n    Regex(\"\"\"(^|/)extjs/.*?\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)extjs/.*?\\.xml$\"\"\"),\n    Regex(\"\"\"(^|/)extjs/.*?\\.txt$\"\"\"),\n    Regex(\"\"\"(^|/)extjs/.*?\\.html$\"\"\"),\n    Regex(\"\"\"(^|/)extjs/.*?\\.properties$\"\"\"),\n    Regex(\"\"\"(^|/)extjs/.sencha/\"\"\"),\n    Regex(\"\"\"(^|/)extjs/docs/\"\"\"),\n    Regex(\"\"\"(^|/)extjs/builds/\"\"\"),\n    Regex(\"\"\"(^|/)extjs/cmd/\"\"\"),\n    Regex(\"\"\"(^|/)extjs/examples/\"\"\"),\n    Regex(\"\"\"(^|/)extjs/locale/\"\"\"),\n    Regex(\"\"\"(^|/)extjs/packages/\"\"\"),\n    Regex(\"\"\"(^|/)extjs/plugins/\"\"\"),\n    Regex(\"\"\"(^|/)extjs/resources/\"\"\"),\n    Regex(\"\"\"(^|/)extjs/src/\"\"\"),\n    Regex(\"\"\"(^|/)extjs/welcome/\"\"\"),\n\n    // Html5shiv\n    Regex(\"\"\"(^|/)html5shiv\\.js$\"\"\"),\n\n    // Test fixtures\n    Regex(\"\"\"^[Tt]ests?/fixtures/\"\"\"),\n    Regex(\"\"\"^[Ss]pecs?/fixtures/\"\"\"),\n\n    // PhoneGap/Cordova\n    Regex(\"\"\"(^|/)cordova([^.]*)\\.js$\"\"\"),\n    Regex(\"\"\"(^|/)cordova\\-\\d\\.\\d(\\.\\d)?\\.js$\"\"\"),\n\n    // Foundation js\n    Regex(\"\"\"foundation(\\..*)?\\.js$\"\"\"),\n\n    // Vagrant\n    Regex(\"\"\"^Vagrantfile$\"\"\"),\n\n    // .DS_Stores\n    Regex(\"\"\".[Dd][Ss]_[Ss]tore$\"\"\"),\n\n    // R packages\n    Regex(\"\"\"^vignettes/\"\"\"),\n    Regex(\"\"\"^inst/extdata/\"\"\"),\n\n    // Octicons\n    Regex(\"\"\"octicons.css\"\"\"),\n    Regex(\"\"\"sprockets-octicons.scss\"\"\"),\n\n    // Typesafe Activator\n    Regex(\"\"\"(^|/)activator$\"\"\"),\n    Regex(\"\"\"(^|/)activator\\.bat$\"\"\"),\n\n    // ProGuard\n    Regex(\"\"\"proguard.pro\"\"\"),\n    Regex(\"\"\"proguard-rules.pro\"\"\"),\n\n    // PuPHPet\n    Regex(\"\"\"^puphpet/\"\"\"),\n\n    // Android Google APIs\n    Regex(\"\"\"(^|/)\\.google_apis/\"\"\"),\n\n    // Jenkins Pipeline\n    Regex(\"\"\"^Jenkinsfile$\"\"\"),\n\n    // generated by BUCKLESCRIPT\n    Regex(\"\"\"\\.bs\\.js$\"\"\")\n)\n"
  },
  {
    "path": "src/main/kotlin/app/model/Author.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * Commit author.\n */\ndata class Author(\n    var name: String = \"\",\n    var email: String = \"\",\n    var repo: Repo = Repo()\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.Author) : this() {\n        email = proto.email\n        name = proto.name\n        repo = Repo(proto.repoRehash)\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.Author.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.Author {\n        return Protos.Author.newBuilder()\n            .setEmail(email)\n            .setName(name)\n            .setRepoRehash(repo.rehash)\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n\n    // Email defines user identity.\n    override fun equals(other: Any?): Boolean {\n        if (other is Author) {\n            return email == other.email\n        }\n        return false\n    }\n\n    override fun hashCode(): Int {\n        return email.hashCode()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/AuthorDistance.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\ndata class AuthorDistance(\n        var repo: Repo = Repo(),\n        var email: String = \"\",\n        var score: Double = 0.0\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.AuthorDistance) : this() {\n        repo = Repo(rehash = proto.repoRehash)\n        email = proto.email\n        score = proto.score\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.AuthorDistance.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.AuthorDistance {\n        return Protos.AuthorDistance.newBuilder()\n                .setRepoRehash(repo.rehash)\n                .setEmail(email)\n                .setScore(score)\n                .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/AuthorDistanceGroup.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\ndata class AuthorDistanceGroup(\n        var stats: List<AuthorDistance> = listOf()\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.AuthorDistanceGroup) : this() {\n        stats = proto.authorDistancesList.map { AuthorDistance(it) }\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.AuthorDistanceGroup.parseFrom\n    (bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.AuthorDistanceGroup {\n        return Protos.AuthorDistanceGroup.newBuilder()\n                .addAllAuthorDistances(stats.map { it.getProto() })\n                .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/AuthorGroup.kt",
    "content": "package app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * Group of commit authors.\n */\ndata class AuthorGroup(\n        var authors: List<Author> = listOf()\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.AuthorGroup) : this() {\n        authors = proto.authorsList.map { it -> Author(it) }\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.AuthorGroup.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.AuthorGroup {\n        return Protos.AuthorGroup.newBuilder()\n            .addAllAuthors(authors.map { it -> it.getProto() })\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/Classifier.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.model\n\nimport app.ClassifierProtos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\nclass Classifier {\n    var tokens: List<String>\n    var libraries: List<String>\n    var idf: Map<String, Float>\n    var weights: Map<String, Map<String, Float>>\n    var biases: Map<String, Float>\n\n    @Throws(InvalidParameterException::class)\n    constructor(proto: ClassifierProtos.Classifier) {\n        tokens = proto.tokensList\n        libraries = proto.librariesList\n        idf = tokens.zip(proto.idfList).toMap()\n        weights = libraries.zip(proto.weightsList.partition(tokens.size)\n            .map {it: List<Float> -> tokens.zip(it).toMap()}).toMap()\n        biases = libraries.zip(proto.biasesList).toMap()\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(ClassifierProtos.Classifier\n        .parseFrom(bytes))\n\n    fun evaluate(input: List<String>): List<Double> {\n        val inputTokens = input.filter { it in tokens}\n        val tokensWithWeight = inputTokens.groupBy { it }\n            .map { (token, tokens) -> Pair(token, tokens.size * idf[token]!!) }\n            .toMap()\n        val norm = Math.sqrt(tokensWithWeight\n            .map { (_, tfidf) -> tfidf * tfidf }\n            .sum() + 1e-7)\n        val output = if (libraries.size == 2) {\n            val secondDecision = Math.exp(tokensWithWeight\n                .map { (token, tfidf) ->\n                    tfidf / norm * weights[libraries[0]]!![token]!!\n                }\n                .sum() + biases[libraries[0]]!!)\n            listOf(1.0, secondDecision)\n        } else libraries.map {\n            Math.exp(tokensWithWeight\n                .map { (token, tfidf) -> tfidf / norm * weights[it]!![token]!! }\n                .sum() + biases[it]!!)\n        }\n        val norm2 = output.sum()\n        val probs = output.map { it / norm2 }\n\n        return probs\n    }\n\n    private fun <T> List<T>.partition(size: Int): List<List<T>> {\n        return this.withIndex()\n            .groupBy { it.index / size }\n            .map { group -> group.value.map { it.value } }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/Commit.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport org.apache.commons.codec.digest.DigestUtils\nimport org.eclipse.jgit.revwalk.RevCommit\nimport java.security.InvalidParameterException\n\n/**\n * Commit.\n */\ndata class Commit(\n        var rehash: String = \"\",\n        var repo: Repo = Repo(),\n        // Tree rehash used for adjustments of stats due to rebase and fraud.\n        var treeRehash: String = \"\",\n        var author: Author = Author(),\n        var coauthors: List<Author> = mutableListOf(),\n        var dateTimestamp: Long = 0,\n        var dateTimeZoneOffset: Int = 0,\n        var isQommit: Boolean = false,\n        var numLinesAdded: Int = 0,\n        var numLinesDeleted: Int = 0,\n        var stats: List<CommitStats> = mutableListOf()\n) {\n    // Wrapping JGit's RevCommit.\n    var raw: RevCommit? = null  // Not sent to sever.\n    var diffs: List<DiffFile> = listOf()\n\n    constructor(revCommit: RevCommit, coauthorsList: List<Author>? = null) :\n            this() {\n        raw = revCommit\n\n        rehash = DigestUtils.sha256Hex(revCommit.id.name)\n        author = Author(revCommit.authorIdent.name,\n                        revCommit.authorIdent.emailAddress.toLowerCase())\n        dateTimestamp = revCommit.authorIdent.getWhen().time / 1000\n        dateTimeZoneOffset = revCommit.authorIdent.timeZoneOffset\n        treeRehash = DigestUtils.sha256Hex(revCommit.tree.name)\n        if (coauthorsList != null) {\n            coauthors = coauthorsList\n        }\n    }\n\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.Commit) : this() {\n        rehash = proto.rehash\n        repo = Repo(rehash = proto.repoRehash)\n        treeRehash = proto.treeRehash\n        author = Author(proto.authorName, proto.authorEmail)\n        dateTimestamp = proto.date\n        isQommit = proto.isQommit\n        numLinesAdded = proto.numLinesAdded\n        numLinesDeleted = proto.numLinesDeleted\n        stats = proto.statsList.map { CommitStats(it) }\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.Commit.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.Commit {\n        return Protos.Commit.newBuilder()\n            .setRehash(rehash)\n            .setRepoRehash(repo.rehash)\n            .setTreeRehash(treeRehash)\n            .setAuthorName(author.name)\n            .setAuthorEmail(author.email)\n            .setDate(dateTimestamp)\n            .setIsQommit(isQommit)\n            .setNumLinesAdded(numLinesAdded)\n            .setNumLinesDeleted(numLinesDeleted)\n            .addAllStats(stats.map { it.getProto() })\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (other?.javaClass != javaClass) return false\n        return rehash == (other as Commit).rehash\n    }\n\n    override fun hashCode(): Int {\n        return rehash.hashCode()\n    }\n\n    fun getAllAdded(): List<String> {\n        return diffs.map { it.getAllAdded() }.flatten()\n    }\n\n    fun getAllDeleted(): List<String> {\n        return diffs.map { it.getAllDeleted() }.flatten()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/CommitGroup.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * Tech stats on a commit.\n */\ndata class CommitGroup(\n        var commits: List<Commit> = listOf()\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.CommitGroup) : this() {\n        commits = proto.commitsList.map { it -> Commit(it) }\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.CommitGroup.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.CommitGroup {\n        return Protos.CommitGroup.newBuilder()\n            .addAllCommits(commits.map { it -> it.getProto() })\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/CommitStats.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * Tech stats on a commit.\n */\ndata class CommitStats(\n        var numLinesAdded: Int = 0,\n        var numLinesDeleted: Int = 0,\n        var type: Int = 0,\n        var tech: String = \"\"\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.CommitStats) : this() {\n        numLinesAdded = proto.numLinesAdded\n        numLinesDeleted = proto.numLinesDeleted\n        type = proto.type\n        tech = proto.tech\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.CommitStats.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.CommitStats {\n        return Protos.CommitStats.newBuilder()\n            .setNumLinesAdded(numLinesAdded)\n            .setNumLinesDeleted(numLinesDeleted)\n            .setType(type)\n            .setTech(tech)\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/DiffContent.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nclass DiffContent(\n    val content: List<String> = listOf(),\n    val ranges: List<DiffRange> = listOf(),\n    var imports: List<String> = listOf()\n) {\n    fun getAllDiffs(): List<String> {\n        return ranges.fold(mutableListOf()) { total, range ->\n            total.addAll(content.subList(range.start, range.end))\n            total\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/DiffFile.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.utils.FileHelper\nimport org.eclipse.jgit.diff.DiffEntry\n\nclass DiffFile(\n    val path: String = \"\",\n    val changeType: DiffEntry.ChangeType,\n    var old: DiffContent = DiffContent(),\n    var new: DiffContent = DiffContent(),\n    var lang: String = \"\"\n) {\n    val extension: String = FileHelper.getFileExtension(path)\n\n    fun getAllAdded(): List<String> {\n        return new.getAllDiffs()\n    }\n\n    fun getAllDeleted(): List<String> {\n        return old.getAllDiffs()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/DiffRange.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\n/**\n * [start] (inclusive) and [end] (exclusive) specifies range of changed lines.\n */\ndata class DiffRange(val start: Int, val end: Int)\n"
  },
  {
    "path": "src/main/kotlin/app/model/Error.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\ndata class Error(\n    var code: Int = 0,\n    var message: String = \"\"\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.Error) : this() {\n        code = proto.code\n        message = proto.message\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.Error.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.Error {\n        return Protos.Error.newBuilder()\n            .setCode(code)\n            .setMessage(message)\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/Errors.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\ndata class Errors (\n    var errors: List<Error> = listOf()\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.Errors) : this() {\n        errors = proto.errorsList.map { error -> Error(error) }\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.Errors.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.Errors {\n        return Protos.Errors.newBuilder()\n            .addAllErrors(errors.map { error -> error.getProto() })\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/Fact.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * Key-value statistics for fun facts.\n */\ndata class Fact(\n    var repo: Repo = Repo(),\n    var code: Int = 0,\n    var key: Int = 0,\n    var value: String = \"\",\n    var author: Author = Author(),\n    var value2: String = \"\",\n    var value3: String = \"\"\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.Fact) : this() {\n        repo = Repo(rehash = proto.repoRehash)\n        author = Author(\"\", proto.email)\n        code = proto.code\n        key = proto.key\n        value = \"\"\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.Fact.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.Fact {\n        return Protos.Fact.newBuilder()\n            .setRepoRehash(repo.rehash)\n            .setEmail(author.email)\n            .setCode(code)\n            .setKey(key)\n            .setValue1(value)\n            .setValue2(value2)\n            .setValue3(value3)\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/FactGroup.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * Group of key-value facts.\n */\ndata class FactGroup(\n        var stats: List<Fact> = listOf()\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.FactGroup) : this() {\n        stats = proto.factsList.map { it -> Fact(it) }\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.FactGroup.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.FactGroup {\n        return Protos.FactGroup.newBuilder()\n            .addAllFacts(stats.map { it -> it.getProto() })\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/LibraryMeta.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage app.model\n\nimport app.ClassifierProtos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\ndata class Library (\n    val id: String,\n    val imports: List<String>,\n    val version: Int\n)\n\nclass LibraryMeta (\n    var langLibraries: HashMap<String, List<Library>> = hashMapOf()\n){\n    var importToIndexMap = buildImportToIndexMap(langLibraries)\n\n    fun buildImportToIndexMap(langLibraries: HashMap<String, List<Library>>):\n        HashMap<String, Map<String, String>> {\n        val importToIndexMap = hashMapOf<String, Map<String, String>>()\n\n        for ((lang, libs) in langLibraries) {\n            val map = hashMapOf<String, String>()\n            libs.forEach { lib -> lib.imports.forEach { import ->\n                map[import] = lib.id\n            }}\n            importToIndexMap[lang] = map\n        }\n\n        return importToIndexMap\n    }\n\n    @Throws(InvalidParameterException::class)\n    constructor(proto: ClassifierProtos.LibrariesMeta) : this() {\n        val tempMap = proto.languagesList.associateBy({ lang -> lang.id },\n            { lang ->\n                lang.librariesList.map { lib ->\n                    Library(lib.id, lib.importsList, lib.version)\n                }\n            })\n        langLibraries = HashMap(tempMap)\n        importToIndexMap = buildImportToIndexMap(langLibraries)\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) :\n        this(ClassifierProtos.LibrariesMeta.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): ClassifierProtos.LibrariesMeta {\n        return ClassifierProtos.LibrariesMeta.newBuilder()\n            .addAllLanguages(langLibraries.map({ (langId, libs) ->\n                ClassifierProtos.Language.newBuilder()\n                    .setId(langId)\n                    .addAllLibraries(libs.map { lib ->\n                        ClassifierProtos.Library.newBuilder()\n                            .setId(lib.id)\n                            .setVersion(lib.version)\n                            .addAllImports(lib.imports)\n                            .build()\n                    })\n                    .build()\n            }))\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/LocalRepo.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport com.fasterxml.jackson.annotation.JsonIgnore\nimport org.eclipse.jgit.lib.Config\n\ndata class LocalRepo(var path: String = \"\") {\n    var hashAllContributors: Boolean = false\n\n    @JsonIgnore var author: Author = Author()\n    @JsonIgnore var remoteOrigin: String = \"\"\n    @JsonIgnore var meta = RepoMeta()\n    @JsonIgnore var processEntryId: Int? = 0\n\n    fun parseGitConfig(config: Config) {\n        author = Author(\n            name = config.getString(\"user\", null, \"name\") ?: \"\",\n            email = config.getString(\"user\", null, \"email\") ?: \"\")\n        remoteOrigin = config.getString(\"remote\", \"origin\", \"url\") ?: \"\"\n    }\n\n    override fun toString(): String {\n        return path\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/Process.kt",
    "content": "package app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * Used to describe processing of multiple repos.\n */\ndata class Process(\n    var id: Int = 0,\n    var requestNumEntries: Int = 0,\n    var entries: List<ProcessEntry> = mutableListOf()\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.Process) : this() {\n        id = proto.id\n        requestNumEntries = proto.requestNumEntries\n        entries = proto.entriesList.map { ProcessEntry(it) }\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.Process.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.Process {\n        return Protos.Process.newBuilder()\n                     .setId(id)\n                     .setRequestNumEntries(requestNumEntries)\n                     .addAllEntries(entries.map { it.getProto() })\n                     .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/ProcessEntry.kt",
    "content": "package app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * Used to describe processing of a single repo.\n */\ndata class ProcessEntry(\n    var id: Int = 0,\n    var status: Int = 0,\n    var errorCode: Int = 0\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.ProcessEntry) : this() {\n        id = proto.id\n        status = proto.status\n        errorCode = proto.errorCode\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.ProcessEntry.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.ProcessEntry {\n        return Protos.ProcessEntry.newBuilder()\n            .setId(id)\n            .setStatus(status)\n            .setErrorCode(errorCode)\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/Repo.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * Repository.\n */\ndata class Repo(\n    // Basic info.\n    var rehash: String = \"\",\n    var initialCommitRehash: String = \"\",\n\n    // Authors' email filter for hashed commits. If empty list then hash\n    // only commits that created by current user.\n    var emails: List<String> = listOf(),\n\n    // Raw commits server history. Used to find overlap of commits.\n    var commits: List<Commit> = listOf(),\n\n    // Meta info about repo. Is not used for a locally run app.\n    var meta: RepoMeta = RepoMeta(),\n\n    // Processing session id, used to check the processing status.\n    var processEntryId: Int = 0\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.Repo) : this() {\n        rehash = proto.rehash\n        initialCommitRehash = proto.initialCommitRehash\n        emails = proto.emailsList\n        commits = proto.commitsList.map { Commit(it) }\n        processEntryId = proto.processEntryId\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.Repo.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.Repo {\n        return Protos.Repo.newBuilder()\n            .setRehash(rehash)\n            .setInitialCommitRehash(rehash)\n            .addAllEmails(emails)\n            .addAllCommits(commits.map { it.getProto() })\n            .setMeta(meta.getProto())\n            .setProcessEntryId(processEntryId)\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (other?.javaClass != javaClass) return false\n        return rehash == (other as Repo).rehash\n    }\n\n    override fun hashCode(): Int {\n        return rehash.hashCode()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/RepoMeta.kt",
    "content": "package app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * Meta info about repo. Is not used for a locally run app.\n */\ndata class RepoMeta(\n    var hosterId: String = \"\",\n    var service: String = \"\",\n    var name: String = \"\",\n    var ownerName: String = \"\",\n    var description: String = \"\",\n    var htmlUrl: String = \"\",\n    var cloneUrl: String = \"\"\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.RepoMeta) : this() {\n        hosterId = proto.hosterId\n        service = proto.service\n        name = proto.name\n        ownerName = proto.ownerName\n        description = proto.description\n        htmlUrl = proto.htmlUrl\n        cloneUrl = proto.cloneUrl\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.RepoMeta.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.RepoMeta {\n        return Protos.RepoMeta.newBuilder()\n            .setHosterId(hosterId)\n            .setService(service)\n            .setName(name)\n            .setOwnerName(ownerName)\n            .setDescription(description)\n            .setHtmlUrl(htmlUrl)\n            .setCloneUrl(cloneUrl)\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/User.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * User information.\n */\ndata class User (\n    var repos: MutableList<Repo> = mutableListOf(),\n    var emails: HashSet<UserEmail> = hashSetOf<UserEmail>()\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.User) : this() {\n        repos = proto.reposList.map { repo -> Repo(repo) }\n            .toMutableList()\n        emails = proto.emailsList.map { email -> UserEmail(email) }.toHashSet()\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.User.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.User {\n        return Protos.User.newBuilder()\n            .addAllRepos(repos.map { repo -> repo.getProto() })\n            .addAllEmails(emails.map { email -> email.getProto() })\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/model/UserEmail.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.model\n\nimport app.Protos\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.security.InvalidParameterException\n\n/**\n * User information.\n */\nclass UserEmail(\n    var email: String = \"\",\n    var primary: Boolean = false,\n    var verified: Boolean = false\n) {\n    @Throws(InvalidParameterException::class)\n    constructor(proto: Protos.UserEmail) : this() {\n        email = proto.email\n        primary = proto.primary\n        verified = proto.verified\n    }\n\n    @Throws(InvalidProtocolBufferException::class)\n    constructor(bytes: ByteArray) : this(Protos.UserEmail.parseFrom(bytes))\n\n    constructor(serialized: String) : this(serialized.toByteArray())\n\n    fun getProto(): Protos.UserEmail {\n        return Protos.UserEmail.newBuilder()\n            .setEmail(email)\n            .setPrimary(primary)\n            .setVerified(verified)\n            .build()\n    }\n\n    fun serialize(): ByteArray {\n        return getProto().toByteArray()\n    }\n\n    override fun toString(): String {\n        val primary = if (this.primary) \" (Primary)\" else \"\"\n        val verified = if (this.verified) \"Confirmed\" else \"Not confirmed\"\n        return \"${this.email}$primary — $verified\"\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (other is UserEmail) {\n            return email == other.email\n        }\n        return false\n    }\n\n    override fun hashCode(): Int {\n        return email.hashCode()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/ui/AddRepoState.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.ui\n\nimport app.Logger\nimport app.api.Api\nimport app.config.Configurator\nimport app.model.LocalRepo\nimport app.utils.FileHelper.toPath\nimport app.utils.RepoHelper\nimport app.utils.UiHelper\nimport java.nio.file.Files\nimport java.nio.file.Path\n\n/**\n * Add repository dialog console UI state.\n */\nclass AddRepoState constructor(private val context: Context,\n                               private val api: Api,\n                               private val configurator: Configurator)\n    : ConsoleState {\n    override fun doAction() {\n        if (configurator.getLocalRepos().isNotEmpty()) return\n\n        while (true) {\n            Logger.print(\"\")\n            Logger.print(\"Type one or more paths to repository. You can specify \" +\n                    \"multiple repository paths separated by space on the same line.\")\n            Logger.print(\"If you finished specifying repositories, just hit 'Enter' to continue.\")\n            val pathsString = readLine() ?: \"\"\n\n            if (pathsString.isEmpty()) {\n                if (configurator.getLocalRepos().isEmpty()) {\n                    Logger.print(\"Add at least one valid repository.\")\n                } else {\n                    Logger.print(\"Finished processing git repositories\")\n                    break  // User finished to add repos.\n                }\n            } else {\n                val paths: List<String> = pathsString.split(' ')\n                paths.forEach {\n                    val path = it.toPath()\n                    if (RepoHelper.isValidRepo(path)) {\n                        processPath(path)\n                    } else {\n                        Files.walk(path)\n                                .filter { p -> RepoHelper.isValidGitRepo(p) }\n                                .forEach { p -> processPath(p) }\n                    }\n                }\n            }\n        }\n\n        Logger.info(Logger.Events.CONFIG_SETUP) { \"Config setup\" }\n    }\n\n    private fun processPath(path: Path) {\n        if (RepoHelper.isValidRepo(path)) {\n            Logger.print(\"Added git repository at $path.\")\n            val localRepo = LocalRepo(path.toString())\n            localRepo.hashAllContributors = UiHelper.confirm(\"Do you \"\n                    + \"want to hash commits of all contributors?\",\n                    defaultIsYes = true)\n            configurator.addLocalRepoPersistent(localRepo)\n            configurator.saveToFile()\n            Logger.print(\"Successfully processed $path\")\n        } else {\n            Logger.warn { \"No valid git repository found at specified path $path\" }\n            Logger.print(\"Make sure that master branch with at least \" +\n                    \"one commit exists.\")\n        }\n    }\n\n    override fun next() {\n        context.changeState(EmailState(context, api, configurator))\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/ui/AuthState.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.ui\n\nimport app.BuildConfig\nimport app.Logger\nimport app.api.Api\nimport app.config.Configurator\nimport app.utils.PasswordHelper\nimport app.api.ApiError\nimport app.api.ifNotNullThrow\nimport app.api.isWithServerCode\n\n/**\n * Authorization console UI state.\n */\nclass AuthState constructor(private val context: Context,\n                            private val api: Api,\n                            private val configurator: Configurator)\n    : ConsoleState {\n    var username = \"\"\n    var password = \"\"\n    var retry = true\n    var authorized = false\n\n    override fun doAction() {\n        if (!configurator.isValidCredentials()) {\n            getUsername()\n            getPassword()\n        }\n\n        authorized = tryAuth()\n        while (!authorized && retry) {\n            getPassword()\n            authorized = tryAuth()\n        }\n    }\n\n    override fun next() {\n        if (authorized) {\n            context.changeState(ListRepoState(context, api, configurator))\n        } else {\n            context.changeState(CloseState())\n        }\n    }\n\n    fun getUsername() {\n        Logger.print(\"Enter username:\")\n        username = readLine() ?: \"\"\n        configurator.setUsernameCurrent(username)\n    }\n\n    fun getPassword() {\n        Logger.print(\"Enter password:\")\n        password = PasswordHelper.readPassword()\n        configurator.setPasswordCurrent(password)\n    }\n\n    fun saveCredentialsIfChanged() {\n        if (username.isNotEmpty()) {\n            configurator.setUsernamePersistent(username)\n        }\n        if (password.isNotEmpty()) {\n            configurator.setPasswordPersistent(password)\n        }\n        if (username.isNotEmpty() || password.isNotEmpty()) {\n            configurator.saveToFile()\n        }\n    }\n\n    fun tryAuth(): Boolean {\n        try {\n            Logger.print(\"Signing in...\")\n            val (_, error) = api.authorize()\n            if (error.isWithServerCode(Api.OUT_OF_DATE)) {\n                Logger.print(\"App is out of date. Please get new version at \" +\n                    \"https://sourcerer.io\")\n                retry = false\n                return false\n            }\n            // Other request errors should be processed by try/catch.\n            error.ifNotNullThrow()\n\n            val user = api.getUser().getOrThrow()\n            configurator.setUser(user)\n\n            Logger.print(\"Signed in successfully. Your profile page is \" +\n                BuildConfig.PROFILE_URL + configurator.getUsername())\n\n            saveCredentialsIfChanged()\n            Logger.username = configurator.getUsername()\n            Logger.info(Logger.Events.AUTH) { \"Auth success\" }\n\n            return true\n        } catch (e: ApiError) {\n            if (e.isAuthError) {\n                if(e.httpBodyMessage.isNotBlank()) {\n                    Logger.print(e.httpBodyMessage)\n                } else {\n                    Logger.print(\"Authentication error. Try again.\")\n                }\n            } else {\n                Logger.print(\"Connection problems. Try again later.\")\n                Logger.error(e)\n                retry = false\n            }\n        }\n\n        return false\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/ui/CloseState.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.ui\n\nimport app.Logger\n\n/**\n * On application close console UI state.\n */\nclass CloseState : ConsoleState {\n    override fun doAction() {\n        Logger.print(\"You could use console commands to control repositories.\",\n            indentLine = true)\n        Logger.print(\"For more info run application with flag --help.\")\n        // TODO(anatoly): Check for problems for display support message.\n        Logger.print(\"Feel free to contact us on any problem by \" +\n            \"support@sourcerer.io.\")\n    }\n\n    override fun next() {\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/ui/ConsoleState.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.ui\n\n/**\n * State pattern interface for console user interface.\n */\ninterface ConsoleState {\n    fun doAction()\n    fun next()\n}\n"
  },
  {
    "path": "src/main/kotlin/app/ui/ConsoleUi.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.ui\n\nimport app.api.Api\nimport app.config.Configurator\n\n/**\n * Console user interface.\n */\nclass ConsoleUi(api: Api,\n                configurator: Configurator) : Context {\n    var state: ConsoleState = OpenState(this, api, configurator)\n\n    init {\n        changeState(state)\n    }\n\n    override fun changeState(state: ConsoleState) {\n        this.state = state\n        state.doAction()\n        state.next()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/ui/Context.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.ui\n\n/**\n * State pattern context.\n */\ninterface Context {\n    fun changeState(state: ConsoleState)\n}\n"
  },
  {
    "path": "src/main/kotlin/app/ui/EmailState.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.ui\n\nimport app.Logger\nimport app.api.Api\nimport app.config.Configurator\nimport app.hashers.CommitCrawler\nimport app.model.LocalRepo\nimport app.model.User\nimport app.model.UserEmail\nimport app.utils.UiHelper\nimport org.eclipse.jgit.api.Git\nimport java.io.File\n\n/**\n * Update repositories console UI state.\n */\nclass EmailState constructor(private val context: Context,\n                             private val api: Api,\n                             private val configurator: Configurator)\n    : ConsoleState {\n    override fun doAction() {\n        val user = configurator.getUser()\n\n        if (user.emails.isNotEmpty()) {\n            Logger.print(\"List of your emails:\", indentLine = true)\n            user.emails.forEach { email -> println(email) }\n        } else {\n            // Shouldn't really happen. User always have primary email.\n            Logger.print(\"Add at least one email to build your profile.\",\n                indentLine = true)\n        }\n\n        val knownEmails = user.emails.map { it.email }\n        val newEmails = hashSetOf<String>()\n        val configEmails = hashSetOf<String>()\n        // TODO(anatoly): Tell about web editing emails, when it's ready.\n        // TODO(anatoly): Add global config parsing.\n        // TODO(anatoly): Add user config parsing.\n\n        // Add emails from git configs.\n        val reposEmails = hashMapOf<LocalRepo, HashSet<String>>()\n        for (repo in configurator.getLocalRepos()) {\n            var git: Git? = null\n            try {\n                git = Git.open(File(repo.path))\n                var email = git.repository.config\n                               .getString(\"user\", null, \"email\") ?: \"\"\n                email = email.toLowerCase()\n                if (email.isNotEmpty() && !knownEmails.contains(email)) {\n                    configEmails.add(email)\n                }\n                // Fetch and save emails from repo for \"no-email\" warning.\n                val (_, authors) = CommitCrawler.fetchRehashesAndAuthors(git)\n                reposEmails.put(repo, authors.map { it.email }.toHashSet())\n            } catch (e: Exception) {\n                Logger.error(e, \"Error while parsing repo\")\n            } finally {\n                if (git != null) {\n                    git.repository?.close()\n                    git.close()\n                }\n            }\n        }\n\n        if (configEmails.isNotEmpty()) {\n            Logger.print(\"Your git config contains untracked emails:\")\n            configEmails.forEach { email -> println(email) }\n            if (UiHelper.confirm(\"Do you want to add this emails to your \" +\n                \"account?\", defaultIsYes = true)) {\n                newEmails.addAll(configEmails)\n            }\n        }\n\n        // Show warning if no commits\n        val reposUserMissing = mutableListOf<LocalRepo>()\n        for (repo in configurator.getLocalRepos()) {\n            val presentedEmails = reposEmails.get(repo)\n            val updatedEmails = knownEmails + newEmails\n            if (presentedEmails != null) {\n                var userMissing = true\n                for (email in presentedEmails) {\n                    if (updatedEmails.contains(email)) {\n                        userMissing = false\n                        break\n                    }\n                }\n                if (userMissing) {\n                    reposUserMissing.add(repo)\n                }\n            }\n        }\n        if (reposUserMissing.isNotEmpty()) {\n            if (reposUserMissing.size == 1) {\n                Logger.print(\"${reposUserMissing.first()} repo does not \" +\n                    \"contains commits from emails you've specified\")\n            } else {\n                Logger.print(\"Following repos do not contain commits from \" +\n                    \"emails you've specified:\")\n                reposUserMissing.forEach { Logger.print(it) }\n            }\n        }\n\n        // Ask user to enter his emails.\n        if (UiHelper.confirm(\"Do you want to specify additional emails \" +\n            \"that you use in repositories?\", defaultIsYes = false)) {\n            while (true) {\n                Logger.print(\"Type a email, or hit Enter to continue.\")\n                val email = (readLine() ?: \"\").toLowerCase()\n                if (email.isBlank()) break\n                if (!knownEmails.contains(email)) newEmails.add(email)\n            }\n        }\n\n        if (newEmails.isNotEmpty()) {\n            val newUserEmails = newEmails.map { UserEmail(email = it) }\n            // We will need new emails during hashing.\n            user.emails.addAll(newUserEmails)\n\n            // Send new emails to server.\n            val userNewEmails = User(emails = newUserEmails.toHashSet())\n            api.postUser(userNewEmails)\n        }\n\n        // Warn user about need of confirmation.\n        if (user.emails.filter { email -> !email.verified }.isNotEmpty() ||\n            newEmails.isNotEmpty()) {\n            Logger.print(\"Confirm your emails to show all statistics in \" +\n                \"profile.\")\n        }\n    }\n\n    override fun next() {\n        context.changeState(UpdateRepoState(context, api, configurator))\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/ui/ListRepoState.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.ui\n\nimport app.api.Api\nimport app.config.Configurator\nimport app.utils.RepoHelper\n\n/**\n * List tracked repositories console UI state.\n */\nclass ListRepoState constructor(private val context: Context,\n                                private val api: Api,\n                                private val configurator: Configurator)\n    : ConsoleState {\n    override fun doAction() {\n        RepoHelper.printRepos(configurator.getLocalRepos(),\n                \"Tracked repositories:\")\n    }\n\n    override fun next() {\n        context.changeState(AddRepoState(context, api, configurator))\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/ui/OpenState.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.ui\n\nimport app.Logger\nimport app.api.Api\nimport app.config.Configurator\n\n/**\n * On application open console UI state.\n */\nclass OpenState constructor(private val context: Context,\n                            private val api: Api,\n                            private val configurator: Configurator)\n    : ConsoleState {\n    override fun doAction() {\n        if (!configurator.isValidCredentials()) {\n            Logger.print(\"Sourcerer hashes your git repositories into \" +\n                \"intelligent engineering profiles.\")\n            Logger.print(\"If you don't have an account, please, sign up at \" +\n                    \"https://sourcerer.io/join\")\n        } else {\n            Logger.print(\"Sourcerer. Use flag --help to list available \" +\n                \"commands.\")\n        }\n    }\n\n    override fun next() {\n        context.changeState(AuthState(context, api, configurator))\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/ui/UpdateRepoState.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.ui\n\nimport app.BuildConfig\nimport app.hashers.RepoHasher\nimport app.Logger\nimport app.api.Api\nimport app.config.Configurator\nimport app.model.LocalRepo\nimport app.model.ProcessEntry\nimport app.utils.HashingException\nimport java.util.*\nimport kotlin.concurrent.fixedRateTimer\n\n/**\n * Update repositories console UI state.\n */\nclass UpdateRepoState constructor(private val context: Context,\n                                  private val api: Api,\n                                  private val configurator: Configurator)\n    : ConsoleState {\n    override fun doAction() {\n        Logger.info { \"Hashing started\" }\n\n        // TODO(anatoly): Move code to RepoHasher.\n        val localRepos = configurator.getLocalRepos()\n        assignProcess(localRepos)\n\n        val heartbeatTimer = runHeartbeatTimer(localRepos)\n        for (repo in localRepos) {\n            try {\n                Logger.print(\"Hashing $repo repository...\", indentLine = true)\n                RepoHasher(api, configurator).update(repo)\n                Logger.print(\"Hashing $repo completed.\")\n            } catch (e: HashingException) {\n                e.errors.forEach { error ->\n                    Logger.error(error, \"Error while hashing\")\n                }\n            } catch (e: Throwable) {\n                Logger.error(e, \"Error while hashing\")\n            }\n        }\n        heartbeatTimer.cancel()\n\n        Logger.print(\"The repositories have been hashed.\")\n        Logger.print(\"Take a look at the updates in your profile at \" +\n            BuildConfig.PROFILE_URL + configurator.getUsername(),\n            indentLine = true)\n        Logger.info(Logger.Events.HASHING_SUCCESS) { \"Hashing success\" }\n    }\n\n    override fun next() {\n        context.changeState(CloseState())\n    }\n\n    // Notify server about processing start and get processing ids.\n    private fun assignProcess(localRepos: List<LocalRepo>) {\n        val process = api.postProcessCreate(requestNumEntries = localRepos.size)\n            .getOrThrow()\n        if (process.entries.isEmpty()) return\n        process.entries.subList(0, localRepos.size).forEachIndexed { index, e ->\n            localRepos[index].processEntryId = e.id\n        }\n    }\n\n    private fun runHeartbeatTimer(localRepos: List<LocalRepo>): Timer {\n        val entries = localRepos.filter { it.processEntryId != null}\n                                .map { ProcessEntry(id = it.processEntryId!!) }\n        return fixedRateTimer(\n            name = \"heartbeat\",\n            daemon = true,\n            initialDelay = BuildConfig.HEARTBEAT_RATE,\n            period = BuildConfig.HEARTBEAT_RATE,\n            action = {\n                try {\n                    api.postProcess(entries).onErrorThrow()\n                } catch (e: Throwable) {\n                    Logger.error(e)\n                }\n            }\n        )\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/CommandAdd.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nimport com.beust.jcommander.Parameter\nimport com.beust.jcommander.Parameters\n\n@Parameters(separators = \"=\",\n            commandDescription = \"Add a repository to tracking list\")\nclass CommandAdd {\n    // Command name for CLI.\n    val name = \"add\"\n\n    @Parameter(names = arrayOf(\"-r\", \"--recursive\"),\n               description = \"Should search recursively in the specified directory\")\n    var recursive: Boolean = false\n\n    // Path to analyzed repository.\n    @Parameter(description = \"REPOPATH\")\n    var paths: List<String> = arrayListOf()\n\n    // Hash commits of all contributors.\n    @Parameter(names = arrayOf(\"-a\", \"--all\"),\n               description = \"Hash commits of all contributors.\")\n    var hashAll: Boolean = false\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/CommandConfig.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nimport com.beust.jcommander.Parameter\nimport com.beust.jcommander.Parameters\n\n@Parameters(separators = \"=\",\n            commandDescription = \"Configure Sourcerer app\")\nclass CommandConfig {\n    // Command name for CLI.\n    val name = \"config\"\n\n    // Key value pair of configurable parameters.\n    @Parameter(description = \"KEY VALUE\", arity = 2, order = 0)\n    var pair: List<String> = arrayListOf()\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/CommandList.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nimport com.beust.jcommander.Parameters\n\n@Parameters(separators = \"=\",\n            commandDescription = \"List tracked repositories\")\nclass CommandList {\n    // Command name for CLI.\n    val name = \"list\"\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/CommandRemove.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nimport com.beust.jcommander.Parameter\nimport com.beust.jcommander.Parameters\n\n@Parameters(separators = \"=\",\n            commandDescription = \"Remove a repository from tracking list\")\nclass CommandRemove {\n    // Command name for CLI.\n    val name = \"remove\"\n\n    // Path to analyzed repository.\n    @Parameter(description = \"REPOPATH\")\n    var path: String? = null\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/FileHelper.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nimport java.io.File\nimport java.net.URLDecoder\nimport java.nio.file.Files\nimport java.nio.file.Paths\nimport java.nio.file.Path\n\n/*\n * Wrapper around Java Path and File classes to work the sourcerer's files.\n */\nobject FileHelper {\n    private val dirName = \"data\"\n    private val jarPath = getJarPath()\n    private val settingsPath = jarPath.resolve(dirName)\n\n    private val specificExts = listOf(\".min.js\")\n\n    fun getPath(name: String, vararg parts: String): Path {\n        val path = settingsPath.resolve(Paths.get(\"\", *parts))\n        if (Files.notExists(path)) {\n            Files.createDirectories(path)\n        }\n        return path.resolve(name)\n    }\n\n    fun getFile(name: String, vararg parts: String): File {\n        return getPath(name, *parts).toFile()\n    }\n\n    fun notExists(name:String, vararg parts: String): Boolean {\n        return Files.notExists(getPath(name, *parts))\n    }\n\n    fun getFileExtension(path: String): String {\n        val fileName = Paths.get(path).fileName.toString().toLowerCase()\n        for (ext in specificExts) {\n            if (fileName.endsWith(ext)) {\n                return ext\n            }\n        }\n        return fileName.substringAfterLast(delimiter = '.',\n                                           missingDelimiterValue = \"\")\n    }\n\n    fun getJarPath(): Path {\n        val fullPathURI = FileHelper::class.java.protectionDomain.\n                          codeSource.location.toURI()\n        val fullPath = Paths.get(fullPathURI)\n        val root = fullPath.root\n        // Removing jar filename.\n        return root.resolve(fullPath.subpath(0, fullPath.nameCount - 1))\n    }\n\n    fun String.toPath(): Path {\n        val substitutePath = if (this.startsWith(\"~\" + File.separator)) {\n            System.getProperty(\"user.home\") + this.substring(1)\n        } else { this }\n        return Paths.get(substitutePath).toAbsolutePath().normalize()\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/HashingException.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nclass HashingException(val errors: List<Throwable>) : Exception()\n\nclass EmptyRepoException(message: String) : Exception(message)\n"
  },
  {
    "path": "src/main/kotlin/app/utils/Metrics.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage app.utils\n\nimport kotlin.system.*\n\nobject Metrics {\n    override fun toString(): String {\n      var str: String = \"\"\n\n      var total: Long = 0\n      for ((_, item) in timing.items) {\n        total += item.time\n      }\n\n      str += timing.toStringHelper(total)\n\n      for ((tag, value) in numerical) {\n        str += \"$tag: $value\\n\"\n      }\n\n      return str\n    }\n\n    fun <T> recordTime(tag: String, block: () -> T) : T {\n      val parentItem = timingStack.get(timingStack.lastIndex)\n      var item = parentItem.items.getOrPut(tag, { TimingData() })\n\n      timingStack.add(item)\n\n      val start = System.currentTimeMillis()\n      val result = block()\n      item.time += System.currentTimeMillis() - start\n\n      timingStack.subList(timingStack.lastIndex, timingStack.lastIndex + 1).clear()\n\n      return result\n    }\n\n    fun recordMetric(tag: String, metric: Long)\n    {\n        var v = numerical.getOrDefault(tag, 0)\n        numerical.put(tag, v + metric);\n    }\n\n    class TimingData {\n        var time: Long = 0\n        var items = mutableMapOf<String, TimingData>()\n\n        fun toStringHelper(total: Long, offset: String = \"\"): String {\n          var str = \"\"\n          for ((tag, item) in items) {\n            str += \"$offset$tag: ${item.time} ms, ${item.time * 100 / total}%\\n\"\n            str += item.toStringHelper(total, \"$offset  \")\n          }\n          return str\n        }\n    }\n\n    private val timing = TimingData()\n    private val timingStack = mutableListOf<TimingData>(timing)\n    private var nestedTiming: Boolean = true\n\n    private val numerical = mutableMapOf<String, Long>()\n}\n\n/**\n * Records a block's execution time in milliseconds and assigns it a tag in\n * calls hierarchy.\n */\nfun <T> recordTime(tag: String, block: () -> T) : T {\n    return Metrics.recordTime(tag, block)\n}\n\n/**\n * Records a numeric metric of given tag.\n */\nfun recordMetric(tag: String, metric: Long)\n{\n    return Metrics.recordMetric(tag, metric)\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/Misc.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\n// TODO(anatoly): Replace with chunked from new Kotlin version.\n// SO #34498368 @ Jayson Minard.\nfun <T> Sequence<T>.batch(n: Int): Sequence<List<T>> {\n    return BatchingSequence(this, n)\n}\n\nclass BatchingSequence<T>(val source: Sequence<T>,\n                          val batchSize: Int) : Sequence<List<T>> {\n    override fun iterator(): Iterator<List<T>> = object :\n            AbstractIterator<List<T>>() {\n        val iterate = if (batchSize > 0) source.iterator() else\n            emptyList<T>().iterator()\n        override fun computeNext() {\n            if (iterate.hasNext()) setNext(iterate.asSequence()\n                    .take(batchSize).toList())\n            else done()\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/Options.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nimport com.beust.jcommander.Parameter\n\nclass Options {\n    // Sourcerer account username.\n    @Parameter(names = arrayOf(\"-u\", \"--username\"),\n               description = \"Sourcerer account username\",\n               order = 0)\n    var username: String = \"\"\n\n    // Sourcerer account password.\n    @Parameter(names = arrayOf(\"-p\", \"--password\"),\n               description = \"Sourcerer account password\",\n               order = 1)\n    var password: String = \"\"\n\n    // List options and commands.\n    @Parameter(names = arrayOf(\"-h\", \"--help\"),\n               description = \"List options and commands\",\n               order = 2)\n    var help: Boolean = false\n\n    // Cleanup configs and run setup again.\n    @Parameter(names = arrayOf(\"--setup\"),\n               description = \"Cleanup configs and run setup again\",\n               order = 3)\n    var setup: Boolean = false\n\n    // Uninstall. Runs by install script, added to display info in help.\n    @Parameter(names = arrayOf(\"--uninstall\"),\n               description = \"Remove Sourcerer App\",\n               order = 4)\n    var uninstall: Boolean = false\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/PasswordHelper.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nimport org.apache.commons.codec.digest.DigestUtils\nimport java.io.IOError\n\n/**\n * Class for hashing and reading passwords.\n */\nobject PasswordHelper {\n    fun hashPassword(password: String): String {\n        return if (password.isEmpty()) {\n            \"\"\n        }\n        else {\n            DigestUtils.sha256Hex(password)\n        }\n    }\n\n    fun readPassword(): String {\n        val password: String\n        val console = System.console()\n        if (console != null) {\n            password = try {\n                System.console().readPassword().joinToString(\"\")\n            } catch (e: IOError) {\n                \"\"\n            }\n        } else {\n            password = readLine() ?: \"\"\n        }\n\n        return password\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/RepoHelper.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nimport app.Logger\nimport app.hashers.CommitCrawler\nimport app.model.LocalRepo\nimport org.apache.commons.codec.digest.DigestUtils\nimport org.eclipse.jgit.api.Git\nimport org.eclipse.jgit.lib.ObjectId\nimport org.eclipse.jgit.lib.Repository\nimport java.io.File\nimport java.nio.file.Files\nimport java.nio.file.InvalidPathException\nimport java.nio.file.Path\nimport java.nio.file.Paths\n\n/**\n * Class for utility functions on repos.\n */\nobject RepoHelper {\n    fun isValidRepo(path: Path): Boolean {\n        if (!isDirectory(path)) {\n            return false\n        }\n\n        var git: Git? = null\n        var repository: Repository? = null\n        val commitId: ObjectId?\n        try {\n            git = Git.open(path.toFile())\n            repository = git.repository\n            commitId = CommitCrawler.getDefaultBranchHead(git)\n        } catch (e: Exception) {\n            Logger.error(e, \"Cannot access repository at specified path\")\n            return false\n        } finally {\n            repository?.close()\n            git?.close()\n        }\n\n        if (commitId != null) {\n            return true\n        }\n        return false\n    }\n\n    fun isDirectory(path: Path): Boolean {\n        return try {\n            path.toFile().isDirectory\n        } catch (e: InvalidPathException) {\n            Logger.error(e, \"Invalid path\")\n            false\n        } catch (e: UnsupportedOperationException) {\n            Logger.error(e, \"Invalid path\")\n            false\n        } catch (e: SecurityException) {\n            Logger.error(e, \"Cannot access repository at specified path\")\n            false\n        }\n    }\n\n    fun isValidGitRepo(p: Path) = (Files.isDirectory(p)\n            && p.fileName.toString().equals(\".git\", ignoreCase = true))\n\n    /* To identify and distinguish different repos we calculate its rehash.\n    Repos may have forks. Such repos should be tracked independently.\n    Therefore, rehash of repo calculated by values of:\n    - Rehash of initial commit;\n    - Hash of remote origin;\n    - If remote origin not presented: repo local path and username.\n    To associate forked repos with primary repo rehash of initial commit\n    stored separately too. */\n    fun calculateRepoRehash(initialCommitRehash: String,\n                            localRepo: LocalRepo): String {\n        val username = try { System.getProperty(\"user.name\") }\n                       catch (e: Exception) { \"\" }\n\n        var repoRehash = initialCommitRehash\n        if (localRepo.remoteOrigin.isNotBlank()) {\n            repoRehash += localRepo.remoteOrigin\n        } else {\n            repoRehash += localRepo.path + username\n        }\n\n        return DigestUtils.sha256Hex(repoRehash)\n    }\n\n    fun printRepos(localRepos: List<LocalRepo>)\n    {\n        for (repo in localRepos) {\n            Logger.print(repo)\n        }\n    }\n\n    fun printRepos(localRepos: List<LocalRepo>, title: String) {\n        if (localRepos.isNotEmpty()) {\n            Logger.print(title, indentLine = true)\n            printRepos(localRepos)\n        }\n    }\n\n    fun printRepos(localRepos: List<LocalRepo>, title: String, empty: String) {\n        if (localRepos.isNotEmpty()) {\n            Logger.print(title, indentLine = true)\n            printRepos(localRepos)\n        } else {\n            Logger.print(empty, indentLine = true)\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/RequestException.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nimport com.github.kittinunf.fuel.core.FuelError\nimport com.google.protobuf.InvalidProtocolBufferException\nimport java.nio.charset.Charset\nimport java.security.InvalidParameterException\n\nclass RequestException(exception: Exception) : Exception(exception.message) {\n    private val AUTH_ERROR_CODES = listOf(401, 403)\n\n    var httpStatusCode: Int = 0\n    var httpResponseMessage: String = \"\"\n    var httpBodyMessage: String = \"\"\n\n    var isAuthError: Boolean = false\n    get() = AUTH_ERROR_CODES.contains(httpStatusCode)\n\n    var isParseError = false\n\n    constructor(fuelError: FuelError) : this(fuelError as Exception) {\n        httpStatusCode = fuelError.response.statusCode\n        httpResponseMessage = fuelError.response.responseMessage\n        httpBodyMessage = fuelError.response.data\n            .toString(Charset.defaultCharset())\n    }\n\n    constructor(parseException: InvalidProtocolBufferException) :\n            this(parseException as Exception) {\n        isParseError = true\n    }\n\n    constructor(parseException: InvalidParameterException) :\n            this(parseException as Exception) {\n        isParseError = true\n    }\n}\n"
  },
  {
    "path": "src/main/kotlin/app/utils/UiHelper.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage app.utils\n\nimport app.Logger\n\nobject UiHelper {\n    fun confirm(message: String, defaultIsYes: Boolean): Boolean {\n        val yes = if (defaultIsYes) \"Y\" else \"y\"\n        val no = if (!defaultIsYes) \"N\" else \"n\"\n        Logger.print(\"$message [$yes/$no]\")\n        val oppositeDefaultValue = if (defaultIsYes) no else yes\n        if ((readLine() ?: \"\").toLowerCase() == oppositeDefaultValue) {\n            return !defaultIsYes\n        }\n        return defaultIsYes\n    }\n}\n"
  },
  {
    "path": "src/main/proto/classifier.proto",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\nsyntax = \"proto3\";\n\n// Java compiler settings.\npackage app;\noption java_package = \"app\";\noption java_outer_classname = \"ClassifierProtos\";\n\nmessage Classifier {\n    repeated string tokens = 1;\n    repeated string libraries = 2;\n    repeated float idf = 3;\n    repeated float weights = 4;\n    repeated float biases = 5;\n}\n\nmessage Library {\n    string id = 1;\n    repeated string imports = 2;\n    int32 version = 3;\n}\n\nmessage Language {\n    string id = 1;\n    repeated Library libraries = 2;\n}\n\nmessage LibrariesMeta {\n    repeated Language languages = 1;\n}\n"
  },
  {
    "path": "src/main/proto/sourcerer.proto",
    "content": "// Copyright 2017 Sourcerer, Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\nsyntax = \"proto3\";\n\n// Java compiler settings.\npackage app;\noption java_package = \"app\";\noption java_outer_classname = \"Protos\";\n\n// Commit.\nmessage Commit {\n    // Re-hash of hash of a commit.\n    string rehash = 1;\n\n    // Hash of repo.\n    string repo_rehash = 2;\n\n    // Re-hash of hash of tree object of a commit.\n    string tree_rehash = 3;\n\n    // Information about author of a commit.\n    string author_name = 4;\n    string author_email = 5;\n\n    // Timestamp of a commit creation in seconds UTC+0.\n    uint64 date = 6;\n\n    // Is quality commit.\n    bool is_qommit = 7;\n\n    // Number of lines for a whole commit.\n    int32 num_lines_added = 8;\n    int32 num_lines_deleted = 9;\n\n    // Tech stats on a commit.\n    repeated CommitStats stats = 10;\n}\n\n// Tech stats on a commit.\nmessage CommitStats {\n    // Number of lines for a specific technology.\n    int32 num_lines_added = 1;\n    int32 num_lines_deleted = 2;\n\n    // Technology type (language/framework/library).\n    int32 type = 3;\n\n    // Technology name.\n    string tech = 4;\n}\n\n// Used to send multiple commits in one request.\nmessage CommitGroup {\n    repeated Commit commits = 1;\n}\n\n// Key-value statistics for fun facts.\nmessage Fact {\n    int32 code = 1;\n    int32 key = 2;\n    string value1 = 3;\n    string value2 = 4;\n    string value3 = 5;\n    string value4 = 6;\n    string email = 7;\n    string repo_rehash = 8;\n}\n\n// Used to send multiple stats in one request.\nmessage FactGroup {\n    repeated Fact facts = 1;\n}\n\n// Used to authors for invitational procedures.\nmessage Author {\n    string email = 1;\n    string name = 3;\n    string repo_rehash = 2;\n}\n\nmessage AuthorGroup {\n    repeated Author authors = 1;\n}\n\n// User properties and indentity information about repos.\nmessage User {\n    // List of known repos containing basic information for indentifying repo.\n    repeated Repo repos = 1;\n    // List of known emails.\n    repeated UserEmail emails = 2;\n}\n\n// Email of user with its status information.\nmessage UserEmail {\n    string email = 1;\n    bool primary = 2;\n    bool verified = 3;\n}\n\n// Repository parameters for hashing.\nmessage Repo {\n    // Repository rehash according to initial commit rehash, remote and user\n    // handle if no remote presented.\n    string rehash = 1;\n\n    // Rehash of first commit in repo. Used for indentifying forks.\n    string initial_commit_rehash = 2;\n\n    // Authors' email filter for hashed commits. If empty list then hash only\n    // commits that created by current user.\n    repeated string emails = 4;\n\n    // Raw commits server history. Used to find overlap of commits. Hashing\n    // starts after last commit from the overlap.\n    repeated Commit commits = 5;\n\n    // Meta info about repo. Is not used for a locally run app.\n    RepoMeta meta = 6;\n\n    // Processing session id, used to check the processing status.\n    uint32 process_entry_id = 7;\n}\n\n// Meta info about repo. Is not used for a locally run app.\nmessage RepoMeta {\n    string hosterId = 1;\n    string service = 6;\n    string name = 2;\n    string ownerName = 3;\n    string description = 7;\n    string htmlUrl = 4;\n    string cloneUrl = 5;\n}\n\n// Errors from server.\nmessage Error {\n    uint32 code = 1;\n    string message = 2;\n}\n\nmessage Errors {\n    repeated Error errors = 1;\n}\n\n// Status of processing.\nmessage Process {\n    uint32 id = 1;\n    repeated ProcessEntry entries = 4;\n    uint32 request_num_entries = 5;\n}\n\nmessage ProcessEntry {\n    uint32 id = 1;\n    uint32 status = 2;\n    uint32 error_code = 3;\n}\n\nmessage AuthorDistance {\n    string email = 1;\n    double score = 2;\n    string repo_rehash = 3;\n}\n\nmessage AuthorDistanceGroup {\n    repeated AuthorDistance author_distances = 1;\n}\n"
  },
  {
    "path": "src/main/resources/data/imports/cpp.txt",
    "content": "opencv:opencv\nopencv2:opencv\nprotobuf:protobuf\npb:protobuf"
  },
  {
    "path": "src/main/resources/data/imports/python.txt",
    "content": "cv2:opencv\ncv:opencv"
  },
  {
    "path": "src/main/resources/data/libraries/cs_libraries.txt",
    "content": "Dapper\nMicrosoft.AspNet.SignalR\nNancy\nMicrosoft.EntityFrameworkCore\nAutoMapper\nNewtonsoft.Json\nMicrosoft.AspNetCore.Mvc\nRestSharp\nMicrosoft.Xna.Framework\nOpenRA\nMicrosoft.Bot\nServiceStack\nPushSharp\nCefSharp\nMaterialDesign*\nReactiveUI\nAbp\nOrleans\nHangfire\nHumanizer\nPolly\nNLog\nFluentValidation\nAvalonia\nAkka\nStackExchange.Redis\nSenparc\nBenchmarkDotNet\nMvvmCross\nEventStore\nSystem.Reactive\nAccord\nQuartz\nIdentityServer3\nMoq\nSwashbuckle\nNinject\nRefit\nStateless\nImageProcessor\nPrism\nMongoDB.Driver\nLanguageExt\nMassive\nLiteDB"
  },
  {
    "path": "src/main/resources/data/libraries/java_libraries.txt",
    "content": "io.reactivex\nretrofit2\nokhttp3\ncom.google.common\nbutterknife\ncom.github.mikephil.charting\ncom.bumptech.glide\ncom.squareup.leakcanary\norg.springframework\norg.greenrobot.eventbus\ncom.nostra13.universalimageloader\norg.springframework.boot\ncom.airbnb.lottie\ncom.google.zxing\ncom.squareup.picasso\nio.reactivex\ncom.facebook.fresco\ncom.blankj.utilcode\ncom.badlogic.gdx\ncom.github.chrisbanes.photoview\nio.netty\ncom.afollestad.material-dialogs\ncom.netflix.hystrix\ncom.jeremyfeinstein.slidingmenu\ncom.alibaba.dubbo\ncom.alibaba.fastjson\ncom.loopj.android.http\ncom.tencent.tinker\norg.androidannotations\ncom.viewpagerindicator\ncom.chad.library\ncom.daimajia.swipelayout\norg.greenrobot.greendao\ncom.gc.materialdesign\ncom.handmark.pulltorefresh\ncom.facebook.stetho\nio.realm\ncom.alibaba.druid\ncom.orhanobut.logger\norg.deeplearning4j\ncom.google.android.agera\nspark\nio.vertx\ncom.airbnb.android.react.lottie\nzipkin\ncom.facebook.presto\ndagger\norg.junit\ncom.lmax.disruptor\ncom.jakewharton.rxbinding2\norg.physical_web\norg.apache.kafka\ncom.google.inject\ncom.google.auto\nio.druid\norg.mockito\ncom.zaxxer.hikari\ncom.codahale.metrics\nus.codecraft.webmagic\ncom.squareup.otto\nokio\norg.apache.hadoop\nopennlp\norg.apache.velocity\nfreemarker\ncom.google.gwt\norg.hamcrest\norg.hornetq\norg.eclipse.hudson\norg.quartz\ngnu.trove\norg.dozer\ncom.googlecode.jmapper\norg.mapstruct\norg.modelmapper\nma.glasnost.orika\nfr.xebia.extras.selma\nnet.sf.cglib\ncom.github.benmanes.caffeine\ncom.github.sviperll.adt4j\ncom.google.auto.common\norg.inferred.freebuilder\ncom.squareup.javapoet\nio.airlift.airline\ncom.typesafe.config\ninfo.macias.kaconf\norg.aeonbits.owner\norg.jacop\norg.apache.commons.csv\ncom.fasterxml.jackson.dataformat.csv\ncom.univocity.parsers\nnet.openhft.chronicle\norg.exist\ncom.vladmihalcea.flexypool\ncom.zaxxer.hikari\nredis.clients.jedis\nio.searchbox\ncom.justinsb.etcd\norg.jinq\nch.vorburger.mariadb4j\ncom.facebook.presto\nio.realm\norg.redisson\nio.requery\ncom.speedment\norg.apache.avro\ncom.leansoft.bigqueue\ncom.google.protobuf\nuk.co.real_logic.sbe\ncom.squareup.tape2\ncom.squareup.wire\ncom.hypotemoose.cal\nnet.fortuna.ical4j\norg.joda.time\norg.threeten.bp\nnet.time4j\norg.codejargon.feather\ncom.netflix.governator\ncom.google.inject\norg.zalando.fauxpas\norg.hotswap.agent\ncom.github.javaparser\ncom.github.javaparser.symbolsolver\norg.springsource\ncom.github.mtakaki.dropwizard.circuitbreaker\nnet.jodah.failsafe\ncom.netflix.hystrix\nio.github.resilience4j\ncom.netflix.zuul\ncom.badlogicgames.packr\norg.skife.waffles\njanala\ncom.aol.cyclops\norg.derive4j\norg.jooq.lambda\ncom.codepoetics.protonpack\none.util.streamex\ncom.github.davidmoten.geo\ncom.graphhopper\norg.mapsforge\norg.locationtech.spatial4j\norg.agrona\norg.eclipse.collections\norg.jctools\ncom.koloboke\norg.asynchttpclient\nfeign\nrestql.core\ncom.netflix.ribbon\norg.zalando.riptide\ncom.github.jsonldjava\ncom.google.code.siren4j\norg.imgscalr\nnet.sourceforge.tess4j\nnet.coobird.thumbnailator\ncom.twelvemonkeys\ncom.google.zxing\ncom.google.gson\ncom.zaxxer.hikari.json\norg.zalando.jackson.datatype.money\ncom.cedarsoftware.util.io\ncom.bluelinelabs.logansquare\ncom.squareup.moshi\ncom.alibaba.fastjson\ncom.bazaarvoice.jolt\ncom.jayway.jsonpath\norg.jsfr.json\norg.zalando.logbook\norg.zalando.tracer\njsat\ncom.cloudera.oryx\nio.aeron\nzmq\norg.zalando.nakadi\norg.jivesoftware.smack\ncom.googlecode.cqengine\nnet.jodah.failsafe\nio.github.resilience4j.circuitbreaker\nme.ramswaroop.jbot\ncom.google.common.jimfs\ncom.googlecode.lanterna\nnet.jodah.typetools\ncom.ecwid.consul.v1\ncom.netflix.eureka\norg.automon\nnet.bull.javamelody\ncom.googlecode.jmxtrans\nnudge4j\ncom.navercorp.pinpoint\norg.stagemonitor\ncom.palantir.opensource.sysmon\norg.bytedeco.javacpp\ncom.sun.jna\njnr.ffi\nedu.illinois.cs.cogcomp\ncomsat\ncom.twitter.finagle\nio.grpc\ncom.facebook.nifty\nde.slub.urn\norg.simpleflatmapper\norg.xhtmlrenderer\ncom.networknt\norg.orienteer\norg.reactivestreams\nio.reactivex\ncom.linkedin.restli\norg.restexpress\norg.restlet\ncom.hendrix.erdos\norg.graphstream\norg.jgrapht\ncom.mxgraph\nedu.mines.jtk\ntech.tablesaw\norg.hdiv\nio.jsonwebtoken\norg.keyczar\nme.gosimple.nbvcxz\norg.pac4j\ncom.google.flatbuffers\norg.nustaq.serialization\ncom.esotericsoftware.kryo\norg.msgpack\norg.nanohttpd\ncom.tngtech.archunit\norg.awaitility\ncom.squareup.burst\nnet.jodah.concurrentunit\ncucumber\nlv.ctco.cukes\nbr.com.six2six.fixturefactory\ncom.galenframework\nj8spec\nio.codearte.jfairy\ncom.tngtech.java.junit.dataprovider\ncom.insightfullogic.lambdabehave\norg.mockito\ncom.github.dreamhead.moco\norg.mutabilitydetector\norg.powermock\nguru.nidi.ramltester\ncom.carrotsearch.randomizedtesting\nio.restassured\norg.spockframework\norg.testcontainers\ncom.google.common.truth\ncom.dexvis.dex\norg.gephi\ncom.google.common\nru.lanwen.verbalregex\nio.minio\ncom.github.underscore\nedu.uci.ics.crawler4j\ncom.blade"
  },
  {
    "path": "src/main/resources/data/libraries/js_libraries.txt",
    "content": "react\nd3\nvue\nsvelte\nangular\njquery\nmeteor\nsocketio\nthree\nexpress\nredux\nmoment\nmaterial-ui\njquery-file-upload\nlodash\naxios\nreact-router\nasync\nunderscore\nfullpage\nimmutable\npdf\nember\nkoa\nrequest\npostcss\nangular\nmaterial\nfetch\npjax\npug\nless\nbootstrap\nflux\nq\nmongoose\nmocha\nhandlebars\nriot\ntesseract\npassport\nbrowserify\nmustache\nsequelize\nreact-bootstrap\njquery-ui\njquery-mobile\nmysql\ndatepicker\nsmartcrop\nnormalizr\nvuex\nreact-redux\nknockout\nwtf\njquery-cookie\nredis\nwinston\nvalidate\ngql\ngraphql\nuglify\nhttp-proxy\npurify\nng-file-upload"
  },
  {
    "path": "src/main/resources/data/libraries/kotlin_libraries.txt",
    "content": "com.winterbe.expekt\ncom.github.vassilibykov.adventkt\nme.lazmaid.kraph\ncom.github.kittinunf.fuel\nimgui\norg.mapdb\nuy.kohesive.kovert\nio.reactivex.rxkotlin\ncom.compass.snail\nio.kweb\ncom.github.andrewoma.kwery\ncom.github.pgutkowski.kgraphql\nio.vertx\norg.spekframework.spek2\ncom.oneeyedmen.konsent\ncom.github.salomonbrys.kotson\norg.jire.kton\nio.kotlintest\nktx\norg.kotlinprimavera\norg.kottpd\ncom.almasb.fxgl\norg.wasabifx.wasabi\ncom.fboldog.ext4klaxon\nnet.yested\nua.com.lavi.komock\nkotlinx.nosql\nspark\ncom.github.kittinunf.result\ncom.nivabit.kuery\nio.thelandscape.krawler\nio.tekniq\ncom.beust.klaxon\ncom.github.shyiko.levelkt\nio.javalin\nkategory\ntornadofx\nkotliquery\nkhttp\novr\ncom.hexagonkt\ncom.nhaarman.mockito_kotlin\nio.ktor\ncom.codepoetics.klenses\nio.polymorphicpanda.kspec\ncom.natpryce.hamkrest\norg.http4k\ncom.vaadin\nio.mockk\nkara\norg.funktionale\ncom.github.fluidsonic.fluid.json\ncom.squareup.sqldelight\norg.amshove.kluent\ncom.danneu.kog\norg.jetbrains.exposed"
  },
  {
    "path": "src/test/delete_repo.sh",
    "content": "for REPO_PATH in tmp_repo original_repo forked_repo; do \n    rm -rf $REPO_PATH\ndone\n"
  },
  {
    "path": "src/test/kotlin/test/tests/extractors/DirToLangMap.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage test.tests.extractors\n\n// Special cases, when language code name is not a dir name in lower case.\nval dirToLangMap = mapOf(\n    \"DOS Batch\" to \"dosbatch\",\n    \"C#\" to \"csharp\",\n    \"C++\" to \"cpp\",\n    \"Common Lisp\" to \"lisp\",\n    \"F#\" to \"fsharp\",\n    \"Filebench WML\" to \"filebench_wml\",\n    \"Objective-C\" to \"objectivec\",\n    \"Perl 6\" to \"perl6\",\n    \"POV-Ray SDL\" to \"pov-ray_sdl\",\n    \"Ren'Py\" to \"renpy\",\n    \"Visual Basic\" to \"visualbasic\",\n    \"Wolfram Language\" to \"wolframlanguage\",\n    \"DM\" to \"dm\"\n)\n"
  },
  {
    "path": "src/test/kotlin/test/tests/extractors/ExtractorTest.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage test.tests.extractors\n\nimport app.extractors.*\nimport junit.framework.TestCase.assertTrue\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\nimport org.jetbrains.spek.api.dsl.xit\nimport kotlin.test.assertEquals\nimport kotlin.test.assertNull\n\nfun assertExtractsLineLibraries(expectedLibrary: String, actualLine: String,\n                                extractor: ExtractorInterface) {\n    val actualLineLibraries =\n        extractor.determineLibs(actualLine, listOf(expectedLibrary))\n    assertTrue(expectedLibrary in actualLineLibraries)\n}\n\nfun assertExtractsNoLibraries(actualLine: String,\n                              extractor: ExtractorInterface) {\n    val actualLineLibraries =\n        extractor.determineLibs(actualLine, listOf())\n    assertEquals(listOf(), actualLineLibraries)\n}\n\nfun assertExtractsImport(expectedImport: String, actualLine: String,\n                         extractor: ExtractorInterface) {\n    val actualLineImport = extractor.extractImports(listOf(actualLine))\n    assertTrue(expectedImport in actualLineImport)\n}\n\nfun assertMapsIndex(expectedIndex: String, actualImport: String,\n                    language: String, extractor: ExtractorInterface) {\n    val actualIndex = extractor.mapImportToIndex(actualImport, language)\n    assertEquals(expectedIndex, actualIndex)\n}\n\nfun assertMapsNothing(actualImport: String, language: String,\n                      extractor: ExtractorInterface) {\n    val actualIndex = extractor.mapImportToIndex(actualImport, language)\n    assertNull(actualIndex)\n}\n\nclass ExtractorTest : Spek({\n    given(\" code line contains library code\" ) {\n        it(\"python extractor extracts the library\") {\n            val line = \"with tf.Session() as sess\"\n            assertExtractsLineLibraries(\"py.tensorflow\",\n                line, PythonExtractor())\n        }\n\n        it(\"java extractor extracts the library\") {\n            val line = \"Parcelable wrapped = Parcels.wrap(new Example(\\\"Andy\\\", 42));\"\n            assertExtractsLineLibraries(\"java.parceler\",\n                line, JavaExtractor())\n        }\n\n        it(\"javascript extractor extracts the library\") {\n            val line = \"new Vue({\"\n            assertExtractsLineLibraries(\"js.vue\",\n                line, JavascriptExtractor())\n        }\n\n        it(\"typescript extractor extracts the library\") {\n            val line = \"new Vue({\"\n            assertExtractsLineLibraries(\"js.vue\",\n                    line, TypescriptExtractor())\n        }\n\n        it(\"ruby extractor extracts the library\") {\n            val line1 = \"img = Magick::Image.read_inline(Base64.encode64(image)).first\"\n            assertExtractsLineLibraries(\"rb.rmagick\",\n                line1, RubyExtractor())\n            val line2 = \"fximages << {image: img.adaptive_threshold(3, 3, 0), name: \\\"Adaptive Threshold\\\"}\"\n            assertExtractsLineLibraries(\"rb.rmagick\",\n                line2, RubyExtractor())\n        }\n\n        it(\"go extractor extracts the library\") {\n            val line = \"if DB, found = revel.Config.String(\\\"bloggo.db\\\"); !found {\"\n            assertExtractsLineLibraries(\"go.revel\",\n                line, GoExtractor())\n        }\n\n        it(\"objectiveC extractor extracts the library\") {\n            val line = \"[[NSFileManager defaultManager] removeItemAtURL:[RLMRealmConfiguration defaultConfiguration].fileURL error:nil];\"\n            assertExtractsLineLibraries(\"objc.realm\",\n                line, ObjectiveCExtractor())\n        }\n\n        it(\"cpp extractor extracts the library\") {\n            val line1 = \"leveldb::Options options;\"\n            assertExtractsLineLibraries(\"cpp.level-db\",\n                line1, CppExtractor())\n            val line2 = \"leveldb::Status status = leveldb::DB::Open(options, \\\"./testdb\\\", &tmp);\"\n            assertExtractsLineLibraries(\"cpp.level-db\",\n                line2, CppExtractor())\n        }\n\n        it(\"csharp extractor extracts the library\") {\n            val line = \"Algorithm = (h, v, i) => new ContrastiveDivergenceLearning(h, v)\"\n            assertExtractsLineLibraries(\"cs.accord-net\",\n                line, CSharpExtractor())\n        }\n\n        it(\"fsharp extractor extracts the library\") {\n            val line = \"Algorithm = fun (h, v, i) -> ContrastiveDivergenceLearning(h, v)\"\n            assertExtractsLineLibraries(\"cs.accord-net\",\n                line, FSharpExtractor())\n        }\n\n        it(\"php extractor extracts the library\") {\n            val line = \"public function listRepos(string \\$user, int \\$limit): Call;\"\n            assertExtractsLineLibraries(\"php.retrofit-php\",\n                line, PhpExtractor())\n        }\n\n        xit(\"c extractor extracts the library\") {\n            val line = \"grpc_test_init(argc, argv);\"\n            assertExtractsLineLibraries(\"c.grpc\",\n                line, CExtractor())\n        }\n\n        it(\"kotlin extractor extracts the library\") {\n            val line = \"FuelManager.instance.apply {\"\n            assertExtractsLineLibraries(\"kt.fuel\",\n                line, KotlinExtractor())\n        }\n\n        it(\"ruby extractor extracts rails\") {\n            val line = \"class Article < ActiveRecord::Base\"\n            assertExtractsLineLibraries(\"rb.rails\",\n                line, RubyExtractor())\n        }\n    }\n\n    given(\"code line doesn't use libraries\" ) {\n        it(\"python extractor returns empty list\") {\n            val line = \"from collections import Counter\"\n            assertExtractsNoLibraries(line, PythonExtractor())\n        }\n\n        it(\"java extractor returns empty list\") {\n            val line = \"throw new RuntimeException(e);\"\n            assertExtractsNoLibraries(line, JavaExtractor())\n        }\n\n        it(\"javascript extractor returns empty list\") {\n            val line = \"console.log(self.commits[0].html_url)\"\n            assertExtractsNoLibraries(line, JavascriptExtractor())\n        }\n\n        it(\"ruby extractor returns empty list\") {\n            val line = \"require \\\"RMagick\\\"\"\n            assertExtractsNoLibraries(line, RubyExtractor())\n        }\n\n        it(\"go extractor returns empty list\") {\n            val line = \"var found bool\"\n            assertExtractsNoLibraries(line, GoExtractor())\n        }\n\n        it(\"objectivec extractor returns empty list\") {\n            val line = \"@end\"\n            assertExtractsNoLibraries(line, ObjectiveCExtractor())\n        }\n\n        it(\"php extractor returns empty list\") {\n            val line = \"<?php\"\n            assertExtractsNoLibraries(line, PhpExtractor())\n        }\n\n        it(\"csharp extractor returns empty list\") {\n            val line = \"static void Main(string[] args)\"\n            assertExtractsNoLibraries(line, CSharpExtractor())\n        }\n\n        it(\"fsharp extractor returns empty list\") {\n            val line = \"let main()\"\n            assertExtractsNoLibraries(line, FSharpExtractor())\n        }\n\n        it(\"cpp extractor returns empty list\") {\n            val line = \"std::cerr << status.ToString() << std::endl;\"\n            assertExtractsNoLibraries(line, CppExtractor())\n        }\n\n        it(\"c extractor returns empty list\") {\n            val line = \"int main(int argc, char **argv) {\"\n            assertExtractsNoLibraries(line, CExtractor())\n        }\n\n        it(\"kotlin extractor returns empty list\") {\n            val line = \"val password = \\\"P@\\$\\\\\\$vv0|2|)\\\"\"\n            assertExtractsNoLibraries(line, KotlinExtractor())\n        }\n    }\n\n    given(\"line contains import\") {\n        it(\"kotlin extractor extracts import\") {\n            val import = \"kategory.optics.\"\n            val line = \"import $import*\"\n            assertExtractsImport(import, line, KotlinExtractor())\n        }\n    }\n\n    given(\"import cv2 or cv\") {\n        it(\"extracts import\") {\n            val line1 = \"import cv2\"\n            assertExtractsImport(\"cv2\", line1, PythonExtractor())\n            val line2 = \"import cv\"\n            assertExtractsImport(\"cv\", line2, PythonExtractor())\n        }\n    }\n\n    given(\"Go\") {\n        it(\"one line import\") {\n            val import = \"macagon\"\n            val line = \"import \\\"macagon\\\"\"\n            assertExtractsImport(import, line, GoExtractor())\n        }\n        it(\"multiline import\") {\n            val import = \"macagon\"\n            val lines = listOf(\"import (\",\n                    \"\\\"macagon\\\"\",\n                    \"\\\"github.com/astaxie/beego\\\"\",\n                    \")\")\n            val actualLineImports = GoExtractor().extractImports(lines)\n            assertTrue(import in actualLineImports)\n        }\n        it(\"github url as import\") {\n            val url = \"github.com/astaxie/beego\"\n            val lines = listOf(\"import (\",\n                    \"\\\"macagon\\\"\", \"\\\"\" + url + \"\\\"\", \")\")\n            val actualLineImports = GoExtractor().extractImports(lines)\n            assertTrue(url in actualLineImports)\n        }\n        it(\"class from url\") {\n            val url = \"github.com/medium/medium-sdk-go\"\n            val lines = listOf(\"import (\",\n                    \"medium \\\"$url\\\"\", \"log\", \")\")\n            val actualLineImports = GoExtractor().extractImports(lines)\n            assertTrue(url in actualLineImports)\n        }\n        it(\"maps import to library index\") {\n            val url = \"github.com/docker/docker/integration-cli/checker\"\n            val lines = listOf(\"import \\\"$url\\\"\")\n            val actualImport = GoExtractor().extractImports(lines)[0]\n            assertMapsIndex(\"go.docker\", actualImport, Lang.GO, GoExtractor())\n        }\n    }\n\n    given(\"Dart\") {\n        it(\"Dart single-line comment\") {\n            var lines = listOf(\"// import 'dart:math';\")\n            var actualLineImports = DartExtractor.extractImports(lines)\n            actualLineImports.forEach {\n                assertMapsNothing(it, Lang.DART, DartExtractor)\n            }\n        }\n        it(\"Dart multi-line comment\") {\n            var lines = listOf(\"/* import 'dart:math'; */\")\n            var actualLineImports = DartExtractor.extractImports(lines)\n            actualLineImports.forEach {\n                assertMapsNothing(it, Lang.DART, DartExtractor)\n            }\n        }\n        it(\"Dart import\") {\n            var line = \"import 'dart:math';\"\n            val import = \"dart:math\"\n            assertExtractsImport(import, line, DartExtractor)\n        }\n    }\n\n    given(\"js comment line\") {\n        it(\"doesn't extract libraries\") {\n            var lines = listOf(\"// It doesn't use Ember 1\")\n            val extractor = JavascriptExtractor()\n            var actualLineImports = extractor.extractImports(lines)\n            actualLineImports.forEach {\n                assertMapsNothing(it, Lang.JAVASCRIPT, extractor)\n            }\n\n            lines = listOf(\"/* It doesn't use ember 2\", \"* and you Ember \",\n                \"* too Ember */\")\n            actualLineImports = extractor.extractImports(lines)\n            actualLineImports.forEach {\n                assertMapsNothing(it, Lang.JAVASCRIPT, extractor)\n            }\n        }\n    }\n\n    given(\"Cpp\") {\n        it(\"imports name.h\") {\n            val import = \"protobuf.h\"\n            val line = \"#include \\\"$import\\\"\"\n            assertExtractsImport(import, line, CppExtractor())\n        }\n\n        it(\"imports library with multiple ways to import\") {\n            val lib = \"cpp.open-cv\"\n            val import1 = \"opencv/module/header.h\"\n            val import2 = \"opencv2/module/header.h\"\n            val line1 = \"#include \\\"$import1\\\"\"\n            val line2 = \"#include \\\"$import2\\\"\"\n            val extractor = CppExtractor()\n\n            assertExtractsImport(import1, line1, extractor)\n            assertExtractsImport(import2, line2, extractor)\n\n            var actualImport = extractor.extractImports(listOf(line1))[0]\n            assertMapsIndex(lib, actualImport, Lang.CPP, extractor)\n            actualImport = extractor.extractImports(listOf(line2))[0]\n            assertMapsIndex(lib, actualImport, Lang.CPP, extractor)\n\n        }\n\n        it(\"extracts Qt library\") {\n            val lib = \"cpp.qt\"\n            val import = \"QFileDialog\"\n            val line = \"#include <$import>\"\n            val extractor = CppExtractor()\n            assertExtractsImport(import, line, extractor)\n            val actualImport = extractor.extractImports(listOf(line))[0]\n            assertMapsIndex(lib, actualImport, Lang.CPP, extractor)\n        }\n    }\n\n    given(\"Crystal\") {\n        it(\"Crystal require\") {\n            var line = \"require \\\"kemal\\\"\"\n            assertExtractsImport(\"kemal\", line, CrystalExtractor())\n        }\n\n        it(\"Crystal include\") {\n            var line = \"  include JSON::Serializable\"\n            assertExtractsImport(\"json\", line, CrystalExtractor())\n        }\n\n        it(\"Crystal comment\") {\n            var lines = listOf(\"# include JSON::Serializable\")\n            val extractor = CrystalExtractor()\n            var actualLineImports = extractor.extractImports(lines)\n            actualLineImports.forEach {\n                assertMapsNothing(it, Lang.CRYSTAL, extractor)\n            }\n        }\n    }\n\n    given(\"Elixir\") {\n        it(\"Elixir comment\") {\n            var lines = listOf(\"# use Ecto.Repo\")\n            var actualLineImports = ElixirExtractor.extractImports(lines)\n            actualLineImports.forEach {\n                assertMapsNothing(it, Lang.ELIXIR, ElixirExtractor)\n            }\n        }\n        it(\"Elixir use\") {\n            var line = \" use Ecto.Repo\"\n            val import = \"Ecto\"\n            assertExtractsImport(import, line, ElixirExtractor)\n        }\n        it(\"Elixir import\") {\n            var line = \" import Ecto.Repo\"\n            val import = \"Ecto\"\n            assertExtractsImport(import, line, ElixirExtractor)\n        }\n        it(\"Elixir require\") {\n            var line = \" require Ecto.Repo\"\n            val import = \"Ecto\"\n            assertExtractsImport(import, line, ElixirExtractor)\n        }\n    }\n\n    given(\"Perl\") {\n        it(\"Perl single-line comment\") {\n            var lines = listOf(\"#use Test::Base;\")\n            var actualLineImports = PerlExtractor(Lang.PERL).extractImports(lines)\n            assertTrue(actualLineImports.isEmpty())\n        }\n        it(\"Perl use\") {\n            var line = \"\"\"use Test::Base;\"\"\"\n            val import = \"Test::Base\"\n            assertExtractsImport(import, line, PerlExtractor(Lang.PERL))\n        }\n        it(\"Perl import with string\") {\n            var line = \"use Dancer2 ':syntax';\"\n            val import = \"Dancer2 ':syntax'\"\n            assertExtractsImport(import, line, PerlExtractor(Lang.PERL))\n        }\n        it(\"maps import\") {\n            val import = \"Dancer2 ':syntax'\"\n            assertMapsIndex(\"perl.Dancer2\", import, Lang.PERL,\n                PerlExtractor(Lang.PERL))\n        }\n        it(\"maps import in perl6 language\") {\n            val import = \"Dancer2 ':syntax'\"\n            assertMapsIndex(\"perl.Dancer2\", import, Lang.PERL6,\n                PerlExtractor(Lang.PERL6))\n        }\n    }\n\n    given(\"PLpgSQL\") {\n        it(\"PLpgSQL single-line comment\") {\n            var lines = listOf(\"-- CREATE EXTENSION ltree\")\n            var actualLineImports = PlpgsqlExtractor.extractImports(lines)\n            actualLineImports.forEach {\n                assertMapsNothing(it, Lang.PLPGSQL, PlpgsqlExtractor)\n            }\n        }\n        it(\"PLpgSQL multi-line comment\") {\n            var lines = listOf(\"/* CREATE EXTENSION ltree */\")\n            var actualLineImports = PlpgsqlExtractor.extractImports(lines)\n            actualLineImports.forEach {\n                assertMapsNothing(it, Lang.PLPGSQL, PlpgsqlExtractor)\n            }\n        }\n        it(\"PLpgSQL extension\") {\n            var line = \"\"\" execute(\"CREATE EXTENSION ltree\")\"\"\"\n            val import = \"ltree\"\n            assertExtractsImport(import, line, PlpgsqlExtractor)\n        }\n        it(\"PLpgSQL language\") {\n            var line = \"\"\" execute(\"CREATE LANGUAGE plr\")\"\"\"\n            val import = \"plr\"\n            assertExtractsImport(import, line, PlpgsqlExtractor)\n        }\n    }\n\n    given(\"Ruby\") {\n        it(\"Ruby imports\") {\n            var line = \"require 'dry-monads'\"\n            assertExtractsImport(\"dry-monads\", line, RubyExtractor())\n            line = \"  include Apotomo::Rails::ControllerMethods\"\n            assertExtractsImport(\"apotomo\", line, RubyExtractor())\n        }\n    }\n\n    given(\"Rust\") {\n        it(\"Rust imports\") {\n            var lines = listOf(\n                    \"extern crate foo;\",\n                    \"extern crate boo;\"\n            )\n            var actualLineImports = RustExtractor().extractImports(lines)\n            assertEquals(actualLineImports, listOf(\"foo\", \"boo\"))\n\n            lines = listOf(\n                    \"// extern crate foo;\",\n                    \"/* extern crate boo; */\"\n            )\n            actualLineImports = RustExtractor().extractImports(lines)\n            assertTrue(actualLineImports.isEmpty())\n        }\n    }\n\n    given(\"Scala\") {\n        it(\"Scala single-line comment\") {\n            val lines = listOf(\"// import users._\")\n            val actualLineImports = ScalaExtractor.extractImports(lines)\n            assertTrue(actualLineImports.isEmpty())\n        }\n        it(\"Scala multi-line comment\") {\n            val lines = listOf(\"/* import users._ */\")\n            val actualLineImports = ScalaExtractor.extractImports(lines)\n            assertTrue(actualLineImports.isEmpty())\n        }\n        it(\"Scala imports\") {\n            val line = \"import users._\"\n            assertExtractsImport(\"users.\", line, ScalaExtractor)\n        }\n        it(\"Scala imports _root_\") {\n            val line = \"import _root_.users._\"\n            assertExtractsImport(\"users.\", line, ScalaExtractor)\n        }\n        it(\"Scala imports compound name\") {\n            val line = \"import com.google.selfdrivingcar.camera.Lens\"\n            assertExtractsImport(\"com.google.selfdrivingcar.camera.\", line,\n                    ScalaExtractor)\n        }\n        it(\"Scala imports multiple import\") {\n            val line = \"import akka.stream.scaladsl.{Flow, Sink, Source}\"\n            assertExtractsImport(\"akka.stream.scaladsl.\", line, ScalaExtractor)\n        }\n        it(\"maps import to index\") {\n            val lib = \"scala.slick\"\n            val line = \"import slick.jdbc.JdbcProfile\"\n            val extractor = ScalaExtractor\n\n            assertExtractsImport(\"slick.jdbc.\", line, extractor)\n\n            val actualImport = extractor.extractImports(listOf(line))[0]\n            assertMapsIndex(lib, actualImport, Lang.SCALA, extractor)\n        }\n    }\n\n    given(\"Swift\") {\n        it(\"Swift single-line comment\") {\n            val lines = listOf(\"// class City: RLMObject {\")\n            val actualLineImports = SwiftExtractor.extractImports(lines)\n            assertTrue(actualLineImports.isEmpty())\n        }\n        it(\"Swift multi-line comment\") {\n            val lines = listOf(\"/* class City: RLMObject { */\")\n            val actualLineImports = SwiftExtractor.extractImports(lines)\n            assertTrue(actualLineImports.isEmpty())\n        }\n        it(\"Swift imports\") {\n            val line = \"import UIKit\"\n            assertExtractsImport(\"UIKit\", line, SwiftExtractor)\n        }\n        it(\"Swift no libraries\") {\n            val line = \"import Foundation\"\n            assertExtractsNoLibraries(line, SwiftExtractor)\n        }\n        it(\"Swift libraries\") {\n            val line = \"class City: RLMObject {\"\n            assertExtractsLineLibraries(\"swift.realm\", line, SwiftExtractor)\n        }\n    }\n})\n"
  },
  {
    "path": "src/test/kotlin/test/tests/extractors/HeuristicsTest.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage test.tests.extractors\n\nimport app.model.DiffFile\nimport app.model.DiffContent\nimport app.extractors.*\nimport app.model.DiffRange\nimport org.apache.commons.io.FilenameUtils\nimport org.eclipse.jgit.diff.DiffEntry.ChangeType\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\nimport java.io.File\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFalse\nimport kotlin.test.assertNotEquals\nimport kotlin.test.assertTrue\n\nconst val LANG_SAMPLES_PATH = \"src/test/resources/samples/langs/\"\nconst val DEVOPS_SAMPLES_PATH = \"src/test/resources/samples/devops/\"\n\nfun assertLang(file: File, expectedLang: String) {\n    val diffFile = DiffFile(\n        file.path,\n        changeType = ChangeType.ADD,\n        new = DiffContent(content = file.readLines())\n        // TODO(anatoly): Should we specify ranges here?\n    )\n    Extractor().extract(listOf(diffFile))\n\n    val actualLang = diffFile.lang\n\n    // TODO(anatoly): Add support for all languages of samples.\n    var todoSample = false\n    for (wc in ignoredSamplesWildcards) {\n        if (FilenameUtils.wildcardMatchOnSystem(file.path, wc)) {\n            todoSample = true\n            break\n        }\n    }\n\n    if (todoSample) {\n        assertNotEquals(expectedLang, actualLang, \"Unexpected lang for ${file.path}\")\n    }\n    else {\n        assertEquals(expectedLang, actualLang, \"Unexpected lang for ${file.path}\")\n    }\n}\n\nfun assertTech(file: File, expectedTech: String) {\n    val content = file.readLines()\n    val diffFile = DiffFile(\n        file.path,\n        changeType = ChangeType.ADD,\n        new = DiffContent(\n            content = content,\n            ranges = listOf(DiffRange(start = 0, end = content.size))\n        )\n    )\n\n    val stats = Extractor().extract(listOf(diffFile))\n\n    assertFalse(\"No stats for $file\") {\n        stats.isEmpty()\n    }\n\n    assertTrue(\"Wrong type for $file\") {\n        stats.first().type == ExtractorInterface.TYPE_LIBRARY\n    }\n\n    val actualTech = stats.first().tech\n\n    assertEquals(expectedTech, actualTech, \"Unexpected tech for ${file.path}\")\n}\n\nclass HeuristicsTest : Spek({\n    given(\"heuristics test\") {\n        it(\"all language samples\") {\n            for (dir in File(LANG_SAMPLES_PATH).listFiles()) {\n                val expectedLang = dirToLangMap.getOrDefault(\n                    dir.name, dir.name.toLowerCase()\n                )\n                for (file in dir.walkTopDown()) {\n                    if (file.isFile) assertLang(file, expectedLang)\n                }\n            }\n        }\n        it(\"all devops samples\") {\n            for (dir in File(DEVOPS_SAMPLES_PATH).listFiles()) {\n                val expectedTech = DevopsExtractor.DEVOPS + dir.name\n\n                for (file in dir.walkTopDown()) {\n                    if (!file.isFile) continue\n\n                    var skip = false\n                    for (wc in ignoredSamplesWildcards) {\n                        if (FilenameUtils.wildcardMatchOnSystem(file.path,\n                                wc)) {\n                            skip = true\n                            break\n                        }\n                    }\n                    if (skip) break\n\n                    assertTech(file, expectedTech)\n                }\n            }\n        }\n    }\n})\n"
  },
  {
    "path": "src/test/kotlin/test/tests/extractors/IgnoredSamplesWildcards.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage test.tests.extractors\n\n/**\n * A list of all file names whose language recognition needs to be checked\n * or fixed.\n */\nvar ignoredSamplesWildcards = listOf(\n    \"*/.DS_Store\",\n    \"*/1C Enterprise/*\",\n    \"*/ABAP/*\",\n    \"*/AppleScript/*\",\n    \"*/Apex/*\",\n    \"*/APL/*\",\n    \"*/API Blueprint/*\",\n    \"*/Alloy/*\",\n    \"*/Apollo Guidance Computer/*\",\n    \"*/ASN.1/*\",\n    \"*/Awk/*\",\n    \"*/Ant Build System/*\",\n    \"*/Alpine Abuild/*\",\n    \"*/AspectJ/*\",\n    \"*/AMPL/*\",\n    \"*/AutoHotkey/*\",\n    \"*/AsciiDoc/*\",\n    \"*/Agda/*\",\n    \"*/ATS/*\",\n    \"*/ApacheConf/*\",\n    \"*/AGS Script/*\",\n    \"*/Adobe Font Metrics/*\",\n    \"*/Brightscript/*\",\n    \"*/Bluespec/*\",\n    \"*/Blade/*\",\n    \"*/Brainfuck/*\",\n    \"*/BlitzBasic/*\",\n    \"*/BitBake/*\",\n    \"*/Ballerina/*\",\n    \"*/BlitzMax/*\",\n    \"*/C/script\",\n    \"*/C/*.cats\",\n    \"*/C/jni_layer.h\",\n    \"*/C++/Field.h\",\n    \"*/C++/rpc.h\",\n    \"*/C++/*.inc\",\n    \"*/C++/*.re\",\n    \"*/C++/*.ino\",\n    \"*/C++/*.ipp\",\n    \"*/CartoCSS/*.mss\",\n    \"*/CLIPS/*\",\n    \"*/CMake/*\",\n    \"*/COBOL/*.ccp\",\n    \"*/CSON/*\",\n    \"*/CSV/*\",\n    \"*/CWeb/*\",\n    \"*/CartoCSS/*\",\n    \"*/Ceylon/*\",\n    \"*/Chapel/*\",\n    \"*/Charity/*\",\n    \"*/Cirru/*\",\n    \"*/Clarion/*\",\n    \"*/Clean/*\",\n    \"*/Click/*\",\n    \"*/Closure Templates/*\",\n    \"*/CoNLL-U/*\",\n    \"*/CoffeeScript/*.cake\",\n    \"*/CoffeeScript/*.cjsx\",\n    \"*/ColdFusion/*\",\n    \"*/ColdFusion CFC/*\",\n    \"*/Common Workflow Language/*\",\n    \"*/Component Pascal/*\",\n    \"*/Cool/*\",\n    \"*/Creole/*\",\n    \"*/Csound/*\",\n    \"*/Csound Document/*\",\n    \"*/Csound Score/*\",\n    \"*/Cycript/*\",\n    \"*/DIGITAL Command Language/*\",\n    \"*/DNS Zone/*\",\n    \"*/DataWeave/*\",\n    \"*/Diff/*\",\n    \"*/Dockerfile/*\",\n    \"*/Dogescript/*\",\n    \"*/E/*\",\n    \"*/EBNF/*\",\n    \"*/ECL/*\",\n    \"*/ECLiPSe/*\",\n    \"*/EJS/*\",\n    \"*/EQ/*\",\n    \"*/Eagle/*\",\n    \"*/Easybuild/*\",\n    \"*/Edje Data Collection/*\",\n    \"*/Eiffel/*\",\n    \"*/Elixir/filenames/*\",\n    \"*/Emacs Lisp/*\",\n    \"*/EmberScript/*\",\n    \"*/Erlang/*.es\",\n    \"*/Erlang/*.src\",\n    \"*/Erlang/*.escript\",\n    \"*/Erlang/factorial\",\n    \"*/Erlang/release\",\n    \"*/Erlang/*.xrl\",\n    \"*/Erlang/filenames/*\",\n    \"*/Erlang/*.yrl\",\n    \"*/FLUX/*\",\n    \"*/Fantom/*\",\n    \"*/Formatted/*\",\n    \"*/FreeMarker/*\",\n    \"*/Frege/*\",\n    \"*/G-code/*\",\n    \"*/GAMS/*\",\n    \"*/GAP/*\",\n    \"*/GCC Machine Description/*\",\n    \"*/GDB/*\",\n    \"*/GDScript/*\",\n    \"*/GN/*\",\n    \"*/Game Maker Language/*\",\n    \"*/Genie/*\",\n    \"*/Gerber Image/*\",\n    \"*/Gnuplot/*\",\n    \"*/Golo/*\",\n    \"*/Gosu/*\",\n    \"*/Grace/*\",\n    \"*/Grammatical Framework/*\",\n    \"*/Graph Modeling Language/*\",\n    \"*/GraphQL/*\",\n    \"*/Graphviz (DOT)/*\",\n    \"*/Groovy/*\",\n    \"*/Groovy Server Pages/*\",\n    \"*/HCL/*\",\n    \"*/HLSL/*\",\n    \"*/HTML/*.inc\",\n    \"*/HTML/*.hl\",\n    \"*/HTML/*.st\",\n    \"*/HTML/*.xht\",\n    \"*/HTML+Django/*\",\n    \"*/HTML+ECR/*\",\n    \"*/HTML+EEX/*\",\n    \"*/HTML+ERB/*\",\n    \"*/HXML/*\",\n    \"*/Hack/*.hh\",\n    \"*/Haml/*\",\n    \"*/Handlebars/*\",\n    \"*/HyPhy/*\",\n    \"*/IGOR Pro/*\",\n    \"*/INI/filenames/*.spec\",\n    \"*/INI/filenames/.editorconfig\",\n    \"*/INI/filenames/.gitconfig\",\n    \"*/Idris/*\",\n    \"*/Inform 7/*\",\n    \"*/Inno Setup/*\",\n    \"*/Ioke/*\",\n    \"*/Isabelle/*\",\n    \"*/Isabelle ROOT/*\",\n    \"*/J/hashbang\",\n    \"*/JFlex/*\",\n    \"*/JSON/*\",\n    \"*/JSON5/*\",\n    \"*/JSONLD/*\",\n    \"*/JSONiq/*\",\n    \"*/JSX/*\",\n    \"*/Jasmin/*\",\n    \"*/JavaScript/*.mjs\",\n    \"*/JavaScript/*.xsjs\",\n    \"*/JavaScript/*.jscad\",\n    \"*/JavaScript/js\",\n    \"*/JavaScript/jquery-1.4.2.min.js\",\n    \"*/JavaScript/jquery-1.6.1.min.js\",\n    \"*/JavaScript/*.gs\",\n    \"*/JavaScript/*.es\",\n    \"*/JavaScript/*.jsb\",\n    \"*/JavaScript/*.frag\",\n    \"*/JavaScript/*.xsjslib\",\n    \"*/JavaScript/js2\",\n    \"*/Jison/*\",\n    \"*/Jison Lex/*\",\n    \"*/Jolie/*\",\n    \"*/Julia/julia\",\n    \"*/KRL/*\",\n    \"*/KiCad Layout/*\",\n    \"*/KiCad Legacy Layout/*\",\n    \"*/KiCad Schematic/*\",\n    \"*/Kit/*\",\n    \"*/LFE/*\",\n    \"*/LOLCODE/*\",\n    \"*/LSL/*\",\n    \"*/Lasso/*\",\n    \"*/Latte/*\",\n    \"*/Lean/*\",\n    \"*/Less/*\",\n    \"*/Linker Script/*\",\n    \"*/Linux Kernel Module/*\",\n    \"*/Liquid/*\",\n    \"*/Literate Agda/*\",\n    \"*/Literate CoffeeScript/*\",\n    \"*/LiveScript/*\",\n    \"*/Logos/*\",\n    \"*/Logtalk/*\",\n    \"*/LookML/*\",\n    \"*/LoomScript/*\",\n    \"*/M/mileage.m\",\n    \"*/M4/*\",\n    \"*/M4Sugar/*\",\n    \"*/MAXScript/*\",\n    \"*/MQL4/*\",\n    \"*/MQL5/*\",\n    \"*/MTML/*\",\n    \"*/Makefile/makefile\",\n    \"*/Makefile/filenames/*\",\n    \"*/Markdown/*\",\n    \"*/Marko/*\",\n    \"*/Mask/*\",\n    \"*/Matlab/CVX/functions/@cvx/functions.m\",\n    \"*/Matlab/CVX/functions/Contents.m\",\n    \"*/Maven POM/*\",\n    \"*/Max/*\",\n    \"*/MediaWiki/*\",\n    \"*/Mercury/expr.moo\",\n    \"*/Meson/*\",\n    \"*/Metal/*\",\n    \"*/Modelica/*\",\n    \"*/Modula-2/*\",\n    \"*/Module Management System/*\",\n    \"*/Monkey/*\",\n    \"*/Moocode/*\",\n    \"*/MoonScript/*\",\n    \"*/NCL/*\",\n    \"*/NL/*\",\n    \"*/NSIS/*\",\n    \"*/Nearley/*\",\n    \"*/Nemerle/*\",\n    \"*/NetLinx/*\",\n    \"*/NetLinx+ERB/*\",\n    \"*/NetLogo/*\",\n    \"*/Nextflow/*\",\n    \"*/Nginx/*\",\n    \"*/Nim/*\",\n    \"*/Nit/*\",\n    \"*/Nix/*\",\n    \"*/Nu/*\",\n    \"*/OCaml/sigset.ml\",\n    \"*/OCaml/common.ml\",\n    \"*/OCaml/date.ml\",\n    \"*/Objective-C/cocoa_monitor.m\",\n    \"*/Objective-C++/*\",\n    \"*/Objective-J/*\",\n    \"*/Omgrofl/*\",\n    \"*/Opa/*\",\n    \"*/Opal/*\",\n    \"*/OpenCL/*\",\n    \"*/OpenEdge ABL/*\",\n    \"*/OpenRC runscript/*\",\n    \"*/OpenSCAD/*\",\n    \"*/Org/*\",\n    \"*/Ox/*\",\n    \"*/Oz/*\",\n    \"*/P4/*\",\n    \"*/PAWN/*\",\n    \"*/PHP/*.fcgi\",\n    \"*/PHP/php*\",\n    \"*/PHP/filenames/.php_cs\",\n    \"*/PHP/filenames/.php_cs.dist\",\n    \"*/Pan/*\",\n    \"*/Papyrus/*\",\n    \"*/Parrot Assembly/*\",\n    \"*/Parrot Internal Representation/*\",\n    \"*/Pep8/*\",\n    \"*/Perl/perl\",\n    \"*/Perl/filenames/cpanfile\",\n    \"*/Perl/filenames/Rexfile\",\n    \"*/Perl/filenames/ack\",\n    \"*/Perl/feedgnuplot\",\n    \"*/Perl 6/man-or-boy.t\",\n    \"*/Pic/*\",\n    \"*/Pickle/*\",\n    \"*/PigLatin/*\",\n    \"*/Pike/*\",\n    \"*/Pod/*\",\n    \"*/PogoScript/*\",\n    \"*/Pony/*\",\n    \"*/PostCSS/*\",\n    \"*/PostScript/*\",\n    \"*/PowerBuilder/*\",\n    \"*/Prolog/dleak-report\",\n    \"*/Propeller Spin/*\",\n    \"*/Protocol Buffer/*\",\n    \"*/Public Key/*\",\n    \"*/Pug/*\",\n    \"*/PureBasic/*\",\n    \"*/PureScript/*\",\n    \"*/Python/*.pyi\",\n    \"*/Python/python*\",\n    \"*/Python/*.gypi\",\n    \"*/Python/filenames/*\",\n    \"*/Python/*.spec\",\n    \"*/Python/*.pyde\",\n    \"*/Python/*.cgi\",\n    \"*/Python/*.bzl\",\n    \"*/Python/*.pyp\",\n    \"*/Python/*.fcgi\",\n    \"*/QML/*\",\n    \"*/QMake/qmake\",\n    \"*/QMake/functions.pri\",\n    \"*/R/filenames/expr-dist\",\n    \"*/R/git-punchcard\",\n    \"*/RAML/*\",\n    \"*/RDoc/*\",\n    \"*/REXX/*\",\n    \"*/RMarkdown/*\",\n    \"*/RPC/*\",\n    \"*/RPM Spec/*\",\n    \"*/RUNOFF/*\",\n    \"*/Racket/*\",\n    \"*/Ragel/*\",\n    \"*/Rascal/*\",\n    \"*/Reason/*\",\n    \"*/Red/*\",\n    \"*/Regular Expression/*\",\n    \"*/Ring/*\",\n    \"*/RobotFramework/*\",\n    \"*/Ruby/*spec\",\n    \"*/Ruby/rexpl\",\n    \"*/Ruby/ruby*\",\n    \"*/Ruby/*jbuilder\",\n    \"*/Ruby/filenames/*\",\n    \"*/Ruby/*.fcgi\",\n    \"*/Ruby/*.rabl\",\n    \"*/Ruby/macruby\",\n    \"*/Ruby/*.rake\",\n    \"*/Ruby/shoes-swt\",\n    \"*/SCSS/*\",\n    \"*/SMT/*\",\n    \"*/SPARQL/*\",\n    \"*/SQF/*\",\n    \"*/SQL/hostcache_set_state.inc\",\n    \"*/SQL/AvailableInSearchSel.prc\",\n    \"*/SQLPL/check_reorg.sql\",\n    \"*/SQLPL/runstats.sql\",\n    \"*/SQLPL/sleep.sql\",\n    \"*/SQLPL/create_stuff.sql\",\n    \"*/SRecode Template/*\",\n    \"*/STON/*\",\n    \"*/Sage/*\",\n    \"*/SaltStack/*\",\n    \"*/Sass/*\",\n    \"*/Scala/99*\",\n    \"*/Scala/scala\",\n    \"*/Scaml/*\",\n    \"*/Scilab/*\",\n    \"*/ShaderLab/*\",\n    \"*/Shell/*.command\",\n    \"*/Shell/*zsh\",\n    \"*/Shell/99-bottles-of-beer\",\n    \"*/Shell/*cgi\",\n    \"*/Shell/plugin\",\n    \"*/Shell/*bash\",\n    \"*/Shell/sh\",\n    \"*/Shell/filenames/*\",\n    \"*/Shell/sbt\",\n    \"*/Shell/*.tool\",\n    \"*/Shell/string-chopping\",\n    \"*/ShellSession/*\",\n    \"*/Shen/*\",\n    \"*/Slash/*\",\n    \"*/Slim/*\",\n    \"*/Smali/*\",\n    \"*/SourcePawn/*\",\n    \"*/Squirrel/*\",\n    \"*/Stan/*\",\n    \"*/Standard ML/*\",\n    \"*/Stata/*\",\n    \"*/Stylus/*\",\n    \"*/SubRip Text/*\",\n    \"*/Sublime Text Config/*\",\n    \"*/SugarSS/*\",\n    \"*/SystemVerilog/*\",\n    \"*/TI Program/*\",\n    \"*/TLA/*\",\n    \"*/TOML/*\",\n    \"*/TXL/*\",\n    \"*/Tcl/filenames/starfield\",\n    \"*/Tcl/filenames/owh\",\n    \"*/Tcl/*.tm\",\n    \"*/Tea/*\",\n    \"*/Terra/*\",\n    \"*/Text/*\",\n    \"*/Thrift/*\",\n    \"*/Turing/*\",\n    \"*/Turtle/*\",\n    \"*/Type Language/*\",\n    \"*/Unity3D Asset/*\",\n    \"*/Unix Assembly/*\",\n    \"*/Uno/*\",\n    \"*/UnrealScript/*\",\n    \"*/UrWeb/*\",\n    \"*/VCL/*\",\n    \"*/VHDL/*\",\n    \"*/Vim script/*\",\n    \"*/Volt/*\",\n    \"*/Wavefront Material/*\",\n    \"*/Wavefront Object/*\",\n    \"*/Web Ontology Language/*\",\n    \"*/WebAssembly/*\",\n    \"*/WebIDL/*\",\n    \"*/World of Warcraft Addon Data/*\",\n    \"*/X10/*\",\n    \"*/XC/*\",\n    \"*/XCompose/*\",\n    \"*/XML/XmlIO.pluginspec\",\n    \"*/XML/*.wixproj\",\n    \"*/XML/*.proj\",\n    \"*/XML/*.sch\",\n    \"*/XML/*.mm\",\n    \"*/XML/*.config\",\n    \"*/XML/*.targets\",\n    \"*/XML/*.mod\",\n    \"*/XPages/*\",\n    \"*/XProc/*\",\n    \"*/XQuery/*\",\n    \"*/XS/*\",\n    \"*/XSLT/*\",\n    \"*/Xojo/*\",\n    \"*/YAML/*\",\n    \"*/YANG/*\",\n    \"*/YARA/*\",\n    \"*/Zephir/*\",\n    \"*/Zimpl/*\",\n    \"*/desktop/*\",\n    \"*/eC/*\",\n    \"*/edn/*\",\n    \"*/fish/*\",\n    \"*/reStructuredText/*\",\n    \"*/sed/*\",\n    \"*/wdl/*\",\n    \"*/wisp/*\",\n    \"*/xBase/*\"\n)\n"
  },
  {
    "path": "src/test/kotlin/test/tests/hashers/AuthorDistanceHasherTest.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage test.tests.hashers\n\nimport app.FactCodes\nimport app.api.MockApi\nimport app.hashers.AuthorDistanceHasher\nimport app.hashers.CommitCrawler\nimport app.model.Author\nimport app.model.AuthorDistance\nimport app.model.Fact\nimport app.model.Repo\nimport org.eclipse.jgit.api.Git\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\nimport test.utils.TestRepo\nimport java.io.File\nimport java.util.*\nimport kotlin.test.assertTrue\nimport kotlin.test.fail\n\nclass AuthorDistanceHasherTest : Spek({\n    given(\"repo with a file\") {\n        val testRepoPath = \"../author_distance_hasher\"\n        val testRepo = TestRepo(testRepoPath)\n        val serverRepo = Repo(rehash = \"test_repo_rehash\")\n        val api = MockApi(mockRepo = serverRepo)\n        val fileName = \"test1.txt\"\n        val author1 = Author(\"First Author\", \"first.author@gmail.com\")\n        val author2 = Author(\"Second Author\", \"second.author@gmail.com\")\n        val author3 = Author(\"Third Author\", \"third.author@gmail.com\")\n        val emails = hashSetOf(author1.email, author2.email, author3.email)\n\n        testRepo.createFile(fileName, listOf(\"line1\", \"line2\"))\n        testRepo.commit(message = \"initial commit\",\n                author = author1,\n                date = Calendar.Builder().setDate(2017, 1, 1).setTimeOfDay\n                (0, 0, 0).build().time)\n\n        testRepo.deleteLines(fileName, 1, 1)\n        testRepo.commit(message = \"delete second line\",\n                author = author2,\n                date = Calendar.Builder().setDate(2017, 1, 1).setTimeOfDay\n                (0, 1, 0).build().time)\n\n        testRepo.deleteLines(fileName, 0, 0)\n        testRepo.commit(message = \"delete first line\",\n                author = author1,\n                date = Calendar.Builder().setDate(2018, 1, 1).setTimeOfDay\n                (0, 1, 0).build().time)\n        testRepo.insertLines(fileName, 0, listOf(\"line1\"))\n        testRepo.commit(message = \"add first line\",\n                author = author3,\n                date = Calendar.Builder().setDate(2019, 1, 1).setTimeOfDay\n                (0, 1, 0).build().time)\n\n        val gitHasher = Git.open(File(testRepoPath))\n        it(\"extracts colleagues\") {\n            val observable = CommitCrawler.getJGitObservable(gitHasher,\n                extractCommit = false, extractDate = true,\n                extractDiffs = false, extractEmail = true,\n                extractPaths = true)\n            AuthorDistanceHasher(serverRepo, api, emails,\n                    hashSetOf(author2.email)).updateFromObservable(observable,\n                    onError = { _ -> fail(\"exception\") })\n\n            assertTrue(api.receivedDistances.contains(\n                    AuthorDistance(repo = serverRepo,\n                                   email = author1.email,\n                                   score = 1.0)))\n\n            assertTrue(api.receivedDistances.contains(\n                    AuthorDistance(repo = serverRepo,\n                                   email = author3.email,\n                                   score = 0.0)))\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n})\n"
  },
  {
    "path": "src/test/kotlin/test/tests/hashers/CodeLongevityTest.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage test.tests.hashers\n\nimport app.api.MockApi\nimport app.FactCodes\nimport app.hashers.CodeLine\nimport app.hashers.CodeLineAges\nimport app.hashers.CodeLongevity\nimport app.hashers.RevCommitLine\nimport app.model.*\n\nimport test.utils.TestRepo\n\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\nimport kotlin.test.fail\n\nimport org.eclipse.jgit.revwalk.RevCommit\n\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\n\nimport java.util.Calendar\nimport kotlin.test.assertNotNull\n\n/**\n * Testing class.\n */\nclass CodeLongevityTest : Spek({\n\n    /**\n     * Assert function to test RevCommitLine object.\n     */\n    fun assertRevCommitLine(expectedCommit: RevCommit,\n                            expectedFile: String,\n                            expectedLineNum: Int,\n                            actualLine: RevCommitLine,\n                            messsage: String = \"\") {\n\n        assertEquals(expectedCommit, actualLine.commit, \"$messsage commit\")\n        assertEquals(expectedFile, actualLine.file, \"$messsage file name\")\n        assertEquals(expectedLineNum, actualLine.line, \"$messsage line num\")\n    }\n\n    /**\n     * Assert function to test CodeLine object.\n     */\n    fun assertCodeLine(lineText: String, isDeleted: Boolean,\n                       fromCommit: RevCommit, fromFile: String,\n                       fromLineNum: Int, toCommit: RevCommit, toFile: String,\n                       toLineNum: Int, actualLine: CodeLine) {\n\n        assertRevCommitLine(fromCommit, fromFile, fromLineNum, actualLine.from,\n                            \"'$lineText' from_commit\")\n        assertRevCommitLine(toCommit, toFile, toLineNum, actualLine.to,\n                            \"'$lineText' to_commit\")\n\n        assertEquals(lineText, actualLine.text, \"line text\")\n        assertEquals(isDeleted, actualLine.isDeleted, \"'$lineText' \" +\n            \"line is deleted\")\n    }\n\n    Runtime.getRuntime().exec(\"rm -r ./.sourcerer/longevity\").waitFor()\n\n    given(\"'line collecting #1'\") {\n        val testRepoPath = \"../CodeLongevity_lc1\"\n        val testRepo = TestRepo(testRepoPath)\n        val fileName = \"test1.txt\"\n        val emails = hashSetOf(testRepo.userEmail)\n\n        // t1: initial insertion\n        testRepo.createFile(fileName, listOf(\"line1\", \"line2\"))\n        val rev1 = testRepo.commit(\"initial commit\")\n        val lines1 = CodeLongevity(Repo(), emails, testRepo.git)\n            .getLinesList(onError = { _ -> fail(\"exception\") })\n\n        it(\"'t1: initial insertion'\") {\n            assertEquals(2, lines1.size)\n            assertCodeLine(\"line1\", false,\n                           rev1, fileName, 0,\n                           rev1, fileName, 0,\n                           lines1[0])\n            assertCodeLine(\"line2\", false,\n                           rev1, fileName, 1,\n                           rev1, fileName, 1,\n                           lines1[1])\n        }\n\n        // t2: subsequent insertion\n        testRepo.insertLines(fileName, 1, listOf(\"line in the middle\"))\n        val rev2 = testRepo.commit(\"insert line\")\n        val lines2 = CodeLongevity(Repo(), emails, testRepo.git)\n            .getLinesList(onError = { _ -> fail(\"exception\") })\n\n        it(\"'t2: subsequent insertion'\") {\n            assertEquals(3, lines2.size)\n            assertCodeLine(\"line in the middle\", false,\n                           rev2, fileName, 1,\n                           rev2, fileName, 1,\n                           lines2[0])\n            assertCodeLine(\"line1\", false,\n                           rev1, fileName, 0,\n                           rev2, fileName, 0,\n                           lines2[1])\n            assertCodeLine(\"line2\", false,\n                           rev1, fileName, 1,\n                           rev2, fileName, 2,\n                           lines2[2])\n        }\n\n        // t3: subsequent deletion\n        testRepo.deleteLines(fileName, 2, 2)\n        val rev3 = testRepo.commit(\"delete line\")\n        val lines3 = CodeLongevity(Repo(), emails, testRepo.git)\n            .getLinesList(onError = { _ -> fail(\"exception\") })\n\n        it(\"'t3: subsequent deletion'\") {\n            assertEquals(3, lines3.size)\n            assertCodeLine(\"line in the middle\", false,\n                           rev2, fileName, 1,\n                           rev3, fileName, 1,\n                           lines3[0])\n            assertCodeLine(\"line1\", false,\n                           rev1, fileName, 0,\n                           rev3, fileName, 0,\n                           lines3[1])\n            assertCodeLine(\"line2\", true,\n                           rev1, fileName, 1,\n                           rev3, fileName, 2,\n                           lines3[2])\n        }\n\n        // t4: file deletion\n        testRepo.deleteFile(fileName)\n        val rev4 = testRepo.commit(\"delete file\")\n        val lines4 = CodeLongevity(Repo(), emails, testRepo.git)\n            .getLinesList(onError = { _ -> fail(\"exception\") })\n\n        it(\"'t4: file deletion'\") {\n            assertEquals(3, lines4.size)\n            assertCodeLine(\"line in the middle\", true,\n                           rev2, fileName, 1,\n                           rev4, fileName, 1,\n                           lines4[0])\n            assertCodeLine(\"line1\", true,\n                           rev1, fileName, 0,\n                           rev4, fileName, 0,\n                           lines4[1])\n\n            assertCodeLine(\"line2\", true,\n                           rev1, fileName, 1,\n                           rev3, fileName, 2,\n                           lines4[2])\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"'line collecting #2'\") {\n        val testRepoPath = \"../CodeLongevity_lc2\"\n        val testRepo = TestRepo(testRepoPath)\n        val fileName = \"test1.txt\"\n        val emails = hashSetOf(testRepo.userEmail)\n\n        // t2.1: initial insertion\n        val fileContent = listOf(\n          \"line0\",\n          \"line1\",\n          \"line2\",\n          \"line3\",\n          \"line4\",\n          \"line5\",\n          \"line6\",\n          \"line7\",\n          \"line8\",\n          \"line9\",\n          \"line10\",\n          \"line11\",\n          \"line12\",\n          \"line13\",\n          \"line14\",\n          \"line15\",\n          \"line16\",\n          \"line17\",\n          \"line18\"\n        )\n        testRepo.createFile(fileName, fileContent)\n        val rev1 = testRepo.commit(\"initial commit\")\n        val lines1 = CodeLongevity(Repo(), emails, testRepo.git)\n            .getLinesList(onError = { _ -> fail(\"exception\") })\n\n        it(\"'t2.1: initial insertion'\") {\n            assertEquals(fileContent.size, lines1.size)\n            for (idx in 0 .. fileContent.size - 1) {\n                assertCodeLine(fileContent[idx], false,\n                               rev1, fileName, idx,\n                               rev1, fileName, idx,\n                               lines1[idx])\n            }\n        }\n\n        // t2.2: ins+del\n\n        // Diff:\n        // 0  0     line0\n        // 1  1     line1\n        // 2  2     line2\n        // 3     -  line3\n        // 4     -  line4\n        // 5     -  line5\n        //    3  +  Proof addition 1\n        // 6  4     line6\n        // 7  5     line7\n        // 8  6     line8\n        // 9     -  line9\n        // 10    -  line10\n        // 11    -  line11\n        //    7  +  Proof addition 2\n        // 12 8     line12\n        // 13 9     line13\n        // 14 10    line14\n        // 15    -  line15\n        // 16    -  line16\n        // 17    -  line17\n        // 18    -  line18\n        //    11 +  Proof addition 3\n\n        testRepo.deleteLines(fileName, 15, 18)\n        testRepo.deleteLines(fileName, 9, 11)\n        testRepo.deleteLines(fileName, 3, 5)\n        testRepo.insertLines(fileName, 3, listOf(\"Proof addition 1\"))\n        testRepo.insertLines(fileName, 7, listOf(\"Proof addition 2\"))\n        testRepo.insertLines(fileName, 11, listOf(\"Proof addition 3\"))\n        val rev2 = testRepo.commit(\"insert+delete\")\n\n        val lines2 = CodeLongevity(Repo(), emails, testRepo.git)\n            .getLinesList(onError = { _ -> fail(\"exception\") })\n\n        it(\"'t2.2: ins+del'\") {\n            assertEquals(22, lines2.size)\n            assertCodeLine(\"Proof addition 3\", false,\n                           rev2, fileName, 11, rev2,\n                           fileName, 11, lines2[0])\n            assertCodeLine(\"Proof addition 2\", false,\n                           rev2, fileName, 7,\n                           rev2, fileName, 7, lines2[1])\n            assertCodeLine(\"Proof addition 1\", false,\n                           rev2, fileName, 3,\n                           rev2, fileName, 3, lines2[2])\n            assertCodeLine(\"line0\", false,\n                           rev1, fileName, 0,\n                           rev2, fileName, 0, lines2[3])\n            assertCodeLine(\"line1\", false,\n                           rev1, fileName, 1,\n                           rev2, fileName, 1, lines2[4])\n            assertCodeLine(\"line2\", false,\n                           rev1, fileName, 2,\n                           rev2, fileName, 2, lines2[5])\n            assertCodeLine(\"line3\", true,\n                           rev1, fileName, 3,\n                           rev2, fileName, 3, lines2[6])\n            assertCodeLine(\"line4\", true,\n                           rev1, fileName, 4,\n                           rev2, fileName, 4, lines2[7])\n            assertCodeLine(\"line5\", true,\n                           rev1, fileName, 5,\n                           rev2, fileName, 5, lines2[8])\n            assertCodeLine(\"line6\", false,\n                           rev1, fileName, 6,\n                           rev2, fileName, 4, lines2[9])\n            assertCodeLine(\"line7\", false,\n                           rev1, fileName, 7,\n                           rev2, fileName, 5, lines2[10])\n            assertCodeLine(\"line8\", false,\n                           rev1, fileName, 8,\n                           rev2, fileName, 6, lines2[11])\n            assertCodeLine(\"line9\", true,\n                           rev1, fileName, 9,\n                           rev2, fileName, 9, lines2[12])\n            assertCodeLine(\"line10\", true,\n                           rev1, fileName, 10,\n                           rev2, fileName, 10, lines2[13])\n            assertCodeLine(\"line11\", true,\n                           rev1, fileName, 11,\n                           rev2, fileName, 11, lines2[14])\n            assertCodeLine(\"line12\", false,\n                           rev1, fileName, 12,\n                           rev2, fileName, 8, lines2[15])\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"'line collecting #3: between revisions'\") {\n        val testRepoPath = \"../CodeLongevity_lc3\"\n        val testRepo = TestRepo(testRepoPath)\n        val fileName = \"test1.txt\"\n        val emails = hashSetOf(testRepo.userEmail)\n\n        testRepo.createFile(fileName, listOf(\"line1\", \"line2\"))\n        val rev1 = testRepo.commit(\"initial commit\")\n        testRepo.insertLines(fileName, 1, listOf(\"line15\"))\n        val rev2 = testRepo.commit(\"insert line\")\n        testRepo.deleteLines(fileName, 2, 2)\n        val rev3 = testRepo.commit(\"delete line2\")\n\n        val lines1 = CodeLongevity(Repo(), emails, testRepo.git)\n            .getLinesList(onError = { _ -> fail(\"exception\") })\n        val lines1_line15 = lines1[0]\n        val lines1_line1 = lines1[1]\n        val lines1_line2 = lines1[2]\n\n        it(\"'before'\") {\n            assertEquals(3, lines1.size)\n            assertCodeLine(\"line15\", false,\n                           rev2, fileName, 1,\n                           rev3, fileName, 1,\n                           lines1_line15)\n            assertCodeLine(\"line1\", false,\n                           rev1, fileName, 0,\n                           rev3, fileName, 0,\n                           lines1_line1)\n            assertCodeLine(\"line2\", true,\n                           rev1, fileName, 1,\n                           rev3, fileName, 2,\n                           lines1_line2)\n        }\n\n        testRepo.deleteLines(fileName, 0, 0)\n        val rev4 = testRepo.commit(\"delete line1\")\n\n        val lines2 = CodeLongevity(Repo(), emails, testRepo.git)\n            .getLinesList(rev3, onError = { _ -> fail(\"exception\") })\n        val lines2_line1 = lines2[0]\n        val lines2_line15 = lines2[1]\n\n        it(\"'after'\") {\n            assertEquals(2, lines2.size)\n            assertCodeLine(\"line1\", true,\n                           rev3, fileName, 0,\n                           rev4, fileName, 0,\n                           lines2_line1)\n            assertEquals(lines1_line1.newId, lines2_line1.oldId,\n                         \"line1 old and new ids matching\")\n\n            assertCodeLine(\"line15\", false,\n                           rev3, fileName, 1,\n                           rev4, fileName, 0,\n                           lines2_line15)\n            assertEquals(lines1_line15.newId, lines2_line15.oldId,\n                         \"line15 old and new ids matching\")\n\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"'line storage #1'\") {\n        val testRepoPath = \"../CodeLongevity_ls1\"\n        val testRepo = TestRepo(testRepoPath)\n        val testRehash = \"rehash_ls1\"\n        val fileName = \"test1.txt\"\n        val email = testRepo.userEmail\n        val emails = hashSetOf(email)\n        val api = MockApi()\n\n        testRepo.createFile(fileName, listOf(\"line1\", \"line2\"))\n        testRepo.commit(message = \"initial commit\",\n            date = Calendar.Builder().setTimeOfDay(0, 0, 0).build().time)\n        testRepo.insertLines(fileName, 1, listOf(\"line15\"))\n        testRepo.commit(message = \"insert line\",\n            date = Calendar.Builder().setTimeOfDay(0, 1, 0).build().time)\n\n        var t1Ages: CodeLineAges? = null\n        CodeLongevity(Repo(rehash = testRehash), emails, testRepo.git)\n            .updateFromObservable(onError = { _ -> fail(\"exception\") },\n                                  onDataComplete = { t1Ages = it.clone() },\n                                  api = api)\n        val t1Lines = CodeLongevity(Repo(rehash = testRehash), emails,\n            testRepo.git).getLinesList(onError = { _ -> fail(\"exception\") })\n\n        it(\"'t1'\") {\n            assertNotNull(t1Ages)\n            assertTrue(t1Ages!!.aggrAges.isEmpty(),\n                \"t1_ages: aggr ages is empty\")\n            assertEquals(3, t1Ages!!.lastingLines.count(),\n                \"t1_ages: lasting lines count\")\n            for (line in t1Lines) {\n                assertEquals(t1Ages!!.lastingLines[line.newId]!!.age, line.age,\n                    \"t1_ages: line age at '${line.newId}'\")\n            }\n        }\n\n        testRepo.deleteLines(fileName, 2, 2)\n        testRepo.commit(message = \"delete line2\",\n            date = Calendar.Builder().setTimeOfDay(0, 3, 0).build().time)\n\n        var t2Ages: CodeLineAges? = null\n        CodeLongevity(Repo(rehash = testRehash), emails, testRepo.git)\n            .updateFromObservable(onError = { _ -> fail(\"exception\") },\n                                  onDataComplete = { t2Ages = it.clone() },\n                                  api = api)\n        val t2Lines = CodeLongevity(Repo(rehash = testRehash), emails,\n            testRepo.git).getLinesList(onError = { _ -> fail(\"exception\") })\n\n        it(\"'t2'\") {\n            assertNotNull(t2Ages)\n            assertEquals(1, t2Ages!!.aggrAges[email]!!.count,\n                \"t2_ages: aggr ages count\")\n            assertEquals(180, t2Ages!!.aggrAges[email]!!.sum,\n                \"t2_ages: aggr ages sum\") // line2\n            assertEquals(2, t2Ages!!.lastingLines.count(),\n                \"t2_ages: lasting lines count\")\n\n            val line1 = t2Lines.find { line -> line.text == \"line1\" }!!\n            val line15 = t2Lines.find { line -> line.text == \"line15\" }!!\n            assertEquals(180, t2Ages!!.lastingLines[line1.newId]!!.age,\n                \"t2_ages: 'line1' line age\")\n            assertEquals(120, t2Ages!!.lastingLines[line15.newId]!!.age,\n                \"t2_ages: 'line15' line age\")\n        }\n\n        afterGroup {\n            CodeLongevity(Repo(rehash = testRehash), emails, testRepo.git)\n                .dropSavedData()\n            testRepo.destroy()\n        }\n    }\n\n    given(\"'longevity stats #1'\") {\n        val testRepoPath = \"../CodeLongevity_lngstats1\"\n        val testRepo = TestRepo(testRepoPath)\n        val testRehash = \"rehash_lngstats1\"\n        val fileName = \"test1.txt\"\n        val author1 = Author(testRepo.userName, testRepo.userEmail)\n        val author2 = Author(\"Vasya Pupkin\", \"vasya@pupkin.me\")\n        val emails = hashSetOf(testRepo.userEmail)\n\n        val serverRepo = Repo(rehash = testRehash)\n        val api = MockApi(mockRepo = serverRepo)\n\n        testRepo.createFile(fileName, listOf(\"line1\", \"line2\"))\n        testRepo.commit(message = \"initial commit\",\n                        author = author1,\n                        date = Calendar.Builder().setTimeOfDay(0, 0, 0)\n                            .build().time)\n\n        testRepo.insertLines(fileName, 1, listOf(\"line15\"))\n        testRepo.commit(message = \"insert line\",\n                        author = author2,\n                        date = Calendar.Builder().setTimeOfDay(0, 1, 0)\n                            .build().time)\n\n        testRepo.insertLines(fileName, 2, listOf(\"line17\"))\n        testRepo.commit(message = \"insert line2\",\n                        author = author1,\n                        date = Calendar.Builder().setTimeOfDay(0, 3, 0)\n                            .build().time)\n\n        testRepo.deleteLines(fileName, 2, 2)\n        testRepo.commit(message = \"delete line\",\n                        author = author1,\n                        date = Calendar.Builder().setTimeOfDay(0, 4, 0)\n                            .build().time)\n\n        CodeLongevity(serverRepo, emails, testRepo.git).updateFromObservable(\n            onError = { _ -> fail(\"exception\") }, api = api)\n\n        it(\"'t1'\") {\n            assertTrue(api.receivedFacts.contains(\n                Fact(repo = serverRepo,\n                     code = FactCodes.LINE_LONGEVITY_REPO,\n                     value = (720 / 4).toString())\n            ))\n\n            assertTrue(api.receivedFacts.contains(\n                Fact(repo = serverRepo,\n                     code = FactCodes.LINE_LONGEVITY,\n                     author = author1,\n                     value = (540 / 3).toString())\n            ))\n        }\n\n        afterGroup {\n            CodeLongevity(Repo(rehash = testRehash), emails, testRepo.git)\n                .dropSavedData()\n            testRepo.destroy()\n        }\n    }\n\n    given(\"'longevity stats #2'\") {\n        val testRepoPath = \"../CodeLongevity_lngstats2\"\n        val testRepo = TestRepo(testRepoPath)\n        val testRehash = \"rehash_lngstats2\"\n        val fileName = \"test1.txt\"\n        val author1 = Author(testRepo.userName, testRepo.userEmail)\n        val author2 = Author(\"Vasya Pupkin\", \"vasya@pupkin.me\")\n        val emails = hashSetOf(author1.email, author2.email)\n\n        val serverRepo = Repo(rehash = testRehash)\n        val mockApi = MockApi(mockRepo = serverRepo)\n\n        testRepo.createFile(fileName, listOf(\"line1\", \"line2\"))\n        testRepo.commit(message = \"initial commit\",\n                        author = author1,\n                        date = Calendar.Builder().setTimeOfDay(0, 0, 0)\n                            .build().time)\n\n        testRepo.deleteLines(fileName, 1, 1)\n        testRepo.commit(message = \"delete line\",\n                        author = author2,\n                        date = Calendar.Builder().setTimeOfDay(0, 1, 0)\n                            .build().time)\n\n        CodeLongevity(serverRepo, emails, testRepo.git)\n            .updateFromObservable(onError = { _ -> fail(\"exception\") },\n                                  api = mockApi)\n\n        it(\"'t1'\") {\n            assertTrue(mockApi.receivedFacts.contains(\n                Fact(repo = serverRepo,\n                     code = FactCodes.LINE_LONGEVITY_REPO,\n                     value = (60).toString())\n            ))\n\n            assertTrue(mockApi.receivedFacts.contains(\n                Fact(repo = serverRepo,\n                     code = FactCodes.LINE_LONGEVITY,\n                     author = author1,\n                     value = (60).toString())\n            ))\n\n            assertTrue(mockApi.receivedFacts.contains(\n                Fact(repo = serverRepo,\n                     code = FactCodes.LINE_LONGEVITY,\n                     author = author2,\n                     value = (0).toString())\n            ))\n        }\n\n        afterGroup {\n            CodeLongevity(Repo(rehash = testRehash), emails, testRepo.git)\n                .dropSavedData()\n            testRepo.destroy()\n        }\n    }\n})\n"
  },
  {
    "path": "src/test/kotlin/test/tests/hashers/ColleaguesTest.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage test.tests.hashers\n\nimport app.api.MockApi\nimport app.FactCodes\nimport app.hashers.CodeLine\nimport app.hashers.CodeLineAges\nimport app.hashers.CodeLongevity\nimport app.hashers.CommitCrawler\nimport app.hashers.RevCommitLine\nimport app.model.*\n\nimport test.utils.TestRepo\n\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\nimport kotlin.test.fail\n\nimport org.eclipse.jgit.revwalk.RevCommit\n\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\n\nimport java.util.Calendar\nimport kotlin.test.assertNotNull\n\n/**\n * Testing class.\n */\nclass ColleaguesTest : Spek({\n    given(\"'colleagues #1'\") {\n        val testRepoPath = \"../colleagues1\"\n        val testRepo = TestRepo(testRepoPath)\n        val testRehash = \"rehash_colleagues1\"\n        val fileName = \"test1.txt\"\n        val author1 = Author(testRepo.userName, testRepo.userEmail)\n        val author2 = Author(\"Vasya Pupkin\", \"vasya@pupkin.me\")\n        val emails = hashSetOf(author1.email, author2.email)\n\n        val serverRepo = Repo(rehash = testRehash)\n\n        it(\"'t1'\") {\n            val mockApi = MockApi(mockRepo = serverRepo)\n\n            testRepo.createFile(fileName, listOf(\"line1\", \"line2\"))\n            testRepo.commit(message = \"initial commit\",\n                author = author1,\n                date = Calendar.Builder().setTimeOfDay(0, 0, 0)\n                    .build().time)\n\n            testRepo.deleteLines(fileName, 1, 1)\n            testRepo.commit(message = \"delete line\",\n                author = author1,\n                date = Calendar.Builder().setTimeOfDay(0, 1, 0)\n                    .build().time)\n\n            testRepo.deleteLines(fileName, 0, 0)\n            testRepo.commit(message = \"delete line #2\",\n                author = author2,\n                date = Calendar.Builder().setTimeOfDay(0, 1, 0)\n                    .build().time)\n\n            val cl = CodeLongevity(serverRepo, emails, testRepo.git)\n            cl.updateFromObservable(onError = { _ -> fail(\"exception\") },\n                api = mockApi)\n\n            val triple1 = cl.colleagues.get(author1.email)[0]\n            assertEquals(triple1.first, author2.email,\n                \"Wrong colleague email #1\")\n            assertEquals(triple1.second, \"1970-01\", \"Wrong colleague month #1\")\n            assertEquals(triple1.third, 60, \"Wrong colleague vicinity #1\")\n\n            val triple2 = cl.colleagues.get(author2.email)[0]\n            assertEquals(triple2.first, author1.email,\n                \"Wrong colleague email #1\")\n            assertEquals(triple2.second, \"1970-01\", \"Wrong colleague month #1\")\n            assertEquals(triple2.third, 60, \"Wrong colleague vicinity #1\")\n        }\n\n        afterGroup {\n            CodeLongevity(Repo(rehash = testRehash), emails, testRepo.git)\n                .dropSavedData()\n            testRepo.destroy()\n        }\n    }\n\n    given(\"'colleagues stats'\") {\n        val testRepoPath = \"../colleagues_stats\"\n        val testRepo = TestRepo(testRepoPath)\n        val testRehash = \"rehash_colleagues_stats\"\n        val fileName = \"test1.txt\"\n        val author1 = Author(testRepo.userName, testRepo.userEmail)\n        val author2 = Author(\"Vasya Pupkin\", \"vasya@pupkin.me\")\n        val emails = hashSetOf(author1.email, author2.email)\n\n        val serverRepo = Repo(rehash = testRehash)\n\n        it(\"'t1'\") {\n            val mockApi = MockApi(mockRepo = serverRepo)\n\n            testRepo.createFile(fileName, listOf(\"line1\", \"line2\"))\n            testRepo.commit(message = \"initial commit\",\n                author = author1,\n                date = Calendar.Builder().setTimeOfDay(0, 0, 0)\n                    .build().time)\n\n            testRepo.deleteLines(fileName, 1, 1)\n            testRepo.commit(message = \"delete line\",\n                author = author2,\n                date = Calendar.Builder().setTimeOfDay(0, 1, 0)\n                    .build().time)\n\n            testRepo.insertLines(fileName, 1, listOf(\"line in the end\"))\n            testRepo.commit(message = \"insert line\",\n                author = author2,\n                date = Calendar.Builder().setTimeOfDay(0, 10, 0)\n                    .build().time)\n\n            testRepo.deleteLines(fileName, 1, 1)\n            testRepo.commit(message = \"delete line #2\",\n                author = author1,\n                date = Calendar.Builder().setTimeOfDay(0, 20, 0)\n                    .build().time)\n\n            CodeLongevity(serverRepo, emails, testRepo.git)\n                .updateFromObservable(\n                    onError = { _ -> fail(\"exception\") },\n                    api = mockApi)\n\n            assertTrue(mockApi.receivedFacts.contains(\n                Fact(repo = serverRepo,\n                     code = FactCodes.COLLEAGUES,\n                     value = author2.email,\n                     value2 = author1.email,\n                     value3 = (60).toString())\n            ))\n        }\n\n        afterGroup {\n            CodeLongevity(Repo(rehash = testRehash), emails, testRepo.git)\n                .dropSavedData()\n            testRepo.destroy()\n        }\n    }\n})\n"
  },
  {
    "path": "src/test/kotlin/test/tests/hashers/CommitHasherTest.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage test.tests.hashers\n\nimport app.api.MockApi\nimport app.extractors.ExtractorInterface\nimport app.hashers.CommitHasher\nimport app.hashers.CommitCrawler\nimport app.model.*\nimport app.utils.RepoHelper\nimport org.eclipse.jgit.api.Git\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\nimport test.utils.TestRepo\nimport java.io.File\nimport java.util.stream.StreamSupport.stream\nimport kotlin.streams.toList\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\nclass CommitHasherTest : Spek({\n    fun getRepoRehash(git: Git, localRepo: LocalRepo): String {\n\n        val initialRevCommit = stream(git.log().call().spliterator(), false)\n            .toList().first()\n        return RepoHelper.calculateRepoRehash(Commit(initialRevCommit).rehash,\n            localRepo)\n    }\n\n    fun getLastCommit(git: Git): Commit {\n        val revCommits = stream(git.log().call().spliterator(), false).toList()\n        val lastCommit = Commit(revCommits.first())\n        return lastCommit\n    }\n\n    fun cleanRepos() {\n        Runtime.getRuntime().exec(\"src/test/delete_repo.sh\").waitFor()\n    }\n\n    val userName = \"First Contributor\"\n    val userEmail = \"test@domain.com\"\n\n    val secondUserName = \"Second Contributor\"\n    val secondUserEmail = \"test2@domain.com\"\n\n    // Creation of test repo.\n    cleanRepos()\n    val repoPath = \"./tmp_repo/.git\"\n    val git = Git.init().setGitDir(File(repoPath)).call()\n    val config = git.repository.config\n    config.setString(\"user\", null, \"name\", userName)\n    config.setString(\"user\", null, \"email\", userEmail)\n    config.save()\n\n    // Common parameters for CommitHasher.\n    val gitHasher = Git.open(File(repoPath))\n    val initialCommit = Commit(git.commit().setMessage(\"Initial commit\").call())\n    val repoRehash = RepoHelper.calculateRepoRehash(initialCommit.rehash,\n        LocalRepo(repoPath).also { it.author = Author(userName, userEmail) })\n    val repo = Repo(rehash = repoRehash,\n                    initialCommitRehash = initialCommit.rehash)\n    val emails = hashSetOf(userEmail, secondUserEmail)\n\n    given(\"repo with initial commit and no history\") {\n        repo.commits = listOf()\n\n        val errors = mutableListOf<Throwable>()\n        val mockApi = MockApi(mockRepo = repo)\n        val observable = CommitCrawler.getObservable(gitHasher, repo)\n        CommitHasher(repo, mockApi, repo.commits.map {it.rehash}, emails)\n            .updateFromObservable(observable, { e -> errors.add(e) })\n\n        it (\"has no errors\") {\n            assertEquals(0, errors.size)\n        }\n\n        it(\"send added commits\") {\n            assertEquals(1, mockApi.receivedAddedCommits.size)\n        }\n\n        it(\"doesn't send deleted commits\") {\n            assertEquals(0, mockApi.receivedDeletedCommits.size)\n        }\n    }\n\n    given(\"repo with initial commit\") {\n        repo.commits = listOf(getLastCommit(git))\n\n        val errors = mutableListOf<Throwable>()\n        val mockApi = MockApi(mockRepo = repo)\n        val observable = CommitCrawler.getObservable(gitHasher, repo)\n        CommitHasher(repo, mockApi, repo.commits.map {it.rehash}, emails)\n            .updateFromObservable(observable, { e -> errors.add(e) })\n\n        it (\"has no errors\") {\n            assertEquals(0, errors.size)\n        }\n\n        it(\"doesn't send added commits\") {\n            assertEquals(0, mockApi.receivedAddedCommits.size)\n        }\n\n        it(\"doesn't send deleted commits\") {\n            assertEquals(0, mockApi.receivedDeletedCommits.size)\n        }\n    }\n\n    given(\"happy path: added one commit\") {\n        repo.commits = listOf(getLastCommit(git))\n\n        val errors = mutableListOf<Throwable>()\n        val mockApi = MockApi(mockRepo = repo)\n        val revCommit = git.commit().setMessage(\"Second commit.\").call()\n        val addedCommit = Commit(revCommit)\n        val observable = CommitCrawler.getObservable(gitHasher, repo)\n        CommitHasher(repo, mockApi, repo.commits.map {it.rehash}, emails)\n            .updateFromObservable(observable, { e -> errors.add(e) })\n\n        it (\"has no errors\") {\n            assertEquals(0, errors.size)\n        }\n\n        it(\"doesn't send deleted commits\") {\n            assertEquals(0, mockApi.receivedDeletedCommits.size)\n        }\n\n        it(\"posts one commit as added\") {\n            assertEquals(1, mockApi.receivedAddedCommits.size)\n        }\n\n        it(\"should be that the posted commit is added one\") {\n            assertEquals(addedCommit, mockApi.receivedAddedCommits.last())\n        }\n    }\n\n    /*given(\"happy path: added a few new commits\") {\n        repo.commits = listOf(getLastCommit(git))\n\n        val errors = mutableListOf<Throwable>()\n        val mockApi = MockApi(mockRepo = repo)\n\n        val otherAuthorsNames = listOf(\"a\", \"b\", \"a\")\n        val otherAuthorsEmails = listOf(\"a@a\", \"b@b\", \"a@a\")\n        for (i in 0..2) {\n            git.commit().setMessage(\"Create $i.\")\n                        .setAuthor(otherAuthorsNames.get(i),\n                                   otherAuthorsEmails.get(i))\n                        .call()\n        }\n        val authorCommits = mutableListOf<Commit>()\n        for (i in 0..4) {\n            val message = \"Created $i by author.\"\n            val revCommit = git.commit().setMessage(message).call()\n            authorCommits.add(Commit(revCommit))\n        }\n        val observable = CommitCrawler.getObservable(gitHasher, repo)\n        CommitHasher(repo, mockApi, repo.commits.map {it.rehash}, emails)\n            .updateFromObservable(observable, { e -> errors.add(e) })\n\n        it (\"has no errors\") {\n            assertEquals(0, errors.size)\n        }\n\n        it(\"posts five commits as added\") {\n            assertEquals(5, mockApi.receivedAddedCommits.size)\n        }\n\n        it(\"doesn't send deleted commits \") {\n            assertEquals(0, mockApi.receivedDeletedCommits.size)\n        }\n\n        it(\"processes author's commits\") {\n            assertEquals(authorCommits.asReversed(),\n                         mockApi.receivedAddedCommits)\n        }\n    }\n\n    given(\"fork event\") {\n        val forkedRepoPath = \"./forked_repo/\"\n        val originalRepoPath = \"./original_repo/\"\n        val forked = Git.cloneRepository()\n                .setURI(\"https://github.com/yaronskaya/sourcerer-app.git\")\n                .setDirectory(File(forkedRepoPath))\n                .call()\n        val original = Git.cloneRepository()\n                .setURI(\"https://github.com/sourcerer-io/sourcerer-app.git\")\n                .setDirectory(File(originalRepoPath))\n                .call()\n        val forkedLocalRepo = LocalRepo(forkedRepoPath)\n        val originalLocalRepo = LocalRepo(originalRepoPath)\n\n        val forkedRepoRehash = getRepoRehash(forked, forkedLocalRepo)\n        val originalRepoRehash = getRepoRehash(original, originalLocalRepo)\n\n        it(\"assigns different hashes for the original and the forked repos\") {\n            assertNotEquals(originalRepoRehash, forkedRepoRehash)\n        }\n\n        forked.repository.close()\n        forked.close()\n        original.repository.close()\n        original.close()\n    }\n\n    given(\"lost server\") {\n        repo.commits = listOf(getLastCommit(git))\n\n        val errors = mutableListOf<Throwable>()\n        val mockApi = MockApi(mockRepo = repo)\n\n        // Add some commits.\n        val addedCommits = mutableListOf<Commit>()\n        for (i in 0..3) {\n            val message = \"Created $i by author.\"\n            val revCommit = git.commit().setMessage(message).call()\n            addedCommits.add(Commit(revCommit))\n        }\n\n        // Remove one commit from server history.\n        val removedCommit = addedCommits.removeAt(1)\n        repo.commits = addedCommits.toList().asReversed()\n\n        val observable = CommitCrawler.getObservable(gitHasher, repo)\n        CommitHasher(repo, mockApi, repo.commits.map {it.rehash}, emails)\n            .updateFromObservable(observable, { e -> errors.add(e) })\n\n        it (\"has no errors\") {\n            assertEquals(0, errors.size)\n        }\n\n        it(\"adds posts one commit as added and received commit is lost one\") {\n            assertEquals(1, mockApi.receivedAddedCommits.size)\n            assertEquals(removedCommit, mockApi.receivedAddedCommits.last())\n        }\n\n        it(\"doesn't posts deleted commits\") {\n            assertEquals(0, mockApi.receivedDeletedCommits.size)\n        }\n    }*/\n\n    given(\"commits with syntax stats\") {\n\n        val lines = listOf(\"x = [i**2 for i in range(9999)]\", \"def fn()\", \"x \" +\n                \"= 1\",\n                \"x = map(lambda x: x**2, range(9999))\",\n                \"x = map(lambda x: x**2, map(lambda x: x**3, range(10))\",\n                \"x = map(lambda x: x**2, range(10)),\" +\n                        \"map(lambda x: x**3, range(10)))\")\n\n        val author = Author(userName, userEmail)\n\n        val testRepoPath = \"../testrepo-commit-hasher-\"\n        val testRepo = TestRepo(testRepoPath + \"python-facts\")\n\n        val mockApi = MockApi(mockRepo = repo)\n        val observable = CommitCrawler.getObservable(testRepo.git, repo)\n\n        it(\"sends stats\") {\n            for (i in 0..lines.size - 1) {\n                val line = lines[i]\n                val fileName = \"file$i.py\"\n                testRepo.createFile(fileName, listOf(line))\n                testRepo.commit(message = \"$line in $fileName\", author = author)\n            }\n\n            val errors = mutableListOf<Throwable>()\n\n            val rehashes = (0..lines.size - 1).map { \"r$it\" }\n\n            CommitHasher(repo, mockApi, rehashes, emails)\n                    .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n\n            val syntaxStats = mockApi.receivedAddedCommits\n                .fold(mutableListOf<CommitStats>()) { allStats, commit ->\n                    allStats.addAll(commit.stats)\n                    allStats\n                }.filter { it.type == ExtractorInterface.TYPE_SYNTAX }\n\n            val mapStats = syntaxStats.filter { it.tech == \"python>map\" }\n            val listStats = syntaxStats.filter { it.tech == \"python>list\" }\n            assertEquals(3, mapStats.size)\n            assertEquals(1, listStats.size)\n            assertEquals(5, mapStats.map { it.numLinesAdded }.sum())\n            assertEquals(0, mapStats.map { it.numLinesDeleted }.sum())\n\n            assertEquals(1, listStats.map { it.numLinesAdded }.sum())\n            assertEquals(0, listStats.map { it.numLinesDeleted }.sum())\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"cpp repo\") {\n        val testRepo = TestRepo(\"../testrepo-commit-hasher-cpp-stats\")\n        val lines = listOf(\"#include <iostream>\",\n                \"template <typename s, Input... inputs>\",\n                \"struct Play<s, x, xs...> {\",\n                \"    using type = cons<s, play<step_t<x, s>, xs...>>;\", \"};\",\n                \"        template<typename x>\")\n\n        val author = Author(userName, userEmail)\n\n        val mockApi = MockApi(mockRepo = repo)\n        val observable = CommitCrawler.getObservable(testRepo.git, repo)\n\n        it(\"sends stats\") {\n            for (i in 0..lines.size - 1) {\n                val line = lines[i]\n                val fileName = \"file$i.cpp\"\n                testRepo.createFile(fileName, listOf(line))\n                testRepo.commit(message = \"$line in $fileName\", author = author)\n            }\n\n            val errors = mutableListOf<Throwable>()\n\n            val rehashes = (0..lines.size - 1).map { \"r$it\" }\n\n            CommitHasher(repo, mockApi, rehashes, emails)\n                    .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n\n            val syntaxStats = mockApi.receivedAddedCommits\n                    .fold(mutableListOf<CommitStats>()) { allStats, commit ->\n                        allStats.addAll(commit.stats)\n                        allStats\n                    }.filter { it.type == ExtractorInterface.TYPE_SYNTAX }\n\n            val templateStats = syntaxStats.filter { it.tech == \"cpp>template\" }\n            assertEquals(2, templateStats.size)\n            assertEquals(2, templateStats.map { it.numLinesAdded }.sum())\n            assertEquals(0, templateStats.map { it.numLinesDeleted }.sum())\n        }\n\n    }\n    given(\"commits with svelte files\") {\n        val lines = listOf(\"line 1\", \"line 2\")\n\n        val author = Author(userName, userEmail)\n\n        val testRepoPath = \"../testrepo-extractor-\"\n        val testRepo = TestRepo(testRepoPath + \"svelte\")\n\n        val mockApi = MockApi(mockRepo = repo)\n        val observable = CommitCrawler.getObservable(testRepo.git, repo)\n\n        it(\"sends stats\") {\n            for (i in 0..lines.size - 1) {\n                val line = lines[i]\n                val fileName = \"file$i.svelte\"\n                testRepo.createFile(fileName, listOf(line))\n                testRepo.commit(message = \"$line in $fileName\", author = author)\n            }\n\n            val errors = mutableListOf<Throwable>()\n\n            val rehashes = (0..lines.size - 1).map { \"r$it\" }\n\n            CommitHasher(repo, mockApi, rehashes, emails)\n                    .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n\n            val syntaxStats = mockApi.receivedAddedCommits\n                    .fold(mutableListOf<CommitStats>()) { allStats, commit ->\n                        allStats.addAll(commit.stats)\n                        allStats\n                    }.filter { it.type == ExtractorInterface.TYPE_LIBRARY }\n\n            val svelteStats = syntaxStats.filter { it.tech == \"js.svelte\" }\n            assertEquals(2, svelteStats.size)\n            assertEquals(2, svelteStats.map { it.numLinesAdded }.sum())\n            assertEquals(0, svelteStats.map { it.numLinesDeleted }.sum())\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"commits with quasar files\") {\n        val lines = listOf(\"module.exports = function (ctx) { }\")\n\n        val author = Author(userName, userEmail)\n\n        val testRepoPath = \"../testrepo-extractor-\"\n        val testRepo = TestRepo(testRepoPath + \"quasar\")\n\n        val mockApi = MockApi(mockRepo = repo)\n        val observable = CommitCrawler.getObservable(testRepo.git, repo)\n\n        it(\"sends stats\") {\n            val fileName = \"quasar.conf.js\"\n            testRepo.createFile(fileName, lines)\n            testRepo.commit(message = \"add quasar config\", author = author)\n\n            val errors = mutableListOf<Throwable>()\n\n            val rehashes = (0..lines.size - 1).map { \"r$it\" }\n\n            CommitHasher(repo, mockApi, rehashes, emails)\n                    .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n\n            val syntaxStats = mockApi.receivedAddedCommits\n                    .fold(mutableListOf<CommitStats>()) { allStats, commit ->\n                        allStats.addAll(commit.stats)\n                        allStats\n                    }.filter { it.type == ExtractorInterface.TYPE_LIBRARY }\n\n            val quasarStats = syntaxStats.filter { it.tech == \"js.quasar\" }\n            assertEquals(1, quasarStats.size)\n            assertEquals(1, quasarStats.map { it.numLinesAdded }.sum())\n            assertEquals(0, quasarStats.map { it.numLinesDeleted }.sum())\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"commits with typescript files\") {\n        val lines = listOf(\"new Vue({\", \"line 2\")\n\n        val author = Author(userName, userEmail)\n\n        val testRepoPath = \"../testrepo-extractor-\"\n        val testRepo = TestRepo(testRepoPath + \"typescript\")\n\n        val mockApi = MockApi(mockRepo = repo)\n        val observable = CommitCrawler.getObservable(testRepo.git, repo)\n\n        it(\"sends stats\") {\n            for (i in 0..lines.size - 1) {\n                val line = lines[i]\n                val fileName = \"file$i.ts\"\n                testRepo.createFile(fileName, listOf(line))\n                testRepo.commit(message = \"$line in $fileName\", author = author)\n            }\n\n            val errors = mutableListOf<Throwable>()\n\n            val rehashes = (0..lines.size - 1).map { \"r$it\" }\n\n            CommitHasher(repo, mockApi, rehashes, emails)\n                    .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n\n            val stats = mockApi.receivedAddedCommits\n                    .fold(mutableListOf<CommitStats>()) { allStats, commit ->\n                        allStats.addAll(commit.stats)\n                        allStats\n                    }\n            val languageStats = stats.filter { it.type == ExtractorInterface.TYPE_LANGUAGE }\n            val techStats = stats.filter { it.type == ExtractorInterface.TYPE_LIBRARY }\n            assertEquals(2, languageStats.size)\n            languageStats.forEach { stat ->\n                assertEquals(\"typescript\", stat.tech)\n            }\n            assertEquals(1, techStats.map { it.numLinesAdded }.sum())\n            techStats.forEach { stat ->\n                assertEquals(\"js.vue\", stat.tech)\n            }\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"commits with scss stats\") {\n\n        val lines = listOf(\"first line in css file\", \"\",\n                \"third line in css file\")\n\n        val author = Author(userName, userEmail)\n\n        val testRepoPath = \"../testrepo-extractor-\"\n        val testRepo = TestRepo(testRepoPath + \"css\")\n\n        val mockApi = MockApi(mockRepo = repo)\n        val observable = CommitCrawler.getObservable(testRepo.git, repo)\n\n        it(\"sends stats\") {\n            for (i in 0..lines.size - 1) {\n                val line = lines[i]\n                val fileName = \"file$i.scss\"\n                testRepo.createFile(fileName, listOf(line))\n                testRepo.commit(message = \"$line in $fileName\", author = author)\n            }\n\n            val errors = mutableListOf<Throwable>()\n\n            val rehashes = (0..lines.size - 1).map { \"r$it\" }\n\n            CommitHasher(repo, mockApi, rehashes, emails)\n                    .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n\n            val syntaxStats = mockApi.receivedAddedCommits\n                    .fold(mutableListOf<CommitStats>()) { allStats, commit ->\n                        allStats.addAll(commit.stats)\n                        allStats\n                    }.filter { it.type == ExtractorInterface.TYPE_LIBRARY }\n\n            val scssStats = syntaxStats.filter { it.tech == \"scss\" }\n            assertEquals(2, scssStats.size)\n            assertEquals(2, scssStats.map { it.numLinesAdded }.sum())\n            assertEquals(0, scssStats.map { it.numLinesDeleted }.sum())\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"commit with multiple authors\") {\n        val lines = listOf(\"line 1\", \"line 2\", \"line 3\", \"line 4\")\n\n        val author1 = Author(userName, userEmail)\n        val author2 = Author(secondUserName, secondUserEmail)\n\n        val testRepoPath = \"../testrepo-multiple-authors\"\n        val testRepo = TestRepo(testRepoPath)\n\n        val mockApi = MockApi(mockRepo = repo)\n\n        it(\"sends stats\") {\n            for (i in 0..lines.size - 1) {\n                val line = lines[i]\n                val fileName = \"file$i.ext\"\n                testRepo.createFile(fileName, listOf(line))\n                val message = \"$line in $fileName\\n\\nCo-authored-by: ${author2\n                        .name} <${author2.email}>\"\n                testRepo.commit(message = message, author = author1)\n            }\n            val gitHasherIn = Git.open(File(testRepoPath))\n            val jgitObservable = CommitCrawler.getJGitObservable(gitHasherIn,\n                extractCoauthors = true)\n            val observable = CommitCrawler.getObservable(gitHasherIn,\n                    jgitObservable, repo)\n\n            val errors = mutableListOf<Throwable>()\n\n            val rehashes = (0..lines.size - 1).map { \"r$it\" }\n\n            CommitHasher(repo, mockApi, rehashes, emails)\n                    .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n\n            val stats = mockApi.receivedAddedCommits\n            val actualAuthors = stats.map { it.author }.toHashSet()\n            assertEquals(2, actualAuthors.size)\n            assertTrue(author1 in actualAuthors)\n            assertTrue(author2 in actualAuthors)\n        }\n    }\n\n    cleanRepos()\n})\n"
  },
  {
    "path": "src/test/kotlin/test/tests/hashers/FactHasherTest.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n\npackage test.tests.hashers\n\nimport app.FactCodes\nimport app.api.MockApi\nimport app.hashers.CommitCrawler\nimport app.hashers.FactHasher\nimport app.model.Author\nimport app.model.Fact\nimport app.model.Repo\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\nimport test.utils.TestRepo\nimport test.utils.assertFactDouble\nimport test.utils.assertFactInt\nimport java.util.*\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\nclass FactHasherTest : Spek({\n    val authorEmail1 = \"test1@domain.com\"\n    val authorEmail2 = \"test2@domain.com\"\n    val author1 = Author(\"Test1\", authorEmail1)\n    val author2 = Author(\"Test2\", authorEmail2)\n\n    val repoPath = \"../testrepo-fact-hasher-\"\n    val repo = Repo(rehash = \"rehash\", commits = listOf())\n\n    fun createDate(year: Int = 2017, month: Int = 1, day: Int = 1,\n                   hour: Int = 0, minute: Int = 0, seconds: Int = 0): Date {\n        val cal = Calendar.getInstance()\n        // Month in calendar is 0-based.\n        cal.set(year, month - 1, day, hour, minute, seconds)\n        return cal.time\n    }\n\n    given(\"commits for date facts\") {\n        val testRepo = TestRepo(repoPath + \"date-facts\")\n        val emails = hashSetOf(authorEmail1, authorEmail2)\n        val mockApi = MockApi(mockRepo = repo)\n        val facts = mockApi.receivedFacts\n\n        afterEachTest {\n            facts.clear()\n        }\n\n        it(\"sends initial facts\") {\n            testRepo.createFile(\"test1.txt\", listOf(\"line1\", \"line2\"))\n            testRepo.commit(message = \"initial commit\",\n                author = author1,\n                date = createDate(year = 2017, month = 1, day = 1,  // Sunday.\n                    hour = 13, minute = 0, seconds = 0))\n\n            val errors = mutableListOf<Throwable>()\n            val observable = CommitCrawler.getObservable(testRepo.git, repo)\n            FactHasher(repo, mockApi, listOf(\"r1\"), emails)\n                .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n            assertTrue(facts.contains(Fact(repo, FactCodes.COMMIT_DAY_TIME, 13,\n                                           \"1\", author1)))\n            assertTrue(facts.contains(Fact(repo, FactCodes.COMMIT_DAY_WEEK, 6,\n                                           \"1\", author1)))\n        }\n\n        it(\"sends more facts\") {\n            testRepo.createFile(\"test2.txt\", listOf(\"line1\", \"line2\"))\n            testRepo.commit(message = \"second commit\",\n                author = author2,\n                date = createDate(year=2017, month = 1, day = 2,  // Monday.\n                    hour = 18, minute = 0, seconds = 0))\n\n            testRepo.createFile(\"test3.txt\", listOf(\"line1\", \"line2\"))\n            testRepo.commit(message = \"third commit\",\n                author = author1,\n                date = createDate(year=2017, month = 1, day = 2,  // Monday.\n                    hour = 13, minute = 0, seconds = 0))\n\n            val errors = mutableListOf<Throwable>()\n            val observable = CommitCrawler.getObservable(testRepo.git, repo)\n            FactHasher(repo, mockApi, listOf(\"r1\", \"r2\"), emails)\n                .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n            assertTrue(facts.contains(Fact(repo, FactCodes.COMMIT_DAY_TIME, 18,\n                                           \"1\", author2)))\n            assertTrue(facts.contains(Fact(repo, FactCodes.COMMIT_DAY_WEEK, 0,\n                                           \"1\", author2)))\n            assertTrue(facts.contains(Fact(repo, FactCodes.COMMIT_DAY_TIME, 13,\n                                           \"2\", author1)))\n            assertTrue(facts.contains(Fact(repo, FactCodes.COMMIT_DAY_WEEK, 0,\n                                           \"1\", author1)))\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"test of repo facts\") {\n        val testRepo = TestRepo(repoPath + \"repo-facts\")\n        val emails = hashSetOf(authorEmail1, authorEmail2)\n        val mockApi = MockApi(mockRepo = repo)\n        val facts = mockApi.receivedFacts\n\n        afterEachTest {\n            facts.clear()\n        }\n\n        it(\"sends facts\") {\n            val startAuthor1 = createDate(year = 2016, month = 2, day = 10,\n                                          hour = 13, minute = 0, seconds = 0)\n            val midAuthor1 = createDate(year = 2016, month = 10, day = 5,\n                                        hour = 10, minute = 0, seconds = 0)\n            val startAuthor2 = createDate(year = 2017, month = 1, day = 1,\n                                          hour = 12, minute = 10, seconds = 10)\n            val midAuthor2 = createDate(year = 2017, month = 2, day = 2,\n                                        hour = 15, minute = 0, seconds = 0)\n            val endAuthor1 = createDate(year = 2017, month = 4, day = 5,\n                                        hour = 13, minute = 0, seconds = 0)\n            val endAuthor2 = createDate(year = 2017, month = 5, day = 15,\n                                        hour = 15, minute = 0, seconds = 0)\n\n            testRepo.createFile(\"test1.txt\", listOf(\"line1\", \"line2\"))\n            testRepo.commit(message = \"author1 -> start\",\n                            author = author1,\n                            date = startAuthor1)\n\n            testRepo.insertLines(\"test1.txt\", 0, listOf(\"line3\"))\n            testRepo.commit(message = \"author1 -> mid\",\n                            author = author1,\n                            date = midAuthor1)\n\n            testRepo.createFile(\"test2.txt\", listOf(\"line4\"))\n            testRepo.commit(message = \"author2 -> start\",\n                            author = author2,\n                            date = startAuthor2)\n\n            testRepo.insertLines(\"test2.txt\", 0, listOf(\"line5\"))\n            testRepo.commit(message = \"author2 -> mid\",\n                            author = author2,\n                            date = midAuthor2)\n\n            testRepo.insertLines(\"test1.txt\", 0, listOf(\"line6\"))\n            testRepo.commit(message = \"author1 -> end\",\n                            author = author1,\n                            date = endAuthor1)\n\n            testRepo.insertLines(\"test2.txt\", 0, listOf(\"line7\"))\n            testRepo.commit(message = \"author2 -> end\",\n                            author = author2,\n                            date = endAuthor2)\n\n            val errors = mutableListOf<Throwable>()\n            val observable = CommitCrawler.getObservable(testRepo.git, repo)\n            FactHasher(repo, mockApi,\n                listOf(\"r1\", \"r2\", \"r3\", \"r4\", \"r5\", \"r6\"), emails)\n                .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n            assertTrue(facts.contains(Fact(repo, FactCodes.REPO_DATE_START, 0,\n                (startAuthor1.time/1000).toString(), author1)))\n            assertTrue(facts.contains(Fact(repo, FactCodes.REPO_DATE_START, 0,\n                (startAuthor2.time/1000).toString(), author2)))\n            assertTrue(facts.contains(Fact(repo, FactCodes.REPO_DATE_END, 0,\n                (endAuthor1.time/1000).toString(), author1)))\n            assertTrue(facts.contains(Fact(repo, FactCodes.REPO_DATE_END, 0,\n                (endAuthor2.time/1000).toString(), author2)))\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"test of commit facts\") {\n        val testRepo = TestRepo(repoPath + \"commit-facts\")\n        val emails = hashSetOf(authorEmail1, authorEmail2)\n        val mockApi = MockApi(mockRepo = repo)\n        val facts = mockApi.receivedFacts\n        val lines = listOf(\n            \"All my rap, if shortly, is about the thing that\",\n            \"For so many years so many cities have been under hoof\",\n            \"To go uphill when gets lucky. Then downhill when feels sick\",\n            \"I'm not really a Gulliver, but still the city is under hoof\",\n            \"City under hoof, city under hoof\",\n            \"Traffic lights, state duties, charges and customs\",\n            \"I don't know whether this path is wade or to the bottom\",\n            \"You live under a thumb, I have a city under my hoof\",\n            \"All my rap, if shortly, is about the thing that\",\n            \"For so many years so many cities have been under hoof\",\n            \"To go uphill when gets lucky. Then downhill when feels sick\",\n            \"I'm not really a Gulliver, but still the city is under hoof\",\n            \"City under hoof, city under hoof\",\n            \"Traffic lights, state duties, charges and customs\",\n            \"I don't know whether this path is wade or to the bottom\",\n            \"You live under a thumb, I have a city under my hoof\",\n            \"All my rap, if shortly, is about the thing that\",\n            \"For so many years so many cities have been under hoof\",\n            \"To go uphill when gets lucky. Then downhill when feels sick\",\n            \"I'm not really a Gulliver, but still the city is under hoof\",\n            \"City under hoof, city under hoof\",\n            \"Traffic lights, state duties, charges and customs\",\n            \"I don't know whether this path is wade or to the bottom\",\n            \"You live under a thumb, I have a city under my hoof\"\n        )\n        val linesLenAvg = lines.fold (0) { acc, s -> acc + s.length } /\n            lines.size.toDouble()\n\n        afterEachTest {\n            facts.clear()\n        }\n\n        it(\"sends facts\") {\n            testRepo.createFile(\"test1.txt\", listOf())\n\n            testRepo.insertLines(\"test1.txt\", 0, lines.subList(0, 3))\n            testRepo.commit(message = \"Commit 1\", author = author1)\n\n            testRepo.insertLines(\"test1.txt\", 0, lines.subList(3, 6))\n            testRepo.commit(message = \"Commit 2\", author = author1)\n\n            testRepo.insertLines(\"test1.txt\", 0, lines.subList(6, 9))\n            testRepo.commit(message = \"Commit 3\", author = author1)\n\n            testRepo.insertLines(\"test1.txt\", 0, lines.subList(9, 12))\n            testRepo.commit(message = \"Commit 4\", author = author1)\n\n            testRepo.insertLines(\"test1.txt\", 0, lines.subList(12, 16))\n            testRepo.commit(message = \"Commit 5\", author = author1)\n\n            testRepo.insertLines(\"test1.txt\", 0, lines.subList(16, 24))\n            testRepo.commit(message = \"Commit 6\", author = author1)\n\n            val errors = mutableListOf<Throwable>()\n            val observable = CommitCrawler.getObservable(testRepo.git, repo)\n            FactHasher(repo, mockApi,\n                listOf(\"r1\", \"r2\", \"r3\", \"r4\", \"r5\", \"r6\"), emails)\n                .updateFromObservable(observable, { e -> errors.add(e) })\n\n            assertEquals(0, errors.size)\n            assertFactInt(FactCodes.COMMIT_NUM, 0, 6, author1, facts)\n            assertFactDouble(FactCodes.COMMIT_LINE_NUM_AVG, 0, 4.0, author1,\n                facts)\n            assertFactInt(FactCodes.LINE_NUM, 0, 24, author1, facts)\n            assertFactDouble(FactCodes.LINE_LEN_AVG, 0, linesLenAvg, author1,\n                facts)\n            assertFactInt(FactCodes.COMMIT_NUM_TO_LINE_NUM, 3, 4, author1,\n                facts)\n            assertFactInt(FactCodes.COMMIT_NUM_TO_LINE_NUM, 4, 1, author1,\n                facts)\n            assertFactInt(FactCodes.COMMIT_NUM_TO_LINE_NUM, 8, 1, author1,\n                facts)\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"commits for naming convention facts\") {\n        val testRepo = TestRepo(repoPath + \"file-facts\")\n        val emails = hashSetOf(authorEmail1)\n        val mockApi = MockApi(mockRepo = repo)\n        val facts = mockApi.receivedFacts\n\n        afterEachTest {\n            facts.clear()\n        }\n\n        val lines = listOf(\"camelCase1\", \"camelCase2\", \"snake_case\", \"fn()\")\n\n        it(\"sends facts\") {\n            for (i in 0..lines.size - 1) {\n                val line = lines[i]\n                val fileName = \"file$i.txt\"\n                testRepo.createFile(fileName, listOf(line))\n                testRepo.commit(message = \"$line in $fileName\",\n                                author = author1)\n            }\n\n            val errors = mutableListOf<Throwable>()\n            val observable = CommitCrawler.getObservable(testRepo.git, repo)\n            val rehashes = (0..lines.size - 1).map { \"r$it\" }\n\n            FactHasher(repo, mockApi, rehashes, emails)\n                    .updateFromObservable(observable, { e -> errors.add(e) })\n            assertEquals(0, errors.size)\n\n            assertFactInt(FactCodes.VARIABLE_NAMING,\n                FactCodes.VARIABLE_NAMING_SNAKE_CASE, 1, author1, facts)\n            assertFactInt(FactCodes.VARIABLE_NAMING,\n                FactCodes.VARIABLE_NAMING_CAMEL_CASE, 2, author1, facts)\n            assertFactInt(FactCodes.VARIABLE_NAMING,\n                FactCodes.VARIABLE_NAMING_OTHER, 1, author1, facts)\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    given(\"commits for indentation facts\") {\n        val testRepo = TestRepo(repoPath + \"indentation-facts\")\n        val emails = hashSetOf(authorEmail1)\n        val mockApi = MockApi(mockRepo = repo)\n        val facts = mockApi.receivedFacts\n\n        afterEachTest {\n            facts.clear()\n        }\n\n        val lines = listOf(\"\\tdef test()\", \"\\t\\tdef fn()\", \"a b c d\", \"    \",\n            \"    def fn()\")\n\n        it(\"sends facts\") {\n            for (i in 0..lines.size - 1) {\n                val line = lines[i]\n                val fileName = \"file$i.txt\"\n                testRepo.createFile(fileName, listOf(line))\n                testRepo.commit(message = \"$line in $fileName\",\n                                author = author1)\n            }\n\n            val errors = mutableListOf<Throwable>()\n            val observable = CommitCrawler.getObservable(testRepo.git, repo)\n            val rehashes = (0..lines.size - 1).map { \"r$it\" }\n\n            FactHasher(repo, mockApi, rehashes, emails)\n                    .updateFromObservable(observable, { e -> errors.add(e) })\n            assertEquals(0, errors.size)\n\n            assertFactInt(FactCodes.INDENTATION,\n                    FactCodes.INDENTATION_TABS, 2, author1, facts)\n            assertFactInt(FactCodes.INDENTATION,\n                    FactCodes.INDENTATION_SPACES, 1, author1, facts)\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n})\n"
  },
  {
    "path": "src/test/kotlin/test/tests/hashers/IgnorePathsTest.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage test.tests.hashers\n\nimport app.api.MockApi\nimport app.extractors.ExtractorInterface\nimport app.hashers.CommitHasher\nimport app.hashers.CommitCrawler\nimport app.model.*\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\nimport test.utils.TestRepo\nimport kotlin.test.assertEquals\n\nclass IgnorePathsTest : Spek({\n    fun cleanRepos() {\n        Runtime.getRuntime().exec(\"src/test/delete_repo.sh\").waitFor()\n    }\n\n    val userName = \"Contributor\"\n    val userEmail = \"test@domain.com\"\n\n    // Creation of test repo.\n    cleanRepos()\n\n    given(\"commits with syntax stats\") {\n        val lines = listOf(\"x = [i**2 for i range(9999)]\", \"def fn()\", \"x = 1\",\n                \"x = map(lambda x: x**2, range(9999))\",\n                \"x = map(lambda x: x**2, map(lambda x: x**3, range(10))\",\n                \"x = map(lambda x: x**2, range(10)),\" +\n                        \"map(lambda x: x**3, range(10)))\")\n\n        val author = Author(userName, userEmail)\n        val emails = hashSetOf(userEmail)\n\n        val testRepoPath = \"../IgnorePaths_t1\"\n        val testRepo = TestRepo(testRepoPath)\n\n        val testRehash = \"rehash_IgnorePaths_t1\"\n        val serverRepo = Repo(rehash = testRehash)\n\n        val mockApi = MockApi(mockRepo = serverRepo)\n        val observable = CommitCrawler.getObservable(testRepo.git, serverRepo)\n\n        it(\"t1\") {\n            testRepo.createFile(\"test.py\", lines)\n            testRepo.commit(message = \"commit1\", author = author)\n\n            testRepo.createFile(\"ignore.py\", lines)\n            testRepo.commit(message = \"commit2\", author = author)\n\n            // Add config, ignore.py from previous commit should be\n            // ignored for stats.\n            testRepo.createFile(\".sourcerer-conf\",\n                                listOf(\"[ignore]\", \"ignore.py\", \"#test.py\"))\n            testRepo.commit(message = \"commit3\", author = author)\n\n            // Uncomment test.py file in config and delete it. The change\n            // should be ignored for statistics.\n            testRepo.deleteLines(\".sourcerer-conf\", 1, 1)\n            testRepo.insertLines(\".sourcerer-conf\", 1, listOf(\"test.py\"))\n            testRepo.commit(message = \"commit4\", author = author)\n\n            testRepo.deleteFile(\"test.py\")\n            testRepo.commit(message = \"commit5\", author = author)\n\n            val errors = mutableListOf<Throwable>()\n            CommitHasher(serverRepo, mockApi, listOf(\"rehashes\"), emails)\n                .updateFromObservable(observable, { e -> errors.add(e) })\n            if (errors.size > 0) {\n                println(errors[0].message)\n            }\n            assertEquals(0, errors.size)\n\n            val syntaxStats = mockApi.receivedAddedCommits\n                .fold(mutableListOf<CommitStats>()) { allStats, commit ->\n                    allStats.addAll(commit.stats)\n                    allStats\n                }.filter { it.type == ExtractorInterface.TYPE_SYNTAX }\n\n            val mapStats = syntaxStats.filter { it.tech == \"python>map\" }\n            assertEquals(1, mapStats.size)\n            assertEquals(5, mapStats.map { it.numLinesAdded }.sum())\n            assertEquals(0, mapStats.map { it.numLinesDeleted }.sum())\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    cleanRepos()\n})\n"
  },
  {
    "path": "src/test/kotlin/test/tests/hashers/IgnoreVendorsTest.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n\npackage test.tests.hashers\n\nimport app.api.MockApi\nimport app.hashers.CommitHasher\nimport app.hashers.CommitCrawler\nimport app.model.*\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\nimport test.utils.TestRepo\nimport kotlin.test.assertEquals\n\nclass IgnoreVendorsTest : Spek({\n    fun cleanRepos() {\n        Runtime.getRuntime().exec(\"src/test/delete_repo.sh\").waitFor()\n    }\n\n    val userName = \"Contributor\"\n    val userEmail = \"test@domain.com\"\n\n    // Creation of test repo.\n    cleanRepos()\n\n    given(\"Ignove vendor files\") {\n        val author = Author(userName, userEmail)\n        val emails = hashSetOf(userEmail)\n\n        val testRepoPath = \"../IgnoreVendors_t1\"\n        val testRepo = TestRepo(testRepoPath)\n\n        val testRehash = \"rehash_IgnoreVendors_t1\"\n        val serverRepo = Repo(rehash = testRehash)\n\n        val mockApi = MockApi(mockRepo = serverRepo)\n        val observable = CommitCrawler.getObservable(testRepo.git, serverRepo)\n\n        it(\"t1: JS\") {\n            val lines = listOf(\n                \"let i = 0\"\n            )\n\n            testRepo.createFile(\"lala.js\", lines)\n            testRepo.createFile(\"pdf.worker.js\", lines)\n            testRepo.commit(message = \"commit1\", author = author)\n\n            val errors = mutableListOf<Throwable>()\n            CommitHasher(serverRepo, mockApi, listOf(\"rehashes\"), emails)\n                .updateFromObservable(observable, { e -> errors.add(e) })\n            if (errors.size > 0) {\n                println(errors[0].message)\n            }\n            assertEquals(0, errors.size)\n\n            val mapStats = mockApi.receivedAddedCommits\n                .fold(mutableListOf<CommitStats>()) { allStats, commit ->\n                    allStats.addAll(commit.stats)\n                    allStats\n                }\n\n            assertEquals(1, mapStats.size)\n            assertEquals(1, mapStats.map { it.numLinesAdded }.sum())\n            assertEquals(0, mapStats.map { it.numLinesDeleted }.sum())\n        }\n\n        it(\"t2: ipynb files\") {\n            val lines = \"\"\"{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<style>.container { width:90% !important; }</style>\"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"from IPython.core.display import display, HTML\",\n    \"display(HTML(\\\"<style>.container { width:90% !important; }</style>\\\"))\"\n   ]\n  }]}\"\"\".split(\"\\n\")\n\n            testRepo.createFile(\"lala.ipynb\", lines)\n            testRepo.commit(message = \"commit with ipython\", author = author)\n\n            val errors = mutableListOf<Throwable>()\n            CommitHasher(serverRepo, mockApi, listOf(\"rehashes\"), emails)\n                    .updateFromObservable(observable, { e -> errors.add(e) })\n            assertEquals(0, errors.size)\n\n            val stats = mockApi.receivedAddedCommits\n            .fold(mutableListOf<CommitStats>()) { allStats, commit ->\n                allStats.addAll(commit.stats)\n                allStats\n            }\n\n            assertEquals(3, stats.size)\n            assertEquals(4, stats.map { it.numLinesAdded }.sum())\n            assertEquals(0, stats.map { it.numLinesDeleted }.sum())\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n\n    cleanRepos()\n})\n"
  },
  {
    "path": "src/test/kotlin/test/tests/hashers/MetaHasherTest.kt",
    "content": "// Copyright 2018 Sourcerer Inc. All Rights Reserved.\n// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage test.tests.hashers\n\nimport app.FactCodes\nimport app.api.MockApi\nimport app.hashers.MetaHasher\nimport app.model.Author\nimport app.model.Repo\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\nimport test.utils.TestRepo\nimport test.utils.assertFactInt\nimport test.utils.assertNoFact\n\nclass MetaHasherTest : Spek({\n    val repoPath = \"../testrepo-meta-hasher-\"\n    val repo = Repo(rehash = \"rehash\", commits = listOf())\n\n    given(\"repo for team size fact\") {\n        val testRepo = TestRepo(repoPath + \"team-size-fact\")\n        val authors = hashSetOf(\n            Author(\"Alexander Ivanov\", \"ivanov.alexander@gmail.com\"),\n            Author(\"Maxim Zayac\", \"maxim95@sourcerer.io\"),\n            Author(\"yablonskaya\", \"lyablonskaya@sourcerer.io\"),\n            Author(\"Lubov Yablonskaya\", \"lyablonskaya@sourcerer.io\"),\n            Author(\"Alexander Ivanov\", \"aleks@riseup.net\"),\n            Author(\"Roman Romov\", \"roman.romov@gmail.com\"),\n            Author(\"Liubov Yablonskaya\", \"lyablonskaya@sourcerer.io\"),\n            Author(\"Taleh Yandex\", \"yandex007@ya.ru\"),\n            Author(\"Maxim Zayac\", \"mak-zayac@yandex.ru\"),\n            Author(\"Dmitry Yablokov\", \"dmitry.yablokov@gmail.com\"),\n            Author(\"yablokov\", \"yablokov@phystech.edu\"),\n            Author(\"Yablokov Dmitriy Andreevich\", \"d.yablokov@tinkoff.ru\"),\n            Author(\"Dmitry Yablokov\", \"yablokov@phystech.edu\"),\n            Author(\"Dmitry Yablokov\", \"yablokov@yandex-team.ru\"),\n            Author(\"John Brown\", \"john@mail.mail\"),\n            Author(\"Johnny Brown\", \"john123@mail.mail\"))\n        val commits = hashMapOf(\n            Pair(\"aleks@upupup.net\", 0),\n            Pair(\"d.yablokov@tinkoff.ru\", 10),\n            Pair(\"dmitry.yablokov@gmail.com\", 10),\n            Pair(\"ivanov.alexander@gmail.com\", 10),\n            Pair(\"john123@mail.mail\", 10),\n            Pair(\"john@mail.mail\", 10),\n            Pair(\"lyablonskaya@sourcerer.io\", 10),\n            Pair(\"mak-zayac@yandex.ru\", 10),\n            Pair(\"maxim95@sourcerer.io\", 10),\n            Pair(\"roman.romov@gmail.com\", 10),\n            Pair(\"yablokov@phystech.edu\", 10),\n            Pair(\"yablokov@yandex-team.ru\", 20),\n            Pair(\"yandex007@ya.ru\", 20)\n        )\n        val userEmails = listOf(\n            \"john123@mail.mail\",\n            \"john@mail.mail\"\n        )\n        val authorsList = authors.toList()\n        val mockApi = MockApi(mockRepo = repo)\n        val facts = mockApi.receivedFacts\n\n        afterEachTest {\n            facts.clear()\n        }\n\n        it(\"sends facts\") {\n            for (i in 0..authors.size - 1) {\n                val line = \"line number $i\"\n                val fileName = \"file$i.txt\"\n                testRepo.createFile(fileName, listOf(line))\n                testRepo.commit(message = \"$line in $fileName\",\n                                author = authorsList[i])\n            }\n\n            MetaHasher(repo, mockApi).calculateAndSendFacts(authors, commits,\n                userEmails)\n\n            assertFactInt(FactCodes.COMMIT_SHARE, 0, 20,\n                Author(email = userEmails.first()), facts = facts)\n            assertFactInt(FactCodes.COMMIT_SHARE_REPO_AVG, 0, 20, facts = facts)\n            assertFactInt(FactCodes.REPO_TEAM_SIZE, 0, 7, facts = facts)\n        }\n\n        it(\"sends facts (user not contributor)\") {\n            for (i in 0..authors.size - 1) {\n                val line = \"line number $i\"\n                val fileName = \"file$i.txt\"\n                testRepo.createFile(fileName, listOf(line))\n                testRepo.commit(message = \"$line in $fileName\",\n                    author = authorsList[i])\n            }\n\n            MetaHasher(repo, mockApi).calculateAndSendFacts(authors, commits,\n                listOf())\n\n            assertNoFact(FactCodes.COMMIT_SHARE, 0,\n                Author(email = userEmails.first()), facts = facts)\n            assertFactInt(FactCodes.COMMIT_SHARE_REPO_AVG, 0, 20, facts = facts)\n            assertFactInt(FactCodes.REPO_TEAM_SIZE, 0, 7, facts = facts)\n        }\n\n        afterGroup {\n            testRepo.destroy()\n        }\n    }\n})\n"
  },
  {
    "path": "src/test/kotlin/test/tests/utils/FileHelperTest.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Ryan Osilla (ryan@sourcerer.io)\n\npackage test.tests.utils\n\nimport org.jetbrains.spek.api.Spek\nimport org.jetbrains.spek.api.dsl.given\nimport org.jetbrains.spek.api.dsl.it\nimport kotlin.test.assertEquals\nimport app.utils.FileHelper.toPath\nimport java.nio.file.Paths\n\nfun testPath(expectedPath: String, actualPath: String) {\n    assertEquals(Paths.get(expectedPath), actualPath.toPath())\n}\n\nclass FileHelperTest : Spek({\n    given(\"relative path test\") {\n        it(\"basic\") {\n            val home = System.getProperty(\"user.home\")\n            testPath(\"/Users/user/repo\", \"/Users/user/repo\")\n            testPath(\"/Users/user/repo\", \"/Users/user/../user/repo/../repo\")\n            testPath(\"$home/test\", \"~/test\")\n            testPath(\"$home/test1\", \"~/test/../test1\")\n        }\n    }\n})\n"
  },
  {
    "path": "src/test/kotlin/test/utils/FactHelper.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage test.utils\n\nimport app.model.Author\nimport app.model.Fact\nimport kotlin.test.assertEquals\nimport kotlin.test.assertNotNull\nimport kotlin.test.assertNull\nimport kotlin.test.assertTrue\n\nfun getFact(code: Int, key: Int, author: Author? = null,\n            facts: List<Fact>): Fact {\n    val fact = facts.find { fact -> fact.code == code && fact.key == key &&\n        (author == null || fact.author == author) }\n    assertNotNull(fact)\n    return fact!!\n}\n\nfun assertFactInt(code: Int, key: Int, value: Int, author: Author? = null,\n                  facts: List<Fact>) {\n    val fact = getFact(code, key, author, facts)\n    assertEquals(value, fact.value.toInt())\n}\n\nfun assertNoFact(code: Int, key: Int, author: Author? = null,\n                 facts: List<Fact>) {\n    val fact = facts.find { fact -> fact.code == code && fact.key == key &&\n        (author == null || fact.author == author) }\n    assertNull(fact)\n}\n\nfun assertFactDouble(code: Int, key: Int, value: Double, author: Author? = null,\n                     facts: List<Fact>) {\n    val fact = getFact(code, key, author, facts)\n    assertTrue(Math.abs(value - fact.value.toDouble()) < 0.1,\n        \"Expected approximately <$value>, actual <${fact.value}>\")\n}\n"
  },
  {
    "path": "src/test/kotlin/test/utils/TestRepo.kt",
    "content": "// Copyright 2017 Sourcerer Inc. All Rights Reserved.\n// Author: Alexander Surkov (alex@sourcerer.io)\n// Author: Anatoly Kislov (anatoly@sourcerer.io)\n\npackage test.utils\n\nimport app.model.Author\nimport java.io.BufferedReader\nimport java.io.BufferedWriter\nimport java.io.File\nimport java.io.FileReader\nimport java.io.FileWriter\nimport java.io.StringWriter\n\nimport org.eclipse.jgit.api.Git\nimport org.eclipse.jgit.lib.PersonIdent\nimport org.eclipse.jgit.revwalk.RevCommit\nimport java.util.*\n\n/**\n * A wrapper around Git repo allowing to add/remove/edit files and make commits.\n */\nclass TestRepo(val repoPath: String) {\n    val userName = \"Contributor\"\n    val userEmail = \"test@sourcerer.com\"\n\n    val git = initGit()\n\n    init {\n        val config = git.repository.config\n        config.setString(\"user\", null, \"name\", userName)\n        config.setString(\"user\", null, \"email\", userEmail)\n        config.save()\n    }\n\n    private fun initGit(): Git {\n        destroy()  // Remove repo directory if exists.\n        return Git.init().setDirectory(File(repoPath)).call()\n    }\n\n    fun createFile(fileName: String, content: List<String>) {\n        val file = File(\"$repoPath/$fileName\")\n        val writer = BufferedWriter(FileWriter(file))\n        for (line in content) {\n            writer.write(line)\n            writer.newLine()\n        }\n        writer.close()\n        git.add().addFilepattern(fileName).call();\n    }\n\n    fun deleteFile(fileName: String) {\n        File(\"$repoPath/$fileName\").delete()\n    }\n\n    fun insertLines(fileName: String, insIndex: Int, insLines: List<String>) {\n        val file = File(\"$repoPath/$fileName\")\n        val reader = BufferedReader(FileReader(file))\n\n        val tmpStrWriter = StringWriter()\n        val tmpWriter = BufferedWriter(tmpStrWriter)\n\n        var lineIdx = 0\n        for (line in reader.lines()) {\n            // Insertion case\n            if (lineIdx == insIndex) {\n                for (insLine in insLines) {\n                    tmpWriter.write(insLine)\n                    tmpWriter.newLine()\n                }\n            }\n\n            tmpWriter.write(line)\n            tmpWriter.newLine()\n            lineIdx++\n        }\n\n        // Append case\n        if (lineIdx == insIndex) {\n            for (insLine in insLines) {\n                tmpWriter.write(insLine)\n                tmpWriter.newLine()\n            }\n        }\n\n        tmpWriter.flush()\n\n        val writer = FileWriter(file)\n        writer.write(tmpStrWriter.toString())\n        writer.close()\n    }\n\n    fun deleteLines(fileName: String, startIndex: Int, endIndex: Int) {\n        val file = File(\"$repoPath/$fileName\")\n        val reader = BufferedReader(FileReader(file))\n\n        val tmpStrWriter = StringWriter()\n        val tmpWriter = BufferedWriter(tmpStrWriter)\n\n        var lineIdx = 0\n        for (line in reader.lines()) {\n            if (lineIdx < startIndex || lineIdx > endIndex) {\n                tmpWriter.write(line)\n                tmpWriter.newLine()  \n            }\n            lineIdx++\n        }\n        tmpWriter.flush()\n\n        val writer = FileWriter(file)\n        writer.write(tmpStrWriter.toString())\n        writer.close()\n    }\n\n    fun commit(message: String,\n               author: Author = Author(userName, userEmail),\n               date: Date = Date(),\n               timeZone: TimeZone = TimeZone.getDefault()): RevCommit {\n        val personIdent = PersonIdent(author.name, author.email, date, timeZone)\n        return git.commit().setMessage(message).setAll(true)\n                  .setAuthor(personIdent).setCommitter(personIdent).call()\n    }\n\n    fun destroy() {\n        Runtime.getRuntime().exec(\"rm -r $repoPath\").waitFor()\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/devops/circleci/.circleci/config.yml",
    "content": "version: 2\njobs:\n  build:\n    docker:\n      - image: circleci/<language>:<version TAG>\n    steps:\n      - checkout\n      - run: <command>\n  test:\n    docker:\n      - image: circleci/<language>:<version TAG>\n    steps:\n      - checkout\n      - run: <command>\nworkflows:\n  version: 2\n  build_and_test:\n    jobs:\n      - build\n      - test\n"
  },
  {
    "path": "src/test/resources/samples/devops/docker/Dockerfile",
    "content": "FROM python:3\nENV PYTHONUNBUFFERED 1\nRUN mkdir /code\nWORKDIR /code\nCOPY requirements.txt /code/\nRUN pip install -r requirements.txt\nCOPY . /code/\n"
  },
  {
    "path": "src/test/resources/samples/devops/docker/alpine.Dockerfile",
    "content": "FROM alpine:3.4\n\nRUN apk update\nRUN apk add vim\nRUN apk add curl\n"
  },
  {
    "path": "src/test/resources/samples/devops/docker/docker-compose.yml",
    "content": "version: '3'\n\nservices:\n  db:\n    image: postgres\n  web:\n    build: .\n    command: python manage.py runserver 0.0.0.0:8000\n    volumes:\n      - .:/code\n    ports:\n      - \"8000:8000\"\n    depends_on:\n      - db\n"
  },
  {
    "path": "src/test/resources/samples/devops/drone/.drone.yml",
    "content": "---\nkind: pipeline\nname: default\n\nplatform:\n  os: linux\n  arch: amd64\n\nsteps:\n- name: test\n  image: alpine:3.8\n  commands:\n  - apk add curl\n  - sleep 45\n  - curl http://database:9200\n\nservices:\n- name: database\n  image: elasticsearch:5-alpine\n  ports:\n  - 9200\n"
  },
  {
    "path": "src/test/resources/samples/devops/github-actions/.github/workflows/ci.yml",
    "content": "name: Greet Everybody\n# This workflow is triggered on pushes to the repository.\non: [push]\n\njobs:\n  build:\n    # Job name is Greeting\n    name: Greeting\n    # This job runs on Linux\n    runs-on: ubuntu-latest\n    steps:\n    # This step uses the hello-world-action stored in this workflow's repository.\n    - uses: ./hello-world-action\n      with:\n        who-to-greet: 'Octocat'\n      id: hello\n    # This step prints the time.\n    - run: echo \"The time was ${{ steps.hello.outputs.time }}\"\n"
  },
  {
    "path": "src/test/resources/samples/devops/gitlab-ci/.gitlab-ci.yml",
    "content": "image: \"dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.6.3-golang-1.11-git-2.22-chrome-73.0-node-12.x-yarn-1.16-postgresql-9.6-graphicsmagick-1.3.29\"\n\nvariables:\n  RAILS_ENV: \"test\"\n  NODE_ENV: \"test\"\n  SIMPLECOV: \"true\"\n  GIT_DEPTH: \"20\"\n  GIT_SUBMODULE_STRATEGY: \"none\"\n  GET_SOURCES_ATTEMPTS: \"3\"\n  KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/${CI_PROJECT_NAME}/rspec_report-master.json\n  FLAKY_RSPEC_SUITE_REPORT_PATH: rspec_flaky/report-suite.json\n  BUILD_ASSETS_IMAGE: \"false\"\n\nbefore_script:\n  - date\n  - source scripts/utils.sh\n  - source scripts/prepare_build.sh\n  - date\n\nafter_script:\n  - date\n\nstages:\n  - build\n  - prepare\n  - merge\n  - test\n  - review\n  - qa\n  - post-test\n  - pages\n\ninclude:\n  - local: .gitlab/ci/global.gitlab-ci.yml\n  - local: .gitlab/ci/cng.gitlab-ci.yml\n  - local: .gitlab/ci/docs.gitlab-ci.yml\n  - local: .gitlab/ci/frontend.gitlab-ci.yml\n  - local: .gitlab/ci/memory.gitlab-ci.yml\n  - local: .gitlab/ci/pages.gitlab-ci.yml\n  - local: .gitlab/ci/qa.gitlab-ci.yml\n  - local: .gitlab/ci/reports.gitlab-ci.yml\n  - local: .gitlab/ci/rails.gitlab-ci.yml\n  - local: .gitlab/ci/review.gitlab-ci.yml\n  - local: .gitlab/ci/setup.gitlab-ci.yml\n  - local: .gitlab/ci/test-metadata.gitlab-ci.yml\n  - local: .gitlab/ci/yaml.gitlab-ci.yml\n"
  },
  {
    "path": "src/test/resources/samples/devops/jenkins/Jenkinsfile",
    "content": "node {\n\tstage 'Checkout'\n\t\tcheckout scm\n\n\tstage 'Build'\n\t\tbat 'nuget restore SolutionName.sln'\n\t\tbat \"\\\"${tool 'MSBuild'}\\\" SolutionName.sln /p:Configuration=Release /p:Platform=\\\"Any CPU\\\" /p:ProductVersion=1.0.0.${env.BUILD_NUMBER}\"\n\n\tstage 'Archive'\n\t\tarchive 'ProjectName/bin/Release/**'\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/devops/k8s/postgres-manifest.yaml",
    "content": "apiVersion: \"acid.zalan.do/v1\"\nkind: postgresql\nmetadata:\n  name: acid-minimal-cluster\n  namespace: default\nspec:\n  teamId: \"ACID\"\n  volume:\n    size: 1Gi\n  numberOfInstances: 2\n  users:\n    zalando:  # database owner\n    - superuser\n    - createdb\n    foo_user: []  # role for application foo\n  databases:\n    foo: zalando  # dbname: owner\n  postgresql:\n    version: \"10\"\n"
  },
  {
    "path": "src/test/resources/samples/devops/k8s/rss-site.json",
    "content": "{\n  \"apiVersion\": \"v1\",\n  \"kind\": \"Pod\",\n  \"metadata\": {\n    \"name\": \"rss-site\",\n    \"labels\": {\n      \"app\": \"web\"\n    }\n  },\n  \"spec\": {\n    \"containers\": [{\n      \"name\": \"front-end\",\n      \"image\": \"nginx\",\n      \"ports\": [{\n        \"containerPort\": \"80\"\n      }]\n    },\n      {\n        \"name\": \"rss-reader\",\n        \"image\": \"nickchase/rss-php-nginx:v1\",\n        \"ports\": [{\n          \"containerPort\": \"88\"\n        }]\n      }]\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/devops/k8s/rss-site.yml",
    "content": "apiVersion: \"v1\"\nkind: \"Pod\"\nmetadata:\n  name: \"rss-site\"\n  labels:\n    app: \"web\"\nspec:\n  containers:\n  - name: \"front-end\"\n    image: \"nginx\"\n    ports:\n    - containerPort\": \"80\"\n  - name: \"rss-reader\"\n    image: \"nickchase/rss-php-nginx:v1\"\n    ports:\n    - containerPort\": \"88\"\n"
  },
  {
    "path": "src/test/resources/samples/devops/travis/.travis.yml",
    "content": "sudo: required\n\nlanguage: ruby\n\nservices:\n  - docker\n\nbefore_install:\n  - echo \"Testing Docker Hub credentials\"\n  - docker login -e=$DOCKER_EMAIL -u=$DOCKER_USERNAME -p=$DOCKER_PASSWORD\n  - echo \"Docker Hub credentials are working\"\n  - docker build -t build-springxd-base .\n\nscript:\n  - docker ps -a\n\nafter_success:\n  - echo \"Test Success - Branch($TRAVIS_BRANCH) Pull Request($TRAVIS_PULL_REQUEST) Tag($TRAVIS_TAG)\"\n  - if [[ \"$TRAVIS_BRANCH\" == \"master\" ]]; then echo -e \"Push Container to Docker Hub\"; fi\n  - docker login -e=$DOCKER_EMAIL -u=$DOCKER_USERNAME -p=$DOCKER_PASSWORD\n  - export REPO=jayjohnson/springxd-base\n  - export TAG=`if [ \"$TRAVIS_BRANCH\" == \"master\" ]; then echo \"latest\"; else echo $TRAVIS_BRANCH ; fi`\n  - docker build -f Dockerfile -t $REPO:$COMMIT .\n  - docker tag $REPO:$COMMIT $REPO:$TAG\n  - docker tag $REPO:$COMMIT $REPO:travis-$TRAVIS_BUILD_NUMBER\n  - docker push $REPO\n"
  },
  {
    "path": "src/test/resources/samples/langs/1C Enterprise/Catalog.ИсходящиеПисьма.Form.ФормаЭлемента.Form.Module.bsl",
    "content": "&НаСервереБезКонтекста\nФункция ПолучитьКонтактноеЛицоПоЭлектроннойПочте(ЭлектроннаяПочта)\n\tЗапрос = Новый Запрос;\n\tЗапрос.Текст = \"ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ ЭлектроннаяПочта = &ЭлектроннаяПочта\";\n\tЗапрос.Параметры.Вставить(\"ЭлектроннаяПочта\", СокрЛП(ЭлектроннаяПочта));\n\tВыборка = Запрос.Выполнить().Выбрать();\n\tКонтактноеЛицо = \"\";\n\tЕсли Выборка.Следующий() Тогда\n\t\tКонтактноеЛицо = Выборка.КонтактноеЛицо;\n\tКонецЕсли;\n\tВозврат КонтактноеЛицо;\nКонецФункции\n\n&НаСервереБезКонтекста\nФункция ПолучитьКонтактноеЛицоПоПолучателю(Получатель)\n\tЗапрос = Новый Запрос;\n\tЗапрос.Текст = \"ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Получатель\";\n\tЗапрос.Параметры.Вставить(\"Получатель\", Получатель);\n\tВыборка = Запрос.Выполнить().Выбрать();\n\tКонтактноеЛицо = \"\";\n\tЕсли Выборка.Следующий() Тогда\n\t\tКонтактноеЛицо = Выборка.КонтактноеЛицо;\n\tКонецЕсли;\n\tВозврат КонтактноеЛицо;\nКонецФункции\n\n&НаСервереБезКонтекста\nПроцедура ДобавитьПолучателей(Получатель, Получатели)\t\n\tЗапрос = Новый Запрос;\n\tЗапрос.Текст = \"ВЫБРАТЬ ЭлектроннаяПочта ИЗ Справочник.Контрагенты ГДЕ Ссылка \";\n\tЕсли ТипЗнч(Получатели) = Тип(\"Массив\") Тогда\n\t\tЗапрос.Текст = Запрос.Текст + \"В (&Получатели)\";\n\tИначе\n\t\tЗапрос.Текст = Запрос.Текст + \"= &Получатели\";\n\tКонецЕсли;\n\tЗапрос.Параметры.Вставить(\"Получатели\", Получатели);\n\tВыборка = Запрос.Выполнить().Выбрать();\n\tПока Выборка.Следующий() Цикл\n\t\tЕсли Получатель <> \"\" Тогда\n\t\t\tПолучатель = Получатель + \"; \";\n\t\tКонецЕсли;\n\t\tПолучатель = Получатель + Выборка.ЭлектроннаяПочта;\n\tКонецЦикла;\nКонецПроцедуры\n\n&НаСервере\nПроцедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)\n\tЕсли Параметры.Ключ.Пустая() Тогда\n\t\tЗаголовок = \"Исходящее письмо (Создание)\";\n\t\tОбъект.Дата = ТекущаяДата();\n\t\tПоШаблону = Параметры.Свойство(\"ПоШаблону\");\n\t\tВходящееПисьмо = Параметры.ВходящееПисьмо;\n\t\tЕсли ПоШаблону = Истина Тогда\n\t\t\tЭлементы.ЗаполнитьПоШаблону.Видимость = Истина;\n\t\t\tРаботаСПочтой.ЗаполнитьПисьмоПоШаблону(Объект, Содержимое);\n\t\tИначеЕсли Не ВходящееПисьмо.Пустая() Тогда\n\t\t\tРаботаСПочтой.ЗаполнитьОтветНаПисьмо(ВходящееПисьмо, Объект, Содержимое);\n\t\tКонецЕсли;\n\t\tАдресаты = Параметры.Адресаты;\n\t\tЕсли Адресаты <> Неопределено Тогда\n\t\t\tЗапрос = Новый Запрос;\n\t\t\tЗапрос.Текст = \"ВЫБРАТЬ\n\t\t\t               |\tКонтрагенты.ЭлектроннаяПочта\n\t\t\t               |ИЗ\n\t\t\t               |\tСправочник.Контрагенты КАК Контрагенты\n\t\t\t               |ГДЕ\n\t\t\t               |\tКонтрагенты.Ссылка В(&Адресаты)\n\t\t\t               |\tИ Контрагенты.ЭлектроннаяПочта <> \"\"\"\"\";\n\t\t\tЗапрос.УстановитьПараметр(\"Адресаты\", Адресаты);\t\t\t   \n\t\t\tПолучатель = \"\";\n\t\t\tВыборка = Запрос.Выполнить().Выбрать();\n\t\t\tПока Выборка.Следующий() Цикл\n\t\t\t\tЕсли Получатель <> \"\" Тогда\n\t\t\t\t\tПолучатель = Получатель + \"; \";\n\t\t\t\tКонецЕсли;\n\t\t\t\tПолучатель = Получатель + Выборка.ЭлектроннаяПочта;\n\t\t\tКонецЦикла;\n\t\t\tОбъект.Получатель = Получатель;\n\t\tКонецЕсли;\n\tКонецЕсли;\nКонецПроцедуры\n\n&НаСервере\nПроцедура ПриЧтенииНаСервере(ТекущийОбъект)\n\tСодержимое = ТекущийОбъект.Содержимое.Получить();\n\tЗаголовок = ТекущийОбъект.Наименование + \" (Исходящее письмо)\";\n\tЕсли  РаботаСПочтой.ПисьмоОтправлено(ТекущийОбъект.Ссылка) Тогда\n\t\tЗаголовок = Заголовок + \" - Отправлено\";\n\tКонецЕсли;\nКонецПроцедуры\n\n&НаСервере\nПроцедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)\n\tТекущийОбъект.Содержимое = Новый ХранилищеЗначения(Содержимое, Новый СжатиеДанных());\n\tТекущийОбъект.Текст = Содержимое.ПолучитьТекст();\nКонецПроцедуры\n\n&НаСервере\nФункция ОтправитьПисьмо(Ошибка)\n\tЕсли Не Записать() Тогда\n\t\tОшибка = \"ОшибкаЗаписи\";\n\t\tВозврат Ложь;\n\tКонецЕсли;\n\tЕсли Не РаботаСПочтой.ОтправитьПисьмо(Объект.Ссылка) Тогда\n\t\tОшибка = \"ОшибкаОтправки\";\n\t\tВозврат Ложь;\n\tКонецЕсли;\n\tЗаголовок = Заголовок + \" - Отправлено\";\n\tВозврат Истина;\nКонецФункции\n\n&НаКлиенте\nФункция ОтправитьПисьмоКлиент()\n\tОшибка = \"\";\n\tЕсли Не ОтправитьПисьмо(Ошибка) Тогда\n\t\tЕсли Ошибка = \"ОшибкаОтправки\" Тогда\n\t\t\tКнопки = Новый СписокЗначений;\n\t\t\tКнопки.Добавить(1, \"Настроить почту\");\n\t\t\tКнопки.Добавить(2, \"Закрыть\");\n\t\t\t\n\t\t\tОп = Новый ОписаниеОповещения(\n\t\t\t\t\"ОтправитьПисьмоКлиентВопросЗавершение\",\n\t\t\t\tЭтотОбъект);\n\t\t\tПоказатьВопрос(Оп,\n\t\t\t\t\"Не указаны настройки интернет почты!\", \n\t\t\t\tКнопки, , 1);\n\t\tКонецЕсли;\n\t\tВозврат Ложь;\n\tКонецЕсли;\n\t\n\tНавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Объект.Ссылка);\n\tПоказатьОповещениеПользователя(\"Письмо отправлено\", НавигационнаяСсылка, Объект.Наименование);\n\tОповеститьОбИзменении(Объект.Ссылка);\n\tВозврат Истина;\nКонецФункции\n\n&НаКлиенте\nПроцедура ОтправитьПисьмоКлиентВопросЗавершение(Результат, Параметры) Экспорт\n\tЕсли Результат = 1 Тогда\n\t\tОткрытьФорму(\"ОбщаяФорма.НастройкаПочты\");\n\tКонецЕсли;\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура Отправить(Команда)\n\tОтправитьПисьмоКлиент();\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура ОтправитьИЗакрыть(Команда)\n\tЕсли Не ОтправитьПисьмоКлиент() Тогда\n\t\tВозврат;\n\tКонецЕсли;\n\tЗакрыть();\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура ВставитьСтрокуВТекущуюПозицию(Поле, Документ, Строка)\n\tПерем Начало, Конец;\n\tПоле.ПолучитьГраницыВыделения(Начало, Конец);\n\tПозиция = Документ.ПолучитьПозициюПоЗакладке(Начало);\n\tДокумент.Удалить(Начало, Конец);\n\tНачало = Документ.ПолучитьЗакладкуПоПозиции(Позиция);\n\tДокумент.Вставить(Начало, Строка);\n\tПозиция = Позиция + СтрДлина(Строка);\n\tЗакладка = Документ.ПолучитьЗакладкуПоПозиции(Позиция);\n\tПоле.УстановитьГраницыВыделения(Закладка, Закладка);\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура ВставитьКонтактноеЛицо(Команда)\n\tЕсли Объект.Контрагент.Пустая() Тогда\n\t\tСообщить(\"Выберите контрагента\");\n\tИначе\n\t\tКонтактноеЛицо = ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент);\n\t\tВставитьСтрокуВТекущуюПозицию(Элементы.Содержимое, Содержимое, КонтактноеЛицо + \" \");\n\tКонецЕсли;\t\nКонецПроцедуры\n\n&НаСервере\nПроцедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)\n\tЗаголовок = ТекущийОбъект.Наименование + \" (Исходящее письмо)\";\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура КонтрагентПриИзменении(Элемент)\n\tДобавитьПолучателей(Объект.Получатель, Объект.Контрагент);\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура ВыделитьВажное(Команда)\n\tПерем Начало, Конец;\n    ВсеВажное = Истина;\n    Элементы.Содержимое.ПолучитьГраницыВыделения(Начало, Конец);\n    Если Начало = Конец Тогда\n        Возврат;\n    КонецЕсли;\n    \n    НаборТекстовыхЭлементов = Новый Массив();\n    Для Каждого ТекстовыйЭлемент Из Содержимое.СформироватьЭлементы(Начало, Конец) Цикл\n        Если Тип(ТекстовыйЭлемент) = Тип(\"ТекстФорматированногоДокумента\") Тогда\n            НаборТекстовыхЭлементов.Добавить(ТекстовыйЭлемент);    \n        КонецЕсли;    \n    КонецЦикла;\n    \n    Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл\n        Если ТекстовыйЭлемент.Шрифт.Жирный <> Истина И\n            ТекстовыйЭлемент.ЦветТекста <> Новый Цвет(255, 0, 0) Тогда\n            ВсеВажное = Ложь;\n            Прервать;\n        КонецЕсли;\n    КонецЦикла;\n    \n    Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл\n        ТекстовыйЭлемент.Шрифт = Новый Шрифт(ТекстовыйЭлемент.Шрифт, , , Не ВсеВажное);\n        ТекстовыйЭлемент.ЦветТекста = Новый Цвет(?(ВсеВажное, 0, 255), 0, 0);\n    КонецЦикла;\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура ЗаполнитьПоШаблону(Команда)\n\tЕсли Объект.Контрагент.Пустая() Тогда\n\t\tСообщить(\"Выберите контрагента\");\n\tИначе\n\t\tНайтиИЗаменить(\"[Контрагент]\", Объект.Контрагент);\n\t\tНайтиИЗаменить(\"[КонтактноеЛицо]\", ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент));\n\tКонецЕсли;\n\tНайтиИЗаменить(\"[ДатаПисьма]\", Объект.Дата);\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура НайтиИЗаменить(СтрокаДляПоиска, СтрокаДляЗамены)\n\tПерем ВставленныйТекст, ШрифтОформления, ЦветТекстаОформления, ЦветФонаОформления, НавигационнаяСсылкаОформления;\n\tРезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска);\n\tПока ((РезультатПоиска <> Неопределено) И (РезультатПоиска.ЗакладкаНачала <> Неопределено) И (РезультатПоиска.ЗакладкаКонца <> Неопределено)) Цикл\n\t\tПозицияНачалаСледующегоЦиклаПоиска = Содержимое.ПолучитьПозициюПоЗакладке(РезультатПоиска.ЗакладкаНачала) + СтрДлина(СтрокаДляЗамены);\n\t\tМассивЭлементовДляОформления = Содержимое.ПолучитьЭлементы(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца);\n\t\tДля Каждого ЭлементДляОформления Из МассивЭлементовДляОформления Цикл\n\t\t\tЕсли Тип(ЭлементДляОформления) = Тип(\"ТекстФорматированногоДокумента\") Тогда\n\t\t\t\tШрифтОформления = ЭлементДляОформления.Шрифт;\n\t\t\t\tЦветТекстаОформления = ЭлементДляОформления.ЦветТекста;\n\t\t\t\tЦветФонаОформления = ЭлементДляОформления.ЦветФона;\n\t\t\t\tНавигационнаяСсылкаОформления = ЭлементДляОформления.НавигационнаяССылка;\n\t\t\t\tПрервать;\n\t\t\tКонецЕсли;\n\t\tКонецЦикла;\t\n\t\tСодержимое.Удалить(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца);\n\t\tВставленныйТекст = Содержимое.Вставить(РезультатПоиска.ЗакладкаНачала, СтрокаДляЗамены);\n\t\tЕсли ВставленныйТекст <> Неопределено И ШрифтОформления <> Неопределено Тогда\n\t\t\tВставленныйТекст.Шрифт = ШрифтОформления;\n\t\tКонецЕсли;\n\t\tЕсли ВставленныйТекст <> Неопределено И ЦветТекстаОформления <> Неопределено Тогда\n\t\t\tВставленныйТекст.ЦветТекста = ЦветТекстаОформления;\n\t\tКонецЕсли;\n\t\tЕсли ВставленныйТекст <> Неопределено И ЦветФонаОформления <> Неопределено Тогда\n\t\t\tВставленныйТекст.ЦветФона = ЦветФонаОформления;\n\t\tКонецЕсли;\n\t\tЕсли ВставленныйТекст <> Неопределено И НавигационнаяСсылкаОформления <> Неопределено Тогда\n\t\t\tВставленныйТекст.НавигационнаяССылка = НавигационнаяСсылкаОформления;\n\t\tКонецЕсли;\n\t\t\n\t\tРезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска, Содержимое.ПолучитьЗакладкуПоПозиции(ПозицияНачалаСледующегоЦиклаПоиска));\n\tКонецЦикла;\nКонецПроцедуры\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/1C Enterprise/Catalog.Товары.Command.ПечатьПрайсЛиста.CommandModule.bsl",
    "content": "&НаСервере\nФункция ПечатнаяФорма(ПараметрКоманды)\n\tТабличныйДокумент = Новый ТабличныйДокумент;\n\tТабличныйДокумент.ОтображатьСетку = Истина;\n\tТабличныйДокумент.ОтображатьЗаголовки = Истина;\n\t\n\tСформирован = Ложь;\n\tТабМакет = Справочники.Товары.ПолучитьМакет(\"МакетПрайсЛиста\"); \n\n\tШапка = ТабМакет.ПолучитьОбласть(\"Шапка\");\n\tТабличныйДокумент.Вывести(Шапка);\n\n\tОбластьНоменклатура = ТабМакет.ПолучитьОбласть(\"ОбластьНоменклатура\");\n\t\n\tЗапрос = Новый Запрос;\n    Запрос.Текст =  \"ВЫБРАТЬ\n                    |    Товары.Код КАК Код,\n                    |    Товары.Наименование КАК Наименование,\n                    |    Товары.Артикул КАК Артикул,\n                    |    Товары.ФайлКартинки КАК Картинка,\n                    |    Товары.Описание КАК Описание,\n                    |    Товары.Вид КАК Вид,\n                    |    ЦеныТоваров.Цена КАК Цена\n                    |ИЗ\n                    |    РегистрСведений.ЦеныТоваров КАК ЦеныТоваров\n                    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары\n                    |        ПО ЦеныТоваров.Товар = Товары.Ссылка\n                    |ГДЕ\n                    |    Товары.ЭтоГруппа = ЛОЖЬ\n                    |    И ЦеныТоваров.ВидЦен = &ВидЦен\n                    |\n                    |УПОРЯДОЧИТЬ ПО\n                    |    Вид,\n                    |    Товары.Родитель.Код,\n                    |    Код\";\n\n    Запрос.УстановитьПараметр(\"ВидЦен\", Справочники.ВидыЦен.НайтиПоНаименованию(\"Розничная\"));\n\t\t\t\t\t\t\n\tВыборка = Запрос.Выполнить().Выбрать();\n\tПока Выборка.Следующий() Цикл\n\t\tОбластьНоменклатура.Параметры.Заполнить(Выборка);\n\t\t\n\t\tОписание = \"\";\n\t\t\n\t\tЧтение = Новый ЧтениеHTML();\n\t\tЧтение.УстановитьСтроку(Выборка.Описание);\n\t\t\n\t\tДокDOM = Новый ПостроительDOM();\n\t\tHTML = ДокDOM.Прочитать(Чтение);\n\t\t\n\t\tЕсли Не HTML.ЭлементДокумента = Неопределено Тогда\n\t\t\tДля Каждого Узел из HTML.ЭлементДокумента.ДочерниеУзлы Цикл \n\t\t\t\tЕсли Узел.ИмяУзла = \"body\" Тогда\n\t\t\t\t\tДля Каждого ЭлементОписания из Узел.ДочерниеУзлы Цикл \n\t\t\t\t\t\tОписание = Описание + ЭлементОписания.ТекстовоеСодержимое;\n\t\t\t\t\tКонецЦикла;\n\t\t\t\tКонецЕсли;\n\t\t\tКонецЦикла;\n\t\tКонецЕсли;\n\t\tОбластьНоменклатура.Параметры.Описание = Описание;\n\t\t\n\t\tЕсли (Выборка.Картинка <> Null) Тогда \n\t\t\tОбластьНоменклатура.Параметры.ПараметрКартинки = Новый Картинка(Выборка.Картинка.ДанныеФайла.Получить());\n\t\tКонецЕсли;\n\t\t\n\t\tТабличныйДокумент.Вывести(ОбластьНоменклатура, Выборка.Уровень());\n\t\tСформирован = Истина;\n\tКонецЦикла;\n\t\n\tЕсли Сформирован Тогда\n\t\tВозврат ТабличныйДокумент;\n\tИначе \t\n\t\tВозврат Неопределено;\n\tКонецЕсли;\t\nКонецФункции\n\n&НаКлиенте\nПроцедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)\n\tТабличныйДокумент = ПечатнаяФорма(ПараметрКоманды);\n\t\n\tЕсли ТабличныйДокумент <> Неопределено Тогда\n\t\tТабличныйДокумент.Показать();\n\tКонецЕсли;\t\n\t\nКонецПроцедуры\n"
  },
  {
    "path": "src/test/resources/samples/langs/1C Enterprise/CommonModule.ОбменМобильныеОбщее.Module.bsl",
    "content": "// Процедура на основании анализа типа данных заменяет их на данные, удаляющие\n// информацию из узла в котором их не должно быть\n//\n// Параметры:\n//  Данные\t– Объект, набор записей,... который нужно преобразовать\n//\nПроцедура УдалениеДанных(Данные) \n\t\n\t// Получаем объект описания метаданного, соответствующий данным\n\tОбъектМетаданных = ?(ТипЗнч(Данные) = Тип(\"УдалениеОбъекта\"), Данные.Ссылка.Метаданные(), Данные.Метаданные());\n    // Проверяем тип, интересуют только те типы, которые реализованы на мобильной платформе\n\tЕсли Метаданные.Справочники.Содержит(ОбъектМетаданных)\n\t \tИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда\n\t\t\n\t\t// Перенос удаления объекта для объектных\n\t\tДанные = Новый УдалениеОбъекта(Данные.Ссылка);\n\t\t\n\tИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных)\n\t\tИЛИ Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных)\n\t\tИЛИ Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда\n\t\t\n\t\t// Очищаем данные\n\t\tДанные.Очистить();\n\t\t\n\tКонецЕсли;\t\n\t\nКонецПроцедуры\n\n// Функция формирует пакет обмена, который будет отправлен узлу \"УзелОбмена\" \n//\n// Параметры:\n//  УзелОбмена\t– узел плана обмена \"мобильные\", с которым осуществляется обмен\n//\n// Возвращаемое значение:\n//  сформированный пакет, помещенный в хранилище значения\nФункция СформироватьПакетОбмена(УзелОбмена) Экспорт\n    \n\tЗаписьXML = Новый ЗаписьXML;\n\t\n\tЗаписьXML.УстановитьСтроку(\"UTF-8\");\n\tЗаписьXML.ЗаписатьОбъявлениеXML();\n    \n\tЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();\n    ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);\t\t\t\t\t\n    \n\tЗаписьXML.ЗаписатьСоответствиеПространстваИмен(\"xsi\", \"http://www.w3.org/2001/XMLSchema-instance\");\n\tЗаписьXML.ЗаписатьСоответствиеПространстваИмен(\"v8\",  \"http://v8.1c.ru/data\");\n    \n\tТипДанныхУдаления = Тип(\"УдалениеОбъекта\");\n    \n\tВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, ЗаписьСообщения.НомерСообщения);\n\tПока ВыборкаИзменений.Следующий() Цикл\n\t\t\n\t\tДанные = ВыборкаИзменений.Получить();\n        \n\t\t// Если перенос данных не нужен, то, возможно, необходимо записать удаление данных\n\t\tЕсли Не ОбменМобильныеПереопределяемый.НуженПереносДанных(Данные, УзелОбмена) Тогда\n\t\t\t\n\t\t\t// Получаем значение с возможным удалением данных\n\t\t\tУдалениеДанных(Данные); \n            \n\t\tКонецЕсли;\t\n\t\t\n\t\t// Записываем данные в сообщение\n\t\tОбменМобильныеПереопределяемый.ЗаписатьДанные(ЗаписьXML, Данные);\n        \n    КонецЦикла;\n    \n\tЗаписьСообщения.ЗакончитьЗапись();\n    \n\tВозврат Новый ХранилищеЗначения(ЗаписьXML.Закрыть(), Новый СжатиеДанных(9));\n    \nКонецФункции\n\n// Процедура вносит в информационную базу данные, которые присланы из узла \"УзелОбмена\" \n//\n// Параметры:\n//  УзелОбмена\t– узел плана обмена \"мобильные\", с которым осуществляется обмен\n//  ДанныеОбмена - пакет обмена полученный из узла УзелОбмена, помещен в ХранилищеЗначения\n//\nПроцедура ПринятьПакетОбмена(УзелОбмена, ДанныеОбмена) Экспорт\n    \n\tЧтениеXML = Новый ЧтениеXML;\n\tЧтениеXML.УстановитьСтроку(ДанныеОбмена.Получить());\n    ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();\n\tЧтениеСообщения.НачатьЧтение(ЧтениеXML);\n    ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);\n\n    НачатьТранзакцию();\n    Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл\n        \n\t\tДанные = ОбменМобильныеПереопределяемый.ПрочитатьДанные(ЧтениеXML);\n        \n\t\tЕсли Не Данные = Неопределено Тогда\n\t\t\t\n            Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;\n            Данные.ОбменДанными.Загрузка = Истина;\n            \n            Данные.Записать();\n        \n        КонецЕсли;\n        \n    КонецЦикла;\n    ЗафиксироватьТранзакцию();\n    \n    ЧтениеСообщения.ЗакончитьЧтение();\n    ЧтениеXML.Закрыть();\n    \nКонецПроцедуры\n"
  },
  {
    "path": "src/test/resources/samples/langs/1C Enterprise/Document.РасходТовара.ObjectModule.bsl",
    "content": "//////////////////////////////////////////////////////////////////////////////// \r\r\n// ПРОЦЕДУРЫ И ФУНКЦИИ\r\r\n//\r\r\n\r\r\n// Формирование печатной формы документа\r\r\n// \r\r\n// Параметры: \r\r\n//  Нет. \r\r\n// \r\r\n// Возвращаемое значение: \r\r\n//  ТабличныйДокумент - Сформированный табличный документ.\r\r\nПроцедура ПечатнаяФорма(ТабличныйДокумент) Экспорт\r\n\r\r\n\tМакет = Документы.РасходТовара.ПолучитьМакет(\"МакетПечати\");\r\n\r\r\n\t// Заголовок\r\r\n\tОбласть = Макет.ПолучитьОбласть(\"Заголовок\");\r\r\n\tТабличныйДокумент.Вывести(Область);\r\n\r\r\n\t// Шапка\r\r\n\tШапка = Макет.ПолучитьОбласть(\"Шапка\");\r\r\n\tШапка.Параметры.Заполнить(ЭтотОбъект);\r\r\n\tТабличныйДокумент.Вывести(Шапка);\r\n\r\r\n\t// Товары\r\r\n\tОбласть = Макет.ПолучитьОбласть(\"ТоварыШапка\");\r\r\n\tТабличныйДокумент.Вывести(Область);\r\r\n\tОбластьТовары = Макет.ПолучитьОбласть(\"Товары\");\r\n\r\r\n\tДля каждого ТекСтрокаТовары Из Товары Цикл\r\n\r\r\n\t\tОбластьТовары.Параметры.Заполнить(ТекСтрокаТовары);\r\r\n\t\tТабличныйДокумент.Вывести(ОбластьТовары);\r\n\r\r\n\tКонецЦикла;\r\r\n\r\nКонецПроцедуры\r\r\n\r\n// Формирование печатной формы документа\r\n// \r\n// Параметры: \r\n//  Нет. \r\n// \r\n// Возвращаемое значение: \r\n//  ТабличныйДокумент - Сформированный табличный документ.\r\nПроцедура Пересчитать() Экспорт\r\n\r\n\tДля каждого ТекСтрокаТовары Из Товары Цикл\r\n\r\n\t\tТекСтрокаТовары.Сумма = ТекСтрокаТовары.Количество * ТекСтрокаТовары.Цена;\r\n\r\n\tКонецЦикла;\r\n\r\nКонецПроцедуры\r\n\r\n////////////////////////////////////////////////////////////////////////////////\r\r\n// ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА\r\r\n\r\nПроцедура ОбработкаПроведения(Отказ, Режим)\r\n\r\n\t// Формирование движений регистров накопления ТоварныеЗапасы и Продажи.\r\n\tДвижения.ТоварныеЗапасы.Записывать = Истина;\r\n\tДвижения.Продажи.Записывать = Истина;\r\n\tЕсли Режим = РежимПроведенияДокумента.Оперативный Тогда\r\n\t\tДвижения.ТоварныеЗапасы.БлокироватьДляИзменения = Истина;\r\n\tКонецЕсли;\t\r\n\r\n\t// Создадим запрос, чтобы получать информацию об услугах\r\n\tЗапрос = Новый Запрос(\"ВЫБРАТЬ\r\n\t\t\t\t\t\t  |    ТоварыВДокументе.НомерСтроки КАК НомерСтроки\r\n\t\t\t\t\t\t  |ИЗ\r\n\t\t\t\t\t\t  |    Документ.РасходТовара.Товары КАК ТоварыВДокументе\r\n\t\t\t\t\t\t  |ГДЕ\r\n\t\t\t\t\t\t  |    ТоварыВДокументе.Ссылка = &Ссылка\r\n\t\t\t\t\t\t  |    И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)\");\r\n\r\n\tЗапрос.УстановитьПараметр(\"Ссылка\", Ссылка);\r\n\tРезультатУслуги = Запрос.Выполнить().Выгрузить();\r\n\tРезультатУслуги.Индексы.Добавить(\"НомерСтроки\");\r\n\r\n\tДля каждого ТекСтрокаТовары Из Товары Цикл\r\n\r\n\t\tСтрока = РезультатУслуги.Найти(ТекСтрокаТовары.НомерСтроки, \"НомерСтроки\");\r\n\t\tЕсли Строка = Неопределено Тогда\r\n\t\t\t\r\n\t\t\t// Не услуга\r\n\t\t\tДвижение = Движения.ТоварныеЗапасы.Добавить();\r\n\t\t\tДвижение.ВидДвижения = ВидДвиженияНакопления.Расход;\r\n\t\t\tДвижение.Период = Дата;\r\n\t\t\tДвижение.Товар = ТекСтрокаТовары.Товар;\r\n\t\t\tДвижение.Склад = Склад;\r\n\t\t\tДвижение.Количество = ТекСтрокаТовары.Количество;\r\n\r\n\t\tКонецЕсли;\r\n\r\n\t\tДвижение = Движения.Продажи.Добавить();\r\n\t\tДвижение.Период = Дата;\r\n\t\tДвижение.Товар = ТекСтрокаТовары.Товар;\r\n\t\tДвижение.Покупатель = Покупатель;\r\n\t\tДвижение.Количество = ТекСтрокаТовары.Количество;\r\n\t\tДвижение.Сумма = ТекСтрокаТовары.Сумма;\r\n\r\n\tКонецЦикла;\r\n\r\n\t// Формирование движения регистра накопления Взаиморасчеты.\r\n\tДвижения.Взаиморасчеты.Записывать = Истина;\r\n\tДвижение = Движения.Взаиморасчеты.Добавить();\r\n\tДвижение.ВидДвижения = ВидДвиженияНакопления.Расход;\r\n\tДвижение.Период = Дата;\r\n\tДвижение.Контрагент = Покупатель;\r\n\tДвижение.Валюта = Валюта;\r\n\r\n\tЕсли Валюта.Пустая() Тогда\r\n\t\tДвижение.Сумма = Товары.Итог(\"Сумма\");\r\n\tИначе\r\n\r\n\t\tКурс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура(\"Валюта\", Валюта)).Курс;\r\n\r\n\t\tЕсли Курс = 0 Тогда\r\n\t\t\tДвижение.Сумма = Товары.Итог(\"Сумма\");\r\n\t\tИначе\r\n\t\t\tДвижение.Сумма = Товары.Итог(\"Сумма\") / Курс;\r\n\t\tКонецЕсли;\r\n\r\n\tКонецЕсли;\r\n\r\n\t//Запишем движения\r\n\tДвижения.Записать();\r\n\t\r\n\t//Контроль остатков при оперативном проведении\r\n\tЕсли Режим = РежимПроведенияДокумента.Оперативный Тогда\r\n\t\t// Создадим запрос, чтобы контролировать остатки по товарам\r\n\t\tЗапрос = Новый Запрос(\"ВЫБРАТЬ\r\n\t\t\t\t\t\t\t  |    ТоварыВДокументе.Товар КАК Товар,\r\n\t\t\t\t\t\t\t  |    СУММА(ТоварыВДокументе.Количество) КАК Количество,\r\n\t\t\t\t\t\t\t  |    МАКСИМУМ(ТоварыВДокументе.НомерСтроки) КАК НомерСтроки\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ПОМЕСТИТЬ ТребуетсяТовара\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ИЗ\r\n\t\t\t\t\t\t\t  |    Документ.РасходТовара.Товары КАК ТоварыВДокументе\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ГДЕ\r\n\t\t\t\t\t\t\t  |    ТоварыВДокументе.Ссылка = &Ссылка\r\n\t\t\t\t\t\t\t  |    И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |СГРУППИРОВАТЬ ПО\r\n\t\t\t\t\t\t\t  |    ТоварыВДокументе.Товар\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ИНДЕКСИРОВАТЬ ПО\r\n\t\t\t\t\t\t\t  |    Товар\r\n\t\t\t\t\t\t\t  |;\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |////////////////////////////////////////////////////////////////////////////////\r\n\t\t\t\t\t\t\t  |ВЫБРАТЬ\r\n\t\t\t\t\t\t\t  |    ПРЕДСТАВЛЕНИЕ(ТребуетсяТовара.Товар) КАК ТоварПредставление,\r\n\t\t\t\t\t\t\t  |    ВЫБОР\r\n\t\t\t\t\t\t\t  |        КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество\r\n\t\t\t\t\t\t\t  |            ТОГДА ТоварыВДокументе.Количество\r\n\t\t\t\t\t\t\t  |        ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)\r\n\t\t\t\t\t\t\t  |    КОНЕЦ КАК Нехватка,\r\n\t\t\t\t\t\t\t  |    ТоварыВДокументе.Количество - ВЫБОР\r\n\t\t\t\t\t\t\t  |        КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество\r\n\t\t\t\t\t\t\t  |            ТОГДА ТоварыВДокументе.Количество\r\n\t\t\t\t\t\t\t  |        ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)\r\n\t\t\t\t\t\t\t  |    КОНЕЦ КАК МаксимальноеКоличество,\r\n\t\t\t\t\t\t\t  |    ТребуетсяТовара.НомерСтроки КАК НомерСтроки\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ИЗ\r\n\t\t\t\t\t\t\t  |    ТребуетсяТовара КАК ТребуетсяТовара\r\n\t\t\t\t\t\t\t  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварныеЗапасы.Остатки(\r\n\t\t\t\t\t\t\t  |                ,\r\n\t\t\t\t\t\t\t  |                Товар В\r\n\t\t\t\t\t\t\t  |                        (ВЫБРАТЬ\r\n\t\t\t\t\t\t\t  |                            ТребуетсяТовара.Товар\r\n\t\t\t\t\t\t\t  |                        ИЗ\r\n\t\t\t\t\t\t\t  |                            ТребуетсяТовара)\r\n\t\t\t\t\t\t\t  |                    И Склад = &Склад) КАК ТоварныеЗапасыОстатки\r\n\t\t\t\t\t\t\t  |        ПО ТребуетсяТовара.Товар = ТоварныеЗапасыОстатки.Товар\r\n\t\t\t\t\t\t\t  |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходТовара.Товары КАК ТоварыВДокументе\r\n\t\t\t\t\t\t\t  |        ПО ТребуетсяТовара.Товар = ТоварыВДокументе.Товар\r\n\t\t\t\t\t\t\t  |            И ТребуетсяТовара.НомерСтроки = ТоварыВДокументе.НомерСтроки\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ГДЕ\r\n\t\t\t\t\t\t\t  |    ТоварыВДокументе.Ссылка = &Ссылка И\r\n\t\t\t\t\t\t\t  |    0 > ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |УПОРЯДОЧИТЬ ПО\r\n\t\t\t\t\t\t\t  |    НомерСтроки\");\r\n\r\n\t\tЗапрос.УстановитьПараметр(\"Склад\", Склад);\r\n\t\tЗапрос.УстановитьПараметр(\"Ссылка\", Ссылка);\r\n\t\tРезультатСНехваткой = Запрос.Выполнить();\r\n\r\n\t\tВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать();\r\n\r\n\t\t// Выдадим ошибки для строк, в которых не хватает остатка\r\n\t\tПока ВыборкаРезультатаСНехваткой.Следующий() Цикл\r\n\r\n\t\t\tСообщение = Новый СообщениеПользователю();\r\n\t\t\tСообщение.Текст = НСтр(\"ru = 'Не хватает '\", \"ru\") \r\n\t\t\t\t+ ВыборкаРезультатаСНехваткой.Нехватка \r\n\t\t\t\t+ НСтр(\"ru = ' единиц товара'\", \"ru\") + \"\"\"\" \r\n\t\t\t\t+ ВыборкаРезультатаСНехваткой.ТоварПредставление \r\n\t\t\t\t+ \"\"\"\" \r\n\t\t\t\t+ НСтр(\"ru = ' на складе'\", \"ru\") \r\n\t\t\t\t+ \"\"\"\" \r\n\t\t\t\t+ Склад \r\n\t\t\t\t+ \"\"\".\" \r\n\t\t\t\t+ НСтр(\"ru = 'Максимальное количество: '\", \"ru\") \r\n\t\t\t\t+ ВыборкаРезультатаСНехваткой.МаксимальноеКоличество \r\n\t\t\t\t+ \".\";\r\n\t\t\tСообщение.Поле = НСтр(\"ru = 'Товары'\", \"ru\") \r\n\t\t\t\t+ \"[\" \r\n\t\t\t\t+ (ВыборкаРезультатаСНехваткой.НомерСтроки - 1) \r\n\t\t\t\t+ \"].\" \r\n\t\t\t\t+ НСтр(\"ru = 'Количество'\", \"ru\");\r\n\t\t\tСообщение.УстановитьДанные(ЭтотОбъект);\r\n\t\t\tСообщение.Сообщить();\r\n\t\t\tОтказ = Истина;\r\n\r\n\t\tКонецЦикла;\r\n\r\n\tКонецЕсли;\r\n\t\r\nКонецПроцедуры\r\n\r\nПроцедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)\t\t\r\n\t// Проверим заполненность поля \"Покупатель\"\r\r\n\tЕсли Покупатель.Пустая() Тогда\r\n\r\r\n\t\t// Если поле Покупатель не заполнено, сообщим об этом пользователю\r\r\n\t\tСообщение = Новый СообщениеПользователю();\r\r\n\t\tСообщение.Текст = НСтр(\"ru = 'Не указан Покупатель, для которого выписывается накладная!'\", \"ru\");\r\r\n\t\tСообщение.Поле = НСтр(\"ru = 'Покупатель'\", \"ru\");\r\n\t\tСообщение.УстановитьДанные(ЭтотОбъект);\r\n\r\r\n\t\tСообщение.Сообщить();\r\r\n\r\r\n\t\t// Сообщим платформе, что мы сами обработали проверку заполнения поля \"Покупатель\"\r\r\n\t\tПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(\"Покупатель\"));\r\r\n\t\t// Так как информация в документе не консистентна, то продолжать работу дальше смысла нет\r\r\n\t\tОтказ = Истина;\r\n\r\r\n\tКонецЕсли;\r\r\n\r\n\t//Если склад не заполнен, то проверим есть ли в документе что-то кроме услуг\r\n\tЕсли Склад.Пустая() И Товары.Количество() > 0 Тогда\r\n\r\n\t\t// Создадим запрос, чтобы получать информацию об товарах\r\n\t\tЗапрос = Новый Запрос(\"ВЫБРАТЬ\r\n\t\t\t\t\t\t\t  |    Количество(*) КАК Количество\r\n\t\t\t\t\t\t\t  |ИЗ\r\n\t\t\t\t\t\t\t  |    Справочник.Товары КАК Товары\r\n\t\t\t\t\t\t\t  |ГДЕ\r\n\t\t\t\t\t\t\t  |    Товары.Ссылка В (&ТоварыВДокументе)\r\n\t\t\t\t\t\t\t  |    И Товары.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)\");\r\n\r\n\t\tЗапрос.УстановитьПараметр(\"ТоварыВДокументе\", Товары.ВыгрузитьКолонку(\"Товар\"));\r\n\t\tВыборка = Запрос.Выполнить().Выбрать();\r\n\t\tВыборка.Следующий();\r\n\t\tЕсли Выборка.Количество = 0 Тогда\r\n\t\t\t// Сообщим платформе, что мы сами обработали проверку заполнения поля \"Склад\"\r\n\t\t\tПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(\"Склад\"));\r\n\t\tКонецЕсли;\r\n\r\n\tКонецЕсли;\r\n\r\r\nКонецПроцедуры\r\n\r\nПроцедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)\r\n\r\n\tЕсли ТипЗнч(ДанныеЗаполнения) = Тип(\"СправочникСсылка.Контрагенты\") Тогда\r\n\r\n\t\tЗапросПоКонтрагенту = Новый Запрос(\"ВЫБРАТЬ\r\n\t\t                                   |\tКонтрагенты.ЭтоГруппа,\r\n\t\t                                   |\tКонтрагенты.ВидЦен\r\n\t\t                                   |ИЗ\r\n\t\t                                   |\tСправочник.Контрагенты КАК Контрагенты\r\n\t\t                                   |ГДЕ\r\n\t\t                                   |\tКонтрагенты.Ссылка = &КонтрагентСсылка\");\r\n\t\tЗапросПоКонтрагенту.УстановитьПараметр(\"КонтрагентСсылка\", ДанныеЗаполнения);\r\n\t\tВыборка = ЗапросПоКонтрагенту.Выполнить().Выбрать();\r\n\t\tЕсли Выборка.Следующий() И Выборка.ЭтоГруппа Тогда\r\n\t\t\tВозврат;\r\n\t\tКонецЕсли;\r\n\t\t\r\n\t\tВидЦен     = Выборка.ВидЦен;\r\n\t\tПокупатель = ДанныеЗаполнения.Ссылка;\r\n\r\n\tИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип(\"Структура\") Тогда\r\n\r\n\t\tЗначение = Неопределено;\r\n\r\n\t\tЕсли ДанныеЗаполнения.Свойство(\"Покупатель\", Значение) Тогда\r\n\t\t\tВидЦен = Значение.ВидЦен;\r\n\t\tКонецЕсли;\r\n\r\n\tКонецЕсли;\r\n\r\nКонецПроцедуры\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/1C Enterprise/ci_before_script.os",
    "content": "﻿Каталог = ОбъединитьПути(ТекущийКаталог(), \"libs\\oscript-library\\src\");\nЗагрузчик_Оригинал_ИмяФайла = ОбъединитьПути(Каталог, \"package-loader.os\");\n\nФайлы = НайтиФайлы(Каталог, , Ложь);\nДля Каждого ВыбФайл Из Файлы Цикл\n\n    Если ВыбФайл.ЭтоФайл() Тогда\n        Продолжить;\n    КонецЕсли;\n\n    Загрузчик_ИмяФайла = ОбъединитьПути(ВыбФайл.ПолноеИмя, \"package-loader.os\");\n    Загрузчик_Файл = Новый Файл(Загрузчик_ИмяФайла);\n\n    Если Загрузчик_Файл.Существует() Тогда\n        Продолжить;\n    КонецЕсли;\n\n    КопироватьФайл(Загрузчик_Оригинал_ИмяФайла, Загрузчик_ИмяФайла);\n\nКонецЦикла;"
  },
  {
    "path": "src/test/resources/samples/langs/1C Enterprise/test_canCompile.os",
    "content": "﻿#Использовать \"../libs/oscript-library/src/v8runner\"\n#Использовать \"../libs/oscript-library/src/tempfiles\"\n\nПерем Лог;\nПерем КодВозврата;\n\nПроцедура Инициализация()\n\n\tЛог = Логирование.ПолучитьЛог(\"oscript.app.gitlab-test_CanCompile\");\n\tКодВозврата = 0;\n\nКонецПроцедуры\n\nПроцедура ВыполнитьТест()\n\n\tКонфигуратор = Новый УправлениеКонфигуратором();\n\n\tПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска();\n\tКомандаЗапуска = \"/LoadConfigFromFiles \"\"%1\"\"\";\n\tКомандаЗапуска = СтрШаблон(КомандаЗапуска, ТекущийКаталог() + \"\\source\\cf\");\n\n\tЛог.Информация(\"Команда обновления конфигурации: \" + КомандаЗапуска);\n\n\tПараметрыЗапуска.Добавить(КомандаЗапуска);\n\n\tПопытка\n\t    Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска);\n\tИсключение\n\n\t    Лог.Ошибка(Конфигуратор.ВыводКоманды());\n\t    КодВозврата = 1;\n\n\tКонецПопытки;\n\n\tУдалитьФайлы(Конфигуратор.ПутьКВременнойБазе());\n\nКонецПроцедуры\n\nИнициализация();\nВыполнитьТест();\n\nЗавершитьРаботу(КодВозврата);"
  },
  {
    "path": "src/test/resources/samples/langs/ABAP/cl_csv_parser.abap",
    "content": "*/**\n* The MIT License (MIT)\n* Copyright (c) 2012 René van Mil\n* \n* Permission is hereby granted, free of charge, to any person obtaining\n* a copy of this software and associated documentation files (the\n* \"Software\"), to deal in the Software without restriction, including\n* without limitation the rights to use, copy, modify, merge, publish,\n* distribute, sublicense, and/or sell copies of the Software, and to\n* permit persons to whom the Software is furnished to do so, subject to\n* the following conditions:\n* \n* The above copyright notice and this permission notice shall be\n* included in all copies or substantial portions of the Software.\n* \n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n*----------------------------------------------------------------------*\n*       CLASS CL_CSV_PARSER DEFINITION\n*----------------------------------------------------------------------*\n*\n*----------------------------------------------------------------------*\nclass cl_csv_parser definition\n  public\n  inheriting from cl_object\n  final\n  create public .\n\n  public section.\n*\"* public components of class CL_CSV_PARSER\n*\"* do not include other source files here!!!\n\n    type-pools abap .\n    methods constructor\n      importing\n        !delegate type ref to if_csv_parser_delegate\n        !csvstring type string\n        !separator type c\n        !skip_first_line type abap_bool .\n    methods parse\n      raising\n        cx_csv_parse_error .\n  protected section.\n*\"* protected components of class CL_CSV_PARSER\n*\"* do not include other source files here!!!\n  private section.\n*\"* private components of class CL_CSV_PARSER\n*\"* do not include other source files here!!!\n\n    constants _textindicator type c value '\"'.              \"#EC NOTEXT\n    data _delegate type ref to if_csv_parser_delegate .\n    data _csvstring type string .\n    data _separator type c .\n    type-pools abap .\n    data _skip_first_line type abap_bool .\n\n    methods _lines\n      returning\n        value(returning) type stringtab .\n    methods _parse_line\n      importing\n        !line type string\n      returning\n        value(returning) type stringtab\n      raising\n        cx_csv_parse_error .\nendclass.                    \"CL_CSV_PARSER DEFINITION\n\n\n\n*----------------------------------------------------------------------*\n*       CLASS CL_CSV_PARSER IMPLEMENTATION\n*----------------------------------------------------------------------*\n*\n*----------------------------------------------------------------------*\nclass cl_csv_parser implementation.\n\n\n* <SIGNATURE>---------------------------------------------------------------------------------------+\n* | Instance Public Method CL_CSV_PARSER->CONSTRUCTOR\n* +-------------------------------------------------------------------------------------------------+\n* | [--->] DELEGATE                       TYPE REF TO IF_CSV_PARSER_DELEGATE\n* | [--->] CSVSTRING                      TYPE        STRING\n* | [--->] SEPARATOR                      TYPE        C\n* | [--->] SKIP_FIRST_LINE                TYPE        ABAP_BOOL\n* +--------------------------------------------------------------------------------------</SIGNATURE>\n  method constructor.\n    super->constructor( ).\n    _delegate = delegate.\n    _csvstring = csvstring.\n    _separator = separator.\n    _skip_first_line = skip_first_line.\n  endmethod.                    \"constructor\n\n\n* <SIGNATURE>---------------------------------------------------------------------------------------+\n* | Instance Public Method CL_CSV_PARSER->PARSE\n* +-------------------------------------------------------------------------------------------------+\n* | [!CX!] CX_CSV_PARSE_ERROR\n* +--------------------------------------------------------------------------------------</SIGNATURE>\n  method parse.\n    data msg type string.\n    if _csvstring is initial.\n      message e002(csv) into msg.\n      raise exception type cx_csv_parse_error\n        exporting\n          message = msg.\n    endif.\n\n    \" Get the lines\n    data is_first_line type abap_bool value abap_true.\n    data lines type standard table of string.\n    lines = _lines( ).\n    field-symbols <line> type string.\n    loop at lines assigning <line>.\n      \" Should we skip the first line?\n      if _skip_first_line = abap_true and is_first_line = abap_true.\n        is_first_line = abap_false.\n        continue.\n      endif.\n      \" Parse the line\n      data values type standard table of string.\n      values = _parse_line( <line> ).\n      \" Send values to delegate\n      _delegate->values_found( values ).\n    endloop.\n  endmethod.                    \"parse\n\n\n* <SIGNATURE>---------------------------------------------------------------------------------------+\n* | Instance Private Method CL_CSV_PARSER->_LINES\n* +-------------------------------------------------------------------------------------------------+\n* | [<-()] RETURNING                      TYPE        STRINGTAB\n* +--------------------------------------------------------------------------------------</SIGNATURE>\n  method _lines.\n    split _csvstring at cl_abap_char_utilities=>cr_lf into table returning.\n  endmethod.                    \"_lines\n\n\n* <SIGNATURE>---------------------------------------------------------------------------------------+\n* | Instance Private Method CL_CSV_PARSER->_PARSE_LINE\n* +-------------------------------------------------------------------------------------------------+\n* | [--->] LINE                           TYPE        STRING\n* | [<-()] RETURNING                      TYPE        STRINGTAB\n* | [!CX!] CX_CSV_PARSE_ERROR\n* +--------------------------------------------------------------------------------------</SIGNATURE>\n  method _parse_line.\n    data msg type string.\n\n    data csvvalue type string.\n    data csvvalues type standard table of string.\n\n    data char type c.\n    data pos type i value 0.\n    data len type i.\n    len = strlen( line ).\n    while pos < len.\n      char = line+pos(1).\n      if char <> _separator.\n        if char = _textindicator.\n          data text_ended type abap_bool.\n          text_ended = abap_false.\n          while text_ended = abap_false.\n            pos = pos + 1.\n            if pos < len.\n              char = line+pos(1).\n              if char = _textindicator.\n                text_ended = abap_true.\n              else.\n                if char is initial. \" Space\n                  concatenate csvvalue ` ` into csvvalue.\n                else.\n                  concatenate csvvalue char into csvvalue.\n                endif.\n              endif.\n            else.\n              \" Reached the end of the line while inside a text value\n              \" This indicates an error in the CSV formatting\n              text_ended = abap_true.\n              message e003(csv) into msg.\n              raise exception type cx_csv_parse_error\n                exporting\n                  message = msg.\n            endif.\n          endwhile.\n          \" Check if next character is a separator, otherwise the CSV formatting is incorrect\n          data nextpos type i.\n          nextpos = pos + 1.\n          if nextpos < len and line+nextpos(1) <> _separator.\n            message e003(csv) into msg.\n            raise exception type cx_csv_parse_error\n              exporting\n                message = msg.\n          endif.\n        else.\n          if char is initial. \" Space\n            concatenate csvvalue ` ` into csvvalue.\n          else.\n            concatenate csvvalue char into csvvalue.\n          endif.\n        endif.\n      else.\n        append csvvalue to csvvalues.\n        clear csvvalue.\n      endif.\n      pos = pos + 1.\n    endwhile.\n    append csvvalue to csvvalues. \" Don't forget the last value\n\n    returning = csvvalues.\n  endmethod.                    \"_parse_line\nendclass.                    \"CL_CSV_PARSER IMPLEMENTATION"
  },
  {
    "path": "src/test/resources/samples/langs/AGS Script/GlobalScript.asc",
    "content": "// main global script file\r\n\r\n// A function that initializes a bunch of stuff.\r\nfunction initialize_control_panel() { \r\n  // Centre the control panel\r\n  gPanel.Centre(); \r\n  // Centre the Restart dialog as well\r\n  gRestartYN.Centre(); \r\n  if (!IsSpeechVoxAvailable()) { \r\n    // If there is no speech-vox file, and therefore no speech,\r\n    // disable all the controls related with speech.\r\n    lblVoice.Visible = false;  \r\n    btnVoice.Visible = false;  \r\n    sldVoice.Visible = false;\r\n  }\r\n  else {\r\n    // If there *is*, then set it to voice and text. It's best to use\r\n    // both whenever possible, for the player's sake.\r\n    SetVoiceMode(eSpeechVoiceAndText); \r\n    // And reflect this in the control panel.\r\n    btnVoice.Text = \"Voice and Text\"; \r\n  }\r\n  if (!System.SupportsGammaControl) {\r\n    // If we can't change the gamma settings, disable the relevant options.\r\n    sldGamma.Visible = false; \r\n    lblGamma.Visible = false;\r\n  } \r\n  \r\n  //And now, set all the defaults\r\n  System.Volume = 100;\r\n  sldAudio.Value = System.Volume;\r\n  SetGameSpeed(40);\r\n  sldSpeed.Value = 40;\r\n  if (IsSpeechVoxAvailable()) {\r\n     SetVoiceMode(eSpeechVoiceAndText);\r\n     btnVoice.Text = \"Voice and Text\";\r\n     sldVoice.Value = 255;\r\n     SetSpeechVolume(255);\r\n  }\r\n  if (System.SupportsGammaControl) {\r\n    System.Gamma = 100;\r\n    sldGamma.Value = 100;\r\n  }\r\n}\r\n\r\n// Called when the game starts, before the first room is loaded\r\nfunction game_start() {   \r\n  // Put the code all in a function and then just call the function. \r\n  // It saves cluttering up places like game_start.\r\n  initialize_control_panel(); \r\n  // Use the KeyboardMovement module to, per default, replicate the standard\r\n  // keyboard movement of most Sierra games. See KeyboardMovement.txt for more info\r\n  KeyboardMovement.SetMode(eKeyboardMovement_Tapping); \r\n}\r\n\r\nfunction repeatedly_execute() {\r\n  \r\n  // Put here anything you want to happen every game cycle, even when\r\n  // the game is paused. This will not run when the game is blocked\r\n  // inside a command like a blocking Walk()\r\n  \r\n  if (IsGamePaused() == 1) return;\r\n\r\n  // Put here anything you want to happen every game cycle, but not\r\n  // when the game is paused.\r\n}\r\n\r\nfunction repeatedly_execute_always() {\r\n  \r\n  // Put anything you want to happen every game cycle, even\r\n  // when the game is blocked inside a command like a\r\n  // blocking Walk().\r\n  // You cannot run blocking commands from this function.\r\n  \r\n}\r\n\r\nfunction show_inventory_window () \r\n{\r\n  gInventory.Visible = true;\r\n  // switch to the Use cursor (to select items with)\r\n  mouse.Mode = eModeInteract;\r\n  // But, override the appearance to look like the arrow\r\n  mouse.UseModeGraphic(eModePointer);\r\n}\r\n\r\nfunction show_save_game_dialog()\r\n{\r\n  gSaveGame.Visible = true;\r\n  // Get the list of save games\r\n  lstSaveGamesList.FillSaveGameList();\r\n  if (lstSaveGamesList.ItemCount > 0)\r\n  {\r\n    // If there is at least one, set the default text\r\n    // to be the first game's name\r\n    txtNewSaveName.Text = lstSaveGamesList.Items[0];\r\n  }\r\n  else\r\n  {\r\n    // No save games yet, default empty text.\r\n    txtNewSaveName.Text = \"\";\r\n  }\r\n  mouse.UseModeGraphic(eModePointer);\r\n  gIconbar.Visible = false;\r\n}\r\n\r\nfunction show_restore_game_dialog()\r\n{\r\n  gRestoreGame.Visible = true;\r\n  lstRestoreGamesList.FillSaveGameList();\r\n  mouse.UseModeGraphic(eModePointer);\r\n  gIconbar.Visible = false;\r\n}\r\n\r\nfunction close_save_game_dialog()\r\n{\r\n  gSaveGame.Visible = false;\r\n  mouse.UseDefaultGraphic();\r\n  gIconbar.Visible = true;\r\n}\r\n\r\nfunction close_restore_game_dialog()\r\n{\r\n  gRestoreGame.Visible = false;\r\n  mouse.UseDefaultGraphic();\r\n  gIconbar.Visible = true;\r\n}\r\n\r\n// Called when a key is pressed. keycode holds the key's ASCII code\r\nfunction on_key_press(eKeyCode keycode) {\r\n  // The following is called before \"if game is paused keycode=0\", so\r\n  // it'll happen even when the game is paused.\r\n  \r\n  if ((keycode == eKeyEscape) && gRestartYN.Visible) {\r\n    //Use ESC to cancel restart.\r\n    gRestartYN.Visible = false; \r\n    gIconbar.Visible = true;\r\n    // If the panel's not ON, then the player must have gotten here by tapping F9,\r\n    // therefore his cursor needs restoring. If the panel IS on, then it doesn't,\r\n    // because it's already a pointer. Get used to thinking like this!!\r\n    if (!gPanel.Visible) mouse.UseDefaultGraphic(); \r\n    return;\r\n  }\r\n  if ((keycode == eKeyEscape) && gPanel.Visible) {\r\n    // Use ESC to turn the panel off.\r\n    gPanel.Visible = false; \r\n    mouse.UseDefaultGraphic();\r\n    gIconbar.Visible = true;\r\n    return;\r\n  }\r\n  if ((keycode == eKeyEscape) && (gSaveGame.Visible))\r\n  {\r\n    // Use ESC to close the save game dialog\r\n    close_save_game_dialog();\r\n    return;\r\n  }\r\n  if ((keycode == eKeyEscape) && (gRestoreGame.Visible))\r\n  {\r\n    // Use ESC to close the restore game dialog\r\n    close_restore_game_dialog();\r\n    return;\r\n  }\r\n  \r\n  if (keycode == eKeyReturn) { \r\n    // ENTER, in this case merely confirms restart\r\n    if (gRestartYN.Visible) RestartGame();\r\n  }\r\n\r\n  if (IsGamePaused() || (IsInterfaceEnabled() == 0))\r\n  {\r\n    // If the game is paused with a modal GUI on the\r\n    // screen, or the player interface is disabled in\r\n    // a cut scene, ignore any keypresses.\r\n    return;\r\n  }\r\n\r\n  // FUNCTION KEYS AND SYSTEM SHORTCUTS\r\n  if (keycode == eKeyEscape) {\r\n    // ESC\r\n    gPanel.Visible = true; \r\n    gIconbar.Visible = false;\r\n    mouse.UseModeGraphic(eModePointer);\r\n  }\r\n  if (keycode == eKeyCtrlQ)  QuitGame(1);   // Ctrl-Q\r\n  if (keycode == eKeyF5) show_save_game_dialog();   // F5\r\n  if (keycode == eKeyF7) show_restore_game_dialog();  // F7\r\n  if (keycode == eKeyF9) {\r\n    // F9, asks the player to confirm restarting (so much better to always confirm first)\r\n    gRestartYN.Visible = true;  \r\n    gIconbar.Visible = false;\r\n    mouse.UseModeGraphic(eModePointer);\r\n  }\r\n  if (keycode == eKeyF12) SaveScreenShot(\"scrnshot.bmp\");  // F12\r\n  if (keycode == eKeyTab)   show_inventory_window();  // Tab, show inventory\r\n\r\n  // GAME COMMAND SHORTCUTS\r\n  if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes.\r\n  if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes.\r\n  if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting,\r\n  if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done.\r\n  if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate.\r\n\r\n  // For extra cursor modes, such as pick up, feel free to add as you will.\r\n  // Uncomment the line below if you use the \"Pick Up\" mode.\r\n  //if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup; \r\n\r\n  // DEBUG FUNCTIONS\r\n  if (keycode == eKeyCtrlS)  Debug(0,0);  // Ctrl-S, give all inventory\r\n  if (keycode == eKeyCtrlV)  Debug(1,0);  // Ctrl-V, version\r\n  if (keycode == eKeyCtrlA)  Debug(2,0);  // Ctrl-A, show walkable areas\r\n  if (keycode == eKeyCtrlX)  Debug(3,0);  // Ctrl-X, teleport to room\r\n  if (keycode == eKeyCtrlW && game.debug_mode) \r\n    player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area \r\n}\r\n\r\n\r\nfunction on_mouse_click(MouseButton button) {\r\n  // called when a mouse button is clicked. button is either LEFT or RIGHT\r\n  if (IsGamePaused() == 1) {\r\n    // Game is paused, so do nothing (ie. don't allow mouse click)\r\n  }\r\n  else if (button == eMouseLeft) {\r\n    ProcessClick(mouse.x, mouse.y, mouse.Mode );\r\n  }\r\n  else if (button == eMouseRight || button == eMouseWheelSouth){\r\n    // right-click our mouse-wheel down, so cycle cursor\r\n    mouse.SelectNextMode();\r\n  }\r\n  else if (button == eMouseMiddle) { \r\n    // Middle-button-click, default make character walk to clicked area (a little shortcut)\r\n    // Could have been just \"player.Walk(mouse.x,mouse.y)\", but it's best to\r\n    // leave our options open - what if you have a special script triggered\r\n    // on \"walking\" mode?\r\n    ProcessClick(mouse.x, mouse.y, eModeWalkto); \r\n  }\r\n  else if (button == eMouseWheelNorth) { \r\n    // Mouse-wheel up, cycle cursors \r\n    // If mode isn't WALK, set the previous mode (notice usage of numbers instead\r\n    // of eNums, when it suits us)...\r\n    if (mouse.Mode>0) mouse.Mode=mouse.Mode-1; \r\n    else \r\n    { \r\n      // ...but if it is WALK mode...\r\n      if (player.ActiveInventory!=null) \r\n      {\r\n        //...and the player has a selected inventory item, set mouse mode to UseInv. \r\n        mouse.Mode=eModeUseinv; \r\n      }\r\n      else \r\n      {\r\n        // If they don't, however, just set it to mode TALK (change this line if you add more cursor modes)\r\n        mouse.Mode=eModeTalkto; \r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nfunction interface_click(int interface, int button) {\r\n  // This function is obsolete, from 2.62 and earlier versions.\r\n}\r\n\r\nfunction btnInvUp_Click(GUIControl *control, MouseButton button) {\r\n  invCustomInv.ScrollUp();\r\n}\r\n\r\nfunction btnInvDown_Click(GUIControl *control, MouseButton button) {\r\n  invCustomInv.ScrollDown();\r\n}\r\n\r\nfunction btnInvOK_Click(GUIControl *control, MouseButton button) {\r\n\t// They pressed the OK button, close the GUI\r\n\tgInventory.Visible = false;\r\n\tmouse.UseDefaultGraphic();\r\n}\r\n\r\nfunction btnInvSelect_Click(GUIControl *control, MouseButton button) {\r\n  \r\n\t// They pressed SELECT, so switch to the Get cursor\r\n\tmouse.Mode = eModeInteract;\r\n\t// But, override the appearance to look like the arrow\r\n\tmouse.UseModeGraphic(eModePointer);\r\n}\r\n\r\nfunction btnIconInv_Click(GUIControl *control, MouseButton button) {\r\n  \r\n  show_inventory_window();\r\n}\r\n\r\nfunction btnIconCurInv_Click(GUIControl *control, MouseButton button) {\r\n  \r\n  if (player.ActiveInventory != null)\r\n    mouse.Mode = eModeUseinv;\r\n}\r\n\r\nfunction btnIconSave_Click(GUIControl *control, MouseButton button) \r\n{\r\n  show_save_game_dialog();\r\n}\r\n\r\nfunction btnIconLoad_Click(GUIControl *control, MouseButton button) \r\n{\r\n  show_restore_game_dialog();\r\n}\r\n\r\nfunction btnIconExit_Click(GUIControl *control, MouseButton button) {\r\n  \r\n  QuitGame(1);\r\n}\r\n\r\nfunction btnIconAbout_Click(GUIControl *control, MouseButton button) {\r\n  \r\n  gPanel.Visible=true;\r\n  gIconbar.Visible=false;\r\n  mouse.UseModeGraphic(eModePointer);\r\n}\r\n\r\nfunction cEgo_Look()\r\n{\r\n  Display(\"Damn, I'm looking good!\");\r\n}\r\n\r\nfunction cEgo_Interact()\r\n{\r\n  Display(\"You rub your hands up and down your clothes.\");\r\n}\r\n\r\nfunction cEgo_Talk()\r\n{\r\n  Display(\"Talking to yourself is a sign of madness!\");\r\n}\r\n\r\n//START OF CONTROL PANEL FUNCTIONS\r\nfunction btnSave_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gPanel.Visible = false;\r\n  mouse.UseDefaultGraphic();\r\n  gIconbar.Visible = true;\r\n  Wait(1);\r\n  btnIconSave_Click(btnIconSave, eMouseLeft);\r\n}\r\n\r\nfunction gControl_OnClick(GUI *theGui, MouseButton button)\r\n{\r\n\r\n}\r\n\r\nfunction btnAbout_OnClick(GUIControl *control, MouseButton button)\r\n{\r\nDisplay(\"Adventure Game Studio run-time engine default game.\");\r\n}\r\n\r\nfunction btnQuit_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gPanel.Visible = false;\r\n  Wait(1);\r\n  QuitGame(1);\r\n  gPanel.Visible = true;\r\n  gIconbar.Visible = false;\r\n  mouse.UseModeGraphic(eModePointer);\r\n}\r\n\r\nfunction btnLoad_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gPanel.Visible = false;\r\n  mouse.UseDefaultGraphic();\r\n  gIconbar.Visible = true;\r\n  Wait(1);\r\n  btnIconLoad_Click(btnIconLoad, eMouseLeft);\r\n}\r\n\r\nfunction btnResume_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gPanel.Visible = false;\r\n  mouse.UseDefaultGraphic();\r\n  gIconbar.Visible = true;\r\n}\r\n\r\nfunction sldAudio_OnChange(GUIControl *control)\r\n{\r\n  System.Volume = sldAudio.Value;\r\n}\r\n\r\nfunction sldVoice_OnChange(GUIControl *control)\r\n{\r\n  // Sets voice volume. Note that we don't check for the existence of speech.vox - \r\n  // we did that in game_start, so if it's not there the slider won't even be available.\r\n  SetSpeechVolume(sldVoice.Value); \r\n}\r\n\r\nfunction btnVoice_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  // Note that we don't check for the existence of speech.vox - we did that in game_start,\r\n  // so if it's not there the button won't even be available.\r\n  if (btnVoice.Text == \"Voice and Text\") { \r\n    SetVoiceMode(eSpeechVoiceOnly); \r\n    btnVoice.Text = \"Voice only\";\r\n  }\r\n  else if (btnVoice.Text == \"Voice only\") {\r\n    SetVoiceMode(eSpeechTextOnly);\r\n    btnVoice.Text = \"Text only\";\r\n  }\r\n  else if (btnVoice.Text == \"Text only\") {\r\n    SetVoiceMode(eSpeechVoiceAndText);\r\n    btnVoice.Text = \"Voice and Text\";\r\n  }\r\n}\r\n\r\nfunction sldGamma_OnChange(GUIControl *control)\r\n{\r\n  // Set the gamma. Note there's no need to check for anything else, as we ensured,\r\n  // in game_start, that the slider won't even appear if it's not possible to do this.\r\n  System.Gamma = sldGamma.Value; \r\n}\r\n\r\nfunction btnDefault_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  // Reset everything to default. You'll have to edit these as well as the sliders\r\n  // if you'd rather have different default parameters.\r\n  System.Volume = 100;\r\n  sldAudio.Value = System.Volume;\r\n  sldSpeed.Value = 40;\r\n  SetGameSpeed(40);\r\n  if (IsSpeechVoxAvailable()) {\r\n     SetVoiceMode(eSpeechVoiceAndText);\r\n     btnVoice.Text = \"Voice and Text\";\r\n     sldVoice.Value = 255;\r\n     SetSpeechVolume(255);\r\n  }\r\n  if (System.SupportsGammaControl) {\r\n    System.Gamma = 100;\r\n    sldGamma.Value = 100;\r\n  }\r\n}\r\n//END OF CONTROL PANEL FUNCTIONS\r\n\r\nfunction dialog_request(int param) \r\n{\r\n  // This is used by the dialog text parser if you need to process\r\n  // text that the player types in to the parser.\r\n  // It is not used by default.\r\n}\r\n\r\nfunction sldSpeed_OnChange(GUIControl *control)\r\n{\r\n  SetGameSpeed(sldSpeed.Value);\r\n}\r\n\r\nfunction btnRestart_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gRestartYN.Visible=true;\r\n  gIconbar.Visible=false;\r\n}\r\n\r\nfunction btnRestartYes_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  RestartGame();\r\n}\r\n\r\nfunction btnRestartNo_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gRestartYN.Visible = false;\r\n  gIconbar.Visible = true;\r\n  // If the panel's not ON, then the player must have gotten here by tapping F9,\r\n  // therefore his cursor needs restoring. If the panel IS on, then it doesn't,\r\n  // because it's already a pointer. Get used to thinking like this!!\r\n  if (!gPanel.Visible) mouse.UseDefaultGraphic(); \r\n}\r\n\r\nfunction btnCancelSave_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  close_save_game_dialog();\r\n}\r\n\r\nfunction btnSaveGame_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1;\r\n  int i = 0;\r\n  while (i < lstSaveGamesList.ItemCount)\r\n  {\r\n    if (lstSaveGamesList.Items[i] == txtNewSaveName.Text)\r\n    {\r\n      gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i];\r\n    }\r\n    i++;\r\n  }\r\n  SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text);\r\n  close_save_game_dialog();\r\n}\r\n\r\nfunction btnCancelRestore_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  close_restore_game_dialog();\r\n}\r\n\r\nfunction btnRestoreGame_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  if (lstRestoreGamesList.SelectedIndex >= 0)\r\n  {\r\n    RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]);\r\n  }\r\n  close_restore_game_dialog();\r\n}\r\n\r\nfunction lstSaveGamesList_OnSelectionCh(GUIControl *control)\r\n{\r\n  txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex];\r\n}\r\n\r\nfunction txtNewSaveName_OnActivate(GUIControl *control)\r\n{\r\n  // Pressing return in the text box simulates clicking the Save button\r\n  btnSaveGame_OnClick(control, eMouseLeft);\r\n}\r\n\r\nfunction btnDeleteSave_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  if (lstSaveGamesList.SelectedIndex >= 0)\r\n  {\r\n    DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]);\r\n    lstSaveGamesList.FillSaveGameList();\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/AGS Script/GlobalScript.ash",
    "content": "// Main header script - this will be included into every script in\r\n// the game (local and global). Do not place functions here; rather,\r\n// place import definitions and #define names here to be used by all\r\n// scripts.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/AGS Script/KeyboardMovement_102.asc",
    "content": "// Main script for module 'KeyboardMovement'\r\n\r\n//****************************************************************************************************\r\n// DEFINITIONS\r\n//****************************************************************************************************\r\n\r\n#define DISTANCE 10000// distance player walks in Tapping mode before he stops\r\n\r\nenum KeyboardMovement_Directions {\r\n\teKeyboardMovement_Stop, \r\n\teKeyboardMovement_DownLeft, \r\n\teKeyboardMovement_Down, \r\n\teKeyboardMovement_DownRight, \r\n\teKeyboardMovement_Left, \r\n\teKeyboardMovement_Right, \r\n\teKeyboardMovement_UpLeft, \r\n\teKeyboardMovement_Up, \r\n\teKeyboardMovement_UpRight\r\n};\r\n\r\n//****************************************************************************************************\r\n// VARIABLES\r\n//****************************************************************************************************\r\n\r\n// keycodes as variables for future key customization functions (static variables?):\r\nint KeyboardMovement_KeyDown = 380; // down arrow\r\nint KeyboardMovement_KeyLeft = 375; // left arrow\r\nint KeyboardMovement_KeyRight = 377; // right arrow\r\nint KeyboardMovement_KeyUp = 372; // up arrow\r\nint KeyboardMovement_KeyDownRight = 381; // PgDn (numpad)\r\nint KeyboardMovement_KeyUpRight = 373; // PgUp (numpad)\r\nint KeyboardMovement_KeyDownLeft = 379; // End (numpad)\r\nint KeyboardMovement_KeyUpLeft = 371; // Home (numpad)\r\nint KeyboardMovement_KeyStop = 376; // 5 (numpad)\r\n\r\nKeyboardMovement_Modes KeyboardMovement_Mode = eKeyboardMovement_None; // stores current keyboard control mode (disabled by default)\r\n\r\nKeyboardMovement_Directions KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // stores current walking direction of player character\r\n\r\n//****************************************************************************************************\r\n// USER FUNCTIONS\r\n//****************************************************************************************************\r\n\r\n//====================================================================================================\r\n\r\nstatic function KeyboardMovement::SetMode(KeyboardMovement_Modes mode) {\r\n\tKeyboardMovement_Mode = mode;\r\n}\r\n\r\n//====================================================================================================\r\n\r\n// key customization functions here\r\n\r\n//====================================================================================================\r\n\r\n//****************************************************************************************************\r\n// EVENT HANDLER FUNCTIONS\r\n//****************************************************************************************************\r\n\r\n//====================================================================================================\r\n\r\nfunction repeatedly_execute() {\r\n\r\n\t//--------------------------------------------------\r\n\t// Pressing mode\r\n\t//--------------------------------------------------\r\n\r\n\tif ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Pressing) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0;\r\n\t  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function\r\n\r\n\tKeyboardMovement_Directions newdirection; // declare variable storing new direction\r\n\r\n\t// get new direction:\r\n\tif ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyDownRight)) ) newdirection = eKeyboardMovement_DownRight; // if down&right arrows or PgDn (numeric pad) held down, set new direction to Down-Right\r\n\telse if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyUpRight)) ) newdirection = eKeyboardMovement_UpRight; // up&right arrows or PgUp (numpad)\r\n\telse if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyDownLeft)) ) newdirection = eKeyboardMovement_DownLeft; // down&left arrows or End (numpad)\r\n\telse if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyUpLeft)) ) newdirection = eKeyboardMovement_UpLeft; // up&left arrows or Home (numpad)\r\n\telse if (IsKeyPressed(KeyboardMovement_KeyDown)) newdirection = eKeyboardMovement_Down; // down arrow\r\n\telse if (IsKeyPressed(KeyboardMovement_KeyLeft)) newdirection = eKeyboardMovement_Left; // left arrow\r\n\telse if (IsKeyPressed(KeyboardMovement_KeyRight)) newdirection = eKeyboardMovement_Right; // right arrow\r\n\telse if (IsKeyPressed(KeyboardMovement_KeyUp)) newdirection = eKeyboardMovement_Up; // up arrow\r\n\telse newdirection = eKeyboardMovement_Stop; // if none of the above held down, set it to stop player character\r\n\r\n\tif (IsKeyPressed(KeyboardMovement_KeyStop)) newdirection = eKeyboardMovement_Stop; // if 5 (numeric pad) held down, stop player character, regardless of whether some of the above are held down\r\n\r\n\tif (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction\r\n\r\n\t\tif (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character\r\n\t\telse { // if new direction is NOT the Stop command\r\n\r\n\t\t\tint dx, dy; // declare variables storing new walk coordinates\r\n\t\t\tif (newdirection == eKeyboardMovement_DownRight) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_UpRight) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_DownLeft) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_UpLeft) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Down) {\r\n\t\t\t\tdx = 0;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Left) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = 0;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Right) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = 0;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Up) {\r\n\t\t\t\tdx = 0;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\r\n\t\t\tplayer.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates\r\n\t\t}\r\n\t\tKeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction\r\n\r\n\t}\r\n\r\n}\r\n\r\n//====================================================================================================\r\n\r\nfunction on_key_press(int keycode) {\r\n\r\n\t//--------------------------------------------------\r\n\t// Tapping mode\r\n\t//--------------------------------------------------\r\n\r\n\tif ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Tapping) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0;\r\n\t  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function\r\n\r\n\tKeyboardMovement_Directions newdirection; // declare variable storing new direction\r\n\r\n\t// get new direction:\r\n\tif (keycode == KeyboardMovement_KeyDownRight) newdirection = eKeyboardMovement_DownRight; // if down-right key pressed, set new direction to Down-Right\r\n\telse if (keycode == KeyboardMovement_KeyUpRight) newdirection = eKeyboardMovement_UpRight;\r\n\telse if (keycode == KeyboardMovement_KeyDownLeft) newdirection = eKeyboardMovement_DownLeft;\r\n\telse if (keycode == KeyboardMovement_KeyUpLeft) newdirection = eKeyboardMovement_UpLeft;\r\n\telse if (keycode == KeyboardMovement_KeyDown) newdirection = eKeyboardMovement_Down;\r\n\telse if (keycode == KeyboardMovement_KeyLeft) newdirection = eKeyboardMovement_Left;\r\n\telse if (keycode == KeyboardMovement_KeyRight) newdirection = eKeyboardMovement_Right;\r\n\telse if (keycode == KeyboardMovement_KeyUp) newdirection = eKeyboardMovement_Up;\r\n\telse if (keycode == KeyboardMovement_KeyStop) newdirection = eKeyboardMovement_Stop; // if stop key pressed, set to stop player character\r\n\r\n\tif (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction\r\n\r\n\t\tif (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character\r\n\t\telse { // if new direction is NOT the Stop command\r\n\r\n\t\t\tint dx, dy; // declare variables storing new walk coordinates\r\n\t\t\tif (newdirection == eKeyboardMovement_DownRight) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_UpRight) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_DownLeft) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_UpLeft) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Down) {\r\n\t\t\t\tdx = 0;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Left) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = 0;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Right) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = 0;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Up) {\r\n\t\t\t\tdx = 0;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\r\n\t\t\tplayer.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates\r\n\t\t}\r\n\t\tKeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction\r\n\r\n\t}\r\n\telse { // if new direction is same as current direction\r\n\t\tplayer.StopMoving(); // stop player character\r\n\t\tKeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // update current direction\r\n\t}\r\n\r\n}\r\n\r\n//====================================================================================================\r\n\r\nfunction on_event(EventType event, int data) {\r\n\r\n\tif (event == eEventLeaveRoom) KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop;\r\n\r\n}\r\n\r\n//====================================================================================================\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/AGS Script/KeyboardMovement_102.ash",
    "content": "// Script header for module 'KeyboardMovement'\r\n\r\n#define KeyboardMovement_VERSION 101\r\n\r\nenum KeyboardMovement_Modes {\r\n\teKeyboardMovement_None, \r\n\teKeyboardMovement_Tapping, \r\n\teKeyboardMovement_Pressing\r\n};\r\n\r\nstruct KeyboardMovement {\r\n\timport static function SetMode(KeyboardMovement_Modes mode);\r\n};\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/AMPL/CT2.mod",
    "content": "param num_beams;                  # number of beams\n\nparam num_rows >= 1, integer;     # number of rows\nparam num_cols >= 1, integer;     # number of columns \n\nset BEAMS   := 1 .. num_beams;    # set of beams\n\nset ROWS    := 1 .. num_rows;\t  # set of rows\nset COLUMNS := 1 .. num_cols;\t  # set of columns\n\n# values for entries of each beam\nparam beam_values {BEAMS, ROWS, COLUMNS} >= 0; \n\n# values of tumor\nparam tumor_values {ROWS, COLUMNS} >= 0; \n\n# values of critical area\nparam critical_values {ROWS, COLUMNS} >= 0; \n\n# critical maximum dosage requirement\nparam critical_max;\n\n# tumor minimum dosage requirement\nparam tumor_min;\n\n# dosage scalar of each beam\nvar X {i in BEAMS} >= 0;\n\n\n# define the tumor area which includes the locations where tumor exists\nset tumor_area := {k in ROWS, h in COLUMNS: tumor_values[k,h] > 0};\n\n# define critical area \nset critical_area := {k in ROWS, h in COLUMNS: critical_values[k,h] > 0};\n\nvar S {(k,h) in tumor_area} >= 0;\nvar T {(k,h) in critical_area} >= 0;\n\n# maximize total dosage in tumor area\nmaximize total_tumor_dosage: sum {i in BEAMS} sum {(k,h) in tumor_area} X[i] * beam_values[i,k,h];\n\n# minimize total dosage in critical area\nminimize total_critical_dosage: sum {i in BEAMS} sum {(k,h) in critical_area} X[i] * beam_values[i,k,h];\n\n# minimize total tumor slack\nminimize total_tumor_slack: sum {(k,h) in tumor_area} S[k,h];\n\n# minimize total critical area slack\nminimize total_critical_slack: sum {(k,h) in critical_area} T[k,h];\n\n# total dosage at each tumor location [k,h] should be >= min tumor dosage with slack variable\nsubject to tumor_limit {(k,h) in tumor_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == tumor_min - S[k,h];\n\n# total dosage at each critical location [k,h] should be = max critical dosage with slack variable\nsubject to critical_limit {(k,h) in critical_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == critical_max + T[k,h];\n\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/AMPL/toy.ampl",
    "content": "# A toy knapsack problem from the LocalSolver docs written in AMPL.\n\nset I;\nparam Value{I};\nparam Weight{I};\nparam KnapsackBound;\nvar Take{I} binary;\n\nmaximize TotalValue: sum{i in I} Take[i] * Value[i];\ns.t. WeightLimit: sum{i in I} Take[i] * Weight[i] <= KnapsackBound;\n\ndata;\n\nparam:\nI: Weight Value :=\n0    10     1\n1    60    10\n2    30    15\n3    40    40\n4    30    60\n5    20    90\n6    20   100\n7     2    15;\n\nparam KnapsackBound := 102;\n"
  },
  {
    "path": "src/test/resources/samples/langs/API Blueprint/actions.apib",
    "content": "FORMAT: 1A\n\n# Advanced Action API\nA resource action is – in fact – a state transition. This API example demonstrates an action - state transition - to another resource.\n\n## API Blueprint\n+ [Previous: Resource Model](11.%20Resource%20Model.md)\n+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/11.%20Advanced%20Action.md)\n\n# Tasks [/tasks/tasks{?status,priority}]\n\n+ Parameters\n    + status (string)\n    + priority (number)\n\n## List All Tasks [GET]\n\n+ Response 200 (application/json)\n\n        [\n            {\n                \"id\": 123,\n                \"name\": \"Exercise in gym\",\n                \"done\": false,\n                \"type\": \"task\"\n            },\n            {\n                \"id\": 124,\n                \"name\": \"Shop for groceries\",\n                \"done\": true,\n                \"type\": \"task\"\n            }\n        ]\n\n## Retrieve Task [GET /task/{id}]\nThis is a state transition to another resource\n\n+ Parameters\n    + id (string)\n\n+ Response 200 (application/json)\n\n        {\n            \"id\": 123,\n            \"name\": \"Go to gym\",\n            \"done\": false,\n            \"type\": \"task\"\n        }\n\n## Delete Task [DELETE /task/{id}]\n\n+ Parameters\n    + id (string)\n\n+ Response 204\n"
  },
  {
    "path": "src/test/resources/samples/langs/API Blueprint/attributes.apib",
    "content": "FORMAT: 1A\n\n# Attributes API\nThis API example demonstrates how to describe body attributes of a request or response message.\n\nIn this case, the description is complementary (and duplicate!) to the provided JSON example in the body section. The [Advanced Attributes](09.%20Advanced%20Attributes.md) API example will demonstrate how to avoid duplicates and how to reuse attributes descriptions.\n\n## API Blueprint\n+ [Previous: Parameters](07.%20Parameters.md)\n+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/08.%20Attributes.md)\n+ [Next: Advanced Attributes](09.%20Advanced%20Attributes.md)\n\n# Group Coupons\n\n## Coupon [/coupons/{id}]\nA coupon contains information about a percent-off or amount-off discount you might want to apply to a customer.\n\n### Retrieve a Coupon [GET]\nRetrieves the coupon with the given ID.\n\n+ Response 200 (application/json)\n\n    + Attributes (object)\n        + id: 250FF (string)\n        + created: 1415203908 (number) - Time stamp\n        + percent_off: 25 (number)\n\n            A positive integer between 1 and 100 that represents the discount the coupon will apply.\n\n        + redeem_by (number) - Date after which the coupon can no longer be redeemed\n\n    + Body\n\n            {\n                \"id\": \"250FF\",\n                \"created\": 1415203908,\n                \"percent_off\": 25,\n                \"redeem_by:\" null\n            }\n"
  },
  {
    "path": "src/test/resources/samples/langs/API Blueprint/simple.apib",
    "content": "FORMAT: 1A\n\n# The Simplest API\nThis is one of the simplest APIs written in the **API Blueprint**.\nOne plain resource combined with a method and that's it! We will explain what is going on in the next installment - [Resource and Actions](02.%20Resource%20and%20Actions.md).\n\n**Note:** As we progress through the examples, do not also forget to view the [Raw](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md) code to see what is really going on in the API Blueprint, as opposed to just seeing the output of the Github Markdown parser.\n\nAlso please keep in mind that every single example in this course is a **real API Blueprint** and as such you can **parse** it with the [API Blueprint parser](https://github.com/apiaryio/drafter) or one of its [bindings](https://github.com/apiaryio/drafter#bindings).\n\n## API Blueprint\n+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md)\n+ [Next: Resource and Actions](02.%20Resource%20and%20Actions.md)\n\n# GET /message\n+ Response 200 (text/plain)\n\n        Hello World!\n"
  },
  {
    "path": "src/test/resources/samples/langs/APL/DeepakChopra.apl",
    "content": "⍝   You can try this at http://tryapl.org/\n⍝   I can not explain how much I suddenly love this crypto-language\n\n\n\nStarts     ← 'Experiential truth ' 'The physical world ' 'Non-judgment '       'Quantum physics '\nMiddles    ← 'nurtures an '        'projects onto '      'imparts reality to ' 'constructs with '\nQualifiers ← 'abundance of '       'the barrier of '     'self-righteous '     'potential '\nFinishes   ← 'marvel.'             'choices.'            'creativity.'         'actions.'\n\nrf     ← {(?⍴⍵)⊃⍵}\nerf    ← {rf ¨ ⍵}\n\ndeepak ← {erf Starts Middles Qualifiers Finishes}\n\n\n\ndeepak ⍬"
  },
  {
    "path": "src/test/resources/samples/langs/APL/UT.dyalog",
    "content": "﻿:NameSpace UT\n\n    sac ← 0\n    expect_orig ← expect ← ⎕NS⍬\n    exception ← ⍬\n    nexpect_orig ← nexpect ← ⎕NS⍬\n\n    ∇ {Z}←{Conf}run Argument;PRE_test;POST_test;TEST_step;COVER_step;FromSpace\n     \n      load_display_if_not_already_loaded\n      load_salt_scripts_into_current_namespace_if_configured\n     \n      FromSpace←1⊃⎕RSI\n     \n      PRE_test←{}\n      POST_test←{}\n      COVER_step←{}\n      :If 0≠⎕NC'Conf'\n          :If Conf has'cover_target'\n              PRE_test←{{}⎕PROFILE'start'}\n              POST_test←{{}⎕PROFILE'stop'}\n          :EndIf\n      :EndIf\n     \n      :If is_function Argument\n          TEST_step←single_function_test_function\n          COVER_file←Argument,'_coverage.html'\n     \n      :ElseIf is_list_of_functions Argument\n          TEST_step←list_of_functions_test_function\n          COVER_file←'list_coverage.html'\n     \n      :ElseIf is_file Argument\n          TEST_step←file_test_function\n          COVER_file←(get_file_name Argument),'_coverage.html'\n     \n      :ElseIf is_dir Argument\n          test_files←test_files_in_dir Argument\n          TEST_step←test_dir_function\n          Argument←test_files\n      :EndIf\n     \n      :If 0≠⎕NC'Conf'\n          :If Conf has'cover_target'\n              COVER_step←{Conf,←⊂('cover_file'COVER_file)\n                  generate_coverage_page Conf}\n          :EndIf\n      :EndIf\n     \n      PRE_test ⍬\n      Z←FromSpace TEST_step Argument\n      POST_test ⍬\n      COVER_step ⍬\n    ∇\n\n    ∇ load_display_if_not_already_loaded\n      :If 0=⎕NC'#.DISPLAY'\n          'DISPLAY'#.⎕CY'display'\n      :EndIf\n    ∇\n\n    ∇ load_salt_scripts_into_current_namespace_if_configured\n      :If 0≠⎕NC'#.UT.appdir'\n          :If ⍬≢#.UT.appdir\n              ⎕SE.SALT.Load #.UT.appdir,'src/*.dyalog -target=#'\n              ⎕SE.SALT.Load #.UT.appdir,'test/*.dyalog -target=#'\n          :EndIf\n      :EndIf\n    ∇\n\n    ∇ Z←FromSpace single_function_test_function TestName\n      Z←run_ut FromSpace TestName\n    ∇\n\n    ∇ Z←FromSpace list_of_functions_test_function ListOfNames;t\n      t←⎕TS\n      Z←run_ut¨{FromSpace ⍵}¨ListOfNames\n      t←⎕TS-t\n      ('Test execution report')print_passed_crashed_failed Z t\n    ∇\n\n    ∇ Z←FromSpace file_test_function FilePath;FileNS;Functions;TestFunctions;t\n      FileNS←⎕SE.SALT.Load FilePath,' -target=#'\n      Functions←↓FileNS.⎕NL 3\n      TestFunctions←(is_test¨Functions)/Functions\n      :If (0/⍬,⊂0/'')≡TestFunctions\n          ⎕←'No test functions found'\n          Z←⍬\n      :Else\n          t←⎕TS\n          Z←run_ut¨{FileNS ⍵}¨TestFunctions\n          t←⎕TS-t\n          (FilePath,' tests')print_passed_crashed_failed Z t\n      :EndIf\n    ∇\n\n    ∇ Z←FromSpace test_dir_function Test_files\n      :If Test_files≡⍬/⍬,⊂''\n          ⎕←'No test files found'\n          Z←⍬\n      :Else\n          Z←#.UT.run¨Test_files\n      :EndIf\n    ∇\n\n    ∇ Z←get_file_name Argument;separator\n      separator←⊃⌽(Argument∊'/\\')/⍳⍴Argument\n      Z←¯7↓separator↓Argument\n    ∇\n\n    ∇ generate_coverage_page Conf;ProfileData;CoverResults;HTML\n      ProfileData←⎕PROFILE'data'\n      ToCover←retrieve_coverables¨(⊃'cover_target'in Conf)\n      :If (⍴ToCover)≡(⍴⊂1)\n          ToCover←⊃ToCover\n      :EndIf\n      Representations←get_representation¨ToCover\n      CoverResults←ProfileData∘generate_cover_result¨↓ToCover,[1.5]Representations\n      HTML←generate_html CoverResults\n      Conf write_html_to_page HTML\n      ⎕PROFILE'clear'\n    ∇\n\n    ∇ Z←retrieve_coverables Something;nc;functions\n      nc←⎕NC Something\n      :If nc=3\n          Z←Something\n      :ElseIf nc=9\n          functions←strip¨↓⍎Something,'.⎕NL 3'\n          Z←{(Something,'.',⍵)}¨functions\n      :EndIf\n    ∇\n\n    ∇ Z←strip input\n      Z←(input≠' ')/input\n    ∇\n\n    ∇ Z←get_representation Function;nc;rep\n      nc←⎕NC⊂Function\n      :If nc=3.1\n          rep←↓⎕CR Function\n          rep[1]←⊂'∇',⊃rep[1]\n          rep,←⊂'∇'\n          rep←↑rep\n      :Else\n          rep←⎕CR Function\n      :EndIf\n      Z←rep\n    ∇\n\n    ∇ Z←ProfileData generate_cover_result(name representation);Indices;lines;functionlines;covered_lines\n      Indices←({name≡⍵}¨ProfileData[;1])/⍳⍴ProfileData[;1]\n      lines←ProfileData[Indices;2]\n      nc←⎕NC⊂name\n      :If 3.1=nc\n          functionlines←¯2+⍴↓representation\n      :Else\n          functionlines←⊃⍴↓representation\n      :EndIf\n      covered_lines←(⍬∘≢¨lines)/lines\n      Z←(nc lines functionlines covered_lines representation)\n    ∇\n\n    ∇ Z←generate_html CoverResults;Covered;Total;Percentage;CoverageText;ColorizedCode;Timestamp;Page\n      Covered←⊃⊃+/{⍴4⊃⍵}¨CoverResults\n      Total←⊃⊃+/{3⊃⍵}¨CoverResults\n      Percentage←100×Covered÷Total\n      CoverageText←'Coverage: ',Percentage,'% (',Covered,'/',Total,')'\n      ColorizedCode←⊃,/{colorize_code_by_coverage ⍵}¨CoverResults\n      Timestamp←generate_timestamp_text\n      Page←⍬\n      Page,←⊂⍬,'<html>'\n      Page,←⊂⍬,'<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>'\n      Page,←⊂⍬,'<style>pre cov {line-height:80%;}'\n      Page,←⊂⍬,'pre cov {color: green;}'\n      Page,←⊂⍬,'pre uncov {line-height:80%;}'\n      Page,←⊂⍬,'pre uncov {color:red;}</style>'\n      Page,←⊂⍬,CoverageText\n      Page,←⊂⍬,'<pre>'\n      Page,←ColorizedCode\n      Page,←⊂⍬,'</pre>'\n      Page,←Timestamp\n      Page,←⊂⍬,'</html>'\n      Z←Page\n    ∇\n\n    ∇ Z←colorize_code_by_coverage CoverResult;Colors;Ends;Code\n      :If 3.1=⊃CoverResult\n          Colors←(2+3⊃CoverResult)⍴⊂'<uncov>'\n          Colors[1]←⊂''\n          Colors[⍴Colors]←⊂''\n          Ends←(2+3⊃CoverResult)⍴⊂'</uncov>'\n          Ends[1]←⊂''\n          Ends[⍴Ends]←⊂''\n      :Else\n          Colors←(3⊃CoverResult)⍴⊂'<uncov>'\n          Ends←(3⊃CoverResult)⍴⊂'</uncov>'\n      :EndIf\n      Colors[1+4⊃CoverResult]←⊂'<cov>'\n      Ends[1+4⊃CoverResult]←⊂'</cov>'\n      Code←↓5⊃CoverResult\n      Z←Colors,[1.5]Code\n      Z←{⍺,(⎕UCS 13),⍵}/Z,Ends\n    ∇\n\n    ∇ Z←generate_timestamp_text;TS;YYMMDD;HHMMSS\n      TS←⎕TS\n      YYMMDD←⊃{⍺,'-',⍵}/3↑TS\n      HHMMSS←⊃{⍺,':',⍵}/3↑3↓TS\n      Z←'Page generated: ',YYMMDD,'|',HHMMSS\n    ∇\n\n    ∇ Conf write_html_to_page Page;tie;filename\n      filename←(⊃'cover_out'in Conf),(⊃'cover_file'in Conf)\n      :Trap 22\n          tie←filename ⎕NTIE 0\n          filename ⎕NERASE tie\n          filename ⎕NCREATE tie\n      :Else\n          tie←filename ⎕NCREATE 0\n      :EndTrap\n      Simple_array←⍕⊃,/Page\n      (⎕UCS'UTF-8'⎕UCS Simple_array)⎕NAPPEND tie\n    ∇\n\n    ∇ Z←is_function Argument\n      Z←'_TEST'≡¯5↑Argument\n    ∇\n\n    ∇ Z←is_list_of_functions Argument\n      Z←2=≡Argument\n    ∇\n\n    ∇ Z←is_file Argument\n      Z←'.dyalog'≡¯7↑Argument\n    ∇\n\n    ∇ Z←is_dir Argument;attr\n      :If 'Linux'≡5↑⊃'.'⎕WG'APLVersion'\n          Z←'yes'≡⊃⎕CMD'test -d ',Argument,' && echo yes || echo no'\n      :Else\n          'gfa'⎕NA'I kernel32|GetFileAttributes* <0t'\n          :If Z←¯1≠attr←gfa⊂Argument ⍝ If file exists\n              Z←⊃2 16⊤attr           ⍝ Return bit 4\n          :EndIf\n      :EndIf\n    ∇\n\n\n    ∇ Z←test_files_in_dir Argument\n      :If 'Linux'≡5↑⊃'.'⎕WG'APLVersion'\n          Z←⎕SH'find ',Argument,' -name \\*_tests.dyalog'\n      :Else\n          #.⎕CY'files'\n          Z←#.Files.Dir Argument,'\\*_tests.dyalog'\n          Z←(Argument,'\\')∘,¨Z\n      :EndIf\n    ∇\n\n    ∇ Z←run_ut ut_data;returned;crashed;pass;crash;fail;message\n      (returned crashed time)←execute_function ut_data\n      (pass crash fail)←determine_pass_crash_or_fail returned crashed\n      message←determine_message pass fail crashed(2⊃ut_data)returned time\n      print_message_to_screen message\n      Z←(pass crash fail)\n    ∇\n\n    ∇ Z←execute_function ut_data;function;t\n      reset_UT_globals\n      function←(⍕(⊃ut_data[1])),'.',⊃ut_data[2]\n      :Trap sac\n          :If 3.2≡⎕NC⊂function\n              t←⎕TS\n              Z←(⍎function,' ⍬')0\n              t←⎕TS-t\n          :Else\n              t←⎕TS\n              Z←(⍎function)0\n              t←⎕TS-t\n          :EndIf\n     \n      :Else\n          Z←(↑⎕DM)1\n          :If exception≢⍬\n              expect←exception\n              Z[2]←0\n              t←⎕TS-t\n          :EndIf\n      :EndTrap\n      Z,←⊂t\n    ∇\n\n    ∇ reset_UT_globals\n      expect_orig ← expect← ⎕NS⍬\n      exception←⍬\n      nexpect_orig ← nexpect← ⎕NS⍬\n    ∇\n\n    ∇ Z←is_test FunctionName;wsIndex\n      wsIndex←FunctionName⍳' '\n      FunctionName←(wsIndex-1)↑FunctionName\n      Z←'_TEST'≡¯5↑FunctionName\n    ∇\n\n    ∇ Heading print_passed_crashed_failed(ArrayRes time)\n      ⎕←'-----------------------------------------'\n      ⎕←Heading\n      ⎕←'    ⍋  Passed: ',+/{1⊃⍵}¨ArrayRes\n      ⎕←'    ⍟ Crashed: ',+/{2⊃⍵}¨ArrayRes\n      ⎕←'    ⍒  Failed: ',+/{3⊃⍵}¨ArrayRes\n      ⎕←'    ○ Runtime: ',time[5],'m',time[6],'s',time[7],'ms'\n    ∇\n    \n    determine_pass_crash_or_fail←{\n      r c←⍵ ⋄ 0≠c:0 1 0 ⋄ z←(0 0 1)(1 0 0)\n      expect_orig≢expect:(⎕IO+expect≡r)⊃z ⋄ (⎕IO+nexpect≢r)⊃z\n    }\n\n    ∇ Z←determine_message(pass fail crashed name returned time)\n      :If crashed\n          Z←'CRASHED: 'failure_message name returned\n      :ElseIf pass\n          Z←'Passed ',time[5],'m',time[6],'s',time[7],'ms'\n      :Else\n          Z←'FAILED: 'failure_message name returned\n      :EndIf\n    ∇\n\n    ∇ print_message_to_screen message\n      ⎕←message\n    ∇\n\n    ∇ Z←term_to_text Term;Text;Rows\n      Text←#.DISPLAY Term\n      Rows←1⊃⍴Text\n      Z←(Rows 4⍴''),Text\n    ∇\n\n    ∇ Z←Cause failure_message(name returned);hdr;exp;expterm;got;gotterm\n      hdr←Cause,name\n      exp←'Expected'\n      expterm←term_to_text #.UT.expect\n      got←'Got'\n      gotterm←term_to_text returned\n      Z←align_and_join_message_parts hdr exp expterm got gotterm\n    ∇\n\n    ∇ Z←align_and_join_message_parts Parts;hdr;exp;expterm;got;gotterm;R1;C1;R2;C2;W\n      (hdr exp expterm got gotterm)←Parts\n      (R1 C1)←⍴expterm\n      (R2 C2)←⍴gotterm\n      W←⊃⊃⌈/C1 C2(⍴hdr)(⍴exp)(⍴got)\n      Z←(W↑hdr),[0.5](W↑exp)\n      Z←Z⍪(R1 W↑expterm)\n      Z←Z⍪(W↑got)\n      Z←Z⍪(R2 W↑gotterm)\n    ∇\n\n    ∇ Z←confparam in config\n      Z←1↓⊃({confparam≡⊃⍵}¨config)/config\n    ∇\n\n    ∇ Z←config has confparam\n      Z←∨/{confparam≡⊃⍵}¨config\n    ∇\n\n:EndNameSpace\n"
  },
  {
    "path": "src/test/resources/samples/langs/APL/hashbang",
    "content": "#!/usr/local/bin/apl --script\nNEWLINE ← ⎕UCS 10\nHEADERS ← 'Content-Type: text/plain', NEWLINE\nHEADERS\n⍝ ⎕←HEADERS\n⍝ ⍕⎕TS\n)OFF\n"
  },
  {
    "path": "src/test/resources/samples/langs/ASN.1/example.asn",
    "content": "MyShopPurchaseOrders DEFINITIONS AUTOMATIC TAGS ::= BEGIN\n\nPurchaseOrder ::= SEQUENCE {\ndateOfOrder\tDATE,\ncustomer   \tCustomerInfo,\nitems      \tListOfItems\n}\n\nCustomerInfo ::= SEQUENCE {\ncompanyName\t   VisibleString (SIZE (3..50)),\nbillingAddress\tAddress,\ncontactPhone   NumericString (SIZE (7..12))\n}\n\nAddress::= SEQUENCE {\nstreet\t VisibleString (SIZE (5 .. 50)) OPTIONAL,\ncity\t   VisibleString (SIZE (2..30)),\nstate\t  VisibleString (SIZE(2) ^ FROM (\"A\"..\"Z\")),\nzipCode\tNumericString (SIZE(5 | 9))\n}\n\nListOfItems ::= SEQUENCE (SIZE (1..100)) OF Item\n\nItem ::= SEQUENCE {\nitemCode\t       INTEGER (1..99999),\ncolor          \tVisibleString (\"Black\" | \"Blue\" | \"Brown\"),\npower          \tINTEGER (110 | 220),\ndeliveryTime   \tINTEGER (8..12 | 14..19),\nquantity\t       INTEGER (1..1000),\nunitPrice\t      REAL (1.00 .. 9999.00),\nisTaxable\t      BOOLEAN\n}\nEND\n"
  },
  {
    "path": "src/test/resources/samples/langs/ATS/CoYonedaLemma.dats",
    "content": "(* ****** ****** *)\n//\n// HX-2014-01\n// CoYoneda Lemma:\n//\n(* ****** ****** *)\n//\n#include\n\"share/atspre_staload.hats\"\n//\n(* ****** ****** *)\n\nstaload\n\"libats/ML/SATS/basis.sats\"\nstaload\n\"libats/ML/SATS/list0.sats\"\n\n(* ****** ****** *)\n\nstaload _ = \"libats/ML/DATS/list0.dats\"\n\n(* ****** ****** *)\n\nsortdef ftype = type -> type\n\n(* ****** ****** *)\n\ninfixr (->) ->>\ntypedef ->> (a:type, b:type) = a -<cloref1> b\n\n(* ****** ****** *)\n\ntypedef\nfunctor(F:ftype) =\n  {a,b:type} (a ->> b) ->> F(a) ->> F(b)\n\n(* ****** ****** *)\n\ntypedef\nlist0 (a:type) = list0 (a)\nextern\nval functor_list0 : functor (list0)\n\n(* ****** ****** *)\n\nimplement\nfunctor_list0{a,b}\n  (f) = lam xs => list0_map<a><b> (xs, f)\n\n(* ****** ****** *)\n\ndatatype\nCoYoneda\n (F:ftype, r:type) = {a:type} CoYoneda of (a ->> r, F(a))\n// end of [CoYoneda]\n\n(* ****** ****** *)\n//\nextern\nfun CoYoneda_phi\n  : {F:ftype}functor(F) -> {r:type} (F (r) ->> CoYoneda (F, r))\nextern\nfun CoYoneda_psi\n  : {F:ftype}functor(F) -> {r:type} (CoYoneda (F, r) ->> F (r))\n//\n(* ****** ****** *)\n\nimplement\nCoYoneda_phi(ftor) = lam (fx) => CoYoneda (lam x => x, fx)\nimplement\nCoYoneda_psi(ftor) = lam (CoYoneda(f, fx)) => ftor (f) (fx)\n\n(* ****** ****** *)\n\ndatatype int0 = I of (int)\ndatatype bool = True | False // boxed boolean\n\n(* ****** ****** *)\n//\nfun bool2string\n  (x:bool): string =\n(\n  case+ x of True() => \"True\" | False() => \"False\"\n)\n//\nimplement\nfprint_val<bool> (out, x) = fprint (out, bool2string(x))\n//\n(* ****** ****** *)\n\nfun int2bool (i: int0): bool =\n  let val+I(i) = i in if i > 0 then True else False end\n\n(* ****** ****** *)\n\nval myintlist0 = g0ofg1($list{int0}((I)1, (I)0, (I)1, (I)0, (I)0))\nval myboolist0 = CoYoneda{list0,bool}{int0}(lam (i) => int2bool(i), myintlist0)\nval myboolist0 = CoYoneda_psi{list0}(functor_list0){bool}(myboolist0)\n\n(* ****** ****** *)\n\nval ((*void*)) = fprintln! (stdout_ref, \"myboolist0 = \", myboolist0)\n\n(* ****** ****** *)\n\nimplement main0 () = ()\n\n(* ****** ****** *)\n\n(* end of [CoYonedaLemma.dats] *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/ATS/DiningPhil2.dats",
    "content": "(* ****** ****** *)\n//\n// HX-2013-11\n//\n// Implementing a variant of\n// the problem of Dining Philosophers\n//\n(* ****** ****** *)\n//\n#include\n\"share/atspre_define.hats\"\n#include\n\"share/atspre_staload.hats\"\n//\n(* ****** ****** *)\n\nstaload\nUN = \"prelude/SATS/unsafe.sats\"\n\n(* ****** ****** *)\n\nstaload \"libc/SATS/stdlib.sats\"\nstaload \"libc/SATS/unistd.sats\"\n\n(* ****** ****** *)\n\nstaload \"{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats\"\n\n(* ****** ****** *)\n\nstaload _ = \"libats/DATS/deqarray.dats\"\nstaload _ = \"{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats\"\n\n(* ****** ****** *)\n\nstaload \"./DiningPhil2.sats\"\n\n(* ****** ****** *)\n\nimplement phil_left (n) = n\nimplement phil_right (n) = (n+1) \\nmod NPHIL\n\n(* ****** ****** *)\n//\nextern\nfun randsleep (n: intGte(1)): void\n//\nimplement\nrandsleep (n) =\n  ignoret (sleep($UN.cast{uInt}(rand() mod n + 1)))\n// end of [randsleep]\n//\n(* ****** ****** *)\n\nimplement\nphil_think (n) =\n{\nval () = println! (\"phil_think(\", n, \") starts\")\nval () = randsleep (6)\nval () = println! (\"phil_think(\", n, \") finishes\")\n}\n\n(* ****** ****** *)\n\nimplement\nphil_dine (n, lf, rf) =\n{\nval () = println! (\"phil_dine(\", n, \") starts\")\nval () = randsleep (3)\nval () = println! (\"phil_dine(\", n, \") finishes\")\n}\n\n(* ****** ****** *)\n\nimplement\nphil_loop (n) = let\n//\nval () = phil_think (n)\n//\nval nl = phil_left (n)\nval nr = phil_right (n)\n//\nval ch_lfork = fork_changet (nl)\nval ch_rfork = fork_changet (nr)\n//\nval lf = channel_takeout (ch_lfork)\nval () = println! (\"phil_loop(\", n, \") picks left fork\")\n//\nval () = randsleep (2) // HX: try to actively induce deadlock\n//\nval rf = channel_takeout (ch_rfork)\nval () = println! (\"phil_loop(\", n, \") picks right fork\")\n//\nval () = phil_dine (n, lf, rf)\n//\nval ch_forktray = forktray_changet ()\nval () = channel_insert (ch_forktray, lf)\nval () = channel_insert (ch_forktray, rf)\n//\nin\n  phil_loop (n)\nend // end of [phil_loop]\n\n(* ****** ****** *)\n\nimplement\ncleaner_wash (f) =\n{\nval f = fork_get_num (f)\nval () = println! (\"cleaner_wash(\", f, \") starts\")\nval () = randsleep (1)\nval () = println! (\"cleaner_wash(\", f, \") finishes\")\n}\n\n(* ****** ****** *)\n\nimplement\ncleaner_return (f) =\n{\n  val n = fork_get_num (f)\n  val ch = fork_changet (n)\n  val () = channel_insert (ch, f)\n}\n\n(* ****** ****** *)\n\nimplement\ncleaner_loop () = let\n//\nval ch = forktray_changet ()\nval f0 = channel_takeout (ch)\n//\nval () = cleaner_wash (f0)\nval () = cleaner_return (f0)\n//\nin\n  cleaner_loop ()\nend // end of [cleaner_loop]\n\n(* ****** ****** *)\n\ndynload \"DiningPhil2.sats\"\ndynload \"DiningPhil2_fork.dats\"\ndynload \"DiningPhil2_thread.dats\"\n\n(* ****** ****** *)\n\nlocal\n//\nstaload\n\"{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats\"\n//\nin (* in of [local] *)\n//\nval () = mythread_create_cloptr (llam () => phil_loop (0))\nval () = mythread_create_cloptr (llam () => phil_loop (1))\nval () = mythread_create_cloptr (llam () => phil_loop (2))\nval () = mythread_create_cloptr (llam () => phil_loop (3))\nval () = mythread_create_cloptr (llam () => phil_loop (4))\n//\nval () = mythread_create_cloptr (llam () => cleaner_loop ())\n//\nend // end of [local]\n\n(* ****** ****** *)\n\nimplement\nmain0 () =\n{\n//\nval () = println! (\"DiningPhil2: starting\")\nval ((*void*)) = while (true) ignoret (sleep(1))\n//\n} (* end of [main0] *)\n\n(* ****** ****** *)\n\n(* end of [DiningPhil2.dats] *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/ATS/DiningPhil2.sats",
    "content": "(* ****** ****** *)\n//\n// HX-2013-11\n//\n// Implementing a variant of\n// the problem of Dining Philosophers\n//\n(* ****** ****** *)\n\n#include\n\"share/atspre_define.hats\"\n\n(* ****** ****** *)\n\nstaload \"{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats\"\n\n(* ****** ****** *)\n\n%{#\n#define NPHIL 5\n%} // end of [%{#]\n#define NPHIL 5\n\n(* ****** ****** *)\n\ntypedef nphil = natLt(NPHIL)\n\n(* ****** ****** *)\n\nfun phil_left (n: nphil): nphil\nfun phil_right (n: nphil): nphil\n\n(* ****** ****** *)\n//\nfun phil_loop (n: nphil): void\n//\n(* ****** ****** *)\n\nfun cleaner_loop ((*void*)): void\n\n(* ****** ****** *)\n\nabsvtype fork_vtype = ptr\nvtypedef fork = fork_vtype\n\n(* ****** ****** *)\n\nfun fork_get_num (!fork): nphil\n\n(* ****** ****** *)\n\nfun phil_dine\n  (n: nphil, lf: !fork, rf: !fork): void\n// end of [phil_dine]\n\nfun phil_think (n: nphil): void\n\n(* ****** ****** *)\n\nfun cleaner_wash (f: !fork): void\nfun cleaner_return (f: fork): void\n\n(* ****** ****** *)\n//\nfun fork_changet (n: nphil): channel(fork)\n//\nfun forktray_changet ((*void*)): channel(fork)\n//\n(* ****** ****** *)\n\n(* end of [DiningPhil2.sats] *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/ATS/DiningPhil2_fork.dats",
    "content": "(* ****** ****** *)\n//\n// HX-2013-11\n//\n// Implementing a variant of\n// the problem of Dining Philosophers\n//\n(* ****** ****** *)\n//\n#include\n\"share/atspre_define.hats\"\n#include\n\"share/atspre_staload.hats\"\n//\n(* ****** ****** *)\n\nstaload\nUN = \"prelude/SATS/unsafe.sats\"\n\n(* ****** ****** *)\n\nstaload \"{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats\"\n\n(* ****** ****** *)\n\nstaload _ = \"libats/DATS/deqarray.dats\"\nstaload _ = \"{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats\"\n\n(* ****** ****** *)\n\nstaload \"./DiningPhil2.sats\"\n\n(* ****** ****** *)\n\ndatavtype fork = FORK of (nphil)\n\n(* ****** ****** *)\n\nassume fork_vtype = fork\n\n(* ****** ****** *)\n\nimplement\nfork_get_num (f) = let val FORK(n) = f in n end\n\n(* ****** ****** *)\n\nlocal\n\nval\nthe_forkarray = let\n//\ntypedef t = channel(fork)\n//\nimplement\narray_tabulate$fopr<t>\n  (n) = ch where\n{\n  val n = $UN.cast{nphil}(n)\n  val ch = channel_create_exn<fork> (i2sz(2))\n  val () = channel_insert (ch, FORK (n))\n}\n//\nin\n  arrayref_tabulate<t> (i2sz(NPHIL))\nend // end of [val]\n\nin (* in of [local] *)\n\nimplement fork_changet (n) = the_forkarray[n]\n\nend // end of [local]\n\n(* ****** ****** *)\n\nlocal\n\nval the_forktray =\n  channel_create_exn<fork> (i2sz(NPHIL+1))\n\nin (* in of [local] *)\n\nimplement forktray_changet () = the_forktray\n\nend // end of [local]\n\n(* ****** ****** *)\n\n(* end of [DiningPhil2_fork.dats] *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/ATS/DiningPhil2_thread.dats",
    "content": "(* ****** ****** *)\n//\n// HX-2013-11\n//\n// Implementing a variant of\n// the problem of Dining Philosophers\n//\n(* ****** ****** *)\n//\n#include \"share/atspre_define.hats\"\n#include \"share/atspre_staload.hats\"\n//\n(* ****** ****** *)\n\nstaload \"{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats\"\n\n(* ****** ****** *)\n\nlocal\n//\n#include \"{$LIBATSHWXI}/teaching/mythread/DATS/mythread.dats\"\n//\nin (* in of [local] *)\n//\n// HX: it is intentionally left to be empty\n//\nend // end of [local]\n\n(* ****** ****** *)\n\nlocal\n//\n#include \"{$LIBATSHWXI}/teaching/mythread/DATS/mythread_posix.dats\"\n//\nin (* in of [local] *)\n//\n// HX: it is intentionally left to be empty\n//\nend // end of [local]\n\n(* ****** ****** *)\n\n(* end of [DiningPhil2_thread.dats] *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/ATS/YonedaLemma.dats",
    "content": "(* ****** ****** *)\n//\n// HX-2014-01\n// Yoneda Lemma:\n// The hardest \"trivial\" theorem :)\n//\n(* ****** ****** *)\n//\n#include\n\"share/atspre_staload.hats\"\n//\n(* ****** ****** *)\n\nstaload\n\"libats/ML/SATS/basis.sats\"\nstaload\n\"libats/ML/SATS/list0.sats\"\nstaload\n\"libats/ML/SATS/option0.sats\"\n\n(* ****** ****** *)\n\nstaload _ = \"libats/ML/DATS/list0.dats\"\nstaload _ = \"libats/ML/DATS/option0.dats\"\n\n(* ****** ****** *)\n\nsortdef ftype = type -> type\n\n(* ****** ****** *)\n\ninfixr (->) ->>\ntypedef ->> (a:type, b:type) = a -<cloref1> b\n\n(* ****** ****** *)\n\ntypedef\nfunctor(F:ftype) =\n  {a,b:type} (a ->> b) ->> F(a) ->> F(b)\n\n(* ****** ****** *)\n\ntypedef\nlist0 (a:type) = list0 (a)\nextern\nval functor_list0 : functor (list0)\n\n(* ****** ****** *)\n\nimplement\nfunctor_list0{a,b}\n  (f) = lam xs => list0_map<a><b> (xs, f)\n\n(* ****** ****** *)\n\ntypedef\noption0 (a:type) = option0 (a)  \nextern\nval functor_option0 : functor (option0)\n  \n(* ****** ****** *)\n\nimplement\nfunctor_option0{a,b}\n  (f) = lam opt => option0_map<a><b> (opt, f)\n\n(* ****** ****** *)\n\nextern\nval functor_homres\n  : {c:type} functor (lam(r:type) => c ->> r)\n\n(* ****** ****** *)\n\nimplement\nfunctor_homres{c}{a,b} (f) = lam (r) => lam (x) => f (r(x))\n\n(* ****** ****** *)\n//\nextern\nfun Yoneda_phi : {F:ftype}functor(F) ->\n  {a:type}F(a) ->> ({r:type}(a ->> r) ->> F(r))\nextern\nfun Yoneda_psi : {F:ftype}functor(F) ->\n  {a:type}({r:type}(a ->> r) ->> F(r)) ->> F(a)\n//\n(* ****** ****** *)\n//\nimplement\nYoneda_phi\n  (ftor) = lam(fx) => lam (m) => ftor(m)(fx)\n//\nimplement\nYoneda_psi (ftor) = lam(mf) => mf(lam x => x)\n//\n(* ****** ****** *)\n\n(*\n\n(* ****** ****** *)\n//\n// HX-2014-01-05:\n// Another version based on Natural Transformation\n//\n(* ****** ****** *)\n\ntypedef\nnatrans(F:ftype, G:ftype) = {x:type} (F(x) ->> G(x))\n\n(* ****** ****** *)\n//\nextern\nfun Yoneda_phi_nat : {F:ftype}functor(F) ->\n  {a:type} F(a) ->> natrans(lam (r:type) => (a ->> r), F)\nextern\nfun Yoneda_psi_nat : {F:ftype}functor(F) ->\n  {a:type} natrans(lam (r:type) => (a ->> r), F) ->> F(a)\n//\n(* ****** ****** *)\n//\nimplement\nYoneda_phi_nat\n  (ftor) = lam(fx) => lam (m) => ftor(m)(fx)\n//\nimplement\nYoneda_psi_nat (ftor) = lam(mf) => mf(lam x => x)\n//\n(* ****** ****** *)\n\n*)\n\n(* ****** ****** *)\n\ndatatype bool = True | False // boxed boolean\n\n(* ****** ****** *)\n//\nfun bool2string\n  (x:bool): string =\n(\n  case+ x of True() => \"True\" | False() => \"False\"\n)\n//\nimplement\nfprint_val<bool> (out, x) = fprint (out, bool2string(x))\n//\n(* ****** ****** *)\n//\nval myboolist0 =\n  $list_t{bool}(True, False, True, False, False)\nval myboolist0 = g0ofg1_list (myboolist0)\n//\n(* ****** ****** *)\n//\nextern\nval Yoneda_bool_list0 : {r:type} (bool ->> r) ->> list0(r)\n//\nimplement\nYoneda_bool_list0 =\n  Yoneda_phi(functor_list0){bool}(myboolist0)\n//\n(* ****** ****** *)\n//\nval myboolist1 =\n  Yoneda_psi(functor_list0){bool}(Yoneda_bool_list0)\n//\n(* ****** ****** *)\n\nval () = fprintln! (stdout_ref, \"myboolist0 = \", myboolist0)\nval () = fprintln! (stdout_ref, \"myboolist1 = \", myboolist1)\n\n(* ****** ****** *)\n\nimplement main0 () = ()\n\n(* ****** ****** *)\n\n(* end of [YonedaLemma.dats] *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/ATS/basis_ssntype.sats",
    "content": "(*\n* The MIT License (MIT)\n*\n* Copyright (c) 2014 Hongwei Xi\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.)\n*)\n\n// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/201d635062d0ea64ff5ba5457a4ea0bb4d5ae202/contrib/libats-/hwxi/teaching/mysession-g/SATS/basis_ssntype.sats\n\n(*\n** Basis for g-session types\n*)\n\n(* ****** ****** *)\n//\nstaload\n\"./basis_intset.sats\"\n//\n(* ****** ****** *)\n//\nfun{}\nchannel_cap(): intGte(1)  \n//\n(* ****** ****** *)\n//\nabstype\nsession_msg\n  (i:int, j:int, a:vt@ype)\n//\n(* ****** ****** *)\n\nabstype ssession_nil\nabstype ssession_cons(a:type, ssn:type)\n\n(* ****** ****** *)\n//\nstadef msg = session_msg\n//\nstadef nil = ssession_nil\n//\nstadef :: = ssession_cons\nstadef cons = ssession_cons\n//\n(* ****** ****** *)\n//\nabstype\nsession_append\n  (ssn1: type, ssn2: type)\n//\nstadef append = session_append\n//\n(* ****** ****** *)\n//\nabstype\nsession_choose\n(\n  i:int, ssn1:type, ssn2:type\n) (* session_choose *)\n//\nstadef choose = session_choose\n//\n(* ****** ****** *)\n//\nabstype\nsession_repeat\n(\n  i:int, ssn:type(*body*)\n) (* session_repeat *)\n//\nstadef repeat = session_repeat\n//\n(* ****** ****** *)\n//\ntypedef\nsession_sing\n(\n  i: int\n, j: int\n, a:vt@ype\n) = cons(msg(i, j, a), nil)\n//\n(* ****** ****** *)\n//\nabsvtype\nchannel1_vtype\n  (G:iset, n:int, ssn:type) = ptr\n//\nvtypedef\nchannel1\n  (G:iset, n:int, ssn:type) = channel1_vtype(G, n, ssn)\n//\nvtypedef\ncchannel1\n  (G:iset, n:int, ssn:type) = channel1_vtype(ncomp(n, G), n, ssn)\n//\n(* ****** ****** *)\n//\nfun{}\nchannel1_get_nrole\n  {n:int}{ssn:type}{G:iset}\n  (chan: !channel1(G, n, ssn)): int(n)\n//\nfun{}\nchannel1_get_group\n  {n:int}{ssn:type}{G:iset}\n  (chan: !channel1(G, n, ssn)): intset(n,G)\n//\n(* ****** ****** *)\n//\nfun\n{a:vt0p}\nchannel1_close\n  {n:int}{ssn:type}{G:iset}(chan: channel1(G, n, nil)): void\n//\n(* ****** ****** *)\n//\nfun{}\nchannel1_skipin\n  {a:vt0p}\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | ismbr(G, i); ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)\n) : void // end-of-function\npraxi\nlemma_channel1_skipin\n  {a:vt0p}\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | ismbr(G, i); ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)\n) : void // lemma_channel1_skipin\n//\nfun{}\nchannel1_skipex\n  {a:vt0p}\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | ~ismbr(G, i); ~ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)\n) : void // end-of-function\npraxi\nlemma_channel1_skipex\n  {a:vt0p}\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | ~ismbr(G, i); ~ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)\n) : void // lemma_channel1_skipex\n//\n(* ****** ****** *)\n//\nfun\n{a:vt0p}\nchannel1_send\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | i < n; j < n; ismbr(G, i); ~ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j), a\n) : void // end of [channel1_send]\n//\nfun\n{a:vt0p}\nchannel1_recv\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | i < n; j < n; ~ismbr(G, i); ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j), &a? >> a\n) : void // end of [channel1_recv]\n//\nfun\n{a:vt0p}\nchannel1_recv_val\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | i < n; j < n; ~ismbr(G, i); ismbr(G, j)}\n  (!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j)): (a)\n//\n(* ****** ****** *)\n\nfun{}\nchannel1_append\n  {n:int}\n  {ssn1,ssn2:type}\n  {G:iset}\n(\n  chan: !channel1(G, n, append(ssn1, ssn2)) >> channel1(G, n, ssn2)\n, fserv: (!channel1(G, n, ssn1) >> channel1(G, n, nil)) -<lincloptr1> void\n) : void // end of [channel1_append]\n\n(* ****** ****** *)\n//\ndatatype\nchoosetag\n(\n  a:type, b:type, c:type\n) =\n  | choosetag_l(a, b, a) of ()\n  | choosetag_r(a, b, b) of ()\n//\n(* ****** ****** *)\n//\nfun{}\nchannel1_choose_l\n  {n:int}\n  {ssn1,ssn2:type}\n  {G:iset}\n  {i:nat | i < n; ismbr(G, i)}\n(\n  !channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn1), i: int(i)\n) : void // end of [channel1_choose_l]\n//\nfun{}\nchannel1_choose_r\n  {n:int}\n  {ssn1,ssn2:type}\n  {G:iset}\n  {i:nat | i < n; ismbr(G, i)}\n(\n  !channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn2), i: int(i)\n) : void // end of [channel1_choose_r]\n//\nfun{}\nchannel1_choose_tag\n  {n:int}\n  {ssn1,ssn2:type}\n  {G:iset}\n  {i:nat | i < n; ~isnil(G); ~ismbr(G, i)}\n(\n  !channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn_chosen), i: int(i)\n) : #[ssn_chosen:type] choosetag(ssn1, ssn2, ssn_chosen)\n//\n(* ****** ****** *)\n//\nfun{}\nchannel1_repeat_0\n  {n:int}\n  {ssn:type}\n  {G:iset}\n  {i:nat | i < n; ismbr(G, i)}\n(\n  !channel1(G, n, repeat(i,ssn)) >> channel1(G, n, nil), i: int(i)\n) : void // end of [channel1_repeat_nil]\n//\nfun{}\nchannel1_repeat_1\n  {n:int}\n  {ssn:type}\n  {G:iset}\n  {i:nat | i < n; ismbr(G, i)}\n(\n  !channel1(G, n, repeat(i,ssn)) >> channel1(G, n, append(ssn,repeat(i,ssn))), i: int(i)\n) : void // end of [channel1_repeat_more]\n//\nfun{}\nchannel1_repeat_tag\n  {n:int}\n  {ssn:type}\n  {G:iset}\n  {i:nat | i < n; ~isnil(G); ~ismbr(G, i)}\n(\n  !channel1(G, n, repeat(i,ssn)) >> channel1(G, n, ssn_chosen), i: int(i)\n) : #[ssn_chosen:type] choosetag(nil, append(ssn,repeat(i,ssn)), ssn_chosen)\n//\n(* ****** ****** *)\n//\n(*\n//\n// HX-2015-03-06:\n// This one does not work with sschoose!!!\n//\nfun{}\nchannel1_link\n  {n:int}{ssn:type}\n  {G1,G2:iset | isnil(G1*G2)}\n  (channel1(G1, n, ssn), channel1(G2, n, ssn)): channel1(G1+G2, n, ssn)\n*)\n//\nfun{}\nchannel1_link\n  {n:int}{ssn:type}\n  {G1,G2:iset | isful(G1+G2,n)}\n  (channel1(G1, n, ssn), channel1(G2, n, ssn)): channel1(G1*G2, n, ssn)\n//\n(* ****** ****** *)\n//\nfun{}\nchannel1_link_elim\n  {n:int}{ssn:type}{G:iset}(channel1(G, n, ssn), cchannel1(G, n, ssn)): void\n//\n(* ****** ****** *)\n//\nfun{}\ncchannel1_create_exn\n  {n:nat}{ssn:type}{G:iset}\n(\n  nrole: int(n), G: intset(n), fserv: channel1(G, n, ssn) -<lincloptr1> void\n) : cchannel1(G, n, ssn) // end of [cchannel1_create_exn]\n//\n(* ****** ****** *)\n\n(* end of [basis_ssntype.sats] *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/ATS/csv_parse.hats",
    "content": "(*\n* The MIT License (MIT)\n*\n* Copyright (c) 2014 Hongwei Xi\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.)\n*)\n\n// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/0f26aa0df8542d2ae21df9be1e13208f66f571d6/contrib/libats-/hwxi/teaching/mygrading/HATS/csv_parse.hats\n\n(* ****** ****** *)\n//\n// Author: Hongwei Xi\n// Authoremail: gmhwxiATgmailDOTcom\n// Start time: the first of July, 2016\n//\n(* ****** ****** *)\n//\n#ifdef\nMYGRADING_HATS\n#then\n#else\n//\nextern\nfun\ncsv_parse_line\n(\n  line: string\n) : List0_vt(Strptr1)\n//\n#endif // #ifdef\n//\n(* ****** ****** *)\n\nlocal\n//\nstaload\nUN = \"prelude/SATS/unsafe.sats\"\n//\nextern\nfun{}\ngetpos(): int\n//\nextern\nfun{}\nis_end(): bool\n//\nextern\nfun{}\nchar_at(): int\n//\nextern\nfun{}\nStrptr1_at(i0: int): Strptr1\n//\nextern\nfun{}\nrmove(): void\nextern\nfun{}\nrmove_while(test: char -<cloref1> bool): void\n//\nin (* in-of-local *)\n//\nimplement\n{}(*tmp*)\nrmove_while\n  (test) = let\n//\nval c0 = char_at()\n//\nin\n//\nif c0 >= 0 then\n  if test(int2char0(c0)) then (rmove(); rmove_while(test)) else ()\n// end of [if]\n//\nend // end of [rmove_while]\n\n(* ****** ****** *)\n\nimplement\ncsv_parse_line\n  (line) = let\n//\nval line = g1ofg0(line)\n//\nvar i: int = 0\nval p_i = addr@i\n//\nval n0 = sz2i(length(line))\n//\nmacdef get_i() = $UN.ptr0_get<int>(p_i)\nmacdef inc_i() = $UN.ptr0_addby<int>(p_i, 1)\nmacdef set_i(i0) = $UN.ptr0_set<int>(p_i, ,(i0))\n//\nimplement\ngetpos<>() = get_i()\n//\nimplement\nis_end<>() = get_i() >= n0\n//\nimplement\nchar_at<>() = let\n  val i = get_i()\n  val i = ckastloc_gintGte(i, 0)\n//\nin\n  if i < n0 then char2u2int0(line[i]) else ~1\nend // end of [char_at]\n//\nimplement\nStrptr1_at<>(i0) = let\n//\n  val i1 = get_i()\n  val i0 = ckastloc_gintGte(i0, 0)\n  val i1 = ckastloc_gintBtwe(i1, i0, n0)\n//\nin\n  $UN.castvwtp0(\n    string_make_substring(line, i2sz(i0), i2sz(i1-i0))\n  ) (* $UN.castvwtp0 *)\nend // end of [Strptr1_at]\n//\nimplement\nrmove<>() =\n  if get_i() < n0 then inc_i()\n//\nvtypedef res_vt = List0_vt(Strptr1)\n//\nfun\nloop\n(\n  i: int, res: res_vt\n) : res_vt =\nif\nis_end()\nthen res\nelse let\n  val () =\n  (\n    if i > 0 then rmove()\n  )\n  val i0 = getpos()\n  var f0 =\n  (\n    lam@(c: char) =<clo> c != ','\n  )\n  val () = rmove_while($UN.cast(addr@f0))\n  val s0 = Strptr1_at(i0)\nin\n  loop(i+1, list_vt_cons(s0, res))\nend // end of [else]\n//\nin\n  list_vt_reverse(loop(0(*i*), list_vt_nil((*void*))))\nend // end of [csv_parse_line]\n\nend // end of [local]\n\n(* ****** ****** *)\n\n(* end of [csv_parse.hats] *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/ATS/intinf_vt.dats",
    "content": "(***********************************************************************)\n(*                                                                     *)\n(*                         ATS/contrib/atshwxi                         *)\n(*                                                                     *)\n(***********************************************************************)\n\n(*\n** Copyright (C) 2013 Hongwei Xi, ATS Trustful Software, Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and associated documentation files (the \"Software\"),\n** to deal in the Software without restriction, including without limitation\n** the rights to use, copy, modify, merge, publish, distribute, sublicense,\n** and/or sell copies of the Software, and to permit persons to whom the\n** Software is furnished to do so, subject to the following stated conditions:\n** \n** The above copyright notice and this permission notice shall be included in\n** all copies or substantial portions of the Software.\n** \n** THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n** FROM OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n** IN THE SOFTWARE.\n*)\n\n// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/04a984d9c08c1831f7dda8a05ce356db01f81850/contrib/libats-/hwxi/intinf/DATS/intinf_vt.dats\n\n(* ****** ****** *)\n//\n// Author: Hongwei Xi\n// Authoremail: hwxi AT gmail DOT com\n// Start Time: April, 2013\n//\n(* ****** ****** *)\n\n#include\n\"share/atspre_define.hats\"\n\n(* ****** ****** *)\n\nstaload\nUN = \"prelude/SATS/unsafe.sats\"\n\n(* ****** ****** *)\n\nstaload\nGMP = \"{$LIBGMP}/SATS/gmp.sats\"\n\n(* ****** ****** *)\n\nvtypedef mpz = $GMP.mpz_vt0ype\n\n(* ****** ****** *)\n//\nstaload \"./../SATS/intinf.sats\"\nstaload \"./../SATS/intinf_vt.sats\"\n//\n(* ****** ****** *)\n\nmacdef i2u (x) = g1int2uint_int_uint (,(x))\n\n(* ****** ****** *)\n\nlocal\n\nassume\nintinf_vtype\n  (i: int) = // HX: [i] is a fake\n  [l:addr] (mpz @ l, mfree_gc_v (l) | ptr l)\n// end of [intinf_vtype]\n\nin (* in of [local] *)\n\nimplement{}\nintinf_make_int\n  (i) = (x) where\n{\n//\nval x = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init_set_int (!(x.2), i)\n//\n} (* end of [intinf_make_int] *)\n\nimplement{}\nintinf_make_uint\n  (i) = (x) where\n{\n//\nval x = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init_set_uint (!(x.2), i)\n//\n} (* end of [intinf_make_uint] *)\n\nimplement{}\nintinf_make_lint\n  (i) = (x) where\n{\n//\nval x = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init_set_lint (!(x.2), i)\n//\n} (* end of [intinf_make_lint] *)\n\nimplement{}\nintinf_make_ulint\n  (i) = (x) where\n{\n//\nval x = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init_set_ulint (!(x.2), i)\n//\n} (* end of [intinf_make_ulint] *)\n\n(* ****** ****** *)\n\nimplement{}\nintinf_free (x) = let\n  val (pfat, pfgc | p) = x\n  val () = $GMP.mpz_clear (!p) in ptr_free (pfgc, pfat | p)\nend (* end of [intinf_free] *)\n\n(* ****** ****** *)\n\nimplement{}\nintinf_get_int (x) = $GMP.mpz_get_int (!(x.2))\nimplement{}\nintinf_get_lint (x) = $GMP.mpz_get_lint (!(x.2))\n\n(* ****** ****** *)\n\nimplement{}\nintinf_get_strptr\n  (x, base) = $GMP.mpz_get_str_null (base, !(x.2))\n// end of [intinf_get_strptr]\n\n(* ****** ****** *)\n\nimplement{}\nfprint_intinf_base\n  (out, x, base) = let\n  val nsz = $GMP.mpz_out_str (out, base, !(x.2))\nin\n//\nif (nsz = 0) then\n  exit_errmsg (1, \"libgmp/gmp: fprint_intinf_base\")\n// end of [if]\n//\nend (* fprint_intinf_base *)\n\n(* ****** ****** *)\n\nimplement{\n} neg_intinf0\n  (x) = (x) where\n{\n//\nval () = $GMP.mpz_neg (!(x.2))\n//\n} (* end of [neg_intinf0] *)\n\nimplement{\n} neg_intinf1\n  (x) = (y) where\n{\n//\nval y = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(y.2))\nval () = $GMP.mpz_neg (!(y.2), !(x.2))\n//\n} (* end of [neg_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{\n} abs_intinf0\n  (x) = (x) where\n{\n//\nval () = $GMP.mpz_abs (!(x.2))\n//\n} (* end of [abs_intinf0] *)\n\nimplement{\n} abs_intinf1\n  (x) = (y) where\n{\n//\nval y = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(y.2))\nval () = $GMP.mpz_abs (!(y.2), !(x.2))\n//\n} (* end of [abs_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nsucc_intinf0 (x) = add_intinf0_int (x, 1)\nimplement{}\nsucc_intinf1 (x) = add_intinf1_int (x, 1)\n\n(* ****** ****** *)\n\nimplement{}\npred_intinf0 (x) = sub_intinf0_int (x, 1)\nimplement{}\npred_intinf1 (x) = sub_intinf1_int (x, 1)\n\n(* ****** ****** *)\n\nimplement{}\nadd_intinf0_int\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_add2_int (!(x.2), y)\n//\n} (* end of [add_intinf0_int] *)\n\nimplement{}\nadd_intinf1_int\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_add3_int (!(z.2), !(x.2), y)\n//\n} (* end of [add_intinf1_int] *)\n\n(* ****** ****** *)\n\nimplement{}\nadd_int_intinf0 (x, y) = add_intinf0_int (y, x)\nimplement{}\nadd_int_intinf1 (x, y) = add_intinf1_int (y, x)\n\n(* ****** ****** *)\n\nimplement{}\nadd_intinf0_intinf1\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_add2_mpz (!(x.2), !(y.2))\n//\n} (* end of [add_intinf0_intinf1] *)\n\nimplement{}\nadd_intinf1_intinf0\n  (x, y) = (y) where\n{\n//\nval () = $GMP.mpz_add2_mpz (!(y.2), !(x.2))\n//\n} (* end of [add_intinf1_intinf0] *)\n\n(* ****** ****** *)\n\nimplement{}\nadd_intinf1_intinf1\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_add3_mpz (!(z.2), !(x.2), !(y.2))\n//\n} (* end of [add_intinf1_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nsub_intinf0_int\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_sub2_int (!(x.2), y)\n//\n} (* end of [sub_intinf0_int] *)\n\nimplement{}\nsub_intinf1_int\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_sub3_int (!(z.2), !(x.2), y)\n//\n} (* end of [sub_intinf1_int] *)\n\n(* ****** ****** *)\n\nimplement{}\nsub_int_intinf0 (x, y) = let\n  val z = sub_intinf0_int (y, x) in neg_intinf0 (z)\nend (* end of [sub_int_intinf0] *)\n\nimplement{}\nsub_int_intinf1 (x, y) = let\n  val z = sub_intinf1_int (y, x) in neg_intinf0 (z)\nend (* end of [sub_int_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nsub_intinf0_intinf1\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_sub2_mpz (!(x.2), !(y.2))\n//\n} (* end of [sub_intinf0_intinf1] *)\n\nimplement{}\nsub_intinf1_intinf0\n  (x, y) = neg_intinf0 (sub_intinf0_intinf1 (y, x))\n// end of [sub_intinf1_intinf0]\n\nimplement{}\nsub_intinf1_intinf1\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_sub3_mpz (!(z.2), !(x.2), !(y.2))\n//\n} (* end of [sub_intinf1_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nmul_intinf0_int\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_mul2_int (!(x.2), y)\n//\n} (* end of [mul_intinf0_int] *)\n\nimplement{}\nmul_intinf1_int\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_mul3_int (!(z.2), !(x.2), y)\n//\n} (* end of [mul_intinf1_int] *)\n\n(* ****** ****** *)\n\nimplement{}\nmul_int_intinf0 (x, y) = mul_intinf0_int (y, x)\nimplement{}\nmul_int_intinf1 (x, y) = mul_intinf1_int (y, x)\n\n(* ****** ****** *)\n\nimplement{}\nmul_intinf0_intinf1\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_mul2_mpz (!(x.2), !(y.2))\n//\n} (* end of [mul_intinf0_intinf1] *)\n\nimplement{}\nmul_intinf1_intinf0\n  (x, y) = (y) where\n{\n//\nval () = $GMP.mpz_mul2_mpz (!(y.2), !(x.2))\n//\n} (* end of [mul_intinf0_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nmul_intinf1_intinf1\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_mul3_mpz (!(z.2), !(x.2), !(y.2))\n//\n} (* end of [mul_intinf1_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\ndiv_intinf0_int\n  {i,j} (x, y) = let\nin\n//\nif y >= 0 then let\n  val () = $GMP.mpz_tdiv2_q_uint (!(x.2), i2u(y)) in x\nend else let\n  val () = $GMP.mpz_tdiv2_q_uint (!(x.2), i2u(~y)) in neg_intinf0 (x)\nend // end of [if]\n//\nend (* end of [div_intinf0_int] *)\n\nimplement{}\ndiv_intinf1_int\n  {i,j} (x, y) = let\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\n//\nin\n//\nif y >= 0 then let\n  val () = $GMP.mpz_tdiv3_q_uint (!(z.2), !(x.2), i2u(y)) in z\nend else let\n  val () = $GMP.mpz_tdiv3_q_uint (!(z.2), !(x.2), i2u(~y)) in neg_intinf0 (z)\nend // end of [if]\n//\nend (* end of [div_intinf1_int] *)\n\n(* ****** ****** *)\n\nimplement{}\ndiv_intinf0_intinf1\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_tdiv2_q_mpz (!(x.2), !(y.2))\n//\n} (* end of [div_intinf0_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\ndiv_intinf1_intinf1\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_tdiv3_q_mpz (!(z.2), !(x.2), !(y.2))\n//\n} (* end of [div_intinf1_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nndiv_intinf0_int (x, y) = div_intinf0_int (x, y)\nimplement{}\nndiv_intinf1_int (x, y) = div_intinf1_int (x, y)\n\n(* ****** ****** *)\n\nimplement{}\nnmod_intinf0_int\n  {i,j} (x, y) = let\n//\nval r =\n  $GMP.mpz_fdiv_uint (!(x.2), i2u(y))\nval () = intinf_free (x)\n//\nin\n  $UN.cast{intBtw(0,j)}(r)\nend (* end of [nmod_intinf0_int] *)\n\nimplement{}\nnmod_intinf1_int\n  {i,j} (x, y) = let\n//\nval r = $GMP.mpz_fdiv_uint (!(x.2), i2u(y))\n//\nin\n  $UN.cast{intBtw(0,j)}(r)\nend (* end of [nmod_intinf1_int] *)\n\n(* ****** ****** *)\n//\n// comparison-functions\n//\n(* ****** ****** *)\n\nimplement{}\nlt_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn < 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i < j)}(sgn)\nend // end of [lt_intinf_int]\n\nimplement{}\nlt_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn < 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i < j)}(sgn)\nend // end of [lt_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\nlte_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn <= 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i <= j)}(sgn)\nend // end of [lte_intinf_int]\n\nimplement{}\nlte_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn <= 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i <= j)}(sgn)\nend // end of [lte_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\ngt_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn > 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i > j)}(sgn)\nend // end of [gt_intinf_int]\n\nimplement{}\ngt_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn > 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i > j)}(sgn)\nend // end of [gt_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\ngte_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn >= 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i >= j)}(sgn)\nend // end of [gte_intinf_int]\n\nimplement{}\ngte_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn >= 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i >= j)}(sgn)\nend // end of [gte_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\neq_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn = 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i == j)}(sgn)\nend // end of [eq_intinf_int]\n\nimplement{}\neq_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn = 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i == j)}(sgn)\nend // end of [eq_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\nneq_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn != 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i != j)}(sgn)\nend // end of [neq_intinf_int]\n\nimplement{}\nneq_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn != 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i != j)}(sgn)\nend // end of [neq_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\ncompare_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval sgn = (if sgn < 0 then ~1 else (if sgn > 0 then 1 else 0)): int\n//\nin\n  $UN.cast{int(sgn(i-j))}(sgn)\nend // end of [compare_intinf_int]\n\nimplement{}\ncompare_int_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(y.2), x)\nval sgn = (if sgn > 0 then ~1 else (if sgn < 0 then 1 else 0)): int\n//\nin\n  $UN.cast{int(sgn(i-j))}(sgn)\nend // end of [compare_int_intinf]\n\nimplement{}\ncompare_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval sgn = (if sgn < 0 then ~1 else (if sgn > 0 then 1 else 0)): int\n//\nin\n  $UN.cast{int(sgn(i-j))}(sgn)\nend // end of [compare_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\npow_intinf_int\n  (base, exp) = r where\n{\n//\nval r = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(r.2))\nval () = $GMP.mpz_pow_uint (!(r.2), !(base.2), i2u(exp))\n//\n} (* end of [pow_intinf_int] *)\n\n(* ****** ****** *)\n\nend // end of [local]\n\n(* ****** ****** *)\n\nimplement{}\nprint_intinf (x) = fprint_intinf (stdout_ref, x)\nimplement{}\nprerr_intinf (x) = fprint_intinf (stderr_ref, x)\nimplement{}\nfprint_intinf (out, x) = fprint_intinf_base (out, x, 10(*base*))\n\n(* ****** ****** *)\n\n(* end of [intinf_vt.dats] *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/ActionScript/FooBar.as",
    "content": "// A sample for Actionscript.\n\npackage foobar\n{\n\timport flash.display.MovieClip;\n\n\tclass Bar\n\t{\n\t\tpublic function getNumber():Number\n\t\t{\n\t\t\treturn 10;\n\t\t}\n\t}\n\n\tclass Foo extends Bar\n\t{\n\t\tprivate var ourNumber:Number = 25;\n\n\t\toverride public function getNumber():Number\n\t\t{\n\t\t\treturn ourNumber;\n\t\t}\n\t}\n\n\tclass Main extends MovieClip\n\t{\n\t\tpublic function Main()\n\t\t{\n\t\t\tvar x:Bar = new Bar();\n\t\t\tvar y:Foo = new Foo();\n\t\t\ttrace(x.getNumber());\n\t\t\ttrace(y.getNumber());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/ActionScript/HelloWorld.as",
    "content": "package mypackage\n{\n\tpublic class Hello\n\t{\n\t\t/* Let's say hello!\n\t\t * This is just a test script for Linguist's Actionscript detection.\n\t\t */\n\t\tpublic function sayHello():void\n\t\t{\n\t\t\ttrace(\"Hello, world\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Adobe Font Metrics/OpenSansCondensed-Bold.afm",
    "content": "StartFontMetrics 2.0\nComment Generated by FontForge 20170719\nComment Creation Date: Sun Jul 23 19:47:25 2017\nFontName OpenSansCondensed-Bold\nFullName Open Sans Condensed Bold\nFamilyName Open Sans Condensed\nWeight Bold\nNotice (Digitized data copyright (c) 2010-2011, Google Corporation.)\nItalicAngle 0\nIsFixedPitch false\nUnderlinePosition -205\nUnderlineThickness 102\nVersion 1.11\nEncodingScheme ISO10646-1\nFontBBox -667 -290 1046 1062\nCapHeight 714\nXHeight 544\nAscender 760\nDescender -240\nStartCharMetrics 939\nC 32 ; WX 247 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 270 ; N exclam ; B 54 -14 216 714 ;\nC 34 ; WX 445 ; N quotedbl ; B 59 456 388 714 ;\nC 35 ; WX 543 ; N numbersign ; B 20 0 525 714 ;\nC 36 ; WX 462 ; N dollar ; B 36 -59 427 760 ;\nC 37 ; WX 758 ; N percent ; B 30 -9 729 725 ;\nC 38 ; WX 581 ; N ampersand ; B 28 -10 572 725 ;\nC 39 ; WX 246 ; N quotesingle ; B 59 456 188 714 ;\nC -1 ; WX 462 ; N six.os ; B 36 -10 427 724 ;\nC -1 ; WX 420 ; N seven.os ; B 19 -170 402 544 ;\nC -1 ; WX 462 ; N eight.os ; B 35 -10 429 724 ;\nC -1 ; WX 461 ; N nine.os ; B 33 -182 424 564 ;\nC -1 ; WX 496 ; N g.alt ; B 36 -241 442 555 ;\nC -1 ; WX 496 ; N gcircumflex.alt ; B 36 -241 442 767 ;\nC -1 ; WX 496 ; N gbreve.alt ; B 36 -241 442 766 ;\nC -1 ; WX 496 ; N gdot.alt ; B 36 -241 442 756 ;\nC -1 ; WX 496 ; N gcommaaccent.alt ; B 36 -241 442 767 ;\nC -1 ; WX 0 ; N cyrotmarkcomb ; B -203 591 203 714 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 15878\nKPX quotedbl uni1ECA 20\nKPX quotedbl uni1EC8 20\nKPX quotedbl Idotaccent 20\nKPX quotedbl Iogonek 20\nKPX quotedbl Imacron 20\nKPX quotedbl Idieresis 20\nKPX quotedbl Icircumflex 20\nKPX quotedbl Iacute 20\nKPX quotedbl Igrave 20\nKPX quotedbl I 20\nKPX quotedbl uni1EF9 20\nKPX quoteleft q -20\nKPX quoteleft o -20\nKPX quoteleft g -9\nKPX quoteleft e -20\nKPX quoteleft d -20\nKPX quoteleft c -20\nKPX quoteleft Z 20\nKPX Delta C -9\nKPX Delta A -20\nKPX Delta question 20\nKPX Delta period -41\nKPX Delta comma -41\nKPX Delta quotesingle 41\nKPX Delta quotedbl 41\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "src/test/resources/samples/langs/Adobe Font Metrics/SpecialElite.afm",
    "content": "StartFontMetrics 2.0\nComment Generated by FontForge 20170719\nComment Creation Date: Sun Jul 23 19:52:19 2017\nFontName SpecialElite-Regular\nFullName Special Elite\nFamilyName Special Elite\nWeight Book\nNotice (Copyright (c) 2010 by Brian J. Bonislawsky DBA Astigmatic (AOETI). All rights reserved. Available under the Apache 2.0 licence.http://www.apache.org/licenses/LICENSE-2.0.html)\nItalicAngle 0\nIsFixedPitch false\nUnderlinePosition -133\nUnderlineThickness 20\nVersion 1.000\nEncodingScheme ISO10646-1\nFontBBox -33 -322 1052 959\nCapHeight 714\nXHeight 487\nAscender 688\nDescender -225\nStartCharMetrics 371\nC 32 ; WX 292 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 276 ; N exclam ; B 73 0 207 702 ;\nC 34 ; WX 352 ; N quotedbl ; B 48 449 295 704 ;\nC 35 ; WX 554 ; N numbersign ; B 31 -2 524 713 ;\nC 36 ; WX 526 ; N dollar ; B 31 -201 498 919 ;\nC 37 ; WX 666 ; N percent ; B 32 -186 642 872 ;\nC 38 ; WX 676 ; N ampersand ; B 31 -5 645 705 ;\nC 39 ; WX 196 ; N quotesingle ; B 48 449 143 703 ;\nC 40 ; WX 279 ; N parenleft ; B 55 -71 243 757 ;\nC 41 ; WX 281 ; N parenright ; B 37 -59 229 770 ;\nC 42 ; WX 522 ; N asterisk ; B 32 276 493 707 ;\nC 43 ; WX 496 ; N plus ; B 29 131 465 560 ;\nC 44 ; WX 336 ; N comma ; B 39 -197 290 251 ;\nC 45 ; WX 636 ; N hyphen ; B 63 273 573 397 ;\nC 46 ; WX 349 ; N period ; B 52 -3 298 245 ;\nC 47 ; WX 557 ; N slash ; B 23 -41 536 760 ;\nC 48 ; WX 610 ; N zero ; B 55 0 560 720 ;\nC 49 ; WX 569 ; N one ; B 27 -12 572 712 ;\nC 50 ; WX 573 ; N two ; B 50 -25 541 680 ;\nC 51 ; WX 557 ; N three ; B 44 -25 514 694 ;\nC 52 ; WX 612 ; N four ; B 15 4 584 708 ;\nC 53 ; WX 537 ; N five ; B 47 0 505 690 ;\nC 54 ; WX 588 ; N six ; B 48 -10 548 707 ;\nC 55 ; WX 555 ; N seven ; B 15 -34 549 734 ;\nC 56 ; WX 598 ; N eight ; B 51 1 551 720 ;\nC 57 ; WX 584 ; N nine ; B 48 -2 539 715 ;\nC 58 ; WX 343 ; N colon ; B 51 -3 297 518 ;\nC 59 ; WX 328 ; N semicolon ; B 45 -197 297 518 ;\nC 60 ; WX 463 ; N less ; B 31 120 401 565 ;\nC 61 ; WX 636 ; N equal ; B 63 186 573 513 ;\nC 62 ; WX 463 ; N greater ; B 62 120 433 565 ;\nC 63 ; WX 470 ; N question ; B 34 2 442 729 ;\nC 64 ; WX 665 ; N at ; B 46 -4 618 680 ;\nC 65 ; WX 549 ; N A ; B -1 -16 550 703 ;\nC 66 ; WX 604 ; N B ; B 29 -6 557 704 ;\nC 67 ; WX 579 ; N C ; B 46 -13 531 700 ;\nC 68 ; WX 622 ; N D ; B 36 -17 579 713 ;\nC 69 ; WX 638 ; N E ; B 38 -16 587 691 ;\nC 70 ; WX 605 ; N F ; B 29 -9 595 709 ;\nC 71 ; WX 615 ; N G ; B 45 -3 586 710 ;\nC 72 ; WX 652 ; N H ; B 40 -20 622 690 ;\nC 73 ; WX 495 ; N I ; B 26 -24 469 710 ;\nC 74 ; WX 541 ; N J ; B 16 -3 539 703 ;\nC 75 ; WX 582 ; N K ; B 28 -5 584 711 ;\nC 76 ; WX 602 ; N L ; B 23 -14 583 718 ;\nC 77 ; WX 697 ; N M ; B 46 -10 655 704 ;\nC 78 ; WX 627 ; N N ; B 41 -15 595 700 ;\nC 79 ; WX 616 ; N O ; B 42 -30 574 702 ;\nC 80 ; WX 553 ; N P ; B 30 -12 527 689 ;\nC 81 ; WX 602 ; N Q ; B 42 -98 571 711 ;\nC 82 ; WX 636 ; N R ; B 14 -9 624 706 ;\nC 83 ; WX 588 ; N S ; B 51 -13 547 690 ;\nC 84 ; WX 594 ; N T ; B 25 1 564 707 ;\nC 85 ; WX 621 ; N U ; B 24 -6 611 710 ;\nC 86 ; WX 611 ; N V ; B -1 -15 614 726 ;\nC 87 ; WX 643 ; N W ; B 8 0 614 689 ;\nC 88 ; WX 582 ; N X ; B 3 -1 580 697 ;\nC 89 ; WX 561 ; N Y ; B -21 -2 562 719 ;\nC 90 ; WX 592 ; N Z ; B 49 -1 551 709 ;\nC 91 ; WX 312 ; N bracketleft ; B 85 -72 297 754 ;\nC 92 ; WX 557 ; N backslash ; B 21 -41 534 760 ;\nC 249 ; WX 639 ; N ugrave ; B 5 -28 624 679 ;\nC 250 ; WX 639 ; N uacute ; B 5 -28 624 682 ;\nC 251 ; WX 639 ; N ucircumflex ; B 5 -28 624 691 ;\nC 252 ; WX 639 ; N udieresis ; B 5 -28 624 649 ;\nC 253 ; WX 592 ; N yacute ; B 0 -232 596 666 ;\nC 254 ; WX 552 ; N thorn ; B -33 -221 512 699 ;\nC 255 ; WX 592 ; N ydieresis ; B 0 -232 596 643 ;\nC -1 ; WX 549 ; N Amacron ; B -1 -16 550 809 ;\nC -1 ; WX 565 ; N amacron ; B 38 -6 561 619 ;\nC -1 ; WX 549 ; N Abreve ; B -1 -16 550 890 ;\nC -1 ; WX 565 ; N abreve ; B 38 -6 561 686 ;\nC -1 ; WX 549 ; N Aogonek ; B -1 -138 589 703 ;\nC -1 ; WX 565 ; N aogonek ; B 38 -118 624 502 ;\nC -1 ; WX 579 ; N Cacute ; B 46 -13 531 900 ;\nC -1 ; WX 547 ; N cacute ; B 39 -22 506 693 ;\nC -1 ; WX 579 ; N Ccircumflex ; B 46 -13 531 890 ;\nC -1 ; WX 547 ; N ccircumflex ; B 39 -22 506 689 ;\nC -1 ; WX 579 ; N Cdotaccent ; B 46 -13 531 859 ;\nC -1 ; WX 547 ; N cdotaccent ; B 39 -22 506 657 ;\nC -1 ; WX 579 ; N Ccaron ; B 46 -13 531 918 ;\nC -1 ; WX 547 ; N ccaron ; B 39 -22 506 710 ;\nC -1 ; WX 622 ; N Dcaron ; B 36 -17 579 924 ;\nC -1 ; WX 750 ; N dcaron ; B 40 -26 716 704 ;\nC -1 ; WX 623 ; N Dcroat ; B 36 -17 580 713 ;\nC -1 ; WX 603 ; N dcroat ; B 40 -26 597 714 ;\nC -1 ; WX 638 ; N Emacron ; B 38 -16 587 798 ;\nC -1 ; WX 543 ; N emacron ; B 40 -23 501 616 ;\nC -1 ; WX 638 ; N Ebreve ; B 38 -16 587 876 ;\nC -1 ; WX 543 ; N ebreve ; B 40 -23 501 683 ;\nC -1 ; WX 638 ; N Edotaccent ; B 38 -16 587 848 ;\nC -1 ; WX 543 ; N edotaccent ; B 40 -23 501 659 ;\nC -1 ; WX 638 ; N Eogonek ; B 38 -113 610 691 ;\nC -1 ; WX 543 ; N eogonek ; B 40 -145 501 499 ;\nC -1 ; WX 638 ; N Ecaron ; B 38 -16 587 913 ;\nC -1 ; WX 543 ; N ecaron ; B 40 -23 501 714 ;\nC -1 ; WX 615 ; N Gcircumflex ; B 45 -3 586 906 ;\nC -1 ; WX 583 ; N gcircumflex ; B 42 -224 562 676 ;\nC -1 ; WX 615 ; N Gbreve ; B 45 -3 586 899 ;\nC -1 ; WX 583 ; N gbreve ; B 42 -224 562 667 ;\nC -1 ; WX 615 ; N Gdotaccent ; B 45 -3 586 871 ;\nC -1 ; WX 583 ; N gdotaccent ; B 42 -224 562 637 ;\nC -1 ; WX 615 ; N Gcommaaccent ; B 45 -253 586 710 ;\nC -1 ; WX 583 ; N gcommaaccent ; B 42 -224 562 734 ;\nC -1 ; WX 652 ; N Hcircumflex ; B 40 -20 622 897 ;\nC -1 ; WX 616 ; N hcircumflex ; B 5 -29 601 688 ;\nC -1 ; WX 652 ; N Hbar ; B 40 -20 622 690 ;\nC -1 ; WX 616 ; N hbar ; B 5 -29 601 683 ;\nC -1 ; WX 495 ; N Itilde ; B 26 -24 469 859 ;\nC -1 ; WX 568 ; N itilde ; B 36 -42 568 615 ;\nC -1 ; WX 495 ; N Imacron ; B 26 -24 469 819 ;\nC -1 ; WX 568 ; N imacron ; B 36 -42 568 585 ;\nC -1 ; WX 495 ; N Ibreve ; B 26 -24 469 901 ;\nC -1 ; WX 568 ; N ibreve ; B 36 -42 568 661 ;\nC -1 ; WX 495 ; N Iogonek ; B 26 -154 469 710 ;\nC -1 ; WX 568 ; N iogonek ; B 36 -149 568 674 ;\nC -1 ; WX 495 ; N Idotaccent ; B 26 -24 469 873 ;\nC -1 ; WX 568 ; N dotlessi ; B 36 -42 568 468 ;\nC -1 ; WX 1036 ; N IJ ; B 26 -24 1034 710 ;\nC -1 ; WX 983 ; N ij ; B 36 -236 913 683 ;\nC -1 ; WX 541 ; N Jcircumflex ; B 16 -3 539 913 ;\nC -1 ; WX 415 ; N jcircumflex ; B -12 -236 405 699 ;\nC -1 ; WX 582 ; N Kcommaaccent ; B 28 -253 584 711 ;\nC -1 ; WX 620 ; N kcommaaccent ; B 11 -253 600 683 ;\nC -1 ; WX 620 ; N kgreenlandic ; B 11 -28 600 482 ;\nC -1 ; WX 602 ; N Lacute ; B 23 -14 583 923 ;\nC -1 ; WX 540 ; N lacute ; B 4 -28 538 902 ;\nC -1 ; WX 602 ; N Lcommaaccent ; B 23 -267 583 718 ;\nC -1 ; WX 540 ; N lcommaaccent ; B 4 -267 538 682 ;\nC -1 ; WX 602 ; N Lcaron ; B 23 -14 583 794 ;\nC -1 ; WX 582 ; N lcaron ; B 4 -28 549 704 ;\nC -1 ; WX 781 ; N Ldot ; B 23 -14 748 718 ;\nC -1 ; WX 571 ; N ldotaccent ; B 4 -28 538 682 ;\nC -1 ; WX 603 ; N Lslash ; B 24 -14 584 718 ;\nC -1 ; WX 541 ; N lslash ; B 4 -28 538 682 ;\nC -1 ; WX 627 ; N Nacute ; B 41 -15 595 894 ;\nC -1 ; WX 632 ; N nacute ; B 32 -23 612 696 ;\nC -1 ; WX 627 ; N Ncommaaccent ; B 41 -268 595 700 ;\nC -1 ; WX 632 ; N ncommaaccent ; B 32 -268 612 491 ;\nC -1 ; WX 627 ; N Ncaron ; B 41 -15 595 900 ;\nC -1 ; WX 632 ; N ncaron ; B 32 -23 612 712 ;\nC -1 ; WX 815 ; N napostrophe ; B 34 -23 795 704 ;\nC -1 ; WX 627 ; N Eng ; B 41 -320 595 700 ;\nC -1 ; WX 605 ; N eng ; B 32 -322 534 491 ;\nC -1 ; WX 616 ; N Omacron ; B 42 -30 574 815 ;\nC -1 ; WX 583 ; N omacron ; B 40 -34 543 598 ;\nC -1 ; WX 616 ; N Obreve ; B 42 -30 574 891 ;\nC -1 ; WX 583 ; N obreve ; B 40 -34 543 675 ;\nC -1 ; WX 616 ; N Ohungarumlaut ; B 42 -30 574 907 ;\nC -1 ; WX 583 ; N ohungarumlaut ; B 40 -34 545 693 ;\nC -1 ; WX 1018 ; N OE ; B 42 -30 967 702 ;\nC -1 ; WX 958 ; N oe ; B 40 -34 916 499 ;\nC -1 ; WX 636 ; N Racute ; B 14 -9 624 910 ;\nC -1 ; WX 579 ; N racute ; B 28 -16 566 693 ;\nC -1 ; WX 636 ; N Rcommaaccent ; B 14 -268 624 706 ;\nC -1 ; WX 579 ; N rcommaaccent ; B 28 -272 566 495 ;\nC -1 ; WX 636 ; N Rcaron ; B 14 -9 624 927 ;\nC -1 ; WX 579 ; N rcaron ; B 28 -16 566 698 ;\nC -1 ; WX 588 ; N Sacute ; B 51 -13 547 900 ;\nC -1 ; WX 519 ; N sacute ; B 48 -31 481 713 ;\nC -1 ; WX 588 ; N Scircumflex ; B 51 -13 547 904 ;\nC -1 ; WX 519 ; N scircumflex ; B 48 -31 481 710 ;\nC -1 ; WX 588 ; N Scedilla ; B 51 -145 547 690 ;\nC -1 ; WX 519 ; N scedilla ; B 48 -145 481 496 ;\nC -1 ; WX 588 ; N Scaron ; B 51 -13 547 904 ;\nC -1 ; WX 519 ; N scaron ; B 48 -31 481 710 ;\nC -1 ; WX 594 ; N Tcommaaccent ; B 25 -263 564 707 ;\nC -1 ; WX 510 ; N tcommaaccent ; B 0 -282 488 694 ;\nC -1 ; WX 594 ; N Tcaron ; B 25 1 564 920 ;\nC -1 ; WX 713 ; N tcaron ; B 0 -34 680 704 ;\nC -1 ; WX 594 ; N Tbar ; B 25 1 564 707 ;\nC -1 ; WX 510 ; N tbar ; B 0 -34 488 694 ;\nC -1 ; WX 621 ; N Utilde ; B 24 -6 611 850 ;\nC -1 ; WX 638 ; N utilde ; B 5 -28 624 636 ;\nC -1 ; WX 621 ; N Umacron ; B 24 -6 611 811 ;\nC -1 ; WX 638 ; N umacron ; B 5 -28 624 587 ;\nC -1 ; WX 621 ; N Ubreve ; B 24 -6 611 888 ;\nC -1 ; WX 638 ; N ubreve ; B 5 -28 624 665 ;\nC -1 ; WX 621 ; N Uring ; B 24 -6 611 959 ;\nC -1 ; WX 638 ; N uring ; B 5 -28 624 738 ;\nC -1 ; WX 621 ; N Uhungarumlaut ; B 24 -6 611 918 ;\nC -1 ; WX 638 ; N uhungarumlaut ; B 5 -28 624 691 ;\nC -1 ; WX 621 ; N Uogonek ; B 24 -136 611 710 ;\nC -1 ; WX 638 ; N uogonek ; B 5 -147 671 487 ;\nC -1 ; WX 643 ; N Wcircumflex ; B 8 0 614 901 ;\nC -1 ; WX 678 ; N wcircumflex ; B 5 -10 674 685 ;\nC -1 ; WX 561 ; N Ycircumflex ; B -21 -2 562 934 ;\nC -1 ; WX 592 ; N ycircumflex ; B 0 -232 596 691 ;\nC -1 ; WX 561 ; N Ydieresis ; B -21 -2 562 885 ;\nC -1 ; WX 592 ; N Zacute ; B 49 -1 551 905 ;\nC -1 ; WX 528 ; N zacute ; B 45 -22 487 684 ;\nC -1 ; WX 592 ; N Zdotaccent ; B 49 -1 551 866 ;\nC -1 ; WX 528 ; N zdotaccent ; B 45 -22 487 632 ;\nC -1 ; WX 592 ; N Zcaron ; B 49 -1 551 917 ;\nC -1 ; WX 528 ; N zcaron ; B 45 -22 487 688 ;\nC -1 ; WX 915 ; N AEacute ; B -11 -16 864 904 ;\nC -1 ; WX 888 ; N aeacute ; B 38 -23 846 670 ;\nC -1 ; WX 617 ; N Oslashacute ; B 43 -41 574 912 ;\nC -1 ; WX 583 ; N oslashacute ; B 40 -73 543 697 ;\nC -1 ; WX 415 ; N dotlessj ; B -12 -236 344 478 ;\nC -1 ; WX 281 ; N circumflex ; B 0 558 282 746 ;\nC -1 ; WX 281 ; N caron ; B 0 558 282 746 ;\nC -1 ; WX 281 ; N breve ; B 0 585 282 746 ;\nC -1 ; WX 132 ; N dotaccent ; B 0 600 133 729 ;\nC -1 ; WX 214 ; N ring ; B 0 547 215 780 ;\nC -1 ; WX 211 ; N ogonek ; B 0 -145 212 13 ;\nC -1 ; WX 283 ; N tilde ; B 0 583 284 701 ;\nC -1 ; WX 352 ; N hungarumlaut ; B 0 591 353 763 ;\nC -1 ; WX 185 ; N uni0312 ; B 28 474 152 694 ;\nC -1 ; WX 185 ; N uni0315 ; B 38 470 162 690 ;\nC -1 ; WX 192 ; N uni0326 ; B 32 -253 156 -33 ;\nC -1 ; WX 666 ; N mu ; B 24 -219 643 487 ;\nC -1 ; WX 643 ; N Wgrave ; B 8 0 614 895 ;\nC -1 ; WX 678 ; N wgrave ; B 5 -10 674 688 ;\nC -1 ; WX 643 ; N Wacute ; B 8 0 614 898 ;\nC -1 ; WX 678 ; N wacute ; B 5 -10 674 682 ;\nC -1 ; WX 643 ; N Wdieresis ; B 8 0 614 868 ;\nC -1 ; WX 678 ; N wdieresis ; B 5 -10 674 649 ;\nC -1 ; WX 561 ; N Ygrave ; B -21 -2 562 900 ;\nC -1 ; WX 592 ; N ygrave ; B 0 -232 596 666 ;\nC -1 ; WX 611 ; N endash ; B 50 270 551 391 ;\nC -1 ; WX 1113 ; N emdash ; B 51 270 1052 391 ;\nC -1 ; WX 265 ; N quoteleft ; B 41 390 217 704 ;\nC -1 ; WX 264 ; N quoteright ; B 54 390 230 704 ;\nC -1 ; WX 274 ; N quotesinglbase ; B 46 -138 223 176 ;\nC -1 ; WX 470 ; N quotedblleft ; B 41 390 422 704 ;\nC -1 ; WX 469 ; N quotedblright ; B 54 390 436 704 ;\nC -1 ; WX 479 ; N quotedblbase ; B 46 -138 428 176 ;\nC -1 ; WX 389 ; N dagger ; B 30 -16 359 724 ;\nC -1 ; WX 396 ; N daggerdbl ; B 35 -16 364 728 ;\nC -1 ; WX 316 ; N bullet ; B 50 246 266 479 ;\nC -1 ; WX 1063 ; N ellipsis ; B 52 -3 1016 245 ;\nC -1 ; WX 897 ; N perthousand ; B 33 -230 873 828 ;\nC -1 ; WX 296 ; N guilsinglleft ; B 44 149 232 434 ;\nC -1 ; WX 295 ; N guilsinglright ; B 63 149 251 434 ;\nC -1 ; WX 486 ; N fraction ; B -11 -53 501 748 ;\nC -1 ; WX 732 ; N Euro ; B 31 71 683 590 ;\nC -1 ; WX 757 ; N trademark ; B 60 303 703 693 ;\nC -1 ; WX 585 ; N partialdiff ; B 36 -47 553 772 ;\nC -1 ; WX 564 ; N product ; B 26 -17 534 707 ;\nC -1 ; WX 577 ; N minus ; B 63 282 514 395 ;\nC -1 ; WX 565 ; N approxequal ; B 59 137 513 522 ;\nC -1 ; WX 593 ; N notequal ; B 44 71 554 644 ;\nC -1 ; WX 1041 ; N fi ; B 20 -42 1041 702 ;\nC -1 ; WX 1013 ; N fl ; B 20 -29 1011 702 ;\nC -1 ; WX 292 ; N .notdef ; B 0 0 0 0 ;\nC -1 ; WX 0 ; N .null ; B 0 0 0 0 ;\nC -1 ; WX 292 ; N nonmarkingreturn ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 6408\nKPX quotedbl period -104\nKPX quotedbl comma -103\nKPX quotedbl Jcircumflex -34\nKPX quotedbl Aogonek -31\nKPX quotedbl Abreve -31\nKPX quotedbl Amacron -31\nKPX quotedbl AEacute -31\nKPX quotedbl Aacute -31\nKPX quotedbl Acircumflex -31\nKPX quotedbl Atilde -31\nKPX quotedbl Agrave -31\nKPX quotedbl Aring -31\nKPX quotedbl Adieresis -31\nKPX quotedbl AE -31\nKPX quotedbl J -34\nKPX quotedbl A -31\nKPX quotedbl quotedblbase -117\nKPX quotedbl quotesinglbase -117\nKPX quotedbl ellipsis -104\nKPX quotedbl slash -73\nKPX quotedbl ampersand -22\nKPX quotedbl four -27\nKPX ampersand Ycircumflex -40\nKPX ampersand Ygrave -40\nKPX ampersand Ydieresis -40\nKPX ampersand Yacute -40\nKPX ampersand Y -40\nKPX ampersand V -36\nKPX quotesingle period -97\nKPX quotesingle comma -97\nKPX quotesingle Jcircumflex -34\nKPX quotesingle Aogonek -31\nKPX quotesingle Abreve -31\nKPX quotesingle Amacron -31\nKPX hyphen T -28\nKPX hyphen one -68\nKPX hyphen B -25\nKPX hyphen seven -56\nKPX slash rcommaaccent -27\nKPX slash ncommaaccent -29\nKPX slash gcommaaccent -61\nKPX slash Jcircumflex -29\nKPX slash iogonek -26\nKPX slash ibreve -26\nKPX slash imacron -26\nKPX slash itilde -26\nKPX slash oslashacute -54\nKPX slash nacute -29\nKPX slash eng -29\nKPX slash ncaron -29\nKPX slash racute -27\nKPX slash scedilla -43\nKPX slash scircumflex -43\nKPX slash sacute -43\nKPX slash rcaron -27\nKPX slash ohungarumlaut -54\nKPX slash obreve -54\nKPX slash omacron -54\nKPX slash wgrave -23\nKPX slash wcircumflex -23\nKPX slash wdieresis -23\nKPX slash wacute -23\nKPX slash zdotaccent -41\nKPX J ebreve -32\nKPX J emacron -32\nKPX J edieresis -32\nKPX J ecircumflex -32\nKPX J egrave -32\nKPX J eacute -32\nKPX J e -32\nKPX J Aogonek -34\nKPX J Abreve -34\nKPX J Amacron -34\nKPX J AEacute -34\nKPX J Aacute -34\nKPX J Acircumflex -34\nKPX J Atilde -34\nKPX J Agrave -34\nKPX J Aring -34\nKPX J Adieresis -34\nKPX J AE -34\nKPX J A -34\nKPX J comma -29\nKPX J period -30\nKPX J v -29\nKPX J hyphen -30\nKPX J quotedblbase -34\nKPX J quotesinglbase -34\nKPX J guilsinglright -25\nKPX J guilsinglleft -25\nKPX J emdash -30\nKPX J endash -30\nKPX J guillemotright -25\nKPX J guillemotleft -25\nKPX J germandbls -36\nKPX J ellipsis -30\nKPX J slash -34\nKPX J p -28\nKPX J m -35\nKPX J b 54\nKPX K ycircumflex -60\nKPX K ygrave -60\nKPX K ydieresis -60\nKPX K yacute -60\nKPX K y -60\nKPX K wgrave -36\nKPX K wcircumflex -36\nKPX K wdieresis -36\nKPX K wacute -36\nKPX K w -36\nKPX K uogonek -25\nKPX K uhungarumlaut -25\nKPX K uring -25\nKPX K ubreve -25\nKPX K umacron -25\nKPX K utilde -25\nKPX K udieresis -25\nKPX K ucircumflex -25\nKPX K ugrave -25\nKPX K uacute -25\nKPX K u -25\nKPX K q -23\nKPX K oslashacute -28\nKPX K ohungarumlaut -28\nKPX K obreve -28\nKPX K omacron -28\nKPX K otilde -28\nKPX K odieresis -28\nKPX K ocircumflex -28\nKPX K ograve -28\nKPX K oacute -28\nKPX K eth -28\nKPX K oe -28\nKPX K oslash -28\nKPX K o -28\nKPX K dcaron -24\nKPX K d -24\nKPX K ccaron -27\nKPX K cdotaccent -27\nKPX K ccircumflex -27\nKPX K cacute -27\nKPX K ccedilla -27\nKPX K c -27\nKPX K ecaron -27\nKPX K eogonek -27\nKPX K edotaccent -27\nKPX K ebreve -27\nKPX K emacron -27\nKPX K edieresis -27\nKPX K ecircumflex -27\nKPX K egrave -27\nKPX K eacute -27\nKPX K e -27\nKPX K v -49\nKPX K hyphen -38\nKPX K guilsinglleft -24\nKPX K emdash -38\nKPX K endash -38\nKPX K guillemotleft -24\nKPX K b 49\nKPX L ycircumflex -36\nKPX L ygrave -36\nKPX L ydieresis -36\nKPX L yacute -36\nKPX L y -36\nKPX L wgrave -23\nKPX L wcircumflex -23\nKPX L wdieresis -23\nKPX L wacute -23\nKPX L w -23\nKPX L V -43\nKPX L Tcommaaccent -36\nKPX L Tbar -36\nKPX L Tcaron -36\nKPX L T -36\nKPX L quoteright -49\nKPX L v -32\nKPX L quoteleft -54\nKPX L quotedblright -49\nKPX L quotedblleft -54\nKPX L trademark -29\nKPX L backslash -50\nKPX L asterisk -30\nKPX trademark Aring -24\nKPX trademark Adieresis -24\nKPX trademark Yacute 29\nKPX trademark AE -24\nKPX trademark Y 29\nKPX trademark A -24\nKPX trademark b 31\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "src/test/resources/samples/langs/Adobe Font Metrics/lambda.afm",
    "content": "StartFontMetrics 2.0\nComment Generated by FontForge 20170719\nComment Creation Date: Sun Jul 23 23:14:02 2017\nFontName Greek_Lambda_Character-Regular\nFullName Greek_Lambda_Character Regular\nFamilyName Greek_Lambda_Character\nWeight Regular\nNotice (NONE. NADA. PUBLIC DOMAIN, BOI)\nItalicAngle 0\nIsFixedPitch false\nUnderlinePosition -175\nUnderlineThickness 90\nVersion 020.017\nEncodingScheme ISO10646-1\nFontBBox 33 -177 566 760\nStartCharMetrics 5\nC 13 ; WX 602 ; N uni000D ; B 0 0 0 0 ;\nC 32 ; WX 602 ; N space ; B 0 0 0 0 ;\nC -1 ; WX 602 ; N lambda ; B 33 0 566 760 ;\nC -1 ; WX 602 ; N .notdef ; B 50 -177 551 706 ;\nC -1 ; WX 0 ; N NULL ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "src/test/resources/samples/langs/Agda/NatCat.agda",
    "content": "module NatCat where\r\n\r\nopen import Relation.Binary.PropositionalEquality\r\n\r\n-- If you can show that a relation only ever has one inhabitant\r\n-- you get the category laws for free\r\nmodule\r\n  EasyCategory\r\n  (obj : Set)\r\n  (_⟶_ : obj → obj → Set)\r\n  (_∘_ : ∀ {x y z} → x ⟶ y → y ⟶ z → x ⟶ z)\r\n  (id : ∀ x → x ⟶ x)\r\n  (single-inhabitant : (x y : obj) (r s : x ⟶ y) → r ≡ s)\r\n  where\r\n\r\n  idʳ : ∀ x y (r : x ⟶ y) → r ∘ id y ≡ r\r\n  idʳ x y r = single-inhabitant x y (r ∘ id y) r \r\n\r\n  idˡ : ∀ x y (r : x ⟶ y) → id x ∘ r ≡ r\r\n  idˡ x y r = single-inhabitant x y (id x ∘ r) r\r\n\r\n  ∘-assoc : ∀ w x y z (r : w ⟶ x) (s : x ⟶ y) (t : y ⟶ z) → (r ∘ s) ∘ t ≡ r ∘ (s ∘ t)\r\n  ∘-assoc w x y z r s t = single-inhabitant w z ((r ∘ s) ∘ t) (r ∘ (s ∘ t))\r\n\r\nopen import Data.Nat\r\n\r\nsame : (x y : ℕ) (r s : x ≤ y) → r ≡ s\r\nsame .0 y z≤n z≤n = refl\r\nsame .(suc m) .(suc n) (s≤s {m} {n} r) (s≤s s) = cong s≤s (same m n r s)\r\n\r\n≤-trans : ∀ x y z → x ≤ y → y ≤ z → x ≤ z\r\n≤-trans .0 y z z≤n s = z≤n\r\n≤-trans .(suc m) .(suc n) .(suc n₁) (s≤s {m} {n} r) (s≤s {.n} {n₁} s) = s≤s (≤-trans m n n₁ r s)\r\n\r\n≤-refl : ∀ x → x ≤ x\r\n≤-refl zero = z≤n\r\n≤-refl (suc x) = s≤s (≤-refl x)\r\n\r\nmodule Nat-EasyCategory = EasyCategory ℕ _≤_ (λ {x}{y}{z} → ≤-trans x y z) ≤-refl same\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Alloy/file_system.als",
    "content": "module examples/systems/file_system\n\n/*\n * Model of a generic file system.\n */\n\nabstract sig Object {}\n\nsig Name {}\n\nsig File extends Object {} { some d: Dir | this in d.entries.contents }\n\nsig Dir extends Object {\n  entries: set DirEntry,\n  parent: lone Dir\n} {\n  parent = this.~@contents.~@entries\n  all e1, e2 : entries | e1.name = e2.name => e1 = e2\n  this !in this.^@parent\n  this != Root => Root in this.^@parent\n}\n\none sig Root extends Dir {} { no parent }\n\nlone sig Cur extends Dir {}\n\nsig DirEntry {\n  name: Name,\n  contents: Object\n} {\n  one this.~entries\n}\n\n\n/**\n * all directories besides root have one parent\n */\npred OneParent_buggyVersion {\n    all d: Dir - Root | one d.parent\n}\n\n/**\n * all directories besides root have one parent\n */\npred OneParent_correctVersion {\n    all d: Dir - Root | (one d.parent && one contents.d)\n}\n\n/**\n * Only files may be linked (that is, have more than one entry)\n * That is, all directories are the contents of at most one directory entry\n */\npred NoDirAliases {\n    all o: Dir | lone o.~contents\n}\n\ncheck { OneParent_buggyVersion => NoDirAliases } for 5 expect 1\n\ncheck { OneParent_correctVersion => NoDirAliases } for 5 expect 0\n"
  },
  {
    "path": "src/test/resources/samples/langs/Alloy/marksweepgc.als",
    "content": "module examples/systems/marksweepgc\n\n/*\n * Model of mark and sweep garbage collection.\n */\n\n// a node in the heap\nsig Node {}\n\nsig HeapState {\n  left, right : Node -> lone Node,\n  marked : set Node,\n  freeList : lone Node\n}\n\npred clearMarks[hs, hs' : HeapState] {\n  // clear marked set\n  no hs'.marked\n  // left and right fields are unchanged\n  hs'.left = hs.left\n  hs'.right = hs.right\n}\n\n/**\n * simulate the recursion of the mark() function using transitive closure\n */\nfun reachable[hs: HeapState, n: Node] : set Node {\n  n + n.^(hs.left + hs.right)\n}\n\npred mark[hs: HeapState, from : Node, hs': HeapState] {\n  hs'.marked = hs.reachable[from]\n  hs'.left = hs.left\n  hs'.right = hs.right\n}\n\n/**\n * complete hack to simulate behavior of code to set freeList\n */\npred setFreeList[hs, hs': HeapState] {\n  // especially hackish\n  hs'.freeList.*(hs'.left) in (Node - hs.marked)\n  all n: Node |\n    (n !in hs.marked) => {\n      no hs'.right[n]\n      hs'.left[n] in (hs'.freeList.*(hs'.left))\n      n in hs'.freeList.*(hs'.left)\n    } else {\n      hs'.left[n] = hs.left[n]\n      hs'.right[n] = hs.right[n]\n    }\n  hs'.marked = hs.marked\n}\n\npred GC[hs: HeapState, root : Node, hs': HeapState] {\n  some hs1, hs2: HeapState |\n    hs.clearMarks[hs1] && hs1.mark[root, hs2] && hs2.setFreeList[hs']\n}\n\nassert Soundness1 {\n  all h, h' : HeapState, root : Node |\n    h.GC[root, h'] =>\n      (all live : h.reachable[root] | {\n        h'.left[live] = h.left[live]\n        h'.right[live] = h.right[live]\n      })\n}\n\nassert Soundness2 {\n  all h, h' : HeapState, root : Node |\n    h.GC[root, h'] =>\n      no h'.reachable[root] & h'.reachable[h'.freeList]\n}\n\nassert Completeness {\n  all h, h' : HeapState, root : Node |\n    h.GC[root, h'] =>\n      (Node - h'.reachable[root]) in h'.reachable[h'.freeList]\n}\n\ncheck Soundness1 for 3 expect 0\ncheck Soundness2 for 3 expect 0\ncheck Completeness for 3 expect 0\n"
  },
  {
    "path": "src/test/resources/samples/langs/Alloy/views.als",
    "content": "module examples/systems/views\n\n/*\n * Model of views in object-oriented programming.\n *\n * Two object references, called the view and the backing,\n * are related by a view mechanism when changes to the\n * backing are automatically propagated to the view. Note\n * that the state of a view need not be a projection of the\n * state of the backing; the keySet method of Map, for\n * example, produces two view relationships, and for the\n * one in which the map is modified by changes to the key\n * set, the value of the new map cannot be determined from\n * the key set. Note that in the iterator view mechanism,\n * the iterator is by this definition the backing object,\n * since changes are propagated from iterator to collection\n * and not vice versa. Oddly, a reference may be a view of\n * more than one backing: there can be two iterators on the\n * same collection, eg. A reference cannot be a view under\n * more than one view type.\n *\n * A reference is made dirty when it is a backing for a view\n * with which it is no longer related by the view invariant.\n * This usually happens when a view is modified, either\n * directly or via another backing. For example, changing a\n * collection directly when it has an iterator invalidates\n * it, as does changing the collection through one iterator\n * when there are others.\n *\n * More work is needed if we want to model more closely the\n * failure of an iterator when its collection is invalidated.\n *\n * As a terminological convention, when there are two\n * complementary view relationships, we will give them types\n * t and t'. For example, KeySetView propagates from map to\n * set, and KeySetView' propagates from set to map.\n *\n * author: Daniel Jackson\n */\n\nopen util/ordering[State] as so\nopen util/relation as rel\n\nsig Ref {}\nsig Object {}\n\n-- t->b->v in views when v is view of type t of backing b\n-- dirty contains refs that have been invalidated\nsig State {\n  refs: set Ref,\n  obj: refs -> one Object,\n  views: ViewType -> refs -> refs,\n  dirty: set refs\n--  , anyviews: Ref -> Ref -- for visualization\n  }\n-- {anyviews = ViewType.views}\n\nsig Map extends Object {\n  keys: set Ref,\n  map: keys -> one Ref\n  }{all s: State |  keys + Ref.map in s.refs}\nsig MapRef extends Ref {}\nfact {State.obj[MapRef] in Map}\n\nsig Iterator extends Object {\n  left, done: set Ref,\n  lastRef: lone done\n  }{all s: State | done + left + lastRef in s.refs}\nsig IteratorRef extends Ref {}\nfact {State.obj[IteratorRef] in Iterator}\n\nsig Set extends Object {\n  elts: set Ref\n  }{all s: State | elts in s.refs}\nsig SetRef extends Ref {}\nfact {State.obj[SetRef] in Set}\n\nabstract sig ViewType {}\none sig KeySetView, KeySetView', IteratorView extends ViewType {}\nfact ViewTypes {\n  State.views[KeySetView] in MapRef -> SetRef\n  State.views[KeySetView'] in SetRef -> MapRef\n  State.views[IteratorView] in IteratorRef -> SetRef\n  all s: State | s.views[KeySetView] = ~(s.views[KeySetView'])\n  }\n\n/**\n * mods is refs modified directly or by view mechanism\n * doesn't handle possibility of modifying an object and its view at once?\n * should we limit frame conds to non-dirty refs?\n */\npred modifies [pre, post: State, rs: set Ref] {\n  let vr = pre.views[ViewType], mods = rs.*vr {\n    all r: pre.refs - mods | pre.obj[r] = post.obj[r]\n    all b: mods, v: pre.refs, t: ViewType |\n      b->v in pre.views[t] => viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]]\n    post.dirty = pre.dirty +\n      {b: pre.refs | some v: Ref, t: ViewType |\n          b->v in pre.views[t] && !viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]]\n      }\n    }\n  }\n\npred allocates [pre, post: State, rs: set Ref] {\n  no rs & pre.refs\n  post.refs = pre.refs + rs\n  }\n\n/** \n * models frame condition that limits change to view object from v to v' when backing object changes to b'\n */\npred viewFrame [t: ViewType, v, v', b': Object] {\n  t in KeySetView => v'.elts = dom [b'.map]\n  t in KeySetView' => b'.elts = dom [v'.map]\n  t in KeySetView' => (b'.elts) <: (v.map) = (b'.elts) <: (v'.map)\n  t in IteratorView => v'.elts = b'.left + b'.done\n  }\n\npred MapRef.keySet [pre, post: State, setRefs: SetRef] {\n  post.obj[setRefs].elts = dom [pre.obj[this].map]\n  modifies [pre, post, none]\n  allocates [pre, post, setRefs]\n  post.views = pre.views + KeySetView->this->setRefs + KeySetView'->setRefs->this\n  }\n\npred MapRef.put [pre, post: State, k, v: Ref] {\n  post.obj[this].map = pre.obj[this].map ++ k->v\n  modifies [pre, post, this]\n  allocates [pre, post, none]\n  post.views = pre.views\n  }\n\npred SetRef.iterator [pre, post: State, iterRef: IteratorRef] {\n  let i = post.obj[iterRef] {\n    i.left = pre.obj[this].elts\n    no i.done + i.lastRef\n    }\n  modifies [pre,post,none]\n  allocates [pre, post, iterRef]\n  post.views = pre.views + IteratorView->iterRef->this\n  }\n\npred IteratorRef.remove [pre, post: State] {\n  let i = pre.obj[this], i' = post.obj[this] {\n    i'.left = i.left\n    i'.done = i.done - i.lastRef\n    no i'.lastRef\n    }\n  modifies [pre,post,this]\n  allocates [pre, post, none]\n  pre.views = post.views\n  }\n\npred IteratorRef.next [pre, post: State, ref: Ref] {\n  let i = pre.obj[this], i' = post.obj[this] {\n    ref in i.left\n    i'.left = i.left - ref\n    i'.done = i.done + ref\n    i'.lastRef = ref\n    }\n  modifies [pre, post, this]\n  allocates [pre, post, none]\n  pre.views = post.views\n  }\n\npred IteratorRef.hasNext [s: State] {\n  some s.obj[this].left\n  }\n\nassert zippishOK {\n  all\n    ks, vs: SetRef,\n    m: MapRef,\n    ki, vi: IteratorRef,\n    k, v: Ref |\n    let s0=so/first,\n    s1=so/next[s0],\n    s2=so/next[s1],\n    s3=so/next[s2],\n    s4=so/next[s3],\n    s5=so/next[s4],\n    s6=so/next[s5],\n    s7=so/next[s6] |\n  ({\n    precondition [s0, ks, vs, m]\n    no s0.dirty\n    ks.iterator [s0, s1, ki]\n    vs.iterator [s1, s2, vi]\n    ki.hasNext [s2]\n    vi.hasNext [s2]\n    ki.this/next [s2, s3, k]\n    vi.this/next [s3, s4, v]\n    m.put [s4, s5, k, v]\n    ki.remove [s5, s6]\n    vi.remove [s6, s7]\n  } => no State.dirty)\n  }\n\npred precondition [pre: State, ks, vs, m: Ref] {\n  // all these conditions and other errors discovered in scope of 6 but 8,3\n  // in initial state, must have view invariants hold\n  (all t: ViewType, b, v: pre.refs |\n    b->v in pre.views[t] => viewFrame [t, pre.obj[v], pre.obj[v], pre.obj[b]])\n  // sets are not aliases\n--  ks != vs\n  // sets are not views of map\n--  no (ks+vs)->m & ViewType.pre.views\n  // no iterator currently on either set\n--  no Ref->(ks+vs) & ViewType.pre.views\n  }\n\ncheck zippishOK for 6 but 8 State, 3 ViewType expect 1\n\n/** \n * experiment with controlling heap size\n */\nfact {all s: State | #s.obj < 5}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Alpine Abuild/filenames/APKBUILD",
    "content": "# Contributor: Natanael Copa <ncopa@alpinelinux.org>\n# Maintainer: Natanael Copa <ncopa@alpinelinux.org>\npkgname=abuild\npkgver=2.27.0\n_ver=${pkgver%_git*}\npkgrel=0\npkgdesc=\"Script to build Alpine Packages\"\nurl=\"http://git.alpinelinux.org/cgit/abuild/\"\narch=\"all\"\nlicense=\"GPL2\"\ndepends=\"fakeroot sudo pax-utils openssl apk-tools>=2.0.7-r1 libc-utils\n\tattr tar pkgconf patch\"\nif [ \"$CBUILD\" = \"$CHOST\" ]; then\n\tdepends=\"$depends curl\"\nfi\nmakedepends_build=\"pkgconfig\"\nmakedepends_host=\"openssl-dev\"\nmakedepends=\"$makedepends_host $makedepends_build\"\ninstall=\"$pkgname.pre-install $pkgname.pre-upgrade\"\nsubpackages=\"apkbuild-cpan:cpan apkbuild-gem-resolver:gems\"\noptions=\"suid\"\npkggroups=\"abuild\"\nsource=\"http://dev.alpinelinux.org/archive/abuild/abuild-$_ver.tar.xz\n\t\"\n\n_builddir=\"$srcdir/$pkgname-$_ver\"\nprepare() {\n\tcd \"$_builddir\"\n\tfor i in $source; do\n\t\tcase $i in\n\t\t*.patch)\n\t\t\tmsg \"Applying $i\"\n\t\t\tpatch -p1 -i \"$srcdir\"/$i || return 1\n\t\t\t;;\n\t\tesac\n\tdone\n\tsed -i -e \"/^CHOST=/s/=.*/=$CHOST/\" abuild.conf\n}\n\nbuild() {\n\tcd \"$_builddir\"\n\tmake || return 1\n}\n\npackage() {\n\tcd \"$_builddir\"\n\tmake install DESTDIR=\"$pkgdir\" || return 1\n\tinstall -m 644 abuild.conf \"$pkgdir\"/etc/abuild.conf || return 1\n\tinstall -d -m 775 -g abuild \"$pkgdir\"/var/cache/distfiles || return 1\n}\n\ncpan() {\n\tpkgdesc=\"Script to generate perl APKBUILD from CPAN\"\n\tdepends=\"perl perl-libwww perl-json\"\n\tarch=\"noarch\"\n\tmkdir -p \"$subpkgdir\"/usr/bin\n\tmv \"$pkgdir\"/usr/bin/apkbuild-cpan \"$subpkgdir\"/usr/bin/\n}\n\ngems() {\n\tpkgdesc=\"APKBUILD dependency resolver for RubyGems\"\n\tdepends=\"ruby ruby-augeas\"\n\tarch=\"noarch\"\n\tmkdir -p \"$subpkgdir\"/usr/bin\n\tmv \"$pkgdir\"/usr/bin/apkbuild-gem-resolver \"$subpkgdir\"/usr/bin/\n}\n\nmd5sums=\"c67e4c971c54b4d550e16db3ba331f96  abuild-2.27.0.tar.xz\"\nsha256sums=\"c8db017e3dd168edb20ceeb91971535cf66b8c95f29d3288f88ac755bffc60e5  abuild-2.27.0.tar.xz\"\nsha512sums=\"98e1da4e47f3ab68700b3bc992c83e103f770f3196e433788ee74145f57cd33e5239c87f0a7a15f7266840d5bad893fc8c0d4c826d663df53deaee2678c56984  abuild-2.27.0.tar.xz\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/AngelScript/botmanager.as",
    "content": "/*\n*\tThis is a sample script.\n*/\n\n#include \"BotManagerInterface.acs\"\n\nBotManager::BotManager g_BotManager( @CreateDumbBot );\n\nCConCommand@ m_pAddBot;\n\nvoid PluginInit()\n{\n\tg_BotManager.PluginInit();\n\t\n\t@m_pAddBot = @CConCommand( \"addbot\", \"Adds a new bot with the given name\", @AddBotCallback );\n}\n\nvoid AddBotCallback( const CCommand@ args )\n{\n\tif( args.ArgC() < 2 )\n\t{\n\t\tg_Game.AlertMessage( at_console, \"Usage: addbot <name>\" );\n\t\treturn;\n\t}\n\t\n\tBotManager::BaseBot@ pBot = g_BotManager.CreateBot( args[ 1 ] );\n\t\n\tif( pBot !is null )\n\t{\n\t\tg_Game.AlertMessage( at_console, \"Created bot \" + args[ 1 ] + \"\\n\" );\n\t}\n\telse\n\t{\n\t\tg_Game.AlertMessage( at_console, \"Could not create bot\\n\" );\n\t}\n}\n\nfinal class DumbBot : BotManager::BaseBot\n{\t\n\tDumbBot( CBasePlayer@ pPlayer )\n\t{\n\t\tsuper( pPlayer );\n\t}\n\t\n\tvoid Think()\n\t{\n\t\tBotManager::BaseBot::Think();\n\t\t\n\t\t// If the bot is dead and can be respawned, send a button press\n\t\tif( Player.pev.deadflag >= DEAD_RESPAWNABLE )\n\t\t{\n\t\t\tPlayer.pev.button |= IN_ATTACK;\n\t\t}\n\t\telse\n\t\t\tPlayer.pev.button &= ~IN_ATTACK;\n\t\t\n\t\tKeyValueBuffer@ pInfoBuffer = g_EngineFuncs.GetInfoKeyBuffer( Player.edict() );\n\t\t\n\t\tpInfoBuffer.SetValue( \"topcolor\", Math.RandomLong( 0, 255 ) );\n\t\tpInfoBuffer.SetValue( \"bottomcolor\", Math.RandomLong( 0, 255 ) );\n\t\t\n\t\tif( Math.RandomLong( 0, 100 ) > 10 )\n\t\t\tPlayer.pev.button |= IN_ATTACK;\n\t\telse\n\t\t\tPlayer.pev.button &= ~IN_ATTACK;\n\t\t\t\n\t\tfor( uint uiIndex = 0; uiIndex < 3; ++uiIndex )\n\t\t{\n\t\t\tm_vecVelocity[ uiIndex ] = Math.RandomLong( -50, 50 );\n\t\t}\n\t}\n}\n\nBotManager::BaseBot@ CreateDumbBot( CBasePlayer@ pPlayer )\n{\n\treturn @DumbBot( pPlayer );\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/AngelScript/payload.as",
    "content": "// Sample script.\n// Source: https://github.com/codecat/ssbd-payload\n\narray<WorldScript::PayloadBeginTrigger@> g_payloadBeginTriggers;\narray<WorldScript::PayloadTeamForcefield@> g_teamForceFields;\n\n[GameMode]\nclass Payload : TeamVersusGameMode\n{\n\t[Editable]\n\tUnitFeed PayloadUnit;\n\n\t[Editable]\n\tUnitFeed FirstNode;\n\n\t[Editable default=10]\n\tint PrepareTime;\n\n\t[Editable default=300]\n\tint TimeLimit;\n\n\t[Editable default=90]\n\tint TimeAddCheckpoint;\n\n\t[Editable default=2]\n\tfloat TimeOvertime;\n\n\t[Editable default=1000]\n\tint TimePayloadHeal;\n\n\t[Editable default=1]\n\tint PayloadHeal;\n\n\tPayloadBehavior@ m_payload;\n\n\tint m_tmStarting;\n\tint m_tmStarted;\n\tint m_tmLimitCustom;\n\tint m_tmOvertime;\n\tint m_tmInOvertime;\n\n\tPayloadHUD@ m_payloadHUD;\n\tPayloadClassSwitchWindow@ m_switchClass;\n\n\tarray<SValue@>@ m_switchedSidesData;\n\n\tPayload(Scene@ scene)\n\t{\n\t\tsuper(scene);\n\n\t\tm_tmRespawnCountdown = 5000;\n\n\t\t@m_payloadHUD = PayloadHUD(m_guiBuilder);\n\t\t@m_switchTeam = PayloadTeamSwitchWindow(m_guiBuilder);\n\t\t@m_switchClass = PayloadClassSwitchWindow(m_guiBuilder);\n\t}\n\n\tvoid UpdateFrame(int ms, GameInput& gameInput, MenuInput& menuInput) override\n\t{\n\t\tTeamVersusGameMode::UpdateFrame(ms, gameInput, menuInput);\n\n\t\tm_payloadHUD.Update(ms);\n\n\t\tif (Network::IsServer())\n\t\t{\n\t\t\tuint64 tmNow = CurrPlaytimeLevel();\n\n\t\t\tif (m_tmStarting == 0)\n\t\t\t{\n\t\t\t\tif (GetPlayersInTeam(0) > 0 && GetPlayersInTeam(1) > 0)\n\t\t\t\t{\n\t\t\t\t\tm_tmStarting = tmNow;\n\t\t\t\t\t(Network::Message(\"GameStarting\") << m_tmStarting).SendToAll();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (m_tmStarting > 0 && m_tmStarted == 0 && tmNow - m_tmStarting > PrepareTime * 1000)\n\t\t\t{\n\t\t\t\tm_tmStarted = tmNow;\n\t\t\t\t(Network::Message(\"GameStarted\") << m_tmStarted).SendToAll();\n\n\t\t\t\tfor (uint i = 0; i < g_payloadBeginTriggers.length(); i++)\n\t\t\t\t{\n\t\t\t\t\tWorldScript@ ws = WorldScript::GetWorldScript(g_scene, g_payloadBeginTriggers[i]);\n\t\t\t\t\tws.Execute();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!m_ended && m_tmStarted > 0)\n\t\t\tCheckTimeReached(ms);\n\t}\n\n\tstring NameForTeam(int index) override\n\t{\n\t\tif (index == 0)\n\t\t\treturn \"Defenders\";\n\t\telse if (index == 1)\n\t\t\treturn \"Attackers\";\n\n\t\treturn \"Unknown\";\n\t}\n\n\tvoid CheckTimeReached(int dt)\n\t{\n\t\t// Check if time limit is not reached yet\n\t\tif (m_tmLimitCustom - (CurrPlaytimeLevel() - m_tmStarted) > 0)\n\t\t{\n\t\t\t// Don't need to continue checking\n\t\t\tm_tmOvertime = 0;\n\t\t\tm_tmInOvertime = 0;\n\t\t\treturn;\n\t\t}\n\n\t\t// Count how long we're in overtime for later time limit fixing when we reach a checkpoint\n\t\tif (m_tmOvertime > 0)\n\t\t\tm_tmInOvertime += dt;\n\n\t\t// Check if there are any attackers still inside\n\t\tif (m_payload.AttackersInside() > 0)\n\t\t{\n\t\t\t// We have overtime\n\t\t\tm_tmOvertime = int(TimeOvertime * 1000);\n\t\t\treturn;\n\t\t}\n\n\t\t// If we have overtime\n\t\tif (m_tmOvertime > 0)\n\t\t{\n\t\t\t// Decrease timer\n\t\t\tm_tmOvertime -= dt;\n\t\t\tif (m_tmOvertime <= 0)\n\t\t\t{\n\t\t\t\t// Overtime countdown reached, time limit reached\n\t\t\t\tTimeReached();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// No overtime, so time limit is reached\n\t\t\tTimeReached();\n\t\t}\n\t}\n\n\tvoid TimeReached()\n\t{\n\t\tif (!Network::IsServer())\n\t\t\treturn;\n\n\t\t(Network::Message(\"TimeReached\")).SendToAll();\n\t\tSetWinner(false);\n\t}\n\n\tbool ShouldFreezeControls() override\n\t{\n\t\treturn m_switchClass.m_visible\n\t\t    || TeamVersusGameMode::ShouldFreezeControls();\n\t}\n\n\tbool ShouldDisplayCursor() override\n\t{\n\t\treturn m_switchClass.m_visible\n\t\t    || TeamVersusGameMode::ShouldDisplayCursor();\n\t}\n\n\tbool CanSwitchTeams() override\n\t{\n\t\treturn m_tmStarted == 0;\n\t}\n\n\tPlayerRecord@ CreatePlayerRecord() override\n\t{\n\t\treturn PayloadPlayerRecord();\n\t}\n\n\tint GetPlayerClassCount(PlayerClass playerClass, TeamVersusScore@ team)\n\t{\n\t\tif (team is null)\n\t\t\treturn 0;\n\n\t\tint ret = 0;\n\t\tfor (uint i = 0; i < team.m_players.length(); i++)\n\t\t{\n\t\t\tif (team.m_players[i].peer == 255)\n\t\t\t\tcontinue;\n\t\t\tauto record = cast<PayloadPlayerRecord>(team.m_players[i]);\n\t\t\tif (record.playerClass == playerClass)\n\t\t\t\tret++;\n\t\t}\n\t\treturn ret;\n\t}\n\n\tvoid PlayerClassesUpdated()\n\t{\n\t\tm_switchClass.PlayerClassesUpdated();\n\t}\n\n\tvoid SetWinner(bool attackers)\n\t{\n\t\tif (attackers)\n\t\t\tprint(\"Attackers win!\");\n\t\telse\n\t\t\tprint(\"Defenders win!\");\n\n\t\tm_payloadHUD.Winner(attackers);\n\t\tEndMatch();\n\t}\n\n\tvoid DisplayPlayerName(int idt, SpriteBatch& sb, PlayerRecord@ record, PlayerHusk@ plr, vec2 pos) override\n\t{\n\t\tTeamVersusGameMode::DisplayPlayerName(idt, sb, record, plr, pos);\n\n\t\tm_payloadHUD.DisplayPlayerName(idt, sb, cast<PayloadPlayerRecord>(record), plr, pos);\n\t}\n\n\tvoid RenderFrame(int idt, SpriteBatch& sb) override\n\t{\n\t\tPlayer@ player = GetLocalPlayer();\n\t\tif (player !is null)\n\t\t{\n\t\t\tPlayerHealgun@ healgun = cast<PlayerHealgun>(player.m_currWeapon);\n\t\t\tif (healgun !is null)\n\t\t\t\thealgun.RenderMarkers(idt, sb);\n\t\t}\n\n\t\tTeamVersusGameMode::RenderFrame(idt, sb);\n\t}\n\n\tvoid RenderWidgets(PlayerRecord@ player, int idt, SpriteBatch& sb) override\n\t{\n\t\tm_payloadHUD.Draw(sb, idt);\n\n\t\tTeamVersusGameMode::RenderWidgets(player, idt, sb);\n\n\t\tm_switchClass.Draw(sb, idt);\n\t}\n\n\tvoid GoNextMap() override\n\t{\n\t\tif (m_switchedSidesData !is null)\n\t\t{\n\t\t\tTeamVersusGameMode::GoNextMap();\n\t\t\treturn;\n\t\t}\n\n\t\tChangeLevel(GetCurrentLevelFilename());\n\t}\n\n\tvoid SpawnPlayers() override\n\t{\n\t\tif (m_switchedSidesData is null)\n\t\t{\n\t\t\tTeamVersusGameMode::SpawnPlayers();\n\t\t\treturn;\n\t\t}\n\n\t\tif (Network::IsServer())\n\t\t{\n\t\t\tfor (uint i = 0; i < m_switchedSidesData.length(); i += 2)\n\t\t\t{\n\t\t\t\tuint peer = uint(m_switchedSidesData[i].GetInteger());\n\t\t\t\tuint team = uint(m_switchedSidesData[i + 1].GetInteger());\n\n\t\t\t\tTeamVersusScore@ joinScore = FindTeamScore(team);\n\t\t\t\tif (joinScore is m_teamScores[0])\n\t\t\t\t\t@joinScore = m_teamScores[1];\n\t\t\t\telse\n\t\t\t\t\t@joinScore = m_teamScores[0];\n\n\t\t\t\tfor (uint j = 0; j < g_players.length(); j++)\n\t\t\t\t{\n\t\t\t\t\tif (g_players[j].peer != peer)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tSpawnPlayer(j, vec2(), 0, joinScore.m_team);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid Save(SValueBuilder& builder) override\n\t{\n\t\tif (m_switchedSidesData is null)\n\t\t{\n\t\t\tbuilder.PushArray(\"teams\");\n\t\t\tfor (uint i = 0; i < g_players.length(); i++)\n\t\t\t{\n\t\t\t\tif (g_players[i].peer == 255)\n\t\t\t\t\tcontinue;\n\t\t\t\tbuilder.PushInteger(g_players[i].peer);\n\t\t\t\tbuilder.PushInteger(g_players[i].team);\n\t\t\t}\n\t\t\tbuilder.PopArray();\n\t\t}\n\n\t\tTeamVersusGameMode::Save(builder);\n\t}\n\n\tvoid Start(uint8 peer, SValue@ save, StartMode sMode) override\n\t{\n\t\tif (save !is null)\n\t\t\t@m_switchedSidesData = GetParamArray(UnitPtr(), save, \"teams\", false);\n\n\t\tTeamVersusGameMode::Start(peer, save, sMode);\n\n\t\tm_tmLimit = 0; // infinite time limit as far as VersusGameMode is concerned\n\t\tm_tmLimitCustom = TimeLimit * 1000; // 5 minutes by default\n\n\t\t@m_payload = cast<PayloadBehavior>(PayloadUnit.FetchFirst().GetScriptBehavior());\n\n\t\tif (m_payload is null)\n\t\t\tPrintError(\"PayloadUnit is not a PayloadBehavior!\");\n\n\t\tUnitPtr unitFirstNode = FirstNode.FetchFirst();\n\t\tif (unitFirstNode.IsValid())\n\t\t{\n\t\t\tauto node = cast<WorldScript::PayloadNode>(unitFirstNode.GetScriptBehavior());\n\t\t\tif (node !is null)\n\t\t\t\t@m_payload.m_targetNode = node;\n\t\t\telse\n\t\t\t\tPrintError(\"First target node is not a PayloadNode script!\");\n\t\t}\n\t\telse\n\t\t\tPrintError(\"First target node was not set!\");\n\n\t\tWorldScript::PayloadNode@ prevNode;\n\n\t\tfloat totalDistance = 0.0f;\n\n\t\tUnitPtr unitNode = unitFirstNode;\n\t\twhile (unitNode.IsValid())\n\t\t{\n\t\t\tauto node = cast<WorldScript::PayloadNode>(unitNode.GetScriptBehavior());\n\t\t\tif (node is null)\n\t\t\t\tbreak;\n\n\t\t\tunitNode = node.NextNode.FetchFirst();\n\n\t\t\t@node.m_prevNode = prevNode;\n\t\t\t@node.m_nextNode = cast<WorldScript::PayloadNode>(unitNode.GetScriptBehavior());\n\n\t\t\tif (prevNode !is null)\n\t\t\t\ttotalDistance += dist(prevNode.Position, node.Position);\n\n\t\t\t@prevNode = node;\n\t\t}\n\n\t\tfloat currDistance = 0.0f;\n\n\t\tauto distNode = cast<WorldScript::PayloadNode>(unitFirstNode.GetScriptBehavior());\n\t\twhile (distNode !is null)\n\t\t{\n\t\t\tif (distNode.m_prevNode is null)\n\t\t\t\tdistNode.m_locationFactor = 0.0f;\n\t\t\telse\n\t\t\t{\n\t\t\t\tcurrDistance += dist(distNode.m_prevNode.Position, distNode.Position);\n\t\t\t\tdistNode.m_locationFactor = currDistance / totalDistance;\n\t\t\t}\n\n\t\t\t@distNode = distNode.m_nextNode;\n\t\t}\n\n\t\tm_payloadHUD.AddCheckpoints();\n\t}\n\n\tvoid SpawnPlayer(int i, vec2 pos = vec2(), int unitId = 0, uint team = 0) override\n\t{\n\t\tTeamVersusGameMode::SpawnPlayer(i, pos, unitId, team);\n\n\t\tPayloadPlayerRecord@ record = cast<PayloadPlayerRecord>(g_players[i]);\n\t\trecord.HandlePlayerClass();\n\n\t\tif (g_players[i].local)\n\t\t{\n\t\t\t//TODO: This doesn't work well\n\t\t\tbool localAttackers = (team == HashString(\"player_1\"));\n\t\t\tfor (uint j = 0; j < g_teamForceFields.length(); j++)\n\t\t\t{\n\t\t\t\tbool hasCollision = (localAttackers != g_teamForceFields[j].Attackers);\n\n\t\t\t\tauto units = g_teamForceFields[j].Units.FetchAll();\n\t\t\t\tfor (uint k = 0; k < units.length(); k++)\n\t\t\t\t{\n\t\t\t\t\tPhysicsBody@ body = units[k].GetPhysicsBody();\n\t\t\t\t\tif (body is null)\n\t\t\t\t\t{\n\t\t\t\t\t\tPrintError(\"PhysicsBody for unit \" + units[k].GetDebugName() + \"is null\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tbody.SetActive(hasCollision);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ant Build System/filenames/ant.xml",
    "content": "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<project name=\"WebBuild\">\n\n    <!-- generate timestamps -->\n    <tstamp />\n\n    <!-- Debugging Macro -->\n    <import file=\"echopath.xml\" />\n\n    <!-- JS build files macro -->\n    <import file=\"rhinoscript.xml\" />\n\n    <!-- Component Build Files -->\n    <import file=\"setup.xml\" />\n    <import file=\"clean.xml\" />\n    <import file=\"copy.xml\" />\n    <import file=\"file.transform.xml\" />\n    <import file=\"external.tools.xml\" />\n    <import file=\"rename.xml\" />\n    <import file=\"js.xml\" />\n    <import file=\"css.xml\" />\n    <import file=\"img.xml\" />\n    <import file=\"png8.xml\" />\n    <import file=\"yui.xml\" />\n    <import file=\"cdn.xml\" />\n    <import file=\"datauri.xml\" />\n    <import file=\"devlive.xml\" />\n\n    <!-- This dirname is the only complete path we know for sure, everything builds off of it -->\n    <dirname property=\"dir.build\" file=\"${ant.file.WebBuild}\" />\n\n    <!-- get name for newly built folder -->\n    <basename property=\"app.name\"       file=\"${basedir}\" />\n\n    <!-- read global properties file -->\n    <property file=\"${dir.build}\\build.properties\" />\n\n    <!-- Build Directories -->\n    <property name=\"dir.build.js\"   location=\"${dir.build}/js\" />\n\n    <!-- App Directories -->\n    <property name=\"dir.app\"        location=\"${dir.result}/${app.name}\" />\n    <property name=\"dir.app.temp\"   location=\"${dir.temp}/${app.name}\" />\n    <property name=\"dir.app.files\"  location=\"${dir.app.temp}/${dir.files}\" />\n\n    <!-- Files -->\n    <property name=\"mapping.js\"     location=\"${dir.app.temp}/${mapping.file.js}\" />\n    <property name=\"mapping.css\"    location=\"${dir.app.temp}/${mapping.file.css}\" />\n    <property name=\"mapping.img\"    location=\"${dir.app.temp}/${mapping.file.img}\" />\n    <property name=\"mapping.swf\"    location=\"${dir.app.temp}/${mapping.file.swf}\" />\n    <property name=\"mapping.fonts\"  location=\"${dir.app.temp}/${mapping.file.fonts}\" />\n\n    <!-- Tool Directories -->\n    <property name=\"dir.bin\"    location=\"${dir.build}/Bin\" />\n    <property name=\"dir.jar\"    location=\"${dir.bin}/jar\" />\n\n    <!-- Tool Files -->\n\t<property name=\"tools.compressor\"     location=\"${dir.jar}/${tools.file.compressor}\" />\n\t<property name=\"tools.cssembed\"       location=\"${dir.jar}/${tools.file.cssembed}\" />\n    <property name=\"tools.filetransform\"  location=\"${dir.jar}/${tools.file.filetransform}\" />\n    <property name=\"tools.optipng\"        location=\"${dir.bin}/${tools.file.optipng}\" />\n    <property name=\"tools.jpegtran\"       location=\"${dir.bin}/${tools.file.jpegtran}\" />\n\n\n    <!-- BUILD TARGETS -->\n\n    <!-- low level utility build targets -->\n\n    <!-- Build the tools -->\n    <target name=\"-setup.build.tools\"\n            depends=\"-define.filetransform, -define.cssembed, -define.yuicompressor, -define.jsclasspath\"\n    />\n\n    <!-- set up filesystem properties -->\n    <target\n        name=\"-setup\"\n        depends=\"-setup.mode, -setup.conditions, -setup.js, -setup.css, -setup.swf, -setup.img, -setup.fonts, -setup.yui\"\n    />\n\n    <!-- utility-ish targets -->\n    <target name=\"copy\"         depends=\"clean, tools, -copy\" />\n    <target name=\"tools\"        depends=\"-setup.build.tools\" />\n    <target name=\"finalize\"     depends=\"copy, -finalize\" />\n    <target name=\"-prepare\"     depends=\"copy, -setup\" />\n\n    <!-- individual component build targets (empty descriptions are to make sure they show in \"ant -p\") -->\n    <target name=\"devlive\"      depends=\"-prepare, -devlive\"            description=\"\" />\n    <target name=\"js\"           depends=\"-prepare, -js\"                 description=\"\" />\n    <target name=\"css\"          depends=\"-prepare, -css\"                description=\"\" />\n    <target name=\"rename\"       depends=\"-prepare, -rename\"             description=\"\" />\n    <target name=\"yui\"          depends=\"-prepare, rename, -yui\"        description=\"\" />\n    <target name=\"cdn\"          depends=\"-prepare, -cdn\"                description=\"\" />\n\n    <!-- high level build targets (Excluding of images is on purpose here, it's slow) -->\n    <target name=\"core\"\n            depends=\"devlive, js, css, cdn, rename, yui, -js.inline\"\n            description=\"Core build work\"\n    />\n\n    <target name=\"prod\"\n            depends=\"core, finalize\"\n            description=\"Full Production Build\"\n    />\n\n    <!-- debug target -->\n    <target name=\"debug\" depends=\"-setup\">\n        <echoproperties/>\n    </target>\n\n</project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ant Build System/filenames/build.xml",
    "content": "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<project name=\"WebBuild\">\n\n    <!-- generate timestamps -->\n    <tstamp />\n\n    <!-- Debugging Macro -->\n    <import file=\"echopath.xml\" />\n\n    <!-- JS build files macro -->\n    <import file=\"rhinoscript.xml\" />\n\n    <!-- Component Build Files -->\n    <import file=\"setup.xml\" />\n    <import file=\"clean.xml\" />\n    <import file=\"copy.xml\" />\n    <import file=\"file.transform.xml\" />\n    <import file=\"external.tools.xml\" />\n    <import file=\"rename.xml\" />\n    <import file=\"js.xml\" />\n    <import file=\"css.xml\" />\n    <import file=\"img.xml\" />\n    <import file=\"png8.xml\" />\n    <import file=\"yui.xml\" />\n    <import file=\"cdn.xml\" />\n    <import file=\"datauri.xml\" />\n    <import file=\"devlive.xml\" />\n\n    <!-- This dirname is the only complete path we know for sure, everything builds off of it -->\n    <dirname property=\"dir.build\" file=\"${ant.file.WebBuild}\" />\n\n    <!-- get name for newly built folder -->\n    <basename property=\"app.name\"       file=\"${basedir}\" />\n\n    <!-- read global properties file -->\n    <property file=\"${dir.build}\\build.properties\" />\n\n    <!-- Build Directories -->\n    <property name=\"dir.build.js\"   location=\"${dir.build}/js\" />\n\n    <!-- App Directories -->\n    <property name=\"dir.app\"        location=\"${dir.result}/${app.name}\" />\n    <property name=\"dir.app.temp\"   location=\"${dir.temp}/${app.name}\" />\n    <property name=\"dir.app.files\"  location=\"${dir.app.temp}/${dir.files}\" />\n\n    <!-- Files -->\n    <property name=\"mapping.js\"     location=\"${dir.app.temp}/${mapping.file.js}\" />\n    <property name=\"mapping.css\"    location=\"${dir.app.temp}/${mapping.file.css}\" />\n    <property name=\"mapping.img\"    location=\"${dir.app.temp}/${mapping.file.img}\" />\n    <property name=\"mapping.swf\"    location=\"${dir.app.temp}/${mapping.file.swf}\" />\n    <property name=\"mapping.fonts\"  location=\"${dir.app.temp}/${mapping.file.fonts}\" />\n\n    <!-- Tool Directories -->\n    <property name=\"dir.bin\"    location=\"${dir.build}/Bin\" />\n    <property name=\"dir.jar\"    location=\"${dir.bin}/jar\" />\n\n    <!-- Tool Files -->\n\t<property name=\"tools.compressor\"     location=\"${dir.jar}/${tools.file.compressor}\" />\n\t<property name=\"tools.cssembed\"       location=\"${dir.jar}/${tools.file.cssembed}\" />\n    <property name=\"tools.filetransform\"  location=\"${dir.jar}/${tools.file.filetransform}\" />\n    <property name=\"tools.optipng\"        location=\"${dir.bin}/${tools.file.optipng}\" />\n    <property name=\"tools.jpegtran\"       location=\"${dir.bin}/${tools.file.jpegtran}\" />\n\n\n    <!-- BUILD TARGETS -->\n\n    <!-- low level utility build targets -->\n\n    <!-- Build the tools -->\n    <target name=\"-setup.build.tools\"\n            depends=\"-define.filetransform, -define.cssembed, -define.yuicompressor, -define.jsclasspath\"\n    />\n\n    <!-- set up filesystem properties -->\n    <target\n        name=\"-setup\"\n        depends=\"-setup.mode, -setup.conditions, -setup.js, -setup.css, -setup.swf, -setup.img, -setup.fonts, -setup.yui\"\n    />\n\n    <!-- utility-ish targets -->\n    <target name=\"copy\"         depends=\"clean, tools, -copy\" />\n    <target name=\"tools\"        depends=\"-setup.build.tools\" />\n    <target name=\"finalize\"     depends=\"copy, -finalize\" />\n    <target name=\"-prepare\"     depends=\"copy, -setup\" />\n\n    <!-- individual component build targets (empty descriptions are to make sure they show in \"ant -p\") -->\n    <target name=\"devlive\"      depends=\"-prepare, -devlive\"            description=\"\" />\n    <target name=\"js\"           depends=\"-prepare, -js\"                 description=\"\" />\n    <target name=\"css\"          depends=\"-prepare, -css\"                description=\"\" />\n    <target name=\"rename\"       depends=\"-prepare, -rename\"             description=\"\" />\n    <target name=\"yui\"          depends=\"-prepare, rename, -yui\"        description=\"\" />\n    <target name=\"cdn\"          depends=\"-prepare, -cdn\"                description=\"\" />\n\n    <!-- high level build targets (Excluding of images is on purpose here, it's slow) -->\n    <target name=\"core\"\n            depends=\"devlive, js, css, cdn, rename, yui, -js.inline\"\n            description=\"Core build work\"\n    />\n\n    <target name=\"prod\"\n            depends=\"core, finalize\"\n            description=\"Full Production Build\"\n    />\n\n    <!-- debug target -->\n    <target name=\"debug\" depends=\"-setup\">\n        <echoproperties/>\n    </target>\n\n</project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/ApacheConf/apache.vhost",
    "content": "#######################\n# HOSTNAME\n######################\n\n<VirtualHost 127.0.0.1:PORT>\n    ServerAdmin patrick@heysparkbox.com\n    DocumentRoot \"/var/www/HOSTNAME\"\n    ServerName HOSTNAME\n\n    <Directory \"/var/www/HOSTNAME\">\n       Options Indexes MultiViews FollowSymLinks\n       AllowOverride All\n       Order allow,deny\n       Allow from all\n       DirectoryIndex index.php\n   </Directory>\n</VirtualHost>\n"
  },
  {
    "path": "src/test/resources/samples/langs/ApacheConf/filenames/.htaccess",
    "content": "ServerSignature Off\nRewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC,OR]\nRewriteCond %{THE_REQUEST} (\\\\r|\\\\n|%0A|%0D) [NC,OR]\n\nRewriteCond %{HTTP_REFERER} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]\nRewriteCond %{HTTP_COOKIE} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]\nRewriteCond %{REQUEST_URI} ^/(,|;|:|<|>|”>|”<|/|\\\\\\.\\.\\\\).{0,9999} [NC,OR]\n\nRewriteCond %{HTTP_USER_AGENT} ^$ [OR]\nRewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget) [NC,OR]\nRewriteCond %{HTTP_USER_AGENT} (winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR]\nRewriteCond %{HTTP_USER_AGENT} (libwww-perl|curl|wget|python|nikto|scan) [NC,OR]\nRewriteCond %{HTTP_USER_AGENT} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]\n\n#Block mySQL injects\nRewriteCond %{QUERY_STRING} (;|<|>|’|”|\\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark) [NC,OR]\n\nRewriteCond %{QUERY_STRING} \\.\\./\\.\\. [OR]\n\nRewriteCond %{QUERY_STRING} (localhost|loopback|127\\.0\\.0\\.1) [NC,OR]\nRewriteCond %{QUERY_STRING} \\.[a-z0-9] [NC,OR]\nRewriteCond %{QUERY_STRING} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC]\n# Note: The final RewriteCond must NOT use the [OR] flag.\n\n# Return 403 Forbidden error.\nRewriteRule .* index.php [F]\n"
  },
  {
    "path": "src/test/resources/samples/langs/ApacheConf/filenames/apache2.conf",
    "content": "# This is the main Apache HTTP server configuration file.  It contains the\n# configuration directives that give the server its instructions.\n# See <URL:http://httpd.apache.org/docs/2.2> for detailed information.\n# In particular, see\n# <URL:http://httpd.apache.org/docs/2.2/mod/directives.html>\n# for a discussion of each configuration directive.\n#\n# Do NOT simply read the instructions in here without understanding\n# what they do.  They're here only as hints or reminders.  If you are unsure\n# consult the online docs. You have been warned.\n#\n# Configuration and logfile names: If the filenames you specify for many\n# of the server's control files begin with \"/\" (or \"drive:/\" for Win32), the\n# server will use that explicit path.  If the filenames do *not* begin\n# with \"/\", the value of ServerRoot is prepended -- so \"/var/log/apache2/foo.log\"\n# with ServerRoot set to \"\" will be interpreted by the\n# server as \"//var/log/apache2/foo.log\".\n\n#\n# ServerRoot: The top of the directory tree under which the server's\n# configuration, error, and log files are kept.\n#\n# Do not add a slash at the end of the directory path.  If you point\n# ServerRoot at a non-local disk, be sure to point the LockFile directive\n# at a local disk.  If you wish to share the same ServerRoot for multiple\n# httpd daemons, you will need to change at least LockFile and PidFile.\n#\nServerRoot \"\"\n\n#\n# Listen: Allows you to bind Apache to specific IP addresses and/or\n# ports, instead of the default. See also the <VirtualHost>\n# directive.\n#\n# Change this to Listen on specific IP addresses as shown below to\n# prevent Apache from glomming onto all bound IP addresses.\n#\n#Listen 12.34.56.78:80\nListen 80\n\n#\n# Dynamic Shared Object (DSO) Support\n#\n# To be able to use the functionality of a module which was built as a DSO you\n# have to place corresponding `LoadModule' lines at this location so the\n# directives contained in it are actually available _before_ they are used.\n# Statically compiled modules (those listed by `httpd -l') do not need\n# to be loaded here.\n#\n# Example:\n# LoadModule foo_module modules/mod_foo.so\n#\nLoadModule authn_file_module /usr/lib/apache2/modules/mod_authn_file.so\nLoadModule authn_dbm_module /usr/lib/apache2/modules/mod_authn_dbm.so\nLoadModule authn_anon_module /usr/lib/apache2/modules/mod_authn_anon.so\nLoadModule authn_dbd_module /usr/lib/apache2/modules/mod_authn_dbd.so\nLoadModule authn_default_module /usr/lib/apache2/modules/mod_authn_default.so\nLoadModule authn_alias_module /usr/lib/apache2/modules/mod_authn_alias.so\nLoadModule authz_host_module /usr/lib/apache2/modules/mod_authz_host.so\nLoadModule authz_groupfile_module /usr/lib/apache2/modules/mod_authz_groupfile.so\nLoadModule authz_user_module /usr/lib/apache2/modules/mod_authz_user.so\nLoadModule authz_dbm_module /usr/lib/apache2/modules/mod_authz_dbm.so\nLoadModule authz_owner_module /usr/lib/apache2/modules/mod_authz_owner.so\nLoadModule authnz_ldap_module /usr/lib/apache2/modules/mod_authnz_ldap.so\nLoadModule authz_default_module /usr/lib/apache2/modules/mod_authz_default.so\nLoadModule auth_basic_module /usr/lib/apache2/modules/mod_auth_basic.so\nLoadModule auth_digest_module /usr/lib/apache2/modules/mod_auth_digest.so\nLoadModule file_cache_module /usr/lib/apache2/modules/mod_file_cache.so\nLoadModule cache_module /usr/lib/apache2/modules/mod_cache.so\nLoadModule disk_cache_module /usr/lib/apache2/modules/mod_disk_cache.so\nLoadModule mem_cache_module /usr/lib/apache2/modules/mod_mem_cache.so\nLoadModule dbd_module /usr/lib/apache2/modules/mod_dbd.so\nLoadModule dumpio_module /usr/lib/apache2/modules/mod_dumpio.so\nLoadModule ext_filter_module /usr/lib/apache2/modules/mod_ext_filter.so\nLoadModule include_module /usr/lib/apache2/modules/mod_include.so\nLoadModule filter_module /usr/lib/apache2/modules/mod_filter.so\nLoadModule charset_lite_module /usr/lib/apache2/modules/mod_charset_lite.so\nLoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so\nLoadModule ldap_module /usr/lib/apache2/modules/mod_ldap.so\nLoadModule log_forensic_module /usr/lib/apache2/modules/mod_log_forensic.so\nLoadModule env_module /usr/lib/apache2/modules/mod_env.so\nLoadModule mime_magic_module /usr/lib/apache2/modules/mod_mime_magic.so\nLoadModule cern_meta_module /usr/lib/apache2/modules/mod_cern_meta.so\nLoadModule expires_module /usr/lib/apache2/modules/mod_expires.so\nLoadModule headers_module /usr/lib/apache2/modules/mod_headers.so\nLoadModule ident_module /usr/lib/apache2/modules/mod_ident.so\nLoadModule usertrack_module /usr/lib/apache2/modules/mod_usertrack.so\nLoadModule unique_id_module /usr/lib/apache2/modules/mod_unique_id.so\nLoadModule setenvif_module /usr/lib/apache2/modules/mod_setenvif.so\nLoadModule version_module /usr/lib/apache2/modules/mod_version.so\nLoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so\nLoadModule proxy_connect_module /usr/lib/apache2/modules/mod_proxy_connect.so\nLoadModule proxy_ftp_module /usr/lib/apache2/modules/mod_proxy_ftp.so\nLoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so\nLoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so\nLoadModule proxy_balancer_module /usr/lib/apache2/modules/mod_proxy_balancer.so\nLoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so\nLoadModule mime_module /usr/lib/apache2/modules/mod_mime.so\nLoadModule dav_module /usr/lib/apache2/modules/mod_dav.so\nLoadModule status_module /usr/lib/apache2/modules/mod_status.so\nLoadModule autoindex_module /usr/lib/apache2/modules/mod_autoindex.so\nLoadModule asis_module /usr/lib/apache2/modules/mod_asis.so\nLoadModule info_module /usr/lib/apache2/modules/mod_info.so\nLoadModule suexec_module /usr/lib/apache2/modules/mod_suexec.so\nLoadModule cgid_module /usr/lib/apache2/modules/mod_cgid.so\nLoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so\nLoadModule dav_fs_module /usr/lib/apache2/modules/mod_dav_fs.so\nLoadModule dav_lock_module /usr/lib/apache2/modules/mod_dav_lock.so\nLoadModule vhost_alias_module /usr/lib/apache2/modules/mod_vhost_alias.so\nLoadModule negotiation_module /usr/lib/apache2/modules/mod_negotiation.so\nLoadModule dir_module /usr/lib/apache2/modules/mod_dir.so\nLoadModule imagemap_module /usr/lib/apache2/modules/mod_imagemap.so\nLoadModule actions_module /usr/lib/apache2/modules/mod_actions.so\nLoadModule speling_module /usr/lib/apache2/modules/mod_speling.so\nLoadModule userdir_module /usr/lib/apache2/modules/mod_userdir.so\nLoadModule alias_module /usr/lib/apache2/modules/mod_alias.so\nLoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so\n\n<IfModule !mpm_netware_module>\n#\n# If you wish httpd to run as a different user or group, you must run\n# httpd as root initially and it will switch.\n#\n# User/Group: The name (or #number) of the user/group to run httpd as.\n# It is usually good practice to create a dedicated user and group for\n# running httpd, as with most system services.\n#\nUser daemon\nGroup daemon\n</IfModule>\n\n# 'Main' server configuration\n#\n# The directives in this section set up the values used by the 'main'\n# server, which responds to any requests that aren't handled by a\n# <VirtualHost> definition.  These values also provide defaults for\n# any <VirtualHost> containers you may define later in the file.\n#\n# All of these directives may appear inside <VirtualHost> containers,\n# in which case these default settings will be overridden for the\n# virtual host being defined.\n#\n\n#\n# ServerAdmin: Your address, where problems with the server should be\n# e-mailed.  This address appears on some server-generated pages, such\n# as error documents.  e.g. admin@your-domain.com\n#\nServerAdmin you@example.com\n\n#\n# ServerName gives the name and port that the server uses to identify itself.\n# This can often be determined automatically, but we recommend you specify\n# it explicitly to prevent problems during startup.\n#\n# If your host doesn't have a registered DNS name, enter its IP address here.\n#\n#ServerName www.example.com:80\n\n#\n# DocumentRoot: The directory out of which you will serve your\n# documents. By default, all requests are taken from this directory, but\n# symbolic links and aliases may be used to point to other locations.\n#\nDocumentRoot \"/usr/share/apache2/default-site/htdocs\"\n\n#\n# Each directory to which Apache has access can be configured with respect\n# to which services and features are allowed and/or disabled in that\n# directory (and its subdirectories).\n#\n# First, we configure the \"default\" to be a very restrictive set of\n# features.\n#\n<Directory />\n    Options FollowSymLinks\n    AllowOverride None\n    Order deny,allow\n    Deny from all\n</Directory>\n\n#\n# Note that from this point forward you must specifically allow\n# particular features to be enabled - so if something's not working as\n# you might expect, make sure that you have specifically enabled it\n# below.\n#\n\n#\n# This should be changed to whatever you set DocumentRoot to.\n#\n<Directory \"/usr/share/apache2/default-site/htdocs\">\n    #\n    # Possible values for the Options directive are \"None\", \"All\",\n    # or any combination of:\n    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews\n    #\n    # Note that \"MultiViews\" must be named *explicitly* --- \"Options All\"\n    # doesn't give it to you.\n    #\n    # The Options directive is both complicated and important.  Please see\n    # http://httpd.apache.org/docs/2.2/mod/core.html#options\n    # for more information.\n    #\n    Options Indexes FollowSymLinks\n\n    #\n    # AllowOverride controls what directives may be placed in .htaccess files.\n    # It can be \"All\", \"None\", or any combination of the keywords:\n    #   Options FileInfo AuthConfig Limit\n    #\n    AllowOverride None\n\n    #\n    # Controls who can get stuff from this server.\n    #\n    Order allow,deny\n    Allow from all\n\n</Directory>\n\n#\n# DirectoryIndex: sets the file that Apache will serve if a directory\n# is requested.\n#\n<IfModule dir_module>\n    DirectoryIndex index.html\n</IfModule>\n\n#\n# The following lines prevent .htaccess and .htpasswd files from being\n# viewed by Web clients.\n#\n<FilesMatch \"^\\.ht\">\n    Order allow,deny\n    Deny from all\n    Satisfy All\n</FilesMatch>\n\n#\n# ErrorLog: The location of the error log file.\n# If you do not specify an ErrorLog directive within a <VirtualHost>\n# container, error messages relating to that virtual host will be\n# logged here.  If you *do* define an error logfile for a <VirtualHost>\n# container, that host's errors will be logged there and not here.\n#\nErrorLog /var/log/apache2/error_log\n\n#\n# LogLevel: Control the number of messages logged to the error_log.\n# Possible values include: debug, info, notice, warn, error, crit,\n# alert, emerg.\n#\nLogLevel warn\n\n<IfModule log_config_module>\n    #\n    # The following directives define some format nicknames for use with\n    # a CustomLog directive (see below).\n    #\n    LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined\n    LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b\" common\n\n    <IfModule logio_module>\n      # You need to enable mod_logio.c to use %I and %O\n      LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\" %I %O\" combinedio\n    </IfModule>\n\n    #\n    # The location and format of the access logfile (Common Logfile Format).\n    # If you do not define any access logfiles within a <VirtualHost>\n    # container, they will be logged here.  Contrariwise, if you *do*\n    # define per-<VirtualHost> access logfiles, transactions will be\n    # logged therein and *not* in this file.\n    #\n    CustomLog /var/log/apache2/access_log common\n\n    #\n    # If you prefer a logfile with access, agent, and referer information\n    # (Combined Logfile Format) you can use the following directive.\n    #\n    #CustomLog /var/log/apache2/access_log combined\n</IfModule>\n\n<IfModule alias_module>\n    #\n    # Redirect: Allows you to tell clients about documents that used to\n    # exist in your server's namespace, but do not anymore. The client\n    # will make a new request for the document at its new location.\n    # Example:\n    # Redirect permanent /foo http://www.example.com/bar\n\n    #\n    # Alias: Maps web paths into filesystem paths and is used to\n    # access content that does not live under the DocumentRoot.\n    # Example:\n    # Alias /webpath /full/filesystem/path\n    #\n    # If you include a trailing / on /webpath then the server will\n    # require it to be present in the URL.  You will also likely\n    # need to provide a <Directory> section to allow access to\n    # the filesystem path.\n\n    #\n    # ScriptAlias: This controls which directories contain server scripts.\n    # ScriptAliases are essentially the same as Aliases, except that\n    # documents in the target directory are treated as applications and\n    # run by the server when requested rather than as documents sent to the\n    # client.  The same rules about trailing \"/\" apply to ScriptAlias\n    # directives as to Alias.\n    #\n    ScriptAlias /cgi-bin/ \"/usr/lib/cgi-bin/\"\n\n</IfModule>\n\n<IfModule cgid_module>\n    #\n    # ScriptSock: On threaded servers, designate the path to the UNIX\n    # socket used to communicate with the CGI daemon of mod_cgid.\n    #\n    #Scriptsock /var/run/apache2/cgisock\n</IfModule>\n\n#\n# \"/usr/lib/cgi-bin\" should be changed to whatever your ScriptAliased\n# CGI directory exists, if you have that configured.\n#\n<Directory \"/usr/lib/cgi-bin\">\n    AllowOverride None\n    Options None\n    Order allow,deny\n    Allow from all\n</Directory>\n\n#\n# DefaultType: the default MIME type the server will use for a document\n# if it cannot otherwise determine one, such as from filename extensions.\n# If your server contains mostly text or HTML documents, \"text/plain\" is\n# a good value.  If most of your content is binary, such as applications\n# or images, you may want to use \"application/octet-stream\" instead to\n# keep browsers from trying to display binary files as though they are\n# text.\n#\nDefaultType text/plain\n\n<IfModule mime_module>\n    #\n    # TypesConfig points to the file containing the list of mappings from\n    # filename extension to MIME-type.\n    #\n    TypesConfig /etc/apache2/mime.types\n\n    #\n    # AddType allows you to add to or override the MIME configuration\n    # file specified in TypesConfig for specific file types.\n    #\n    #AddType application/x-gzip .tgz\n    #\n    # AddEncoding allows you to have certain browsers uncompress\n    # information on the fly. Note: Not all browsers support this.\n    #\n    #AddEncoding x-compress .Z\n    #AddEncoding x-gzip .gz .tgz\n    #\n    # If the AddEncoding directives above are commented-out, then you\n    # probably should define those extensions to indicate media types:\n    #\n    AddType application/x-compress .Z\n    AddType application/x-gzip .gz .tgz\n\n    #\n    # AddHandler allows you to map certain file extensions to \"handlers\":\n    # actions unrelated to filetype. These can be either built into the server\n    # or added with the Action directive (see below)\n    #\n    # To use CGI scripts outside of ScriptAliased directories:\n    # (You will also need to add \"ExecCGI\" to the \"Options\" directive.)\n    #\n    #AddHandler cgi-script .cgi\n\n    # For type maps (negotiated resources):\n    #AddHandler type-map var\n\n    #\n    # Filters allow you to process content before it is sent to the client.\n    #\n    # To parse .shtml files for server-side includes (SSI):\n    # (You will also need to add \"Includes\" to the \"Options\" directive.)\n    #\n    #AddType text/html .shtml\n    #AddOutputFilter INCLUDES .shtml\n</IfModule>\n\n#\n# The mod_mime_magic module allows the server to use various hints from the\n# contents of the file itself to determine its type.  The MIMEMagicFile\n# directive tells the module where the hint definitions are located.\n#\n#MIMEMagicFile /etc/apache2/magic\n\n#\n# Customizable error responses come in three flavors:\n# 1) plain text 2) local redirects 3) external redirects\n#\n# Some examples:\n#ErrorDocument 500 \"The server made a boo boo.\"\n#ErrorDocument 404 /missing.html\n#ErrorDocument 404 \"/cgi-bin/missing_handler.pl\"\n#ErrorDocument 402 http://www.example.com/subscription_info.html\n#\n\n#\n# EnableMMAP and EnableSendfile: On systems that support it,\n# memory-mapping or the sendfile syscall is used to deliver\n# files.  This usually improves server performance, but must\n# be turned off when serving from networked-mounted\n# filesystems or if support for these functions is otherwise\n# broken on your system.\n#\n#EnableMMAP off\n#EnableSendfile off\n\n# Supplemental configuration\n#\n# The configuration files in the /etc/apache2/extra/ directory can be\n# included to add extra features or to modify the default configuration of\n# the server, or you may simply copy their contents here and change as\n# necessary.\n\n# Server-pool management (MPM specific)\n#Include /etc/apache2/extra/httpd-mpm.conf\n\n# Multi-language error messages\n#Include /etc/apache2/extra/httpd-multilang-errordoc.conf\n\n# Fancy directory listings\n#Include /etc/apache2/extra/httpd-autoindex.conf\n\n# Language settings\n#Include /etc/apache2/extra/httpd-languages.conf\n\n# User home directories\n#Include /etc/apache2/extra/httpd-userdir.conf\n\n# Real-time info on requests and configuration\n#Include /etc/apache2/extra/httpd-info.conf\n\n# Virtual hosts\n#Include /etc/apache2/extra/httpd-vhosts.conf\n\n# Local access to the Apache HTTP Server Manual\n#Include /etc/apache2/extra/httpd-manual.conf\n\n# Distributed authoring and versioning (WebDAV)\n#Include /etc/apache2/extra/httpd-dav.conf\n\n# Various default settings\n#Include /etc/apache2/extra/httpd-default.conf\n\n# Secure (SSL/TLS) connections\n#Include /etc/apache2/extra/httpd-ssl.conf\n#\n# Note: The following must must be present to support\n#       starting without SSL on platforms with no /dev/random equivalent\n#       but a statically compiled-in mod_ssl.\n#\n<IfModule ssl_module>\nSSLRandomSeed startup builtin\nSSLRandomSeed connect builtin\n</IfModule>\n"
  },
  {
    "path": "src/test/resources/samples/langs/ApacheConf/filenames/httpd.conf",
    "content": "#\n# This is the main Apache HTTP server configuration file.  It contains the\n# configuration directives that give the server its instructions.\n# See <URL:http://httpd.apache.org/docs/2.2> for detailed information.\n# In particular, see \n# <URL:http://httpd.apache.org/docs/2.2/mod/directives.html>\n# for a discussion of each configuration directive.\n#\n# Do NOT simply read the instructions in here without understanding\n# what they do.  They're here only as hints or reminders.  If you are unsure\n# consult the online docs. You have been warned.  \n#\n# Configuration and logfile names: If the filenames you specify for many\n# of the server's control files begin with \"/\" (or \"drive:/\" for Win32), the\n# server will use that explicit path.  If the filenames do *not* begin\n# with \"/\", the value of ServerRoot is prepended -- so \"log/foo_log\"\n# with ServerRoot set to \"/usr\" will be interpreted by the\n# server as \"/usr/log/foo_log\".\n\n#\n# ServerRoot: The top of the directory tree under which the server's\n# configuration, error, and log files are kept.\n#\n# Do not add a slash at the end of the directory path.  If you point\n# ServerRoot at a non-local disk, be sure to point the LockFile directive\n# at a local disk.  If you wish to share the same ServerRoot for multiple\n# httpd daemons, you will need to change at least LockFile and PidFile.\n#\nServerRoot \"/usr\"\n\n#\n# Listen: Allows you to bind Apache to specific IP addresses and/or\n# ports, instead of the default. See also the <VirtualHost>\n# directive.\n#\n# Change this to Listen on specific IP addresses as shown below to \n# prevent Apache from glomming onto all bound IP addresses.\n#\n#Listen 12.34.56.78:80\nListen 80\n\n#\n# Dynamic Shared Object (DSO) Support\n#\n# To be able to use the functionality of a module which was built as a DSO you\n# have to place corresponding `LoadModule' lines at this location so the\n# directives contained in it are actually available _before_ they are used.\n# Statically compiled modules (those listed by `httpd -l') do not need\n# to be loaded here.\n#\n# Example:\n# LoadModule foo_module modules/mod_foo.so\n#\nLoadModule authn_file_module libexec/apache2/mod_authn_file.so\nLoadModule authn_dbm_module libexec/apache2/mod_authn_dbm.so\nLoadModule authn_anon_module libexec/apache2/mod_authn_anon.so\nLoadModule authn_dbd_module libexec/apache2/mod_authn_dbd.so\nLoadModule authn_default_module libexec/apache2/mod_authn_default.so\nLoadModule authz_host_module libexec/apache2/mod_authz_host.so\nLoadModule authz_groupfile_module libexec/apache2/mod_authz_groupfile.so\nLoadModule authz_user_module libexec/apache2/mod_authz_user.so\nLoadModule authz_dbm_module libexec/apache2/mod_authz_dbm.so\nLoadModule authz_owner_module libexec/apache2/mod_authz_owner.so\nLoadModule authz_default_module libexec/apache2/mod_authz_default.so\nLoadModule auth_basic_module libexec/apache2/mod_auth_basic.so\nLoadModule auth_digest_module libexec/apache2/mod_auth_digest.so\nLoadModule cache_module libexec/apache2/mod_cache.so\nLoadModule disk_cache_module libexec/apache2/mod_disk_cache.so\nLoadModule mem_cache_module libexec/apache2/mod_mem_cache.so\nLoadModule dbd_module libexec/apache2/mod_dbd.so\nLoadModule dumpio_module libexec/apache2/mod_dumpio.so\nLoadModule reqtimeout_module libexec/apache2/mod_reqtimeout.so\nLoadModule ext_filter_module libexec/apache2/mod_ext_filter.so\nLoadModule include_module libexec/apache2/mod_include.so\nLoadModule filter_module libexec/apache2/mod_filter.so\nLoadModule substitute_module libexec/apache2/mod_substitute.so\nLoadModule deflate_module libexec/apache2/mod_deflate.so\nLoadModule log_config_module libexec/apache2/mod_log_config.so\nLoadModule log_forensic_module libexec/apache2/mod_log_forensic.so\nLoadModule logio_module libexec/apache2/mod_logio.so\nLoadModule env_module libexec/apache2/mod_env.so\nLoadModule mime_magic_module libexec/apache2/mod_mime_magic.so\nLoadModule cern_meta_module libexec/apache2/mod_cern_meta.so\nLoadModule expires_module libexec/apache2/mod_expires.so\nLoadModule headers_module libexec/apache2/mod_headers.so\nLoadModule ident_module libexec/apache2/mod_ident.so\nLoadModule usertrack_module libexec/apache2/mod_usertrack.so\n#LoadModule unique_id_module libexec/apache2/mod_unique_id.so\nLoadModule setenvif_module libexec/apache2/mod_setenvif.so\nLoadModule version_module libexec/apache2/mod_version.so\nLoadModule proxy_module libexec/apache2/mod_proxy.so\nLoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so\nLoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so\nLoadModule proxy_http_module libexec/apache2/mod_proxy_http.so\nLoadModule proxy_scgi_module libexec/apache2/mod_proxy_scgi.so\nLoadModule proxy_ajp_module libexec/apache2/mod_proxy_ajp.so\nLoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so\nLoadModule ssl_module libexec/apache2/mod_ssl.so\nLoadModule mime_module libexec/apache2/mod_mime.so\nLoadModule dav_module libexec/apache2/mod_dav.so\nLoadModule status_module libexec/apache2/mod_status.so\nLoadModule autoindex_module libexec/apache2/mod_autoindex.so\nLoadModule asis_module libexec/apache2/mod_asis.so\nLoadModule info_module libexec/apache2/mod_info.so\nLoadModule cgi_module libexec/apache2/mod_cgi.so\nLoadModule dav_fs_module libexec/apache2/mod_dav_fs.so\nLoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so\nLoadModule negotiation_module libexec/apache2/mod_negotiation.so\nLoadModule dir_module libexec/apache2/mod_dir.so\nLoadModule imagemap_module libexec/apache2/mod_imagemap.so\nLoadModule actions_module libexec/apache2/mod_actions.so\nLoadModule speling_module libexec/apache2/mod_speling.so\nLoadModule userdir_module libexec/apache2/mod_userdir.so\nLoadModule alias_module libexec/apache2/mod_alias.so\nLoadModule rewrite_module libexec/apache2/mod_rewrite.so\n#LoadModule perl_module libexec/apache2/mod_perl.so\n#LoadModule php5_module libexec/apache2/libphp5.so\n#LoadModule hfs_apple_module libexec/apache2/mod_hfs_apple.so\n\n<IfModule !mpm_netware_module>\n<IfModule !mpm_winnt_module>\n#\n# If you wish httpd to run as a different user or group, you must run\n# httpd as root initially and it will switch.  \n#\n# User/Group: The name (or #number) of the user/group to run httpd as.\n# It is usually good practice to create a dedicated user and group for\n# running httpd, as with most system services.\n#\nUser _www\nGroup _www\n\n</IfModule>\n</IfModule>\n\n# 'Main' server configuration\n#\n# The directives in this section set up the values used by the 'main'\n# server, which responds to any requests that aren't handled by a\n# <VirtualHost> definition.  These values also provide defaults for\n# any <VirtualHost> containers you may define later in the file.\n#\n# All of these directives may appear inside <VirtualHost> containers,\n# in which case these default settings will be overridden for the\n# virtual host being defined.\n#\n\n#\n# ServerAdmin: Your address, where problems with the server should be\n# e-mailed.  This address appears on some server-generated pages, such\n# as error documents.  e.g. admin@your-domain.com\n#\nServerAdmin you@example.com\n\n#\n# ServerName gives the name and port that the server uses to identify itself.\n# This can often be determined automatically, but we recommend you specify\n# it explicitly to prevent problems during startup.\n#\n# If your host doesn't have a registered DNS name, enter its IP address here.\n#\n#ServerName www.example.com:80\n\n#\n# DocumentRoot: The directory out of which you will serve your\n# documents. By default, all requests are taken from this directory, but\n# symbolic links and aliases may be used to point to other locations.\n#\nDocumentRoot \"/Library/WebServer/Documents\"\n\n#\n# Each directory to which Apache has access can be configured with respect\n# to which services and features are allowed and/or disabled in that\n# directory (and its subdirectories). \n#\n# First, we configure the \"default\" to be a very restrictive set of \n# features.  \n#\n<Directory />\n    Options FollowSymLinks\n    AllowOverride None\n    Order deny,allow\n    Deny from all\n</Directory>\n\n#\n# Note that from this point forward you must specifically allow\n# particular features to be enabled - so if something's not working as\n# you might expect, make sure that you have specifically enabled it\n# below.\n#\n\n#\n# This should be changed to whatever you set DocumentRoot to.\n#\n<Directory \"/Library/WebServer/Documents\">\n    #\n    # Possible values for the Options directive are \"None\", \"All\",\n    # or any combination of:\n    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews\n    #\n    # Note that \"MultiViews\" must be named *explicitly* --- \"Options All\"\n    # doesn't give it to you.\n    #\n    # The Options directive is both complicated and important.  Please see\n    # http://httpd.apache.org/docs/2.2/mod/core.html#options\n    # for more information.\n    #\n    Options Indexes FollowSymLinks MultiViews\n\n    #\n    # AllowOverride controls what directives may be placed in .htaccess files.\n    # It can be \"All\", \"None\", or any combination of the keywords:\n    #   Options FileInfo AuthConfig Limit\n    #\n    AllowOverride None\n\n    #\n    # Controls who can get stuff from this server.\n    #\n    Order allow,deny\n    Allow from all\n\n</Directory>\n\n#\n# DirectoryIndex: sets the file that Apache will serve if a directory\n# is requested.\n#\n<IfModule dir_module>\n    DirectoryIndex index.html\n</IfModule>\n\n#\n# The following lines prevent .htaccess and .htpasswd files from being \n# viewed by Web clients. \n#\n<FilesMatch \"^\\.([Hh][Tt]|[Dd][Ss]_[Ss])\">\n    Order allow,deny\n    Deny from all\n    Satisfy All\n</FilesMatch>\n\n#\n# Apple specific filesystem protection.\n#\n<Files \"rsrc\">\n    Order allow,deny\n    Deny from all\n    Satisfy All\n</Files>\n<DirectoryMatch \".*\\.\\.namedfork\">\n    Order allow,deny\n    Deny from all\n    Satisfy All\n</DirectoryMatch>\n\n#\n# ErrorLog: The location of the error log file.\n# If you do not specify an ErrorLog directive within a <VirtualHost>\n# container, error messages relating to that virtual host will be\n# logged here.  If you *do* define an error logfile for a <VirtualHost>\n# container, that host's errors will be logged there and not here.\n#\nErrorLog \"/private/var/log/apache2/error_log\"\n\n#\n# LogLevel: Control the number of messages logged to the error_log.\n# Possible values include: debug, info, notice, warn, error, crit,\n# alert, emerg.\n#\nLogLevel warn\n\n<IfModule log_config_module>\n    #\n    # The following directives define some format nicknames for use with\n    # a CustomLog directive (see below).\n    #\n    LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined\n    LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b\" common\n\n    <IfModule logio_module>\n      # You need to enable mod_logio.c to use %I and %O\n      LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\" %I %O\" combinedio\n    </IfModule>\n\n    #\n    # The location and format of the access logfile (Common Logfile Format).\n    # If you do not define any access logfiles within a <VirtualHost>\n    # container, they will be logged here.  Contrariwise, if you *do*\n    # define per-<VirtualHost> access logfiles, transactions will be\n    # logged therein and *not* in this file.\n    #\n    CustomLog \"/private/var/log/apache2/access_log\" common\n\n    #\n    # If you prefer a logfile with access, agent, and referer information\n    # (Combined Logfile Format) you can use the following directive.\n    #\n    #CustomLog \"/private/var/log/apache2/access_log\" combined\n</IfModule>\n\n<IfModule alias_module>\n    #\n    # Redirect: Allows you to tell clients about documents that used to \n    # exist in your server's namespace, but do not anymore. The client \n    # will make a new request for the document at its new location.\n    # Example:\n    # Redirect permanent /foo http://www.example.com/bar\n\n    #\n    # Alias: Maps web paths into filesystem paths and is used to\n    # access content that does not live under the DocumentRoot.\n    # Example:\n    # Alias /webpath /full/filesystem/path\n    #\n    # If you include a trailing / on /webpath then the server will\n    # require it to be present in the URL.  You will also likely\n    # need to provide a <Directory> section to allow access to\n    # the filesystem path.\n\n    #\n    # ScriptAlias: This controls which directories contain server scripts. \n    # ScriptAliases are essentially the same as Aliases, except that\n    # documents in the target directory are treated as applications and\n    # run by the server when requested rather than as documents sent to the\n    # client.  The same rules about trailing \"/\" apply to ScriptAlias\n    # directives as to Alias.\n    #\n    ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) \"/Library/WebServer/CGI-Executables/$1\"\n\n</IfModule>\n\n<IfModule cgid_module>\n    #\n    # ScriptSock: On threaded servers, designate the path to the UNIX\n    # socket used to communicate with the CGI daemon of mod_cgid.\n    #\n    #Scriptsock /private/var/run/cgisock\n</IfModule>\n\n#\n# \"/Library/WebServer/CGI-Executables\" should be changed to whatever your ScriptAliased\n# CGI directory exists, if you have that configured.\n#\n<Directory \"/Library/WebServer/CGI-Executables\">\n    AllowOverride None\n    Options None\n    Order allow,deny\n    Allow from all\n</Directory>\n\n#\n# DefaultType: the default MIME type the server will use for a document\n# if it cannot otherwise determine one, such as from filename extensions.\n# If your server contains mostly text or HTML documents, \"text/plain\" is\n# a good value.  If most of your content is binary, such as applications\n# or images, you may want to use \"application/octet-stream\" instead to\n# keep browsers from trying to display binary files as though they are\n# text.\n#\nDefaultType text/plain\n\n<IfModule mime_module>\n    #\n    # TypesConfig points to the file containing the list of mappings from\n    # filename extension to MIME-type.\n    #\n    TypesConfig /private/etc/apache2/mime.types\n\n    #\n    # AddType allows you to add to or override the MIME configuration\n    # file specified in TypesConfig for specific file types.\n    #\n    #AddType application/x-gzip .tgz\n    #\n    # AddEncoding allows you to have certain browsers uncompress\n    # information on the fly. Note: Not all browsers support this.\n    #\n    #AddEncoding x-compress .Z\n    #AddEncoding x-gzip .gz .tgz\n    #\n    # If the AddEncoding directives above are commented-out, then you\n    # probably should define those extensions to indicate media types:\n    #\n    AddType application/x-compress .Z\n    AddType application/x-gzip .gz .tgz\n\n    #\n    # AddHandler allows you to map certain file extensions to \"handlers\":\n    # actions unrelated to filetype. These can be either built into the server\n    # or added with the Action directive (see below)\n    #\n    # To use CGI scripts outside of ScriptAliased directories:\n    # (You will also need to add \"ExecCGI\" to the \"Options\" directive.)\n    #\n    #AddHandler cgi-script .cgi\n\n    # For type maps (negotiated resources):\n    #AddHandler type-map var\n\n    #\n    # Filters allow you to process content before it is sent to the client.\n    #\n    # To parse .shtml files for server-side includes (SSI):\n    # (You will also need to add \"Includes\" to the \"Options\" directive.)\n    #\n    #AddType text/html .shtml\n    #AddOutputFilter INCLUDES .shtml\n</IfModule>\n\n#\n# The mod_mime_magic module allows the server to use various hints from the\n# contents of the file itself to determine its type.  The MIMEMagicFile\n# directive tells the module where the hint definitions are located.\n#\n#MIMEMagicFile /private/etc/apache2/magic\n\n#\n# Customizable error responses come in three flavors:\n# 1) plain text 2) local redirects 3) external redirects\n#\n# Some examples:\n#ErrorDocument 500 \"The server made a boo boo.\"\n#ErrorDocument 404 /missing.html\n#ErrorDocument 404 \"/cgi-bin/missing_handler.pl\"\n#ErrorDocument 402 http://www.example.com/subscription_info.html\n#\n\n#\n# MaxRanges: Maximum number of Ranges in a request before\n# returning the entire resource, or one of the special\n# values 'default', 'none' or 'unlimited'.\n# Default setting is to accept 200 Ranges.\n#MaxRanges unlimited\n\n#\n# EnableMMAP and EnableSendfile: On systems that support it, \n# memory-mapping or the sendfile syscall is used to deliver\n# files.  This usually improves server performance, but must\n# be turned off when serving from networked-mounted \n# filesystems or if support for these functions is otherwise\n# broken on your system.\n#\n#EnableMMAP off\n#EnableSendfile off\n\n# 6894961\nTraceEnable off\n\n# Supplemental configuration\n#\n# The configuration files in the /private/etc/apache2/extra/ directory can be \n# included to add extra features or to modify the default configuration of \n# the server, or you may simply copy their contents here and change as \n# necessary.\n\n# Server-pool management (MPM specific)\nInclude /private/etc/apache2/extra/httpd-mpm.conf\n\n# Multi-language error messages\n#Include /private/etc/apache2/extra/httpd-multilang-errordoc.conf\n\n# Fancy directory listings\nInclude /private/etc/apache2/extra/httpd-autoindex.conf\n\n# Language settings\nInclude /private/etc/apache2/extra/httpd-languages.conf\n\n# User home directories\nInclude /private/etc/apache2/extra/httpd-userdir.conf\n\n# Real-time info on requests and configuration\n#Include /private/etc/apache2/extra/httpd-info.conf\n\n# Virtual hosts\n#Include /private/etc/apache2/extra/httpd-vhosts.conf\n\n# Local access to the Apache HTTP Server Manual\nInclude /private/etc/apache2/extra/httpd-manual.conf\n\n# Distributed authoring and versioning (WebDAV)\n#Include /private/etc/apache2/extra/httpd-dav.conf\n\n# Various default settings\n#Include /private/etc/apache2/extra/httpd-default.conf\n\n# Secure (SSL/TLS) connections\n#Include /private/etc/apache2/extra/httpd-ssl.conf\n#\n# Note: The following must must be present to support\n#       starting without SSL on platforms with no /dev/random equivalent\n#       but a statically compiled-in mod_ssl.\n#\n<IfModule ssl_module>\nSSLRandomSeed startup builtin\nSSLRandomSeed connect builtin\n</IfModule>\n\nInclude /private/etc/apache2/other/*.conf\n"
  },
  {
    "path": "src/test/resources/samples/langs/Apex/ArrayUtils.cls",
    "content": "/* ============================================================\n * This code is part of the \"apex-lang\" open source project avaiable at:\n * \n *      http://code.google.com/p/apex-lang/\n *\n * This code is licensed under the Apache License, Version 2.0.  You may obtain a \n * copy of the License at:\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * ============================================================\n */\nglobal class ArrayUtils {   \n    \n    global static String[] EMPTY_STRING_ARRAY = new String[]{};\n    global static Integer MAX_NUMBER_OF_ELEMENTS_IN_LIST {get{return 1000;}}\n    \n    global static List<String> objectToString(List<Object> objects){\n        List<String> strings = null;\n        if(objects != null){\n        \tstrings = new List<String>();\n        \tif(objects.size() > 0){\n\t            for(Object obj : objects){\n\t                if(obj instanceof String){\n\t                    strings.add((String)obj);\n\t                }\n\t            }\n        \t}\n        }\n        return strings;\n    }\n\n    global static Object[] reverse(Object[] anArray) {\n        if (anArray == null) {\n            return null;\n        }\n        Integer i = 0;\n        Integer j = anArray.size() - 1;\n        Object tmp;\n        while (j > i) {\n            tmp = anArray[j];\n            anArray[j] = anArray[i];\n            anArray[i] = tmp;\n            j--;\n            i++;\n        }\n        return anArray;\n    }\n    \n    global static SObject[] reverse(SObject[] anArray) {\n        if (anArray == null) {\n            return null;\n        }\n        Integer i = 0;\n        Integer j = anArray.size() - 1;\n        SObject tmp;\n        while (j > i) {\n            tmp = anArray[j];\n            anArray[j] = anArray[i];\n            anArray[i] = tmp;\n            j--;\n            i++;\n        }\n        return anArray;\n    }\n    \n    global static List<String> lowerCase(List<String> strs){\n        List<String> returnValue = null;\n        if(strs != null){\n            returnValue = new List<String>();\n        \tif(strs.size() > 0){\n\t            for(String str : strs){\n\t                returnValue.add(str == null ? null : str.toLowerCase());\n\t            }\n            }\n        }\n        return returnValue;\n    }\n    \n    global static List<String> upperCase(List<String> strs){\n        List<String> returnValue = null;\n        if(strs != null){\n            returnValue = new List<String>();\n            if(strs.size() > 0){\n\t            for(String str : strs){\n\t                returnValue.add(str == null ? null : str.toUpperCase());\n\t            }\n            }\n        }\n        return returnValue;\n    }\n    \n    global static List<String> trim(List<String> strs){\n        List<String> returnValue = null;\n        if(strs != null){\n            returnValue = new List<String>();\n            if(strs.size() > 0){\n\t            for(String str : strs){\n\t                returnValue.add(str == null ? null : str.trim());\n\t            }\n            }\n        }\n        return returnValue;\n    }\n    \n    global static Object[] mergex(Object[] array1, Object[] array2){\n        if(array1 == null){ return array2; }\n        if(array2 == null){ return array1; }\n        Object[] merged = new Object[array1.size() + array2.size()];\n        for(Integer i = 0; i < array1.size(); i++){\n            merged[i] = array1[i];\n        }\n        for(Integer i = 0; i < array2.size(); i++){\n            merged[i+array1.size()] = array2[i];\n        }\n        return merged;\n    }   \n     \n    global static SObject[] mergex(SObject[] array1, SObject[] array2){\n        if(array1 == null){ return array2; }\n        if(array2 == null){ return array1; }\n        if(array1.size() <= 0){ return array2; }\n        List<SObject> merged = new List<SObject>();\n        for(SObject sObj : array1){ merged.add(sObj); }\n        for(SObject sObj : array2){ merged.add(sObj); }\n        return merged;\n    }   \n    \n    global static Boolean isEmpty(Object[] objectArray){\n        if(objectArray == null){\n            return true;\n        }\n        return objectArray.size() == 0;\n    }\n    \n    global static Boolean isEmpty(SObject[] objectArray){\n        if(objectArray == null){\n            return true;\n        }\n        return objectArray.size() == 0;\n    }\n    \n    global static Boolean isNotEmpty(Object[] objectArray){\n        return !isEmpty(objectArray);\n    }\n    \n    global static Boolean isNotEmpty(SObject[] objectArray){\n        return !isEmpty(objectArray);\n    }\n    \n    global static Object[] pluck(SObject[] objectArray, String fieldName){\n        if(isEmpty(objectArray) || fieldName == null || fieldName.trim() == null || fieldName.trim().length() == 0){\n            return new Object[]{};\n        }\n        Object[] plucked = new Object[objectArray.size()];\n        for(Integer i = 0; i < objectArray.size(); i++){\n            plucked[i] = objectArray[i].get(fieldName);\n        }\n        return plucked;\n    }\n    \n    \n    global static String toString(Object[] objectArray){\n        if(objectArray == null){\n            return 'null';    \n        }\n        String returnValue = '{';\n        for(Integer i = 0; i < objectArray.size(); i++){\n            if(i!=0){ returnValue += ','; }\n            returnValue += '\\'' + objectArray[i] + '\\'';\n        }\n        returnValue += '}';\n        return returnValue; \n    }\n    \n    global static String toString(SObject[] objectArray){\n        if(objectArray == null){\n            return 'null';    \n        }\n        String returnValue = '{';\n        for(Integer i = 0; i < objectArray.size(); i++){\n            if(i!=0){ returnValue += ','; }\n            returnValue += '\\'' + objectArray[i] + '\\'';\n        }\n        returnValue += '}';\n        return returnValue; \n    }\n    \n    global static void assertArraysAreEqual(Object[] expected, Object[] actual){\n        //check to see if one param is null but the other is not\n        System.assert((expected == null && actual == null)|| (expected != null && actual != null),\n            'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n        if(expected != null && actual != null){\n            System.assert(expected.size() == actual.size(), 'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n            for(Integer i = 0; i < expected.size(); i++){\n                System.assert(expected[i] == actual[i], 'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n            }\n        }\n    }\n    \n    global static void assertArraysAreEqual(SObject[] expected, SObject[] actual){\n        //check to see if one param is null but the other is not\n        System.assert((expected == null && actual == null)|| (expected != null && actual != null),\n            'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n        if(expected != null && actual != null){\n            System.assert(expected.size() == actual.size(), 'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n            for(Integer i = 0; i < expected.size(); i++){\n                System.assert(expected[i] == actual[i], 'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n            }\n        }\n    }\n    \n    global static List<Object> merg(List<Object> list1, List<Object> list2) {\n        List<Object> returnList = new List<Object>();\n        if(list1 != null && list2 != null && (list1.size()+list2.size()) > MAX_NUMBER_OF_ELEMENTS_IN_LIST){\n            throw new IllegalArgumentException('Lists cannot be merged because new list would be greater than maximum number of elements in a list: ' + MAX_NUMBER_OF_ELEMENTS_IN_LIST);\n        }\n        if(isNotEmpty(list1)){\n            for(Object elmt : list1){\n                returnList.add(elmt);\n            }\n        }\n        if(isNotEmpty(list2)){\n            for(Object elmt : list2){\n                returnList.add(elmt);\n            }\n        }\n        return returnList;\n    }\n\n    \n    global static List<SObject> merg(List<SObject> list1, List<SObject> list2) {\n        if(list1 != null && list2 != null && (list1.size()+list2.size()) > MAX_NUMBER_OF_ELEMENTS_IN_LIST){\n            throw new IllegalArgumentException('Lists cannot be merged because new list would be greater than maximum number of elements in a list: ' + MAX_NUMBER_OF_ELEMENTS_IN_LIST);\n        }\n        if(isEmpty(list1) && isEmpty(list2)){\n            return null;\n        }\n        List<SObject> returnList = new List<SObject>();\n        if(list1 != null){\n            for(SObject elmt : list1){\n                returnList.add(elmt);\n            }\n        }\n        if(list2 != null){\n            for(SObject elmt : list2){\n                returnList.add(elmt);\n            }\n        }\n        return returnList;\n    }\n    \n    global static List<Object> subset(List<Object> aList, Integer count) {\n        return subset(aList,0,count);\n    }\n\n    global static List<Object> subset(List<Object> list1, Integer startIndex, Integer count) {\n        List<Object> returnList = new List<Object>();\n        if(list1 != null && list1.size() > 0 && startIndex >= 0 && startIndex <= list1.size()-1 && count > 0){\n            for(Integer i = startIndex; i < list1.size() && i - startIndex < count; i++){\n                returnList.add(list1.get(i));\n            }\n        }\n        return returnList;\n    }\n\n    \n    global static List<SObject> subset(List<SObject> aList, Integer count) {\n        return subset(aList,0,count);\n    }\n\n    global static List<SObject> subset(List<SObject> list1, Integer startIndex, Integer count) {\n        List<SObject> returnList = null;\n        if(list1 != null && list1.size() > 0 && startIndex <= list1.size()-1 && count > 0){\n            returnList = new List<SObject>();\n            for(Integer i = startIndex; i < list1.size() && i - startIndex < count; i++){\n                returnList.add(list1.get(i));\n            }\n        }\n        return returnList;\n    }\n    \n    //===============================================\n    //LIST/ARRAY SORTING\n    //===============================================\n\n    //FOR FORCE.COM PRIMITIVES (Double,Integer,ID,etc.):\n    global static List<Object> qsort(List<Object> theList) {\n        return qsort(theList,new PrimitiveComparator());\n    }\n\n    global static List<Object> qsort(List<Object> theList, Boolean sortAsc) {\n        return qsort(theList,new PrimitiveComparator(),sortAsc);\n    }\n    \n    global static List<Object> qsort(List<Object> theList, ObjectComparator comparator) {\n        return qsort(theList,comparator,true);\n    }\n    \n    global static List<Object> qsort(List<Object> theList, ObjectComparator comparator, Boolean sortAsc) {\n        return qsort(theList, 0, (theList == null ? 0 : theList.size()-1),comparator,sortAsc);\n    }\n    \n\n    \n    //FOR SALESFORCE OBJECTS (sObjects):\n    global static List<SObject> qsort(List<SObject> theList, ISObjectComparator comparator) {\n        return qsort(theList,comparator,true);\n    }\n    \n    global static List<SObject> qsort(List<SObject> theList, ISObjectComparator comparator,Boolean sortAsc ) {\n        return qsort(theList,  0, (theList == null ? 0 : theList.size()-1),comparator,sortAsc);\n    }\n\n    private static List<Object> qsort(List<Object> theList,\n                                Integer lo0, \n                                Integer hi0, \n                                ObjectComparator comparator,\n                                Boolean sortAsc){\n        Integer lo = lo0;\n        Integer hi = hi0;\n     \n        if (lo >= hi) {\n            return theList;\n        } else if( lo == hi - 1 ) {\n        \n            if (( comparator.compare(theList[lo],theList[hi])>0 && sortAsc) || \n                  (comparator.compare(theList[lo],theList[hi])<0 && !sortAsc)    \n                ) {\n                 Object prs = theList[lo];\n                 theList[lo]         = theList[hi];\n                 theList[hi]         = prs;\n            }\n            return theList;\n        }\n\n        Object pivot = theList[(lo + hi) / 2];\n        theList[(lo + hi) / 2] = theList[hi];\n        theList[hi] = pivot;\n\n        while( lo < hi ) {\n            while ((comparator.compare(theList[lo], pivot)<=0 && lo < hi && sortAsc) || \n                   (comparator.compare(theList[lo], pivot)>=0 && lo < hi && !sortAsc)\n                  ) { lo++; }\n            while (( comparator.compare(pivot,theList[hi])<=0 && lo < hi && sortAsc) ||\n                   ( comparator.compare(pivot,theList[hi])>=0 && lo < hi && !sortAsc)\n                  ) { hi--; }\n            \n            if( lo < hi ){\n                 Object prs = theList[lo];\n                 theList[lo]   = theList[hi];\n                 theList[hi]    = prs;\n            }\n        }\n\n        theList[hi0] = theList[hi];\n        theList[hi] = pivot;\n        \n        qsort(theList, lo0, lo-1,comparator,sortAsc);\n        qsort(theList, hi+1, hi0,comparator,sortAsc);\n        return theList;\n    }    \n        \n    \n    private static List<SObject> qsort(List<SObject> theList,\n                                Integer lo0, \n                                Integer hi0, \n                                ISObjectComparator comparator,\n                                Boolean sortAsc){\n        Integer lo = lo0;\n        Integer hi = hi0;\n     \n        if (lo >= hi) {\n            return theList;\n        } else if( lo == hi - 1 ) {\n        \n            if (( comparator.compare(theList[lo],theList[hi])>0 && sortAsc) || \n                  (comparator.compare(theList[lo],theList[hi])<0 && !sortAsc)    \n                ) {\n                 SObject prs = theList[lo];\n                 theList[lo]         = theList[hi];\n                 theList[hi]         = prs;\n            }\n            return theList;\n        }\n\n        SObject pivot = theList[(lo + hi) / 2];\n        theList[(lo + hi) / 2] = theList[hi];\n        theList[hi] = pivot;\n\n        while( lo < hi ) {\n            while ((comparator.compare(theList[lo], pivot)<=0 && lo < hi && sortAsc) || \n                   (comparator.compare(theList[lo], pivot)>=0 && lo < hi && !sortAsc)\n                  ) { lo++; }\n            while (( comparator.compare(pivot,theList[hi])<=0 && lo < hi && sortAsc) ||\n                   ( comparator.compare(pivot,theList[hi])>=0 && lo < hi && !sortAsc)\n                  ) { hi--; }\n            \n            if( lo < hi ){\n                 SObject prs = theList[lo];\n                 theList[lo]   = theList[hi];\n                 theList[hi]    = prs;\n            }\n        }\n\n        theList[hi0] = theList[hi];\n        theList[hi] = pivot;\n        \n        qsort(theList, lo0, lo-1,comparator,sortAsc);\n        qsort(theList, hi+1, hi0,comparator,sortAsc);\n        return theList;\n    }\n/*\n    global static List<Object> unique(List<Object> theList) {\n        List<Object> uniques = new List<Object>();\n        Set<Object> keys = new Set<Object>(); \n        if(theList != null && theList.size() > 0){\n            for(Object obj : theList){\n                if(keys.contains(obj)){\n                    continue;\n                } else {\n                    keys.add(obj);\n                    uniques.add(obj);\n                }\n            }\n        }\n        return uniques;\n    }\n\n    global static List<SObject> unique(List<SObject> theList) {\n        if(theList == null){\n            return null;\n        }\n        List<SObject> uniques = createEmptySObjectList(theList.get(0));\n        Set<String> keys = new Set<String>(); \n        if(theList != null && theList.size() > 0){\n            String key = null;\n            for(SObject obj : theList){\n                key = obj == null ? null : ''+obj;\n                if(keys.contains(key)){\n                    continue;\n                } else {\n                    keys.add(key);\n                    uniques.add(obj);\n                }\n            }\n        }\n        return uniques;\n    }\n*/\n\n\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Apex/BooleanUtils.cls",
    "content": "/* ============================================================\n * This code is part of the \"apex-lang\" open source project avaiable at:\n * \n *      http://code.google.com/p/apex-lang/\n *\n * This code is licensed under the Apache License, Version 2.0.  You may obtain a \n * copy of the License at:\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * ============================================================\n */\nglobal class BooleanUtils {\n\n    global static Boolean isFalse(Boolean bool)\n    {\n        if(bool==null)\n            return false;\n        else\n            return !bool;\n    }\n    \n    global static Boolean isNotFalse(Boolean bool)\n    {\n        if(bool==null)\n            return true;\n        else\n            return bool;\n    }\n    \n    global static Boolean isNotTrue(Boolean bool)\n    {\n        if(bool==null)\n            return true;\n        else\n            return !bool;\n    }\n    \n    global static Boolean isTrue(Boolean bool)\n    {\n        if(bool==null)\n            return false;\n        else\n            return bool;\n    }\n    \n    global static Boolean negate(Boolean bool)\n    {\n        if(bool==null)\n            return null;\n        else\n            return !bool;\n    }\n    \n    global static Boolean toBooleanDefaultIfNull(Boolean bool, Boolean defaultVal)\n    {\n        if(bool==null)\n            return defaultVal;\n        else\n            return bool;\n    }\n    \n    global static Boolean toBoolean(Integer value)\n    {\n        if(value==null)\n            return false;\n        else\n        {\n            if(value==0)\n                return false;\n            else\n                return true;\n        }\n    }\n    \n    global static Boolean strToBoolean(String value)\r\n    {\r\n        if(value==null)\r\n            return false;\r\n        else\r\n        {\r\n            if(StringUtils.equalsIgnoreCase(value,'true'))\r\n                return true;\r\n            else\r\n                return false;\r\n        }\r\n    }\r\n    \n    /************************************/\n    //Converts an int to a boolean specifying \n    //the conversion values.\n    //    Parameters:\n    //    value - the Integer to convert, may be null\n    //    trueValue - the value to match for true, may be null\n    //    falseValue - the value to match for false, may be null \n    //Returns:\n    //    true or false \n    //Throws:\n    //    java.lang.IllegalArgumentException - if no match\n    /************************************/\n    global static Boolean toBoolean(Integer value,\n                                    Integer trueValue,\n                                    Integer falseValue)\n    {\n        if(value==trueValue)\n            return true;\n        else if(value==falseValue)\n            return false;\n        else\n            throw new IllegalArgumentException();\n    }\n    \n    \n    global static Integer toInteger(Boolean bool)\n    {\n        if(bool==null)\n            throw new IllegalArgumentException();\n        else\n        {\n            if(bool)\n                return 1;\n            else\n                return 0;\n        }\n    }\n    \n    \n    global static String toStringYesNo(Boolean bool)\n    {\n        if(bool==null)\n            return null;\n        else\n        {\n            if(bool)\n                return 'yes';\n            else\n                return 'no';\n        }\n    }\n    \n    global static String toStringYN(Boolean bool)\r\n    {\r\n        if(bool==null)\r\n            return null;\r\n        else\r\n        {\r\n            if(bool)\r\n                return 'Y';\r\n            else\r\n                return 'N';\r\n        }\r\n    }\r\n    \r\n    \r\n    global static String toString(Boolean bool,\n                                  String trueString,\n                                  String falseString)\n    {\n        if(bool==null)\n            return null;        \n        else\n        {\n            if(bool)\n                return trueString;\n            else\n                return falseString;\n        }\n    }\n    \n    global static Boolean xor(Boolean[] boolArray)\n    {\n        if(boolArray==null || boolArray.size()==0)\n            throw new IllegalArgumentException();\n        else\n        {\n            Boolean firstItem=boolArray[0];\n            for(Boolean bool:boolArray)\n            {\n                if(bool!=firstItem)\n                    return false;\n            }\n            return true;\n        }    \n    } \n\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Apex/EmailUtils.cls",
    "content": "/* ============================================================\n * Contributor: Caleb Sidel\n * \n * This code is part of the \"apex-lang\" open source project avaiable at:\n * \n *      http://code.google.com/p/apex-lang/\n *\n * This code is licensed under the Apache License, Version 2.0.  You may obtain a \n * copy of the License at:\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * ============================================================\n */\nglobal class EmailUtils {\n    \n    global static void sendEmailWithStandardAttachments(List<String> recipients,String emailSubject,String body,Boolean useHTML,List<Id> attachmentIDs) {\n        List<Attachment> stdAttachments = [SELECT id, name, body FROM Attachment WHERE Id IN:attachmentIDs];\n        sendEmailWithStandardAttachments(recipients, emailSubject, body, useHTML, stdAttachments);\n    }\n    \n    global static void sendEmailWithStandardAttachments(List<String> recipients,String emailSubject,String body,Boolean useHTML,List<Attachment> stdAttachments) {\n        List<Messaging.EmailFileAttachment> fileAttachments = new List<Messaging.EmailFileAttachment>();\n        \n        for(Attachment attachment : stdAttachments) {\n            Messaging.EmailFileAttachment fileAttachment = new Messaging.EmailFileAttachment();\n            fileAttachment.setFileName(attachment.Name);\n            fileAttachment.setBody(attachment.Body);\n            fileAttachments.add(fileAttachment);\n        }\n        sendEmail(recipients, emailSubject, body, useHTML, fileAttachments);\n    }\n     \n    global static void sendTextEmail(List<String> recipients,String emailSubject,String textBody) { \n        sendEmail(recipients, emailSubject, textBody, false, null);\n    }\n    \n    global static void sendHTMLEmail(List<String> recipients,String emailSubject,String htmlBody) { \n        sendEmail(recipients, emailSubject, htmlBody, true, null);\n    }\n    \n    global static void sendEmail(List<String> recipients,String emailSubject,String body,Boolean useHTML,List<Messaging.EmailFileAttachment> fileAttachments) { \n        if(recipients == null) return;\n        if(recipients.size() == 0) return;\n        // Create a new single email message object\n        // that will send out a single email to the addresses in the To, CC & BCC list.\n        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();        \n        //the email is not saved as an activity.\n        mail.setSaveAsActivity(false);\n        // Assign the addresses for the To lists to the mail object.\n        mail.setToAddresses(recipients);          \n        // Specify the subject line for your email address.\n        mail.setSubject(emailSubject);\n        // Set to True if you want to BCC yourself on the email.\n        mail.setBccSender(false);\n        // The email address of the user executing the Apex Code will be used.\n        mail.setUseSignature(false);\n        if (useHTML) {\n            // Specify the html content of the email.\n            mail.setHtmlBody(body);\n        } else {\n            // Specify the text content of the email.\n            mail.setPlainTextBody(body);\n        }\n        // Specify FileAttachments\n        if(fileAttachments != null && fileAttachments.size() > 0) {\n            mail.setFileAttachments(fileAttachments);\n        }\n        // Send the email you have created.\n        Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });\n    }\n\n    /**\n     * null     => false\n     * ''       => false\n     * ' '      => false\n     * 'x'      => false\n     * 'x@'     => false\n     * 'x@x'    => false\n     * 'x@x.x'  => true\n     */\n    global static Boolean isValidEmailAddress(String str){\n        if(str != null && str.trim() != null && str.trim().length() > 0){\n            String[] split = str.split('@');\n            if(split != null && split.size() == 2){\n\t            split = split[1].split('\\\\.');\n\t            if(split != null && split.size() >= 2){\n\t                return true;\n\t            }\n            }\n        }\n        return false;\n    }\n\n    global static Boolean isNotValidEmailAddress(String str){\n    \treturn !isValidEmailAddress(str);\n    }\n\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Apex/GeoUtils.cls",
    "content": "public class GeoUtils {\n\t// generate a KML string given a page reference, call getContent() \n\t// then cleanup the output.\n\tpublic static string generateFromContent(PageReference pr) { \n\t\tstring ret = ''; \n\t\ttry {  \n\t        ret = (string) pr.getContent().toString();\n\t\t\t\n\t\t\tret = ret.replaceAll('\"','\\'' ); // get content produces quote chars \\\"  \n\t        ret = ret.replaceAll( '&','&amp;');// we need to escape these in the node value\n        } catch (exception e ) { \n        \tsystem.debug( 'ERROR '+e); \n        }\n   \t\t\n   \t\tret = ret.replaceAll('\\n',' ');\t// must use ALL since many new line may get \n        ret = ret.replaceAll('\\r',' ');\t// get these also!\n      //  system.debug( ret); // dump the KML \n        return ret ;\n\t}\n\t\n\tpublic static Map<String, String> geo_response = new Map<String, String>{'200'=>'G_GEO_SUCCESS',\n    '400'=>'G_GEO_BAD_REQUEST',\n    '500'=>'G_GEO_SERVER_ERROR',\n    '601'=>'G_GEO_MISSING_ADDRESS',\n    '602'=>'G_GEO_UNKNOWN_ADDRESS',\n    '603'=>'G_GEO_UNAVAILABLE_ADDRESS',\n    '604'=>'G_GEO_UNKNOWN_DIRECTIONS',\n    '610'=>'G_GEO_BAD_KEY',\n    '620'=>'G_GEO_TOO_MANY_QUERIES'\n    };\n        \n\tpublic static string accountAddressString ( account acct ) {\n    \t// form an address string given an account object\n    \tstring adr = acct.billingstreet + ',' + acct.billingcity + ',' + acct.billingstate; \n        if ( acct.billingpostalcode != null ) adr += ',' + acct.billingpostalcode; \n        if ( acct.billingcountry != null ) adr += ',' + acct.billingcountry; \n        adr = adr.replaceAll('\\\"', '' );\n        adr = adr.replaceAll('\\'', '' );\n        adr = adr.replaceAll( '\\n', ' ' );    \n        adr = adr.replaceAll( '\\r', ' ' );    \n        system.debug( adr );  \n        return adr;\t\n    }\n    \n\tpublic static testmethod void t1() { \n\t\tPageReference pageRef =  Page.kmlPreviewTemplate;\n        Test.setCurrentPage(pageRef);\n        system.assert ( GeoUtils.generateFromContent( pageRef ) != null );\n        Account a =  new Account( name='foo', billingstreet='main', billingcity='springfield',billingstate='il',\n         billingpostalcode='9',billingcountry='us');\n        insert a;\n        system.assertEquals( 'main,springfield,il,9,us',accountAddressString( a) );\n       \n\t}\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Apex/LanguageUtils.cls",
    "content": "/* ============================================================\n * This code is part of the \"apex-lang\" open source project avaiable at:\n * \n *      http://code.google.com/p/apex-lang/\n *\n * This code is licensed under the Apache License, Version 2.0.  You may obtain a \n * copy of the License at:\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * ============================================================\n */\nglobal class LanguageUtils {\n\n    global static final String HTTP_LANGUAGE_CODE_PARAMETER_KEY = 'l';\n\tglobal static final String DEFAULT_LANGUAGE_CODE = 'en_us';\n\n    global static Set<String> SUPPORTED_LANGUAGE_CODES = new Set<String>{\n        'zh-cn'         //Chinese (Simplified)\n        ,'zh-tw'        //Chinese (Traditional)\n        ,'nl-nl'        //Dutch\n        ,'en-us'        //English\n        ,'fi'           //Finnish\n        ,'fr'           //French\n        ,'de'           //German\n        ,'it'           //Italian\n        ,'ja'           //Japanese\n        ,'ko'           //Korean\n        ,'pl'           //Polish\n        ,'pt-br'        //Portuguese (Brazilian)\n        ,'ru'           //Russian\n        ,'es'           //Spanish\n        ,'sv'           //Swedish\n        ,'th'           //Thai\n        ,'cs'           //Czech\n        ,'da'           //Danish\n        ,'hu'           //Hungarian\n        ,'in'           //Indonesian\n        ,'tr'           //Turkish\n    };\n    \n    private static Map<String,String> DEFAULTS = new Map<String,String>{\n        'en'=>'en-us'\n        ,'zh'=>'zh-cn'\n        ,'nl'=>'nl-nl'\n        ,'pt'=>'pt-br'\n    };\n    \n\n    global static String getLangCodeByHttpParam(){\n    \tString returnValue = null;\n        final Set<String> LANGUAGE_CODE_SET = getSuppLangCodeSet();\n        if(ApexPages.currentPage() != null && ApexPages.currentPage().getParameters() != null){\n\t        String LANGUAGE_HTTP_PARAMETER = \n\t            StringUtils.lowerCase(\n\t                StringUtils.replaceChars( \n\t                    ApexPages.currentPage().getParameters().get(HTTP_LANGUAGE_CODE_PARAMETER_KEY)\n\t                    , '_' //underscore\n\t                    , '-' //dash\n\t                )\n\t            );\n\t        if(DEFAULTS.containsKey(LANGUAGE_HTTP_PARAMETER)){\n\t            LANGUAGE_HTTP_PARAMETER = DEFAULTS.get(LANGUAGE_HTTP_PARAMETER);\n\t        }\n\t        if(StringUtils.isNotBlank(LANGUAGE_HTTP_PARAMETER)\n\t            && SUPPORTED_LANGUAGE_CODES.contains(LANGUAGE_HTTP_PARAMETER)){\n\t            returnValue = LANGUAGE_HTTP_PARAMETER;\n\t        }        \n        }\n        return returnValue;\n    }\n\n    global static String getLangCodeByBrowser(){\n        final String LANGUAGES_FROM_BROWSER_AS_STRING = ApexPages.currentPage().getHeaders().get('Accept-Language');\n        final List<String> LANGUAGES_FROM_BROWSER_AS_LIST = splitAndFilterAcceptLanguageHeader(LANGUAGES_FROM_BROWSER_AS_STRING);\n        if(LANGUAGES_FROM_BROWSER_AS_LIST != null && LANGUAGES_FROM_BROWSER_AS_LIST.size() > 0){\n            for(String languageFromBrowser : LANGUAGES_FROM_BROWSER_AS_LIST){\n                if(DEFAULTS.containsKey(languageFromBrowser)){\n                    languageFromBrowser = DEFAULTS.get(languageFromBrowser);\n                }\n                if(SUPPORTED_LANGUAGE_CODES.contains(languageFromBrowser)){\n                    return languageFromBrowser;\n                }\n            }               \n        }\n        return null;\n    }\n    \n    global static String getLangCodeByUser(){\n        return UserInfo.getLanguage();\n    }\n    \n    global static String getLangCodeByHttpParamOrIfNullThenBrowser(){\n        return StringUtils.defaultString(getLangCodeByHttpParam(),getLangCodeByBrowser());\n    }\n\n    global static String getLangCodeByHttpParamOrIfNullThenUser(){\n        return StringUtils.defaultString(getLangCodeByHttpParam(),getLangCodeByUser());\n    }\n    \n    global static String getLangCodeByBrowserOrIfNullThenHttpParam(){\n        return StringUtils.defaultString(getLangCodeByBrowser(),getLangCodeByHttpParam());\n    }\n    \n    global static String getLangCodeByBrowserOrIfNullThenUser(){\n        return StringUtils.defaultString(getLangCodeByBrowser(),getLangCodeByUser());\n    }\n    \n    private static List<String> splitAndFilterAcceptLanguageHeader(String header){\n        List<String> returnList = new List<String>();\n        String[] tokens = StringUtils.split(header,',');\n        if(tokens != null){\n            for(String token : tokens){\n                if(token != null ){\n                    if(token.contains(';')){\n                        token = token.substring(0,token.indexOf(';',0));\n                    }\n                    returnList.add(token);\n                    if(StringUtils.length(token) > 2){\n                        returnList.add(StringUtils.substring(token,0,2));\n                    }\n                }\n            }       \n        }\n        return returnList;\n    }\n    \n    private static Set<String> getSuppLangCodeSet(){\n        Set<String> langCodes = new Set<String>();\n        for(String langCode : SUPPORTED_LANGUAGE_CODES){\n            if(langCode != null){ \n                langCodes.add(StringUtils.lowerCase(langCode));\n            }\n        }\n        return langCodes;\n    }\n\n\t\n\tglobal static String getLanguageName(String displayLanguageCode, String languageCode){\n\t\treturn translatedLanguageNames.get(filterLanguageCode(displayLanguageCode)).get(filterLanguageCode(languageCode));\n\t}\n\t\n\tglobal static Map<String,String> getAllLanguages(){\n\t\treturn getAllLanguages(DEFAULT_LANGUAGE_CODE);\n\t}\n\t\n\tglobal static Map<String,String> getAllLanguages(String displayLanguageCode){\n\t\treturn translatedLanguageNames.get(filterLanguageCode(displayLanguageCode));\n\t}\n\t\n\tprivate static String filterLanguageCode(String displayLanguageCode){\n\t\tdisplayLanguageCode = StringUtils.lowerCase(displayLanguageCode);\n\t\tif(DEFAULTS.containsKey(displayLanguageCode)){\n\t\t\tdisplayLanguageCode = StringUtils.replaceChars(DEFAULTS.get(displayLanguageCode),'-','_');\n\t\t}\n\t\tif(!translatedLanguageNames.containsKey(displayLanguageCode)){\n\t\t\tdisplayLanguageCode = DEFAULT_LANGUAGE_CODE; \n\t\t}\n\t\treturn displayLanguageCode;\n\t}\n\n\tprivate static final Map<String,Map<String,String>> translatedLanguageNames = new Map<String,Map<String,String>>{\n\t\t'cs'=> new Map<String,String>{\n'cs'=>'Čeština'\n,'da'=>'Dánština'\n,'de'=>'Němčina'\n,'en_us'=>'Angličtina (Spojené státy)'\n,'es'=>'Španělština'\n,'es_mx'=>'Mexická španělština'\n,'fi'=>'Finština'\n,'fr'=>'Francouzština'\n,'hu'=>'Maďarština'\n,'in'=>'Indonéština'\n,'it'=>'Italština'\n,'ja'=>'Japonština'\n,'ko'=>'Korejština'\n,'nl_nl'=>'Nizozemština'\n,'pl'=>'Polština'\n,'pt_br'=>'Portugalština (Brazílie)'\n,'ro'=>'Rumunština'\n,'ru'=>'Ruština'\n,'sv'=>'Švédština'\n,'th'=>'Thajská'\n,'tr'=>'Turečtina'\n,'zh_cn'=>'Čínština (zjednodušená)'\n,'zh_tw'=>'Čínština (tradiční)'\n}\n,'da'=> new Map<String,String>{\n'cs'=>'Tjekkisk'\n,'da'=>'Dansk'\n,'de'=>'Tysk'\n,'en_us'=>'Engelsk (USA)'\n,'es'=>'Spansk'\n,'es_mx'=>'Mexicansk spansk'\n,'fi'=>'Finsk'\n,'fr'=>'Fransk'\n,'hu'=>'Ungarsk'\n,'in'=>'Indonesisk'\n,'it'=>'Italiensk'\n,'ja'=>'Japansk'\n,'ko'=>'Koreansk'\n,'nl_nl'=>'Hollandsk'\n,'pl'=>'Polsk'\n,'pt_br'=>'Portugisisk (Brasilien)'\n,'ro'=>'Rumænsk'\n,'ru'=>'Russisk'\n,'sv'=>'Svensk'\n,'th'=>'Thai'\n,'tr'=>'Tyrkisk'\n,'zh_cn'=>'Kinesisk (forenklet)'\n,'zh_tw'=>'Kinesisk (traditionelt)'\n}\n,'de'=> new Map<String,String>{\n'cs'=>'Tschechisch'\n,'da'=>'Dänisch'\n,'de'=>'Deutsch'\n,'en_us'=>'Englisch (Vereinigte Staaten)'\n,'es'=>'Spanisch'\n,'es_mx'=>'Mexican Spanish'\n,'fi'=>'Finnisch'\n,'fr'=>'Französisch'\n,'hu'=>'Ungarisch'\n,'in'=>'Indonesisch'\n,'it'=>'Italienisch'\n,'ja'=>'Japanisch'\n,'ko'=>'Koreanisch'\n,'nl_nl'=>'Niederländisch'\n,'pl'=>'Polnisch'\n,'pt_br'=>'Portugiesisch (Brasilien)'\n,'ro'=>'Rumänisch'\n,'ru'=>'Russisch'\n,'sv'=>'Schwedisch'\n,'th'=>'Thai'\n,'tr'=>'Türkisch'\n,'zh_cn'=>'Chinesisch (Taiwan)'\n,'zh_tw'=>'Chinesisch (traditionell)'\n}\n,'en_us'=> new Map<String,String>{\n'cs'=>'Czech'\n,'da'=>'Danish'\n,'de'=>'German'\n,'en_us'=>'English (United States)'\n,'es'=>'Spanish'\n,'es_mx'=>'Mexican Spanish'\n,'fi'=>'Finnish'\n,'fr'=>'French'\n,'hu'=>'Hungarian'\n,'in'=>'Indonesian'\n,'it'=>'Italian'\n,'ja'=>'Japanese'\n,'ko'=>'Korean'\n,'nl_nl'=>'Dutch'\n,'pl'=>'Polish'\n,'pt_br'=>'Portuguese (Brazilian)'\n,'ro'=>'Romanian'\n,'ru'=>'Russian'\n,'sv'=>'Swedish'\n,'th'=>'Thai'\n,'tr'=>'Turkish'\n,'zh_cn'=>'Chinese (Simplified)'\n,'zh_tw'=>'Chinese (Traditional)'\n}\n,'es'=> new Map<String,String>{\n'cs'=>'Checa'\n,'da'=>'Danés'\n,'de'=>'Alemán'\n,'en_us'=>'Inglés (Estados Unidos)'\n,'es'=>'Español'\n,'es_mx'=>'El español de México'\n,'fi'=>'Finlandés'\n,'fr'=>'Francés'\n,'hu'=>'Húngaro'\n,'in'=>'Indonesia'\n,'it'=>'Italiano'\n,'ja'=>'Japonés'\n,'ko'=>'Corea'\n,'nl_nl'=>'Neerlandés'\n,'pl'=>'Polaco'\n,'pt_br'=>'Portugués (brasileño)'\n,'ro'=>'Rumano'\n,'ru'=>'Rusia'\n,'sv'=>'Sueco'\n,'th'=>'Tailandia'\n,'tr'=>'Turquía'\n,'zh_cn'=>'Chino (simplificado)'\n,'zh_tw'=>'Chino (tradicional)'\n}\n,'es_mx'=> new Map<String,String>{\n'cs'=>'Checa'\n,'da'=>'Danés'\n,'de'=>'Alemán'\n,'en_us'=>'Inglés (Estados Unidos)'\n,'es'=>'Español'\n,'es_mx'=>'El español de México'\n,'fi'=>'Finlandés'\n,'fr'=>'Francés'\n,'hu'=>'Húngaro'\n,'in'=>'Indonesia'\n,'it'=>'Italiano'\n,'ja'=>'Japonés'\n,'ko'=>'Corea'\n,'nl_nl'=>'Neerlandés'\n,'pl'=>'Polaco'\n,'pt_br'=>'Portugués (brasileño)'\n,'ro'=>'Rumano'\n,'ru'=>'Rusia'\n,'sv'=>'Sueco'\n,'th'=>'Tailandia'\n,'tr'=>'Turquía'\n,'zh_cn'=>'Chino (simplificado)'\n,'zh_tw'=>'Chino (tradicional)'\n}\n,'fi'=> new Map<String,String>{\n'cs'=>'Tšekki'\n,'da'=>'Tanska'\n,'de'=>'Saksa'\n,'en_us'=>'Englanti (Yhdysvallat)'\n,'es'=>'Espanja'\n,'es_mx'=>'Meksikon espanja'\n,'fi'=>'Suomen'\n,'fr'=>'Ranska'\n,'hu'=>'Unkari'\n,'in'=>'Indonesia'\n,'it'=>'Italia'\n,'ja'=>'Japani'\n,'ko'=>'Korea'\n,'nl_nl'=>'Hollanti'\n,'pl'=>'Puola'\n,'pt_br'=>'Portugali (Brasilia)'\n,'ro'=>'Romania'\n,'ru'=>'Venäjä'\n,'sv'=>'Ruotsi'\n,'th'=>'Thaimaalaisen'\n,'tr'=>'Turkki'\n,'zh_cn'=>'Kiina (yksinkertaistettu)'\n,'zh_tw'=>'Kiina (perinteinen)'\n}\n,'fr'=> new Map<String,String>{\n'cs'=>'Tchèque'\n,'da'=>'Danois'\n,'de'=>'Allemand'\n,'en_us'=>'Anglais (Etats Unis)'\n,'es'=>'Espagnol'\n,'es_mx'=>'Espagnol mexicain'\n,'fi'=>'Finnois'\n,'fr'=>'Français'\n,'hu'=>'Hongrois'\n,'in'=>'Indonésien'\n,'it'=>'Italien'\n,'ja'=>'Japonais'\n,'ko'=>'Coréen'\n,'nl_nl'=>'Néerlandais'\n,'pl'=>'Polonais'\n,'pt_br'=>'Portugais (brésilien)'\n,'ro'=>'Roumain'\n,'ru'=>'Russe'\n,'sv'=>'Suédois'\n,'th'=>'Thai'\n,'tr'=>'Turc'\n,'zh_cn'=>'Chinois (simplifié)'\n,'zh_tw'=>'Chinois (Traditionnel)'\n}\n,'hu'=> new Map<String,String>{\n'cs'=>'Cseh'\n,'da'=>'Dán'\n,'de'=>'Német'\n,'en_us'=>'Angol (Egyesült Államok)'\n,'es'=>'Spanyol'\n,'es_mx'=>'Mexikói spanyol'\n,'fi'=>'Finn'\n,'fr'=>'Francia'\n,'hu'=>'Magyar'\n,'in'=>'Indonéz'\n,'it'=>'Olasz'\n,'ja'=>'Japán'\n,'ko'=>'Koreai'\n,'nl_nl'=>'Holland'\n,'pl'=>'Lengyel'\n,'pt_br'=>'Portugál (brazíliai)'\n,'ro'=>'Román'\n,'ru'=>'Orosz'\n,'sv'=>'Svéd'\n,'th'=>'Thaiföldi'\n,'tr'=>'Török'\n,'zh_cn'=>'Kínai (egyszerűsített)'\n,'zh_tw'=>'Kínai (hagyományos)'\n}\n,'in'=> new Map<String,String>{\n'cs'=>'Ceko'\n,'da'=>'Denmark'\n,'de'=>'Jerman'\n,'en_us'=>'Inggris (Amerika Serikat)'\n,'es'=>'Spanyol'\n,'es_mx'=>'Meksiko Spanyol'\n,'fi'=>'Finlandia'\n,'fr'=>'Prancis'\n,'hu'=>'Hungaria'\n,'in'=>'Indonesia'\n,'it'=>'Italia'\n,'ja'=>'Jepang'\n,'ko'=>'Korea'\n,'nl_nl'=>'Belanda'\n,'pl'=>'Polish'\n,'pt_br'=>'Portugis (Brasil)'\n,'ro'=>'Romanian'\n,'ru'=>'Russian'\n,'sv'=>'Swedia'\n,'th'=>'Thai'\n,'tr'=>'Turkish'\n,'zh_cn'=>'Cina (Sederhana)'\n,'zh_tw'=>'Cina (Tradisional)'\n}\n,'it'=> new Map<String,String>{\n'cs'=>'Ceco'\n,'da'=>'Danese'\n,'de'=>'Tedesco'\n,'en_us'=>'Inglese (Stati Uniti)'\n,'es'=>'Spagnolo'\n,'es_mx'=>'Spagnolo messicano'\n,'fi'=>'Finlandese'\n,'fr'=>'Francese'\n,'hu'=>'Ungherese'\n,'in'=>'Indonesiano'\n,'it'=>'Italiano'\n,'ja'=>'Giapponese'\n,'ko'=>'Coreano'\n,'nl_nl'=>'Olandese'\n,'pl'=>'Polacco'\n,'pt_br'=>'Portoghese (brasiliano)'\n,'ro'=>'Rumeno'\n,'ru'=>'Russo'\n,'sv'=>'Svedese'\n,'th'=>'Thai'\n,'tr'=>'Turco'\n,'zh_cn'=>'Cinese (semplificato)'\n,'zh_tw'=>'Cinese (tradizionale)'\n}\n,'ja'=> new Map<String,String>{\n'cs'=>'チェコ語'\n,'da'=>'デンマーク語'\n,'de'=>'ドイツ語'\n,'en_us'=>'英語（アメリカ合衆国）'\n,'es'=>'スペイン語'\n,'es_mx'=>'メキシコのスペイン語'\n,'fi'=>'フィンランド語'\n,'fr'=>'フランス語'\n,'hu'=>'ハンガリー語'\n,'in'=>'インドネシア語'\n,'it'=>'イタリア語'\n,'ja'=>'日本語'\n,'ko'=>'韓国語'\n,'nl_nl'=>'オランダ語'\n,'pl'=>'ポーランド語'\n,'pt_br'=>'ポルトガル語（ブラジル）'\n,'ro'=>'ルーマニア語'\n,'ru'=>'ロシア語'\n,'sv'=>'スウェーデン語'\n,'th'=>'タイ'\n,'tr'=>'トルコ語'\n,'zh_cn'=>'中国語（簡体字）'\n,'zh_tw'=>'中国語（繁体字）'\n}\n,'ko'=> new Map<String,String>{\n'cs'=>'체코어'\n,'da'=>'덴마크어'\n,'de'=>'독일어'\n,'en_us'=>'영어 (미국)'\n,'es'=>'스페인어'\n,'es_mx'=>'멕시코 스페인'\n,'fi'=>'핀란드어'\n,'fr'=>'프랑스어'\n,'hu'=>'헝가리어'\n,'in'=>'인도네시 아어'\n,'it'=>'이탈리아어'\n,'ja'=>'일본어'\n,'ko'=>'한국어'\n,'nl_nl'=>'네덜란드'\n,'pl'=>'폴란드어'\n,'pt_br'=>'포르투갈어 (브라질)'\n,'ro'=>'루마니아어'\n,'ru'=>'러시아어'\n,'sv'=>'스웨덴어'\n,'th'=>'타이어'\n,'tr'=>'터키어'\n,'zh_cn'=>'중국어 (간체)'\n,'zh_tw'=>'중국어 (번체)'\n}\n,'nl_nl'=> new Map<String,String>{\n'cs'=>'Tsjechisch'\n,'da'=>'Deens'\n,'de'=>'Duits'\n,'en_us'=>'Engels (Verenigde Staten)'\n,'es'=>'Spaans'\n,'es_mx'=>'Mexicaans Spaans'\n,'fi'=>'Fins'\n,'fr'=>'Frans'\n,'hu'=>'Hongaars'\n,'in'=>'Indonesisch'\n,'it'=>'Italiaans'\n,'ja'=>'Japans'\n,'ko'=>'Koreaans'\n,'nl_nl'=>'Nederlandse'\n,'pl'=>'Pools'\n,'pt_br'=>'Portugees (Braziliaans)'\n,'ro'=>'Roemeens'\n,'ru'=>'Russisch'\n,'sv'=>'Zweeds'\n,'th'=>'Thais'\n,'tr'=>'Turks'\n,'zh_cn'=>'Chinese (Simplified)'\n,'zh_tw'=>'Chinees (traditioneel)'\n}\n,'pl'=> new Map<String,String>{\n'cs'=>'Czeski'\n,'da'=>'Duński'\n,'de'=>'Niemiecki'\n,'en_us'=>'Angielski (Stany Zjednoczone)'\n,'es'=>'Hiszpański'\n,'es_mx'=>'Mexican hiszpański'\n,'fi'=>'Fiński'\n,'fr'=>'Francuski'\n,'hu'=>'Węgierski'\n,'in'=>'Indonezyjski'\n,'it'=>'Włoski'\n,'ja'=>'Japoński'\n,'ko'=>'Koreański'\n,'nl_nl'=>'Niderlandzki'\n,'pl'=>'Polska'\n,'pt_br'=>'Portugalski (Brazylia)'\n,'ro'=>'Rumuński'\n,'ru'=>'Rosyjski'\n,'sv'=>'Szwedzki'\n,'th'=>'Taj'\n,'tr'=>'Turecki'\n,'zh_cn'=>'Chiński (uproszczony)'\n,'zh_tw'=>'Chiński (tradycyjny)'\n}\n,'pt_br'=> new Map<String,String>{\n'cs'=>'Tcheco'\n,'da'=>'Dinamarquês'\n,'de'=>'Alemão'\n,'en_us'=>'Inglês (Estados Unidos)'\n,'es'=>'Espanhol'\n,'es_mx'=>'Espanhol mexicano'\n,'fi'=>'Finlandês'\n,'fr'=>'Francês'\n,'hu'=>'Húngaro'\n,'in'=>'Indonésio'\n,'it'=>'Italiano'\n,'ja'=>'Japonês'\n,'ko'=>'Coreano'\n,'nl_nl'=>'Holandês'\n,'pl'=>'Polonês'\n,'pt_br'=>'Português (Brasil)'\n,'ro'=>'Romeno'\n,'ru'=>'Russo'\n,'sv'=>'Sueco'\n,'th'=>'Tailandês'\n,'tr'=>'Turco'\n,'zh_cn'=>'Chinês (simplificado)'\n,'zh_tw'=>'Chinês (Tradicional)'\n}\n,'ro'=> new Map<String,String>{\n'cs'=>'Cehă'\n,'da'=>'Daneză'\n,'de'=>'Germană'\n,'en_us'=>'În limba engleză (Statele Unite)'\n,'es'=>'Spaniolă'\n,'es_mx'=>'Mexicane Spanish'\n,'fi'=>'Finlandeză'\n,'fr'=>'Franţuzesc'\n,'hu'=>'Maghiară'\n,'in'=>'Indoneziană'\n,'it'=>'Italiană'\n,'ja'=>'Japoneză'\n,'ko'=>'Coreeană'\n,'nl_nl'=>'Olandeză'\n,'pl'=>'Poloneză'\n,'pt_br'=>'Portuguese (Brazilian)'\n,'ro'=>'Român'\n,'ru'=>'Rus'\n,'sv'=>'Suedez'\n,'th'=>'Thai'\n,'tr'=>'Turcă'\n,'zh_cn'=>'Chineză (simplificată)'\n,'zh_tw'=>'Chineză (Tradiţională)'\n}\n,'ru'=> new Map<String,String>{\n'cs'=>'Чешский'\n,'da'=>'Датский'\n,'de'=>'Немецкий'\n,'en_us'=>'Английский (США)'\n,'es'=>'Испанский'\n,'es_mx'=>'Мексиканские Испанский'\n,'fi'=>'Финский'\n,'fr'=>'Французский'\n,'hu'=>'Венгерский'\n,'in'=>'Индонезийский'\n,'it'=>'Итальянский'\n,'ja'=>'Японский'\n,'ko'=>'Корейский'\n,'nl_nl'=>'Голландский'\n,'pl'=>'Польский'\n,'pt_br'=>'Португальский (бразильский)'\n,'ro'=>'Румынский'\n,'ru'=>'Русский'\n,'sv'=>'Шведский'\n,'th'=>'Тайский'\n,'tr'=>'Турецкий'\n,'zh_cn'=>'Китайский (упрощенный)'\n,'zh_tw'=>'Китайский (традиционный)'\n}\n,'sv'=> new Map<String,String>{\n'cs'=>'Tjeckiska'\n,'da'=>'Danska'\n,'de'=>'Tyska'\n,'en_us'=>'Engelska (USA)'\n,'es'=>'Spanska'\n,'es_mx'=>'Mexikansk spanska'\n,'fi'=>'Finska'\n,'fr'=>'Franska'\n,'hu'=>'Ungerska'\n,'in'=>'Indonesiska'\n,'it'=>'Italienska'\n,'ja'=>'Japanska'\n,'ko'=>'Koreanska'\n,'nl_nl'=>'Nederländska'\n,'pl'=>'Polska'\n,'pt_br'=>'Portugisiska (Brasilien)'\n,'ro'=>'Rumänska'\n,'ru'=>'Ryska'\n,'sv'=>'Svenska'\n,'th'=>'Thai'\n,'tr'=>'Turkiska'\n,'zh_cn'=>'Kinesiska (förenklad)'\n,'zh_tw'=>'Kinesiska (traditionell)'\n}\n,'th'=> new Map<String,String>{\n'cs'=>'สาธารณรัฐ เช็ ก'\n,'da'=>'เดนมาร์ก'\n,'de'=>'เยอรมัน'\n,'en_us'=>'ภาษา อังกฤษ States (United)'\n,'es'=>'สเปน'\n,'es_mx'=>'สเปน เม็ก ซิ กัน'\n,'fi'=>'ฟินแลนด์'\n,'fr'=>'ฝรั่งเศส'\n,'hu'=>'ฮังการี'\n,'in'=>'อินโดนีเซีย'\n,'it'=>'อิตาเลียน'\n,'ja'=>'ญี่ปุ่น'\n,'ko'=>'เกาหลี'\n,'nl_nl'=>'ดัตช์'\n,'pl'=>'เงา'\n,'pt_br'=>'โปรตุเกส (บราซิล)'\n,'ro'=>'โรมาเนีย'\n,'ru'=>'ภาษา รัสเซีย'\n,'sv'=>'สวีเดน'\n,'th'=>'ไทย'\n,'tr'=>'ภาษา ตุรกี'\n,'zh_cn'=>'จีน (ประยุกต์)'\n,'zh_tw'=>'ภาษา จีน (ดั้งเดิม)'\n}\n,'tr'=> new Map<String,String>{\n'cs'=>'Çekçe'\n,'da'=>'Danca'\n,'de'=>'Almanca'\n,'en_us'=>'İngilizce (ABD)'\n,'es'=>'İspanyolca'\n,'es_mx'=>'Mexican İspanyolca'\n,'fi'=>'Fince'\n,'fr'=>'Fransızca'\n,'hu'=>'Macarca'\n,'in'=>'Endonezya Dili'\n,'it'=>'İtalyanca'\n,'ja'=>'Japonca'\n,'ko'=>'Korece'\n,'nl_nl'=>'Hollanda Dili'\n,'pl'=>'Lehçe'\n,'pt_br'=>'Portekizce (Brezilya)'\n,'ro'=>'Romence'\n,'ru'=>'Rusça'\n,'sv'=>'İsveççe'\n,'th'=>'Tay'\n,'tr'=>'Türkçe'\n,'zh_cn'=>'Çince (Basitleştirilmiş)'\n,'zh_tw'=>'Çince (Geleneksel)'\n}\n,'zh_cn'=> new Map<String,String>{\n'cs'=>'捷克文'\n,'da'=>'丹麦文'\n,'de'=>'德语'\n,'en_us'=>'英语（美国）'\n,'es'=>'西班牙语'\n,'es_mx'=>'墨西哥西班牙语'\n,'fi'=>'芬兰文'\n,'fr'=>'法语'\n,'hu'=>'匈牙利文'\n,'in'=>'印度尼西亚文'\n,'it'=>'意大利语'\n,'ja'=>'日语'\n,'ko'=>'韩文'\n,'nl_nl'=>'荷兰文'\n,'pl'=>'波兰文'\n,'pt_br'=>'葡萄牙语（巴西）'\n,'ro'=>'罗马尼亚文'\n,'ru'=>'俄文'\n,'sv'=>'瑞典文'\n,'th'=>'泰国'\n,'tr'=>'土耳其文'\n,'zh_cn'=>'中文（简体）'\n,'zh_tw'=>'中文（繁体）'\n}\n,'zh_tw'=> new Map<String,String>{\n'cs'=>'捷克文'\n,'da'=>'丹麥文'\n,'de'=>'德語'\n,'en_us'=>'英語（美國）'\n,'es'=>'西班牙語'\n,'es_mx'=>'墨西哥西班牙語'\n,'fi'=>'芬蘭文'\n,'fr'=>'法語'\n,'hu'=>'匈牙利文'\n,'in'=>'印度尼西亞文'\n,'it'=>'意大利語'\n,'ja'=>'日語'\n,'ko'=>'韓文'\n,'nl_nl'=>'荷蘭文'\n,'pl'=>'波蘭文'\n,'pt_br'=>'葡萄牙語（巴西）'\n,'ro'=>'羅馬尼亞文'\n,'ru'=>'俄文'\n,'sv'=>'瑞典文'\n,'th'=>'泰國'\n,'tr'=>'土耳其文'\n,'zh_cn'=>'中文（簡體）'\n,'zh_tw'=>'中文（繁體）'\n}\n\n\t};    \n    \n}"
  },
  {
    "path": "src/test/resources/samples/langs/Apex/TwilioAPI.cls",
    "content": "/*\nCopyright (c) 2012 Twilio, Inc.\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n/**\n * Entry point for accessing Twilio resources that are pre-configured\n * with credentials from the Twilio Config custom setting (TwilioConfig__c).\n *\n * To set up your Twilio credentials:\n *   1. Get a Twilio account at http://www.twilio.com/try-twilio\n *   2. Find your Twilio Account Sid and Auth Token at https://www.twilio.com/user/account\n *   3. Log into Salesforce and go to:  Setup | Develop | Custom Settings | Manage Twilio Config\n *   4. Create a new Twilo Config instance\n *   5. Copy and paste your Account Sid and Auth Token and click Save\n *\n * NOTE: The Application Sid field is for use with the Twilio Client softphone\n *       SDK for Javascript.  It is not required for the rest of the Twilio API.\n *\n * Now you can get easy access to Twilio from your Apex code by calling:\n *\n *   TwilioRestClient restClient = TwilioAPI.getDefaultClient();\n *   restClient.getAccount().getCalls(); \n *   // etc.  \n */\nglobal class TwilioAPI {\n\n\tprivate class MissingTwilioConfigCustomSettingsException extends Exception {}\n\n\tprivate static TwilioRestClient client;\n\t\n    private TwilioAPI() {}\n    \n    /**\n     * Get a TwilioRestClient pre-populated with your TwilioConfig credentials\n     */\n    public static TwilioRestClient getDefaultClient() {\n    \tif (client==null) {\n    \t\tTwilioConfig__c twilioCfg = getTwilioConfig();\n\t    \tTwilioAPI.client = new TwilioRestClient(twilioCfg.AccountSid__c, twilioCfg.AuthToken__c);\n    \t}\n\t   \treturn TwilioAPI.client;\n    }\n    \n    /**\n     * Get your primary account using your TwilioConfig credentials\n     */\n    public static TwilioAccount getDefaultAccount() {\n    \treturn getDefaultClient().getAccount();\n    }\n    \n    /**\n     * Get a new Twilio Client capability token generator pre-populated\n     * with your TwilioConfig credentials\n     */\n    public static TwilioCapability createCapability() {\n\t\tTwilioConfig__c twilioCfg = getTwilioConfig();\n\t\treturn new TwilioCapability(twilioCfg.AccountSid__c, twilioCfg.AuthToken__c);    \t\n    }\n    \n    /**\n     * Get a new TwilioRestClient authorized with the credentials provided\n     */\n    public static TwilioRestClient createClient(String accountSid, String authToken) {\n    \treturn new TwilioRestClient(accountSid, authToken);\n    }\n    \n    /**\n     * Load the org default TwilioConfig record\n     */\n    public static TwilioConfig__c getTwilioConfig() {\n    \tTwilioConfig__c twilioCfg;\n    \tif (Test.isRunningTest()) {\n    \t\ttwilioCfg = new TwilioConfig__c();\n    \t\ttwilioCfg.AccountSid__c = 'ACba8bc05eacf94afdae398e642c9cc32d'; // dummy sid\n    \t\ttwilioCfg.AuthToken__c = '12345678901234567890123456789012';    // dummy token\n    \t} else {\n    \t\ttwilioCfg = TwilioConfig__c.getOrgDefaults();\n\t    \tif (twilioCfg==null)\n\t    \t\tthrow new MissingTwilioConfigCustomSettingsException('Please enter your Twilio account credentials under Twilio Config custom settings (go to Setup | Develop | Custom Settings | Manage Twilio Config)');\n    \t}\n   \t\treturn twilioCfg;\n    }\n\n    \n    @isTest\n    static void test_TwilioAPI() {\n\t\tSystem.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getTwilioConfig().AccountSid__c);\n\t\tSystem.assertEquals('12345678901234567890123456789012', TwilioAPI.getTwilioConfig().AuthToken__c);\n\t\tSystem.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getDefaultClient().getAccountSid());\n\t\tSystem.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getDefaultClient().getAccount().getSid());\n\t\tSystem.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getDefaultAccount().getSid());\n\t}\n\t\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Apollo Guidance Computer/BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc",
    "content": "# Copyright:\tPublic domain.\n# Filename:\tBURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc\n# Purpose: \tPart of the source code for Luminary 1A build 099.\n#\t\tIt is part of the source code for the Lunar Module's (LM)\n#\t\tApollo Guidance Computer (AGC), for Apollo 11.\n# Assembler:\tyaYUL\n# Contact:\tRon Burkey <info@sandroid.org>.\n# Website:\twww.ibiblio.org/apollo.\n# Pages:\t731-751\n# Mod history:\t2009-05-19 RSB\tAdapted from the corresponding \n#\t\t\t\tLuminary131 file, using page \n#\t\t\t\timages from Luminary 1A.\n#\t\t2009-06-07 RSB\tCorrected 3 typos.\n#\t\t2009-07-23 RSB\tAdded Onno's notes on the naming\n#\t\t\t\tof this function, which he got from\n#\t\t\t\tDon Eyles.\n#\n# This source code has been transcribed or otherwise adapted from\n# digitized images of a hardcopy from the MIT Museum.  The digitization\n# was performed by Paul Fjeld, and arranged for by Deborah Douglas of\n# the Museum.  Many thanks to both.  The images (with suitable reduction\n# in storage size and consequent reduction in image quality as well) are\n# available online at www.ibiblio.org/apollo.  If for some reason you\n# find that the images are illegible, contact me at info@sandroid.org\n# about getting access to the (much) higher-quality images which Paul\n# actually created.\n#\n# Notations on the hardcopy document read, in part:\n#\n#\tAssemble revision 001 of AGC program LMY99 by NASA 2021112-61\n#\t16:27 JULY 14, 1969 \n\n# Page 731\n## At the get-together of the AGC developers celebrating the 40th anniversary\n## of the first moonwalk, Don Eyles (one of the authors of this routine along\n## with Peter Adler) has related to us a little interesting history behind the\n## naming of the routine.<br>\n## <br>\n## It traces back to 1965 and the Los Angeles riots, and was inspired \n## by disc jockey extraordinaire and radio station owner Magnificent Montague.\n## Magnificent Montague used the phrase \"Burn, baby! BURN!\" when spinning the \n## hottest new records. Magnificent Montague was the charismatic voice of\n## soul music in Chicago, New York, and Los Angeles from the mid-1950s to \n## the mid-1960s.\n# BURN, BABY, BURN -- MASTER IGNITION ROUTINE\n\n\t\tBANK\t36\n\t\tSETLOC\tP40S\n\t\tBANK\n\t\tEBANK=\tWHICH\n\t\tCOUNT*\t$$/P40\n\n# THE MASTER IGNITION ROUTINE IS DESIGNED FOR USE BY THE FOLLOWING LEM PROGRAMS:  P12, P40, P42, P61, P63.\n# IT PERFORMS ALL FUNCTIONS IMMEDIATELY ASSOCIATED WITH APS OR DPS IGNITION:  IN PARTICULAR, EVERYTHING LYING\n# BETWEEN THE PRE-IGNITION TIME CHECK -- ARE WE WITHIN 45 SECONDS OF TIG? -- AND TIG + 26 SECONDS, WHEN DPS\n# PROGRAMS THROTTLE UP.\n#\n# VARIATIONS AMONG PROGRAMS ARE ACCOMODATED BY MEANS OF TABLES CONTAINING CONSTANTS (FOR AVEGEXIT, FOR\n# WAITLIST, FOR PINBALL) AND TCF INSTRUCTIONS.  USERS PLACE THE ADRES OF THE HEAD OF THE APPROPRIATE TABLE\n# (OF P61TABLE FOR P61LM, FOR EXAMPLE) IN ERASABLE REGISTER `WHICH' (E4).  THE IGNITION ROUTINE THEN INDEXES BY\n# WHICH TO OBTAIN OR EXECUTE THE PROPER TABLE ENTRY.  THE IGNITION ROUTINE IS INITIATED BY A TCF BURNBABY,\n# THROUGH BANKJUMP IF NECESSARY.  THERE IS NO RETURN.\n#\n# THE MASTER IGNITION ROUTINE WAS CONCEIVED AND EXECUTED, AND (NOTA BENE) IS MAINTAINED BY ADLER AND EYLES.\n#\n# \t\t   HONI SOIT QUI MAL Y PENSE\n#\n#\t***********************************************\n#\t\tTABLES FOR THE IGNITION ROUTINE\n#\t***********************************************\n#\n#\t\t\tNOLI SE TANGERE\n\nP12TABLE\tVN\t0674\t\t# (0)\n\t\tTCF\tULLGNOT\t\t# (1)\n\t\tTCF\tCOMFAIL3\t# (2)\n\t\tTCF\tGOCUTOFF\t# (3)\n\t\tTCF\tTASKOVER\t# (4)\n\t\tTCF\tP12SPOT\t\t# (5)\n\t\tDEC\t0\t\t# (6)\tNO ULLAGE\n\t\tEBANK=\tWHICH\n\t\t2CADR\tSERVEXIT\t# (7)\n\n\t\tTCF\tDISPCHNG\t# (11)\n\t\tTCF\tWAITABIT\t# (12)\n\t\tTCF\tP12IGN\t\t# (13)\n\nP40TABLE\tVN\t0640\t\t# (0)\n\t\tTCF\tULLGNOT\t\t# (1)\n\t\tTCF\tCOMFAIL4\t# (2)\n\t\tTCF\tGOPOST\t\t# (3)\n\t\tTCF\tTASKOVER\t# (4)\n\t\tTCF\tP40SPOT\t\t# (5)\n# Page 732\n\t\tDEC\t2240\t\t# (6)\n\t\tEBANK=\tOMEGAQ\n\t\t2CADR\tSTEERING\t# (7)\n\n\t\tTCF\tP40SJUNK\t# (11)\n\t\tTCF\tWAITABIT\t# (12)\n\t\tTCF\tP40IGN\t\t# (13)\n\t\tTCF\tREP40ALM\t# (14)\n\nP41TABLE\tTCF\tP41SPOT\t\t# (5)\n\t\tDEC\t-1\t\t# (6)\n\t\tEBANK=\tOMEGAQ\n\t\t2CADR\tCALCN85\t\t# (7)\n\n\t\tTCF\tCOMMON\t\t# (11)\n\t\tTCF\tTIGTASK\t\t# (12)\n\nP42TABLE\tVN\t0640\t\t# (0)\n\t\tTCF\tWANTAPS\t\t# (1)\n\t\tTCF\tCOMFAIL4\t# (2)\n\t\tTCF\tGOPOST\t\t# (3)\n\t\tTCF\tTASKOVER\t# (4)\n\t\tTCF\tP42SPOT\t\t# (5)\n\t\tDEC\t2640\t\t# (6)\n\t\tEBANK=\tOMEGAQ\n\t\t2CADR\tSTEERING\t# (7)\n\n\t\tTCF\tP40SJUNK\t# (11)\n\t\tTCF\tWAITABIT\t# (12)\n\t\tTCF\tP42IGN\t\t# (13)\n\t\tTCF\tP42STAGE\t# (14)\n\nP63TABLE\tVN\t0662\t\t# (0)\n\t\tTCF\tULLGNOT\t\t# (1)\n\t\tTCF\tCOMFAIL3\t# (2)\n\t\tTCF\tV99RECYC\t# (3)\n\t\tTCF\tTASKOVER\t# (4)\n\t\tTCF\tP63SPOT\t\t# (5)\n\t\tDEC\t2240\t\t# (6)\n\t\tEBANK=\tWHICH\n\t\t2CADR\tSERVEXIT\t# (7)\n\n\t\tTCF\tDISPCHNG\t# (11)\n\t\tTCF\tWAITABIT\t# (12)\n# Page 733\n\t\tTCF\tP63IGN\t\t# (13)\n\nABRTABLE\tVN\t0663\t\t# (0)\n\t\tTCF\tULLGNOT\t\t# (1)\n\t\tTCF\tCOMFAIL3\t# (2)\n\t\tTCF\tGOCUTOFF\t# (3)\n\t\tTCF\tTASKOVER\t# (4)\n\t\tNOOP\t\t\t# (5)\n\t\tNOOP\t\t\t# (6)\n\t\tNOOP\t\t\t# (7)\n\t\tNOOP\n\t\tTCF\tDISPCHNG\t# (11)\n\t\tTCF\tWAITABIT\t# (12)\n\t\tTCF\tABRTIGN\t\t# (13)\n\n#\t*********************************\n#\tGENERAL PURPOSE IGNITION ROUTINES\n#\t*********************************\n\nBURNBABY\tTC\tPHASCHNG\t# GROUP 4 RESTARTS HERE\n\t\tOCT\t04024\n\n\t\tCAF\tZERO\t\t# EXTIRPATE JUNK LEFT IN DVTOTAL\n\t\tTS\tDVTOTAL\n\t\tTS\tDVTOTAL +1\n\n\t\tTC\tBANKCALL\t# P40AUTO MUST BE BANKCALLED EVEN FROM ITS\n\t\tCADR\tP40AUTO\t\t# OWN BANK TO SET UP RETURN PROPERLY\n\nB*RNB*B*\tEXTEND\n\t\tDCA\tTIG\t\t# STORE NOMINAL TIG FOR OBLATENESS COMP.\n\t\tDXCH\tGOBLTIME\t# AND FOR P70 OR P71.\n\n\t\tINHINT\n\t\tTC\tIBNKCALL\n\t\tCADR\tENGINOF3\n\t\tRELINT\n\n\t\tINDEX\tWHICH\n\t\tTCF\t5\n\nP42SPOT\t\t=\tP40SPOT\t\t# (5)\nP12SPOT\t\t=\tP40SPOT\t\t# (5)\nP63SPOT\t\t=\tP41SPOT\t\t# (5)\tIN P63 CLOKTASK ALREADY GOING\nP40SPOT\t\tCS\tCNTDNDEX\t# (5)\n# Page 734\n\t\tTC\tBANKCALL\t# MUST BE BANKCALLED FOR GENERALIZED\n\t\tCADR\tSTCLOK2\t\t# \tRETURN\nP41SPOT\t\tTC\tINTPRET\t\t# (5)\n\t\tDLOAD\tDSU\n\t\t\tTIG\n\t\t\tD29.9SEC\n\t\tSTCALL\tTDEC1\n\t\t\tINITCDUW\n\t\tBOFF\tCALL\n\t\t\tMUNFLAG\n\t\t\tGOMIDAV\n\t\t\tCSMPREC\n\t\tVLOAD\tMXV\n\t\t\tVATT1\n\t\t\tREFSMMAT\n\t\tVSR1\n\t\tSTOVL\tV(CSM)\t\t# CSM VELOCITY -- M/CS*2(7)\n\t\t\tRATT1\n\t\tVSL4\tMXV\n\t\t\tREFSMMAT\n\t\tSTCALL\tR(CSM)\t\t# CSM POSITION -- M*2(24)\n\t\t\tMUNGRAV\n\t\tSTODL\tG(CSM)\t\t# CSM GRAVITY VEC. -- M/CS*2(7)\n\t\t\tTAT\n\t\tSTORE\tTDEC1\t\t# RELOAD TDEC1 FOR MIDTOAV.\nGOMIDAV\t\tCALRB\n\t\t\tMIDTOAV1\n\t\tTCF\tCALLT-35\t# MADE IT IN TIME.\n\n\t\tEXTEND\t\t\t# TIG WAS SLIPPED, SO RESET TIG TO 29.9\n\t\tDCA\tPIPTIME1\t# SECONDS AFTER THE TIME TO WHICH WE DID\n\t\tDXCH\tTIG\t\t# INTEGRATE.\n\t\tEXTEND\n\t\tDCA\tD29.9SEC\n\t\tDAS\tTIG\n\nCALLT-35\tDXCH\tMPAC\n\t\tDXCH\tSAVET-30\t# DELTA-T UNTIL TIG-30\n\t\tEXTEND\n\t\tDCS\t5SECDP\n\t\tDAS\tSAVET-30\t# DELTA-T UNTIL TIG-35\n\t\tEXTEND\n\t\tDCA\tSAVET-30\n\t\tTC\tLONGCALL\n\t\tEBANK=\tTTOGO\n\t\t2CADR\tTIG-35\n\n\t\tTC\tPHASCHNG\n\t\tOCT\t20254\t\t# 4.25SPOT FOR TIG-35 RESTART.\n# Page 735\n\t\tTC\tCHECKMM\n\t\tDEC\t63\n\t\tTCF\tENDOFJOB\t# NOT P63\n\t\tCS\tCNTDNDEX\t# P63 CAN START DISPLAYING NOW.\n\t\tTS\tDISPDEX\n\t\tTC\tINTPRET\n\t\tVLOAD\tABVAL\n\t\t\tVN1\n\t\tSTORE\tABVEL\t\t# INITIALIZE ABVEL FOR P63 DISPLAY\n\t\tEXIT\n\t\tTCF\tENDOFJOB\n\n#\t********************************\n\nTIG-35\t\tCAF\t5SEC\n\t\tTC\tTWIDDLE\n\t\tADRES\tTIG-30\n\n\t\tTC\tPHASCHNG\n\t\tOCT\t40154\t\t# 4.15SPOT FOR TIG-30 RESTART\n\n\t\tCS\tBLANKDEX\t# BLANK DSKY FOR 5 SECONDS\n\t\tTS\tDISPDEX\n\n\t\tINDEX\tWHICH\n\t\tCS\t6\t\t# CHECK ULLAGE TIME.\n\t\tEXTEND\n\t\tBZMF\tTASKOVER\n\t\tCAF\t4.9SEC\t\t# SET UP TASK TO RESTORE DISPLAY AT TIG-30\n\t\tTC\tTWIDDLE\n\t\tADRES\tTIG-30.1\n\n\t\tCAF\tPRIO17\t\t# A NEGATIVE ULLAGE TIME INDICATES P41, IN\n\t\tTC\tNOVAC\t\t# WHICH CASE WE HAVE TO SET UP A JOB TO\n\t\tEBANK=\tTTOGO\t\t# BLANK THE DSKY FOR FIVE SECONDS, SINCE\n\t\t2CADR\tP41BLANK\t# CLOKJOB IS NOT RUNNING DURING P41.\n\n\t\tTCF\tTASKOVER\n\nP41BLANK\tTC\tBANKCALL\t# BLANK DSKY.\n\t\tCADR\tCLEANDSP\n\t\tTCF\tENDOFJOB\n\nTIG-30.1\tCAF\tPRIO17\t\t# SET UP JOB TO RESTORE DISPLAY AT TIG-30\n\t\tTC\tNOVAC\n\t\tEBANK=\tTTOGO\n\t\t2CADR\tTIG-30A\n\n\t\tTCF\tTASKOVER\n# Page 736\nTIG-30A\t\tCAF\tV16N85B\n\t\tTC\tBANKCALL\t# RESTORE DISPLAY.\n\t\tCADR\tREGODSP\t\t# REGODSP DOES A TCF ENDOFJOB\n\n#\t********************************\n\nTIG-30\t\tCAF\tS24.9SEC\n\t\tTC\tTWIDDLE\n\t\tADRES\tTIG-5\n\n\t\tCS\tCNTDNDEX\t# START UP CLOKTASK AGAIN\n\t\tTS\tDISPDEX\n\n\t\tINDEX\tWHICH\t\t# PICK UP APPROPRIATE ULLAGE -- ON TIME\n\t\tCA\t6\t\t# Was CAF --- RSB 2009.\n\t\tEXTEND\n\t\tBZMF\tULLGNOT\t\t# DON'T SET UP ULLAGE IF DT IS NEG OR ZERO\n\t\tTS\tSAVET-30\t# SAVE DELTA-T FOR RESTART\n\t\tTC\tTWIDDLE\n\t\tADRES\tULLGTASK\n\n\t\tCA\tTHREE\t\t# RESTART PROTECT ULLGTASK (1.3SPOT)\n\t\tTS\tL\n\t\tCS\tTHREE\n\t\tDXCH\t-PHASE1\n\t\tCS\tTIME1\n\t\tTS\tTBASE1\n\n\t\tINDEX\tWHICH\n\t\tTCF\t1\n\nWANTAPS\t\tCS\tFLGWRD10\t# (1) FOR P42 ENSURE APSFLAG IS SET.  IF IT\n\t\tMASK\tAPSFLBIT\t# WASN'T SET, DAP WILL BE INITIALIZED TO\n\t\tADS\tFLGWRD10\t# ASCENT VALUES BY 1/ACCS IN 2 SECONDS.\n\nULLGNOT\t\tEXTEND\t\t\t# (1)\n\t\tINDEX\tWHICH\n\t\tDCA\t7\t\t# LOAD AVEGEXIT WITH APPROPRIATE 2CADR\n\t\tDXCH\tAVEGEXIT\n\n\t\tCAF\tTWO\t\t# 4.2SPOT RESTARTS IMMEDIATELY AT REDO4.2\n\t\tTS\tL\n\t\tCS\tTWO\t\t# AND ALSO AT TIG-5 AT THE CORRECT TIME.\n\t\tDXCH\t-PHASE4\n\n\t\tCS\tTIME1\n\t\tTS\tTBASE4\t\t# SET TBASE4 FOR TIG-5 RESTART\n\nREDO2.17\tEXTEND\n# Page 737\n\t\tDCA\tNEG0\t\t# CLEAR OUT GROUP 2 SO LAMBERT CAN START\n\t\tDXCH\t-PHASE2\t\t# IF NEEDED.\n\nREDO4.2\t\tCCS\tPHASE5\t\t# IF SERVICER GOING?\n\t\tTCF\tTASKOVER\t# YES, DON'T START IT UP AGAIN.\n\n\t\tTC\tPOSTJUMP\n\t\tCADR\tPREREAD\t\t# PREREAD END THIS TASK\n\n# \t*********************************\n\nULLGTASK\tTC\tONULLAGE\t# THIS COMES AT TIG-7.5 OR TIG-3.5\n\t\tTC\tPHASCHNG\n\t\tOCT\t1\n\t\tTCF\tTASKOVER\n\n# \t*********************************\n\nTIG-5\t\tEXTEND\n\t\tDCA\tNEG0\t\t# INSURE THAT GROUP 3 IS INACTIVE.\n\t\tDXCH\t-PHASE3\n\n\t\tCAF\t5SEC\n\t\tTC\tTWIDDLE\n\t\tADRES\tTIG-0\n\n\t\tTC\tDOWNFLAG\t# RESET IGNFLAG AND ASINFLAG\n\t\tADRES\tIGNFLAG\t\t# \tFOR LIGHT-UP LOGIC.\n\t\tTC\tDOWNFLAG\n\t\tADRES\tASTNFLAG\n\t\t\n\t\tINDEX\tWHICH\n\t\tTCF\t11\n\nP40SJUNK\tCCS\tPHASE3\t\t# (11) P40 AND P42.  S40.13 IN PROGRESS?\n\t\tTCF\tDISPCHNG\t# YES\n\n\t\tCAF\tPRIO20\n\t\tTC\tFINDVAC\n\t\tEBANK=\tTTOGO\n\t\t2CADR\tS40.13\n\n\t\tTC\tPHASCHNG\t# 3.5SPOT FOR S40.13\n\t\tOCT\t00053\nDISPCHNG\tCS\tVB99DEX\t\t# (11)\n\t\tTS\tDISPDEX\n\n# Page 738\t\t\nCOMMON\t\tTC\tPHASCHNG\t# RESTART TIG-0 (4.7SPOT)\n\t\tOCT\t40074\n\t\tTCF\tTASKOVER\n\n# \t*********************************\n\nTIG-0\t\tCS\tFLAGWRD7\t# SET IGNFLAG SINCE TIG HAS ARRIVED\n\t\tMASK\tIGNFLBIT\n\t\tADS\tFLAGWRD7\n\n\t\tTC\tCHECKMM\t\t# IN P63 CASE, THROTTLE-UP IS ZOOMTIME\n\t\tDEC\t63\t\t# AFTER NOMINAL IGNITION, NOT ACTUAL\n\t\tTCF\tIGNYET?\n\t\tCA\tZOOMTIME\n\t\tTC\tWAITLIST\n\t\tEBANK=\tDVCNTR\n\t\t2CADR\tP63ZOOM\n\n\t\tTC\t2PHSCHNG\n\t\tOCT\t40033\n\n\t\tOCT\t05014\n\t\tOCT\t77777\n\nIGNYET?\t\tCAF\tASTNBIT\t\t# CHECK ASTNFLAG:  HAS ASTRONAUT RESPONDED\n\t\tMASK\tFLAGWRD7\t# TO OUR ENGINE ENABLE REQUEST?\n\t\tEXTEND\n\t\tINDEX\tWHICH\n\t\tBZF\t12\t\t# BRANCH IF HE HAS NOT RESPONDED YET\n\nIGNITION\tCS\tFLAGWRD5\t# INSURE ENGONFLG IS SET.\n\t\tMASK\tENGONBIT\n\t\tADS\tFLAGWRD5\n\t\tCS\tPRIO30\t\t# TURN ON THE ENGINE.\n\t\tEXTEND\n\t\tRAND\tDSALMOUT\n\t\tAD\tBIT13\n\t\tEXTEND\n\t\tWRITE\tDSALMOUT\n\t\tEXTEND\t\t\t# SET TEVENT FOR DOWNLINK\n\t\tDCA\tTIME2\n\t\tDXCH\tTEVENT\n\n\t\tEXTEND\t\t\t# UPDATE TIG USING TGO FROM S40.13\n\t\tDCA\tTGO\n\t\tDXCH\tTIG\n\t\tEXTEND\n\t\tDCA\tTIME2\n\t\tDAS\tTIG\n\n# Page 739\n\t\tCS\tFLUNDBIT\t# PERMIT GUIDANCE LOOP DISPLAYS\n\t\tMASK\tFLAGWRD8\n\t\tTS\tFLAGWRD8\n\n\t\tINDEX\tWHICH\n\t\tTCF\t13\n\nP63IGN\t\tEXTEND\t\t\t# (13)\tINITIATE BURN DISPLAYS\n\t\tDCA\tDSP2CADR\n\t\tDXCH\tAVGEXIT\n\n\t\tCA\tZ\t\t# ASSASSINATE CLOKTASK\n\t\tTS\tDISPDEX\n\n\t\tCS\tFLAGWRD9\t# SET FLAG FOR P70-P71\n\t\tMASK\tLETABBIT\n\t\tADS\tFLAGWRD9\n\t\t\n\t\tCS\tFLAGWRD7\t# SET SWANDISP TO ENABLE R10.\n\t\tMASK\tSWANDBIT\n\t\tADS\tFLAGWRD7\n\t\t\n\t\tCS\tPULSES\t\t# MAKE SURE DAP IS NOT IN MINIMUM-IMPULSE\n\t\tMASK\tDAPBOOLS\t# MODE, IN CASE OF SWITCH TO P66\n\t\tTS\tDAPBOOLS\n\n\t\tEXTEND\t\t\t# INITIALIZE TIG FOR P70 AND P71.\n\t\tDCA\tTIME2\n\t\tDXCH\tTIG\n\n\t\tCAF\tZERO\t\t# INITIALIZE WCHPHASE, AND FLPASS0\n\t\tTS\tWCHPHASE\n\t\tTS\tWCHPHOLD\t# ALSO WHCPHOLD\n\t\tCA\tTWO\n\t\tTS\tFLPASS0\n\n\t\tTCF\tP42IGN\nP40IGN\t\tCS\tFLAGWRD5\t# (13)\n\t\tMASK\tNOTHRBIT\n\t\tEXTEND\n\t\tBZF\tP42IGN\n\t\tCA\tZOOMTIME\n\t\tTC\tWAITLIST\n\t\tEBANK=\tDVCNTR\n\t\t2CADR\tP40ZOOM\n\nP63IGN1\t\tTC\t2PHSCHNG\n\t\tOCT\t40033\t\t# 3.3SPOT FOR ZOOM RESTART.\n\t\tOCT\t05014\t\t# TYPE C RESTARTS HERE IMMEDIATELY\n\t\tOCT\t77777\n\n# Page 740\n\t\tTCF\tP42IGN\nP12IGN\t\tCAF\tEBANK6\n\t\tTS\tEBANK\n\t\tEBANK=\tAOSQ\n\n\t\tCA\tIGNAOSQ\t\t# INITIALIZE DAP BIAS ACCELERATION\n\t\tTS\tAOSQ\t\t# ESTIMATES AT P12 IGNITION.\n\t\tCA\tIGNAOSR\n\t\tTS\tAOSR\n\n\t\tCAF\tEBANK7\n\t\tTS\tEBANK\n\t\tEBANK=\tDVCNTR\n\nABRTIGN\t\tCA\tZ\t\t# (13) KILL CLOKTASK\n\t\tTS\tDISPDEX\n\n\t\tEXTEND\t\t\t# CONNECT ASCENT GYIDANCE TO SERVICER.\n\t\tDCA\tATMAGADR\n\t\tDXCH\tAVGEXIT\n\n\t\tCS\tFLAGWRD7\t# ENABLE R10.\n\t\tMASK\tSWANDBIT\n\t\tADS\tFLAGWRD7\n\nP42IGN\t\tCS\tDRIFTBIT\t# ENSURE THAT POWERED-FLIGHT SWITCHING\n\t\tMASK\tDAPBOOLS\t# CURVES ARE USED.\n\t\tTS\tDAPBOOLS\n\t\tCAF\tIMPULBIT\t# EXAMINE IMPULSE SWITCH\n\t\tMASK\tFLAGWRD2\n\t\tCCS\tA\n\t\tTCF\tIMPLBURN\n\nDVMONCON\tTC\tDOWNFLAG\n\t\tADRES\tIGNFLAG\t\t# CONNECT DVMON\n\t\tTC\tDOWNFLAG\n\t\tADRES\tASTNFLAG\n\t\tTC\tDOWNFLAG\n\t\tADRES\tIDLEFLAG\n\n\t\tTC\tPHASCHNG\n\t\tOCT\t40054\n\n\t\tTC\tFIXDELAY\t# TURN ULLAGE OFF HALF A SECOND AFTER\n\t\tDEC\t50\t\t# LIGHT UP.\n\nULLAGOFF\tTC\tNOULLAGE\n\nWAITABIT\tEXTEND\t\t\t# KILL GROUP 4\n\t\tDCA\tNEG0\n# Page 741\n\t\tDXCH\t-PHASE4\n\n\t\tTCF\tTASKOVER\n\nTIGTASK\t\tTC\tPOSTJUMP\t# (12)\n\t\tCADR\tTIGTASK1\n\n#\t********************************\n\n\t\tBANK\t31\n\t\tSETLOC\tP40S3\n\t\tBANK\n\t\tCOUNT*\t$$/P40\n\nTIGTASK1\tCAF\tPRIO16\n\t\tTC\tNOVAC\n\t\tEBANK=\tTRKMKCNT\n\t\t2CADR\tTIGNOW\n\n\t\tTC\tPHASCHNG\n\t\tOCT\t6\t\t# KILL GROUP 6\n\n\t\tTCF\tTASKOVER\n\n#\t********************************\n\nP63ZOOM\t\tEXTEND\n\t\tDCA\tLUNLANAD\n\t\tDXCH\tAVEGEXIT\n\n\t\tTC\tIBNKCALL\n\t\tCADR\tFLATOUT\n\t\tTCF\tP40ZOOMA\n\nP40ZOOM\t\tCAF\tBIT13\n\t\tTS\tTHRUST\n\t\tCAF\tBIT4\n\n\t\tEXTEND\n\t\tWOR\tCHAN14\n\nP40ZOOMA\tTC\tPHASCHNG\n\t\tOCT\t3\n\t\tTCF\tTASKOVER\n\n\t\tEBANK=\tDVCNTR\nLUNLANAD\t2CADR\tLUNLAND\n\n# Page 742\nZOOM\t\t=\tP40ZOOMA\n\t\tBANK\t36\n\t\tSETLOC\tP40S\n\t\tBANK\n\t\tCOUNT*\t$$/P40\n\n#\t********************************\n\nCOMFAIL\t\tTC\tUPFLAG\t\t# (15)\n\t\tADRES\tIDLEFLAG\n\t\tTC\tUPFLAG\t\t# SET FLAG TO SUPRESS CONFLICTING DISPLAY\n\t\tADRES\tFLUNDISP\n\t\tCAF\tFOUR\t\t# RESET DVMON\n\t\tTS\tDVCNTR\n\t\tCCS\tPHASE6\t\t# CLOCKTASK ACTIVE?\n\t\tTCF\t+3\t\t# YES\n\t\tTC\tBANKCALL\t# OTHERWISE, START IT UP\n\t\tCADR\tSTCLOK1\n \t+3\tCS\tVB97DEX\n \t\tTS\tDISPDEX\n\t\tTC\tPHASCHNG\t# TURN OFF GROUP 4.\n\t\tOCT\t00004\n\t\tTCF\tENDOFJOB\n\nCOMFAIL1\tINDEX\tWHICH\n\t\tTCF\t2\n\nCOMFAIL3\tCA\tZ\t\t# (15)\tKILL CLOKTASK USING Z\n\t\tTCF\t+2\n\nCOMFAIL4\tCS\tCNTDNDEX\n\t\tTS\tDISPDEX\n\n\t\tTC\tDOWNFLAG\t# RECONNECT DV MONITOR\n\t\tADRES\tIDLEFLAG\n\t\tTC\tDOWNFLAG\t# PERMIT GUIDANCE LOOP DISPLAYS\n\t\tADRES\tFLUNDISP\n\t\tTCF\tENDOFJOB\n\nCOMFAIL2\tTC\tPHASCHNG\t# KILL ZOOM RESTART PROTECTION\n\t\tOCT\t00003\n\n\t\tINHINT\n\t\tTC\tKILLTASK\t# KILL ZOOM IN CASE IT'S STILL TO COME\n\t\tCADR\tZOOM\n\t\tTC\tIBNKCALL\t# COMMAND ENGINE OFF\n\t\tCADR\tENGINOF4\n\t\tTC\tUPFLAG\t\t# SET THE DRIFT BIT FOR THE DAP.\n\t\tADRES\tDRIFTDFL\n# Page 743\n\t\tTC\tINVFLAG\t\t# USE OTHER RCS SYSTEM\n\t\tADRES\tAORBTFLG\n\t\tTC\tUPFLAG\t\t# TURN ON ULLAGE\n\t\tADRES\tULLAGFLG\n\t\tCAF\tBIT1\n\t\tINHINT\n\t\tTC\tTWIDDLE\n\t\tADRES\tTIG-5\n\t\tTCF\tENDOFJOB\n\n#\t***********************************\n#\tSUBROUTINES OF THE IGNITION ROUTINE\n#\t***********************************\n\nINVFLAG\t\tCA\tQ\n\t\tTC\tDEBIT\n\t\tCOM\n\t\tEXTEND\n\t\tRXOR\tLCHAN\n\t\tTCF\tCOMFLAG\n\n#\t***********************************\n\nNOULLAGE\tCS\tULLAGER\t\t# MUST BE CALLED IN A TASK OR UNDER INHINT\n\t\tMASK\tDAPBOOLS\n\t\tTS\tDAPBOOLS\n\t\tTC\tQ\n\n#\t***********************************\n\nONULLAGE\tCS\tDAPBOOLS\t# TURN ON ULLAGE.  MUST BE CALLED IN\n\t\tMASK\tULLAGER\t\t# A TASK OR WHILE INHINTED.\n\t\tADS\tDAPBOOLS\n\t\tTC\tQ\n\n# \t***********************************\n\nSTCLOK1\t\tCA\tZERO\t\t# THIS ROUTINE STARTS THE COUNT-DOWN\nSTCLOK2\t\tTS\tDISPDEX\t\t# (CLOKTASK AND CLOKJOB).  SETTING\nSTCLOK3\t\tTC\tMAKECADR\t# SETTING DISPDEX POSITIVE KILLS IT.\n\t\tTS\tTBASE4\t\t# RETURN SAVE (NOT FOR RESTARTS).\n\t\tEXTEND\n\t\tDCA\tTIG\n\t\tDXCH\tMPAC\n\t\tEXTEND\n\t\tDCS\tTIME2\n# Page 744\t\t\n\t\tDAS\tMPAC\t\t# HAVE TIG -- TIME2, UNDOUBTEDLY A + NUMBER\n\t\tTC\tTPAGREE\t\t# POSITIVE, SINCE WE PASSED THE\n\t\tCAF\t1SEC\t\t# 45 SECOND CHECK.\n\t\tTS\tQ\n\t\tDXCH\tMPAC\n\t\tMASK\tLOW5\t\t# RESTRICT MAGNITUDE OF NUMBER IN A\n\t\tEXTEND\n\t\tDV\tQ\n\t\tCA\tL\t\t# GET REMAINDER\n\t\tAD\tTWO\n\t\tINHINT\n\t\tTC\tTWIDDLE\n\t\tADRES\tCLOKTASK\n\t\tTC\t2PHSCHNG\n\t\tOCT\t40036\t\t# 6.3SPOT FOR CLOKTASK\n\t\tOCT\t05024\n\t\tOCT\t13000\n\n\t\tCA\tTBASE4\n\t\tTC\tBANKJUMP\n\nCLOKTASK\tCS\tTIME1\t\t# SET TBASE6 FOR GROUP 6 RESTART\n\t\tTS\tTBASE6\n\n\t\tCCS\tDISPDEX\n\t\tTCF\tKILLCLOK\n\t\tNOOP\n\t\tCAF\tPRIO27\n\t\tTC\tNOVAC\n\t\tEBANK=\tTTOGO\n\t\t2CADR\tCLOKJOB\n\n\t\tTC\tFIXDELAY\t# WAIT A SECOND BEFORE STARTING OVER\n\t\tDEC\t100\n\t\tTCF\tCLOKTASK\n\nKILLCLOK\tEXTEND\t\t\t# KILL RESTART\n\t\tDCA\tNEG0\n\t\tDXCH\t-PHASE6\n\t\tTCF\tTASKOVER\n\nCLOKJOB\t\tEXTEND\n\t\tDCS\tTIG\n\t\tDXCH\tTTOGO\n\t\tEXTEND\n# Page 745\t\t\n\t\tDCA\tTIME2\n\t\tDAS\tTTOGO\n\t\tINHINT\n\t\tCCS\tDISPDEX\t\t# IF DISPDEX HAS BEEN SET POSITIVE BY A\n\t\tTCF\tENDOFJOB\t# TASK OR A HIGHER PRIORITY JOB SINCE THE\n\t\tTCF\tENDOFJOB\t# LAST CLOKTASK, AVOID USING IT AS AN\n\t\tCOM\t\t\t# INDEX.\n\t\tRELINT\t\t\t# ***** DISPDEX MUST NEVER B -0 *****\n\t\tINDEX\tA\n\t\tTCF\tDISPNOT -1\t# (-1 DUE TO EFFECT OF CCS)\n\nVB97DEX\t\t=\tOCT35\t\t# NEGATIVE OF THIS IS PROPER FOR DISPDEX\n\n \t-35\tCS\tZERO\t\t# INDICATE VERB 97 PASTE\n \t\tTS\tNVWORD1\n\t\tCA\tNVWORD \t+2\t# NVWORD+2 CONTAINS V06 & APPROPRIATE NOUN\n\t\tTC\tBANKCALL\n\t\tCADR\tCLOCPLAY\n\t\tTCF\tSTOPCLOK\t# TERMINATE CLOKTASK ON THE WAY TO P00H\n\t\tTCF\tCOMFAIL1\n\t\tTCF\tCOMFAIL2\n\n\t\t\t\t\t# THIS DISPLAY IS CALLED VIA ASTNCLOK\n \t-25\tCAF\tV06N61\t\t# IT IS PRIMARILY USED BY THE CREW IN P63\n \t\tTC\tBANKCALL\t# TO RESET HIS EVENT TIMER TO AGREE WITH\n\t\tCADR\tREFLASH\t\t# TIG.\n\t\tTCF\tSTOPCLOK\n\t\tTCF\tASTNRETN\n\t\tTCF\t-6\n\nCNTDNDEX\t=\tLOW4\t\t# OCT17:  NEGATIVE PROPER FOR DISPDEX\n\n \t-17\tINDEX\tWHICH\t\t# THIS DISPLAY COMES UP AT ONE SECOND\n\t\t# Was CAF --- RSB 2009\n \t\tCA\t0\t\t# INTERVALS.  IT IS NORMALLY OPERATED\n\t\tTC\tBANKCALL\t# BETWEEN TIG-30 SECONDS AND TIG-5 SECONDS\n\t\tCADR\tREGODSP\t\t# REGODSP DOES ITS OWN TCF ENDOFJOB\n\nVB99DEX\t\t=\tELEVEN\t\t# OCT13:  NEGATIVE PROPER FOR DISPDEX\n\nV99RECYC\tEQUALS\n\n \t-13\tCS\tBIT9\t\t# INDICATE VERB 99 PASTE\n \t\tTS\tNVWORD1\n\t\tINDEX\tWHICH\t\t# THIS IS THE \"PLEASE ENABLE ENGINE\"\n\t\t# Was CAF --- RSB 2004\n\t\tCA\t0\t\t# DISPLAY; IT IS INITIATED AT TIG-5 SEC.\n\t\tTC\tBANKCALL\t# THE DISPLAY IS A V99NXX, WHERE XX IS\n\t\tCADR\tCLOCPLAY\t# NOUN THAT HAD PREVIOUSLY BEEN DISPLAYED\n\t\tTCF\tSTOPCLOK\t# TERMINATE GOTOP00H TURNS OFF ULLAGE.\n\t\tTCF\t*PROCEED\n\t\tTCF\t*ENTER\n\n# Page 746\nBLANKDEX\t=\tTWO\t\t# NEGATIVE OF THIS IS PROPER FOR DISPDEX\n\n\t-2\tTC\tBANKCALL\t# BLANK DSKY.  THE DSKY IS BLANKED FOR\n \t\tCADR\tCLEANDSP\t# 5 SECONDS AT TIG-35 TO INDICATE THAT\nDISPNOT\t\tTCF\tENDOFJOB\t# AVERAGE G IS STARTING.\n\nSTOPCLOK\tTC\tNULLCLOK\t# STOP CLOKTASK & TURN OFF ULLAGE ON THE\n\t\tTCF\tGOTOP00H\t# WAY TO P00 (GOTOP00H RELINTS)\n\nNULLCLOK\tINHINT\n\t\tEXTEND\n\t\tQXCH\tP40/RET\n\t\tTC\tNOULLAGE\t# TURN OFF ULLAGE ...\n\t\tTC\tKILLTASK\t#\tDON'T LET IT COME ON, EITHER ...\n\t\tCADR\tULLGTASK\n\t\tTC\tPHASCHNG\t#\t\tNOT EVEN IF THERE'S A RESTART.\n\t\tOCT\t1\n\t\tCA\tZ\t\t# KILL CLOKTASK\n\t\tTS\tDISPDEX\n\t\tTC\tP40/RET\n\nASTNRETN\tTC\tPHASCHNG\n\t\tOCT\t04024\n\t\tCAF\tZERO\t\t# STOP DISPLAYING BUT KEEP RUNNING\n\t\tTS\tDISPDEX\n\t\tCAF\tPRIO13\n\t\tTC\tFINDVAC\n\t\tEBANK=\tSTARIND\n\t\t2CADR\tASTNRET\n\n\t\tTCF\tENDOFJOB\n\n*PROCEED\tTC\tUPFLAG\n\t\tADRES\tASTNFLAG\n\n\t\tTCF\tIGNITE\n\n*ENTER\t\tINHINT\n\t\tINDEX\tWHICH\n\t\tTCF\t3\n\nGOPOST\t\tCAF\tPRIO12\t\t# (3) MUST BE LOWER PRIORITY THAN CLOKJOB\n\t\tTC\tFINDVAC\n\t\tEBANK=\tTTOGO\n\t\t2CADR\tPOSTBURN\n\n# Page 747\n\t\tINHINT\t\t\t# SET UP THE DAP FOR COASTING FLIGHT.\n\t\tTC\tIBNKCALL\n\t\tCADR\tALLCOAST\n\t\tTC\tNULLCLOK\n\t\tTC\tPHASCHNG\t# 4.13 RESTART FOR POSTBURN\n\t\tOCT\t00134\n\n\t\tTCF\tENDOFJOB\n\nGOCUTOFF\tCAF\tPRIO17\t\t# (3)\n\t\tTC\tFINDVAC\n\t\tEBANK=\tTGO\n\t\t2CADR\tCUTOFF\n\n\t\tTC\tDOWNFLAG\n\t\tADRES\tFLUNDISP\n\n\t\tINHINT\t\t\t# SET UP THE DAP FOR COASTING FLIGHT.\n\t\tTC\tIBNKCALL\n\t\tCADR\tALLCOAST\n\t\tTC\tNULLCLOK\n\t\tTC\tPHASCHNG\n\t\tOCT\t07024\n\t\tOCT\t17000\n\t\tEBANK=\tTGO\n\t\t2CADR\tCUTOFF\n\n\t\tTCF\tENDOFJOB\n\nIGNITE\t\tCS\tFLAGWRD7\t# (2)\n\t\tMASK\tIGNFLBIT\n\t\tCCS\tA\n\t\tTCF\tIGNITE1\n\t\tCAF\tBIT1\n\t\tINHINT\n\t\tTC\tTWIDDLE\n\t\tADRES\tIGNITION\n\n\t\tCAF\tOCT23\t\t# IMMEDIATE RESTART AT IGNITION\n\t\tTS\tL\n\t\tCOM\n\t\tDXCH\t-PHASE4\n\nIGNITE1\t\tCS\tCNTDNDEX\t# RESTORE OLD DISPLAY.\n\t\tTS\tDISPDEX\n\n\t\tTCF\tENDOFJOB\n\n# Page 748\n#\t********************************\n\nP40ALM\t\tTC\tALARM\t\t# PROGRAM SELECTION NOT CONSISTENT WITH\n\t\tOCT\t1706\t\t# VEHICLE CONFIGURATION\n\nREP40ALM\tCAF\tV05N09\t\t# (14)\n\t\tTC\tBANKCALL\n\t\tCADR\tGOFLASH\n\n\t\tTCF\tGOTOP00H\t# V34E \t\tTERMINATE\n\t\tTCF\t+2\t\t# PROCEED \tCHECK FOR P42\n\t\tTCF\tREP40ALM\t# V32E\t\tREDISPLAY ALARM\n\n\t\tINDEX\tWHICH\t\t# FOR P42, ALLOW CREW TO PRECEED EVEN\n\t\tTCF\t14\t\t# THOUGH VEHICLE IS UNSTAGED.\n\n#\t********************************\n\n\t\tBANK\t31\n\t\tSETLOC\tP40S2\n\t\tBANK\n\n\t\tCOUNT*\t$$/P40\n\nP40AUTO\t\tTC\tMAKECADR\t# HELLO THERE.\n\t\tTS\tTEMPR60\t\t# FOR GENERALIZED RETURN TO OTHER BANKS.\nP40A/P\t\tTC\tBANKCALL\t# SUBROUTINE TO CHECK PGNCS CONTROL\n\t\tCADR\tG+N,AUTO\t# AND AUTO STABILIZATION MODES\n\t\tCCS\tA\t\t# +0 INDICATES IN PGNCS, IN AUTO\n\t\tTCF\tTURNITON\t# + INDICATES NOT IN PGNCS AND/OR AUTO\n\t\tCAF\tAPSFLBIT\t# ARE WE ON THE DESCENT STAGE?\n\t\tMASK\tFLGWRD10\n\t\tCCS\tA\n\t\tTCF\tGOBACK\t\t# RETURN\n\t\tCAF\tBIT5\t\t# YES, CHECK FOR AUTO-THROTTLE MODE\n\t\tEXTEND\n\t\tRAND\tCHAN30\n\t\tEXTEND\n\t\tBZF\tGOBACK\t\t# IN AUTO-THROTTLE MODE -- RETURN\nTURNITON\tCAF\tP40A/PMD\t# DISPLAYS V50N25 R1=203 PLEASE PERFORM\n\t\tTC\tBANKCALL\t# CHECKLIST 203 TURN ON PGNCS ETC.\n\t\tCADR\tGOPERF1\n\t\tTCF\tGOTOP00H\t# V34E TERMINATE\n\t\tTCF\tP40A/P\t\t# RECYCLE\nGOBACK\t\tCA\tTEMPR60\n\t\tTC\tBANKJUMP\t# GOODBYE.  COME AGAIN SOON.\n\nP40A/PMD\tOCT\t00203\n\n# Page 749\n\t\tBANK\t36\n\t\tSETLOC\tP40S\n\t\tBANK\n\n\t\tCOUNT*\t$$/P40\n\n#\t**********************************\n#\tCONSTANTS FOR THE IGNITION ROUTINE\n#\t**********************************\n\nSERVCADR\t=\tP63TABLE +7\n\nP40ADRES\tADRES\tP40TABLE\n\nP41ADRES\tADRES\tP41TABLE -5\n\nP42ADRES\tADRES\tP42TABLE\n\n\t\tEBANK=\tDVCNTR\nDSP2CADR\t2CADR\tP63DISPS -2\n\n\t\tEBANK=\tDVCNTR\nATMAGADR\t2CADR\tATMAG\n\n?\t\t=\tGOTOP00H\n\nD29.9SEC\t2DEC\t2990\n\nS24.9SEC\tDEC\t2490\n\n4.9SEC\t\tDEC\t490\n\nOCT20\t\t=\tBIT5\n\nV06N61\t\tVN\t0661\n\n# Page 750\n# KILLTASK\n# MOD NO:  NEW PROGRAM\n# MOD BY:  COVELLI\n#\n# FUNCTIONAL DESCRIPTION:\n#\n#\tKILLTASK IS USED TO REMOVE A TASK FROM THE WAITLIST BY SUBSTITUTING A NULL TASK CALLED `NULLTASK' (OF COURSE),\n#\tWHICH MERELY DOES A TC TASKOVER.  IF THE SAME TASK IS SCHEDULED MORE THAN ONCE, ONLY THE ONE WHICH WILL OCCUR\n#\tFIRST IS REMOVED.  IF THE TASK IS NOT SCHEDULED, KILLTASK TAKES NO ACTION AND RETURNS WITH NO ALARM.  KILLTASK\n#\tLEAVES INTERRUPTS INHIBITED SO CALLER MUST RELINT\n#\n# CALLING SEQUENCE\n#\tL\tTC\tKILLTASK\t# IN FIXED-FIXED\n#\tL+1\tCADR\t????????\t# CADR (NOT 2CADR) OF TASK TO BE REMOVED.\n#\tL+2\t(RELINT)\t\t# RETURN\n#\n# EXIT MODE:  AT L+2 OF CALLING SEQUENCE.\n#\n# ERASABLE INITIALIZATION:  NONE.\n#\n# OUTPUT:  2CADR OF NULLTASK IN LST2\n#\n# DEBRIS:  ITEMP1 - ITEMP4, A, L, Q.\n\n\t\tEBANK=\tLST2\n\t\tBLOCK\t3\t\t# KILLTASK MUST BE IN FIXED-FIXED.\n\t\tSETLOC\tFFTAG6\n\t\tBANK\n\t\tCOUNT*\t$$/KILL\nKILLTASK\tCA\tKILLBB\n\t\tINHINT\n\t\tLXCH\tA\n\t\tINDEX\tQ\n\t\tCA\t0\t\t# GET CADR.\n\t\tLXCH\tBBANK\n\t\tTCF\tKILLTSK2\t# CONTINUE IN SWITCHED FIXED.\n\n\t\tEBANK=\tLST2\nKILLBB\t\tBBCON\tKILLTSK2\n\n\t\tBANK\t27\n\n\t\tSETLOC\tP40S1\n\t\tBANK\n\t\tCOUNT*\t$$/KILL\n\nKILLTSK2\tLXCH\tITEMP2\t\t# SAVE CALLER'S BBANK\n# Page 751\n\t\tINCR\tQ\n\t\tEXTEND\n\t\tQXCH\tITEMP1\t\t# RETURN 2ADR IN ITEMP1,ITEMP2\n\n\t\tTS\tITEMP3\t\t# CADR IS IN A\n\t\tMASK\tLOW10\n\t\tAD\tBIT11\n\t\tTS\tITEMP4\t\t# GENADR OF TASK\n\n\t\tCS\tLOW10\n\t\tMASK\tITEMP3\n\t\tTS\tITEMP3\t\t# FBANK OF TASK\n\n\t\tZL\nADRSCAN\t\tINDEX\tL\n\t\tCS\tLST2\n\t\tAD\tITEMP4\t\t# COMPARE GENADRS\n\t\tEXTEND\n\t\tBZF\tTSTFBANK\t# IF THEY MATCH, COMPARE FBANKS\nLETITLIV\tCS\tLSTLIM\n\t\tAD\tL\n\t\tEXTEND\t\t\t# ARE WE DONE?\n\t\tBZF\tDEAD\t\t# YES -- DONE, SO RETURN\n\t\tINCR\tL\n\t\tINCR\tL\n\t\tTCF\tADRSCAN\t\t# CONTINUE LOOP.\n\nDEAD\t\tDXCH\tITEMP1\n\t\tDTCB\n\nTSTFBANK\tCS\tLOW10\n\t\tINDEX\tL\n\t\tMASK\tLST2 \t+1\t# COMPARE FBANKS ONLY.\n\t\tEXTEND\n\t\tSU\tITEMP3\n\t\tEXTEND\n\t\tBZF\tKILLDEAD\t# MATCH -- KILL IT.\n\t\tTCF\tLETITLIV\t# NO MATCH -- CONTINUE.\n\nKILLDEAD\tCA\tTCTSKOVR\n\t\tINDEX\tL\n\t\tTS\tLST2\t\t# REMOVE TASK BY INSERTING TASKOVER\n\t\tTCF\tDEAD\n\nLSTLIM\t\tEQUALS\tBIT5\t\t# DEC 16\n"
  },
  {
    "path": "src/test/resources/samples/langs/AppleScript/Convert To PDF.applescript",
    "content": "(*\nCopyright 2003 Apple Computer, Inc.\n\nYou may incorporate this Apple sample code into your program(s) without\nrestriction.  This Apple sample code has been provided \"AS IS\" and the\nresponsibility for its operation is yours.  You are not permitted to\nredistribute this Apple sample code as \"Apple sample code\" after having\nmade changes.  If you're going to redistribute the code, we require\nthat you make it clear that the code was descended from Apple sample\ncode, but that you've made changes.\n*)\n\nproperty type_list : {\"JPEG\", \"GIFf\", \"PICT\", \"TIFF\", \"PDF\", \"TEXT\"}\nproperty extension_list : {\"jpg\", \"gif\", \"pct\", \"tif\", \"pdf\", \"rtf\"}\n--html is not currently handled\n\non run {}\n\ttell application \"Finder\" to set FinderSelection to the selection as alias list\n\t\n\tset FS to FinderSelection\n\t--Ideally, this list could be passed to the open handler\n\t\n\tset SelectionCount to number of FS -- count\t\n\tif SelectionCount is 0 then\n\t\tset FS to userPicksFolder()\n\telse if the SelectionCount is 1 then\n\t\tset MyPath to path to me\n\t\tif MyPath is item 1 of FS then\n\t\t\t--If I'm a droplet then I was double-clicked\n\t\t\tset FS to userPicksFolder()\n\t\tend if\n\telse\n\t\t--I'm not a double-clicked droplet\n\tend if\n\topen FS\nend run\n\non userPicksFolder()\n\tset these_items to {}\n\tset these_items to (choose file with prompt \"Select a file to convert to PDF:\" of type {\"JPEG\", \"GIFf\", \"PICT\", \"TIFF\", \"TEXT\", \"RTF\"}) as list\nend userPicksFolder\n\non open these_items\n\tset thesefiles to {}\n\tset the item_info to {}\n\trepeat with i from 1 to the count of these_items\n\t\tset this_item to (item i of these_items)\n\t\tset the item_info to info for this_item\n\t\t\n\t\tif folder of the item_info is true then --if the item is a folder\n\t\t\tprocessFolder(this_item)\n\t\telse if ((folder of the item_info is false) and (alias of the item_info is false)) and (the file type of the item_info is in the type_list) or ((the name extension of the item_info) is in the extension_list) then\n\t\t\t\n\t\t\tset theFilePath to (item i of these_items as string)\n\t\t\tset thePOSIXFilePath to POSIX path of theFilePath as string\n\t\t\tprocessFile(thePOSIXFilePath)\n\t\tend if\n\tend repeat\nend open\n\n--process folders \non processFolder(theFolder)\n\tset these_items to list folder theFolder without invisibles\n\trepeat with i from 1 to the count of these_items\n\t\tset this_item to alias ((theFolder as text) & (item i of these_items))\n\t\tset the item_info to info for this_item\n\t\tif folder of the item_info is true then\n\t\t\tprocessFolder(this_item)\n\t\telse if (alias of the item_info is false) and ((the file type of the item_info is in the type_list) or the name extension of the item_info is in the extension_list) then\n\t\t\tset theFilePath to (this_item as string)\n\t\t\tset thePOSIXFilePath to POSIX path of theFilePath as string\n\t\t\tprocessFile(thePOSIXFilePath)\n\t\tend if\n\tend repeat\nend processFolder\n\non processFile(thePOSIXFileName)\n\ttry\n\t\tset terminalCommand to \"\"\n\t\tset convertCommand to \"/System/Library/Printers/Libraries/./convert \"\n\t\tset newFileName to thePOSIXFileName & \".pdf\"\n\t\tset terminalCommand to convertCommand & \"-f \" & \"\\\"\" & thePOSIXFileName & \"\\\"\" & \" -o \" & \"\\\"\" & newFileName & \"\\\"\" & \" -j \\\"application/pdf\\\"\"\n\t\t\n\t\tdo shell script terminalCommand\n\tend try\nend processFile\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/AppleScript/Convert To PostScript.applescript",
    "content": "(*\n\nCopyright 2003 Apple Computer, Inc.\n\nYou may incorporate this Apple sample code into your program(s) without\nrestriction.  This Apple sample code has been provided \"AS IS\" and the\nresponsibility for its operation is yours.  You are not permitted to\nredistribute this Apple sample code as \"Apple sample code\" after having\nmade changes.  If you're going to redistribute the code, we require\nthat you make it clear that the code was descended from Apple sample\ncode, but that you've made changes.\n*)\n\nproperty type_list : {\"JPEG\", \"GIFf\", \"PICT\", \"TIFF\", \"PDF\", \"TEXT\"}\nproperty extension_list : {\"jpg\", \"gif\", \"pct\", \"tif\", \"pdf\", \"rtf\"}\n--html is not currently handled\n\non run {}\n\ttell application \"Finder\" to set FinderSelection to the selection as alias list\n\t\n\tset FS to FinderSelection\n\t--Ideally, this list could be passed to the open handler\n\t\n\tset SelectionCount to number of FS -- count\t\n\tif SelectionCount is 0 then\n\t\tset FS to userPicksFolder()\n\telse if the SelectionCount is 1 then\n\t\tset MyPath to path to me\n\t\tif MyPath is item 1 of FS then\n\t\t\t--If I'm a droplet then I was double-clicked\n\t\t\tset FS to userPicksFolder()\n\t\tend if\n\telse\n\t\t--I'm not a double-clicked droplet\n\tend if\n\topen FS\nend run\n\non userPicksFolder()\n\tset these_items to {}\n\tset these_items to (choose file with prompt \"Select a file to convert to PostScript:\" of type {\"JPEG\", \"GIFf\", \"PICT\", \"TIFF\", \"TEXT\", \"RTF\"}) as list\nend userPicksFolder\n\n\non open these_items\n\tset thesefiles to {}\n\tset the item_info to {}\n\trepeat with i from 1 to the count of these_items\n\t\tset this_item to (item i of these_items)\n\t\tset the item_info to info for this_item\n\t\t\n\t\tif folder of the item_info is true then --if the item is a folder\n\t\t\tprocessFolder(this_item)\n\t\telse if ((folder of the item_info is false) and (alias of the item_info is false)) and (the file type of the item_info is in the type_list) or ((the name extension of the item_info) is in the extension_list) then\n\t\t\t\n\t\t\tset theFilePath to (item i of these_items as string)\n\t\t\tset thePOSIXFilePath to POSIX path of theFilePath as string\n\t\t\tprocessFile(thePOSIXFilePath)\n\t\tend if\n\tend repeat\nend open\n\n--process folders \non processFolder(theFolder)\n\tset these_items to list folder theFolder without invisibles\n\trepeat with i from 1 to the count of these_items\n\t\tset this_item to alias ((theFolder as text) & (item i of these_items))\n\t\tset the item_info to info for this_item\n\t\tif folder of the item_info is true then\n\t\t\tprocessFolder(this_item)\n\t\telse if (alias of the item_info is false) and ((the file type of the item_info is in the type_list) or the name extension of the item_info is in the extension_list) then\n\t\t\tset theFilePath to (this_item as string)\n\t\t\tset thePOSIXFilePath to POSIX path of theFilePath as string\n\t\t\tprocessFile(thePOSIXFilePath)\n\t\tend if\n\tend repeat\nend processFolder\n\n--need to pass the URL to Terminal\non processFile(thePOSIXFileName)\n\ttry\n\t\tset terminalCommand to \"\"\n\t\tset convertCommand to \"/System/Library/Printers/Libraries/./convert \"\n\t\tset newFileName to thePOSIXFileName & \".ps\"\n\t\tset terminalCommand to convertCommand & \"-f \" & \"\\\"\" & thePOSIXFileName & \"\\\"\" & \" -o \" & \"\\\"\" & newFileName & \"\\\"\" & \" -j \\\"application/postscript\\\"\"\n\t\t\n\t\tdo shell script terminalCommand\n\tend try\nend processFile\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/AppleScript/Count Messages in All Mailboxes.applescript",
    "content": "(*\nCount Messages in All Mailboxes\n\nCopyright 2002-2012 Apple Inc. All rights reserved.\n\nYou may incorporate this Apple sample code into your program(s) without\nrestriction.  This Apple sample code has been provided \"AS IS\" and the\nresponsibility for its operation is yours.  You are not permitted to\nredistribute this Apple sample code as \"Apple sample code\" after having\nmade changes.  If you're going to redistribute the code, we require\nthat you make it clear that the code was descended from Apple sample\ncode, but that you've made changes.\n*)\n\n(*\nThis script goes through each mailbox, gets the total message count and\nthe unread count, then displays the final output in a new email message.\n*)\n\ntell application \"Mail\"\n\tset localMailboxes to every mailbox\n\tif (count of localMailboxes) is greater than 0 then\n\t\tset messageCountDisplay to \"Local mailboxes (On My Mac)\" & return & my getMessageCountsForMailboxes(localMailboxes)\n\telse\n\t\tset messageCountDisplay to \"\"\n\tend if\n\t\n\tset everyAccount to every account\n\trepeat with eachAccount in everyAccount\n\t\tset accountMailboxes to every mailbox of eachAccount\n\t\tif (count of accountMailboxes) is greater than 0 then\n\t\t\tset messageCountDisplay to messageCountDisplay & return & \"Mailboxes for Account: \" & name of eachAccount & return & my getMessageCountsForMailboxes(accountMailboxes)\n\t\tend if\n\tend repeat\n\t\n\tset outputMessage to make new outgoing message with properties {content:messageCountDisplay, subject:\"Message counts for all my mailboxes\", visible:true}\n\ttell outputMessage\n\t\tset font to \"Courier\"\n\t\tset size to 12\n\tend tell\nend tell\n\non getMessageCountsForMailboxes(theMailboxes)\n\t-- (list of mailboxes)\n\t-- returns string\n\t\n\tset displayString to \"\"\n\t\n\ttell application \"Mail\"\n\t\trepeat with eachMailbox in theMailboxes\n\t\t\tset mailboxName to name of eachMailbox\n\t\t\tset messageCount to (count of (messages of eachMailbox)) as string\n\t\t\tset unreadCount to unread count of eachMailbox as string\n\t\t\t\n\t\t\tset displayString to displayString & \"    \" & my padString(mailboxName, 40) & \"  \" & messageCount & \" (\" & unreadCount & \" unread)\" & return\n\t\tend repeat\n\tend tell\n\t\n\treturn displayString\nend getMessageCountsForMailboxes\n\non padString(theString, fieldLength)\n\t-- (string, integer)\n\t-- returns string\n\t\n\tset stringLength to length of theString\n\t\n\tif stringLength is greater than fieldLength then\n\t\tset paddedString to (text from character 1 to character (fieldLength - 3) of theString) & \"...\"\n\telse -- stringLength is less than or equal to fieldLength\n\t\tset paddedString to theString\n\t\t\n\t\tset paddingLength to fieldLength - stringLength\n\t\trepeat paddingLength times\n\t\t\tset paddedString to paddedString & space\n\t\tend repeat\n\tend if\n\t\n\treturn paddedString\nend padString"
  },
  {
    "path": "src/test/resources/samples/langs/AppleScript/Crazy Message Text.applescript",
    "content": "(*\nCrazy Message Text\n\nCopyright 2002-2012 Apple Inc. All rights reserved.\n\nYou may incorporate this Apple sample code into your program(s) without\nrestriction.  This Apple sample code has been provided \"AS IS\" and the\nresponsibility for its operation is yours.  You are not permitted to\nredistribute this Apple sample code as \"Apple sample code\" after having\nmade changes.  If you're going to redistribute the code, we require\nthat you make it clear that the code was descended from Apple sample\ncode, but that you've made changes.\n*)\n\n(*\nThis script takes a string from the user and then makes a new message\nwhere each letter has a different font, size, and color.\n*)\n\nproperty lowFontSize : 36\nproperty highFontSize : 72\nproperty messageText : \"Happy Birthday!\"\n\nrepeat\n\tset userInput to display dialog \"Enter some message text:\" & return & return & \"Minimum Character Size: \" & (lowFontSize as string) & return & \"Maximum Character Size: \" & (highFontSize as string) default answer messageText buttons {\"Cancel\", \"Set Prefs\", \"Continue\"} default button 3\n\t\n\tif the button returned of userInput is \"Set Prefs\" then\n\t\tset minimumFontSize to 9\n\t\t\n\t\tdisplay dialog \"Enter the minimum font size to use:\" & return & return & \"(Must be at least \" & (minimumFontSize as string) & \")\" default answer lowFontSize buttons {\"OK\"}\n\t\tset newFontSize to text returned of the result as integer\n\t\tif newFontSize is greater than or equal to minimumFontSize then\n\t\t\tset lowFontSize to newFontSize\n\t\telse\n\t\t\tset lowFontSize to minimumFontSize\n\t\tend if\n\t\t\n\t\tdisplay dialog \"Enter the maximum font size to use:\" & return & return & \"(Must be greater than \" & (lowFontSize as string) & \")\" default answer highFontSize buttons {\"OK\"}\n\t\tset newFontSize to text returned of the result as integer\n\t\tif newFontSize is greater than lowFontSize then\n\t\t\tset highFontSize to newFontSize\n\t\telse\n\t\t\tset highFontSize to lowFontSize\n\t\tend if\n\t\t\n\telse -- button returned of userInput is \"Continue\"\n\t\tset theText to text returned of userInput\n\t\tif theText is not \"\" then\n\t\t\tset messageText to theText\n\t\tend if\n\t\texit repeat\n\tend if\nend repeat\n\nset fontList to {\"American Typewriter\", \"American Typewriter Light\", \"American Typewriter Bold\", \"American Typewriter Condensed\", \"American Typewriter Condensed Light\", \"American Typewriter Condensed Bold\", \"Arial\", \"Arial Italic\", \"Arial Bold\", \"Arial Bold Italic\", \"Arial Black\", \"Baskerville\", \"Baskerville Italic\", \"Baskerville SemiBold\", \"Baskerville Bold\", \"Baskerville SemiBold Italic\", \"Baskerville Bold Italic\", \"Big Caslon Medium\", \"Comic Sans MS\", \"Comic Sans MS Bold\", \"Copperplate\", \"Copperplate Light\", \"Copperplate Bold\", \"Didot\", \"Didot Italic\", \"Didot Bold\", \"Futura Medium\", \"Futura Medium Italic\", \"Futura Condensed Medium\", \"Futura Condensed ExtraBold\", \"Geneva\", \"Gill Sans\", \"Gill Sans Italic\", \"Gill Sans Light\", \"Gill Sans Light Italic\", \"Gill Sans Bold\", \"Gill Sans Bold Italic\", \"Herculanum\", \"Lucida Grande\", \"Lucida Grande Bold\", \"Marker Felt Thin\", \"Marker Felt Wide\", \"Optima Regular\", \"Optima Italic\", \"Optima Bold\", \"Optima Bold Italic\", \"Optima ExtraBlack\", \"Papyrus\", \"Verdana\", \"Verdana Italic\", \"Verdana Bold\", \"Verdana Bold Italic\", \"Zapfino\"}\n\ntell application \"Mail\"\n\tactivate\n\tset crazyTextMessage to make new outgoing message with properties {content:messageText, visible:true}\n\t\n\ttell crazyTextMessage\n\t\trepeat with eachCharacter in characters\n\t\t\tset font of eachCharacter to (some item of fontList)\n\t\t\tset size of eachCharacter to (random number from lowFontSize to highFontSize)\n\t\t\tset color of eachCharacter to {random number from 0 to 65535, random number from 0 to 65535, random number from 0 to 65535}\n\t\tend repeat\n\tend tell\nend tell"
  },
  {
    "path": "src/test/resources/samples/langs/AppleScript/Get User Name.applescript",
    "content": "(*\nGet User Name\n\nThis script uses UI element scripting to get the name for the\ncurrent user.\n\nIf \"Enable access for assistive devices\" is not checked,\nthis script will open the Universal Access System Preference and ask\nthe user to check the checkbox.\n\nCopyright 2007 Apple Inc.\n\nYou may incorporate this Apple sample code into your program(s) without\nrestriction.  This Apple sample code has been provided \"AS IS\" and the\nresponsibility for its operation is yours.  You are not permitted to\nredistribute this Apple sample code as \"Apple sample code\" after having\nmade changes.  If you're going to redistribute the code, we require\nthat you make it clear that the code was descended from Apple sample\ncode, but that you've made changes.\n*)\n\ntell application \"System Preferences\"\n\tactivate\n\tset current pane to pane \"com.apple.preferences.users\"\nend tell\n\ntell application \"System Events\"\n\tif UI elements enabled then\n\t\ttell tab group 1 of window \"Accounts\" of process \"System Preferences\"\n\t\t\tclick radio button 1\n\t\t\tdelay 2\n\t\t\tget value of text field 1\n\t\tend tell\n\telse\n\t\ttell application \"System Preferences\"\n\t\t\tactivate\n\t\t\tset current pane to pane \"com.apple.preference.universalaccess\"\n\t\t\tdisplay dialog \"UI element scripting is not enabled. Check \\\"Enable access for assistive devices\\\"\"\n\t\tend tell\n\tend if\nend tell"
  },
  {
    "path": "src/test/resources/samples/langs/AppleScript/Time Of Day.applescript",
    "content": "(* \n Speaks the  date and time of day\n \n Copyright 2008 Apple Inc. All rights reserved.\n \n You may incorporate this Apple sample code into your program(s) without\n restriction.  This Apple sample code has been provided \"AS IS\" and the\n responsibility for its operation is yours.  You are not permitted to\n redistribute this Apple sample code as \"Apple sample code\" after having\n made changes.  If you're going to redistribute the code, we require\n that you make it clear that the code was descended from Apple sample\n code, but that you've made changes.\n *)\n\non isVoiceOverRunning()\n\tset isRunning to false\n\ttell application \"System Events\"\n\t\tset isRunning to (name of processes) contains \"VoiceOver\"\n\tend tell\n\treturn isRunning\nend isVoiceOverRunning\n\non isVoiceOverRunningWithAppleScript()\n\tif isVoiceOverRunning() then\n\t\tset isRunningWithAppleScript to true\n\t\t\n\t\t-- is AppleScript enabled on VoiceOver --\n\t\ttell application \"VoiceOver\"\n\t\t\ttry\n\t\t\t\tset x to bounds of vo cursor\n\t\t\ton error\n\t\t\t\tset isRunningWithAppleScript to false\n\t\t\tend try\n\t\tend tell\n\t\treturn isRunningWithAppleScript\n\tend if\n\treturn false\nend isVoiceOverRunningWithAppleScript\n\nset currentDate to current date\nset amPM to \"AM\"\nset currentHour to (currentDate's hours)\nset currentMinutes to currentDate's minutes\n\nif (currentHour > 12 and currentHour < 24) then\n\tset amPM to \"PM\"\nelse\n\tset amPM to \"AM\"\nend if\n\n--  make minutes below 10 sound nice\nif currentMinutes < 10 then\n\tset currentMinutes to (\"0\" & currentMinutes) as text\nend if\n\n--  ensure 0:nn gets set to 12:nn AM\nif currentHour is equal to 0 then\n\tset currentHour to 12\nend if\n\n--  readjust for 12 hour time\nif (currentHour > 12) then\n\tset currentHour to (currentHour - 12)\nend if\n\nset currentTime to ((currentDate's month) as text) & \" \" & ((currentDate's day) as text) & \", \" & (currentHour as text) & \":\" & ((currentMinutes) as text) & \" \" & amPM as text\n\nif isVoiceOverRunningWithAppleScript() then\n\ttell application \"VoiceOver\"\n\t\toutput currentTime\n\tend tell\nelse\n\tsay currentTime\n\tdelay 2\nend if\n"
  },
  {
    "path": "src/test/resources/samples/langs/AppleScript/center.applescript",
    "content": "set windowWidth to 800\nset windowHeight to 600\ndelay 0.1\n\nset AppleScript's text item delimiters to \"x\"\n\nset res to text returned of (display dialog \"Enter the width x height:\" default answer ((windowWidth & windowHeight) as text))\n\nif res is \"\" then\n  display dialog \"You need to enter a correct response\"\n  return\nend if\nset {windowWidth, windowHeight} to text items of res\n\nset AppleScript's text item delimiters to \"\"\n\ntell application \"Safari\"\n  set screen_width to (do JavaScript \"screen.availWidth\" in document 1)\n  set screen_height to (do JavaScript \"screen.availHeight\" in document 1)\nend tell\n\ntell application \"System Events\"\n  set myFrontMost to name of first item of (processes whose frontmost is true)\nend tell\n\ntell application \"Finder\"\n  set {desktopTop, desktopLeft, desktopRight, desktopBottom} to bounds of desktop\nend tell\n\ntry\n  tell application \"System Events\"\n    tell process myFrontMost\n      set {{w, h}} to size of drawer of window 1\n    end tell\n  end tell\non error\n  set {w, h} to {0, 0}\nend try\n\ntell application \"System Events\"\n  tell process myFrontMost\n    try\n      set {{w, h}} to size of drawer of window 1\n    on error\n      set {w, h} to {0, 0}\n    end try\n    set position of window 1 to {((screen_width - windowWidth) / 2), ((screen_height - windowHeight) / 2.0) - desktopTop}\n    set size of window 1 to {windowWidth -w, windowHeight}\n  end tell\nend tell"
  },
  {
    "path": "src/test/resources/samples/langs/AsciiDoc/encoding.asciidoc",
    "content": "Gregory Romé has written an AsciiDoc plugin for the Redmine project management application.\n\nhttps://github.com/foo-users/foo\nへと `vicmd` キーマップを足してみている試み、\nアニメーションgifです。\n\ntag::romé[]\nGregory Romé has written an AsciiDoc plugin for the Redmine project management application.\nend::romé[]\n\n== Überschrift\n\n* Codierungen sind verrückt auf älteren Versionen von Ruby"
  },
  {
    "path": "src/test/resources/samples/langs/AsciiDoc/list.asc",
    "content": "AsciiDoc Home Page\n==================\n\nTitle\n-----\n\nExample Articles\n~~~~~~~~~~~~~~~~\n- Item 1\n\n- Item 2\n\n- Item 3\n"
  },
  {
    "path": "src/test/resources/samples/langs/AsciiDoc/sample.adoc",
    "content": "Document Title\n==============\nDoc Writer <thedoc@asciidoctor.org>\n:idprefix: id_\n\nPreamble paragraph.\n\nNOTE: This is test, only a test.\n\n== Section A\n\n*Section A* paragraph.\n\n=== Section A Subsection\n\n*Section A* 'subsection' paragraph.\n\n== Section B\n\n*Section B* paragraph.\n\n.Section B list\n* Item 1\n* Item 2\n* Item 3\n"
  },
  {
    "path": "src/test/resources/samples/langs/AspectJ/CacheAspect.aj",
    "content": "package com.blogspot.miguelinlas3.aspectj.cache;\n\nimport java.util.Map;\nimport java.util.WeakHashMap;\n\nimport org.aspectj.lang.JoinPoint;\n\nimport com.blogspot.miguelinlas3.aspectj.cache.marker.Cachable;\n\n/**\n * This simple aspect simulates the behaviour of a very simple cache\n *  \n * @author migue\n *\n */\npublic aspect CacheAspect {\n\n\tpublic pointcut cache(Cachable cachable): execution(@Cachable * * (..)) && @annotation(cachable);\n\t\n\tObject around(Cachable cachable): cache(cachable){\n\t\n\t\tString evaluatedKey = this.evaluateKey(cachable.scriptKey(), thisJoinPoint);\n\t\t\n\t\tif(cache.containsKey(evaluatedKey)){\n\t\t\tSystem.out.println(\"Cache hit for key \" + evaluatedKey);\n\t\t\treturn this.cache.get(evaluatedKey);\n\t\t}\n\t\t\n\t\tSystem.out.println(\"Cache miss for key \" + evaluatedKey);\n\t\tObject value = proceed(cachable);\n\t\tcache.put(evaluatedKey, value);\n\t\treturn value;\n\t}\n\t\n\tprotected String evaluateKey(String key, JoinPoint joinPoint) {\n\t\t// TODO add some smart staff to allow simple scripting in @Cachable annotation\n\t\treturn key;\n\t}\n\t\n\tprotected Map<String, Object> cache = new WeakHashMap<String, Object>();\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/AspectJ/OptimizeRecursionCache.aj",
    "content": "package aspects.caching;\r\n\r\nimport java.util.Map;\r\n\r\n/**\r\n * Cache aspect for optimize recursive functions.\r\n * \r\n * @author Migueli\r\n * @date 05/11/2013\r\n * @version 1.0\r\n *\r\n */\r\npublic abstract aspect OptimizeRecursionCache {\r\n\t\t\r\n\t@SuppressWarnings(\"rawtypes\")\r\n\tprivate Map _cache;\r\n\t\r\n\tpublic OptimizeRecursionCache() {\r\n\t\t_cache = getCache();\r\n\t}\r\n\t\r\n\t@SuppressWarnings(\"rawtypes\")\r\n\tabstract public Map getCache();\r\n\t\r\n\tabstract public pointcut operation(Object o);\r\n\r\n\tpointcut topLevelOperation(Object o): operation(o) && !cflowbelow(operation(Object));\r\n\r\n\tbefore(Object o) : topLevelOperation(o) {\r\n\t\tSystem.out.println(\"Seeking value for \" + o);\r\n\t}\r\n\r\n\tObject around(Object o) : operation(o) {\r\n\t\tObject cachedValue = _cache.get(o);\r\n\t\tif (cachedValue != null) {\r\n\t\t\tSystem.out.println(\"Found cached value for \" + o + \": \" + cachedValue);\r\n\t\t\treturn cachedValue;\r\n\t\t}\r\n\t\treturn proceed(o);\r\n\t}\r\n\r\n\t@SuppressWarnings(\"unchecked\")\r\n\tafter(Object o) returning(Object result) : topLevelOperation(o) {\r\n\t\t_cache.put(o, result);\r\n\t}\r\n\t\r\n\tafter(Object o) returning(Object result) : topLevelOperation(o) {\r\n\t\tSystem.out.println(\"cache size: \" + _cache.size());\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Assembly/External Interrupt.a51",
    "content": "\tORG\t0000h\n\tSJMP\tSTART\n\tORG\t0003h\n\tLCALL\tINT0_ISR\n\tRETI\n\tORG\t000Bh\n\tLCALL\tT0_ISR\n\tRETI\n\tORG\t0013h\n\tLCALL\tINT1_ISR\n\tRETI\n\tORG\t001Bh\n\tLCALL\tT1_ISR\n\tRETI\n\tORG\t0023h\n\tLCALL\tUART_ISR\n\tRETI\n\tORG\t0030h\nSTART:\n\tMOV\tA,#11111110b\n\tSETB\tIT0\t; Set External Interrupt 0 to be falling edge triggered\n\tSETB\tEX0\t; Enable External Interrut 0\n\tSETB\tEA\t; Enable Interrupt\nLEFT:\t\t\t\n\tCJNE\tA,#01111111b,LOOP1\n\tJMP\tRIGHT\nLOOP1:\n\tMOV\tP1,A\n\tRL\tA\t\n\tLCALL\tDELAY\n\tSJMP\tLEFT\t\nRIGHT:\n\tCJNE\tA,#11111110b,LOOP2\n\tJMP\tLEFT\nLOOP2:\n\tMOV\tP1,A\n\tRR\tA\t\n\tLCALL\tDELAY\n\tSJMP\tRIGHT\n\t\nINT0_ISR:\n\tMOV\tR1,#3\nFLASH:\n\tMOV\tP1,#00h\n\tLCALL\tDELAY\n\tMOV\tP1,#0FFh\n\tLCALL\tDELAY\n\tDJNZ\tR1,FLASH\n\tRET\nT0_ISR:\n\tRET\nINT1_ISR:\n\tRET\nT1_ISR:\n\tRET\nUART_ISR:\n\tRET\n\nDELAY:\tMOV\tR5,#20\t;R5*20 mS\nD1:     MOV\tR6,#40\nD2:     MOV\tR7,#249\n\tDJNZ\tR7,$\n \tDJNZ\tR6,D2\n  \tDJNZ\tR5,D1\n   \tRET\n\tEND\n"
  },
  {
    "path": "src/test/resources/samples/langs/Assembly/FASM.asm",
    "content": "\n; flat assembler interface for Win32\n; Copyright (c) 1999-2014, Tomasz Grysztar.\n; All rights reserved.\n\n\tformat\tPE console\n\nsection '.text' code readable executable\n\nstart:\n\n\tmov\t[con_handle],STD_OUTPUT_HANDLE\n\tmov\tesi,_logo\n\tcall\tdisplay_string\n\n\tcall\tget_params\n\tjc\tinformation\n\n\tcall\tinit_memory\n\n\tmov\tesi,_memory_prefix\n\tcall\tdisplay_string\n\tmov\teax,[memory_end]\n\tsub\teax,[memory_start]\n\tadd\teax,[additional_memory_end]\n\tsub\teax,[additional_memory]\n\tshr\teax,10\n\tcall\tdisplay_number\n\tmov\tesi,_memory_suffix\n\tcall\tdisplay_string\n\n\tcall\t[GetTickCount]\n\tmov\t[start_time],eax\n\n\tcall\tpreprocessor\n\tcall\tparser\n\tcall\tassembler\n\tcall\tformatter\n\n\tcall\tdisplay_user_messages\n\tmovzx\teax,[current_pass]\n\tinc\teax\n\tcall\tdisplay_number\n\tmov\tesi,_passes_suffix\n\tcall\tdisplay_string\n\tcall\t[GetTickCount]\n\tsub\teax,[start_time]\n\txor\tedx,edx\n\tmov\tebx,100\n\tdiv\tebx\n\tor\teax,eax\n\tjz\tdisplay_bytes_count\n\txor\tedx,edx\n\tmov\tebx,10\n\tdiv\tebx\n\tpush\tedx\n\tcall\tdisplay_number\n\tmov\tdl,'.'\n\tcall\tdisplay_character\n\tpop\teax\n\tcall\tdisplay_number\n\tmov\tesi,_seconds_suffix\n\tcall\tdisplay_string\n      display_bytes_count:\n\tmov\teax,[written_size]\n\tcall\tdisplay_number\n\tmov\tesi,_bytes_suffix\n\tcall\tdisplay_string\n\txor\tal,al\n\tjmp\texit_program\n\ninformation:\n\tmov\tesi,_usage\n\tcall\tdisplay_string\n\tmov\tal,1\n\tjmp\texit_program\n\nget_params:\n\tmov\t[input_file],0\n\tmov\t[output_file],0\n\tmov\t[symbols_file],0\n\tmov\t[memory_setting],0\n\tmov\t[passes_limit],100\n\tcall\t[GetCommandLine]\n\tmov\tesi,eax\n\tmov\tedi,params\n    find_command_start:\n\tlodsb\n\tcmp\tal,20h\n\tje\tfind_command_start\n\tcmp\tal,22h\n\tje\tskip_quoted_name\n    skip_name:\n\tlodsb\n\tcmp\tal,20h\n\tje\tfind_param\n\tor\tal,al\n\tjz\tall_params\n\tjmp\tskip_name\n    skip_quoted_name:\n\tlodsb\n\tcmp\tal,22h\n\tje\tfind_param\n\tor\tal,al\n\tjz\tall_params\n\tjmp\tskip_quoted_name\n    find_param:\n\tlodsb\n\tcmp\tal,20h\n\tje\tfind_param\n\tcmp\tal,'-'\n\tje\toption_param\n\tcmp\tal,0Dh\n\tje\tall_params\n\tor\tal,al\n\tjz\tall_params\n\tcmp\t[input_file],0\n\tjne\tget_output_file\n\tmov\t[input_file],edi\n\tjmp\tprocess_param\n      get_output_file:\n\tcmp\t[output_file],0\n\tjne\tbad_params\n\tmov\t[output_file],edi\n    process_param:\n\tcmp\tal,22h\n\tje\tstring_param\n    copy_param:\n\tstosb\n\tlodsb\n\tcmp\tal,20h\n\tje\tparam_end\n\tcmp\tal,0Dh\n\tje\tparam_end\n\tor\tal,al\n\tjz\tparam_end\n\tjmp\tcopy_param\n    string_param:\n\tlodsb\n\tcmp\tal,22h\n\tje\tstring_param_end\n\tcmp\tal,0Dh\n\tje\tparam_end\n\tor\tal,al\n\tjz\tparam_end\n\tstosb\n\tjmp\tstring_param\n    option_param:\n\tlodsb\n\tcmp\tal,'m'\n\tje\tmemory_option\n\tcmp\tal,'M'\n\tje\tmemory_option\n\tcmp\tal,'p'\n\tje\tpasses_option\n\tcmp\tal,'P'\n\tje\tpasses_option\n\tcmp\tal,'s'\n\tje\tsymbols_option\n\tcmp\tal,'S'\n\tje\tsymbols_option\n    bad_params:\n\tstc\n\tret\n    get_option_value:\n\txor\teax,eax\n\tmov\tedx,eax\n    get_option_digit:\n\tlodsb\n\tcmp\tal,20h\n\tje\toption_value_ok\n\tcmp\tal,0Dh\n\tje\toption_value_ok\n\tor\tal,al\n\tjz\toption_value_ok\n\tsub\tal,30h\n\tjc\tinvalid_option_value\n\tcmp\tal,9\n\tja\tinvalid_option_value\n\timul\tedx,10\n\tjo\tinvalid_option_value\n\tadd\tedx,eax\n\tjc\tinvalid_option_value\n\tjmp\tget_option_digit\n    option_value_ok:\n\tdec\tesi\n\tclc\n\tret\n    invalid_option_value:\n\tstc\n\tret\n    memory_option:\n\tlodsb\n\tcmp\tal,20h\n\tje\tmemory_option\n\tcmp\tal,0Dh\n\tje\tbad_params\n\tor\tal,al\n\tjz\tbad_params\n\tdec\tesi\n\tcall\tget_option_value\n\tor\tedx,edx\n\tjz\tbad_params\n\tcmp\tedx,1 shl (32-10)\n\tjae\tbad_params\n\tmov\t[memory_setting],edx\n\tjmp\tfind_param\n    passes_option:\n\tlodsb\n\tcmp\tal,20h\n\tje\tpasses_option\n\tcmp\tal,0Dh\n\tje\tbad_params\n\tor\tal,al\n\tjz\tbad_params\n\tdec\tesi\n\tcall\tget_option_value\n\tor\tedx,edx\n\tjz\tbad_params\n\tcmp\tedx,10000h\n\tja\tbad_params\n\tmov\t[passes_limit],dx\n\tjmp\tfind_param\n    symbols_option:\n\tmov\t[symbols_file],edi\n      find_symbols_file_name:\n\tlodsb\n\tcmp\tal,20h\n\tjne\tprocess_param\n\tjmp\tfind_symbols_file_name\n    param_end:\n\tdec\tesi\n    string_param_end:\n\txor\tal,al\n\tstosb\n\tjmp\tfind_param\n    all_params:\n\tcmp\t[input_file],0\n\tje\tbad_params\n\tclc\n\tret\n\ninclude 'system.inc'\n\ninclude '..\\errors.inc'\ninclude '..\\symbdump.inc'\ninclude '..\\preproce.inc'\ninclude '..\\parser.inc'\ninclude '..\\exprpars.inc'\ninclude '..\\assemble.inc'\ninclude '..\\exprcalc.inc'\ninclude '..\\formats.inc'\ninclude '..\\x86_64.inc'\ninclude '..\\avx.inc'\n\ninclude '..\\tables.inc'\ninclude '..\\messages.inc'\n\nsection '.data' data readable writeable\n\ninclude '..\\version.inc'\n\n_copyright db 'Copyright (c) 1999-2014, Tomasz Grysztar',0Dh,0Ah,0\n\n_logo db 'flat assembler  version ',VERSION_STRING,0\n_usage db 0Dh,0Ah\n       db 'usage: fasm <source> [output]',0Dh,0Ah\n       db 'optional settings:',0Dh,0Ah\n       db ' -m <limit>    set the limit in kilobytes for the available memory',0Dh,0Ah\n       db ' -p <limit>    set the maximum allowed number of passes',0Dh,0Ah\n       db ' -s <file>     dump symbolic information for debugging',0Dh,0Ah\n       db 0\n_memory_prefix db '  (',0\n_memory_suffix db ' kilobytes memory)',0Dh,0Ah,0\n_passes_suffix db ' passes, ',0\n_seconds_suffix db ' seconds, ',0\n_bytes_suffix db ' bytes.',0Dh,0Ah,0\n\nalign 4\n\ninclude '..\\variable.inc'\n\ncon_handle dd ?\nmemory_setting dd ?\nstart_time dd ?\nbytes_count dd ?\ndisplayed_count dd ?\ncharacter db ?\nlast_displayed rb 2\n\nparams rb 1000h\noptions rb 1000h\nbuffer rb 4000h\n\nstack 10000h\n\nsection '.idata' import data readable writeable\n\n  dd 0,0,0,rva kernel_name,rva kernel_table\n  dd 0,0,0,0,0\n\n  kernel_table:\n    ExitProcess dd rva _ExitProcess\n    CreateFile dd rva _CreateFileA\n    ReadFile dd rva _ReadFile\n    WriteFile dd rva _WriteFile\n    CloseHandle dd rva _CloseHandle\n    SetFilePointer dd rva _SetFilePointer\n    GetCommandLine dd rva _GetCommandLineA\n    GetEnvironmentVariable dd rva _GetEnvironmentVariable\n    GetStdHandle dd rva _GetStdHandle\n    VirtualAlloc dd rva _VirtualAlloc\n    VirtualFree dd rva _VirtualFree\n    GetTickCount dd rva _GetTickCount\n    GetSystemTime dd rva _GetSystemTime\n    GlobalMemoryStatus dd rva _GlobalMemoryStatus\n    dd 0\n\n  kernel_name db 'KERNEL32.DLL',0\n\n  _ExitProcess dw 0\n    db 'ExitProcess',0\n  _CreateFileA dw 0\n    db 'CreateFileA',0\n  _ReadFile dw 0\n    db 'ReadFile',0\n  _WriteFile dw 0\n    db 'WriteFile',0\n  _CloseHandle dw 0\n    db 'CloseHandle',0\n  _SetFilePointer dw 0\n    db 'SetFilePointer',0\n  _GetCommandLineA dw 0\n    db 'GetCommandLineA',0\n  _GetEnvironmentVariable dw 0\n    db 'GetEnvironmentVariableA',0\n  _GetStdHandle dw 0\n    db 'GetStdHandle',0\n  _VirtualAlloc dw 0\n    db 'VirtualAlloc',0\n  _VirtualFree dw 0\n    db 'VirtualFree',0\n  _GetTickCount dw 0\n    db 'GetTickCount',0\n  _GetSystemTime dw 0\n    db 'GetSystemTime',0\n  _GlobalMemoryStatus dw 0\n    db 'GlobalMemoryStatus',0\n\nsection '.reloc' fixups data readable discardable\n"
  },
  {
    "path": "src/test/resources/samples/langs/Assembly/forth.nasm",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; A Forth by Chris Hinsley\n;; nasm -f macho forth.nasm\n;; ld -o forth -e _main forth.o\n;; ./forth\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\t%define VERSION_NUM 30\n\n\t; various buffer area sizes\n\t%define DATA_STACK_SIZE 1024\n\t%define USER_DEFS_SIZE (64*1024)\n\t%define NUM_HASH_CHAINS 64\n\t%define MAX_LINE_SIZE 128\n\n\t%define SYS_exit 1\n\t%define SYS_read 3\n\t%define SYS_write 4\n\t%define SYS_open 5\n\t%define SYS_close 6\n\t%define SYS_unlink 10\n\t%define\tSYS_mprotect 74\n\t%define SYS_fsync 95\n\t%define SYS_rename 128\n\t%define SYS_stat 188\n\t%define SYS_lseek 199\n\t%define SYS_fstat 189\n\t%define SYS_ftruncate 201\n\n\t%define PROT_READ 0x01\t\t;pages can be read\n\t%define PROT_WRITE 0x02\t\t;pages can be written\n\t%define PROT_EXEC 0x04\t\t;pages can be executed\n\t%define PROT_ALL (PROT_READ | PROT_WRITE | PROT_EXEC)\n\t%define PAGE_SIZE 4096\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n; some NASM codeing macros\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\t%macro loopstart 0\n\t\t%push loopstart\n\t%$loop_start:\n\t%endmacro\n\n\t%macro break 0\n\t\tjmp %$loop_exit\n\t%endmacro\n\n\t%macro breakif 1\n\t\tj%+1 %$loop_exit\n\t%endmacro\n\n\t%macro loopend 0\n\t\tjmp %$loop_start\n\t%$loop_exit:\n\t\t%pop\n\t%endmacro\n\n\t%macro repeat 0\n\t\t%push repeat\n\t%$loop_start:\n\t%endmacro\n\n\t%macro until 1\n\t\tj%-1 %$loop_start\n\t%$loop_exit:\n\t\t%pop\n\t%endmacro\n\n\t%macro if 1\n\t\t%push if\n\t\tj%-1 %$ifnot\n\t%endmacro\n\n\t%macro else 0\n\t\t%ifctx if\n\t\t\t%repl else\n\t\t\tjmp %$ifend\n\t\t%$ifnot:\n\t\t%else\n\t\t\t%error \"expected `if' before `else'\"\n\t\t%endif\n\t%endmacro\n\n\t%macro endif 0\n\t\t%ifctx if\n\t\t%$ifnot:\n\t\t\t%pop\n\t\t%elifctx else\n\t\t%$ifend:\n\t\t\t%pop\n\t\t%else\n\t\t\t%error \"expected `if' or `else' before `endif'\"\n\t\t%endif\n\t%endmacro\n\n;;;;;;;;;;;;;;;;\n; base VM macros\n;;;;;;;;;;;;;;;;\n\n\t; eip\tForths IP\n\t; esp\tForths R\n\t; ebp\tForths S\n\t; ebx\tForths TOS\n\n\t; push on to return stack\n\t%macro PUSHRSP 1\n\t\tpush %1\n\t%endm\n\n\t; pop top of return stack\n\t%macro POPRSP 1\n\t\tpop %1\n\t%endm\n\n\t; save into return stack\n\t%macro PUTRSP 2\n\t\t%if (%2 = 0)\n\t\t\tmov [esp], %1\n\t\t%elif ((%2 >= -128) && (%2 < 128))\n\t\t\tmov [byte esp + %2], %1\n\t\t%else\n\t\t\tmov [long esp + %2], %1\n\t\t%endif\n\t%endm\n\n\t; load from return stack\n\t%macro PICKRSP 2\n\t\t%if (%2 = 0)\n\t\t\tmov %1, [esp]\n\t\t%elif ((%2 >= -128) && (%2 < 128))\n\t\t\tmov %1, [byte esp + %2]\n\t\t%else\n\t\t\tmov %1, [long esp + %2]\n\t\t%endif\n\t%endm\n\n\t; set return stack\n\t%macro SETRSP 1\n\t\tmov esp, %1\n\t%endm\n\n\t; get return stack\n\t%macro GETRSP 1\n\t\tmov %1, esp\n\t%endm\n\n\t; adjust return stack\n\t%macro ADDRSP 1\n\t\t%if ((%1 >= -128) && (%1 < 128))\n\t\t\tadd esp, byte %1\n\t\t%else\n\t\t\tadd esp, %1\n\t\t%endif\n\t%endm\n\n\t; push on to data stack\n\t%macro PUSHDSP 1\n\t\tsub ebp, byte 4\n\t\tmov [ebp], %1\n\t%endm\n\n\t; pop top of data stack\n\t%macro POPDSP 1\n\t\tmov %1, [ebp]\n\t\tadd ebp, byte 4\n\t%endm\n\n\t; save into data stack\n\t%macro PUTDSP 2\n\t\t%if (%2 = 0)\n\t\t\tmov [ebp], %1\n\t\t%elif ((%2 >= -128) && (%2 < 128))\n\t\t\tmov [byte ebp + %2], %1\n\t\t%else\n\t\t\tmov [long ebp + %2], %1\n\t\t%endif\n\t%endm\n\n\t; load from data stack\n\t%macro PICKDSP 2\n\t\t%if (%2 = 0)\n\t\t\tmov %1, [ebp]\n\t\t%elif ((%2 >= -128) && (%2 < 128))\n\t\t\tmov %1, [byte ebp + %2]\n\t\t%else\n\t\t\tmov %1, [long ebp + %2]\n\t\t%endif\n\t%endm\n\n\t; set data stack\n\t%macro SETDSP 1\n\t\tmov ebp, %1\n\t%endm\n\n\t; get data stack\n\t%macro GETDSP 1\n\t\tmov %1, ebp\n\t%endm\n\n\t; adjust data stack\n\t%macro ADDDSP 1\n\t\t%if ((%1 >= -128) && (%1 < 128))\n\t\t\tadd ebp, byte %1\n\t\t%else\n\t\t\tadd ebp, %1\n\t\t%endif\n\t%endm\n\n\t; load value onto data stack\n\t%macro LOADTOS 1\n\t\tPUSHDSP ebx\n\t\tmov ebx, %1\n\t%endm\n\n\t; move from data to return stack\n\t%macro TORSP 0\n\t\tPUSHRSP ebx\n\t\tPOPDSP ebx\n\t%endm\n\n\t; move from return to data stack\n\t%macro FROMRSP 0\n\t\tPUSHDSP ebx\n\t\tPOPRSP ebx\n\t%endm\n\n\t; copy from return to data stack\n\t%macro FETCHRSP 0\n\t\tPUSHDSP ebx\n\t\tPICKRSP ebx, 0\n\t%endm\n\n\t; align reg\n\t%define DP_ALIGN 3\n\t%macro ALIGNREG 1\n\t\tadd %1, byte DP_ALIGN\n\t\tand %1, byte ~DP_ALIGN\n\t%endm\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; dictionary building macros\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\t; format of dictionary entry flag byte\n\t%define F_IMMED 0x80\n\t%define F_HIDDEN 0x20\n\t%define F_LENMASK 0x1f\n\n\t%define NULL 0\n\t%define H_LLINK 0\n\t%define H_HLINK 4\n\t%define H_NSIZE 8\n\t%define H_NAME 9\n\n\t%define XT_BODY -12\n\t%define XT_LENGTH -8\n\t%define XT_COMPILE -4\n\t%define XT_SIZE 12\n\t\n\t%macro defword 4\n\t\t%push newword\n\t\t%strlen len %1\n\t\talign 4\n\tdic_%3:\n\t\tdd NULL\t\t\t\t; LATEST list link\n\t\tdd NULL\t\t\t\t; hash chain link\n\t\tdb len + %2\t\t\t; flags + length byte\n\t\tdb %1\t\t\t\t; the name\n\t\tdd %3\t\t\t\t; body pointer\n\t\tdd %$code_end - %3\t; code length\n\t\tdd %4\t\t\t\t; compile action word\n\t%3:\n\t%endm\t\t\t\t\t; assembler code follows\n\n\t%macro defword_end 0\n\t%$code_end:\n\t\t%pop\n\t%endm\n\n\t%macro defvar 4\n\t\tdefword %1, %2, %3, WORD_INLINE_COMMA\n\t\tLOADTOS var_%3\n\t\tret\n\t\tdefword_end\n\t\talign 4\n\tvar_%3:\n\t\tdd %4\n\t%endm\n\n\t%macro defvar2 5\n\t\tdefword %1, %2, %3, WORD_INLINE_COMMA\n\t\tLOADTOS var_%3\n\t\tret\n\t\tdefword_end\n\t\talign 4\n\tvar_%3:\n\t\tdd %4\n\t\tdd %5\n\t%endm\n\n\t%macro defconst 4\n\t\tdefword %1, %2, %3, WORD_INLINE_COMMA\n\t\tLOADTOS %4\n\t\tret\n\t\tdefword_end\n\t%endm\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n; entry point\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tSECTION .text\n\tglobal _main\n_main:\n\t; use mprotect to allow read/write/execute of the data section\n\tmov edx, forth_start\n\tand edx, -PAGE_SIZE\t\t;start address\n\tmov ecx, forth_end\n\tsub ecx, edx\t\t\t;length\n\tmov ebx, PROT_ALL\t\t;flags\n\tpush ebx\n\tpush ecx\n\tpush edx\n\tpush 0\t\t\t\t\t;padding\n\tmov eax, SYS_mprotect\n\tint 0x80\n\tadd esp, 16\n\tjmp forth_start\n\n\tSECTION .data\nforth_start:\n\t; init data and return stacks, saving initial positions\n\t; in Forth vars R0 and S0\n\tcld\n\tGETRSP [var_WORD_SZ]\n\tSETDSP [var_WORD_SZ]\n\tADDRSP -DATA_STACK_SIZE\n\tGETRSP [var_WORD_RZ]\n\n\t; link built in dictionary\n\tmov esi, dictionary_start\n\txor edi, edi\n\trepeat\n\t\tlodsd\n\t\tmov [eax + H_LLINK], edi\n\t\tmov edi, eax\n\t\tpush esi\n\t\tmov cl, [eax + H_NSIZE]\n\t\tand ecx, F_LENMASK\n\t\tlea esi, [eax + H_NAME]\n\t\tcall strhashi\n\t\tand ebx, NUM_HASH_CHAINS-1\n\t\tmov esi, hash_buckets\n\t\tmov eax, [esi + (ebx * 4)]\n\t\tmov [esi + (ebx * 4)], edi\n\t\tmov [edi + H_HLINK], eax\n\t\tpop esi\n\t\tcmp esi, dictionary_end\n\tuntil z\n\tmov [var_WORD_LATEST], edi\n\n\t; run temp interpreter loop till we can get into the real QUIT word\n\tcall WORD_LBRAC\t\t\t; interpret state\n\tLOADTOS 666q\t\t\t; octal !\n\tTORSP\n\tLOADTOS 0\n\tTORSP\n\tLOADTOS bootfile\n\tTORSP\n\tcall WORD_SYS_OPEN\n\tcall WORD_SYSCALL\n\tADDRSP 12\n\tTORSP\t\t\t\t\t; ( fd ) of \"forth.f\"\n\tloopstart\n\t\tLOADTOS tib_buffer\n\t\tLOADTOS MAX_LINE_SIZE\n\t\tFETCHRSP\t\t\t; ( c-addr len fd )\n\t\tcall WORD_READLINE\t; ( num flag flag )\n\t\tcall WORD_DROP2\n\t\tLOADTOS tib_buffer\n\t\tcall WORD_SWAP\n\t\tcall WORD_INHASH\n\t\tcall WORD_STORE2\n\t\tLOADTOS 0\n\t\tcall WORD_TOIN\n\t\tcall WORD_STORE\n\t\tcall WORD_INTERPRET\n\tloopend\t\t\t\t\t; and loop till QUIT takes over\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; a few case insensative string operations\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\t%macro to_lower 1\n\t\t; lower case check\n\t\tcmp %1, 'A'\n\t\tif ge\n\t\t\tcmp %1, 'Z'\n\t\t\tif le\n\t\t\t\t; make it lower case\n\t\t\t\tadd %1, byte 'a' - 'A'\n\t\t\tendif\n\t\tendif\n\t%endm\n\nstrcpyi:\n\ttest ecx, ecx\n\tif nz\n\tstrcpyi_l1:\n\t\tlodsb\n\t\tto_lower al\n\t\tstosb\n\t\tloop strcpyi_l1\n\tendif\n\tret\n\nstrcmpi:\n\ttest ecx, ecx\n\tif nz\n\tstrcmpi_l1:\n\t\tlodsb\n\t\tmov bl, [edi]\n\t\tlea edi, [edi + 1]\n\t\tto_lower al\n\t\tto_lower bl\n\t\tcmp bl, al\n\t\tif z\n\t\t\tloop strcmpi_l1\n\t\tendif\n\tendif\n\tret\n\n;;;;;;;;;;;;;;;\n; hash function\n;;;;;;;;;;;;;;;\n\nstrhashi:\n\tmov ebx, 5381\n\ttest ecx, ecx\n\tif nz\n\t\tmov edx, 33\n\tstrhashi_l1:\n\t\tlodsb\n\t\tmovzx eax, al\n\t\tto_lower eax\n\t\timul ebx, edx\n\t\tadd ebx, eax\n\t\tloop strhashi_l1\n\tendif\n\tret\n\n;;;;;;;;;;;;;;;;;;;\n; syscall functions\n;;;;;;;;;;;;;;;;;;;\n\n_syscall:\n\tint 0x80\n\tif c\n\t\tneg eax\n\tendif\n\tret\n\n_lsyscall:\n\tint 0x80\n\tif c\n\t\tnot eax\n\t\tnot edx\n\t\tadd eax, 1\n\t\tadc edx, 0\n\tendif\n\tret\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; built in variables\n; STATE\t\tIs the interpreter executing code (0) or compiling a word (non-zero)?\n; LATEST\tPoints to the latest (most recently defined) word in the dictionary.\n; DP\t\tPoints to the next free byte of memory. When compiling, compiled words go here.\n; S0\t\tStores the address of the top of the parameter stack.\n; R0\t\tThe address of the top of the return stack.\n; BASE\t\tThe current base for printing and reading numbers.\n; #IN\t\tThe current input buffer descriptor.\n; >IN\t\tThe current input offset.\n; SOURCEFD\tThe current input source file descriptor.\n; BLK\t\tThe current block number.\n; CHARBUF\tSingle char buffer.\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefvar \"state\", 0, WORD_STATE, 0\n\tdefvar \"dp\", 0, WORD_DP, dictionary_start\n\tdefvar \"latest\", 0, WORD_LATEST, 0\n\tdefvar \"s0\", 0, WORD_SZ, 0\n\tdefvar \"r0\", 0, WORD_RZ, 0\n\tdefvar \"base\", 0, WORD_BASE, 10\n\tdefvar2 \"#IN\", 0, WORD_INHASH, 0, 0\n\tdefvar \">in\", 0, WORD_TOIN, 0\n\tdefvar \"sourcefd\", 0, WORD_SOURCEFD, 0\n\tdefvar \"blk\", 0, WORD_BLK, 0\n\tdefvar \"charbuf\", 0, WORD_CHARBUF, 0\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; built in constants\n; VERSION\t\tThe current version of this FORTH.\n; WORDBUF\t\tThe address of the buffer WORD uses.\n; LINESIZE\t\tThe line buffer size.\n; F_IMMED\t\tThe IMMEDIATE flag's actual value.\n; F_HIDDEN\t\tThe HIDDEN flag's actual value.\n; F_LENMASK\t\tThe length mask in the flags/len byte.\n; H_NSIZE\t\tThe flags/len field offset.\n; H_NAME\t\tThe name field offset.\n; XT_BODY\t\tThe xt body pointer.\n; XT_LENGTH\t\tThe xt length field offset.\n; XT_COMPILE\tThe xt compile field offset.\n; XT_SIZE\t\tThe xt size offset.\n; SYS_*\t\t\tThe numeric codes of various syscalls.\n; O_*\t\t\tVarious sycall flags/modes.\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefconst \"version\", 0, WORD_VERSION, VERSION_NUM\n\tdefconst \"wordbuf\", 0, WORD_WORDBUF, word_buf\n\tdefconst \"linesize\", 0, WORD_LINESIZE, MAX_LINE_SIZE\n\tdefconst \"f_immed\", 0, WORD__F_IMMED, F_IMMED\n\tdefconst \"f_hidden\", 0, WORD__F_HIDDEN, F_HIDDEN\n\tdefconst \"f_lenmask\", 0, WORD__F_LENMASK, F_LENMASK\n\tdefconst \"h_nsize\", 0, WORD__H_NSIZE, H_NSIZE\n\tdefconst \"h_name\", 0, WORD__H_NAME, H_NAME\n\tdefconst \"xt_body\", 0, WORD__XT_BODY, XT_BODY\n\tdefconst \"xt_length\", 0, WORD__XT_LENGTH, XT_LENGTH\n\tdefconst \"xt_compile\", 0, WORD__XT_COMPILE, XT_COMPILE\n\tdefconst \"xt_size\", 0, WORD__XT_SIZE, XT_SIZE\n\n\tdefconst \"sys_exit\", 0, WORD_SYS_EXIT, SYS_exit\n\tdefconst \"sys_open\", 0, WORD_SYS_OPEN, SYS_open\n\tdefconst \"sys_close\", 0, WORD_SYS_CLOSE, SYS_close\n\tdefconst \"sys_read\", 0, WORD_SYS_READ, SYS_read\n\tdefconst \"sys_write\", 0, WORD_SYS_WRITE, SYS_write\n\tdefconst \"sys_unlink\", 0, WORD_SYS_UNLINK, SYS_unlink\n\tdefconst \"sys_rename\", 0, WORD_SYS_RENAME, SYS_rename\n\tdefconst \"sys_ftruncate\", 0, WORD_SYS_FTRUNCATE, SYS_ftruncate\n\tdefconst \"sys_fsync\", 0, WORD_SYS_FSYNC, SYS_fsync\n\tdefconst \"sys_lseek\", 0, WORD_SYS_LSEEK, SYS_lseek\n\tdefconst \"sys_fstat\", 0, WORD_SYS_FSTAT, SYS_fstat\n\tdefconst \"sys_stat\", 0, WORD_SYS_STAT, SYS_stat\n\n\tdefconst \"o_rdonly\", 0, WORD_O_RDONLY, 0x0\n\tdefconst \"o_wronly\", 0, WORD_O_WRONLY, 0x1\n\tdefconst \"o_rdwr\", 0, WORD_O_RDWR, 0x2\n\tdefconst \"o_creat\", 0, WORD_O_CREAT, 0x100\n\tdefconst \"o_excl\", 0, WORD_O_EXCL, 0x200\n\tdefconst \"o_trunc\", 0, WORD_O_TRUNC, 0x1000\n\tdefconst \"o_append\", 0, WORD_O_APPEND, 0x2000\n\tdefconst \"o_nonblock\", 0, WORD_O_NONBLOCK, 0x4000\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; data stack ordering words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"dsp@\", 0, WORD_DSPFETCH, WORD_INLINE_COMMA\n\tPUSHDSP ebx\n\tGETDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"dsp!\", 0, WORD_DSPSTORE, WORD_INLINE_COMMA\n\tSETDSP ebx\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"drop\", 0, WORD_DROP, WORD_INLINE_COMMA\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"swap\", 0, WORD_SWAP, WORD_INLINE_COMMA\n\txchg ebx, [ebp]\n\tret\n\tdefword_end\n\n\tdefword \"dup\", 0, WORD_DUP, WORD_INLINE_COMMA\n\tPUSHDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"over\", 0, WORD_OVER, WORD_INLINE_COMMA\n\tPUSHDSP ebx\n\tPICKDSP ebx, 4\n\tret\n\tdefword_end\n\n\tdefword \"rot\", 0, WORD_ROT, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPICKDSP ecx, 0\n\tPICKDSP ebx, 4\n\tPUTDSP eax, 0\n\tPUTDSP ecx, 4\n\tret\n\tdefword_end\n\n\tdefword \"-rot\", 0, WORD_NROT, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPICKDSP ebx, 0\n\tPICKDSP ecx, 4\n\tPUTDSP ecx, 0\n\tPUTDSP eax, 4\n\tret\n\tdefword_end\n\n\tdefword \"2drop\", 0, WORD_DROP2, WORD_INLINE_COMMA\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"2dup\", 0, WORD_DUP2, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tADDDSP -8\n\tPUTDSP eax, 0\n\tPUTDSP ebx, 4\n\tret\n\tdefword_end\n\n\tdefword \"2swap\", 0, WORD_SWAP2, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPICKDSP ecx, 0\n\tPICKDSP ebx, 4\n\tPICKDSP edx, 8\n\tPUTDSP edx, 0\n\tPUTDSP eax, 4\n\tPUTDSP ecx, 8\n\tret\n\tdefword_end\n\n\tdefword \"2rot\", 0, WORD_ROT2, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPICKDSP ecx, 16\n\tPICKDSP ebx, 12\n\tPICKDSP edx, 8\n\tPICKDSP edi, 4\n\tPICKDSP esi, 0\n\tPUTDSP edx, 16\n\tPUTDSP edi, 12\n\tPUTDSP esi, 8\n\tPUTDSP eax, 4\n\tPUTDSP ecx, 0\n\tret\n\tdefword_end\n\n\tdefword \"?dup\", 0, WORD_QDUP, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tif nz\n\t\tPUSHDSP ebx\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"!?dup\", 0, WORD_NQDUP, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tif z\n\t\tPUSHDSP ebx\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"nip\", 0, WORD_NIP, WORD_INLINE_COMMA\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"tuck\", 0, WORD_TUCK, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tPUTDSP ebx, 0\n\tPUSHDSP eax\n\tret\n\tdefword_end\n\n\tdefword \"pick\", 0, WORD_PICK, WORD_INLINE_COMMA\n\tmov ebx, [ebp + (ebx * 4)]\n\tret\n\tdefword_end\n\n\tdefword \"2tuck\", 0, WORD_TUCK2, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tPICKDSP ecx, 4\n\tPICKDSP edx, 8\n\tADDDSP -8\n\tPUTDSP eax, 0\n\tPUTDSP ecx, 4\n\tPUTDSP edx, 8\n\tPUTDSP ebx, 12\n\tPUTDSP eax, 16\n\tret\n\tdefword_end\n\n\tdefword \"2nip\", 0, WORD_NIP2, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tADDDSP 8\n\tPUTDSP eax, 0\n\tret\n\tdefword_end\n\n\tdefword \"2over\", 0, WORD_OVER2, WORD_INLINE_COMMA\n\tADDDSP -8\n\tPUTDSP ebx, 4\n\tPICKDSP ebx, 16\n\tPUTDSP ebx, 0\n\tPICKDSP ebx, 12\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; return stack ordering words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \">r\", 0, WORD_TOR, WORD_INLINE_COMMA\n\tTORSP\n\tret\n\tdefword_end\n\n\tdefword \"r>\", 0, WORD_FROMR, WORD_INLINE_COMMA\n\tFROMRSP\n\tret\n\tdefword_end\n\n\tdefword \"2>r\", 0, WORD_TOR2, WORD_INLINE_COMMA\n\tADDRSP -8\n\tPICKDSP ecx, 0\n\tPUTRSP ebx, 0\n\tPUTRSP ecx, 4\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"2r>\", 0, WORD_FROMR2, WORD_INLINE_COMMA\n\tADDDSP -8\n\tPUTDSP ebx, 4\n\tPICKRSP ebx, 0\n\tPICKRSP ecx, 4\n\tPUTDSP ecx, 0\n\tADDRSP 8\n\tret\n\tdefword_end\n\n\tdefword \"rsp@\", 0, WORD_RSPFETCH, WORD_INLINE_COMMA\n\tPUSHDSP ebx\n\tGETRSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"r@\", 0, WORD_RFETCH, WORD_INLINE_COMMA\n\tPUSHDSP ebx\n\tPICKRSP ebx, 0\n\tret\n\tdefword_end\n\n\tdefword \"r!\", 0, WORD_RSTORE, WORD_INLINE_COMMA\n\tPUTRSP ebx, 0\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"2r@\", 0, WORD_RFETCH2, WORD_INLINE_COMMA\n\tADDDSP -8\n\tPUTDSP ebx, 4\n\tPICKRSP ebx, 4\n\tPICKRSP ecx, 0\n\tPUTDSP ecx, 0\n\tret\n\tdefword_end\n\n\tdefword \"rsp!\", 0, WORD_RSPSTORE, WORD_INLINE_COMMA\n\tSETRSP ebx\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"rdrop\", 0, WORD_RDROP, WORD_INLINE_COMMA\n\tADDRSP 4\n\tret\n\tdefword_end\n\n\tdefword \"2rdrop\", 0, WORD_RDROP2, WORD_INLINE_COMMA\n\tADDRSP 8\n\tret\n\tdefword_end\n\n\tdefword \"n>r\", 0, WORD_NTOR, WORD_CALL_COMMA\n\tPUSHDSP ebx\n\tPICKRSP eax, 0\n\tmov ecx, ebx\n\tinc ecx\n\tneg ebx\n\tlea esp, [esp + (ebx * 4)]\n\tmov esi, ebp\n\tmov edi, esp\n\trep movsd\n\tmov ebp, esi\n\tPOPDSP ebx\n\tjmp eax\n\tdefword_end\n\n\tdefword \"nr>\", 0, WORD_NFROMR, WORD_CALL_COMMA\n\tPUSHDSP ebx\n\tPOPRSP eax\n\tPICKRSP ebx, 0\n\tinc ebx\n\tmov ecx, ebx\n\tneg ebx\n\tlea ebp, [ebp + (ebx * 4)]\n\tmov esi, esp\n\tmov edi, ebp\n\trep movsd\n\tmov esp, esi\n\tPOPDSP ebx\n\tjmp eax\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; memory fetch and store words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"!\", 0, WORD_STORE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tmov [ebx], eax\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"@\", 0, WORD_FETCH, WORD_INLINE_COMMA\n\tmov ebx, [ebx]\n\tret\n\tdefword_end\n\n\tdefword \"+!\", 0, WORD_ADDSTORE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tadd [ebx], eax\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"-!\", 0, WORD_SUBSTORE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tsub [ebx], eax\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"c!\", 0, WORD_STOREBYTE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tmov [ebx], al\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"c+!\", 0, WORD_ADDBYTE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tadd [ebx], al\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"c@\", 0, WORD_FETCHBYTE, WORD_INLINE_COMMA\n\tmov eax, ebx\n\txor ebx, ebx\n\tmov bl, [eax]\n\tret\n\tdefword_end\n\n\tdefword \"w!\", 0, WORD_STORESHORT, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tmov [ebx], ax\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"w@\", 0, WORD_FETCHSHORT, WORD_INLINE_COMMA\n\tmov eax, ebx\n\txor ebx, ebx\n\tmov bx, [eax]\n\tret\n\tdefword_end\n\n\tdefword \"2!\", 0, WORD_STORE2, WORD_INLINE_COMMA\n\tPICKDSP ecx, 4\n\tPICKDSP edx, 0\n\tmov [ebx + 4], ecx\n\tmov [ebx], edx\n\tPICKDSP ebx, 8\n\tADDDSP 12\n\tret\n\tdefword_end\n\n\tdefword \"2@\", 0, WORD_FETCH2, WORD_INLINE_COMMA\n\tADDDSP -4\n\tmov ecx, [ebx +4]\n\tmov ebx, [ebx]\n\tPUTDSP ecx, 0\n\tret\n\tdefword_end\n\n\tdefword \"blank\", 0, WORD_BLANK, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPICKDSP ebx, 4\n\tPICKDSP edi, 0\n\tADDDSP 8\n\tmov eax, 0x20\n\trep stosb\n\tret\n\tdefword_end\n\n\tdefword \"erase\", 0, WORD_ERASE, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPICKDSP ebx, 4\n\tPICKDSP edi, 0\n\tADDDSP 8\n\txor eax, eax\n\trep stosb\n\tret\n\tdefword_end\n\n\tdefword \"fill\", 0, WORD_FILL, WORD_CALL_COMMA\n\tmov eax, ebx\n\tPICKDSP ebx, 8\n\tPICKDSP edi, 4\n\tPICKDSP ecx, 0\n\tADDDSP 12\n\trep stosb\n\tret\n\tdefword_end\n\n\tdefword \"cmove>\", 0, WORD_CMOVEB, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPICKDSP ebx, 8\n\tPICKDSP esi, 4\n\tPICKDSP edi, 0\n\tADDDSP 12\n\tlea esi, [esi + ecx - 1]\n\tlea edi, [edi + ecx - 1]\n\tstd\n\trep movsb\n\tcld\n\tret\n\tdefword_end\n\n\tdefword \"cmove\", 0, WORD_CMOVE, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPICKDSP ebx, 8\n\tPICKDSP esi, 4\n\tPICKDSP edi, 0\n\tADDDSP 12\n\trep movsb\n\tret\n\tdefword_end\n\n\tdefword \"move\", 0, WORD_MOVE, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPICKDSP ebx, 8\n\tPICKDSP esi, 4\n\tPICKDSP edi, 0\n\tADDDSP 12\n\tcmp esi, edi\n\tif a\n\t\trep movsb\n\telse\n\t\tlea esi, [esi + ecx -1]\n\t\tlea edi, [edi + ecx -1]\n\t\tstd\n\t\trep movsb\n\t\tcld\n\tendif\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; single precision alu words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"+\", 0, WORD_ADD, WORD_INLINE_COMMA\n\tadd ebx, [ebp]\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"-\", 0, WORD_SUB, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPOPDSP ebx\n\tsub ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"*\", 0, WORD_MULL, WORD_INLINE_COMMA\n\timul ebx, [ebp]\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"/\", 0, WORD_DIV, WORD_INLINE_COMMA\n\tPOPDSP eax\n\tcdq\n\tidiv ebx\n\tmov ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"mod\", 0, WORD_MOD, WORD_INLINE_COMMA\n\tPOPDSP eax\n\tcdq\n\tidiv ebx\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n\tdefword \"1+\", 0, WORD_INCR, WORD_INLINE_COMMA\n\tadd ebx, byte 1\n\tret\n\tdefword_end\n\n\tdefword \"1-\", 0, WORD_DECR, WORD_INLINE_COMMA\n\tsub ebx, byte 1\n\tret\n\tdefword_end\n\n\tdefword \"4+\", 0, WORD_INCR4, WORD_INLINE_COMMA\n\tadd ebx, byte 4\n\tret\n\tdefword_end\n\n\tdefword \"4-\", 0, WORD_DECR4, WORD_INLINE_COMMA\n\tsub ebx, byte 4\n\tret\n\tdefword_end\n\n\tdefword \"2+\", 0, WORD_INCR2, WORD_INLINE_COMMA\n\tadd ebx, byte 2\n\tret\n\tdefword_end\n\n\tdefword \"2-\", 0, WORD_DECR2, WORD_INLINE_COMMA\n\tsub ebx, byte 2\n\tret\n\tdefword_end\n\n\tdefword \"2*\", 0, WORD_TWOMUL, WORD_INLINE_COMMA\n\tshl ebx, byte 1\n\tret\n\tdefword_end\n\n\tdefword \"2/\", 0, WORD_TWODIV, WORD_INLINE_COMMA\n\tsar ebx, byte 1\n\tret\n\tdefword_end\n\n\tdefword \"abs\", 0, WORD_ABS, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tsar eax, byte 31\n\tadd ebx, eax\n\txor ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"min\", 0, WORD_MIN, WORD_INLINE_COMMA\n\tPOPDSP eax\n\tcmp ebx, eax\n\tif g\n\t\tmov ebx, eax\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"max\", 0, WORD_MAX, WORD_INLINE_COMMA\n\tPOPDSP eax\n\tcmp ebx, eax\n\tif l\n\t\tmov ebx, eax\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"lshift\", 0, WORD_LSHIFT, WORD_INLINE_COMMA\n\tmov ecx, ebx\n\tPOPDSP ebx\n\tshl ebx, cl\n\tret\n\tdefword_end\n\n\tdefword \"rshift\", 0, WORD_RSHIFT, WORD_INLINE_COMMA\n\tmov ecx, ebx\n\tPOPDSP ebx\n\tshr ebx, cl\n\tret\n\tdefword_end\n\n\tdefword \"and\", 0, WORD_AND, WORD_INLINE_COMMA\n\tand ebx, [ebp]\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"or\", 0, WORD_OR, WORD_INLINE_COMMA\n\tor ebx, [ebp]\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"xor\", 0, WORD_XOR, WORD_INLINE_COMMA\n\txor ebx, [ebp]\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"negate\", 0, WORD_NEGATE, WORD_INLINE_COMMA\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"invert\", 0, WORD_INVERT, WORD_INLINE_COMMA\n\tnot ebx\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; single precision comparision words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"=\", 0, WORD_EQ, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsete bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"<>\", 0, WORD_NE, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetne bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"<\", 0, WORD_LT, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetl bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \">\", 0, WORD_GT, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetg bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"u<\", 0, WORD_ULT, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetb bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"u>\", 0, WORD_UGT, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tseta bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"u<=\", 0, WORD_ULTEQ, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetbe bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"u>=\", 0, WORD_UGTEQ, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetae bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"<=\", 0, WORD_LTEQ, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetle bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \">=\", 0, WORD_GTEQ, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetge bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0=\", 0, WORD_ZEQ, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetz bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0<>\", 0, WORD_ZNE, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetnz bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0<\", 0, WORD_ZLT, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetl bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0>\", 0, WORD_ZGT, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetg bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0<=\", 0, WORD_ZLTEQ, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetle bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0>=\", 0, WORD_ZGTEQ, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetge bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; double precision ALU words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"s>d\", 0, WORD_STOD, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tcdq\n\tPUSHDSP eax\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n\tdefword \"d>s\", 0, WORD_DTOS, WORD_INLINE_COMMA\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"d+\", 0, WORD_DPLUS, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\tadd eax, ecx\n\tadc ebx, edx\n\tPUTDSP eax, 8\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"d-\", 0, WORD_DMINUS, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\tsub ecx, eax\n\tsbb edx, ebx\n\tPUTDSP ecx, 8\n\tmov ebx, edx\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"d2*\", 0, WORD_D2STAR, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tshl eax, 1\n\trcl ebx, 1\n\tPUTDSP eax, 0\n\tret\n\tdefword_end\n\n\tdefword \"d2/\", 0, WORD_D2SLASH, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tsar ebx, 1\n\trcr eax, 1\n\tPUTDSP eax, 0\n\tret\n\tdefword_end\n\n\tdefword \"*/\", 0, WORD_MULDIV, WORD_INLINE_COMMA\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\timul edx\n\tidiv ebx\n\tmov ebx, eax\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"*/mod\", 0, WORD_STARSMOD, WORD_INLINE_COMMA\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\timul edx\n\tidiv ebx\n\tPUTDSP edx, 4\n\tADDDSP 4\n\tmov ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"/mod\", 0, WORD_DIVMOD, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tcdq\n\tidiv ebx\n\tPUTDSP edx, 0\n\tmov ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"dnegate\", 0, WORD_DNEGATE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tnot eax\n\tnot ebx\n\tadd eax, 1\n\tadc ebx, 0\n\tPUTDSP eax, 0\n\tret\n\tdefword_end\n\n\tdefword \"dabs\", 0, WORD_DABS, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tif l\n\t\tPICKDSP eax, 0\n\t\tnot eax\n\t\tnot ebx\n\t\tadd eax, 1\n\t\tadc ebx, 0\n\t\tPUTDSP eax, 0\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"dmax\", 0, WORD_DMAX, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\tADDDSP 8\n\tmov esi, ecx\n\tmov edi, edx\n\tsub esi, eax\n\tsbb edi, ebx\n\tif l\n\t\tPUTDSP eax, 0\n\telse\n\t\tmov ebx, edx\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"dmin\", 0, WORD_DMIN, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\tADDDSP 8\n\tmov esi, ecx\n\tmov edi, edx\n\tsub esi, eax\n\tsbb edi, ebx\n\tif ge\n\t\tPUTDSP eax, 0\n\telse\n\t\tmov ebx, edx\n\tendif\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; double precision comparision words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"d0=\", 0, WORD_DZEQ, WORD_INLINE_COMMA\n\tor ebx, [ebp]\n\tsetz bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"d0<>\", 0, WORD_DZNEQ, WORD_INLINE_COMMA\n\tor ebx, [ebp]\n\tsetnz bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"d0<\", 0, WORD_DZLT, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetl bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"d=\", 0, WORD_DEQ, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP eax, 4\n\tsub ecx, [ebp]\n\tsbb eax, ebx\n\tsetz bl\n\tADDDSP 12\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"d<>\", 0, WORD_DNEQ, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP eax, 4\n\tsub ecx, [ebp]\n\tsbb eax, ebx\n\tsetnz bl\n\tADDDSP 12\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"d<\", 0, WORD_DLT, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP eax, 4\n\tsub ecx, [ebp]\n\tsbb eax, ebx\n\tsetl bl\n\tADDDSP 12\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"du<\", 0, WORD_DULT, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP eax, 4\n\tsub ecx, [ebp]\n\tsbb eax, ebx\n\tsetb bl\n\tADDDSP 12\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;\n; mixed precision words\n;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"m+\", 0, WORD_MPLUS, WORD_INLINE_COMMA\n\tPICKDSP eax, 4\n\tPICKDSP edx, 0\n\tadd eax, ebx\n\tadc edx, 0\n\tPUTDSP eax, 4\n\tmov ebx, edx\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"m-\", 0, WORD_MMINUS, WORD_INLINE_COMMA\n\tPICKDSP eax, 4\n\tPICKDSP edx, 0\n\tsub eax, ebx\n\tsbb edx, 0\n\tPUTDSP eax, 4\n\tmov ebx, edx\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"m*\", 0, WORD_MULSTAR, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\timul ebx\n\tPUTDSP eax, 0\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n\tdefword \"m/\", 0, WORD_MSLASH, WORD_INLINE_COMMA\n\tPICKDSP eax, 4\n\tPICKDSP edx, 0\n\tidiv ebx\n\tmov ebx, eax\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"um*\", 0, WORD_UMULSTAR, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tmul ebx\n\tPUTDSP eax, 0\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n\tdefword \"um/mod\", 0, WORD_UMDIVMOD, WORD_INLINE_COMMA\n\tPICKDSP eax, 4\n\tPICKDSP edx, 0\n\tdiv ebx\n\tPUTDSP edx, 4\n\tmov ebx, eax\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"fm/mod\", 0, WORD_FMDIVMOD, WORD_INLINE_COMMA\n\tPICKDSP edx, 0\n\tPICKDSP eax, 4\n\tmov ecx, ebx\n\tADDDSP 4\n\txor ecx, edx\n\tidiv ebx\n\ttest ecx, ecx\n\tif s\n\t\ttest edx, edx\n\t\tif nz\n\t\t\tdec eax\n\t\t\tadd edx, ebx\n\t\tendif\n\tendif\n\tPUTDSP edx, 0\n\tmov ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"sm/rem\", 0, WORD_SMDIVREM, WORD_INLINE_COMMA\n\tPICKDSP eax, 4\n\tPICKDSP edx, 0\n\tidiv ebx\n\tPUTDSP edx, 4\n\tmov ebx, eax\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"u/mod\", 0, WORD_UDIVMOD, WORD_INLINE_COMMA\n\txor edx, edx\n\tPICKDSP eax, 0\n\tdiv ebx\n\tPUTDSP edx, 0\n\tmov ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"dm*\", 0, WORD_DMULSTAR, WORD_CALL_COMMA\n\tcall WORD_TUCK\n\tcall WORD_MULL\n\tTORSP\n\tcall WORD_UMULSTAR\n\tFROMRSP\n\tcall WORD_ADD\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;\n; control flow words\n;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"branch\", 0, WORD_BRANCH, WORD_INLINE_COMMA\ni_jmp:\n\tjmp strict near i_ret\n\tret\n\tdefword_end\n\n\tdefword \"0branch\", 0, WORD_ZBRANCH, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPOPDSP ebx\n\ttest eax, eax\n\tjz strict near i_jmp\n\tret\n\tdefword_end\n\n\tdefword \"exit\", 0, WORD_EXIT, WORD_EXIT_COMMA\ni_ret:\n\tret\n\tdefword_end\n\n\tdefword \"exit,\", 0, WORD_EXIT_COMMA, WORD_CALL_COMMA\n\tmov edi, [var_WORD_DP]\n\tsub edi, 5\n\tcmp edi, [lastcall]\t; are we just after a call instruction ?\n\tif z\n\t\tmov al, [i_jmp]\n\t\tmov [edi], al\t; change it to a jmp\n\tendif\n\tmov edi, [var_WORD_DP]\n\tmov al, [i_ret]\n\tstosb\n\tmov [var_WORD_DP], edi\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"execute\", 0, WORD_EXECUTE, WORD_CALL_COMMA\n\tmov eax, ebx\t; Get xt into eax\n\tPOPDSP ebx\t\t; After xt runs its ret will continue executing the current word.\n\tjmp eax\t\t\t; and jump to it.\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n; terminal input words\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"read-char\", 0, WORD_READCHAR, WORD_CALL_COMMA\n\tmov ecx, var_WORD_CHARBUF\t; 2nd param: buffer\n\tmov edx, 1\t\t\t\t\t; 3rd param: max length\n\tpush edx\n\tpush ecx\n\tpush ebx\n\tmov eax, SYS_read\t\t\t; syscall: read\n\tcall _syscall\n\tadd esp, 12\n\txor ebx, ebx\n\ttest eax, eax\n\tif be\n\t\tmov ebx, -1\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"read-line\", 0, WORD_READLINE, WORD_CALL_COMMA\n\tcall WORD_NROT\n\tcall WORD_OVER\n\tcall WORD_ADD\n\tcall WORD_OVER\t\t; ( fd start end cur )\nreadline_l1:\n\tPICKDSP eax, 0\n\tcmp ebx, eax\n\tjz readline_l4\n\tPUSHDSP ebx\n\tPICKDSP ebx, 12\n\tcall WORD_READCHAR\n\ttest ebx, ebx\n\tjz readline_l2\n\tcall WORD_DROP\n\tcall WORD_DROP2\n\tcall WORD_DROP2\n\tLOADTOS 0\n\tLOADTOS 0\n\tLOADTOS -1\n\tjmp readline_l5\nreadline_l2:\n\tmov ebx, [var_WORD_CHARBUF]\n\tcmp ebx, 10\t\t\t; LF\n\tjz readline_l3\n\tcall WORD_OVER\n\tcall WORD_STOREBYTE\n\tcall WORD_INCR\n\tjmp readline_l1\nreadline_l3:\n\tcall WORD_DROP\nreadline_l4:\n\tcall WORD_NIP\n\tcall WORD_SWAP\n\tcall WORD_SUB\n\tcall WORD_NIP\n\tLOADTOS -1\n\tLOADTOS 0\nreadline_l5:\n\tret\n\tdefword_end\n\n\tdefword \"key\", 0, WORD_KEY, WORD_CALL_COMMA\n\tPUSHDSP ebx\n\txor ebx, ebx\t\t; stdin\n\tcall WORD_READCHAR\n\tmov ebx, [var_WORD_CHARBUF]\n\tret\n\tdefword_end\n\n\tdefword \"accept\", 0, WORD_ACCEPT, WORD_CALL_COMMA\n\tcall WORD_OVER\n\tcall WORD_ADD\n\tcall WORD_OVER\t; ( start end cur )\naccept_l1:\n\tcall WORD_KEY\n\tcmp ebx, 127\t; BS\n\tjz accept_l2\n\tcmp ebx, 10\t\t; LF\n\tjz accept_l3\n\tcall WORD_OVER\t; ( start end cur key cur )\n\tcall WORD_STOREBYTE\n\tcall WORD_INCR\t; ( start end cur' )\n\tPICKDSP eax, 0\n\tcmp ebx, eax\n\tjz accept_l4\n\tjmp accept_l1\naccept_l2:\n\tPICKDSP eax, 4\t; ( start end cur' )\n\tcmp ebx, eax\n\tjz accept_l1\n\tcall WORD_DECR\n\tjmp accept_l1\naccept_l3:\n\tcall WORD_DROP\t; ( start end cur' )\naccept_l4:\n\tcall WORD_NIP\n\tcall WORD_SWAP\n\tcall WORD_SUB\n\tret\n\tdefword_end\n\n\tdefword \"tabs>spaces\", 0, WORD_TABSTOSPACES, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPOPDSP esi\n\ttest ecx, ecx\n\tif nz\n\t\trepeat\n\t\t\tlodsb\n\t\t\tcmp al, 9\t;TAB\n\t\t\tif z\n\t\t\t\tmov byte [esi - 1], ' '\n\t\t\tendif\n\t\t\tdec ecx\n\t\tuntil z\n\tendif\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;\n; terminal output words\n;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"type-fd\", 0, WORD_TYPE_FD, WORD_CALL_COMMA\n\tPICKDSP edx, 0\t\t\t; 3rd param: length of string\n\tPICKDSP ecx, 4\t\t\t; 2nd param: address of string\n\tADDDSP 8\t\t\t\t; 1st param: FD in ebx\n\tmov eax, SYS_write\t\t; write syscall\n\tpush edx\n\tpush ecx\n\tpush ebx\n\tcall _syscall\n\tadd esp, 12\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"type\", 0, WORD_TYPE, WORD_CALL_COMMA\n\tLOADTOS 1\t\t\t\t; stdout\n\tcall WORD_TYPE_FD\n\tret\n\tdefword_end\n\n\tdefword \"emit\", 0, WORD_EMIT, WORD_CALL_COMMA\n\tmov [emit_scratch], bl\t; write needs the address of the byte to write\n\tmov ebx, emit_scratch\n\tLOADTOS 1\n\tcall WORD_TYPE\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;\n; system call words\n;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"syscall\", 0, WORD_SYSCALL, WORD_CALL_COMMA\n\tpop eax\n\tmov [syscallret], eax\t; save return address\n\tmov eax, ebx\t\t\t; System call number (see <asm/unistd.h>)\n\tcall _syscall\n\tmov ebx, eax\t\t\t; Result (negative for -errno)\n\tjmp [syscallret]\t\t; return to caller\n\tdefword_end\n\n\tdefword \"lsyscall\", 0, WORD_LSYSCALL, WORD_CALL_COMMA\n\tpop eax\n\tmov [syscallret], eax\t; save return address\n\tmov eax, ebx\t\t\t; System call number (see <asm/unistd.h>)\n\tcall _lsyscall\n\tPUSHDSP eax\n\tmov ebx, edx\t\t\t; Result (negative for -errno)\n\tjmp [syscallret]\t\t; return to caller\n\tdefword_end\n\n;;;;;;;;;;;;;;\n; string words\n;;;;;;;;;;;;;;\n\n\tdefword \"count\", 0, WORD_COUNT, WORD_CALL_COMMA\n\txor eax, eax\n\tmov al, [ebx]\n\tinc ebx\n\tLOADTOS eax\n\tret\n\tdefword_end\n\n\tdefword \"-trailing\", 0, WORD_TRAILING, WORD_CALL_COMMA\n\ttest ebx, ebx\n\tif nz\n\t\tPICKDSP esi, 0\n\t\tmov ecx, ebx\n\t\tadd esi, ebx\n\t\tdec esi\n\t\tstd\n\ttrailing_l1:\n\t\tlodsb\n\t\tcmp al, ' '\n\t\tif be\n\t\t\tloop trailing_l1\n\t\tendif\n\t\tmov ebx, ecx\n\t\tcld\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"/string\", 0, WORD_SSTRING, WORD_CALL_COMMA\n\tmov eax, ebx\n\tPOPDSP ebx\n\tPICKDSP ecx, 0\n\tsub ebx, eax\n\tadd ecx, eax\n\tPUTDSP ecx, 0\n\tret\n\tdefword_end\n\n\tdefword \"compare\", 0, WORD_COMPARE, WORD_CALL_COMMA\n\tPICKDSP esi, 8\n\tPICKDSP edx, 4\n\tPICKDSP edi, 0\n\tADDDSP 12\n\tmov ecx, ebx\n\tcmp edx, ebx\n\tif be\n\t\tmov ecx, edx\n\tendif\n\ttest ecx, ecx\t\t; ecx lowest length\n\tjnz compare_l2\n\tcmp edx, ebx\n\tjz compare_l3\t\t; both are 0 length\n\tjmp compare_l4\t\t; otherwise the longest wins\ncompare_l2:\n\tcmpsb\n\tjnz compare_l4\t\t; chars not same\n\tloop compare_l2\n\tcmp edx, ebx\t\t; all chars same\n\tjnz compare_l4\t\t; strings not same size\ncompare_l3:\n\txor ebx, ebx\t\t; same\n\tjmp compare_l7\ncompare_l4:\n\tja compare_l6\ncompare_l5:\n\tmov ebx, -1\n\tjmp compare_l7\ncompare_l6:\n\tmov ebx, 1\ncompare_l7:\n\tret\n\tdefword_end\n\n\tdefword \"icompare\", 0, WORD_COMPAREI, WORD_CALL_COMMA\n\tPICKDSP esi, 8\n\tPICKDSP edx, 4\n\tPICKDSP edi, 0\n\tADDDSP 12\n\tmov ecx, ebx\n\tcmp edx, ebx\n\tif be\n\t\tmov ecx, edx\n\tendif\n\ttest ecx, ecx\t\t; ecx lowest length\n\tjnz comparei_l2\n\tcmp edx, ebx\n\tjz comparei_l3\t\t; both are 0 length\n\tjmp comparei_l4\t\t; otherwise the longest wins\ncomparei_l2:\n\tmov al, [esi]\n\tmov ah, [edi]\n\tto_lower al\n\tto_lower ah\n\tcmp ah, al\n\tjnz comparei_l4\t\t; chars not same\n\tinc edi\n\tinc esi\n\tloop comparei_l2\n\tcmp edx, ebx\t\t; all chars same\n\tjnz comparei_l4\t\t; strings not same size\ncomparei_l3:\n\txor ebx, ebx\t\t; same\n\tjmp comparei_l7\ncomparei_l4:\n\tja comparei_l6\ncomparei_l5:\n\tmov ebx, -1\n\tjmp comparei_l7\ncomparei_l6:\n\tmov ebx, 1\ncomparei_l7:\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; dictionary searching words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"find\", 0, WORD_FIND, WORD_CALL_COMMA\n\tcall WORD_DUP\n\tcall WORD_COUNT\n\tcall WORD_FIND_DICT\n\ttest ebx, ebx\n\tif nz\n\t\tmov dl, [ebx + H_NSIZE]\n\t\tcall WORD_TCFA\n\t\tLOADTOS 1\n\t\tand edx, F_IMMED\n\t\tif z\n\t\t\tneg ebx\n\t\tendif\n\t\tcall WORD_ROT\n\t\tcall WORD_DROP\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"(find)\", 0, WORD_FIND_DICT, WORD_CALL_COMMA\n\tmov ecx, ebx\t\t\t; ecx = length\n\tPOPDSP edi\t\t\t\t; edi = address\n\tPUSHRSP ecx\n\tmov esi, edi\n\tcall strhashi\n\tand ebx, NUM_HASH_CHAINS-1\n\tmov esi, hash_buckets\n\tmov edx, [esi + (ebx * 4)]\n\tPOPRSP ecx\t\t\t\t; edx can now scan back through this hash chain\nfindd_l1:\n\ttest edx, edx\t\t\t; NULL pointer?  (end of the linked list)\n\tje findd_l4\n\txor eax, eax\n\tmov al, [edx + H_NSIZE]\t; al = flags+length field\n\tand al, (F_HIDDEN|F_LENMASK)\t; al = name length\n\tcmp al, cl\t\t\t\t; Length is the same?\n\tjne findd_l2\n\tPUSHRSP ecx\t\t\t\t; Save the length\n\tPUSHRSP edi\t\t\t\t; Save the address (repe cmpsb will move this pointer)\n\tlea esi, [edx + H_NAME]\t; Dictionary string we are checking against.\n\tcall strcmpi\n\tPOPRSP edi\n\tPOPRSP ecx\n\tjne findd_l2\t\t\t; Not the same.\n\tmov ebx, edx\n\tret\nfindd_l2:\n\tmov edx, [edx + H_HLINK]\t; Move back through the link field to the previous word\n\tjmp findd_l1\t\t\t; .. and loop.\nfindd_l4:\n\txor ebx, ebx\t\t\t; Return zero to indicate not found.\n\tret\n\tdefword_end\n\n\tdefword \">cfa\", 0, WORD_TCFA, WORD_CALL_COMMA\n\tadd ebx, H_NSIZE\n\tmov al, [ebx]\t\t\t; Load flags+len into al.\n\tinc ebx\t\t\t\t\t; skip flags+len byte.\n\tand eax, F_LENMASK\t\t; Just the length, not the flags.\n\tadd ebx, eax\t\t\t; skip the name\n\tadd ebx, XT_SIZE\t\t; skip to the xt\n\tret\n\tdefword_end\n\n\tdefword \"(bucket)\", 0, WORD_BUCKET, WORD_CALL_COMMA\n\tmov ecx, ebx\t\t; ecx = length\n\tPOPDSP ebx\t\t\t; ebx = address of name\n\tPUSHRSP esi\n\tmov esi, ebx\n\tcall strhashi\n\tand ebx, NUM_HASH_CHAINS-1\n\tmov esi, hash_buckets\n\tlea ebx, [esi + (ebx * 4)]\n\tPOPRSP esi\n\tret\n\tdefword_end\n\n\tdefword \"unused\", 0, WORD_UNUSED, WORD_CALL_COMMA\n\tLOADTOS forth_end\n\tLOADTOS [var_WORD_DP]\n\tcall WORD_SUB\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; dictionary building words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"align\", 0, WORD_ALIGNDP, WORD_CALL_COMMA\n\tmov eax, [var_WORD_DP]\n\tALIGNREG eax\n\tmov [var_WORD_DP], eax\n\tret\n\tdefword_end\n\n\tdefword \"header,\", 0, WORD_HEADER_COMMA, WORD_CALL_COMMA\n\tmov ecx, ebx\t\t\t\t; ecx = length\n\tPOPDSP ebx\t\t\t\t\t; ebx = address of name\n\tcall WORD_ALIGNDP\t\t\t; align header\n\tmov edi, [var_WORD_DP]\t\t; edi is the address of the header\n\tmov eax, [var_WORD_LATEST]\t; Get link pointer\n\tmov [edi + H_LLINK], eax\t; and store it in the header.\n\tmov [var_WORD_LATEST], edi\n\tPUSHRSP ebx\t\t\t\t\t; hash chain\n\tPUSHRSP ecx\n\tmov esi, ebx\n\tcall strhashi\n\tand ebx, NUM_HASH_CHAINS-1\n\tmov esi, hash_buckets\n\tmov eax, [esi + (ebx * 4)]\n\tmov [esi + (ebx * 4)], edi\n\tmov [edi + H_HLINK], eax\t; and store it in the header.\n\tPOPRSP ecx\n\tPOPRSP esi\n\tmov [edi + H_NSIZE], cl\t\t; Store the length/flags byte.\n\tadd edi, H_NAME\n\tcall strcpyi\n\tmov ecx, XT_SIZE\n\txor eax, eax\n\trep stosb\t\t\t\t\t; clear the gap till the xt\n\tmov [var_WORD_DP], edi\n\tmov long [edi + XT_COMPILE], WORD_CALL_COMMA\t;compile action\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"lit,\", 0, WORD_LIT_COMMA, WORD_CALL_COMMA\n\tmov esi, litc_l1\n\tmov edi, [var_WORD_DP]\n\tmov ecx, litc_l2 - litc_l1 - 4\n\trep movsb\n\tmov [var_WORD_DP], edi\n\tret\n\tdefword_end\nlitc_l1:\n\tLOADTOS 0xBAADF00D\nlitc_l2:\n\n\tdefword \"slits\", 0, WORD_SLITS, WORD_CALL_COMMA\n\tPUSHDSP ebx\n\tPOPRSP esi\n\txor eax, eax\n\tlodsb\t\t\t\t; get the length of the string\n\tPUSHDSP esi\t\t\t; push the address of the start of the string\n\tmov ebx, eax\t\t; push length on the stack\n\tadd esi, eax\t\t; skip past the string\n \tjmp esi\n\tdefword_end\n\n\tdefword \"clits\", 0, WORD_CLITS, WORD_CALL_COMMA\n\tFROMRSP\n\txor eax, eax\n\tmov al, [ebx]\n\tlea eax, [ebx + eax + 1]\n \tjmp eax\n\tdefword_end\n\n\tdefword \",\", 0, WORD_COMMA, WORD_CALL_COMMA\n\tmov edi, [var_WORD_DP]\t; DP\n\tmov eax, ebx\n\tstosd\t\t\t\t\t; Store it.\n\tmov [var_WORD_DP], edi\t; Update DP (incremented)\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"c,\", 0, WORD_CHAR_COMMA, WORD_CALL_COMMA\n\tmov eax, ebx\n\tmov edi, [var_WORD_DP]\t; DP\n\tstosb\t\t\t\t\t; Store it.\n\tmov [var_WORD_DP], edi\t; Update DP (incremented)\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \":\", 0, WORD_COLON, WORD_CALL_COMMA\n\tcall WORD_PARSENAME\n\tcall WORD_HEADER_COMMA\t; Create the dictionary entry / header\n\tmov eax, [var_WORD_DP]\n\tmov [eax + XT_BODY], eax\n\tcall WORD_LATEST\n\tcall WORD_FETCH\n\tcall WORD_HIDDEN\t\t; Make the word hidden\n\tcall WORD_RBRAC\t\t\t; Go into compile mode.\n\tret\n\tdefword_end\n\n\tdefword \"create\", 0, WORD_CREATE, WORD_CALL_COMMA\n\tcall WORD_PARSENAME\n\tcall WORD_HEADER_COMMA\n\tmov esi, create_l1\n\tmov edi, [var_WORD_DP]\n\tPUSHRSP edi\n\tmov ecx, create_l4 - create_l1\n\trep movsb\n\tmov [var_WORD_DP], edi\n\tmov edx, edi\n\tcall WORD_ALIGNDP\n\tPOPRSP eax\n\tmov edi, [var_WORD_DP]\n\tsub edx, eax\n\tmov [eax + create_l2 - create_l1 - 4], edi\n\tmov [eax + XT_BODY], edi\n\tmov [eax + XT_LENGTH], edx\n\tret\n\tdefword_end\ncreate_l1:\n\tLOADTOS 0xBAADF00D\ncreate_l2:\n\tcall strict near create_l3\ncreate_l3:\n\tret\ncreate_l4:\n\n\tdefword \"dodoes\", 0, WORD_DODOES, WORD_CALL_COMMA\n\tcall WORD_LATEST\n\tcall WORD_FETCH\n\tcall WORD_TCFA\n\tadd ebx, create_l3 - create_l1 - 4\n\tPOPDSP eax\n\tsub eax, ebx\n\tsub eax, 4\n\tmov [ebx], eax\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"does>\", F_IMMED, WORD_DOES, WORD_CALL_COMMA\n\tcall WORD_LIT_COMMA\n\tLOADTOS [var_WORD_DP]\n\tadd ebx, 10\n\tcall WORD_COMMA\n\tLOADTOS WORD_DODOES\n\tcall WORD_COMPILE_COMMA\n\tLOADTOS 0\n\tmov bl, [does_l1]\n\tcall WORD_CHAR_COMMA\ndoes_l1:\n\tret\n\tdefword_end\n\n\tdefword \"postpone\", F_IMMED, WORD_POSTPONE, WORD_CALL_COMMA\n\tcall WORD_PARSENAME\n\tcall WORD_FIND_DICT\n\tmov dl, [ebx + H_NSIZE]\n\tcall WORD_TCFA\n\tand edx, F_IMMED\n\tif z\n\t\tcall WORD_LIT_COMMA\n\t\tcall WORD_COMMA\n\t\tLOADTOS WORD_COMPILE_COMMA\n\tendif\n\tjmp WORD_COMPILE_COMMA\n\tret\n\tdefword_end\n\n\tdefword \"call,\", 0, WORD_CALL_COMMA, WORD_CALL_COMMA\n\tmov edi, [var_WORD_DP]\n\tmov [lastcall], edi\t; record last location of last call\n\tmov esi, i_call\n\tmovsb\n\tmov eax, ebx\n\tsub eax, 4\n\tsub eax, edi\n\tstosd\n\tmov [var_WORD_DP], edi\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"inline,\", 0, WORD_INLINE_COMMA, WORD_CALL_COMMA\n\tmov ecx, [ebx + XT_LENGTH]\n\tdec ecx\t\t\t\t\t; actual code length minus ret\n\tmov esi, ebx\n\tmov edi, [var_WORD_DP]\n\trep movsb\t\t\t\t; inline copy the code\n\tmov [var_WORD_DP], edi\t; update DP\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"compile,\", 0, WORD_COMPILE_COMMA, WORD_INLINE_COMMA\n\tcall [ebx + XT_COMPILE]\n\tret\n\tdefword_end\n\n\tdefword \";\", F_IMMED, WORD_SEMICOLON, WORD_CALL_COMMA\n\tLOADTOS WORD_EXIT\ni_call:\n\tcall strict near WORD_COMPILE_COMMA\n\tcall WORD_LATEST\n\tcall WORD_FETCH\n\tcall WORD_HIDDEN\t\t\t; toggle hidden flag -- unhide the word (see below for definition).\n\tcall WORD_LBRAC\t\t\t\t; go back to IMMEDIATE mode.\n\tmov edx, ebx\n\tmov ebx, [var_WORD_LATEST]\n\tcall WORD_TCFA\n\tmov ecx, [var_WORD_DP]\n\tsub ecx, ebx\n\tmov [ebx + XT_LENGTH], ecx\t; set code size of word\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n\tdefword \"immediate\", 0, WORD_IMMEDIATE, WORD_CALL_COMMA\n\tmov edi, [var_WORD_LATEST]\t; LATEST word.\n\tadd edi, H_NSIZE\t\t\t; Point to name/flags byte.\n\txor byte [edi], F_IMMED\t\t; Toggle the IMMED bit.\n\tret\n\tdefword_end\n\n\tdefword \"hidden\", 0, WORD_HIDDEN, WORD_CALL_COMMA\n\tadd ebx, H_NSIZE\t\t\t; Point to name/flags byte.\n\txor byte [ebx], F_HIDDEN\t; Toggle the HIDDEN bit.\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"[\", F_IMMED, WORD_LBRAC, WORD_CALL_COMMA\n\tmov long [var_WORD_STATE], 0\t; Set STATE to 0.\n\tret\n\tdefword_end\n\n\tdefword \"]\", 0, WORD_RBRAC, WORD_CALL_COMMA\n\tmov long [var_WORD_STATE], 1\t; Set STATE to 1.\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;\n; source buffer words\n;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"source\", 0, WORD_SOURCE, WORD_CALL_COMMA\n\tcall WORD_INHASH\n\tcall WORD_FETCH2\n\tret\n\tdefword_end\n\n\tdefword \"refill\", 0, WORD_REFILL, WORD_CALL_COMMA\n\tLOADTOS tib_buffer\n\tcall WORD_LINESIZE\t; ( tib len )\n\tcall WORD_OVER\n\tcall WORD_SWAP\t\t; ( tib tib len )\n\tcall WORD_ACCEPT\t; read line into TIB\n\tcall WORD_DUP2\n\tcall WORD_TABSTOSPACES\n\tcall WORD_INHASH\n\tcall WORD_STORE2\t; set as current WORD_SOURCE\n\tLOADTOS 0\n\tcall WORD_TOIN\n\tcall WORD_STORE\t\t; set to start of buffer\n\tLOADTOS -1\n\tret\n\tdefword_end\n\n\tdefword \"isspace?\", 0, WORD_ISSPACE, WORD_CALL_COMMA\n\tLOADTOS ' '\n\tcall WORD_ULTEQ\n\tret\n\tdefword_end\n\n\tdefword \"isnotspace?\", 0, WORD_ISNOTSPACE, WORD_CALL_COMMA\n\tcall WORD_ISSPACE\n\tcall WORD_ZEQ\n\tret\n\tdefword_end\n\n\tdefword \"xt-skip\", 0, WORD_XTSKIP, WORD_CALL_COMMA\n\tTORSP\nxtskip_l1:\n\ttest ebx, ebx\n\tjz xtskip_l3\n\tcall WORD_OVER\n\tcall WORD_FETCHBYTE\n\tFETCHRSP\n\tcall WORD_EXECUTE\n\ttest ebx, ebx\n\tjz xtskip_l2\n\tmov ebx, 1\n\tcall WORD_SSTRING\n\tjmp xtskip_l1\nxtskip_l2:\n\tcall WORD_DROP\nxtskip_l3:\n\tADDRSP 4\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;\n; input parseing words\n;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"parse-name\", 0, WORD_PARSENAME, WORD_CALL_COMMA\n\tcall WORD_SOURCE\n\tcall WORD_TOIN\n\tcall WORD_FETCH\n\tcall WORD_SSTRING\n\tLOADTOS WORD_ISSPACE\n\tcall WORD_XTSKIP\n\tcall WORD_OVER\n\tTORSP\n\tLOADTOS WORD_ISNOTSPACE\n\tcall WORD_XTSKIP\n\tcall WORD_DUP2\n\tLOADTOS 1\n\tcall WORD_MIN\n\tcall WORD_ADD\n\tcall WORD_SOURCE\n\tcall WORD_DROP\n\tcall WORD_SUB\n\tcall WORD_TOIN\n\tcall WORD_STORE\n\tcall WORD_DROP\n\tFROMRSP\n\tcall WORD_TUCK\n\tcall WORD_SUB\n; code to print out \"P <word> CR\"\n;LOADTOS 80\n;call WORD_EMIT\n;LOADTOS 32\n;call WORD_EMIT\n;call WORD_DUP2\n;call WORD_TYPE\n;LOADTOS 10\n;call WORD_EMIT\n\tret\n\tdefword_end\n\n\tdefword \"word-name\", 0, WORD_WORDNAME, WORD_CALL_COMMA\n\tcall WORD_PARSENAME\t\t; ( start len )\n\tLOADTOS word_buf\t\t; ( string size buf )\n\tcall WORD_DUP2\t\t\t; ( string size buf size buf )\n\tcall WORD_STOREBYTE\t\t; ( string size buf )\n\tcall WORD_INCR\t\t\t; ( string size buf+1 )\n\tcall WORD_SWAP\t\t\t; ( string buf+1 size )\n\tcall WORD_CMOVE\n\tLOADTOS word_buf\t\t; ( cstring )\n; debug code to print out \"N <word> CR\"\n;LOADTOS 78\n;call WORD_EMIT\n;LOADTOS 32\n;call WORD_EMIT\n;call WORD_DUP2\n;call WORD_TYPE\n;LOADTOS 10\n;call WORD_EMIT\n\tret\n\tdefword_end\n\n\tdefword \"interp-name\", 0, WORD_INTERPNAME, WORD_CALL_COMMA\n\tcall WORD_PARSENAME\t\t\t; ( start len )\n\tLOADTOS intep_name_buf\t\t; ( string size buf )\n\tcall WORD_DUP2\t\t\t\t; ( string size buf size buf )\n\tcall WORD_STOREBYTE\t\t\t; ( string size buf )\n\tcall WORD_INCR\t\t\t\t; ( string size buf+1 )\n\tcall WORD_SWAP\t\t\t\t; ( string buf+1 size )\n\tcall WORD_CMOVE\n\tLOADTOS intep_name_buf\t\t;( cstring )\n\tret\n\tdefword_end\n\n\tdefword \"interpret\", 0, WORD_INTERPRET, WORD_CALL_COMMA\n\tloopstart\n\t\tcall WORD_INTERPNAME\n\t\tmov al, [ebx]\n\t\ttest al, al\n\t\tbreakif z\n\t\t; debug code to print out \"I <word> CR\"\n\t\t;LOADTOS 73\n\t\t;call WORD_EMIT\n\t\t;LOADTOS 32\n\t\t;call WORD_EMIT\n\t\t;call WORD_DUP\n\t\t;call WORD_COUNT\n\t\t;call WORD_TYPE\n\t\t;LOADTOS 10\n\t\t;call WORD_EMIT\n\t\tcall WORD_INTERP\n\tloopend\n\tcall WORD_DROP\n\tret\n\tdefword_end\n\n\tdefword \"interp\", 0, WORD_INTERP, WORD_CALL_COMMA\n\tcall WORD_FIND\t\t\t\t; ( cstring 0 | xt 1 | xt | -1 )\n\tmov eax, ebx\n\tPOPDSP ebx\n\ttest eax, eax\n\tjz tryasnumber\n\tjle nonimediate\nexecuteword:\n\tmov eax, ebx\n\tPOPDSP ebx\n\tjmp eax\nnonimediate:\n\tmov eax, [var_WORD_STATE]\n\ttest eax, eax\t\t\t\t; are we in imedeate mode ?\n\tjz executeword\n\tjmp WORD_COMPILE_COMMA\t\t; compile xt\ntryasnumber:\n\tcall WORD_COUNT\t\t\t\t; ( adr len )\n\tLOADTOS 0\n\tLOADTOS 0\n\tcall WORD_SWAP2\t\t\t\t; ( 0d addr len )\n\tcall WORD_TOSNUMBER\t\t\t; ( d addr len )\n\ttest ebx, ebx\n\tjnz parseproblem\n\tcall WORD_DROP2\n\tcall WORD_DROP\t\t\t\t; ( num )\n\tmov eax, [var_WORD_STATE]\n\ttest eax, eax\n\tif nz\n\t\tcall WORD_LIT_COMMA\t\t; compile LIT\n\t\tcall WORD_COMMA\t\t\t; compile value\n\tendif\n\tret\nparseproblem:\n\tLOADTOS errmsg\n\tLOADTOS errmsgend - errmsg\n\tLOADTOS 2\n\tcall WORD_TYPE_FD\n\tLOADTOS errmsgnl\n\tLOADTOS 1\n\tLOADTOS 2\n\tcall WORD_TYPE_FD\n\tLOADTOS tib_buffer\n\tLOADTOS [var_WORD_TOIN]\n\tLOADTOS 2\n\tcall WORD_TYPE_FD\n\tLOADTOS errmsgnl\n\tLOADTOS 1\n\tLOADTOS 2\n\tcall WORD_TYPE_FD\n\tcall WORD_DROP2\n\tcall WORD_DROP2\n\tret\n\tdefword_end\n\n\tdefword \">number\", 0, WORD_TONUMBER, WORD_CALL_COMMA\n\tcall WORD_OVER\n\tcall WORD_ADD\n\tcall WORD_SWAP\t\t\t; ( ud end cur )\ntonumber_l1:\n\tPICKDSP eax, 0\n\tcmp ebx, eax\n\tjz near tonumber_l4\n\tcall WORD_DUP\n\tcall WORD_FETCHBYTE\t\t; ( ud end cur char )\n\tto_lower ebx\n\tsub ebx, byte '0'\n\tjb tonumber_l3\t\t\t; < '0'?\n\tcmp ebx, byte 10\n\tjb tonumber_l2\t\t\t; <= '9' ?\n\tsub ebx, byte 'a' - '0'\n\tjb tonumber_l3\t\t\t; < 'a' ?\n\tadd ebx, byte 10\ntonumber_l2:\n\tcmp ebx, [var_WORD_BASE]\n\tjge tonumber_l3\t\t\t; >= WORD_BASE ?\n\tTORSP\n\tcall WORD_SWAP2\t\t\t; ( end cur ud )\n\tLOADTOS [var_WORD_BASE]\n\tcall WORD_DMULSTAR\n\tFROMRSP\n\tcall WORD_MPLUS\t\t\t; ( end cur ud' )\n\tcall WORD_SWAP2\n\tcall WORD_INCR\t\t\t; ( ud' end cur' )\n\tjmp tonumber_l1\ntonumber_l3:\n\tcall WORD_DROP\ntonumber_l4:\n\tcall WORD_SWAP\n\tcall WORD_OVER\n\tcall WORD_SUB\t\t\t; ( ud' c-addr u2 )\n\tret\n\tdefword_end\n\n\tdefword \">snumber\", 0, WORD_TOSNUMBER, WORD_CALL_COMMA\n\ttest ebx, ebx\n\tif nz\n\t\tPICKDSP eax, 0\n\t\tmov cl, [eax]\n\t\tcmp cl, '-'\n\t\tjnz WORD_TONUMBER\t; not '-'\n\t\tinc eax\n\t\tPUTDSP eax, 0\n\t\tdec ebx\n\t\tcall WORD_TONUMBER\n\t\tcall WORD_SWAP2\n\t\tcall WORD_DNEGATE\n\t\tcall WORD_SWAP2\n\tendif\n\tret\n\tdefword_end\n\n;;;;;;;;;;;\n; tick word\n;;;;;;;;;;;\n\n\tdefword \"ticks\", 0, WORD_TICKS, WORD_CALL_COMMA\n\tsub ebp, byte 8\n\trdtsc\n\tmov [byte ebp -4], ebx\n\tmov [ebp], eax\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n;;;;;;;;;;;\n; test word\n;;;;;;;;;;;\n\n\tdefword \"test\", 0, WORD_TEST, WORD_CALL_COMMA\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;\n; read/write data\n;;;;;;;;;;;;;;;;;\n\n\talign 4\nsyscallret:\n\t; return address saved by syscall\n\tdd 0\nlastcall:\n\t; last call layed down by compiler\n\tdd 0\n\ntib_buffer:\n\t; keyboard input buffer\n\ttimes MAX_LINE_SIZE db 0\nword_buf:\n\t; static buffer where WORD returns. Subsequent calls\n\t; overwrite this buffer.\n\ttimes MAX_LINE_SIZE db 0\nintep_name_buf:\n\t; static buffer where INTERPNAME returns. Subsequent calls\n\t; overwrite this buffer.\n\ttimes MAX_LINE_SIZE db 0\nemit_scratch:\n\t; scratch used by EMIT\n\tdb 0\nerrmsg:\n\tdb \"PARSE ERROR:\"\nerrmsgend:\nerrmsgnl:\n\tdb 10\nbootfile:\n\tdb \"forth.f\"\n\tdb 0\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; dictionary hash table (64)\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\talign 4\nhash_buckets:\n\tdd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n\tdd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n\tdd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n\tdd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; addresses of all built in dictionary words.\n; this ends up as part of the user space after booting !\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\talign 4\ndictionary_start:\n\tdd dic_WORD_ABS\n\tdd dic_WORD_ACCEPT\n\tdd dic_WORD_ADD\n\tdd dic_WORD_ADDBYTE\n\tdd dic_WORD_ADDSTORE\n\tdd dic_WORD_ALIGNDP\n\tdd dic_WORD_AND\n\tdd dic_WORD_BASE\n\tdd dic_WORD_BLANK\n\tdd dic_WORD_BLK\n\tdd dic_WORD_BRANCH\n\tdd dic_WORD_BUCKET\n\tdd dic_WORD_CALL_COMMA\n\tdd dic_WORD_CHARBUF\n\tdd dic_WORD_CHAR_COMMA\n\tdd dic_WORD_CLITS\n\tdd dic_WORD_CMOVE\n\tdd dic_WORD_CMOVEB\n\tdd dic_WORD_COLON\n\tdd dic_WORD_COMMA\n\tdd dic_WORD_COMPARE\n\tdd dic_WORD_COMPAREI\n\tdd dic_WORD_COMPILE_COMMA\n\tdd dic_WORD_COUNT\n\tdd dic_WORD_CREATE\n\tdd dic_WORD_D2SLASH\n\tdd dic_WORD_D2STAR\n\tdd dic_WORD_DABS\n\tdd dic_WORD_DECR\n\tdd dic_WORD_DECR2\n\tdd dic_WORD_DECR4\n\tdd dic_WORD_DEQ\n\tdd dic_WORD_DIV\n\tdd dic_WORD_DIVMOD\n\tdd dic_WORD_DLT\n\tdd dic_WORD_DMAX\n\tdd dic_WORD_DMIN\n\tdd dic_WORD_DMINUS\n\tdd dic_WORD_DMULSTAR\n\tdd dic_WORD_DNEGATE\n\tdd dic_WORD_DNEQ\n\tdd dic_WORD_DODOES\n\tdd dic_WORD_DOES\n\tdd dic_WORD_DP\n\tdd dic_WORD_DPLUS\n\tdd dic_WORD_DROP\n\tdd dic_WORD_DROP2\n\tdd dic_WORD_DSPFETCH\n\tdd dic_WORD_DSPSTORE\n\tdd dic_WORD_DTOS\n\tdd dic_WORD_DULT\n\tdd dic_WORD_DUP\n\tdd dic_WORD_DUP2\n\tdd dic_WORD_DZEQ\n\tdd dic_WORD_DZLT\n\tdd dic_WORD_DZNEQ\n\tdd dic_WORD_EMIT\n\tdd dic_WORD_EQ\n\tdd dic_WORD_ERASE\n\tdd dic_WORD_EXECUTE\n\tdd dic_WORD_EXIT\n\tdd dic_WORD_FETCH\n\tdd dic_WORD_FETCH2\n\tdd dic_WORD_FETCHBYTE\n\tdd dic_WORD_FETCHSHORT\n\tdd dic_WORD_FILL\n\tdd dic_WORD_FIND\n\tdd dic_WORD_FIND_DICT\n\tdd dic_WORD_FMDIVMOD\n\tdd dic_WORD_FROMR\n\tdd dic_WORD_FROMR2\n\tdd dic_WORD_GT\n\tdd dic_WORD_GTEQ\n\tdd dic_WORD_HEADER_COMMA\n\tdd dic_WORD_HIDDEN\n\tdd dic_WORD_IMMEDIATE\n\tdd dic_WORD_INCR\n\tdd dic_WORD_INCR2\n\tdd dic_WORD_INCR4\n\tdd dic_WORD_INHASH\n\tdd dic_WORD_INLINE_COMMA\n\tdd dic_WORD_INTERP\n\tdd dic_WORD_INTERPNAME\n\tdd dic_WORD_INTERPRET\n\tdd dic_WORD_INVERT\n\tdd dic_WORD_ISNOTSPACE\n\tdd dic_WORD_ISSPACE\n\tdd dic_WORD_KEY\n\tdd dic_WORD_LATEST\n\tdd dic_WORD_LBRAC\n\tdd dic_WORD_LINESIZE\n\tdd dic_WORD_LIT_COMMA\n\tdd dic_WORD_LSHIFT\n\tdd dic_WORD_LSYSCALL\n\tdd dic_WORD_LT\n\tdd dic_WORD_LTEQ\n\tdd dic_WORD_MAX\n\tdd dic_WORD_MIN\n\tdd dic_WORD_MMINUS\n\tdd dic_WORD_MOD\n\tdd dic_WORD_MOVE\n\tdd dic_WORD_MPLUS\n\tdd dic_WORD_MSLASH\n\tdd dic_WORD_MULDIV\n\tdd dic_WORD_MULL\n\tdd dic_WORD_MULSTAR\n\tdd dic_WORD_NE\n\tdd dic_WORD_NEGATE\n\tdd dic_WORD_NFROMR\n\tdd dic_WORD_NIP\n\tdd dic_WORD_NIP2\n\tdd dic_WORD_NQDUP\n\tdd dic_WORD_NROT\n\tdd dic_WORD_NTOR\n\tdd dic_WORD_OR\n\tdd dic_WORD_OVER\n\tdd dic_WORD_OVER2\n\tdd dic_WORD_O_APPEND\n\tdd dic_WORD_O_CREAT\n\tdd dic_WORD_O_EXCL\n\tdd dic_WORD_O_NONBLOCK\n\tdd dic_WORD_O_RDONLY\n\tdd dic_WORD_O_RDWR\n\tdd dic_WORD_O_TRUNC\n\tdd dic_WORD_O_WRONLY\n\tdd dic_WORD_PARSENAME\n\tdd dic_WORD_PICK\n\tdd dic_WORD_POSTPONE\n\tdd dic_WORD_QDUP\n\tdd dic_WORD_RBRAC\n\tdd dic_WORD_RDROP\n\tdd dic_WORD_RDROP2\n\tdd dic_WORD_READCHAR\n\tdd dic_WORD_READLINE\n\tdd dic_WORD_REFILL\n\tdd dic_WORD_RFETCH\n\tdd dic_WORD_RFETCH2\n\tdd dic_WORD_ROT\n\tdd dic_WORD_ROT2\n\tdd dic_WORD_RSHIFT\n\tdd dic_WORD_RSPFETCH\n\tdd dic_WORD_RSPSTORE\n\tdd dic_WORD_RSTORE\n\tdd dic_WORD_RZ\n\tdd dic_WORD_SEMICOLON\n\tdd dic_WORD_SLITS\n\tdd dic_WORD_SMDIVREM\n\tdd dic_WORD_SOURCE\n\tdd dic_WORD_SOURCEFD\n\tdd dic_WORD_SSTRING\n\tdd dic_WORD_STARSMOD\n\tdd dic_WORD_STATE\n\tdd dic_WORD_STOD\n\tdd dic_WORD_STORE\n\tdd dic_WORD_STORE2\n\tdd dic_WORD_STOREBYTE\n\tdd dic_WORD_STORESHORT\n\tdd dic_WORD_SUB\n\tdd dic_WORD_SUBSTORE\n\tdd dic_WORD_SWAP\n\tdd dic_WORD_SWAP2\n\tdd dic_WORD_SYSCALL\n\tdd dic_WORD_SYS_CLOSE\n\tdd dic_WORD_SYS_EXIT\n\tdd dic_WORD_SYS_FSTAT\n\tdd dic_WORD_SYS_FSYNC\n\tdd dic_WORD_SYS_FTRUNCATE\n\tdd dic_WORD_SYS_LSEEK\n\tdd dic_WORD_SYS_OPEN\n\tdd dic_WORD_SYS_READ\n\tdd dic_WORD_SYS_RENAME\n\tdd dic_WORD_SYS_STAT\n\tdd dic_WORD_SYS_UNLINK\n\tdd dic_WORD_SYS_WRITE\n\tdd dic_WORD_SZ\n\tdd dic_WORD_TABSTOSPACES\n\tdd dic_WORD_TCFA\n\tdd dic_WORD_TICKS\n\tdd dic_WORD_TOIN\n\tdd dic_WORD_TONUMBER\n\tdd dic_WORD_TOR\n\tdd dic_WORD_TOR2\n\tdd dic_WORD_TOSNUMBER\n\tdd dic_WORD_TRAILING\n\tdd dic_WORD_TUCK\n\tdd dic_WORD_TUCK2\n\tdd dic_WORD_TWODIV\n\tdd dic_WORD_TWOMUL\n\tdd dic_WORD_TYPE\n\tdd dic_WORD_TYPE_FD\n\tdd dic_WORD_UDIVMOD\n\tdd dic_WORD_UGT\n\tdd dic_WORD_UGTEQ\n\tdd dic_WORD_ULT\n\tdd dic_WORD_ULTEQ\n\tdd dic_WORD_UMDIVMOD\n\tdd dic_WORD_UMULSTAR\n\tdd dic_WORD_UNUSED\n\tdd dic_WORD_VERSION\n\tdd dic_WORD_WORDBUF\n\tdd dic_WORD_WORDNAME\n\tdd dic_WORD_XOR\n\tdd dic_WORD_XTSKIP\n\tdd dic_WORD_ZBRANCH\n\tdd dic_WORD_ZEQ\n\tdd dic_WORD_ZGT\n\tdd dic_WORD_ZGTEQ\n\tdd dic_WORD_ZLT\n\tdd dic_WORD_ZLTEQ\n\tdd dic_WORD_ZNE\n\tdd dic_WORD__F_HIDDEN\n\tdd dic_WORD__F_IMMED\n\tdd dic_WORD__F_LENMASK\n\tdd dic_WORD__H_NAME\n\tdd dic_WORD__H_NSIZE\n\tdd dic_WORD__XT_BODY\n\tdd dic_WORD__XT_COMPILE\n\tdd dic_WORD__XT_LENGTH\n\tdd dic_WORD__XT_SIZE\n\tdd dic_WORD_TEST\ndictionary_end:\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n; room for user dictionary\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\ttimes USER_DEFS_SIZE db 0\nforth_end:\n"
  },
  {
    "path": "src/test/resources/samples/langs/Assembly/fp_sqr32_160_comba.inc",
    "content": "\r\n    push r2\r\n    dint\r\n    nop\r\n    bis #MPYDLYWRTEN,&MPY32CTL0\r\n    bic #MPYDLY32,&MPY32CTL0\r\n    mov #SUMEXT,r13\r\n    clr r12\r\n\r\n    mov @r15+,r4\r\n    mov @r15+,r5\r\n\r\n    mov @r15+,r6\r\n    mov @r15+,r7\r\n\r\n    mov @r15+,r8\r\n    mov @r15+,r9\r\n\r\n    mov @r15+,r10\r\n    mov @r15+,r11\r\n\r\n    sub #2*8,r15\r\n\r\n    /* SELF_STEP_FIRST */\r\n    mov r4,&MPY32L\r\n    mov r5,&MPY32H\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*0(r14)\r\n    mov &RES1,2*(0+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n\r\n    /* STEP_1 */\r\n    mov r4,&MAC32L\r\n    mov r5,&MAC32H\r\n    mov r6,&OP2L\r\n    mov r7,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r6,&OP2L\r\n    mov r7,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*2(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(2+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* STEP_1 */\r\n    mov r4,&MAC32L\r\n    mov r5,&MAC32H\r\n    mov r8,&OP2L\r\n    mov r9,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r8,&OP2L\r\n    mov r9,&OP2H\r\n\r\n    /* SELF_STEP */\r\n    mov r6,&MAC32L\r\n    mov r7,&MAC32H\r\n    add @r13,r12\r\n    mov r6,&OP2L\r\n    mov r7,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*4(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(4+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* STEP_1 */\r\n    mov r4,&MAC32L\r\n    mov r5,&MAC32H\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n\r\n    /* STEP_2MORE */\r\n    mov r6,&MAC32L\r\n    mov r7,&MAC32H\r\n    add @r13,r12\r\n    mov r8,&OP2L\r\n    mov r9,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r8,&OP2L\r\n    mov r9,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*6(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(6+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* STEP_1 */\r\n    mov r4,&MAC32L\r\n    mov r5,&MAC32H\r\n    mov 2*8(r15),&OP2L\r\n    mov 2*9(r15),&OP2H\r\n    add &SUMEXT,r12\r\n    mov 2*8(r15),&OP2L\r\n    mov 2*9(r15),&OP2H\r\n\r\n    /* STEP_2MORE */\r\n    mov r6,&MAC32L\r\n    mov r7,&MAC32H\r\n    add @r13,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n\r\n    /* SELF_STEP */\r\n    mov r8,&MAC32L\r\n    mov r9,&MAC32H\r\n    add @r13,r12\r\n    mov r8,&OP2L\r\n    mov r9,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*8(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(8+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    mov 2*8(r15),r4\r\n    mov 2*(8+1)(r15),r5\r\n\r\n    /* STEP_1 */\r\n    mov r6,&MAC32L\r\n    mov r7,&MAC32H\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n\r\n    /* STEP_2MORE */\r\n    mov r8,&MAC32L\r\n    mov r9,&MAC32H\r\n    add @r13,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*10(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(10+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* STEP_1 */\r\n    mov r8,&MAC32L\r\n    mov r9,&MAC32H\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n\r\n    /* SELF_STEP */\r\n    mov r10,&MAC32L\r\n    mov r11,&MAC32H\r\n    add @r13,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*12(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(12+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* STEP_1 */\r\n    mov r10,&MAC32L\r\n    mov r11,&MAC32H\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*14(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(14+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* SELF_STEP_1 */\r\n    mov r4,&MAC32L\r\n    mov r5,&MAC32H\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*16(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(16+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* END */\r\n    mov &RES0,2*18(r14)\r\n    mov &RES1,2*(18+1)(r14)\r\n    pop r2\r\n    eint\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Assembly/lib.inc",
    "content": "\n; ------------------------------------------------------------------------\n; 显示 AL 中的数字\n; ------------------------------------------------------------------------\nDispAL:\n\tpush\tecx\n\tpush\tedx\n\tpush\tedi\n\n\tmov\tedi, [dwDispPos]\n\n\tmov\tah, 0Fh\t\t\t; 0000b: 黑底    1111b: 白字\n\tmov\tdl, al\n\tshr\tal, 4\n\tmov\tecx, 2\n.begin:\n\tand\tal, 01111b\n\tcmp\tal, 9\n\tja\t.1\n\tadd\tal, '0'\n\tjmp\t.2\n.1:\n\tsub\tal, 0Ah\n\tadd\tal, 'A'\n.2:\n\tmov\t[gs:edi], ax\n\tadd\tedi, 2\n\n\tmov\tal, dl\n\tloop\t.begin\n\t;add\tedi, 2\n\n\tmov\t[dwDispPos], edi\n\n\tpop\tedi\n\tpop\tedx\n\tpop\tecx\n\n\tret\n; DispAL 结束-------------------------------------------------------------\n\n\n; ------------------------------------------------------------------------\n; 显示一个整形数\n; ------------------------------------------------------------------------\nDispInt:\n\tmov\teax, [esp + 4]\n\tshr\teax, 24\n\tcall\tDispAL\n\n\tmov\teax, [esp + 4]\n\tshr\teax, 16\n\tcall\tDispAL\n\n\tmov\teax, [esp + 4]\n\tshr\teax, 8\n\tcall\tDispAL\n\n\tmov\teax, [esp + 4]\n\tcall\tDispAL\n\n\tmov\tah, 07h\t\t\t; 0000b: 黑底    0111b: 灰字\n\tmov\tal, 'h'\n\tpush\tedi\n\tmov\tedi, [dwDispPos]\n\tmov\t[gs:edi], ax\n\tadd\tedi, 4\n\tmov\t[dwDispPos], edi\n\tpop\tedi\n\n\tret\n; DispInt 结束------------------------------------------------------------\n\n; ------------------------------------------------------------------------\n; 显示一个字符串\n; ------------------------------------------------------------------------\nDispStr:\n\tpush\tebp\n\tmov\tebp, esp\n\tpush\tebx\n\tpush\tesi\n\tpush\tedi\n\n\tmov\tesi, [ebp + 8]\t; pszInfo\n\tmov\tedi, [dwDispPos]\n\tmov\tah, 0Fh\n.1:\n\tlodsb\n\ttest\tal, al\n\tjz\t.2\n\tcmp\tal, 0Ah\t; 是回车吗?\n\tjnz\t.3\n\tpush\teax\n\tmov\teax, edi\n\tmov\tbl, 160\n\tdiv\tbl\n\tand\teax, 0FFh\n\tinc\teax\n\tmov\tbl, 160\n\tmul\tbl\n\tmov\tedi, eax\n\tpop\teax\n\tjmp\t.1\n.3:\n\tmov\t[gs:edi], ax\n\tadd\tedi, 2\n\tjmp\t.1\n\n.2:\n\tmov\t[dwDispPos], edi\n\n\tpop\tedi\n\tpop\tesi\n\tpop\tebx\n\tpop\tebp\n\tret\n; DispStr 结束------------------------------------------------------------\n\n; ------------------------------------------------------------------------\n; 换行\n; ------------------------------------------------------------------------\nDispReturn:\n\tpush\tszReturn\n\tcall\tDispStr\t\t\t;printf(\"\\n\");\n\tadd\tesp, 4\n\n\tret\n; DispReturn 结束---------------------------------------------------------\n\n\n; ------------------------------------------------------------------------\n; 内存拷贝，仿 memcpy\n; ------------------------------------------------------------------------\n; void* MemCpy(void* es:pDest, void* ds:pSrc, int iSize);\n; ------------------------------------------------------------------------\nMemCpy:\n\tpush\tebp\n\tmov\tebp, esp\n\n\tpush\tesi\n\tpush\tedi\n\tpush\tecx\n\n\tmov\tedi, [ebp + 8]\t; Destination\n\tmov\tesi, [ebp + 12]\t; Source\n\tmov\tecx, [ebp + 16]\t; Counter\n.1:\n\tcmp\tecx, 0\t\t; 判断计数器\n\tjz\t.2\t\t; 计数器为零时跳出\n\n\tmov\tal, [ds:esi]\t\t; ┓\n\tinc\tesi\t\t\t; ┃\n\t\t\t\t\t; ┣ 逐字节移动\n\tmov\tbyte [es:edi], al\t; ┃\n\tinc\tedi\t\t\t; ┛\n\n\tdec\tecx\t\t; 计数器减一\n\tjmp\t.1\t\t; 循环\n.2:\n\tmov\teax, [ebp + 8]\t; 返回值\n\n\tpop\tecx\n\tpop\tedi\n\tpop\tesi\n\tmov\tesp, ebp\n\tpop\tebp\n\n\tret\t\t\t; 函数结束，返回\n; MemCpy 结束-------------------------------------------------------------\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Assembly/macros.inc",
    "content": "BLARGG_MACROS_INCLUDED = 1\n\n; Allows extra error checking with modified version\n; of ca65. Otherwise acts like a constant of 0.\nADDR = 0\n\n; Switches to Segment and places Line there.\n; Line can be an .align directive, .res, .byte, etc.\n; Examples:\n; seg_data BSS, .align 256\n; seg_data RODATA, {message: .byte \"Test\",0}\n.macro seg_data Segment, Line\n\t.pushseg\n\t.segment .string(Segment)\n\t\tLine\n\t.popseg\n.endmacro\n\n; Reserves Size bytes in Segment for Name.\n; If Size is omitted, reserves one byte.\n.macro seg_res Segment, Name, Size\n\t.ifblank Size\n\t\tseg_data Segment, Name: .res 1\n\t.else\n\t\tseg_data Segment, Name: .res Size\n\t.endif\n.endmacro\n\n; Shortcuts for zeropage, bss, and stack\n.define zp_res  seg_res ZEROPAGE,\n.define nv_res  seg_res NVRAM,\n.define bss_res seg_res BSS,\n.define sp_res  seg_res STACK,\n.define zp_byte zp_res\n\n; Copies byte from Src to Addr. If Src begins with #,\n; it sets Addr to the immediate value.\n; Out: A = byte copied\n; Preserved: X, Y\n.macro mov Addr, Src\n\tlda Src\n\tsta Addr\n.endmacro\n\n; Copies word from Src to Addr. If Src begins with #,\n; it sets Addr the immediate value.\n; Out: A = high byte of word\n; Preserved: X, Y\n.macro movw Addr, Src\n\t.if .match( .left( 1, {Src} ), # )\n\t\tlda #<(.right( .tcount( {Src} )-1, {Src} ))\n\t\tsta Addr\n\t\tlda #>(.right( .tcount( {Src} )-1, {Src} ))\n\t\tsta 1+(Addr)\n\t.else\n\t\tlda Src\n\t\tsta Addr\n\t\tlda 1+(Src)\n\t\tsta 1+(Addr)\n\t.endif\n.endmacro\n\n; Increments 16-bit value at Addr.\n; Out: EQ/NE based on resulting 16-bit value\n; Preserved: A, X, Y\n.macro incw Addr\n\t.local @Skip\n\tinc Addr\n\tbne @Skip\n\tinc 1+(Addr)\n@Skip:\n.endmacro\n\n; Adds Src to word at Addr.\n; Out: A = high byte of result, carry set appropriately\n; Preserved: X, Y\n.macro addw Addr, Src\n\t.if .match( .left( 1, {Src} ), # )\n\t\taddw_ Addr,(.right( .tcount( {Src} )-1, {Src} ))\n\t.else\n\t\tlda Addr\n\t\tclc\n\t\tadc Src\n\t\tsta Addr\n\t\t\n\t\tlda 1+(Addr)\n\t\tadc 1+(Src)\n\t\tsta 1+(Addr)\n\t.endif\n.endmacro\n.macro addw_ Addr, Imm\n\tlda Addr\n\tclc\n\tadc #<Imm\n\tsta Addr\n\t\n\t;.if (Imm >> 8) <> 0\n\t\tlda 1+(Addr)\n\t\tadc #>Imm\n\t\tsta 1+(Addr)\n\t;.else\n\t;   .local @Skip\n\t;   bcc @Skip\n\t;   inc 1+(Addr)\n\t;@Skip:\n\t;.endif\n.endmacro\n\n; Splits list of words into tables of low and high bytes\n; Example: split_words foo, {$1234, $5678}\n; expands to:\n; foo_l: $34, $78\n; foo_h: $12, $56\n; foo_count = 2\n.macro split_words Label, Words\n\t.ident (.concat (.string(Label), \"_l\")): .lobytes Words\n\t.ident (.concat (.string(Label), \"_h\")): .hibytes Words\n\t.ident (.concat (.string(Label), \"_count\")) = * - .ident (.concat (.string(Label), \"_h\"))\n.endmacro\n\n.macro SELECT Bool, True, False, Extra\n\t.ifndef Bool\n\t\tFalse Extra\n\t.elseif Bool <> 0\n\t\tTrue Extra\n\t.else\n\t\tFalse Extra\n\t.endif\n.endmacro\n\n.macro DEFAULT Name, Value\n\t.ifndef Name\n\t\tName = Value\n\t.endif\n.endmacro\n\n.ifp02\n\t; 6502 doesn't define these alternate names\n\t.define blt bcc\n\t.define bge bcs\n.endif\n.define jlt jcc\n.define jge jcs\n\n; Jxx Target = Bxx Target, except it can go farther than\n; 128 bytes. Implemented via branch around a JMP.\n\n; Don't use ca65's longbranch, because they fail for @labels\n;.macpack longbranch\n\n.macro jeq Target\n\tbne *+5\n\tjmp Target\n.endmacro\n\n.macro jne Target\n\tbeq *+5\n\tjmp Target\n.endmacro\n\n.macro jmi Target\n\tbpl *+5\n\tjmp Target\n.endmacro\n\n.macro jpl Target\n\tbmi *+5\n\tjmp Target\n.endmacro\n\n.macro jcs Target\n\tbcc *+5\n\tjmp Target\n.endmacro\n\n.macro jcc Target\n\tbcs *+5\n\tjmp Target\n.endmacro\n\n.macro jvs Target\n\tbvc *+5\n\tjmp Target\n.endmacro\n\n.macro jvc Target\n\tbvs *+5\n\tjmp Target\n.endmacro\n\n\n; Passes constant data to routine in addr\n; Preserved: A, X, Y\n.macro jsr_with_addr routine,data\n\t.local Addr\n\tpha\n\tlda #<Addr\n\tsta addr\n\tlda #>Addr\n\tsta addr+1\n\tpla\n\tjsr routine\n\tseg_data RODATA,{Addr: data}\n.endmacro\n\n; Calls routine multiple times, with A having the\n; value 'start' the first time, 'start+step' the\n; second time, up to 'end' for the last time.\n.macro for_loop routine,start,end,step\n\t.local @for_loop\n\tlda #start\n@for_loop:\n\tpha\n\tjsr routine\n\tpla\n\tclc\n\tadc #step\n\tcmp #<((end)+(step))\n\tbne @for_loop\n.endmacro\n\n; Calls routine n times. The value of A in the routine\n; counts from 0 to n-1.\n.macro loop_n_times routine,n\n\tfor_loop routine,0,n-1,+1\n.endmacro\n\n; Same as for_loop, except uses 16-bit value in YX.\n; -256 <= step <= 255\n.macro for_loop16 routine,start,end,step\n.if (step) < -256 || (step) > 255\n\t.error \"Step must be within -256 to 255\"\n.endif\n\t.local @for_loop_skip\n\t.local @for_loop\n\tldy #>(start)\n\tlda #<(start)\n@for_loop:\n\ttax\n\tpha\n\ttya\n\tpha\n\tjsr routine\n\tpla\n\ttay\n\tpla\n\tclc\n\tadc #step\n.if (step) > 0\n\tbcc @for_loop_skip\n\tiny\n.else\n\tbcs @for_loop_skip\n\tdey\n.endif\n@for_loop_skip:\n\tcmp #<((end)+(step))\n\tbne @for_loop\n\tcpy #>((end)+(step))\n\tbne @for_loop\n.endmacro\n\n; Stores byte at addr\n; Preserved: X, Y\n.macro setb addr, byte\n\tlda #byte\n\tsta addr\n.endmacro\n\n; Stores word at addr\n; Preserved: X, Y\n.macro setw addr, word\n\tlda #<(word)\n\tsta addr\n\tlda #>(word)\n\tsta addr+1\n.endmacro\n\n; Loads XY with 16-bit immediate or value at address\n.macro ldxy Arg\n\t.if .match( .left( 1, {Arg} ), # )\n\t\tldy #<(.right( .tcount( {Arg} )-1, {Arg} ))\n\t\tldx #>(.right( .tcount( {Arg} )-1, {Arg} ))\n\t.else\n\t\tldy (Arg)\n\t\tldx (Arg)+1\n\t.endif\n.endmacro\n\n; Increments XY as 16-bit register, in CONSTANT time.\n; Z flag set based on entire result.\n; Preserved: A\n; Time: 7 clocks\n.macro inxy\n\tiny ; 2\n\tbeq *+4 ; 3\n\t\t; -1\n\tbne *+3 ; 3\n\t\t; -1\n\tinx ; 2\n.endmacro\n\n; Negates A and adds it to operand\n.macro subaf Operand\n\teor #$FF\n\tsec\n\tadc Operand\n.endmacro\n\n; Initializes CPU registers to reasonable values\n; Preserved: A, Y\n.macro init_cpu_regs\n\tsei\n\tcld     ; unnecessary on NES, but might help on clone\n\tldx #$FF\n\ttxs\n\t.ifndef BUILD_NSF\n\t\tinx\n\t\tstx PPUCTRL\n\t.endif\n.endmacro\n"
  },
  {
    "path": "src/test/resources/samples/langs/AutoHotkey/hello.ahk",
    "content": "MsgBox, Hello`, World!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Awk/test.awk",
    "content": "#!/bin/awk -f\n\nBEGIN {\n  # It is not possible to define output file names here because\n  # FILENAME is not define in the BEGIN section\n  n = \"\";\n  printf \"Generating data files ...\";\n  network_max_bandwidth_in_byte = 10000000;\n  network_max_packet_per_second = 1000000;\n  last3 = 0;\n  last4 = 0;\n  last5 = 0;\n  last6 = 0;\n}\n{\n  if ($1 ~ /Average/)\n    { # Skip the Average values\n      n = \"\";\n      next;\n    }\n\n  if ($2 ~ /all/)\n    { # This is the cpu info\n      print $3 > FILENAME\".cpu.user.dat\";\n#\t  print $4 > FILENAME\".cpu.nice.dat\";\n      print $5 > FILENAME\".cpu.system.dat\";\n#     print $6 > FILENAME\".cpu.iowait.dat\";\n      print $7 > FILENAME\".cpu.idle.dat\";\n      print 100-$7 > FILENAME\".cpu.busy.dat\";\n    }\n  if ($2 ~ /eth0/)\n    { # This is the eth0 network info\n      if ($3 > network_max_packet_per_second)\n\tprint last3 > FILENAME\".net.rxpck.dat\"; # Total number of packets received per second.\n      else\n\t{\n\t  last3 = $3;\n\t  print $3 > FILENAME\".net.rxpck.dat\"; # Total number of packets received per second.\n\t}\n      if ($4 > network_max_packet_per_second)\n\tprint last4 > FILENAME\".net.txpck.dat\"; # Total number of packets transmitted per second.\n      else\n\t{\n\t  last4 = $4;\n\t  print $4 > FILENAME\".net.txpck.dat\"; # Total number of packets transmitted per second.\n\t}\n      if ($5 > network_max_bandwidth_in_byte)\n\tprint last5 > FILENAME\".net.rxbyt.dat\"; # Total number of bytes received per second.\n      else\n\t{\n\t  last5 = $5;\n\t  print $5 > FILENAME\".net.rxbyt.dat\"; # Total number of bytes received per second.\n\t}\n      if ($6 > network_max_bandwidth_in_byte)\n\tprint last6 > FILENAME\".net.txbyt.dat\"; # Total number of bytes transmitted per second.\n      else\n\t{\n\t  last6 = $6;\n\t  print $6 > FILENAME\".net.txbyt.dat\"; # Total number of bytes transmitted per second.\n\t}\n#     print $7 > FILENAME\".net.rxcmp.dat\"; # Number of compressed packets received per second (for cslip etc.).\n#     print $8 > FILENAME\".net.txcmp.dat\"; # Number of compressed packets transmitted per second.\n#     print $9 > FILENAME\".net.rxmcst.dat\"; # Number of multicast packets received per second.\n    }\n\n  # Detect which is the next info to be parsed\n  if ($2 ~ /proc|cswch|tps|kbmemfree|totsck/)\n    {\n      n = $2;\n    }\n\n  # Only get lines with numbers (real data !)\n  if ($2 ~ /[0-9]/)\n    {\n      if (n == \"proc/s\")\n\t{ # This is the proc/s info\n\t  print $2 > FILENAME\".proc.dat\";\n#\t  n = \"\";\n\t}\n      if (n == \"cswch/s\")\n\t{ # This is the context switches per second info\n\t  print $2 > FILENAME\".ctxsw.dat\";\n#\t  n = \"\";\n\t}\n      if (n == \"tps\")\n\t{ # This is the disk info\n\t  print $2 > FILENAME\".disk.tps.dat\"; # total transfers per second\n\t  print $3 > FILENAME\".disk.rtps.dat\"; # read requests per second\n\t  print $4 > FILENAME\".disk.wtps.dat\"; # write requests per second\n\t  print $5 > FILENAME\".disk.brdps.dat\"; # block reads per second\n\t  print $6 > FILENAME\".disk.bwrps.dat\"; # block writes per second\n#\t  n = \"\";\n\t}\n      if (n == \"kbmemfree\")\n\t{ # This is the mem info\n\t  print $2 > FILENAME\".mem.kbmemfree.dat\"; # Amount of free memory available in kilobytes.\n\t  print $3 > FILENAME\".mem.kbmemused.dat\"; # Amount of used memory in kilobytes. This does not take into account memory used by the kernel itself.\n\t  print $4 > FILENAME\".mem.memused.dat\"; # Percentage of used memory.\n#         It appears the kbmemshrd has been removed from the sysstat output - ntolia\n#\t  print $X > FILENAME\".mem.kbmemshrd.dat\"; # Amount of memory shared by the system in kilobytes.  Always zero with 2.4 kernels.\n#\t  print $5 > FILENAME\".mem.kbbuffers.dat\"; # Amount of memory used as buffers by the kernel in kilobytes.\n\t  print $6 > FILENAME\".mem.kbcached.dat\"; # Amount of memory used to cache data by the kernel in kilobytes.\n#\t  print $7 > FILENAME\".mem.kbswpfree.dat\"; # Amount of free swap space in kilobytes.\n#\t  print $8 > FILENAME\".mem.kbswpused.dat\"; # Amount of used swap space in kilobytes.\n\t  print $9 > FILENAME\".mem.swpused.dat\"; # Percentage of used swap space.\n#\t  n = \"\";\n \t}\n      if (n == \"totsck\")\n\t{ # This is the socket info\n\t  print $2 > FILENAME\".sock.totsck.dat\"; # Total number of used sockets.\n\t  print $3 > FILENAME\".sock.tcpsck.dat\"; # Number of TCP sockets currently in use.\n#\t  print $4 > FILENAME\".sock.udpsck.dat\"; # Number of UDP sockets currently in use.\n#\t  print $5 > FILENAME\".sock.rawsck.dat\"; # Number of RAW sockets currently in use.\n#\t  print $6 > FILENAME\".sock.ip-frag.dat\"; # Number of IP fragments currently in use.\n#\t  n = \"\";\n \t}\n    }\n}\nEND {\n  print \" '\" FILENAME \"' done.\";\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ballerina/hello-world-service.bal",
    "content": "import ballerina.lang.messages;\nimport ballerina.net.http;\nimport ballerina.doc;\n\n@doc:Description {value:\"By default Ballerina assumes that the service is to be exposed via HTTP/1.1 using the system default port and that all requests coming to the HTTP server will be delivered to this service.\"}\nservice<http> helloWorld {\n    @doc:Description {value:\"All resources are invoked with an argument of type message, the built-in reference type representing a network invocation.\"}\n    resource sayHello (message m) {\n        // Creates an empty message.\n        message response = {};\n        // A util method that can be used to set string payload.\n        messages:setStringPayload(response, \"Hello, World!\");\n        // Reply keyword sends the response back to the client.\n        reply response;\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ballerina/hello-world.bal",
    "content": "import ballerina.lang.system;\n\nfunction main (string[] args) {\n    system:println(\"Hello, World!\");\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ballerina/json.bal",
    "content": "import ballerina.lang.system;\n\nfunction main (string[] args) {\n    // JSON string value.\n    json j1 = \"Apple\";\n    system:println(j1);\n\n    // JSON number value.\n    json j2 = 5.36;\n    system:println(j2);\n\n    // JSON true value.\n    json j3 = true;\n    system:println(j3);\n\n    // JSON false value.\n    json j4 = false;\n    system:println(j4);\n\n    // JSON null value.\n    json j5 = null;\n\n    //JSON Objects.\n    json j6 = {name:\"apple\", color:\"red\", price:j2};\n    system:println(j6);\n\n    //JSON Arrays. They are arrays of any JSON value.\n    json j7 = [1, false, null, \"foo\",\n               {first:\"John\", last:\"Pala\"}];\n    system:println(j7);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ballerina/var.bal",
    "content": "import ballerina.lang.system;\n\nfunction divideBy10 (int d) (int, int) {\n    return d / 10, d % 10;\n}\n\nfunction main (string[] args) {\n    //Here the variable type is inferred type from the initial value. This is same as \"int k = 5\";\n    var k = 5;\n    system:println(10 + k);\n\n    //Here the type of the 'strVar' is 'string'.\n    var strVar = \"Hello!\";\n    system:println(strVar);\n\n    //Multiple assignment with 'var' allows you to define the variable then and there.\n    //Variable type is inferred from the right-hand side.\n    var q, r = divideBy10(6);\n    system:println(\"06/10: \" + \"quotient=\" + q + \" \" +\n                   \"remainder=\" + r);\n\n    //To ignore a particular return value in a multiple assignment statement, use '_'.\n    var q1, _ = divideBy10(57);\n    system:println(\"57/10: \" + \"quotient=\" + q1);\n\n    var _, r1 = divideBy10(9);\n    system:println(\"09/10: \" + \"remainder=\" + r1);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ballerina/xml.bal",
    "content": "import ballerina.lang.system;\n\nfunction main (string[] args) {\n\n\t// XML element. Can only have one root element.\n    xml x1 = xml `<book>The Lost World</book>`;\n    system:println(x1);\n\n    // XML text\n    xml x2 = xml `Hello, world!`;\n    system:println(x2);\n\n    // XML comment\n    xml x3 = xml `<!--I am a comment-->`;\n    system:println(x3);\n\n    // XML processing instruction\n    xml x4 = xml `<?target data?>`;\n    system:println(x4);\n\n    // Multiple XML items can be combined to form a sequence of XML. The resulting sequence is again an XML on its own.\n    xml x5 = x1 + x2 + x3 + x4;\n    system:println(\"\\nResulting XML sequence:\");\n    system:println(x5);\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/BitBake/gstreamer-libav.bb",
    "content": "include gstreamer1.0-libav.inc\n\nLIC_FILES_CHKSUM = \"file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \\\n                    file://COPYING.LIB;md5=6762ed442b3822387a51c92d928ead0d \\\n                    file://ext/libav/gstav.h;beginline=1;endline=18;md5=a752c35267d8276fd9ca3db6994fca9c \\\n                    file://gst-libs/ext/libav/LICENSE;md5=23a54f59b82572c203a559346e89ed57 \\\n                    file://gst-libs/ext/libav/COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \\\n                    file://gst-libs/ext/libav/COPYING.GPLv3;md5=d32239bcb673463ab874e80d47fae504 \\\n                    file://gst-libs/ext/libav/COPYING.LGPLv2.1;md5=bd7a443320af8c812e4c18d1b79df004 \\\n                    file://gst-libs/ext/libav/COPYING.LGPLv3;md5=e6a600fd5e1d9cbde2d983680233ad02\"\n\nSRC_URI = \" \\\n    http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz \\\n    file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \\\n    \"\nSRC_URI[md5sum] = \"86540dee14d31daf976eb2713f2294f3\"\nSRC_URI[sha256sum] = \"585eb7971006100ad771a852e07bd2f3e23bcc6eb0b1253a40b5a0e40e4e7418\"\n\nLIBAV_EXTRA_CONFIGURE_COMMON_ARG = \"--target-os=linux \\\n  --cc='${CC}' --as='${CC}' --ld='${CC}' --nm='${NM}' --ar='${AR}' \\\n  --ranlib='${RANLIB}' \\\n  ${GSTREAMER_1_0_DEBUG}\"\n\nS = \"${WORKDIR}/gst-libav-${PV}\"\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/BitBake/qtbase-native.bb",
    "content": "require qt5-git.inc\nrequire ${PN}.inc\n\ndo_install_append() {\n    # for modules which are still using syncqt and call qtPrepareTool(QMAKE_SYNCQT, syncqt)\n    # e.g. qt3d, qtwayland\n    ln -sf syncqt.pl ${D}${OE_QMAKE_PATH_QT_BINS}/syncqt\n}\n\nQT_MODULE_BRANCH = \"release\"\n# v5.2.1 + 168 commits\nSRCREV = \"08cbbde61778276ccdda73d89fd64d02c623779f\"\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Blade/hello.blade",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>@yield('title', 'We love GitHub')</title>\n    @stack('scripts')\n    @stack('styles')\n</head>\n<body>\n    @include('partials.nav')\n\n    @yield('content')\n\n    <ul>\n        @foreach($foo as $bar)\n        <li>{{ $bar }}</li>\n        @endforeach\n    </ul>\n\n    {!! $raw_content !!}\n</body>\n</html>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Blade/hello.blade.php",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>@yield('title', 'We love GitHub')</title>\n    @stack('scripts')\n    @stack('styles')\n</head>\n<body>\n    @include('partials.nav')\n\n    @yield('content')\n\n    <ul>\n        @foreach($foo as $bar)\n        <li>{{ $bar }}</li>\n        @endforeach\n    </ul>\n\n    {!! $raw_content !!}\n</body>\n</html>\n"
  },
  {
    "path": "src/test/resources/samples/langs/BlitzBasic/HalfAndDouble.bb",
    "content": "\nLocal bk = CreateBank(8)\nPokeFloat bk, 0, -1\nPrint Bin(PeekInt(bk, 0))\nPrint %1000000000000000\nPrint Bin(1 Shl 31)\nPrint $1f\nPrint $ff\nPrint $1f + (127 - 15)\nPrint Hex(%01111111100000000000000000000000)\nPrint Hex(~%11111111100000000000000000000000)\n\nPrint Bin(FloatToHalf(-2.5))\nPrint HalfToFloat(FloatToHalf(-200000000000.0))\n\nPrint Bin(FToI(-2.5))\n\nWaitKey\nEnd\n\n\n; Half-precision (16-bit) arithmetic library\n;============================================\n\nGlobal Half_CBank_\n\nFunction FToI(f#)\n\tIf Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4)\n\tPokeFloat Half_CBank_, 0, f\n\tReturn PeekInt(Half_CBank_, 0)\nEnd Function\n\nFunction HalfToFloat#(h)\n\tLocal signBit, exponent, fraction, fBits\n\t\n\tsignBit = (h And 32768) <> 0\n\texponent = (h And %0111110000000000) Shr 10\n\tfraction = (h And %0000001111111111)\n\t\n\tIf exponent = $1F Then exponent = $FF : ElseIf exponent Then exponent = (exponent - 15) + 127\n\tfBits = (signBit Shl 31) Or (exponent Shl 23) Or (fraction Shl 13)\n\t\n\tIf Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4)\n\tPokeInt Half_CBank_, 0, fBits\n\tReturn PeekFloat(Half_CBank_, 0)\nEnd Function\n\nFunction FloatToHalf(f#)\n\tLocal signBit, exponent, fraction, fBits\n\t\n\tIf Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4)\n\tPokeFloat Half_CBank_, 0, f\n\tfBits = PeekInt(Half_CBank_, 0)\n\t\n\tsignBit = (fBits And (1 Shl 31)) <> 0\n\texponent = (fBits And $7F800000) Shr 23\n\tfraction = fBits And $007FFFFF\n\t\n\tIf exponent\n\t\texponent = exponent - 127\n\t\tIf Abs(exponent) > $1F\n\t\t\tIf exponent <> ($FF - 127) Then fraction = 0\n\t\t\texponent = $1F * Sgn(exponent)\n\t\tElse\n\t\t\texponent = exponent + 15\n\t\tEndIf\n\t\texponent = exponent And %11111\n\tEndIf\n\tfraction = fraction Shr 13\n\t\n\tReturn (signBit Shl 15) Or (exponent Shl 10) Or fraction\nEnd Function\n\nFunction HalfAdd(l, r)\n\t\nEnd Function\n\nFunction HalfSub(l, r)\n\t\nEnd Function\n\nFunction HalfMul(l, r)\n\t\nEnd Function\n\nFunction HalfDiv(l, r)\n\t\nEnd Function\n\nFunction HalfLT(l, r)\n\t\nEnd Function\n\nFunction HalfGT(l, r)\n\t\nEnd Function\n\n\n; Double-precision (64-bit) arithmetic library)\n;===============================================\n\nGlobal DoubleOut[1], Double_CBank_\n\nFunction DoubleToFloat#(d[1])\n\t\nEnd Function\n\nFunction FloatToDouble(f#)\n\t\nEnd Function\n\nFunction IntToDouble(i)\n\t\nEnd Function\n\nFunction SefToDouble(s, e, f)\n\t\nEnd Function\n\nFunction DoubleAdd(l, r)\n\t\nEnd Function\n\nFunction DoubleSub(l, r)\n\t\nEnd Function\n\nFunction DoubleMul(l, r)\n\t\nEnd Function\n\nFunction DoubleDiv(l, r)\n\t\nEnd Function\n\nFunction DoubleLT(l, r)\n\t\nEnd Function\n\nFunction DoubleGT(l, r)\n\t\nEnd Function\n\n\n;~IDEal Editor Parameters:\n;~F#1A#20#2F\n;~C#Blitz3D"
  },
  {
    "path": "src/test/resources/samples/langs/BlitzBasic/LList.bb",
    "content": "\n; Double-linked list container class\n;====================================\n\n; with thanks to MusicianKool, for concept and issue fixes\n\n\nType LList\n\tField head_.ListNode\n\tField tail_.ListNode\nEnd Type\n\nType ListNode\n\tField pv_.ListNode\n\tField nx_.ListNode\n\tField Value\nEnd Type\n\nType Iterator\n\tField Value\n\tField l_.LList\n\tField cn_.ListNode, cni_\nEnd Type\n\n\n;Create a new LList object\nFunction CreateList.LList()\n\tLocal l.LList = New LList\n\t\n\tl\\head_ = New ListNode\n\tl\\tail_ = New ListNode\n\t\n\tl\\head_\\nx_ = l\\tail_\t\t;End caps\n\tl\\head_\\pv_ = l\\head_\t\t;These make it more or less safe to iterate freely\n\tl\\head_\\Value = 0\n\t\n\tl\\tail_\\nx_ = l\\tail_\n\tl\\tail_\\pv_ = l\\head_\n\tl\\tail_\\Value = 0\n\t\n\tReturn l\nEnd Function\n\n;Free a list and all elements (not any values)\nFunction FreeList(l.LList)\n\tClearList l\n\tDelete l\\head_\n\tDelete l\\tail_\n\tDelete l\nEnd Function\n\n;Remove all the elements from a list (does not free values)\nFunction ClearList(l.LList)\n\tLocal n.ListNode = l\\head_\\nx_\n\tWhile n <> l\\tail_\n\t\tLocal nx.ListNode = n\\nx_\n\t\tDelete n\n\t\tn = nx\n\tWend\n\tl\\head_\\nx_ = l\\tail_\n\tl\\tail_\\pv_ = l\\head_\nEnd Function\n\n;Count the number of elements in a list (slow)\nFunction ListLength(l.LList)\n\tLocal i.Iterator = GetIterator(l), elems\n\tWhile EachIn(i)\n\t\telems = elems + 1\n\tWend\n\tReturn elems\nEnd Function\n\n;Return True if a list contains a given value\nFunction ListContains(l.LList, Value)\n\tReturn (ListFindNode(l, Value) <> Null)\nEnd Function\n\n;Create a linked list from the intvalues in a bank (slow)\nFunction ListFromBank.LList(bank)\n\tLocal l.LList = CreateList()\n\tLocal size = BankSize(bank), p\n\t\n\tFor p = 0 To size - 4 Step 4\n\t\tListAddLast l, PeekInt(bank, p)\n\tNext\n\t\n\tReturn l\nEnd Function\n\n;Create a bank containing all the values in a list (slow)\nFunction ListToBank(l.LList)\n\tLocal size = ListLength(l) * 4\n\tLocal bank = CreateBank(size)\n\t\n\tLocal i.Iterator = GetIterator(l), p = 0\n\tWhile EachIn(i)\n\t\tPokeInt bank, p, i\\Value\n\t\tp = p + 4\n\tWend\n\t\n\tReturn bank\nEnd Function\n\n;Swap the contents of two list objects\nFunction SwapLists(l1.LList, l2.LList)\n\tLocal tempH.ListNode = l1\\head_, tempT.ListNode = l1\\tail_\n\tl1\\head_ = l2\\head_\n\tl1\\tail_ = l2\\tail_\n\tl2\\head_ = tempH\n\tl2\\tail_ = tempT\nEnd Function\n\n;Create a new list containing the same values as the first\nFunction CopyList.LList(lo.LList)\n\tLocal ln.LList = CreateList()\n\tLocal i.Iterator = GetIterator(lo) : While EachIn(i)\n\t\tListAddLast ln, i\\Value\n\tWend\n\tReturn ln\nEnd Function\n\n;Reverse the order of elements of a list\nFunction ReverseList(l.LList)\n\tLocal n1.ListNode, n2.ListNode, tmp.ListNode\n\t\n\tn1 = l\\head_\n\tn2 = l\\head_\\nx_\n\t\n\tWhile n1 <> l\\tail_\n\t\tn1\\pv_ = n2\n\t\ttmp = n2\\nx_\n\t\tn2\\nx_ = n1\n\t\tn1 = n2\n\t\tn2 = tmp\n\tWend\n\t\n\ttmp = l\\head_\n\tl\\head_ = l\\tail_\n\tl\\tail_ = tmp\n\t\n\tl\\head_\\pv_ = l\\head_\n\tl\\tail_\\nx_ = l\\tail_\nEnd Function\n\n;Search a list to retrieve the first node with the given value\nFunction ListFindNode.ListNode(l.LList, Value)\n\tLocal n.ListNode = l\\head_\\nx_\n\t\n\tWhile n <> l\\tail_\n\t\tIf n\\Value = Value Then Return n\n\t\tn = n\\nx_\n\tWend\n\t\n\tReturn Null\nEnd Function\n\n;Append a value to the end of a list (fast) and return the node\nFunction ListAddLast.ListNode(l.LList, Value)\n\tLocal n.ListNode = New ListNode\n\t\n\tn\\pv_ = l\\tail_\\pv_\n\tn\\nx_ = l\\tail_\n\tn\\Value = Value\n\t\n\tl\\tail_\\pv_ = n\n\tn\\pv_\\nx_ = n\n\t\n\tReturn n\nEnd Function\n\n;Attach a value to the start of a list (fast) and return the node\nFunction ListAddFirst.ListNode(l.LList, Value)\n\tLocal n.ListNode = New ListNode\n\t\n\tn\\pv_ = l\\head_\n\tn\\nx_ = l\\head_\\nx_\n\tn\\Value = Value\n\t\n\tl\\head_\\nx_ = n\n\tn\\nx_\\pv_ = n\n\t\n\tReturn n\nEnd Function\n\n;Remove the first occurence of the given value from a list\nFunction ListRemove(l.LList, Value)\n\tLocal n.ListNode = ListFindNode(l, Value)\n\tIf n <> Null Then RemoveListNode n\nEnd Function\n\n;Remove a node from a list\nFunction RemoveListNode(n.ListNode)\n\tn\\pv_\\nx_ = n\\nx_\n\tn\\nx_\\pv_ = n\\pv_\n\tDelete n\nEnd Function\n\n;Return the value of the element at the given position from the start of the list,\n;or backwards from the end of the list for a negative index\nFunction ValueAtIndex(l.LList, index)\n\tLocal n.ListNode = ListNodeAtIndex(l, index)\n\tIf n <> Null Then Return n\\Value : Else Return 0\nEnd Function\n\n;Return the ListNode at the given position from the start of the list, or backwards\n;from the end of the list for a negative index, or Null if invalid\nFunction ListNodeAtIndex.ListNode(l.LList, index)\n\tLocal e, n.ListNode\n\t\n\tIf index >= 0\n\t\tn = l\\head_\n\t\tFor e = 0 To index\n\t\t\tn = n\\nx_\n\t\tNext\n\t\tIf n = l\\tail_ Then n = Null\t;Beyond the end of the list - not valid\n\t\t\n\tElse\t;Negative index - count backward\n\t\tn = l\\tail_\n\t\tFor e = 0 To index Step -1\n\t\t\tn = n\\pv_\n\t\tNext\n\t\tIf n = l\\head_ Then n = Null\t;Before the start of the list - not valid\n\t\t\n\tEndIf\n\t\n\tReturn n\nEnd Function\n\n;Replace a value at the given position (added by MusicianKool)\nFunction ReplaceValueAtIndex(l.LList,index,value)\n\tLocal n.ListNode = ListNodeAtIndex(l,index)\n\tIf n <> Null Then n\\Value = value:Else Return 0\nEnd Function\n\n;Remove and return a value at the given position (added by MusicianKool)\nFunction RemoveNodeAtIndex(l.LList,index)\n\tLocal n.ListNode = ListNodeAtIndex(l,index),tval\n\tIf n <> Null Then tval = n\\Value:RemoveListNode(n):Return tval:Else Return 0\nEnd Function\n\n;Retrieve the first value from a list\nFunction ListFirst(l.LList)\n\tIf l\\head_\\nx_ <> l\\tail_ Then Return l\\head_\\nx_\\Value\nEnd Function\n\n;Retrieve the last value from a list\nFunction ListLast(l.LList)\n\tIf l\\tail_\\pv_ <> l\\head_ Then Return l\\tail_\\pv_\\Value\nEnd Function\n\n;Remove the first element from a list, and return its value\nFunction ListRemoveFirst(l.LList)\n\tLocal val\n\tIf l\\head_\\nx_ <> l\\tail_\n\t\tval = l\\head_\\nx_\\Value\n\t\tRemoveListNode l\\head_\\nx_\n\tEndIf\n\tReturn val\nEnd Function\n\n;Remove the last element from a list, and return its value\nFunction ListRemoveLast(l.LList)\n\tLocal val\n\tIf l\\tail_\\pv_ <> l\\head_\n\t\tval = l\\tail_\\pv_\\Value\n\t\tRemoveListNode l\\tail_\\pv_\n\tEndIf\n\tReturn val\nEnd Function\n\n;Insert a value into a list before the specified node, and return the new node\nFunction InsertBeforeNode.ListNode(Value, n.ListNode)\n\tLocal bef.ListNode = New ListNode\n\t\n\tbef\\pv_ = n\\pv_\n\tbef\\nx_ = n\n\tbef\\Value = Value\n\t\n\tn\\pv_ = bef\n\tbef\\pv_\\nx_ = bef\n\t\n\tReturn bef\nEnd Function\n\n;Insert a value into a list after the specified node, and return then new node\nFunction InsertAfterNode.ListNode(Value, n.ListNode)\n\tLocal aft.ListNode = New ListNode\n\t\n\taft\\nx_ = n\\nx_\n\taft\\pv_ = n\n\taft\\Value = Value\n\t\n\tn\\nx_ = aft\n\taft\\nx_\\pv_ = aft\n\t\n\tReturn aft\nEnd Function\n\n;Get an iterator object to use with a loop\n;This function means that most programs won't have to think about deleting iterators manually\n;(in general only a small, constant number will be created)\nFunction GetIterator.Iterator(l.LList)\n\tLocal i.Iterator\n\t\n\tIf l = Null Then RuntimeError \"Cannot create Iterator for Null\"\n\t\n\tFor i = Each Iterator\t\t;See if there's an available iterator at the moment\n\t\tIf i\\l_ = Null Then Exit\n\tNext\n\t\n\tIf i = Null Then i = New Iterator\t;If there wasn't, create one\n\t\n\ti\\l_ = l\n\ti\\cn_ = l\\head_\n\ti\\cni_ = -1\n\ti\\Value = 0\t\t;No especial reason why this has to be anything, but meh\n\t\n\tReturn i\nEnd Function\n\n;Use as the argument to While to iterate over the members of a list\nFunction EachIn(i.Iterator)\n\t\n\ti\\cn_ = i\\cn_\\nx_\n\t\n\tIf i\\cn_ <> i\\l_\\tail_\t\t;Still items in the list\n\t\ti\\Value = i\\cn_\\Value\n\t\ti\\cni_ = i\\cni_ + 1\n\t\tReturn True\n\t\t\n\tElse\n\t\ti\\l_ = Null\t\t;Disconnect from the list, having reached the end\n\t\ti\\cn_ = Null\n\t\ti\\cni_ = -1\n\t\tReturn False\n\t\t\n\tEndIf\nEnd Function\n\n;Remove from the containing list the element currently pointed to by an iterator\nFunction IteratorRemove(i.Iterator)\n\tIf (i\\cn_ <> i\\l_\\head_) And (i\\cn_ <> i\\l_\\tail_)\n\t\tLocal temp.ListNode = i\\cn_\n\t\t\n\t\ti\\cn_ = i\\cn_\\pv_\n\t\ti\\cni_ = i\\cni_ - 1\n\t\ti\\Value = 0\n\t\t\n\t\tRemoveListNode temp\n\t\t\n\t\tReturn True\n\tElse\n\t\tReturn False\n\tEndIf\nEnd Function\n\n;Call this before breaking out of an EachIn loop, to disconnect the iterator from the list\nFunction IteratorBreak(i.Iterator)\n\ti\\l_ = Null\n\ti\\cn_ = Null\n\ti\\cni_ = -1\n\ti\\Value = 0\nEnd Function\n\n\n;~IDEal Editor Parameters:\n;~F#5#A#10#18#2A#32#3E#47#4C#58#66#6F#78#8F#9B#A9#B7#BD#C5#CC\n;~F#E3#E9#EF#F4#F9#103#10D#11B#12B#13F#152#163\n;~C#Blitz3D"
  },
  {
    "path": "src/test/resources/samples/langs/BlitzBasic/PObj.bb",
    "content": "\nLocal i, start, result\n\nLocal s.Sum3Obj = New Sum3Obj\n\nFor i = 1 To 100000\n\ts = New Sum3Obj\n\tresult = Handle Before s\n\tDelete s\nNext\n\nstart = MilliSecs()\nFor i = 1 To 1000000\n\tresult = Sum3_(MakeSum3Obj(i, i, i))\nNext\nstart = MilliSecs() - start\nPrint start\n\nstart = MilliSecs()\nFor i = 1 To 1000000\n\tresult = Sum3(i, i, i)\nNext\nstart = MilliSecs() - start\nPrint start\n\nWaitKey\nEnd\n\n\nFunction Sum3(a, b, c)\n\tReturn a + b + c\nEnd Function\n\n\nType Sum3Obj\n\tField isActive\n\tField a, b, c\nEnd Type\n\nFunction MakeSum3Obj(a, b, c)\n\tLocal s.Sum3Obj = Last Sum3Obj\n\tIf s\\isActive Then s = New Sum3Obj\n\ts\\isActive = True\n\ts\\a = a\n\ts\\b = b\n\ts\\c = c\n\t\n\tRestore label\n\tRead foo\n\t\n\tReturn Handle(s)\nEnd Function\n\n.label\nData (10 + 2), 12, 14\n:\nFunction Sum3_(a_)\n\tLocal a.Sum3Obj = Object.Sum3Obj a_\n\tLocal return_ =  a\\a + a\\b + a\\c\n\tInsert a Before First Sum3Obj :: a\\isActive = False\n\tReturn return_\nEnd Function\n\n\n;~IDEal Editor Parameters:\n;~C#Blitz3D"
  },
  {
    "path": "src/test/resources/samples/langs/BlitzMax/sample.bmx",
    "content": "SuperStrict\n\nFramework Brl.StandardIO\n\nType TMyType\n\tField property:int\n\n\tFunction A:int(param:int)\n\t\t'do nothing\n\tEnd Function\n\n\tMethod B:int(param:int)\n\t\t'do nothing\n\tEnd Method\nEnd Type\n\n\nGlobal my:TMyType = new TMyType\n?Win32\n\tmy.A()\n\tmy.B()\n?Linux\n\tmy.B()\n\tmy.A()\n?"
  },
  {
    "path": "src/test/resources/samples/langs/Bluespec/TL.bsv",
    "content": "package TL;\n\ninterface TL;\n   method Action ped_button_push();\n\n         (* always_enabled *)\n         method Action set_car_state_N(Bool x);\n         (* always_enabled *)\n         method Action set_car_state_S(Bool x);\n         (* always_enabled *)\n         method Action set_car_state_E(Bool x);\n         (* always_enabled *)\n         method Action set_car_state_W(Bool x);\n\n   method Bool lampRedNS();\n   method Bool lampAmberNS();\n   method Bool lampGreenNS();\n\n   method Bool lampRedE();\n   method Bool lampAmberE();\n   method Bool lampGreenE();\n\n   method Bool lampRedW();\n   method Bool lampAmberW();\n   method Bool lampGreenW();\n\n   method Bool lampRedPed();\n   method Bool lampAmberPed();\n   method Bool lampGreenPed();\nendinterface: TL\n\ntypedef enum {\n         AllRed,\n         GreenNS, AmberNS,\n         GreenE, AmberE,\n         GreenW, AmberW,\n         GreenPed, AmberPed} TLstates deriving (Eq, Bits);\n\ntypedef UInt#(5) Time32;\ntypedef UInt#(20) CtrSize;\n\n(* synthesize *)\nmodule sysTL(TL);\n   Time32 allRedDelay = 2;\n   Time32 amberDelay = 4;\n   Time32 nsGreenDelay = 20;\n   Time32 ewGreenDelay = 10;\n   Time32 pedGreenDelay = 10;\n   Time32 pedAmberDelay = 6;\n\n   CtrSize clocks_per_sec = 100;\n\n   Reg#(TLstates) state <- mkReg(AllRed);\n   Reg#(TLstates) next_green <- mkReg(GreenNS);\n   Reg#(Time32) secs <- mkReg(0);\n   Reg#(Bool) ped_button_pushed <- mkReg(False);\n         Reg#(Bool) car_present_N <- mkReg(True);\n   Reg#(Bool) car_present_S <- mkReg(True);\n   Reg#(Bool) car_present_E <- mkReg(True);\n   Reg#(Bool) car_present_W <- mkReg(True);\n         Bool car_present_NS = car_present_N || car_present_S;\n   Reg#(CtrSize) cycle_ctr <- mkReg(0);\n\n   rule dec_cycle_ctr (cycle_ctr != 0);\n      cycle_ctr <= cycle_ctr - 1;\n   endrule\n\n   Rules low_priority_rule = (rules\n                        rule inc_sec (cycle_ctr == 0);\n                                 secs <= secs + 1;\n                                 cycle_ctr <= clocks_per_sec;\n                        endrule endrules);\n\n   function Action next_state(TLstates ns);\n         action\n                                 state <= ns;\n                                 secs <= 0;\n      endaction\n   endfunction: next_state\n\n   function TLstates green_seq(TLstates x);\n      case (x)\n                                 GreenNS: return (GreenE);\n                                 GreenE:  return (GreenW);\n                                 GreenW:  return (GreenNS);\n      endcase\n   endfunction\n\n   function Bool car_present(TLstates x);\n      case (x)\n                                 GreenNS: return (car_present_NS);\n                                 GreenE:  return (car_present_E);\n                                 GreenW:  return (car_present_W);\n      endcase\n   endfunction\n\n   function Rules make_from_green_rule(TLstates green_state, Time32 delay, Bool car_is_present, TLstates ns);\n                        return (rules\n                                 rule from_green (state == green_state && (secs >= delay || !car_is_present));\n                                                next_state(ns);\n                                 endrule endrules);\n   endfunction: make_from_green_rule\n\n   function Rules make_from_amber_rule(TLstates amber_state, TLstates ng);\n      return (rules\n                                 rule from_amber (state == amber_state && secs >= amberDelay);\n                                                next_state(AllRed);\n                                                next_green <= ng;\n                                 endrule endrules);\n   endfunction: make_from_amber_rule\n\n   Rules hprs[7];\n\n   hprs[1] = make_from_green_rule(GreenNS, nsGreenDelay, car_present_NS, AmberNS);\n   hprs[2] = make_from_amber_rule(AmberNS, GreenE);\n   hprs[3] = make_from_green_rule(GreenE, ewGreenDelay, car_present_E, AmberE);\n   hprs[4] = make_from_amber_rule(AmberE, GreenW);\n   hprs[5] = make_from_green_rule(GreenW, ewGreenDelay, car_present_W, AmberW);\n   hprs[6] = make_from_amber_rule(AmberW, GreenNS);\n\n         hprs[0] = (rules\n                        rule fromAllRed (state == AllRed && secs >= allRedDelay);\n                                 if (ped_button_pushed) action\n                                                ped_button_pushed <= False;\n                                                next_state(GreenPed);\n                                 endaction else if (car_present(next_green))\n                              next_state(next_green);\n                           else if (car_present(green_seq(next_green)))\n                                    next_state(green_seq(next_green));\n         else if (car_present(green_seq(green_seq(next_green))))\n                                    next_state(green_seq(green_seq(next_green)));\n         else\n                                    noAction;\n                        endrule: fromAllRed endrules);\n\n         Rules high_priority_rules = hprs[0];\n   for (Integer i = 1; i<7; i=i+1)\n      high_priority_rules = rJoin(hprs[i], high_priority_rules);\n\n         addRules(preempts(high_priority_rules, low_priority_rule));\n\n   method Action ped_button_push();\n      ped_button_pushed <= True;\n   endmethod: ped_button_push\n\n   method Action set_car_state_N(b) ; car_present_N <= b; endmethod\n   method Action set_car_state_S(b) ; car_present_S <= b; endmethod\n   method Action set_car_state_E(b) ; car_present_E <= b; endmethod\n   method Action set_car_state_W(b) ; car_present_W <= b; endmethod\n\n   method lampRedNS() = (!(state == GreenNS || state == AmberNS));\n   method lampAmberNS() = (state == AmberNS);\n   method lampGreenNS() = (state == GreenNS);\n   method lampRedE() = (!(state == GreenE || state == AmberE));\n   method lampAmberE() = (state == AmberE);\n   method lampGreenE() = (state == GreenE);\n   method lampRedW() = (!(state == GreenW || state == AmberW));\n   method lampAmberW() = (state == AmberW);\n   method lampGreenW() = (state == GreenW);\n\n   method lampRedPed() = (!(state == GreenPed || state == AmberPed));\n   method lampAmberPed() = (state == AmberPed);\n   method lampGreenPed() = (state == GreenPed);\n\nendmodule: sysTL\n\nendpackage: TL\n"
  },
  {
    "path": "src/test/resources/samples/langs/Bluespec/TbTL.bsv",
    "content": "package TbTL;\n\nimport TL::*;\n\ninterface Lamp;\n   method Bool changed;\n   method Action show_offs;\n   method Action show_ons;\n   method Action reset;\nendinterface\n\nmodule mkLamp#(String name, Bool lamp)(Lamp);\n   Reg#(Bool) prev <- mkReg(False);\n\n   method changed = (prev != lamp);\n\n   method Action show_offs;\n      if (prev && !lamp)\n      $write (name + \" off, \");\n   endmethod\n\n   method Action show_ons;\n      if (!prev && lamp)\n      $write (name + \" on, \");\n   endmethod\n\n   method Action reset;\n      prev <= lamp;\n   endmethod\nendmodule\n\n\n(* synthesize *)\nmodule mkTest();\n   let dut <- sysTL;\n\n   Reg#(Bit#(16)) ctr <- mkReg(0);\n\n   Reg#(Bool) carN <- mkReg(False);\n   Reg#(Bool) carS <- mkReg(False);\n   Reg#(Bool) carE <- mkReg(False);\n   Reg#(Bool) carW <- mkReg(False);\n\n   Lamp lamps[12];\n\n   lamps[0] <- mkLamp(\"0:  NS  red  \", dut.lampRedNS);\n   lamps[1] <- mkLamp(\"1:  NS  amber\", dut.lampAmberNS);\n   lamps[2] <- mkLamp(\"2:  NS  green\", dut.lampGreenNS);\n   lamps[3] <- mkLamp(\"3:  E   red  \", dut.lampRedE);\n   lamps[4] <- mkLamp(\"4:  E   amber\", dut.lampAmberE);\n   lamps[5] <- mkLamp(\"5:  E   green\", dut.lampGreenE);\n   lamps[6] <- mkLamp(\"6:  W   red  \", dut.lampRedW);\n   lamps[7] <- mkLamp(\"7:  W   amber\", dut.lampAmberW);\n   lamps[8] <- mkLamp(\"8:  W   green\", dut.lampGreenW);\n\n   lamps[9]  <- mkLamp(\"9:  Ped red  \", dut.lampRedPed);\n   lamps[10] <- mkLamp(\"10: Ped amber\", dut.lampAmberPed);\n   lamps[11] <- mkLamp(\"11: Ped green\", dut.lampGreenPed);\n\n   rule start (ctr == 0);\n      $dumpvars;\n   endrule\n\n   rule detect_cars;\n      dut.set_car_state_N(carN);\n      dut.set_car_state_S(carS);\n      dut.set_car_state_E(carE);\n      dut.set_car_state_W(carW);\n   endrule\n\n   rule go;\n      ctr <= ctr + 1;\n      if (ctr == 5000) carN <= True;\n      if (ctr == 6500) carN <= False;\n      if (ctr == 12_000) dut.ped_button_push;\n   endrule\n\n   rule stop (ctr > 32768);\n      $display(\"TESTS FINISHED\");\n      $finish(0);\n   endrule\n\n   function do_offs(l) = l.show_offs;\n      function do_ons(l) = l.show_ons;\n      function do_reset(l) = l.reset;\n\n      function do_it(f);\n         action\n         for (Integer i=0; i<12; i=i+1)\n            f(lamps[i]);\n         endaction\n      endfunction\n\n      function any_changes();\n         Bool b = False;\n         for (Integer i=0; i<12; i=i+1)\n             b = b || lamps[i].changed;\n         return b;\n      endfunction\n\n      rule show (any_changes());\n      do_it(do_offs);\n      do_it(do_ons);\n      do_it(do_reset);\n      $display(\"(at time %d)\", $time);\n   endrule\nendmodule\n\nendpackage\n"
  },
  {
    "path": "src/test/resources/samples/langs/Brainfuck/factor.b",
    "content": "* factor an arbitrarily large positive integer\n*\n* Copyright (C) 1999 by Brian Raiter\n* under the GNU General Public License\n\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-\n\n*\n* read in the number\n*\n\n<<<<<<<<<+\n[-[>>>>>>>>>>][-]<<<<<<<<<<[[->>>>>>>>>>+<<<<<<<<<<]<<<<<<<<<<]\n  >>>>>>>>>>,----------]\n>>>>>>>>>>[------------------------------------->>>>>>>>>->]\n<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]-\n\n*\n* display the number and initialize the loop variable to two\n*\n\n[>++++++++++++++++++++++++++++++++++++++++++++++++.\n  ------------------------------------------------<<<<<<<<<<<]\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.\n--------------------------.[-]\n>>>>>>>>>>>>++<<<<+\n\n*\n* the main loop\n*\n\n[ [-]>>\n\n  *\n  * make copies of the number and the loop variable\n  *\n\n  [>>>>[-]>[-]>[-]>[-]\n    >[-]>[-]\n    <<<<<<<[->>>+>+<<<<]>>>>>>>>]\n  <<<<<<<<<<[>>>>>>[-<<<<+>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>>\n  [>[->>>+>>+<<<<<]>>>>>>>>>]\n  <<<<<<<<<<[>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>>\n\n  *\n  * divide the number by the loop variable\n  *\n\n  [>>>[-]>>>[-]>[-]>>>]                                  initialize\n  <<<<<<<<<<[<<<<<<<<<<]\n  >>>>>>>>>[-]>>>>>>>+<<<<<<<<[+]+\n  [ ->>                               double divisor until above dividend\n    [>>>>>>[->++<]>>>>]<<<<<<<<<<\n    [>>>>>>>>[-]>[-]\n       <<<<[->>>++<<<]<<<<<<<<<<<<<<<]>>>>>>>>>>\n    [>>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<\n            [->--------->>>>>>>>>+<<<<<<<<<<[->+<]]]]]]]]]]]>>]\n    <<<<<<<<<<[>>>>>>>>>[-<+<<<+>>>>]<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>\n    [>>>>>>>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>\n            [-<--------->>>>>>>>>>>+<<<<<<<<<<[-<+>]]]]]]]]]]]>>>]\n    <<<<<<<<<<\n    [>>>>[->>>+>>+<<<<<]<<<<<<<<<<<<<<]\n    >>>>>>>>>>[>>>>>>>[-<<<+>>>]>>>]<<<<<<<<<<\n    [>>>>>>>>[->-<]>\n      [<<<<<<<<<[<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<]\n        >>>>>>>>>>>>>>>>>>>]\n      <<<<<<<<<<<<<<<<<<<]\n    >>>>>>>>>[+[+[+[+[+[+[+[+[+[+[[-]<+>]]]]]]]]]]]<\n  ]\n  >>>>>>>>\n  [                                   subtract divisor from dividend\n    <<<<<<\n    [>>>>>>>>[-]>[-]<<<<<[->>>+>+<<<<]>>>>>>]<<<<<<<<<<\n    [>>>>>>>>[-<<<<+>>>>]<<<[->>>+>+<<<<]<<<<<<<<<<<<<<<]>>>>>>>>>>\n    [>>>>>>>>>[-<<<<+>>>>]>]<<<<<<<<<<\n    [>>>>>>>>[-<->]<<<<<<<<<<<<<<<<<<]>>>>>>>>>>\n    [>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<\n            [++++++++++[+>-<]>>>>>>>>>>-<<<<<<<<<<]]]]]]]]]]]>>>]\n    >>>>>>>+\n    [                                 if difference is nonnegative then\n      [-]<<<<<<<<<<<<<<<<<            replace dividend and increment quotient\n      [>>>>[-]>>>>[-<<<<+>>>>]<<[->>+<<]<<<<<<<<<<<<<<<<]>>>>>>>>>>\n      [>>>>>>>>[->+<<<+>>]>>]<<<<<<<<<<\n      [>>>[->>>>>>+<<<<<<]<<<<<<<<<<<<<]>>>>>>>>>>\n      [>>>>>>>>>[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>\n                [-<<<<<<+>>>>>>[-<<<<<<+>>>>>>\n                [-<<<<<<+>>>>>>[-<<<<<<+>>>>>>\n                [-<<<<<<+>>>>>>[-<<<<<<+>>>>>>\n                [-<<<<<<+>>>>>>[-<<<<<<--------->>>>>>>>>>>>>>>>+<<<<<<<<<<\n                [-<<<<<<+>>>>>>]]]]]]]]]]]>]\n      >>>>>>>\n    ]                                 halve divisor and loop until zero\n    <<<<<<<<<<<<<<<<<[<<<<<<<<<<]>>>>>>>>>>\n    [>>>>>>>>[-]<<[->+<]<[->>>+<<<]>>>>>]<<<<<<<<<<\n    [+>>>>>>>[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>\n             [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>\n             [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>\n             [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>\n             [-<<<<<<<+>>>>>>>]]]]]]]]]<<<<<<<\n             [->>>>>>>+<<<<<<<]-<<<<<<<<<<]\n    >>>>>>>\n    [-<<<<<<<<<<<+>>>>>>>>>>>]\n      >>>[>>>>>>>[-<<<<<<<<<<<+++++>>>>>>>>>>>]>>>]<<<<<<<<<<\n    [+>>>>>>>>[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>\n              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>\n              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>\n              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>\n              [-<<<<<<<<+>>>>>>>>]]]]]]]]]<<<<<<<<\n              [->>>>>>>>+<<<<<<<<]-<<<<<<<<<<]\n    >>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>>]>>\n    [>>>>>>>>[-<<<<<<<<<<<<<+++++>>>>>>>>>>>>>]>>]<<<<<<<<<<\n    [<<<<<<<<<<]>>>>>>>>>>\n    >>>>>>\n  ]\n  <<<<<<\n\n  *\n  * make copies of the loop variable and the quotient\n  *\n\n  [>>>[->>>>+>+<<<<<]>>>>>>>]\n  <<<<<<<<<<\n  [>>>>>>>[-<<<<+>>>>]<<<<<[->>>>>+>>+<<<<<<<]<<<<<<<<<<<<]\n  >>>>>>>>>>[>>>>>>>[-<<<<<+>>>>>]>>>]<<<<<<<<<<\n\n  *\n  * break out of the loop if the quotient is larger than the loop variable\n  *\n\n  [>>>>>>>>>[-<->]<\n    [<<<<<<<<\n      [<<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<]\n    >>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<]\n  >>>>>>>>[>-<[+[+[+[+[+[+[+[+[+[[-]>+<]]]]]]]]]]]>+\n\n  [ [-]\n\n    *\n    * partially increment the loop variable\n    *\n\n    <[-]+>>>>+>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<\n\n    *\n    * examine the remainder for nonzero digits\n    *\n\n    [<<<<<<[<<<<[<<<<<<<<<<]>>>>+<<<<<<<<<<]<<<<]\n    >>>>>>>>>>>>>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<[<<<<<<<<<<]\n    >>>>-\n\n    [ [+]\n\n      *\n      * decrement the loop variable and replace the number with the quotient\n      *\n\n      >>>>>>>>-<<[>[-]>>[-<<+>>]>>>>>>>]<<<<<<<<<<\n\n      *\n      * display the loop variable\n      *\n\n      [+>>[>>>>>>>>+>>]<<-<<<<<<<<<<]-\n      [>>++++++++++++++++++++++++++++++++++++++++++++++++.\n         ------------------------------------------------<<<<<<<<<<<<]\n      ++++++++++++++++++++++++++++++++.[-]>>>>\n\n    ]\n\n    *\n    * normalize the loop variable\n    *\n\n    >>>>>>\n    [>>[->>>>>+<<<<<[->>>>>+<<<<<\n       [->>>>>+<<<<<[->>>>>+<<<<<\n       [->>>>>+<<<<<[->>>>>+<<<<<\n       [->>>>>+<<<<<[->>>>>+<<<<<\n       [->>>>>+<<<<<[->>>>>--------->>>>>+<<<<<<<<<<\n       [->>>>>+<<<<<]]]]]]]]]]]>>>>>>>>]\n    <<<<<<<<<<[>>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<<]\n    >>>>>>>>>\n\n  ]<\n\n]>>\n\n*\n* display the number and end\n*\n\n[>>>>>>>>>>]<<<<<<<<<<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]-\n[>++++++++++++++++++++++++++++++++++++++++++++++++.<<<<<<<<<<<]\n++++++++++.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Brainfuck/fib100.bf",
    "content": "# Calculate and output all fibonacci numbers under 100\n\n+++++++++++\n>+>>>>++++++++++++++++++++++++++++++++++++++++++++\n>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>\n+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-\n<-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<\n-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]\n>[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++\n+++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++\n++++++++++++++++++++++++++++++++++++++++++++.[-]<<\n<<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<\n[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]"
  },
  {
    "path": "src/test/resources/samples/langs/Brainfuck/hello.bf",
    "content": "// More complex version of hello world\n\n>++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>\n>+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++."
  },
  {
    "path": "src/test/resources/samples/langs/Brainfuck/helloworld.bf",
    "content": "// Hello World\n\n++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."
  },
  {
    "path": "src/test/resources/samples/langs/Brainfuck/rot13.bf",
    "content": "# ROT13 cipher\n\n-,+[                         Read first character and start outer character reading loop\n    -[                       Skip forward if character is 0\n        >>++++[>++++++++<-]  Set up divisor (32) for division loop\n                               (MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)\n        <+<-[                Set up dividend (x minus 1) and enter division loop\n            >+>+>-[>>>]      Increase copy and remainder / reduce divisor / Normal case: skip forward\n            <[[>+<-]>>+>]    Special case: move remainder back to divisor and increase quotient\n            <<<<<-           Decrement dividend\n        ]                    End division loop\n    ]>>>[-]+                 End skip loop; zero former divisor and reuse space for a flag\n    >--[-[<->+++[-]]]<[         Zero that flag unless quotient was 2 or 3; zero quotient; check flag\n        ++++++++++++<[       If flag then set up divisor (13) for second division loop\n                               (MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)\n            >-[>+>>]         Reduce divisor; Normal case: increase remainder\n            >[+[<+>-]>+>>]   Special case: increase remainder / move it back to divisor / increase quotient\n            <<<<<-           Decrease dividend\n        ]                    End division loop\n        >>[<+>-]             Add remainder back to divisor to get a useful 13\n        >[                   Skip forward if quotient was 0\n            -[               Decrement quotient and skip forward if quotient was 1\n                -<<[-]>>     Zero quotient and divisor if quotient was 2\n            ]<<[<<->>-]>>    Zero divisor and subtract 13 from copy if quotient was 1\n        ]<<[<<+>>-]          Zero divisor and add 13 to copy if quotient was 0\n    ]                        End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)\n    <[-]                     Clear remainder from first division if second division was skipped\n    <.[-]                    Output ROT13ed character from copy and clear it\n    <-,+                     Read next character\n]                            End character reading loop"
  },
  {
    "path": "src/test/resources/samples/langs/Brightscript/SimpleGrid.brs",
    "content": "' *********************************************************\n' **  Simple Grid Screen Demonstration App\n' **  Jun 2010\n' **  Copyright (c) 2010 Roku Inc. All Rights Reserved.\n' *********************************************************\n\n'************************************************************\n'** Application startup\n'************************************************************\nSub Main()\n\n    'initialize theme attributes like titles, logos and overhang color\n    initTheme()\n  \n    gridstyle = \"Flat-Movie\"\n\n    'set to go, time to get started\n    while gridstyle <> \"\"\n        print \"starting grid style= \";gridstyle\n        screen=preShowGridScreen(gridstyle)\n        gridstyle = showGridScreen(screen, gridstyle)\n    end while\n\nEnd Sub\n\n\n'*************************************************************\n'** Set the configurable theme attributes for the application\n'** \n'** Configure the custom overhang and Logo attributes\n'** These attributes affect the branding of the application\n'** and are artwork, colors and offsets specific to the app\n'*************************************************************\n\nSub initTheme()\n    app = CreateObject(\"roAppManager\")\n    app.SetTheme(CreateDefaultTheme())\nEnd Sub\n\n'******************************************************\n'** @return The default application theme.\n'** Screens can make slight adjustments to the default\n'** theme by getting it from here and then overriding\n'** individual theme attributes.\n'******************************************************\nFunction CreateDefaultTheme() as Object\n    theme = CreateObject(\"roAssociativeArray\")\n\n    theme.ThemeType = \"generic-dark\"\n\n    ' All these are greyscales\n    theme.GridScreenBackgroundColor = \"#363636\"\n    theme.GridScreenMessageColor    = \"#808080\"\n    theme.GridScreenRetrievingColor = \"#CCCCCC\"\n    theme.GridScreenListNameColor   = \"#FFFFFF\"\n\n    ' Color values work here\n    theme.GridScreenDescriptionTitleColor    = \"#001090\"\n    theme.GridScreenDescriptionDateColor     = \"#FF005B\"\n    theme.GridScreenDescriptionRuntimeColor  = \"#5B005B\"\n    theme.GridScreenDescriptionSynopsisColor = \"#606000\"\n    \n    'used in the Grid Screen\n    theme.CounterTextLeft           = \"#FF0000\"\n    theme.CounterSeparator          = \"#00FF00\"\n    theme.CounterTextRight          = \"#0000FF\"\n    \n    theme.GridScreenLogoHD          = \"pkg:/images/Overhang_Test_HD.png\"\n\n    theme.GridScreenLogoOffsetHD_X  = \"0\"\n    theme.GridScreenLogoOffsetHD_Y  = \"0\"\n    theme.GridScreenOverhangHeightHD = \"99\"\n\n    theme.GridScreenLogoSD          = \"pkg:/images/Overhang_Test_SD43.png\"\n    theme.GridScreenOverhangHeightSD = \"66\"\n    theme.GridScreenLogoOffsetSD_X  = \"0\"\n    theme.GridScreenLogoOffsetSD_Y  = \"0\"\n    \n    ' to use your own focus ring artwork \n    'theme.GridScreenFocusBorderSD        = \"pkg:/images/GridCenter_Border_Movies_SD43.png\"\n    'theme.GridScreenBorderOffsetSD  = \"(-26,-25)\"\n    'theme.GridScreenFocusBorderHD        = \"pkg:/images/GridCenter_Border_Movies_HD.png\"\n    'theme.GridScreenBorderOffsetHD  = \"(-28,-20)\"\n    \n    ' to use your own description background artwork\n    'theme.GridScreenDescriptionImageSD  = \"pkg:/images/Grid_Description_Background_SD43.png\"\n    'theme.GridScreenDescriptionOffsetSD = \"(125,170)\"\n    'theme.GridScreenDescriptionImageHD  = \"pkg:/images/Grid_Description_Background_HD.png\"\n    'theme.GridScreenDescriptionOffsetHD = \"(190,255)\"\n    \n\n    return theme\nEnd Function\n\n'******************************************************\n'** Perform any startup/initialization stuff prior to \n'** initially showing the screen.  \n'******************************************************\nFunction preShowGridScreen(style as string) As Object\n\n    m.port=CreateObject(\"roMessagePort\")\n    screen = CreateObject(\"roGridScreen\")\n    screen.SetMessagePort(m.port)\n'    screen.SetDisplayMode(\"best-fit\")\n    screen.SetDisplayMode(\"scale-to-fill\")\n\n    screen.SetGridStyle(style)\n    return screen\n\nEnd Function\n\n\n'******************************************************\n'** Display the gird screen and wait for events from \n'** the screen. The screen will show retreiving while\n'** we fetch and parse the feeds for the show posters\n'******************************************************\nFunction showGridScreen(screen As Object, gridstyle as string) As string\n\n    print \"enter showGridScreen\"\n\n    categoryList = getCategoryList()\n    categoryList[0] = \"GridStyle: \" + gridstyle\n    screen.setupLists(categoryList.count())\n    screen.SetListNames(categoryList)\n    StyleButtons = getGridControlButtons()\n    screen.SetContentList(0, StyleButtons)\n    for i = 1 to categoryList.count()-1\n        screen.SetContentList(i, getShowsForCategoryItem(categoryList[i]))\n    end for\n    screen.Show()\n\n    while true\n        print \"Waiting for message\"\n        msg = wait(0, m.port)\n        'msg = wait(0, screen.GetMessagePort())     ' getmessageport does not work on gridscreen\n        print \"Got Message:\";type(msg)\n        if type(msg) = \"roGridScreenEvent\" then\n            print \"msg= \"; msg.GetMessage() \" , index= \"; msg.GetIndex(); \" data= \"; msg.getData()\n            if msg.isListItemFocused() then\n                print\"list item focused | current show = \"; msg.GetIndex()\n            else if msg.isListItemSelected() then\n                row = msg.GetIndex()\n                selection = msg.getData()\n                print \"list item selected row= \"; row; \" selection= \"; selection\n\n                ' Did we get a selection from the gridstyle selection row?\n                if (row = 0)\n                    ' yes, return so we can come back with new style\n                    return StyleButtons[selection].Title\n                endif\n\n                'm.curShow = displayShowDetailScreen(showList[msg.GetIndex()])\n            else if msg.isScreenClosed() then\n                return \"\"\n            end if\n        end If\n    end while\n\n\nEnd Function\n\n'**********************************************************\n'** When a poster on the home screen is selected, we call\n'** this function passing an roAssociativeArray with the \n'** ContentMetaData for the selected show.  This data should \n'** be sufficient for the springboard to display\n'**********************************************************\nFunction displayShowDetailScreen(category as Object, showIndex as Integer) As Integer\n\n    'add code to create springboard, for now we do nothing\n    return 1\n\nEnd Function\n\n\n'**************************************************************\n'** Return the list of categories to display in the filter\n'** banner. The result is an roArray containing the names of \n'** all of the categories. All just static data for the example.\n'***************************************************************\nFunction getCategoryList() As Object\n\n    categoryList = [ \"GridStyle\", \"Reality\", \"History\", \"News\", \"Comedy\", \"Drama\"]\n    return categoryList\n\nEnd Function\n\n\n'********************************************************************\n'** Given the category from the filter banner, return an array \n'** of ContentMetaData objects (roAssociativeArray's) representing \n'** the shows for the category. For this example, we just cheat and\n'** create and return a static array with just the minimal items\n'** set, but ideally, you'd go to a feed service, fetch and parse\n'** this data dynamically, so content for each category is dynamic\n'********************************************************************\nFunction getShowsForCategoryItem(category As Object) As Object\n\n    print \"getting shows for category \"; category\n\n    showList = [\n        {\n            Title: category + \": Header\",\n            releaseDate: \"1976\",\n            length: 3600-600,\n            Description:\"This row is category \" + category,\n            hdBranded: true,\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\",\n            Description:\"Short Synopsis #1\",\n            Synopsis:\"Length\",\n            StarRating:10,\n        }\n        {\n            Title: category + \": Beverly Hillbillies\",\n            releaseDate: \"1969\",\n            rating: \"PG\",\n            Description:\"Come and listen to a story about a man named Jed: Poor mountaineer, barely kept his family fed. Then one day he was shootin at some food, and up through the ground came a bubblin crude. Oil that is, black gold, Texas tea.\",\n            numEpisodes:42,\n            contentType:\"season\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg\",\n            StarRating:80,\n            UserStarRating:40\n        }\n        {\n            Title: category + \": Babylon 5\",\n            releaseDate: \"1996\",\n            rating: \"PG\",\n            Description:\"The show centers on the Babylon 5 space station: a focal point for politics, diplomacy, and conflict during the years 2257-2262.\",\n            numEpisodes:102,\n            contentType:\"season\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg\",\n            StarRating:80,\n            UserStarRating:40\n        }\n        {\n            Title: category + \": John F. Kennedy\",\n            releaseDate: \"1961\",\n            rating: \"PG\",\n            Description:\"My fellow citizens of the world: ask not what America will do for you, but what together we can do for the freedom of man.\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg\",\n            StarRating:100\n        }\n        {\n            Title: category + \": Man on the Moon\",\n            releaseDate: \"1969\",\n            rating: \"PG\",\n            Description:\"That's one small step for a man, one giant leap for mankind.\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg\",\n            StarRating:100\n        }\n        {\n            Title: category + \": I have a Dream\",\n            releaseDate: \"1963\",\n            rating: \"PG\",\n            Description:\"I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin, but by the content of their character.\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg\",\n            StarRating:100\n        }\n    ]\n\n    return showList\nEnd Function\n    \nfunction getGridControlButtons() as object\n        buttons = [\n            { Title: \"Flat-Movie\"\n              ReleaseDate: \"HD:5x2 SD:5x2\"\n              Description: \"Flat-Movie (Netflix) style\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\"\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\"\n            }\n            { Title: \"Flat-Landscape\"\n              ReleaseDate: \"HD:5x3 SD:4x3\"\n              Description: \"Channel Store\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg\",\n            }\n            { Title: \"Flat-Portrait\"\n              ReleaseDate: \"HD:5x2 SD:5x2\"\n              Description: \"3x4 style posters\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg\",\n            }\n            { Title: \"Flat-Square\"\n              ReleaseDate: \"HD:7x3 SD:6x3\"\n              Description: \"1x1 style posters\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png\",\n            }\n            { Title: \"Flat-16x9\"\n              ReleaseDate: \"HD:5x3 SD:4x3\"\n              Description: \"HD style posters\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png\",\n            }\n       ]\n       return buttons\nEnd Function\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/2D.C",
    "content": "#include \"2D.h\"\r\n#include <math.h>\r\n\r\nvoid set_vgabasemem(void)\r\n{\r\n    ULONG vgabase;\r\n    SELECTOR tmp;\r\n    asm mov [tmp], ds\r\n    dpmi_get_sel_base(&vgabase, tmp);\r\n    vgabasemem = (char *)(-vgabase + 0xa0000);\r\n}\r\n\r\nvoid drw_chdis(int mode) // change the display!\r\n{\r\n    regs.b.ah = 0x00;   // seet theh display moode\r\n    regs.b.al = mode;  // change it to the mode like innit\r\n    regs.h.flags = 0x72;// Set the dingoes kidneys out of FLAGS eh?\r\n    regs.h.ss = 0;     // Like, totally set the stack segment\r\n    regs.h.sp = 0;     // Set tha stack pointaaaaahhhhh!!!\r\n    dpmi_simulate_real_interrupt(0x10, &regs);\r\n}\r\n\r\nvoid drw_pix(int x, int y, enum COLORS col)\r\n{\r\n    *VGAPIX(x, y) = col;\r\n}\r\n\r\nvoid drw_line(int x0, int y0, int x1, int y1, enum COLORS col)\r\n{\r\n    // Going for the optimized version of bresenham's line algo.        \r\n    int stp = (abs(y0 - y1) > abs(x0 - x1));\r\n    int tmp, dx, dy, err, yi, i, j; // yi = y excrement\r\n    if (stp) {\r\n        // swappity swap\r\n        tmp = y0;\r\n        y0 = x0;\r\n        x0 = tmp;\r\n        \r\n        tmp = y1;\r\n        y1 = x1;\r\n        x1 = tmp;\r\n    }\r\n    // AAAAND NOW WE MUST DO ZEES AGAIN :(\r\n    // I'm sure there was a func somewhere that does this? :P\r\n    if (x0 > x1) {\r\n        tmp = x0;\r\n        x0 = x1;\r\n        x1 = tmp;\r\n        \r\n        tmp = y0;\r\n        y0 = y1;\r\n        y1 = tmp;\r\n    }\r\n    dx = (x1 - x0);\r\n    dy = (abs(y1 - y0));\r\n    err = (dx / 2);\r\n\r\n    if (y0 < y1)\r\n        yi = 1;\r\n    else\r\n        yi = -1;\r\n    j = y0;\r\n    for (i = x0; i < x1; i++)\r\n    {\r\n        if (stp)\r\n            *VGAPIX(j, i) = col;\r\n        else\r\n            *VGAPIX(i, j) = col;\r\n\r\n        err -= dy;\r\n        if (err < 0) {\r\n            j += yi;\r\n            err += dx;\r\n        }\r\n    }\r\n}\r\n\r\nvoid drw_rectl(int x, int y, int w, int h, enum COLORS col)\r\n{\r\n    drw_line(x, y, x+w, y, col);\r\n    drw_line(x+w, y, x+w, y+h, col);\r\n\r\n    drw_line(x, y, x, y+h, col);\r\n    drw_line(x, y+h, x+w+1, y+h, col);\r\n}\r\n\r\nvoid drw_rectf(int x, int y, int w, int h, enum COLORS col)\r\n{\r\n    int i, j;\r\n    for (j = y; j < x+h; j++) {\r\n        for (i = x; i < y+w; i++) {\r\n            *VGAPIX(i, j) = col;\r\n        }\r\n    }\r\n}\r\n\r\nvoid drw_circl(int x, int y, int rad, enum COLORS col)\r\n{\r\n    int mang, i; // max angle, haha\r\n    int px, py;\r\n    mang = 360; // Yeah yeah I'll switch to rad later\r\n    for (i = 0; i <= mang; i++)\r\n    {   \r\n        px = cos(i)*rad + x; // + px; // causes some really cools effects! :D\r\n        py = sin(i)*rad + y; // + py;\r\n        *VGAPIX(px, py) = col;\r\n    }\r\n}\r\n\r\nvoid drw_tex(int x, int y, int w, int h, enum COLORS tex[])\r\n{   // i*w+j\r\n    int i, j;\r\n    for (i = 0; i < w; i++)\r\n    {\r\n        for (j = 0; j < h; j++)\r\n        {\r\n            *VGAPIX(x+i, y+j) = tex[j*w+i];\r\n        }\r\n    }\r\n}\r\n\r\nvoid 2D_init(void)\r\n{\r\n    set_vgabasemem();\r\n    drw_chdis(0x13);\r\n}\r\n\r\nvoid 2D_exit(void)\r\n{\r\n    drw_chdis(3);\r\n}\r\n/*\r\nint main()\r\n{\r\n    set_vgabasemem();\r\n    drw_chdis(0x13);\r\n\r\n    while(!kbhit()) {\r\n        if ((getch()) == 0x1b) // escape\r\n            break;\r\n    }\r\n    drw_chdis(3);\r\n    return 0;\r\n}\r\n*/\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/2D.H",
    "content": "#ifndef __2DGFX\r\n#define __2DGFX\r\n// Includes\r\n#include <stdio.h>\r\n#include <math.h>\r\n#include <conio.h>\r\n#include <dpmi.h>\r\n\r\n// Defines\r\n#define VGAPIX(x,y) (vgabasemem + (x) + (y) * 320)\r\n\r\n// Variables\r\nchar * vgabasemem;\r\nDPMI_REGS regs;\r\n\r\n// Drawing functions:\r\n//void setvgabasemem(void);\r\nvoid drw_chdis(int mode); // draw_func_change_display\r\nvoid drw_pix(int x, int y, enum COLORS col);\r\nvoid drw_line(int x0, int y0, int x1, int y1, enum COLORS col);\r\nvoid drw_rectl(int x, int y, int w, int h, enum COLORS col);\r\nvoid drw_rectf(int x, int y, int w, int h, enum COLORS col);\r\nvoid drw_cirl(int x, int y, int rad, enum COLORS col);\r\nvoid drw_tex(int x, int y, int w, int h, enum COLORS tex[]);\r\nvoid 2D_init(void);\r\nvoid 2D_exit(void);\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/Arduino.cats",
    "content": "/** The MIT License (MIT)\n\nCopyright (c) 2014 Hongwei Xi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.*/\n\n// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/master/contrib/arduino/CATS/Arduino.cats\n\n\n/*\n** The prelude for Ardunio\n*/\n\n/* ****** ****** */\n\n#ifndef ARDUINO_CATS_ARDUINO\n#define ARDUINO_CATS_ARDUINO\n\n/* ****** ****** */\n\n#include <Arduino.h>\n\n/* ****** ****** */\n\n#define delay_int(ms) delay(ms)\n#define delay_ulint(ms) delay(ms)\n\n/* ****** ****** */\n//\n#define random_int_1(x) random(x)\n#define random_int_2(x, y) random(x, y)\n#define random_lint_1(x) random(x)\n#define random_lint_2(x, y) random(x, y)\n//\n#define randomSeed_int(x) randomSeed(x)\n#define randomSeed_uint(x) randomSeed(x)\n//\n/* ****** ****** */\n\n#endif // #ifndef(ARDUINO_CATS_ARDUINO)\n\n/* ****** ****** */\n\n/* end of [Arduino.cats] */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/ArrowLeft.h",
    "content": "/*\n * This file is part of GTK++ (libGTK++)\n * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)\n *\n * GTK++ is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * GTK++ is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/* GdkPixbuf RGBA C-Source image dump */\n\n#ifdef __SUNPRO_C\n#pragma align 4 (ArrowLeft)\n#endif\n#ifdef __GNUC__\nstatic const uint8_t ArrowLeft[] __attribute__ ((__aligned__ (4))) = \n#else\nstatic const uint8_t ArrowLeft[] = \n#endif\n{ \"\"\n  /* Pixbuf magic (0x47646b50) */\n  \"GdkP\"\n  /* length: header (24) + pixel_data (1600) */\n  \"\\0\\0\\6X\"\n  /* pixdata_type (0x1010002) */\n  \"\\1\\1\\0\\2\"\n  /* rowstride (80) */\n  \"\\0\\0\\0P\"\n  /* width (20) */\n  \"\\0\\0\\0\\24\"\n  /* height (20) */\n  \"\\0\\0\\0\\24\"\n  /* pixel_data: */\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\"\n  \"\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\"\n  \"\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\"\n  \"\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\"};\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/GLKMatrix4.h",
    "content": "//\n//  GLKMatrix4.h\n//  GLKit\n//\n//  Copyright (c) 2011, Apple Inc. All rights reserved.\n//\n\n#ifndef __GLK_MATRIX_4_H\n#define __GLK_MATRIX_4_H\n\n#include <stddef.h>\n#include <stdbool.h>\n#include <math.h>\n\n#if defined(__ARM_NEON__)\n#include <arm_neon.h>\n#endif\n\n#include <GLKit/GLKMathTypes.h>\n#include <GLKit/GLKVector3.h>\n#include <GLKit/GLKVector4.h>\n#include <GLKit/GLKQuaternion.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#pragma mark -\n#pragma mark Prototypes\n#pragma mark -\n\nextern const GLKMatrix4 GLKMatrix4Identity;\n\n/*\n m30, m31, and m32 correspond to the translation values tx, ty, tz, respectively.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03,\n                                            float m10, float m11, float m12, float m13,\n                                            float m20, float m21, float m22, float m23,\n                                            float m30, float m31, float m32, float m33);\n\n/*\n m03, m13, and m23 correspond to the translation values tx, ty, tz, respectively.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03,\n                                                        float m10, float m11, float m12, float m13,\n                                                        float m20, float m21, float m22, float m23,\n                                                        float m30, float m31, float m32, float m33);\n\n/*\n m[12], m[13], and m[14] correspond to the translation values tx, ty, and tz, respectively.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16]);\n\n/*\n m[3], m[7], and m[11] correspond to the translation values tx, ty, and tz, respectively.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16]);\n\n/*\n row0, row1, and row2's last component should correspond to the translation values tx, ty, and tz, respectively.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0,\n                                                    GLKVector4 row1,\n                                                    GLKVector4 row2,\n                                                    GLKVector4 row3);\n\n/*\n column3's first three components should correspond to the translation values tx, ty, and tz.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0,\n                                                       GLKVector4 column1,\n                                                       GLKVector4 column2,\n                                                       GLKVector4 column3);\n\n/*\n The quaternion will be normalized before conversion.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz);\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz);\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians);\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians);\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians);\n\n/*\n Equivalent to gluPerspective.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ);\n\n/*\n Equivalent to glFrustum.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right,\n                                                   float bottom, float top,\n                                                   float nearZ, float farZ);\n\n/*\n Equivalent to glOrtho.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right,\n                                                 float bottom, float top,\n                                                 float nearZ, float farZ);\n\n/*\n Equivalent to gluLookAt.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ,\n                                                  float centerX, float centerY, float centerZ,\n                                                  float upX, float upY, float upZ);\n\n/*\n Returns the upper left 3x3 portion of the 4x4 matrix.\n */\nstatic __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix);\n/*\n Returns the upper left 2x2 portion of the 4x4 matrix.\n */\nstatic __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix);\n\n/*\n GLKMatrix4GetRow returns vectors for rows 0, 1, and 2 whose last component will be the translation value tx, ty, and tz, respectively.\n Valid row values range from 0 to 3, inclusive.\n */\nstatic __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row);\n/*\n GLKMatrix4GetColumn returns a vector for column 3 whose first three components will be the translation values tx, ty, and tz.\n Valid column values range from 0 to 3, inclusive.\n */\nstatic __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column);\n\n/*\n GLKMatrix4SetRow expects that the vector for row 0, 1, and 2 will have a translation value as its last component.\n Valid row values range from 0 to 3, inclusive.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector);\n/*\n GLKMatrix4SetColumn expects that the vector for column 3 will contain the translation values tx, ty, and tz as its first three components, respectively.\n Valid column values range from 0 to 3, inclusive.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix);\n\nGLKMatrix4 GLKMatrix4Invert(GLKMatrix4 matrix, bool *isInvertible);\nGLKMatrix4 GLKMatrix4InvertAndTranspose(GLKMatrix4 matrix, bool *isInvertible);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);\nstatic __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz);\nstatic __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector);\n/*\n The last component of the GLKVector4, translationVector, is ignored.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz);\nstatic __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector);\n/*\n The last component of the GLKVector4, scaleVector, is ignored.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z);\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector);\n/*\n The last component of the GLKVector4, axisVector, is ignored.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians);\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians);\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians);\n\n/*\n Assumes 0 in the w component.\n */\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);\n/*\n Assumes 1 in the w component.\n */\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);\n/*\n Assumes 1 in the w component and divides the resulting vector by w before returning.\n */\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);\n\n/*\n Assumes 0 in the w component.\n */\nstatic __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);\n/*\n Assumes 1 in the w component.\n */\nstatic __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);\n/*\n Assumes 1 in the w component and divides the resulting vector by w before returning.\n */\nstatic __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);\n\nstatic __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight);\n\nstatic __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount);\n\n#pragma mark -\n#pragma mark Implementations\n#pragma mark -\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03,\n                                            float m10, float m11, float m12, float m13,\n                                            float m20, float m21, float m22, float m23,\n                                            float m30, float m31, float m32, float m33)\n{\n    GLKMatrix4 m = { m00, m01, m02, m03,\n                     m10, m11, m12, m13,\n                     m20, m21, m22, m23,\n                     m30, m31, m32, m33 };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03,\n                                                        float m10, float m11, float m12, float m13,\n                                                        float m20, float m21, float m22, float m23,\n                                                        float m30, float m31, float m32, float m33)\n{\n    GLKMatrix4 m = { m00, m10, m20, m30,\n                     m01, m11, m21, m31,\n                     m02, m12, m22, m32,\n                     m03, m13, m23, m33 };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16])\n{\n    GLKMatrix4 m = { values[0], values[1], values[2], values[3],\n                     values[4], values[5], values[6], values[7],\n                     values[8], values[9], values[10], values[11],\n                     values[12], values[13], values[14], values[15] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16])\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t m = vld4q_f32(values);\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { values[0], values[4], values[8], values[12],\n                     values[1], values[5], values[9], values[13],\n                     values[2], values[6], values[10], values[14],\n                     values[3], values[7], values[11], values[15] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0,\n                                                    GLKVector4 row1,\n                                                    GLKVector4 row2,\n                                                    GLKVector4 row3)\n{\n    GLKMatrix4 m = { row0.v[0], row1.v[0], row2.v[0], row3.v[0],\n                     row0.v[1], row1.v[1], row2.v[1], row3.v[1],\n                     row0.v[2], row1.v[2], row2.v[2], row3.v[2],\n                     row0.v[3], row1.v[3], row2.v[3], row3.v[3] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0,\n                                                       GLKVector4 column1,\n                                                       GLKVector4 column2,\n                                                       GLKVector4 column3)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t m;\n    m.val[0] = vld1q_f32(column0.v);\n    m.val[1] = vld1q_f32(column1.v);\n    m.val[2] = vld1q_f32(column2.v);\n    m.val[3] = vld1q_f32(column3.v);\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { column0.v[0], column0.v[1], column0.v[2], column0.v[3],\n                     column1.v[0], column1.v[1], column1.v[2], column1.v[3],\n                     column2.v[0], column2.v[1], column2.v[2], column2.v[3],\n                     column3.v[0], column3.v[1], column3.v[2], column3.v[3] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion)\n{\n    quaternion = GLKQuaternionNormalize(quaternion);\n\n    float x = quaternion.q[0];\n    float y = quaternion.q[1];\n    float z = quaternion.q[2];\n    float w = quaternion.q[3];\n\n    float _2x = x + x;\n    float _2y = y + y;\n    float _2z = z + z;\n    float _2w = w + w;\n\n    GLKMatrix4 m = { 1.0f - _2y * y - _2z * z,\n                     _2x * y + _2w * z,\n                     _2x * z - _2w * y,\n                     0.0f,\n                     _2x * y - _2w * z,\n                     1.0f - _2x * x - _2z * z,\n                     _2y * z + _2w * x,\n                     0.0f,\n                     _2x * z + _2w * y,\n                     _2y * z - _2w * x,\n                     1.0f - _2x * x - _2y * y,\n                     0.0f,\n                     0.0f,\n                     0.0f,\n                     0.0f,\n                     1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz)\n{\n    GLKMatrix4 m = GLKMatrix4Identity;\n    m.m[12] = tx;\n    m.m[13] = ty;\n    m.m[14] = tz;\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz)\n{\n    GLKMatrix4 m = GLKMatrix4Identity;\n    m.m[0] = sx;\n    m.m[5] = sy;\n    m.m[10] = sz;\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z)\n{\n    GLKVector3 v = GLKVector3Normalize(GLKVector3Make(x, y, z));\n    float cos = cosf(radians);\n    float cosp = 1.0f - cos;\n    float sin = sinf(radians);\n\n    GLKMatrix4 m = { cos + cosp * v.v[0] * v.v[0],\n                     cosp * v.v[0] * v.v[1] + v.v[2] * sin,\n                     cosp * v.v[0] * v.v[2] - v.v[1] * sin,\n                     0.0f,\n                     cosp * v.v[0] * v.v[1] - v.v[2] * sin,\n                     cos + cosp * v.v[1] * v.v[1],\n                     cosp * v.v[1] * v.v[2] + v.v[0] * sin,\n                     0.0f,\n                     cosp * v.v[0] * v.v[2] + v.v[1] * sin,\n                     cosp * v.v[1] * v.v[2] - v.v[0] * sin,\n                     cos + cosp * v.v[2] * v.v[2],\n                     0.0f,\n                     0.0f,\n                     0.0f,\n                     0.0f,\n                     1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians)\n{\n    float cos = cosf(radians);\n    float sin = sinf(radians);\n\n    GLKMatrix4 m = { 1.0f, 0.0f, 0.0f, 0.0f,\n                     0.0f, cos, sin, 0.0f,\n                     0.0f, -sin, cos, 0.0f,\n                     0.0f, 0.0f, 0.0f, 1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians)\n{\n    float cos = cosf(radians);\n    float sin = sinf(radians);\n\n    GLKMatrix4 m = { cos, 0.0f, -sin, 0.0f,\n                     0.0f, 1.0f, 0.0f, 0.0f,\n                     sin, 0.0f, cos, 0.0f,\n                     0.0f, 0.0f, 0.0f, 1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians)\n{\n    float cos = cosf(radians);\n    float sin = sinf(radians);\n\n    GLKMatrix4 m = { cos, sin, 0.0f, 0.0f,\n                     -sin, cos, 0.0f, 0.0f,\n                     0.0f, 0.0f, 1.0f, 0.0f,\n                     0.0f, 0.0f, 0.0f, 1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ)\n{\n    float cotan = 1.0f / tanf(fovyRadians / 2.0f);\n\n    GLKMatrix4 m = { cotan / aspect, 0.0f, 0.0f, 0.0f,\n                     0.0f, cotan, 0.0f, 0.0f,\n                     0.0f, 0.0f, (farZ + nearZ) / (nearZ - farZ), -1.0f,\n                     0.0f, 0.0f, (2.0f * farZ * nearZ) / (nearZ - farZ), 0.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right,\n                                                   float bottom, float top,\n                                                   float nearZ, float farZ)\n{\n    float ral = right + left;\n    float rsl = right - left;\n    float tsb = top - bottom;\n    float tab = top + bottom;\n    float fan = farZ + nearZ;\n    float fsn = farZ - nearZ;\n\n    GLKMatrix4 m = { 2.0f * nearZ / rsl, 0.0f, 0.0f, 0.0f,\n                     0.0f, 2.0f * nearZ / tsb, 0.0f, 0.0f,\n                     ral / rsl, tab / tsb, -fan / fsn, -1.0f,\n                     0.0f, 0.0f, (-2.0f * farZ * nearZ) / fsn, 0.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right,\n                                                 float bottom, float top,\n                                                 float nearZ, float farZ)\n{\n    float ral = right + left;\n    float rsl = right - left;\n    float tab = top + bottom;\n    float tsb = top - bottom;\n    float fan = farZ + nearZ;\n    float fsn = farZ - nearZ;\n\n    GLKMatrix4 m = { 2.0f / rsl, 0.0f, 0.0f, 0.0f,\n                     0.0f, 2.0f / tsb, 0.0f, 0.0f,\n                     0.0f, 0.0f, -2.0f / fsn, 0.0f,\n                     -ral / rsl, -tab / tsb, -fan / fsn, 1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ,\n                                                  float centerX, float centerY, float centerZ,\n                                                  float upX, float upY, float upZ)\n{\n    GLKVector3 ev = { eyeX, eyeY, eyeZ };\n    GLKVector3 cv = { centerX, centerY, centerZ };\n    GLKVector3 uv = { upX, upY, upZ };\n    GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv)));\n    GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n));\n    GLKVector3 v = GLKVector3CrossProduct(n, u);\n\n    GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f,\n                     u.v[1], v.v[1], n.v[1], 0.0f,\n                     u.v[2], v.v[2], n.v[2], 0.0f,\n                     GLKVector3DotProduct(GLKVector3Negate(u), ev),\n                     GLKVector3DotProduct(GLKVector3Negate(v), ev),\n                     GLKVector3DotProduct(GLKVector3Negate(n), ev),\n                     1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix)\n{\n    GLKMatrix3 m = { matrix.m[0], matrix.m[1], matrix.m[2],\n                     matrix.m[4], matrix.m[5], matrix.m[6],\n                     matrix.m[8], matrix.m[9], matrix.m[10] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix)\n{\n    GLKMatrix2 m = { matrix.m[0], matrix.m[1],\n                     matrix.m[4], matrix.m[5] };\n    return m;\n}\n\nstatic __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row)\n{\n    GLKVector4 v = { matrix.m[row], matrix.m[4 + row], matrix.m[8 + row], matrix.m[12 + row] };\n    return v;\n}\n\nstatic __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column)\n{\n#if defined(__ARM_NEON__)\n    float32x4_t v = vld1q_f32(&(matrix.m[column * 4]));\n    return *(GLKVector4 *)&v;\n#else\n    GLKVector4 v = { matrix.m[column * 4 + 0], matrix.m[column * 4 + 1], matrix.m[column * 4 + 2], matrix.m[column * 4 + 3] };\n    return v;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector)\n{\n    matrix.m[row] = vector.v[0];\n    matrix.m[row + 4] = vector.v[1];\n    matrix.m[row + 8] = vector.v[2];\n    matrix.m[row + 12] = vector.v[3];\n\n    return matrix;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector)\n{\n#if defined(__ARM_NEON__)\n    float *dst = &(matrix.m[column * 4]);\n    vst1q_f32(dst, vld1q_f32(vector.v));\n    return matrix;\n#else\n    matrix.m[column * 4 + 0] = vector.v[0];\n    matrix.m[column * 4 + 1] = vector.v[1];\n    matrix.m[column * 4 + 2] = vector.v[2];\n    matrix.m[column * 4 + 3] = vector.v[3];\n\n    return matrix;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t m = vld4q_f32(matrix.m);\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { matrix.m[0], matrix.m[4], matrix.m[8], matrix.m[12],\n                     matrix.m[1], matrix.m[5], matrix.m[9], matrix.m[13],\n                     matrix.m[2], matrix.m[6], matrix.m[10], matrix.m[14],\n                     matrix.m[3], matrix.m[7], matrix.m[11], matrix.m[15] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;\n    float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;\n    float32x4x4_t m;\n\n    m.val[0] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[0], 0));\n    m.val[1] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[1], 0));\n    m.val[2] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[2], 0));\n    m.val[3] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[3], 0));\n\n    m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[0], 1));\n    m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[1], 1));\n    m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[2], 1));\n    m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[3], 1));\n\n    m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[0], 2));\n    m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[1], 2));\n    m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[2], 2));\n    m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[3], 2));\n\n    m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[0], 3));\n    m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[1], 3));\n    m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[2], 3));\n    m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[3], 3));\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m;\n\n    m.m[0]  = matrixLeft.m[0] * matrixRight.m[0]  + matrixLeft.m[4] * matrixRight.m[1]  + matrixLeft.m[8] * matrixRight.m[2]   + matrixLeft.m[12] * matrixRight.m[3];\n\tm.m[4]  = matrixLeft.m[0] * matrixRight.m[4]  + matrixLeft.m[4] * matrixRight.m[5]  + matrixLeft.m[8] * matrixRight.m[6]   + matrixLeft.m[12] * matrixRight.m[7];\n\tm.m[8]  = matrixLeft.m[0] * matrixRight.m[8]  + matrixLeft.m[4] * matrixRight.m[9]  + matrixLeft.m[8] * matrixRight.m[10]  + matrixLeft.m[12] * matrixRight.m[11];\n\tm.m[12] = matrixLeft.m[0] * matrixRight.m[12] + matrixLeft.m[4] * matrixRight.m[13] + matrixLeft.m[8] * matrixRight.m[14]  + matrixLeft.m[12] * matrixRight.m[15];\n\n\tm.m[1]  = matrixLeft.m[1] * matrixRight.m[0]  + matrixLeft.m[5] * matrixRight.m[1]  + matrixLeft.m[9] * matrixRight.m[2]   + matrixLeft.m[13] * matrixRight.m[3];\n\tm.m[5]  = matrixLeft.m[1] * matrixRight.m[4]  + matrixLeft.m[5] * matrixRight.m[5]  + matrixLeft.m[9] * matrixRight.m[6]   + matrixLeft.m[13] * matrixRight.m[7];\n\tm.m[9]  = matrixLeft.m[1] * matrixRight.m[8]  + matrixLeft.m[5] * matrixRight.m[9]  + matrixLeft.m[9] * matrixRight.m[10]  + matrixLeft.m[13] * matrixRight.m[11];\n\tm.m[13] = matrixLeft.m[1] * matrixRight.m[12] + matrixLeft.m[5] * matrixRight.m[13] + matrixLeft.m[9] * matrixRight.m[14]  + matrixLeft.m[13] * matrixRight.m[15];\n\n\tm.m[2]  = matrixLeft.m[2] * matrixRight.m[0]  + matrixLeft.m[6] * matrixRight.m[1]  + matrixLeft.m[10] * matrixRight.m[2]  + matrixLeft.m[14] * matrixRight.m[3];\n\tm.m[6]  = matrixLeft.m[2] * matrixRight.m[4]  + matrixLeft.m[6] * matrixRight.m[5]  + matrixLeft.m[10] * matrixRight.m[6]  + matrixLeft.m[14] * matrixRight.m[7];\n\tm.m[10] = matrixLeft.m[2] * matrixRight.m[8]  + matrixLeft.m[6] * matrixRight.m[9]  + matrixLeft.m[10] * matrixRight.m[10] + matrixLeft.m[14] * matrixRight.m[11];\n\tm.m[14] = matrixLeft.m[2] * matrixRight.m[12] + matrixLeft.m[6] * matrixRight.m[13] + matrixLeft.m[10] * matrixRight.m[14] + matrixLeft.m[14] * matrixRight.m[15];\n\n\tm.m[3]  = matrixLeft.m[3] * matrixRight.m[0]  + matrixLeft.m[7] * matrixRight.m[1]  + matrixLeft.m[11] * matrixRight.m[2]  + matrixLeft.m[15] * matrixRight.m[3];\n\tm.m[7]  = matrixLeft.m[3] * matrixRight.m[4]  + matrixLeft.m[7] * matrixRight.m[5]  + matrixLeft.m[11] * matrixRight.m[6]  + matrixLeft.m[15] * matrixRight.m[7];\n\tm.m[11] = matrixLeft.m[3] * matrixRight.m[8]  + matrixLeft.m[7] * matrixRight.m[9]  + matrixLeft.m[11] * matrixRight.m[10] + matrixLeft.m[15] * matrixRight.m[11];\n\tm.m[15] = matrixLeft.m[3] * matrixRight.m[12] + matrixLeft.m[7] * matrixRight.m[13] + matrixLeft.m[11] * matrixRight.m[14] + matrixLeft.m[15] * matrixRight.m[15];\n\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;\n    float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;\n    float32x4x4_t m;\n\n    m.val[0] = vaddq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]);\n    m.val[1] = vaddq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]);\n    m.val[2] = vaddq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]);\n    m.val[3] = vaddq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]);\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m;\n\n    m.m[0] = matrixLeft.m[0] + matrixRight.m[0];\n    m.m[1] = matrixLeft.m[1] + matrixRight.m[1];\n    m.m[2] = matrixLeft.m[2] + matrixRight.m[2];\n    m.m[3] = matrixLeft.m[3] + matrixRight.m[3];\n\n    m.m[4] = matrixLeft.m[4] + matrixRight.m[4];\n    m.m[5] = matrixLeft.m[5] + matrixRight.m[5];\n    m.m[6] = matrixLeft.m[6] + matrixRight.m[6];\n    m.m[7] = matrixLeft.m[7] + matrixRight.m[7];\n\n    m.m[8] = matrixLeft.m[8] + matrixRight.m[8];\n    m.m[9] = matrixLeft.m[9] + matrixRight.m[9];\n    m.m[10] = matrixLeft.m[10] + matrixRight.m[10];\n    m.m[11] = matrixLeft.m[11] + matrixRight.m[11];\n\n    m.m[12] = matrixLeft.m[12] + matrixRight.m[12];\n    m.m[13] = matrixLeft.m[13] + matrixRight.m[13];\n    m.m[14] = matrixLeft.m[14] + matrixRight.m[14];\n    m.m[15] = matrixLeft.m[15] + matrixRight.m[15];\n\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;\n    float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;\n    float32x4x4_t m;\n\n    m.val[0] = vsubq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]);\n    m.val[1] = vsubq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]);\n    m.val[2] = vsubq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]);\n    m.val[3] = vsubq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]);\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m;\n\n    m.m[0] = matrixLeft.m[0] - matrixRight.m[0];\n    m.m[1] = matrixLeft.m[1] - matrixRight.m[1];\n    m.m[2] = matrixLeft.m[2] - matrixRight.m[2];\n    m.m[3] = matrixLeft.m[3] - matrixRight.m[3];\n\n    m.m[4] = matrixLeft.m[4] - matrixRight.m[4];\n    m.m[5] = matrixLeft.m[5] - matrixRight.m[5];\n    m.m[6] = matrixLeft.m[6] - matrixRight.m[6];\n    m.m[7] = matrixLeft.m[7] - matrixRight.m[7];\n\n    m.m[8] = matrixLeft.m[8] - matrixRight.m[8];\n    m.m[9] = matrixLeft.m[9] - matrixRight.m[9];\n    m.m[10] = matrixLeft.m[10] - matrixRight.m[10];\n    m.m[11] = matrixLeft.m[11] - matrixRight.m[11];\n\n    m.m[12] = matrixLeft.m[12] - matrixRight.m[12];\n    m.m[13] = matrixLeft.m[13] - matrixRight.m[13];\n    m.m[14] = matrixLeft.m[14] - matrixRight.m[14];\n    m.m[15] = matrixLeft.m[15] - matrixRight.m[15];\n\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz)\n{\n    GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],\n                     matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],\n                     matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],\n                     matrix.m[0] * tx + matrix.m[4] * ty + matrix.m[8] * tz + matrix.m[12],\n                     matrix.m[1] * tx + matrix.m[5] * ty + matrix.m[9] * tz + matrix.m[13],\n                     matrix.m[2] * tx + matrix.m[6] * ty + matrix.m[10] * tz + matrix.m[14],\n                     matrix.m[15] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector)\n{\n    GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],\n                     matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],\n                     matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],\n                     matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12],\n                     matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13],\n                     matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14],\n                     matrix.m[15] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector)\n{\n    GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],\n                     matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],\n                     matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],\n                     matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12],\n                     matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13],\n                     matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14],\n                     matrix.m[15] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;\n    float32x4x4_t m;\n\n    m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)sx);\n    m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)sy);\n    m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)sz);\n    m.val[3] = iMatrix.val[3];\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { matrix.m[0] * sx, matrix.m[1] * sx, matrix.m[2] * sx, matrix.m[3] * sx,\n                     matrix.m[4] * sy, matrix.m[5] * sy, matrix.m[6] * sy, matrix.m[7] * sy,\n                     matrix.m[8] * sz, matrix.m[9] * sz, matrix.m[10] * sz, matrix.m[11] * sz,\n                     matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;\n    float32x4x4_t m;\n\n    m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]);\n    m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]);\n    m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]);\n    m.val[3] = iMatrix.val[3];\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0],\n                     matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1],\n                     matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2],\n                     matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;\n    float32x4x4_t m;\n\n    m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]);\n    m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]);\n    m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]);\n    m.val[3] = iMatrix.val[3];\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0],\n                     matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1],\n                     matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2],\n                     matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, x, y, z);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeXRotation(radians);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeYRotation(radians);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeZRotation(radians);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)\n{\n    GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 0.0f));\n    return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]);\n}\n\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)\n{\n    GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f));\n    return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]);\n}\n\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)\n{\n    GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f));\n    return GLKVector3MultiplyScalar(GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]), 1.0f / v4.v[3]);\n}\n\nstatic __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)\n{\n    size_t i;\n    for (i=0; i < vectorCount; i++)\n        vectors[i] = GLKMatrix4MultiplyVector3(matrix, vectors[i]);\n}\n\nstatic __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)\n{\n    size_t i;\n    for (i=0; i < vectorCount; i++)\n        vectors[i] = GLKMatrix4MultiplyVector3WithTranslation(matrix, vectors[i]);\n}\n\nstatic __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)\n{\n    size_t i;\n    for (i=0; i < vectorCount; i++)\n        vectors[i] = GLKMatrix4MultiplyAndProjectVector3(matrix, vectors[i]);\n}\n\nstatic __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrix = *(float32x4x4_t *)&matrixLeft;\n    float32x4_t v;\n\n    iMatrix.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)vectorRight.v[0]);\n    iMatrix.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)vectorRight.v[1]);\n    iMatrix.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)vectorRight.v[2]);\n    iMatrix.val[3] = vmulq_n_f32(iMatrix.val[3], (float32_t)vectorRight.v[3]);\n\n    iMatrix.val[0] = vaddq_f32(iMatrix.val[0], iMatrix.val[1]);\n    iMatrix.val[2] = vaddq_f32(iMatrix.val[2], iMatrix.val[3]);\n\n    v = vaddq_f32(iMatrix.val[0], iMatrix.val[2]);\n\n    return *(GLKVector4 *)&v;\n#else\n    GLKVector4 v = { matrixLeft.m[0] * vectorRight.v[0] + matrixLeft.m[4] * vectorRight.v[1] + matrixLeft.m[8] * vectorRight.v[2] + matrixLeft.m[12] * vectorRight.v[3],\n                     matrixLeft.m[1] * vectorRight.v[0] + matrixLeft.m[5] * vectorRight.v[1] + matrixLeft.m[9] * vectorRight.v[2] + matrixLeft.m[13] * vectorRight.v[3],\n                     matrixLeft.m[2] * vectorRight.v[0] + matrixLeft.m[6] * vectorRight.v[1] + matrixLeft.m[10] * vectorRight.v[2] + matrixLeft.m[14] * vectorRight.v[3],\n                     matrixLeft.m[3] * vectorRight.v[0] + matrixLeft.m[7] * vectorRight.v[1] + matrixLeft.m[11] * vectorRight.v[2] + matrixLeft.m[15] * vectorRight.v[3] };\n    return v;\n#endif\n}\n\nstatic __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount)\n{\n    size_t i;\n    for (i=0; i < vectorCount; i++)\n        vectors[i] = GLKMatrix4MultiplyVector4(matrix, vectors[i]);\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __GLK_MATRIX_4_H */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/NWMan.h",
    "content": "#ifndef _NME_WMAN_H\n#define _NME_WMAN_H\n\n// Internal window manager API\n\n#include \"NCompat.h\"\n\nSTART_HEAD\n\n#include \"NPos.h\"\n#include \"NUtil.h\"\n#include \"NTypes.h\"\n\nNTS(NWMan_event);\n\nNSTRUCT(NWMan, {\n    // Init stuff\n    bool (*init)();\n    bool (*destroy)();\n\n    // Window stuff\n    bool (*create_window)();\n    bool (*destroy_window)();\n\n    void (*swap_buffers)();\n\n    // Event stuff\n    bool (*next_event)(NWMan_event* event);\n\n    // Time stuff\n    uint (*get_millis)();\n    void (*sleep)(uint millis);\n\n    // Info\n    int rshift_key;\n    int lshift_key;\n    int left_key;\n    int right_key;\n});\n\nNENUM(NWMan_event_type, {\n    N_WMAN_MOUSE_MOVE = 0,\n    N_WMAN_MOUSE_BUTTON = 1,\n    N_WMAN_MOUSE_WHEEL = 2,\n\n    N_WMAN_KEYBOARD = 10,\n\n    N_WMAN_QUIT = 20,\n    N_WMAN_RESIZE = 21,\n    N_WMAN_FOCUS = 22\n});\n\n#define N_WMAN_MOUSE_LEFT 0\n#define N_WMAN_MOUSE_RIGHT 1\n#define N_WMAN_MOUSE_MIDDLE 2\n\nNSTRUCT(NWMan_event, {\n    NWMan_event_type type;\n\n    union {\n        // Mouse\n\n        NPos2i mouse_pos;\n\n        struct {\n            short id;\n            bool state;\n        } mouse_button;\n\n        signed char mouse_wheel; // 1 if up, -1 if down\n\n        // Keyboard\n\n        struct {\n            int key;\n            bool state;\n        } keyboard;\n\n        // Window\n\n        bool window_quit; // Will always be true if WM_QUIT\n\n        NPos2i window_size;\n\n        bool window_focus;\n    };\n});\n\nNWMan_event NWMan_event_new(NWMan_event_type type);\n\n\nbool NWMan_init();\nbool NWMan_destroy();\n\nextern NWMan N_WMan;\n\nEND_HEAD\n\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/Nightmare.h",
    "content": "#ifndef _NMEX_NIGHTMARE_H\n#define _NMEX_NIGHTMARE_H\n\n//#define NMEX\n\n#include \"../src/NCompat.h\"\n\nSTART_HEAD\n\n#include \"../src/NTypes.h\"\n#include \"../src/NUtil.h\"\n#include \"../src/NPorting.h\"\n#include \"../src/NGlobals.h\"\n#include \"../src/NLog.h\"\n#include \"../src/NWMan.h\"\n#include \"../src/NRsc.h\"\n#include \"../src/NShader.h\"\n#include \"../src/NSquare.h\"\n#include \"../src/NImage.h\"\n#include \"../src/NSprite.h\"\n#include \"../src/NSpritesheet.h\"\n#include \"../src/NEntity.h\"\n#include \"../src/Game.h\"\n\nEND_HEAD\n\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/array.c",
    "content": "#include <array.h>\n\nunsigned __bump_up(unsigned n) {\n    unsigned base = 1;\n    --n;\n    while (base < sizeof n * 8) {\n        n |= n >> base;\n        base *= 2;\n    }\n    ++n;\n    n += (n == 0);\n    return n;\n}\n\nvoid *__array_alloc(size_t size, unsigned length) {\n    unsigned allocated = __bump_up(length);\n    struct __array_header *head = malloc(sizeof *head + allocated * size);\n    assert(head);\n    head->length = length;\n    head->allocated = allocated;\n    return (void *) (head + 1);\n}\n\nvoid __array_resize(void **array, size_t size, int difference) {\n    if (difference == 0) {\n        return;\n    }\n    struct __array_header *head = __header(*array);\n    head->length += difference;\n    if (head->length >= head->allocated) {\n        head->allocated = __bump_up(head->length);\n        head = realloc(head, sizeof *head + head->allocated * size);\n        assert(head);\n        *array = head + 1;\n    }\n}\n\nint __array_search(void *array, void *elem, size_t size) {\n    for (unsigned i = 0; i < alength(array) * size; i += size) {\n        if (memcmp((char *)array + i, elem, size) == 0) {\n            return 1;\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/array.h",
    "content": "#ifndef ARRAY_H\n#define ARRAY_H value\n\n#include <assert.h>\n#include <stdlib.h>\n#include <string.h>\n\n#define array(type, name, initial_length) \\\n    type *name = __array_alloc(sizeof(type), initial_length)\n\n#define aforeach(it, array) \\\n    for (unsigned it = 0; \\\n            it < alength(array); \\\n            ++it)\n\n#define __header(array) \\\n    ((struct __array_header *) array - 1)\n\n#define alength(array) \\\n    (__header(array)->length)\n\n#define afree(array) \\\n    free(__header(array))\n\n#define apush(array, elem) \\\n    __array_resize((void **) &array, sizeof *array, 1); \\\n    array[alength(array)-1] = elem\n\n#define apop(array) \\\n    aremove(array, (alength(array) - 1))\n\n#define aremove(array, index) \\\n    assert(alength(array) > index); \\\n    memmove(array + index, array + index + 1, sizeof *array * (alength(array) - index - 1)); \\\n    __array_resize((void **) &array, sizeof *array, -1)\n\n#define ainsert(array, index, elem) \\\n    __array_resize((void **) &array, sizeof *array, index >= alength(array) ? index - alength(array) + 1 : 1); \\\n    memmove(array + index + 1, array + index, sizeof *array * (alength(array) - index - 1)); \\\n    array[index] = elem\n\n#define acontains(array, elem) \\\n    __array_search(array, &elem, sizeof elem)\n\n#define __arrayallocated(array) \\\n    (__header(array)->allocated)\n\nstruct __array_header {\n    unsigned length;\n    unsigned allocated;\n};\n\nunsigned __bump_up(unsigned n);\nvoid *__array_alloc(size_t size, unsigned length);\nvoid __array_resize(void **array, size_t size, int difference);\nint __array_search(void *array, void *elem, size_t size);\n\n#endif /* ifndef ARRAY_H */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/asm.h",
    "content": "/* CarbonOS System/Kernel\n * Copyright 2015-2017 David Aylaian\n * Licensed under Apache 2.0: https://github.com/DavidAylaian/CarbonOS/blob/master/LICENSE.md\n */\n\n#ifndef ASM_H\n#define ASM_H\n\n#include <stdint.h>\n\n// macros for enabling and disabling interrupts\n#define enable()\tasm(\"sti\");\n#define disable()\tasm(\"cli\");\n\n// inb instruction\nuint8_t inb (uint16_t port) {\n\tuint8_t val;\n\tasm volatile (\"inb %0, %1\" : \"=a\"(val): \"Nd\"(port));\n\treturn val;\n}\n\n// outb instruction\nvoid outb (uint16_t port, uint8_t val) {\n\tasm volatile (\"outb %1, %0\" : : \"a\"(val), \"Nd\"(port));\n}\n\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/bitmap.h",
    "content": "#pragma once\n\n/* Copyright © 2010 Christoph Sünderhauf\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include \"generic.h\"\n\ntypedef struct {\n\tuint32_t numbits;\n\t/* an array large enough for numbits to fit in. Might \n\t * (if numbits%8!=0) have some spare bits at the end\n\t */\n\tuint32_t* bits;\n} bitmap_t;\n\n\n// creates a new bitmap.\n// CONTENT IS RANDOM!  - use bitmap_clearall() to clear the bitmap.\nbitmap_t bitmap_init(uint32_t numbits);\n\n// returns 1 or 0\nuint8_t bitmap_get(bitmap_t bitmap, uint32_t bitnum);\n// sets a bit (to 1)\nvoid bitmap_set(bitmap_t bitmap, uint32_t bitnum);\n// clears a bit (to 0)\nvoid bitmap_clear(bitmap_t bitmap, uint32_t bitnum);\n\n// clears every bit to 0\nvoid bitmap_clearAll(bitmap_t bitmap);\n\n// finds the first bit set to 0    returns 0 if no cleared bit found (0 is also returned if the first bit is cleared)\nuint32_t bitmap_findFirstClear(bitmap_t bitmap);\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/blob.c",
    "content": "#include \"cache.h\"\n#include \"blob.h\"\n\nconst char *blob_type = \"blob\";\n\nstruct blob *lookup_blob(const unsigned char *sha1)\n{\n\tstruct object *obj = lookup_object(sha1);\n\tif (!obj)\n\t\treturn create_object(sha1, OBJ_BLOB, alloc_blob_node());\n\tif (!obj->type)\n\t\tobj->type = OBJ_BLOB;\n\tif (obj->type != OBJ_BLOB) {\n\t\terror(\"Object %s is a %s, not a blob\",\n\t\t      sha1_to_hex(sha1), typename(obj->type));\n\t\treturn NULL;\n\t}\n\treturn (struct blob *) obj;\n}\n\nint parse_blob_buffer(struct blob *item, void *buffer, unsigned long size)\n{\n\titem->object.parsed = 1;\n\treturn 0;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/blob.h",
    "content": "#ifndef BLOB_H\n#define BLOB_H\n\n#include \"object.h\"\n\nextern const char *blob_type;\n\nstruct blob {\n\tstruct object object;\n};\n\nstruct blob *lookup_blob(const unsigned char *sha1);\n\nint parse_blob_buffer(struct blob *item, void *buffer, unsigned long size);\n\n/**\n * Blobs do not contain references to other objects and do not have\n * structured data that needs parsing. However, code may use the\n * \"parsed\" bit in the struct object for a blob to determine whether\n * its content has been found to actually be available, so\n * parse_blob_buffer() is used (by object.c) to flag that the object\n * has been read successfully from the database.\n **/\n\n#endif /* BLOB_H */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/bootstrap.h",
    "content": "#ifndef BOOTSTRAP_H\n#define BOOTSTRAP_H\n\n#include <stdio.h>\n#include \"cxrs.h\"\n\n/* If we're not using GNU C, elide __attribute__ */\n#ifndef __GNUC__\n#  define  __attribute__(x)  /*NOTHING*/\n#endif\n\ntypedef struct object object;\n\nobject *true;\nobject *false;\nobject *eof;\nobject *empty_list;\nobject *global_enviroment;\n\nenum obj_type {\n        scm_bool,\n        scm_empty_list,\n        scm_eof,\n        scm_char,\n        scm_int,\n        scm_pair,\n        scm_symbol,\n        scm_prim_fun,\n        scm_lambda,\n        scm_str,\n        scm_file\n};\n\ntypedef object *(*prim_proc)(object *args);\n\nobject *read(FILE *in);\nobject *eval(object *code, object *env);\nvoid print(FILE *out, object *obj, int display);\n\nint check_type(enum obj_type type, object *obj, int err_on_false);\n\nstatic inline int is_true(object *obj)\n{\n        return obj != false;\n}\n\nobject *make_int(int value);\nint obj2int(object *i);\n\nobject *make_bool(int value);\nint obj2bool(object *b);\n\nobject *make_char(char c);\nchar obj2char(object *ch);\n\nobject *make_str(char *str);\nchar *obj2str(object *str);\n\nobject *cons(object *car, object *cdr);\nobject *car(object *pair);\nobject *cdr(object *pair);\nvoid set_car(object *pair, object *new);\nvoid set_cdr(object *pair, object *new);\n\nobject *make_symbol(char *name);\nchar *sym2str(object *sym);\nobject *get_symbol(char *name) __attribute__((pure));\n\nobject *make_prim_fun(prim_proc fun);\nprim_proc obj2prim_proc(object *proc);\n\nobject *make_lambda(object *args, object *code, object *env);\nobject *lambda_code(object *lambda);\nobject *lambda_args(object *lambda);\n\nobject *make_port(FILE *handle, int direction);\nint port_direction(object *port);\nFILE *port_handle(object *port);\nvoid set_port_handle_to_null(object *port);\n\n/*both of these should never be called*/\nobject *apply_proc(object *);\nobject *eval_proc(object *);\n\n\nobject *maybe_add_begin(object *code);\n\nvoid init_enviroment(object *env);\n\n\nvoid eval_err(char *msg, object *code) __attribute__((noreturn));\n\nvoid define_var(object *var, object *val, object *env);\nvoid set_var(object *var, object *val, object *env);\nobject *get_var(object *var, object *env);\n\nobject *cond2nested_if(object *cond);\nobject *let2lambda(object *let);\nobject *and2nested_if(object *and);\nobject *or2nested_if(object *or);\n\n#endif /*include guard*/\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/color.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n\ntypedef struct {\n\tuint32_t background;\n\tuint32_t foreground;\n} console_color_t;\n\n#define CONSOLE_COLOR_BLACK    0x0\n#define CONSOLE_COLOR_BLUE     0x1\n#define CONSOLE_COLOR_GREEN    0x2\n#define CONSOLE_COLOR_CYAN     0x3\n#define CONSOLE_COLOR_RED      0x4\n#define CONSOLE_COLOR_MAGENTA  0x5\n#define CONSOLE_COLOR_BROWN    0x6\n#define CONSOLE_COLOR_LGREY    0x7\n#define CONSOLE_COLOR_DGREY    0x8\n#define CONSOLE_COLOR_LBLUE    0x9\n#define CONSOLE_COLOR_LGREEN   0xa\n#define CONSOLE_COLOR_LCYAN    0xb\n#define CONSOLE_COLOR_LRED     0xc\n#define CONSOLE_COLOR_LMAGENTA 0xd\n#define CONSOLE_COLOR_YELLOW   0xe\n#define CONSOLE_COLOR_WHITE    0xf\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/commit.c",
    "content": "#include \"cache.h\"\n#include \"tag.h\"\n#include \"commit.h\"\n#include \"pkt-line.h\"\n#include \"utf8.h\"\n#include \"diff.h\"\n#include \"revision.h\"\n#include \"notes.h\"\n#include \"gpg-interface.h\"\n#include \"mergesort.h\"\n\nint save_commit_buffer = 1;\n\nconst char *commit_type = \"commit\";\n\nstatic struct commit *check_commit(struct object *obj,\n\t\t\t\t   const unsigned char *sha1,\n\t\t\t\t   int quiet)\n{\n\tif (obj->type != OBJ_COMMIT) {\n\t\tif (!quiet)\n\t\t\terror(\"Object %s is a %s, not a commit\",\n\t\t\t      sha1_to_hex(sha1), typename(obj->type));\n\t\treturn NULL;\n\t}\n\treturn (struct commit *) obj;\n}\n\nstruct commit *lookup_commit_reference_gently(const unsigned char *sha1,\n\t\t\t\t\t      int quiet)\n{\n\tstruct object *obj = deref_tag(parse_object(sha1), NULL, 0);\n\n\tif (!obj)\n\t\treturn NULL;\n\treturn check_commit(obj, sha1, quiet);\n}\n\nstruct commit *lookup_commit_reference(const unsigned char *sha1)\n{\n\treturn lookup_commit_reference_gently(sha1, 0);\n}\n\nstruct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_name)\n{\n\tstruct commit *c = lookup_commit_reference(sha1);\n\tif (!c)\n\t\tdie(_(\"could not parse %s\"), ref_name);\n\tif (hashcmp(sha1, c->object.sha1)) {\n\t\twarning(_(\"%s %s is not a commit!\"),\n\t\t\tref_name, sha1_to_hex(sha1));\n\t}\n\treturn c;\n}\n\nstruct commit *lookup_commit(const unsigned char *sha1)\n{\n\tstruct object *obj = lookup_object(sha1);\n\tif (!obj)\n\t\treturn create_object(sha1, OBJ_COMMIT, alloc_commit_node());\n\tif (!obj->type)\n\t\tobj->type = OBJ_COMMIT;\n\treturn check_commit(obj, sha1, 0);\n}\n\nstruct commit *lookup_commit_reference_by_name(const char *name)\n{\n\tunsigned char sha1[20];\n\tstruct commit *commit;\n\n\tif (get_sha1(name, sha1))\n\t\treturn NULL;\n\tcommit = lookup_commit_reference(sha1);\n\tif (!commit || parse_commit(commit))\n\t\treturn NULL;\n\treturn commit;\n}\n\nstatic unsigned long parse_commit_date(const char *buf, const char *tail)\n{\n\tconst char *dateptr;\n\n\tif (buf + 6 >= tail)\n\t\treturn 0;\n\tif (memcmp(buf, \"author\", 6))\n\t\treturn 0;\n\twhile (buf < tail && *buf++ != '\\n')\n\t\t/* nada */;\n\tif (buf + 9 >= tail)\n\t\treturn 0;\n\tif (memcmp(buf, \"committer\", 9))\n\t\treturn 0;\n\twhile (buf < tail && *buf++ != '>')\n\t\t/* nada */;\n\tif (buf >= tail)\n\t\treturn 0;\n\tdateptr = buf;\n\twhile (buf < tail && *buf++ != '\\n')\n\t\t/* nada */;\n\tif (buf >= tail)\n\t\treturn 0;\n\t/* dateptr < buf && buf[-1] == '\\n', so strtoul will stop at buf-1 */\n\treturn strtoul(dateptr, NULL, 10);\n}\n\nstatic struct commit_graft **commit_graft;\nstatic int commit_graft_alloc, commit_graft_nr;\n\nstatic int commit_graft_pos(const unsigned char *sha1)\n{\n\tint lo, hi;\n\tlo = 0;\n\thi = commit_graft_nr;\n\twhile (lo < hi) {\n\t\tint mi = (lo + hi) / 2;\n\t\tstruct commit_graft *graft = commit_graft[mi];\n\t\tint cmp = hashcmp(sha1, graft->sha1);\n\t\tif (!cmp)\n\t\t\treturn mi;\n\t\tif (cmp < 0)\n\t\t\thi = mi;\n\t\telse\n\t\t\tlo = mi + 1;\n\t}\n\treturn -lo - 1;\n}\n\nint register_commit_graft(struct commit_graft *graft, int ignore_dups)\n{\n\tint pos = commit_graft_pos(graft->sha1);\n\n\tif (0 <= pos) {\n\t\tif (ignore_dups)\n\t\t\tfree(graft);\n\t\telse {\n\t\t\tfree(commit_graft[pos]);\n\t\t\tcommit_graft[pos] = graft;\n\t\t}\n\t\treturn 1;\n\t}\n\tpos = -pos - 1;\n\tif (commit_graft_alloc <= ++commit_graft_nr) {\n\t\tcommit_graft_alloc = alloc_nr(commit_graft_alloc);\n\t\tcommit_graft = xrealloc(commit_graft,\n\t\t\t\t\tsizeof(*commit_graft) *\n\t\t\t\t\tcommit_graft_alloc);\n\t}\n\tif (pos < commit_graft_nr)\n\t\tmemmove(commit_graft + pos + 1,\n\t\t\tcommit_graft + pos,\n\t\t\t(commit_graft_nr - pos - 1) *\n\t\t\tsizeof(*commit_graft));\n\tcommit_graft[pos] = graft;\n\treturn 0;\n}\n\nstruct commit_graft *read_graft_line(char *buf, int len)\n{\n\t/* The format is just \"Commit Parent1 Parent2 ...\\n\" */\n\tint i;\n\tstruct commit_graft *graft = NULL;\n\n\twhile (len && isspace(buf[len-1]))\n\t\tbuf[--len] = '\\0';\n\tif (buf[0] == '#' || buf[0] == '\\0')\n\t\treturn NULL;\n\tif ((len + 1) % 41)\n\t\tgoto bad_graft_data;\n\ti = (len + 1) / 41 - 1;\n\tgraft = xmalloc(sizeof(*graft) + 20 * i);\n\tgraft->nr_parent = i;\n\tif (get_sha1_hex(buf, graft->sha1))\n\t\tgoto bad_graft_data;\n\tfor (i = 40; i < len; i += 41) {\n\t\tif (buf[i] != ' ')\n\t\t\tgoto bad_graft_data;\n\t\tif (get_sha1_hex(buf + i + 1, graft->parent[i/41]))\n\t\t\tgoto bad_graft_data;\n\t}\n\treturn graft;\n\nbad_graft_data:\n\terror(\"bad graft data: %s\", buf);\n\tfree(graft);\n\treturn NULL;\n}\n\nstatic int read_graft_file(const char *graft_file)\n{\n\tFILE *fp = fopen(graft_file, \"r\");\n\tchar buf[1024];\n\tif (!fp)\n\t\treturn -1;\n\twhile (fgets(buf, sizeof(buf), fp)) {\n\t\t/* The format is just \"Commit Parent1 Parent2 ...\\n\" */\n\t\tint len = strlen(buf);\n\t\tstruct commit_graft *graft = read_graft_line(buf, len);\n\t\tif (!graft)\n\t\t\tcontinue;\n\t\tif (register_commit_graft(graft, 1))\n\t\t\terror(\"duplicate graft data: %s\", buf);\n\t}\n\tfclose(fp);\n\treturn 0;\n}\n\nstatic void prepare_commit_graft(void)\n{\n\tstatic int commit_graft_prepared;\n\tchar *graft_file;\n\n\tif (commit_graft_prepared)\n\t\treturn;\n\tgraft_file = get_graft_file();\n\tread_graft_file(graft_file);\n\t/* make sure shallows are read */\n\tis_repository_shallow();\n\tcommit_graft_prepared = 1;\n}\n\nstruct commit_graft *lookup_commit_graft(const unsigned char *sha1)\n{\n\tint pos;\n\tprepare_commit_graft();\n\tpos = commit_graft_pos(sha1);\n\tif (pos < 0)\n\t\treturn NULL;\n\treturn commit_graft[pos];\n}\n\nint for_each_commit_graft(each_commit_graft_fn fn, void *cb_data)\n{\n\tint i, ret;\n\tfor (i = ret = 0; i < commit_graft_nr && !ret; i++)\n\t\tret = fn(commit_graft[i], cb_data);\n\treturn ret;\n}\n\nint unregister_shallow(const unsigned char *sha1)\n{\n\tint pos = commit_graft_pos(sha1);\n\tif (pos < 0)\n\t\treturn -1;\n\tif (pos + 1 < commit_graft_nr)\n\t\tmemmove(commit_graft + pos, commit_graft + pos + 1,\n\t\t\t\tsizeof(struct commit_graft *)\n\t\t\t\t* (commit_graft_nr - pos - 1));\n\tcommit_graft_nr--;\n\treturn 0;\n}\n\nint parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size)\n{\n\tconst char *tail = buffer;\n\tconst char *bufptr = buffer;\n\tunsigned char parent[20];\n\tstruct commit_list **pptr;\n\tstruct commit_graft *graft;\n\n\tif (item->object.parsed)\n\t\treturn 0;\n\titem->object.parsed = 1;\n\ttail += size;\n\tif (tail <= bufptr + 46 || memcmp(bufptr, \"tree \", 5) || bufptr[45] != '\\n')\n\t\treturn error(\"bogus commit object %s\", sha1_to_hex(item->object.sha1));\n\tif (get_sha1_hex(bufptr + 5, parent) < 0)\n\t\treturn error(\"bad tree pointer in commit %s\",\n\t\t\t     sha1_to_hex(item->object.sha1));\n\titem->tree = lookup_tree(parent);\n\tbufptr += 46; /* \"tree \" + \"hex sha1\" + \"\\n\" */\n\tpptr = &item->parents;\n\n\tgraft = lookup_commit_graft(item->object.sha1);\n\twhile (bufptr + 48 < tail && !memcmp(bufptr, \"parent \", 7)) {\n\t\tstruct commit *new_parent;\n\n\t\tif (tail <= bufptr + 48 ||\n\t\t    get_sha1_hex(bufptr + 7, parent) ||\n\t\t    bufptr[47] != '\\n')\n\t\t\treturn error(\"bad parents in commit %s\", sha1_to_hex(item->object.sha1));\n\t\tbufptr += 48;\n\t\t/*\n\t\t * The clone is shallow if nr_parent < 0, and we must\n\t\t * not traverse its real parents even when we unhide them.\n\t\t */\n\t\tif (graft && (graft->nr_parent < 0 || grafts_replace_parents))\n\t\t\tcontinue;\n\t\tnew_parent = lookup_commit(parent);\n\t\tif (new_parent)\n\t\t\tpptr = &commit_list_insert(new_parent, pptr)->next;\n\t}\n\tif (graft) {\n\t\tint i;\n\t\tstruct commit *new_parent;\n\t\tfor (i = 0; i < graft->nr_parent; i++) {\n\t\t\tnew_parent = lookup_commit(graft->parent[i]);\n\t\t\tif (!new_parent)\n\t\t\t\tcontinue;\n\t\t\tpptr = &commit_list_insert(new_parent, pptr)->next;\n\t\t}\n\t}\n\titem->date = parse_commit_date(bufptr, tail);\n\n\treturn 0;\n}\n\nint parse_commit(struct commit *item)\n{\n\tenum object_type type;\n\tvoid *buffer;\n\tunsigned long size;\n\tint ret;\n\n\tif (!item)\n\t\treturn -1;\n\tif (item->object.parsed)\n\t\treturn 0;\n\tbuffer = read_sha1_file(item->object.sha1, &type, &size);\n\tif (!buffer)\n\t\treturn error(\"Could not read %s\",\n\t\t\t     sha1_to_hex(item->object.sha1));\n\tif (type != OBJ_COMMIT) {\n\t\tfree(buffer);\n\t\treturn error(\"Object %s not a commit\",\n\t\t\t     sha1_to_hex(item->object.sha1));\n\t}\n\tret = parse_commit_buffer(item, buffer, size);\n\tif (save_commit_buffer && !ret) {\n\t\titem->buffer = buffer;\n\t\treturn 0;\n\t}\n\tfree(buffer);\n\treturn ret;\n}\n\nint find_commit_subject(const char *commit_buffer, const char **subject)\n{\n\tconst char *eol;\n\tconst char *p = commit_buffer;\n\n\twhile (*p && (*p != '\\n' || p[1] != '\\n'))\n\t\tp++;\n\tif (*p) {\n\t\tp += 2;\n\t\tfor (eol = p; *eol && *eol != '\\n'; eol++)\n\t\t\t; /* do nothing */\n\t} else\n\t\teol = p;\n\n\t*subject = p;\n\n\treturn eol - p;\n}\n\nstruct commit_list *commit_list_insert(struct commit *item, struct commit_list **list_p)\n{\n\tstruct commit_list *new_list = xmalloc(sizeof(struct commit_list));\n\tnew_list->item = item;\n\tnew_list->next = *list_p;\n\t*list_p = new_list;\n\treturn new_list;\n}\n\nunsigned commit_list_count(const struct commit_list *l)\n{\n\tunsigned c = 0;\n\tfor (; l; l = l->next )\n\t\tc++;\n\treturn c;\n}\n\nvoid free_commit_list(struct commit_list *list)\n{\n\twhile (list) {\n\t\tstruct commit_list *temp = list;\n\t\tlist = temp->next;\n\t\tfree(temp);\n\t}\n}\n\nstruct commit_list * commit_list_insert_by_date(struct commit *item, struct commit_list **list)\n{\n\tstruct commit_list **pp = list;\n\tstruct commit_list *p;\n\twhile ((p = *pp) != NULL) {\n\t\tif (p->item->date < item->date) {\n\t\t\tbreak;\n\t\t}\n\t\tpp = &p->next;\n\t}\n\treturn commit_list_insert(item, pp);\n}\n\nstatic int commit_list_compare_by_date(const void *a, const void *b)\n{\n\tunsigned long a_date = ((const struct commit_list *)a)->item->date;\n\tunsigned long b_date = ((const struct commit_list *)b)->item->date;\n\tif (a_date < b_date)\n\t\treturn 1;\n\tif (a_date > b_date)\n\t\treturn -1;\n\treturn 0;\n}\n\nstatic void *commit_list_get_next(const void *a)\n{\n\treturn ((const struct commit_list *)a)->next;\n}\n\nstatic void commit_list_set_next(void *a, void *next)\n{\n\t((struct commit_list *)a)->next = next;\n}\n\nvoid commit_list_sort_by_date(struct commit_list **list)\n{\n\t*list = llist_mergesort(*list, commit_list_get_next, commit_list_set_next,\n\t\t\t\tcommit_list_compare_by_date);\n}\n\nstruct commit *pop_most_recent_commit(struct commit_list **list,\n\t\t\t\t      unsigned int mark)\n{\n\tstruct commit *ret = (*list)->item;\n\tstruct commit_list *parents = ret->parents;\n\tstruct commit_list *old = *list;\n\n\t*list = (*list)->next;\n\tfree(old);\n\n\twhile (parents) {\n\t\tstruct commit *commit = parents->item;\n\t\tif (!parse_commit(commit) && !(commit->object.flags & mark)) {\n\t\t\tcommit->object.flags |= mark;\n\t\t\tcommit_list_insert_by_date(commit, list);\n\t\t}\n\t\tparents = parents->next;\n\t}\n\treturn ret;\n}\n\nstatic void clear_commit_marks_1(struct commit_list **plist,\n\t\t\t\t struct commit *commit, unsigned int mark)\n{\n\twhile (commit) {\n\t\tstruct commit_list *parents;\n\n\t\tif (!(mark & commit->object.flags))\n\t\t\treturn;\n\n\t\tcommit->object.flags &= ~mark;\n\n\t\tparents = commit->parents;\n\t\tif (!parents)\n\t\t\treturn;\n\n\t\twhile ((parents = parents->next))\n\t\t\tcommit_list_insert(parents->item, plist);\n\n\t\tcommit = commit->parents->item;\n\t}\n}\n\nvoid clear_commit_marks(struct commit *commit, unsigned int mark)\n{\n\tstruct commit_list *list = NULL;\n\tcommit_list_insert(commit, &list);\n\twhile (list)\n\t\tclear_commit_marks_1(&list, pop_commit(&list), mark);\n}\n\nvoid clear_commit_marks_for_object_array(struct object_array *a, unsigned mark)\n{\n\tstruct object *object;\n\tstruct commit *commit;\n\tunsigned int i;\n\n\tfor (i = 0; i < a->nr; i++) {\n\t\tobject = a->objects[i].item;\n\t\tcommit = lookup_commit_reference_gently(object->sha1, 1);\n\t\tif (commit)\n\t\t\tclear_commit_marks(commit, mark);\n\t}\n}\n\nstruct commit *pop_commit(struct commit_list **stack)\n{\n\tstruct commit_list *top = *stack;\n\tstruct commit *item = top ? top->item : NULL;\n\n\tif (top) {\n\t\t*stack = top->next;\n\t\tfree(top);\n\t}\n\treturn item;\n}\n\n/*\n * Performs an in-place topological sort on the list supplied.\n */\nvoid sort_in_topological_order(struct commit_list ** list, int lifo)\n{\n\tstruct commit_list *next, *orig = *list;\n\tstruct commit_list *work, **insert;\n\tstruct commit_list **pptr;\n\n\tif (!orig)\n\t\treturn;\n\t*list = NULL;\n\n\t/* Mark them and clear the indegree */\n\tfor (next = orig; next; next = next->next) {\n\t\tstruct commit *commit = next->item;\n\t\tcommit->indegree = 1;\n\t}\n\n\t/* update the indegree */\n\tfor (next = orig; next; next = next->next) {\n\t\tstruct commit_list * parents = next->item->parents;\n\t\twhile (parents) {\n\t\t\tstruct commit *parent = parents->item;\n\n\t\t\tif (parent->indegree)\n\t\t\t\tparent->indegree++;\n\t\t\tparents = parents->next;\n\t\t}\n\t}\n\n\t/*\n\t * find the tips\n\t *\n\t * tips are nodes not reachable from any other node in the list\n\t *\n\t * the tips serve as a starting set for the work queue.\n\t */\n\twork = NULL;\n\tinsert = &work;\n\tfor (next = orig; next; next = next->next) {\n\t\tstruct commit *commit = next->item;\n\n\t\tif (commit->indegree == 1)\n\t\t\tinsert = &commit_list_insert(commit, insert)->next;\n\t}\n\n\t/* process the list in topological order */\n\tif (!lifo)\n\t\tcommit_list_sort_by_date(&work);\n\n\tpptr = list;\n\t*list = NULL;\n\twhile (work) {\n\t\tstruct commit *commit;\n\t\tstruct commit_list *parents, *work_item;\n\n\t\twork_item = work;\n\t\twork = work_item->next;\n\t\twork_item->next = NULL;\n\n\t\tcommit = work_item->item;\n\t\tfor (parents = commit->parents; parents ; parents = parents->next) {\n\t\t\tstruct commit *parent = parents->item;\n\n\t\t\tif (!parent->indegree)\n\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t * parents are only enqueued for emission\n\t\t\t * when all their children have been emitted thereby\n\t\t\t * guaranteeing topological order.\n\t\t\t */\n\t\t\tif (--parent->indegree == 1) {\n\t\t\t\tif (!lifo)\n\t\t\t\t\tcommit_list_insert_by_date(parent, &work);\n\t\t\t\telse\n\t\t\t\t\tcommit_list_insert(parent, &work);\n\t\t\t}\n\t\t}\n\t\t/*\n\t\t * work_item is a commit all of whose children\n\t\t * have already been emitted. we can emit it now.\n\t\t */\n\t\tcommit->indegree = 0;\n\t\t*pptr = work_item;\n\t\tpptr = &work_item->next;\n\t}\n}\n\n/* merge-base stuff */\n\n/* bits #0..15 in revision.h */\n#define PARENT1\t\t(1u<<16)\n#define PARENT2\t\t(1u<<17)\n#define STALE\t\t(1u<<18)\n#define RESULT\t\t(1u<<19)\n\nstatic const unsigned all_flags = (PARENT1 | PARENT2 | STALE | RESULT);\n\nstatic struct commit *interesting(struct commit_list *list)\n{\n\twhile (list) {\n\t\tstruct commit *commit = list->item;\n\t\tlist = list->next;\n\t\tif (commit->object.flags & STALE)\n\t\t\tcontinue;\n\t\treturn commit;\n\t}\n\treturn NULL;\n}\n\nstatic struct commit_list *merge_bases_many(struct commit *one, int n, struct commit **twos)\n{\n\tstruct commit_list *list = NULL;\n\tstruct commit_list *result = NULL;\n\tint i;\n\n\tfor (i = 0; i < n; i++) {\n\t\tif (one == twos[i])\n\t\t\t/*\n\t\t\t * We do not mark this even with RESULT so we do not\n\t\t\t * have to clean it up.\n\t\t\t */\n\t\t\treturn commit_list_insert(one, &result);\n\t}\n\n\tif (parse_commit(one))\n\t\treturn NULL;\n\tfor (i = 0; i < n; i++) {\n\t\tif (parse_commit(twos[i]))\n\t\t\treturn NULL;\n\t}\n\n\tone->object.flags |= PARENT1;\n\tcommit_list_insert_by_date(one, &list);\n\tfor (i = 0; i < n; i++) {\n\t\ttwos[i]->object.flags |= PARENT2;\n\t\tcommit_list_insert_by_date(twos[i], &list);\n\t}\n\n\twhile (interesting(list)) {\n\t\tstruct commit *commit;\n\t\tstruct commit_list *parents;\n\t\tstruct commit_list *next;\n\t\tint flags;\n\n\t\tcommit = list->item;\n\t\tnext = list->next;\n\t\tfree(list);\n\t\tlist = next;\n\n\t\tflags = commit->object.flags & (PARENT1 | PARENT2 | STALE);\n\t\tif (flags == (PARENT1 | PARENT2)) {\n\t\t\tif (!(commit->object.flags & RESULT)) {\n\t\t\t\tcommit->object.flags |= RESULT;\n\t\t\t\tcommit_list_insert_by_date(commit, &result);\n\t\t\t}\n\t\t\t/* Mark parents of a found merge stale */\n\t\t\tflags |= STALE;\n\t\t}\n\t\tparents = commit->parents;\n\t\twhile (parents) {\n\t\t\tstruct commit *p = parents->item;\n\t\t\tparents = parents->next;\n\t\t\tif ((p->object.flags & flags) == flags)\n\t\t\t\tcontinue;\n\t\t\tif (parse_commit(p))\n\t\t\t\treturn NULL;\n\t\t\tp->object.flags |= flags;\n\t\t\tcommit_list_insert_by_date(p, &list);\n\t\t}\n\t}\n\n\t/* Clean up the result to remove stale ones */\n\tfree_commit_list(list);\n\tlist = result; result = NULL;\n\twhile (list) {\n\t\tstruct commit_list *next = list->next;\n\t\tif (!(list->item->object.flags & STALE))\n\t\t\tcommit_list_insert_by_date(list->item, &result);\n\t\tfree(list);\n\t\tlist = next;\n\t}\n\treturn result;\n}\n\nstruct commit_list *get_octopus_merge_bases(struct commit_list *in)\n{\n\tstruct commit_list *i, *j, *k, *ret = NULL;\n\tstruct commit_list **pptr = &ret;\n\n\tfor (i = in; i; i = i->next) {\n\t\tif (!ret)\n\t\t\tpptr = &commit_list_insert(i->item, pptr)->next;\n\t\telse {\n\t\t\tstruct commit_list *new = NULL, *end = NULL;\n\n\t\t\tfor (j = ret; j; j = j->next) {\n\t\t\t\tstruct commit_list *bases;\n\t\t\t\tbases = get_merge_bases(i->item, j->item, 1);\n\t\t\t\tif (!new)\n\t\t\t\t\tnew = bases;\n\t\t\t\telse\n\t\t\t\t\tend->next = bases;\n\t\t\t\tfor (k = bases; k; k = k->next)\n\t\t\t\t\tend = k;\n\t\t\t}\n\t\t\tret = new;\n\t\t}\n\t}\n\treturn ret;\n}\n\nstruct commit_list *get_merge_bases_many(struct commit *one,\n\t\t\t\t\t int n,\n\t\t\t\t\t struct commit **twos,\n\t\t\t\t\t int cleanup)\n{\n\tstruct commit_list *list;\n\tstruct commit **rslt;\n\tstruct commit_list *result;\n\tint cnt, i, j;\n\n\tresult = merge_bases_many(one, n, twos);\n\tfor (i = 0; i < n; i++) {\n\t\tif (one == twos[i])\n\t\t\treturn result;\n\t}\n\tif (!result || !result->next) {\n\t\tif (cleanup) {\n\t\t\tclear_commit_marks(one, all_flags);\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tclear_commit_marks(twos[i], all_flags);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/* There are more than one */\n\tcnt = 0;\n\tlist = result;\n\twhile (list) {\n\t\tlist = list->next;\n\t\tcnt++;\n\t}\n\trslt = xcalloc(cnt, sizeof(*rslt));\n\tfor (list = result, i = 0; list; list = list->next)\n\t\trslt[i++] = list->item;\n\tfree_commit_list(result);\n\n\tclear_commit_marks(one, all_flags);\n\tfor (i = 0; i < n; i++)\n\t\tclear_commit_marks(twos[i], all_flags);\n\tfor (i = 0; i < cnt - 1; i++) {\n\t\tfor (j = i+1; j < cnt; j++) {\n\t\t\tif (!rslt[i] || !rslt[j])\n\t\t\t\tcontinue;\n\t\t\tresult = merge_bases_many(rslt[i], 1, &rslt[j]);\n\t\t\tclear_commit_marks(rslt[i], all_flags);\n\t\t\tclear_commit_marks(rslt[j], all_flags);\n\t\t\tfor (list = result; list; list = list->next) {\n\t\t\t\tif (rslt[i] == list->item)\n\t\t\t\t\trslt[i] = NULL;\n\t\t\t\tif (rslt[j] == list->item)\n\t\t\t\t\trslt[j] = NULL;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Surviving ones in rslt[] are the independent results */\n\tresult = NULL;\n\tfor (i = 0; i < cnt; i++) {\n\t\tif (rslt[i])\n\t\t\tcommit_list_insert_by_date(rslt[i], &result);\n\t}\n\tfree(rslt);\n\treturn result;\n}\n\nstruct commit_list *get_merge_bases(struct commit *one, struct commit *two,\n\t\t\t\t    int cleanup)\n{\n\treturn get_merge_bases_many(one, 1, &two, cleanup);\n}\n\nint is_descendant_of(struct commit *commit, struct commit_list *with_commit)\n{\n\tif (!with_commit)\n\t\treturn 1;\n\twhile (with_commit) {\n\t\tstruct commit *other;\n\n\t\tother = with_commit->item;\n\t\twith_commit = with_commit->next;\n\t\tif (in_merge_bases(other, &commit, 1))\n\t\t\treturn 1;\n\t}\n\treturn 0;\n}\n\nint in_merge_bases(struct commit *commit, struct commit **reference, int num)\n{\n\tstruct commit_list *bases, *b;\n\tint ret = 0;\n\n\tif (num == 1)\n\t\tbases = get_merge_bases(commit, *reference, 1);\n\telse\n\t\tdie(\"not yet\");\n\tfor (b = bases; b; b = b->next) {\n\t\tif (!hashcmp(commit->object.sha1, b->item->object.sha1)) {\n\t\t\tret = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfree_commit_list(bases);\n\treturn ret;\n}\n\nstruct commit_list *reduce_heads(struct commit_list *heads)\n{\n\tstruct commit_list *p;\n\tstruct commit_list *result = NULL, **tail = &result;\n\tstruct commit **other;\n\tsize_t num_head, num_other;\n\n\tif (!heads)\n\t\treturn NULL;\n\n\t/* Avoid unnecessary reallocations */\n\tfor (p = heads, num_head = 0; p; p = p->next)\n\t\tnum_head++;\n\tother = xcalloc(sizeof(*other), num_head);\n\n\t/* For each commit, see if it can be reached by others */\n\tfor (p = heads; p; p = p->next) {\n\t\tstruct commit_list *q, *base;\n\n\t\t/* Do we already have this in the result? */\n\t\tfor (q = result; q; q = q->next)\n\t\t\tif (p->item == q->item)\n\t\t\t\tbreak;\n\t\tif (q)\n\t\t\tcontinue;\n\n\t\tnum_other = 0;\n\t\tfor (q = heads; q; q = q->next) {\n\t\t\tif (p->item == q->item)\n\t\t\t\tcontinue;\n\t\t\tother[num_other++] = q->item;\n\t\t}\n\t\tif (num_other)\n\t\t\tbase = get_merge_bases_many(p->item, num_other, other, 1);\n\t\telse\n\t\t\tbase = NULL;\n\t\t/*\n\t\t * If p->item does not have anything common with other\n\t\t * commits, there won't be any merge base.  If it is\n\t\t * reachable from some of the others, p->item will be\n\t\t * the merge base.  If its history is connected with\n\t\t * others, but p->item is not reachable by others, we\n\t\t * will get something other than p->item back.\n\t\t */\n\t\tif (!base || (base->item != p->item))\n\t\t\ttail = &(commit_list_insert(p->item, tail)->next);\n\t\tfree_commit_list(base);\n\t}\n\tfree(other);\n\treturn result;\n}\n\nstatic const char gpg_sig_header[] = \"gpgsig\";\nstatic const int gpg_sig_header_len = sizeof(gpg_sig_header) - 1;\n\nstatic int do_sign_commit(struct strbuf *buf, const char *keyid)\n{\n\tstruct strbuf sig = STRBUF_INIT;\n\tint inspos, copypos;\n\n\t/* find the end of the header */\n\tinspos = strstr(buf->buf, \"\\n\\n\") - buf->buf + 1;\n\n\tif (!keyid || !*keyid)\n\t\tkeyid = get_signing_key();\n\tif (sign_buffer(buf, &sig, keyid)) {\n\t\tstrbuf_release(&sig);\n\t\treturn -1;\n\t}\n\n\tfor (copypos = 0; sig.buf[copypos]; ) {\n\t\tconst char *bol = sig.buf + copypos;\n\t\tconst char *eol = strchrnul(bol, '\\n');\n\t\tint len = (eol - bol) + !!*eol;\n\n\t\tif (!copypos) {\n\t\t\tstrbuf_insert(buf, inspos, gpg_sig_header, gpg_sig_header_len);\n\t\t\tinspos += gpg_sig_header_len;\n\t\t}\n\t\tstrbuf_insert(buf, inspos++, \" \", 1);\n\t\tstrbuf_insert(buf, inspos, bol, len);\n\t\tinspos += len;\n\t\tcopypos += len;\n\t}\n\tstrbuf_release(&sig);\n\treturn 0;\n}\n\nint parse_signed_commit(const unsigned char *sha1,\n\t\t\tstruct strbuf *payload, struct strbuf *signature)\n{\n\tunsigned long size;\n\tenum object_type type;\n\tchar *buffer = read_sha1_file(sha1, &type, &size);\n\tint in_signature, saw_signature = -1;\n\tchar *line, *tail;\n\n\tif (!buffer || type != OBJ_COMMIT)\n\t\tgoto cleanup;\n\n\tline = buffer;\n\ttail = buffer + size;\n\tin_signature = 0;\n\tsaw_signature = 0;\n\twhile (line < tail) {\n\t\tconst char *sig = NULL;\n\t\tchar *next = memchr(line, '\\n', tail - line);\n\n\t\tnext = next ? next + 1 : tail;\n\t\tif (in_signature && line[0] == ' ')\n\t\t\tsig = line + 1;\n\t\telse if (!prefixcmp(line, gpg_sig_header) &&\n\t\t\t line[gpg_sig_header_len] == ' ')\n\t\t\tsig = line + gpg_sig_header_len + 1;\n\t\tif (sig) {\n\t\t\tstrbuf_add(signature, sig, next - sig);\n\t\t\tsaw_signature = 1;\n\t\t\tin_signature = 1;\n\t\t} else {\n\t\t\tif (*line == '\\n')\n\t\t\t\t/* dump the whole remainder of the buffer */\n\t\t\t\tnext = tail;\n\t\t\tstrbuf_add(payload, line, next - line);\n\t\t\tin_signature = 0;\n\t\t}\n\t\tline = next;\n\t}\n cleanup:\n\tfree(buffer);\n\treturn saw_signature;\n}\n\nstatic void handle_signed_tag(struct commit *parent, struct commit_extra_header ***tail)\n{\n\tstruct merge_remote_desc *desc;\n\tstruct commit_extra_header *mergetag;\n\tchar *buf;\n\tunsigned long size, len;\n\tenum object_type type;\n\n\tdesc = merge_remote_util(parent);\n\tif (!desc || !desc->obj)\n\t\treturn;\n\tbuf = read_sha1_file(desc->obj->sha1, &type, &size);\n\tif (!buf || type != OBJ_TAG)\n\t\tgoto free_return;\n\tlen = parse_signature(buf, size);\n\tif (size == len)\n\t\tgoto free_return;\n\t/*\n\t * We could verify this signature and either omit the tag when\n\t * it does not validate, but the integrator may not have the\n\t * public key of the signer of the tag he is merging, while a\n\t * later auditor may have it while auditing, so let's not run\n\t * verify-signed-buffer here for now...\n\t *\n\t * if (verify_signed_buffer(buf, len, buf + len, size - len, ...))\n\t *\twarn(\"warning: signed tag unverified.\");\n\t */\n\tmergetag = xcalloc(1, sizeof(*mergetag));\n\tmergetag->key = xstrdup(\"mergetag\");\n\tmergetag->value = buf;\n\tmergetag->len = size;\n\n\t**tail = mergetag;\n\t*tail = &mergetag->next;\n\treturn;\n\nfree_return:\n\tfree(buf);\n}\n\nvoid append_merge_tag_headers(struct commit_list *parents,\n\t\t\t      struct commit_extra_header ***tail)\n{\n\twhile (parents) {\n\t\tstruct commit *parent = parents->item;\n\t\thandle_signed_tag(parent, tail);\n\t\tparents = parents->next;\n\t}\n}\n\nstatic void add_extra_header(struct strbuf *buffer,\n\t\t\t     struct commit_extra_header *extra)\n{\n\tstrbuf_addstr(buffer, extra->key);\n\tif (extra->len)\n\t\tstrbuf_add_lines(buffer, \" \", extra->value, extra->len);\n\telse\n\t\tstrbuf_addch(buffer, '\\n');\n}\n\nstruct commit_extra_header *read_commit_extra_headers(struct commit *commit,\n\t\t\t\t\t\t      const char **exclude)\n{\n\tstruct commit_extra_header *extra = NULL;\n\tunsigned long size;\n\tenum object_type type;\n\tchar *buffer = read_sha1_file(commit->object.sha1, &type, &size);\n\tif (buffer && type == OBJ_COMMIT)\n\t\textra = read_commit_extra_header_lines(buffer, size, exclude);\n\tfree(buffer);\n\treturn extra;\n}\n\nstatic inline int standard_header_field(const char *field, size_t len)\n{\n\treturn ((len == 4 && !memcmp(field, \"tree \", 5)) ||\n\t\t(len == 6 && !memcmp(field, \"parent \", 7)) ||\n\t\t(len == 6 && !memcmp(field, \"author \", 7)) ||\n\t\t(len == 9 && !memcmp(field, \"committer \", 10)) ||\n\t\t(len == 8 && !memcmp(field, \"encoding \", 9)));\n}\n\nstatic int excluded_header_field(const char *field, size_t len, const char **exclude)\n{\n\tif (!exclude)\n\t\treturn 0;\n\n\twhile (*exclude) {\n\t\tsize_t xlen = strlen(*exclude);\n\t\tif (len == xlen &&\n\t\t    !memcmp(field, *exclude, xlen) && field[xlen] == ' ')\n\t\t\treturn 1;\n\t\texclude++;\n\t}\n\treturn 0;\n}\n\nstruct commit_extra_header *read_commit_extra_header_lines(const char *buffer, size_t size,\n\t\t\t\t\t\t\t   const char **exclude)\n{\n\tstruct commit_extra_header *extra = NULL, **tail = &extra, *it = NULL;\n\tconst char *line, *next, *eof, *eob;\n\tstruct strbuf buf = STRBUF_INIT;\n\n\tfor (line = buffer, eob = line + size;\n\t     line < eob && *line != '\\n';\n\t     line = next) {\n\t\tnext = memchr(line, '\\n', eob - line);\n\t\tnext = next ? next + 1 : eob;\n\t\tif (*line == ' ') {\n\t\t\t/* continuation */\n\t\t\tif (it)\n\t\t\t\tstrbuf_add(&buf, line + 1, next - (line + 1));\n\t\t\tcontinue;\n\t\t}\n\t\tif (it)\n\t\t\tit->value = strbuf_detach(&buf, &it->len);\n\t\tstrbuf_reset(&buf);\n\t\tit = NULL;\n\n\t\teof = strchr(line, ' ');\n\t\tif (next <= eof)\n\t\t\teof = next;\n\n\t\tif (standard_header_field(line, eof - line) ||\n\t\t    excluded_header_field(line, eof - line, exclude))\n\t\t\tcontinue;\n\n\t\tit = xcalloc(1, sizeof(*it));\n\t\tit->key = xmemdupz(line, eof-line);\n\t\t*tail = it;\n\t\ttail = &it->next;\n\t\tif (eof + 1 < next)\n\t\t\tstrbuf_add(&buf, eof + 1, next - (eof + 1));\n\t}\n\tif (it)\n\t\tit->value = strbuf_detach(&buf, &it->len);\n\treturn extra;\n}\n\nvoid free_commit_extra_headers(struct commit_extra_header *extra)\n{\n\twhile (extra) {\n\t\tstruct commit_extra_header *next = extra->next;\n\t\tfree(extra->key);\n\t\tfree(extra->value);\n\t\tfree(extra);\n\t\textra = next;\n\t}\n}\n\nint commit_tree(const struct strbuf *msg, unsigned char *tree,\n\t\tstruct commit_list *parents, unsigned char *ret,\n\t\tconst char *author, const char *sign_commit)\n{\n\tstruct commit_extra_header *extra = NULL, **tail = &extra;\n\tint result;\n\n\tappend_merge_tag_headers(parents, &tail);\n\tresult = commit_tree_extended(msg, tree, parents, ret,\n\t\t\t\t      author, sign_commit, extra);\n\tfree_commit_extra_headers(extra);\n\treturn result;\n}\n\nstatic const char commit_utf8_warn[] =\n\"Warning: commit message does not conform to UTF-8.\\n\"\n\"You may want to amend it after fixing the message, or set the config\\n\"\n\"variable i18n.commitencoding to the encoding your project uses.\\n\";\n\nint commit_tree_extended(const struct strbuf *msg, unsigned char *tree,\n\t\t\t struct commit_list *parents, unsigned char *ret,\n\t\t\t const char *author, const char *sign_commit,\n\t\t\t struct commit_extra_header *extra)\n{\n\tint result;\n\tint encoding_is_utf8;\n\tstruct strbuf buffer;\n\n\tassert_sha1_type(tree, OBJ_TREE);\n\n\tif (memchr(msg->buf, '\\0', msg->len))\n\t\treturn error(\"a NUL byte in commit log message not allowed.\");\n\n\t/* Not having i18n.commitencoding is the same as having utf-8 */\n\tencoding_is_utf8 = is_encoding_utf8(git_commit_encoding);\n\n\tstrbuf_init(&buffer, 8192); /* should avoid reallocs for the headers */\n\tstrbuf_addf(&buffer, \"tree %s\\n\", sha1_to_hex(tree));\n\n\t/*\n\t * NOTE! This ordering means that the same exact tree merged with a\n\t * different order of parents will be a _different_ changeset even\n\t * if everything else stays the same.\n\t */\n\twhile (parents) {\n\t\tstruct commit_list *next = parents->next;\n\t\tstruct commit *parent = parents->item;\n\n\t\tstrbuf_addf(&buffer, \"parent %s\\n\",\n\t\t\t    sha1_to_hex(parent->object.sha1));\n\t\tfree(parents);\n\t\tparents = next;\n\t}\n\n\t/* Person/date information */\n\tif (!author)\n\t\tauthor = git_author_info(IDENT_STRICT);\n\tstrbuf_addf(&buffer, \"author %s\\n\", author);\n\tstrbuf_addf(&buffer, \"committer %s\\n\", git_committer_info(IDENT_STRICT));\n\tif (!encoding_is_utf8)\n\t\tstrbuf_addf(&buffer, \"encoding %s\\n\", git_commit_encoding);\n\n\twhile (extra) {\n\t\tadd_extra_header(&buffer, extra);\n\t\textra = extra->next;\n\t}\n\tstrbuf_addch(&buffer, '\\n');\n\n\t/* And add the comment */\n\tstrbuf_addbuf(&buffer, msg);\n\n\t/* And check the encoding */\n\tif (encoding_is_utf8 && !is_utf8(buffer.buf))\n\t\tfprintf(stderr, commit_utf8_warn);\n\n\tif (sign_commit && do_sign_commit(&buffer, sign_commit))\n\t\treturn -1;\n\n\tresult = write_sha1_file(buffer.buf, buffer.len, commit_type, ret);\n\tstrbuf_release(&buffer);\n\treturn result;\n}\n\nstruct commit *get_merge_parent(const char *name)\n{\n\tstruct object *obj;\n\tstruct commit *commit;\n\tunsigned char sha1[20];\n\tif (get_sha1(name, sha1))\n\t\treturn NULL;\n\tobj = parse_object(sha1);\n\tcommit = (struct commit *)peel_to_type(name, 0, obj, OBJ_COMMIT);\n\tif (commit && !commit->util) {\n\t\tstruct merge_remote_desc *desc;\n\t\tdesc = xmalloc(sizeof(*desc));\n\t\tdesc->obj = obj;\n\t\tdesc->name = strdup(name);\n\t\tcommit->util = desc;\n\t}\n\treturn commit;\n}\n\n/*\n * Append a commit to the end of the commit_list.\n *\n * next starts by pointing to the variable that holds the head of an\n * empty commit_list, and is updated to point to the \"next\" field of\n * the last item on the list as new commits are appended.\n *\n * Usage example:\n *\n *     struct commit_list *list;\n *     struct commit_list **next = &list;\n *\n *     next = commit_list_append(c1, next);\n *     next = commit_list_append(c2, next);\n *     assert(commit_list_count(list) == 2);\n *     return list;\n */\nstruct commit_list **commit_list_append(struct commit *commit,\n\t\t\t\t\tstruct commit_list **next)\n{\n\tstruct commit_list *new = xmalloc(sizeof(struct commit_list));\n\tnew->item = commit;\n\t*next = new;\n\tnew->next = NULL;\n\treturn &new->next;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/commit.h",
    "content": "#ifndef COMMIT_H\n#define COMMIT_H\n\n#include \"object.h\"\n#include \"tree.h\"\n#include \"strbuf.h\"\n#include \"decorate.h\"\n\nstruct commit_list {\n\tstruct commit *item;\n\tstruct commit_list *next;\n};\n\nstruct commit {\n\tstruct object object;\n\tvoid *util;\n\tunsigned int indegree;\n\tunsigned long date;\n\tstruct commit_list *parents;\n\tstruct tree *tree;\n\tchar *buffer;\n};\n\nextern int save_commit_buffer;\nextern const char *commit_type;\n\n/* While we can decorate any object with a name, it's only used for commits.. */\nextern struct decoration name_decoration;\nstruct name_decoration {\n\tstruct name_decoration *next;\n\tint type;\n\tchar name[1];\n};\n\nstruct commit *lookup_commit(const unsigned char *sha1);\nstruct commit *lookup_commit_reference(const unsigned char *sha1);\nstruct commit *lookup_commit_reference_gently(const unsigned char *sha1,\n\t\t\t\t\t      int quiet);\nstruct commit *lookup_commit_reference_by_name(const char *name);\n\n/*\n * Look up object named by \"sha1\", dereference tag as necessary,\n * get a commit and return it. If \"sha1\" does not dereference to\n * a commit, use ref_name to report an error and die.\n */\nstruct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_name);\n\nint parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size);\nint parse_commit(struct commit *item);\n\n/* Find beginning and length of commit subject. */\nint find_commit_subject(const char *commit_buffer, const char **subject);\n\nstruct commit_list *commit_list_insert(struct commit *item,\n\t\t\t\t\tstruct commit_list **list);\nstruct commit_list **commit_list_append(struct commit *commit,\n\t\t\t\t\tstruct commit_list **next);\nunsigned commit_list_count(const struct commit_list *l);\nstruct commit_list *commit_list_insert_by_date(struct commit *item,\n\t\t\t\t    struct commit_list **list);\nvoid commit_list_sort_by_date(struct commit_list **list);\n\nvoid free_commit_list(struct commit_list *list);\n\n/* Commit formats */\nenum cmit_fmt {\n\tCMIT_FMT_RAW,\n\tCMIT_FMT_MEDIUM,\n\tCMIT_FMT_DEFAULT = CMIT_FMT_MEDIUM,\n\tCMIT_FMT_SHORT,\n\tCMIT_FMT_FULL,\n\tCMIT_FMT_FULLER,\n\tCMIT_FMT_ONELINE,\n\tCMIT_FMT_EMAIL,\n\tCMIT_FMT_USERFORMAT,\n\n\tCMIT_FMT_UNSPECIFIED\n};\n\nstruct pretty_print_context {\n\tenum cmit_fmt fmt;\n\tint abbrev;\n\tconst char *subject;\n\tconst char *after_subject;\n\tint preserve_subject;\n\tenum date_mode date_mode;\n\tunsigned date_mode_explicit:1;\n\tint need_8bit_cte;\n\tint show_notes;\n\tstruct reflog_walk_info *reflog_info;\n\tconst char *output_encoding;\n};\n\nstruct userformat_want {\n\tunsigned notes:1;\n};\n\nextern int has_non_ascii(const char *text);\nstruct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */\nextern char *logmsg_reencode(const struct commit *commit,\n\t\t\t     const char *output_encoding);\nextern char *reencode_commit_message(const struct commit *commit,\n\t\t\t\t     const char **encoding_p);\nextern void get_commit_format(const char *arg, struct rev_info *);\nextern const char *format_subject(struct strbuf *sb, const char *msg,\n\t\t\t\t  const char *line_separator);\nextern void userformat_find_requirements(const char *fmt, struct userformat_want *w);\nextern void format_commit_message(const struct commit *commit,\n\t\t\t\t  const char *format, struct strbuf *sb,\n\t\t\t\t  const struct pretty_print_context *context);\nextern void pretty_print_commit(const struct pretty_print_context *pp,\n\t\t\t\tconst struct commit *commit,\n\t\t\t\tstruct strbuf *sb);\nextern void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit,\n\t\t\t   struct strbuf *sb);\nvoid pp_user_info(const struct pretty_print_context *pp,\n\t\t  const char *what, struct strbuf *sb,\n\t\t  const char *line, const char *encoding);\nvoid pp_title_line(const struct pretty_print_context *pp,\n\t\t   const char **msg_p,\n\t\t   struct strbuf *sb,\n\t\t   const char *encoding,\n\t\t   int need_8bit_cte);\nvoid pp_remainder(const struct pretty_print_context *pp,\n\t\t  const char **msg_p,\n\t\t  struct strbuf *sb,\n\t\t  int indent);\n\n\n/** Removes the first commit from a list sorted by date, and adds all\n * of its parents.\n **/\nstruct commit *pop_most_recent_commit(struct commit_list **list,\n\t\t\t\t      unsigned int mark);\n\nstruct commit *pop_commit(struct commit_list **stack);\n\nvoid clear_commit_marks(struct commit *commit, unsigned int mark);\nvoid clear_commit_marks_for_object_array(struct object_array *a, unsigned mark);\n\n/*\n * Performs an in-place topological sort of list supplied.\n *\n *   invariant of resulting list is:\n *      a reachable from b => ord(b) < ord(a)\n *   in addition, when lifo == 0, commits on parallel tracks are\n *   sorted in the dates order.\n */\nvoid sort_in_topological_order(struct commit_list ** list, int lifo);\n\nstruct commit_graft {\n\tunsigned char sha1[20];\n\tint nr_parent; /* < 0 if shallow commit */\n\tunsigned char parent[FLEX_ARRAY][20]; /* more */\n};\ntypedef int (*each_commit_graft_fn)(const struct commit_graft *, void *);\n\nstruct commit_graft *read_graft_line(char *buf, int len);\nint register_commit_graft(struct commit_graft *, int);\nstruct commit_graft *lookup_commit_graft(const unsigned char *sha1);\n\nextern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup);\nextern struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos, int cleanup);\nextern struct commit_list *get_octopus_merge_bases(struct commit_list *in);\n\nextern int register_shallow(const unsigned char *sha1);\nextern int unregister_shallow(const unsigned char *sha1);\nextern int for_each_commit_graft(each_commit_graft_fn, void *);\nextern int is_repository_shallow(void);\nextern struct commit_list *get_shallow_commits(struct object_array *heads,\n\t\tint depth, int shallow_flag, int not_shallow_flag);\n\nint is_descendant_of(struct commit *, struct commit_list *);\nint in_merge_bases(struct commit *, struct commit **, int);\n\nextern int interactive_add(int argc, const char **argv, const char *prefix, int patch);\nextern int run_add_interactive(const char *revision, const char *patch_mode,\n\t\t\t       const char **pathspec);\n\nstatic inline int single_parent(struct commit *commit)\n{\n\treturn commit->parents && !commit->parents->next;\n}\n\nstruct commit_list *reduce_heads(struct commit_list *heads);\n\nstruct commit_extra_header {\n\tstruct commit_extra_header *next;\n\tchar *key;\n\tchar *value;\n\tsize_t len;\n};\n\nextern void append_merge_tag_headers(struct commit_list *parents,\n\t\t\t\t     struct commit_extra_header ***tail);\n\nextern int commit_tree(const struct strbuf *msg, unsigned char *tree,\n\t\t       struct commit_list *parents, unsigned char *ret,\n\t\t       const char *author, const char *sign_commit);\n\nextern int commit_tree_extended(const struct strbuf *msg, unsigned char *tree,\n\t\t\t\tstruct commit_list *parents, unsigned char *ret,\n\t\t\t\tconst char *author, const char *sign_commit,\n\t\t\t\tstruct commit_extra_header *);\n\nextern struct commit_extra_header *read_commit_extra_headers(struct commit *, const char **);\nextern struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **);\n\nextern void free_commit_extra_headers(struct commit_extra_header *extra);\n\nstruct merge_remote_desc {\n\tstruct object *obj; /* the named object, could be a tag */\n\tconst char *name;\n};\n#define merge_remote_util(commit) ((struct merge_remote_desc *)((commit)->util))\n\n/*\n * Given \"name\" from the command line to merge, find the commit object\n * and return it, while storing merge_remote_desc in its ->util field,\n * to allow callers to tell if we are told to merge a tag.\n */\nstruct commit *get_merge_parent(const char *name);\n\nextern int parse_signed_commit(const unsigned char *sha1,\n\t\t\t       struct strbuf *message, struct strbuf *signature);\n#endif /* COMMIT_H */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/cpuid.h",
    "content": "#ifndef CPUID_H\n#define CPUID_H\n\n#include \"misc.h\"\n\nstatic inline void do_cpuid(dword_t *eax, dword_t *ebx, dword_t *ecx, dword_t *edx) {\n    dword_t leaf = *eax;\n    switch (leaf) {\n        case 0:\n            *eax = 0x01; // we support barely anything\n            *ebx = 0x756e6547; // Genu\n            *edx = 0x49656e69; // ineI\n            *ecx = 0x6c65746e; // ntel\n            break;\n        default: // if leaf is too high, use highest supported leaf\n        case 1:\n            *eax = 0x0; // say nothing about cpu model number\n            *ebx = 0x0; // processor number 0, flushes 0 bytes on clflush\n            *ecx = 0b00000000000000000000000000000000; // we support none of the features in ecx\n            *edx = 0b00000000000000000000000000000000; // we also support none of the features in edx\n            break;\n    }\n}\n\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/custom_extensions.c",
    "content": "/* Copyright (c) 2014, Google Inc.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION\n * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */\n\n#include <openssl/ssl.h>\n\n#include <assert.h>\n#include <string.h>\n\n#include <openssl/bytestring.h>\n#include <openssl/err.h>\n#include <openssl/mem.h>\n#include <openssl/stack.h>\n\n#include \"internal.h\"\n\n\nvoid SSL_CUSTOM_EXTENSION_free(SSL_CUSTOM_EXTENSION *custom_extension) {\n  OPENSSL_free(custom_extension);\n}\n\nstatic const SSL_CUSTOM_EXTENSION *custom_ext_find(\n    STACK_OF(SSL_CUSTOM_EXTENSION) *stack,\n    unsigned *out_index, uint16_t value) {\n  size_t i;\n  for (i = 0; i < sk_SSL_CUSTOM_EXTENSION_num(stack); i++) {\n    const SSL_CUSTOM_EXTENSION *ext = sk_SSL_CUSTOM_EXTENSION_value(stack, i);\n    if (ext->value == value) {\n      if (out_index != NULL) {\n        *out_index = i;\n      }\n      return ext;\n    }\n  }\n\n  return NULL;\n}\n\n/* default_add_callback is used as the |add_callback| when the user doesn't\n * provide one. For servers, it does nothing while, for clients, it causes an\n * empty extension to be included. */\nstatic int default_add_callback(SSL *ssl, unsigned extension_value,\n                                const uint8_t **out, size_t *out_len,\n                                int *out_alert_value, void *add_arg) {\n  if (ssl->server) {\n    return 0;\n  }\n  *out_len = 0;\n  return 1;\n}\n\nstatic int custom_ext_add_hello(SSL *ssl, CBB *extensions) {\n  STACK_OF(SSL_CUSTOM_EXTENSION) *stack = ssl->ctx->client_custom_extensions;\n  if (ssl->server) {\n    stack = ssl->ctx->server_custom_extensions;\n  }\n\n  if (stack == NULL) {\n    return 1;\n  }\n\n  size_t i;\n  for (i = 0; i < sk_SSL_CUSTOM_EXTENSION_num(stack); i++) {\n    const SSL_CUSTOM_EXTENSION *ext = sk_SSL_CUSTOM_EXTENSION_value(stack, i);\n\n    if (ssl->server &&\n        !(ssl->s3->tmp.custom_extensions.received & (1u << i))) {\n      /* Servers cannot echo extensions that the client didn't send. */\n      continue;\n    }\n\n    const uint8_t *contents;\n    size_t contents_len;\n    int alert = SSL_AD_DECODE_ERROR;\n    CBB contents_cbb;\n\n    switch (ext->add_callback(ssl, ext->value, &contents, &contents_len, &alert,\n                              ext->add_arg)) {\n      case 1:\n        if (!CBB_add_u16(extensions, ext->value) ||\n            !CBB_add_u16_length_prefixed(extensions, &contents_cbb) ||\n            !CBB_add_bytes(&contents_cbb, contents, contents_len) ||\n            !CBB_flush(extensions)) {\n          OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);\n          ERR_add_error_dataf(\"extension: %u\", (unsigned) ext->value);\n          if (ext->free_callback && 0 < contents_len) {\n            ext->free_callback(ssl, ext->value, contents, ext->add_arg);\n          }\n          return 0;\n        }\n\n        if (ext->free_callback && 0 < contents_len) {\n          ext->free_callback(ssl, ext->value, contents, ext->add_arg);\n        }\n\n        if (!ssl->server) {\n          assert((ssl->s3->tmp.custom_extensions.sent & (1u << i)) == 0);\n          ssl->s3->tmp.custom_extensions.sent |= (1u << i);\n        }\n        break;\n\n      case 0:\n        break;\n\n      default:\n        ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);\n        OPENSSL_PUT_ERROR(SSL, SSL_R_CUSTOM_EXTENSION_ERROR);\n        ERR_add_error_dataf(\"extension: %u\", (unsigned) ext->value);\n        return 0;\n    }\n  }\n\n  return 1;\n}\n\nint custom_ext_add_clienthello(SSL *ssl, CBB *extensions) {\n  return custom_ext_add_hello(ssl, extensions);\n}\n\nint custom_ext_parse_serverhello(SSL *ssl, int *out_alert, uint16_t value,\n                                 const CBS *extension) {\n  unsigned index;\n  const SSL_CUSTOM_EXTENSION *ext =\n      custom_ext_find(ssl->ctx->client_custom_extensions, &index, value);\n\n  if (/* Unknown extensions are not allowed in a ServerHello. */\n      ext == NULL ||\n      /* Also, if we didn't send the extension, that's also unacceptable. */\n      !(ssl->s3->tmp.custom_extensions.sent & (1u << index))) {\n    OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);\n    ERR_add_error_dataf(\"extension: %u\", (unsigned)value);\n    *out_alert = SSL_AD_DECODE_ERROR;\n    return 0;\n  }\n\n  if (ext->parse_callback != NULL &&\n      !ext->parse_callback(ssl, value, CBS_data(extension), CBS_len(extension),\n                           out_alert, ext->parse_arg)) {\n    OPENSSL_PUT_ERROR(SSL, SSL_R_CUSTOM_EXTENSION_ERROR);\n    ERR_add_error_dataf(\"extension: %u\", (unsigned)ext->value);\n    return 0;\n  }\n\n  return 1;\n}\n\nint custom_ext_parse_clienthello(SSL *ssl, int *out_alert, uint16_t value,\n                                 const CBS *extension) {\n  unsigned index;\n  const SSL_CUSTOM_EXTENSION *ext =\n      custom_ext_find(ssl->ctx->server_custom_extensions, &index, value);\n\n  if (ext == NULL) {\n    return 1;\n  }\n\n  assert((ssl->s3->tmp.custom_extensions.received & (1u << index)) == 0);\n  ssl->s3->tmp.custom_extensions.received |= (1u << index);\n\n  if (ext->parse_callback &&\n      !ext->parse_callback(ssl, value, CBS_data(extension), CBS_len(extension),\n                           out_alert, ext->parse_arg)) {\n    OPENSSL_PUT_ERROR(SSL, SSL_R_CUSTOM_EXTENSION_ERROR);\n    ERR_add_error_dataf(\"extension: %u\", (unsigned)ext->value);\n    return 0;\n  }\n\n  return 1;\n}\n\nint custom_ext_add_serverhello(SSL *ssl, CBB *extensions) {\n  return custom_ext_add_hello(ssl, extensions);\n}\n\n/* MAX_NUM_CUSTOM_EXTENSIONS is the maximum number of custom extensions that\n * can be set on an |SSL_CTX|. It's determined by the size of the bitset used\n * to track when an extension has been sent. */\n#define MAX_NUM_CUSTOM_EXTENSIONS \\\n  (sizeof(((struct ssl3_state_st *)NULL)->tmp.custom_extensions.sent) * 8)\n\nstatic int custom_ext_append(STACK_OF(SSL_CUSTOM_EXTENSION) **stack,\n                             unsigned extension_value,\n                             SSL_custom_ext_add_cb add_cb,\n                             SSL_custom_ext_free_cb free_cb, void *add_arg,\n                             SSL_custom_ext_parse_cb parse_cb,\n                             void *parse_arg) {\n  if (add_cb == NULL ||\n      0xffff < extension_value ||\n      SSL_extension_supported(extension_value) ||\n      /* Specifying a free callback without an add callback is nonsensical\n       * and an error. */\n      (*stack != NULL &&\n       (MAX_NUM_CUSTOM_EXTENSIONS <= sk_SSL_CUSTOM_EXTENSION_num(*stack) ||\n        custom_ext_find(*stack, NULL, extension_value) != NULL))) {\n    return 0;\n  }\n\n  SSL_CUSTOM_EXTENSION *ext = OPENSSL_malloc(sizeof(SSL_CUSTOM_EXTENSION));\n  if (ext == NULL) {\n    return 0;\n  }\n  ext->add_callback = add_cb;\n  ext->add_arg = add_arg;\n  ext->free_callback = free_cb;\n  ext->parse_callback = parse_cb;\n  ext->parse_arg = parse_arg;\n  ext->value = extension_value;\n\n  if (*stack == NULL) {\n    *stack = sk_SSL_CUSTOM_EXTENSION_new_null();\n    if (*stack == NULL) {\n      SSL_CUSTOM_EXTENSION_free(ext);\n      return 0;\n    }\n  }\n\n  if (!sk_SSL_CUSTOM_EXTENSION_push(*stack, ext)) {\n    SSL_CUSTOM_EXTENSION_free(ext);\n    if (sk_SSL_CUSTOM_EXTENSION_num(*stack) == 0) {\n      sk_SSL_CUSTOM_EXTENSION_free(*stack);\n      *stack = NULL;\n    }\n    return 0;\n  }\n\n  return 1;\n}\n\nint SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, unsigned extension_value,\n                                  SSL_custom_ext_add_cb add_cb,\n                                  SSL_custom_ext_free_cb free_cb, void *add_arg,\n                                  SSL_custom_ext_parse_cb parse_cb,\n                                  void *parse_arg) {\n  return custom_ext_append(&ctx->client_custom_extensions, extension_value,\n                           add_cb ? add_cb : default_add_callback, free_cb,\n                           add_arg, parse_cb, parse_arg);\n}\n\nint SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, unsigned extension_value,\n                                  SSL_custom_ext_add_cb add_cb,\n                                  SSL_custom_ext_free_cb free_cb, void *add_arg,\n                                  SSL_custom_ext_parse_cb parse_cb,\n                                  void *parse_arg) {\n  return custom_ext_append(&ctx->server_custom_extensions, extension_value,\n                           add_cb ? add_cb : default_add_callback, free_cb,\n                           add_arg, parse_cb, parse_arg);\n}"
  },
  {
    "path": "src/test/resources/samples/langs/C/driver.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <console/info.h>\n\n#define CONSOLE_DRV_CAP_CLEAR 0x01\n#define CONSOLE_DRV_CAP_SCROLL  0x02\n#define CONSOLE_DRV_CAP_SET_CURSOR 0x04\n\n// Input modifier keys\ntypedef struct {\n\tbool shift_left:1;\n\tbool shift_right:1;\n\tbool control_left:1;\n\tbool control_right:1;\n\tbool alt:1;\n\tbool super:1;\n} console_modifiers_t;\n\ntypedef struct {\n\tchar character;\n\tconsole_modifiers_t* modifiers;\n} console_read_t;\n\ntypedef struct {\n\tint (*write)(console_info_t*, char);\n\tconsole_read_t* (*read)(console_info_t*);\n\n\tint capabilities;\n\n\tint (*_clear)(console_info_t*);\n\tint (*scroll)(console_info_t*, int32_t);\n\tvoid (*setCursor)(console_info_t*, uint32_t, uint32_t);\n} console_driver_t;\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/elf.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <tasks/scheduler.h>\n\n#define ELF_TYPE_NONE 0\n#define ELF_TYPE_REL 1\n#define ELF_TYPE_EXEC 2\n#define ELF_TYPE_DYN 3\n#define ELF_TYPE_CORE 4\n\n#define ELF_ARCH_NONE 0\n#define ELF_ARCH_386 3\n\n#define ELF_VERSION_CURRENT 1\n\ntypedef struct {\n\tunsigned char magic[4];\n\t/* Note: There _is_ other stuff in here, but we don't need it */\n\tunsigned char pad[12]; \n} __attribute__((packed)) elf_ident_t;\n\ntypedef struct {\n\tuint32_t    type;\n\tuint32_t    offset;\n\tvoid*\t\tvirtaddr;\n\tvoid*\t\tphysaddr;\n\tuint32_t    filesize;\n\tuint32_t    memsize;\n\tuint32_t    flags;\n\tuint32_t    alignment;\n} __attribute__((packed)) elf_program_t;\n\ntypedef struct {\n\telf_ident_t ident;\n\tuint16_t\ttype;\t\t/* Object file type */\n\tuint16_t\tmachine;\t/* Architecture */\n\tuint32_t\tversion;\t/* Object file version */\n\tvoid*\t\tentry;\t\t/* Entry point virtual address */\n\tuint32_t\tphoff;\t\t/* Program header table file offset */\n\tuint32_t\tshoff;\t\t/* Section header table file offset */\n\tuint32_t\tflags;\t\t/* Processor-specific flags */\n\tuint16_t\tehsize;\t\t/* ELF header size in bytes */\n\tuint16_t\tphentsize;\t/* Program header table entry size */\n\tuint16_t\tphnum;\t\t/* Program header table entry count */\n\tuint16_t\tshentsize;\t/* Section header table entry size */\n\tuint16_t\tshnum;\t\t/* Section header table entry count */\n\tuint16_t\tshstrndx;\t/* Section header string table index */\n} __attribute__((packed)) elf_t;\n\ntask_t* elf_load(elf_t* bin, char* name, char** environ, char** argv, int argc);\ntask_t* elf_load_file(char* path, char** environ, char** argv, int argc);\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/exception.zep.c",
    "content": "\n#ifdef HAVE_CONFIG_H\n#include \"../../ext_config.h\"\n#endif\n\n#include <php.h>\n#include \"../../php_ext.h\"\n#include \"../../ext.h\"\n\n#include <Zend/zend_operators.h>\n#include <Zend/zend_exceptions.h>\n#include <Zend/zend_interfaces.h>\n\n#include \"kernel/main.h\"\n\n\n/**\n * Test\\Router\\Exception\n *\n * Exceptions generated by the router\n */\nZEPHIR_INIT_CLASS(Test_Router_Exception) {\n\n    ZEPHIR_REGISTER_CLASS_EX(Test\\\\Router, Exception, test, router_exception, zend_exception_get_default(TSRMLS_C), NULL, 0);\n\n    return SUCCESS;\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/exception.zep.h",
    "content": "\nextern zend_class_entry *test_router_exception_ce;\n\nZEPHIR_INIT_CLASS(Test_Router_Exception);\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/filter.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <console/info.h>\n#include <console/driver.h>\n\nstruct console_filter {\n\t// General callback for all actions etc.\n\t// Preferred prototype:\n\t// char <name>(char c, console_info_t *info, console_driver_t *input, console_driver_t *output);\n\tchar (*callback)(char, console_info_t*, console_driver_t*, console_driver_t*);\n\n\t// Specific callbacks for read and write\n\t// Preferred prototype:\n\t// char <name>(char c, console_info_t *info, console_driver_t *input);\n\tchar (*read_callback)(char, console_info_t*, console_driver_t*);\n\n\t// Preferred prototype:\n\t// char <name>(char c, console_info_t *info, console_driver_t *output);\n\tchar (*write_callback)(char, console_info_t*, console_driver_t*);\n\n\t// The next filter in the filter chain\n\tstruct console_filter* next;\n};\n\ntypedef struct console_filter console_filter_t;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/fudge_node.c",
    "content": "/* Copyright (c) 2010 Jens Nyberg\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE. */\n\n#include <fudge.h>\n#include <kernel.h>\n#include <modules/system/system.h>\n#include \"pipe.h\"\n\nstatic struct system_node root;\nstatic struct system_node clone;\n\nstatic unsigned int read(struct pipe_end *endself, struct pipe_end *endtarget, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    count = buffer_rcfifo(&endself->buffer, count, buffer);\n\n    if (!count && endtarget->node.refcount)\n    {\n\n        list_add(&endself->readlinks, &state->link);\n        task_setstatus(state->link.data, TASK_STATUS_BLOCKED);\n\n    }\n\n    system_wakeup(&endtarget->writelinks);\n\n    return count;\n\n}\n\nstatic unsigned int write(struct pipe_end *endself, struct pipe_end *endtarget, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    count = buffer_wcfifo(&endtarget->buffer, count, buffer);\n\n    if (!count)\n    {\n\n        list_add(&endself->writelinks, &state->link);\n        task_setstatus(state->link.data, TASK_STATUS_BLOCKED);\n\n    }\n\n    system_wakeup(&endtarget->readlinks);\n\n    return count;\n\n}\n\nstatic unsigned int end0_read(struct system_node *self, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    struct pipe *pipe = (struct pipe *)self->parent;\n\n    return read(&pipe->end0, &pipe->end1, state, count, buffer);\n\n}\n\nstatic unsigned int end0_write(struct system_node *self, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    struct pipe *pipe = (struct pipe *)self->parent;\n\n    return write(&pipe->end0, &pipe->end1, state, count, buffer);\n\n}\n\nstatic unsigned int end1_read(struct system_node *self, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    struct pipe *pipe = (struct pipe *)self->parent;\n\n    return read(&pipe->end1, &pipe->end0, state, count, buffer);\n\n}\n\nstatic unsigned int end1_write(struct system_node *self, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    struct pipe *pipe = (struct pipe *)self->parent;\n\n    return write(&pipe->end1, &pipe->end0, state, count, buffer);\n\n}\n\nstatic unsigned int clone_child(struct system_node *self, unsigned int count, char *path)\n{\n\n    struct list_item *current;\n\n    for (current = root.children.head; current; current = current->next)\n    {\n\n        struct system_node *node = current->data;\n        struct pipe *pipe = current->data;\n\n        if (node == self)\n            continue;\n\n        if (pipe->end0.node.refcount || pipe->end1.node.refcount)\n            continue;\n\n        return node->child(node, count, path);\n\n    }\n\n    return 0;\n\n}\n\nvoid pipe_init(struct pipe *pipe)\n{\n\n    buffer_init(&pipe->end0.buffer, 4096, pipe->end0.data);\n    buffer_init(&pipe->end1.buffer, 4096, pipe->end1.data);\n    system_initnode(&pipe->end0.node, SYSTEM_NODETYPE_NORMAL, \"0\");\n    system_initnode(&pipe->end1.node, SYSTEM_NODETYPE_NORMAL, \"1\");\n\n    pipe->end0.node.read = end0_read;\n    pipe->end0.node.write = end0_write;\n    pipe->end1.node.read = end1_read;\n    pipe->end1.node.write = end1_write;\n\n    system_initnode(&pipe->root, SYSTEM_NODETYPE_GROUP | SYSTEM_NODETYPE_MULTI, \"pipe\");\n    system_addchild(&pipe->root, &pipe->end0.node);\n    system_addchild(&pipe->root, &pipe->end1.node);\n\n}\n\nvoid pipe_register(struct pipe *pipe)\n{\n\n    system_addchild(&root, &pipe->root);\n\n}\n\nvoid pipe_unregister(struct pipe *pipe)\n{\n\n    system_removechild(&root, &pipe->root);\n\n}\n\nvoid module_init(void)\n{\n\n    system_initnode(&root, SYSTEM_NODETYPE_GROUP, \"pipe\");\n    system_initnode(&clone, SYSTEM_NODETYPE_GROUP, \"clone\");\n\n    clone.child = clone_child;\n\n    system_addchild(&root, &clone);\n\n}\n\nvoid module_register(void)\n{\n\n    system_registernode(&root);\n\n}\n\nvoid module_unregister(void)\n{\n\n    system_unregisternode(&root);\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/git.c",
    "content": "#include \"builtin.h\"\n#include \"cache.h\"\n#include \"exec_cmd.h\"\n#include \"help.h\"\n#include \"quote.h\"\n#include \"run-command.h\"\n\nconst char git_usage_string[] =\n\t\"git [--version] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]\\n\"\n\t\"           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]\\n\"\n\t\"           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]\\n\"\n\t\"           [-c name=value] [--help]\\n\"\n\t\"           <command> [<args>]\";\n\nconst char git_more_info_string[] =\n\tN_(\"See 'git help <command>' for more information on a specific command.\");\n\nstatic struct startup_info git_startup_info;\nstatic int use_pager = -1;\nstruct pager_config {\n\tconst char *cmd;\n\tint want;\n\tchar *value;\n};\n\nstatic int pager_command_config(const char *var, const char *value, void *data)\n{\n\tstruct pager_config *c = data;\n\tif (!prefixcmp(var, \"pager.\") && !strcmp(var + 6, c->cmd)) {\n\t\tint b = git_config_maybe_bool(var, value);\n\t\tif (b >= 0)\n\t\t\tc->want = b;\n\t\telse {\n\t\t\tc->want = 1;\n\t\t\tc->value = xstrdup(value);\n\t\t}\n\t}\n\treturn 0;\n}\n\n/* returns 0 for \"no pager\", 1 for \"use pager\", and -1 for \"not specified\" */\nint check_pager_config(const char *cmd)\n{\n\tstruct pager_config c;\n\tc.cmd = cmd;\n\tc.want = -1;\n\tc.value = NULL;\n\tgit_config(pager_command_config, &c);\n\tif (c.value)\n\t\tpager_program = c.value;\n\treturn c.want;\n}\n\nstatic void commit_pager_choice(void) {\n\tswitch (use_pager) {\n\tcase 0:\n\t\tsetenv(\"GIT_PAGER\", \"cat\", 1);\n\t\tbreak;\n\tcase 1:\n\t\tsetup_pager();\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nstatic int handle_options(const char ***argv, int *argc, int *envchanged)\n{\n\tconst char **orig_argv = *argv;\n\n\twhile (*argc > 0) {\n\t\tconst char *cmd = (*argv)[0];\n\t\tif (cmd[0] != '-')\n\t\t\tbreak;\n\n\t\t/*\n\t\t * For legacy reasons, the \"version\" and \"help\"\n\t\t * commands can be written with \"--\" prepended\n\t\t * to make them look like flags.\n\t\t */\n\t\tif (!strcmp(cmd, \"--help\") || !strcmp(cmd, \"--version\"))\n\t\t\tbreak;\n\n\t\t/*\n\t\t * Check remaining flags.\n\t\t */\n\t\tif (!prefixcmp(cmd, \"--exec-path\")) {\n\t\t\tcmd += 11;\n\t\t\tif (*cmd == '=')\n\t\t\t\tgit_set_argv_exec_path(cmd + 1);\n\t\t\telse {\n\t\t\t\tputs(git_exec_path());\n\t\t\t\texit(0);\n\t\t\t}\n\t\t} else if (!strcmp(cmd, \"--html-path\")) {\n\t\t\tputs(system_path(GIT_HTML_PATH));\n\t\t\texit(0);\n\t\t} else if (!strcmp(cmd, \"--man-path\")) {\n\t\t\tputs(system_path(GIT_MAN_PATH));\n\t\t\texit(0);\n\t\t} else if (!strcmp(cmd, \"--info-path\")) {\n\t\t\tputs(system_path(GIT_INFO_PATH));\n\t\t\texit(0);\n\t\t} else if (!strcmp(cmd, \"-p\") || !strcmp(cmd, \"--paginate\")) {\n\t\t\tuse_pager = 1;\n\t\t} else if (!strcmp(cmd, \"--no-pager\")) {\n\t\t\tuse_pager = 0;\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"--no-replace-objects\")) {\n\t\t\tread_replace_refs = 0;\n\t\t\tsetenv(NO_REPLACE_OBJECTS_ENVIRONMENT, \"1\", 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"--git-dir\")) {\n\t\t\tif (*argc < 2) {\n\t\t\t\tfprintf(stderr, \"No directory given for --git-dir.\\n\" );\n\t\t\t\tusage(git_usage_string);\n\t\t\t}\n\t\t\tsetenv(GIT_DIR_ENVIRONMENT, (*argv)[1], 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t\t(*argv)++;\n\t\t\t(*argc)--;\n\t\t} else if (!prefixcmp(cmd, \"--git-dir=\")) {\n\t\t\tsetenv(GIT_DIR_ENVIRONMENT, cmd + 10, 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"--namespace\")) {\n\t\t\tif (*argc < 2) {\n\t\t\t\tfprintf(stderr, \"No namespace given for --namespace.\\n\" );\n\t\t\t\tusage(git_usage_string);\n\t\t\t}\n\t\t\tsetenv(GIT_NAMESPACE_ENVIRONMENT, (*argv)[1], 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t\t(*argv)++;\n\t\t\t(*argc)--;\n\t\t} else if (!prefixcmp(cmd, \"--namespace=\")) {\n\t\t\tsetenv(GIT_NAMESPACE_ENVIRONMENT, cmd + 12, 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"--work-tree\")) {\n\t\t\tif (*argc < 2) {\n\t\t\t\tfprintf(stderr, \"No directory given for --work-tree.\\n\" );\n\t\t\t\tusage(git_usage_string);\n\t\t\t}\n\t\t\tsetenv(GIT_WORK_TREE_ENVIRONMENT, (*argv)[1], 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t\t(*argv)++;\n\t\t\t(*argc)--;\n\t\t} else if (!prefixcmp(cmd, \"--work-tree=\")) {\n\t\t\tsetenv(GIT_WORK_TREE_ENVIRONMENT, cmd + 12, 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"--bare\")) {\n\t\t\tstatic char git_dir[PATH_MAX+1];\n\t\t\tis_bare_repository_cfg = 1;\n\t\t\tsetenv(GIT_DIR_ENVIRONMENT, getcwd(git_dir, sizeof(git_dir)), 0);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"-c\")) {\n\t\t\tif (*argc < 2) {\n\t\t\t\tfprintf(stderr, \"-c expects a configuration string\\n\" );\n\t\t\t\tusage(git_usage_string);\n\t\t\t}\n\t\t\tgit_config_push_parameter((*argv)[1]);\n\t\t\t(*argv)++;\n\t\t\t(*argc)--;\n\t\t} else {\n\t\t\tfprintf(stderr, \"Unknown option: %s\\n\", cmd);\n\t\t\tusage(git_usage_string);\n\t\t}\n\n\t\t(*argv)++;\n\t\t(*argc)--;\n\t}\n\treturn (*argv) - orig_argv;\n}\n\nstatic int handle_alias(int *argcp, const char ***argv)\n{\n\tint envchanged = 0, ret = 0, saved_errno = errno;\n\tconst char *subdir;\n\tint count, option_count;\n\tconst char **new_argv;\n\tconst char *alias_command;\n\tchar *alias_string;\n\tint unused_nongit;\n\n\tsubdir = setup_git_directory_gently(&unused_nongit);\n\n\talias_command = (*argv)[0];\n\talias_string = alias_lookup(alias_command);\n\tif (alias_string) {\n\t\tif (alias_string[0] == '!') {\n\t\t\tconst char **alias_argv;\n\t\t\tint argc = *argcp, i;\n\n\t\t\tcommit_pager_choice();\n\n\t\t\t/* build alias_argv */\n\t\t\talias_argv = xmalloc(sizeof(*alias_argv) * (argc + 1));\n\t\t\talias_argv[0] = alias_string + 1;\n\t\t\tfor (i = 1; i < argc; ++i)\n\t\t\t\talias_argv[i] = (*argv)[i];\n\t\t\talias_argv[argc] = NULL;\n\n\t\t\tret = run_command_v_opt(alias_argv, RUN_USING_SHELL);\n\t\t\tif (ret >= 0)   /* normal exit */\n\t\t\t\texit(ret);\n\n\t\t\tdie_errno(\"While expanding alias '%s': '%s'\",\n\t\t\t    alias_command, alias_string + 1);\n\t\t}\n\t\tcount = split_cmdline(alias_string, &new_argv);\n\t\tif (count < 0)\n\t\t\tdie(\"Bad alias.%s string: %s\", alias_command,\n\t\t\t    split_cmdline_strerror(count));\n\t\toption_count = handle_options(&new_argv, &count, &envchanged);\n\t\tif (envchanged)\n\t\t\tdie(\"alias '%s' changes environment variables\\n\"\n\t\t\t\t \"You can use '!git' in the alias to do this.\",\n\t\t\t\t alias_command);\n\t\tmemmove(new_argv - option_count, new_argv,\n\t\t\t\tcount * sizeof(char *));\n\t\tnew_argv -= option_count;\n\n\t\tif (count < 1)\n\t\t\tdie(\"empty alias for %s\", alias_command);\n\n\t\tif (!strcmp(alias_command, new_argv[0]))\n\t\t\tdie(\"recursive alias: %s\", alias_command);\n\n\t\ttrace_argv_printf(new_argv,\n\t\t\t\t  \"trace: alias expansion: %s =>\",\n\t\t\t\t  alias_command);\n\n\t\tnew_argv = xrealloc(new_argv, sizeof(char *) *\n\t\t\t\t    (count + *argcp));\n\t\t/* insert after command name */\n\t\tmemcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp);\n\n\t\t*argv = new_argv;\n\t\t*argcp += count - 1;\n\n\t\tret = 1;\n\t}\n\n\tif (subdir && chdir(subdir))\n\t\tdie_errno(\"Cannot change to '%s'\", subdir);\n\n\terrno = saved_errno;\n\n\treturn ret;\n}\n\nconst char git_version_string[] = GIT_VERSION;\n\n#define RUN_SETUP\t\t(1<<0)\n#define RUN_SETUP_GENTLY\t(1<<1)\n#define USE_PAGER\t\t(1<<2)\n/*\n * require working tree to be present -- anything uses this needs\n * RUN_SETUP for reading from the configuration file.\n */\n#define NEED_WORK_TREE\t\t(1<<3)\n\nstruct cmd_struct {\n\tconst char *cmd;\n\tint (*fn)(int, const char **, const char *);\n\tint option;\n};\n\nstatic int run_builtin(struct cmd_struct *p, int argc, const char **argv)\n{\n\tint status, help;\n\tstruct stat st;\n\tconst char *prefix;\n\n\tprefix = NULL;\n\thelp = argc == 2 && !strcmp(argv[1], \"-h\");\n\tif (!help) {\n\t\tif (p->option & RUN_SETUP)\n\t\t\tprefix = setup_git_directory();\n\t\tif (p->option & RUN_SETUP_GENTLY) {\n\t\t\tint nongit_ok;\n\t\t\tprefix = setup_git_directory_gently(&nongit_ok);\n\t\t}\n\n\t\tif (use_pager == -1 && p->option & (RUN_SETUP | RUN_SETUP_GENTLY))\n\t\t\tuse_pager = check_pager_config(p->cmd);\n\t\tif (use_pager == -1 && p->option & USE_PAGER)\n\t\t\tuse_pager = 1;\n\n\t\tif ((p->option & (RUN_SETUP | RUN_SETUP_GENTLY)) &&\n\t\t    startup_info->have_repository) /* get_git_dir() may set up repo, avoid that */\n\t\t\ttrace_repo_setup(prefix);\n\t}\n\tcommit_pager_choice();\n\n\tif (!help && p->option & NEED_WORK_TREE)\n\t\tsetup_work_tree();\n\n\ttrace_argv_printf(argv, \"trace: built-in: git\");\n\n\tstatus = p->fn(argc, argv, prefix);\n\tif (status)\n\t\treturn status;\n\n\t/* Somebody closed stdout? */\n\tif (fstat(fileno(stdout), &st))\n\t\treturn 0;\n\t/* Ignore write errors for pipes and sockets.. */\n\tif (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode))\n\t\treturn 0;\n\n\t/* Check for ENOSPC and EIO errors.. */\n\tif (fflush(stdout))\n\t\tdie_errno(\"write failure on standard output\");\n\tif (ferror(stdout))\n\t\tdie(\"unknown write failure on standard output\");\n\tif (fclose(stdout))\n\t\tdie_errno(\"close failed on standard output\");\n\treturn 0;\n}\n\nstatic void handle_internal_command(int argc, const char **argv)\n{\n\tconst char *cmd = argv[0];\n\tstatic struct cmd_struct commands[] = {\n\t\t{ \"add\", cmd_add, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"annotate\", cmd_annotate, RUN_SETUP },\n\t\t{ \"apply\", cmd_apply, RUN_SETUP_GENTLY },\n\t\t{ \"archive\", cmd_archive },\n\t\t{ \"bisect--helper\", cmd_bisect__helper, RUN_SETUP },\n\t\t{ \"blame\", cmd_blame, RUN_SETUP },\n\t\t{ \"branch\", cmd_branch, RUN_SETUP },\n\t\t{ \"bundle\", cmd_bundle, RUN_SETUP_GENTLY },\n\t\t{ \"cat-file\", cmd_cat_file, RUN_SETUP },\n\t\t{ \"check-attr\", cmd_check_attr, RUN_SETUP },\n\t\t{ \"check-ref-format\", cmd_check_ref_format },\n\t\t{ \"checkout\", cmd_checkout, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"checkout-index\", cmd_checkout_index,\n\t\t\tRUN_SETUP | NEED_WORK_TREE},\n\t\t{ \"cherry\", cmd_cherry, RUN_SETUP },\n\t\t{ \"cherry-pick\", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"clean\", cmd_clean, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"clone\", cmd_clone },\n\t\t{ \"column\", cmd_column, RUN_SETUP_GENTLY },\n\t\t{ \"commit\", cmd_commit, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"commit-tree\", cmd_commit_tree, RUN_SETUP },\n\t\t{ \"config\", cmd_config, RUN_SETUP_GENTLY },\n\t\t{ \"count-objects\", cmd_count_objects, RUN_SETUP },\n\t\t{ \"describe\", cmd_describe, RUN_SETUP },\n\t\t{ \"diff\", cmd_diff },\n\t\t{ \"diff-files\", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"diff-index\", cmd_diff_index, RUN_SETUP },\n\t\t{ \"diff-tree\", cmd_diff_tree, RUN_SETUP },\n\t\t{ \"fast-export\", cmd_fast_export, RUN_SETUP },\n\t\t{ \"fetch\", cmd_fetch, RUN_SETUP },\n\t\t{ \"fetch-pack\", cmd_fetch_pack, RUN_SETUP },\n\t\t{ \"fmt-merge-msg\", cmd_fmt_merge_msg, RUN_SETUP },\n\t\t{ \"for-each-ref\", cmd_for_each_ref, RUN_SETUP },\n\t\t{ \"format-patch\", cmd_format_patch, RUN_SETUP },\n\t\t{ \"fsck\", cmd_fsck, RUN_SETUP },\n\t\t{ \"fsck-objects\", cmd_fsck, RUN_SETUP },\n\t\t{ \"gc\", cmd_gc, RUN_SETUP },\n\t\t{ \"get-tar-commit-id\", cmd_get_tar_commit_id },\n\t\t{ \"grep\", cmd_grep, RUN_SETUP_GENTLY },\n\t\t{ \"hash-object\", cmd_hash_object },\n\t\t{ \"help\", cmd_help },\n\t\t{ \"index-pack\", cmd_index_pack, RUN_SETUP_GENTLY },\n\t\t{ \"init\", cmd_init_db },\n\t\t{ \"init-db\", cmd_init_db },\n\t\t{ \"log\", cmd_log, RUN_SETUP },\n\t\t{ \"ls-files\", cmd_ls_files, RUN_SETUP },\n\t\t{ \"ls-remote\", cmd_ls_remote, RUN_SETUP_GENTLY },\n\t\t{ \"ls-tree\", cmd_ls_tree, RUN_SETUP },\n\t\t{ \"mailinfo\", cmd_mailinfo },\n\t\t{ \"mailsplit\", cmd_mailsplit },\n\t\t{ \"merge\", cmd_merge, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"merge-base\", cmd_merge_base, RUN_SETUP },\n\t\t{ \"merge-file\", cmd_merge_file, RUN_SETUP_GENTLY },\n\t\t{ \"merge-index\", cmd_merge_index, RUN_SETUP },\n\t\t{ \"merge-ours\", cmd_merge_ours, RUN_SETUP },\n\t\t{ \"merge-recursive\", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"merge-recursive-ours\", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"merge-recursive-theirs\", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"merge-subtree\", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"merge-tree\", cmd_merge_tree, RUN_SETUP },\n\t\t{ \"mktag\", cmd_mktag, RUN_SETUP },\n\t\t{ \"mktree\", cmd_mktree, RUN_SETUP },\n\t\t{ \"mv\", cmd_mv, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"name-rev\", cmd_name_rev, RUN_SETUP },\n\t\t{ \"notes\", cmd_notes, RUN_SETUP },\n\t\t{ \"pack-objects\", cmd_pack_objects, RUN_SETUP },\n\t\t{ \"pack-redundant\", cmd_pack_redundant, RUN_SETUP },\n\t\t{ \"pack-refs\", cmd_pack_refs, RUN_SETUP },\n\t\t{ \"patch-id\", cmd_patch_id },\n\t\t{ \"peek-remote\", cmd_ls_remote, RUN_SETUP_GENTLY },\n\t\t{ \"pickaxe\", cmd_blame, RUN_SETUP },\n\t\t{ \"prune\", cmd_prune, RUN_SETUP },\n\t\t{ \"prune-packed\", cmd_prune_packed, RUN_SETUP },\n\t\t{ \"push\", cmd_push, RUN_SETUP },\n\t\t{ \"read-tree\", cmd_read_tree, RUN_SETUP },\n\t\t{ \"receive-pack\", cmd_receive_pack },\n\t\t{ \"reflog\", cmd_reflog, RUN_SETUP },\n\t\t{ \"remote\", cmd_remote, RUN_SETUP },\n\t\t{ \"remote-ext\", cmd_remote_ext },\n\t\t{ \"remote-fd\", cmd_remote_fd },\n\t\t{ \"replace\", cmd_replace, RUN_SETUP },\n\t\t{ \"repo-config\", cmd_repo_config, RUN_SETUP_GENTLY },\n\t\t{ \"rerere\", cmd_rerere, RUN_SETUP },\n\t\t{ \"reset\", cmd_reset, RUN_SETUP },\n\t\t{ \"rev-list\", cmd_rev_list, RUN_SETUP },\n\t\t{ \"rev-parse\", cmd_rev_parse },\n\t\t{ \"revert\", cmd_revert, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"rm\", cmd_rm, RUN_SETUP },\n\t\t{ \"send-pack\", cmd_send_pack, RUN_SETUP },\n\t\t{ \"shortlog\", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },\n\t\t{ \"show\", cmd_show, RUN_SETUP },\n\t\t{ \"show-branch\", cmd_show_branch, RUN_SETUP },\n\t\t{ \"show-ref\", cmd_show_ref, RUN_SETUP },\n\t\t{ \"stage\", cmd_add, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"status\", cmd_status, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"stripspace\", cmd_stripspace },\n\t\t{ \"symbolic-ref\", cmd_symbolic_ref, RUN_SETUP },\n\t\t{ \"tag\", cmd_tag, RUN_SETUP },\n\t\t{ \"tar-tree\", cmd_tar_tree },\n\t\t{ \"unpack-file\", cmd_unpack_file, RUN_SETUP },\n\t\t{ \"unpack-objects\", cmd_unpack_objects, RUN_SETUP },\n\t\t{ \"update-index\", cmd_update_index, RUN_SETUP },\n\t\t{ \"update-ref\", cmd_update_ref, RUN_SETUP },\n\t\t{ \"update-server-info\", cmd_update_server_info, RUN_SETUP },\n\t\t{ \"upload-archive\", cmd_upload_archive },\n\t\t{ \"upload-archive--writer\", cmd_upload_archive_writer },\n\t\t{ \"var\", cmd_var, RUN_SETUP_GENTLY },\n\t\t{ \"verify-pack\", cmd_verify_pack },\n\t\t{ \"verify-tag\", cmd_verify_tag, RUN_SETUP },\n\t\t{ \"version\", cmd_version },\n\t\t{ \"whatchanged\", cmd_whatchanged, RUN_SETUP },\n\t\t{ \"write-tree\", cmd_write_tree, RUN_SETUP },\n\t};\n\tint i;\n\tstatic const char ext[] = STRIP_EXTENSION;\n\n\tif (sizeof(ext) > 1) {\n\t\ti = strlen(argv[0]) - strlen(ext);\n\t\tif (i > 0 && !strcmp(argv[0] + i, ext)) {\n\t\t\tchar *argv0 = xstrdup(argv[0]);\n\t\t\targv[0] = cmd = argv0;\n\t\t\targv0[i] = '\\0';\n\t\t}\n\t}\n\n\t/* Turn \"git cmd --help\" into \"git help cmd\" */\n\tif (argc > 1 && !strcmp(argv[1], \"--help\")) {\n\t\targv[1] = argv[0];\n\t\targv[0] = cmd = \"help\";\n\t}\n\n\tfor (i = 0; i < ARRAY_SIZE(commands); i++) {\n\t\tstruct cmd_struct *p = commands+i;\n\t\tif (strcmp(p->cmd, cmd))\n\t\t\tcontinue;\n\t\texit(run_builtin(p, argc, argv));\n\t}\n}\n\nstatic void execv_dashed_external(const char **argv)\n{\n\tstruct strbuf cmd = STRBUF_INIT;\n\tconst char *tmp;\n\tint status;\n\n\tif (use_pager == -1)\n\t\tuse_pager = check_pager_config(argv[0]);\n\tcommit_pager_choice();\n\n\tstrbuf_addf(&cmd, \"git-%s\", argv[0]);\n\n\t/*\n\t * argv[0] must be the git command, but the argv array\n\t * belongs to the caller, and may be reused in\n\t * subsequent loop iterations. Save argv[0] and\n\t * restore it on error.\n\t */\n\ttmp = argv[0];\n\targv[0] = cmd.buf;\n\n\ttrace_argv_printf(argv, \"trace: exec:\");\n\n\t/*\n\t * if we fail because the command is not found, it is\n\t * OK to return. Otherwise, we just pass along the status code.\n\t */\n\tstatus = run_command_v_opt(argv, RUN_SILENT_EXEC_FAILURE | RUN_CLEAN_ON_EXIT);\n\tif (status >= 0 || errno != ENOENT)\n\t\texit(status);\n\n\targv[0] = tmp;\n\n\tstrbuf_release(&cmd);\n}\n\nstatic int run_argv(int *argcp, const char ***argv)\n{\n\tint done_alias = 0;\n\n\twhile (1) {\n\t\t/* See if it's an internal command */\n\t\thandle_internal_command(*argcp, *argv);\n\n\t\t/* .. then try the external ones */\n\t\texecv_dashed_external(*argv);\n\n\t\t/* It could be an alias -- this works around the insanity\n\t\t * of overriding \"git log\" with \"git show\" by having\n\t\t * alias.log = show\n\t\t */\n\t\tif (done_alias || !handle_alias(argcp, argv))\n\t\t\tbreak;\n\t\tdone_alias = 1;\n\t}\n\n\treturn done_alias;\n}\n\n\nint main(int argc, const char **argv)\n{\n\tconst char *cmd;\n\n\tstartup_info = &git_startup_info;\n\n\tcmd = git_extract_argv0_path(argv[0]);\n\tif (!cmd)\n\t\tcmd = \"git-help\";\n\n\tgit_setup_gettext();\n\n\t/*\n\t * \"git-xxxx\" is the same as \"git xxxx\", but we obviously:\n\t *\n\t *  - cannot take flags in between the \"git\" and the \"xxxx\".\n\t *  - cannot execute it externally (since it would just do\n\t *    the same thing over again)\n\t *\n\t * So we just directly call the internal command handler, and\n\t * die if that one cannot handle it.\n\t */\n\tif (!prefixcmp(cmd, \"git-\")) {\n\t\tcmd += 4;\n\t\targv[0] = cmd;\n\t\thandle_internal_command(argc, argv);\n\t\tdie(\"cannot handle %s internally\", cmd);\n\t}\n\n\t/* Look for flags.. */\n\targv++;\n\targc--;\n\thandle_options(&argv, &argc, NULL);\n\tif (argc > 0) {\n\t\tif (!prefixcmp(argv[0], \"--\"))\n\t\t\targv[0] += 2;\n\t} else {\n\t\t/* The user didn't specify a command; give them help */\n\t\tcommit_pager_choice();\n\t\tprintf(\"usage: %s\\n\\n\", git_usage_string);\n\t\tlist_common_cmds_help();\n\t\tprintf(\"\\n%s\\n\", git_more_info_string);\n\t\texit(1);\n\t}\n\tcmd = argv[0];\n\n\t/*\n\t * We use PATH to find git commands, but we prepend some higher\n\t * precedence paths: the \"--exec-path\" option, the GIT_EXEC_PATH\n\t * environment, and the $(gitexecdir) from the Makefile at build\n\t * time.\n\t */\n\tsetup_path();\n\n\twhile (1) {\n\t\tstatic int done_help = 0;\n\t\tstatic int was_alias = 0;\n\t\twas_alias = run_argv(&argc, &argv);\n\t\tif (errno != ENOENT)\n\t\t\tbreak;\n\t\tif (was_alias) {\n\t\t\tfprintf(stderr, \"Expansion of alias '%s' failed; \"\n\t\t\t\t\"'%s' is not a git command\\n\",\n\t\t\t\tcmd, argv[0]);\n\t\t\texit(1);\n\t\t}\n\t\tif (!done_help) {\n\t\t\tcmd = argv[0] = help_unknown_cmd(cmd);\n\t\t\tdone_help = 1;\n\t\t} else\n\t\t\tbreak;\n\t}\n\n\tfprintf(stderr, \"Failed to run command '%s': %s\\n\",\n\t\tcmd, strerror(errno));\n\n\treturn 1;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/hello.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n    printf(\"Hello World\\n\");\n    return 0;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/hello.h",
    "content": "#ifndef HELLO_H\n#define HELLO_H\n\nvoid hello();\n\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/http_parser.c",
    "content": "/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev\n *\n * Additional changes are licensed under the same terms as NGINX and\n * copyright Joyent, Inc. and other Node contributors. All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n#include \"http_parser.h\"\n#include <assert.h>\n#include <stddef.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h>\n\n#ifndef ULLONG_MAX\n# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */\n#endif\n\n#ifndef MIN\n# define MIN(a,b) ((a) < (b) ? (a) : (b))\n#endif\n\n\n#if HTTP_PARSER_DEBUG\n#define SET_ERRNO(e)                                                 \\\ndo {                                                                 \\\n  parser->http_errno = (e);                                          \\\n  parser->error_lineno = __LINE__;                                   \\\n} while (0)\n#else\n#define SET_ERRNO(e)                                                 \\\ndo {                                                                 \\\n  parser->http_errno = (e);                                          \\\n} while(0)\n#endif\n\n\n/* Run the notify callback FOR, returning ER if it fails */\n#define CALLBACK_NOTIFY_(FOR, ER)                                    \\\ndo {                                                                 \\\n  assert(HTTP_PARSER_ERRNO(parser) == HPE_OK);                       \\\n                                                                     \\\n  if (settings->on_##FOR) {                                          \\\n    if (0 != settings->on_##FOR(parser)) {                           \\\n      SET_ERRNO(HPE_CB_##FOR);                                       \\\n    }                                                                \\\n                                                                     \\\n    /* We either errored above or got paused; get out */             \\\n    if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {                       \\\n      return (ER);                                                   \\\n    }                                                                \\\n  }                                                                  \\\n} while (0)\n\n/* Run the notify callback FOR and consume the current byte */\n#define CALLBACK_NOTIFY(FOR)            CALLBACK_NOTIFY_(FOR, p - data + 1)\n\n/* Run the notify callback FOR and don't consume the current byte */\n#define CALLBACK_NOTIFY_NOADVANCE(FOR)  CALLBACK_NOTIFY_(FOR, p - data)\n\n/* Run data callback FOR with LEN bytes, returning ER if it fails */\n#define CALLBACK_DATA_(FOR, LEN, ER)                                 \\\ndo {                                                                 \\\n  assert(HTTP_PARSER_ERRNO(parser) == HPE_OK);                       \\\n                                                                     \\\n  if (FOR##_mark) {                                                  \\\n    if (settings->on_##FOR) {                                        \\\n      if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) {      \\\n        SET_ERRNO(HPE_CB_##FOR);                                     \\\n      }                                                              \\\n                                                                     \\\n      /* We either errored above or got paused; get out */           \\\n      if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {                     \\\n        return (ER);                                                 \\\n      }                                                              \\\n    }                                                                \\\n    FOR##_mark = NULL;                                               \\\n  }                                                                  \\\n} while (0)\n  \n/* Run the data callback FOR and consume the current byte */\n#define CALLBACK_DATA(FOR)                                           \\\n    CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)\n\n/* Run the data callback FOR and don't consume the current byte */\n#define CALLBACK_DATA_NOADVANCE(FOR)                                 \\\n    CALLBACK_DATA_(FOR, p - FOR##_mark, p - data)\n\n/* Set the mark FOR; non-destructive if mark is already set */\n#define MARK(FOR)                                                    \\\ndo {                                                                 \\\n  if (!FOR##_mark) {                                                 \\\n    FOR##_mark = p;                                                  \\\n  }                                                                  \\\n} while (0)\n\n\n#define PROXY_CONNECTION \"proxy-connection\"\n#define CONNECTION \"connection\"\n#define CONTENT_LENGTH \"content-length\"\n#define TRANSFER_ENCODING \"transfer-encoding\"\n#define UPGRADE \"upgrade\"\n#define CHUNKED \"chunked\"\n#define KEEP_ALIVE \"keep-alive\"\n#define CLOSE \"close\"\n\n\nstatic const char *method_strings[] =\n  {\n#define XX(num, name, string) #string,\n  HTTP_METHOD_MAP(XX)\n#undef XX\n  };\n\n\n/* Tokens as defined by rfc 2616. Also lowercases them.\n *        token       = 1*<any CHAR except CTLs or separators>\n *     separators     = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n *                    | \",\" | \";\" | \":\" | \"\\\" | <\">\n *                    | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n *                    | \"{\" | \"}\" | SP | HT\n */\nstatic const char tokens[256] = {\n/*   0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel  */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*   8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si   */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*  16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*  24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us  */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*  32 sp    33  !    34  \"    35  #    36  $    37  %    38  &    39  '  */\n        0,      '!',      0,      '#',     '$',     '%',     '&',    '\\'',\n/*  40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /  */\n        0,       0,      '*',     '+',      0,      '-',     '.',      0,\n/*  48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7  */\n       '0',     '1',     '2',     '3',     '4',     '5',     '6',     '7',\n/*  56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?  */\n       '8',     '9',      0,       0,       0,       0,       0,       0,\n/*  64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G  */\n        0,      'a',     'b',     'c',     'd',     'e',     'f',     'g',\n/*  72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O  */\n       'h',     'i',     'j',     'k',     'l',     'm',     'n',     'o',\n/*  80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W  */\n       'p',     'q',     'r',     's',     't',     'u',     'v',     'w',\n/*  88  X    89  Y    90  Z    91  [    92  \\    93  ]    94  ^    95  _  */\n       'x',     'y',     'z',      0,       0,       0,      '^',     '_',\n/*  96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g  */\n       '`',     'a',     'b',     'c',     'd',     'e',     'f',     'g',\n/* 104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o  */\n       'h',     'i',     'j',     'k',     'l',     'm',     'n',     'o',\n/* 112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w  */\n       'p',     'q',     'r',     's',     't',     'u',     'v',     'w',\n/* 120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del */\n       'x',     'y',     'z',      0,      '|',      0,      '~',       0 };\n\n\nstatic const int8_t unhex[256] =\n  {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1\n  ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  };\n\n\n#if HTTP_PARSER_STRICT\n# define T 0\n#else\n# define T 1\n#endif\n\n\nstatic const uint8_t normal_url_char[256] = {\n/*   0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel  */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*   8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si   */\n        0,       T,       0,       0,       T,       0,       0,       0,\n/*  16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*  24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us  */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*  32 sp    33  !    34  \"    35  #    36  $    37  %    38  &    39  '  */\n        0,       1,       1,       0,       1,       1,       1,       1,\n/*  40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?  */\n        1,       1,       1,       1,       1,       1,       1,       0,\n/*  64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  88  X    89  Y    90  Z    91  [    92  \\    93  ]    94  ^    95  _  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/* 104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/* 112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/* 120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del */\n        1,       1,       1,       1,       1,       1,       1,       0, };\n\n#undef T\n\nenum state\n  { s_dead = 1 /* important that this is > 0 */\n\n  , s_start_req_or_res\n  , s_res_or_resp_H\n  , s_start_res\n  , s_res_H\n  , s_res_HT\n  , s_res_HTT\n  , s_res_HTTP\n  , s_res_first_http_major\n  , s_res_http_major\n  , s_res_first_http_minor\n  , s_res_http_minor\n  , s_res_first_status_code\n  , s_res_status_code\n  , s_res_status\n  , s_res_line_almost_done\n\n  , s_start_req\n\n  , s_req_method\n  , s_req_spaces_before_url\n  , s_req_schema\n  , s_req_schema_slash\n  , s_req_schema_slash_slash\n  , s_req_host_start\n  , s_req_host_v6_start\n  , s_req_host_v6\n  , s_req_host_v6_end\n  , s_req_host\n  , s_req_port_start\n  , s_req_port\n  , s_req_path\n  , s_req_query_string_start\n  , s_req_query_string\n  , s_req_fragment_start\n  , s_req_fragment\n  , s_req_http_start\n  , s_req_http_H\n  , s_req_http_HT\n  , s_req_http_HTT\n  , s_req_http_HTTP\n  , s_req_first_http_major\n  , s_req_http_major\n  , s_req_first_http_minor\n  , s_req_http_minor\n  , s_req_line_almost_done\n\n  , s_header_field_start\n  , s_header_field\n  , s_header_value_start\n  , s_header_value\n  , s_header_value_lws\n\n  , s_header_almost_done\n\n  , s_chunk_size_start\n  , s_chunk_size\n  , s_chunk_parameters\n  , s_chunk_size_almost_done\n\n  , s_headers_almost_done\n  , s_headers_done\n\n  /* Important: 's_headers_done' must be the last 'header' state. All\n   * states beyond this must be 'body' states. It is used for overflow\n   * checking. See the PARSING_HEADER() macro.\n   */\n\n  , s_chunk_data\n  , s_chunk_data_almost_done\n  , s_chunk_data_done\n\n  , s_body_identity\n  , s_body_identity_eof\n\n  , s_message_done\n  };\n\n\n#define PARSING_HEADER(state) (state <= s_headers_done)\n\n\nenum header_states\n  { h_general = 0\n  , h_C\n  , h_CO\n  , h_CON\n\n  , h_matching_connection\n  , h_matching_proxy_connection\n  , h_matching_content_length\n  , h_matching_transfer_encoding\n  , h_matching_upgrade\n\n  , h_connection\n  , h_content_length\n  , h_transfer_encoding\n  , h_upgrade\n\n  , h_matching_transfer_encoding_chunked\n  , h_matching_connection_keep_alive\n  , h_matching_connection_close\n\n  , h_transfer_encoding_chunked\n  , h_connection_keep_alive\n  , h_connection_close\n  };\n\n\n/* Macros for character classes; depends on strict-mode  */\n#define CR                  '\\r'\n#define LF                  '\\n'\n#define LOWER(c)            (unsigned char)(c | 0x20)\n#define IS_ALPHA(c)         (LOWER(c) >= 'a' && LOWER(c) <= 'z')\n#define IS_NUM(c)           ((c) >= '0' && (c) <= '9')\n#define IS_ALPHANUM(c)      (IS_ALPHA(c) || IS_NUM(c))\n#define IS_HEX(c)           (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f'))\n\n#if HTTP_PARSER_STRICT\n#define TOKEN(c)            (tokens[(unsigned char)c])\n#define IS_URL_CHAR(c)      (normal_url_char[(unsigned char) (c)])\n#define IS_HOST_CHAR(c)     (IS_ALPHANUM(c) || (c) == '.' || (c) == '-')\n#else\n#define TOKEN(c)            ((c == ' ') ? ' ' : tokens[(unsigned char)c])\n#define IS_URL_CHAR(c)                                                         \\\n  (normal_url_char[(unsigned char) (c)] || ((c) & 0x80))\n#define IS_HOST_CHAR(c)                                                        \\\n  (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_')\n#endif\n\n\n#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)\n\n\n#if HTTP_PARSER_STRICT\n# define STRICT_CHECK(cond)                                          \\\ndo {                                                                 \\\n  if (cond) {                                                        \\\n    SET_ERRNO(HPE_STRICT);                                           \\\n    goto error;                                                      \\\n  }                                                                  \\\n} while (0)\n# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead)\n#else\n# define STRICT_CHECK(cond)\n# define NEW_MESSAGE() start_state\n#endif\n\n\n/* Map errno values to strings for human-readable output */\n#define HTTP_STRERROR_GEN(n, s) { \"HPE_\" #n, s },\nstatic struct {\n  const char *name;\n  const char *description;\n} http_strerror_tab[] = {\n  HTTP_ERRNO_MAP(HTTP_STRERROR_GEN)\n};\n#undef HTTP_STRERROR_GEN\n\nint http_message_needs_eof(http_parser *parser);\n\n/* Our URL parser.\n *\n * This is designed to be shared by http_parser_execute() for URL validation,\n * hence it has a state transition + byte-for-byte interface. In addition, it\n * is meant to be embedded in http_parser_parse_url(), which does the dirty\n * work of turning state transitions URL components for its API.\n *\n * This function should only be invoked with non-space characters. It is\n * assumed that the caller cares about (and can detect) the transition between\n * URL and non-URL states by looking for these.\n */\nstatic enum state\nparse_url_char(enum state s, const char ch)\n{\n  if (ch == ' ' || ch == '\\r' || ch == '\\n') {\n    return s_dead;\n  }\n\n#if HTTP_PARSER_STRICT\n  if (ch == '\\t' || ch == '\\f') {\n    return s_dead;\n  }\n#endif\n\n  switch (s) {\n    case s_req_spaces_before_url:\n      /* Proxied requests are followed by scheme of an absolute URI (alpha).\n       * All methods except CONNECT are followed by '/' or '*'.\n       */\n\n      if (ch == '/' || ch == '*') {\n        return s_req_path;\n      }\n\n      if (IS_ALPHA(ch)) {\n        return s_req_schema;\n      }\n\n      break;\n\n    case s_req_schema:\n      if (IS_ALPHA(ch)) {\n        return s;\n      }\n\n      if (ch == ':') {\n        return s_req_schema_slash;\n      }\n\n      break;\n\n    case s_req_schema_slash:\n      if (ch == '/') {\n        return s_req_schema_slash_slash;\n      }\n\n      break;\n\n    case s_req_schema_slash_slash:\n      if (ch == '/') {\n        return s_req_host_start;\n      }\n\n      break;\n\n    case s_req_host_start:\n      if (ch == '[') {\n        return s_req_host_v6_start;\n      }\n\n      if (IS_HOST_CHAR(ch)) {\n        return s_req_host;\n      }\n\n      break;\n\n    case s_req_host:\n      if (IS_HOST_CHAR(ch)) {\n        return s_req_host;\n      }\n\n      /* FALLTHROUGH */\n    case s_req_host_v6_end:\n      switch (ch) {\n        case ':':\n          return s_req_port_start;\n\n        case '/':\n          return s_req_path;\n\n        case '?':\n          return s_req_query_string_start;\n      }\n\n      break;\n\n    case s_req_host_v6:\n      if (ch == ']') {\n        return s_req_host_v6_end;\n      }\n\n      /* FALLTHROUGH */\n    case s_req_host_v6_start:\n      if (IS_HEX(ch) || ch == ':') {\n        return s_req_host_v6;\n      }\n      break;\n\n    case s_req_port:\n      switch (ch) {\n        case '/':\n          return s_req_path;\n\n        case '?':\n          return s_req_query_string_start;\n      }\n\n      /* FALLTHROUGH */\n    case s_req_port_start:\n      if (IS_NUM(ch)) {\n        return s_req_port;\n      }\n\n      break;\n\n    case s_req_path:\n      if (IS_URL_CHAR(ch)) {\n        return s;\n      }\n\n      switch (ch) {\n        case '?':\n          return s_req_query_string_start;\n\n        case '#':\n          return s_req_fragment_start;\n      }\n\n      break;\n\n    case s_req_query_string_start:\n    case s_req_query_string:\n      if (IS_URL_CHAR(ch)) {\n        return s_req_query_string;\n      }\n\n      switch (ch) {\n        case '?':\n          /* allow extra '?' in query string */\n          return s_req_query_string;\n\n        case '#':\n          return s_req_fragment_start;\n      }\n\n      break;\n\n    case s_req_fragment_start:\n      if (IS_URL_CHAR(ch)) {\n        return s_req_fragment;\n      }\n\n      switch (ch) {\n        case '?':\n          return s_req_fragment;\n\n        case '#':\n          return s;\n      }\n\n      break;\n\n    case s_req_fragment:\n      if (IS_URL_CHAR(ch)) {\n        return s;\n      }\n\n      switch (ch) {\n        case '?':\n        case '#':\n          return s;\n      }\n\n      break;\n\n    default:\n      break;\n  }\n\n  /* We should never fall out of the switch above unless there's an error */\n  return s_dead;\n}\n\nsize_t http_parser_execute (http_parser *parser,\n                            const http_parser_settings *settings,\n                            const char *data,\n                            size_t len)\n{\n  char c, ch;\n  int8_t unhex_val;\n  const char *p = data;\n  const char *header_field_mark = 0;\n  const char *header_value_mark = 0;\n  const char *url_mark = 0;\n  const char *body_mark = 0;\n\n  /* We're in an error state. Don't bother doing anything. */\n  if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {\n    return 0;\n  }\n\n  if (len == 0) {\n    switch (parser->state) {\n      case s_body_identity_eof:\n        /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if\n         * we got paused.\n         */\n        CALLBACK_NOTIFY_NOADVANCE(message_complete);\n        return 0;\n\n      case s_dead:\n      case s_start_req_or_res:\n      case s_start_res:\n      case s_start_req:\n        return 0;\n\n      default:\n        SET_ERRNO(HPE_INVALID_EOF_STATE);\n        return 1;\n    }\n  }\n\n\n  if (parser->state == s_header_field)\n    header_field_mark = data;\n  if (parser->state == s_header_value)\n    header_value_mark = data;\n  switch (parser->state) {\n  case s_req_path:\n  case s_req_schema:\n  case s_req_schema_slash:\n  case s_req_schema_slash_slash:\n  case s_req_host_start:\n  case s_req_host_v6_start:\n  case s_req_host_v6:\n  case s_req_host_v6_end:\n  case s_req_host:\n  case s_req_port_start:\n  case s_req_port:\n  case s_req_query_string_start:\n  case s_req_query_string:\n  case s_req_fragment_start:\n  case s_req_fragment:\n    url_mark = data;\n    break;\n  }\n\n  for (p=data; p != data + len; p++) {\n    ch = *p;\n\n    if (PARSING_HEADER(parser->state)) {\n      ++parser->nread;\n      /* Buffer overflow attack */\n      if (parser->nread > HTTP_MAX_HEADER_SIZE) {\n        SET_ERRNO(HPE_HEADER_OVERFLOW);\n        goto error;\n      }\n    }\n\n    reexecute_byte:\n    switch (parser->state) {\n\n      case s_dead:\n        /* this state is used after a 'Connection: close' message\n         * the parser will error out if it reads another message\n         */\n        if (ch == CR || ch == LF)\n          break;\n\n        SET_ERRNO(HPE_CLOSED_CONNECTION);\n        goto error;\n\n      case s_start_req_or_res:\n      {\n        if (ch == CR || ch == LF)\n          break;\n        parser->flags = 0;\n        parser->content_length = ULLONG_MAX;\n\n        if (ch == 'H') {\n          parser->state = s_res_or_resp_H;\n\n          CALLBACK_NOTIFY(message_begin);\n        } else {\n          parser->type = HTTP_REQUEST;\n          parser->state = s_start_req;\n          goto reexecute_byte;\n        }\n\n        break;\n      }\n\n      case s_res_or_resp_H:\n        if (ch == 'T') {\n          parser->type = HTTP_RESPONSE;\n          parser->state = s_res_HT;\n        } else {\n          if (ch != 'E') {\n            SET_ERRNO(HPE_INVALID_CONSTANT);\n            goto error;\n          }\n\n          parser->type = HTTP_REQUEST;\n          parser->method = HTTP_HEAD;\n          parser->index = 2;\n          parser->state = s_req_method;\n        }\n        break;\n\n      case s_start_res:\n      {\n        parser->flags = 0;\n        parser->content_length = ULLONG_MAX;\n\n        switch (ch) {\n          case 'H':\n            parser->state = s_res_H;\n            break;\n\n          case CR:\n          case LF:\n            break;\n\n          default:\n            SET_ERRNO(HPE_INVALID_CONSTANT);\n            goto error;\n        }\n\n        CALLBACK_NOTIFY(message_begin);\n        break;\n      }\n\n      case s_res_H:\n        STRICT_CHECK(ch != 'T');\n        parser->state = s_res_HT;\n        break;\n\n      case s_res_HT:\n        STRICT_CHECK(ch != 'T');\n        parser->state = s_res_HTT;\n        break;\n\n      case s_res_HTT:\n        STRICT_CHECK(ch != 'P');\n        parser->state = s_res_HTTP;\n        break;\n\n      case s_res_HTTP:\n        STRICT_CHECK(ch != '/');\n        parser->state = s_res_first_http_major;\n        break;\n\n      case s_res_first_http_major:\n        if (ch < '0' || ch > '9') {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_major = ch - '0';\n        parser->state = s_res_http_major;\n        break;\n\n      /* major HTTP version or dot */\n      case s_res_http_major:\n      {\n        if (ch == '.') {\n          parser->state = s_res_first_http_minor;\n          break;\n        }\n\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_major *= 10;\n        parser->http_major += ch - '0';\n\n        if (parser->http_major > 999) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        break;\n      }\n\n      /* first digit of minor HTTP version */\n      case s_res_first_http_minor:\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_minor = ch - '0';\n        parser->state = s_res_http_minor;\n        break;\n\n      /* minor HTTP version or end of request line */\n      case s_res_http_minor:\n      {\n        if (ch == ' ') {\n          parser->state = s_res_first_status_code;\n          break;\n        }\n\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_minor *= 10;\n        parser->http_minor += ch - '0';\n\n        if (parser->http_minor > 999) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        break;\n      }\n\n      case s_res_first_status_code:\n      {\n        if (!IS_NUM(ch)) {\n          if (ch == ' ') {\n            break;\n          }\n\n          SET_ERRNO(HPE_INVALID_STATUS);\n          goto error;\n        }\n        parser->status_code = ch - '0';\n        parser->state = s_res_status_code;\n        break;\n      }\n\n      case s_res_status_code:\n      {\n        if (!IS_NUM(ch)) {\n          switch (ch) {\n            case ' ':\n              parser->state = s_res_status;\n              break;\n            case CR:\n              parser->state = s_res_line_almost_done;\n              break;\n            case LF:\n              parser->state = s_header_field_start;\n              break;\n            default:\n              SET_ERRNO(HPE_INVALID_STATUS);\n              goto error;\n          }\n          break;\n        }\n\n        parser->status_code *= 10;\n        parser->status_code += ch - '0';\n\n        if (parser->status_code > 999) {\n          SET_ERRNO(HPE_INVALID_STATUS);\n          goto error;\n        }\n\n        break;\n      }\n\n      case s_res_status:\n        /* the human readable status. e.g. \"NOT FOUND\"\n         * we are not humans so just ignore this */\n        if (ch == CR) {\n          parser->state = s_res_line_almost_done;\n          break;\n        }\n\n        if (ch == LF) {\n          parser->state = s_header_field_start;\n          break;\n        }\n        break;\n\n      case s_res_line_almost_done:\n        STRICT_CHECK(ch != LF);\n        parser->state = s_header_field_start;\n        break;\n\n      case s_start_req:\n      {\n        if (ch == CR || ch == LF)\n          break;\n        parser->flags = 0;\n        parser->content_length = ULLONG_MAX;\n\n        if (!IS_ALPHA(ch)) {\n          SET_ERRNO(HPE_INVALID_METHOD);\n          goto error;\n        }\n\n        parser->method = (enum http_method) 0;\n        parser->index = 1;\n        switch (ch) {\n          case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break;\n          case 'D': parser->method = HTTP_DELETE; break;\n          case 'G': parser->method = HTTP_GET; break;\n          case 'H': parser->method = HTTP_HEAD; break;\n          case 'L': parser->method = HTTP_LOCK; break;\n          case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ break;\n          case 'N': parser->method = HTTP_NOTIFY; break;\n          case 'O': parser->method = HTTP_OPTIONS; break;\n          case 'P': parser->method = HTTP_POST;\n            /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */\n            break;\n          case 'R': parser->method = HTTP_REPORT; break;\n          case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break;\n          case 'T': parser->method = HTTP_TRACE; break;\n          case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break;\n          default:\n            SET_ERRNO(HPE_INVALID_METHOD);\n            goto error;\n        }\n        parser->state = s_req_method;\n\n        CALLBACK_NOTIFY(message_begin);\n\n        break;\n      }\n\n      case s_req_method:\n      {\n        const char *matcher;\n        if (ch == '\\0') {\n          SET_ERRNO(HPE_INVALID_METHOD);\n          goto error;\n        }\n\n        matcher = method_strings[parser->method];\n        if (ch == ' ' && matcher[parser->index] == '\\0') {\n          parser->state = s_req_spaces_before_url;\n        } else if (ch == matcher[parser->index]) {\n          ; /* nada */\n        } else if (parser->method == HTTP_CONNECT) {\n          if (parser->index == 1 && ch == 'H') {\n            parser->method = HTTP_CHECKOUT;\n          } else if (parser->index == 2  && ch == 'P') {\n            parser->method = HTTP_COPY;\n          } else {\n            goto error;\n          }\n        } else if (parser->method == HTTP_MKCOL) {\n          if (parser->index == 1 && ch == 'O') {\n            parser->method = HTTP_MOVE;\n          } else if (parser->index == 1 && ch == 'E') {\n            parser->method = HTTP_MERGE;\n          } else if (parser->index == 1 && ch == '-') {\n            parser->method = HTTP_MSEARCH;\n          } else if (parser->index == 2 && ch == 'A') {\n            parser->method = HTTP_MKACTIVITY;\n          } else {\n            goto error;\n          }\n        } else if (parser->method == HTTP_SUBSCRIBE) {\n          if (parser->index == 1 && ch == 'E') {\n            parser->method = HTTP_SEARCH;\n          } else {\n            goto error;\n          }\n        } else if (parser->index == 1 && parser->method == HTTP_POST) {\n          if (ch == 'R') {\n            parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */\n          } else if (ch == 'U') {\n            parser->method = HTTP_PUT; /* or HTTP_PURGE */\n          } else if (ch == 'A') {\n            parser->method = HTTP_PATCH;\n          } else {\n            goto error;\n          }\n        } else if (parser->index == 2) {\n          if (parser->method == HTTP_PUT) {\n            if (ch == 'R') parser->method = HTTP_PURGE;\n          } else if (parser->method == HTTP_UNLOCK) {\n            if (ch == 'S') parser->method = HTTP_UNSUBSCRIBE;\n          }\n        } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') {\n          parser->method = HTTP_PROPPATCH;\n        } else {\n          SET_ERRNO(HPE_INVALID_METHOD);\n          goto error;\n        }\n\n        ++parser->index;\n        break;\n      }\n\n      case s_req_spaces_before_url:\n      {\n        if (ch == ' ') break;\n\n        MARK(url);\n        if (parser->method == HTTP_CONNECT) {\n          parser->state = s_req_host_start;\n        }\n\n        parser->state = parse_url_char((enum state)parser->state, ch);\n        if (parser->state == s_dead) {\n          SET_ERRNO(HPE_INVALID_URL);\n          goto error;\n        }\n\n        break;\n      }\n\n      case s_req_schema:\n      case s_req_schema_slash:\n      case s_req_schema_slash_slash:\n      case s_req_host_start:\n      case s_req_host_v6_start:\n      case s_req_host_v6:\n      case s_req_port_start:\n      {\n        switch (ch) {\n          /* No whitespace allowed here */\n          case ' ':\n          case CR:\n          case LF:\n            SET_ERRNO(HPE_INVALID_URL);\n            goto error;\n          default:\n            parser->state = parse_url_char((enum state)parser->state, ch);\n            if (parser->state == s_dead) {\n              SET_ERRNO(HPE_INVALID_URL);\n              goto error;\n            }\n        }\n\n        break;\n      }\n\n      case s_req_host:\n      case s_req_host_v6_end:\n      case s_req_port:\n      case s_req_path:\n      case s_req_query_string_start:\n      case s_req_query_string:\n      case s_req_fragment_start:\n      case s_req_fragment:\n      {\n        switch (ch) {\n          case ' ':\n            parser->state = s_req_http_start;\n            CALLBACK_DATA(url);\n            break;\n          case CR:\n          case LF:\n            parser->http_major = 0;\n            parser->http_minor = 9;\n            parser->state = (ch == CR) ?\n              s_req_line_almost_done :\n              s_header_field_start;\n            CALLBACK_DATA(url);\n            break;\n          default:\n            parser->state = parse_url_char((enum state)parser->state, ch);\n            if (parser->state == s_dead) {\n              SET_ERRNO(HPE_INVALID_URL);\n              goto error;\n            }\n        }\n        break;\n      }\n\n      case s_req_http_start:\n        switch (ch) {\n          case 'H':\n            parser->state = s_req_http_H;\n            break;\n          case ' ':\n            break;\n          default:\n            SET_ERRNO(HPE_INVALID_CONSTANT);\n            goto error;\n        }\n        break;\n\n      case s_req_http_H:\n        STRICT_CHECK(ch != 'T');\n        parser->state = s_req_http_HT;\n        break;\n\n      case s_req_http_HT:\n        STRICT_CHECK(ch != 'T');\n        parser->state = s_req_http_HTT;\n        break;\n\n      case s_req_http_HTT:\n        STRICT_CHECK(ch != 'P');\n        parser->state = s_req_http_HTTP;\n        break;\n\n      case s_req_http_HTTP:\n        STRICT_CHECK(ch != '/');\n        parser->state = s_req_first_http_major;\n        break;\n\n      /* first digit of major HTTP version */\n      case s_req_first_http_major:\n        if (ch < '1' || ch > '9') {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_major = ch - '0';\n        parser->state = s_req_http_major;\n        break;\n\n      /* major HTTP version or dot */\n      case s_req_http_major:\n      {\n        if (ch == '.') {\n          parser->state = s_req_first_http_minor;\n          break;\n        }\n\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_major *= 10;\n        parser->http_major += ch - '0';\n\n        if (parser->http_major > 999) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        break;\n      }\n\n      /* first digit of minor HTTP version */\n      case s_req_first_http_minor:\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_minor = ch - '0';\n        parser->state = s_req_http_minor;\n        break;\n\n      /* minor HTTP version or end of request line */\n      case s_req_http_minor:\n      {\n        if (ch == CR) {\n          parser->state = s_req_line_almost_done;\n          break;\n        }\n\n        if (ch == LF) {\n          parser->state = s_header_field_start;\n          break;\n        }\n\n        /* XXX allow spaces after digit? */\n\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_minor *= 10;\n        parser->http_minor += ch - '0';\n\n        if (parser->http_minor > 999) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        break;\n      }\n\n      /* end of request line */\n      case s_req_line_almost_done:\n      {\n        if (ch != LF) {\n          SET_ERRNO(HPE_LF_EXPECTED);\n          goto error;\n        }\n\n        parser->state = s_header_field_start;\n        break;\n      }\n\n      case s_header_field_start:\n      {\n        if (ch == CR) {\n          parser->state = s_headers_almost_done;\n          break;\n        }\n\n        if (ch == LF) {\n          /* they might be just sending \\n instead of \\r\\n so this would be\n           * the second \\n to denote the end of headers*/\n          parser->state = s_headers_almost_done;\n          goto reexecute_byte;\n        }\n\n        c = TOKEN(ch);\n\n        if (!c) {\n          SET_ERRNO(HPE_INVALID_HEADER_TOKEN);\n          goto error;\n        }\n\n        MARK(header_field);\n\n        parser->index = 0;\n        parser->state = s_header_field;\n\n        switch (c) {\n          case 'c':\n            parser->header_state = h_C;\n            break;\n\n          case 'p':\n            parser->header_state = h_matching_proxy_connection;\n            break;\n\n          case 't':\n            parser->header_state = h_matching_transfer_encoding;\n            break;\n\n          case 'u':\n            parser->header_state = h_matching_upgrade;\n            break;\n\n          default:\n            parser->header_state = h_general;\n            break;\n        }\n        break;\n      }\n\n      case s_header_field:\n      {\n        c = TOKEN(ch);\n\n        if (c) {\n          switch (parser->header_state) {\n            case h_general:\n              break;\n\n            case h_C:\n              parser->index++;\n              parser->header_state = (c == 'o' ? h_CO : h_general);\n              break;\n\n            case h_CO:\n              parser->index++;\n              parser->header_state = (c == 'n' ? h_CON : h_general);\n              break;\n\n            case h_CON:\n              parser->index++;\n              switch (c) {\n                case 'n':\n                  parser->header_state = h_matching_connection;\n                  break;\n                case 't':\n                  parser->header_state = h_matching_content_length;\n                  break;\n                default:\n                  parser->header_state = h_general;\n                  break;\n              }\n              break;\n\n            /* connection */\n\n            case h_matching_connection:\n              parser->index++;\n              if (parser->index > sizeof(CONNECTION)-1\n                  || c != CONNECTION[parser->index]) {\n                parser->header_state = h_general;\n              } else if (parser->index == sizeof(CONNECTION)-2) {\n                parser->header_state = h_connection;\n              }\n              break;\n\n            /* proxy-connection */\n\n            case h_matching_proxy_connection:\n              parser->index++;\n              if (parser->index > sizeof(PROXY_CONNECTION)-1\n                  || c != PROXY_CONNECTION[parser->index]) {\n                parser->header_state = h_general;\n              } else if (parser->index == sizeof(PROXY_CONNECTION)-2) {\n                parser->header_state = h_connection;\n              }\n              break;\n\n            /* content-length */\n\n            case h_matching_content_length:\n              parser->index++;\n              if (parser->index > sizeof(CONTENT_LENGTH)-1\n                  || c != CONTENT_LENGTH[parser->index]) {\n                parser->header_state = h_general;\n              } else if (parser->index == sizeof(CONTENT_LENGTH)-2) {\n                parser->header_state = h_content_length;\n              }\n              break;\n\n            /* transfer-encoding */\n\n            case h_matching_transfer_encoding:\n              parser->index++;\n              if (parser->index > sizeof(TRANSFER_ENCODING)-1\n                  || c != TRANSFER_ENCODING[parser->index]) {\n                parser->header_state = h_general;\n              } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) {\n                parser->header_state = h_transfer_encoding;\n              }\n              break;\n\n            /* upgrade */\n\n            case h_matching_upgrade:\n              parser->index++;\n              if (parser->index > sizeof(UPGRADE)-1\n                  || c != UPGRADE[parser->index]) {\n                parser->header_state = h_general;\n              } else if (parser->index == sizeof(UPGRADE)-2) {\n                parser->header_state = h_upgrade;\n              }\n              break;\n\n            case h_connection:\n            case h_content_length:\n            case h_transfer_encoding:\n            case h_upgrade:\n              if (ch != ' ') parser->header_state = h_general;\n              break;\n\n            default:\n              assert(0 && \"Unknown header_state\");\n              break;\n          }\n          break;\n        }\n\n        if (ch == ':') {\n          parser->state = s_header_value_start;\n          CALLBACK_DATA(header_field);\n          break;\n        }\n\n        if (ch == CR) {\n          parser->state = s_header_almost_done;\n          CALLBACK_DATA(header_field);\n          break;\n        }\n\n        if (ch == LF) {\n          parser->state = s_header_field_start;\n          CALLBACK_DATA(header_field);\n          break;\n        }\n\n        SET_ERRNO(HPE_INVALID_HEADER_TOKEN);\n        goto error;\n      }\n\n      case s_header_value_start:\n      {\n        if (ch == ' ' || ch == '\\t') break;\n\n        MARK(header_value);\n\n        parser->state = s_header_value;\n        parser->index = 0;\n\n        if (ch == CR) {\n          parser->header_state = h_general;\n          parser->state = s_header_almost_done;\n          CALLBACK_DATA(header_value);\n          break;\n        }\n\n        if (ch == LF) {\n          parser->state = s_header_field_start;\n          CALLBACK_DATA(header_value);\n          break;\n        }\n\n        c = LOWER(ch);\n\n        switch (parser->header_state) {\n          case h_upgrade:\n            parser->flags |= F_UPGRADE;\n            parser->header_state = h_general;\n            break;\n\n          case h_transfer_encoding:\n            /* looking for 'Transfer-Encoding: chunked' */\n            if ('c' == c) {\n              parser->header_state = h_matching_transfer_encoding_chunked;\n            } else {\n              parser->header_state = h_general;\n            }\n            break;\n\n          case h_content_length:\n            if (!IS_NUM(ch)) {\n              SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);\n              goto error;\n            }\n\n            parser->content_length = ch - '0';\n            break;\n\n          case h_connection:\n            /* looking for 'Connection: keep-alive' */\n            if (c == 'k') {\n              parser->header_state = h_matching_connection_keep_alive;\n            /* looking for 'Connection: close' */\n            } else if (c == 'c') {\n              parser->header_state = h_matching_connection_close;\n            } else {\n              parser->header_state = h_general;\n            }\n            break;\n\n          default:\n            parser->header_state = h_general;\n            break;\n        }\n        break;\n      }\n\n      case s_header_value:\n      {\n\n        if (ch == CR) {\n          parser->state = s_header_almost_done;\n          CALLBACK_DATA(header_value);\n          break;\n        }\n\n        if (ch == LF) {\n          parser->state = s_header_almost_done;\n          CALLBACK_DATA_NOADVANCE(header_value);\n          goto reexecute_byte;\n        }\n\n        c = LOWER(ch);\n\n        switch (parser->header_state) {\n          case h_general:\n            break;\n\n          case h_connection:\n          case h_transfer_encoding:\n            assert(0 && \"Shouldn't get here.\");\n            break;\n\n          case h_content_length:\n          {\n            uint64_t t;\n\n            if (ch == ' ') break;\n\n            if (!IS_NUM(ch)) {\n              SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);\n              goto error;\n            }\n\n            t = parser->content_length;\n            t *= 10;\n            t += ch - '0';\n\n            /* Overflow? */\n            if (t < parser->content_length || t == ULLONG_MAX) {\n              SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);\n              goto error;\n            }\n\n            parser->content_length = t;\n            break;\n          }\n\n          /* Transfer-Encoding: chunked */\n          case h_matching_transfer_encoding_chunked:\n            parser->index++;\n            if (parser->index > sizeof(CHUNKED)-1\n                || c != CHUNKED[parser->index]) {\n              parser->header_state = h_general;\n            } else if (parser->index == sizeof(CHUNKED)-2) {\n              parser->header_state = h_transfer_encoding_chunked;\n            }\n            break;\n\n          /* looking for 'Connection: keep-alive' */\n          case h_matching_connection_keep_alive:\n            parser->index++;\n            if (parser->index > sizeof(KEEP_ALIVE)-1\n                || c != KEEP_ALIVE[parser->index]) {\n              parser->header_state = h_general;\n            } else if (parser->index == sizeof(KEEP_ALIVE)-2) {\n              parser->header_state = h_connection_keep_alive;\n            }\n            break;\n\n          /* looking for 'Connection: close' */\n          case h_matching_connection_close:\n            parser->index++;\n            if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) {\n              parser->header_state = h_general;\n            } else if (parser->index == sizeof(CLOSE)-2) {\n              parser->header_state = h_connection_close;\n            }\n            break;\n\n          case h_transfer_encoding_chunked:\n          case h_connection_keep_alive:\n          case h_connection_close:\n            if (ch != ' ') parser->header_state = h_general;\n            break;\n\n          default:\n            parser->state = s_header_value;\n            parser->header_state = h_general;\n            break;\n        }\n        break;\n      }\n\n      case s_header_almost_done:\n      {\n        STRICT_CHECK(ch != LF);\n\n        parser->state = s_header_value_lws;\n\n        switch (parser->header_state) {\n          case h_connection_keep_alive:\n            parser->flags |= F_CONNECTION_KEEP_ALIVE;\n            break;\n          case h_connection_close:\n            parser->flags |= F_CONNECTION_CLOSE;\n            break;\n          case h_transfer_encoding_chunked:\n            parser->flags |= F_CHUNKED;\n            break;\n          default:\n            break;\n        }\n\n        break;\n      }\n\n      case s_header_value_lws:\n      {\n        if (ch == ' ' || ch == '\\t')\n          parser->state = s_header_value_start;\n        else\n        {\n          parser->state = s_header_field_start;\n          goto reexecute_byte;\n        }\n        break;\n      }\n\n      case s_headers_almost_done:\n      {\n        STRICT_CHECK(ch != LF);\n\n        if (parser->flags & F_TRAILING) {\n          /* End of a chunked request */\n          parser->state = NEW_MESSAGE();\n          CALLBACK_NOTIFY(message_complete);\n          break;\n        }\n\n        parser->state = s_headers_done;\n\n        /* Set this here so that on_headers_complete() callbacks can see it */\n        parser->upgrade =\n          (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT);\n\n        /* Here we call the headers_complete callback. This is somewhat\n         * different than other callbacks because if the user returns 1, we\n         * will interpret that as saying that this message has no body. This\n         * is needed for the annoying case of recieving a response to a HEAD\n         * request.\n         *\n         * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so\n         * we have to simulate it by handling a change in errno below.\n         */\n        if (settings->on_headers_complete) {\n          switch (settings->on_headers_complete(parser)) {\n            case 0:\n              break;\n\n            case 1:\n              parser->flags |= F_SKIPBODY;\n              break;\n\n            default:\n              SET_ERRNO(HPE_CB_headers_complete);\n              return p - data; /* Error */\n          }\n        }\n\n        if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {\n          return p - data;\n        }\n\n        goto reexecute_byte;\n      }\n\n      case s_headers_done:\n      {\n        STRICT_CHECK(ch != LF);\n\n        parser->nread = 0;\n\n        /* Exit, the rest of the connect is in a different protocol. */\n        if (parser->upgrade) {\n          parser->state = NEW_MESSAGE();\n          CALLBACK_NOTIFY(message_complete);\n          return (p - data) + 1;\n        }\n\n        if (parser->flags & F_SKIPBODY) {\n          parser->state = NEW_MESSAGE();\n          CALLBACK_NOTIFY(message_complete);\n        } else if (parser->flags & F_CHUNKED) {\n          /* chunked encoding - ignore Content-Length header */\n          parser->state = s_chunk_size_start;\n        } else {\n          if (parser->content_length == 0) {\n            /* Content-Length header given but zero: Content-Length: 0\\r\\n */\n            parser->state = NEW_MESSAGE();\n            CALLBACK_NOTIFY(message_complete);\n          } else if (parser->content_length != ULLONG_MAX) {\n            /* Content-Length header given and non-zero */\n            parser->state = s_body_identity;\n          } else {\n            if (parser->type == HTTP_REQUEST ||\n                !http_message_needs_eof(parser)) {\n              /* Assume content-length 0 - read the next */\n              parser->state = NEW_MESSAGE();\n              CALLBACK_NOTIFY(message_complete);\n            } else {\n              /* Read body until EOF */\n              parser->state = s_body_identity_eof;\n            }\n          }\n        }\n\n        break;\n      }\n\n      case s_body_identity:\n      {\n        uint64_t to_read = MIN(parser->content_length,\n                               (uint64_t) ((data + len) - p));\n\n        assert(parser->content_length != 0\n            && parser->content_length != ULLONG_MAX);\n\n        /* The difference between advancing content_length and p is because\n         * the latter will automaticaly advance on the next loop iteration.\n         * Further, if content_length ends up at 0, we want to see the last\n         * byte again for our message complete callback.\n         */\n        MARK(body);\n        parser->content_length -= to_read;\n        p += to_read - 1;\n\n        if (parser->content_length == 0) {\n          parser->state = s_message_done;\n\n          /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte.\n           *\n           * The alternative to doing this is to wait for the next byte to\n           * trigger the data callback, just as in every other case. The\n           * problem with this is that this makes it difficult for the test\n           * harness to distinguish between complete-on-EOF and\n           * complete-on-length. It's not clear that this distinction is\n           * important for applications, but let's keep it for now.\n           */\n          CALLBACK_DATA_(body, p - body_mark + 1, p - data);\n          goto reexecute_byte;\n        }\n\n        break;\n      }\n\n      /* read until EOF */\n      case s_body_identity_eof:\n        MARK(body);\n        p = data + len - 1;\n\n        break;\n\n      case s_message_done:\n        parser->state = NEW_MESSAGE();\n        CALLBACK_NOTIFY(message_complete);\n        break;\n\n      case s_chunk_size_start:\n      {\n        assert(parser->nread == 1);\n        assert(parser->flags & F_CHUNKED);\n\n        unhex_val = unhex[(unsigned char)ch];\n        if (unhex_val == -1) {\n          SET_ERRNO(HPE_INVALID_CHUNK_SIZE);\n          goto error;\n        }\n\n        parser->content_length = unhex_val;\n        parser->state = s_chunk_size;\n        break;\n      }\n\n      case s_chunk_size:\n      {\n        uint64_t t;\n\n        assert(parser->flags & F_CHUNKED);\n\n        if (ch == CR) {\n          parser->state = s_chunk_size_almost_done;\n          break;\n        }\n\n        unhex_val = unhex[(unsigned char)ch];\n\n        if (unhex_val == -1) {\n          if (ch == ';' || ch == ' ') {\n            parser->state = s_chunk_parameters;\n            break;\n          }\n\n          SET_ERRNO(HPE_INVALID_CHUNK_SIZE);\n          goto error;\n        }\n\n        t = parser->content_length;\n        t *= 16;\n        t += unhex_val;\n\n        /* Overflow? */\n        if (t < parser->content_length || t == ULLONG_MAX) {\n          SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);\n          goto error;\n        }\n\n        parser->content_length = t;\n        break;\n      }\n\n      case s_chunk_parameters:\n      {\n        assert(parser->flags & F_CHUNKED);\n        /* just ignore this shit. TODO check for overflow */\n        if (ch == CR) {\n          parser->state = s_chunk_size_almost_done;\n          break;\n        }\n        break;\n      }\n\n      case s_chunk_size_almost_done:\n      {\n        assert(parser->flags & F_CHUNKED);\n        STRICT_CHECK(ch != LF);\n\n        parser->nread = 0;\n\n        if (parser->content_length == 0) {\n          parser->flags |= F_TRAILING;\n          parser->state = s_header_field_start;\n        } else {\n          parser->state = s_chunk_data;\n        }\n        break;\n      }\n\n      case s_chunk_data:\n      {\n        uint64_t to_read = MIN(parser->content_length,\n                               (uint64_t) ((data + len) - p));\n\n        assert(parser->flags & F_CHUNKED);\n        assert(parser->content_length != 0\n            && parser->content_length != ULLONG_MAX);\n\n        /* See the explanation in s_body_identity for why the content\n         * length and data pointers are managed this way.\n         */\n        MARK(body);\n        parser->content_length -= to_read;\n        p += to_read - 1;\n\n        if (parser->content_length == 0) {\n          parser->state = s_chunk_data_almost_done;\n        }\n\n        break;\n      }\n\n      case s_chunk_data_almost_done:\n        assert(parser->flags & F_CHUNKED);\n        assert(parser->content_length == 0);\n        STRICT_CHECK(ch != CR);\n        parser->state = s_chunk_data_done;\n        CALLBACK_DATA(body);\n        break;\n\n      case s_chunk_data_done:\n        assert(parser->flags & F_CHUNKED);\n        STRICT_CHECK(ch != LF);\n        parser->nread = 0;\n        parser->state = s_chunk_size_start;\n        break;\n\n      default:\n        assert(0 && \"unhandled state\");\n        SET_ERRNO(HPE_INVALID_INTERNAL_STATE);\n        goto error;\n    }\n  }\n\n  /* Run callbacks for any marks that we have leftover after we ran our of\n   * bytes. There should be at most one of these set, so it's OK to invoke\n   * them in series (unset marks will not result in callbacks).\n   *\n   * We use the NOADVANCE() variety of callbacks here because 'p' has already\n   * overflowed 'data' and this allows us to correct for the off-by-one that\n   * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p'\n   * value that's in-bounds).\n   */\n\n  assert(((header_field_mark ? 1 : 0) +\n          (header_value_mark ? 1 : 0) +\n          (url_mark ? 1 : 0)  +\n          (body_mark ? 1 : 0)) <= 1);\n\n  CALLBACK_DATA_NOADVANCE(header_field);\n  CALLBACK_DATA_NOADVANCE(header_value);\n  CALLBACK_DATA_NOADVANCE(url);\n  CALLBACK_DATA_NOADVANCE(body);\n\n  return len;\n\nerror:\n  if (HTTP_PARSER_ERRNO(parser) == HPE_OK) {\n    SET_ERRNO(HPE_UNKNOWN);\n  }\n\n  return (p - data);\n}\n\n\n/* Does the parser need to see an EOF to find the end of the message? */\nint\nhttp_message_needs_eof (http_parser *parser)\n{\n  if (parser->type == HTTP_REQUEST) {\n    return 0;\n  }\n\n  /* See RFC 2616 section 4.4 */\n  if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */\n      parser->status_code == 204 ||     /* No Content */\n      parser->status_code == 304 ||     /* Not Modified */\n      parser->flags & F_SKIPBODY) {     /* response to a HEAD request */\n    return 0;\n  }\n\n  if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) {\n    return 0;\n  }\n\n  return 1;\n}\n\n\nint\nhttp_should_keep_alive (http_parser *parser)\n{\n  if (parser->http_major > 0 && parser->http_minor > 0) {\n    /* HTTP/1.1 */\n    if (parser->flags & F_CONNECTION_CLOSE) {\n      return 0;\n    }\n  } else {\n    /* HTTP/1.0 or earlier */\n    if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) {\n      return 0;\n    }\n  }\n\n  return !http_message_needs_eof(parser);\n}\n\n\nconst char * http_method_str (enum http_method m)\n{\n  return method_strings[m];\n}\n\n\nvoid\nhttp_parser_init (http_parser *parser, enum http_parser_type t)\n{\n  void *data = parser->data; /* preserve application data */\n  memset(parser, 0, sizeof(*parser));\n  parser->data = data;\n  parser->type = t;\n  parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res));\n  parser->http_errno = HPE_OK;\n}\n\nconst char *\nhttp_errno_name(enum http_errno err) {\n  assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0])));\n  return http_strerror_tab[err].name;\n}\n\nconst char *\nhttp_errno_description(enum http_errno err) {\n  assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0])));\n  return http_strerror_tab[err].description;\n}\n\nint\nhttp_parser_parse_url(const char *buf, size_t buflen, int is_connect,\n                      struct http_parser_url *u)\n{\n  enum state s;\n  const char *p;\n  enum http_parser_url_fields uf, old_uf;\n\n  u->port = u->field_set = 0;\n  s = is_connect ? s_req_host_start : s_req_spaces_before_url;\n  uf = old_uf = UF_MAX;\n\n  for (p = buf; p < buf + buflen; p++) {\n    s = parse_url_char(s, *p);\n\n    /* Figure out the next field that we're operating on */\n    switch (s) {\n      case s_dead:\n        return 1;\n\n      /* Skip delimeters */\n      case s_req_schema_slash:\n      case s_req_schema_slash_slash:\n      case s_req_host_start:\n      case s_req_host_v6_start:\n      case s_req_host_v6_end:\n      case s_req_port_start:\n      case s_req_query_string_start:\n      case s_req_fragment_start:\n        continue;\n\n      case s_req_schema:\n        uf = UF_SCHEMA;\n        break;\n\n      case s_req_host:\n      case s_req_host_v6:\n        uf = UF_HOST;\n        break;\n\n      case s_req_port:\n        uf = UF_PORT;\n        break;\n\n      case s_req_path:\n        uf = UF_PATH;\n        break;\n\n      case s_req_query_string:\n        uf = UF_QUERY;\n        break;\n\n      case s_req_fragment:\n        uf = UF_FRAGMENT;\n        break;\n\n      default:\n        assert(!\"Unexpected state\");\n        return 1;\n    }\n\n    /* Nothing's changed; soldier on */\n    if (uf == old_uf) {\n      u->field_data[uf].len++;\n      continue;\n    }\n\n    u->field_data[uf].off = p - buf;\n    u->field_data[uf].len = 1;\n\n    u->field_set |= (1 << uf);\n    old_uf = uf;\n  }\n\n  /* CONNECT requests can only contain \"hostname:port\" */\n  if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) {\n    return 1;\n  }\n\n  /* Make sure we don't end somewhere unexpected */\n  switch (s) {\n  case s_req_host_v6_start:\n  case s_req_host_v6:\n  case s_req_host_v6_end:\n  case s_req_host:\n  case s_req_port_start:\n    return 1;\n  default:\n    break;\n  }\n\n  if (u->field_set & (1 << UF_PORT)) {\n    /* Don't bother with endp; we've already validated the string */\n    unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10);\n\n    /* Ports have a max value of 2^16 */\n    if (v > 0xffff) {\n      return 1;\n    }\n\n    u->port = (uint16_t) v;\n  }\n\n  return 0;\n}\n\nvoid\nhttp_parser_pause(http_parser *parser, int paused) {\n  /* Users should only be pausing/unpausing a parser that is not in an error\n   * state. In non-debug builds, there's not much that we can do about this\n   * other than ignore it.\n   */\n  if (HTTP_PARSER_ERRNO(parser) == HPE_OK ||\n      HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) {\n    SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK);\n  } else {\n    assert(0 && \"Attempting to pause parser in error state\");\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/http_parser.h",
    "content": "/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n#ifndef http_parser_h\n#define http_parser_h\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define HTTP_PARSER_VERSION_MAJOR 1\n#define HTTP_PARSER_VERSION_MINOR 0\n\n#include <sys/types.h>\n#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600)\ntypedef __int8 int8_t;\ntypedef unsigned __int8 uint8_t;\ntypedef __int16 int16_t;\ntypedef unsigned __int16 uint16_t;\ntypedef __int32 int32_t;\ntypedef unsigned __int32 uint32_t;\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n\ntypedef unsigned int size_t;\ntypedef int ssize_t;\n#else\n#include <stdint.h>\n#endif\n\n/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run\n * faster\n */\n#ifndef HTTP_PARSER_STRICT\n# define HTTP_PARSER_STRICT 1\n#endif\n\n/* Compile with -DHTTP_PARSER_DEBUG=1 to add extra debugging information to\n * the error reporting facility.\n */\n#ifndef HTTP_PARSER_DEBUG\n# define HTTP_PARSER_DEBUG 0\n#endif\n\n\n/* Maximium header size allowed */\n#define HTTP_MAX_HEADER_SIZE (80*1024)\n\n\ntypedef struct http_parser http_parser;\ntypedef struct http_parser_settings http_parser_settings;\n\n\n/* Callbacks should return non-zero to indicate an error. The parser will\n * then halt execution.\n *\n * The one exception is on_headers_complete. In a HTTP_RESPONSE parser\n * returning '1' from on_headers_complete will tell the parser that it\n * should not expect a body. This is used when receiving a response to a\n * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding:\n * chunked' headers that indicate the presence of a body.\n *\n * http_data_cb does not return data chunks. It will be call arbitrarally\n * many times for each string. E.G. you might get 10 callbacks for \"on_path\"\n * each providing just a few characters more data.\n */\ntypedef int (*http_data_cb) (http_parser*, const char *at, size_t length);\ntypedef int (*http_cb) (http_parser*);\n\n\n/* Request Methods */\n#define HTTP_METHOD_MAP(XX)         \\\n  XX(0,  DELETE,      DELETE)       \\\n  XX(1,  GET,         GET)          \\\n  XX(2,  HEAD,        HEAD)         \\\n  XX(3,  POST,        POST)         \\\n  XX(4,  PUT,         PUT)          \\\n  /* pathological */                \\\n  XX(5,  CONNECT,     CONNECT)      \\\n  XX(6,  OPTIONS,     OPTIONS)      \\\n  XX(7,  TRACE,       TRACE)        \\\n  /* webdav */                      \\\n  XX(8,  COPY,        COPY)         \\\n  XX(9,  LOCK,        LOCK)         \\\n  XX(10, MKCOL,       MKCOL)        \\\n  XX(11, MOVE,        MOVE)         \\\n  XX(12, PROPFIND,    PROPFIND)     \\\n  XX(13, PROPPATCH,   PROPPATCH)    \\\n  XX(14, SEARCH,      SEARCH)       \\\n  XX(15, UNLOCK,      UNLOCK)       \\\n  /* subversion */                  \\\n  XX(16, REPORT,      REPORT)       \\\n  XX(17, MKACTIVITY,  MKACTIVITY)   \\\n  XX(18, CHECKOUT,    CHECKOUT)     \\\n  XX(19, MERGE,       MERGE)        \\\n  /* upnp */                        \\\n  XX(20, MSEARCH,     M-SEARCH)     \\\n  XX(21, NOTIFY,      NOTIFY)       \\\n  XX(22, SUBSCRIBE,   SUBSCRIBE)    \\\n  XX(23, UNSUBSCRIBE, UNSUBSCRIBE)  \\\n  /* RFC-5789 */                    \\\n  XX(24, PATCH,       PATCH)        \\\n  XX(25, PURGE,       PURGE)        \\\n\nenum http_method\n  {\n#define XX(num, name, string) HTTP_##name = num,\n  HTTP_METHOD_MAP(XX)\n#undef XX\n  };\n\n\nenum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH };\n\n\n/* Flag values for http_parser.flags field */\nenum flags\n  { F_CHUNKED               = 1 << 0\n  , F_CONNECTION_KEEP_ALIVE = 1 << 1\n  , F_CONNECTION_CLOSE      = 1 << 2\n  , F_TRAILING              = 1 << 3\n  , F_UPGRADE               = 1 << 4\n  , F_SKIPBODY              = 1 << 5\n  };\n\n\n/* Map for errno-related constants\n * \n * The provided argument should be a macro that takes 2 arguments.\n */\n#define HTTP_ERRNO_MAP(XX)                                           \\\n  /* No error */                                                     \\\n  XX(OK, \"success\")                                                  \\\n                                                                     \\\n  /* Callback-related errors */                                      \\\n  XX(CB_message_begin, \"the on_message_begin callback failed\")       \\\n  XX(CB_url, \"the on_url callback failed\")                           \\\n  XX(CB_header_field, \"the on_header_field callback failed\")         \\\n  XX(CB_header_value, \"the on_header_value callback failed\")         \\\n  XX(CB_headers_complete, \"the on_headers_complete callback failed\") \\\n  XX(CB_body, \"the on_body callback failed\")                         \\\n  XX(CB_message_complete, \"the on_message_complete callback failed\") \\\n                                                                     \\\n  /* Parsing-related errors */                                       \\\n  XX(INVALID_EOF_STATE, \"stream ended at an unexpected time\")        \\\n  XX(HEADER_OVERFLOW,                                                \\\n     \"too many header bytes seen; overflow detected\")                \\\n  XX(CLOSED_CONNECTION,                                              \\\n     \"data received after completed connection: close message\")      \\\n  XX(INVALID_VERSION, \"invalid HTTP version\")                        \\\n  XX(INVALID_STATUS, \"invalid HTTP status code\")                     \\\n  XX(INVALID_METHOD, \"invalid HTTP method\")                          \\\n  XX(INVALID_URL, \"invalid URL\")                                     \\\n  XX(INVALID_HOST, \"invalid host\")                                   \\\n  XX(INVALID_PORT, \"invalid port\")                                   \\\n  XX(INVALID_PATH, \"invalid path\")                                   \\\n  XX(INVALID_QUERY_STRING, \"invalid query string\")                   \\\n  XX(INVALID_FRAGMENT, \"invalid fragment\")                           \\\n  XX(LF_EXPECTED, \"LF character expected\")                           \\\n  XX(INVALID_HEADER_TOKEN, \"invalid character in header\")            \\\n  XX(INVALID_CONTENT_LENGTH,                                         \\\n     \"invalid character in content-length header\")                   \\\n  XX(INVALID_CHUNK_SIZE,                                             \\\n     \"invalid character in chunk size header\")                       \\\n  XX(INVALID_CONSTANT, \"invalid constant string\")                    \\\n  XX(INVALID_INTERNAL_STATE, \"encountered unexpected internal state\")\\\n  XX(STRICT, \"strict mode assertion failed\")                         \\\n  XX(PAUSED, \"parser is paused\")                                     \\\n  XX(UNKNOWN, \"an unknown error occurred\")\n\n\n/* Define HPE_* values for each errno value above */\n#define HTTP_ERRNO_GEN(n, s) HPE_##n,\nenum http_errno {\n  HTTP_ERRNO_MAP(HTTP_ERRNO_GEN)\n};\n#undef HTTP_ERRNO_GEN\n\n\n/* Get an http_errno value from an http_parser */\n#define HTTP_PARSER_ERRNO(p)            ((enum http_errno) (p)->http_errno)\n\n/* Get the line number that generated the current error */\n#if HTTP_PARSER_DEBUG\n#define HTTP_PARSER_ERRNO_LINE(p)       ((p)->error_lineno)\n#else\n#define HTTP_PARSER_ERRNO_LINE(p)       0\n#endif\n\n\nstruct http_parser {\n  /** PRIVATE **/\n  unsigned char type : 2;     /* enum http_parser_type */\n  unsigned char flags : 6;    /* F_* values from 'flags' enum; semi-public */\n  unsigned char state;        /* enum state from http_parser.c */\n  unsigned char header_state; /* enum header_state from http_parser.c */\n  unsigned char index;        /* index into current matcher */\n\n  uint32_t nread;          /* # bytes read in various scenarios */\n  uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */\n\n  /** READ-ONLY **/\n  unsigned short http_major;\n  unsigned short http_minor;\n  unsigned short status_code; /* responses only */\n  unsigned char method;       /* requests only */\n  unsigned char http_errno : 7;\n\n  /* 1 = Upgrade header was present and the parser has exited because of that.\n   * 0 = No upgrade header present.\n   * Should be checked when http_parser_execute() returns in addition to\n   * error checking.\n   */\n  unsigned char upgrade : 1;\n\n#if HTTP_PARSER_DEBUG\n  uint32_t error_lineno;\n#endif\n\n  /** PUBLIC **/\n  void *data; /* A pointer to get hook to the \"connection\" or \"socket\" object */\n};\n\n\nstruct http_parser_settings {\n  http_cb      on_message_begin;\n  http_data_cb on_url;\n  http_data_cb on_header_field;\n  http_data_cb on_header_value;\n  http_cb      on_headers_complete;\n  http_data_cb on_body;\n  http_cb      on_message_complete;\n};\n\n\nenum http_parser_url_fields\n  { UF_SCHEMA           = 0\n  , UF_HOST             = 1\n  , UF_PORT             = 2\n  , UF_PATH             = 3\n  , UF_QUERY            = 4\n  , UF_FRAGMENT         = 5\n  , UF_MAX              = 6\n  };\n\n\n/* Result structure for http_parser_parse_url().\n *\n * Callers should index into field_data[] with UF_* values iff field_set\n * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and\n * because we probably have padding left over), we convert any port to\n * a uint16_t.\n */\nstruct http_parser_url {\n  uint16_t field_set;           /* Bitmask of (1 << UF_*) values */\n  uint16_t port;                /* Converted UF_PORT string */\n\n  struct {\n    uint16_t off;               /* Offset into buffer in which field starts */\n    uint16_t len;               /* Length of run in buffer */\n  } field_data[UF_MAX];\n};\n\n\nvoid http_parser_init(http_parser *parser, enum http_parser_type type);\n\n\nsize_t http_parser_execute(http_parser *parser,\n                           const http_parser_settings *settings,\n                           const char *data,\n                           size_t len);\n\n\n/* If http_should_keep_alive() in the on_headers_complete or\n * on_message_complete callback returns true, then this will be should be\n * the last message on the connection.\n * If you are the server, respond with the \"Connection: close\" header.\n * If you are the client, close the connection.\n */\nint http_should_keep_alive(http_parser *parser);\n\n/* Returns a string version of the HTTP method. */\nconst char *http_method_str(enum http_method m);\n\n/* Return a string name of the given error */\nconst char *http_errno_name(enum http_errno err);\n\n/* Return a string description of the given error */\nconst char *http_errno_description(enum http_errno err);\n\n/* Parse a URL; return nonzero on failure */\nint http_parser_parse_url(const char *buf, size_t buflen,\n                          int is_connect,\n                          struct http_parser_url *u);\n\n/* Pause or un-pause the parser; a nonzero value pauses */\nvoid http_parser_pause(http_parser *parser, int paused);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/info.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <console/color.h>\n\ntypedef struct {\n\tuint32_t cursor_x;\n\tuint32_t cursor_y;\n\n\tuint32_t rows;\n\tuint32_t columns;\n\n\tuint32_t tabstop;\n\n\tconsole_color_t default_color;\n\tconsole_color_t current_color;\n\n\tuint8_t nonblocking;\n\tuint8_t reverse_video;\n\tuint8_t bold;\n\tuint8_t blink;\n\tuint8_t underline;\n\tuint8_t newline_mode;\n\tuint8_t auto_echo;\n\tuint8_t handle_backspace;\n} console_info_t;\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/interface.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <console/info.h>\n#include <console/filter.h>\n#include <console/driver.h>\n\ntypedef struct {\n\tconsole_info_t info;\n\n\tconsole_filter_t* input_filter;\n\tconsole_filter_t* output_filter;\n\n\tconsole_driver_t* input_driver;\n\tconsole_driver_t* output_driver;\n} console_t;\n\nconsole_t* default_console;\n\n// Generate raw console, connected to the Display, Keyboard and the\n// ECMA-48-Filter\nvoid console_init();\n\nsize_t console_write(console_t* console, const char* buffer, int32_t length);\n#define console_write2(console, buffer) console_write(console, buffer, strlen(buffer))\nsize_t console_read(console_t* console, char* buffer, size_t length);\nsize_t console_scroll(console_t* console, int32_t pages);\n\nvoid console_clear(console_t* console);\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/ip4.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <net/net.h>\n\n#define IP4_TOS_ICMP 0\n\ntypedef uint32_t ip4_addr_t;\n\ntypedef struct {\n\tunsigned int hl:4; /* both fields are 4 bits */\n\tunsigned int version:4;\n\tuint8_t\ttos;\n\tuint16_t len;\n\tuint16_t id;\n\tuint16_t off;\n\tuint8_t ttl;\n\tuint8_t p;\n\tuint16_t checksum;\n\tip4_addr_t src;\n\tip4_addr_t dst;\n} ip4_header_t;\n\ntypedef struct {\n\tuint8_t type;\n\tuint8_t code;\n\tuint16_t checksum;\n\tuint16_t id;\n\tuint16_t sequence;\n} ip4_icmp_header_t;\n\nvoid ip4_receive(net_device_t* origin, net_l2proto_t proto, size_t size, void* raw);\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/jni_layer.h",
    "content": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n/* Header for class jni_JniLayer */\n\n#ifndef _Included_jni_JniLayer\n#define _Included_jni_JniLayer\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_initialize\n * Signature: ([II)J\n */\nJNIEXPORT jlong JNICALL Java_jni_JniLayer_jni_1layer_1initialize\n  (JNIEnv *, jobject, jintArray, jint, jint);\n\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_mainloop\n * Signature: (J)V\n */\nJNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1mainloop\n  (JNIEnv *, jobject, jlong);\n\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_set_button\n * Signature: (JII)V\n */\nJNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1set_1button\n  (JNIEnv *, jobject, jlong, jint, jint);\n\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_set_analog\n * Signature: (JIIF)V\n */\nJNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1set_1analog\n  (JNIEnv *, jobject, jlong, jint, jint, jfloat);\n\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_report_analog_chg\n * Signature: (JI)V\n */\nJNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1report_1analog_1chg\n  (JNIEnv *, jobject, jlong, jint);\n\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_kill\n * Signature: (J)V\n */\nJNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1kill\n  (JNIEnv *, jobject, jlong);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/main.c",
    "content": "// Copyright 2014 the V8 project authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"src/runtime/runtime-utils.h\"\n\n#include \"src/arguments.h\"\n#include \"src/compiler.h\"\n#include \"src/deoptimizer.h\"\n#include \"src/frames-inl.h\"\n#include \"src/full-codegen/full-codegen.h\"\n#include \"src/isolate-inl.h\"\n#include \"src/messages.h\"\n#include \"src/v8threads.h\"\n#include \"src/vm-state-inl.h\"\n\nnamespace v8 {\nnamespace internal {\n\nRUNTIME_FUNCTION(Runtime_CompileLazy) {\n\tHandleScope scope(isolate);\n\tDCHECK_EQ(1, args.length());\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\n#ifdef DEBUG\n\tif (FLAG_trace_lazy && !function->shared()->is_compiled()) {\n\t\tPrintF(\"[unoptimized: \");\n\t\tfunction->PrintName();\n\t\tPrintF(\"]\\n\");\n\t}\n#endif\n\n\tStackLimitCheck check(isolate);\n\tif (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow();\n\tif (!Compiler::Compile(function, Compiler::KEEP_EXCEPTION)) {\n\t\treturn isolate->heap()->exception();\n\t}\n\tDCHECK(function->is_compiled());\n\treturn function->code();\n}\n\nRUNTIME_FUNCTION(Runtime_CompileBaseline) {\n\tHandleScope scope(isolate);\n\tDCHECK_EQ(1, args.length());\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\tStackLimitCheck check(isolate);\n\tif (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow();\n\tif (!Compiler::CompileBaseline(function)) {\n\t\treturn isolate->heap()->exception();\n\t}\n\tDCHECK(function->is_compiled());\n\treturn function->code();\n}\n\nRUNTIME_FUNCTION(Runtime_CompileOptimized_Concurrent) {\n\tHandleScope scope(isolate);\n\tDCHECK_EQ(1, args.length());\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\tStackLimitCheck check(isolate);\n\tif (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow();\n\tif (!Compiler::CompileOptimized(function, Compiler::CONCURRENT)) {\n\t\treturn isolate->heap()->exception();\n\t}\n\tDCHECK(function->is_compiled());\n\treturn function->code();\n}\n\n\nRUNTIME_FUNCTION(Runtime_CompileOptimized_NotConcurrent) {\n\tHandleScope scope(isolate);\n\tDCHECK_EQ(1, args.length());\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\tStackLimitCheck check(isolate);\n\tif (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow();\n\tif (!Compiler::CompileOptimized(function, Compiler::NOT_CONCURRENT)) {\n\t\treturn isolate->heap()->exception();\n\t}\n\tDCHECK(function->is_compiled());\n\treturn function->code();\n}\n\n\nRUNTIME_FUNCTION(Runtime_NotifyStubFailure) {\n\tHandleScope scope(isolate);\n\tDCHECK(args.length() == 0);\n\tDeoptimizer* deoptimizer = Deoptimizer::Grab(isolate);\n\tDCHECK(AllowHeapAllocation::IsAllowed());\n\tdelete deoptimizer;\n\treturn isolate->heap()->undefined_value();\n}\n\n\nclass ActivationsFinder : public ThreadVisitor {\npublic:\n\tCode* code_;\n\tbool has_code_activations_;\n\n\texplicit ActivationsFinder(Code* code)\n\t\t: code_(code), has_code_activations_(false) {}\n\n\tvoid VisitThread(Isolate* isolate, ThreadLocalTop* top) {\n\t\tJavaScriptFrameIterator it(isolate, top);\n\t\tVisitFrames(&it);\n\t}\n\n\tvoid VisitFrames(JavaScriptFrameIterator* it) {\n\t\tfor (; !it->done(); it->Advance()) {\n\t\t\tJavaScriptFrame* frame = it->frame();\n\t\t\tif (code_->contains(frame->pc())) has_code_activations_ = true;\n\t\t}\n\t}\n};\n\n\nRUNTIME_FUNCTION(Runtime_NotifyDeoptimized) {\n\tHandleScope scope(isolate);\n\tDCHECK(args.length() == 1);\n\tCONVERT_SMI_ARG_CHECKED(type_arg, 0);\n\tDeoptimizer::BailoutType type =\n\t\tstatic_cast<Deoptimizer::BailoutType>(type_arg);\n\tDeoptimizer* deoptimizer = Deoptimizer::Grab(isolate);\n\tDCHECK(AllowHeapAllocation::IsAllowed());\n\tTimerEventScope<TimerEventDeoptimizeCode> timer(isolate);\n\tTRACE_EVENT0(\"v8\", \"V8.DeoptimizeCode\");\n\n\tHandle<JSFunction> function = deoptimizer->function();\n\tHandle<Code> optimized_code = deoptimizer->compiled_code();\n\n\tDCHECK(optimized_code->kind() == Code::OPTIMIZED_FUNCTION);\n\tDCHECK(type == deoptimizer->bailout_type());\n\n\t// Make sure to materialize objects before causing any allocation.\n\tJavaScriptFrameIterator it(isolate);\n\tdeoptimizer->MaterializeHeapObjects(&it);\n\tdelete deoptimizer;\n\n\t// Ensure the context register is updated for materialized objects.\n\tJavaScriptFrameIterator top_it(isolate);\n\tJavaScriptFrame* top_frame = top_it.frame();\n\tisolate->set_context(Context::cast(top_frame->context()));\n\n\tif (type == Deoptimizer::LAZY) {\n\t\treturn isolate->heap()->undefined_value();\n\t}\n\n\t// Search for other activations of the same optimized code.\n\t// At this point {it} is at the topmost frame of all the frames materialized\n\t// by the deoptimizer. Note that this frame does not necessarily represent\n\t// an activation of {function} because of potential inlined tail-calls.\n\tActivationsFinder activations_finder(*optimized_code);\n\tactivations_finder.VisitFrames(&it);\n\tisolate->thread_manager()->IterateArchivedThreads(&activations_finder);\n\n\tif (!activations_finder.has_code_activations_) {\n\t\tif (function->code() == *optimized_code) {\n\t\t\tif (FLAG_trace_deopt) {\n\t\t\t\tPrintF(\"[removing optimized code for: \");\n\t\t\t\tfunction->PrintName();\n\t\t\t\tPrintF(\"]\\n\");\n\t\t\t}\n\t\t\tfunction->ReplaceCode(function->shared()->code());\n\t\t}\n\t\t// Evict optimized code for this function from the cache so that it\n\t\t// doesn't get used for new closures.\n\t\tfunction->shared()->EvictFromOptimizedCodeMap(*optimized_code, \"notify deoptimized\");\n\t} else {\n\t\t// TODO(titzer): we should probably do DeoptimizeCodeList(code)\n\t\t// unconditionally if the code is not already marked for deoptimization.\n\t\t// If there is an index by shared function info, all the better.\n\t\tDeoptimizer::DeoptimizeFunction(*function);\n\t}\n\n\treturn isolate->heap()->undefined_value();\n}\n\n\nstatic bool IsSuitableForOnStackReplacement(\n\tIsolate* isolate,\n\tHandle<JSFunction> function\n) {\n\t// Keep track of whether we've succeeded in optimizing.\n\tif (function->shared()->optimization_disabled()) return false;\n\t// If we are trying to do OSR when there are already optimized\n\t// activations of the function, it means (a) the function is directly or\n\t// indirectly recursive and (b) an optimized invocation has been\n\t// deoptimized so that we are currently in an unoptimized activation.\n\t// Check for optimized activations of this function.\n\tfor (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) {\n\t\tJavaScriptFrame* frame = it.frame();\n\t\tif (frame->is_optimized() && frame->function() == *function) return false;\n\t}\n\n\treturn true;\n}\n\n\nRUNTIME_FUNCTION(Runtime_CompileForOnStackReplacement) {\n\tHandleScope scope(isolate);\n\tDCHECK(args.length() == 1);\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\tHandle<Code> caller_code(function->shared()->code());\n\n\t// We're not prepared to handle a function with arguments object.\n\tDCHECK(!function->shared()->uses_arguments());\n\n\tRUNTIME_ASSERT(FLAG_use_osr);\n\n\t// Passing the PC in the javascript frame from the caller directly is\n\t// not GC safe, so we walk the stack to get it.\n\tJavaScriptFrameIterator it(isolate);\n\tJavaScriptFrame* frame = it.frame();\n\tif (!caller_code->contains(frame->pc())) {\n\t\t// Code on the stack may not be the code object referenced by the shared\n\t\t// function info.\tIt may have been replaced to include deoptimization data.\n\t\tcaller_code = Handle<Code>(frame->LookupCode());\n\t}\n\n\tuint32_t pc_offset =\n\t\tstatic_cast<uint32_t>(frame->pc() - caller_code->instruction_start());\n\n#ifdef DEBUG\n\tDCHECK_EQ(frame->function(), *function);\n\tDCHECK_EQ(frame->LookupCode(), *caller_code);\n\tDCHECK(caller_code->contains(frame->pc()));\n#endif\t// DEBUG\n\n\tBailoutId ast_id = caller_code->TranslatePcOffsetToAstId(pc_offset);\n\tDCHECK(!ast_id.IsNone());\n\n\tMaybeHandle<Code> maybe_result;\n\tif (IsSuitableForOnStackReplacement(isolate, function)) {\n\t\tif (FLAG_trace_osr) {\n\t\t\tPrintF(\"[OSR - Compiling: \");\n\t\t\tfunction->PrintName();\n\t\t\tPrintF(\" at -*- scheme -*- %d]\\n\", ast_id.ToInt());\n\t\t}\n\t\tmaybe_result = Compiler::GetOptimizedCodeForOSR(function, ast_id, frame);\n\t}\n\n\t// Revert the patched back edge table, regardless of whether OSR succeeds.\n\tBackEdgeTable::Revert(isolate, *caller_code);\n\n\t// Check whether we ended up with usable optimized code.\n\tHandle<Code> result;\n\tif (maybe_result.ToHandle(&result)\n\t&& result->kind() == Code::OPTIMIZED_FUNCTION) {\n\t\tDeoptimizationInputData* data =\n\t\t\tDeoptimizationInputData::cast(result->deoptimization_data());\n\t\t\n\t\tif (data->OsrPcOffset()->value() >= 0) {\n\t\t\tDCHECK(BailoutId(data->OsrAstId()->value()) == ast_id);\n\t\t\tif (FLAG_trace_osr) {\n\t\t\t\tPrintF(\"[OSR - Entry at AST id %d, offset %d in optimized code]\\n\",\n\t\t\t\t\tast_id.ToInt(), data->OsrPcOffset()->value());\n\t\t\t}\n\t\t\t// TODO(titzer): this is a massive hack to make the deopt counts\n\t\t\t// match. Fix heuristics for reenabling optimizations!\n\t\t\tfunction->shared()->increment_deopt_count();\n\n\t\t\tif (result->is_turbofanned()) {\n\t\t\t\t// TurboFanned OSR code cannot be installed into the function.\n\t\t\t\t// But the function is obviously hot, so optimize it next time.\n\t\t\t\tfunction->ReplaceCode(\n\t\t\t\t\tisolate->builtins()->builtin(Builtins::kCompileOptimized));\n\t\t\t} else {\n\t\t\t\t// Crankshafted OSR code can be installed into the function.\n\t\t\t\tfunction->ReplaceCode(*result);\n\t\t\t}\n\t\t\treturn *result;\n\t\t}\n\t}\n\n\t// Failed.\n\tif (FLAG_trace_osr) {\n\t\tPrintF(\"[OSR - Failed: \");\n\t\tfunction->PrintName();\n\t\tPrintF(\" at AST id %d]\\n\", ast_id.ToInt());\n\t}\n\n\tif (!function->IsOptimized()) {\n\t\tfunction->ReplaceCode(function->shared()->code());\n\t}\n\treturn NULL;\n}\n\n\nRUNTIME_FUNCTION(Runtime_TryInstallOptimizedCode) {\n\tHandleScope scope(isolate);\n\tDCHECK(args.length() == 1);\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\n\t// First check if this is a real stack overflow.\n\tStackLimitCheck check(isolate);\n\tif (check.JsHasOverflowed()) {\n\t\tSealHandleScope shs(isolate);\n\t\treturn isolate->StackOverflow();\n\t}\n\n\tisolate->optimizing_compile_dispatcher()->InstallOptimizedFunctions();\n\treturn (function->IsOptimized())\n\t\t? function->code()\n\t\t: function->shared()->code();\n}\n\n\nbool CodeGenerationFromStringsAllowed(\n\tIsolate* isolate,\n\tHandle<Context> context\n){\n\tDCHECK(context->allow_code_gen_from_strings()->IsFalse());\n\t// Check with callback if set.\n\tAllowCodeGenerationFromStringsCallback callback =\n\t\t\tisolate->allow_code_gen_callback();\n\tif (callback == NULL) {\n\t\t// No callback set and code generation disallowed.\n\t\treturn false;\n\t} else {\n\t\t// Callback set. Let it decide if code generation is allowed.\n\t\tVMState<EXTERNAL> state(isolate);\n\t\treturn callback(v8::Utils::ToLocal(context));\n\t}\n}\n\nstatic Object* CompileGlobalEval(\n\tIsolate* isolate,\n\tHandle<String> source,\n\tHandle<SharedFunctionInfo> outer_info,\n\tLanguageMode language_mode,\n\tint eval_scope_position,\n\tint eval_position\n){\n\tHandle<Context> context = Handle<Context>(isolate->context());\n\tHandle<Context> native_context = Handle<Context>(context->native_context());\n\n\t// Check if native context allows code generation from\n\t// strings. Throw an exception if it doesn't.\n\tif (native_context->allow_code_gen_from_strings()->IsFalse() &&\n\t!CodeGenerationFromStringsAllowed(isolate, native_context)) {\n\t\tHandle<Object> error_message =\n\t\t\t\tnative_context->ErrorMessageForCodeGenerationFromStrings();\n\t\tHandle<Object> error;\n\t\tMaybeHandle<Object> maybe_error = isolate->factory()->NewEvalError(\n\t\t\t\tMessageTemplate::kCodeGenFromStrings, error_message);\n\t\tif (maybe_error.ToHandle(&error)) isolate->Throw(*error);\n\t\treturn isolate->heap()->exception();\n\t}\n\n\t// Deal with a normal eval call with a string argument. Compile it\n\t// and return the compiled function bound in the local context.\n\tstatic const ParseRestriction restriction = NO_PARSE_RESTRICTION;\n\tHandle<JSFunction> compiled;\n\tASSIGN_RETURN_ON_EXCEPTION_VALUE(\n\t\tisolate, compiled,\n\t\tCompiler::GetFunctionFromEval(\n\t\t\tsource, outer_info, context, language_mode,\n\t\t\trestriction, eval_scope_position, eval_position\n\t\t),\n\t\tisolate->heap()->exception()\n\t);\n\treturn *compiled;\n}\n\n\nRUNTIME_FUNCTION(Runtime_ResolvePossiblyDirectEval) {\n\tHandleScope scope(isolate);\n\tDCHECK(args.length() == 6);\n\n\tHandle<Object> callee = args.at<Object>(0);\n\n\t// If \"eval\" didn't refer to the original GlobalEval, it's not a\n\t// direct call to eval.\n\t// (And even if it is, but the first argument isn't a string, just let\n\t// execution default to an indirect call to eval, which will also return\n\t// the first argument without doing anything).\n\tif (*callee != isolate->native_context()->global_eval_fun() || !args[1]->IsString()) {\n\t\treturn *callee;\n\t}\n\n\tDCHECK(args[3]->IsSmi());\n\tDCHECK(is_valid_language_mode(args.smi_at(3)));\n\tLanguageMode language_mode = static_cast<LanguageMode>(args.smi_at(3));\n\tDCHECK(args[4]->IsSmi());\n\tHandle<SharedFunctionInfo> outer_info(args.at<JSFunction>(2)->shared(), isolate);\n\treturn CompileGlobalEval(\n\t\tisolate,\n\t\targs.at<String>(1),\n\t\touter_info,\n\t\tlanguage_mode,\n\t\targs.smi_at(4),\n\t\targs.smi_at(5)\n\t);\n}\n}\t// namespace internal\n}\t// namespace v8\n\n/* vim: set shiftwidth=4 softtabstop=0 cindent cinoptions={1s: */\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/markdown.c",
    "content": "/* markdown.c - generic markdown parser */\n\n/*\n * Copyright (c) 2009, Natacha Porté\n * Copyright (c) 2011, Vicent Marti\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"markdown.h\"\n#include \"stack.h\"\n\n#include <assert.h>\n#include <string.h>\n#include <ctype.h>\n#include <stdio.h>\n\n#if defined(_WIN32)\n#define strncasecmp\t_strnicmp\n#endif\n\n#define REF_TABLE_SIZE 8\n\n#define BUFFER_BLOCK 0\n#define BUFFER_SPAN 1\n\n#define MKD_LI_END 8\t/* internal list flag */\n\n#define gperf_case_strncmp(s1, s2, n) strncasecmp(s1, s2, n)\n#define GPERF_DOWNCASE 1\n#define GPERF_CASE_STRNCMP 1\n#include \"html_blocks.h\"\n\n/***************\n * LOCAL TYPES *\n ***************/\n\n/* link_ref: reference to a link */\nstruct link_ref {\n\tunsigned int id;\n\n\tstruct buf *link;\n\tstruct buf *title;\n\n\tstruct link_ref *next;\n};\n\n/* char_trigger: function pointer to render active chars */\n/*   returns the number of chars taken care of */\n/*   data is the pointer of the beginning of the span */\n/*   offset is the number of valid chars before data */\nstruct sd_markdown;\ntypedef size_t\n(*char_trigger)(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\n\nstatic size_t char_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_autolink_url(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_autolink_email(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_autolink_www(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_link(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_superscript(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\n\nenum markdown_char_t {\n\tMD_CHAR_NONE = 0,\n\tMD_CHAR_EMPHASIS,\n\tMD_CHAR_CODESPAN,\n\tMD_CHAR_LINEBREAK,\n\tMD_CHAR_LINK,\n\tMD_CHAR_LANGLE,\n\tMD_CHAR_ESCAPE,\n\tMD_CHAR_ENTITITY,\n\tMD_CHAR_AUTOLINK_URL,\n\tMD_CHAR_AUTOLINK_EMAIL,\n\tMD_CHAR_AUTOLINK_WWW,\n\tMD_CHAR_SUPERSCRIPT,\n};\n\nstatic char_trigger markdown_char_ptrs[] = {\n\tNULL,\n\t&char_emphasis,\n\t&char_codespan,\n\t&char_linebreak,\n\t&char_link,\n\t&char_langle_tag,\n\t&char_escape,\n\t&char_entity,\n\t&char_autolink_url,\n\t&char_autolink_email,\n\t&char_autolink_www,\n\t&char_superscript,\n};\n\n/* render • structure containing one particular render */\nstruct sd_markdown {\n\tstruct sd_callbacks\tcb;\n\tvoid *opaque;\n\n\tstruct link_ref *refs[REF_TABLE_SIZE];\n\tuint8_t active_char[256];\n\tstruct stack work_bufs[2];\n\tunsigned int ext_flags;\n\tsize_t max_nesting;\n\tint in_link_body;\n};\n\n/***************************\n * HELPER FUNCTIONS *\n ***************************/\n\nstatic inline struct buf *\nrndr_newbuf(struct sd_markdown *rndr, int type)\n{\n\tstatic const size_t buf_size[2] = {256, 64};\n\tstruct buf *work = NULL;\n\tstruct stack *pool = &rndr->work_bufs[type];\n\n\tif (pool->size < pool->asize &&\n\t\tpool->item[pool->size] != NULL) {\n\t\twork = pool->item[pool->size++];\n\t\twork->size = 0;\n\t} else {\n\t\twork = bufnew(buf_size[type]);\n\t\tstack_push(pool, work);\n\t}\n\n\treturn work;\n}\n\nstatic inline void\nrndr_popbuf(struct sd_markdown *rndr, int type)\n{\n\trndr->work_bufs[type].size--;\n}\n\nstatic void\nunscape_text(struct buf *ob, struct buf *src)\n{\n\tsize_t i = 0, org;\n\twhile (i < src->size) {\n\t\torg = i;\n\t\twhile (i < src->size && src->data[i] != '\\\\')\n\t\t\ti++;\n\n\t\tif (i > org)\n\t\t\tbufput(ob, src->data + org, i - org);\n\n\t\tif (i + 1 >= src->size)\n\t\t\tbreak;\n\n\t\tbufputc(ob, src->data[i + 1]);\n\t\ti += 2;\n\t}\n}\n\nstatic unsigned int\nhash_link_ref(const uint8_t *link_ref, size_t length)\n{\n\tsize_t i;\n\tunsigned int hash = 0;\n\n\tfor (i = 0; i < length; ++i)\n\t\thash = tolower(link_ref[i]) + (hash << 6) + (hash << 16) - hash;\n\n\treturn hash;\n}\n\nstatic struct link_ref *\nadd_link_ref(\n\tstruct link_ref **references,\n\tconst uint8_t *name, size_t name_size)\n{\n\tstruct link_ref *ref = calloc(1, sizeof(struct link_ref));\n\n\tif (!ref)\n\t\treturn NULL;\n\n\tref->id = hash_link_ref(name, name_size);\n\tref->next = references[ref->id % REF_TABLE_SIZE];\n\n\treferences[ref->id % REF_TABLE_SIZE] = ref;\n\treturn ref;\n}\n\nstatic struct link_ref *\nfind_link_ref(struct link_ref **references, uint8_t *name, size_t length)\n{\n\tunsigned int hash = hash_link_ref(name, length);\n\tstruct link_ref *ref = NULL;\n\n\tref = references[hash % REF_TABLE_SIZE];\n\n\twhile (ref != NULL) {\n\t\tif (ref->id == hash)\n\t\t\treturn ref;\n\n\t\tref = ref->next;\n\t}\n\n\treturn NULL;\n}\n\nstatic void\nfree_link_refs(struct link_ref **references)\n{\n\tsize_t i;\n\n\tfor (i = 0; i < REF_TABLE_SIZE; ++i) {\n\t\tstruct link_ref *r = references[i];\n\t\tstruct link_ref *next;\n\n\t\twhile (r) {\n\t\t\tnext = r->next;\n\t\t\tbufrelease(r->link);\n\t\t\tbufrelease(r->title);\n\t\t\tfree(r);\n\t\t\tr = next;\n\t\t}\n\t}\n}\n\n/*\n * Check whether a char is a Markdown space.\n\n * Right now we only consider spaces the actual\n * space and a newline: tabs and carriage returns\n * are filtered out during the preprocessing phase.\n *\n * If we wanted to actually be UTF-8 compliant, we\n * should instead extract an Unicode codepoint from\n * this character and check for space properties.\n */\nstatic inline int\n_isspace(int c)\n{\n\treturn c == ' ' || c == '\\n';\n}\n\n/****************************\n * INLINE PARSING FUNCTIONS *\n ****************************/\n\n/* is_mail_autolink • looks for the address part of a mail autolink and '>' */\n/* this is less strict than the original markdown e-mail address matching */\nstatic size_t\nis_mail_autolink(uint8_t *data, size_t size)\n{\n\tsize_t i = 0, nb = 0;\n\n\t/* address is assumed to be: [-@._a-zA-Z0-9]+ with exactly one '@' */\n\tfor (i = 0; i < size; ++i) {\n\t\tif (isalnum(data[i]))\n\t\t\tcontinue;\n\n\t\tswitch (data[i]) {\n\t\t\tcase '@':\n\t\t\t\tnb++;\n\n\t\t\tcase '-':\n\t\t\tcase '.':\n\t\t\tcase '_':\n\t\t\t\tbreak;\n\n\t\t\tcase '>':\n\t\t\t\treturn (nb == 1) ? i + 1 : 0;\n\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/* tag_length • returns the length of the given tag, or 0 is it's not valid */\nstatic size_t\ntag_length(uint8_t *data, size_t size, enum mkd_autolink *autolink)\n{\n\tsize_t i, j;\n\n\t/* a valid tag can't be shorter than 3 chars */\n\tif (size < 3) return 0;\n\n\t/* begins with a '<' optionally followed by '/', followed by letter or number */\n\tif (data[0] != '<') return 0;\n\ti = (data[1] == '/') ? 2 : 1;\n\n\tif (!isalnum(data[i]))\n\t\treturn 0;\n\n\t/* scheme test */\n\t*autolink = MKDA_NOT_AUTOLINK;\n\n\t/* try to find the beginning of an URI */\n\twhile (i < size && (isalnum(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-'))\n\t\ti++;\n\n\tif (i > 1 && data[i] == '@') {\n\t\tif ((j = is_mail_autolink(data + i, size - i)) != 0) {\n\t\t\t*autolink = MKDA_EMAIL;\n\t\t\treturn i + j;\n\t\t}\n\t}\n\n\tif (i > 2 && data[i] == ':') {\n\t\t*autolink = MKDA_NORMAL;\n\t\ti++;\n\t}\n\n\t/* completing autolink test: no whitespace or ' or \" */\n\tif (i >= size)\n\t\t*autolink = MKDA_NOT_AUTOLINK;\n\n\telse if (*autolink) {\n\t\tj = i;\n\n\t\twhile (i < size) {\n\t\t\tif (data[i] == '\\\\') i += 2;\n\t\t\telse if (data[i] == '>' || data[i] == '\\'' ||\n\t\t\t\t\tdata[i] == '\"' || data[i] == ' ' || data[i] == '\\n')\n\t\t\t\t\tbreak;\n\t\t\telse i++;\n\t\t}\n\n\t\tif (i >= size) return 0;\n\t\tif (i > j && data[i] == '>') return i + 1;\n\t\t/* one of the forbidden chars has been found */\n\t\t*autolink = MKDA_NOT_AUTOLINK;\n\t}\n\n\t/* looking for sometinhg looking like a tag end */\n\twhile (i < size && data[i] != '>') i++;\n\tif (i >= size) return 0;\n\treturn i + 1;\n}\n\n/* parse_inline • parses inline markdown elements */\nstatic void\nparse_inline(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t i = 0, end = 0;\n\tuint8_t action = 0;\n\tstruct buf work = { 0, 0, 0, 0 };\n\n\tif (rndr->work_bufs[BUFFER_SPAN].size +\n\t\trndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting)\n\t\treturn;\n\n\twhile (i < size) {\n\t\t/* copying inactive chars into the output */\n\t\twhile (end < size && (action = rndr->active_char[data[end]]) == 0) {\n\t\t\tend++;\n\t\t}\n\n\t\tif (rndr->cb.normal_text) {\n\t\t\twork.data = data + i;\n\t\t\twork.size = end - i;\n\t\t\trndr->cb.normal_text(ob, &work, rndr->opaque);\n\t\t}\n\t\telse\n\t\t\tbufput(ob, data + i, end - i);\n\n\t\tif (end >= size) break;\n\t\ti = end;\n\n\t\tend = markdown_char_ptrs[(int)action](ob, rndr, data + i, i, size - i);\n\t\tif (!end) /* no action from the callback */\n\t\t\tend = i + 1;\n\t\telse {\n\t\t\ti += end;\n\t\t\tend = i;\n\t\t}\n\t}\n}\n\n/* find_emph_char • looks for the next emph uint8_t, skipping other constructs */\nstatic size_t\nfind_emph_char(uint8_t *data, size_t size, uint8_t c)\n{\n\tsize_t i = 1;\n\n\twhile (i < size) {\n\t\twhile (i < size && data[i] != c && data[i] != '`' && data[i] != '[')\n\t\t\ti++;\n\n\t\tif (i == size)\n\t\t\treturn 0;\n\n\t\tif (data[i] == c)\n\t\t\treturn i;\n\n\t\t/* not counting escaped chars */\n\t\tif (i && data[i - 1] == '\\\\') {\n\t\t\ti++; continue;\n\t\t}\n\n\t\tif (data[i] == '`') {\n\t\t\tsize_t span_nb = 0, bt;\n\t\t\tsize_t tmp_i = 0;\n\n\t\t\t/* counting the number of opening backticks */\n\t\t\twhile (i < size && data[i] == '`') {\n\t\t\t\ti++; span_nb++;\n\t\t\t}\n\n\t\t\tif (i >= size) return 0;\n\n\t\t\t/* finding the matching closing sequence */\n\t\t\tbt = 0;\n\t\t\twhile (i < size && bt < span_nb) {\n\t\t\t\tif (!tmp_i && data[i] == c) tmp_i = i;\n\t\t\t\tif (data[i] == '`') bt++;\n\t\t\t\telse bt = 0;\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tif (i >= size) return tmp_i;\n\t\t}\n\t\t/* skipping a link */\n\t\telse if (data[i] == '[') {\n\t\t\tsize_t tmp_i = 0;\n\t\t\tuint8_t cc;\n\n\t\t\ti++;\n\t\t\twhile (i < size && data[i] != ']') {\n\t\t\t\tif (!tmp_i && data[i] == c) tmp_i = i;\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\ti++;\n\t\t\twhile (i < size && (data[i] == ' ' || data[i] == '\\n'))\n\t\t\t\ti++;\n\n\t\t\tif (i >= size)\n\t\t\t\treturn tmp_i;\n\n\t\t\tswitch (data[i]) {\n\t\t\tcase '[':\n\t\t\t\tcc = ']'; break;\n\n\t\t\tcase '(':\n\t\t\t\tcc = ')'; break;\n\n\t\t\tdefault:\n\t\t\t\tif (tmp_i)\n\t\t\t\t\treturn tmp_i;\n\t\t\t\telse\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ti++;\n\t\t\twhile (i < size && data[i] != cc) {\n\t\t\t\tif (!tmp_i && data[i] == c) tmp_i = i;\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tif (i >= size)\n\t\t\t\treturn tmp_i;\n\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/* parse_emph1 • parsing single emphase */\n/* closed by a symbol not preceded by whitespace and not followed by symbol */\nstatic size_t\nparse_emph1(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)\n{\n\tsize_t i = 0, len;\n\tstruct buf *work = 0;\n\tint r;\n\n\tif (!rndr->cb.emphasis) return 0;\n\n\t/* skipping one symbol if coming from emph3 */\n\tif (size > 1 && data[0] == c && data[1] == c) i = 1;\n\n\twhile (i < size) {\n\t\tlen = find_emph_char(data + i, size - i, c);\n\t\tif (!len) return 0;\n\t\ti += len;\n\t\tif (i >= size) return 0;\n\n\t\tif (data[i] == c && !_isspace(data[i - 1])) {\n\n\t\t\tif (rndr->ext_flags & MKDEXT_NO_INTRA_EMPHASIS) {\n\t\t\t\tif (!(i + 1 == size || _isspace(data[i + 1]) || ispunct(data[i + 1])))\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\twork = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\tparse_inline(work, rndr, data, i);\n\t\t\tr = rndr->cb.emphasis(ob, work, rndr->opaque);\n\t\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\t\treturn r ? i + 1 : 0;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/* parse_emph2 • parsing single emphase */\nstatic size_t\nparse_emph2(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)\n{\n\tint (*render_method)(struct buf *ob, const struct buf *text, void *opaque);\n\tsize_t i = 0, len;\n\tstruct buf *work = 0;\n\tint r;\n\n\trender_method = (c == '~') ? rndr->cb.strikethrough : rndr->cb.double_emphasis;\n\n\tif (!render_method)\n\t\treturn 0;\n\n\twhile (i < size) {\n\t\tlen = find_emph_char(data + i, size - i, c);\n\t\tif (!len) return 0;\n\t\ti += len;\n\n\t\tif (i + 1 < size && data[i] == c && data[i + 1] == c && i && !_isspace(data[i - 1])) {\n\t\t\twork = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\tparse_inline(work, rndr, data, i);\n\t\t\tr = render_method(ob, work, rndr->opaque);\n\t\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\t\treturn r ? i + 2 : 0;\n\t\t}\n\t\ti++;\n\t}\n\treturn 0;\n}\n\n/* parse_emph3 • parsing single emphase */\n/* finds the first closing tag, and delegates to the other emph */\nstatic size_t\nparse_emph3(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)\n{\n\tsize_t i = 0, len;\n\tint r;\n\n\twhile (i < size) {\n\t\tlen = find_emph_char(data + i, size - i, c);\n\t\tif (!len) return 0;\n\t\ti += len;\n\n\t\t/* skip whitespace preceded symbols */\n\t\tif (data[i] != c || _isspace(data[i - 1]))\n\t\t\tcontinue;\n\n\t\tif (i + 2 < size && data[i + 1] == c && data[i + 2] == c && rndr->cb.triple_emphasis) {\n\t\t\t/* triple symbol found */\n\t\t\tstruct buf *work = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\t\t\tparse_inline(work, rndr, data, i);\n\t\t\tr = rndr->cb.triple_emphasis(ob, work, rndr->opaque);\n\t\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\t\treturn r ? i + 3 : 0;\n\n\t\t} else if (i + 1 < size && data[i + 1] == c) {\n\t\t\t/* double symbol found, handing over to emph1 */\n\t\t\tlen = parse_emph1(ob, rndr, data - 2, size + 2, c);\n\t\t\tif (!len) return 0;\n\t\t\telse return len - 2;\n\n\t\t} else {\n\t\t\t/* single symbol found, handing over to emph2 */\n\t\t\tlen = parse_emph2(ob, rndr, data - 1, size + 1, c);\n\t\t\tif (!len) return 0;\n\t\t\telse return len - 1;\n\t\t}\n\t}\n\treturn 0;\n}\n\n/* char_emphasis • single and double emphasis parsing */\nstatic size_t\nchar_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tuint8_t c = data[0];\n\tsize_t ret;\n\n\tif (size > 2 && data[1] != c) {\n\t\t/* whitespace cannot follow an opening emphasis;\n\t\t * strikethrough only takes two characters '~~' */\n\t\tif (c == '~' || _isspace(data[1]) || (ret = parse_emph1(ob, rndr, data + 1, size - 1, c)) == 0)\n\t\t\treturn 0;\n\n\t\treturn ret + 1;\n\t}\n\n\tif (size > 3 && data[1] == c && data[2] != c) {\n\t\tif (_isspace(data[2]) || (ret = parse_emph2(ob, rndr, data + 2, size - 2, c)) == 0)\n\t\t\treturn 0;\n\n\t\treturn ret + 2;\n\t}\n\n\tif (size > 4 && data[1] == c && data[2] == c && data[3] != c) {\n\t\tif (c == '~' || _isspace(data[3]) || (ret = parse_emph3(ob, rndr, data + 3, size - 3, c)) == 0)\n\t\t\treturn 0;\n\n\t\treturn ret + 3;\n\t}\n\n\treturn 0;\n}\n\n\n/* char_linebreak • '\\n' preceded by two spaces (assuming linebreak != 0) */\nstatic size_t\nchar_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tif (offset < 2 || data[-1] != ' ' || data[-2] != ' ')\n\t\treturn 0;\n\n\t/* removing the last space from ob and rendering */\n\twhile (ob->size && ob->data[ob->size - 1] == ' ')\n\t\tob->size--;\n\n\treturn rndr->cb.linebreak(ob, rndr->opaque) ? 1 : 0;\n}\n\n\n/* char_codespan • '`' parsing a code span (assuming codespan != 0) */\nstatic size_t\nchar_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tsize_t end, nb = 0, i, f_begin, f_end;\n\n\t/* counting the number of backticks in the delimiter */\n\twhile (nb < size && data[nb] == '`')\n\t\tnb++;\n\n\t/* finding the next delimiter */\n\ti = 0;\n\tfor (end = nb; end < size && i < nb; end++) {\n\t\tif (data[end] == '`') i++;\n\t\telse i = 0;\n\t}\n\n\tif (i < nb && end >= size)\n\t\treturn 0; /* no matching delimiter */\n\n\t/* trimming outside whitespaces */\n\tf_begin = nb;\n\twhile (f_begin < end && data[f_begin] == ' ')\n\t\tf_begin++;\n\n\tf_end = end - nb;\n\twhile (f_end > nb && data[f_end-1] == ' ')\n\t\tf_end--;\n\n\t/* real code span */\n\tif (f_begin < f_end) {\n\t\tstruct buf work = { data + f_begin, f_end - f_begin, 0, 0 };\n\t\tif (!rndr->cb.codespan(ob, &work, rndr->opaque))\n\t\t\tend = 0;\n\t} else {\n\t\tif (!rndr->cb.codespan(ob, 0, rndr->opaque))\n\t\t\tend = 0;\n\t}\n\n\treturn end;\n}\n\n\n/* char_escape • '\\\\' backslash escape */\nstatic size_t\nchar_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tstatic const char *escape_chars = \"\\\\`*_{}[]()#+-.!:|&<>^~\";\n\tstruct buf work = { 0, 0, 0, 0 };\n\n\tif (size > 1) {\n\t\tif (strchr(escape_chars, data[1]) == NULL)\n\t\t\treturn 0;\n\n\t\tif (rndr->cb.normal_text) {\n\t\t\twork.data = data + 1;\n\t\t\twork.size = 1;\n\t\t\trndr->cb.normal_text(ob, &work, rndr->opaque);\n\t\t}\n\t\telse bufputc(ob, data[1]);\n\t} else if (size == 1) {\n\t\tbufputc(ob, data[0]);\n\t}\n\n\treturn 2;\n}\n\n/* char_entity • '&' escaped when it doesn't belong to an entity */\n/* valid entities are assumed to be anything matching &#?[A-Za-z0-9]+; */\nstatic size_t\nchar_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tsize_t end = 1;\n\tstruct buf work = { 0, 0, 0, 0 };\n\n\tif (end < size && data[end] == '#')\n\t\tend++;\n\n\twhile (end < size && isalnum(data[end]))\n\t\tend++;\n\n\tif (end < size && data[end] == ';')\n\t\tend++; /* real entity */\n\telse\n\t\treturn 0; /* lone '&' */\n\n\tif (rndr->cb.entity) {\n\t\twork.data = data;\n\t\twork.size = end;\n\t\trndr->cb.entity(ob, &work, rndr->opaque);\n\t}\n\telse bufput(ob, data, end);\n\n\treturn end;\n}\n\n/* char_langle_tag • '<' when tags or autolinks are allowed */\nstatic size_t\nchar_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tenum mkd_autolink altype = MKDA_NOT_AUTOLINK;\n\tsize_t end = tag_length(data, size, &altype);\n\tstruct buf work = { data, end, 0, 0 };\n\tint ret = 0;\n\n\tif (end > 2) {\n\t\tif (rndr->cb.autolink && altype != MKDA_NOT_AUTOLINK) {\n\t\t\tstruct buf *u_link = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\twork.data = data + 1;\n\t\t\twork.size = end - 2;\n\t\t\tunscape_text(u_link, &work);\n\t\t\tret = rndr->cb.autolink(ob, u_link, altype, rndr->opaque);\n\t\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\t}\n\t\telse if (rndr->cb.raw_html_tag)\n\t\t\tret = rndr->cb.raw_html_tag(ob, &work, rndr->opaque);\n\t}\n\n\tif (!ret) return 0;\n\telse return end;\n}\n\nstatic size_t\nchar_autolink_www(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tstruct buf *link, *link_url, *link_text;\n\tsize_t link_len, rewind;\n\n\tif (!rndr->cb.link || rndr->in_link_body)\n\t\treturn 0;\n\n\tlink = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\tif ((link_len = sd_autolink__www(&rewind, link, data, offset, size)) > 0) {\n\t\tlink_url = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\tBUFPUTSL(link_url, \"http://\");\n\t\tbufput(link_url, link->data, link->size);\n\n\t\tob->size -= rewind;\n\t\tif (rndr->cb.normal_text) {\n\t\t\tlink_text = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\trndr->cb.normal_text(link_text, link, rndr->opaque);\n\t\t\trndr->cb.link(ob, link_url, NULL, link_text, rndr->opaque);\n\t\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\t} else {\n\t\t\trndr->cb.link(ob, link_url, NULL, link, rndr->opaque);\n\t\t}\n\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t}\n\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\treturn link_len;\n}\n\nstatic size_t\nchar_autolink_email(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tstruct buf *link;\n\tsize_t link_len, rewind;\n\n\tif (!rndr->cb.autolink || rndr->in_link_body)\n\t\treturn 0;\n\n\tlink = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\tif ((link_len = sd_autolink__email(&rewind, link, data, offset, size)) > 0) {\n\t\tob->size -= rewind;\n\t\trndr->cb.autolink(ob, link, MKDA_EMAIL, rndr->opaque);\n\t}\n\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\treturn link_len;\n}\n\nstatic size_t\nchar_autolink_url(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tstruct buf *link;\n\tsize_t link_len, rewind;\n\n\tif (!rndr->cb.autolink || rndr->in_link_body)\n\t\treturn 0;\n\n\tlink = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\tif ((link_len = sd_autolink__url(&rewind, link, data, offset, size)) > 0) {\n\t\tob->size -= rewind;\n\t\trndr->cb.autolink(ob, link, MKDA_NORMAL, rndr->opaque);\n\t}\n\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\treturn link_len;\n}\n\n/* char_link • '[': parsing a link or an image */\nstatic size_t\nchar_link(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tint is_img = (offset && data[-1] == '!'), level;\n\tsize_t i = 1, txt_e, link_b = 0, link_e = 0, title_b = 0, title_e = 0;\n\tstruct buf *content = 0;\n\tstruct buf *link = 0;\n\tstruct buf *title = 0;\n\tstruct buf *u_link = 0;\n\tsize_t org_work_size = rndr->work_bufs[BUFFER_SPAN].size;\n\tint text_has_nl = 0, ret = 0;\n\tint in_title = 0, qtype = 0;\n\n\t/* checking whether the correct renderer exists */\n\tif ((is_img && !rndr->cb.image) || (!is_img && !rndr->cb.link))\n\t\tgoto cleanup;\n\n\t/* looking for the matching closing bracket */\n\tfor (level = 1; i < size; i++) {\n\t\tif (data[i] == '\\n')\n\t\t\ttext_has_nl = 1;\n\n\t\telse if (data[i - 1] == '\\\\')\n\t\t\tcontinue;\n\n\t\telse if (data[i] == '[')\n\t\t\tlevel++;\n\n\t\telse if (data[i] == ']') {\n\t\t\tlevel--;\n\t\t\tif (level <= 0)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (i >= size)\n\t\tgoto cleanup;\n\n\ttxt_e = i;\n\ti++;\n\n\t/* skip any amount of whitespace or newline */\n\t/* (this is much more laxist than original markdown syntax) */\n\twhile (i < size && _isspace(data[i]))\n\t\ti++;\n\n\t/* inline style link */\n\tif (i < size && data[i] == '(') {\n\t\t/* skipping initial whitespace */\n\t\ti++;\n\n\t\twhile (i < size && _isspace(data[i]))\n\t\t\ti++;\n\n\t\tlink_b = i;\n\n\t\t/* looking for link end: ' \" ) */\n\t\twhile (i < size) {\n\t\t\tif (data[i] == '\\\\') i += 2;\n\t\t\telse if (data[i] == ')') break;\n\t\t\telse if (i >= 1 && _isspace(data[i-1]) && (data[i] == '\\'' || data[i] == '\"')) break;\n\t\t\telse i++;\n\t\t}\n\n\t\tif (i >= size) goto cleanup;\n\t\tlink_e = i;\n\n\t\t/* looking for title end if present */\n\t\tif (data[i] == '\\'' || data[i] == '\"') {\n\t\t\tqtype = data[i];\n\t\t\tin_title = 1;\n\t\t\ti++;\n\t\t\ttitle_b = i;\n\n\t\t\twhile (i < size) {\n\t\t\t\tif (data[i] == '\\\\') i += 2;\n\t\t\t\telse if (data[i] == qtype) {in_title = 0; i++;}\n\t\t\t\telse if ((data[i] == ')') && !in_title) break;\n\t\t\t\telse i++;\n\t\t\t}\n\n\t\t\tif (i >= size) goto cleanup;\n\n\t\t\t/* skipping whitespaces after title */\n\t\t\ttitle_e = i - 1;\n\t\t\twhile (title_e > title_b && _isspace(data[title_e]))\n\t\t\t\ttitle_e--;\n\n\t\t\t/* checking for closing quote presence */\n\t\t\tif (data[title_e] != '\\'' &&  data[title_e] != '\"') {\n\t\t\t\ttitle_b = title_e = 0;\n\t\t\t\tlink_e = i;\n\t\t\t}\n\t\t}\n\n\t\t/* remove whitespace at the end of the link */\n\t\twhile (link_e > link_b && _isspace(data[link_e - 1]))\n\t\t\tlink_e--;\n\n\t\t/* remove optional angle brackets around the link */\n\t\tif (data[link_b] == '<') link_b++;\n\t\tif (data[link_e - 1] == '>') link_e--;\n\n\t\t/* building escaped link and title */\n\t\tif (link_e > link_b) {\n\t\t\tlink = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\tbufput(link, data + link_b, link_e - link_b);\n\t\t}\n\n\t\tif (title_e > title_b) {\n\t\t\ttitle = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\tbufput(title, data + title_b, title_e - title_b);\n\t\t}\n\n\t\ti++;\n\t}\n\n\t/* reference style link */\n\telse if (i < size && data[i] == '[') {\n\t\tstruct buf id = { 0, 0, 0, 0 };\n\t\tstruct link_ref *lr;\n\n\t\t/* looking for the id */\n\t\ti++;\n\t\tlink_b = i;\n\t\twhile (i < size && data[i] != ']') i++;\n\t\tif (i >= size) goto cleanup;\n\t\tlink_e = i;\n\n\t\t/* finding the link_ref */\n\t\tif (link_b == link_e) {\n\t\t\tif (text_has_nl) {\n\t\t\t\tstruct buf *b = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\t\tsize_t j;\n\n\t\t\t\tfor (j = 1; j < txt_e; j++) {\n\t\t\t\t\tif (data[j] != '\\n')\n\t\t\t\t\t\tbufputc(b, data[j]);\n\t\t\t\t\telse if (data[j - 1] != ' ')\n\t\t\t\t\t\tbufputc(b, ' ');\n\t\t\t\t}\n\n\t\t\t\tid.data = b->data;\n\t\t\t\tid.size = b->size;\n\t\t\t} else {\n\t\t\t\tid.data = data + 1;\n\t\t\t\tid.size = txt_e - 1;\n\t\t\t}\n\t\t} else {\n\t\t\tid.data = data + link_b;\n\t\t\tid.size = link_e - link_b;\n\t\t}\n\n\t\tlr = find_link_ref(rndr->refs, id.data, id.size);\n\t\tif (!lr)\n\t\t\tgoto cleanup;\n\n\t\t/* keeping link and title from link_ref */\n\t\tlink = lr->link;\n\t\ttitle = lr->title;\n\t\ti++;\n\t}\n\n\t/* shortcut reference style link */\n\telse {\n\t\tstruct buf id = { 0, 0, 0, 0 };\n\t\tstruct link_ref *lr;\n\n\t\t/* crafting the id */\n\t\tif (text_has_nl) {\n\t\t\tstruct buf *b = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\tsize_t j;\n\n\t\t\tfor (j = 1; j < txt_e; j++) {\n\t\t\t\tif (data[j] != '\\n')\n\t\t\t\t\tbufputc(b, data[j]);\n\t\t\t\telse if (data[j - 1] != ' ')\n\t\t\t\t\tbufputc(b, ' ');\n\t\t\t}\n\n\t\t\tid.data = b->data;\n\t\t\tid.size = b->size;\n\t\t} else {\n\t\t\tid.data = data + 1;\n\t\t\tid.size = txt_e - 1;\n\t\t}\n\n\t\t/* finding the link_ref */\n\t\tlr = find_link_ref(rndr->refs, id.data, id.size);\n\t\tif (!lr)\n\t\t\tgoto cleanup;\n\n\t\t/* keeping link and title from link_ref */\n\t\tlink = lr->link;\n\t\ttitle = lr->title;\n\n\t\t/* rewinding the whitespace */\n\t\ti = txt_e + 1;\n\t}\n\n\t/* building content: img alt is escaped, link content is parsed */\n\tif (txt_e > 1) {\n\t\tcontent = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\tif (is_img) {\n\t\t\tbufput(content, data + 1, txt_e - 1);\n\t\t} else {\n\t\t\t/* disable autolinking when parsing inline the\n\t\t\t * content of a link */\n\t\t\trndr->in_link_body = 1;\n\t\t\tparse_inline(content, rndr, data + 1, txt_e - 1);\n\t\t\trndr->in_link_body = 0;\n\t\t}\n\t}\n\n\tif (link) {\n\t\tu_link = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\tunscape_text(u_link, link);\n\t}\n\n\t/* calling the relevant rendering function */\n\tif (is_img) {\n\t\tif (ob->size && ob->data[ob->size - 1] == '!')\n\t\t\tob->size -= 1;\n\n\t\tret = rndr->cb.image(ob, u_link, title, content, rndr->opaque);\n\t} else {\n\t\tret = rndr->cb.link(ob, u_link, title, content, rndr->opaque);\n\t}\n\n\t/* cleanup */\ncleanup:\n\trndr->work_bufs[BUFFER_SPAN].size = (int)org_work_size;\n\treturn ret ? i : 0;\n}\n\nstatic size_t\nchar_superscript(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tsize_t sup_start, sup_len;\n\tstruct buf *sup;\n\n\tif (!rndr->cb.superscript)\n\t\treturn 0;\n\n\tif (size < 2)\n\t\treturn 0;\n\n\tif (data[1] == '(') {\n\t\tsup_start = sup_len = 2;\n\n\t\twhile (sup_len < size && data[sup_len] != ')' && data[sup_len - 1] != '\\\\')\n\t\t\tsup_len++;\n\n\t\tif (sup_len == size)\n\t\t\treturn 0;\n\t} else {\n\t\tsup_start = sup_len = 1;\n\n\t\twhile (sup_len < size && !_isspace(data[sup_len]))\n\t\t\tsup_len++;\n\t}\n\n\tif (sup_len - sup_start == 0)\n\t\treturn (sup_start == 2) ? 3 : 0;\n\n\tsup = rndr_newbuf(rndr, BUFFER_SPAN);\n\tparse_inline(sup, rndr, data + sup_start, sup_len - sup_start);\n\trndr->cb.superscript(ob, sup, rndr->opaque);\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\n\treturn (sup_start == 2) ? sup_len + 1 : sup_len;\n}\n\n/*********************************\n * BLOCK-LEVEL PARSING FUNCTIONS *\n *********************************/\n\n/* is_empty • returns the line length when it is empty, 0 otherwise */\nstatic size_t\nis_empty(uint8_t *data, size_t size)\n{\n\tsize_t i;\n\n\tfor (i = 0; i < size && data[i] != '\\n'; i++)\n\t\tif (data[i] != ' ')\n\t\t\treturn 0;\n\n\treturn i + 1;\n}\n\n/* is_hrule • returns whether a line is a horizontal rule */\nstatic int\nis_hrule(uint8_t *data, size_t size)\n{\n\tsize_t i = 0, n = 0;\n\tuint8_t c;\n\n\t/* skipping initial spaces */\n\tif (size < 3) return 0;\n\tif (data[0] == ' ') { i++;\n\tif (data[1] == ' ') { i++;\n\tif (data[2] == ' ') { i++; } } }\n\n\t/* looking at the hrule uint8_t */\n\tif (i + 2 >= size\n\t|| (data[i] != '*' && data[i] != '-' && data[i] != '_'))\n\t\treturn 0;\n\tc = data[i];\n\n\t/* the whole line must be the char or whitespace */\n\twhile (i < size && data[i] != '\\n') {\n\t\tif (data[i] == c) n++;\n\t\telse if (data[i] != ' ')\n\t\t\treturn 0;\n\n\t\ti++;\n\t}\n\n\treturn n >= 3;\n}\n\n/* check if a line begins with a code fence; return the\n * width of the code fence */\nstatic size_t\nprefix_codefence(uint8_t *data, size_t size)\n{\n\tsize_t i = 0, n = 0;\n\tuint8_t c;\n\n\t/* skipping initial spaces */\n\tif (size < 3) return 0;\n\tif (data[0] == ' ') { i++;\n\tif (data[1] == ' ') { i++;\n\tif (data[2] == ' ') { i++; } } }\n\n\t/* looking at the hrule uint8_t */\n\tif (i + 2 >= size || !(data[i] == '~' || data[i] == '`'))\n\t\treturn 0;\n\n\tc = data[i];\n\n\t/* the whole line must be the uint8_t or whitespace */\n\twhile (i < size && data[i] == c) {\n\t\tn++; i++;\n\t}\n\n\tif (n < 3)\n\t\treturn 0;\n\n\treturn i;\n}\n\n/* check if a line is a code fence; return its size if it is */\nstatic size_t\nis_codefence(uint8_t *data, size_t size, struct buf *syntax)\n{\n\tsize_t i = 0, syn_len = 0;\n\tuint8_t *syn_start;\n\n\ti = prefix_codefence(data, size);\n\tif (i == 0)\n\t\treturn 0;\n\n\twhile (i < size && data[i] == ' ')\n\t\ti++;\n\n\tsyn_start = data + i;\n\n\tif (i < size && data[i] == '{') {\n\t\ti++; syn_start++;\n\n\t\twhile (i < size && data[i] != '}' && data[i] != '\\n') {\n\t\t\tsyn_len++; i++;\n\t\t}\n\n\t\tif (i == size || data[i] != '}')\n\t\t\treturn 0;\n\n\t\t/* strip all whitespace at the beginning and the end\n\t\t * of the {} block */\n\t\twhile (syn_len > 0 && _isspace(syn_start[0])) {\n\t\t\tsyn_start++; syn_len--;\n\t\t}\n\n\t\twhile (syn_len > 0 && _isspace(syn_start[syn_len - 1]))\n\t\t\tsyn_len--;\n\n\t\ti++;\n\t} else {\n\t\twhile (i < size && !_isspace(data[i])) {\n\t\t\tsyn_len++; i++;\n\t\t}\n\t}\n\n\tif (syntax) {\n\t\tsyntax->data = syn_start;\n\t\tsyntax->size = syn_len;\n\t}\n\n\twhile (i < size && data[i] != '\\n') {\n\t\tif (!_isspace(data[i]))\n\t\t\treturn 0;\n\n\t\ti++;\n\t}\n\n\treturn i + 1;\n}\n\n/* is_atxheader • returns whether the line is a hash-prefixed header */\nstatic int\nis_atxheader(struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tif (data[0] != '#')\n\t\treturn 0;\n\n\tif (rndr->ext_flags & MKDEXT_SPACE_HEADERS) {\n\t\tsize_t level = 0;\n\n\t\twhile (level < size && level < 6 && data[level] == '#')\n\t\t\tlevel++;\n\n\t\tif (level < size && data[level] != ' ')\n\t\t\treturn 0;\n\t}\n\n\treturn 1;\n}\n\n/* is_headerline • returns whether the line is a setext-style hdr underline */\nstatic int\nis_headerline(uint8_t *data, size_t size)\n{\n\tsize_t i = 0;\n\n\t/* test of level 1 header */\n\tif (data[i] == '=') {\n\t\tfor (i = 1; i < size && data[i] == '='; i++);\n\t\twhile (i < size && data[i] == ' ') i++;\n\t\treturn (i >= size || data[i] == '\\n') ? 1 : 0; }\n\n\t/* test of level 2 header */\n\tif (data[i] == '-') {\n\t\tfor (i = 1; i < size && data[i] == '-'; i++);\n\t\twhile (i < size && data[i] == ' ') i++;\n\t\treturn (i >= size || data[i] == '\\n') ? 2 : 0; }\n\n\treturn 0;\n}\n\nstatic int\nis_next_headerline(uint8_t *data, size_t size)\n{\n\tsize_t i = 0;\n\n\twhile (i < size && data[i] != '\\n')\n\t\ti++;\n\n\tif (++i >= size)\n\t\treturn 0;\n\n\treturn is_headerline(data + i, size - i);\n}\n\n/* prefix_quote • returns blockquote prefix length */\nstatic size_t\nprefix_quote(uint8_t *data, size_t size)\n{\n\tsize_t i = 0;\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\n\tif (i < size && data[i] == '>') {\n\t\tif (i + 1 < size && data[i + 1] == ' ')\n\t\t\treturn i + 2;\n\n\t\treturn i + 1;\n\t}\n\n\treturn 0;\n}\n\n/* prefix_code • returns prefix length for block code*/\nstatic size_t\nprefix_code(uint8_t *data, size_t size)\n{\n\tif (size > 3 && data[0] == ' ' && data[1] == ' '\n\t\t&& data[2] == ' ' && data[3] == ' ') return 4;\n\n\treturn 0;\n}\n\n/* prefix_oli • returns ordered list item prefix */\nstatic size_t\nprefix_oli(uint8_t *data, size_t size)\n{\n\tsize_t i = 0;\n\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\n\tif (i >= size || data[i] < '0' || data[i] > '9')\n\t\treturn 0;\n\n\twhile (i < size && data[i] >= '0' && data[i] <= '9')\n\t\ti++;\n\n\tif (i + 1 >= size || data[i] != '.' || data[i + 1] != ' ')\n\t\treturn 0;\n\n\tif (is_next_headerline(data + i, size - i))\n\t\treturn 0;\n\n\treturn i + 2;\n}\n\n/* prefix_uli • returns ordered list item prefix */\nstatic size_t\nprefix_uli(uint8_t *data, size_t size)\n{\n\tsize_t i = 0;\n\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\n\tif (i + 1 >= size ||\n\t\t(data[i] != '*' && data[i] != '+' && data[i] != '-') ||\n\t\tdata[i + 1] != ' ')\n\t\treturn 0;\n\n\tif (is_next_headerline(data + i, size - i))\n\t\treturn 0;\n\n\treturn i + 2;\n}\n\n\n/* parse_block • parsing of one block, returning next uint8_t to parse */\nstatic void parse_block(struct buf *ob, struct sd_markdown *rndr,\n\t\t\tuint8_t *data, size_t size);\n\n\n/* parse_blockquote • handles parsing of a blockquote fragment */\nstatic size_t\nparse_blockquote(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t beg, end = 0, pre, work_size = 0;\n\tuint8_t *work_data = 0;\n\tstruct buf *out = 0;\n\n\tout = rndr_newbuf(rndr, BUFFER_BLOCK);\n\tbeg = 0;\n\twhile (beg < size) {\n\t\tfor (end = beg + 1; end < size && data[end - 1] != '\\n'; end++);\n\n\t\tpre = prefix_quote(data + beg, end - beg);\n\n\t\tif (pre)\n\t\t\tbeg += pre; /* skipping prefix */\n\n\t\t/* empty line followed by non-quote line */\n\t\telse if (is_empty(data + beg, end - beg) &&\n\t\t\t\t(end >= size || (prefix_quote(data + end, size - end) == 0 &&\n\t\t\t\t!is_empty(data + end, size - end))))\n\t\t\tbreak;\n\n\t\tif (beg < end) { /* copy into the in-place working buffer */\n\t\t\t/* bufput(work, data + beg, end - beg); */\n\t\t\tif (!work_data)\n\t\t\t\twork_data = data + beg;\n\t\t\telse if (data + beg != work_data + work_size)\n\t\t\t\tmemmove(work_data + work_size, data + beg, end - beg);\n\t\t\twork_size += end - beg;\n\t\t}\n\t\tbeg = end;\n\t}\n\n\tparse_block(out, rndr, work_data, work_size);\n\tif (rndr->cb.blockquote)\n\t\trndr->cb.blockquote(ob, out, rndr->opaque);\n\trndr_popbuf(rndr, BUFFER_BLOCK);\n\treturn end;\n}\n\nstatic size_t\nparse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int do_render);\n\n/* parse_blockquote • handles parsing of a regular paragraph */\nstatic size_t\nparse_paragraph(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t i = 0, end = 0;\n\tint level = 0;\n\tstruct buf work = { data, 0, 0, 0 };\n\n\twhile (i < size) {\n\t\tfor (end = i + 1; end < size && data[end - 1] != '\\n'; end++) /* empty */;\n\n\t\tif (is_empty(data + i, size - i))\n\t\t\tbreak;\n\n\t\tif ((level = is_headerline(data + i, size - i)) != 0)\n\t\t\tbreak;\n\n\t\tif (is_atxheader(rndr, data + i, size - i) ||\n\t\t\tis_hrule(data + i, size - i) ||\n\t\t\tprefix_quote(data + i, size - i)) {\n\t\t\tend = i;\n\t\t\tbreak;\n\t\t}\n\n\t\t/*\n\t\t * Early termination of a paragraph with the same logic\n\t\t * as Markdown 1.0.0. If this logic is applied, the\n\t\t * Markdown 1.0.3 test suite won't pass cleanly\n\t\t *\n\t\t * :: If the first character in a new line is not a letter,\n\t\t * let's check to see if there's some kind of block starting\n\t\t * here\n\t\t */\n\t\tif ((rndr->ext_flags & MKDEXT_LAX_SPACING) && !isalnum(data[i])) {\n\t\t\tif (prefix_oli(data + i, size - i) ||\n\t\t\t\tprefix_uli(data + i, size - i)) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* see if an html block starts here */\n\t\t\tif (data[i] == '<' && rndr->cb.blockhtml &&\n\t\t\t\tparse_htmlblock(ob, rndr, data + i, size - i, 0)) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* see if a code fence starts here */\n\t\t\tif ((rndr->ext_flags & MKDEXT_FENCED_CODE) != 0 &&\n\t\t\t\tis_codefence(data + i, size - i, NULL) != 0) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\ti = end;\n\t}\n\n\twork.size = i;\n\twhile (work.size && data[work.size - 1] == '\\n')\n\t\twork.size--;\n\n\tif (!level) {\n\t\tstruct buf *tmp = rndr_newbuf(rndr, BUFFER_BLOCK);\n\t\tparse_inline(tmp, rndr, work.data, work.size);\n\t\tif (rndr->cb.paragraph)\n\t\t\trndr->cb.paragraph(ob, tmp, rndr->opaque);\n\t\trndr_popbuf(rndr, BUFFER_BLOCK);\n\t} else {\n\t\tstruct buf *header_work;\n\n\t\tif (work.size) {\n\t\t\tsize_t beg;\n\t\t\ti = work.size;\n\t\t\twork.size -= 1;\n\n\t\t\twhile (work.size && data[work.size] != '\\n')\n\t\t\t\twork.size -= 1;\n\n\t\t\tbeg = work.size + 1;\n\t\t\twhile (work.size && data[work.size - 1] == '\\n')\n\t\t\t\twork.size -= 1;\n\n\t\t\tif (work.size > 0) {\n\t\t\t\tstruct buf *tmp = rndr_newbuf(rndr, BUFFER_BLOCK);\n\t\t\t\tparse_inline(tmp, rndr, work.data, work.size);\n\n\t\t\t\tif (rndr->cb.paragraph)\n\t\t\t\t\trndr->cb.paragraph(ob, tmp, rndr->opaque);\n\n\t\t\t\trndr_popbuf(rndr, BUFFER_BLOCK);\n\t\t\t\twork.data += beg;\n\t\t\t\twork.size = i - beg;\n\t\t\t}\n\t\t\telse work.size = i;\n\t\t}\n\n\t\theader_work = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\tparse_inline(header_work, rndr, work.data, work.size);\n\n\t\tif (rndr->cb.header)\n\t\t\trndr->cb.header(ob, header_work, (int)level, rndr->opaque);\n\n\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t}\n\n\treturn end;\n}\n\n/* parse_fencedcode • handles parsing of a block-level code fragment */\nstatic size_t\nparse_fencedcode(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t beg, end;\n\tstruct buf *work = 0;\n\tstruct buf lang = { 0, 0, 0, 0 };\n\n\tbeg = is_codefence(data, size, &lang);\n\tif (beg == 0) return 0;\n\n\twork = rndr_newbuf(rndr, BUFFER_BLOCK);\n\n\twhile (beg < size) {\n\t\tsize_t fence_end;\n\t\tstruct buf fence_trail = { 0, 0, 0, 0 };\n\n\t\tfence_end = is_codefence(data + beg, size - beg, &fence_trail);\n\t\tif (fence_end != 0 && fence_trail.size == 0) {\n\t\t\tbeg += fence_end;\n\t\t\tbreak;\n\t\t}\n\n\t\tfor (end = beg + 1; end < size && data[end - 1] != '\\n'; end++);\n\n\t\tif (beg < end) {\n\t\t\t/* verbatim copy to the working buffer,\n\t\t\t\tescaping entities */\n\t\t\tif (is_empty(data + beg, end - beg))\n\t\t\t\tbufputc(work, '\\n');\n\t\t\telse bufput(work, data + beg, end - beg);\n\t\t}\n\t\tbeg = end;\n\t}\n\n\tif (work->size && work->data[work->size - 1] != '\\n')\n\t\tbufputc(work, '\\n');\n\n\tif (rndr->cb.blockcode)\n\t\trndr->cb.blockcode(ob, work, lang.size ? &lang : NULL, rndr->opaque);\n\n\trndr_popbuf(rndr, BUFFER_BLOCK);\n\treturn beg;\n}\n\nstatic size_t\nparse_blockcode(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t beg, end, pre;\n\tstruct buf *work = 0;\n\n\twork = rndr_newbuf(rndr, BUFFER_BLOCK);\n\n\tbeg = 0;\n\twhile (beg < size) {\n\t\tfor (end = beg + 1; end < size && data[end - 1] != '\\n'; end++) {};\n\t\tpre = prefix_code(data + beg, end - beg);\n\n\t\tif (pre)\n\t\t\tbeg += pre; /* skipping prefix */\n\t\telse if (!is_empty(data + beg, end - beg))\n\t\t\t/* non-empty non-prefixed line breaks the pre */\n\t\t\tbreak;\n\n\t\tif (beg < end) {\n\t\t\t/* verbatim copy to the working buffer,\n\t\t\t\tescaping entities */\n\t\t\tif (is_empty(data + beg, end - beg))\n\t\t\t\tbufputc(work, '\\n');\n\t\t\telse bufput(work, data + beg, end - beg);\n\t\t}\n\t\tbeg = end;\n\t}\n\n\twhile (work->size && work->data[work->size - 1] == '\\n')\n\t\twork->size -= 1;\n\n\tbufputc(work, '\\n');\n\n\tif (rndr->cb.blockcode)\n\t\trndr->cb.blockcode(ob, work, NULL, rndr->opaque);\n\n\trndr_popbuf(rndr, BUFFER_BLOCK);\n\treturn beg;\n}\n\n/* parse_listitem • parsing of a single list item */\n/*\tassuming initial prefix is already removed */\nstatic size_t\nparse_listitem(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int *flags)\n{\n\tstruct buf *work = 0, *inter = 0;\n\tsize_t beg = 0, end, pre, sublist = 0, orgpre = 0, i;\n\tint in_empty = 0, has_inside_empty = 0, in_fence = 0;\n\n\t/* keeping track of the first indentation prefix */\n\twhile (orgpre < 3 && orgpre < size && data[orgpre] == ' ')\n\t\torgpre++;\n\n\tbeg = prefix_uli(data, size);\n\tif (!beg)\n\t\tbeg = prefix_oli(data, size);\n\n\tif (!beg)\n\t\treturn 0;\n\n\t/* skipping to the beginning of the following line */\n\tend = beg;\n\twhile (end < size && data[end - 1] != '\\n')\n\t\tend++;\n\n\t/* getting working buffers */\n\twork = rndr_newbuf(rndr, BUFFER_SPAN);\n\tinter = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\t/* putting the first line into the working buffer */\n\tbufput(work, data + beg, end - beg);\n\tbeg = end;\n\n\t/* process the following lines */\n\twhile (beg < size) {\n\t\tsize_t has_next_uli = 0, has_next_oli = 0;\n\n\t\tend++;\n\n\t\twhile (end < size && data[end - 1] != '\\n')\n\t\t\tend++;\n\n\t\t/* process an empty line */\n\t\tif (is_empty(data + beg, end - beg)) {\n\t\t\tin_empty = 1;\n\t\t\tbeg = end;\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* calculating the indentation */\n\t\ti = 0;\n\t\twhile (i < 4 && beg + i < end && data[beg + i] == ' ')\n\t\t\ti++;\n\n\t\tpre = i;\n\n\t\tif (rndr->ext_flags & MKDEXT_FENCED_CODE) {\n\t\t\tif (is_codefence(data + beg + i, end - beg - i, NULL) != 0)\n\t\t\t\tin_fence = !in_fence;\n\t\t}\n\n\t\t/* Only check for new list items if we are **not** inside\n\t\t * a fenced code block */\n\t\tif (!in_fence) {\n\t\t\thas_next_uli = prefix_uli(data + beg + i, end - beg - i);\n\t\t\thas_next_oli = prefix_oli(data + beg + i, end - beg - i);\n\t\t}\n\n\t\t/* checking for ul/ol switch */\n\t\tif (in_empty && (\n\t\t\t((*flags & MKD_LIST_ORDERED) && has_next_uli) ||\n\t\t\t(!(*flags & MKD_LIST_ORDERED) && has_next_oli))){\n\t\t\t*flags |= MKD_LI_END;\n\t\t\tbreak; /* the following item must have same list type */\n\t\t}\n\n\t\t/* checking for a new item */\n\t\tif ((has_next_uli && !is_hrule(data + beg + i, end - beg - i)) || has_next_oli) {\n\t\t\tif (in_empty)\n\t\t\t\thas_inside_empty = 1;\n\n\t\t\tif (pre == orgpre) /* the following item must have */\n\t\t\t\tbreak;             /* the same indentation */\n\n\t\t\tif (!sublist)\n\t\t\t\tsublist = work->size;\n\t\t}\n\t\t/* joining only indented stuff after empty lines;\n\t\t * note that now we only require 1 space of indentation\n\t\t * to continue a list */\n\t\telse if (in_empty && pre == 0) {\n\t\t\t*flags |= MKD_LI_END;\n\t\t\tbreak;\n\t\t}\n\t\telse if (in_empty) {\n\t\t\tbufputc(work, '\\n');\n\t\t\thas_inside_empty = 1;\n\t\t}\n\n\t\tin_empty = 0;\n\n\t\t/* adding the line without prefix into the working buffer */\n\t\tbufput(work, data + beg + i, end - beg - i);\n\t\tbeg = end;\n\t}\n\n\t/* render of li contents */\n\tif (has_inside_empty)\n\t\t*flags |= MKD_LI_BLOCK;\n\n\tif (*flags & MKD_LI_BLOCK) {\n\t\t/* intermediate render of block li */\n\t\tif (sublist && sublist < work->size) {\n\t\t\tparse_block(inter, rndr, work->data, sublist);\n\t\t\tparse_block(inter, rndr, work->data + sublist, work->size - sublist);\n\t\t}\n\t\telse\n\t\t\tparse_block(inter, rndr, work->data, work->size);\n\t} else {\n\t\t/* intermediate render of inline li */\n\t\tif (sublist && sublist < work->size) {\n\t\t\tparse_inline(inter, rndr, work->data, sublist);\n\t\t\tparse_block(inter, rndr, work->data + sublist, work->size - sublist);\n\t\t}\n\t\telse\n\t\t\tparse_inline(inter, rndr, work->data, work->size);\n\t}\n\n\t/* render of li itself */\n\tif (rndr->cb.listitem)\n\t\trndr->cb.listitem(ob, inter, *flags, rndr->opaque);\n\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\treturn beg;\n}\n\n\n/* parse_list • parsing ordered or unordered list block */\nstatic size_t\nparse_list(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int flags)\n{\n\tstruct buf *work = 0;\n\tsize_t i = 0, j;\n\n\twork = rndr_newbuf(rndr, BUFFER_BLOCK);\n\n\twhile (i < size) {\n\t\tj = parse_listitem(work, rndr, data + i, size - i, &flags);\n\t\ti += j;\n\n\t\tif (!j || (flags & MKD_LI_END))\n\t\t\tbreak;\n\t}\n\n\tif (rndr->cb.list)\n\t\trndr->cb.list(ob, work, flags, rndr->opaque);\n\trndr_popbuf(rndr, BUFFER_BLOCK);\n\treturn i;\n}\n\n/* parse_atxheader • parsing of atx-style headers */\nstatic size_t\nparse_atxheader(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t level = 0;\n\tsize_t i, end, skip;\n\n\twhile (level < size && level < 6 && data[level] == '#')\n\t\tlevel++;\n\n\tfor (i = level; i < size && data[i] == ' '; i++);\n\n\tfor (end = i; end < size && data[end] != '\\n'; end++);\n\tskip = end;\n\n\twhile (end && data[end - 1] == '#')\n\t\tend--;\n\n\twhile (end && data[end - 1] == ' ')\n\t\tend--;\n\n\tif (end > i) {\n\t\tstruct buf *work = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\t\tparse_inline(work, rndr, data + i, end - i);\n\n\t\tif (rndr->cb.header)\n\t\t\trndr->cb.header(ob, work, (int)level, rndr->opaque);\n\n\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t}\n\n\treturn skip;\n}\n\n\n/* htmlblock_end • checking end of HTML block : </tag>[ \\t]*\\n[ \\t*]\\n */\n/*\treturns the length on match, 0 otherwise */\nstatic size_t\nhtmlblock_end_tag(\n\tconst char *tag,\n\tsize_t tag_len,\n\tstruct sd_markdown *rndr,\n\tuint8_t *data,\n\tsize_t size)\n{\n\tsize_t i, w;\n\n\t/* checking if tag is a match */\n\tif (tag_len + 3 >= size ||\n\t\tstrncasecmp((char *)data + 2, tag, tag_len) != 0 ||\n\t\tdata[tag_len + 2] != '>')\n\t\treturn 0;\n\n\t/* checking white lines */\n\ti = tag_len + 3;\n\tw = 0;\n\tif (i < size && (w = is_empty(data + i, size - i)) == 0)\n\t\treturn 0; /* non-blank after tag */\n\ti += w;\n\tw = 0;\n\n\tif (i < size)\n\t\tw = is_empty(data + i, size - i);\n\n\treturn i + w;\n}\n\nstatic size_t\nhtmlblock_end(const char *curtag,\n\tstruct sd_markdown *rndr,\n\tuint8_t *data,\n\tsize_t size,\n\tint start_of_line)\n{\n\tsize_t tag_size = strlen(curtag);\n\tsize_t i = 1, end_tag;\n\tint block_lines = 0;\n\n\twhile (i < size) {\n\t\ti++;\n\t\twhile (i < size && !(data[i - 1] == '<' && data[i] == '/')) {\n\t\t\tif (data[i] == '\\n')\n\t\t\t\tblock_lines++;\n\n\t\t\ti++;\n\t\t}\n\n\t\t/* If we are only looking for unindented tags, skip the tag\n\t\t * if it doesn't follow a newline.\n\t\t *\n\t\t * The only exception to this is if the tag is still on the\n\t\t * initial line; in that case it still counts as a closing\n\t\t * tag\n\t\t */\n\t\tif (start_of_line && block_lines > 0 && data[i - 2] != '\\n')\n\t\t\tcontinue;\n\n\t\tif (i + 2 + tag_size >= size)\n\t\t\tbreak;\n\n\t\tend_tag = htmlblock_end_tag(curtag, tag_size, rndr, data + i - 1, size - i + 1);\n\t\tif (end_tag)\n\t\t\treturn i + end_tag - 1;\n\t}\n\n\treturn 0;\n}\n\n\n/* parse_htmlblock • parsing of inline HTML block */\nstatic size_t\nparse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int do_render)\n{\n\tsize_t i, j = 0, tag_end;\n\tconst char *curtag = NULL;\n\tstruct buf work = { data, 0, 0, 0 };\n\n\t/* identification of the opening tag */\n\tif (size < 2 || data[0] != '<')\n\t\treturn 0;\n\n\ti = 1;\n\twhile (i < size && data[i] != '>' && data[i] != ' ')\n\t\ti++;\n\n\tif (i < size)\n\t\tcurtag = find_block_tag((char *)data + 1, (int)i - 1);\n\n\t/* handling of special cases */\n\tif (!curtag) {\n\n\t\t/* HTML comment, laxist form */\n\t\tif (size > 5 && data[1] == '!' && data[2] == '-' && data[3] == '-') {\n\t\t\ti = 5;\n\n\t\t\twhile (i < size && !(data[i - 2] == '-' && data[i - 1] == '-' && data[i] == '>'))\n\t\t\t\ti++;\n\n\t\t\ti++;\n\n\t\t\tif (i < size)\n\t\t\t\tj = is_empty(data + i, size - i);\n\n\t\t\tif (j) {\n\t\t\t\twork.size = i + j;\n\t\t\t\tif (do_render && rndr->cb.blockhtml)\n\t\t\t\t\trndr->cb.blockhtml(ob, &work, rndr->opaque);\n\t\t\t\treturn work.size;\n\t\t\t}\n\t\t}\n\n\t\t/* HR, which is the only self-closing block tag considered */\n\t\tif (size > 4 && (data[1] == 'h' || data[1] == 'H') && (data[2] == 'r' || data[2] == 'R')) {\n\t\t\ti = 3;\n\t\t\twhile (i < size && data[i] != '>')\n\t\t\t\ti++;\n\n\t\t\tif (i + 1 < size) {\n\t\t\t\ti++;\n\t\t\t\tj = is_empty(data + i, size - i);\n\t\t\t\tif (j) {\n\t\t\t\t\twork.size = i + j;\n\t\t\t\t\tif (do_render && rndr->cb.blockhtml)\n\t\t\t\t\t\trndr->cb.blockhtml(ob, &work, rndr->opaque);\n\t\t\t\t\treturn work.size;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* no special case recognised */\n\t\treturn 0;\n\t}\n\n\t/* looking for an unindented matching closing tag */\n\t/*\tfollowed by a blank line */\n\ttag_end = htmlblock_end(curtag, rndr, data, size, 1);\n\n\t/* if not found, trying a second pass looking for indented match */\n\t/* but not if tag is \"ins\" or \"del\" (following original Markdown.pl) */\n\tif (!tag_end && strcmp(curtag, \"ins\") != 0 && strcmp(curtag, \"del\") != 0) {\n\t\ttag_end = htmlblock_end(curtag, rndr, data, size, 0);\n\t}\n\n\tif (!tag_end)\n\t\treturn 0;\n\n\t/* the end of the block has been found */\n\twork.size = tag_end;\n\tif (do_render && rndr->cb.blockhtml)\n\t\trndr->cb.blockhtml(ob, &work, rndr->opaque);\n\n\treturn tag_end;\n}\n\nstatic void\nparse_table_row(\n\tstruct buf *ob,\n\tstruct sd_markdown *rndr,\n\tuint8_t *data,\n\tsize_t size,\n\tsize_t columns,\n\tint *col_data,\n\tint header_flag)\n{\n\tsize_t i = 0, col;\n\tstruct buf *row_work = 0;\n\n\tif (!rndr->cb.table_cell || !rndr->cb.table_row)\n\t\treturn;\n\n\trow_work = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\tif (i < size && data[i] == '|')\n\t\ti++;\n\n\tfor (col = 0; col < columns && i < size; ++col) {\n\t\tsize_t cell_start, cell_end;\n\t\tstruct buf *cell_work;\n\n\t\tcell_work = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\t\twhile (i < size && _isspace(data[i]))\n\t\t\ti++;\n\n\t\tcell_start = i;\n\n\t\twhile (i < size && data[i] != '|')\n\t\t\ti++;\n\n\t\tcell_end = i - 1;\n\n\t\twhile (cell_end > cell_start && _isspace(data[cell_end]))\n\t\t\tcell_end--;\n\n\t\tparse_inline(cell_work, rndr, data + cell_start, 1 + cell_end - cell_start);\n\t\trndr->cb.table_cell(row_work, cell_work, col_data[col] | header_flag, rndr->opaque);\n\n\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\ti++;\n\t}\n\n\tfor (; col < columns; ++col) {\n\t\tstruct buf empty_cell = { 0, 0, 0, 0 };\n\t\trndr->cb.table_cell(row_work, &empty_cell, col_data[col] | header_flag, rndr->opaque);\n\t}\n\n\trndr->cb.table_row(ob, row_work, rndr->opaque);\n\n\trndr_popbuf(rndr, BUFFER_SPAN);\n}\n\nstatic size_t\nparse_table_header(\n\tstruct buf *ob,\n\tstruct sd_markdown *rndr,\n\tuint8_t *data,\n\tsize_t size,\n\tsize_t *columns,\n\tint **column_data)\n{\n\tint pipes;\n\tsize_t i = 0, col, header_end, under_end;\n\n\tpipes = 0;\n\twhile (i < size && data[i] != '\\n')\n\t\tif (data[i++] == '|')\n\t\t\tpipes++;\n\n\tif (i == size || pipes == 0)\n\t\treturn 0;\n\n\theader_end = i;\n\n\twhile (header_end > 0 && _isspace(data[header_end - 1]))\n\t\theader_end--;\n\n\tif (data[0] == '|')\n\t\tpipes--;\n\n\tif (header_end && data[header_end - 1] == '|')\n\t\tpipes--;\n\n\t*columns = pipes + 1;\n\t*column_data = calloc(*columns, sizeof(int));\n\n\t/* Parse the header underline */\n\ti++;\n\tif (i < size && data[i] == '|')\n\t\ti++;\n\n\tunder_end = i;\n\twhile (under_end < size && data[under_end] != '\\n')\n\t\tunder_end++;\n\n\tfor (col = 0; col < *columns && i < under_end; ++col) {\n\t\tsize_t dashes = 0;\n\n\t\twhile (i < under_end && data[i] == ' ')\n\t\t\ti++;\n\n\t\tif (data[i] == ':') {\n\t\t\ti++; (*column_data)[col] |= MKD_TABLE_ALIGN_L;\n\t\t\tdashes++;\n\t\t}\n\n\t\twhile (i < under_end && data[i] == '-') {\n\t\t\ti++; dashes++;\n\t\t}\n\n\t\tif (i < under_end && data[i] == ':') {\n\t\t\ti++; (*column_data)[col] |= MKD_TABLE_ALIGN_R;\n\t\t\tdashes++;\n\t\t}\n\n\t\twhile (i < under_end && data[i] == ' ')\n\t\t\ti++;\n\n\t\tif (i < under_end && data[i] != '|')\n\t\t\tbreak;\n\n\t\tif (dashes < 3)\n\t\t\tbreak;\n\n\t\ti++;\n\t}\n\n\tif (col < *columns)\n\t\treturn 0;\n\n\tparse_table_row(\n\t\tob, rndr, data,\n\t\theader_end,\n\t\t*columns,\n\t\t*column_data,\n\t\tMKD_TABLE_HEADER\n\t);\n\n\treturn under_end + 1;\n}\n\nstatic size_t\nparse_table(\n\tstruct buf *ob,\n\tstruct sd_markdown *rndr,\n\tuint8_t *data,\n\tsize_t size)\n{\n\tsize_t i;\n\n\tstruct buf *header_work = 0;\n\tstruct buf *body_work = 0;\n\n\tsize_t columns;\n\tint *col_data = NULL;\n\n\theader_work = rndr_newbuf(rndr, BUFFER_SPAN);\n\tbody_work = rndr_newbuf(rndr, BUFFER_BLOCK);\n\n\ti = parse_table_header(header_work, rndr, data, size, &columns, &col_data);\n\tif (i > 0) {\n\n\t\twhile (i < size) {\n\t\t\tsize_t row_start;\n\t\t\tint pipes = 0;\n\n\t\t\trow_start = i;\n\n\t\t\twhile (i < size && data[i] != '\\n')\n\t\t\t\tif (data[i++] == '|')\n\t\t\t\t\tpipes++;\n\n\t\t\tif (pipes == 0 || i == size) {\n\t\t\t\ti = row_start;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tparse_table_row(\n\t\t\t\tbody_work,\n\t\t\t\trndr,\n\t\t\t\tdata + row_start,\n\t\t\t\ti - row_start,\n\t\t\t\tcolumns,\n\t\t\t\tcol_data, 0\n\t\t\t);\n\n\t\t\ti++;\n\t\t}\n\n\t\tif (rndr->cb.table)\n\t\t\trndr->cb.table(ob, header_work, body_work, rndr->opaque);\n\t}\n\n\tfree(col_data);\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\trndr_popbuf(rndr, BUFFER_BLOCK);\n\treturn i;\n}\n\n/* parse_block • parsing of one block, returning next uint8_t to parse */\nstatic void\nparse_block(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t beg, end, i;\n\tuint8_t *txt_data;\n\tbeg = 0;\n\n\tif (rndr->work_bufs[BUFFER_SPAN].size +\n\t\trndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting)\n\t\treturn;\n\n\twhile (beg < size) {\n\t\ttxt_data = data + beg;\n\t\tend = size - beg;\n\n\t\tif (is_atxheader(rndr, txt_data, end))\n\t\t\tbeg += parse_atxheader(ob, rndr, txt_data, end);\n\n\t\telse if (data[beg] == '<' && rndr->cb.blockhtml &&\n\t\t\t\t(i = parse_htmlblock(ob, rndr, txt_data, end, 1)) != 0)\n\t\t\tbeg += i;\n\n\t\telse if ((i = is_empty(txt_data, end)) != 0)\n\t\t\tbeg += i;\n\n\t\telse if (is_hrule(txt_data, end)) {\n\t\t\tif (rndr->cb.hrule)\n\t\t\t\trndr->cb.hrule(ob, rndr->opaque);\n\n\t\t\twhile (beg < size && data[beg] != '\\n')\n\t\t\t\tbeg++;\n\n\t\t\tbeg++;\n\t\t}\n\n\t\telse if ((rndr->ext_flags & MKDEXT_FENCED_CODE) != 0 &&\n\t\t\t(i = parse_fencedcode(ob, rndr, txt_data, end)) != 0)\n\t\t\tbeg += i;\n\n\t\telse if ((rndr->ext_flags & MKDEXT_TABLES) != 0 &&\n\t\t\t(i = parse_table(ob, rndr, txt_data, end)) != 0)\n\t\t\tbeg += i;\n\n\t\telse if (prefix_quote(txt_data, end))\n\t\t\tbeg += parse_blockquote(ob, rndr, txt_data, end);\n\n\t\telse if (prefix_code(txt_data, end))\n\t\t\tbeg += parse_blockcode(ob, rndr, txt_data, end);\n\n\t\telse if (prefix_uli(txt_data, end))\n\t\t\tbeg += parse_list(ob, rndr, txt_data, end, 0);\n\n\t\telse if (prefix_oli(txt_data, end))\n\t\t\tbeg += parse_list(ob, rndr, txt_data, end, MKD_LIST_ORDERED);\n\n\t\telse\n\t\t\tbeg += parse_paragraph(ob, rndr, txt_data, end);\n\t}\n}\n\n\n\n/*********************\n * REFERENCE PARSING *\n *********************/\n\n/* is_ref • returns whether a line is a reference or not */\nstatic int\nis_ref(const uint8_t *data, size_t beg, size_t end, size_t *last, struct link_ref **refs)\n{\n/*\tint n; */\n\tsize_t i = 0;\n\tsize_t id_offset, id_end;\n\tsize_t link_offset, link_end;\n\tsize_t title_offset, title_end;\n\tsize_t line_end;\n\n\t/* up to 3 optional leading spaces */\n\tif (beg + 3 >= end) return 0;\n\tif (data[beg] == ' ') { i = 1;\n\tif (data[beg + 1] == ' ') { i = 2;\n\tif (data[beg + 2] == ' ') { i = 3;\n\tif (data[beg + 3] == ' ') return 0; } } }\n\ti += beg;\n\n\t/* id part: anything but a newline between brackets */\n\tif (data[i] != '[') return 0;\n\ti++;\n\tid_offset = i;\n\twhile (i < end && data[i] != '\\n' && data[i] != '\\r' && data[i] != ']')\n\t\ti++;\n\tif (i >= end || data[i] != ']') return 0;\n\tid_end = i;\n\n\t/* spacer: colon (space | tab)* newline? (space | tab)* */\n\ti++;\n\tif (i >= end || data[i] != ':') return 0;\n\ti++;\n\twhile (i < end && data[i] == ' ') i++;\n\tif (i < end && (data[i] == '\\n' || data[i] == '\\r')) {\n\t\ti++;\n\t\tif (i < end && data[i] == '\\r' && data[i - 1] == '\\n') i++; }\n\twhile (i < end && data[i] == ' ') i++;\n\tif (i >= end) return 0;\n\n\t/* link: whitespace-free sequence, optionally between angle brackets */\n\tif (data[i] == '<')\n\t\ti++;\n\n\tlink_offset = i;\n\n\twhile (i < end && data[i] != ' ' && data[i] != '\\n' && data[i] != '\\r')\n\t\ti++;\n\n\tif (data[i - 1] == '>') link_end = i - 1;\n\telse link_end = i;\n\n\t/* optional spacer: (space | tab)* (newline | '\\'' | '\"' | '(' ) */\n\twhile (i < end && data[i] == ' ') i++;\n\tif (i < end && data[i] != '\\n' && data[i] != '\\r'\n\t\t\t&& data[i] != '\\'' && data[i] != '\"' && data[i] != '(')\n\t\treturn 0;\n\tline_end = 0;\n\t/* computing end-of-line */\n\tif (i >= end || data[i] == '\\r' || data[i] == '\\n') line_end = i;\n\tif (i + 1 < end && data[i] == '\\n' && data[i + 1] == '\\r')\n\t\tline_end = i + 1;\n\n\t/* optional (space|tab)* spacer after a newline */\n\tif (line_end) {\n\t\ti = line_end + 1;\n\t\twhile (i < end && data[i] == ' ') i++; }\n\n\t/* optional title: any non-newline sequence enclosed in '\"()\n\t\t\t\t\talone on its line */\n\ttitle_offset = title_end = 0;\n\tif (i + 1 < end\n\t&& (data[i] == '\\'' || data[i] == '\"' || data[i] == '(')) {\n\t\ti++;\n\t\ttitle_offset = i;\n\t\t/* looking for EOL */\n\t\twhile (i < end && data[i] != '\\n' && data[i] != '\\r') i++;\n\t\tif (i + 1 < end && data[i] == '\\n' && data[i + 1] == '\\r')\n\t\t\ttitle_end = i + 1;\n\t\telse\ttitle_end = i;\n\t\t/* stepping back */\n\t\ti -= 1;\n\t\twhile (i > title_offset && data[i] == ' ')\n\t\t\ti -= 1;\n\t\tif (i > title_offset\n\t\t&& (data[i] == '\\'' || data[i] == '\"' || data[i] == ')')) {\n\t\t\tline_end = title_end;\n\t\t\ttitle_end = i; } }\n\n\tif (!line_end || link_end == link_offset)\n\t\treturn 0; /* garbage after the link empty link */\n\n\t/* a valid ref has been found, filling-in return structures */\n\tif (last)\n\t\t*last = line_end;\n\n\tif (refs) {\n\t\tstruct link_ref *ref;\n\n\t\tref = add_link_ref(refs, data + id_offset, id_end - id_offset);\n\t\tif (!ref)\n\t\t\treturn 0;\n\n\t\tref->link = bufnew(link_end - link_offset);\n\t\tbufput(ref->link, data + link_offset, link_end - link_offset);\n\n\t\tif (title_end > title_offset) {\n\t\t\tref->title = bufnew(title_end - title_offset);\n\t\t\tbufput(ref->title, data + title_offset, title_end - title_offset);\n\t\t}\n\t}\n\n\treturn 1;\n}\n\nstatic void expand_tabs(struct buf *ob, const uint8_t *line, size_t size)\n{\n\tsize_t  i = 0, tab = 0;\n\n\twhile (i < size) {\n\t\tsize_t org = i;\n\n\t\twhile (i < size && line[i] != '\\t') {\n\t\t\ti++; tab++;\n\t\t}\n\n\t\tif (i > org)\n\t\t\tbufput(ob, line + org, i - org);\n\n\t\tif (i >= size)\n\t\t\tbreak;\n\n\t\tdo {\n\t\t\tbufputc(ob, ' '); tab++;\n\t\t} while (tab % 4);\n\n\t\ti++;\n\t}\n}\n\n/**********************\n * EXPORTED FUNCTIONS *\n **********************/\n\nstruct sd_markdown *\nsd_markdown_new(\n\tunsigned int extensions,\n\tsize_t max_nesting,\n\tconst struct sd_callbacks *callbacks,\n\tvoid *opaque)\n{\n\tstruct sd_markdown *md = NULL;\n\n\tassert(max_nesting > 0 && callbacks);\n\n\tmd = malloc(sizeof(struct sd_markdown));\n\tif (!md)\n\t\treturn NULL;\n\n\tmemcpy(&md->cb, callbacks, sizeof(struct sd_callbacks));\n\n\tstack_init(&md->work_bufs[BUFFER_BLOCK], 4);\n\tstack_init(&md->work_bufs[BUFFER_SPAN], 8);\n\n\tmemset(md->active_char, 0x0, 256);\n\n\tif (md->cb.emphasis || md->cb.double_emphasis || md->cb.triple_emphasis) {\n\t\tmd->active_char['*'] = MD_CHAR_EMPHASIS;\n\t\tmd->active_char['_'] = MD_CHAR_EMPHASIS;\n\t\tif (extensions & MKDEXT_STRIKETHROUGH)\n\t\t\tmd->active_char['~'] = MD_CHAR_EMPHASIS;\n\t}\n\n\tif (md->cb.codespan)\n\t\tmd->active_char['`'] = MD_CHAR_CODESPAN;\n\n\tif (md->cb.linebreak)\n\t\tmd->active_char['\\n'] = MD_CHAR_LINEBREAK;\n\n\tif (md->cb.image || md->cb.link)\n\t\tmd->active_char['['] = MD_CHAR_LINK;\n\n\tmd->active_char['<'] = MD_CHAR_LANGLE;\n\tmd->active_char['\\\\'] = MD_CHAR_ESCAPE;\n\tmd->active_char['&'] = MD_CHAR_ENTITITY;\n\n\tif (extensions & MKDEXT_AUTOLINK) {\n\t\tmd->active_char[':'] = MD_CHAR_AUTOLINK_URL;\n\t\tmd->active_char['@'] = MD_CHAR_AUTOLINK_EMAIL;\n\t\tmd->active_char['w'] = MD_CHAR_AUTOLINK_WWW;\n\t}\n\n\tif (extensions & MKDEXT_SUPERSCRIPT)\n\t\tmd->active_char['^'] = MD_CHAR_SUPERSCRIPT;\n\n\t/* Extension data */\n\tmd->ext_flags = extensions;\n\tmd->opaque = opaque;\n\tmd->max_nesting = max_nesting;\n\tmd->in_link_body = 0;\n\n\treturn md;\n}\n\nvoid\nsd_markdown_render(struct buf *ob, const uint8_t *document, size_t doc_size, struct sd_markdown *md)\n{\n#define MARKDOWN_GROW(x) ((x) + ((x) >> 1))\n\tstatic const char UTF8_BOM[] = {0xEF, 0xBB, 0xBF};\n\n\tstruct buf *text;\n\tsize_t beg, end;\n\n\ttext = bufnew(64);\n\tif (!text)\n\t\treturn;\n\n\t/* Preallocate enough space for our buffer to avoid expanding while copying */\n\tbufgrow(text, doc_size);\n\n\t/* reset the references table */\n\tmemset(&md->refs, 0x0, REF_TABLE_SIZE * sizeof(void *));\n\n\t/* first pass: looking for references, copying everything else */\n\tbeg = 0;\n\n\t/* Skip a possible UTF-8 BOM, even though the Unicode standard\n\t * discourages having these in UTF-8 documents */\n\tif (doc_size >= 3 && memcmp(document, UTF8_BOM, 3) == 0)\n\t\tbeg += 3;\n\n\twhile (beg < doc_size) /* iterating over lines */\n\t\tif (is_ref(document, beg, doc_size, &end, md->refs))\n\t\t\tbeg = end;\n\t\telse { /* skipping to the next line */\n\t\t\tend = beg;\n\t\t\twhile (end < doc_size && document[end] != '\\n' && document[end] != '\\r')\n\t\t\t\tend++;\n\n\t\t\t/* adding the line body if present */\n\t\t\tif (end > beg)\n\t\t\t\texpand_tabs(text, document + beg, end - beg);\n\n\t\t\twhile (end < doc_size && (document[end] == '\\n' || document[end] == '\\r')) {\n\t\t\t\t/* add one \\n per newline */\n\t\t\t\tif (document[end] == '\\n' || (end + 1 < doc_size && document[end + 1] != '\\n'))\n\t\t\t\t\tbufputc(text, '\\n');\n\t\t\t\tend++;\n\t\t\t}\n\n\t\t\tbeg = end;\n\t\t}\n\n\t/* pre-grow the output buffer to minimize allocations */\n\tbufgrow(ob, MARKDOWN_GROW(text->size));\n\n\t/* second pass: actual rendering */\n\tif (md->cb.doc_header)\n\t\tmd->cb.doc_header(ob, md->opaque);\n\n\tif (text->size) {\n\t\t/* adding a final newline if not already present */\n\t\tif (text->data[text->size - 1] != '\\n' &&  text->data[text->size - 1] != '\\r')\n\t\t\tbufputc(text, '\\n');\n\n\t\tparse_block(ob, md, text->data, text->size);\n\t}\n\n\tif (md->cb.doc_footer)\n\t\tmd->cb.doc_footer(ob, md->opaque);\n\n\t/* clean-up */\n\tbufrelease(text);\n\tfree_link_refs(md->refs);\n\n\tassert(md->work_bufs[BUFFER_SPAN].size == 0);\n\tassert(md->work_bufs[BUFFER_BLOCK].size == 0);\n}\n\nvoid\nsd_markdown_free(struct sd_markdown *md)\n{\n\tsize_t i;\n\n\tfor (i = 0; i < (size_t)md->work_bufs[BUFFER_SPAN].asize; ++i)\n\t\tbufrelease(md->work_bufs[BUFFER_SPAN].item[i]);\n\n\tfor (i = 0; i < (size_t)md->work_bufs[BUFFER_BLOCK].asize; ++i)\n\t\tbufrelease(md->work_bufs[BUFFER_BLOCK].item[i]);\n\n\tstack_free(&md->work_bufs[BUFFER_SPAN]);\n\tstack_free(&md->work_bufs[BUFFER_BLOCK]);\n\n\tfree(md);\n}\n\nvoid\nsd_version(int *ver_major, int *ver_minor, int *ver_revision)\n{\n\t*ver_major = SUNDOWN_VER_MAJOR;\n\t*ver_minor = SUNDOWN_VER_MINOR;\n\t*ver_revision = SUNDOWN_VER_REVISION;\n}\n\n/* vim: set filetype=c: */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/multiboot.h",
    "content": "#pragma once\n\n/* Copyright © 2010, 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n\n#define MULTIBOOT_KERNELMAGIC 0x2BADB002\n\n#define MULTIBOOT_FLAG_MEM\t 0x001\n#define MULTIBOOT_FLAG_DEVICE  0x002\n#define MULTIBOOT_FLAG_CMDLINE 0x004\n#define MULTIBOOT_FLAG_MODS\t0x008\n#define MULTIBOOT_FLAG_AOUT\t0x010\n#define MULTIBOOT_FLAG_ELF\t 0x020\n#define MULTIBOOT_FLAG_MMAP\t0x040\n#define MULTIBOOT_FLAG_CONFIG  0x080\n#define MULTIBOOT_FLAG_LOADER  0x100\n#define MULTIBOOT_FLAG_APM\t 0x200\n#define MULTIBOOT_FLAG_VBE\t 0x400\n\n// The symbol table for a.out.\ntypedef struct\n{\n\tuint32_t\t tabSize;\n\tuint32_t \tstrSize;\n\tuint32_t \taddr;\n\tuint32_t \treserved;\n} __attribute__((packed)) multiboot_aoutSymbolTable_t;\n     \n// The section header table for ELF.\ntypedef struct\n{\n\tuint32_t\t num;\n\tuint32_t\t size;\n\tuint32_t \taddr;\n\tuint32_t\t shndx;\n} __attribute__((packed)) multiboot_elfSectionHeaderTable_t;\n\ntypedef struct\n{\n\tuint32_t\tsize;\n\tuint64_t\taddr;\n\tuint64_t\tlength;\n\tuint32_t\ttype;\n} __attribute__((packed)) multiboot_memoryMap_t;\n\ntypedef struct\n{\n\tuint32_t\tstart;\n\tuint32_t\tend;\n\tchar*\t\tcmdLine;\n\tuint32_t\treserved;\n} __attribute__((packed)) multiboot_module_t;\n\ntypedef struct\n{\n\tuint32_t\tflags;\n\tuint32_t\tmemLower;\n\tuint32_t\tmemUpper;\n\tuint32_t\tbootDevice;\n\tchar*\tcmdLine;\n\tuint32_t\tmodsCount;\n\tmultiboot_module_t*\tmodsAddr;\n\n\tunion\n\t{\n\t\tmultiboot_aoutSymbolTable_t aoutSym;\n\t\tmultiboot_elfSectionHeaderTable_t elfSec;\n\t} u;\n\t\n\tuint32_t\tmmapLength;\n\tuint32_t\tmmapAddr;\n\t\n\tuint32_t drivesLength;\n\tuint32_t drivesAddr;\n\t\n\t// ROM configuration table\n\tuint32_t configTable;\n\t\n\tchar* bootLoaderName;\n\tuint32_t apmTable;\n\t\n\t// Video\n\tuint32_t vbeControlInfo;\n\tuint32_t vbeModeInfo;\n\tuint16_t vbeMode;\n\tuint16_t vbeInterfaceSeg;\n\tuint16_t vbeInterfaceOff;\n\tuint16_t vbeInterfaceLen;\n} __attribute__((packed)) multiboot_info_t;\n\nmultiboot_info_t* multiboot_info;\n\nvoid arch_multiboot_printInfo();\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/ntru_encrypt.h",
    "content": "/*\n * Copyright (C) 2014 FH Bielefeld\n *\n * This file is part of a FH Bielefeld project.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n * MA  02110-1301  USA\n */\n\n/**\n * @file ntru_encrypt.h\n * Header for the internal API of ntru_encrypt.c.\n * @brief header for encrypt.c\n */\n\n#ifndef PQC_ENCRYPT_H\n#define PQC_ENCRYPT_H\n\n\n#include \"ntru_params.h\"\n#include \"ntru_poly.h\"\n#include \"ntru_string.h\"\n\n#include <fmpz_poly.h>\n#include <fmpz.h>\n\n\n/**\n * encrypt the msg, using the math:\n * e = (h ∗ r) + m (mod q)\n *\n * e = the encrypted poly\n *\n * h = the public key\n *\n * r = the random poly\n *\n * m = the message poly\n *\n * q = large mod\n *\n * @param msg_tern the message to encrypt, in ternary format\n * @param pub_key the public key\n * @param rnd the random poly (should have relatively small\n * coefficients, but not restricted to {-1, 0, 1})\n * @param out the output poly which is in the range {0, q-1}\n * (not ternary!) [out]\n * @param params ntru_params the ntru context\n */\nvoid\nntru_encrypt_poly(\n\t\tconst fmpz_poly_t msg_tern,\n\t\tconst fmpz_poly_t pub_key,\n\t\tconst fmpz_poly_t rnd,\n\t\tfmpz_poly_t out,\n\t\tconst ntru_params *params);\n\n/**\n * Encrypt a message in the form of a null-terminated char array and\n * return a string.\n *\n * @param msg the message\n * @param pub_key the public key\n * @param rnd the random poly (should have relatively small\n * coefficients, but not restricted to {-1, 0, 1})\n * @param params ntru_params the ntru context\n * @return the newly allocated encrypted string\n */\nstring *\nntru_encrypt_string(\n\t\tconst string *msg,\n\t\tconst fmpz_poly_t pub_key,\n\t\tconst fmpz_poly_t rnd,\n\t\tconst ntru_params *params);\n\n\n#endif /* PQC_ENCRYPT_H */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/portio.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <lib/stdint.h>\n\n// Legacy\n#define outb(args...) portio_out8(args)\n#define outw(args...) portio_out16(args)\n#define outl(args...) portio_out32(args)\n#define outq(args...) portio_out64(args)\n\n#define inb(args...) portio_in8(args)\n#define inw(args...) portio_in16(args)\n#define inl(args...) portio_in32(args)\n#define inq(args...) portio_in64(args)\n\nvoid portio_out8(uint16_t port, uint8_t value);\nvoid portio_out16(uint16_t port, uint16_t value);\nvoid portio_out32(uint16_t port, uint32_t value);\nvoid portio_out64(uint16_t port, uint64_t value);\n\nuint8_t portio_in8(uint16_t port);\nuint16_t portio_in16(uint16_t port);\nuint32_t portio_in32(uint16_t port);\nuint64_t portio_in64(uint16_t port);\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/pqiv.h",
    "content": "/**\n * pqiv\n *\n * Copyright (c) 2013-2014, Phillip Berndt\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n// This file contains the definition of files, image types and\n// the plugin infrastructure. It should be included in file type\n// handlers.\n\n#ifndef _PQIV_H_INCLUDED\n#define _PQIV_H_INCLUDED\n\n#include <glib.h>\n#include <gtk/gtk.h>\n#include <gio/gio.h>\n#include \"lib/bostree.h\"\n\n#ifndef PQIV_VERSION\n#define PQIV_VERSION \"2.3\"\n#endif\n\n#define FILE_FLAGS_ANIMATION      (guint)(1)\n#define FILE_FLAGS_MEMORY_IMAGE   (guint)(1<<1)\n\n// The structure for images {{{\ntypedef struct file_type_handler_struct_t file_type_handler_t;\ntypedef struct {\n\t// File type\n\tconst file_type_handler_t *file_type;\n\n\t// Special flags\n\t// FILE_FLAGS_ANIMATION        -> Animation functions are invoked\n\t//                                Set by file type handlers\n\t// FILE_FLAGS_MEMORY_IMAGE     -> File lives in memory\n\tguint file_flags;\n\n\t// The file name to display and to sort by\n\tgchar *display_name;\n\n\t// The URI or file name of the file\n\tgchar *file_name;\n\n\t// If the file is a memory image, the actual image data\n\tGBytes *file_data;\n\n\t// The file monitor structure is used for inotify-watching of\n\t// the files\n\tGFileMonitor *file_monitor;\n\n\t// This flag stores whether this image is currently loaded\n\t// and valid. i.e. if it is set, you can assume that\n\t// private_data contains a representation of the image;\n\t// if not, you can NOT assume that it does not.\n\tgboolean is_loaded;\n\n\t// Cached image size\n\tguint width;\n\tguint height;\n\n\t// File-type specific data, allocated and freed by the file type handlers\n\tvoid *private;\n} file_t;\n// }}}\n// Definition of the built-in file types {{{\n\n// If you want to implement your own file type, you'll have to implement the\n// following functions and a non-static initialization function named\n// file_type_NAME_initializer that fills a file_type_handler_t with pointers to\n// the functions. Store the file in backends/NAME.c and adjust the Makefile to\n// add the required libraries if your backend is listed in the $(BACKENDS)\n// variable.\n\ntypedef enum { PARAMETER, RECURSION, INOTIFY, BROWSE_ORIGINAL_PARAMETER, FILTER_OUTPUT } load_images_state_t;\n// Allocation function: Allocate the ->private structure within a file and add the\n// image(s) to the list of available images via load_images_handle_parameter_add_file()\n// If an image is not to be loaded for any reason, the file structure should be\n// deallocated using file_free()\n// Returns a pointer to the first added image\n// Optional, you can also set the pointer to this function to NULL.\ntypedef BOSNode *(*file_type_alloc_fn_t)(load_images_state_t state, file_t *file);\n\n// Deallocation, if a file is removed from the images list. Free the ->private structure.\n// Only called if ->private is non-NULL.\ntypedef void (*file_type_free_fn_t)(file_t *file);\n\n// Actually load a file into memory\ntypedef void (*file_type_load_fn_t)(file_t *file, GInputStream *data, GError **error_pointer);\n\n// Unload a file\ntypedef void (*file_type_unload_fn_t)(file_t *file);\n\n// Animation support: Initialize memory for animations, return ms until first frame\n// Optional, you can also set the pointer to this function to NULL.\ntypedef double (*file_type_animation_initialize_fn_t)(file_t *file);\n\n// Animation support: Advance to the next frame, return ms until next frame\n// Optional, you can also set the pointer to this function to NULL.\ntypedef double (*file_type_animation_next_frame_fn_t)(file_t *file);\n\n// Draw the current view to a cairo context\ntypedef void (*file_type_draw_fn_t)(file_t *file, cairo_t *cr);\n\nstruct file_type_handler_struct_t {\n\t// All files will be filtered with this filter. If it lets it pass,\n\t// a handler is assigned to a file. If none do, the file is\n\t// discarded if it was found during directory traversal or\n\t// loaded using the first image backend if it was an explicit\n\t// parameter.\n\tGtkFileFilter *file_types_handled;\n\n\t// Pointers to the functions defined above\n\tfile_type_alloc_fn_t alloc_fn;\n\tfile_type_free_fn_t free_fn;\n\tfile_type_load_fn_t load_fn;\n\tfile_type_unload_fn_t unload_fn;\n\tfile_type_animation_initialize_fn_t animation_initialize_fn;\n\tfile_type_animation_next_frame_fn_t animation_next_frame_fn;\n\tfile_type_draw_fn_t draw_fn;\n};\n\n// Initialization function: Tell pqiv about a backend\ntypedef void (*file_type_initializer_fn_t)(file_type_handler_t *info);\n\n// pqiv symbols available to plugins {{{\n\n// Global cancellable that should be used for every i/o operation\nextern GCancellable *image_loader_cancellable;\n\n// Current scale level. For backends that don't support cairo natively.\nextern gdouble current_scale_level;\n\n// Load a file from disc/memory/network\nGInputStream *image_loader_stream_file(file_t *file, GError **error_pointer);\n\n// Add a file to the list of loaded files\n// Should be called at least once in a file_type_alloc_fn_t, with the state being\n// forwarded unaltered.\nBOSNode *load_images_handle_parameter_add_file(load_images_state_t state, file_t *file);\n\n// Load all data from an input stream into memory, conveinience function\nGBytes *g_input_stream_read_completely(GInputStream *input_stream, GCancellable *cancellable, GError **error_pointer);\n\n// Free a file\nvoid file_free(file_t *file);\n\n// }}}\n\n// File type handlers, used in the initializer and file type guessing\nextern file_type_handler_t file_type_handlers[];\n\n/* }}} */\n\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/process.c",
    "content": "/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n#include \"uv.h\"\n#include \"internal.h\"\n\n#include <assert.h>\n#include <errno.h>\n#include <sys/wait.h>\n#include <poll.h>\n#include <unistd.h>\n#include <stdio.h>\n#include <fcntl.h>\n\n#ifdef __APPLE__\n# include <TargetConditionals.h>\n#endif\n\n#if defined(__APPLE__) && !TARGET_OS_IPHONE\n# include <crt_externs.h>\n# define environ (*_NSGetEnviron())\n#else\nextern char **environ;\n#endif\n\n\nstatic void uv__chld(EV_P_ ev_child* watcher, int revents) {\n  int status = watcher->rstatus;\n  int exit_status = 0;\n  int term_signal = 0;\n  uv_process_t *process = watcher->data;\n\n  assert(&process->child_watcher == watcher);\n  assert(revents & EV_CHILD);\n\n  ev_child_stop(EV_A_ &process->child_watcher);\n\n  if (WIFEXITED(status)) {\n    exit_status = WEXITSTATUS(status);\n  }\n\n  if (WIFSIGNALED(status)) {\n    term_signal = WTERMSIG(status);\n  }\n\n  if (process->exit_cb) {\n    process->exit_cb(process, exit_status, term_signal);\n  }\n}\n\n\nint uv__make_socketpair(int fds[2], int flags) {\n#ifdef SOCK_NONBLOCK\n  int fl;\n\n  fl = SOCK_CLOEXEC;\n\n  if (flags & UV__F_NONBLOCK)\n    fl |= SOCK_NONBLOCK;\n\n  if (socketpair(AF_UNIX, SOCK_STREAM|fl, 0, fds) == 0)\n    return 0;\n\n  if (errno != EINVAL)\n    return -1;\n\n  /* errno == EINVAL so maybe the kernel headers lied about\n   * the availability of SOCK_NONBLOCK. This can happen if people\n   * build libuv against newer kernel headers than the kernel\n   * they actually run the software on.\n   */\n#endif\n\n  if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds))\n    return -1;\n\n  uv__cloexec(fds[0], 1);\n  uv__cloexec(fds[1], 1);\n\n  if (flags & UV__F_NONBLOCK) {\n    uv__nonblock(fds[0], 1);\n    uv__nonblock(fds[1], 1);\n  }\n\n  return 0;\n}\n\n\nint uv__make_pipe(int fds[2], int flags) {\n#if __linux__\n  int fl;\n\n  fl = UV__O_CLOEXEC;\n\n  if (flags & UV__F_NONBLOCK)\n    fl |= UV__O_NONBLOCK;\n\n  if (uv__pipe2(fds, fl) == 0)\n    return 0;\n\n  if (errno != ENOSYS)\n    return -1;\n#endif\n\n  if (pipe(fds))\n    return -1;\n\n  uv__cloexec(fds[0], 1);\n  uv__cloexec(fds[1], 1);\n\n  if (flags & UV__F_NONBLOCK) {\n    uv__nonblock(fds[0], 1);\n    uv__nonblock(fds[1], 1);\n  }\n\n  return 0;\n}\n\n\n/*\n * Used for initializing stdio streams like options.stdin_stream. Returns\n * zero on success.\n */\nstatic int uv__process_init_stdio(uv_stdio_container_t* container, int fds[2],\n                                  int writable) {\n  int fd = -1;\n  switch (container->flags & (UV_IGNORE | UV_CREATE_PIPE | UV_INHERIT_FD |\n                              UV_INHERIT_STREAM)) {\n    case UV_IGNORE:\n      return 0;\n    case UV_CREATE_PIPE:\n      assert(container->data.stream != NULL);\n\n      if (container->data.stream->type != UV_NAMED_PIPE) {\n        errno = EINVAL;\n        return -1;\n      }\n\n      return uv__make_socketpair(fds, 0);\n    case UV_INHERIT_FD:\n    case UV_INHERIT_STREAM:\n      if (container->flags & UV_INHERIT_FD) {\n        fd = container->data.fd;\n      } else {\n        fd = container->data.stream->fd;\n      }\n\n      if (fd == -1) {\n        errno = EINVAL;\n        return -1;\n      }\n\n      fds[writable ? 1 : 0] = fd;\n\n      return 0;\n    default:\n      assert(0 && \"Unexpected flags\");\n      return -1;\n  }\n}\n\n\nstatic int uv__process_stdio_flags(uv_stdio_container_t* container,\n                                   int writable) {\n  if (container->data.stream->type == UV_NAMED_PIPE &&\n      ((uv_pipe_t*)container->data.stream)->ipc) {\n    return UV_STREAM_READABLE | UV_STREAM_WRITABLE;\n  } else if (writable) {\n    return UV_STREAM_WRITABLE;\n  } else {\n    return UV_STREAM_READABLE;\n  }\n}\n\n\nstatic int uv__process_open_stream(uv_stdio_container_t* container, int fds[2],\n                                   int writable) {\n  int fd = fds[writable ? 1 : 0];\n  int child_fd = fds[writable ? 0 : 1];\n  int flags;\n\n  /* No need to create stream */\n  if (!(container->flags & UV_CREATE_PIPE) || fd < 0) {\n    return 0;\n  }\n\n  assert(child_fd >= 0);\n  close(child_fd);\n\n  uv__nonblock(fd, 1);\n  flags = uv__process_stdio_flags(container, writable);\n\n  return uv__stream_open((uv_stream_t*)container->data.stream, fd, flags);\n}\n\n\nstatic void uv__process_close_stream(uv_stdio_container_t* container) {\n  if (!(container->flags & UV_CREATE_PIPE)) return;\n\n  uv__stream_close((uv_stream_t*)container->data.stream);\n}\n\n\nstatic void uv__process_child_init(uv_process_options_t options,\n                                   int stdio_count,\n                                   int* pipes) {\n  int i;\n\n  if (options.flags & UV_PROCESS_DETACHED) {\n    setsid();\n  }\n\n  /* Dup fds */\n  for (i = 0; i < stdio_count; i++) {\n    /*\n     * stdin has swapped ends of pipe\n     * (it's the only one readable stream)\n     */\n    int close_fd = i == 0 ? pipes[i * 2 + 1] : pipes[i * 2];\n    int use_fd = i == 0 ? pipes[i * 2] : pipes[i * 2 + 1];\n\n    if (use_fd >= 0) {\n      close(close_fd);\n    } else if (i < 3) {\n      /* `/dev/null` stdin, stdout, stderr even if they've flag UV_IGNORE */\n      use_fd = open(\"/dev/null\", i == 0 ? O_RDONLY : O_RDWR);\n\n      if (use_fd < 0) {\n        perror(\"failed to open stdio\");\n        _exit(127);\n      }\n    } else {\n      continue;\n    }\n\n    if (i != use_fd) {\n      dup2(use_fd, i);\n      close(use_fd);\n    }\n  }\n\n  if (options.cwd && chdir(options.cwd)) {\n    perror(\"chdir()\");\n    _exit(127);\n  }\n\n  if ((options.flags & UV_PROCESS_SETGID) && setgid(options.gid)) {\n    perror(\"setgid()\");\n    _exit(127);\n  }\n\n  if ((options.flags & UV_PROCESS_SETUID) && setuid(options.uid)) {\n    perror(\"setuid()\");\n    _exit(127);\n  }\n\n  environ = options.env;\n\n  execvp(options.file, options.args);\n  perror(\"execvp()\");\n  _exit(127);\n}\n\n\n#ifndef SPAWN_WAIT_EXEC\n# define SPAWN_WAIT_EXEC 1\n#endif\n\nint uv_spawn(uv_loop_t* loop, uv_process_t* process,\n    uv_process_options_t options) {\n  /*\n   * Save environ in the case that we get it clobbered\n   * by the child process.\n   */\n  char** save_our_env = environ;\n\n  int stdio_count = options.stdio_count < 3 ? 3 : options.stdio_count;\n  int* pipes = malloc(2 * stdio_count * sizeof(int));\n\n#if SPAWN_WAIT_EXEC\n  int signal_pipe[2] = { -1, -1 };\n  struct pollfd pfd;\n#endif\n  int status;\n  pid_t pid;\n  int i;\n\n  if (pipes == NULL) {\n    errno = ENOMEM;\n    goto error;\n  }\n\n  assert(options.file != NULL);\n  assert(!(options.flags & ~(UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS |\n                             UV_PROCESS_DETACHED |\n                             UV_PROCESS_SETGID |\n                             UV_PROCESS_SETUID)));\n\n\n  uv__handle_init(loop, (uv_handle_t*)process, UV_PROCESS);\n  loop->counters.process_init++;\n  uv__handle_start(process);\n\n  process->exit_cb = options.exit_cb;\n\n  /* Init pipe pairs */\n  for (i = 0; i < stdio_count; i++) {\n    pipes[i * 2] = -1;\n    pipes[i * 2 + 1] = -1;\n  }\n\n  /* Create socketpairs/pipes, or use raw fd */\n  for (i = 0; i < options.stdio_count; i++) {\n    if (uv__process_init_stdio(&options.stdio[i], pipes + i * 2, i != 0)) {\n      goto error;\n    }\n  }\n\n  /* This pipe is used by the parent to wait until\n   * the child has called `execve()`. We need this\n   * to avoid the following race condition:\n   *\n   *    if ((pid = fork()) > 0) {\n   *      kill(pid, SIGTERM);\n   *    }\n   *    else if (pid == 0) {\n   *      execve(\"/bin/cat\", argp, envp);\n   *    }\n   *\n   * The parent sends a signal immediately after forking.\n   * Since the child may not have called `execve()` yet,\n   * there is no telling what process receives the signal,\n   * our fork or /bin/cat.\n   *\n   * To avoid ambiguity, we create a pipe with both ends\n   * marked close-on-exec. Then, after the call to `fork()`,\n   * the parent polls the read end until it sees POLLHUP.\n   */\n#if SPAWN_WAIT_EXEC\n  if (uv__make_pipe(signal_pipe, UV__F_NONBLOCK))\n    goto error;\n#endif\n\n  pid = fork();\n\n  if (pid == -1) {\n#if SPAWN_WAIT_EXEC\n    close(signal_pipe[0]);\n    close(signal_pipe[1]);\n#endif\n    environ = save_our_env;\n    goto error;\n  }\n\n  if (pid == 0) {\n    /* Child */\n    uv__process_child_init(options, stdio_count, pipes);\n\n    /* Execution never reaches here. */\n  }\n\n  /* Parent. */\n\n  /* Restore environment. */\n  environ = save_our_env;\n\n#if SPAWN_WAIT_EXEC\n  /* POLLHUP signals child has exited or execve()'d. */\n  close(signal_pipe[1]);\n  do {\n    pfd.fd = signal_pipe[0];\n    pfd.events = POLLIN|POLLHUP;\n    pfd.revents = 0;\n    errno = 0, status = poll(&pfd, 1, -1);\n  }\n  while (status == -1 && (errno == EINTR || errno == ENOMEM));\n\n  assert((status == 1) && \"poll() on pipe read end failed\");\n  close(signal_pipe[0]);\n#endif\n\n  process->pid = pid;\n\n  ev_child_init(&process->child_watcher, uv__chld, pid, 0);\n  ev_child_start(process->loop->ev, &process->child_watcher);\n  process->child_watcher.data = process;\n\n  for (i = 0; i < options.stdio_count; i++) {\n    if (uv__process_open_stream(&options.stdio[i], pipes + i * 2, i == 0)) {\n      int j;\n      /* Close all opened streams */\n      for (j = 0; j < i; j++) {\n        uv__process_close_stream(&options.stdio[j]);\n      }\n\n      goto error;\n    }\n  }\n\n  free(pipes);\n\n  return 0;\n\nerror:\n  uv__set_sys_error(process->loop, errno);\n\n  for (i = 0; i < stdio_count; i++) {\n    close(pipes[i * 2]);\n    close(pipes[i * 2 + 1]);\n  }\n\n  free(pipes);\n\n  return -1;\n}\n\n\nint uv_process_kill(uv_process_t* process, int signum) {\n  int r = kill(process->pid, signum);\n\n  if (r) {\n    uv__set_sys_error(process->loop, errno);\n    return -1;\n  } else {\n    return 0;\n  }\n}\n\n\nuv_err_t uv_kill(int pid, int signum) {\n  int r = kill(pid, signum);\n\n  if (r) {\n    return uv__new_sys_error(errno);\n  } else {\n    return uv_ok_;\n  }\n}\n\n\nvoid uv__process_close(uv_process_t* handle) {\n  ev_child_stop(handle->loop->ev, &handle->child_watcher);\n  uv__handle_stop(handle);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/rdiscount.c",
    "content": "#include <stdio.h>\n#include \"ruby.h\"\n#include \"mkdio.h\"\n\nstatic VALUE rb_cRDiscount;\n\nstatic VALUE\nrb_rdiscount_to_html(int argc, VALUE *argv, VALUE self)\n{\n    /* grab char pointer to markdown input text */\n    char *res;\n    int szres;\n    VALUE encoding;\n    VALUE text = rb_funcall(self, rb_intern(\"text\"), 0);\n    VALUE buf = rb_str_buf_new(1024);\n    Check_Type(text, T_STRING);\n\n    int flags = rb_rdiscount__get_flags(self);\n\n    MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);\n\n    if ( mkd_compile(doc, flags) ) {\n        szres = mkd_document(doc, &res);\n\n        if ( szres != EOF ) {\n            rb_str_cat(buf, res, szres);\n            rb_str_cat(buf, \"\\n\", 1);\n        }\n    }\n    mkd_cleanup(doc);\n\n\n    /* force the input encoding */\n    if ( rb_respond_to(text, rb_intern(\"encoding\")) ) {\n      encoding = rb_funcall(text, rb_intern(\"encoding\"), 0);\n      rb_funcall(buf, rb_intern(\"force_encoding\"), 1, encoding);\n    }\n\n    return buf;\n}\n\nstatic VALUE\nrb_rdiscount_toc_content(int argc, VALUE *argv, VALUE self)\n{\n    char *res;\n    int szres;\n\n    int flags = rb_rdiscount__get_flags(self);\n\n    /* grab char pointer to markdown input text */\n    VALUE text = rb_funcall(self, rb_intern(\"text\"), 0);\n    Check_Type(text, T_STRING);\n\n    /* allocate a ruby string buffer and wrap it in a stream */\n    VALUE buf = rb_str_buf_new(4096);\n\n    MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);\n\n    if ( mkd_compile(doc, flags) ) {\n        szres = mkd_toc(doc, &res);\n\n        if ( szres != EOF ) {\n            rb_str_cat(buf, res, szres);\n            rb_str_cat(buf, \"\\n\", 1);\n        }\n    }\n    mkd_cleanup(doc);\n\n    return buf;\n}\n\nint rb_rdiscount__get_flags(VALUE ruby_obj)\n{\n  /* compile flags */\n  int flags = MKD_TABSTOP | MKD_NOHEADER;\n\n  /* smart */\n  if ( rb_funcall(ruby_obj, rb_intern(\"smart\"), 0) != Qtrue )\n      flags = flags | MKD_NOPANTS;\n\n  /* filter_html */\n  if ( rb_funcall(ruby_obj, rb_intern(\"filter_html\"), 0) == Qtrue )\n      flags = flags | MKD_NOHTML;\n\n  /* generate_toc */\n  if ( rb_funcall(ruby_obj, rb_intern(\"generate_toc\"), 0) == Qtrue)\n    flags = flags | MKD_TOC;\n\n  /* no_image */\n  if ( rb_funcall(ruby_obj, rb_intern(\"no_image\"), 0) == Qtrue)\n    flags = flags | MKD_NOIMAGE;\n\n  /* no_links */\n  if ( rb_funcall(ruby_obj, rb_intern(\"no_links\"), 0) == Qtrue)\n    flags = flags | MKD_NOLINKS;\n\n  /* no_tables */\n  if ( rb_funcall(ruby_obj, rb_intern(\"no_tables\"), 0) == Qtrue)\n    flags = flags | MKD_NOTABLES;\n\n  /* strict */\n  if ( rb_funcall(ruby_obj, rb_intern(\"strict\"), 0) == Qtrue)\n    flags = flags | MKD_STRICT;\n\n  /* autolink */\n  if ( rb_funcall(ruby_obj, rb_intern(\"autolink\"), 0) == Qtrue)\n    flags = flags | MKD_AUTOLINK;\n\n  /* safelink */\n  if ( rb_funcall(ruby_obj, rb_intern(\"safelink\"), 0) == Qtrue)\n    flags = flags | MKD_SAFELINK;\n\n  /* no_pseudo_protocols */\n  if ( rb_funcall(ruby_obj, rb_intern(\"no_pseudo_protocols\"), 0) == Qtrue)\n    flags = flags | MKD_NO_EXT;\n\n\n  return flags;\n}\n\n\nvoid Init_rdiscount()\n{\n    rb_cRDiscount = rb_define_class(\"RDiscount\", rb_cObject);\n    rb_define_method(rb_cRDiscount, \"to_html\", rb_rdiscount_to_html, -1);\n    rb_define_method(rb_cRDiscount, \"toc_content\", rb_rdiscount_toc_content, -1);\n}\n\n/* vim: set ts=4 sw=4: */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/readline.cats",
    "content": "/*\n** API in ATS for GNU-readline\n*/\n\n/* ****** ****** */\n\n/*\n** Permission to use, copy, modify, and distribute this software for any\n** purpose with or without fee is hereby granted, provided that the above\n** copyright notice and this permission notice appear in all copies.\n** \n** THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n** WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n** MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n** ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n** WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n** ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n** OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n*/\n\n/* ****** ****** */\n\n#ifndef READLINE_READLINE_CATS\n#define READLINE_READLINE_CATS\n\n/* ****** ****** */\n\n#include <readline/readline.h>\n\n/* ****** ****** */\n//\n#define \\\natscntrb_readline_rl_library_version() ((char*)rl_library_version)\n//\n#define atscntrb_readline_rl_readline_version() (rl_readline_version)\n//\n/* ****** ****** */\n\n#define atscntrb_readline_readline readline\n\n/* ****** ****** */\n\n#endif // ifndef READLINE_READLINE_CATS\n\n/* ****** ****** */\n\n/* end of [readline.cats] */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/redis.c",
    "content": "/*\n * Copyright (c) 2009-2010, Salvatore Sanfilippo <antirez at gmail dot com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n *   * Redistributions of source code must retain the above copyright notice,\n *     this list of conditions and the following disclaimer.\n *   * Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n *   * Neither the name of Redis nor the names of its contributors may be used\n *     to endorse or promote products derived from this software without\n *     specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"redis.h\"\n#include \"slowlog.h\"\n#include \"bio.h\"\n\n#include <time.h>\n#include <signal.h>\n#include <sys/wait.h>\n#include <errno.h>\n#include <assert.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <arpa/inet.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <sys/time.h>\n#include <sys/resource.h>\n#include <sys/uio.h>\n#include <limits.h>\n#include <float.h>\n#include <math.h>\n#include <sys/resource.h>\n#include <sys/utsname.h>\n\n/* Our shared \"common\" objects */\n\nstruct sharedObjectsStruct shared;\n\n/* Global vars that are actually used as constants. The following double\n * values are used for double on-disk serialization, and are initialized\n * at runtime to avoid strange compiler optimizations. */\n\ndouble R_Zero, R_PosInf, R_NegInf, R_Nan;\n\n/*================================= Globals ================================= */\n\n/* Global vars */\nstruct redisServer server; /* server global state */\nstruct redisCommand *commandTable;\n\n/* Our command table.\n *\n * Every entry is composed of the following fields:\n *\n * name: a string representing the command name.\n * function: pointer to the C function implementing the command.\n * arity: number of arguments, it is possible to use -N to say >= N\n * sflags: command flags as string. See below for a table of flags.\n * flags: flags as bitmask. Computed by Redis using the 'sflags' field.\n * get_keys_proc: an optional function to get key arguments from a command.\n *                This is only used when the following three fields are not\n *                enough to specify what arguments are keys.\n * first_key_index: first argument that is a key\n * last_key_index: last argument that is a key\n * key_step: step to get all the keys from first to last argument. For instance\n *           in MSET the step is two since arguments are key,val,key,val,...\n * microseconds: microseconds of total execution time for this command.\n * calls: total number of calls of this command.\n *\n * The flags, microseconds and calls fields are computed by Redis and should\n * always be set to zero.\n *\n * Command flags are expressed using strings where every character represents\n * a flag. Later the populateCommandTable() function will take care of\n * populating the real 'flags' field using this characters.\n *\n * This is the meaning of the flags:\n *\n * w: write command (may modify the key space).\n * r: read command  (will never modify the key space).\n * m: may increase memory usage once called. Don't allow if out of memory.\n * a: admin command, like SAVE or SHUTDOWN.\n * p: Pub/Sub related command.\n * f: force replication of this command, regarless of server.dirty.\n * s: command not allowed in scripts.\n * R: random command. Command is not deterministic, that is, the same command\n *    with the same arguments, with the same key space, may have different\n *    results. For instance SPOP and RANDOMKEY are two random commands.\n * S: Sort command output array if called from script, so that the output\n *    is deterministic.\n */\nstruct redisCommand redisCommandTable[] = {\n    {\"get\",getCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"set\",setCommand,3,\"wm\",0,noPreloadGetKeys,1,1,1,0,0},\n    {\"setnx\",setnxCommand,3,\"wm\",0,noPreloadGetKeys,1,1,1,0,0},\n    {\"setex\",setexCommand,4,\"wm\",0,noPreloadGetKeys,1,1,1,0,0},\n    {\"psetex\",psetexCommand,4,\"wm\",0,noPreloadGetKeys,1,1,1,0,0},\n    {\"append\",appendCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"strlen\",strlenCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"del\",delCommand,-2,\"w\",0,noPreloadGetKeys,1,-1,1,0,0},\n    {\"exists\",existsCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"setbit\",setbitCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"getbit\",getbitCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"setrange\",setrangeCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"getrange\",getrangeCommand,4,\"r\",0,NULL,1,1,1,0,0},\n    {\"substr\",getrangeCommand,4,\"r\",0,NULL,1,1,1,0,0},\n    {\"incr\",incrCommand,2,\"wm\",0,NULL,1,1,1,0,0},\n    {\"decr\",decrCommand,2,\"wm\",0,NULL,1,1,1,0,0},\n    {\"mget\",mgetCommand,-2,\"r\",0,NULL,1,-1,1,0,0},\n    {\"rpush\",rpushCommand,-3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"lpush\",lpushCommand,-3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"rpushx\",rpushxCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"lpushx\",lpushxCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"linsert\",linsertCommand,5,\"wm\",0,NULL,1,1,1,0,0},\n    {\"rpop\",rpopCommand,2,\"w\",0,NULL,1,1,1,0,0},\n    {\"lpop\",lpopCommand,2,\"w\",0,NULL,1,1,1,0,0},\n    {\"brpop\",brpopCommand,-3,\"ws\",0,NULL,1,1,1,0,0},\n    {\"brpoplpush\",brpoplpushCommand,4,\"wms\",0,NULL,1,2,1,0,0},\n    {\"blpop\",blpopCommand,-3,\"ws\",0,NULL,1,-2,1,0,0},\n    {\"llen\",llenCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"lindex\",lindexCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"lset\",lsetCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"lrange\",lrangeCommand,4,\"r\",0,NULL,1,1,1,0,0},\n    {\"ltrim\",ltrimCommand,4,\"w\",0,NULL,1,1,1,0,0},\n    {\"lrem\",lremCommand,4,\"w\",0,NULL,1,1,1,0,0},\n    {\"rpoplpush\",rpoplpushCommand,3,\"wm\",0,NULL,1,2,1,0,0},\n    {\"sadd\",saddCommand,-3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"srem\",sremCommand,-3,\"w\",0,NULL,1,1,1,0,0},\n    {\"smove\",smoveCommand,4,\"w\",0,NULL,1,2,1,0,0},\n    {\"sismember\",sismemberCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"scard\",scardCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"spop\",spopCommand,2,\"wRs\",0,NULL,1,1,1,0,0},\n    {\"srandmember\",srandmemberCommand,2,\"rR\",0,NULL,1,1,1,0,0},\n    {\"sinter\",sinterCommand,-2,\"rS\",0,NULL,1,-1,1,0,0},\n    {\"sinterstore\",sinterstoreCommand,-3,\"wm\",0,NULL,1,-1,1,0,0},\n    {\"sunion\",sunionCommand,-2,\"rS\",0,NULL,1,-1,1,0,0},\n    {\"sunionstore\",sunionstoreCommand,-3,\"wm\",0,NULL,1,-1,1,0,0},\n    {\"sdiff\",sdiffCommand,-2,\"rS\",0,NULL,1,-1,1,0,0},\n    {\"sdiffstore\",sdiffstoreCommand,-3,\"wm\",0,NULL,1,-1,1,0,0},\n    {\"smembers\",sinterCommand,2,\"rS\",0,NULL,1,1,1,0,0},\n    {\"zadd\",zaddCommand,-4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"zincrby\",zincrbyCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"zrem\",zremCommand,-3,\"w\",0,NULL,1,1,1,0,0},\n    {\"zremrangebyscore\",zremrangebyscoreCommand,4,\"w\",0,NULL,1,1,1,0,0},\n    {\"zremrangebyrank\",zremrangebyrankCommand,4,\"w\",0,NULL,1,1,1,0,0},\n    {\"zunionstore\",zunionstoreCommand,-4,\"wm\",0,zunionInterGetKeys,0,0,0,0,0},\n    {\"zinterstore\",zinterstoreCommand,-4,\"wm\",0,zunionInterGetKeys,0,0,0,0,0},\n    {\"zrange\",zrangeCommand,-4,\"r\",0,NULL,1,1,1,0,0},\n    {\"zrangebyscore\",zrangebyscoreCommand,-4,\"r\",0,NULL,1,1,1,0,0},\n    {\"zrevrangebyscore\",zrevrangebyscoreCommand,-4,\"r\",0,NULL,1,1,1,0,0},\n    {\"zcount\",zcountCommand,4,\"r\",0,NULL,1,1,1,0,0},\n    {\"zrevrange\",zrevrangeCommand,-4,\"r\",0,NULL,1,1,1,0,0},\n    {\"zcard\",zcardCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"zscore\",zscoreCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"zrank\",zrankCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"zrevrank\",zrevrankCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"hset\",hsetCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"hsetnx\",hsetnxCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"hget\",hgetCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"hmset\",hmsetCommand,-4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"hmget\",hmgetCommand,-3,\"r\",0,NULL,1,1,1,0,0},\n    {\"hincrby\",hincrbyCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"hincrbyfloat\",hincrbyfloatCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"hdel\",hdelCommand,-3,\"w\",0,NULL,1,1,1,0,0},\n    {\"hlen\",hlenCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"hkeys\",hkeysCommand,2,\"rS\",0,NULL,1,1,1,0,0},\n    {\"hvals\",hvalsCommand,2,\"rS\",0,NULL,1,1,1,0,0},\n    {\"hgetall\",hgetallCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"hexists\",hexistsCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"incrby\",incrbyCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"decrby\",decrbyCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"incrbyfloat\",incrbyfloatCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"getset\",getsetCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"mset\",msetCommand,-3,\"wm\",0,NULL,1,-1,2,0,0},\n    {\"msetnx\",msetnxCommand,-3,\"wm\",0,NULL,1,-1,2,0,0},\n    {\"randomkey\",randomkeyCommand,1,\"rR\",0,NULL,0,0,0,0,0},\n    {\"select\",selectCommand,2,\"r\",0,NULL,0,0,0,0,0},\n    {\"move\",moveCommand,3,\"w\",0,NULL,1,1,1,0,0},\n    {\"rename\",renameCommand,3,\"w\",0,renameGetKeys,1,2,1,0,0},\n    {\"renamenx\",renamenxCommand,3,\"w\",0,renameGetKeys,1,2,1,0,0},\n    {\"expire\",expireCommand,3,\"w\",0,NULL,1,1,1,0,0},\n    {\"expireat\",expireatCommand,3,\"w\",0,NULL,1,1,1,0,0},\n    {\"pexpire\",pexpireCommand,3,\"w\",0,NULL,1,1,1,0,0},\n    {\"pexpireat\",pexpireatCommand,3,\"w\",0,NULL,1,1,1,0,0},\n    {\"keys\",keysCommand,2,\"rS\",0,NULL,0,0,0,0,0},\n    {\"dbsize\",dbsizeCommand,1,\"r\",0,NULL,0,0,0,0,0},\n    {\"auth\",authCommand,2,\"rs\",0,NULL,0,0,0,0,0},\n    {\"ping\",pingCommand,1,\"r\",0,NULL,0,0,0,0,0},\n    {\"echo\",echoCommand,2,\"r\",0,NULL,0,0,0,0,0},\n    {\"save\",saveCommand,1,\"ars\",0,NULL,0,0,0,0,0},\n    {\"bgsave\",bgsaveCommand,1,\"ar\",0,NULL,0,0,0,0,0},\n    {\"bgrewriteaof\",bgrewriteaofCommand,1,\"ar\",0,NULL,0,0,0,0,0},\n    {\"shutdown\",shutdownCommand,-1,\"ar\",0,NULL,0,0,0,0,0},\n    {\"lastsave\",lastsaveCommand,1,\"r\",0,NULL,0,0,0,0,0},\n    {\"type\",typeCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"multi\",multiCommand,1,\"rs\",0,NULL,0,0,0,0,0},\n    {\"exec\",execCommand,1,\"s\",0,NULL,0,0,0,0,0},\n    {\"discard\",discardCommand,1,\"rs\",0,NULL,0,0,0,0,0},\n    {\"sync\",syncCommand,1,\"ars\",0,NULL,0,0,0,0,0},\n    {\"flushdb\",flushdbCommand,1,\"w\",0,NULL,0,0,0,0,0},\n    {\"flushall\",flushallCommand,1,\"w\",0,NULL,0,0,0,0,0},\n    {\"sort\",sortCommand,-2,\"wmS\",0,NULL,1,1,1,0,0},\n    {\"info\",infoCommand,-1,\"r\",0,NULL,0,0,0,0,0},\n    {\"monitor\",monitorCommand,1,\"ars\",0,NULL,0,0,0,0,0},\n    {\"ttl\",ttlCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"pttl\",pttlCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"persist\",persistCommand,2,\"w\",0,NULL,1,1,1,0,0},\n    {\"slaveof\",slaveofCommand,3,\"as\",0,NULL,0,0,0,0,0},\n    {\"debug\",debugCommand,-2,\"as\",0,NULL,0,0,0,0,0},\n    {\"config\",configCommand,-2,\"ar\",0,NULL,0,0,0,0,0},\n    {\"subscribe\",subscribeCommand,-2,\"rps\",0,NULL,0,0,0,0,0},\n    {\"unsubscribe\",unsubscribeCommand,-1,\"rps\",0,NULL,0,0,0,0,0},\n    {\"psubscribe\",psubscribeCommand,-2,\"rps\",0,NULL,0,0,0,0,0},\n    {\"punsubscribe\",punsubscribeCommand,-1,\"rps\",0,NULL,0,0,0,0,0},\n    {\"publish\",publishCommand,3,\"pf\",0,NULL,0,0,0,0,0},\n    {\"watch\",watchCommand,-2,\"rs\",0,noPreloadGetKeys,1,-1,1,0,0},\n    {\"unwatch\",unwatchCommand,1,\"rs\",0,NULL,0,0,0,0,0},\n    {\"cluster\",clusterCommand,-2,\"ar\",0,NULL,0,0,0,0,0},\n    {\"restore\",restoreCommand,4,\"awm\",0,NULL,1,1,1,0,0},\n    {\"migrate\",migrateCommand,6,\"aw\",0,NULL,0,0,0,0,0},\n    {\"asking\",askingCommand,1,\"r\",0,NULL,0,0,0,0,0},\n    {\"dump\",dumpCommand,2,\"ar\",0,NULL,1,1,1,0,0},\n    {\"object\",objectCommand,-2,\"r\",0,NULL,2,2,2,0,0},\n    {\"client\",clientCommand,-2,\"ar\",0,NULL,0,0,0,0,0},\n    {\"eval\",evalCommand,-3,\"s\",0,zunionInterGetKeys,0,0,0,0,0},\n    {\"evalsha\",evalShaCommand,-3,\"s\",0,zunionInterGetKeys,0,0,0,0,0},\n    {\"slowlog\",slowlogCommand,-2,\"r\",0,NULL,0,0,0,0,0},\n    {\"script\",scriptCommand,-2,\"ras\",0,NULL,0,0,0,0,0},\n    {\"time\",timeCommand,1,\"rR\",0,NULL,0,0,0,0,0},\n    {\"bitop\",bitopCommand,-4,\"wm\",0,NULL,2,-1,1,0,0},\n    {\"bitcount\",bitcountCommand,-2,\"r\",0,NULL,1,1,1,0,0}\n};\n\n/*============================ Utility functions ============================ */\n\n/* Low level logging. To use only for very big messages, otherwise\n * redisLog() is to prefer. */\nvoid redisLogRaw(int level, const char *msg) {\n    const int syslogLevelMap[] = { LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING };\n    const char *c = \".-*#\";\n    FILE *fp;\n    char buf[64];\n    int rawmode = (level & REDIS_LOG_RAW);\n\n    level &= 0xff; /* clear flags */\n    if (level < server.verbosity) return;\n\n    fp = (server.logfile == NULL) ? stdout : fopen(server.logfile,\"a\");\n    if (!fp) return;\n\n    if (rawmode) {\n        fprintf(fp,\"%s\",msg);\n    } else {\n        int off;\n        struct timeval tv;\n\n        gettimeofday(&tv,NULL);\n        off = strftime(buf,sizeof(buf),\"%d %b %H:%M:%S.\",localtime(&tv.tv_sec));\n        snprintf(buf+off,sizeof(buf)-off,\"%03d\",(int)tv.tv_usec/1000);\n        fprintf(fp,\"[%d] %s %c %s\\n\",(int)getpid(),buf,c[level],msg);\n    }\n    fflush(fp);\n\n    if (server.logfile) fclose(fp);\n\n    if (server.syslog_enabled) syslog(syslogLevelMap[level], \"%s\", msg);\n}\n\n/* Like redisLogRaw() but with printf-alike support. This is the funciton that\n * is used across the code. The raw version is only used in order to dump\n * the INFO output on crash. */\nvoid redisLog(int level, const char *fmt, ...) {\n    va_list ap;\n    char msg[REDIS_MAX_LOGMSG_LEN];\n\n    if ((level&0xff) < server.verbosity) return;\n\n    va_start(ap, fmt);\n    vsnprintf(msg, sizeof(msg), fmt, ap);\n    va_end(ap);\n\n    redisLogRaw(level,msg);\n}\n\n/* Log a fixed message without printf-alike capabilities, in a way that is\n * safe to call from a signal handler.\n *\n * We actually use this only for signals that are not fatal from the point\n * of view of Redis. Signals that are going to kill the server anyway and\n * where we need printf-alike features are served by redisLog(). */\nvoid redisLogFromHandler(int level, const char *msg) {\n    int fd;\n    char buf[64];\n\n    if ((level&0xff) < server.verbosity ||\n        (server.logfile == NULL && server.daemonize)) return;\n    fd = server.logfile ?\n        open(server.logfile, O_APPEND|O_CREAT|O_WRONLY, 0644) :\n        STDOUT_FILENO;\n    if (fd == -1) return;\n    ll2string(buf,sizeof(buf),getpid());\n    if (write(fd,\"[\",1) == -1) goto err;\n    if (write(fd,buf,strlen(buf)) == -1) goto err;\n    if (write(fd,\" | signal handler] (\",20) == -1) goto err;\n    ll2string(buf,sizeof(buf),time(NULL));\n    if (write(fd,buf,strlen(buf)) == -1) goto err;\n    if (write(fd,\") \",2) == -1) goto err;\n    if (write(fd,msg,strlen(msg)) == -1) goto err;\n    if (write(fd,\"\\n\",1) == -1) goto err;\nerr:\n    if (server.logfile) close(fd);\n}\n\n/* Redis generally does not try to recover from out of memory conditions\n * when allocating objects or strings, it is not clear if it will be possible\n * to report this condition to the client since the networking layer itself\n * is based on heap allocation for send buffers, so we simply abort.\n * At least the code will be simpler to read... */\nvoid oom(const char *msg) {\n    redisLog(REDIS_WARNING, \"%s: Out of memory\\n\",msg);\n    sleep(1);\n    abort();\n}\n\n/* Return the UNIX time in microseconds */\nlong long ustime(void) {\n    struct timeval tv;\n    long long ust;\n\n    gettimeofday(&tv, NULL);\n    ust = ((long long)tv.tv_sec)*1000000;\n    ust += tv.tv_usec;\n    return ust;\n}\n\n/* Return the UNIX time in milliseconds */\nlong long mstime(void) {\n    return ustime()/1000;\n}\n\n/* After an RDB dump or AOF rewrite we exit from children using _exit() instead of\n * exit(), because the latter may interact with the same file objects used by\n * the parent process. However if we are testing the coverage normal exit() is\n * used in order to obtain the right coverage information. */\nvoid exitFromChild(int retcode) {\n#ifdef COVERAGE_TEST\n    exit(retcode);\n#else\n    _exit(retcode);\n#endif\n}\n\n/*====================== Hash table type implementation  ==================== */\n\n/* This is an hash table type that uses the SDS dynamic strings libary as\n * keys and radis objects as values (objects can hold SDS strings,\n * lists, sets). */\n\nvoid dictVanillaFree(void *privdata, void *val)\n{\n    DICT_NOTUSED(privdata);\n    zfree(val);\n}\n\nvoid dictListDestructor(void *privdata, void *val)\n{\n    DICT_NOTUSED(privdata);\n    listRelease((list*)val);\n}\n\nint dictSdsKeyCompare(void *privdata, const void *key1,\n        const void *key2)\n{\n    int l1,l2;\n    DICT_NOTUSED(privdata);\n\n    l1 = sdslen((sds)key1);\n    l2 = sdslen((sds)key2);\n    if (l1 != l2) return 0;\n    return memcmp(key1, key2, l1) == 0;\n}\n\n/* A case insensitive version used for the command lookup table. */\nint dictSdsKeyCaseCompare(void *privdata, const void *key1,\n        const void *key2)\n{\n    DICT_NOTUSED(privdata);\n\n    return strcasecmp(key1, key2) == 0;\n}\n\nvoid dictRedisObjectDestructor(void *privdata, void *val)\n{\n    DICT_NOTUSED(privdata);\n\n    if (val == NULL) return; /* Values of swapped out keys as set to NULL */\n    decrRefCount(val);\n}\n\nvoid dictSdsDestructor(void *privdata, void *val)\n{\n    DICT_NOTUSED(privdata);\n\n    sdsfree(val);\n}\n\nint dictObjKeyCompare(void *privdata, const void *key1,\n        const void *key2)\n{\n    const robj *o1 = key1, *o2 = key2;\n    return dictSdsKeyCompare(privdata,o1->ptr,o2->ptr);\n}\n\nunsigned int dictObjHash(const void *key) {\n    const robj *o = key;\n    return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));\n}\n\nunsigned int dictSdsHash(const void *key) {\n    return dictGenHashFunction((unsigned char*)key, sdslen((char*)key));\n}\n\nunsigned int dictSdsCaseHash(const void *key) {\n    return dictGenCaseHashFunction((unsigned char*)key, sdslen((char*)key));\n}\n\nint dictEncObjKeyCompare(void *privdata, const void *key1,\n        const void *key2)\n{\n    robj *o1 = (robj*) key1, *o2 = (robj*) key2;\n    int cmp;\n\n    if (o1->encoding == REDIS_ENCODING_INT &&\n        o2->encoding == REDIS_ENCODING_INT)\n            return o1->ptr == o2->ptr;\n\n    o1 = getDecodedObject(o1);\n    o2 = getDecodedObject(o2);\n    cmp = dictSdsKeyCompare(privdata,o1->ptr,o2->ptr);\n    decrRefCount(o1);\n    decrRefCount(o2);\n    return cmp;\n}\n\nunsigned int dictEncObjHash(const void *key) {\n    robj *o = (robj*) key;\n\n    if (o->encoding == REDIS_ENCODING_RAW) {\n        return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));\n    } else {\n        if (o->encoding == REDIS_ENCODING_INT) {\n            char buf[32];\n            int len;\n\n            len = ll2string(buf,32,(long)o->ptr);\n            return dictGenHashFunction((unsigned char*)buf, len);\n        } else {\n            unsigned int hash;\n\n            o = getDecodedObject(o);\n            hash = dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));\n            decrRefCount(o);\n            return hash;\n        }\n    }\n}\n\n/* Sets type hash table */\ndictType setDictType = {\n    dictEncObjHash,            /* hash function */\n    NULL,                      /* key dup */\n    NULL,                      /* val dup */\n    dictEncObjKeyCompare,      /* key compare */\n    dictRedisObjectDestructor, /* key destructor */\n    NULL                       /* val destructor */\n};\n\n/* Sorted sets hash (note: a skiplist is used in addition to the hash table) */\ndictType zsetDictType = {\n    dictEncObjHash,            /* hash function */\n    NULL,                      /* key dup */\n    NULL,                      /* val dup */\n    dictEncObjKeyCompare,      /* key compare */\n    dictRedisObjectDestructor, /* key destructor */\n    NULL                       /* val destructor */\n};\n\n/* Db->dict, keys are sds strings, vals are Redis objects. */\ndictType dbDictType = {\n    dictSdsHash,                /* hash function */\n    NULL,                       /* key dup */\n    NULL,                       /* val dup */\n    dictSdsKeyCompare,          /* key compare */\n    dictSdsDestructor,          /* key destructor */\n    dictRedisObjectDestructor   /* val destructor */\n};\n\n/* Db->expires */\ndictType keyptrDictType = {\n    dictSdsHash,               /* hash function */\n    NULL,                      /* key dup */\n    NULL,                      /* val dup */\n    dictSdsKeyCompare,         /* key compare */\n    NULL,                      /* key destructor */\n    NULL                       /* val destructor */\n};\n\n/* Command table. sds string -> command struct pointer. */\ndictType commandTableDictType = {\n    dictSdsCaseHash,           /* hash function */\n    NULL,                      /* key dup */\n    NULL,                      /* val dup */\n    dictSdsKeyCaseCompare,     /* key compare */\n    dictSdsDestructor,         /* key destructor */\n    NULL                       /* val destructor */\n};\n\n/* Hash type hash table (note that small hashes are represented with zimpaps) */\ndictType hashDictType = {\n    dictEncObjHash,             /* hash function */\n    NULL,                       /* key dup */\n    NULL,                       /* val dup */\n    dictEncObjKeyCompare,       /* key compare */\n    dictRedisObjectDestructor,  /* key destructor */\n    dictRedisObjectDestructor   /* val destructor */\n};\n\n/* Keylist hash table type has unencoded redis objects as keys and\n * lists as values. It's used for blocking operations (BLPOP) and to\n * map swapped keys to a list of clients waiting for this keys to be loaded. */\ndictType keylistDictType = {\n    dictObjHash,                /* hash function */\n    NULL,                       /* key dup */\n    NULL,                       /* val dup */\n    dictObjKeyCompare,          /* key compare */\n    dictRedisObjectDestructor,  /* key destructor */\n    dictListDestructor          /* val destructor */\n};\n\n/* Cluster nodes hash table, mapping nodes addresses 1.2.3.4:6379 to\n * clusterNode structures. */\ndictType clusterNodesDictType = {\n    dictSdsHash,                /* hash function */\n    NULL,                       /* key dup */\n    NULL,                       /* val dup */\n    dictSdsKeyCompare,          /* key compare */\n    dictSdsDestructor,          /* key destructor */\n    NULL                        /* val destructor */\n};\n\nint htNeedsResize(dict *dict) {\n    long long size, used;\n\n    size = dictSlots(dict);\n    used = dictSize(dict);\n    return (size && used && size > DICT_HT_INITIAL_SIZE &&\n            (used*100/size < REDIS_HT_MINFILL));\n}\n\n/* If the percentage of used slots in the HT reaches REDIS_HT_MINFILL\n * we resize the hash table to save memory */\nvoid tryResizeHashTables(void) {\n    int j;\n\n    for (j = 0; j < server.dbnum; j++) {\n        if (htNeedsResize(server.db[j].dict))\n            dictResize(server.db[j].dict);\n        if (htNeedsResize(server.db[j].expires))\n            dictResize(server.db[j].expires);\n    }\n}\n\n/* Our hash table implementation performs rehashing incrementally while\n * we write/read from the hash table. Still if the server is idle, the hash\n * table will use two tables for a long time. So we try to use 1 millisecond\n * of CPU time at every serverCron() loop in order to rehash some key. */\nvoid incrementallyRehash(void) {\n    int j;\n\n    for (j = 0; j < server.dbnum; j++) {\n        /* Keys dictionary */\n        if (dictIsRehashing(server.db[j].dict)) {\n            dictRehashMilliseconds(server.db[j].dict,1);\n            break; /* already used our millisecond for this loop... */\n        }\n        /* Expires */\n        if (dictIsRehashing(server.db[j].expires)) {\n            dictRehashMilliseconds(server.db[j].expires,1);\n            break; /* already used our millisecond for this loop... */\n        }\n    }\n}\n\n/* This function is called once a background process of some kind terminates,\n * as we want to avoid resizing the hash tables when there is a child in order\n * to play well with copy-on-write (otherwise when a resize happens lots of\n * memory pages are copied). The goal of this function is to update the ability\n * for dict.c to resize the hash tables accordingly to the fact we have o not\n * running childs. */\nvoid updateDictResizePolicy(void) {\n    if (server.rdb_child_pid == -1 && server.aof_child_pid == -1)\n        dictEnableResize();\n    else\n        dictDisableResize();\n}\n\n/* ======================= Cron: called every 100 ms ======================== */\n\n/* Try to expire a few timed out keys. The algorithm used is adaptive and\n * will use few CPU cycles if there are few expiring keys, otherwise\n * it will get more aggressive to avoid that too much memory is used by\n * keys that can be removed from the keyspace. */\nvoid activeExpireCycle(void) {\n    int j, iteration = 0;\n    long long start = ustime(), timelimit;\n\n    /* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time\n     * per iteration. Since this function gets called with a frequency of\n     * REDIS_HZ times per second, the following is the max amount of\n     * microseconds we can spend in this function. */\n    timelimit = 1000000*REDIS_EXPIRELOOKUPS_TIME_PERC/REDIS_HZ/100;\n    if (timelimit <= 0) timelimit = 1;\n\n    for (j = 0; j < server.dbnum; j++) {\n        int expired;\n        redisDb *db = server.db+j;\n\n        /* Continue to expire if at the end of the cycle more than 25%\n         * of the keys were expired. */\n        do {\n            unsigned long num = dictSize(db->expires);\n            unsigned long slots = dictSlots(db->expires);\n            long long now = mstime();\n\n            /* When there are less than 1% filled slots getting random\n             * keys is expensive, so stop here waiting for better times...\n             * The dictionary will be resized asap. */\n            if (num && slots > DICT_HT_INITIAL_SIZE &&\n                (num*100/slots < 1)) break;\n\n            /* The main collection cycle. Sample random keys among keys\n             * with an expire set, checking for expired ones. */\n            expired = 0;\n            if (num > REDIS_EXPIRELOOKUPS_PER_CRON)\n                num = REDIS_EXPIRELOOKUPS_PER_CRON;\n            while (num--) {\n                dictEntry *de;\n                long long t;\n\n                if ((de = dictGetRandomKey(db->expires)) == NULL) break;\n                t = dictGetSignedIntegerVal(de);\n                if (now > t) {\n                    sds key = dictGetKey(de);\n                    robj *keyobj = createStringObject(key,sdslen(key));\n\n                    propagateExpire(db,keyobj);\n                    dbDelete(db,keyobj);\n                    decrRefCount(keyobj);\n                    expired++;\n                    server.stat_expiredkeys++;\n                }\n            }\n            /* We can't block forever here even if there are many keys to\n             * expire. So after a given amount of milliseconds return to the\n             * caller waiting for the other active expire cycle. */\n            iteration++;\n            if ((iteration & 0xf) == 0 && /* check once every 16 cycles. */\n                (ustime()-start) > timelimit) return;\n        } while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4);\n    }\n}\n\nvoid updateLRUClock(void) {\n    server.lruclock = (server.unixtime/REDIS_LRU_CLOCK_RESOLUTION) &\n                                                REDIS_LRU_CLOCK_MAX;\n}\n\n\n/* Add a sample to the operations per second array of samples. */\nvoid trackOperationsPerSecond(void) {\n    long long t = mstime() - server.ops_sec_last_sample_time;\n    long long ops = server.stat_numcommands - server.ops_sec_last_sample_ops;\n    long long ops_sec;\n\n    ops_sec = t > 0 ? (ops*1000/t) : 0;\n\n    server.ops_sec_samples[server.ops_sec_idx] = ops_sec;\n    server.ops_sec_idx = (server.ops_sec_idx+1) % REDIS_OPS_SEC_SAMPLES;\n    server.ops_sec_last_sample_time = mstime();\n    server.ops_sec_last_sample_ops = server.stat_numcommands;\n}\n\n/* Return the mean of all the samples. */\nlong long getOperationsPerSecond(void) {\n    int j;\n    long long sum = 0;\n\n    for (j = 0; j < REDIS_OPS_SEC_SAMPLES; j++)\n        sum += server.ops_sec_samples[j];\n    return sum / REDIS_OPS_SEC_SAMPLES;\n}\n\n/* Check for timeouts. Returns non-zero if the client was terminated */\nint clientsCronHandleTimeout(redisClient *c) {\n    time_t now = server.unixtime;\n\n    if (server.maxidletime &&\n        !(c->flags & REDIS_SLAVE) &&    /* no timeout for slaves */\n        !(c->flags & REDIS_MASTER) &&   /* no timeout for masters */\n        !(c->flags & REDIS_BLOCKED) &&  /* no timeout for BLPOP */\n        dictSize(c->pubsub_channels) == 0 && /* no timeout for pubsub */\n        listLength(c->pubsub_patterns) == 0 &&\n        (now - c->lastinteraction > server.maxidletime))\n    {\n        redisLog(REDIS_VERBOSE,\"Closing idle client\");\n        freeClient(c);\n        return 1;\n    } else if (c->flags & REDIS_BLOCKED) {\n        if (c->bpop.timeout != 0 && c->bpop.timeout < now) {\n            addReply(c,shared.nullmultibulk);\n            unblockClientWaitingData(c);\n        }\n    }\n    return 0;\n}\n\n/* The client query buffer is an sds.c string that can end with a lot of\n * free space not used, this function reclaims space if needed.\n *\n * The funciton always returns 0 as it never terminates the client. */\nint clientsCronResizeQueryBuffer(redisClient *c) {\n    size_t querybuf_size = sdsAllocSize(c->querybuf);\n    time_t idletime = server.unixtime - c->lastinteraction;\n\n    /* There are two conditions to resize the query buffer:\n     * 1) Query buffer is > BIG_ARG and too big for latest peak.\n     * 2) Client is inactive and the buffer is bigger than 1k. */\n    if (((querybuf_size > REDIS_MBULK_BIG_ARG) &&\n         (querybuf_size/(c->querybuf_peak+1)) > 2) ||\n         (querybuf_size > 1024 && idletime > 2))\n    {\n        /* Only resize the query buffer if it is actually wasting space. */\n        if (sdsavail(c->querybuf) > 1024) {\n            c->querybuf = sdsRemoveFreeSpace(c->querybuf);\n        }\n    }\n    /* Reset the peak again to capture the peak memory usage in the next\n     * cycle. */\n    c->querybuf_peak = 0;\n    return 0;\n}\n\nvoid clientsCron(void) {\n    /* Make sure to process at least 1/(REDIS_HZ*10) of clients per call.\n     * Since this function is called REDIS_HZ times per second we are sure that\n     * in the worst case we process all the clients in 10 seconds.\n     * In normal conditions (a reasonable number of clients) we process\n     * all the clients in a shorter time. */\n    int numclients = listLength(server.clients);\n    int iterations = numclients/(REDIS_HZ*10);\n\n    if (iterations < 50)\n        iterations = (numclients < 50) ? numclients : 50;\n    while(listLength(server.clients) && iterations--) {\n        redisClient *c;\n        listNode *head;\n\n        /* Rotate the list, take the current head, process.\n         * This way if the client must be removed from the list it's the\n         * first element and we don't incur into O(N) computation. */\n        listRotate(server.clients);\n        head = listFirst(server.clients);\n        c = listNodeValue(head);\n        /* The following functions do different service checks on the client.\n         * The protocol is that they return non-zero if the client was\n         * terminated. */\n        if (clientsCronHandleTimeout(c)) continue;\n        if (clientsCronResizeQueryBuffer(c)) continue;\n    }\n}\n\n/* This is our timer interrupt, called REDIS_HZ times per second.\n * Here is where we do a number of things that need to be done asynchronously.\n * For instance:\n *\n * - Active expired keys collection (it is also performed in a lazy way on\n *   lookup).\n * - Software watchdong.\n * - Update some statistic.\n * - Incremental rehashing of the DBs hash tables.\n * - Triggering BGSAVE / AOF rewrite, and handling of terminated children.\n * - Clients timeout of differnet kinds.\n * - Replication reconnection.\n * - Many more...\n *\n * Everything directly called here will be called REDIS_HZ times per second,\n * so in order to throttle execution of things we want to do less frequently\n * a macro is used: run_with_period(milliseconds) { .... }\n */\n\n/* Using the following macro you can run code inside serverCron() with the\n * specified period, specified in milliseconds.\n * The actual resolution depends on REDIS_HZ. */\n#define run_with_period(_ms_) if (!(loops % ((_ms_)/(1000/REDIS_HZ))))\n\nint serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {\n    int j, loops = server.cronloops;\n    REDIS_NOTUSED(eventLoop);\n    REDIS_NOTUSED(id);\n    REDIS_NOTUSED(clientData);\n\n    /* Software watchdog: deliver the SIGALRM that will reach the signal\n     * handler if we don't return here fast enough. */\n    if (server.watchdog_period) watchdogScheduleSignal(server.watchdog_period);\n\n    /* We take a cached value of the unix time in the global state because\n     * with virtual memory and aging there is to store the current time\n     * in objects at every object access, and accuracy is not needed.\n     * To access a global var is faster than calling time(NULL) */\n    server.unixtime = time(NULL);\n\n    run_with_period(100) trackOperationsPerSecond();\n\n    /* We have just 22 bits per object for LRU information.\n     * So we use an (eventually wrapping) LRU clock with 10 seconds resolution.\n     * 2^22 bits with 10 seconds resoluton is more or less 1.5 years.\n     *\n     * Note that even if this will wrap after 1.5 years it's not a problem,\n     * everything will still work but just some object will appear younger\n     * to Redis. But for this to happen a given object should never be touched\n     * for 1.5 years.\n     *\n     * Note that you can change the resolution altering the\n     * REDIS_LRU_CLOCK_RESOLUTION define.\n     */\n    updateLRUClock();\n\n    /* Record the max memory used since the server was started. */\n    if (zmalloc_used_memory() > server.stat_peak_memory)\n        server.stat_peak_memory = zmalloc_used_memory();\n\n    /* We received a SIGTERM, shutting down here in a safe way, as it is\n     * not ok doing so inside the signal handler. */\n    if (server.shutdown_asap) {\n        if (prepareForShutdown(0) == REDIS_OK) exit(0);\n        redisLog(REDIS_WARNING,\"SIGTERM received but errors trying to shut down the server, check the logs for more information\");\n    }\n\n    /* Show some info about non-empty databases */\n    run_with_period(5000) {\n        for (j = 0; j < server.dbnum; j++) {\n            long long size, used, vkeys;\n\n            size = dictSlots(server.db[j].dict);\n            used = dictSize(server.db[j].dict);\n            vkeys = dictSize(server.db[j].expires);\n            if (used || vkeys) {\n                redisLog(REDIS_VERBOSE,\"DB %d: %lld keys (%lld volatile) in %lld slots HT.\",j,used,vkeys,size);\n                /* dictPrintStats(server.dict); */\n            }\n        }\n    }\n\n    /* We don't want to resize the hash tables while a bacground saving\n     * is in progress: the saving child is created using fork() that is\n     * implemented with a copy-on-write semantic in most modern systems, so\n     * if we resize the HT while there is the saving child at work actually\n     * a lot of memory movements in the parent will cause a lot of pages\n     * copied. */\n    if (server.rdb_child_pid == -1 && server.aof_child_pid == -1) {\n        tryResizeHashTables();\n        if (server.activerehashing) incrementallyRehash();\n    }\n\n    /* Show information about connected clients */\n    run_with_period(5000) {\n        redisLog(REDIS_VERBOSE,\"%d clients connected (%d slaves), %zu bytes in use\",\n            listLength(server.clients)-listLength(server.slaves),\n            listLength(server.slaves),\n            zmalloc_used_memory());\n    }\n\n    /* We need to do a few operations on clients asynchronously. */\n    clientsCron();\n\n    /* Start a scheduled AOF rewrite if this was requested by the user while\n     * a BGSAVE was in progress. */\n    if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 &&\n        server.aof_rewrite_scheduled)\n    {\n        rewriteAppendOnlyFileBackground();\n    }\n\n    /* Check if a background saving or AOF rewrite in progress terminated. */\n    if (server.rdb_child_pid != -1 || server.aof_child_pid != -1) {\n        int statloc;\n        pid_t pid;\n\n        if ((pid = wait3(&statloc,WNOHANG,NULL)) != 0) {\n            int exitcode = WEXITSTATUS(statloc);\n            int bysignal = 0;\n            \n            if (WIFSIGNALED(statloc)) bysignal = WTERMSIG(statloc);\n\n            if (pid == server.rdb_child_pid) {\n                backgroundSaveDoneHandler(exitcode,bysignal);\n            } else {\n                backgroundRewriteDoneHandler(exitcode,bysignal);\n            }\n            updateDictResizePolicy();\n        }\n    } else {\n        /* If there is not a background saving/rewrite in progress check if\n         * we have to save/rewrite now */\n         for (j = 0; j < server.saveparamslen; j++) {\n            struct saveparam *sp = server.saveparams+j;\n\n            if (server.dirty >= sp->changes &&\n                server.unixtime-server.lastsave > sp->seconds) {\n                redisLog(REDIS_NOTICE,\"%d changes in %d seconds. Saving...\",\n                    sp->changes, sp->seconds);\n                rdbSaveBackground(server.rdb_filename);\n                break;\n            }\n         }\n\n         /* Trigger an AOF rewrite if needed */\n         if (server.rdb_child_pid == -1 &&\n             server.aof_child_pid == -1 &&\n             server.aof_rewrite_perc &&\n             server.aof_current_size > server.aof_rewrite_min_size)\n         {\n            long long base = server.aof_rewrite_base_size ?\n                            server.aof_rewrite_base_size : 1;\n            long long growth = (server.aof_current_size*100/base) - 100;\n            if (growth >= server.aof_rewrite_perc) {\n                redisLog(REDIS_NOTICE,\"Starting automatic rewriting of AOF on %lld%% growth\",growth);\n                rewriteAppendOnlyFileBackground();\n            }\n         }\n    }\n\n\n    /* If we postponed an AOF buffer flush, let's try to do it every time the\n     * cron function is called. */\n    if (server.aof_flush_postponed_start) flushAppendOnlyFile(0);\n\n    /* Expire a few keys per cycle, only if this is a master.\n     * On slaves we wait for DEL operations synthesized by the master\n     * in order to guarantee a strict consistency. */\n    if (server.masterhost == NULL) activeExpireCycle();\n\n    /* Close clients that need to be closed asynchronous */\n    freeClientsInAsyncFreeQueue();\n\n    /* Replication cron function -- used to reconnect to master and\n     * to detect transfer failures. */\n    run_with_period(1000) replicationCron();\n\n    /* Run other sub-systems specific cron jobs */\n    run_with_period(1000) {\n        if (server.cluster_enabled) clusterCron();\n    }\n\n    server.cronloops++;\n    return 1000/REDIS_HZ;\n}\n\n/* This function gets called every time Redis is entering the\n * main loop of the event driven library, that is, before to sleep\n * for ready file descriptors. */\nvoid beforeSleep(struct aeEventLoop *eventLoop) {\n    REDIS_NOTUSED(eventLoop);\n    listNode *ln;\n    redisClient *c;\n\n    /* Try to process pending commands for clients that were just unblocked. */\n    while (listLength(server.unblocked_clients)) {\n        ln = listFirst(server.unblocked_clients);\n        redisAssert(ln != NULL);\n        c = ln->value;\n        listDelNode(server.unblocked_clients,ln);\n        c->flags &= ~REDIS_UNBLOCKED;\n\n        /* Process remaining data in the input buffer. */\n        if (c->querybuf && sdslen(c->querybuf) > 0) {\n            server.current_client = c;\n            processInputBuffer(c);\n            server.current_client = NULL;\n        }\n    }\n\n    /* Write the AOF buffer on disk */\n    flushAppendOnlyFile(0);\n}\n\n/* =========================== Server initialization ======================== */\n\nvoid createSharedObjects(void) {\n    int j;\n\n    shared.crlf = createObject(REDIS_STRING,sdsnew(\"\\r\\n\"));\n    shared.ok = createObject(REDIS_STRING,sdsnew(\"+OK\\r\\n\"));\n    shared.err = createObject(REDIS_STRING,sdsnew(\"-ERR\\r\\n\"));\n    shared.emptybulk = createObject(REDIS_STRING,sdsnew(\"$0\\r\\n\\r\\n\"));\n    shared.czero = createObject(REDIS_STRING,sdsnew(\":0\\r\\n\"));\n    shared.cone = createObject(REDIS_STRING,sdsnew(\":1\\r\\n\"));\n    shared.cnegone = createObject(REDIS_STRING,sdsnew(\":-1\\r\\n\"));\n    shared.nullbulk = createObject(REDIS_STRING,sdsnew(\"$-1\\r\\n\"));\n    shared.nullmultibulk = createObject(REDIS_STRING,sdsnew(\"*-1\\r\\n\"));\n    shared.emptymultibulk = createObject(REDIS_STRING,sdsnew(\"*0\\r\\n\"));\n    shared.pong = createObject(REDIS_STRING,sdsnew(\"+PONG\\r\\n\"));\n    shared.queued = createObject(REDIS_STRING,sdsnew(\"+QUEUED\\r\\n\"));\n    shared.wrongtypeerr = createObject(REDIS_STRING,sdsnew(\n        \"-ERR Operation against a key holding the wrong kind of value\\r\\n\"));\n    shared.nokeyerr = createObject(REDIS_STRING,sdsnew(\n        \"-ERR no such key\\r\\n\"));\n    shared.syntaxerr = createObject(REDIS_STRING,sdsnew(\n        \"-ERR syntax error\\r\\n\"));\n    shared.sameobjecterr = createObject(REDIS_STRING,sdsnew(\n        \"-ERR source and destination objects are the same\\r\\n\"));\n    shared.outofrangeerr = createObject(REDIS_STRING,sdsnew(\n        \"-ERR index out of range\\r\\n\"));\n    shared.noscripterr = createObject(REDIS_STRING,sdsnew(\n        \"-NOSCRIPT No matching script. Please use EVAL.\\r\\n\"));\n    shared.loadingerr = createObject(REDIS_STRING,sdsnew(\n        \"-LOADING Redis is loading the dataset in memory\\r\\n\"));\n    shared.slowscripterr = createObject(REDIS_STRING,sdsnew(\n        \"-BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.\\r\\n\"));\n    shared.masterdownerr = createObject(REDIS_STRING,sdsnew(\n        \"-MASTERDOWN Link with MASTER is down and slave-serve-stale-data is set to 'no'.\\r\\n\"));\n    shared.bgsaveerr = createObject(REDIS_STRING,sdsnew(\n        \"-MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.\\r\\n\"));\n    shared.roslaveerr = createObject(REDIS_STRING,sdsnew(\n        \"-READONLY You can't write against a read only slave.\\r\\n\"));\n    shared.oomerr = createObject(REDIS_STRING,sdsnew(\n        \"-OOM command not allowed when used memory > 'maxmemory'.\\r\\n\"));\n    shared.space = createObject(REDIS_STRING,sdsnew(\" \"));\n    shared.colon = createObject(REDIS_STRING,sdsnew(\":\"));\n    shared.plus = createObject(REDIS_STRING,sdsnew(\"+\"));\n\n    for (j = 0; j < REDIS_SHARED_SELECT_CMDS; j++) {\n        shared.select[j] = createObject(REDIS_STRING,\n            sdscatprintf(sdsempty(),\"select %d\\r\\n\", j));\n    }\n    shared.messagebulk = createStringObject(\"$7\\r\\nmessage\\r\\n\",13);\n    shared.pmessagebulk = createStringObject(\"$8\\r\\npmessage\\r\\n\",14);\n    shared.subscribebulk = createStringObject(\"$9\\r\\nsubscribe\\r\\n\",15);\n    shared.unsubscribebulk = createStringObject(\"$11\\r\\nunsubscribe\\r\\n\",18);\n    shared.psubscribebulk = createStringObject(\"$10\\r\\npsubscribe\\r\\n\",17);\n    shared.punsubscribebulk = createStringObject(\"$12\\r\\npunsubscribe\\r\\n\",19);\n    shared.del = createStringObject(\"DEL\",3);\n    shared.rpop = createStringObject(\"RPOP\",4);\n    shared.lpop = createStringObject(\"LPOP\",4);\n    for (j = 0; j < REDIS_SHARED_INTEGERS; j++) {\n        shared.integers[j] = createObject(REDIS_STRING,(void*)(long)j);\n        shared.integers[j]->encoding = REDIS_ENCODING_INT;\n    }\n    for (j = 0; j < REDIS_SHARED_BULKHDR_LEN; j++) {\n        shared.mbulkhdr[j] = createObject(REDIS_STRING,\n            sdscatprintf(sdsempty(),\"*%d\\r\\n\",j));\n        shared.bulkhdr[j] = createObject(REDIS_STRING,\n            sdscatprintf(sdsempty(),\"$%d\\r\\n\",j));\n    }\n}\n\nvoid initServerConfig() {\n    getRandomHexChars(server.runid,REDIS_RUN_ID_SIZE);\n    server.runid[REDIS_RUN_ID_SIZE] = '\\0';\n    server.arch_bits = (sizeof(long) == 8) ? 64 : 32;\n    server.port = REDIS_SERVERPORT;\n    server.bindaddr = NULL;\n    server.unixsocket = NULL;\n    server.unixsocketperm = 0;\n    server.ipfd = -1;\n    server.sofd = -1;\n    server.dbnum = REDIS_DEFAULT_DBNUM;\n    server.verbosity = REDIS_NOTICE;\n    server.maxidletime = REDIS_MAXIDLETIME;\n    server.client_max_querybuf_len = REDIS_MAX_QUERYBUF_LEN;\n    server.saveparams = NULL;\n    server.loading = 0;\n    server.logfile = NULL; /* NULL = log on standard output */\n    server.syslog_enabled = 0;\n    server.syslog_ident = zstrdup(\"redis\");\n    server.syslog_facility = LOG_LOCAL0;\n    server.daemonize = 0;\n    server.aof_state = REDIS_AOF_OFF;\n    server.aof_fsync = AOF_FSYNC_EVERYSEC;\n    server.aof_no_fsync_on_rewrite = 0;\n    server.aof_rewrite_perc = REDIS_AOF_REWRITE_PERC;\n    server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE;\n    server.aof_rewrite_base_size = 0;\n    server.aof_rewrite_scheduled = 0;\n    server.aof_last_fsync = time(NULL);\n    server.aof_rewrite_time_last = -1;\n    server.aof_rewrite_time_start = -1;\n    server.aof_delayed_fsync = 0;\n    server.aof_fd = -1;\n    server.aof_selected_db = -1; /* Make sure the first time will not match */\n    server.aof_flush_postponed_start = 0;\n    server.pidfile = zstrdup(\"/var/run/redis.pid\");\n    server.rdb_filename = zstrdup(\"dump.rdb\");\n    server.aof_filename = zstrdup(\"appendonly.aof\");\n    server.requirepass = NULL;\n    server.rdb_compression = 1;\n    server.rdb_checksum = 1;\n    server.activerehashing = 1;\n    server.maxclients = REDIS_MAX_CLIENTS;\n    server.bpop_blocked_clients = 0;\n    server.maxmemory = 0;\n    server.maxmemory_policy = REDIS_MAXMEMORY_VOLATILE_LRU;\n    server.maxmemory_samples = 3;\n    server.hash_max_ziplist_entries = REDIS_HASH_MAX_ZIPLIST_ENTRIES;\n    server.hash_max_ziplist_value = REDIS_HASH_MAX_ZIPLIST_VALUE;\n    server.list_max_ziplist_entries = REDIS_LIST_MAX_ZIPLIST_ENTRIES;\n    server.list_max_ziplist_value = REDIS_LIST_MAX_ZIPLIST_VALUE;\n    server.set_max_intset_entries = REDIS_SET_MAX_INTSET_ENTRIES;\n    server.zset_max_ziplist_entries = REDIS_ZSET_MAX_ZIPLIST_ENTRIES;\n    server.zset_max_ziplist_value = REDIS_ZSET_MAX_ZIPLIST_VALUE;\n    server.shutdown_asap = 0;\n    server.repl_ping_slave_period = REDIS_REPL_PING_SLAVE_PERIOD;\n    server.repl_timeout = REDIS_REPL_TIMEOUT;\n    server.cluster_enabled = 0;\n    server.cluster.configfile = zstrdup(\"nodes.conf\");\n    server.lua_caller = NULL;\n    server.lua_time_limit = REDIS_LUA_TIME_LIMIT;\n    server.lua_client = NULL;\n    server.lua_timedout = 0;\n\n    updateLRUClock();\n    resetServerSaveParams();\n\n    appendServerSaveParams(60*60,1);  /* save after 1 hour and 1 change */\n    appendServerSaveParams(300,100);  /* save after 5 minutes and 100 changes */\n    appendServerSaveParams(60,10000); /* save after 1 minute and 10000 changes */\n    /* Replication related */\n    server.masterauth = NULL;\n    server.masterhost = NULL;\n    server.masterport = 6379;\n    server.master = NULL;\n    server.repl_state = REDIS_REPL_NONE;\n    server.repl_syncio_timeout = REDIS_REPL_SYNCIO_TIMEOUT;\n    server.repl_serve_stale_data = 1;\n    server.repl_slave_ro = 1;\n    server.repl_down_since = time(NULL);\n\n    /* Client output buffer limits */\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].hard_limit_bytes = 0;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_bytes = 0;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_seconds = 0;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].hard_limit_bytes = 1024*1024*256;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_bytes = 1024*1024*64;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_seconds = 60;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].hard_limit_bytes = 1024*1024*32;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_bytes = 1024*1024*8;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_seconds = 60;\n\n    /* Double constants initialization */\n    R_Zero = 0.0;\n    R_PosInf = 1.0/R_Zero;\n    R_NegInf = -1.0/R_Zero;\n    R_Nan = R_Zero/R_Zero;\n\n    /* Command table -- we intiialize it here as it is part of the\n     * initial configuration, since command names may be changed via\n     * redis.conf using the rename-command directive. */\n    server.commands = dictCreate(&commandTableDictType,NULL);\n    populateCommandTable();\n    server.delCommand = lookupCommandByCString(\"del\");\n    server.multiCommand = lookupCommandByCString(\"multi\");\n    server.lpushCommand = lookupCommandByCString(\"lpush\");\n    \n    /* Slow log */\n    server.slowlog_log_slower_than = REDIS_SLOWLOG_LOG_SLOWER_THAN;\n    server.slowlog_max_len = REDIS_SLOWLOG_MAX_LEN;\n\n    /* Debugging */\n    server.assert_failed = \"<no assertion failed>\";\n    server.assert_file = \"<no file>\";\n    server.assert_line = 0;\n    server.bug_report_start = 0;\n    server.watchdog_period = 0;\n}\n\n/* This function will try to raise the max number of open files accordingly to\n * the configured max number of clients. It will also account for 32 additional\n * file descriptors as we need a few more for persistence, listening\n * sockets, log files and so forth.\n *\n * If it will not be possible to set the limit accordingly to the configured\n * max number of clients, the function will do the reverse setting\n * server.maxclients to the value that we can actually handle. */\nvoid adjustOpenFilesLimit(void) {\n    rlim_t maxfiles = server.maxclients+32;\n    struct rlimit limit;\n\n    if (getrlimit(RLIMIT_NOFILE,&limit) == -1) {\n        redisLog(REDIS_WARNING,\"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.\",\n            strerror(errno));\n        server.maxclients = 1024-32;\n    } else {\n        rlim_t oldlimit = limit.rlim_cur;\n\n        /* Set the max number of files if the current limit is not enough\n         * for our needs. */\n        if (oldlimit < maxfiles) {\n            rlim_t f;\n            \n            f = maxfiles;\n            while(f > oldlimit) {\n                limit.rlim_cur = f;\n                limit.rlim_max = f;\n                if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break;\n                f -= 128;\n            }\n            if (f < oldlimit) f = oldlimit;\n            if (f != maxfiles) {\n                server.maxclients = f-32;\n                redisLog(REDIS_WARNING,\"Unable to set the max number of files limit to %d (%s), setting the max clients configuration to %d.\",\n                    (int) maxfiles, strerror(errno), (int) server.maxclients);\n            } else {\n                redisLog(REDIS_NOTICE,\"Max number of open files set to %d\",\n                    (int) maxfiles);\n            }\n        }\n    }\n}\n\nvoid initServer() {\n    int j;\n\n    signal(SIGHUP, SIG_IGN);\n    signal(SIGPIPE, SIG_IGN);\n    setupSignalHandlers();\n\n    if (server.syslog_enabled) {\n        openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,\n            server.syslog_facility);\n    }\n\n    server.current_client = NULL;\n    server.clients = listCreate();\n    server.clients_to_close = listCreate();\n    server.slaves = listCreate();\n    server.monitors = listCreate();\n    server.unblocked_clients = listCreate();\n\n    createSharedObjects();\n    adjustOpenFilesLimit();\n    server.el = aeCreateEventLoop(server.maxclients+1024);\n    server.db = zmalloc(sizeof(redisDb)*server.dbnum);\n\n    if (server.port != 0) {\n        server.ipfd = anetTcpServer(server.neterr,server.port,server.bindaddr);\n        if (server.ipfd == ANET_ERR) {\n            redisLog(REDIS_WARNING, \"Opening port %d: %s\",\n                server.port, server.neterr);\n            exit(1);\n        }\n    }\n    if (server.unixsocket != NULL) {\n        unlink(server.unixsocket); /* don't care if this fails */\n        server.sofd = anetUnixServer(server.neterr,server.unixsocket,server.unixsocketperm);\n        if (server.sofd == ANET_ERR) {\n            redisLog(REDIS_WARNING, \"Opening socket: %s\", server.neterr);\n            exit(1);\n        }\n    }\n    if (server.ipfd < 0 && server.sofd < 0) {\n        redisLog(REDIS_WARNING, \"Configured to not listen anywhere, exiting.\");\n        exit(1);\n    }\n    for (j = 0; j < server.dbnum; j++) {\n        server.db[j].dict = dictCreate(&dbDictType,NULL);\n        server.db[j].expires = dictCreate(&keyptrDictType,NULL);\n        server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL);\n        server.db[j].watched_keys = dictCreate(&keylistDictType,NULL);\n        server.db[j].id = j;\n    }\n    server.pubsub_channels = dictCreate(&keylistDictType,NULL);\n    server.pubsub_patterns = listCreate();\n    listSetFreeMethod(server.pubsub_patterns,freePubsubPattern);\n    listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern);\n    server.cronloops = 0;\n    server.rdb_child_pid = -1;\n    server.aof_child_pid = -1;\n    aofRewriteBufferReset();\n    server.aof_buf = sdsempty();\n    server.lastsave = time(NULL);\n    server.rdb_save_time_last = -1;\n    server.rdb_save_time_start = -1;\n    server.dirty = 0;\n    server.stat_numcommands = 0;\n    server.stat_numconnections = 0;\n    server.stat_expiredkeys = 0;\n    server.stat_evictedkeys = 0;\n    server.stat_starttime = time(NULL);\n    server.stat_keyspace_misses = 0;\n    server.stat_keyspace_hits = 0;\n    server.stat_peak_memory = 0;\n    server.stat_fork_time = 0;\n    server.stat_rejected_conn = 0;\n    memset(server.ops_sec_samples,0,sizeof(server.ops_sec_samples));\n    server.ops_sec_idx = 0;\n    server.ops_sec_last_sample_time = mstime();\n    server.ops_sec_last_sample_ops = 0;\n    server.unixtime = time(NULL);\n    server.lastbgsave_status = REDIS_OK;\n    server.stop_writes_on_bgsave_err = 1;\n    aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL);\n    if (server.ipfd > 0 && aeCreateFileEvent(server.el,server.ipfd,AE_READABLE,\n        acceptTcpHandler,NULL) == AE_ERR) oom(\"creating file event\");\n    if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE,\n        acceptUnixHandler,NULL) == AE_ERR) oom(\"creating file event\");\n\n    if (server.aof_state == REDIS_AOF_ON) {\n        server.aof_fd = open(server.aof_filename,\n                               O_WRONLY|O_APPEND|O_CREAT,0644);\n        if (server.aof_fd == -1) {\n            redisLog(REDIS_WARNING, \"Can't open the append-only file: %s\",\n                strerror(errno));\n            exit(1);\n        }\n    }\n\n    /* 32 bit instances are limited to 4GB of address space, so if there is\n     * no explicit limit in the user provided configuration we set a limit\n     * at 3.5GB using maxmemory with 'noeviction' policy'. This saves\n     * useless crashes of the Redis instance. */\n    if (server.arch_bits == 32 && server.maxmemory == 0) {\n        redisLog(REDIS_WARNING,\"Warning: 32 bit instance detected but no memory limit set. Setting 3.5 GB maxmemory limit with 'noeviction' policy now.\");\n        server.maxmemory = 3584LL*(1024*1024); /* 3584 MB = 3.5 GB */\n        server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION;\n    }\n\n    if (server.cluster_enabled) clusterInit();\n    scriptingInit();\n    slowlogInit();\n    bioInit();\n}\n\n/* Populates the Redis Command Table starting from the hard coded list\n * we have on top of redis.c file. */\nvoid populateCommandTable(void) {\n    int j;\n    int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);\n\n    for (j = 0; j < numcommands; j++) {\n        struct redisCommand *c = redisCommandTable+j;\n        char *f = c->sflags;\n        int retval;\n\n        while(*f != '\\0') {\n            switch(*f) {\n            case 'w': c->flags |= REDIS_CMD_WRITE; break;\n            case 'r': c->flags |= REDIS_CMD_READONLY; break;\n            case 'm': c->flags |= REDIS_CMD_DENYOOM; break;\n            case 'a': c->flags |= REDIS_CMD_ADMIN; break;\n            case 'p': c->flags |= REDIS_CMD_PUBSUB; break;\n            case 'f': c->flags |= REDIS_CMD_FORCE_REPLICATION; break;\n            case 's': c->flags |= REDIS_CMD_NOSCRIPT; break;\n            case 'R': c->flags |= REDIS_CMD_RANDOM; break;\n            case 'S': c->flags |= REDIS_CMD_SORT_FOR_SCRIPT; break;\n            default: redisPanic(\"Unsupported command flag\"); break;\n            }\n            f++;\n        }\n\n        retval = dictAdd(server.commands, sdsnew(c->name), c);\n        assert(retval == DICT_OK);\n    }\n}\n\nvoid resetCommandTableStats(void) {\n    int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);\n    int j;\n\n    for (j = 0; j < numcommands; j++) {\n        struct redisCommand *c = redisCommandTable+j;\n\n        c->microseconds = 0;\n        c->calls = 0;\n    }\n}\n\n/* ========================== Redis OP Array API ============================ */\n\nvoid redisOpArrayInit(redisOpArray *oa) {\n    oa->ops = NULL;\n    oa->numops = 0;\n}\n\nint redisOpArrayAppend(redisOpArray *oa, struct redisCommand *cmd, int dbid,\n                       robj **argv, int argc, int target)\n{\n    redisOp *op;\n\n    oa->ops = zrealloc(oa->ops,sizeof(redisOp)*(oa->numops+1));\n    op = oa->ops+oa->numops;\n    op->cmd = cmd;\n    op->dbid = dbid;\n    op->argv = argv;\n    op->argc = argc;\n    op->target = target;\n    oa->numops++;\n    return oa->numops;\n}\n\nvoid redisOpArrayFree(redisOpArray *oa) {\n    while(oa->numops) {\n        int j;\n        redisOp *op;\n\n        oa->numops--;\n        op = oa->ops+oa->numops;\n        for (j = 0; j < op->argc; j++)\n            decrRefCount(op->argv[j]);\n        zfree(op->argv);\n    }\n    zfree(oa->ops);\n}\n\n/* ====================== Commands lookup and execution ===================== */\n\nstruct redisCommand *lookupCommand(sds name) {\n    return dictFetchValue(server.commands, name);\n}\n\nstruct redisCommand *lookupCommandByCString(char *s) {\n    struct redisCommand *cmd;\n    sds name = sdsnew(s);\n\n    cmd = dictFetchValue(server.commands, name);\n    sdsfree(name);\n    return cmd;\n}\n\n/* Propagate the specified command (in the context of the specified database id)\n * to AOF, Slaves and Monitors.\n *\n * flags are an xor between:\n * + REDIS_PROPAGATE_NONE (no propagation of command at all)\n * + REDIS_PROPAGATE_AOF (propagate into the AOF file if is enabled)\n * + REDIS_PROPAGATE_REPL (propagate into the replication link)\n */\nvoid propagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,\n               int flags)\n{\n    if (server.aof_state != REDIS_AOF_OFF && flags & REDIS_PROPAGATE_AOF)\n        feedAppendOnlyFile(cmd,dbid,argv,argc);\n    if (flags & REDIS_PROPAGATE_REPL && listLength(server.slaves))\n        replicationFeedSlaves(server.slaves,dbid,argv,argc);\n}\n\n/* Used inside commands to schedule the propagation of additional commands\n * after the current command is propagated to AOF / Replication. */\nvoid alsoPropagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,\n                   int target)\n{\n    redisOpArrayAppend(&server.also_propagate,cmd,dbid,argv,argc,target);\n}\n\n/* Call() is the core of Redis execution of a command */\nvoid call(redisClient *c, int flags) {\n    long long dirty, start = ustime(), duration;\n\n    /* Sent the command to clients in MONITOR mode, only if the commands are\n     * not geneated from reading an AOF. */\n    if (listLength(server.monitors) && !server.loading)\n        replicationFeedMonitors(c,server.monitors,c->db->id,c->argv,c->argc);\n\n    /* Call the command. */\n    redisOpArrayInit(&server.also_propagate);\n    dirty = server.dirty;\n    c->cmd->proc(c);\n    dirty = server.dirty-dirty;\n    duration = ustime()-start;\n\n    /* When EVAL is called loading the AOF we don't want commands called\n     * from Lua to go into the slowlog or to populate statistics. */\n    if (server.loading && c->flags & REDIS_LUA_CLIENT)\n        flags &= ~(REDIS_CALL_SLOWLOG | REDIS_CALL_STATS);\n\n    /* Log the command into the Slow log if needed, and populate the\n     * per-command statistics that we show in INFO commandstats. */\n    if (flags & REDIS_CALL_SLOWLOG)\n        slowlogPushEntryIfNeeded(c->argv,c->argc,duration);\n    if (flags & REDIS_CALL_STATS) {\n        c->cmd->microseconds += duration;\n        c->cmd->calls++;\n    }\n\n    /* Propagate the command into the AOF and replication link */\n    if (flags & REDIS_CALL_PROPAGATE) {\n        int flags = REDIS_PROPAGATE_NONE;\n\n        if (c->cmd->flags & REDIS_CMD_FORCE_REPLICATION)\n            flags |= REDIS_PROPAGATE_REPL;\n        if (dirty)\n            flags |= (REDIS_PROPAGATE_REPL | REDIS_PROPAGATE_AOF);\n        if (flags != REDIS_PROPAGATE_NONE)\n            propagate(c->cmd,c->db->id,c->argv,c->argc,flags);\n    }\n    /* Commands such as LPUSH or BRPOPLPUSH may propagate an additional\n     * PUSH command. */\n    if (server.also_propagate.numops) {\n        int j;\n        redisOp *rop;\n\n        for (j = 0; j < server.also_propagate.numops; j++) {\n            rop = &server.also_propagate.ops[j];\n            propagate(rop->cmd, rop->dbid, rop->argv, rop->argc, rop->target);\n        }\n        redisOpArrayFree(&server.also_propagate);\n    }\n    server.stat_numcommands++;\n}\n\n/* If this function gets called we already read a whole\n * command, argments are in the client argv/argc fields.\n * processCommand() execute the command or prepare the\n * server for a bulk read from the client.\n *\n * If 1 is returned the client is still alive and valid and\n * and other operations can be performed by the caller. Otherwise\n * if 0 is returned the client was destroied (i.e. after QUIT). */\nint processCommand(redisClient *c) {\n    /* The QUIT command is handled separately. Normal command procs will\n     * go through checking for replication and QUIT will cause trouble\n     * when FORCE_REPLICATION is enabled and would be implemented in\n     * a regular command proc. */\n    if (!strcasecmp(c->argv[0]->ptr,\"quit\")) {\n        addReply(c,shared.ok);\n        c->flags |= REDIS_CLOSE_AFTER_REPLY;\n        return REDIS_ERR;\n    }\n\n    /* Now lookup the command and check ASAP about trivial error conditions\n     * such as wrong arity, bad command name and so forth. */\n    c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr);\n    if (!c->cmd) {\n        addReplyErrorFormat(c,\"unknown command '%s'\",\n            (char*)c->argv[0]->ptr);\n        return REDIS_OK;\n    } else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) ||\n               (c->argc < -c->cmd->arity)) {\n        addReplyErrorFormat(c,\"wrong number of arguments for '%s' command\",\n            c->cmd->name);\n        return REDIS_OK;\n    }\n\n    /* Check if the user is authenticated */\n    if (server.requirepass && !c->authenticated && c->cmd->proc != authCommand)\n    {\n        addReplyError(c,\"operation not permitted\");\n        return REDIS_OK;\n    }\n\n    /* If cluster is enabled, redirect here */\n    if (server.cluster_enabled &&\n                !(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0)) {\n        int hashslot;\n\n        if (server.cluster.state != REDIS_CLUSTER_OK) {\n            addReplyError(c,\"The cluster is down. Check with CLUSTER INFO for more information\");\n            return REDIS_OK;\n        } else {\n            int ask;\n            clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&ask);\n            if (n == NULL) {\n                addReplyError(c,\"Multi keys request invalid in cluster\");\n                return REDIS_OK;\n            } else if (n != server.cluster.myself) {\n                addReplySds(c,sdscatprintf(sdsempty(),\n                    \"-%s %d %s:%d\\r\\n\", ask ? \"ASK\" : \"MOVED\",\n                    hashslot,n->ip,n->port));\n                return REDIS_OK;\n            }\n        }\n    }\n\n    /* Handle the maxmemory directive.\n     *\n     * First we try to free some memory if possible (if there are volatile\n     * keys in the dataset). If there are not the only thing we can do\n     * is returning an error. */\n    if (server.maxmemory) {\n        int retval = freeMemoryIfNeeded();\n        if ((c->cmd->flags & REDIS_CMD_DENYOOM) && retval == REDIS_ERR) {\n            addReply(c, shared.oomerr);\n            return REDIS_OK;\n        }\n    }\n\n    /* Don't accept write commands if there are problems persisting on disk. */\n    if (server.stop_writes_on_bgsave_err &&\n        server.saveparamslen > 0\n        && server.lastbgsave_status == REDIS_ERR &&\n        c->cmd->flags & REDIS_CMD_WRITE)\n    {\n        addReply(c, shared.bgsaveerr);\n        return REDIS_OK;\n    }\n\n    /* Don't accept wirte commands if this is a read only slave. But\n     * accept write commands if this is our master. */\n    if (server.masterhost && server.repl_slave_ro &&\n        !(c->flags & REDIS_MASTER) &&\n        c->cmd->flags & REDIS_CMD_WRITE)\n    {\n        addReply(c, shared.roslaveerr);\n        return REDIS_OK;\n    }\n\n    /* Only allow SUBSCRIBE and UNSUBSCRIBE in the context of Pub/Sub */\n    if ((dictSize(c->pubsub_channels) > 0 || listLength(c->pubsub_patterns) > 0)\n        &&\n        c->cmd->proc != subscribeCommand &&\n        c->cmd->proc != unsubscribeCommand &&\n        c->cmd->proc != psubscribeCommand &&\n        c->cmd->proc != punsubscribeCommand) {\n        addReplyError(c,\"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context\");\n        return REDIS_OK;\n    }\n\n    /* Only allow INFO and SLAVEOF when slave-serve-stale-data is no and\n     * we are a slave with a broken link with master. */\n    if (server.masterhost && server.repl_state != REDIS_REPL_CONNECTED &&\n        server.repl_serve_stale_data == 0 &&\n        c->cmd->proc != infoCommand && c->cmd->proc != slaveofCommand)\n    {\n        addReply(c, shared.masterdownerr);\n        return REDIS_OK;\n    }\n\n    /* Loading DB? Return an error if the command is not INFO */\n    if (server.loading && c->cmd->proc != infoCommand) {\n        addReply(c, shared.loadingerr);\n        return REDIS_OK;\n    }\n\n    /* Lua script too slow? Only allow SHUTDOWN NOSAVE and SCRIPT KILL. */\n    if (server.lua_timedout &&\n        !(c->cmd->proc == shutdownCommand &&\n          c->argc == 2 &&\n          tolower(((char*)c->argv[1]->ptr)[0]) == 'n') &&\n        !(c->cmd->proc == scriptCommand &&\n          c->argc == 2 &&\n          tolower(((char*)c->argv[1]->ptr)[0]) == 'k'))\n    {\n        addReply(c, shared.slowscripterr);\n        return REDIS_OK;\n    }\n\n    /* Exec the command */\n    if (c->flags & REDIS_MULTI &&\n        c->cmd->proc != execCommand && c->cmd->proc != discardCommand &&\n        c->cmd->proc != multiCommand && c->cmd->proc != watchCommand)\n    {\n        queueMultiCommand(c);\n        addReply(c,shared.queued);\n    } else {\n        call(c,REDIS_CALL_FULL);\n    }\n    return REDIS_OK;\n}\n\n/*================================== Shutdown =============================== */\n\nint prepareForShutdown(int flags) {\n    int save = flags & REDIS_SHUTDOWN_SAVE;\n    int nosave = flags & REDIS_SHUTDOWN_NOSAVE;\n\n    redisLog(REDIS_WARNING,\"User requested shutdown...\");\n    /* Kill the saving child if there is a background saving in progress.\n       We want to avoid race conditions, for instance our saving child may\n       overwrite the synchronous saving did by SHUTDOWN. */\n    if (server.rdb_child_pid != -1) {\n        redisLog(REDIS_WARNING,\"There is a child saving an .rdb. Killing it!\");\n        kill(server.rdb_child_pid,SIGKILL);\n        rdbRemoveTempFile(server.rdb_child_pid);\n    }\n    if (server.aof_state != REDIS_AOF_OFF) {\n        /* Kill the AOF saving child as the AOF we already have may be longer\n         * but contains the full dataset anyway. */\n        if (server.aof_child_pid != -1) {\n            redisLog(REDIS_WARNING,\n                \"There is a child rewriting the AOF. Killing it!\");\n            kill(server.aof_child_pid,SIGKILL);\n        }\n        /* Append only file: fsync() the AOF and exit */\n        redisLog(REDIS_NOTICE,\"Calling fsync() on the AOF file.\");\n        aof_fsync(server.aof_fd);\n    }\n    if ((server.saveparamslen > 0 && !nosave) || save) {\n        redisLog(REDIS_NOTICE,\"Saving the final RDB snapshot before exiting.\");\n        /* Snapshotting. Perform a SYNC SAVE and exit */\n        if (rdbSave(server.rdb_filename) != REDIS_OK) {\n            /* Ooops.. error saving! The best we can do is to continue\n             * operating. Note that if there was a background saving process,\n             * in the next cron() Redis will be notified that the background\n             * saving aborted, handling special stuff like slaves pending for\n             * synchronization... */\n            redisLog(REDIS_WARNING,\"Error trying to save the DB, can't exit.\");\n            return REDIS_ERR;\n        }\n    }\n    if (server.daemonize) {\n        redisLog(REDIS_NOTICE,\"Removing the pid file.\");\n        unlink(server.pidfile);\n    }\n    /* Close the listening sockets. Apparently this allows faster restarts. */\n    if (server.ipfd != -1) close(server.ipfd);\n    if (server.sofd != -1) close(server.sofd);\n    if (server.unixsocket) {\n        redisLog(REDIS_NOTICE,\"Removing the unix socket file.\");\n        unlink(server.unixsocket); /* don't care if this fails */\n    }\n\n    redisLog(REDIS_WARNING,\"Redis is now ready to exit, bye bye...\");\n    return REDIS_OK;\n}\n\n/*================================== Commands =============================== */\n\nvoid authCommand(redisClient *c) {\n    if (!server.requirepass) {\n        addReplyError(c,\"Client sent AUTH, but no password is set\");\n    } else if (!strcmp(c->argv[1]->ptr, server.requirepass)) {\n      c->authenticated = 1;\n      addReply(c,shared.ok);\n    } else {\n      c->authenticated = 0;\n      addReplyError(c,\"invalid password\");\n    }\n}\n\nvoid pingCommand(redisClient *c) {\n    addReply(c,shared.pong);\n}\n\nvoid echoCommand(redisClient *c) {\n    addReplyBulk(c,c->argv[1]);\n}\n\nvoid timeCommand(redisClient *c) {\n    struct timeval tv;\n\n    /* gettimeofday() can only fail if &tv is a bad addresss so we\n     * don't check for errors. */\n    gettimeofday(&tv,NULL);\n    addReplyMultiBulkLen(c,2);\n    addReplyBulkLongLong(c,tv.tv_sec);\n    addReplyBulkLongLong(c,tv.tv_usec);\n}\n\n/* Convert an amount of bytes into a human readable string in the form\n * of 100B, 2G, 100M, 4K, and so forth. */\nvoid bytesToHuman(char *s, unsigned long long n) {\n    double d;\n\n    if (n < 1024) {\n        /* Bytes */\n        sprintf(s,\"%lluB\",n);\n        return;\n    } else if (n < (1024*1024)) {\n        d = (double)n/(1024);\n        sprintf(s,\"%.2fK\",d);\n    } else if (n < (1024LL*1024*1024)) {\n        d = (double)n/(1024*1024);\n        sprintf(s,\"%.2fM\",d);\n    } else if (n < (1024LL*1024*1024*1024)) {\n        d = (double)n/(1024LL*1024*1024);\n        sprintf(s,\"%.2fG\",d);\n    }\n}\n\n/* Create the string returned by the INFO command. This is decoupled\n * by the INFO command itself as we need to report the same information\n * on memory corruption problems. */\nsds genRedisInfoString(char *section) {\n    sds info = sdsempty();\n    time_t uptime = server.unixtime-server.stat_starttime;\n    int j, numcommands;\n    struct rusage self_ru, c_ru;\n    unsigned long lol, bib;\n    int allsections = 0, defsections = 0;\n    int sections = 0;\n    \n    if (section) {\n        allsections = strcasecmp(section,\"all\") == 0;\n        defsections = strcasecmp(section,\"default\") == 0;\n    }\n\n    getrusage(RUSAGE_SELF, &self_ru);\n    getrusage(RUSAGE_CHILDREN, &c_ru);\n    getClientsMaxBuffers(&lol,&bib);\n\n    /* Server */\n    if (allsections || defsections || !strcasecmp(section,\"server\")) {\n        struct utsname name;\n\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        uname(&name);\n        info = sdscatprintf(info,\n            \"# Server\\r\\n\"\n            \"redis_version:%s\\r\\n\"\n            \"redis_git_sha1:%s\\r\\n\"\n            \"redis_git_dirty:%d\\r\\n\"\n            \"os:%s %s %s\\r\\n\"\n            \"arch_bits:%d\\r\\n\"\n            \"multiplexing_api:%s\\r\\n\"\n            \"gcc_version:%d.%d.%d\\r\\n\"\n            \"process_id:%ld\\r\\n\"\n            \"run_id:%s\\r\\n\"\n            \"tcp_port:%d\\r\\n\"\n            \"uptime_in_seconds:%ld\\r\\n\"\n            \"uptime_in_days:%ld\\r\\n\"\n            \"lru_clock:%ld\\r\\n\",\n            REDIS_VERSION,\n            redisGitSHA1(),\n            strtol(redisGitDirty(),NULL,10) > 0,\n            name.sysname, name.release, name.machine,\n            server.arch_bits,\n            aeGetApiName(),\n#ifdef __GNUC__\n            __GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__,\n#else\n            0,0,0,\n#endif\n            (long) getpid(),\n            server.runid,\n            server.port,\n            uptime,\n            uptime/(3600*24),\n            (unsigned long) server.lruclock);\n    }\n\n    /* Clients */\n    if (allsections || defsections || !strcasecmp(section,\"clients\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n            \"# Clients\\r\\n\"\n            \"connected_clients:%lu\\r\\n\"\n            \"client_longest_output_list:%lu\\r\\n\"\n            \"client_biggest_input_buf:%lu\\r\\n\"\n            \"blocked_clients:%d\\r\\n\",\n            listLength(server.clients)-listLength(server.slaves),\n            lol, bib,\n            server.bpop_blocked_clients);\n    }\n\n    /* Memory */\n    if (allsections || defsections || !strcasecmp(section,\"memory\")) {\n        char hmem[64];\n        char peak_hmem[64];\n\n        bytesToHuman(hmem,zmalloc_used_memory());\n        bytesToHuman(peak_hmem,server.stat_peak_memory);\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n            \"# Memory\\r\\n\"\n            \"used_memory:%zu\\r\\n\"\n            \"used_memory_human:%s\\r\\n\"\n            \"used_memory_rss:%zu\\r\\n\"\n            \"used_memory_peak:%zu\\r\\n\"\n            \"used_memory_peak_human:%s\\r\\n\"\n            \"used_memory_lua:%lld\\r\\n\"\n            \"mem_fragmentation_ratio:%.2f\\r\\n\"\n            \"mem_allocator:%s\\r\\n\",\n            zmalloc_used_memory(),\n            hmem,\n            zmalloc_get_rss(),\n            server.stat_peak_memory,\n            peak_hmem,\n            ((long long)lua_gc(server.lua,LUA_GCCOUNT,0))*1024LL,\n            zmalloc_get_fragmentation_ratio(),\n            ZMALLOC_LIB\n            );\n    }\n\n    /* Persistence */\n    if (allsections || defsections || !strcasecmp(section,\"persistence\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n            \"# Persistence\\r\\n\"\n            \"loading:%d\\r\\n\"\n            \"rdb_changes_since_last_save:%lld\\r\\n\"\n            \"rdb_bgsave_in_progress:%d\\r\\n\"\n            \"rdb_last_save_time:%ld\\r\\n\"\n            \"rdb_last_bgsave_status:%s\\r\\n\"\n            \"rdb_last_bgsave_time_sec:%ld\\r\\n\"\n            \"rdb_current_bgsave_time_sec:%ld\\r\\n\"\n            \"aof_enabled:%d\\r\\n\"\n            \"aof_rewrite_in_progress:%d\\r\\n\"\n            \"aof_rewrite_scheduled:%d\\r\\n\"\n            \"aof_last_rewrite_time_sec:%ld\\r\\n\"\n            \"aof_current_rewrite_time_sec:%ld\\r\\n\",\n            server.loading,\n            server.dirty,\n            server.rdb_child_pid != -1,\n            server.lastsave,\n            server.lastbgsave_status == REDIS_OK ? \"ok\" : \"err\",\n            server.rdb_save_time_last,\n            (server.rdb_child_pid == -1) ?\n                -1 : time(NULL)-server.rdb_save_time_start,\n            server.aof_state != REDIS_AOF_OFF,\n            server.aof_child_pid != -1,\n            server.aof_rewrite_scheduled,\n            server.aof_rewrite_time_last,\n            (server.aof_child_pid == -1) ?\n                -1 : time(NULL)-server.aof_rewrite_time_start);\n\n        if (server.aof_state != REDIS_AOF_OFF) {\n            info = sdscatprintf(info,\n                \"aof_current_size:%lld\\r\\n\"\n                \"aof_base_size:%lld\\r\\n\"\n                \"aof_pending_rewrite:%d\\r\\n\"\n                \"aof_buffer_length:%zu\\r\\n\"\n                \"aof_rewrite_buffer_length:%zu\\r\\n\"\n                \"aof_pending_bio_fsync:%llu\\r\\n\"\n                \"aof_delayed_fsync:%lu\\r\\n\",\n                (long long) server.aof_current_size,\n                (long long) server.aof_rewrite_base_size,\n                server.aof_rewrite_scheduled,\n                sdslen(server.aof_buf),\n                aofRewriteBufferSize(),\n                bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC),\n                server.aof_delayed_fsync);\n        }\n\n        if (server.loading) {\n            double perc;\n            time_t eta, elapsed;\n            off_t remaining_bytes = server.loading_total_bytes-\n                                    server.loading_loaded_bytes;\n\n            perc = ((double)server.loading_loaded_bytes /\n                   server.loading_total_bytes) * 100;\n\n            elapsed = server.unixtime-server.loading_start_time;\n            if (elapsed == 0) {\n                eta = 1; /* A fake 1 second figure if we don't have\n                            enough info */\n            } else {\n                eta = (elapsed*remaining_bytes)/server.loading_loaded_bytes;\n            }\n\n            info = sdscatprintf(info,\n                \"loading_start_time:%ld\\r\\n\"\n                \"loading_total_bytes:%llu\\r\\n\"\n                \"loading_loaded_bytes:%llu\\r\\n\"\n                \"loading_loaded_perc:%.2f\\r\\n\"\n                \"loading_eta_seconds:%ld\\r\\n\"\n                ,(unsigned long) server.loading_start_time,\n                (unsigned long long) server.loading_total_bytes,\n                (unsigned long long) server.loading_loaded_bytes,\n                perc,\n                eta\n            );\n        }\n    }\n\n    /* Stats */\n    if (allsections || defsections || !strcasecmp(section,\"stats\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n            \"# Stats\\r\\n\"\n            \"total_connections_received:%lld\\r\\n\"\n            \"total_commands_processed:%lld\\r\\n\"\n            \"instantaneous_ops_per_sec:%lld\\r\\n\"\n            \"rejected_connections:%lld\\r\\n\"\n            \"expired_keys:%lld\\r\\n\"\n            \"evicted_keys:%lld\\r\\n\"\n            \"keyspace_hits:%lld\\r\\n\"\n            \"keyspace_misses:%lld\\r\\n\"\n            \"pubsub_channels:%ld\\r\\n\"\n            \"pubsub_patterns:%lu\\r\\n\"\n            \"latest_fork_usec:%lld\\r\\n\",\n            server.stat_numconnections,\n            server.stat_numcommands,\n            getOperationsPerSecond(),\n            server.stat_rejected_conn,\n            server.stat_expiredkeys,\n            server.stat_evictedkeys,\n            server.stat_keyspace_hits,\n            server.stat_keyspace_misses,\n            dictSize(server.pubsub_channels),\n            listLength(server.pubsub_patterns),\n            server.stat_fork_time);\n    }\n\n    /* Replication */\n    if (allsections || defsections || !strcasecmp(section,\"replication\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n            \"# Replication\\r\\n\"\n            \"role:%s\\r\\n\",\n            server.masterhost == NULL ? \"master\" : \"slave\");\n        if (server.masterhost) {\n            info = sdscatprintf(info,\n                \"master_host:%s\\r\\n\"\n                \"master_port:%d\\r\\n\"\n                \"master_link_status:%s\\r\\n\"\n                \"master_last_io_seconds_ago:%d\\r\\n\"\n                \"master_sync_in_progress:%d\\r\\n\"\n                ,server.masterhost,\n                server.masterport,\n                (server.repl_state == REDIS_REPL_CONNECTED) ?\n                    \"up\" : \"down\",\n                server.master ?\n                ((int)(server.unixtime-server.master->lastinteraction)) : -1,\n                server.repl_state == REDIS_REPL_TRANSFER\n            );\n\n            if (server.repl_state == REDIS_REPL_TRANSFER) {\n                info = sdscatprintf(info,\n                    \"master_sync_left_bytes:%ld\\r\\n\"\n                    \"master_sync_last_io_seconds_ago:%d\\r\\n\"\n                    ,(long)server.repl_transfer_left,\n                    (int)(server.unixtime-server.repl_transfer_lastio)\n                );\n            }\n\n            if (server.repl_state != REDIS_REPL_CONNECTED) {\n                info = sdscatprintf(info,\n                    \"master_link_down_since_seconds:%ld\\r\\n\",\n                    (long)server.unixtime-server.repl_down_since);\n            }\n        }\n        info = sdscatprintf(info,\n            \"connected_slaves:%lu\\r\\n\",\n            listLength(server.slaves));\n        if (listLength(server.slaves)) {\n            int slaveid = 0;\n            listNode *ln;\n            listIter li;\n\n            listRewind(server.slaves,&li);\n            while((ln = listNext(&li))) {\n                redisClient *slave = listNodeValue(ln);\n                char *state = NULL;\n                char ip[32];\n                int port;\n\n                if (anetPeerToString(slave->fd,ip,&port) == -1) continue;\n                switch(slave->replstate) {\n                case REDIS_REPL_WAIT_BGSAVE_START:\n                case REDIS_REPL_WAIT_BGSAVE_END:\n                    state = \"wait_bgsave\";\n                    break;\n                case REDIS_REPL_SEND_BULK:\n                    state = \"send_bulk\";\n                    break;\n                case REDIS_REPL_ONLINE:\n                    state = \"online\";\n                    break;\n                }\n                if (state == NULL) continue;\n                info = sdscatprintf(info,\"slave%d:%s,%d,%s\\r\\n\",\n                    slaveid,ip,port,state);\n                slaveid++;\n            }\n        }\n    }\n\n    /* CPU */\n    if (allsections || defsections || !strcasecmp(section,\"cpu\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n        \"# CPU\\r\\n\"\n        \"used_cpu_sys:%.2f\\r\\n\"\n        \"used_cpu_user:%.2f\\r\\n\"\n        \"used_cpu_sys_children:%.2f\\r\\n\"\n        \"used_cpu_user_children:%.2f\\r\\n\",\n        (float)self_ru.ru_stime.tv_sec+(float)self_ru.ru_stime.tv_usec/1000000,\n        (float)self_ru.ru_utime.tv_sec+(float)self_ru.ru_utime.tv_usec/1000000,\n        (float)c_ru.ru_stime.tv_sec+(float)c_ru.ru_stime.tv_usec/1000000,\n        (float)c_ru.ru_utime.tv_sec+(float)c_ru.ru_utime.tv_usec/1000000);\n    }\n\n    /* cmdtime */\n    if (allsections || !strcasecmp(section,\"commandstats\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info, \"# Commandstats\\r\\n\");\n        numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);\n        for (j = 0; j < numcommands; j++) {\n            struct redisCommand *c = redisCommandTable+j;\n\n            if (!c->calls) continue;\n            info = sdscatprintf(info,\n                \"cmdstat_%s:calls=%lld,usec=%lld,usec_per_call=%.2f\\r\\n\",\n                c->name, c->calls, c->microseconds,\n                (c->calls == 0) ? 0 : ((float)c->microseconds/c->calls));\n        }\n    }\n\n    /* Cluster */\n    if (allsections || defsections || !strcasecmp(section,\"cluster\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n        \"# Cluster\\r\\n\"\n        \"cluster_enabled:%d\\r\\n\",\n        server.cluster_enabled);\n    }\n\n    /* Key space */\n    if (allsections || defsections || !strcasecmp(section,\"keyspace\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info, \"# Keyspace\\r\\n\");\n        for (j = 0; j < server.dbnum; j++) {\n            long long keys, vkeys;\n\n            keys = dictSize(server.db[j].dict);\n            vkeys = dictSize(server.db[j].expires);\n            if (keys || vkeys) {\n                info = sdscatprintf(info, \"db%d:keys=%lld,expires=%lld\\r\\n\",\n                    j, keys, vkeys);\n            }\n        }\n    }\n    return info;\n}\n\nvoid infoCommand(redisClient *c) {\n    char *section = c->argc == 2 ? c->argv[1]->ptr : \"default\";\n\n    if (c->argc > 2) {\n        addReply(c,shared.syntaxerr);\n        return;\n    }\n    sds info = genRedisInfoString(section);\n    addReplySds(c,sdscatprintf(sdsempty(),\"$%lu\\r\\n\",\n        (unsigned long)sdslen(info)));\n    addReplySds(c,info);\n    addReply(c,shared.crlf);\n}\n\nvoid monitorCommand(redisClient *c) {\n    /* ignore MONITOR if aleady slave or in monitor mode */\n    if (c->flags & REDIS_SLAVE) return;\n\n    c->flags |= (REDIS_SLAVE|REDIS_MONITOR);\n    c->slaveseldb = 0;\n    listAddNodeTail(server.monitors,c);\n    addReply(c,shared.ok);\n}\n\n/* ============================ Maxmemory directive  ======================== */\n\n/* This function gets called when 'maxmemory' is set on the config file to limit\n * the max memory used by the server, before processing a command.\n *\n * The goal of the function is to free enough memory to keep Redis under the\n * configured memory limit.\n *\n * The function starts calculating how many bytes should be freed to keep\n * Redis under the limit, and enters a loop selecting the best keys to\n * evict accordingly to the configured policy.\n *\n * If all the bytes needed to return back under the limit were freed the\n * function returns REDIS_OK, otherwise REDIS_ERR is returned, and the caller\n * should block the execution of commands that will result in more memory\n * used by the server.\n */\nint freeMemoryIfNeeded(void) {\n    size_t mem_used, mem_tofree, mem_freed;\n    int slaves = listLength(server.slaves);\n\n    /* Remove the size of slaves output buffers and AOF buffer from the\n     * count of used memory. */\n    mem_used = zmalloc_used_memory();\n    if (slaves) {\n        listIter li;\n        listNode *ln;\n\n        listRewind(server.slaves,&li);\n        while((ln = listNext(&li))) {\n            redisClient *slave = listNodeValue(ln);\n            unsigned long obuf_bytes = getClientOutputBufferMemoryUsage(slave);\n            if (obuf_bytes > mem_used)\n                mem_used = 0;\n            else\n                mem_used -= obuf_bytes;\n        }\n    }\n    if (server.aof_state != REDIS_AOF_OFF) {\n        mem_used -= sdslen(server.aof_buf);\n        mem_used -= aofRewriteBufferSize();\n    }\n\n    /* Check if we are over the memory limit. */\n    if (mem_used <= server.maxmemory) return REDIS_OK;\n\n    if (server.maxmemory_policy == REDIS_MAXMEMORY_NO_EVICTION)\n        return REDIS_ERR; /* We need to free memory, but policy forbids. */\n\n    /* Compute how much memory we need to free. */\n    mem_tofree = mem_used - server.maxmemory;\n    mem_freed = 0;\n    while (mem_freed < mem_tofree) {\n        int j, k, keys_freed = 0;\n\n        for (j = 0; j < server.dbnum; j++) {\n            long bestval = 0; /* just to prevent warning */\n            sds bestkey = NULL;\n            struct dictEntry *de;\n            redisDb *db = server.db+j;\n            dict *dict;\n\n            if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||\n                server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM)\n            {\n                dict = server.db[j].dict;\n            } else {\n                dict = server.db[j].expires;\n            }\n            if (dictSize(dict) == 0) continue;\n\n            /* volatile-random and allkeys-random policy */\n            if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM ||\n                server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_RANDOM)\n            {\n                de = dictGetRandomKey(dict);\n                bestkey = dictGetKey(de);\n            }\n\n            /* volatile-lru and allkeys-lru policy */\n            else if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||\n                server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)\n            {\n                for (k = 0; k < server.maxmemory_samples; k++) {\n                    sds thiskey;\n                    long thisval;\n                    robj *o;\n\n                    de = dictGetRandomKey(dict);\n                    thiskey = dictGetKey(de);\n                    /* When policy is volatile-lru we need an additonal lookup\n                     * to locate the real key, as dict is set to db->expires. */\n                    if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)\n                        de = dictFind(db->dict, thiskey);\n                    o = dictGetVal(de);\n                    thisval = estimateObjectIdleTime(o);\n\n                    /* Higher idle time is better candidate for deletion */\n                    if (bestkey == NULL || thisval > bestval) {\n                        bestkey = thiskey;\n                        bestval = thisval;\n                    }\n                }\n            }\n\n            /* volatile-ttl */\n            else if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_TTL) {\n                for (k = 0; k < server.maxmemory_samples; k++) {\n                    sds thiskey;\n                    long thisval;\n\n                    de = dictGetRandomKey(dict);\n                    thiskey = dictGetKey(de);\n                    thisval = (long) dictGetVal(de);\n\n                    /* Expire sooner (minor expire unix timestamp) is better\n                     * candidate for deletion */\n                    if (bestkey == NULL || thisval < bestval) {\n                        bestkey = thiskey;\n                        bestval = thisval;\n                    }\n                }\n            }\n\n            /* Finally remove the selected key. */\n            if (bestkey) {\n                long long delta;\n\n                robj *keyobj = createStringObject(bestkey,sdslen(bestkey));\n                propagateExpire(db,keyobj);\n                /* We compute the amount of memory freed by dbDelete() alone.\n                 * It is possible that actually the memory needed to propagate\n                 * the DEL in AOF and replication link is greater than the one\n                 * we are freeing removing the key, but we can't account for\n                 * that otherwise we would never exit the loop.\n                 *\n                 * AOF and Output buffer memory will be freed eventually so\n                 * we only care about memory used by the key space. */\n                delta = (long long) zmalloc_used_memory();\n                dbDelete(db,keyobj);\n                delta -= (long long) zmalloc_used_memory();\n                mem_freed += delta;\n                server.stat_evictedkeys++;\n                decrRefCount(keyobj);\n                keys_freed++;\n\n                /* When the memory to free starts to be big enough, we may\n                 * start spending so much time here that is impossible to\n                 * deliver data to the slaves fast enough, so we force the\n                 * transmission here inside the loop. */\n                if (slaves) flushSlavesOutputBuffers();\n            }\n        }\n        if (!keys_freed) return REDIS_ERR; /* nothing to free... */\n    }\n    return REDIS_OK;\n}\n\n/* =================================== Main! ================================ */\n\n#ifdef __linux__\nint linuxOvercommitMemoryValue(void) {\n    FILE *fp = fopen(\"/proc/sys/vm/overcommit_memory\",\"r\");\n    char buf[64];\n\n    if (!fp) return -1;\n    if (fgets(buf,64,fp) == NULL) {\n        fclose(fp);\n        return -1;\n    }\n    fclose(fp);\n\n    return atoi(buf);\n}\n\nvoid linuxOvercommitMemoryWarning(void) {\n    if (linuxOvercommitMemoryValue() == 0) {\n        redisLog(REDIS_WARNING,\"WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.\");\n    }\n}\n#endif /* __linux__ */\n\nvoid createPidFile(void) {\n    /* Try to write the pid file in a best-effort way. */\n    FILE *fp = fopen(server.pidfile,\"w\");\n    if (fp) {\n        fprintf(fp,\"%d\\n\",(int)getpid());\n        fclose(fp);\n    }\n}\n\nvoid daemonize(void) {\n    int fd;\n\n    if (fork() != 0) exit(0); /* parent exits */\n    setsid(); /* create a new session */\n\n    /* Every output goes to /dev/null. If Redis is daemonized but\n     * the 'logfile' is set to 'stdout' in the configuration file\n     * it will not log at all. */\n    if ((fd = open(\"/dev/null\", O_RDWR, 0)) != -1) {\n        dup2(fd, STDIN_FILENO);\n        dup2(fd, STDOUT_FILENO);\n        dup2(fd, STDERR_FILENO);\n        if (fd > STDERR_FILENO) close(fd);\n    }\n}\n\nvoid version() {\n    printf(\"Redis server v=%s sha=%s:%d malloc=%s bits=%d\\n\",\n        REDIS_VERSION,\n        redisGitSHA1(),\n        atoi(redisGitDirty()) > 0,\n        ZMALLOC_LIB,\n        sizeof(long) == 4 ? 32 : 64);\n    exit(0);\n}\n\nvoid usage() {\n    fprintf(stderr,\"Usage: ./redis-server [/path/to/redis.conf] [options]\\n\");\n    fprintf(stderr,\"       ./redis-server - (read config from stdin)\\n\");\n    fprintf(stderr,\"       ./redis-server -v or --version\\n\");\n    fprintf(stderr,\"       ./redis-server -h or --help\\n\");\n    fprintf(stderr,\"       ./redis-server --test-memory <megabytes>\\n\\n\");\n    fprintf(stderr,\"Examples:\\n\");\n    fprintf(stderr,\"       ./redis-server (run the server with default conf)\\n\");\n    fprintf(stderr,\"       ./redis-server /etc/redis/6379.conf\\n\");\n    fprintf(stderr,\"       ./redis-server --port 7777\\n\");\n    fprintf(stderr,\"       ./redis-server --port 7777 --slaveof 127.0.0.1 8888\\n\");\n    fprintf(stderr,\"       ./redis-server /etc/myredis.conf --loglevel verbose\\n\");\n    exit(1);\n}\n\nvoid redisAsciiArt(void) {\n#include \"asciilogo.h\"\n    char *buf = zmalloc(1024*16);\n\n    snprintf(buf,1024*16,ascii_logo,\n        REDIS_VERSION,\n        redisGitSHA1(),\n        strtol(redisGitDirty(),NULL,10) > 0,\n        (sizeof(long) == 8) ? \"64\" : \"32\",\n        server.cluster_enabled ? \"cluster\" : \"stand alone\",\n        server.port,\n        (long) getpid()\n    );\n    redisLogRaw(REDIS_NOTICE|REDIS_LOG_RAW,buf);\n    zfree(buf);\n}\n\nstatic void sigtermHandler(int sig) {\n    REDIS_NOTUSED(sig);\n\n    redisLogFromHandler(REDIS_WARNING,\"Received SIGTERM, scheduling shutdown...\");\n    server.shutdown_asap = 1;\n}\n\nvoid setupSignalHandlers(void) {\n    struct sigaction act;\n\n    /* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used.\n     * Otherwise, sa_handler is used. */\n    sigemptyset(&act.sa_mask);\n    act.sa_flags = 0;\n    act.sa_handler = sigtermHandler;\n    sigaction(SIGTERM, &act, NULL);\n\n#ifdef HAVE_BACKTRACE\n    sigemptyset(&act.sa_mask);\n    act.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;\n    act.sa_sigaction = sigsegvHandler;\n    sigaction(SIGSEGV, &act, NULL);\n    sigaction(SIGBUS, &act, NULL);\n    sigaction(SIGFPE, &act, NULL);\n    sigaction(SIGILL, &act, NULL);\n#endif\n    return;\n}\n\nvoid memtest(size_t megabytes, int passes);\n\nint main(int argc, char **argv) {\n    long long start;\n    struct timeval tv;\n\n    /* We need to initialize our libraries, and the server configuration. */\n    zmalloc_enable_thread_safeness();\n    srand(time(NULL)^getpid());\n    gettimeofday(&tv,NULL);\n    dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());\n    initServerConfig();\n\n    if (argc >= 2) {\n        int j = 1; /* First option to parse in argv[] */\n        sds options = sdsempty();\n        char *configfile = NULL;\n\n        /* Handle special options --help and --version */\n        if (strcmp(argv[1], \"-v\") == 0 ||\n            strcmp(argv[1], \"--version\") == 0) version();\n        if (strcmp(argv[1], \"--help\") == 0 ||\n            strcmp(argv[1], \"-h\") == 0) usage();\n        if (strcmp(argv[1], \"--test-memory\") == 0) {\n            if (argc == 3) {\n                memtest(atoi(argv[2]),50);\n                exit(0);\n            } else {\n                fprintf(stderr,\"Please specify the amount of memory to test in megabytes.\\n\");\n                fprintf(stderr,\"Example: ./redis-server --test-memory 4096\\n\\n\");\n                exit(1);\n            }\n        }\n\n        /* First argument is the config file name? */\n        if (argv[j][0] != '-' || argv[j][1] != '-')\n            configfile = argv[j++];\n        /* All the other options are parsed and conceptually appended to the\n         * configuration file. For instance --port 6380 will generate the\n         * string \"port 6380\\n\" to be parsed after the actual file name\n         * is parsed, if any. */\n        while(j != argc) {\n            if (argv[j][0] == '-' && argv[j][1] == '-') {\n                /* Option name */\n                if (sdslen(options)) options = sdscat(options,\"\\n\");\n                options = sdscat(options,argv[j]+2);\n                options = sdscat(options,\" \");\n            } else {\n                /* Option argument */\n                options = sdscatrepr(options,argv[j],strlen(argv[j]));\n                options = sdscat(options,\" \");\n            }\n            j++;\n        }\n        resetServerSaveParams();\n        loadServerConfig(configfile,options);\n        sdsfree(options);\n    } else {\n        redisLog(REDIS_WARNING,\"Warning: no config file specified, using the default config. In order to specify a config file use 'redis-server /path/to/redis.conf'\");\n    }\n    if (server.daemonize) daemonize();\n    initServer();\n    if (server.daemonize) createPidFile();\n    redisAsciiArt();\n    redisLog(REDIS_WARNING,\"Server started, Redis version \" REDIS_VERSION);\n#ifdef __linux__\n    linuxOvercommitMemoryWarning();\n#endif\n    start = ustime();\n    if (server.aof_state == REDIS_AOF_ON) {\n        if (loadAppendOnlyFile(server.aof_filename) == REDIS_OK)\n            redisLog(REDIS_NOTICE,\"DB loaded from append only file: %.3f seconds\",(float)(ustime()-start)/1000000);\n    } else {\n        if (rdbLoad(server.rdb_filename) == REDIS_OK) {\n            redisLog(REDIS_NOTICE,\"DB loaded from disk: %.3f seconds\",\n                (float)(ustime()-start)/1000000);\n        } else if (errno != ENOENT) {\n            redisLog(REDIS_WARNING,\"Fatal error loading the DB. Exiting.\");\n            exit(1);\n        }\n    }\n    if (server.ipfd > 0)\n        redisLog(REDIS_NOTICE,\"The server is now ready to accept connections on port %d\", server.port);\n    if (server.sofd > 0)\n        redisLog(REDIS_NOTICE,\"The server is now ready to accept connections at %s\", server.unixsocket);\n    aeSetBeforeSleepProc(server.el,beforeSleep);\n    aeMain(server.el);\n    aeDeleteEventLoop(server.el);\n    return 0;\n}\n\n/* The End */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/rf_io.c",
    "content": "/**\n** Copyright (c) 2011-2012, Karapetsas Eleftherios\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n**  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n**  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in\n**     the documentation and/or other materials provided with the distribution.\n**  3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from\n**\n**  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n**  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n**  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n**  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n**  SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n**  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n**  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**/\n\n#include <rf_io.h>\n\n#include <rf_utils.h>\n#include <stdio.h>\n#include \"io_private.h\"\n#include <errno.h>\n#include <String/rfc_string.h> // for rfUTF8_IsContinuationbyte\n#include <stdlib.h>// for malloc\n#include <string.h>// for memcpy e.t.c.\n\n\n// Reads a UTF-8 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\nint32_t rfFReadLine_UTF8(FILE* f,char** utf8,uint32_t* byteLength,uint32_t* bufferSize,char* eof)\n{\n    int32_t bytesN;\n    uint32_t bIndex=0;\n#ifdef RF_NEWLINE_CRLF\n    char newLineFound = false;\n#endif\n    // allocate the utf8 buffer\n    *bufferSize = RF_OPTION_FGETS_READBYTESN+4;\n    RF_MALLOC(*utf8,*bufferSize)\n    *byteLength = 0;\n    // read the start\n    bytesN = rfFgets_UTF8(*utf8,RF_OPTION_FGETS_READBYTESN,f,eof);\n    (*byteLength)+=bytesN;\n\n    if(bytesN < 0)//error check\n    {\n        LOG_ERROR(\"Failed to read a UTF-8 file\",bytesN);\n        free(*utf8);\n        return bytesN;\n    }\n    // if the last character was a newline we are done\n    if(*((*utf8)+bytesN-1) == (char)RF_LF)\n    {\n#ifdef RF_NEWLINE_CRLF\n        if(*((*utf8)+bytesN-2) == (char)RF_CR)\n        {\n            *((*utf8)+bytesN-2) = RF_LF;\n            *((*utf8)+bytesN-1) = '\\0';\n            (*byteLength)-=1;\n        }\n#endif\n        return bytesN;\n    }\n\n    if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the end of file\n    {\n        // keep reading until we have read all until newline or EOF\n        while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)\n        {\n            if(*byteLength+RF_OPTION_FGETS_READBYTESN+4 >= *bufferSize)\n            {\n                *bufferSize=(*byteLength+RF_OPTION_FGETS_READBYTESN+4)*2;\n                RF_REALLOC(*utf8,char,*bufferSize);\n            }\n            bIndex += bytesN;\n            bytesN = rfFgets_UTF8((*utf8)+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof);\n            (*byteLength)+=bytesN;\n            if(bytesN < 0)// error check\n            {\n                LOG_ERROR(\"StringX Initialization from file failed in file reading\",bytesN);\n                free(*utf8);\n                return bytesN;\n            }\n            // if the last character was a newline break\n            if(*((*utf8)+bIndex+bytesN-1) == (char)RF_LF)\n            {\n#ifdef RF_NEWLINE_CRLF\n                newLineFound = true;\n#endif\n                break;\n            }\n        }// end of reading loop\n#ifdef RF_NEWLINE_CRLF\n        if(newLineFound==true)\n            if(*((*utf8)+bIndex+bytesN-2) == (char)RF_CR)\n            {\n                *((*utf8)+bIndex+bytesN-2) = RF_LF;\n                *((*utf8)+bIndex+bytesN-1) = '\\0';\n                (*byteLength)-=1;\n            }\n\n#endif\n        return bIndex;\n    }// end of size not fitting the initial buffer case\n    else\n    {\n#ifdef RF_NEWLINE_CRLF\n        // if the last character was a newline\n        if(*((*utf8)+bytesN-1) == (char)RF_LF)\n        {\n            if(*((*utf8)+bytesN-2) == (char)RF_CR)\n            {\n                *((*utf8)+bytesN-2) = RF_LF;\n                *((*utf8)+bytesN-1) = '\\0';\n                (*byteLength)-=1;\n            }\n        }\n#endif\n        // case of size fully fitting the buffer\n        return bytesN;\n    }\n}\n// Reads a Little Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\nint32_t rfFReadLine_UTF16LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof)\n{\n    char buff[RF_OPTION_FGETS_READBYTESN+5];\n    int32_t bytesN;\n    uint32_t *codepoints,charsN,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+5,accum;\n    char* tempBuff = 0,buffAllocated=false;\n\n    bytesN = rfFgets_UTF16LE(buff,RF_OPTION_FGETS_READBYTESN,f,eof);\n    accum = (uint32_t)bytesN;\n    tempBuff = &buff[0];// point the tempBuff to the initial buffer for now\n    if(bytesN < 0)// error check\n    {\n        LOG_ERROR(\"Failed to read from a Little Endian UTF-16 file\",bytesN);\n        return bytesN;\n    }\n    else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF\n    {\n        // allocate the temporary buffer and move the previous buffer's content inside it\n        buffSize=buffSize*2+5;\n        RF_MALLOC(tempBuff,buffSize);\n        memcpy(tempBuff,buff,bytesN);\n        bIndex=bytesN;\n        buffAllocated = true;\n        // keep reading until we have read all until newline or EOF\n        do\n        {\n            bytesN = rfFgets_UTF16LE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof);\n            accum += bytesN;\n            if(bytesN < 0)// error check\n            {\n                LOG_ERROR(\"Failed to read from a Little Endian UTF-16 file\",bytesN);\n                free(tempBuff);\n                return bytesN;\n            }\n            // realloc to have more space in the buffer for reading if needed\n            if(accum+RF_OPTION_FGETS_READBYTESN+5 >= buffSize)\n            {\n                buffSize=(accum+RF_OPTION_FGETS_READBYTESN+5)*2;\n                RF_REALLOC(tempBuff,char,buffSize);\n            }\n            bIndex += bytesN;\n            // if the last character was newline break off the loop\n            if( *(uint16_t*)(tempBuff+bIndex-2)== (uint16_t)RF_LF)\n                break;\n        }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);//end of reading loop\n    }// end of size not fitting the initial buffer case\n    if(bytesN >0)//determine the amount of bytes read\n        bIndex+=bytesN;\n    // allocate the codepoints\n    RF_MALLOC(codepoints,(bIndex+5)*2)\n    // decode it into codepoints\n    if(rfUTF16_Decode(tempBuff,&charsN,codepoints)==false)\n    {\n        free(codepoints);\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to Decode UTF-16 from a File Descriptor\",RE_UTF16_INVALID_SEQUENCE);\n        return RE_UTF16_INVALID_SEQUENCE;\n    }\n    // now encode these codepoints into UTF8\n    if(((*utf8)=rfUTF8_Encode(codepoints,charsN,byteLength)) == 0)\n    {\n        free(codepoints);\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to encode the File Descriptor's UTF-16 bytestream to UTF-8\",RE_UTF8_ENCODING);\n        return RE_UTF8_ENCODING;// error\n    }\n    // success\n    free(codepoints);\n    if(buffAllocated==true)\n        free(tempBuff);\n#ifdef RF_NEWLINE_CRLF\n    // if the last character was a newline\n    if(*((*utf8)+(*byteLength)-1) == (char)RF_LF)\n    {\n        if(*((*utf8)+(*byteLength)-2) == (char)RF_CR)\n        {\n            *((*utf8)+(*byteLength)-2) = RF_LF;\n            *((*utf8)+(*byteLength)-1) = '\\0';\n            (*byteLength)-=1;\n        }\n    }\n#endif\n\n\n    return bIndex;\n}\n// Reads a Big Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\nint32_t rfFReadLine_UTF16BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof)\n{\n    char buff[RF_OPTION_FGETS_READBYTESN+5];\n    int32_t bytesN;\n    uint32_t *codepoints,charsN,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+5,accum;\n    char* tempBuff = 0,buffAllocated=false;\n\n    bytesN = rfFgets_UTF16BE(buff,RF_OPTION_FGETS_READBYTESN,f,eof);\n    accum = (uint32_t)bytesN;\n    tempBuff = &buff[0];// point the tempBuff to the initial buffer for now\n    if(bytesN < 0)// error check\n    {\n        LOG_ERROR(\"Failed to read from a Big Endian UTF-16 file\",bytesN);\n        return bytesN;\n    }\n    else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF\n    {\n        // allocate the temporary buffer and move the previous buffer's content inside it\n        buffSize=buffSize*2+5;\n        RF_MALLOC(tempBuff,buffSize);\n        memcpy(tempBuff,buff,bytesN);\n        bIndex=bytesN;\n        buffAllocated = true;\n        // keep reading until we have read all until newline or EOF\n        do\n        {\n            bytesN = rfFgets_UTF16BE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof);\n            accum+=bytesN;\n            if(bytesN < 0)// error check\n            {\n                LOG_ERROR(\"Failed to read from a Big Endian UTF-16 file\",bytesN);\n                free(tempBuff);\n                return bytesN;\n            }\n            // realloc to have more space in the buffer for reading if needed\n            if(accum+RF_OPTION_FGETS_READBYTESN+5 >= buffSize)\n            {\n                buffSize=(accum+RF_OPTION_FGETS_READBYTESN+5)*2;\n                RF_REALLOC(tempBuff,char,buffSize);\n            }\n            bIndex += bytesN;\n            // if the last character was newline break off the loop\n            if( (*(uint16_t*)(tempBuff+bIndex-2))== (uint16_t)RF_LF)\n                break;\n        }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);// end of reading loop\n    }// end of size not fitting the initial buffer case\n    if(bytesN >0)// determine the amount of bytes read\n        bIndex+=bytesN;\n    // allocate the codepoints\n    RF_MALLOC(codepoints,(bIndex+5)*2)\n    // decode it into codepoints\n    if(rfUTF16_Decode(tempBuff,&charsN,codepoints)==false)\n    {\n        free(codepoints);\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to Decode UTF-16 from a File Descriptor\",RE_UTF16_INVALID_SEQUENCE);\n        return RE_UTF16_INVALID_SEQUENCE;\n    }\n    // now encode these codepoints into UTF8\n    if(((*utf8)=rfUTF8_Encode(codepoints,charsN,byteLength)) == 0)\n    {\n        free(codepoints);\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to encode the File Descriptor's UTF-16 bytestream to UTF-8\",RE_UTF8_ENCODING);\n        return RE_UTF8_ENCODING;//error\n    }\n    // success\n    free(codepoints);\n    if(buffAllocated==true)\n        free(tempBuff);\n#ifdef RF_NEWLINE_CRLF\n    // if the last character was a newline\n    if(*((*utf8)+(*byteLength)-1) == (char)RF_LF)\n    {\n        if(*((*utf8)+(*byteLength)-2) == (char)RF_CR)\n        {\n            *((*utf8)+(*byteLength)-2) = RF_LF;\n            *((*utf8)+(*byteLength)-1) = '\\0';\n            (*byteLength)-=1;\n        }\n    }\n#endif\n    return bIndex;\n}\n// Reads a Big Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\nint32_t rfFReadLine_UTF32BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof)\n{\n    char buff[RF_OPTION_FGETS_READBYTESN+7];\n    int32_t bytesN;\n    uint32_t *codepoints,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+7,accum;\n    char* tempBuff = 0,buffAllocated=false;\n    bytesN = rfFgets_UTF32BE(buff,RF_OPTION_FGETS_READBYTESN,f,eof);\n    accum = (uint32_t)bytesN;\n    tempBuff = &buff[0];// point the tempBuff to the initial buffer for now\n    if(bytesN < 0)// error check\n    {\n        LOG_ERROR(\"Failed to read from a Big Endian UTF-32 file\",bytesN);\n        return bytesN;\n    }\n    else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF\n    {\n        // allocate the temporary buffer and move the previous buffer's content inside it\n        buffSize=buffSize*2+7;\n        RF_MALLOC(tempBuff,buffSize);\n        memcpy(tempBuff,buff,bytesN);\n        bIndex=bytesN;\n        buffAllocated = true;\n        // keep reading until we have read all until newline or EOF\n        do\n        {\n            bytesN = rfFgets_UTF32BE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof);\n            accum+=bytesN;\n            if(bytesN < 0)// error check\n            {\n                LOG_ERROR(\"Failed to read from a Big Endian UTF-16 file\",bytesN);\n                free(tempBuff);\n                return bytesN;\n            }\n            // realloc to have more space in the buffer for reading if needed\n            if(accum+RF_OPTION_FGETS_READBYTESN+7 >= buffSize)\n            {\n                buffSize=(accum+RF_OPTION_FGETS_READBYTESN+7)*2;\n                RF_REALLOC(tempBuff,char,buffSize);\n            }\n            bIndex += bytesN;\n            // if the last character was newline break off the loop\n            if( (*(uint32_t*)(tempBuff+bIndex-4))== (uint32_t)RF_LF)\n                break;\n        }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);// end of reading loop\n    }// end of size not fitting the initial buffer case\n    if(bytesN >0)//determine the amount of bytes read\n        bIndex+=bytesN;\n    // utf-32 is actually codepoints\n    codepoints = (uint32_t*)tempBuff;\n    // now encode these codepoints into UTF8\n    if(((*utf8)=rfUTF8_Encode(codepoints,bIndex/4,byteLength)) == 0)\n    {\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to encode the File Descriptor's UTF-32 bytestream to UTF-8\",RE_UTF8_ENCODING);\n        return RE_UTF8_ENCODING;// error\n    }\n    // success\n    if(buffAllocated==true)\n        free(tempBuff);\n#ifdef RF_NEWLINE_CRLF\n    // if the last character was a newline\n    if(*((*utf8)+(*byteLength)-1) == (char)RF_LF)\n    {\n        if(*((*utf8)+(*byteLength)-2) == (char)RF_CR)\n        {\n            *((*utf8)+(*byteLength)-2) = RF_LF;\n            *((*utf8)+(*byteLength)-1) = '\\0';\n            (*byteLength)-=1;\n        }\n    }\n#endif\n    return bIndex;\n}\n// Reads a Little Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\nint32_t rfFReadLine_UTF32LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof)\n{\n    char buff[RF_OPTION_FGETS_READBYTESN+7];\n    int32_t bytesN;\n    uint32_t *codepoints,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+7,accum;\n    char* tempBuff = 0,buffAllocated=false;\n    bytesN = rfFgets_UTF32LE(buff,RF_OPTION_FGETS_READBYTESN,f,eof);\n    accum = (uint32_t) bytesN;\n    tempBuff = &buff[0];// point the tempBuff to the initial buffer for now\n    if(bytesN < 0)// error check\n    {\n        LOG_ERROR(\"Failed to read from a Little Endian UTF-32 file\",bytesN);\n        return bytesN;\n    }\n    else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF\n    {\n        // allocate the temporary buffer and move the previous buffer's content inside it\n        buffSize=buffSize*2+7;\n        RF_MALLOC(tempBuff,buffSize);\n        memcpy(tempBuff,buff,bytesN);\n        bIndex=bytesN;\n        buffAllocated = true;\n        // keep reading until we have read all until newline or EOF\n        do\n        {\n            bytesN = rfFgets_UTF32LE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof);\n            accum +=bytesN;\n            if(bytesN < 0)// error check\n            {\n                LOG_ERROR(\"Failed to read from a Little Endian UTF-16 file\",bytesN);\n                free(tempBuff);\n                return bytesN;\n            }\n            // realloc to have more space in the buffer for reading if needed\n            if(accum+RF_OPTION_FGETS_READBYTESN+7 >= buffSize)\n            {\n                buffSize=(accum+RF_OPTION_FGETS_READBYTESN+7)*2;\n                RF_REALLOC(tempBuff,char,buffSize);\n            }\n            bIndex += bytesN;\n            // if the last character was newline break off the loop\n            if( (*(uint32_t*)(tempBuff+bIndex-4))== (uint32_t)RF_LF)\n                break;\n        }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);// end of reading loop\n    }// end of size not fitting the initial buffer case\n    if(bytesN >0)// determine the amount of bytes read\n        bIndex+=bytesN;\n    // utf-32 is actually codepoints\n    codepoints = (uint32_t*)tempBuff;\n    // now encode these codepoints into UTF8\n    if(((*utf8)=rfUTF8_Encode(codepoints,bIndex/4,byteLength)) == 0)\n    {\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to encode the File Descriptor's UTF-32 bytestream to UTF-8\",RE_UTF8_ENCODING);\n        return RE_UTF8_ENCODING;// error\n    }\n    // success\n    if(buffAllocated==true)\n        free(tempBuff);\n#ifdef RF_NEWLINE_CRLF\n    // if the last character was a newline\n    if(*((*utf8)+(*byteLength)-1) == (char)RF_LF)\n    {\n        if(*((*utf8)+(*byteLength)-2) == (char)RF_CR)\n        {\n            *((*utf8)+(*byteLength)-2) = RF_LF;\n            *((*utf8)+(*byteLength)-1) = '\\0';\n            (*byteLength)-=1;\n        }\n    }\n#endif\n    return bIndex;\n}\n\n// This is a function that's similar to c library fgets but it also returns the number of bytes read and works for UTF-32 encoded files\nint32_t rfFgets_UTF32BE(char* buff,uint32_t num,FILE* f,char* eofReached)\n{\n    uint32_t size,c;\n    int32_t error;\n    // initialization\n    *eofReached = false;\n    size = 0;\n    // if end of file or end of line is not found, keep reading\n    do{\n        if((error=rfFgetc_UTF32BE(f,(uint32_t*)(buff+size))) != RF_SUCCESS)\n        {\n            if(error == RE_FILE_EOF)\n            {\n                break;// EOF found\n                *eofReached = true;\n            }\n            LOG_ERROR(\"Reading error while reading from a Big Endian UTF-32 file\",error);\n            return error;\n        }\n        size+= 4;\n        // if we have read the number of characters requested by the function\n        if(size >= num)\n        {\n            break;\n        }\n        // get the last character read\n        c = *(uint32_t*)(buff+size-4);\n    }while(c != (uint32_t)EOF && !RF_HEXEQ_UI(c,RF_LF));\n    // null terminate the buffer for UTF32\n    buff[size] =  buff[size+1] = buff[size+2] = buff[size+3] = '\\0';\n    // finally check yet again for end of file right after the new line\n    if((error=rfFgetc_UTF32BE(f,&c))!=RF_SUCCESS)\n    {\n        if(error == RE_FILE_EOF)\n        {// EOF\n            *eofReached = true;\n        }\n        else\n        {\n            LOG_ERROR(\"Reading error while reading from a Big Endian UTF-32 file\",error);\n            return error;\n        }\n    }\n    else// undo the peek ahead of the file pointer\n        fseek(f,-4,SEEK_CUR);\n    return size;\n}\n// This is a function that's similar to c library fgets but it also returns the number of bytes read and works for UTF-32 encoded files\nint32_t rfFgets_UTF32LE(char* buff,uint32_t num,FILE* f,char* eofReached)\n{\n    uint32_t size,c;\n    int32_t error;\n    // initialization\n    *eofReached = false;\n    size = 0;\n    // if end of file or end of line is not found, keep reading\n    do{\n        if((error=rfFgetc_UTF32LE(f,(uint32_t*)(buff+size))) != RF_SUCCESS)\n        {\n            if(error == RE_FILE_EOF)\n            {\n                break;// EOF found\n                *eofReached = true;\n            }\n            LOG_ERROR(\"Reading error while reading from a Little Endian UTF-32 file\",error);\n            return error;\n        }\n        size+= 4;\n        // if we have read the number of characters requested by the function\n        if(size >= num)\n        {\n            break;\n        }\n        // get the last character read\n        c = *(uint32_t*)(buff+size-4);\n    }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF));\n    // null terminate the buffer for UTF32\n    buff[size] =  buff[size+1] = buff[size+2] = buff[size+3] = '\\0';\n    // finally check yet again for end of file right after the new line\n    if((error=rfFgetc_UTF32LE(f,&c))!=RF_SUCCESS)\n    {\n        if(error == RE_FILE_EOF)\n        {// EOF\n            *eofReached = true;\n        }\n        else\n        {\n            LOG_ERROR(\"Reading error while reading from a Little Endian UTF-32 file\",error);\n            return error;\n        }\n    }\n    else// undo the peek ahead of the file pointer\n        fseek(f,-4,SEEK_CUR);\n    return size;\n}\n// Gets a number of bytes from a BIG endian UTF-16 file descriptor\nint32_t rfFgets_UTF16BE(char* buff,uint32_t num,FILE* f,char* eofReached)\n{\n    uint32_t size,c;\n    int32_t bytesN;\n    // initialization\n    *eofReached = false;\n    size = 0;\n    // if end of file or end of line is not found, keep reading\n    do{\n        bytesN = rfFgetc_UTF16BE(f,(uint32_t*)(buff+size),false);\n        // error check\n        if(bytesN < 0)\n        {\n            if(bytesN == RE_FILE_EOF)\n            {\n                break;// EOF found\n                *eofReached = true;\n            }\n            else\n                return bytesN;\n        }\n        size+= bytesN;\n        // if we have read the number of characters requested by the function\n        if(size >= num)\n        {\n            break;\n        }\n        // get the last character read\n        c = *(uint32_t*)(buff+size-bytesN);\n    }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF));\n    // null terminate the buffer for UTF16\n    buff[size] =  buff[size+1] = '\\0';\n    // finally check yet again for end of file right after the new line\n    bytesN = rfFgetc_UTF16BE(f,&c,false);\n    if(bytesN < 0)\n    {\n        if(bytesN == RE_FILE_EOF)\n        {// EOF\n            *eofReached = true;\n        }\n        else// error\n            return bytesN;\n    }\n    else// undo the peek ahead of the file pointer\n        fseek(f,-bytesN,SEEK_CUR);\n    return size;\n}\n// Gets a number of bytes from a Little endian UTF-16 file descriptor\nint32_t rfFgets_UTF16LE(char* buff,uint32_t num,FILE* f,char* eofReached)\n{\n    uint32_t size,c;\n    int32_t bytesN;\n    // initialization\n    *eofReached = false;\n    size = 0;\n    // if end of file or end of line is not found, keep reading\n    do{\n        bytesN = rfFgetc_UTF16LE(f,(uint32_t*)(buff+size),false);\n        // error check\n        if(bytesN < 0)\n        {\n            if(bytesN == RE_FILE_EOF)\n            {\n                break;// EOF found\n                *eofReached = true;\n            }\n            else\n                return bytesN;\n        }\n        size+= bytesN;\n        // if we have read the number of characters requested by the function\n        if(size >= num)\n        {\n            break;\n        }\n        // get the last character read\n        c = *(uint32_t*)(buff+size-bytesN);\n    }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF));\n    // null terminate the buffer for UTF16\n    buff[size] =  buff[size+1] = '\\0';\n    // finally check yet again for end of file right after the new line\n    bytesN = rfFgetc_UTF16LE(f,&c,false);\n    if(bytesN < 0)\n    {\n        if(bytesN == RE_FILE_EOF)\n        {// EOF\n            *eofReached = true;\n        }\n        else// error\n            return bytesN;\n    }\n    else// undo the peek ahead of the file pointer\n        fseek(f,-bytesN,SEEK_CUR);\n\n    return size;\n}\n\n// Gets a number of bytes from a UTF-8 file descriptor\nint32_t rfFgets_UTF8(char* buff,uint32_t num,FILE* f,char* eofReached)\n{\n    uint32_t size,c;\n    int32_t bytesN;\n    // initialization\n    *eofReached = false;\n    size = 0;\n    // if end of file or end of line is not found, keep reading\n    do{\n        bytesN = rfFgetc_UTF8(f,(uint32_t*)(buff+size),false);\n        // error check\n        if(bytesN < 0)\n        {\n            if(bytesN == RE_FILE_EOF)\n            {\n                break;// EOF found\n                *eofReached = true;\n            }\n            else\n                return bytesN;\n        }\n        size+= bytesN;\n        // if we have read the number of characters requested by the function\n        if(size >= num)\n        {\n            break;\n        }\n        // get the last character\n        c = *(uint32_t*)(buff+size-bytesN);\n    }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF));\n    // null terminate the buffer for UTF8\n    buff[size] = '\\0';\n    // finally check yet again for end of file right after the new line\n    if( RF_HEXEQ_C(fgetc(f),EOF))\n    {// check for error\n        if(ferror(f) != 0)\n        {\n            LOG_ERROR(\"During reading a UTF-8 file there was a read error\",RE_FILE_READ);\n            return RE_FILE_READ;\n        }\n        // if not it's end of file, so note it and take the pointer back by 1\n        *eofReached = true;\n    }// undo the peek ahead of the file pointer\n    else\n        fseek(f,-1,SEEK_CUR);\n    return size;\n}\n// Gets a unicode character from a UTF-8 file descriptor\nint32_t rfFgetc_UTF8(FILE* f,uint32_t *ret,char cp)\n{\n    char c,c2,c3,c4;\n    if( (c = fgetc(f)) == EOF)\n    {\n        i_READ_CHECK(f,\"While reading a UTF-8 character from the stream\")\n        else\n            return RE_FILE_EOF;\n    }\n     // if the lead bit of the byte is 0 then range is : U+0000 to U+0007F (1 byte)\n     if( ((c & 0x80)>>7) == 0 )\n     {\n        /// success\n        if(cp == true)\n            *ret = c;\n        else\n        {\n            *ret = 0;\n            char* cc = (char*) ret;\n            cc[0] = c;\n        }\n        return 1;\n     }\n     else// we need more bytes\n     {\n        // if the leading bits are in the form of 0b110xxxxx then range is: U+0080 to U+07FF (2 bytes)\n        if( RF_HEXEQ_C( ( (~(c ^  0xC0))>>5), 0x7) )\n        {\n            // also remember bytes 0xC0 and 0xC1 are invalid and could possibly be found in a starting byte of this type so check for them here\n            if( RF_HEXEQ_C(c,0xC0) || RF_HEXEQ_C(c,0xC1))\n            {\n                LOG_ERROR(\"While decoding a UTF-8 file byte stream, an invalid byte was encountered\",RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE);\n                return RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE;\n            }\n            // so now read the next byte\n            if( (c2 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            // if this second byte is NOT a continuation byte\n            if( !rfUTF8_IsContinuationByte(c2))\n            {\n                LOG_ERROR(\"While decoding a UTF-8 file byte stream, and expecting a continuation byte, one was not found\",RE_UTF8_INVALID_SEQUENCE_CONBYTE);\n                return RE_UTF8_INVALID_SEQUENCE_CONBYTE;\n            }\n            /// success\n            if(cp == true)// return decoded codepoint\n            {\n                *ret = 0;\n                // from the second byte take the first 6 bits\n                *ret = (c2 & 0x3F) ;\n                // from the first byte take the first 5 bits and put them in the start\n                *ret |= ((c & 0x1F) << 6);\n            }\n            else\n            {\n                *ret = 0;\n                char* cc = (char*)ret;\n                cc[0] = c; cc[1] = c2;\n            }\n            return 2;\n\n        }// end of the 2 bytes case\n        // if the leading bits are in the form of 0b1110xxxx then range is U+0800 to U+FFFF  (3 bytes)\n        else if( RF_HEXEQ_C( ( (~(c ^ 0xE0))>>4),0xF))\n        {\n            // so now read the next 2 bytes\n            if( (c2 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            if( (c3 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            // if the subsequent bytes are NOT  continuation bytes\n            if( !rfUTF8_IsContinuationByte(c2) || !rfUTF8_IsContinuationByte(c3))\n            {\n                LOG_ERROR(\"While decoding a UTF-8 file byte stream, and expecting a continuation byte, one was not found\",RE_UTF8_INVALID_SEQUENCE_CONBYTE);\n                return RE_UTF8_INVALID_SEQUENCE_CONBYTE;\n            }\n            /// success\n            if(cp == true)// if we need to decode the codepoint\n            {\n                *ret = 0;\n                // from the third byte take the first 6 bits\n                *ret = (c3 & 0x3F) ;\n                // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n                *ret |= ((c2 & 0x3F) << 6);\n                // from the first byte take the first 4 bits and put them to the left of the previous 6 bits\n                *ret |= ((c & 0xF) << 12);\n            }\n            else\n            {\n                *ret = 0;\n                char* cc = (char*)ret;\n                cc[0] = c; cc[1] = c2; cc[2] = c3;\n            }\n            return 3;\n        }// end of 3 bytes case\n        // if the leading bits are in the form of 0b11110xxx then range is U+010000 to U+10FFFF (4 bytes)\n        else if(RF_HEXEQ_C( ( (~(c ^ 0xF0))>>3), 0x1F))\n        {\n            // in this type of starting byte a number of invalid bytes can be encountered. We have to check for them.\n            if(RF_HEXGE_C(c,0xBF)) //invalid byte value are from 0xBF to 0xFF\n            {\n                LOG_ERROR(\"While decoding a UTF-8 file byte stream, an invalid byte was encountered\",RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE);\n                return RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE;\n            }\n            // so now read the next 3 bytes\n            if( (c2 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            if( (c3 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            if( (c4 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            // if the subsequent bytes are NOT  continuation bytes\n            if( !rfUTF8_IsContinuationByte(c2) || !rfUTF8_IsContinuationByte(c3) || !rfUTF8_IsContinuationByte(c4))\n            {\n                LOG_ERROR(\"While decoding a UTF-8 file byte stream, and expecting a continuation byte, one was not found\",RE_UTF8_INVALID_SEQUENCE_CONBYTE);\n                return RE_UTF8_INVALID_SEQUENCE_CONBYTE;\n            }\n            /// success\n            if(cp == true) //if we need to decode the codepoint\n            {\n                *ret = 0;\n                // from the fourth byte take the first 6 bits\n                *ret = (c4 & 0x3F) ;\n                // from the third byte take the first 6 bits and put them to the left of the previous 6 bits\n                *ret |= ((c3 & 0x3F) << 6);\n                // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n                *ret |= ((c2 & 0x3F) << 12);\n                // from the first byte take the first 3 bits and put them to the left of the previous 6 bits\n                *ret |= ((c & 0x7) << 18);\n            }\n            else\n            {\n                *ret = 0;\n                char* cc = (char*)ret;\n                cc[0] = c; cc[1] = c2; cc[2] = c3; cc[3]=c4;\n            }\n            return 4;\n        }// end of 4 bytes case\n     }// end of needing more than 1 byte\n\n    // if we get here means the 1st byte belonged to none of the 4 cases\n    LOG_ERROR(\"While decoding a UTF-8 file byte stream, the first byte of a character was invalid UTF-8\",RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE);\n    return RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE;\n}\n\n// Gets a unicode character from a Big Endian UTF-16 file descriptor\nint32_t rfFgetc_UTF16BE(FILE* f,uint32_t *c,char cp)\n{\n    char swapE=false;\n    uint16_t v1,v2;\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n            swapE = true;\n    // read the first 2 bytes\n    if(fread(&v1,2,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"While reading a UTF-16 from a Big Endian File stream\")\n        else\n            return RE_FILE_EOF;\n    }\n    if(swapE)// swap endianess if needed\n        rfUTILS_SwapEndianUS(&v1);\n    /* If the value is in the surrogate area */\n    if(RF_HEXGE_US(v1,0xD800) && RF_HEXLE_US(v1,0xDFFF))\n    {\n        if(RF_HEXL_US(v1,0xD800) || RF_HEXG_US(v1,0xDBFF))\n        {\n            LOG_ERROR(\"While reading a Big endian UTF-16 file stream the first byte encountered held an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        // then we also need to read its surrogate pair\n        if(fread(&v2,2,1,f) != 1)\n        {\n            i_READ_CHECK(f,\"While reading a UTF-16 from a Big Endian File stream\")\n            else\n            {\n                LOG_ERROR(\"While decoding a UTF-16 Big Endian file byte stream, EOF was encountered abruplty when expecting a surrogate pair\",RE_UTF16_NO_SURRPAIR);\n                return RE_FILE_EOF;\n            }\n        }\n        if(swapE)// swap endianess if needed\n            rfUTILS_SwapEndianUS(&v2);\n        if(RF_HEXL_US(v2,0xDC00) || RF_HEXG_US(v2,0xDFFF))\n        {\n            LOG_ERROR(\"While reading a Big endian UTF-16 file stream the surrogate pair encountered held an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        if(cp == true)// if the user wants the decoded codepoint\n        {\n            *c = 0;\n            *c = v2&0x3ff;\n            *c |= (10<<v1&0x3ff);\n            *c += 0x10000;\n            return 4;\n        }// else\n        *c = 0;\n        uint16_t* cc = (uint16_t*)c;\n        cc[0] = v1; cc[1] = v2;\n        return 4;\n    }// end of surrogate pair existence case\n    // else no surrogate pair exists so v1 is all we need\n    *c = v1;\n    return 2;\n}\n// Gets a unicode character from a Little Endian UTF-16 file descriptor\nint32_t rfFgetc_UTF16LE(FILE* f,uint32_t *c,char cp)\n{\n    char swapE=false;\n    uint16_t v1,v2;\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_BIG_ENDIAN)\n            swapE = true;\n    // read the first 2 bytes\n    if(fread(&v1,2,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"While reading a UTF-16 from a Little Endian File stream\")\n        else\n            return RE_FILE_EOF;\n    }\n    if(swapE)// swap endianess if needed\n        rfUTILS_SwapEndianUS(&v1);\n    /* If the value is in the surrogate area */\n    if(RF_HEXGE_US(v1,0xD800) && RF_HEXLE_US(v1,0xDFFF))\n    {\n        if(RF_HEXL_US(v1,0xD800) || RF_HEXG_US(v1,0xDBFF))\n        {\n            LOG_ERROR(\"While reading a little endian UTF-16 file stream the first byte encountered held an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        // then we also need to read its surrogate pair\n        if(fread(&v2,2,1,f) != 1)\n        {\n            i_READ_CHECK(f,\"While reading a UTF-16 from a Little Endian File stream\")\n            else\n            {\n                LOG_ERROR(\"While decoding a UTF-16 Little Endian file byte stream, EOF was encountered abruplty when expecting a surrogate pair\",RE_UTF16_NO_SURRPAIR);\n                return RE_FILE_EOF;\n            }\n        }\n        if(swapE)// swap endianess if needed\n            rfUTILS_SwapEndianUS(&v2);\n        if(RF_HEXL_US(v2,0xDC00) || RF_HEXG_US(v2,0xDFFF))\n        {\n            LOG_ERROR(\"While reading a little endian UTF-16 file stream the surrogate pair encountered held an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        if(cp == true)// if the user wants the decoded codepoint\n        {\n            *c = 0;\n            *c = v2&0x3ff;\n            *c |= (10<<v1&0x3ff);\n            *c += 0x10000;\n            return 4;\n        }// else\n        *c = 0;\n        uint16_t* cc = (uint16_t*)c;\n        cc[0] = v1; cc[1] = v2;\n        return 4;\n    }// end of surrogate pair existence case\n    // else no surrogate pair exists so v1 is all we need\n    *c = v1;\n    return 2;\n}\n// Gets a unicode character from a UTF-32 Little Endian file descriptor\nint32_t rfFgetc_UTF32LE(FILE* f,uint32_t *c)\n{\n    // read the next 4 bytes\n    if(fread(c,4,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"While reading a UTF-32 character from a Little Endian File stream\")\n        else\n            return RE_FILE_EOF;\n    }\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_BIG_ENDIAN)\n            rfUTILS_SwapEndianUI(c);\n    return RF_SUCCESS;\n}\n// Gets a unicode character from a UTF-32 Little Endian file descriptor\nint32_t rfFgetc_UTF32BE(FILE* f,uint32_t *c)\n{\n    // read the next 4 bytes\n    if(fread(c,4,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"While reading a UTF-32 character from a Big Endian File stream\")\n        else\n            return RE_FILE_EOF;\n    }\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n            rfUTILS_SwapEndianUI(c);\n    return RF_SUCCESS;\n}\n\n// Moves a unicode character backwards in a big endian UTF-32 file stream\nint32_t rfFback_UTF32BE(FILE* f,uint32_t *c)\n{\n    // go back and read the last 4 bytes\n    if(fseek(f,-4,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-32 file stream\")\n    }\n    if(fread(c,4,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"Reading four bytes backwards in a Big Endian UTF-32 file stream\")\n    }\n    if(fseek(f,-4,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-32 file stream\")\n    }\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n            rfUTILS_SwapEndianUI(c);\n    return RF_SUCCESS;\n}\n// Moves a unicode character backwards in a little endian UTF-32 file stream\nint32_t rfFback_UTF32LE(FILE* f,uint32_t *c)\n{\n    // go back and read the last 4 bytes\n    if(fseek(f,-4,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-32 file stream\")\n    }\n    if(fread(c,4,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"Reading four bytes backwards in a Big Endian UTF-32 file stream\")\n    }\n    if(fseek(f,-4,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-32 file stream\")\n    }\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_BIG_ENDIAN)\n            rfUTILS_SwapEndianUI(c);\n    return RF_SUCCESS;\n}\n// Moves a unicode character backwards in a big endian UTF-16 file stream\nint32_t rfFback_UTF16BE(FILE* f,uint32_t *c)\n{\n    char swapE=false;\n    uint16_t v1,v2;\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n            swapE = true;\n    // go back and read the last 2 bytes\n    if(fseek(f,-2,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n    }\n    if(fread(&v1,2,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"Reading two bytes backwards in a Big Endian UTF-16 file stream\")\n    }\n    if(fseek(f,-2,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n    }\n    if(swapE)// swap endianess if needed\n        rfUTILS_SwapEndianUS(&v1);\n    /* If the word is a surrogate pair */\n    if(RF_HEXGE_US(v1,0xDC00) && RF_HEXLE_US(v1,0xDFFF))\n    {\n        // go back and read 2 more bytes\n        if(fseek(f,-2,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n        }\n        if(fread(&v2,2,1,f) != 1)\n        {\n            i_READ_CHECK(f,\"Reading two bytes backwards in a Big Endian UTF-16 file stream\")\n        }\n        if(fseek(f,-2,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n        }\n        if(swapE)// swap endianess if needed\n            rfUTILS_SwapEndianUS(&v2);\n        if(RF_HEXL_US(v2,0xD800) || RF_HEXG_US(v2,0xDBFF))\n        {\n            LOG_ERROR(\"While reading bytes backwards in a Big Endian UTF-16 file stream the encountered byte was supposed to be a surrogate pair but its pair is of illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        // get the codepoint\n        *c = 0;\n        *c = v1&0x3ff;\n        *c |= (10<<v2&0x3ff);\n        *c += 0x10000;\n        return 4;\n    }// end of surrogate pair case\n    // getting here means this word is what we seek. Let's confirm\n    if(RF_HEXL_US(v1,0xD800) || RF_HEXG_US(v1,0xDFFF))\n    {\n        // get the codepoint\n         *c = 0;\n        uint16_t* cc = (uint16_t*) c;\n        cc[0] = v1;\n        return 2;\n    }\n    // else invald sequence\n    LOG_ERROR(\"While reading bytes backwards in a Big Endian UTF-16 file stream the encountered byte had an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n    return RE_UTF16_INVALID_SEQUENCE;\n}\n\n// Moves a unicode character backwards in a little endian UTF-16 file stream\nint32_t rfFback_UTF16LE(FILE* f,uint32_t *c)\n{\n    char swapE=false;\n    uint16_t v1,v2;\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_BIG_ENDIAN)\n            swapE = true;\n    // go back and read the last 2 bytes\n    if(fseek(f,-2,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Little Endian UTF-16 file stream\")\n    }\n    if(fread(&v1,2,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"Reading two bytes backwards in a Little Endian UTF-16 file stream\")\n    }\n    if(fseek(f,-2,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n    }\n    if(swapE)// swap endianess if needed\n        rfUTILS_SwapEndianUS(&v1);\n    /* If the word is a surrogate pair */\n    if(RF_HEXGE_US(v1,0xDC00) && RF_HEXLE_US(v1,0xDFFF))\n    {\n        // go back and read 2 more bytes\n        if(fseek(f,-2,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a Little Endian UTF-16 file stream\")\n        }\n        if(fread(&v2,2,1,f) != 1)\n        {\n            i_READ_CHECK(f,\"Reading two bytes backwards in a Little Endian UTF-16 file stream\")\n        }\n        if(fseek(f,-2,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n        }\n        if(swapE)// swap endianess if needed\n            rfUTILS_SwapEndianUS(&v2);\n        if(RF_HEXL_US(v2,0xD800) || RF_HEXG_US(v2,0xDBFF))\n        {\n            LOG_ERROR(\"While reading bytes backwards in a Little Endian UTF-16 file stream the encountered byte was supposed to be a surrogate pair but its pair is of illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        // get the codepoint\n        *c = 0;\n        *c = v1&0x3ff;\n        *c |= (10<<v2&0x3ff);\n        *c += 0x10000;\n        return 4;\n    }// end of surrogate pair case\n    // getting here means this word is what we seek. Let's confirm\n    if(RF_HEXL_US(v1,0xD800) || RF_HEXG_US(v1,0xDFFF))\n    {\n        // get the codepoint\n         *c = 0;\n        uint16_t* cc = (uint16_t*) c;\n        cc[0] = v1;\n        return 2;\n    }\n    // else invald sequence\n    LOG_ERROR(\"While reading bytes backwards in a Little Endian UTF-16 file stream the encountered byte had an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n    return RE_UTF16_INVALID_SEQUENCE;\n}\n\n// Moves a unicode character backwards in a UTF-8 file stream\nint32_t rfFback_UTF8(FILE* f,uint32_t *c)\n{\n    // read one byte before the current\n    int i = 0;\n    char bytes[4];\n    do\n    {\n        if(fseek(f,-1,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a UTF-8 file\")\n        }\n        if((bytes[i] = fgetc(f)) == EOF)\n        {\n            i_READ_CHECK(f,\"Reading a byte backwards in a UTF-8 file\")\n        }\n        if(fseek(f,-1,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a UTF-8 file\")\n        }\n        i++;\n    }while(rfUTF8_IsContinuationByte(bytes[i-1]));\n    switch(i)// depending on the number of bytes read backwards\n    {\n        case 4:\n            *c = 0;\n            // from the fourth byte take the first 6 bits\n            *c = (bytes[0] & 0x3F) ;\n            // from the third byte take the first 6 bits and put them to the left of the previous 6 bits\n            *c |= ((bytes[1] & 0x3F) << 6);\n            // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n            *c |= ((bytes[2] & 0x3F) << 12);\n            // from the first byte take the first 3 bits and put them to the left of the previous 6 bits\n            *c |= ((bytes[3] & 0x7) << 18);\n        break;\n        case 3:\n            *c = 0;\n            // from the third byte take the first 6 bits\n            *c = (bytes[0] & 0x3F) ;\n            // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n            *c |= ((bytes[1] & 0x3F) << 6);\n            // from the first byte take the first 4 bits and put them to the left of the previous 6 bits\n            *c |= ((bytes[2] & 0xF) << 12);\n        break;\n        case 2:\n            *c = 0;\n            // from the second byte take the first 6 bits\n            *c = (bytes[0] & 0x3F) ;\n            // from the first byte take the first 5 bits and put them in the start\n            *c |= ((bytes[1] & 0x1F) << 6);\n        break;\n        case 1:\n            *c = bytes[0];\n        break;\n        default:\n            LOG_ERROR(\"During moving one unicode character back in a UTF-8 filestream moved an abnormal number of bytes\",RE_UTF8_INVALID_SEQUENCE);\n            return RE_UTF8_INVALID_SEQUENCE;\n        break;\n    }\n    return i;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/rf_io.h",
    "content": "/**\n** Copyright (c) 2011-2012, Karapetsas Eleftherios\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n**  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n**  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in\n**     the documentation and/or other materials provided with the distribution.\n**  3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from\n**\n**  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n**  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n**  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n**  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n**  SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n**  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n**  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**/\n\n\n#ifndef REFU_IO_H\n#define REFU_IO_H\n\n#include <rf_setup.h>\n#include <stdio.h>\n\n#ifdef __cplusplus\nextern \"C\"\n{// opening bracket for calling from C++\n#endif\n\n// New line feed\n#define RF_LF   0xA\n// Carriage Return\n#define RF_CR   0xD\n\n#ifdef REFU_WIN32_VERSION\n    #define i_PLUSB_WIN32   \"b\"\n#else\n    #define i_PLUSB_WIN32   \"\"\n#endif\n\n// This is the type that represents the file offset\n#ifdef _MSC_VER\ntypedef __int64 foff_rft;\n#else\n#include <sys/types.h>\ntypedef off64_t foff_rft;\n#endif\n///Fseek and Ftelll definitions\n#ifdef _MSC_VER\n    #define rfFseek(i_FILE_,i_OFFSET_,i_WHENCE_)    _fseeki64(i_FILE_,i_OFFSET_,i_WHENCE_)\n    #define rfFtell(i_FILE_)                        _ftelli64(i_FILE_)\n#else\n    #define rfFseek(i_FILE_,i_OFFSET_,i_WHENCE_)    fseeko64(i_FILE_,i_OFFSET_,i_WHENCE_)\n    #define rfFtell(i_FILE_)                        ftello64(i_FILE_)\n#endif\n\n/**\n** @defgroup RF_IOGRP I/O\n** @addtogroup RF_IOGRP\n** @{\n**/\n\n// @brief Reads a UTF-8 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function\n// shall not be adding any CR character that is found in the file behind a newline character since this is\n// the Windows line ending scheme. Beware though that the returned  read bytes value shall still count the CR character inside.\n//\n// @param[in] f The file descriptor to read\n// @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function\n// and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later\n// @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes\n// @param[out] bufferSize Give an @c uint32_t here to receive the capacity of the @c utf8 buffer in bytes\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file\n// with reading this line\n// @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong.\n// The possible errors to return are the same as rfFgets_UTF8()\ni_DECLIMEX_ int32_t rfFReadLine_UTF8(FILE* f,char** utf8,uint32_t* byteLength,uint32_t* bufferSize,char* eof);\n// @brief Reads a Big Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function\n// shall not be adding any CR character that is found in the file behind a newline character since this is\n// the Windows line ending scheme. Beware though that the returned  read bytes value shall still count the CR character inside.\n//\n// @param[in] f The file descriptor to read\n// @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function\n// and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later\n// @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file\n// with reading this line\n// @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong.\n// + Any error that can be returned by @ref rfFgets_UTF16BE()\n// + @c RE_UTF16_INVALID_SEQUENCE: Failed to decode the UTF-16 byte stream of the file descriptor\n// + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8\ni_DECLIMEX_ int32_t rfFReadLine_UTF16BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof);\n// @brief Reads a Little Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function\n// shall not be adding any CR character that is found in the file behind a newline character since this is\n// the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside.\n//\n// @param[in] f The file descriptor to read\n// @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function\n// and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later\n// @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file\n// with reading this line\n// @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong.\n// + Any error that can be returned by @ref rfFgets_UTF16LE()\n// + @c RE_UTF16_INVALID_SEQUENCE: Failed to decode the UTF-16 byte stream of the file descriptor\n// + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8\ni_DECLIMEX_ int32_t rfFReadLine_UTF16LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof);\n\n// @brief Reads a Big Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function\n// shall not be adding any CR character that is found in the file behind a newline character since this is\n// the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside.\n//\n// @param[in] f The file descriptor to read\n// @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function\n// and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later\n// @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file\n// with reading this line\n// @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong.\n// + Any error that can be returned by @ref rfFgets_UTF32BE()\n// + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8\ni_DECLIMEX_ int32_t rfFReadLine_UTF32BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof);\n// @brief Reads a Little Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function\n// shall not be adding any CR character that is found in the file behind a newline character since this is\n// the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside.\n//\n// @param[in] f The file descriptor to read\n// @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function\n// and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later\n// @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file\n// with reading this line\n// @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong.\n// + Any error that can be returned by @ref rfFgets_UTF32LE()\n// + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8\ni_DECLIMEX_ int32_t rfFReadLine_UTF32LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof);\n\n// @brief Gets a number of bytes from a BIG endian UTF-32 file descriptor\n//\n// This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes\n// have been read or new line or EOF character has been encountered.\n//\n// The function will read until @c num characters are read and if @c num\n// would take us to the middle of a UTF32 character then the next character shall also be read\n// and the function will return the number of bytes read.\n// Since the function null terminates the buffer the given @c buff needs to be of at least\n// @c num+7 size to cater for the worst case.\n//\n// The final bytestream stored inside @c buff is in the endianess of the system.\n//\n// If right after the last character read comes the EOF, the function\n// shall detect so and assign @c true to @c eof.\n//\n// In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function\n// shall just ignore the carriage returns and not return it inside the return buffer at @c buff.\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+7\n// @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 4 bytes). Should be a multiple of 4\n// @param[in] f A valid FILE descriptor from which to read the bytes\n// @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached.\n// @return Returns the actual number of bytes read or an error if there was a problem.\n// The possible errors are:\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgets_UTF32BE(char* buff,uint32_t num,FILE* f,char* eof);\n// @brief Gets a number of bytes from a Little endian UTF-32 file descriptor\n//\n// This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes\n// have been read or new line or EOF character has been encountered.\n//\n// The function will read until @c num characters are read and if @c num\n// would take us to the middle of a UTF32 character then the next character shall also be read\n// and the function will return the number of bytes read.\n// Since the function null terminates the buffer the given @c buff needs to be of at least\n// @c num+7 size to cater for the worst case.\n//\n// The final bytestream stored inside @c buff is in the endianess of the system.\n//\n// If right after the last character read comes the EOF, the function\n// shall detect so and assign @c true to @c eof.\n//\n// In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function\n// shall just ignore the carriage returns and not return it inside the return buffer at @c buff.\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+7\n// @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 4 bytes). Should be a multiple of 4\n// @param[in] f A valid FILE descriptor from which to read the bytes\n// @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached.\n// @return Returns the actual number of bytes read or an error if there was a problem.\n// The possible errors are:\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgets_UTF32LE(char* buff,uint32_t num,FILE* f,char* eof);\n\n// @brief Gets a number of bytes from a BIG endian UTF-16 file descriptor\n//\n// This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes\n// have been read or new line or EOF character has been encountered.\n//\n// The function will read until @c num characters are read and if @c num\n// would take us to the middle of a UTF16 character then the next character shall also be read\n// and the function will return the number of bytes read.\n// Since the function null terminates the buffer the given @c buff needs to be of at least\n// @c num+5 size to cater for the worst case.\n//\n// The final bytestream stored inside @c buff is in the endianess of the system.\n//\n// If right after the last character read comes the EOF, the function\n// shall detect so and assign @c true to @c eof.\n//\n// In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function\n// shall just ignore the carriage returns and not return it inside the return buffer at @c buff.\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+5\n// @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 2 bytes). Should be a multiple of 2\n// @param[in] f A valid FILE descriptor from which to read the bytes\n// @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached.\n// @return Returns the actual number of bytes read or an error if there was a problem.\n// The possible errors are:\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgets_UTF16BE(char* buff,uint32_t num,FILE* f,char* eof);\n// @brief Gets a number of bytes from a Little endian UTF-16 file descriptor\n//\n// This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes\n// have been read or new line or EOF character has been encountered.\n//\n// The function will read until @c num characters are read and if @c num\n// would take us to the middle of a UTF16 character then the next character shall also be read\n// and the function will return the number of bytes read.\n// Since the function null terminates the buffer the given @c buff needs to be of at least\n// @c num+5 size to cater for the worst case.\n//\n// The final bytestream stored inside @c buff is in the endianess of the system.\n//\n// If right after the last character read comes the EOF, the function\n// shall detect so and assign @c true to @c eof.\n//\n// In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function\n// shall just ignore the carriage returns and not return it inside the return buffer at @c buff.\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+2\n// @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 2 bytes). Should be a multiple of 2\n// @param[in] f A valid FILE descriptor from which to read the bytes\n// @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached.\n// @return Returns the actual number of bytes read or an error if there was a problem.\n// The possible errors are:\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgets_UTF16LE(char* buff,uint32_t num,FILE* f,char* eof);\n// @brief Gets a number of bytes from a UTF-8 file descriptor\n//\n// This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num characters\n// have been read or new line or EOF character has been encountered.\n//\n// The function  automatically adds a null termination character at the end of\n// @c buff but this character is not included in the returned actual number of bytes.\n//\n// The function will read until @c num characters are read and if @c num\n// would take us to the middle of a UTF8 character then the next character shall also be read\n// and the function will return the number of bytes read.\n// Since the function null terminates the buffer the given @c buff needs to be of at least\n// @c num+4 size to cater for the worst case.\n//\n// If right after the last character read comes the EOF, the function\n// shall detect so and assign @c true to @c eof.\n//\n// In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function\n// shall just ignore the carriage returns and not return it inside the return buffer at @c buff.\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param[in] buff A buffer to be filled with the contents of the file. Should of size at least @c num+4\n// @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 1 byte)\n// @param[in] f A valid FILE descriptor from which to read the bytes\n// @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached.\n// @return Returns the actual number of bytes read or an error if there was a problem.\n// The possible errors are:\n// + @c RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE: If an invalid UTF-8 byte has been found\n// + @c RE_UTF8_INVALID_SEQUENCE_CONBYTE: If during parsing the file we were expecting a continuation\n// byte and did not find it\n// + @c RE_UTF8_INVALID_SEQUENCE_END: If the null character is encountered in between bytes that should\n// have been continuation bytes\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgets_UTF8(char* buff,uint32_t num,FILE* f,char* eof);\n\n// @brief  Gets a unicode character from a UTF-8 file descriptor\n//\n// This function attempts to assume a more modern fgetc() role for UTF-8 encoded files.\n// Reads bytes from the File descriptor @c f until a full UTF-8 unicode character has been read\n//\n// After this function the file pointer will have moved either by @c 1, @c 2, @c 3 or @c 4\n// bytes if the return value is positive. You can see how much by checking the return value.\n//\n// You shall need to provide an integer at @c c to contain either the decoded Unicode\n// codepoint or the UTF-8 endoced byte depending on the value of the @c cp argument.\n//\n// @param f A valid FILE descriptor from which to read the bytes\n// @param c Pass an int that will receive either the unicode code point value or\n// the UTF8 bytes depending on the value of the @c cp flag\n// @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point\n// of the read character, so the UTF-8 will be decoded.\n// If @c false the int passed at @c c will contain the value of the read bytes in UTF-8 without any decoding\n// @return Returns the number of bytes read (either @c 1, @c 2, @c 3 or @c 4) or an error if the function\n// fails for some reason. Possible error values are:\n// + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered\n// in the middle of a UTF-8 encoded character where we would be expecting something different\n// and @c RE_UTF8_INVALID_SEQUENCE_END error is also logged\n// + @c RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE: If an invalid UTF-8 byte has been found\n// + @c RE_UTF8_INVALID_SEQUENCE_CONBYTE: If during parsing the file we were expecting a continuation\n// byte and did not find it\n// + @c RE_UTF8_INVALID_SEQUENCE_END: If the null character is encountered in between bytes that should\n// have been continuation bytes\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgetc_UTF8(FILE* f,uint32_t *c,char cp);\n// @brief  Gets a unicode character from a UTF-16 Big Endian file descriptor\n//\n// This function attempts to assume a more modern fgetc() role for UTF-16 encoded files.\n// Reads bytes from the File descriptor @c f until a full UTF-16 unicode character has been read\n//\n// After this function the file pointer will have moved either by @c 2 or @c 4\n// bytes if the return value is positive. You can see how much by checking the return value.\n//\n// You shall need to provide an integer at @c c to contain either the decoded Unicode\n// codepoint or the Bigendian encoded UTF-16 bytes depending on the value of @c the cp argument.\n//\n// @param f A valid FILE descriptor from which to read the bytes\n// @param c Pass an int that will receive either the unicode code point value or\n// the UTF16 bytes depending on the value of the @c cp flag\n// @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point\n// of the read character, so the UTF-16 will be decoded.\n// If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding\n// @return Returns the number of bytes read (either @c 2 or @c 4) or an error if the function\n// fails for some reason. Possible error values are:\n// + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values\n// + @c RE_UTF16_NO_SURRPAIR: According to the first read word a surrogate pair was expected but none was found\n// + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered\n// while we expect a UTF-16 surrogate pair an appropriate error is logged\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgetc_UTF16BE(FILE* f,uint32_t *c,char cp);\n// @brief  Gets a unicode character from a UTF-16 Little Endian file descriptor\n//\n// This function attempts to assume a more modern fgetc() role for UTF-16 encoded files.\n// Reads bytes from the File descriptor @c f until a full UTF-16 unicode character has been read\n//\n// After this function the file pointer will have moved either by @c 2 or @c 4\n// bytes if the return value is positive. You can see how much by checking the return value.\n//\n// You shall need to provide an integer at @c c to contain either the decoded Unicode\n// codepoint or the Bigendian encoded UTF-16 bytes depending on the value of @c the cp argument.\n//\n// @param f A valid FILE descriptor from which to read the bytes\n// @param c Pass an int that will receive either the unicode code point value or\n// the UTF16 bytes depending on the value of the @c cp flag\n// @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point\n// of the read character, so the UTF-16 will be decoded.\n// If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding\n// @return Returns the number of bytes read (either @c 2 or @c 4) or an error if the function\n// fails for some reason. Possible error values are:\n// + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values\n// + @c RE_UTF16_NO_SURRPAIR: According to the first read word a surrogate pair was expected but none was found\n// + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered\n// while we expect a UTF-16 surrogate pair an appropriate error is logged\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgetc_UTF16LE(FILE* f,uint32_t *c,char cp);\n// @brief  Gets a unicode character from a UTF-32 Little Endian file descriptor\n//\n// This function attempts to assume a more modern fgetc() role for UTF-32 encoded files.\n// Reads bytes from the File descriptor @c f until a full UTF-32 unicode character has been read\n//\n// After this function the file pointer will have moved by @c 4\n// bytes if the return value is positive.\n//\n// You shall need to provide an integer at @c to contain the UTF-32 codepoint.\n//\n// @param f A valid FILE descriptor from which to read the bytes\n// @param c Pass an int that will receive either the unicode code point value or\n// the UTF16 bytes depending on the value of the @c cp flag\n// If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding\n// @return Returns either @c RF_SUCCESS for succesfull readin or one of the following errors:\n// + @c RE_FILE_EOF: The end of file has been found while reading.\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgetc_UTF32LE(FILE* f,uint32_t *c);\n// @brief  Gets a unicode character from a UTF-32 Big Endian file descriptor\n//\n// This function attempts to assume a more modern fgetc() role for UTF-32 encoded files.\n// Reads bytes from the File descriptor @c f until a full UTF-32 unicode character has been read\n//\n// After this function the file pointer will have moved by @c 4\n// bytes if the return value is positive.\n//\n// You shall need to provide an integer at @c to contain the UTF-32 codepoint.\n//\n// @param f A valid FILE descriptor from which to read the bytes\n// @param c Pass an int that will receive either the unicode code point value or\n// the UTF16 bytes depending on the value of the @c cp flag\n// If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding\n// @return Returns either @c RF_SUCCESS for succesfull readin or one of the following errors:\n// + @c RE_FILE_EOF: The end of file has been found while reading.\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgetc_UTF32BE(FILE* f,uint32_t *c);\n\n// @brief Moves a unicode character backwards in a big endian UTF-32 file stream\n//\n// @param f The file stream\n// @param c Returns the character we moved back to as a unicode codepoint\n// @return Returns either @c RF_SUCCESS for success or one of the following errors:\n// + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system\n// + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal\n// + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket.\n// + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason\n// + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set\n// + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt\n// + @c RE_FILE_IO: There was a physical I/O error\n// + @c RE_FILE_NOSPACE: There was no space on the device holding the file\n// + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent\n// + @c RE_FILE_READ: If during reading the file there was an error\n// + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading\ni_DECLIMEX_ int32_t rfFback_UTF32BE(FILE* f,uint32_t *c);\n// @brief Moves a unicode character backwards in a little endian UTF-32 file stream\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param f The file stream\n// @param c Returns the character we moved back to as a unicode codepoint\n// @return Returns either @c RF_SUCCESS for success or one of the following errors:\n// + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system\n// + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal\n// + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket.\n// + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason\n// + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set\n// + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt\n// + @c RE_FILE_IO: There was a physical I/O error\n// + @c RE_FILE_NOSPACE: There was no space on the device holding the file\n// + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent\n// + @c RE_FILE_READ: If during reading the file there was an error\n// + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading\ni_DECLIMEX_ int32_t rfFback_UTF32LE(FILE* f,uint32_t *c);\n// @brief Moves a unicode character backwards in a big endian UTF-16 file stream\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param f The file stream\n// @param c Returns the character we moved back to as a unicode codepoint\n// @return Returns either the number of bytes moved backwards (either @c 4 or @c 2) for success or one of the following errors:\n// + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values\n// + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system\n// + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal\n// + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket.\n// + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason\n// + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set\n// + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt\n// + @c RE_FILE_IO: There was a physical I/O error\n// + @c RE_FILE_NOSPACE: There was no space on the device holding the file\n// + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent\n// + @c RE_FILE_READ: If during reading the file there was an error\n// + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading\ni_DECLIMEX_ int32_t rfFback_UTF16BE(FILE* f,uint32_t *c);\n// @brief Moves a unicode character backwards in a little endian UTF-16 file stream\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param f The file stream\n// @param c Returns the character we moved back to as a unicode codepoint\n// @return Returns either the number of bytes moved backwards (either @c 4 or @c 2) for success or one of the following errors:\n// + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values\n// + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system\n// + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal\n// + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket.\n// + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason\n// + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set\n// + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt\n// + @c RE_FILE_IO: There was a physical I/O error\n// + @c RE_FILE_NOSPACE: There was no space on the device holding the file\n// + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent\n// + @c RE_FILE_READ: If during reading the file there was an error\n// + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading\ni_DECLIMEX_ int32_t rfFback_UTF16LE(FILE* f,uint32_t *c);\n// @brief Moves a unicode character backwards in a UTF-8 file stream\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param f The file stream\n// @param c Returns the character we moved back to as a unicode codepoint\n// @return Returns either the number of bytes moved backwards for success (either @c 4, @c 3, @c 2 or @c 1) or one of the following errors:\n// + @c RE_UTF8_INVALID_SEQUENCE: If during moving bacwards in the file unexpected UTF-8 bytes were found\n// + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system\n// + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal\n// + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket.\n// + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason\n// + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set\n// + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt\n// + @c RE_FILE_IO: There was a physical I/O error\n// + @c RE_FILE_NOSPACE: There was no space on the device holding the file\n// + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent\n// + @c RE_FILE_READ: If during reading the file there was an error\n// + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading\ni_DECLIMEX_ int32_t rfFback_UTF8(FILE* f,uint32_t *c);\n\n// @brief Opens another process as a pipe\n//\n// This function is a cross-platform popen wrapper. In linux it uses popen and in Windows it uses\n// _popen.\n// @lmsFunction\n// @param command The string with the command to execute. Is basically the name of the program/process you want to spawn\n// with its full path and its parameters. @inhtype{String,StringX} @tmpSTR\n// @param mode The mode you want the pipe to work in. There are two possible values:\n// + @c \"r\" The calling process can read the spawned command's standard output via the returned stream.\n// + @c \"w\" The calling process can write to the spawned command's standard input via the returned stream.\n//\n// Anything else will result in an error\n// @return For success popen will return a FILE descriptor that can be used to either read or write from the pipe.\n// If there was an error @c 0 is returned and an error is logged.\n#ifdef RF_IAMHERE_FOR_DOXYGEN\ni_DECLIMEX_ FILE* rfPopen(void* command,const char* mode);\n#else\ni_DECLIMEX_ FILE* i_rfPopen(void* command,const char* mode);\n#define rfPopen(i_CMD_,i_MODE_) i_rfLMS_WRAP2(FILE*,i_rfPopen,i_CMD_,i_MODE_)\n#endif\n\n// @brief Closes a pipe\n//\n// This function is a cross-platform wrapper for pclose. It closes a file descriptor opened with @ref rfPopen() and\n// returns the exit code of the process that was running\n// @param stream The file descriptor of the pipe returned by @ref rfPopen() that we want to close\n// @return Returns the exit code of the process or -1 if there was an error\ni_DECLIMEX_ int rfPclose(FILE* stream);\n\n// @} End of I/O group\n\n#ifdef __cplusplus\n}///closing bracket for calling from C++\n#endif\n\n\n#endif//include guards end\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/rfc_string.c",
    "content": "/**\n** Copyright (c) 2011-2012, Karapetsas Eleftherios\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n**  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n**  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in\n**     the documentation and/or other materials provided with the distribution.\n**  3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from\n**\n**  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n**  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n**  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n**  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n**  SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n**  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n**  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**/\n#include <errno.h>\n\n#include <String/rfc_string.h>\n// include bitwise operations\n#include <rf_utils.h>\n// include the private functions and macros\n#include \"string_private.h\"\n// include io_private only for the write check\n#include \"../IO/io_private.h\"\n// include the extended strin\n#include <String/rfc_stringx.h>\n// for HUGE_VAL definition\n#include <math.h>\n\n#include <rf_localmem.h> // for the local stack memory\n\n/*********************************************************************** Start of the RF_String functions *****************************************************************************************/\n\n/*-------------------------------------------------------------------------Methods to create an RF_String-------------------------------------------------------------------------------*/\n\n// Allocates and returns a string with the given characters a refu string with the given characters. Given characters have to be in UTF-8. A check for valide sequence of bytes is performed.\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nRF_String* rfString_Create(const char* s,...)\n#else\nRF_String* i_rfString_Create(const char* s,...)\n#endif\n{\n    READ_VSNPRINTF_ARGS(s,s,0)\n\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n    if( rfUTF8_VerifySequence(buff,&byteLength) == RF_FAILURE)\n    {\n        LOG_ERROR(\"Error at String Allocation due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        if(buffAllocated == true)\n            free(buff);\n        return 0;\n    }\n\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    // get length\n    ret->byteLength = byteLength;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(ret->bytes,ret->byteLength+1);\n    memcpy(ret->bytes,buff,ret->byteLength+1);\n    if(buffAllocated==true)\n        free(buff);\n    return ret;\n}\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\nRF_String* i_NVrfString_Create(const char* s)\n{\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n    if( rfUTF8_VerifySequence(s,&byteLength) == RF_FAILURE)\n    {\n        LOG_ERROR(\"Error at String Allocation due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        return 0;\n    }\n\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    // get length\n    ret->byteLength = byteLength;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(ret->bytes,ret->byteLength+1);\n    memcpy(ret->bytes,s,ret->byteLength+1);\n\n    return ret;\n}\n#endif\n\n\n// Allocates and returns a string with the given characters a refu string with the given characters. Given characters have to be in UTF-8. A check for valid sequence of bytes is performed.\nRF_String* i_rfString_CreateLocal1(const char* s,...)\n{\n#if RF_OPTION_SOURCE_ENCODING != RF_UTF8\n    uint32_t characterLength,*codepoints,i=0,j;\n#endif\n    // remember the stack pointer before this macro evaluation\n    rfLMS_MacroEvalPtr(RF_LMS);\n    // read the var args\n    READ_VSNPRINTF_ARGS(s,s,0)\n// /===Start of Non-UTF-8 code===// /\n#if (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_BE)\n    // find the bytelength of the UTF-16 buffer\n    while(buff[i] != '\\0' && buff[i+1]!= '\\0')\n        i++;\n    i+=2;\n    // allocate the codepoint buffer\n    RF_MALLOC(codepoints,i/2)\n#elif (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF32_LE) || (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF32_BE)\n    // find the bytelength of the UTF-32 buffer\n    while(buff[i] != '\\0' && buff[i+1]!= '\\0' && buff[i+2]!= '\\0' && buff[i+3]!= '\\0')\n        i++;\n    i+=4;\n    // allocate the codepoint buffer\n    RF_MALLOC(codepoints,i)\n#endif\n#if (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_LE)// decode the UTF16\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n        if(rfUTF16_Decode(buff,&characterLength,codepoints) == false)\n            goto cleanup;\n    else\n        if(rfUTF16_Decode_swap(buff,&characterLength,codepoints)==false)\n            goto cleanup;\n\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE// decode the UTF16\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n        if(rfUTF16_Decode_swap(buff,&characterLength,codepoints) == false)\n            goto cleanup;\n    else\n        if(rfUTF16_Decode(buff,&characterLength,codepoints)==false)\n            goto cleanup;\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF32_LE// copy the UTF32 into the codepoint\n    memcpy(codepoints,buff,i);\n    if(rfUTILS_Endianess != RF_LITTLE_ENDIAN)\n    {\n        for(j=0;j<i;j+=4)\n        {\n            rfUTILS_SwapEndianUI((uint32_t*)(codepoints+j))\n        }\n    }\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF32_BE// copy the UTF32 into the codepoint\n    memcpy(codepoints,buff,i);\n    if(rfUTILS_Endianess !RF_BIG_ENDIAN RF_LITTLE_ENDIAN)\n    {\n        for(j=0;j<i;j+=4)\n        {\n            rfUTILS_SwapEndianUI((uint32_t*)(codepoints+j))\n        }\n    }\n#endif\n#if RF_OPTION_SOURCE_ENCODING != RF_UTF8 // in any case other than UTF-8 encode the codepoints into UTF-8 , and free them\n    if(buffAllocated == true)\n        free(buff);\n    buffAllocated = true;\n    if((buff =  rfUTF8_Encode(codepoints,characterLength,&byteLength)) == 0)\n    {\n        LOG_ERROR(\"While attempting to create a temporary RF_String the given byte sequence could not be properly encoded into UTF-8\",RE_UTF8_ENCODING);\n        free(codepoints);\n        return 0;\n    }\n    free(codepoints);\n#endif\n// /===End of Non-UTF-8 code===// /\n    // /progress normally since here we have a UTF-8 buffer\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n    if( rfUTF8_VerifySequence(buff,&byteLength) == RF_FAILURE)\n    {\n        LOG_ERROR(\"Error at String Allocation due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        if(buffAllocated == true)\n            free(buff);\n        return 0;\n    }\n\n    RF_String* ret;\n    ret = rfLMS_Push(RF_LMS,sizeof(RF_String));\n    if(ret == 0)\n    {\n        LOG_ERROR(\"Memory allocation from the Local Memory Stack failed. Insufficient local memory stack space. Consider compiling the library with bigger stack space. Quitting proccess...\",\n                  RE_LOCALMEMSTACK_INSUFFICIENT);\n        exit(RE_LOCALMEMSTACK_INSUFFICIENT);\n    }\n    // get length\n    ret->byteLength = byteLength;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    ret->bytes = rfLMS_Push(RF_LMS,ret->byteLength+1);\n    if(ret->bytes == 0)\n    {\n        LOG_ERROR(\"Memory allocation from the Local Memory Stack failed. Insufficient local memory stack space. Consider compiling the library with bigger stack space. Quitting proccess...\",\n                  RE_LOCALMEMSTACK_INSUFFICIENT);\n        exit(RE_LOCALMEMSTACK_INSUFFICIENT);\n    }\n    memcpy(ret->bytes,buff,ret->byteLength+1);\n    // finally free stuff if needed\n    if(buffAllocated == true)\n        free(buff);\n    return ret;\n\n// /cleanup code for non-UTF-8 cases\n#if (RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE)\ncleanup:\n#if RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE\n    LOG_ERROR(\"Temporary RF_String creation from a UTF-16 Little Endian buffer failed due to UTF-16 decoding failure\",RE_UTF16_INVALID_SEQUENCE);\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE\n    LOG_ERROR(\"Temporary RF_String creation from a UTF-16 Big Endian buffer failed due to UTF-16 decoding failure\",RE_UTF16_INVALID_SEQUENCE);\n#endif\n    free(codepoints);\n    if(buffAllocated == true)\n        free(buff);\n    return 0;\n#endif\n}\nRF_String* i_NVrfString_CreateLocal(const char* s)\n{\n#if RF_OPTION_SOURCE_ENCODING != RF_UTF8\n    uint32_t characterLength,*codepoints,i=0,j;\n    char* buff;\n#endif\n    // remember the stack pointer before this macro evaluation\n    rfLMS_MacroEvalPtr(RF_LMS);\n// /===Start of Non-UTF-8 code===// /\n#if (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_BE)\n    // find the bytelength of the UTF-16 buffer\n    while(s[i] != '\\0' &&s[i+1]!= '\\0')\n        i++;\n    i+=2;\n    // allocate the codepoint buffer\n    RF_MALLOC(codepoints,i/2)\n#elif (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF32_LE) || (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF32_BE)\n    // find the bytelength of the UTF-32 buffer\n    while(s[i] != '\\0' && s[i+1]!= '\\0' && s[i+2]!= '\\0' && s[i+3]!= '\\0')\n        i++;\n    i+=4;\n    // allocate the codepoint buffer\n    RF_MALLOC(codepoints,i)\n#endif\n#if (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_LE)// decode the UTF16\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n        if(rfUTF16_Decode(s,&characterLength,codepoints) == false)\n            goto cleanup;\n    else\n        if(rfUTF16_Decode_swap(s,&characterLength,codepoints)==false)\n            goto cleanup;\n\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE// decode the UTF16\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n        if(rfUTF16_Decode_swap(s,&characterLength,codepoints) == false)\n            goto cleanup;\n    else\n        if(rfUTF16_Decode(s,&characterLength,codepoints)==false)\n            goto cleanup;\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF32_LE// copy the UTF32 into the codepoint\n    memcpy(codepoints,s,i);\n    if(rfUTILS_Endianess != RF_LITTLE_ENDIAN)\n    {\n        for(j=0;j<i;j+=4)\n        {\n            rfUTILS_SwapEndianUI((uint32_t*)(codepoints+j))\n        }\n    }\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF32_BE// copy the UTF32 into the codepoint\n    memcpy(codepoints,s,i);\n    if(rfUTILS_Endianess !RF_BIG_ENDIAN RF_LITTLE_ENDIAN)\n    {\n        for(j=0;j<i;j+=4)\n        {\n            rfUTILS_SwapEndianUI((uint32_t*)(codepoints+j))\n        }\n    }\n#endif\n#if RF_OPTION_SOURCE_ENCODING != RF_UTF8 // in any case other than UTF-8 encode the codepoints into UTF-8 , and free them\n    if((buff =  rfUTF8_Encode(codepoints,characterLength,&byteLength)) == 0)\n    {\n        LOG_ERROR(\"While attempting to create a temporary RF_String the given byte sequence could not be properly encoded into UTF-8\",RE_UTF8_ENCODING);\n        free(codepoints);\n        return 0;\n    }\n    free(codepoints);\n#endif\n// /===End of Non-UTF-8 code===// /\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n#if RF_OPTION_SOURCE_ENCODING == RF_UTF8\n    if( rfUTF8_VerifySequence(s,&byteLength) == RF_FAILURE)\n#else\n    if( rfUTF8_VerifySequence(buff,&byteLength) == RF_FAILURE)\n#endif\n    {\n        LOG_ERROR(\"Error at String Allocation due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        return 0;\n    }\n\n    RF_String* ret;\n    ret = rfLMS_Push(RF_LMS,sizeof(RF_String));\n    if(ret == 0)\n    {\n        LOG_ERROR(\"Memory allocation from the Local Memory Stack failed during string allocation. Insufficient local memory stack space. Consider compiling the library with bigger stack space. Quitting proccess...\",\n                  RE_LOCALMEMSTACK_INSUFFICIENT);\n        exit(RE_LOCALMEMSTACK_INSUFFICIENT);\n    }\n    // get length\n    ret->byteLength = byteLength;\n\n    ret->bytes = rfLMS_Push(RF_LMS,ret->byteLength+1);\n    if(ret->bytes == 0)\n    {\n        LOG_ERROR(\"Memory allocation from the Local Memory Stack failed during string allocation. Insufficient local memory stack space. Consider compiling the library with bigger stack space. Quitting proccess...\",\n                  RE_LOCALMEMSTACK_INSUFFICIENT);\n        exit(RE_LOCALMEMSTACK_INSUFFICIENT);\n    }\n#if RF_OPTION_SOURCE_ENCODING == RF_UTF8\n    memcpy(ret->bytes,s,ret->byteLength+1);\n#else\n    memcpy(ret->bytes,buff,ret->byteLength+1);\n#endif\n    return ret;\n\n// /cleanup code for non-UTF-8 cases\n#if (RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE)\ncleanup:\n#if RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE\n    LOG_ERROR(\"Temporary RF_String creation from a UTF-16 Little Endian buffer failed due to UTF-16 decoding failure\",RE_UTF16_INVALID_SEQUENCE);\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE\n    LOG_ERROR(\"Temporary RF_String creation from a UTF-16 Big Endian buffer failed due to UTF-16 decoding failure\",RE_UTF16_INVALID_SEQUENCE);\n#endif\n    free(codepoints);\n    return 0;\n#endif\n}\n\n\n\n// Initializes a string with the given characters. Given characters have to be in UTF-8. A check for valide sequence of bytes is performed.<b>Can't be used with RF_StringX</b>\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nchar rfString_Init(RF_String* str,const char* s,...)\n#else\nchar i_rfString_Init(RF_String* str,const char* s,...)\n#endif\n{\n    READ_VSNPRINTF_ARGS(s,s,false)\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n    if( rfUTF8_VerifySequence(buff,&byteLength) == RF_FAILURE)\n    {\n        LOG_ERROR(\"Error at String Initialization due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        if(buffAllocated==true)\n            free(buff);\n        return false;\n    }\n\n    // get length\n    str->byteLength = byteLength;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(str->bytes,str->byteLength+1);\n    memcpy(str->bytes,buff,str->byteLength+1);\n    if(buffAllocated == true)\n        free(buff);\n    return true;\n}\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\nchar i_NVrfString_Init(RF_String* str,const char* s)\n{\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n    if( rfUTF8_VerifySequence(s,&byteLength) == RF_FAILURE)\n    {\n        LOG_ERROR(\"Error at String Initialization due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        return false;\n    }\n\n    // get length\n    str->byteLength = byteLength;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(str->bytes,str->byteLength+1);\n    memcpy(str->bytes,s,str->byteLength+1);\n\n    return true;\n}\n#endif\n\n// Allocates a String by turning a unicode code point in a String (encoded in UTF-8).\nRF_String* rfString_Create_cp(uint32_t codepoint)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_cp(ret,codepoint) == true)\n    {\n        return ret;\n    }\n    // failure\n    free(ret);\n    return 0;\n}\n\n// Initializes a string by turning a unicode code point in a String (encoded in UTF-8).\nchar rfString_Init_cp(RF_String* str, uint32_t codepoint)\n{\n    // alloc enough for a character\n    RF_MALLOC(str->bytes,5)\n\n    // if we only need a byte to encode it\n    if(RF_HEXLE_UI(codepoint,0x007f))\n    {\n        str->bytes[0] = codepoint;\n        str->bytes[1] = '\\0';\n        str->byteLength = 1;\n    }\n    // if we need 2 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x0080) && RF_HEXLE_UI(codepoint,0x07ff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[1] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 5 following bits and encode them in the second byte\n        str->bytes[0] = ((codepoint & 0x7C0) >> 6)  | (0x6<<5);\n        str->bytes[2] = '\\0';\n        str->byteLength = 2;\n    }\n    // if we need 3 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x0800) && RF_HEXLE_UI(codepoint,0x0ffff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[2] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 6 following bits and encode them in the second byte\n        str->bytes[1] = ((codepoint & 0xFC0) >> 6)  | (0x02<<6);\n        // get the 4 following bits and encode them in the third byte\n        str->bytes[0] = (((codepoint & 0xF000))>>12) | (0xE<<4);\n        str->bytes[3] = '\\0';\n        str->byteLength = 3;\n    }\n    // if we need 4 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x10000) && RF_HEXLE_UI(codepoint,0x10ffff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[3] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 6 following bits and encode them in the second byte\n        str->bytes[2] = ((codepoint & 0xFC0) >> 6)  | (0x02<<6);\n        // get the 6 following bits and encode them in the third byte\n        str->bytes[1] = (((codepoint & 0x3F000))>>12) | (0x02<<6);\n        // get the 3 following bits and encode them in the fourth byte\n        str->bytes[0] = (((codepoint & 0x1C0000))>>18) | (0x1E<<3);\n        str->bytes[4] = '\\0';\n        str->byteLength = 4;\n    }\n    else\n    {\n        LOG_ERROR(\"Attempted to encode an invalid unicode code point into a string\",RE_UTF8_INVALID_CODE_POINT);\n        free(str->bytes);\n        return false;\n    }\n\n    return true;\n}\n\n\n// Allocates and returns a string with the given integer\nRF_String* rfString_Create_i(int32_t i)\n{\n    // the size of the int32_t buffer\n    int32_t numLen;\n    // put the int32_t into a buffer and turn it in a char*\n    char buff[12];// max uint32_t is 4,294,967,295 in most environment so 12 chars will certainly fit it\n    sprintf(buff,\"%d\",i);\n    numLen = strlen(buff);\n\n    // initialize the string and return it\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    ret->byteLength = numLen;\n    RF_MALLOC(ret->bytes,numLen+1);\n    strcpy(ret->bytes,buff);\n    return ret;\n}\n// Initializes a string with the given integer.\nchar rfString_Init_i(RF_String* str, int32_t i)\n{\n    // the size of the int32_t buffer\n    int32_t numLen;\n    // put the int32_t into a buffer and turn it in a char*\n    char buff[12];// max uint32_t is 4,294,967,295 in most environment so 12 chars will certainly fit it\n    sprintf(buff,\"%d\",i);\n    numLen = strlen(buff);\n\n\n    str->byteLength = numLen;\n    RF_MALLOC(str->bytes,numLen+1);\n    strcpy(str->bytes,buff);\n\n    return true;\n}\n\n// Allocates and returns a string with the given float\nRF_String* rfString_Create_f(float f)\n{\n    // allocate a buffer for the float in characters\n    char* buff;\n    RF_MALLOC(buff,128);\n    sprintf(buff,\"%f\",f);\n    uint32_t len = strlen(buff);\n\n    // initialize and return the string\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    ret->byteLength = len;\n    RF_MALLOC(ret->bytes,len+1);\n    strcpy(ret->bytes,buff);\n\n    free(buff);\n\n    return ret;\n}\n// Initializes a string with the given float\nchar rfString_Init_f(RF_String* str,float f)\n{\n    // allocate a buffer for the float in characters\n    char* buff;\n    RF_MALLOC(buff,128);\n    sprintf(buff,\"%f\",f);\n    uint32_t len = strlen(buff);\n\n\n    str->byteLength = len;\n    RF_MALLOC(str->bytes,len+1);\n    strcpy(str->bytes,buff);\n    free(buff);\n\n    // success\n    return true;\n}\n\n// Allocates and returns a string with the given UTF-16 byte sequence. Given characters have to be in UTF-16. A check for valid sequence of bytes is performed.<b>Can't be used with RF_StringX</b>\nRF_String* rfString_Create_UTF16(const char* s,char endianess)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_UTF16(ret,s,endianess)==false)\n    {\n        free(ret);\n        return 0;\n    }\n    return ret;\n}\n// Initializes a string with the given UTF-16 byte sequence. Given characters have to be in UTF-16. A check for valid sequence of bytes is performed.<b>Can't be used with RF_StringX</b>\nchar rfString_Init_UTF16(RF_String* str,const char* s,char endianess)\n{\n    // decode the utf-16 and get the code points\n    uint32_t* codepoints;\n    uint32_t byteLength,characterLength,utf8ByteLength;\n    char* utf8;\n    byteLength = 0;\n    while(s[byteLength]!= 0 || s[byteLength+1]!=0)\n    {\n        byteLength++;\n    }\n    byteLength+=3;// for the last utf-16 null termination character\n    RF_MALLOC(codepoints,byteLength*2) // allocate the codepoints\n    // parse the given byte stream depending on the endianess parameter\n    switch(endianess)\n    {\n        case RF_LITTLE_ENDIAN:\n        case RF_BIG_ENDIAN:\n            if(rfUTILS_Endianess() == endianess)// same endianess as the local\n            {\n                if(rfUTF16_Decode(s,&characterLength,codepoints) == false)\n                {\n                    free(codepoints);\n                    LOG_ERROR(\"String initialization failed due to invalide UTF-16 sequence\",RE_STRING_INIT_FAILURE);\n                    return false;\n                }\n            }\n            else// different\n            {\n                if(rfUTF16_Decode_swap(s,&characterLength,codepoints) == false)\n                {\n                    free(codepoints);\n                    LOG_ERROR(\"String initialization failed due to invalide UTF-16 sequence\",RE_STRING_INIT_FAILURE);\n                    return false;\n                }\n            }\n        break;\n        default:\n            LOG_ERROR(\"Illegal endianess value provided\",RE_INPUT);\n            free(codepoints);\n            return false;\n        break;\n    }// switch ends\n    // now encode these codepoints into UTF8\n    if( (utf8 = rfUTF8_Encode(codepoints,characterLength,&utf8ByteLength))==0)\n    {\n        free(codepoints);\n        return false;\n    }\n    // success\n    free(codepoints);\n    str->bytes = utf8;\n    str->byteLength = utf8ByteLength;\n    return true;\n\n}\n\n// Allocates and returns a string with the given UTF-32 byte sequence. Given characters have to be in UTF-32.\nRF_String* rfString_Create_UTF32(const char* s)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_UTF32(ret,s)==false)\n    {\n        free(ret);\n        return 0;\n    }\n    return ret;\n}\n// Initializes a string with the given UTF-32 byte sequence. Given characters have to be in UTF-32.\nchar rfString_Init_UTF32(RF_String* str,const char* s)\n{\n    char swapE = false;\n    uint32_t off = 0;\n    int32_t i = 0;\n\n    // get the buffer and if swapping is needed do it for all character\n    uint32_t* codeBuffer = (uint32_t*)(s+off);\n\n    // first of all check for existence of BOM in the beginning of the sequence\n    if(RF_HEXEQ_UI(codeBuffer[0],0xFEFF))// big endian\n    {\n        if(rfUTILS_Endianess()==RF_LITTLE_ENDIAN)\n            swapE = true;\n    }\n    if(RF_HEXEQ_UI(codeBuffer[0],0xFFFE0000))// little\n    {\n        if(rfUTILS_Endianess()==RF_BIG_ENDIAN)\n            swapE = true;\n    }\n    else// according to the standard no BOM means big endian\n    {\n        if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n            swapE = true;\n    }\n\n    // if we need to have endianess swapped do it\n    if(swapE==true)\n    {\n        while(codeBuffer[i] != 0)\n        {\n            rfUTILS_SwapEndianUI(codeBuffer+i);\n            i++;\n        }\n    }\n    // find the length of the utf32 buffer in characters\n    uint32_t length;\n    rfUTF32_Length(codeBuffer,length);\n\n    // turn the codepoints into a utf-8 encoded buffer\n    char* utf8;uint32_t utf8ByteLength;\n    if((utf8=rfUTF8_Encode(codeBuffer,length,&utf8ByteLength)) == 0)\n    {\n        return false;// error\n    }\n    // if the encoding happened correctly\n    if(codeBuffer != 0)\n    {\n        str->bytes = (char*)codeBuffer;\n        str->byteLength = utf8ByteLength;\n        return true;\n    }\n    // else return failure\n    return false;\n}\n\n// Assigns the value of the source string to the destination.Both strings should already be initialized and hold a value. It is an error to give null parameters.\nvoid i_rfString_Assign(RF_String* dest,void* sourceP)\n{\n    RF_String* source = (RF_String*)sourceP;\n    // only if the new string value won't fit in the buffer reallocate the buffer (let's avoid unecessary reallocs)\n    if(source->byteLength > dest->byteLength)\n    {\n        RF_REALLOC(dest->bytes,char,source->byteLength+1);\n    }\n    // now copy the value\n    memcpy(dest->bytes,source->bytes,source->byteLength+1);\n    // and fix the lengths\n    dest->byteLength = source->byteLength;\n}\n\n// Assigns the value of a unicode character to the string\nchar rfString_Assign_char(RF_String* str,uint32_t codepoint)\n{\n    // realloc if needed\n    if(str->byteLength <5)\n    {\n        RF_REALLOC(str->bytes,char,5);\n    }\n    // if we only need a byte to encode it\n    if(RF_HEXLE_UI(codepoint,0x007f))\n    {\n        str->bytes[0] = codepoint;\n        str->bytes[1] = '\\0';\n        str->byteLength = 1;\n    }\n    // if we need 2 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x0080) && RF_HEXLE_UI(codepoint,0x07ff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[1] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 5 following bits and encode them in the second byte\n        str->bytes[0] = ((codepoint & 0x7C0) >> 6)  | (0x6<<5);\n        str->bytes[2] = '\\0';\n        str->byteLength = 2;\n    }\n    // if we need 3 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x0800) && RF_HEXLE_UI(codepoint,0x0ffff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[2] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 6 following bits and encode them in the second byte\n        str->bytes[1] = ((codepoint & 0xFC0) >> 6)  | (0x02<<6);\n        // get the 4 following bits and encode them in the third byte\n        str->bytes[0] = (((codepoint & 0xF000))>>12) | (0xE<<4);\n        str->bytes[3] = '\\0';\n        str->byteLength = 3;\n    }\n    // if we need 4 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x10000) && RF_HEXLE_UI(codepoint,0x10ffff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[3] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 6 following bits and encode them in the second byte\n        str->bytes[2] = ((codepoint & 0xFC0) >> 6)  | (0x02<<6);\n        // get the 6 following bits and encode them in the third byte\n        str->bytes[1] = (((codepoint & 0x3F000))>>12) | (0x02<<6);\n        // get the 3 following bits and encode them in the fourth byte\n        str->bytes[0] = (((codepoint & 0x1C0000))>>18) | (0x1E<<3);\n        str->bytes[4] = '\\0';\n        str->byteLength = 4;\n    }\n    else\n    {\n        LOG_ERROR(\"Attempted to encode an invalid unicode code point into a string\",RE_UTF8_INVALID_CODE_POINT);\n        return false;\n    }\n\n    return true;\n}\n\n// Allocates and returns a string with the given characters. NO VALID-UTF8 check is performed\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nRF_String* rfString_Create_nc(const char* s,...)\n#else\nRF_String* i_rfString_Create_nc(const char* s,...)\n#endif\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    // get  the formatted string\n    READ_VSNPRINTF_ARGS(s,s,0);\n    // get the lengt of the byte buffer\n    ret->byteLength = bytesWritten;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(ret->bytes,ret->byteLength+1);\n    memcpy(ret->bytes,buff,ret->byteLength+1);\n    if(buffAllocated)\n        free(buff);\n    return ret;\n}\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\nRF_String* i_NVrfString_Create_nc(const char* s)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    // get length\n    ret->byteLength = strlen(s);\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(ret->bytes,ret->byteLength+1);\n    memcpy(ret->bytes,s,ret->byteLength+1);\n    return ret;\n}\n#endif\n\n// Initializes a string with the given characters. NO VALID-UTF8 check is performed\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nchar rfString_Init_nc(struct RF_String* str,const char* s,...)\n#else\nchar i_rfString_Init_nc(struct RF_String* str,const char* s,...)\n#endif\n{\n    // get the formatted string\n    READ_VSNPRINTF_ARGS(s,s,false)\n    // get its length\n    str->byteLength = bytesWritten;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(str->bytes,str->byteLength+1);\n    memcpy(str->bytes,buff,str->byteLength+1);\n    if(buffAllocated == true)\n        free(buff);\n    return true;\n}\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\nchar i_NVrfString_Init_nc(struct RF_String* str,const char* s)\n{\n    // get its length\n    str->byteLength = strlen(s);\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(str->bytes,str->byteLength+1);\n    memcpy(str->bytes,s,str->byteLength+1);\n    return true;\n}\n#endif\n\n/*-------------------------------------------------------------------------Methods to get rid of an RF_String-------------------------------------------------------------------------------*/\n\n// Deletes a string object and also frees its pointer.It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault\nvoid rfString_Destroy(RF_String* s)\n{\n    free(s->bytes);\n    free(s);\n}\n// Deletes a string object only, not its memory.It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault\nvoid rfString_Deinit(RF_String* s)\n{\n    free(s->bytes);\n}\n/*------------------------------------------------------------------------ RF_String unicode conversio functions-------------------------------------------------------------------------------*/\n\n// Returns the strings contents as a UTF-16 buffer\nuint16_t* rfString_ToUTF16(RF_String* s,uint32_t* length)\n{\n    uint32_t* codepoints,charsN;\n    // get the unicode codepoints, no check here since RF_String is always guaranteed to have valid UTF=8 and as such valid codepoints\n    codepoints = rfUTF8_Decode(s->bytes,s->byteLength,&charsN);\n    // encode them in UTF-16, no check here since it comes from an RF_String which is always guaranteed to have valid UTF-8 and as such valid codepoints\n    return rfUTF16_Encode(codepoints,charsN,length);\n}\n\n// Returns the strings contents as a UTF-32 buffer\nuint32_t* rfString_ToUTF32(RF_String* s,uint32_t* length)\n{\n    // get the unicode codepoints, no check here since RF_String is always guaranteed to have valid UTF=8 and as such valid codepoints\n    return rfUTF8_Decode(s->bytes,s->byteLength,length);\n}\n\n/*------------------------------------------------------------------------ RF_String retrieval functions-------------------------------------------------------------------------------*/\n// Finds the length of the string in characters\nuint32_t rfString_Length(void* str)\n{\n    RF_String* s = (RF_String*)str;\n    uint32_t length,i;\n    RF_STRING_ITERATE_START(s,length,i)\n    RF_STRING_ITERATE_END(length,i);\n    return length;\n}\n\n// Retrieves the unicode code point of the parameter character.\nuint32_t rfString_GetChar(void* str,uint32_t c)\n{\n    RF_String* thisstr = (RF_String*)str;\n    uint32_t length,i;\n    uint32_t codePoint = RF_STRING_INDEX_OUT_OF_BOUNDS;\n    RF_STRING_ITERATE_START(thisstr,length,i)\n        // if we found the character,inspect the 4 different cases\n        if(length == c)\n        {\n            // take the codepoint from the byte position and break from the loop\n            codePoint = rfString_BytePosToCodePoint(thisstr,i);\n            break;\n        }\n    RF_STRING_ITERATE_END(length,i)\n\n    // and return the code point. Notice that if the character was not found this will return RF_STRING_INDEX_OUT_OF_BOUNDS\n    return codePoint;\n}\n\n// Retrieves the unicode code point of the parameter bytepos of the string. If the byte position is not the start of a character 0 is returned. This is an internal function, there is no need to use it. <i>Can be used with StringX</i>\nuint32_t rfString_BytePosToCodePoint(void* str,uint32_t i)\n{\n    uint32_t codePoint=0;\n    RF_String* thisstr = (RF_String*)str;\n    // /Here I am not checking if byte position 'i' is withing bounds and especially if it is a start of a character\n    // / This is assumed to have been checked or to be known beforehand by the programmer. That's one of the reasons\n    // / why this is an internal function and should not be used unless you know what you are doing\n    // if the lead bit of the byte is 0 then range is : U+0000 to U+0007F (1 byte)\n    if( ((thisstr->bytes[i] & 0x80)>>7) == 0 )\n    {\n        // and the code point is this whole byte only\n        codePoint = thisstr->bytes[i];\n    }\n    // if the leading bits are in the form of 0b110xxxxx then range is: U+0080 to U+07FF (2 bytes)\n    else if ( RF_HEXEQ_C( ( (~(thisstr->bytes[i] ^  0xC0))>>5),0x7) )\n    {\n        codePoint =0;\n        // from the second byte take the first 6 bits\n        codePoint = (thisstr->bytes[i+1] & 0x3F) ;\n        // from the first byte take the first 5 bits and put them in the start\n        codePoint |= ((thisstr->bytes[i] & 0x1F) << 6);\n    }\n    // if the leading bits are in the form of 0b1110xxxx then range is U+0800 to U+FFFF  (3 bytes)\n    else if( RF_HEXEQ_C( ( (~(thisstr->bytes[i] ^ 0xE0))>>4),0xF) )\n    {\n        codePoint = 0;\n        // from the third byte take the first 6 bits\n        codePoint = (thisstr->bytes[i+2] & 0x3F) ;\n        // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n        codePoint |= ((thisstr->bytes[i+1] & 0x3F) << 6);\n        // from the first byte take the first 4 bits and put them to the left of the previous 6 bits\n        codePoint |= ((thisstr->bytes[i] & 0xF) << 12);\n    }\n    // if the leading bits are in the form of 0b11110xxx then range is U+010000 to U+10FFFF (4 bytes)\n    else if( RF_HEXEQ_C( ( (~(thisstr->bytes[i] ^ 0xF0))>>3), 0x1F))\n    {\n        codePoint = 0;\n        // from the fourth byte take the first 6 bits\n        codePoint = (thisstr->bytes[i+3] & 0x3F) ;\n        // from the third byte take the first 6 bits and put them to the left of the previous 6 bits\n        codePoint |= ((thisstr->bytes[i+2] & 0x3F) << 6);\n        // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n        codePoint |= ((thisstr->bytes[i+1] & 0x3F) << 12);\n        // from the first byte take the first 3 bits and put them to the left of the previous 6 bits\n        codePoint |= ((thisstr->bytes[i] & 0x7) << 18);\n    }\n\n    return codePoint;\n}\n\n\n// Retrieves character position of a byte position\nuint32_t rfString_BytePosToCharPos(void* thisstrP,uint32_t bytepos,char before)\n{\n    // /here there is no check if this is actually a byte pos inside the string's\n    // /byte buffer. The programmer should have made sure it is before hand. This is why it is\n    // / an internal function and should only be used if you know what you are doing\n    RF_String* thisstr = (RF_String*)thisstrP;\n    uint32_t charPos = 0;\n    uint32_t byteI = 0;\n    // iterate the string's bytes until you get to the required byte\n    // if it is not a continuation byte, return the position\n    if(rfUTF8_IsContinuationByte(thisstr->bytes[bytepos])==false)\n    {\n        RF_STRING_ITERATE_START(thisstr,charPos,byteI)\n            if(byteI == bytepos)\n                return charPos;\n        RF_STRING_ITERATE_END(charPos,byteI)\n    }\n    // else  iterate the string's bytes until you get anything bigger than the required byte\n    RF_STRING_ITERATE_START(thisstr,charPos,byteI)\n        if(byteI > bytepos)\n            break;\n    RF_STRING_ITERATE_END(charPos,byteI)\n    // if we need the previous one return it\n    if(before == true)\n        return charPos-1;\n    // else return this\n    return charPos;\n}\n\n// Compares two Strings and returns true if they are equal and false otherwise\nchar i_rfString_Equal(void* s1P,void* s2P)\n{\n    RF_String* s1 = (RF_String*)s1P;\n    RF_String* s2 = (RF_String*)s2P;\n    if( strcmp(s1->bytes,s2->bytes)==0)\n    {\n        return true;\n    }\n    return false;\n}\n\n// Finds the existence of String sstr inside this string, either matching case or not\nint32_t i_rfString_Find(const void* str,const void* sstrP,const char* optionsP)\n{\n    // / @note TO SELF: If I make any changes to this function do not forget to change the private version that returns byte position too\n    // / located at string_private.c and called rfString_FindByte and rfString_FindByte_s\n    RF_String* thisstr = (RF_String*)str;\n    RF_String* sstr = (RF_String*)sstrP;\n    char options = *optionsP;\n\n    char* found = 0;\n    // if we want to match the case of the string then it's a simple search of matching characters\n    if( (RF_BITFLAG_ON( options,RF_CASE_IGNORE)) == false)\n    {\n        // if it is not found\n        if( (found = strstr(thisstr->bytes,sstr->bytes)) == 0)\n        {\n            return RF_FAILURE;\n        }\n        // get the byte position\n        uint32_t bytepos = found-thisstr->bytes;\n        // if we need the exact string as it is given\n        if(RF_BITFLAG_ON( options,RF_MATCH_WORD))\n        {\n            // check before the found string\n            if(bytepos != 0)\n            {\n                // if is is not a character\n                switch(thisstr->bytes[bytepos-1])\n                {\n                    case ' ':case '\\t':case '\\n':\n                    break;\n                    default:\n                        return RF_FAILURE;\n                    break;\n                }\n            }\n            // check after the found string\n            if(bytepos+sstr->byteLength != thisstr->byteLength)\n            {\n                // if is is not a character\n                switch(thisstr->bytes[bytepos+sstr->byteLength])\n                {\n                    case ' ':case '\\t':case '\\n':\n                    break;\n                    default:\n                        return RF_FAILURE;\n                    break;\n                }\n            }\n        }// end of the exact string option\n        // success\n        return rfString_BytePosToCharPos(thisstr,bytepos,false);\n    }\n\n    // else ignore case matching\n    uint32_t i,j;\n    // if(cstr[0] >= 0x41 && cstr[0] <= 0x5a)\n    for(i=0;i<thisstr->byteLength; i ++)\n    {\n        // if i matches the start of the substring\n        for(j = 0; j < sstr->byteLength; j++)\n        {\n            // if the jth char is a big letter\n            if(sstr->bytes[j] >= 0x41 && sstr->bytes[j] <= 0x5a)\n            {\n                // no match\n                if(sstr->bytes[j] != thisstr->bytes[i+j] && sstr->bytes[j]+32 != thisstr->bytes[i+j])\n                    break;\n                // there is a match in the jth character so let's perform additional checks if needed\n                if(RF_BITFLAG_ON( options,RF_MATCH_WORD))\n                {\n                    // if it's the first substring character and if the string we search is not in it's beginning, check for EXACT string before\n                    if(j == 0 && i != 0)\n                    {\n                        switch(thisstr->bytes[i-1])\n                        {\n                            case ' ':case '\\t':case '\\n':\n                            break;\n                            default:\n                                return RF_FAILURE;\n                            break;\n                        }\n                    }\n                }// exact string check if ends\n            }\n            // small letter\n            else if(sstr->bytes[j] >= 0x61 && sstr->bytes[j] <= 0x7a)\n            {\n                // no match\n                if(sstr->bytes[j] != thisstr->bytes[i+j] && sstr->bytes[j]-32 != thisstr->bytes[i+j])\n                    break;\n                // there is a match in the jth character so let's perform additional checks if needed\n                if(RF_BITFLAG_ON(options,RF_MATCH_WORD))\n                {\n                    // if it's the first substring character and if the string we search is not in it's beginning, check for EXACT string before\n                    if(j == 0 && i != 0)\n                    {\n                        switch(thisstr->bytes[i-1])\n                        {\n                            case ' ':case '\\t':case '\\n':\n                            break;\n                            default:\n                                return RF_FAILURE;\n                            break;\n                        }\n                    }\n                }// exact string check if ends\n            }\n            // not a letter and no match\n            else if(sstr->bytes[j] != thisstr->bytes[i+j])\n                break;// break off the substring search loop\n\n            // if we get here and it's the last char of the substring we either found it or need to perform one last check for exact string\n            if(j == sstr->byteLength-1)\n            {\n                // only if the end of the string is not right after the substring\n                if( RF_BITFLAG_ON(options,RF_MATCH_WORD) && i+sstr->byteLength < thisstr->byteLength)\n                {\n                    switch(thisstr->bytes[i+sstr->byteLength])\n                    {\n                        case ' ':case '\\t':case '\\n':\n                        break;\n                        default:\n                            return RF_FAILURE;\n                        break;\n                    }\n                }// end of the exact string check\n                // succes\n                return rfString_BytePosToCharPos(thisstr,i,false);\n            }// end of it's the last char of the substring check\n        }// substring iteration ends\n    }// this string iteration ends\n    return RF_FAILURE;\n}\n\n// Returns the integer value of the string if and only if it contains only numbers. If it contains anything else the function fails.\nchar rfString_ToInt(void* str,int32_t* v)\n{\n    RF_String* thisstr = (RF_String*)str;\n    char* end;\n    // get the integer\n    *v = strtol ( thisstr->bytes, &end,10);\n\n// /This is the non-strict case. Takes the number out of the string no matter what else it has inside\n/*    // if we did get something\n    if(strlen(end) < this->length())\n        return true;\n*/\n// /This is the strict case, and the one we will go with. The non-strict case might be moved to its own function, if ever in the future\n    if(end[0] == '\\0')\n        return true;\n\n    // else false\n    return false;\n}\n\n// Returns the float value of a String\nint rfString_ToDouble(void* thisstrP,double* f)\n{\n    RF_String* str = (RF_String*)thisstrP;\n    *f = strtod(str->bytes,NULL);\n    // check the result\n    if(*f == 0.0)\n    {\n        // if it's zero and the string equals to zero then we are okay\n        if(rfString_Equal(str,RFS_(\"0\")) || rfString_Equal(str,RFS_(\"0.0\")))\n            return RF_SUCCESS;\n        // underflow error\n        if(errno == ERANGE)\n            return RE_STRING_TOFLOAT_UNDERFLOW;\n        // in any other case it's a conversion error\n        return RE_STRING_TOFLOAT;\n    }\n    // if the result is a HUGE_VAL and errno is set,the number is not representable by a double\n    if(*f == HUGE_VAL && errno == ERANGE)\n        return RE_STRING_TOFLOAT_RANGE;\n\n    // any other case success\n    return RF_SUCCESS;\n}\n\n// Returns a cstring version of the string.\nconst char* rfString_ToCstr(const void* str)\n{\n    RF_String* thisstr = (RF_String*)str;\n    return thisstr->bytes;\n}\n\n// Creates and returns an allocated copy of the given string\nRF_String* rfString_Copy_OUT(void* srcP)\n{\n    RF_String* src = (RF_String*)srcP;\n    // create the new string\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    // get the length\n    ret->byteLength = src->byteLength;\n    // copy the bytes\n    RF_MALLOC(ret->bytes,ret->byteLength+1);\n    memcpy(ret->bytes,src->bytes,ret->byteLength+1);\n    return ret;\n\n}\n// Copies all the contents of a string to another\nvoid rfString_Copy_IN(RF_String* dst,void* srcP)\n{\n    RF_String* src = (RF_String*)srcP;\n    // get the length\n    dst->byteLength = src->byteLength;\n    // copy the bytes\n    RF_MALLOC(dst->bytes,src->byteLength+1);\n    memcpy(dst->bytes,src->bytes,dst->byteLength+1);\n    return;\n\n}\n// Copies a certain number of characters from a string\nvoid rfString_Copy_chars(RF_String* dst,void* srcP,uint32_t charsN)\n{\n    uint32_t i = 0,bytePos;\n    RF_String* src = (RF_String*)srcP;\n\n    // find the byte position until which we need to copy\n    RF_STRING_ITERATE_START(src,i,bytePos)\n        if(i == charsN)\n            break;\n    RF_STRING_ITERATE_END(i,bytePos)\n    dst->byteLength = bytePos;\n    RF_MALLOC(dst->bytes,dst->byteLength+1);\n    memcpy(dst->bytes,src->bytes,dst->byteLength+1);\n    dst->bytes[dst->byteLength] = '\\0';// null terminate it\n}\n\n\n// Applies a limited version of sscanf after the specified substring\nchar i_rfString_ScanfAfter(void* str,void* afterstrP,const char* format,void* var)\n{\n    RF_String* thisstr = (RF_String*)str;\n    RF_String* afterstr = (RF_String*)afterstrP;\n    // return false if the substring is not found\n    char* found,*s;\n    if( (found = strstr(thisstr->bytes,afterstr->bytes)) ==0 )\n    {\n        return false;\n    }\n    // get a pointer to the start of the position where sscanf will be used\n    s = thisstr->bytes + (found-thisstr->bytes+afterstr->byteLength);\n\n    // use sscanf\n    if(sscanf(s,format,var) <=0)\n    {\n        return false;\n    }\n    return true;\n}\n\n// Counts how many times a substring s occurs inside the string\nint32_t i_rfString_Count(void* str,void* sstr2,const char* optionsP)\n{\n    RF_String* thisstr = (RF_String*)str;\n    RF_String* sstr = (RF_String*)sstr2;\n    char options = *optionsP;\n    int32_t index = 0;\n    int32_t move;\n    int32_t n = 0;\n\n    // as long as the substring is found in the string\n    while ((move = rfString_FindBytePos(thisstr,sstr,options)) != RF_FAILURE)\n    {\n        move+= sstr->byteLength;\n        // proceed searching inside the string and also increase the counter\n        n++;\n        thisstr->bytes+=move;\n        index +=move;\n        thisstr->byteLength -=move;\n    }\n\n    // return string to its original state and return the number of occurences, also returns 0 if not found\n    thisstr->bytes-=index;\n    thisstr->byteLength += index;\n    // success\n    return n;\n}\n\n// Tokenizes the given string. Separates it into @c tokensN depending on how many substrings can be created from the @c sep separatior and stores them\n// into the Array of RF_String* that should be passed to the function\ni_DECLIMEX_ char rfString_Tokenize(void* str,char* sep,uint32_t* tokensN,RF_String** tokens)\n{\n    RF_String* thisstr = (RF_String*)str;\n    uint32_t i;\n    // first find the occurences of the separator, and then the number of tokens\n    *tokensN = rfString_Count(thisstr,RFS_(sep),0)+1;\n    // error checking\n    if(*tokensN == 0)\n        return false;\n\n    // allocate the tokens\n    RF_MALLOC(*tokens,sizeof(RF_String) *(*tokensN));\n    // find the length of the separator\n    uint32_t sepLen = strlen(sep);\n    char* s,*e;\n    s = thisstr->bytes;\n    for(i = 0; i < (*tokensN)-1; i ++)\n    {\n        // find each substring\n        e = strstr(s,sep);\n        (*tokens)[i].byteLength = e-s;\n        RF_MALLOC((*tokens)[i].bytes,(*tokens)[i].byteLength+1);\n        // put in the data\n        strncpy((*tokens)[i].bytes,s,(*tokens)[i].byteLength);\n        // null terminate\n        (*tokens)[i].bytes[(*tokens)[i].byteLength] = '\\0';\n\n        // prepare for next sub-string\n        s = e+sepLen;\n\n    }\n    // /make sure that if it's the last substring we change strategy\n    (*tokens)[i].byteLength = strlen(s);\n    RF_MALLOC((*tokens)[i].bytes,(*tokens)[i].byteLength+1);\n    // put in the data\n    strncpy((*tokens)[i].bytes,s,(*tokens)[i].byteLength);\n    // null terminate\n    (*tokens)[i].bytes[(*tokens)[i].byteLength] = '\\0';\n\n    // success\n    return true;\n}\n// Initializes the given string as the first substring existing between the left and right parameter substrings.\nchar i_rfString_Between(void* thisstrP,void* lstrP,void* rstrP,RF_String* result,const char* optionsP)\n{\n    int32_t start,end;\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* lstr = (RF_String*)lstrP;\n    RF_String* rstr = (RF_String*)rstrP;\n    char options = *optionsP;\n    RF_String temp;\n    // find the left substring\n    if( (start = rfString_FindBytePos(thisstr,lstr,options))== RF_FAILURE)\n    {\n        return false;\n    }\n    // get what is after it\n    rfString_After(thisstr,lstr,&temp,options);\n    // find the right substring in the remaining part\n    if( (end = rfString_FindBytePos(&temp,rstr,options))== RF_FAILURE)\n    {\n        return false;\n    }\n    // free temp string\n    rfString_Deinit(&temp);\n    // initialize the string to return\n    result->byteLength = end;\n    RF_MALLOC(result->bytes,result->byteLength+1);\n    memcpy(result->bytes,thisstr->bytes+start+lstr->byteLength,result->byteLength+1);\n    result->bytes[end]= '\\0';\n    // success\n    return true;\n}\n\n// Initializes the given string as the substring from the start until any of the given Strings are found.\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nchar rfString_Beforev(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP, ...)\n#else\nchar i_rfString_Beforev(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP, ...)\n#endif\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* s;\n    char options = *optionsP;\n    unsigned char parN = *parNP;\n    int32_t i,minPos,thisPos;\n    // will keep the argument list\n    va_list argList;\n    // get the parameter characters\n    va_start(argList,parNP);\n\n    minPos = 9999999;\n    for(i = 0; i < parN; i++)\n    {\n        s = (RF_String*) va_arg(argList,RF_String*);\n        if( (thisPos= rfString_FindBytePos(thisstr,s,options))!= RF_FAILURE)\n        {\n            if(thisPos < minPos)\n                minPos = thisPos;\n        }\n    }\n    va_end(argList);\n\n    // if it is not found\n    if(minPos == 9999999)\n    {\n        return false;\n    }\n    // if it is found initialize the substring\n    result->byteLength = minPos;\n    RF_MALLOC(result->bytes,minPos+1);\n    memcpy(result->bytes,thisstr->bytes,minPos);\n    result->bytes[minPos] = '\\0';\n    // success\n    return true;\n}\n\n// Initializes the given string as the substring from the start until the given string is found\nchar i_rfString_Before(void* thisstrP,void* sstrP,RF_String* result,const char* optionsP)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* sstr = (RF_String*) sstrP;\n    char options = *optionsP;\n    int32_t ret;\n    // find the substring\n    if( (ret = rfString_FindBytePos(thisstr,sstr,options)) == RF_FAILURE)\n    {\n        return false;\n    }\n    // if it is found get the result initialize the substring\n    result->byteLength = ret;\n    RF_MALLOC(result->bytes,result->byteLength+1);\n    memcpy(result->bytes,thisstr->bytes,result->byteLength);\n    result->bytes[result->byteLength] = '\\0';\n    // success\n    return true;\n}\n\n\n// Initializes the given String with the substring located after (and not including) the after substring inside the parameter string. If the substring is not located the function returns false.\nchar i_rfString_After(void* thisstrP,void* afterP,RF_String* out,const char* optionsP)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* after = (RF_String*)afterP;\n    char options = *optionsP;\n    int32_t bytePos;\n    // check for substring existence\n    if( (bytePos = rfString_FindBytePos(thisstr,after,options)) == RF_FAILURE)\n    {\n        return false;\n    }\n    // done so let's get it. Notice the use of the non-checking initialization\n    rfString_Init_nc(out,thisstr->bytes+bytePos+after->byteLength);\n    // success\n    return true;\n}\n\n\n// Initialize a string after the first of the given substrings found\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nchar rfString_Afterv(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP,...)\n#else\nchar i_rfString_Afterv(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP,...)\n#endif\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* s;\n    char options = *optionsP;\n    unsigned char parN = *parNP;\n    int32_t i,minPos,thisPos;\n    uint32_t minPosLength;\n    // will keep the argument list\n    va_list argList;\n    // get the parameter characters\n    va_start(argList,parNP);\n\n    minPos = 9999999;\n    for(i = 0; i < parN; i++)\n    {\n        s = (RF_String*) va_arg(argList,RF_String*);\n        if( (thisPos= rfString_FindBytePos(thisstr,s,options))!= RF_FAILURE)\n        {\n            if(thisPos < minPos)\n            {\n                minPos = thisPos;\n                minPosLength = s->byteLength;\n            }\n        }\n    }\n    va_end(argList);\n    // if it is not found\n    if(minPos == 9999999)\n    {\n        return false;\n    }\n    // if it is found initialize the substring\n    minPos += minPosLength;// go after the found substring\n    result->byteLength = thisstr->byteLength-minPos;\n    RF_MALLOC(result->bytes,result->byteLength);\n    memcpy(result->bytes,thisstr->bytes+minPos,result->byteLength);\n    result->bytes[result->byteLength] = '\\0';\n    // success\n    return true;\n}\n\n/*------------------------------------------------------------------------ RF_String manipulation functions-------------------------------------------------------------------------------*/\n\n\n// Appends the parameter String to this one\nvoid i_rfString_Append(RF_String* thisstr,void* otherP)\n{\n    RF_String* other = (RF_String*)otherP;\n    // /@note Here if a null addition is given lots of actions are done but the result is safe and the same string as the one entered.\n    // /A check here would result in an additional check for every appending so I decided against it\n    // calculate the new length\n    thisstr->byteLength +=other->byteLength;\n    // reallocate this string to fit the new addition\n    RF_REALLOC(thisstr->bytes,char,thisstr->byteLength+1);\n    // add the string to this one\n    strncat(thisstr->bytes,other->bytes,other->byteLength);\n}\n\n// Appends an integer to the string\nvoid rfString_Append_i(RF_String* thisstr,const int32_t i)\n{\n    // create a new buffer for the string big enough to fit any number plus the original string\n    char* buff;\n    RF_MALLOC(buff,thisstr->byteLength+15);// max uint32_t is 4,294,967,295 in most environment so 12 chars will certainly fit it\n    // put the int32_t inside the string\n    sprintf(buff,\"%s%i\",thisstr->bytes,i);\n    // free the previous c string\n    free(thisstr->bytes);\n    // point the string pointer to the new string\n    thisstr->bytes = buff;\n    thisstr->byteLength = strlen(thisstr->bytes);\n}\n// Appends a float to the string. <b>Can't be used with RF_StringX</b>\nvoid rfString_Append_f(RF_String* thisstr,const float f)\n{\n    // a temporary buffer to hold the float and the string\n    char* buff;\n    RF_MALLOC(buff,thisstr->byteLength+64);\n    // put the float inside the string\n    sprintf(buff,\"%s%f\",thisstr->bytes,f);\n    // free the previous c string\n    free(thisstr->bytes);\n    // point the string pointer to the new string\n    thisstr->bytes = buff;\n    thisstr->byteLength = strlen(thisstr->bytes);\n}\n\n// Prepends the parameter String to this string\nvoid i_rfString_Prepend(RF_String* thisstr,void* otherP)\n{\n    RF_String* other = (RF_String*)otherP;\n    uint32_t size;\n    int32_t i;// is not unsigned since it goes to -1 in the loop\n    // keeep the original byte size of the string\n    size = thisstr->byteLength;\n    // calculate the new lengths\n    thisstr->byteLength += other->byteLength;\n    // reallocate this string to fit the new addition\n    RF_REALLOC(thisstr->bytes,char,thisstr->byteLength+1);\n    // move the pre-existing string to the end of the buffer, by dislocating each byte by cstrlen\n    for(i =size; i >=0 ; i--)\n        thisstr->bytes[i+other->byteLength] = thisstr->bytes[i];\n    // and now add the new string to the start\n    memcpy(thisstr->bytes,other->bytes,other->byteLength);\n}\n\n// Removes all of the specifed string occurences from this String matching case or not, DOES NOT reallocate buffer size.\nchar i_rfString_Remove(void* thisstrP,void* rstrP,uint32_t* numberP,const char* optionsP)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* rstr = (RF_String*)rstrP;\n    char options = *optionsP;\n    uint32_t number = *numberP;\n    uint32_t i,count,occurences=0;\n    int32_t bytePos;\n    char found = false;\n    // as long as we keep finding rstr in the string keep removing it\n    do\n    {   // if the substring is not found\n        if( (bytePos = rfString_FindBytePos(thisstr,rstr,options)) == RF_FAILURE)\n        {\n            // if we have not even found it once , we fail\n            if(found == false)\n            {\n                return false;\n            }\n            else // else we are done\n                break;\n        }\n\n        // substring found\n        found = true;\n        // move all of the string a position back\n        count = 0;\n        for(i = bytePos; i <=thisstr->byteLength; i ++)\n        {\n            thisstr->bytes[i] = thisstr->bytes[i+rstr->byteLength];\n            count++;\n        }\n        // now change the byte length\n        thisstr->byteLength -= rstr->byteLength;\n        // count the number of occurences and if we reached the required amount, stop\n        occurences++;\n        if(occurences == number)\n            break;\n    }while(bytePos != RF_FAILURE);\n    // succcess\n    return true;\n}\n\n// Removes all of the characters of the string except those specified\nvoid i_rfString_KeepOnly(void* thisstrP,void* keepstrP)\n{\n    uint32_t keepLength,i,j,charValue,temp;\n    uint32_t *keepChars;\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* keepstr = (RF_String*)keepstrP;\n    char exists,charBLength;\n    // first let's get all of the characters of the keep string in an array\n    i=0;\n    keepLength = rfString_Length(keepstr);\n    RF_MALLOC(keepChars,4*keepLength);\n    rfString_Iterate_Start(keepstr,i,charValue)\n        keepChars[i] = charValue;\n    rfString_Iterate_End(i)\n    // now iterate every character of this string\n    i=0;\n    rfString_Iterate_Start(thisstr,i,charValue)\n        // for every character check if it exists in the keep str\n        exists = false;\n        for(j=0;j<keepLength; j++)\n        {\n            if(keepChars[j] == charValue)\n                exists = true;\n        }\n        // if it does not exist, move the string back to cover it so that it effectively gets deleted\n        if(exists == false)\n        {\n            charBLength = rfUTF8_FromCodepoint(charValue,&temp);\n            // this is kind of a non-clean way to do it. the rfString_Iterate_Start macro internally uses a byteIndex_ variable\n            // we use that here to determine the current byteIndex_ of the string in the iteration and move the string backs\n            memmove(thisstr->bytes+byteIndex_,thisstr->bytes+byteIndex_+charBLength,thisstr->byteLength-byteIndex_+charBLength);\n            thisstr->byteLength-=charBLength;\n            continue;// by contiuing here we make sure that the current string position won't be moved to assure that we also check the newly move characters\n        }\n    rfString_Iterate_End(i)\n    // before returning free the keep string's character array\n    free(keepChars);\n}\n\n// Removes the first n characters from the start of the string\nchar rfString_PruneStart(void* thisstrP,uint32_t n)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    // iterate the characters of the string\n    uint32_t i;\n    uint32_t length = 0;\n    unsigned nBytePos = 0;\n    char found = false;\n    RF_STRING_ITERATE_START(thisstr,length,i);\n        // if we reach the number of characters passed as a parameter, note it\n        if(length == n)\n        {\n            // remember that now i is the byte position we need\n            nBytePos = i;\n            found = true;\n            break;\n        }\n    RF_STRING_ITERATE_END(length,i)\n\n    // if the string does not have n chars to remove it becomes an empty string and we return failure\n    if(found == false)\n    {\n        thisstr->bytes[0] = '\\0';\n        thisstr->byteLength = 0;\n        return false;\n    }\n\n    // move the string back to cover the empty places.reallocation here would be an overkill, everything will be freed together when the string gets freed\n    for(i =0; i < thisstr->byteLength-nBytePos+1;i++ )\n        thisstr->bytes[i] = thisstr->bytes[i+nBytePos];\n\n    // get the new bytelength\n    thisstr->byteLength -= nBytePos;\n\n    return true;\n}\n\n// Removes the last n characters from the end of the string\nchar rfString_PruneEnd(void* thisstrP,uint32_t n)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    // start the iteration of the characters from the end of the string\n    int32_t nBytePos = -1;\n    uint32_t length,i;\n    RF_STRING_ITERATEB_START(thisstr,length,i)\n        // if we found the requested number of characters from the end of the string\n        if(length == n)\n        {\n            // remember that now i is the byte position we need\n            nBytePos = i;\n            break;\n        }\n    RF_STRING_ITERATEB_END(length,i)\n\n    // if the string does not have n chars to remove it becomes an empty string and we return failure\n    if(nBytePos == -1)\n    {\n        thisstr->bytes[0] = '\\0';\n        return false;\n    }\n\n    // just set the end of string character characters back, reallocation here would be an overkill, everything will be freed together when the string gets freed\n    thisstr->bytes[nBytePos] = '\\0';\n    // and also set the new byte length\n    thisstr->byteLength -= (thisstr->byteLength - nBytePos);\n    // success\n    return true;\n}\n\n// Removes n characters from the position p of the string counting backwards. If there is no space to do so, nothing is done and returns false.\nchar rfString_PruneMiddleB(void* thisstrP,uint32_t p,uint32_t n)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    // if we ask to remove more characters from the position that it would be possible do nothign and return false\n    if(n>p+1)\n        return false;\n\n    // iterate the characters of the string\n    uint32_t j,i,length;\n    int32_t pBytePos,nBytePos;\n    pBytePos = nBytePos = -1;\n    RF_STRING_ITERATE_START(thisstr,length,i)\n        // if we reach the number of characters passed as a parameter, note it\n        if(length == p+1)\n        {\n            // we search for p+1  because we want to include all of the p character\n            pBytePos = i;\n            // also break since we don't care after position p\n            break;\n        }\n        if(length == p-n+1)// +1 is to make sure that indexing works from 0\n            nBytePos = i;\n\n    RF_STRING_ITERATE_END(length,i)\n\n    // if the position was not found in the string do nothing\n    if(pBytePos == -1 || nBytePos == -1)\n        return false;\n\n    // move the bytes in the buffer to remove the requested characters\n    for(i=nBytePos,j=0;j<= thisstr->byteLength-pBytePos+1; i ++,j++) // here +2 is for (+1 for pbytePos to go to the start of pth character) (+1 for the byteLength to include the null termination character)\n    {\n        thisstr->bytes[i] = thisstr->bytes[pBytePos+j];\n    }\n\n    // find the new byte length\n    thisstr->byteLength -= (nBytePos - pBytePos);\n\n    return true;\n}\n\n// Removes n characters from the position p of the string counting forwards. If there is no space, nothing is done and returns false.\nchar rfString_PruneMiddleF(void* thisstrP,uint32_t p,uint32_t n)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    // iterate the characters of the string\n    uint32_t j,i,length;\n    int32_t pBytePos,nBytePos;\n    pBytePos = nBytePos = -1;\n    RF_STRING_ITERATE_START(thisstr,length,i)\n        // if we reach the number of characters passed as a parameter, note it\n        if(length == p)\n            pBytePos = i;\n\n        if(length == p+n)\n        {\n            nBytePos = i;\n            break;// since we got all the data we needed\n        }\n\n    RF_STRING_ITERATE_END(length,i)\n\n    // if the position was not found in the string do nothing\n    if(pBytePos == -1 )\n        return false;\n\n    // if we did not find the byte position of p+n then we remove everything from pBytePos until the end of the string\n    if(nBytePos == -1)\n    {\n        thisstr->bytes[pBytePos] = '\\0';\n        thisstr->byteLength -= (thisstr->byteLength-pBytePos);\n        return true;\n    }\n\n    // move the bytes in the buffer to remove the requested characters\n    for(i=pBytePos,j=0;j<= thisstr->byteLength-nBytePos+1; i ++,j++) // here +2 is for (+1 for pbytePos to go to the start of pth character) (+1 for the byteLength to include the null termination character)\n    {\n        thisstr->bytes[i] = thisstr->bytes[nBytePos+j];\n    }\n\n    // find the new byte length\n    thisstr->byteLength -= (nBytePos - pBytePos);\n    return true;\n}\n\n// Replaces all of the specified sstr substring from the String with rstr and reallocates size, unless the new size is smaller\nchar i_rfString_Replace(RF_String* thisstr,void* sstrP,void* rstrP,const uint32_t* numP,const char* optionsP)\n{\n    RF_String* sstr = (RF_String*)sstrP;\n    RF_String* rstr = (RF_String*)rstrP;\n    char options = *optionsP;\n    uint32_t num = *numP;\n    RF_StringX temp;// just a temporary string for finding the occurences\n    // will keep the number of found instances of the substring\n    uint32_t foundN = 0;\n    // will keep the number of given instances to find\n    uint32_t number = num;\n    uint32_t diff,i,j;\n    // if the substring string is not even found return false\n    if(rfString_FindBytePos(thisstr,sstr,options) == RF_FAILURE)\n    {\n        return false;\n    }\n    // create a buffer that will keep the byte positions\n    uint32_t bSize = 50;\n    int32_t * bytePositions;\n    RF_MALLOC(bytePositions,bSize*sizeof(int32_t));\n    // if the given num is 0 just make sure we replace all\n    if(number == 0)\n        number = 999999;// max number of occurences\n\n    // find how many occurences exist\n    rfStringX_FromString_IN(&temp,thisstr);\n    while( (bytePositions[foundN] = rfString_FindBytePos(&temp,sstr,options))  != RF_FAILURE)\n    {\n        int32_t move = bytePositions[foundN] + sstr->byteLength;\n        bytePositions[foundN] = bytePositions[foundN]+temp.bIndex;\n        temp.bIndex += move;\n        temp.bytes += move;\n        temp.byteLength -= move;\n        foundN++;\n        // if buffer is in danger of overflow realloc it\n        if(foundN > bSize)\n        {\n            bSize *=2;\n            RF_REALLOC(bytePositions,int32_t,bSize);\n        }\n        // if we found the required number of occurences break;\n        if(foundN >= number)\n            break;\n    }\n    rfStringX_Deinit(&temp);\n    // make sure that the number of occurence to replace do not exceed the actual number of occurences\n    if(number > foundN)\n        number = foundN;\n    // act depending on the size difference of rstr and sstr\n    if(rstr->byteLength > sstr->byteLength) // replace string is bigger than the removed one\n    {\n        int32_t orSize,nSize;\n\n        diff = rstr->byteLength - sstr->byteLength;\n        // will keep the original size in bytes\n        orSize = thisstr->byteLength +1;\n        // reallocate the string to fit the new bigger size\n        nSize= orSize + number*diff;\n        RF_REALLOC(thisstr->bytes,char,nSize)\n        // now replace all the substrings one by one\n        for(i = 0; i < number; i ++)\n        {\n            // move all of the contents of the string to fit the replacement\n            for(j =orSize+diff-1; j > bytePositions[i]+sstr->byteLength; j -- )\n                thisstr->bytes[j] = thisstr->bytes[j-diff];\n            // copy in the replacement\n            strncpy(thisstr->bytes+bytePositions[i],rstr->bytes,rstr->byteLength);\n            // also increase the original size (since now we moved the whole string by one replacement)\n            orSize += diff;\n            // also increase all the subsequent found byte positions since there is a change of string size\n            for(j = i+1; j < number; j ++)\n                bytePositions[j] = bytePositions[j]+diff;\n\n        }\n        // finally let's keep the new byte length\n        thisstr->byteLength = nSize-1;\n    }\n    else if( rstr->byteLength < sstr->byteLength) // replace string is smaller than the removed one\n    {\n        // get the differenc in byte length of removed substring and replace string\n        diff = sstr->byteLength-rstr->byteLength;\n\n        // now replace all the substrings one by one\n        for(i =0; i < number; i ++)\n        {\n            // copy in the replacement\n            strncpy(thisstr->bytes+bytePositions[i],rstr->bytes,rstr->byteLength);\n            // move all of the contents of the string to fit the replacement\n            for(j =bytePositions[i]+rstr->byteLength; j < thisstr->byteLength; j ++ )\n                thisstr->bytes[j] = thisstr->bytes[j+diff];\n            // also decrease all the subsequent found byte positions since there is a change of string size\n            for(j = i+1; j < number; j ++)\n                bytePositions[j] = bytePositions[j]-diff;\n        }\n        // finally let's keep the new byte length\n        thisstr->byteLength -= diff*number;\n        // just note that reallocating downwards is not necessary\n    }\n    else // replace and remove strings are equal\n    {\n        for(i = 0; i < number; i ++)\n            strncpy(thisstr->bytes+bytePositions[i],rstr->bytes,rstr->byteLength);\n    }\n    free(bytePositions);\n    // success\n    return true;\n}\n\n// Removes all characters of a substring only from the start of the String\nchar i_rfString_StripStart(void* thisstrP,void* subP)\n{\n    RF_String* thisstr = (RF_String*) thisstrP;\n    RF_String*sub = (RF_String*) subP;\n    char ret = false,noMatch;\n    uint32_t charValue,i = 0,*subValues,j,subLength,bytePos;\n\n    // firstly get all of the characters of the substring in an array\n    subLength = rfString_Length(sub);\n    RF_MALLOC(subValues,4*subLength)\n    rfString_Iterate_Start(sub,i,charValue)\n    subValues[i] = charValue;\n    rfString_Iterate_End(i)\n\n    // iterate thisstring from the beginning\n    i = 0;\n    RF_STRING_ITERATE_START(thisstr,i,bytePos)\n        noMatch = true;\n        // for every substring character\n        for(j = 0;j < subLength; j++)\n        {\n            // if we got a match\n            if(rfString_BytePosToCodePoint(thisstr,bytePos) == subValues[j])\n            {\n                ret = true;\n                noMatch = false;\n                break;\n            }\n        }\n        // if we get out of iterating the substring without having found a match, we get out of the iteration in general\n        if(noMatch)\n            break;\n    RF_STRING_ITERATE_END(i,bytePos)\n\n    // if we had any match\n    if(ret == true)\n    {\n        // remove the characters\n        for(i =0; i < thisstr->byteLength-bytePos+1;i++ )\n            thisstr->bytes[i] = thisstr->bytes[i+bytePos];\n        // also change bytelength\n        thisstr->byteLength -= bytePos;\n    }\n    // free stuff and return\n    free(subValues);\n    return ret;\n}\n\n// Removes all characters of a substring starting from the end of the String\nchar i_rfString_StripEnd(void* thisstrP,void* subP)\n{\n    RF_String* thisstr = (RF_String*) thisstrP;\n    RF_String*sub = (RF_String*) subP;\n    char ret = false,noMatch;\n    uint32_t charValue,i = 0,*subValues,j,subLength,bytePos,lastBytePos,testity;\n\n    // firstly get all of the characters of the substring in an array\n    subLength = rfString_Length(sub);\n    RF_MALLOC(subValues,4*subLength)\n    rfString_Iterate_Start(sub,i,charValue)\n    subValues[i] = charValue;\n    rfString_Iterate_End(i)\n\n    // iterate thisstring from the end\n    i = 0;\n    RF_STRING_ITERATEB_START(thisstr,i,bytePos)\n        noMatch = true;\n        // for every substring character\n        for(j = 0;j < subLength; j++)\n        {\n            // if we got a match\n            if((testity=rfString_BytePosToCodePoint(thisstr,bytePos)) == subValues[j])\n            {\n                ret = true;\n                noMatch = false;\n                lastBytePos = bytePos;\n                break;\n            }\n        }\n        // if we get out of iterating the substring without having found a match, we get out of the iteration in general\n        if(noMatch)\n            break;\n    RF_STRING_ITERATEB_END(i,bytePos)\n\n    // if we had any match\n    if(ret == true)\n    {\n        // just set the end of string there\n        thisstr->bytes[lastBytePos] = '\\0';\n        // and also set the new byte length\n        thisstr->byteLength -= (thisstr->byteLength - lastBytePos);\n    }\n\n    // free stuff and return\n    free(subValues);\n    return ret;\n}\n\n// Removes all characters of a substring from both ends of the given String\nchar i_rfString_Strip(void* thisstrP,void* subP)\n{\n    char res1 = rfString_StripStart(thisstrP,subP);\n    char res2 = rfString_StripEnd(thisstrP,subP);\n    return res1|res2;\n}\n\n\n/*------------------------------------------------------------------------ RF_String File I/O functions-------------------------------------------------------------------------------*/\n\n// Allocates and returns a string from file parsing. The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\nRF_String* rfString_Create_fUTF8(FILE* f, char* eof)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_fUTF8(ret,f,eof) < 0)\n    {\n        free(ret);\n        return 0;\n    }\n    return ret;\n}\n// Initializes a string from file parsing. The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\nint32_t rfString_Init_fUTF8(RF_String* str,FILE* f,char* eof)\n{\n    int32_t bytesN;\n    uint32_t bufferSize;// unused\n    if((bytesN=rfFReadLine_UTF8(f,&str->bytes,&str->byteLength,&bufferSize,eof)) < 0)\n    {\n        LOG_ERROR(\"Failed to initialize String from a UTF-8 file\",bytesN);\n        return bytesN;\n    }\n    // success\n    return bytesN;\n}\n// Assigns to a String from UTF-8 file parsing\nint32_t rfString_Assign_fUTF8(RF_String* str,FILE*f,char* eof)\n{\n    int32_t bytesN;\n    uint32_t utf8ByteLength,utf8BufferSize;// bufferSize unused in this function\n    char* utf8 = 0;\n    if((bytesN=rfFReadLine_UTF8(f,&utf8,&utf8ByteLength,&utf8BufferSize,eof)) < 0)\n    {\n        LOG_ERROR(\"Failed to assign the contents of a UTF-8 file to a String\",bytesN);\n        return bytesN;\n    }\n    // success\n    // assign it to the string\n    if(str->byteLength <= utf8ByteLength)\n    {\n        RF_REALLOC(str->bytes,char,utf8ByteLength+1);\n    }\n    memcpy(str->bytes,utf8,utf8ByteLength+1);\n    str->byteLength = utf8ByteLength;\n    // free the file's utf8 buffer\n    free(utf8);\n    return bytesN;\n}\n// Appends to a String from UTF-8 file parsing\nint32_t rfString_Append_fUTF8(RF_String* str,FILE*f,char* eof)\n{\n    int32_t bytesN;\n    uint32_t utf8ByteLength,utf8BufferSize;// bufferSize unused in this function\n    char* utf8 = 0;\n    if((bytesN=rfFReadLine_UTF8(f,&utf8,&utf8ByteLength,&utf8BufferSize,eof)) < 0)\n    {\n        LOG_ERROR(\"Failed to assign the contents of a UTF-8 file to a String\",bytesN);\n        return bytesN;\n    }\n    // append the utf8 to the given string\n    rfString_Append(str,RFS_(utf8));\n    // free the file's utf8 buffer\n    free(utf8);\n    return bytesN;\n}\n\n// Allocates and returns a string from file parsing. The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\nRF_String* rfString_Create_fUTF16(FILE* f,char endianess,char* eof)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_fUTF16(ret,f,endianess,eof) < 0)\n        return 0;\n    return ret;\n}\n// Initializes a string from file parsing. The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\nint32_t rfString_Init_fUTF16(RF_String* str,FILE* f, char endianess,char* eof)\n{\n    int32_t bytesN;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF16LE(f,&str->bytes,&str->byteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to initialize a String from reading a UTF-16 file\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&str->bytes,&str->byteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to initialize a String from reading a UTF-16 file\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    return bytesN;\n}\n\n// Assigns to an already initialized String from File parsing\nint32_t rfString_Assign_fUTF16(RF_String* str,FILE* f, char endianess,char* eof)\n{\n\n    uint32_t utf8ByteLength;\n    int32_t bytesN;\n    char* utf8 = 0;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF16LE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to assign the contents of a Little Endian UTF-16 file to a String\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to assign the contents of a Big Endian UTF-16 file to a String\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    // assign it to the string\n    if(str->byteLength <= utf8ByteLength)\n    {\n        RF_REALLOC(str->bytes,char,utf8ByteLength+1);\n    }\n    memcpy(str->bytes,utf8,utf8ByteLength+1);\n    str->byteLength = utf8ByteLength;\n    // free the file's utf8 buffer\n    free(utf8);\n    return bytesN;\n}\n\n// Appends to an already initialized String from File parsing\nint32_t rfString_Append_fUTF16(RF_String* str,FILE* f, char endianess,char* eof)\n{\n    char*utf8;\n    uint32_t utf8ByteLength;\n    int32_t bytesN;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF16LE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to append the contents of a Little Endian UTF-16 file to a String\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to append the contents of a Big Endian UTF-16 file to a String\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    rfString_Append(str,RFS_(utf8));\n    free(utf8);\n    return bytesN;\n}\n\n// Allocates and returns a string from file parsing. The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\nRF_String* rfString_Create_fUTF32(FILE* f,char endianess,char* eof)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_fUTF32(ret,f,endianess,eof) < 0)\n    {\n        free(ret);\n        return 0;\n    }\n    return ret;\n}\n// Initializes a string from file parsing. The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\nint32_t rfString_Init_fUTF32(RF_String* str,FILE* f,char endianess,char* eof)\n{\n    int32_t bytesN;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF32LE(f,&str->bytes,&str->byteLength,eof)) <0)\n        {\n            LOG_ERROR(\"Failure to initialize a String from reading a Little Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&str->bytes,&str->byteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to initialize a String from reading a Big Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    return bytesN;\n}\n// Assigns the contents of a UTF-32 file to a string\nint32_t rfString_Assign_fUTF32(RF_String* str,FILE* f,char endianess, char* eof)\n{\n    int32_t bytesN;\n    char*utf8;\n    uint32_t utf8ByteLength;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF32LE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to assign to a String from reading a Little Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to assign to a String from reading a Big Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    // assign it to the string\n    if(str->byteLength <= utf8ByteLength)\n    {\n        RF_REALLOC(str->bytes,char,utf8ByteLength+1);\n    }\n    memcpy(str->bytes,utf8,utf8ByteLength+1);\n    str->byteLength = utf8ByteLength;\n    // free the file's utf8 buffer\n    free(utf8);\n    return bytesN;\n}\n// Appends the contents of a UTF-32 file to a string\nint32_t rfString_Append_fUTF32(RF_String* str,FILE* f,char endianess, char* eof)\n{\n    int32_t bytesN;\n    char*utf8;\n    uint32_t utf8ByteLength;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF32LE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to append to a String from reading a Little Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to append to a String from reading a Big Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    // append it\n    rfString_Append(str,RFS_(utf8));\n    // free the file'sutf8 buffer\n    free(utf8);\n    return bytesN;\n}\n\n// Writes a string to a file in UTF-8 encoding.\nint32_t i_rfString_Fwrite(void* sP,FILE* f,char* encodingP)\n{\n    uint32_t *utf32,length,i;\n    uint16_t* utf16;\n    RF_String* s = (RF_String*)sP;\n    char encoding = *encodingP;\n    // depending on the encoding\n    switch(encoding)\n    {\n        case RF_UTF8:\n            if(fwrite(s->bytes,1,s->byteLength,f) != s->byteLength)\n                break;// and go to error logging\n            return RF_SUCCESS;\n        break;\n        case RF_UTF16_LE:\n            utf16 = rfString_ToUTF16(s,&length);\n            if(rfUTILS_Endianess() != RF_LITTLE_ENDIAN)\n            {\n                for(i=0;i<length;i++)\n                {\n                    rfUTILS_SwapEndianUS(&utf16[i]);\n                }\n            }\n            if(fwrite(utf16,2,length,f) != length)\n            {\n                free(utf16);\n                break;// and go to error logging\n            }\n            free(utf16);\n            return RF_SUCCESS;\n        break;\n        case RF_UTF16_BE:\n            utf16 = rfString_ToUTF16(s,&length);\n            if(rfUTILS_Endianess() != RF_BIG_ENDIAN)\n            {\n                for(i=0;i<length;i++)\n                {\n                    rfUTILS_SwapEndianUS(&utf16[i]);\n                }\n            }\n            if(fwrite(utf16,2,length,f) != length)\n            {\n                free(utf16);\n                break;// and go to error logging\n            }\n            free(utf16);\n            return RF_SUCCESS;\n        break;\n        case RF_UTF32_LE:\n            utf32 = rfString_ToUTF32(s,&length);\n            if(rfUTILS_Endianess() != RF_LITTLE_ENDIAN)\n            {\n                for(i=0;i<length;i++)\n                {\n                    rfUTILS_SwapEndianUI(&utf32[i]);\n                }\n            }\n            if(fwrite(utf32,4,length,f) != length)\n            {\n                free(utf32);\n                break;// and go to error logging\n            }\n            free(utf32);\n            return RF_SUCCESS;\n        break;\n        case RF_UTF32_BE:\n            utf32 = rfString_ToUTF32(s,&length);\n            if(rfUTILS_Endianess() != RF_BIG_ENDIAN)\n            {\n                for(i=0;i<length;i++)\n                {\n                    rfUTILS_SwapEndianUI(&utf32[i]);\n                }\n            }\n            if(fwrite(utf32,4,length,f) != length)\n            {\n                free(utf32);\n                break;// and go to error logging\n            }\n            free(utf32);\n            return RF_SUCCESS;\n        break;\n    }\n    // if we get here it means an error, and we log it with the macro\n    i_WRITE_CHECK(f,\"Writting a string to a file\")\n    return RE_FILE_WRITE;\n}\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/rfc_string.h",
    "content": "/**\n** Copyright (c) 2011-2012, Karapetsas Eleftherios\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n**  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n**  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in\n**     the documentation and/or other materials provided with the distribution.\n**  3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from\n**\n**  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n**  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n**  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n**  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n**  SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n**  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n**  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**/\n\n#ifndef REFU_USTRING_H\n#define REFU_USTRING_H\n\n#include <rf_options.h>\n\n#ifdef RF_MODULE_STRINGS// check if the strings are included as a module\n\n#include <stdio.h>\n#include <rf_setup.h>\n\n#include <Preprocessor/rf_xmacro_argcount.h> // for the argument count\n#include <rf_localmem.h> // for the local memory function wrapping functionality\n#include <IO/rf_unicode.h>// for unicode\n\n\n#ifdef __cplusplus\nextern \"C\"\n{// opening bracket for calling from C++\n#endif\n\n// An option for some string functions. Means that the case should not be exactly matched in the string replacing,finding e.t.c.\n#define RF_CASE_IGNORE  0x1\n// An options for some string functions. Means that the exact string should be found/replaced e.t.c.\n#define RF_MATCH_WORD 0x2\n\n\n// Denotes that a requested character/byte index in an RF_String is out of bounds\n#define RF_STRING_INDEX_OUT_OF_BOUNDS   ((uint32_t)0xFF0FFFF)\n\n/* These are here so that the iteration macros can work*/\n\n// Checks if a given byte is a continuation byte\n#define rfUTF8_IsContinuationByte2(b__)  ( b__ >= 0x80 && b__<= 0xBF )\n\n#pragma pack(push,1)\n/**\n** @internal\n** @author Lefteris\n** @date 09/12/2010\n** @endinternal\n** @brief A unicode String with UTF-8 internal representation\n**\n** The Refu String is a Unicode String that has two versions. One is this and for the other check @ref RF_StringX to see what operations can be performed on extended Strings.\n** Functions to convert to and from all UTF encoding exists but the internal representation is always at UTF-8. Once a\n** a String has been created it is always assumed that the stream of bytes inside it is valid UTF-8 since every function\n** performs a UTF-8 check unless otherwise specified.\n**\n** All the functions which have @isinherited{StringX} on their description can be used with extended strings safely, since no specific\n** version of the function exists, or needs to exist to manipulate Extended Strings. To make the documentation even clearer the functions that should not\n** be used with the extended string are marked with @notinherited{StringX}\n** @internal\n** @cppcode\n** //default constructor\n** String(){this->i_StringCHandle = rfString_Create(\"\");}\n** @endcpp\n** @endinternal\n*/\ntypedef struct RF_String\n{\n    // The string's data\n    char* bytes;\n    // The string's length in bytes (not including the null termination). The string keeps its length in bytes\n    // to avoid multiple calls to strlen()\n    uint32_t byteLength;\n}RF_String;\n#pragma pack(pop)\n\n\n// @memberof RF_String\n// @brief Create a termporary String from a String literal\n//\n// A macro to be used only inside a function call that accepts an @ref RF_String to create a Temporary RF_String*\n// that will be used by the function. This macro accepts from 1 to N arguments.\n//\n// The first argument shall either be a String literal or a printf styled string literal\n// given in the source file's encoding(default is UTF-8). For other encodings look at the compile time\n// option @c RF_OPTION_SOURCE_ENCODING that can be provided during building the library, but it is\n// @b strongly recommended to use UTF-8 encoded source files.\n//\n// Optionally the first argument can be followed by a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the string literal\n// parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// Basically the usage is the same as @ref rfString_Create\n//\n// @param s The formatted string that will constitute the RF_String. Must be in the same encoding as that of the source file.\n// Default is UTF-8.\n// @param ... \\rfoptional{nothing}  Depending on the string literal, the function may expect a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// @return Returns true in case of correct initialization and false , due to invalid byte sequence for the given encoding\n// @isinherited{StringX}\n#ifdef RF_IAMHERE_FOR_DOXYGEN\nRF_String* RFS_(const char* s,...);\n#else\n#define RFS_(...) i_rfString_CreateLocal(__VA_ARGS__)\n#endif\n\n\n\n/*-------------------------------------------------------------------------Methods to create an RF_String-------------------------------------------------------------------------------*/\n// @name Creating an RF_String\n// @{\n\n\n// @memberof RF_String\n// @opassign\n// @brief Allocates and returns a string with the given characters\n//\n// Given characters have to be in UTF-8. A check for valid sequence of bytes is performed. @notinherited{StringX}\n// @param s The sequence of bytes for the characters in UTF-8 (the default). Can also follow a printf-like format which will be formatted with\n// the variables that follow it. A check to see if it is a valid UTF-8 sequence is performed\n// @param ... \\rfoptional{nothing}  Depending on the string literal, the function may expect a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// @return Returns the initialized RF_string or null in case of failure to initialize, due to invalid utf-8 sequence\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\ni_DECLIMEX_ RF_String* rfString_Create(const char* s,...);\n#else\ni_DECLIMEX_ RF_String* i_rfString_Create(const char* s,...);\ni_DECLIMEX_ RF_String* i_NVrfString_Create(const char* s);\n#define rfString_Create(...)  RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_CREATE,1,__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATE1(...) i_NVrfString_Create(__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATE0(...) i_rfString_Create(__VA_ARGS__)\n#endif\n\n///Internal function that creates a temporary RF_String*\ni_DECLIMEX_ RF_String* i_rfString_CreateLocal1(const char* s,...);\ni_DECLIMEX_ RF_String* i_NVrfString_CreateLocal(const char* s);\n#define i_rfString_CreateLocal(...)  RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_CREATELOCAL,1,__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATELOCAL1(...) i_NVrfString_CreateLocal(__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATELOCAL0(...) i_rfString_CreateLocal1(__VA_ARGS__)\n\n\n// @memberof RF_String\n// @brief Initializes a string with the given characters.\n//\n// @notinherited{StringX}\n// Given characters have to be in UTF-8. A check for valide sequence of bytes is performed.\n// @param str The string to initialize\n// @param s The sequence of bytes for the characters in UTF-8 (the default).Can also follow a printf-like format which will be formatted with\n// the variables that follow it. A check to see if it is a valid UTF-8 sequence is performed\n// @param ... \\rfoptional{nothing}  Depending on the string literal, the function may expect a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// @return Returns true in case of correct initialization and false , due to invalid utf-8 sequence\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\ni_DECLIMEX_ char rfString_Init(RF_String* str,const char* s,...);\n#else\ni_DECLIMEX_ char i_rfString_Init(RF_String* str,const char* s,...);\ni_DECLIMEX_ char i_NVrfString_Init(RF_String* str,const char* s);\n#define rfString_Init(...)  RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_INIT,2,__VA_ARGS__)\n#define i_SELECT_RF_STRING_INIT1(...) i_NVrfString_Init(__VA_ARGS__)\n#define i_SELECT_RF_STRING_INIT0(...) i_rfString_Init(__VA_ARGS__)\n#endif\n\n// @memberof RF_String\n// @cppnotctor\n// @brief Allocates a String by turning a unicode code point in a String (encoded in UTF-8).\n//\n// @notinherited{StringX}\n// @param code The unicode code point to encode\n// @return A String with the code point encoded in it or a null pointer in case of an illegal code point value\ni_DECLIMEX_ RF_String* rfString_Create_cp(uint32_t code);\n// @memberof RF_String\n// @brief Initializes a string by turning a unicode code point in a String (encoded in UTF-8).\n//\n// @notinherited{StringX}\n// @param str The string to initialize\n// @param code The unicode code point to encode\n// @return Returns true in case of correct initialization and false , due to illegal code point value\ni_DECLIMEX_ char rfString_Init_cp(RF_String* str,uint32_t code);\n\n\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\n// @memberof RF_String\n// @cppnotctor\n// @brief Allocates and returns a string with the given characters with no checking.\n//\n// @notinherited{StringX}\n// @warning NO VALID-UTF8 check is performed.\n// @param s The sequence of bytes for the characters in UTF-8 (the default).Can also follow a printf-like format which will be formatted with\n// the variables that follow it. No check for valid bytestream is performed\n// @param ... \\rfoptional{nothing}  Depending on the string literal, the function may expect a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// @return Returns the initialized RF_string or null in case of failure to initialize\ni_DECLIMEX_ RF_String* rfString_Create_nc(const char* s,...);\n#else\ni_DECLIMEX_ RF_String* i_rfString_Create_nc(const char* s,...);\ni_DECLIMEX_ RF_String* i_NVrfString_Create_nc(const char* s);\n#define rfString_Create_nc(...)  RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_CREATE_NC,1,__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATE_NC1(...) i_NVrfString_Create_nc(__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATE_NC0(...) i_rfString_Create_nc(__VA_ARGS__)\n#endif\n\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\n// @memberof RF_String\n// @brief Initializes a string with the given characters with no checking\n//\n// @notinherited{StringX}\n// @warning NO VALID-UTF8 check is performed.\n// @param str The string to initialize\n// @param s The sequence of bytes for the characters in UTF-8 (the default).Can also follow a printf-like format which will be formatted with\n// the variables that follow it. No check for valid bytestream is performed\n// @param ... \\rfoptional{nothing}  Depending on the string literal, the function may expect a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// @return Returns true in case of correct initialization and false otherwise\ni_DECLIMEX_ char rfString_Init_nc(RF_String* str,const char* s,...);\n#else\ni_DECLIMEX_ char i_rfString_Init_nc(RF_String* str,const char* s,...);\ni_DECLIMEX_ char i_NVrfString_Init_nc(RF_String* str,const char* s);\n#define rfString_Init_nc(...)  RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_INIT_NC,2,__VA_ARGS__)\n#define i_SELECT_RF_STRING_INIT_NC1(...) i_NVrfString_Init_nc(__VA_ARGS__)\n#define i_SELECT_RF_STRING_INIT_NC0(...) i_rfString_Init_nc(__VA_ARGS__)\n#endif\n\n// @memberof RF_String\n// @opassign\n// @brief Allocates and returns a string with the given integer.\n//\n// @notinherited{StringX}\n// @param i The integer to turn into a string\n// @return Returns the initialized RF_string\ni_DECLIMEX_ RF_String* rfString_Create_i(int32_t i);\n// @memberof RF_String\n// @brief Initializes a string with the given integer.\n//\n// @notinherited{StringX}\n// @param str The string to initialize\n// @param i The integer to turn into a string\n// @return Returns true in case of correct initialization and false otherwise\ni_DECLIMEX_ char rfString_Init_i(RF_String* str,int32_t i);\n// @memberof RF_String\n// @opassign\n// @brief Allocates and returns a string with the given float.\n//\n// @notinherited{StringX}\n// @param f The float to turn into a string\n// @return Returns the initialized RF_string\ni_DECLIMEX_ RF_String* rfString_Create_f(float f);\n// @memberof RF_String\n// @brief Initializes a string with the given float.\n//\n// @notinherited{StringX}\n// @param str The string to initialize\n// @param f The float to turn into a string\n// @return Returns true in case of correct initialization and false otherwise\ni_DECLIMEX_ char rfString_Init_f(RF_String* str,float f);\n\n// @memberof RF_String\n// @brief Allocates and returns a string with the given UTF-16 byte sequence.\n//\n// @notinherited{StringX}\n// Given characters have to be in UTF-16\n// @param s The sequence of bytes for the characters in UTF-16.\n// @param endianess A flag that determined in what endianess the sequence of UTF-16 bytes is in. Possible values here is\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @return Returns the initialized RF_string or null in case of failure to initialize, due to invalid utf-16 sequence or illegal endianess value\ni_DECLIMEX_ RF_String* rfString_Create_UTF16(const char* s,char endianess);\n// @memberof RF_String\n// @brief Initializes a string with the given UTF-16 byte sequence.\n//\n// @notinherited{StringX}\n// Given characters have to be in UTF-16\n// @param str The string to initialize\n// @param s The sequence of bytes for the characters in UTF-16.\n// @param endianess A flag that determined in what endianess the sequence of UTF-16 bytes is in. Possible values here is\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @return Returns true for succesfull initialization and false otherwise due to invalid utf-16 sequence or illegal endianess value\ni_DECLIMEX_ char rfString_Init_UTF16(RF_String* str,const char* s,char endianess);\n\n// @memberof RF_String\n// @cppnotctor\n// @brief Allocates and returns a string with the given UTF-32 byte sequence.\n//\n// @notinherited{StringX}\n// Given characters have to be in UTF-32\n// @param s The sequence of bytes for the characters in UTF-32. Needs to be null terminated.\n// @return Returns the initialized RF_string or null in case of failure to initialize\ni_DECLIMEX_ RF_String* rfString_Create_UTF32(const char* s);\n// @memberof RF_String\n// @brief Initializes a string with the given UTF-32 byte sequence.\n//\n// @notinherited{StringX}\n// Given characters have to be in UTF-32\n// @param str The string to initialize\n// @param s The sequence of bytes for the characters in UTF-32. Needs to be null terminated.\n// @return Returns true for successful initialization and false otherwise\ni_DECLIMEX_ char rfString_Init_UTF32(RF_String* str,const char* s);\n//@}\n\n/*-------------------------------------------------------------------------Methods to copy/assign an RF_String-------------------------------------------------------------------------------*/\n// @name Copying - Assigning a String\n// @{\n\n// @memberof RF_String\n// @brief Assigns the value of the source string to the destination.\n//\n// @notinherited{StringX}\n// @lmsFunction\n// Both strings should already be initialized and hold a value. It is an error to give null parameters.\n// @param dest The destination string, which should get assigned\n// @param source The source string, whose values to copy. @inhtype{String,StringX} @tmpSTR\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\nvoid rfString_Assign(RF_String* dest,void* source);\n#else\ni_DECLIMEX_ void i_rfString_Assign(RF_String* dest,void* source);\n#define rfString_Assign(i_DESTINATION_,i_SOURCE_) i_rfLMS_WRAP2(void,i_rfString_Assign,i_DESTINATION_,i_SOURCE_)\n#endif\n\n// @memberof RF_String\n// @brief Assigns the value of a unicode character to the string\n//\n// @notinherited{StringX}\n// @param thisstr The string to assign to\n// @param character The unicode character codepoint to assign to the String\n// @return Returns @c true for succesfull assignment and @c false if the given @c character was not a valid unicode codepoint\ni_DECLIMEX_ char rfString_Assign_char(RF_String* thisstr,uint32_t character);\n\n// @}\n/*-------------------------------------------------------------------------Methods to get rid of an RF_String-------------------------------------------------------------------------------*/\n// @name Getting rid of an RF_String\n// @{\n\n// @memberof RF_String\n// @cppignore\n// @brief Deletes a string object and also frees its pointer.\n//\n// @notinherited{StringX}\n// It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault\n// Use it for strings made with _Create\n// @param s The string for deletion\ni_DECLIMEX_ void rfString_Destroy(RF_String* s);\n// @memberof RF_String\n// @cppignore\n// @brief Deletes a string object only, not its memory.\n//\n// @notinherited{StringX}\n// It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault\n// Use it for strings made with _Init\n// @param s The string for deletion\ni_DECLIMEX_ void rfString_Deinit(RF_String* s);\n\n\n// @}\n/*------------------------------------------------------------------------ RF_String unicode conversion-------------------------------------------------------------------------------*/\n// @name Unicode Conversion Functions\n// @{\n\n// @memberof RF_String\n// @brief Returns the strings contents as a UTF-8 buffer\n//\n// @isinherited{StringX}\n// This is just a macro wrapper of @ref rfString_ToStr() and exists here\n// just so that users can guess function names for all unicode encodings.\n//\n//  Note that just like in @ref rfString_ToStr() this is just a pointer to\n// the String's internal UTF8 buffer and as such should be read only. If there\n// is a need to do anything other than that copy the buffer.\n// @param s The string in question\n// @return Returns a pointer to the String's internal UTF-8 uffer\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ const char* rfString_ToUTF8(RF_String* s);\n#else\n#define rfString_ToUTF8(i_STRING_)  rfString_ToCstr(i_STRING_)\n#endif\n\n// @memberof RF_String\n// @brief Returns the strings contents as a UTF-16 buffer\n//\n// @isinherited{StringX}\n// This function allocates a UTF-16 buffer in which the string's\n// UTF-8 contents are encoded as UTF-16. The endianess of the buffer\n// is that of the system. The returned buffer needs to be freed by the user\n// later.\n// @param[in] s The string in question\n// @param[out] length Give a reference to a uint32_t in this argument to receive the length of\n// the returned UTF-16 buffer in 16-bit words\n// @return Returns an allocated UTF-16 buffer. Needs to be freed by the user later.\ni_DECLIMEX_ uint16_t* rfString_ToUTF16(RF_String* s,uint32_t* length);\n\n// @memberof RF_String\n// @brief Returns the strings contents as a UTF-32 buffer\n//\n// @isinherited{StringX}\n// This function allocates a UTF-32 buffer in which the string's\n// UTF-8 contents are encoded as UTF-32. The endianess of the buffer\n// is that of the system. The returned buffer needs to be freed by the user\n// later.\n// @param[in] s The string in question\n// @param[out] length Give a reference to a uint32_t in this argument to receive the length\n// of the returned UTF-32 buffer in codepoints. (32-bit) words\n// @return Returns an allocated UTF-16 buffer. Needs to be freed by the user later.\ni_DECLIMEX_ uint32_t* rfString_ToUTF32(RF_String* s,uint32_t*length);\n\n// @}\n/*------------------------------------------------------------------------ RF_String retrieval functions-------------------------------------------------------------------------------*/\n// @name String Retrieval\n// @{\n\n\n\n    //-- String iteration --/ /\n\n// Two macros to accomplish iteration of an RF_String from any given character going forwards. This macro should be used with its end pair.\n// We take advantage of the fact that an RF_String is always guaranteed to contain a valid UTF-8 sequence and thus no checks are performed.\n/**\n** @memberof RF_String\n** @cppignore\n** @brief Starts an RF_String forward iteration scope.\n**\n** @isinherited{StringX}\n** Use this macro to iterate every character inside an RF_String or RF_StringX\\n\n** Must be used with its pair macro #rfString_Iterate_End.\\n\n** As an example consider this code that iterates every character of a string from the start to finish\n** @code\n** uint32_t i = 0;\n** uint32_t charValue;\n** RF_String foo;rfString_Init(&foo,\"I am a String\");\n** rfString_Iterate_Start(&foo,i,charValue)\n**      //for every character in the string,let's print it\n**      printf(\"Character at index %d is %c\\n\",i,charValue);\n** rfString_Iterate_End(i)\n** @endcode\n** @param[in] string_ The string to iterate. Must be a pointer to string\n** @param[in,out] startCharacterPos_ Here give an uint32_t which will be the character position from which to start the iteration. In each iteration this will hold the character index. If the given position is out of bounds then the iteration does not happen\n** @param[in,out] characterUnicodeValue_ Here pass an uint32_t which in each iteration will hold the unicode code point of the character at position startCharacterPos_\n**/\n#define rfString_Iterate_Start(string_,startCharacterPos_,characterUnicodeValue_)     {\\\n            /* b index sec is the byte index and j the character index*/\\\n            uint32_t byteIndex_ = 0;uint32_t j_=0;\\\n            /*iterate until we find the character position requested and its equivalent byte position*/\\\n            while(j_!=startCharacterPos_)\\\n            {\\\n                if( rfUTF8_IsContinuationByte( (string_)->bytes[byteIndex_]) ==false)\\\n                {\\\n                    j_++;\\\n                }\\\n                byteIndex_++;\\\n            }\\\n            /*now start the requested iteration*/\\\n            while( (string_)->bytes[byteIndex_]!='\\0')\\\n            {\\\n                /*if it's a character*/\\\n                if( rfUTF8_IsContinuationByte( (string_)->bytes[byteIndex_]) ==false)\\\n                {/*Give the character value to the user*/\\\n                    characterUnicodeValue_ = rfString_BytePosToCodePoint( (string_),byteIndex_);\n\n// @memberof RF_String\n// @cppignore\n// @brief Ends an RF_String/RF_StringX forward iteration scope.\n//\n// @isinherited{StringX}\n// Look at #rfString_Iterate_Start for an example usage\n// @param[in,out] startCharacterPos_ Here give the uint32_t given to #rfString_Iterate_Start\n#define rfString_Iterate_End(startCharacterPos_)  startCharacterPos_++;}byteIndex_++;}}\n\n//Two macros to accomplish iteration of an RF_String from any given character going backwards. This macro should be used with its end pair.\n// We take advantage of the fact that an RF_String is always guaranteed to contain a valid UTF-8 sequence and thus no checks are performed.\n\n/**\n** @memberof RF_String\n** @cppignore\n** @brief Starts an RF_String backward iteration scope.\n**\n** @isinherited{StringX}\n** Use this macro to iterate every character inside an RF_String or RF_StringX going backwards\\n\n** Must be used with its pair macro #rfString_IterateB_End.\\n\n**\n** As an example consider this code that iterates every character of a string from the start to finish\n** @code\n** uint32_t charValue;\n** RF_String foo;rfString_Init(&foo,\"I am a String\");\n** uint32_t i = rfString_Length(&foo);\n** rfString_IterateB_Start(&foo,i,charValue)\n**      //for every character in the string,let's print it\n**      printf(\"Character at index %d is %c\\n\",i,charValue);\n** rfString_IterateB_End(i)\n** @endcode\n** @param[in] string_ The string to iterate. Must be a pointer to string\n** @param[in,out] characterPos_ Here give an uint32_t which will be the character position from which to start the iteration. In each iteration this will hold the character index. If the given position is out of bounds then the iteration does not happen\n** @param[in,out] characterUnicodeValue_ Here pass an uint32_t which in each iteration will hold the unicode code point of the character at position characterPos_\n**/\n#define rfString_IterateB_Start(string_,characterPos_,characterUnicodeValue_)     {\\\n            /* b index is the byte index and j the character index*/\\\n            uint32_t b_index_ = 0;uint32_t j_=0;\\\n            /* c index sec is another signed copy of the character index (and is int64_t so that it can cater for any situation). Reason is cause going backwards we gotta have -1 too */\\\n            int64_t c_index_ = characterPos_;\\\n            /*iterate until we find the character position requested and its equivalent byte position*/\\\n            while(j_!=characterPos_)\\\n            {\\\n                if( rfUTF8_IsContinuationByte( (string_)->bytes[b_index_]) ==false)\\\n                {\\\n                    j_++;\\\n                }\\\n                b_index_++;\\\n            }\\\n            /*now start the requested iteration - notice that the end condition is to reach the first character position*/\\\n            while(c_index_!=-1)\\\n            {\\\n                /*if it's a character*/\\\n                if( rfUTF8_IsContinuationByte( (string_)->bytes[b_index_]) ==false)\\\n                {/*Give the character value to the user*/\\\n                    characterUnicodeValue_ = rfString_BytePosToCodePoint( (string_),b_index_);\n\n// @memberof RF_String\n// @cppignore\n// @brief Ends an RF_String/RF_StringX backward iteration scope.\n//\n// @isinherited{StringX}\n// Look at #rfString_IterateB_Start for an example usage\n// @param[in,out] characterPos_ Here give the uint32_t given to #rfString_IterateB_Start\n#define rfString_IterateB_End(characterPos_)  c_index_-- ;characterPos_--;}b_index_--;}}\n\n// @memberof RF_String\n// @brief Finds the length of the string in characters.\n//\n// @isinherited{StringX}\n// @param s The string whose number of characters to find. @inhtype{String,StringX}\n// @return Returns the length of the sting in characters, not including the null termintion character\ni_DECLIMEX_ uint32_t rfString_Length(void * s);\n\n// @memberof RF_String\n// @brief Retrieves the unicode code point of the parameter character.\n//\n// @isinherited{StringX}\n// If the character position is out of bounds RF_STRING_INDEX_OUT_OF_BOUNDS is returned.\n// @param thisstr The string whose character code point we need. @inhtype{String,StringX}\n// @param c The character index whose unicode code point to return. Must be a positive (including zero) integer.\n// @return Returns the code point as an uint32_t or the value RF_STRING_INDEX_OUT_OF_BOUNDS if the requested character index is out of bounds\ni_DECLIMEX_ uint32_t rfString_GetChar(void* thisstr,uint32_t c);\n\n// @internal\n// @memberof RF_String\n// @cppignore\n// @brief Retrieves the unicode code point of the parameter bytepos of the string.\n//\n// @isinherited{StringX}\n// This is an internal function, there is no need to use it. The reason it is exposed here is that it is utilized in the iteration macros.\n// @warning DO NOT use this function unless you know what you are doing\n// @param thisstr The string whose byte position code point we need. @inhtype{String,StringX}\n// @param bytepos The byte position of the string from where to get the code point.\n// @warning If this is out of bounds then nothing can detect it and at best it will cause a SEG FAULT.\n//                 Moreover no check to see if this is not a continutation byte is made. All the checks must have been made before calling the function.\n// @return Returns the code point of the byte position as an uint32_t\n// @endinternal\ni_DECLIMEX_ uint32_t rfString_BytePosToCodePoint(void* thisstr,uint32_t bytepos);\n\n// @internal\n// @memberof RF_String\n// @cppignore\n// @brief Retrieves character position of a byte position\n//\n// @isinherited{StringX}\n// This is an internal function, there is no need to use it. It attempts to retrieve character position from a byte position. If the byte\n// position is a continutation byte and does not constitute the start of a character then depending on the option the function will find\n// either the next character or the previous character position from this byte position\n//\n// @warning DO NOT use this function unless you know what you are doing\n// @param thisstr The string whose byte position code point we need. @inhtype{String,StringX}\n// @param bytepos The byte position of the string from where to get the character position\n// @param before A boolean flag denoting the behaviour in case this byte position is a continutation byte. If @c before is true then\n// the function will retrieve the first character position before the byte. If it is false, it will retrieve the first character position\n// after the continuation byte.\n// @endinternal\ni_DECLIMEX_ uint32_t rfString_BytePosToCharPos(void* thisstr,uint32_t bytepos,char before);\n\n// @memberof RF_String\n// @opcmpeq\n// @brief Compares two Strings and returns true if they are equal and false otherwise\n//\n// @isinherited{StringX}\n// A macro comparing two String and returning true if they are equal and false otherwise. Use it to compare ONLY Strings here not string literals (c strings)\n// If you need to compare a String with a string literal (c string) use #rfString_Equal_s\n// @lmsFunction\n// @param s1 The first string to compare @inhtype{String,StringX} @tmpSTR\n// @param s2 The second string to compare @inhtype{String,StringX} @tmpSTR\n// @return True in case the strings are equal and false otherwise\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_Equal(void* s1,void* s2);\n#else\ni_DECLIMEX_ char i_rfString_Equal(void* s1,void* s2);\n#define rfString_Equal(i_STRING1_,i_STRING2_)   i_rfLMSX_WRAP2(char,i_rfString_Equal,i_STRING1_,i_STRING2_)\n#endif\n\n\n// @memberof RF_String\n// @brief Finds if a substring exists inside another string.\n//\n// @isinherited{StringX}\n// Finds the existence of String sstr inside this string with the given options. You have the\n// option to either match case or perform a case-insensitive search. In addition you can search\n// for the exact string and not it just being a part of another string.\n// @lmsFunction\n// @param thisstr This string we want to search in @inhtype{String,StringX}\n// @param sstr The substring string we want to search for @inhtype{String,StringX} @tmpSTR\n// @param options \\rfoptional{0}. Bitflag options denoting some options for the search.Can have values:\n// + @c RF_CASE_IGNORE: If you want the found substring to ignore the case and returns success for any occurence of the string in any case.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you want the found substring to be exact. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would return a failure. Default search is to return any found substring.\n// @return Returns the character position of the found substring or RF_FAILURE for not found\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ int32_t rfString_Find(const void* thisstr,const void* sstr,const char options);\n#else\ni_DECLIMEX_ int32_t i_rfString_Find(const void* thisstr,const void* sstr,const char* options);\n    #ifndef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Find(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_)  i_rfLMS_WRAP3(int32_t,i_rfString_Find,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_))\n    #else\n        #define rfString_Find(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_FIND,3,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_FIND1(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Find() accepts from 2 to 3 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_FIND0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_FIND,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_FIND2(i_THISSTR_,i_SEARCHSTR_) i_rfLMS_WRAP3(int32_t,i_rfString_Find,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(0))\n        #define i_SELECT_RF_STRING_FIND3(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_) i_rfLMS_WRAP3(int32_t,i_rfString_Find,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_FIND1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Find() accepts from 2 to 3 arguments\\\"\")\n        #define i_SELECT_RF_STRING_FIND0(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Find() accepts from 2 to 3 arguments\\\"\")\n    #endif\n#endif\n\n\n// @memberof RF_String\n// @brief Returns the integer value of a String\n//\n// @isinherited{StringX}\n// The parameter string must contains only numbers. If it contains anything else the function fails.\n// @param thisstr The string whose integer value to return. @inhtype{String,StringX}\n// @param[out] v A refence to an integer that will return the float value\n// @return Returns true in case of succesfull conversion or false if no integer was represented by the string\ni_DECLIMEX_ char rfString_ToInt(void* thisstr,int32_t* v);\n\n// @memberof RF_String\n// @brief Returns the double value of a String\n//\n// @isinherited{StringX}\n// The parameter string must contain only a number. If it contains anything else the function fails.\n// @param thisstr The string whose floating point value to return. @inhtype{String,StringX}\n// @param[out] f A refence to a double that will return the floating point number value\n// @return Returns RF_SUCCESS in case of succesfull conversion or error if there was failure. Possible errors are:\n// + @c RE_STRING_TOFLOAT: There was a conversion error. The string probably does not represent a float\n// + @c RE_STRING_TOFLOAT_RANGE: The represented floating point number is of a range bigger than what can be\n// represented by the system\n// + @c RE_STRING_TOFLOAT_UNDERFLOW: Representing the string's floating point number in a double would cause underflow\ni_DECLIMEX_ int rfString_ToDouble(void* thisstr,double* f);\n\n// @memberof RF_String\n// @brief Returns a cstring version of the string\n//\n// @isinherited{StringX}\n// Remember that this is just a pointer to the string data. It can't be modified. memcpy it if you need a copy of it.\n// @param str The string whose cstring to return. @inhtype{String,StringX}\n// @return Returns a c string version of the string\ni_DECLIMEX_ const char* rfString_ToCstr(const void* str);\n\n\n// @memberof RF_String\n// @cppignore\n// @brief Creates and returns an allocated copy of the given string\n//\n// @isinherited{StringX}\n// @note The Returned Substring needs to be freed by the user. BEWARE when assigning to a string using this function since if any previous string exists there IS NOT getting freed. You have to free it explicitly\n// @param src The string to copy from. @inhtype{String,StringX}\n// @return Returns a string copied from the previous one or null if the original string was null\ni_DECLIMEX_ RF_String* rfString_Copy_OUT(void* src);\n// @memberof RF_String\n// @cppignore\n// @brief Copies all the contents of a string to another\n//\n// @isinherited{StringX}\n// @param dst The string to copy in.\n// @param src The string to copy from. @inhtype{String,StringX}\n// If the value is bigger than the maximum number of characters then still all characters are copied.\ni_DECLIMEX_ void rfString_Copy_IN(RF_String* dst,void* src);\n// @memberof RF_String\n// @brief Copies a certain number of characters from a string\n//\n// @isinherited{StringX}\n// Copies @c n characters from @c src String into the destination @c dst string.\n// @param dst The string to copy in\n// @param src The string to copy from. @inhtype{String,StringX}\n// @param n The number of characters to copy from the @c src string\n// If the value is bigger than the maximum number of characters then still all characters are copied.\ni_DECLIMEX_ void rfString_Copy_chars(RF_String* dst,void* src,uint32_t n);\n\n\n// @memberof RF_String\n// @brief Applies a limited version of sscanf after the specified substring\n//\n// @isinherited{StringX}\n// @lmsFunction\n// @param thisstr The current string. @inhtype{String,StringX}\n// @param afterstr The substring after which to apply sscanf. @inhtype{String,StringX} @tmpSTR\n// @param format The tokens parameter which give the format of scanf\n// @param var A void* to pass in any variable we need to get a value\n// @return Returns true if a value was read and false otherwise, substring not being found in the string or sscanf unable to read into the variable\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\n    i_DECLIMEX_ char rfString_ScanfAfter(void* thisstr,void* afterstr,const char* format,void* var);\n#else\n    i_DECLIMEX_ char i_rfString_ScanfAfter(void* thisstr,void* afterstr,const char* format,void* var);\n    #define rfString_ScanfAfter(i_THISSTR_,i_AFTERSTR_,i_FORMAT_,i_VAR_) i_rfLMSX_WRAP4(char,i_rfString_ScanfAfter,i_THISSTR_,i_AFTERSTR_,i_FORMAT_,i_VAR_)\n#endif\n\n// @memberof RF_String\n// @brief Counts how many times a substring occurs inside the string.\n//\n// @isinherited{StringX}\n// @lmsFunction\n// @param thisstr The string inside which to count. @inhtype{String,StringX}\n// @param sstr The substring for which to search. @inhtype{String,StringX} @tmpSTR\n// @param options \\rfoptional{0}. Bitflag options denoting some options for the search. Give 0 for the defaults.Can have values:\n// + @c RF_CASE_IGNORE: If you want the found substring to ignore the case and returns success for any occurence of the string in any case.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you want the found substring to be exact. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would return a failure. Default search is to return any found substring.\n// @return Returns the number of times cstr exists inside the string (0 is returned in case it's not found at all\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ int32_t rfString_Count(void* thisstr,void* sstr,const char options);\n#else\ni_DECLIMEX_ int32_t i_rfString_Count(void* thisstr,void* sstr,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Count(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_COUNT,3,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_COUNT1(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Count() accepts from 2 to 3 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_COUNT0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_COUNT,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_COUNT2(i_THISSTR_,i_SEARCHSTR_)  i_rfLMSX_WRAP3(int32_t,i_rfString_Count,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(0))\n        #define i_SELECT_RF_STRING_COUNT3(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_) i_rfLMS_WRAP3(int32_t,i_rfString_Count,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_COUNT1(...)  RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Count() accepts from 2 to 3 arguments\\\"\")\n        #define i_SELECT_RF_STRING_COUNT0(...)  RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Count() accepts from 2 to 3 arguments\\\"\")\n    #else\n        #define rfString_Count(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_) i_rfLMSX_WRAP3(int32_t,i_rfString_Count,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n\n// @memberof RF_String\n// @brief Tokenizes the given string\n//\n// @isinherited{StringX}\n// Separates it into @c tokensN depending on how many substrings can be created from the @c sep separatior and stores them\n// into the Array of RF_String* that should be passed to the function. The array gets initialized inside the function and\n// <b>has to be freed explicitly</b> later by thg user. Also each String inside the array has to be Deinitialized too.\n// Here is an example usage:\n// @snippet Strings/tokenize.cpp Tokenize_C\n// @cppsnippet Tokenize_CPP\n// @param[in] thisstr The string to tokenize. @inhtype{String,StringX}\n// @param[in] sep A string literal that will be used as a separator to tokenize the given string\n// @param[out] tokensN The number of tokens that got created\n// @param[out] tokens Pass a pointer to an array of RF_Strings. @keepptr\n// @return Returns true in success and false in case the the separating character has not been found\n// @internal @cppcode\n// char String::Tokenize(char* sep,uint32_t* tokensN, String*** tokens)\n// {\n//     RF_String* t;\n//     uint32_t i;\n//     if(rfString_Tokenize(this->i_StringCHandle,sep,tokensN,&t)==false)\n//         return false;\n//\n//     *tokens = (String**) malloc(sizeof(String*)* (*tokensN));\n//     for(i=0;i<(*tokensN);i++)\n//     {\n//        (*tokens)[i] = new String((RF_String*)&t[i]);\n//     }\n//     return true;\n// }\n// @endcpp @endinternal\ni_DECLIMEX_ char rfString_Tokenize(void* thisstr,char* sep,uint32_t* tokensN,RF_String** tokens);\n\n\n// @memberof RF_String\n// @brief Initializes the first substring, between two given strings\n//\n// @isinherited{StringX}\n// Initializes the given string as the first substring existing between the left and right parameter substrings\n// @lmsFunction\n// @note The Returned Substring needs to be deinitialized by the user.\n// @param thisstr This current string. @inhtype{String,StringX}\n// @param[in] lstr The left substring that will define the new substring. @inhtype{String,StringX} @tmpSTR\n// @param[in] rstr The right substring that will define the new substring. @inhtype{String,StringX} @tmpSTR\n// @param[out] result The resulting substring.\n// @param options \\rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults.\n// Can have values:\n// + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would find nothing. Default is with this flag off.\n// @return Returns true if the substring is found and initialized and false otherwise\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_Between(void* thisstr,void* lstr,void* rstr,RF_String* result,const char options);\n#else\ni_DECLIMEX_ char i_rfString_Between(void* thisstr,void* lstr,void* rstr,RF_String* result,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Between(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_BETWEEN,5,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_BETWEEN1(...)  RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_BETWEEN0(...)  RF_SELECT_FUNC(i_SELECT_RF_STRING_BETWEEN,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_BETWEEN4(i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Between,i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_RFI8_(0))\n        #define i_SELECT_RF_STRING_BETWEEN5(i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_OPTIONS_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Between,i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_BETWEEN3(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\\\"\")\n        #define i_SELECT_RF_STRING_BETWEEN2(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\\\"\")\n        #define i_SELECT_RF_STRING_BETWEEN1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\\\"\")\n        #define i_SELECT_RF_STRING_BETWEEN0(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\\\"\")\n    #else\n        #define rfString_Between(i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_OPTIONS_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Between,i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n\n// @memberof RF_String\n// @brief Initializes the given string as the substring from the start until any of the given Strings are found\n//\n// @isinherited{StringX}\n// The parameters that have to be given as variable argument <b>must</b> be of type RF_String* or RF_StringX* or even\n// string initialized with the temporary string macro\n// @rfNoDefArgsWarn1\n// @warning if the library has been compiled with @c DEFAULT_ARGUMENTS off then arguments @c options and @c parN are actually pointers\n// to @c char and @c unsigned char respectively\n// @lmsFunction\n// @param thisstr The string to operate in. @inhtype{String,StringX}\n// @param result The resulting substring.\n// @param options Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults.\n//  Can have values:\n// + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would find nothing. Default is with this flag off.\n// @param parN The number of strings to search for\n// @param ... The strings to search for. @inhtype{String,StringX} @tmpSTR\n// @extraVarArgLim\n// @return Returns true if the substring was initialized and false if none of the parameters were found or an invalid UTF-8 sequence was given. In the latter case an error is also logged.\n#ifdef RF_IAMHERE_FOR_DOXYGEN\ni_DECLIMEX_ char rfString_Beforev(void* thisstr,RF_String* result,const char options,const unsigned char parN, ...);\n#endif\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\n    i_DECLIMEX_ char i_rfString_Beforev(void* thisstr,RF_String* result,const char* options,const unsigned char* parN, ...);\n    #define rfString_Beforev(...)  RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_BEFOREV,4,__VA_ARGS__)\n    #define i_NPSELECT_RF_STRING_BEFOREV1(...)  RF_SELECT_FUNC_IF_NARGGT2(i_LIMSELECT_RF_STRING_BEFOREV,18,__VA_ARGS__)\n    #define i_NPSELECT_RF_STRING_BEFOREV0(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Beforev() needs to receive more than 4 arguments\\\"\")\n    #define i_LIMSELECT_RF_STRING_BEFOREV1(...) RF_COMPILE_ERROR(\"message \\\"Extra Arguments Limit Reached: Function rfString_Beforev() received more extra arguments than the limit permits\\\"\")\n    #define i_LIMSELECT_RF_STRING_BEFOREV0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_BEFOREV,__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV5(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...)    \\\n        i_rfLMSX_WRAP5(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV6(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP6(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV7(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP7(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV8(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP8(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV9(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP9(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV10(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP10(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV11(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP11(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV12(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP12(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV13(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP13(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV14(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP14(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV15(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP15(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV16(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP16(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV17(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP17(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV18(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP18(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n#else\n   i_DECLIMEX_ char rfString_Beforev(void* thisstr,RF_String* result,const char* options,const unsigned char* parN, ...);\n#endif\n\n// @memberof RF_String\n// @brief Initializes the given string as the substring from the start until the given string is found\n//\n// @isinherited{StringX}\n// @lmsFunction\n// @param thisstr The string to operate in. @inhtype{String,StringX}\n// @param sstr The substring that we want to find inside the string @inhtype{String,StringX} @tmpSTR\n// @param result The resulting substring.\n// @param options \\rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults.\n// Can have values:\n// + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would find nothing. Default is with this flag off.\n// @return Returns true if the substring was initialized and false if none of the parameters were found or an invalid UTF-8 sequence was given. In the latter case an error is also logged.\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_Before(void* thisstr,void* sstr,RF_String* result,const char options);\n#else\ni_DECLIMEX_ char i_rfString_Before(void* thisstr,void* sstr,RF_String* result,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Before(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_BEFORE,4,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_BEFORE1(...)  RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_BEFORE0(...)  RF_SELECT_FUNC(i_SELECT_RF_STRING_BEFORE,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_BEFORE3(i_THISSTR_,i_SEARCHSTR_,i_RESULT_) i_rfLMSX_WRAP4(char,i_rfString_Before,i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_RFI8_(0))\n        #define i_SELECT_RF_STRING_BEFORE4(i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_Before,i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_BEFORE2(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\\\"\")\n        #define i_SELECT_RF_STRING_BEFORE1(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\\\"\")\n        #define i_SELECT_RF_STRING_BEFORE0(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\\\"\")\n    #else\n        #define rfString_Before(i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_Before,i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n// @memberof RF_String\n// @brief Initialize a string after a given substring\n//\n// @isinherited{StringX}\n// Initializes the given String with the substring located after (and not including) the after substring inside the parameter string. If the substring is not located the function returns false.\n// @note The given String needs to be deinitialized by the user\n// @lmsFunction\n// @param[in] thisstr The parameter string from which the substring will be formed. @inhtype{String,StringX}\n// @param[in] after The substring to search for inside the parameter string. @inhtype{String,StringX} @tmpSTR\n// @param[out] out Pass a reference to a String inside which the substring of the original string after the @c after substring will be placed\n// @param options \\rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults.\n// Can have values:\n// + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would find nothing. Default is with this flag off.\n// @return Returns true for success and false if the substring is not found in the parameter string.\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_After(void* thisstr,void* after,RF_String* out,const char options);\n#else\ni_DECLIMEX_ char i_rfString_After(void* thisstr,void* after,RF_String* out,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_After(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_AFTER,4,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_AFTER1(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_AFTER0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_AFTER,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_AFTER3(i_THISSTR_,i_AFTERSTR_,i_OUTSTR_) i_rfLMSX_WRAP4(char,i_rfString_After,i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_RFI8_(0))\n        #define i_SELECT_RF_STRING_AFTER4(i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_After,i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_AFTER2(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\\\"\")\n        #define i_SELECT_RF_STRING_AFTER1(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\\\"\")\n        #define i_SELECT_RF_STRING_AFTER0(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\\\"\")\n    #else\n        #define rfString_After(i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_After,i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n// @memberof RF_String\n// @brief Initialize a string after the first of the given substrings found\n//\n// @isinherited{StringX}\n// Initializes the given String with the substring located after (and not including) the after substring inside the parameter string. If the substring is not located the function returns false.\n// The parameters that have to be given as variable argument <b>must</b> be of type RF_String* or RF_StringX* or even\n// string initializes with the temporary string macro\n// @rfNoDefArgsWarn1\n// @warning if the library has been compiled with @c DEFAULT_ARGUMENTS off then arguments @c options and @c parN are actually pointers\n// to @c char and @c unsigned char respectively\n// @lmsFunction\n// @param[in] thisstr The parameter string from which the substring will be formed. @inhtype{String,StringX}\n// @param[out] out Pass a reference to a String inside which the substring of the original string\n// after the found substring will be placed.\n// @param options \\rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults.\n// Can have values:\n// + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would find nothing. Default is with this flag off.\n// @param parN The number of substrings to search for.\n// @param ... The substrings to search for. @inhtype{String,StringX} @tmpSTR\n// @extraVarArgLim\n// @return Returns true for success and false if the substring is not found in the parameter string.\n#ifdef RF_IAMHERE_FOR_DOXYGEN\ni_DECLIMEX_ char rfString_Afterv(void* thisstr,RF_String* out,const char options,const unsigned char parN,...);\n#endif\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\ni_DECLIMEX_ char i_rfString_Afterv(void* thisstr,RF_String* out,const char* options,const unsigned char* parN,...);\n    #define rfString_Afterv(...)  RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_AFTERV,4,__VA_ARGS__)\n    #define i_NPSELECT_RF_STRING_AFTERV1(...)  RF_SELECT_FUNC_IF_NARGGT2(i_LIMSELECT_RF_STRING_AFTERV,18,__VA_ARGS__)\n    #define i_NPSELECT_RF_STRING_AFTERV0(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Afterv() needs to receive more than 4 arguments\\\"\")\n    #define i_LIMSELECT_RF_STRING_AFTERV1(...) RF_COMPILE_ERROR(\"message \\\"Extra Arguments Limit Reached: Function rfString_Afterv() received more extra arguments than the limit permits\\\"\")\n    #define i_LIMSELECT_RF_STRING_AFTERV0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_AFTERV,__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV5(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP5(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV6(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP6(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV7(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP7(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV8(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP8(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV9(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP9(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV10(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP10(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV11(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP11(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV12(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP12(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV13(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP13(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV14(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP14(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV15(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP15(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV16(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP16(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV17(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP17(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV18(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP18(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n#else\n    char rfString_Afterv(void* thisstr,RF_String* out,const char* options,const unsigned char* parN,...);\n#endif\n\n\n\n// @}\n/*------------------------------------------------------------------------ RF_String manipulation functions-------------------------------------------------------------------------------*/\n// @name String Manipulation\n// @{\n\n// @memberof RF_String\n// @opadd\n// @brief Appends a string to this one\n//\n// @notinherited{StringX}\n// @lmsFunction\n// @param thisstr The string to append to\n// @param other The string to add to this string. @inhtype{String,StringX} @tmpSTR\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ void rfString_Append(RF_String* thisstr,void* other);\n#else\ni_DECLIMEX_ void i_rfString_Append(RF_String* thisstr,void* other);\n#define rfString_Append(i_THISSTR_,i_OTHERSTR_) i_rfLMS_WRAP2(void,i_rfString_Append,i_THISSTR_,i_OTHERSTR_)\n#endif\n\n// @memberof RF_String\n// @opadd\n// @brief Appends an integer to the string\n//\n// @notinherited{StringX}\n// @param thisstr The string to append to\n// @param i The integer to add\ni_DECLIMEX_ void rfString_Append_i(RF_String* thisstr,const int32_t i);\n\n// @memberof RF_String\n// @opadd\n// @brief Appends a float to the string\n//\n// @notinherited{StringX}\n// @param thisstr The string to append to\n// @param f The float to add\ni_DECLIMEX_ void rfString_Append_f(RF_String* thisstr,const float f);\n\n// @memberof RF_String\n// @brief Prepends the parameter String to this string\n//\n// @notinherited{StringX}\n// @lmsFunction\n// @param thisstr The string to prepend to\n// @param other The string to prepend to this string. @inhtype{String,StringX} @tmpSTR\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ void rfString_Prepend(RF_String* thisstr,void* other);\n#else\ni_DECLIMEX_ void i_rfString_Prepend(RF_String* thisstr,void* other);\n#define rfString_Prepend(i_THISSTR_,i_OTHERSTR_)    i_rfLMS_WRAP2(void,i_rfString_Prepend,i_THISSTR_,i_OTHERSTR_)\n#endif\n\n// @memberof RF_String\n// @brief Removes occurences of a substring\n//\n// @isinherited{StringX}\n// Removes a @c number of occurences of a substring from this string, that agree with the given parameters.\n// <b>Does not</b> reallocate buffer size\n// @lmsFunction\n// @param thisstr This string we want to remove from. @inhtype{String,StringX}\n// @param rstr The string whose occurences we need to locate and remove from the current string. @inhtype{String,StringX} @tmpSTR\n// @param number \\rfoptional{0}. The number of occurences to remove. Give @e 0 for all the occurences.\n// If the given number is bigger than the actual number of occurences, still all occurences get replaced.\n// @param options \\rfoptional{0}. Bitflag options denoting some options for the search. Give 0 for the defaults.\n// Can have values:\n// + @c RF_CASE_IGNORE: If you want the found substring to ignore the case and returns success for any occurence of the string in any case.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you want the found substring to be exact. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would return a failure. Default search is to return any found substring.\n// @return Returns true in case of success, and false if the substring was not even found inside the string\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_Remove(void* thisstr,void* rstr,uint32_t number,const char options);\n#else\n    i_DECLIMEX_ char i_rfString_Remove(void* thisstr,void* rstr,uint32_t* number,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Remove(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_REMOVE,4,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_REMOVE1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Remove() accepts from 2 to 4 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_REMOVE0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_REMOVE,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_REMOVE2(i_THISSTR_,i_REPSTR_) i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(0),i_RFI8_(0))\n        #define i_SELECT_RF_STRING_REMOVE3(i_THISSTR_,i_REPSTR_,i_NUMBER_) i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(0))\n        #define i_SELECT_RF_STRING_REMOVE4(i_THISSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) \\\n            i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_REMOVE1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Remove() accepts from 2 to 4 arguments\\\"\")\n        #define i_SELECT_RF_STRING_REMOVE0(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Remove() accepts from 2 to 4 arguments\\\"\")\n    #else\n        #define rfString_Remove(i_THISSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n// @memberof RF_String\n// @brief Removes all of the characters of the string except those specified\n//\n// This string is scanned for the existence of each characters inside the given\n// @c keepstr. Any character found there is kept in the original string. All other\n// characters are removed.\n// @isinherited{StringX}\n// @lmsFunction\n// @param thisstr The string to remove from @inhtype{String,StringX}\n// @param keepstr A string all of whose characters will be kept in @c thisstr @inhtype{String,StringX} @tmpSTR\n#ifdef RF_IAMHERE_FOR_DOXYGEN\ni_DECLIMEX_ void rfString_KeepOnly(void* thisstr,void* keepstr);\n#else\ni_DECLIMEX_ void i_rfString_KeepOnly(void* thisstr,void* keepstr);\n#define rfString_KeepOnly(i_THISSTR_,I_KEEPSTR_)    i_rfLMS_WRAP2(void,i_rfString_KeepOnly,i_THISSTR_,I_KEEPSTR_)\n#endif\n\n// @memberof RF_String\n// @brief Removes the first n characters from the start of the string.\n//\n// @isinherited{StringX}\n// @param thisstr The string to prune from. @inhtype{String,StringX}\n// @param n The number of characters to remove. Must be a positive integer.\n// @return True if n characters got removed and false if there are not enough characters to remove. (in which case the string becomes empty)\ni_DECLIMEX_ char rfString_PruneStart(void* thisstr,uint32_t n);\n\n// @memberof RF_String\n// @brief Removes the last n characters from the end of the string\n//\n// @isinherited{StringX}\n// @param thisstr The string to prune from. @inhtype{String,StringX}\n// @param n The number of characters to remove. Must be a positive integer.\n// @return True if n characters got removed and false if there are not enough characters to remove. (in which case the string becomes empty)\ni_DECLIMEX_ char rfString_PruneEnd(void* thisstr,uint32_t n);\n\n// @memberof RF_String\n// @brief Removes characters from one point of the string to another going backwards\n//\n// @isinherited{StringX}\n// Removes n characters from the position p (including the character at p) of the string counting backwards. If there is no space to do so, nothing is done and returns false.\n// @param thisstr The string to prune from. @inhtype{String,StringX}\n// @param p The position to remove the characters from. Must be a positive integer. Indexing starts from zero.\n// @param n The number of characters to remove from the position and back.Must be a positive integer.\n// @return Returns true in case of succesfull removal and false in any other case.\ni_DECLIMEX_ char rfString_PruneMiddleB(void* thisstr,uint32_t p,uint32_t n);\n// @memberof RF_String\n// @brief Removes characters from one point of the string to another going forward\n//\n// @isinherited{StringX}\n// Removes n characters from the position p (including the character at p) of the string counting forwards. If there is no space, nothing is done and returns false.\n// @param thisstr The string to prune from. @inhtype{String,StringX}\n// @param p The position to remove the characters from. Must be a positive integer. Indexing starts from zero.\n// @param n The number of characters to remove from the position and on. Must be a positive integer.\n// @return Returns true in case of succesfull removal and false in any other case.\ni_DECLIMEX_ char rfString_PruneMiddleF(void* thisstr,uint32_t p,uint32_t n);\n\n\n// @memberof RF_String\n// @brief Replace all occurences of a String\n//\n// @notinherited{StringX}\n// Replaces all of the specified sstr substring from the String with rstr and reallocates size, unless the new size is smaller\n// @lmsFunction\n// @param thisstr The string in which to do the replacing\n// @param sstr The string to locate and replace from the current string. @inhtype{String,StringX} @tmpSTR\n// @param rstr The string with which to replace it. @inhtype{String,StringX} @tmpSTR\n// @param number \\rfoptional{0}. The number of occurences to replace. Give @e 0 for all the occurences.\n// If the given number is bigger than the actual number of occurences, still all occurences get replaced.\n// @param options \\rfoptional{0}. Bitflag options denoting some options for the string to replace. Give 0 for the defaults. Can have values:\n// + @c RF_CASE_IGNORE: If you want to replace any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to replace only exact matches of the substring. For example an exact replace for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would replace nothing. Default is with this flag off.\n// @return Returns true in case of success, and false if the substring was not even found inside the string\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_Replace(RF_String* thisstr,void* sstr,void* rstr,const uint32_t number,const char options);\n#else\ni_DECLIMEX_ char i_rfString_Replace(RF_String* thisstr,void* sstr,void* rstr,const uint32_t* number,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Replace(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_REPLACE,5,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_REPLACE1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_REPLACE0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_REPLACE,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_REPLACE3(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_) i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(0),i_RFI8_(0))\n        #define i_SELECT_RF_STRING_REPLACE4(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_NUMBER_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(0))\n        #define i_SELECT_RF_STRING_REPLACE5(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_REPLACE2(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\\\"\")\n        #define i_SELECT_RF_STRING_REPLACE1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\\\"\")\n        #define i_SELECT_RF_STRING_REPLACE0(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\\\"\")\n    #else\n        #define rfString_Replace(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n// @memberof RF_String\n// @brief Removes all characters of a substring only from the start of the String\n//\n// @isinherited{StringX}\n// Searches for and removes each individual character inside the @c sub substring from the\n// given String @c thisstr starting from the beginning of the String and until it finds any other character\n// @lmsFunction\n// @param thisstr The string to search in. @inhtype{String,StringX}\n// @param sub The substring to search for. @inhtype{String,StringX} @tmpSTR\n// @return Returns true for success and false if none of @c sub characters were found inside the given String\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\n    i_DECLIMEX_ char rfString_StripStart(void* thisstr,void* sub);\n#else\n    i_DECLIMEX_ char i_rfString_StripStart(void* thisstr,void* sub);\n    #define rfString_StripStart(i_THISSTR_,i_SUBSTR_) i_rfLMSX_WRAP2(char,i_rfString_StripStart,i_THISSTR_,i_SUBSTR_)\n#endif\n// @memberof RF_String\n// @brief Removes all characters of a substring starting from the end of the String\n//\n// @isinherited{StringX}\n// Searches for and removes each individual character inside the @c sub substring from the\n// given String @c thisstr starting from the end of the String and until it finds any other character\n// @lmsFunction\n// @param thisstr The string to search in. @inhtype{String,StringX}\n// @param sub The substring to search for. @inhtype{String,StringX} @tmpSTR\n// @return Returns true for success and false if none of @c sub characters were found inside the given String\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\n    i_DECLIMEX_ char rfString_StripEnd(void* thisstr,void* sub);\n#else\n    i_DECLIMEX_ char i_rfString_StripEnd(void* thisstr,void* sub);\n    #define rfString_StripEnd(i_THISSTR_,i_SUBSTR_) i_rfLMSX_WRAP2(char,i_rfString_StripEnd,i_THISSTR_,i_SUBSTR_)\n#endif\n\n// @memberof RF_String\n// @brief Removes all characters of a substring from both ends of the given String\n//\n// @isinherited{StringX}\n// Searches for and removes each individual character inside the @c sub substring from the\n// given String @c thisstr starting from both the beginning and the end of the String and until it finds any other character\n// @lmsFunction\n// @param thisstr The string to search in. @inhtype{String,StringX}\n// @param sub The substring to search for. @inhtype{String,StringX} @tmpSTR\n// @return Returns true for success and false if none of @c sub characters were found inside the given String\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\n    i_DECLIMEX_ char rfString_Strip(void* thisstr,void* sub);\n#else\n    i_DECLIMEX_ char i_rfString_Strip(void* thisstr,void* sub);\n    #define rfString_Strip(i_THISSTR_,i_SUBSTR_) i_rfLMSX_WRAP2(char,i_rfString_Strip,i_THISSTR_,i_SUBSTR_)\n#endif\n// @}\n/*------------------------------------------------------------------------ RF_String File Descriptor I/O functions-------------------------------------------------------------------------------*/\n// @name String File Descriptor I/O functions\n// @{\n\n// @memberof RF_String\n// @brief Allocates and returns a string from UTF-8 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_String\n// The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\n// Given file character stream must be encoded in UTF-8. A check for valide sequence of bytes is performed.\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return The initialized string or null pointer in case of failure to read the file, or unexpected data (non-UTF8 encoded string)\ni_DECLIMEX_ RF_String* rfString_Create_fUTF8(FILE* f, char* eof);\n// @memberof RF_String\n// @brief Initializes a string from UTF-8 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_String\n// The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\n// Given file character stream must be encoded in UTF-8. A check for valide sequence of bytes is performed.\n// @param str The extended string to initialize\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return Returns either a positive number for succesfull initialization that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF8() can produce.\ni_DECLIMEX_ int32_t rfString_Init_fUTF8(RF_String* str,FILE* f, char* eof);\n\n// @memberof RF_String\n// @brief Assigns to a string from UTF-8 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and assigns it to an RF_StringX\n// The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\n// Given file character stream must be encoded in UTF-8. A check for valide sequence of bytes is performed.\n// @param str The extended string to assign to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this assignment\n// @return Returns either a positive number for succesfull assignment that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF8() can produce.\ni_DECLIMEX_ int32_t rfString_Assign_fUTF8(RF_String* str,FILE* f, char* eof);\n// @memberof RF_String\n// @brief Appends to a string from UTF-8 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and appends it to an RF_StringX\n// The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\n// Given file character stream must be encoded in UTF-8. A check for valid sequence of bytes is performed.\n// @param str The extended string to append to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this appending\n// @return Returns either a positive number for succesfull appending that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF8() can produce.\ni_DECLIMEX_ int32_t rfString_Append_fUTF8(RF_String* str,FILE* f, char* eof);\n\n// @memberof RF_String\n// @cppnotctor\n// @brief Allocates and returns a string from UTF-16 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX\n// The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16.\n// @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return The initialized string or null pointer in case of failure to read the file\ni_DECLIMEX_ RF_String* rfString_Create_fUTF16(FILE* f, char endianess,char* eof);\n// @memberof RF_String\n// @brief Initializes a string from UTF-16 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX\n// The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to initialize\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16.\n// @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return Returns either a positive number for succesfull initialization that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF16LE() can produce.\ni_DECLIMEX_ int32_t rfString_Init_fUTF16(RF_String* str,FILE* f, char endianess,char* eof);\n\n// @memberof RF_String\n// @brief Appends the contents of a UTF-16 file a String\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and appends it to an RF_StringX\n// The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to append to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16.\n// @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this appending\n// @return Returns either a positive number for succesfull appending that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF16LE() can produce.\ni_DECLIMEX_ int32_t rfString_Append_fUTF16(RF_String* str,FILE* f, char endianess,char* eof);\n// @memberof RF_String\n// @brief Assigns the contents of a UTF-16 file to an already initialized string\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and assigns it to an RF_StringX\n// The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to assign to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16.\n// @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this assignment\n// @return Returns either a positive number for succesfull assignment that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF16LE() can produce.\ni_DECLIMEX_ int32_t rfString_Assign_fUTF16(RF_String* str,FILE* f, char endianess,char* eof);\n\n// @memberof RF_String\n// @cppnotctor\n// @brief Allocates and returns a string from UTF-32 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX\n// The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32.\n// @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return The initialized string or null pointer in case of failure to read the file\ni_DECLIMEX_ RF_String* rfString_Create_fUTF32(FILE* f,char endianess, char* eof);\n// @memberof RF_String\n// @brief Initializes a string from UTF-32 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX\n// The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to initialize\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32.\n// @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return Returns either a positive number for succesfull initialization that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF32LE() can produce.\ni_DECLIMEX_ int32_t rfString_Init_fUTF32(RF_String* str,FILE* f,char endianess, char* eof);\n// @memberof RF_String\n// @brief Assigns the contents of a UTF-32 file to a string\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and assigns it as the contents of the given RF_StringX\n// The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to assign to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32.\n// @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this assignment\n// @return Returns either a positive number for succesfull assignment that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF32LE() can produce.\ni_DECLIMEX_ int32_t rfString_Assign_fUTF32(RF_String* str,FILE* f,char endianess, char* eof);\n// @memberof RF_String\n// @brief Appends the contents of a UTF-32 file to a string\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and appends to the given RF_StringX\n// The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to append to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32.\n// @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this appending\n// @return Returns either a positive number for succesfull appending that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF32LE() can produce.\ni_DECLIMEX_ int32_t rfString_Append_fUTF32(RF_String* str,FILE* f,char endianess, char* eof);\n\n// @memberof RF_String\n// @brief Writes a string to a file depending on the given encoding\n//\n// @isinherited{StringX}\n// This function shall output the string @c s into the file descriptor @c f in the given @c encoding .\n// @lmsFunction\n// @param s The string to write to the file @inhtype{String,StringX} @tmpSTR\n// @param f A valid and open file pointer into which to write the string.\n// @param encoding \\rfoptional{@c RF_UTF8} The encoding of the file. Default is @c RF_UTF8. Can be one of:\n// + @c RF_UTF8: For Unicode UTF-8 encoding\n// + @c RF_UTF16_BE: For Unicode UTF-16 encoding in Big Endian endianess\n// + @c RF_UTF16_LE: For Unicode UTF-16 encoding in Little Endian endianess\n// + @c RF_UTF32_BE: For Unicode UTF-32 encoding in Big Endian endianess\n// + @c RF_UTF32_LE: For Unicode UTF-32 encoding in Little Endian endianess\n// @return Returns @c RF_SUCCESS for succesfull writting and error otherwise. Possible errors are:\n// + @c RE_FILE_WRITE: There was an unknown write error\n// + @c RE_FILE_WRITE_BLOCK: The write failed because the file was occupied by another thread and the no block flag was set\n// + @c RE_FILE_BAD: The file descriptor @c f was corrupt\n// + @c RE_FILE_TOOBIG: The file's size exceeds the system limiti\n// + @c RE_INTERRUPT: Writting failed due to a system interrupt\n// + @c RE_FILE_IO: Writting failed because of a physical I/O error\n// + @c RE_FILE_NOSPACE: Writting failed because the device containing the file had no free space\n// + @c RE_FILE_NOT_FILE: Writting failed because the given file descriptor @c f is either non existen or not a file\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\n    i_DECLIMEX_ int32_t rfString_Fwrite(void* s,FILE* f,char encoding);\n#else\n    i_DECLIMEX_ int32_t i_rfString_Fwrite(void* s,FILE* f,char* encoding);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Fwrite(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_FWRITE,3,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_FWRITE1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Fwrite() accepts from 2 to 3 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_FWRITE0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_FWRITE,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_FWRITE3(i_STR_,i_FILE_,i_ENCODING_) i_rfLMSX_WRAP3(int32_t,i_rfString_Fwrite,i_STR_,i_FILE_,i_RFI8_(i_ENCODING_))\n        #define i_SELECT_RF_STRING_FWRITE2(i_STR_,i_FILE_) i_rfLMSX_WRAP3(int32_t,i_rfString_Fwrite,i_STR_,i_FILE_,i_RFI8_(RF_UTF8))\n        #define i_SELECT_RF_STRING_FWRITE1(i_STR_,i_FILE_) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Fwrite() accepts from 2 to 3 arguments\\\"\")\n        #define i_SELECT_RF_STRING_FWRITE0(i_STR_,i_FILE_) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Fwrite() accepts from 2 to 3 arguments\\\"\")\n    #else\n        #define rfString_Fwrite_fUTF8(i_STR_,i_FILE_,i_ENCODING_) i_rfLMSX_WRAP3(int32_t,i_rfString_Fwrite,i_STR_,i_FILE_,i_RFI8_(i_ENCODING_))\n    #endif\n#endif\n\n\n// @}\n// closing the String File I/o functions\n\n#ifdef __cplusplus\n}// closing bracket for calling from C++\n#endif\n\n#else // end of the strings module include\n    #error Attempted to include Refu String manipulation with the String module flag off. Rebuild the library with that option added if you need to include them\n#endif\n\n#endif// include guards end\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/scheduler.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <hw/cpu.h>\n#include <memory/vmem.h>\n\n#define SCHEDULER_MAXNAME 256\n#define SCHEDULER_TASK_PATH_MAX 256\n\n// Single linked list\ntypedef struct task {\n\tuint32_t pid;\n\tchar name[SCHEDULER_MAXNAME];\n\tstruct task *parent;\n\tcpu_state_t* state;\n\tstruct task* next;\n\tstruct task* previous;\n\n\tvoid* stack;\n\tvoid* entry;\n\tstruct vmem_context *memory_context;\n\n\t// Current task state\n\tenum {\n\t\tTASK_STATE_KILLED,\n\t\tTASK_STATE_TERMINATED,\n\t\tTASK_STATE_BLOCKING,\n\t\tTASK_STATE_STOPPED,\n\t\tTASK_STATE_RUNNING\n\t} task_state;\n\n\tchar** environ;\n\tchar** argv;\n\tint argc;\n\n\t// TODO Is this actually the same as PATH_MAX in our toolchain?\n\tchar cwd[SCHEDULER_TASK_PATH_MAX + 1];\n} task_t;\n\nint scheduler_state;\n\ntask_t* scheduler_new(void* entry, task_t* parent, char name[SCHEDULER_MAXNAME],\n\tchar** environ, char** argv, int argc, struct vmem_context* memory_context, bool map_structs);\nvoid scheduler_add(task_t *task);\nvoid scheduler_terminate_current();\ntask_t* scheduler_get_current();\ntask_t* scheduler_select(cpu_state_t* lastRegs);\nvoid scheduler_init();\nvoid scheduler_yield();\nvoid scheduler_remove(task_t *t);\ntask_t* scheduler_fork(task_t* to_fork, cpu_state_t* state);"
  },
  {
    "path": "src/test/resources/samples/langs/C/script",
    "content": "#!/usr/bin/tcc -run -lm\n//\n// ZyklonB scripting plugin, using a custom stack-based language\n//\n// Copyright 2014 Přemysl Janouch.  All rights reserved.\n// See the file LICENSE for licensing information.\n//\n// Just compile this file as usual (sans #!) if you don't feel like using TCC.\n// It is a very basic and portable C99 application.  It's not supposed to be\n// very sophisticated, for it'd get extremely big.\n//\n// The main influences of the language were Factor and Joy, stripped of all\n// even barely complex stuff.  In its current state, it's only really useful as\n// a calculator but it's got great potential for extending.\n//\n// If you don't like something, just change it; this is just an experiment.\n//\n// NOTE: it is relatively easy to abuse.  Be careful.\n//\n\n#define _XOPEN_SOURCE 500\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <time.h>\n#include <stdbool.h>\n#include <strings.h>\n#include <math.h>\n\n#define ADDRESS_SPACE_LIMIT (100 * 1024 * 1024)\n#include <sys/resource.h>\n\n#if defined __GNUC__\n#define ATTRIBUTE_PRINTF(x, y) __attribute__ ((format (printf, x, y)))\n#else // ! __GNUC__\n#define ATTRIBUTE_PRINTF(x, y)\n#endif // ! __GNUC__\n\n#define N_ELEMENTS(a) (sizeof (a) / sizeof ((a)[0]))\n\n// --- Utilities ---------------------------------------------------------------\n\nstatic char *strdup_printf (const char *format, ...) ATTRIBUTE_PRINTF (1, 2);\n\nstatic char *\nstrdup_vprintf (const char *format, va_list ap)\n{\n\tva_list aq;\n\tva_copy (aq, ap);\n\tint size = vsnprintf (NULL, 0, format, aq);\n\tva_end (aq);\n\tif (size < 0)\n\t\treturn NULL;\n\n\tchar buf[size + 1];\n\tsize = vsnprintf (buf, sizeof buf, format, ap);\n\tif (size < 0)\n\t\treturn NULL;\n\n\treturn strdup (buf);\n}\n\nstatic char *\nstrdup_printf (const char *format, ...)\n{\n\tva_list ap;\n\tva_start (ap, format);\n\tchar *result = strdup_vprintf (format, ap);\n\tva_end (ap);\n\treturn result;\n}\n\n// --- Generic buffer ----------------------------------------------------------\n\nstruct buffer\n{\n\tchar *s;                            ///< Buffer data\n\tsize_t alloc;                       ///< Number of bytes allocated\n\tsize_t len;                         ///< Number of bytes used\n\tbool memory_failure;                ///< Memory allocation failed\n};\n\n#define BUFFER_INITIALIZER { NULL, 0, 0, false }\n\nstatic bool\nbuffer_append (struct buffer *self, const void *s, size_t n)\n{\n\tif (self->memory_failure)\n\t\treturn false;\n\n\tif (!self->s)\n\t\tself->s = malloc (self->alloc = 8);\n\twhile (self->len + n > self->alloc)\n\t\tself->s = realloc (self->s, self->alloc <<= 1);\n\n\tif (!self->s)\n\t{\n\t\tself->memory_failure = true;\n\t\treturn false;\n\t}\n\n\tmemcpy (self->s + self->len, s, n);\n\tself->len += n;\n\treturn true;\n}\n\ninline static bool\nbuffer_append_c (struct buffer *self, char c)\n{\n\treturn buffer_append (self, &c, 1);\n}\n\n// --- Data types --------------------------------------------------------------\n\nenum item_type\n{\n\tITEM_STRING,\n\tITEM_WORD,\n\tITEM_INTEGER,\n\tITEM_FLOAT,\n\tITEM_LIST\n};\n\nstruct item\n{\n#define ITEM_HEADER                                                            \\\n\tenum item_type type;                /**< The type of this object        */ \\\n\tstruct item *next;                  /**< Next item on the list/stack    */\n\n\tITEM_HEADER\n};\n\nstruct item_string\n{\n\tITEM_HEADER\n\tsize_t len;                         ///< Length of the string (sans '\\0')\n\tchar value[];                       ///< The null-terminated string value\n};\n\n#define get_string(item)                                                       \\\n\t(assert ((item)->type == ITEM_STRING),                                     \\\n\t ((struct item_string *)(item))->value)\n\n/// It looks like a string but it doesn't quack like a string\n#define item_word item_string\n\n#define get_word(item)                                                         \\\n\t(assert ((item)->type == ITEM_WORD),                                       \\\n\t ((struct item_word *)(item))->value)\n\nstruct item_integer\n{\n\tITEM_HEADER\n\tlong long value;                    ///< The integer value\n};\n\n#define get_integer(item)                                                      \\\n\t(assert ((item)->type == ITEM_INTEGER),                                    \\\n\t ((struct item_integer *)(item))->value)\n\nstruct item_float\n{\n\tITEM_HEADER\n\tlong double value;                  ///< The floating point value\n};\n\n#define get_float(item)                                                        \\\n\t(assert ((item)->type == ITEM_FLOAT),                                      \\\n\t ((struct item_float *)(item))->value)\n\nstruct item_list\n{\n\tITEM_HEADER\n\tstruct item *head;                  ///< The head of the list\n};\n\n#define get_list(item)                                                         \\\n\t(assert ((item)->type == ITEM_LIST),                                       \\\n\t ((struct item_list *)(item))->head)\n\n#define set_list(item, head_)                                                  \\\n\t(assert ((item)->type == ITEM_LIST),                                       \\\n\t item_free_list (((struct item_list *)(item))->head),                      \\\n\t ((struct item_list *)(item))->head = (head_))\n\nconst char *\nitem_type_to_str (enum item_type type)\n{\n\tswitch (type)\n\t{\n\tcase ITEM_STRING:   return \"string\";\n\tcase ITEM_WORD:     return \"word\";\n\tcase ITEM_INTEGER:  return \"integer\";\n\tcase ITEM_FLOAT:    return \"float\";\n\tcase ITEM_LIST:     return \"list\";\n\t}\n\tabort ();\n}\n\n// --- Item management ---------------------------------------------------------\n\nstatic void item_free_list (struct item *);\nstatic struct item *new_clone_list (const struct item *);\n\nstatic void\nitem_free (struct item *item)\n{\n\tif (item->type == ITEM_LIST)\n\t\titem_free_list (get_list (item));\n\tfree (item);\n}\n\nstatic void\nitem_free_list (struct item *item)\n{\n\twhile (item)\n\t{\n\t\tstruct item *link = item;\n\t\titem = item->next;\n\t\titem_free (link);\n\t}\n}\n\nstatic struct item *\nnew_clone (const struct item *item)\n{\n\tsize_t size;\n\tswitch (item->type)\n\t{\n\tcase ITEM_STRING:\n\tcase ITEM_WORD:\n\t{\n\t\tconst struct item_string *x = (const struct item_string *) item;\n\t\tsize = sizeof *x + x->len + 1;\n\t\tbreak;\n\t}\n\tcase ITEM_INTEGER:  size = sizeof (struct item_integer);  break;\n\tcase ITEM_FLOAT:    size = sizeof (struct item_float);    break;\n\tcase ITEM_LIST:     size = sizeof (struct item_list);     break;\n\t}\n\n\tstruct item *clone = malloc (size);\n\tif (!clone)\n\t\treturn NULL;\n\n\tmemcpy (clone, item, size);\n\tif (item->type == ITEM_LIST)\n\t{\n\t\tstruct item_list *x = (struct item_list *) clone;\n\t\tif (x->head && !(x->head = new_clone_list (x->head)))\n\t\t{\n\t\t\tfree (clone);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\tclone->next = NULL;\n\treturn clone;\n}\n\nstatic struct item *\nnew_clone_list (const struct item *item)\n{\n\tstruct item *head = NULL, *clone;\n\tfor (struct item **out = &head; item; item = item->next)\n\t{\n\t\tif (!(clone = *out = new_clone (item)))\n\t\t{\n\t\t\titem_free_list (head);\n\t\t\treturn NULL;\n\t\t}\n\t\tclone->next = NULL;\n\t\tout = &clone->next;\n\t}\n\treturn head;\n}\n\nstatic struct item *\nnew_string (const char *s, ssize_t len)\n{\n\tif (len < 0)\n\t\tlen = strlen (s);\n\n\tstruct item_string *item = calloc (1, sizeof *item + len + 1);\n\tif (!item)\n\t\treturn NULL;\n\n\titem->type = ITEM_STRING;\n\titem->len = len;\n\tmemcpy (item->value, s, len);\n\titem->value[len] = '\\0';\n\treturn (struct item *) item;\n}\n\nstatic struct item *\nnew_word (const char *s, ssize_t len)\n{\n\tstruct item *item = new_string (s, len);\n\tif (!item)\n\t\treturn NULL;\n\n\titem->type = ITEM_WORD;\n\treturn item;\n}\n\nstatic struct item *\nnew_integer (long long value)\n{\n\tstruct item_integer *item = calloc (1, sizeof *item);\n\tif (!item)\n\t\treturn NULL;\n\n\titem->type = ITEM_INTEGER;\n\titem->value = value;\n\treturn (struct item *) item;\n}\n\nstatic struct item *\nnew_float (long double value)\n{\n\tstruct item_float *item = calloc (1, sizeof *item);\n\tif (!item)\n\t\treturn NULL;\n\n\titem->type = ITEM_FLOAT;\n\titem->value = value;\n\treturn (struct item *) item;\n}\n\nstatic struct item *\nnew_list (struct item *head)\n{\n\tstruct item_list *item = calloc (1, sizeof *item);\n\tif (!item)\n\t\treturn NULL;\n\n\titem->type = ITEM_LIST;\n\titem->head = head;\n\treturn (struct item *) item;\n}\n\n// --- Parsing -----------------------------------------------------------------\n\n#define PARSE_ERROR_TABLE(XX)                                                  \\\n\tXX( OK,                  NULL                                  )           \\\n\tXX( EOF,                 \"unexpected end of input\"             )           \\\n\tXX( INVALID_HEXA_ESCAPE, \"invalid hexadecimal escape sequence\" )           \\\n\tXX( INVALID_ESCAPE,      \"unrecognized escape sequence\"        )           \\\n\tXX( MEMORY,              \"memory allocation failure\"           )           \\\n\tXX( FLOAT_RANGE,         \"floating point value out of range\"   )           \\\n\tXX( INTEGER_RANGE,       \"integer out of range\"                )           \\\n\tXX( INVALID_INPUT,       \"invalid input\"                       )           \\\n\tXX( UNEXPECTED_INPUT,    \"unexpected input\"                    )\n\nenum tokenizer_error\n{\n#define XX(x, y) PARSE_ERROR_ ## x,\n\tPARSE_ERROR_TABLE (XX)\n#undef XX\n\tPARSE_ERROR_COUNT\n};\n\nstruct tokenizer\n{\n\tconst char *cursor;\n\tenum tokenizer_error error;\n};\n\nstatic bool\ndecode_hexa_escape (struct tokenizer *self, struct buffer *buf)\n{\n\tint i;\n\tchar c, code = 0;\n\n\tfor (i = 0; i < 2; i++)\n\t{\n\t\tc = tolower (*self->cursor);\n\t\tif (c >= '0' && c <= '9')\n\t\t\tcode = (code << 4) | (c - '0');\n\t\telse if (c >= 'a' && c <= 'f')\n\t\t\tcode = (code << 4) | (c - 'a' + 10);\n\t\telse\n\t\t\tbreak;\n\n\t\tself->cursor++;\n\t}\n\n\tif (!i)\n\t\treturn false;\n\n\tbuffer_append_c (buf, code);\n\treturn true;\n}\n\nstatic bool\ndecode_octal_escape (struct tokenizer *self, struct buffer *buf)\n{\n\tint i;\n\tchar c, code = 0;\n\n\tfor (i = 0; i < 3; i++)\n\t{\n\t\tc = *self->cursor;\n\t\tif (c < '0' || c > '7')\n\t\t\tbreak;\n\n\t\tcode = (code << 3) | (c - '0');\n\t\tself->cursor++;\n\t}\n\n\tif (!i)\n\t\treturn false;\n\n\tbuffer_append_c (buf, code);\n\treturn true;\n}\n\nstatic bool\ndecode_escape_sequence (struct tokenizer *self, struct buffer *buf)\n{\n\t// Support some basic escape sequences from the C language\n\tchar c;\n\tswitch ((c = *self->cursor))\n\t{\n\tcase '\\0':\n\t\tself->error = PARSE_ERROR_EOF;\n\t\treturn false;\n\tcase 'x':\n\tcase 'X':\n\t\tself->cursor++;\n\t\tif (decode_hexa_escape (self, buf))\n\t\t\treturn true;\n\n\t\tself->error = PARSE_ERROR_INVALID_HEXA_ESCAPE;\n\t\treturn false;\n\tdefault:\n\t\tif (decode_octal_escape (self, buf))\n\t\t\treturn true;\n\n\t\tself->cursor++;\n\t\tconst char *from = \"abfnrtv\\\"\\\\\", *to = \"\\a\\b\\f\\n\\r\\t\\v\\\"\\\\\", *x;\n\t\tif ((x = strchr (from, c)))\n\t\t{\n\t\t\tbuffer_append_c (buf, to[x - from]);\n\t\t\treturn true;\n\t\t}\n\n\t\tself->error = PARSE_ERROR_INVALID_ESCAPE;\n\t\treturn false;\n\t}\n}\n\nstatic struct item *\nparse_string (struct tokenizer *self)\n{\n\tstruct buffer buf = BUFFER_INITIALIZER;\n\tstruct item *item = NULL;\n\tchar c;\n\n\twhile (true)\n\tswitch ((c = *self->cursor++))\n\t{\n\tcase '\\0':\n\t\tself->cursor--;\n\t\tself->error = PARSE_ERROR_EOF;\n\t\tgoto end;\n\tcase '\"':\n\t\tif (buf.memory_failure\n\t\t || !(item = new_string (buf.s, buf.len)))\n\t\t\tself->error = PARSE_ERROR_MEMORY;\n\t\tgoto end;\n\tcase '\\\\':\n\t\tif (decode_escape_sequence (self, &buf))\n\t\t\tbreak;\n\t\tgoto end;\n\tdefault:\n\t\tbuffer_append_c (&buf, c);\n\t}\n\nend:\n\tfree (buf.s);\n\treturn item;\n}\n\nstatic struct item *\ntry_parse_number (struct tokenizer *self)\n{\n\t// These two standard library functions can digest a lot of various inputs,\n\t// including NaN and +/- infinity.  That may get a bit confusing.\n\tchar *float_end;\n\terrno = 0;\n\tlong double float_value = strtold (self->cursor, &float_end);\n\tint float_errno = errno;\n\n\tchar *int_end;\n\terrno = 0;\n\tlong long int_value = strtoll (self->cursor, &int_end, 10);\n\tint int_errno = errno;\n\n\t// If they both fail, then this is most probably not a number.\n\tif (float_end == int_end && float_end == self->cursor)\n\t\treturn NULL;\n\n\t// Only use the floating point result if it parses more characters:\n\tstruct item *item;\n\tif (float_end > int_end)\n\t{\n\t\tif (float_errno == ERANGE)\n\t\t{\n\t\t\tself->error = PARSE_ERROR_FLOAT_RANGE;\n\t\t\treturn NULL;\n\t\t}\n\t\tself->cursor = float_end;\n\t\tif (!(item = new_float (float_value)))\n\t\t\tself->error = PARSE_ERROR_MEMORY;\n\t\treturn item;\n\t}\n\telse\n\t{\n\t\tif (int_errno == ERANGE)\n\t\t{\n\t\t\tself->error = PARSE_ERROR_INTEGER_RANGE;\n\t\t\treturn NULL;\n\t\t}\n\t\tself->cursor = int_end;\n\t\tif (!(item = new_integer (int_value)))\n\t\t\tself->error = PARSE_ERROR_MEMORY;\n\t\treturn item;\n\t}\n}\n\nstatic struct item *\nparse_word (struct tokenizer *self)\n{\n\tstruct buffer buf = BUFFER_INITIALIZER;\n\tstruct item *item = NULL;\n\tchar c;\n\n\t// Here we accept almost anything that doesn't break the grammar\n\twhile (!strchr (\" []\\\"\", (c = *self->cursor++)) && (unsigned char) c > ' ')\n\t\tbuffer_append_c (&buf, c);\n\tself->cursor--;\n\n\tif (buf.memory_failure)\n\t\tself->error = PARSE_ERROR_MEMORY;\n\telse if (!buf.len)\n\t\tself->error = PARSE_ERROR_INVALID_INPUT;\n\telse if (!(item = new_word (buf.s, buf.len)))\n\t\tself->error = PARSE_ERROR_MEMORY;\n\n\tfree (buf.s);\n\treturn item;\n}\n\nstatic struct item *parse_item_list (struct tokenizer *);\n\nstatic struct item *\nparse_list (struct tokenizer *self)\n{\n\tstruct item *list = parse_item_list (self);\n\tif (self->error)\n\t{\n\t\tassert (list == NULL);\n\t\treturn NULL;\n\t}\n\tif (!*self->cursor)\n\t{\n\t\tself->error = PARSE_ERROR_EOF;\n\t\titem_free_list (list);\n\t\treturn NULL;\n\t}\n\tassert (*self->cursor == ']');\n\tself->cursor++;\n\treturn new_list (list);\n}\n\nstatic struct item *\nparse_item (struct tokenizer *self)\n{\n\tchar c;\n\tswitch ((c = *self->cursor++))\n\t{\n\tcase '[':  return parse_list (self);\n\tcase '\"':  return parse_string (self);\n\tdefault:;\n\t}\n\n\tself->cursor--;\n\tstruct item *item = try_parse_number (self);\n\tif (!item && !self->error)\n\t\titem = parse_word (self);\n\treturn item;\n}\n\nstatic struct item *\nparse_item_list (struct tokenizer *self)\n{\n\tstruct item *head = NULL;\n\tstruct item **tail = &head;\n\n\tchar c;\n\tbool expected = true;\n\twhile ((c = *self->cursor) && c != ']')\n\t{\n\t\tif (isspace (c))\n\t\t{\n\t\t\tself->cursor++;\n\t\t\texpected = true;\n\t\t\tcontinue;\n\t\t}\n\t\telse if (!expected)\n\t\t{\n\t\t\tself->error = PARSE_ERROR_UNEXPECTED_INPUT;\n\t\t\tgoto fail;\n\t\t}\n\n\t\tif (!(*tail = parse_item (self)))\n\t\t\tgoto fail;\n\t\ttail = &(*tail)->next;\n\t\texpected = false;\n\t}\n\treturn head;\n\nfail:\n\titem_free_list (head);\n\treturn NULL;\n}\n\nstatic struct item *\nparse (const char *s, const char **error)\n{\n\tstruct tokenizer self = { .cursor = s, .error = PARSE_ERROR_OK };\n\tstruct item *list = parse_item_list (&self);\n\tif (!self.error && *self.cursor != '\\0')\n\t{\n\t\tself.error = PARSE_ERROR_UNEXPECTED_INPUT;\n\t\titem_free_list (list);\n\t\tlist = NULL;\n\t}\n\n#define XX(x, y) y,\n\tstatic const char *strings[PARSE_ERROR_COUNT] =\n\t\t{ PARSE_ERROR_TABLE (XX) };\n#undef XX\n\n\tstatic char error_buf[128];\n\tif (self.error && error)\n\t{\n\t\tsnprintf (error_buf, sizeof error_buf, \"at character %d: %s\",\n\t\t\t(int) (self.cursor - s) + 1, strings[self.error]);\n\t\t*error = error_buf;\n\t}\n\treturn list;\n}\n\n// --- Runtime -----------------------------------------------------------------\n\n// TODO: try to think of a _simple_ way to do preemptive multitasking\n\nstruct context\n{\n\tstruct item *stack;                 ///< The current top of the stack\n\tsize_t stack_size;                  ///< Number of items on the stack\n\n\tsize_t reduction_count;             ///< # of function calls so far\n\tsize_t reduction_limit;             ///< The hard limit on function calls\n\n\tchar *error;                        ///< Error information\n\tbool error_is_fatal;                ///< Whether the error can be catched\n\tbool memory_failure;                ///< Memory allocation failure\n\n\tvoid *user_data;                    ///< User data\n};\n\n/// Internal handler for a function\ntypedef bool (*handler_fn) (struct context *);\n\nstruct fn\n{\n\tstruct fn *next;                    ///< The next link in the chain\n\n\thandler_fn handler;                 ///< Internal C handler, or NULL\n\tstruct item *script;                ///< Alternatively runtime code\n\tchar name[];                        ///< The name of the function\n};\n\nstruct fn *g_functions;                 ///< Maps words to functions\n\nstatic void\ncontext_init (struct context *ctx)\n{\n\tctx->stack = NULL;\n\tctx->stack_size = 0;\n\n\tctx->reduction_count = 0;\n\tctx->reduction_limit = 2000;\n\n\tctx->error = NULL;\n\tctx->error_is_fatal = false;\n\tctx->memory_failure = false;\n\n\tctx->user_data = NULL;\n}\n\nstatic void\ncontext_free (struct context *ctx)\n{\n\titem_free_list (ctx->stack);\n\tctx->stack = NULL;\n\n\tfree (ctx->error);\n\tctx->error = NULL;\n}\n\nstatic bool\nset_error (struct context *ctx, const char *format, ...)\n{\n\tfree (ctx->error);\n\n\tva_list ap;\n\tva_start (ap, format);\n\tctx->error = strdup_vprintf (format, ap);\n\tva_end (ap);\n\n\tif (!ctx->error)\n\t\tctx->memory_failure = true;\n\treturn false;\n}\n\nstatic bool\npush (struct context *ctx, struct item *item)\n{\n\t// The `item' is typically a result from new_<type>(), thus when it is null,\n\t// that function must have failed.  This is a shortcut for convenience.\n\tif (!item)\n\t{\n\t\tctx->memory_failure = true;\n\t\treturn false;\n\t}\n\n\tassert (item->next == NULL);\n\titem->next = ctx->stack;\n\tctx->stack = item;\n\tctx->stack_size++;\n\treturn true;\n}\n\nstatic bool\nbump_reductions (struct context *ctx)\n{\n\tif (++ctx->reduction_count >= ctx->reduction_limit)\n\t{\n\t\tctx->error_is_fatal = true;\n\t\treturn set_error (ctx, \"reduction limit reached\");\n\t}\n\treturn true;\n}\n\nstatic bool execute (struct context *, struct item *);\n\nstatic bool\ncall_function (struct context *ctx, const char *name)\n{\n\tstruct fn *iter;\n\tfor (iter = g_functions; iter; iter = iter->next)\n\t\tif (!strcmp (name, iter->name))\n\t\t\tgoto found;\n\treturn set_error (ctx, \"unknown function: %s\", name);\n\nfound:\n\tif (!bump_reductions (ctx))\n\t\treturn false;\n\n\tif (iter->handler\n\t\t? iter->handler (ctx)\n\t\t: execute (ctx, iter->script))\n\t\treturn true;\n\n\t// In this case, `error' is NULL\n\tif (ctx->memory_failure)\n\t\treturn false;\n\n\t// This creates some form of a stack trace\n\tchar *tmp = ctx->error;\n\tctx->error = NULL;\n\tset_error (ctx, \"%s -> %s\", name, tmp);\n\tfree (tmp);\n\treturn false;\n}\n\nstatic void\nfree_function (struct fn *fn)\n{\n\titem_free_list (fn->script);\n\tfree (fn);\n}\n\nstatic void\nunregister_function (const char *name)\n{\n\tfor (struct fn **iter = &g_functions; *iter; iter = &(*iter)->next)\n\t\tif (!strcmp ((*iter)->name, name))\n\t\t{\n\t\t\tstruct fn *tmp = *iter;\n\t\t\t*iter = tmp->next;\n\t\t\tfree_function (tmp);\n\t\t\tbreak;\n\t\t}\n}\n\nstatic struct fn *\nprepend_new_fn (const char *name)\n{\n\tstruct fn *fn = calloc (1, sizeof *fn + strlen (name) + 1);\n\tif (!fn)\n\t\treturn NULL;\n\n\tstrcpy (fn->name, name);\n\tfn->next = g_functions;\n\treturn g_functions = fn;\n}\n\nstatic bool\nregister_handler (const char *name, handler_fn handler)\n{\n\tunregister_function (name);\n\tstruct fn *fn = prepend_new_fn (name);\n\tif (!fn)\n\t\treturn false;\n\tfn->handler = handler;\n\treturn true;\n}\n\nstatic bool\nregister_script (const char *name, struct item *script)\n{\n\tunregister_function (name);\n\tstruct fn *fn = prepend_new_fn (name);\n\tif (!fn)\n\t\treturn false;\n\tfn->script = script;\n\treturn true;\n}\n\nstatic bool\nexecute (struct context *ctx, struct item *script)\n{\n\tfor (; script; script = script->next)\n\t{\n\t\tif (script->type != ITEM_WORD)\n\t\t{\n\t\t\tif (!bump_reductions (ctx)\n\t\t\t || !push (ctx, new_clone (script)))\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (!call_function (ctx, get_word (script)))\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\n// --- Runtime library ---------------------------------------------------------\n\n#define defn(name) static bool name (struct context *ctx)\n\n#define check_stack(n)                                                         \\\n\tif (ctx->stack_size < n) {                                                 \\\n\t\tset_error (ctx, \"stack underflow\");                                    \\\n\t\treturn 0;                                                              \\\n\t}\n\ninline static bool\ncheck_stack_safe (struct context *ctx, size_t n)\n{\n\tcheck_stack (n);\n\treturn true;\n}\n\nstatic bool\ncheck_type (struct context *ctx, const void *item_, enum item_type type)\n{\n\tconst struct item *item = item_;\n\tif (item->type == type)\n\t\treturn true;\n\n\treturn set_error (ctx, \"invalid type: expected `%s', got `%s'\",\n\t\titem_type_to_str (type), item_type_to_str (item->type));\n}\n\nstatic struct item *\npop (struct context *ctx)\n{\n\tcheck_stack (1);\n\tstruct item *top = ctx->stack;\n\tctx->stack = top->next;\n\ttop->next = NULL;\n\tctx->stack_size--;\n\treturn top;\n}\n\n// - - Types - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n#define defn_is_type(name, item_type)                                          \\\n\tdefn (fn_is_##name) {                                                      \\\n\t\tcheck_stack (1);                                                       \\\n\t\tstruct item *top = pop (ctx);                                          \\\n\t\tpush (ctx, new_integer (top->type == (item_type)));                    \\\n\t\titem_free (top);                                                       \\\n\t\treturn true;                                                           \\\n\t}\n\ndefn_is_type (string,  ITEM_STRING)\ndefn_is_type (word,    ITEM_WORD)\ndefn_is_type (integer, ITEM_INTEGER)\ndefn_is_type (float,   ITEM_FLOAT)\ndefn_is_type (list,    ITEM_LIST)\n\ndefn (fn_to_string)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tchar *value;\n\n\tswitch (item->type)\n\t{\n\tcase ITEM_WORD:\n\t\titem->type = ITEM_STRING;\n\tcase ITEM_STRING:\n\t\treturn push (ctx, item);\n\n\tcase ITEM_FLOAT:\n\t\tvalue = strdup_printf (\"%Lf\", get_float (item));\n\t\tbreak;\n\tcase ITEM_INTEGER:\n\t\tvalue = strdup_printf (\"%lld\", get_integer (item));\n\t\tbreak;\n\n\tdefault:\n\t\tset_error (ctx, \"cannot convert `%s' to `%s'\",\n\t\t\titem_type_to_str (item->type), item_type_to_str (ITEM_STRING));\n\t\titem_free (item);\n\t\treturn false;\n\t}\n\n\titem_free (item);\n\tif (!value)\n\t{\n\t\tctx->memory_failure = true;\n\t\treturn false;\n\t}\n\n\titem = new_string (value, -1);\n\tfree (value);\n\treturn push (ctx, item);\n}\n\ndefn (fn_to_integer)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tlong long value;\n\n\tswitch (item->type)\n\t{\n\tcase ITEM_INTEGER:\n\t\treturn push (ctx, item);\n\tcase ITEM_FLOAT:\n\t\tvalue = get_float (item);\n\t\tbreak;\n\n\tcase ITEM_STRING:\n\t{\n\t\tchar *end;\n\t\tconst char *s = get_string (item);\n\t\tvalue = strtoll (s, &end, 10);\n\t\tif (end != s && *s == '\\0')\n\t\t\tbreak;\n\n\t\titem_free (item);\n\t\treturn set_error (ctx, \"integer conversion error\");\n\t}\n\n\tdefault:\n\t\tset_error (ctx, \"cannot convert `%s' to `%s'\",\n\t\t\titem_type_to_str (item->type), item_type_to_str (ITEM_INTEGER));\n\t\titem_free (item);\n\t\treturn false;\n\t}\n\n\titem_free (item);\n\treturn push (ctx, new_integer (value));\n}\n\ndefn (fn_to_float)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tlong double value;\n\n\tswitch (item->type)\n\t{\n\tcase ITEM_FLOAT:\n\t\treturn push (ctx, item);\n\tcase ITEM_INTEGER:\n\t\tvalue = get_integer (item);\n\t\tbreak;\n\n\tcase ITEM_STRING:\n\t{\n\t\tchar *end;\n\t\tconst char *s = get_string (item);\n\t\tvalue = strtold (s, &end);\n\t\tif (end != s && *s == '\\0')\n\t\t\tbreak;\n\n\t\titem_free (item);\n\t\treturn set_error (ctx, \"float conversion error\");\n\t}\n\n\tdefault:\n\t\tset_error (ctx, \"cannot convert `%s' to `%s'\",\n\t\t\titem_type_to_str (item->type), item_type_to_str (ITEM_FLOAT));\n\t\titem_free (item);\n\t\treturn false;\n\t}\n\n\titem_free (item);\n\treturn push (ctx, new_float (value));\n}\n\n// - - Miscellaneous - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\ndefn (fn_length)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tbool success = true;\n\tswitch (item->type)\n\t{\n\tcase ITEM_STRING:\n\t\tsuccess = push (ctx, new_integer (((struct item_string *) item)->len));\n\t\tbreak;\n\tcase ITEM_LIST:\n\t{\n\t\tlong long length = 0;\n\t\tstruct item *iter;\n\t\tfor (iter = get_list (item); iter; iter = iter->next)\n\t\t\tlength++;\n\t\tsuccess = push (ctx, new_integer (length));\n\t\tbreak;\n\t}\n\tdefault:\n\t\tsuccess = set_error (ctx, \"invalid type\");\n\t}\n\titem_free (item);\n\treturn success;\n}\n\n// - - Stack operations  - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\ndefn (fn_dup)\n{\n\tcheck_stack (1);\n\treturn push (ctx, new_clone (ctx->stack));\n}\n\ndefn (fn_drop)\n{\n\tcheck_stack (1);\n\titem_free (pop (ctx));\n\treturn true;\n}\n\ndefn (fn_swap)\n{\n\tcheck_stack (2);\n\tstruct item *second = pop (ctx), *first = pop (ctx);\n\treturn push (ctx, second) && push (ctx, first);\n}\n\ndefn (fn_call)\n{\n\tcheck_stack (1);\n\tstruct item *script = pop (ctx);\n\tbool success = check_type (ctx, script, ITEM_LIST)\n\t\t&& execute (ctx, get_list (script));\n\titem_free (script);\n\treturn success;\n}\n\ndefn (fn_dip)\n{\n\tcheck_stack (2);\n\tstruct item *script = pop (ctx);\n\tstruct item *item   = pop (ctx);\n\tbool success = check_type (ctx, script, ITEM_LIST)\n\t\t&& execute (ctx, get_list (script));\n\titem_free (script);\n\tif (!success)\n\t{\n\t\titem_free (item);\n\t\treturn false;\n\t}\n\treturn push (ctx, item);\n}\n\ndefn (fn_unit)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\treturn push (ctx, new_list (item));\n}\n\ndefn (fn_cons)\n{\n\tcheck_stack (2);\n\tstruct item *list = pop (ctx);\n\tstruct item *item = pop (ctx);\n\tif (!check_type (ctx, list, ITEM_LIST))\n\t{\n\t\titem_free (list);\n\t\titem_free (item);\n\t\treturn false;\n\t}\n\titem->next = get_list (list);\n\t((struct item_list *) list)->head = item;\n\treturn push (ctx, list);\n}\n\ndefn (fn_cat)\n{\n\tcheck_stack (2);\n\tstruct item *scnd = pop (ctx);\n\tstruct item *frst = pop (ctx);\n\tif (!check_type (ctx, frst, ITEM_LIST)\n\t || !check_type (ctx, scnd, ITEM_LIST))\n\t{\n\t\titem_free (frst);\n\t\titem_free (scnd);\n\t\treturn false;\n\t}\n\n\t// XXX: we shouldn't have to do this in O(n)\n\tstruct item **tail = &((struct item_list *) frst)->head;\n\twhile (*tail)\n\t\ttail = &(*tail)->next;\n\t*tail = get_list (scnd);\n\n\t((struct item_list *) scnd)->head = NULL;\n\titem_free (scnd);\n\treturn push (ctx, frst);\n}\n\ndefn (fn_uncons)\n{\n\tcheck_stack (1);\n\tstruct item *list = pop (ctx);\n\tif (!check_type (ctx, list, ITEM_LIST))\n\t\tgoto fail;\n\tstruct item *first = get_list (list);\n\tif (!first)\n\t{\n\t\tset_error (ctx, \"list is empty\");\n\t\tgoto fail;\n\t}\n\t((struct item_list *) list)->head = first->next;\n\tfirst->next = NULL;\n\treturn push (ctx, first) && push (ctx, list);\nfail:\n\titem_free (list);\n\treturn false;\n}\n\n// - - Logical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nstatic bool\nto_boolean (struct context *ctx, struct item *item, bool *ok)\n{\n\tswitch (item->type)\n\t{\n\tcase ITEM_STRING:\n\t\treturn *get_string (item) != '\\0';\n\tcase ITEM_INTEGER:\n\t\treturn get_integer (item) != 0;\n\tcase ITEM_FLOAT:\n\t\treturn get_float   (item) != 0.;\n\tdefault:\n\t\treturn (*ok = set_error (ctx, \"cannot convert `%s' to boolean\",\n\t\t\titem_type_to_str (item->type)));\n\t}\n}\n\ndefn (fn_not)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tbool ok = true;\n\tbool result = !to_boolean (ctx, item, &ok);\n\titem_free (item);\n\treturn ok && push (ctx, new_integer (result));\n}\n\ndefn (fn_and)\n{\n\tcheck_stack (2);\n\tstruct item *op1 = pop (ctx);\n\tstruct item *op2 = pop (ctx);\n\tbool ok = true;\n\tbool result = to_boolean (ctx, op1, &ok) && to_boolean (ctx, op2, &ok);\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok && push (ctx, new_integer (result));\n}\n\ndefn (fn_or)\n{\n\tcheck_stack (2);\n\tstruct item *op1 = pop (ctx);\n\tstruct item *op2 = pop (ctx);\n\tbool ok = true;\n\tbool result = to_boolean (ctx, op1, &ok)\n\t\t|| !ok || to_boolean (ctx, op2, &ok);\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok && push (ctx, new_integer (result));\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\ndefn (fn_if)\n{\n\tcheck_stack (3);\n\tstruct item *else_ = pop (ctx);\n\tstruct item *then_ = pop (ctx);\n\tstruct item *cond_ = pop (ctx);\n\n\tbool ok = true;\n\tbool condition = to_boolean (ctx, cond_, &ok);\n\titem_free (cond_);\n\n\tbool success = false;\n\tif (ok\n\t && check_type (ctx, then_, ITEM_LIST)\n\t && check_type (ctx, else_, ITEM_LIST))\n\t\tsuccess = execute (ctx, condition\n\t\t\t? get_list (then_)\n\t\t\t: get_list (else_));\n\n\titem_free (then_);\n\titem_free (else_);\n\treturn success;\n}\n\ndefn (fn_try)\n{\n\tcheck_stack (2);\n\tstruct item *catch   = pop (ctx);\n\tstruct item *try     = pop (ctx);\n\tbool success = false;\n\tif (!check_type (ctx, try,     ITEM_LIST)\n\t || !check_type (ctx, catch,   ITEM_LIST))\n\t\tgoto fail;\n\n\tif (!execute (ctx, get_list (try)))\n\t{\n\t\tif (ctx->memory_failure || ctx->error_is_fatal)\n\t\t\tgoto fail;\n\n\t\tsuccess = push (ctx, new_string (ctx->error, -1));\n\t\tfree (ctx->error);\n\t\tctx->error = NULL;\n\n\t\tif (success)\n\t\t\tsuccess = execute (ctx, get_list (catch));\n\t}\n\nfail:\n\titem_free (try);\n\titem_free (catch);\n\treturn success;\n}\n\ndefn (fn_map)\n{\n\tcheck_stack (2);\n\tstruct item *fn   = pop (ctx);\n\tstruct item *list = pop (ctx);\n\tif (!check_type (ctx, fn,   ITEM_LIST)\n\t || !check_type (ctx, list, ITEM_LIST))\n\t{\n\t\titem_free (fn);\n\t\titem_free (list);\n\t\treturn false;\n\t}\n\n\tbool success = false;\n\tstruct item *result = NULL, **tail = &result;\n\tfor (struct item *iter = get_list (list); iter; iter = iter->next)\n\t{\n\t\tif (!push (ctx, new_clone (iter))\n\t\t || !execute (ctx, get_list (fn))\n\t\t || !check_stack_safe (ctx, 1))\n\t\t\tgoto fail;\n\n\t\tstruct item *item = pop (ctx);\n\t\t*tail = item;\n\t\ttail = &item->next;\n\t}\n\tsuccess = true;\n\nfail:\n\tset_list (list, result);\n\titem_free (fn);\n\tif (!success)\n\t{\n\t\titem_free (list);\n\t\treturn false;\n\t}\n\treturn push (ctx, list);\n}\n\ndefn (fn_filter)\n{\n\tcheck_stack (2);\n\tstruct item *fn   = pop (ctx);\n\tstruct item *list = pop (ctx);\n\tif (!check_type (ctx, fn,   ITEM_LIST)\n\t || !check_type (ctx, list, ITEM_LIST))\n\t{\n\t\titem_free (fn);\n\t\titem_free (list);\n\t\treturn false;\n\t}\n\n\tbool success = false;\n\tbool ok = true;\n\tstruct item *result = NULL, **tail = &result;\n\tfor (struct item *iter = get_list (list); iter; iter = iter->next)\n\t{\n\t\tif (!push (ctx, new_clone (iter))\n\t\t || !execute (ctx, get_list (fn))\n\t\t || !check_stack_safe (ctx, 1))\n\t\t\tgoto fail;\n\n\t\tstruct item *item = pop (ctx);\n\t\tbool survived = to_boolean (ctx, item, &ok);\n\t\titem_free (item);\n\t\tif (!ok)\n\t\t\tgoto fail;\n\t\tif (!survived)\n\t\t\tcontinue;\n\n\t\tif (!(item = new_clone (iter)))\n\t\t\tgoto fail;\n\t\t*tail = item;\n\t\ttail = &item->next;\n\t}\n\tsuccess = true;\n\nfail:\n\tset_list (list, result);\n\titem_free (fn);\n\tif (!success)\n\t{\n\t\titem_free (list);\n\t\treturn false;\n\t}\n\treturn push (ctx, list);\n}\n\ndefn (fn_fold)\n{\n\tcheck_stack (3);\n\tstruct item *op   = pop (ctx);\n\tstruct item *null = pop (ctx);\n\tstruct item *list = pop (ctx);\n\tbool success = false;\n\tif (!check_type (ctx, op,   ITEM_LIST)\n\t || !check_type (ctx, list, ITEM_LIST))\n\t{\n\t\titem_free (null);\n\t\tgoto fail;\n\t}\n\n\tpush (ctx, null);\n\tfor (struct item *iter = get_list (list); iter; iter = iter->next)\n\t\tif (!push (ctx, new_clone (iter))\n\t\t || !execute (ctx, get_list (op)))\n\t\t\tgoto fail;\n\tsuccess = true;\n\nfail:\n\titem_free (op);\n\titem_free (list);\n\treturn success;\n}\n\ndefn (fn_each)\n{\n\tcheck_stack (2);\n\tstruct item *op   = pop (ctx);\n\tstruct item *list = pop (ctx);\n\tbool success = false;\n\tif (!check_type (ctx, op,   ITEM_LIST)\n\t || !check_type (ctx, list, ITEM_LIST))\n\t\tgoto fail;\n\n\tfor (struct item *iter = get_list (list); iter; iter = iter->next)\n\t\tif (!push (ctx, new_clone (iter))\n\t\t || !execute (ctx, get_list (op)))\n\t\t\tgoto fail;\n\tsuccess = true;\n\nfail:\n\titem_free (op);\n\titem_free (list);\n\treturn success;\n}\n\n// - - Arithmetic  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n// XXX: why not a `struct item_string *` argument?\nstatic bool\npush_repeated_string (struct context *ctx, struct item *op1, struct item *op2)\n{\n\tstruct item_string  *string = (struct item_string  *) op1;\n\tstruct item_integer *repeat = (struct item_integer *) op2;\n\tassert (string->type == ITEM_STRING);\n\tassert (repeat->type == ITEM_INTEGER);\n\n\tif (repeat->value < 0)\n\t\treturn set_error (ctx, \"cannot multiply a string by a negative value\");\n\n\tchar *buf = NULL;\n\tsize_t len = string->len * repeat->value;\n\tif (len < string->len && repeat->value != 0)\n\t\tgoto allocation_fail;\n\n\tbuf = malloc (len);\n\tif (!buf)\n\t\tgoto allocation_fail;\n\n\tfor (size_t i = 0; i < len; i += string->len)\n\t\tmemcpy (buf + i, string->value, string->len);\n\tstruct item *item = new_string (buf, len);\n\tfree (buf);\n\treturn push (ctx, item);\n\nallocation_fail:\n\tctx->memory_failure = true;\n\treturn false;\n}\n\ndefn (fn_times)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_integer (op1) * get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_integer (op1) * get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_float   (op1) * get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float   (get_float   (op1) * get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_STRING)\n\t\tok = push_repeated_string (ctx, op2, op1);\n\telse if (op1->type == ITEM_STRING  && op2->type == ITEM_INTEGER)\n\t\tok = push_repeated_string (ctx, op1, op2);\n\telse\n\t\tok = set_error (ctx, \"cannot multiply `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\ndefn (fn_pow)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\t// TODO: implement this properly, outputting an integer\n\t\tok = push (ctx, new_float (powl (get_integer (op1), get_integer (op2))));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (powl (get_integer (op1), get_float   (op2))));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (powl (get_float   (op1), get_float   (op2))));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float (powl (get_float   (op1), get_integer (op2))));\n\telse\n\t\tok = set_error (ctx, \"cannot exponentiate `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\ndefn (fn_div)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t{\n\t\tif (get_integer (op2) == 0)\n\t\t\tok = set_error (ctx, \"division by zero\");\n\t\telse\n\t\t\tok = push (ctx, new_integer (get_integer (op1) / get_integer (op2)));\n\t}\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (get_integer (op1) / get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (get_float   (op1) / get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float (get_float   (op1) / get_integer (op2)));\n\telse\n\t\tok = set_error (ctx, \"cannot divide `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\ndefn (fn_mod)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t{\n\t\tif (get_integer (op2) == 0)\n\t\t\tok = set_error (ctx, \"division by zero\");\n\t\telse\n\t\t\tok = push (ctx, new_integer (get_integer (op1) % get_integer (op2)));\n\t}\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (fmodl (get_integer (op1), get_float   (op2))));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (fmodl (get_float   (op1), get_float   (op2))));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float (fmodl (get_float   (op1), get_integer (op2))));\n\telse\n\t\tok = set_error (ctx, \"cannot divide `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\nstatic bool\npush_concatenated_string (struct context *ctx,\n\tstruct item *op1, struct item *op2)\n{\n\tstruct item_string *s1 = (struct item_string *) op1;\n\tstruct item_string *s2 = (struct item_string *) op2;\n\tassert (s1->type == ITEM_STRING);\n\tassert (s2->type == ITEM_STRING);\n\n\tchar *buf = NULL;\n\tsize_t len = s1->len + s2->len;\n\tif (len < s1->len || len < s2->len)\n\t\tgoto allocation_fail;\n\n\tbuf = malloc (len);\n\tif (!buf)\n\t\tgoto allocation_fail;\n\n\tmemcpy (buf,           s1->value, s1->len);\n\tmemcpy (buf + s1->len, s2->value, s2->len);\n\tstruct item *item = new_string (buf, len);\n\tfree (buf);\n\treturn push (ctx, item);\n\nallocation_fail:\n\tctx->memory_failure = true;\n\treturn false;\n\n}\n\ndefn (fn_plus)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_integer (op1) + get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_integer (op1) + get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_float   (op1) + get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float   (get_float   (op1) + get_integer (op2)));\n\telse if (op1->type == ITEM_STRING  && op2->type == ITEM_STRING)\n\t\tok = push_concatenated_string (ctx, op1, op2);\n\telse\n\t\tok = set_error (ctx, \"cannot add `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\ndefn (fn_minus)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_integer (op1) - get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_integer (op1) - get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_float   (op1) - get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float   (get_float   (op1) - get_integer (op2)));\n\telse\n\t\tok = set_error (ctx, \"cannot subtract `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\n// - - Comparison  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nstatic int\ncompare_strings (struct item_string *s1, struct item_string *s2)\n{\n\t// XXX: not entirely correct wrt. null bytes\n\tsize_t len = (s1->len < s2->len ? s1->len : s2->len) + 1;\n\treturn memcmp (s1->value, s2->value, len);\n}\n\nstatic bool compare_lists (struct item *, struct item *);\n\nstatic bool\ncompare_list_items (struct item *op1, struct item *op2)\n{\n\tif (op1->type != op2->type)\n\t\treturn false;\n\n\tswitch (op1->type)\n\t{\n\tcase ITEM_STRING:\n\tcase ITEM_WORD:\n\t\treturn !compare_strings ((struct item_string *) op1,\n\t\t\t(struct item_string *) op2);\n\tcase ITEM_FLOAT:\n\t\treturn get_float (op1) == get_float (op2);\n\tcase ITEM_INTEGER:\n\t\treturn get_integer (op1) == get_integer (op2);\n\tcase ITEM_LIST:\n\t\treturn compare_lists (get_list (op1), get_list (op2));\n\t}\n\tabort ();\n}\n\nstatic bool\ncompare_lists (struct item *op1, struct item *op2)\n{\n\twhile (op1 && op2)\n\t{\n\t\tif (!compare_list_items (op1, op2))\n\t\t\treturn false;\n\n\t\top1 = op1->next;\n\t\top2 = op2->next;\n\t}\n\treturn !op1 && !op2;\n}\n\ndefn (fn_eq)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_integer (op1) == get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_integer (get_integer (op1) == get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_integer (get_float   (op1) == get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_float   (op1) == get_integer (op2)));\n\telse if (op1->type == ITEM_LIST    && op2->type == ITEM_LIST)\n\t\tok = push (ctx, new_integer (compare_lists\n\t\t\t(get_list (op1), get_list (op2))));\n\telse if (op1->type == ITEM_STRING  && op2->type == ITEM_STRING)\n\t\tok = push (ctx, new_integer (compare_strings\n\t\t\t((struct item_string *)(op1), (struct item_string *)(op2)) == 0));\n\telse\n\t\tok = set_error (ctx, \"cannot compare `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\ndefn (fn_lt)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_integer (op1) < get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_integer (get_integer (op1) < get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_integer (get_float   (op1) < get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_float   (op1) < get_integer (op2)));\n\telse if (op1->type == ITEM_STRING  && op2->type == ITEM_STRING)\n\t\tok = push (ctx, new_integer (compare_strings\n\t\t\t((struct item_string *)(op1), (struct item_string *)(op2)) < 0));\n\telse\n\t\tok = set_error (ctx, \"cannot compare `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\n// - - Utilities - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\ndefn (fn_rand)\n{\n\treturn push (ctx, new_float ((long double) rand ()\n\t\t/ ((long double) RAND_MAX + 1)));\n}\n\ndefn (fn_time)\n{\n\treturn push (ctx, new_integer (time (NULL)));\n}\n\n// XXX: this is a bit too constrained; combines strftime() with gmtime()\ndefn (fn_strftime)\n{\n\tcheck_stack (2);\n\tstruct item *format = pop (ctx);\n\tstruct item *time_  = pop (ctx);\n\tbool success = false;\n\tif (!check_type (ctx, time_,  ITEM_INTEGER)\n\t || !check_type (ctx, format, ITEM_STRING))\n\t\tgoto fail;\n\n\tif (get_integer (time_) < 0)\n\t{\n\t\tset_error (ctx, \"invalid time value\");\n\t\tgoto fail;\n\t}\n\n\tchar buf[128];\n\ttime_t time__ = get_integer (time_);\n\tstruct tm tm;\n\tgmtime_r (&time__, &tm);\n\tbuf[strftime (buf, sizeof buf, get_string (format), &tm)] = '\\0';\n\tsuccess = push (ctx, new_string (buf, -1));\n\nfail:\n\titem_free (time_);\n\titem_free (format);\n\treturn success;\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nstatic void item_list_to_str (const struct item *, struct buffer *);\n\nstatic void\nstring_to_str (const struct item_string *string, struct buffer *buf)\n{\n\tbuffer_append_c (buf, '\"');\n\tfor (size_t i = 0; i < string->len; i++)\n\t{\n\t\tchar c = string->value[i];\n\t\tif      (c == '\\n')  buffer_append (buf, \"\\\\n\", 2);\n\t\telse if (c == '\\r')  buffer_append (buf, \"\\\\r\", 2);\n\t\telse if (c == '\\t')  buffer_append (buf, \"\\\\t\", 2);\n\t\telse if (!isprint (c))\n\t\t{\n\t\t\tchar tmp[8];\n\t\t\tsnprintf (tmp, sizeof tmp, \"\\\\x%02x\", (unsigned char) c);\n\t\t\tbuffer_append (buf, tmp, strlen (tmp));\n\t\t}\n\t\telse if (c == '\\\\')  buffer_append (buf, \"\\\\\\\\\", 2);\n\t\telse if (c == '\"')   buffer_append (buf, \"\\\\\\\"\", 2);\n\t\telse                 buffer_append_c (buf, c);\n\t}\n\tbuffer_append_c (buf, '\"');\n}\n\nstatic void\nitem_to_str (const struct item *item, struct buffer *buf)\n{\n\tswitch (item->type)\n\t{\n\t\tchar *x;\n\tcase ITEM_STRING:\n\t\tstring_to_str ((struct item_string *) item, buf);\n\t\tbreak;\n\tcase ITEM_WORD:\n\t{\n\t\tstruct item_word *word = (struct item_word *) item;\n\t\tbuffer_append (buf, word->value, word->len);\n\t\tbreak;\n\t}\n\tcase ITEM_INTEGER:\n\t\tif (!(x = strdup_printf (\"%lld\", get_integer (item))))\n\t\t\tgoto alloc_failure;\n\t\tbuffer_append (buf, x, strlen (x));\n\t\tfree (x);\n\t\tbreak;\n\tcase ITEM_FLOAT:\n\t\tif (!(x = strdup_printf (\"%Lf\", get_float (item))))\n\t\t\tgoto alloc_failure;\n\t\tbuffer_append (buf, x, strlen (x));\n\t\tfree (x);\n\t\tbreak;\n\tcase ITEM_LIST:\n\t\tbuffer_append_c (buf, '[');\n\t\titem_list_to_str (get_list (item), buf);\n\t\tbuffer_append_c (buf, ']');\n\t\tbreak;\n\t}\n\treturn;\n\nalloc_failure:\n\t// This is a bit hackish but it simplifies stuff\n\tbuf->memory_failure = true;\n\tfree (buf->s);\n\tbuf->s = NULL;\n}\n\nstatic void\nitem_list_to_str (const struct item *script, struct buffer *buf)\n{\n\tif (!script)\n\t\treturn;\n\n\titem_to_str (script, buf);\n\twhile ((script = script->next))\n\t{\n\t\tbuffer_append_c (buf, ' ');\n\t\titem_to_str (script, buf);\n\t}\n}\n\n// --- IRC protocol ------------------------------------------------------------\n\nstruct message\n{\n\tchar *prefix;                       ///< Message prefix\n\tchar *command;                      ///< IRC command\n\tchar *params[16];                   ///< Command parameters (0-terminated)\n\tsize_t n_params;                    ///< Number of parameters present\n};\n\ninline static char *\ncut_word (char **s)\n{\n\tchar *start = *s, *end = *s + strcspn (*s, \" \");\n\t*s = end + strspn (end, \" \");\n\t*end = '\\0';\n\treturn start;\n}\n\nstatic bool\nparse_message (char *s, struct message *msg)\n{\n\tmemset (msg, 0, sizeof *msg);\n\n\t// Ignore IRC 3.2 message tags, if present\n\tif (*s == '@')\n\t{\n\t\ts += strcspn (s, \" \");\n\t\ts += strspn (s, \" \");\n\t}\n\n\t// Prefix\n\tif (*s == ':')\n\t\tmsg->prefix = cut_word (&s) + 1;\n\n\t// Command\n\tif (!*(msg->command = cut_word (&s)))\n\t\treturn false;\n\n\t// Parameters\n\twhile (*s)\n\t{\n\t\tsize_t n = msg->n_params++;\n\t\tif (msg->n_params >= N_ELEMENTS (msg->params))\n\t\t\treturn false;\n\t\tif (*s == ':')\n\t\t{\n\t\t\tmsg->params[n] = ++s;\n\t\t\tbreak;\n\t\t}\n\t\tmsg->params[n] = cut_word (&s);\n\t}\n\treturn true;\n}\n\nstatic struct message *\nread_message (void)\n{\n\tstatic bool discard = false;\n\tstatic char buf[1025];\n\tstatic struct message msg;\n\n\tbool discard_this;\n\tdo\n\t{\n\t\tif (!fgets (buf, sizeof buf, stdin))\n\t\t\treturn NULL;\n\t\tsize_t len = strlen (buf);\n\n\t\t// Just to be on the safe side, if the line overflows our buffer,\n\t\t// ignore everything up until the next line.\n\t\tdiscard_this = discard;\n\t\tif (len >= 2 && !strcmp (buf + len - 2, \"\\r\\n\"))\n\t\t{\n\t\t\tbuf[len -= 2] = '\\0';\n\t\t\tdiscard = false;\n\t\t}\n\t\telse\n\t\t\tdiscard = true;\n\t}\n\t// Invalid messages are silently ignored\n\twhile (discard_this || !parse_message (buf, &msg));\n\treturn &msg;\n}\n\n// --- Interfacing with the bot ------------------------------------------------\n\n#define BOT_PRINT \"ZYKLONB print :script: \"\n\nstatic const char *\nget_config (const char *key)\n{\n\tprintf (\"ZYKLONB get_config :%s\\r\\n\", key);\n\tstruct message *msg = read_message ();\n\tif (!msg || msg->n_params <= 0)\n\t\texit (EXIT_FAILURE);\n\treturn msg->params[0];\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n// TODO: implement more functions; try to avoid writing them in C\n\nstatic bool\ninit_runtime_library_scripts (void)\n{\n\tbool ok = true;\n\n\t// It's much cheaper (and more fun) to define functions in terms of other\n\t// ones.  The \"unit tests\" serve a secondary purpose of showing the usage.\n\tstruct script\n\t{\n\t\tconst char *name;               ///< Name of the function\n\t\tconst char *definition;         ///< The defining script\n\t\tconst char *unit_test;          ///< Trivial unit test, must return 1\n\t}\n\tscripts[] =\n\t{\n\t\t{ \"nip\",     \"swap drop\",                    \"1 2 nip 2 =\"            },\n\t\t{ \"over\",    \"[dup] dip swap\",               \"1 2 over nip nip 1 =\"   },\n\t\t{ \"swons\",   \"swap cons\",                    \"[2] 1 swons [1 2] =\"    },\n\t\t{ \"first\",   \"uncons drop\",                  \"[1 2 3] first 1 =\"      },\n\t\t{ \"rest\",    \"uncons swap drop\",             \"[1 2 3] rest [2 3] =\"   },\n\t\t{ \"reverse\", \"[] swap [swap cons] each\",     \"[1 2] reverse [2 1] =\"  },\n\t\t{ \"curry\",   \"cons\",                         \"1 2 [+] curry call 3 =\" },\n\n\t\t{ \"xor\",     \"not swap not + 1 =\",           \"1 1 xor 0 =\"            },\n\t\t{ \"min\",     \"over over < [drop] [nip] if\",  \"1 2 min 1 =\"            },\n\t\t{ \"max\",     \"over over > [drop] [nip] if\",  \"1 2 max 2 =\"            },\n\n\t\t{ \"all?\",    \"[and] cat 1 swap fold\",        \"[3 4 5] [> 3] all? 0 =\" },\n\t\t{ \"any?\",    \"[or] cat 0 swap fold\",         \"[3 4 5] [> 3] any? 1 =\" },\n\n\t\t{ \">\",       \"swap <\",                       \"1 2 > 0 =\"              },\n\t\t{ \"!=\",      \"= not\",                        \"1 2 != 1 =\"             },\n\t\t{ \"<=\",      \"> not\",                        \"1 2 <= 1 =\"             },\n\t\t{ \">=\",      \"< not\",                        \"1 2 >= 0 =\"             },\n\n\t\t// XXX: this is a bit crazy and does not work with an empty list\n\t\t{ \"join\",   \"[uncons] dip swap [[dup] dip swap [+ +] dip] each drop\",\n\t\t  \"[1 2 3] [>string] map \\\" -> \\\" join \\\"1 -> 2 -> 3\\\" =\"             },\n\t};\n\n\tfor (size_t i = 0; i < N_ELEMENTS (scripts); i++)\n\t{\n\t\tconst char *error = NULL;\n\t\tstruct item *script = parse (scripts[i].definition, &error);\n\t\tif (error)\n\t\t{\n\t\t\tprintf (BOT_PRINT \"error parsing internal script `%s': %s\\r\\n\",\n\t\t\t\tscripts[i].definition, error);\n\t\t\tok = false;\n\t\t}\n\t\telse\n\t\t\tok &= register_script (scripts[i].name, script);\n\t}\n\n\tstruct context ctx;\n\tfor (size_t i = 0; i < N_ELEMENTS (scripts); i++)\n\t{\n\t\tconst char *error = NULL;\n\t\tstruct item *script = parse (scripts[i].unit_test, &error);\n\t\tif (error)\n\t\t{\n\t\t\tprintf (BOT_PRINT \"error parsing unit test for `%s': %s\\r\\n\",\n\t\t\t\tscripts[i].name, error);\n\t\t\tok = false;\n\t\t\tcontinue;\n\t\t}\n\t\tcontext_init (&ctx);\n\t\texecute (&ctx, script);\n\t\titem_free_list (script);\n\n\t\tconst char *failure = NULL;\n\t\tif (ctx.memory_failure)\n\t\t\tfailure = \"memory allocation failure\";\n\t\telse if (ctx.error)\n\t\t\tfailure = ctx.error;\n\t\telse if (ctx.stack_size != 1)\n\t\t\tfailure = \"too many results on the stack\";\n\t\telse if (ctx.stack->type != ITEM_INTEGER)\n\t\t\tfailure = \"result is not an integer\";\n\t\telse if (get_integer (ctx.stack) != 1)\n\t\t\tfailure = \"wrong test result\";\n\t\tif (failure)\n\t\t{\n\t\t\tprintf (BOT_PRINT \"error executing unit test for `%s': %s\\r\\n\",\n\t\t\t\tscripts[i].name, failure);\n\t\t\tok = false;\n\t\t}\n\t\tcontext_free (&ctx);\n\t}\n\treturn ok;\n}\n\nstatic bool\ninit_runtime_library (void)\n{\n\tbool ok = true;\n\n\t// Type detection\n\tok &= register_handler (\"string?\",  fn_is_string);\n\tok &= register_handler (\"word?\",    fn_is_word);\n\tok &= register_handler (\"integer?\", fn_is_integer);\n\tok &= register_handler (\"float?\",   fn_is_float);\n\tok &= register_handler (\"list?\",    fn_is_list);\n\n\t// Type conversion\n\tok &= register_handler (\">string\",  fn_to_string);\n\tok &= register_handler (\">integer\", fn_to_integer);\n\tok &= register_handler (\">float\",   fn_to_float);\n\n\t// Miscellaneous\n\tok &= register_handler (\"length\",   fn_length);\n\n\t// Basic stack manipulation\n\tok &= register_handler (\"dup\",      fn_dup);\n\tok &= register_handler (\"drop\",     fn_drop);\n\tok &= register_handler (\"swap\",     fn_swap);\n\n\t// Calling stuff\n\tok &= register_handler (\"call\",     fn_call);\n\tok &= register_handler (\"dip\",      fn_dip);\n\n\t// Control flow\n\tok &= register_handler (\"if\",       fn_if);\n\tok &= register_handler (\"try\",      fn_try);\n\n\t// List processing\n\tok &= register_handler (\"map\",      fn_map);\n\tok &= register_handler (\"filter\",   fn_filter);\n\tok &= register_handler (\"fold\",     fn_fold);\n\tok &= register_handler (\"each\",     fn_each);\n\n\t// List manipulation\n\tok &= register_handler (\"unit\",     fn_unit);\n\tok &= register_handler (\"cons\",     fn_cons);\n\tok &= register_handler (\"cat\",      fn_cat);\n\tok &= register_handler (\"uncons\",   fn_uncons);\n\n\t// Arithmetic operations\n\tok &= register_handler (\"+\",        fn_plus);\n\tok &= register_handler (\"-\",        fn_minus);\n\tok &= register_handler (\"*\",        fn_times);\n\tok &= register_handler (\"^\",        fn_pow);\n\tok &= register_handler (\"/\",        fn_div);\n\tok &= register_handler (\"%\",        fn_mod);\n\n\t// Comparison\n\tok &= register_handler (\"=\",        fn_eq);\n\tok &= register_handler (\"<\",        fn_lt);\n\n\t// Logical operations\n\tok &= register_handler (\"not\",      fn_not);\n\tok &= register_handler (\"and\",      fn_and);\n\tok &= register_handler (\"or\",       fn_or);\n\n\t// Utilities\n\tok &= register_handler (\"rand\",     fn_rand);\n\tok &= register_handler (\"time\",     fn_time);\n\tok &= register_handler (\"strftime\", fn_strftime);\n\n\tok &= init_runtime_library_scripts ();\n\treturn ok;\n}\n\nstatic void\nfree_runtime_library (void)\n{\n\tstruct fn *next, *iter;\n\tfor (iter = g_functions; iter; iter = next)\n\t{\n\t\tnext = iter->next;\n\t\tfree_function (iter);\n\t}\n}\n\n// --- Function database -------------------------------------------------------\n\n// TODO: a global variable storing the various procedures (db)\n// XXX: defining procedures would ideally need some kind of an ACL\n\nstatic void\nread_db (void)\n{\n\t// TODO\n}\n\nstatic void\nwrite_db (void)\n{\n\t// TODO\n}\n\n// --- Main --------------------------------------------------------------------\n\nstatic char *g_prefix;\n\nstruct user_info\n{\n\tchar *ctx;                          ///< Context: channel or user\n\tchar *ctx_quote;                    ///< Reply quotation\n};\n\ndefn (fn_dot)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tstruct user_info *info = ctx->user_data;\n\n\tstruct buffer buf = BUFFER_INITIALIZER;\n\titem_to_str (item, &buf);\n\titem_free (item);\n\tbuffer_append_c (&buf, '\\0');\n\tif (buf.memory_failure)\n\t{\n\t\tctx->memory_failure = true;\n\t\treturn false;\n\t}\n\n\tif (buf.len > 255)\n\t\tbuf.s[255] = '\\0';\n\n\tprintf (\"PRIVMSG %s :%s%s\\r\\n\", info->ctx, info->ctx_quote, buf.s);\n\tfree (buf.s);\n\treturn true;\n}\n\nstatic void\nprocess_message (struct message *msg)\n{\n\tif (!msg->prefix\n\t || strcasecmp (msg->command, \"PRIVMSG\")\n\t || msg->n_params < 2)\n\t\treturn;\n\tchar *line = msg->params[1];\n\n\t// Filter out only our commands\n\tsize_t prefix_len = strlen (g_prefix);\n\tif (strncmp (line, g_prefix, prefix_len))\n\t\treturn;\n\tline += prefix_len;\n\n\tchar *command = cut_word (&line);\n\tif (strcasecmp (command, \"script\"))\n\t\treturn;\n\n\t// Retrieve information on how to respond back\n\tchar *msg_ctx = msg->prefix, *x;\n\tif ((x = strchr (msg_ctx, '!')))\n\t\t*x = '\\0';\n\n\tchar *msg_ctx_quote;\n\tif (strchr (\"#+&!\", *msg->params[0]))\n\t{\n\t\tmsg_ctx_quote = strdup_printf (\"%s: \", msg_ctx);\n\t\tmsg_ctx = msg->params[0];\n\t}\n\telse\n\t\tmsg_ctx_quote = strdup (\"\");\n\n\tif (!msg_ctx_quote)\n\t{\n\t\tprintf (BOT_PRINT \"%s\\r\\n\", \"memory allocation failure\");\n\t\treturn;\n\t}\n\n\tstruct user_info info;\n\tinfo.ctx = msg_ctx;\n\tinfo.ctx_quote = msg_ctx_quote;\n\n\t// Finally parse and execute the macro\n\tconst char *error = NULL;\n\tstruct item *script = parse (line, &error);\n\tif (error)\n\t{\n\t\tprintf (\"PRIVMSG %s :%s%s: %s\\r\\n\",\n\t\t\tmsg_ctx, msg_ctx_quote, \"parse error\", error);\n\t\tgoto end;\n\t}\n\n\tstruct context ctx;\n\tcontext_init (&ctx);\n\tctx.user_data = &info;\n\texecute (&ctx, script);\n\titem_free_list (script);\n\n\tconst char *failure = NULL;\n\tif (ctx.memory_failure)\n\t\tfailure = \"memory allocation failure\";\n\telse if (ctx.error)\n\t\tfailure = ctx.error;\n\tif (failure)\n\t\tprintf (\"PRIVMSG %s :%s%s: %s\\r\\n\",\n\t\t\tmsg_ctx, msg_ctx_quote, \"runtime error\", failure);\n\tcontext_free (&ctx);\nend:\n\tfree (msg_ctx_quote);\n}\n\nint\nmain (int argc, char *argv[])\n{\n\tfreopen (NULL, \"rb\", stdin);   setvbuf (stdin,  NULL, _IOLBF, BUFSIZ);\n\tfreopen (NULL, \"wb\", stdout);  setvbuf (stdout, NULL, _IOLBF, BUFSIZ);\n\n\tstruct rlimit limit =\n\t{\n\t\t.rlim_cur = ADDRESS_SPACE_LIMIT,\n\t\t.rlim_max = ADDRESS_SPACE_LIMIT\n\t};\n\n\t// Lower the memory limits to something sensible to prevent abuse\n\t(void) setrlimit (RLIMIT_AS, &limit);\n\n\tread_db ();\n\tif (!init_runtime_library ()\n\t || !register_handler (\".\", fn_dot))\n\t\tprintf (BOT_PRINT \"%s\\r\\n\", \"runtime library initialization failed\");\n\n\tg_prefix = strdup (get_config (\"prefix\"));\n\tprintf (\"ZYKLONB register\\r\\n\");\n\tstruct message *msg;\n\twhile ((msg = read_message ()))\n\t\tprocess_message (msg);\n\n\tfree_runtime_library ();\n\tfree (g_prefix);\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/sgd_fast.c",
    "content": "/* Generated by Cython 0.17.4 on Mon Jan  7 18:29:40 2013 */\n\n#define PY_SSIZE_T_CLEAN\n#include \"Python.h\"\n#ifndef Py_PYTHON_H\n    #error Python headers needed to compile C extensions, please install development version of Python.\n#elif PY_VERSION_HEX < 0x02040000\n    #error Cython requires Python 2.4+.\n#else\n#include <stddef.h> /* For offsetof */\n#ifndef offsetof\n#define offsetof(type, member) ( (size_t) & ((type*)0) -> member )\n#endif\n#if !defined(WIN32) && !defined(MS_WINDOWS)\n  #ifndef __stdcall\n    #define __stdcall\n  #endif\n  #ifndef __cdecl\n    #define __cdecl\n  #endif\n  #ifndef __fastcall\n    #define __fastcall\n  #endif\n#endif\n#ifndef DL_IMPORT\n  #define DL_IMPORT(t) t\n#endif\n#ifndef DL_EXPORT\n  #define DL_EXPORT(t) t\n#endif\n#ifndef PY_LONG_LONG\n  #define PY_LONG_LONG LONG_LONG\n#endif\n#ifndef Py_HUGE_VAL\n  #define Py_HUGE_VAL HUGE_VAL\n#endif\n#ifdef PYPY_VERSION\n#define CYTHON_COMPILING_IN_PYPY 1\n#define CYTHON_COMPILING_IN_CPYTHON 0\n#else\n#define CYTHON_COMPILING_IN_PYPY 0\n#define CYTHON_COMPILING_IN_CPYTHON 1\n#endif\n#if PY_VERSION_HEX < 0x02050000\n  typedef int Py_ssize_t;\n  #define PY_SSIZE_T_MAX INT_MAX\n  #define PY_SSIZE_T_MIN INT_MIN\n  #define PY_FORMAT_SIZE_T \"\"\n  #define CYTHON_FORMAT_SSIZE_T \"\"\n  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)\n  #define PyInt_AsSsize_t(o)   __Pyx_PyInt_AsInt(o)\n  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \\\n                                (PyErr_Format(PyExc_TypeError, \\\n                                              \"expected index value, got %.200s\", Py_TYPE(o)->tp_name), \\\n                                 (PyObject*)0))\n  #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \\\n                                  !PyComplex_Check(o))\n  #define PyIndex_Check __Pyx_PyIndex_Check\n  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)\n  #define __PYX_BUILD_PY_SSIZE_T \"i\"\n#else\n  #define __PYX_BUILD_PY_SSIZE_T \"n\"\n  #define CYTHON_FORMAT_SSIZE_T \"z\"\n  #define __Pyx_PyIndex_Check PyIndex_Check\n#endif\n#if PY_VERSION_HEX < 0x02060000\n  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)\n  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)\n  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)\n  #define PyVarObject_HEAD_INIT(type, size) \\\n          PyObject_HEAD_INIT(type) size,\n  #define PyType_Modified(t)\n  typedef struct {\n     void *buf;\n     PyObject *obj;\n     Py_ssize_t len;\n     Py_ssize_t itemsize;\n     int readonly;\n     int ndim;\n     char *format;\n     Py_ssize_t *shape;\n     Py_ssize_t *strides;\n     Py_ssize_t *suboffsets;\n     void *internal;\n  } Py_buffer;\n  #define PyBUF_SIMPLE 0\n  #define PyBUF_WRITABLE 0x0001\n  #define PyBUF_FORMAT 0x0004\n  #define PyBUF_ND 0x0008\n  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)\n  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)\n  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)\n  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)\n  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)\n  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)\n  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)\n  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);\n  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);\n#endif\n#if PY_MAJOR_VERSION < 3\n  #define __Pyx_BUILTIN_MODULE_NAME \"__builtin__\"\n  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \\\n          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\n#else\n  #define __Pyx_BUILTIN_MODULE_NAME \"builtins\"\n  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \\\n          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\n#endif\n#if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6\n  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), \"UTF-8\", \"strict\")\n#endif\n#if PY_MAJOR_VERSION >= 3\n  #define Py_TPFLAGS_CHECKTYPES 0\n  #define Py_TPFLAGS_HAVE_INDEX 0\n#endif\n#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)\n  #define Py_TPFLAGS_HAVE_NEWBUFFER 0\n#endif\n#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)\n  #define CYTHON_PEP393_ENABLED 1\n  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \\\n                                              0 : _PyUnicode_Ready((PyObject *)(op)))\n  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)\n  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)\n  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)\n#else\n  #define CYTHON_PEP393_ENABLED 0\n  #define __Pyx_PyUnicode_READY(op)       (0)\n  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)\n  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))\n  #define __Pyx_PyUnicode_READ(k, d, i)   ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i]))\n#endif\n#if PY_MAJOR_VERSION >= 3\n  #define PyBaseString_Type            PyUnicode_Type\n  #define PyStringObject               PyUnicodeObject\n  #define PyString_Type                PyUnicode_Type\n  #define PyString_Check               PyUnicode_Check\n  #define PyString_CheckExact          PyUnicode_CheckExact\n#endif\n#if PY_VERSION_HEX < 0x02060000\n  #define PyBytesObject                PyStringObject\n  #define PyBytes_Type                 PyString_Type\n  #define PyBytes_Check                PyString_Check\n  #define PyBytes_CheckExact           PyString_CheckExact\n  #define PyBytes_FromString           PyString_FromString\n  #define PyBytes_FromStringAndSize    PyString_FromStringAndSize\n  #define PyBytes_FromFormat           PyString_FromFormat\n  #define PyBytes_DecodeEscape         PyString_DecodeEscape\n  #define PyBytes_AsString             PyString_AsString\n  #define PyBytes_AsStringAndSize      PyString_AsStringAndSize\n  #define PyBytes_Size                 PyString_Size\n  #define PyBytes_AS_STRING            PyString_AS_STRING\n  #define PyBytes_GET_SIZE             PyString_GET_SIZE\n  #define PyBytes_Repr                 PyString_Repr\n  #define PyBytes_Concat               PyString_Concat\n  #define PyBytes_ConcatAndDel         PyString_ConcatAndDel\n#endif\n#if PY_VERSION_HEX < 0x02060000\n  #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)\n  #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)\n#endif\n#ifndef PySet_CheckExact\n  #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)\n#endif\n#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)\n#if PY_MAJOR_VERSION >= 3\n  #define PyIntObject                  PyLongObject\n  #define PyInt_Type                   PyLong_Type\n  #define PyInt_Check(op)              PyLong_Check(op)\n  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)\n  #define PyInt_FromString             PyLong_FromString\n  #define PyInt_FromUnicode            PyLong_FromUnicode\n  #define PyInt_FromLong               PyLong_FromLong\n  #define PyInt_FromSize_t             PyLong_FromSize_t\n  #define PyInt_FromSsize_t            PyLong_FromSsize_t\n  #define PyInt_AsLong                 PyLong_AsLong\n  #define PyInt_AS_LONG                PyLong_AS_LONG\n  #define PyInt_AsSsize_t              PyLong_AsSsize_t\n  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask\n  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask\n#endif\n#if PY_MAJOR_VERSION >= 3\n  #define PyBoolObject                 PyLongObject\n#endif\n#if PY_VERSION_HEX < 0x03020000\n  typedef long Py_hash_t;\n  #define __Pyx_PyInt_FromHash_t PyInt_FromLong\n  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong\n#else\n  #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t\n  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t\n#endif\n#if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)\n  #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)\n  #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)\n  #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b)\n#else\n  #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), (PyObject*)0) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object is unsliceable\", (obj)->ob_type->tp_name), (PyObject*)0)))\n  #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), -1) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object doesn't support slice assignment\", (obj)->ob_type->tp_name), -1)))\n  #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), -1) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object doesn't support slice deletion\", (obj)->ob_type->tp_name), -1)))\n#endif\n#if PY_MAJOR_VERSION >= 3\n  #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))\n#endif\n#if PY_VERSION_HEX < 0x02050000\n  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))\n  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))\n  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),((char *)(n)))\n#else\n  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),(n))\n  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))\n  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))\n#endif\n#if PY_VERSION_HEX < 0x02050000\n  #define __Pyx_NAMESTR(n) ((char *)(n))\n  #define __Pyx_DOCSTR(n)  ((char *)(n))\n#else\n  #define __Pyx_NAMESTR(n) (n)\n  #define __Pyx_DOCSTR(n)  (n)\n#endif\n\n\n#if PY_MAJOR_VERSION >= 3\n  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)\n  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)\n#else\n  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)\n  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)\n#endif\n\n#ifndef __PYX_EXTERN_C\n  #ifdef __cplusplus\n    #define __PYX_EXTERN_C extern \"C\"\n  #else\n    #define __PYX_EXTERN_C extern\n  #endif\n#endif\n\n#if defined(WIN32) || defined(MS_WINDOWS)\n#define _USE_MATH_DEFINES\n#endif\n#include <math.h>\n#define __PYX_HAVE__sklearn__linear_model__sgd_fast\n#define __PYX_HAVE_API__sklearn__linear_model__sgd_fast\n#include \"math.h\"\n#include \"stdio.h\"\n#include \"stdlib.h\"\n#include \"numpy/arrayobject.h\"\n#include \"numpy/ufuncobject.h\"\n#ifdef _OPENMP\n#include <omp.h>\n#endif /* _OPENMP */\n\n#ifdef PYREX_WITHOUT_ASSERTIONS\n#define CYTHON_WITHOUT_ASSERTIONS\n#endif\n\n\n/* inline attribute */\n#ifndef CYTHON_INLINE\n  #if defined(__GNUC__)\n    #define CYTHON_INLINE __inline__\n  #elif defined(_MSC_VER)\n    #define CYTHON_INLINE __inline\n  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n    #define CYTHON_INLINE inline\n  #else\n    #define CYTHON_INLINE\n  #endif\n#endif\n\n/* unused attribute */\n#ifndef CYTHON_UNUSED\n# if defined(__GNUC__)\n#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))\n#     define CYTHON_UNUSED __attribute__ ((__unused__))\n#   else\n#     define CYTHON_UNUSED\n#   endif\n# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))\n#   define CYTHON_UNUSED __attribute__ ((__unused__))\n# else\n#   define CYTHON_UNUSED\n# endif\n#endif\n\ntypedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/\n\n\n/* Type Conversion Predeclarations */\n\n#define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s)\n#define __Pyx_PyBytes_AsUString(s)   ((unsigned char*) PyBytes_AsString(s))\n\n#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None)\n#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))\nstatic CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);\nstatic CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);\n\nstatic CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);\nstatic CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);\nstatic CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);\n\n#if CYTHON_COMPILING_IN_CPYTHON\n#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))\n#else\n#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)\n#endif\n#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))\n\n#ifdef __GNUC__\n  /* Test for GCC > 2.95 */\n  #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))\n    #define likely(x)   __builtin_expect(!!(x), 1)\n    #define unlikely(x) __builtin_expect(!!(x), 0)\n  #else /* __GNUC__ > 2 ... */\n    #define likely(x)   (x)\n    #define unlikely(x) (x)\n  #endif /* __GNUC__ > 2 ... */\n#else /* __GNUC__ */\n  #define likely(x)   (x)\n  #define unlikely(x) (x)\n#endif /* __GNUC__ */\n    \nstatic PyObject *__pyx_m;\nstatic PyObject *__pyx_b;\nstatic PyObject *__pyx_empty_tuple;\nstatic PyObject *__pyx_empty_bytes;\nstatic int __pyx_lineno;\nstatic int __pyx_clineno = 0;\nstatic const char * __pyx_cfilenm= __FILE__;\nstatic const char *__pyx_filename;\n\n#if !defined(CYTHON_CCOMPLEX)\n  #if defined(__cplusplus)\n    #define CYTHON_CCOMPLEX 1\n  #elif defined(_Complex_I)\n    #define CYTHON_CCOMPLEX 1\n  #else\n    #define CYTHON_CCOMPLEX 0\n  #endif\n#endif\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    #include <complex>\n  #else\n    #include <complex.h>\n  #endif\n#endif\n#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__)\n  #undef _Complex_I\n  #define _Complex_I 1.0fj\n#endif\n\n\nstatic const char *__pyx_f[] = {\n  \"sgd_fast.pyx\",\n  \"numpy.pxd\",\n  \"type.pxd\",\n  \"weight_vector.pxd\",\n  \"seq_dataset.pxd\",\n};\n#define IS_UNSIGNED(type) (((type) -1) > 0)\nstruct __Pyx_StructField_;\n#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0)\ntypedef struct {\n  const char* name; /* for error messages only */\n  struct __Pyx_StructField_* fields;\n  size_t size;     /* sizeof(type) */\n  size_t arraysize[8]; /* length of array in each dimension */\n  int ndim;\n  char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject, c_H_ar */\n  char is_unsigned;\n  int flags;\n} __Pyx_TypeInfo;\ntypedef struct __Pyx_StructField_ {\n  __Pyx_TypeInfo* type;\n  const char* name;\n  size_t offset;\n} __Pyx_StructField;\ntypedef struct {\n  __Pyx_StructField* field;\n  size_t parent_offset;\n} __Pyx_BufFmt_StackElem;\ntypedef struct {\n  __Pyx_StructField root;\n  __Pyx_BufFmt_StackElem* head;\n  size_t fmt_offset;\n  size_t new_count, enc_count;\n  size_t struct_alignment;\n  int is_complex;\n  char enc_type;\n  char new_packmode;\n  char enc_packmode;\n  char is_valid_array;\n} __Pyx_BufFmt_Context;\n\n\n/* \"numpy.pxd\":723\n * # in Cython to enable them only on the right systems.\n * \n * ctypedef npy_int8       int8_t             # <<<<<<<<<<<<<<\n * ctypedef npy_int16      int16_t\n * ctypedef npy_int32      int32_t\n */\ntypedef npy_int8 __pyx_t_5numpy_int8_t;\n\n/* \"numpy.pxd\":724\n * \n * ctypedef npy_int8       int8_t\n * ctypedef npy_int16      int16_t             # <<<<<<<<<<<<<<\n * ctypedef npy_int32      int32_t\n * ctypedef npy_int64      int64_t\n */\ntypedef npy_int16 __pyx_t_5numpy_int16_t;\n\n/* \"numpy.pxd\":725\n * ctypedef npy_int8       int8_t\n * ctypedef npy_int16      int16_t\n * ctypedef npy_int32      int32_t             # <<<<<<<<<<<<<<\n * ctypedef npy_int64      int64_t\n * #ctypedef npy_int96      int96_t\n */\ntypedef npy_int32 __pyx_t_5numpy_int32_t;\n\n/* \"numpy.pxd\":726\n * ctypedef npy_int16      int16_t\n * ctypedef npy_int32      int32_t\n * ctypedef npy_int64      int64_t             # <<<<<<<<<<<<<<\n * #ctypedef npy_int96      int96_t\n * #ctypedef npy_int128     int128_t\n */\ntypedef npy_int64 __pyx_t_5numpy_int64_t;\n\n/* \"numpy.pxd\":730\n * #ctypedef npy_int128     int128_t\n * \n * ctypedef npy_uint8      uint8_t             # <<<<<<<<<<<<<<\n * ctypedef npy_uint16     uint16_t\n * ctypedef npy_uint32     uint32_t\n */\ntypedef npy_uint8 __pyx_t_5numpy_uint8_t;\n\n/* \"numpy.pxd\":731\n * \n * ctypedef npy_uint8      uint8_t\n * ctypedef npy_uint16     uint16_t             # <<<<<<<<<<<<<<\n * ctypedef npy_uint32     uint32_t\n * ctypedef npy_uint64     uint64_t\n */\ntypedef npy_uint16 __pyx_t_5numpy_uint16_t;\n\n/* \"numpy.pxd\":732\n * ctypedef npy_uint8      uint8_t\n * ctypedef npy_uint16     uint16_t\n * ctypedef npy_uint32     uint32_t             # <<<<<<<<<<<<<<\n * ctypedef npy_uint64     uint64_t\n * #ctypedef npy_uint96     uint96_t\n */\ntypedef npy_uint32 __pyx_t_5numpy_uint32_t;\n\n/* \"numpy.pxd\":733\n * ctypedef npy_uint16     uint16_t\n * ctypedef npy_uint32     uint32_t\n * ctypedef npy_uint64     uint64_t             # <<<<<<<<<<<<<<\n * #ctypedef npy_uint96     uint96_t\n * #ctypedef npy_uint128    uint128_t\n */\ntypedef npy_uint64 __pyx_t_5numpy_uint64_t;\n\n/* \"numpy.pxd\":737\n * #ctypedef npy_uint128    uint128_t\n * \n * ctypedef npy_float32    float32_t             # <<<<<<<<<<<<<<\n * ctypedef npy_float64    float64_t\n * #ctypedef npy_float80    float80_t\n */\ntypedef npy_float32 __pyx_t_5numpy_float32_t;\n\n/* \"numpy.pxd\":738\n * \n * ctypedef npy_float32    float32_t\n * ctypedef npy_float64    float64_t             # <<<<<<<<<<<<<<\n * #ctypedef npy_float80    float80_t\n * #ctypedef npy_float128   float128_t\n */\ntypedef npy_float64 __pyx_t_5numpy_float64_t;\n\n/* \"numpy.pxd\":747\n * # The int types are mapped a bit surprising --\n * # numpy.int corresponds to 'l' and numpy.long to 'q'\n * ctypedef npy_long       int_t             # <<<<<<<<<<<<<<\n * ctypedef npy_longlong   long_t\n * ctypedef npy_longlong   longlong_t\n */\ntypedef npy_long __pyx_t_5numpy_int_t;\n\n/* \"numpy.pxd\":748\n * # numpy.int corresponds to 'l' and numpy.long to 'q'\n * ctypedef npy_long       int_t\n * ctypedef npy_longlong   long_t             # <<<<<<<<<<<<<<\n * ctypedef npy_longlong   longlong_t\n * \n */\ntypedef npy_longlong __pyx_t_5numpy_long_t;\n\n/* \"numpy.pxd\":749\n * ctypedef npy_long       int_t\n * ctypedef npy_longlong   long_t\n * ctypedef npy_longlong   longlong_t             # <<<<<<<<<<<<<<\n * \n * ctypedef npy_ulong      uint_t\n */\ntypedef npy_longlong __pyx_t_5numpy_longlong_t;\n\n/* \"numpy.pxd\":751\n * ctypedef npy_longlong   longlong_t\n * \n * ctypedef npy_ulong      uint_t             # <<<<<<<<<<<<<<\n * ctypedef npy_ulonglong  ulong_t\n * ctypedef npy_ulonglong  ulonglong_t\n */\ntypedef npy_ulong __pyx_t_5numpy_uint_t;\n\n/* \"numpy.pxd\":752\n * \n * ctypedef npy_ulong      uint_t\n * ctypedef npy_ulonglong  ulong_t             # <<<<<<<<<<<<<<\n * ctypedef npy_ulonglong  ulonglong_t\n * \n */\ntypedef npy_ulonglong __pyx_t_5numpy_ulong_t;\n\n/* \"numpy.pxd\":753\n * ctypedef npy_ulong      uint_t\n * ctypedef npy_ulonglong  ulong_t\n * ctypedef npy_ulonglong  ulonglong_t             # <<<<<<<<<<<<<<\n * \n * ctypedef npy_intp       intp_t\n */\ntypedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;\n\n/* \"numpy.pxd\":755\n * ctypedef npy_ulonglong  ulonglong_t\n * \n * ctypedef npy_intp       intp_t             # <<<<<<<<<<<<<<\n * ctypedef npy_uintp      uintp_t\n * \n */\ntypedef npy_intp __pyx_t_5numpy_intp_t;\n\n/* \"numpy.pxd\":756\n * \n * ctypedef npy_intp       intp_t\n * ctypedef npy_uintp      uintp_t             # <<<<<<<<<<<<<<\n * \n * ctypedef npy_double     float_t\n */\ntypedef npy_uintp __pyx_t_5numpy_uintp_t;\n\n/* \"numpy.pxd\":758\n * ctypedef npy_uintp      uintp_t\n * \n * ctypedef npy_double     float_t             # <<<<<<<<<<<<<<\n * ctypedef npy_double     double_t\n * ctypedef npy_longdouble longdouble_t\n */\ntypedef npy_double __pyx_t_5numpy_float_t;\n\n/* \"numpy.pxd\":759\n * \n * ctypedef npy_double     float_t\n * ctypedef npy_double     double_t             # <<<<<<<<<<<<<<\n * ctypedef npy_longdouble longdouble_t\n * \n */\ntypedef npy_double __pyx_t_5numpy_double_t;\n\n/* \"numpy.pxd\":760\n * ctypedef npy_double     float_t\n * ctypedef npy_double     double_t\n * ctypedef npy_longdouble longdouble_t             # <<<<<<<<<<<<<<\n * \n * ctypedef npy_cfloat      cfloat_t\n */\ntypedef npy_longdouble __pyx_t_5numpy_longdouble_t;\n\n/* \"sklearn/utils/weight_vector.pxd\":10\n * \n * \n * ctypedef np.float64_t DOUBLE             # <<<<<<<<<<<<<<\n * ctypedef np.int32_t INTEGER\n * \n */\ntypedef __pyx_t_5numpy_float64_t __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE;\n\n/* \"sklearn/utils/weight_vector.pxd\":11\n * \n * ctypedef np.float64_t DOUBLE\n * ctypedef np.int32_t INTEGER             # <<<<<<<<<<<<<<\n * \n * \n */\ntypedef __pyx_t_5numpy_int32_t __pyx_t_7sklearn_5utils_13weight_vector_INTEGER;\n\n/* \"sklearn/utils/seq_dataset.pxd\":5\n * cimport numpy as np\n * \n * ctypedef np.float64_t DOUBLE             # <<<<<<<<<<<<<<\n * ctypedef np.int32_t INTEGER\n * \n */\ntypedef __pyx_t_5numpy_float64_t __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE;\n\n/* \"sklearn/utils/seq_dataset.pxd\":6\n * \n * ctypedef np.float64_t DOUBLE\n * ctypedef np.int32_t INTEGER             # <<<<<<<<<<<<<<\n * \n * \n */\ntypedef __pyx_t_5numpy_int32_t __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER;\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":25\n * \n * \n * ctypedef np.float64_t DOUBLE             # <<<<<<<<<<<<<<\n * ctypedef np.int32_t INTEGER\n * \n */\ntypedef __pyx_t_5numpy_float64_t __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE;\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":26\n * \n * ctypedef np.float64_t DOUBLE\n * ctypedef np.int32_t INTEGER             # <<<<<<<<<<<<<<\n * \n * \n */\ntypedef __pyx_t_5numpy_int32_t __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER;\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    typedef ::std::complex< float > __pyx_t_float_complex;\n  #else\n    typedef float _Complex __pyx_t_float_complex;\n  #endif\n#else\n    typedef struct { float real, imag; } __pyx_t_float_complex;\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    typedef ::std::complex< double > __pyx_t_double_complex;\n  #else\n    typedef double _Complex __pyx_t_double_complex;\n  #endif\n#else\n    typedef struct { double real, imag; } __pyx_t_double_complex;\n#endif\n\n\n/*--- Type declarations ---*/\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber;\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification;\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_CSRDataset;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge;\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_ArrayDataset;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\nstruct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n\n/* \"numpy.pxd\":762\n * ctypedef npy_longdouble longdouble_t\n * \n * ctypedef npy_cfloat      cfloat_t             # <<<<<<<<<<<<<<\n * ctypedef npy_cdouble     cdouble_t\n * ctypedef npy_clongdouble clongdouble_t\n */\ntypedef npy_cfloat __pyx_t_5numpy_cfloat_t;\n\n/* \"numpy.pxd\":763\n * \n * ctypedef npy_cfloat      cfloat_t\n * ctypedef npy_cdouble     cdouble_t             # <<<<<<<<<<<<<<\n * ctypedef npy_clongdouble clongdouble_t\n * \n */\ntypedef npy_cdouble __pyx_t_5numpy_cdouble_t;\n\n/* \"numpy.pxd\":764\n * ctypedef npy_cfloat      cfloat_t\n * ctypedef npy_cdouble     cdouble_t\n * ctypedef npy_clongdouble clongdouble_t             # <<<<<<<<<<<<<<\n * \n * ctypedef npy_cdouble     complex_t\n */\ntypedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;\n\n/* \"numpy.pxd\":766\n * ctypedef npy_clongdouble clongdouble_t\n * \n * ctypedef npy_cdouble     complex_t             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew1(a):\n */\ntypedef npy_cdouble __pyx_t_5numpy_complex_t;\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":46\n * # ----------------------------------------\n * \n * cdef class LossFunction:             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for convex loss functions\"\"\"\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction {\n  PyObject_HEAD\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_vtab;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":84\n * \n * \n * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for loss functions for regression\"\"\"\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":235\n * \n * \n * cdef class Huber(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Huber regression loss\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n  double c;\n};\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":9\n * \n * \n * cdef class SequentialDataset:             # <<<<<<<<<<<<<<\n *     cdef Py_ssize_t n_samples\n * \n */\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset {\n  PyObject_HEAD\n  struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_vtab;\n  Py_ssize_t n_samples;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":271\n * \n * \n * cdef class EpsilonInsensitive(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Epsilon-Insensitive loss (used by SVR).\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n  double epsilon;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":94\n * \n * \n * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for loss functions for classification\"\"\"\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n};\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":34\n * \n * \n * cdef class CSRDataset(SequentialDataset):             # <<<<<<<<<<<<<<\n *     cdef int current_index\n *     cdef int stride\n */\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_CSRDataset {\n  struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base;\n  int current_index;\n  int stride;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *X_data_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *X_indptr_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *X_indices_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *Y_data_ptr;\n  PyArrayObject *feature_indices;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *feature_indices_ptr;\n  PyArrayObject *index;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *index_data_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *sample_weight_data;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":198\n * \n * \n * cdef class Log(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Logistic regression loss for binary classification with y in {-1, 1}\"\"\"\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":134\n * \n * \n * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Hinge loss for binary classification tasks with y in {-1,1}\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n  double threshold;\n};\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":17\n * \n * \n * cdef class ArrayDataset(SequentialDataset):             # <<<<<<<<<<<<<<\n *     cdef Py_ssize_t n_features\n *     cdef int current_index\n */\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_ArrayDataset {\n  struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base;\n  Py_ssize_t n_features;\n  int current_index;\n  int stride;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *X_data_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *Y_data_ptr;\n  PyArrayObject *feature_indices;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *feature_indices_ptr;\n  PyArrayObject *index;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *index_data_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *sample_weight_data;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":166\n * \n * \n * cdef class SquaredHinge(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Squared Hinge loss for binary classification tasks with y in {-1,1}\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n  double threshold;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":104\n * \n * \n * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Modified Huber loss for binary classification with y in {-1, 1}\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n};\n\n\n/* \"sklearn/utils/weight_vector.pxd\":14\n * \n * \n * cdef class WeightVector(object):             # <<<<<<<<<<<<<<\n *     cdef np.ndarray w\n *     cdef DOUBLE *w_data_ptr\n */\nstruct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector {\n  PyObject_HEAD\n  struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *__pyx_vtab;\n  PyArrayObject *w;\n  __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *w_data_ptr;\n  double wscale;\n  Py_ssize_t n_features;\n  double sq_norm;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":223\n * \n * \n * cdef class SquaredLoss(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Squared loss traditional used in linear regression.\"\"\"\n *     cpdef double loss(self, double p, double y):\n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":298\n * \n * \n * cdef class SquaredEpsilonInsensitive(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Epsilon-Insensitive loss.\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n  double epsilon;\n};\n\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":46\n * # ----------------------------------------\n * \n * cdef class LossFunction:             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for convex loss functions\"\"\"\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction {\n  double (*loss)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch);\n  double (*dloss)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch);\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":84\n * \n * \n * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for loss functions for regression\"\"\"\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":223\n * \n * \n * cdef class SquaredLoss(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Squared loss traditional used in linear regression.\"\"\"\n *     cpdef double loss(self, double p, double y):\n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":94\n * \n * \n * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for loss functions for classification\"\"\"\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":104\n * \n * \n * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Modified Huber loss for binary classification with y in {-1, 1}\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":198\n * \n * \n * cdef class Log(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Logistic regression loss for binary classification with y in {-1, 1}\"\"\"\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":298\n * \n * \n * cdef class SquaredEpsilonInsensitive(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Epsilon-Insensitive loss.\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":9\n * \n * \n * cdef class SequentialDataset:             # <<<<<<<<<<<<<<\n *     cdef Py_ssize_t n_samples\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset {\n  void (*next)(struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *, __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE **, __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER **, int *, __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *, __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *);\n  void (*shuffle)(struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *, PyObject *);\n};\nstatic struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_vtabptr_7sklearn_5utils_11seq_dataset_SequentialDataset;\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":17\n * \n * \n * cdef class ArrayDataset(SequentialDataset):             # <<<<<<<<<<<<<<\n *     cdef Py_ssize_t n_features\n *     cdef int current_index\n */\n\nstruct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_ArrayDataset {\n  struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_ArrayDataset *__pyx_vtabptr_7sklearn_5utils_11seq_dataset_ArrayDataset;\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":34\n * \n * \n * cdef class CSRDataset(SequentialDataset):             # <<<<<<<<<<<<<<\n *     cdef int current_index\n *     cdef int stride\n */\n\nstruct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_CSRDataset {\n  struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_CSRDataset *__pyx_vtabptr_7sklearn_5utils_11seq_dataset_CSRDataset;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":271\n * \n * \n * cdef class EpsilonInsensitive(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Epsilon-Insensitive loss (used by SVR).\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":166\n * \n * \n * cdef class SquaredHinge(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Squared Hinge loss for binary classification tasks with y in {-1,1}\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":235\n * \n * \n * cdef class Huber(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Huber regression loss\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":134\n * \n * \n * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Hinge loss for binary classification tasks with y in {-1,1}\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge;\n\n\n/* \"sklearn/utils/weight_vector.pxd\":14\n * \n * \n * cdef class WeightVector(object):             # <<<<<<<<<<<<<<\n *     cdef np.ndarray w\n *     cdef DOUBLE *w_data_ptr\n */\n\nstruct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector {\n  void (*add)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *, __pyx_t_7sklearn_5utils_13weight_vector_INTEGER *, int, double);\n  double (*dot)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *, __pyx_t_7sklearn_5utils_13weight_vector_INTEGER *, int);\n  void (*scale)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, double);\n  void (*reset_wscale)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *);\n  double (*norm)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *);\n};\nstatic struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *__pyx_vtabptr_7sklearn_5utils_13weight_vector_WeightVector;\n#ifndef CYTHON_REFNANNY\n  #define CYTHON_REFNANNY 0\n#endif\n#if CYTHON_REFNANNY\n  typedef struct {\n    void (*INCREF)(void*, PyObject*, int);\n    void (*DECREF)(void*, PyObject*, int);\n    void (*GOTREF)(void*, PyObject*, int);\n    void (*GIVEREF)(void*, PyObject*, int);\n    void* (*SetupContext)(const char*, int, const char*);\n    void (*FinishContext)(void**);\n  } __Pyx_RefNannyAPIStruct;\n  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;\n  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/\n  #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;\n#ifdef WITH_THREAD\n  #define __Pyx_RefNannySetupContext(name, acquire_gil) \\\n          if (acquire_gil) { \\\n              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \\\n              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \\\n              PyGILState_Release(__pyx_gilstate_save); \\\n          } else { \\\n              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \\\n          }\n#else\n  #define __Pyx_RefNannySetupContext(name, acquire_gil) \\\n          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)\n#endif\n  #define __Pyx_RefNannyFinishContext() \\\n          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)\n  #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_XINCREF(r)  do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0)\n  #define __Pyx_XDECREF(r)  do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0)\n  #define __Pyx_XGOTREF(r)  do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0)\n  #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)\n#else\n  #define __Pyx_RefNannyDeclarations\n  #define __Pyx_RefNannySetupContext(name, acquire_gil)\n  #define __Pyx_RefNannyFinishContext()\n  #define __Pyx_INCREF(r) Py_INCREF(r)\n  #define __Pyx_DECREF(r) Py_DECREF(r)\n  #define __Pyx_GOTREF(r)\n  #define __Pyx_GIVEREF(r)\n  #define __Pyx_XINCREF(r) Py_XINCREF(r)\n  #define __Pyx_XDECREF(r) Py_XDECREF(r)\n  #define __Pyx_XGOTREF(r)\n  #define __Pyx_XGIVEREF(r)\n#endif /* CYTHON_REFNANNY */\n#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)\n#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)\n\nstatic PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/\n\nstatic CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/\nstatic CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/\n\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/\n\nstatic void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,\n    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/\n\nstatic void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/\n\nstatic int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \\\n    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \\\n    const char* function_name); /*proto*/\n\nstatic int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,\n    const char *name, int exact); /*proto*/\n\nstatic CYTHON_INLINE int  __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj,\n    __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);\nstatic CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);\n\nstatic CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/\n\nstatic void __Pyx_RaiseBufferFallbackError(void); /*proto*/\n\nstatic CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {\n    PyObject *r;\n    if (!j) return NULL;\n    r = PyObject_GetItem(o, j);\n    Py_DECREF(j);\n    return r;\n}\n#define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\\n                                                    __Pyx_GetItemInt_List_Fast(o, i) : \\\n                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))\nstatic CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {\n        PyObject *r = PyList_GET_ITEM(o, i);\n        Py_INCREF(r);\n        return r;\n    }\n    else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {\n        PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);\n        Py_INCREF(r);\n        return r;\n    }\n    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));\n#else\n    return PySequence_GetItem(o, i);\n#endif\n}\n#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\\n                                                    __Pyx_GetItemInt_Tuple_Fast(o, i) : \\\n                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))\nstatic CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {\n        PyObject *r = PyTuple_GET_ITEM(o, i);\n        Py_INCREF(r);\n        return r;\n    }\n    else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {\n        PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);\n        Py_INCREF(r);\n        return r;\n    }\n    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));\n#else\n    return PySequence_GetItem(o, i);\n#endif\n}\n#define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\\n                                                    __Pyx_GetItemInt_Fast(o, i) : \\\n                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))\nstatic CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    if (PyList_CheckExact(o)) {\n        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);\n        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {\n            PyObject *r = PyList_GET_ITEM(o, n);\n            Py_INCREF(r);\n            return r;\n        }\n    }\n    else if (PyTuple_CheckExact(o)) {\n        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);\n        if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {\n            PyObject *r = PyTuple_GET_ITEM(o, n);\n            Py_INCREF(r);\n            return r;\n        }\n    } else {  /* inlined PySequence_GetItem() */\n        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;\n        if (likely(m && m->sq_item)) {\n            if (unlikely(i < 0) && likely(m->sq_length)) {\n                Py_ssize_t l = m->sq_length(o);\n                if (unlikely(l < 0)) return NULL;\n                i += l;\n            }\n            return m->sq_item(o, i);\n        }\n    }\n#else\n    if (PySequence_Check(o)) {\n        return PySequence_GetItem(o, i);\n    }\n#endif\n    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);\n\nstatic CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);\n\nstatic CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);\n\nstatic CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/\n\nstatic int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/\n\ntypedef struct {\n  Py_ssize_t shape, strides, suboffsets;\n} __Pyx_Buf_DimInfo;\ntypedef struct {\n  size_t refcount;\n  Py_buffer pybuffer;\n} __Pyx_Buffer;\ntypedef struct {\n  __Pyx_Buffer *rcbuffer;\n  char *data;\n  __Pyx_Buf_DimInfo diminfo[8];\n} __Pyx_LocalBuf_ND;\n\n#if PY_MAJOR_VERSION < 3\n    static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);\n    static void __Pyx_ReleaseBuffer(Py_buffer *view);\n#else\n    #define __Pyx_GetBuffer PyObject_GetBuffer\n    #define __Pyx_ReleaseBuffer PyBuffer_Release\n#endif\n\n\nstatic Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0};\nstatic Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1};\n\nstatic PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/\n\nstatic CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name);\n\nstatic int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/\n#if CYTHON_COMPILING_IN_PYPY || PY_MAJOR_VERSION >= 3\nstatic PyObject* __pyx_print = 0;\nstatic PyObject* __pyx_print_kwargs = 0;\n#endif\n\nstatic int __Pyx_PrintOne(PyObject* stream, PyObject *o); /*proto*/\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    #define __Pyx_CREAL(z) ((z).real())\n    #define __Pyx_CIMAG(z) ((z).imag())\n  #else\n    #define __Pyx_CREAL(z) (__real__(z))\n    #define __Pyx_CIMAG(z) (__imag__(z))\n  #endif\n#else\n    #define __Pyx_CREAL(z) ((z).real)\n    #define __Pyx_CIMAG(z) ((z).imag)\n#endif\n#if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX\n    #define __Pyx_SET_CREAL(z,x) ((z).real(x))\n    #define __Pyx_SET_CIMAG(z,y) ((z).imag(y))\n#else\n    #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x)\n    #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y)\n#endif\n\nstatic CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float);\n\n#if CYTHON_CCOMPLEX\n    #define __Pyx_c_eqf(a, b)   ((a)==(b))\n    #define __Pyx_c_sumf(a, b)  ((a)+(b))\n    #define __Pyx_c_difff(a, b) ((a)-(b))\n    #define __Pyx_c_prodf(a, b) ((a)*(b))\n    #define __Pyx_c_quotf(a, b) ((a)/(b))\n    #define __Pyx_c_negf(a)     (-(a))\n  #ifdef __cplusplus\n    #define __Pyx_c_is_zerof(z) ((z)==(float)0)\n    #define __Pyx_c_conjf(z)    (::std::conj(z))\n    #if 1\n        #define __Pyx_c_absf(z)     (::std::abs(z))\n        #define __Pyx_c_powf(a, b)  (::std::pow(a, b))\n    #endif\n  #else\n    #define __Pyx_c_is_zerof(z) ((z)==0)\n    #define __Pyx_c_conjf(z)    (conjf(z))\n    #if 1\n        #define __Pyx_c_absf(z)     (cabsf(z))\n        #define __Pyx_c_powf(a, b)  (cpowf(a, b))\n    #endif\n #endif\n#else\n    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex);\n    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex);\n    #if 1\n        static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex);\n        static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex);\n    #endif\n#endif\n\nstatic CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double);\n\n#if CYTHON_CCOMPLEX\n    #define __Pyx_c_eq(a, b)   ((a)==(b))\n    #define __Pyx_c_sum(a, b)  ((a)+(b))\n    #define __Pyx_c_diff(a, b) ((a)-(b))\n    #define __Pyx_c_prod(a, b) ((a)*(b))\n    #define __Pyx_c_quot(a, b) ((a)/(b))\n    #define __Pyx_c_neg(a)     (-(a))\n  #ifdef __cplusplus\n    #define __Pyx_c_is_zero(z) ((z)==(double)0)\n    #define __Pyx_c_conj(z)    (::std::conj(z))\n    #if 1\n        #define __Pyx_c_abs(z)     (::std::abs(z))\n        #define __Pyx_c_pow(a, b)  (::std::pow(a, b))\n    #endif\n  #else\n    #define __Pyx_c_is_zero(z) ((z)==0)\n    #define __Pyx_c_conj(z)    (conj(z))\n    #if 1\n        #define __Pyx_c_abs(z)     (cabs(z))\n        #define __Pyx_c_pow(a, b)  (cpow(a, b))\n    #endif\n #endif\n#else\n    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex);\n    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex);\n    #if 1\n        static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex);\n        static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex);\n    #endif\n#endif\n\nstatic CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);\n\nstatic CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);\n\nstatic CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);\n\nstatic CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);\n\nstatic CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);\n\nstatic CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);\n\nstatic CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);\n\nstatic CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *);\n\nstatic CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);\n\nstatic CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);\n\nstatic CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);\n\nstatic CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);\n\nstatic CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);\n\nstatic CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);\n\nstatic void __Pyx_WriteUnraisable(const char *name, int clineno,\n                                  int lineno, const char *filename); /*proto*/\n\nstatic int __Pyx_check_binary_version(void);\n\nstatic int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/\n\n#if !defined(__Pyx_PyIdentifier_FromString)\n#if PY_MAJOR_VERSION < 3\n  #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s)\n#else\n  #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s)\n#endif\n#endif\n\nstatic PyObject *__Pyx_ImportModule(const char *name); /*proto*/\n\nstatic PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict);  /*proto*/\n\nstatic void* __Pyx_GetVtable(PyObject *dict); /*proto*/\n\ntypedef struct {\n    int code_line;\n    PyCodeObject* code_object;\n} __Pyx_CodeObjectCacheEntry;\nstruct __Pyx_CodeObjectCache {\n    int count;\n    int max_count;\n    __Pyx_CodeObjectCacheEntry* entries;\n};\nstatic struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};\nstatic int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);\nstatic PyCodeObject *__pyx_find_code_object(int code_line);\nstatic void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);\n\nstatic void __Pyx_AddTraceback(const char *funcname, int c_line,\n                               int py_line, const char *filename); /*proto*/\n\nstatic int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/\n\n\n/* Module declarations from 'libc.math' */\n\n/* Module declarations from 'cpython.buffer' */\n\n/* Module declarations from 'cpython.ref' */\n\n/* Module declarations from 'libc.stdio' */\n\n/* Module declarations from 'cpython.object' */\n\n/* Module declarations from '__builtin__' */\n\n/* Module declarations from 'cpython.type' */\nstatic PyTypeObject *__pyx_ptype_7cpython_4type_type = 0;\n\n/* Module declarations from 'libc.stdlib' */\n\n/* Module declarations from 'numpy' */\n\n/* Module declarations from 'numpy' */\nstatic PyTypeObject *__pyx_ptype_5numpy_dtype = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;\nstatic CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/\n\n/* Module declarations from 'cython' */\n\n/* Module declarations from 'sklearn.utils.weight_vector' */\nstatic PyTypeObject *__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector = 0;\n\n/* Module declarations from 'sklearn.utils.seq_dataset' */\nstatic PyTypeObject *__pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset = 0;\n\n/* Module declarations from 'sklearn.linear_model.sgd_fast' */\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = 0;\nstatic CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_max(double, double); /*proto*/\nstatic CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_min(double, double); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *, __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *, int); /*proto*/\nstatic void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *, __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *, int, double); /*proto*/\nstatic __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE = { \"DOUBLE\", NULL, sizeof(__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE), { 0 }, 0, 'R', 0, 0 };\n#define __Pyx_MODULE_NAME \"sklearn.linear_model.sgd_fast\"\nint __pyx_module_is_main_sklearn__linear_model__sgd_fast = 0;\n\n/* Implementation of 'sklearn.linear_model.sgd_fast' */\nstatic PyObject *__pyx_builtin_NotImplementedError;\nstatic PyObject *__pyx_builtin_range;\nstatic PyObject *__pyx_builtin_ValueError;\nstatic PyObject *__pyx_builtin_RuntimeError;\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self); /* proto */\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_threshold); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self); /* proto */\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_threshold); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self); /* proto */\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_c); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self); /* proto */\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self); /* proto */\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_weights, double __pyx_v_intercept, struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_loss, int __pyx_v_penalty_type, double __pyx_v_alpha, double __pyx_v_C, double __pyx_v_rho, struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_v_dataset, int __pyx_v_n_iter, int __pyx_v_fit_intercept, int __pyx_v_verbose, int __pyx_v_shuffle, PyObject *__pyx_v_seed, double __pyx_v_weight_pos, double __pyx_v_weight_neg, int __pyx_v_learning_rate, double __pyx_v_eta0, double __pyx_v_power_t, double __pyx_v_t, double __pyx_v_intercept_decay); /* proto */\nstatic int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */\nstatic void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */\nstatic char __pyx_k_1[] = \"-- Epoch %d\";\nstatic char __pyx_k_2[] = \"Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f\";\nstatic char __pyx_k_3[] = \"Total training time: %.2f seconds.\";\nstatic char __pyx_k_4[] = \"floating-point under-/overflow occured.\";\nstatic char __pyx_k_6[] = \"ndarray is not C contiguous\";\nstatic char __pyx_k_8[] = \"ndarray is not Fortran contiguous\";\nstatic char __pyx_k_10[] = \"Non-native byte order not supported\";\nstatic char __pyx_k_12[] = \"unknown dtype code in numpy.pxd (%d)\";\nstatic char __pyx_k_13[] = \"Format string allocated too short, see comment in numpy.pxd\";\nstatic char __pyx_k_16[] = \"Format string allocated too short.\";\nstatic char __pyx_k_20[] = \"/scratch/apps/src/scikit-learn/sklearn/linear_model/sgd_fast.pyx\";\nstatic char __pyx_k_21[] = \"sklearn.linear_model.sgd_fast\";\nstatic char __pyx_k__B[] = \"B\";\nstatic char __pyx_k__C[] = \"C\";\nstatic char __pyx_k__H[] = \"H\";\nstatic char __pyx_k__I[] = \"I\";\nstatic char __pyx_k__L[] = \"L\";\nstatic char __pyx_k__O[] = \"O\";\nstatic char __pyx_k__Q[] = \"Q\";\nstatic char __pyx_k__b[] = \"b\";\nstatic char __pyx_k__c[] = \"c\";\nstatic char __pyx_k__d[] = \"d\";\nstatic char __pyx_k__f[] = \"f\";\nstatic char __pyx_k__g[] = \"g\";\nstatic char __pyx_k__h[] = \"h\";\nstatic char __pyx_k__i[] = \"i\";\nstatic char __pyx_k__l[] = \"l\";\nstatic char __pyx_k__p[] = \"p\";\nstatic char __pyx_k__q[] = \"q\";\nstatic char __pyx_k__t[] = \"t\";\nstatic char __pyx_k__u[] = \"u\";\nstatic char __pyx_k__w[] = \"w\";\nstatic char __pyx_k__y[] = \"y\";\nstatic char __pyx_k__Zd[] = \"Zd\";\nstatic char __pyx_k__Zf[] = \"Zf\";\nstatic char __pyx_k__Zg[] = \"Zg\";\nstatic char __pyx_k__np[] = \"np\";\nstatic char __pyx_k__any[] = \"any\";\nstatic char __pyx_k__eta[] = \"eta\";\nstatic char __pyx_k__rho[] = \"rho\";\nstatic char __pyx_k__sys[] = \"sys\";\nstatic char __pyx_k__eta0[] = \"eta0\";\nstatic char __pyx_k__loss[] = \"loss\";\nstatic char __pyx_k__seed[] = \"seed\";\nstatic char __pyx_k__time[] = \"time\";\nstatic char __pyx_k__xnnz[] = \"xnnz\";\nstatic char __pyx_k__alpha[] = \"alpha\";\nstatic char __pyx_k__count[] = \"count\";\nstatic char __pyx_k__dloss[] = \"dloss\";\nstatic char __pyx_k__dtype[] = \"dtype\";\nstatic char __pyx_k__epoch[] = \"epoch\";\nstatic char __pyx_k__isinf[] = \"isinf\";\nstatic char __pyx_k__isnan[] = \"isnan\";\nstatic char __pyx_k__numpy[] = \"numpy\";\nstatic char __pyx_k__order[] = \"order\";\nstatic char __pyx_k__range[] = \"range\";\nstatic char __pyx_k__shape[] = \"shape\";\nstatic char __pyx_k__zeros[] = \"zeros\";\nstatic char __pyx_k__n_iter[] = \"n_iter\";\nstatic char __pyx_k__update[] = \"update\";\nstatic char __pyx_k__dataset[] = \"dataset\";\nstatic char __pyx_k__epsilon[] = \"epsilon\";\nstatic char __pyx_k__float64[] = \"float64\";\nstatic char __pyx_k__nonzero[] = \"nonzero\";\nstatic char __pyx_k__power_t[] = \"power_t\";\nstatic char __pyx_k__shuffle[] = \"shuffle\";\nstatic char __pyx_k__sumloss[] = \"sumloss\";\nstatic char __pyx_k__t_start[] = \"t_start\";\nstatic char __pyx_k__verbose[] = \"verbose\";\nstatic char __pyx_k__weights[] = \"weights\";\nstatic char __pyx_k____main__[] = \"__main__\";\nstatic char __pyx_k____test__[] = \"__test__\";\nstatic char __pyx_k__is_hinge[] = \"is_hinge\";\nstatic char __pyx_k__intercept[] = \"intercept\";\nstatic char __pyx_k__n_samples[] = \"n_samples\";\nstatic char __pyx_k__plain_sgd[] = \"plain_sgd\";\nstatic char __pyx_k__threshold[] = \"threshold\";\nstatic char __pyx_k__x_ind_ptr[] = \"x_ind_ptr\";\nstatic char __pyx_k__ValueError[] = \"ValueError\";\nstatic char __pyx_k__n_features[] = \"n_features\";\nstatic char __pyx_k__q_data_ptr[] = \"q_data_ptr\";\nstatic char __pyx_k__weight_neg[] = \"weight_neg\";\nstatic char __pyx_k__weight_pos[] = \"weight_pos\";\nstatic char __pyx_k__x_data_ptr[] = \"x_data_ptr\";\nstatic char __pyx_k__RuntimeError[] = \"RuntimeError\";\nstatic char __pyx_k__class_weight[] = \"class_weight\";\nstatic char __pyx_k__penalty_type[] = \"penalty_type\";\nstatic char __pyx_k__fit_intercept[] = \"fit_intercept\";\nstatic char __pyx_k__learning_rate[] = \"learning_rate\";\nstatic char __pyx_k__sample_weight[] = \"sample_weight\";\nstatic char __pyx_k__intercept_decay[] = \"intercept_decay\";\nstatic char __pyx_k__NotImplementedError[] = \"NotImplementedError\";\nstatic PyObject *__pyx_kp_s_1;\nstatic PyObject *__pyx_kp_u_10;\nstatic PyObject *__pyx_kp_u_12;\nstatic PyObject *__pyx_kp_u_13;\nstatic PyObject *__pyx_kp_u_16;\nstatic PyObject *__pyx_kp_s_2;\nstatic PyObject *__pyx_kp_s_20;\nstatic PyObject *__pyx_n_s_21;\nstatic PyObject *__pyx_kp_s_3;\nstatic PyObject *__pyx_kp_s_4;\nstatic PyObject *__pyx_kp_u_6;\nstatic PyObject *__pyx_kp_u_8;\nstatic PyObject *__pyx_n_s__C;\nstatic PyObject *__pyx_n_s__NotImplementedError;\nstatic PyObject *__pyx_n_s__RuntimeError;\nstatic PyObject *__pyx_n_s__ValueError;\nstatic PyObject *__pyx_n_s____main__;\nstatic PyObject *__pyx_n_s____test__;\nstatic PyObject *__pyx_n_s__alpha;\nstatic PyObject *__pyx_n_s__any;\nstatic PyObject *__pyx_n_s__c;\nstatic PyObject *__pyx_n_s__class_weight;\nstatic PyObject *__pyx_n_s__count;\nstatic PyObject *__pyx_n_s__dataset;\nstatic PyObject *__pyx_n_s__dloss;\nstatic PyObject *__pyx_n_s__dtype;\nstatic PyObject *__pyx_n_s__epoch;\nstatic PyObject *__pyx_n_s__epsilon;\nstatic PyObject *__pyx_n_s__eta;\nstatic PyObject *__pyx_n_s__eta0;\nstatic PyObject *__pyx_n_s__fit_intercept;\nstatic PyObject *__pyx_n_s__float64;\nstatic PyObject *__pyx_n_s__i;\nstatic PyObject *__pyx_n_s__intercept;\nstatic PyObject *__pyx_n_s__intercept_decay;\nstatic PyObject *__pyx_n_s__is_hinge;\nstatic PyObject *__pyx_n_s__isinf;\nstatic PyObject *__pyx_n_s__isnan;\nstatic PyObject *__pyx_n_s__learning_rate;\nstatic PyObject *__pyx_n_s__loss;\nstatic PyObject *__pyx_n_s__n_features;\nstatic PyObject *__pyx_n_s__n_iter;\nstatic PyObject *__pyx_n_s__n_samples;\nstatic PyObject *__pyx_n_s__nonzero;\nstatic PyObject *__pyx_n_s__np;\nstatic PyObject *__pyx_n_s__numpy;\nstatic PyObject *__pyx_n_s__order;\nstatic PyObject *__pyx_n_s__p;\nstatic PyObject *__pyx_n_s__penalty_type;\nstatic PyObject *__pyx_n_s__plain_sgd;\nstatic PyObject *__pyx_n_s__power_t;\nstatic PyObject *__pyx_n_s__q;\nstatic PyObject *__pyx_n_s__q_data_ptr;\nstatic PyObject *__pyx_n_s__range;\nstatic PyObject *__pyx_n_s__rho;\nstatic PyObject *__pyx_n_s__sample_weight;\nstatic PyObject *__pyx_n_s__seed;\nstatic PyObject *__pyx_n_s__shape;\nstatic PyObject *__pyx_n_s__shuffle;\nstatic PyObject *__pyx_n_s__sumloss;\nstatic PyObject *__pyx_n_s__sys;\nstatic PyObject *__pyx_n_s__t;\nstatic PyObject *__pyx_n_s__t_start;\nstatic PyObject *__pyx_n_s__threshold;\nstatic PyObject *__pyx_n_s__time;\nstatic PyObject *__pyx_n_s__u;\nstatic PyObject *__pyx_n_s__update;\nstatic PyObject *__pyx_n_s__verbose;\nstatic PyObject *__pyx_n_s__w;\nstatic PyObject *__pyx_n_s__weight_neg;\nstatic PyObject *__pyx_n_s__weight_pos;\nstatic PyObject *__pyx_n_s__weights;\nstatic PyObject *__pyx_n_s__x_data_ptr;\nstatic PyObject *__pyx_n_s__x_ind_ptr;\nstatic PyObject *__pyx_n_s__xnnz;\nstatic PyObject *__pyx_n_s__y;\nstatic PyObject *__pyx_n_s__zeros;\nstatic PyObject *__pyx_int_15;\nstatic PyObject *__pyx_k_tuple_5;\nstatic PyObject *__pyx_k_tuple_7;\nstatic PyObject *__pyx_k_tuple_9;\nstatic PyObject *__pyx_k_tuple_11;\nstatic PyObject *__pyx_k_tuple_14;\nstatic PyObject *__pyx_k_tuple_15;\nstatic PyObject *__pyx_k_tuple_17;\nstatic PyObject *__pyx_k_tuple_18;\nstatic PyObject *__pyx_k_codeobj_19;\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":49\n *     \"\"\"Base class for convex loss functions\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         \"\"\"Evaluate the loss function.\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":64\n *             The loss evaluated at `p` and `y`.\n *         \"\"\"\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.LossFunction.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic char __pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss[] = \"Evaluate the loss function.\\n\\n        Parameters\\n        ----------\\n        p : double\\n            The prediction, p = w^T x\\n        y : double\\n            The true value (aka target)\\n\\n        Returns\\n        -------\\n        double\\n            The loss evaluated at `p` and `y`.\\n        \";\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.LossFunction.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":49\n *     \"\"\"Base class for convex loss functions\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         \"\"\"Evaluate the loss function.\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self->__pyx_vtab)->loss(__pyx_v_self, __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.LossFunction.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":66\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         \"\"\"Evaluate the derivative of the loss function with respect to\n *         the prediction `p`.\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":81\n *             The derivative of the loss function w.r.t. `p`.\n *         \"\"\"\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.LossFunction.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic char __pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss[] = \"Evaluate the derivative of the loss function with respect to\\n        the prediction `p`.\\n\\n        Parameters\\n        ----------\\n        p : double\\n            The prediction, p = w^T x\\n        y : double\\n            The true value (aka target)\\n        Returns\\n        -------\\n        double\\n            The derivative of the loss function w.r.t. `p`.\\n        \";\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.LossFunction.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":66\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         \"\"\"Evaluate the derivative of the loss function with respect to\n *         the prediction `p`.\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self->__pyx_vtab)->dloss(__pyx_v_self, __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.LossFunction.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":87\n *     \"\"\"Base class for loss functions for regression\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":88\n * \n *     cpdef double loss(self, double p, double y):\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Regression.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Regression.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":87\n *     \"\"\"Base class for loss functions for regression\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Regression.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":90\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":91\n * \n *     cpdef double dloss(self, double p, double y):\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Regression.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Regression.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":90\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Regression.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":97\n *     \"\"\"Base class for loss functions for classification\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":98\n * \n *     cpdef double loss(self, double p, double y):\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Classification.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Classification.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":97\n *     \"\"\"Base class for loss functions for classification\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Classification.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":100\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":101\n * \n *     cpdef double dloss(self, double p, double y):\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Classification.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Classification.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":100\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Classification.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":112\n *     Stochastic Gradient Descent', ICML'04.\n *     \"\"\"\n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z >= 1.0:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":113\n *     \"\"\"\n *     cpdef double loss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         if z >= 1.0:\n *             return 0.0\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":114\n *     cpdef double loss(self, double p, double y):\n *         cdef double z = p * y\n *         if z >= 1.0:             # <<<<<<<<<<<<<<\n *             return 0.0\n *         elif z >= -1.0:\n */\n  __pyx_t_6 = (__pyx_v_z >= 1.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":115\n *         cdef double z = p * y\n *         if z >= 1.0:\n *             return 0.0             # <<<<<<<<<<<<<<\n *         elif z >= -1.0:\n *             return (1.0 - z) * (1.0 - z)\n */\n    __pyx_r = 0.0;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":116\n *         if z >= 1.0:\n *             return 0.0\n *         elif z >= -1.0:             # <<<<<<<<<<<<<<\n *             return (1.0 - z) * (1.0 - z)\n *         else:\n */\n  __pyx_t_6 = (__pyx_v_z >= -1.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":117\n *             return 0.0\n *         elif z >= -1.0:\n *             return (1.0 - z) * (1.0 - z)             # <<<<<<<<<<<<<<\n *         else:\n *             return -4.0 * z\n */\n    __pyx_r = ((1.0 - __pyx_v_z) * (1.0 - __pyx_v_z));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":119\n *             return (1.0 - z) * (1.0 - z)\n *         else:\n *             return -4.0 * z             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n    __pyx_r = (-4.0 * __pyx_v_z);\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.ModifiedHuber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.ModifiedHuber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":112\n *     Stochastic Gradient Descent', ICML'04.\n *     \"\"\"\n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z >= 1.0:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.ModifiedHuber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":121\n *             return -4.0 * z\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z >= 1.0:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":122\n * \n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         if z >= 1.0:\n *             return 0.0\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":123\n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = p * y\n *         if z >= 1.0:             # <<<<<<<<<<<<<<\n *             return 0.0\n *         elif z >= -1.0:\n */\n  __pyx_t_6 = (__pyx_v_z >= 1.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":124\n *         cdef double z = p * y\n *         if z >= 1.0:\n *             return 0.0             # <<<<<<<<<<<<<<\n *         elif z >= -1.0:\n *             return 2.0 * (1.0 - z) * -y\n */\n    __pyx_r = 0.0;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":125\n *         if z >= 1.0:\n *             return 0.0\n *         elif z >= -1.0:             # <<<<<<<<<<<<<<\n *             return 2.0 * (1.0 - z) * -y\n *         else:\n */\n  __pyx_t_6 = (__pyx_v_z >= -1.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":126\n *             return 0.0\n *         elif z >= -1.0:\n *             return 2.0 * (1.0 - z) * -y             # <<<<<<<<<<<<<<\n *         else:\n *             return -4.0 * y\n */\n    __pyx_r = ((2.0 * (1.0 - __pyx_v_z)) * (-__pyx_v_y));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":128\n *             return 2.0 * (1.0 - z) * -y\n *         else:\n *             return -4.0 * y             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n    __pyx_r = (-4.0 * __pyx_v_y);\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.ModifiedHuber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.ModifiedHuber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":121\n *             return -4.0 * z\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z >= 1.0:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.ModifiedHuber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_4__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":130\n *             return -4.0 * y\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return ModifiedHuber, ()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":131\n * \n *     def __reduce__(self):\n *         return ModifiedHuber, ()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber)));\n  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));\n  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.ModifiedHuber.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_threshold;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__ (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__threshold,0};\n    PyObject* values[1] = {0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (kw_args > 0) {\n          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__threshold);\n          if (value) { values[0] = value; kw_args--; }\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"__init__\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else {\n      switch (PyTuple_GET_SIZE(__pyx_args)) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n    }\n    if (values[0]) {\n      __pyx_v_threshold = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_threshold == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    } else {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":147\n *     cdef double threshold\n * \n *     def __init__(self, double threshold=1.0):             # <<<<<<<<<<<<<<\n *         self.threshold = threshold\n * \n */\n      __pyx_v_threshold = ((double)1.0);\n    }\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"__init__\", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.__init__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return -1;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self), __pyx_v_threshold);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_threshold) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":148\n * \n *     def __init__(self, double threshold=1.0):\n *         self.threshold = threshold             # <<<<<<<<<<<<<<\n * \n *     cpdef double loss(self, double p, double y):\n */\n  __pyx_v_self->threshold = __pyx_v_threshold;\n\n  __pyx_r = 0;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":150\n *         self.threshold = threshold\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z <= self.threshold:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":151\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         if z <= self.threshold:\n *             return (self.threshold - z)\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":152\n *     cpdef double loss(self, double p, double y):\n *         cdef double z = p * y\n *         if z <= self.threshold:             # <<<<<<<<<<<<<<\n *             return (self.threshold - z)\n *         return 0.0\n */\n  __pyx_t_6 = (__pyx_v_z <= __pyx_v_self->threshold);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":153\n *         cdef double z = p * y\n *         if z <= self.threshold:\n *             return (self.threshold - z)             # <<<<<<<<<<<<<<\n *         return 0.0\n * \n */\n    __pyx_r = (__pyx_v_self->threshold - __pyx_v_z);\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":154\n *         if z <= self.threshold:\n *             return (self.threshold - z)\n *         return 0.0             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_r = 0.0;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Hinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":150\n *         self.threshold = threshold\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z <= self.threshold:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":156\n *         return 0.0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z <= self.threshold:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":157\n * \n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         if z <= self.threshold:\n *             return -y\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":158\n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = p * y\n *         if z <= self.threshold:             # <<<<<<<<<<<<<<\n *             return -y\n *         return 0.0\n */\n  __pyx_t_6 = (__pyx_v_z <= __pyx_v_self->threshold);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":159\n *         cdef double z = p * y\n *         if z <= self.threshold:\n *             return -y             # <<<<<<<<<<<<<<\n *         return 0.0\n * \n */\n    __pyx_r = (-__pyx_v_y);\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":160\n *         if z <= self.threshold:\n *             return -y\n *         return 0.0             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n  __pyx_r = 0.0;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Hinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":156\n *         return 0.0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z <= self.threshold:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":162\n *         return 0.0\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return Hinge, (self.threshold,)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":163\n * \n *     def __reduce__(self):\n *         return Hinge, (self.threshold,)             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->threshold); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);\n  __Pyx_GIVEREF(__pyx_t_1);\n  __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge)));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));\n  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_threshold;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__ (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__threshold,0};\n    PyObject* values[1] = {0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (kw_args > 0) {\n          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__threshold);\n          if (value) { values[0] = value; kw_args--; }\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"__init__\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else {\n      switch (PyTuple_GET_SIZE(__pyx_args)) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n    }\n    if (values[0]) {\n      __pyx_v_threshold = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_threshold == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    } else {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":179\n *     cdef double threshold\n * \n *     def __init__(self, double threshold=1.0):             # <<<<<<<<<<<<<<\n *         self.threshold = threshold\n * \n */\n      __pyx_v_threshold = ((double)1.0);\n    }\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"__init__\", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.__init__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return -1;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self), __pyx_v_threshold);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_threshold) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":180\n * \n *     def __init__(self, double threshold=1.0):\n *         self.threshold = threshold             # <<<<<<<<<<<<<<\n * \n *     cpdef double loss(self, double p, double y):\n */\n  __pyx_v_self->threshold = __pyx_v_threshold;\n\n  __pyx_r = 0;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":182\n *         self.threshold = threshold\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":183\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double z = self.threshold - p * y             # <<<<<<<<<<<<<<\n *         if z > 0:\n *             return z * z\n */\n  __pyx_v_z = (__pyx_v_self->threshold - (__pyx_v_p * __pyx_v_y));\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":184\n *     cpdef double loss(self, double p, double y):\n *         cdef double z = self.threshold - p * y\n *         if z > 0:             # <<<<<<<<<<<<<<\n *             return z * z\n *         return 0.0\n */\n  __pyx_t_6 = (__pyx_v_z > 0.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":185\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n *             return z * z             # <<<<<<<<<<<<<<\n *         return 0.0\n * \n */\n    __pyx_r = (__pyx_v_z * __pyx_v_z);\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":186\n *         if z > 0:\n *             return z * z\n *         return 0.0             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_r = 0.0;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredHinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":182\n *         self.threshold = threshold\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":188\n *         return 0.0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":189\n * \n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = self.threshold - p * y             # <<<<<<<<<<<<<<\n *         if z > 0:\n *             return -2 * y * z\n */\n  __pyx_v_z = (__pyx_v_self->threshold - (__pyx_v_p * __pyx_v_y));\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":190\n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = self.threshold - p * y\n *         if z > 0:             # <<<<<<<<<<<<<<\n *             return -2 * y * z\n *         return 0.0\n */\n  __pyx_t_6 = (__pyx_v_z > 0.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":191\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n *             return -2 * y * z             # <<<<<<<<<<<<<<\n *         return 0.0\n * \n */\n    __pyx_r = ((-2.0 * __pyx_v_y) * __pyx_v_z);\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":192\n *         if z > 0:\n *             return -2 * y * z\n *         return 0.0             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n  __pyx_r = 0.0;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredHinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":188\n *         return 0.0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":194\n *         return 0.0\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return SquaredHinge, (self.threshold,)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":195\n * \n *     def __reduce__(self):\n *         return SquaredHinge, (self.threshold,)             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->threshold); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);\n  __Pyx_GIVEREF(__pyx_t_1);\n  __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge)));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));\n  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":201\n *     \"\"\"Logistic regression loss for binary classification with y in {-1, 1}\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":202\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         # approximately equal and saves the computation of the log\n *         if z > 18:\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":204\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n *         if z > 18:             # <<<<<<<<<<<<<<\n *             return exp(-z)\n *         if z < -18:\n */\n  __pyx_t_6 = (__pyx_v_z > 18.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":205\n *         # approximately equal and saves the computation of the log\n *         if z > 18:\n *             return exp(-z)             # <<<<<<<<<<<<<<\n *         if z < -18:\n *             return -z\n */\n    __pyx_r = exp((-__pyx_v_z));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":206\n *         if z > 18:\n *             return exp(-z)\n *         if z < -18:             # <<<<<<<<<<<<<<\n *             return -z\n *         return log(1.0 + exp(-z))\n */\n  __pyx_t_6 = (__pyx_v_z < -18.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":207\n *             return exp(-z)\n *         if z < -18:\n *             return -z             # <<<<<<<<<<<<<<\n *         return log(1.0 + exp(-z))\n * \n */\n    __pyx_r = (-__pyx_v_z);\n    goto __pyx_L0;\n    goto __pyx_L4;\n  }\n  __pyx_L4:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":208\n *         if z < -18:\n *             return -z\n *         return log(1.0 + exp(-z))             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_r = log((1.0 + exp((-__pyx_v_z))));\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Log.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Log.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":201\n *     \"\"\"Logistic regression loss for binary classification with y in {-1, 1}\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Log.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":210\n *         return log(1.0 + exp(-z))\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":211\n * \n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         # approximately equal and saves the computation of the log\n *         if z > 18.0:\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":213\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n *         if z > 18.0:             # <<<<<<<<<<<<<<\n *             return exp(-z) * -y\n *         if z < -18.0:\n */\n  __pyx_t_6 = (__pyx_v_z > 18.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":214\n *         # approximately equal and saves the computation of the log\n *         if z > 18.0:\n *             return exp(-z) * -y             # <<<<<<<<<<<<<<\n *         if z < -18.0:\n *             return -y\n */\n    __pyx_r = (exp((-__pyx_v_z)) * (-__pyx_v_y));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":215\n *         if z > 18.0:\n *             return exp(-z) * -y\n *         if z < -18.0:             # <<<<<<<<<<<<<<\n *             return -y\n *         return -y / (exp(z) + 1.0)\n */\n  __pyx_t_6 = (__pyx_v_z < -18.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":216\n *             return exp(-z) * -y\n *         if z < -18.0:\n *             return -y             # <<<<<<<<<<<<<<\n *         return -y / (exp(z) + 1.0)\n * \n */\n    __pyx_r = (-__pyx_v_y);\n    goto __pyx_L0;\n    goto __pyx_L4;\n  }\n  __pyx_L4:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":217\n *         if z < -18.0:\n *             return -y\n *         return -y / (exp(z) + 1.0)             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n  __pyx_r = ((-__pyx_v_y) / (exp(__pyx_v_z) + 1.0));\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Log.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Log.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":210\n *         return log(1.0 + exp(-z))\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Log.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_4__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":219\n *         return -y / (exp(z) + 1.0)\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return Log, ()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":220\n * \n *     def __reduce__(self):\n *         return Log, ()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log)));\n  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));\n  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Log.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":225\n * cdef class SquaredLoss(Regression):\n *     \"\"\"Squared loss traditional used in linear regression.\"\"\"\n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         return 0.5 * (p - y) * (p - y)\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":226\n *     \"\"\"Squared loss traditional used in linear regression.\"\"\"\n *     cpdef double loss(self, double p, double y):\n *         return 0.5 * (p - y) * (p - y)             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_r = ((0.5 * (__pyx_v_p - __pyx_v_y)) * (__pyx_v_p - __pyx_v_y));\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredLoss.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredLoss.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":225\n * cdef class SquaredLoss(Regression):\n *     \"\"\"Squared loss traditional used in linear regression.\"\"\"\n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         return 0.5 * (p - y) * (p - y)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredLoss.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":228\n *         return 0.5 * (p - y) * (p - y)\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         return p - y\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":229\n * \n *     cpdef double dloss(self, double p, double y):\n *         return p - y             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n  __pyx_r = (__pyx_v_p - __pyx_v_y);\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredLoss.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredLoss.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":228\n *         return 0.5 * (p - y) * (p - y)\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         return p - y\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredLoss.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_4__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":231\n *         return p - y\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return SquaredLoss, ()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":232\n * \n *     def __reduce__(self):\n *         return SquaredLoss, ()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss)));\n  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));\n  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredLoss.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_c;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__ (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__c,0};\n    PyObject* values[1] = {0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__c)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"__init__\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n    }\n    __pyx_v_c = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_c == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"__init__\", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.__init__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return -1;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self), __pyx_v_c);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":246\n *     cdef double c\n * \n *     def __init__(self, double c):             # <<<<<<<<<<<<<<\n *         self.c = c\n * \n */\n\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_c) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":247\n * \n *     def __init__(self, double c):\n *         self.c = c             # <<<<<<<<<<<<<<\n * \n *     cpdef double loss(self, double p, double y):\n */\n  __pyx_v_self->c = __pyx_v_c;\n\n  __pyx_r = 0;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":249\n *         self.c = c\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_r;\n  double __pyx_v_abs_r;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":250\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double r = p - y             # <<<<<<<<<<<<<<\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:\n */\n  __pyx_v_r = (__pyx_v_p - __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":251\n *     cpdef double loss(self, double p, double y):\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<\n *         if abs_r <= self.c:\n *             return 0.5 * r * r\n */\n  __pyx_v_abs_r = fabs(__pyx_v_r);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":252\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:             # <<<<<<<<<<<<<<\n *             return 0.5 * r * r\n *         else:\n */\n  __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":253\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:\n *             return 0.5 * r * r             # <<<<<<<<<<<<<<\n *         else:\n *             return self.c * abs_r - (0.5 * self.c * self.c)\n */\n    __pyx_r = ((0.5 * __pyx_v_r) * __pyx_v_r);\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":255\n *             return 0.5 * r * r\n *         else:\n *             return self.c * abs_r - (0.5 * self.c * self.c)             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n    __pyx_r = ((__pyx_v_self->c * __pyx_v_abs_r) - ((0.5 * __pyx_v_self->c) * __pyx_v_self->c));\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Huber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":249\n *         self.c = c\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":257\n *             return self.c * abs_r - (0.5 * self.c * self.c)\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_r;\n  double __pyx_v_abs_r;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":258\n * \n *     cpdef double dloss(self, double p, double y):\n *         cdef double r = p - y             # <<<<<<<<<<<<<<\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:\n */\n  __pyx_v_r = (__pyx_v_p - __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":259\n *     cpdef double dloss(self, double p, double y):\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<\n *         if abs_r <= self.c:\n *             return r\n */\n  __pyx_v_abs_r = fabs(__pyx_v_r);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":260\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:             # <<<<<<<<<<<<<<\n *             return r\n *         elif r > 0.0:\n */\n  __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":261\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:\n *             return r             # <<<<<<<<<<<<<<\n *         elif r > 0.0:\n *             return self.c\n */\n    __pyx_r = __pyx_v_r;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":262\n *         if abs_r <= self.c:\n *             return r\n *         elif r > 0.0:             # <<<<<<<<<<<<<<\n *             return self.c\n *         else:\n */\n  __pyx_t_6 = (__pyx_v_r > 0.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":263\n *             return r\n *         elif r > 0.0:\n *             return self.c             # <<<<<<<<<<<<<<\n *         else:\n *             return -self.c\n */\n    __pyx_r = __pyx_v_self->c;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":265\n *             return self.c\n *         else:\n *             return -self.c             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n    __pyx_r = (-__pyx_v_self->c);\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Huber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":257\n *             return self.c * abs_r - (0.5 * self.c * self.c)\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":267\n *             return -self.c\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return Huber, (self.c,)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":268\n * \n *     def __reduce__(self):\n *         return Huber, (self.c,)             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);\n  __Pyx_GIVEREF(__pyx_t_1);\n  __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber)));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));\n  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_epsilon;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__ (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__epsilon,0};\n    PyObject* values[1] = {0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__epsilon)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"__init__\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n    }\n    __pyx_v_epsilon = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_epsilon == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"__init__\", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.__init__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return -1;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self), __pyx_v_epsilon);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":279\n *     cdef double epsilon\n * \n *     def __init__(self, double epsilon):             # <<<<<<<<<<<<<<\n *         self.epsilon = epsilon\n * \n */\n\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":280\n * \n *     def __init__(self, double epsilon):\n *         self.epsilon = epsilon             # <<<<<<<<<<<<<<\n * \n *     cpdef double loss(self, double p, double y):\n */\n  __pyx_v_self->epsilon = __pyx_v_epsilon;\n\n  __pyx_r = 0;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":282\n *         self.epsilon = epsilon\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret if ret > 0 else 0\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_ret;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":283\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double ret = abs(y - p) - self.epsilon             # <<<<<<<<<<<<<<\n *         return ret if ret > 0 else 0\n * \n */\n  __pyx_v_ret = (fabs((__pyx_v_y - __pyx_v_p)) - __pyx_v_self->epsilon);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":284\n *     cpdef double loss(self, double p, double y):\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret if ret > 0 else 0             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  if ((__pyx_v_ret > 0.0)) {\n    __pyx_t_5 = __pyx_v_ret;\n  } else {\n    __pyx_t_5 = 0;\n  }\n  __pyx_r = __pyx_t_5;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":282\n *         self.epsilon = epsilon\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret if ret > 0 else 0\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":286\n *         return ret if ret > 0 else 0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         if y - p > self.epsilon:\n *             return -1\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":287\n * \n *     cpdef double dloss(self, double p, double y):\n *         if y - p > self.epsilon:             # <<<<<<<<<<<<<<\n *             return -1\n *         elif p - y > self.epsilon:\n */\n  __pyx_t_6 = ((__pyx_v_y - __pyx_v_p) > __pyx_v_self->epsilon);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":288\n *     cpdef double dloss(self, double p, double y):\n *         if y - p > self.epsilon:\n *             return -1             # <<<<<<<<<<<<<<\n *         elif p - y > self.epsilon:\n *             return 1\n */\n    __pyx_r = -1.0;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":289\n *         if y - p > self.epsilon:\n *             return -1\n *         elif p - y > self.epsilon:             # <<<<<<<<<<<<<<\n *             return 1\n *         else:\n */\n  __pyx_t_6 = ((__pyx_v_p - __pyx_v_y) > __pyx_v_self->epsilon);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":290\n *             return -1\n *         elif p - y > self.epsilon:\n *             return 1             # <<<<<<<<<<<<<<\n *         else:\n *             return 0\n */\n    __pyx_r = 1.0;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":292\n *             return 1\n *         else:\n *             return 0             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n    __pyx_r = 0.0;\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":286\n *         return ret if ret > 0 else 0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         if y - p > self.epsilon:\n *             return -1\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":294\n *             return 0\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return EpsilonInsensitive, (self.epsilon,)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":295\n * \n *     def __reduce__(self):\n *         return EpsilonInsensitive, (self.epsilon,)             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->epsilon); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);\n  __Pyx_GIVEREF(__pyx_t_1);\n  __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive)));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));\n  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_epsilon;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__ (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__epsilon,0};\n    PyObject* values[1] = {0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__epsilon)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"__init__\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n    }\n    __pyx_v_epsilon = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_epsilon == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"__init__\", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.__init__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return -1;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self), __pyx_v_epsilon);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":306\n *     cdef double epsilon\n * \n *     def __init__(self, double epsilon):             # <<<<<<<<<<<<<<\n *         self.epsilon = epsilon\n * \n */\n\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":307\n * \n *     def __init__(self, double epsilon):\n *         self.epsilon = epsilon             # <<<<<<<<<<<<<<\n * \n *     cpdef double loss(self, double p, double y):\n */\n  __pyx_v_self->epsilon = __pyx_v_epsilon;\n\n  __pyx_r = 0;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":309\n *         self.epsilon = epsilon\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret * ret if ret > 0 else 0\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_ret;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":310\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double ret = abs(y - p) - self.epsilon             # <<<<<<<<<<<<<<\n *         return ret * ret if ret > 0 else 0\n * \n */\n  __pyx_v_ret = (fabs((__pyx_v_y - __pyx_v_p)) - __pyx_v_self->epsilon);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":311\n *     cpdef double loss(self, double p, double y):\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret * ret if ret > 0 else 0             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  if ((__pyx_v_ret > 0.0)) {\n    __pyx_t_5 = (__pyx_v_ret * __pyx_v_ret);\n  } else {\n    __pyx_t_5 = 0;\n  }\n  __pyx_r = __pyx_t_5;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":309\n *         self.epsilon = epsilon\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret * ret if ret > 0 else 0\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":313\n *         return ret * ret if ret > 0 else 0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z\n *         z = y - p\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":315\n *     cpdef double dloss(self, double p, double y):\n *         cdef double z\n *         z = y - p             # <<<<<<<<<<<<<<\n *         if z > self.epsilon:\n *             return -2 * (z - self.epsilon)\n */\n  __pyx_v_z = (__pyx_v_y - __pyx_v_p);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":316\n *         cdef double z\n *         z = y - p\n *         if z > self.epsilon:             # <<<<<<<<<<<<<<\n *             return -2 * (z - self.epsilon)\n *         elif z < self.epsilon:\n */\n  __pyx_t_6 = (__pyx_v_z > __pyx_v_self->epsilon);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":317\n *         z = y - p\n *         if z > self.epsilon:\n *             return -2 * (z - self.epsilon)             # <<<<<<<<<<<<<<\n *         elif z < self.epsilon:\n *             return 2 * (-z - self.epsilon)\n */\n    __pyx_r = (-2.0 * (__pyx_v_z - __pyx_v_self->epsilon));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":318\n *         if z > self.epsilon:\n *             return -2 * (z - self.epsilon)\n *         elif z < self.epsilon:             # <<<<<<<<<<<<<<\n *             return 2 * (-z - self.epsilon)\n *         else:\n */\n  __pyx_t_6 = (__pyx_v_z < __pyx_v_self->epsilon);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":319\n *             return -2 * (z - self.epsilon)\n *         elif z < self.epsilon:\n *             return 2 * (-z - self.epsilon)             # <<<<<<<<<<<<<<\n *         else:\n *             return 0\n */\n    __pyx_r = (2.0 * ((-__pyx_v_z) - __pyx_v_self->epsilon));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":321\n *             return 2 * (-z - self.epsilon)\n *         else:\n *             return 0             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n    __pyx_r = 0.0;\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":313\n *         return ret * ret if ret > 0 else 0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z\n *         z = y - p\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":323\n *             return 0\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return SquaredEpsilonInsensitive, (self.epsilon,)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":324\n * \n *     def __reduce__(self):\n *         return SquaredEpsilonInsensitive, (self.epsilon,)             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->epsilon); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);\n  __Pyx_GIVEREF(__pyx_t_1);\n  __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive)));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));\n  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_1plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic char __pyx_doc_7sklearn_12linear_model_8sgd_fast_plain_sgd[] = \"Plain SGD for generic loss functions and penalties.\\n\\n    Parameters\\n    ----------\\n    weights : ndarray[double, ndim=1]\\n        The allocated coef_ vector.\\n    intercept : double\\n        The initial intercept.\\n    loss : LossFunction\\n        A concrete ``LossFunction`` object.\\n    penalty_type : int\\n        The penalty 2 for L2, 1 for L1, and 3 for Elastic-Net.\\n    alpha : float\\n        The regularization parameter.\\n    rho : float\\n        The elastic net hyperparameter.\\n    dataset : SequentialDataset\\n        A concrete ``SequentialDataset`` object.\\n    n_iter : int\\n        The number of iterations (epochs).\\n    fit_intercept : int\\n        Whether or not to fit the intercept (1 or 0).\\n    verbose : int\\n        Print verbose output; 0 for quite.\\n    shuffle : int\\n        Whether to shuffle the training data before each epoch.\\n    weight_pos : float\\n        The weight of the positive class.\\n    weight_neg : float\\n        The weight of the negative class.\\n    seed : int or RandomState object\\n        The seed of the pseudo random number generator to use when\\n        shuffling the data\\n    learning_rate : int\\n        The learning rate:\\n        (1) constant, eta = eta0\\n        (2) optimal, eta = 1.0/(t+t0)\\n        (3) inverse scaling, eta = eta0 / pow(t, power_t)\\n        (4) Passive Agressive-I, eta = min(alpha, loss/norm(x))\\n        (5) Passive Agressive-II, eta = 1.0 / (norm(x) + 0.5*alpha)\\n    eta0 : double\\n        The initial learning rate.\\n    power_t : double\\n        The exponent for inverse scaling learning rate.\\n    t : double\\n        Initial state of the learning rate. This value is equal to the\\n        iteration count except when the learning rate is set to `optimal`.\\n        Default: 1.0.\\n\\n    Returns\\n    -------\\n    weights : array, shape=[n_features]\\n        The fitted weight vector.\\n    intercept : float\\n        The fitted intercept term.\\n\\n    \";\nstatic PyMethodDef __pyx_mdef_7sklearn_12linear_model_8sgd_fast_1plain_sgd = {__Pyx_NAMESTR(\"plain_sgd\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_1plain_sgd, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7sklearn_12linear_model_8sgd_fast_plain_sgd)};\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_1plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  PyArrayObject *__pyx_v_weights = 0;\n  double __pyx_v_intercept;\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_loss = 0;\n  int __pyx_v_penalty_type;\n  double __pyx_v_alpha;\n  double __pyx_v_C;\n  double __pyx_v_rho;\n  struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_v_dataset = 0;\n  int __pyx_v_n_iter;\n  int __pyx_v_fit_intercept;\n  int __pyx_v_verbose;\n  int __pyx_v_shuffle;\n  PyObject *__pyx_v_seed = 0;\n  double __pyx_v_weight_pos;\n  double __pyx_v_weight_neg;\n  int __pyx_v_learning_rate;\n  double __pyx_v_eta0;\n  double __pyx_v_power_t;\n  double __pyx_v_t;\n  double __pyx_v_intercept_decay;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"plain_sgd (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__weights,&__pyx_n_s__intercept,&__pyx_n_s__loss,&__pyx_n_s__penalty_type,&__pyx_n_s__alpha,&__pyx_n_s__C,&__pyx_n_s__rho,&__pyx_n_s__dataset,&__pyx_n_s__n_iter,&__pyx_n_s__fit_intercept,&__pyx_n_s__verbose,&__pyx_n_s__shuffle,&__pyx_n_s__seed,&__pyx_n_s__weight_pos,&__pyx_n_s__weight_neg,&__pyx_n_s__learning_rate,&__pyx_n_s__eta0,&__pyx_n_s__power_t,&__pyx_n_s__t,&__pyx_n_s__intercept_decay,0};\n    PyObject* values[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);\n        case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);\n        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);\n        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);\n        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);\n        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);\n        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);\n        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);\n        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);\n        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);\n        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);\n        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);\n        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);\n        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);\n        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);\n        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);\n        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);\n        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weights)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  2:\n        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__loss)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  3:\n        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__penalty_type)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  4:\n        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alpha)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  5:\n        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__C)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  6:\n        if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__rho)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  7:\n        if (likely((values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dataset)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  8:\n        if (likely((values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_iter)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  9:\n        if (likely((values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fit_intercept)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 10:\n        if (likely((values[10] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__verbose)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 11:\n        if (likely((values[11] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__shuffle)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 12:\n        if (likely((values[12] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__seed)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 13:\n        if (likely((values[13] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_pos)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 14:\n        if (likely((values[14] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_neg)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 14); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 15:\n        if (likely((values[15] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__learning_rate)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 15); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 16:\n        if (likely((values[16] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eta0)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 16); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 17:\n        if (likely((values[17] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__power_t)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 17); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 18:\n        if (kw_args > 0) {\n          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__t);\n          if (value) { values[18] = value; kw_args--; }\n        }\n        case 19:\n        if (kw_args > 0) {\n          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept_decay);\n          if (value) { values[19] = value; kw_args--; }\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"plain_sgd\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else {\n      switch (PyTuple_GET_SIZE(__pyx_args)) {\n        case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);\n        case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);\n        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);\n        values[16] = PyTuple_GET_ITEM(__pyx_args, 16);\n        values[15] = PyTuple_GET_ITEM(__pyx_args, 15);\n        values[14] = PyTuple_GET_ITEM(__pyx_args, 14);\n        values[13] = PyTuple_GET_ITEM(__pyx_args, 13);\n        values[12] = PyTuple_GET_ITEM(__pyx_args, 12);\n        values[11] = PyTuple_GET_ITEM(__pyx_args, 11);\n        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);\n        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);\n        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);\n        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);\n        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);\n        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);\n        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);\n        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);\n        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);\n        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n    }\n    __pyx_v_weights = ((PyArrayObject *)values[0]);\n    __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_loss = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)values[2]);\n    __pyx_v_penalty_type = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_penalty_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_alpha = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_alpha == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_C = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_C == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_rho = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_rho == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_dataset = ((struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *)values[7]);\n    __pyx_v_n_iter = __Pyx_PyInt_AsInt(values[8]); if (unlikely((__pyx_v_n_iter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_fit_intercept = __Pyx_PyInt_AsInt(values[9]); if (unlikely((__pyx_v_fit_intercept == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_verbose = __Pyx_PyInt_AsInt(values[10]); if (unlikely((__pyx_v_verbose == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_shuffle = __Pyx_PyInt_AsInt(values[11]); if (unlikely((__pyx_v_shuffle == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_seed = values[12];\n    __pyx_v_weight_pos = __pyx_PyFloat_AsDouble(values[13]); if (unlikely((__pyx_v_weight_pos == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 336; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_weight_neg = __pyx_PyFloat_AsDouble(values[14]); if (unlikely((__pyx_v_weight_neg == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 336; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_learning_rate = __Pyx_PyInt_AsInt(values[15]); if (unlikely((__pyx_v_learning_rate == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_eta0 = __pyx_PyFloat_AsDouble(values[16]); if (unlikely((__pyx_v_eta0 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_power_t = __pyx_PyFloat_AsDouble(values[17]); if (unlikely((__pyx_v_power_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    if (values[18]) {\n      __pyx_v_t = __pyx_PyFloat_AsDouble(values[18]); if (unlikely((__pyx_v_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    } else {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":339\n *               int learning_rate, double eta0,\n *               double power_t,\n *               double t=1.0,             # <<<<<<<<<<<<<<\n *               double intercept_decay=1.0):\n *     \"\"\"Plain SGD for generic loss functions and penalties.\n */\n      __pyx_v_t = ((double)1.0);\n    }\n    if (values[19]) {\n      __pyx_v_intercept_decay = __pyx_PyFloat_AsDouble(values[19]); if (unlikely((__pyx_v_intercept_decay == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    } else {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":340\n *               double power_t,\n *               double t=1.0,\n *               double intercept_decay=1.0):             # <<<<<<<<<<<<<<\n *     \"\"\"Plain SGD for generic loss functions and penalties.\n * \n */\n      __pyx_v_intercept_decay = ((double)1.0);\n    }\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.plain_sgd\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_weights), __pyx_ptype_5numpy_ndarray, 1, \"weights\", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction, 1, \"loss\", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dataset), __pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset, 1, \"dataset\", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(__pyx_self, __pyx_v_weights, __pyx_v_intercept, __pyx_v_loss, __pyx_v_penalty_type, __pyx_v_alpha, __pyx_v_C, __pyx_v_rho, __pyx_v_dataset, __pyx_v_n_iter, __pyx_v_fit_intercept, __pyx_v_verbose, __pyx_v_shuffle, __pyx_v_seed, __pyx_v_weight_pos, __pyx_v_weight_neg, __pyx_v_learning_rate, __pyx_v_eta0, __pyx_v_power_t, __pyx_v_t, __pyx_v_intercept_decay);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":327\n * \n * \n * def plain_sgd(np.ndarray[DOUBLE, ndim=1, mode='c'] weights,             # <<<<<<<<<<<<<<\n *               double intercept,\n *               LossFunction loss,\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_weights, double __pyx_v_intercept, struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_loss, int __pyx_v_penalty_type, double __pyx_v_alpha, double __pyx_v_C, double __pyx_v_rho, struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_v_dataset, int __pyx_v_n_iter, int __pyx_v_fit_intercept, int __pyx_v_verbose, int __pyx_v_shuffle, PyObject *__pyx_v_seed, double __pyx_v_weight_pos, double __pyx_v_weight_neg, int __pyx_v_learning_rate, double __pyx_v_eta0, double __pyx_v_power_t, double __pyx_v_t, double __pyx_v_intercept_decay) {\n  Py_ssize_t __pyx_v_n_samples;\n  Py_ssize_t __pyx_v_n_features;\n  struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *__pyx_v_w = 0;\n  __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_x_data_ptr;\n  __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *__pyx_v_x_ind_ptr;\n  int __pyx_v_xnnz;\n  double __pyx_v_eta;\n  double __pyx_v_p;\n  double __pyx_v_update;\n  double __pyx_v_sumloss;\n  __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE __pyx_v_y;\n  __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE __pyx_v_sample_weight;\n  double __pyx_v_class_weight;\n  unsigned int __pyx_v_count;\n  unsigned int __pyx_v_epoch;\n  CYTHON_UNUSED unsigned int __pyx_v_i;\n  int __pyx_v_is_hinge;\n  PyArrayObject *__pyx_v_q = 0;\n  __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_q_data_ptr;\n  double __pyx_v_u;\n  PyObject *__pyx_v_t_start = NULL;\n  __Pyx_LocalBuf_ND __pyx_pybuffernd_q;\n  __Pyx_Buffer __pyx_pybuffer_q;\n  __Pyx_LocalBuf_ND __pyx_pybuffernd_weights;\n  __Pyx_Buffer __pyx_pybuffer_weights;\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  Py_ssize_t __pyx_t_1;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  int __pyx_t_4;\n  PyArrayObject *__pyx_t_5 = NULL;\n  PyObject *__pyx_t_6 = NULL;\n  PyObject *__pyx_t_7 = NULL;\n  PyObject *__pyx_t_8 = NULL;\n  int __pyx_t_9;\n  PyObject *__pyx_t_10 = NULL;\n  PyObject *__pyx_t_11 = NULL;\n  PyObject *__pyx_t_12 = NULL;\n  unsigned int __pyx_t_13;\n  unsigned int __pyx_t_14;\n  PyObject *__pyx_t_15 = NULL;\n  int __pyx_t_16;\n  int __pyx_t_17;\n  int __pyx_t_18;\n  int __pyx_t_19;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"plain_sgd\", 0);\n  __pyx_pybuffer_q.pybuffer.buf = NULL;\n  __pyx_pybuffer_q.refcount = 0;\n  __pyx_pybuffernd_q.data = NULL;\n  __pyx_pybuffernd_q.rcbuffer = &__pyx_pybuffer_q;\n  __pyx_pybuffer_weights.pybuffer.buf = NULL;\n  __pyx_pybuffer_weights.refcount = 0;\n  __pyx_pybuffernd_weights.data = NULL;\n  __pyx_pybuffernd_weights.rcbuffer = &__pyx_pybuffer_weights;\n  {\n    __Pyx_BufFmt_StackElem __pyx_stack[1];\n    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_weights.rcbuffer->pybuffer, (PyObject*)__pyx_v_weights, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  }\n  __pyx_pybuffernd_weights.diminfo[0].strides = __pyx_pybuffernd_weights.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_weights.diminfo[0].shape = __pyx_pybuffernd_weights.rcbuffer->pybuffer.shape[0];\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":400\n * \n *     # get the data information into easy vars\n *     cdef Py_ssize_t n_samples = dataset.n_samples             # <<<<<<<<<<<<<<\n *     cdef Py_ssize_t n_features = weights.shape[0]\n * \n */\n  __pyx_t_1 = __pyx_v_dataset->n_samples;\n  __pyx_v_n_samples = __pyx_t_1;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":401\n *     # get the data information into easy vars\n *     cdef Py_ssize_t n_samples = dataset.n_samples\n *     cdef Py_ssize_t n_features = weights.shape[0]             # <<<<<<<<<<<<<<\n * \n *     cdef WeightVector w = WeightVector(weights)\n */\n  __pyx_v_n_features = (__pyx_v_weights->dimensions[0]);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":403\n *     cdef Py_ssize_t n_features = weights.shape[0]\n * \n *     cdef WeightVector w = WeightVector(weights)             # <<<<<<<<<<<<<<\n * \n *     cdef DOUBLE * x_data_ptr = NULL\n */\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __Pyx_INCREF(((PyObject *)__pyx_v_weights));\n  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_weights));\n  __Pyx_GIVEREF(((PyObject *)__pyx_v_weights));\n  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_3);\n  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n  __pyx_v_w = ((struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_t_3);\n  __pyx_t_3 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":405\n *     cdef WeightVector w = WeightVector(weights)\n * \n *     cdef DOUBLE * x_data_ptr = NULL             # <<<<<<<<<<<<<<\n *     cdef INTEGER * x_ind_ptr = NULL\n * \n */\n  __pyx_v_x_data_ptr = NULL;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":406\n * \n *     cdef DOUBLE * x_data_ptr = NULL\n *     cdef INTEGER * x_ind_ptr = NULL             # <<<<<<<<<<<<<<\n * \n *     # helper variable\n */\n  __pyx_v_x_ind_ptr = NULL;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":410\n *     # helper variable\n *     cdef int xnnz\n *     cdef double eta = 0.0             # <<<<<<<<<<<<<<\n *     cdef double p = 0.0\n *     cdef double update = 0.0\n */\n  __pyx_v_eta = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":411\n *     cdef int xnnz\n *     cdef double eta = 0.0\n *     cdef double p = 0.0             # <<<<<<<<<<<<<<\n *     cdef double update = 0.0\n *     cdef double sumloss = 0.0\n */\n  __pyx_v_p = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":412\n *     cdef double eta = 0.0\n *     cdef double p = 0.0\n *     cdef double update = 0.0             # <<<<<<<<<<<<<<\n *     cdef double sumloss = 0.0\n *     cdef DOUBLE y = 0.0\n */\n  __pyx_v_update = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":413\n *     cdef double p = 0.0\n *     cdef double update = 0.0\n *     cdef double sumloss = 0.0             # <<<<<<<<<<<<<<\n *     cdef DOUBLE y = 0.0\n *     cdef DOUBLE sample_weight\n */\n  __pyx_v_sumloss = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":414\n *     cdef double update = 0.0\n *     cdef double sumloss = 0.0\n *     cdef DOUBLE y = 0.0             # <<<<<<<<<<<<<<\n *     cdef DOUBLE sample_weight\n *     cdef double class_weight = 1.0\n */\n  __pyx_v_y = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":416\n *     cdef DOUBLE y = 0.0\n *     cdef DOUBLE sample_weight\n *     cdef double class_weight = 1.0             # <<<<<<<<<<<<<<\n *     cdef unsigned int count = 0\n *     cdef unsigned int epoch = 0\n */\n  __pyx_v_class_weight = 1.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":417\n *     cdef DOUBLE sample_weight\n *     cdef double class_weight = 1.0\n *     cdef unsigned int count = 0             # <<<<<<<<<<<<<<\n *     cdef unsigned int epoch = 0\n *     cdef unsigned int i = 0\n */\n  __pyx_v_count = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":418\n *     cdef double class_weight = 1.0\n *     cdef unsigned int count = 0\n *     cdef unsigned int epoch = 0             # <<<<<<<<<<<<<<\n *     cdef unsigned int i = 0\n *     cdef int is_hinge = isinstance(loss, Hinge)\n */\n  __pyx_v_epoch = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":419\n *     cdef unsigned int count = 0\n *     cdef unsigned int epoch = 0\n *     cdef unsigned int i = 0             # <<<<<<<<<<<<<<\n *     cdef int is_hinge = isinstance(loss, Hinge)\n * \n */\n  __pyx_v_i = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":420\n *     cdef unsigned int epoch = 0\n *     cdef unsigned int i = 0\n *     cdef int is_hinge = isinstance(loss, Hinge)             # <<<<<<<<<<<<<<\n * \n *     # q vector is only used for L1 regularization\n */\n  __pyx_t_3 = ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge));\n  __Pyx_INCREF(__pyx_t_3);\n  __pyx_t_4 = __Pyx_TypeCheck(((PyObject *)__pyx_v_loss), __pyx_t_3); \n  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n  __pyx_v_is_hinge = __pyx_t_4;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":423\n * \n *     # q vector is only used for L1 regularization\n *     cdef np.ndarray[DOUBLE, ndim = 1, mode = \"c\"] q = None             # <<<<<<<<<<<<<<\n *     cdef DOUBLE * q_data_ptr = NULL\n *     if penalty_type == L1 or penalty_type == ELASTICNET:\n */\n  __pyx_t_5 = ((PyArrayObject *)Py_None);\n  {\n    __Pyx_BufFmt_StackElem __pyx_stack[1];\n    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {\n      __pyx_v_q = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_q.rcbuffer->pybuffer.buf = NULL;\n      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    } else {__pyx_pybuffernd_q.diminfo[0].strides = __pyx_pybuffernd_q.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_q.diminfo[0].shape = __pyx_pybuffernd_q.rcbuffer->pybuffer.shape[0];\n    }\n  }\n  __pyx_t_5 = 0;\n  __Pyx_INCREF(Py_None);\n  __pyx_v_q = ((PyArrayObject *)Py_None);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":424\n *     # q vector is only used for L1 regularization\n *     cdef np.ndarray[DOUBLE, ndim = 1, mode = \"c\"] q = None\n *     cdef DOUBLE * q_data_ptr = NULL             # <<<<<<<<<<<<<<\n *     if penalty_type == L1 or penalty_type == ELASTICNET:\n *         q = np.zeros((n_features,), dtype=np.float64, order=\"c\")\n */\n  __pyx_v_q_data_ptr = NULL;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":425\n *     cdef np.ndarray[DOUBLE, ndim = 1, mode = \"c\"] q = None\n *     cdef DOUBLE * q_data_ptr = NULL\n *     if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<\n *         q = np.zeros((n_features,), dtype=np.float64, order=\"c\")\n *         q_data_ptr = <DOUBLE * > q.data\n */\n  switch (__pyx_v_penalty_type) {\n    case 1:\n    case 3:\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":426\n *     cdef DOUBLE * q_data_ptr = NULL\n *     if penalty_type == L1 or penalty_type == ELASTICNET:\n *         q = np.zeros((n_features,), dtype=np.float64, order=\"c\")             # <<<<<<<<<<<<<<\n *         q_data_ptr = <DOUBLE * > q.data\n *     cdef double u = 0.0\n */\n    __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_2);\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_n_features); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_6);\n    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3);\n    __Pyx_GIVEREF(__pyx_t_3);\n    __pyx_t_3 = 0;\n    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_6));\n    __Pyx_GIVEREF(((PyObject *)__pyx_t_6));\n    __pyx_t_6 = 0;\n    __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(((PyObject *)__pyx_t_6));\n    __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_7);\n    __pyx_t_8 = PyObject_GetAttr(__pyx_t_7, __pyx_n_s__float64); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_8);\n    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n    if (PyDict_SetItem(__pyx_t_6, ((PyObject *)__pyx_n_s__dtype), __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;\n    if (PyDict_SetItem(__pyx_t_6, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__c)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __pyx_t_8 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_6)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_8);\n    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n    __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n    __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;\n    if (!(likely(((__pyx_t_8) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_8, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __pyx_t_5 = ((PyArrayObject *)__pyx_t_8);\n    {\n      __Pyx_BufFmt_StackElem __pyx_stack[1];\n      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);\n      __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);\n      if (unlikely(__pyx_t_9 < 0)) {\n        PyErr_Fetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12);\n        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_v_q, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {\n          Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12);\n          __Pyx_RaiseBufferFallbackError();\n        } else {\n          PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12);\n        }\n      }\n      __pyx_pybuffernd_q.diminfo[0].strides = __pyx_pybuffernd_q.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_q.diminfo[0].shape = __pyx_pybuffernd_q.rcbuffer->pybuffer.shape[0];\n      if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    }\n    __pyx_t_5 = 0;\n    __Pyx_DECREF(((PyObject *)__pyx_v_q));\n    __pyx_v_q = ((PyArrayObject *)__pyx_t_8);\n    __pyx_t_8 = 0;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":427\n *     if penalty_type == L1 or penalty_type == ELASTICNET:\n *         q = np.zeros((n_features,), dtype=np.float64, order=\"c\")\n *         q_data_ptr = <DOUBLE * > q.data             # <<<<<<<<<<<<<<\n *     cdef double u = 0.0\n * \n */\n    __pyx_v_q_data_ptr = ((__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *)__pyx_v_q->data);\n    break;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":428\n *         q = np.zeros((n_features,), dtype=np.float64, order=\"c\")\n *         q_data_ptr = <DOUBLE * > q.data\n *     cdef double u = 0.0             # <<<<<<<<<<<<<<\n * \n *     if penalty_type == L2:\n */\n  __pyx_v_u = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":432\n *     if penalty_type == L2:\n *         rho = 1.0\n *     elif penalty_type == L1:             # <<<<<<<<<<<<<<\n *         rho = 0.0\n * \n */\n  switch (__pyx_v_penalty_type) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":430\n *     cdef double u = 0.0\n * \n *     if penalty_type == L2:             # <<<<<<<<<<<<<<\n *         rho = 1.0\n *     elif penalty_type == L1:\n */\n    case 2:\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":431\n * \n *     if penalty_type == L2:\n *         rho = 1.0             # <<<<<<<<<<<<<<\n *     elif penalty_type == L1:\n *         rho = 0.0\n */\n    __pyx_v_rho = 1.0;\n    break;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":432\n *     if penalty_type == L2:\n *         rho = 1.0\n *     elif penalty_type == L1:             # <<<<<<<<<<<<<<\n *         rho = 0.0\n * \n */\n    case 1:\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":433\n *         rho = 1.0\n *     elif penalty_type == L1:\n *         rho = 0.0             # <<<<<<<<<<<<<<\n * \n *     eta = eta0\n */\n    __pyx_v_rho = 0.0;\n    break;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":435\n *         rho = 0.0\n * \n *     eta = eta0             # <<<<<<<<<<<<<<\n * \n *     t_start = time()\n */\n  __pyx_v_eta = __pyx_v_eta0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":437\n *     eta = eta0\n * \n *     t_start = time()             # <<<<<<<<<<<<<<\n *     for epoch in range(n_iter):\n *         if verbose > 0:\n */\n  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_8);\n  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_6);\n  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;\n  __pyx_v_t_start = __pyx_t_6;\n  __pyx_t_6 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":438\n * \n *     t_start = time()\n *     for epoch in range(n_iter):             # <<<<<<<<<<<<<<\n *         if verbose > 0:\n *             print(\"-- Epoch %d\" % (epoch + 1))\n */\n  __pyx_t_9 = __pyx_v_n_iter;\n  for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_9; __pyx_t_13+=1) {\n    __pyx_v_epoch = __pyx_t_13;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":439\n *     t_start = time()\n *     for epoch in range(n_iter):\n *         if verbose > 0:             # <<<<<<<<<<<<<<\n *             print(\"-- Epoch %d\" % (epoch + 1))\n *         if shuffle:\n */\n    __pyx_t_4 = (__pyx_v_verbose > 0);\n    if (__pyx_t_4) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":440\n *     for epoch in range(n_iter):\n *         if verbose > 0:\n *             print(\"-- Epoch %d\" % (epoch + 1))             # <<<<<<<<<<<<<<\n *         if shuffle:\n *             dataset.shuffle(seed)\n */\n      __pyx_t_6 = PyInt_FromLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_6);\n      __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_1), __pyx_t_6); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_8));\n      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_8)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;\n      goto __pyx_L5;\n    }\n    __pyx_L5:;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":441\n *         if verbose > 0:\n *             print(\"-- Epoch %d\" % (epoch + 1))\n *         if shuffle:             # <<<<<<<<<<<<<<\n *             dataset.shuffle(seed)\n *         for i in range(n_samples):\n */\n    if (__pyx_v_shuffle) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":442\n *             print(\"-- Epoch %d\" % (epoch + 1))\n *         if shuffle:\n *             dataset.shuffle(seed)             # <<<<<<<<<<<<<<\n *         for i in range(n_samples):\n *             dataset.next( & x_data_ptr, & x_ind_ptr, & xnnz, & y,\n */\n      ((struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *)__pyx_v_dataset->__pyx_vtab)->shuffle(__pyx_v_dataset, __pyx_v_seed);\n      goto __pyx_L6;\n    }\n    __pyx_L6:;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":443\n *         if shuffle:\n *             dataset.shuffle(seed)\n *         for i in range(n_samples):             # <<<<<<<<<<<<<<\n *             dataset.next( & x_data_ptr, & x_ind_ptr, & xnnz, & y,\n *                          & sample_weight)\n */\n    __pyx_t_1 = __pyx_v_n_samples;\n    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_1; __pyx_t_14+=1) {\n      __pyx_v_i = __pyx_t_14;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":445\n *         for i in range(n_samples):\n *             dataset.next( & x_data_ptr, & x_ind_ptr, & xnnz, & y,\n *                          & sample_weight)             # <<<<<<<<<<<<<<\n * \n *             p = w.dot(x_data_ptr, x_ind_ptr, xnnz) + intercept\n */\n      ((struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *)__pyx_v_dataset->__pyx_vtab)->next(__pyx_v_dataset, (&__pyx_v_x_data_ptr), (&__pyx_v_x_ind_ptr), (&__pyx_v_xnnz), (&__pyx_v_y), (&__pyx_v_sample_weight));\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":447\n *                          & sample_weight)\n * \n *             p = w.dot(x_data_ptr, x_ind_ptr, xnnz) + intercept             # <<<<<<<<<<<<<<\n * \n *             if learning_rate == OPTIMAL:\n */\n      __pyx_v_p = (((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->dot(__pyx_v_w, __pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz) + __pyx_v_intercept);\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":451\n *             if learning_rate == OPTIMAL:\n *                 eta = 1.0 / (alpha * t)\n *             elif learning_rate == INVSCALING:             # <<<<<<<<<<<<<<\n *                 eta = eta0 / pow(t, power_t)\n * \n */\n      switch (__pyx_v_learning_rate) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":449\n *             p = w.dot(x_data_ptr, x_ind_ptr, xnnz) + intercept\n * \n *             if learning_rate == OPTIMAL:             # <<<<<<<<<<<<<<\n *                 eta = 1.0 / (alpha * t)\n *             elif learning_rate == INVSCALING:\n */\n        case 2:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":450\n * \n *             if learning_rate == OPTIMAL:\n *                 eta = 1.0 / (alpha * t)             # <<<<<<<<<<<<<<\n *             elif learning_rate == INVSCALING:\n *                 eta = eta0 / pow(t, power_t)\n */\n        __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));\n        break;\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":451\n *             if learning_rate == OPTIMAL:\n *                 eta = 1.0 / (alpha * t)\n *             elif learning_rate == INVSCALING:             # <<<<<<<<<<<<<<\n *                 eta = eta0 / pow(t, power_t)\n * \n */\n        case 3:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":452\n *                 eta = 1.0 / (alpha * t)\n *             elif learning_rate == INVSCALING:\n *                 eta = eta0 / pow(t, power_t)             # <<<<<<<<<<<<<<\n * \n *             if verbose > 0:\n */\n        __pyx_v_eta = (__pyx_v_eta0 / pow(__pyx_v_t, __pyx_v_power_t));\n        break;\n      }\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":454\n *                 eta = eta0 / pow(t, power_t)\n * \n *             if verbose > 0:             # <<<<<<<<<<<<<<\n *                 sumloss += loss.loss(p, y)\n * \n */\n      __pyx_t_4 = (__pyx_v_verbose > 0);\n      if (__pyx_t_4) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":455\n * \n *             if verbose > 0:\n *                 sumloss += loss.loss(p, y)             # <<<<<<<<<<<<<<\n * \n *             if y > 0.0:\n */\n        __pyx_v_sumloss = (__pyx_v_sumloss + ((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));\n        goto __pyx_L9;\n      }\n      __pyx_L9:;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":457\n *                 sumloss += loss.loss(p, y)\n * \n *             if y > 0.0:             # <<<<<<<<<<<<<<\n *                 class_weight = weight_pos\n *             else:\n */\n      __pyx_t_4 = (__pyx_v_y > 0.0);\n      if (__pyx_t_4) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":458\n * \n *             if y > 0.0:\n *                 class_weight = weight_pos             # <<<<<<<<<<<<<<\n *             else:\n *                 class_weight = weight_neg\n */\n        __pyx_v_class_weight = __pyx_v_weight_pos;\n        goto __pyx_L10;\n      }\n      /*else*/ {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":460\n *                 class_weight = weight_pos\n *             else:\n *                 class_weight = weight_neg             # <<<<<<<<<<<<<<\n * \n *             if learning_rate == PA1:\n */\n        __pyx_v_class_weight = __pyx_v_weight_neg;\n      }\n      __pyx_L10:;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":467\n *                     continue\n *                 update = min(C, loss.loss(p, y) / update)\n *             elif learning_rate == PA2:             # <<<<<<<<<<<<<<\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 update = loss.loss(p, y) / (update + 0.5 / C)\n */\n      switch (__pyx_v_learning_rate) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":462\n *                 class_weight = weight_neg\n * \n *             if learning_rate == PA1:             # <<<<<<<<<<<<<<\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 if update == 0:\n */\n        case 4:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":463\n * \n *             if learning_rate == PA1:\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)             # <<<<<<<<<<<<<<\n *                 if update == 0:\n *                     continue\n */\n        __pyx_v_update = __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz);\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":464\n *             if learning_rate == PA1:\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 if update == 0:             # <<<<<<<<<<<<<<\n *                     continue\n *                 update = min(C, loss.loss(p, y) / update)\n */\n        __pyx_t_4 = (__pyx_v_update == 0.0);\n        if (__pyx_t_4) {\n\n          /* \"sklearn/linear_model/sgd_fast.pyx\":465\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 if update == 0:\n *                     continue             # <<<<<<<<<<<<<<\n *                 update = min(C, loss.loss(p, y) / update)\n *             elif learning_rate == PA2:\n */\n          goto __pyx_L7_continue;\n          goto __pyx_L11;\n        }\n        __pyx_L11:;\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":466\n *                 if update == 0:\n *                     continue\n *                 update = min(C, loss.loss(p, y) / update)             # <<<<<<<<<<<<<<\n *             elif learning_rate == PA2:\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n */\n        __pyx_v_update = __pyx_f_7sklearn_12linear_model_8sgd_fast_min(__pyx_v_C, (((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0) / __pyx_v_update));\n        break;\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":467\n *                     continue\n *                 update = min(C, loss.loss(p, y) / update)\n *             elif learning_rate == PA2:             # <<<<<<<<<<<<<<\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 update = loss.loss(p, y) / (update + 0.5 / C)\n */\n        case 5:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":468\n *                 update = min(C, loss.loss(p, y) / update)\n *             elif learning_rate == PA2:\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)             # <<<<<<<<<<<<<<\n *                 update = loss.loss(p, y) / (update + 0.5 / C)\n *             else:\n */\n        __pyx_v_update = __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz);\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":469\n *             elif learning_rate == PA2:\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 update = loss.loss(p, y) / (update + 0.5 / C)             # <<<<<<<<<<<<<<\n *             else:\n *                 update = -eta * loss.dloss(p, y)\n */\n        __pyx_v_update = (((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0) / (__pyx_v_update + (0.5 / __pyx_v_C)));\n        break;\n        default:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":471\n *                 update = loss.loss(p, y) / (update + 0.5 / C)\n *             else:\n *                 update = -eta * loss.dloss(p, y)             # <<<<<<<<<<<<<<\n * \n *             if learning_rate >= PA1:\n */\n        __pyx_v_update = ((-__pyx_v_eta) * ((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));\n        break;\n      }\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":473\n *                 update = -eta * loss.dloss(p, y)\n * \n *             if learning_rate >= PA1:             # <<<<<<<<<<<<<<\n *                 if is_hinge:\n *                     # classification\n */\n      __pyx_t_4 = (__pyx_v_learning_rate >= 4);\n      if (__pyx_t_4) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":474\n * \n *             if learning_rate >= PA1:\n *                 if is_hinge:             # <<<<<<<<<<<<<<\n *                     # classification\n *                     update *= y\n */\n        if (__pyx_v_is_hinge) {\n\n          /* \"sklearn/linear_model/sgd_fast.pyx\":476\n *                 if is_hinge:\n *                     # classification\n *                     update *= y             # <<<<<<<<<<<<<<\n *                 elif y - p < 0:\n *                     # regression\n */\n          __pyx_v_update = (__pyx_v_update * __pyx_v_y);\n          goto __pyx_L13;\n        }\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":477\n *                     # classification\n *                     update *= y\n *                 elif y - p < 0:             # <<<<<<<<<<<<<<\n *                     # regression\n *                     update *= -1\n */\n        __pyx_t_4 = ((__pyx_v_y - __pyx_v_p) < 0.0);\n        if (__pyx_t_4) {\n\n          /* \"sklearn/linear_model/sgd_fast.pyx\":479\n *                 elif y - p < 0:\n *                     # regression\n *                     update *= -1             # <<<<<<<<<<<<<<\n * \n *             update *= class_weight * sample_weight\n */\n          __pyx_v_update = (__pyx_v_update * -1.0);\n          goto __pyx_L13;\n        }\n        __pyx_L13:;\n        goto __pyx_L12;\n      }\n      __pyx_L12:;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":481\n *                     update *= -1\n * \n *             update *= class_weight * sample_weight             # <<<<<<<<<<<<<<\n * \n *             if update != 0.0:\n */\n      __pyx_v_update = (__pyx_v_update * (__pyx_v_class_weight * __pyx_v_sample_weight));\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":483\n *             update *= class_weight * sample_weight\n * \n *             if update != 0.0:             # <<<<<<<<<<<<<<\n *                 w.add(x_data_ptr, x_ind_ptr, xnnz, update)\n *                 if fit_intercept == 1:\n */\n      __pyx_t_4 = (__pyx_v_update != 0.0);\n      if (__pyx_t_4) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":484\n * \n *             if update != 0.0:\n *                 w.add(x_data_ptr, x_ind_ptr, xnnz, update)             # <<<<<<<<<<<<<<\n *                 if fit_intercept == 1:\n *                     intercept += update * intercept_decay\n */\n        ((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->add(__pyx_v_w, __pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz, __pyx_v_update);\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":485\n *             if update != 0.0:\n *                 w.add(x_data_ptr, x_ind_ptr, xnnz, update)\n *                 if fit_intercept == 1:             # <<<<<<<<<<<<<<\n *                     intercept += update * intercept_decay\n *             if penalty_type >= L2:\n */\n        __pyx_t_4 = (__pyx_v_fit_intercept == 1);\n        if (__pyx_t_4) {\n\n          /* \"sklearn/linear_model/sgd_fast.pyx\":486\n *                 w.add(x_data_ptr, x_ind_ptr, xnnz, update)\n *                 if fit_intercept == 1:\n *                     intercept += update * intercept_decay             # <<<<<<<<<<<<<<\n *             if penalty_type >= L2:\n *                 w.scale(1.0 - (rho * eta * alpha))\n */\n          __pyx_v_intercept = (__pyx_v_intercept + (__pyx_v_update * __pyx_v_intercept_decay));\n          goto __pyx_L15;\n        }\n        __pyx_L15:;\n        goto __pyx_L14;\n      }\n      __pyx_L14:;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":487\n *                 if fit_intercept == 1:\n *                     intercept += update * intercept_decay\n *             if penalty_type >= L2:             # <<<<<<<<<<<<<<\n *                 w.scale(1.0 - (rho * eta * alpha))\n * \n */\n      __pyx_t_4 = (__pyx_v_penalty_type >= 2);\n      if (__pyx_t_4) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":488\n *                     intercept += update * intercept_decay\n *             if penalty_type >= L2:\n *                 w.scale(1.0 - (rho * eta * alpha))             # <<<<<<<<<<<<<<\n * \n *             if penalty_type == L1 or penalty_type == ELASTICNET:\n */\n        ((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->scale(__pyx_v_w, (1.0 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha)));\n        goto __pyx_L16;\n      }\n      __pyx_L16:;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":490\n *                 w.scale(1.0 - (rho * eta * alpha))\n * \n *             if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<\n *                 u += ((1.0 - rho) * eta * alpha)\n *                 l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u)\n */\n      switch (__pyx_v_penalty_type) {\n        case 1:\n        case 3:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":491\n * \n *             if penalty_type == L1 or penalty_type == ELASTICNET:\n *                 u += ((1.0 - rho) * eta * alpha)             # <<<<<<<<<<<<<<\n *                 l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u)\n *             t += 1\n */\n        __pyx_v_u = (__pyx_v_u + (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha));\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":492\n *             if penalty_type == L1 or penalty_type == ELASTICNET:\n *                 u += ((1.0 - rho) * eta * alpha)\n *                 l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u)             # <<<<<<<<<<<<<<\n *             t += 1\n *             count += 1\n */\n        __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(__pyx_v_w, __pyx_v_q_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz, __pyx_v_u);\n        break;\n      }\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":493\n *                 u += ((1.0 - rho) * eta * alpha)\n *                 l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u)\n *             t += 1             # <<<<<<<<<<<<<<\n *             count += 1\n * \n */\n      __pyx_v_t = (__pyx_v_t + 1.0);\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":494\n *                 l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u)\n *             t += 1\n *             count += 1             # <<<<<<<<<<<<<<\n * \n *         # report epoch information\n */\n      __pyx_v_count = (__pyx_v_count + 1);\n      __pyx_L7_continue:;\n    }\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":497\n * \n *         # report epoch information\n *         if verbose > 0:             # <<<<<<<<<<<<<<\n *             print(\"Norm: %.2f, NNZs: %d, \"\n *             \"Bias: %.6f, T: %d, Avg. loss: %.6f\" % (w.norm(),\n */\n    __pyx_t_4 = (__pyx_v_verbose > 0);\n    if (__pyx_t_4) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":499\n *         if verbose > 0:\n *             print(\"Norm: %.2f, NNZs: %d, \"\n *             \"Bias: %.6f, T: %d, Avg. loss: %.6f\" % (w.norm(),             # <<<<<<<<<<<<<<\n *                                                     weights.nonzero()[0].shape[0],\n *                                                     intercept, count,\n */\n      __pyx_t_8 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->norm(__pyx_v_w)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_8);\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":500\n *             print(\"Norm: %.2f, NNZs: %d, \"\n *             \"Bias: %.6f, T: %d, Avg. loss: %.6f\" % (w.norm(),\n *                                                     weights.nonzero()[0].shape[0],             # <<<<<<<<<<<<<<\n *                                                     intercept, count,\n *                                                     sumloss / count))\n */\n      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_weights), __pyx_n_s__nonzero); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_6);\n      __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n      __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_6);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__shape); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n      __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_6);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":501\n *             \"Bias: %.6f, T: %d, Avg. loss: %.6f\" % (w.norm(),\n *                                                     weights.nonzero()[0].shape[0],\n *                                                     intercept, count,             # <<<<<<<<<<<<<<\n *                                                     sumloss / count))\n *             print(\"Total training time: %.2f seconds.\" % (time() - t_start))\n */\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_2 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":502\n *                                                     weights.nonzero()[0].shape[0],\n *                                                     intercept, count,\n *                                                     sumloss / count))             # <<<<<<<<<<<<<<\n *             print(\"Total training time: %.2f seconds.\" % (time() - t_start))\n * \n */\n      __pyx_t_7 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_7);\n      __pyx_t_15 = PyTuple_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_15);\n      PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_8);\n      __Pyx_GIVEREF(__pyx_t_8);\n      PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_6);\n      __Pyx_GIVEREF(__pyx_t_6);\n      PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_7);\n      __Pyx_GIVEREF(__pyx_t_7);\n      __pyx_t_8 = 0;\n      __pyx_t_6 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_2 = 0;\n      __pyx_t_7 = 0;\n      __pyx_t_7 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_7));\n      __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;\n      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_7)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":503\n *                                                     intercept, count,\n *                                                     sumloss / count))\n *             print(\"Total training time: %.2f seconds.\" % (time() - t_start))             # <<<<<<<<<<<<<<\n * \n *         # floating-point under-/overflow check.\n */\n      __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_7);\n      __pyx_t_15 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_15);\n      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n      __pyx_t_7 = PyNumber_Subtract(__pyx_t_15, __pyx_v_t_start); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_7);\n      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;\n      __pyx_t_15 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), __pyx_t_7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_15));\n      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_15)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;\n      goto __pyx_L17;\n    }\n    __pyx_L17:;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":506\n * \n *         # floating-point under-/overflow check.\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\             # <<<<<<<<<<<<<<\n *            or np.isnan(intercept) or np.isinf(intercept):\n *             raise ValueError(\"floating-point under-/overflow occured.\")\n */\n    __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_15);\n    __pyx_t_7 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__any); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_7);\n    __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;\n    __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_15);\n    __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__isinf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_2);\n    __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;\n    __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_15);\n    __Pyx_INCREF(((PyObject *)__pyx_v_weights));\n    PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_weights));\n    __Pyx_GIVEREF(((PyObject *)__pyx_v_weights));\n    __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n    __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;\n    __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_15);\n    PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_3);\n    __Pyx_GIVEREF(__pyx_t_3);\n    __pyx_t_3 = 0;\n    __pyx_t_3 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n    __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;\n    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    if (!__pyx_t_4) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":507\n *         # floating-point under-/overflow check.\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\\n *            or np.isnan(intercept) or np.isinf(intercept):             # <<<<<<<<<<<<<<\n *             raise ValueError(\"floating-point under-/overflow occured.\")\n * \n */\n      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_15 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__any); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_15);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":506\n * \n *         # floating-point under-/overflow check.\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\             # <<<<<<<<<<<<<<\n *            or np.isnan(intercept) or np.isinf(intercept):\n *             raise ValueError(\"floating-point under-/overflow occured.\")\n */\n      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_7 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__isnan); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_7);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_INCREF(((PyObject *)__pyx_v_weights));\n      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_weights));\n      __Pyx_GIVEREF(((PyObject *)__pyx_v_weights));\n      __pyx_t_2 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      __pyx_t_2 = 0;\n      __pyx_t_2 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;\n      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n      __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n      if (!__pyx_t_16) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":507\n *         # floating-point under-/overflow check.\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\\n *            or np.isnan(intercept) or np.isinf(intercept):             # <<<<<<<<<<<<<<\n *             raise ValueError(\"floating-point under-/overflow occured.\")\n * \n */\n        __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_2);\n        __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isnan); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_3);\n        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n        __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_2);\n        __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_15);\n        PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_2);\n        __Pyx_GIVEREF(__pyx_t_2);\n        __pyx_t_2 = 0;\n        __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_2);\n        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n        __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;\n        __pyx_t_17 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_17 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n        if (!__pyx_t_17) {\n          __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_GOTREF(__pyx_t_2);\n          __pyx_t_15 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isinf); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_GOTREF(__pyx_t_15);\n          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n          __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_GOTREF(__pyx_t_2);\n          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_GOTREF(__pyx_t_3);\n          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);\n          __Pyx_GIVEREF(__pyx_t_2);\n          __pyx_t_2 = 0;\n          __pyx_t_2 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_GOTREF(__pyx_t_2);\n          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;\n          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n          __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n          __pyx_t_19 = __pyx_t_18;\n        } else {\n          __pyx_t_19 = __pyx_t_17;\n        }\n        __pyx_t_17 = __pyx_t_19;\n      } else {\n        __pyx_t_17 = __pyx_t_16;\n      }\n      __pyx_t_16 = __pyx_t_17;\n    } else {\n      __pyx_t_16 = __pyx_t_4;\n    }\n    if (__pyx_t_16) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":508\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\\n *            or np.isnan(intercept) or np.isinf(intercept):\n *             raise ValueError(\"floating-point under-/overflow occured.\")             # <<<<<<<<<<<<<<\n * \n *     w.reset_wscale()\n */\n      __pyx_t_2 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __Pyx_Raise(__pyx_t_2, 0, 0, 0);\n      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L18;\n    }\n    __pyx_L18:;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":510\n *             raise ValueError(\"floating-point under-/overflow occured.\")\n * \n *     w.reset_wscale()             # <<<<<<<<<<<<<<\n * \n *     return weights, intercept\n */\n  ((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->reset_wscale(__pyx_v_w);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":512\n *     w.reset_wscale()\n * \n *     return weights, intercept             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_3);\n  __Pyx_INCREF(((PyObject *)__pyx_v_weights));\n  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_weights));\n  __Pyx_GIVEREF(((PyObject *)__pyx_v_weights));\n  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);\n  __Pyx_GIVEREF(__pyx_t_2);\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_3);\n  __pyx_t_3 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_6);\n  __Pyx_XDECREF(__pyx_t_7);\n  __Pyx_XDECREF(__pyx_t_8);\n  __Pyx_XDECREF(__pyx_t_15);\n  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);\n    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);\n    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_weights.rcbuffer->pybuffer);\n  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.plain_sgd\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  goto __pyx_L2;\n  __pyx_L0:;\n  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);\n  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_weights.rcbuffer->pybuffer);\n  __pyx_L2:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_w);\n  __Pyx_XDECREF((PyObject *)__pyx_v_q);\n  __Pyx_XDECREF(__pyx_v_t_start);\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":515\n * \n * \n * cdef inline double max(double a, double b):             # <<<<<<<<<<<<<<\n *     return a if a >= b else b\n * \n */\n\nstatic CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_max(double __pyx_v_a, double __pyx_v_b) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  double __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"max\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":516\n * \n * cdef inline double max(double a, double b):\n *     return a if a >= b else b             # <<<<<<<<<<<<<<\n * \n * \n */\n  if ((__pyx_v_a >= __pyx_v_b)) {\n    __pyx_t_1 = __pyx_v_a;\n  } else {\n    __pyx_t_1 = __pyx_v_b;\n  }\n  __pyx_r = __pyx_t_1;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":519\n * \n * \n * cdef inline double min(double a, double b):             # <<<<<<<<<<<<<<\n *     return a if a <= b else b\n * \n */\n\nstatic CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_min(double __pyx_v_a, double __pyx_v_b) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  double __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"min\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":520\n * \n * cdef inline double min(double a, double b):\n *     return a if a <= b else b             # <<<<<<<<<<<<<<\n * \n * cdef double sqnorm(DOUBLE * x_data_ptr, INTEGER * x_ind_ptr, int xnnz):\n */\n  if ((__pyx_v_a <= __pyx_v_b)) {\n    __pyx_t_1 = __pyx_v_a;\n  } else {\n    __pyx_t_1 = __pyx_v_b;\n  }\n  __pyx_r = __pyx_t_1;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":522\n *     return a if a <= b else b\n * \n * cdef double sqnorm(DOUBLE * x_data_ptr, INTEGER * x_ind_ptr, int xnnz):             # <<<<<<<<<<<<<<\n *     cdef double x_norm = 0.0\n *     cdef int j\n */\n\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_x_data_ptr, CYTHON_UNUSED __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *__pyx_v_x_ind_ptr, int __pyx_v_xnnz) {\n  double __pyx_v_x_norm;\n  int __pyx_v_j;\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  int __pyx_t_1;\n  int __pyx_t_2;\n  __Pyx_RefNannySetupContext(\"sqnorm\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":523\n * \n * cdef double sqnorm(DOUBLE * x_data_ptr, INTEGER * x_ind_ptr, int xnnz):\n *     cdef double x_norm = 0.0             # <<<<<<<<<<<<<<\n *     cdef int j\n *     cdef double z\n */\n  __pyx_v_x_norm = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":526\n *     cdef int j\n *     cdef double z\n *     for j in range(xnnz):             # <<<<<<<<<<<<<<\n *         z = x_data_ptr[j]\n *         x_norm += z * z\n */\n  __pyx_t_1 = __pyx_v_xnnz;\n  for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {\n    __pyx_v_j = __pyx_t_2;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":527\n *     cdef double z\n *     for j in range(xnnz):\n *         z = x_data_ptr[j]             # <<<<<<<<<<<<<<\n *         x_norm += z * z\n *     return x_norm\n */\n    __pyx_v_z = (__pyx_v_x_data_ptr[__pyx_v_j]);\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":528\n *     for j in range(xnnz):\n *         z = x_data_ptr[j]\n *         x_norm += z * z             # <<<<<<<<<<<<<<\n *     return x_norm\n * \n */\n    __pyx_v_x_norm = (__pyx_v_x_norm + (__pyx_v_z * __pyx_v_z));\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":529\n *         z = x_data_ptr[j]\n *         x_norm += z * z\n *     return x_norm             # <<<<<<<<<<<<<<\n * \n * cdef void l1penalty(WeightVector w, DOUBLE * q_data_ptr,\n */\n  __pyx_r = __pyx_v_x_norm;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":531\n *     return x_norm\n * \n * cdef void l1penalty(WeightVector w, DOUBLE * q_data_ptr,             # <<<<<<<<<<<<<<\n *                     INTEGER * x_ind_ptr, int xnnz, double u):\n *     \"\"\"Apply the L1 penalty to each updated feature\n */\n\nstatic void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *__pyx_v_w, __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_q_data_ptr, __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *__pyx_v_x_ind_ptr, int __pyx_v_xnnz, double __pyx_v_u) {\n  double __pyx_v_z;\n  int __pyx_v_j;\n  int __pyx_v_idx;\n  double __pyx_v_wscale;\n  double *__pyx_v_w_data_ptr;\n  __Pyx_RefNannyDeclarations\n  double __pyx_t_1;\n  __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *__pyx_t_2;\n  int __pyx_t_3;\n  int __pyx_t_4;\n  int __pyx_t_5;\n  int __pyx_t_6;\n  __Pyx_RefNannySetupContext(\"l1penalty\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":538\n *     [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].\n *     \"\"\"\n *     cdef double z = 0.0             # <<<<<<<<<<<<<<\n *     cdef int j = 0\n *     cdef int idx = 0\n */\n  __pyx_v_z = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":539\n *     \"\"\"\n *     cdef double z = 0.0\n *     cdef int j = 0             # <<<<<<<<<<<<<<\n *     cdef int idx = 0\n *     cdef double wscale = w.wscale\n */\n  __pyx_v_j = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":540\n *     cdef double z = 0.0\n *     cdef int j = 0\n *     cdef int idx = 0             # <<<<<<<<<<<<<<\n *     cdef double wscale = w.wscale\n *     cdef double * w_data_ptr = w.w_data_ptr\n */\n  __pyx_v_idx = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":541\n *     cdef int j = 0\n *     cdef int idx = 0\n *     cdef double wscale = w.wscale             # <<<<<<<<<<<<<<\n *     cdef double * w_data_ptr = w.w_data_ptr\n *     for j in range(xnnz):\n */\n  __pyx_t_1 = __pyx_v_w->wscale;\n  __pyx_v_wscale = __pyx_t_1;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":542\n *     cdef int idx = 0\n *     cdef double wscale = w.wscale\n *     cdef double * w_data_ptr = w.w_data_ptr             # <<<<<<<<<<<<<<\n *     for j in range(xnnz):\n *         idx = x_ind_ptr[j]\n */\n  __pyx_t_2 = __pyx_v_w->w_data_ptr;\n  __pyx_v_w_data_ptr = __pyx_t_2;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":543\n *     cdef double wscale = w.wscale\n *     cdef double * w_data_ptr = w.w_data_ptr\n *     for j in range(xnnz):             # <<<<<<<<<<<<<<\n *         idx = x_ind_ptr[j]\n *         z = w_data_ptr[idx]\n */\n  __pyx_t_3 = __pyx_v_xnnz;\n  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {\n    __pyx_v_j = __pyx_t_4;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":544\n *     cdef double * w_data_ptr = w.w_data_ptr\n *     for j in range(xnnz):\n *         idx = x_ind_ptr[j]             # <<<<<<<<<<<<<<\n *         z = w_data_ptr[idx]\n *         if (wscale * w_data_ptr[idx]) > 0.0:\n */\n    __pyx_v_idx = (__pyx_v_x_ind_ptr[__pyx_v_j]);\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":545\n *     for j in range(xnnz):\n *         idx = x_ind_ptr[j]\n *         z = w_data_ptr[idx]             # <<<<<<<<<<<<<<\n *         if (wscale * w_data_ptr[idx]) > 0.0:\n *             w_data_ptr[idx] = max(\n */\n    __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_idx]);\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":546\n *         idx = x_ind_ptr[j]\n *         z = w_data_ptr[idx]\n *         if (wscale * w_data_ptr[idx]) > 0.0:             # <<<<<<<<<<<<<<\n *             w_data_ptr[idx] = max(\n *                 0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale))\n */\n    __pyx_t_5 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0.0);\n    if (__pyx_t_5) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":547\n *         z = w_data_ptr[idx]\n *         if (wscale * w_data_ptr[idx]) > 0.0:\n *             w_data_ptr[idx] = max(             # <<<<<<<<<<<<<<\n *                 0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale))\n * \n */\n      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_7sklearn_12linear_model_8sgd_fast_max(0.0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));\n      goto __pyx_L5;\n    }\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":550\n *                 0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale))\n * \n *         elif (wscale * w_data_ptr[idx]) < 0.0:             # <<<<<<<<<<<<<<\n *             w_data_ptr[idx] = min(\n *                 0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale))\n */\n    __pyx_t_5 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0.0);\n    if (__pyx_t_5) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":551\n * \n *         elif (wscale * w_data_ptr[idx]) < 0.0:\n *             w_data_ptr[idx] = min(             # <<<<<<<<<<<<<<\n *                 0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale))\n * \n */\n      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_7sklearn_12linear_model_8sgd_fast_min(0.0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));\n      goto __pyx_L5;\n    }\n    __pyx_L5:;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":554\n *                 0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale))\n * \n *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))             # <<<<<<<<<<<<<<\n */\n    __pyx_t_6 = __pyx_v_idx;\n    (__pyx_v_q_data_ptr[__pyx_t_6]) = ((__pyx_v_q_data_ptr[__pyx_t_6]) + (__pyx_v_wscale * ((__pyx_v_w_data_ptr[__pyx_v_idx]) - __pyx_v_z)));\n  }\n\n  __Pyx_RefNannyFinishContext();\n}\n\n/* Python wrapper */\nstatic CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/\nstatic CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__getbuffer__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":194\n *         # experimental exception made for __getbuffer__ and __releasebuffer__\n *         # -- the details of this may change.\n *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<\n *             # This implementation of getbuffer is geared towards Cython\n *             # requirements, and does not yet fullfill the PEP.\n */\n\nstatic int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {\n  int __pyx_v_copy_shape;\n  int __pyx_v_i;\n  int __pyx_v_ndim;\n  int __pyx_v_endian_detector;\n  int __pyx_v_little_endian;\n  int __pyx_v_t;\n  char *__pyx_v_f;\n  PyArray_Descr *__pyx_v_descr = 0;\n  int __pyx_v_offset;\n  int __pyx_v_hasfields;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  int __pyx_t_1;\n  int __pyx_t_2;\n  int __pyx_t_3;\n  PyObject *__pyx_t_4 = NULL;\n  int __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_t_7;\n  PyObject *__pyx_t_8 = NULL;\n  char *__pyx_t_9;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__getbuffer__\", 0);\n  if (__pyx_v_info != NULL) {\n    __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);\n    __Pyx_GIVEREF(__pyx_v_info->obj);\n  }\n\n  /* \"numpy.pxd\":200\n *             # of flags\n * \n *             if info == NULL: return             # <<<<<<<<<<<<<<\n * \n *             cdef int copy_shape, i, ndim\n */\n  __pyx_t_1 = (__pyx_v_info == NULL);\n  if (__pyx_t_1) {\n    __pyx_r = 0;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"numpy.pxd\":203\n * \n *             cdef int copy_shape, i, ndim\n *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n * \n */\n  __pyx_v_endian_detector = 1;\n\n  /* \"numpy.pxd\":204\n *             cdef int copy_shape, i, ndim\n *             cdef int endian_detector = 1\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<\n * \n *             ndim = PyArray_NDIM(self)\n */\n  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);\n\n  /* \"numpy.pxd\":206\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n * \n *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n */\n  __pyx_v_ndim = PyArray_NDIM(__pyx_v_self);\n\n  /* \"numpy.pxd\":208\n *             ndim = PyArray_NDIM(self)\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<\n *                 copy_shape = 1\n *             else:\n */\n  __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":209\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 copy_shape = 1             # <<<<<<<<<<<<<<\n *             else:\n *                 copy_shape = 0\n */\n    __pyx_v_copy_shape = 1;\n    goto __pyx_L4;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":211\n *                 copy_shape = 1\n *             else:\n *                 copy_shape = 0             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n */\n    __pyx_v_copy_shape = 0;\n  }\n  __pyx_L4:;\n\n  /* \"numpy.pxd\":213\n *                 copy_shape = 0\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n */\n  __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":214\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n * \n */\n    __pyx_t_2 = (!PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS));\n    __pyx_t_3 = __pyx_t_2;\n  } else {\n    __pyx_t_3 = __pyx_t_1;\n  }\n  if (__pyx_t_3) {\n\n    /* \"numpy.pxd\":215\n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n */\n    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_7), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_4);\n    __Pyx_Raise(__pyx_t_4, 0, 0, 0);\n    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    goto __pyx_L5;\n  }\n  __pyx_L5:;\n\n  /* \"numpy.pxd\":217\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n */\n  __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);\n  if (__pyx_t_3) {\n\n    /* \"numpy.pxd\":218\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n * \n */\n    __pyx_t_1 = (!PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS));\n    __pyx_t_2 = __pyx_t_1;\n  } else {\n    __pyx_t_2 = __pyx_t_3;\n  }\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":219\n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")             # <<<<<<<<<<<<<<\n * \n *             info.buf = PyArray_DATA(self)\n */\n    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_4);\n    __Pyx_Raise(__pyx_t_4, 0, 0, 0);\n    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    goto __pyx_L6;\n  }\n  __pyx_L6:;\n\n  /* \"numpy.pxd\":221\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n * \n *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<\n *             info.ndim = ndim\n *             if copy_shape:\n */\n  __pyx_v_info->buf = PyArray_DATA(__pyx_v_self);\n\n  /* \"numpy.pxd\":222\n * \n *             info.buf = PyArray_DATA(self)\n *             info.ndim = ndim             # <<<<<<<<<<<<<<\n *             if copy_shape:\n *                 # Allocate new buffer for strides and shape info.\n */\n  __pyx_v_info->ndim = __pyx_v_ndim;\n\n  /* \"numpy.pxd\":223\n *             info.buf = PyArray_DATA(self)\n *             info.ndim = ndim\n *             if copy_shape:             # <<<<<<<<<<<<<<\n *                 # Allocate new buffer for strides and shape info.\n *                 # This is allocated as one block, strides first.\n */\n  if (__pyx_v_copy_shape) {\n\n    /* \"numpy.pxd\":226\n *                 # Allocate new buffer for strides and shape info.\n *                 # This is allocated as one block, strides first.\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)             # <<<<<<<<<<<<<<\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):\n */\n    __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2)));\n\n    /* \"numpy.pxd\":227\n *                 # This is allocated as one block, strides first.\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)\n *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n */\n    __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);\n\n    /* \"numpy.pxd\":228\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):             # <<<<<<<<<<<<<<\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n */\n    __pyx_t_5 = __pyx_v_ndim;\n    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {\n      __pyx_v_i = __pyx_t_6;\n\n      /* \"numpy.pxd\":229\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n *             else:\n */\n      (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]);\n\n      /* \"numpy.pxd\":230\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n */\n      (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]);\n    }\n    goto __pyx_L7;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":232\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)             # <<<<<<<<<<<<<<\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL\n */\n    __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self));\n\n    /* \"numpy.pxd\":233\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)             # <<<<<<<<<<<<<<\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)\n */\n    __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self));\n  }\n  __pyx_L7:;\n\n  /* \"numpy.pxd\":234\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL             # <<<<<<<<<<<<<<\n *             info.itemsize = PyArray_ITEMSIZE(self)\n *             info.readonly = not PyArray_ISWRITEABLE(self)\n */\n  __pyx_v_info->suboffsets = NULL;\n\n  /* \"numpy.pxd\":235\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<\n *             info.readonly = not PyArray_ISWRITEABLE(self)\n * \n */\n  __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self);\n\n  /* \"numpy.pxd\":236\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)\n *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<\n * \n *             cdef int t\n */\n  __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(__pyx_v_self));\n\n  /* \"numpy.pxd\":239\n * \n *             cdef int t\n *             cdef char* f = NULL             # <<<<<<<<<<<<<<\n *             cdef dtype descr = self.descr\n *             cdef list stack\n */\n  __pyx_v_f = NULL;\n\n  /* \"numpy.pxd\":240\n *             cdef int t\n *             cdef char* f = NULL\n *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<\n *             cdef list stack\n *             cdef int offset\n */\n  __pyx_t_4 = ((PyObject *)__pyx_v_self->descr);\n  __Pyx_INCREF(__pyx_t_4);\n  __pyx_v_descr = ((PyArray_Descr *)__pyx_t_4);\n  __pyx_t_4 = 0;\n\n  /* \"numpy.pxd\":244\n *             cdef int offset\n * \n *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<\n * \n *             if not hasfields and not copy_shape:\n */\n  __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);\n\n  /* \"numpy.pxd\":246\n *             cdef bint hasfields = PyDataType_HASFIELDS(descr)\n * \n *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<\n *                 # do not call releasebuffer\n *                 info.obj = None\n */\n  __pyx_t_2 = (!__pyx_v_hasfields);\n  if (__pyx_t_2) {\n    __pyx_t_3 = (!__pyx_v_copy_shape);\n    __pyx_t_1 = __pyx_t_3;\n  } else {\n    __pyx_t_1 = __pyx_t_2;\n  }\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":248\n *             if not hasfields and not copy_shape:\n *                 # do not call releasebuffer\n *                 info.obj = None             # <<<<<<<<<<<<<<\n *             else:\n *                 # need to call releasebuffer\n */\n    __Pyx_INCREF(Py_None);\n    __Pyx_GIVEREF(Py_None);\n    __Pyx_GOTREF(__pyx_v_info->obj);\n    __Pyx_DECREF(__pyx_v_info->obj);\n    __pyx_v_info->obj = Py_None;\n    goto __pyx_L10;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":251\n *             else:\n *                 # need to call releasebuffer\n *                 info.obj = self             # <<<<<<<<<<<<<<\n * \n *             if not hasfields:\n */\n    __Pyx_INCREF(((PyObject *)__pyx_v_self));\n    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));\n    __Pyx_GOTREF(__pyx_v_info->obj);\n    __Pyx_DECREF(__pyx_v_info->obj);\n    __pyx_v_info->obj = ((PyObject *)__pyx_v_self);\n  }\n  __pyx_L10:;\n\n  /* \"numpy.pxd\":253\n *                 info.obj = self\n * \n *             if not hasfields:             # <<<<<<<<<<<<<<\n *                 t = descr.type_num\n *                 if ((descr.byteorder == c'>' and little_endian) or\n */\n  __pyx_t_1 = (!__pyx_v_hasfields);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":254\n * \n *             if not hasfields:\n *                 t = descr.type_num             # <<<<<<<<<<<<<<\n *                 if ((descr.byteorder == c'>' and little_endian) or\n *                     (descr.byteorder == c'<' and not little_endian)):\n */\n    __pyx_t_5 = __pyx_v_descr->type_num;\n    __pyx_v_t = __pyx_t_5;\n\n    /* \"numpy.pxd\":255\n *             if not hasfields:\n *                 t = descr.type_num\n *                 if ((descr.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<\n *                     (descr.byteorder == c'<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")\n */\n    __pyx_t_1 = (__pyx_v_descr->byteorder == '>');\n    if (__pyx_t_1) {\n      __pyx_t_2 = __pyx_v_little_endian;\n    } else {\n      __pyx_t_2 = __pyx_t_1;\n    }\n    if (!__pyx_t_2) {\n\n      /* \"numpy.pxd\":256\n *                 t = descr.type_num\n *                 if ((descr.byteorder == c'>' and little_endian) or\n *                     (descr.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"\n */\n      __pyx_t_1 = (__pyx_v_descr->byteorder == '<');\n      if (__pyx_t_1) {\n        __pyx_t_3 = (!__pyx_v_little_endian);\n        __pyx_t_7 = __pyx_t_3;\n      } else {\n        __pyx_t_7 = __pyx_t_1;\n      }\n      __pyx_t_1 = __pyx_t_7;\n    } else {\n      __pyx_t_1 = __pyx_t_2;\n    }\n    if (__pyx_t_1) {\n\n      /* \"numpy.pxd\":257\n *                 if ((descr.byteorder == c'>' and little_endian) or\n *                     (descr.byteorder == c'<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n */\n      __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_11), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      __Pyx_Raise(__pyx_t_4, 0, 0, 0);\n      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L12;\n    }\n    __pyx_L12:;\n\n    /* \"numpy.pxd\":258\n *                     (descr.byteorder == c'<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_BYTE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__b;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":259\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_UBYTE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__B;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":260\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_SHORT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__h;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":261\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_USHORT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__H;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":262\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_INT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__i;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":263\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_UINT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__I;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":264\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_LONG);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__l;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":265\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_ULONG);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__L;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":266\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__q;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":267\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__Q;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":268\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_FLOAT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__f;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":269\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__d;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":270\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__g;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":271\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__Zf;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":272\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n *                 elif t == NPY_OBJECT:      f = \"O\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__Zd;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":273\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_OBJECT:      f = \"O\"\n *                 else:\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__Zg;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":274\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n *                 elif t == NPY_OBJECT:      f = \"O\"             # <<<<<<<<<<<<<<\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_OBJECT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__O;\n      goto __pyx_L13;\n    }\n    /*else*/ {\n\n      /* \"numpy.pxd\":276\n *                 elif t == NPY_OBJECT:      f = \"O\"\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)             # <<<<<<<<<<<<<<\n *                 info.format = f\n *                 return\n */\n      __pyx_t_4 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_12), __pyx_t_4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_8));\n      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_8));\n      __Pyx_GIVEREF(((PyObject *)__pyx_t_8));\n      __pyx_t_8 = 0;\n      __pyx_t_8 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_8);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __Pyx_Raise(__pyx_t_8, 0, 0, 0);\n      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    }\n    __pyx_L13:;\n\n    /* \"numpy.pxd\":277\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *                 info.format = f             # <<<<<<<<<<<<<<\n *                 return\n *             else:\n */\n    __pyx_v_info->format = __pyx_v_f;\n\n    /* \"numpy.pxd\":278\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *                 info.format = f\n *                 return             # <<<<<<<<<<<<<<\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n */\n    __pyx_r = 0;\n    goto __pyx_L0;\n    goto __pyx_L11;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":280\n *                 return\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<\n *                 info.format[0] = c'^' # Native data types, manual alignment\n *                 offset = 0\n */\n    __pyx_v_info->format = ((char *)malloc(255));\n\n    /* \"numpy.pxd\":281\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n *                 info.format[0] = c'^' # Native data types, manual alignment             # <<<<<<<<<<<<<<\n *                 offset = 0\n *                 f = _util_dtypestring(descr, info.format + 1,\n */\n    (__pyx_v_info->format[0]) = '^';\n\n    /* \"numpy.pxd\":282\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n *                 info.format[0] = c'^' # Native data types, manual alignment\n *                 offset = 0             # <<<<<<<<<<<<<<\n *                 f = _util_dtypestring(descr, info.format + 1,\n *                                       info.format + _buffer_format_string_len,\n */\n    __pyx_v_offset = 0;\n\n    /* \"numpy.pxd\":285\n *                 f = _util_dtypestring(descr, info.format + 1,\n *                                       info.format + _buffer_format_string_len,\n *                                       &offset)             # <<<<<<<<<<<<<<\n *                 f[0] = c'\\0' # Terminate format string\n * \n */\n    __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __pyx_v_f = __pyx_t_9;\n\n    /* \"numpy.pxd\":286\n *                                       info.format + _buffer_format_string_len,\n *                                       &offset)\n *                 f[0] = c'\\0' # Terminate format string             # <<<<<<<<<<<<<<\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n */\n    (__pyx_v_f[0]) = '\\x00';\n  }\n  __pyx_L11:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_XDECREF(__pyx_t_8);\n  __Pyx_AddTraceback(\"numpy.ndarray.__getbuffer__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = -1;\n  if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) {\n    __Pyx_GOTREF(__pyx_v_info->obj);\n    __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;\n  }\n  goto __pyx_L2;\n  __pyx_L0:;\n  if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) {\n    __Pyx_GOTREF(Py_None);\n    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;\n  }\n  __pyx_L2:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_descr);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/\nstatic CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__releasebuffer__ (wrapper)\", 0);\n  __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info));\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"numpy.pxd\":288\n *                 f[0] = c'\\0' # Terminate format string\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)\n */\n\nstatic void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) {\n  __Pyx_RefNannyDeclarations\n  int __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"__releasebuffer__\", 0);\n\n  /* \"numpy.pxd\":289\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n */\n  __pyx_t_1 = PyArray_HASFIELDS(__pyx_v_self);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":290\n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 stdlib.free(info.strides)\n */\n    free(__pyx_v_info->format);\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"numpy.pxd\":291\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<\n *                 stdlib.free(info.strides)\n *                 # info.shape was stored after info.strides in the same block\n */\n  __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":292\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<\n *                 # info.shape was stored after info.strides in the same block\n * \n */\n    free(__pyx_v_info->strides);\n    goto __pyx_L4;\n  }\n  __pyx_L4:;\n\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"numpy.pxd\":768\n * ctypedef npy_cdouble     complex_t\n * \n * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(1, <void*>a)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew1\", 0);\n\n  /* \"numpy.pxd\":769\n * \n * cdef inline object PyArray_MultiIterNew1(a):\n *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew1\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":771\n *     return PyArray_MultiIterNew(1, <void*>a)\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew2\", 0);\n\n  /* \"numpy.pxd\":772\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew2\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":774\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew3\", 0);\n\n  /* \"numpy.pxd\":775\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew3\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":777\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew4\", 0);\n\n  /* \"numpy.pxd\":778\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew4\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":780\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew5\", 0);\n\n  /* \"numpy.pxd\":781\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<\n * \n * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew5\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":783\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)\n * \n * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<\n *     # Recursive utility function used in __getbuffer__ to get format\n *     # string. The new location in the format string is returned.\n */\n\nstatic CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {\n  PyArray_Descr *__pyx_v_child = 0;\n  int __pyx_v_endian_detector;\n  int __pyx_v_little_endian;\n  PyObject *__pyx_v_fields = 0;\n  PyObject *__pyx_v_childname = NULL;\n  PyObject *__pyx_v_new_offset = NULL;\n  PyObject *__pyx_v_t = NULL;\n  char *__pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  Py_ssize_t __pyx_t_2;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  PyObject *__pyx_t_5 = NULL;\n  PyObject *(*__pyx_t_6)(PyObject *);\n  int __pyx_t_7;\n  int __pyx_t_8;\n  int __pyx_t_9;\n  int __pyx_t_10;\n  long __pyx_t_11;\n  char *__pyx_t_12;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"_util_dtypestring\", 0);\n\n  /* \"numpy.pxd\":790\n *     cdef int delta_offset\n *     cdef tuple i\n *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<\n *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n *     cdef tuple fields\n */\n  __pyx_v_endian_detector = 1;\n\n  /* \"numpy.pxd\":791\n *     cdef tuple i\n *     cdef int endian_detector = 1\n *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<\n *     cdef tuple fields\n * \n */\n  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);\n\n  /* \"numpy.pxd\":794\n *     cdef tuple fields\n * \n *     for childname in descr.names:             # <<<<<<<<<<<<<<\n *         fields = descr.fields[childname]\n *         child, new_offset = fields\n */\n  if (unlikely(((PyObject *)__pyx_v_descr->names) == Py_None)) {\n    PyErr_SetString(PyExc_TypeError, \"'NoneType' object is not iterable\");\n    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  }\n  __pyx_t_1 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;\n  for (;;) {\n    if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;\n    #if CYTHON_COMPILING_IN_CPYTHON\n    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    #else\n    __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    #endif\n    __Pyx_XDECREF(__pyx_v_childname);\n    __pyx_v_childname = __pyx_t_3;\n    __pyx_t_3 = 0;\n\n    /* \"numpy.pxd\":795\n * \n *     for childname in descr.names:\n *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<\n *         child, new_offset = fields\n * \n */\n    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, \"Expected tuple, got %.200s\", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_XDECREF(((PyObject *)__pyx_v_fields));\n    __pyx_v_fields = ((PyObject*)__pyx_t_3);\n    __pyx_t_3 = 0;\n\n    /* \"numpy.pxd\":796\n *     for childname in descr.names:\n *         fields = descr.fields[childname]\n *         child, new_offset = fields             # <<<<<<<<<<<<<<\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n */\n    if (likely(PyTuple_CheckExact(((PyObject *)__pyx_v_fields)))) {\n      PyObject* sequence = ((PyObject *)__pyx_v_fields);\n      #if CYTHON_COMPILING_IN_CPYTHON\n      Py_ssize_t size = Py_SIZE(sequence);\n      #else\n      Py_ssize_t size = PySequence_Size(sequence);\n      #endif\n      if (unlikely(size != 2)) {\n        if (size > 2) __Pyx_RaiseTooManyValuesError(2);\n        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);\n        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      }\n      #if CYTHON_COMPILING_IN_CPYTHON\n      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); \n      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); \n      __Pyx_INCREF(__pyx_t_3);\n      __Pyx_INCREF(__pyx_t_4);\n      #else\n      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      #endif\n    } else if (1) {\n      __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    } else\n    {\n      Py_ssize_t index = -1;\n      __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_fields)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_6 = Py_TYPE(__pyx_t_5)->tp_iternext;\n      index = 0; __pyx_t_3 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;\n      __Pyx_GOTREF(__pyx_t_3);\n      index = 1; __pyx_t_4 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_4)) goto __pyx_L5_unpacking_failed;\n      __Pyx_GOTREF(__pyx_t_4);\n      if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 2) < 0) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_t_6 = NULL;\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      goto __pyx_L6_unpacking_done;\n      __pyx_L5_unpacking_failed:;\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = NULL;\n      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_L6_unpacking_done:;\n    }\n    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_XDECREF(((PyObject *)__pyx_v_child));\n    __pyx_v_child = ((PyArray_Descr *)__pyx_t_3);\n    __pyx_t_3 = 0;\n    __Pyx_XDECREF(__pyx_v_new_offset);\n    __pyx_v_new_offset = __pyx_t_4;\n    __pyx_t_4 = 0;\n\n    /* \"numpy.pxd\":798\n *         child, new_offset = fields\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")\n * \n */\n    __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_4);\n    __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_5);\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n    __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n    if (__pyx_t_7) {\n\n      /* \"numpy.pxd\":799\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")             # <<<<<<<<<<<<<<\n * \n *         if ((child.byteorder == c'>' and little_endian) or\n */\n      __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_14), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_Raise(__pyx_t_5, 0, 0, 0);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L7;\n    }\n    __pyx_L7:;\n\n    /* \"numpy.pxd\":801\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")\n * \n *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<\n *             (child.byteorder == c'<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")\n */\n    __pyx_t_7 = (__pyx_v_child->byteorder == '>');\n    if (__pyx_t_7) {\n      __pyx_t_8 = __pyx_v_little_endian;\n    } else {\n      __pyx_t_8 = __pyx_t_7;\n    }\n    if (!__pyx_t_8) {\n\n      /* \"numpy.pxd\":802\n * \n *         if ((child.byteorder == c'>' and little_endian) or\n *             (child.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<\n *             raise ValueError(u\"Non-native byte order not supported\")\n *             # One could encode it in the format string and have Cython\n */\n      __pyx_t_7 = (__pyx_v_child->byteorder == '<');\n      if (__pyx_t_7) {\n        __pyx_t_9 = (!__pyx_v_little_endian);\n        __pyx_t_10 = __pyx_t_9;\n      } else {\n        __pyx_t_10 = __pyx_t_7;\n      }\n      __pyx_t_7 = __pyx_t_10;\n    } else {\n      __pyx_t_7 = __pyx_t_8;\n    }\n    if (__pyx_t_7) {\n\n      /* \"numpy.pxd\":803\n *         if ((child.byteorder == c'>' and little_endian) or\n *             (child.byteorder == c'<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *             # One could encode it in the format string and have Cython\n *             # complain instead, BUT: < and > in format strings also imply\n */\n      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_Raise(__pyx_t_5, 0, 0, 0);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L8;\n    }\n    __pyx_L8:;\n\n    /* \"numpy.pxd\":813\n * \n *         # Output padding bytes\n *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1\n */\n    while (1) {\n      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (!__pyx_t_7) break;\n\n      /* \"numpy.pxd\":814\n *         # Output padding bytes\n *         while offset[0] < new_offset:\n *             f[0] = 120 # \"x\"; pad byte             # <<<<<<<<<<<<<<\n *             f += 1\n *             offset[0] += 1\n */\n      (__pyx_v_f[0]) = 120;\n\n      /* \"numpy.pxd\":815\n *         while offset[0] < new_offset:\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1             # <<<<<<<<<<<<<<\n *             offset[0] += 1\n * \n */\n      __pyx_v_f = (__pyx_v_f + 1);\n\n      /* \"numpy.pxd\":816\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1\n *             offset[0] += 1             # <<<<<<<<<<<<<<\n * \n *         offset[0] += child.itemsize\n */\n      __pyx_t_11 = 0;\n      (__pyx_v_offset[__pyx_t_11]) = ((__pyx_v_offset[__pyx_t_11]) + 1);\n    }\n\n    /* \"numpy.pxd\":818\n *             offset[0] += 1\n * \n *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<\n * \n *         if not PyDataType_HASFIELDS(child):\n */\n    __pyx_t_11 = 0;\n    (__pyx_v_offset[__pyx_t_11]) = ((__pyx_v_offset[__pyx_t_11]) + __pyx_v_child->elsize);\n\n    /* \"numpy.pxd\":820\n *         offset[0] += child.itemsize\n * \n *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<\n *             t = child.type_num\n *             if end - f < 5:\n */\n    __pyx_t_7 = (!PyDataType_HASFIELDS(__pyx_v_child));\n    if (__pyx_t_7) {\n\n      /* \"numpy.pxd\":821\n * \n *         if not PyDataType_HASFIELDS(child):\n *             t = child.type_num             # <<<<<<<<<<<<<<\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")\n */\n      __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_XDECREF(__pyx_v_t);\n      __pyx_v_t = __pyx_t_3;\n      __pyx_t_3 = 0;\n\n      /* \"numpy.pxd\":822\n *         if not PyDataType_HASFIELDS(child):\n *             t = child.type_num\n *             if end - f < 5:             # <<<<<<<<<<<<<<\n *                 raise RuntimeError(u\"Format string allocated too short.\")\n * \n */\n      __pyx_t_7 = ((__pyx_v_end - __pyx_v_f) < 5);\n      if (__pyx_t_7) {\n\n        /* \"numpy.pxd\":823\n *             t = child.type_num\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")             # <<<<<<<<<<<<<<\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n */\n        __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_17), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_3);\n        __Pyx_Raise(__pyx_t_3, 0, 0, 0);\n        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        goto __pyx_L12;\n      }\n      __pyx_L12:;\n\n      /* \"numpy.pxd\":826\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 98;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":827\n *             # Until ticket #99 is fixed, use integers to avoid warnings\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 66;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":828\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 104;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":829\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 72;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":830\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 105;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":831\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 73;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":832\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 108;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":833\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 76;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":834\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 113;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":835\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 81;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":836\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 102;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":837\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 100;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":838\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 103;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":839\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 102;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":840\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 100;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":841\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n *             else:\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 103;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":842\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"             # <<<<<<<<<<<<<<\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 79;\n        goto __pyx_L13;\n      }\n      /*else*/ {\n\n        /* \"numpy.pxd\":844\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)             # <<<<<<<<<<<<<<\n *             f += 1\n *         else:\n */\n        __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_12), __pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(((PyObject *)__pyx_t_5));\n        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_3);\n        PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5));\n        __Pyx_GIVEREF(((PyObject *)__pyx_t_5));\n        __pyx_t_5 = 0;\n        __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_5);\n        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n        __Pyx_Raise(__pyx_t_5, 0, 0, 0);\n        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      }\n      __pyx_L13:;\n\n      /* \"numpy.pxd\":845\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *             f += 1             # <<<<<<<<<<<<<<\n *         else:\n *             # Cython ignores struct boundary information (\"T{...}\"),\n */\n      __pyx_v_f = (__pyx_v_f + 1);\n      goto __pyx_L11;\n    }\n    /*else*/ {\n\n      /* \"numpy.pxd\":849\n *             # Cython ignores struct boundary information (\"T{...}\"),\n *             # so don't output it\n *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<\n *     return f\n * \n */\n      __pyx_t_12 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_12 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_v_f = __pyx_t_12;\n    }\n    __pyx_L11:;\n  }\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"numpy.pxd\":850\n *             # so don't output it\n *             f = _util_dtypestring(child, f, end, offset)\n *     return f             # <<<<<<<<<<<<<<\n * \n * \n */\n  __pyx_r = __pyx_v_f;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_XDECREF(__pyx_t_5);\n  __Pyx_AddTraceback(\"numpy._util_dtypestring\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_child);\n  __Pyx_XDECREF(__pyx_v_fields);\n  __Pyx_XDECREF(__pyx_v_childname);\n  __Pyx_XDECREF(__pyx_v_new_offset);\n  __Pyx_XDECREF(__pyx_v_t);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":965\n * \n * \n * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<\n *      cdef PyObject* baseptr\n *      if base is None:\n */\n\nstatic CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {\n  PyObject *__pyx_v_baseptr;\n  __Pyx_RefNannyDeclarations\n  int __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"set_array_base\", 0);\n\n  /* \"numpy.pxd\":967\n * cdef inline void set_array_base(ndarray arr, object base):\n *      cdef PyObject* baseptr\n *      if base is None:             # <<<<<<<<<<<<<<\n *          baseptr = NULL\n *      else:\n */\n  __pyx_t_1 = (__pyx_v_base == Py_None);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":968\n *      cdef PyObject* baseptr\n *      if base is None:\n *          baseptr = NULL             # <<<<<<<<<<<<<<\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!\n */\n    __pyx_v_baseptr = NULL;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":970\n *          baseptr = NULL\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)\n */\n    Py_INCREF(__pyx_v_base);\n\n    /* \"numpy.pxd\":971\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!\n *          baseptr = <PyObject*>base             # <<<<<<<<<<<<<<\n *      Py_XDECREF(arr.base)\n *      arr.base = baseptr\n */\n    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);\n  }\n  __pyx_L3:;\n\n  /* \"numpy.pxd\":972\n *          Py_INCREF(base) # important to do this before decref below!\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<\n *      arr.base = baseptr\n * \n */\n  Py_XDECREF(__pyx_v_arr->base);\n\n  /* \"numpy.pxd\":973\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)\n *      arr.base = baseptr             # <<<<<<<<<<<<<<\n * \n * cdef inline object get_array_base(ndarray arr):\n */\n  __pyx_v_arr->base = __pyx_v_baseptr;\n\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"numpy.pxd\":975\n *      arr.base = baseptr\n * \n * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<\n *     if arr.base is NULL:\n *         return None\n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  int __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"get_array_base\", 0);\n\n  /* \"numpy.pxd\":976\n * \n * cdef inline object get_array_base(ndarray arr):\n *     if arr.base is NULL:             # <<<<<<<<<<<<<<\n *         return None\n *     else:\n */\n  __pyx_t_1 = (__pyx_v_arr->base == NULL);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":977\n * cdef inline object get_array_base(ndarray arr):\n *     if arr.base is NULL:\n *         return None             # <<<<<<<<<<<<<<\n *     else:\n *         return <object>arr.base\n */\n    __Pyx_XDECREF(__pyx_r);\n    __Pyx_INCREF(Py_None);\n    __pyx_r = Py_None;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":979\n *         return None\n *     else:\n *         return <object>arr.base             # <<<<<<<<<<<<<<\n */\n    __Pyx_XDECREF(__pyx_r);\n    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));\n    __pyx_r = ((PyObject *)__pyx_v_arr->base);\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *p;\n  PyObject *o = (*t->tp_alloc)(t, 0);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)o);\n  p->__pyx_vtab = __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  return o;\n}\n\nstatic void __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction(PyObject *o) {\n  (*Py_TYPE(o)->tp_free)(o);\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_LossFunction[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_LossFunction = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_LossFunction = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_LossFunction = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_LossFunction = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.LossFunction\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_LossFunction, /*tp_as_number*/\n  &__pyx_tp_as_sequence_LossFunction, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_LossFunction, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_LossFunction, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Base class for convex loss functions\"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Regression(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *)o);\n  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Regression[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_Regression = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_Regression = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_Regression = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_Regression = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Regression = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.Regression\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_Regression, /*tp_as_number*/\n  &__pyx_tp_as_sequence_Regression, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_Regression, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_Regression, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Base class for loss functions for regression\"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_Regression, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Regression, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Classification(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *)o);\n  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Classification[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_Classification = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_Classification = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_Classification = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_Classification = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Classification = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.Classification\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_Classification, /*tp_as_number*/\n  &__pyx_tp_as_sequence_Classification, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_Classification, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_Classification, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Base class for loss functions for classification\"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_Classification, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Classification, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_ModifiedHuber(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_ModifiedHuber[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_5__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_ModifiedHuber = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_ModifiedHuber = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_ModifiedHuber = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_ModifiedHuber = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.ModifiedHuber\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_ModifiedHuber, /*tp_as_number*/\n  &__pyx_tp_as_sequence_ModifiedHuber, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_ModifiedHuber, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_ModifiedHuber, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Modified Huber loss for binary classification with y in {-1, 1}\\n\\n    This is equivalent to quadratically smoothed SVM with gamma = 2.\\n\\n    See T. Zhang 'Solving Large Scale Linear Prediction Problems Using\\n    Stochastic Gradient Descent', ICML'04.\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_ModifiedHuber, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_ModifiedHuber, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Hinge(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Hinge[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_Hinge = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_Hinge = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_Hinge = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_Hinge = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.Hinge\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_Hinge, /*tp_as_number*/\n  &__pyx_tp_as_sequence_Hinge, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_Hinge, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_Hinge, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Hinge loss for binary classification tasks with y in {-1,1}\\n\\n    Parameters\\n    ----------\\n\\n    threshold : float > 0.0\\n        Margin threshold. When threshold=1.0, one gets the loss used by SVM.\\n        When threshold=0.0, one gets the loss used by the Perceptron.\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_Hinge, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_1__init__, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Hinge, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredHinge(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)o);\n  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredHinge[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_SquaredHinge = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_SquaredHinge = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_SquaredHinge = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_SquaredHinge = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.SquaredHinge\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_SquaredHinge, /*tp_as_number*/\n  &__pyx_tp_as_sequence_SquaredHinge, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_SquaredHinge, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_SquaredHinge, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Squared Hinge loss for binary classification tasks with y in {-1,1}\\n\\n    Parameters\\n    ----------\\n\\n    threshold : float > 0.0\\n        Margin threshold. When threshold=1.0, one gets the loss used by\\n        (quadratically penalized) SVM.\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredHinge, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  __pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_1__init__, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredHinge, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Log(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Log[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_5__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_Log = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_Log = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_Log = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_Log = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Log = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.Log\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_Log, /*tp_as_number*/\n  &__pyx_tp_as_sequence_Log, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_Log, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_Log, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Logistic regression loss for binary classification with y in {-1, 1}\"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_Log, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Log, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredLoss(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredLoss[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_5__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_SquaredLoss = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_SquaredLoss = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_SquaredLoss = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_SquaredLoss = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.SquaredLoss\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_SquaredLoss, /*tp_as_number*/\n  &__pyx_tp_as_sequence_SquaredLoss, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_SquaredLoss, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_SquaredLoss, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Squared loss traditional used in linear regression.\"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredLoss, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredLoss, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Huber(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Huber[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_Huber = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_Huber = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_Huber = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_Huber = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Huber = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.Huber\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_Huber, /*tp_as_number*/\n  &__pyx_tp_as_sequence_Huber, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_Huber, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_Huber, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Huber regression loss\\n\\n    Variant of the SquaredLoss that is robust to outliers (quadratic near zero,\\n    linear in for large errors).\\n\\n    http://en.wikipedia.org/wiki/Huber_Loss_Function\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_Huber, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_1__init__, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Huber, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_EpsilonInsensitive = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_EpsilonInsensitive = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_EpsilonInsensitive = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_EpsilonInsensitive = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_EpsilonInsensitive, /*tp_as_number*/\n  &__pyx_tp_as_sequence_EpsilonInsensitive, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_EpsilonInsensitive, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_EpsilonInsensitive, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Epsilon-Insensitive loss (used by SVR).\\n\\n    loss = max(0, |y - p| - epsilon)\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  __pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_1__init__, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_SquaredEpsilonInsensitive = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_SquaredEpsilonInsensitive = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_SquaredEpsilonInsensitive = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_SquaredEpsilonInsensitive = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_SquaredEpsilonInsensitive, /*tp_as_number*/\n  &__pyx_tp_as_sequence_SquaredEpsilonInsensitive, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_SquaredEpsilonInsensitive, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_SquaredEpsilonInsensitive, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Epsilon-Insensitive loss.\\n\\n    loss = max(0, |y - p| - epsilon)^2\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  __pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_1__init__, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\n\nstatic PyMethodDef __pyx_methods[] = {\n  {0, 0, 0, 0}\n};\n\n#if PY_MAJOR_VERSION >= 3\nstatic struct PyModuleDef __pyx_moduledef = {\n    PyModuleDef_HEAD_INIT,\n    __Pyx_NAMESTR(\"sgd_fast\"),\n    0, /* m_doc */\n    -1, /* m_size */\n    __pyx_methods /* m_methods */,\n    NULL, /* m_reload */\n    NULL, /* m_traverse */\n    NULL, /* m_clear */\n    NULL /* m_free */\n};\n#endif\n\nstatic __Pyx_StringTabEntry __pyx_string_tab[] = {\n  {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},\n  {&__pyx_kp_u_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 1, 0, 0},\n  {&__pyx_kp_u_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 1, 0, 0},\n  {&__pyx_kp_u_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 1, 0, 0},\n  {&__pyx_kp_u_16, __pyx_k_16, sizeof(__pyx_k_16), 0, 1, 0, 0},\n  {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},\n  {&__pyx_kp_s_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 0, 1, 0},\n  {&__pyx_n_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 1},\n  {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0},\n  {&__pyx_kp_s_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 0, 1, 0},\n  {&__pyx_kp_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 0},\n  {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0},\n  {&__pyx_n_s__C, __pyx_k__C, sizeof(__pyx_k__C), 0, 0, 1, 1},\n  {&__pyx_n_s__NotImplementedError, __pyx_k__NotImplementedError, sizeof(__pyx_k__NotImplementedError), 0, 0, 1, 1},\n  {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1},\n  {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1},\n  {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},\n  {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},\n  {&__pyx_n_s__alpha, __pyx_k__alpha, sizeof(__pyx_k__alpha), 0, 0, 1, 1},\n  {&__pyx_n_s__any, __pyx_k__any, sizeof(__pyx_k__any), 0, 0, 1, 1},\n  {&__pyx_n_s__c, __pyx_k__c, sizeof(__pyx_k__c), 0, 0, 1, 1},\n  {&__pyx_n_s__class_weight, __pyx_k__class_weight, sizeof(__pyx_k__class_weight), 0, 0, 1, 1},\n  {&__pyx_n_s__count, __pyx_k__count, sizeof(__pyx_k__count), 0, 0, 1, 1},\n  {&__pyx_n_s__dataset, __pyx_k__dataset, sizeof(__pyx_k__dataset), 0, 0, 1, 1},\n  {&__pyx_n_s__dloss, __pyx_k__dloss, sizeof(__pyx_k__dloss), 0, 0, 1, 1},\n  {&__pyx_n_s__dtype, __pyx_k__dtype, sizeof(__pyx_k__dtype), 0, 0, 1, 1},\n  {&__pyx_n_s__epoch, __pyx_k__epoch, sizeof(__pyx_k__epoch), 0, 0, 1, 1},\n  {&__pyx_n_s__epsilon, __pyx_k__epsilon, sizeof(__pyx_k__epsilon), 0, 0, 1, 1},\n  {&__pyx_n_s__eta, __pyx_k__eta, sizeof(__pyx_k__eta), 0, 0, 1, 1},\n  {&__pyx_n_s__eta0, __pyx_k__eta0, sizeof(__pyx_k__eta0), 0, 0, 1, 1},\n  {&__pyx_n_s__fit_intercept, __pyx_k__fit_intercept, sizeof(__pyx_k__fit_intercept), 0, 0, 1, 1},\n  {&__pyx_n_s__float64, __pyx_k__float64, sizeof(__pyx_k__float64), 0, 0, 1, 1},\n  {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1},\n  {&__pyx_n_s__intercept, __pyx_k__intercept, sizeof(__pyx_k__intercept), 0, 0, 1, 1},\n  {&__pyx_n_s__intercept_decay, __pyx_k__intercept_decay, sizeof(__pyx_k__intercept_decay), 0, 0, 1, 1},\n  {&__pyx_n_s__is_hinge, __pyx_k__is_hinge, sizeof(__pyx_k__is_hinge), 0, 0, 1, 1},\n  {&__pyx_n_s__isinf, __pyx_k__isinf, sizeof(__pyx_k__isinf), 0, 0, 1, 1},\n  {&__pyx_n_s__isnan, __pyx_k__isnan, sizeof(__pyx_k__isnan), 0, 0, 1, 1},\n  {&__pyx_n_s__learning_rate, __pyx_k__learning_rate, sizeof(__pyx_k__learning_rate), 0, 0, 1, 1},\n  {&__pyx_n_s__loss, __pyx_k__loss, sizeof(__pyx_k__loss), 0, 0, 1, 1},\n  {&__pyx_n_s__n_features, __pyx_k__n_features, sizeof(__pyx_k__n_features), 0, 0, 1, 1},\n  {&__pyx_n_s__n_iter, __pyx_k__n_iter, sizeof(__pyx_k__n_iter), 0, 0, 1, 1},\n  {&__pyx_n_s__n_samples, __pyx_k__n_samples, sizeof(__pyx_k__n_samples), 0, 0, 1, 1},\n  {&__pyx_n_s__nonzero, __pyx_k__nonzero, sizeof(__pyx_k__nonzero), 0, 0, 1, 1},\n  {&__pyx_n_s__np, __pyx_k__np, sizeof(__pyx_k__np), 0, 0, 1, 1},\n  {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1},\n  {&__pyx_n_s__order, __pyx_k__order, sizeof(__pyx_k__order), 0, 0, 1, 1},\n  {&__pyx_n_s__p, __pyx_k__p, sizeof(__pyx_k__p), 0, 0, 1, 1},\n  {&__pyx_n_s__penalty_type, __pyx_k__penalty_type, sizeof(__pyx_k__penalty_type), 0, 0, 1, 1},\n  {&__pyx_n_s__plain_sgd, __pyx_k__plain_sgd, sizeof(__pyx_k__plain_sgd), 0, 0, 1, 1},\n  {&__pyx_n_s__power_t, __pyx_k__power_t, sizeof(__pyx_k__power_t), 0, 0, 1, 1},\n  {&__pyx_n_s__q, __pyx_k__q, sizeof(__pyx_k__q), 0, 0, 1, 1},\n  {&__pyx_n_s__q_data_ptr, __pyx_k__q_data_ptr, sizeof(__pyx_k__q_data_ptr), 0, 0, 1, 1},\n  {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1},\n  {&__pyx_n_s__rho, __pyx_k__rho, sizeof(__pyx_k__rho), 0, 0, 1, 1},\n  {&__pyx_n_s__sample_weight, __pyx_k__sample_weight, sizeof(__pyx_k__sample_weight), 0, 0, 1, 1},\n  {&__pyx_n_s__seed, __pyx_k__seed, sizeof(__pyx_k__seed), 0, 0, 1, 1},\n  {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1},\n  {&__pyx_n_s__shuffle, __pyx_k__shuffle, sizeof(__pyx_k__shuffle), 0, 0, 1, 1},\n  {&__pyx_n_s__sumloss, __pyx_k__sumloss, sizeof(__pyx_k__sumloss), 0, 0, 1, 1},\n  {&__pyx_n_s__sys, __pyx_k__sys, sizeof(__pyx_k__sys), 0, 0, 1, 1},\n  {&__pyx_n_s__t, __pyx_k__t, sizeof(__pyx_k__t), 0, 0, 1, 1},\n  {&__pyx_n_s__t_start, __pyx_k__t_start, sizeof(__pyx_k__t_start), 0, 0, 1, 1},\n  {&__pyx_n_s__threshold, __pyx_k__threshold, sizeof(__pyx_k__threshold), 0, 0, 1, 1},\n  {&__pyx_n_s__time, __pyx_k__time, sizeof(__pyx_k__time), 0, 0, 1, 1},\n  {&__pyx_n_s__u, __pyx_k__u, sizeof(__pyx_k__u), 0, 0, 1, 1},\n  {&__pyx_n_s__update, __pyx_k__update, sizeof(__pyx_k__update), 0, 0, 1, 1},\n  {&__pyx_n_s__verbose, __pyx_k__verbose, sizeof(__pyx_k__verbose), 0, 0, 1, 1},\n  {&__pyx_n_s__w, __pyx_k__w, sizeof(__pyx_k__w), 0, 0, 1, 1},\n  {&__pyx_n_s__weight_neg, __pyx_k__weight_neg, sizeof(__pyx_k__weight_neg), 0, 0, 1, 1},\n  {&__pyx_n_s__weight_pos, __pyx_k__weight_pos, sizeof(__pyx_k__weight_pos), 0, 0, 1, 1},\n  {&__pyx_n_s__weights, __pyx_k__weights, sizeof(__pyx_k__weights), 0, 0, 1, 1},\n  {&__pyx_n_s__x_data_ptr, __pyx_k__x_data_ptr, sizeof(__pyx_k__x_data_ptr), 0, 0, 1, 1},\n  {&__pyx_n_s__x_ind_ptr, __pyx_k__x_ind_ptr, sizeof(__pyx_k__x_ind_ptr), 0, 0, 1, 1},\n  {&__pyx_n_s__xnnz, __pyx_k__xnnz, sizeof(__pyx_k__xnnz), 0, 0, 1, 1},\n  {&__pyx_n_s__y, __pyx_k__y, sizeof(__pyx_k__y), 0, 0, 1, 1},\n  {&__pyx_n_s__zeros, __pyx_k__zeros, sizeof(__pyx_k__zeros), 0, 0, 1, 1},\n  {0, 0, 0, 0, 0, 0, 0}\n};\nstatic int __Pyx_InitCachedBuiltins(void) {\n  __pyx_builtin_NotImplementedError = __Pyx_GetName(__pyx_b, __pyx_n_s__NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  return 0;\n  __pyx_L1_error:;\n  return -1;\n}\n\nstatic int __Pyx_InitCachedConstants(void) {\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__Pyx_InitCachedConstants\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":508\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\\n *            or np.isnan(intercept) or np.isinf(intercept):\n *             raise ValueError(\"floating-point under-/overflow occured.\")             # <<<<<<<<<<<<<<\n * \n *     w.reset_wscale()\n */\n  __pyx_k_tuple_5 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_5);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));\n  PyTuple_SET_ITEM(__pyx_k_tuple_5, 0, ((PyObject *)__pyx_kp_s_4));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_5));\n\n  /* \"numpy.pxd\":215\n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n */\n  __pyx_k_tuple_7 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_7)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_7);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));\n  PyTuple_SET_ITEM(__pyx_k_tuple_7, 0, ((PyObject *)__pyx_kp_u_6));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_7));\n\n  /* \"numpy.pxd\":219\n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")             # <<<<<<<<<<<<<<\n * \n *             info.buf = PyArray_DATA(self)\n */\n  __pyx_k_tuple_9 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_9)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_9);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_8));\n  PyTuple_SET_ITEM(__pyx_k_tuple_9, 0, ((PyObject *)__pyx_kp_u_8));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_8));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_9));\n\n  /* \"numpy.pxd\":257\n *                 if ((descr.byteorder == c'>' and little_endian) or\n *                     (descr.byteorder == c'<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n */\n  __pyx_k_tuple_11 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_11);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));\n  PyTuple_SET_ITEM(__pyx_k_tuple_11, 0, ((PyObject *)__pyx_kp_u_10));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_11));\n\n  /* \"numpy.pxd\":799\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")             # <<<<<<<<<<<<<<\n * \n *         if ((child.byteorder == c'>' and little_endian) or\n */\n  __pyx_k_tuple_14 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_14)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_14);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_13));\n  PyTuple_SET_ITEM(__pyx_k_tuple_14, 0, ((PyObject *)__pyx_kp_u_13));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_13));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_14));\n\n  /* \"numpy.pxd\":803\n *         if ((child.byteorder == c'>' and little_endian) or\n *             (child.byteorder == c'<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *             # One could encode it in the format string and have Cython\n *             # complain instead, BUT: < and > in format strings also imply\n */\n  __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_15);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));\n  PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_u_10));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15));\n\n  /* \"numpy.pxd\":823\n *             t = child.type_num\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")             # <<<<<<<<<<<<<<\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n */\n  __pyx_k_tuple_17 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_17);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_16));\n  PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, ((PyObject *)__pyx_kp_u_16));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_16));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":327\n * \n * \n * def plain_sgd(np.ndarray[DOUBLE, ndim=1, mode='c'] weights,             # <<<<<<<<<<<<<<\n *               double intercept,\n *               LossFunction loss,\n */\n  __pyx_k_tuple_18 = PyTuple_New(41); if (unlikely(!__pyx_k_tuple_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_18);\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__weights));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 0, ((PyObject *)__pyx_n_s__weights));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weights));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__intercept));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 1, ((PyObject *)__pyx_n_s__intercept));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__intercept));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__loss));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 2, ((PyObject *)__pyx_n_s__loss));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__loss));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__penalty_type));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 3, ((PyObject *)__pyx_n_s__penalty_type));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__penalty_type));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__alpha));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 4, ((PyObject *)__pyx_n_s__alpha));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__alpha));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__C));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 5, ((PyObject *)__pyx_n_s__C));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__C));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__rho));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 6, ((PyObject *)__pyx_n_s__rho));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__rho));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__dataset));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 7, ((PyObject *)__pyx_n_s__dataset));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__dataset));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_iter));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 8, ((PyObject *)__pyx_n_s__n_iter));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_iter));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__fit_intercept));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 9, ((PyObject *)__pyx_n_s__fit_intercept));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fit_intercept));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__verbose));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 10, ((PyObject *)__pyx_n_s__verbose));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__verbose));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__shuffle));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 11, ((PyObject *)__pyx_n_s__shuffle));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__shuffle));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__seed));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 12, ((PyObject *)__pyx_n_s__seed));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__seed));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__weight_pos));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 13, ((PyObject *)__pyx_n_s__weight_pos));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weight_pos));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__weight_neg));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 14, ((PyObject *)__pyx_n_s__weight_neg));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weight_neg));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__learning_rate));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 15, ((PyObject *)__pyx_n_s__learning_rate));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__learning_rate));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__eta0));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 16, ((PyObject *)__pyx_n_s__eta0));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__eta0));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__power_t));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 17, ((PyObject *)__pyx_n_s__power_t));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__power_t));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__t));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 18, ((PyObject *)__pyx_n_s__t));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__t));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__intercept_decay));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 19, ((PyObject *)__pyx_n_s__intercept_decay));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__intercept_decay));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_samples));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 20, ((PyObject *)__pyx_n_s__n_samples));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_samples));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_features));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 21, ((PyObject *)__pyx_n_s__n_features));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_features));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__w));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 22, ((PyObject *)__pyx_n_s__w));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__x_data_ptr));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 23, ((PyObject *)__pyx_n_s__x_data_ptr));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__x_data_ptr));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__x_ind_ptr));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 24, ((PyObject *)__pyx_n_s__x_ind_ptr));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__x_ind_ptr));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__xnnz));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 25, ((PyObject *)__pyx_n_s__xnnz));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__xnnz));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__eta));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 26, ((PyObject *)__pyx_n_s__eta));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__eta));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__p));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 27, ((PyObject *)__pyx_n_s__p));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__p));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__update));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 28, ((PyObject *)__pyx_n_s__update));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__update));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__sumloss));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 29, ((PyObject *)__pyx_n_s__sumloss));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sumloss));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__y));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 30, ((PyObject *)__pyx_n_s__y));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_weight));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 31, ((PyObject *)__pyx_n_s__sample_weight));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_weight));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__class_weight));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 32, ((PyObject *)__pyx_n_s__class_weight));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__class_weight));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__count));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 33, ((PyObject *)__pyx_n_s__count));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__count));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__epoch));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 34, ((PyObject *)__pyx_n_s__epoch));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__epoch));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__i));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 35, ((PyObject *)__pyx_n_s__i));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__is_hinge));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 36, ((PyObject *)__pyx_n_s__is_hinge));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__is_hinge));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__q));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 37, ((PyObject *)__pyx_n_s__q));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__q));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__q_data_ptr));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 38, ((PyObject *)__pyx_n_s__q_data_ptr));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__q_data_ptr));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__u));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 39, ((PyObject *)__pyx_n_s__u));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__u));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__t_start));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 40, ((PyObject *)__pyx_n_s__t_start));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__t_start));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_18));\n  __pyx_k_codeobj_19 = (PyObject*)__Pyx_PyCode_New(20, 0, 41, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_20, __pyx_n_s__plain_sgd, 327, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_RefNannyFinishContext();\n  return 0;\n  __pyx_L1_error:;\n  __Pyx_RefNannyFinishContext();\n  return -1;\n}\n\nstatic int __Pyx_InitGlobals(void) {\n  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  return 0;\n  __pyx_L1_error:;\n  return -1;\n}\n\n#if PY_MAJOR_VERSION < 3\nPyMODINIT_FUNC initsgd_fast(void); /*proto*/\nPyMODINIT_FUNC initsgd_fast(void)\n#else\nPyMODINIT_FUNC PyInit_sgd_fast(void); /*proto*/\nPyMODINIT_FUNC PyInit_sgd_fast(void)\n#endif\n{\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  __Pyx_RefNannyDeclarations\n  #if CYTHON_REFNANNY\n  __Pyx_RefNanny = __Pyx_RefNannyImportAPI(\"refnanny\");\n  if (!__Pyx_RefNanny) {\n      PyErr_Clear();\n      __Pyx_RefNanny = __Pyx_RefNannyImportAPI(\"Cython.Runtime.refnanny\");\n      if (!__Pyx_RefNanny)\n          Py_FatalError(\"failed to import 'refnanny' module\");\n  }\n  #endif\n  __Pyx_RefNannySetupContext(\"PyMODINIT_FUNC PyInit_sgd_fast(void)\", 0);\n  if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_empty_bytes = PyBytes_FromStringAndSize(\"\", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #ifdef __Pyx_CyFunction_USED\n  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #endif\n  #ifdef __Pyx_FusedFunction_USED\n  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #endif\n  #ifdef __Pyx_Generator_USED\n  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #endif\n  /*--- Library function declarations ---*/\n  /*--- Threads initialization code ---*/\n  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS\n  #ifdef WITH_THREAD /* Python build with threading support? */\n  PyEval_InitThreads();\n  #endif\n  #endif\n  /*--- Module creation code ---*/\n  #if PY_MAJOR_VERSION < 3\n  __pyx_m = Py_InitModule4(__Pyx_NAMESTR(\"sgd_fast\"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);\n  #else\n  __pyx_m = PyModule_Create(&__pyx_moduledef);\n  #endif\n  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #if PY_MAJOR_VERSION >= 3\n  {\n    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    if (!PyDict_GetItemString(modules, \"sklearn.linear_model.sgd_fast\")) {\n      if (unlikely(PyDict_SetItemString(modules, \"sklearn.linear_model.sgd_fast\", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    }\n  }\n  #endif\n  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #if CYTHON_COMPILING_IN_PYPY\n  Py_INCREF(__pyx_b);\n  #endif\n  if (__Pyx_SetAttrString(__pyx_m, \"__builtins__\", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  /*--- Initialize various global constants etc. ---*/\n  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__pyx_module_is_main_sklearn__linear_model__sgd_fast) {\n    if (__Pyx_SetAttrString(__pyx_m, \"__name__\", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  }\n  /*--- Builtin init code ---*/\n  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Constants init code ---*/\n  if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Global init code ---*/\n  /*--- Variable export code ---*/\n  /*--- Function export code ---*/\n  /*--- Type init code ---*/\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_dloss;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"LossFunction\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction = &__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_Regression.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"Regression\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_Classification.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"Classification\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"ModifiedHuber\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = &__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"Hinge\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"SquaredHinge\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge = &__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_Log.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Log.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"Log\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Log;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"SquaredLoss\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss = &__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_Huber.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"Huber\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"EpsilonInsensitive\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = &__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"SquaredEpsilonInsensitive\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = &__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n  /*--- Type import code ---*/\n  __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, \"type\", \n  #if CYTHON_COMPILING_IN_PYPY\n  sizeof(PyTypeObject),\n  #else\n  sizeof(PyHeapTypeObject),\n  #endif\n  0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_dtype = __Pyx_ImportType(\"numpy\", \"dtype\", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(\"numpy\", \"flatiter\", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(\"numpy\", \"broadcast\", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(\"numpy\", \"ndarray\", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(\"numpy\", \"ufunc\", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector = __Pyx_ImportType(\"sklearn.utils.weight_vector\", \"WeightVector\", sizeof(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_vtabptr_7sklearn_5utils_13weight_vector_WeightVector = (struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_13weight_vector_WeightVector)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset = __Pyx_ImportType(\"sklearn.utils.seq_dataset\", \"SequentialDataset\", sizeof(struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_vtabptr_7sklearn_5utils_11seq_dataset_SequentialDataset = (struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_11seq_dataset_SequentialDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset = __Pyx_ImportType(\"sklearn.utils.seq_dataset\", \"ArrayDataset\", sizeof(struct __pyx_obj_7sklearn_5utils_11seq_dataset_ArrayDataset), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_vtabptr_7sklearn_5utils_11seq_dataset_ArrayDataset = (struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_ArrayDataset*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_11seq_dataset_ArrayDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset = __Pyx_ImportType(\"sklearn.utils.seq_dataset\", \"CSRDataset\", sizeof(struct __pyx_obj_7sklearn_5utils_11seq_dataset_CSRDataset), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_vtabptr_7sklearn_5utils_11seq_dataset_CSRDataset = (struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_CSRDataset*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_11seq_dataset_CSRDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Variable import code ---*/\n  /*--- Function import code ---*/\n  /*--- Execution code ---*/\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":11\n * \n * \n * import numpy as np             # <<<<<<<<<<<<<<\n * import sys\n * from time import time\n */\n  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":12\n * \n * import numpy as np\n * import sys             # <<<<<<<<<<<<<<\n * from time import time\n * \n */\n  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":13\n * import numpy as np\n * import sys\n * from time import time             # <<<<<<<<<<<<<<\n * \n * from libc.math cimport exp, log, sqrt, pow, fabs\n */\n  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__time));\n  PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__time));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__time));\n  __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__time), ((PyObject *)__pyx_t_1), -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__time);\n  if (__pyx_t_1 == NULL) {\n    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__time);\n    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  }\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__time, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":22\n * from sklearn.utils.seq_dataset cimport SequentialDataset\n * \n * np.import_array()             # <<<<<<<<<<<<<<\n * \n * \n */\n  import_array();\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":327\n * \n * \n * def plain_sgd(np.ndarray[DOUBLE, ndim=1, mode='c'] weights,             # <<<<<<<<<<<<<<\n *               double intercept,\n *               LossFunction loss,\n */\n  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_12linear_model_8sgd_fast_1plain_sgd, NULL, __pyx_n_s_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__plain_sgd, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":1\n * # encoding: utf-8             # <<<<<<<<<<<<<<\n * # cython: cdivision=True\n * # cython: boundscheck=False\n */\n  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_t_2));\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n\n  /* \"numpy.pxd\":975\n *      arr.base = baseptr\n * \n * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<\n *     if arr.base is NULL:\n *         return None\n */\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  if (__pyx_m) {\n    __Pyx_AddTraceback(\"init sklearn.linear_model.sgd_fast\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n    Py_DECREF(__pyx_m); __pyx_m = 0;\n  } else if (!PyErr_Occurred()) {\n    PyErr_SetString(PyExc_ImportError, \"init sklearn.linear_model.sgd_fast\");\n  }\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  #if PY_MAJOR_VERSION < 3\n  return;\n  #else\n  return __pyx_m;\n  #endif\n}\n\n/* Runtime support code */\n#if CYTHON_REFNANNY\nstatic __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {\n    PyObject *m = NULL, *p = NULL;\n    void *r = NULL;\n    m = PyImport_ImportModule((char *)modname);\n    if (!m) goto end;\n    p = PyObject_GetAttrString(m, (char *)\"RefNannyAPI\");\n    if (!p) goto end;\n    r = PyLong_AsVoidPtr(p);\nend:\n    Py_XDECREF(p);\n    Py_XDECREF(m);\n    return (__Pyx_RefNannyAPIStruct *)r;\n}\n#endif /* CYTHON_REFNANNY */\n\nstatic PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {\n    PyObject *result;\n    result = PyObject_GetAttr(dict, name);\n    if (!result) {\n        if (dict != __pyx_b) {\n            PyErr_Clear();\n            result = PyObject_GetAttr(__pyx_b, name);\n        }\n        if (!result) {\n            PyErr_SetObject(PyExc_NameError, name);\n        }\n    }\n    return result;\n}\n\nstatic CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    PyObject *tmp_type, *tmp_value, *tmp_tb;\n    PyThreadState *tstate = PyThreadState_GET();\n    tmp_type = tstate->curexc_type;\n    tmp_value = tstate->curexc_value;\n    tmp_tb = tstate->curexc_traceback;\n    tstate->curexc_type = type;\n    tstate->curexc_value = value;\n    tstate->curexc_traceback = tb;\n    Py_XDECREF(tmp_type);\n    Py_XDECREF(tmp_value);\n    Py_XDECREF(tmp_tb);\n#else\n    PyErr_Restore(type, value, tb);\n#endif\n}\nstatic CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    PyThreadState *tstate = PyThreadState_GET();\n    *type = tstate->curexc_type;\n    *value = tstate->curexc_value;\n    *tb = tstate->curexc_traceback;\n    tstate->curexc_type = 0;\n    tstate->curexc_value = 0;\n    tstate->curexc_traceback = 0;\n#else\n    PyErr_Fetch(type, value, tb);\n#endif\n}\n\n#if PY_MAJOR_VERSION < 3\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,\n                        CYTHON_UNUSED PyObject *cause) {\n    Py_XINCREF(type);\n    if (!value || value == Py_None)\n        value = NULL;\n    else\n        Py_INCREF(value);\n    if (!tb || tb == Py_None)\n        tb = NULL;\n    else {\n        Py_INCREF(tb);\n        if (!PyTraceBack_Check(tb)) {\n            PyErr_SetString(PyExc_TypeError,\n                \"raise: arg 3 must be a traceback or None\");\n            goto raise_error;\n        }\n    }\n    #if PY_VERSION_HEX < 0x02050000\n    if (PyClass_Check(type)) {\n    #else\n    if (PyType_Check(type)) {\n    #endif\n#if CYTHON_COMPILING_IN_PYPY\n        if (!value) {\n            Py_INCREF(Py_None);\n            value = Py_None;\n        }\n#endif\n        PyErr_NormalizeException(&type, &value, &tb);\n    } else {\n        if (value) {\n            PyErr_SetString(PyExc_TypeError,\n                \"instance exception may not have a separate value\");\n            goto raise_error;\n        }\n        value = type;\n        #if PY_VERSION_HEX < 0x02050000\n            if (PyInstance_Check(type)) {\n                type = (PyObject*) ((PyInstanceObject*)type)->in_class;\n                Py_INCREF(type);\n            }\n            else {\n                type = 0;\n                PyErr_SetString(PyExc_TypeError,\n                    \"raise: exception must be an old-style class or instance\");\n                goto raise_error;\n            }\n        #else\n            type = (PyObject*) Py_TYPE(type);\n            Py_INCREF(type);\n            if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {\n                PyErr_SetString(PyExc_TypeError,\n                    \"raise: exception class must be a subclass of BaseException\");\n                goto raise_error;\n            }\n        #endif\n    }\n    __Pyx_ErrRestore(type, value, tb);\n    return;\nraise_error:\n    Py_XDECREF(value);\n    Py_XDECREF(type);\n    Py_XDECREF(tb);\n    return;\n}\n#else /* Python 3+ */\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {\n    PyObject* owned_instance = NULL;\n    if (tb == Py_None) {\n        tb = 0;\n    } else if (tb && !PyTraceBack_Check(tb)) {\n        PyErr_SetString(PyExc_TypeError,\n            \"raise: arg 3 must be a traceback or None\");\n        goto bad;\n    }\n    if (value == Py_None)\n        value = 0;\n    if (PyExceptionInstance_Check(type)) {\n        if (value) {\n            PyErr_SetString(PyExc_TypeError,\n                \"instance exception may not have a separate value\");\n            goto bad;\n        }\n        value = type;\n        type = (PyObject*) Py_TYPE(value);\n    } else if (PyExceptionClass_Check(type)) {\n        PyObject *args;\n        if (!value)\n            args = PyTuple_New(0);\n        else if (PyTuple_Check(value)) {\n            Py_INCREF(value);\n            args = value;\n        }\n        else\n            args = PyTuple_Pack(1, value);\n        if (!args)\n            goto bad;\n        owned_instance = PyEval_CallObject(type, args);\n        Py_DECREF(args);\n        if (!owned_instance)\n            goto bad;\n        value = owned_instance;\n        if (!PyExceptionInstance_Check(value)) {\n            PyErr_Format(PyExc_TypeError,\n                         \"calling %R should have returned an instance of \"\n                         \"BaseException, not %R\",\n                         type, Py_TYPE(value));\n            goto bad;\n        }\n    } else {\n        PyErr_SetString(PyExc_TypeError,\n            \"raise: exception class must be a subclass of BaseException\");\n        goto bad;\n    }\n    if (cause && cause != Py_None) {\n        PyObject *fixed_cause;\n        if (PyExceptionClass_Check(cause)) {\n            fixed_cause = PyObject_CallObject(cause, NULL);\n            if (fixed_cause == NULL)\n                goto bad;\n        }\n        else if (PyExceptionInstance_Check(cause)) {\n            fixed_cause = cause;\n            Py_INCREF(fixed_cause);\n        }\n        else {\n            PyErr_SetString(PyExc_TypeError,\n                            \"exception causes must derive from \"\n                            \"BaseException\");\n            goto bad;\n        }\n        PyException_SetCause(value, fixed_cause);\n    }\n    PyErr_SetObject(type, value);\n    if (tb) {\n        PyThreadState *tstate = PyThreadState_GET();\n        PyObject* tmp_tb = tstate->curexc_traceback;\n        if (tb != tmp_tb) {\n            Py_INCREF(tb);\n            tstate->curexc_traceback = tb;\n            Py_XDECREF(tmp_tb);\n        }\n    }\nbad:\n    Py_XDECREF(owned_instance);\n    return;\n}\n#endif\n\nstatic void __Pyx_RaiseArgtupleInvalid(\n    const char* func_name,\n    int exact,\n    Py_ssize_t num_min,\n    Py_ssize_t num_max,\n    Py_ssize_t num_found)\n{\n    Py_ssize_t num_expected;\n    const char *more_or_less;\n    if (num_found < num_min) {\n        num_expected = num_min;\n        more_or_less = \"at least\";\n    } else {\n        num_expected = num_max;\n        more_or_less = \"at most\";\n    }\n    if (exact) {\n        more_or_less = \"exactly\";\n    }\n    PyErr_Format(PyExc_TypeError,\n                 \"%s() takes %s %\" CYTHON_FORMAT_SSIZE_T \"d positional argument%s (%\" CYTHON_FORMAT_SSIZE_T \"d given)\",\n                 func_name, more_or_less, num_expected,\n                 (num_expected == 1) ? \"\" : \"s\", num_found);\n}\n\nstatic void __Pyx_RaiseDoubleKeywordsError(\n    const char* func_name,\n    PyObject* kw_name)\n{\n    PyErr_Format(PyExc_TypeError,\n        #if PY_MAJOR_VERSION >= 3\n        \"%s() got multiple values for keyword argument '%U'\", func_name, kw_name);\n        #else\n        \"%s() got multiple values for keyword argument '%s'\", func_name,\n        PyString_AsString(kw_name));\n        #endif\n}\n\nstatic int __Pyx_ParseOptionalKeywords(\n    PyObject *kwds,\n    PyObject **argnames[],\n    PyObject *kwds2,\n    PyObject *values[],\n    Py_ssize_t num_pos_args,\n    const char* function_name)\n{\n    PyObject *key = 0, *value = 0;\n    Py_ssize_t pos = 0;\n    PyObject*** name;\n    PyObject*** first_kw_arg = argnames + num_pos_args;\n    while (PyDict_Next(kwds, &pos, &key, &value)) {\n        name = first_kw_arg;\n        while (*name && (**name != key)) name++;\n        if (*name) {\n            values[name-argnames] = value;\n            continue;\n        }\n        name = first_kw_arg;\n        #if PY_MAJOR_VERSION < 3\n        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {\n            while (*name) {\n                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))\n                        && _PyString_Eq(**name, key)) {\n                    values[name-argnames] = value;\n                    break;\n                }\n                name++;\n            }\n            if (*name) continue;\n            else {\n                PyObject*** argname = argnames;\n                while (argname != first_kw_arg) {\n                    if ((**argname == key) || (\n                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))\n                             && _PyString_Eq(**argname, key))) {\n                        goto arg_passed_twice;\n                    }\n                    argname++;\n                }\n            }\n        } else\n        #endif\n        if (likely(PyUnicode_Check(key))) {\n            while (*name) {\n                int cmp = (**name == key) ? 0 :\n                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3\n                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :\n                #endif\n                    PyUnicode_Compare(**name, key);\n                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;\n                if (cmp == 0) {\n                    values[name-argnames] = value;\n                    break;\n                }\n                name++;\n            }\n            if (*name) continue;\n            else {\n                PyObject*** argname = argnames;\n                while (argname != first_kw_arg) {\n                    int cmp = (**argname == key) ? 0 :\n                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3\n                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :\n                    #endif\n                        PyUnicode_Compare(**argname, key);\n                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;\n                    if (cmp == 0) goto arg_passed_twice;\n                    argname++;\n                }\n            }\n        } else\n            goto invalid_keyword_type;\n        if (kwds2) {\n            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;\n        } else {\n            goto invalid_keyword;\n        }\n    }\n    return 0;\narg_passed_twice:\n    __Pyx_RaiseDoubleKeywordsError(function_name, key);\n    goto bad;\ninvalid_keyword_type:\n    PyErr_Format(PyExc_TypeError,\n        \"%s() keywords must be strings\", function_name);\n    goto bad;\ninvalid_keyword:\n    PyErr_Format(PyExc_TypeError,\n    #if PY_MAJOR_VERSION < 3\n        \"%s() got an unexpected keyword argument '%s'\",\n        function_name, PyString_AsString(key));\n    #else\n        \"%s() got an unexpected keyword argument '%U'\",\n        function_name, key);\n    #endif\nbad:\n    return -1;\n}\n\nstatic int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,\n    const char *name, int exact)\n{\n    if (!type) {\n        PyErr_Format(PyExc_SystemError, \"Missing type object\");\n        return 0;\n    }\n    if (none_allowed && obj == Py_None) return 1;\n    else if (exact) {\n        if (Py_TYPE(obj) == type) return 1;\n    }\n    else {\n        if (PyObject_TypeCheck(obj, type)) return 1;\n    }\n    PyErr_Format(PyExc_TypeError,\n        \"Argument '%s' has incorrect type (expected %s, got %s)\",\n        name, type->tp_name, Py_TYPE(obj)->tp_name);\n    return 0;\n}\n\nstatic CYTHON_INLINE int __Pyx_IsLittleEndian(void) {\n  unsigned int n = 1;\n  return *(unsigned char*)(&n) != 0;\n}\nstatic void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx,\n                              __Pyx_BufFmt_StackElem* stack,\n                              __Pyx_TypeInfo* type) {\n  stack[0].field = &ctx->root;\n  stack[0].parent_offset = 0;\n  ctx->root.type = type;\n  ctx->root.name = \"buffer dtype\";\n  ctx->root.offset = 0;\n  ctx->head = stack;\n  ctx->head->field = &ctx->root;\n  ctx->fmt_offset = 0;\n  ctx->head->parent_offset = 0;\n  ctx->new_packmode = '@';\n  ctx->enc_packmode = '@';\n  ctx->new_count = 1;\n  ctx->enc_count = 0;\n  ctx->enc_type = 0;\n  ctx->is_complex = 0;\n  ctx->is_valid_array = 0;\n  ctx->struct_alignment = 0;\n  while (type->typegroup == 'S') {\n    ++ctx->head;\n    ctx->head->field = type->fields;\n    ctx->head->parent_offset = 0;\n    type = type->fields->type;\n  }\n}\nstatic int __Pyx_BufFmt_ParseNumber(const char** ts) {\n    int count;\n    const char* t = *ts;\n    if (*t < '0' || *t > '9') {\n      return -1;\n    } else {\n        count = *t++ - '0';\n        while (*t >= '0' && *t < '9') {\n            count *= 10;\n            count += *t++ - '0';\n        }\n    }\n    *ts = t;\n    return count;\n}\nstatic int __Pyx_BufFmt_ExpectNumber(const char **ts) {\n    int number = __Pyx_BufFmt_ParseNumber(ts);\n    if (number == -1) /* First char was not a digit */\n        PyErr_Format(PyExc_ValueError,\\\n                     \"Does not understand character buffer dtype format string ('%c')\", **ts);\n    return number;\n}\nstatic void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) {\n  PyErr_Format(PyExc_ValueError,\n               \"Unexpected format string character: '%c'\", ch);\n}\nstatic const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) {\n  switch (ch) {\n    case 'c': return \"'char'\";\n    case 'b': return \"'signed char'\";\n    case 'B': return \"'unsigned char'\";\n    case 'h': return \"'short'\";\n    case 'H': return \"'unsigned short'\";\n    case 'i': return \"'int'\";\n    case 'I': return \"'unsigned int'\";\n    case 'l': return \"'long'\";\n    case 'L': return \"'unsigned long'\";\n    case 'q': return \"'long long'\";\n    case 'Q': return \"'unsigned long long'\";\n    case 'f': return (is_complex ? \"'complex float'\" : \"'float'\");\n    case 'd': return (is_complex ? \"'complex double'\" : \"'double'\");\n    case 'g': return (is_complex ? \"'complex long double'\" : \"'long double'\");\n    case 'T': return \"a struct\";\n    case 'O': return \"Python object\";\n    case 'P': return \"a pointer\";\n    case 's': case 'p': return \"a string\";\n    case 0: return \"end\";\n    default: return \"unparseable format string\";\n  }\n}\nstatic size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) {\n  switch (ch) {\n    case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1;\n    case 'h': case 'H': return 2;\n    case 'i': case 'I': case 'l': case 'L': return 4;\n    case 'q': case 'Q': return 8;\n    case 'f': return (is_complex ? 8 : 4);\n    case 'd': return (is_complex ? 16 : 8);\n    case 'g': {\n      PyErr_SetString(PyExc_ValueError, \"Python does not define a standard format string size for long double ('g')..\");\n      return 0;\n    }\n    case 'O': case 'P': return sizeof(void*);\n    default:\n      __Pyx_BufFmt_RaiseUnexpectedChar(ch);\n      return 0;\n    }\n}\nstatic size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) {\n  switch (ch) {\n    case 'c': case 'b': case 'B': case 's': case 'p': return 1;\n    case 'h': case 'H': return sizeof(short);\n    case 'i': case 'I': return sizeof(int);\n    case 'l': case 'L': return sizeof(long);\n    #ifdef HAVE_LONG_LONG\n    case 'q': case 'Q': return sizeof(PY_LONG_LONG);\n    #endif\n    case 'f': return sizeof(float) * (is_complex ? 2 : 1);\n    case 'd': return sizeof(double) * (is_complex ? 2 : 1);\n    case 'g': return sizeof(long double) * (is_complex ? 2 : 1);\n    case 'O': case 'P': return sizeof(void*);\n    default: {\n      __Pyx_BufFmt_RaiseUnexpectedChar(ch);\n      return 0;\n    }\n  }\n}\ntypedef struct { char c; short x; } __Pyx_st_short;\ntypedef struct { char c; int x; } __Pyx_st_int;\ntypedef struct { char c; long x; } __Pyx_st_long;\ntypedef struct { char c; float x; } __Pyx_st_float;\ntypedef struct { char c; double x; } __Pyx_st_double;\ntypedef struct { char c; long double x; } __Pyx_st_longdouble;\ntypedef struct { char c; void *x; } __Pyx_st_void_p;\n#ifdef HAVE_LONG_LONG\ntypedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong;\n#endif\nstatic size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) {\n  switch (ch) {\n    case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1;\n    case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short);\n    case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int);\n    case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long);\n#ifdef HAVE_LONG_LONG\n    case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG);\n#endif\n    case 'f': return sizeof(__Pyx_st_float) - sizeof(float);\n    case 'd': return sizeof(__Pyx_st_double) - sizeof(double);\n    case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double);\n    case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*);\n    default:\n      __Pyx_BufFmt_RaiseUnexpectedChar(ch);\n      return 0;\n    }\n}\n/* These are for computing the padding at the end of the struct to align\n   on the first member of the struct. This will probably the same as above,\n   but we don't have any guarantees.\n */\ntypedef struct { short x; char c; } __Pyx_pad_short;\ntypedef struct { int x; char c; } __Pyx_pad_int;\ntypedef struct { long x; char c; } __Pyx_pad_long;\ntypedef struct { float x; char c; } __Pyx_pad_float;\ntypedef struct { double x; char c; } __Pyx_pad_double;\ntypedef struct { long double x; char c; } __Pyx_pad_longdouble;\ntypedef struct { void *x; char c; } __Pyx_pad_void_p;\n#ifdef HAVE_LONG_LONG\ntypedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong;\n#endif\nstatic size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) {\n  switch (ch) {\n    case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1;\n    case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short);\n    case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int);\n    case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long);\n#ifdef HAVE_LONG_LONG\n    case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG);\n#endif\n    case 'f': return sizeof(__Pyx_pad_float) - sizeof(float);\n    case 'd': return sizeof(__Pyx_pad_double) - sizeof(double);\n    case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double);\n    case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*);\n    default:\n      __Pyx_BufFmt_RaiseUnexpectedChar(ch);\n      return 0;\n    }\n}\nstatic char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) {\n  switch (ch) {\n    case 'c':\n        return 'H';\n    case 'b': case 'h': case 'i':\n    case 'l': case 'q': case 's': case 'p':\n        return 'I';\n    case 'B': case 'H': case 'I': case 'L': case 'Q':\n        return 'U';\n    case 'f': case 'd': case 'g':\n        return (is_complex ? 'C' : 'R');\n    case 'O':\n        return 'O';\n    case 'P':\n        return 'P';\n    default: {\n      __Pyx_BufFmt_RaiseUnexpectedChar(ch);\n      return 0;\n    }\n  }\n}\nstatic void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) {\n  if (ctx->head == NULL || ctx->head->field == &ctx->root) {\n    const char* expected;\n    const char* quote;\n    if (ctx->head == NULL) {\n      expected = \"end\";\n      quote = \"\";\n    } else {\n      expected = ctx->head->field->type->name;\n      quote = \"'\";\n    }\n    PyErr_Format(PyExc_ValueError,\n                 \"Buffer dtype mismatch, expected %s%s%s but got %s\",\n                 quote, expected, quote,\n                 __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex));\n  } else {\n    __Pyx_StructField* field = ctx->head->field;\n    __Pyx_StructField* parent = (ctx->head - 1)->field;\n    PyErr_Format(PyExc_ValueError,\n                 \"Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'\",\n                 field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex),\n                 parent->type->name, field->name);\n  }\n}\nstatic int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) {\n  char group;\n  size_t size, offset, arraysize = 1;\n  if (ctx->enc_type == 0) return 0;\n  if (ctx->head->field->type->arraysize[0]) {\n    int i, ndim = 0;\n    if (ctx->enc_type == 's' || ctx->enc_type == 'p') {\n        ctx->is_valid_array = ctx->head->field->type->ndim == 1;\n        ndim = 1;\n        if (ctx->enc_count != ctx->head->field->type->arraysize[0]) {\n            PyErr_Format(PyExc_ValueError,\n                         \"Expected a dimension of size %zu, got %zu\",\n                         ctx->head->field->type->arraysize[0], ctx->enc_count);\n            return -1;\n        }\n    }\n    if (!ctx->is_valid_array) {\n      PyErr_Format(PyExc_ValueError, \"Expected %d dimensions, got %d\",\n                   ctx->head->field->type->ndim, ndim);\n      return -1;\n    }\n    for (i = 0; i < ctx->head->field->type->ndim; i++) {\n      arraysize *= ctx->head->field->type->arraysize[i];\n    }\n    ctx->is_valid_array = 0;\n    ctx->enc_count = 1;\n  }\n  group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex);\n  do {\n    __Pyx_StructField* field = ctx->head->field;\n    __Pyx_TypeInfo* type = field->type;\n    if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') {\n      size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex);\n    } else {\n      size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex);\n    }\n    if (ctx->enc_packmode == '@') {\n      size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex);\n      size_t align_mod_offset;\n      if (align_at == 0) return -1;\n      align_mod_offset = ctx->fmt_offset % align_at;\n      if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset;\n      if (ctx->struct_alignment == 0)\n          ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type,\n                                                                 ctx->is_complex);\n    }\n    if (type->size != size || type->typegroup != group) {\n      if (type->typegroup == 'C' && type->fields != NULL) {\n        size_t parent_offset = ctx->head->parent_offset + field->offset;\n        ++ctx->head;\n        ctx->head->field = type->fields;\n        ctx->head->parent_offset = parent_offset;\n        continue;\n      }\n      if ((type->typegroup == 'H' || group == 'H') && type->size == size) {\n      } else {\n          __Pyx_BufFmt_RaiseExpected(ctx);\n          return -1;\n      }\n    }\n    offset = ctx->head->parent_offset + field->offset;\n    if (ctx->fmt_offset != offset) {\n      PyErr_Format(PyExc_ValueError,\n                   \"Buffer dtype mismatch; next field is at offset %\" CYTHON_FORMAT_SSIZE_T \"d but %\" CYTHON_FORMAT_SSIZE_T \"d expected\",\n                   (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset);\n      return -1;\n    }\n    ctx->fmt_offset += size;\n    if (arraysize)\n      ctx->fmt_offset += (arraysize - 1) * size;\n    --ctx->enc_count; /* Consume from buffer string */\n    while (1) {\n      if (field == &ctx->root) {\n        ctx->head = NULL;\n        if (ctx->enc_count != 0) {\n          __Pyx_BufFmt_RaiseExpected(ctx);\n          return -1;\n        }\n        break; /* breaks both loops as ctx->enc_count == 0 */\n      }\n      ctx->head->field = ++field;\n      if (field->type == NULL) {\n        --ctx->head;\n        field = ctx->head->field;\n        continue;\n      } else if (field->type->typegroup == 'S') {\n        size_t parent_offset = ctx->head->parent_offset + field->offset;\n        if (field->type->fields->type == NULL) continue; /* empty struct */\n        field = field->type->fields;\n        ++ctx->head;\n        ctx->head->field = field;\n        ctx->head->parent_offset = parent_offset;\n        break;\n      } else {\n        break;\n      }\n    }\n  } while (ctx->enc_count);\n  ctx->enc_type = 0;\n  ctx->is_complex = 0;\n  return 0;\n}\nstatic CYTHON_INLINE PyObject *\n__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp)\n{\n    const char *ts = *tsp;\n    int i = 0, number;\n    int ndim = ctx->head->field->type->ndim;\n;\n    ++ts;\n    if (ctx->new_count != 1) {\n        PyErr_SetString(PyExc_ValueError,\n                        \"Cannot handle repeated arrays in format string\");\n        return NULL;\n    }\n    if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n    while (*ts && *ts != ')') {\n        if (isspace(*ts))\n            continue;\n        number = __Pyx_BufFmt_ExpectNumber(&ts);\n        if (number == -1) return NULL;\n        if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i])\n            return PyErr_Format(PyExc_ValueError,\n                        \"Expected a dimension of size %zu, got %d\",\n                        ctx->head->field->type->arraysize[i], number);\n        if (*ts != ',' && *ts != ')')\n            return PyErr_Format(PyExc_ValueError,\n                                \"Expected a comma in format string, got '%c'\", *ts);\n        if (*ts == ',') ts++;\n        i++;\n    }\n    if (i != ndim)\n        return PyErr_Format(PyExc_ValueError, \"Expected %d dimension(s), got %d\",\n                            ctx->head->field->type->ndim, i);\n    if (!*ts) {\n        PyErr_SetString(PyExc_ValueError,\n                        \"Unexpected end of format string, expected ')'\");\n        return NULL;\n    }\n    ctx->is_valid_array = 1;\n    ctx->new_count = 1;\n    *tsp = ++ts;\n    return Py_None;\n}\nstatic const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) {\n  int got_Z = 0;\n  while (1) {\n    switch(*ts) {\n      case 0:\n        if (ctx->enc_type != 0 && ctx->head == NULL) {\n          __Pyx_BufFmt_RaiseExpected(ctx);\n          return NULL;\n        }\n        if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n        if (ctx->head != NULL) {\n          __Pyx_BufFmt_RaiseExpected(ctx);\n          return NULL;\n        }\n                return ts;\n      case ' ':\n      case 10:\n      case 13:\n        ++ts;\n        break;\n      case '<':\n        if (!__Pyx_IsLittleEndian()) {\n          PyErr_SetString(PyExc_ValueError, \"Little-endian buffer not supported on big-endian compiler\");\n          return NULL;\n        }\n        ctx->new_packmode = '=';\n        ++ts;\n        break;\n      case '>':\n      case '!':\n        if (__Pyx_IsLittleEndian()) {\n          PyErr_SetString(PyExc_ValueError, \"Big-endian buffer not supported on little-endian compiler\");\n          return NULL;\n        }\n        ctx->new_packmode = '=';\n        ++ts;\n        break;\n      case '=':\n      case '@':\n      case '^':\n        ctx->new_packmode = *ts++;\n        break;\n      case 'T': /* substruct */\n        {\n          const char* ts_after_sub;\n          size_t i, struct_count = ctx->new_count;\n          size_t struct_alignment = ctx->struct_alignment;\n          ctx->new_count = 1;\n          ++ts;\n          if (*ts != '{') {\n            PyErr_SetString(PyExc_ValueError, \"Buffer acquisition: Expected '{' after 'T'\");\n            return NULL;\n          }\n          if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n          ctx->enc_type = 0; /* Erase processed last struct element */\n          ctx->enc_count = 0;\n          ctx->struct_alignment = 0;\n          ++ts;\n          ts_after_sub = ts;\n          for (i = 0; i != struct_count; ++i) {\n            ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts);\n            if (!ts_after_sub) return NULL;\n          }\n          ts = ts_after_sub;\n          if (struct_alignment) ctx->struct_alignment = struct_alignment;\n        }\n        break;\n      case '}': /* end of substruct; either repeat or move on */\n        {\n          size_t alignment = ctx->struct_alignment;\n          ++ts;\n          if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n          ctx->enc_type = 0; /* Erase processed last struct element */\n          if (alignment && ctx->fmt_offset % alignment) {\n            ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment);\n          }\n        }\n        return ts;\n      case 'x':\n        if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n        ctx->fmt_offset += ctx->new_count;\n        ctx->new_count = 1;\n        ctx->enc_count = 0;\n        ctx->enc_type = 0;\n        ctx->enc_packmode = ctx->new_packmode;\n        ++ts;\n        break;\n      case 'Z':\n        got_Z = 1;\n        ++ts;\n        if (*ts != 'f' && *ts != 'd' && *ts != 'g') {\n          __Pyx_BufFmt_RaiseUnexpectedChar('Z');\n          return NULL;\n        }        /* fall through */\n      case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I':\n      case 'l': case 'L': case 'q': case 'Q':\n      case 'f': case 'd': case 'g':\n      case 'O': case 's': case 'p':\n        if (ctx->enc_type == *ts && got_Z == ctx->is_complex &&\n            ctx->enc_packmode == ctx->new_packmode) {\n          ctx->enc_count += ctx->new_count;\n        } else {\n          if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n          ctx->enc_count = ctx->new_count;\n          ctx->enc_packmode = ctx->new_packmode;\n          ctx->enc_type = *ts;\n          ctx->is_complex = got_Z;\n        }\n        ++ts;\n        ctx->new_count = 1;\n        got_Z = 0;\n        break;\n      case ':':\n        ++ts;\n        while(*ts != ':') ++ts;\n        ++ts;\n        break;\n      case '(':\n        if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL;\n        break;\n      default:\n        {\n          int number = __Pyx_BufFmt_ExpectNumber(&ts);\n          if (number == -1) return NULL;\n          ctx->new_count = (size_t)number;\n        }\n    }\n  }\n}\nstatic CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) {\n  buf->buf = NULL;\n  buf->obj = NULL;\n  buf->strides = __Pyx_zeros;\n  buf->shape = __Pyx_zeros;\n  buf->suboffsets = __Pyx_minusones;\n}\nstatic CYTHON_INLINE int __Pyx_GetBufferAndValidate(\n        Py_buffer* buf, PyObject* obj,  __Pyx_TypeInfo* dtype, int flags,\n        int nd, int cast, __Pyx_BufFmt_StackElem* stack)\n{\n  if (obj == Py_None || obj == NULL) {\n    __Pyx_ZeroBuffer(buf);\n    return 0;\n  }\n  buf->buf = NULL;\n  if (__Pyx_GetBuffer(obj, buf, flags) == -1) goto fail;\n  if (buf->ndim != nd) {\n    PyErr_Format(PyExc_ValueError,\n                 \"Buffer has wrong number of dimensions (expected %d, got %d)\",\n                 nd, buf->ndim);\n    goto fail;\n  }\n  if (!cast) {\n    __Pyx_BufFmt_Context ctx;\n    __Pyx_BufFmt_Init(&ctx, stack, dtype);\n    if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail;\n  }\n  if ((unsigned)buf->itemsize != dtype->size) {\n    PyErr_Format(PyExc_ValueError,\n      \"Item size of buffer (%\" CYTHON_FORMAT_SSIZE_T \"d byte%s) does not match size of '%s' (%\" CYTHON_FORMAT_SSIZE_T \"d byte%s)\",\n      buf->itemsize, (buf->itemsize > 1) ? \"s\" : \"\",\n      dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? \"s\" : \"\");\n    goto fail;\n  }\n  if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones;\n  return 0;\nfail:;\n  __Pyx_ZeroBuffer(buf);\n  return -1;\n}\nstatic CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {\n  if (info->buf == NULL) return;\n  if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL;\n  __Pyx_ReleaseBuffer(info);\n}\n\nstatic CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {\n    if (unlikely(!type)) {\n        PyErr_Format(PyExc_SystemError, \"Missing type object\");\n        return 0;\n    }\n    if (likely(PyObject_TypeCheck(obj, type)))\n        return 1;\n    PyErr_Format(PyExc_TypeError, \"Cannot convert %.200s to %.200s\",\n                 Py_TYPE(obj)->tp_name, type->tp_name);\n    return 0;\n}\n\nstatic void __Pyx_RaiseBufferFallbackError(void) {\n  PyErr_Format(PyExc_ValueError,\n     \"Buffer acquisition failed on assignment; and then reacquiring the old buffer failed too!\");\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {\n    PyErr_Format(PyExc_ValueError,\n                 \"too many values to unpack (expected %\" CYTHON_FORMAT_SSIZE_T \"d)\", expected);\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {\n    PyErr_Format(PyExc_ValueError,\n                 \"need more than %\" CYTHON_FORMAT_SSIZE_T \"d value%s to unpack\",\n                 index, (index == 1) ? \"\" : \"s\");\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {\n    PyErr_SetString(PyExc_TypeError, \"'NoneType' object is not iterable\");\n}\n\nstatic CYTHON_INLINE int __Pyx_IterFinish(void) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    PyThreadState *tstate = PyThreadState_GET();\n    PyObject* exc_type = tstate->curexc_type;\n    if (unlikely(exc_type)) {\n        if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) {\n            PyObject *exc_value, *exc_tb;\n            exc_value = tstate->curexc_value;\n            exc_tb = tstate->curexc_traceback;\n            tstate->curexc_type = 0;\n            tstate->curexc_value = 0;\n            tstate->curexc_traceback = 0;\n            Py_DECREF(exc_type);\n            Py_XDECREF(exc_value);\n            Py_XDECREF(exc_tb);\n            return 0;\n        } else {\n            return -1;\n        }\n    }\n    return 0;\n#else\n    if (unlikely(PyErr_Occurred())) {\n        if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) {\n            PyErr_Clear();\n            return 0;\n        } else {\n            return -1;\n        }\n    }\n    return 0;\n#endif\n}\n\nstatic int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {\n    if (unlikely(retval)) {\n        Py_DECREF(retval);\n        __Pyx_RaiseTooManyValuesError(expected);\n        return -1;\n    } else {\n        return __Pyx_IterFinish();\n    }\n    return 0;\n}\n\n#if PY_MAJOR_VERSION < 3\nstatic int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) {\n    CYTHON_UNUSED PyObject *getbuffer_cobj;\n  #if PY_VERSION_HEX >= 0x02060000\n    if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags);\n  #endif\n        if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags);\n  #if PY_VERSION_HEX < 0x02060000\n    if (obj->ob_type->tp_dict &&\n        (getbuffer_cobj = PyMapping_GetItemString(obj->ob_type->tp_dict,\n                                             \"__pyx_getbuffer\"))) {\n        getbufferproc func;\n      #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 0)\n        func = (getbufferproc) PyCapsule_GetPointer(getbuffer_cobj, \"getbuffer(obj, view, flags)\");\n      #else\n        func = (getbufferproc) PyCObject_AsVoidPtr(getbuffer_cobj);\n      #endif\n        Py_DECREF(getbuffer_cobj);\n        if (!func)\n            goto fail;\n        return func(obj, view, flags);\n    } else {\n        PyErr_Clear();\n    }\n  #endif\n    PyErr_Format(PyExc_TypeError, \"'%100s' does not have the buffer interface\", Py_TYPE(obj)->tp_name);\n#if PY_VERSION_HEX < 0x02060000\nfail:\n#endif\n    return -1;\n}\nstatic void __Pyx_ReleaseBuffer(Py_buffer *view) {\n    PyObject *obj = view->obj;\n    CYTHON_UNUSED PyObject *releasebuffer_cobj;\n    if (!obj) return;\n  #if PY_VERSION_HEX >= 0x02060000\n    if (PyObject_CheckBuffer(obj)) {\n        PyBuffer_Release(view);\n        return;\n    }\n  #endif\n        if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) { __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); return; }\n  #if PY_VERSION_HEX < 0x02060000\n    if (obj->ob_type->tp_dict &&\n        (releasebuffer_cobj = PyMapping_GetItemString(obj->ob_type->tp_dict,\n                                                      \"__pyx_releasebuffer\"))) {\n        releasebufferproc func;\n      #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 0)\n        func = (releasebufferproc) PyCapsule_GetPointer(releasebuffer_cobj, \"releasebuffer(obj, view)\");\n      #else\n        func = (releasebufferproc) PyCObject_AsVoidPtr(releasebuffer_cobj);\n      #endif\n        Py_DECREF(releasebuffer_cobj);\n        if (!func)\n            goto fail;\n        func(obj, view);\n        return;\n    } else {\n        PyErr_Clear();\n    }\n  #endif\n    goto nofail;\n#if PY_VERSION_HEX < 0x02060000\nfail:\n#endif\n    PyErr_WriteUnraisable(obj);\nnofail:\n    Py_DECREF(obj);\n    view->obj = NULL;\n}\n#endif /*  PY_MAJOR_VERSION < 3 */\n\n\n    static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {\n    PyObject *py_import = 0;\n    PyObject *empty_list = 0;\n    PyObject *module = 0;\n    PyObject *global_dict = 0;\n    PyObject *empty_dict = 0;\n    PyObject *list;\n    py_import = __Pyx_GetAttrString(__pyx_b, \"__import__\");\n    if (!py_import)\n        goto bad;\n    if (from_list)\n        list = from_list;\n    else {\n        empty_list = PyList_New(0);\n        if (!empty_list)\n            goto bad;\n        list = empty_list;\n    }\n    global_dict = PyModule_GetDict(__pyx_m);\n    if (!global_dict)\n        goto bad;\n    empty_dict = PyDict_New();\n    if (!empty_dict)\n        goto bad;\n    #if PY_VERSION_HEX >= 0x02050000\n    {\n        #if PY_MAJOR_VERSION >= 3\n        if (level == -1) {\n            if (strchr(__Pyx_MODULE_NAME, '.')) {\n                /* try package relative import first */\n                PyObject *py_level = PyInt_FromLong(1);\n                if (!py_level)\n                    goto bad;\n                module = PyObject_CallFunctionObjArgs(py_import,\n                    name, global_dict, empty_dict, list, py_level, NULL);\n                Py_DECREF(py_level);\n                if (!module) {\n                    if (!PyErr_ExceptionMatches(PyExc_ImportError))\n                        goto bad;\n                    PyErr_Clear();\n                }\n            }\n            level = 0; /* try absolute import on failure */\n        }\n        #endif\n        if (!module) {\n            PyObject *py_level = PyInt_FromLong(level);\n            if (!py_level)\n                goto bad;\n            module = PyObject_CallFunctionObjArgs(py_import,\n                name, global_dict, empty_dict, list, py_level, NULL);\n            Py_DECREF(py_level);\n        }\n    }\n    #else\n    if (level>0) {\n        PyErr_SetString(PyExc_RuntimeError, \"Relative import is not supported for Python <=2.4.\");\n        goto bad;\n    }\n    module = PyObject_CallFunctionObjArgs(py_import,\n        name, global_dict, empty_dict, list, NULL);\n    #endif\nbad:\n    Py_XDECREF(empty_list);\n    Py_XDECREF(py_import);\n    Py_XDECREF(empty_dict);\n    return module;\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) {\n#if PY_MAJOR_VERSION < 3\n    PyErr_Format(PyExc_ImportError, \"cannot import name %.230s\",\n                 PyString_AsString(name));\n#else\n    PyErr_Format(PyExc_ImportError, \"cannot import name %S\", name);\n#endif\n}\n\n#if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3\nstatic PyObject *__Pyx_GetStdout(void) {\n    PyObject *f = PySys_GetObject((char *)\"stdout\");\n    if (!f) {\n        PyErr_SetString(PyExc_RuntimeError, \"lost sys.stdout\");\n    }\n    return f;\n}\nstatic int __Pyx_Print(PyObject* f, PyObject *arg_tuple, int newline) {\n    int i;\n    if (!f) {\n        if (!(f = __Pyx_GetStdout()))\n            return -1;\n    }\n    Py_INCREF(f);\n    for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) {\n        PyObject* v;\n        if (PyFile_SoftSpace(f, 1)) {\n            if (PyFile_WriteString(\" \", f) < 0)\n                goto error;\n        }\n        v = PyTuple_GET_ITEM(arg_tuple, i);\n        if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0)\n            goto error;\n        if (PyString_Check(v)) {\n            char *s = PyString_AsString(v);\n            Py_ssize_t len = PyString_Size(v);\n            if (len > 0 &&\n                isspace(Py_CHARMASK(s[len-1])) &&\n                s[len-1] != ' ')\n                    PyFile_SoftSpace(f, 0);\n        }\n    }\n    if (newline) {\n        if (PyFile_WriteString(\"\\n\", f) < 0)\n            goto error;\n        PyFile_SoftSpace(f, 0);\n    }\n    Py_DECREF(f);\n    return 0;\nerror:\n    Py_DECREF(f);\n    return -1;\n}\n#else /* Python 3 has a print function */\nstatic int __Pyx_Print(PyObject* stream, PyObject *arg_tuple, int newline) {\n    PyObject* kwargs = 0;\n    PyObject* result = 0;\n    PyObject* end_string;\n    if (unlikely(!__pyx_print)) {\n        __pyx_print = __Pyx_GetAttrString(__pyx_b, \"print\");\n        if (!__pyx_print)\n            return -1;\n    }\n    if (stream) {\n        kwargs = PyDict_New();\n        if (unlikely(!kwargs))\n            return -1;\n        if (unlikely(PyDict_SetItemString(kwargs, \"file\", stream) < 0))\n            goto bad;\n        if (!newline) {\n            end_string = PyUnicode_FromStringAndSize(\" \", 1);\n            if (unlikely(!end_string))\n                goto bad;\n            if (PyDict_SetItemString(kwargs, \"end\", end_string) < 0) {\n                Py_DECREF(end_string);\n                goto bad;\n            }\n            Py_DECREF(end_string);\n        }\n    } else if (!newline) {\n        if (unlikely(!__pyx_print_kwargs)) {\n            __pyx_print_kwargs = PyDict_New();\n            if (unlikely(!__pyx_print_kwargs))\n                return -1;\n            end_string = PyUnicode_FromStringAndSize(\" \", 1);\n            if (unlikely(!end_string))\n                return -1;\n            if (PyDict_SetItemString(__pyx_print_kwargs, \"end\", end_string) < 0) {\n                Py_DECREF(end_string);\n                return -1;\n            }\n            Py_DECREF(end_string);\n        }\n        kwargs = __pyx_print_kwargs;\n    }\n    result = PyObject_Call(__pyx_print, arg_tuple, kwargs);\n    if (unlikely(kwargs) && (kwargs != __pyx_print_kwargs))\n        Py_DECREF(kwargs);\n    if (!result)\n        return -1;\n    Py_DECREF(result);\n    return 0;\nbad:\n    if (kwargs != __pyx_print_kwargs)\n        Py_XDECREF(kwargs);\n    return -1;\n}\n#endif\n\n#if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3\nstatic int __Pyx_PrintOne(PyObject* f, PyObject *o) {\n    if (!f) {\n        if (!(f = __Pyx_GetStdout()))\n            return -1;\n    }\n    Py_INCREF(f);\n    if (PyFile_SoftSpace(f, 0)) {\n        if (PyFile_WriteString(\" \", f) < 0)\n            goto error;\n    }\n    if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0)\n        goto error;\n    if (PyFile_WriteString(\"\\n\", f) < 0)\n        goto error;\n    Py_DECREF(f);\n    return 0;\nerror:\n    Py_DECREF(f);\n    return -1;\n    /* the line below is just to avoid C compiler\n     * warnings about unused functions */\n    return __Pyx_Print(f, NULL, 0);\n}\n#else /* Python 3 has a print function */\nstatic int __Pyx_PrintOne(PyObject* stream, PyObject *o) {\n    int res;\n    PyObject* arg_tuple = PyTuple_Pack(1, o);\n    if (unlikely(!arg_tuple))\n        return -1;\n    res = __Pyx_Print(stream, arg_tuple, 1);\n    Py_DECREF(arg_tuple);\n    return res;\n}\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      return ::std::complex< float >(x, y);\n    }\n  #else\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      return x + y*(__pyx_t_float_complex)_Complex_I;\n    }\n  #endif\n#else\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      __pyx_t_float_complex z;\n      z.real = x;\n      z.imag = y;\n      return z;\n    }\n#endif\n\n#if CYTHON_CCOMPLEX\n#else\n    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n       return (a.real == b.real) && (a.imag == b.imag);\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real + b.real;\n        z.imag = a.imag + b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real - b.real;\n        z.imag = a.imag - b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real * b.real - a.imag * b.imag;\n        z.imag = a.real * b.imag + a.imag * b.real;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        float denom = b.real * b.real + b.imag * b.imag;\n        z.real = (a.real * b.real + a.imag * b.imag) / denom;\n        z.imag = (a.imag * b.real - a.real * b.imag) / denom;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) {\n        __pyx_t_float_complex z;\n        z.real = -a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) {\n       return (a.real == 0) && (a.imag == 0);\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) {\n        __pyx_t_float_complex z;\n        z.real =  a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    #if 1\n        static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) {\n          #if !defined(HAVE_HYPOT) || defined(_MSC_VER)\n            return sqrtf(z.real*z.real + z.imag*z.imag);\n          #else\n            return hypotf(z.real, z.imag);\n          #endif\n        }\n        static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n            __pyx_t_float_complex z;\n            float r, lnr, theta, z_r, z_theta;\n            if (b.imag == 0 && b.real == (int)b.real) {\n                if (b.real < 0) {\n                    float denom = a.real * a.real + a.imag * a.imag;\n                    a.real = a.real / denom;\n                    a.imag = -a.imag / denom;\n                    b.real = -b.real;\n                }\n                switch ((int)b.real) {\n                    case 0:\n                        z.real = 1;\n                        z.imag = 0;\n                        return z;\n                    case 1:\n                        return a;\n                    case 2:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(a, a);\n                    case 3:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(z, a);\n                    case 4:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(z, z);\n                }\n            }\n            if (a.imag == 0) {\n                if (a.real == 0) {\n                    return a;\n                }\n                r = a.real;\n                theta = 0;\n            } else {\n                r = __Pyx_c_absf(a);\n                theta = atan2f(a.imag, a.real);\n            }\n            lnr = logf(r);\n            z_r = expf(lnr * b.real - theta * b.imag);\n            z_theta = theta * b.real + lnr * b.imag;\n            z.real = z_r * cosf(z_theta);\n            z.imag = z_r * sinf(z_theta);\n            return z;\n        }\n    #endif\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      return ::std::complex< double >(x, y);\n    }\n  #else\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      return x + y*(__pyx_t_double_complex)_Complex_I;\n    }\n  #endif\n#else\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      __pyx_t_double_complex z;\n      z.real = x;\n      z.imag = y;\n      return z;\n    }\n#endif\n\n#if CYTHON_CCOMPLEX\n#else\n    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n       return (a.real == b.real) && (a.imag == b.imag);\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real + b.real;\n        z.imag = a.imag + b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real - b.real;\n        z.imag = a.imag - b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real * b.real - a.imag * b.imag;\n        z.imag = a.real * b.imag + a.imag * b.real;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        double denom = b.real * b.real + b.imag * b.imag;\n        z.real = (a.real * b.real + a.imag * b.imag) / denom;\n        z.imag = (a.imag * b.real - a.real * b.imag) / denom;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) {\n        __pyx_t_double_complex z;\n        z.real = -a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) {\n       return (a.real == 0) && (a.imag == 0);\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) {\n        __pyx_t_double_complex z;\n        z.real =  a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    #if 1\n        static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) {\n          #if !defined(HAVE_HYPOT) || defined(_MSC_VER)\n            return sqrt(z.real*z.real + z.imag*z.imag);\n          #else\n            return hypot(z.real, z.imag);\n          #endif\n        }\n        static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n            __pyx_t_double_complex z;\n            double r, lnr, theta, z_r, z_theta;\n            if (b.imag == 0 && b.real == (int)b.real) {\n                if (b.real < 0) {\n                    double denom = a.real * a.real + a.imag * a.imag;\n                    a.real = a.real / denom;\n                    a.imag = -a.imag / denom;\n                    b.real = -b.real;\n                }\n                switch ((int)b.real) {\n                    case 0:\n                        z.real = 1;\n                        z.imag = 0;\n                        return z;\n                    case 1:\n                        return a;\n                    case 2:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(a, a);\n                    case 3:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(z, a);\n                    case 4:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(z, z);\n                }\n            }\n            if (a.imag == 0) {\n                if (a.real == 0) {\n                    return a;\n                }\n                r = a.real;\n                theta = 0;\n            } else {\n                r = __Pyx_c_abs(a);\n                theta = atan2(a.imag, a.real);\n            }\n            lnr = log(r);\n            z_r = exp(lnr * b.real - theta * b.imag);\n            z_theta = theta * b.real + lnr * b.imag;\n            z.real = z_r * cos(z_theta);\n            z.imag = z_r * sin(z_theta);\n            return z;\n        }\n    #endif\n#endif\n\nstatic CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {\n    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned char\" :\n                    \"value too large to convert to unsigned char\");\n            }\n            return (unsigned char)-1;\n        }\n        return (unsigned char)val;\n    }\n    return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {\n    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned short\" :\n                    \"value too large to convert to unsigned short\");\n            }\n            return (unsigned short)-1;\n        }\n        return (unsigned short)val;\n    }\n    return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {\n    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned int\" :\n                    \"value too large to convert to unsigned int\");\n            }\n            return (unsigned int)-1;\n        }\n        return (unsigned int)val;\n    }\n    return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {\n    const char neg_one = (char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to char\" :\n                    \"value too large to convert to char\");\n            }\n            return (char)-1;\n        }\n        return (char)val;\n    }\n    return (char)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {\n    const short neg_one = (short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to short\" :\n                    \"value too large to convert to short\");\n            }\n            return (short)-1;\n        }\n        return (short)val;\n    }\n    return (short)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {\n    const int neg_one = (int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to int\" :\n                    \"value too large to convert to int\");\n            }\n            return (int)-1;\n        }\n        return (int)val;\n    }\n    return (int)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {\n    const signed char neg_one = (signed char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed char\" :\n                    \"value too large to convert to signed char\");\n            }\n            return (signed char)-1;\n        }\n        return (signed char)val;\n    }\n    return (signed char)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {\n    const signed short neg_one = (signed short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed short\" :\n                    \"value too large to convert to signed short\");\n            }\n            return (signed short)-1;\n        }\n        return (signed short)val;\n    }\n    return (signed short)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {\n    const signed int neg_one = (signed int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed int\" :\n                    \"value too large to convert to signed int\");\n            }\n            return (signed int)-1;\n        }\n        return (signed int)val;\n    }\n    return (signed int)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) {\n    const int neg_one = (int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to int\" :\n                    \"value too large to convert to int\");\n            }\n            return (int)-1;\n        }\n        return (int)val;\n    }\n    return (int)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {\n    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to unsigned long\");\n            return (unsigned long)-1;\n        }\n        return (unsigned long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to unsigned long\");\n                return (unsigned long)-1;\n            }\n            return (unsigned long)PyLong_AsUnsignedLong(x);\n        } else {\n            return (unsigned long)PyLong_AsLong(x);\n        }\n    } else {\n        unsigned long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (unsigned long)-1;\n        val = __Pyx_PyInt_AsUnsignedLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {\n    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to unsigned PY_LONG_LONG\");\n            return (unsigned PY_LONG_LONG)-1;\n        }\n        return (unsigned PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to unsigned PY_LONG_LONG\");\n                return (unsigned PY_LONG_LONG)-1;\n            }\n            return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);\n        } else {\n            return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x);\n        }\n    } else {\n        unsigned PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (unsigned PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsUnsignedLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {\n    const long neg_one = (long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to long\");\n            return (long)-1;\n        }\n        return (long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to long\");\n                return (long)-1;\n            }\n            return (long)PyLong_AsUnsignedLong(x);\n        } else {\n            return (long)PyLong_AsLong(x);\n        }\n    } else {\n        long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (long)-1;\n        val = __Pyx_PyInt_AsLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {\n    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to PY_LONG_LONG\");\n            return (PY_LONG_LONG)-1;\n        }\n        return (PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to PY_LONG_LONG\");\n                return (PY_LONG_LONG)-1;\n            }\n            return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);\n        } else {\n            return (PY_LONG_LONG)PyLong_AsLongLong(x);\n        }\n    } else {\n        PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {\n    const signed long neg_one = (signed long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to signed long\");\n            return (signed long)-1;\n        }\n        return (signed long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to signed long\");\n                return (signed long)-1;\n            }\n            return (signed long)PyLong_AsUnsignedLong(x);\n        } else {\n            return (signed long)PyLong_AsLong(x);\n        }\n    } else {\n        signed long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (signed long)-1;\n        val = __Pyx_PyInt_AsSignedLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {\n    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to signed PY_LONG_LONG\");\n            return (signed PY_LONG_LONG)-1;\n        }\n        return (signed PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to signed PY_LONG_LONG\");\n                return (signed PY_LONG_LONG)-1;\n            }\n            return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);\n        } else {\n            return (signed PY_LONG_LONG)PyLong_AsLongLong(x);\n        }\n    } else {\n        signed PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (signed PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsSignedLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,\n                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename) {\n    PyObject *old_exc, *old_val, *old_tb;\n    PyObject *ctx;\n    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);\n    #if PY_MAJOR_VERSION < 3\n    ctx = PyString_FromString(name);\n    #else\n    ctx = PyUnicode_FromString(name);\n    #endif\n    __Pyx_ErrRestore(old_exc, old_val, old_tb);\n    if (!ctx) {\n        PyErr_WriteUnraisable(Py_None);\n    } else {\n        PyErr_WriteUnraisable(ctx);\n        Py_DECREF(ctx);\n    }\n}\n\nstatic int __Pyx_check_binary_version(void) {\n    char ctversion[4], rtversion[4];\n    PyOS_snprintf(ctversion, 4, \"%d.%d\", PY_MAJOR_VERSION, PY_MINOR_VERSION);\n    PyOS_snprintf(rtversion, 4, \"%s\", Py_GetVersion());\n    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {\n        char message[200];\n        PyOS_snprintf(message, sizeof(message),\n                      \"compiletime version %s of module '%.100s' \"\n                      \"does not match runtime version %s\",\n                      ctversion, __Pyx_MODULE_NAME, rtversion);\n        #if PY_VERSION_HEX < 0x02050000\n        return PyErr_Warn(NULL, message);\n        #else\n        return PyErr_WarnEx(NULL, message, 1);\n        #endif\n    }\n    return 0;\n}\n\nstatic int __Pyx_SetVtable(PyObject *dict, void *vtable) {\n#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)\n    PyObject *ob = PyCapsule_New(vtable, 0, 0);\n#else\n    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);\n#endif\n    if (!ob)\n        goto bad;\n    if (PyDict_SetItemString(dict, \"__pyx_vtable__\", ob) < 0)\n        goto bad;\n    Py_DECREF(ob);\n    return 0;\nbad:\n    Py_XDECREF(ob);\n    return -1;\n}\n\n#ifndef __PYX_HAVE_RT_ImportModule\n#define __PYX_HAVE_RT_ImportModule\nstatic PyObject *__Pyx_ImportModule(const char *name) {\n    PyObject *py_name = 0;\n    PyObject *py_module = 0;\n    py_name = __Pyx_PyIdentifier_FromString(name);\n    if (!py_name)\n        goto bad;\n    py_module = PyImport_Import(py_name);\n    Py_DECREF(py_name);\n    return py_module;\nbad:\n    Py_XDECREF(py_name);\n    return 0;\n}\n#endif\n\n#ifndef __PYX_HAVE_RT_ImportType\n#define __PYX_HAVE_RT_ImportType\nstatic PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name,\n    size_t size, int strict)\n{\n    PyObject *py_module = 0;\n    PyObject *result = 0;\n    PyObject *py_name = 0;\n    char warning[200];\n    py_module = __Pyx_ImportModule(module_name);\n    if (!py_module)\n        goto bad;\n    py_name = __Pyx_PyIdentifier_FromString(class_name);\n    if (!py_name)\n        goto bad;\n    result = PyObject_GetAttr(py_module, py_name);\n    Py_DECREF(py_name);\n    py_name = 0;\n    Py_DECREF(py_module);\n    py_module = 0;\n    if (!result)\n        goto bad;\n    if (!PyType_Check(result)) {\n        PyErr_Format(PyExc_TypeError,\n            \"%s.%s is not a type object\",\n            module_name, class_name);\n        goto bad;\n    }\n    if (!strict && (size_t)((PyTypeObject *)result)->tp_basicsize > size) {\n        PyOS_snprintf(warning, sizeof(warning),\n            \"%s.%s size changed, may indicate binary incompatibility\",\n            module_name, class_name);\n        #if PY_VERSION_HEX < 0x02050000\n        if (PyErr_Warn(NULL, warning) < 0) goto bad;\n        #else\n        if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad;\n        #endif\n    }\n    else if ((size_t)((PyTypeObject *)result)->tp_basicsize != size) {\n        PyErr_Format(PyExc_ValueError,\n            \"%s.%s has the wrong size, try recompiling\",\n            module_name, class_name);\n        goto bad;\n    }\n    return (PyTypeObject *)result;\nbad:\n    Py_XDECREF(py_module);\n    Py_XDECREF(result);\n    return NULL;\n}\n#endif\n\nstatic void* __Pyx_GetVtable(PyObject *dict) {\n    void* ptr;\n    PyObject *ob = PyMapping_GetItemString(dict, (char *)\"__pyx_vtable__\");\n    if (!ob)\n        goto bad;\n#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)\n    ptr = PyCapsule_GetPointer(ob, 0);\n#else\n    ptr = PyCObject_AsVoidPtr(ob);\n#endif\n    if (!ptr && !PyErr_Occurred())\n        PyErr_SetString(PyExc_RuntimeError, \"invalid vtable found for imported type\");\n    Py_DECREF(ob);\n    return ptr;\nbad:\n    Py_XDECREF(ob);\n    return NULL;\n}\n\nstatic int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {\n    int start = 0, mid = 0, end = count - 1;\n    if (end >= 0 && code_line > entries[end].code_line) {\n        return count;\n    }\n    while (start < end) {\n        mid = (start + end) / 2;\n        if (code_line < entries[mid].code_line) {\n            end = mid;\n        } else if (code_line > entries[mid].code_line) {\n             start = mid + 1;\n        } else {\n            return mid;\n        }\n    }\n    if (code_line <= entries[mid].code_line) {\n        return mid;\n    } else {\n        return mid + 1;\n    }\n}\nstatic PyCodeObject *__pyx_find_code_object(int code_line) {\n    PyCodeObject* code_object;\n    int pos;\n    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {\n        return NULL;\n    }\n    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);\n    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {\n        return NULL;\n    }\n    code_object = __pyx_code_cache.entries[pos].code_object;\n    Py_INCREF(code_object);\n    return code_object;\n}\nstatic void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {\n    int pos, i;\n    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;\n    if (unlikely(!code_line)) {\n        return;\n    }\n    if (unlikely(!entries)) {\n        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));\n        if (likely(entries)) {\n            __pyx_code_cache.entries = entries;\n            __pyx_code_cache.max_count = 64;\n            __pyx_code_cache.count = 1;\n            entries[0].code_line = code_line;\n            entries[0].code_object = code_object;\n            Py_INCREF(code_object);\n        }\n        return;\n    }\n    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);\n    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {\n        PyCodeObject* tmp = entries[pos].code_object;\n        entries[pos].code_object = code_object;\n        Py_DECREF(tmp);\n        return;\n    }\n    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {\n        int new_max = __pyx_code_cache.max_count + 64;\n        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(\n            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));\n        if (unlikely(!entries)) {\n            return;\n        }\n        __pyx_code_cache.entries = entries;\n        __pyx_code_cache.max_count = new_max;\n    }\n    for (i=__pyx_code_cache.count; i>pos; i--) {\n        entries[i] = entries[i-1];\n    }\n    entries[pos].code_line = code_line;\n    entries[pos].code_object = code_object;\n    __pyx_code_cache.count++;\n    Py_INCREF(code_object);\n}\n\n#include \"compile.h\"\n#include \"frameobject.h\"\n#include \"traceback.h\"\nstatic PyCodeObject* __Pyx_CreateCodeObjectForTraceback(\n            const char *funcname, int c_line,\n            int py_line, const char *filename) {\n    PyCodeObject *py_code = 0;\n    PyObject *py_srcfile = 0;\n    PyObject *py_funcname = 0;\n    #if PY_MAJOR_VERSION < 3\n    py_srcfile = PyString_FromString(filename);\n    #else\n    py_srcfile = PyUnicode_FromString(filename);\n    #endif\n    if (!py_srcfile) goto bad;\n    if (c_line) {\n        #if PY_MAJOR_VERSION < 3\n        py_funcname = PyString_FromFormat( \"%s (%s:%d)\", funcname, __pyx_cfilenm, c_line);\n        #else\n        py_funcname = PyUnicode_FromFormat( \"%s (%s:%d)\", funcname, __pyx_cfilenm, c_line);\n        #endif\n    }\n    else {\n        #if PY_MAJOR_VERSION < 3\n        py_funcname = PyString_FromString(funcname);\n        #else\n        py_funcname = PyUnicode_FromString(funcname);\n        #endif\n    }\n    if (!py_funcname) goto bad;\n    py_code = __Pyx_PyCode_New(\n        0,            /*int argcount,*/\n        0,            /*int kwonlyargcount,*/\n        0,            /*int nlocals,*/\n        0,            /*int stacksize,*/\n        0,            /*int flags,*/\n        __pyx_empty_bytes, /*PyObject *code,*/\n        __pyx_empty_tuple, /*PyObject *consts,*/\n        __pyx_empty_tuple, /*PyObject *names,*/\n        __pyx_empty_tuple, /*PyObject *varnames,*/\n        __pyx_empty_tuple, /*PyObject *freevars,*/\n        __pyx_empty_tuple, /*PyObject *cellvars,*/\n        py_srcfile,   /*PyObject *filename,*/\n        py_funcname,  /*PyObject *name,*/\n        py_line,      /*int firstlineno,*/\n        __pyx_empty_bytes  /*PyObject *lnotab*/\n    );\n    Py_DECREF(py_srcfile);\n    Py_DECREF(py_funcname);\n    return py_code;\nbad:\n    Py_XDECREF(py_srcfile);\n    Py_XDECREF(py_funcname);\n    return NULL;\n}\nstatic void __Pyx_AddTraceback(const char *funcname, int c_line,\n                               int py_line, const char *filename) {\n    PyCodeObject *py_code = 0;\n    PyObject *py_globals = 0;\n    PyFrameObject *py_frame = 0;\n    py_code = __pyx_find_code_object(c_line ? c_line : py_line);\n    if (!py_code) {\n        py_code = __Pyx_CreateCodeObjectForTraceback(\n            funcname, c_line, py_line, filename);\n        if (!py_code) goto bad;\n        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);\n    }\n    py_globals = PyModule_GetDict(__pyx_m);\n    if (!py_globals) goto bad;\n    py_frame = PyFrame_New(\n        PyThreadState_GET(), /*PyThreadState *tstate,*/\n        py_code,             /*PyCodeObject *code,*/\n        py_globals,          /*PyObject *globals,*/\n        0                    /*PyObject *locals*/\n    );\n    if (!py_frame) goto bad;\n    py_frame->f_lineno = py_line;\n    PyTraceBack_Here(py_frame);\nbad:\n    Py_XDECREF(py_code);\n    Py_XDECREF(py_frame);\n}\n\nstatic int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {\n    while (t->p) {\n        #if PY_MAJOR_VERSION < 3\n        if (t->is_unicode) {\n            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);\n        } else if (t->intern) {\n            *t->p = PyString_InternFromString(t->s);\n        } else {\n            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);\n        }\n        #else  /* Python 3+ has unicode identifiers */\n        if (t->is_unicode | t->is_str) {\n            if (t->intern) {\n                *t->p = PyUnicode_InternFromString(t->s);\n            } else if (t->encoding) {\n                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);\n            } else {\n                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);\n            }\n        } else {\n            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);\n        }\n        #endif\n        if (!*t->p)\n            return -1;\n        ++t;\n    }\n    return 0;\n}\n\n\n/* Type Conversion Functions */\n\nstatic CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {\n   int is_true = x == Py_True;\n   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;\n   else return PyObject_IsTrue(x);\n}\n\nstatic CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {\n  PyNumberMethods *m;\n  const char *name = NULL;\n  PyObject *res = NULL;\n#if PY_VERSION_HEX < 0x03000000\n  if (PyInt_Check(x) || PyLong_Check(x))\n#else\n  if (PyLong_Check(x))\n#endif\n    return Py_INCREF(x), x;\n  m = Py_TYPE(x)->tp_as_number;\n#if PY_VERSION_HEX < 0x03000000\n  if (m && m->nb_int) {\n    name = \"int\";\n    res = PyNumber_Int(x);\n  }\n  else if (m && m->nb_long) {\n    name = \"long\";\n    res = PyNumber_Long(x);\n  }\n#else\n  if (m && m->nb_int) {\n    name = \"int\";\n    res = PyNumber_Long(x);\n  }\n#endif\n  if (res) {\n#if PY_VERSION_HEX < 0x03000000\n    if (!PyInt_Check(res) && !PyLong_Check(res)) {\n#else\n    if (!PyLong_Check(res)) {\n#endif\n      PyErr_Format(PyExc_TypeError,\n                   \"__%s__ returned non-%s (type %.200s)\",\n                   name, name, Py_TYPE(res)->tp_name);\n      Py_DECREF(res);\n      return NULL;\n    }\n  }\n  else if (!PyErr_Occurred()) {\n    PyErr_SetString(PyExc_TypeError,\n                    \"an integer is required\");\n  }\n  return res;\n}\n\nstatic CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {\n  Py_ssize_t ival;\n  PyObject* x = PyNumber_Index(b);\n  if (!x) return -1;\n  ival = PyInt_AsSsize_t(x);\n  Py_DECREF(x);\n  return ival;\n}\n\nstatic CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {\n#if PY_VERSION_HEX < 0x02050000\n   if (ival <= LONG_MAX)\n       return PyInt_FromLong((long)ival);\n   else {\n       unsigned char *bytes = (unsigned char *) &ival;\n       int one = 1; int little = (int)*(unsigned char*)&one;\n       return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);\n   }\n#else\n   return PyInt_FromSize_t(ival);\n#endif\n}\n\nstatic CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {\n   unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);\n   if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) {\n       return (size_t)-1;\n   } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) {\n       PyErr_SetString(PyExc_OverflowError,\n                       \"value too large to convert to size_t\");\n       return (size_t)-1;\n   }\n   return (size_t)val;\n}\n\n\n#endif /* Py_PYTHON_H */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/syscalldefs.h",
    "content": "static const syscalldef syscalldefs[] = {\n        [SYSCALL_OR_NUM(0, SYS_restart_syscall)]        = MAKE_UINT16(0, 1),\n        [SYSCALL_OR_NUM(1, SYS_exit)]         = MAKE_UINT16(1, 17),\n        [SYSCALL_OR_NUM(2, SYS_fork)]         = MAKE_UINT16(0, 22),\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/syscalls.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <tasks/syscall.h>\n\n#include \"syscalls/write.h\"\n#include \"syscalls/exit.h\"\n#include \"syscalls/getpid.h\"\n#include \"syscalls/getppid.h\"\n#include \"syscalls/read.h\"\n#include \"syscalls/brk.h\"\n#include \"syscalls/mmap.h\"\n#include \"syscalls/munmap.h\"\n#include \"syscalls/test.h\"\n#include \"syscalls/hostname.h\"\n#include \"syscalls/uname.h\"\n#include \"syscalls/open.h\"\n#include \"syscalls/execve.h\"\n#include \"syscalls/seek.h\"\n#include \"syscalls/opendir.h\"\n#include \"syscalls/readdir.h\"\n#include \"syscalls/kill.h\"\n#include \"syscalls/getexecdata.h\"\n#include \"syscalls/cwd.h\"\n#include \"syscalls/fork.h\"\n\nsyscall_t syscall_table[] = {\n\tNULL,\n\tsys_exit,\t\t\t// 1\n\tsys_read,\t\t\t// 2\n\tsys_write,\t\t\t// 3\n\tsys_getpid,\t\t\t// 4\n\tsys_brk,\t\t\t// 5\n\tsys_getppid,\t\t// 6\n\tsys_mmap,\t\t\t// 7\n\tsys_munmap,\t\t\t// 8\n\tsys_test,\t\t\t// 9\n\tsys_get_hostname,\t// 10\n\tsys_set_hostname,\t// 11\n\tsys_uname,\t\t\t// 12\n\tsys_open,\t\t\t// 13\n\tsys_execve,\t\t\t// 14\n\tsys_seek,\t\t\t// 15\n\tsys_opendir,\t\t// 16\n\tsys_readdir,\t\t// 17\n\tsys_kill,\t\t\t// 18\n\tsys_getexecdata,\t// 19\n\tsys_chdir,\t\t\t// 20\n\tsys_getcwd,\t\t\t// 21\n\tsys_fork,\t\t\t// 22\n};\n\nchar* syscall_name_table[] = {\n\tNULL,\n\t\"exit\",\t\t\t// 1\n\t\"read\",\t\t\t// 2\n\t\"write\",\t\t// 3\n\t\"getpid\",\t\t// 4\n\t\"brk\",\t\t\t// 5\n\t\"getppid\",\t\t// 6\n\t\"mmap\",\t\t\t// 7\n\t\"munmap\",\t\t// 8\n\t\"test\",\t\t\t// 9\n\t\"get_hostname\",\t// 10\n\t\"set_hostname\",\t// 11\n\t\"uname\",\t\t// 12\n\t\"open\",\t\t\t// 13\n\t\"execve\",\t\t// 14\n\t\"seek\",\t\t\t// 15\n\t\"opendir\",\t\t// 16\n\t\"readdir\",\t\t// 17\n\t\"kill\",\t\t\t// 18\n\t\"getexecdata\",\t// 19\n\t\"chdir\",\t\t// 20\n\t\"getcwd\",\t\t// 21\n\t\"fork\",\t\t\t// 22\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/vfs.h",
    "content": "#pragma once\n\n/* Copyright © 2010, 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n\n#define VFS_SEEK_SET 0\n#define VFS_SEEK_CUR 1\n#define VFS_SEEK_END 2\n\ntypedef struct {\n   uint64_t num;\n   char path[512];\n   char mount_path[512];\n   uint32_t offset;\n   uint32_t mountpoint;\n} vfs_file_t;\n\ntypedef struct {\n   uint64_t num;\n   char path[512];\n   char mount_path[512];\n   uint32_t mountpoint;\n} vfs_dir_t;\n\ntypedef void* (*vfs_read_callback_t)(char* path, uint32_t offset, uint32_t size);\ntypedef char* (*vfs_read_dir_callback_t)(char* path, uint32_t offset);\n\n\n// Used to always store the last read/write attempt (used for kernel panic debugging)\nchar vfs_last_read_attempt[512];\n\nvfs_file_t* vfs_get_from_id(uint32_t id);\nvfs_dir_t* vfs_get_dir_from_id(uint32_t id);\nvoid* vfs_read(vfs_file_t* fp, uint32_t size);\nchar* vfs_dir_read(vfs_dir_t* dir, uint32_t offset);\nvoid vfs_seek(vfs_file_t* fp, uint32_t offset, int origin);\nvfs_file_t* vfs_open(char* path);\nvfs_dir_t* vfs_dir_open(char* path);\nint vfs_mount(char* path, vfs_read_callback_t read_callback, vfs_read_dir_callback_t read_dir_callback);\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/vmem.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n * Copyright © 2013 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n\nstruct vmem_context;\n\nstruct vmem_page\n{\n\tenum\n\t{\n\t\tVMEM_SECTION_STACK,   /* Initial stack */\n\t\tVMEM_SECTION_CODE,    /* Contains program code and is read-only */\n\t\tVMEM_SECTION_DATA,    /* Contains static data */\n\t\tVMEM_SECTION_HEAP,    /* Allocated by brk(2) at runtime */\n\t\tVMEM_SECTION_MMAP,    /* Allocated by mmap(2) at runtime */\n\t\tVMEM_SECTION_KERNEL,  /* Contains kernel-internal data */\n\t\tVMEM_SECTION_UNMAPPED /* Unmapped */\n\t} section;\n\n\tbool readonly:1;\n\tbool cow:1; /* Copy-on-Write mechanism */\n\tbool allocated:1;\n\n\tvoid *cow_src_addr;\n\tvoid *virt_addr;\n\tvoid *phys_addr;\n};\n\ntypedef void (*vmem_iterator_t)(struct vmem_context *, struct vmem_page *, uint32_t);\n\n/* Initialize vmem_kernelContext for paging_init() */\nvoid vmem_init();\nstruct vmem_context *vmem_kernelContext;\nstruct vmem_context *vmem_currentContext;\nstruct vmem_context *vmem_processContext;\nvoid *vmem_faultAddress;\n\n/* Some callbacks for magic functions */\nvoid (*vmem_applyPage)(struct vmem_context *, struct vmem_page *);\n\n/* Generate new page context */\nstruct vmem_context *vmem_new();\nstruct vmem_page *vmem_new_page();\n\nint vmem_add_page(struct vmem_context *ctx, struct vmem_page *pg);\n\nstruct vmem_page *vmem_get_page_phys(struct vmem_context *ctx, void *phys_addr);\nstruct vmem_page *vmem_get_page_virt(struct vmem_context *ctx, void *virt_addr);\nstruct vmem_page *vmem_get_page(struct vmem_context *ctx, uint32_t offset);\n\n/* Remove pages in a specific context by physical or virtual address */\nstruct vmem_page *vmem_rm_page_phys(struct vmem_context *ctx, void *phys_addr);\nstruct vmem_page *vmem_rm_page_virt(struct vmem_context *ctx, void *virt_addr);\n\n/* Iterator */\nint vmem_iterate(struct vmem_context *ctx, vmem_iterator_t callback);\n\nuint32_t vmem_count_pages(struct vmem_context *ctx);\nvoid vmem_dump_page(struct vmem_page *pg);\nvoid vmem_dump(struct vmem_context *ctx);\nvoid vmem_handle_fault(uint32_t code, void *addr, void *instruction);\n\n/* Get/Set cached paging context */\nvoid vmem_set_cache(struct vmem_context *ctx, void *cache);\nvoid *vmem_get_cache(struct vmem_context *ctx);\n\n#ifdef __i386__\n\t#define PAGE_SIZE 4096\n\t#define VMEM_ALIGN(x) (typeof(x))(((intptr_t)(x) & 0xFFFFF000) + 0x1000)\n\t#define VMEM_ALIGN_DOWN(x) (typeof(x))( \\\n\t\t((intptr_t)(x) - ((intptr_t)(x) % PAGE_SIZE)))\n#else\n\t#define PAGE_SIZE 0\n\t#define VMEM_ALIGN(x) (x)\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/wglew.h",
    "content": "/*\r\n** The OpenGL Extension Wrangler Library\r\n** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n** Copyright (C) 2002, Lev Povalahev\r\n** All rights reserved.\r\n** \r\n** Redistribution and use in source and binary forms, with or without \r\n** modification, are permitted provided that the following conditions are met:\r\n** \r\n** * Redistributions of source code must retain the above copyright notice, \r\n**   this list of conditions and the following disclaimer.\r\n** * Redistributions in binary form must reproduce the above copyright notice, \r\n**   this list of conditions and the following disclaimer in the documentation \r\n**   and/or other materials provided with the distribution.\r\n** * The name of the author may be used to endorse or promote products \r\n**   derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\n** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\n** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\n** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n** THE POSSIBILITY OF SUCH DAMAGE.\r\n*/\r\n\r\n/*\r\n** Copyright (c) 2007 The Khronos Group Inc.\r\n** \r\n** Permission is hereby granted, free of charge, to any person obtaining a\r\n** copy of this software and/or associated documentation files (the\r\n** \"Materials\"), to deal in the Materials without restriction, including\r\n** without limitation the rights to use, copy, modify, merge, publish,\r\n** distribute, sublicense, and/or sell copies of the Materials, and to\r\n** permit persons to whom the Materials are furnished to do so, subject to\r\n** the following conditions:\r\n** \r\n** The above copyright notice and this permission notice shall be included\r\n** in all copies or substantial portions of the Materials.\r\n** \r\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\r\n*/\r\n\r\n#ifndef __wglew_h__\r\n#define __wglew_h__\r\n#define __WGLEW_H__\r\n\r\n#ifdef __wglext_h_\r\n#error wglext.h included before wglew.h\r\n#endif\r\n\r\n#define __wglext_h_\r\n\r\n#if !defined(WINAPI)\r\n#  ifndef WIN32_LEAN_AND_MEAN\r\n#    define WIN32_LEAN_AND_MEAN 1\r\n#  endif\r\n#include <windows.h>\r\n#  undef WIN32_LEAN_AND_MEAN\r\n#endif\r\n\r\n/*\r\n * GLEW_STATIC needs to be set when using the static version.\r\n * GLEW_BUILD is set when building the DLL version.\r\n */\r\n#ifdef GLEW_STATIC\r\n#  define GLEWAPI extern\r\n#else\r\n#  ifdef GLEW_BUILD\r\n#    define GLEWAPI extern __declspec(dllexport)\r\n#  else\r\n#    define GLEWAPI extern __declspec(dllimport)\r\n#  endif\r\n#endif\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/* -------------------------- WGL_3DFX_multisample ------------------------- */\r\n\r\n#ifndef WGL_3DFX_multisample\r\n#define WGL_3DFX_multisample 1\r\n\r\n#define WGL_SAMPLE_BUFFERS_3DFX 0x2060\r\n#define WGL_SAMPLES_3DFX 0x2061\r\n\r\n#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample)\r\n\r\n#endif /* WGL_3DFX_multisample */\r\n\r\n/* ------------------------- WGL_3DL_stereo_control ------------------------ */\r\n\r\n#ifndef WGL_3DL_stereo_control\r\n#define WGL_3DL_stereo_control 1\r\n\r\n#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055\r\n#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056\r\n#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057\r\n#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058\r\n\r\ntypedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState);\r\n\r\n#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL)\r\n\r\n#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control)\r\n\r\n#endif /* WGL_3DL_stereo_control */\r\n\r\n/* ------------------------ WGL_AMD_gpu_association ------------------------ */\r\n\r\n#ifndef WGL_AMD_gpu_association\r\n#define WGL_AMD_gpu_association 1\r\n\r\n#define WGL_GPU_VENDOR_AMD 0x1F00\r\n#define WGL_GPU_RENDERER_STRING_AMD 0x1F01\r\n#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02\r\n#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2\r\n#define WGL_GPU_RAM_AMD 0x21A3\r\n#define WGL_GPU_CLOCK_AMD 0x21A4\r\n#define WGL_GPU_NUM_PIPES_AMD 0x21A5\r\n#define WGL_GPU_NUM_SIMD_AMD 0x21A6\r\n#define WGL_GPU_NUM_RB_AMD 0x21A7\r\n#define WGL_GPU_NUM_SPI_AMD 0x21A8\r\n\r\ntypedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\r\ntypedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id);\r\ntypedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList);\r\ntypedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc);\r\ntypedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc);\r\ntypedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void);\r\ntypedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids);\r\ntypedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data);\r\ntypedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc);\r\n\r\n#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD)\r\n#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD)\r\n#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD)\r\n#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD)\r\n#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD)\r\n#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD)\r\n#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD)\r\n#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD)\r\n#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD)\r\n\r\n#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association)\r\n\r\n#endif /* WGL_AMD_gpu_association */\r\n\r\n/* ------------------------- WGL_ARB_buffer_region ------------------------- */\r\n\r\n#ifndef WGL_ARB_buffer_region\r\n#define WGL_ARB_buffer_region 1\r\n\r\n#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001\r\n#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002\r\n#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004\r\n#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008\r\n\r\ntypedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType);\r\ntypedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);\r\ntypedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);\r\ntypedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);\r\n\r\n#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB)\r\n#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB)\r\n#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB)\r\n#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB)\r\n\r\n#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region)\r\n\r\n#endif /* WGL_ARB_buffer_region */\r\n\r\n/* ------------------------- WGL_ARB_create_context ------------------------ */\r\n\r\n#ifndef WGL_ARB_create_context\r\n#define WGL_ARB_create_context 1\r\n\r\n#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001\r\n#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002\r\n#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091\r\n#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092\r\n#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093\r\n#define WGL_CONTEXT_FLAGS_ARB 0x2094\r\n#define ERROR_INVALID_VERSION_ARB 0x2095\r\n#define ERROR_INVALID_PROFILE_ARB 0x2096\r\n\r\ntypedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList);\r\n\r\n#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB)\r\n\r\n#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context)\r\n\r\n#endif /* WGL_ARB_create_context */\r\n\r\n/* --------------------- WGL_ARB_create_context_profile -------------------- */\r\n\r\n#ifndef WGL_ARB_create_context_profile\r\n#define WGL_ARB_create_context_profile 1\r\n\r\n#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\r\n#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\r\n#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126\r\n\r\n#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile)\r\n\r\n#endif /* WGL_ARB_create_context_profile */\r\n\r\n/* ------------------- WGL_ARB_create_context_robustness ------------------- */\r\n\r\n#ifndef WGL_ARB_create_context_robustness\r\n#define WGL_ARB_create_context_robustness 1\r\n\r\n#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004\r\n#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252\r\n#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\r\n#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261\r\n\r\n#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness)\r\n\r\n#endif /* WGL_ARB_create_context_robustness */\r\n\r\n/* ----------------------- WGL_ARB_extensions_string ----------------------- */\r\n\r\n#ifndef WGL_ARB_extensions_string\r\n#define WGL_ARB_extensions_string 1\r\n\r\ntypedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);\r\n\r\n#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB)\r\n\r\n#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string)\r\n\r\n#endif /* WGL_ARB_extensions_string */\r\n\r\n/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */\r\n\r\n#ifndef WGL_ARB_framebuffer_sRGB\r\n#define WGL_ARB_framebuffer_sRGB 1\r\n\r\n#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9\r\n\r\n#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB)\r\n\r\n#endif /* WGL_ARB_framebuffer_sRGB */\r\n\r\n/* ----------------------- WGL_ARB_make_current_read ----------------------- */\r\n\r\n#ifndef WGL_ARB_make_current_read\r\n#define WGL_ARB_make_current_read 1\r\n\r\n#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043\r\n#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054\r\n\r\ntypedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);\r\n\r\n#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB)\r\n#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB)\r\n\r\n#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read)\r\n\r\n#endif /* WGL_ARB_make_current_read */\r\n\r\n/* -------------------------- WGL_ARB_multisample -------------------------- */\r\n\r\n#ifndef WGL_ARB_multisample\r\n#define WGL_ARB_multisample 1\r\n\r\n#define WGL_SAMPLE_BUFFERS_ARB 0x2041\r\n#define WGL_SAMPLES_ARB 0x2042\r\n\r\n#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample)\r\n\r\n#endif /* WGL_ARB_multisample */\r\n\r\n/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */\r\n\r\n#ifndef WGL_ARB_pbuffer\r\n#define WGL_ARB_pbuffer 1\r\n\r\n#define WGL_DRAW_TO_PBUFFER_ARB 0x202D\r\n#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E\r\n#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F\r\n#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030\r\n#define WGL_PBUFFER_LARGEST_ARB 0x2033\r\n#define WGL_PBUFFER_WIDTH_ARB 0x2034\r\n#define WGL_PBUFFER_HEIGHT_ARB 0x2035\r\n#define WGL_PBUFFER_LOST_ARB 0x2036\r\n\r\nDECLARE_HANDLE(HPBUFFERARB);\r\n\r\ntypedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);\r\ntypedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);\r\ntypedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue);\r\ntypedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);\r\n\r\n#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB)\r\n#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB)\r\n#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB)\r\n#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB)\r\n#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB)\r\n\r\n#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer)\r\n\r\n#endif /* WGL_ARB_pbuffer */\r\n\r\n/* -------------------------- WGL_ARB_pixel_format ------------------------- */\r\n\r\n#ifndef WGL_ARB_pixel_format\r\n#define WGL_ARB_pixel_format 1\r\n\r\n#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000\r\n#define WGL_DRAW_TO_WINDOW_ARB 0x2001\r\n#define WGL_DRAW_TO_BITMAP_ARB 0x2002\r\n#define WGL_ACCELERATION_ARB 0x2003\r\n#define WGL_NEED_PALETTE_ARB 0x2004\r\n#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005\r\n#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006\r\n#define WGL_SWAP_METHOD_ARB 0x2007\r\n#define WGL_NUMBER_OVERLAYS_ARB 0x2008\r\n#define WGL_NUMBER_UNDERLAYS_ARB 0x2009\r\n#define WGL_TRANSPARENT_ARB 0x200A\r\n#define WGL_SHARE_DEPTH_ARB 0x200C\r\n#define WGL_SHARE_STENCIL_ARB 0x200D\r\n#define WGL_SHARE_ACCUM_ARB 0x200E\r\n#define WGL_SUPPORT_GDI_ARB 0x200F\r\n#define WGL_SUPPORT_OPENGL_ARB 0x2010\r\n#define WGL_DOUBLE_BUFFER_ARB 0x2011\r\n#define WGL_STEREO_ARB 0x2012\r\n#define WGL_PIXEL_TYPE_ARB 0x2013\r\n#define WGL_COLOR_BITS_ARB 0x2014\r\n#define WGL_RED_BITS_ARB 0x2015\r\n#define WGL_RED_SHIFT_ARB 0x2016\r\n#define WGL_GREEN_BITS_ARB 0x2017\r\n#define WGL_GREEN_SHIFT_ARB 0x2018\r\n#define WGL_BLUE_BITS_ARB 0x2019\r\n#define WGL_BLUE_SHIFT_ARB 0x201A\r\n#define WGL_ALPHA_BITS_ARB 0x201B\r\n#define WGL_ALPHA_SHIFT_ARB 0x201C\r\n#define WGL_ACCUM_BITS_ARB 0x201D\r\n#define WGL_ACCUM_RED_BITS_ARB 0x201E\r\n#define WGL_ACCUM_GREEN_BITS_ARB 0x201F\r\n#define WGL_ACCUM_BLUE_BITS_ARB 0x2020\r\n#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021\r\n#define WGL_DEPTH_BITS_ARB 0x2022\r\n#define WGL_STENCIL_BITS_ARB 0x2023\r\n#define WGL_AUX_BUFFERS_ARB 0x2024\r\n#define WGL_NO_ACCELERATION_ARB 0x2025\r\n#define WGL_GENERIC_ACCELERATION_ARB 0x2026\r\n#define WGL_FULL_ACCELERATION_ARB 0x2027\r\n#define WGL_SWAP_EXCHANGE_ARB 0x2028\r\n#define WGL_SWAP_COPY_ARB 0x2029\r\n#define WGL_SWAP_UNDEFINED_ARB 0x202A\r\n#define WGL_TYPE_RGBA_ARB 0x202B\r\n#define WGL_TYPE_COLORINDEX_ARB 0x202C\r\n#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037\r\n#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038\r\n#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039\r\n#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A\r\n#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B\r\n\r\ntypedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues);\r\n\r\n#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB)\r\n#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB)\r\n#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB)\r\n\r\n#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format)\r\n\r\n#endif /* WGL_ARB_pixel_format */\r\n\r\n/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */\r\n\r\n#ifndef WGL_ARB_pixel_format_float\r\n#define WGL_ARB_pixel_format_float 1\r\n\r\n#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0\r\n\r\n#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float)\r\n\r\n#endif /* WGL_ARB_pixel_format_float */\r\n\r\n/* ------------------------- WGL_ARB_render_texture ------------------------ */\r\n\r\n#ifndef WGL_ARB_render_texture\r\n#define WGL_ARB_render_texture 1\r\n\r\n#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070\r\n#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071\r\n#define WGL_TEXTURE_FORMAT_ARB 0x2072\r\n#define WGL_TEXTURE_TARGET_ARB 0x2073\r\n#define WGL_MIPMAP_TEXTURE_ARB 0x2074\r\n#define WGL_TEXTURE_RGB_ARB 0x2075\r\n#define WGL_TEXTURE_RGBA_ARB 0x2076\r\n#define WGL_NO_TEXTURE_ARB 0x2077\r\n#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078\r\n#define WGL_TEXTURE_1D_ARB 0x2079\r\n#define WGL_TEXTURE_2D_ARB 0x207A\r\n#define WGL_MIPMAP_LEVEL_ARB 0x207B\r\n#define WGL_CUBE_MAP_FACE_ARB 0x207C\r\n#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D\r\n#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E\r\n#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F\r\n#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080\r\n#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081\r\n#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082\r\n#define WGL_FRONT_LEFT_ARB 0x2083\r\n#define WGL_FRONT_RIGHT_ARB 0x2084\r\n#define WGL_BACK_LEFT_ARB 0x2085\r\n#define WGL_BACK_RIGHT_ARB 0x2086\r\n#define WGL_AUX0_ARB 0x2087\r\n#define WGL_AUX1_ARB 0x2088\r\n#define WGL_AUX2_ARB 0x2089\r\n#define WGL_AUX3_ARB 0x208A\r\n#define WGL_AUX4_ARB 0x208B\r\n#define WGL_AUX5_ARB 0x208C\r\n#define WGL_AUX6_ARB 0x208D\r\n#define WGL_AUX7_ARB 0x208E\r\n#define WGL_AUX8_ARB 0x208F\r\n#define WGL_AUX9_ARB 0x2090\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList);\r\n\r\n#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB)\r\n#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB)\r\n#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB)\r\n\r\n#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture)\r\n\r\n#endif /* WGL_ARB_render_texture */\r\n\r\n/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */\r\n\r\n#ifndef WGL_ATI_pixel_format_float\r\n#define WGL_ATI_pixel_format_float 1\r\n\r\n#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0\r\n#define GL_RGBA_FLOAT_MODE_ATI 0x8820\r\n#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835\r\n\r\n#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float)\r\n\r\n#endif /* WGL_ATI_pixel_format_float */\r\n\r\n/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */\r\n\r\n#ifndef WGL_ATI_render_texture_rectangle\r\n#define WGL_ATI_render_texture_rectangle 1\r\n\r\n#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5\r\n\r\n#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle)\r\n\r\n#endif /* WGL_ATI_render_texture_rectangle */\r\n\r\n/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */\r\n\r\n#ifndef WGL_EXT_create_context_es2_profile\r\n#define WGL_EXT_create_context_es2_profile 1\r\n\r\n#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004\r\n\r\n#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile)\r\n\r\n#endif /* WGL_EXT_create_context_es2_profile */\r\n\r\n/* -------------------------- WGL_EXT_depth_float -------------------------- */\r\n\r\n#ifndef WGL_EXT_depth_float\r\n#define WGL_EXT_depth_float 1\r\n\r\n#define WGL_DEPTH_FLOAT_EXT 0x2040\r\n\r\n#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float)\r\n\r\n#endif /* WGL_EXT_depth_float */\r\n\r\n/* ---------------------- WGL_EXT_display_color_table ---------------------- */\r\n\r\n#ifndef WGL_EXT_display_color_table\r\n#define WGL_EXT_display_color_table 1\r\n\r\ntypedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r\ntypedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r\ntypedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r\ntypedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length);\r\n\r\n#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT)\r\n#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT)\r\n#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT)\r\n#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT)\r\n\r\n#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table)\r\n\r\n#endif /* WGL_EXT_display_color_table */\r\n\r\n/* ----------------------- WGL_EXT_extensions_string ----------------------- */\r\n\r\n#ifndef WGL_EXT_extensions_string\r\n#define WGL_EXT_extensions_string 1\r\n\r\ntypedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void);\r\n\r\n#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT)\r\n\r\n#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string)\r\n\r\n#endif /* WGL_EXT_extensions_string */\r\n\r\n/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */\r\n\r\n#ifndef WGL_EXT_framebuffer_sRGB\r\n#define WGL_EXT_framebuffer_sRGB 1\r\n\r\n#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9\r\n\r\n#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB)\r\n\r\n#endif /* WGL_EXT_framebuffer_sRGB */\r\n\r\n/* ----------------------- WGL_EXT_make_current_read ----------------------- */\r\n\r\n#ifndef WGL_EXT_make_current_read\r\n#define WGL_EXT_make_current_read 1\r\n\r\n#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043\r\n\r\ntypedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);\r\n\r\n#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT)\r\n#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT)\r\n\r\n#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read)\r\n\r\n#endif /* WGL_EXT_make_current_read */\r\n\r\n/* -------------------------- WGL_EXT_multisample -------------------------- */\r\n\r\n#ifndef WGL_EXT_multisample\r\n#define WGL_EXT_multisample 1\r\n\r\n#define WGL_SAMPLE_BUFFERS_EXT 0x2041\r\n#define WGL_SAMPLES_EXT 0x2042\r\n\r\n#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample)\r\n\r\n#endif /* WGL_EXT_multisample */\r\n\r\n/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */\r\n\r\n#ifndef WGL_EXT_pbuffer\r\n#define WGL_EXT_pbuffer 1\r\n\r\n#define WGL_DRAW_TO_PBUFFER_EXT 0x202D\r\n#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E\r\n#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F\r\n#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030\r\n#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031\r\n#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032\r\n#define WGL_PBUFFER_LARGEST_EXT 0x2033\r\n#define WGL_PBUFFER_WIDTH_EXT 0x2034\r\n#define WGL_PBUFFER_HEIGHT_EXT 0x2035\r\n\r\nDECLARE_HANDLE(HPBUFFEREXT);\r\n\r\ntypedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);\r\ntypedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer);\r\ntypedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue);\r\ntypedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC);\r\n\r\n#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT)\r\n#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT)\r\n#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT)\r\n#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT)\r\n#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT)\r\n\r\n#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer)\r\n\r\n#endif /* WGL_EXT_pbuffer */\r\n\r\n/* -------------------------- WGL_EXT_pixel_format ------------------------- */\r\n\r\n#ifndef WGL_EXT_pixel_format\r\n#define WGL_EXT_pixel_format 1\r\n\r\n#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000\r\n#define WGL_DRAW_TO_WINDOW_EXT 0x2001\r\n#define WGL_DRAW_TO_BITMAP_EXT 0x2002\r\n#define WGL_ACCELERATION_EXT 0x2003\r\n#define WGL_NEED_PALETTE_EXT 0x2004\r\n#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005\r\n#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006\r\n#define WGL_SWAP_METHOD_EXT 0x2007\r\n#define WGL_NUMBER_OVERLAYS_EXT 0x2008\r\n#define WGL_NUMBER_UNDERLAYS_EXT 0x2009\r\n#define WGL_TRANSPARENT_EXT 0x200A\r\n#define WGL_TRANSPARENT_VALUE_EXT 0x200B\r\n#define WGL_SHARE_DEPTH_EXT 0x200C\r\n#define WGL_SHARE_STENCIL_EXT 0x200D\r\n#define WGL_SHARE_ACCUM_EXT 0x200E\r\n#define WGL_SUPPORT_GDI_EXT 0x200F\r\n#define WGL_SUPPORT_OPENGL_EXT 0x2010\r\n#define WGL_DOUBLE_BUFFER_EXT 0x2011\r\n#define WGL_STEREO_EXT 0x2012\r\n#define WGL_PIXEL_TYPE_EXT 0x2013\r\n#define WGL_COLOR_BITS_EXT 0x2014\r\n#define WGL_RED_BITS_EXT 0x2015\r\n#define WGL_RED_SHIFT_EXT 0x2016\r\n#define WGL_GREEN_BITS_EXT 0x2017\r\n#define WGL_GREEN_SHIFT_EXT 0x2018\r\n#define WGL_BLUE_BITS_EXT 0x2019\r\n#define WGL_BLUE_SHIFT_EXT 0x201A\r\n#define WGL_ALPHA_BITS_EXT 0x201B\r\n#define WGL_ALPHA_SHIFT_EXT 0x201C\r\n#define WGL_ACCUM_BITS_EXT 0x201D\r\n#define WGL_ACCUM_RED_BITS_EXT 0x201E\r\n#define WGL_ACCUM_GREEN_BITS_EXT 0x201F\r\n#define WGL_ACCUM_BLUE_BITS_EXT 0x2020\r\n#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021\r\n#define WGL_DEPTH_BITS_EXT 0x2022\r\n#define WGL_STENCIL_BITS_EXT 0x2023\r\n#define WGL_AUX_BUFFERS_EXT 0x2024\r\n#define WGL_NO_ACCELERATION_EXT 0x2025\r\n#define WGL_GENERIC_ACCELERATION_EXT 0x2026\r\n#define WGL_FULL_ACCELERATION_EXT 0x2027\r\n#define WGL_SWAP_EXCHANGE_EXT 0x2028\r\n#define WGL_SWAP_COPY_EXT 0x2029\r\n#define WGL_SWAP_UNDEFINED_EXT 0x202A\r\n#define WGL_TYPE_RGBA_EXT 0x202B\r\n#define WGL_TYPE_COLORINDEX_EXT 0x202C\r\n\r\ntypedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues);\r\n\r\n#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT)\r\n#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT)\r\n#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT)\r\n\r\n#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format)\r\n\r\n#endif /* WGL_EXT_pixel_format */\r\n\r\n/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */\r\n\r\n#ifndef WGL_EXT_pixel_format_packed_float\r\n#define WGL_EXT_pixel_format_packed_float 1\r\n\r\n#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8\r\n\r\n#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float)\r\n\r\n#endif /* WGL_EXT_pixel_format_packed_float */\r\n\r\n/* -------------------------- WGL_EXT_swap_control ------------------------- */\r\n\r\n#ifndef WGL_EXT_swap_control\r\n#define WGL_EXT_swap_control 1\r\n\r\ntypedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);\r\ntypedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);\r\n\r\n#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT)\r\n#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT)\r\n\r\n#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control)\r\n\r\n#endif /* WGL_EXT_swap_control */\r\n\r\n/* --------------------- WGL_I3D_digital_video_control --------------------- */\r\n\r\n#ifndef WGL_I3D_digital_video_control\r\n#define WGL_I3D_digital_video_control 1\r\n\r\n#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050\r\n#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051\r\n#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052\r\n#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053\r\n\r\ntypedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);\r\ntypedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);\r\n\r\n#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D)\r\n#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D)\r\n\r\n#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control)\r\n\r\n#endif /* WGL_I3D_digital_video_control */\r\n\r\n/* ----------------------------- WGL_I3D_gamma ----------------------------- */\r\n\r\n#ifndef WGL_I3D_gamma\r\n#define WGL_I3D_gamma 1\r\n\r\n#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E\r\n#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F\r\n\r\ntypedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue);\r\ntypedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);\r\ntypedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue);\r\ntypedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);\r\n\r\n#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D)\r\n#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D)\r\n#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D)\r\n#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D)\r\n\r\n#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma)\r\n\r\n#endif /* WGL_I3D_gamma */\r\n\r\n/* ---------------------------- WGL_I3D_genlock ---------------------------- */\r\n\r\n#ifndef WGL_I3D_genlock\r\n#define WGL_I3D_genlock 1\r\n\r\n#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044\r\n#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045\r\n#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046\r\n#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047\r\n#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048\r\n#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049\r\n#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A\r\n#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B\r\n#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C\r\n\r\ntypedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC);\r\ntypedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource);\r\ntypedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay);\r\n\r\n#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D)\r\n#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D)\r\n#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D)\r\n#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D)\r\n#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D)\r\n#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D)\r\n#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D)\r\n#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D)\r\n#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D)\r\n#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D)\r\n#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D)\r\n#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D)\r\n\r\n#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock)\r\n\r\n#endif /* WGL_I3D_genlock */\r\n\r\n/* -------------------------- WGL_I3D_image_buffer ------------------------- */\r\n\r\n#ifndef WGL_I3D_image_buffer\r\n#define WGL_I3D_image_buffer 1\r\n\r\n#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001\r\n#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002\r\n\r\ntypedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count);\r\ntypedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags);\r\ntypedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count);\r\n\r\n#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D)\r\n#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D)\r\n#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D)\r\n#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D)\r\n\r\n#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer)\r\n\r\n#endif /* WGL_I3D_image_buffer */\r\n\r\n/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */\r\n\r\n#ifndef WGL_I3D_swap_frame_lock\r\n#define WGL_I3D_swap_frame_lock 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag);\r\n\r\n#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D)\r\n#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D)\r\n#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D)\r\n#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D)\r\n\r\n#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock)\r\n\r\n#endif /* WGL_I3D_swap_frame_lock */\r\n\r\n/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */\r\n\r\n#ifndef WGL_I3D_swap_frame_usage\r\n#define WGL_I3D_swap_frame_usage 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void);\r\ntypedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void);\r\ntypedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);\r\n\r\n#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D)\r\n#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D)\r\n#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D)\r\n#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D)\r\n\r\n#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage)\r\n\r\n#endif /* WGL_I3D_swap_frame_usage */\r\n\r\n/* --------------------------- WGL_NV_DX_interop --------------------------- */\r\n\r\n#ifndef WGL_NV_DX_interop\r\n#define WGL_NV_DX_interop 1\r\n\r\n#define WGL_ACCESS_READ_ONLY_NV 0x0000\r\n#define WGL_ACCESS_READ_WRITE_NV 0x0001\r\n#define WGL_ACCESS_WRITE_DISCARD_NV 0x0002\r\n\r\ntypedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice);\r\ntypedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects);\r\ntypedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access);\r\ntypedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice);\r\ntypedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access);\r\ntypedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle);\r\ntypedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects);\r\ntypedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject);\r\n\r\n#define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV)\r\n#define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV)\r\n#define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV)\r\n#define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV)\r\n#define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV)\r\n#define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV)\r\n#define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV)\r\n#define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV)\r\n\r\n#define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop)\r\n\r\n#endif /* WGL_NV_DX_interop */\r\n\r\n/* --------------------------- WGL_NV_copy_image --------------------------- */\r\n\r\n#ifndef WGL_NV_copy_image\r\n#define WGL_NV_copy_image 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);\r\n\r\n#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV)\r\n\r\n#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image)\r\n\r\n#endif /* WGL_NV_copy_image */\r\n\r\n/* -------------------------- WGL_NV_float_buffer -------------------------- */\r\n\r\n#ifndef WGL_NV_float_buffer\r\n#define WGL_NV_float_buffer 1\r\n\r\n#define WGL_FLOAT_COMPONENTS_NV 0x20B0\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4\r\n#define WGL_TEXTURE_FLOAT_R_NV 0x20B5\r\n#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6\r\n#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7\r\n#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8\r\n\r\n#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer)\r\n\r\n#endif /* WGL_NV_float_buffer */\r\n\r\n/* -------------------------- WGL_NV_gpu_affinity -------------------------- */\r\n\r\n#ifndef WGL_NV_gpu_affinity\r\n#define WGL_NV_gpu_affinity 1\r\n\r\n#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0\r\n#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1\r\n\r\nDECLARE_HANDLE(HGPUNV);\r\ntypedef struct _GPU_DEVICE {\r\n  DWORD cb; \r\n  CHAR DeviceName[32]; \r\n  CHAR DeviceString[128]; \r\n  DWORD Flags; \r\n  RECT rcVirtualScreen; \r\n} GPU_DEVICE, *PGPU_DEVICE;\r\n\r\ntypedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList);\r\ntypedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc);\r\ntypedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);\r\ntypedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu);\r\ntypedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu);\r\n\r\n#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV)\r\n#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV)\r\n#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV)\r\n#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV)\r\n#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV)\r\n\r\n#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity)\r\n\r\n#endif /* WGL_NV_gpu_affinity */\r\n\r\n/* ---------------------- WGL_NV_multisample_coverage ---------------------- */\r\n\r\n#ifndef WGL_NV_multisample_coverage\r\n#define WGL_NV_multisample_coverage 1\r\n\r\n#define WGL_COVERAGE_SAMPLES_NV 0x2042\r\n#define WGL_COLOR_SAMPLES_NV 0x20B9\r\n\r\n#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage)\r\n\r\n#endif /* WGL_NV_multisample_coverage */\r\n\r\n/* -------------------------- WGL_NV_present_video ------------------------- */\r\n\r\n#ifndef WGL_NV_present_video\r\n#define WGL_NV_present_video 1\r\n\r\n#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0\r\n\r\nDECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList);\r\ntypedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue);\r\n\r\n#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV)\r\n#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV)\r\n#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV)\r\n\r\n#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video)\r\n\r\n#endif /* WGL_NV_present_video */\r\n\r\n/* ---------------------- WGL_NV_render_depth_texture ---------------------- */\r\n\r\n#ifndef WGL_NV_render_depth_texture\r\n#define WGL_NV_render_depth_texture 1\r\n\r\n#define WGL_NO_TEXTURE_ARB 0x2077\r\n#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4\r\n#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5\r\n#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6\r\n#define WGL_DEPTH_COMPONENT_NV 0x20A7\r\n\r\n#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture)\r\n\r\n#endif /* WGL_NV_render_depth_texture */\r\n\r\n/* -------------------- WGL_NV_render_texture_rectangle -------------------- */\r\n\r\n#ifndef WGL_NV_render_texture_rectangle\r\n#define WGL_NV_render_texture_rectangle 1\r\n\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1\r\n#define WGL_TEXTURE_RECTANGLE_NV 0x20A2\r\n\r\n#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle)\r\n\r\n#endif /* WGL_NV_render_texture_rectangle */\r\n\r\n/* --------------------------- WGL_NV_swap_group --------------------------- */\r\n\r\n#ifndef WGL_NV_swap_group\r\n#define WGL_NV_swap_group 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier);\r\ntypedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier);\r\ntypedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);\r\n\r\n#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV)\r\n#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV)\r\n#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV)\r\n#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV)\r\n#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV)\r\n#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV)\r\n\r\n#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group)\r\n\r\n#endif /* WGL_NV_swap_group */\r\n\r\n/* ----------------------- WGL_NV_vertex_array_range ----------------------- */\r\n\r\n#ifndef WGL_NV_vertex_array_range\r\n#define WGL_NV_vertex_array_range 1\r\n\r\ntypedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);\r\ntypedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer);\r\n\r\n#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV)\r\n#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV)\r\n\r\n#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range)\r\n\r\n#endif /* WGL_NV_vertex_array_range */\r\n\r\n/* -------------------------- WGL_NV_video_capture ------------------------- */\r\n\r\n#ifndef WGL_NV_video_capture\r\n#define WGL_NV_video_capture 1\r\n\r\n#define WGL_UNIQUE_ID_NV 0x20CE\r\n#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF\r\n\r\nDECLARE_HANDLE(HVIDEOINPUTDEVICENV);\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);\r\ntypedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList);\r\ntypedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);\r\n\r\n#define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV)\r\n#define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV)\r\n#define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV)\r\n#define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV)\r\n#define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV)\r\n\r\n#define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture)\r\n\r\n#endif /* WGL_NV_video_capture */\r\n\r\n/* -------------------------- WGL_NV_video_output -------------------------- */\r\n\r\n#ifndef WGL_NV_video_output\r\n#define WGL_NV_video_output 1\r\n\r\n#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0\r\n#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1\r\n#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2\r\n#define WGL_VIDEO_OUT_COLOR_NV 0x20C3\r\n#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4\r\n#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5\r\n#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6\r\n#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7\r\n#define WGL_VIDEO_OUT_FRAME 0x20C8\r\n#define WGL_VIDEO_OUT_FIELD_1 0x20C9\r\n#define WGL_VIDEO_OUT_FIELD_2 0x20CA\r\n#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB\r\n#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC\r\n\r\nDECLARE_HANDLE(HPVIDEODEV);\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice);\r\ntypedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock);\r\n\r\n#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV)\r\n#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV)\r\n#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV)\r\n#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV)\r\n#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV)\r\n#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV)\r\n\r\n#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output)\r\n\r\n#endif /* WGL_NV_video_output */\r\n\r\n/* -------------------------- WGL_OML_sync_control ------------------------- */\r\n\r\n#ifndef WGL_OML_sync_control\r\n#define WGL_OML_sync_control 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator);\r\ntypedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc);\r\ntypedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);\r\ntypedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);\r\ntypedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc);\r\ntypedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc);\r\n\r\n#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML)\r\n#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML)\r\n#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML)\r\n#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML)\r\n#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML)\r\n#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML)\r\n\r\n#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control)\r\n\r\n#endif /* WGL_OML_sync_control */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n#ifdef GLEW_MX\r\n#define WGLEW_EXPORT\r\n#else\r\n#define WGLEW_EXPORT GLEWAPI\r\n#endif /* GLEW_MX */\r\n\r\n#ifdef GLEW_MX\r\nstruct WGLEWContextStruct\r\n{\r\n#endif /* GLEW_MX */\r\n\r\nWGLEW_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL;\r\n\r\nWGLEW_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD;\r\nWGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD;\r\nWGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD;\r\nWGLEW_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD;\r\nWGLEW_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD;\r\nWGLEW_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD;\r\nWGLEW_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD;\r\nWGLEW_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD;\r\nWGLEW_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB;\r\nWGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB;\r\nWGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB;\r\nWGLEW_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB;\r\n\r\nWGLEW_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB;\r\n\r\nWGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB;\r\n\r\nWGLEW_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB;\r\nWGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB;\r\nWGLEW_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB;\r\nWGLEW_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB;\r\nWGLEW_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB;\r\nWGLEW_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB;\r\n\r\nWGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB;\r\n\r\nWGLEW_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB;\r\nWGLEW_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB;\r\nWGLEW_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB;\r\n\r\nWGLEW_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT;\r\nWGLEW_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT;\r\nWGLEW_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT;\r\nWGLEW_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT;\r\nWGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT;\r\nWGLEW_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT;\r\nWGLEW_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT;\r\nWGLEW_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT;\r\nWGLEW_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT;\r\n\r\nWGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT;\r\nWGLEW_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D;\r\nWGLEW_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D;\r\n\r\nWGLEW_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D;\r\nWGLEW_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D;\r\nWGLEW_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D;\r\nWGLEW_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D;\r\n\r\nWGLEW_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D;\r\nWGLEW_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D;\r\nWGLEW_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D;\r\nWGLEW_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D;\r\n\r\nWGLEW_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D;\r\nWGLEW_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D;\r\nWGLEW_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D;\r\nWGLEW_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D;\r\n\r\nWGLEW_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D;\r\nWGLEW_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D;\r\nWGLEW_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D;\r\nWGLEW_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D;\r\n\r\nWGLEW_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D;\r\nWGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D;\r\nWGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D;\r\nWGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D;\r\n\r\nWGLEW_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV;\r\nWGLEW_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV;\r\nWGLEW_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV;\r\nWGLEW_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV;\r\nWGLEW_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV;\r\nWGLEW_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV;\r\nWGLEW_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV;\r\nWGLEW_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV;\r\n\r\nWGLEW_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV;\r\nWGLEW_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV;\r\nWGLEW_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV;\r\nWGLEW_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV;\r\nWGLEW_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV;\r\nWGLEW_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV;\r\nWGLEW_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV;\r\nWGLEW_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV;\r\nWGLEW_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV;\r\nWGLEW_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV;\r\nWGLEW_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV;\r\nWGLEW_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV;\r\n\r\nWGLEW_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV;\r\nWGLEW_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV;\r\nWGLEW_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV;\r\nWGLEW_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV;\r\nWGLEW_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV;\r\nWGLEW_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV;\r\nWGLEW_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV;\r\nWGLEW_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV;\r\nWGLEW_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV;\r\nWGLEW_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV;\r\nWGLEW_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV;\r\n\r\nWGLEW_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML;\r\nWGLEW_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML;\r\nWGLEW_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML;\r\nWGLEW_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML;\r\nWGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML;\r\nWGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML;\r\nWGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample;\r\nWGLEW_EXPORT GLboolean __WGLEW_3DL_stereo_control;\r\nWGLEW_EXPORT GLboolean __WGLEW_AMD_gpu_association;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_create_context;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_profile;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_robustness;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_multisample;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_pbuffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture;\r\nWGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_make_current_read;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_multisample;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_pbuffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_swap_control;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_digital_video_control;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_gamma;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_genlock;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_DX_interop;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_copy_image;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_gpu_affinity;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_multisample_coverage;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_present_video;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_swap_group;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_vertex_array_range;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_video_capture;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_video_output;\r\nWGLEW_EXPORT GLboolean __WGLEW_OML_sync_control;\r\n\r\n#ifdef GLEW_MX\r\n}; /* WGLEWContextStruct */\r\n#endif /* GLEW_MX */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n#ifdef GLEW_MX\r\n\r\ntypedef struct WGLEWContextStruct WGLEWContext;\r\nGLEWAPI GLenum wglewContextInit (WGLEWContext* ctx);\r\nGLEWAPI GLboolean wglewContextIsSupported (const WGLEWContext* ctx, const char* name);\r\n\r\n#define wglewInit() wglewContextInit(wglewGetContext())\r\n#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x)\r\n\r\n#define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x))\r\n#define WGLEW_GET_FUN(x) wglewGetContext()->x\r\n\r\n#else /* GLEW_MX */\r\n\r\n#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x)\r\n#define WGLEW_GET_FUN(x) x\r\n\r\nGLEWAPI GLboolean wglewIsSupported (const char* name);\r\n\r\n#endif /* GLEW_MX */\r\n\r\nGLEWAPI GLboolean wglewGetExtension (const char* name);\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#undef GLEWAPI\r\n\r\n#endif /* __wglew_h__ */\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/C/yajl.c",
    "content": "/*\n * Copyright 2010, Lloyd Hilaiel.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n * \n *  1. Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * \n *  2. Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in\n *     the documentation and/or other materials provided with the\n *     distribution.\n * \n *  3. Neither the name of Lloyd Hilaiel nor the names of its\n *     contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */ \n\n#include \"api/yajl_parse.h\"\n#include \"yajl_lex.h\"\n#include \"yajl_parser.h\"\n#include \"yajl_alloc.h\"\n\n#include <stdlib.h>\n#include <string.h>\n#include <assert.h>\n\nconst char *\nyajl_status_to_string(yajl_status stat)\n{\n    const char * statStr = \"unknown\";\n    switch (stat) {\n        case yajl_status_ok:\n            statStr = \"ok, no error\";\n            break;\n        case yajl_status_client_canceled:\n            statStr = \"client canceled parse\";\n            break;\n        case yajl_status_insufficient_data:\n            statStr = \"eof was met before the parse could complete\";\n            break;\n        case yajl_status_error:\n            statStr = \"parse error\";\n            break;\n    }\n    return statStr;\n}\n\nyajl_handle\nyajl_alloc(const yajl_callbacks * callbacks,\n           const yajl_parser_config * config,\n           const yajl_alloc_funcs * afs,\n           void * ctx)\n{\n    unsigned int allowComments = 0;\n    unsigned int validateUTF8 = 0;\n    yajl_handle hand = NULL;\n    yajl_alloc_funcs afsBuffer;\n    \n    /* first order of business is to set up memory allocation routines */\n    if (afs != NULL) {\n        if (afs->malloc == NULL || afs->realloc == NULL || afs->free == NULL)\n        {\n            return NULL;\n        }\n    } else {\n        yajl_set_default_alloc_funcs(&afsBuffer);\n        afs = &afsBuffer;\n    }\n\n    hand = (yajl_handle) YA_MALLOC(afs, sizeof(struct yajl_handle_t));\n\n    /* copy in pointers to allocation routines */\n    memcpy((void *) &(hand->alloc), (void *) afs, sizeof(yajl_alloc_funcs));\n\n    if (config != NULL) {\n        allowComments = config->allowComments;\n        validateUTF8 = config->checkUTF8;\n    }\n\n    hand->callbacks = callbacks;\n    hand->ctx = ctx;\n    hand->lexer = yajl_lex_alloc(&(hand->alloc), allowComments, validateUTF8);\n    hand->bytesConsumed = 0;\n    hand->decodeBuf = yajl_buf_alloc(&(hand->alloc));\n    yajl_bs_init(hand->stateStack, &(hand->alloc));\n\n    yajl_bs_push(hand->stateStack, yajl_state_start);    \n\n    return hand;\n}\n\nvoid\nyajl_reset_parser(yajl_handle hand) {\n    hand->lexer = yajl_lex_realloc(hand->lexer);\n}\n\nvoid\nyajl_free(yajl_handle handle)\n{\n    yajl_bs_free(handle->stateStack);\n    yajl_buf_free(handle->decodeBuf);\n    yajl_lex_free(handle->lexer);\n    YA_FREE(&(handle->alloc), handle);\n}\n\nyajl_status\nyajl_parse(yajl_handle hand, const unsigned char * jsonText,\n           unsigned int jsonTextLen)\n{\n    yajl_status status;\n    status = yajl_do_parse(hand, jsonText, jsonTextLen);\n    return status;\n}\n\nyajl_status\nyajl_parse_complete(yajl_handle hand)\n{\n    /* The particular case we want to handle is a trailing number.\n     * Further input consisting of digits could cause our interpretation\n     * of the number to change (buffered \"1\" but \"2\" comes in).\n     * A very simple approach to this is to inject whitespace to terminate\n     * any number in the lex buffer.\n     */\n    return yajl_parse(hand, (const unsigned char *)\" \", 1);\n}\n\nunsigned char *\nyajl_get_error(yajl_handle hand, int verbose,\n               const unsigned char * jsonText, unsigned int jsonTextLen)\n{\n    return yajl_render_error_string(hand, jsonText, jsonTextLen, verbose);\n}\n\nunsigned int\nyajl_get_bytes_consumed(yajl_handle hand)\n{\n    if (!hand) return 0;\n    else return hand->bytesConsumed;\n}\n\n\nvoid\nyajl_free_error(yajl_handle hand, unsigned char * str)\n{\n    /* use memory allocation functions if set */\n    YA_FREE(&(hand->alloc), str);\n}\n\n/* XXX: add utility routines to parse from file */\n"
  },
  {
    "path": "src/test/resources/samples/langs/C#/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n// Information about this assembly is defined by the following attributes. \n// Change them to the values specific to your project.\n\n[assembly: AssemblyTitle(\"Simple\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"\")]\n[assembly: AssemblyCopyright(\"\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// The assembly version has the format \"{Major}.{Minor}.{Build}.{Revision}\".\n// The form \"{Major}.{Minor}.*\" will automatically update the build and revision,\n// and \"{Major}.{Minor}.{Build}.*\" will update just the revision.\n\n[assembly: AssemblyVersion(\"1.0.*\")]\n\n// The following attributes are used to specify the signing key for the assembly, \n// if desired. See the Mono documentation for more information about signing.\n\n//[assembly: AssemblyDelaySign(false)]\n//[assembly: AssemblyKeyFile(\"\")]\n"
  },
  {
    "path": "src/test/resources/samples/langs/C#/BsonPropertyValue.cs",
    "content": "﻿using System;\r\n\r\nnamespace MongoDB.Serialization.Descriptors\r\n{\r\n    internal class BsonPropertyValue\r\n    {\r\n        public bool IsDictionary { get; private set; }\r\n\r\n        public Type Type { get; private set; }\r\n\r\n        public object Value { get; private set; }\r\n\r\n        public BsonPropertyValue(Type type, object value, bool isDictionary)\r\n        {\r\n            Type = type;\r\n            Value = value;\r\n            IsDictionary = isDictionary;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "src/test/resources/samples/langs/C#/Index.cshtml",
    "content": "﻿@{\n    ViewBag.Title = \"Home Page\";\n}\n@section featured {\n    <section class=\"featured\">\n        <div class=\"content-wrapper\">\n            <hgroup class=\"title\">\n                <h1>@ViewBag.Title.</h1>\n                <h2>@ViewBag.Message</h2>\n            </hgroup>\n            <p>\n                To learn more about ASP.NET MVC visit\n                <a href=\"http://asp.net/mvc\" title=\"ASP.NET MVC Website\">http://asp.net/mvc</a>.\n                The page features <mark>videos, tutorials, and samples</mark> to help you get the most from ASP.NET MVC.\n                If you have any questions about ASP.NET MVC visit\n                <a href=\"http://forums.asp.net/1146.aspx/1?MVC\" title=\"ASP.NET MVC Forum\">our forums</a>.\n            </p>\n        </div>\n    </section>\n}\n<h3>We suggest the following:</h3>\n<ol class=\"round\">\n    <li class=\"one\">\n        <h5>Getting Started</h5>\n        ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites that\n        enables a clean separation of concerns and that gives you full control over markup\n        for enjoyable, agile development. ASP.NET MVC includes many features that enable\n        fast, TDD-friendly development for creating sophisticated applications that use\n        the latest web standards.\n        <a href=\"http://go.microsoft.com/fwlink/?LinkId=245151\">Learn more…</a>\n    </li>\n\n    <li class=\"two\">\n        <h5>Add NuGet packages and jump-start your coding</h5>\n        NuGet makes it easy to install and update free libraries and tools.\n        <a href=\"http://go.microsoft.com/fwlink/?LinkId=245153\">Learn more…</a>\n    </li>\n\n    <li class=\"three\">\n        <h5>Find Web Hosting</h5>\n        You can easily find a web hosting company that offers the right mix of features\n        and price for your applications.\n        <a href=\"http://go.microsoft.com/fwlink/?LinkId=245157\">Learn more…</a>\n    </li>\n</ol>\n"
  },
  {
    "path": "src/test/resources/samples/langs/C#/MongoExpressionVisitor.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Linq.Expressions;\r\n\r\nnamespace MongoDB.Linq.Expressions\r\n{\r\n    internal class MongoExpressionVisitor : ExpressionVisitor\r\n    {\r\n        protected override Expression Visit(Expression exp)\r\n        {\r\n            if (exp == null)\r\n                return null;\r\n            switch ((MongoExpressionType)exp.NodeType)\r\n            {\r\n                case MongoExpressionType.Collection:\r\n                    return VisitCollection((CollectionExpression)exp);\r\n                case MongoExpressionType.Field:\r\n                    return VisitField((FieldExpression)exp);\r\n                case MongoExpressionType.Projection:\r\n                    return VisitProjection((ProjectionExpression)exp);\r\n                case MongoExpressionType.Select:\r\n                    return VisitSelect((SelectExpression)exp);\r\n                case MongoExpressionType.Aggregate:\r\n                    return VisitAggregate((AggregateExpression)exp);\r\n                case MongoExpressionType.AggregateSubquery:\r\n                    return VisitAggregateSubquery((AggregateSubqueryExpression)exp);\r\n                case MongoExpressionType.Scalar:\r\n                    return VisitScalar((ScalarExpression)exp);\r\n                default:\r\n                    return base.Visit(exp);\r\n            }\r\n        }\r\n\r\n        protected virtual Expression VisitAggregate(AggregateExpression aggregate)\r\n        {\r\n            var exp = Visit(aggregate.Argument);\r\n            if (exp != aggregate.Argument)\r\n                return new AggregateExpression(aggregate.Type, aggregate.AggregateType, exp, aggregate.Distinct);\r\n\r\n            return aggregate;\r\n        }\r\n\r\n        protected virtual Expression VisitAggregateSubquery(AggregateSubqueryExpression aggregateSubquery)\r\n        {\r\n            Expression e = Visit(aggregateSubquery.AggregateAsSubquery);\r\n            ScalarExpression subquery = (ScalarExpression)e;\r\n            if (subquery != aggregateSubquery.AggregateAsSubquery)\r\n                return new AggregateSubqueryExpression(aggregateSubquery.GroupByAlias, aggregateSubquery.AggregateInGroupSelect, subquery);\r\n            return aggregateSubquery;\r\n        }\r\n\r\n        protected virtual Expression VisitCollection(CollectionExpression collection)\r\n        {\r\n            return collection;\r\n        }\r\n\r\n        protected virtual Expression VisitField(FieldExpression field)\r\n        {\r\n            var e = Visit(field.Expression);\r\n            if (field.Expression != e)\r\n                field = new FieldExpression(e, field.Alias, field.Name);\r\n\r\n            return field;\r\n        }\r\n\r\n        protected virtual Expression VisitProjection(ProjectionExpression projection)\r\n        {\r\n            var source = (SelectExpression)Visit(projection.Source);\r\n            var projector = Visit(projection.Projector);\r\n            if (source != projection.Source || projector != projection.Projector)\r\n                return new ProjectionExpression(source, projector, projection.Aggregator);\r\n            return projection;\r\n        }\r\n\r\n        protected ReadOnlyCollection<OrderExpression> VisitOrderBy(ReadOnlyCollection<OrderExpression> orderBys)\r\n        {\r\n            if (orderBys != null) \r\n            {\r\n                List<OrderExpression> alternate = null;\r\n                for (int i = 0, n = orderBys.Count; i < n; i++) \r\n                {\r\n                    OrderExpression expr = orderBys[i];\r\n                    Expression e = this.Visit(expr.Expression);\r\n                    if (alternate == null && e != expr.Expression) \r\n                        alternate = orderBys.Take(i).ToList();\r\n                    if (alternate != null) \r\n                        alternate.Add(new OrderExpression(expr.OrderType, e));\r\n                }\r\n                if (alternate != null) \r\n                    return alternate.AsReadOnly();\r\n            }\r\n            return orderBys;\r\n        }\r\n\r\n        protected virtual Expression VisitScalar(ScalarExpression scalar)\r\n        {\r\n            SelectExpression select = (SelectExpression)Visit(scalar.Select);\r\n            if (select != scalar.Select)\r\n                return new ScalarExpression(scalar.Type, select);\r\n            return scalar;\r\n        }\r\n\r\n        protected virtual Expression VisitSelect(SelectExpression select)\r\n        {\r\n            var from = VisitSource(select.From);\r\n            var where = Visit(select.Where);\r\n            var groupBy = Visit(select.GroupBy);\r\n            var orderBy = VisitOrderBy(select.OrderBy);\r\n            var skip = Visit(select.Skip);\r\n            var take = Visit(select.Take);\r\n            var fields = VisitFieldDeclarationList(select.Fields);\r\n            if (from != select.From || where != select.Where || orderBy != select.OrderBy || groupBy != select.GroupBy || skip != select.Skip || take != select.Take || fields != select.Fields)\r\n                return new SelectExpression(select.Alias, fields, from, where, orderBy, groupBy, select.IsDistinct, skip, take);\r\n            return select;\r\n        }\r\n\r\n        protected virtual Expression VisitSource(Expression source)\r\n        {\r\n            return Visit(source);\r\n        }\r\n\r\n        protected virtual Expression VisitSubquery(SubqueryExpression subquery)\r\n        {\r\n            switch ((MongoExpressionType)subquery.NodeType)\r\n            {\r\n                case MongoExpressionType.Scalar:\r\n                    return VisitScalar((ScalarExpression)subquery);\r\n            }\r\n            return subquery;\r\n        }\r\n\r\n        protected virtual ReadOnlyCollection<FieldDeclaration> VisitFieldDeclarationList(ReadOnlyCollection<FieldDeclaration> fields)\r\n        {\r\n            if (fields == null)\r\n                return fields;\r\n\r\n            List<FieldDeclaration> alternate = null;\r\n            for (int i = 0, n = fields.Count; i < n; i++)\r\n            {\r\n                var f = fields[i];\r\n                var e = Visit(f.Expression);\r\n                if (f.Expression != e && alternate == null)\r\n                    alternate = fields.Take(i).ToList();\r\n                if (alternate != null)\r\n                    alternate.Add(new FieldDeclaration(f.Name, e));\r\n            }\r\n            if (alternate != null)\r\n                return alternate.AsReadOnly();\r\n            return fields;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "src/test/resources/samples/langs/C#/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace LittleSampleApp\n{\n  /// <summary>\n  /// Just what it says on the tin. A little sample application for Linguist to try out.\n  /// \n  /// </summary>\n  class Program\n  {\n    static void Main(string[] args)\n    {\n      Console.WriteLine(\"Hello, I am a little sample application to test GitHub's Linguist module.\");\n      Console.WriteLine(\"I also include a Razor MVC file just to prove it handles cshtml files now.\");\n    }\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C#/build.cake",
    "content": "///////////////////////////////////////////////////////////////////////////////\n// ARGUMENTS\n///////////////////////////////////////////////////////////////////////////////\n\nvar target = Argument<string>(\"target\", \"Default\");\nvar configuration = Argument<string>(\"configuration\", \"Release\");\n\n///////////////////////////////////////////////////////////////////////////////\n// GLOBAL VARIABLES\n///////////////////////////////////////////////////////////////////////////////\n\nvar solutions = GetFiles(\"./**/*.sln\");\nvar solutionPaths = solutions.Select(solution => solution.GetDirectory());\n\n///////////////////////////////////////////////////////////////////////////////\n// SETUP / TEARDOWN\n///////////////////////////////////////////////////////////////////////////////\n\nSetup(() =>\n{\n    // Executed BEFORE the first task.\n    Information(\"Running tasks...\");\n});\n\nTeardown(() =>\n{\n    // Executed AFTER the last task.\n    Information(\"Finished running tasks.\");\n});\n\n///////////////////////////////////////////////////////////////////////////////\n// TASK DEFINITIONS\n///////////////////////////////////////////////////////////////////////////////\n\nTask(\"Clean\")\n    .Does(() =>\n{\n    // Clean solution directories.\n    foreach(var path in solutionPaths)\n    {\n        Information(\"Cleaning {0}\", path);\n        CleanDirectories(path + \"/**/bin/\" + configuration);\n        CleanDirectories(path + \"/**/obj/\" + configuration);\n    }\n});\n\nTask(\"Restore\")\n    .Does(() =>\n{\n    // Restore all NuGet packages.\n    foreach(var solution in solutions)\n    {\n        Information(\"Restoring {0}...\", solution);\n        NuGetRestore(solution);\n    }\n});\n\nTask(\"Build\")\n    .IsDependentOn(\"Clean\")\n    .IsDependentOn(\"Restore\")\n    .Does(() =>\n{\n    // Build all solutions.\n    foreach(var solution in solutions)\n    {\n        Information(\"Building {0}\", solution);\n        MSBuild(solution, settings => \n            settings.SetPlatformTarget(PlatformTarget.MSIL)\n                .WithProperty(\"TreatWarningsAsErrors\",\"true\")\n                .WithTarget(\"Build\")\n                .SetConfiguration(configuration));\n    }\n});\n\n///////////////////////////////////////////////////////////////////////////////\n// TARGETS\n///////////////////////////////////////////////////////////////////////////////\n\nTask(\"Default\")\n    .IsDependentOn(\"Build\");\n\n///////////////////////////////////////////////////////////////////////////////\n// EXECUTION\n///////////////////////////////////////////////////////////////////////////////\n\nRunTarget(target);"
  },
  {
    "path": "src/test/resources/samples/langs/C++/16F88.h",
    "content": "/*\n * This file is part of PIC\n * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)\n *\n * PIC is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * PIC is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nenum PIC16F88Instruction\n{\n\tADDWF,\n\tANDWF,\n\tCLRF,\n\tCLRW,\n\tCOMF,\n\tDECF,\n\tDECFSZ,\n\tINCF,\n\tINCFSZ,\n\tIORWF,\n\tMOVF,\n\tMOVWF,\n\tNOP,\n\tRLF,\n\tRRF,\n\tSUBWF,\n\tSWAPF,\n\tXORWF,\n\tBCF,\n\tBSF,\n\tBTFSC,\n\tBTFSS,\n\tADDLW,\n\tANDLW,\n\tCALL,\n\tCLRWDT,\n\tGOTO,\n\tIORLW,\n\tMOVLW,\n\tRETFIE,\n\tRETLW,\n\tRETURN,\n\tSLEEP,\n\tSUBLW,\n\tXORLW\n};\n\nclass PIC16F88\n{\npublic:\n\tPIC16F88(ROM *ProgramMemory);\n\tvoid Step();\n\nprivate:\n\tuint8_t q;\n\tbool nextIsNop, trapped;\n\tMemory *memory;\n\tROM *program;\n\tStack<uint16_t, 8> *CallStack;\n\tRegister<uint16_t> *PC;\n\tRegister<> *WREG, *PCL, *STATUS, *PCLATCH;\n\tPIC16F88Instruction inst;\n\tuint16_t instrWord;\n\nprivate:\n\tvoid DecodeInstruction();\n\tvoid ProcessInstruction();\n\n\tuint8_t GetBank();\n\tuint8_t GetMemoryContents(uint8_t partialAddress);\n\tvoid SetMemoryContents(uint8_t partialAddress, uint8_t newVal);\n\tvoid CheckZero(uint8_t value);\n\tvoid StoreValue(uint8_t value, bool updateZero);\n\tuint8_t SetCarry(bool val);\n\tuint16_t GetPCHFinalBits();\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/ClasspathVMSystemProperties.inc",
    "content": "//===- ClasspathVMSystem/Properties.cpp -----------------------------------===//\n//===--------------------- GNU classpath gnu/classpath/VMSystemProperties -===//\n//\n//                            The VMKit project\n//\n// This file is distributed under the University of Illinois Open Source\n// License. See LICENSE.TXT for details.\n//\n//===----------------------------------------------------------------------===//\n\n#include <sys/utsname.h>\n\n#include \"types.h\"\n\n#include \"Classpath.h\"\n#include \"JavaArray.h\"\n#include \"JavaClass.h\"\n#include \"JavaObject.h\"\n#include \"JavaThread.h\"\n#include \"JavaUpcalls.h\"\n#include \"Jnjvm.h\"\n\n#include \"SetProperties.inc\"\n\nusing namespace j3;\n\nextern \"C\" {\n\n\nJNIEXPORT void JNICALL Java_gnu_classpath_VMSystemProperties_preInit(\n#ifdef NATIVE_JNI\nJNIEnv *env,\njclass clazz,\n#endif\nJavaObject* prop) {\n  \n  llvm_gcroot(prop, 0);\n\n  BEGIN_NATIVE_EXCEPTION(0)\n\n  setProperties(prop);\n\n  END_NATIVE_EXCEPTION\n}\n\nextern \"C\" void Java_gnu_classpath_VMSystemProperties_postInit__Ljava_util_Properties_2(JavaObject* prop) {\n\n  llvm_gcroot(prop, 0);\n\n  BEGIN_NATIVE_EXCEPTION(0)\n\n  setCommandLineProperties(prop);\n\n  END_NATIVE_EXCEPTION\n}\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/CsvStreamer.h",
    "content": "#pragma once\n#include <string>\n#include <vector>\n#include <fstream>\n#include \"util.h\"\n\nusing namespace std;\n\n\n#define DEFAULT_DELIMITER\t','\n\n\nclass CsvStreamer\n{\n\tprivate:\n\t\tofstream file;\t\t\t\t// File output stream\n\t\tvector<string> row_buffer;\t// Buffer which stores a row's data before being flushed/written\n\t\tint fields;\t\t\t\t\t// Number of fields (columns)\n\t\tlong rows;\t\t\t\t\t// Number of rows (records) including header row\n\t\tchar delimiter;\t\t\t\t// Delimiter character; comma by default\n\t\tstring sanitize(string);\t// Returns a string ready for output into the file\n\t\t\n\tpublic:\n\t\tCsvStreamer();\t\t\t\t// Empty CSV streamer... be sure to open the file before writing!\n\t\tCsvStreamer(string, char);\t// Same as open(string, char)...\n\t\tCsvStreamer(string);\t\t// Opens an output CSV file given a file path/name\n\t\t~CsvStreamer();\t\t\t\t// Ensures the output file is closed and saved\n\t\tvoid open(string);\t\t\t// Opens an output CSV file given a file path/name (default delimiter)\n\t\tvoid open(string, char);\t// Opens an output CSV file given a file path/name and a delimiting character (default comma)\n\t\tvoid add_field(string);\t\t// If still on first line, adds a new field to the header row\n\t\tvoid save_fields();\t\t\t// Call this to save the header row; all new writes should be through append()\n\t\tvoid append(string);\t\t// Appends the current row with this data for the next field; quoted only if needed (leading/trailing spaces are trimmed)\n\t\tvoid append(string, bool);\t// Like append(string) but can specify whether to trim spaces at either end of the data (false to keep spaces)\n\t\tvoid append(float);\t\t\t// Appends the current row with this number\n\t\tvoid append(double);\t\t// Appends the current row with this number\n\t\tvoid append(long);\t\t\t// Appends the current row with this number\n\t\tvoid append(int);\t\t\t// Appends the current row with this number\n\t\tvoid writeln();\t\t\t\t// Flushes what was in the row buffer into the file (writes the row)\n\t\tvoid close();\t\t\t\t// Saves and closes the file\n\t\tint field_count();\t\t\t// Gets the number of fields (columns)\n\t\tlong row_count();\t\t\t// Gets the number of records (rows) -- NOT including the header row\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/Entity.h",
    "content": "/** \n* @file Entity.h\n* @page EntityPage Entity\n* @brief represent an entity in the game\n* @author vinz243\n* @version 0.1.0\n* This file represents an Entity in the game system\n* This parent type is a static entity which is shown and loaded into the Physics engine but never updated\n*/\n\n#ifndef ENTITY_H\n#define ENTITY_H\n\n#include \"base.h\"\n/// @namespace Whitedrop\nnamespace Whitedrop {\n\t/** @class Entity\n\t* This parent type is a static entity which is shown and loaded into the Physics engine but never updated\n\t*/\n\tclass Entity {\n\tpublic:\n\t\t/**\n\t\t * @brief Create static entity\n\t\t * @details creates a static entity instance according to the mesh and the id, the position\n\t\t * This needs to be attached to a World after!\n\t\t * The material name is not the file name but the material name!\n\t\t * @ref WorldPage\n\t\t * @param mesh the name of the mesh for the object, file must be in media/meshes\n\t\t * @param id an unique identifier for the object, shortest as possible\n\t\t * @param dimensions an Ogre::Vector3 which contains the dimensions in meter\n\t\t * @param position the Vector3 which contains it position \n\t\t * @param material the material name\n\t\t */\n\t\tEntity(std::string mesh, std::string id, Ogre::Vector3 dimensions, Ogre::Vector3 position, std::string material);\n\t\t/**\n\t\t * @brief The copy constructor\n\t\t * @details A copy constr\n\t\t * \n\t\t * @param ref the Entity to be copied from\n\t\t */\n\t\tEntity(const Entity &ref);\n\n\t\t/**\n\t\t * @brief The assignement operator\n\t\t * @details \n\t\t * \n\t\t * @param ent the entity to be copied\n\t\t */\n\t\tEntity& operator=(const Entity ent);\n\n\t\t/**\n\t\t * @brief destrctor\n\t\t * @details\n\t\t */\n\t\tvirtual ~Entity(void);\n\n\t\t/**\n\t\t * @brief a constance type of the entity\n\t\t * @details depends of the class. \n\t\t * May contain STATIC, DYNAMIC or ETHERAL\n\t\t */\n\t\tconst std::string type = \"STATIC\";\n\n\t\t/**\n\t\t * @brief Attach the entity to specified sceneManager\n\t\t * @details This creates the OgreEntity using sceneMgr,\n\t\t * set material, create a Node with name as `<id>_n`,\n\t\t * scale it to match dimensions and translate the node to pos\n\t\t * @param sceneMgr the scene manager to use\n\t\t */\n\t\tvirtual void setup(Ogre::SceneManager* sceneMgr);\n\n\t\t/**\n\t\t * @brief the update method\n\t\t * @details this method should be called on each world update.\n\t\t * Even though the method is necessary declared, the main impl of \n\t\t * a static entity should be empty since it is not updated by physics\n\t\t * However, a Dynamic entity should implement this function in order to:\n\t\t * 1) Get from the physics engine the actor position in the physic world\n\t\t * 2) Update the OgreEntity position and rotation from the previous actor\n\t\t * @return whether it was successful or not, if falsey engine should stop\n\t\t */\n\t\tvirtual bool update(void);\n\n\tprotected:\n\t\tstd::string \t\t\tmMesh = \"cube.mesh\";\n\t\tstd::string \t\t\tmId;\n\t\tstd::string \t\t\tmMaterial;\n\t\tOgre::Vector3 \t\t\tmDimensions;\n\t\tOgre::Vector3 \t\t\tmPosition;\n\t\tOgre::Entity* \t\t\tmEntity;\n\t\tOgre::SceneNode* \t\tmNode;\n\n\t};\n}\n\n\n#endif"
  },
  {
    "path": "src/test/resources/samples/langs/C++/Field.h",
    "content": "/*****************************************************************************\n* Dwarf Mine - The 13-11 Benchmark\n*\n* Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber,\n* Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary;\n* Zimmermann, Florian\n*\n* Permission is hereby granted, free of charge, to any person obtaining\n* a copy of this software and associated documentation files (the\n* \"Software\"), to deal in the Software without restriction, including\n* without limitation the rights to use, copy, modify, merge, publish,\n* distribute, sublicense, and/or sell copies of the Software, and to\n* permit persons to whom the Software is furnished to do so, subject to\n* the following conditions:\n*\n* The above copyright notice and this permission notice shall be\n* included in all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*****************************************************************************/\n\n#pragma once\n\nenum Field { Free, Black, White, Illegal };\n\ntypedef Field Player;\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/Math.inl",
    "content": "/*\r\n===========================================================================\r\nThe Open Game Libraries.\r\nCopyright (C) 2007-2010 Lusito Software\r\n\r\nAuthor:  Santo Pfingsten (TTK-Bandit)\r\nPurpose: Math namespace\r\n-----------------------------------------\r\n\r\nThis software is provided 'as-is', without any express or implied\r\nwarranty. In no event will the authors be held liable for any damages\r\narising from the use of this software.\r\n\r\nPermission is granted to anyone to use this software for any purpose,\r\nincluding commercial applications, and to alter it and redistribute it\r\nfreely, subject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\n   claim that you wrote the original software. If you use this software\r\n   in a product, an acknowledgment in the product documentation would be\r\n   appreciated but is not required.\r\n\r\n2. Altered source versions must be plainly marked as such, and must not be\r\n   misrepresented as being the original software.\r\n\r\n3. This notice may not be removed or altered from any source distribution.\r\n===========================================================================\r\n*/\r\n\r\n#ifndef __OG_MATH_INL__\r\n#define __OG_MATH_INL__\r\n\r\nnamespace og {\r\n\r\n/*\r\n==============================================================================\r\n\r\n  Math\r\n\r\n==============================================================================\r\n*/\r\n\r\n/*\r\n================\r\nMath::Abs\r\n================\r\n*/\r\nOG_INLINE int Math::Abs( int i ) {\r\n#if 1\r\n\tif ( i & 0x80000000 )\r\n\t\treturn 0x80000000 - (i & MASK_SIGNED);\r\n\treturn i;\r\n#else\r\n   int y = x >> 31;\r\n   return ( ( x ^ y ) - y );\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::Fabs\r\n================\r\n*/\r\nOG_INLINE float Math::Fabs( float f ) {\r\n#if 1\r\n\tuInt *pf = reinterpret_cast<uInt*>(&f);\r\n\t*(pf) &= MASK_SIGNED;\r\n\treturn f;\r\n#else\r\n\treturn fabsf( f );\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::Round\r\n================\r\n*/\r\nOG_INLINE float Math::Round( float f ) {\r\n\treturn floorf( f + 0.5f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Floor\r\n================\r\n*/\r\nOG_INLINE float Math::Floor( float f ) {\r\n\treturn floorf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Ceil\r\n================\r\n*/\r\nOG_INLINE float Math::Ceil( float f ) {\r\n\treturn ceilf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Ftoi\r\n\r\nok since this is SSE, why should the other ftoi be the faster one ?\r\nand: we might need to add a check for SSE extensions..\r\nbecause sse isn't *really* faster (I actually read that GCC does not handle\r\nSSE extensions perfectly. I'll find the link and send it to you when you're online)\r\n================\r\n*/\r\nOG_INLINE int Math::Ftoi( float f ) {\r\n\t//! @todo\tneeds testing\r\n\t// note: sse function cvttss2si\r\n#if OG_ASM_MSVC\r\n\tint i;\r\n#if defined(OG_FTOI_USE_SSE)\r\n\tif( SysInfo::cpu.general.SSE ) {\r\n\t\t__asm cvttss2si\teax, f\r\n\t\t__asm mov\t\ti, eax\r\n\t\treturn i;\r\n\t} else\r\n#endif\r\n\t{\r\n\t\t__asm fld\t\tf\r\n\t\t__asm fistp\t\ti\r\n\t\t//__asm mov eax, i // do we need this ? O_o\r\n\t}\r\n\treturn i;\r\n#elif OG_ASM_GNU\r\n\tint i;\r\n#if defined(OG_FTOI_USE_SSE)\r\n\tif( SysInfo::cpu.general.SSE ) {\r\n\t\t__asm__ __volatile__( \"cvttss2si %1    \\n\\t\"\r\n\t\t\t: \"=m\" (i)\r\n\t\t\t: \"m\" (f)\r\n\t\t);\r\n\t} else\r\n#endif\r\n\t{\r\n\t\t__asm__ __volatile__( \"flds %1    \\n\\t\"\r\n\t\t\t\t\t\t\t  \"fistpl %0  \\n\\t\"\r\n\t\t\t: \"=m\" (i)\r\n\t\t\t: \"m\" (f)\r\n\t\t);\r\n\t}\r\n\treturn i;\r\n#else\r\n\t// we use c++ cast instead of c cast (not sure why id did that)\r\n\treturn static_cast<int>(f);\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::FtoiFast\r\n================\r\n*/\r\nOG_INLINE int Math::FtoiFast( float f ) {\r\n#if OG_ASM_MSVC\r\n\tint i;\r\n\t__asm fld\t\tf\r\n\t__asm fistp\t\ti\r\n\t//__asm mov eax, i // do we need this ? O_o\r\n\treturn i;\r\n#elif OG_ASM_GNU\r\n\tint i;\r\n\t__asm__ __volatile__( \"flds %1    \\n\\t\"\r\n\t\t\t\t\t\t  \"fistpl %0  \\n\\t\"\r\n\t\t: \"=m\" (i)\r\n\t\t: \"m\" (f)\r\n\t);\r\n\treturn i;\r\n#else\r\n\t// we use c++ cast instead of c cast (not sure why id did that)\r\n\treturn static_cast<int>(f);\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::Ftol\r\n================\r\n*/\r\nOG_INLINE long Math::Ftol( float f ) {\r\n#if OG_ASM_MSVC\r\n\tlong i;\r\n\t__asm fld\t\tf\r\n\t__asm fistp\t\ti\r\n\t//__asm mov eax, i // do we need this ? O_o\r\n\treturn i;\r\n#elif OG_ASM_GNU\r\n\tlong i;\r\n\t__asm__ __volatile__( \"flds %1    \\n\\t\"\r\n\t\t\t\t\t\t  \"fistpl %0  \\n\\t\"\r\n\t\t: \"=m\" (i)\r\n\t\t: \"m\" (f)\r\n\t);\r\n\treturn i;\r\n#else\r\n\t// we use c++ cast instead of c cast (not sure why id did that)\r\n\treturn static_cast<long>(f);\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::Sign\r\n================\r\n*/\r\nOG_INLINE float Math::Sign( float f )\t{\r\n\tif ( f > 0.0f )\r\n\t\treturn 1.0f;\r\n\tif ( f < 0.0f )\r\n\t\treturn -1.0f;\r\n\treturn 0.0f;\r\n}\r\n\r\n/*\r\n================\r\nMath::Fmod\r\n================\r\n*/\r\nOG_INLINE float Math::Fmod( float numerator, float denominator ) {\r\n\treturn fmodf( numerator, denominator );\r\n}\r\n\r\n/*\r\n================\r\nMath::Modf\r\n================\r\n*/\r\nOG_INLINE float Math::Modf( float f, float& i ) {\r\n\treturn modff( f, &i );\r\n}\r\nOG_INLINE float Math::Modf( float f ) {\r\n\tfloat i;\r\n\treturn modff( f, &i );\r\n}\r\n\r\n/*\r\n================\r\nMath::Sqrt\r\n================\r\n*/\r\nOG_INLINE float Math::Sqrt( float f ) {\r\n\treturn sqrtf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::InvSqrt\r\n\r\nCannot be 0.0f\r\n================\r\n*/\r\nOG_INLINE float Math::InvSqrt( float f ) {\r\n\tOG_ASSERT( f != 0.0f );\r\n\treturn 1.0f / sqrtf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::RSqrt\r\n\r\nCan be 0.0f\r\n================\r\n*/\r\nOG_INLINE float Math::RSqrt( float f ) {\r\n\tfloat g = 0.5f * f;\r\n\tint i = *reinterpret_cast<int *>(&f);\r\n\r\n\t// do a guess\r\n\ti = 0x5f375a86 - ( i>>1 );\r\n\tf = *reinterpret_cast<float *>(&i);\r\n\r\n\t// Newtons calculation\r\n\tf = f * ( 1.5f - g * f * f );\r\n\treturn f;\r\n}\r\n\r\n/*\r\n================\r\nMath::Log/Log2/Log10\r\n\r\nLog of 0 is bad.\r\nI've also heard you're not really\r\nsupposed to do log of negatives, yet\r\nthey work fine.\r\n================\r\n*/\r\nOG_INLINE float Math::Log( float f ) {\r\n\tOG_ASSERT( f != 0.0f );\r\n\treturn logf( f );\r\n}\r\nOG_INLINE float Math::Log2( float f ) {\r\n\tOG_ASSERT( f != 0.0f );\r\n\treturn INV_LN_2 * logf( f );\r\n}\r\nOG_INLINE float Math::Log10( float f ) {\r\n\tOG_ASSERT( f != 0.0f );\r\n\treturn INV_LN_10 * logf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Pow\r\n================\r\n*/\r\nOG_INLINE float Math::Pow( float base, float exp ) {\r\n\treturn powf( base, exp );\r\n}\r\n\r\n/*\r\n================\r\nMath::Exp\r\n================\r\n*/\r\nOG_INLINE float Math::Exp( float f ) {\r\n\treturn expf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::IsPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE bool Math::IsPowerOfTwo( int x ) {\r\n\t// This is the faster of the two known methods\r\n\t// with the x > 0 check moved to the beginning\r\n\treturn x > 0 && ( x & ( x - 1 ) ) == 0;\r\n}\r\n\r\n/*\r\n================\r\nMath::HigherPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE int Math::HigherPowerOfTwo( int x ) {\r\n\tx--;\r\n\tx |= x >> 1;\r\n\tx |= x >> 2;\r\n\tx |= x >> 4;\r\n\tx |= x >> 8;\r\n\tx |= x >> 16;\r\n\treturn x + 1;\r\n}\r\n\r\n/*\r\n================\r\nMath::LowerPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE int Math::LowerPowerOfTwo( int x ) {\r\n\treturn HigherPowerOfTwo( x ) >> 1;\r\n}\r\n\r\n/*\r\n================\r\nMath::FloorPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE int Math::FloorPowerOfTwo( int x ) {\r\n\treturn IsPowerOfTwo( x ) ? x : LowerPowerOfTwo( x );\r\n}\r\n\r\n/*\r\n================\r\nMath::CeilPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE int Math::CeilPowerOfTwo( int x ) {\r\n\treturn IsPowerOfTwo( x ) ? x : HigherPowerOfTwo( x );\r\n}\r\n\r\n/*\r\n================\r\nMath::ClosestPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE int Math::ClosestPowerOfTwo( int x ) {\r\n\tif ( IsPowerOfTwo( x ) )\r\n\t\treturn x;\r\n\tint high = HigherPowerOfTwo( x );\r\n\tint low = high >> 1;\r\n\treturn ((high-x) < (x-low)) ? high : low;\r\n}\r\n\r\n/*\r\n================\r\nMath::Digits\r\n================\r\n*/\r\nOG_INLINE int Math::Digits( int x ) {\r\n\tint digits = 1;\r\n\tint step = 10;\r\n\twhile (step <= x) {\r\n\t\tdigits++;\r\n\t\tstep *= 10;\r\n\t}\r\n\treturn digits;\r\n}\r\n\r\n/*\r\n================\r\nMath::Sin/ASin\r\n================\r\n*/\r\nOG_INLINE float Math::Sin( float f ) {\r\n\treturn sinf( f );\r\n}\r\nOG_INLINE float Math::ASin( float f ) {\r\n\tif ( f <= -1.0f )\r\n\t\treturn -HALF_PI;\r\n\tif ( f >= 1.0f )\r\n\t\treturn HALF_PI;\r\n\treturn asinf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Cos/ACos\r\n================\r\n*/\r\nOG_INLINE float Math::Cos( float f ) {\r\n\treturn cosf( f );\r\n}\r\nOG_INLINE float Math::ACos( float f ) {\r\n\tif ( f <= -1.0f )\r\n\t\treturn PI;\r\n\tif ( f >= 1.0f )\r\n\t\treturn 0.0f;\r\n\treturn acosf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Tan/ATan\r\n================\r\n*/\r\nOG_INLINE float Math::Tan( float f ) {\r\n\treturn tanf( f );\r\n}\r\nOG_INLINE float Math::ATan( float f ) {\r\n\treturn atanf( f );\r\n}\r\nOG_INLINE float Math::ATan( float f1, float f2 ) {\r\n\treturn atan2f( f1, f2 );\r\n}\r\n\r\n/*\r\n================\r\nMath::SinCos\r\n================\r\n*/\r\nOG_INLINE void Math::SinCos( float f, float &s, float &c ) {\r\n#if OG_ASM_MSVC\r\n\t// sometimes assembler is just waaayy faster\r\n\t_asm {\r\n\t\tfld\t\tf\r\n\t\tfsincos\r\n\t\tmov\t\tecx, c\r\n\t\tmov\t\tedx, s\r\n\t\tfstp\tdword ptr [ecx]\r\n\t\tfstp\tdword ptr [edx]\r\n\t}\r\n#elif OG_ASM_GNU\r\n\tasm (\"fsincos\" : \"=t\" (c), \"=u\" (s) : \"0\" (f));\r\n#else\r\n\ts = Sin(f);\r\n\tc = Sqrt( 1.0f - s * s ); // faster than calling Cos(f)\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::Deg2Rad\r\n================\r\n*/\r\nOG_INLINE float Math::Deg2Rad( float f ) {\r\n\treturn f * DEG_TO_RAD;\r\n}\r\n\r\n/*\r\n================\r\nMath::Rad2Deg\r\n================\r\n*/\r\nOG_INLINE float Math::Rad2Deg( float f ) {\r\n\treturn f * RAD_TO_DEG;\r\n}\r\n\r\n/*\r\n================\r\nMath::Square\r\n================\r\n*/\r\nOG_INLINE float Math::Square( float v ) {\r\n\treturn v * v;\r\n}\r\n\r\n/*\r\n================\r\nMath::Cube\r\n================\r\n*/\r\nOG_INLINE float Math::Cube( float v ) {\r\n\treturn v * v * v;\r\n}\r\n\r\n/*\r\n================\r\nMath::Sec2Ms\r\n================\r\n*/\r\nOG_INLINE int Math::Sec2Ms( int sec ) {\r\n\treturn sec * 1000;\r\n}\r\n\r\n/*\r\n================\r\nMath::Ms2Sec\r\n================\r\n*/\r\nOG_INLINE int Math::Ms2Sec( int ms ) {\r\n\treturn FtoiFast( ms * 0.001f );\r\n}\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/Memory16F88.h",
    "content": "/*\n * This file is part of PIC\n * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)\n *\n * PIC is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * PIC is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include \"Memory.h\"\n\nclass Memory16F88 : public Memory\n{\nprivate:\n\tuint8_t memory[512];\n\tstd::map<uint32_t, MemoryLocation *> memoryMap;\n\npublic:\n\tMemory16F88();\n\tuint8_t Dereference(uint8_t bank, uint8_t partialAddress);\n\tuint8_t *Reference(uint8_t bank, uint8_t partialAddress);\n\tuint8_t *operator [](uint32_t ref);\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/PackageInfoParser.cpp",
    "content": "/*\n * Copyright 2011, Oliver Tappe <zooey@hirschkaefer.de>\n * Copyright 2016, Andrew Lindesay <apl@lindesay.co.nz>\n * Distributed under the terms of the MIT License.\n *\n * Source - https://github.com/haiku/haiku/blob/73e180c9b965aaeb034055453e153bc3adf47917/src/kits/package/PackageInfoParser.cpp\n */\n\n\n#include \"PackageInfoParser.h\"\n\n#include <ctype.h>\n#include <stdint.h>\n#include <stdlib.h>\n\n#include <algorithm>\n#include <string>\n\n#include <Url.h>\n\nnamespace BPackageKit {\n\n\nBPackageInfo::ParseErrorListener::~ParseErrorListener()\n{\n}\n\n\nBPackageInfo::Parser::Parser(ParseErrorListener* listener)\n\t:\n\tfListener(listener),\n\tfPos(NULL)\n{\n}\n\n\nstatus_t\nBPackageInfo::Parser::Parse(const BString& packageInfoString,\n\tBPackageInfo* packageInfo)\n{\n\tif (packageInfo == NULL)\n\t\treturn B_BAD_VALUE;\n\n\tfPos = packageInfoString.String();\n\n\ttry {\n\t\t_Parse(packageInfo);\n\t} catch (const ParseError& error) {\n\t\tif (fListener != NULL) {\n\t\t\t// map error position to line and column\n\t\t\tint line = 1;\n\t\t\tint inLineOffset;\n\t\t\tint32 offset = error.pos - packageInfoString.String();\n\t\t\tint32 newlinePos = packageInfoString.FindLast('\\n', offset - 1);\n\t\t\tif (newlinePos < 0)\n\t\t\t\tinLineOffset = offset;\n\t\t\telse {\n\t\t\t\tinLineOffset = offset - newlinePos - 1;\n\t\t\t\tdo {\n\t\t\t\t\tline++;\n\t\t\t\t\tnewlinePos = packageInfoString.FindLast('\\n',\n\t\t\t\t\t\tnewlinePos - 1);\n\t\t\t\t} while (newlinePos >= 0);\n\t\t\t}\n\n\t\t\tint column = 0;\n\t\t\tfor (int i = 0; i < inLineOffset; i++) {\n\t\t\t\tcolumn++;\n\t\t\t\tif (error.pos[i - inLineOffset] == '\\t')\n\t\t\t\t\tcolumn = (column + 3) / 4 * 4;\n\t\t\t}\n\n\t\t\tfListener->OnError(error.message, line, column + 1);\n\t\t}\n\t\treturn B_BAD_DATA;\n\t} catch (const std::bad_alloc& e) {\n\t\tif (fListener != NULL)\n\t\t\tfListener->OnError(\"out of memory\", 0, 0);\n\t\treturn B_NO_MEMORY;\n\t}\n\n\treturn B_OK;\n}\n\n\nstatus_t\nBPackageInfo::Parser::ParseVersion(const BString& versionString,\n\tbool revisionIsOptional, BPackageVersion& _version)\n{\n\tfPos = versionString.String();\n\n\ttry {\n\t\tToken token(TOKEN_STRING, fPos, versionString.Length());\n\t\t_ParseVersionValue(token, &_version, revisionIsOptional);\n\t} catch (const ParseError& error) {\n\t\tif (fListener != NULL) {\n\t\t\tint32 offset = error.pos - versionString.String();\n\t\t\tfListener->OnError(error.message, 1, offset);\n\t\t}\n\t\treturn B_BAD_DATA;\n\t} catch (const std::bad_alloc& e) {\n\t\tif (fListener != NULL)\n\t\t\tfListener->OnError(\"out of memory\", 0, 0);\n\t\treturn B_NO_MEMORY;\n\t}\n\n\treturn B_OK;\n}\n\n\nstatus_t\nBPackageInfo::Parser::ParseResolvableExpression(const BString& expressionString,\n\tBPackageResolvableExpression& _expression)\n{\n\tfPos = expressionString.String();\n\n\ttry {\n\t\tToken token(TOKEN_STRING, fPos, expressionString.Length());\n\t\t_ParseResolvableExpression(_NextToken(), _expression, NULL);\n\t} catch (const ParseError& error) {\n\t\tif (fListener != NULL) {\n\t\t\tint32 offset = error.pos - expressionString.String();\n\t\t\tfListener->OnError(error.message, 1, offset);\n\t\t}\n\t\treturn B_BAD_DATA;\n\t} catch (const std::bad_alloc& e) {\n\t\tif (fListener != NULL)\n\t\t\tfListener->OnError(\"out of memory\", 0, 0);\n\t\treturn B_NO_MEMORY;\n\t}\n\n\treturn B_OK;\n}\n\n\nBPackageInfo::Parser::Token\nBPackageInfo::Parser::_NextToken()\n{\n\t// Eat any whitespace, comments, or escaped new lines. Also eat ';' -- they\n\t// have the same function as newlines. We remember the last encountered ';'\n\t// or '\\n' and return it as a token afterwards.\n\tconst char* itemSeparatorPos = NULL;\n\tbool inComment = false;\n\twhile ((inComment && *fPos != '\\0') || isspace(*fPos) || *fPos == ';'\n\t\t|| *fPos == '#' || *fPos == '\\\\') {\n\t\tif (*fPos == '#') {\n\t\t\tinComment = true;\n\t\t} else if (!inComment && *fPos == '\\\\') {\n\t\t\tif (fPos[1] != '\\n')\n\t\t\t\tbreak;\n\t\t\t// ignore escaped line breaks\n\t\t\tfPos++;\n\t\t} else if (*fPos == '\\n') {\n\t\t\titemSeparatorPos = fPos;\n\t\t\tinComment = false;\n\t\t} else if (!inComment && *fPos == ';')\n\t\t\titemSeparatorPos = fPos;\n\t\tfPos++;\n\t}\n\n\tif (itemSeparatorPos != NULL) {\n\t\treturn Token(TOKEN_ITEM_SEPARATOR, itemSeparatorPos);\n\t}\n\n\tconst char* tokenPos = fPos;\n\tswitch (*fPos) {\n\t\tcase '\\0':\n\t\t\treturn Token(TOKEN_EOF, fPos);\n\n\t\tcase '{':\n\t\t\tfPos++;\n\t\t\treturn Token(TOKEN_OPEN_BRACE, tokenPos);\n\n\t\tcase '}':\n\t\t\tfPos++;\n\t\t\treturn Token(TOKEN_CLOSE_BRACE, tokenPos);\n\n\t\tcase '<':\n\t\t\tfPos++;\n\t\t\tif (*fPos == '=') {\n\t\t\t\tfPos++;\n\t\t\t\treturn Token(TOKEN_OPERATOR_LESS_EQUAL, tokenPos, 2);\n\t\t\t}\n\t\t\treturn Token(TOKEN_OPERATOR_LESS, tokenPos, 1);\n\n\t\tcase '=':\n\t\t\tfPos++;\n\t\t\tif (*fPos == '=') {\n\t\t\t\tfPos++;\n\t\t\t\treturn Token(TOKEN_OPERATOR_EQUAL, tokenPos, 2);\n\t\t\t}\n\t\t\treturn Token(TOKEN_OPERATOR_ASSIGN, tokenPos, 1);\n\n\t\tcase '!':\n\t\t\tif (fPos[1] == '=') {\n\t\t\t\tfPos += 2;\n\t\t\t\treturn Token(TOKEN_OPERATOR_NOT_EQUAL, tokenPos, 2);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase '>':\n\t\t\tfPos++;\n\t\t\tif (*fPos == '=') {\n\t\t\t\tfPos++;\n\t\t\t\treturn Token(TOKEN_OPERATOR_GREATER_EQUAL, tokenPos, 2);\n\t\t\t}\n\t\t\treturn Token(TOKEN_OPERATOR_GREATER, tokenPos, 1);\n\n\t\tdefault:\n\t\t{\n\t\t\tstd::string string;\n\t\t\tchar quoteChar = '\\0';\n\n\t\t\tfor (; *fPos != '\\0'; fPos++) {\n\t\t\t\tchar c = *fPos;\n\t\t\t\tif (quoteChar != '\\0') {\n\t\t\t\t\t// within a quoted string segment\n\t\t\t\t\tif (c == quoteChar) {\n\t\t\t\t\t\tquoteChar = '\\0';\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (c == '\\\\') {\n\t\t\t\t\t\t// next char is escaped\n\t\t\t\t\t\tc = *++fPos;\n\t\t\t\t\t\tif (c == '\\0') {\n\t\t\t\t\t\t\tthrow ParseError(\"unterminated quoted-string\",\n\t\t\t\t\t\t\t\ttokenPos);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (c == 'n')\n\t\t\t\t\t\t\tc = '\\n';\n\t\t\t\t\t\telse if (c == 't')\n\t\t\t\t\t\t\tc = '\\t';\n\t\t\t\t\t}\n\n\t\t\t\t\tstring += c;\n\t\t\t\t} else {\n\t\t\t\t\t// unquoted string segment\n\t\t\t\t\tswitch (c) {\n\t\t\t\t\t\tcase '\"':\n\t\t\t\t\t\tcase '\\'':\n\t\t\t\t\t\t\t// quoted string start\n\t\t\t\t\t\t\tquoteChar = c;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tcase '{':\n\t\t\t\t\t\tcase '}':\n\t\t\t\t\t\tcase '<':\n\t\t\t\t\t\tcase '=':\n\t\t\t\t\t\tcase '!':\n\t\t\t\t\t\tcase '>':\n\t\t\t\t\t\t\t// a separator character -- this ends the string\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase '\\\\':\n\t\t\t\t\t\t\t// next char is escaped\n\t\t\t\t\t\t\tc = *++fPos;\n\t\t\t\t\t\t\tif (c == '\\0') {\n\t\t\t\t\t\t\t\tthrow ParseError(\"'\\\\' at end of string\",\n\t\t\t\t\t\t\t\t\ttokenPos);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstring += c;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif (isspace(c))\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tstring += c;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn Token(TOKEN_STRING, tokenPos, fPos - tokenPos,\n\t\t\t\tstring.c_str());\n\t\t}\n\t}\n\n\tBString error = BString(\"unknown token '\") << *fPos << \"' encountered\";\n\tthrow ParseError(error.String(), fPos);\n}\n\n\nvoid\nBPackageInfo::Parser::_RewindTo(const Token& token)\n{\n\tfPos = token.pos;\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseStringValue(BString* value, const char** _tokenPos)\n{\n\tToken string = _NextToken();\n\tif (string.type != TOKEN_STRING)\n\t\tthrow ParseError(\"expected string\", string.pos);\n\n\t*value = string.text;\n\tif (_tokenPos != NULL)\n\t\t*_tokenPos = string.pos;\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseArchitectureValue(BPackageArchitecture* value)\n{\n\tToken arch = _NextToken();\n\tif (arch.type == TOKEN_STRING) {\n\t\tfor (int i = 0; i < B_PACKAGE_ARCHITECTURE_ENUM_COUNT; ++i) {\n\t\t\tif (arch.text.ICompare(BPackageInfo::kArchitectureNames[i]) == 0) {\n\t\t\t\t*value = (BPackageArchitecture)i;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tBString error(\"architecture must be one of: [\");\n\tfor (int i = 0; i < B_PACKAGE_ARCHITECTURE_ENUM_COUNT; ++i) {\n\t\tif (i > 0)\n\t\t\terror << \",\";\n\t\terror << BPackageInfo::kArchitectureNames[i];\n\t}\n\terror << \"]\";\n\tthrow ParseError(error, arch.pos);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseVersionValue(BPackageVersion* value,\n\tbool revisionIsOptional)\n{\n\tToken word = _NextToken();\n\t_ParseVersionValue(word, value, revisionIsOptional);\n}\n\n\n/*static*/ void\nBPackageInfo::Parser::_ParseVersionValue(Token& word, BPackageVersion* value,\n\tbool revisionIsOptional)\n{\n\tif (word.type != TOKEN_STRING)\n\t\tthrow ParseError(\"expected string (a version)\", word.pos);\n\n\t// get the revision number\n\tuint32 revision = 0;\n\tint32 dashPos = word.text.FindLast('-');\n\tif (dashPos >= 0) {\n\t\tchar* end;\n\t\tlong long number = strtoll(word.text.String() + dashPos + 1, &end,\n\t\t\t0);\n\t\tif (*end != '\\0' || number < 0 || number > UINT_MAX) {\n\t\t\tthrow ParseError(\"revision must be a number > 0 and < UINT_MAX\",\n\t\t\t\tword.pos + dashPos + 1);\n\t\t}\n\n\t\trevision = (uint32)number;\n\t\tword.text.Truncate(dashPos);\n\t}\n\n\tif (revision == 0 && !revisionIsOptional) {\n\t\tthrow ParseError(\"expected revision number (-<number> suffix)\",\n\t\t\tword.pos + word.text.Length());\n\t}\n\n\t// get the pre-release string\n\tBString preRelease;\n\tint32 tildePos = word.text.FindLast('~');\n\tif (tildePos >= 0) {\n\t\tword.text.CopyInto(preRelease, tildePos + 1,\n\t\t\tword.text.Length() - tildePos - 1);\n\t\tword.text.Truncate(tildePos);\n\n\t\tif (preRelease.IsEmpty()) {\n\t\t\tthrow ParseError(\"invalid empty pre-release string\",\n\t\t\t\tword.pos + tildePos + 1);\n\t\t}\n\n\t\tint32 errorPos;\n\t\tif (!_IsAlphaNumUnderscore(preRelease, \".\", &errorPos)) {\n\t\t\tthrow ParseError(\"invalid character in pre-release string\",\n\t\t\t\tword.pos + tildePos + 1 + errorPos);\n\t\t}\n\t}\n\n\t// get major, minor, and micro strings\n\tBString major;\n\tBString minor;\n\tBString micro;\n\tint32 firstDotPos = word.text.FindFirst('.');\n\tif (firstDotPos < 0)\n\t\tmajor = word.text;\n\telse {\n\t\tword.text.CopyInto(major, 0, firstDotPos);\n\t\tint32 secondDotPos = word.text.FindFirst('.', firstDotPos + 1);\n\t\tif (secondDotPos == firstDotPos + 1)\n\t\t\tthrow ParseError(\"expected minor version\", word.pos + secondDotPos);\n\n\t\tif (secondDotPos < 0) {\n\t\t\tword.text.CopyInto(minor, firstDotPos + 1, word.text.Length());\n\t\t} else {\n\t\t\tword.text.CopyInto(minor, firstDotPos + 1,\n\t\t\t\tsecondDotPos - (firstDotPos + 1));\n\t\t\tword.text.CopyInto(micro, secondDotPos + 1, word.text.Length());\n\n\t\t\tint32 errorPos;\n\t\t\tif (!_IsAlphaNumUnderscore(micro, \".\", &errorPos)) {\n\t\t\t\tthrow ParseError(\"invalid character in micro version string\",\n\t\t\t\t\tword.pos + secondDotPos + 1 + errorPos);\n\t\t\t}\n\t\t}\n\n\t\tint32 errorPos;\n\t\tif (!_IsAlphaNumUnderscore(minor, \"\", &errorPos)) {\n\t\t\tthrow ParseError(\"invalid character in minor version string\",\n\t\t\t\tword.pos + firstDotPos + 1 + errorPos);\n\t\t}\n\t}\n\n\tint32 errorPos;\n\tif (!_IsAlphaNumUnderscore(major, \"\", &errorPos)) {\n\t\tthrow ParseError(\"invalid character in major version string\",\n\t\t\tword.pos + errorPos);\n\t}\n\n\tvalue->SetTo(major, minor, micro, preRelease, revision);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseResolvableExpression(const Token& token,\n\tBPackageResolvableExpression& _value, BString* _basePackage)\n{\n\tif (token.type != TOKEN_STRING) {\n\t\tthrow ParseError(\"expected word (a resolvable name)\",\n\t\t\ttoken.pos);\n\t}\n\n\tint32 errorPos;\n\tif (!_IsValidResolvableName(token.text, &errorPos)) {\n\t\tthrow ParseError(\"invalid character in resolvable name\",\n\t\t\ttoken.pos + errorPos);\n\t}\n\n\tBPackageVersion version;\n\tToken op = _NextToken();\n\tBPackageResolvableOperator resolvableOperator;\n\tif (op.type == TOKEN_OPERATOR_LESS\n\t\t|| op.type == TOKEN_OPERATOR_LESS_EQUAL\n\t\t|| op.type == TOKEN_OPERATOR_EQUAL\n\t\t|| op.type == TOKEN_OPERATOR_NOT_EQUAL\n\t\t|| op.type == TOKEN_OPERATOR_GREATER_EQUAL\n\t\t|| op.type == TOKEN_OPERATOR_GREATER) {\n\t\t_ParseVersionValue(&version, true);\n\n\t\tif (_basePackage != NULL) {\n\t\t\tToken base = _NextToken();\n\t\t\tif (base.type == TOKEN_STRING && base.text == \"base\") {\n\t\t\t\tif (!_basePackage->IsEmpty()) {\n\t\t\t\t\tthrow ParseError(\"multiple packages marked as base package\",\n\t\t\t\t\t\ttoken.pos);\n\t\t\t\t}\n\n\t\t\t\t*_basePackage = token.text;\n\t\t\t} else\n\t\t\t\t_RewindTo(base);\n\t\t}\n\n\t\tresolvableOperator = (BPackageResolvableOperator)\n\t\t\t(op.type - TOKEN_OPERATOR_LESS);\n\t} else if (op.type == TOKEN_ITEM_SEPARATOR\n\t\t|| op.type == TOKEN_CLOSE_BRACE || op.type == TOKEN_EOF) {\n\t\t_RewindTo(op);\n\t\tresolvableOperator = B_PACKAGE_RESOLVABLE_OP_ENUM_COUNT;\n\t} else {\n\t\tthrow ParseError(\n\t\t\t\"expected '<', '<=', '==', '!=', '>=', '>', comma or '}'\",\n\t\t\top.pos);\n\t}\n\n\t_value.SetTo(token.text, resolvableOperator, version);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseList(ListElementParser& elementParser,\n\tbool allowSingleNonListElement)\n{\n\tToken openBracket = _NextToken();\n\tif (openBracket.type != TOKEN_OPEN_BRACE) {\n\t\tif (!allowSingleNonListElement)\n\t\t\tthrow ParseError(\"expected start of list ('{')\", openBracket.pos);\n\n\t\telementParser(openBracket);\n\t\treturn;\n\t}\n\n\twhile (true) {\n\t\tToken token = _NextToken();\n\t\tif (token.type == TOKEN_CLOSE_BRACE)\n\t\t\treturn;\n\n\t\tif (token.type == TOKEN_ITEM_SEPARATOR)\n\t\t\tcontinue;\n\n\t\telementParser(token);\n\t}\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseStringList(BStringList* value,\n\tbool requireResolvableName, bool convertToLowerCase,\n\tStringValidator* stringValidator)\n{\n\tstruct StringParser : public ListElementParser {\n\t\tBStringList* value;\n\t\tbool requireResolvableName;\n\t\tbool convertToLowerCase;\n\t\tStringValidator* stringValidator;\n\n\t\tStringParser(BStringList* value, bool requireResolvableName,\n\t\t\tbool convertToLowerCase, StringValidator* stringValidator)\n\t\t\t:\n\t\t\tvalue(value),\n\t\t\trequireResolvableName(requireResolvableName),\n\t\t\tconvertToLowerCase(convertToLowerCase),\n\t\t\tstringValidator(stringValidator)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING)\n\t\t\t\tthrow ParseError(\"expected string\", token.pos);\n\n\t\t\tif (requireResolvableName) {\n\t\t\t\tint32 errorPos;\n\t\t\t\tif (!_IsValidResolvableName(token.text, &errorPos)) {\n\t\t\t\t\tthrow ParseError(\"invalid character in resolvable name\",\n\t\t\t\t\t\ttoken.pos + errorPos);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tBString element(token.text);\n\t\t\tif (convertToLowerCase)\n\t\t\t\telement.ToLower();\n\n\t\t\tif (stringValidator != NULL)\n\t\t\t\tstringValidator->Validate(element, token.pos);\n\n\t\t\tvalue->Add(element);\n\t\t}\n\t} stringParser(value, requireResolvableName, convertToLowerCase,\n\t\tstringValidator);\n\n\t_ParseList(stringParser, true);\n}\n\n\nuint32\nBPackageInfo::Parser::_ParseFlags()\n{\n\tstruct FlagParser : public ListElementParser {\n\t\tuint32 flags;\n\n\t\tFlagParser()\n\t\t\t:\n\t\t\tflags(0)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING)\n\t\t\t\tthrow ParseError(\"expected word (a flag)\", token.pos);\n\n\t\t\tif (token.text.ICompare(\"approve_license\") == 0)\n\t\t\t\tflags |= B_PACKAGE_FLAG_APPROVE_LICENSE;\n\t\t\telse if (token.text.ICompare(\"system_package\") == 0)\n\t\t\t\tflags |= B_PACKAGE_FLAG_SYSTEM_PACKAGE;\n\t\t\telse {\n\t\t\t\tthrow ParseError(\n\t\t\t\t\t\"expected 'approve_license' or 'system_package'\",\n\t\t\t\t\ttoken.pos);\n\t\t\t}\n\t\t}\n\t} flagParser;\n\n\t_ParseList(flagParser, true);\n\n\treturn flagParser.flags;\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseResolvableList(\n\tBObjectList<BPackageResolvable>* value)\n{\n\tstruct ResolvableParser : public ListElementParser {\n\t\tParser& parser;\n\t\tBObjectList<BPackageResolvable>* value;\n\n\t\tResolvableParser(Parser& parser_,\n\t\t\tBObjectList<BPackageResolvable>* value_)\n\t\t\t:\n\t\t\tparser(parser_),\n\t\t\tvalue(value_)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING) {\n\t\t\t\tthrow ParseError(\"expected word (a resolvable name)\",\n\t\t\t\t\ttoken.pos);\n\t\t\t}\n\n\t\t\tint32 errorPos;\n\t\t\tif (!_IsValidResolvableName(token.text, &errorPos)) {\n\t\t\t\tthrow ParseError(\"invalid character in resolvable name\",\n\t\t\t\t\ttoken.pos + errorPos);\n\t\t\t}\n\n\t\t\t// parse version\n\t\t\tBPackageVersion version;\n\t\t\tToken op = parser._NextToken();\n\t\t\tif (op.type == TOKEN_OPERATOR_ASSIGN) {\n\t\t\t\tparser._ParseVersionValue(&version, true);\n\t\t\t} else if (op.type == TOKEN_ITEM_SEPARATOR\n\t\t\t\t|| op.type == TOKEN_CLOSE_BRACE) {\n\t\t\t\tparser._RewindTo(op);\n\t\t\t} else\n\t\t\t\tthrow ParseError(\"expected '=', comma or '}'\", op.pos);\n\n\t\t\t// parse compatible version\n\t\t\tBPackageVersion compatibleVersion;\n\t\t\tToken compatible = parser._NextToken();\n\t\t\tif (compatible.type == TOKEN_STRING\n\t\t\t\t&& (compatible.text == \"compat\"\n\t\t\t\t\t|| compatible.text == \"compatible\")) {\n\t\t\t\top = parser._NextToken();\n\t\t\t\tif (op.type == TOKEN_OPERATOR_GREATER_EQUAL) {\n\t\t\t\t\tparser._ParseVersionValue(&compatibleVersion, true);\n\t\t\t\t} else\n\t\t\t\t\tparser._RewindTo(compatible);\n\t\t\t} else\n\t\t\t\tparser._RewindTo(compatible);\n\n\t\t\tvalue->AddItem(new BPackageResolvable(token.text, version,\n\t\t\t\tcompatibleVersion));\n\t\t}\n\t} resolvableParser(*this, value);\n\n\t_ParseList(resolvableParser, false);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseResolvableExprList(\n\tBObjectList<BPackageResolvableExpression>* value, BString* _basePackage)\n{\n\tstruct ResolvableExpressionParser : public ListElementParser {\n\t\tParser& parser;\n\t\tBObjectList<BPackageResolvableExpression>* value;\n\t\tBString* basePackage;\n\n\t\tResolvableExpressionParser(Parser& parser,\n\t\t\tBObjectList<BPackageResolvableExpression>* value,\n\t\t\tBString* basePackage)\n\t\t\t:\n\t\t\tparser(parser),\n\t\t\tvalue(value),\n\t\t\tbasePackage(basePackage)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tBPackageResolvableExpression expression;\n\t\t\tparser._ParseResolvableExpression(token, expression, basePackage);\n\t\t\tvalue->AddItem(new BPackageResolvableExpression(expression));\n\t\t}\n\t} resolvableExpressionParser(*this, value, _basePackage);\n\n\t_ParseList(resolvableExpressionParser, false);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseGlobalWritableFileInfos(\n\tGlobalWritableFileInfoList* infos)\n{\n\tstruct GlobalWritableFileInfoParser : public ListElementParser {\n\t\tParser& parser;\n\t\tGlobalWritableFileInfoList* infos;\n\n\t\tGlobalWritableFileInfoParser(Parser& parser,\n\t\t\tGlobalWritableFileInfoList* infos)\n\t\t\t:\n\t\t\tparser(parser),\n\t\t\tinfos(infos)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING) {\n\t\t\t\tthrow ParseError(\"expected string (a file path)\",\n\t\t\t\t\ttoken.pos);\n\t\t\t}\n\n\t\t\tBWritableFileUpdateType updateType\n\t\t\t\t= B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT;\n\t\t\tbool isDirectory = false;\n\n\t\t\tToken nextToken = parser._NextToken();\n\t\t\tif (nextToken.type == TOKEN_STRING\n\t\t\t\t&& nextToken.text == \"directory\") {\n\t\t\t\tisDirectory = true;\n\t\t\t\tnextToken = parser._NextToken();\n\t\t\t}\n\n\t\t\tif (nextToken.type == TOKEN_STRING) {\n\t\t\t\tconst char* const* end = kWritableFileUpdateTypes\n\t\t\t\t\t+ B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT;\n\t\t\t\tconst char* const* found = std::find(kWritableFileUpdateTypes,\n\t\t\t\t\tend, nextToken.text);\n\t\t\t\tif (found == end) {\n\t\t\t\t\tthrow ParseError(BString(\"expected an update type\"),\n\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t}\n\t\t\t\tupdateType = (BWritableFileUpdateType)(\n\t\t\t\t\tfound - kWritableFileUpdateTypes);\n\t\t\t} else if (nextToken.type == TOKEN_ITEM_SEPARATOR\n\t\t\t\t|| nextToken.type == TOKEN_CLOSE_BRACE) {\n\t\t\t\tparser._RewindTo(nextToken);\n\t\t\t} else {\n\t\t\t\tthrow ParseError(\n\t\t\t\t\t\"expected 'included', semicolon, new line or '}'\",\n\t\t\t\t\tnextToken.pos);\n\t\t\t}\n\n\t\t\tif (!infos->AddItem(new BGlobalWritableFileInfo(token.text,\n\t\t\t\t\tupdateType, isDirectory))) {\n\t\t\t\tthrow std::bad_alloc();\n\t\t\t}\n\t\t}\n\t} resolvableExpressionParser(*this, infos);\n\n\t_ParseList(resolvableExpressionParser, false);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseUserSettingsFileInfos(\n\tUserSettingsFileInfoList* infos)\n{\n\tstruct UserSettingsFileInfoParser : public ListElementParser {\n\t\tParser& parser;\n\t\tUserSettingsFileInfoList* infos;\n\n\t\tUserSettingsFileInfoParser(Parser& parser,\n\t\t\tUserSettingsFileInfoList* infos)\n\t\t\t:\n\t\t\tparser(parser),\n\t\t\tinfos(infos)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING) {\n\t\t\t\tthrow ParseError(\"expected string (a settings file path)\",\n\t\t\t\t\ttoken.pos);\n\t\t\t}\n\n\t\t\tBString templatePath;\n\t\t\tbool isDirectory = false;\n\n\t\t\tToken nextToken = parser._NextToken();\n\t\t\tif (nextToken.type == TOKEN_STRING\n\t\t\t\t&& nextToken.text == \"directory\") {\n\t\t\t\tisDirectory = true;\n\t\t\t} else if (nextToken.type == TOKEN_STRING\n\t\t\t\t&& nextToken.text == \"template\") {\n\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\tthrow ParseError(\n\t\t\t\t\t\t\"expected string (a settings template file path)\",\n\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t}\n\t\t\t\ttemplatePath = nextToken.text;\n\t\t\t} else if (nextToken.type == TOKEN_ITEM_SEPARATOR\n\t\t\t\t|| nextToken.type == TOKEN_CLOSE_BRACE) {\n\t\t\t\tparser._RewindTo(nextToken);\n\t\t\t} else {\n\t\t\t\tthrow ParseError(\n\t\t\t\t\t\"expected 'template', semicolon, new line or '}'\",\n\t\t\t\t\tnextToken.pos);\n\t\t\t}\n\n\t\t\tif (isDirectory\n\t\t\t\t? !infos->AddItem(new BUserSettingsFileInfo(token.text, true))\n\t\t\t\t: !infos->AddItem(new BUserSettingsFileInfo(token.text,\n\t\t\t\t\t\ttemplatePath))) {\n\t\t\t\tthrow std::bad_alloc();\n\t\t\t}\n\t\t}\n\t} resolvableExpressionParser(*this, infos);\n\n\t_ParseList(resolvableExpressionParser, false);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseUsers(UserList* users)\n{\n\tstruct UserParser : public ListElementParser {\n\t\tParser& parser;\n\t\tUserList* users;\n\n\t\tUserParser(Parser& parser, UserList* users)\n\t\t\t:\n\t\t\tparser(parser),\n\t\t\tusers(users)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING\n\t\t\t\t|| !BUser::IsValidUserName(token.text)) {\n\t\t\t\tthrow ParseError(\"expected a user name\", token.pos);\n\t\t\t}\n\n\t\t\tBString realName;\n\t\t\tBString home;\n\t\t\tBString shell;\n\t\t\tBStringList groups;\n\n\t\t\tfor (;;) {\n\t\t\t\tToken nextToken = parser._NextToken();\n\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\tparser._RewindTo(nextToken);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (nextToken.text == \"real-name\") {\n\t\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\t\tthrow ParseError(\"expected string (a user real name)\",\n\t\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t\t}\n\t\t\t\t\trealName = nextToken.text;\n\t\t\t\t} else if (nextToken.text == \"home\") {\n\t\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\t\tthrow ParseError(\"expected string (a home path)\",\n\t\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t\t}\n\t\t\t\t\thome = nextToken.text;\n\t\t\t\t} else if (nextToken.text == \"shell\") {\n\t\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\t\tthrow ParseError(\"expected string (a shell path)\",\n\t\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t\t}\n\t\t\t\t\tshell = nextToken.text;\n\t\t\t\t} else if (nextToken.text == \"groups\") {\n\t\t\t\t\tfor (;;) {\n\t\t\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\t\t\tif (nextToken.type == TOKEN_STRING\n\t\t\t\t\t\t\t&& BUser::IsValidUserName(nextToken.text)) {\n\t\t\t\t\t\t\tif (!groups.Add(nextToken.text))\n\t\t\t\t\t\t\t\tthrow std::bad_alloc();\n\t\t\t\t\t\t} else if (nextToken.type == TOKEN_ITEM_SEPARATOR\n\t\t\t\t\t\t\t|| nextToken.type == TOKEN_CLOSE_BRACE) {\n\t\t\t\t\t\t\tparser._RewindTo(nextToken);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow ParseError(\"expected a group name\",\n\t\t\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tthrow ParseError(\n\t\t\t\t\t\t\"expected 'real-name', 'home', 'shell', or 'groups'\",\n\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tBString templatePath;\n\n\t\t\tToken nextToken = parser._NextToken();\n\t\t\tif (nextToken.type == TOKEN_STRING\n\t\t\t\t&& nextToken.text == \"template\") {\n\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\tthrow ParseError(\n\t\t\t\t\t\t\"expected string (a settings template file path)\",\n\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t}\n\t\t\t\ttemplatePath = nextToken.text;\n\t\t\t} else if (nextToken.type == TOKEN_ITEM_SEPARATOR\n\t\t\t\t|| nextToken.type == TOKEN_CLOSE_BRACE) {\n\t\t\t\tparser._RewindTo(nextToken);\n\t\t\t} else {\n\t\t\t\tthrow ParseError(\n\t\t\t\t\t\"expected 'template', semicolon, new line or '}'\",\n\t\t\t\t\tnextToken.pos);\n\t\t\t}\n\n\t\t\tif (!users->AddItem(new BUser(token.text, realName, home, shell,\n\t\t\t\t\tgroups))) {\n\t\t\t\tthrow std::bad_alloc();\n\t\t\t}\n\t\t}\n\t} resolvableExpressionParser(*this, users);\n\n\t_ParseList(resolvableExpressionParser, false);\n}\n\n\nvoid\nBPackageInfo::Parser::_Parse(BPackageInfo* packageInfo)\n{\n\tbool seen[B_PACKAGE_INFO_ENUM_COUNT];\n\tfor (int i = 0; i < B_PACKAGE_INFO_ENUM_COUNT; ++i)\n\t\tseen[i] = false;\n\n\tconst char* const* names = BPackageInfo::kElementNames;\n\n\twhile (Token t = _NextToken()) {\n\t\tif (t.type == TOKEN_ITEM_SEPARATOR)\n\t\t\tcontinue;\n\n\t\tif (t.type != TOKEN_STRING)\n\t\t\tthrow ParseError(\"expected string (a variable name)\", t.pos);\n\n\t\tBPackageInfoAttributeID attribute = B_PACKAGE_INFO_ENUM_COUNT;\n\t\tfor (int i = 0; i < B_PACKAGE_INFO_ENUM_COUNT; i++) {\n\t\t\tif (names[i] != NULL && t.text.ICompare(names[i]) == 0) {\n\t\t\t\tattribute = (BPackageInfoAttributeID)i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (attribute == B_PACKAGE_INFO_ENUM_COUNT) {\n\t\t\tBString error = BString(\"unknown attribute \\\"\") << t.text << '\"';\n\t\t\tthrow ParseError(error, t.pos);\n\t\t}\n\n\t\tif (seen[attribute]) {\n\t\t\tBString error = BString(names[attribute]) << \" already seen!\";\n\t\t\tthrow ParseError(error, t.pos);\n\t\t}\n\n\t\tswitch (attribute) {\n\t\t\tcase B_PACKAGE_INFO_NAME:\n\t\t\t{\n\t\t\t\tBString name;\n\t\t\t\tconst char* namePos;\n\t\t\t\t_ParseStringValue(&name, &namePos);\n\n\t\t\t\tint32 errorPos;\n\t\t\t\tif (!_IsValidResolvableName(name, &errorPos)) {\n\t\t\t\t\tthrow ParseError(\"invalid character in package name\",\n\t\t\t\t\t\tnamePos + errorPos);\n\t\t\t\t}\n\n\t\t\t\tpackageInfo->SetName(name);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase B_PACKAGE_INFO_SUMMARY:\n\t\t\t{\n\t\t\t\tBString summary;\n\t\t\t\t_ParseStringValue(&summary);\n\t\t\t\tif (summary.FindFirst('\\n') >= 0)\n\t\t\t\t\tthrow ParseError(\"the summary contains linebreaks\", t.pos);\n\t\t\t\tpackageInfo->SetSummary(summary);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase B_PACKAGE_INFO_DESCRIPTION:\n\t\t\t\t_ParseStringValue(&packageInfo->fDescription);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_VENDOR:\n\t\t\t\t_ParseStringValue(&packageInfo->fVendor);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_PACKAGER:\n\t\t\t\t_ParseStringValue(&packageInfo->fPackager);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_BASE_PACKAGE:\n\t\t\t\t_ParseStringValue(&packageInfo->fBasePackage);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_ARCHITECTURE:\n\t\t\t\t_ParseArchitectureValue(&packageInfo->fArchitecture);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_VERSION:\n\t\t\t\t_ParseVersionValue(&packageInfo->fVersion, false);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_COPYRIGHTS:\n\t\t\t\t_ParseStringList(&packageInfo->fCopyrightList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_LICENSES:\n\t\t\t\t_ParseStringList(&packageInfo->fLicenseList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_URLS:\n\t\t\t{\n\t\t\t\tUrlStringValidator stringValidator;\n\t\t\t\t_ParseStringList(&packageInfo->fURLList,\n\t\t\t\t\tfalse, false, &stringValidator);\n\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_SOURCE_URLS:\n\t\t\t{\n\t\t\t\tUrlStringValidator stringValidator;\n\t\t\t\t_ParseStringList(&packageInfo->fSourceURLList,\n\t\t\t\t\tfalse, false, &stringValidator);\n\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES:\n\t\t\t\t_ParseGlobalWritableFileInfos(\n\t\t\t\t\t&packageInfo->fGlobalWritableFileInfos);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_USER_SETTINGS_FILES:\n\t\t\t\t_ParseUserSettingsFileInfos(\n\t\t\t\t\t&packageInfo->fUserSettingsFileInfos);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_USERS:\n\t\t\t\t_ParseUsers(&packageInfo->fUsers);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_GROUPS:\n\t\t\t\t_ParseStringList(&packageInfo->fGroups);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_POST_INSTALL_SCRIPTS:\n\t\t\t\t_ParseStringList(&packageInfo->fPostInstallScripts);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_PROVIDES:\n\t\t\t\t_ParseResolvableList(&packageInfo->fProvidesList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_REQUIRES:\n\t\t\t\tpackageInfo->fBasePackage.Truncate(0);\n\t\t\t\t_ParseResolvableExprList(&packageInfo->fRequiresList,\n\t\t\t\t\t&packageInfo->fBasePackage);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_SUPPLEMENTS:\n\t\t\t\t_ParseResolvableExprList(&packageInfo->fSupplementsList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_CONFLICTS:\n\t\t\t\t_ParseResolvableExprList(&packageInfo->fConflictsList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_FRESHENS:\n\t\t\t\t_ParseResolvableExprList(&packageInfo->fFreshensList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_REPLACES:\n\t\t\t\t_ParseStringList(&packageInfo->fReplacesList, true);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_FLAGS:\n\t\t\t\tpackageInfo->SetFlags(_ParseFlags());\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// can never get here\n\t\t\t\tbreak;\n\t\t}\n\n\t\tseen[attribute] = true;\n\t}\n\n\t// everything up to and including 'provides' is mandatory\n\tfor (int i = 0; i <= B_PACKAGE_INFO_PROVIDES; ++i) {\n\t\tif (!seen[i]) {\n\t\t\tBString error = BString(names[i]) << \" is not being set anywhere!\";\n\t\t\tthrow ParseError(error, fPos);\n\t\t}\n\t}\n}\n\n\n/*static*/ inline bool\nBPackageInfo::Parser::_IsAlphaNumUnderscore(const BString& string,\n\tconst char* additionalChars, int32* _errorPos)\n{\n\treturn _IsAlphaNumUnderscore(string.String(),\n\t\tstring.String() + string.Length(), additionalChars, _errorPos);\n}\n\n\n/*static*/ inline bool\nBPackageInfo::Parser::_IsAlphaNumUnderscore(const char* string,\n\tconst char* additionalChars, int32* _errorPos)\n{\n\treturn _IsAlphaNumUnderscore(string, string + strlen(string),\n\t\tadditionalChars, _errorPos);\n}\n\n\n/*static*/ bool\nBPackageInfo::Parser::_IsAlphaNumUnderscore(const char* start, const char* end,\n\tconst char* additionalChars, int32* _errorPos)\n{\n\tfor (const char* c = start; c < end; c++) {\n\t\tif (!isalnum(*c) && *c != '_' && strchr(additionalChars, *c) == NULL) {\n\t\t\tif (_errorPos != NULL)\n\t\t\t\t*_errorPos = c - start;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n/*static*/ bool\nBPackageInfo::Parser::_IsValidResolvableName(const char* string,\n\tint32* _errorPos)\n{\n\tfor (const char* c = string; *c != '\\0'; c++) {\n\t\tswitch (*c) {\n\t\t\tcase '-':\n\t\t\tcase '/':\n\t\t\tcase '<':\n\t\t\tcase '>':\n\t\t\tcase '=':\n\t\t\tcase '!':\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (!isspace(*c))\n\t\t\t\t\tcontinue;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (_errorPos != NULL)\n\t\t\t*_errorPos = c - string;\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nvoid\nBPackageInfo::Parser::UrlStringValidator::Validate(const BString& urlString,\n\tconst char* pos)\n{\n\tBUrl url(urlString);\n\n\tif (!url.IsValid())\n\t\tthrow ParseError(\"invalid url\", pos);\n}\n\n\n} // namespace BPackageKit\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/ThreadedQueue.h",
    "content": "/*\n * This file is part of IRCBot\n * Copyright © 2014 Rachel Mant (dx-mon@users.sourceforge.net)\n *\n * IRCBot is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * IRCBot is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#ifndef __THREADED_QUEUE_H__\n#define __THREADED_QUEUE_H__\n\n#include <pthread.h>\n#include <queue>\n\ntemplate<class T>\nclass ThreadedQueue : public std::queue<T>\n{\nprivate:\n\tpthread_mutex_t queueMutex;\n\tpthread_cond_t queueCond;\n\npublic:\n\tThreadedQueue()\n\t{\n\t\tpthread_mutexattr_t mutexAttrs;\n\t\tpthread_condattr_t condAttrs;\n\n\t\tpthread_mutexattr_init(&mutexAttrs);\n\t\tpthread_mutexattr_settype(&mutexAttrs, PTHREAD_MUTEX_ERRORCHECK);\n\t\tpthread_mutex_init(&queueMutex, &mutexAttrs);\n\t\tpthread_mutexattr_destroy(&mutexAttrs);\n\n\t\tpthread_condattr_init(&condAttrs);\n\t\tpthread_condattr_setpshared(&condAttrs, PTHREAD_PROCESS_PRIVATE);\n\t\tpthread_cond_init(&queueCond, &condAttrs);\n\t\tpthread_condattr_destroy(&condAttrs);\n\t}\n\n\t~ThreadedQueue()\n\t{\n\t\tpthread_cond_destroy(&queueCond);\n\t\tpthread_mutex_destroy(&queueMutex);\n\t}\n\n\tvoid waitItems()\n\t{\n\t\tpthread_mutex_lock(&queueMutex);\n\t\tpthread_cond_wait(&queueCond, &queueMutex);\n\t\tpthread_mutex_unlock(&queueMutex);\n\t}\n\n\tvoid signalItems()\n\t{\n\t\tpthread_mutex_lock(&queueMutex);\n\t\tpthread_cond_broadcast(&queueCond);\n\t\tpthread_mutex_unlock(&queueMutex);\n\t}\n\n\tvoid push(T item)\n\t{\n\t\tstd::queue<T>::push(item);\n\t\tsignalItems();\n\t}\n};\n\n#endif /*__THREADED_QUEUE_H__*/\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/Types.h",
    "content": "/*****************************************************************************\n* Dwarf Mine - The 13-11 Benchmark\n*\n* Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber,\n* Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary;\n* Zimmermann, Florian\n*\n* Permission is hereby granted, free of charge, to any person obtaining\n* a copy of this software and associated documentation files (the\n* \"Software\"), to deal in the Software without restriction, including\n* without limitation the rights to use, copy, modify, merge, publish,\n* distribute, sublicense, and/or sell copies of the Software, and to\n* permit persons to whom the Software is furnished to do so, subject to\n* the following conditions:\n*\n* The above copyright notice and this permission notice shall be\n* included in all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*****************************************************************************/\n\n#pragma once\n\n#include <cstdint>\n\ntypedef uint32_t smallPrime_t;\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/bar.h",
    "content": "class Bar\n{\n  protected:\n\n    char *name;\n\n  public:\n\n    void hello();\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/bar.hh",
    "content": "class Bar\n{\n  protected:\n\n    char *name;\n\n  public:\n\n    void hello();\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/bar.hpp",
    "content": "class Bar\n{\n  protected:\n\n    char *name;\n\n  public:\n\n    void hello();\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/bug1163046.--skeleton.re",
    "content": "#include <iostream>\n\n#define YYCTYPE unsigned char\n#define YYCURSOR cursor\n#define YYLIMIT cursor\n#define YYMARKER marker\n#define YYFILL(n)\n\nbool scan(const char *text)\n{\n\tYYCTYPE *start = (YYCTYPE *)text;\n\tYYCTYPE *cursor = (YYCTYPE *)text;\n\tYYCTYPE *marker = (YYCTYPE *)text;\nnext:\n\tYYCTYPE *token = cursor;\n/*!re2c\n'(This file must be converted with BinHex 4.0)'\n\t{\n\t\tif (token == start || *(token - 1) == '\\n')\n\t\treturn true; else goto next;\n\t}\n[\\001-\\377]\n\t{ goto next; }\n[\\000]\n\t{ return false; }\n*/\n\treturn false;\n}\n\n#define do_scan(str, expect) \\\n\tres = scan(str) == expect ? 0 : 1; \\\n\tstd::cerr << str << \"\\t-\\t\" << (res ? \"fail\" : \"ok\") << std::endl; \\\n\tresult += res\n\n/*!max:re2c */\n\nint main(int,void**)\n{\n\tint res, result = 0;\n\tdo_scan(\"(This file must be converted with BinHex 4.0)\", 1);\n\tdo_scan(\"x(This file must be converted with BinHex 4.0)\", 0);\n\tdo_scan(\"(This file must be converted with BinHex 4.0)x\", 1);\n\tdo_scan(\"x(This file must be converted with BinHex 4.0)x\", 0);\n\t\n\treturn result;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/cnokw.re",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#define\tADDEQ\t257\n#define\tANDAND\t258\n#define\tANDEQ\t259\n#define\tARRAY\t260\n#define\tASM\t261\n#define\tAUTO\t262\n#define\tBREAK\t263\n#define\tCASE\t264\n#define\tCHAR\t265\n#define\tCONST\t266\n#define\tCONTINUE\t267\n#define\tDECR\t268\n#define\tDEFAULT\t269\n#define\tDEREF\t270\n#define\tDIVEQ\t271\n#define\tDO\t272\n#define\tDOUBLE\t273\n#define\tELLIPSIS\t274\n#define\tELSE\t275\n#define\tENUM\t276\n#define\tEQL\t277\n#define\tEXTERN\t278\n#define\tFCON\t279\n#define\tFLOAT\t280\n#define\tFOR\t281\n#define\tFUNCTION\t282\n#define\tGEQ\t283\n#define\tGOTO\t284\n#define\tICON\t285\n#define\tID\t286\n#define\tIF\t287\n#define\tINCR\t288\n#define\tINT\t289\n#define\tLEQ\t290\n#define\tLONG\t291\n#define\tLSHIFT\t292\n#define\tLSHIFTEQ\t293\n#define\tMODEQ\t294\n#define\tMULEQ\t295\n#define\tNEQ\t296\n#define\tOREQ\t297\n#define\tOROR\t298\n#define\tPOINTER\t299\n#define\tREGISTER\t300\n#define\tRETURN\t301\n#define\tRSHIFT\t302\n#define\tRSHIFTEQ\t303\n#define\tSCON\t304\n#define\tSHORT\t305\n#define\tSIGNED\t306\n#define\tSIZEOF\t307\n#define\tSTATIC\t308\n#define\tSTRUCT\t309\n#define\tSUBEQ\t310\n#define\tSWITCH\t311\n#define\tTYPEDEF\t312\n#define\tUNION\t313\n#define\tUNSIGNED\t314\n#define\tVOID\t315\n#define\tVOLATILE\t316\n#define\tWHILE\t317\n#define\tXOREQ\t318\n#define\tEOI\t319\n\ntypedef unsigned int uint;\ntypedef unsigned char uchar;\n\n#define\tBSIZE\t8192\n\n#define\tYYCTYPE\t\tuchar\n#define\tYYCURSOR\tcursor\n#define\tYYLIMIT\t\ts->lim\n#define\tYYMARKER\ts->ptr\n#define\tYYFILL(n)\t{cursor = fill(s, cursor);}\n\n#define\tRET(i)\t{s->cur = cursor; return i;}\n\ntypedef struct Scanner {\n    int\t\t\tfd;\n    uchar\t\t*bot, *tok, *ptr, *cur, *pos, *lim, *top, *eof;\n    uint\t\tline;\n} Scanner;\n\nuchar *fill(Scanner *s, uchar *cursor){\n    if(!s->eof){\n\tuint cnt = s->tok - s->bot;\n\tif(cnt){\n\t    memcpy(s->bot, s->tok, s->lim - s->tok);\n\t    s->tok = s->bot;\n\t    s->ptr -= cnt;\n\t    cursor -= cnt;\n\t    s->pos -= cnt;\n\t    s->lim -= cnt;\n\t}\n\tif((s->top - s->lim) < BSIZE){\n\t    uchar *buf = (uchar*) malloc(((s->lim - s->bot) + BSIZE)*sizeof(uchar));\n\t    memcpy(buf, s->tok, s->lim - s->tok);\n\t    s->tok = buf;\n\t    s->ptr = &buf[s->ptr - s->bot];\n\t    cursor = &buf[cursor - s->bot];\n\t    s->pos = &buf[s->pos - s->bot];\n\t    s->lim = &buf[s->lim - s->bot];\n\t    s->top = &s->lim[BSIZE];\n\t    free(s->bot);\n\t    s->bot = buf;\n\t}\n\tif((cnt = read(s->fd, (char*) s->lim, BSIZE)) != BSIZE){\n\t    s->eof = &s->lim[cnt]; *(s->eof)++ = '\\n';\n\t}\n\ts->lim += cnt;\n    }\n    return cursor;\n}\n\nint scan(Scanner *s){\n\tuchar *cursor = s->cur;\nstd:\n\ts->tok = cursor;\n/*!re2c\nany\t= [\\000-\\377];\nO\t= [0-7];\nD\t= [0-9];\nL\t= [a-zA-Z_];\nH\t= [a-fA-F0-9];\nE\t= [Ee] [+-]? D+;\nFS\t= [fFlL];\nIS\t= [uUlL]*;\nESC\t= [\\\\] ([abfnrtv?'\"\\\\] | \"x\" H+ | O+);\n*/\n\n/*!re2c\n\t\"/*\"\t\t\t{ goto comment; }\n\t\n\tL (L|D)*\t\t{ RET(ID); }\n\t\n\t(\"0\" [xX] H+ IS?) | (\"0\" D+ IS?) | (D+ IS?) |\n\t(['] (ESC|any\\[\\n\\\\'])* ['])\n\t\t\t\t{ RET(ICON); }\n\t\n\t(D+ E FS?) | (D* \".\" D+ E? FS?) | (D+ \".\" D* E? FS?)\n\t\t\t\t{ RET(FCON); }\n\t\n\t([\"] (ESC|any\\[\\n\\\\\"])* [\"])\n\t\t\t\t{ RET(SCON); }\n\t\n\t\"...\"                   { RET(ELLIPSIS); }\n\t\">>=\"\t\t\t{ RET(RSHIFTEQ); }\n\t\"<<=\"\t\t\t{ RET(LSHIFTEQ); }\n\t\"+=\"\t\t\t{ RET(ADDEQ); }\n\t\"-=\"\t\t\t{ RET(SUBEQ); }\n\t\"*=\"\t\t\t{ RET(MULEQ); }\n\t\"/=\"\t\t\t{ RET(DIVEQ); }\n\t\"%=\"\t\t\t{ RET(MODEQ); }\n\t\"&=\"\t\t\t{ RET(ANDEQ); }\n\t\"^=\"\t\t\t{ RET(XOREQ); }\n\t\"|=\"\t\t\t{ RET(OREQ); }\n\t\">>\"\t\t\t{ RET(RSHIFT); }\n\t\"<<\"\t\t\t{ RET(LSHIFT); }\n\t\"++\"\t\t\t{ RET(INCR); }\n\t\"--\"\t\t\t{ RET(DECR); }\n\t\"->\"\t\t\t{ RET(DEREF); }\n\t\"&&\"\t\t\t{ RET(ANDAND); }\n\t\"||\"\t\t\t{ RET(OROR); }\n\t\"<=\"\t\t\t{ RET(LEQ); }\n\t\">=\"\t\t\t{ RET(GEQ); }\n\t\"==\"\t\t\t{ RET(EQL); }\n\t\"!=\"\t\t\t{ RET(NEQ); }\n\t\";\"\t\t\t{ RET(';'); }\n\t\"{\"\t\t\t{ RET('{'); }\n\t\"}\"\t\t\t{ RET('}'); }\n\t\",\"\t\t\t{ RET(','); }\n\t\":\"\t\t\t{ RET(':'); }\n\t\"=\"\t\t\t{ RET('='); }\n\t\"(\"\t\t\t{ RET('('); }\n\t\")\"\t\t\t{ RET(')'); }\n\t\"[\"\t\t\t{ RET('['); }\n\t\"]\"\t\t\t{ RET(']'); }\n\t\".\"\t\t\t{ RET('.'); }\n\t\"&\"\t\t\t{ RET('&'); }\n\t\"!\"\t\t\t{ RET('!'); }\n\t\"~\"\t\t\t{ RET('~'); }\n\t\"-\"\t\t\t{ RET('-'); }\n\t\"+\"\t\t\t{ RET('+'); }\n\t\"*\"\t\t\t{ RET('*'); }\n\t\"/\"\t\t\t{ RET('/'); }\n\t\"%\"\t\t\t{ RET('%'); }\n\t\"<\"\t\t\t{ RET('<'); }\n\t\">\"\t\t\t{ RET('>'); }\n\t\"^\"\t\t\t{ RET('^'); }\n\t\"|\"\t\t\t{ RET('|'); }\n\t\"?\"\t\t\t{ RET('?'); }\n\n\n\t[ \\t\\v\\f]+\t\t{ goto std; }\n\n\t\"\\n\"\n\t    {\n\t\tif(cursor == s->eof) RET(EOI);\n\t\ts->pos = cursor; s->line++;\n\t\tgoto std;\n\t    }\n\n\tany\n\t    {\n\t\tprintf(\"unexpected character: %c\\n\", *s->tok);\n\t\tgoto std;\n\t    }\n*/\n\ncomment:\n/*!re2c\n\t\"*/\"\t\t\t{ goto std; }\n\t\"\\n\"\n\t    {\n\t\tif(cursor == s->eof) RET(EOI);\n\t\ts->tok = s->pos = cursor; s->line++;\n\t\tgoto comment;\n\t    }\n        any\t\t\t{ goto comment; }\n*/\n}\n\nmain(){\n    Scanner in;\n    int t;\n    memset((char*) &in, 0, sizeof(in));\n    in.fd = 0;\n    while((t = scan(&in)) != EOI){\n/*\n\tprintf(\"%d\\t%.*s\\n\", t, in.cur - in.tok, in.tok);\n\tprintf(\"%d\\n\", t);\n*/\n    }\n    close(in.fd);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/crypter.cpp",
    "content": "// Copyright (c) 2009-2012 The Bitcoin Developers\n// Distributed under the MIT/X11 software license, see the accompanying\n// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n\n// Source - https://github.com/Bradfrogger/Marvelous/blob/master/src/crypter.cpp\n\n#include <openssl/aes.h>\n#include <openssl/evp.h>\n#include <vector>\n#include <string>\n#ifdef WIN32\n#include <windows.h>\n#endif\n\n#include \"crypter.h\"\n\nbool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)\n{\n    if (nRounds < 1 || chSalt.size() != WALLET_CRYPTO_SALT_SIZE)\n        return false;\n\n    int i = 0;\n    if (nDerivationMethod == 0)\n        i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha512(), &chSalt[0],\n                          (unsigned char *)&strKeyData[0], strKeyData.size(), nRounds, chKey, chIV);\n\n    if (i != (int)WALLET_CRYPTO_KEY_SIZE)\n    {\n        OPENSSL_cleanse(chKey, sizeof(chKey));\n        OPENSSL_cleanse(chIV, sizeof(chIV));\n        return false;\n    }\n\n    fKeySet = true;\n    return true;\n}\n\nbool CCrypter::SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV)\n{\n    if (chNewKey.size() != WALLET_CRYPTO_KEY_SIZE || chNewIV.size() != WALLET_CRYPTO_KEY_SIZE)\n        return false;\n\n    memcpy(&chKey[0], &chNewKey[0], sizeof chKey);\n    memcpy(&chIV[0], &chNewIV[0], sizeof chIV);\n\n    fKeySet = true;\n    return true;\n}\n\nbool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext)\n{\n    if (!fKeySet)\n        return false;\n\n    // max ciphertext len for a n bytes of plaintext is\n    // n + AES_BLOCK_SIZE - 1 bytes\n    int nLen = vchPlaintext.size();\n    int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0;\n    vchCiphertext = std::vector<unsigned char> (nCLen);\n\n    EVP_CIPHER_CTX ctx;\n\n    bool fOk = true;\n\n    EVP_CIPHER_CTX_init(&ctx);\n    if (fOk) fOk = EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);\n    if (fOk) fOk = EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen);\n    if (fOk) fOk = EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0])+nCLen, &nFLen);\n    EVP_CIPHER_CTX_cleanup(&ctx);\n\n    if (!fOk) return false;\n\n    vchCiphertext.resize(nCLen + nFLen);\n    return true;\n}\n\nbool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext)\n{\n    if (!fKeySet)\n        return false;\n\n    // plaintext will always be equal to or lesser than length of ciphertext\n    int nLen = vchCiphertext.size();\n    int nPLen = nLen, nFLen = 0;\n\n    vchPlaintext = CKeyingMaterial(nPLen);\n\n    EVP_CIPHER_CTX ctx;\n\n    bool fOk = true;\n\n    EVP_CIPHER_CTX_init(&ctx);\n    if (fOk) fOk = EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);\n    if (fOk) fOk = EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen);\n    if (fOk) fOk = EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0])+nPLen, &nFLen);\n    EVP_CIPHER_CTX_cleanup(&ctx);\n\n    if (!fOk) return false;\n\n    vchPlaintext.resize(nPLen + nFLen);\n    return true;\n}\n\n\nbool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext)\n{\n    CCrypter cKeyCrypter;\n    std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);\n    memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);\n    if(!cKeyCrypter.SetKey(vMasterKey, chIV))\n        return false;\n    return cKeyCrypter.Encrypt(*((const CKeyingMaterial*)&vchPlaintext), vchCiphertext);\n}\n\nbool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext)\n{\n    CCrypter cKeyCrypter;\n    std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);\n    memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);\n    if(!cKeyCrypter.SetKey(vMasterKey, chIV))\n        return false;\n    return cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext));\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/cvsignore.re",
    "content": "\n#define YYFILL(n) if (cursor >= limit) break;\n#define YYCTYPE char\n#define YYCURSOR cursor\n#define YYLIMIT limit\n#define YYMARKER marker\n\n/*!re2c\nany     = (.|\"\\n\");\nvalue\t= (\":\" (.\\\"$\")+)?;\ncvsdat\t= \"Date\";\ncvsid\t= \"Id\";\ncvslog\t= \"Log\";\ncvsrev\t= \"Revision\";\ncvssrc\t= \"Source\";\n*/\n\n#define APPEND(text) \\\n\tappend(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))\n\ninline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)\n{\n\tmemcpy(output + outsize, text, len);\n\toutsize += (len / sizeof(YYCTYPE));\n}\n\nvoid scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)\n{\n\t// rule\n\t// scan lines\n\t// find $ in lines\n\t//   compact $<keyword>: .. $ to $<keyword>$\n  \n\tYYCTYPE *output;\n\tconst YYCTYPE *cursor, *limit, *marker;\n\n\tcursor = marker = output = *pText;\n\n\tsize_t insize = *pSize;\n\tsize_t outsize = 0;\n\n\tlimit = cursor + insize;\n\n\twhile(1) {\nloop:\n/*!re2c\n\n\"$\" cvsdat value \"$\"\t{ APPEND(L\"$\" L\"Date$\"); goto loop; }\n\"$\" cvsid  value \"$\"\t{ APPEND(L\"$\" L\"Id$\"); goto loop; }\n\"$\" cvslog value \"$\"\t{ APPEND(L\"$\" L\"Log$\"); goto loop; }\n\"$\" cvsrev value \"$\"\t{ APPEND(L\"$\" L\"Revision$\"); goto loop; }\n\"$\" cvssrc value \"$\"\t{ APPEND(L\"$\" L\"Source$\"); goto loop; }\nany\t\t\t\t\t\t{ output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }\n\n*/\n\t}\n\toutput[outsize] = '\\0';\n\n\t// set the new size\n\t*pSize = outsize;\n\t\n\t*pbChanged = (insize == outsize) ? 0 : 1;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/env.cpp",
    "content": "/*\n  This file is part of the PhantomJS project from Ofi Labs.\n\n  Copyright (C) 2012 execjosh, http://execjosh.blogspot.com\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include \"env.h\"\n\n#include <QCoreApplication>\n#include <QString>\n#include <QVariantMap>\n\nstatic Env *env_instance = (Env *)NULL;\n\nEnv *Env::instance()\n{\n    if ((Env *)NULL == env_instance)\n        env_instance = new Env();\n\n    return env_instance;\n}\n\nEnv::Env()\n    : QObject(QCoreApplication::instance())\n{\n}\n\n// public:\n\nvoid Env::parse(const char **envp)\n{\n    const char **env = (const char **)NULL;\n    QString envvar, name, value;\n    int indexOfEquals;\n    // Loop for each of the <NAME>=<VALUE> pairs and split them into a map\n    for (env = envp; *env != (const char *)NULL; env++) {\n        envvar = QString(*env);\n        indexOfEquals = envvar.indexOf('=');\n        if (0 >= indexOfEquals) {\n            // Should never happen because names cannot contain \"=\" and cannot\n            // be empty. If it does happen, then just ignore this record.\n            // See: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html\n            continue;\n        }\n        // Extract name and value (if it exists) from envvar\n        // NOTE:\n        //  QString::mid() will gracefully return an empty QString when the\n        //  specified position index is >= the length() of the string\n        name = envvar.left(indexOfEquals);\n        value = envvar.mid(indexOfEquals + 1);\n        m_map.insert(name, value);\n    }\n}\n\nQVariantMap Env::asVariantMap() const\n{\n    return m_map;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/env.h",
    "content": "/*\n  This file is part of the PhantomJS project from Ofi Labs.\n\n  Copyright (C) 2012 execjosh, http://execjosh.blogspot.com\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef ENV_H\n#define ENV_H\n\n#include <QObject>\n#include <QVariantMap>\n\nclass Env : public QObject\n{\n    Q_OBJECT\n\npublic:\n    static Env *instance();\n\n    void parse(const char ** envp);\n    QVariantMap asVariantMap() const;\n\nprivate:\n    Env();\n\n    QVariantMap m_map;\n};\n\n#endif // ENV_H\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/epoll_reactor.ipp",
    "content": "//\n// detail/impl/epoll_reactor.ipp\n// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n//\n// Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)\n//\n// Distributed under the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n\n#ifndef BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP\n#define BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1200)\n# pragma once\n#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)\n\n#include <boost/asio/detail/config.hpp>\n\n#if defined(BOOST_ASIO_HAS_EPOLL)\n\n#include <cstddef>\n#include <sys/epoll.h>\n#include <boost/asio/detail/epoll_reactor.hpp>\n#include <boost/asio/detail/throw_error.hpp>\n#include <boost/asio/error.hpp>\n\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n# include <sys/timerfd.h>\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n\n#include <boost/asio/detail/push_options.hpp>\n\nnamespace boost {\nnamespace asio {\nnamespace detail {\n\nepoll_reactor::epoll_reactor(boost::asio::io_service& io_service)\n  : boost::asio::detail::service_base<epoll_reactor>(io_service),\n    io_service_(use_service<io_service_impl>(io_service)),\n    mutex_(),\n    interrupter_(),\n    epoll_fd_(do_epoll_create()),\n    timer_fd_(do_timerfd_create()),\n    shutdown_(false)\n{\n  // Add the interrupter's descriptor to epoll.\n  epoll_event ev = { 0, { 0 } };\n  ev.events = EPOLLIN | EPOLLERR | EPOLLET;\n  ev.data.ptr = &interrupter_;\n  epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev);\n  interrupter_.interrupt();\n\n  // Add the timer descriptor to epoll.\n  if (timer_fd_ != -1)\n  {\n    ev.events = EPOLLIN | EPOLLERR;\n    ev.data.ptr = &timer_fd_;\n    epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev);\n  }\n}\n\nepoll_reactor::~epoll_reactor()\n{\n  if (epoll_fd_ != -1)\n    close(epoll_fd_);\n  if (timer_fd_ != -1)\n    close(timer_fd_);\n}\n\nvoid epoll_reactor::shutdown_service()\n{\n  mutex::scoped_lock lock(mutex_);\n  shutdown_ = true;\n  lock.unlock();\n\n  op_queue<operation> ops;\n\n  while (descriptor_state* state = registered_descriptors_.first())\n  {\n    for (int i = 0; i < max_ops; ++i)\n      ops.push(state->op_queue_[i]);\n    state->shutdown_ = true;\n    registered_descriptors_.free(state);\n  }\n\n  timer_queues_.get_all_timers(ops);\n\n  io_service_.abandon_operations(ops);\n}\n\nvoid epoll_reactor::fork_service(boost::asio::io_service::fork_event fork_ev)\n{\n  if (fork_ev == boost::asio::io_service::fork_child)\n  {\n    if (epoll_fd_ != -1)\n      ::close(epoll_fd_);\n    epoll_fd_ = -1;\n    epoll_fd_ = do_epoll_create();\n\n    if (timer_fd_ != -1)\n      ::close(timer_fd_);\n    timer_fd_ = -1;\n    timer_fd_ = do_timerfd_create();\n\n    interrupter_.recreate();\n\n    // Add the interrupter's descriptor to epoll.\n    epoll_event ev = { 0, { 0 } };\n    ev.events = EPOLLIN | EPOLLERR | EPOLLET;\n    ev.data.ptr = &interrupter_;\n    epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev);\n    interrupter_.interrupt();\n\n    // Add the timer descriptor to epoll.\n    if (timer_fd_ != -1)\n    {\n      ev.events = EPOLLIN | EPOLLERR;\n      ev.data.ptr = &timer_fd_;\n      epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev);\n    }\n\n    update_timeout();\n\n    // Re-register all descriptors with epoll.\n    mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);\n    for (descriptor_state* state = registered_descriptors_.first();\n        state != 0; state = state->next_)\n    {\n      ev.events = state->registered_events_;\n      ev.data.ptr = state;\n      int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, state->descriptor_, &ev);\n      if (result != 0)\n      {\n        boost::system::error_code ec(errno,\n            boost::asio::error::get_system_category());\n        boost::asio::detail::throw_error(ec, \"epoll re-registration\");\n      }\n    }\n  }\n}\n\nvoid epoll_reactor::init_task()\n{\n  io_service_.init_task();\n}\n\nint epoll_reactor::register_descriptor(socket_type descriptor,\n    epoll_reactor::per_descriptor_data& descriptor_data)\n{\n  descriptor_data = allocate_descriptor_state();\n\n  {\n    mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n    descriptor_data->reactor_ = this;\n    descriptor_data->descriptor_ = descriptor;\n    descriptor_data->shutdown_ = false;\n  }\n\n  epoll_event ev = { 0, { 0 } };\n  ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET;\n  descriptor_data->registered_events_ = ev.events;\n  ev.data.ptr = descriptor_data;\n  int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);\n  if (result != 0)\n    return errno;\n\n  return 0;\n}\n\nint epoll_reactor::register_internal_descriptor(\n    int op_type, socket_type descriptor,\n    epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op)\n{\n  descriptor_data = allocate_descriptor_state();\n\n  {\n    mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n    descriptor_data->reactor_ = this;\n    descriptor_data->descriptor_ = descriptor;\n    descriptor_data->shutdown_ = false;\n    descriptor_data->op_queue_[op_type].push(op);\n  }\n\n  epoll_event ev = { 0, { 0 } };\n  ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET;\n  descriptor_data->registered_events_ = ev.events;\n  ev.data.ptr = descriptor_data;\n  int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);\n  if (result != 0)\n    return errno;\n\n  return 0;\n}\n\nvoid epoll_reactor::move_descriptor(socket_type,\n    epoll_reactor::per_descriptor_data& target_descriptor_data,\n    epoll_reactor::per_descriptor_data& source_descriptor_data)\n{\n  target_descriptor_data = source_descriptor_data;\n  source_descriptor_data = 0;\n}\n\nvoid epoll_reactor::start_op(int op_type, socket_type descriptor,\n    epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op,\n    bool is_continuation, bool allow_speculative)\n{\n  if (!descriptor_data)\n  {\n    op->ec_ = boost::asio::error::bad_descriptor;\n    post_immediate_completion(op, is_continuation);\n    return;\n  }\n\n  mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n  if (descriptor_data->shutdown_)\n  {\n    post_immediate_completion(op, is_continuation);\n    return;\n  }\n\n  if (descriptor_data->op_queue_[op_type].empty())\n  {\n    if (allow_speculative\n        && (op_type != read_op\n          || descriptor_data->op_queue_[except_op].empty()))\n    {\n      if (op->perform())\n      {\n        descriptor_lock.unlock();\n        io_service_.post_immediate_completion(op, is_continuation);\n        return;\n      }\n\n      if (op_type == write_op)\n      {\n        if ((descriptor_data->registered_events_ & EPOLLOUT) == 0)\n        {\n          epoll_event ev = { 0, { 0 } };\n          ev.events = descriptor_data->registered_events_ | EPOLLOUT;\n          ev.data.ptr = descriptor_data;\n          if (epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev) == 0)\n          {\n            descriptor_data->registered_events_ |= ev.events;\n          }\n          else\n          {\n            op->ec_ = boost::system::error_code(errno,\n                boost::asio::error::get_system_category());\n            io_service_.post_immediate_completion(op, is_continuation);\n            return;\n          }\n        }\n      }\n    }\n    else\n    {\n      if (op_type == write_op)\n      {\n        descriptor_data->registered_events_ |= EPOLLOUT;\n      }\n\n      epoll_event ev = { 0, { 0 } };\n      ev.events = descriptor_data->registered_events_;\n      ev.data.ptr = descriptor_data;\n      epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev);\n    }\n  }\n\n  descriptor_data->op_queue_[op_type].push(op);\n  io_service_.work_started();\n}\n\nvoid epoll_reactor::cancel_ops(socket_type,\n    epoll_reactor::per_descriptor_data& descriptor_data)\n{\n  if (!descriptor_data)\n    return;\n\n  mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n  op_queue<operation> ops;\n  for (int i = 0; i < max_ops; ++i)\n  {\n    while (reactor_op* op = descriptor_data->op_queue_[i].front())\n    {\n      op->ec_ = boost::asio::error::operation_aborted;\n      descriptor_data->op_queue_[i].pop();\n      ops.push(op);\n    }\n  }\n\n  descriptor_lock.unlock();\n\n  io_service_.post_deferred_completions(ops);\n}\n\nvoid epoll_reactor::deregister_descriptor(socket_type descriptor,\n    epoll_reactor::per_descriptor_data& descriptor_data, bool closing)\n{\n  if (!descriptor_data)\n    return;\n\n  mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n  if (!descriptor_data->shutdown_)\n  {\n    if (closing)\n    {\n      // The descriptor will be automatically removed from the epoll set when\n      // it is closed.\n    }\n    else\n    {\n      epoll_event ev = { 0, { 0 } };\n      epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev);\n    }\n\n    op_queue<operation> ops;\n    for (int i = 0; i < max_ops; ++i)\n    {\n      while (reactor_op* op = descriptor_data->op_queue_[i].front())\n      {\n        op->ec_ = boost::asio::error::operation_aborted;\n        descriptor_data->op_queue_[i].pop();\n        ops.push(op);\n      }\n    }\n\n    descriptor_data->descriptor_ = -1;\n    descriptor_data->shutdown_ = true;\n\n    descriptor_lock.unlock();\n\n    free_descriptor_state(descriptor_data);\n    descriptor_data = 0;\n\n    io_service_.post_deferred_completions(ops);\n  }\n}\n\nvoid epoll_reactor::deregister_internal_descriptor(socket_type descriptor,\n    epoll_reactor::per_descriptor_data& descriptor_data)\n{\n  if (!descriptor_data)\n    return;\n\n  mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n  if (!descriptor_data->shutdown_)\n  {\n    epoll_event ev = { 0, { 0 } };\n    epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev);\n\n    op_queue<operation> ops;\n    for (int i = 0; i < max_ops; ++i)\n      ops.push(descriptor_data->op_queue_[i]);\n\n    descriptor_data->descriptor_ = -1;\n    descriptor_data->shutdown_ = true;\n\n    descriptor_lock.unlock();\n\n    free_descriptor_state(descriptor_data);\n    descriptor_data = 0;\n  }\n}\n\nvoid epoll_reactor::run(bool block, op_queue<operation>& ops)\n{\n  // This code relies on the fact that the task_io_service queues the reactor\n  // task behind all descriptor operations generated by this function. This\n  // means, that by the time we reach this point, any previously returned\n  // descriptor operations have already been dequeued. Therefore it is now safe\n  // for us to reuse and return them for the task_io_service to queue again.\n\n  // Calculate a timeout only if timerfd is not used.\n  int timeout;\n  if (timer_fd_ != -1)\n    timeout = block ? -1 : 0;\n  else\n  {\n    mutex::scoped_lock lock(mutex_);\n    timeout = block ? get_timeout() : 0;\n  }\n\n  // Block on the epoll descriptor.\n  epoll_event events[128];\n  int num_events = epoll_wait(epoll_fd_, events, 128, timeout);\n\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n  bool check_timers = (timer_fd_ == -1);\n#else // defined(BOOST_ASIO_HAS_TIMERFD)\n  bool check_timers = true;\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n\n  // Dispatch the waiting events.\n  for (int i = 0; i < num_events; ++i)\n  {\n    void* ptr = events[i].data.ptr;\n    if (ptr == &interrupter_)\n    {\n      // No need to reset the interrupter since we're leaving the descriptor\n      // in a ready-to-read state and relying on edge-triggered notifications\n      // to make it so that we only get woken up when the descriptor's epoll\n      // registration is updated.\n\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n      if (timer_fd_ == -1)\n        check_timers = true;\n#else // defined(BOOST_ASIO_HAS_TIMERFD)\n      check_timers = true;\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n    }\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n    else if (ptr == &timer_fd_)\n    {\n      check_timers = true;\n    }\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n    else\n    {\n      // The descriptor operation doesn't count as work in and of itself, so we\n      // don't call work_started() here. This still allows the io_service to\n      // stop if the only remaining operations are descriptor operations.\n      descriptor_state* descriptor_data = static_cast<descriptor_state*>(ptr);\n      descriptor_data->set_ready_events(events[i].events);\n      ops.push(descriptor_data);\n    }\n  }\n\n  if (check_timers)\n  {\n    mutex::scoped_lock common_lock(mutex_);\n    timer_queues_.get_ready_timers(ops);\n\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n    if (timer_fd_ != -1)\n    {\n      itimerspec new_timeout;\n      itimerspec old_timeout;\n      int flags = get_timeout(new_timeout);\n      timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout);\n    }\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n  }\n}\n\nvoid epoll_reactor::interrupt()\n{\n  epoll_event ev = { 0, { 0 } };\n  ev.events = EPOLLIN | EPOLLERR | EPOLLET;\n  ev.data.ptr = &interrupter_;\n  epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, interrupter_.read_descriptor(), &ev);\n}\n\nint epoll_reactor::do_epoll_create()\n{\n#if defined(EPOLL_CLOEXEC)\n  int fd = epoll_create1(EPOLL_CLOEXEC);\n#else // defined(EPOLL_CLOEXEC)\n  int fd = -1;\n  errno = EINVAL;\n#endif // defined(EPOLL_CLOEXEC)\n\n  if (fd == -1 && (errno == EINVAL || errno == ENOSYS))\n  {\n    fd = epoll_create(epoll_size);\n    if (fd != -1)\n      ::fcntl(fd, F_SETFD, FD_CLOEXEC);\n  }\n\n  if (fd == -1)\n  {\n    boost::system::error_code ec(errno,\n        boost::asio::error::get_system_category());\n    boost::asio::detail::throw_error(ec, \"epoll\");\n  }\n\n  return fd;\n}\n\nint epoll_reactor::do_timerfd_create()\n{\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n# if defined(TFD_CLOEXEC)\n  int fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);\n# else // defined(TFD_CLOEXEC)\n  int fd = -1;\n  errno = EINVAL;\n# endif // defined(TFD_CLOEXEC)\n\n  if (fd == -1 && errno == EINVAL)\n  {\n    fd = timerfd_create(CLOCK_MONOTONIC, 0);\n    if (fd != -1)\n      ::fcntl(fd, F_SETFD, FD_CLOEXEC);\n  }\n\n  return fd;\n#else // defined(BOOST_ASIO_HAS_TIMERFD)\n  return -1;\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n}\n\nepoll_reactor::descriptor_state* epoll_reactor::allocate_descriptor_state()\n{\n  mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);\n  return registered_descriptors_.alloc();\n}\n\nvoid epoll_reactor::free_descriptor_state(epoll_reactor::descriptor_state* s)\n{\n  mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);\n  registered_descriptors_.free(s);\n}\n\nvoid epoll_reactor::do_add_timer_queue(timer_queue_base& queue)\n{\n  mutex::scoped_lock lock(mutex_);\n  timer_queues_.insert(&queue);\n}\n\nvoid epoll_reactor::do_remove_timer_queue(timer_queue_base& queue)\n{\n  mutex::scoped_lock lock(mutex_);\n  timer_queues_.erase(&queue);\n}\n\nvoid epoll_reactor::update_timeout()\n{\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n  if (timer_fd_ != -1)\n  {\n    itimerspec new_timeout;\n    itimerspec old_timeout;\n    int flags = get_timeout(new_timeout);\n    timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout);\n    return;\n  }\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n  interrupt();\n}\n\nint epoll_reactor::get_timeout()\n{\n  // By default we will wait no longer than 5 minutes. This will ensure that\n  // any changes to the system clock are detected after no longer than this.\n  return timer_queues_.wait_duration_msec(5 * 60 * 1000);\n}\n\n#if defined(BOOST_ASIO_HAS_TIMERFD)\nint epoll_reactor::get_timeout(itimerspec& ts)\n{\n  ts.it_interval.tv_sec = 0;\n  ts.it_interval.tv_nsec = 0;\n\n  long usec = timer_queues_.wait_duration_usec(5 * 60 * 1000 * 1000);\n  ts.it_value.tv_sec = usec / 1000000;\n  ts.it_value.tv_nsec = usec ? (usec % 1000000) * 1000 : 1;\n\n  return usec ? 0 : TFD_TIMER_ABSTIME;\n}\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n\nstruct epoll_reactor::perform_io_cleanup_on_block_exit\n{\n  explicit perform_io_cleanup_on_block_exit(epoll_reactor* r)\n    : reactor_(r), first_op_(0)\n  {\n  }\n\n  ~perform_io_cleanup_on_block_exit()\n  {\n    if (first_op_)\n    {\n      // Post the remaining completed operations for invocation.\n      if (!ops_.empty())\n        reactor_->io_service_.post_deferred_completions(ops_);\n\n      // A user-initiated operation has completed, but there's no need to\n      // explicitly call work_finished() here. Instead, we'll take advantage of\n      // the fact that the task_io_service will call work_finished() once we\n      // return.\n    }\n    else\n    {\n      // No user-initiated operations have completed, so we need to compensate\n      // for the work_finished() call that the task_io_service will make once\n      // this operation returns.\n      reactor_->io_service_.work_started();\n    }\n  }\n\n  epoll_reactor* reactor_;\n  op_queue<operation> ops_;\n  operation* first_op_;\n};\n\nepoll_reactor::descriptor_state::descriptor_state()\n  : operation(&epoll_reactor::descriptor_state::do_complete)\n{\n}\n\noperation* epoll_reactor::descriptor_state::perform_io(uint32_t events)\n{\n  mutex_.lock();\n  perform_io_cleanup_on_block_exit io_cleanup(reactor_);\n  mutex::scoped_lock descriptor_lock(mutex_, mutex::scoped_lock::adopt_lock);\n\n  // Exception operations must be processed first to ensure that any\n  // out-of-band data is read before normal data.\n  static const int flag[max_ops] = { EPOLLIN, EPOLLOUT, EPOLLPRI };\n  for (int j = max_ops - 1; j >= 0; --j)\n  {\n    if (events & (flag[j] | EPOLLERR | EPOLLHUP))\n    {\n      while (reactor_op* op = op_queue_[j].front())\n      {\n        if (op->perform())\n        {\n          op_queue_[j].pop();\n          io_cleanup.ops_.push(op);\n        }\n        else\n          break;\n      }\n    }\n  }\n\n  // The first operation will be returned for completion now. The others will\n  // be posted for later by the io_cleanup object's destructor.\n  io_cleanup.first_op_ = io_cleanup.ops_.front();\n  io_cleanup.ops_.pop();\n  return io_cleanup.first_op_;\n}\n\nvoid epoll_reactor::descriptor_state::do_complete(\n    io_service_impl* owner, operation* base,\n    const boost::system::error_code& ec, std::size_t bytes_transferred)\n{\n  if (owner)\n  {\n    descriptor_state* descriptor_data = static_cast<descriptor_state*>(base);\n    uint32_t events = static_cast<uint32_t>(bytes_transferred);\n    if (operation* op = descriptor_data->perform_io(events))\n    {\n      op->complete(*owner, ec, 0);\n    }\n  }\n}\n\n} // namespace detail\n} // namespace asio\n} // namespace boost\n\n#include <boost/asio/detail/pop_options.hpp>\n\n#endif // defined(BOOST_ASIO_HAS_EPOLL)\n\n#endif // BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/gdsdbreader.h",
    "content": "#ifndef GDSDBREADER_H\r\n#define GDSDBREADER_H\r\n\r\n// This file contains core structures, classes and types for the entire gds app\r\n// WARNING: DO NOT MODIFY UNTIL IT'S STRICTLY NECESSARY\r\n\r\n#include <QDir>\r\n#include \"diagramwidget/qgldiagramwidget.h\"\r\n\r\n#define GDS_DIR \"gdsdata\"\r\n\r\nenum level {LEVEL_ONE, LEVEL_TWO, LEVEL_THREE};\r\n\r\n// The internal structure of the db to store information about each node (each level)\r\n// this will be serialized before being written to file\r\nclass dbDataStructure\r\n{\r\npublic:\r\n    QString label;\r\n    quint32 depth;\r\n    quint32 userIndex;\r\n    QByteArray data;    // This is COMPRESSED data, optimize ram and disk space, is decompressed\r\n                        // just when needed (to display the comments)\r\n\r\n    // The following ID is used to create second-third level files\r\n    quint64 uniqueID;\r\n    // All the next items linked to this one\r\n    QVector<dbDataStructure*> nextItems;\r\n    // Corresponding indices vector (used to store data)\r\n    QVector<quint32> nextItemsIndices;\r\n    // The father element (or NULL if it's root)\r\n    dbDataStructure* father;\r\n    // Corresponding indices vector (used to store data)\r\n    quint32 fatherIndex;\r\n    bool noFatherRoot; // Used to tell if this node is the root (so hasn't a father)\r\n\r\n    // These fields will be useful for levels 2 and 3\r\n    QString fileName; // Relative filename for the associated code file\r\n    QByteArray firstLineData; // Compressed first line data, this will be used with the line number to retrieve info\r\n    QVector<quint32> linesNumbers; // First and next lines (next are relative to the first) numbers\r\n\r\n    // -- Generic system data not to be stored on disk\r\n    void *glPointer; // GL pointer\r\n\r\n    // These operator overrides prevent the glPointer and other non-disk-necessary data serialization\r\n    friend QDataStream& operator<<(QDataStream& stream, const dbDataStructure& myclass)\r\n    // Notice: this function has to be \"friend\" because it cannot be a member function, member functions\r\n    // have an additional parameter \"this\" which isn't in the argument list of an operator overload. A friend\r\n    // function has full access to private data of the class without having the \"this\" argument\r\n    {\r\n        // Don't write glPointer and every pointer-dependent structure\r\n        return stream << myclass.label << myclass.depth << myclass.userIndex << qCompress(myclass.data)\r\n                         << myclass.uniqueID << myclass.nextItemsIndices << myclass.fatherIndex << myclass.noFatherRoot\r\n                            << myclass.fileName << qCompress(myclass.firstLineData) << myclass.linesNumbers;\r\n    }\r\n    friend QDataStream& operator>>(QDataStream& stream, dbDataStructure& myclass)\r\n    {\r\n        //Don't read it, either\r\n        stream >> myclass.label >> myclass.depth >> myclass.userIndex >> myclass.data\r\n                      >> myclass.uniqueID >> myclass.nextItemsIndices >> myclass.fatherIndex >> myclass.noFatherRoot\r\n                         >> myclass.fileName >> myclass.firstLineData >> myclass.linesNumbers;\r\n        myclass.data = qUncompress(myclass.data);\r\n        myclass.firstLineData = qUncompress(myclass.firstLineData);\r\n        return stream;\r\n    }\r\n\r\n};\r\n\r\n#endif // GDSDBREADER_H\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/graphics.cpp",
    "content": "// License - https://github.com/TurtleP/Flask/blob/master/LICENSE\n\n#include <shared.h>\n\nint currentR = 0xFF;\nint currentG = 0xFF;\nint currentB = 0xFF;\nint currentA = 0xFF;\n\nint currentScreen = GFX_BOTTOM;\n\nfloat transX = 0;\nfloat transY = 0;\nbool isPushed = false;\n\nu32 getCurrentColor() \n{\n\treturn RGBA8(currentR, currentG, currentB, currentA);\n}\n\nvoid setColor(int r, int g, int b)\n{\n\tcurrentR = r;\n\tcurrentG = g;\n\tcurrentB = b;\n\tcurrentA = currentA;\n}\n\nvoid setColor(int r, int g, int b, int a)\n{\n\tcurrentR = r;\n\tcurrentG = g;\n\tcurrentB = b;\n\tcurrentA = a;\n}\n\nvoid setScreen(int screen)\n{\n\tcurrentScreen = screen;\n}\n\nint getCurrentScreen()\n{\n\treturn currentScreen;\n}\n\nvoid screenShot() //for showing stuff being done\n{\n\tFILE * topScreen = fopen(\"sdmc:/framebuffer_top.rgb\", \"w+\");\n\n\tfwrite(gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL), 288000, 1, topScreen);\n\n\tfclose(topScreen);\n\n\tFILE * bottomScreen = fopen(\"sdmc:/framebuffer_bottom.rgb\", \"w+\");;\n\n\tfwrite(gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL), 230400, 1, bottomScreen);\n\n\tfclose(bottomScreen);\n}\n\nvoid translateCoords(float * x, float * y) {\n\tif (isPushed) \n\t{\n\t\t*x += transX;\n\t\t*y += transY;\n\t}\n}\n\nvoid translate(float dx, float dy)\n{\n\tif (sf2d_get_current_screen() == getCurrentScreen()) \n\t{\n\t\ttransX = transX + dx;\n\t\ttransY = transY + dy;\n\t}\n}\n\nvoid push()\n{\n\tif (sf2d_get_current_screen() == getCurrentScreen()) \n\t{\n\t\tisPushed = true;\n\t}\n}\n\nvoid pop()\n{\n\tif (sf2d_get_current_screen() == getCurrentScreen()) \n\t{\n\t\ttransX = 0;\n\t\ttransY = 0;\n\t\tisPushed = false;\n\t}\n}\n\nvoid setScissor(u32 x, u32 y, u32 width, u32 height)\n{\n\tif (sf2d_get_current_screen() == getCurrentScreen()) \n\t{\n\t\tGPU_SCISSORMODE mode = GPU_SCISSOR_NORMAL;\n\n\t\tif (!x && !y && !width && !height) {\n\t\t\tmode = GPU_SCISSOR_DISABLE;\n\t\t}\n\n\t\tsf2d_set_scissor_test(mode, x, y, width, height);\n\t}\n}"
  },
  {
    "path": "src/test/resources/samples/langs/C++/grpc.pb.cc",
    "content": "// Generated by the gRPC protobuf plugin.\n// If you make any local change, they will be lost.\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/hello.cpp",
    "content": "#include <iostream>\n\nusing namespace std;\n\nint main()\n{\n    cout << \"Hello World\" << endl;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/hello.grpc.pb.h",
    "content": "// Generated by the gRPC C++ plugin.\n// If you make any local change, they will be lost.\n// source: hello.proto\n#ifndef GRPC_hello_2eproto__INCLUDED\n#define GRPC_hello_2eproto__INCLUDED\n\n#include \"hello.pb.h\"\n\n#include <grpc++/impl/codegen/async_stream.h>\n#include <grpc++/impl/codegen/async_unary_call.h>\n#include <grpc++/impl/codegen/method_handler_impl.h>\n#include <grpc++/impl/codegen/proto_utils.h>\n#include <grpc++/impl/codegen/rpc_method.h>\n#include <grpc++/impl/codegen/service_type.h>\n#include <grpc++/impl/codegen/status.h>\n#include <grpc++/impl/codegen/stub_options.h>\n#include <grpc++/impl/codegen/sync_stream.h>\n\nnamespace grpc {\nclass CompletionQueue;\nclass Channel;\nclass RpcService;\nclass ServerCompletionQueue;\nclass ServerContext;\n}  // namespace grpc\n\nclass HelloService final {\n public:\n  class StubInterface {\n   public:\n    virtual ~StubInterface() {}\n    virtual ::grpc::Status SayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::HelloResponse* response) = 0;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>> AsyncSayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>>(AsyncSayHelloRaw(context, request, cq));\n    }\n  private:\n    virtual ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>* AsyncSayHelloRaw(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) = 0;\n  };\n  class Stub final : public StubInterface {\n   public:\n    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);\n    ::grpc::Status SayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::HelloResponse* response) override;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::HelloResponse>> AsyncSayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::HelloResponse>>(AsyncSayHelloRaw(context, request, cq));\n    }\n\n   private:\n    std::shared_ptr< ::grpc::ChannelInterface> channel_;\n    ::grpc::ClientAsyncResponseReader< ::HelloResponse>* AsyncSayHelloRaw(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) override;\n    const ::grpc::RpcMethod rpcmethod_SayHello_;\n  };\n  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());\n\n  class Service : public ::grpc::Service {\n   public:\n    Service();\n    virtual ~Service();\n    virtual ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response);\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_SayHello : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service *service) {}\n   public:\n    WithAsyncMethod_SayHello() {\n      ::grpc::Service::MarkMethodAsync(0);\n    }\n    ~WithAsyncMethod_SayHello() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestSayHello(::grpc::ServerContext* context, ::HelloRequest* request, ::grpc::ServerAsyncResponseWriter< ::HelloResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);\n    }\n  };\n  typedef WithAsyncMethod_SayHello<Service > AsyncService;\n  template <class BaseClass>\n  class WithGenericMethod_SayHello : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service *service) {}\n   public:\n    WithGenericMethod_SayHello() {\n      ::grpc::Service::MarkMethodGeneric(0);\n    }\n    ~WithGenericMethod_SayHello() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithStreamedUnaryMethod_SayHello : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service *service) {}\n   public:\n    WithStreamedUnaryMethod_SayHello() {\n      ::grpc::Service::MarkMethodStreamed(0,\n        new ::grpc::StreamedUnaryHandler< ::HelloRequest, ::HelloResponse>(std::bind(&WithStreamedUnaryMethod_SayHello<BaseClass>::StreamedSayHello, this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithStreamedUnaryMethod_SayHello() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with streamed unary\n    virtual ::grpc::Status StreamedSayHello(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::HelloRequest,::HelloResponse>* server_unary_streamer) = 0;\n  };\n  typedef WithStreamedUnaryMethod_SayHello<Service > StreamedUnaryService;\n  typedef Service SplitStreamedService;\n  typedef WithStreamedUnaryMethod_SayHello<Service > StreamedService;\n};\n\n\n#endif  // GRPC_hello_2eproto__INCLUDED\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/hello.ino",
    "content": "void setup() {\n  Serial.begin(9600);\n}\n\nvoid loop() {\n  Serial.print(\"Hello\");\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/initClasses.inc",
    "content": "// start\n// define cpp macros: SET_SYMBOL, CREATE_CLASS, SET_CLASS, DEFINE_BASE_CLASSES, DEFINE_CLASS_NAMES, EXPOSE_TO_CANDO \n// define cpp macro: ALL_STAGES to get the effect of defining all of the macros above\n// define cpp macro: EXPOSE_PYTHON to expose python\n// Associating namespace(llvmo) with package(LlvmoPkg)\n // class DebugLoc_O : public core::T_O\n // class InsertPoint_O : public core::T_O\n // class LLVMContext_O : public core::ExternalObject_O\n // class Pass_O : public core::ExternalObject_O\n // class FunctionPass_O : public Pass_O\n // class ModulePass_O : public Pass_O\n // class ImmutablePass_O : public ModulePass_O\n // class PassManagerBase_O : public core::ExternalObject_O\n // class Value_O : public core::ExternalObject_O\n // class User_O : public Value_O\n // class LLVMContext_O : public core::ExternalObject_O\n // class Pass_O : public core::ExternalObject_O\n // class FunctionPass_O : public Pass_O\n // class ModulePass_O : public Pass_O\n // class ImmutablePass_O : public ModulePass_O\n // class PassManagerBase_O : public core::ExternalObject_O\n // class Value_O : public core::ExternalObject_O\n // class User_O : public Value_O\n // class Attribute_O : public core::T_O\n // class DataLayout_O : public ImmutablePass_O\n // class Constant_O : public User_O\n // class ConstantArray_O : public Constant_O\n // class ConstantDataSequential_O : public Constant_O\n // class ConstantDataArray_O : public ConstantDataSequential_O\n // class ConstantExpr_O : public Constant_O\n // class GlobalValue_O : public Constant_O\n // class GlobalVariable_O : public GlobalValue_O\n // class ExecutionEngine_O : public core::ExternalObject_O\n // class Module_O : public core::ExternalObject_O\n // class FunctionPassManager_O : public PassManagerBase_O\n // class EngineBuilder_O : public core::ExternalObject_O\n // class APFloat_O : public core::ExternalObject_O\n // class APInt_O : public core::ExternalObject_O\n // class IRBuilderBase_O : public core::ExternalObject_O\n // class IRBuilder_O : public IRBuilderBase_O\n // class Instruction_O : public User_O\n // class StoreInst_O : public Instruction_O\n // class FenceInst_O : public Instruction_O\n // class AtomicCmpXchgInst_O : public Instruction_O\n // class AtomicRMWInst_O : public Instruction_O\n // class PHINode_O : public Instruction_O\n // class CallInst_O : public Instruction_O\n // class LandingPadInst_O : public Instruction_O\n // class UnaryInstruction_O : public Instruction_O\n // class AllocaInst_O : public UnaryInstruction_O\n // class VAArgInst_O : public UnaryInstruction_O\n // class LoadInst_O : public UnaryInstruction_O\n // class TerminatorInst_O : public Instruction_O\n // class BranchInst_O : public TerminatorInst_O\n // class SwitchInst_O : public TerminatorInst_O\n // class IndirectBrInst_O : public TerminatorInst_O\n // class InvokeInst_O : public TerminatorInst_O\n // class ResumeInst_O : public TerminatorInst_O\n // class UnreachableInst_O : public TerminatorInst_O\n // class ReturnInst_O : public TerminatorInst_O\n // class ConstantFP_O : public Constant_O\n // class ConstantInt_O : public Constant_O\n // class UndefValue_O : public Constant_O\n // class ConstantPointerNull_O : public Constant_O\n // class MDNode_O : public Value_O\n // class MDString_O : public Value_O\n // class Function_O : public GlobalValue_O\n // class BasicBlock_O : public Value_O\n // class Argument_O : public Value_O\n // class Type_O : public core::ExternalObject_O\n // class FunctionType_O : public Type_O\n // class IntegerType_O : public Type_O\n // class CompositeType_O : public Type_O\n // class StructType_O : public CompositeType_O\n // class SequentialType_O : public CompositeType_O\n // class PointerType_O : public SequentialType_O\n // class ArrayType_O : public SequentialType_O\n // class VectorType_O : public SequentialType_O\n // class LLVMContext_O : public core::ExternalObject_O\n // class Module_O : public core::ExternalObject_O\n // class Builder_O : public core::ExternalObject_O\n // class APFloat_O : public core::ExternalObject_O\n // class Value_O : public core::ExternalObject_O\n // class User_O : public Value_O\n // class Constant_O : public User_O\n // class ConstantFP_O : public Constant_O\n// Associating namespace(llvmo) with package(LlvmoPkg)\n#ifdef HEADER_INCLUDES\n#include \"llvmoExpose.h\"\n#include \"llvmoExpose.scrape_inc.h\"\n#include \"debugLoc.h\"\n#include \"insertPoint.h\"\n#include \"llvmoExpose.generated.h\"\n#endif // HEADER_INCLUDES\n#undef HEADER_INCLUDES\n#if defined(SET_SYMBOL) || defined(ALL_STAGES)\n// requires LOOKUP_SYMBOL(pkg,symbolName) be defined\nllvmo::APFloat_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::APFloat_O::static_packageName(),llvmo::APFloat_O::static_className()));\nllvmo::APInt_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::APInt_O::static_packageName(),llvmo::APInt_O::static_className()));\nllvmo::Attribute_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Attribute_O::static_packageName(),llvmo::Attribute_O::static_className()));\nllvmo::Builder_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Builder_O::static_packageName(),llvmo::Builder_O::static_className()));\nllvmo::DebugLoc_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::DebugLoc_O::static_packageName(),llvmo::DebugLoc_O::static_className()));\nllvmo::EngineBuilder_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::EngineBuilder_O::static_packageName(),llvmo::EngineBuilder_O::static_className()));\nllvmo::ExecutionEngine_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ExecutionEngine_O::static_packageName(),llvmo::ExecutionEngine_O::static_className()));\nllvmo::IRBuilderBase_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IRBuilderBase_O::static_packageName(),llvmo::IRBuilderBase_O::static_className()));\nllvmo::InsertPoint_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::InsertPoint_O::static_packageName(),llvmo::InsertPoint_O::static_className()));\nllvmo::LLVMContext_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::LLVMContext_O::static_packageName(),llvmo::LLVMContext_O::static_className()));\nllvmo::Module_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Module_O::static_packageName(),llvmo::Module_O::static_className()));\nllvmo::PassManagerBase_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::PassManagerBase_O::static_packageName(),llvmo::PassManagerBase_O::static_className()));\nllvmo::Pass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Pass_O::static_packageName(),llvmo::Pass_O::static_className()));\nllvmo::Type_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Type_O::static_packageName(),llvmo::Type_O::static_className()));\nllvmo::Value_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Value_O::static_packageName(),llvmo::Value_O::static_className()));\nllvmo::Argument_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Argument_O::static_packageName(),llvmo::Argument_O::static_className()));\nllvmo::BasicBlock_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::BasicBlock_O::static_packageName(),llvmo::BasicBlock_O::static_className()));\nllvmo::CompositeType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::CompositeType_O::static_packageName(),llvmo::CompositeType_O::static_className()));\nllvmo::FunctionPassManager_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FunctionPassManager_O::static_packageName(),llvmo::FunctionPassManager_O::static_className()));\nllvmo::FunctionPass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FunctionPass_O::static_packageName(),llvmo::FunctionPass_O::static_className()));\nllvmo::FunctionType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FunctionType_O::static_packageName(),llvmo::FunctionType_O::static_className()));\nllvmo::IRBuilder_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IRBuilder_O::static_packageName(),llvmo::IRBuilder_O::static_className()));\nllvmo::IntegerType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IntegerType_O::static_packageName(),llvmo::IntegerType_O::static_className()));\nllvmo::MDNode_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::MDNode_O::static_packageName(),llvmo::MDNode_O::static_className()));\nllvmo::MDString_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::MDString_O::static_packageName(),llvmo::MDString_O::static_className()));\nllvmo::ModulePass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ModulePass_O::static_packageName(),llvmo::ModulePass_O::static_className()));\nllvmo::User_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::User_O::static_packageName(),llvmo::User_O::static_className()));\nllvmo::Constant_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Constant_O::static_packageName(),llvmo::Constant_O::static_className()));\nllvmo::ImmutablePass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ImmutablePass_O::static_packageName(),llvmo::ImmutablePass_O::static_className()));\nllvmo::Instruction_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Instruction_O::static_packageName(),llvmo::Instruction_O::static_className()));\nllvmo::SequentialType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::SequentialType_O::static_packageName(),llvmo::SequentialType_O::static_className()));\nllvmo::StructType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::StructType_O::static_packageName(),llvmo::StructType_O::static_className()));\nllvmo::ArrayType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ArrayType_O::static_packageName(),llvmo::ArrayType_O::static_className()));\nllvmo::AtomicCmpXchgInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::AtomicCmpXchgInst_O::static_packageName(),llvmo::AtomicCmpXchgInst_O::static_className()));\nllvmo::AtomicRMWInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::AtomicRMWInst_O::static_packageName(),llvmo::AtomicRMWInst_O::static_className()));\nllvmo::CallInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::CallInst_O::static_packageName(),llvmo::CallInst_O::static_className()));\nllvmo::ConstantArray_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantArray_O::static_packageName(),llvmo::ConstantArray_O::static_className()));\nllvmo::ConstantDataSequential_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantDataSequential_O::static_packageName(),llvmo::ConstantDataSequential_O::static_className()));\nllvmo::ConstantExpr_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantExpr_O::static_packageName(),llvmo::ConstantExpr_O::static_className()));\nllvmo::ConstantFP_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantFP_O::static_packageName(),llvmo::ConstantFP_O::static_className()));\nllvmo::ConstantInt_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantInt_O::static_packageName(),llvmo::ConstantInt_O::static_className()));\nllvmo::ConstantPointerNull_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantPointerNull_O::static_packageName(),llvmo::ConstantPointerNull_O::static_className()));\nllvmo::DataLayout_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::DataLayout_O::static_packageName(),llvmo::DataLayout_O::static_className()));\nllvmo::FenceInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FenceInst_O::static_packageName(),llvmo::FenceInst_O::static_className()));\nllvmo::GlobalValue_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::GlobalValue_O::static_packageName(),llvmo::GlobalValue_O::static_className()));\nllvmo::LandingPadInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::LandingPadInst_O::static_packageName(),llvmo::LandingPadInst_O::static_className()));\nllvmo::PHINode_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::PHINode_O::static_packageName(),llvmo::PHINode_O::static_className()));\nllvmo::PointerType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::PointerType_O::static_packageName(),llvmo::PointerType_O::static_className()));\nllvmo::StoreInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::StoreInst_O::static_packageName(),llvmo::StoreInst_O::static_className()));\nllvmo::TerminatorInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::TerminatorInst_O::static_packageName(),llvmo::TerminatorInst_O::static_className()));\nllvmo::UnaryInstruction_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::UnaryInstruction_O::static_packageName(),llvmo::UnaryInstruction_O::static_className()));\nllvmo::UndefValue_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::UndefValue_O::static_packageName(),llvmo::UndefValue_O::static_className()));\nllvmo::VectorType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::VectorType_O::static_packageName(),llvmo::VectorType_O::static_className()));\nllvmo::AllocaInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::AllocaInst_O::static_packageName(),llvmo::AllocaInst_O::static_className()));\nllvmo::BranchInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::BranchInst_O::static_packageName(),llvmo::BranchInst_O::static_className()));\nllvmo::ConstantDataArray_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantDataArray_O::static_packageName(),llvmo::ConstantDataArray_O::static_className()));\nllvmo::Function_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Function_O::static_packageName(),llvmo::Function_O::static_className()));\nllvmo::GlobalVariable_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::GlobalVariable_O::static_packageName(),llvmo::GlobalVariable_O::static_className()));\nllvmo::IndirectBrInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IndirectBrInst_O::static_packageName(),llvmo::IndirectBrInst_O::static_className()));\nllvmo::InvokeInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::InvokeInst_O::static_packageName(),llvmo::InvokeInst_O::static_className()));\nllvmo::LoadInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::LoadInst_O::static_packageName(),llvmo::LoadInst_O::static_className()));\nllvmo::ResumeInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ResumeInst_O::static_packageName(),llvmo::ResumeInst_O::static_className()));\nllvmo::ReturnInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ReturnInst_O::static_packageName(),llvmo::ReturnInst_O::static_className()));\nllvmo::SwitchInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::SwitchInst_O::static_packageName(),llvmo::SwitchInst_O::static_className()));\nllvmo::UnreachableInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::UnreachableInst_O::static_packageName(),llvmo::UnreachableInst_O::static_className()));\nllvmo::VAArgInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::VAArgInst_O::static_packageName(),llvmo::VAArgInst_O::static_className()));\n#endif // SET_SYMBOL\n#undef SET_SYMBOL\n#if defined(CREATE_CLASS) || defined(ALL_STAGES)\n// Depends on undefinedMetaClass\n    core::MetaClass_sp undefinedMetaClass; undefinedMetaClass.reset();\n\n    LOG(BF(\"Creating class[classllvmo__APFloat_Oval]\"));\n    core::BuiltInClass_sp classllvmo__APFloat_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__APFloat_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__APFloat_Oval,_lisp,llvmo::APFloat_O::static_classSymbol());\n    llvmo::APFloat_O::___staticMetaClass = classllvmo__APFloat_Oval;\n    _lisp->setf_findClass(llvmo::APFloat_O::static_classSymbol(),classllvmo__APFloat_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::APFloat_O>;\n        llvmo::APFloat_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::APFloat_O::static_className() % (void*)(llvmo::APFloat_O::static_newNil_callback()) );\n    classllvmo__APFloat_Oval->setInstance_newNil_callback(llvmo::APFloat_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::APFloat_O> nil_for_class(new llvmo::APFloat_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::APFloat_O::static_className() );\n        llvmo::APFloat_O::_nil = nil_for_class;\n        classllvmo__APFloat_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__APFloat_Oval->setSupportsSlots(llvmo::APFloat_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__APInt_Oval]\"));\n    core::BuiltInClass_sp classllvmo__APInt_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__APInt_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__APInt_Oval,_lisp,llvmo::APInt_O::static_classSymbol());\n    llvmo::APInt_O::___staticMetaClass = classllvmo__APInt_Oval;\n    _lisp->setf_findClass(llvmo::APInt_O::static_classSymbol(),classllvmo__APInt_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::APInt_O>;\n        llvmo::APInt_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::APInt_O::static_className() % (void*)(llvmo::APInt_O::static_newNil_callback()) );\n    classllvmo__APInt_Oval->setInstance_newNil_callback(llvmo::APInt_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::APInt_O> nil_for_class(new llvmo::APInt_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::APInt_O::static_className() );\n        llvmo::APInt_O::_nil = nil_for_class;\n        classllvmo__APInt_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__APInt_Oval->setSupportsSlots(llvmo::APInt_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Attribute_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Attribute_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Attribute_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Attribute_Oval,_lisp,llvmo::Attribute_O::static_classSymbol());\n    llvmo::Attribute_O::___staticMetaClass = classllvmo__Attribute_Oval;\n    _lisp->setf_findClass(llvmo::Attribute_O::static_classSymbol(),classllvmo__Attribute_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Attribute_O>;\n        llvmo::Attribute_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Attribute_O::static_className() % (void*)(llvmo::Attribute_O::static_newNil_callback()) );\n    classllvmo__Attribute_Oval->setInstance_newNil_callback(llvmo::Attribute_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Attribute_O> nil_for_class(new llvmo::Attribute_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Attribute_O::static_className() );\n        llvmo::Attribute_O::_nil = nil_for_class;\n        classllvmo__Attribute_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Attribute_Oval->setSupportsSlots(llvmo::Attribute_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Builder_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Builder_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Builder_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Builder_Oval,_lisp,llvmo::Builder_O::static_classSymbol());\n    llvmo::Builder_O::___staticMetaClass = classllvmo__Builder_Oval;\n    _lisp->setf_findClass(llvmo::Builder_O::static_classSymbol(),classllvmo__Builder_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Builder_O>;\n        llvmo::Builder_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Builder_O::static_className() % (void*)(llvmo::Builder_O::static_newNil_callback()) );\n    classllvmo__Builder_Oval->setInstance_newNil_callback(llvmo::Builder_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Builder_O> nil_for_class(new llvmo::Builder_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Builder_O::static_className() );\n        llvmo::Builder_O::_nil = nil_for_class;\n        classllvmo__Builder_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Builder_Oval->setSupportsSlots(llvmo::Builder_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__DebugLoc_Oval]\"));\n    core::BuiltInClass_sp classllvmo__DebugLoc_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__DebugLoc_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__DebugLoc_Oval,_lisp,llvmo::DebugLoc_O::static_classSymbol());\n    llvmo::DebugLoc_O::___staticMetaClass = classllvmo__DebugLoc_Oval;\n    _lisp->setf_findClass(llvmo::DebugLoc_O::static_classSymbol(),classllvmo__DebugLoc_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::DebugLoc_O>;\n        llvmo::DebugLoc_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::DebugLoc_O::static_className() % (void*)(llvmo::DebugLoc_O::static_newNil_callback()) );\n    classllvmo__DebugLoc_Oval->setInstance_newNil_callback(llvmo::DebugLoc_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::DebugLoc_O> nil_for_class(new llvmo::DebugLoc_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::DebugLoc_O::static_className() );\n        llvmo::DebugLoc_O::_nil = nil_for_class;\n        classllvmo__DebugLoc_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__DebugLoc_Oval->setSupportsSlots(llvmo::DebugLoc_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__EngineBuilder_Oval]\"));\n    core::BuiltInClass_sp classllvmo__EngineBuilder_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__EngineBuilder_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__EngineBuilder_Oval,_lisp,llvmo::EngineBuilder_O::static_classSymbol());\n    llvmo::EngineBuilder_O::___staticMetaClass = classllvmo__EngineBuilder_Oval;\n    _lisp->setf_findClass(llvmo::EngineBuilder_O::static_classSymbol(),classllvmo__EngineBuilder_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::EngineBuilder_O>;\n        llvmo::EngineBuilder_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::EngineBuilder_O::static_className() % (void*)(llvmo::EngineBuilder_O::static_newNil_callback()) );\n    classllvmo__EngineBuilder_Oval->setInstance_newNil_callback(llvmo::EngineBuilder_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::EngineBuilder_O> nil_for_class(new llvmo::EngineBuilder_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::EngineBuilder_O::static_className() );\n        llvmo::EngineBuilder_O::_nil = nil_for_class;\n        classllvmo__EngineBuilder_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__EngineBuilder_Oval->setSupportsSlots(llvmo::EngineBuilder_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ExecutionEngine_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ExecutionEngine_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ExecutionEngine_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ExecutionEngine_Oval,_lisp,llvmo::ExecutionEngine_O::static_classSymbol());\n    llvmo::ExecutionEngine_O::___staticMetaClass = classllvmo__ExecutionEngine_Oval;\n    _lisp->setf_findClass(llvmo::ExecutionEngine_O::static_classSymbol(),classllvmo__ExecutionEngine_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ExecutionEngine_O>;\n        llvmo::ExecutionEngine_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ExecutionEngine_O::static_className() % (void*)(llvmo::ExecutionEngine_O::static_newNil_callback()) );\n    classllvmo__ExecutionEngine_Oval->setInstance_newNil_callback(llvmo::ExecutionEngine_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ExecutionEngine_O> nil_for_class(new llvmo::ExecutionEngine_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ExecutionEngine_O::static_className() );\n        llvmo::ExecutionEngine_O::_nil = nil_for_class;\n        classllvmo__ExecutionEngine_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ExecutionEngine_Oval->setSupportsSlots(llvmo::ExecutionEngine_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__IRBuilderBase_Oval]\"));\n    core::BuiltInClass_sp classllvmo__IRBuilderBase_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__IRBuilderBase_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IRBuilderBase_Oval,_lisp,llvmo::IRBuilderBase_O::static_classSymbol());\n    llvmo::IRBuilderBase_O::___staticMetaClass = classllvmo__IRBuilderBase_Oval;\n    _lisp->setf_findClass(llvmo::IRBuilderBase_O::static_classSymbol(),classllvmo__IRBuilderBase_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::IRBuilderBase_O>;\n        llvmo::IRBuilderBase_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::IRBuilderBase_O::static_className() % (void*)(llvmo::IRBuilderBase_O::static_newNil_callback()) );\n    classllvmo__IRBuilderBase_Oval->setInstance_newNil_callback(llvmo::IRBuilderBase_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::IRBuilderBase_O> nil_for_class(new llvmo::IRBuilderBase_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::IRBuilderBase_O::static_className() );\n        llvmo::IRBuilderBase_O::_nil = nil_for_class;\n        classllvmo__IRBuilderBase_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__IRBuilderBase_Oval->setSupportsSlots(llvmo::IRBuilderBase_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__InsertPoint_Oval]\"));\n    core::BuiltInClass_sp classllvmo__InsertPoint_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__InsertPoint_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__InsertPoint_Oval,_lisp,llvmo::InsertPoint_O::static_classSymbol());\n    llvmo::InsertPoint_O::___staticMetaClass = classllvmo__InsertPoint_Oval;\n    _lisp->setf_findClass(llvmo::InsertPoint_O::static_classSymbol(),classllvmo__InsertPoint_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::InsertPoint_O>;\n        llvmo::InsertPoint_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::InsertPoint_O::static_className() % (void*)(llvmo::InsertPoint_O::static_newNil_callback()) );\n    classllvmo__InsertPoint_Oval->setInstance_newNil_callback(llvmo::InsertPoint_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::InsertPoint_O> nil_for_class(new llvmo::InsertPoint_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::InsertPoint_O::static_className() );\n        llvmo::InsertPoint_O::_nil = nil_for_class;\n        classllvmo__InsertPoint_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__InsertPoint_Oval->setSupportsSlots(llvmo::InsertPoint_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__LLVMContext_Oval]\"));\n    core::BuiltInClass_sp classllvmo__LLVMContext_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__LLVMContext_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__LLVMContext_Oval,_lisp,llvmo::LLVMContext_O::static_classSymbol());\n    llvmo::LLVMContext_O::___staticMetaClass = classllvmo__LLVMContext_Oval;\n    _lisp->setf_findClass(llvmo::LLVMContext_O::static_classSymbol(),classllvmo__LLVMContext_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::LLVMContext_O>;\n        llvmo::LLVMContext_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::LLVMContext_O::static_className() % (void*)(llvmo::LLVMContext_O::static_newNil_callback()) );\n    classllvmo__LLVMContext_Oval->setInstance_newNil_callback(llvmo::LLVMContext_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::LLVMContext_O> nil_for_class(new llvmo::LLVMContext_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::LLVMContext_O::static_className() );\n        llvmo::LLVMContext_O::_nil = nil_for_class;\n        classllvmo__LLVMContext_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__LLVMContext_Oval->setSupportsSlots(llvmo::LLVMContext_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Module_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Module_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Module_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Module_Oval,_lisp,llvmo::Module_O::static_classSymbol());\n    llvmo::Module_O::___staticMetaClass = classllvmo__Module_Oval;\n    _lisp->setf_findClass(llvmo::Module_O::static_classSymbol(),classllvmo__Module_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Module_O>;\n        llvmo::Module_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Module_O::static_className() % (void*)(llvmo::Module_O::static_newNil_callback()) );\n    classllvmo__Module_Oval->setInstance_newNil_callback(llvmo::Module_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Module_O> nil_for_class(new llvmo::Module_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Module_O::static_className() );\n        llvmo::Module_O::_nil = nil_for_class;\n        classllvmo__Module_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Module_Oval->setSupportsSlots(llvmo::Module_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__PassManagerBase_Oval]\"));\n    core::BuiltInClass_sp classllvmo__PassManagerBase_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__PassManagerBase_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__PassManagerBase_Oval,_lisp,llvmo::PassManagerBase_O::static_classSymbol());\n    llvmo::PassManagerBase_O::___staticMetaClass = classllvmo__PassManagerBase_Oval;\n    _lisp->setf_findClass(llvmo::PassManagerBase_O::static_classSymbol(),classllvmo__PassManagerBase_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::PassManagerBase_O>;\n        llvmo::PassManagerBase_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::PassManagerBase_O::static_className() % (void*)(llvmo::PassManagerBase_O::static_newNil_callback()) );\n    classllvmo__PassManagerBase_Oval->setInstance_newNil_callback(llvmo::PassManagerBase_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::PassManagerBase_O> nil_for_class(new llvmo::PassManagerBase_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::PassManagerBase_O::static_className() );\n        llvmo::PassManagerBase_O::_nil = nil_for_class;\n        classllvmo__PassManagerBase_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__PassManagerBase_Oval->setSupportsSlots(llvmo::PassManagerBase_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Pass_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Pass_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Pass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Pass_Oval,_lisp,llvmo::Pass_O::static_classSymbol());\n    llvmo::Pass_O::___staticMetaClass = classllvmo__Pass_Oval;\n    _lisp->setf_findClass(llvmo::Pass_O::static_classSymbol(),classllvmo__Pass_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Pass_O>;\n        llvmo::Pass_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Pass_O::static_className() % (void*)(llvmo::Pass_O::static_newNil_callback()) );\n    classllvmo__Pass_Oval->setInstance_newNil_callback(llvmo::Pass_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Pass_O> nil_for_class(new llvmo::Pass_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Pass_O::static_className() );\n        llvmo::Pass_O::_nil = nil_for_class;\n        classllvmo__Pass_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Pass_Oval->setSupportsSlots(llvmo::Pass_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Type_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Type_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Type_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Type_Oval,_lisp,llvmo::Type_O::static_classSymbol());\n    llvmo::Type_O::___staticMetaClass = classllvmo__Type_Oval;\n    _lisp->setf_findClass(llvmo::Type_O::static_classSymbol(),classllvmo__Type_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Type_O>;\n        llvmo::Type_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Type_O::static_className() % (void*)(llvmo::Type_O::static_newNil_callback()) );\n    classllvmo__Type_Oval->setInstance_newNil_callback(llvmo::Type_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Type_O> nil_for_class(new llvmo::Type_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Type_O::static_className() );\n        llvmo::Type_O::_nil = nil_for_class;\n        classllvmo__Type_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Type_Oval->setSupportsSlots(llvmo::Type_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Value_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Value_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Value_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Value_Oval,_lisp,llvmo::Value_O::static_classSymbol());\n    llvmo::Value_O::___staticMetaClass = classllvmo__Value_Oval;\n    _lisp->setf_findClass(llvmo::Value_O::static_classSymbol(),classllvmo__Value_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Value_O>;\n        llvmo::Value_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Value_O::static_className() % (void*)(llvmo::Value_O::static_newNil_callback()) );\n    classllvmo__Value_Oval->setInstance_newNil_callback(llvmo::Value_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Value_O> nil_for_class(new llvmo::Value_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Value_O::static_className() );\n        llvmo::Value_O::_nil = nil_for_class;\n        classllvmo__Value_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Value_Oval->setSupportsSlots(llvmo::Value_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Argument_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Argument_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Argument_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Argument_Oval,_lisp,llvmo::Argument_O::static_classSymbol());\n    llvmo::Argument_O::___staticMetaClass = classllvmo__Argument_Oval;\n    _lisp->setf_findClass(llvmo::Argument_O::static_classSymbol(),classllvmo__Argument_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Argument_O>;\n        llvmo::Argument_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Argument_O::static_className() % (void*)(llvmo::Argument_O::static_newNil_callback()) );\n    classllvmo__Argument_Oval->setInstance_newNil_callback(llvmo::Argument_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Argument_O> nil_for_class(new llvmo::Argument_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Argument_O::static_className() );\n        llvmo::Argument_O::_nil = nil_for_class;\n        classllvmo__Argument_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Argument_Oval->setSupportsSlots(llvmo::Argument_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__BasicBlock_Oval]\"));\n    core::BuiltInClass_sp classllvmo__BasicBlock_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__BasicBlock_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__BasicBlock_Oval,_lisp,llvmo::BasicBlock_O::static_classSymbol());\n    llvmo::BasicBlock_O::___staticMetaClass = classllvmo__BasicBlock_Oval;\n    _lisp->setf_findClass(llvmo::BasicBlock_O::static_classSymbol(),classllvmo__BasicBlock_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::BasicBlock_O>;\n        llvmo::BasicBlock_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::BasicBlock_O::static_className() % (void*)(llvmo::BasicBlock_O::static_newNil_callback()) );\n    classllvmo__BasicBlock_Oval->setInstance_newNil_callback(llvmo::BasicBlock_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::BasicBlock_O> nil_for_class(new llvmo::BasicBlock_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::BasicBlock_O::static_className() );\n        llvmo::BasicBlock_O::_nil = nil_for_class;\n        classllvmo__BasicBlock_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__BasicBlock_Oval->setSupportsSlots(llvmo::BasicBlock_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__CompositeType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__CompositeType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__CompositeType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__CompositeType_Oval,_lisp,llvmo::CompositeType_O::static_classSymbol());\n    llvmo::CompositeType_O::___staticMetaClass = classllvmo__CompositeType_Oval;\n    _lisp->setf_findClass(llvmo::CompositeType_O::static_classSymbol(),classllvmo__CompositeType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::CompositeType_O>;\n        llvmo::CompositeType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::CompositeType_O::static_className() % (void*)(llvmo::CompositeType_O::static_newNil_callback()) );\n    classllvmo__CompositeType_Oval->setInstance_newNil_callback(llvmo::CompositeType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::CompositeType_O> nil_for_class(new llvmo::CompositeType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::CompositeType_O::static_className() );\n        llvmo::CompositeType_O::_nil = nil_for_class;\n        classllvmo__CompositeType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__CompositeType_Oval->setSupportsSlots(llvmo::CompositeType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__FunctionPassManager_Oval]\"));\n    core::BuiltInClass_sp classllvmo__FunctionPassManager_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__FunctionPassManager_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FunctionPassManager_Oval,_lisp,llvmo::FunctionPassManager_O::static_classSymbol());\n    llvmo::FunctionPassManager_O::___staticMetaClass = classllvmo__FunctionPassManager_Oval;\n    _lisp->setf_findClass(llvmo::FunctionPassManager_O::static_classSymbol(),classllvmo__FunctionPassManager_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::FunctionPassManager_O>;\n        llvmo::FunctionPassManager_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::FunctionPassManager_O::static_className() % (void*)(llvmo::FunctionPassManager_O::static_newNil_callback()) );\n    classllvmo__FunctionPassManager_Oval->setInstance_newNil_callback(llvmo::FunctionPassManager_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::FunctionPassManager_O> nil_for_class(new llvmo::FunctionPassManager_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::FunctionPassManager_O::static_className() );\n        llvmo::FunctionPassManager_O::_nil = nil_for_class;\n        classllvmo__FunctionPassManager_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__FunctionPassManager_Oval->setSupportsSlots(llvmo::FunctionPassManager_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__FunctionPass_Oval]\"));\n    core::BuiltInClass_sp classllvmo__FunctionPass_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__FunctionPass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FunctionPass_Oval,_lisp,llvmo::FunctionPass_O::static_classSymbol());\n    llvmo::FunctionPass_O::___staticMetaClass = classllvmo__FunctionPass_Oval;\n    _lisp->setf_findClass(llvmo::FunctionPass_O::static_classSymbol(),classllvmo__FunctionPass_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::FunctionPass_O>;\n        llvmo::FunctionPass_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::FunctionPass_O::static_className() % (void*)(llvmo::FunctionPass_O::static_newNil_callback()) );\n    classllvmo__FunctionPass_Oval->setInstance_newNil_callback(llvmo::FunctionPass_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::FunctionPass_O> nil_for_class(new llvmo::FunctionPass_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::FunctionPass_O::static_className() );\n        llvmo::FunctionPass_O::_nil = nil_for_class;\n        classllvmo__FunctionPass_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__FunctionPass_Oval->setSupportsSlots(llvmo::FunctionPass_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__FunctionType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__FunctionType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__FunctionType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FunctionType_Oval,_lisp,llvmo::FunctionType_O::static_classSymbol());\n    llvmo::FunctionType_O::___staticMetaClass = classllvmo__FunctionType_Oval;\n    _lisp->setf_findClass(llvmo::FunctionType_O::static_classSymbol(),classllvmo__FunctionType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::FunctionType_O>;\n        llvmo::FunctionType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::FunctionType_O::static_className() % (void*)(llvmo::FunctionType_O::static_newNil_callback()) );\n    classllvmo__FunctionType_Oval->setInstance_newNil_callback(llvmo::FunctionType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::FunctionType_O> nil_for_class(new llvmo::FunctionType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::FunctionType_O::static_className() );\n        llvmo::FunctionType_O::_nil = nil_for_class;\n        classllvmo__FunctionType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__FunctionType_Oval->setSupportsSlots(llvmo::FunctionType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__IRBuilder_Oval]\"));\n    core::BuiltInClass_sp classllvmo__IRBuilder_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__IRBuilder_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IRBuilder_Oval,_lisp,llvmo::IRBuilder_O::static_classSymbol());\n    llvmo::IRBuilder_O::___staticMetaClass = classllvmo__IRBuilder_Oval;\n    _lisp->setf_findClass(llvmo::IRBuilder_O::static_classSymbol(),classllvmo__IRBuilder_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::IRBuilder_O>;\n        llvmo::IRBuilder_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::IRBuilder_O::static_className() % (void*)(llvmo::IRBuilder_O::static_newNil_callback()) );\n    classllvmo__IRBuilder_Oval->setInstance_newNil_callback(llvmo::IRBuilder_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::IRBuilder_O> nil_for_class(new llvmo::IRBuilder_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::IRBuilder_O::static_className() );\n        llvmo::IRBuilder_O::_nil = nil_for_class;\n        classllvmo__IRBuilder_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__IRBuilder_Oval->setSupportsSlots(llvmo::IRBuilder_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__IntegerType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__IntegerType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__IntegerType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IntegerType_Oval,_lisp,llvmo::IntegerType_O::static_classSymbol());\n    llvmo::IntegerType_O::___staticMetaClass = classllvmo__IntegerType_Oval;\n    _lisp->setf_findClass(llvmo::IntegerType_O::static_classSymbol(),classllvmo__IntegerType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::IntegerType_O>;\n        llvmo::IntegerType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::IntegerType_O::static_className() % (void*)(llvmo::IntegerType_O::static_newNil_callback()) );\n    classllvmo__IntegerType_Oval->setInstance_newNil_callback(llvmo::IntegerType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::IntegerType_O> nil_for_class(new llvmo::IntegerType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::IntegerType_O::static_className() );\n        llvmo::IntegerType_O::_nil = nil_for_class;\n        classllvmo__IntegerType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__IntegerType_Oval->setSupportsSlots(llvmo::IntegerType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__MDNode_Oval]\"));\n    core::BuiltInClass_sp classllvmo__MDNode_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__MDNode_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__MDNode_Oval,_lisp,llvmo::MDNode_O::static_classSymbol());\n    llvmo::MDNode_O::___staticMetaClass = classllvmo__MDNode_Oval;\n    _lisp->setf_findClass(llvmo::MDNode_O::static_classSymbol(),classllvmo__MDNode_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::MDNode_O>;\n        llvmo::MDNode_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::MDNode_O::static_className() % (void*)(llvmo::MDNode_O::static_newNil_callback()) );\n    classllvmo__MDNode_Oval->setInstance_newNil_callback(llvmo::MDNode_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::MDNode_O> nil_for_class(new llvmo::MDNode_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::MDNode_O::static_className() );\n        llvmo::MDNode_O::_nil = nil_for_class;\n        classllvmo__MDNode_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__MDNode_Oval->setSupportsSlots(llvmo::MDNode_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__MDString_Oval]\"));\n    core::BuiltInClass_sp classllvmo__MDString_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__MDString_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__MDString_Oval,_lisp,llvmo::MDString_O::static_classSymbol());\n    llvmo::MDString_O::___staticMetaClass = classllvmo__MDString_Oval;\n    _lisp->setf_findClass(llvmo::MDString_O::static_classSymbol(),classllvmo__MDString_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::MDString_O>;\n        llvmo::MDString_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::MDString_O::static_className() % (void*)(llvmo::MDString_O::static_newNil_callback()) );\n    classllvmo__MDString_Oval->setInstance_newNil_callback(llvmo::MDString_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::MDString_O> nil_for_class(new llvmo::MDString_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::MDString_O::static_className() );\n        llvmo::MDString_O::_nil = nil_for_class;\n        classllvmo__MDString_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__MDString_Oval->setSupportsSlots(llvmo::MDString_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ModulePass_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ModulePass_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ModulePass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ModulePass_Oval,_lisp,llvmo::ModulePass_O::static_classSymbol());\n    llvmo::ModulePass_O::___staticMetaClass = classllvmo__ModulePass_Oval;\n    _lisp->setf_findClass(llvmo::ModulePass_O::static_classSymbol(),classllvmo__ModulePass_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ModulePass_O>;\n        llvmo::ModulePass_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ModulePass_O::static_className() % (void*)(llvmo::ModulePass_O::static_newNil_callback()) );\n    classllvmo__ModulePass_Oval->setInstance_newNil_callback(llvmo::ModulePass_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ModulePass_O> nil_for_class(new llvmo::ModulePass_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ModulePass_O::static_className() );\n        llvmo::ModulePass_O::_nil = nil_for_class;\n        classllvmo__ModulePass_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ModulePass_Oval->setSupportsSlots(llvmo::ModulePass_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__User_Oval]\"));\n    core::BuiltInClass_sp classllvmo__User_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__User_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__User_Oval,_lisp,llvmo::User_O::static_classSymbol());\n    llvmo::User_O::___staticMetaClass = classllvmo__User_Oval;\n    _lisp->setf_findClass(llvmo::User_O::static_classSymbol(),classllvmo__User_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::User_O>;\n        llvmo::User_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::User_O::static_className() % (void*)(llvmo::User_O::static_newNil_callback()) );\n    classllvmo__User_Oval->setInstance_newNil_callback(llvmo::User_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::User_O> nil_for_class(new llvmo::User_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::User_O::static_className() );\n        llvmo::User_O::_nil = nil_for_class;\n        classllvmo__User_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__User_Oval->setSupportsSlots(llvmo::User_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Constant_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Constant_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Constant_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Constant_Oval,_lisp,llvmo::Constant_O::static_classSymbol());\n    llvmo::Constant_O::___staticMetaClass = classllvmo__Constant_Oval;\n    _lisp->setf_findClass(llvmo::Constant_O::static_classSymbol(),classllvmo__Constant_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Constant_O>;\n        llvmo::Constant_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Constant_O::static_className() % (void*)(llvmo::Constant_O::static_newNil_callback()) );\n    classllvmo__Constant_Oval->setInstance_newNil_callback(llvmo::Constant_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Constant_O> nil_for_class(new llvmo::Constant_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Constant_O::static_className() );\n        llvmo::Constant_O::_nil = nil_for_class;\n        classllvmo__Constant_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Constant_Oval->setSupportsSlots(llvmo::Constant_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ImmutablePass_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ImmutablePass_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ImmutablePass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ImmutablePass_Oval,_lisp,llvmo::ImmutablePass_O::static_classSymbol());\n    llvmo::ImmutablePass_O::___staticMetaClass = classllvmo__ImmutablePass_Oval;\n    _lisp->setf_findClass(llvmo::ImmutablePass_O::static_classSymbol(),classllvmo__ImmutablePass_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ImmutablePass_O>;\n        llvmo::ImmutablePass_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ImmutablePass_O::static_className() % (void*)(llvmo::ImmutablePass_O::static_newNil_callback()) );\n    classllvmo__ImmutablePass_Oval->setInstance_newNil_callback(llvmo::ImmutablePass_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ImmutablePass_O> nil_for_class(new llvmo::ImmutablePass_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ImmutablePass_O::static_className() );\n        llvmo::ImmutablePass_O::_nil = nil_for_class;\n        classllvmo__ImmutablePass_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ImmutablePass_Oval->setSupportsSlots(llvmo::ImmutablePass_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Instruction_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Instruction_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Instruction_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Instruction_Oval,_lisp,llvmo::Instruction_O::static_classSymbol());\n    llvmo::Instruction_O::___staticMetaClass = classllvmo__Instruction_Oval;\n    _lisp->setf_findClass(llvmo::Instruction_O::static_classSymbol(),classllvmo__Instruction_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Instruction_O>;\n        llvmo::Instruction_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Instruction_O::static_className() % (void*)(llvmo::Instruction_O::static_newNil_callback()) );\n    classllvmo__Instruction_Oval->setInstance_newNil_callback(llvmo::Instruction_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Instruction_O> nil_for_class(new llvmo::Instruction_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Instruction_O::static_className() );\n        llvmo::Instruction_O::_nil = nil_for_class;\n        classllvmo__Instruction_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Instruction_Oval->setSupportsSlots(llvmo::Instruction_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__SequentialType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__SequentialType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__SequentialType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__SequentialType_Oval,_lisp,llvmo::SequentialType_O::static_classSymbol());\n    llvmo::SequentialType_O::___staticMetaClass = classllvmo__SequentialType_Oval;\n    _lisp->setf_findClass(llvmo::SequentialType_O::static_classSymbol(),classllvmo__SequentialType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::SequentialType_O>;\n        llvmo::SequentialType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::SequentialType_O::static_className() % (void*)(llvmo::SequentialType_O::static_newNil_callback()) );\n    classllvmo__SequentialType_Oval->setInstance_newNil_callback(llvmo::SequentialType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::SequentialType_O> nil_for_class(new llvmo::SequentialType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::SequentialType_O::static_className() );\n        llvmo::SequentialType_O::_nil = nil_for_class;\n        classllvmo__SequentialType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__SequentialType_Oval->setSupportsSlots(llvmo::SequentialType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__StructType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__StructType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__StructType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__StructType_Oval,_lisp,llvmo::StructType_O::static_classSymbol());\n    llvmo::StructType_O::___staticMetaClass = classllvmo__StructType_Oval;\n    _lisp->setf_findClass(llvmo::StructType_O::static_classSymbol(),classllvmo__StructType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::StructType_O>;\n        llvmo::StructType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::StructType_O::static_className() % (void*)(llvmo::StructType_O::static_newNil_callback()) );\n    classllvmo__StructType_Oval->setInstance_newNil_callback(llvmo::StructType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::StructType_O> nil_for_class(new llvmo::StructType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::StructType_O::static_className() );\n        llvmo::StructType_O::_nil = nil_for_class;\n        classllvmo__StructType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__StructType_Oval->setSupportsSlots(llvmo::StructType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ArrayType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ArrayType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ArrayType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ArrayType_Oval,_lisp,llvmo::ArrayType_O::static_classSymbol());\n    llvmo::ArrayType_O::___staticMetaClass = classllvmo__ArrayType_Oval;\n    _lisp->setf_findClass(llvmo::ArrayType_O::static_classSymbol(),classllvmo__ArrayType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ArrayType_O>;\n        llvmo::ArrayType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ArrayType_O::static_className() % (void*)(llvmo::ArrayType_O::static_newNil_callback()) );\n    classllvmo__ArrayType_Oval->setInstance_newNil_callback(llvmo::ArrayType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ArrayType_O> nil_for_class(new llvmo::ArrayType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ArrayType_O::static_className() );\n        llvmo::ArrayType_O::_nil = nil_for_class;\n        classllvmo__ArrayType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ArrayType_Oval->setSupportsSlots(llvmo::ArrayType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__AtomicCmpXchgInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__AtomicCmpXchgInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__AtomicCmpXchgInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__AtomicCmpXchgInst_Oval,_lisp,llvmo::AtomicCmpXchgInst_O::static_classSymbol());\n    llvmo::AtomicCmpXchgInst_O::___staticMetaClass = classllvmo__AtomicCmpXchgInst_Oval;\n    _lisp->setf_findClass(llvmo::AtomicCmpXchgInst_O::static_classSymbol(),classllvmo__AtomicCmpXchgInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::AtomicCmpXchgInst_O>;\n        llvmo::AtomicCmpXchgInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::AtomicCmpXchgInst_O::static_className() % (void*)(llvmo::AtomicCmpXchgInst_O::static_newNil_callback()) );\n    classllvmo__AtomicCmpXchgInst_Oval->setInstance_newNil_callback(llvmo::AtomicCmpXchgInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::AtomicCmpXchgInst_O> nil_for_class(new llvmo::AtomicCmpXchgInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::AtomicCmpXchgInst_O::static_className() );\n        llvmo::AtomicCmpXchgInst_O::_nil = nil_for_class;\n        classllvmo__AtomicCmpXchgInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__AtomicCmpXchgInst_Oval->setSupportsSlots(llvmo::AtomicCmpXchgInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__AtomicRMWInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__AtomicRMWInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__AtomicRMWInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__AtomicRMWInst_Oval,_lisp,llvmo::AtomicRMWInst_O::static_classSymbol());\n    llvmo::AtomicRMWInst_O::___staticMetaClass = classllvmo__AtomicRMWInst_Oval;\n    _lisp->setf_findClass(llvmo::AtomicRMWInst_O::static_classSymbol(),classllvmo__AtomicRMWInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::AtomicRMWInst_O>;\n        llvmo::AtomicRMWInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::AtomicRMWInst_O::static_className() % (void*)(llvmo::AtomicRMWInst_O::static_newNil_callback()) );\n    classllvmo__AtomicRMWInst_Oval->setInstance_newNil_callback(llvmo::AtomicRMWInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::AtomicRMWInst_O> nil_for_class(new llvmo::AtomicRMWInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::AtomicRMWInst_O::static_className() );\n        llvmo::AtomicRMWInst_O::_nil = nil_for_class;\n        classllvmo__AtomicRMWInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__AtomicRMWInst_Oval->setSupportsSlots(llvmo::AtomicRMWInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__CallInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__CallInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__CallInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__CallInst_Oval,_lisp,llvmo::CallInst_O::static_classSymbol());\n    llvmo::CallInst_O::___staticMetaClass = classllvmo__CallInst_Oval;\n    _lisp->setf_findClass(llvmo::CallInst_O::static_classSymbol(),classllvmo__CallInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::CallInst_O>;\n        llvmo::CallInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::CallInst_O::static_className() % (void*)(llvmo::CallInst_O::static_newNil_callback()) );\n    classllvmo__CallInst_Oval->setInstance_newNil_callback(llvmo::CallInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::CallInst_O> nil_for_class(new llvmo::CallInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::CallInst_O::static_className() );\n        llvmo::CallInst_O::_nil = nil_for_class;\n        classllvmo__CallInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__CallInst_Oval->setSupportsSlots(llvmo::CallInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantArray_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantArray_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantArray_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantArray_Oval,_lisp,llvmo::ConstantArray_O::static_classSymbol());\n    llvmo::ConstantArray_O::___staticMetaClass = classllvmo__ConstantArray_Oval;\n    _lisp->setf_findClass(llvmo::ConstantArray_O::static_classSymbol(),classllvmo__ConstantArray_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantArray_O>;\n        llvmo::ConstantArray_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantArray_O::static_className() % (void*)(llvmo::ConstantArray_O::static_newNil_callback()) );\n    classllvmo__ConstantArray_Oval->setInstance_newNil_callback(llvmo::ConstantArray_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantArray_O> nil_for_class(new llvmo::ConstantArray_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantArray_O::static_className() );\n        llvmo::ConstantArray_O::_nil = nil_for_class;\n        classllvmo__ConstantArray_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantArray_Oval->setSupportsSlots(llvmo::ConstantArray_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantDataSequential_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantDataSequential_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantDataSequential_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantDataSequential_Oval,_lisp,llvmo::ConstantDataSequential_O::static_classSymbol());\n    llvmo::ConstantDataSequential_O::___staticMetaClass = classllvmo__ConstantDataSequential_Oval;\n    _lisp->setf_findClass(llvmo::ConstantDataSequential_O::static_classSymbol(),classllvmo__ConstantDataSequential_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantDataSequential_O>;\n        llvmo::ConstantDataSequential_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantDataSequential_O::static_className() % (void*)(llvmo::ConstantDataSequential_O::static_newNil_callback()) );\n    classllvmo__ConstantDataSequential_Oval->setInstance_newNil_callback(llvmo::ConstantDataSequential_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantDataSequential_O> nil_for_class(new llvmo::ConstantDataSequential_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantDataSequential_O::static_className() );\n        llvmo::ConstantDataSequential_O::_nil = nil_for_class;\n        classllvmo__ConstantDataSequential_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantDataSequential_Oval->setSupportsSlots(llvmo::ConstantDataSequential_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantExpr_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantExpr_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantExpr_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantExpr_Oval,_lisp,llvmo::ConstantExpr_O::static_classSymbol());\n    llvmo::ConstantExpr_O::___staticMetaClass = classllvmo__ConstantExpr_Oval;\n    _lisp->setf_findClass(llvmo::ConstantExpr_O::static_classSymbol(),classllvmo__ConstantExpr_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantExpr_O>;\n        llvmo::ConstantExpr_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantExpr_O::static_className() % (void*)(llvmo::ConstantExpr_O::static_newNil_callback()) );\n    classllvmo__ConstantExpr_Oval->setInstance_newNil_callback(llvmo::ConstantExpr_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantExpr_O> nil_for_class(new llvmo::ConstantExpr_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantExpr_O::static_className() );\n        llvmo::ConstantExpr_O::_nil = nil_for_class;\n        classllvmo__ConstantExpr_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantExpr_Oval->setSupportsSlots(llvmo::ConstantExpr_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantFP_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantFP_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantFP_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantFP_Oval,_lisp,llvmo::ConstantFP_O::static_classSymbol());\n    llvmo::ConstantFP_O::___staticMetaClass = classllvmo__ConstantFP_Oval;\n    _lisp->setf_findClass(llvmo::ConstantFP_O::static_classSymbol(),classllvmo__ConstantFP_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantFP_O>;\n        llvmo::ConstantFP_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantFP_O::static_className() % (void*)(llvmo::ConstantFP_O::static_newNil_callback()) );\n    classllvmo__ConstantFP_Oval->setInstance_newNil_callback(llvmo::ConstantFP_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantFP_O> nil_for_class(new llvmo::ConstantFP_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantFP_O::static_className() );\n        llvmo::ConstantFP_O::_nil = nil_for_class;\n        classllvmo__ConstantFP_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantFP_Oval->setSupportsSlots(llvmo::ConstantFP_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantInt_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantInt_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantInt_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantInt_Oval,_lisp,llvmo::ConstantInt_O::static_classSymbol());\n    llvmo::ConstantInt_O::___staticMetaClass = classllvmo__ConstantInt_Oval;\n    _lisp->setf_findClass(llvmo::ConstantInt_O::static_classSymbol(),classllvmo__ConstantInt_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantInt_O>;\n        llvmo::ConstantInt_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantInt_O::static_className() % (void*)(llvmo::ConstantInt_O::static_newNil_callback()) );\n    classllvmo__ConstantInt_Oval->setInstance_newNil_callback(llvmo::ConstantInt_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantInt_O> nil_for_class(new llvmo::ConstantInt_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantInt_O::static_className() );\n        llvmo::ConstantInt_O::_nil = nil_for_class;\n        classllvmo__ConstantInt_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantInt_Oval->setSupportsSlots(llvmo::ConstantInt_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantPointerNull_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantPointerNull_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantPointerNull_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantPointerNull_Oval,_lisp,llvmo::ConstantPointerNull_O::static_classSymbol());\n    llvmo::ConstantPointerNull_O::___staticMetaClass = classllvmo__ConstantPointerNull_Oval;\n    _lisp->setf_findClass(llvmo::ConstantPointerNull_O::static_classSymbol(),classllvmo__ConstantPointerNull_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantPointerNull_O>;\n        llvmo::ConstantPointerNull_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantPointerNull_O::static_className() % (void*)(llvmo::ConstantPointerNull_O::static_newNil_callback()) );\n    classllvmo__ConstantPointerNull_Oval->setInstance_newNil_callback(llvmo::ConstantPointerNull_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantPointerNull_O> nil_for_class(new llvmo::ConstantPointerNull_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantPointerNull_O::static_className() );\n        llvmo::ConstantPointerNull_O::_nil = nil_for_class;\n        classllvmo__ConstantPointerNull_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantPointerNull_Oval->setSupportsSlots(llvmo::ConstantPointerNull_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__DataLayout_Oval]\"));\n    core::BuiltInClass_sp classllvmo__DataLayout_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__DataLayout_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__DataLayout_Oval,_lisp,llvmo::DataLayout_O::static_classSymbol());\n    llvmo::DataLayout_O::___staticMetaClass = classllvmo__DataLayout_Oval;\n    _lisp->setf_findClass(llvmo::DataLayout_O::static_classSymbol(),classllvmo__DataLayout_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::DataLayout_O>;\n        llvmo::DataLayout_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::DataLayout_O::static_className() % (void*)(llvmo::DataLayout_O::static_newNil_callback()) );\n    classllvmo__DataLayout_Oval->setInstance_newNil_callback(llvmo::DataLayout_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::DataLayout_O> nil_for_class(new llvmo::DataLayout_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::DataLayout_O::static_className() );\n        llvmo::DataLayout_O::_nil = nil_for_class;\n        classllvmo__DataLayout_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__DataLayout_Oval->setSupportsSlots(llvmo::DataLayout_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__FenceInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__FenceInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__FenceInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FenceInst_Oval,_lisp,llvmo::FenceInst_O::static_classSymbol());\n    llvmo::FenceInst_O::___staticMetaClass = classllvmo__FenceInst_Oval;\n    _lisp->setf_findClass(llvmo::FenceInst_O::static_classSymbol(),classllvmo__FenceInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::FenceInst_O>;\n        llvmo::FenceInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::FenceInst_O::static_className() % (void*)(llvmo::FenceInst_O::static_newNil_callback()) );\n    classllvmo__FenceInst_Oval->setInstance_newNil_callback(llvmo::FenceInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::FenceInst_O> nil_for_class(new llvmo::FenceInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::FenceInst_O::static_className() );\n        llvmo::FenceInst_O::_nil = nil_for_class;\n        classllvmo__FenceInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__FenceInst_Oval->setSupportsSlots(llvmo::FenceInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__GlobalValue_Oval]\"));\n    core::BuiltInClass_sp classllvmo__GlobalValue_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__GlobalValue_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__GlobalValue_Oval,_lisp,llvmo::GlobalValue_O::static_classSymbol());\n    llvmo::GlobalValue_O::___staticMetaClass = classllvmo__GlobalValue_Oval;\n    _lisp->setf_findClass(llvmo::GlobalValue_O::static_classSymbol(),classllvmo__GlobalValue_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::GlobalValue_O>;\n        llvmo::GlobalValue_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::GlobalValue_O::static_className() % (void*)(llvmo::GlobalValue_O::static_newNil_callback()) );\n    classllvmo__GlobalValue_Oval->setInstance_newNil_callback(llvmo::GlobalValue_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::GlobalValue_O> nil_for_class(new llvmo::GlobalValue_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::GlobalValue_O::static_className() );\n        llvmo::GlobalValue_O::_nil = nil_for_class;\n        classllvmo__GlobalValue_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__GlobalValue_Oval->setSupportsSlots(llvmo::GlobalValue_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__LandingPadInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__LandingPadInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__LandingPadInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__LandingPadInst_Oval,_lisp,llvmo::LandingPadInst_O::static_classSymbol());\n    llvmo::LandingPadInst_O::___staticMetaClass = classllvmo__LandingPadInst_Oval;\n    _lisp->setf_findClass(llvmo::LandingPadInst_O::static_classSymbol(),classllvmo__LandingPadInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::LandingPadInst_O>;\n        llvmo::LandingPadInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::LandingPadInst_O::static_className() % (void*)(llvmo::LandingPadInst_O::static_newNil_callback()) );\n    classllvmo__LandingPadInst_Oval->setInstance_newNil_callback(llvmo::LandingPadInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::LandingPadInst_O> nil_for_class(new llvmo::LandingPadInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::LandingPadInst_O::static_className() );\n        llvmo::LandingPadInst_O::_nil = nil_for_class;\n        classllvmo__LandingPadInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__LandingPadInst_Oval->setSupportsSlots(llvmo::LandingPadInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__PHINode_Oval]\"));\n    core::BuiltInClass_sp classllvmo__PHINode_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__PHINode_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__PHINode_Oval,_lisp,llvmo::PHINode_O::static_classSymbol());\n    llvmo::PHINode_O::___staticMetaClass = classllvmo__PHINode_Oval;\n    _lisp->setf_findClass(llvmo::PHINode_O::static_classSymbol(),classllvmo__PHINode_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::PHINode_O>;\n        llvmo::PHINode_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::PHINode_O::static_className() % (void*)(llvmo::PHINode_O::static_newNil_callback()) );\n    classllvmo__PHINode_Oval->setInstance_newNil_callback(llvmo::PHINode_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::PHINode_O> nil_for_class(new llvmo::PHINode_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::PHINode_O::static_className() );\n        llvmo::PHINode_O::_nil = nil_for_class;\n        classllvmo__PHINode_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__PHINode_Oval->setSupportsSlots(llvmo::PHINode_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__PointerType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__PointerType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__PointerType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__PointerType_Oval,_lisp,llvmo::PointerType_O::static_classSymbol());\n    llvmo::PointerType_O::___staticMetaClass = classllvmo__PointerType_Oval;\n    _lisp->setf_findClass(llvmo::PointerType_O::static_classSymbol(),classllvmo__PointerType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::PointerType_O>;\n        llvmo::PointerType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::PointerType_O::static_className() % (void*)(llvmo::PointerType_O::static_newNil_callback()) );\n    classllvmo__PointerType_Oval->setInstance_newNil_callback(llvmo::PointerType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::PointerType_O> nil_for_class(new llvmo::PointerType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::PointerType_O::static_className() );\n        llvmo::PointerType_O::_nil = nil_for_class;\n        classllvmo__PointerType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__PointerType_Oval->setSupportsSlots(llvmo::PointerType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__StoreInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__StoreInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__StoreInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__StoreInst_Oval,_lisp,llvmo::StoreInst_O::static_classSymbol());\n    llvmo::StoreInst_O::___staticMetaClass = classllvmo__StoreInst_Oval;\n    _lisp->setf_findClass(llvmo::StoreInst_O::static_classSymbol(),classllvmo__StoreInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::StoreInst_O>;\n        llvmo::StoreInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::StoreInst_O::static_className() % (void*)(llvmo::StoreInst_O::static_newNil_callback()) );\n    classllvmo__StoreInst_Oval->setInstance_newNil_callback(llvmo::StoreInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::StoreInst_O> nil_for_class(new llvmo::StoreInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::StoreInst_O::static_className() );\n        llvmo::StoreInst_O::_nil = nil_for_class;\n        classllvmo__StoreInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__StoreInst_Oval->setSupportsSlots(llvmo::StoreInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__TerminatorInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__TerminatorInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__TerminatorInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__TerminatorInst_Oval,_lisp,llvmo::TerminatorInst_O::static_classSymbol());\n    llvmo::TerminatorInst_O::___staticMetaClass = classllvmo__TerminatorInst_Oval;\n    _lisp->setf_findClass(llvmo::TerminatorInst_O::static_classSymbol(),classllvmo__TerminatorInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::TerminatorInst_O>;\n        llvmo::TerminatorInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::TerminatorInst_O::static_className() % (void*)(llvmo::TerminatorInst_O::static_newNil_callback()) );\n    classllvmo__TerminatorInst_Oval->setInstance_newNil_callback(llvmo::TerminatorInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::TerminatorInst_O> nil_for_class(new llvmo::TerminatorInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::TerminatorInst_O::static_className() );\n        llvmo::TerminatorInst_O::_nil = nil_for_class;\n        classllvmo__TerminatorInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__TerminatorInst_Oval->setSupportsSlots(llvmo::TerminatorInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__UnaryInstruction_Oval]\"));\n    core::BuiltInClass_sp classllvmo__UnaryInstruction_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__UnaryInstruction_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__UnaryInstruction_Oval,_lisp,llvmo::UnaryInstruction_O::static_classSymbol());\n    llvmo::UnaryInstruction_O::___staticMetaClass = classllvmo__UnaryInstruction_Oval;\n    _lisp->setf_findClass(llvmo::UnaryInstruction_O::static_classSymbol(),classllvmo__UnaryInstruction_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::UnaryInstruction_O>;\n        llvmo::UnaryInstruction_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::UnaryInstruction_O::static_className() % (void*)(llvmo::UnaryInstruction_O::static_newNil_callback()) );\n    classllvmo__UnaryInstruction_Oval->setInstance_newNil_callback(llvmo::UnaryInstruction_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::UnaryInstruction_O> nil_for_class(new llvmo::UnaryInstruction_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::UnaryInstruction_O::static_className() );\n        llvmo::UnaryInstruction_O::_nil = nil_for_class;\n        classllvmo__UnaryInstruction_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__UnaryInstruction_Oval->setSupportsSlots(llvmo::UnaryInstruction_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__UndefValue_Oval]\"));\n    core::BuiltInClass_sp classllvmo__UndefValue_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__UndefValue_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__UndefValue_Oval,_lisp,llvmo::UndefValue_O::static_classSymbol());\n    llvmo::UndefValue_O::___staticMetaClass = classllvmo__UndefValue_Oval;\n    _lisp->setf_findClass(llvmo::UndefValue_O::static_classSymbol(),classllvmo__UndefValue_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::UndefValue_O>;\n        llvmo::UndefValue_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::UndefValue_O::static_className() % (void*)(llvmo::UndefValue_O::static_newNil_callback()) );\n    classllvmo__UndefValue_Oval->setInstance_newNil_callback(llvmo::UndefValue_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::UndefValue_O> nil_for_class(new llvmo::UndefValue_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::UndefValue_O::static_className() );\n        llvmo::UndefValue_O::_nil = nil_for_class;\n        classllvmo__UndefValue_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__UndefValue_Oval->setSupportsSlots(llvmo::UndefValue_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__VectorType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__VectorType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__VectorType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__VectorType_Oval,_lisp,llvmo::VectorType_O::static_classSymbol());\n    llvmo::VectorType_O::___staticMetaClass = classllvmo__VectorType_Oval;\n    _lisp->setf_findClass(llvmo::VectorType_O::static_classSymbol(),classllvmo__VectorType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::VectorType_O>;\n        llvmo::VectorType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::VectorType_O::static_className() % (void*)(llvmo::VectorType_O::static_newNil_callback()) );\n    classllvmo__VectorType_Oval->setInstance_newNil_callback(llvmo::VectorType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::VectorType_O> nil_for_class(new llvmo::VectorType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::VectorType_O::static_className() );\n        llvmo::VectorType_O::_nil = nil_for_class;\n        classllvmo__VectorType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__VectorType_Oval->setSupportsSlots(llvmo::VectorType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__AllocaInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__AllocaInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__AllocaInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__AllocaInst_Oval,_lisp,llvmo::AllocaInst_O::static_classSymbol());\n    llvmo::AllocaInst_O::___staticMetaClass = classllvmo__AllocaInst_Oval;\n    _lisp->setf_findClass(llvmo::AllocaInst_O::static_classSymbol(),classllvmo__AllocaInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::AllocaInst_O>;\n        llvmo::AllocaInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::AllocaInst_O::static_className() % (void*)(llvmo::AllocaInst_O::static_newNil_callback()) );\n    classllvmo__AllocaInst_Oval->setInstance_newNil_callback(llvmo::AllocaInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::AllocaInst_O> nil_for_class(new llvmo::AllocaInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::AllocaInst_O::static_className() );\n        llvmo::AllocaInst_O::_nil = nil_for_class;\n        classllvmo__AllocaInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__AllocaInst_Oval->setSupportsSlots(llvmo::AllocaInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__BranchInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__BranchInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__BranchInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__BranchInst_Oval,_lisp,llvmo::BranchInst_O::static_classSymbol());\n    llvmo::BranchInst_O::___staticMetaClass = classllvmo__BranchInst_Oval;\n    _lisp->setf_findClass(llvmo::BranchInst_O::static_classSymbol(),classllvmo__BranchInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::BranchInst_O>;\n        llvmo::BranchInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::BranchInst_O::static_className() % (void*)(llvmo::BranchInst_O::static_newNil_callback()) );\n    classllvmo__BranchInst_Oval->setInstance_newNil_callback(llvmo::BranchInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::BranchInst_O> nil_for_class(new llvmo::BranchInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::BranchInst_O::static_className() );\n        llvmo::BranchInst_O::_nil = nil_for_class;\n        classllvmo__BranchInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__BranchInst_Oval->setSupportsSlots(llvmo::BranchInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantDataArray_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantDataArray_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantDataArray_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantDataArray_Oval,_lisp,llvmo::ConstantDataArray_O::static_classSymbol());\n    llvmo::ConstantDataArray_O::___staticMetaClass = classllvmo__ConstantDataArray_Oval;\n    _lisp->setf_findClass(llvmo::ConstantDataArray_O::static_classSymbol(),classllvmo__ConstantDataArray_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantDataArray_O>;\n        llvmo::ConstantDataArray_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantDataArray_O::static_className() % (void*)(llvmo::ConstantDataArray_O::static_newNil_callback()) );\n    classllvmo__ConstantDataArray_Oval->setInstance_newNil_callback(llvmo::ConstantDataArray_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantDataArray_O> nil_for_class(new llvmo::ConstantDataArray_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantDataArray_O::static_className() );\n        llvmo::ConstantDataArray_O::_nil = nil_for_class;\n        classllvmo__ConstantDataArray_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantDataArray_Oval->setSupportsSlots(llvmo::ConstantDataArray_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Function_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Function_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Function_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Function_Oval,_lisp,llvmo::Function_O::static_classSymbol());\n    llvmo::Function_O::___staticMetaClass = classllvmo__Function_Oval;\n    _lisp->setf_findClass(llvmo::Function_O::static_classSymbol(),classllvmo__Function_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Function_O>;\n        llvmo::Function_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Function_O::static_className() % (void*)(llvmo::Function_O::static_newNil_callback()) );\n    classllvmo__Function_Oval->setInstance_newNil_callback(llvmo::Function_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Function_O> nil_for_class(new llvmo::Function_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Function_O::static_className() );\n        llvmo::Function_O::_nil = nil_for_class;\n        classllvmo__Function_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Function_Oval->setSupportsSlots(llvmo::Function_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__GlobalVariable_Oval]\"));\n    core::BuiltInClass_sp classllvmo__GlobalVariable_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__GlobalVariable_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__GlobalVariable_Oval,_lisp,llvmo::GlobalVariable_O::static_classSymbol());\n    llvmo::GlobalVariable_O::___staticMetaClass = classllvmo__GlobalVariable_Oval;\n    _lisp->setf_findClass(llvmo::GlobalVariable_O::static_classSymbol(),classllvmo__GlobalVariable_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::GlobalVariable_O>;\n        llvmo::GlobalVariable_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::GlobalVariable_O::static_className() % (void*)(llvmo::GlobalVariable_O::static_newNil_callback()) );\n    classllvmo__GlobalVariable_Oval->setInstance_newNil_callback(llvmo::GlobalVariable_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::GlobalVariable_O> nil_for_class(new llvmo::GlobalVariable_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::GlobalVariable_O::static_className() );\n        llvmo::GlobalVariable_O::_nil = nil_for_class;\n        classllvmo__GlobalVariable_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__GlobalVariable_Oval->setSupportsSlots(llvmo::GlobalVariable_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__IndirectBrInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__IndirectBrInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__IndirectBrInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IndirectBrInst_Oval,_lisp,llvmo::IndirectBrInst_O::static_classSymbol());\n    llvmo::IndirectBrInst_O::___staticMetaClass = classllvmo__IndirectBrInst_Oval;\n    _lisp->setf_findClass(llvmo::IndirectBrInst_O::static_classSymbol(),classllvmo__IndirectBrInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::IndirectBrInst_O>;\n        llvmo::IndirectBrInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::IndirectBrInst_O::static_className() % (void*)(llvmo::IndirectBrInst_O::static_newNil_callback()) );\n    classllvmo__IndirectBrInst_Oval->setInstance_newNil_callback(llvmo::IndirectBrInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::IndirectBrInst_O> nil_for_class(new llvmo::IndirectBrInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::IndirectBrInst_O::static_className() );\n        llvmo::IndirectBrInst_O::_nil = nil_for_class;\n        classllvmo__IndirectBrInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__IndirectBrInst_Oval->setSupportsSlots(llvmo::IndirectBrInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__InvokeInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__InvokeInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__InvokeInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__InvokeInst_Oval,_lisp,llvmo::InvokeInst_O::static_classSymbol());\n    llvmo::InvokeInst_O::___staticMetaClass = classllvmo__InvokeInst_Oval;\n    _lisp->setf_findClass(llvmo::InvokeInst_O::static_classSymbol(),classllvmo__InvokeInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::InvokeInst_O>;\n        llvmo::InvokeInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::InvokeInst_O::static_className() % (void*)(llvmo::InvokeInst_O::static_newNil_callback()) );\n    classllvmo__InvokeInst_Oval->setInstance_newNil_callback(llvmo::InvokeInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::InvokeInst_O> nil_for_class(new llvmo::InvokeInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::InvokeInst_O::static_className() );\n        llvmo::InvokeInst_O::_nil = nil_for_class;\n        classllvmo__InvokeInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__InvokeInst_Oval->setSupportsSlots(llvmo::InvokeInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__LoadInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__LoadInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__LoadInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__LoadInst_Oval,_lisp,llvmo::LoadInst_O::static_classSymbol());\n    llvmo::LoadInst_O::___staticMetaClass = classllvmo__LoadInst_Oval;\n    _lisp->setf_findClass(llvmo::LoadInst_O::static_classSymbol(),classllvmo__LoadInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::LoadInst_O>;\n        llvmo::LoadInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::LoadInst_O::static_className() % (void*)(llvmo::LoadInst_O::static_newNil_callback()) );\n    classllvmo__LoadInst_Oval->setInstance_newNil_callback(llvmo::LoadInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::LoadInst_O> nil_for_class(new llvmo::LoadInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::LoadInst_O::static_className() );\n        llvmo::LoadInst_O::_nil = nil_for_class;\n        classllvmo__LoadInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__LoadInst_Oval->setSupportsSlots(llvmo::LoadInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ResumeInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ResumeInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ResumeInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ResumeInst_Oval,_lisp,llvmo::ResumeInst_O::static_classSymbol());\n    llvmo::ResumeInst_O::___staticMetaClass = classllvmo__ResumeInst_Oval;\n    _lisp->setf_findClass(llvmo::ResumeInst_O::static_classSymbol(),classllvmo__ResumeInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ResumeInst_O>;\n        llvmo::ResumeInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ResumeInst_O::static_className() % (void*)(llvmo::ResumeInst_O::static_newNil_callback()) );\n    classllvmo__ResumeInst_Oval->setInstance_newNil_callback(llvmo::ResumeInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ResumeInst_O> nil_for_class(new llvmo::ResumeInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ResumeInst_O::static_className() );\n        llvmo::ResumeInst_O::_nil = nil_for_class;\n        classllvmo__ResumeInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ResumeInst_Oval->setSupportsSlots(llvmo::ResumeInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ReturnInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ReturnInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ReturnInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ReturnInst_Oval,_lisp,llvmo::ReturnInst_O::static_classSymbol());\n    llvmo::ReturnInst_O::___staticMetaClass = classllvmo__ReturnInst_Oval;\n    _lisp->setf_findClass(llvmo::ReturnInst_O::static_classSymbol(),classllvmo__ReturnInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ReturnInst_O>;\n        llvmo::ReturnInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ReturnInst_O::static_className() % (void*)(llvmo::ReturnInst_O::static_newNil_callback()) );\n    classllvmo__ReturnInst_Oval->setInstance_newNil_callback(llvmo::ReturnInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ReturnInst_O> nil_for_class(new llvmo::ReturnInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ReturnInst_O::static_className() );\n        llvmo::ReturnInst_O::_nil = nil_for_class;\n        classllvmo__ReturnInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ReturnInst_Oval->setSupportsSlots(llvmo::ReturnInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__SwitchInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__SwitchInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__SwitchInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__SwitchInst_Oval,_lisp,llvmo::SwitchInst_O::static_classSymbol());\n    llvmo::SwitchInst_O::___staticMetaClass = classllvmo__SwitchInst_Oval;\n    _lisp->setf_findClass(llvmo::SwitchInst_O::static_classSymbol(),classllvmo__SwitchInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::SwitchInst_O>;\n        llvmo::SwitchInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::SwitchInst_O::static_className() % (void*)(llvmo::SwitchInst_O::static_newNil_callback()) );\n    classllvmo__SwitchInst_Oval->setInstance_newNil_callback(llvmo::SwitchInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::SwitchInst_O> nil_for_class(new llvmo::SwitchInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::SwitchInst_O::static_className() );\n        llvmo::SwitchInst_O::_nil = nil_for_class;\n        classllvmo__SwitchInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__SwitchInst_Oval->setSupportsSlots(llvmo::SwitchInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__UnreachableInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__UnreachableInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__UnreachableInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__UnreachableInst_Oval,_lisp,llvmo::UnreachableInst_O::static_classSymbol());\n    llvmo::UnreachableInst_O::___staticMetaClass = classllvmo__UnreachableInst_Oval;\n    _lisp->setf_findClass(llvmo::UnreachableInst_O::static_classSymbol(),classllvmo__UnreachableInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::UnreachableInst_O>;\n        llvmo::UnreachableInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::UnreachableInst_O::static_className() % (void*)(llvmo::UnreachableInst_O::static_newNil_callback()) );\n    classllvmo__UnreachableInst_Oval->setInstance_newNil_callback(llvmo::UnreachableInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::UnreachableInst_O> nil_for_class(new llvmo::UnreachableInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::UnreachableInst_O::static_className() );\n        llvmo::UnreachableInst_O::_nil = nil_for_class;\n        classllvmo__UnreachableInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__UnreachableInst_Oval->setSupportsSlots(llvmo::UnreachableInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__VAArgInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__VAArgInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__VAArgInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__VAArgInst_Oval,_lisp,llvmo::VAArgInst_O::static_classSymbol());\n    llvmo::VAArgInst_O::___staticMetaClass = classllvmo__VAArgInst_Oval;\n    _lisp->setf_findClass(llvmo::VAArgInst_O::static_classSymbol(),classllvmo__VAArgInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::VAArgInst_O>;\n        llvmo::VAArgInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::VAArgInst_O::static_className() % (void*)(llvmo::VAArgInst_O::static_newNil_callback()) );\n    classllvmo__VAArgInst_Oval->setInstance_newNil_callback(llvmo::VAArgInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::VAArgInst_O> nil_for_class(new llvmo::VAArgInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::VAArgInst_O::static_className() );\n        llvmo::VAArgInst_O::_nil = nil_for_class;\n        classllvmo__VAArgInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__VAArgInst_Oval->setSupportsSlots(llvmo::VAArgInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n#endif // CREATE_CLASS\n#undef CREATE_CLASS\n#ifdef DUMP_INFO_CLASS // {\n// Depends on nothing\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::APFloat_O @ %X\") % classllvmo__APFloat_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::APFloat_O::static_className() % llvmo::APFloat_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::APInt_O @ %X\") % classllvmo__APInt_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::APInt_O::static_className() % llvmo::APInt_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Attribute_O @ %X\") % classllvmo__Attribute_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Attribute_O::static_className() % llvmo::Attribute_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Builder_O @ %X\") % classllvmo__Builder_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Builder_O::static_className() % llvmo::Builder_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::DebugLoc_O @ %X\") % classllvmo__DebugLoc_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::DebugLoc_O::static_className() % llvmo::DebugLoc_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::EngineBuilder_O @ %X\") % classllvmo__EngineBuilder_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::EngineBuilder_O::static_className() % llvmo::EngineBuilder_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ExecutionEngine_O @ %X\") % classllvmo__ExecutionEngine_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ExecutionEngine_O::static_className() % llvmo::ExecutionEngine_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::IRBuilderBase_O @ %X\") % classllvmo__IRBuilderBase_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::IRBuilderBase_O::static_className() % llvmo::IRBuilderBase_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::InsertPoint_O @ %X\") % classllvmo__InsertPoint_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::InsertPoint_O::static_className() % llvmo::InsertPoint_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::LLVMContext_O @ %X\") % classllvmo__LLVMContext_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::LLVMContext_O::static_className() % llvmo::LLVMContext_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Module_O @ %X\") % classllvmo__Module_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Module_O::static_className() % llvmo::Module_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::PassManagerBase_O @ %X\") % classllvmo__PassManagerBase_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::PassManagerBase_O::static_className() % llvmo::PassManagerBase_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Pass_O @ %X\") % classllvmo__Pass_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Pass_O::static_className() % llvmo::Pass_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Type_O @ %X\") % classllvmo__Type_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Type_O::static_className() % llvmo::Type_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Value_O @ %X\") % classllvmo__Value_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Value_O::static_className() % llvmo::Value_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Argument_O @ %X\") % classllvmo__Argument_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Argument_O::static_className() % llvmo::Argument_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::BasicBlock_O @ %X\") % classllvmo__BasicBlock_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::BasicBlock_O::static_className() % llvmo::BasicBlock_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::CompositeType_O @ %X\") % classllvmo__CompositeType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::CompositeType_O::static_className() % llvmo::CompositeType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::FunctionPassManager_O @ %X\") % classllvmo__FunctionPassManager_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::FunctionPassManager_O::static_className() % llvmo::FunctionPassManager_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::FunctionPass_O @ %X\") % classllvmo__FunctionPass_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::FunctionPass_O::static_className() % llvmo::FunctionPass_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::FunctionType_O @ %X\") % classllvmo__FunctionType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::FunctionType_O::static_className() % llvmo::FunctionType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::IRBuilder_O @ %X\") % classllvmo__IRBuilder_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::IRBuilder_O::static_className() % llvmo::IRBuilder_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::IntegerType_O @ %X\") % classllvmo__IntegerType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::IntegerType_O::static_className() % llvmo::IntegerType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::MDNode_O @ %X\") % classllvmo__MDNode_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::MDNode_O::static_className() % llvmo::MDNode_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::MDString_O @ %X\") % classllvmo__MDString_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::MDString_O::static_className() % llvmo::MDString_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ModulePass_O @ %X\") % classllvmo__ModulePass_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ModulePass_O::static_className() % llvmo::ModulePass_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::User_O @ %X\") % classllvmo__User_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::User_O::static_className() % llvmo::User_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Constant_O @ %X\") % classllvmo__Constant_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Constant_O::static_className() % llvmo::Constant_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ImmutablePass_O @ %X\") % classllvmo__ImmutablePass_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ImmutablePass_O::static_className() % llvmo::ImmutablePass_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Instruction_O @ %X\") % classllvmo__Instruction_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Instruction_O::static_className() % llvmo::Instruction_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::SequentialType_O @ %X\") % classllvmo__SequentialType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::SequentialType_O::static_className() % llvmo::SequentialType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::StructType_O @ %X\") % classllvmo__StructType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::StructType_O::static_className() % llvmo::StructType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ArrayType_O @ %X\") % classllvmo__ArrayType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ArrayType_O::static_className() % llvmo::ArrayType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::AtomicCmpXchgInst_O @ %X\") % classllvmo__AtomicCmpXchgInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::AtomicCmpXchgInst_O::static_className() % llvmo::AtomicCmpXchgInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::AtomicRMWInst_O @ %X\") % classllvmo__AtomicRMWInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::AtomicRMWInst_O::static_className() % llvmo::AtomicRMWInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::CallInst_O @ %X\") % classllvmo__CallInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::CallInst_O::static_className() % llvmo::CallInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantArray_O @ %X\") % classllvmo__ConstantArray_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantArray_O::static_className() % llvmo::ConstantArray_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantDataSequential_O @ %X\") % classllvmo__ConstantDataSequential_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantDataSequential_O::static_className() % llvmo::ConstantDataSequential_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantExpr_O @ %X\") % classllvmo__ConstantExpr_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantExpr_O::static_className() % llvmo::ConstantExpr_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantFP_O @ %X\") % classllvmo__ConstantFP_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantFP_O::static_className() % llvmo::ConstantFP_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantInt_O @ %X\") % classllvmo__ConstantInt_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantInt_O::static_className() % llvmo::ConstantInt_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantPointerNull_O @ %X\") % classllvmo__ConstantPointerNull_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantPointerNull_O::static_className() % llvmo::ConstantPointerNull_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::DataLayout_O @ %X\") % classllvmo__DataLayout_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::DataLayout_O::static_className() % llvmo::DataLayout_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::FenceInst_O @ %X\") % classllvmo__FenceInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::FenceInst_O::static_className() % llvmo::FenceInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::GlobalValue_O @ %X\") % classllvmo__GlobalValue_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::GlobalValue_O::static_className() % llvmo::GlobalValue_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::LandingPadInst_O @ %X\") % classllvmo__LandingPadInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::LandingPadInst_O::static_className() % llvmo::LandingPadInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::PHINode_O @ %X\") % classllvmo__PHINode_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::PHINode_O::static_className() % llvmo::PHINode_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::PointerType_O @ %X\") % classllvmo__PointerType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::PointerType_O::static_className() % llvmo::PointerType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::StoreInst_O @ %X\") % classllvmo__StoreInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::StoreInst_O::static_className() % llvmo::StoreInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::TerminatorInst_O @ %X\") % classllvmo__TerminatorInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::TerminatorInst_O::static_className() % llvmo::TerminatorInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::UnaryInstruction_O @ %X\") % classllvmo__UnaryInstruction_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::UnaryInstruction_O::static_className() % llvmo::UnaryInstruction_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::UndefValue_O @ %X\") % classllvmo__UndefValue_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::UndefValue_O::static_className() % llvmo::UndefValue_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::VectorType_O @ %X\") % classllvmo__VectorType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::VectorType_O::static_className() % llvmo::VectorType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::AllocaInst_O @ %X\") % classllvmo__AllocaInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::AllocaInst_O::static_className() % llvmo::AllocaInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::BranchInst_O @ %X\") % classllvmo__BranchInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::BranchInst_O::static_className() % llvmo::BranchInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantDataArray_O @ %X\") % classllvmo__ConstantDataArray_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantDataArray_O::static_className() % llvmo::ConstantDataArray_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Function_O @ %X\") % classllvmo__Function_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Function_O::static_className() % llvmo::Function_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::GlobalVariable_O @ %X\") % classllvmo__GlobalVariable_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::GlobalVariable_O::static_className() % llvmo::GlobalVariable_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::IndirectBrInst_O @ %X\") % classllvmo__IndirectBrInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::IndirectBrInst_O::static_className() % llvmo::IndirectBrInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::InvokeInst_O @ %X\") % classllvmo__InvokeInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::InvokeInst_O::static_className() % llvmo::InvokeInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::LoadInst_O @ %X\") % classllvmo__LoadInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::LoadInst_O::static_className() % llvmo::LoadInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ResumeInst_O @ %X\") % classllvmo__ResumeInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ResumeInst_O::static_className() % llvmo::ResumeInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ReturnInst_O @ %X\") % classllvmo__ReturnInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ReturnInst_O::static_className() % llvmo::ReturnInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::SwitchInst_O @ %X\") % classllvmo__SwitchInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::SwitchInst_O::static_className() % llvmo::SwitchInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::UnreachableInst_O @ %X\") % classllvmo__UnreachableInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::UnreachableInst_O::static_className() % llvmo::UnreachableInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::VAArgInst_O @ %X\") % classllvmo__VAArgInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::VAArgInst_O::static_className() % llvmo::VAArgInst_O::static_classSymbol() );\n#endif // } DUMP_INFO_CLASS\n#undef DUMP_INFO_CLASS\n#if defined(DEFINE_BASE_CLASSES) || defined(ALL_STAGES) // {\n// Depends on nothing\nclassllvmo__APFloat_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__APInt_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Attribute_Oval->addInstanceBaseClass(core::T_O::static_classSymbol());\nclassllvmo__Builder_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__DebugLoc_Oval->addInstanceBaseClass(core::T_O::static_classSymbol());\nclassllvmo__EngineBuilder_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__ExecutionEngine_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__IRBuilderBase_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__InsertPoint_Oval->addInstanceBaseClass(core::T_O::static_classSymbol());\nclassllvmo__LLVMContext_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Module_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__PassManagerBase_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Pass_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Type_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Value_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Argument_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol());\nclassllvmo__BasicBlock_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol());\nclassllvmo__CompositeType_Oval->addInstanceBaseClass(llvmo::Type_O::static_classSymbol());\nclassllvmo__FunctionPassManager_Oval->addInstanceBaseClass(llvmo::PassManagerBase_O::static_classSymbol());\nclassllvmo__FunctionPass_Oval->addInstanceBaseClass(llvmo::Pass_O::static_classSymbol());\nclassllvmo__FunctionType_Oval->addInstanceBaseClass(llvmo::Type_O::static_classSymbol());\nclassllvmo__IRBuilder_Oval->addInstanceBaseClass(llvmo::IRBuilderBase_O::static_classSymbol());\nclassllvmo__IntegerType_Oval->addInstanceBaseClass(llvmo::Type_O::static_classSymbol());\nclassllvmo__MDNode_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol());\nclassllvmo__MDString_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol());\nclassllvmo__ModulePass_Oval->addInstanceBaseClass(llvmo::Pass_O::static_classSymbol());\nclassllvmo__User_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol());\nclassllvmo__Constant_Oval->addInstanceBaseClass(llvmo::User_O::static_classSymbol());\nclassllvmo__ImmutablePass_Oval->addInstanceBaseClass(llvmo::ModulePass_O::static_classSymbol());\nclassllvmo__Instruction_Oval->addInstanceBaseClass(llvmo::User_O::static_classSymbol());\nclassllvmo__SequentialType_Oval->addInstanceBaseClass(llvmo::CompositeType_O::static_classSymbol());\nclassllvmo__StructType_Oval->addInstanceBaseClass(llvmo::CompositeType_O::static_classSymbol());\nclassllvmo__ArrayType_Oval->addInstanceBaseClass(llvmo::SequentialType_O::static_classSymbol());\nclassllvmo__AtomicCmpXchgInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__AtomicRMWInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__CallInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__ConstantArray_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__ConstantDataSequential_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__ConstantExpr_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__ConstantFP_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__ConstantInt_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__ConstantPointerNull_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__DataLayout_Oval->addInstanceBaseClass(llvmo::ImmutablePass_O::static_classSymbol());\nclassllvmo__FenceInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__GlobalValue_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__LandingPadInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__PHINode_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__PointerType_Oval->addInstanceBaseClass(llvmo::SequentialType_O::static_classSymbol());\nclassllvmo__StoreInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__TerminatorInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__UnaryInstruction_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__UndefValue_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__VectorType_Oval->addInstanceBaseClass(llvmo::SequentialType_O::static_classSymbol());\nclassllvmo__AllocaInst_Oval->addInstanceBaseClass(llvmo::UnaryInstruction_O::static_classSymbol());\nclassllvmo__BranchInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__ConstantDataArray_Oval->addInstanceBaseClass(llvmo::ConstantDataSequential_O::static_classSymbol());\nclassllvmo__Function_Oval->addInstanceBaseClass(llvmo::GlobalValue_O::static_classSymbol());\nclassllvmo__GlobalVariable_Oval->addInstanceBaseClass(llvmo::GlobalValue_O::static_classSymbol());\nclassllvmo__IndirectBrInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__InvokeInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__LoadInst_Oval->addInstanceBaseClass(llvmo::UnaryInstruction_O::static_classSymbol());\nclassllvmo__ResumeInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__ReturnInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__SwitchInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__UnreachableInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__VAArgInst_Oval->addInstanceBaseClass(llvmo::UnaryInstruction_O::static_classSymbol());\n#endif // } DEFINE_BASE_CLASSES\n#undef DEFINE_BASE_CLASSES\n#if defined(DEFINE_CLASS_NAMES) || defined(ALL_STAGES) // {\n core::Package_sp _curPkg = _lisp->findPackage(CurrentPkg);\n// Depends on nothing\n\n    classllvmo__APFloat_Oval->__setup_stage3_name(llvmo::APFloat_O::static_classSymbol());\n\n    classllvmo__APInt_Oval->__setup_stage3_name(llvmo::APInt_O::static_classSymbol());\n\n    classllvmo__Attribute_Oval->__setup_stage3_name(llvmo::Attribute_O::static_classSymbol());\n\n    classllvmo__Builder_Oval->__setup_stage3_name(llvmo::Builder_O::static_classSymbol());\n\n    classllvmo__DebugLoc_Oval->__setup_stage3_name(llvmo::DebugLoc_O::static_classSymbol());\n\n    classllvmo__EngineBuilder_Oval->__setup_stage3_name(llvmo::EngineBuilder_O::static_classSymbol());\n\n    classllvmo__ExecutionEngine_Oval->__setup_stage3_name(llvmo::ExecutionEngine_O::static_classSymbol());\n\n    classllvmo__IRBuilderBase_Oval->__setup_stage3_name(llvmo::IRBuilderBase_O::static_classSymbol());\n\n    classllvmo__InsertPoint_Oval->__setup_stage3_name(llvmo::InsertPoint_O::static_classSymbol());\n\n    classllvmo__LLVMContext_Oval->__setup_stage3_name(llvmo::LLVMContext_O::static_classSymbol());\n\n    classllvmo__Module_Oval->__setup_stage3_name(llvmo::Module_O::static_classSymbol());\n\n    classllvmo__PassManagerBase_Oval->__setup_stage3_name(llvmo::PassManagerBase_O::static_classSymbol());\n\n    classllvmo__Pass_Oval->__setup_stage3_name(llvmo::Pass_O::static_classSymbol());\n\n    classllvmo__Type_Oval->__setup_stage3_name(llvmo::Type_O::static_classSymbol());\n\n    classllvmo__Value_Oval->__setup_stage3_name(llvmo::Value_O::static_classSymbol());\n\n    classllvmo__Argument_Oval->__setup_stage3_name(llvmo::Argument_O::static_classSymbol());\n\n    classllvmo__BasicBlock_Oval->__setup_stage3_name(llvmo::BasicBlock_O::static_classSymbol());\n\n    classllvmo__CompositeType_Oval->__setup_stage3_name(llvmo::CompositeType_O::static_classSymbol());\n\n    classllvmo__FunctionPassManager_Oval->__setup_stage3_name(llvmo::FunctionPassManager_O::static_classSymbol());\n\n    classllvmo__FunctionPass_Oval->__setup_stage3_name(llvmo::FunctionPass_O::static_classSymbol());\n\n    classllvmo__FunctionType_Oval->__setup_stage3_name(llvmo::FunctionType_O::static_classSymbol());\n\n    classllvmo__IRBuilder_Oval->__setup_stage3_name(llvmo::IRBuilder_O::static_classSymbol());\n\n    classllvmo__IntegerType_Oval->__setup_stage3_name(llvmo::IntegerType_O::static_classSymbol());\n\n    classllvmo__MDNode_Oval->__setup_stage3_name(llvmo::MDNode_O::static_classSymbol());\n\n    classllvmo__MDString_Oval->__setup_stage3_name(llvmo::MDString_O::static_classSymbol());\n\n    classllvmo__ModulePass_Oval->__setup_stage3_name(llvmo::ModulePass_O::static_classSymbol());\n\n    classllvmo__User_Oval->__setup_stage3_name(llvmo::User_O::static_classSymbol());\n\n    classllvmo__Constant_Oval->__setup_stage3_name(llvmo::Constant_O::static_classSymbol());\n\n    classllvmo__ImmutablePass_Oval->__setup_stage3_name(llvmo::ImmutablePass_O::static_classSymbol());\n\n    classllvmo__Instruction_Oval->__setup_stage3_name(llvmo::Instruction_O::static_classSymbol());\n\n    classllvmo__SequentialType_Oval->__setup_stage3_name(llvmo::SequentialType_O::static_classSymbol());\n\n    classllvmo__StructType_Oval->__setup_stage3_name(llvmo::StructType_O::static_classSymbol());\n\n    classllvmo__ArrayType_Oval->__setup_stage3_name(llvmo::ArrayType_O::static_classSymbol());\n\n    classllvmo__AtomicCmpXchgInst_Oval->__setup_stage3_name(llvmo::AtomicCmpXchgInst_O::static_classSymbol());\n\n    classllvmo__AtomicRMWInst_Oval->__setup_stage3_name(llvmo::AtomicRMWInst_O::static_classSymbol());\n\n    classllvmo__CallInst_Oval->__setup_stage3_name(llvmo::CallInst_O::static_classSymbol());\n\n    classllvmo__ConstantArray_Oval->__setup_stage3_name(llvmo::ConstantArray_O::static_classSymbol());\n\n    classllvmo__ConstantDataSequential_Oval->__setup_stage3_name(llvmo::ConstantDataSequential_O::static_classSymbol());\n\n    classllvmo__ConstantExpr_Oval->__setup_stage3_name(llvmo::ConstantExpr_O::static_classSymbol());\n\n    classllvmo__ConstantFP_Oval->__setup_stage3_name(llvmo::ConstantFP_O::static_classSymbol());\n\n    classllvmo__ConstantInt_Oval->__setup_stage3_name(llvmo::ConstantInt_O::static_classSymbol());\n\n    classllvmo__ConstantPointerNull_Oval->__setup_stage3_name(llvmo::ConstantPointerNull_O::static_classSymbol());\n\n    classllvmo__DataLayout_Oval->__setup_stage3_name(llvmo::DataLayout_O::static_classSymbol());\n\n    classllvmo__FenceInst_Oval->__setup_stage3_name(llvmo::FenceInst_O::static_classSymbol());\n\n    classllvmo__GlobalValue_Oval->__setup_stage3_name(llvmo::GlobalValue_O::static_classSymbol());\n\n    classllvmo__LandingPadInst_Oval->__setup_stage3_name(llvmo::LandingPadInst_O::static_classSymbol());\n\n    classllvmo__PHINode_Oval->__setup_stage3_name(llvmo::PHINode_O::static_classSymbol());\n\n    classllvmo__PointerType_Oval->__setup_stage3_name(llvmo::PointerType_O::static_classSymbol());\n\n    classllvmo__StoreInst_Oval->__setup_stage3_name(llvmo::StoreInst_O::static_classSymbol());\n\n    classllvmo__TerminatorInst_Oval->__setup_stage3_name(llvmo::TerminatorInst_O::static_classSymbol());\n\n    classllvmo__UnaryInstruction_Oval->__setup_stage3_name(llvmo::UnaryInstruction_O::static_classSymbol());\n\n    classllvmo__UndefValue_Oval->__setup_stage3_name(llvmo::UndefValue_O::static_classSymbol());\n\n    classllvmo__VectorType_Oval->__setup_stage3_name(llvmo::VectorType_O::static_classSymbol());\n\n    classllvmo__AllocaInst_Oval->__setup_stage3_name(llvmo::AllocaInst_O::static_classSymbol());\n\n    classllvmo__BranchInst_Oval->__setup_stage3_name(llvmo::BranchInst_O::static_classSymbol());\n\n    classllvmo__ConstantDataArray_Oval->__setup_stage3_name(llvmo::ConstantDataArray_O::static_classSymbol());\n\n    classllvmo__Function_Oval->__setup_stage3_name(llvmo::Function_O::static_classSymbol());\n\n    classllvmo__GlobalVariable_Oval->__setup_stage3_name(llvmo::GlobalVariable_O::static_classSymbol());\n\n    classllvmo__IndirectBrInst_Oval->__setup_stage3_name(llvmo::IndirectBrInst_O::static_classSymbol());\n\n    classllvmo__InvokeInst_Oval->__setup_stage3_name(llvmo::InvokeInst_O::static_classSymbol());\n\n    classllvmo__LoadInst_Oval->__setup_stage3_name(llvmo::LoadInst_O::static_classSymbol());\n\n    classllvmo__ResumeInst_Oval->__setup_stage3_name(llvmo::ResumeInst_O::static_classSymbol());\n\n    classllvmo__ReturnInst_Oval->__setup_stage3_name(llvmo::ReturnInst_O::static_classSymbol());\n\n    classllvmo__SwitchInst_Oval->__setup_stage3_name(llvmo::SwitchInst_O::static_classSymbol());\n\n    classllvmo__UnreachableInst_Oval->__setup_stage3_name(llvmo::UnreachableInst_O::static_classSymbol());\n\n    classllvmo__VAArgInst_Oval->__setup_stage3_name(llvmo::VAArgInst_O::static_classSymbol());\n#endif // } DEFINE_CLASS_NAMES\n#undef DEFINE_CLASS_NAMES\n#if defined(EXPOSE_TO_CANDO) || defined(ALL_STAGES)\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__APFloat_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__APFloat_O\");\n    Register_llvmo__APFloat_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__APInt_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__APInt_O\");\n    Register_llvmo__APInt_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Attribute_O(core::Lisp_sp); // base(s): set(['core::T_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Attribute_O\");\n    Register_llvmo__Attribute_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Builder_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Builder_O\");\n    Register_llvmo__Builder_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__DebugLoc_O(core::Lisp_sp); // base(s): set(['core::T_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__DebugLoc_O\");\n    Register_llvmo__DebugLoc_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__EngineBuilder_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__EngineBuilder_O\");\n    Register_llvmo__EngineBuilder_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ExecutionEngine_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ExecutionEngine_O\");\n    Register_llvmo__ExecutionEngine_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__IRBuilderBase_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__IRBuilderBase_O\");\n    Register_llvmo__IRBuilderBase_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__InsertPoint_O(core::Lisp_sp); // base(s): set(['core::T_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__InsertPoint_O\");\n    Register_llvmo__InsertPoint_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__LLVMContext_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__LLVMContext_O\");\n    Register_llvmo__LLVMContext_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Module_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Module_O\");\n    Register_llvmo__Module_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__PassManagerBase_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__PassManagerBase_O\");\n    Register_llvmo__PassManagerBase_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Pass_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Pass_O\");\n    Register_llvmo__Pass_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Type_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Type_O\");\n    Register_llvmo__Type_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Value_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Value_O\");\n    Register_llvmo__Value_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Argument_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Argument_O\");\n    Register_llvmo__Argument_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__BasicBlock_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__BasicBlock_O\");\n    Register_llvmo__BasicBlock_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__CompositeType_O(core::Lisp_sp); // base(s): set(['llvmo::Type_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__CompositeType_O\");\n    Register_llvmo__CompositeType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__FunctionPassManager_O(core::Lisp_sp); // base(s): set(['llvmo::PassManagerBase_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__FunctionPassManager_O\");\n    Register_llvmo__FunctionPassManager_O(_lisp); // base(s): set(['llvmo::PassManagerBase_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__FunctionPass_O(core::Lisp_sp); // base(s): set(['llvmo::Pass_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__FunctionPass_O\");\n    Register_llvmo__FunctionPass_O(_lisp); // base(s): set(['llvmo::Pass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__FunctionType_O(core::Lisp_sp); // base(s): set(['llvmo::Type_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__FunctionType_O\");\n    Register_llvmo__FunctionType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__IRBuilder_O(core::Lisp_sp); // base(s): set(['llvmo::IRBuilderBase_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__IRBuilder_O\");\n    Register_llvmo__IRBuilder_O(_lisp); // base(s): set(['llvmo::IRBuilderBase_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__IntegerType_O(core::Lisp_sp); // base(s): set(['llvmo::Type_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__IntegerType_O\");\n    Register_llvmo__IntegerType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__MDNode_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__MDNode_O\");\n    Register_llvmo__MDNode_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__MDString_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__MDString_O\");\n    Register_llvmo__MDString_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ModulePass_O(core::Lisp_sp); // base(s): set(['llvmo::Pass_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ModulePass_O\");\n    Register_llvmo__ModulePass_O(_lisp); // base(s): set(['llvmo::Pass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__User_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__User_O\");\n    Register_llvmo__User_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Constant_O(core::Lisp_sp); // base(s): set(['llvmo::User_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Constant_O\");\n    Register_llvmo__Constant_O(_lisp); // base(s): set(['llvmo::User_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ImmutablePass_O(core::Lisp_sp); // base(s): set(['llvmo::ModulePass_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ImmutablePass_O\");\n    Register_llvmo__ImmutablePass_O(_lisp); // base(s): set(['llvmo::ModulePass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Instruction_O(core::Lisp_sp); // base(s): set(['llvmo::User_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Instruction_O\");\n    Register_llvmo__Instruction_O(_lisp); // base(s): set(['llvmo::User_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__SequentialType_O(core::Lisp_sp); // base(s): set(['llvmo::CompositeType_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__SequentialType_O\");\n    Register_llvmo__SequentialType_O(_lisp); // base(s): set(['llvmo::CompositeType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__StructType_O(core::Lisp_sp); // base(s): set(['llvmo::CompositeType_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__StructType_O\");\n    Register_llvmo__StructType_O(_lisp); // base(s): set(['llvmo::CompositeType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ArrayType_O(core::Lisp_sp); // base(s): set(['llvmo::SequentialType_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ArrayType_O\");\n    Register_llvmo__ArrayType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__AtomicCmpXchgInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__AtomicCmpXchgInst_O\");\n    Register_llvmo__AtomicCmpXchgInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__AtomicRMWInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__AtomicRMWInst_O\");\n    Register_llvmo__AtomicRMWInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__CallInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__CallInst_O\");\n    Register_llvmo__CallInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantArray_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantArray_O\");\n    Register_llvmo__ConstantArray_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantDataSequential_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantDataSequential_O\");\n    Register_llvmo__ConstantDataSequential_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantExpr_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantExpr_O\");\n    Register_llvmo__ConstantExpr_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantFP_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantFP_O\");\n    Register_llvmo__ConstantFP_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantInt_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantInt_O\");\n    Register_llvmo__ConstantInt_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantPointerNull_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantPointerNull_O\");\n    Register_llvmo__ConstantPointerNull_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__DataLayout_O(core::Lisp_sp); // base(s): set(['llvmo::ImmutablePass_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__DataLayout_O\");\n    Register_llvmo__DataLayout_O(_lisp); // base(s): set(['llvmo::ImmutablePass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__FenceInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__FenceInst_O\");\n    Register_llvmo__FenceInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__GlobalValue_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__GlobalValue_O\");\n    Register_llvmo__GlobalValue_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__LandingPadInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__LandingPadInst_O\");\n    Register_llvmo__LandingPadInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__PHINode_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__PHINode_O\");\n    Register_llvmo__PHINode_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__PointerType_O(core::Lisp_sp); // base(s): set(['llvmo::SequentialType_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__PointerType_O\");\n    Register_llvmo__PointerType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__StoreInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__StoreInst_O\");\n    Register_llvmo__StoreInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__TerminatorInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__TerminatorInst_O\");\n    Register_llvmo__TerminatorInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__UnaryInstruction_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__UnaryInstruction_O\");\n    Register_llvmo__UnaryInstruction_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__UndefValue_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__UndefValue_O\");\n    Register_llvmo__UndefValue_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__VectorType_O(core::Lisp_sp); // base(s): set(['llvmo::SequentialType_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__VectorType_O\");\n    Register_llvmo__VectorType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__AllocaInst_O(core::Lisp_sp); // base(s): set(['llvmo::UnaryInstruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__AllocaInst_O\");\n    Register_llvmo__AllocaInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__BranchInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__BranchInst_O\");\n    Register_llvmo__BranchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantDataArray_O(core::Lisp_sp); // base(s): set(['llvmo::ConstantDataSequential_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantDataArray_O\");\n    Register_llvmo__ConstantDataArray_O(_lisp); // base(s): set(['llvmo::ConstantDataSequential_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Function_O(core::Lisp_sp); // base(s): set(['llvmo::GlobalValue_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Function_O\");\n    Register_llvmo__Function_O(_lisp); // base(s): set(['llvmo::GlobalValue_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__GlobalVariable_O(core::Lisp_sp); // base(s): set(['llvmo::GlobalValue_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__GlobalVariable_O\");\n    Register_llvmo__GlobalVariable_O(_lisp); // base(s): set(['llvmo::GlobalValue_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__IndirectBrInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__IndirectBrInst_O\");\n    Register_llvmo__IndirectBrInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__InvokeInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__InvokeInst_O\");\n    Register_llvmo__InvokeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__LoadInst_O(core::Lisp_sp); // base(s): set(['llvmo::UnaryInstruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__LoadInst_O\");\n    Register_llvmo__LoadInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ResumeInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ResumeInst_O\");\n    Register_llvmo__ResumeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ReturnInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ReturnInst_O\");\n    Register_llvmo__ReturnInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__SwitchInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__SwitchInst_O\");\n    Register_llvmo__SwitchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__UnreachableInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__UnreachableInst_O\");\n    Register_llvmo__UnreachableInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__VAArgInst_O(core::Lisp_sp); // base(s): set(['llvmo::UnaryInstruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__VAArgInst_O\");\n    Register_llvmo__VAArgInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#endif // EXPOSE_TO_CANDO\n#undef EXPOSE_TO_CANDO\n#ifdef EXPOSE_TO_PYTHON\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__APFloat_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__APFloat_O\");\n\tCall_exposePython_llvmo__APFloat_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__APInt_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__APInt_O\");\n\tCall_exposePython_llvmo__APInt_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Attribute_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Attribute_O\");\n\tCall_exposePython_llvmo__Attribute_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Builder_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Builder_O\");\n\tCall_exposePython_llvmo__Builder_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__DebugLoc_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__DebugLoc_O\");\n\tCall_exposePython_llvmo__DebugLoc_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__EngineBuilder_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__EngineBuilder_O\");\n\tCall_exposePython_llvmo__EngineBuilder_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ExecutionEngine_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ExecutionEngine_O\");\n\tCall_exposePython_llvmo__ExecutionEngine_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__IRBuilderBase_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__IRBuilderBase_O\");\n\tCall_exposePython_llvmo__IRBuilderBase_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__InsertPoint_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__InsertPoint_O\");\n\tCall_exposePython_llvmo__InsertPoint_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__LLVMContext_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__LLVMContext_O\");\n\tCall_exposePython_llvmo__LLVMContext_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Module_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Module_O\");\n\tCall_exposePython_llvmo__Module_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__PassManagerBase_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__PassManagerBase_O\");\n\tCall_exposePython_llvmo__PassManagerBase_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Pass_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Pass_O\");\n\tCall_exposePython_llvmo__Pass_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Type_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Type_O\");\n\tCall_exposePython_llvmo__Type_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Value_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Value_O\");\n\tCall_exposePython_llvmo__Value_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Argument_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Argument_O\");\n\tCall_exposePython_llvmo__Argument_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__BasicBlock_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__BasicBlock_O\");\n\tCall_exposePython_llvmo__BasicBlock_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__CompositeType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__CompositeType_O\");\n\tCall_exposePython_llvmo__CompositeType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__FunctionPassManager_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__FunctionPassManager_O\");\n\tCall_exposePython_llvmo__FunctionPassManager_O(_lisp); // base(s): set(['llvmo::PassManagerBase_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__FunctionPass_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__FunctionPass_O\");\n\tCall_exposePython_llvmo__FunctionPass_O(_lisp); // base(s): set(['llvmo::Pass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__FunctionType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__FunctionType_O\");\n\tCall_exposePython_llvmo__FunctionType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__IRBuilder_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__IRBuilder_O\");\n\tCall_exposePython_llvmo__IRBuilder_O(_lisp); // base(s): set(['llvmo::IRBuilderBase_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__IntegerType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__IntegerType_O\");\n\tCall_exposePython_llvmo__IntegerType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__MDNode_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__MDNode_O\");\n\tCall_exposePython_llvmo__MDNode_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__MDString_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__MDString_O\");\n\tCall_exposePython_llvmo__MDString_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ModulePass_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ModulePass_O\");\n\tCall_exposePython_llvmo__ModulePass_O(_lisp); // base(s): set(['llvmo::Pass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__User_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__User_O\");\n\tCall_exposePython_llvmo__User_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Constant_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Constant_O\");\n\tCall_exposePython_llvmo__Constant_O(_lisp); // base(s): set(['llvmo::User_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ImmutablePass_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ImmutablePass_O\");\n\tCall_exposePython_llvmo__ImmutablePass_O(_lisp); // base(s): set(['llvmo::ModulePass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Instruction_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Instruction_O\");\n\tCall_exposePython_llvmo__Instruction_O(_lisp); // base(s): set(['llvmo::User_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__SequentialType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__SequentialType_O\");\n\tCall_exposePython_llvmo__SequentialType_O(_lisp); // base(s): set(['llvmo::CompositeType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__StructType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__StructType_O\");\n\tCall_exposePython_llvmo__StructType_O(_lisp); // base(s): set(['llvmo::CompositeType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ArrayType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ArrayType_O\");\n\tCall_exposePython_llvmo__ArrayType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__AtomicCmpXchgInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__AtomicCmpXchgInst_O\");\n\tCall_exposePython_llvmo__AtomicCmpXchgInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__AtomicRMWInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__AtomicRMWInst_O\");\n\tCall_exposePython_llvmo__AtomicRMWInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__CallInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__CallInst_O\");\n\tCall_exposePython_llvmo__CallInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantArray_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantArray_O\");\n\tCall_exposePython_llvmo__ConstantArray_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantDataSequential_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantDataSequential_O\");\n\tCall_exposePython_llvmo__ConstantDataSequential_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantExpr_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantExpr_O\");\n\tCall_exposePython_llvmo__ConstantExpr_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantFP_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantFP_O\");\n\tCall_exposePython_llvmo__ConstantFP_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantInt_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantInt_O\");\n\tCall_exposePython_llvmo__ConstantInt_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantPointerNull_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantPointerNull_O\");\n\tCall_exposePython_llvmo__ConstantPointerNull_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__DataLayout_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__DataLayout_O\");\n\tCall_exposePython_llvmo__DataLayout_O(_lisp); // base(s): set(['llvmo::ImmutablePass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__FenceInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__FenceInst_O\");\n\tCall_exposePython_llvmo__FenceInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__GlobalValue_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__GlobalValue_O\");\n\tCall_exposePython_llvmo__GlobalValue_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__LandingPadInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__LandingPadInst_O\");\n\tCall_exposePython_llvmo__LandingPadInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__PHINode_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__PHINode_O\");\n\tCall_exposePython_llvmo__PHINode_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__PointerType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__PointerType_O\");\n\tCall_exposePython_llvmo__PointerType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__StoreInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__StoreInst_O\");\n\tCall_exposePython_llvmo__StoreInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__TerminatorInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__TerminatorInst_O\");\n\tCall_exposePython_llvmo__TerminatorInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__UnaryInstruction_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__UnaryInstruction_O\");\n\tCall_exposePython_llvmo__UnaryInstruction_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__UndefValue_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__UndefValue_O\");\n\tCall_exposePython_llvmo__UndefValue_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__VectorType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__VectorType_O\");\n\tCall_exposePython_llvmo__VectorType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__AllocaInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__AllocaInst_O\");\n\tCall_exposePython_llvmo__AllocaInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__BranchInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__BranchInst_O\");\n\tCall_exposePython_llvmo__BranchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantDataArray_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantDataArray_O\");\n\tCall_exposePython_llvmo__ConstantDataArray_O(_lisp); // base(s): set(['llvmo::ConstantDataSequential_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Function_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Function_O\");\n\tCall_exposePython_llvmo__Function_O(_lisp); // base(s): set(['llvmo::GlobalValue_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__GlobalVariable_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__GlobalVariable_O\");\n\tCall_exposePython_llvmo__GlobalVariable_O(_lisp); // base(s): set(['llvmo::GlobalValue_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__IndirectBrInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__IndirectBrInst_O\");\n\tCall_exposePython_llvmo__IndirectBrInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__InvokeInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__InvokeInst_O\");\n\tCall_exposePython_llvmo__InvokeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__LoadInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__LoadInst_O\");\n\tCall_exposePython_llvmo__LoadInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ResumeInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ResumeInst_O\");\n\tCall_exposePython_llvmo__ResumeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ReturnInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ReturnInst_O\");\n\tCall_exposePython_llvmo__ReturnInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__SwitchInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__SwitchInst_O\");\n\tCall_exposePython_llvmo__SwitchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__UnreachableInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__UnreachableInst_O\");\n\tCall_exposePython_llvmo__UnreachableInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__VAArgInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__VAArgInst_O\");\n\tCall_exposePython_llvmo__VAArgInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#endif // EXPOSE_TO_PYTHON\n#undef EXPOSE_TO_PYTHON\n#undef ALL_STAGES\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/instances.inc",
    "content": "#include \"QPBO.h\"\n\n#ifdef _MSC_VER\n#pragma warning(disable: 4661)\n#endif\n\n// Instantiations\n\ntemplate class QPBO<int>;\ntemplate class QPBO<float>;\ntemplate class QPBO<double>;\n\ntemplate <> \n\tinline void QPBO<int>::get_type_information(char*& type_name, char*& type_format)\n{\n\ttype_name = \"int\";\n\ttype_format = \"d\";\n}\n\ntemplate <> \n\tinline void QPBO<float>::get_type_information(char*& type_name, char*& type_format)\n{\n\ttype_name = \"float\";\n\ttype_format = \"f\";\n}\n\ntemplate <> \n\tinline void QPBO<double>::get_type_information(char*& type_name, char*& type_format)\n{\n\ttype_name = \"double\";\n\ttype_format = \"Lf\";\n}\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/json_reader.cpp",
    "content": "// Copyright 2007-2010 Baptiste Lepilleur\n// Distributed under MIT license, or public domain if desired and\n// recognized in your jurisdiction.\n// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE\n\n/*\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Source - https://github.com/Ij888/ApacheCordovaRecipes/blob/6e8a2c1d9de7302f74bc3dbac54a021f0499bbb3/jqmsandbox/plugins/cordova-plugin-globalization/src/blackberry10/native/public/json_reader.cpp\n\n#include <json/reader.h>\n#include <json/value.h>\n#include <utility>\n#include <cstdio>\n#include <cassert>\n#include <cstring>\n#include <iostream>\n#include <stdexcept>\n\n#if _MSC_VER >= 1400 // VC++ 8.0\n#pragma warning( disable : 4996 )   // disable warning about strdup being deprecated.\n#endif\n\nnamespace Json {\n\n// QNX is strict about declaring C symbols in the std namespace.\n#ifdef __QNXNTO__\nusing std::memcpy;\nusing std::sprintf;\nusing std::sscanf;\n#endif\n\n// Implementation of class Features\n// ////////////////////////////////\n\nFeatures::Features()\n   : allowComments_( true )\n   , strictRoot_( false )\n{\n}\n\n\nFeatures \nFeatures::all()\n{\n   return Features();\n}\n\n\nFeatures \nFeatures::strictMode()\n{\n   Features features;\n   features.allowComments_ = false;\n   features.strictRoot_ = true;\n   return features;\n}\n\n// Implementation of class Reader\n// ////////////////////////////////\n\n\nstatic inline bool \nin( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 )\n{\n   return c == c1  ||  c == c2  ||  c == c3  ||  c == c4;\n}\n\nstatic inline bool \nin( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 )\n{\n   return c == c1  ||  c == c2  ||  c == c3  ||  c == c4  ||  c == c5;\n}\n\n\nstatic bool \ncontainsNewLine( Reader::Location begin, \n                 Reader::Location end )\n{\n   for ( ;begin < end; ++begin )\n      if ( *begin == '\\n'  ||  *begin == '\\r' )\n         return true;\n   return false;\n}\n\nstatic std::string codePointToUTF8(unsigned int cp)\n{\n   std::string result;\n   \n   // based on description from http://en.wikipedia.org/wiki/UTF-8\n\n   if (cp <= 0x7f) \n   {\n      result.resize(1);\n      result[0] = static_cast<char>(cp);\n   } \n   else if (cp <= 0x7FF) \n   {\n      result.resize(2);\n      result[1] = static_cast<char>(0x80 | (0x3f & cp));\n      result[0] = static_cast<char>(0xC0 | (0x1f & (cp >> 6)));\n   } \n   else if (cp <= 0xFFFF) \n   {\n      result.resize(3);\n      result[2] = static_cast<char>(0x80 | (0x3f & cp));\n      result[1] = 0x80 | static_cast<char>((0x3f & (cp >> 6)));\n      result[0] = 0xE0 | static_cast<char>((0xf & (cp >> 12)));\n   }\n   else if (cp <= 0x10FFFF) \n   {\n      result.resize(4);\n      result[3] = static_cast<char>(0x80 | (0x3f & cp));\n      result[2] = static_cast<char>(0x80 | (0x3f & (cp >> 6)));\n      result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 12)));\n      result[0] = static_cast<char>(0xF0 | (0x7 & (cp >> 18)));\n   }\n\n   return result;\n}\n\n\n// Class Reader\n// //////////////////////////////////////////////////////////////////\n\nReader::Reader()\n   : features_( Features::all() )\n{\n}\n\n\nReader::Reader( const Features &features )\n   : features_( features )\n{\n}\n\n\nbool\nReader::parse( const std::string &document, \n               Value &root,\n               bool collectComments )\n{\n   document_ = document;\n   const char *begin = document_.c_str();\n   const char *end = begin + document_.length();\n   return parse( begin, end, root, collectComments );\n}\n\n\nbool\nReader::parse( std::istream& sin,\n               Value &root,\n               bool collectComments )\n{\n   //std::istream_iterator<char> begin(sin);\n   //std::istream_iterator<char> end;\n   // Those would allow streamed input from a file, if parse() were a\n   // template function.\n\n   // Since std::string is reference-counted, this at least does not\n   // create an extra copy.\n   std::string doc;\n   std::getline(sin, doc, (char)EOF);\n   return parse( doc, root, collectComments );\n}\n\nbool \nReader::parse( const char *beginDoc, const char *endDoc, \n               Value &root,\n               bool collectComments )\n{\n   if ( !features_.allowComments_ )\n   {\n      collectComments = false;\n   }\n\n   begin_ = beginDoc;\n   end_ = endDoc;\n   collectComments_ = collectComments;\n   current_ = begin_;\n   lastValueEnd_ = 0;\n   lastValue_ = 0;\n   commentsBefore_ = \"\";\n   errors_.clear();\n   while ( !nodes_.empty() )\n      nodes_.pop();\n   nodes_.push( &root );\n   \n   bool successful = readValue();\n   Token token;\n   skipCommentTokens( token );\n   if ( collectComments_  &&  !commentsBefore_.empty() )\n      root.setComment( commentsBefore_, commentAfter );\n   if ( features_.strictRoot_ )\n   {\n      if ( !root.isArray()  &&  !root.isObject() )\n      {\n         // Set error location to start of doc, ideally should be first token found in doc\n         token.type_ = tokenError;\n         token.start_ = beginDoc;\n         token.end_ = endDoc;\n         addError( \"A valid JSON document must be either an array or an object value.\",\n                   token );\n         return false;\n      }\n   }\n   return successful;\n}\n\n\nbool\nReader::readValue()\n{\n   Token token;\n   skipCommentTokens( token );\n   bool successful = true;\n\n   if ( collectComments_  &&  !commentsBefore_.empty() )\n   {\n      currentValue().setComment( commentsBefore_, commentBefore );\n      commentsBefore_ = \"\";\n   }\n\n\n   switch ( token.type_ )\n   {\n   case tokenObjectBegin:\n      successful = readObject( token );\n      break;\n   case tokenArrayBegin:\n      successful = readArray( token );\n      break;\n   case tokenNumber:\n      successful = decodeNumber( token );\n      break;\n   case tokenString:\n      successful = decodeString( token );\n      break;\n   case tokenTrue:\n      currentValue() = true;\n      break;\n   case tokenFalse:\n      currentValue() = false;\n      break;\n   case tokenNull:\n      currentValue() = Value();\n      break;\n   default:\n      return addError( \"Syntax error: value, object or array expected.\", token );\n   }\n\n   if ( collectComments_ )\n   {\n      lastValueEnd_ = current_;\n      lastValue_ = &currentValue();\n   }\n\n   return successful;\n}\n\n\nvoid \nReader::skipCommentTokens( Token &token )\n{\n   if ( features_.allowComments_ )\n   {\n      do\n      {\n         readToken( token );\n      }\n      while ( token.type_ == tokenComment );\n   }\n   else\n   {\n      readToken( token );\n   }\n}\n\n\nbool \nReader::expectToken( TokenType type, Token &token, const char *message )\n{\n   readToken( token );\n   if ( token.type_ != type )\n      return addError( message, token );\n   return true;\n}\n\n\nbool \nReader::readToken( Token &token )\n{\n   skipSpaces();\n   token.start_ = current_;\n   Char c = getNextChar();\n   bool ok = true;\n   switch ( c )\n   {\n   case '{':\n      token.type_ = tokenObjectBegin;\n      break;\n   case '}':\n      token.type_ = tokenObjectEnd;\n      break;\n   case '[':\n      token.type_ = tokenArrayBegin;\n      break;\n   case ']':\n      token.type_ = tokenArrayEnd;\n      break;\n   case '\"':\n      token.type_ = tokenString;\n      ok = readString();\n      break;\n   case '/':\n      token.type_ = tokenComment;\n      ok = readComment();\n      break;\n   case '0':\n   case '1':\n   case '2':\n   case '3':\n   case '4':\n   case '5':\n   case '6':\n   case '7':\n   case '8':\n   case '9':\n   case '-':\n      token.type_ = tokenNumber;\n      readNumber();\n      break;\n   case 't':\n      token.type_ = tokenTrue;\n      ok = match( \"rue\", 3 );\n      break;\n   case 'f':\n      token.type_ = tokenFalse;\n      ok = match( \"alse\", 4 );\n      break;\n   case 'n':\n      token.type_ = tokenNull;\n      ok = match( \"ull\", 3 );\n      break;\n   case ',':\n      token.type_ = tokenArraySeparator;\n      break;\n   case ':':\n      token.type_ = tokenMemberSeparator;\n      break;\n   case 0:\n      token.type_ = tokenEndOfStream;\n      break;\n   default:\n      ok = false;\n      break;\n   }\n   if ( !ok )\n      token.type_ = tokenError;\n   token.end_ = current_;\n   return true;\n}\n\n\nvoid \nReader::skipSpaces()\n{\n   while ( current_ != end_ )\n   {\n      Char c = *current_;\n      if ( c == ' '  ||  c == '\\t'  ||  c == '\\r'  ||  c == '\\n' )\n         ++current_;\n      else\n         break;\n   }\n}\n\n\nbool \nReader::match( Location pattern, \n               int patternLength )\n{\n   if ( end_ - current_ < patternLength )\n      return false;\n   int index = patternLength;\n   while ( index-- )\n      if ( current_[index] != pattern[index] )\n         return false;\n   current_ += patternLength;\n   return true;\n}\n\n\nbool\nReader::readComment()\n{\n   Location commentBegin = current_ - 1;\n   Char c = getNextChar();\n   bool successful = false;\n   if ( c == '*' )\n      successful = readCStyleComment();\n   else if ( c == '/' )\n      successful = readCppStyleComment();\n   if ( !successful )\n      return false;\n\n   if ( collectComments_ )\n   {\n      CommentPlacement placement = commentBefore;\n      if ( lastValueEnd_  &&  !containsNewLine( lastValueEnd_, commentBegin ) )\n      {\n         if ( c != '*'  ||  !containsNewLine( commentBegin, current_ ) )\n            placement = commentAfterOnSameLine;\n      }\n\n      addComment( commentBegin, current_, placement );\n   }\n   return true;\n}\n\n\nvoid \nReader::addComment( Location begin, \n                    Location end, \n                    CommentPlacement placement )\n{\n   assert( collectComments_ );\n   if ( placement == commentAfterOnSameLine )\n   {\n      assert( lastValue_ != 0 );\n      lastValue_->setComment( std::string( begin, end ), placement );\n   }\n   else\n   {\n      if ( !commentsBefore_.empty() )\n         commentsBefore_ += \"\\n\";\n      commentsBefore_ += std::string( begin, end );\n   }\n}\n\n\nbool \nReader::readCStyleComment()\n{\n   while ( current_ != end_ )\n   {\n      Char c = getNextChar();\n      if ( c == '*'  &&  *current_ == '/' )\n         break;\n   }\n   return getNextChar() == '/';\n}\n\n\nbool \nReader::readCppStyleComment()\n{\n   while ( current_ != end_ )\n   {\n      Char c = getNextChar();\n      if (  c == '\\r'  ||  c == '\\n' )\n         break;\n   }\n   return true;\n}\n\n\nvoid \nReader::readNumber()\n{\n   while ( current_ != end_ )\n   {\n      if ( !(*current_ >= '0'  &&  *current_ <= '9')  &&\n           !in( *current_, '.', 'e', 'E', '+', '-' ) )\n         break;\n      ++current_;\n   }\n}\n\nbool\nReader::readString()\n{\n   Char c = 0;\n   while ( current_ != end_ )\n   {\n      c = getNextChar();\n      if ( c == '\\\\' )\n         getNextChar();\n      else if ( c == '\"' )\n         break;\n   }\n   return c == '\"';\n}\n\n\nbool \nReader::readObject( Token &tokenStart )\n{\n   Token tokenName;\n   std::string name;\n   currentValue() = Value( objectValue );\n   while ( readToken( tokenName ) )\n   {\n      bool initialTokenOk = true;\n      while ( tokenName.type_ == tokenComment  &&  initialTokenOk )\n         initialTokenOk = readToken( tokenName );\n      if  ( !initialTokenOk )\n         break;\n      if ( tokenName.type_ == tokenObjectEnd  &&  name.empty() )  // empty object\n         return true;\n      if ( tokenName.type_ != tokenString )\n         break;\n      \n      name = \"\";\n      if ( !decodeString( tokenName, name ) )\n         return recoverFromError( tokenObjectEnd );\n\n      Token colon;\n      if ( !readToken( colon ) ||  colon.type_ != tokenMemberSeparator )\n      {\n         return addErrorAndRecover( \"Missing ':' after object member name\", \n                                    colon, \n                                    tokenObjectEnd );\n      }\n      Value &value = currentValue()[ name ];\n      nodes_.push( &value );\n      bool ok = readValue();\n      nodes_.pop();\n      if ( !ok ) // error already set\n         return recoverFromError( tokenObjectEnd );\n\n      Token comma;\n      if ( !readToken( comma )\n            ||  ( comma.type_ != tokenObjectEnd  &&  \n                  comma.type_ != tokenArraySeparator &&\n\t\t  comma.type_ != tokenComment ) )\n      {\n         return addErrorAndRecover( \"Missing ',' or '}' in object declaration\", \n                                    comma, \n                                    tokenObjectEnd );\n      }\n      bool finalizeTokenOk = true;\n      while ( comma.type_ == tokenComment &&\n              finalizeTokenOk )\n         finalizeTokenOk = readToken( comma );\n      if ( comma.type_ == tokenObjectEnd )\n         return true;\n   }\n   return addErrorAndRecover( \"Missing '}' or object member name\", \n                              tokenName, \n                              tokenObjectEnd );\n}\n\n\nbool \nReader::readArray( Token &tokenStart )\n{\n   currentValue() = Value( arrayValue );\n   skipSpaces();\n   if ( *current_ == ']' ) // empty array\n   {\n      Token endArray;\n      readToken( endArray );\n      return true;\n   }\n   int index = 0;\n   while ( true )\n   {\n      Value &value = currentValue()[ index++ ];\n      nodes_.push( &value );\n      bool ok = readValue();\n      nodes_.pop();\n      if ( !ok ) // error already set\n         return recoverFromError( tokenArrayEnd );\n\n      Token token;\n      // Accept Comment after last item in the array.\n      ok = readToken( token );\n      while ( token.type_ == tokenComment  &&  ok )\n      {\n         ok = readToken( token );\n      }\n      bool badTokenType = ( token.type_ == tokenArraySeparator  &&  \n                            token.type_ == tokenArrayEnd );\n      if ( !ok  ||  badTokenType )\n      {\n         return addErrorAndRecover( \"Missing ',' or ']' in array declaration\", \n                                    token, \n                                    tokenArrayEnd );\n      }\n      if ( token.type_ == tokenArrayEnd )\n         break;\n   }\n   return true;\n}\n\n\nbool \nReader::decodeNumber( Token &token )\n{\n   bool isDouble = false;\n   for ( Location inspect = token.start_; inspect != token.end_; ++inspect )\n   {\n      isDouble = isDouble  \n                 ||  in( *inspect, '.', 'e', 'E', '+' )  \n                 ||  ( *inspect == '-'  &&  inspect != token.start_ );\n   }\n   if ( isDouble )\n      return decodeDouble( token );\n   Location current = token.start_;\n   bool isNegative = *current == '-';\n   if ( isNegative )\n      ++current;\n   Value::UInt threshold = (isNegative ? Value::UInt(-Value::minInt) \n                                       : Value::maxUInt) / 10;\n   Value::UInt value = 0;\n   while ( current < token.end_ )\n   {\n      Char c = *current++;\n      if ( c < '0'  ||  c > '9' )\n         return addError( \"'\" + std::string( token.start_, token.end_ ) + \"' is not a number.\", token );\n      if ( value >= threshold )\n         return decodeDouble( token );\n      value = value * 10 + Value::UInt(c - '0');\n   }\n   if ( isNegative )\n      currentValue() = -Value::Int( value );\n   else if ( value <= Value::UInt(Value::maxInt) )\n      currentValue() = Value::Int( value );\n   else\n      currentValue() = value;\n   return true;\n}\n\n\nbool \nReader::decodeDouble( Token &token )\n{\n   double value = 0;\n   const int bufferSize = 32;\n   int count;\n   int length = int(token.end_ - token.start_);\n   if ( length <= bufferSize )\n   {\n      Char buffer[bufferSize];\n      memcpy( buffer, token.start_, length );\n      buffer[length] = 0;\n      count = sscanf( buffer, \"%lf\", &value );\n   }\n   else\n   {\n      std::string buffer( token.start_, token.end_ );\n      count = sscanf( buffer.c_str(), \"%lf\", &value );\n   }\n\n   if ( count != 1 )\n      return addError( \"'\" + std::string( token.start_, token.end_ ) + \"' is not a number.\", token );\n   currentValue() = value;\n   return true;\n}\n\n\nbool \nReader::decodeString( Token &token )\n{\n   std::string decoded;\n   if ( !decodeString( token, decoded ) )\n      return false;\n   currentValue() = decoded;\n   return true;\n}\n\n\nbool \nReader::decodeString( Token &token, std::string &decoded )\n{\n   decoded.reserve( token.end_ - token.start_ - 2 );\n   Location current = token.start_ + 1; // skip '\"'\n   Location end = token.end_ - 1;      // do not include '\"'\n   while ( current != end )\n   {\n      Char c = *current++;\n      if ( c == '\"' )\n         break;\n      else if ( c == '\\\\' )\n      {\n         if ( current == end )\n            return addError( \"Empty escape sequence in string\", token, current );\n         Char escape = *current++;\n         switch ( escape )\n         {\n         case '\"': decoded += '\"'; break;\n         case '/': decoded += '/'; break;\n         case '\\\\': decoded += '\\\\'; break;\n         case 'b': decoded += '\\b'; break;\n         case 'f': decoded += '\\f'; break;\n         case 'n': decoded += '\\n'; break;\n         case 'r': decoded += '\\r'; break;\n         case 't': decoded += '\\t'; break;\n         case 'u':\n            {\n               unsigned int unicode;\n               if ( !decodeUnicodeCodePoint( token, current, end, unicode ) )\n                  return false;\n               decoded += codePointToUTF8(unicode);\n            }\n            break;\n         default:\n            return addError( \"Bad escape sequence in string\", token, current );\n         }\n      }\n      else\n      {\n         decoded += c;\n      }\n   }\n   return true;\n}\n\nbool\nReader::decodeUnicodeCodePoint( Token &token, \n                                     Location &current, \n                                     Location end, \n                                     unsigned int &unicode )\n{\n\n   if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) )\n      return false;\n   if (unicode >= 0xD800 && unicode <= 0xDBFF)\n   {\n      // surrogate pairs\n      if (end - current < 6)\n         return addError( \"additional six characters expected to parse unicode surrogate pair.\", token, current );\n      unsigned int surrogatePair;\n      if (*(current++) == '\\\\' && *(current++)== 'u')\n      {\n         if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair ))\n         {\n            unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);\n         } \n         else\n            return false;\n      } \n      else\n         return addError( \"expecting another \\\\u token to begin the second half of a unicode surrogate pair\", token, current );\n   }\n   return true;\n}\n\nbool \nReader::decodeUnicodeEscapeSequence( Token &token, \n                                     Location &current, \n                                     Location end, \n                                     unsigned int &unicode )\n{\n   if ( end - current < 4 )\n      return addError( \"Bad unicode escape sequence in string: four digits expected.\", token, current );\n   unicode = 0;\n   for ( int index =0; index < 4; ++index )\n   {\n      Char c = *current++;\n      unicode *= 16;\n      if ( c >= '0'  &&  c <= '9' )\n         unicode += c - '0';\n      else if ( c >= 'a'  &&  c <= 'f' )\n         unicode += c - 'a' + 10;\n      else if ( c >= 'A'  &&  c <= 'F' )\n         unicode += c - 'A' + 10;\n      else\n         return addError( \"Bad unicode escape sequence in string: hexadecimal digit expected.\", token, current );\n   }\n   return true;\n}\n\n\nbool \nReader::addError( const std::string &message, \n                  Token &token,\n                  Location extra )\n{\n   ErrorInfo info;\n   info.token_ = token;\n   info.message_ = message;\n   info.extra_ = extra;\n   errors_.push_back( info );\n   return false;\n}\n\n\nbool \nReader::recoverFromError( TokenType skipUntilToken )\n{\n   int errorCount = int(errors_.size());\n   Token skip;\n   while ( true )\n   {\n      if ( !readToken(skip) )\n         errors_.resize( errorCount ); // discard errors caused by recovery\n      if ( skip.type_ == skipUntilToken  ||  skip.type_ == tokenEndOfStream )\n         break;\n   }\n   errors_.resize( errorCount );\n   return false;\n}\n\n\nbool \nReader::addErrorAndRecover( const std::string &message, \n                            Token &token,\n                            TokenType skipUntilToken )\n{\n   addError( message, token );\n   return recoverFromError( skipUntilToken );\n}\n\n\nValue &\nReader::currentValue()\n{\n   return *(nodes_.top());\n}\n\n\nReader::Char \nReader::getNextChar()\n{\n   if ( current_ == end_ )\n      return 0;\n   return *current_++;\n}\n\n\nvoid \nReader::getLocationLineAndColumn( Location location,\n                                  int &line,\n                                  int &column ) const\n{\n   Location current = begin_;\n   Location lastLineStart = current;\n   line = 0;\n   while ( current < location  &&  current != end_ )\n   {\n      Char c = *current++;\n      if ( c == '\\r' )\n      {\n         if ( *current == '\\n' )\n            ++current;\n         lastLineStart = current;\n         ++line;\n      }\n      else if ( c == '\\n' )\n      {\n         lastLineStart = current;\n         ++line;\n      }\n   }\n   // column & line start at 1\n   column = int(location - lastLineStart) + 1;\n   ++line;\n}\n\n\nstd::string\nReader::getLocationLineAndColumn( Location location ) const\n{\n   int line, column;\n   getLocationLineAndColumn( location, line, column );\n   char buffer[18+16+16+1];\n   sprintf( buffer, \"Line %d, Column %d\", line, column );\n   return buffer;\n}\n\n\nstd::string \nReader::getFormatedErrorMessages() const\n{\n   std::string formattedMessage;\n   for ( Errors::const_iterator itError = errors_.begin();\n         itError != errors_.end();\n         ++itError )\n   {\n      const ErrorInfo &error = *itError;\n      formattedMessage += \"* \" + getLocationLineAndColumn( error.token_.start_ ) + \"\\n\";\n      formattedMessage += \"  \" + error.message_ + \"\\n\";\n      if ( error.extra_ )\n         formattedMessage += \"See \" + getLocationLineAndColumn( error.extra_ ) + \" for detail.\\n\";\n   }\n   return formattedMessage;\n}\n\n\nstd::istream& operator>>( std::istream &sin, Value &root )\n{\n    Json::Reader reader;\n    bool ok = reader.parse(sin, root, true);\n    //JSON_ASSERT( ok );\n    if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages());\n    return sin;\n}\n\n\n} // namespace Json\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/json_writer.cpp",
    "content": "// Copyright 2007-2010 Baptiste Lepilleur\n// Distributed under MIT license, or public domain if desired and\n// recognized in your jurisdiction.\n// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE\n\n/*\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Source - https://github.com/Ij888/ApacheCordovaRecipes/blob/6e8a2c1d9de7302f74bc3dbac54a021f0499bbb3/jqmsandbox/plugins/cordova-plugin-globalization/src/blackberry10/native/public/json_writer.cpp\n\n#include <json/writer.h>\n#include <utility>\n#include <assert.h>\n#include <stdio.h>\n#include <string.h>\n#include <iostream>\n#include <sstream>\n#include <iomanip>\n\n#if _MSC_VER >= 1400 // VC++ 8.0\n#pragma warning( disable : 4996 )   // disable warning about strdup being deprecated.\n#endif\n\nnamespace Json {\n\nstatic bool isControlCharacter(char ch)\n{\n   return ch > 0 && ch <= 0x1F;\n}\n\nstatic bool containsControlCharacter( const char* str )\n{\n   while ( *str ) \n   {\n      if ( isControlCharacter( *(str++) ) )\n         return true;\n   }\n   return false;\n}\nstatic void uintToString( unsigned int value, \n                          char *&current )\n{\n   *--current = 0;\n   do\n   {\n      *--current = (value % 10) + '0';\n      value /= 10;\n   }\n   while ( value != 0 );\n}\n\nstd::string valueToString( Int value )\n{\n   char buffer[32];\n   char *current = buffer + sizeof(buffer);\n   bool isNegative = value < 0;\n   if ( isNegative )\n      value = -value;\n   uintToString( UInt(value), current );\n   if ( isNegative )\n      *--current = '-';\n   assert( current >= buffer );\n   return current;\n}\n\n\nstd::string valueToString( UInt value )\n{\n   char buffer[32];\n   char *current = buffer + sizeof(buffer);\n   uintToString( value, current );\n   assert( current >= buffer );\n   return current;\n}\n\nstd::string valueToString( double value )\n{\n   char buffer[32];\n#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning. \n   sprintf_s(buffer, sizeof(buffer), \"%#.16g\", value); \n#else\t\n   sprintf(buffer, \"%#.16g\", value); \n#endif\n   char* ch = buffer + strlen(buffer) - 1;\n   if (*ch != '0') return buffer; // nothing to truncate, so save time\n   while(ch > buffer && *ch == '0'){\n     --ch;\n   }\n   char* last_nonzero = ch;\n   while(ch >= buffer){\n     switch(*ch){\n     case '0':\n     case '1':\n     case '2':\n     case '3':\n     case '4':\n     case '5':\n     case '6':\n     case '7':\n     case '8':\n     case '9':\n       --ch;\n       continue;\n     case '.':\n       // Truncate zeroes to save bytes in output, but keep one.\n       *(last_nonzero+2) = '\\0';\n       return buffer;\n     default:\n       return buffer;\n     }\n   }\n   return buffer;\n}\n\n\nstd::string valueToString( bool value )\n{\n   return value ? \"true\" : \"false\";\n}\n\nstd::string valueToQuotedString( const char *value )\n{\n   // Not sure how to handle unicode...\n   if (strpbrk(value, \"\\\"\\\\\\b\\f\\n\\r\\t\") == NULL && !containsControlCharacter( value ))\n      return std::string(\"\\\"\") + value + \"\\\"\";\n   // We have to walk value and escape any special characters.\n   // Appending to std::string is not efficient, but this should be rare.\n   // (Note: forward slashes are *not* rare, but I am not escaping them.)\n   unsigned maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL\n   std::string result;\n   result.reserve(maxsize); // to avoid lots of mallocs\n   result += \"\\\"\";\n   for (const char* c=value; *c != 0; ++c)\n   {\n      switch(*c)\n      {\n         case '\\\"':\n            result += \"\\\\\\\"\";\n            break;\n         case '\\\\':\n            result += \"\\\\\\\\\";\n            break;\n         case '\\b':\n            result += \"\\\\b\";\n            break;\n         case '\\f':\n            result += \"\\\\f\";\n            break;\n         case '\\n':\n            result += \"\\\\n\";\n            break;\n         case '\\r':\n            result += \"\\\\r\";\n            break;\n         case '\\t':\n            result += \"\\\\t\";\n            break;\n         //case '/':\n            // Even though \\/ is considered a legal escape in JSON, a bare\n            // slash is also legal, so I see no reason to escape it.\n            // (I hope I am not misunderstanding something.\n            // blep notes: actually escaping \\/ may be useful in javascript to avoid </ \n            // sequence.\n            // Should add a flag to allow this compatibility mode and prevent this \n            // sequence from occurring.\n         default:\n            if ( isControlCharacter( *c ) )\n            {\n               std::ostringstream oss;\n               oss << \"\\\\u\" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << static_cast<int>(*c);\n               result += oss.str();\n            }\n            else\n            {\n               result += *c;\n            }\n            break;\n      }\n   }\n   result += \"\\\"\";\n   return result;\n}\n\n// Class Writer\n// //////////////////////////////////////////////////////////////////\nWriter::~Writer()\n{\n}\n\n\n// Class FastWriter\n// //////////////////////////////////////////////////////////////////\n\nFastWriter::FastWriter()\n   : yamlCompatiblityEnabled_( false )\n{\n}\n\n\nvoid \nFastWriter::enableYAMLCompatibility()\n{\n   yamlCompatiblityEnabled_ = true;\n}\n\n\nstd::string \nFastWriter::write( const Value &root )\n{\n   document_ = \"\";\n   writeValue( root );\n   document_ += \"\\n\";\n   return document_;\n}\n\n\nvoid \nFastWriter::writeValue( const Value &value )\n{\n   switch ( value.type() )\n   {\n   case nullValue:\n      document_ += \"null\";\n      break;\n   case intValue:\n      document_ += valueToString( value.asInt() );\n      break;\n   case uintValue:\n      document_ += valueToString( value.asUInt() );\n      break;\n   case realValue:\n      document_ += valueToString( value.asDouble() );\n      break;\n   case stringValue:\n      document_ += valueToQuotedString( value.asCString() );\n      break;\n   case booleanValue:\n      document_ += valueToString( value.asBool() );\n      break;\n   case arrayValue:\n      {\n         document_ += \"[\";\n         int size = value.size();\n         for ( int index =0; index < size; ++index )\n         {\n            if ( index > 0 )\n               document_ += \",\";\n            writeValue( value[index] );\n         }\n         document_ += \"]\";\n      }\n      break;\n   case objectValue:\n      {\n         Value::Members members( value.getMemberNames() );\n         document_ += \"{\";\n         for ( Value::Members::iterator it = members.begin(); \n               it != members.end(); \n               ++it )\n         {\n            const std::string &name = *it;\n            if ( it != members.begin() )\n               document_ += \",\";\n            document_ += valueToQuotedString( name.c_str() );\n            document_ += yamlCompatiblityEnabled_ ? \": \" \n                                                  : \":\";\n            writeValue( value[name] );\n         }\n         document_ += \"}\";\n      }\n      break;\n   }\n}\n\n\n// Class StyledWriter\n// //////////////////////////////////////////////////////////////////\n\nStyledWriter::StyledWriter()\n   : rightMargin_( 74 )\n   , indentSize_( 3 )\n{\n}\n\n\nstd::string \nStyledWriter::write( const Value &root )\n{\n   document_ = \"\";\n   addChildValues_ = false;\n   indentString_ = \"\";\n   writeCommentBeforeValue( root );\n   writeValue( root );\n   writeCommentAfterValueOnSameLine( root );\n   document_ += \"\\n\";\n   return document_;\n}\n\n\nvoid \nStyledWriter::writeValue( const Value &value )\n{\n   switch ( value.type() )\n   {\n   case nullValue:\n      pushValue( \"null\" );\n      break;\n   case intValue:\n      pushValue( valueToString( value.asInt() ) );\n      break;\n   case uintValue:\n      pushValue( valueToString( value.asUInt() ) );\n      break;\n   case realValue:\n      pushValue( valueToString( value.asDouble() ) );\n      break;\n   case stringValue:\n      pushValue( valueToQuotedString( value.asCString() ) );\n      break;\n   case booleanValue:\n      pushValue( valueToString( value.asBool() ) );\n      break;\n   case arrayValue:\n      writeArrayValue( value);\n      break;\n   case objectValue:\n      {\n         Value::Members members( value.getMemberNames() );\n         if ( members.empty() )\n            pushValue( \"{}\" );\n         else\n         {\n            writeWithIndent( \"{\" );\n            indent();\n            Value::Members::iterator it = members.begin();\n            while ( true )\n            {\n               const std::string &name = *it;\n               const Value &childValue = value[name];\n               writeCommentBeforeValue( childValue );\n               writeWithIndent( valueToQuotedString( name.c_str() ) );\n               document_ += \" : \";\n               writeValue( childValue );\n               if ( ++it == members.end() )\n               {\n                  writeCommentAfterValueOnSameLine( childValue );\n                  break;\n               }\n               document_ += \",\";\n               writeCommentAfterValueOnSameLine( childValue );\n            }\n            unindent();\n            writeWithIndent( \"}\" );\n         }\n      }\n      break;\n   }\n}\n\n\nvoid \nStyledWriter::writeArrayValue( const Value &value )\n{\n   unsigned size = value.size();\n   if ( size == 0 )\n      pushValue( \"[]\" );\n   else\n   {\n      bool isArrayMultiLine = isMultineArray( value );\n      if ( isArrayMultiLine )\n      {\n         writeWithIndent( \"[\" );\n         indent();\n         bool hasChildValue = !childValues_.empty();\n         unsigned index =0;\n         while ( true )\n         {\n            const Value &childValue = value[index];\n            writeCommentBeforeValue( childValue );\n            if ( hasChildValue )\n               writeWithIndent( childValues_[index] );\n            else\n            {\n               writeIndent();\n               writeValue( childValue );\n            }\n            if ( ++index == size )\n            {\n               writeCommentAfterValueOnSameLine( childValue );\n               break;\n            }\n            document_ += \",\";\n            writeCommentAfterValueOnSameLine( childValue );\n         }\n         unindent();\n         writeWithIndent( \"]\" );\n      }\n      else // output on a single line\n      {\n         assert( childValues_.size() == size );\n         document_ += \"[ \";\n         for ( unsigned index =0; index < size; ++index )\n         {\n            if ( index > 0 )\n               document_ += \", \";\n            document_ += childValues_[index];\n         }\n         document_ += \" ]\";\n      }\n   }\n}\n\n\nbool \nStyledWriter::isMultineArray( const Value &value )\n{\n   int size = value.size();\n   bool isMultiLine = size*3 >= rightMargin_ ;\n   childValues_.clear();\n   for ( int index =0; index < size  &&  !isMultiLine; ++index )\n   {\n      const Value &childValue = value[index];\n      isMultiLine = isMultiLine  ||\n                     ( (childValue.isArray()  ||  childValue.isObject())  &&  \n                        childValue.size() > 0 );\n   }\n   if ( !isMultiLine ) // check if line length > max line length\n   {\n      childValues_.reserve( size );\n      addChildValues_ = true;\n      int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'\n      for ( int index =0; index < size  &&  !isMultiLine; ++index )\n      {\n         writeValue( value[index] );\n         lineLength += int( childValues_[index].length() );\n         isMultiLine = isMultiLine  &&  hasCommentForValue( value[index] );\n      }\n      addChildValues_ = false;\n      isMultiLine = isMultiLine  ||  lineLength >= rightMargin_;\n   }\n   return isMultiLine;\n}\n\n\nvoid \nStyledWriter::pushValue( const std::string &value )\n{\n   if ( addChildValues_ )\n      childValues_.push_back( value );\n   else\n      document_ += value;\n}\n\n\nvoid \nStyledWriter::writeIndent()\n{\n   if ( !document_.empty() )\n   {\n      char last = document_[document_.length()-1];\n      if ( last == ' ' )     // already indented\n         return;\n      if ( last != '\\n' )    // Comments may add new-line\n         document_ += '\\n';\n   }\n   document_ += indentString_;\n}\n\n\nvoid \nStyledWriter::writeWithIndent( const std::string &value )\n{\n   writeIndent();\n   document_ += value;\n}\n\n\nvoid \nStyledWriter::indent()\n{\n   indentString_ += std::string( indentSize_, ' ' );\n}\n\n\nvoid \nStyledWriter::unindent()\n{\n   assert( int(indentString_.size()) >= indentSize_ );\n   indentString_.resize( indentString_.size() - indentSize_ );\n}\n\n\nvoid \nStyledWriter::writeCommentBeforeValue( const Value &root )\n{\n   if ( !root.hasComment( commentBefore ) )\n      return;\n   document_ += normalizeEOL( root.getComment( commentBefore ) );\n   document_ += \"\\n\";\n}\n\n\nvoid \nStyledWriter::writeCommentAfterValueOnSameLine( const Value &root )\n{\n   if ( root.hasComment( commentAfterOnSameLine ) )\n      document_ += \" \" + normalizeEOL( root.getComment( commentAfterOnSameLine ) );\n\n   if ( root.hasComment( commentAfter ) )\n   {\n      document_ += \"\\n\";\n      document_ += normalizeEOL( root.getComment( commentAfter ) );\n      document_ += \"\\n\";\n   }\n}\n\n\nbool \nStyledWriter::hasCommentForValue( const Value &value )\n{\n   return value.hasComment( commentBefore )\n          ||  value.hasComment( commentAfterOnSameLine )\n          ||  value.hasComment( commentAfter );\n}\n\n\nstd::string \nStyledWriter::normalizeEOL( const std::string &text )\n{\n   std::string normalized;\n   normalized.reserve( text.length() );\n   const char *begin = text.c_str();\n   const char *end = begin + text.length();\n   const char *current = begin;\n   while ( current != end )\n   {\n      char c = *current++;\n      if ( c == '\\r' ) // mac or dos EOL\n      {\n         if ( *current == '\\n' ) // convert dos EOL\n            ++current;\n         normalized += '\\n';\n      }\n      else // handle unix EOL & other char\n         normalized += c;\n   }\n   return normalized;\n}\n\n\n// Class StyledStreamWriter\n// //////////////////////////////////////////////////////////////////\n\nStyledStreamWriter::StyledStreamWriter( std::string indentation )\n   : document_(NULL)\n   , rightMargin_( 74 )\n   , indentation_( indentation )\n{\n}\n\n\nvoid\nStyledStreamWriter::write( std::ostream &out, const Value &root )\n{\n   document_ = &out;\n   addChildValues_ = false;\n   indentString_ = \"\";\n   writeCommentBeforeValue( root );\n   writeValue( root );\n   writeCommentAfterValueOnSameLine( root );\n   *document_ << \"\\n\";\n   document_ = NULL; // Forget the stream, for safety.\n}\n\n\nvoid \nStyledStreamWriter::writeValue( const Value &value )\n{\n   switch ( value.type() )\n   {\n   case nullValue:\n      pushValue( \"null\" );\n      break;\n   case intValue:\n      pushValue( valueToString( value.asInt() ) );\n      break;\n   case uintValue:\n      pushValue( valueToString( value.asUInt() ) );\n      break;\n   case realValue:\n      pushValue( valueToString( value.asDouble() ) );\n      break;\n   case stringValue:\n      pushValue( valueToQuotedString( value.asCString() ) );\n      break;\n   case booleanValue:\n      pushValue( valueToString( value.asBool() ) );\n      break;\n   case arrayValue:\n      writeArrayValue( value);\n      break;\n   case objectValue:\n      {\n         Value::Members members( value.getMemberNames() );\n         if ( members.empty() )\n            pushValue( \"{}\" );\n         else\n         {\n            writeWithIndent( \"{\" );\n            indent();\n            Value::Members::iterator it = members.begin();\n            while ( true )\n            {\n               const std::string &name = *it;\n               const Value &childValue = value[name];\n               writeCommentBeforeValue( childValue );\n               writeWithIndent( valueToQuotedString( name.c_str() ) );\n               *document_ << \" : \";\n               writeValue( childValue );\n               if ( ++it == members.end() )\n               {\n                  writeCommentAfterValueOnSameLine( childValue );\n                  break;\n               }\n               *document_ << \",\";\n               writeCommentAfterValueOnSameLine( childValue );\n            }\n            unindent();\n            writeWithIndent( \"}\" );\n         }\n      }\n      break;\n   }\n}\n\n\nvoid \nStyledStreamWriter::writeArrayValue( const Value &value )\n{\n   unsigned size = value.size();\n   if ( size == 0 )\n      pushValue( \"[]\" );\n   else\n   {\n      bool isArrayMultiLine = isMultineArray( value );\n      if ( isArrayMultiLine )\n      {\n         writeWithIndent( \"[\" );\n         indent();\n         bool hasChildValue = !childValues_.empty();\n         unsigned index =0;\n         while ( true )\n         {\n            const Value &childValue = value[index];\n            writeCommentBeforeValue( childValue );\n            if ( hasChildValue )\n               writeWithIndent( childValues_[index] );\n            else\n            {\n\t       writeIndent();\n               writeValue( childValue );\n            }\n            if ( ++index == size )\n            {\n               writeCommentAfterValueOnSameLine( childValue );\n               break;\n            }\n            *document_ << \",\";\n            writeCommentAfterValueOnSameLine( childValue );\n         }\n         unindent();\n         writeWithIndent( \"]\" );\n      }\n      else // output on a single line\n      {\n         assert( childValues_.size() == size );\n         *document_ << \"[ \";\n         for ( unsigned index =0; index < size; ++index )\n         {\n            if ( index > 0 )\n               *document_ << \", \";\n            *document_ << childValues_[index];\n         }\n         *document_ << \" ]\";\n      }\n   }\n}\n\n\nbool \nStyledStreamWriter::isMultineArray( const Value &value )\n{\n   int size = value.size();\n   bool isMultiLine = size*3 >= rightMargin_ ;\n   childValues_.clear();\n   for ( int index =0; index < size  &&  !isMultiLine; ++index )\n   {\n      const Value &childValue = value[index];\n      isMultiLine = isMultiLine  ||\n                     ( (childValue.isArray()  ||  childValue.isObject())  &&  \n                        childValue.size() > 0 );\n   }\n   if ( !isMultiLine ) // check if line length > max line length\n   {\n      childValues_.reserve( size );\n      addChildValues_ = true;\n      int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'\n      for ( int index =0; index < size  &&  !isMultiLine; ++index )\n      {\n         writeValue( value[index] );\n         lineLength += int( childValues_[index].length() );\n         isMultiLine = isMultiLine  &&  hasCommentForValue( value[index] );\n      }\n      addChildValues_ = false;\n      isMultiLine = isMultiLine  ||  lineLength >= rightMargin_;\n   }\n   return isMultiLine;\n}\n\n\nvoid \nStyledStreamWriter::pushValue( const std::string &value )\n{\n   if ( addChildValues_ )\n      childValues_.push_back( value );\n   else\n      *document_ << value;\n}\n\n\nvoid \nStyledStreamWriter::writeIndent()\n{\n  /*\n    Some comments in this method would have been nice. ;-)\n\n   if ( !document_.empty() )\n   {\n      char last = document_[document_.length()-1];\n      if ( last == ' ' )     // already indented\n         return;\n      if ( last != '\\n' )    // Comments may add new-line\n         *document_ << '\\n';\n   }\n  */\n   *document_ << '\\n' << indentString_;\n}\n\n\nvoid \nStyledStreamWriter::writeWithIndent( const std::string &value )\n{\n   writeIndent();\n   *document_ << value;\n}\n\n\nvoid \nStyledStreamWriter::indent()\n{\n   indentString_ += indentation_;\n}\n\n\nvoid \nStyledStreamWriter::unindent()\n{\n   assert( indentString_.size() >= indentation_.size() );\n   indentString_.resize( indentString_.size() - indentation_.size() );\n}\n\n\nvoid \nStyledStreamWriter::writeCommentBeforeValue( const Value &root )\n{\n   if ( !root.hasComment( commentBefore ) )\n      return;\n   *document_ << normalizeEOL( root.getComment( commentBefore ) );\n   *document_ << \"\\n\";\n}\n\n\nvoid \nStyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root )\n{\n   if ( root.hasComment( commentAfterOnSameLine ) )\n      *document_ << \" \" + normalizeEOL( root.getComment( commentAfterOnSameLine ) );\n\n   if ( root.hasComment( commentAfter ) )\n   {\n      *document_ << \"\\n\";\n      *document_ << normalizeEOL( root.getComment( commentAfter ) );\n      *document_ << \"\\n\";\n   }\n}\n\n\nbool \nStyledStreamWriter::hasCommentForValue( const Value &value )\n{\n   return value.hasComment( commentBefore )\n          ||  value.hasComment( commentAfterOnSameLine )\n          ||  value.hasComment( commentAfter );\n}\n\n\nstd::string \nStyledStreamWriter::normalizeEOL( const std::string &text )\n{\n   std::string normalized;\n   normalized.reserve( text.length() );\n   const char *begin = text.c_str();\n   const char *end = begin + text.length();\n   const char *current = begin;\n   while ( current != end )\n   {\n      char c = *current++;\n      if ( c == '\\r' ) // mac or dos EOL\n      {\n         if ( *current == '\\n' ) // convert dos EOL\n            ++current;\n         normalized += '\\n';\n      }\n      else // handle unix EOL & other char\n         normalized += c;\n   }\n   return normalized;\n}\n\n\nstd::ostream& operator<<( std::ostream &sout, const Value &root )\n{\n   Json::StyledStreamWriter writer;\n   writer.write(sout, root);\n   return sout;\n}\n\n\n} // namespace Json\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/key.cpp",
    "content": "// Copyright (c) 2009-2012 The Bitcoin developers\n// Distributed under the MIT/X11 software license, see the accompanying\n// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n\n#include <map>\n\n#include <openssl/ecdsa.h>\n#include <openssl/obj_mac.h>\n\n#include \"key.h\"\n\n// Generate a private key from just the secret parameter\nint EC_KEY_regenerate_key(EC_KEY *eckey, BIGNUM *priv_key)\n{\n    int ok = 0;\n    BN_CTX *ctx = NULL;\n    EC_POINT *pub_key = NULL;\n\n    if (!eckey) return 0;\n\n    const EC_GROUP *group = EC_KEY_get0_group(eckey);\n\n    if ((ctx = BN_CTX_new()) == NULL)\n        goto err;\n\n    pub_key = EC_POINT_new(group);\n\n    if (pub_key == NULL)\n        goto err;\n\n    if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, ctx))\n        goto err;\n\n    EC_KEY_set_private_key(eckey,priv_key);\n    EC_KEY_set_public_key(eckey,pub_key);\n\n    ok = 1;\n\nerr:\n\n    if (pub_key)\n        EC_POINT_free(pub_key);\n    if (ctx != NULL)\n        BN_CTX_free(ctx);\n\n    return(ok);\n}\n\n// Perform ECDSA key recovery (see SEC1 4.1.6) for curves over (mod p)-fields\n// recid selects which key is recovered\n// if check is nonzero, additional checks are performed\nint ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned char *msg, int msglen, int recid, int check)\n{\n    if (!eckey) return 0;\n\n    int ret = 0;\n    BN_CTX *ctx = NULL;\n\n    BIGNUM *x = NULL;\n    BIGNUM *e = NULL;\n    BIGNUM *order = NULL;\n    BIGNUM *sor = NULL;\n    BIGNUM *eor = NULL;\n    BIGNUM *field = NULL;\n    EC_POINT *R = NULL;\n    EC_POINT *O = NULL;\n    EC_POINT *Q = NULL;\n    BIGNUM *rr = NULL;\n    BIGNUM *zero = NULL;\n    int n = 0;\n    int i = recid / 2;\n\n    const EC_GROUP *group = EC_KEY_get0_group(eckey);\n    if ((ctx = BN_CTX_new()) == NULL) { ret = -1; goto err; }\n    BN_CTX_start(ctx);\n    order = BN_CTX_get(ctx);\n    if (!EC_GROUP_get_order(group, order, ctx)) { ret = -2; goto err; }\n    x = BN_CTX_get(ctx);\n    if (!BN_copy(x, order)) { ret=-1; goto err; }\n    if (!BN_mul_word(x, i)) { ret=-1; goto err; }\n    if (!BN_add(x, x, ecsig->r)) { ret=-1; goto err; }\n    field = BN_CTX_get(ctx);\n    if (!EC_GROUP_get_curve_GFp(group, field, NULL, NULL, ctx)) { ret=-2; goto err; }\n    if (BN_cmp(x, field) >= 0) { ret=0; goto err; }\n    if ((R = EC_POINT_new(group)) == NULL) { ret = -2; goto err; }\n    if (!EC_POINT_set_compressed_coordinates_GFp(group, R, x, recid % 2, ctx)) { ret=0; goto err; }\n    if (check)\n    {\n        if ((O = EC_POINT_new(group)) == NULL) { ret = -2; goto err; }\n        if (!EC_POINT_mul(group, O, NULL, R, order, ctx)) { ret=-2; goto err; }\n        if (!EC_POINT_is_at_infinity(group, O)) { ret = 0; goto err; }\n    }\n    if ((Q = EC_POINT_new(group)) == NULL) { ret = -2; goto err; }\n    n = EC_GROUP_get_degree(group);\n    e = BN_CTX_get(ctx);\n    if (!BN_bin2bn(msg, msglen, e)) { ret=-1; goto err; }\n    if (8*msglen > n) BN_rshift(e, e, 8-(n & 7));\n    zero = BN_CTX_get(ctx);\n    if (!BN_zero(zero)) { ret=-1; goto err; }\n    if (!BN_mod_sub(e, zero, e, order, ctx)) { ret=-1; goto err; }\n    rr = BN_CTX_get(ctx);\n    if (!BN_mod_inverse(rr, ecsig->r, order, ctx)) { ret=-1; goto err; }\n    sor = BN_CTX_get(ctx);\n    if (!BN_mod_mul(sor, ecsig->s, rr, order, ctx)) { ret=-1; goto err; }\n    eor = BN_CTX_get(ctx);\n    if (!BN_mod_mul(eor, e, rr, order, ctx)) { ret=-1; goto err; }\n    if (!EC_POINT_mul(group, Q, eor, R, sor, ctx)) { ret=-2; goto err; }\n    if (!EC_KEY_set_public_key(eckey, Q)) { ret=-2; goto err; }\n\n    ret = 1;\n\nerr:\n    if (ctx) {\n        BN_CTX_end(ctx);\n        BN_CTX_free(ctx);\n    }\n    if (R != NULL) EC_POINT_free(R);\n    if (O != NULL) EC_POINT_free(O);\n    if (Q != NULL) EC_POINT_free(Q);\n    return ret;\n}\n\nvoid CKey::SetCompressedPubKey()\n{\n    EC_KEY_set_conv_form(pkey, POINT_CONVERSION_COMPRESSED);\n    fCompressedPubKey = true;\n}\n\nvoid CKey::Reset()\n{\n    fCompressedPubKey = false;\n    pkey = EC_KEY_new_by_curve_name(NID_secp256k1);\n    if (pkey == NULL)\n        throw key_error(\"CKey::CKey() : EC_KEY_new_by_curve_name failed\");\n    fSet = false;\n}\n\nCKey::CKey()\n{\n    Reset();\n}\n\nCKey::CKey(const CKey& b)\n{\n    pkey = EC_KEY_dup(b.pkey);\n    if (pkey == NULL)\n        throw key_error(\"CKey::CKey(const CKey&) : EC_KEY_dup failed\");\n    fSet = b.fSet;\n}\n\nCKey& CKey::operator=(const CKey& b)\n{\n    if (!EC_KEY_copy(pkey, b.pkey))\n        throw key_error(\"CKey::operator=(const CKey&) : EC_KEY_copy failed\");\n    fSet = b.fSet;\n    return (*this);\n}\n\nCKey::~CKey()\n{\n    EC_KEY_free(pkey);\n}\n\nbool CKey::IsNull() const\n{\n    return !fSet;\n}\n\nbool CKey::IsCompressed() const\n{\n    return fCompressedPubKey;\n}\n\nvoid CKey::MakeNewKey(bool fCompressed)\n{\n    if (!EC_KEY_generate_key(pkey))\n        throw key_error(\"CKey::MakeNewKey() : EC_KEY_generate_key failed\");\n    if (fCompressed)\n        SetCompressedPubKey();\n    fSet = true;\n}\n\nbool CKey::SetPrivKey(const CPrivKey& vchPrivKey)\n{\n    const unsigned char* pbegin = &vchPrivKey[0];\n    if (!d2i_ECPrivateKey(&pkey, &pbegin, vchPrivKey.size()))\n        return false;\n    fSet = true;\n    return true;\n}\n\nbool CKey::SetSecret(const CSecret& vchSecret, bool fCompressed)\n{\n    EC_KEY_free(pkey);\n    pkey = EC_KEY_new_by_curve_name(NID_secp256k1);\n    if (pkey == NULL)\n        throw key_error(\"CKey::SetSecret() : EC_KEY_new_by_curve_name failed\");\n    if (vchSecret.size() != 32)\n        throw key_error(\"CKey::SetSecret() : secret must be 32 bytes\");\n    BIGNUM *bn = BN_bin2bn(&vchSecret[0],32,BN_new());\n    if (bn == NULL)\n        throw key_error(\"CKey::SetSecret() : BN_bin2bn failed\");\n    if (!EC_KEY_regenerate_key(pkey,bn))\n    {\n        BN_clear_free(bn);\n        throw key_error(\"CKey::SetSecret() : EC_KEY_regenerate_key failed\");\n    }\n    BN_clear_free(bn);\n    fSet = true;\n    if (fCompressed || fCompressedPubKey)\n        SetCompressedPubKey();\n    return true;\n}\n\nCSecret CKey::GetSecret(bool &fCompressed) const\n{\n    CSecret vchRet;\n    vchRet.resize(32);\n    const BIGNUM *bn = EC_KEY_get0_private_key(pkey);\n    int nBytes = BN_num_bytes(bn);\n    if (bn == NULL)\n        throw key_error(\"CKey::GetSecret() : EC_KEY_get0_private_key failed\");\n    int n=BN_bn2bin(bn,&vchRet[32 - nBytes]);\n    if (n != nBytes)\n        throw key_error(\"CKey::GetSecret(): BN_bn2bin failed\");\n    fCompressed = fCompressedPubKey;\n    return vchRet;\n}\n\nCPrivKey CKey::GetPrivKey() const\n{\n    int nSize = i2d_ECPrivateKey(pkey, NULL);\n    if (!nSize)\n        throw key_error(\"CKey::GetPrivKey() : i2d_ECPrivateKey failed\");\n    CPrivKey vchPrivKey(nSize, 0);\n    unsigned char* pbegin = &vchPrivKey[0];\n    if (i2d_ECPrivateKey(pkey, &pbegin) != nSize)\n        throw key_error(\"CKey::GetPrivKey() : i2d_ECPrivateKey returned unexpected size\");\n    return vchPrivKey;\n}\n\nbool CKey::SetPubKey(const CPubKey& vchPubKey)\n{\n    const unsigned char* pbegin = &vchPubKey.vchPubKey[0];\n    if (!o2i_ECPublicKey(&pkey, &pbegin, vchPubKey.vchPubKey.size()))\n        return false;\n    fSet = true;\n    if (vchPubKey.vchPubKey.size() == 33)\n        SetCompressedPubKey();\n    return true;\n}\n\nCPubKey CKey::GetPubKey() const\n{\n    int nSize = i2o_ECPublicKey(pkey, NULL);\n    if (!nSize)\n        throw key_error(\"CKey::GetPubKey() : i2o_ECPublicKey failed\");\n    std::vector<unsigned char> vchPubKey(nSize, 0);\n    unsigned char* pbegin = &vchPubKey[0];\n    if (i2o_ECPublicKey(pkey, &pbegin) != nSize)\n        throw key_error(\"CKey::GetPubKey() : i2o_ECPublicKey returned unexpected size\");\n    return CPubKey(vchPubKey);\n}\n\nbool CKey::Sign(uint256 hash, std::vector<unsigned char>& vchSig)\n{\n    unsigned int nSize = ECDSA_size(pkey);\n    vchSig.resize(nSize); // Make sure it is big enough\n    if (!ECDSA_sign(0, (unsigned char*)&hash, sizeof(hash), &vchSig[0], &nSize, pkey))\n    {\n        vchSig.clear();\n        return false;\n    }\n    vchSig.resize(nSize); // Shrink to fit actual size\n    return true;\n}\n\n// create a compact signature (65 bytes), which allows reconstructing the used public key\n// The format is one header byte, followed by two times 32 bytes for the serialized r and s values.\n// The header byte: 0x1B = first key with even y, 0x1C = first key with odd y,\n//                  0x1D = second key with even y, 0x1E = second key with odd y\nbool CKey::SignCompact(uint256 hash, std::vector<unsigned char>& vchSig)\n{\n    bool fOk = false;\n    ECDSA_SIG *sig = ECDSA_do_sign((unsigned char*)&hash, sizeof(hash), pkey);\n    if (sig==NULL)\n        return false;\n    vchSig.clear();\n    vchSig.resize(65,0);\n    int nBitsR = BN_num_bits(sig->r);\n    int nBitsS = BN_num_bits(sig->s);\n    if (nBitsR <= 256 && nBitsS <= 256)\n    {\n        int nRecId = -1;\n        for (int i=0; i<4; i++)\n        {\n            CKey keyRec;\n            keyRec.fSet = true;\n            if (fCompressedPubKey)\n                keyRec.SetCompressedPubKey();\n            if (ECDSA_SIG_recover_key_GFp(keyRec.pkey, sig, (unsigned char*)&hash, sizeof(hash), i, 1) == 1)\n                if (keyRec.GetPubKey() == this->GetPubKey())\n                {\n                    nRecId = i;\n                    break;\n                }\n        }\n\n        if (nRecId == -1)\n            throw key_error(\"CKey::SignCompact() : unable to construct recoverable key\");\n\n        vchSig[0] = nRecId+27+(fCompressedPubKey ? 4 : 0);\n        BN_bn2bin(sig->r,&vchSig[33-(nBitsR+7)/8]);\n        BN_bn2bin(sig->s,&vchSig[65-(nBitsS+7)/8]);\n        fOk = true;\n    }\n    ECDSA_SIG_free(sig);\n    return fOk;\n}\n\n// reconstruct public key from a compact signature\n// This is only slightly more CPU intensive than just verifying it.\n// If this function succeeds, the recovered public key is guaranteed to be valid\n// (the signature is a valid signature of the given data for that key)\nbool CKey::SetCompactSignature(uint256 hash, const std::vector<unsigned char>& vchSig)\n{\n    if (vchSig.size() != 65)\n        return false;\n    int nV = vchSig[0];\n    if (nV<27 || nV>=35)\n        return false;\n    ECDSA_SIG *sig = ECDSA_SIG_new();\n    BN_bin2bn(&vchSig[1],32,sig->r);\n    BN_bin2bn(&vchSig[33],32,sig->s);\n\n    EC_KEY_free(pkey);\n    pkey = EC_KEY_new_by_curve_name(NID_secp256k1);\n    if (nV >= 31)\n    {\n        SetCompressedPubKey();\n        nV -= 4;\n    }\n    if (ECDSA_SIG_recover_key_GFp(pkey, sig, (unsigned char*)&hash, sizeof(hash), nV - 27, 0) == 1)\n    {\n        fSet = true;\n        ECDSA_SIG_free(sig);\n        return true;\n    }\n    return false;\n}\n\nbool CKey::Verify(uint256 hash, const std::vector<unsigned char>& vchSig)\n{\n    // -1 = error, 0 = bad sig, 1 = good\n    if (ECDSA_verify(0, (unsigned char*)&hash, sizeof(hash), &vchSig[0], vchSig.size(), pkey) != 1)\n        return false;\n\n    return true;\n}\n\nbool CKey::VerifyCompact(uint256 hash, const std::vector<unsigned char>& vchSig)\n{\n    CKey key;\n    if (!key.SetCompactSignature(hash, vchSig))\n        return false;\n    if (GetPubKey() != key.GetPubKey())\n        return false;\n\n    return true;\n}\n\nbool CKey::IsValid()\n{\n    if (!fSet)\n        return false;\n\n    bool fCompr;\n    CSecret secret = GetSecret(fCompr);\n    CKey key2;\n    key2.SetSecret(secret, fCompr);\n    return GetPubKey() == key2.GetPubKey();\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/key.h",
    "content": "// Copyright (c) 2009-2010 Satoshi Nakamoto\n// Copyright (c) 2009-2012 The Bitcoin developers\n// Distributed under the MIT/X11 software license, see the accompanying\n// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n#ifndef BITCOIN_KEY_H\n#define BITCOIN_KEY_H\n\n#include <stdexcept>\n#include <vector>\n\n#include \"allocators.h\"\n#include \"serialize.h\"\n#include \"uint256.h\"\n#include \"util.h\"\n\n#include <openssl/ec.h> // for EC_KEY definition\n\n// secp160k1\n// const unsigned int PRIVATE_KEY_SIZE = 192;\n// const unsigned int PUBLIC_KEY_SIZE  = 41;\n// const unsigned int SIGNATURE_SIZE   = 48;\n//\n// secp192k1\n// const unsigned int PRIVATE_KEY_SIZE = 222;\n// const unsigned int PUBLIC_KEY_SIZE  = 49;\n// const unsigned int SIGNATURE_SIZE   = 57;\n//\n// secp224k1\n// const unsigned int PRIVATE_KEY_SIZE = 250;\n// const unsigned int PUBLIC_KEY_SIZE  = 57;\n// const unsigned int SIGNATURE_SIZE   = 66;\n//\n// secp256k1:\n// const unsigned int PRIVATE_KEY_SIZE = 279;\n// const unsigned int PUBLIC_KEY_SIZE  = 65;\n// const unsigned int SIGNATURE_SIZE   = 72;\n//\n// see www.keylength.com\n// script supports up to 75 for single byte push\n\nclass key_error : public std::runtime_error\n{\npublic:\n    explicit key_error(const std::string& str) : std::runtime_error(str) {}\n};\n\n/** A reference to a CKey: the Hash160 of its serialized public key */\nclass CKeyID : public uint160\n{\npublic:\n    CKeyID() : uint160(0) { }\n    CKeyID(const uint160 &in) : uint160(in) { }\n};\n\n/** A reference to a CScript: the Hash160 of its serialization (see script.h) */\nclass CScriptID : public uint160\n{\npublic:\n    CScriptID() : uint160(0) { }\n    CScriptID(const uint160 &in) : uint160(in) { }\n};\n\n/** An encapsulated public key. */\nclass CPubKey {\nprivate:\n    std::vector<unsigned char> vchPubKey;\n    friend class CKey;\n\npublic:\n    CPubKey() { }\n    CPubKey(const std::vector<unsigned char> &vchPubKeyIn) : vchPubKey(vchPubKeyIn) { }\n    friend bool operator==(const CPubKey &a, const CPubKey &b) { return a.vchPubKey == b.vchPubKey; }\n    friend bool operator!=(const CPubKey &a, const CPubKey &b) { return a.vchPubKey != b.vchPubKey; }\n    friend bool operator<(const CPubKey &a, const CPubKey &b) { return a.vchPubKey < b.vchPubKey; }\n\n    IMPLEMENT_SERIALIZE(\n        READWRITE(vchPubKey);\n    )\n\n    CKeyID GetID() const {\n        return CKeyID(Hash160(vchPubKey));\n    }\n\n    uint256 GetHash() const {\n        return Hash(vchPubKey.begin(), vchPubKey.end());\n    }\n\n    bool IsValid() const {\n        return vchPubKey.size() == 33 || vchPubKey.size() == 65;\n    }\n\n    bool IsCompressed() const {\n        return vchPubKey.size() == 33;\n    }\n\n    std::vector<unsigned char> Raw() const {\n        return vchPubKey;\n    }\n};\n\n\n// secure_allocator is defined in serialize.h\n// CPrivKey is a serialized private key, with all parameters included (279 bytes)\ntypedef std::vector<unsigned char, secure_allocator<unsigned char> > CPrivKey;\n// CSecret is a serialization of just the secret parameter (32 bytes)\ntypedef std::vector<unsigned char, secure_allocator<unsigned char> > CSecret;\n\n/** An encapsulated OpenSSL Elliptic Curve key (public and/or private) */\nclass CKey\n{\nprotected:\n    EC_KEY* pkey;\n    bool fSet;\n    bool fCompressedPubKey;\n\n    void SetCompressedPubKey();\n\npublic:\n\n    void Reset();\n\n    CKey();\n    CKey(const CKey& b);\n\n    CKey& operator=(const CKey& b);\n\n    ~CKey();\n\n    bool IsNull() const;\n    bool IsCompressed() const;\n\n    void MakeNewKey(bool fCompressed);\n    bool SetPrivKey(const CPrivKey& vchPrivKey);\n    bool SetSecret(const CSecret& vchSecret, bool fCompressed = false);\n    CSecret GetSecret(bool &fCompressed) const;\n    CPrivKey GetPrivKey() const;\n    bool SetPubKey(const CPubKey& vchPubKey);\n    CPubKey GetPubKey() const;\n\n    bool Sign(uint256 hash, std::vector<unsigned char>& vchSig);\n\n    // create a compact signature (65 bytes), which allows reconstructing the used public key\n    // The format is one header byte, followed by two times 32 bytes for the serialized r and s values.\n    // The header byte: 0x1B = first key with even y, 0x1C = first key with odd y,\n    //                  0x1D = second key with even y, 0x1E = second key with odd y\n    bool SignCompact(uint256 hash, std::vector<unsigned char>& vchSig);\n\n    // reconstruct public key from a compact signature\n    // This is only slightly more CPU intensive than just verifying it.\n    // If this function succeeds, the recovered public key is guaranteed to be valid\n    // (the signature is a valid signature of the given data for that key)\n    bool SetCompactSignature(uint256 hash, const std::vector<unsigned char>& vchSig);\n\n    bool Verify(uint256 hash, const std::vector<unsigned char>& vchSig);\n\n    // Verify a compact signature\n    bool VerifyCompact(uint256 hash, const std::vector<unsigned char>& vchSig);\n\n    bool IsValid();\n};\n\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/libcanister.h",
    "content": "#ifndef LIBCANIH\n#define LIBCANIH\n#include <iostream>\n#include <fstream>\n#include <stdlib.h>\n#include <cstring>\n\n#define int64 unsigned long long\n//#define DEBUG\n\n#ifdef DEBUG\n#define dout cout\n#else\n#define dout if (0) cerr\n#endif\n\nusing namespace std;\n\nnamespace libcanister\n{\n\n    //the canmem object is a generic memory container used commonly\n    //throughout the canister framework to hold memory of uncertain\n    //length which may or may not contain null bytes. \n    class canmem\n    {\n    public:\n        char* data; //the raw memory block\n        int size; //the absolute length of the block\n        canmem(); //creates an unallocated canmem\n        canmem(int allocsize); //creates an allocated, blank canmem of size\n        canmem(char* strdata); //automates the creation of zero-limited canmems\n        ~canmem(); //cleans up the canmem\n        void zeromem(); //overwrites this canmem\n        void fragmem(); //overwrites this canmem with fragment notation\n        void countlen(); //counts length of zero-limited strings and stores it in size\n        void trim(); //removes any nulls from the end of the string\n        static canmem null(); //returns a singleton null canmem\n        \n    };\n    \n    //contains information about the canister\n    class caninfo\n    {\n    public:\n        canmem path; //physical path\n        canmem internalname; //a name for the canister\n        int numfiles; //the number of files in the canister\n    };\n    \n    //necessary for the use of this class as a type in canfile\n    class canister;\n    \n    //this object holds the definition of a 'file' within the\n    //canister 'filesystem.'\n    class canfile\n    {\n    public:\n        libcanister::canister* parent; //the canister that holds this file\n        canmem path; //internal path ('filename')\n        canmem data; //the file's decompressed contents\n        int isfrag; //0 = probably not fragment, 1 = definitely a fragment (ignore)\n        int cfid; //'canfile id' -- a unique ID for this file\n        int64 dsize; //ondisk size (compressed form size)\n        int cachestate; //0 = not in memory, 1 = in memory, 2 = in memory and needs flush\n                        //-1 = error, check the data for the message\n        void cache(); //pull the file from disk and cache it in memory\n        void cachedump(); //deletes the contents of this file from the memory cache after assuring the on disk copy is up to date\n        void cachedumpfinal(fstream& infile); //same as cachedump, but more efficient during closing procedures\n        void flush(); //updates the on disk copy, but retains the memory cache\n    };\n\n    //the primary class\n    //this defines and controls a single canister\n    class canister\n    {\n        //table of contents\n        //absolutely worthless to the control code in the canister\n        //but quite useful to programs using the API, as they may\n        //desire to enumerate the files in a canister for a user's\n        //use or for their own.\n        //contains a newline-delimited list of files in the container.\n        canfile TOC;\n    public:\n        caninfo info; //the general info about this canister\n\n        //the raw canfiles -- recommended that programs do not modify\n        //these files directly, but not enforced.\n        canfile* files;\n        bool readonly; //if true then no write routines will do anything\n        \n        //maximum number of files to have in memory at any given\n        //time, change this to whatever suits your application.\n        int cachemax;\n        int cachecnt; //number of files in the cache (should not be modified)\n\n        //both initialize the canister from a physical location\n        canister (canmem fspath);\n        canister (char* fspath);\n\n        //destroys the canister (after flushing the modded buffers, of course)\n        ~canister();\n        \n        //open the fspath\n        //does it exist?\n        // | --- yes --- opening it (return 1)\n        // | --- yes --- file is corrupted, halting (return -1)\n        // | --- no  --- making a new one (return 0)\n        int open();\n        \n        //close the canister, flush all buffers, clean up\n        int close();\n        \n        //deletes the file at path inside this canister\n        int delFile(canmem path);\n        \n        //pulls the contents of the file from disk or memory and returns it as a file\n        canfile getFile(canmem path);\n        \n        //creates a file if it does not exist, otherwise overwrites\n        //returns whether operation succeeded\n        bool writeFile(canmem path, canmem data);\n        bool writeFile(canfile file);\n        \n        //get the 'table of contents', a file containing a newline delimited\n        //list of the file paths in the container which have contents\n        canfile getTOC();\n \n        //brings the cache back within the cachemax limit\n        //important: sCFID is the safe CFID\n        //(the CFID of the file we want to avoid uncaching)\n        //really just used internally, but it can't do any harm.\n        void cacheclean(int sCFID, bool dFlush = false);\n    };\n\n}\n\n#endif"
  },
  {
    "path": "src/test/resources/samples/langs/C++/main.cpp",
    "content": "/*\n  This file is part of the PhantomJS project from Ofi Labs.\n\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include \"consts.h\"\n#include \"utils.h\"\n#include \"env.h\"\n#include \"phantom.h\"\n\n#ifdef Q_OS_LINUX\n#include \"client/linux/handler/exception_handler.h\"\n#endif\n\n#include <QApplication>\n\n#if QT_VERSION != QT_VERSION_CHECK(4, 8, 0)\n#error Something is wrong with the setup. Please report to the mailing list!\n#endif\n\nint main(int argc, char** argv, const char** envp)\n{\n#ifdef Q_OS_LINUX\n    google_breakpad::ExceptionHandler eh(\"/tmp\", NULL, Utils::exceptionHandler, NULL, true);\n#endif\n\n    // Registering an alternative Message Handler\n    qInstallMsgHandler(Utils::messageHandler);\n\n    QApplication app(argc, argv);\n\n#ifdef STATIC_BUILD\n    Q_INIT_RESOURCE(WebKit);\n    Q_INIT_RESOURCE(InspectorBackendStub);\n#endif\n\n    app.setWindowIcon(QIcon(\":/phantomjs-icon.png\"));\n    app.setApplicationName(\"PhantomJS\");\n    app.setOrganizationName(\"Ofi Labs\");\n    app.setOrganizationDomain(\"www.ofilabs.com\");\n    app.setApplicationVersion(PHANTOMJS_VERSION_STRING);\n\n    Env::instance()->parse(envp);\n\n    Phantom phantom;\n    if (phantom.execute()) {\n        app.exec();\n    }\n    return phantom.returnValue();\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/metrics.h",
    "content": "// Copyright 2011 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef NINJA_METRICS_H_\n#define NINJA_METRICS_H_\n\n#include <string>\n#include <vector>\nusing namespace std;\n\n#include \"util.h\"  // For int64_t.\n\n/// The Metrics module is used for the debug mode that dumps timing stats of\n/// various actions.  To use, see METRIC_RECORD below.\n\n/// A single metrics we're tracking, like \"depfile load time\".\nstruct Metric {\n  string name;\n  /// Number of times we've hit the code path.\n  int count;\n  /// Total time (in micros) we've spent on the code path.\n  int64_t sum;\n};\n\n\n/// A scoped object for recording a metric across the body of a function.\n/// Used by the METRIC_RECORD macro.\nstruct ScopedMetric {\n  explicit ScopedMetric(Metric* metric);\n  ~ScopedMetric();\n\nprivate:\n  Metric* metric_;\n  /// Timestamp when the measurement started.\n  /// Value is platform-dependent.\n  int64_t start_;\n};\n\n/// The singleton that stores metrics and prints the report.\nstruct Metrics {\n  Metric* NewMetric(const string& name);\n\n  /// Print a summary report to stdout.\n  void Report();\n\nprivate:\n  vector<Metric*> metrics_;\n};\n\n/// Get the current time as relative to some epoch.\n/// Epoch varies between platforms; only useful for measuring elapsed time.\nint64_t GetTimeMillis();\n\n/// A simple stopwatch which returns the time\n/// in seconds since Restart() was called.\nstruct Stopwatch {\n public:\n  Stopwatch() : started_(0) {}\n\n  /// Seconds since Restart() call.\n  double Elapsed() const {\n    return 1e-6 * static_cast<double>(Now() - started_);\n  }\n\n  void Restart() { started_ = Now(); }\n\n private:\n  uint64_t started_;\n  uint64_t Now() const;\n};\n\n/// The primary interface to metrics.  Use METRIC_RECORD(\"foobar\") at the top\n/// of a function to get timing stats recorded for each call of the function.\n#define METRIC_RECORD(name)                                             \\\n  static Metric* metrics_h_metric =                                     \\\n      g_metrics ? g_metrics->NewMetric(name) : NULL;                    \\\n  ScopedMetric metrics_h_scoped(metrics_h_metric);\n\nextern Metrics* g_metrics;\n\n#endif // NINJA_METRICS_H_\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/octave_changer.ino",
    "content": "const int buttons[4] = {2,3,4,5};\nconst int octaves[2] = {6,7};\n\nvoid setup() {                \n  // initialize the digital pin as an output.\n  // Pin 13 has an LED connected on most Arduino boards:\n\n  pinMode(13,OUTPUT);\n\n for(int i =0;i<sizeof(buttons)/sizeof(int);i++){\n   pinMode(buttons[i],INPUT );\n }\n \n for(int i =0;i<sizeof(octaves)/sizeof(int);i++){\n   pinMode(octaves[i],INPUT );\n }\n \n  Serial.begin(9600);\n}\n\n\nvoid loop() {\n  delay(1);              // wait\n  int output = -1;\n  \n // Serial.print(digitalRead(buttons[0]));\n  \n for(int i =0;i<sizeof(buttons)/sizeof(int);i++){\n   if(digitalRead(buttons[i])==LOW\n   ){\n     if(output<=0){\n       output=1;\n     }\n     output+=i+1;\n   }\n }\n \n for(int i =0;i<sizeof(octaves)/sizeof(int);i++){\n    if(output<=0){\n       break;\n     }\n   if(digitalRead(octaves[i])==LOW\n   ){\n     output*=7*(i==1 ? -1 : 1);\n   }\n }\n  if(output>=0){\n  Serial.print(output);\n  Serial.println(\";\");\n  digitalWrite(13,HIGH);\n  }else{\n  digitalWrite(13,LOW);\n  }\n  \n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/program.cp",
    "content": "/**\nThe MIT License (MIT)\n\nCopyright (c) 2016 Sahil Dua ( sahildua2305 | http://sahildua.com )\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.*/\n\n#include <iostream>\n#include <algorithm>\n#include <cstdio>\n#include <cstring>\n#include <cmath>\n#include <string>\n#include <vector>\n#include <map>\n#include <set>\n#include <queue>\n#include <stack>\nusing namespace std;\ntypedef long long ll;\n#define DEBUG\n#define mod 1000000007\n#define pb push_back\n\nint r2, c2, n, m;\n\nbool dfs(vector<string> graph, int r, int c){\n    //cout<<r<<\" \"<<c<<endl;\n    if(graph[r][c] == 'X'){\n        if(r==r2 && c==c2)\n            return true;\n        else\n            return false;\n    }\n    else{\n        graph[r][c] = 'X';\n    }\n    if(r>0){\n        if(dfs(graph, r-1, c))\n            return true;\n    }\n    if(c>0){\n        if(dfs(graph, r, c-1))\n            return true;\n    }\n    if(r<(n-1)){\n        if(dfs(graph, r+1, c))\n            return true;\n    }\n    if(c<(m-1)){\n        if(dfs(graph, r, c+1))\n            return true;\n    }\n    return false;\n}\n\nstruct point{\n    int r,c;\n    point(int rr, int cc){\n        r = rr;\n        c = cc;\n    }\n};\n\nstack<point> st;\n\n// if(r>0){\n//     if(dfs(graph, r-1, c))\n//         return true;\n// }\n// if(c>0){\n//     if(dfs(graph, r, c-1))\n//         return true;\n// }\n// if(r<(n-1)){\n//     if(dfs(graph, r+1, c))\n//         return true;\n// }\n// if(c<(m-1)){\n//     if(dfs(graph, r, c+1))\n//         return true;\n// }\n\nbool search(vector<string> graph, int rr, int cc){\n    point t;\n    t.r=rr;\n    t.c=cc;\n    st.push(t);\n\n    while(!st.empty()){\n        point u = st.top();\n        st.pop();\n        int r = u.r, c = u.c;\n        cout<<r<<\" \"<<c<<endl;\n        if(graph[r][c]=='X'){\n            if(r==r2 && c==c2)\n                return true;\n            return false;\n        }\n        else{\n            graph[r][c] = 'X';\n        }\n        if(r>0){\n            t.r=r-1;\n            t.c=c;\n            st.push(t);\n        }\n        if(c>0){\n            t.r=r;\n            t.c=c-1;\n            st.push(t);\n        }\n        if(r<(n-1)){\n            t.r=r+1;\n            t.c=c;\n            st.push(t);\n        }\n        if(c<(m-1)){\n            t.r=r;\n            t.c=c+1;\n            st.push(t);\n        }\n    }\n    return false;\n}\n\nint main(){\n    ios::sync_with_stdio(false);\n    #ifdef DEBUG\n    freopen(\"input.txt\", \"r\", stdin);\n    #endif // DEBUG\n\n    cin>>n>>m;\n    string temp;\n    vector<string> graph;\n    for(int i=0;i<n;i++){\n        cin>>temp;\n        graph.pb(temp);\n    }\n    int r1,c1;\n    cin>>r1>>c1;\n    cin>>r2>>c2;\n    r2--;\n    c2--;\n    r1--;\n    c1--;\n    graph[r1][c1] = '.';\n    if(search(graph, r1, c1))\n        cout<<\"YES\\n\";\n    else\n        cout<<\"NO\\n\";\n\n    return 0;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/protocol-buffer.pb.cc",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: protocol-buffer.proto\n\n#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION\n#include \"protocol-buffer.pb.h\"\n\n#include <algorithm>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/once.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/wire_format_lite_inl.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/generated_message_reflection.h>\n#include <google/protobuf/reflection_ops.h>\n#include <google/protobuf/wire_format.h>\n// @@protoc_insertion_point(includes)\n\nnamespace persons {\n\nnamespace {\n\nconst ::google::protobuf::Descriptor* Person_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  Person_reflection_ = NULL;\n\n}  // namespace\n\n\nvoid protobuf_AssignDesc_protocol_2dbuffer_2eproto() {\n  protobuf_AddDesc_protocol_2dbuffer_2eproto();\n  const ::google::protobuf::FileDescriptor* file =\n    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(\n      \"protocol-buffer.proto\");\n  GOOGLE_CHECK(file != NULL);\n  Person_descriptor_ = file->message_type(0);\n  static const int Person_offsets_[1] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Person, name_),\n  };\n  Person_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      Person_descriptor_,\n      Person::default_instance_,\n      Person_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Person, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Person, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(Person));\n}\n\nnamespace {\n\nGOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);\ninline void protobuf_AssignDescriptorsOnce() {\n  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,\n                 &protobuf_AssignDesc_protocol_2dbuffer_2eproto);\n}\n\nvoid protobuf_RegisterTypes(const ::std::string&) {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    Person_descriptor_, &Person::default_instance());\n}\n\n}  // namespace\n\nvoid protobuf_ShutdownFile_protocol_2dbuffer_2eproto() {\n  delete Person::default_instance_;\n  delete Person_reflection_;\n}\n\nvoid protobuf_AddDesc_protocol_2dbuffer_2eproto() {\n  static bool already_here = false;\n  if (already_here) return;\n  already_here = true;\n  GOOGLE_PROTOBUF_VERIFY_VERSION;\n\n  ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(\n    \"\\n\\025protocol-buffer.proto\\022\\007persons\\\"\\026\\n\\006Pers\"\n    \"on\\022\\014\\n\\004name\\030\\001 \\002(\\t\", 56);\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(\n    \"protocol-buffer.proto\", &protobuf_RegisterTypes);\n  Person::default_instance_ = new Person();\n  Person::default_instance_->InitAsDefaultInstance();\n  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_protocol_2dbuffer_2eproto);\n}\n\n// Force AddDescriptors() to be called at static initialization time.\nstruct StaticDescriptorInitializer_protocol_2dbuffer_2eproto {\n  StaticDescriptorInitializer_protocol_2dbuffer_2eproto() {\n    protobuf_AddDesc_protocol_2dbuffer_2eproto();\n  }\n} static_descriptor_initializer_protocol_2dbuffer_2eproto_;\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int Person::kNameFieldNumber;\n#endif  // !_MSC_VER\n\nPerson::Person()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid Person::InitAsDefaultInstance() {\n}\n\nPerson::Person(const Person& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid Person::SharedCtor() {\n  _cached_size_ = 0;\n  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nPerson::~Person() {\n  SharedDtor();\n}\n\nvoid Person::SharedDtor() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (this != default_instance_) {\n  }\n}\n\nvoid Person::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* Person::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return Person_descriptor_;\n}\n\nconst Person& Person::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_protocol_2dbuffer_2eproto();\n  return *default_instance_;\n}\n\nPerson* Person::default_instance_ = NULL;\n\nPerson* Person::New() const {\n  return new Person;\n}\n\nvoid Person::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name()) {\n      if (name_ != &::google::protobuf::internal::kEmptyString) {\n        name_->clear();\n      }\n    }\n  }\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool Person::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // required string name = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name().data(), this->name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n\n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid Person::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // required string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name(), output);\n  }\n\n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* Person::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // required string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name(), target);\n  }\n\n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint Person::ByteSize() const {\n  int total_size = 0;\n\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // required string name = 1;\n    if (has_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name());\n    }\n\n  }\n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid Person::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const Person* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const Person*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid Person::MergeFrom(const Person& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name()) {\n      set_name(from.name());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid Person::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid Person::CopyFrom(const Person& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool Person::IsInitialized() const {\n  if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false;\n\n  return true;\n}\n\nvoid Person::Swap(Person* other) {\n  if (other != this) {\n    std::swap(name_, other->name_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata Person::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = Person_descriptor_;\n  metadata.reflection = Person_reflection_;\n  return metadata;\n}\n\n\n// @@protoc_insertion_point(namespace_scope)\n\n}  // namespace persons\n\n// @@protoc_insertion_point(global_scope)\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/protocol-buffer.pb.h",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: protocol-buffer.proto\n\n#ifndef PROTOBUF_protocol_2dbuffer_2eproto__INCLUDED\n#define PROTOBUF_protocol_2dbuffer_2eproto__INCLUDED\n\n#include <string>\n\n#include <google/protobuf/stubs/common.h>\n\n#if GOOGLE_PROTOBUF_VERSION < 2005000\n#error This file was generated by a newer version of protoc which is\n#error incompatible with your Protocol Buffer headers.  Please update\n#error your headers.\n#endif\n#if 2005000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION\n#error This file was generated by an older version of protoc which is\n#error incompatible with your Protocol Buffer headers.  Please\n#error regenerate this file with a newer version of protoc.\n#endif\n\n#include <google/protobuf/generated_message_util.h>\n#include <google/protobuf/message.h>\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/extension_set.h>\n#include <google/protobuf/unknown_field_set.h>\n// @@protoc_insertion_point(includes)\n\nnamespace persons {\n\n// Internal implementation detail -- do not call these.\nvoid  protobuf_AddDesc_protocol_2dbuffer_2eproto();\nvoid protobuf_AssignDesc_protocol_2dbuffer_2eproto();\nvoid protobuf_ShutdownFile_protocol_2dbuffer_2eproto();\n\nclass Person;\n\n// ===================================================================\n\nclass Person : public ::google::protobuf::Message {\n public:\n  Person();\n  virtual ~Person();\n\n  Person(const Person& from);\n\n  inline Person& operator=(const Person& from) {\n    CopyFrom(from);\n    return *this;\n  }\n\n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n\n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n\n  static const ::google::protobuf::Descriptor* descriptor();\n  static const Person& default_instance();\n\n  void Swap(Person* other);\n\n  // implements Message ----------------------------------------------\n\n  Person* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const Person& from);\n  void MergeFrom(const Person& from);\n  void Clear();\n  bool IsInitialized() const;\n\n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n\n  ::google::protobuf::Metadata GetMetadata() const;\n\n  // nested types ----------------------------------------------------\n\n  // accessors -------------------------------------------------------\n\n  // required string name = 1;\n  inline bool has_name() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 1;\n  inline const ::std::string& name() const;\n  inline void set_name(const ::std::string& value);\n  inline void set_name(const char* value);\n  inline void set_name(const char* value, size_t size);\n  inline ::std::string* mutable_name();\n  inline ::std::string* release_name();\n  inline void set_allocated_name(::std::string* name);\n\n  // @@protoc_insertion_point(class_scope:persons.Person)\n private:\n  inline void set_has_name();\n  inline void clear_has_name();\n\n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n\n  ::std::string* name_;\n\n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];\n\n  friend void  protobuf_AddDesc_protocol_2dbuffer_2eproto();\n  friend void protobuf_AssignDesc_protocol_2dbuffer_2eproto();\n  friend void protobuf_ShutdownFile_protocol_2dbuffer_2eproto();\n\n  void InitAsDefaultInstance();\n  static Person* default_instance_;\n};\n// ===================================================================\n\n\n// ===================================================================\n\n// Person\n\n// required string name = 1;\ninline bool Person::has_name() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void Person::set_has_name() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void Person::clear_has_name() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void Person::clear_name() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    name_->clear();\n  }\n  clear_has_name();\n}\ninline const ::std::string& Person::name() const {\n  return *name_;\n}\ninline void Person::set_name(const ::std::string& value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void Person::set_name(const char* value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void Person::set_name(const char* value, size_t size) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* Person::mutable_name() {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  return name_;\n}\ninline ::std::string* Person::release_name() {\n  clear_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_;\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\ninline void Person::set_allocated_name(::std::string* name) {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (name) {\n    set_has_name();\n    name_ = name;\n  } else {\n    clear_has_name();\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  }\n}\n\n\n// @@protoc_insertion_point(namespace_scope)\n\n}  // namespace persons\n\n#ifndef SWIG\nnamespace google {\nnamespace protobuf {\n\n\n}  // namespace google\n}  // namespace protobuf\n#endif  // SWIG\n\n// @@protoc_insertion_point(global_scope)\n\n#endif  // PROTOBUF_protocol_2dbuffer_2eproto__INCLUDED\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/render_adapter.cpp",
    "content": "#include <cstdint>\r\n\r\nnamespace Gui\r\n{\r\n\r\n}\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/rpc.h",
    "content": "// Copyright (C) 2013 Simon Que\n//\n// This file is part of DuinoCube.\n//\n// DuinoCube is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// DuinoCube is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with DuinoCube.  If not, see <http://www.gnu.org/licenses/>.\n\n// DuinoCube remote procedure call functions.\n\n#include <stdint.h>\n\n// Initializes RPC system.\nvoid rpc_init();\n\n// Runs the RPC server loop forever.\nvoid rpc_server_loop();\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/scanner.cc",
    "content": "// Copyright 2011 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n//       copyright notice, this list of conditions and the following\n//       disclaimer in the documentation and/or other materials provided\n//       with the distribution.\n//     * Neither the name of Google Inc. nor the names of its\n//       contributors may be used to endorse or promote products derived\n//       from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Features shared by parsing and pre-parsing scanners.\n\n#include \"scanner.h\"\n\n#include \"../include/v8stdint.h\"\n#include \"char-predicates-inl.h\"\n\nnamespace v8 {\nnamespace internal {\n\n// ----------------------------------------------------------------------------\n// Scanner\n\nScanner::Scanner(UnicodeCache* unicode_cache)\n    : unicode_cache_(unicode_cache),\n      octal_pos_(Location::invalid()),\n      harmony_scoping_(false),\n      harmony_modules_(false) { }\n\n\nvoid Scanner::Initialize(Utf16CharacterStream* source) {\n  source_ = source;\n  // Need to capture identifiers in order to recognize \"get\" and \"set\"\n  // in object literals.\n  Init();\n  // Skip initial whitespace allowing HTML comment ends just like\n  // after a newline and scan first token.\n  has_line_terminator_before_next_ = true;\n  SkipWhiteSpace();\n  Scan();\n}\n\n\nuc32 Scanner::ScanHexNumber(int expected_length) {\n  ASSERT(expected_length <= 4);  // prevent overflow\n\n  uc32 digits[4] = { 0, 0, 0, 0 };\n  uc32 x = 0;\n  for (int i = 0; i < expected_length; i++) {\n    digits[i] = c0_;\n    int d = HexValue(c0_);\n    if (d < 0) {\n      // According to ECMA-262, 3rd, 7.8.4, page 18, these hex escapes\n      // should be illegal, but other JS VMs just return the\n      // non-escaped version of the original character.\n\n      // Push back digits that we have advanced past.\n      for (int j = i-1; j >= 0; j--) {\n        PushBack(digits[j]);\n      }\n      return -1;\n    }\n    x = x * 16 + d;\n    Advance();\n  }\n\n  return x;\n}\n\n\n// Ensure that tokens can be stored in a byte.\nSTATIC_ASSERT(Token::NUM_TOKENS <= 0x100);\n\n// Table of one-character tokens, by character (0x00..0x7f only).\nstatic const byte one_char_tokens[] = {\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::LPAREN,       // 0x28\n  Token::RPAREN,       // 0x29\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::COMMA,        // 0x2c\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::COLON,        // 0x3a\n  Token::SEMICOLON,    // 0x3b\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::CONDITIONAL,  // 0x3f\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::LBRACK,     // 0x5b\n  Token::ILLEGAL,\n  Token::RBRACK,     // 0x5d\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::LBRACE,       // 0x7b\n  Token::ILLEGAL,\n  Token::RBRACE,       // 0x7d\n  Token::BIT_NOT,      // 0x7e\n  Token::ILLEGAL\n};\n\n\nToken::Value Scanner::Next() {\n  current_ = next_;\n  has_line_terminator_before_next_ = false;\n  has_multiline_comment_before_next_ = false;\n  if (static_cast<unsigned>(c0_) <= 0x7f) {\n    Token::Value token = static_cast<Token::Value>(one_char_tokens[c0_]);\n    if (token != Token::ILLEGAL) {\n      int pos = source_pos();\n      next_.token = token;\n      next_.location.beg_pos = pos;\n      next_.location.end_pos = pos + 1;\n      Advance();\n      return current_.token;\n    }\n  }\n  Scan();\n  return current_.token;\n}\n\n\nstatic inline bool IsByteOrderMark(uc32 c) {\n  // The Unicode value U+FFFE is guaranteed never to be assigned as a\n  // Unicode character; this implies that in a Unicode context the\n  // 0xFF, 0xFE byte pattern can only be interpreted as the U+FEFF\n  // character expressed in little-endian byte order (since it could\n  // not be a U+FFFE character expressed in big-endian byte\n  // order). Nevertheless, we check for it to be compatible with\n  // Spidermonkey.\n  return c == 0xFEFF || c == 0xFFFE;\n}\n\n\nbool Scanner::SkipWhiteSpace() {\n  int start_position = source_pos();\n\n  while (true) {\n    // We treat byte-order marks (BOMs) as whitespace for better\n    // compatibility with Spidermonkey and other JavaScript engines.\n    while (unicode_cache_->IsWhiteSpace(c0_) || IsByteOrderMark(c0_)) {\n      // IsWhiteSpace() includes line terminators!\n      if (unicode_cache_->IsLineTerminator(c0_)) {\n        // Ignore line terminators, but remember them. This is necessary\n        // for automatic semicolon insertion.\n        has_line_terminator_before_next_ = true;\n      }\n      Advance();\n    }\n\n    // If there is an HTML comment end '-->' at the beginning of a\n    // line (with only whitespace in front of it), we treat the rest\n    // of the line as a comment. This is in line with the way\n    // SpiderMonkey handles it.\n    if (c0_ == '-' && has_line_terminator_before_next_) {\n      Advance();\n      if (c0_ == '-') {\n        Advance();\n        if (c0_ == '>') {\n          // Treat the rest of the line as a comment.\n          SkipSingleLineComment();\n          // Continue skipping white space after the comment.\n          continue;\n        }\n        PushBack('-');  // undo Advance()\n      }\n      PushBack('-');  // undo Advance()\n    }\n    // Return whether or not we skipped any characters.\n    return source_pos() != start_position;\n  }\n}\n\n\nToken::Value Scanner::SkipSingleLineComment() {\n  Advance();\n\n  // The line terminator at the end of the line is not considered\n  // to be part of the single-line comment; it is recognized\n  // separately by the lexical grammar and becomes part of the\n  // stream of input elements for the syntactic grammar (see\n  // ECMA-262, section 7.4).\n  while (c0_ >= 0 && !unicode_cache_->IsLineTerminator(c0_)) {\n    Advance();\n  }\n\n  return Token::WHITESPACE;\n}\n\n\nToken::Value Scanner::SkipMultiLineComment() {\n  ASSERT(c0_ == '*');\n  Advance();\n\n  while (c0_ >= 0) {\n    uc32 ch = c0_;\n    Advance();\n    if (unicode_cache_->IsLineTerminator(ch)) {\n      // Following ECMA-262, section 7.4, a comment containing\n      // a newline will make the comment count as a line-terminator.\n      has_multiline_comment_before_next_ = true;\n    }\n    // If we have reached the end of the multi-line comment, we\n    // consume the '/' and insert a whitespace. This way all\n    // multi-line comments are treated as whitespace.\n    if (ch == '*' && c0_ == '/') {\n      c0_ = ' ';\n      return Token::WHITESPACE;\n    }\n  }\n\n  // Unterminated multi-line comment.\n  return Token::ILLEGAL;\n}\n\n\nToken::Value Scanner::ScanHtmlComment() {\n  // Check for <!-- comments.\n  ASSERT(c0_ == '!');\n  Advance();\n  if (c0_ == '-') {\n    Advance();\n    if (c0_ == '-') return SkipSingleLineComment();\n    PushBack('-');  // undo Advance()\n  }\n  PushBack('!');  // undo Advance()\n  ASSERT(c0_ == '!');\n  return Token::LT;\n}\n\n\nvoid Scanner::Scan() {\n  next_.literal_chars = NULL;\n  Token::Value token;\n  do {\n    // Remember the position of the next token\n    next_.location.beg_pos = source_pos();\n\n    switch (c0_) {\n      case ' ':\n      case '\\t':\n        Advance();\n        token = Token::WHITESPACE;\n        break;\n\n      case '\\n':\n        Advance();\n        has_line_terminator_before_next_ = true;\n        token = Token::WHITESPACE;\n        break;\n\n      case '\"': case '\\'':\n        token = ScanString();\n        break;\n\n      case '<':\n        // < <= << <<= <!--\n        Advance();\n        if (c0_ == '=') {\n          token = Select(Token::LTE);\n        } else if (c0_ == '<') {\n          token = Select('=', Token::ASSIGN_SHL, Token::SHL);\n        } else if (c0_ == '!') {\n          token = ScanHtmlComment();\n        } else {\n          token = Token::LT;\n        }\n        break;\n\n      case '>':\n        // > >= >> >>= >>> >>>=\n        Advance();\n        if (c0_ == '=') {\n          token = Select(Token::GTE);\n        } else if (c0_ == '>') {\n          // >> >>= >>> >>>=\n          Advance();\n          if (c0_ == '=') {\n            token = Select(Token::ASSIGN_SAR);\n          } else if (c0_ == '>') {\n            token = Select('=', Token::ASSIGN_SHR, Token::SHR);\n          } else {\n            token = Token::SAR;\n          }\n        } else {\n          token = Token::GT;\n        }\n        break;\n\n      case '=':\n        // = == ===\n        Advance();\n        if (c0_ == '=') {\n          token = Select('=', Token::EQ_STRICT, Token::EQ);\n        } else {\n          token = Token::ASSIGN;\n        }\n        break;\n\n      case '!':\n        // ! != !==\n        Advance();\n        if (c0_ == '=') {\n          token = Select('=', Token::NE_STRICT, Token::NE);\n        } else {\n          token = Token::NOT;\n        }\n        break;\n\n      case '+':\n        // + ++ +=\n        Advance();\n        if (c0_ == '+') {\n          token = Select(Token::INC);\n        } else if (c0_ == '=') {\n          token = Select(Token::ASSIGN_ADD);\n        } else {\n          token = Token::ADD;\n        }\n        break;\n\n      case '-':\n        // - -- --> -=\n        Advance();\n        if (c0_ == '-') {\n          Advance();\n          if (c0_ == '>' && has_line_terminator_before_next_) {\n            // For compatibility with SpiderMonkey, we skip lines that\n            // start with an HTML comment end '-->'.\n            token = SkipSingleLineComment();\n          } else {\n            token = Token::DEC;\n          }\n        } else if (c0_ == '=') {\n          token = Select(Token::ASSIGN_SUB);\n        } else {\n          token = Token::SUB;\n        }\n        break;\n\n      case '*':\n        // * *=\n        token = Select('=', Token::ASSIGN_MUL, Token::MUL);\n        break;\n\n      case '%':\n        // % %=\n        token = Select('=', Token::ASSIGN_MOD, Token::MOD);\n        break;\n\n      case '/':\n        // /  // /* /=\n        Advance();\n        if (c0_ == '/') {\n          token = SkipSingleLineComment();\n        } else if (c0_ == '*') {\n          token = SkipMultiLineComment();\n        } else if (c0_ == '=') {\n          token = Select(Token::ASSIGN_DIV);\n        } else {\n          token = Token::DIV;\n        }\n        break;\n\n      case '&':\n        // & && &=\n        Advance();\n        if (c0_ == '&') {\n          token = Select(Token::AND);\n        } else if (c0_ == '=') {\n          token = Select(Token::ASSIGN_BIT_AND);\n        } else {\n          token = Token::BIT_AND;\n        }\n        break;\n\n      case '|':\n        // | || |=\n        Advance();\n        if (c0_ == '|') {\n          token = Select(Token::OR);\n        } else if (c0_ == '=') {\n          token = Select(Token::ASSIGN_BIT_OR);\n        } else {\n          token = Token::BIT_OR;\n        }\n        break;\n\n      case '^':\n        // ^ ^=\n        token = Select('=', Token::ASSIGN_BIT_XOR, Token::BIT_XOR);\n        break;\n\n      case '.':\n        // . Number\n        Advance();\n        if (IsDecimalDigit(c0_)) {\n          token = ScanNumber(true);\n        } else {\n          token = Token::PERIOD;\n        }\n        break;\n\n      case ':':\n        token = Select(Token::COLON);\n        break;\n\n      case ';':\n        token = Select(Token::SEMICOLON);\n        break;\n\n      case ',':\n        token = Select(Token::COMMA);\n        break;\n\n      case '(':\n        token = Select(Token::LPAREN);\n        break;\n\n      case ')':\n        token = Select(Token::RPAREN);\n        break;\n\n      case '[':\n        token = Select(Token::LBRACK);\n        break;\n\n      case ']':\n        token = Select(Token::RBRACK);\n        break;\n\n      case '{':\n        token = Select(Token::LBRACE);\n        break;\n\n      case '}':\n        token = Select(Token::RBRACE);\n        break;\n\n      case '?':\n        token = Select(Token::CONDITIONAL);\n        break;\n\n      case '~':\n        token = Select(Token::BIT_NOT);\n        break;\n\n      default:\n        if (unicode_cache_->IsIdentifierStart(c0_)) {\n          token = ScanIdentifierOrKeyword();\n        } else if (IsDecimalDigit(c0_)) {\n          token = ScanNumber(false);\n        } else if (SkipWhiteSpace()) {\n          token = Token::WHITESPACE;\n        } else if (c0_ < 0) {\n          token = Token::EOS;\n        } else {\n          token = Select(Token::ILLEGAL);\n        }\n        break;\n    }\n\n    // Continue scanning for tokens as long as we're just skipping\n    // whitespace.\n  } while (token == Token::WHITESPACE);\n\n  next_.location.end_pos = source_pos();\n  next_.token = token;\n}\n\n\nvoid Scanner::SeekForward(int pos) {\n  // After this call, we will have the token at the given position as\n  // the \"next\" token. The \"current\" token will be invalid.\n  if (pos == next_.location.beg_pos) return;\n  int current_pos = source_pos();\n  ASSERT_EQ(next_.location.end_pos, current_pos);\n  // Positions inside the lookahead token aren't supported.\n  ASSERT(pos >= current_pos);\n  if (pos != current_pos) {\n    source_->SeekForward(pos - source_->pos());\n    Advance();\n    // This function is only called to seek to the location\n    // of the end of a function (at the \"}\" token). It doesn't matter\n    // whether there was a line terminator in the part we skip.\n    has_line_terminator_before_next_ = false;\n    has_multiline_comment_before_next_ = false;\n  }\n  Scan();\n}\n\n\nbool Scanner::ScanEscape() {\n  uc32 c = c0_;\n  Advance();\n\n  // Skip escaped newlines.\n  if (unicode_cache_->IsLineTerminator(c)) {\n    // Allow CR+LF newlines in multiline string literals.\n    if (IsCarriageReturn(c) && IsLineFeed(c0_)) Advance();\n    // Allow LF+CR newlines in multiline string literals.\n    if (IsLineFeed(c) && IsCarriageReturn(c0_)) Advance();\n    return true;\n  }\n\n  switch (c) {\n    case '\\'':  // fall through\n    case '\"' :  // fall through\n    case '\\\\': break;\n    case 'b' : c = '\\b'; break;\n    case 'f' : c = '\\f'; break;\n    case 'n' : c = '\\n'; break;\n    case 'r' : c = '\\r'; break;\n    case 't' : c = '\\t'; break;\n    case 'u' : {\n      c = ScanHexNumber(4);\n      if (c < 0) return false;\n      break;\n    }\n    case 'v' : c = '\\v'; break;\n    case 'x' : {\n      c = ScanHexNumber(2);\n      if (c < 0) return false;\n      break;\n    }\n    case '0' :  // fall through\n    case '1' :  // fall through\n    case '2' :  // fall through\n    case '3' :  // fall through\n    case '4' :  // fall through\n    case '5' :  // fall through\n    case '6' :  // fall through\n    case '7' : c = ScanOctalEscape(c, 2); break;\n  }\n\n  // According to ECMA-262, section 7.8.4, characters not covered by the\n  // above cases should be illegal, but they are commonly handled as\n  // non-escaped characters by JS VMs.\n  AddLiteralChar(c);\n  return true;\n}\n\n\n// Octal escapes of the forms '\\0xx' and '\\xxx' are not a part of\n// ECMA-262. Other JS VMs support them.\nuc32 Scanner::ScanOctalEscape(uc32 c, int length) {\n  uc32 x = c - '0';\n  int i = 0;\n  for (; i < length; i++) {\n    int d = c0_ - '0';\n    if (d < 0 || d > 7) break;\n    int nx = x * 8 + d;\n    if (nx >= 256) break;\n    x = nx;\n    Advance();\n  }\n  // Anything except '\\0' is an octal escape sequence, illegal in strict mode.\n  // Remember the position of octal escape sequences so that an error\n  // can be reported later (in strict mode).\n  // We don't report the error immediately, because the octal escape can\n  // occur before the \"use strict\" directive.\n  if (c != '0' || i > 0) {\n    octal_pos_ = Location(source_pos() - i - 1, source_pos() - 1);\n  }\n  return x;\n}\n\n\nToken::Value Scanner::ScanString() {\n  uc32 quote = c0_;\n  Advance();  // consume quote\n\n  LiteralScope literal(this);\n  while (c0_ != quote && c0_ >= 0\n         && !unicode_cache_->IsLineTerminator(c0_)) {\n    uc32 c = c0_;\n    Advance();\n    if (c == '\\\\') {\n      if (c0_ < 0 || !ScanEscape()) return Token::ILLEGAL;\n    } else {\n      AddLiteralChar(c);\n    }\n  }\n  if (c0_ != quote) return Token::ILLEGAL;\n  literal.Complete();\n\n  Advance();  // consume quote\n  return Token::STRING;\n}\n\n\nvoid Scanner::ScanDecimalDigits() {\n  while (IsDecimalDigit(c0_))\n    AddLiteralCharAdvance();\n}\n\n\nToken::Value Scanner::ScanNumber(bool seen_period) {\n  ASSERT(IsDecimalDigit(c0_));  // the first digit of the number or the fraction\n\n  enum { DECIMAL, HEX, OCTAL } kind = DECIMAL;\n\n  LiteralScope literal(this);\n  if (seen_period) {\n    // we have already seen a decimal point of the float\n    AddLiteralChar('.');\n    ScanDecimalDigits();  // we know we have at least one digit\n\n  } else {\n    // if the first character is '0' we must check for octals and hex\n    if (c0_ == '0') {\n      int start_pos = source_pos();  // For reporting octal positions.\n      AddLiteralCharAdvance();\n\n      // either 0, 0exxx, 0Exxx, 0.xxx, an octal number, or a hex number\n      if (c0_ == 'x' || c0_ == 'X') {\n        // hex number\n        kind = HEX;\n        AddLiteralCharAdvance();\n        if (!IsHexDigit(c0_)) {\n          // we must have at least one hex digit after 'x'/'X'\n          return Token::ILLEGAL;\n        }\n        while (IsHexDigit(c0_)) {\n          AddLiteralCharAdvance();\n        }\n      } else if ('0' <= c0_ && c0_ <= '7') {\n        // (possible) octal number\n        kind = OCTAL;\n        while (true) {\n          if (c0_ == '8' || c0_ == '9') {\n            kind = DECIMAL;\n            break;\n          }\n          if (c0_  < '0' || '7'  < c0_) {\n            // Octal literal finished.\n            octal_pos_ = Location(start_pos, source_pos());\n            break;\n          }\n          AddLiteralCharAdvance();\n        }\n      }\n    }\n\n    // Parse decimal digits and allow trailing fractional part.\n    if (kind == DECIMAL) {\n      ScanDecimalDigits();  // optional\n      if (c0_ == '.') {\n        AddLiteralCharAdvance();\n        ScanDecimalDigits();  // optional\n      }\n    }\n  }\n\n  // scan exponent, if any\n  if (c0_ == 'e' || c0_ == 'E') {\n    ASSERT(kind != HEX);  // 'e'/'E' must be scanned as part of the hex number\n    if (kind == OCTAL) return Token::ILLEGAL;  // no exponent for octals allowed\n    // scan exponent\n    AddLiteralCharAdvance();\n    if (c0_ == '+' || c0_ == '-')\n      AddLiteralCharAdvance();\n    if (!IsDecimalDigit(c0_)) {\n      // we must have at least one decimal digit after 'e'/'E'\n      return Token::ILLEGAL;\n    }\n    ScanDecimalDigits();\n  }\n\n  // The source character immediately following a numeric literal must\n  // not be an identifier start or a decimal digit; see ECMA-262\n  // section 7.8.3, page 17 (note that we read only one decimal digit\n  // if the value is 0).\n  if (IsDecimalDigit(c0_) || unicode_cache_->IsIdentifierStart(c0_))\n    return Token::ILLEGAL;\n\n  literal.Complete();\n\n  return Token::NUMBER;\n}\n\n\nuc32 Scanner::ScanIdentifierUnicodeEscape() {\n  Advance();\n  if (c0_ != 'u') return -1;\n  Advance();\n  uc32 result = ScanHexNumber(4);\n  if (result < 0) PushBack('u');\n  return result;\n}\n\n\n// ----------------------------------------------------------------------------\n// Keyword Matcher\n\n#define KEYWORDS(KEYWORD_GROUP, KEYWORD)                            \\\n  KEYWORD_GROUP('b')                                                \\\n  KEYWORD(\"break\", Token::BREAK)                                    \\\n  KEYWORD_GROUP('c')                                                \\\n  KEYWORD(\"case\", Token::CASE)                                      \\\n  KEYWORD(\"catch\", Token::CATCH)                                    \\\n  KEYWORD(\"class\", Token::FUTURE_RESERVED_WORD)                     \\\n  KEYWORD(\"const\", Token::CONST)                                    \\\n  KEYWORD(\"continue\", Token::CONTINUE)                              \\\n  KEYWORD_GROUP('d')                                                \\\n  KEYWORD(\"debugger\", Token::DEBUGGER)                              \\\n  KEYWORD(\"default\", Token::DEFAULT)                                \\\n  KEYWORD(\"delete\", Token::DELETE)                                  \\\n  KEYWORD(\"do\", Token::DO)                                          \\\n  KEYWORD_GROUP('e')                                                \\\n  KEYWORD(\"else\", Token::ELSE)                                      \\\n  KEYWORD(\"enum\", Token::FUTURE_RESERVED_WORD)                      \\\n  KEYWORD(\"export\", harmony_modules                                 \\\n                    ? Token::EXPORT : Token::FUTURE_RESERVED_WORD)  \\\n  KEYWORD(\"extends\", Token::FUTURE_RESERVED_WORD)                   \\\n  KEYWORD_GROUP('f')                                                \\\n  KEYWORD(\"false\", Token::FALSE_LITERAL)                            \\\n  KEYWORD(\"finally\", Token::FINALLY)                                \\\n  KEYWORD(\"for\", Token::FOR)                                        \\\n  KEYWORD(\"function\", Token::FUNCTION)                              \\\n  KEYWORD_GROUP('i')                                                \\\n  KEYWORD(\"if\", Token::IF)                                          \\\n  KEYWORD(\"implements\", Token::FUTURE_STRICT_RESERVED_WORD)         \\\n  KEYWORD(\"import\", harmony_modules                                 \\\n                    ? Token::IMPORT : Token::FUTURE_RESERVED_WORD)  \\\n  KEYWORD(\"in\", Token::IN)                                          \\\n  KEYWORD(\"instanceof\", Token::INSTANCEOF)                          \\\n  KEYWORD(\"interface\", Token::FUTURE_STRICT_RESERVED_WORD)          \\\n  KEYWORD_GROUP('l')                                                \\\n  KEYWORD(\"let\", harmony_scoping                                    \\\n                 ? Token::LET : Token::FUTURE_STRICT_RESERVED_WORD) \\\n  KEYWORD_GROUP('n')                                                \\\n  KEYWORD(\"new\", Token::NEW)                                        \\\n  KEYWORD(\"null\", Token::NULL_LITERAL)                              \\\n  KEYWORD_GROUP('p')                                                \\\n  KEYWORD(\"package\", Token::FUTURE_STRICT_RESERVED_WORD)            \\\n  KEYWORD(\"private\", Token::FUTURE_STRICT_RESERVED_WORD)            \\\n  KEYWORD(\"protected\", Token::FUTURE_STRICT_RESERVED_WORD)          \\\n  KEYWORD(\"public\", Token::FUTURE_STRICT_RESERVED_WORD)             \\\n  KEYWORD_GROUP('r')                                                \\\n  KEYWORD(\"return\", Token::RETURN)                                  \\\n  KEYWORD_GROUP('s')                                                \\\n  KEYWORD(\"static\", Token::FUTURE_STRICT_RESERVED_WORD)             \\\n  KEYWORD(\"super\", Token::FUTURE_RESERVED_WORD)                     \\\n  KEYWORD(\"switch\", Token::SWITCH)                                  \\\n  KEYWORD_GROUP('t')                                                \\\n  KEYWORD(\"this\", Token::THIS)                                      \\\n  KEYWORD(\"throw\", Token::THROW)                                    \\\n  KEYWORD(\"true\", Token::TRUE_LITERAL)                              \\\n  KEYWORD(\"try\", Token::TRY)                                        \\\n  KEYWORD(\"typeof\", Token::TYPEOF)                                  \\\n  KEYWORD_GROUP('v')                                                \\\n  KEYWORD(\"var\", Token::VAR)                                        \\\n  KEYWORD(\"void\", Token::VOID)                                      \\\n  KEYWORD_GROUP('w')                                                \\\n  KEYWORD(\"while\", Token::WHILE)                                    \\\n  KEYWORD(\"with\", Token::WITH)                                      \\\n  KEYWORD_GROUP('y')                                                \\\n  KEYWORD(\"yield\", Token::FUTURE_STRICT_RESERVED_WORD)\n\n\nstatic Token::Value KeywordOrIdentifierToken(const char* input,\n                                             int input_length,\n                                             bool harmony_scoping,\n                                             bool harmony_modules) {\n  ASSERT(input_length >= 1);\n  const int kMinLength = 2;\n  const int kMaxLength = 10;\n  if (input_length < kMinLength || input_length > kMaxLength) {\n    return Token::IDENTIFIER;\n  }\n  switch (input[0]) {\n    default:\n#define KEYWORD_GROUP_CASE(ch)                                \\\n      break;                                                  \\\n    case ch:\n#define KEYWORD(keyword, token)                               \\\n    {                                                         \\\n      /* 'keyword' is a char array, so sizeof(keyword) is */  \\\n      /* strlen(keyword) plus 1 for the NUL char. */          \\\n      const int keyword_length = sizeof(keyword) - 1;         \\\n      STATIC_ASSERT(keyword_length >= kMinLength);            \\\n      STATIC_ASSERT(keyword_length <= kMaxLength);            \\\n      if (input_length == keyword_length &&                   \\\n          input[1] == keyword[1] &&                           \\\n          (keyword_length <= 2 || input[2] == keyword[2]) &&  \\\n          (keyword_length <= 3 || input[3] == keyword[3]) &&  \\\n          (keyword_length <= 4 || input[4] == keyword[4]) &&  \\\n          (keyword_length <= 5 || input[5] == keyword[5]) &&  \\\n          (keyword_length <= 6 || input[6] == keyword[6]) &&  \\\n          (keyword_length <= 7 || input[7] == keyword[7]) &&  \\\n          (keyword_length <= 8 || input[8] == keyword[8]) &&  \\\n          (keyword_length <= 9 || input[9] == keyword[9])) {  \\\n        return token;                                         \\\n      }                                                       \\\n    }\n    KEYWORDS(KEYWORD_GROUP_CASE, KEYWORD)\n  }\n  return Token::IDENTIFIER;\n}\n\n\nToken::Value Scanner::ScanIdentifierOrKeyword() {\n  ASSERT(unicode_cache_->IsIdentifierStart(c0_));\n  LiteralScope literal(this);\n  // Scan identifier start character.\n  if (c0_ == '\\\\') {\n    uc32 c = ScanIdentifierUnicodeEscape();\n    // Only allow legal identifier start characters.\n    if (c < 0 ||\n        c == '\\\\' ||  // No recursive escapes.\n        !unicode_cache_->IsIdentifierStart(c)) {\n      return Token::ILLEGAL;\n    }\n    AddLiteralChar(c);\n    return ScanIdentifierSuffix(&literal);\n  }\n\n  uc32 first_char = c0_;\n  Advance();\n  AddLiteralChar(first_char);\n\n  // Scan the rest of the identifier characters.\n  while (unicode_cache_->IsIdentifierPart(c0_)) {\n    if (c0_ != '\\\\') {\n      uc32 next_char = c0_;\n      Advance();\n      AddLiteralChar(next_char);\n      continue;\n    }\n    // Fallthrough if no longer able to complete keyword.\n    return ScanIdentifierSuffix(&literal);\n  }\n\n  literal.Complete();\n\n  if (next_.literal_chars->is_ascii()) {\n    Vector<const char> chars = next_.literal_chars->ascii_literal();\n    return KeywordOrIdentifierToken(chars.start(),\n                                    chars.length(),\n                                    harmony_scoping_,\n                                    harmony_modules_);\n  }\n\n  return Token::IDENTIFIER;\n}\n\n\nToken::Value Scanner::ScanIdentifierSuffix(LiteralScope* literal) {\n  // Scan the rest of the identifier characters.\n  while (unicode_cache_->IsIdentifierPart(c0_)) {\n    if (c0_ == '\\\\') {\n      uc32 c = ScanIdentifierUnicodeEscape();\n      // Only allow legal identifier part characters.\n      if (c < 0 ||\n          c == '\\\\' ||\n          !unicode_cache_->IsIdentifierPart(c)) {\n        return Token::ILLEGAL;\n      }\n      AddLiteralChar(c);\n    } else {\n      AddLiteralChar(c0_);\n      Advance();\n    }\n  }\n  literal->Complete();\n\n  return Token::IDENTIFIER;\n}\n\n\nbool Scanner::ScanRegExpPattern(bool seen_equal) {\n  // Scan: ('/' | '/=') RegularExpressionBody '/' RegularExpressionFlags\n  bool in_character_class = false;\n\n  // Previous token is either '/' or '/=', in the second case, the\n  // pattern starts at =.\n  next_.location.beg_pos = source_pos() - (seen_equal ? 2 : 1);\n  next_.location.end_pos = source_pos() - (seen_equal ? 1 : 0);\n\n  // Scan regular expression body: According to ECMA-262, 3rd, 7.8.5,\n  // the scanner should pass uninterpreted bodies to the RegExp\n  // constructor.\n  LiteralScope literal(this);\n  if (seen_equal) {\n    AddLiteralChar('=');\n  }\n\n  while (c0_ != '/' || in_character_class) {\n    if (unicode_cache_->IsLineTerminator(c0_) || c0_ < 0) return false;\n    if (c0_ == '\\\\') {  // Escape sequence.\n      AddLiteralCharAdvance();\n      if (unicode_cache_->IsLineTerminator(c0_) || c0_ < 0) return false;\n      AddLiteralCharAdvance();\n      // If the escape allows more characters, i.e., \\x??, \\u????, or \\c?,\n      // only \"safe\" characters are allowed (letters, digits, underscore),\n      // otherwise the escape isn't valid and the invalid character has\n      // its normal meaning. I.e., we can just continue scanning without\n      // worrying whether the following characters are part of the escape\n      // or not, since any '/', '\\\\' or '[' is guaranteed to not be part\n      // of the escape sequence.\n\n      // TODO(896): At some point, parse RegExps more throughly to capture\n      // octal esacpes in strict mode.\n    } else {  // Unescaped character.\n      if (c0_ == '[') in_character_class = true;\n      if (c0_ == ']') in_character_class = false;\n      AddLiteralCharAdvance();\n    }\n  }\n  Advance();  // consume '/'\n\n  literal.Complete();\n\n  return true;\n}\n\n\nbool Scanner::ScanLiteralUnicodeEscape() {\n  ASSERT(c0_ == '\\\\');\n  uc32 chars_read[6] = {'\\\\', 'u', 0, 0, 0, 0};\n  Advance();\n  int i = 1;\n  if (c0_ == 'u') {\n    i++;\n    while (i < 6) {\n      Advance();\n      if (!IsHexDigit(c0_)) break;\n      chars_read[i] = c0_;\n      i++;\n    }\n  }\n  if (i < 6) {\n    // Incomplete escape. Undo all advances and return false.\n    while (i > 0) {\n      i--;\n      PushBack(chars_read[i]);\n    }\n    return false;\n  }\n  // Complete escape. Add all chars to current literal buffer.\n  for (int i = 0; i < 6; i++) {\n    AddLiteralChar(chars_read[i]);\n  }\n  return true;\n}\n\n\nbool Scanner::ScanRegExpFlags() {\n  // Scan regular expression flags.\n  LiteralScope literal(this);\n  while (unicode_cache_->IsIdentifierPart(c0_)) {\n    if (c0_ != '\\\\') {\n      AddLiteralCharAdvance();\n    } else {\n      if (!ScanLiteralUnicodeEscape()) {\n        break;\n      }\n    }\n  }\n  literal.Complete();\n\n  next_.location.end_pos = source_pos() - 1;\n  return true;\n}\n\n} }  // namespace v8::internal\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/scanner.h",
    "content": "// Copyright 2011 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n//       copyright notice, this list of conditions and the following\n//       disclaimer in the documentation and/or other materials provided\n//       with the distribution.\n//     * Neither the name of Google Inc. nor the names of its\n//       contributors may be used to endorse or promote products derived\n//       from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Features shared by parsing and pre-parsing scanners.\n\n#ifndef V8_SCANNER_H_\n#define V8_SCANNER_H_\n\n#include \"allocation.h\"\n#include \"char-predicates.h\"\n#include \"checks.h\"\n#include \"globals.h\"\n#include \"token.h\"\n#include \"unicode-inl.h\"\n#include \"utils.h\"\n\nnamespace v8 {\nnamespace internal {\n\n\n// General collection of (multi-)bit-flags that can be passed to scanners and\n// parsers to signify their (initial) mode of operation.\nenum ParsingFlags {\n  kNoParsingFlags = 0,\n  // Embed LanguageMode values in parsing flags, i.e., equivalent to:\n  // CLASSIC_MODE = 0,\n  // STRICT_MODE,\n  // EXTENDED_MODE,\n  kLanguageModeMask = 0x03,\n  kAllowLazy = 0x04,\n  kAllowNativesSyntax = 0x08,\n  kAllowModules = 0x10\n};\n\nSTATIC_ASSERT((kLanguageModeMask & CLASSIC_MODE) == CLASSIC_MODE);\nSTATIC_ASSERT((kLanguageModeMask & STRICT_MODE) == STRICT_MODE);\nSTATIC_ASSERT((kLanguageModeMask & EXTENDED_MODE) == EXTENDED_MODE);\n\n\n// Returns the value (0 .. 15) of a hexadecimal character c.\n// If c is not a legal hexadecimal character, returns a value < 0.\ninline int HexValue(uc32 c) {\n  c -= '0';\n  if (static_cast<unsigned>(c) <= 9) return c;\n  c = (c | 0x20) - ('a' - '0');  // detect 0x11..0x16 and 0x31..0x36.\n  if (static_cast<unsigned>(c) <= 5) return c + 10;\n  return -1;\n}\n\n\n// ---------------------------------------------------------------------\n// Buffered stream of UTF-16 code units, using an internal UTF-16 buffer.\n// A code unit is a 16 bit value representing either a 16 bit code point\n// or one part of a surrogate pair that make a single 21 bit code point.\n\nclass Utf16CharacterStream {\n public:\n  Utf16CharacterStream() : pos_(0) { }\n  virtual ~Utf16CharacterStream() { }\n\n  // Returns and advances past the next UTF-16 code unit in the input\n  // stream. If there are no more code units, it returns a negative\n  // value.\n  inline uc32 Advance() {\n    if (buffer_cursor_ < buffer_end_ || ReadBlock()) {\n      pos_++;\n      return static_cast<uc32>(*(buffer_cursor_++));\n    }\n    // Note: currently the following increment is necessary to avoid a\n    // parser problem! The scanner treats the final kEndOfInput as\n    // a code unit with a position, and does math relative to that\n    // position.\n    pos_++;\n\n    return kEndOfInput;\n  }\n\n  // Return the current position in the code unit stream.\n  // Starts at zero.\n  inline unsigned pos() const { return pos_; }\n\n  // Skips forward past the next code_unit_count UTF-16 code units\n  // in the input, or until the end of input if that comes sooner.\n  // Returns the number of code units actually skipped. If less\n  // than code_unit_count,\n  inline unsigned SeekForward(unsigned code_unit_count) {\n    unsigned buffered_chars =\n        static_cast<unsigned>(buffer_end_ - buffer_cursor_);\n    if (code_unit_count <= buffered_chars) {\n      buffer_cursor_ += code_unit_count;\n      pos_ += code_unit_count;\n      return code_unit_count;\n    }\n    return SlowSeekForward(code_unit_count);\n  }\n\n  // Pushes back the most recently read UTF-16 code unit (or negative\n  // value if at end of input), i.e., the value returned by the most recent\n  // call to Advance.\n  // Must not be used right after calling SeekForward.\n  virtual void PushBack(int32_t code_unit) = 0;\n\n protected:\n  static const uc32 kEndOfInput = -1;\n\n  // Ensures that the buffer_cursor_ points to the code_unit at\n  // position pos_ of the input, if possible. If the position\n  // is at or after the end of the input, return false. If there\n  // are more code_units available, return true.\n  virtual bool ReadBlock() = 0;\n  virtual unsigned SlowSeekForward(unsigned code_unit_count) = 0;\n\n  const uc16* buffer_cursor_;\n  const uc16* buffer_end_;\n  unsigned pos_;\n};\n\n\nclass UnicodeCache {\n// ---------------------------------------------------------------------\n// Caching predicates used by scanners.\n public:\n  UnicodeCache() {}\n  typedef unibrow::Utf8InputBuffer<1024> Utf8Decoder;\n\n  StaticResource<Utf8Decoder>* utf8_decoder() {\n    return &utf8_decoder_;\n  }\n\n  bool IsIdentifierStart(unibrow::uchar c) { return kIsIdentifierStart.get(c); }\n  bool IsIdentifierPart(unibrow::uchar c) { return kIsIdentifierPart.get(c); }\n  bool IsLineTerminator(unibrow::uchar c) { return kIsLineTerminator.get(c); }\n  bool IsWhiteSpace(unibrow::uchar c) { return kIsWhiteSpace.get(c); }\n\n private:\n  unibrow::Predicate<IdentifierStart, 128> kIsIdentifierStart;\n  unibrow::Predicate<IdentifierPart, 128> kIsIdentifierPart;\n  unibrow::Predicate<unibrow::LineTerminator, 128> kIsLineTerminator;\n  unibrow::Predicate<unibrow::WhiteSpace, 128> kIsWhiteSpace;\n  StaticResource<Utf8Decoder> utf8_decoder_;\n\n  DISALLOW_COPY_AND_ASSIGN(UnicodeCache);\n};\n\n\n// ----------------------------------------------------------------------------\n// LiteralBuffer -  Collector of chars of literals.\n\nclass LiteralBuffer {\n public:\n  LiteralBuffer() : is_ascii_(true), position_(0), backing_store_() { }\n\n  ~LiteralBuffer() {\n    if (backing_store_.length() > 0) {\n      backing_store_.Dispose();\n    }\n  }\n\n  INLINE(void AddChar(uint32_t code_unit)) {\n    if (position_ >= backing_store_.length()) ExpandBuffer();\n    if (is_ascii_) {\n      if (code_unit < kMaxAsciiCharCodeU) {\n        backing_store_[position_] = static_cast<byte>(code_unit);\n        position_ += kASCIISize;\n        return;\n      }\n      ConvertToUtf16();\n    }\n    ASSERT(code_unit < 0x10000u);\n    *reinterpret_cast<uc16*>(&backing_store_[position_]) = code_unit;\n    position_ += kUC16Size;\n  }\n\n  bool is_ascii() { return is_ascii_; }\n\n  Vector<const uc16> utf16_literal() {\n    ASSERT(!is_ascii_);\n    ASSERT((position_ & 0x1) == 0);\n    return Vector<const uc16>(\n        reinterpret_cast<const uc16*>(backing_store_.start()),\n        position_ >> 1);\n  }\n\n  Vector<const char> ascii_literal() {\n    ASSERT(is_ascii_);\n    return Vector<const char>(\n        reinterpret_cast<const char*>(backing_store_.start()),\n        position_);\n  }\n\n  int length() {\n    return is_ascii_ ? position_ : (position_ >> 1);\n  }\n\n  void Reset() {\n    position_ = 0;\n    is_ascii_ = true;\n  }\n\n private:\n  static const int kInitialCapacity = 16;\n  static const int kGrowthFactory = 4;\n  static const int kMinConversionSlack = 256;\n  static const int kMaxGrowth = 1 * MB;\n  inline int NewCapacity(int min_capacity) {\n    int capacity = Max(min_capacity, backing_store_.length());\n    int new_capacity = Min(capacity * kGrowthFactory, capacity + kMaxGrowth);\n    return new_capacity;\n  }\n\n  void ExpandBuffer() {\n    Vector<byte> new_store = Vector<byte>::New(NewCapacity(kInitialCapacity));\n    memcpy(new_store.start(), backing_store_.start(), position_);\n    backing_store_.Dispose();\n    backing_store_ = new_store;\n  }\n\n  void ConvertToUtf16() {\n    ASSERT(is_ascii_);\n    Vector<byte> new_store;\n    int new_content_size = position_ * kUC16Size;\n    if (new_content_size >= backing_store_.length()) {\n      // Ensure room for all currently read code units as UC16 as well\n      // as the code unit about to be stored.\n      new_store = Vector<byte>::New(NewCapacity(new_content_size));\n    } else {\n      new_store = backing_store_;\n    }\n    char* src = reinterpret_cast<char*>(backing_store_.start());\n    uc16* dst = reinterpret_cast<uc16*>(new_store.start());\n    for (int i = position_ - 1; i >= 0; i--) {\n      dst[i] = src[i];\n    }\n    if (new_store.start() != backing_store_.start()) {\n      backing_store_.Dispose();\n      backing_store_ = new_store;\n    }\n    position_ = new_content_size;\n    is_ascii_ = false;\n  }\n\n  bool is_ascii_;\n  int position_;\n  Vector<byte> backing_store_;\n\n  DISALLOW_COPY_AND_ASSIGN(LiteralBuffer);\n};\n\n\n// ----------------------------------------------------------------------------\n// JavaScript Scanner.\n\nclass Scanner {\n public:\n  // Scoped helper for literal recording. Automatically drops the literal\n  // if aborting the scanning before it's complete.\n  class LiteralScope {\n   public:\n    explicit LiteralScope(Scanner* self)\n        : scanner_(self), complete_(false) {\n      scanner_->StartLiteral();\n    }\n     ~LiteralScope() {\n       if (!complete_) scanner_->DropLiteral();\n     }\n    void Complete() {\n      scanner_->TerminateLiteral();\n      complete_ = true;\n    }\n\n   private:\n    Scanner* scanner_;\n    bool complete_;\n  };\n\n  // Representation of an interval of source positions.\n  struct Location {\n    Location(int b, int e) : beg_pos(b), end_pos(e) { }\n    Location() : beg_pos(0), end_pos(0) { }\n\n    bool IsValid() const {\n      return beg_pos >= 0 && end_pos >= beg_pos;\n    }\n\n    static Location invalid() { return Location(-1, -1); }\n\n    int beg_pos;\n    int end_pos;\n  };\n\n  // -1 is outside of the range of any real source code.\n  static const int kNoOctalLocation = -1;\n\n  typedef unibrow::Utf8InputBuffer<1024> Utf8Decoder;\n\n  explicit Scanner(UnicodeCache* scanner_contants);\n\n  void Initialize(Utf16CharacterStream* source);\n\n  // Returns the next token and advances input.\n  Token::Value Next();\n  // Returns the current token again.\n  Token::Value current_token() { return current_.token; }\n  // Returns the location information for the current token\n  // (the token last returned by Next()).\n  Location location() const { return current_.location; }\n  // Returns the literal string, if any, for the current token (the\n  // token last returned by Next()). The string is 0-terminated.\n  // Literal strings are collected for identifiers, strings, and\n  // numbers.\n  // These functions only give the correct result if the literal\n  // was scanned between calls to StartLiteral() and TerminateLiteral().\n  Vector<const char> literal_ascii_string() {\n    ASSERT_NOT_NULL(current_.literal_chars);\n    return current_.literal_chars->ascii_literal();\n  }\n  Vector<const uc16> literal_utf16_string() {\n    ASSERT_NOT_NULL(current_.literal_chars);\n    return current_.literal_chars->utf16_literal();\n  }\n  bool is_literal_ascii() {\n    ASSERT_NOT_NULL(current_.literal_chars);\n    return current_.literal_chars->is_ascii();\n  }\n  int literal_length() const {\n    ASSERT_NOT_NULL(current_.literal_chars);\n    return current_.literal_chars->length();\n  }\n\n  bool literal_contains_escapes() const {\n    Location location = current_.location;\n    int source_length = (location.end_pos - location.beg_pos);\n    if (current_.token == Token::STRING) {\n      // Subtract delimiters.\n      source_length -= 2;\n    }\n    return current_.literal_chars->length() != source_length;\n  }\n\n  // Similar functions for the upcoming token.\n\n  // One token look-ahead (past the token returned by Next()).\n  Token::Value peek() const { return next_.token; }\n\n  Location peek_location() const { return next_.location; }\n\n  // Returns the literal string for the next token (the token that\n  // would be returned if Next() were called).\n  Vector<const char> next_literal_ascii_string() {\n    ASSERT_NOT_NULL(next_.literal_chars);\n    return next_.literal_chars->ascii_literal();\n  }\n  Vector<const uc16> next_literal_utf16_string() {\n    ASSERT_NOT_NULL(next_.literal_chars);\n    return next_.literal_chars->utf16_literal();\n  }\n  bool is_next_literal_ascii() {\n    ASSERT_NOT_NULL(next_.literal_chars);\n    return next_.literal_chars->is_ascii();\n  }\n  int next_literal_length() const {\n    ASSERT_NOT_NULL(next_.literal_chars);\n    return next_.literal_chars->length();\n  }\n\n  UnicodeCache* unicode_cache() { return unicode_cache_; }\n\n  static const int kCharacterLookaheadBufferSize = 1;\n\n  // Scans octal escape sequence. Also accepts \"\\0\" decimal escape sequence.\n  uc32 ScanOctalEscape(uc32 c, int length);\n\n  // Returns the location of the last seen octal literal.\n  Location octal_position() const { return octal_pos_; }\n  void clear_octal_position() { octal_pos_ = Location::invalid(); }\n\n  // Seek forward to the given position.  This operation does not\n  // work in general, for instance when there are pushed back\n  // characters, but works for seeking forward until simple delimiter\n  // tokens, which is what it is used for.\n  void SeekForward(int pos);\n\n  bool HarmonyScoping() const {\n    return harmony_scoping_;\n  }\n  void SetHarmonyScoping(bool scoping) {\n    harmony_scoping_ = scoping;\n  }\n  bool HarmonyModules() const {\n    return harmony_modules_;\n  }\n  void SetHarmonyModules(bool modules) {\n    harmony_modules_ = modules;\n  }\n\n\n  // Returns true if there was a line terminator before the peek'ed token,\n  // possibly inside a multi-line comment.\n  bool HasAnyLineTerminatorBeforeNext() const {\n    return has_line_terminator_before_next_ ||\n           has_multiline_comment_before_next_;\n  }\n\n  // Scans the input as a regular expression pattern, previous\n  // character(s) must be /(=). Returns true if a pattern is scanned.\n  bool ScanRegExpPattern(bool seen_equal);\n  // Returns true if regexp flags are scanned (always since flags can\n  // be empty).\n  bool ScanRegExpFlags();\n\n  // Tells whether the buffer contains an identifier (no escapes).\n  // Used for checking if a property name is an identifier.\n  static bool IsIdentifier(unibrow::CharacterStream* buffer);\n\n private:\n  // The current and look-ahead token.\n  struct TokenDesc {\n    Token::Value token;\n    Location location;\n    LiteralBuffer* literal_chars;\n  };\n\n  // Call this after setting source_ to the input.\n  void Init() {\n    // Set c0_ (one character ahead)\n    STATIC_ASSERT(kCharacterLookaheadBufferSize == 1);\n    Advance();\n    // Initialize current_ to not refer to a literal.\n    current_.literal_chars = NULL;\n  }\n\n  // Literal buffer support\n  inline void StartLiteral() {\n    LiteralBuffer* free_buffer = (current_.literal_chars == &literal_buffer1_) ?\n            &literal_buffer2_ : &literal_buffer1_;\n    free_buffer->Reset();\n    next_.literal_chars = free_buffer;\n  }\n\n  INLINE(void AddLiteralChar(uc32 c)) {\n    ASSERT_NOT_NULL(next_.literal_chars);\n    next_.literal_chars->AddChar(c);\n  }\n\n  // Complete scanning of a literal.\n  inline void TerminateLiteral() {\n    // Does nothing in the current implementation.\n  }\n\n  // Stops scanning of a literal and drop the collected characters,\n  // e.g., due to an encountered error.\n  inline void DropLiteral() {\n    next_.literal_chars = NULL;\n  }\n\n  inline void AddLiteralCharAdvance() {\n    AddLiteralChar(c0_);\n    Advance();\n  }\n\n  // Low-level scanning support.\n  void Advance() { c0_ = source_->Advance(); }\n  void PushBack(uc32 ch) {\n    source_->PushBack(c0_);\n    c0_ = ch;\n  }\n\n  inline Token::Value Select(Token::Value tok) {\n    Advance();\n    return tok;\n  }\n\n  inline Token::Value Select(uc32 next, Token::Value then, Token::Value else_) {\n    Advance();\n    if (c0_ == next) {\n      Advance();\n      return then;\n    } else {\n      return else_;\n    }\n  }\n\n  uc32 ScanHexNumber(int expected_length);\n\n  // Scans a single JavaScript token.\n  void Scan();\n\n  bool SkipWhiteSpace();\n  Token::Value SkipSingleLineComment();\n  Token::Value SkipMultiLineComment();\n  // Scans a possible HTML comment -- begins with '<!'.\n  Token::Value ScanHtmlComment();\n\n  void ScanDecimalDigits();\n  Token::Value ScanNumber(bool seen_period);\n  Token::Value ScanIdentifierOrKeyword();\n  Token::Value ScanIdentifierSuffix(LiteralScope* literal);\n\n  Token::Value ScanString();\n\n  // Scans an escape-sequence which is part of a string and adds the\n  // decoded character to the current literal. Returns true if a pattern\n  // is scanned.\n  bool ScanEscape();\n  // Decodes a Unicode escape-sequence which is part of an identifier.\n  // If the escape sequence cannot be decoded the result is kBadChar.\n  uc32 ScanIdentifierUnicodeEscape();\n  // Scans a Unicode escape-sequence and adds its characters,\n  // uninterpreted, to the current literal. Used for parsing RegExp\n  // flags.\n  bool ScanLiteralUnicodeEscape();\n\n  // Return the current source position.\n  int source_pos() {\n    return source_->pos() - kCharacterLookaheadBufferSize;\n  }\n\n  UnicodeCache* unicode_cache_;\n\n  // Buffers collecting literal strings, numbers, etc.\n  LiteralBuffer literal_buffer1_;\n  LiteralBuffer literal_buffer2_;\n\n  TokenDesc current_;  // desc for current token (as returned by Next())\n  TokenDesc next_;     // desc for next token (one token look-ahead)\n\n  // Input stream. Must be initialized to an Utf16CharacterStream.\n  Utf16CharacterStream* source_;\n\n\n  // Start position of the octal literal last scanned.\n  Location octal_pos_;\n\n  // One Unicode character look-ahead; c0_ < 0 at the end of the input.\n  uc32 c0_;\n\n  // Whether there is a line terminator whitespace character after\n  // the current token, and  before the next. Does not count newlines\n  // inside multiline comments.\n  bool has_line_terminator_before_next_;\n  // Whether there is a multi-line comment that contains a\n  // line-terminator after the current token, and before the next.\n  bool has_multiline_comment_before_next_;\n  // Whether we scan 'let' as a keyword for harmony block-scoped let bindings.\n  bool harmony_scoping_;\n  // Whether we scan 'module', 'import', 'export' as keywords.\n  bool harmony_modules_;\n};\n\n} }  // namespace v8::internal\n\n#endif  // V8_SCANNER_H_\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/simple.re",
    "content": "#define\tNULL\t\t((char*) 0)\nchar *scan(char *p){\nchar *q;\n#define\tYYCTYPE\t\tchar\n#define\tYYCURSOR\tp\n#define\tYYLIMIT\t\tp\n#define\tYYMARKER\tq\n#define\tYYFILL(n)\n/*!re2c\n\t[0-9]+\t\t{return YYCURSOR;}\n\t[\\000-\\377]\t{return NULL;}\n*/\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/srs_app_ingest.cpp",
    "content": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2013-2015 SRS(ossrs)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Source - https://github.com/REN-I/srs/blob/3aae7854702a37955bce706fcd8122b02ac07f53/trunk/src/app/srs_app_ingest.cpp\n\n#include <srs_app_ingest.hpp>\n\n#ifdef SRS_AUTO_INGEST\n\n#include <stdlib.h>\nusing namespace std;\n\n#include <srs_kernel_error.hpp>\n#include <srs_app_config.hpp>\n#include <srs_kernel_log.hpp>\n#include <srs_app_ffmpeg.hpp>\n#include <srs_app_pithy_print.hpp>\n#include <srs_kernel_utility.hpp>\n#include <srs_app_utility.hpp>\n\n// when error, ingester sleep for a while and retry.\n// ingest never sleep a long time, for we must start the stream ASAP.\n#define SRS_AUTO_INGESTER_SLEEP_US (int64_t)(3*1000*1000LL)\n\nSrsIngesterFFMPEG::SrsIngesterFFMPEG()\n{\n    ffmpeg = NULL;\n}\n\nSrsIngesterFFMPEG::~SrsIngesterFFMPEG()\n{\n    srs_freep(ffmpeg);\n}\n\nint SrsIngesterFFMPEG::initialize(SrsFFMPEG* ff, string v, string i)\n{\n    int ret = ERROR_SUCCESS;\n    \n    ffmpeg = ff;\n    vhost = v;\n    id = i;\n    starttime = srs_get_system_time_ms();\n    \n    return ret;\n}\n\nstring SrsIngesterFFMPEG::uri()\n{\n    return vhost + \"/\" + id;\n}\n\nint SrsIngesterFFMPEG::alive()\n{\n    return (int)(srs_get_system_time_ms() - starttime);\n}\n\nbool SrsIngesterFFMPEG::equals(string v)\n{\n    return vhost == v;\n}\n\nbool SrsIngesterFFMPEG::equals(string v, string i)\n{\n    return vhost == v && id == i;\n}\n\nint SrsIngesterFFMPEG::start()\n{\n    return ffmpeg->start();\n}\n\nvoid SrsIngesterFFMPEG::stop()\n{\n    ffmpeg->stop();\n}\n\nint SrsIngesterFFMPEG::cycle()\n{\n    return ffmpeg->cycle();\n}\n\nvoid SrsIngesterFFMPEG::fast_stop()\n{\n    ffmpeg->fast_stop();\n}\n\nSrsIngester::SrsIngester()\n{\n    _srs_config->subscribe(this);\n    \n    pthread = new SrsReusableThread(\"ingest\", this, SRS_AUTO_INGESTER_SLEEP_US);\n    pprint = SrsPithyPrint::create_ingester();\n}\n\nSrsIngester::~SrsIngester()\n{\n    _srs_config->unsubscribe(this);\n    \n    srs_freep(pthread);\n    clear_engines();\n}\n\nint SrsIngester::start()\n{\n    int ret = ERROR_SUCCESS;\n    \n    if ((ret = parse()) != ERROR_SUCCESS) {\n        clear_engines();\n        ret = ERROR_SUCCESS;\n        return ret;\n    }\n    \n    // even no ingesters, we must also start it,\n    // for the reload may add more ingesters.\n    \n    // start thread to run all encoding engines.\n    if ((ret = pthread->start()) != ERROR_SUCCESS) {\n        srs_error(\"st_thread_create failed. ret=%d\", ret);\n        return ret;\n    }\n    srs_trace(\"ingest thread cid=%d, current_cid=%d\", pthread->cid(), _srs_context->get_id());\n    \n    return ret;\n}\n\nint SrsIngester::parse_ingesters(SrsConfDirective* vhost)\n{\n    int ret = ERROR_SUCCESS;\n    \n    std::vector<SrsConfDirective*> ingesters = _srs_config->get_ingesters(vhost->arg0());\n    \n    // create engine\n    for (int i = 0; i < (int)ingesters.size(); i++) {\n        SrsConfDirective* ingest = ingesters[i];\n        if ((ret = parse_engines(vhost, ingest)) != ERROR_SUCCESS) {\n            return ret;\n        }\n    }\n    \n    return ret;\n}\n\nint SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest)\n{\n    int ret = ERROR_SUCCESS;\n\n    if (!_srs_config->get_ingest_enabled(ingest)) {\n        return ret;\n    }\n    \n    std::string ffmpeg_bin = _srs_config->get_ingest_ffmpeg(ingest);\n    if (ffmpeg_bin.empty()) {\n        ret = ERROR_ENCODER_PARSE;\n        srs_trace(\"empty ffmpeg ret=%d\", ret);\n        return ret;\n    }\n    \n    // get all engines.\n    std::vector<SrsConfDirective*> engines = _srs_config->get_transcode_engines(ingest);\n    \n    // create ingesters without engines.\n    if (engines.empty()) {\n        SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin);\n        if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, NULL)) != ERROR_SUCCESS) {\n            srs_freep(ffmpeg);\n            if (ret != ERROR_ENCODER_LOOP) {\n                srs_error(\"invalid ingest engine. ret=%d\", ret);\n            }\n            return ret;\n        }\n\n        SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG();\n        if ((ret = ingester->initialize(ffmpeg, vhost->arg0(), ingest->arg0())) != ERROR_SUCCESS) {\n            srs_freep(ingester);\n            return ret;\n        }\n        \n        ingesters.push_back(ingester);\n        return ret;\n    }\n\n    // create ingesters with engine\n    for (int i = 0; i < (int)engines.size(); i++) {\n        SrsConfDirective* engine = engines[i];\n        SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin);\n        if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, engine)) != ERROR_SUCCESS) {\n            srs_freep(ffmpeg);\n            if (ret != ERROR_ENCODER_LOOP) {\n                srs_error(\"invalid ingest engine: %s %s, ret=%d\", \n                    ingest->arg0().c_str(), engine->arg0().c_str(), ret);\n            }\n            return ret;\n        }\n        \n        SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG();\n        if ((ret = ingester->initialize(ffmpeg, vhost->arg0(), ingest->arg0())) != ERROR_SUCCESS) {\n            srs_freep(ingester);\n            return ret;\n        }\n\n        ingesters.push_back(ingester);\n    }\n    \n    return ret;\n}\n\nvoid SrsIngester::dispose()\n{\n    // first, use fast stop to notice all FFMPEG to quit gracefully.\n    std::vector<SrsIngesterFFMPEG*>::iterator it;\n    for (it = ingesters.begin(); it != ingesters.end(); ++it) {\n        SrsIngesterFFMPEG* ingester = *it;\n        ingester->fast_stop();\n    }\n    \n    if (!ingesters.empty()) {\n        srs_trace(\"fast stop all ingesters ok.\");\n    }\n    \n    // then, use stop to wait FFMPEG quit one by one and send SIGKILL if needed.\n    stop();\n}\n\nvoid SrsIngester::stop()\n{\n    pthread->stop();\n    clear_engines();\n}\n\nint SrsIngester::cycle()\n{\n    int ret = ERROR_SUCCESS;\n    \n    std::vector<SrsIngesterFFMPEG*>::iterator it;\n    for (it = ingesters.begin(); it != ingesters.end(); ++it) {\n        SrsIngesterFFMPEG* ingester = *it;\n        \n        // start all ffmpegs.\n        if ((ret = ingester->start()) != ERROR_SUCCESS) {\n            srs_error(\"ingest ffmpeg start failed. ret=%d\", ret);\n            return ret;\n        }\n\n        // check ffmpeg status.\n        if ((ret = ingester->cycle()) != ERROR_SUCCESS) {\n            srs_error(\"ingest ffmpeg cycle failed. ret=%d\", ret);\n            return ret;\n        }\n    }\n\n    // pithy print\n    show_ingest_log_message();\n    \n    return ret;\n}\n\nvoid SrsIngester::on_thread_stop()\n{\n}\n\nvoid SrsIngester::clear_engines()\n{\n    std::vector<SrsIngesterFFMPEG*>::iterator it;\n    \n    for (it = ingesters.begin(); it != ingesters.end(); ++it) {\n        SrsIngesterFFMPEG* ingester = *it;\n        srs_freep(ingester);\n    }\n\n    ingesters.clear();\n}\n\nint SrsIngester::parse()\n{\n    int ret = ERROR_SUCCESS;\n    \n    // parse ingesters\n    std::vector<SrsConfDirective*> vhosts;\n    _srs_config->get_vhosts(vhosts);\n    \n    for (int i = 0; i < (int)vhosts.size(); i++) {\n        SrsConfDirective* vhost = vhosts[i];\n        if ((ret = parse_ingesters(vhost)) != ERROR_SUCCESS) {\n            return ret;\n        }\n    }\n    \n    return ret;\n}\n\nint SrsIngester::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* vhost, SrsConfDirective* ingest, SrsConfDirective* engine)\n{\n    int ret = ERROR_SUCCESS;\n    \n    std::string port;\n    if (true) {\n        std::vector<std::string> ip_ports = _srs_config->get_listens();\n        srs_assert(ip_ports.size() > 0);\n        \n        std::string ep = ip_ports[0];\n        std::string ip;\n        srs_parse_endpoint(ep, ip, port);\n    }\n    \n    std::string output = _srs_config->get_engine_output(engine);\n    // output stream, to other/self server\n    // ie. rtmp://localhost:1935/live/livestream_sd\n    output = srs_string_replace(output, \"[vhost]\", vhost->arg0());\n    output = srs_string_replace(output, \"[port]\", port);\n    if (output.empty()) {\n        ret = ERROR_ENCODER_NO_OUTPUT;\n        srs_trace(\"empty output url, ingest=%s. ret=%d\", ingest->arg0().c_str(), ret);\n        return ret;\n    }\n    \n    // find the app and stream in rtmp url\n    std::string url = output;\n    std::string app, stream;\n    size_t pos = std::string::npos;\n    if ((pos = url.rfind(\"/\")) != std::string::npos) {\n        stream = url.substr(pos + 1);\n        url = url.substr(0, pos);\n    }\n    if ((pos = url.rfind(\"/\")) != std::string::npos) {\n        app = url.substr(pos + 1);\n        url = url.substr(0, pos);\n    }\n    if ((pos = app.rfind(\"?\")) != std::string::npos) {\n        app = app.substr(0, pos);\n    }\n    \n    std::string log_file = SRS_CONSTS_NULL_FILE; // disabled\n    // write ffmpeg info to log file.\n    if (_srs_config->get_ffmpeg_log_enabled()) {\n        log_file = _srs_config->get_ffmpeg_log_dir();\n        log_file += \"/\";\n        log_file += \"ffmpeg-ingest\";\n        log_file += \"-\";\n        log_file += vhost->arg0();\n        log_file += \"-\";\n        log_file += app;\n        log_file += \"-\";\n        log_file += stream;\n        log_file += \".log\";\n    }\n    \n    // input\n    std::string input_type = _srs_config->get_ingest_input_type(ingest);\n    if (input_type.empty()) {\n        ret = ERROR_ENCODER_NO_INPUT;\n        srs_trace(\"empty intput type, ingest=%s. ret=%d\", ingest->arg0().c_str(), ret);\n        return ret;\n    }\n\n    if (srs_config_ingest_is_file(input_type)) {\n        std::string input_url = _srs_config->get_ingest_input_url(ingest);\n        if (input_url.empty()) {\n            ret = ERROR_ENCODER_NO_INPUT;\n            srs_trace(\"empty intput url, ingest=%s. ret=%d\", ingest->arg0().c_str(), ret);\n            return ret;\n        }\n        \n        // for file, set re.\n        ffmpeg->set_iparams(\"-re\");\n    \n        if ((ret = ffmpeg->initialize(input_url, output, log_file)) != ERROR_SUCCESS) {\n            return ret;\n        }\n    } else if (srs_config_ingest_is_stream(input_type)) {\n        std::string input_url = _srs_config->get_ingest_input_url(ingest);\n        if (input_url.empty()) {\n            ret = ERROR_ENCODER_NO_INPUT;\n            srs_trace(\"empty intput url, ingest=%s. ret=%d\", ingest->arg0().c_str(), ret);\n            return ret;\n        }\n        \n        // for stream, no re.\n        ffmpeg->set_iparams(\"\");\n    \n        if ((ret = ffmpeg->initialize(input_url, output, log_file)) != ERROR_SUCCESS) {\n            return ret;\n        }\n    } else {\n        ret = ERROR_ENCODER_INPUT_TYPE;\n        srs_error(\"invalid ingest=%s type=%s, ret=%d\", \n            ingest->arg0().c_str(), input_type.c_str(), ret);\n    }\n    \n    // set output format to flv for RTMP\n    ffmpeg->set_oformat(\"flv\");\n    \n    std::string vcodec = _srs_config->get_engine_vcodec(engine);\n    std::string acodec = _srs_config->get_engine_acodec(engine);\n    // whatever the engine config, use copy as default.\n    bool engine_disabled = !engine || !_srs_config->get_engine_enabled(engine);\n    if (engine_disabled || vcodec.empty() || acodec.empty()) {\n        if ((ret = ffmpeg->initialize_copy()) != ERROR_SUCCESS) {\n            return ret;\n        }\n    } else {\n        if ((ret = ffmpeg->initialize_transcode(engine)) != ERROR_SUCCESS) {\n            return ret;\n        }\n    }\n    \n    srs_trace(\"parse success, ingest=%s, vhost=%s\", \n        ingest->arg0().c_str(), vhost->arg0().c_str());\n    \n    return ret;\n}\n\nvoid SrsIngester::show_ingest_log_message()\n{\n    pprint->elapse();\n\n    if ((int)ingesters.size() <= 0) {\n        return;\n    }\n    \n    // random choose one ingester to report.\n    int index = rand() % (int)ingesters.size();\n    SrsIngesterFFMPEG* ingester = ingesters.at(index);\n    \n    // reportable\n    if (pprint->can_print()) {\n        srs_trace(\"-> \"SRS_CONSTS_LOG_INGESTER\" time=%\"PRId64\", ingesters=%d, #%d(alive=%ds, %s)\",\n            pprint->age(), (int)ingesters.size(), index, ingester->alive() / 1000, ingester->uri().c_str());\n    }\n}\n\nint SrsIngester::on_reload_vhost_added(string vhost)\n{\n    int ret = ERROR_SUCCESS;\n    \n    SrsConfDirective* _vhost = _srs_config->get_vhost(vhost);\n    if ((ret = parse_ingesters(_vhost)) != ERROR_SUCCESS) {\n        return ret;\n    }\n    \n    srs_trace(\"reload add vhost ingesters, vhost=%s\", vhost.c_str());\n\n    return ret;\n}\n\nint SrsIngester::on_reload_vhost_removed(string vhost)\n{\n    int ret = ERROR_SUCCESS;\n    \n    std::vector<SrsIngesterFFMPEG*>::iterator it;\n    \n    for (it = ingesters.begin(); it != ingesters.end();) {\n        SrsIngesterFFMPEG* ingester = *it;\n        \n        if (!ingester->equals(vhost)) {\n            ++it;\n            continue;\n        }\n        \n        // stop the ffmpeg and free it.\n        ingester->stop();\n        \n        srs_trace(\"reload stop ingester, vhost=%s, id=%s\", vhost.c_str(), ingester->uri().c_str());\n            \n        srs_freep(ingester);\n        \n        // remove the item from ingesters.\n        it = ingesters.erase(it);\n    }\n\n    return ret;\n}\n\nint SrsIngester::on_reload_ingest_removed(string vhost, string ingest_id)\n{\n    int ret = ERROR_SUCCESS;\n    \n    std::vector<SrsIngesterFFMPEG*>::iterator it;\n    \n    for (it = ingesters.begin(); it != ingesters.end();) {\n        SrsIngesterFFMPEG* ingester = *it;\n        \n        if (!ingester->equals(vhost, ingest_id)) {\n            ++it;\n            continue;\n        }\n        \n        // stop the ffmpeg and free it.\n        ingester->stop();\n        \n        srs_trace(\"reload stop ingester, vhost=%s, id=%s\", vhost.c_str(), ingester->uri().c_str());\n            \n        srs_freep(ingester);\n        \n        // remove the item from ingesters.\n        it = ingesters.erase(it);\n    }\n    \n    return ret;\n}\n\nint SrsIngester::on_reload_ingest_added(string vhost, string ingest_id)\n{\n    int ret = ERROR_SUCCESS;\n    \n    SrsConfDirective* _vhost = _srs_config->get_vhost(vhost);\n    SrsConfDirective* _ingester = _srs_config->get_ingest_by_id(vhost, ingest_id);\n    \n    if ((ret = parse_engines(_vhost, _ingester)) != ERROR_SUCCESS) {\n        return ret;\n    }\n    \n    srs_trace(\"reload add ingester, \"\n        \"vhost=%s, id=%s\", vhost.c_str(), ingest_id.c_str());\n    \n    return ret;\n}\n\nint SrsIngester::on_reload_ingest_updated(string vhost, string ingest_id)\n{\n    int ret = ERROR_SUCCESS;\n\n    if ((ret = on_reload_ingest_removed(vhost, ingest_id)) != ERROR_SUCCESS) {\n        return ret;\n    }\n\n    if ((ret = on_reload_ingest_added(vhost, ingest_id)) != ERROR_SUCCESS) {\n        return ret;\n    }\n    \n    srs_trace(\"reload updated ingester, \"\n        \"vhost=%s, id=%s\", vhost.c_str(), ingest_id.c_str());\n    \n    return ret;\n}\n\n#endif\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/utils.h",
    "content": "/*\n  This file is part of the PhantomJS project from Ofi Labs.\n\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2011 Ivan De Marino <ivan.de.marino@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef UTILS_H\n#define UTILS_H\n\n#include <QtGlobal>\n#include <QWebFrame>\n#include <QFile>\n\n#include \"csconverter.h\"\n#include \"encoding.h\"\n\nclass QTemporaryFile;\n/**\n * Aggregate common utility functions.\n * Functions are static methods.\n * It's important to notice that, at the moment, this class can't be instantiated by design.\n */\nclass Utils\n{\npublic:\n    static void showUsage();\n    static void messageHandler(QtMsgType type, const char *msg);\n    static bool exceptionHandler(const char* dump_path, const char* minidump_id, void* context, bool succeeded);\n    static QVariant coffee2js(const QString &script);\n    static bool injectJsInFrame(const QString &jsFilePath, const QString &libraryPath, QWebFrame *targetFrame, const bool startingScript = false);\n    static bool injectJsInFrame(const QString &jsFilePath, const Encoding &jsFileEnc, const QString &libraryPath, QWebFrame *targetFrame, const bool startingScript = false);\n    static QString readResourceFileUtf8(const QString &resourceFilePath);\n\n    static bool loadJSForDebug(const QString &jsFilePath, const Encoding &jsFileEnc, const QString &libraryPath, QWebFrame *targetFrame, const bool autorun = false);\n    static bool loadJSForDebug(const QString &jsFilePath, const QString &libraryPath, QWebFrame *targetFrame, const bool autorun = false);\n    static void cleanupFromDebug();\n\nprivate:\n    static QString findScript(const QString &jsFilePath, const QString& libraryPath);\n    static QString jsFromScriptFile(const QString& scriptPath, const Encoding& enc);\n    Utils(); //< This class shouldn't be instantiated\n\n    static QTemporaryFile* m_tempHarness; //< We want to make sure to clean up after ourselves\n    static QTemporaryFile* m_tempWrapper;\n};\n\n#endif // UTILS_H\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/v8.cc",
    "content": "// Copyright 2012 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n//       copyright notice, this list of conditions and the following\n//       disclaimer in the documentation and/or other materials provided\n//       with the distribution.\n//     * Neither the name of Google Inc. nor the names of its\n//       contributors may be used to endorse or promote products derived\n//       from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"v8.h\"\n\n#include \"assembler.h\"\n#include \"isolate.h\"\n#include \"elements.h\"\n#include \"bootstrapper.h\"\n#include \"debug.h\"\n#include \"deoptimizer.h\"\n#include \"frames.h\"\n#include \"heap-profiler.h\"\n#include \"hydrogen.h\"\n#include \"lithium-allocator.h\"\n#include \"log.h\"\n#include \"once.h\"\n#include \"platform.h\"\n#include \"runtime-profiler.h\"\n#include \"serialize.h\"\n#include \"store-buffer.h\"\n\nnamespace v8 {\nnamespace internal {\n\nV8_DECLARE_ONCE(init_once);\n\nbool V8::is_running_ = false;\nbool V8::has_been_set_up_ = false;\nbool V8::has_been_disposed_ = false;\nbool V8::has_fatal_error_ = false;\nbool V8::use_crankshaft_ = true;\nList<CallCompletedCallback>* V8::call_completed_callbacks_ = NULL;\n\nstatic LazyMutex entropy_mutex = LAZY_MUTEX_INITIALIZER;\n\nstatic EntropySource entropy_source;\n\n\nbool V8::Initialize(Deserializer* des) {\n  FlagList::EnforceFlagImplications();\n\n  InitializeOncePerProcess();\n\n  // The current thread may not yet had entered an isolate to run.\n  // Note the Isolate::Current() may be non-null because for various\n  // initialization purposes an initializing thread may be assigned an isolate\n  // but not actually enter it.\n  if (i::Isolate::CurrentPerIsolateThreadData() == NULL) {\n    i::Isolate::EnterDefaultIsolate();\n  }\n\n  ASSERT(i::Isolate::CurrentPerIsolateThreadData() != NULL);\n  ASSERT(i::Isolate::CurrentPerIsolateThreadData()->thread_id().Equals(\n           i::ThreadId::Current()));\n  ASSERT(i::Isolate::CurrentPerIsolateThreadData()->isolate() ==\n         i::Isolate::Current());\n\n  if (IsDead()) return false;\n\n  Isolate* isolate = Isolate::Current();\n  if (isolate->IsInitialized()) return true;\n\n  is_running_ = true;\n  has_been_set_up_ = true;\n  has_fatal_error_ = false;\n  has_been_disposed_ = false;\n\n  return isolate->Init(des);\n}\n\n\nvoid V8::SetFatalError() {\n  is_running_ = false;\n  has_fatal_error_ = true;\n}\n\n\nvoid V8::TearDown() {\n  Isolate* isolate = Isolate::Current();\n  ASSERT(isolate->IsDefaultIsolate());\n\n  if (!has_been_set_up_ || has_been_disposed_) return;\n\n  ElementsAccessor::TearDown();\n  LOperand::TearDownCaches();\n  RegisteredExtension::UnregisterAll();\n\n  isolate->TearDown();\n  delete isolate;\n\n  is_running_ = false;\n  has_been_disposed_ = true;\n\n  delete call_completed_callbacks_;\n  call_completed_callbacks_ = NULL;\n\n  OS::TearDown();\n}\n\n\nstatic void seed_random(uint32_t* state) {\n  for (int i = 0; i < 2; ++i) {\n    if (FLAG_random_seed != 0) {\n      state[i] = FLAG_random_seed;\n    } else if (entropy_source != NULL) {\n      uint32_t val;\n      ScopedLock lock(entropy_mutex.Pointer());\n      entropy_source(reinterpret_cast<unsigned char*>(&val), sizeof(uint32_t));\n      state[i] = val;\n    } else {\n      state[i] = random();\n    }\n  }\n}\n\n\n// Random number generator using George Marsaglia's MWC algorithm.\nstatic uint32_t random_base(uint32_t* state) {\n  // Initialize seed using the system random().\n  // No non-zero seed will ever become zero again.\n  if (state[0] == 0) seed_random(state);\n\n  // Mix the bits.  Never replaces state[i] with 0 if it is nonzero.\n  state[0] = 18273 * (state[0] & 0xFFFF) + (state[0] >> 16);\n  state[1] = 36969 * (state[1] & 0xFFFF) + (state[1] >> 16);\n\n  return (state[0] << 14) + (state[1] & 0x3FFFF);\n}\n\n\nvoid V8::SetEntropySource(EntropySource source) {\n  entropy_source = source;\n}\n\n\nvoid V8::SetReturnAddressLocationResolver(\n      ReturnAddressLocationResolver resolver) {\n  StackFrame::SetReturnAddressLocationResolver(resolver);\n}\n\n\n// Used by JavaScript APIs\nuint32_t V8::Random(Context* context) {\n  ASSERT(context->IsGlobalContext());\n  ByteArray* seed = context->random_seed();\n  return random_base(reinterpret_cast<uint32_t*>(seed->GetDataStartAddress()));\n}\n\n\n// Used internally by the JIT and memory allocator for security\n// purposes. So, we keep a different state to prevent informations\n// leaks that could be used in an exploit.\nuint32_t V8::RandomPrivate(Isolate* isolate) {\n  ASSERT(isolate == Isolate::Current());\n  return random_base(isolate->private_random_seed());\n}\n\n\nbool V8::IdleNotification(int hint) {\n  // Returning true tells the caller that there is no need to call\n  // IdleNotification again.\n  if (!FLAG_use_idle_notification) return true;\n\n  // Tell the heap that it may want to adjust.\n  return HEAP->IdleNotification(hint);\n}\n\n\nvoid V8::AddCallCompletedCallback(CallCompletedCallback callback) {\n  if (call_completed_callbacks_ == NULL) {  // Lazy init.\n    call_completed_callbacks_ = new List<CallCompletedCallback>();\n  }\n  for (int i = 0; i < call_completed_callbacks_->length(); i++) {\n    if (callback == call_completed_callbacks_->at(i)) return;\n  }\n  call_completed_callbacks_->Add(callback);\n}\n\n\nvoid V8::RemoveCallCompletedCallback(CallCompletedCallback callback) {\n  if (call_completed_callbacks_ == NULL) return;\n  for (int i = 0; i < call_completed_callbacks_->length(); i++) {\n    if (callback == call_completed_callbacks_->at(i)) {\n      call_completed_callbacks_->Remove(i);\n    }\n  }\n}\n\n\nvoid V8::FireCallCompletedCallback(Isolate* isolate) {\n  if (call_completed_callbacks_ == NULL) return;\n  HandleScopeImplementer* handle_scope_implementer =\n      isolate->handle_scope_implementer();\n  if (!handle_scope_implementer->CallDepthIsZero()) return;\n  // Fire callbacks.  Increase call depth to prevent recursive callbacks.\n  handle_scope_implementer->IncrementCallDepth();\n  for (int i = 0; i < call_completed_callbacks_->length(); i++) {\n    call_completed_callbacks_->at(i)();\n  }\n  handle_scope_implementer->DecrementCallDepth();\n}\n\n\n// Use a union type to avoid type-aliasing optimizations in GCC.\ntypedef union {\n  double double_value;\n  uint64_t uint64_t_value;\n} double_int_union;\n\n\nObject* V8::FillHeapNumberWithRandom(Object* heap_number,\n                                     Context* context) {\n  double_int_union r;\n  uint64_t random_bits = Random(context);\n  // Convert 32 random bits to 0.(32 random bits) in a double\n  // by computing:\n  // ( 1.(20 0s)(32 random bits) x 2^20 ) - (1.0 x 2^20)).\n  static const double binary_million = 1048576.0;\n  r.double_value = binary_million;\n  r.uint64_t_value |= random_bits;\n  r.double_value -= binary_million;\n\n  HeapNumber::cast(heap_number)->set_value(r.double_value);\n  return heap_number;\n}\n\nvoid V8::InitializeOncePerProcessImpl() {\n  OS::SetUp();\n\n  use_crankshaft_ = FLAG_crankshaft;\n\n  if (Serializer::enabled()) {\n    use_crankshaft_ = false;\n  }\n\n  CPU::SetUp();\n  if (!CPU::SupportsCrankshaft()) {\n    use_crankshaft_ = false;\n  }\n\n  OS::PostSetUp();\n\n  RuntimeProfiler::GlobalSetUp();\n\n  ElementsAccessor::InitializeOncePerProcess();\n\n  if (FLAG_stress_compaction) {\n    FLAG_force_marking_deque_overflows = true;\n    FLAG_gc_global = true;\n    FLAG_max_new_space_size = (1 << (kPageSizeBits - 10)) * 2;\n  }\n\n  LOperand::SetUpCaches();\n  SetUpJSCallerSavedCodeData();\n  SamplerRegistry::SetUp();\n  ExternalReference::SetUp();\n}\n\nvoid V8::InitializeOncePerProcess() {\n  CallOnce(&init_once, &InitializeOncePerProcessImpl);\n}\n\n} }  // namespace v8::internal\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/v8.h",
    "content": "// Copyright 2011 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n//       copyright notice, this list of conditions and the following\n//       disclaimer in the documentation and/or other materials provided\n//       with the distribution.\n//     * Neither the name of Google Inc. nor the names of its\n//       contributors may be used to endorse or promote products derived\n//       from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Top include for all V8 .cc files.\n//\n\n#ifndef V8_V8_H_\n#define V8_V8_H_\n\n#if defined(GOOGLE3)\n// Google3 special flag handling.\n#if defined(DEBUG) && defined(NDEBUG)\n// V8 only uses DEBUG and whenever it is set we are building a debug\n// version of V8. We do not use NDEBUG and simply undef it here for\n// consistency.\n#undef NDEBUG\n#endif\n#endif  // defined(GOOGLE3)\n\n// V8 only uses DEBUG, but included external files\n// may use NDEBUG - make sure they are consistent.\n#if defined(DEBUG) && defined(NDEBUG)\n#error both DEBUG and NDEBUG are set\n#endif\n\n// Basic includes\n#include \"../include/v8.h\"\n#include \"v8globals.h\"\n#include \"v8checks.h\"\n#include \"allocation.h\"\n#include \"v8utils.h\"\n#include \"flags.h\"\n\n// Objects & heap\n#include \"objects-inl.h\"\n#include \"spaces-inl.h\"\n#include \"heap-inl.h\"\n#include \"incremental-marking-inl.h\"\n#include \"mark-compact-inl.h\"\n#include \"log-inl.h\"\n#include \"cpu-profiler-inl.h\"\n#include \"handles-inl.h\"\n#include \"zone-inl.h\"\n\nnamespace v8 {\nnamespace internal {\n\nclass Deserializer;\n\nclass V8 : public AllStatic {\n public:\n  // Global actions.\n\n  // If Initialize is called with des == NULL, the initial state is\n  // created from scratch. If a non-null Deserializer is given, the\n  // initial state is created by reading the deserialized data into an\n  // empty heap.\n  static bool Initialize(Deserializer* des);\n  static void TearDown();\n  static bool IsRunning() { return is_running_; }\n  static bool UseCrankshaft() { return use_crankshaft_; }\n  // To be dead you have to have lived\n  // TODO(isolates): move IsDead to Isolate.\n  static bool IsDead() { return has_fatal_error_ || has_been_disposed_; }\n  static void SetFatalError();\n\n  // Report process out of memory. Implementation found in api.cc.\n  static void FatalProcessOutOfMemory(const char* location,\n                                      bool take_snapshot = false);\n\n  // Allows an entropy source to be provided for use in random number\n  // generation.\n  static void SetEntropySource(EntropySource source);\n  // Support for return-address rewriting profilers.\n  static void SetReturnAddressLocationResolver(\n      ReturnAddressLocationResolver resolver);\n  // Random number generation support. Not cryptographically safe.\n  static uint32_t Random(Context* context);\n  // We use random numbers internally in memory allocation and in the\n  // compilers for security. In order to prevent information leaks we\n  // use a separate random state for internal random number\n  // generation.\n  static uint32_t RandomPrivate(Isolate* isolate);\n  static Object* FillHeapNumberWithRandom(Object* heap_number,\n                                          Context* context);\n\n  // Idle notification directly from the API.\n  static bool IdleNotification(int hint);\n\n  static void AddCallCompletedCallback(CallCompletedCallback callback);\n  static void RemoveCallCompletedCallback(CallCompletedCallback callback);\n  static void FireCallCompletedCallback(Isolate* isolate);\n\n private:\n  static void InitializeOncePerProcessImpl();\n  static void InitializeOncePerProcess();\n\n  // True if engine is currently running\n  static bool is_running_;\n  // True if V8 has ever been run\n  static bool has_been_set_up_;\n  // True if error has been signaled for current engine\n  // (reset to false if engine is restarted)\n  static bool has_fatal_error_;\n  // True if engine has been shut down\n  // (reset if engine is restarted)\n  static bool has_been_disposed_;\n  // True if we are using the crankshaft optimizing compiler.\n  static bool use_crankshaft_;\n  // List of callbacks when a Call completes.\n  static List<CallCompletedCallback>* call_completed_callbacks_;\n};\n\n\n// JavaScript defines two kinds of 'nil'.\nenum NilValue { kNullValue, kUndefinedValue };\n\n\n// JavaScript defines two kinds of equality.\nenum EqualityKind { kStrictEquality, kNonStrictEquality };\n\n\n} }  // namespace v8::internal\n\nnamespace i = v8::internal;\n\n#endif  // V8_V8_H_\n"
  },
  {
    "path": "src/test/resources/samples/langs/C++/wrapper_inner.cpp",
    "content": "/* Generated by Cython 0.14.1 on Mon Jun 27 13:03:43 2011 */\n\n#define PY_SSIZE_T_CLEAN\n#include \"Python.h\"\n#ifndef Py_PYTHON_H\n    #error Python headers needed to compile C extensions, please install development version of Python.\n#else\n\n#include <stddef.h> /* For offsetof */\n#ifndef offsetof\n#define offsetof(type, member) ( (size_t) & ((type*)0) -> member )\n#endif\n\n#if !defined(WIN32) && !defined(MS_WINDOWS)\n  #ifndef __stdcall\n    #define __stdcall\n  #endif\n  #ifndef __cdecl\n    #define __cdecl\n  #endif\n  #ifndef __fastcall\n    #define __fastcall\n  #endif\n#endif\n\n#ifndef DL_IMPORT\n  #define DL_IMPORT(t) t\n#endif\n#ifndef DL_EXPORT\n  #define DL_EXPORT(t) t\n#endif\n\n#ifndef PY_LONG_LONG\n  #define PY_LONG_LONG LONG_LONG\n#endif\n\n#if PY_VERSION_HEX < 0x02040000\n  #define METH_COEXIST 0\n  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)\n  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)\n#endif\n\n#if PY_VERSION_HEX < 0x02050000\n  typedef int Py_ssize_t;\n  #define PY_SSIZE_T_MAX INT_MAX\n  #define PY_SSIZE_T_MIN INT_MIN\n  #define PY_FORMAT_SIZE_T \"\"\n  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)\n  #define PyInt_AsSsize_t(o)   PyInt_AsLong(o)\n  #define PyNumber_Index(o)    PyNumber_Int(o)\n  #define PyIndex_Check(o)     PyNumber_Check(o)\n  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)\n#endif\n\n#if PY_VERSION_HEX < 0x02060000\n  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)\n  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)\n  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)\n  #define PyVarObject_HEAD_INIT(type, size) \\\n          PyObject_HEAD_INIT(type) size,\n  #define PyType_Modified(t)\n\n  typedef struct {\n     void *buf;\n     PyObject *obj;\n     Py_ssize_t len;\n     Py_ssize_t itemsize;\n     int readonly;\n     int ndim;\n     char *format;\n     Py_ssize_t *shape;\n     Py_ssize_t *strides;\n     Py_ssize_t *suboffsets;\n     void *internal;\n  } Py_buffer;\n\n  #define PyBUF_SIMPLE 0\n  #define PyBUF_WRITABLE 0x0001\n  #define PyBUF_FORMAT 0x0004\n  #define PyBUF_ND 0x0008\n  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)\n  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)\n  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)\n  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)\n  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)\n\n#endif\n\n#if PY_MAJOR_VERSION < 3\n  #define __Pyx_BUILTIN_MODULE_NAME \"__builtin__\"\n#else\n  #define __Pyx_BUILTIN_MODULE_NAME \"builtins\"\n#endif\n\n#if PY_MAJOR_VERSION >= 3\n  #define Py_TPFLAGS_CHECKTYPES 0\n  #define Py_TPFLAGS_HAVE_INDEX 0\n#endif\n\n#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)\n  #define Py_TPFLAGS_HAVE_NEWBUFFER 0\n#endif\n\n#if PY_MAJOR_VERSION >= 3\n  #define PyBaseString_Type            PyUnicode_Type\n  #define PyStringObject               PyUnicodeObject\n  #define PyString_Type                PyUnicode_Type\n  #define PyString_Check               PyUnicode_Check\n  #define PyString_CheckExact          PyUnicode_CheckExact\n#endif\n\n#if PY_VERSION_HEX < 0x02060000\n  #define PyBytesObject                PyStringObject\n  #define PyBytes_Type                 PyString_Type\n  #define PyBytes_Check                PyString_Check\n  #define PyBytes_CheckExact           PyString_CheckExact\n  #define PyBytes_FromString           PyString_FromString\n  #define PyBytes_FromStringAndSize    PyString_FromStringAndSize\n  #define PyBytes_FromFormat           PyString_FromFormat\n  #define PyBytes_DecodeEscape         PyString_DecodeEscape\n  #define PyBytes_AsString             PyString_AsString\n  #define PyBytes_AsStringAndSize      PyString_AsStringAndSize\n  #define PyBytes_Size                 PyString_Size\n  #define PyBytes_AS_STRING            PyString_AS_STRING\n  #define PyBytes_GET_SIZE             PyString_GET_SIZE\n  #define PyBytes_Repr                 PyString_Repr\n  #define PyBytes_Concat               PyString_Concat\n  #define PyBytes_ConcatAndDel         PyString_ConcatAndDel\n#endif\n\n#if PY_VERSION_HEX < 0x02060000\n  #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)\n  #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)\n#endif\n#ifndef PySet_CheckExact\n  #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)\n#endif\n\n#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)\n\n#if PY_MAJOR_VERSION >= 3\n  #define PyIntObject                  PyLongObject\n  #define PyInt_Type                   PyLong_Type\n  #define PyInt_Check(op)              PyLong_Check(op)\n  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)\n  #define PyInt_FromString             PyLong_FromString\n  #define PyInt_FromUnicode            PyLong_FromUnicode\n  #define PyInt_FromLong               PyLong_FromLong\n  #define PyInt_FromSize_t             PyLong_FromSize_t\n  #define PyInt_FromSsize_t            PyLong_FromSsize_t\n  #define PyInt_AsLong                 PyLong_AsLong\n  #define PyInt_AS_LONG                PyLong_AS_LONG\n  #define PyInt_AsSsize_t              PyLong_AsSsize_t\n  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask\n  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask\n#endif\n\n#if PY_MAJOR_VERSION >= 3\n  #define PyBoolObject                 PyLongObject\n#endif\n\n\n#if PY_MAJOR_VERSION >= 3\n  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)\n  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)\n#else\n  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)\n  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)\n#endif\n\n#if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)\n  #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)\n  #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)\n  #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b)\n#else\n  #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), (PyObject*)0) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object is unsliceable\", (obj)->ob_type->tp_name), (PyObject*)0)))\n  #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), -1) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object doesn't support slice assignment\", (obj)->ob_type->tp_name), -1)))\n  #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), -1) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object doesn't support slice deletion\", (obj)->ob_type->tp_name), -1)))\n#endif\n\n#if PY_MAJOR_VERSION >= 3\n  #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))\n#endif\n\n#if PY_VERSION_HEX < 0x02050000\n  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))\n  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))\n  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),((char *)(n)))\n#else\n  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),(n))\n  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))\n  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))\n#endif\n\n#if PY_VERSION_HEX < 0x02050000\n  #define __Pyx_NAMESTR(n) ((char *)(n))\n  #define __Pyx_DOCSTR(n)  ((char *)(n))\n#else\n  #define __Pyx_NAMESTR(n) (n)\n  #define __Pyx_DOCSTR(n)  (n)\n#endif\n\n#ifdef __cplusplus\n#define __PYX_EXTERN_C extern \"C\"\n#else\n#define __PYX_EXTERN_C extern\n#endif\n\n#if defined(WIN32) || defined(MS_WINDOWS)\n#define _USE_MATH_DEFINES\n#endif\n#include <math.h>\n#define __PYX_HAVE_API__wrapper_inner\n#include \"stdio.h\"\n#include \"stdlib.h\"\n#include \"numpy/arrayobject.h\"\n#include \"numpy/ufuncobject.h\"\n#include <vector>\n\n#ifdef PYREX_WITHOUT_ASSERTIONS\n#define CYTHON_WITHOUT_ASSERTIONS\n#endif\n\n\n/* inline attribute */\n#ifndef CYTHON_INLINE\n  #if defined(__GNUC__)\n    #define CYTHON_INLINE __inline__\n  #elif defined(_MSC_VER)\n    #define CYTHON_INLINE __inline\n  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n    #define CYTHON_INLINE inline\n  #else\n    #define CYTHON_INLINE\n  #endif\n#endif\n\n/* unused attribute */\n#ifndef CYTHON_UNUSED\n# if defined(__GNUC__)\n#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))\n#     define CYTHON_UNUSED __attribute__ ((__unused__))\n#   else\n#     define CYTHON_UNUSED\n#   endif\n# elif defined(__ICC) || defined(__INTEL_COMPILER)\n#   define CYTHON_UNUSED __attribute__ ((__unused__))\n# else\n#   define CYTHON_UNUSED\n# endif\n#endif\n\ntypedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/\n\n\n/* Type Conversion Predeclarations */\n\n#define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s)\n#define __Pyx_PyBytes_AsUString(s)   ((unsigned char*) PyBytes_AsString(s))\n\n#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))\nstatic CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);\nstatic CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);\n\nstatic CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);\nstatic CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);\nstatic CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);\n\n#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))\n\n\n#ifdef __GNUC__\n/* Test for GCC > 2.95 */\n#if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))\n#define likely(x)   __builtin_expect(!!(x), 1)\n#define unlikely(x) __builtin_expect(!!(x), 0)\n#else /* __GNUC__ > 2 ... */\n#define likely(x)   (x)\n#define unlikely(x) (x)\n#endif /* __GNUC__ > 2 ... */\n#else /* __GNUC__ */\n#define likely(x)   (x)\n#define unlikely(x) (x)\n#endif /* __GNUC__ */\n    \nstatic PyObject *__pyx_m;\nstatic PyObject *__pyx_b;\nstatic PyObject *__pyx_empty_tuple;\nstatic PyObject *__pyx_empty_bytes;\nstatic int __pyx_lineno;\nstatic int __pyx_clineno = 0;\nstatic const char * __pyx_cfilenm= __FILE__;\nstatic const char *__pyx_filename;\n\n\n#if !defined(CYTHON_CCOMPLEX)\n  #if defined(__cplusplus)\n    #define CYTHON_CCOMPLEX 1\n  #elif defined(_Complex_I)\n    #define CYTHON_CCOMPLEX 1\n  #else\n    #define CYTHON_CCOMPLEX 0\n  #endif\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    #include <complex>\n  #else\n    #include <complex.h>\n  #endif\n#endif\n\n#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__)\n  #undef _Complex_I\n  #define _Complex_I 1.0fj\n#endif\n\nstatic const char *__pyx_f[] = {\n  \"wrapper_inner.pyx\",\n  \"numpy.pxd\",\n};\n\ntypedef npy_int8 __pyx_t_5numpy_int8_t;\n\ntypedef npy_int16 __pyx_t_5numpy_int16_t;\n\ntypedef npy_int32 __pyx_t_5numpy_int32_t;\n\ntypedef npy_int64 __pyx_t_5numpy_int64_t;\n\ntypedef npy_uint8 __pyx_t_5numpy_uint8_t;\n\ntypedef npy_uint16 __pyx_t_5numpy_uint16_t;\n\ntypedef npy_uint32 __pyx_t_5numpy_uint32_t;\n\ntypedef npy_uint64 __pyx_t_5numpy_uint64_t;\n\ntypedef npy_float32 __pyx_t_5numpy_float32_t;\n\ntypedef npy_float64 __pyx_t_5numpy_float64_t;\n\ntypedef npy_long __pyx_t_5numpy_int_t;\n\ntypedef npy_longlong __pyx_t_5numpy_long_t;\n\ntypedef npy_intp __pyx_t_5numpy_intp_t;\n\ntypedef npy_uintp __pyx_t_5numpy_uintp_t;\n\ntypedef npy_ulong __pyx_t_5numpy_uint_t;\n\ntypedef npy_ulonglong __pyx_t_5numpy_ulong_t;\n\ntypedef npy_double __pyx_t_5numpy_float_t;\n\ntypedef npy_double __pyx_t_5numpy_double_t;\n\ntypedef npy_longdouble __pyx_t_5numpy_longdouble_t;\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    typedef ::std::complex< float > __pyx_t_float_complex;\n  #else\n    typedef float _Complex __pyx_t_float_complex;\n  #endif\n#else\n    typedef struct { float real, imag; } __pyx_t_float_complex;\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    typedef ::std::complex< double > __pyx_t_double_complex;\n  #else\n    typedef double _Complex __pyx_t_double_complex;\n  #endif\n#else\n    typedef struct { double real, imag; } __pyx_t_double_complex;\n#endif\n\n/* Type declarations */\n\ntypedef npy_cfloat __pyx_t_5numpy_cfloat_t;\n\ntypedef npy_cdouble __pyx_t_5numpy_cdouble_t;\n\ntypedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;\n\ntypedef npy_cdouble __pyx_t_5numpy_complex_t;\n\n#ifndef CYTHON_REFNANNY\n  #define CYTHON_REFNANNY 0\n#endif\n\n#if CYTHON_REFNANNY\n  typedef struct {\n    void (*INCREF)(void*, PyObject*, int);\n    void (*DECREF)(void*, PyObject*, int);\n    void (*GOTREF)(void*, PyObject*, int);\n    void (*GIVEREF)(void*, PyObject*, int);\n    void* (*SetupContext)(const char*, int, const char*);\n    void (*FinishContext)(void**);\n  } __Pyx_RefNannyAPIStruct;\n  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;\n  static __Pyx_RefNannyAPIStruct * __Pyx_RefNannyImportAPI(const char *modname) {\n    PyObject *m = NULL, *p = NULL;\n    void *r = NULL;\n    m = PyImport_ImportModule((char *)modname);\n    if (!m) goto end;\n    p = PyObject_GetAttrString(m, (char *)\"RefNannyAPI\");\n    if (!p) goto end;\n    r = PyLong_AsVoidPtr(p);\n  end:\n    Py_XDECREF(p);\n    Py_XDECREF(m);\n    return (__Pyx_RefNannyAPIStruct *)r;\n  }\n  #define __Pyx_RefNannySetupContext(name)           void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)\n  #define __Pyx_RefNannyFinishContext()           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)\n  #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0)\n#else\n  #define __Pyx_RefNannySetupContext(name)\n  #define __Pyx_RefNannyFinishContext()\n  #define __Pyx_INCREF(r) Py_INCREF(r)\n  #define __Pyx_DECREF(r) Py_DECREF(r)\n  #define __Pyx_GOTREF(r)\n  #define __Pyx_GIVEREF(r)\n  #define __Pyx_XDECREF(r) Py_XDECREF(r)\n#endif /* CYTHON_REFNANNY */\n#define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0)\n#define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0)\n\nstatic CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/\n\nstatic PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/\n\nstatic CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/\nstatic CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/\n\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/\n\nstatic CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);\n\nstatic CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);\n\nstatic CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);\n\nstatic void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/\n\nstatic PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/\n\nstatic int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/\n#if PY_MAJOR_VERSION >= 3\nstatic PyObject* __pyx_print = 0;\nstatic PyObject* __pyx_print_kwargs = 0;\n#endif\n\nstatic int __Pyx_PrintOne(PyObject* stream, PyObject *o); /*proto*/\n\nstatic CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_Py_intptr_t(Py_intptr_t);\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    #define __Pyx_CREAL(z) ((z).real())\n    #define __Pyx_CIMAG(z) ((z).imag())\n  #else\n    #define __Pyx_CREAL(z) (__real__(z))\n    #define __Pyx_CIMAG(z) (__imag__(z))\n  #endif\n#else\n    #define __Pyx_CREAL(z) ((z).real)\n    #define __Pyx_CIMAG(z) ((z).imag)\n#endif\n\n#if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX\n    #define __Pyx_SET_CREAL(z,x) ((z).real(x))\n    #define __Pyx_SET_CIMAG(z,y) ((z).imag(y))\n#else\n    #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x)\n    #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y)\n#endif\n\nstatic CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float);\n\n#if CYTHON_CCOMPLEX\n    #define __Pyx_c_eqf(a, b)   ((a)==(b))\n    #define __Pyx_c_sumf(a, b)  ((a)+(b))\n    #define __Pyx_c_difff(a, b) ((a)-(b))\n    #define __Pyx_c_prodf(a, b) ((a)*(b))\n    #define __Pyx_c_quotf(a, b) ((a)/(b))\n    #define __Pyx_c_negf(a)     (-(a))\n  #ifdef __cplusplus\n    #define __Pyx_c_is_zerof(z) ((z)==(float)0)\n    #define __Pyx_c_conjf(z)    (::std::conj(z))\n    #if 1\n        #define __Pyx_c_absf(z)     (::std::abs(z))\n        #define __Pyx_c_powf(a, b)  (::std::pow(a, b))\n    #endif\n  #else\n    #define __Pyx_c_is_zerof(z) ((z)==0)\n    #define __Pyx_c_conjf(z)    (conjf(z))\n    #if 1\n        #define __Pyx_c_absf(z)     (cabsf(z))\n        #define __Pyx_c_powf(a, b)  (cpowf(a, b))\n    #endif\n #endif\n#else\n    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex);\n    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex);\n    #if 1\n        static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex);\n        static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex);\n    #endif\n#endif\n\nstatic CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double);\n\n#if CYTHON_CCOMPLEX\n    #define __Pyx_c_eq(a, b)   ((a)==(b))\n    #define __Pyx_c_sum(a, b)  ((a)+(b))\n    #define __Pyx_c_diff(a, b) ((a)-(b))\n    #define __Pyx_c_prod(a, b) ((a)*(b))\n    #define __Pyx_c_quot(a, b) ((a)/(b))\n    #define __Pyx_c_neg(a)     (-(a))\n  #ifdef __cplusplus\n    #define __Pyx_c_is_zero(z) ((z)==(double)0)\n    #define __Pyx_c_conj(z)    (::std::conj(z))\n    #if 1\n        #define __Pyx_c_abs(z)     (::std::abs(z))\n        #define __Pyx_c_pow(a, b)  (::std::pow(a, b))\n    #endif\n  #else\n    #define __Pyx_c_is_zero(z) ((z)==0)\n    #define __Pyx_c_conj(z)    (conj(z))\n    #if 1\n        #define __Pyx_c_abs(z)     (cabs(z))\n        #define __Pyx_c_pow(a, b)  (cpow(a, b))\n    #endif\n #endif\n#else\n    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex);\n    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex);\n    #if 1\n        static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex);\n        static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex);\n    #endif\n#endif\n\nstatic CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);\n\nstatic CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);\n\nstatic CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);\n\nstatic CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);\n\nstatic CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);\n\nstatic CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);\n\nstatic CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);\n\nstatic CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *);\n\nstatic CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);\n\nstatic CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);\n\nstatic CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);\n\nstatic CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);\n\nstatic CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);\n\nstatic CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);\n\nstatic void __Pyx_WriteUnraisable(const char *name); /*proto*/\n\nstatic int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/\n\nstatic PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size, int strict);  /*proto*/\n\nstatic PyObject *__Pyx_ImportModule(const char *name); /*proto*/\n\nstatic void __Pyx_AddTraceback(const char *funcname); /*proto*/\n\nstatic int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/\n/* Module declarations from cpython.buffer */\n\n/* Module declarations from cpython.ref */\n\n/* Module declarations from libc.stdio */\n\n/* Module declarations from cpython.object */\n\n/* Module declarations from libc.stdlib */\n\n/* Module declarations from numpy */\n\n/* Module declarations from numpy */\n\nstatic PyTypeObject *__pyx_ptype_5numpy_dtype = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *); /*proto*/\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *, PyObject *); /*proto*/\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *, PyObject *, PyObject *); /*proto*/\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/\nstatic CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/\nstatic CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *, PyObject *); /*proto*/\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *); /*proto*/\n/* Module declarations from libcpp.vector */\n\n/* Module declarations from wrapper_inner */\n\nstatic void inner_work_1d(int, double *, double *); /*proto*/\nstatic void inner_work_2d(int, int, double *, double *); /*proto*/\n#define __Pyx_MODULE_NAME \"wrapper_inner\"\nstatic int __pyx_module_is_main_wrapper_inner = 0;\n\n/* Implementation of wrapper_inner */\nstatic PyObject *__pyx_builtin_ValueError;\nstatic PyObject *__pyx_builtin_range;\nstatic PyObject *__pyx_builtin_RuntimeError;\nstatic char __pyx_k_1[] = \"\\nHello from Cython inner_work_1d!\";\nstatic char __pyx_k_2[] = \"\\nHello from Cython inner_work_2d!\";\nstatic char __pyx_k_3[] = \"\\nHello from a pure Python function inside the Cython module.\";\nstatic char __pyx_k_5[] = \"ndarray is not C contiguous\";\nstatic char __pyx_k_7[] = \"ndarray is not Fortran contiguous\";\nstatic char __pyx_k_9[] = \"Non-native byte order not supported\";\nstatic char __pyx_k_11[] = \"unknown dtype code in numpy.pxd (%d)\";\nstatic char __pyx_k_12[] = \"Format string allocated too short, see comment in numpy.pxd\";\nstatic char __pyx_k_15[] = \"Format string allocated too short.\";\nstatic char __pyx_k__B[] = \"B\";\nstatic char __pyx_k__H[] = \"H\";\nstatic char __pyx_k__I[] = \"I\";\nstatic char __pyx_k__L[] = \"L\";\nstatic char __pyx_k__O[] = \"O\";\nstatic char __pyx_k__Q[] = \"Q\";\nstatic char __pyx_k__b[] = \"b\";\nstatic char __pyx_k__d[] = \"d\";\nstatic char __pyx_k__f[] = \"f\";\nstatic char __pyx_k__g[] = \"g\";\nstatic char __pyx_k__h[] = \"h\";\nstatic char __pyx_k__i[] = \"i\";\nstatic char __pyx_k__l[] = \"l\";\nstatic char __pyx_k__q[] = \"q\";\nstatic char __pyx_k__Zd[] = \"Zd\";\nstatic char __pyx_k__Zf[] = \"Zf\";\nstatic char __pyx_k__Zg[] = \"Zg\";\nstatic char __pyx_k__np[] = \"np\";\nstatic char __pyx_k__buf[] = \"buf\";\nstatic char __pyx_k__obj[] = \"obj\";\nstatic char __pyx_k__base[] = \"base\";\nstatic char __pyx_k__ndim[] = \"ndim\";\nstatic char __pyx_k__ones[] = \"ones\";\nstatic char __pyx_k__descr[] = \"descr\";\nstatic char __pyx_k__names[] = \"names\";\nstatic char __pyx_k__numpy[] = \"numpy\";\nstatic char __pyx_k__range[] = \"range\";\nstatic char __pyx_k__shape[] = \"shape\";\nstatic char __pyx_k__fields[] = \"fields\";\nstatic char __pyx_k__format[] = \"format\";\nstatic char __pyx_k__strides[] = \"strides\";\nstatic char __pyx_k____main__[] = \"__main__\";\nstatic char __pyx_k____test__[] = \"__test__\";\nstatic char __pyx_k__itemsize[] = \"itemsize\";\nstatic char __pyx_k__readonly[] = \"readonly\";\nstatic char __pyx_k__type_num[] = \"type_num\";\nstatic char __pyx_k__byteorder[] = \"byteorder\";\nstatic char __pyx_k__ValueError[] = \"ValueError\";\nstatic char __pyx_k__suboffsets[] = \"suboffsets\";\nstatic char __pyx_k__work_module[] = \"work_module\";\nstatic char __pyx_k__RuntimeError[] = \"RuntimeError\";\nstatic char __pyx_k__pure_py_test[] = \"pure_py_test\";\nstatic char __pyx_k__wrapper_inner[] = \"wrapper_inner\";\nstatic char __pyx_k__do_awesome_work[] = \"do_awesome_work\";\nstatic PyObject *__pyx_kp_s_1;\nstatic PyObject *__pyx_kp_u_11;\nstatic PyObject *__pyx_kp_u_12;\nstatic PyObject *__pyx_kp_u_15;\nstatic PyObject *__pyx_kp_s_2;\nstatic PyObject *__pyx_kp_s_3;\nstatic PyObject *__pyx_kp_u_5;\nstatic PyObject *__pyx_kp_u_7;\nstatic PyObject *__pyx_kp_u_9;\nstatic PyObject *__pyx_n_s__RuntimeError;\nstatic PyObject *__pyx_n_s__ValueError;\nstatic PyObject *__pyx_n_s____main__;\nstatic PyObject *__pyx_n_s____test__;\nstatic PyObject *__pyx_n_s__base;\nstatic PyObject *__pyx_n_s__buf;\nstatic PyObject *__pyx_n_s__byteorder;\nstatic PyObject *__pyx_n_s__descr;\nstatic PyObject *__pyx_n_s__do_awesome_work;\nstatic PyObject *__pyx_n_s__fields;\nstatic PyObject *__pyx_n_s__format;\nstatic PyObject *__pyx_n_s__itemsize;\nstatic PyObject *__pyx_n_s__names;\nstatic PyObject *__pyx_n_s__ndim;\nstatic PyObject *__pyx_n_s__np;\nstatic PyObject *__pyx_n_s__numpy;\nstatic PyObject *__pyx_n_s__obj;\nstatic PyObject *__pyx_n_s__ones;\nstatic PyObject *__pyx_n_s__pure_py_test;\nstatic PyObject *__pyx_n_s__range;\nstatic PyObject *__pyx_n_s__readonly;\nstatic PyObject *__pyx_n_s__shape;\nstatic PyObject *__pyx_n_s__strides;\nstatic PyObject *__pyx_n_s__suboffsets;\nstatic PyObject *__pyx_n_s__type_num;\nstatic PyObject *__pyx_n_s__work_module;\nstatic PyObject *__pyx_n_s__wrapper_inner;\nstatic PyObject *__pyx_int_5;\nstatic PyObject *__pyx_int_15;\nstatic PyObject *__pyx_k_tuple_4;\nstatic PyObject *__pyx_k_tuple_6;\nstatic PyObject *__pyx_k_tuple_8;\nstatic PyObject *__pyx_k_tuple_10;\nstatic PyObject *__pyx_k_tuple_13;\nstatic PyObject *__pyx_k_tuple_14;\nstatic PyObject *__pyx_k_tuple_16;\n\n/* \"wrapper_inner.pyx\":18\n * # Here is the Cython portion of the wrapper.\n * # Important: this function must be declared with \"api\" keyword!\n * cdef api void inner_work_1d(int num_x, double* data_ptr, double* answer_ptr):             # <<<<<<<<<<<<<<\n * \n *     print('\\nHello from Cython inner_work_1d!')\n */\n\nstatic  void inner_work_1d(int __pyx_v_num_x, double *__pyx_v_data_ptr, double *__pyx_v_answer_ptr) {\n  int __pyx_v_nd;\n  npy_intp *__pyx_v_dims;\n  int __pyx_v_typenum;\n  PyArrayObject *__pyx_v_data_np = 0;\n  double __pyx_v_sum;\n  npy_intp __pyx_t_1[1];\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  __Pyx_RefNannySetupContext(\"inner_work_1d\");\n\n  /* \"wrapper_inner.pyx\":20\n * cdef api void inner_work_1d(int num_x, double* data_ptr, double* answer_ptr):\n * \n *     print('\\nHello from Cython inner_work_1d!')             # <<<<<<<<<<<<<<\n * \n *     # Convert input data into form useable by Python, with lots of help from Numpy.\n */\n  if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  /* \"wrapper_inner.pyx\":25\n * \n *     # http://www.mail-archive.com/cython-dev@codespeak.net/msg05823.html\n *     cdef int nd = 1             # <<<<<<<<<<<<<<\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x]  # analogous to: double a[4] = {0.5, 0.3, 0.1, 0.1}\n *     cdef int typenum = np.NPY_DOUBLE\n */\n  __pyx_v_nd = 1;\n\n  /* \"wrapper_inner.pyx\":26\n *     # http://www.mail-archive.com/cython-dev@codespeak.net/msg05823.html\n *     cdef int nd = 1\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x]  # analogous to: double a[4] = {0.5, 0.3, 0.1, 0.1}             # <<<<<<<<<<<<<<\n *     cdef int typenum = np.NPY_DOUBLE\n * \n */\n  __pyx_t_1[0] = ((npy_intp)__pyx_v_num_x);\n  __pyx_v_dims = __pyx_t_1;\n\n  /* \"wrapper_inner.pyx\":27\n *     cdef int nd = 1\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x]  # analogous to: double a[4] = {0.5, 0.3, 0.1, 0.1}\n *     cdef int typenum = np.NPY_DOUBLE             # <<<<<<<<<<<<<<\n * \n *     cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, <void*>data_ptr)\n */\n  __pyx_v_typenum = NPY_DOUBLE;\n\n  /* \"wrapper_inner.pyx\":29\n *     cdef int typenum = np.NPY_DOUBLE\n * \n *     cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, <void*>data_ptr)             # <<<<<<<<<<<<<<\n * \n *     # Do the work.\n */\n  __pyx_t_2 = PyArray_SimpleNewFromData(__pyx_v_nd, __pyx_v_dims, __pyx_v_typenum, ((void *)__pyx_v_data_ptr)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_v_data_np = ((PyArrayObject *)__pyx_t_2);\n  __pyx_t_2 = 0;\n\n  /* \"wrapper_inner.pyx\":32\n * \n *     # Do the work.\n *     cdef double sum = work_module.do_awesome_work(data_np)             # <<<<<<<<<<<<<<\n * \n *     # # Convert work results into a form useable by the calling C++ application.\n */\n  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__work_module); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__do_awesome_work); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_3);\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_t_2));\n  __Pyx_INCREF(((PyObject *)__pyx_v_data_np));\n  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_data_np));\n  __Pyx_GIVEREF(((PyObject *)__pyx_v_data_np));\n  __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_4);\n  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n  __pyx_v_sum = __pyx_t_5;\n\n  /* \"wrapper_inner.pyx\":35\n * \n *     # # Convert work results into a form useable by the calling C++ application.\n *     answer_ptr[0] = sum             # <<<<<<<<<<<<<<\n * \n *     # Done.\n */\n  (__pyx_v_answer_ptr[0]) = __pyx_v_sum;\n\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"wrapper_inner.inner_work_1d\");\n  __pyx_L0:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_data_np);\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"wrapper_inner.pyx\":40\n * \n * \n * cdef api void inner_work_2d(int num_x, int num_y, double* data_ptr, double* answer_ptr):             # <<<<<<<<<<<<<<\n * \n *     print('\\nHello from Cython inner_work_2d!')\n */\n\nstatic  void inner_work_2d(int __pyx_v_num_x, int __pyx_v_num_y, double *__pyx_v_data_ptr, double *__pyx_v_answer_ptr) {\n  int __pyx_v_nd;\n  npy_intp *__pyx_v_dims;\n  int __pyx_v_typenum;\n  PyArrayObject *__pyx_v_data_np = 0;\n  double __pyx_v_sum;\n  npy_intp __pyx_t_1[2];\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  __Pyx_RefNannySetupContext(\"inner_work_2d\");\n\n  /* \"wrapper_inner.pyx\":42\n * cdef api void inner_work_2d(int num_x, int num_y, double* data_ptr, double* answer_ptr):\n * \n *     print('\\nHello from Cython inner_work_2d!')             # <<<<<<<<<<<<<<\n * \n *     # Convert input data into form useable by Python, with lots of help from Numpy.\n */\n  if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  /* \"wrapper_inner.pyx\":45\n * \n *     # Convert input data into form useable by Python, with lots of help from Numpy.\n *     cdef int nd = 2             # <<<<<<<<<<<<<<\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x, <np.npy_intp>num_y]\n *     cdef int typenum = np.NPY_DOUBLE\n */\n  __pyx_v_nd = 2;\n\n  /* \"wrapper_inner.pyx\":46\n *     # Convert input data into form useable by Python, with lots of help from Numpy.\n *     cdef int nd = 2\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x, <np.npy_intp>num_y]             # <<<<<<<<<<<<<<\n *     cdef int typenum = np.NPY_DOUBLE\n * \n */\n  __pyx_t_1[0] = ((npy_intp)__pyx_v_num_x);\n  __pyx_t_1[1] = ((npy_intp)__pyx_v_num_y);\n  __pyx_v_dims = __pyx_t_1;\n\n  /* \"wrapper_inner.pyx\":47\n *     cdef int nd = 2\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x, <np.npy_intp>num_y]\n *     cdef int typenum = np.NPY_DOUBLE             # <<<<<<<<<<<<<<\n * \n *     cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, <void*>data_ptr)\n */\n  __pyx_v_typenum = NPY_DOUBLE;\n\n  /* \"wrapper_inner.pyx\":49\n *     cdef int typenum = np.NPY_DOUBLE\n * \n *     cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, <void*>data_ptr)             # <<<<<<<<<<<<<<\n * \n *     # Do the work.\n */\n  __pyx_t_2 = PyArray_SimpleNewFromData(__pyx_v_nd, __pyx_v_dims, __pyx_v_typenum, ((void *)__pyx_v_data_ptr)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_v_data_np = ((PyArrayObject *)__pyx_t_2);\n  __pyx_t_2 = 0;\n\n  /* \"wrapper_inner.pyx\":52\n * \n *     # Do the work.\n *     cdef double sum = work_module.do_awesome_work(data_np)             # <<<<<<<<<<<<<<\n * \n *     # # Convert work results into a form useable by the calling C++ application.\n */\n  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__work_module); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__do_awesome_work); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_3);\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_t_2));\n  __Pyx_INCREF(((PyObject *)__pyx_v_data_np));\n  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_data_np));\n  __Pyx_GIVEREF(((PyObject *)__pyx_v_data_np));\n  __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_4);\n  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n  __pyx_v_sum = __pyx_t_5;\n\n  /* \"wrapper_inner.pyx\":55\n * \n *     # # Convert work results into a form useable by the calling C++ application.\n *     answer_ptr[0] = sum             # <<<<<<<<<<<<<<\n * \n * \n */\n  (__pyx_v_answer_ptr[0]) = __pyx_v_sum;\n\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"wrapper_inner.inner_work_2d\");\n  __pyx_L0:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_data_np);\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"wrapper_inner.pyx\":64\n * \n * \n * def pure_py_test():             # <<<<<<<<<<<<<<\n * \n *     print('\\nHello from a pure Python function inside the Cython module.')\n */\n\nstatic PyObject *__pyx_pf_13wrapper_inner_pure_py_test(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyMethodDef __pyx_mdef_13wrapper_inner_pure_py_test = {__Pyx_NAMESTR(\"pure_py_test\"), (PyCFunction)__pyx_pf_13wrapper_inner_pure_py_test, METH_NOARGS, __Pyx_DOCSTR(0)};\nstatic PyObject *__pyx_pf_13wrapper_inner_pure_py_test(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_v_data;\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  __Pyx_RefNannySetupContext(\"pure_py_test\");\n  __pyx_self = __pyx_self;\n  __pyx_v_data = Py_None; __Pyx_INCREF(Py_None);\n\n  /* \"wrapper_inner.pyx\":66\n * def pure_py_test():\n * \n *     print('\\nHello from a pure Python function inside the Cython module.')             # <<<<<<<<<<<<<<\n * \n *     data = np.ones(5)\n */\n  if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_3)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  /* \"wrapper_inner.pyx\":68\n *     print('\\nHello from a pure Python function inside the Cython module.')\n * \n *     data = np.ones(5)             # <<<<<<<<<<<<<<\n *     work_module.do_awesome_work(data)\n */\n  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__ones); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n  __Pyx_DECREF(__pyx_v_data);\n  __pyx_v_data = __pyx_t_1;\n  __pyx_t_1 = 0;\n\n  /* \"wrapper_inner.pyx\":69\n * \n *     data = np.ones(5)\n *     work_module.do_awesome_work(data)             # <<<<<<<<<<<<<<\n */\n  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__work_module); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__do_awesome_work); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_t_1));\n  __Pyx_INCREF(__pyx_v_data);\n  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_data);\n  __Pyx_GIVEREF(__pyx_v_data);\n  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_3);\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_AddTraceback(\"wrapper_inner.pure_py_test\");\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_DECREF(__pyx_v_data);\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":188\n *         # experimental exception made for __getbuffer__ and __releasebuffer__\n *         # -- the details of this may change.\n *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<\n *             # This implementation of getbuffer is geared towards Cython\n *             # requirements, and does not yet fullfill the PEP.\n */\n\nstatic CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/\nstatic CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {\n  int __pyx_v_copy_shape;\n  int __pyx_v_i;\n  int __pyx_v_ndim;\n  int __pyx_v_endian_detector;\n  int __pyx_v_little_endian;\n  int __pyx_v_t;\n  char *__pyx_v_f;\n  PyArray_Descr *__pyx_v_descr = 0;\n  int __pyx_v_offset;\n  int __pyx_v_hasfields;\n  int __pyx_r;\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_t_2;\n  int __pyx_t_3;\n  int __pyx_t_4;\n  int __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_t_7;\n  PyObject *__pyx_t_8 = NULL;\n  char *__pyx_t_9;\n  __Pyx_RefNannySetupContext(\"__getbuffer__\");\n  if (__pyx_v_info == NULL) return 0;\n  __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);\n  __Pyx_GIVEREF(__pyx_v_info->obj);\n\n  /* \"numpy.pxd\":194\n *             # of flags\n *             cdef int copy_shape, i, ndim\n *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n * \n */\n  __pyx_v_endian_detector = 1;\n\n  /* \"numpy.pxd\":195\n *             cdef int copy_shape, i, ndim\n *             cdef int endian_detector = 1\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<\n * \n *             ndim = PyArray_NDIM(self)\n */\n  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);\n\n  /* \"numpy.pxd\":197\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n * \n *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n */\n  __pyx_t_1 = __pyx_v_self;\n  __Pyx_INCREF(__pyx_t_1);\n  __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_t_1));\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"numpy.pxd\":199\n *             ndim = PyArray_NDIM(self)\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<\n *                 copy_shape = 1\n *             else:\n */\n  __pyx_t_2 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":200\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 copy_shape = 1             # <<<<<<<<<<<<<<\n *             else:\n *                 copy_shape = 0\n */\n    __pyx_v_copy_shape = 1;\n    goto __pyx_L5;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":202\n *                 copy_shape = 1\n *             else:\n *                 copy_shape = 0             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n */\n    __pyx_v_copy_shape = 0;\n  }\n  __pyx_L5:;\n\n  /* \"numpy.pxd\":204\n *                 copy_shape = 0\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n */\n  __pyx_t_2 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":205\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n * \n */\n    __pyx_t_1 = __pyx_v_self;\n    __Pyx_INCREF(__pyx_t_1);\n    __pyx_t_3 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_t_1), NPY_C_CONTIGUOUS));\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n    __pyx_t_4 = __pyx_t_3;\n  } else {\n    __pyx_t_4 = __pyx_t_2;\n  }\n  if (__pyx_t_4) {\n\n    /* \"numpy.pxd\":206\n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n */\n    __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_6), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    __Pyx_Raise(__pyx_t_1, 0, 0);\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    goto __pyx_L6;\n  }\n  __pyx_L6:;\n\n  /* \"numpy.pxd\":208\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n */\n  __pyx_t_4 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);\n  if (__pyx_t_4) {\n\n    /* \"numpy.pxd\":209\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n * \n */\n    __pyx_t_1 = __pyx_v_self;\n    __Pyx_INCREF(__pyx_t_1);\n    __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_t_1), NPY_F_CONTIGUOUS));\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n    __pyx_t_3 = __pyx_t_2;\n  } else {\n    __pyx_t_3 = __pyx_t_4;\n  }\n  if (__pyx_t_3) {\n\n    /* \"numpy.pxd\":210\n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")             # <<<<<<<<<<<<<<\n * \n *             info.buf = PyArray_DATA(self)\n */\n    __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_8), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    __Pyx_Raise(__pyx_t_1, 0, 0);\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    goto __pyx_L7;\n  }\n  __pyx_L7:;\n\n  /* \"numpy.pxd\":212\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n * \n *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<\n *             info.ndim = ndim\n *             if copy_shape:\n */\n  __pyx_t_1 = __pyx_v_self;\n  __Pyx_INCREF(__pyx_t_1);\n  __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_t_1));\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"numpy.pxd\":213\n * \n *             info.buf = PyArray_DATA(self)\n *             info.ndim = ndim             # <<<<<<<<<<<<<<\n *             if copy_shape:\n *                 # Allocate new buffer for strides and shape info. This is allocated\n */\n  __pyx_v_info->ndim = __pyx_v_ndim;\n\n  /* \"numpy.pxd\":214\n *             info.buf = PyArray_DATA(self)\n *             info.ndim = ndim\n *             if copy_shape:             # <<<<<<<<<<<<<<\n *                 # Allocate new buffer for strides and shape info. This is allocated\n *                 # as one block, strides first.\n */\n  if (__pyx_v_copy_shape) {\n\n    /* \"numpy.pxd\":217\n *                 # Allocate new buffer for strides and shape info. This is allocated\n *                 # as one block, strides first.\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)             # <<<<<<<<<<<<<<\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):\n */\n    __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2)));\n\n    /* \"numpy.pxd\":218\n *                 # as one block, strides first.\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)\n *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n */\n    __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);\n\n    /* \"numpy.pxd\":219\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):             # <<<<<<<<<<<<<<\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n */\n    __pyx_t_5 = __pyx_v_ndim;\n    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {\n      __pyx_v_i = __pyx_t_6;\n\n      /* \"numpy.pxd\":220\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n *             else:\n */\n      __pyx_t_1 = __pyx_v_self;\n      __Pyx_INCREF(__pyx_t_1);\n      (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_t_1))[__pyx_v_i]);\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n      /* \"numpy.pxd\":221\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n */\n      __pyx_t_1 = __pyx_v_self;\n      __Pyx_INCREF(__pyx_t_1);\n      (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(((PyArrayObject *)__pyx_t_1))[__pyx_v_i]);\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n    }\n    goto __pyx_L8;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":223\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)             # <<<<<<<<<<<<<<\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL\n */\n    __pyx_t_1 = __pyx_v_self;\n    __Pyx_INCREF(__pyx_t_1);\n    __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_t_1)));\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n    /* \"numpy.pxd\":224\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)             # <<<<<<<<<<<<<<\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)\n */\n    __pyx_t_1 = __pyx_v_self;\n    __Pyx_INCREF(__pyx_t_1);\n    __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(((PyArrayObject *)__pyx_t_1)));\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n  __pyx_L8:;\n\n  /* \"numpy.pxd\":225\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL             # <<<<<<<<<<<<<<\n *             info.itemsize = PyArray_ITEMSIZE(self)\n *             info.readonly = not PyArray_ISWRITEABLE(self)\n */\n  __pyx_v_info->suboffsets = NULL;\n\n  /* \"numpy.pxd\":226\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<\n *             info.readonly = not PyArray_ISWRITEABLE(self)\n * \n */\n  __pyx_t_1 = __pyx_v_self;\n  __Pyx_INCREF(__pyx_t_1);\n  __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_t_1));\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"numpy.pxd\":227\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)\n *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<\n * \n *             cdef int t\n */\n  __pyx_t_1 = __pyx_v_self;\n  __Pyx_INCREF(__pyx_t_1);\n  __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_t_1)));\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"numpy.pxd\":230\n * \n *             cdef int t\n *             cdef char* f = NULL             # <<<<<<<<<<<<<<\n *             cdef dtype descr = self.descr\n *             cdef list stack\n */\n  __pyx_v_f = NULL;\n\n  /* \"numpy.pxd\":231\n *             cdef int t\n *             cdef char* f = NULL\n *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<\n *             cdef list stack\n *             cdef int offset\n */\n  __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));\n  __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;\n\n  /* \"numpy.pxd\":235\n *             cdef int offset\n * \n *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<\n * \n *             if not hasfields and not copy_shape:\n */\n  __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);\n\n  /* \"numpy.pxd\":237\n *             cdef bint hasfields = PyDataType_HASFIELDS(descr)\n * \n *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<\n *                 # do not call releasebuffer\n *                 info.obj = None\n */\n  __pyx_t_3 = (!__pyx_v_hasfields);\n  if (__pyx_t_3) {\n    __pyx_t_4 = (!__pyx_v_copy_shape);\n    __pyx_t_2 = __pyx_t_4;\n  } else {\n    __pyx_t_2 = __pyx_t_3;\n  }\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":239\n *             if not hasfields and not copy_shape:\n *                 # do not call releasebuffer\n *                 info.obj = None             # <<<<<<<<<<<<<<\n *             else:\n *                 # need to call releasebuffer\n */\n    __Pyx_INCREF(Py_None);\n    __Pyx_GIVEREF(Py_None);\n    __Pyx_GOTREF(__pyx_v_info->obj);\n    __Pyx_DECREF(__pyx_v_info->obj);\n    __pyx_v_info->obj = Py_None;\n    goto __pyx_L11;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":242\n *             else:\n *                 # need to call releasebuffer\n *                 info.obj = self             # <<<<<<<<<<<<<<\n * \n *             if not hasfields:\n */\n    __Pyx_INCREF(__pyx_v_self);\n    __Pyx_GIVEREF(__pyx_v_self);\n    __Pyx_GOTREF(__pyx_v_info->obj);\n    __Pyx_DECREF(__pyx_v_info->obj);\n    __pyx_v_info->obj = __pyx_v_self;\n  }\n  __pyx_L11:;\n\n  /* \"numpy.pxd\":244\n *                 info.obj = self\n * \n *             if not hasfields:             # <<<<<<<<<<<<<<\n *                 t = descr.type_num\n *                 if ((descr.byteorder == '>' and little_endian) or\n */\n  __pyx_t_2 = (!__pyx_v_hasfields);\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":245\n * \n *             if not hasfields:\n *                 t = descr.type_num             # <<<<<<<<<<<<<<\n *                 if ((descr.byteorder == '>' and little_endian) or\n *                     (descr.byteorder == '<' and not little_endian)):\n */\n    __pyx_v_t = __pyx_v_descr->type_num;\n\n    /* \"numpy.pxd\":246\n *             if not hasfields:\n *                 t = descr.type_num\n *                 if ((descr.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<\n *                     (descr.byteorder == '<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")\n */\n    __pyx_t_2 = (__pyx_v_descr->byteorder == '>');\n    if (__pyx_t_2) {\n      __pyx_t_3 = __pyx_v_little_endian;\n    } else {\n      __pyx_t_3 = __pyx_t_2;\n    }\n    if (!__pyx_t_3) {\n\n      /* \"numpy.pxd\":247\n *                 t = descr.type_num\n *                 if ((descr.byteorder == '>' and little_endian) or\n *                     (descr.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"\n */\n      __pyx_t_2 = (__pyx_v_descr->byteorder == '<');\n      if (__pyx_t_2) {\n        __pyx_t_4 = (!__pyx_v_little_endian);\n        __pyx_t_7 = __pyx_t_4;\n      } else {\n        __pyx_t_7 = __pyx_t_2;\n      }\n      __pyx_t_2 = __pyx_t_7;\n    } else {\n      __pyx_t_2 = __pyx_t_3;\n    }\n    if (__pyx_t_2) {\n\n      /* \"numpy.pxd\":248\n *                 if ((descr.byteorder == '>' and little_endian) or\n *                     (descr.byteorder == '<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n */\n      __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_1);\n      __Pyx_Raise(__pyx_t_1, 0, 0);\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L13;\n    }\n    __pyx_L13:;\n\n    /* \"numpy.pxd\":249\n *                     (descr.byteorder == '<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_BYTE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__b;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":250\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_UBYTE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__B;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":251\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_SHORT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__h;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":252\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_USHORT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__H;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":253\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_INT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__i;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":254\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_UINT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__I;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":255\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_LONG);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__l;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":256\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_ULONG);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__L;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":257\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_LONGLONG);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__q;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":258\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_ULONGLONG);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__Q;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":259\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_FLOAT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__f;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":260\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_DOUBLE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__d;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":261\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_LONGDOUBLE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__g;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":262\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_CFLOAT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__Zf;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":263\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n *                 elif t == NPY_OBJECT:      f = \"O\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_CDOUBLE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__Zd;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":264\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_OBJECT:      f = \"O\"\n *                 else:\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_CLONGDOUBLE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__Zg;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":265\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n *                 elif t == NPY_OBJECT:      f = \"O\"             # <<<<<<<<<<<<<<\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_OBJECT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__O;\n      goto __pyx_L14;\n    }\n    /*else*/ {\n\n      /* \"numpy.pxd\":267\n *                 elif t == NPY_OBJECT:      f = \"O\"\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)             # <<<<<<<<<<<<<<\n *                 info.format = f\n *                 return\n */\n      __pyx_t_1 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_1);\n      __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_11), __pyx_t_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_8));\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_1));\n      PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_8));\n      __Pyx_GIVEREF(((PyObject *)__pyx_t_8));\n      __pyx_t_8 = 0;\n      __pyx_t_8 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_8);\n      __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n      __Pyx_Raise(__pyx_t_8, 0, 0);\n      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    }\n    __pyx_L14:;\n\n    /* \"numpy.pxd\":268\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *                 info.format = f             # <<<<<<<<<<<<<<\n *                 return\n *             else:\n */\n    __pyx_v_info->format = __pyx_v_f;\n\n    /* \"numpy.pxd\":269\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *                 info.format = f\n *                 return             # <<<<<<<<<<<<<<\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n */\n    __pyx_r = 0;\n    goto __pyx_L0;\n    goto __pyx_L12;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":271\n *                 return\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<\n *                 info.format[0] = '^' # Native data types, manual alignment\n *                 offset = 0\n */\n    __pyx_v_info->format = ((char *)malloc(255));\n\n    /* \"numpy.pxd\":272\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n *                 info.format[0] = '^' # Native data types, manual alignment             # <<<<<<<<<<<<<<\n *                 offset = 0\n *                 f = _util_dtypestring(descr, info.format + 1,\n */\n    (__pyx_v_info->format[0]) = '^';\n\n    /* \"numpy.pxd\":273\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n *                 info.format[0] = '^' # Native data types, manual alignment\n *                 offset = 0             # <<<<<<<<<<<<<<\n *                 f = _util_dtypestring(descr, info.format + 1,\n *                                       info.format + _buffer_format_string_len,\n */\n    __pyx_v_offset = 0;\n\n    /* \"numpy.pxd\":276\n *                 f = _util_dtypestring(descr, info.format + 1,\n *                                       info.format + _buffer_format_string_len,\n *                                       &offset)             # <<<<<<<<<<<<<<\n *                 f[0] = 0 # Terminate format string\n * \n */\n    __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __pyx_v_f = __pyx_t_9;\n\n    /* \"numpy.pxd\":277\n *                                       info.format + _buffer_format_string_len,\n *                                       &offset)\n *                 f[0] = 0 # Terminate format string             # <<<<<<<<<<<<<<\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n */\n    (__pyx_v_f[0]) = 0;\n  }\n  __pyx_L12:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_8);\n  __Pyx_AddTraceback(\"numpy.ndarray.__getbuffer__\");\n  __pyx_r = -1;\n  __Pyx_GOTREF(__pyx_v_info->obj);\n  __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;\n  goto __pyx_L2;\n  __pyx_L0:;\n  if (__pyx_v_info->obj == Py_None) {\n    __Pyx_GOTREF(Py_None);\n    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;\n  }\n  __pyx_L2:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_descr);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":279\n *                 f[0] = 0 # Terminate format string\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)\n */\n\nstatic CYTHON_UNUSED void __pyx_pf_5numpy_7ndarray_1__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/\nstatic CYTHON_UNUSED void __pyx_pf_5numpy_7ndarray_1__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_t_2;\n  __Pyx_RefNannySetupContext(\"__releasebuffer__\");\n\n  /* \"numpy.pxd\":280\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n */\n  __pyx_t_1 = __pyx_v_self;\n  __Pyx_INCREF(__pyx_t_1);\n  __pyx_t_2 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_t_1));\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":281\n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 stdlib.free(info.strides)\n */\n    free(__pyx_v_info->format);\n    goto __pyx_L5;\n  }\n  __pyx_L5:;\n\n  /* \"numpy.pxd\":282\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<\n *                 stdlib.free(info.strides)\n *                 # info.shape was stored after info.strides in the same block\n */\n  __pyx_t_2 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":283\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<\n *                 # info.shape was stored after info.strides in the same block\n * \n */\n    free(__pyx_v_info->strides);\n    goto __pyx_L6;\n  }\n  __pyx_L6:;\n\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"numpy.pxd\":756\n * ctypedef npy_cdouble     complex_t\n * \n * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(1, <void*>a)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew1\");\n\n  /* \"numpy.pxd\":757\n * \n * cdef inline object PyArray_MultiIterNew1(a):\n *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew1\");\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":759\n *     return PyArray_MultiIterNew(1, <void*>a)\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew2\");\n\n  /* \"numpy.pxd\":760\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew2\");\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":762\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew3\");\n\n  /* \"numpy.pxd\":763\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew3\");\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":765\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew4\");\n\n  /* \"numpy.pxd\":766\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew4\");\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":768\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew5\");\n\n  /* \"numpy.pxd\":769\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<\n * \n * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew5\");\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":771\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)\n * \n * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<\n *     # Recursive utility function used in __getbuffer__ to get format\n *     # string. The new location in the format string is returned.\n */\n\nstatic CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {\n  PyArray_Descr *__pyx_v_child;\n  int __pyx_v_endian_detector;\n  int __pyx_v_little_endian;\n  PyObject *__pyx_v_fields;\n  PyObject *__pyx_v_childname;\n  PyObject *__pyx_v_new_offset;\n  PyObject *__pyx_v_t;\n  char *__pyx_r;\n  Py_ssize_t __pyx_t_1;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  PyObject *__pyx_t_5 = NULL;\n  int __pyx_t_6;\n  int __pyx_t_7;\n  int __pyx_t_8;\n  int __pyx_t_9;\n  long __pyx_t_10;\n  char *__pyx_t_11;\n  __Pyx_RefNannySetupContext(\"_util_dtypestring\");\n  __pyx_v_child = ((PyArray_Descr *)Py_None); __Pyx_INCREF(Py_None);\n  __pyx_v_fields = ((PyObject*)Py_None); __Pyx_INCREF(Py_None);\n  __pyx_v_childname = Py_None; __Pyx_INCREF(Py_None);\n  __pyx_v_new_offset = Py_None; __Pyx_INCREF(Py_None);\n  __pyx_v_t = Py_None; __Pyx_INCREF(Py_None);\n\n  /* \"numpy.pxd\":778\n *     cdef int delta_offset\n *     cdef tuple i\n *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<\n *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n *     cdef tuple fields\n */\n  __pyx_v_endian_detector = 1;\n\n  /* \"numpy.pxd\":779\n *     cdef tuple i\n *     cdef int endian_detector = 1\n *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<\n *     cdef tuple fields\n * \n */\n  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);\n\n  /* \"numpy.pxd\":782\n *     cdef tuple fields\n * \n *     for childname in descr.names:             # <<<<<<<<<<<<<<\n *         fields = descr.fields[childname]\n *         child, new_offset = fields\n */\n  if (unlikely(__pyx_v_descr->names == Py_None)) {\n    PyErr_SetString(PyExc_TypeError, \"'NoneType' object is not iterable\"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;} \n  }\n  __pyx_t_1 = 0; __pyx_t_2 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_2);\n  for (;;) {\n    if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;\n    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;\n    __Pyx_DECREF(__pyx_v_childname);\n    __pyx_v_childname = __pyx_t_3;\n    __pyx_t_3 = 0;\n\n    /* \"numpy.pxd\":783\n * \n *     for childname in descr.names:\n *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<\n *         child, new_offset = fields\n * \n */\n    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, \"Expected tuple, got %.200s\", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(((PyObject *)__pyx_v_fields));\n    __pyx_v_fields = ((PyObject*)__pyx_t_3);\n    __pyx_t_3 = 0;\n\n    /* \"numpy.pxd\":784\n *     for childname in descr.names:\n *         fields = descr.fields[childname]\n *         child, new_offset = fields             # <<<<<<<<<<<<<<\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n */\n    if (likely(((PyObject *)__pyx_v_fields) != Py_None) && likely(PyTuple_GET_SIZE(((PyObject *)__pyx_v_fields)) == 2)) {\n      PyObject* tuple = ((PyObject *)__pyx_v_fields);\n      __pyx_t_3 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_3);\n      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_t_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_4);\n      __Pyx_DECREF(((PyObject *)__pyx_v_child));\n      __pyx_v_child = ((PyArray_Descr *)__pyx_t_3);\n      __pyx_t_3 = 0;\n      __Pyx_DECREF(__pyx_v_new_offset);\n      __pyx_v_new_offset = __pyx_t_4;\n      __pyx_t_4 = 0;\n    } else {\n      __Pyx_UnpackTupleError(((PyObject *)__pyx_v_fields), 2);\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    }\n\n    /* \"numpy.pxd\":786\n *         child, new_offset = fields\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")\n * \n */\n    __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_4);\n    __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_5);\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n    __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_5);\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n    if (__pyx_t_6) {\n\n      /* \"numpy.pxd\":787\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")             # <<<<<<<<<<<<<<\n * \n *         if ((child.byteorder == '>' and little_endian) or\n */\n      __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_13), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_Raise(__pyx_t_5, 0, 0);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L5;\n    }\n    __pyx_L5:;\n\n    /* \"numpy.pxd\":789\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")\n * \n *         if ((child.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<\n *             (child.byteorder == '<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")\n */\n    __pyx_t_6 = (__pyx_v_child->byteorder == '>');\n    if (__pyx_t_6) {\n      __pyx_t_7 = __pyx_v_little_endian;\n    } else {\n      __pyx_t_7 = __pyx_t_6;\n    }\n    if (!__pyx_t_7) {\n\n      /* \"numpy.pxd\":790\n * \n *         if ((child.byteorder == '>' and little_endian) or\n *             (child.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<\n *             raise ValueError(u\"Non-native byte order not supported\")\n *             # One could encode it in the format string and have Cython\n */\n      __pyx_t_6 = (__pyx_v_child->byteorder == '<');\n      if (__pyx_t_6) {\n        __pyx_t_8 = (!__pyx_v_little_endian);\n        __pyx_t_9 = __pyx_t_8;\n      } else {\n        __pyx_t_9 = __pyx_t_6;\n      }\n      __pyx_t_6 = __pyx_t_9;\n    } else {\n      __pyx_t_6 = __pyx_t_7;\n    }\n    if (__pyx_t_6) {\n\n      /* \"numpy.pxd\":791\n *         if ((child.byteorder == '>' and little_endian) or\n *             (child.byteorder == '<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *             # One could encode it in the format string and have Cython\n *             # complain instead, BUT: < and > in format strings also imply\n */\n      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_14), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_Raise(__pyx_t_5, 0, 0);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L6;\n    }\n    __pyx_L6:;\n\n    /* \"numpy.pxd\":801\n * \n *         # Output padding bytes\n *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1\n */\n    while (1) {\n      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (!__pyx_t_6) break;\n\n      /* \"numpy.pxd\":802\n *         # Output padding bytes\n *         while offset[0] < new_offset:\n *             f[0] = 120 # \"x\"; pad byte             # <<<<<<<<<<<<<<\n *             f += 1\n *             offset[0] += 1\n */\n      (__pyx_v_f[0]) = 120;\n\n      /* \"numpy.pxd\":803\n *         while offset[0] < new_offset:\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1             # <<<<<<<<<<<<<<\n *             offset[0] += 1\n * \n */\n      __pyx_v_f = (__pyx_v_f + 1);\n\n      /* \"numpy.pxd\":804\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1\n *             offset[0] += 1             # <<<<<<<<<<<<<<\n * \n *         offset[0] += child.itemsize\n */\n      __pyx_t_10 = 0;\n      (__pyx_v_offset[__pyx_t_10]) = ((__pyx_v_offset[__pyx_t_10]) + 1);\n    }\n\n    /* \"numpy.pxd\":806\n *             offset[0] += 1\n * \n *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<\n * \n *         if not PyDataType_HASFIELDS(child):\n */\n    __pyx_t_10 = 0;\n    (__pyx_v_offset[__pyx_t_10]) = ((__pyx_v_offset[__pyx_t_10]) + __pyx_v_child->elsize);\n\n    /* \"numpy.pxd\":808\n *         offset[0] += child.itemsize\n * \n *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<\n *             t = child.type_num\n *             if end - f < 5:\n */\n    __pyx_t_6 = (!PyDataType_HASFIELDS(__pyx_v_child));\n    if (__pyx_t_6) {\n\n      /* \"numpy.pxd\":809\n * \n *         if not PyDataType_HASFIELDS(child):\n *             t = child.type_num             # <<<<<<<<<<<<<<\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")\n */\n      __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_v_t);\n      __pyx_v_t = __pyx_t_3;\n      __pyx_t_3 = 0;\n\n      /* \"numpy.pxd\":810\n *         if not PyDataType_HASFIELDS(child):\n *             t = child.type_num\n *             if end - f < 5:             # <<<<<<<<<<<<<<\n *                 raise RuntimeError(u\"Format string allocated too short.\")\n * \n */\n      __pyx_t_6 = ((__pyx_v_end - __pyx_v_f) < 5);\n      if (__pyx_t_6) {\n\n        /* \"numpy.pxd\":811\n *             t = child.type_num\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")             # <<<<<<<<<<<<<<\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n */\n        __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_16), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_3);\n        __Pyx_Raise(__pyx_t_3, 0, 0);\n        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        goto __pyx_L10;\n      }\n      __pyx_L10:;\n\n      /* \"numpy.pxd\":814\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 98;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":815\n *             # Until ticket #99 is fixed, use integers to avoid warnings\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 66;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":816\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 104;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":817\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 72;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":818\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 105;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":819\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 73;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":820\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 108;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":821\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 76;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":822\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 113;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":823\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 81;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":824\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 102;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":825\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 100;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":826\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 103;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":827\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 102;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":828\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 100;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":829\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n *             else:\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 103;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":830\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"             # <<<<<<<<<<<<<<\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 79;\n        goto __pyx_L11;\n      }\n      /*else*/ {\n\n        /* \"numpy.pxd\":832\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)             # <<<<<<<<<<<<<<\n *             f += 1\n *         else:\n */\n        __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_11), __pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(((PyObject *)__pyx_t_5));\n        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(((PyObject *)__pyx_t_3));\n        PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5));\n        __Pyx_GIVEREF(((PyObject *)__pyx_t_5));\n        __pyx_t_5 = 0;\n        __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_5);\n        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n        __Pyx_Raise(__pyx_t_5, 0, 0);\n        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      }\n      __pyx_L11:;\n\n      /* \"numpy.pxd\":833\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *             f += 1             # <<<<<<<<<<<<<<\n *         else:\n *             # Cython ignores struct boundary information (\"T{...}\"),\n */\n      __pyx_v_f = (__pyx_v_f + 1);\n      goto __pyx_L9;\n    }\n    /*else*/ {\n\n      /* \"numpy.pxd\":837\n *             # Cython ignores struct boundary information (\"T{...}\"),\n *             # so don't output it\n *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<\n *     return f\n * \n */\n      __pyx_t_11 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_11 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_v_f = __pyx_t_11;\n    }\n    __pyx_L9:;\n  }\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n\n  /* \"numpy.pxd\":838\n *             # so don't output it\n *             f = _util_dtypestring(child, f, end, offset)\n *     return f             # <<<<<<<<<<<<<<\n * \n * \n */\n  __pyx_r = __pyx_v_f;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_XDECREF(__pyx_t_5);\n  __Pyx_AddTraceback(\"numpy._util_dtypestring\");\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_DECREF((PyObject *)__pyx_v_child);\n  __Pyx_DECREF(__pyx_v_fields);\n  __Pyx_DECREF(__pyx_v_childname);\n  __Pyx_DECREF(__pyx_v_new_offset);\n  __Pyx_DECREF(__pyx_v_t);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":953\n * \n * \n * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<\n *      cdef PyObject* baseptr\n *      if base is None:\n */\n\nstatic CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {\n  PyObject *__pyx_v_baseptr;\n  int __pyx_t_1;\n  PyObject *__pyx_t_2 = NULL;\n  __Pyx_RefNannySetupContext(\"set_array_base\");\n\n  /* \"numpy.pxd\":955\n * cdef inline void set_array_base(ndarray arr, object base):\n *      cdef PyObject* baseptr\n *      if base is None:             # <<<<<<<<<<<<<<\n *          baseptr = NULL\n *      else:\n */\n  __pyx_t_1 = (__pyx_v_base == Py_None);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":956\n *      cdef PyObject* baseptr\n *      if base is None:\n *          baseptr = NULL             # <<<<<<<<<<<<<<\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!\n */\n    __pyx_v_baseptr = NULL;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":958\n *          baseptr = NULL\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)\n */\n    __pyx_t_2 = __pyx_v_base;\n    __Pyx_INCREF(__pyx_t_2);\n    Py_INCREF(__pyx_t_2);\n    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n\n    /* \"numpy.pxd\":959\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!\n *          baseptr = <PyObject*>base             # <<<<<<<<<<<<<<\n *      Py_XDECREF(arr.base)\n *      arr.base = baseptr\n */\n    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);\n  }\n  __pyx_L3:;\n\n  /* \"numpy.pxd\":960\n *          Py_INCREF(base) # important to do this before decref below!\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<\n *      arr.base = baseptr\n * \n */\n  Py_XDECREF(__pyx_v_arr->base);\n\n  /* \"numpy.pxd\":961\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)\n *      arr.base = baseptr             # <<<<<<<<<<<<<<\n * \n * cdef inline object get_array_base(ndarray arr):\n */\n  __pyx_v_arr->base = __pyx_v_baseptr;\n\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"numpy.pxd\":963\n *      arr.base = baseptr\n * \n * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<\n *     if arr.base is NULL:\n *         return None\n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {\n  PyObject *__pyx_r = NULL;\n  int __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"get_array_base\");\n\n  /* \"numpy.pxd\":964\n * \n * cdef inline object get_array_base(ndarray arr):\n *     if arr.base is NULL:             # <<<<<<<<<<<<<<\n *         return None\n *     else:\n */\n  __pyx_t_1 = (__pyx_v_arr->base == NULL);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":965\n * cdef inline object get_array_base(ndarray arr):\n *     if arr.base is NULL:\n *         return None             # <<<<<<<<<<<<<<\n *     else:\n *         return <object>arr.base\n */\n    __Pyx_XDECREF(__pyx_r);\n    __Pyx_INCREF(Py_None);\n    __pyx_r = Py_None;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":967\n *         return None\n *     else:\n *         return <object>arr.base             # <<<<<<<<<<<<<<\n */\n    __Pyx_XDECREF(__pyx_r);\n    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));\n    __pyx_r = ((PyObject *)__pyx_v_arr->base);\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\nstatic PyMethodDef __pyx_methods[] = {\n  {0, 0, 0, 0}\n};\n\n#if PY_MAJOR_VERSION >= 3\nstatic struct PyModuleDef __pyx_moduledef = {\n    PyModuleDef_HEAD_INIT,\n    __Pyx_NAMESTR(\"wrapper_inner\"),\n    0, /* m_doc */\n    -1, /* m_size */\n    __pyx_methods /* m_methods */,\n    NULL, /* m_reload */\n    NULL, /* m_traverse */\n    NULL, /* m_clear */\n    NULL /* m_free */\n};\n#endif\n\nstatic __Pyx_StringTabEntry __pyx_string_tab[] = {\n  {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},\n  {&__pyx_kp_u_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 1, 0, 0},\n  {&__pyx_kp_u_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 1, 0, 0},\n  {&__pyx_kp_u_15, __pyx_k_15, sizeof(__pyx_k_15), 0, 1, 0, 0},\n  {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},\n  {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0},\n  {&__pyx_kp_u_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0},\n  {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0},\n  {&__pyx_kp_u_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 1, 0, 0},\n  {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1},\n  {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1},\n  {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},\n  {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},\n  {&__pyx_n_s__base, __pyx_k__base, sizeof(__pyx_k__base), 0, 0, 1, 1},\n  {&__pyx_n_s__buf, __pyx_k__buf, sizeof(__pyx_k__buf), 0, 0, 1, 1},\n  {&__pyx_n_s__byteorder, __pyx_k__byteorder, sizeof(__pyx_k__byteorder), 0, 0, 1, 1},\n  {&__pyx_n_s__descr, __pyx_k__descr, sizeof(__pyx_k__descr), 0, 0, 1, 1},\n  {&__pyx_n_s__do_awesome_work, __pyx_k__do_awesome_work, sizeof(__pyx_k__do_awesome_work), 0, 0, 1, 1},\n  {&__pyx_n_s__fields, __pyx_k__fields, sizeof(__pyx_k__fields), 0, 0, 1, 1},\n  {&__pyx_n_s__format, __pyx_k__format, sizeof(__pyx_k__format), 0, 0, 1, 1},\n  {&__pyx_n_s__itemsize, __pyx_k__itemsize, sizeof(__pyx_k__itemsize), 0, 0, 1, 1},\n  {&__pyx_n_s__names, __pyx_k__names, sizeof(__pyx_k__names), 0, 0, 1, 1},\n  {&__pyx_n_s__ndim, __pyx_k__ndim, sizeof(__pyx_k__ndim), 0, 0, 1, 1},\n  {&__pyx_n_s__np, __pyx_k__np, sizeof(__pyx_k__np), 0, 0, 1, 1},\n  {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1},\n  {&__pyx_n_s__obj, __pyx_k__obj, sizeof(__pyx_k__obj), 0, 0, 1, 1},\n  {&__pyx_n_s__ones, __pyx_k__ones, sizeof(__pyx_k__ones), 0, 0, 1, 1},\n  {&__pyx_n_s__pure_py_test, __pyx_k__pure_py_test, sizeof(__pyx_k__pure_py_test), 0, 0, 1, 1},\n  {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1},\n  {&__pyx_n_s__readonly, __pyx_k__readonly, sizeof(__pyx_k__readonly), 0, 0, 1, 1},\n  {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1},\n  {&__pyx_n_s__strides, __pyx_k__strides, sizeof(__pyx_k__strides), 0, 0, 1, 1},\n  {&__pyx_n_s__suboffsets, __pyx_k__suboffsets, sizeof(__pyx_k__suboffsets), 0, 0, 1, 1},\n  {&__pyx_n_s__type_num, __pyx_k__type_num, sizeof(__pyx_k__type_num), 0, 0, 1, 1},\n  {&__pyx_n_s__work_module, __pyx_k__work_module, sizeof(__pyx_k__work_module), 0, 0, 1, 1},\n  {&__pyx_n_s__wrapper_inner, __pyx_k__wrapper_inner, sizeof(__pyx_k__wrapper_inner), 0, 0, 1, 1},\n  {0, 0, 0, 0, 0, 0, 0}\n};\nstatic int __Pyx_InitCachedBuiltins(void) {\n  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  return 0;\n  __pyx_L1_error:;\n  return -1;\n}\n\nstatic int __Pyx_InitCachedConstants(void) {\n  __Pyx_RefNannySetupContext(\"__Pyx_InitCachedConstants\");\n\n  /* \"wrapper_inner.pyx\":68\n *     print('\\nHello from a pure Python function inside the Cython module.')\n * \n *     data = np.ones(5)             # <<<<<<<<<<<<<<\n *     work_module.do_awesome_work(data)\n */\n  __pyx_k_tuple_4 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_4));\n  __Pyx_INCREF(__pyx_int_5);\n  PyTuple_SET_ITEM(__pyx_k_tuple_4, 0, __pyx_int_5);\n  __Pyx_GIVEREF(__pyx_int_5);\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_4));\n\n  /* \"numpy.pxd\":206\n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n */\n  __pyx_k_tuple_6 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_6));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_5));\n  PyTuple_SET_ITEM(__pyx_k_tuple_6, 0, ((PyObject *)__pyx_kp_u_5));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_6));\n\n  /* \"numpy.pxd\":210\n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")             # <<<<<<<<<<<<<<\n * \n *             info.buf = PyArray_DATA(self)\n */\n  __pyx_k_tuple_8 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_8));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));\n  PyTuple_SET_ITEM(__pyx_k_tuple_8, 0, ((PyObject *)__pyx_kp_u_7));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_8));\n\n  /* \"numpy.pxd\":248\n *                 if ((descr.byteorder == '>' and little_endian) or\n *                     (descr.byteorder == '<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n */\n  __pyx_k_tuple_10 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_10));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_9));\n  PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, ((PyObject *)__pyx_kp_u_9));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10));\n\n  /* \"numpy.pxd\":787\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")             # <<<<<<<<<<<<<<\n * \n *         if ((child.byteorder == '>' and little_endian) or\n */\n  __pyx_k_tuple_13 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_13));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_12));\n  PyTuple_SET_ITEM(__pyx_k_tuple_13, 0, ((PyObject *)__pyx_kp_u_12));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_12));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_13));\n\n  /* \"numpy.pxd\":791\n *         if ((child.byteorder == '>' and little_endian) or\n *             (child.byteorder == '<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *             # One could encode it in the format string and have Cython\n *             # complain instead, BUT: < and > in format strings also imply\n */\n  __pyx_k_tuple_14 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_14)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_14));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_9));\n  PyTuple_SET_ITEM(__pyx_k_tuple_14, 0, ((PyObject *)__pyx_kp_u_9));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_14));\n\n  /* \"numpy.pxd\":811\n *             t = child.type_num\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")             # <<<<<<<<<<<<<<\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n */\n  __pyx_k_tuple_16 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_16));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_15));\n  PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, ((PyObject *)__pyx_kp_u_15));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_15));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));\n  __Pyx_RefNannyFinishContext();\n  return 0;\n  __pyx_L1_error:;\n  __Pyx_RefNannyFinishContext();\n  return -1;\n}\n\nstatic int __Pyx_InitGlobals(void) {\n  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  __pyx_int_5 = PyInt_FromLong(5); if (unlikely(!__pyx_int_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  return 0;\n  __pyx_L1_error:;\n  return -1;\n}\n\n#if PY_MAJOR_VERSION < 3\nPyMODINIT_FUNC initwrapper_inner(void); /*proto*/\nPyMODINIT_FUNC initwrapper_inner(void)\n#else\nPyMODINIT_FUNC PyInit_wrapper_inner(void); /*proto*/\nPyMODINIT_FUNC PyInit_wrapper_inner(void)\n#endif\n{\n  PyObject *__pyx_t_1 = NULL;\n  #if CYTHON_REFNANNY\n  void* __pyx_refnanny = NULL;\n  __Pyx_RefNanny = __Pyx_RefNannyImportAPI(\"refnanny\");\n  if (!__Pyx_RefNanny) {\n      PyErr_Clear();\n      __Pyx_RefNanny = __Pyx_RefNannyImportAPI(\"Cython.Runtime.refnanny\");\n      if (!__Pyx_RefNanny)\n          Py_FatalError(\"failed to import 'refnanny' module\");\n  }\n  __pyx_refnanny = __Pyx_RefNanny->SetupContext(\"PyMODINIT_FUNC PyInit_wrapper_inner(void)\", __LINE__, __FILE__);\n  #endif\n  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_empty_bytes = PyBytes_FromStringAndSize(\"\", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #ifdef __pyx_binding_PyCFunctionType_USED\n  if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #endif\n  /*--- Library function declarations ---*/\n  /*--- Threads initialization code ---*/\n  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS\n  #ifdef WITH_THREAD /* Python build with threading support? */\n  PyEval_InitThreads();\n  #endif\n  #endif\n  /*--- Module creation code ---*/\n  #if PY_MAJOR_VERSION < 3\n  __pyx_m = Py_InitModule4(__Pyx_NAMESTR(\"wrapper_inner\"), __pyx_methods, 0, 0, PYTHON_API_VERSION);\n  #else\n  __pyx_m = PyModule_Create(&__pyx_moduledef);\n  #endif\n  if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  #if PY_MAJOR_VERSION < 3\n  Py_INCREF(__pyx_m);\n  #endif\n  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));\n  if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  if (__Pyx_SetAttrString(__pyx_m, \"__builtins__\", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  /*--- Initialize various global constants etc. ---*/\n  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__pyx_module_is_main_wrapper_inner) {\n    if (__Pyx_SetAttrString(__pyx_m, \"__name__\", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  }\n  /*--- Builtin init code ---*/\n  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Constants init code ---*/\n  if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Global init code ---*/\n  /*--- Function export code ---*/\n  if (__Pyx_ExportFunction(\"inner_work_1d\", (void (*)(void))inner_work_1d, \"void (int, double *, double *)\") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_ExportFunction(\"inner_work_2d\", (void (*)(void))inner_work_2d, \"void (int, int, double *, double *)\") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Type init code ---*/\n  /*--- Type import code ---*/\n  __pyx_ptype_5numpy_dtype = __Pyx_ImportType(\"numpy\", \"dtype\", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(\"numpy\", \"flatiter\", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(\"numpy\", \"broadcast\", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(\"numpy\", \"ndarray\", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(\"numpy\", \"ufunc\", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Function import code ---*/\n  /*--- Execution code ---*/\n\n  /* \"wrapper_inner.pyx\":2\n * \n * import numpy as np             # <<<<<<<<<<<<<<\n * cimport numpy as np\n * \n */\n  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"wrapper_inner.pyx\":5\n * cimport numpy as np\n * \n * np.import_array()             # <<<<<<<<<<<<<<\n * \n * from libcpp.vector cimport vector\n */\n  import_array();\n\n  /* \"wrapper_inner.pyx\":9\n * from libcpp.vector cimport vector\n * \n * import work_module             # <<<<<<<<<<<<<<\n * \n * # Declare any Numpy C-API functions that I want to use.\n */\n  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__work_module), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__work_module, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"wrapper_inner.pyx\":64\n * \n * \n * def pure_py_test():             # <<<<<<<<<<<<<<\n * \n *     print('\\nHello from a pure Python function inside the Cython module.')\n */\n  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_13wrapper_inner_pure_py_test, NULL, __pyx_n_s__wrapper_inner); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__pure_py_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"wrapper_inner.pyx\":2\n * \n * import numpy as np             # <<<<<<<<<<<<<<\n * cimport numpy as np\n * \n */\n  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_t_1));\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n\n  /* \"libc\\stdio.pxd\":1\n * # 7.19 Input/output <stdio.h>             # <<<<<<<<<<<<<<\n * \n * cdef extern from *:\n */\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  if (__pyx_m) {\n    __Pyx_AddTraceback(\"init wrapper_inner\");\n    Py_DECREF(__pyx_m); __pyx_m = 0;\n  } else if (!PyErr_Occurred()) {\n    PyErr_SetString(PyExc_ImportError, \"init wrapper_inner\");\n  }\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  #if PY_MAJOR_VERSION < 3\n  return;\n  #else\n  return __pyx_m;\n  #endif\n}\n\n/* Runtime support code */\n\nstatic CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {\n    if (unlikely(!type)) {\n        PyErr_Format(PyExc_SystemError, \"Missing type object\");\n        return 0;\n    }\n    if (likely(PyObject_TypeCheck(obj, type)))\n        return 1;\n    PyErr_Format(PyExc_TypeError, \"Cannot convert %.200s to %.200s\",\n                 Py_TYPE(obj)->tp_name, type->tp_name);\n    return 0;\n}\n\nstatic PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {\n    PyObject *result;\n    result = PyObject_GetAttr(dict, name);\n    if (!result)\n        PyErr_SetObject(PyExc_NameError, name);\n    return result;\n}\n\nstatic CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {\n    PyObject *tmp_type, *tmp_value, *tmp_tb;\n    PyThreadState *tstate = PyThreadState_GET();\n\n    tmp_type = tstate->curexc_type;\n    tmp_value = tstate->curexc_value;\n    tmp_tb = tstate->curexc_traceback;\n    tstate->curexc_type = type;\n    tstate->curexc_value = value;\n    tstate->curexc_traceback = tb;\n    Py_XDECREF(tmp_type);\n    Py_XDECREF(tmp_value);\n    Py_XDECREF(tmp_tb);\n}\n\nstatic CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {\n    PyThreadState *tstate = PyThreadState_GET();\n    *type = tstate->curexc_type;\n    *value = tstate->curexc_value;\n    *tb = tstate->curexc_traceback;\n\n    tstate->curexc_type = 0;\n    tstate->curexc_value = 0;\n    tstate->curexc_traceback = 0;\n}\n\n\n#if PY_MAJOR_VERSION < 3\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {\n    Py_XINCREF(type);\n    Py_XINCREF(value);\n    Py_XINCREF(tb);\n    /* First, check the traceback argument, replacing None with NULL. */\n    if (tb == Py_None) {\n        Py_DECREF(tb);\n        tb = 0;\n    }\n    else if (tb != NULL && !PyTraceBack_Check(tb)) {\n        PyErr_SetString(PyExc_TypeError,\n            \"raise: arg 3 must be a traceback or None\");\n        goto raise_error;\n    }\n    /* Next, replace a missing value with None */\n    if (value == NULL) {\n        value = Py_None;\n        Py_INCREF(value);\n    }\n    #if PY_VERSION_HEX < 0x02050000\n    if (!PyClass_Check(type))\n    #else\n    if (!PyType_Check(type))\n    #endif\n    {\n        /* Raising an instance.  The value should be a dummy. */\n        if (value != Py_None) {\n            PyErr_SetString(PyExc_TypeError,\n                \"instance exception may not have a separate value\");\n            goto raise_error;\n        }\n        /* Normalize to raise <class>, <instance> */\n        Py_DECREF(value);\n        value = type;\n        #if PY_VERSION_HEX < 0x02050000\n            if (PyInstance_Check(type)) {\n                type = (PyObject*) ((PyInstanceObject*)type)->in_class;\n                Py_INCREF(type);\n            }\n            else {\n                type = 0;\n                PyErr_SetString(PyExc_TypeError,\n                    \"raise: exception must be an old-style class or instance\");\n                goto raise_error;\n            }\n        #else\n            type = (PyObject*) Py_TYPE(type);\n            Py_INCREF(type);\n            if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {\n                PyErr_SetString(PyExc_TypeError,\n                    \"raise: exception class must be a subclass of BaseException\");\n                goto raise_error;\n            }\n        #endif\n    }\n\n    __Pyx_ErrRestore(type, value, tb);\n    return;\nraise_error:\n    Py_XDECREF(value);\n    Py_XDECREF(type);\n    Py_XDECREF(tb);\n    return;\n}\n\n#else /* Python 3+ */\n\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {\n    if (tb == Py_None) {\n        tb = 0;\n    } else if (tb && !PyTraceBack_Check(tb)) {\n        PyErr_SetString(PyExc_TypeError,\n            \"raise: arg 3 must be a traceback or None\");\n        goto bad;\n    }\n    if (value == Py_None)\n        value = 0;\n\n    if (PyExceptionInstance_Check(type)) {\n        if (value) {\n            PyErr_SetString(PyExc_TypeError,\n                \"instance exception may not have a separate value\");\n            goto bad;\n        }\n        value = type;\n        type = (PyObject*) Py_TYPE(value);\n    } else if (!PyExceptionClass_Check(type)) {\n        PyErr_SetString(PyExc_TypeError,\n            \"raise: exception class must be a subclass of BaseException\");\n        goto bad;\n    }\n\n    PyErr_SetObject(type, value);\n\n    if (tb) {\n        PyThreadState *tstate = PyThreadState_GET();\n        PyObject* tmp_tb = tstate->curexc_traceback;\n        if (tb != tmp_tb) {\n            Py_INCREF(tb);\n            tstate->curexc_traceback = tb;\n            Py_XDECREF(tmp_tb);\n        }\n    }\n\nbad:\n    return;\n}\n#endif\n\nstatic CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {\n    PyErr_SetString(PyExc_TypeError, \"'NoneType' object is not iterable\");\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {\n    PyErr_Format(PyExc_ValueError,\n        #if PY_VERSION_HEX < 0x02050000\n                 \"need more than %d value%s to unpack\", (int)index,\n        #else\n                 \"need more than %zd value%s to unpack\", index,\n        #endif\n                 (index == 1) ? \"\" : \"s\");\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {\n    PyErr_Format(PyExc_ValueError,\n        #if PY_VERSION_HEX < 0x02050000\n            \"too many values to unpack (expected %d)\", (int)expected);\n        #else\n            \"too many values to unpack (expected %zd)\", expected);\n        #endif\n}\n\nstatic void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {\n    if (t == Py_None) {\n      __Pyx_RaiseNoneNotIterableError();\n    } else if (PyTuple_GET_SIZE(t) < index) {\n      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));\n    } else {\n      __Pyx_RaiseTooManyValuesError(index);\n    }\n}\n\nstatic PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) {\n    PyObject *py_import = 0;\n    PyObject *empty_list = 0;\n    PyObject *module = 0;\n    PyObject *global_dict = 0;\n    PyObject *empty_dict = 0;\n    PyObject *list;\n    py_import = __Pyx_GetAttrString(__pyx_b, \"__import__\");\n    if (!py_import)\n        goto bad;\n    if (from_list)\n        list = from_list;\n    else {\n        empty_list = PyList_New(0);\n        if (!empty_list)\n            goto bad;\n        list = empty_list;\n    }\n    global_dict = PyModule_GetDict(__pyx_m);\n    if (!global_dict)\n        goto bad;\n    empty_dict = PyDict_New();\n    if (!empty_dict)\n        goto bad;\n    module = PyObject_CallFunctionObjArgs(py_import,\n        name, global_dict, empty_dict, list, NULL);\nbad:\n    Py_XDECREF(empty_list);\n    Py_XDECREF(py_import);\n    Py_XDECREF(empty_dict);\n    return module;\n}\n\n#if PY_MAJOR_VERSION < 3\nstatic PyObject *__Pyx_GetStdout(void) {\n    PyObject *f = PySys_GetObject((char *)\"stdout\");\n    if (!f) {\n        PyErr_SetString(PyExc_RuntimeError, \"lost sys.stdout\");\n    }\n    return f;\n}\n\nstatic int __Pyx_Print(PyObject* f, PyObject *arg_tuple, int newline) {\n    PyObject* v;\n    int i;\n\n    if (!f) {\n        if (!(f = __Pyx_GetStdout()))\n            return -1;\n    }\n    for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) {\n        if (PyFile_SoftSpace(f, 1)) {\n            if (PyFile_WriteString(\" \", f) < 0)\n                return -1;\n        }\n        v = PyTuple_GET_ITEM(arg_tuple, i);\n        if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0)\n            return -1;\n        if (PyString_Check(v)) {\n            char *s = PyString_AsString(v);\n            Py_ssize_t len = PyString_Size(v);\n            if (len > 0 &&\n                isspace(Py_CHARMASK(s[len-1])) &&\n                s[len-1] != ' ')\n                    PyFile_SoftSpace(f, 0);\n        }\n    }\n    if (newline) {\n        if (PyFile_WriteString(\"\\n\", f) < 0)\n            return -1;\n        PyFile_SoftSpace(f, 0);\n    }\n    return 0;\n}\n\n#else /* Python 3 has a print function */\n\nstatic int __Pyx_Print(PyObject* stream, PyObject *arg_tuple, int newline) {\n    PyObject* kwargs = 0;\n    PyObject* result = 0;\n    PyObject* end_string;\n    if (unlikely(!__pyx_print)) {\n        __pyx_print = __Pyx_GetAttrString(__pyx_b, \"print\");\n        if (!__pyx_print)\n            return -1;\n    }\n    if (stream) {\n        kwargs = PyDict_New();\n        if (unlikely(!kwargs))\n            return -1;\n        if (unlikely(PyDict_SetItemString(kwargs, \"file\", stream) < 0))\n            goto bad;\n        if (!newline) {\n            end_string = PyUnicode_FromStringAndSize(\" \", 1);\n            if (unlikely(!end_string))\n                goto bad;\n            if (PyDict_SetItemString(kwargs, \"end\", end_string) < 0) {\n                Py_DECREF(end_string);\n                goto bad;\n            }\n            Py_DECREF(end_string);\n        }\n    } else if (!newline) {\n        if (unlikely(!__pyx_print_kwargs)) {\n            __pyx_print_kwargs = PyDict_New();\n            if (unlikely(!__pyx_print_kwargs))\n                return -1;\n            end_string = PyUnicode_FromStringAndSize(\" \", 1);\n            if (unlikely(!end_string))\n                return -1;\n            if (PyDict_SetItemString(__pyx_print_kwargs, \"end\", end_string) < 0) {\n                Py_DECREF(end_string);\n                return -1;\n            }\n            Py_DECREF(end_string);\n        }\n        kwargs = __pyx_print_kwargs;\n    }\n    result = PyObject_Call(__pyx_print, arg_tuple, kwargs);\n    if (unlikely(kwargs) && (kwargs != __pyx_print_kwargs))\n        Py_DECREF(kwargs);\n    if (!result)\n        return -1;\n    Py_DECREF(result);\n    return 0;\nbad:\n    if (kwargs != __pyx_print_kwargs)\n        Py_XDECREF(kwargs);\n    return -1;\n}\n\n#endif\n\n#if PY_MAJOR_VERSION < 3\n\nstatic int __Pyx_PrintOne(PyObject* f, PyObject *o) {\n    if (!f) {\n        if (!(f = __Pyx_GetStdout()))\n            return -1;\n    }\n    if (PyFile_SoftSpace(f, 0)) {\n        if (PyFile_WriteString(\" \", f) < 0)\n            return -1;\n    }\n    if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0)\n        return -1;\n    if (PyFile_WriteString(\"\\n\", f) < 0)\n        return -1;\n    return 0;\n    /* the line below is just to avoid compiler\n     * compiler warnings about unused functions */\n    return __Pyx_Print(f, NULL, 0);\n}\n\n#else /* Python 3 has a print function */\n\nstatic int __Pyx_PrintOne(PyObject* stream, PyObject *o) {\n    int res;\n    PyObject* arg_tuple = PyTuple_New(1);\n    if (unlikely(!arg_tuple))\n        return -1;\n    Py_INCREF(o);\n    PyTuple_SET_ITEM(arg_tuple, 0, o);\n    res = __Pyx_Print(stream, arg_tuple, 1);\n    Py_DECREF(arg_tuple);\n    return res;\n}\n\n#endif\n\nstatic CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_Py_intptr_t(Py_intptr_t val) {\n    const Py_intptr_t neg_one = (Py_intptr_t)-1, const_zero = (Py_intptr_t)0;\n    const int is_unsigned = const_zero < neg_one;\n    if ((sizeof(Py_intptr_t) == sizeof(char))  ||\n        (sizeof(Py_intptr_t) == sizeof(short))) {\n        return PyInt_FromLong((long)val);\n    } else if ((sizeof(Py_intptr_t) == sizeof(int)) ||\n               (sizeof(Py_intptr_t) == sizeof(long))) {\n        if (is_unsigned)\n            return PyLong_FromUnsignedLong((unsigned long)val);\n        else\n            return PyInt_FromLong((long)val);\n    } else if (sizeof(Py_intptr_t) == sizeof(PY_LONG_LONG)) {\n        if (is_unsigned)\n            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val);\n        else\n            return PyLong_FromLongLong((PY_LONG_LONG)val);\n    } else {\n        int one = 1; int little = (int)*(unsigned char *)&one;\n        unsigned char *bytes = (unsigned char *)&val;\n        return _PyLong_FromByteArray(bytes, sizeof(Py_intptr_t), \n                                     little, !is_unsigned);\n    }\n}\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      return ::std::complex< float >(x, y);\n    }\n  #else\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      return x + y*(__pyx_t_float_complex)_Complex_I;\n    }\n  #endif\n#else\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      __pyx_t_float_complex z;\n      z.real = x;\n      z.imag = y;\n      return z;\n    }\n#endif\n\n#if CYTHON_CCOMPLEX\n#else\n    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n       return (a.real == b.real) && (a.imag == b.imag);\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real + b.real;\n        z.imag = a.imag + b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real - b.real;\n        z.imag = a.imag - b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real * b.real - a.imag * b.imag;\n        z.imag = a.real * b.imag + a.imag * b.real;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        float denom = b.real * b.real + b.imag * b.imag;\n        z.real = (a.real * b.real + a.imag * b.imag) / denom;\n        z.imag = (a.imag * b.real - a.real * b.imag) / denom;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) {\n        __pyx_t_float_complex z;\n        z.real = -a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) {\n       return (a.real == 0) && (a.imag == 0);\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) {\n        __pyx_t_float_complex z;\n        z.real =  a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    #if 1\n        static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) {\n          #if !defined(HAVE_HYPOT) || defined(_MSC_VER)\n            return sqrtf(z.real*z.real + z.imag*z.imag);\n          #else\n            return hypotf(z.real, z.imag);\n          #endif\n        }\n        static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n            __pyx_t_float_complex z;\n            float r, lnr, theta, z_r, z_theta;\n            if (b.imag == 0 && b.real == (int)b.real) {\n                if (b.real < 0) {\n                    float denom = a.real * a.real + a.imag * a.imag;\n                    a.real = a.real / denom;\n                    a.imag = -a.imag / denom;\n                    b.real = -b.real;\n                }\n                switch ((int)b.real) {\n                    case 0:\n                        z.real = 1;\n                        z.imag = 0;\n                        return z;\n                    case 1:\n                        return a;\n                    case 2:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(a, a);\n                    case 3:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(z, a);\n                    case 4:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(z, z);\n                }\n            }\n            if (a.imag == 0) {\n                if (a.real == 0) {\n                    return a;\n                }\n                r = a.real;\n                theta = 0;\n            } else {\n                r = __Pyx_c_absf(a);\n                theta = atan2f(a.imag, a.real);\n            }\n            lnr = logf(r);\n            z_r = expf(lnr * b.real - theta * b.imag);\n            z_theta = theta * b.real + lnr * b.imag;\n            z.real = z_r * cosf(z_theta);\n            z.imag = z_r * sinf(z_theta);\n            return z;\n        }\n    #endif\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      return ::std::complex< double >(x, y);\n    }\n  #else\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      return x + y*(__pyx_t_double_complex)_Complex_I;\n    }\n  #endif\n#else\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      __pyx_t_double_complex z;\n      z.real = x;\n      z.imag = y;\n      return z;\n    }\n#endif\n\n#if CYTHON_CCOMPLEX\n#else\n    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n       return (a.real == b.real) && (a.imag == b.imag);\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real + b.real;\n        z.imag = a.imag + b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real - b.real;\n        z.imag = a.imag - b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real * b.real - a.imag * b.imag;\n        z.imag = a.real * b.imag + a.imag * b.real;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        double denom = b.real * b.real + b.imag * b.imag;\n        z.real = (a.real * b.real + a.imag * b.imag) / denom;\n        z.imag = (a.imag * b.real - a.real * b.imag) / denom;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) {\n        __pyx_t_double_complex z;\n        z.real = -a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) {\n       return (a.real == 0) && (a.imag == 0);\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) {\n        __pyx_t_double_complex z;\n        z.real =  a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    #if 1\n        static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) {\n          #if !defined(HAVE_HYPOT) || defined(_MSC_VER)\n            return sqrt(z.real*z.real + z.imag*z.imag);\n          #else\n            return hypot(z.real, z.imag);\n          #endif\n        }\n        static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n            __pyx_t_double_complex z;\n            double r, lnr, theta, z_r, z_theta;\n            if (b.imag == 0 && b.real == (int)b.real) {\n                if (b.real < 0) {\n                    double denom = a.real * a.real + a.imag * a.imag;\n                    a.real = a.real / denom;\n                    a.imag = -a.imag / denom;\n                    b.real = -b.real;\n                }\n                switch ((int)b.real) {\n                    case 0:\n                        z.real = 1;\n                        z.imag = 0;\n                        return z;\n                    case 1:\n                        return a;\n                    case 2:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(a, a);\n                    case 3:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(z, a);\n                    case 4:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(z, z);\n                }\n            }\n            if (a.imag == 0) {\n                if (a.real == 0) {\n                    return a;\n                }\n                r = a.real;\n                theta = 0;\n            } else {\n                r = __Pyx_c_abs(a);\n                theta = atan2(a.imag, a.real);\n            }\n            lnr = log(r);\n            z_r = exp(lnr * b.real - theta * b.imag);\n            z_theta = theta * b.real + lnr * b.imag;\n            z.real = z_r * cos(z_theta);\n            z.imag = z_r * sin(z_theta);\n            return z;\n        }\n    #endif\n#endif\n\nstatic CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {\n    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned char\" :\n                    \"value too large to convert to unsigned char\");\n            }\n            return (unsigned char)-1;\n        }\n        return (unsigned char)val;\n    }\n    return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {\n    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned short\" :\n                    \"value too large to convert to unsigned short\");\n            }\n            return (unsigned short)-1;\n        }\n        return (unsigned short)val;\n    }\n    return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {\n    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned int\" :\n                    \"value too large to convert to unsigned int\");\n            }\n            return (unsigned int)-1;\n        }\n        return (unsigned int)val;\n    }\n    return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {\n    const char neg_one = (char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to char\" :\n                    \"value too large to convert to char\");\n            }\n            return (char)-1;\n        }\n        return (char)val;\n    }\n    return (char)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {\n    const short neg_one = (short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to short\" :\n                    \"value too large to convert to short\");\n            }\n            return (short)-1;\n        }\n        return (short)val;\n    }\n    return (short)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {\n    const int neg_one = (int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to int\" :\n                    \"value too large to convert to int\");\n            }\n            return (int)-1;\n        }\n        return (int)val;\n    }\n    return (int)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {\n    const signed char neg_one = (signed char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed char\" :\n                    \"value too large to convert to signed char\");\n            }\n            return (signed char)-1;\n        }\n        return (signed char)val;\n    }\n    return (signed char)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {\n    const signed short neg_one = (signed short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed short\" :\n                    \"value too large to convert to signed short\");\n            }\n            return (signed short)-1;\n        }\n        return (signed short)val;\n    }\n    return (signed short)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {\n    const signed int neg_one = (signed int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed int\" :\n                    \"value too large to convert to signed int\");\n            }\n            return (signed int)-1;\n        }\n        return (signed int)val;\n    }\n    return (signed int)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) {\n    const int neg_one = (int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to int\" :\n                    \"value too large to convert to int\");\n            }\n            return (int)-1;\n        }\n        return (int)val;\n    }\n    return (int)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {\n    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to unsigned long\");\n            return (unsigned long)-1;\n        }\n        return (unsigned long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to unsigned long\");\n                return (unsigned long)-1;\n            }\n            return PyLong_AsUnsignedLong(x);\n        } else {\n            return PyLong_AsLong(x);\n        }\n    } else {\n        unsigned long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (unsigned long)-1;\n        val = __Pyx_PyInt_AsUnsignedLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {\n    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to unsigned PY_LONG_LONG\");\n            return (unsigned PY_LONG_LONG)-1;\n        }\n        return (unsigned PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to unsigned PY_LONG_LONG\");\n                return (unsigned PY_LONG_LONG)-1;\n            }\n            return PyLong_AsUnsignedLongLong(x);\n        } else {\n            return PyLong_AsLongLong(x);\n        }\n    } else {\n        unsigned PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (unsigned PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsUnsignedLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {\n    const long neg_one = (long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to long\");\n            return (long)-1;\n        }\n        return (long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to long\");\n                return (long)-1;\n            }\n            return PyLong_AsUnsignedLong(x);\n        } else {\n            return PyLong_AsLong(x);\n        }\n    } else {\n        long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (long)-1;\n        val = __Pyx_PyInt_AsLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {\n    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to PY_LONG_LONG\");\n            return (PY_LONG_LONG)-1;\n        }\n        return (PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to PY_LONG_LONG\");\n                return (PY_LONG_LONG)-1;\n            }\n            return PyLong_AsUnsignedLongLong(x);\n        } else {\n            return PyLong_AsLongLong(x);\n        }\n    } else {\n        PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {\n    const signed long neg_one = (signed long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to signed long\");\n            return (signed long)-1;\n        }\n        return (signed long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to signed long\");\n                return (signed long)-1;\n            }\n            return PyLong_AsUnsignedLong(x);\n        } else {\n            return PyLong_AsLong(x);\n        }\n    } else {\n        signed long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (signed long)-1;\n        val = __Pyx_PyInt_AsSignedLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {\n    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to signed PY_LONG_LONG\");\n            return (signed PY_LONG_LONG)-1;\n        }\n        return (signed PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to signed PY_LONG_LONG\");\n                return (signed PY_LONG_LONG)-1;\n            }\n            return PyLong_AsUnsignedLongLong(x);\n        } else {\n            return PyLong_AsLongLong(x);\n        }\n    } else {\n        signed PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (signed PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsSignedLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic void __Pyx_WriteUnraisable(const char *name) {\n    PyObject *old_exc, *old_val, *old_tb;\n    PyObject *ctx;\n    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);\n    #if PY_MAJOR_VERSION < 3\n    ctx = PyString_FromString(name);\n    #else\n    ctx = PyUnicode_FromString(name);\n    #endif\n    __Pyx_ErrRestore(old_exc, old_val, old_tb);\n    if (!ctx) {\n        PyErr_WriteUnraisable(Py_None);\n    } else {\n        PyErr_WriteUnraisable(ctx);\n        Py_DECREF(ctx);\n    }\n}\n\nstatic int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) {\n    PyObject *d = 0;\n    PyObject *cobj = 0;\n    union {\n        void (*fp)(void);\n        void *p;\n    } tmp;\n\n    d = PyObject_GetAttrString(__pyx_m, (char *)\"__pyx_capi__\");\n    if (!d) {\n        PyErr_Clear();\n        d = PyDict_New();\n        if (!d)\n            goto bad;\n        Py_INCREF(d);\n        if (PyModule_AddObject(__pyx_m, (char *)\"__pyx_capi__\", d) < 0)\n            goto bad;\n    }\n    tmp.fp = f;\n#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)\n    cobj = PyCapsule_New(tmp.p, sig, 0);\n#else\n    cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0);\n#endif\n    if (!cobj)\n        goto bad;\n    if (PyDict_SetItemString(d, name, cobj) < 0)\n        goto bad;\n    Py_DECREF(cobj);\n    Py_DECREF(d);\n    return 0;\nbad:\n    Py_XDECREF(cobj);\n    Py_XDECREF(d);\n    return -1;\n}\n\n#ifndef __PYX_HAVE_RT_ImportType\n#define __PYX_HAVE_RT_ImportType\nstatic PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name,\n    long size, int strict)\n{\n    PyObject *py_module = 0;\n    PyObject *result = 0;\n    PyObject *py_name = 0;\n    char warning[200];\n\n    py_module = __Pyx_ImportModule(module_name);\n    if (!py_module)\n        goto bad;\n    #if PY_MAJOR_VERSION < 3\n    py_name = PyString_FromString(class_name);\n    #else\n    py_name = PyUnicode_FromString(class_name);\n    #endif\n    if (!py_name)\n        goto bad;\n    result = PyObject_GetAttr(py_module, py_name);\n    Py_DECREF(py_name);\n    py_name = 0;\n    Py_DECREF(py_module);\n    py_module = 0;\n    if (!result)\n        goto bad;\n    if (!PyType_Check(result)) {\n        PyErr_Format(PyExc_TypeError,\n            \"%s.%s is not a type object\",\n            module_name, class_name);\n        goto bad;\n    }\n    if (!strict && ((PyTypeObject *)result)->tp_basicsize > size) {\n        PyOS_snprintf(warning, sizeof(warning),\n            \"%s.%s size changed, may indicate binary incompatibility\",\n            module_name, class_name);\n        #if PY_VERSION_HEX < 0x02050000\n        PyErr_Warn(NULL, warning);\n        #else\n        PyErr_WarnEx(NULL, warning, 0);\n        #endif\n    }\n    else if (((PyTypeObject *)result)->tp_basicsize != size) {\n        PyErr_Format(PyExc_ValueError,\n            \"%s.%s has the wrong size, try recompiling\",\n            module_name, class_name);\n        goto bad;\n    }\n    return (PyTypeObject *)result;\nbad:\n    Py_XDECREF(py_module);\n    Py_XDECREF(result);\n    return 0;\n}\n#endif\n\n#ifndef __PYX_HAVE_RT_ImportModule\n#define __PYX_HAVE_RT_ImportModule\nstatic PyObject *__Pyx_ImportModule(const char *name) {\n    PyObject *py_name = 0;\n    PyObject *py_module = 0;\n\n    #if PY_MAJOR_VERSION < 3\n    py_name = PyString_FromString(name);\n    #else\n    py_name = PyUnicode_FromString(name);\n    #endif\n    if (!py_name)\n        goto bad;\n    py_module = PyImport_Import(py_name);\n    Py_DECREF(py_name);\n    return py_module;\nbad:\n    Py_XDECREF(py_name);\n    return 0;\n}\n#endif\n\n#include \"compile.h\"\n#include \"frameobject.h\"\n#include \"traceback.h\"\n\nstatic void __Pyx_AddTraceback(const char *funcname) {\n    PyObject *py_srcfile = 0;\n    PyObject *py_funcname = 0;\n    PyObject *py_globals = 0;\n    PyCodeObject *py_code = 0;\n    PyFrameObject *py_frame = 0;\n\n    #if PY_MAJOR_VERSION < 3\n    py_srcfile = PyString_FromString(__pyx_filename);\n    #else\n    py_srcfile = PyUnicode_FromString(__pyx_filename);\n    #endif\n    if (!py_srcfile) goto bad;\n    if (__pyx_clineno) {\n        #if PY_MAJOR_VERSION < 3\n        py_funcname = PyString_FromFormat( \"%s (%s:%d)\", funcname, __pyx_cfilenm, __pyx_clineno);\n        #else\n        py_funcname = PyUnicode_FromFormat( \"%s (%s:%d)\", funcname, __pyx_cfilenm, __pyx_clineno);\n        #endif\n    }\n    else {\n        #if PY_MAJOR_VERSION < 3\n        py_funcname = PyString_FromString(funcname);\n        #else\n        py_funcname = PyUnicode_FromString(funcname);\n        #endif\n    }\n    if (!py_funcname) goto bad;\n    py_globals = PyModule_GetDict(__pyx_m);\n    if (!py_globals) goto bad;\n    py_code = PyCode_New(\n        0,            /*int argcount,*/\n        #if PY_MAJOR_VERSION >= 3\n        0,            /*int kwonlyargcount,*/\n        #endif\n        0,            /*int nlocals,*/\n        0,            /*int stacksize,*/\n        0,            /*int flags,*/\n        __pyx_empty_bytes, /*PyObject *code,*/\n        __pyx_empty_tuple,  /*PyObject *consts,*/\n        __pyx_empty_tuple,  /*PyObject *names,*/\n        __pyx_empty_tuple,  /*PyObject *varnames,*/\n        __pyx_empty_tuple,  /*PyObject *freevars,*/\n        __pyx_empty_tuple,  /*PyObject *cellvars,*/\n        py_srcfile,   /*PyObject *filename,*/\n        py_funcname,  /*PyObject *name,*/\n        __pyx_lineno,   /*int firstlineno,*/\n        __pyx_empty_bytes  /*PyObject *lnotab*/\n    );\n    if (!py_code) goto bad;\n    py_frame = PyFrame_New(\n        PyThreadState_GET(), /*PyThreadState *tstate,*/\n        py_code,             /*PyCodeObject *code,*/\n        py_globals,          /*PyObject *globals,*/\n        0                    /*PyObject *locals*/\n    );\n    if (!py_frame) goto bad;\n    py_frame->f_lineno = __pyx_lineno;\n    PyTraceBack_Here(py_frame);\nbad:\n    Py_XDECREF(py_srcfile);\n    Py_XDECREF(py_funcname);\n    Py_XDECREF(py_code);\n    Py_XDECREF(py_frame);\n}\n\nstatic int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {\n    while (t->p) {\n        #if PY_MAJOR_VERSION < 3\n        if (t->is_unicode) {\n            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);\n        } else if (t->intern) {\n            *t->p = PyString_InternFromString(t->s);\n        } else {\n            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);\n        }\n        #else  /* Python 3+ has unicode identifiers */\n        if (t->is_unicode | t->is_str) {\n            if (t->intern) {\n                *t->p = PyUnicode_InternFromString(t->s);\n            } else if (t->encoding) {\n                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);\n            } else {\n                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);\n            }\n        } else {\n            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);\n        }\n        #endif\n        if (!*t->p)\n            return -1;\n        ++t;\n    }\n    return 0;\n}\n\n/* Type Conversion Functions */\n\nstatic CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {\n   int is_true = x == Py_True;\n   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;\n   else return PyObject_IsTrue(x);\n}\n\nstatic CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {\n  PyNumberMethods *m;\n  const char *name = NULL;\n  PyObject *res = NULL;\n#if PY_VERSION_HEX < 0x03000000\n  if (PyInt_Check(x) || PyLong_Check(x))\n#else\n  if (PyLong_Check(x))\n#endif\n    return Py_INCREF(x), x;\n  m = Py_TYPE(x)->tp_as_number;\n#if PY_VERSION_HEX < 0x03000000\n  if (m && m->nb_int) {\n    name = \"int\";\n    res = PyNumber_Int(x);\n  }\n  else if (m && m->nb_long) {\n    name = \"long\";\n    res = PyNumber_Long(x);\n  }\n#else\n  if (m && m->nb_int) {\n    name = \"int\";\n    res = PyNumber_Long(x);\n  }\n#endif\n  if (res) {\n#if PY_VERSION_HEX < 0x03000000\n    if (!PyInt_Check(res) && !PyLong_Check(res)) {\n#else\n    if (!PyLong_Check(res)) {\n#endif\n      PyErr_Format(PyExc_TypeError,\n                   \"__%s__ returned non-%s (type %.200s)\",\n                   name, name, Py_TYPE(res)->tp_name);\n      Py_DECREF(res);\n      return NULL;\n    }\n  }\n  else if (!PyErr_Occurred()) {\n    PyErr_SetString(PyExc_TypeError,\n                    \"an integer is required\");\n  }\n  return res;\n}\n\nstatic CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {\n  Py_ssize_t ival;\n  PyObject* x = PyNumber_Index(b);\n  if (!x) return -1;\n  ival = PyInt_AsSsize_t(x);\n  Py_DECREF(x);\n  return ival;\n}\n\nstatic CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {\n#if PY_VERSION_HEX < 0x02050000\n   if (ival <= LONG_MAX)\n       return PyInt_FromLong((long)ival);\n   else {\n       unsigned char *bytes = (unsigned char *) &ival;\n       int one = 1; int little = (int)*(unsigned char*)&one;\n       return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);\n   }\n#else\n   return PyInt_FromSize_t(ival);\n#endif\n}\n\nstatic CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {\n   unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);\n   if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) {\n       return (size_t)-1;\n   } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) {\n       PyErr_SetString(PyExc_OverflowError,\n                       \"value too large to convert to size_t\");\n       return (size_t)-1;\n   }\n   return (size_t)val;\n}\n\n\n#endif /* Py_PYTHON_H */\n"
  },
  {
    "path": "src/test/resources/samples/langs/CLIPS/demo.clp",
    "content": ";;;***************************\n;;;* DEFFACTS KNOWLEDGE BASE *\n;;;***************************\n\n(deffacts MAIN::knowledge-base\n   (welcome (message WelcomeMessage))\n   (goal (variable type.animal))\n   (legalanswers (values yes no))\n   (displayanswers (values \"Yes\" \"No\"))\n   (rule (if backbone is yes) \n         (then superphylum is backbone))\n   (rule (if backbone is no) \n         (then superphylum is jellyback))\n   (question (variable backbone)\n             (query backbone.query))\n   (rule (if superphylum is backbone and\n          warm.blooded is yes) \n         (then phylum is warm))\n   (rule (if superphylum is backbone and\n          warm.blooded is no) \n         (then phylum is cold))\n   (question (variable warm.blooded)\n             (query warm.blooded.query))\n   (rule (if superphylum is jellyback and\n          live.prime.in.soil is yes) \n         (then phylum is soil))\n   (rule (if superphylum is jellyback and\n          live.prime.in.soil is no) \n         (then phylum is elsewhere))\n   (question (variable live.prime.in.soil)\n             (query live.prime.in.soil.query))\n   (rule (if phylum is warm and\n          has.breasts is yes) \n         (then class is breasts))\n   (rule (if phylum is warm and\n          has.breasts is no) \n         (then type.animal is bird))\n   (question (variable has.breasts)\n             (query has.breasts.query))\n   (rule (if phylum is cold and\n          always.in.water is yes) \n         (then class is water))\n   (rule (if phylum is cold and\n          always.in.water is no) \n         (then class is dry))\n   (question (variable always.in.water)\n             (query always.in.water.query))\n   (rule (if phylum is soil and\n          flat.bodied is yes) \n         (then type.animal is flatworm))\n   (rule (if phylum is soil and\n          flat.bodied is no) \n         (then type.animal is worm.leech))\n   (question (variable flat.bodied)\n             (query flat.bodied.query))\n   (rule (if phylum is elsewhere and\n          body.in.segments is yes) \n         (then class is segments))\n   (rule (if phylum is elsewhere and\n          body.in.segments is no) \n         (then class is unified))\n   (question (variable body.in.segments)\n             (query body.in.segments.query))\n   (rule (if class is breasts and\n          can.eat.meat is yes) \n         (then order is meat))\n   (rule (if class is breasts and\n          can.eat.meat is no) \n         (then order is vegy))\n   (question (variable can.eat.meat)\n             (query can.eat.meat.query))\n   (rule (if class is water and\n          boney is yes) \n         (then type.animal is fish))\n   (rule (if class is water and\n          boney is no) \n         (then type.animal is shark.ray))\n   (question (variable boney)\n             (query boney.query))\n   (rule (if class is dry and\n          scaly is yes) \n         (then order is scales))\n   (rule (if class is dry and\n          scaly is no) \n         (then order is soft))\n   (question (variable scaly)\n             (query scaly.query))\n   (rule (if class is segments and\n          shell is yes) \n         (then order is shell))\n   (rule (if class is segments and\n          shell is no) \n         (then type.animal is centipede.millipede.insect))\n   (question (variable shell)\n             (query shell.query))\n   (rule (if class is unified and\n          digest.cells is yes) \n         (then order is cells))\n   (rule (if class is unified and\n          digest.cells is no) \n         (then order is stomach))\n   (question (variable digest.cells)\n             (query digest.cells.query))\n   (rule (if order is meat and\n          fly is yes) \n         (then type.animal is bat))\n   (rule (if order is meat and\n          fly is no) \n         (then family is nowings))\n   (question (variable fly)\n             (query fly.query))\n   (rule (if order is vegy and\n          hooves is yes) \n         (then family is hooves))\n   (rule (if order is vegy and\n          hooves is no) \n         (then family is feet))\n   (question (variable hooves)\n             (query hooves.query))\n   (rule (if order is scales and\n          rounded.shell is yes) \n         (then type.animal is turtle))\n   (rule (if order is scales and\n          rounded.shell is no) \n         (then family is noshell))\n   (question (variable rounded.shell)\n             (query rounded.shell.query))\n   (rule (if order is soft and\n          jump is yes) \n         (then type.animal is frog))\n   (rule (if order is soft and\n          jump is no) \n         (then type.animal is salamander))\n   (question (variable jump)\n             (query jump.query))\n   (rule (if order is shell and\n          tail is yes) \n         (then type.animal is lobster))\n   (rule (if order is shell and\n          tail is no) \n         (then type.animal is crab))\n   (question (variable tail)\n             (query tail.query))\n   (rule (if order is cells and\n          stationary is yes) \n         (then family is stationary))\n   (rule (if order is cells and\n          stationary is no) \n         (then type.animal is jellyfish))\n   (question (variable stationary)\n             (query stationary.query))\n   (rule (if order is stomach and\n          multicelled is yes) \n         (then family is multicelled))\n   (rule (if order is stomach and\n          multicelled is no) \n         (then type.animal is protozoa))\n   (question (variable multicelled)\n             (query multicelled.query))\n   (rule (if family is nowings and\n          opposing.thumb is yes) \n         (then genus is thumb))\n   (rule (if family is nowings and\n          opposing.thumb is no) \n         (then genus is nothumb))\n   (question (variable opposing.thumb)\n             (query opposing.thumb.query))\n   (rule (if family is hooves and\n          two.toes is yes) \n         (then genus is twotoes))\n   (rule (if family is hooves and\n          two.toes is no) \n         (then genus is onetoe))\n   (question (variable two.toes)\n             (query two.toes.query))\n   (rule (if family is feet and\n          live.in.water is yes) \n         (then genus is water))\n   (rule (if family is feet and\n          live.in.water is no) \n         (then genus is dry))\n   (question (variable live.in.water)\n             (query live.in.water.query))\n   (rule (if family is noshell and\n          limbs is yes) \n         (then type.animal is crocodile.alligator))\n   (rule (if family is noshell and\n          limbs is no) \n         (then type.animal is snake))\n   (question (variable limbs)\n             (query limbs.query))\n   (rule (if family is stationary and\n          spikes is yes) \n         (then type.animal is sea.anemone))\n   (rule (if family is stationary and\n          spikes is no) \n         (then type.animal is coral.sponge))\n   (question (variable spikes)\n             (query spikes.query))\n   (rule (if family is multicelled and\n          spiral.shell is yes) \n         (then type.animal is snail))\n   (rule (if family is multicelled and\n          spiral.shell is no) \n         (then genus is noshell))\n   (question (variable spiral.shell)\n             (query spiral.shell.query))\n   (rule (if genus is thumb and\n          prehensile.tail is yes) \n         (then type.animal is monkey))\n   (rule (if genus is thumb and\n          prehensile.tail is no) \n         (then species is notail))\n   (question (variable prehensile.tail)\n             (query prehensile.tail.query))\n   (rule (if genus is nothumb and\n          over.400 is yes) \n         (then species is 400))\n   (rule (if genus is nothumb and\n          over.400 is no) \n         (then species is under400))\n   (question (variable over.400)\n             (query over.400.query))\n   (rule (if genus is twotoes and\n          horns is yes) \n         (then species is horns))\n   (rule (if genus is twotoes and\n          horns is no) \n         (then species is nohorns))\n   (question (variable horns)\n             (query horns.query))\n   (rule (if genus is onetoe and\n          plating is yes) \n         (then type.animal is rhinoceros))\n   (rule (if genus is onetoe and\n          plating is no) \n         (then type.animal is horse.zebra))\n   (question (variable plating)\n             (query plating.query))\n   (rule (if genus is water and\n          hunted is yes) \n         (then type.animal is whale))\n   (rule (if genus is water and\n          hunted is no) \n         (then type.animal is dolphin.porpoise))\n   (question (variable hunted)\n             (query hunted.query))\n   (rule (if genus is dry and\n          front.teeth is yes) \n         (then species is teeth))\n   (rule (if genus is dry and\n          front.teeth is no) \n         (then species is noteeth))\n   (question (variable front.teeth)\n             (query front.teeth.query))\n   (rule (if genus is noshell and\n          bivalve is yes) \n         (then type.animal is clam.oyster))\n   (rule (if genus is noshell and\n          bivalve is no) \n         (then type.animal is squid.octopus))\n   (question (variable bivalve)\n             (query bivalve.query))\n   (rule (if species is notail and\n          nearly.hairless is yes) \n         (then type.animal is man))\n   (rule (if species is notail and\n          nearly.hairless is no) \n         (then subspecies is hair))\n   (question (variable nearly.hairless)\n             (query nearly.hairless.query))\n   (rule (if species is 400 and\n          land.based is yes) \n         (then type.animal is bear.tiger.lion))\n   (rule (if species is 400 and\n          land.based is no) \n         (then type.animal is walrus))\n   (question (variable land.based)\n             (query land.based.query))\n   (rule (if species is under400 and\n          thintail is yes) \n         (then type.animal is cat))\n   (rule (if species is under400 and\n          thintail is no) \n         (then type.animal is coyote.wolf.fox.dog))\n   (question (variable thintail)\n             (query thintail.query))\n   (rule (if species is nohorns and\n          lives.in.desert is yes) \n         (then type.animal is camel))\n   (rule (if species is nohorns and\n          lives.in.desert is no and\n          semi.aquatic is no) \n         (then type.animal is giraffe))\n   (rule (if species is nohorns and\n          lives.in.desert is no and\n          semi.aquatic is yes) \n         (then type.animal is hippopotamus))\n   (question (variable lives.in.desert)\n             (query lives.in.desert.query))\n   (question (variable semi.aquatic)\n             (query semi.aquatic.query))\n   (rule (if species is teeth and\n          large.ears is yes) \n         (then type.animal is rabbit))\n   (rule (if species is teeth and\n          large.ears is no)\n         (then type.animal is rat.mouse.squirrel.beaver.porcupine))\n   (question (variable large.ears)\n             (query large.ears.query))\n   (rule (if species is noteeth and\n          pouch is yes) \n         (then type.animal is kangaroo.koala.bear))\n   (rule (if species is noteeth and\n          pouch is no) \n         (then type.animal is mole.shrew.elephant))\n   (question (variable pouch)\n             (query pouch.query))\n   (rule (if subspecies is hair and\n          long.powerful.arms is yes) \n         (then type.animal is orangutan.gorilla.chimpanzee))\n   (rule (if subspecies is hair and\n          long.powerful.arms is no) \n         (then type.animal is baboon))\n   (question (variable long.powerful.arms)\n             (query long.powerful.arms.query))\n   (rule (if species is horns and\n          fleece is yes) \n         (then type.animal is sheep.goat))\n   (rule (if species is horns and\n          fleece is no) \n         (then subsubspecies is nofleece))\n   (question (variable fleece)\n             (query fleece.query))\n   (rule (if subsubspecies is nofleece and\n          domesticated is yes) \n         (then type.animal is cow))\n   (rule (if subsubspecies is nofleece and\n          domesticated is no) \n         (then type.animal is deer.moose.antelope))\n   (question (variable domesticated)\n             (query domesticated.query))\n   (answer (prefix \"I think your animal is a \") (variable type.animal) (postfix \".\")))\n"
  },
  {
    "path": "src/test/resources/samples/langs/CLIPS/sudoku.clp",
    "content": ";;; http://www.angusj.com/sudoku/hints\n;;; http://www.scanraid.com/BasicStrategies.htm\n;;; http://www.sudokuoftheday.com/pages/techniques-overview\n;;; http://www.sudokuonline.us/sudoku_solving_techniques\n;;; http://www.sadmansoftware.com/sudoku/techniques.htm\n;;; http://www.krazydad.com/blog/2005/09/29/an-index-of-sudoku-strategies/\n\n;;; #######################\n;;; DEFTEMPLATES & DEFFACTS\n;;; #######################\n\n(deftemplate possible\n   (slot row)\n   (slot column)\n   (slot value)\n   (slot group)\n   (slot id))\n   \n(deftemplate impossible\n   (slot id)\n   (slot value)\n   (slot priority)\n   (slot reason))\n   \n(deftemplate technique-employed\n   (slot reason)\n   (slot priority))\n\n(deftemplate technique\n   (slot name)\n   (slot priority))\n   \n(deffacts startup\n   (phase grid-values))\n\n(deftemplate size-value\n   (slot size)\n   (slot value))\n   \n(deffacts values\n   (size-value (size 1) (value 1))\n   (size-value (size 2) (value 2))\n   (size-value (size 2) (value 3))\n   (size-value (size 2) (value 4))\n   (size-value (size 3) (value 5))\n   (size-value (size 3) (value 6))\n   (size-value (size 3) (value 7))\n   (size-value (size 3) (value 8))\n   (size-value (size 3) (value 9))\n   (size-value (size 4) (value 10))\n   (size-value (size 4) (value 11))\n   (size-value (size 4) (value 12))\n   (size-value (size 4) (value 13))\n   (size-value (size 4) (value 14))\n   (size-value (size 4) (value 15))\n   (size-value (size 4) (value 16))\n   (size-value (size 5) (value 17))\n   (size-value (size 5) (value 18))\n   (size-value (size 5) (value 19))\n   (size-value (size 5) (value 20))\n   (size-value (size 5) (value 21))\n   (size-value (size 5) (value 22))\n   (size-value (size 5) (value 23))\n   (size-value (size 5) (value 24))\n   (size-value (size 5) (value 25)))\n   \n;;; ###########\n;;; SETUP RULES\n;;; ###########\n\n;;; ***********\n;;; stress-test\n;;; ***********\n\n(defrule stress-test\n   \n   (declare (salience 10))\n   \n   (phase match)\n   \n   (stress-test)\n   \n   (priority ?last)\n   \n   (not (priority ?p&:(> ?p ?last)))\n   \n   (technique (priority ?next&:(> ?next ?last)))\n   \n   (not (technique (priority ?p&:(> ?p ?last)&:(< ?p ?next))))\n   \n   =>\n   \n   (assert (priority ?next)))\n   \n;;; *****************\n;;; enable-techniques\n;;; *****************\n\n(defrule enable-techniques\n\n   (declare (salience 10))\n   \n   (phase match)\n   \n   (size ?)\n   \n   (not (possible (value any)))\n   \n   =>\n   \n   (assert (priority 1)))\n\n;;; **********\n;;; expand-any\n;;; **********\n\n(defrule expand-any\n\n   (declare (salience 10))\n\n   (phase expand-any)\n   \n   ?f <- (possible (row ?r) (column ?c) (value any) (group ?g) (id ?id))\n  \n   (not (possible (value any) (id ?id2&:(< ?id2 ?id))))\n   \n   (size ?s)\n   \n   (size-value (size ?as&:(<= ?as ?s)) (value ?v))\n   \n   (not (possible (row ?r) (column ?c) (value ?v)))\n  \n   (not (and (size-value (value ?v2&:(< ?v2 ?v)))\n               \n             (not (possible (row ?r) (column ?c) (value ?v2)))))\n   \n   =>\n   \n   (assert (possible (row ?r) (column ?c) (value ?v) (group ?g) (id ?id))))\n   \n;;; *****************\n;;; position-expanded\n;;; *****************\n\n(defrule position-expanded\n\n   (declare (salience 10))\n\n   (phase expand-any)\n   \n   ?f <- (possible (row ?r) (column ?c) (value any) (group ?g) (id ?id))\n     \n   (size ?s)\n   \n   (not (and (size-value (size ?as&:(<= ?as ?s)) (value ?v))\n   \n             (not (possible (row ?r) (column ?c) (value ?v)))))\n\n   =>\n   \n   (retract ?f))\n   \n;;; ###########\n;;; PHASE RULES\n;;; ###########\n\n;;; ***************\n;;; expand-any-done\n;;; ***************\n\n(defrule expand-any-done\n\n   (declare (salience 10))\n\n   ?f <- (phase expand-any)\n\n   (not (possible (value any)))\n   \n   =>\n   \n   (retract ?f)\n   \n   (assert (phase initial-output))\n   (assert (print-position 1 1)))\n   \n;;; ***********\n;;; begin-match\n;;; ***********\n\n(defrule begin-match\n\n   (declare (salience -20))\n   \n   ?f <- (phase initial-output)\n      \n   =>\n   \n   (retract ?f)\n   \n   (assert (phase match)))\n\n;;; *****************\n;;; begin-elimination\n;;; *****************\n\n(defrule begin-elimination\n\n   (declare (salience -20))\n   \n   ?f <- (phase match)\n   \n   (not (not (impossible)))\n   \n   =>\n   \n   (retract ?f)\n   \n   (assert (phase elimination)))\n\n;;; *************\n;;; next-priority\n;;; *************\n\n(defrule next-priority\n\n   (declare (salience -20))\n   \n   (phase match)\n   \n   (not (impossible))\n   \n   (priority ?last)\n   \n   (not (priority ?p&:(> ?p ?last)))\n   \n   (technique (priority ?next&:(> ?next ?last)))\n   \n   (not (technique (priority ?p&:(> ?p ?last)&:(< ?p ?next))))\n   \n   =>\n   \n   (assert (priority ?next)))\n\n;;; ************\n;;; begin-output\n;;; ************\n\n(defrule begin-output\n\n   (declare (salience -20))\n   \n   ?f <- (phase match)\n   \n   (not (impossible))\n   \n   (priority ?last)\n   \n   (not (priority ?p&:(> ?p ?last)))\n\n   (not (technique (priority ?next&:(> ?next ?last))))\n   \n   =>\n   \n   (retract ?f)\n   \n   (assert (phase final-output))\n   (assert (print-position 1 1)))\n\n   \n\n  \n    \n   \n   \n   \n   \n   \n   \n   \n   \n   \n"
  },
  {
    "path": "src/test/resources/samples/langs/CMake/filenames/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.8)\n\nproject(Foo)\n\nset(CMAKE_SKIP_RPATH TRUE)\nset(CMAKE_INSTALL_PREFIX \"/usr/local\")\n\nadd_subdirectory(bar)\n\nadd_executable(foo foo.c)\ntarget_link_libraries(foo pthread)\ninstall(TARGETS foo DESTINATION bin)\n"
  },
  {
    "path": "src/test/resources/samples/langs/CMake/sample1.cmake",
    "content": "cmake_minimum_required(VERSION 2.6)\n\nenable_testing()\n\nset(CMAKE_BUILD_TYPE debug)\n\ninclude_directories(\"/usr/local/include\")\n\nfind_library(ssl_LIBRARY NAMES ssl PATHS \"/usr/local/lib\")\n\nadd_custom_command(OUTPUT \"ver.c\" \"ver.h\" COMMAND ./ver.sh)\n\nadd_executable(foo foo.c bar.c baz.c ver.c)\n\ntarget_link_libraries(foo ${ssl_LIBRARY})\n"
  },
  {
    "path": "src/test/resources/samples/langs/CMake/sample2.cmake",
    "content": "cmake_minimum_required(VERSION 2.8 FATAL_ERROR)\n \nproject(PCLVisualizer)\ntarget_link_libraries (PCLVisualizer ${PCL_LIBRARIES})\n\n#it seems it's needed only on OS X 10.9\nfind_package(GLEW REQUIRED)\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -I/usr/include -v\")\n\nfind_package(PCL 1.7 REQUIRED)\n \ninclude_directories(${PCL_INCLUDE_DIRS})\nlink_directories(${PCL_LIBRARY_DIRS})\nadd_definitions(${PCL_DEFINITIONS})\n \nset(PCL_BUILD_TYPE Release)\n \nfile(GLOB PCL_openni_viewer_SRC\n    \"src/*.h\"\n    \"src/*.cpp\"\n)\nadd_executable(PCLVisualizer ${PCL_openni_viewer_SRC})\n\n#add this line to solve probem in mac os x 10.9\ntarget_link_libraries(PCLVisualizer ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES} ${PCL_VISUALIZATION_LIBRARIES} ${PCL_FEATURES_LIBRARIES}) "
  },
  {
    "path": "src/test/resources/samples/langs/CMake/sample3.cmake",
    "content": "# Specifications for building user and development documentation.\n#\n# ====================================================================\n# Copyright (c) 2009 Ian Blumel.  All rights reserved.\n# \n# This software is licensed as described in the file LICENSE, which\n# you should have received as part of this distribution.  \n# ====================================================================\n\nCMAKE_MINIMUM_REQUIRED(VERSION 2.6)\n\nFIND_FILE( SPHINX sphinx-build.exe) \n\n# If we are windows call to the make.bat file, otherwise rely on the Makefile\n# to handle the processing.\nIF(WIN32)\n   SET(SPHINX_MAKE make.bat)\nELSE(WIN32)\n   SET(SPHINX_MAKE make)\nENDIF(WIN32)\n\nADD_CUSTOM_TARGET(\n   doc_usr\n   COMMAND ${SPHINX_MAKE} html\n   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/usr\n)\n\nADD_CUSTOM_TARGET(\n   doc_dev\n   COMMAND ${SPHINX_MAKE} html\n   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dev\n)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/CMake/sample4.cmake",
    "content": "cmake_minimum_required (VERSION 2.6)\n\nset (CMAKE_RUNTIME_OUTPUT_DIRECTORY \"bin\")\n\nlist(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/vala)\nfind_package(Vala REQUIRED)\ninclude(ValaPrecompile)\ninclude(ValaVersion)\nensure_vala_version(\"0.11.0\" MINIMUM)\n\nproject (template C)\n\nfind_package(PkgConfig)\n\npkg_check_modules(GOBJECT REQUIRED gobject-2.0)\nadd_definitions(${GOBJECT_CFLAGS} ${GOBJECT_CFLAGS_OTHER})\nlink_libraries(${GOBJECT_LIBRARIES})\nlink_directories(${GOBJECT_LIBRARY_DIRS})\n\n\nvala_precompile(VALA_C\n    src/template.vala\nPACKAGES\nOPTIONS\n    --thread\nCUSTOM_VAPIS\nGENERATE_VAPI\nGENERATE_HEADER\nDIRECTORY\n\tgen\n)\n\nadd_executable(\"template\" ${VALA_C})\n"
  },
  {
    "path": "src/test/resources/samples/langs/CMake/sample5.cmake",
    "content": "# - Check if the STDCALL function exists.\n#   This works for non-cdecl functions (kernel32 functions, for example)\n# CHECK_STDCALL_FUNCTION_EXISTS(FUNCTION FUNCTION_DUMMY_ARGS VARIABLE)\n# - macro which checks if the stdcall function exists\n#  FUNCTION_DECLARATION - the definition of the function ( e.g.: Sleep(500) )\n#  VARIABLE - variable to store the result\n#\n# The following variables may be set before calling this macro to\n# modify the way the check is run:\n#\n#  CMAKE_REQUIRED_FLAGS = string of compile command line flags\n#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)\n#  CMAKE_REQUIRED_INCLUDES = list of include directories\n#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link\n#  CMAKE_EXTRA_INCLUDE_FILES = list of extra includes to check in\n\nMACRO(CHECK_STDCALL_FUNCTION_EXISTS FUNCTION_DECLARATION VARIABLE)\n  IF(\"${VARIABLE}\" MATCHES \"^${VARIABLE}$\")\n    #get includes  \n    SET(CHECK_STDCALL_FUNCTION_PREMAIN)\n    FOREACH(def ${CMAKE_EXTRA_INCLUDE_FILES})\n      SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"${def}\\\"\\n\")\n    ENDFOREACH(def)\n    \n    #add some default includes\n    IF ( HAVE_WINDOWS_H )\n        SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"windows.h\\\"\\n\")\n    ENDIF ( HAVE_WINDOWS_H )\n    IF ( HAVE_UNISTD_H )\n        SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"unistd.h\\\"\\n\")\n    ENDIF ( HAVE_UNISTD_H )\n    IF ( HAVE_DIRECT_H )\n        SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"direct.h\\\"\\n\")\n    ENDIF ( HAVE_DIRECT_H )\n    IF ( HAVE_IO_H )\n        SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"io.h\\\"\\n\")\n    ENDIF ( HAVE_IO_H )\n    IF ( HAVE_SYS_TIMEB_H )\n        SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"sys/timeb.h\\\"\\n\")\n    ENDIF ( HAVE_SYS_TIMEB_H )\n    \n    STRING(REGEX REPLACE \"(\\\\(.*\\\\))\" \"\" CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION ${FUNCTION_DECLARATION} )\n    \n    SET(MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS \"${CMAKE_REQUIRED_FLAGS}\")\n    MESSAGE(STATUS \"Looking for ${CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION}\")\n    \n    IF(CMAKE_REQUIRED_LIBRARIES)\n      SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES\n        \"-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}\")\n    ELSE(CMAKE_REQUIRED_LIBRARIES)\n      SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES)\n    ENDIF(CMAKE_REQUIRED_LIBRARIES)\n    \n    IF(CMAKE_REQUIRED_INCLUDES)\n      SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES\n        \"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}\")\n    ELSE(CMAKE_REQUIRED_INCLUDES)\n      SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES)\n    ENDIF(CMAKE_REQUIRED_INCLUDES)\n    \n    SET(CHECK_STDCALL_FUNCTION_DECLARATION ${FUNCTION_DECLARATION})\n    CONFIGURE_FILE(\"${clucene-shared_SOURCE_DIR}/cmake/CheckStdCallFunctionExists.cpp.in\"\n      \"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp\" IMMEDIATE @ONLY)\n    FILE(READ \"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp\"\n      CHECK_STDCALL_FUNCTION_CONTENT)\n\n    TRY_COMPILE(${VARIABLE}\n      ${CMAKE_BINARY_DIR}\n      \"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp\"\n      COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}\n      CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS}\n      \"${CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES}\"\n      \"${CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES}\"\n      OUTPUT_VARIABLE OUTPUT)\n    IF(${VARIABLE})\n      SET(${VARIABLE} 1 CACHE INTERNAL \"Have function ${FUNCTION_DECLARATION}\")\n      MESSAGE(STATUS \"Looking for ${FUNCTION_DECLARATION} - found\")\n      FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log \n        \"Determining if the stdcall function ${FUNCTION_DECLARATION} exists passed with the following output:\\n\"\n        \"${OUTPUT}\\nCheckStdCallFunctionExists.cpp:\\n${CHECK_STDCALL_FUNCTION_CONTENT}\\n\\n\")\n    ELSE(${VARIABLE})\n      MESSAGE(STATUS \"Looking for ${FUNCTION_DECLARATION} - not found\")\n      SET(${VARIABLE} \"\" CACHE INTERNAL \"Have function ${FUNCTION_DECLARATION}\")\n      FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log \n        \"Determining if the stdcall function ${FUNCTION_DECLARATION} exists failed with the following output:\\n\"\n        \"${OUTPUT}\\nCheckStdCallFunctionExists.cpp:\\n${CHECK_STDCALL_FUNCTION_CONTENT}\\n\\n\")\n    ENDIF(${VARIABLE})\n  ENDIF(\"${VARIABLE}\" MATCHES \"^${VARIABLE}$\")\nENDMACRO(CHECK_STDCALL_FUNCTION_EXISTS)\n"
  },
  {
    "path": "src/test/resources/samples/langs/CMake/uninstall.cmake.in",
    "content": "IF (NOT EXISTS \"@PROJECT_BINARY_DIR@/install_manifest.txt\")\n    MESSAGE (FATAL_ERROR \"Cannot find install manifest: \\\"@PROJECT_BINARY_DIR@/install_manifest.txt\\\"\")\nENDIF (NOT EXISTS \"@PROJECT_BINARY_DIR@/install_manifest.txt\")\n\nFILE (READ \"@PROJECT_BINARY_DIR@/install_manifest.txt\" files)\nSTRING (REGEX REPLACE \"\\n\" \";\" files \"${files}\")\nFOREACH (file ${files})\n    MESSAGE (STATUS \"Uninstalling \\\"$ENV{DESTDIR}${file}\\\"\")\n    IF (EXISTS \"$ENV{DESTDIR}${file}\")\n        EXEC_PROGRAM (\n            \"@CMAKE_COMMAND@\" ARGS \"-E remove \\\"$ENV{DESTDIR}${file}\\\"\"\n            OUTPUT_VARIABLE rm_out\n            RETURN_VALUE rm_retval\n            )\n        IF (NOT \"${rm_retval}\" STREQUAL 0)\n            MESSAGE (FATAL_ERROR \"Problem when removing \\\"$ENV{DESTDIR}${file}\\\"\")\n        ENDIF (NOT \"${rm_retval}\" STREQUAL 0)\n    ELSE (EXISTS \"$ENV{DESTDIR}${file}\")\n        MESSAGE (STATUS \"File \\\"$ENV{DESTDIR}${file}\\\" does not exist.\")\n    ENDIF (EXISTS \"$ENV{DESTDIR}${file}\")\nENDFOREACH (file)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/COBOL/hello_world.cbl",
    "content": "        program-id. hello.\n        procedure division.\n        display \"Hello, World!\".\n        stop run.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/COBOL/hello_world.ccp",
    "content": "      IDENTIFICATION DIVISION.\n      PROGRAM-ID. hello.\n      PROCEDURE DIVISION.\n      DISPLAY \"Hello World, yet again.\".\n      STOP RUN.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/COBOL/hello_world.cob",
    "content": "      IDENTIFICATION DIVISION.\n      PROGRAM-ID. hello.\n      PROCEDURE DIVISION.\n      DISPLAY \"Hello World!\".\n      STOP RUN.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/COBOL/simple.cpy",
    "content": "01 COBOL-TEST-RECORD.\n  05 COBOL-TEST-USAGES.\n    10 COBOL-4-COMP PIC S9(4) COMP.\n    10 COBOL-8-COMP PIC S9(8) COMP.\n    10 COBOL-9-COMP PIC S9(9) COMP.\n    10 COBOL-4-COMP2 PIC S9(4) COMP-2.\n    10 COBOL-7-COMP2 PIC 9(7) COMP-2.\n"
  },
  {
    "path": "src/test/resources/samples/langs/CSON/base.cson",
    "content": "'atom-text-editor':\n  # Platform Bindings\n  'home': 'editor:move-to-first-character-of-line'\n  'end': 'editor:move-to-end-of-screen-line'\n  'shift-home': 'editor:select-to-first-character-of-line'\n  'shift-end': 'editor:select-to-end-of-line'\n\n'atom-text-editor:not([mini])':\n  # Atom Specific\n  'ctrl-C': 'editor:copy-path'\n\n  # Sublime Parity\n  'tab': 'editor:indent'\n  'enter': 'editor:newline'\n  'shift-tab': 'editor:outdent-selected-rows'\n  'ctrl-K': 'editor:delete-line'\n\n'.select-list atom-text-editor[mini]':\n  'enter': 'core:confirm'\n\n'.tool-panel.panel-left, .tool-panel.panel-right':\n  'escape': 'tool-panel:unfocus'\n\n'atom-text-editor !important, atom-text-editor[mini] !important':\n  'escape': 'editor:consolidate-selections'\n\n# allow standard input fields to work correctly\n'body .native-key-bindings':\n  'tab': 'core:focus-next'\n  'shift-tab': 'core:focus-previous'\n  'enter': 'native!'\n  'backspace': 'native!'\n  'shift-backspace': 'native!'\n  'delete': 'native!'\n  'up': 'native!'\n  'down': 'native!'\n  'shift-up': 'native!'\n  'shift-down': 'native!'\n  'alt-up': 'native!'\n  'alt-down': 'native!'\n  'alt-shift-up': 'native!'\n  'alt-shift-down': 'native!'\n  'cmd-up': 'native!'\n  'cmd-down': 'native!'\n  'cmd-shift-up': 'native!'\n  'cmd-shift-down': 'native!'\n  'ctrl-up': 'native!'\n  'ctrl-down': 'native!'\n  'ctrl-shift-up': 'native!'\n  'ctrl-shift-down': 'native!'\n  'left': 'native!'\n  'right': 'native!'\n  'shift-left': 'native!'\n  'shift-right': 'native!'\n  'alt-left': 'native!'\n  'alt-right': 'native!'\n  'alt-shift-left': 'native!'\n  'alt-shift-right': 'native!'\n  'cmd-left': 'native!'\n  'cmd-right': 'native!'\n  'cmd-shift-left': 'native!'\n  'cmd-shift-right': 'native!'\n  'ctrl-left': 'native!'\n  'ctrl-right': 'native!'\n  'ctrl-shift-left': 'native!'\n  'ctrl-shift-right': 'native!'\n  'ctrl-b': 'native!'\n  'ctrl-f': 'native!'\n  'ctrl-F': 'native!'\n  'ctrl-B': 'native!'\n  'ctrl-h': 'native!'\n  'ctrl-d': 'native!'\n"
  },
  {
    "path": "src/test/resources/samples/langs/CSON/config.cson",
    "content": "directoryIcons:\n\n\tAtom:\n\t\ticon: \"atom\"\n\t\tmatch: /^\\.atom$/\n\t\tcolour: \"dark-green\"\n\n\tBower:\n\t\ticon: \"bower\"\n\t\tmatch: /^bower[-_]components$/\n\t\tcolour: \"bower\"\n\n\tDropbox:\n\t\ticon: \"dropbox\"\n\t\tmatch: /^(?:Dropbox|\\.dropbox\\.cache)$/\n\t\tcolour: \"medium-blue\"\n\n\tGit:\n\t\ticon: \"git\"\n\t\tmatch: /^\\.git$/\n\n\tGitHub:\n\t\ticon: \"github\"\n\t\tmatch: /^\\.github$/\n\n\tMeteor:\n\t\ticon: \"meteor\"\n\t\tmatch: /^\\.meteor$/\n\n\tNodeJS:\n\t\ticon: \"node\"\n\t\tmatch: /^node_modules$/\n\t\tcolour: \"medium-green\"\n\n\tPackage:\n\t\ticon: \"package\"\n\t\tmatch: /^\\.bundle$/i\n\n\tTextMate:\n\t\ticon: \"textmate\"\n\t\tmatch: \".tmBundle\"\n\n\nfileIcons:\n\n\tABAP:\n\t\ticon: \"abap\"\n\t\tscope: \"abp\"\n\t\tmatch: \".abap\"\n\t\tcolour: \"medium-orange\"\n\n\tActionScript: # Or Flash-related\n\t\ticon: \"as\"\n\t\tmatch: [\n\t\t\t[\".swf\", \"medium-blue\"]\n\t\t\t[\".as\", \"medium-red\", scope: /\\.(?:flex-config|actionscript(?:\\.\\d+)?)$/i, alias: /ActionScript\\s?3|as3/i]\n\t\t\t[\".jsfl\", \"auto-yellow\"]\n\t\t\t[\".swc\", \"dark-red\"]\n\t\t]\n"
  },
  {
    "path": "src/test/resources/samples/langs/CSON/ff-sfd.cson",
    "content": "name: \"Spline Font Database\"\nscopeName: \"text.sfd\"\nfileTypes: [\"sfd\"]\nfirstLineMatch: \"^SplineFontDB: [\\\\d.]+\"\npatterns: [include: \"#main\"]\n\nrepository:\n\tmain:\n\t\tpatterns: [\n\t\t\t{include: \"#punctuation\"}\n\t\t\t{include: \"#private\"}\n\t\t\t{include: \"#image\"}\n\t\t\t{include: \"#pickleData\"}\n\t\t\t{include: \"#sections\"}\n\t\t\t{include: \"#copyright\"}\n\t\t\t{include: \"#property\"}\n\t\t\t{include: \"#control\"}\n\t\t\t{include: \"#address\"}\n\t\t\t{include: \"#encoding\"}\n\t\t\t{include: \"source.fontforge#shared\"}\n\t\t\t{include: \"#colour\"}\n\t\t]\n\t\n\tpunctuation:\n\t\tpatterns: [\n\t\t\t{match: \"<|>\",  name: \"punctuation.definition.brackets.angle.sfd\"}\n\t\t\t{match: \"[{}]\", name: \"punctuation.definition.brackets.curly.sfd\"}\n\t\t]\n\n\tprivate:\n\t\tname: \"meta.section.private.sfd\"\n\t\tbegin: \"^BeginPrivate(?=:)\"\n\t\tend:   \"^EndPrivate\\\\b\"\n\t\tbeginCaptures: 0: name: \"keyword.control.begin.private.sfd\"\n\t\tendCaptures:   0: name: \"keyword.control.end.private.sfd\"\n\t\tpatterns: [\n\t\t\t{match: \"^\\\\S+\", name: \"entity.name.private.property.sfd\"}\n\t\t\t{include: \"$self\"}\n\t\t]\n\t\n\timage:\n\t\tname: \"meta.image.sfd\"\n\t\tbegin: \"^(Image)(?=:)(.+)$\"\n\t\tend:   \"^(EndImage)\\\\b\"\n\t\tcontentName: \"string.unquoted.raw.data.sfd\"\n\t\tbeginCaptures:\n\t\t\t1: name: \"keyword.control.begin.image.sfd\"\n\t\t\t2: patterns: [include: \"$self\"]\n\t\tendCaptures:\n\t\t\t1: name: \"keyword.control.end.image.sfd\"\n\n\tpickleData:\n\t\tname: \"meta.pickle-data.sfd\"\n\t\tbegin: \"^(PickledData)(:)\\\\s*(\\\")\"\n\t\tend:   '\"'\n\t\tbeginCaptures:\n\t\t\t1: name: \"entity.name.property.sfd\"\n\t\t\t2: name: \"punctuation.separator.dictionary.key-value.sfd\"\n\t\t\t3: name: \"punctuation.definition.string.begin.sfd\"\n\t\tendCaptures:\n\t\t\t0: name: \"punctuation.definition.string.end.sfd\"\n\t\tpatterns: [match: \"\\\\\\\\.\", name: \"constant.character.escape.sfd\"]\n\n\tsections:\n\t\tname: \"meta.section.${2:/downcase}.sfd\"\n\t\tbegin: \"^(Start|Begin)([A-Z]\\\\w+)(?=:)\"\n\t\tend:   \"^(End\\\\2)\\\\b\"\n\t\tbeginCaptures: 0: name: \"keyword.control.begin.${2:/downcase}.sfd\"\n\t\tendCaptures:   0: name: \"keyword.control.end.${2:/downcase}.sfd\"\n\t\tpatterns: [include: \"$self\"]\n\n\tcontrol:\n\t\tname: \"keyword.control.${1:/downcase}.sfd\"\n\t\tmatch: \"\\\\b(Fore|Back|SplineSet|^End\\\\w+)\\\\b\"\n\n\tcolour:\n\t\tname: \"constant.other.hex.colour.sfd\"\n\t\tmatch: \"(#)[A-Fa-f0-9]{3,}|(?<=\\\\s)[A-Fa-f0-9]{6,8}\"\n\t\tcaptures:\n\t\t\t1: name: \"punctuation.definition.colour.sfd\"\n\n\tencoding:\n\t\tname: \"constant.language.encoding.sfd\"\n\t\tmatch: \"(?i)\\\\b(ISO[-\\\\w]+)(?<=\\\\d)(?=\\\\s|$)\"\n\n\t# Don't highlight numbers in freeform strings (years/version strings)\n\tcopyright:\n\t\tname: \"meta.${1:/downcase}-string.sfd\"\n\t\tbegin: \"^(Copyright|U?Comments?|\\\\w+Name)(:)\"\n\t\tend:   \"$\"\n\t\tbeginCaptures:\n\t\t\t1: name: \"entity.name.property.sfd\"\n\t\t\t2: name: \"punctuation.separator.dictionary.key-value.sfd\"\n\t\tpatterns: [include: \"source.fontforge#stringEscapes\"]\n\t\n\t# No idea what this is, but it looks distracting without a fix\n\t# Assuming it's referring to a memory register or something.\n\taddress:\n\t\tmatch: \"\\\\d+[xX][A-Fa-f0-9]+\"\n\t\tname: \"constant.numeric.hexadecimal.sfd\"\n\t\n\tproperty:\n\t\tmatch: \"^([^:]+)(:)\"\n\t\tname: \"meta.dictionary.key-value.sfd\"\n\t\tcaptures:\n\t\t\t1: name: \"entity.name.property.sfd\"\n\t\t\t2: name: \"punctuation.separator.dictionary.key-value.sfd\"\n\t\n"
  },
  {
    "path": "src/test/resources/samples/langs/CSON/wercker-status.cson",
    "content": "'menu': [\n  {\n    'label': 'Packages'\n    'submenu': [\n      'label': 'Wercker Status'\n      'submenu': [\n        { 'label': 'Check now!', 'command': 'wercker-status:checknow' }\n      ]\n    ]\n  }\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/CSS/bootstrap.css",
    "content": "/*!\n * Bootstrap v2.3.1\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\naudio:not([controls]) {\n  display: none;\n}\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n}\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\na:hover,\na:active {\n  outline: 0;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  /* Responsive images (ensure images don't scale beyond their parents) */\n\n  max-width: 100%;\n  /* Part 1: Set a maxium relative to the parent */\n\n  width: auto\\9;\n  /* IE7-8 need help adjusting responsive images */\n\n  height: auto;\n  /* Part 2: Scale the height according to the width, otherwise you get stretching */\n\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n#map_canvas img,\n.google-maps img {\n  max-width: none;\n}\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\nbutton,\ninput {\n  *overflow: visible;\n  line-height: normal;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nlabel,\nselect,\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  cursor: pointer;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n@media print {\n  * {\n    text-shadow: none !important;\n    color: #000 !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 0.5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n}\nbody {\n  margin: 0;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 20px;\n  color: #333333;\n  background-color: #ffffff;\n}\na {\n  color: #0088cc;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #005580;\n  text-decoration: underline;\n}\n.img-rounded {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.img-polaroid {\n  padding: 4px;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n.img-circle {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n}\n.row {\n  margin-left: -20px;\n  *zoom: 1;\n}\n.row:before,\n.row:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.row:after {\n  clear: both;\n}\n[class*=\"span\"] {\n  float: left;\n  min-height: 1px;\n  margin-left: 20px;\n}\n.container,\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n.span12 {\n  width: 940px;\n}\n.span11 {\n  width: 860px;\n}\n.span10 {\n  width: 780px;\n}\n.span9 {\n  width: 700px;\n}\n.span8 {\n  width: 620px;\n}\n.span7 {\n  width: 540px;\n}\n.span6 {\n  width: 460px;\n}\n.span5 {\n  width: 380px;\n}\n.span4 {\n  width: 300px;\n}\n.span3 {\n  width: 220px;\n}\n.span2 {\n  width: 140px;\n}\n.span1 {\n  width: 60px;\n}\n.offset12 {\n  margin-left: 980px;\n}\n.offset11 {\n  margin-left: 900px;\n}\n.offset10 {\n  margin-left: 820px;\n}\n.offset9 {\n  margin-left: 740px;\n}\n.offset8 {\n  margin-left: 660px;\n}\n.offset7 {\n  margin-left: 580px;\n}\n.offset6 {\n  margin-left: 500px;\n}\n.offset5 {\n  margin-left: 420px;\n}\n.offset4 {\n  margin-left: 340px;\n}\n.offset3 {\n  margin-left: 260px;\n}\n.offset2 {\n  margin-left: 180px;\n}\n.offset1 {\n  margin-left: 100px;\n}\n.row-fluid {\n  width: 100%;\n  *zoom: 1;\n}\n.row-fluid:before,\n.row-fluid:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.row-fluid:after {\n  clear: both;\n}\n.row-fluid [class*=\"span\"] {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  float: left;\n  margin-left: 2.127659574468085%;\n  *margin-left: 2.074468085106383%;\n}\n.row-fluid [class*=\"span\"]:first-child {\n  margin-left: 0;\n}\n.row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 2.127659574468085%;\n}\n.row-fluid .span12 {\n  width: 100%;\n  *width: 99.94680851063829%;\n}\n.row-fluid .span11 {\n  width: 91.48936170212765%;\n  *width: 91.43617021276594%;\n}\n.row-fluid .span10 {\n  width: 82.97872340425532%;\n  *width: 82.92553191489361%;\n}\n.row-fluid .span9 {\n  width: 74.46808510638297%;\n  *width: 74.41489361702126%;\n}\n.row-fluid .span8 {\n  width: 65.95744680851064%;\n  *width: 65.90425531914893%;\n}\n.row-fluid .span7 {\n  width: 57.44680851063829%;\n  *width: 57.39361702127659%;\n}\n.row-fluid .span6 {\n  width: 48.93617021276595%;\n  *width: 48.88297872340425%;\n}\n.row-fluid .span5 {\n  width: 40.42553191489362%;\n  *width: 40.37234042553192%;\n}\n.row-fluid .span4 {\n  width: 31.914893617021278%;\n  *width: 31.861702127659576%;\n}\n.row-fluid .span3 {\n  width: 23.404255319148934%;\n  *width: 23.351063829787233%;\n}\n.row-fluid .span2 {\n  width: 14.893617021276595%;\n  *width: 14.840425531914894%;\n}\n.row-fluid .span1 {\n  width: 6.382978723404255%;\n  *width: 6.329787234042553%;\n}\n.row-fluid .offset12 {\n  margin-left: 104.25531914893617%;\n  *margin-left: 104.14893617021275%;\n}\n.row-fluid .offset12:first-child {\n  margin-left: 102.12765957446808%;\n  *margin-left: 102.02127659574467%;\n}\n.row-fluid .offset11 {\n  margin-left: 95.74468085106382%;\n  *margin-left: 95.6382978723404%;\n}\n.row-fluid .offset11:first-child {\n  margin-left: 93.61702127659574%;\n  *margin-left: 93.51063829787232%;\n}\n.row-fluid .offset10 {\n  margin-left: 87.23404255319149%;\n  *margin-left: 87.12765957446807%;\n}\n.row-fluid .offset10:first-child {\n  margin-left: 85.1063829787234%;\n  *margin-left: 84.99999999999999%;\n}\n.row-fluid .offset9 {\n  margin-left: 78.72340425531914%;\n  *margin-left: 78.61702127659572%;\n}\n.row-fluid .offset9:first-child {\n  margin-left: 76.59574468085106%;\n  *margin-left: 76.48936170212764%;\n}\n.row-fluid .offset8 {\n  margin-left: 70.2127659574468%;\n  *margin-left: 70.10638297872339%;\n}\n.row-fluid .offset8:first-child {\n  margin-left: 68.08510638297872%;\n  *margin-left: 67.9787234042553%;\n}\n.row-fluid .offset7 {\n  margin-left: 61.70212765957446%;\n  *margin-left: 61.59574468085106%;\n}\n.row-fluid .offset7:first-child {\n  margin-left: 59.574468085106375%;\n  *margin-left: 59.46808510638297%;\n}\n.row-fluid .offset6 {\n  margin-left: 53.191489361702125%;\n  *margin-left: 53.085106382978715%;\n}\n.row-fluid .offset6:first-child {\n  margin-left: 51.063829787234035%;\n  *margin-left: 50.95744680851063%;\n}\n.row-fluid .offset5 {\n  margin-left: 44.68085106382979%;\n  *margin-left: 44.57446808510638%;\n}\n.row-fluid .offset5:first-child {\n  margin-left: 42.5531914893617%;\n  *margin-left: 42.4468085106383%;\n}\n.row-fluid .offset4 {\n  margin-left: 36.170212765957444%;\n  *margin-left: 36.06382978723405%;\n}\n.row-fluid .offset4:first-child {\n  margin-left: 34.04255319148936%;\n  *margin-left: 33.93617021276596%;\n}\n.row-fluid .offset3 {\n  margin-left: 27.659574468085104%;\n  *margin-left: 27.5531914893617%;\n}\n.row-fluid .offset3:first-child {\n  margin-left: 25.53191489361702%;\n  *margin-left: 25.425531914893618%;\n}\n.row-fluid .offset2 {\n  margin-left: 19.148936170212764%;\n  *margin-left: 19.04255319148936%;\n}\n.row-fluid .offset2:first-child {\n  margin-left: 17.02127659574468%;\n  *margin-left: 16.914893617021278%;\n}\n.row-fluid .offset1 {\n  margin-left: 10.638297872340425%;\n  *margin-left: 10.53191489361702%;\n}\n.row-fluid .offset1:first-child {\n  margin-left: 8.51063829787234%;\n  *margin-left: 8.404255319148938%;\n}\n[class*=\"span\"].hide,\n.row-fluid [class*=\"span\"].hide {\n  display: none;\n}\n[class*=\"span\"].pull-right,\n.row-fluid [class*=\"span\"].pull-right {\n  float: right;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  *zoom: 1;\n}\n.container:before,\n.container:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.container:after {\n  clear: both;\n}\n.container-fluid {\n  padding-right: 20px;\n  padding-left: 20px;\n  *zoom: 1;\n}\n.container-fluid:before,\n.container-fluid:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.container-fluid:after {\n  clear: both;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 30px;\n}\nsmall {\n  font-size: 85%;\n}\nstrong {\n  font-weight: bold;\n}\nem {\n  font-style: italic;\n}\ncite {\n  font-style: normal;\n}\n.muted {\n  color: #999999;\n}\na.muted:hover,\na.muted:focus {\n  color: #808080;\n}\n.text-warning {\n  color: #c09853;\n}\na.text-warning:hover,\na.text-warning:focus {\n  color: #a47e3c;\n}\n.text-error {\n  color: #b94a48;\n}\na.text-error:hover,\na.text-error:focus {\n  color: #953b39;\n}\n.text-info {\n  color: #3a87ad;\n}\na.text-info:hover,\na.text-info:focus {\n  color: #2d6987;\n}\n.text-success {\n  color: #468847;\n}\na.text-success:hover,\na.text-success:focus {\n  color: #356635;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  margin: 10px 0;\n  font-family: inherit;\n  font-weight: bold;\n  line-height: 20px;\n  color: inherit;\n  text-rendering: optimizelegibility;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\nh1,\nh2,\nh3 {\n  line-height: 40px;\n}\nh1 {\n  font-size: 38.5px;\n}\nh2 {\n  font-size: 31.5px;\n}\nh3 {\n  font-size: 24.5px;\n}\nh4 {\n  font-size: 17.5px;\n}\nh5 {\n  font-size: 14px;\n}\nh6 {\n  font-size: 11.9px;\n}\nh1 small {\n  font-size: 24.5px;\n}\nh2 small {\n  font-size: 17.5px;\n}\nh3 small {\n  font-size: 14px;\n}\nh4 small {\n  font-size: 14px;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 20px 0 30px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  padding: 0;\n  margin: 0 0 10px 25px;\n}\nul ul,\nul ol,\nol ol,\nol ul {\n  margin-bottom: 0;\n}\nli {\n  line-height: 20px;\n}\nul.unstyled,\nol.unstyled {\n  margin-left: 0;\n  list-style: none;\n}\nul.inline,\nol.inline {\n  margin-left: 0;\n  list-style: none;\n}\nul.inline > li,\nol.inline > li {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 20px;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 10px;\n}\n.dl-horizontal {\n  *zoom: 1;\n}\n.dl-horizontal:before,\n.dl-horizontal:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.dl-horizontal:after {\n  clear: both;\n}\n.dl-horizontal dt {\n  float: left;\n  width: 160px;\n  clear: left;\n  text-align: right;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.dl-horizontal dd {\n  margin-left: 180px;\n}\nhr {\n  margin: 20px 0;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n  border-bottom: 1px solid #ffffff;\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 0 0 0 15px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p {\n  margin-bottom: 0;\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\nblockquote small {\n  display: block;\n  line-height: 20px;\n  color: #999999;\n}\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\nblockquote.pull-right {\n  float: right;\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\nblockquote.pull-right small:before {\n  content: '';\n}\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 20px;\n}\ncode,\npre {\n  padding: 0 3px 2px;\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n  font-size: 12px;\n  color: #333333;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\ncode {\n  padding: 2px 4px;\n  color: #d14;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n  white-space: nowrap;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 20px;\n  word-break: break-all;\n  word-wrap: break-word;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\npre.prettyprint {\n  margin-bottom: 20px;\n}\npre code {\n  padding: 0;\n  color: inherit;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.label,\n.badge {\n  display: inline-block;\n  padding: 2px 4px;\n  font-size: 11.844px;\n  font-weight: bold;\n  line-height: 14px;\n  color: #ffffff;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #999999;\n}\n.label {\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.badge {\n  padding-left: 9px;\n  padding-right: 9px;\n  -webkit-border-radius: 9px;\n  -moz-border-radius: 9px;\n  border-radius: 9px;\n}\n.label:empty,\n.badge:empty {\n  display: none;\n}\na.label:hover,\na.label:focus,\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label-important,\n.badge-important {\n  background-color: #b94a48;\n}\n.label-important[href],\n.badge-important[href] {\n  background-color: #953b39;\n}\n.label-warning,\n.badge-warning {\n  background-color: #f89406;\n}\n.label-warning[href],\n.badge-warning[href] {\n  background-color: #c67605;\n}\n.label-success,\n.badge-success {\n  background-color: #468847;\n}\n.label-success[href],\n.badge-success[href] {\n  background-color: #356635;\n}\n.label-info,\n.badge-info {\n  background-color: #3a87ad;\n}\n.label-info[href],\n.badge-info[href] {\n  background-color: #2d6987;\n}\n.label-inverse,\n.badge-inverse {\n  background-color: #333333;\n}\n.label-inverse[href],\n.badge-inverse[href] {\n  background-color: #1a1a1a;\n}\n.btn .label,\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-mini .label,\n.btn-mini .badge {\n  top: 0;\n}\ntable {\n  max-width: 100%;\n  background-color: transparent;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n.table th,\n.table td {\n  padding: 8px;\n  line-height: 20px;\n  text-align: left;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n.table th {\n  font-weight: bold;\n}\n.table thead th {\n  vertical-align: bottom;\n}\n.table caption + thead tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child th,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child th,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed th,\n.table-condensed td {\n  padding: 4px 5px;\n}\n.table-bordered {\n  border: 1px solid #dddddd;\n  border-collapse: separate;\n  *border-collapse: collapse;\n  border-left: 0;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.table-bordered th,\n.table-bordered td {\n  border-left: 1px solid #dddddd;\n}\n.table-bordered caption + thead tr:first-child th,\n.table-bordered caption + tbody tr:first-child th,\n.table-bordered caption + tbody tr:first-child td,\n.table-bordered colgroup + thead tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child td,\n.table-bordered thead:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child td {\n  border-top: 0;\n}\n.table-bordered thead:first-child tr:first-child > th:first-child,\n.table-bordered tbody:first-child tr:first-child > td:first-child,\n.table-bordered tbody:first-child tr:first-child > th:first-child {\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n}\n.table-bordered thead:first-child tr:first-child > th:last-child,\n.table-bordered tbody:first-child tr:first-child > td:last-child,\n.table-bordered tbody:first-child tr:first-child > th:last-child {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n}\n.table-bordered thead:last-child tr:last-child > th:first-child,\n.table-bordered tbody:last-child tr:last-child > td:first-child,\n.table-bordered tbody:last-child tr:last-child > th:first-child,\n.table-bordered tfoot:last-child tr:last-child > td:first-child,\n.table-bordered tfoot:last-child tr:last-child > th:first-child {\n  -webkit-border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  border-bottom-left-radius: 4px;\n}\n.table-bordered thead:last-child tr:last-child > th:last-child,\n.table-bordered tbody:last-child tr:last-child > td:last-child,\n.table-bordered tbody:last-child tr:last-child > th:last-child,\n.table-bordered tfoot:last-child tr:last-child > td:last-child,\n.table-bordered tfoot:last-child tr:last-child > th:last-child {\n  -webkit-border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  border-bottom-right-radius: 4px;\n}\n.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {\n  -webkit-border-bottom-left-radius: 0;\n  -moz-border-radius-bottomleft: 0;\n  border-bottom-left-radius: 0;\n}\n.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {\n  -webkit-border-bottom-right-radius: 0;\n  -moz-border-radius-bottomright: 0;\n  border-bottom-right-radius: 0;\n}\n.table-bordered caption + thead tr:first-child th:first-child,\n.table-bordered caption + tbody tr:first-child td:first-child,\n.table-bordered colgroup + thead tr:first-child th:first-child,\n.table-bordered colgroup + tbody tr:first-child td:first-child {\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n}\n.table-bordered caption + thead tr:first-child th:last-child,\n.table-bordered caption + tbody tr:first-child td:last-child,\n.table-bordered colgroup + thead tr:first-child th:last-child,\n.table-bordered colgroup + tbody tr:first-child td:last-child {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n}\n.table-striped tbody > tr:nth-child(odd) > td,\n.table-striped tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.table-hover tbody tr:hover > td,\n.table-hover tbody tr:hover > th {\n  background-color: #f5f5f5;\n}\ntable td[class*=\"span\"],\ntable th[class*=\"span\"],\n.row-fluid table td[class*=\"span\"],\n.row-fluid table th[class*=\"span\"] {\n  display: table-cell;\n  float: none;\n  margin-left: 0;\n}\n.table td.span1,\n.table th.span1 {\n  float: none;\n  width: 44px;\n  margin-left: 0;\n}\n.table td.span2,\n.table th.span2 {\n  float: none;\n  width: 124px;\n  margin-left: 0;\n}\n.table td.span3,\n.table th.span3 {\n  float: none;\n  width: 204px;\n  margin-left: 0;\n}\n.table td.span4,\n.table th.span4 {\n  float: none;\n  width: 284px;\n  margin-left: 0;\n}\n.table td.span5,\n.table th.span5 {\n  float: none;\n  width: 364px;\n  margin-left: 0;\n}\n.table td.span6,\n.table th.span6 {\n  float: none;\n  width: 444px;\n  margin-left: 0;\n}\n.table td.span7,\n.table th.span7 {\n  float: none;\n  width: 524px;\n  margin-left: 0;\n}\n.table td.span8,\n.table th.span8 {\n  float: none;\n  width: 604px;\n  margin-left: 0;\n}\n.table td.span9,\n.table th.span9 {\n  float: none;\n  width: 684px;\n  margin-left: 0;\n}\n.table td.span10,\n.table th.span10 {\n  float: none;\n  width: 764px;\n  margin-left: 0;\n}\n.table td.span11,\n.table th.span11 {\n  float: none;\n  width: 844px;\n  margin-left: 0;\n}\n.table td.span12,\n.table th.span12 {\n  float: none;\n  width: 924px;\n  margin-left: 0;\n}\n.table tbody tr.success > td {\n  background-color: #dff0d8;\n}\n.table tbody tr.error > td {\n  background-color: #f2dede;\n}\n.table tbody tr.warning > td {\n  background-color: #fcf8e3;\n}\n.table tbody tr.info > td {\n  background-color: #d9edf7;\n}\n.table-hover tbody tr.success:hover > td {\n  background-color: #d0e9c6;\n}\n.table-hover tbody tr.error:hover > td {\n  background-color: #ebcccc;\n}\n.table-hover tbody tr.warning:hover > td {\n  background-color: #faf2cc;\n}\n.table-hover tbody tr.info:hover > td {\n  background-color: #c4e3f3;\n}\nform {\n  margin: 0 0 20px;\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: 40px;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlegend small {\n  font-size: 15px;\n  color: #999999;\n}\nlabel,\ninput,\nbutton,\nselect,\ntextarea {\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\nlabel {\n  display: block;\n  margin-bottom: 5px;\n}\nselect,\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  display: inline-block;\n  height: 20px;\n  padding: 4px 6px;\n  margin-bottom: 10px;\n  font-size: 14px;\n  line-height: 20px;\n  color: #555555;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  vertical-align: middle;\n}\ninput,\ntextarea,\n.uneditable-input {\n  width: 206px;\n}\ntextarea {\n  height: auto;\n}\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border linear .2s, box-shadow linear .2s;\n  -moz-transition: border linear .2s, box-shadow linear .2s;\n  -o-transition: border linear .2s, box-shadow linear .2s;\n  transition: border linear .2s, box-shadow linear .2s;\n}\ntextarea:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"datetime\"]:focus,\ninput[type=\"datetime-local\"]:focus,\ninput[type=\"date\"]:focus,\ninput[type=\"month\"]:focus,\ninput[type=\"time\"]:focus,\ninput[type=\"week\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"color\"]:focus,\n.uneditable-input:focus {\n  border-color: rgba(82, 168, 236, 0.8);\n  outline: 0;\n  outline: thin dotted \\9;\n  /* IE6-9 */\n\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  *margin-top: 0;\n  /* IE7 */\n\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\ninput[type=\"file\"],\ninput[type=\"image\"],\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  width: auto;\n}\nselect,\ninput[type=\"file\"] {\n  height: 30px;\n  /* In IE7, the height of the select element cannot be changed by height, only font-size */\n\n  *margin-top: 4px;\n  /* For IE7, add top margin to align select with labels */\n\n  line-height: 30px;\n}\nselect {\n  width: 220px;\n  border: 1px solid #cccccc;\n  background-color: #ffffff;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\nselect:focus,\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.uneditable-input,\n.uneditable-textarea {\n  color: #999999;\n  background-color: #fcfcfc;\n  border-color: #cccccc;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  cursor: not-allowed;\n}\n.uneditable-input {\n  overflow: hidden;\n  white-space: nowrap;\n}\n.uneditable-textarea {\n  width: auto;\n  height: auto;\n}\ninput:-moz-placeholder,\ntextarea:-moz-placeholder {\n  color: #999999;\n}\ninput:-ms-input-placeholder,\ntextarea:-ms-input-placeholder {\n  color: #999999;\n}\ninput::-webkit-input-placeholder,\ntextarea::-webkit-input-placeholder {\n  color: #999999;\n}\n.radio,\n.checkbox {\n  min-height: 20px;\n  padding-left: 20px;\n}\n.radio input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.controls > .radio:first-child,\n.controls > .checkbox:first-child {\n  padding-top: 5px;\n}\n.radio.inline,\n.checkbox.inline {\n  display: inline-block;\n  padding-top: 5px;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.radio.inline + .radio.inline,\n.checkbox.inline + .checkbox.inline {\n  margin-left: 10px;\n}\n.input-mini {\n  width: 60px;\n}\n.input-small {\n  width: 90px;\n}\n.input-medium {\n  width: 150px;\n}\n.input-large {\n  width: 210px;\n}\n.input-xlarge {\n  width: 270px;\n}\n.input-xxlarge {\n  width: 530px;\n}\ninput[class*=\"span\"],\nselect[class*=\"span\"],\ntextarea[class*=\"span\"],\n.uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"] {\n  float: none;\n  margin-left: 0;\n}\n.input-append input[class*=\"span\"],\n.input-append .uneditable-input[class*=\"span\"],\n.input-prepend input[class*=\"span\"],\n.input-prepend .uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"],\n.row-fluid .input-prepend [class*=\"span\"],\n.row-fluid .input-append [class*=\"span\"] {\n  display: inline-block;\n}\ninput,\ntextarea,\n.uneditable-input {\n  margin-left: 0;\n}\n.controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 20px;\n}\ninput.span12,\ntextarea.span12,\n.uneditable-input.span12 {\n  width: 926px;\n}\ninput.span11,\ntextarea.span11,\n.uneditable-input.span11 {\n  width: 846px;\n}\ninput.span10,\ntextarea.span10,\n.uneditable-input.span10 {\n  width: 766px;\n}\ninput.span9,\ntextarea.span9,\n.uneditable-input.span9 {\n  width: 686px;\n}\ninput.span8,\ntextarea.span8,\n.uneditable-input.span8 {\n  width: 606px;\n}\ninput.span7,\ntextarea.span7,\n.uneditable-input.span7 {\n  width: 526px;\n}\ninput.span6,\ntextarea.span6,\n.uneditable-input.span6 {\n  width: 446px;\n}\ninput.span5,\ntextarea.span5,\n.uneditable-input.span5 {\n  width: 366px;\n}\ninput.span4,\ntextarea.span4,\n.uneditable-input.span4 {\n  width: 286px;\n}\ninput.span3,\ntextarea.span3,\n.uneditable-input.span3 {\n  width: 206px;\n}\ninput.span2,\ntextarea.span2,\n.uneditable-input.span2 {\n  width: 126px;\n}\ninput.span1,\ntextarea.span1,\n.uneditable-input.span1 {\n  width: 46px;\n}\n.controls-row {\n  *zoom: 1;\n}\n.controls-row:before,\n.controls-row:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.controls-row:after {\n  clear: both;\n}\n.controls-row [class*=\"span\"],\n.row-fluid .controls-row [class*=\"span\"] {\n  float: left;\n}\n.controls-row .checkbox[class*=\"span\"],\n.controls-row .radio[class*=\"span\"] {\n  padding-top: 5px;\n}\ninput[disabled],\nselect[disabled],\ntextarea[disabled],\ninput[readonly],\nselect[readonly],\ntextarea[readonly] {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"][readonly],\ninput[type=\"checkbox\"][readonly] {\n  background-color: transparent;\n}\n.control-group.warning .control-label,\n.control-group.warning .help-block,\n.control-group.warning .help-inline {\n  color: #c09853;\n}\n.control-group.warning .checkbox,\n.control-group.warning .radio,\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  color: #c09853;\n}\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.warning input:focus,\n.control-group.warning select:focus,\n.control-group.warning textarea:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n.control-group.warning .input-prepend .add-on,\n.control-group.warning .input-append .add-on {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n.control-group.error .control-label,\n.control-group.error .help-block,\n.control-group.error .help-inline {\n  color: #b94a48;\n}\n.control-group.error .checkbox,\n.control-group.error .radio,\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  color: #b94a48;\n}\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.error input:focus,\n.control-group.error select:focus,\n.control-group.error textarea:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n.control-group.error .input-prepend .add-on,\n.control-group.error .input-append .add-on {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n.control-group.success .control-label,\n.control-group.success .help-block,\n.control-group.success .help-inline {\n  color: #468847;\n}\n.control-group.success .checkbox,\n.control-group.success .radio,\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  color: #468847;\n}\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.success input:focus,\n.control-group.success select:focus,\n.control-group.success textarea:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n.control-group.success .input-prepend .add-on,\n.control-group.success .input-append .add-on {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n.control-group.info .control-label,\n.control-group.info .help-block,\n.control-group.info .help-inline {\n  color: #3a87ad;\n}\n.control-group.info .checkbox,\n.control-group.info .radio,\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  color: #3a87ad;\n}\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  border-color: #3a87ad;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.info input:focus,\n.control-group.info select:focus,\n.control-group.info textarea:focus {\n  border-color: #2d6987;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n}\n.control-group.info .input-prepend .add-on,\n.control-group.info .input-append .add-on {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #3a87ad;\n}\ninput:focus:invalid,\ntextarea:focus:invalid,\nselect:focus:invalid {\n  color: #b94a48;\n  border-color: #ee5f5b;\n}\ninput:focus:invalid:focus,\ntextarea:focus:invalid:focus,\nselect:focus:invalid:focus {\n  border-color: #e9322d;\n  -webkit-box-shadow: 0 0 6px #f8b9b7;\n  -moz-box-shadow: 0 0 6px #f8b9b7;\n  box-shadow: 0 0 6px #f8b9b7;\n}\n.form-actions {\n  padding: 19px 20px 20px;\n  margin-top: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #e5e5e5;\n  *zoom: 1;\n}\n.form-actions:before,\n.form-actions:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.form-actions:after {\n  clear: both;\n}\n.help-block,\n.help-inline {\n  color: #595959;\n}\n.help-block {\n  display: block;\n  margin-bottom: 10px;\n}\n.help-inline {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  vertical-align: middle;\n  padding-left: 5px;\n}\n.input-append,\n.input-prepend {\n  display: inline-block;\n  margin-bottom: 10px;\n  vertical-align: middle;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input,\n.input-append .dropdown-menu,\n.input-prepend .dropdown-menu,\n.input-append .popover,\n.input-prepend .popover {\n  font-size: 14px;\n}\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input {\n  position: relative;\n  margin-bottom: 0;\n  *margin-left: 0;\n  vertical-align: top;\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.input-append input:focus,\n.input-prepend input:focus,\n.input-append select:focus,\n.input-prepend select:focus,\n.input-append .uneditable-input:focus,\n.input-prepend .uneditable-input:focus {\n  z-index: 2;\n}\n.input-append .add-on,\n.input-prepend .add-on {\n  display: inline-block;\n  width: auto;\n  height: 20px;\n  min-width: 16px;\n  padding: 4px 5px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n  text-align: center;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n}\n.input-append .add-on,\n.input-prepend .add-on,\n.input-append .btn,\n.input-prepend .btn,\n.input-append .btn-group > .dropdown-toggle,\n.input-prepend .btn-group > .dropdown-toggle {\n  vertical-align: top;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.input-append .active,\n.input-prepend .active {\n  background-color: #a9dba9;\n  border-color: #46a546;\n}\n.input-prepend .add-on,\n.input-prepend .btn {\n  margin-right: -1px;\n}\n.input-prepend .add-on:first-child,\n.input-prepend .btn:first-child {\n  -webkit-border-radius: 4px 0 0 4px;\n  -moz-border-radius: 4px 0 0 4px;\n  border-radius: 4px 0 0 4px;\n}\n.input-append input,\n.input-append select,\n.input-append .uneditable-input {\n  -webkit-border-radius: 4px 0 0 4px;\n  -moz-border-radius: 4px 0 0 4px;\n  border-radius: 4px 0 0 4px;\n}\n.input-append input + .btn-group .btn:last-child,\n.input-append select + .btn-group .btn:last-child,\n.input-append .uneditable-input + .btn-group .btn:last-child {\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.input-append .add-on,\n.input-append .btn,\n.input-append .btn-group {\n  margin-left: -1px;\n}\n.input-append .add-on:last-child,\n.input-append .btn:last-child,\n.input-append .btn-group:last-child > .dropdown-toggle {\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.input-prepend.input-append input,\n.input-prepend.input-append select,\n.input-prepend.input-append .uneditable-input {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.input-prepend.input-append input + .btn-group .btn,\n.input-prepend.input-append select + .btn-group .btn,\n.input-prepend.input-append .uneditable-input + .btn-group .btn {\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.input-prepend.input-append .add-on:first-child,\n.input-prepend.input-append .btn:first-child {\n  margin-right: -1px;\n  -webkit-border-radius: 4px 0 0 4px;\n  -moz-border-radius: 4px 0 0 4px;\n  border-radius: 4px 0 0 4px;\n}\n.input-prepend.input-append .add-on:last-child,\n.input-prepend.input-append .btn:last-child {\n  margin-left: -1px;\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.input-prepend.input-append .btn-group:first-child {\n  margin-left: 0;\n}\ninput.search-query {\n  padding-right: 14px;\n  padding-right: 4px \\9;\n  padding-left: 14px;\n  padding-left: 4px \\9;\n  /* IE7-8 doesn't have border-radius, so don't indent the padding */\n\n  margin-bottom: 0;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n/* Allow for input prepend/append in search forms */\n.form-search .input-append .search-query,\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.form-search .input-append .search-query {\n  -webkit-border-radius: 14px 0 0 14px;\n  -moz-border-radius: 14px 0 0 14px;\n  border-radius: 14px 0 0 14px;\n}\n.form-search .input-append .btn {\n  -webkit-border-radius: 0 14px 14px 0;\n  -moz-border-radius: 0 14px 14px 0;\n  border-radius: 0 14px 14px 0;\n}\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0 14px 14px 0;\n  -moz-border-radius: 0 14px 14px 0;\n  border-radius: 0 14px 14px 0;\n}\n.form-search .input-prepend .btn {\n  -webkit-border-radius: 14px 0 0 14px;\n  -moz-border-radius: 14px 0 0 14px;\n  border-radius: 14px 0 0 14px;\n}\n.form-search input,\n.form-inline input,\n.form-horizontal input,\n.form-search textarea,\n.form-inline textarea,\n.form-horizontal textarea,\n.form-search select,\n.form-inline select,\n.form-horizontal select,\n.form-search .help-inline,\n.form-inline .help-inline,\n.form-horizontal .help-inline,\n.form-search .uneditable-input,\n.form-inline .uneditable-input,\n.form-horizontal .uneditable-input,\n.form-search .input-prepend,\n.form-inline .input-prepend,\n.form-horizontal .input-prepend,\n.form-search .input-append,\n.form-inline .input-append,\n.form-horizontal .input-append {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.form-search .hide,\n.form-inline .hide,\n.form-horizontal .hide {\n  display: none;\n}\n.form-search label,\n.form-inline label,\n.form-search .btn-group,\n.form-inline .btn-group {\n  display: inline-block;\n}\n.form-search .input-append,\n.form-inline .input-append,\n.form-search .input-prepend,\n.form-inline .input-prepend {\n  margin-bottom: 0;\n}\n.form-search .radio,\n.form-search .checkbox,\n.form-inline .radio,\n.form-inline .checkbox {\n  padding-left: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.form-search .radio input[type=\"radio\"],\n.form-search .checkbox input[type=\"checkbox\"],\n.form-inline .radio input[type=\"radio\"],\n.form-inline .checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-right: 3px;\n  margin-left: 0;\n}\n.control-group {\n  margin-bottom: 10px;\n}\nlegend + .control-group {\n  margin-top: 20px;\n  -webkit-margin-top-collapse: separate;\n}\n.form-horizontal .control-group {\n  margin-bottom: 20px;\n  *zoom: 1;\n}\n.form-horizontal .control-group:before,\n.form-horizontal .control-group:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.form-horizontal .control-group:after {\n  clear: both;\n}\n.form-horizontal .control-label {\n  float: left;\n  width: 160px;\n  padding-top: 5px;\n  text-align: right;\n}\n.form-horizontal .controls {\n  *display: inline-block;\n  *padding-left: 20px;\n  margin-left: 180px;\n  *margin-left: 0;\n}\n.form-horizontal .controls:first-child {\n  *padding-left: 180px;\n}\n.form-horizontal .help-block {\n  margin-bottom: 0;\n}\n.form-horizontal input + .help-block,\n.form-horizontal select + .help-block,\n.form-horizontal textarea + .help-block,\n.form-horizontal .uneditable-input + .help-block,\n.form-horizontal .input-prepend + .help-block,\n.form-horizontal .input-append + .help-block {\n  margin-top: 10px;\n}\n.form-horizontal .form-actions {\n  padding-left: 180px;\n}\n.btn {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  padding: 4px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  line-height: 20px;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  color: #333333;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e6e6e6;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  border: 1px solid #cccccc;\n  *border: 0;\n  border-bottom-color: #b3b3b3;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  *margin-left: .3em;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn:hover,\n.btn:focus,\n.btn:active,\n.btn.active,\n.btn.disabled,\n.btn[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\n.btn:active,\n.btn.active {\n  background-color: #cccccc \\9;\n}\n.btn:first-child {\n  *margin-left: 0;\n}\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n  background-position: 0 -15px;\n  -webkit-transition: background-position 0.1s linear;\n  -moz-transition: background-position 0.1s linear;\n  -o-transition: background-position 0.1s linear;\n  transition: background-position 0.1s linear;\n}\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn.active,\n.btn:active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn.disabled,\n.btn[disabled] {\n  cursor: default;\n  background-image: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.btn-large {\n  padding: 11px 19px;\n  font-size: 17.5px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.btn-large [class^=\"icon-\"],\n.btn-large [class*=\" icon-\"] {\n  margin-top: 4px;\n}\n.btn-small {\n  padding: 2px 10px;\n  font-size: 11.9px;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.btn-small [class^=\"icon-\"],\n.btn-small [class*=\" icon-\"] {\n  margin-top: 0;\n}\n.btn-mini [class^=\"icon-\"],\n.btn-mini [class*=\" icon-\"] {\n  margin-top: -1px;\n}\n.btn-mini {\n  padding: 0 6px;\n  font-size: 10.5px;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.btn-primary.active,\n.btn-warning.active,\n.btn-danger.active,\n.btn-success.active,\n.btn-info.active,\n.btn-inverse.active {\n  color: rgba(255, 255, 255, 0.75);\n}\n.btn-primary {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0044cc);\n  background-image: linear-gradient(to bottom, #0088cc, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #0044cc;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.btn-primary.disabled,\n.btn-primary[disabled] {\n  color: #ffffff;\n  background-color: #0044cc;\n  *background-color: #003bb3;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #003399 \\9;\n}\n.btn-warning {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n  border-color: #f89406 #f89406 #ad6704;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #f89406;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.btn-warning.disabled,\n.btn-warning[disabled] {\n  color: #ffffff;\n  background-color: #f89406;\n  *background-color: #df8505;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #c67605 \\9;\n}\n.btn-danger {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #da4f49;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);\n  border-color: #bd362f #bd362f #802420;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #bd362f;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.btn-danger.disabled,\n.btn-danger[disabled] {\n  color: #ffffff;\n  background-color: #bd362f;\n  *background-color: #a9302a;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #942a25 \\9;\n}\n.btn-success {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #5bb75b;\n  background-image: -moz-linear-gradient(top, #62c462, #51a351);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));\n  background-image: -webkit-linear-gradient(top, #62c462, #51a351);\n  background-image: -o-linear-gradient(top, #62c462, #51a351);\n  background-image: linear-gradient(to bottom, #62c462, #51a351);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);\n  border-color: #51a351 #51a351 #387038;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #51a351;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.btn-success.disabled,\n.btn-success[disabled] {\n  color: #ffffff;\n  background-color: #51a351;\n  *background-color: #499249;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #408140 \\9;\n}\n.btn-info {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #49afcd;\n  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);\n  border-color: #2f96b4 #2f96b4 #1f6377;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #2f96b4;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.btn-info.disabled,\n.btn-info[disabled] {\n  color: #ffffff;\n  background-color: #2f96b4;\n  *background-color: #2a85a0;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #24748c \\9;\n}\n.btn-inverse {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #363636;\n  background-image: -moz-linear-gradient(top, #444444, #222222);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));\n  background-image: -webkit-linear-gradient(top, #444444, #222222);\n  background-image: -o-linear-gradient(top, #444444, #222222);\n  background-image: linear-gradient(to bottom, #444444, #222222);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);\n  border-color: #222222 #222222 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #222222;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-inverse:hover,\n.btn-inverse:focus,\n.btn-inverse:active,\n.btn-inverse.active,\n.btn-inverse.disabled,\n.btn-inverse[disabled] {\n  color: #ffffff;\n  background-color: #222222;\n  *background-color: #151515;\n}\n.btn-inverse:active,\n.btn-inverse.active {\n  background-color: #080808 \\9;\n}\nbutton.btn,\ninput[type=\"submit\"].btn {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\nbutton.btn::-moz-focus-inner,\ninput[type=\"submit\"].btn::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\nbutton.btn.btn-large,\ninput[type=\"submit\"].btn.btn-large {\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\nbutton.btn.btn-small,\ninput[type=\"submit\"].btn.btn-small {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\nbutton.btn.btn-mini,\ninput[type=\"submit\"].btn.btn-mini {\n  *padding-top: 1px;\n  *padding-bottom: 1px;\n}\n.btn-link,\n.btn-link:active,\n.btn-link[disabled] {\n  background-color: transparent;\n  background-image: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link {\n  border-color: transparent;\n  cursor: pointer;\n  color: #0088cc;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #005580;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\n.btn-link[disabled]:focus {\n  color: #333333;\n  text-decoration: none;\n}\n[class^=\"icon-\"],\n[class*=\" icon-\"] {\n  display: inline-block;\n  width: 14px;\n  height: 14px;\n  *margin-right: .3em;\n  line-height: 14px;\n  vertical-align: text-top;\n  background-image: url(\"../img/glyphicons-halflings.png\");\n  background-position: 14px 14px;\n  background-repeat: no-repeat;\n  margin-top: 1px;\n}\n/* White icons with optional class, or on hover/focus/active states of certain elements */\n.icon-white,\n.nav-pills > .active > a > [class^=\"icon-\"],\n.nav-pills > .active > a > [class*=\" icon-\"],\n.nav-list > .active > a > [class^=\"icon-\"],\n.nav-list > .active > a > [class*=\" icon-\"],\n.navbar-inverse .nav > .active > a > [class^=\"icon-\"],\n.navbar-inverse .nav > .active > a > [class*=\" icon-\"],\n.dropdown-menu > li > a:hover > [class^=\"icon-\"],\n.dropdown-menu > li > a:focus > [class^=\"icon-\"],\n.dropdown-menu > li > a:hover > [class*=\" icon-\"],\n.dropdown-menu > li > a:focus > [class*=\" icon-\"],\n.dropdown-menu > .active > a > [class^=\"icon-\"],\n.dropdown-menu > .active > a > [class*=\" icon-\"],\n.dropdown-submenu:hover > a > [class^=\"icon-\"],\n.dropdown-submenu:focus > a > [class^=\"icon-\"],\n.dropdown-submenu:hover > a > [class*=\" icon-\"],\n.dropdown-submenu:focus > a > [class*=\" icon-\"] {\n  background-image: url(\"../img/glyphicons-halflings-white.png\");\n}\n.icon-glass {\n  background-position: 0      0;\n}\n.icon-music {\n  background-position: -24px 0;\n}\n.icon-search {\n  background-position: -48px 0;\n}\n.icon-envelope {\n  background-position: -72px 0;\n}\n.icon-heart {\n  background-position: -96px 0;\n}\n.icon-star {\n  background-position: -120px 0;\n}\n.icon-star-empty {\n  background-position: -144px 0;\n}\n.icon-user {\n  background-position: -168px 0;\n}\n.icon-film {\n  background-position: -192px 0;\n}\n.icon-th-large {\n  background-position: -216px 0;\n}\n.icon-th {\n  background-position: -240px 0;\n}\n.icon-th-list {\n  background-position: -264px 0;\n}\n.icon-ok {\n  background-position: -288px 0;\n}\n.icon-remove {\n  background-position: -312px 0;\n}\n.icon-zoom-in {\n  background-position: -336px 0;\n}\n.icon-zoom-out {\n  background-position: -360px 0;\n}\n.icon-off {\n  background-position: -384px 0;\n}\n.icon-signal {\n  background-position: -408px 0;\n}\n.icon-cog {\n  background-position: -432px 0;\n}\n.icon-trash {\n  background-position: -456px 0;\n}\n.icon-home {\n  background-position: 0 -24px;\n}\n.icon-file {\n  background-position: -24px -24px;\n}\n.icon-time {\n  background-position: -48px -24px;\n}\n.icon-road {\n  background-position: -72px -24px;\n}\n.icon-download-alt {\n  background-position: -96px -24px;\n}\n.icon-download {\n  background-position: -120px -24px;\n}\n.icon-upload {\n  background-position: -144px -24px;\n}\n.icon-inbox {\n  background-position: -168px -24px;\n}\n.icon-play-circle {\n  background-position: -192px -24px;\n}\n.icon-repeat {\n  background-position: -216px -24px;\n}\n.icon-refresh {\n  background-position: -240px -24px;\n}\n.icon-list-alt {\n  background-position: -264px -24px;\n}\n.icon-lock {\n  background-position: -287px -24px;\n}\n.icon-flag {\n  background-position: -312px -24px;\n}\n.icon-headphones {\n  background-position: -336px -24px;\n}\n.icon-volume-off {\n  background-position: -360px -24px;\n}\n.icon-volume-down {\n  background-position: -384px -24px;\n}\n.icon-volume-up {\n  background-position: -408px -24px;\n}\n.icon-qrcode {\n  background-position: -432px -24px;\n}\n.icon-barcode {\n  background-position: -456px -24px;\n}\n.icon-tag {\n  background-position: 0 -48px;\n}\n.icon-tags {\n  background-position: -25px -48px;\n}\n.icon-book {\n  background-position: -48px -48px;\n}\n.icon-bookmark {\n  background-position: -72px -48px;\n}\n.icon-print {\n  background-position: -96px -48px;\n}\n.icon-camera {\n  background-position: -120px -48px;\n}\n.icon-font {\n  background-position: -144px -48px;\n}\n.icon-bold {\n  background-position: -167px -48px;\n}\n.icon-italic {\n  background-position: -192px -48px;\n}\n.icon-text-height {\n  background-position: -216px -48px;\n}\n.icon-text-width {\n  background-position: -240px -48px;\n}\n.icon-align-left {\n  background-position: -264px -48px;\n}\n.icon-align-center {\n  background-position: -288px -48px;\n}\n.icon-align-right {\n  background-position: -312px -48px;\n}\n.icon-align-justify {\n  background-position: -336px -48px;\n}\n.icon-list {\n  background-position: -360px -48px;\n}\n.icon-indent-left {\n  background-position: -384px -48px;\n}\n.icon-indent-right {\n  background-position: -408px -48px;\n}\n.icon-facetime-video {\n  background-position: -432px -48px;\n}\n.icon-picture {\n  background-position: -456px -48px;\n}\n.icon-pencil {\n  background-position: 0 -72px;\n}\n.icon-map-marker {\n  background-position: -24px -72px;\n}\n.icon-adjust {\n  background-position: -48px -72px;\n}\n.icon-tint {\n  background-position: -72px -72px;\n}\n.icon-edit {\n  background-position: -96px -72px;\n}\n.icon-share {\n  background-position: -120px -72px;\n}\n.icon-check {\n  background-position: -144px -72px;\n}\n.icon-move {\n  background-position: -168px -72px;\n}\n.icon-step-backward {\n  background-position: -192px -72px;\n}\n.icon-fast-backward {\n  background-position: -216px -72px;\n}\n.icon-backward {\n  background-position: -240px -72px;\n}\n.icon-play {\n  background-position: -264px -72px;\n}\n.icon-pause {\n  background-position: -288px -72px;\n}\n.icon-stop {\n  background-position: -312px -72px;\n}\n.icon-forward {\n  background-position: -336px -72px;\n}\n.icon-fast-forward {\n  background-position: -360px -72px;\n}\n.icon-step-forward {\n  background-position: -384px -72px;\n}\n.icon-eject {\n  background-position: -408px -72px;\n}\n.icon-chevron-left {\n  background-position: -432px -72px;\n}\n.icon-chevron-right {\n  background-position: -456px -72px;\n}\n.icon-plus-sign {\n  background-position: 0 -96px;\n}\n.icon-minus-sign {\n  background-position: -24px -96px;\n}\n.icon-remove-sign {\n  background-position: -48px -96px;\n}\n.icon-ok-sign {\n  background-position: -72px -96px;\n}\n.icon-question-sign {\n  background-position: -96px -96px;\n}\n.icon-info-sign {\n  background-position: -120px -96px;\n}\n.icon-screenshot {\n  background-position: -144px -96px;\n}\n.icon-remove-circle {\n  background-position: -168px -96px;\n}\n.icon-ok-circle {\n  background-position: -192px -96px;\n}\n.icon-ban-circle {\n  background-position: -216px -96px;\n}\n.icon-arrow-left {\n  background-position: -240px -96px;\n}\n.icon-arrow-right {\n  background-position: -264px -96px;\n}\n.icon-arrow-up {\n  background-position: -289px -96px;\n}\n.icon-arrow-down {\n  background-position: -312px -96px;\n}\n.icon-share-alt {\n  background-position: -336px -96px;\n}\n.icon-resize-full {\n  background-position: -360px -96px;\n}\n.icon-resize-small {\n  background-position: -384px -96px;\n}\n.icon-plus {\n  background-position: -408px -96px;\n}\n.icon-minus {\n  background-position: -433px -96px;\n}\n.icon-asterisk {\n  background-position: -456px -96px;\n}\n.icon-exclamation-sign {\n  background-position: 0 -120px;\n}\n.icon-gift {\n  background-position: -24px -120px;\n}\n.icon-leaf {\n  background-position: -48px -120px;\n}\n.icon-fire {\n  background-position: -72px -120px;\n}\n.icon-eye-open {\n  background-position: -96px -120px;\n}\n.icon-eye-close {\n  background-position: -120px -120px;\n}\n.icon-warning-sign {\n  background-position: -144px -120px;\n}\n.icon-plane {\n  background-position: -168px -120px;\n}\n.icon-calendar {\n  background-position: -192px -120px;\n}\n.icon-random {\n  background-position: -216px -120px;\n  width: 16px;\n}\n.icon-comment {\n  background-position: -240px -120px;\n}\n.icon-magnet {\n  background-position: -264px -120px;\n}\n.icon-chevron-up {\n  background-position: -288px -120px;\n}\n.icon-chevron-down {\n  background-position: -313px -119px;\n}\n.icon-retweet {\n  background-position: -336px -120px;\n}\n.icon-shopping-cart {\n  background-position: -360px -120px;\n}\n.icon-folder-close {\n  background-position: -384px -120px;\n  width: 16px;\n}\n.icon-folder-open {\n  background-position: -408px -120px;\n  width: 16px;\n}\n.icon-resize-vertical {\n  background-position: -432px -119px;\n}\n.icon-resize-horizontal {\n  background-position: -456px -118px;\n}\n.icon-hdd {\n  background-position: 0 -144px;\n}\n.icon-bullhorn {\n  background-position: -24px -144px;\n}\n.icon-bell {\n  background-position: -48px -144px;\n}\n.icon-certificate {\n  background-position: -72px -144px;\n}\n.icon-thumbs-up {\n  background-position: -96px -144px;\n}\n.icon-thumbs-down {\n  background-position: -120px -144px;\n}\n.icon-hand-right {\n  background-position: -144px -144px;\n}\n.icon-hand-left {\n  background-position: -168px -144px;\n}\n.icon-hand-up {\n  background-position: -192px -144px;\n}\n.icon-hand-down {\n  background-position: -216px -144px;\n}\n.icon-circle-arrow-right {\n  background-position: -240px -144px;\n}\n.icon-circle-arrow-left {\n  background-position: -264px -144px;\n}\n.icon-circle-arrow-up {\n  background-position: -288px -144px;\n}\n.icon-circle-arrow-down {\n  background-position: -312px -144px;\n}\n.icon-globe {\n  background-position: -336px -144px;\n}\n.icon-wrench {\n  background-position: -360px -144px;\n}\n.icon-tasks {\n  background-position: -384px -144px;\n}\n.icon-filter {\n  background-position: -408px -144px;\n}\n.icon-briefcase {\n  background-position: -432px -144px;\n}\n.icon-fullscreen {\n  background-position: -456px -144px;\n}\n.btn-group {\n  position: relative;\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  font-size: 0;\n  vertical-align: middle;\n  white-space: nowrap;\n  *margin-left: .3em;\n}\n.btn-group:first-child {\n  *margin-left: 0;\n}\n.btn-group + .btn-group {\n  margin-left: 5px;\n}\n.btn-toolbar {\n  font-size: 0;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group {\n  margin-left: 5px;\n}\n.btn-group > .btn {\n  position: relative;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-group > .btn + .btn {\n  margin-left: -1px;\n}\n.btn-group > .btn,\n.btn-group > .dropdown-menu,\n.btn-group > .popover {\n  font-size: 14px;\n}\n.btn-group > .btn-mini {\n  font-size: 10.5px;\n}\n.btn-group > .btn-small {\n  font-size: 11.9px;\n}\n.btn-group > .btn-large {\n  font-size: 17.5px;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  border-bottom-left-radius: 4px;\n}\n.btn-group > .btn:last-child,\n.btn-group > .dropdown-toggle {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n  -webkit-border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  border-bottom-right-radius: 4px;\n}\n.btn-group > .btn.large:first-child {\n  margin-left: 0;\n  -webkit-border-top-left-radius: 6px;\n  -moz-border-radius-topleft: 6px;\n  border-top-left-radius: 6px;\n  -webkit-border-bottom-left-radius: 6px;\n  -moz-border-radius-bottomleft: 6px;\n  border-bottom-left-radius: 6px;\n}\n.btn-group > .btn.large:last-child,\n.btn-group > .large.dropdown-toggle {\n  -webkit-border-top-right-radius: 6px;\n  -moz-border-radius-topright: 6px;\n  border-top-right-radius: 6px;\n  -webkit-border-bottom-right-radius: 6px;\n  -moz-border-radius-bottomright: 6px;\n  border-bottom-right-radius: 6px;\n}\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active {\n  z-index: 2;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n  -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  *padding-top: 5px;\n  *padding-bottom: 5px;\n}\n.btn-group > .btn-mini + .dropdown-toggle {\n  padding-left: 5px;\n  padding-right: 5px;\n  *padding-top: 2px;\n  *padding-bottom: 2px;\n}\n.btn-group > .btn-small + .dropdown-toggle {\n  *padding-top: 5px;\n  *padding-bottom: 4px;\n}\n.btn-group > .btn-large + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\n.btn-group.open .dropdown-toggle {\n  background-image: none;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn-group.open .btn.dropdown-toggle {\n  background-color: #e6e6e6;\n}\n.btn-group.open .btn-primary.dropdown-toggle {\n  background-color: #0044cc;\n}\n.btn-group.open .btn-warning.dropdown-toggle {\n  background-color: #f89406;\n}\n.btn-group.open .btn-danger.dropdown-toggle {\n  background-color: #bd362f;\n}\n.btn-group.open .btn-success.dropdown-toggle {\n  background-color: #51a351;\n}\n.btn-group.open .btn-info.dropdown-toggle {\n  background-color: #2f96b4;\n}\n.btn-group.open .btn-inverse.dropdown-toggle {\n  background-color: #222222;\n}\n.btn .caret {\n  margin-top: 8px;\n  margin-left: 0;\n}\n.btn-large .caret {\n  margin-top: 6px;\n}\n.btn-large .caret {\n  border-left-width: 5px;\n  border-right-width: 5px;\n  border-top-width: 5px;\n}\n.btn-mini .caret,\n.btn-small .caret {\n  margin-top: 8px;\n}\n.dropup .btn-large .caret {\n  border-bottom-width: 5px;\n}\n.btn-primary .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret,\n.btn-success .caret,\n.btn-inverse .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.btn-group-vertical {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n}\n.btn-group-vertical > .btn {\n  display: block;\n  float: none;\n  max-width: 100%;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-group-vertical > .btn + .btn {\n  margin-left: 0;\n  margin-top: -1px;\n}\n.btn-group-vertical > .btn:first-child {\n  -webkit-border-radius: 4px 4px 0 0;\n  -moz-border-radius: 4px 4px 0 0;\n  border-radius: 4px 4px 0 0;\n}\n.btn-group-vertical > .btn:last-child {\n  -webkit-border-radius: 0 0 4px 4px;\n  -moz-border-radius: 0 0 4px 4px;\n  border-radius: 0 0 4px 4px;\n}\n.btn-group-vertical > .btn-large:first-child {\n  -webkit-border-radius: 6px 6px 0 0;\n  -moz-border-radius: 6px 6px 0 0;\n  border-radius: 6px 6px 0 0;\n}\n.btn-group-vertical > .btn-large:last-child {\n  -webkit-border-radius: 0 0 6px 6px;\n  -moz-border-radius: 0 0 6px 6px;\n  border-radius: 0 0 6px 6px;\n}\n.nav {\n  margin-left: 0;\n  margin-bottom: 20px;\n  list-style: none;\n}\n.nav > li > a {\n  display: block;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav > .pull-right {\n  float: right;\n}\n.nav-header {\n  display: block;\n  padding: 3px 15px;\n  font-size: 11px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #999999;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  text-transform: uppercase;\n}\n.nav li + .nav-header {\n  margin-top: 9px;\n}\n.nav-list {\n  padding-left: 15px;\n  padding-right: 15px;\n  margin-bottom: 0;\n}\n.nav-list > li > a,\n.nav-list .nav-header {\n  margin-left: -15px;\n  margin-right: -15px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n.nav-list > li > a {\n  padding: 3px 15px;\n}\n.nav-list > .active > a,\n.nav-list > .active > a:hover,\n.nav-list > .active > a:focus {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  background-color: #0088cc;\n}\n.nav-list [class^=\"icon-\"],\n.nav-list [class*=\" icon-\"] {\n  margin-right: 2px;\n}\n.nav-list .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n.nav-tabs,\n.nav-pills {\n  *zoom: 1;\n}\n.nav-tabs:before,\n.nav-pills:before,\n.nav-tabs:after,\n.nav-pills:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.nav-tabs:after,\n.nav-pills:after {\n  clear: both;\n}\n.nav-tabs > li,\n.nav-pills > li {\n  float: left;\n}\n.nav-tabs > li > a,\n.nav-pills > li > a {\n  padding-right: 12px;\n  padding-left: 12px;\n  margin-right: 2px;\n  line-height: 14px;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  line-height: 20px;\n  border: 1px solid transparent;\n  -webkit-border-radius: 4px 4px 0 0;\n  -moz-border-radius: 4px 4px 0 0;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover,\n.nav-tabs > li > a:focus {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > .active > a,\n.nav-tabs > .active > a:hover,\n.nav-tabs > .active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-pills > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  margin-top: 2px;\n  margin-bottom: 2px;\n  -webkit-border-radius: 5px;\n  -moz-border-radius: 5px;\n  border-radius: 5px;\n}\n.nav-pills > .active > a,\n.nav-pills > .active > a:hover,\n.nav-pills > .active > a:focus {\n  color: #ffffff;\n  background-color: #0088cc;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li > a {\n  margin-right: 0;\n}\n.nav-tabs.nav-stacked {\n  border-bottom: 0;\n}\n.nav-tabs.nav-stacked > li > a {\n  border: 1px solid #ddd;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.nav-tabs.nav-stacked > li:first-child > a {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n}\n.nav-tabs.nav-stacked > li:last-child > a {\n  -webkit-border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  border-bottom-right-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  border-bottom-left-radius: 4px;\n}\n.nav-tabs.nav-stacked > li > a:hover,\n.nav-tabs.nav-stacked > li > a:focus {\n  border-color: #ddd;\n  z-index: 2;\n}\n.nav-pills.nav-stacked > li > a {\n  margin-bottom: 3px;\n}\n.nav-pills.nav-stacked > li:last-child > a {\n  margin-bottom: 1px;\n}\n.nav-tabs .dropdown-menu {\n  -webkit-border-radius: 0 0 6px 6px;\n  -moz-border-radius: 0 0 6px 6px;\n  border-radius: 0 0 6px 6px;\n}\n.nav-pills .dropdown-menu {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.nav .dropdown-toggle .caret {\n  border-top-color: #0088cc;\n  border-bottom-color: #0088cc;\n  margin-top: 6px;\n}\n.nav .dropdown-toggle:hover .caret,\n.nav .dropdown-toggle:focus .caret {\n  border-top-color: #005580;\n  border-bottom-color: #005580;\n}\n/* move down carets for tabs */\n.nav-tabs .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n.nav .active .dropdown-toggle .caret {\n  border-top-color: #fff;\n  border-bottom-color: #fff;\n}\n.nav-tabs .active .dropdown-toggle .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n.nav > .dropdown.active > a:hover,\n.nav > .dropdown.active > a:focus {\n  cursor: pointer;\n}\n.nav-tabs .open .dropdown-toggle,\n.nav-pills .open .dropdown-toggle,\n.nav > li.dropdown.open.active > a:hover,\n.nav > li.dropdown.open.active > a:focus {\n  color: #ffffff;\n  background-color: #999999;\n  border-color: #999999;\n}\n.nav li.dropdown.open .caret,\n.nav li.dropdown.open.active .caret,\n.nav li.dropdown.open a:hover .caret,\n.nav li.dropdown.open a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n  opacity: 1;\n  filter: alpha(opacity=100);\n}\n.tabs-stacked .open > a:hover,\n.tabs-stacked .open > a:focus {\n  border-color: #999999;\n}\n.tabbable {\n  *zoom: 1;\n}\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.tabbable:after {\n  clear: both;\n}\n.tab-content {\n  overflow: auto;\n}\n.tabs-below > .nav-tabs,\n.tabs-right > .nav-tabs,\n.tabs-left > .nav-tabs {\n  border-bottom: 0;\n}\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n.tabs-below > .nav-tabs {\n  border-top: 1px solid #ddd;\n}\n.tabs-below > .nav-tabs > li {\n  margin-top: -1px;\n  margin-bottom: 0;\n}\n.tabs-below > .nav-tabs > li > a {\n  -webkit-border-radius: 0 0 4px 4px;\n  -moz-border-radius: 0 0 4px 4px;\n  border-radius: 0 0 4px 4px;\n}\n.tabs-below > .nav-tabs > li > a:hover,\n.tabs-below > .nav-tabs > li > a:focus {\n  border-bottom-color: transparent;\n  border-top-color: #ddd;\n}\n.tabs-below > .nav-tabs > .active > a,\n.tabs-below > .nav-tabs > .active > a:hover,\n.tabs-below > .nav-tabs > .active > a:focus {\n  border-color: transparent #ddd #ddd #ddd;\n}\n.tabs-left > .nav-tabs > li,\n.tabs-right > .nav-tabs > li {\n  float: none;\n}\n.tabs-left > .nav-tabs > li > a,\n.tabs-right > .nav-tabs > li > a {\n  min-width: 74px;\n  margin-right: 0;\n  margin-bottom: 3px;\n}\n.tabs-left > .nav-tabs {\n  float: left;\n  margin-right: 19px;\n  border-right: 1px solid #ddd;\n}\n.tabs-left > .nav-tabs > li > a {\n  margin-right: -1px;\n  -webkit-border-radius: 4px 0 0 4px;\n  -moz-border-radius: 4px 0 0 4px;\n  border-radius: 4px 0 0 4px;\n}\n.tabs-left > .nav-tabs > li > a:hover,\n.tabs-left > .nav-tabs > li > a:focus {\n  border-color: #eeeeee #dddddd #eeeeee #eeeeee;\n}\n.tabs-left > .nav-tabs .active > a,\n.tabs-left > .nav-tabs .active > a:hover,\n.tabs-left > .nav-tabs .active > a:focus {\n  border-color: #ddd transparent #ddd #ddd;\n  *border-right-color: #ffffff;\n}\n.tabs-right > .nav-tabs {\n  float: right;\n  margin-left: 19px;\n  border-left: 1px solid #ddd;\n}\n.tabs-right > .nav-tabs > li > a {\n  margin-left: -1px;\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.tabs-right > .nav-tabs > li > a:hover,\n.tabs-right > .nav-tabs > li > a:focus {\n  border-color: #eeeeee #eeeeee #eeeeee #dddddd;\n}\n.tabs-right > .nav-tabs .active > a,\n.tabs-right > .nav-tabs .active > a:hover,\n.tabs-right > .nav-tabs .active > a:focus {\n  border-color: #ddd #ddd #ddd transparent;\n  *border-left-color: #ffffff;\n}\n.nav > .disabled > a {\n  color: #999999;\n}\n.nav > .disabled > a:hover,\n.nav > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  cursor: default;\n}\n.navbar {\n  overflow: visible;\n  margin-bottom: 20px;\n  *position: relative;\n  *z-index: 2;\n}\n.navbar-inner {\n  min-height: 40px;\n  padding-left: 20px;\n  padding-right: 20px;\n  background-color: #fafafa;\n  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));\n  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);\n  border: 1px solid #d4d4d4;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  *zoom: 1;\n}\n.navbar-inner:before,\n.navbar-inner:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.navbar-inner:after {\n  clear: both;\n}\n.navbar .container {\n  width: auto;\n}\n.nav-collapse.collapse {\n  height: auto;\n  overflow: visible;\n}\n.navbar .brand {\n  float: left;\n  display: block;\n  padding: 10px 20px 10px;\n  margin-left: -20px;\n  font-size: 20px;\n  font-weight: 200;\n  color: #777777;\n  text-shadow: 0 1px 0 #ffffff;\n}\n.navbar .brand:hover,\n.navbar .brand:focus {\n  text-decoration: none;\n}\n.navbar-text {\n  margin-bottom: 0;\n  line-height: 40px;\n  color: #777777;\n}\n.navbar-link {\n  color: #777777;\n}\n.navbar-link:hover,\n.navbar-link:focus {\n  color: #333333;\n}\n.navbar .divider-vertical {\n  height: 40px;\n  margin: 0 9px;\n  border-left: 1px solid #f2f2f2;\n  border-right: 1px solid #ffffff;\n}\n.navbar .btn,\n.navbar .btn-group {\n  margin-top: 5px;\n}\n.navbar .btn-group .btn,\n.navbar .input-prepend .btn,\n.navbar .input-append .btn,\n.navbar .input-prepend .btn-group,\n.navbar .input-append .btn-group {\n  margin-top: 0;\n}\n.navbar-form {\n  margin-bottom: 0;\n  *zoom: 1;\n}\n.navbar-form:before,\n.navbar-form:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.navbar-form:after {\n  clear: both;\n}\n.navbar-form input,\n.navbar-form select,\n.navbar-form .radio,\n.navbar-form .checkbox {\n  margin-top: 5px;\n}\n.navbar-form input,\n.navbar-form select,\n.navbar-form .btn {\n  display: inline-block;\n  margin-bottom: 0;\n}\n.navbar-form input[type=\"image\"],\n.navbar-form input[type=\"checkbox\"],\n.navbar-form input[type=\"radio\"] {\n  margin-top: 3px;\n}\n.navbar-form .input-append,\n.navbar-form .input-prepend {\n  margin-top: 5px;\n  white-space: nowrap;\n}\n.navbar-form .input-append input,\n.navbar-form .input-prepend input {\n  margin-top: 0;\n}\n.navbar-search {\n  position: relative;\n  float: left;\n  margin-top: 5px;\n  margin-bottom: 0;\n}\n.navbar-search .search-query {\n  margin-bottom: 0;\n  padding: 4px 14px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n.navbar-static-top {\n  position: static;\n  margin-bottom: 0;\n}\n.navbar-static-top .navbar-inner {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n  margin-bottom: 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom .navbar-inner {\n  border-width: 1px 0 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-fixed-bottom .navbar-inner {\n  padding-left: 0;\n  padding-right: 0;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n.navbar-fixed-top {\n  top: 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1);\n  -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1);\n  box-shadow: 0 1px 10px rgba(0,0,0,.1);\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n}\n.navbar-fixed-bottom .navbar-inner {\n  -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n  -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n  box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n}\n.navbar .nav {\n  position: relative;\n  left: 0;\n  display: block;\n  float: left;\n  margin: 0 10px 0 0;\n}\n.navbar .nav.pull-right {\n  float: right;\n  margin-right: 0;\n}\n.navbar .nav > li {\n  float: left;\n}\n.navbar .nav > li > a {\n  float: none;\n  padding: 10px 15px 10px;\n  color: #777777;\n  text-decoration: none;\n  text-shadow: 0 1px 0 #ffffff;\n}\n.navbar .nav .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n.navbar .nav > li > a:focus,\n.navbar .nav > li > a:hover {\n  background-color: transparent;\n  color: #333333;\n  text-decoration: none;\n}\n.navbar .nav > .active > a,\n.navbar .nav > .active > a:hover,\n.navbar .nav > .active > a:focus {\n  color: #555555;\n  text-decoration: none;\n  background-color: #e5e5e5;\n  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n}\n.navbar .btn-navbar {\n  display: none;\n  float: right;\n  padding: 7px 10px;\n  margin-left: 5px;\n  margin-right: 5px;\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #ededed;\n  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));\n  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);\n  border-color: #e5e5e5 #e5e5e5 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e5e5e5;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n}\n.navbar .btn-navbar:hover,\n.navbar .btn-navbar:focus,\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active,\n.navbar .btn-navbar.disabled,\n.navbar .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #e5e5e5;\n  *background-color: #d9d9d9;\n}\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active {\n  background-color: #cccccc \\9;\n}\n.navbar .btn-navbar .icon-bar {\n  display: block;\n  width: 18px;\n  height: 2px;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 1px;\n  -moz-border-radius: 1px;\n  border-radius: 1px;\n  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n}\n.btn-navbar .icon-bar + .icon-bar {\n  margin-top: 3px;\n}\n.navbar .nav > li > .dropdown-menu:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n  top: -7px;\n  left: 9px;\n}\n.navbar .nav > li > .dropdown-menu:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #ffffff;\n  position: absolute;\n  top: -6px;\n  left: 10px;\n}\n.navbar-fixed-bottom .nav > li > .dropdown-menu:before {\n  border-top: 7px solid #ccc;\n  border-top-color: rgba(0, 0, 0, 0.2);\n  border-bottom: 0;\n  bottom: -7px;\n  top: auto;\n}\n.navbar-fixed-bottom .nav > li > .dropdown-menu:after {\n  border-top: 6px solid #ffffff;\n  border-bottom: 0;\n  bottom: -6px;\n  top: auto;\n}\n.navbar .nav li.dropdown > a:hover .caret,\n.navbar .nav li.dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n.navbar .nav li.dropdown.open > .dropdown-toggle,\n.navbar .nav li.dropdown.active > .dropdown-toggle,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  background-color: #e5e5e5;\n  color: #555555;\n}\n.navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n.navbar .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n.navbar .pull-right > li > .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right {\n  left: auto;\n  right: 0;\n}\n.navbar .pull-right > li > .dropdown-menu:before,\n.navbar .nav > li > .dropdown-menu.pull-right:before {\n  left: auto;\n  right: 12px;\n}\n.navbar .pull-right > li > .dropdown-menu:after,\n.navbar .nav > li > .dropdown-menu.pull-right:after {\n  left: auto;\n  right: 13px;\n}\n.navbar .pull-right > li > .dropdown-menu .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {\n  left: auto;\n  right: 100%;\n  margin-left: 0;\n  margin-right: -1px;\n  -webkit-border-radius: 6px 0 6px 6px;\n  -moz-border-radius: 6px 0 6px 6px;\n  border-radius: 6px 0 6px 6px;\n}\n.navbar-inverse .navbar-inner {\n  background-color: #1b1b1b;\n  background-image: -moz-linear-gradient(top, #222222, #111111);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));\n  background-image: -webkit-linear-gradient(top, #222222, #111111);\n  background-image: -o-linear-gradient(top, #222222, #111111);\n  background-image: linear-gradient(to bottom, #222222, #111111);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);\n  border-color: #252525;\n}\n.navbar-inverse .brand,\n.navbar-inverse .nav > li > a {\n  color: #999999;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .brand:hover,\n.navbar-inverse .nav > li > a:hover,\n.navbar-inverse .brand:focus,\n.navbar-inverse .nav > li > a:focus {\n  color: #ffffff;\n}\n.navbar-inverse .brand {\n  color: #999999;\n}\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n.navbar-inverse .nav > li > a:focus,\n.navbar-inverse .nav > li > a:hover {\n  background-color: transparent;\n  color: #ffffff;\n}\n.navbar-inverse .nav .active > a,\n.navbar-inverse .nav .active > a:hover,\n.navbar-inverse .nav .active > a:focus {\n  color: #ffffff;\n  background-color: #111111;\n}\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n.navbar-inverse .navbar-link:hover,\n.navbar-inverse .navbar-link:focus {\n  color: #ffffff;\n}\n.navbar-inverse .divider-vertical {\n  border-left-color: #111111;\n  border-right-color: #222222;\n}\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {\n  background-color: #111111;\n  color: #ffffff;\n}\n.navbar-inverse .nav li.dropdown > a:hover .caret,\n.navbar-inverse .nav li.dropdown > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.navbar-inverse .navbar-search .search-query {\n  color: #ffffff;\n  background-color: #515151;\n  border-color: #111111;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  -webkit-transition: none;\n  -moz-transition: none;\n  -o-transition: none;\n  transition: none;\n}\n.navbar-inverse .navbar-search .search-query:-moz-placeholder {\n  color: #cccccc;\n}\n.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {\n  color: #cccccc;\n}\n.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {\n  color: #cccccc;\n}\n.navbar-inverse .navbar-search .search-query:focus,\n.navbar-inverse .navbar-search .search-query.focused {\n  padding: 5px 15px;\n  color: #333333;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #ffffff;\n  border: 0;\n  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  outline: 0;\n}\n.navbar-inverse .btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #0e0e0e;\n  background-image: -moz-linear-gradient(top, #151515, #040404);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));\n  background-image: -webkit-linear-gradient(top, #151515, #040404);\n  background-image: -o-linear-gradient(top, #151515, #040404);\n  background-image: linear-gradient(to bottom, #151515, #040404);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);\n  border-color: #040404 #040404 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #040404;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .btn-navbar:hover,\n.navbar-inverse .btn-navbar:focus,\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active,\n.navbar-inverse .btn-navbar.disabled,\n.navbar-inverse .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #040404;\n  *background-color: #000000;\n}\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active {\n  background-color: #000000 \\9;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin: 0 0 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  text-shadow: 0 1px 0 #ffffff;\n}\n.breadcrumb > li > .divider {\n  padding: 0 5px;\n  color: #ccc;\n}\n.breadcrumb > .active {\n  color: #999999;\n}\n.pagination {\n  margin: 20px 0;\n}\n.pagination ul {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  margin-left: 0;\n  margin-bottom: 0;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.pagination ul > li {\n  display: inline;\n}\n.pagination ul > li > a,\n.pagination ul > li > span {\n  float: left;\n  padding: 4px 12px;\n  line-height: 20px;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-left-width: 0;\n}\n.pagination ul > li > a:hover,\n.pagination ul > li > a:focus,\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  background-color: #f5f5f5;\n}\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  color: #999999;\n  cursor: default;\n}\n.pagination ul > .disabled > span,\n.pagination ul > .disabled > a,\n.pagination ul > .disabled > a:hover,\n.pagination ul > .disabled > a:focus {\n  color: #999999;\n  background-color: transparent;\n  cursor: default;\n}\n.pagination ul > li:first-child > a,\n.pagination ul > li:first-child > span {\n  border-left-width: 1px;\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination ul > li:last-child > a,\n.pagination ul > li:last-child > span {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n  -webkit-border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination-centered {\n  text-align: center;\n}\n.pagination-right {\n  text-align: right;\n}\n.pagination-large ul > li > a,\n.pagination-large ul > li > span {\n  padding: 11px 19px;\n  font-size: 17.5px;\n}\n.pagination-large ul > li:first-child > a,\n.pagination-large ul > li:first-child > span {\n  -webkit-border-top-left-radius: 6px;\n  -moz-border-radius-topleft: 6px;\n  border-top-left-radius: 6px;\n  -webkit-border-bottom-left-radius: 6px;\n  -moz-border-radius-bottomleft: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-large ul > li:last-child > a,\n.pagination-large ul > li:last-child > span {\n  -webkit-border-top-right-radius: 6px;\n  -moz-border-radius-topright: 6px;\n  border-top-right-radius: 6px;\n  -webkit-border-bottom-right-radius: 6px;\n  -moz-border-radius-bottomright: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-mini ul > li:first-child > a,\n.pagination-small ul > li:first-child > a,\n.pagination-mini ul > li:first-child > span,\n.pagination-small ul > li:first-child > span {\n  -webkit-border-top-left-radius: 3px;\n  -moz-border-radius-topleft: 3px;\n  border-top-left-radius: 3px;\n  -webkit-border-bottom-left-radius: 3px;\n  -moz-border-radius-bottomleft: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-mini ul > li:last-child > a,\n.pagination-small ul > li:last-child > a,\n.pagination-mini ul > li:last-child > span,\n.pagination-small ul > li:last-child > span {\n  -webkit-border-top-right-radius: 3px;\n  -moz-border-radius-topright: 3px;\n  border-top-right-radius: 3px;\n  -webkit-border-bottom-right-radius: 3px;\n  -moz-border-radius-bottomright: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pagination-small ul > li > a,\n.pagination-small ul > li > span {\n  padding: 2px 10px;\n  font-size: 11.9px;\n}\n.pagination-mini ul > li > a,\n.pagination-mini ul > li > span {\n  padding: 0 6px;\n  font-size: 10.5px;\n}\n.pager {\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n  *zoom: 1;\n}\n.pager:before,\n.pager:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.pager:after {\n  clear: both;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  background-color: #fff;\n  cursor: default;\n}\n.thumbnails {\n  margin-left: -20px;\n  list-style: none;\n  *zoom: 1;\n}\n.thumbnails:before,\n.thumbnails:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.thumbnails:after {\n  clear: both;\n}\n.row-fluid .thumbnails {\n  margin-left: 0;\n}\n.thumbnails > li {\n  float: left;\n  margin-bottom: 20px;\n  margin-left: 20px;\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  line-height: 20px;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  -webkit-transition: all 0.2s ease-in-out;\n  -moz-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: #0088cc;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n}\n.thumbnail > img {\n  display: block;\n  max-width: 100%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #555555;\n}\n.alert {\n  padding: 8px 35px 8px 14px;\n  margin-bottom: 20px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  background-color: #fcf8e3;\n  border: 1px solid #fbeed5;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.alert,\n.alert h4 {\n  color: #c09853;\n}\n.alert h4 {\n  margin: 0;\n}\n.alert .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  line-height: 20px;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #468847;\n}\n.alert-success h4 {\n  color: #468847;\n}\n.alert-danger,\n.alert-error {\n  background-color: #f2dede;\n  border-color: #eed3d7;\n  color: #b94a48;\n}\n.alert-danger h4,\n.alert-error h4 {\n  color: #b94a48;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #3a87ad;\n}\n.alert-info h4 {\n  color: #3a87ad;\n}\n.alert-block {\n  padding-top: 14px;\n  padding-bottom: 14px;\n}\n.alert-block > p,\n.alert-block > ul {\n  margin-bottom: 0;\n}\n.alert-block p + p {\n  margin-top: 5px;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-ms-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f7f7f7;\n  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));\n  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.progress .bar {\n  width: 0%;\n  height: 100%;\n  color: #ffffff;\n  float: left;\n  font-size: 12px;\n  text-align: center;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #0e90d2;\n  background-image: -moz-linear-gradient(top, #149bdf, #0480be);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));\n  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);\n  background-image: -o-linear-gradient(top, #149bdf, #0480be);\n  background-image: linear-gradient(to bottom, #149bdf, #0480be);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  -webkit-transition: width 0.6s ease;\n  -moz-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress .bar + .bar {\n  -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n  -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n  box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n}\n.progress-striped .bar {\n  background-color: #149bdf;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n  -moz-background-size: 40px 40px;\n  -o-background-size: 40px 40px;\n  background-size: 40px 40px;\n}\n.progress.active .bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -moz-animation: progress-bar-stripes 2s linear infinite;\n  -ms-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-danger .bar,\n.progress .bar-danger {\n  background-color: #dd514c;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);\n}\n.progress-danger.progress-striped .bar,\n.progress-striped .bar-danger {\n  background-color: #ee5f5b;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-success .bar,\n.progress .bar-success {\n  background-color: #5eb95e;\n  background-image: -moz-linear-gradient(top, #62c462, #57a957);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));\n  background-image: -webkit-linear-gradient(top, #62c462, #57a957);\n  background-image: -o-linear-gradient(top, #62c462, #57a957);\n  background-image: linear-gradient(to bottom, #62c462, #57a957);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);\n}\n.progress-success.progress-striped .bar,\n.progress-striped .bar-success {\n  background-color: #62c462;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-info .bar,\n.progress .bar-info {\n  background-color: #4bb1cf;\n  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);\n}\n.progress-info.progress-striped .bar,\n.progress-striped .bar-info {\n  background-color: #5bc0de;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-warning .bar,\n.progress .bar-warning {\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n}\n.progress-warning.progress-striped .bar,\n.progress-striped .bar-warning {\n  background-color: #fbb450;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.hero-unit {\n  padding: 60px;\n  margin-bottom: 30px;\n  font-size: 18px;\n  font-weight: 200;\n  line-height: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.hero-unit h1 {\n  margin-bottom: 0;\n  font-size: 60px;\n  line-height: 1;\n  color: inherit;\n  letter-spacing: -1px;\n}\n.hero-unit li {\n  line-height: 30px;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  *overflow: visible;\n  zoom: 1;\n}\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-object {\n  display: block;\n}\n.media-heading {\n  margin: 0 0 5px;\n}\n.media > .pull-left {\n  margin-right: 10px;\n}\n.media > .pull-right {\n  margin-left: 10px;\n}\n.media-list {\n  margin-left: 0;\n  list-style: none;\n}\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  visibility: visible;\n  font-size: 11px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  background-color: #ffffff;\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  -webkit-border-radius: 5px 5px 0 0;\n  -moz-border-radius: 5px 5px 0 0;\n  border-radius: 5px 5px 0 0;\n}\n.popover-title:empty {\n  display: none;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover .arrow {\n  border-width: 11px;\n}\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #ffffff;\n}\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right .arrow:after {\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #ffffff;\n}\n.popover.bottom .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #ffffff;\n}\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left .arrow:after {\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #ffffff;\n  bottom: -10px;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n}\n.modal-backdrop,\n.modal-backdrop.fade.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n.modal {\n  position: fixed;\n  top: 10%;\n  left: 50%;\n  z-index: 1050;\n  width: 560px;\n  margin-left: -280px;\n  background-color: #ffffff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.3);\n  *border: 1px solid #999;\n  /* IE6-7 */\n\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding-box;\n  background-clip: padding-box;\n  outline: none;\n}\n.modal.fade {\n  -webkit-transition: opacity .3s linear, top .3s ease-out;\n  -moz-transition: opacity .3s linear, top .3s ease-out;\n  -o-transition: opacity .3s linear, top .3s ease-out;\n  transition: opacity .3s linear, top .3s ease-out;\n  top: -25%;\n}\n.modal.fade.in {\n  top: 10%;\n}\n.modal-header {\n  padding: 9px 15px;\n  border-bottom: 1px solid #eee;\n}\n.modal-header .close {\n  margin-top: 2px;\n}\n.modal-header h3 {\n  margin: 0;\n  line-height: 30px;\n}\n.modal-body {\n  position: relative;\n  overflow-y: auto;\n  max-height: 400px;\n  padding: 15px;\n}\n.modal-form {\n  margin-bottom: 0;\n}\n.modal-footer {\n  padding: 14px 15px 15px;\n  margin-bottom: 0;\n  text-align: right;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  -webkit-border-radius: 0 0 6px 6px;\n  -moz-border-radius: 0 0 6px 6px;\n  border-radius: 0 0 6px 6px;\n  -webkit-box-shadow: inset 0 1px 0 #ffffff;\n  -moz-box-shadow: inset 0 1px 0 #ffffff;\n  box-shadow: inset 0 1px 0 #ffffff;\n  *zoom: 1;\n}\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.modal-footer:after {\n  clear: both;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle {\n  *margin-bottom: -3px;\n}\n.dropdown-toggle:active,\n.open .dropdown-toggle {\n  outline: 0;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  vertical-align: top;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n.dropdown .caret {\n  margin-top: 8px;\n  margin-left: 2px;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  *border-right-width: 2px;\n  *border-bottom-width: 2px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 20px;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus,\n.dropdown-submenu:hover > a,\n.dropdown-submenu:focus > a {\n  text-decoration: none;\n  color: #ffffff;\n  background-color: #0081c2;\n  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -o-linear-gradient(top, #0088cc, #0077b3);\n  background-image: linear-gradient(to bottom, #0088cc, #0077b3);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #0081c2;\n  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -o-linear-gradient(top, #0088cc, #0077b3);\n  background-image: linear-gradient(to bottom, #0088cc, #0077b3);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: default;\n}\n.open {\n  *z-index: 1000;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n.dropdown-submenu {\n  position: relative;\n}\n.dropdown-submenu > .dropdown-menu {\n  top: 0;\n  left: 100%;\n  margin-top: -6px;\n  margin-left: -1px;\n  -webkit-border-radius: 0 6px 6px 6px;\n  -moz-border-radius: 0 6px 6px 6px;\n  border-radius: 0 6px 6px 6px;\n}\n.dropdown-submenu:hover > .dropdown-menu {\n  display: block;\n}\n.dropup .dropdown-submenu > .dropdown-menu {\n  top: auto;\n  bottom: 0;\n  margin-top: 0;\n  margin-bottom: -2px;\n  -webkit-border-radius: 5px 5px 5px 0;\n  -moz-border-radius: 5px 5px 5px 0;\n  border-radius: 5px 5px 5px 0;\n}\n.dropdown-submenu > a:after {\n  display: block;\n  content: \" \";\n  float: right;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #cccccc;\n  margin-top: 5px;\n  margin-right: -10px;\n}\n.dropdown-submenu:hover > a:after {\n  border-left-color: #ffffff;\n}\n.dropdown-submenu.pull-left {\n  float: none;\n}\n.dropdown-submenu.pull-left > .dropdown-menu {\n  left: -100%;\n  margin-left: 10px;\n  -webkit-border-radius: 6px 0 6px 6px;\n  -moz-border-radius: 6px 0 6px 6px;\n  border-radius: 6px 0 6px 6px;\n}\n.dropdown .dropdown-menu .nav-header {\n  padding-left: 20px;\n  padding-right: 20px;\n}\n.typeahead {\n  z-index: 1051;\n  margin-top: 2px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.accordion {\n  margin-bottom: 20px;\n}\n.accordion-group {\n  margin-bottom: 2px;\n  border: 1px solid #e5e5e5;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.accordion-heading {\n  border-bottom: 0;\n}\n.accordion-heading .accordion-toggle {\n  display: block;\n  padding: 8px 15px;\n}\n.accordion-toggle {\n  cursor: pointer;\n}\n.accordion-inner {\n  padding: 9px 15px;\n  border-top: 1px solid #e5e5e5;\n}\n.carousel {\n  position: relative;\n  margin-bottom: 20px;\n  line-height: 1;\n}\n.carousel-inner {\n  overflow: hidden;\n  width: 100%;\n  position: relative;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -moz-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  line-height: 1;\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 40%;\n  left: 15px;\n  width: 40px;\n  height: 40px;\n  margin-top: -20px;\n  font-size: 60px;\n  font-weight: 100;\n  line-height: 30px;\n  color: #ffffff;\n  text-align: center;\n  background: #222222;\n  border: 3px solid #ffffff;\n  -webkit-border-radius: 23px;\n  -moz-border-radius: 23px;\n  border-radius: 23px;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.carousel-control.right {\n  left: auto;\n  right: 15px;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-indicators {\n  position: absolute;\n  top: 15px;\n  right: 15px;\n  z-index: 5;\n  margin: 0;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: block;\n  float: left;\n  width: 10px;\n  height: 10px;\n  margin-left: 5px;\n  text-indent: -999px;\n  background-color: #ccc;\n  background-color: rgba(255, 255, 255, 0.25);\n  border-radius: 5px;\n}\n.carousel-indicators .active {\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  padding: 15px;\n  background: #333333;\n  background: rgba(0, 0, 0, 0.75);\n}\n.carousel-caption h4,\n.carousel-caption p {\n  color: #ffffff;\n  line-height: 20px;\n}\n.carousel-caption h4 {\n  margin: 0 0 5px;\n}\n.carousel-caption p {\n  margin-bottom: 0;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-large {\n  padding: 24px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.well-small {\n  padding: 9px;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  filter: alpha(opacity=40);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.hide {\n  display: none;\n}\n.show {\n  display: block;\n}\n.invisible {\n  visibility: hidden;\n}\n.affix {\n  position: fixed;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -moz-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  -moz-transition: height 0.35s ease;\n  -o-transition: height 0.35s ease;\n  transition: height 0.35s ease;\n}\n.collapse.in {\n  height: auto;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n.visible-phone {\n  display: none !important;\n}\n.visible-tablet {\n  display: none !important;\n}\n.hidden-desktop {\n  display: none !important;\n}\n.visible-desktop {\n  display: inherit !important;\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important ;\n  }\n  .visible-tablet {\n    display: inherit !important;\n  }\n  .hidden-tablet {\n    display: none !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important;\n  }\n  .visible-phone {\n    display: inherit !important;\n  }\n  .hidden-phone {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: inherit !important;\n  }\n  .hidden-print {\n    display: none !important;\n  }\n}\n@media (max-width: 767px) {\n  body {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom,\n  .navbar-static-top {\n    margin-left: -20px;\n    margin-right: -20px;\n  }\n  .container-fluid {\n    padding: 0;\n  }\n  .dl-horizontal dt {\n    float: none;\n    clear: none;\n    width: auto;\n    text-align: left;\n  }\n  .dl-horizontal dd {\n    margin-left: 0;\n  }\n  .container {\n    width: auto;\n  }\n  .row-fluid {\n    width: 100%;\n  }\n  .row,\n  .thumbnails {\n    margin-left: 0;\n  }\n  .thumbnails > li {\n    float: none;\n    margin-left: 0;\n  }\n  [class*=\"span\"],\n  .uneditable-input[class*=\"span\"],\n  .row-fluid [class*=\"span\"] {\n    float: none;\n    display: block;\n    width: 100%;\n    margin-left: 0;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .span12,\n  .row-fluid .span12 {\n    width: 100%;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .row-fluid [class*=\"offset\"]:first-child {\n    margin-left: 0;\n  }\n  .input-large,\n  .input-xlarge,\n  .input-xxlarge,\n  input[class*=\"span\"],\n  select[class*=\"span\"],\n  textarea[class*=\"span\"],\n  .uneditable-input {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .input-prepend input,\n  .input-append input,\n  .input-prepend input[class*=\"span\"],\n  .input-append input[class*=\"span\"] {\n    display: inline-block;\n    width: auto;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 0;\n  }\n  .modal {\n    position: fixed;\n    top: 20px;\n    left: 20px;\n    right: 20px;\n    width: auto;\n    margin: 0;\n  }\n  .modal.fade {\n    top: -100px;\n  }\n  .modal.fade.in {\n    top: 20px;\n  }\n}\n@media (max-width: 480px) {\n  .nav-collapse {\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n  .page-header h1 small {\n    display: block;\n    line-height: 20px;\n  }\n  input[type=\"checkbox\"],\n  input[type=\"radio\"] {\n    border: 1px solid #ccc;\n  }\n  .form-horizontal .control-label {\n    float: none;\n    width: auto;\n    padding-top: 0;\n    text-align: left;\n  }\n  .form-horizontal .controls {\n    margin-left: 0;\n  }\n  .form-horizontal .control-list {\n    padding-top: 0;\n  }\n  .form-horizontal .form-actions {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n  .media .pull-left,\n  .media .pull-right {\n    float: none;\n    display: block;\n    margin-bottom: 10px;\n  }\n  .media-object {\n    margin-right: 0;\n    margin-left: 0;\n  }\n  .modal {\n    top: 10px;\n    left: 10px;\n    right: 10px;\n  }\n  .modal-header .close {\n    padding: 10px;\n    margin: -10px;\n  }\n  .carousel-caption {\n    position: static;\n  }\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  .row {\n    margin-left: -20px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 20px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 724px;\n  }\n  .span12 {\n    width: 724px;\n  }\n  .span11 {\n    width: 662px;\n  }\n  .span10 {\n    width: 600px;\n  }\n  .span9 {\n    width: 538px;\n  }\n  .span8 {\n    width: 476px;\n  }\n  .span7 {\n    width: 414px;\n  }\n  .span6 {\n    width: 352px;\n  }\n  .span5 {\n    width: 290px;\n  }\n  .span4 {\n    width: 228px;\n  }\n  .span3 {\n    width: 166px;\n  }\n  .span2 {\n    width: 104px;\n  }\n  .span1 {\n    width: 42px;\n  }\n  .offset12 {\n    margin-left: 764px;\n  }\n  .offset11 {\n    margin-left: 702px;\n  }\n  .offset10 {\n    margin-left: 640px;\n  }\n  .offset9 {\n    margin-left: 578px;\n  }\n  .offset8 {\n    margin-left: 516px;\n  }\n  .offset7 {\n    margin-left: 454px;\n  }\n  .offset6 {\n    margin-left: 392px;\n  }\n  .offset5 {\n    margin-left: 330px;\n  }\n  .offset4 {\n    margin-left: 268px;\n  }\n  .offset3 {\n    margin-left: 206px;\n  }\n  .offset2 {\n    margin-left: 144px;\n  }\n  .offset1 {\n    margin-left: 82px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    float: left;\n    margin-left: 2.7624309392265194%;\n    *margin-left: 2.709239449864817%;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.7624309392265194%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.43646408839778%;\n    *width: 91.38327259903608%;\n  }\n  .row-fluid .span10 {\n    width: 82.87292817679558%;\n    *width: 82.81973668743387%;\n  }\n  .row-fluid .span9 {\n    width: 74.30939226519337%;\n    *width: 74.25620077583166%;\n  }\n  .row-fluid .span8 {\n    width: 65.74585635359117%;\n    *width: 65.69266486422946%;\n  }\n  .row-fluid .span7 {\n    width: 57.18232044198895%;\n    *width: 57.12912895262725%;\n  }\n  .row-fluid .span6 {\n    width: 48.61878453038674%;\n    *width: 48.56559304102504%;\n  }\n  .row-fluid .span5 {\n    width: 40.05524861878453%;\n    *width: 40.00205712942283%;\n  }\n  .row-fluid .span4 {\n    width: 31.491712707182323%;\n    *width: 31.43852121782062%;\n  }\n  .row-fluid .span3 {\n    width: 22.92817679558011%;\n    *width: 22.87498530621841%;\n  }\n  .row-fluid .span2 {\n    width: 14.3646408839779%;\n    *width: 14.311449394616199%;\n  }\n  .row-fluid .span1 {\n    width: 5.801104972375691%;\n    *width: 5.747913483013988%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.52486187845304%;\n    *margin-left: 105.41847889972962%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.76243093922652%;\n    *margin-left: 102.6560479605031%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.96132596685082%;\n    *margin-left: 96.8549429881274%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.1988950276243%;\n    *margin-left: 94.09251204890089%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.39779005524862%;\n    *margin-left: 88.2914070765252%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.6353591160221%;\n    *margin-left: 85.52897613729868%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.8342541436464%;\n    *margin-left: 79.72787116492299%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 77.07182320441989%;\n    *margin-left: 76.96544022569647%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 71.2707182320442%;\n    *margin-left: 71.16433525332079%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.50828729281768%;\n    *margin-left: 68.40190431409427%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.70718232044199%;\n    *margin-left: 62.600799341718584%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.94475138121547%;\n    *margin-left: 59.838368402492065%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 54.14364640883978%;\n    *margin-left: 54.037263430116376%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.38121546961326%;\n    *margin-left: 51.27483249088986%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.58011049723757%;\n    *margin-left: 45.47372751851417%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.81767955801105%;\n    *margin-left: 42.71129657928765%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 37.01657458563536%;\n    *margin-left: 36.91019160691196%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.25414364640884%;\n    *margin-left: 34.14776066768544%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.45303867403315%;\n    *margin-left: 28.346655695309746%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.69060773480663%;\n    *margin-left: 25.584224756083227%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.88950276243094%;\n    *margin-left: 19.783119783707537%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.12707182320442%;\n    *margin-left: 17.02068884448102%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.32596685082873%;\n    *margin-left: 11.219583872105325%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.56353591160221%;\n    *margin-left: 8.457152932878806%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 20px;\n  }\n  input.span12,\n  textarea.span12,\n  .uneditable-input.span12 {\n    width: 710px;\n  }\n  input.span11,\n  textarea.span11,\n  .uneditable-input.span11 {\n    width: 648px;\n  }\n  input.span10,\n  textarea.span10,\n  .uneditable-input.span10 {\n    width: 586px;\n  }\n  input.span9,\n  textarea.span9,\n  .uneditable-input.span9 {\n    width: 524px;\n  }\n  input.span8,\n  textarea.span8,\n  .uneditable-input.span8 {\n    width: 462px;\n  }\n  input.span7,\n  textarea.span7,\n  .uneditable-input.span7 {\n    width: 400px;\n  }\n  input.span6,\n  textarea.span6,\n  .uneditable-input.span6 {\n    width: 338px;\n  }\n  input.span5,\n  textarea.span5,\n  .uneditable-input.span5 {\n    width: 276px;\n  }\n  input.span4,\n  textarea.span4,\n  .uneditable-input.span4 {\n    width: 214px;\n  }\n  input.span3,\n  textarea.span3,\n  .uneditable-input.span3 {\n    width: 152px;\n  }\n  input.span2,\n  textarea.span2,\n  .uneditable-input.span2 {\n    width: 90px;\n  }\n  input.span1,\n  textarea.span1,\n  .uneditable-input.span1 {\n    width: 28px;\n  }\n}\n@media (min-width: 1200px) {\n  .row {\n    margin-left: -30px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 30px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 1170px;\n  }\n  .span12 {\n    width: 1170px;\n  }\n  .span11 {\n    width: 1070px;\n  }\n  .span10 {\n    width: 970px;\n  }\n  .span9 {\n    width: 870px;\n  }\n  .span8 {\n    width: 770px;\n  }\n  .span7 {\n    width: 670px;\n  }\n  .span6 {\n    width: 570px;\n  }\n  .span5 {\n    width: 470px;\n  }\n  .span4 {\n    width: 370px;\n  }\n  .span3 {\n    width: 270px;\n  }\n  .span2 {\n    width: 170px;\n  }\n  .span1 {\n    width: 70px;\n  }\n  .offset12 {\n    margin-left: 1230px;\n  }\n  .offset11 {\n    margin-left: 1130px;\n  }\n  .offset10 {\n    margin-left: 1030px;\n  }\n  .offset9 {\n    margin-left: 930px;\n  }\n  .offset8 {\n    margin-left: 830px;\n  }\n  .offset7 {\n    margin-left: 730px;\n  }\n  .offset6 {\n    margin-left: 630px;\n  }\n  .offset5 {\n    margin-left: 530px;\n  }\n  .offset4 {\n    margin-left: 430px;\n  }\n  .offset3 {\n    margin-left: 330px;\n  }\n  .offset2 {\n    margin-left: 230px;\n  }\n  .offset1 {\n    margin-left: 130px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    float: left;\n    margin-left: 2.564102564102564%;\n    *margin-left: 2.5109110747408616%;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.564102564102564%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.45299145299145%;\n    *width: 91.39979996362975%;\n  }\n  .row-fluid .span10 {\n    width: 82.90598290598291%;\n    *width: 82.8527914166212%;\n  }\n  .row-fluid .span9 {\n    width: 74.35897435897436%;\n    *width: 74.30578286961266%;\n  }\n  .row-fluid .span8 {\n    width: 65.81196581196582%;\n    *width: 65.75877432260411%;\n  }\n  .row-fluid .span7 {\n    width: 57.26495726495726%;\n    *width: 57.21176577559556%;\n  }\n  .row-fluid .span6 {\n    width: 48.717948717948715%;\n    *width: 48.664757228587014%;\n  }\n  .row-fluid .span5 {\n    width: 40.17094017094017%;\n    *width: 40.11774868157847%;\n  }\n  .row-fluid .span4 {\n    width: 31.623931623931625%;\n    *width: 31.570740134569924%;\n  }\n  .row-fluid .span3 {\n    width: 23.076923076923077%;\n    *width: 23.023731587561375%;\n  }\n  .row-fluid .span2 {\n    width: 14.52991452991453%;\n    *width: 14.476723040552828%;\n  }\n  .row-fluid .span1 {\n    width: 5.982905982905983%;\n    *width: 5.929714493544281%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.12820512820512%;\n    *margin-left: 105.02182214948171%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.56410256410257%;\n    *margin-left: 102.45771958537915%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.58119658119658%;\n    *margin-left: 96.47481360247316%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.01709401709402%;\n    *margin-left: 93.91071103837061%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.03418803418803%;\n    *margin-left: 87.92780505546462%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.47008547008548%;\n    *margin-left: 85.36370249136206%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.48717948717949%;\n    *margin-left: 79.38079650845607%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 76.92307692307693%;\n    *margin-left: 76.81669394435352%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 70.94017094017094%;\n    *margin-left: 70.83378796144753%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.37606837606839%;\n    *margin-left: 68.26968539734497%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.393162393162385%;\n    *margin-left: 62.28677941443899%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.82905982905982%;\n    *margin-left: 59.72267685033642%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 53.84615384615384%;\n    *margin-left: 53.739770867430444%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.28205128205128%;\n    *margin-left: 51.175668303327875%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.299145299145295%;\n    *margin-left: 45.1927623204219%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.73504273504273%;\n    *margin-left: 42.62865975631933%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 36.75213675213675%;\n    *margin-left: 36.645753773413354%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.18803418803419%;\n    *margin-left: 34.081651209310785%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.205128205128204%;\n    *margin-left: 28.0987452264048%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.641025641025642%;\n    *margin-left: 25.53464266230224%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.65811965811966%;\n    *margin-left: 19.551736679396257%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.094017094017094%;\n    *margin-left: 16.98763411529369%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.11111111111111%;\n    *margin-left: 11.004728132387708%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.547008547008547%;\n    *margin-left: 8.440625568285142%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 30px;\n  }\n  input.span12,\n  textarea.span12,\n  .uneditable-input.span12 {\n    width: 1156px;\n  }\n  input.span11,\n  textarea.span11,\n  .uneditable-input.span11 {\n    width: 1056px;\n  }\n  input.span10,\n  textarea.span10,\n  .uneditable-input.span10 {\n    width: 956px;\n  }\n  input.span9,\n  textarea.span9,\n  .uneditable-input.span9 {\n    width: 856px;\n  }\n  input.span8,\n  textarea.span8,\n  .uneditable-input.span8 {\n    width: 756px;\n  }\n  input.span7,\n  textarea.span7,\n  .uneditable-input.span7 {\n    width: 656px;\n  }\n  input.span6,\n  textarea.span6,\n  .uneditable-input.span6 {\n    width: 556px;\n  }\n  input.span5,\n  textarea.span5,\n  .uneditable-input.span5 {\n    width: 456px;\n  }\n  input.span4,\n  textarea.span4,\n  .uneditable-input.span4 {\n    width: 356px;\n  }\n  input.span3,\n  textarea.span3,\n  .uneditable-input.span3 {\n    width: 256px;\n  }\n  input.span2,\n  textarea.span2,\n  .uneditable-input.span2 {\n    width: 156px;\n  }\n  input.span1,\n  textarea.span1,\n  .uneditable-input.span1 {\n    width: 56px;\n  }\n  .thumbnails {\n    margin-left: -30px;\n  }\n  .thumbnails > li {\n    margin-left: 30px;\n  }\n  .row-fluid .thumbnails {\n    margin-left: 0;\n  }\n}\n@media (max-width: 979px) {\n  body {\n    padding-top: 0;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    position: static;\n  }\n  .navbar-fixed-top {\n    margin-bottom: 20px;\n  }\n  .navbar-fixed-bottom {\n    margin-top: 20px;\n  }\n  .navbar-fixed-top .navbar-inner,\n  .navbar-fixed-bottom .navbar-inner {\n    padding: 5px;\n  }\n  .navbar .container {\n    width: auto;\n    padding: 0;\n  }\n  .navbar .brand {\n    padding-left: 10px;\n    padding-right: 10px;\n    margin: 0 0 0 -5px;\n  }\n  .nav-collapse {\n    clear: both;\n  }\n  .nav-collapse .nav {\n    float: none;\n    margin: 0 0 10px;\n  }\n  .nav-collapse .nav > li {\n    float: none;\n  }\n  .nav-collapse .nav > li > a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > .divider-vertical {\n    display: none;\n  }\n  .nav-collapse .nav .nav-header {\n    color: #777777;\n    text-shadow: none;\n  }\n  .nav-collapse .nav > li > a,\n  .nav-collapse .dropdown-menu a {\n    padding: 9px 15px;\n    font-weight: bold;\n    color: #777777;\n    -webkit-border-radius: 3px;\n    -moz-border-radius: 3px;\n    border-radius: 3px;\n  }\n  .nav-collapse .btn {\n    padding: 4px 10px 4px;\n    font-weight: normal;\n    -webkit-border-radius: 4px;\n    -moz-border-radius: 4px;\n    border-radius: 4px;\n  }\n  .nav-collapse .dropdown-menu li + li a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > li > a:hover,\n  .nav-collapse .nav > li > a:focus,\n  .nav-collapse .dropdown-menu a:hover,\n  .nav-collapse .dropdown-menu a:focus {\n    background-color: #f2f2f2;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a,\n  .navbar-inverse .nav-collapse .dropdown-menu a {\n    color: #999999;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a:hover,\n  .navbar-inverse .nav-collapse .nav > li > a:focus,\n  .navbar-inverse .nav-collapse .dropdown-menu a:hover,\n  .navbar-inverse .nav-collapse .dropdown-menu a:focus {\n    background-color: #111111;\n  }\n  .nav-collapse.in .btn-group {\n    margin-top: 5px;\n    padding: 0;\n  }\n  .nav-collapse .dropdown-menu {\n    position: static;\n    top: auto;\n    left: auto;\n    float: none;\n    display: none;\n    max-width: none;\n    margin: 0 15px;\n    padding: 0;\n    background-color: transparent;\n    border: none;\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    border-radius: 0;\n    -webkit-box-shadow: none;\n    -moz-box-shadow: none;\n    box-shadow: none;\n  }\n  .nav-collapse .open > .dropdown-menu {\n    display: block;\n  }\n  .nav-collapse .dropdown-menu:before,\n  .nav-collapse .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .dropdown-menu .divider {\n    display: none;\n  }\n  .nav-collapse .nav > li > .dropdown-menu:before,\n  .nav-collapse .nav > li > .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .navbar-form,\n  .nav-collapse .navbar-search {\n    float: none;\n    padding: 10px 15px;\n    margin: 10px 0;\n    border-top: 1px solid #f2f2f2;\n    border-bottom: 1px solid #f2f2f2;\n    -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n    -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n    box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  }\n  .navbar-inverse .nav-collapse .navbar-form,\n  .navbar-inverse .nav-collapse .navbar-search {\n    border-top-color: #111111;\n    border-bottom-color: #111111;\n  }\n  .navbar .nav-collapse .nav.pull-right {\n    float: none;\n    margin-left: 0;\n  }\n  .nav-collapse,\n  .nav-collapse.collapse {\n    overflow: hidden;\n    height: 0;\n  }\n  .navbar .btn-navbar {\n    display: block;\n  }\n  .navbar-static .navbar-inner {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n}\n@media (min-width: 980px) {\n  .nav-collapse.collapse {\n    height: auto !important;\n    overflow: visible !important;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/CSV/cars.csv",
    "content": "Year,Make,Model,Length\n1997,Ford,E350,2.34\n2000,Mercury,Cougar,2.38\n"
  },
  {
    "path": "src/test/resources/samples/langs/CWeb/sat-life.w",
    "content": "\\datethis\n@*Intro. This program generates clauses for the transition relation\nfrom time $t$ to time $t+1$ in Conway's Game of Life, assuming that\nall of the potentially live cells at time $t$ belong to a pattern\nthat's specified in |stdin|. The pattern is defined by one or more\nlines representing rows of cells, where each line has `\\..' in a\ncell that's guaranteed to be dead at time~$t$, otherwise it has `\\.*'.\nThe time is specified separately as a command-line parameter.\n\nThe Boolean variable for cell $(x,y)$ at time $t$ is named by its\nso-called ``xty code,'' namely by the decimal value of~$x$, followed\nby a code letter for~$t$, followed by the decimal value of~$y$. For\nexample, if $x=10$ and $y=11$ and $t=0$, the variable that indicates\nliveness of the cell is \\.{10a11}; and the corresponding variable\nfor $t=1$ is \\.{10b11}.\n\nUp to 19 auxiliary variables are used together with each xty code,\nin order to construct clauses that define the successor state.\nThe names of these variables are obtained by appending one of\nthe following two-character combinations to the xty code:\n\\.{A2}, \\.{A3}, \\.{A4},\n\\.{B1}, \\.{B2}, \\.{B3}, \\.{B4},\n\\.{C1}, \\.{C2}, \\.{C3}, \\.{C4},\n\\.{D1}, \\.{D2},\n\\.{E1}, \\.{E2},\n\\.{F1}, \\.{F2},\n\\.{G1}, \\.{G2}.\nThese variables are derived from the Bailleux--Boufkhad method\nof encoding cardinality constraints:\nThe auxiliary variable \\.{A$k$} stands for the condition\n``at least $k$ of the eight neighbors are alive.'' Similarly,\n\\.{B$k$} stands for ``at least $k$ of the first four neighbors\nare alive,'' and \\.{C$k$} accounts for the other four neighbors.\nCodes \\.D, \\.E, \\.F, and~\\.G refer to pairs of neighbors.\nThus, for instance, \\.{10a11C2} means that at least two of the\nlast four neighbors of cell $(10,11)$ are alive.\n\nThose auxiliary variables receive values by means of up to 77 clauses per cell.\nFor example, if $u$ and~$v$ are the neighbors of cell~$z$ that correspond\nto a pairing of type~\\.D, there are six clauses\n$$\\bar u d_1,\\quad\n  \\bar v d_1,\\quad\n  \\bar u\\bar v d_2,\\quad\n  u v\\bar d_1,\\quad\n  u\\bar d_2,\\quad\n  v\\bar d_2.$$\nThe sixteen clauses\n$$\\displaylines{\\hfill\n\\bar d_1b_1,\\quad\n\\bar e_1b_1,\\quad\n\\bar d_2b_2,\\quad\n\\bar d_1\\bar e_1b_2,\\quad\n\\bar e_2b_2,\\quad\n\\bar d_2\\bar e_1b_3,\\quad\n\\bar d_1\\bar e_2b_3,\\quad\n\\bar d_2\\bar e_2b_4,\n\\hfill\\cr\\hfill\nd_1e_1\\bar b_1,\\quad\nd_1e_2\\bar b_2,\\quad\nd_2e_1\\bar b_2,\\quad\nd_1\\bar b_3,\\quad\nd_2e_2\\bar b_3,\\quad\ne_1\\bar b_3,\\quad\nd_2\\bar b_4,\\quad\ne_2\\bar b_4\n\\hfill}$$\ndefine $b$ variables from $d$'s and $e$'s; and another sixteen\ndefine $c$'s from $f$'s and $g$'s in the same fashion.\nA similar set of 21 clauses will define the $a$'s from the $b$'s and $c$'s.\n\nOnce the $a$'s are defined, thus essentially counting the\nlive neighbors of cell $z$, the next\nstate~$z'$ is defined by five further clauses\n$$\\bar a_4\\bar z',\\quad\na_2\\bar z',\\quad\na_3z\\bar z',\\quad\n\\bar a_3a_4z',\\quad\n\\bar a_2a_4\\bar zz'.$$\nFor example, the last of these states that $z'$ will be true\n(i.e., that cell $z$ will be alive at time $t+1$) if\n$z$ is alive at time~$t$ and has $\\ge2$ live neighbors\nbut not $\\ge4$.\n\nNearby cells can share auxiliary variables, according to a tricky scheme that\nis worked out below. In consequence, the actual number of auxiliary variables\nand clauses per cell is reduced from 19 and $77+5$ to 13 and $57+5$,\nrespectively, except at the boundaries.\n\n@ So here's the overall outline of the program.\n\n@d maxx 50 /* maximum number of lines in the pattern supplied by |stdin| */\n@d maxy 50 /* maximum number of columns per line in |stdin| */\n\n@c\n#include <stdio.h>\n#include <stdlib.h>\nchar p[maxx+2][maxy+2]; /* is cell $(x,y)$ potentially alive? */\nchar have_b[maxx+2][maxy+2]; /* did we already generate $b(x,y)$? */\nchar have_d[maxx+2][maxy+2]; /* did we already generate $d(x,y)$? */\nchar have_e[maxx+2][maxy+4]; /* did we already generate $e(x,y)$? */\nchar have_f[maxx+4][maxy+2]; /* did we already generate $f(x-2,y)$? */\nint tt; /* time as given on the command line */\nint xmax,ymax; /* the number of rows and columns in the input pattern */\nint xmin=maxx,ymin=maxy; /* limits in the other direction */\nchar timecode[]=\"abcdefghijklmnopqrstuvwxyz\"@|\n      \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"@|\n      \"!\\\"#$%&'()*+,-./:;<=>?@@[\\\\]^_`{|}~\"; /* codes for $0\\le t\\le83$ */\n@q$@>\nchar buf[maxy+2]; /* input buffer */\nunsigned int clause[4]; /* clauses are assembled here */\nint clauseptr; /* this many literals are in the current clause */\n@<Subroutines@>@;\nmain(int argc,char*argv[]) {\n  register int j,k,x,y;\n  @<Process the command line@>;\n  @<Input the pattern@>;\n  for (x=xmin-1;x<=xmax+1;x++) for (y=ymin-1;y<=ymax+1;y++) {\n    @<If cell $(x,y)$ is obviously dead at time $t+1$, |continue|@>;\n    a(x,y);\n    zprime(x,y);\n  }\n}\n\n@ @<Process the command line@>=\nif (argc!=2 || sscanf(argv[1],\"%d\",&tt)!=1) {\n  fprintf(stderr,\"Usage: %s t\\n\",argv[0]);\n  exit(-1);\n}\nif (tt<0 || tt>82) {\n  fprintf(stderr,\"The time should be between 0 and 82 (not %d)!\\n\",tt);\n  exit(-2);\n}\n\n@ @<Input the pattern@>=\nfor (x=1;;x++) {\n  if (!fgets(buf,maxy+2,stdin)) break;\n  if (x>maxx) {\n    fprintf(stderr,\"Sorry, the pattern should have at most %d rows!\\n\",maxx);\n    exit(-3);\n  }\n  for (y=1;buf[y-1]!='\\n';y++) {\n    if (y>maxy) {\n      fprintf(stderr,\"Sorry, the pattern should have at most %d columns!\\n\",\n             maxy);\n      exit(-4);\n    }\n    if (buf[y-1]=='*') {\n      p[x][y]=1;\n      if (y>ymax) ymax=y;\n      if (y<ymin) ymin=y;\n      if (x>xmax) xmax=x;\n      if (x<xmin) xmin=x;\n    }@+else if (buf[y-1]!='.') {\n      fprintf(stderr,\"Unexpected character `%c' found in the pattern!\\n\",\n              buf[y-1]);\n      exit(-5);\n    }\n  }\n}\n\n@ @d pp(xx,yy) ((xx)>=0 && (yy)>=0? p[xx][yy]: 0)\n\n@<If cell $(x,y)$ is obviously dead at time $t+1$, |continue|@>=\nif (pp(x-1,y-1)+pp(x-1,y)+pp(x-1,y+1)+\n    pp(x,y-1)+p[x][y]+p[x][y+1]+\n    pp(x+1,y-1)+p[x+1][y]+p[x+1][y+1]<3) continue;\n\n@ Clauses are assembled in the |clause| array (surprise), where we\nput encoded literals.\n\nThe code for a literal is an unsigned 32-bit quantity, where the leading\nbit is 1 if the literal should be complemented. The next three bits\nspecify the type of the literal (0 thru 7 for plain and \\.A--\\.G);\nthe next three bits specify an integer~$k$; and the next bit is zero.\nThat leaves room for two 12-bit fields, which specify $x$ and $y$.\n\nType 0 literals have $k=0$ for the ordinary xty code. However, the\nvalue $k=1$ indicates that the time code should be for $t+1$ instead of~$t$.\nAnd $k=2$ denotes a special ``tautology'' literal, which is always true.\nIf the tautology literal is complemented, we omit it from the clause;\notherwise we omit the entire clause.\nFinally, $k=7$ denotes an auxiliary literal, used to avoid\nclauses of length~4.\n\nHere's a subroutine that outputs the current clause and resets\nthe |clause| array.\n\n@d taut (2<<25)\n@d sign (1U<<31)\n\n@<Sub...@>=\nvoid outclause(void) {\n  register int c,k,x,y,p;\n  for (p=0;p<clauseptr;p++)\n    if (clause[p]==taut) goto done;\n  for (p=0;p<clauseptr;p++) if (clause[p]!=taut+sign) {\n    if (clause[p]>>31) printf(\" ~\");@+else printf(\" \");\n    c=(clause[p]>>28)&0x7;\n    k=(clause[p]>>25)&0x7;\n    x=(clause[p]>>12)&0xfff;\n    y=clause[p]&0xfff;\n    if (c) printf(\"%d%c%d%c%d\",\n             x,timecode[tt],y,c+'@@',k);\n    else if (k==7) printf(\"%d%c%dx\",\n             x,timecode[tt],y);\n    else printf(\"%d%c%d\",\n             x,timecode[tt+k],y);\n  }\n  printf(\"\\n\");\ndone: clauseptr=0;\n}\n\n@ And here's another, which puts a type-0 literal into |clause|.\n\n@<Sub...@>=\nvoid applit(int x,int y,int bar,int k) {\n  if (k==0 && (x<xmin || x>xmax || y<ymin || y>ymax || p[x][y]==0))\n    clause[clauseptr++]=(bar? 0: sign)+taut;\n  else clause[clauseptr++]=(bar? sign:0)+(k<<25)+(x<<12)+y;\n}\n\n@ The |d| and |e| subroutines are called for only one-fourth\nof all cell addresses $(x,y)$. Indeed, one can show that\n$x$ is always odd, and that $y\\bmod4<2$.\n\nTherefore we remember if we've seen $(x,y)$ before.\n\nSlight trick: If |yy| is not in range, we avoid generating the\nclause $\\bar d_k$ twice.\n\n@d newlit(x,y,c,k) clause[clauseptr++]=((c)<<28)+((k)<<25)+((x)<<12)+(y)\n@d newcomplit(x,y,c,k) \n   clause[clauseptr++]=sign+((c)<<28)+((k)<<25)+((x)<<12)+(y)\n\n@<Sub...@>=\nvoid d(int x,int y) {\n  register x1=x-1,x2=x,yy=y+1;\n  if (have_d[x][y]!=tt+1) {\n    applit(x1,yy,1,0),newlit(x,y,4,1),outclause();\n    applit(x2,yy,1,0),newlit(x,y,4,1),outclause();\n    applit(x1,yy,1,0),applit(x2,yy,1,0),newlit(x,y,4,2),outclause();\n    applit(x1,yy,0,0),applit(x2,yy,0,0),newcomplit(x,y,4,1),outclause();\n    applit(x1,yy,0,0),newcomplit(x,y,4,2),outclause();\n    if (yy>=ymin && yy<=ymax)\n      applit(x2,yy,0,0),newcomplit(x,y,4,2),outclause();\n    have_d[x][y]=tt+1;\n  }\n}\n@#\nvoid e(int x,int y) {\n  register x1=x-1,x2=x,yy=y-1;\n  if (have_e[x][y]!=tt+1) {\n    applit(x1,yy,1,0),newlit(x,y,5,1),outclause();\n    applit(x2,yy,1,0),newlit(x,y,5,1),outclause();\n    applit(x1,yy,1,0),applit(x2,yy,1,0),newlit(x,y,5,2),outclause();\n    applit(x1,yy,0,0),applit(x2,yy,0,0),newcomplit(x,y,5,1),outclause();\n    applit(x1,yy,0,0),newcomplit(x,y,5,2),outclause();\n    if (yy>=ymin && yy<=ymax)\n      applit(x2,yy,0,0),newcomplit(x,y,5,2),outclause();\n    have_e[x][y]=tt+1;\n  }\n}\n    \n@ The |f| subroutine can't be shared quite so often. But we\ndo save a factor of~2, because $x+y$ is always even.\n\n@<Sub...@>=\nvoid f(int x,int y) {\n  register xx=x-1,y1=y,y2=y+1;\n  if (have_f[x][y]!=tt+1) {\n    applit(xx,y1,1,0),newlit(x,y,6,1),outclause();\n    applit(xx,y2,1,0),newlit(x,y,6,1),outclause();\n    applit(xx,y1,1,0),applit(xx,y2,1,0),newlit(x,y,6,2),outclause();\n    applit(xx,y1,0,0),applit(xx,y2,0,0),newcomplit(x,y,6,1),outclause();\n    applit(xx,y1,0,0),newcomplit(x,y,6,2),outclause();\n    if (xx>=xmin && xx<=xmax)\n      applit(xx,y2,0,0),newcomplit(x,y,6,2),outclause();\n    have_f[x][y]=tt+1;\n  }\n}\n\n@ The |g| subroutine cleans up the dregs, by somewhat tediously\nlocating the two neighbors that weren't handled by |d|, |e|, or~|f|.\nNo sharing is possible here.\n\n@<Sub...@>=\nvoid g(int x,int y) {\n  register x1,x2,y1,y2;\n  if (x&1) x1=x-1,y1=y,x2=x+1,y2=y^1;\n  else x1=x+1,y1=y,x2=x-1,y2=y-1+((y&1)<<1);\n  applit(x1,y1,1,0),newlit(x,y,7,1),outclause();\n  applit(x2,y2,1,0),newlit(x,y,7,1),outclause();\n  applit(x1,y1,1,0),applit(x2,y2,1,0),newlit(x,y,7,2),outclause();\n  applit(x1,y1,0,0),applit(x2,y2,0,0),newcomplit(x,y,7,1),outclause();\n  applit(x1,y1,0,0),newcomplit(x,y,7,2),outclause();\n  applit(x2,y2,0,0),newcomplit(x,y,7,2),outclause();\n}\n\n@ Fortunately the |b| subroutine {\\it can\\/} be shared (since |x| is always\nodd), thus saving half of the sixteen clauses generated.\n\n@<Sub...@>=\nvoid b(int x,int y) {\n  register j,k,xx=x,y1=y-(y&2),y2=y+(y&2);\n  if (have_b[x][y]!=tt+1) {\n    d(xx,y1);\n    e(xx,y2);\n    for (j=0;j<3;j++) for (k=0;k<3;k++) if (j+k) {\n      if (j) newcomplit(xx,y1,4,j); /* $\\bar d_j$ */\n      if (k) newcomplit(xx,y2,5,k); /* $\\bar e_k$ */\n      newlit(x,y,2,j+k); /* $b_{j+k}$ */\n      outclause();\n      if (j) newlit(xx,y1,4,3-j); /* $d_{3-j}$ */\n      if (k) newlit(xx,y2,5,3-k); /* $e_{3-k}$ */\n      newcomplit(x,y,2,5-j-k); /* $\\bar b_{5-j-k}$ */\n      outclause();      \n    }\n    have_b[x][y]=tt+1;\n  }\n}\n\n@ The (unshared) |c| subroutine handles the other four neighbors,\nby working with |f| and |g| instead of |d| and~|e|.\n\nIf |y=0|, the overlap rules set |y1=-1|, which can be problematic.\nI've decided to avoid this case by omitting |f| when it is\nguaranteed to be zero.\n\n@<Sub...@>=\nvoid c(int x,int y) {\n  register j,k,x1,y1;\n  if (x&1) x1=x+2,y1=(y-1)|1;\n  else x1=x,y1=y&-2;\n  g(x,y);\n  if (x1-1<xmin || x1-1>xmax || y1+1<ymin || y1>ymax)\n    @<Set |c| equal to |g|@>@;\n  else {\n    f(x1,y1);\n    for (j=0;j<3;j++) for (k=0;k<3;k++) if (j+k) {\n      if (j) newcomplit(x1,y1,6,j); /* $\\bar f_j$ */\n      if (k) newcomplit(x,y,7,k); /* $\\bar g_k$ */\n      newlit(x,y,3,j+k); /* $c_{j+k}$ */\n      outclause();\n      if (j) newlit(x1,y1,6,3-j); /* $f_{3-j}$ */\n      if (k) newlit(x,y,7,3-k); /* $g_{3-k}$ */\n      newcomplit(x,y,3,5-j-k); /* $\\bar c_{5-j-k}$ */\n      outclause();\n    }\n  }\n}\n\n@ @<Set |c| equal to |g|@>=\n{\n  for (k=1;k<3;k++) {\n    newcomplit(x,y,7,k),newlit(x,y,3,k),outclause(); /* $\\bar g_k\\lor c_k$ */\n    newlit(x,y,7,k),newcomplit(x,y,3,k),outclause(); /* $g_k\\lor\\bar c_k$ */\n  }\n  newcomplit(x,y,3,3),outclause(); /* $\\bar c_3$ */\n  newcomplit(x,y,3,4),outclause(); /* $\\bar c_4$ */\n}\n\n@ Totals over all eight neighbors are then deduced by the |a|\nsubroutine.\n\n@<Sub...@>=\nvoid a(int x,int y) {\n  register j,k,xx=x|1;\n  b(xx,y);\n  c(x,y);\n  for (j=0;j<5;j++) for (k=0;k<5;k++) if (j+k>1 && j+k<5) {\n    if (j) newcomplit(xx,y,2,j); /* $\\bar b_j$ */\n    if (k) newcomplit(x,y,3,k); /* $\\bar c_k$ */\n    newlit(x,y,1,j+k); /* $a_{j+k}$ */\n    outclause();\n  }\n  for (j=0;j<5;j++) for (k=0;k<5;k++) if (j+k>2 && j+k<6 && j*k) {\n    if (j) newlit(xx,y,2,j); /* $b_j$ */\n    if (k) newlit(x,y,3,k); /* $c_k$ */\n    newcomplit(x,y,1,j+k-1); /* $\\bar a_{j+k-1}$ */\n    outclause();\n  }\n}\n\n@ Finally, as mentioned at the beginning, $z'$ is determined\nfrom $z$, $a_2$, $a_3$, and $a_4$.\n\nI actually generate six clauses, not five, in order to stick to\n{\\mc 3SAT}.\n\n@<Sub...@>=\nvoid zprime(int x,int y) {\n  newcomplit(x,y,1,4),applit(x,y,1,1),outclause(); /* $\\bar a_4\\bar z'$ */\n  newlit(x,y,1,2),applit(x,y,1,1),outclause(); /* $a_2\\bar z'$ */\n  newlit(x,y,1,3),applit(x,y,0,0),applit(x,y,1,1),outclause();\n               /* $a_3z\\bar z'$ */\n  newcomplit(x,y,1,3),newlit(x,y,1,4),applit(x,y,0,1),outclause();\n               /* $\\bar a_3a_4z'$ */\n  applit(x,y,0,7),newcomplit(x,y,1,2),newlit(x,y,1,4),outclause();\n               /* $x\\bar a_2a_4$ */\n  applit(x,y,1,7),applit(x,y,1,0),applit(x,y,0,1),outclause();\n               /* $\\bar x\\bar zz'$ */\n}\n\n@*Index.\n"
  },
  {
    "path": "src/test/resources/samples/langs/CartoCSS/amenity-points.mss",
    "content": "@marina-text: #576ddf; // also swimming_pool\n@wetland-text: darken(#017fff, 10%); /* Also for marsh */\n@mud-text: darken(#aea397, 20%);\n@shop-icon: #ac39ac;\n@transportation-icon: #0092da;\n@transportation-text: #0066ff;\n@airtransport: #8461C4;\n\n@landcover-font-size: 10;\n@landcover-font-size-big: 12;\n@landcover-font-size-bigger: 15;\n@landcover-wrap-width-size: 25;\n@landcover-wrap-width-size-big: 35;\n@landcover-wrap-width-size-bigger: 45;\n@landcover-face-name: @oblique-fonts;\n\n@standard-wrap-width: 30;\n\n.points {\n  [feature = 'tourism_alpine_hut'][zoom >= 13] {\n    point-file: url('symbols/alpinehut.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_shelter'][zoom >= 16] {\n    point-file: url('symbols/shelter2.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_atm'][zoom >= 17] {\n    point-file: url('symbols/atm2.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_bank'][zoom >= 17] {\n    point-file: url('symbols/bank2.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_bar'][zoom >= 17] {\n    point-file: url('symbols/bar.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_bicycle_rental'][zoom >= 17] {\n    point-file: url('symbols/rental_bicycle.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'highway_bus_stop'] {\n    [zoom >= 16] {\n      marker-file: url('symbols/square.svg');\n      marker-fill: @transportation-icon;\n      marker-placement: interior;\n      marker-width: 6;\n    }\n    [zoom >= 17] {\n      marker-file: url('symbols/bus_stop.p.12.png');\n      marker-width: 12;\n    }\n  }\n\n  [feature = 'amenity_bus_station'][zoom >= 16] {\n    point-file: url('symbols/bus_station.n.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'highway_traffic_signals'][zoom >= 17] {\n    marker-file: url('symbols/traffic_light.svg');\n    marker-fill: #0a0a0a;\n    marker-placement: interior;\n  }\n\n  [feature = 'amenity_cafe'][zoom >= 17] {\n    point-file: url('symbols/cafe.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_camp_site'][zoom >= 16] {\n    point-file: url('symbols/camping.n.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'highway_ford'][zoom >= 16] {\n    point-file: url('symbols/transport_ford.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_caravan_site'][zoom >= 16] {\n    point-file: url('symbols/caravan_park.p.24.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_car_sharing'][zoom >= 16] {\n    point-file: url('symbols/car_share.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_chalet'][zoom >= 17] {\n    point-file: url('symbols/chalet.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_cinema'][zoom >= 16] {\n    point-file: url('symbols/cinema.p.24.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_fire_station'][zoom >= 16] {\n    point-file: url('symbols/firestation.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_fuel'][zoom >= 17] {\n    point-file: url('symbols/fuel.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_guest_house'][zoom >= 17] {\n    point-file: url('symbols/guest_house.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_hospital'][zoom >= 15] {\n    point-file: url('symbols/hospital.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_hostel'][zoom >= 17] {\n    point-file: url('symbols/hostel.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_hotel'][zoom >= 17] {\n    point-file: url('symbols/hotel2.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_motel'][zoom >= 17] {\n    point-file: url('symbols/motel.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_information'][zoom >= 17] {\n    point-file: url('symbols/information.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_embassy'][zoom >= 17] {\n    point-file: url('symbols/embassy.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_library'][zoom >= 16] {\n    point-file: url('symbols/library.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_courthouse'][zoom > 16] {\n    point-file: url('symbols/amenity_court.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'waterway_lock'],\n  [feature = 'lock_yes'] {\n    [zoom >= 15] {\n      marker-fill: #969494;\n      marker-width: 9;\n      marker-line-width: 0;\n      marker-placement: interior;\n    }\n  }\n\n  [feature = 'man_made_mast'][zoom >= 17] {\n    point-file: url('symbols/communications.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_museum'][zoom >= 16] {\n    point-file: url('symbols/museum.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_parking'][zoom >= 16] {\n    marker-file: url('symbols/parking.svg');\n    marker-placement: interior;\n    marker-clip: false;\n    marker-fill: @transportation-icon;\n    [access != ''][access != 'public'][access != 'yes'] {\n      marker-opacity: 0.33;\n    }\n  }\n\n  [feature = 'amenity_pharmacy'][zoom >= 17] {\n    point-file: url('symbols/pharmacy.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_place_of_worship'][zoom >= 16] {\n    point-file: url('symbols/place_of_worship3.p.16.png');\n    point-placement: interior;\n    [religion = 'christian'] {\n      point-file: url('symbols/christian3.p.14.png');\n      [denomination = 'jehovahs_witness']{\n        point-file: url('symbols/place_of_worship3.p.16.png');\n      }\n    }\n    [religion = 'muslim'] {\n      point-file: url('symbols/islamic3.p.16.png');\n    }\n    [religion = 'sikh'] {\n      point-file: url('symbols/sikh3.p.16.png');\n    }\n    [religion = 'jewish'] {\n      point-file: url('symbols/jewish3.p.16.png');\n    }\n    [religion = 'hindu'] {\n      point-file: url('symbols/hindu.png');\n    }\n    [religion = 'buddhist'] {\n      point-file: url('symbols/buddhist.png');\n    }\n    [religion = 'shinto'] {\n      point-file: url('symbols/shinto.png');\n    }\n    [religion = 'taoist'] {\n      point-file: url('symbols/taoist.png');\n    }\n  }\n\n  [feature = 'amenity_police'][zoom >= 16] {\n    point-file: url('symbols/police.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_post_box'][zoom >= 17] {\n    point-file: url('symbols/post_box.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_post_office'][zoom >= 17] {\n    point-file: url('symbols/post_office.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_pub'][zoom >= 17] {\n    point-file: url('symbols/pub.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_biergarten'][zoom >= 17] {\n    point-file: url('symbols/biergarten.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_recycling'][zoom >= 16] {\n    point-file: url('symbols/recycling.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_restaurant'][zoom >= 17] {\n    point-file: url('symbols/restaurant.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_fast_food'][zoom >= 17] {\n    point-file: url('symbols/fast_food.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_telephone'][zoom >= 17] {\n    point-file: url('symbols/telephone.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_emergency_phone'][zoom >= 17] {\n    point-file: url('symbols/sosphone.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_theatre'][zoom >= 16] {\n    point-file: url('symbols/theatre.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_toilets'][zoom >= 17] {\n    point-file: url('symbols/toilets.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_drinking_water'][zoom >= 17] {\n    point-file: url('symbols/food_drinkingtap.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_prison'][zoom >= 17] {\n    point-file: url('symbols/amenity_prison.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_viewpoint'][zoom >= 16] {\n    point-file: url('symbols/view_point.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'man_made_water_tower'][zoom >= 17] {\n    point-file: url('symbols/tower_water.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'historic_memorial'][zoom >= 17] {\n    point-file: url('symbols/tourist_memorial.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'historic_archaeological_site'][zoom >= 16] {\n    point-file: url('symbols/tourist_archaeological2.glow.24.png');\n    point-placement: interior;\n  }\n\n  [feature = 'shop_other'][zoom >= 17] {\n    marker-fill: @shop-icon;\n    marker-width: 6;\n    marker-line-width: 0;\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_supermarket'][zoom >= 16] {\n    marker-file: url('symbols/shop_supermarket.svg');\n    marker-placement: interior;\n    marker-clip: false;\n    marker-fill: @shop-icon;\n  }\n\n  [feature = 'shop_bakery'][zoom >= 17] {\n    marker-file: url('symbols/shop_bakery.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_butcher'][zoom >= 17] {\n    marker-file: url('symbols/shop_butcher.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_clothes'],\n  [feature = 'shop_fashion'] {\n    [zoom >= 17] {\n      marker-file: url('symbols/shop_clothes.svg');\n      marker-placement: interior;\n      marker-clip: false;\n      marker-fill: @shop-icon;\n    }\n  }\n\n  [feature = 'shop_convenience'][zoom >= 17] {\n    marker-file: url('symbols/shop_convenience.svg');\n    marker-placement: interior;\n    marker-clip: false;\n    marker-fill: @shop-icon;\n  }\n\n  [feature = 'shop_department_store'][zoom >= 16] {\n    point-file: url('symbols/department_store.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'shop_doityourself'][zoom >= 17] {\n    marker-file: url('symbols/shop_diy.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_florist'][zoom >= 17] {\n    marker-file: url('symbols/florist.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_hairdresser'][zoom >= 17] {\n    marker-file: url('symbols/shop_hairdresser.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_car'][zoom >= 17] {\n    marker-file: url('symbols/shop_car.svg');\n    marker-placement: interior;\n    marker-clip: false;\n    marker-fill: @shop-icon;\n  }\n\n  [feature = 'shop_car_repair'][zoom >= 17] {\n    marker-file: url('symbols/shopping_car_repair.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_bicycle'][zoom >= 17] {\n    marker-file: url('symbols/shopping_bicycle.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'leisure_playground'][zoom >= 17] {\n    point-file: url('symbols/playground.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_picnic_site'][zoom >= 16] {\n    point-file: url('symbols/picnic.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'leisure_picnic_table'][zoom >= 17] {\n    point-file: url('symbols/picnic.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'leisure_slipway'][zoom >= 17] {\n    point-file: url('symbols/transport_slipway.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'aeroway_helipad'][zoom >= 16]::aeroway {\n    marker-file: url('symbols/helipad.svg');\n    marker-clip: false;\n    marker-fill: @airtransport;\n  }\n\n  [feature = 'aeroway_aerodrome'][zoom >= 10][zoom < 14]::aeroway {\n    marker-file: url('symbols/aerodrome.svg');\n    marker-clip: false;\n    marker-fill: @airtransport;\n  }\n\n  [feature = 'man_made_lighthouse'][zoom >= 15]::man_made {\n    point-file: url('symbols/lighthouse.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'natural_peak'][zoom >= 11]::natural {\n    marker-file: url('symbols/peak.svg');\n    marker-fill: #d08f55;\n    marker-placement: interior;\n  }\n\n  [feature = 'natural_volcano'][zoom >= 11]::natural {\n    marker-file: url('symbols/peak.svg');\n    marker-fill: #d40000;\n    marker-placement: interior;\n  }\n\n  [feature = 'natural_saddle'][zoom >= 15]::natural {\n    marker-file: url('symbols/saddle.svg');\n    marker-fill: #d08f55;\n    marker-placement: interior;\n  }\n\n  [feature = 'natural_cave_entrance'][zoom >= 15]::natural {\n    point-file: url('symbols/poi_cave.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'natural_spring'][zoom >= 14]::natural {\n    marker-file: url('symbols/spring.svg');\n    marker-placement: interior;\n  }\n\n  [feature = 'natural_tree'][zoom >= 16]::natural {\n    marker-placement: interior;\n    marker-ignore-placement: true;\n    marker-line-width: 0;\n    marker-width: 3;\n    marker-fill: #239c45;\n    [zoom >= 17] {\n      marker-line-width: 1;\n      marker-line-color: #8ef2ab;\n      marker-width: 4;\n    }\n  }\n\n  [feature = 'power_generator']['generator:source' = 'wind']::power,\n  [feature = 'power_generator'][power_source = 'wind']::power {\n    [zoom >= 15] {\n      point-file: url('symbols/power_wind.png');\n      point-placement: interior;\n    }\n  }\n\n  [feature = 'man_made_windmill'][zoom >= 16]::man_made {\n    point-file: url('symbols/windmill.png');\n    point-placement: interior;\n  }\n\n  [feature = 'man_made_mast'][zoom >= 17]::man_made {\n    point-file: url('symbols/communications.p.20.png');\n    point-placement: interior;\n  }\n}\n\n.amenity-low-priority {\n  [railway = 'level_crossing'][zoom >= 14]::railway {\n    point-file: url('symbols/level_crossing.svg');\n    point-placement: interior;\n    [zoom >= 16] {\n      point-file: url('symbols/level_crossing2.svg');\n    }\n  }\n\n  [highway = 'mini_roundabout'][zoom >= 16]::highway {\n    marker-file: url('symbols/mini_roundabout.svg');\n    marker-placement: interior;\n  }\n\n  [barrier = 'gate']::barrier {\n    [zoom >= 16] {\n      marker-file: url('symbols/gate.svg');\n      marker-placement: interior;\n    }\n  }\n\n  [barrier = 'lift_gate'][zoom >= 16]::barrier {\n    marker-file: url('symbols/liftgate.svg');\n    marker-fill: #3f3f3f;\n    marker-placement: interior\n  }\n\n  [barrier = 'bollard'],\n  [barrier = 'block'] {\n    [zoom >= 16] {\n      marker-width: 3;\n      marker-line-width: 0;\n      marker-fill: #7d7c7c;\n      marker-placement: interior;\n\n      [zoom >= 18] {\n        marker-width: 4;\n      }\n    }\n  }\n}\n\n.text-low-zoom[zoom < 10],\n.text[zoom >= 10] {\n  [feature = 'place_island'][zoom >= 7][way_pixels > 3000],\n  [feature = 'place_island'][zoom >= 16],\n  [feature = 'place_islet'][zoom >= 14][way_pixels > 3000],\n  [feature = 'place_islet'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-fill: #000;\n    text-size: 10;\n    [way_pixels > 12000] { text-size: 12; }\n    [way_pixels > 48000] { text-size: 15; }\n    text-face-name: @oblique-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_pub'],\n  [feature = 'amenity_restaurant'],\n  [feature = 'amenity_cafe'],\n  [feature = 'amenity_fast_food'],\n  [feature = 'amenity_biergarten'],\n  [feature = 'amenity_bar'] {\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-fill: #734a08;\n      text-size: 10;\n      text-dy: 11;\n      text-face-name: @bold-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      [feature = 'amenity_bar']{\n        text-dy: 13;\n      }\n    }\n  }\n\n  [feature = 'amenity_library'],\n  [feature = 'amenity_theatre'],\n  [feature = 'amenity_courthouse'],\n  [feature = 'amenity_cinema'] {\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-fill: #734a08;\n      text-dy: 13;\n      text-face-name: @bold-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      [feature = 'amenity_cinema'] {\n        text-dy: 15;\n      }\n    }\n  }\n\n  [feature = 'amenity_parking'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: @transportation-text;\n    text-dy: 9;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    [access != ''][access != 'public'][access != 'yes'] {\n      text-fill: #66ccaf;\n    }\n  }\n\n  [feature = 'amenity_police'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #734a08;\n    text-dy: 11;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_fire_station'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #734a08;\n    text-dy: 11;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_place_of_worship'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #000033;\n    text-dy: 12;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'natural_wood'][is_building = 'no'] {\n    [zoom >= 8][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@wood, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_peak'],\n  [feature = 'natural_volcano'] {\n    [zoom >= 13] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-fill: brown;\n      text-dy: 7;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      ele/text-name: \"[ele]\";\n      ele/text-size: 9;\n      ele/text-fill: brown;\n      ele/text-dy: 6;\n      ele/text-face-name: @oblique-fonts;\n      ele/text-halo-radius: 1;\n      ele/text-placement: interior;\n      [name != ''] {\n        ele/text-dy: 19;\n      }\n    }\n  }\n\n  [feature = 'natural_saddle'] {\n    [zoom >= 15] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-fill: brown;\n      text-dy: 7;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      ele/text-name: \"[ele]\";\n      ele/text-size: 9;\n      ele/text-fill: brown;\n      ele/text-dy: 6;\n      ele/text-face-name: @oblique-fonts;\n      ele/text-halo-radius: 1;\n      ele/text-placement: interior;\n      [name != ''] {\n        ele/text-dy: 19;\n      }\n    }\n  }\n\n  [feature = 'natural_cave_entrance'][zoom >= 15] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: brown;\n    text-dy: 11;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'historic_memorial'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: brown;\n    text-dy: 13;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'historic_archaeological_site'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: brown;\n    text-dy: 15;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'natural_water'],\n  [feature = 'natural_lake'],\n  [feature = 'landuse_reservoir'],\n  [feature = 'landuse_basin'] {\n    [way_area >= 40000000][zoom >= 10],\n    [way_area >= 10000000][zoom >= 11],\n    [way_area >= 2400000][zoom >= 12],\n    [way_area >= 600000][zoom >= 13],\n    [way_area >= 150000][zoom >= 14],\n    [way_area >= 80000][zoom >= 15],\n    [way_area >= 20000][zoom >= 16],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 12;\n      text-fill: @water-text;\n      text-face-name: @oblique-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_mud'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: @mud-text;\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_wetland'][is_building = 'no'],\n  [feature = 'natural_marsh'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: @wetland-text;\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_swimming_pool'][is_building = 'no'] {\n    [zoom >= 14][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: @marina-text;\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_sports_centre'][is_building = 'no'],\n  [feature = 'leisure_stadium'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@stadium, 30%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_track'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@track, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_pitch'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@pitch, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_playground'] {\n    [way_area >= 150000][zoom >= 14],\n    [way_area >= 80000][zoom >= 15],\n    [way_area >= 20000][zoom >= 16],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 11;\n      text-dy: 13;\n      text-fill: darken(@park, 60%);\n      text-face-name: @book-fonts;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_park'][is_building = 'no'],\n  [feature = 'leisure_recreation_ground'][is_building = 'no'],\n  [feature = 'landuse_recreation_ground'][is_building = 'no'],\n  [feature = 'landuse_conservation'][is_building = 'no'],\n  [feature = 'landuse_village_green'][is_building = 'no'],\n  [feature = 'leisure_common'][is_building = 'no'],\n  [feature = 'leisure_garden'][is_building = 'no'],\n  [feature = 'leisure_golf_course'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@park, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'boundary_national_park'][is_building = 'no'],\n  [feature = 'leisure_nature_reserve'][is_building = 'no'] {\n    [zoom >= 8][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@park, 70%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_quarry'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@quarry, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_vineyard'][is_building = 'no'],\n  [feature = 'landuse_orchard'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@vineyard, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1.5; /* extra halo needed to overpower the vineyard polygon pattern */\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_cemetery'][is_building = 'no'],\n  [feature = 'amenity_grave_yard'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@cemetery, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1.5; /* extra halo needed to overpower the cemetery polygon pattern */\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_residential'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@residential, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_garages'][is_building = 'no'] {\n    [zoom >= 13][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@garages, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_field'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@field, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_meadow'][is_building = 'no'],\n  [feature = 'landuse_grass'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@grass, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_allotments'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@allotments, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_forest'][is_building = 'no'] {\n    [zoom >= 8][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@forest, 30%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_farmyard'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@farmyard, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n  [feature = 'landuse_farm'][is_building = 'no'],\n  [feature = 'landuse_farmland'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@farmland, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'shop_mall'],\n  [feature = 'landuse_retail'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@retail, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_industrial'][is_building = 'no'],\n  [feature = 'landuse_railway'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@industrial, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_commercial'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@commercial, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_brownfield'][is_building = 'no'],\n  [feature = 'landuse_landfill'][is_building = 'no'],\n  [feature = 'landuse_construction'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@construction, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_bay'][zoom >= 14] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #6699cc;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'natural_spring'][zoom >= 16] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #6699cc;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    text-dy: 6;\n  }\n\n  [feature = 'tourism_alpine_hut'][zoom >= 15] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: #6699cc;\n    text-dy: 11;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    [zoom >= 16] {\n      ele/text-name: \"[ele]\";\n      ele/text-size: 8;\n      ele/text-fill: #6699cc;\n      ele/text-dy: 23;\n      ele/text-face-name: @oblique-fonts;\n      ele/text-halo-radius: 1;\n      ele/text-placement: interior;\n    }\n  }\n\n  [feature = 'amenity_shelter'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: #6699cc;\n    text-dy: 11;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    ele/text-name: \"[ele]\";\n    ele/text-size: 8;\n    ele/text-fill: #6699cc;\n    ele/text-dy: 23;\n    ele/text-face-name: @oblique-fonts;\n    ele/text-halo-radius: 1;\n    ele/text-placement: interior;\n  }\n\n  [feature = 'amenity_bank'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: black;\n    text-dy: 12;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    text-face-name: @book-fonts;\n  }\n\n  [feature = 'tourism_hotel'],\n  [feature = 'tourism_motel'],\n  [feature = 'tourism_hostel'],\n  [feature = 'tourism_chalet'] {\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-fill: #0066ff;\n      text-dy: 13;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      [feature = 'tourism_chalet'] {\n        text-dy: 11;\n      }\n    }\n  }\n\n  [feature = 'amenity_embassy'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: #0066ff;\n    text-dy: 9;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'tourism_guest_house'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 8;\n    text-fill: #0066ff;\n    text-dy: 10;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'highway_bus_stop'],\n  [feature = 'amenity_fuel'],\n  [feature = 'amenity_bus_station'] {\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 9;\n      text-fill: @transportation-text;\n      text-dy: 11;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      [feature = 'highway_bus_stop'] {\n        text-dy: 9;\n      }\n    }\n  }\n\n  [feature = 'tourism_camp_site'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #0066ff;\n    text-dy: 15;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'tourism_caravan_site'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@campsite, 50%);\n      text-dy: 15;\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'waterway_lock'][zoom >= 15] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-dy: 10;\n    text-fill: #0066ff;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'leisure_marina'][zoom >= 15] {\n    text-name: \"[name]\";\n    text-size: 8;\n    text-fill: @marina-text;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    [zoom >= 17] {\n      text-size: 10;\n    }\n  }\n\n  [feature = 'tourism_theme_park'][is_building = 'no'] {\n    [zoom >= 13][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: @theme_park;\n      text-face-name: @bold-fonts; /*rendered bold to improve visibility since theme parks tend to have crowded backgrounds*/\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'tourism_museum'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-dy: 11;\n    text-fill: #734a08;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_prison'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #734a08;\n    text-dy: 16;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'tourism_attraction'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: #660033;\n      text-face-name: @book-fonts;\n      text-halo-radius: 2;\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'amenity_university'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@school, 70%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'amenity_school'][is_building = 'no'],\n  [feature = 'amenity_college'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@school, 70%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'amenity_kindergarten'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@school, 65%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'man_made_lighthouse'][zoom >= 15] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: #000033;\n    text-dy: 16;\n    text-face-name: @book-fonts;\n    text-halo-radius: 2;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'man_made_windmill'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: #734a08;\n    text-dy: 12;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_hospital'][zoom >= 16] {\n    text-name: \"[name]\";\n    text-fill: #da0092;\n    text-size: 8;\n    text-dy: 10;\n    text-face-name: @book-fonts;\n    text-halo-radius: 2;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_pharmacy'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 8;\n    text-dy: 10;\n    text-fill: #da0092;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'shop_bakery'],\n  [feature = 'shop_clothes'],\n  [feature = 'shop_fashion'],\n  [feature = 'shop_convenience'],\n  [feature = 'shop_doityourself'],\n  [feature = 'shop_hairdresser'],\n  [feature = 'shop_butcher'],\n  [feature = 'shop_car'],\n  [feature = 'shop_car_repair'],\n  [feature = 'shop_bicycle'],\n  [feature = 'shop_florist'],\n  [feature = 'shop_other']{\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-dy: 12;\n      text-fill: #939;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1.5;\n      text-halo-fill: rgba(255, 255, 255, 0.8);\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'shop_supermarket'],\n  [feature = 'shop_department_store'] {\n    [zoom >= 16] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-dy: 12;\n      text-fill: #939;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1.5;\n      text-halo-fill: rgba(255, 255, 255, 0.8);\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'military_danger_area'][is_building = 'no'] {\n    [zoom >= 9][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@danger_area, 40%);\n      text-face-name: @bold-fonts;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_military'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@military, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'aeroway_gate'][zoom >= 17] {\n    text-name: \"[ref]\";\n    text-size: 10;\n    text-fill: #aa66cc;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'military_barracks'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@barracks, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'tourism_zoo'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@zoo, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'power_station'][is_building = 'no'][zoom >= 10],\n  [feature = 'power_generator'][is_building = 'no'][zoom >= 10],\n  [feature = 'power_sub_station'][is_building = 'no'][zoom >= 13],\n  [feature = 'power_substation'][is_building = 'no'][zoom >= 13]{\n    [way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@power, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_desert'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@desert, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_sand'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@sand, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_heath'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@heath, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n\n  [feature = 'natural_grassland'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@grassland, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_scrub'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@scrub, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'aeroway_apron'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@apron, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_beach'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@beach, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'highway_services'][is_building = 'no'],\n  [feature = 'highway_rest_area'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@rest_area, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n    }\n  }\n\n  [feature = 'natural_glacier'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@glacier, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n    }\n  }\n\n  [feature = 'aeroway_helipad'][zoom >= 16]::aeroway {\n    text-name: \"[name]\";\n    text-size: 8;\n    text-fill: @airtransport;\n    text-dy: -10;\n    text-face-name: @bold-fonts;\n    text-halo-radius: 1;\n    text-placement: interior;\n    text-wrap-width: 30;\n  }\n\n  [feature = 'aeroway_aerodrome'][zoom >= 10][zoom < 14]::aeroway {\n    text-name: \"[name]\";\n    text-size: 8;\n    text-fill: darken(@airtransport, 15%);\n    text-dy: -10;\n    text-face-name: @oblique-fonts;\n    text-halo-radius: 1;\n    text-placement: interior;\n    text-wrap-width: 30;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ceylon/Foo.ceylon",
    "content": "\"Test function for Ceylon\"\nby (\"Enrique\")\nshared void test() {\n    print(\"test\");\n}\n\n\"Test class for Ceylon\"\nshared class Test(name) satisfies Comparable<Test> {\n    shared String name;\n    shared actual String string = \"Test ``name``.\";\n\n    shared actual Comparison compare(Test other) {\n        return name<=>other.name;\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Chapel/distributions.chpl",
    "content": "//\n// Distributions Primer\n//\n// This primer demonstrates uses of some of Chapel's standard\n// distributions.  To use these distributions in a Chapel program,\n// the respective module must be used:\n//\nuse BlockDist, CyclicDist, BlockCycDist, ReplicatedDist;\nuse DimensionalDist2D, ReplicatedDim, BlockCycDim;\n\n//\n// For each distribution, we'll create a distributed domain and array\n// and then initialize it just to give a brief flavor of how the\n// distribution maps across locales.  Running this example on 6\n// locales does a nice job of illustrating the distribution\n// characteristics.\n//\n// All of these distributions support options to map to a different\n// virtual locale grid than the one used by default (a\n// multidimensional factoring of the built-in Locales array), as well\n// as to control the amount of parallelism used in data parallel\n// loops.  See the Standard Distributions chapter of the language spec\n// for more details.\n//\n\n//\n// Make the program size configurable from the command line.\n//\nconfig const n = 8;\n\n//\n// Declare a 2-dimensional domain Space that we will later use to\n// initialize the distributed domains.\n//\nconst Space = {1..n, 1..n};\n\n//\n// The Block distribution distributes a bounding box from\n// n-dimensional space across the target locale array viewed as an\n// n-dimensional virtual locale grid.  The bounding box is blocked\n// into roughly equal portions across the locales.  Note that domains\n// declared over a Block distribution can also store indices outside\n// of the bounding box; the bounding box is merely used to compute\n// the blocking of space.\n//\n// In this example, we declare a 2-dimensional Block-distributed\n// domain BlockSpace and a Block-distributed array BA declared over\n// the domain.\n//\nconst BlockSpace = Space dmapped Block(boundingBox=Space);\nvar BA: [BlockSpace] int;\n\n//\n// To illustrate how the index set is distributed across locales,\n// we'll use a forall loop to initialize each array element to the\n// locale ID that stores that index/element/iteration.\n//\nforall ba in BA do\n  ba = here.id;\n\n//\n// The 'hasSingleLocalSubdomain' method on arrays will return true if the \n// index set for a locale can be represented by a single domain.\n//\nif !BA.hasSingleLocalSubdomain() then\n  halt(\"For a Block distribution, the index set per locale should be \\\n      represented by a single domain\");\n\n//\n// If the distribution's subdomains can be represented as single subdomain,\n// we can use the 'localSubdomain' method to get the index set for the \n// current locale.\n//\n// Below, we'll use the index set to confirm that the array elements have the \n// correct locale id.\n//\n\nfor L in Locales {\n  on L {\n    const indices = BA.localSubdomain();\n    for i in indices {\n      if BA[i] != L.id then\n        halt(\"Error: incorrect locale id\");\n    }\n  }\n}\n\n\n//\n// Output the Block-distributed array to visually see how the elements\n// are partitioned across the locales.\n//\nwriteln(\"Block Array Index Map\");\nwriteln(BA);\nwriteln();\n\n//\n// Most of Chapel's standard distributions support an optional\n// targetLocales argument that permits you to pass in your own\n// array of locales to be targeted.  In general, the targetLocales\n// argument should match the rank of the distribution.  So for\n// example, to map a Block to a [numLocales x 1] view of the\n// locale set, one could do something like this:\n\n//\n// We start by creating our own array of the locale values.  Here\n// we use the standard array reshape function for convenience,\n// but more generally, this array could be accessed/assigned like any\n// other.\n//\n\nvar MyLocaleView = {0..#numLocales, 1..1};\nvar MyLocales: [MyLocaleView] locale = reshape(Locales, MyLocaleView);\n\n//\n// Then we'll declare a distributed domain/array that targets\n// this view of the locales:\n// \n\nconst BlockSpace2 = Space dmapped Block(boundingBox=Space,\n                                        targetLocales=MyLocales);\nvar BA2: [BlockSpace2] int;\n\n//\n// Then we'll do a similar computation as before to verify where\n// everything ended up:\n//\nforall ba in BA2 do\n  ba = here.id;\n\nwriteln(\"Block Array Index Map\");\nwriteln(BA2);\nwriteln();\n\n//\n// We can use the 'targetLocales' method available on an array to get the\n// locales array used as targets.\n//\nfor (L, ML) in zip(BA2.targetLocales(), MyLocales) do\n  if L != ML then\n    halt(\"Error: BA2.targetLocales() should equal MyLocales\");\n\n\n\n//\n// Next, we'll perform a similar computation for the Cyclic distribution.\n// Cyclic distributions start at a designated n-dimensional index and\n// distribute the n-dimensional space across an n-dimensional array\n// of locales in a round-robin fashion (in each dimension).  As with\n// the Block distribution, domains may be declared using the\n// distribution who have lower indices that the starting index; that\n// value should just be considered a parameterization of how the\n// distribution is defined.\n//\nconst CyclicSpace = Space dmapped Cyclic(startIdx=Space.low);\nvar CA: [CyclicSpace] int;\n\nforall ca in CA do\n  ca = here.id;\n\nwriteln(\"Cyclic Array Index Map\");\nwriteln(CA);\nwriteln();\n\n//\n// The domain returned by 'localSubdomain' need not be a dense block, as is\n// the case for the Cyclic Distribution.\n//\non Locales[0] {\n  const indices = CA.localSubdomain();\n  for i in indices {\n    if CA[i] != 0 then\n      halt(\"Error: Cyclic array values on Locale 0 should be zero\");\n  }\n}\n\n\n//\n// Next, we'll declare a Block-Cyclic distribution.  These\n// distributions also deal out indices in a round-robin fashion,\n// but rather than dealing out singleton indices, they deal out blocks\n// of indices.  Thus, the BlockCyclic distribution is parameterized\n// by a starting index (as with Cyclic) and a block size (per\n// dimension) specifying how large the chunks to be dealt out are.\n//\nconst BlkCycSpace = Space dmapped BlockCyclic(startIdx=Space.low, \n                                              blocksize=(2, 3));\nvar BCA: [BlkCycSpace] int;\n\nforall bca in BCA do\n  bca = here.id;\n\nwriteln(\"Block-Cyclic Array Index Map\");\nwriteln(BCA);\nwriteln();\n\n//\n// A locale's index set for a Block-Cyclic distribution cannot be represented\n// by a single subdomain.\n//\nif BCA.hasSingleLocalSubdomain() then\n  halt(\"A Block-Cyclic index set cannot be represented by a single subdomain\");\n\n//\n// If the local index set cannot be represented by a single subdomain, \n// we can use the 'localSubdomains' iterator to yield a number of domains\n// that represent the whole index set.\n//\n// Let's write a function that will use 'localSubdomains' to verify the \n// correctness of the array values.\n//\n\nproc verifyID(Data: []) {\n  for L in Locales {\n    on L {\n      for indices in Data.localSubdomains() {\n        for i in indices {\n          if Data[i] != L.id then\n            halt(\"Error: incorrect locale id\");\n        }\n      }\n    }\n  }\n}\nverifyID(BCA);\n\n//\n// The 'localSubdomains' iterator is also available on distributions that\n// can represent a locale's index set with a single domain. This allows us to\n// write more general code that will work for all distributions.\n//\n// This means that we can call the 'verifyID' function on any array, like the\n// 'BA' array from earlier.\n//\nverifyID(BA);\n\n\n//\n// The ReplicatedDist distribution is different: each of the\n// original domain's indices - and the corresponding array elements -\n// is replicated onto each locale. (Note: consistency among these\n// array replicands is NOT maintained automatically.)\n//\n// This replication is observable in some cases but not others,\n// as shown below. Note: this behavior may change in the future.\n//\nconst ReplicatedSpace = Space dmapped ReplicatedDist();\nvar RA: [ReplicatedSpace] int;\n\n// The replication is observable - this visits each replicand.\nforall ra in RA do\n  ra = here.id;\n\nwriteln(\"Replicated Array Index Map, \", RA.numElements, \" elements total\");\nwriteln(RA);\nwriteln();\n\n//\n// The replication is observable when the replicated array is\n// on the left-hand side. If the right-hand side is not replicated,\n// it is copied into each replicand.\n// We illustrate this using a non-distributed array.\n//\nvar A: [Space] int = [(i,j) in Space] i*100 + j;\nRA = A;\nwriteln(\"Replicated Array after being array-assigned into\");\nwriteln(RA);\nwriteln();\n\n//\n// Analogously, each replicand will be visited and\n// other participated expressions will be computed on each locale\n// (a) when the replicated array is assigned a scalar:\n//       RA = 5;\n// (b) when it appears first in a zippered forall loop:\n//       forall (ra, a) in zip(RA, A) do ...;\n// (c) when it appears in a for loop:\n//       for ra in RA do ...;\n//\n// Zippering (RA,A) or (A,RA) in a 'for' loop will generate\n// an error due to their different number of elements.\n\n// Let RA store the Index Map again, for the examples below.\nforall ra in RA do\n  ra = here.id;\n\n//\n// Only the local replicand is accessed - replication is NOT observable\n// and consistency is NOT maintained - when:\n// (a) the replicated array is indexed - an individual element is read...\n//\non Locales(0) do\n  writeln(\"on \", here, \": \", RA(Space.low));\non Locales(LocaleSpace.high) do\n  writeln(\"on \", here, \": \", RA(Space.low));\nwriteln();\n\n// ...or an individual element is written;\non Locales(LocaleSpace.high) do\n  RA(Space.low) = 7777;\n\nwriteln(\"Replicated Array after being indexed into\");\nwriteln(RA);\nwriteln();\n\n//\n// (b) the replicated array is on the right-hand side of an assignment...\n//\non Locales(LocaleSpace.high) do\n  A = RA + 4;\nwriteln(\"Non-Replicated Array after assignment from Replicated Array + 4\");\nwriteln(A);\nwriteln();\n\n//\n// (c) ...or, generally, the replicated array or domain participates\n//     in a zippered forall loop, but not in the first position.\n//     The loop could look like:\n//\n//       forall (a, (i,j), ra) in (A, ReplicatedSpace, RA) do ...;\n//\n\n\n//\n// The DimensionalDist2D distribution lets us build a 2D distribution\n// as a composition of specifiers for individual dimensions.\n// Under such a \"dimensional\" distribution each dimension is handled\n// independently of the other.\n//\n// The dimension specifiers are similar to the corresponding multi-dimensional\n// distributions in constructor arguments and index-to-locale mapping rules.\n// However, instead of an array of locales, a specifier constructor\n// accepts just the number of locales that the indices in the corresponding\n// dimension will be distributed across.\n//\n// The DimensionalDist2D constructor requires:\n// * an [0..nl1-1, 0..nl2-1] array of locales, where\n//   nl1 and nl2 are the number of locales in each dimension, and\n// * two dimension specifiers, created for nl1 and nl2 locale counts, resp.\n//\n// Presently, the following dimension specifiers are available\n// (shown here with their constructor arguments):\n//\n// * ReplicatedDim(numLocales)\n// * BlockDim(numLocales, boundingBoxLow, boundingBoxHigh)\n// * BlockCyclicDim(lowIdx, blockSize, numLocales)\n//\n\n//\n// The following example creates a dimensional distribution that\n// replicates over 2 locales (when available) in the first dimemsion\n// and distributes using block-cyclic distribution in the second dimension.\n// The example computes nl1 and nl2 and reshapes MyLocales correspondingly.\n//\n\nvar (nl1, nl2) = if numLocales == 1 then (1, 1) else (2, numLocales/2);\nMyLocaleView = {0..#nl1, 0..#nl2};\nMyLocales = reshape(Locales[0..#nl1*nl2], MyLocaleView);\n\nconst DimReplicatedBlockcyclicSpace = Space\n  dmapped DimensionalDist2D(MyLocales,\n                            new ReplicatedDim(numLocales = nl1),\n                            new BlockCyclicDim(numLocales = nl2,\n                                               lowIdx = 1, blockSize = 2));\n\nvar DRBA: [DimReplicatedBlockcyclicSpace] int;\n\n// The ReplicatedDim specifier always accesses the local replicand.\n// (This differs from how the ReplicatedDist distribution works.)\n//\n// This example visits each replicand. The behavior is the same\n// regardless of the second index into MyLocales below.\n\nfor locId1 in 0..#nl1 do on MyLocales[locId1, 0] {\n\n  forall drba in DRBA do\n    drba = here.id;\n\n  writeln(\"Dimensional2D(Replicated,BlockCyclic) Array Index Map\",\n          \" from \", here);\n\n  // Technicality: 'writeln(DRBA)' would read DRBA always on Locale 0.\n  // Since we want to see what DRBA contains on the current locale,\n  // we use 'Helper' that is mapped using the default distribution.\n  // 'Helper = DRBA' captures the view of DRBA on the current locale,\n  // which we then print out.\n\n  const Helper: [Space] int = DRBA;\n  writeln(Helper);\n  writeln();\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Chapel/hello.chpl",
    "content": "writeln(\"Hello, world!\");    // print 'Hello, world!' to the console\n"
  },
  {
    "path": "src/test/resources/samples/langs/Chapel/lulesh.chpl",
    "content": "/*\n  Derived from the DARPA/Livermore Unstructured Lagrangian Explicit\n  Shock Hydrodynamics (LULESH)\n  https://computation.llnl.gov/casc/ShockHydro/\n\n  Original port to Chapel by Brandon Holt (8/2011).  Further\n  improvements for the sake of performance and/or generality made by\n  Sung-Eun Choi (12/2011, 11/2012), Jeff Keasler (3/2012), and Brad\n  Chamberlain (3-4,9-11/2012, 2/2013).\n\n\n  Notes on the Initial Implementation\n  -----------------------------------\n   \n  This implementation was designed to mirror the overall structure of\n  the C++ Lulesh but use Chapel constructs where they can help make\n  the code more readable, easier to maintain, or more\n  'elegant'. Function names are preserved for the most part, with some\n  additional helper functions, and original comments from the C++ code\n  are interspersed approximately where they belong to give an idea of\n  how the two codes line up. One major difference for this Chapel\n  version is the use of a number of module-level variables and\n  constants.\n\n\n  Status:\n\n  This code remains a work-in-progress as we gain further experience\n  with it.  Proposed improvements are noted in the README in this\n  directory and (in some cases) in TODO comments in the code.\n\n */\n\n\n\nuse Time,       // to get timing routines for benchmarking\n    BlockDist;  // for block-distributed arrays\n\nuse luleshInit;   // initialization code for data set\n\n/* The configuration parameters for lulesh.  These can be set on the\n   compiler command line using -s<paramName>=<value>.  For example,\n\n     chpl -suseBlockDist=true\n\n   useBlockDist : says whether or not to block-distribute the arrays.\n                  The default is based on the value of CHPL_COMM, as\n                  an indication of whether this is a single- or multi-\n                  locale execution.\n\n   use3DRepresentation : indicates whether the element node arrays\n                         should be stored using a 3D representation\n                         (limiting the execution to cube inputs) or\n                         the more general 1D representation (supporting\n                         arbitrary data sets).\n\n   useSparseMaterials : indicates whether sparse domains/arrays should be\n                        used to represent the materials.  Sparse domains\n                        are more realistic in that they permit an arbitrary\n                        subset of the problem space to store a material.\n                        Dense domains are sufficient for LULESH since there's\n                        an assumption that the material spans all cells.\n\n   printWarnings : prints performance-oriented warnings to prevent\n                   surprises.\n*/\n   \nconfig param useBlockDist = (CHPL_COMM != \"none\"),\n             use3DRepresentation = false,\n             useSparseMaterials = true,\n             printWarnings = true;\n\n\n//\n// Sanity check to ensure that input files aren't used with the 3D\n// representation\n//\nif (use3DRepresentation && (luleshInit.filename != \"\")) then\n  halt(\"The 3D representation does not support reading input from files\");\n\n\n/* Configuration constants: Override defaults on executable's command-line */\n\nconfig const initialEnergy = 3.948746e+7;            // initial energy value\n\n\nconfig const showProgress = false,   // print time and dt values on each step\n             debug = false,          // print various debug info\n             doTiming = true,        // time the main timestep loop\n             printCoords = true;     // print the final computed coordinates\n\n\n/* Compile-time constants */\n\nparam XI_M        = 0x003,\n      XI_M_SYMM   = 0x001,\n      XI_M_FREE   = 0x002,\n\n      XI_P        = 0x00c,\n      XI_P_SYMM   = 0x004,\n      XI_P_FREE   = 0x008,\n\n      ETA_M       = 0x030,\n      ETA_M_SYMM  = 0x010,\n      ETA_M_FREE  = 0x020,\n\n      ETA_P       = 0x0c0,\n      ETA_P_SYMM  = 0x040,\n      ETA_P_FREE  = 0x080,\n\n      ZETA_M      = 0x300,\n      ZETA_M_SYMM = 0x100,\n      ZETA_M_FREE = 0x200,\n\n      ZETA_P      = 0xc00,\n      ZETA_P_SYMM = 0x400,\n      ZETA_P_FREE = 0x800;\n\n\n/* Set up the problem size */\n\nconst (numElems, numNodes) = initProblemSize();\n\n\n/* Declare abstract problem domains */\n\nconst ElemSpace = if use3DRepresentation\n                    then {0..#elemsPerEdge, 0..#elemsPerEdge, 0..#elemsPerEdge}\n                    else {0..#numElems},\n      NodeSpace = if use3DRepresentation\n                    then {0..#nodesPerEdge, 0..#nodesPerEdge, 0..#nodesPerEdge}\n                    else {0..#numNodes};\n\n\n/* Declare the (potentially distributed) problem domains */\n\nconst Elems = if useBlockDist then ElemSpace dmapped Block(ElemSpace)\n                              else ElemSpace,\n      Nodes = if useBlockDist then NodeSpace dmapped Block(NodeSpace)\n                              else NodeSpace;\n\n\n/* The coordinates */\n\nvar x, y, z: [Nodes] real;\n                              \n\n/* The number of nodes per element.  In a rank-independent version,\n   this could be written 2**rank */\n\nparam nodesPerElem = 8;\n\n                                 \n// We could name this, but chose not to since it doesn't add that much clarity\n//\n// const elemNeighbors = 1..nodesPerElem;\n\n\n/* The element-to-node mapping */\n\nvar elemToNode: [Elems] nodesPerElem*index(Nodes);\n\n\n/* the Greek variables */\n\nvar lxim, lxip, letam, letap, lzetam, lzetap: [Elems] index(Elems);\n\n\n/* the X, Y, Z Symmetry values */\n\nvar XSym, YSym, ZSym: sparse subdomain(Nodes);\n\n\n\n/* Constants */\n\nconst u_cut = 1.0e-7,           /* velocity tolerance */\n      hgcoef = 3.0,             /* hourglass control */\n      qstop = 1.0e+12,          /* excessive q indicator */\n      monoq_max_slope = 1.0,\n      monoq_limiter_mult = 2.0,\n      e_cut = 1.0e-7,           /* energy tolerance */\n      p_cut = 1.0e-7,           /* pressure tolerance */\n      ss4o3 = 4.0/3.0,\n      q_cut = 1.0e-7,           /* q tolerance */\n      v_cut = 1.0e-10,          /* relative volume tolerance */\n      qlc_monoq = 0.5,          /* linear term coef for q */\n      qqc_monoq = 2.0/3.0,      /* quadratic term coef for q */\n      qqc = 2.0, \n      qqc2 = 64.0 * qqc**2,\n      eosvmax = 1.0e+9,\n      eosvmin = 1.0e-9,\n      pmin = 0.0,               /* pressure floor */\n      emin = -1.0e+15,          /* energy floor */\n      dvovmax = 0.1,            /* maximum allowable volume change */\n      refdens = 1.0,            /* reference density */\n\n      deltatimemultlb = 1.1,\n      deltatimemultub = 1.2,\n      dtmax = 1.0e-2;           /* maximum allowable time increment */\n\n                              \nconfig const stoptime = 1.0e-2,      /* end time for simulation */\n             maxcycles = max(int),   /* max number of cycles to simulate */\n             dtfixed = -1.0e-7;      /* fixed time increment */\n\n\n/* The list of material elements */\n\nconst MatElems: MatElemsType = if useSparseMaterials then enumerateMatElems()\n                                                     else Elems;\n\n\nproc MatElemsType type {\n  if useSparseMaterials {\n    if (printWarnings && useBlockDist && numLocales > 1) then\n      writeln(\"WARNING: The LULESH Material Elements (MatElems) are not yet\\n\",\n              \"         distributed, so result in excessive memory use on,\\n\",\n              \"         and communication with, locale 0\\n\");\n    return sparse subdomain(Elems);\n  } else\n    return Elems.type;\n}\n\niter enumerateMatElems() {\n  if (printWarnings && useBlockDist && numLocales > 1) then\n    writeln(\"WARNING: generation of matrix elements is serial and\\n\",\n            \"         unlikely to scale\");\n  for i in Elems do\n    yield i;\n}\n\n\n/* Element fields */\n\nvar elemBC: [Elems] int,\n\n    e: [Elems] real, // energy\n    p: [Elems] real, // pressure\n\n    q: [Elems] real, // q\n    ql: [Elems] real, // linear term for q\n    qq: [Elems] real, // quadratic term for q\n\n    v:    [Elems] real = 1.0, //relative volume\n    vnew: [Elems] real,\n\n    volo: [Elems] real, // reference volume\n    delv: [Elems] real, // m_vnew - m_v\n    vdov: [Elems] real, // volume derivative over volume\n\n    arealg: [Elems] real, // elem characteristic length\n\n    ss: [Elems] real, // \"sound speed\"\n\n    elemMass: [Elems] real; // mass\n\n\n/* Nodal fields */\n\nvar xd, yd, zd: [Nodes] real, // velocities\n\n    xdd, ydd, zdd: [Nodes] real, // acceleration\n\n    fx, fy, fz: [Nodes] atomic real, // forces\n\n    nodalMass: [Nodes] real; // mass\n\n\n/* Parameters */\n\nvar time = 0.0,          // current time\n    deltatime = 1.0e-7,  // variable time increment\n    dtcourant = 1.0e20,  // courant constraint\n    dthydro = 1.0e20,    // volume change constraint\n\n    cycle = 0;           // iteration count for simulation\n\n\nproc main() {\n  if debug then writeln(\"Lulesh -- Problem Size = \", numElems);\n\n  initLulesh();\n\n  var st: real;\n  if doTiming then st = getCurrentTime();\n  while (time < stoptime && cycle < maxcycles) {\n    const iterTime = if showProgress then getCurrentTime() else 0.0;\n\n    TimeIncrement();\n\n    LagrangeLeapFrog();\n\n    if debug {\n      deprintatomic(\"[[ Forces ]]\", fx, fy, fz);\n      deprint(\"[[ Positions ]]\", x, y, z);\n      deprint(\"[[ p, e, q ]]\", p, e, q);\n    }\n    if showProgress then\n      writef(\"time = %er, dt=%er, %s\", time, deltatime,\n             if doTiming then \", elapsed = \" + (getCurrentTime()-iterTime) +\"\\n\"\n                         else \"\\n\");\n  }\n  if (cycle == maxcycles) {\n    writeln(\"Stopped early due to reaching maxnumsteps\");\n  }\n  if doTiming {\n    const et = getCurrentTime();\n    writeln(\"Total Time: \", et-st);\n    writeln(\"Time/Cycle: \", (et-st)/cycle);\n  }\n  writeln(\"Number of cycles: \", cycle);\n\n  if printCoords {\n    var outfile = open(\"coords.out\", iomode.cw);\n    var writer = outfile.writer();\n    var fmtstr = if debug then \"%1.9re %1.9er %1.9er\\n\" \n                          else \"%1.4er %1.4er %1.4er\\n\";\n    for i in Nodes do\n      writer.writef(fmtstr, x[i], y[i], z[i]);\n    writer.close();\n    outfile.close();\n  }\n}\n\n\n/* Initialization functions */\n\nproc initLulesh() {\n  // initialize the coordinates\n  initCoordinates(x,y,z);\n\n  // initialize the element to node mapping\n  initElemToNodeMapping(elemToNode);\n\n  // initialize the greek symbols\n  initGreekVars(lxim, lxip, letam, letap, lzetam, lzetap);\n\n  // initialize the symmetry plane locations\n  initXSyms(XSym);\n  initYSyms(YSym);\n  initZSyms(ZSym);\n\n  /* embed hexehedral elements in nodal point lattice */\n  //calculated on the fly using: elemToNodes(i: index(Elems)): index(Nodes)\n\n  // initialize the masses\n  initMasses();\n\n  // initialize the boundary conditions\n  const octantCorner = initBoundaryConditions();\n\n  // deposit the energy for Sedov Problem\n  e[octantCorner] = initialEnergy;\n}\n\n\nproc initMasses() {\n  // This is a temporary array used to accumulate masses in parallel\n  // without losing updates by using 'atomic' variables\n  var massAccum: [Nodes] atomic real;\n\n  forall eli in Elems {\n    var x_local, y_local, z_local: 8*real;\n    localizeNeighborNodes(eli, x, x_local, y, y_local, z, z_local);\n\n    const volume = CalcElemVolume(x_local, y_local, z_local);\n    volo[eli] = volume;\n    elemMass[eli] = volume;\n\n    for neighbor in elemToNodes[eli] do\n      massAccum[neighbor].add(volume);\n  }\n\n  // When we're done, copy the accumulated masses into nodalMass, at\n  // which point the massAccum array can go away (and will at the\n  // procedure's return\n\n  forall i in Nodes do\n    nodalMass[i] = massAccum[i].read() / 8.0;\n\n  if debug {\n    writeln(\"ElemMass:\");\n    for mass in elemMass do writeln(mass);\n\n    writeln(\"NodalMass:\");\n    for mass in nodalMass do writeln(mass);\n  }\n}\n\n\nproc initBoundaryConditions() {\n  var surfaceNode: [Nodes] int;\n\n  forall n in XSym do\n    surfaceNode[n] = 1;\n  forall n in YSym do\n    surfaceNode[n] = 1;\n  forall n in ZSym do\n    surfaceNode[n] = 1;\n\n  forall e in Elems do {\n    var mask: int;\n    for i in 1..nodesPerElem do\n      mask += surfaceNode[elemToNode[e][i]] << (i-1);\n\n    // TODO: make an inlined function for this little idiom? (and below)\n\n    if ((mask & 0x0f) == 0x0f) then elemBC[e] |= ZETA_M_SYMM;\n    if ((mask & 0xf0) == 0xf0) then elemBC[e] |= ZETA_P_SYMM;\n    if ((mask & 0x33) == 0x33) then elemBC[e] |= ETA_M_SYMM;\n    if ((mask & 0xcc) == 0xcc) then elemBC[e] |= ETA_P_SYMM;\n    if ((mask & 0x99) == 0x99) then elemBC[e] |= XI_M_SYMM;\n    if ((mask & 0x66) == 0x66) then elemBC[e] |= XI_P_SYMM;\n  }\n\n\n  //\n  // We find the octant corner by looking for the element with\n  // all three SYMM flags set, which will have the largest\n  // integral value.  Thus, we can use a maxloc to identify it.\n  //\n  const (check, loc) = maxloc reduce zip(elemBC, Elems);\n\n  if debug then writeln(\"Found the octant corner at: \", loc);\n\n  if (check != (XI_M_SYMM | ETA_M_SYMM | ZETA_M_SYMM)) then\n    halt(\"maxloc got a value of \", check, \" at loc \", loc);\n\n  // TODO: This is an example of an array that, in a distributed\n  // memory code, would typically be completely local and only storing\n  // the local nodes owned by the locale -- noting that some nodes\n  // are logically owned by multiple locales and therefore would \n  // redundantly be stored in both locales' surfaceNode arrays -- it's\n  // essentially local scratchspace that does not need to be communicated\n  // or kept coherent across locales.\n  //\n\n  surfaceNode = 0;\n\n  /* the free surfaces */\n\n  var freeSurface: sparse subdomain(Nodes);\n\n  // initialize the free surface\n  initFreeSurface(freeSurface);\n\n  forall n in freeSurface do\n    surfaceNode[n] = 1;\n\n  forall e in Elems do {\n    var mask: int;\n    for i in 1..nodesPerElem do\n      mask += surfaceNode[elemToNode[e][i]] << (i-1);\n\n    if ((mask & 0x0f) == 0x0f) then elemBC[e] |= ZETA_M_FREE;\n    if ((mask & 0xf0) == 0xf0) then elemBC[e] |= ZETA_P_FREE;\n    if ((mask & 0x33) == 0x33) then elemBC[e] |= ETA_M_FREE;\n    if ((mask & 0xcc) == 0xcc) then elemBC[e] |= ETA_P_FREE;\n    if ((mask & 0x99) == 0x99) then elemBC[e] |= XI_M_FREE;\n    if ((mask & 0x66) == 0x66) then elemBC[e] |= XI_P_FREE;\n  }\n\n  if debug {\n    writeln(\"elemBC:\");\n    for b in elemBC do writeln(b);\n  }\n\n  return loc;\n}\n\n\n/* Helper functions */\n\ninline proc localizeNeighborNodes(eli: index(Elems),\n                                  x: [] real, ref x_local: 8*real,\n                                  y: [] real, ref y_local: 8*real,\n                                  z: [] real, ref z_local: 8*real) {\n\n  for i in 1..nodesPerElem {\n    const noi = elemToNode[eli][i];\n\n    x_local[i] = x[noi];\n    y_local[i] = y[noi];\n    z_local[i] = z[noi];\n  }\n}\n\ninline proc TripleProduct(x1, y1, z1, x2, y2, z2, x3, y3, z3) {\n  return x1*(y2*z3 - z2*y3) + x2*(z1*y3 - y1*z3) + x3*(y1*z2 - z1*y2);\n}\n\n\nproc CalcElemVolume(x, y, z) {\n  const dx61 = x[7] - x[2],\n        dy61 = y[7] - y[2],\n        dz61 = z[7] - z[2],\n\n        dx70 = x[8] - x[1],\n        dy70 = y[8] - y[1],\n        dz70 = z[8] - z[1],\n\n        dx63 = x[7] - x[4],\n        dy63 = y[7] - y[4],\n        dz63 = z[7] - z[4],\n\n        dx20 = x[3] - x[1],\n        dy20 = y[3] - y[1],\n        dz20 = z[3] - z[1],\n\n        dx50 = x[6] - x[1],\n        dy50 = y[6] - y[1],\n        dz50 = z[6] - z[1],\n\n        dx64 = x[7] - x[5],\n        dy64 = y[7] - y[5],\n        dz64 = z[7] - z[5],\n\n        dx31 = x[4] - x[2],\n        dy31 = y[4] - y[2],\n        dz31 = z[4] - z[2],\n\n        dx72 = x[8] - x[3],\n        dy72 = y[8] - y[3],\n        dz72 = z[8] - z[3],\n\n        dx43 = x[5] - x[4],\n        dy43 = y[5] - y[4],\n        dz43 = z[5] - z[4],\n\n        dx57 = x[6] - x[8],\n        dy57 = y[6] - y[8],\n        dz57 = z[6] - z[8],\n\n        dx14 = x[2] - x[5],\n        dy14 = y[2] - y[5],\n        dz14 = z[2] - z[5],\n\n        dx25 = x[3] - x[6],\n        dy25 = y[3] - y[6],\n        dz25 = z[3] - z[6];\n\n  const volume = TripleProduct(dx31 + dx72, dx63, dx20,\n                               dy31 + dy72, dy63, dy20,\n                               dz31 + dz72, dz63, dz20) +\n                 TripleProduct(dx43 + dx57, dx64, dx70,\n                               dy43 + dy57, dy64, dy70,\n                               dz43 + dz57, dz64, dz70) +\n                 TripleProduct(dx14 + dx25, dx61, dx50,\n                               dy14 + dy25, dy61, dy50,\n                               dz14 + dz25, dz61, dz50);\n\n  return volume / 12.0;\n}\n\nproc InitStressTermsForElems(p, q, sigxx, sigyy, sigzz: [?D] real) {\n  forall i in D {\n    sigxx[i] = -p[i] - q[i];\n    sigyy[i] = -p[i] - q[i];\n    sigzz[i] = -p[i] - q[i];\n  }\n}\n\n\nproc CalcElemShapeFunctionDerivatives(x: 8*real, y: 8*real, z: 8*real, \n                                      ref b_x: 8*real,\n                                      ref b_y: 8*real,\n                                      ref b_z: 8*real, \n                                      ref volume: real) {\n\n  const fjxxi = .125 * ((x[7]-x[1]) + (x[6]-x[4]) - (x[8]-x[2]) - (x[5]-x[3])),\n        fjxet = .125 * ((x[7]-x[1]) - (x[6]-x[4]) + (x[8]-x[2]) - (x[5]-x[3])),\n        fjxze = .125 * ((x[7]-x[1]) + (x[6]-x[4]) + (x[8]-x[2]) + (x[5]-x[3])),\n\n        fjyxi = .125 * ((y[7]-y[1]) + (y[6]-y[4]) - (y[8]-y[2]) - (y[5]-y[3])),\n        fjyet = .125 * ((y[7]-y[1]) - (y[6]-y[4]) + (y[8]-y[2]) - (y[5]-y[3])),\n        fjyze = .125 * ((y[7]-y[1]) + (y[6]-y[4]) + (y[8]-y[2]) + (y[5]-y[3])),\n\n        fjzxi = .125 * ((z[7]-z[1]) + (z[6]-z[4]) - (z[8]-z[2]) - (z[5]-z[3])),\n        fjzet = .125 * ((z[7]-z[1]) - (z[6]-z[4]) + (z[8]-z[2]) - (z[5]-z[3])),\n        fjzze = .125 * ((z[7]-z[1]) + (z[6]-z[4]) + (z[8]-z[2]) + (z[5]-z[3]));\n\n  /* compute cofactors */\n  const cjxxi =    (fjyet * fjzze) - (fjzet * fjyze),\n        cjxet =  - (fjyxi * fjzze) + (fjzxi * fjyze),\n        cjxze =    (fjyxi * fjzet) - (fjzxi * fjyet),\n\n        cjyxi =  - (fjxet * fjzze) + (fjzet * fjxze),\n        cjyet =    (fjxxi * fjzze) - (fjzxi * fjxze),\n        cjyze =  - (fjxxi * fjzet) + (fjzxi * fjxet),\n\n        cjzxi =    (fjxet * fjyze) - (fjyet * fjxze),\n        cjzet =  - (fjxxi * fjyze) + (fjyxi * fjxze),\n        cjzze =    (fjxxi * fjyet) - (fjyxi * fjxet);\n\n  /* calculate partials :\n     this need only be done for l = 0,1,2,3   since , by symmetry ,\n     (6,7,4,5) = - (0,1,2,3) .\n  */\n  b_x[1] =   -  cjxxi  -  cjxet  -  cjxze;\n  b_x[2] =      cjxxi  -  cjxet  -  cjxze;\n  b_x[3] =      cjxxi  +  cjxet  -  cjxze;\n  b_x[4] =   -  cjxxi  +  cjxet  -  cjxze;\n  b_x[5] = -b_x[3];\n  b_x[6] = -b_x[4];\n  b_x[7] = -b_x[1];\n  b_x[8] = -b_x[2];\n\n  b_y[1] =   -  cjyxi  -  cjyet  -  cjyze;\n  b_y[2] =      cjyxi  -  cjyet  -  cjyze;\n  b_y[3] =      cjyxi  +  cjyet  -  cjyze;\n  b_y[4] =   -  cjyxi  +  cjyet  -  cjyze;\n  b_y[5] = -b_y[3];\n  b_y[6] = -b_y[4];\n  b_y[7] = -b_y[1];\n  b_y[8] = -b_y[2];\n\n  b_z[1] =   -  cjzxi  -  cjzet  -  cjzze;\n  b_z[2] =      cjzxi  -  cjzet  -  cjzze;\n  b_z[3] =      cjzxi  +  cjzet  -  cjzze;\n  b_z[4] =   -  cjzxi  +  cjzet  -  cjzze;\n  b_z[5] = -b_z[3];\n  b_z[6] = -b_z[4];\n  b_z[7] = -b_z[1];\n  b_z[8] = -b_z[2];\n\n  /* calculate jacobian determinant (volume) */\n  volume = 8.0 * ( fjxet * cjxet + fjyet * cjyet + fjzet * cjzet);\n}\n\n\nproc CalcElemNodeNormals(ref pfx: 8*real, ref pfy: 8*real, ref pfz: 8*real, \n                         x: 8*real, y: 8*real, z: 8*real) {\n\n  proc ElemFaceNormal(param n1, param n2, param n3, param n4) {\n    const bisectX0 = 0.5 * (x[n4] + x[n3] - x[n2] - x[n1]),\n          bisectY0 = 0.5 * (y[n4] + y[n3] - y[n2] - y[n1]),\n          bisectZ0 = 0.5 * (z[n4] + z[n3] - z[n2] - z[n1]),\n          bisectX1 = 0.5 * (x[n3] + x[n2] - x[n4] - x[n1]),\n          bisectY1 = 0.5 * (y[n3] + y[n2] - y[n4] - y[n1]),\n          bisectZ1 = 0.5 * (z[n3] + z[n2] - z[n4] - z[n1]),\n          areaX    = 0.25 * (bisectY0 * bisectZ1 - bisectZ0 * bisectY1),\n          areaY    = 0.25 * (bisectZ0 * bisectX1 - bisectX0 * bisectZ1),\n          areaZ    = 0.25 * (bisectX0 * bisectY1 - bisectY0 * bisectX1);\n\n    var rx, ry, rz: 8*real; //results\n\n    (rx[n1], rx[n2], rx[n3], rx[n4]) = (areaX, areaX, areaX, areaX);\n    (ry[n1], ry[n2], ry[n3], ry[n4]) = (areaY, areaY, areaY, areaY);\n    (rz[n1], rz[n2], rz[n3], rz[n4]) = (areaZ, areaZ, areaZ, areaZ);\n\n    return (rx, ry, rz);\n  }\n\n  // calculate total normal from each face (faces are made up of\n  // combinations of nodes)\n\n  (pfx, pfy, pfz) = ElemFaceNormal(1,2,3,4) + ElemFaceNormal(1,5,6,2) +\n                    ElemFaceNormal(2,6,7,3) + ElemFaceNormal(3,7,8,4) +\n                    ElemFaceNormal(4,8,5,1) + ElemFaceNormal(5,8,7,6);\n}\n\n\nproc SumElemStressesToNodeForces(b_x: 8*real, b_y: 8*real, b_z: 8*real, \n                                 stress_xx:real,\n                                 stress_yy:real,\n                                 stress_zz: real, \n                                 ref fx: 8*real,\n                                 ref fy: 8*real,\n                                 ref fz: 8*real) {\n  for i in 1..8 {\n    fx[i] = -(stress_xx * b_x[i]);\n    fy[i] = -(stress_yy * b_y[i]);\n    fz[i] = -(stress_zz * b_z[i]);\n  }\n}\n\nproc CalcElemVolumeDerivative(x: 8*real, y: 8*real, z: 8*real) {\n\n  proc VoluDer(param n0, param n1, param n2, param n3, param n4, param n5) {\n    const ox =   (y[n1] + y[n2]) * (z[n0] + z[n1]) \n               - (y[n0] + y[n1]) * (z[n1] + z[n2])\n               + (y[n0] + y[n4]) * (z[n3] + z[n4]) \n               - (y[n3] + y[n4]) * (z[n0] + z[n4])\n               - (y[n2] + y[n5]) * (z[n3] + z[n5])\n               + (y[n3] + y[n5]) * (z[n2] + z[n5]),\n          oy = - (x[n1] + x[n2]) * (z[n0] + z[n1])\n               + (x[n0] + x[n1]) * (z[n1] + z[n2])\n               - (x[n0] + x[n4]) * (z[n3] + z[n4])\n               + (x[n3] + x[n4]) * (z[n0] + z[n4])\n               + (x[n2] + x[n5]) * (z[n3] + z[n5])\n               - (x[n3] + x[n5]) * (z[n2] + z[n5]),\n          oz = - (y[n1] + y[n2]) * (x[n0] + x[n1])\n               + (y[n0] + y[n1]) * (x[n1] + x[n2])\n               - (y[n0] + y[n4]) * (x[n3] + x[n4])\n               + (y[n3] + y[n4]) * (x[n0] + x[n4])\n               + (y[n2] + y[n5]) * (x[n3] + x[n5])\n               - (y[n3] + y[n5]) * (x[n2] + x[n5]);\n\n    return (ox/12.0, oy/12.0, oz/12.0);\n  }\n\n  var dvdx, dvdy, dvdz: 8*real;\n\n  (dvdx[1], dvdy[1], dvdz[1]) = VoluDer(2,3,4,5,6,8);\n  (dvdx[4], dvdy[4], dvdz[4]) = VoluDer(1,2,3,8,5,7);\n  (dvdx[3], dvdy[3], dvdz[3]) = VoluDer(4,1,2,7,8,6);\n  (dvdx[2], dvdy[2], dvdz[2]) = VoluDer(3,4,1,6,7,5);\n  (dvdx[5], dvdy[5], dvdz[5]) = VoluDer(8,7,6,1,4,2);\n  (dvdx[6], dvdy[6], dvdz[6]) = VoluDer(5,8,7,2,1,3);\n  (dvdx[7], dvdy[7], dvdz[7]) = VoluDer(6,5,8,3,2,4);\n  (dvdx[8], dvdy[8], dvdz[8]) = VoluDer(7,6,5,4,3,1);\n\n  return (dvdx, dvdy, dvdz);\n}\n\ninline proc CalcElemFBHourglassForce(xd: 8*real, yd: 8*real, zd: 8*real,\n                                     hourgam: 8*(4*real),\n                                     coefficient: real,\n                                     ref hgfx: 8*real,\n                                     ref hgfy: 8*real,\n                                     ref hgfz: 8*real) {\n  var hx, hy, hz: 4*real;\n\n  // reduction\n  for i in 1..4 {\n    for j in 1..8 {\n      hx[i] += hourgam[j][i] * xd[j];\n      hy[i] += hourgam[j][i] * yd[j];\n      hz[i] += hourgam[j][i] * zd[j];\n    }\n  }\n\n  for i in 1..8 {\n    var shx, shy, shz: real;\n    for j in 1..4 {\n      shx += hourgam[i][j] * hx[j];\n      shy += hourgam[i][j] * hy[j];\n      shz += hourgam[i][j] * hz[j];\n    }\n    hgfx[i] = coefficient * shx;\n    hgfy[i] = coefficient * shy;\n    hgfz[i] = coefficient * shz;\n  }\n}\n\n\nproc CalcElemCharacteristicLength(x, y, z, volume) {\n  proc AreaFace(param p0, param p1, param p2, param p3) {\n    const fx = (x[p2] - x[p0]) - (x[p3] - x[p1]),\n          fy = (y[p2] - y[p0]) - (y[p3] - y[p1]),\n          fz = (z[p2] - z[p0]) - (z[p3] - z[p1]),\n          gx = (x[p2] - x[p0]) + (x[p3] - x[p1]),\n          gy = (y[p2] - y[p0]) + (y[p3] - y[p1]),\n          gz = (z[p2] - z[p0]) + (z[p3] - z[p1]),\n          area = (fx * fx + fy * fy + fz * fz) *\n                 (gx * gx + gy * gy + gz * gz) -\n                 (fx * gx + fy * gy + fz * gz) *\n                 (fx * gx + fy * gy + fz * gz);\n\n    return area ;\n  }\n\n  const charLength = max(AreaFace(1, 2, 3, 4),\n                         AreaFace(5, 6, 7, 8),\n                         AreaFace(1, 2, 6, 5),\n                         AreaFace(2, 3, 7, 6),\n                         AreaFace(3, 4, 8, 7),\n                         AreaFace(4, 1, 5, 8));\n\n  return 4.0 * volume / sqrt(charLength);\n}\n\n\nproc CalcElemVelocityGradient(xvel, yvel, zvel, pfx,  pfy, pfz,\n                              detJ, ref d: 6*real) {\n  const inv_detJ = 1.0 / detJ;\n\n  d[1] = inv_detJ * ( pfx[1] * (xvel[1]-xvel[7])\n                    + pfx[2] * (xvel[2]-xvel[8])\n                    + pfx[3] * (xvel[3]-xvel[5])\n                    + pfx[4] * (xvel[4]-xvel[6]) );\n  d[2] = inv_detJ * ( pfy[1] * (yvel[1]-yvel[7])\n                    + pfy[2] * (yvel[2]-yvel[8])\n                    + pfy[3] * (yvel[3]-yvel[5])\n                    + pfy[4] * (yvel[4]-yvel[6]) );\n  d[3] = inv_detJ * ( pfz[1] * (zvel[1]-zvel[7])\n                    + pfz[2] * (zvel[2]-zvel[8])\n                    + pfz[3] * (zvel[3]-zvel[5])\n                    + pfz[4] * (zvel[4]-zvel[6]) );\n\n  const dyddx  = inv_detJ * ( pfx[1] * (yvel[1]-yvel[7])\n                            + pfx[2] * (yvel[2]-yvel[8])\n                            + pfx[3] * (yvel[3]-yvel[5])\n                            + pfx[4] * (yvel[4]-yvel[6]) ),\n\n        dxddy  = inv_detJ * ( pfy[1] * (xvel[1]-xvel[7])\n                            + pfy[2] * (xvel[2]-xvel[8])\n                            + pfy[3] * (xvel[3]-xvel[5])\n                            + pfy[4] * (xvel[4]-xvel[6]) ),\n\n        dzddx  = inv_detJ * ( pfx[1] * (zvel[1]-zvel[7])\n                            + pfx[2] * (zvel[2]-zvel[8])\n                            + pfx[3] * (zvel[3]-zvel[5])\n                            + pfx[4] * (zvel[4]-zvel[6]) ),\n\n        dxddz  = inv_detJ * ( pfz[1] * (xvel[1]-xvel[7])\n                            + pfz[2] * (xvel[2]-xvel[8])\n                            + pfz[3] * (xvel[3]-xvel[5])\n                            + pfz[4] * (xvel[4]-xvel[6]) ),\n\n        dzddy  = inv_detJ * ( pfy[1] * (zvel[1]-zvel[7])\n                            + pfy[2] * (zvel[2]-zvel[8])\n                            + pfy[3] * (zvel[3]-zvel[5])\n                            + pfy[4] * (zvel[4]-zvel[6]) ),\n\n        dyddz  = inv_detJ * ( pfz[1] * (yvel[1]-yvel[7])\n                            + pfz[2] * (yvel[2]-yvel[8])\n                            + pfz[3] * (yvel[3]-yvel[5])\n                            + pfz[4] * (yvel[4]-yvel[6]) );\n\n  d[6]  = 0.5 * ( dxddy + dyddx );\n  d[5]  = 0.5 * ( dxddz + dzddx );\n  d[4]  = 0.5 * ( dzddy + dyddz );\n}\n\n\nproc CalcPressureForElems(p_new: [?D] real, bvc, pbvc, \n                          e_old, compression, vnewc,\n                          pmin: real, p_cut: real, eosvmax: real) {\n\n  //\n  // TODO: Uncomment local once sparse domain is distributed\n  //\n  forall i in D /* do local */ {\n    const c1s = 2.0 / 3.0;\n    bvc[i] = c1s * (compression[i] + 1.0);\n    pbvc[i] = c1s;\n  }\n\n  forall i in D {\n    p_new[i] = bvc[i] * e_old[i];\n\n    if abs(p_new[i]) < p_cut then p_new[i] = 0.0;\n    if vnewc[i] >= eosvmax then p_new[i] = 0.0; //impossible?\n    if p_new[i] < pmin then p_new[i] = pmin;\n  }\n}\n\n\nproc TimeIncrement() {\n  var targetdt = stoptime - time;\n\n  if dtfixed <= 0.0 && cycle != 0 { //don't do this the first cycle\n    var olddt = deltatime,\n        newdt = 1.0e20;\n\n    if dtcourant < newdt then newdt = dtcourant / 2.0;\n    if dthydro < newdt then   newdt = 2.0/3.0 * dthydro;\n\n    const ratio = newdt / olddt;\n    if ratio >= 1.0 {\n      if ratio < deltatimemultlb then      newdt = olddt;\n      else if ratio > deltatimemultub then newdt = olddt * deltatimemultub;\n    }\n    if newdt > dtmax then newdt = dtmax;\n\n    deltatime = newdt;\n  }\n\n  /* TRY TO PREVENT VERY SMALL SCALING ON THE NEXT CYCLE */\n  if targetdt > deltatime && targetdt < (4.0/3.0 * deltatime) {\n    targetdt = 2.0/3.0 * deltatime;\n  }\n  if targetdt < deltatime then deltatime = targetdt;\n\n  time += deltatime;\n  cycle += 1;\n}\n\ninline proc LagrangeLeapFrog() {\n  /* calculate nodal forces, accelerations, velocities, positions, with\n   * applied boundary conditions and slide surface considerations */\n  LagrangeNodal();\n\n  /* calculate element quantities (i.e. velocity gradient & q), and update\n   * material states */\n  LagrangeElements();\n\n  CalcTimeConstraintsForElems();\n}\n\n\ninline proc LagrangeNodal() {\n  CalcForceForNodes();\n\n  CalcAccelerationForNodes();\n\n  ApplyAccelerationBoundaryConditionsForNodes();\n\n  CalcVelocityForNodes(deltatime, u_cut);\n\n  CalcPositionForNodes(deltatime);\n}\n\n\ninline proc LagrangeElements() {\n  CalcLagrangeElements();\n\n  /* Calculate Q.  (Monotonic q option requires communication) */\n  CalcQForElems();\n\n  ApplyMaterialPropertiesForElems();\n\n  UpdateVolumesForElems();\n}\n\n\ninline proc CalcTimeConstraintsForElems() {\n  /* evaluate time constraint */\n  CalcCourantConstraintForElems();\n\n  /* check hydro constraint */\n  CalcHydroConstraintForElems();\n}\n\n\ninline proc computeDTF(indx) {\n  const myvdov = vdov[indx];\n\n  if myvdov == 0.0 then\n    return max(real);\n\n  const myarealg = arealg[indx];\n  var dtf = ss[indx]**2;\n  if myvdov < 0.0 then\n    dtf += qqc2 * myarealg**2 * myvdov**2;\n  dtf = sqrt(dtf);\n  dtf = myarealg / dtf;\n\n  return dtf;\n}\n\n\nproc CalcCourantConstraintForElems() {\n  const val = min reduce [indx in MatElems] computeDTF(indx);\n\n  if (val != max(real)) then\n    dtcourant = val;\n}\n\n\ninline proc calcDtHydroTmp(indx) {\n  const myvdov = vdov[indx];\n  if (myvdov == 0.0) then\n    return max(real);\n  else\n    return dvovmax / (abs(myvdov)+1.0e-20);\n}\n\n\nproc CalcHydroConstraintForElems() {\n  const val = min reduce [indx in MatElems] calcDtHydroTmp(indx);\n\n  if (val != max(real)) then\n    dthydro = val;\n}\n\n\n/* calculate nodal forces, accelerations, velocities, positions, with\n * applied boundary conditions and slide surface considerations */\n\nproc CalcForceForNodes() {\n  //zero out all forces\n  forall x in fx do x.write(0);\n  forall y in fy do y.write(0);\n  forall z in fz do z.write(0);\n\n  /* Calcforce calls partial, force, hourq */\n  CalcVolumeForceForElems();\n\n  /* Calculate Nodal Forces at domain boundaries */\n  // this was commented out in C++ code, so left out here\n}\n\nproc CalcVolumeForceForElems() {\n  var sigxx, sigyy, sigzz, determ: [Elems] real;\n\n  /* Sum contributions to total stress tensor */\n  InitStressTermsForElems(p, q, sigxx, sigyy, sigzz);\n\n  /* call elemlib stress integration loop to produce nodal forces from\n     material stresses. */\n  IntegrateStressForElems(sigxx, sigyy, sigzz, determ);\n\n  /* check for negative element volume */\n  forall e in Elems {\n    if determ[e] <= 0.0 then\n      halt(\"can't have negative volume (determ[\", e, \"]=\", determ[e], \")\");\n  }\n\n  CalcHourglassControlForElems(determ);\n}\n\n\nproc IntegrateStressForElems(sigxx, sigyy, sigzz, determ) {\n  forall k in Elems {\n    var b_x, b_y, b_z: 8*real;\n    var x_local, y_local, z_local: 8*real;\n    localizeNeighborNodes(k, x, x_local, y, y_local, z, z_local);\n\n    var fx_local, fy_local, fz_local: 8*real;\n\n    local {\n      /* Volume calculation involves extra work for numerical consistency. */\n      CalcElemShapeFunctionDerivatives(x_local, y_local, z_local, \n                                       b_x, b_y, b_z, determ[k]);\n    \n      CalcElemNodeNormals(b_x, b_y, b_z, x_local, y_local, z_local);\n\n      SumElemStressesToNodeForces(b_x, b_y, b_z, sigxx[k], sigyy[k], sigzz[k], \n                                  fx_local, fy_local, fz_local);\n    }\n\n    for (noi, t) in elemToNodesTuple(k) {\n      fx[noi].add(fx_local[t]);\n      fy[noi].add(fy_local[t]);\n      fz[noi].add(fz_local[t]);\n    }\n  }\n}\n\n\nproc CalcHourglassControlForElems(determ) {\n  var dvdx, dvdy, dvdz, x8n, y8n, z8n: [Elems] 8*real;\n\n  forall eli in Elems {\n    /* Collect domain nodes to elem nodes */\n    var x1, y1, z1: 8*real;\n    localizeNeighborNodes(eli, x, x1, y, y1, z, z1);\n    var pfx, pfy, pfz: 8*real;\n\n    local {\n      /* load into temporary storage for FB Hour Glass control */\n      (dvdx[eli], dvdy[eli], dvdz[eli]) = CalcElemVolumeDerivative(x1, y1, z1);\n    }\n\n    x8n[eli]  = x1;\n    y8n[eli]  = y1;\n    z8n[eli]  = z1;\n\n    determ[eli] = volo[eli] * v[eli];\n  }\n\n  /* Do a check for negative volumes */\n  forall e in Elems {\n    if v[e] <= 0.0 then\n      halt(\"can't have negative (or zero) volume. (in Hourglass, v[\", e, \"]=\", v[e], \")\");\n  }\n\n  if hgcoef > 0.0 {\n    CalcFBHourglassForceForElems(determ, x8n, y8n, z8n, dvdx, dvdy, dvdz);\n  }\n}\n\n\nconst gammaCoef: 4*(8*real) = // WAS: [1..4, 1..8] real = \n                (( 1.0,  1.0, -1.0, -1.0, -1.0, -1.0,  1.0,  1.0),\n                 ( 1.0, -1.0, -1.0,  1.0, -1.0,  1.0,  1.0, -1.0),\n                 ( 1.0, -1.0,  1.0, -1.0,  1.0, -1.0,  1.0, -1.0),\n                 (-1.0,  1.0, -1.0,  1.0,  1.0, -1.0,  1.0, -1.0));\n\n/* Calculates the Flanagan-Belytschko anti-hourglass force. */\nproc CalcFBHourglassForceForElems(determ, x8n, y8n, z8n, dvdx, dvdy, dvdz) {\n\n  /* compute the hourglass modes */\n  forall eli in Elems {\n    var hourgam: 8*(4*real);\n    const volinv = 1.0 / determ[eli];\n    var ss1, mass1, volume13: real;\n    var hgfx, hgfy, hgfz: 8*real;\n    var coefficient: real;\n\n    var xd1, yd1, zd1: 8*real;\n    localizeNeighborNodes(eli, xd, xd1, yd, yd1, zd, zd1);\n\n    /* TODO: Can we enable this local block? */\n    // local {\n      for i in 1..4 {\n        var hourmodx, hourmody, hourmodz: real;\n        // reduction\n        for j in 1..8 {\n          hourmodx += x8n[eli][j] * gammaCoef[i][j];\n          hourmody += y8n[eli][j] * gammaCoef[i][j];\n          hourmodz += z8n[eli][j] * gammaCoef[i][j];\n        }\n\n        for j in 1..8 {\n          hourgam[j][i] = gammaCoef[i][j] - volinv * \n            (dvdx[eli][j] * hourmodx +\n             dvdy[eli][j] * hourmody +\n             dvdz[eli][j] * hourmodz);\n        }\n      }\n\n      /* compute forces */\n      /* store forces into h arrays (force arrays) */\n      ss1 = ss[eli];\n      mass1 = elemMass[eli];\n      volume13 = cbrt(determ[eli]);\n\n      coefficient = - hgcoef * 0.01 * ss1 * mass1 / volume13;\n\n      CalcElemFBHourglassForce(xd1, yd1, zd1, hourgam, coefficient,\n                               hgfx, hgfy, hgfz);\n      // } // end local\n\n    for (noi,i) in elemToNodesTuple(eli) {\n      fx[noi].add(hgfx[i]);\n      fy[noi].add(hgfy[i]);\n      fz[noi].add(hgfz[i]);\n    }\n  }\n}\n\n\nproc CalcAccelerationForNodes() {\n  forall noi in Nodes do local {\n      xdd[noi] = fx[noi].read() / nodalMass[noi];\n      ydd[noi] = fy[noi].read() / nodalMass[noi];\n      zdd[noi] = fz[noi].read() / nodalMass[noi];\n    }\n}\n\n\nproc ApplyAccelerationBoundaryConditionsForNodes() {\n  // TODO: Shouldn't we be able to write these as follows?\n  //\n  // xdd[XSym] = 0.0;\n  // ydd[YSym] = 0.0;\n  // zdd[ZSym] = 0.0;\n  \n  forall x in XSym do xdd[x] = 0.0;\n  forall y in YSym do ydd[y] = 0.0;\n  forall z in ZSym do zdd[z] = 0.0;\n}\n\n\nproc CalcVelocityForNodes(dt: real, u_cut: real) {\n  forall i in Nodes do local {\n    var xdtmp = xd[i] + xdd[i] * dt,\n        ydtmp = yd[i] + ydd[i] * dt,\n        zdtmp = zd[i] + zdd[i] * dt;\n    if abs(xdtmp) < u_cut then xdtmp = 0.0;\n    if abs(ydtmp) < u_cut then ydtmp = 0.0;\n    if abs(zdtmp) < u_cut then zdtmp = 0.0;\n    xd[i] = xdtmp;\n    yd[i] = ydtmp;\n    zd[i] = zdtmp;\n  }\n}\n\n\nproc CalcPositionForNodes(dt: real) {\n  forall ijk in Nodes {\n    x[ijk] += xd[ijk] * dt;\n    y[ijk] += yd[ijk] * dt;\n    z[ijk] += zd[ijk] * dt;\n  }\n}\n\n// sungeun: Temporary array reused throughout\nproc CalcLagrangeElements() {\n  var dxx, dyy, dzz: [Elems] real;\n\n  CalcKinematicsForElems(dxx, dyy, dzz, deltatime);\n\n  // element loop to do some stuff not included in the elemlib function.\n  forall k in Elems do local {\n    vdov[k] = dxx[k] + dyy[k] + dzz[k];\n    var vdovthird = vdov[k] / 3.0;\n    dxx[k] -= vdovthird;\n    dyy[k] -= vdovthird;\n    dzz[k] -= vdovthird;\n  }\n\n  // See if any volumes are negative, and take appropriate action.\n  forall e in Elems {\n    if vnew[e] <= 0.0 then\n      halt(\"can't have negative volume (vnew[\", e, \"]=\", vnew[e], \")\");\n  }\n}\n\n\nproc CalcKinematicsForElems(dxx, dyy, dzz, const dt: real) {\n  // loop over all elements\n  forall k in Elems {\n    var b_x, b_y, b_z: 8*real,\n        d: 6*real,\n        detJ: real;\n\n    //get nodal coordinates from global arrays and copy into local arrays\n    var x_local, y_local, z_local: 8*real;\n    localizeNeighborNodes(k, x, x_local, y, y_local, z, z_local);\n\n    //get nodal velocities from global arrays and copy into local arrays\n    var xd_local, yd_local, zd_local: 8*real;\n    localizeNeighborNodes(k, xd, xd_local, yd, yd_local, zd, zd_local);\n    var dt2 = 0.5 * dt; //wish this was local, too...\n\n    local {\n      //volume calculations\n      const volume = CalcElemVolume(x_local, y_local, z_local);\n      const relativeVolume = volume / volo[k];\n      vnew[k] = relativeVolume;\n      delv[k] = relativeVolume - v[k];\n\n      //set characteristic length\n      arealg[k] = CalcElemCharacteristicLength(x_local, y_local, z_local,\n                                               volume);\n\n      for i in 1..8 {\n        x_local[i] -= dt2 * xd_local[i];\n        y_local[i] -= dt2 * yd_local[i];\n        z_local[i] -= dt2 * zd_local[i];\n      }\n\n      CalcElemShapeFunctionDerivatives(x_local, y_local, z_local,\n                                       b_x, b_y, b_z, detJ);\n\n      CalcElemVelocityGradient(xd_local, yd_local, zd_local, b_x, b_y, b_z,\n                               detJ, d);\n\n    }\n\n    // put velocity gradient quantities into their global arrays.\n    dxx[k] = d[1];\n    dyy[k] = d[2];\n    dzz[k] = d[3];\n  }\n}\n\n\n// sungeun: Temporary array reused throughout\n/* velocity gradient */\nvar delv_xi, delv_eta, delv_zeta: [Elems] real;\n/* position gradient */\nvar delx_xi, delx_eta, delx_zeta: [Elems] real;\n\nproc CalcQForElems() {\n  // MONOTONIC Q option\n\n  /* Calculate velocity gradients */\n  CalcMonotonicQGradientsForElems(delv_xi, delv_eta, delv_zeta, \n                                  delx_xi, delx_eta, delx_zeta);\n\n  /* Transfer veloctiy gradients in the first order elements */\n  /* problem->commElements->Transfer(CommElements::monoQ) ; */\n  CalcMonotonicQForElems(delv_xi, delv_eta, delv_zeta,\n                         delx_xi, delx_eta, delx_zeta);\n\n  /* Don't allow excessive artificial viscosity */\n  forall e in Elems {\n    if q[e] > qstop then\n      halt(\"Excessive artificial viscosity!  (q[\", e, \"]=\", q[e], \")\");\n  }\n}\n\n\n// sungeun: Temporary array reused throughout\nvar vnewc: [MatElems] real;\n\n/* Expose all of the variables needed for material evaluation */\nproc ApplyMaterialPropertiesForElems() {\n\n  forall i in MatElems do vnewc[i] = vnew[i];\n\n  if eosvmin != 0.0 then\n    [c in vnewc] if c < eosvmin then c = eosvmin;\n\n  if eosvmax != 0.0 then\n    [c in vnewc] if c > eosvmax then c = eosvmax;\n\n\n  // old comment: The following loop should compute min/max reductions;\n  // currently, race-y\n\n  forall matelm in MatElems {\n    var vc = v[matelm];\n    if eosvmin != 0.0 && vc < eosvmin then vc = eosvmin;\n    if eosvmax != 0.0 && vc > eosvmax then vc = eosvmax;\n    if vc <= 0.0 {\n      writeln(\"Volume error (in ApplyMaterialProperiesForElems).\");\n      exit(1);\n    }\n  }\n\n  EvalEOSForElems(vnewc);\n}\n\n\nproc UpdateVolumesForElems() {\n  forall i in Elems do local {\n    var tmpV = vnew[i];\n    if abs(tmpV-1.0) < v_cut then tmpV = 1.0;\n    v[i] = tmpV;\n  }\n}\n\n\nproc CalcMonotonicQGradientsForElems(delv_xi, delv_eta, delv_zeta, \n                                     delx_xi, delx_eta, delx_zeta) {\n  forall eli in Elems {\n    const ptiny = 1.0e-36;\n    var xl, yl, zl: 8*real;\n    localizeNeighborNodes(eli, x, xl, y, yl, z, zl);\n    var xvl, yvl, zvl: 8*real;\n    localizeNeighborNodes(eli, xd, xvl, yd, yvl, zd, zvl);\n\n    local {\n      const vol = volo[eli] * vnew[eli],\n            norm = 1.0 / (vol + ptiny);\n      var ax, ay, az, dxv, dyv, dzv: real;\n\n      const dxj = -0.25*((xl[1]+xl[2]+xl[6]+xl[5])-(xl[4]+xl[3]+xl[7]+xl[8])),\n            dyj = -0.25*((yl[1]+yl[2]+yl[6]+yl[5])-(yl[4]+yl[3]+yl[7]+yl[8])),\n            dzj = -0.25*((zl[1]+zl[2]+zl[6]+zl[5])-(zl[4]+zl[3]+zl[7]+zl[8])),\n      \n            dxi =  0.25*((xl[2]+xl[3]+xl[7]+xl[6])-(xl[1]+xl[4]+xl[8]+xl[5])),\n            dyi =  0.25*((yl[2]+yl[3]+yl[7]+yl[6])-(yl[1]+yl[4]+yl[8]+yl[5])),\n            dzi =  0.25*((zl[2]+zl[3]+zl[7]+zl[6])-(zl[1]+zl[4]+zl[8]+zl[5])),\n        \n            dxk =  0.25*((xl[5]+xl[6]+xl[7]+xl[8])-(xl[1]+xl[2]+xl[3]+xl[4])),\n            dyk =  0.25*((yl[5]+yl[6]+yl[7]+yl[8])-(yl[1]+yl[2]+yl[3]+yl[4])),\n            dzk =  0.25*((zl[5]+zl[6]+zl[7]+zl[8])-(zl[1]+zl[2]+zl[3]+zl[4]));\n\n      /* find delvk and delxk ( i cross j ) */\n\n      ax = dyi*dzj - dzi*dyj;\n      ay = dzi*dxj - dxi*dzj;\n      az = dxi*dyj - dyi*dxj;\n\n      delx_zeta[eli] = vol / sqrt(ax*ax + ay*ay + az*az + ptiny);\n\n      ax *= norm;\n      ay *= norm;\n      az *= norm;\n\n      dxv = 0.25*((xvl[5]+xvl[6]+xvl[7]+xvl[8])-(xvl[1]+xvl[2]+xvl[3]+xvl[4]));\n      dyv = 0.25*((yvl[5]+yvl[6]+yvl[7]+yvl[8])-(yvl[1]+yvl[2]+yvl[3]+yvl[4]));\n      dzv = 0.25*((zvl[5]+zvl[6]+zvl[7]+zvl[8])-(zvl[1]+zvl[2]+zvl[3]+zvl[4]));\n\n      delv_zeta[eli] = ax*dxv + ay*dyv + az*dzv;\n\n      /* find delxi and delvi ( j cross k ) */\n\n      ax = dyj*dzk - dzj*dyk;\n      ay = dzj*dxk - dxj*dzk;\n      az = dxj*dyk - dyj*dxk;\n\n      delx_xi[eli] = vol / sqrt(ax*ax + ay*ay + az*az + ptiny) ;\n\n      ax *= norm;\n      ay *= norm;\n      az *= norm;\n\n      dxv = 0.25*((xvl[2]+xvl[3]+xvl[7]+xvl[6])-(xvl[1]+xvl[4]+xvl[8]+xvl[5]));\n      dyv = 0.25*((yvl[2]+yvl[3]+yvl[7]+yvl[6])-(yvl[1]+yvl[4]+yvl[8]+yvl[5]));\n      dzv = 0.25*((zvl[2]+zvl[3]+zvl[7]+zvl[6])-(zvl[1]+zvl[4]+zvl[8]+zvl[5]));\n\n      delv_xi[eli] = ax*dxv + ay*dyv + az*dzv ;\n\n      /* find delxj and delvj ( k cross i ) */\n\n      ax = dyk*dzi - dzk*dyi;\n      ay = dzk*dxi - dxk*dzi;\n      az = dxk*dyi - dyk*dxi;\n\n      delx_eta[eli] = vol / sqrt(ax*ax + ay*ay + az*az + ptiny) ;\n\n      ax *= norm;\n      ay *= norm;\n      az *= norm;\n\n      dxv= -0.25*((xvl[1]+xvl[2]+xvl[6]+xvl[5])-(xvl[4]+xvl[3]+xvl[7]+xvl[8]));\n      dyv= -0.25*((yvl[1]+yvl[2]+yvl[6]+yvl[5])-(yvl[4]+yvl[3]+yvl[7]+yvl[8]));\n      dzv= -0.25*((zvl[1]+zvl[2]+zvl[6]+zvl[5])-(zvl[4]+zvl[3]+zvl[7]+zvl[8]));\n\n      delv_eta[eli] = ax*dxv + ay*dyv + az*dzv ;\n    } /* local */\n  } /* forall eli */\n}\n\n\nproc CalcMonotonicQForElems(delv_xi, delv_eta, delv_zeta, \n                            delx_xi, delx_eta, delx_zeta) {\n  //got rid of call through to \"CalcMonotonicQRegionForElems\"\n\n  forall i in MatElems {\n    const ptiny = 1.0e-36;\n    const bcMask = elemBC[i];\n    var norm, delvm, delvp: real;\n\n    /* phixi */\n    norm = 1.0 / (delv_xi[i] + ptiny);\n\n    select bcMask & XI_M {\n      when 0         do delvm = delv_xi[lxim(i)];\n      when XI_M_SYMM do delvm = delv_xi[i];\n      when XI_M_FREE do delvm = 0.0;\n    }\n    select bcMask & XI_P {\n      when 0         do delvp = delv_xi[lxip(i)];\n      when XI_P_SYMM do delvp = delv_xi[i];\n      when XI_P_FREE do delvp = 0.0;\n    }\n\n    delvm *= norm;\n    delvp *= norm;\n\n    var phixi = 0.5 * (delvm + delvp);\n\n    delvm *= monoq_limiter_mult;\n    delvp *= monoq_limiter_mult;\n\n    if delvm < phixi           then phixi = delvm;\n    if delvp < phixi           then phixi = delvp;\n    if phixi < 0               then phixi = 0.0;\n    if phixi > monoq_max_slope then phixi = monoq_max_slope;\n\n    /* phieta */\n    norm = 1.0 / (delv_eta[i] + ptiny);\n\n    select bcMask & ETA_M {\n      when 0          do delvm = delv_eta[letam[i]];\n      when ETA_M_SYMM do delvm = delv_eta[i];      \n      when ETA_M_FREE do delvm = 0.0;      \n    }\n    select bcMask & ETA_P {\n      when 0          do delvp = delv_eta[letap[i]];\n      when ETA_P_SYMM do delvp = delv_eta[i];      \n      when ETA_P_FREE do delvp = 0.0;      \n    }\n\n    delvm = delvm * norm;\n    delvp = delvp * norm;\n\n    var phieta = 0.5 * (delvm + delvp);\n\n    delvm *= monoq_limiter_mult;\n    delvp *= monoq_limiter_mult;\n\n    if delvm  < phieta          then phieta = delvm;\n    if delvp  < phieta          then phieta = delvp;\n    if phieta < 0.0             then phieta = 0.0;\n    if phieta > monoq_max_slope then phieta = monoq_max_slope;\n\n    /*  phizeta     */\n    norm = 1.0 / (delv_zeta[i] + ptiny);\n\n    select bcMask & ZETA_M {\n      when 0           do delvm = delv_zeta[lzetam[i]];\n      when ZETA_M_SYMM do delvm = delv_zeta[i];       \n      when ZETA_M_FREE do delvm = 0.0;        \n    }\n    select bcMask & ZETA_P {\n      when 0           do delvp = delv_zeta[lzetap[i]];\n      when ZETA_P_SYMM do delvp = delv_zeta[i];       \n      when ZETA_P_FREE do delvp = 0.0;        \n    }\n\n    delvm = delvm * norm;\n    delvp = delvp * norm;\n\n    var phizeta = 0.5 * (delvm + delvp);\n\n    delvm *= monoq_limiter_mult;\n    delvp *= monoq_limiter_mult;\n\n    if delvm   < phizeta          then phizeta = delvm;\n    if delvp   < phizeta         then phizeta = delvp;\n    if phizeta < 0.0                 then phizeta = 0.0;\n    if phizeta > monoq_max_slope then phizeta = monoq_max_slope;\n\n    /* Remove length scale */\n    var qlin, qquad: real;\n    if vdov[i] > 0.0 {\n      qlin  = 0.0;\n      qquad = 0.0;\n    } else {\n      var delvxxi   = delv_xi[i]   * delx_xi[i],\n          delvxeta  = delv_eta[i]  * delx_eta[i],\n          delvxzeta = delv_zeta[i] * delx_zeta[i];\n\n      if delvxxi   > 0.0 then delvxxi   = 0.0;\n      if delvxeta  > 0.0 then delvxeta  = 0.0;\n      if delvxzeta > 0.0 then delvxzeta = 0.0;\n\n      const rho = elemMass[i] / (volo[i] * vnew[i]);\n\n      qlin = -qlc_monoq * rho *\n        ( delvxxi   * (1.0 - phixi) +\n          delvxeta  * (1.0 - phieta) +\n          delvxzeta * (1.0 - phizeta));\n\n      qquad = qqc_monoq * rho *\n        ( delvxxi**2   * (1.0 - phixi**2) +\n          delvxeta**2  * (1.0 - phieta**2) +\n          delvxzeta**2 * (1.0 - phizeta**2));\n    }\n    qq[i] = qquad;\n    ql[i] = qlin;\n\n  }\n}\n\n\nproc EvalEOSForElems(vnewc) {\n  const rho0 = refdens;\n\n  var e_old, delvc, p_old, q_old, compression, compHalfStep, \n    qq_old, ql_old, work, p_new, e_new, q_new, bvc, pbvc: [Elems] real;\n\n  /* compress data, minimal set */\n  forall i in MatElems {\n    e_old[i]  = e[i];\n    delvc[i]  = delv[i];\n    p_old[i]  = p[i];\n    q_old[i]  = q[i];\n    qq_old[i] = qq[i];\n    ql_old[i] = ql[i];\n  }\n\n  //\n  // TODO: Uncomment local once sparse domain is distributed\n  //\n  forall i in Elems /* do local */ {\n    compression[i] = 1.0 / vnewc[i] - 1.0;\n    const vchalf = vnewc[i] - delvc[i] * 0.5;\n    compHalfStep[i] = 1.0 / vchalf - 1.0;\n  }\n\n  /* Check for v > eosvmax or v < eosvmin */\n  // (note: I think this was already checked for in calling function!)\n  if eosvmin != 0.0 {\n    forall i in Elems {\n      if vnewc[i] <= eosvmin then compHalfStep[i] = compression[i];\n    }\n  }\n  if eosvmax != 0.0 {\n    forall i in Elems {\n      if vnewc[i] >= eosvmax {\n        p_old[i] = 0.0;\n        compression[i] = 0.0;\n        compHalfStep[i] = 0.0;\n      }\n    }\n  }\n\n  CalcEnergyForElems(p_new, e_new, q_new, bvc, pbvc, \n                     p_old, e_old, q_old, compression, compHalfStep, \n                     vnewc, work, delvc, qq_old, ql_old);\n\n  forall i in MatElems {\n    p[i] = p_new[i];\n    e[i] = e_new[i];\n    q[i] = q_new[i];\n  }\n\n  CalcSoundSpeedForElems(vnewc, rho0, e_new, p_new, pbvc, bvc);\n}\n\n\nproc CalcEnergyForElems(p_new, e_new, q_new, bvc, pbvc,\n                        p_old, e_old, q_old, compression, compHalfStep, \n                        vnewc, work, delvc, qq_old, ql_old) {\n  // TODO: might need to move these consts into foralls or global\n  // Otherwise, they live on Locale0 and everyone else has to do \n  // remote reads.  OR: Check if they're remote value forwarded.\n  const rho0 = refdens; \n  const sixth = 1.0 / 6.0;\n\n  var pHalfStep: [MatElems] real;\n\n  forall i in Elems {\n    e_new[i] = e_old[i] - 0.5 * delvc[i] * (p_old[i] + q_old[i]) \n                        + 0.5 * work[i];\n    if e_new[i] < emin then e_new[i] = emin;\n  }\n\n  CalcPressureForElems(pHalfStep, bvc, pbvc, e_new, compHalfStep,\n                       vnewc, pmin, p_cut, eosvmax);\n\n  forall i in Elems {\n    const vhalf = 1.0 / (1.0 + compHalfStep[i]);\n\n    if delvc[i] > 0.0 {\n      q_new[i] = 0.0;\n    } else {\n      var ssc = (pbvc[i] * e_new[i] + vhalf**2 * bvc[i] * pHalfStep[i]) / rho0;\n      if ssc <= 0.0 then ssc = 0.333333e-36;\n      else ssc = sqrt(ssc);\n      q_new[i] = ssc * ql_old[i] + qq_old[i];\n    }\n\n    e_new[i] += 0.5 * delvc[i]\n      * (3.0*(p_old[i] + q_old[i]) - 4.0*(pHalfStep[i] + q_new[i]));\n  }\n  forall i in Elems {\n    e_new[i] += 0.5 * work[i];\n    if abs(e_new[i] < e_cut) then e_new[i] = 0.0;\n    if e_new[i] < emin then e_new[i] = emin;\n  }\n\n  CalcPressureForElems(p_new, bvc, pbvc, e_new, compression, vnewc, pmin,\n                       p_cut, eosvmax);\n\n  forall i in Elems {\n    var q_tilde:real;\n\n    if delvc[i] > 0.0 {\n      q_tilde = 0.0;\n    } else {\n      var ssc = (pbvc[i] * e_new[i] + vnewc[i]**2 * bvc[i] * p_new[i] ) / rho0;\n      if ssc <= 0.0 then ssc = 0.333333e-36;\n      else ssc = sqrt(ssc);\n      q_tilde = ssc * ql_old[i] + qq_old[i];\n    }\n\n    e_new[i] -= (7.0*(p_old[i] + q_old[i]) \n                 - 8.0*(pHalfStep[i] + q_new[i]) \n                 + (p_new[i] + q_tilde)) * delvc[i] * sixth;\n    if abs(e_new[i]) < e_cut then e_new[i] = 0.0;\n    if e_new[i] < emin then e_new[i] = emin;\n  }\n\n  CalcPressureForElems(p_new, bvc, pbvc, e_new, compression, vnewc, pmin,\n                       p_cut, eosvmax);\n\n\n  //\n  // TODO: Uncomment local once sparse domain is distributed\n  //\n  forall i in Elems /* do local */ {\n    if delvc[i] <= 0.0 {\n      var ssc = (pbvc[i] * e_new[i] + vnewc[i]**2 * bvc[i] * p_new[i] ) / rho0;\n      if ssc <= 0.0 then ssc = 0.333333e-36;\n                    else ssc = sqrt(ssc);\n      q_new[i] = ssc * ql_old[i] + qq_old[i];\n      if abs(q_new[i]) < q_cut then q_new[i] = 0.0;\n    }\n  }\n}\n\n\nproc CalcSoundSpeedForElems(vnewc, rho0:real, enewc, pnewc, pbvc, bvc) {\n  // TODO: Open question: If we had multiple materials, should (a) ss\n  // be zeroed and accumulated into, and (b) updated atomically to\n  // avoid losing updates?  (Jeff will go back and think on this)\n  //\n  forall i in MatElems {\n    var ssTmp = (pbvc[i] * enewc[i] + vnewc[i]**2 * bvc[i] * pnewc[i]) / rho0;\n    if ssTmp <= 1.111111e-36 then ssTmp = 1.111111e-36;\n    ss[i] = sqrt(ssTmp);\n  }\n}\n\n\niter elemToNodes(elem) {\n  for i in 1..nodesPerElem do\n    yield elemToNode[elem][i];\n}\n                                 \niter elemToNodesTuple(e) {\n  for i in 1..nodesPerElem do\n    yield (elemToNode[e][i], i);\n}\n\n\nproc deprint(title:string, x:[?D] real, y:[D] real, z:[D] real) {\n  writeln(title);\n  for i in D do\n    writef(\"%3i: %3.4er %3.4er %3.4er\\n\", \n           if use3DRepresentation then idx3DTo1D(i, D.dim(1).size) else i, \n           x[i], y[i], z[i]);\n}\n\n\nproc deprintatomic(title:string, x:[?D] atomic real, y:[] atomic real, z:[] atomic real) {\n  writeln(title);\n  for i in D do\n    writef(\"%3i: %3.4er %3.4er %3.4er\\n\", \n           if use3DRepresentation then idx3DTo1D(i, D.dim(1).size) else i, \n           x[i].peek(), y[i].peek(), z[i].peek());\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Chapel/nbody.chpl",
    "content": "/* The Computer Language Benchmarks Game\n   http://benchmarksgame.alioth.debian.org/\n\n   contributed by Albert Sidelnik\n   modified by Brad Chamberlain\n*/\n\n\n//\n// The number of timesteps to simulate; may be set via the command-line\n//\nconfig const n = 10000;\n\n//\n// Constants representing pi, the solar mass, and the number of days per year\n//\nconst pi = 3.141592653589793,\n      solarMass = 4 * pi**2,\n      daysPerYear = 365.24;\n\n//\n// a record representing one of the bodies in the solar system\n//\nrecord body {\n  var pos: 3*real;\n  var v: 3*real;\n  var mass: real;  // does not change after it is set up\n}\n\n//\n// the array of bodies that we'll be simulating\n//\nvar bodies = [/* sun */\n              new body(mass = solarMass),\n\n              /* jupiter */\n              new body(pos = ( 4.84143144246472090e+00,\n                              -1.16032004402742839e+00,\n                              -1.03622044471123109e-01),\n                         v = ( 1.66007664274403694e-03 * daysPerYear,\n                               7.69901118419740425e-03 * daysPerYear,\n                              -6.90460016972063023e-05 * daysPerYear),\n                      mass =   9.54791938424326609e-04 * solarMass),\n  \n              /* saturn */\n              new body(pos = ( 8.34336671824457987e+00,\n                               4.12479856412430479e+00,\n                              -4.03523417114321381e-01),\n                         v = (-2.76742510726862411e-03 * daysPerYear,\n                               4.99852801234917238e-03 * daysPerYear,\n                               2.30417297573763929e-05 * daysPerYear),\n                      mass =   2.85885980666130812e-04 * solarMass),\n\n              /* uranus */\n              new body(pos = ( 1.28943695621391310e+01,\n                              -1.51111514016986312e+01,\n                              -2.23307578892655734e-01),\n                         v = ( 2.96460137564761618e-03 * daysPerYear,\n                               2.37847173959480950e-03 * daysPerYear,\n                              -2.96589568540237556e-05 * daysPerYear),\n                      mass =   4.36624404335156298e-05 * solarMass),\n\n              /* neptune */\n              new body(pos = ( 1.53796971148509165e+01,\n                              -2.59193146099879641e+01,\n                               1.79258772950371181e-01),\n                         v = ( 2.68067772490389322e-03 * daysPerYear,\n                               1.62824170038242295e-03 * daysPerYear,\n                              -9.51592254519715870e-05 * daysPerYear),\n                      mass =   5.15138902046611451e-05 * solarMass)\n              ];\n\n//\n// the number of bodies to be simulated\n//\nconst numbodies = bodies.numElements;\n\n//\n// The computation involves initializing the sun's velocity,\n// writing the initial energy, advancing the system through 'n'\n// timesteps, and writing the final energy.\n//\nproc main() {\n  initSun();\n\n  writef(\"%.9r\\n\", energy());\n  for 1..n do\n    advance(0.01);\n  writef(\"%.9r\\n\", energy());\n}\n\n//\n// compute the sun's initial velocity\n//\nproc initSun() {\n  const p = + reduce (for b in bodies do (b.v * b.mass));\n  bodies[1].v = -p / solarMass;\n}\n\n//\n// advance the positions and velocities of all the bodies\n//\nproc advance(dt) {\n  for i in 1..numbodies {\n    for j in i+1..numbodies {\n      updateVelocities(bodies[i], bodies[j]);\n      \n      inline proc updateVelocities(ref b1, ref b2) {\n        const dpos = b1.pos - b2.pos,\n               mag = dt / sqrt(sumOfSquares(dpos))**3;\n        \n        b1.v -= dpos * b2.mass * mag;\n        b2.v += dpos * b1.mass * mag;\n      }\n    }\n  }\n  \n  for b in bodies do\n    b.pos += dt * b.v;\n}\n\n//\n// compute the energy of the bodies\n//\nproc energy() {\n  var e = 0.0;\n  \n  for i in 1..numbodies {\n    const b1 = bodies[i];\n    \n    e += 0.5 * b1.mass * sumOfSquares(b1.v);\n    \n    for j in i+1..numbodies {\n      const b2 = bodies[j];\n      \n      e -= (b1.mass * b2.mass) / sqrt(sumOfSquares(b1.pos - b2.pos));\n    }\n  }\n  \n  return e;\n}\n\n//\n// a helper routine to compute the sum of squares of a 3-tuple's components\n//\ninline proc sumOfSquares(x)\n  return x(1)**2 + x(2)**2 + x(3)**2;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Chapel/quicksort.chpl",
    "content": "//\n// An example of a parallel quick sort implementation that uses\n// \"cobegin\" to make each recursive call in parallel and \"serial\" to\n// limit the number of threads.\n//\n\nuse Random, Time; // for random number generation and the Timer class\n\nvar timer: Timer; // to time the sort\n\nconfig var n: int = 2**15;      // the size of the array to be sorted\nconfig var thresh: int = 1;     // the recursive depth to serialize\nconfig var verbose: int = 0;    // print out this many elements in array\nconfig var timing: bool = true; // set timing to false to disable timer\n\nvar A: [1..n] real; // array of real numbers\n\n//\n// initialize array with random numbers\n//\nfillRandom(A);\n\n//\n// print out front of array if verbose flag is set\n//\nif verbose > 0 then\n  writeln(\"A[1..\", verbose, \"] = \", A[1..verbose]);\n\n//\n// start timer, call parallel quick sort routine, stop timer\n//\nif timing then timer.start();\npqsort(A, thresh);\nif timing then timer.stop();\n\n//\n// report sort time\n//\nif timing then writeln(\"sorted in \", timer.elapsed(), \" seconds\");\n\n//\n// print out front of array if verbose flag is set\n//   values should now be in sorted order\n//\nif verbose > 0 then\n  writeln(\"A[1..\", verbose, \"] = \", A[1..verbose]);\n\n//\n// verify that array is sorted or halt\n//\nfor i in 2..n do\n  if A(i) < A(i-1) then\n    halt(\"A(\", i-1, \") == \", A(i-1), \" > A(\", i, \") == \", A(i));\n\nwriteln(\"verification success\");\n\n//\n// pqsort -- parallel quick sort\n//\n//   arr: generic 1D array of values (real, int, ...)\n//   thresh: number of recursive calls to make before serializing\n//   low: lower bound of array to start sort at, defaults to whole array\n//   high: upper bound of array to stop sort at, defaults to whole array\n//\nproc pqsort(arr: [],\n           thresh: int,\n           low: int = arr.domain.low,\n           high: int = arr.domain.high) where arr.rank == 1 {\n\n  //\n  // base case: arr[low..high] is small enough to bubble sort\n  //\n  if high - low < 8 {\n    bubbleSort(arr, low, high);\n    return;\n  }\n\n  //\n  // determine pivot and partition arr[low..high]\n  //\n  const pivotVal = findPivot();\n  const pivotLoc = partition(pivotVal);\n\n  //\n  // make recursive calls to parallel quick sort each unsorted half of\n  // the array; if thresh is 0 or less, start executing conquer tasks\n  // serially\n  //\n  serial thresh <= 0 do cobegin {\n    pqsort(arr, thresh-1, low, pivotLoc-1);\n    pqsort(arr, thresh-1, pivotLoc+1, high);\n  }\n\n  //\n  // findPivot -- helper routine to find pivot value using simple\n  //              median-of-3 method, returns pivot value\n  //\n  proc findPivot() {\n    const mid = low + (high-low+1) / 2;\n\n    if arr(mid) < arr(low) then arr(mid) <=> arr(low);\n    if arr(high) < arr(low) then arr(high) <=> arr(low);\n    if arr(high) < arr(mid) then arr(high) <=> arr(mid);\n\n    const pivotVal = arr(mid);\n    arr(mid) = arr(high-1);\n    arr(high-1) = pivotVal;\n\n    return pivotVal;\n  }\n\n  //\n  // partition -- helper routine to partition array such that all\n  //              values less than pivot are to its left and all\n  //              values greater than pivot are to its right, returns\n  //              pivot location\n  //\n  proc partition(pivotVal) {\n    var ilo = low, ihi = high-1;\n    while (ilo < ihi) {\n      do { ilo += 1; } while arr(ilo) < pivotVal;\n      do { ihi -= 1; } while pivotVal < arr(ihi);\n      if (ilo < ihi) {\n        arr(ilo) <=> arr(ihi);\n      }\n    }\n    arr(high-1) = arr(ilo);\n    arr(ilo) = pivotVal;\n    return ilo;\n  }\n}\n\n//\n// bubbleSort -- bubble sort for base case of quick sort\n//\n//   arr: generic 1D array of values (real, int, ...)\n//   low: lower bound of array to start sort at\n//   high: upper bound of array to stop sort at\n//\nproc bubbleSort(arr: [], low: int, high: int) where arr.rank == 1 {\n  for i in low..high do\n    for j in low..high-1 do\n      if arr(j) > arr(j+1) then\n        arr(j) <=> arr(j+1);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Charity/example.ch",
    "content": "%\n%   Some very badly written Charity\n%\n\ndata LA(A) -> D = ss: A -> D\n                | ff: -> D.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Cirru/array.cirru",
    "content": "\nprint $ array\n  int 1\n  string 2\n\nprint $ array\n  int 1\n  array\n    int 2\n    string 3\n    array\n      string 4"
  },
  {
    "path": "src/test/resources/samples/langs/Cirru/block.cirru",
    "content": "\nset f $ block (a b c)\n  print a b c\n\ncall f (int 1) (int 2) (int 3)\n\nf (int 1) (int 2) (int 3)"
  },
  {
    "path": "src/test/resources/samples/langs/Cirru/bool.cirru",
    "content": "\nprint $ bool true\nprint $ bool false\nprint $ bool yes\nprint $ bool no\nprint $ bool 1\nprint $ bool 0"
  },
  {
    "path": "src/test/resources/samples/langs/Cirru/map.cirru",
    "content": "\nprint $ map\n  a $ int 5\n  b $ array (int 1) (int 2)\n  c $ map\n    int 1\n    array (int 4)\n\nset m $ map\n  a $ int 1\n\nset m b $ int 2\n\nprint m"
  },
  {
    "path": "src/test/resources/samples/langs/Cirru/number.cirru",
    "content": "\nprint $ int 1\nprint $ float 1.2"
  },
  {
    "path": "src/test/resources/samples/langs/Cirru/require.cirru",
    "content": "\nrequire ./stdio.cr\n"
  },
  {
    "path": "src/test/resources/samples/langs/Cirru/scope.cirru",
    "content": "\nset a (int 2)\n\nprint (self)\n\nset c (child)\n\nunder c\n  under parent\n    print a\n\nprint $ get c a\n\nset c x (int 3)\nprint $ get c x\n\nset just-print $ code\n  print a\n\nprint just-print\n\neval (self) just-print\neval just-print"
  },
  {
    "path": "src/test/resources/samples/langs/Cirru/stdio.cirru",
    "content": "\nset a $ string 1\nprint a\n\nprint (string 1)\n\nprint nothing\n\nprint\n  map\n    a (int 4)\n    b $ map\n      a $ int 5\n      b $ int 6\n      c $ map\n        int 7\n\nprint\n  array\n    int 1\n    int 2\n    array\n      int 3\n      int 4\n\nprint\n  array\n    int 1\n    map\n      a $ int 2\n      b $ array\n        int 3\n\nprint\n  int 1\n  int 2\n\nprint $ code\n  set a 1\n  print (get a)\n  print $ array\n    int a\n    array\n      int a\n\nset container (map)\nset container code $ code\n  set a 1\n  print (get a)\n  print $ array\n    int a\n    array\n      int a\n\nprint container"
  },
  {
    "path": "src/test/resources/samples/langs/Cirru/string.cirru",
    "content": "\nprint $ string a\nprint $ string \"a b\""
  },
  {
    "path": "src/test/resources/samples/langs/Clarion/CStringClass.clw",
    "content": "      Member()\r\n         omit('***$***',_VER_C55)\r\n_ABCDllMode_  EQUATE(0)\r\n_ABCLinkMode_ EQUATE(1)\r\n         ***$***\r\n      Include('Equates.CLW'),ONCE\r\n      Include('Keycodes.CLW'),ONCE\r\n      Include('Errors.CLW'),ONCE\r\n      Map\r\n      End ! map\r\n      Include('CStringClass.inc'),ONCE\r\nCStringClass.Construct PROCEDURE                       ! Declare Procedure\r\n  CODE\r\n  SELF.bufferSize  = DEFAULT_CS_BUFFER_SIZE\r\n  SELF.CS         &= New(CSTRING(SELF.bufferSize))\r\nCStringClass.Destruct PROCEDURE                        ! Declare Procedure\r\n  CODE\r\n  Dispose(SELF.cs)\r\nCStringClass.Cat PROCEDURE  (STRING pStr) !,*CSTRING,PROC ! Declare Procedure\r\nnewLen                       LONG,AUTO\r\noldCS                        &CSTRING\r\n  CODE\r\n  newLen = Len(pStr)\r\n  IF (newLen+SELF.strLength+2) > SELF.newStrSize\r\n    ! Only grow the internal string if the result of the cat will be larger than the string currently is.\r\n    ! The reason for the \"+2\" is because this is used in the string slicing outside this IF. Without this matching +2 there is potential for an out of bounds slice which would be bad!\r\n\r\n    ! Save a temporary copy of the old string so we can us it in the concatination after we have grown it!\r\n    oldCS &= New(CSTRING(SELF.strLength+1))\r\n    oldCS = SELF.CS\r\n    Dispose(SELF.CS)\r\n\r\n    SELF.newStrSize = newLen + SELF.strLength + 1 + SELF.bufferSize\r\n    SELF.CS &= New(CSTRING(SELF.newStrSize))\r\n    SELF.CS = oldCS\r\n    Dispose(oldCS)\r\n  END\r\n\r\n  ! Append the new string directly to the end of the old one.\r\n  SELF.CS[SELF.strLength+1 : SELF.strLength+newLen] = pStr\r\n  ! And terminate the CSTRING manually\r\n  SELF.CS[SELF.strLength+newLen+1] = '<0>'\r\n\r\n  ! This is the same as doing \"SELF.strLength = Len(SELF.CS)\" but the Len() is _really_ slow on large strings. This is much faster!\r\n  SELF.strLength += newLen\r\n\r\n  ! This is what it used to be:\r\n  ! SELF.Str(SELF.Str() & s)\r\n  ! It is a nice and neat solution but performance, especially on large strings was terrible!\r\n\r\n  RETURN SELF.Str()\r\nCStringClass.Str PROCEDURE  (STRING pStr) !,*CSTRING, PROC   ! Declare Procedure\r\n  CODE\r\n  IF Len(pStr) > SELF.newStrSize\r\n    ! Only Dispose/New the internal string if the new one requires it.\r\n    ! This might be slightly innefficient in terms of memory usage when the string gets smaller\r\n    ! But it is _vasty_ better for performance when the string gets added to a lot.\r\n    Dispose(SELF.CS)\r\n    SELF.newStrSize = Len(pStr) + 1 + SELF.bufferSize\r\n    SELF.CS &= New(CSTRING(SELF.newStrSize))\r\n  END\r\n\r\n  SELF.CS        = pStr\r\n  SELF.strLength = Len(SELF.CS)\r\n\r\n  RETURN SELF.CS\r\nCStringClass.Len PROCEDURE  !,LONG                     ! Declare Procedure\r\n  CODE\r\n  RETURN SELF.strLength\r\nCStringClass.Replace PROCEDURE  (STRING pFind, STRING pReplace) !,*CSTRING,PROC ! Declare Procedure\r\n! FindString , ReplaceWith\r\nlocate                       LONG,AUTO\r\nlastLocate                   LONG\r\n  CODE\r\n  LOOP\r\n    locate = InString(Upper(pFind), Upper(SELF.Str()), 1, lastLocate+1)\r\n    IF ~locate\r\n      BREAK\r\n    END\r\n\r\n    ! So we dont end up having recursive replacement.\r\n    lastLocate = locate + Len(pReplace)-1\r\n\r\n    SELF.Str(Sub(SELF.Str(), 1, locate-1)                  & |\r\n             pReplace                                      & |\r\n             Sub(SELF.Str(), locate+Len(pFind), SELF.Len())    |\r\n             )\r\n  END\r\n\r\n  RETURN SELF.Str()\r\nCStringClass.Str PROCEDURE  () !,*CSTRING              ! Declare Procedure 3\r\n  CODE\r\n  RETURN SELF.CS\r\n!------------------------------------------------------------------------------\r\nCStringClass.Contains PROCEDURE  (STRING pFind, BYTE pCaseSensitive=TRUE) !,BYTE ! Declare Procedure\r\n! Returns a value (TRUE) indicating whether the specified String occurs within this string.\r\n! Second parameter defaults to a case sensitive search.\r\n  CODE\r\n  IF pCaseSensitive = TRUE\r\n    IF InString(pFind, SELF.Str(), 1 , 1) > 0\r\n      RETURN TRUE\r\n    END\r\n  ELSE\r\n    IF InString(Lower(pFind), SELF.Lower(), 1 , 1) > 0\r\n      RETURN TRUE\r\n    END\r\n  END\r\n\r\n  RETURN FALSE\r\nCStringClass.Lower PROCEDURE  () !,STRING              ! Declare Procedure\r\n! Returns a \"Lowered\" version of the self.cs doesnt change the self.cs\r\n  CODE\r\n  RETURN Lower(SELF.CS)\r\nCStringClass.SubString PROCEDURE  (LONG pPosition, LONG pLength) !,STRING,PROC ! Declare Procedure\r\n  CODE\r\n  RETURN Sub(SELF.Str(), pPosition, pLength)\r\nCStringClass.ToLower PROCEDURE  () !,*CSTRING,PROC     ! Declare Procedure\r\n! Converts this string to lowercase and returns the converted string\r\n\r\n  CODE\r\n  RETURN SELF.Str(SELF.Lower())\r\nCStringClass.ToUpper PROCEDURE  () !,*CSTRING,PROC     ! Declare Procedure\r\n! Converts this string to uppercase and returns the converted string\r\n\r\n  CODE\r\n  RETURN SELF.Str(SELF.Upper())\r\nCStringClass.Trim PROCEDURE  () !,*CSTRING,PROC        ! Declare Procedure\r\n  CODE\r\n  SELF.Str(Left(SELF.Str()))\r\n  SELF.Str(Clip(SELF.Str()))\r\n  RETURN SELF.Str()\r\nCStringClass.Upper PROCEDURE  () !,STRING              ! Declare Procedure\r\n  CODE\r\n  RETURN Upper(SELF.Str())\r\nCStringClass.IndexOf PROCEDURE  (STRING pLookIn, BYTE pCaseSensitive=TRUE) !,LONG ! Declare Procedure\r\n! Returns the index of the first parameter (pLookIn) is found within the SELF.CS\r\n! zero if it is not found\r\n  CODE\r\n  IF pCaseSensitive = TRUE\r\n    RETURN InString(SELF.Str(), pLookIn, 1 , 1)\r\n  ELSE\r\n    RETURN InString(SELF.Lower(), Lower(pLookIn), 1 , 1)\r\n  END\r\nCStringClass.FoundIn PROCEDURE  (STRING pLookIn, BYTE pCaseSensitive=TRUE) !,BYTE ! Declare Procedure\r\n! Returns TRUE if the first parameter (pLookIn) is found within the SELF.CS\r\n! FALSE if it is no\r\n  CODE\r\n  IF SELF.IndexOf(pLookIn, pCaseSensitive) > 0\r\n    RETURN TRUE\r\n  ELSE\r\n    RETURN FALSE\r\n  END\r\nCStringClass.SetBuffer PROCEDURE  (LONG pNewBuffer)    ! Declare Procedure\r\n  CODE\r\n  SELF.bufferSize = pNewBuffer\r\nCStringClass.EscapeXml PROCEDURE  (<STRING pStr>) !,STRING ! Declare Procedure\r\nCS CStringClass\r\n  CODE\r\n  IF Omitted(pStr)=FALSE\r\n    CS.Str(pStr)\r\n  ELSE\r\n    ! Make a copy so we don't alter the original\r\n    CS.Str(SELF.Str())\r\n  END\r\n  CS.Replace('&', '&amp;')\r\n  CS.Replace('<', '&lt;')\r\n  CS.Replace('>', '&gt;')\r\n  CS.Replace('\"', '&quot;')\r\n  CS.Replace('''', '&apos;')\r\n\r\n  RETURN CS.Str()\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clarion/ConsoleSupport.clw",
    "content": "      Member()\r\n      Include('ConsoleSupport.inc'),ONCE\r\n\t  Map\r\n        MODULE('32-bit Windows API')\r\n            ! General functions\r\n            GetLastError(),DWORD,PASCAL\r\n \r\n            ! Console functions\r\n            GetStdHandle(DWORD),HANDLE,PASCAL,PROC,RAW\r\n            WriteConsole(Handle,Long,Dword,long,long),bool,Raw,Pascal,name('WriteConsoleA')\r\n            ReadConsole(Handle,Long,Dword,long,long),bool,Raw,Pascal,name('ReadConsoleA')\r\n            SetConsoleTitle(Long),Bool,Raw,Pascal,name('SetConsoleTitleA')\r\n            GetConsoleTitle(Long,dword),Bool,Raw,Pascal,name('GetConsoleTitleA')\r\n            SetConsoleMode(Handle,dWord),BOOL,RAW,PASCAL\r\n            GetConsoleMode(Handle,Long),BOOL,RAW,PASCAL\r\n        End\r\n      End \r\n      \r\nConsoleSupport.Construct PROCEDURE\r\n\r\n  CODE\r\n\r\nConsoleSupport.Destruct PROCEDURE\r\n\r\n  CODE\r\n\r\nConsoleSupport.Init\t\t\t\t   PROCEDURE () !,BYTE,VIRTUAL \r\n  CODE\r\n\r\n    SELF.OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE)\r\n    If SELF.OutputHandle = INVALID_HANDLE_VALUE\r\n        Halt(1,'Unable to get output handle (' & GetLastError() & ')')\r\n        RETURN INVALID_HANDLE_VALUE\r\n    End\r\n \r\n    SELF.InputHandle = GetStdHandle(STD_INPUT_HANDLE)\r\n    if SELF.InputHandle = INVALID_HANDLE_VALUE\r\n        Halt(2,'Unable to get console input handle (' & GetLastError() & ')')\r\n        RETURN INVALID_HANDLE_VALUE\r\n    End\r\n \r\n    If ~SetConsoleMode(SELF.InputHandle,ENABLE_PROCESSED_INPUT )\r\n        Halt(3,'Unable to set console mode (' & GetLastError() & ')')\r\n        RETURN INVALID_OTHER\r\n    End\r\n\r\n    RETURN FALSE\r\n\r\nConsoleSupport.WriteLine\t\t\t   PROCEDURE (STRING pText) !,BYTE,PROC,VIRTUAL \r\n  CODE\r\n    SELF.TextBuffer = SELF.Prefix & pText & '<13,10>'\r\n    If WriteConsole(SELF.OutputHandle, ADDRESS(SELF.TextBuffer), LEN(SELF.TextBuffer),ADDRESS(SELF.BytesWritten), NULL) = 0\r\n        Halt(4,'WriteConsoleError (' & GetLastError() & ')')\r\n        RETURN -1\r\n    End\r\n    RETURN FALSE\r\n\r\nConsolesupport.ReadKey  \t\t\t   PROCEDURE () !,STRING,PROC,VIRTUAL \r\n  CODE\r\n  SELF.WriteLine('Press any key to continue...')\r\n  Clear(SELF.InBuffer)\r\n  Loop\r\n    IF ReadConsole(SELF.InputHandle,Address(SELF.InBuffer),100,Address(SELF.BytesRead),NULL) = 0 THEN\r\n      Halt(5,'Error on read console (' & GetLastError() & ')')\r\n      Break\r\n    End\r\n  Until SELF.BytesRead > 0\r\n  RETURN SELF.InBuffer"
  },
  {
    "path": "src/test/resources/samples/langs/Clarion/HelloWorld.clw",
    "content": "  PROGRAM\r\n\r\n  MAP\r\n  END\r\n\r\n  CODE\r\n\r\n  MESSAGE('Hello World!')\r\n\r\n  RETURN"
  },
  {
    "path": "src/test/resources/samples/langs/Clarion/hello.clw",
    "content": "  MEMBER()\r\n  INCLUDE('HelloClass.inc'),ONCE\r\n  MAP\r\n  END\r\n\r\nHelloClass.Construct              PROCEDURE\r\n  CODE\r\nHelloClass.Destruct               PROCEDURE() !,VIRTUAL\r\n  CODE\r\nHelloClass.SayHello               PROCEDURE\r\n  CODE\r\n  MESSAGE('Hello World!')\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clean/GenHylo.dcl",
    "content": "definition module GenHylo\n\nimport StdGeneric, GenMap\n\n:: Fix f = In (f .(Fix f))\nOut :: !u:(Fix v:a) -> v:(a w:(Fix v:a)), [u <= w]\n\nhylo :: ((.f .b) -> .b) (.a -> (.f .a)) -> (.a -> .b) | gMap{|*->*|} f\ncata :: (u:(f .a) -> .a) -> (Fix u:f) -> .a | gMap{|*->*|} f\nana :: (.a -> u:(f .a)) -> .a -> (Fix u:f) | gMap{|*->*|} f\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clean/GenMap.dcl",
    "content": "definition module GenMap\n\nimport StdGeneric\n\ngeneric gMap a b :: .a -> .b\nderive gMap c, UNIT, PAIR, EITHER, CONS, FIELD, OBJECT, {}, {!} \n\nderive gMap [], (,), (,,),  (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clean/GenMap.icl",
    "content": "implementation module GenMap\n\nimport StdClass, StdArray, StdInt, StdFunc\nimport StdGeneric, _Array\n\ngeneric gMap a b :: .a -> .b\ngMap{|c|} x \t\t\t\t\t= x\ngMap{|UNIT|} x \t\t\t\t\t= x\ngMap{|PAIR|} fx fy (PAIR x y) \t= PAIR (fx x) (fy y) \ngMap{|EITHER|} fl fr (LEFT x) \t= LEFT (fl x)\ngMap{|EITHER|} fl fr (RIGHT x) \t= RIGHT (fr x)\ngMap{|CONS|} f (CONS x) \t\t= CONS (f x)\ngMap{|FIELD|} f (FIELD x) \t\t= FIELD (f x)\ngMap{|OBJECT|} f (OBJECT x) \t= OBJECT (f x)\ngMap{|{}|} f xs \t\t\t\t= mapArray f xs\ngMap{|{!}|} f xs\t\t\t\t= mapArray f xs\n\nderive gMap [], (,), (,,),  (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clean/fsieve.icl",
    "content": "module fsieve\n\n/*\nThe Fast Sieve of Eratosthenes.\n\nA sequential and optimized version of the sieve of Eratosthenes.\nThe program calculates a list of the first NrOfPrime primes.\nThe result of the program is the NrOfPrimes'th prime.\n\nStrictness annotations have been added because the strictness analyser\nis not able to deduce all strictness information. Removal of these !'s\nwill make the program about 20% slower.\n\nOn a machine without a math coprocessor the execution of this\nprogram might take a (very) long time. Set NrOfPrimes to a smaller value.\n*/\n\nimport StdClass; // RWS\nimport StdInt, StdReal\n     \nNrOfPrimes :== 3000 \n\t\n//\tThe sieve algorithm: generate an infinite list of all primes.\n\nPrimes::[Int]\nPrimes = pr where pr = [5 : Sieve 7 4 pr]\n\nSieve::Int !Int [Int] -> [Int]\nSieve g i prs\n\t| IsPrime prs g (toInt (sqrt (toReal g)))\t=  [g : Sieve` g i prs]\n\t\t\t\t\t\t\t\t\t\t\t\t=  Sieve (g + i) (6 - i) prs\n\nSieve`::Int Int [Int] -> [Int]\nSieve` g i prs =  Sieve (g + i) (6 - i) prs\n\nIsPrime::[Int] !Int Int -> Bool\nIsPrime [f:r] pr bd | f>bd \t\t\t=  True\n\t\t\t\t\t| pr rem f==0\t=  False\n\t\t\t\t\t\t\t\t\t=  IsPrime r pr bd\n\t\t\t\t\t\t\t\t  \n//\tSelect is used to get the NrOfPrimes'th prime from the infinite list.\n\nSelect::[x] Int -> x\nSelect [f:r] 1 =  f\nSelect [f:r] n =  Select r (n - 1)\n\n\n/*\tThe Start rule: Select the NrOfPrimes'th prime from the list of primes\n\tgenerated by Primes.\n*/\n\nStart::Int\nStart = Select [2, 3 : Primes] NrOfPrimes\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clean/sem.icl",
    "content": "module monadicSemantics\n\nimport StdEnv, StdGeneric, GenMap, GenHylo\n\n/* For fun I implemented the recursive datastructre Exp and Stm as fixpoints\n   This helps us define recursive functions on them (only a little bit though)\n   However deriving gMap for Fix did not works out of the box\n   I had to remove some uniqueness typing in GenMap and GenHylo */\n:: Op      = Plus | Minus | Times | Rem | Equal | LessThan\n:: Var     :== String\n\n:: ExpP a  = Int Int | Var Var | Op Op a a\n:: Exp     :== Fix ExpP\n\n:: StmP a  = Assign Var Exp | If Exp a a | While Exp a | Seq a a | Cont\n:: Stm     :== Fix StmP\n\nderive gMap ExpP, StmP, Fix\n\n// Environment. Semantics is basically Env -> Env\n:: Env :== Var -> Int\n:: Sem :== Env -> (Int, Env)\nempty = \\v . 0\n\n// return\nrtn :: Int -> Sem\nrtn i = \\e. (i, e)\n\n// the usual bind\n(>>=) infixl 1 :: Sem (Int->Sem) -> Sem\n(>>=) x y = \\e. (\\(i,e2).y i e2) (x e)\n(>>|) infixl 1 :: Sem Sem -> Sem\n(>>|) x y = x >>= \\_. y\n\n// read variable from environment\nread :: Var -> Sem\nread v = \\e. (e v, e)\n\n// assign value to give variable in environment\nwrite :: Var Int -> Sem\nwrite v i = \\e. (i, \\w. if (w==v) i (e w))\n\n// semantics\nclass sem a :: a -> Sem\n\noperator :: Op -> Int -> Int -> Int\noperator Plus     = (+)\noperator Minus    = (-)\noperator Times    = (*)\noperator Rem      = rem\noperator Equal    = \\x y . if (x==y) 1 0\noperator LessThan = \\x y . if (x< y)  1 0\n\n// semantics of expressions\ninstance sem Exp where\n\tsem x = cata phi x where\n\t\tphi (Int n)     = rtn n\n\t\tphi (Var v)     = read v\n\t\tphi (Op op x y) = x >>= \\v1. y >>= return o (operator op v1)\n\n// semantics of statments\n// NOTE: while will always return 0, as it might not even be executed\ninstance sem Stm where\n\tsem x = cata phi x where\n\t\tphi (Assign v e)     = sem e >>= write v\n\t\tphi (If e s1 s2)     = sem e >>= \\b . if (b<>0) s1 s2\n\t\tphi stm=:(While e s) = sem e >>= \\b . if (b<>0) (s >>| phi stm) (phi Cont)\n\t\tphi (Seq s1 s2)      = s1 >>| s2    // Here the cata *finally* pays off :D\n\t\tphi Cont             = rtn 0\n\n// convenience functions\nint    = In o Int\nvar    = In o Var\nop o   = In o2 (Op o)\nassign = In o2 Assign\nifte e = In o2 (If e)\nwhile  = In o2 While\nseq    = In o2 Seq\ncont   = In Cont\n\n// test case, also testing the new operator <\npEuclides =\n\twhile (op LessThan (int 0) (var \"b\"))(\n\t\tseq (assign \"r\" (op Rem (var \"a\") (var \"b\")))\n\t\t(seq (assign \"a\" (var \"b\"))\n\t\t( (assign \"b\" (var \"r\")))\n\t\t)\n\t)\n\nStart = fst (program start) where\n\tprogram = sem pEuclides >>| read \"a\"\n\tstart \"a\" = 9\n\tstart \"b\" = 12\n\tstart _ = 0\n\n// Helper\n(o2) infixr 9\n(o2) f g x :== f o (g x)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clean/stack.dcl",
    "content": "definition module stack\n\n:: Stack a\n\nnewStack :: (Stack a)\npush :: a (Stack a) -> Stack a\npushes :: [a] (Stack a) -> Stack a\npop :: (Stack a) -> Stack a\npopn :: Int (Stack a) -> Stack a\ntop :: (Stack a) -> a\ntopn :: Int (Stack a) -> [a]\nelements :: (Stack a) -> [a]\ncount :: (Stack a) -> Int\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clean/stack.icl",
    "content": "implementation module stack\nimport StdEnv\n\n:: Stack a :== [a]\n\nnewStack :: (Stack a)\nnewStack = []\n\npush :: a (Stack a) -> Stack a\npush x s = [x:s]\n\npushes :: [a] (Stack a) -> Stack a\npushes x s = x ++ s\n\npop :: (Stack a) -> Stack a\npop [] = abort \"Cannot use pop on an empty stack\"\npop [e:s] = s\n\npopn :: Int (Stack a) -> Stack a\npopn n s  = drop n s\n\ntop :: (Stack a) -> a\ntop [] = abort \"Cannot use top on an empty stack\"\ntop [e:s] = e\n\ntopn :: Int (Stack a) -> [a]\ntopn n s = take n s\nelements :: (Stack a) -> [a]\nelements s = s\n\ncount :: (Stack a) -> Int\ncount s = length s\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clean/streams.dcl",
    "content": "definition module streams\n\nimport StdEnv\n\ninstance zero [Real]\ninstance one [Real]\ninstance + [Real]        \ninstance - [Real]\ninstance * [Real]\ninstance / [Real]\n\nX :: [Real]\ninvert :: [Real] -> [Real]\npow :: [Real] Int -> [Real]\n(shuffle) infixl 7 :: [Real] [Real] -> [Real]\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clean/streams.icl",
    "content": "implementation module streams\n\nimport StdEnv\n\ninstance zero [Real]\nwhere\n        zero = [] //Infinite row of zeroes represented as empty list to ease computation\n\ninstance one [Real]\nwhere\n        one = [1.0:zero]\n\ninstance + [Real]\nwhere\n        (+) [s:s`] [t:t`] = [s+t:s`+t`]\n        (+) [s:s`] [] = [s:s`]\n        (+) [] [t:t`] = [t:t`]\n        (+) [] [] = []\n        \ninstance - [Real]\nwhere\n        (-) [s:s`] [t:t`] = [s-t:s`-t`]\n        (-) [s:s`] [] = [s:s`]\n        (-) [] [t:t`] = [-1.0] * [t:t`]\n        (-) [] [] = []\n\ninstance * [Real]\nwhere\n        (*) [s:s`] [t:t`] = [s*t:s`*[t:t`]+[s]*t`]\n        (*) _ _ = []\n\ninstance / [Real]\nwhere\n        (/) s t = s * (invert t)\n\nX :: [Real]\nX = [0.0:one]\n\ninvert :: [Real] -> [Real]\ninvert [s:s`] = [1.0/s:(invert [s:s`]) * s` * [-1.0/s]]\n\npow :: [Real] Int -> [Real]\npow s 0 = one\npow s n = s * pow s (n-1)\n\n(shuffle) infixl 7 :: [Real] [Real] -> [Real]\n(shuffle) [s:s`] [t:t`] = [s*t:s` shuffle [t:t`] + [s:s`] shuffle t`]\n(shuffle) _ _ = []\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Click/sr2.click",
    "content": "rates :: AvailableRates\nelementclass sr2 {\n  $sr2_ip, $sr2_nm, $wireless_mac, $gateway, $probes|\n\n\narp :: ARPTable();\nlt :: LinkTable(IP $sr2_ip);\n\n\ngw :: SR2GatewaySelector(ETHTYPE 0x062c,\n\t\t      IP $sr2_ip,\n\t\t      ETH $wireless_mac,\n\t\t      LT lt,\n\t\t      ARP arp,\n\t\t      PERIOD 15,\n\t\t      GW $gateway);\n\n\ngw -> SR2SetChecksum -> [0] output;\n\nset_gw :: SR2SetGateway(SEL gw);\n\n\nes :: SR2ETTStat(ETHTYPE 0x0641, \n\t      ETH $wireless_mac, \n\t      IP $sr2_ip, \n\t      PERIOD 30000,\n\t      TAU 300000,\n\t      ARP arp,\n\t      PROBES $probes,\n\t      ETT metric,\n\t      RT rates);\n\n\nmetric :: SR2ETTMetric(LT lt);\n\n\nforwarder :: SR2Forwarder(ETHTYPE 0x0643, \n\t\t\t      IP $sr2_ip, \n\t\t\t      ETH $wireless_mac, \n\t\t\t      ARP arp, \n\t\t\t      LT lt);\n\n\nquerier :: SR2Querier(ETH $wireless_mac, \n\t\t     SR forwarder,\n\t\t     LT lt, \n\t\t     ROUTE_DAMPENING true,\n\t\t     TIME_BEFORE_SWITCH 5,\n\t\t     DEBUG true);\n\n\nquery_forwarder :: SR2MetricFlood(ETHTYPE 0x0644,\n\t\t\t       IP $sr2_ip, \n\t\t\t       ETH $wireless_mac, \n\t\t\t       LT lt, \n\t\t\t       ARP arp,\n\t\t\t       DEBUG false);\n\nquery_responder :: SR2QueryResponder(ETHTYPE 0x0645,\n\t\t\t\t    IP $sr2_ip, \n\t\t\t\t    ETH $wireless_mac, \n\t\t\t\t    LT lt, \n\t\t\t\t    ARP arp,\n\t\t\t\t    DEBUG true);\n\n\nquery_responder -> SR2SetChecksum -> [0] output;\nquery_forwarder -> SR2SetChecksum -> SR2Print(forwarding) -> [0] output;\nquery_forwarder [1] -> query_responder;\n\ndata_ck :: SR2SetChecksum() \n\ninput [1] \n-> host_cl :: IPClassifier(dst net $sr2_ip mask $sr2_nm,\n\t\t\t\t-)\n-> querier\n-> data_ck;\n\n\nhost_cl [1] -> [0] set_gw [0] -> querier;\n\nforwarder[0] \n  -> dt ::DecIPTTL\n  -> data_ck\n  -> [2] output;\n\n\ndt[1] \n-> Print(ttl-error) \n-> ICMPError($sr2_ip, timeexceeded, 0) \n-> querier;\n\n\n// queries\nquerier [1] -> [1] query_forwarder;\nes -> SetTimestamp() -> [1] output;\n\n\nforwarder[1] //ip packets to me\n  -> SR2StripHeader()\n  -> CheckIPHeader()\n  -> from_gw_cl :: IPClassifier(src net $sr2_ip mask $sr2_nm,\n\t\t\t\t-)\n  -> [3] output;\n\nfrom_gw_cl [1] -> [1] set_gw [1] -> [3] output;\n\n input [0]\n   -> ncl :: Classifier(\n\t\t\t12/0643 , //sr2_forwarder\n\t\t\t12/0644 , //sr2\n\t\t\t12/0645 , //replies\n\t\t\t12/0641 , //sr2_es\n\t\t\t12/062c , //sr2_gw\n\t\t\t);\n \n \n ncl[0] -> SR2CheckHeader() -> [0] forwarder;\n ncl[1] -> SR2CheckHeader() -> PrintSR(query) -> query_forwarder\n ncl[2] -> SR2CheckHeader() -> query_responder;\n ncl[3] -> es;\n ncl[4] -> SR2CheckHeader() -> gw;\n \n}\n\n\n\nIdle -> s :: sr2(2.0.0.1, 255.0.0.0, 00:00:00:00:00:01, false, \"12 60 12 1500\") -> Discard;\nIdle -> [1] s;\ns[1] -> Discard;\ns[2] -> Discard;\ns[3] -> Discard;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Click/thomer-nat.click",
    "content": "// This Click configuration implements a firewall and NAT, roughly based on the\n// mazu-nat.click example.\n//\n// This example assumes there is one interface that is IP-aliased.  In this\n// example, eth0 and eth0:0 have IP addresses 66.68.65.90 and 192.168.1.1,\n// respectively.  There is a local network, 192.168.1.0/24, and an upstream\n// gateway, 66.58.65.89.  Traffic from the local network is NATed.\n//\n// Connections can be initiated from the NAT box itself, also.\n// \n// For bugs, suggestions, and, corrections, please email me.\n//\n// Author: Thomer M. Gil (click@thomer.com)\n\nAddressInfo(\n    eth0-in     192.168.1.1     192.168.1.0/24  00:0d:87:9d:1c:e9,\n    eth0-ex     66.58.65.90                     00:0d:87:9d:1c:e9,\n    gw-addr     66.58.65.89                     00:20:6f:14:54:c2\n);\n\n\nelementclass SniffGatewayDevice {\n  $device |\n  from :: FromDevice($device)\n    -> t1 :: Tee\n    -> output;\n  input -> q :: Queue(1024)\n    -> t2 :: PullTee\n    -> to :: ToDevice($device);\n  t1[1] -> ToHostSniffers;\n  t2[1] -> ToHostSniffers($device);\n  ScheduleInfo(from .1, to 1);\n}\n\n\ndevice :: SniffGatewayDevice(eth0);\narpq_in :: ARPQuerier(eth0-in) -> device;\nip_to_extern :: GetIPAddress(16)\n        -> CheckIPHeader\n        -> EtherEncap(0x800, eth0-ex, gw-addr)\n        -> device;\nip_to_host :: EtherEncap(0x800, gw-addr, eth0-ex)\n        -> ToHost;\nip_to_intern :: GetIPAddress(16)\n        -> CheckIPHeader\n        -> arpq_in;\n\n                 \narp_class :: Classifier(\n        12/0806 20/0001,        // [0] ARP requests\n        12/0806 20/0002,        // [1] ARP replies to host\n        12/0800);               // [2] IP packets\n\ndevice -> arp_class;\n\n// ARP crap\narp_class[0] -> ARPResponder(eth0-in, eth0-ex) -> device;\narp_class[1] -> arp_t :: Tee;\n                arp_t[0] -> ToHost;\n                arp_t[1] -> [1]arpq_in;\n\n\n// IP packets\narp_class[2] -> Strip(14)\n   -> CheckIPHeader\n   -> ipclass :: IPClassifier(dst host eth0-ex,\n                              dst host eth0-in,\n                              src net eth0-in);\n\n// Define pattern NAT\niprw :: IPRewriterPatterns(NAT eth0-ex 50000-65535 - -);\n\n// Rewriting rules for UDP/TCP packets\n// output[0] rewritten to go into the wild\n// output[1] rewritten to come back from the wild or no match\nrw :: IPRewriter(pattern NAT 0 1,\n                 pass 1);\n\n// Rewriting rules for ICMP packets\nirw :: ICMPPingRewriter(eth0-ex, -);\nirw[0] -> ip_to_extern;\nirw[1] -> icmp_me_or_intern :: IPClassifier(dst host eth0-ex, -);\n          icmp_me_or_intern[0] -> ip_to_host;\n          icmp_me_or_intern[1] -> ip_to_intern;\n\n// Rewriting rules for ICMP error packets\nierw :: ICMPRewriter(rw irw);\nierw[0] -> icmp_me_or_intern;\nierw[1] -> icmp_me_or_intern;\n\n\n// Packets directed at eth0-ex.\n// Send it through IPRewriter(pass).  If there was a mapping, it will be\n// rewritten such that dst is eth0-in:net, otherwise dst will still be for\n// eth0-ex.\nipclass[0] -> [1]rw;\n\n// packets that were rewritten, heading into the wild world.\nrw[0] -> ip_to_extern;\n\n// packets that come back from the wild or are not part of an established\n// connection.\nrw[1] -> established_class :: IPClassifier(dst host eth0-ex,\n                                           dst net eth0-in);\n\n         // not established yet or returning packets for a connection that was\n         // established from this host itself.\n         established_class[0] ->\n           firewall :: IPClassifier(dst tcp port ssh,\n                                    dst tcp port smtp,\n                                    dst tcp port domain,\n                                    dst udp port domain,\n                                    icmp type echo-reply,\n                                    proto icmp,\n                                    port > 4095,\n                                    -);\n\n                                    firewall[0] -> ip_to_host; // ssh\n                                    firewall[1] -> ip_to_host; // smtp\n                                    firewall[2] -> ip_to_host; // domain (t)\n                                    firewall[3] -> ip_to_host; // domain (u)\n                                    firewall[4] -> [0]irw;     // icmp reply\n                                    firewall[5] -> [0]ierw;    // other icmp\n                                    firewall[6] -> ip_to_host; // port > 4095, probably for connection\n                                                               // originating from host itself\n                                    firewall[7] -> Discard;    // don't allow incoming for port <= 4095\n\n        // established connection\n        established_class[1] -> ip_to_intern;\n\n// To eth0-in.  Only accept from inside network.\nipclass[1] -> IPClassifier(src net eth0-in) -> ip_to_host;\n\n// Packets from eth0-in:net either stay on local network or go to the wild.\n// Those that go into the wild need to go through the appropriate rewriting\n// element.  (Either UDP/TCP rewriter or ICMP rewriter.)\nipclass[2] -> inter_class :: IPClassifier(dst net eth0-in, -);\n              inter_class[0] -> ip_to_intern;\n              inter_class[1] -> ip_udp_class :: IPClassifier(tcp or udp,\n                                                             icmp type echo);\n                                ip_udp_class[0] -> [0]rw;\n                                ip_udp_class[1] -> [0]irw;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clojure/build.boot",
    "content": ";; from: https://github.com/boot-clj/boot#configure-task-options\n\n(set-env!\n  :source-paths #{\"src\"}\n  :dependencies '[[me.raynes/conch \"0.8.0\"]])\n\n(task-options!\n  pom {:project 'my-project\n       :version \"0.1.0\"}\n  jar {:manifest {\"Foo\" \"bar\"}})\n\n(deftask build\n  \"Build my project.\"\n  []\n  (comp (pom) (jar) (install)))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clojure/for.clj",
    "content": "(defn prime? [n]\n   (not-any? zero? (map #(rem n %) (range 2 n))))\n\n(range 3 33 2)\n'(3 5 7 9 11 13 15 17 19 21 23 25 27 29 31)\n\n;; :when continues through the collection even if some have the\n;; condition evaluate to false, like filter\n(for [x (range 3 33 2) :when (prime? x)]\n   x)\n'(3 5 7 11 13 17 19 23 29 31)\n\n;; :while stops at the first collection element that evaluates to\n;; false, like take-while\n(for [x (range 3 33 2) :while (prime? x)]\n   x)\n'(3 5 7)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clojure/hiccup.hic",
    "content": "[:html\n [:head\n  [:meta {:charset \"utf-8\"}]\n  [:link {:rel \"stylesheet\" :href \"css/bootstrap.min.css\"}]\n  [:script {:src \"app.js\"}]]\n [:body\n  [:div.nav\n   [:p \"Hello world!\"]]]]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clojure/index.cljs.hl",
    "content": ";; Copyright (c) Alan Dipert and Micha Niskin. All rights reserved.\n;; The use and distribution terms for this software are covered by the\n;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)\n;; which can be found in the file epl-v10.html at the root of this distribution.\n;; By using this software in any fashion, you are agreeing to be bound by\n;; the terms of this license.\n;; You must not remove this notice, or any other, from this software.\n\n(page \"index.html\"\n  (:refer-clojure :exclude [nth])\n  (:require\n   [tailrecursion.hoplon.reload        :refer [reload-all]]\n   [tailrecursion.hoplon.util          :refer [nth name pluralize]]\n   [tailrecursion.hoplon.storage-atom  :refer [local-storage]]))\n\n;; utility functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(declare route state editing)\n\n(reload-all)\n\n(def mapvi  (comp vec map-indexed))\n\n(defn dissocv [v i]\n  (let [z (- (dec (count v)) i)]\n    (cond (neg?  z) v\n          (zero? z) (pop v)\n          (pos?  z) (into (subvec v 0 i) (subvec v (inc i))))))\n\n(defn decorate [todo route editing i]\n  (let [{done? :completed text :text} todo]\n    (-> todo (assoc :editing (= editing i)\n                    :visible (and (not (empty? text))\n                                  (or (= \"#/\" route)\n                                      (and (= \"#/active\" route) (not done?))\n                                      (and (= \"#/completed\" route) done?)))))))\n\n;; persisted state cell (AKA: stem cell) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(def   state        (-> (cell []) (local-storage ::store)))\n\n;; local state cells ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(defc  loaded?      false)\n(defc  editing      nil)\n(def   route        (route-cell \"#/\"))\n\n;; formula cells (computed state) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(defc= completed    (filter :completed state))\n(defc= active       (remove :completed state))\n(defc= plural-item  (pluralize \"item\" (count active)))\n(defc= todos        (mapvi #(list %1 (decorate %2 route editing %1)) state))\n\n;; state transition functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(defn  todo        [t]   {:completed false :text t})\n(defn  destroy!    [i]   (swap! state dissocv i))\n(defn  done!       [i v] (swap! state assoc-in [i :completed] v))\n(defn  clear-done! [& _] (swap! state #(vec (remove :completed %))))\n(defn  new!        [t]   (when (not (empty? t)) (swap! state conj (todo t))))\n(defn  all-done!   [v]   (swap! state #(mapv (fn [x] (assoc x :completed v)) %)))\n(defn  editing!    [i v] (reset! editing (if v i nil)))\n(defn  text!       [i v] (if (empty? v) (destroy! i) (swap! state assoc-in [i :text] v)))\n\n;; page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(html :lang \"en\"\n  (head\n    (meta :charset \"utf-8\")\n    (meta :http-equiv \"X-UA-Compatible\" :content \"IE=edge,chrome=1\")\n    (link :rel \"stylesheet\" :href \"base.css\")\n    (title \"Hoplon • TodoMVC\"))\n  (body\n    (noscript\n      (div :id \"noscript\"\n        (p \"JavaScript is required to view this page.\")))\n    (div\n      (section :id \"todoapp\"\n        (header :id \"header\"\n          (h1 \"todos\")\n          (form :on-submit #(do (new! (val-id :new-todo))\n                                (do! (by-id :new-todo) :value \"\"))\n            (input\n              :id \"new-todo\"\n              :type \"text\"\n              :autofocus true\n              :placeholder \"What needs to be done?\"\n              :on-blur #(do! (by-id :new-todo) :value \"\"))))\n        (section\n          :id \"main\"\n          :do-toggle (cell= (not (and (empty? active) (empty? completed))))\n          (input\n            :id \"toggle-all\"\n            :type \"checkbox\"\n            :do-attr (cell= {:checked (empty? active)}) \n            :on-click #(all-done! (val-id :toggle-all)))\n          (label :for \"toggle-all\"\n            \"Mark all as complete\")\n          (ul :id \"todo-list\"\n            (loop-tpl\n              :reverse true\n              :bind-ids [done# edit#]\n              :bindings [[i {edit? :editing done? :completed todo-text :text show? :visible}] todos] \n              (li\n                :do-class (cell= {:completed done? :editing edit?}) \n                :do-toggle show?\n                (div :class \"view\" :on-dblclick #(editing! @i true)\n                  (input\n                    :id done# \n                    :type \"checkbox\"\n                    :class \"toggle\"\n                    :do-attr (cell= {:checked done?}) \n                    :on-click #(done! @i (val-id done#)))\n                  (label (text \"~{todo-text}\"))\n                  (button\n                    :type \"submit\"\n                    :class \"destroy\"\n                    :on-click  #(destroy! @i)))\n                (form :on-submit #(editing! @i false)\n                  (input\n                    :id edit#\n                    :type \"text\"\n                    :class \"edit\"\n                    :do-value todo-text\n                    :do-focus edit?\n                    :on-blur #(when @edit? (editing! @i false))\n                    :on-change #(when @edit? (text! @i (val-id edit#)))))))))\n        (footer \n          :id \"footer\"\n          :do-toggle (cell= (not (and (empty? active) (empty? completed))))\n          (span :id \"todo-count\"\n            (strong (text \"~(count active) \"))\n            (span (text \"~{plural-item} left\")))\n          (ul :id \"filters\"\n            (li (a :href \"#/\"          :do-class (cell= {:selected (= \"#/\" route)})          \"All\"))\n            (li (a :href \"#/active\"    :do-class (cell= {:selected (= \"#/active\" route)})    \"Active\"))\n            (li (a :href \"#/completed\" :do-class (cell= {:selected (= \"#/completed\" route)}) \"Completed\")))\n          (button\n            :type      \"submit\"\n            :id        \"clear-completed\"\n            :on-click  #(clear-done!)\n            (text \"Clear completed (~(count completed))\"))))\n      (footer :id \"info\" \n        (p \"Double-click to edit a todo\")\n        (p \"Part of \" (a :href \"http://github.com/tailrecursion/hoplon-demos/\" \"hoplon-demos\")))))) \n"
  },
  {
    "path": "src/test/resources/samples/langs/Clojure/into-array.cljc",
    "content": "(defn into-array\n  ([aseq]\n     (into-array nil aseq))\n  ([type aseq]\n     (let [n (count aseq)\n           a (make-array n)]\n       (loop [aseq (seq aseq)\n              i 0]\n         (if (< i n)\n           (do\n             (aset a i (first aseq))\n             (recur (next aseq) (inc i)))\n           a)))))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clojure/protocol.cljs",
    "content": "(defprotocol ISound (sound []))\n \n(deftype Cat []\n  ISound\n  (sound [_] \"Meow!\"))\n \n(deftype Dog []\n  ISound\n  (sound [_] \"Woof!\"))\n \n(extend-type default\n  ISound\n  (sound [_] \"... silence ...\"))\n \n(sound 1) ;; => \"... silence ...\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clojure/rand.cljscm",
    "content": "(defn rand\n  \"Returns a random floating point number between 0 (inclusive) and\n  n (default 1) (exclusive).\"\n  ([] (scm* [n] (random-real)))\n  ([n] (* (rand) n)))"
  },
  {
    "path": "src/test/resources/samples/langs/Clojure/svg.cljx",
    "content": "^:clj (ns c2.svg\n        (:use [c2.core :only [unify]]\n              [c2.maths :only [Pi Tau radians-per-degree\n                               sin cos mean]]))\n\n^:cljs (ns c2.svg\n         (:use [c2.core :only [unify]]\n               [c2.maths :only [Pi Tau radians-per-degree\n                                sin cos mean]])\n         (:require [c2.dom :as dom]))\n\n;;Stub for float fn, which does not exist on cljs runtime\n^:cljs (def float identity)\n\n(defn ->xy\n  \"Convert coordinates (potentially map of `{:x :y}`) to 2-vector.\"\n  [coordinates]\n  (cond\n   (and (vector? coordinates) (= 2 (count coordinates))) coordinates\n   (map? coordinates) [(:x coordinates) (:y coordinates)]))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Clojure/unit-test.cl2",
    "content": "(deftest function-tests\n  (is (= 3\n         (count [1 2 3])))\n  (is (= false\n         (not true)))\n  (is (= true\n         (contains? {:foo 1 :bar 2} :foo)))\n\n  (is (= {\"foo\" 1, \"baz\" 3}\n         (select-keys {:foo 1 :bar 2 :baz 3} [:foo :baz])))\n\n  (is (= [1 2 3]\n         (vals {:foo 1 :bar 2 :baz 3})))\n\n  (is (= [\"foo\" \"bar\" \"baz\"]\n         (keys {:foo 1 :bar 2 :baz 3})))\n\n  (is (= [2 4 6]\n         (filter (fn [x] (=== (rem x 2) 0)) [1 2 3 4 5 6]))))\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Closure Templates/example.soy",
    "content": "{namespace Exmaple}\n\n/**\n * Example\n */\n{template .foo}\n  {@param count: string}\n  {@param? name: int}\n\n  {if isNonnull($name)}\n    <h1>{$name}</h1>\n  {/if}\n\n  <div class=\"content\">\n    {switch count}\n      {case 0}\n        {call Empty.view}\n          {param count: $count /}\n        {/call}\n      {default}\n        <h2>Wow, so many!</h2>\n    {/switch}\n  </div>\n{/template}\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoNLL-U/CF1.conllu",
    "content": "# text = PT no governo\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a\n# sent_id = CF1-1\n# id = 1\n1\tPT\tPT\tPROPN\tPROP|M|S|@NPHR\tGender=Masc|Number=Sing\t0\troot\t_\t_\n2-3\tno\t_\t_\t_\t_\t_\t_\t_\t_\n2\tem\tem\tADP\t<sam->|PRP|@N<\t_\t4\tcase\t_\t_\n3\to\to\tDET\t<-sam>|<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t4\tdet\t_\t_\n4\tgoverno\tgoverno\tNOUN\t<np-def>|N|M|S|@P<\tGender=Masc|Number=Sing\t1\tnmod\t_\t_\n\n# text = BRASÍLIA Pesquisa Datafolha publicada hoje revela um dado supreendente: recusando uma postura radical, a esmagadora maioria (77%) dos eleitores quer o PT participando do Governo Fernando Henrique Cardoso.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a &W\n# sent_id = CF1-3\n# id = 2\n1\tBRASÍLIA\tBrasília\tPROPN\tPROP|F|S|@ADVL>\tGender=Fem|Number=Sing\t6\tdep\t_\t_\n2\tPesquisa\tPesquisa\tPROPN\t_\tGender=Fem|Number=Sing\t6\tnsubj\t_\tChangedBy=Issue119|MWE=Pesquisa_Datafolha|MWEPOS=PROPN\n3\tDatafolha\tDatafolha\tPROPN\t_\tNumber=Sing\t2\tflat:name\t_\tChangedBy=Issue119\n4\tpublicada\tpublicar\tVERB\t<mv>|V|PCP|F|S|@ICL-N<\tGender=Fem|Number=Sing|VerbForm=Part\t2\tacl\t_\t_\n5\thoje\thoje\tADV\tADV|@<ADVL\t_\t4\tadvmod\t_\t_\n6\trevela\trevelar\tVERB\t<mv>|V|PR|3S|IND|@FS-STA\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t0\troot\t_\t_\n7\tum\tum\tDET\t<arti>|ART|M|S|@>N\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\t8\tdet\t_\t_\n8\tdado\tdado\tNOUN\t<np-idf>|N|M|S|@<ACC\tGender=Masc|Number=Sing\t6\tobj\t_\t_\n9\tsupreendente\tsurpreendente\tADJ\tADJ|M|S|@N<\tGender=Masc|Number=Sing\t8\tamod\t_\tChangedBy=Issue165|SpaceAfter=No\n10\t:\t:\tPUNCT\tPU|@PU\t_\t26\tpunct\t_\t_\n11\trecusando\trecusar\tVERB\t<mv>|V|GER|@ICL-ADVL>\tVerbForm=Ger\t26\tadvcl\t_\t_\n12\tuma\tum\tDET\t<arti>|ART|F|S|@>N\tDefinite=Ind|Gender=Fem|Number=Sing|PronType=Art\t13\tdet\t_\t_\n13\tpostura\tpostura\tNOUN\t<np-idf>|N|F|S|@<ACC\tGender=Fem|Number=Sing\t11\tobj\t_\t_\n14\tradical\tradical\tADJ\tADJ|F|S|@N<\tGender=Fem|Number=Sing\t13\tamod\t_\tChangedBy=Issue165|SpaceAfter=No\n15\t,\t,\tPUNCT\tPU|@PU\t_\t26\tpunct\t_\t_\n16\ta\to\tDET\t<artd>|ART|F|S|@>N\tDefinite=Def|Gender=Fem|Number=Sing|PronType=Art\t18\tdet\t_\t_\n17\tesmagadora\tesmagador\tADJ\tADJ|F|S|@>N\tGender=Fem|Number=Sing\t18\tamod\t_\t_\n18\tmaioria\tmaioria\tNOUN\t<np-def>|N|F|S|@SUBJ>\tGender=Fem|Number=Sing\t26\tnsubj\t_\t_\n19\t(\t(\tPUNCT\tPU|@PU\t_\t21\tpunct\t_\tChangedBy=Issue165|SpaceAfter=No\n20\t77\t77\tNUM\t<card>|NUM|M|P|@>N\tNumType=Card\t21\tnummod\t_\tChangedBy=Issue165|ChangedBy=Issue168|SpaceAfter=No\n21\t%\t%\tSYM\t<np-def>|N|M|P|@N<PRED\tGender=Masc|Number=Plur\t18\tappos\t_\tChangedBy=Issue165|SpaceAfter=No\n22\t)\t)\tPUNCT\tPU|@PU\t_\t21\tpunct\t_\t_\n23-24\tdos\t_\t_\t_\t_\t_\t_\t_\t_\n23\tde\tde\tADP\t<sam->|PRP|@N<\t_\t25\tcase\t_\t_\n24\tos\to\tDET\t<-sam>|<artd>|ART|M|P|@>N\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\t25\tdet\t_\t_\n25\teleitores\teleitor\tNOUN\t<np-def>|N|M|P|@P<\tGender=Masc|Number=Plur\t18\tnmod\t_\t_\n26\tquer\tquerer\tVERB\t<mv>|V|PR|3S|IND|@FS-N<PRED\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t8\tacl:relcl\t_\t_\n27\to\to\tDET\t<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t28\tdet\t_\t_\n28\tPT\tPT\tPROPN\tPROP|M|S|@<ACC\tGender=Masc|Number=Sing\t26\tobj\t_\t_\n29\tparticipando\tparticipar\tVERB\t<mv>|V|GER|@ICL-<OC\tVerbForm=Ger\t26\txcomp\t_\t_\n30-31\tdo\t_\t_\t_\t_\t_\t_\t_\t_\n30\tde\tde\tADP\t<sam->|PRP|@<PIV\t_\t32\tcase\t_\t_\n31\to\to\tDET\t<-sam>|<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t32\tdet\t_\t_\n32\tGoverno\tgoverno\tNOUN\t<prop>|<np-def>|N|M|S|@P<\tGender=Masc|Number=Sing\t29\tobl\t_\t_\n33\tFernando\tFernando\tPROPN\t_\tGender=Masc|Number=Sing\t32\tnmod\t_\tChangedBy=Issue119|MWE=Fernando_Henrique_Cardoso|MWEPOS=PROPN\n34\tHenrique\tHenrique\tPROPN\t_\tNumber=Sing\t33\tflat:name\t_\tChangedBy=Issue119\n35\tCardoso\tCardoso\tPROPN\t_\tNumber=Sing\t33\tflat:name\t_\tSpaceAfter=No\n36\t.\t.\tPUNCT\tPU|@PU\t_\t6\tpunct\t_\t_\n\n# text = Tem sentido -- aliás, muitíssimo sentido.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a &D\n# sent_id = CF1-4\n# id = 3\n1\tTem\tter\tVERB\t<mv>|V|PR|3S|IND|@FS-STA\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t0\troot\t_\t_\n2\tsentido\tsentido\tNOUN\t<np-idf>|N|M|S|@<ACC\tGender=Masc|Number=Sing\t1\tobj\t_\t_\n3\t--\t--\tPUNCT\tPU|@PU\t_\t1\tpunct\t_\t_\n4\taliás\taliás\tADV\t<kc>|ADV|@<ADVL\t_\t1\tadvmod\t_\tChangedBy=Issue165|SpaceAfter=No\n5\t,\t,\tPUNCT\tPU|@PU\t_\t7\tpunct\t_\t_\n6\tmuitíssimo\tmuitíssimo\tDET\t<quant>|<SUP>|DET|M|S|@>N\tGender=Masc|Number=Sing|PronType=Ind\t7\tdet\t_\t_\n7\tsentido\tsentido\tNOUN\t<np-idf>|N|M|S|@N<PRED\tGender=Masc|Number=Sing\t2\tappos\t_\tChangedBy=Issue165|SpaceAfter=No\n8\t.\t.\tPUNCT\tPU|@PU\t_\t1\tpunct\t_\t_\n\n# text = Muito mais do que nos tempos na ditadura, a solidez do PT está, agora, ameaçada.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a\n# sent_id = CF1-5\n# id = 4\n1\tMuito\tmuito\tADV\t<quant>|ADV|@>A\t_\t2\tadvmod\t_\t_\n2\tmais\tmais\tADV\t<quant>|<KOMP>|<COMP>|ADV|@ADVL>\t_\t22\tadvmod\t_\t_\n3-4\tdo\t_\t_\t_\t_\t_\t_\t_\t_\n3\tde\tde\tADP\t<sam->|PRP|@COM\t_\t8\tcase\t_\t_\n4\to\to\tPRON\t<dem>|<-sam>|DET|M|S|@P<\tGender=Masc|Number=Sing|PronType=Dem\t3\tfixed\t_\t_\n5\tque\tque\tPRON\t<rel>|INDP|M|S|@N<\tGender=Masc|Number=Sing|PronType=Rel\t3\tfixed\t_\t_\n6-7\tnos\t_\t_\t_\t_\t_\t_\t_\t_\n6\tem\tem\tADP\t<sam->|<first-cjt>|PRP|@KOMP<\t_\t8\tcase\t_\t_\n7\tos\to\tDET\t<-sam>|<artd>|ART|M|P|@>N\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\t8\tdet\t_\t_\n8\ttempos\ttempo\tNOUN\t<first-cjt>|<np-def>|N|M|P|@P<\tGender=Masc|Number=Plur\t2\tobl\t_\t_\n9-10\tna\t_\t_\t_\t_\t_\t_\t_\t_\n9\tem\tem\tADP\t<sam->|PRP|@N<\t_\t11\tcase\t_\t_\n10\ta\to\tDET\t<-sam>|<artd>|ART|F|S|@>N\tDefinite=Def|Gender=Fem|Number=Sing|PronType=Art\t11\tdet\t_\t_\n11\tditadura\tditadura\tNOUN\t<np-def>|N|F|S|@P<\tGender=Fem|Number=Sing\t8\tnmod\t_\tChangedBy=Issue165|SpaceAfter=No\n12\t,\t,\tPUNCT\tPU|@PU\t_\t2\tpunct\t_\t_\n13\ta\to\tDET\t<artd>|ART|F|S|@>N\tDefinite=Def|Gender=Fem|Number=Sing|PronType=Art\t14\tdet\t_\t_\n14\tsolidez\tsolidez\tNOUN\t<np-def>|N|F|S|@SUBJ>\tGender=Fem|Number=Sing\t22\tnsubj\t_\t_\n15-16\tdo\t_\t_\t_\t_\t_\t_\t_\t_\n15\tde\tde\tADP\t<sam->|PRP|@N<\t_\t17\tcase\t_\t_\n16\to\to\tDET\t<-sam>|<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t17\tdet\t_\t_\n17\tPT\tPT\tPROPN\tPROP|M|S|@P<\tGender=Masc|Number=Sing\t14\tnmod\t_\t_\n18\testá\testar\tAUX\t<mv>|V|PR|3S|IND|@FS-STA\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t22\tcop\t_\tChangedBy=Issue165|ChangedBy=Issue167|SpaceAfter=No\n19\t,\t,\tPUNCT\tPU|@PU\t_\t20\tpunct\t_\t_\n20\tagora\tagora\tADV\t<kc>|ADV|@<ADVL\t_\t22\tadvmod\t_\tChangedBy=Issue165|SpaceAfter=No\n21\t,\t,\tPUNCT\tPU|@PU\t_\t20\tpunct\t_\t_\n22\tameaçada\tameaçar\tVERB\t<mv>|V|PCP|F|S|@ICL-<SC\tGender=Fem|Number=Sing|VerbForm=Part\t0\troot\t_\tChangedBy=Issue165|SpaceAfter=No\n23\t.\t.\tPUNCT\tPU|@PU\t_\t22\tpunct\t_\t_\n\n# text = Nem Lula nem o partido ainda encontraram um discurso para se diferenciar.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a\n# sent_id = CF1-6\n# id = 5\n1\tNem\tnem\tCCONJ\t<parkc-1>|KC|@CO\t_\t2\tcc\t_\t_\n2\tLula\tLula\tPROPN\t<first-cjt>|PROP|M|S|@SUBJ>\tGender=Masc|Number=Sing\t7\tnsubj\t_\t_\n3\tnem\tnem\tCCONJ\t<co-subj>|<parkc-2>|KC|@CO\t_\t5\tcc\t_\t_\n4\to\to\tDET\t<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t5\tdet\t_\t_\n5\tpartido\tpartido\tNOUN\t<cjt>|<np-def>|N|M|S|@SUBJ>\tGender=Masc|Number=Sing\t2\tconj\t_\t_\n6\tainda\tainda\tADV\tADV|@ADVL>\t_\t7\tadvmod\t_\t_\n7\tencontraram\tencontrar\tVERB\t<mv>|V|PS/MQP|3P|IND|@FS-STA\tMood=Ind|Number=Plur|Person=3|VerbForm=Fin\t0\troot\t_\t_\n8\tum\tum\tDET\t_\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\t9\tdet\t_\t_\n9\tdiscurso\tdiscurso\tNOUN\t<np-idf>|N|M|S|@<ACC\tGender=Masc|Number=Sing\t7\tobj\t_\t_\n10\tpara\tpara\tADP\t_\t_\t12\tcase\t_\t_\n11\tse\tse\tPRON\tPERS|M|3S|ACC|@ACC>-PASS\tCase=Acc|Gender=Masc|Number=Sing|Person=3|PronType=Prs\t12\texpl\t_\tChangedBy=Issue135\n12\tdiferenciar\tdiferenciar\tVERB\t_\tVerbForm=Inf\t9\tacl\t_\tChangedBy=Issue165|SpaceAfter=No\n13\t.\t.\tPUNCT\tPU|@PU\t_\t7\tpunct\t_\t_\n\n# text = Eles se dizem oposição, mas ainda não informaram o que vão combater.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a\n# sent_id = CF1-7\n# id = 6\n1\tEles\teles\tPRON\tPERS|M|3P|NOM|@SUBJ>\tCase=Nom|Gender=Masc|Number=Plur|Person=3|PronType=Prs\t3\tnsubj\t_\t_\n2\tse\tse\tPRON\tPERS|M|3P|ACC|@ACC>-PASS\tCase=Acc|Gender=Masc|Number=Plur|Person=3|PronType=Prs\t3\texpl\t_\tChangedBy=Issue135\n3\tdizem\tdizer\tVERB\t<first-cjt>|<mv>|<se-passive>|V|PR|3P|IND|@FS-STA\tMood=Ind|Number=Plur|Person=3|Tense=Pres|VerbForm=Fin\t0\troot\t_\t_\n4\toposição\toposição\tNOUN\t<np-idf>|N|F|S|@<OC\tGender=Fem|Number=Sing\t3\txcomp\t_\tChangedBy=Issue165|SpaceAfter=No\n5\t,\t,\tPUNCT\tPU|@PU\t_\t9\tpunct\t_\t_\n6\tmas\tmas\tCCONJ\t<co-fcl>|KC|@CO\t_\t9\tcc\t_\t_\n7\tainda\tainda\tADV\tADV|@>A\t_\t8\tadvmod\t_\t_\n8\tnão\tnão\tADV\t_\tPolarity=Neg\t9\tadvmod\t_\t_\n9\tinformaram\tinformar\tVERB\t<cjt>|<mv>|V|PS/MQP|3P|IND|@FS-STA\tMood=Ind|Number=Plur|Person=3|VerbForm=Fin\t3\tconj\t_\t_\n10\to\to\tPRON\t_\tGender=Masc|Number=Sing|PronType=Dem\t11\tdet\t_\t_\n11\tque\tque\tPRON\t<interr>|INDP|M|S|@ACC>\tGender=Masc|Number=Sing|PronType=Int\t13\tobj\t_\t_\n12\tvão\tir\tAUX\t<aux>|V|PR|3P|IND|@FS-<ACC\tMood=Ind|Number=Plur|Person=3|Tense=Pres|VerbForm=Fin\t13\taux\t_\t_\n13\tcombater\tcombater\tVERB\t<mv>|V|INF|@ICL-AUX<\tVerbForm=Inf\t9\tccomp\t_\tChangedBy=Issue165|SpaceAfter=No\n14\t.\t.\tPUNCT\tPU|@PU\t_\t3\tpunct\t_\t_\n\n# text = Muitas das prioridades do novo governo coincidem com as prioridades do PT.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a\n# sent_id = CF1-8\n# id = 7\n1\tMuitas\tmuito\tPRON\t<quant>|DET|F|P|@SUBJ>\tGender=Fem|Number=Plur|PronType=Ind\t9\tnsubj\t_\t_\n2-3\tdas\t_\t_\t_\t_\t_\t_\t_\t_\n2\tde\tde\tADP\t<sam->|PRP|@N<\t_\t4\tcase\t_\t_\n3\tas\to\tDET\t<-sam>|<artd>|ART|F|P|@>N\tDefinite=Def|Gender=Fem|Number=Plur|PronType=Art\t4\tdet\t_\t_\n4\tprioridades\tprioridade\tNOUN\t<np-def>|N|F|P|@P<\tGender=Fem|Number=Plur\t1\tnmod\t_\t_\n5-6\tdo\t_\t_\t_\t_\t_\t_\t_\t_\n5\tde\tde\tADP\t<sam->|PRP|@N<\t_\t8\tcase\t_\t_\n6\to\to\tDET\t<-sam>|<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t8\tdet\t_\t_\n7\tnovo\tnovo\tADJ\tADJ|M|S|@>N\tGender=Masc|Number=Sing\t8\tamod\t_\t_\n8\tgoverno\tgoverno\tNOUN\t<np-def>|N|M|S|@P<\tGender=Masc|Number=Sing\t4\tnmod\t_\t_\n9\tcoincidem\tcoincidir\tVERB\t<mv>|V|PR|3P|IND|@FS-STA\tMood=Ind|Number=Plur|Person=3|Tense=Pres|VerbForm=Fin\t0\troot\t_\t_\n10\tcom\tcom\tADP\tPRP|@<PIV\t_\t12\tcase\t_\t_\n11\tas\to\tDET\t<artd>|ART|F|P|@>N\tDefinite=Def|Gender=Fem|Number=Plur|PronType=Art\t12\tdet\t_\t_\n12\tprioridades\tprioridade\tNOUN\t<np-def>|N|F|P|@P<\tGender=Fem|Number=Plur\t9\tobj\t_\t_\n13-14\tdo\t_\t_\t_\t_\t_\t_\t_\t_\n13\tde\tde\tADP\t<sam->|PRP|@N<\t_\t15\tcase\t_\t_\n14\to\to\tDET\t<-sam>|<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t15\tdet\t_\t_\n15\tPT\tPT\tPROPN\tPROP|M|S|@P<\tGender=Masc|Number=Sing\t12\tnmod\t_\tChangedBy=Issue165|SpaceAfter=No\n16\t.\t.\tPUNCT\tPU|@PU\t_\t9\tpunct\t_\t_\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoNLL-U/en-ud-test-abridged.conllu",
    "content": "# newdoc id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200\n# sent_id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200-0001\n# text = What if Google Morphed Into GoogleOS?\n1\tWhat\twhat\tPRON\tWP\tPronType=Int\t0\troot\t0:root\t_\n2\tif\tif\tSCONJ\tIN\t_\t4\tmark\t4:mark\t_\n3\tGoogle\tGoogle\tPROPN\tNNP\tNumber=Sing\t4\tnsubj\t4:nsubj\t_\n4\tMorphed\tmorph\tVERB\tVBD\tMood=Ind|Tense=Past|VerbForm=Fin\t1\tadvcl\t1:advcl\t_\n5\tInto\tinto\tADP\tIN\t_\t6\tcase\t6:case\t_\n6\tGoogleOS\tGoogleOS\tPROPN\tNNP\tNumber=Sing\t4\tobl\t4:obl\tSpaceAfter=No\n7\t?\t?\tPUNCT\t.\t_\t4\tpunct\t4:punct\t_\n\n# sent_id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200-0002\n# text = What if Google expanded on its search-engine (and now e-mail) wares into a full-fledged operating system?\n1\tWhat\twhat\tPRON\tWP\tPronType=Int\t0\troot\t0:root\t_\n2\tif\tif\tSCONJ\tIN\t_\t4\tmark\t4:mark\t_\n3\tGoogle\tGoogle\tPROPN\tNNP\tNumber=Sing\t4\tnsubj\t4:nsubj\t_\n4\texpanded\texpand\tVERB\tVBD\tMood=Ind|Tense=Past|VerbForm=Fin\t1\tadvcl\t1:advcl\t_\n5\ton\ton\tADP\tIN\t_\t15\tcase\t15:case\t_\n6\tits\tits\tPRON\tPRP$\tGender=Neut|Number=Sing|Person=3|Poss=Yes|PronType=Prs\t15\tnmod:poss\t15:nmod:poss\t_\n7\tsearch\tsearch\tNOUN\tNN\tNumber=Sing\t9\tcompound\t9:compound\tSpaceAfter=No\n8\t-\t-\tPUNCT\tHYPH\t_\t9\tpunct\t9:punct\tSpaceAfter=No\n9\tengine\tengine\tNOUN\tNN\tNumber=Sing\t15\tcompound\t15:compound\t_\n10\t(\t(\tPUNCT\t-LRB-\t_\t9\tpunct\t9:punct\tSpaceAfter=No\n11\tand\tand\tCCONJ\tCC\t_\t13\tcc\t13:cc\t_\n12\tnow\tnow\tADV\tRB\t_\t13\tadvmod\t13:advmod\t_\n13\te-mail\te-mail\tNOUN\tNN\tNumber=Sing\t9\tconj\t9:conj\tSpaceAfter=No\n14\t)\t)\tPUNCT\t-RRB-\t_\t15\tpunct\t15:punct\t_\n15\twares\twares\tNOUN\tNNS\tNumber=Plur\t4\tobl\t4:obl\t_\n16\tinto\tinto\tADP\tIN\t_\t22\tcase\t22:case\t_\n17\ta\ta\tDET\tDT\tDefinite=Ind|PronType=Art\t22\tdet\t22:det\t_\n18\tfull\tfull\tADV\tRB\t_\t20\tadvmod\t20:advmod\tSpaceAfter=No\n19\t-\t-\tPUNCT\tHYPH\t_\t20\tpunct\t20:punct\tSpaceAfter=No\n20\tfledged\tfledged\tADJ\tJJ\tDegree=Pos\t22\tamod\t22:amod\t_\n21\toperating\toperating\tNOUN\tNN\tNumber=Sing\t22\tcompound\t22:compound\t_\n22\tsystem\tsystem\tNOUN\tNN\tNumber=Sing\t4\tobl\t4:obl\tSpaceAfter=No\n23\t?\t?\tPUNCT\t.\t_\t4\tpunct\t4:punct\t_\n\n# sent_id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200-0003\n# text = [via Microsoft Watch from Mary Jo Foley ]\n1\t[\t[\tPUNCT\t-LRB-\t_\t4\tpunct\t4:punct\tSpaceAfter=No\n2\tvia\tvia\tADP\tIN\t_\t4\tcase\t4:case\t_\n3\tMicrosoft\tMicrosoft\tPROPN\tNNP\tNumber=Sing\t4\tcompound\t4:compound\t_\n4\tWatch\tWatch\tPROPN\tNNP\tNumber=Sing\t0\troot\t0:root\t_\n5\tfrom\tfrom\tADP\tIN\t_\t6\tcase\t6:case\t_\n6\tMary\tMary\tPROPN\tNNP\tNumber=Sing\t4\tnmod\t4:nmod\t_\n7\tJo\tJo\tPROPN\tNNP\tNumber=Sing\t6\tflat\t6:flat\t_\n8\tFoley\tFoley\tPROPN\tNNP\tNumber=Sing\t6\tflat\t6:flat\t_\n9\t]\t]\tPUNCT\t-RRB-\t_\t4\tpunct\t4:punct\t_\n\n# newdoc id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700\n# sent_id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700-0001\n# text = (And, by the way, is anybody else just a little nostalgic for the days when that was a good thing?)\n1\t(\t(\tPUNCT\t-LRB-\t_\t14\tpunct\t14:punct\tSpaceAfter=No\n2\tAnd\tand\tCCONJ\tCC\t_\t14\tcc\t14:cc\tSpaceAfter=No\n3\t,\t,\tPUNCT\t,\t_\t14\tpunct\t14:punct\t_\n4\tby\tby\tADP\tIN\t_\t6\tcase\t6:case\t_\n5\tthe\tthe\tDET\tDT\tDefinite=Def|PronType=Art\t6\tdet\t6:det\t_\n6\tway\tway\tNOUN\tNN\tNumber=Sing\t14\tobl\t14:obl\tSpaceAfter=No\n7\t,\t,\tPUNCT\t,\t_\t14\tpunct\t14:punct\t_\n8\tis\tbe\tAUX\tVBZ\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t14\tcop\t14:cop\t_\n9\tanybody\tanybody\tPRON\tNN\tNumber=Sing\t14\tnsubj\t14:nsubj\t_\n10\telse\telse\tADJ\tJJ\tDegree=Pos\t9\tamod\t9:amod\t_\n11\tjust\tjust\tADV\tRB\t_\t13\tadvmod\t13:advmod\t_\n12\ta\ta\tDET\tDT\tDefinite=Ind|PronType=Art\t13\tdet\t13:det\t_\n13\tlittle\tlittle\tADJ\tJJ\tDegree=Pos\t14\tobl:npmod\t14:obl:npmod\t_\n14\tnostalgic\tnostalgic\tNOUN\tNN\tNumber=Sing\t0\troot\t0:root\t_\n15\tfor\tfor\tADP\tIN\t_\t17\tcase\t17:case\t_\n16\tthe\tthe\tDET\tDT\tDefinite=Def|PronType=Art\t17\tdet\t17:det\t_\n17\tdays\tday\tNOUN\tNNS\tNumber=Plur\t14\tnmod\t14:nmod\t_\n18\twhen\twhen\tADV\tWRB\tPronType=Rel\t23\tadvmod\t23:advmod\t_\n19\tthat\tthat\tPRON\tDT\tNumber=Sing|PronType=Dem\t23\tnsubj\t23:nsubj\t_\n20\twas\tbe\tAUX\tVBD\tMood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin\t23\tcop\t23:cop\t_\n21\ta\ta\tDET\tDT\tDefinite=Ind|PronType=Art\t23\tdet\t23:det\t_\n22\tgood\tgood\tADJ\tJJ\tDegree=Pos\t23\tamod\t23:amod\t_\n23\tthing\tthing\tNOUN\tNN\tNumber=Sing\t17\tacl:relcl\t17:acl:relcl\tSpaceAfter=No\n24\t?\t?\tPUNCT\t.\t_\t14\tpunct\t14:punct\tSpaceAfter=No\n25\t)\t)\tPUNCT\t-RRB-\t_\t14\tpunct\t14:punct\t_\n\n# sent_id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700-0002\n# text = This BuzzMachine post argues that Google's rush toward ubiquity might backfire -- which we've all heard before, but it's particularly well-put in this post.\n1\tThis\tthis\tDET\tDT\tNumber=Sing|PronType=Dem\t3\tdet\t3:det\t_\n2\tBuzzMachine\tBuzzMachine\tPROPN\tNNP\tNumber=Sing\t3\tcompound\t3:compound\t_\n3\tpost\tpost\tNOUN\tNN\tNumber=Sing\t4\tnsubj\t4:nsubj\t_\n4\targues\targue\tVERB\tVBZ\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t0\troot\t0:root\t_\n5\tthat\tthat\tSCONJ\tIN\t_\t12\tmark\t12:mark\t_\n6\tGoogle\tGoogle\tPROPN\tNNP\tNumber=Sing\t8\tnmod:poss\t8:nmod:poss\tSpaceAfter=No\n7\t's\t's\tPART\tPOS\t_\t6\tcase\t6:case\t_\n8\trush\trush\tNOUN\tNN\tNumber=Sing\t12\tnsubj\t12:nsubj\t_\n9\ttoward\ttoward\tADP\tIN\t_\t10\tcase\t10:case\t_\n10\tubiquity\tubiquity\tNOUN\tNN\tNumber=Sing\t8\tnmod\t8:nmod\t_\n11\tmight\tmight\tAUX\tMD\tVerbForm=Fin\t12\taux\t12:aux\t_\n12\tbackfire\tbackfire\tVERB\tVB\tVerbForm=Inf\t4\tccomp\t4:ccomp\t_\n13\t--\t--\tPUNCT\t,\t_\t12\tpunct\t12:punct\t_\n14\twhich\twhich\tPRON\tWDT\tPronType=Rel\t18\tobj\t18:obj\t_\n15\twe\twe\tPRON\tPRP\tCase=Nom|Number=Plur|Person=1|PronType=Prs\t18\tnsubj\t18:nsubj\tSpaceAfter=No\n16\t've\thave\tAUX\tVBP\tMood=Ind|Tense=Pres|VerbForm=Fin\t18\taux\t18:aux\t_\n17\tall\tall\tADV\tRB\t_\t18\tadvmod\t18:advmod\t_\n18\theard\thear\tVERB\tVBN\tTense=Past|VerbForm=Part\t12\tacl:relcl\t12:acl:relcl\t_\n19\tbefore\tbefore\tADV\tRB\t_\t18\tadvmod\t18:advmod\tSpaceAfter=No\n20\t,\t,\tPUNCT\t,\t_\t27\tpunct\t27:punct\t_\n21\tbut\tbut\tCCONJ\tCC\t_\t27\tcc\t27:cc\t_\n22\tit\tit\tPRON\tPRP\tCase=Nom|Gender=Neut|Number=Sing|Person=3|PronType=Prs\t27\tnsubj:pass\t27:nsubj:pass\tSpaceAfter=No\n23\t's\tbe\tVERB\tVBZ\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t27\taux:pass\t27:aux:pass\t_\n24\tparticularly\tparticularly\tADV\tRB\t_\t27\tadvmod\t27:advmod\t_\n25\twell\twell\tADV\tRB\tDegree=Pos\t27\tadvmod\t27:advmod\tSpaceAfter=No\n26\t-\t-\tPUNCT\tHYPH\t_\t27\tpunct\t27:punct\tSpaceAfter=No\n27\tput\tput\tVERB\tVBN\tTense=Past|VerbForm=Part\t4\tconj\t4:conj\t_\n28\tin\tin\tADP\tIN\t_\t30\tcase\t30:case\t_\n29\tthis\tthis\tDET\tDT\tNumber=Sing|PronType=Dem\t30\tdet\t30:det\t_\n30\tpost\tpost\tNOUN\tNN\tNumber=Sing\t27\tobl\t27:obl\tSpaceAfter=No\n31\t.\t.\tPUNCT\t.\t_\t4\tpunct\t4:punct\t_\n\n# sent_id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700-0003\n# text = Google is a nice search engine.\n1\tGoogle\tGoogle\tPROPN\tNNP\tNumber=Sing\t6\tnsubj\t6:nsubj\t_\n2\tis\tbe\tAUX\tVBZ\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t6\tcop\t6:cop\t_\n3\ta\ta\tDET\tDT\tDefinite=Ind|PronType=Art\t6\tdet\t6:det\t_\n4\tnice\tnice\tADJ\tJJ\tDegree=Pos\t6\tamod\t6:amod\t_\n5\tsearch\tsearch\tNOUN\tNN\tNumber=Sing\t6\tcompound\t6:compound\t_\n6\tengine\tengine\tNOUN\tNN\tNumber=Sing\t0\troot\t0:root\tSpaceAfter=No\n7\t.\t.\tPUNCT\t.\t_\t6\tpunct\t6:punct\t_\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoNLL-U/ug-ud-test-abridged.conllu",
    "content": "# sent_id = s1\n# text = ئاسماننى كۆپكۈك، دەريا، كۆل سۇلىرىنى سۈپسۈزۈك تۇرۇشقا، دەل - دەرەخلەرنى بۈك - باراقسان بولۇشقا، ھايۋانلارنى ئەركىن ئازادە ياشاشقا ئىگە قىلىش... بىزنىڭ ئورتاق ئارزۇيىمىز.\n1\tئاسماننى\t_\tNOUN\tN\t_\t30\tcsubj\t_\tTranslit=asmanni\n2\tكۆپكۈك\t_\tVERB\tV\t_\t1\torphan\t_\tSpaceAfter=No|Translit=köpkük\n3\t،\t_\tPUNCT\tY\t_\t2\tpunct\t_\tTranslit=,\n4\tدەريا\t_\tNOUN\tN\t_\t7\tnmod:poss\t_\tSpaceAfter=No|Translit=derya\n5\t،\t_\tPUNCT\tY\t_\t4\tpunct\t_\tTranslit=,\n6\tكۆل\t_\tNOUN\tN\t_\t4\tconj\t_\tTranslit=köl\n7\tسۇلىرىنى\t_\tNOUN\tN\t_\t9\tobj\t_\tTranslit=sulirini\n8\tسۈپسۈزۈك\t_\tADJ\tA\t_\t9\tadvmod\t_\tTranslit=süpsüzük\n9\tتۇرۇشقا\t_\tVERB\tV\t_\t1\tconj\t_\tSpaceAfter=No|Translit=turushqa\n10\t،\t_\tPUNCT\tY\t_\t1\tpunct\t_\tTranslit=,\n11\tدەل\t_\tADV\tD\t_\t13\tcompound:redup\t_\tTranslit=del\n12\t-\t_\tPUNCT\tY\t_\t11\tpunct\t_\tTranslit=-\n13\tدەرەخلەرنى\t_\tNOUN\tN\t_\t17\tobj\t_\tTranslit=derexlerni\n14\tبۈك\t_\tADJ\tA\t_\t16\tcompound\t_\tTranslit=bük\n15\t-\t_\tPUNCT\tY\t_\t14\tpunct\t_\tTranslit=-\n16\tباراقسان\t_\tADJ\tA\t_\t17\tadvmod\t_\tTranslit=baraqsan\n17\tبولۇشقا\t_\tVERB\tV\t_\t9\torphan\t_\tSpaceAfter=No|Translit=bolushqa\n18\t،\t_\tPUNCT\tY\t_\t17\tpunct\t_\tTranslit=,\n19\tھايۋانلارنى\t_\tNOUN\tN\t_\t24\tobj\t_\tTranslit=haywanlarni\n20\tئەركىن\t_\tADJ\tA\t_\t21\tcompound:redup\t_\tTranslit=erkin\n21\tئازادە\t_\tADJ\tA\t_\t22\tadvmod\t_\tTranslit=azade\n22\tياشاشقا\t_\tNOUN\tN\t_\t24\tadvcl\t_\tTranslit=yashashqa\n23\tئىگە\t_\tNOUN\tN\t_\t24\tcompound\t_\tTranslit=ige\n24\tقىلىش\t_\tVERB\tV\t_\t1\tconj\t_\tSpaceAfter=No|Translit=qilish\n25\t.\t_\tPUNCT\tY\t_\t1\tpunct\t_\tSpaceAfter=No|Translit=.\n26\t.\t_\tPUNCT\tY\t_\t1\tpunct\t_\tSpaceAfter=No|Translit=.\n27\t.\t_\tPUNCT\tY\t_\t1\tpunct\t_\tTranslit=.\n28\tبىزنىڭ\t_\tPRON\tP\t_\t30\tnmod:poss\t_\tTranslit=bizning\n29\tئورتاق\t_\tADJ\tA\t_\t30\tamod\t_\tTranslit=ortaq\n30\tئارزۇيىمىز\t_\tNOUN\tN\t_\t0\troot\t_\tSpaceAfter=No|Translit=arzuyimiz\n31\t.\t_\tPUNCT\tY\t_\t30\tpunct\t_\tTranslit=.\n\n# sent_id = s2\n# text = بۇ بۆلەكتىكى تېكىستلەرنى ئوقۇش ئارقىلىق، كىشىلەرنىڭ ھايۋانلار ۋە ئۆسۈملۈكلەرگە قانداق مۇئامىلە قىلغانلىقى، ئاقىۋىتىنىڭ قانداق بولغانلىقىنى كۆرۈپ باقايلى،\n1\tبۇ\t_\tPRON\tP\t_\t2\tdet\t_\tTranslit=bu\n2\tبۆلەكتىكى\t_\tNOUN\tN\t_\t3\tnmod\t_\tTranslit=bölektiki\n3\tتېكىستلەرنى\t_\tNOUN\tN\t_\t4\tobj\t_\tTranslit=tëkistlerni\n4\tئوقۇش\t_\tVERB\tV\t_\t18\tadvcl\t_\tTranslit=oqush\n5\tئارقىلىق\t_\tADP\tR\t_\t4\tcase\t_\tSpaceAfter=No|Translit=arqiliq\n6\t،\t_\tPUNCT\tY\t_\t5\tpunct\t_\tTranslit=,\n7\tكىشىلەرنىڭ\t_\tNOUN\tN\t_\t13\tnsubj\t_\tTranslit=kishilerning\n8\tھايۋانلار\t_\tNOUN\tN\t_\t13\tobl\t_\tTranslit=haywanlar\n9\tۋە\t_\tCCONJ\tC\t_\t10\tcc\t_\tTranslit=we\n10\tئۆسۈملۈكلەرگە\t_\tNOUN\tN\t_\t8\tconj\t_\tTranslit=ösümlüklerge\n11\tقانداق\t_\tPRON\tP\t_\t13\tadvmod\t_\tTranslit=qandaq\n12\tمۇئامىلە\t_\tNOUN\tN\t_\t13\tcompound\t_\tTranslit=muamile\n13\tقىلغانلىقى\t_\tVERB\tV\t_\t18\tconj\t_\tSpaceAfter=No|Translit=qilghanliqi\n14\t،\t_\tPUNCT\tY\t_\t13\tpunct\t_\tTranslit=,\n15\tئاقىۋىتىنىڭ\t_\tNOUN\tN\t_\t17\tnsubj\t_\tTranslit=aqiwitining\n16\tقانداق\t_\tPRON\tP\t_\t17\tadvmod\t_\tTranslit=qandaq\n17\tبولغانلىقىنى\t_\tVERB\tV\t_\t18\tobj\t_\tTranslit=bolghanliqini\n18\tكۆرۈپ\t_\tVERB\tV\t_\t0\troot\t_\tTranslit=körüp\n19\tباقايلى\t_\tVERB\tV\t_\t18\taux\t_\tSpaceAfter=No|Translit=baqayli\n20\t،\t_\tPUNCT\tY\t_\t19\tpunct\t_\tTranslit=,\n\n# sent_id = s3\n# text = يەنە ئەتراپىمىزدىكى مۇھىتنى ياخشى كۆزىتىپ، مۇھىتنى قوغداش ئۈچۈن نېمىلەرنى قىلالايدىغانلىقىمىز توغرۇلۇق ئويلىنىپ باقايلى.\n1\tيەنە\t_\tADV\tD\t_\t13\tcc\t_\tTranslit=yene\n2\tئەتراپىمىزدىكى\t_\tNOUN\tN\t_\t3\tamod\t_\tTranslit=etrapimizdiki\n3\tمۇھىتنى\t_\tNOUN\tN\t_\t5\tobj\t_\tTranslit=muhitni\n4\tياخشى\t_\tADJ\tA\t_\t5\tadvmod\t_\tTranslit=yaxshi\n5\tكۆزىتىپ\t_\tVERB\tV\t_\t13\tadvcl\t_\tSpaceAfter=No|Translit=közitip\n6\t،\t_\tPUNCT\tY\t_\t5\tpunct\t_\tTranslit=,\n7\tمۇھىتنى\t_\tNOUN\tN\t_\t8\tobj\t_\tTranslit=muhitni\n8\tقوغداش\t_\tVERB\tV\t_\t11\tadvcl\t_\tTranslit=qoghdash\n9\tئۈچۈن\t_\tCCONJ\tC\t_\t8\tcase\t_\tTranslit=üchün\n10\tنېمىلەرنى\t_\tPRON\tP\t_\t11\tobj\t_\tTranslit=nëmilerni\n11\tقىلالايدىغانلىقىمىز\t_\tVERB\tV\t_\t13\tobj\t_\tTranslit=qilalaydighanliqimiz\n12\tتوغرۇلۇق\t_\tADP\tR\t_\t11\tcase\t_\tTranslit=toghruluq\n13\tئويلىنىپ\t_\tVERB\tV\t_\t0\troot\t_\tTranslit=oylinip\n14\tباقايلى\t_\tVERB\tV\t_\t13\taux\t_\tSpaceAfter=No|Translit=baqayli\n15\t.\t_\tPUNCT\tY\t_\t14\tpunct\t_\tTranslit=.\n\n# sent_id = s4\n# text = بىر يىلى باھار كۈنلىرىنىڭ بىرىدە، شىۋېتسارىيىنىڭ بىر ۋوگزالىدا ھاۋا تەڭشىگۈچ ئورنىتىلغان چىرايلىق، ئازادە بىر پويىز قوزغىلىش ئالدىدا تۇراتتى.\n1\tبىر\t_\tNUM\tM\t_\t2\tnummod\t_\tTranslit=bir\n2\tيىلى\t_\tNOUN\tN\t_\t20\tnmod:tmod\t_\tTranslit=yili\n3\tباھار\t_\tNOUN\tN\t_\t4\tnmod:poss\t_\tTranslit=bahar\n4\tكۈنلىرىنىڭ\t_\tNOUN\tN\t_\t5\tnmod:part\t_\tTranslit=künlirining\n5\tبىرىدە\t_\tNUM\tM\t_\t20\tnmod:tmod\t_\tSpaceAfter=No|Translit=biride\n6\t،\t_\tPUNCT\tY\t_\t5\tpunct\t_\tTranslit=,\n7\tشىۋېتسارىيىنىڭ\t_\tNOUN\tN\t_\t9\tnmod:poss\t_\tTranslit=shiwëtsariyining\n8\tبىر\t_\tNUM\tM\t_\t9\tdet\t_\tTranslit=bir\n9\tۋوگزالىدا\t_\tNOUN\tN\t_\t20\tobl\t_\tTranslit=wogzalida\n10\tھاۋا\t_\tNOUN\tN\t_\t11\tcompound\t_\tTranslit=hawa\n11\tتەڭشىگۈچ\t_\tNOUN\tN\t_\t12\tnsubj\t_\tTranslit=tengshigüch\n12\tئورنىتىلغان\t_\tNOUN\tN\t_\t17\tamod\t_\tTranslit=ornitilghan\n13\tچىرايلىق\t_\tADJ\tA\t_\t17\tamod\t_\tSpaceAfter=No|Translit=chirayliq\n14\t،\t_\tPUNCT\tY\t_\t13\tpunct\t_\tTranslit=,\n15\tئازادە\t_\tADJ\tA\t_\t13\tconj\t_\tTranslit=azade\n16\tبىر\t_\tNUM\tM\t_\t17\tdet\t_\tTranslit=bir\n17\tپويىز\t_\tNOUN\tN\t_\t20\tnsubj\t_\tTranslit=poyiz\n18\tقوزغىلىش\t_\tVERB\tV\t_\t19\tnmod:poss\t_\tTranslit=qozghilish\n19\tئالدىدا\t_\tNOUN\tN\t_\t20\tobl\t_\tTranslit=aldida\n20\tتۇراتتى\t_\tVERB\tV\t_\t0\troot\t_\tSpaceAfter=No|Translit=turatti\n21\t.\t_\tPUNCT\tY\t_\t20\tpunct\t_\tTranslit=.\n\n# sent_id = s5\n# text = ۋوگزال سۇپىسى ئۇزاتقۇچىلار بىلەن تولۇپ كەتكەنىدى.\n1\tۋوگزال\t_\tNOUN\tN\t_\t2\tnmod:poss\t_\tTranslit=wogzal\n2\tسۇپىسى\t_\tNOUN\tN\t_\t5\tnsubj\t_\tTranslit=supisi\n3\tئۇزاتقۇچىلار\t_\tNOUN\tN\t_\t5\tobl\t_\tTranslit=uzatquchilar\n4\tبىلەن\t_\tADP\tR\t_\t3\tcase\t_\tTranslit=bilen\n5\tتولۇپ\t_\tVERB\tV\t_\t0\troot\t_\tTranslit=tolup\n6\tكەتكەنىدى\t_\tVERB\tV\t_\t5\taux\t_\tSpaceAfter=No|Translit=ketkenidi\n7\t.\t_\tPUNCT\tY\t_\t6\tpunct\t_\tTranslit=.\n\n# sent_id = s6\n# text = ئۇلارنىڭ ئۇزاتماقچى بولغىنى ئۆزگىچە مىھمان - قارلىغاچلار ئىدى.\n1\tئۇلارنىڭ\t_\tPRON\tP\t_\t2\tnsubj\t_\tTranslit=ularning\n2\tئۇزاتماقچى\t_\tNOUN\tN\t_\t5\tacl\t_\tTranslit=uzatmaqchi\n3\tبولغىنى\t_\tAUX\tV\t_\t2\tcop\t_\tTranslit=bolghini\n4\tئۆزگىچە\t_\tADJ\tA\t_\t5\tamod\t_\tTranslit=özgiche\n5\tمىھمان\t_\tNOUN\tN\t_\t7\tappos\t_\tTranslit=mihman\n6\t-\t_\tPUNCT\tY\t_\t5\tpunct\t_\tTranslit=-\n7\tقارلىغاچلار\t_\tNOUN\tN\t_\t0\troot\t_\tTranslit=qarlighachlar\n8\tئىدى\t_\tAUX\tV\t_\t7\tcop\t_\tSpaceAfter=No|Translit=idi\n9\t.\t_\tPUNCT\tY\t_\t8\tpunct\t_\tTranslit=.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoffeeScript/browser.coffee",
    "content": "# Override exported methods for non-Node.js engines.\n\nCoffeeScript = require './coffee-script'\nCoffeeScript.require = require\n\n# Use standard JavaScript `eval` to eval code.\nCoffeeScript.eval = (code, options = {}) ->\n  options.bare ?= on\n  eval CoffeeScript.compile code, options\n\n# Running code does not provide access to this scope.\nCoffeeScript.run = (code, options = {}) ->\n  options.bare = on\n  Function(CoffeeScript.compile code, options)()\n\n# If we're not in a browser environment, we're finished with the public API.\nreturn unless window?\n\n# Load a remote script from the current domain via XHR.\nCoffeeScript.load = (url, callback) ->\n  xhr = new (window.ActiveXObject or XMLHttpRequest)('Microsoft.XMLHTTP')\n  xhr.open 'GET', url, true\n  xhr.overrideMimeType 'text/plain' if 'overrideMimeType' of xhr\n  xhr.onreadystatechange = ->\n    if xhr.readyState is 4\n      if xhr.status in [0, 200]\n        CoffeeScript.run xhr.responseText\n      else\n        throw new Error \"Could not load #{url}\"\n      callback() if callback\n  xhr.send null\n\n# Activate CoffeeScript in the browser by having it compile and evaluate\n# all script tags with a content-type of `text/coffeescript`.\n# This happens on page load.\nrunScripts = ->\n  scripts = document.getElementsByTagName 'script'\n  coffees = (s for s in scripts when s.type is 'text/coffeescript')\n  index = 0\n  length = coffees.length\n  do execute = ->\n    script = coffees[index++]\n    if script?.type is 'text/coffeescript'\n      if script.src\n        CoffeeScript.load script.src, execute\n      else\n        CoffeeScript.run script.innerHTML\n        execute()\n  null\n\n# Listen for window load, both in browsers and in IE.\nif window.addEventListener\n  addEventListener 'DOMContentLoaded', runScripts, no\nelse\n  attachEvent 'onload', runScripts\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoffeeScript/build.cake",
    "content": "fs = require 'fs'\n\n{print} = require 'sys'\n{spawn} = require 'child_process'\n\nbuild = (callback) ->\n\tcoffee = spawn 'coffee', ['-c', '-o', '.', '.']\n\tcoffee.stderr.on 'data', (data) ->\n\t\tprocess.stderr.write data.toString()\n\tcoffee.stdout.on 'data', (data) ->\n\t\tprint data.toString()\n\tcoffee.on 'exit', (code) ->\n\t\tcallback?() if code is 0\n\ntask 'build', 'Build from source',  ->\n\tbuild() \n\t"
  },
  {
    "path": "src/test/resources/samples/langs/CoffeeScript/classes.coffee",
    "content": "class Animal\n  constructor: (@name) ->\n\n  move: (meters) ->\n    alert @name + \" moved \" + meters + \"m.\"\n\nclass Snake extends Animal\n  move: ->\n    alert \"Slithering...\"\n    super 5\n\nclass Horse extends Animal\n  move: ->\n    alert \"Galloping...\"\n    super 45\n\nsam = new Snake \"Sammy the Python\"\ntom = new Horse \"Tommy the Palomino\"\n\nsam.move()\ntom.move()\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoffeeScript/coffee-script.coffee",
    "content": "# CoffeeScript can be used both on the server, as a command-line compiler based\n# on Node.js/V8, or to run CoffeeScripts directly in the browser. This module\n# contains the main entry functions for tokenizing, parsing, and compiling\n# source CoffeeScript into JavaScript.\n#\n# If included on a webpage, it will automatically sniff out, compile, and\n# execute all scripts present in `text/coffeescript` tags.\n\nfs               = require 'fs'\npath             = require 'path'\n{Lexer,RESERVED} = require './lexer'\n{parser}         = require './parser'\nvm               = require 'vm'\n\n# TODO: Remove registerExtension when fully deprecated.\nif require.extensions\n  require.extensions['.coffee'] = (module, filename) ->\n    content = compile fs.readFileSync(filename, 'utf8'), {filename}\n    module._compile content, filename\nelse if require.registerExtension\n  require.registerExtension '.coffee', (content) -> compile content\n\n# The current CoffeeScript version number.\nexports.VERSION = '1.3.3'\n\n# Words that cannot be used as identifiers in CoffeeScript code\nexports.RESERVED = RESERVED\n\n# Expose helpers for testing.\nexports.helpers = require './helpers'\n\n# Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison\n# compiler.\nexports.compile = compile = (code, options = {}) ->\n  {merge} = exports.helpers\n  try\n    js = (parser.parse lexer.tokenize code).compile options\n    return js unless options.header\n  catch err\n    err.message = \"In #{options.filename}, #{err.message}\" if options.filename\n    throw err\n  header = \"Generated by CoffeeScript #{@VERSION}\"\n  \"// #{header}\\n#{js}\"\n\n# Tokenize a string of CoffeeScript code, and return the array of tokens.\nexports.tokens = (code, options) ->\n  lexer.tokenize code, options\n\n# Parse a string of CoffeeScript code or an array of lexed tokens, and\n# return the AST. You can then compile it by calling `.compile()` on the root,\n# or traverse it by using `.traverseChildren()` with a callback.\nexports.nodes = (source, options) ->\n  if typeof source is 'string'\n    parser.parse lexer.tokenize source, options\n  else\n    parser.parse source\n\n# Compile and execute a string of CoffeeScript (on the server), correctly\n# setting `__filename`, `__dirname`, and relative `require()`.\nexports.run = (code, options = {}) ->\n  mainModule = require.main\n\n  # Set the filename.\n  mainModule.filename = process.argv[1] =\n      if options.filename then fs.realpathSync(options.filename) else '.'\n\n  # Clear the module cache.\n  mainModule.moduleCache and= {}\n\n  # Assign paths for node_modules loading\n  mainModule.paths = require('module')._nodeModulePaths path.dirname fs.realpathSync options.filename\n\n  # Compile.\n  if path.extname(mainModule.filename) isnt '.coffee' or require.extensions\n    mainModule._compile compile(code, options), mainModule.filename\n  else\n    mainModule._compile code, mainModule.filename\n\n# Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).\n# The CoffeeScript REPL uses this to run the input.\nexports.eval = (code, options = {}) ->\n  return unless code = code.trim()\n  Script = vm.Script\n  if Script\n    if options.sandbox?\n      if options.sandbox instanceof Script.createContext().constructor\n        sandbox = options.sandbox\n      else\n        sandbox = Script.createContext()\n        sandbox[k] = v for own k, v of options.sandbox\n      sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox\n    else\n      sandbox = global\n    sandbox.__filename = options.filename || 'eval'\n    sandbox.__dirname  = path.dirname sandbox.__filename\n    # define module/require only if they chose not to specify their own\n    unless sandbox isnt global or sandbox.module or sandbox.require\n      Module = require 'module'\n      sandbox.module  = _module  = new Module(options.modulename || 'eval')\n      sandbox.require = _require = (path) ->  Module._load path, _module, true\n      _module.filename = sandbox.__filename\n      _require[r] = require[r] for r in Object.getOwnPropertyNames require when r isnt 'paths'\n      # use the same hack node currently uses for their own REPL\n      _require.paths = _module.paths = Module._nodeModulePaths process.cwd()\n      _require.resolve = (request) -> Module._resolveFilename request, _module\n  o = {}\n  o[k] = v for own k, v of options\n  o.bare = on # ensure return value\n  js = compile code, o\n  if sandbox is global\n    vm.runInThisContext js\n  else\n    vm.runInContext js, sandbox\n\n# Instantiate a Lexer for our use here.\nlexer = new Lexer\n\n# The real Lexer produces a generic stream of tokens. This object provides a\n# thin wrapper around it, compatible with the Jison API. We can then pass it\n# directly as a \"Jison lexer\".\nparser.lexer =\n  lex: ->\n    [tag, @yytext, @yylineno] = @tokens[@pos++] or ['']\n    tag\n  setInput: (@tokens) ->\n    @pos = 0\n  upcomingInput: ->\n    \"\"\n\nparser.yy = require './nodes'\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoffeeScript/example.cjsx",
    "content": "###* @cjsx React.DOM ###\ndefine 'myProject.ReactExampleComponent', [\n  'React'\n  'myProject.ExampleStore'\n  'myProject.ExampleActions'\n  'myProject.ReactExampleTable'\n], (React, ExampleStore, ExampleActions, ReactExampleTable ) ->\n\n  ReactExampleComponent = React.createClass\n    mixins: [ListenMixin]\n\n    getInitialState: ->\n      rows: ExampleStore.getRows()\n      meta: ExampleStore.getMeta()\n\n    componentWillMount: ->\n      @listenTo ExampleStore\n\n    componentDidMount: ->\n      ExampleActions.getExampleData()\n\n    onStoreChange: ->\n      if this.isMounted()\n        @setState\n          rows: ExampleStore.getRows()\n          meta: ExampleStore.getMeta()\n\n    componentWillUnmount: ->\n      @stopListening ExampleStore\n\n    render: ->\n      <div className=\"page-wrap\">\n          <header>\n            <strong> {@state.title} </strong>\n          <header>\n            <ReactExampleTable\n              rows={@state.rows},\n              meta={@state.meta}\n            />\n      </div>\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoffeeScript/hello.coffee",
    "content": "console.log \"Hello, World!\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoffeeScript/intro.coffee",
    "content": "# Assignment:\nnumber   = 42\nopposite = true\n\n# Conditions:\nnumber = -42 if opposite\n\n# Functions:\nsquare = (x) -> x * x\n\n# Arrays:\nlist = [1, 2, 3, 4, 5]\n\n# Objects:\nmath =\n  root:   Math.sqrt\n  square: square\n  cube:   (x) -> x * square x\n\n# Splats:\nrace = (winner, runners...) ->\n  print winner, runners\n\n# Existence:\nalert \"I knew it!\" if elvis?\n\n# Array comprehensions:\ncubes = (math.cube num for num in list)\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoffeeScript/lexer.coffee",
    "content": "# The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt\n# matches against the beginning of the source code. When a match is found,\n# a token is produced, we consume the match, and start again. Tokens are in the\n# form:\n#\n#     [tag, value, lineNumber]\n#\n# Which is a format that can be fed directly into [Jison](http://github.com/zaach/jison).\n\n{Rewriter, INVERSES} = require './rewriter'\n\n# Import the helpers we need.\n{count, starts, compact, last} = require './helpers'\n\n# The Lexer Class\n# ---------------\n\n# The Lexer class reads a stream of CoffeeScript and divvies it up into tagged\n# tokens. Some potential ambiguity in the grammar has been avoided by\n# pushing some extra smarts into the Lexer.\nexports.Lexer = class Lexer\n\n  # **tokenize** is the Lexer's main method. Scan by attempting to match tokens\n  # one at a time, using a regular expression anchored at the start of the\n  # remaining code, or a custom recursive token-matching method\n  # (for interpolations). When the next token has been recorded, we move forward\n  # within the code past the token, and begin again.\n  #\n  # Each tokenizing method is responsible for returning the number of characters\n  # it has consumed.\n  #\n  # Before returning the token stream, run it through the [Rewriter](rewriter.html)\n  # unless explicitly asked not to.\n  tokenize: (code, opts = {}) ->\n    code     = \"\\n#{code}\" if WHITESPACE.test code\n    code     = code.replace(/\\r/g, '').replace TRAILING_SPACES, ''\n\n    @code    = code           # The remainder of the source code.\n    @line    = opts.line or 0 # The current line.\n    @indent  = 0              # The current indentation level.\n    @indebt  = 0              # The over-indentation at the current level.\n    @outdebt = 0              # The under-outdentation at the current level.\n    @indents = []             # The stack of all current indentation levels.\n    @ends    = []             # The stack for pairing up tokens.\n    @tokens  = []             # Stream of parsed tokens in the form `['TYPE', value, line]`.\n\n    # At every position, run through this list of attempted matches,\n    # short-circuiting if any of them succeed. Their order determines precedence:\n    # `@literalToken` is the fallback catch-all.\n    i = 0\n    while @chunk = code[i..]\n      i += @identifierToken() or\n           @commentToken()    or\n           @whitespaceToken() or\n           @lineToken()       or\n           @heredocToken()    or\n           @stringToken()     or\n           @numberToken()     or\n           @regexToken()      or\n           @jsToken()         or\n           @literalToken()\n\n    @closeIndentation()\n    @error \"missing #{tag}\" if tag = @ends.pop()\n    return @tokens if opts.rewrite is off\n    (new Rewriter).rewrite @tokens\n\n  # Tokenizers\n  # ----------\n\n  # Matches identifying literals: variables, keywords, method names, etc.\n  # Check to ensure that JavaScript reserved words aren't being used as\n  # identifiers. Because CoffeeScript reserves a handful of keywords that are\n  # allowed in JavaScript, we're careful not to tag them as keywords when\n  # referenced as property names here, so you can still do `jQuery.is()` even\n  # though `is` means `===` otherwise.\n  identifierToken: ->\n    return 0 unless match = IDENTIFIER.exec @chunk\n    [input, id, colon] = match\n\n    if id is 'own' and @tag() is 'FOR'\n      @token 'OWN', id\n      return id.length\n    forcedIdentifier = colon or\n      (prev = last @tokens) and (prev[0] in ['.', '?.', '::'] or\n      not prev.spaced and prev[0] is '@')\n    tag = 'IDENTIFIER'\n\n    if not forcedIdentifier and (id in JS_KEYWORDS or id in COFFEE_KEYWORDS)\n      tag = id.toUpperCase()\n      if tag is 'WHEN' and @tag() in LINE_BREAK\n        tag = 'LEADING_WHEN'\n      else if tag is 'FOR'\n        @seenFor = yes\n      else if tag is 'UNLESS'\n        tag = 'IF'\n      else if tag in UNARY\n        tag = 'UNARY'\n      else if tag in RELATION\n        if tag isnt 'INSTANCEOF' and @seenFor\n          tag = 'FOR' + tag\n          @seenFor = no\n        else\n          tag = 'RELATION'\n          if @value() is '!'\n            @tokens.pop()\n            id = '!' + id\n\n    if id in JS_FORBIDDEN\n      if forcedIdentifier\n        tag = 'IDENTIFIER'\n        id  = new String id\n        id.reserved = yes\n      else if id in RESERVED\n        @error \"reserved word \\\"#{id}\\\"\"\n\n    unless forcedIdentifier\n      id  = COFFEE_ALIAS_MAP[id] if id in COFFEE_ALIASES\n      tag = switch id\n        when '!'                 then 'UNARY'\n        when '==', '!='          then 'COMPARE'\n        when '&&', '||'          then 'LOGIC'\n        when 'true', 'false'     then 'BOOL'\n        when 'break', 'continue' then 'STATEMENT'\n        else  tag\n\n    @token tag, id\n    @token ':', ':' if colon\n    input.length\n\n  # Matches numbers, including decimals, hex, and exponential notation.\n  # Be careful not to interfere with ranges-in-progress.\n  numberToken: ->\n    return 0 unless match = NUMBER.exec @chunk\n    number = match[0]\n    if /^0[BOX]/.test number\n      @error \"radix prefix '#{number}' must be lowercase\"\n    else if /E/.test(number) and not /^0x/.test number\n      @error \"exponential notation '#{number}' must be indicated with a lowercase 'e'\"\n    else if /^0\\d*[89]/.test number\n      @error \"decimal literal '#{number}' must not be prefixed with '0'\"\n    else if /^0\\d+/.test number\n      @error \"octal literal '#{number}' must be prefixed with '0o'\"\n    lexedLength = number.length\n    if octalLiteral = /^0o([0-7]+)/.exec number\n      number = '0x' + (parseInt octalLiteral[1], 8).toString 16\n    if binaryLiteral = /^0b([01]+)/.exec number\n      number = '0x' + (parseInt binaryLiteral[1], 2).toString 16\n    @token 'NUMBER', number\n    lexedLength\n\n  # Matches strings, including multi-line strings. Ensures that quotation marks\n  # are balanced within the string's contents, and within nested interpolations.\n  stringToken: ->\n    switch @chunk.charAt 0\n      when \"'\"\n        return 0 unless match = SIMPLESTR.exec @chunk\n        @token 'STRING', (string = match[0]).replace MULTILINER, '\\\\\\n'\n      when '\"'\n        return 0 unless string = @balancedString @chunk, '\"'\n        if 0 < string.indexOf '#{', 1\n          @interpolateString string[1...-1]\n        else\n          @token 'STRING', @escapeLines string\n      else\n        return 0\n    if octalEsc = /^(?:\\\\.|[^\\\\])*\\\\(?:0[0-7]|[1-7])/.test string\n      @error \"octal escape sequences #{string} are not allowed\"\n    @line += count string, '\\n'\n    string.length\n\n  # Matches heredocs, adjusting indentation to the correct level, as heredocs\n  # preserve whitespace, but ignore indentation to the left.\n  heredocToken: ->\n    return 0 unless match = HEREDOC.exec @chunk\n    heredoc = match[0]\n    quote = heredoc.charAt 0\n    doc = @sanitizeHeredoc match[2], quote: quote, indent: null\n    if quote is '\"' and 0 <= doc.indexOf '#{'\n      @interpolateString doc, heredoc: yes\n    else\n      @token 'STRING', @makeString doc, quote, yes\n    @line += count heredoc, '\\n'\n    heredoc.length\n\n  # Matches and consumes comments.\n  commentToken: ->\n    return 0 unless match = @chunk.match COMMENT\n    [comment, here] = match\n    if here\n      @token 'HERECOMMENT', @sanitizeHeredoc here,\n        herecomment: true, indent: Array(@indent + 1).join(' ')\n    @line += count comment, '\\n'\n    comment.length\n\n  # Matches JavaScript interpolated directly into the source via backticks.\n  jsToken: ->\n    return 0 unless @chunk.charAt(0) is '`' and match = JSTOKEN.exec @chunk\n    @token 'JS', (script = match[0])[1...-1]\n    script.length\n\n  # Matches regular expression literals. Lexing regular expressions is difficult\n  # to distinguish from division, so we borrow some basic heuristics from\n  # JavaScript and Ruby.\n  regexToken: ->\n    return 0 if @chunk.charAt(0) isnt '/'\n    if match = HEREGEX.exec @chunk\n      length = @heregexToken match\n      @line += count match[0], '\\n'\n      return length\n\n    prev = last @tokens\n    return 0 if prev and (prev[0] in (if prev.spaced then NOT_REGEX else NOT_SPACED_REGEX))\n    return 0 unless match = REGEX.exec @chunk\n    [match, regex, flags] = match\n    if regex[..1] is '/*' then @error 'regular expressions cannot begin with `*`'\n    if regex is '//' then regex = '/(?:)/'\n    @token 'REGEX', \"#{regex}#{flags}\"\n    match.length\n\n  # Matches multiline extended regular expressions.\n  heregexToken: (match) ->\n    [heregex, body, flags] = match\n    if 0 > body.indexOf '#{'\n      re = body.replace(HEREGEX_OMIT, '').replace(/\\//g, '\\\\/')\n      if re.match /^\\*/ then @error 'regular expressions cannot begin with `*`'\n      @token 'REGEX', \"/#{ re or '(?:)' }/#{flags}\"\n      return heregex.length\n    @token 'IDENTIFIER', 'RegExp'\n    @tokens.push ['CALL_START', '(']\n    tokens = []\n    for [tag, value] in @interpolateString(body, regex: yes)\n      if tag is 'TOKENS'\n        tokens.push value...\n      else\n        continue unless value = value.replace HEREGEX_OMIT, ''\n        value = value.replace /\\\\/g, '\\\\\\\\'\n        tokens.push ['STRING', @makeString(value, '\"', yes)]\n      tokens.push ['+', '+']\n    tokens.pop()\n    @tokens.push ['STRING', '\"\"'], ['+', '+'] unless tokens[0]?[0] is 'STRING'\n    @tokens.push tokens...\n    @tokens.push [',', ','], ['STRING', '\"' + flags + '\"'] if flags\n    @token ')', ')'\n    heregex.length\n\n  # Matches newlines, indents, and outdents, and determines which is which.\n  # If we can detect that the current line is continued onto the the next line,\n  # then the newline is suppressed:\n  #\n  #     elements\n  #       .each( ... )\n  #       .map( ... )\n  #\n  # Keeps track of the level of indentation, because a single outdent token\n  # can close multiple indents, so we need to know how far in we happen to be.\n  lineToken: ->\n    return 0 unless match = MULTI_DENT.exec @chunk\n    indent = match[0]\n    @line += count indent, '\\n'\n    @seenFor = no\n    size = indent.length - 1 - indent.lastIndexOf '\\n'\n    noNewlines = @unfinished()\n    if size - @indebt is @indent\n      if noNewlines then @suppressNewlines() else @newlineToken()\n      return indent.length\n    if size > @indent\n      if noNewlines\n        @indebt = size - @indent\n        @suppressNewlines()\n        return indent.length\n      diff = size - @indent + @outdebt\n      @token 'INDENT', diff\n      @indents.push diff\n      @ends.push 'OUTDENT'\n      @outdebt = @indebt = 0\n    else\n      @indebt = 0\n      @outdentToken @indent - size, noNewlines\n    @indent = size\n    indent.length\n\n  # Record an outdent token or multiple tokens, if we happen to be moving back\n  # inwards past several recorded indents.\n  outdentToken: (moveOut, noNewlines) ->\n    while moveOut > 0\n      len = @indents.length - 1\n      if @indents[len] is undefined\n        moveOut = 0\n      else if @indents[len] is @outdebt\n        moveOut -= @outdebt\n        @outdebt = 0\n      else if @indents[len] < @outdebt\n        @outdebt -= @indents[len]\n        moveOut  -= @indents[len]\n      else\n        dent = @indents.pop() - @outdebt\n        moveOut -= dent\n        @outdebt = 0\n        @pair 'OUTDENT'\n        @token 'OUTDENT', dent\n    @outdebt -= moveOut if dent\n    @tokens.pop() while @value() is ';'\n    @token 'TERMINATOR', '\\n' unless @tag() is 'TERMINATOR' or noNewlines\n    this\n\n  # Matches and consumes non-meaningful whitespace. Tag the previous token\n  # as being \"spaced\", because there are some cases where it makes a difference.\n  whitespaceToken: ->\n    return 0 unless (match = WHITESPACE.exec @chunk) or\n                    (nline = @chunk.charAt(0) is '\\n')\n    prev = last @tokens\n    prev[if match then 'spaced' else 'newLine'] = true if prev\n    if match then match[0].length else 0\n\n  # Generate a newline token. Consecutive newlines get merged together.\n  newlineToken: ->\n    @tokens.pop() while @value() is ';'\n    @token 'TERMINATOR', '\\n' unless @tag() is 'TERMINATOR'\n    this\n\n  # Use a `\\` at a line-ending to suppress the newline.\n  # The slash is removed here once its job is done.\n  suppressNewlines: ->\n    @tokens.pop() if @value() is '\\\\'\n    this\n\n  # We treat all other single characters as a token. E.g.: `( ) , . !`\n  # Multi-character operators are also literal tokens, so that Jison can assign\n  # the proper order of operations. There are some symbols that we tag specially\n  # here. `;` and newlines are both treated as a `TERMINATOR`, we distinguish\n  # parentheses that indicate a method call from regular parentheses, and so on.\n  literalToken: ->\n    if match = OPERATOR.exec @chunk\n      [value] = match\n      @tagParameters() if CODE.test value\n    else\n      value = @chunk.charAt 0\n    tag  = value\n    prev = last @tokens\n    if value is '=' and prev\n      if not prev[1].reserved and prev[1] in JS_FORBIDDEN\n        @error \"reserved word \\\"#{@value()}\\\" can't be assigned\"\n      if prev[1] in ['||', '&&']\n        prev[0] = 'COMPOUND_ASSIGN'\n        prev[1] += '='\n        return value.length\n    if value is ';'\n      @seenFor = no\n      tag = 'TERMINATOR'\n    else if value in MATH            then tag = 'MATH'\n    else if value in COMPARE         then tag = 'COMPARE'\n    else if value in COMPOUND_ASSIGN then tag = 'COMPOUND_ASSIGN'\n    else if value in UNARY           then tag = 'UNARY'\n    else if value in SHIFT           then tag = 'SHIFT'\n    else if value in LOGIC or value is '?' and prev?.spaced then tag = 'LOGIC'\n    else if prev and not prev.spaced\n      if value is '(' and prev[0] in CALLABLE\n        prev[0] = 'FUNC_EXIST' if prev[0] is '?'\n        tag = 'CALL_START'\n      else if value is '[' and prev[0] in INDEXABLE\n        tag = 'INDEX_START'\n        switch prev[0]\n          when '?'  then prev[0] = 'INDEX_SOAK'\n    switch value\n      when '(', '{', '[' then @ends.push INVERSES[value]\n      when ')', '}', ']' then @pair value\n    @token tag, value\n    value.length\n\n  # Token Manipulators\n  # ------------------\n\n  # Sanitize a heredoc or herecomment by\n  # erasing all external indentation on the left-hand side.\n  sanitizeHeredoc: (doc, options) ->\n    {indent, herecomment} = options\n    if herecomment\n      if HEREDOC_ILLEGAL.test doc\n        @error \"block comment cannot contain \\\"*/\\\", starting\"\n      return doc if doc.indexOf('\\n') <= 0\n    else\n      while match = HEREDOC_INDENT.exec doc\n        attempt = match[1]\n        indent = attempt if indent is null or 0 < attempt.length < indent.length\n    doc = doc.replace /// \\n #{indent} ///g, '\\n' if indent\n    doc = doc.replace /^\\n/, '' unless herecomment\n    doc\n\n  # A source of ambiguity in our grammar used to be parameter lists in function\n  # definitions versus argument lists in function calls. Walk backwards, tagging\n  # parameters specially in order to make things easier for the parser.\n  tagParameters: ->\n    return this if @tag() isnt ')'\n    stack = []\n    {tokens} = this\n    i = tokens.length\n    tokens[--i][0] = 'PARAM_END'\n    while tok = tokens[--i]\n      switch tok[0]\n        when ')'\n          stack.push tok\n        when '(', 'CALL_START'\n          if stack.length then stack.pop()\n          else if tok[0] is '('\n            tok[0] = 'PARAM_START'\n            return this\n          else return this\n    this\n\n  # Close up all remaining open blocks at the end of the file.\n  closeIndentation: ->\n    @outdentToken @indent\n\n  # Matches a balanced group such as a single or double-quoted string. Pass in\n  # a series of delimiters, all of which must be nested correctly within the\n  # contents of the string. This method allows us to have strings within\n  # interpolations within strings, ad infinitum.\n  balancedString: (str, end) ->\n    continueCount = 0\n    stack = [end]\n    for i in [1...str.length]\n      if continueCount\n        --continueCount\n        continue\n      switch letter = str.charAt i\n        when '\\\\'\n          ++continueCount\n          continue\n        when end\n          stack.pop()\n          unless stack.length\n            return str[0..i]\n          end = stack[stack.length - 1]\n          continue\n      if end is '}' and letter in ['\"', \"'\"]\n        stack.push end = letter\n      else if end is '}' and letter is '/' and match = (HEREGEX.exec(str[i..]) or REGEX.exec(str[i..]))\n        continueCount += match[0].length - 1\n      else if end is '}' and letter is '{'\n        stack.push end = '}'\n      else if end is '\"' and prev is '#' and letter is '{'\n        stack.push end = '}'\n      prev = letter\n    @error \"missing #{ stack.pop() }, starting\"\n\n  # Expand variables and expressions inside double-quoted strings using\n  # Ruby-like notation for substitution of arbitrary expressions.\n  #\n  #     \"Hello #{name.capitalize()}.\"\n  #\n  # If it encounters an interpolation, this method will recursively create a\n  # new Lexer, tokenize the interpolated contents, and merge them into the\n  # token stream.\n  interpolateString: (str, options = {}) ->\n    {heredoc, regex} = options\n    tokens = []\n    pi = 0\n    i  = -1\n    while letter = str.charAt i += 1\n      if letter is '\\\\'\n        i += 1\n        continue\n      unless letter is '#' and str.charAt(i+1) is '{' and\n             (expr = @balancedString str[i + 1..], '}')\n        continue\n      tokens.push ['NEOSTRING', str[pi...i]] if pi < i\n      inner = expr[1...-1]\n      if inner.length\n        nested = new Lexer().tokenize inner, line: @line, rewrite: off\n        nested.pop()\n        nested.shift() if nested[0]?[0] is 'TERMINATOR'\n        if len = nested.length\n          if len > 1\n            nested.unshift ['(', '(', @line]\n            nested.push    [')', ')', @line]\n          tokens.push ['TOKENS', nested]\n      i += expr.length\n      pi = i + 1\n    tokens.push ['NEOSTRING', str[pi..]] if i > pi < str.length\n    return tokens if regex\n    return @token 'STRING', '\"\"' unless tokens.length\n    tokens.unshift ['', ''] unless tokens[0][0] is 'NEOSTRING'\n    @token '(', '(' if interpolated = tokens.length > 1\n    for [tag, value], i in tokens\n      @token '+', '+' if i\n      if tag is 'TOKENS'\n        @tokens.push value...\n      else\n        @token 'STRING', @makeString value, '\"', heredoc\n    @token ')', ')' if interpolated\n    tokens\n\n  # Pairs up a closing token, ensuring that all listed pairs of tokens are\n  # correctly balanced throughout the course of the token stream.\n  pair: (tag) ->\n    unless tag is wanted = last @ends\n      @error \"unmatched #{tag}\" unless 'OUTDENT' is wanted\n      # Auto-close INDENT to support syntax like this:\n      #\n      #     el.click((event) ->\n      #       el.hide())\n      #\n      @indent -= size = last @indents\n      @outdentToken size, true\n      return @pair tag\n    @ends.pop()\n\n  # Helpers\n  # -------\n\n  # Add a token to the results, taking note of the line number.\n  token: (tag, value) ->\n    @tokens.push [tag, value, @line]\n\n  # Peek at a tag in the current token stream.\n  tag: (index, tag) ->\n    (tok = last @tokens, index) and if tag then tok[0] = tag else tok[0]\n\n  # Peek at a value in the current token stream.\n  value: (index, val) ->\n    (tok = last @tokens, index) and if val then tok[1] = val else tok[1]\n\n  # Are we in the midst of an unfinished expression?\n  unfinished: ->\n    LINE_CONTINUER.test(@chunk) or\n    @tag() in ['\\\\', '.', '?.', 'UNARY', 'MATH', '+', '-', 'SHIFT', 'RELATION'\n               'COMPARE', 'LOGIC', 'THROW', 'EXTENDS']\n\n  # Converts newlines for string literals.\n  escapeLines: (str, heredoc) ->\n    str.replace MULTILINER, if heredoc then '\\\\n' else ''\n\n  # Constructs a string token by escaping quotes and newlines.\n  makeString: (body, quote, heredoc) ->\n    return quote + quote unless body\n    body = body.replace /\\\\([\\s\\S])/g, (match, contents) ->\n      if contents in ['\\n', quote] then contents else match\n    body = body.replace /// #{quote} ///g, '\\\\$&'\n    quote + @escapeLines(body, heredoc) + quote\n\n  # Throws a syntax error on the current `@line`.\n  error: (message) ->\n    throw SyntaxError \"#{message} on line #{ @line + 1}\"\n\n# Constants\n# ---------\n\n# Keywords that CoffeeScript shares in common with JavaScript.\nJS_KEYWORDS = [\n  'true', 'false', 'null', 'this'\n  'new', 'delete', 'typeof', 'in', 'instanceof'\n  'return', 'throw', 'break', 'continue', 'debugger'\n  'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally'\n  'class', 'extends', 'super'\n]\n\n# CoffeeScript-only keywords.\nCOFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when']\n\nCOFFEE_ALIAS_MAP =\n  and  : '&&'\n  or   : '||'\n  is   : '=='\n  isnt : '!='\n  not  : '!'\n  yes  : 'true'\n  no   : 'false'\n  on   : 'true'\n  off  : 'false'\n\nCOFFEE_ALIASES  = (key for key of COFFEE_ALIAS_MAP)\nCOFFEE_KEYWORDS = COFFEE_KEYWORDS.concat COFFEE_ALIASES\n\n# The list of keywords that are reserved by JavaScript, but not used, or are\n# used by CoffeeScript internally. We throw an error when these are encountered,\n# to avoid having a JavaScript error at runtime.\nRESERVED = [\n  'case', 'default', 'function', 'var', 'void', 'with'\n  'const', 'let', 'enum', 'export', 'import', 'native'\n  '__hasProp', '__extends', '__slice', '__bind', '__indexOf'\n  'implements', 'interface', 'let', 'package',\n  'private', 'protected', 'public', 'static', 'yield'\n]\n\nSTRICT_PROSCRIBED = ['arguments', 'eval']\n\n# The superset of both JavaScript keywords and reserved words, none of which may\n# be used as identifiers or properties.\nJS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED)\n\nexports.RESERVED = RESERVED.concat(JS_KEYWORDS).concat(COFFEE_KEYWORDS).concat(STRICT_PROSCRIBED)\nexports.STRICT_PROSCRIBED = STRICT_PROSCRIBED\n\n# Token matching regexes.\nIDENTIFIER = /// ^\n  ( [$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]* )\n  ( [^\\n\\S]* : (?!:) )?  # Is this a property name?\n///\n\nNUMBER     = ///\n  ^ 0b[01]+    |              # binary\n  ^ 0o[0-7]+   |              # octal\n  ^ 0x[\\da-f]+ |              # hex\n  ^ \\d*\\.?\\d+ (?:e[+-]?\\d+)?  # decimal\n///i\n\nHEREDOC    = /// ^ (\"\"\"|''') ([\\s\\S]*?) (?:\\n[^\\n\\S]*)? \\1 ///\n\nOPERATOR   = /// ^ (\n  ?: [-=]>             # function\n   | [-+*/%<>&|^!?=]=  # compound assign / compare\n   | >>>=?             # zero-fill right shift\n   | ([-+:])\\1         # doubles\n   | ([&|<>])\\2=?      # logic / shift\n   | \\?\\.              # soak access\n   | \\.{2,3}           # range or splat\n) ///\n\nWHITESPACE = /^[^\\n\\S]+/\n\nCOMMENT    = /^###([^#][\\s\\S]*?)(?:###[^\\n\\S]*|(?:###)?$)|^(?:\\s*#(?!##[^#]).*)+/\n\nCODE       = /^[-=]>/\n\nMULTI_DENT = /^(?:\\n[^\\n\\S]*)+/\n\nSIMPLESTR  = /^'[^\\\\']*(?:\\\\.[^\\\\']*)*'/\n\nJSTOKEN    = /^`[^\\\\`]*(?:\\\\.[^\\\\`]*)*`/\n\n# Regex-matching-regexes.\nREGEX = /// ^\n  (/ (?! [\\s=] )   # disallow leading whitespace or equals signs\n  [^ [ / \\n \\\\ ]*  # every other thing\n  (?:\n    (?: \\\\[\\s\\S]   # anything escaped\n      | \\[         # character class\n           [^ \\] \\n \\\\ ]*\n           (?: \\\\[\\s\\S] [^ \\] \\n \\\\ ]* )*\n         ]\n    ) [^ [ / \\n \\\\ ]*\n  )*\n  /) ([imgy]{0,4}) (?!\\w)\n///\n\nHEREGEX      = /// ^ /{3} ([\\s\\S]+?) /{3} ([imgy]{0,4}) (?!\\w) ///\n\nHEREGEX_OMIT = /\\s+(?:#.*)?/g\n\n# Token cleaning regexes.\nMULTILINER      = /\\n/g\n\nHEREDOC_INDENT  = /\\n+([^\\n\\S]*)/g\n\nHEREDOC_ILLEGAL = /\\*\\//\n\nLINE_CONTINUER  = /// ^ \\s* (?: , | \\??\\.(?![.\\d]) | :: ) ///\n\nTRAILING_SPACES = /\\s+$/\n\n# Compound assignment tokens.\nCOMPOUND_ASSIGN = [\n  '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|='\n]\n\n# Unary tokens.\nUNARY   = ['!', '~', 'NEW', 'TYPEOF', 'DELETE', 'DO']\n\n# Logical tokens.\nLOGIC   = ['&&', '||', '&', '|', '^']\n\n# Bit-shifting tokens.\nSHIFT   = ['<<', '>>', '>>>']\n\n# Comparison tokens.\nCOMPARE = ['==', '!=', '<', '>', '<=', '>=']\n\n# Mathematical tokens.\nMATH    = ['*', '/', '%']\n\n# Relational tokens that are negatable with `not` prefix.\nRELATION = ['IN', 'OF', 'INSTANCEOF']\n\n# Boolean tokens.\nBOOL = ['TRUE', 'FALSE']\n\n# Tokens which a regular expression will never immediately follow, but which\n# a division operator might.\n#\n# See: http://www.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions\n#\n# Our list is shorter, due to sans-parentheses method calls.\nNOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', 'NULL', 'UNDEFINED', '++', '--', ']']\n\n# If the previous token is not spaced, there are more preceding tokens that\n# force a division parse:\nNOT_SPACED_REGEX = NOT_REGEX.concat ')', '}', 'THIS', 'IDENTIFIER', 'STRING'\n\n# Tokens which could legitimately be invoked or indexed. An opening\n# parentheses or bracket following these tokens will be recorded as the start\n# of a function invocation or indexing operation.\nCALLABLE  = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER']\nINDEXABLE = CALLABLE.concat 'NUMBER', 'BOOL', 'NULL', 'UNDEFINED'\n\n# Tokens that, when immediately preceding a `WHEN`, indicate that the `WHEN`\n# occurs at the start of a line. We disambiguate these from trailing whens to\n# avoid an ambiguity in the grammar.\nLINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoffeeScript/rack_application.coffee",
    "content": "# The `RackApplication` class is responsible for managing a\n# [Nack](http://josh.github.com/nack/) pool for a given Rack\n# application. Incoming HTTP requests are dispatched to\n# `RackApplication` instances by an `HttpServer`, where they are\n# subsequently handled by a pool of Nack worker processes. By default,\n# Pow tells Nack to use a maximum of two worker processes per\n# application, but this can be overridden with the configuration's\n# `workers` option.\n#\n# Before creating the Nack pool, Pow executes the `.powrc` and\n# `.powenv` scripts if they're present in the application root,\n# captures their environment variables, and passes them along to the\n# Nack worker processes. This lets you modify your `RUBYOPT` to use\n# different Ruby options, for example.\n#\n# If [rvm](http://rvm.beginrescueend.com/) is installed and an\n# `.rvmrc` file is present in the application's root, Pow will load\n# both before creating the Nack pool. This makes it easy to run an\n# app with a specific version of Ruby.\n#\n# Nack workers remain running until they're killed, restarted (by\n# touching the `tmp/restart.txt` file in the application root), or\n# until the application has not served requests for the length of time\n# specified in the configuration's `timeout` option (15 minutes by\n# default).\n\nasync = require \"async\"\nfs    = require \"fs\"\nnack  = require \"nack\"\n\n{bufferLines, pause, sourceScriptEnv} = require \"./util\"\n{join, exists, basename, resolve} = require \"path\"\n\nmodule.exports = class RackApplication\n  # Create a `RackApplication` for the given configuration and\n  # root path. The application begins life in the uninitialized\n  # state.\n  constructor: (@configuration, @root, @firstHost) ->\n    @logger = @configuration.getLogger join \"apps\", basename @root\n    @readyCallbacks = []\n    @quitCallbacks  = []\n    @statCallbacks  = []\n\n  # Queue `callback` to be invoked when the application becomes ready,\n  # then start the initialization process. If the application's state\n  # is ready, the callback is invoked immediately.\n  ready: (callback) ->\n    if @state is \"ready\"\n      callback()\n    else\n      @readyCallbacks.push callback\n      @initialize()\n\n  # Tell the application to quit and queue `callback` to be invoked\n  # when all workers have exited. If the application has already quit,\n  # the callback is invoked immediately.\n  quit: (callback) ->\n    if @state\n      @quitCallbacks.push callback if callback\n      @terminate()\n    else\n      callback?()\n\n  # Stat `tmp/restart.txt` in the application root and invoke the\n  # given callback with a single argument indicating whether or not\n  # the file has been touched since the last call to\n  # `queryRestartFile`.\n  queryRestartFile: (callback) ->\n    fs.stat join(@root, \"tmp/restart.txt\"), (err, stats) =>\n      if err\n        @mtime = null\n        callback false\n      else\n        lastMtime = @mtime\n        @mtime = stats.mtime.getTime()\n        callback lastMtime isnt @mtime\n\n  # Check to see if `tmp/always_restart.txt` is present in the\n  # application root, and set the pool's `runOnce` option\n  # accordingly. Invoke `callback` when the existence check has\n  # finished. (Multiple calls to this method are aggregated.)\n  setPoolRunOnceFlag: (callback) ->\n    unless @statCallbacks.length\n      exists join(@root, \"tmp/always_restart.txt\"), (alwaysRestart) =>\n        @pool.runOnce = alwaysRestart\n        statCallback() for statCallback in @statCallbacks\n        @statCallbacks = []\n\n    @statCallbacks.push callback\n\n  # Collect environment variables from `.powrc` and `.powenv`, in that\n  # order, if present. The idea is that `.powrc` files can be checked\n  # into a source code repository for global configuration, leaving\n  # `.powenv` free for any necessary local overrides.\n  loadScriptEnvironment: (env, callback) ->\n    async.reduce [\".powrc\", \".envrc\", \".powenv\"], env, (env, filename, callback) =>\n      exists script = join(@root, filename), (scriptExists) ->\n        if scriptExists\n          sourceScriptEnv script, env, callback\n        else\n          callback null, env\n    , callback\n\n  # If `.rvmrc` and `$HOME/.rvm/scripts/rvm` are present, load rvm,\n  # source `.rvmrc`, and invoke `callback` with the resulting\n  # environment variables. If `.rvmrc` is present but rvm is not\n  # installed, invoke `callback` without sourcing `.rvmrc`.\n  # Before loading rvm, Pow invokes a helper script that shows a\n  # deprecation notice if it has not yet been displayed.\n  loadRvmEnvironment: (env, callback) ->\n    exists script = join(@root, \".rvmrc\"), (rvmrcExists) =>\n      if rvmrcExists\n        exists rvm = @configuration.rvmPath, (rvmExists) =>\n          if rvmExists\n            libexecPath = resolve \"#{__dirname}/../libexec\"\n            before = \"\"\"\n              '#{libexecPath}/pow_rvm_deprecation_notice' '#{[@firstHost]}'\n              source '#{rvm}' > /dev/null\n            \"\"\".trim()\n            sourceScriptEnv script, env, {before}, callback\n          else\n            callback null, env\n      else\n        callback null, env\n\n  # Stat `tmp/restart.txt` to cache its mtime, then load the\n  # application's full environment from `.powrc`, `.powenv`, and\n  # `.rvmrc`.\n  loadEnvironment: (callback) ->\n    @queryRestartFile =>\n      @loadScriptEnvironment @configuration.env, (err, env) =>\n        if err then callback err\n        else @loadRvmEnvironment env, (err, env) =>\n          if err then callback err\n          else callback null, env\n\n  # Begin the initialization process if the application is in the\n  # uninitialized state. (If the application is terminating, queue a\n  # call to `initialize` after all workers have exited.)\n  initialize: ->\n    if @state\n      if @state is \"terminating\"\n        @quit => @initialize()\n      return\n\n    @state = \"initializing\"\n\n    # Load the application's environment. If an error is raised or\n    # either of the environment scripts exits with a non-zero status,\n    # reset the application's state and log the error.\n    @loadEnvironment (err, env) =>\n      if err\n        @state = null\n        @logger.error err.message\n        @logger.error \"stdout: #{err.stdout}\"\n        @logger.error \"stderr: #{err.stderr}\"\n\n      # Set the application's state to ready. Then create the Nack\n      # pool instance using the `workers` and `timeout` options from\n      # the application's environment or the global configuration.\n      else\n        @state = \"ready\"\n\n        @pool = nack.createPool join(@root, \"config.ru\"),\n          env:  env\n          size: env?.POW_WORKERS ? @configuration.workers\n          idle: (env?.POW_TIMEOUT ? @configuration.timeout) * 1000\n\n        # Log the workers' stderr and stdout, and log each worker's\n        # PID as it spawns and exits.\n        bufferLines @pool.stdout, (line) => @logger.info line\n        bufferLines @pool.stderr, (line) => @logger.warning line\n\n        @pool.on \"worker:spawn\", (process) =>\n          @logger.debug \"nack worker #{process.child.pid} spawned\"\n\n        @pool.on \"worker:exit\", (process) =>\n          @logger.debug \"nack worker exited\"\n\n      # Invoke and remove all queued callbacks, passing along the\n      # error, if any.\n      readyCallback err for readyCallback in @readyCallbacks\n      @readyCallbacks = []\n\n  # Begin the termination process. (If the application is initializing,\n  # wait until it is ready before shutting down.)\n  terminate: ->\n    if @state is \"initializing\"\n      @ready => @terminate()\n\n    else if @state is \"ready\"\n      @state = \"terminating\"\n\n      # Instruct all workers to exit. After the processes have\n      # terminated, reset the application's state, then invoke and\n      # remove all queued callbacks.\n      @pool.quit =>\n        @state = null\n        @mtime = null\n        @pool = null\n\n        quitCallback() for quitCallback in @quitCallbacks\n        @quitCallbacks = []\n\n  # Handle an incoming HTTP request. Wait until the application is in\n  # the ready state, restart the workers if necessary, then pass the\n  # request along to the Nack pool. If the Nack worker raises an\n  # exception handling the request, reset the application.\n  handle: (req, res, next, callback) ->\n    resume = pause req\n    @ready (err) =>\n      return next err if err\n      @setPoolRunOnceFlag =>\n        @restartIfNecessary =>\n          req.proxyMetaVariables =\n            SERVER_PORT: @configuration.dstPort.toString()\n          try\n            @pool.proxy req, res, (err) =>\n              @quit() if err\n              next err\n          finally\n            resume()\n            callback?()\n\n  # Terminate the application, re-initialize it, and invoke the given\n  # callback when the application's state becomes ready.\n  restart: (callback) ->\n    @quit =>\n      @ready callback\n\n  # Restart the application if `tmp/restart.txt` has been touched\n  # since the last call to this function.\n  restartIfNecessary: (callback) ->\n    @queryRestartFile (mtimeChanged) =>\n      if mtimeChanged\n        @restart callback\n      else\n        callback()\n\n  # Append RVM autoload boilerplate to the application's `.powrc`\n  # file. This is called by the RVM deprecation notice mini-app.\n  writeRvmBoilerplate: ->\n    powrc = join @root, \".powrc\"\n    boilerplate = @constructor.rvmBoilerplate\n\n    fs.readFile powrc, \"utf8\", (err, contents) ->\n      contents ?= \"\"\n      if contents.indexOf(boilerplate) is -1\n        fs.writeFile powrc, \"#{boilerplate}\\n#{contents}\"\n\n  @rvmBoilerplate: \"\"\"\n    if [ -f \"$rvm_path/scripts/rvm\" ] && [ -f \".rvmrc\" ]; then\n      source \"$rvm_path/scripts/rvm\"\n      source \".rvmrc\"\n    fi\n  \"\"\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/CoffeeScript/xipd.coffee",
    "content": "dnsserver = require \"dnsserver\"\n\nexports.Server = class Server extends dnsserver.Server\n  NS_T_A            = 1\n  NS_T_NS           = 2\n  NS_T_CNAME        = 5\n  NS_T_SOA          = 6\n  NS_C_IN           = 1\n  NS_RCODE_NXDOMAIN = 3\n\n  constructor: (domain, @rootAddress) ->\n    super\n    @domain = domain.toLowerCase()\n    @soa = createSOA @domain\n    @on \"request\", @handleRequest\n\n  handleRequest: (req, res) =>\n    question  = req.question\n    subdomain = @extractSubdomain question.name\n\n    if subdomain? and isARequest question\n      res.addRR question.name, NS_T_A, NS_C_IN, 600, subdomain.getAddress()\n    else if subdomain?.isEmpty() and isNSRequest question\n      res.addRR question.name, NS_T_SOA, NS_C_IN, 600, @soa, true\n    else\n      res.header.rcode = NS_RCODE_NXDOMAIN\n\n    res.send()\n\n  extractSubdomain: (name) ->\n    Subdomain.extract name, @domain, @rootAddress\n\n  isARequest = (question) ->\n    question.type is NS_T_A and question.class is NS_C_IN\n\n  isNSRequest = (question) ->\n    question.type is NS_T_NS and question.class is NS_C_IN\n\n  createSOA = (domain) ->\n    mname   = \"ns-1.#{domain}\"\n    rname   = \"hostmaster.#{domain}\"\n    serial  = parseInt new Date().getTime() / 1000\n    refresh = 28800\n    retry   = 7200\n    expire  = 604800\n    minimum = 3600\n    dnsserver.createSOA mname, rname, serial, refresh, retry, expire, minimum\n\nexports.createServer = (domain, address = \"127.0.0.1\") ->\n  new Server domain, address\n\nexports.Subdomain = class Subdomain\n  @extract: (name, domain, address) ->\n    return unless name\n    name = name.toLowerCase()\n    offset = name.length - domain.length\n\n    if domain is name.slice offset\n      subdomain = if 0 >= offset then null else name.slice 0, offset - 1\n      new constructor subdomain, address if constructor = @for subdomain\n\n  @for: (subdomain = \"\") ->\n    if IPAddressSubdomain.pattern.test subdomain\n      IPAddressSubdomain\n    else if EncodedSubdomain.pattern.test subdomain\n      EncodedSubdomain\n    else\n      Subdomain\n\n  constructor: (@subdomain, @address) ->\n    @labels = subdomain?.split(\".\") ? []\n    @length = @labels.length\n\n  isEmpty: ->\n    @length is 0\n\n  getAddress: ->\n    @address\n\nclass IPAddressSubdomain extends Subdomain\n  @pattern = /// (^|\\.)\n    ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}\n    (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\n  $ ///\n\n  getAddress: ->\n    @labels.slice(-4).join \".\"\n\nclass EncodedSubdomain extends Subdomain\n  @pattern = /(^|\\.)[a-z0-9]{1,7}$/\n\n  getAddress: ->\n    decode @labels[@length - 1]\n\nexports.encode = encode = (ip) ->\n  value = 0\n  for byte, index in ip.split \".\"\n    value += parseInt(byte, 10) << (index * 8)\n  (value >>> 0).toString 36\n\nPATTERN = /^[a-z0-9]{1,7}$/\n\nexports.decode = decode = (string) ->\n  return unless PATTERN.test string\n  value = parseInt string, 36\n  ip = []\n  for i in [1..4]\n    ip.push value & 0xFF\n    value >>= 8\n  ip.join \".\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/ColdFusion/example.cfm",
    "content": "<!--- cfcomment --->\n<!--- nested <!--- cfcomment ---> --->\n<!--- multi-line\nnested\n<!---\ncfcomment\n--->\n--->\n<!-- html comment -->\n<html>\n<head>\n<title>Date Functions</title>\n</head>\n<body>\n<cfset RightNow = Now()>\n<cfoutput>\n #RightNow#<br />\n #DateFormat(RightNow)#<br />\n #DateFormat(RightNow,\"mm/dd/yy\")#<br />\n #TimeFormat(RightNow)#<br />\n #TimeFormat(RightNow,\"hh:mm tt\")#<br />\n #IsDate(RightNow)#<br />\n #IsDate(\"January 31, 2007\")#<br />\n #IsDate(\"foo\")#<br />\n #DaysInMonth(RightNow)#\n</cfoutput>\n<cfset x=\"x\">\n<cfset y=\"y\">\n<cfset z=\"z\">\n<cfoutput group=\"x\">\n    #x#\n    <cfoutput>#y#</cfoutput>\n    #z#\n</cfoutput>\n</body>\n</html>\n\n<cfset person = \"Paul\">\n<cfset greeting = \"Hello #person#\">\n\n<cfset greeting = \"Hello\" & \" world!\">\n<cfset a = 5>\n<cfset b = 10>\n<cfset c = a^b>\n<cfset c = a MOD b>\n<cfset c = a / b>\n<cfset c = a * b>\n<cfset c = a + b>\n<cfset c = a - b>\n<!--- <!-- another <!--- nested --> ---> comment --->"
  },
  {
    "path": "src/test/resources/samples/langs/ColdFusion CFC/exampleScript.cfc",
    "content": "/**\n********************************************************************************\nContentBox - A Modular Content Platform\nCopyright 2012 by Luis Majano and Ortus Solutions, Corp\nwww.gocontentbox.org | www.luismajano.com | www.ortussolutions.com\n********************************************************************************\nApache License, Version 2.0\n\nCopyright Since [2012] [Luis Majano and Ortus Solutions,Corp]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n********************************************************************************\n* A generic content service for content objects\n*/\ncomponent extends=\"coldbox.system.orm.hibernate.VirtualEntityService\" singleton{\n\n\t// DI\n\tproperty name=\"settingService\"\t\t\tinject=\"id:settingService@cb\";\n\tproperty name=\"cacheBox\"\t\t\t\tinject=\"cachebox\";\n\tproperty name=\"log\"\t\t\t\t\t\tinject=\"logbox:logger:{this}\";\n\tproperty name=\"customFieldService\" \t \tinject=\"customFieldService@cb\";\n\tproperty name=\"categoryService\" \t \tinject=\"categoryService@cb\";\n\tproperty name=\"commentService\" \t \t\tinject=\"commentService@cb\";\n\tproperty name=\"contentVersionService\"\tinject=\"contentVersionService@cb\";\n\tproperty name=\"authorService\"\t\t\tinject=\"authorService@cb\";\n\tproperty name=\"populator\"\t\t\t\tinject=\"wirebox:populator\";\n\tproperty name=\"systemUtil\"\t\t\t\tinject=\"SystemUtil@cb\";\n\t\n\t/*\n\t* Constructor\n\t* @entityName.hint The content entity name to bind this service to.\n\t*/\n\tContentService function init(entityName=\"cbContent\"){\n\t\t// init it\n\t\tsuper.init(entityName=arguments.entityName, useQueryCaching=true);\n\n\t\t// Test scope coloring in pygments\n\t\tthis.colorTestVar = \"Just for testing pygments!\";\n\t\tcookie.colorTestVar = \"\";\n\t\tclient.colorTestVar = \"\"\n\t\tsession.colorTestVar = \"\";\n\t\tapplication.colorTestVar = \"\";\n\n\t\treturn this;\n\t}\n\n\t/**\n\t* Clear all content caches\n\t* @async.hint Run it asynchronously or not, defaults to false\n\t*/\n\tfunction clearAllCaches(boolean async=false){\n\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t// Get appropriate cache provider\n\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\tcache.clearByKeySnippet(keySnippet=\"cb-content\",async=arguments.async);\n\t\treturn this;\n\t}\n\n\t/**\n\t* Clear all page wrapper caches\n\t* @async.hint Run it asynchronously or not, defaults to false\n\t*/\n\tfunction clearAllPageWrapperCaches(boolean async=false){\n\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t// Get appropriate cache provider\n\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\tcache.clearByKeySnippet(keySnippet=\"cb-content-pagewrapper\",async=arguments.async);\n\t\treturn this;\n\t}\n\n\t/**\n\t* Clear all page wrapper caches\n\t* @slug.hint The slug partial to clean on\n\t* @async.hint Run it asynchronously or not, defaults to false\n\t*/\n\tfunction clearPageWrapperCaches(required any slug, boolean async=false){\n\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t// Get appropriate cache provider\n\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\tcache.clearByKeySnippet(keySnippet=\"cb-content-pagewrapper-#arguments.slug#\",async=arguments.async);\n\t\treturn this;\n\t}\n\n\t/**\n\t* Clear a page wrapper cache\n\t* @slug.hint The slug to clean\n\t* @async.hint Run it asynchronously or not, defaults to false\n\t*/\n\tfunction clearPageWrapper(required any slug, boolean async=false){\n\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t// Get appropriate cache provider\n\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\tcache.clear(\"cb-content-pagewrapper-#arguments.slug#/\");\n\t\treturn this;\n\t}\n\n\t/**\n\t* Searches published content with cool paramters, remember published content only\n\t* @searchTerm.hint The search term to search\n\t* @max.hint The maximum number of records to paginate\n\t* @offset.hint The offset in the pagination\n\t* @asQuery.hint Return as query or array of objects, defaults to array of objects\n\t* @sortOrder.hint The sorting of the search results, defaults to publishedDate DESC\n\t* @isPublished.hint Search for published, non-published or both content objects [true, false, 'all']\n\t* @searchActiveContent.hint Search only content titles or both title and active content. Defaults to both.\n\t*/\n\tfunction searchContent(\n\t\tany searchTerm=\"\", \n\t\tnumeric max=0, \n\t\tnumeric offset=0, \n\t\tboolean asQuery=false, \n\t\tany sortOrder=\"publishedDate DESC\", \n\t\tany isPublished=true, \n\t\tboolean searchActiveContent=true){\n\n\t\tvar results = {};\n\t\tvar c = newCriteria();\n\n\t\t// only published content\n\t\tif( isBoolean( arguments.isPublished ) ){\n\t\t\t// Published bit\n\t\t\tc.isEq( \"isPublished\", javaCast( \"Boolean\", arguments.isPublished ) );\n\t\t\t// Published eq true evaluate other params\n\t\t\tif( arguments.isPublished ){\n\t\t\t\tc.isLt(\"publishedDate\", now() )\n\t\t\t\t.$or( c.restrictions.isNull(\"expireDate\"), c.restrictions.isGT(\"expireDate\", now() ) )\n\t\t\t\t.isEq(\"passwordProtection\",\"\");\n\t\t\t}\n\t\t}\n\n\t\t// Search Criteria\n\t\tif( len( arguments.searchTerm ) ){\n\t\t\t// like disjunctions\n\t\t\tc.createAlias(\"activeContent\",\"ac\");\n\t\t\t// Do we search title and active content or just title?\n\t\t\tif( arguments.searchActiveContent ){\n\t\t\t\tc.$or( c.restrictions.like(\"title\",\"%#arguments.searchTerm#%\"),\n\t\t\t\t  \t  c.restrictions.like(\"ac.content\", \"%#arguments.searchTerm#%\") );\n\t\t\t}\n\t\t\telse{\n\t\t\t\tc.like( \"title\", \"%#arguments.searchTerm#%\" ); \n\t\t\t}\n\t\t}\n\n\t\t// run criteria query and projections count\n\t\tresults.count = c.count( \"contentID\" );\n\t\tresults.content = c.resultTransformer( c.DISTINCT_ROOT_ENTITY )\n\t\t\t\t\t\t\t.list(offset=arguments.offset, max=arguments.max, sortOrder=arguments.sortOrder, asQuery=arguments.asQuery);\n\t\n\t\treturn results;\n\t}\n\n/********************************************* PRIVATE *********************************************/\n\t\n\n\t/**\n\t* Update the content hits\n\t* @contentID.hint The content id to update\n\t*/\n\tprivate function syncUpdateHits(required contentID){\n\t\tvar q = new Query(sql=\"UPDATE cb_content SET hits = hits + 1 WHERE contentID = #arguments.contentID#\").execute();\n\t\treturn this;\n\t}\n\t\n\t\n\tprivate function closureTest(){\n\t\tmethodCall(\n\t\t\tparam1,\n\t\t\tfunction( arg1, required arg2 ){\n\t\t\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t\t\t// Get appropriate cache provider\n\t\t\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\t\t\tcache.clear(\"cb-content-pagewrapper-#arguments.slug#/\");\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tparam1\n\t\t);\n\t}\n\t\n\tprivate function StructliteralTest(){\n\t\treturn {\n\t\t\tfoo = bar,\n\t\t\tbrad = 'Wood',\n\t\t\tfunc = function( arg1, required arg2 ){\n\t\t\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t\t\t// Get appropriate cache provider\n\t\t\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\t\t\tcache.clear(\"cb-content-pagewrapper-#arguments.slug#/\");\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tarray = [\n\t\t\t\t1,\n\t\t\t\t2,\n\t\t\t\t3,\n\t\t\t\t4,\n\t\t\t\t5,\n\t\t\t\t'test',\n\t\t\t\t'testing',\n\t\t\t\t'testerton',\n\t\t\t\t{\n\t\t\t\t\tfoo = true,\n\t\t\t\t\tbrad = false,\n\t\t\t\t\twood = null\n\t\t\t\t}\n\t\t\t],\n\t\t\tlast = \"final\"\n\t\t};\n\t}\n\t\n\tprivate function arrayliteralTest(){\n\t\treturn [\n\t\t\t1,\n\t\t\t2,\n\t\t\t3,\n\t\t\t4,\n\t\t\t5,\n\t\t\t'test',\n\t\t\t'testing',\n\t\t\t'testerton',\n\t\t\t{\n\t\t\t\tfoo = true,\n\t\t\t\tbrad = false,\n\t\t\t\twood = null\n\t\t\t},\n\t\t\t'testy-von-testavich'\n\t\t];\n\t}\n\t\n}"
  },
  {
    "path": "src/test/resources/samples/langs/ColdFusion CFC/exampleTag.cfc",
    "content": "<cfcomponent>\n\t\n\t<cffunction name=\"init\" access=\"public\" returntype=\"any\">\n\t\t<cfargument name=\"arg1\" type=\"any\" required=\"true\">\n\t\t<cfset this.myVariable = arguments.arg1>\n\n\t\t<cfreturn this>\n\t</cffunction>\n\n\t<cffunction name=\"testFunc\" access=\"private\" returntype=\"void\">\n\t\t<cfargument name=\"arg1\" type=\"any\" required=\"false\">\n\t\t\n\t\t<cfif structKeyExists(arguments, \"arg1\")>\n\t\t\t<cfset writeoutput(\"Argument exists\")>\n\t\t</cfif>\n\t</cffunction>\n\t\n</cfcomponent>"
  },
  {
    "path": "src/test/resources/samples/langs/Common Lisp/array.l",
    "content": ";;; -*- Mode: Lisp; Package: LISP -*-\n;;;\n;;; This file is part of xyzzy.\n;;;\n\n(provide \"array\")\n\n(in-package \"lisp\")\n\n(export '(make-vector make-array vector array-dimensions array-in-bounds-p\n\t  upgraded-array-element-type adjust-array))\n\n(defun upgraded-array-element-type (type)\n  (cond ((or (eq type 't)\n\t     (null type))\n\t 't)\n\t((member type '(character base-character standard-char\n\t\t\textended-character) :test #'eq)\n\t 'character)\n\t(t\n\t (setq type (car (si:canonicalize-type type)))\n\t (cond ((or (eq type 't)\n\t\t    (null type))\n\t\t't)\n\t       ((member type '(character base-character standard-char\n\t\t\t       extended-character) :test #'eq)\n\t\t'character)\n\t       (t 't)))))\n\n(defun check-array-initialize-option (ies-p ics-p displaced-to)\n  (let ((x 0))\n    (and ies-p (incf x))\n    (and ics-p (incf x))\n    (and displaced-to (incf x))\n    (when (> x 1)\n      (error \":initial-element, :initial-contents, :displaced-to\"))))\n\n(defun make-vector (length &key\n\t\t\t   (element-type t)\n\t\t\t   (initial-element nil ies-p)\n\t\t\t   (initial-contents nil ics-p)\n\t\t\t   fill-pointer\n\t\t\t   adjustable\n\t\t\t   displaced-to\n\t\t\t   (displaced-index-offset 0))\n  (setq element-type (upgraded-array-element-type element-type))\n  (check-array-initialize-option ies-p ics-p displaced-to)\n  (let ((vector (si:*make-vector length element-type initial-element adjustable\n\t\t\t\t fill-pointer displaced-to displaced-index-offset)))\n    (when ics-p\n      (si:*copy-into-seq vector initial-contents))\n    vector))\n\n(defun make-array (dimensions &rest rest\n\t\t\t      &key\n\t\t\t      (element-type t)\n\t\t\t      (initial-element nil ies-p)\n\t\t\t      (initial-contents nil ics-p)\n\t\t\t      fill-pointer\n\t\t\t      adjustable\n\t\t\t      displaced-to\n\t\t\t      (displaced-index-offset 0))\n  (cond ((integerp dimensions)\n\t (apply #'make-vector dimensions rest))\n\t((= (length dimensions) 1)\n\t (apply #'make-vector (car dimensions) rest))\n\t(t\n\t (setq element-type (upgraded-array-element-type element-type))\n\t (check-array-initialize-option ies-p ics-p displaced-to)\n\t (when fill-pointer\n\t   (error \":fill-pointer\"))\n\t (let ((array (si:*make-array dimensions element-type\n\t\t\t\t      initial-element adjustable\n\t\t\t\t      displaced-to displaced-index-offset)))\n\t   (when ics-p\n\t     (let ((dims (make-list (array-rank array)\n\t\t\t\t    :initial-element 0))\n\t\t   (stack (list initial-contents))\n\t\t   (rank (1- (array-rank array))))\n\t       (dolist (x dims)\n\t\t (push (elt (car stack) 0) stack))\n\t       (dotimes (i (array-total-size array))\n\t\t (setf (row-major-aref array i) (car stack))\n\t\t (do ((x dims (cdr x))\n\t\t      (j rank (1- j)))\n\t\t     ((null x))\n\t\t   (pop stack)\n\t\t   (incf (car x))\n\t\t   (when (< (car x) (array-dimension array j))\n\t\t     (do ((r (- rank j) (1- r)))\n\t\t\t ((< r 0))\n\t\t       (push (elt (car stack) (nth r dims)) stack))\n\t\t     (return))\n\t\t   (setf (car x) 0)))))\n\t   array))))\n\n(defun vector (&rest list)\n  (make-vector (length list) :element-type t :initial-contents list))\n\n(defun array-dimensions (array)\n  (do ((i (1- (array-rank array)) (1- i))\n       (dims '()))\n      ((minusp i) dims)\n    (push (array-dimension array i) dims)))\n\n(defun array-in-bounds-p (array &rest subscripts)\n  (let ((r (array-rank array)))\n    (when (/= r (length subscripts))\n      (error \"subscripts: ~S\" subscripts))\n    (do ((i 0 (1+ i))\n\t (s subscripts (cdr s)))\n\t((= i r) t)\n      (unless (<= 0 (car s) (1- (array-dimension array i)))\n\t(return nil)))))\n\n(defun adjust-array (old-array\n\t\t     dimensions\n\t\t     &rest rest\n\t\t     &key\n\t\t     (element-type nil ets-p)\n\t\t     initial-element\n\t\t     (initial-contents nil ics-p)\n\t\t     (fill-pointer nil fps-p)\n\t\t     displaced-to\n\t\t     displaced-index-offset)\n  (when (/= (length dimensions) (array-rank old-array))\n    (error \"?\"))\n  (unless ets-p\n    (push (array-element-type old-array) rest)\n    (push :element-type rest))\n  (when (adjustable-array-p old-array)\n    (push t rest)\n    (push :adjustable rest))\n  (cond (fps-p\n\t (unless (array-has-fill-pointer-p old-array)\n\t   (error \"?\")))\n\t(t\n\t (when (array-has-fill-pointer-p old-array)\n\t   (push (fill-pointer old-array) rest)\n\t   (push :fill-pointer rest))))\n  (when (eq old-array displaced-to)\n    (error \"?\"))\n  (let ((new-array (apply #'make-array dimensions rest)))\n    (or ics-p displaced-to\n\t(copy-array-partially old-array new-array))\n    (cond ((adjustable-array-p old-array)\n\t   (si:*replace-array old-array new-array)\n\t   old-array)\n\t  (t\n\t   new-array))))\n\n(defun copy-array-partially (src dst)\n  (let* ((dims (mapcar #'min (array-dimensions src) (array-dimensions dst)))\n\t (r (array-rank src))\n\t (s (make-list r :initial-element 0)))\n    (setq r (1- r))\n    (dotimes (x (apply #'* dims))\n      (setf (apply #'aref dst s) (apply #'aref src s))\n      (do ((i r (1- i)))\n\t  ((minusp i))\n\t(incf (nth i s))\n\t(when (< (nth i s) (nth i dims))\n\t  (return))\n\t(setf (nth i s) 0)))))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Common Lisp/common.l",
    "content": ";;; common.l\n;;; commonLisp features for eus\n;;;\t\n;;;\tCopyright(c)1988, Toshihiro MATSUI, Electrotechnical Laboratory\n;;;\t1986-Aug\n;;;\t1987-Feb\n;;;\t1988-Jun\tdefclass, setf\n\n(in-package \"LISP\")\n\n(list \"@(#)$Id: common.l,v 1.1.1.1 2003/11/20 07:46:30 eus Exp $\")\n\n(export '(lisp-implementation-type lisp-implementation-version))\n\n(export '(macroexpand prog1 loop unless until\n\t  pop push pushnew inc dec incf decf))\n\n(export '(defvar defparameter defconstant deflocal\n\tdotimes dolist\n\tdo-symbols do-external-symbols do-all-symbols\n\tpsetq do do* prog prog*\n\tcase classcase otherwise\n\tstring alias\n\tcaaar caadr cadar cdaar cdadr cddar cdddr\n\tfourth fifth sixth seventh eighth \n\tcadddr cddddr cadddr caaddr cdaddr caddddr\n\tflatten list-insert list-delete adjoin union intersection\n\tset-difference set-exclusive-or rotate-list last copy-tree\n\tcopy-list nreconc rassoc acons member assoc subsetp maplist mapcon))\n\n(export '(find find-if find-if-not position position-if position-if-not\n\tcount count-if count-if-not member-if member-if-not \n\tpairlis make-list make-sequence fill replace\n\ttranspose-list\n\tremove remove-if remove-if-not delete delete-if delete-if-not\n\tsubstitute substitute-if substitute-if-not \n\tnsubstitute nsubstitute-if nsubstitute-if-not\n\tunique remove-duplicates extream\n\tsend-super-lexpr send-lexpr send-super send-all resend\n\tsend-super* send*\n\tinstance instance* \n\tmake-instance defclassmethod delete-method\n\tmake-class defstruct defclass readtablep copy-readtable\n\tset-syntax-from-char\n\tcollect-if collect-instances\n))\n\n(export '(keywordp constantp functionp vector-class-p\n\tcompiled-function-p input-stream-p output-stream-p io-stream-p\n\tspecial-form-p macro-function))\n\n(export '(zerop plusp minusp oddp evenp /= logandc1 logandc2\n\tecase every some reduce merge-list merge expt signum\n\tdefsetf define-setf-method \n\tsetf multiple-value-bind multiple-value-setq pop push))\n(export '(get-internal-run-time  list-length values\n\t first second third bye))\n\n(export '(rad2deg deg2rad ))\n\n;; version\n(defun lisp-implementation-type () \"EusLisp\")\n(defun lisp-implementation-version ()\n\t(format nil\n\t        \"EusLisp ~A~A for ~A created on ~A(~A)\"\n\t\t(car lisp-implementation-version)\n\t\t(cdddr lisp-implementation-version)\n\t\t*OS-VERSION*\n\t\t(cadr lisp-implementation-version)\n                (caddr lisp-implementation-version)\n                ))\n(setq euserror nil)\n;;;\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; basic macros\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(eval-when (load eval)\n\n(defun macroexpand (form)\n  (let ((r (macroexpand2 form)))\n    (while (and (listp r) (macro-function (car r)))\n\t(setq r (macroexpand2 r)))\n    r))\n\n;(defmacro defun (fname &rest fdef)\n;   `(progn\n;\t(setq (',fname . function) (cons 'lambda ',fdef))\n;        (remprop ',fname 'builtin-function-entry)\n;\t',fname))\n\n(defmacro prog1 (&rest args)\n   (let ((first (gensym \"PROG1\")))\n      `(let ((,first ,(car args)))\n\t  (progn . ,(cdr args)) ,first)))\n\n(defmacro loop (&rest forms) \n   (let ((tag (gensym \"LOOP\")))\n       `(block nil (tagbody ,tag ,@forms (go ,tag)))))\n(defmacro unless (pred &rest form)\n  `(when (not ,pred) . ,form))\n(defmacro until (condition &rest forms)\n   `(while (not ,condition) ,@forms))\n(defmacro pop (s) `(prog1 (car ,s) (setf ,s (cdr ,s))))\n(defmacro push (item place) `(setf ,place (cons ,item ,place)))\n(defmacro pushnew (item place &key test test-not key)\n   `(progn (if (not (member ,item ,place :test ,test :test-not ,test-not\n\t\t\t\t\t :key ,key))\n\t\t(setf ,place (cons ,item ,place)))\n\t   nil))\n(defmacro inc (var &optional h)\n   (if h (setq h (list '+ var h)) (setq h (list '1+ var)))\n   (list 'setq var h))\n(defmacro dec (var &optional h)\n   (if h (setq h (list '- var h)) (setq h (list '1- var)))\n   (list 'setq var h))\n(defmacro incf (var &optional h)\n   (if h (setq h (list '+ var h)) (setq h (list '1+ var)))\n   (list 'setf var h))\n(defmacro decf (var &optional h)\n   (if h (setq h (list '- var h)) (setq h (list '1- var)))\n   (list 'setf var h))\n\n(defmacro defvar (var &optional (init nil) (doc nil))\n   (unless (symbolp var) (error 20))\n  `(when (eql (send ',var :vtype) 1) \n\t(send ',var :vtype 2)\n        (if (not (boundp ',var))\n\t    (send ',var :global ,init ,doc ))\n\t',var))\n\n(defmacro deflocal (var &optional (init nil) (doc nil))\n   (unless (symbolp var) (error 20))\n   `(progn\n\t(send ',var :special ,init ,doc)\n\t',var))\n\n(defmacro defparameter (var init &optional (doc nil))\n   (unless (symbolp var) (error 20))\n   `(send ',var :global ,init ,doc))\n\n(defmacro defconstant (sym val &optional doc)\n   (unless (symbolp sym) (error 20))\n   `(send ',sym :constant ,val ,doc) )\n  \n\n(defmacro dotimes (vars &rest forms)\n  (let ((endvar (gensym \"DOTIMES\")))\n     `(let ((,(car vars) 0) (,endvar ,(cadr vars)))\n\t(declare (integer ,(car vars) ,endvar))\n\t(while (< ,(car vars) ,endvar)\n\t       ,@forms\n\t       (setq ,(car vars) (1+ ,(car vars))))\n\t,(caddr vars)))) \n\n(defmacro dolist (vars &rest forms)\n   (let ((lists (gensym \"DOLIST\")) (decl (car forms)))\n     (if (and (consp decl) (eq (car decl) 'declare))\n\t (setq forms (cdr forms))\n\t (setq decl nil))\n     `(let ((,(car vars) nil) (,lists ,(cadr vars)))\n\t,decl\n\t(while ,lists\n\t   (setq ,(car vars) (pop ,lists))\n\t   ,@forms)\n\t,(caddr vars)))) \n\n(defmacro do-symbols (vars &rest forms)\n   (let* ((symbols (gensym \"DOSYM\"))\n\t  (v (car vars))\n\t  (pkg (if (cadr vars) (cadr vars) '*package*))\n\t  (pkgv (gensym))\n\t  (i (gensym))\n\t  (size (gensym))\n\t  (svec (gensym))\n\t  )\n   `(let* ((,v nil)\n\t   (,pkgv (find-package ,pkg))\n\t   (,i 0)\n\t   (,svec (,pkgv . intsymvector))\n\t   (,size (length ,svec)))\n\t(while (< ,i ,size)\n\t   (setq ,v (elt ,svec ,i))\n\t   (inc ,i)\n\t   (when (symbolp ,v) . ,forms))\n\t,(caddr vars))))\n\n(defmacro do-external-symbols (vars &rest forms)\n   (let* ((symbols (gensym \"DOEXTSYM\"))\n\t  (v (car vars))\n\t  (pkg (if (cadr vars) (cadr vars) '*package*))\n\t  (pkgv (gensym))\n\t  (i (gensym))\n\t  (size (gensym))\n\t  (svec (gensym))\n\t  )\n   `(let* ((,v nil)\n\t   (,pkgv (find-package ,pkg))\n\t   (,i 0)\n\t   (,svec (,pkgv . symvector))\n\t   (,size (length ,svec)))\n\t(while (< ,i ,size)\n\t   (setq ,v (elt ,svec ,i))\n\t   (inc ,i)\n\t   (when (symbolp ,v) . ,forms))\n\t,(caddr vars))))\n\n(defmacro do-all-symbols (var &rest forms)\n   (let ((apackage (gensym \"DOALLSYM\")))\n      `(dolist (,apackage (list-all-packages) ,(cadr var))\n\t   (do-symbols (,(car var) ,apackage)  . ,forms) )\n       ))\n\n(defmacro psetq (&rest varvals)\n   (let* (vars vals gvars)\n      (while varvals\n\t(push (pop varvals) vars)\n\t(push (pop varvals) vals)\n\t(push (gensym \"PSETQ\") gvars))\n     (setq vars (nreverse vars) vals (nreverse vals) gvars (nreverse gvars))\n     `(let* ,(mapcar #'list gvars vals)\n\t(setq . ,(mapcan #'list vars gvars))\n\tnil)))\n\n(defmacro do (vars endtest &rest body)\n  (let ((decl (car body)) (tag (gensym \"DO\")))\n   (if  (and (consp decl) (eq (car decl) 'declare))\n\t(setq body (cdr body))\n\t(setq decl nil))\n   `(block nil\n     (let\n      ,(mapcar\n\t  #'(lambda (v) (list (car v) (cadr v)))\n\t  vars)\n      ,decl\n      (tagbody\n\t ,tag\n\t (if ,(car endtest) (return (progn . ,(cdr endtest))))\n\t ,@body\n\t (psetq . ,(mapcan #'(lambda (v) (if (cddr v) (list (car v) (caddr v))))\n\t\t       vars))\n\t (go ,tag))) )))\n\n(defmacro do* (vars endtest &rest body)\n  (let ((decl (car body)) (tag (gensym \"DO*\")))\n   (if  (and (consp decl) (eq (car decl) 'declare))\n\t(setq body (cdr body))\n\t(setq decl nil))\n   `(block nil\n     (let*\n      ,(mapcar\n\t  #'(lambda (v) (list (car v) (cadr v)))\n\t  vars)\n      ,decl\n      (tagbody\n\t ,tag\n\t (if ,(car endtest) (return (progn . ,(cdr endtest))))\n\t ,@body\n\t (setq . ,(mapcan #'(lambda (v) (if (cddr v) (list (car v) (caddr v))))\n\t\t       vars))\n\t(go ,tag))) )))\n\n\n(defmacro prog (vars &rest body)\n  `(block nil\n      (let ,vars \n\t (tagbody ,@body))))\n(defmacro prog* (vars &rest body)\n  `(block nil\n      (let* ,vars \n\t (tagbody ,@body))))\n\n)\n;;\n;;\tcase\n;;\n(eval-when (load eval)\n(defun casebody (body) (if (cdr body) (cons 'progn body) (car body)))\n\n(defun casehead (keyvar head)\n   (if (atom head)\n\t(if (memq head '(t otherwise))\n\t    t\n\t    (list 'eq keyvar (list 'quote head)))\n       (list 'memq keyvar (list 'quote head)) ))\n\n(defun case1 (keyvar clauses)\n  (if (atom clauses)\n      nil\n      (list 'if\n\t    (casehead keyvar (caar clauses))\n            (casebody (cdar clauses))\n\t    (case1 keyvar (cdr clauses)) nil)))\n\n(defmacro case (key &rest clauses)\n  (let ((keyvar (gensym \"CASE\")) (result nil))\n     (list 'let (list (list keyvar key)) (case1 keyvar clauses))\n  ))\n\n(defun classcasehead (keyvar head)\n  (if (memq head '(t otherwise))\n      t\n      (if (atom head)\n          `(derivedp ,keyvar ,head)\n          `(or . ,(mapcar #'(lambda (x) `(derivedp ,keyvar ,x)) head)))))\n\n(defun classcase1 (keyvar clauses)\n  (if (atom clauses)\n      nil\n      (list 'if\n\t    (classcasehead keyvar (caar clauses))\n            (casebody (cdar clauses))\n\t    (classcase1 keyvar (cdr clauses)) nil)))\n\n(defmacro classcase (key &rest clauses)\n   (let ((kv (gensym \"CCASE\")))\n      `(let ((,kv ,key)) ,(classcase1 kv clauses))))\n)\n\n;; string\n\n(defun string (x)\n  (if (stringp x) x\n      (if (symbolp x) (copy-seq (x . pname))\n\t  (if (numberp x) (format nil \"~d\" x)\n\t      (error x)))))\n\n;\n; more list functions\n;\n(eval-when (load eval)\n   (defun alias (new old) (setslot new symbol 'function\n\t\t\t\t   (symbol-function old)))\n   (alias 'list-length 'length)\n   (alias 'values 'list)\n   )\n\n(eval-when (load eval)\n(defun caaar (x) (car (caar x)))\n(defun caadr (x) (car (cadr x)))\n(defun cadar (x) (car (cdar x)))\n(defun cdaar (x) (cdr (caar x)))\n(defun cdadr (x) (cdr (cadr x)))\n(defun cddar (x) (cdr (cdar x)))\n(defun cdddr (x) (cdr (cddr x)))\n(alias 'first 'car)\n(alias 'second 'cadr)\n(alias 'third 'caddr)\n(defun fourth (x) (cadr (cddr x)))\n(defun fifth  (x) (caddr (cddr x)))\n(defun sixth  (x) (caddr (cdddr x)))\n(defun seventh  (x) (caddr (cddddr x)))\n(defun eighth  (x) (cadddr (cddddr x)))\n#|\n(defun cadddr (x) (car (cdddr x)))\n|#\n(defun cddddr (x) (cddr (cddr x)))\n(defun cadddr (x) (cadr (cddr x)))\n(defun caaddr (x) (caar (cddr x)))\n(defun cdaddr (x) (cdar (cddr x)))\n(defun caddddr (x) (cadr (cdddr x)))\n(defun flatten (l &optional accumulator)\n  (cond\n   ((null l) accumulator)\n   ((atom l) (cons l accumulator))\n   (t (flatten (car l)\n\t       (flatten (cdr l) accumulator)))) )\n\n(defun list-insert (item pos list)\n   \"insert item as the pos'th element in list.\nif pos is bigger than the length of list, item is nconc'ed at the tail\"\n   (cond ((null list) (list item))\n\t ((>= pos (length list)) (nconc list (list item)))\n\t ((= pos 0) (cons item list))\n\t (t (let ((tail (cons item (nthcdr pos list))))\n\t\t(rplacd (nthcdr  (1- pos) list) tail)\n\t\tlist))))\n\n(defun list-delete (lst n)\t\"(lst n) delete nth element of lst\"\n   (if (= n 0) \n\t(setq lst (cdr lst))\n\t(rplacd (nthcdr (1- n) lst) (nthcdr (1+ n) lst))  )\n   lst)\n\n(defun adjoin (item list &key (test #'eq) (test-not) (key #'identity))\n  (if (member item list :test test :test-not test-not :key key)\n      list\n      (cons item list)))\n\n(defun union (list1 list2 &key (test #'eq) (test-not) (key #'identity))\n  (let (result)\n    (dolist (item list1)\n      (unless (member (funcall key item) result\n\t\t      :test test :test-not test-not :key key)\n\t  (setq result (cons item result))))\n    (dolist (item list2)\n      (unless (member  (funcall key item) result \n\t\t       :test test :test-not test-not :key key)\n\t  (setq result (cons item result))))\n    (reverse result)))\n\n(defun intersection (list1 list2 &key (test #'eq) (test-not) (key #'identity))\n   (let (r)\n      (dolist (item list1)\n\t(if (member (funcall key item) list2\n\t\t    :test test :test-not test-not :key key)\n\t    (setq r (cons item r))))\n      r))\n\n(defun set-difference (list1 list2 &key (test #'eq) (test-not)\n\t\t\t\t\t(key #'identity))\n   (let (result)\n     (dolist (l1 list1)\n\t(unless (member (funcall key l1) list2\n\t\t\t:test test :test-not test-not :key key)\n\t   (push l1 result)))\n     (nreverse result)))\n\n(defun set-exclusive-or (list1 list2 &key (test #'eq) (test-not)\n\t\t\t\t\t  (key #'identity))\n   (let (result1 result2)\n     (dolist (l1 list1)\n\t(setq l1 (funcall key l1))\n\t(unless (member l1 list2 :test test :test-not test-not :key key)\n\t   (push l1 result1)))\n     (dolist (l2 list2)\n\t(setq l2 (funcall key l2))\n\t(unless (member l2 list1 :test test :test-not test-not :key key)\n\t   (push l2 result2)))\n     (nconc result1 result2)))\n\n(defun rotate-list (l) (append (cdr l) (list (car l))))\n(defun last (x)\n  (while (consp (cdr x)) (setq x (cdr x)))\n  x)\n(defun copy-tree (x) (subst t t x))\n(defun copy-list (x) (nreverse (reverse x)))\n(defun nreconc (x y) (nconc (nreverse x) y))\n(defun rassoc (item alist)\n  (dolist (a alist)\n     (if (equal item (cdr a)) (return-from rassoc a))))\n(defun acons (key datum alist) (cons (cons key datum) alist))\n(defun member (item list &key key test test-not)\n   (supermember item list key test test-not))\n(defun assoc (item alist &key key test test-not)\n   (superassoc item alist key test test-not))\n(defun subsetp (sub super &key key test test-not)\n   (every #'(lambda (s) (member s super :key key :test test :test-not test-not))\n\t  sub))\n(defun maplist (func arg &rest more-args &aux result)\n   (if more-args\n       (let (arglist margs)\n\t  (while arg\n\t     (setq arglist nil)\n\t     (push arg arglist)\n\t     (setq arg (cdr arg))\n\t     (setq margs more-args)\n\t     (while margs\n\t\t(push (car margs) arglist)\n\t\t(setf (car margs) (cdar margs))\n\t\t(setq margs (cdr margs)) )\n\t     (push (apply func (nreverse arglist)) result) ))\n        (while arg\n\t    (push (funcall func arg) result)\n\t    (setq arg (cdr arg)))) \n   (nreverse result))\n\n(defun mapcon (func arg &rest more-args &aux result)\n   (if more-args\n       (let (arglist margs)\n\t  (while arg\n\t     (setq arglist nil)\n\t     (push arg arglist)\n\t     (setq arg (cdr arg))\n\t     (setq margs more-args)\n\t     (while margs\n\t\t(push (car margs) arglist)\n\t\t(setf (car margs) (cdar margs))\n\t\t(setq margs (cdr margs)) )\n\t     (setq result (nconc (apply func (nreverse arglist)) result) )) )\n        (while arg\n\t    (setq result (nconc (funcall func arg) result))\n\t    (setq arg (cdr arg)))) \n   (nreverse result))\n\n(defun find (item seq &key (start 0) (end (length seq))\n\t\t           (test #'eq) (test-not nil) (key #'identity))\n   (system::raw-find item seq test test-not key nil nil start end))\n(defun find-if (pred seq &key (start 0) (end (length seq)) (key #'identity))\n   (system::raw-find nil seq nil nil key pred nil start end))\n(defun find-if-not (pred seq &key (start 0) (end (length seq)) (key #'identity))\n   (system::raw-find nil seq nil nil key nil pred start end))\n\n(defun position (item seq &key (start 0) (end (length seq)) (count 1)\n\t\t           (test #'eq) (test-not nil) (key #'identity))\n   (system::raw-position item seq test test-not key nil nil start end count))\n(defun position-if (pred seq &key (start 0) (end (length seq)) (count 1) (key #'identity))\n   (system::raw-position nil seq nil nil key pred nil start end count))\n(defun position-if-not (pred seq &key (start 0) (end (length seq)) (count 1) (key #'identity))\n   (system::raw-position nil seq nil nil key nil pred start end count))\n\n(defun count (item seq &key (start 0) (end (length seq))\n\t\t           (test #'eq) (test-not nil) (key #'identity))\n   (system::raw-count item seq test test-not key nil nil start end))\n(defun count-if (pred seq &key (start 0) (end (length seq)) (key #'identity))\n   (system::raw-count nil seq nil nil key pred nil start end))\n(defun count-if-not (pred seq &key (start 0) (end (length seq)) (key #'identity))\n   (system::raw-count nil seq nil nil key nil pred start end))\n(defun member-if (test list &key (key #'identity))\n   (while list\n      (if (funcall test (funcall key (car list))) \n\t  (return-from member-if list)\n\t  (setq list (cdr list)))))\n(defun member-if-not (test list &key (key #'identity))\n   (while list\n      (if (not (funcall test (funcall key (car list))) )\n\t  (return-from member-if-not list)\n\t  (setq list (cdr list)))))\n(defun collect-if (func seq &aux r)\n   (dolist (s seq)\n      (if (funcall func s) (push s r)) )\n   (nreverse r) )\n(defun collect-instances (klass list)\n   (collect-if #'(lambda (i) (derivedp i klass)) (flatten list)))\n\n(defun pairlis (l1 l2 &optional alist)\n   (if l1\n       (cons (cons (car l1) (car l2)) (pairlis (cdr l1) (cdr l2) alist))\n       alist))\n\n(defun transpose-list (dlist)\n   (let (r)\n      (dotimes (i (length (car dlist)))\n\t (push (mapcar #'(lambda (x) (nth i x)) dlist) r))\n      (nreverse r)))\n\n(defun make-list (leng &key initial-element)\n  (let (r)\n   (unless (integerp leng) (error \"integer required for length of make-list\"))\n   (dotimes (i leng r)\n\t(push initial-element r))))\n\n(defun make-sequence (type size &key initial-element)\n  (if (or (memq type '(cons list)) (eq type cons))\n      (make-list size :initial-element initial-element)\n      (make-array size :element-type type :initial-element initial-element)))\n\n(defun fill (seq item &key (start 0) (end (length seq)))\n   (system::raw-fill seq item start end))\n\n(defun replace (dest src &key (start1 0) (end1 (length dest))\n\t\t\t      (start2 0) (end2 (length src)))\n  (let ((result dest) (count (min (- end1 start1) (- end2 start2))))\n   (cond ((listp dest)\n\t  (setq dest (nthcdr start1 dest))\n\t  (cond ((listp src)\n\t\t (setq src (nthcdr start2 src))\n\t\t (dotimes (c count)\n\t\t    (setq (dest . car) (pop src))\n\t\t    (pop dest)))\n\t\t(t\n\t\t  (dotimes (c count)\n\t\t    (setq (dest . car) (aref src start2))\n\t\t    (inc start2) (pop dest)))))\n\t((listp src)\t; list --> vector\n\t (setq src (nthcdr start2 src))\n\t (dotimes (c count)\n\t    (aset dest start1 (pop src))\n\t    (inc start1)))\n\t(t (system::vector-replace dest src start1 end1 start2 end2)))\n    result))\n\n(defun remove (item seq &key (start 0) (end (length seq))\n\t\t\t      (test #'eq) (test-not nil)\n\t\t\t      (count 1000000) (key #'identity))\n    (system::universal-remove item seq test test-not key nil nil start end count))\n(defun remove-if (pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::universal-remove nil seq nil nil key pred nil start end count))\n(defun remove-if-not (pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::universal-remove nil seq nil nil key nil pred start end count))\n\n(defun delete (item seq &key (start 0) (end (length seq))\n\t\t\t      (test #'eq) (test-not nil)\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-delete item seq test test-not key nil nil start end count))\n(defun delete-if (pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-delete nil seq nil nil key pred nil start end count))\n(defun delete-if-not (pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-delete nil seq nil nil key nil pred start end count))\n\n(defun substitute (newitem olditem seq &key (start 0) (end (length seq))\n\t\t\t      (test #'eq) (test-not nil)\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-substitute newitem olditem seq test test-not key nil nil start end count))\n(defun substitute-if (newitem pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-substitute newitem nil seq nil nil key pred nil start end count))\n(defun substitute-if-not (newitem pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-substitute newitem nil seq nil nil key nil pred start end count))\n\n(defun nsubstitute (newitem olditem seq &key (start 0) (end (length seq))\n\t\t\t      (test #'eq) (test-not nil)\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-nsubstitute newitem olditem seq test test-not key nil nil start end count))\n(defun nsubstitute-if (newitem pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-nsubstitute newitem nil seq nil nil key pred nil start end count))\n(defun nsubstitute-if-not (newitem pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-nsubstitute newitem nil seq nil nil key nil pred start end count))\n\n(defun unique (l)\n   (cond\n      ((atom (cdr l)) l)\n      ((memq (car l) (cdr l)) (unique (cdr l)))\n      (t (cons (car l) (unique (cdr l))))))\n\n(defun remove-duplicates (seq &key (test #'eq) (test-not) (key #'identity)\n\t\t\t\t   (start 0) (end 1000000))\n   (system::raw-remove-duplicates seq test test-not key start end))\n\n(defun extream (seq test &optional (key #'identity))\n   (if (null seq)\n       nil\n       (let* ((ext (elt seq 0))  (p (funcall key ext)) x)\n\t  (if (consp seq)\n\t      (dolist (v (cdr seq))\n\t\t   (when (funcall test (funcall key v) p)\n\t\t      (setq ext v\n\t\t\t    p   (funcall key ext))) ) \n\t      (dotimes (i (length seq))\n\t\t   (when (funcall test\n\t\t\t\t  (funcall key (setq x (aref seq i)))\n\t\t\t\t  p)\n\t\t      (setq ext x\n\t\t\t    p   (funcall key ext)))) )\n          ext)) )\n) ;eval-when\n\n\f\n;;;\n;;; equivalent pairs from WINSTON\n;;;\n\n#|\n(eval-when (load eval)\n(defun coalesce (pairs) (coalesce-aux pairs nil))\n(defun coalesce-aux (pairs classes)\n  (cond ((null pairs) classes)\n\t(t (coalesce-aux (cdr pairs)\n\t\t\t (absorb (car pairs) classes)))))\n(defun stick-in (new classes)\n  (cond ((member new (car classes)) classes)\n\t(t (cons (cons new (car classes))\n\t\t (cdr classes)))))\n(defun absorb (pair classes)\n  (cond ((null classes) (list pair))\n\t((member (car pair) (car classes))\n\t (stick-in (cadr pair) classes))\n\t((member (cadr pair) (car classes))\n\t (stick-in (car pair) classes))\n\t(t (cons (car classes)\n\t\t (absorb pair (cdr classes))))))\n) ;eval-when ; end of more list functions\n|#\n\n\f\n;;;\n;;; LEO functions\n;;;\n(eval-when (load eval)\n(defmacro send-super-lexpr (selector &rest msgs)\n  (declare (type metaclass class))\n  `(apply #'send-message self (class . super) ,selector . ,msgs)\n  )\n(defmacro send-super* (&rest msgs)\n  (declare (type metaclass class))\n  `(apply #'send-message self (class . super) . ,msgs)\n  )\n(defmacro send-lexpr (target selector &rest msgs)\n  `(apply #'send ,target ,selector . ,msgs)\n  )\n(defmacro send* (&rest msgs)\n  `(apply #'send . ,msgs)\n  )\n(defmacro send-super (selector &rest msgs)\n  (declare (type metaclass class))\n  `(send-message self (class . super) ,selector ,@msgs))\n\n(defun send-all (receivers &rest mesg)\n  (mapcar #'(lambda (r) (apply 'send r mesg)) receivers))\n\n(defun resend (obj mesg)\n   (eval (cons 'send (cons obj mesg))))\n\n(defmacro instance (cls &rest message)\n  (if message\n\t(let ((v (gensym \"INST\")))\n\t`(let ((,v (instantiate ,cls))) (send ,v ,@message) ,v))\n\t`(instantiate ,cls)))\n\n(defmacro instance* (cls &rest message)\n  (if message\n\t(let ((v (gensym \"INST\")))\n\t`(let ((,v (instantiate ,cls))) (send* ,v ,@message) ,v))\n\t`(instantiate ,cls)))\n\n(defun make-instance (klass &rest args)\n   (let ((inst (instantiate klass)))\n      (while args\n\t (setslot inst klass (string (pop args)) (pop args)))\n      inst))\n\n(defmacro defclassmethod (classname &rest methods)\n    `(defmethod ,(metaclass-name  (class (symbol-value classname)))\n\t\t. ,methods))\n(defun delete-method (classobj methodname)\n   (setf (metaclass-methods classobj)\n\t (delete methodname (metaclass-methods classobj) :key #'car))\n   (system::method-cache t))\n\n;;;\n;;;\tdefclass macro (T.Matsui 1988-Jun)\n;;;\n\n(defun make-class (name &key\n\t\t\t\t(super object)\t\n\t\t\t\t(include object)\n\t\t\t\t(printer nil)\n\t\t\t\t(constructor nil)\n\t\t\t\t(predicate nil)\n\t\t\t\t(copier nil)\n\t\t\t\t((:metaclass metaklass) nil)\n\t\t\t\t(element-type nil)\n\t\t\t\t(size -1)\n\t\t\t\t((:slots varlist) nil) \n\t\t\t\t(documentation nil))\n  (if (symbolp super) (setq super (symbol-value super)))\n  (let ((classobj (if (boundp name) (symbol-value name)))\n        (variables) (types) (forwards)\n        (etype) (index 0) (accessor) (p))\n     (cond ((null (classp classobj))\n\t\t(cond \n\t\t    (metaklass)\n\t\t    ((classp metaklass))\n\t\t    (super (setq metaklass (class super)))\n\t\t    (t     (setq metaklass (symbol-value 'metaclass))))\n\t\t(setq classobj (instantiate metaklass)))\n\t   (t (setq metaklass (class classobj))))\n     (setq variables (nreverse (coerce (super . vars) cons))\n\t   types (nreverse (coerce (super . types) cons))\n\t   forwards (nreverse (coerce (super . forwards) cons)))\n     (dolist (v varlist)\n\t(cond ((consp v)\n\t\t(if (member (car v) variables)\n\t\t    (error \"duplicated object variable name\"))\n\t\t(push (car v) variables)\n\t\t(setq p (position :type v))\n\t\t(push (if p (elt v (1+ p)) t) types)\n\t\t(setq p (position :forward v))\n\t\t(push (if p (elt v (1+ p)) nil) forwards))\n\t      ((symbolp v)\n\t\t(if (member v variables)\n\t\t    (error \"duplicated object variable name\"))\n\t\t(push v variables)\n\t\t(push t types)\n\t\t(push nil forwards))\n\t      (t (error \"variable name expected for :slots\"))))\n     (setq variables (coerce (nreverse variables) vector)\n\t   types (coerce (nreverse types) vector)\n\t   forwards (coerce (nreverse forwards) vector))\n     (setq etype (cdr (assq element-type \n\t\t\t'((:BIT . 1) (:CHAR . 2) (:BYTE . 3)\n\t\t\t  (:INTEGER . 4) (:FLOAT . 5) (:FOREIGN . 6)))))\n     (if (null etype)\n         (setq etype   (if (subclassp metaklass vectorclass)\n\t\t\t   (vectorclass-element-type super)\n\t\t\t   0)))\n     (setq (classobj . name) name\n\t   (classobj . vars) variables\n\t   (classobj . types) types\n\t   (classobj . forwards) forwards\n\t   (classobj . super) super)\n     (if (subclassp metaklass vectorclass)\n\t (setq  (classobj . element-type) etype\n\t\t(classobj . size) size))\n     (if (null (classobj . cix))   (enter-class classobj))\n;;;???\n;;;     (proclaim (list 'special name))\n;;      (set name classobj)\n;;     (send name :global classobj)\n     (putprop name documentation :class-documentation)\n;; define slot access functions and setf methods for all variables\n     (setq variables (coerce  variables  cons))\n     (dolist (v variables)\n\t(setq accessor (intern (concatenate string\n\t\t\t\t\t    (string name) \"-\" (string v))))\n\t(setf (symbol-function accessor)\n\t      `(macro (obj) (list 'slot obj ',name ,index)))\n\t(incf index))\n     classobj ))\n\n\n(defmacro defstruct (name &rest slots)\n   `(progn\n\t    (send ',name :global\n\t\t(make-class ',name :slots ',slots))\n\t    ',name))\n\n\n(defmacro defclass (name &key slots\n\t\t\t      (super 'object)\n\t\t\t      (size -1)\n\t\t\t      ((:metaclass metaklass) nil)\n\t\t\t      element-type\n\t\t\t      documentation\n\t\t\t      (doc documentation))\n\t`(progn\n\t    (send ',name :global\n\t        (make-class ',name\n\t\t    :super ,super\n\t\t    :slots ',slots\n\t\t    :metaclass ,metaklass\n\t\t    :element-type ,element-type\n\t\t    :size ,size\n\t\t    :documentation ,doc) )\n\t    ',name))\n\n\n;;; \n;;; READTABLES\n;;;\n(eval-when (load eval)\n(defun readtablep (x) (derivedp x readtable))\n(defun copy-readtable (&optional (from *readtable*) (to nil))\n   (when (null from) (setq from *default-readtable*))\n   (when (null to)\n      (setq to (instantiate readtable))\n      (setf (readtable-syntax to) (instantiate string 256)\n\t    (readtable-macro to) (instantiate vector 256)\n\t    (readtable-dispatch-macro to) (instantiate vector 256)))\n   (if (or (null (readtablep from)) (null (readtablep to))) \n       (error \"readtable expected\"))\n   (replace (readtable-syntax to) (readtable-syntax from))\n   (replace (readtable-macro to) (readtable-macro from))\n   (replace (readtable-dispatch-macro to) (readtable-dispatch-macro from))\n   (setf (readtable-case to) (readtable-case from))\n   to)\n\n(defun set-syntax-from-char\n\t (to-char from-char &optional (to-readtable *readtable*)\n\t\t\t\t      (from-readtable *default-readtable*))\n   (let (syn)\n      (setq syn (aref (readtable-syntax from-readtable) from-char))\n      (aset (readtable-syntax to-readtable) to-char syn)\n      (if (or (eq syn 7) (eq syn 8))\n\t  (aset (readtable-macro to-readtable) to-char\n\t\t(aref (readtable-macro from-readtable) from-char)))\n      syn))\n)\n\n\f\n;;\n;;\tpredicates\n;;\n(eval-when (load eval)\n(defun keywordp (sym)\n   (declare (type symbol sym))\n   (and (symbolp sym) (eq (sym . homepkg) *keyword-package*)))\n\n(defun constantp (obj)\n   (declare (type symbol obj))\n   (if (symbolp obj)\n\t(if (or (keywordp obj) (eq (obj . vtype) 0)) t nil)\n\t(if (listp obj)\n\t    (if (eq (car obj) 'quote) t nil)\n\t    (if (atom obj) t nil))))\n\n(defun functionp (obj)\n  (cond ((numberp obj) nil)\n\t((listp obj) \n\t    (if (or (memq (car obj) '(lambda lambda-closure))) t nil))\n\t((derivedp obj compiled-code)\n\t  (eq (compiled-code-type obj) 0))\n\t((and (symbolp obj) (fboundp obj))\n\t (functionp (symbol-function obj)))\n\t(t nil)))\n\n(defun vector-class-p (p) (derivedp p vectorclass))\n(defun compiled-function-p (x) (derivedp  x compiled-code))\n(defun input-stream-p (obj)\n  (declare (stream obj))\n  (or (and (derivedp obj stream)  (eq (obj . direction) :input))\n      (derivedp obj io-stream)))\n(defun output-stream-p (obj)\n  (declare (stream obj))\n  (or (and (derivedp obj stream)  (eq (obj . direction) :output))\n      (derivedp obj io-stream)))\n(defun io-stream-p (obj) (derivedp obj io-stream))\n\n(defun special-form-p (s)\n  (and (symbolp s)\n       (fboundp s)\n       (setq s (symbol-function s))\n       (compiled-function-p s)\n       (eq (s . type) 2)))\n\n(defun macro-function (s)\n  (and (symbolp s)\n       (fboundp s)\n       (setq s (symbol-function s))\n       (if (and (compiled-function-p s)\n\t        (eq (s . type) 1))\n\t   s\n\t   (if (and (listp s) (eq (car s) 'macro)) s nil)\n       )))\n\n(defun zerop (n) (= n 0))\n(defun plusp (n) (> n 0))\n(defun minusp (n) (< n 0))\n(defun oddp (n) (logbitp 0 n))\n(defun evenp (n) (not (logbitp 0 n)))\n(defun /= (n1 n2) (not (= n1 n2)))\n(defun logandc1 (x y) (logand (lognot x) y))\n(defun logandc2 (x y) (logand x (lognot y)))\n(defmacro ecase (&rest x) (cons 'case x))\n\n(defun every (pred arg &rest more-args)\n  (cond ((and (null more-args) (listp arg))\n\t (while arg (unless (funcall pred (pop arg)) (return-from every nil))))\n\t(t\n\t (setq arg (cons arg more-args))\n\t (dotimes (i (length (car arg)))\n\t     (unless (apply pred (mapcar #'(lambda (x) (elt x i)) arg))\n\t\t     (return-from every nil)))))\n   t)\n\n(defun some (pred arg &rest more-args &aux result)\n   (setq arg (cons arg more-args))\n   (dotimes (i (length (car arg)))\n        (if (setq result (apply pred (mapcar #'(lambda (x) (elt x i)) arg)))\n\t    (return-from some result)))\n   nil)\n)\n\n(eval-when (load eval)\n(defun reduce (func seq &key (start 0) (end (length seq))\n\t\t\t     from-end initial-value)\n   (let ((length (- end start)))\n      (when from-end (setq seq (reverse seq)))\n      (cond\n\t ((and (= length 1) (null initial-value)) (elt seq start))\n\t ((= length 0)\n\t  (if initial-value initial-value (funcall func)))\n\t (t\n\t   (unless initial-value\n\t\t(setq initial-value\n\t\t      (funcall func (elt seq start) (elt seq (inc start))))\n\t\t(dec length 2) (inc start))\n\t   (dotimes (i length)\n\t     (setq initial-value\n\t\t   (funcall func initial-value (elt seq (+ start i)))))\n\t   initial-value))))\n\n(defun merge-list (list1 list2 pred key &aux result p1 e1 e2 pp1 pp2)\n   (while (and list2  (not (funcall pred (funcall key (car list1))\n\t\t\t\t         (funcall key (car list2)))))\n      (push (pop list2) result))\n   (setq result (nreverse result))\n   (setq p1 list1)\n   (while (and list2 (cdr p1))\n      (setq e2 (funcall key (car list2)))\n      (while (and p1 (funcall pred (funcall key (cadr p1)) e2)) (pop p1))\n      (when p1\n\t (setf pp1 (cdr p1)\n\t       pp2 (cdr list2)\n\t       (cdr p1) list2\n\t       (cdr list2) pp1\n\t       p1 list2\n\t       list2 pp2)) )\n   (nconc result list1 list2))\n\n(defun merge (result-class seq1 seq2 pred &key (key #'identity))\n   (if (and (eq result-class cons) (listp seq1) (listp seq2))\n       (merge-list seq1 seq2 pred key)\n       (let* ((l1 (length seq1)) (l2 (length seq2)) (l (+ l1 l2))\n\t      (result (make-sequence result-class l))\n\t      (i1 0) (i2 0) (j 0) (e1) (e2) (e))\n          (while (< j l)\n\t    (cond ((>= i1 l1) (setq e (elt seq2 i2)) (inc i2))\n\t          ((>= i2 l2) (setq e (elt seq1 i1)) (inc i1))\n\t          (t (setq e1 (elt seq1 i1)\n\t\t           e2 (elt seq2 i2))\n\t\t     (if (funcall pred (funcall key e1) (funcall key e2))\n\t\t         (progn (inc i1) (setq e e1))\n\t\t         (progn (inc i2) (setq e e2)))))\n\t    (setf (elt result j) e)\n\t    (inc j))\n          result)))\n)\n\t\t   \n\n;;\n;; arithmetics aux\n;;\n\n(defun expt (a x)\n   (cond ((and (integerp x) (>= x 0))\n\t  (if (zerop x)\n\t      1\n\t      (let ((b a) (y 1) (ix (1- x)))\n\t\t(declare (integer y ix))\n\t\t(while (> ix 0)\n\t\t    (cond ((> ix y)\n\t\t\t    (setq b (* b b)\n\t\t\t    \t  ix (- ix y)\n\t\t\t    \t  y (ash y 1)))\n\t\t\t  (t (setq b (* b a) ix (1- ix)))))\n\t        b)))\n\t (t (exp (* x (log a))))))\n(defun signum (x) (if (zerop x) x (/ x (abs x))))\n(defun rad2deg (rad) (/ (* 360.0 rad) 2pi))\n(defun deg2rad (deg) (/ (* 2pi deg) 360.0))\n)\n\f\n;;;; (C) Copyright Taiichi Yuasa and Masami Hagiya, 1984. All rights reserved.\n;;;;\n;;;;                                setf routines\n;;;;\tModified by T.Matsui to be run on euslisp\n;;;;\t1988-Jun-27\n\n;;; DEFSETF macro.\n(defmacro defsetf (access-fn &rest rest)\n  (cond ((and (car rest) (or (symbolp (car rest)) (functionp (car rest))))\n         `(progn (putprop ',access-fn ',(car rest) 'setf-update-fn)\n                 (remprop ',access-fn 'setf-lambda)\n                 (remprop ',access-fn 'setf-method)\n                 (putprop ',access-fn\n                             ,(when (not (endp (cdr rest)))\n                                    (unless (stringp (cadr rest))\n                                            (error \"A doc-string expected.\"))\n                                    (unless (endp (cddr rest))\n                                            (error \"Extra arguments.\"))\n                                    (cadr rest))\n                             'setf-documentation)\n                 ',access-fn))\n\t(t\n\t (unless (= (list-length (cadr rest)) 1)\n\t\t (error \"(store-variable) expected.\"))\n         `(progn (putprop ',access-fn ',rest 'setf-lambda)\n                 (remprop ',access-fn 'setf-update-fn)\n                 (remprop ',access-fn 'setf-method)\n;                 (putprop ',access-fn\n;                             ,(find-documentation (cddr rest))\n;                             'setf-documentation)\n                 ',access-fn))))\n\n\n;;; DEFINE-SETF-METHOD macro.\n(defmacro define-setf-method (access-fn &rest rest)\n  `(progn (putprop ',access-fn #'(lambda ,@rest) 'setf-method)\n          (remprop ',access-fn 'setf-lambda)\n          (remprop ',access-fn 'setf-update-fn)\n;          (putprop ',access-fn\n;                      ,(find-documentation (cdr rest))\n;                      'setf-documentation)\n          ',access-fn))\n\n;;; The expansion function for SETF.\n(defun setf-expand-1 (place newvalue)\n (let (g)\n  (setq place (macroexpand place))\n  (cond ((and (consp place) (eq (car place) 'the))\n          (setf-expand-1 (caddr place) `(the ,(cadr place) ,newvalue)))\n        ((symbolp place)  `(setq ,place ,newvalue))\n        ((and (symbolp (car place)) (setq g (get (car place) 'setf-update-fn)))\n         `(,g ,@(cdr place) ,newvalue))\n        ((and (symbolp (car place))\n             (setq g (get (car place) 'structure-access))\n             (get (car place) 'setf-lambda)\n             (not (eq (car g) 'list))\n             (not (eq (car g) 'vector)))\n          `(system::structure-set ,(cadr place) ',(car g) ,(cdr g) ,newvalue))\n\t((macro-function (car place))\n\t (setf-expand-1 (macroexpand place) newvalue))\n\t((setq g (get (car place) 'setf-lambda))\n\t   (apply (append '(lambda) (list (append (cadr g) (car g))) (cddr g))\n\t\t  newvalue (cdr place)))\n;\t((get (car place) 'setf-method)\n;\t (apply (get (car form) 'setf-method) (cdr place)))\n\t(t (error \"SETF?\")))))\n\n(defun setf-expand (l)\n  (cond ((endp l) nil)\n        ((endp (cdr l)) (error \"~S is an illegal SETF form.\" l))\n        (t\n         (cons (setf-expand-1 (car l) (cadr l))\n               (setf-expand (cddr l))))))\n\n\n;;; SETF macro.\n(defmacro setf (&rest rest)\n  (cond ((endp rest) nil)\n        ((endp (cdr rest)) (error \"~S is an illegal SETF form.\" rest))\n        ((endp (cddr rest)) (setf-expand-1 (car rest) (cadr rest)))\n        (t (cons 'progn (setf-expand rest)))))\n\n;(defmacro incf (form &optional (d 1))\n;  `(setf ,form (+ ,form ,d)))\n;(defmacro decf (form &optional (d 1))\n;  `(setf ,form (- ,form ,d)))\n\n;;;\n;;;  MULTI-VALUE simulation macros\n;;;\n(defmacro multiple-value-bind (vlist init &rest forms)\n   (let* ((inits (gensym \"MULT\")) (vilist) (count 0))\n      (dolist (v vlist)\n\t (push (list v `(elt ,inits ,count)) vilist)\n         (inc count))\n      `(let* ((,inits ,init) . ,vilist) . ,forms)))\n\n(defmacro multiple-value-setq (vlist form)\n   (let ((i 0) (tempvar (gensym \"MULT\")) setq-forms)\n     (dolist (v vlist)\n\t(push (list\n\t\t(second\n\t\t   (assoc i\n\t\t\t'((0 first) (1 second) (2 third)\n\t\t\t(3 fourth)(4 fifth) (5 sixth) (6 seventh))))\n\t\ttempvar)\n\t      setq-forms)\n\t(push v setq-forms)\n\t(incf i))\n    `(let ((,tempvar ,form))\n\t(setq . ,setq-forms))))\n\n(alias 'values  'list)\n\n#|\n(defun quick-sort (sequence start end predicate key &aux (j 0) (k 0) exch)\n  (declare (fixnum start end j k))\n  (when (<= end (the fixnum (1+ start)))\n        (return-from quick-sort sequence))\n  (setq j start)\n  (setq k (1- end))\n  (do ((d (aref sequence start)))\n      ((> j k))\n    (do ()\n\t((or (> j k)\n\t     (funcall predicate\n\t\t      (funcall key (aref sequence k))\n\t\t      (funcall key d))))\n      (decf k))\n    (when (< k start)\n\t  (quick-sort sequence (1+ start) end predicate key)\n\t  (return-from quick-sort sequence))\n    (do ()\n\t((or (> j k)\n\t     (not (funcall predicate\n\t\t\t   (funcall key (aref sequence j))\n\t\t\t   (funcall key d)))))\n      (incf j))\n    (when (> j k) (return))\n    (setf exch (aref sequence k)\n\t  (aref sequence k) (aref sequence j)\n\t  (aref sequence j) exch)\n    (incf j)\n    (decf k))\n  (quick-sort sequence start j predicate key)\n  (quick-sort sequence j end predicate key)\n  sequence)\n\n(defun qsort (seq test &optional (key #'identity) &aux (vec nil) (s nil))\n  (cond ((null seq) nil)\n\t((listp seq)\n\t (setq vec (coerce seq vector))\n\t (quick-sort vec 0 (length seq) test key)\n\t (setq s seq)\n\t (dotimes (i (length vec))\n\t    (rplaca s (aref vec i))\n\t    (setq s (cdr s)))\n\t seq)\n\t((vectorp seq)\n\t (quick-sort seq 0 (length seq) test key)\n\t seq) ))\n|#\n\n#|\n(eval-when (load eval)\n   (defmacro pop (s) `(prog1 (car ,s) (setf ,s (cdr ,s))))\n   (defmacro push (item place) `(setf ,place (cons ,item ,place)))\n )\n|#\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Common Lisp/config.sexp",
    "content": "((exe_name hello)\n (link_order (world hello)))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Common Lisp/hello.lisp",
    "content": "(DEFUN HELLO ()\n  (PRINT 'HELLO))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Common Lisp/macros-advanced.cl",
    "content": ";; @file macros-advanced.cl\n;;\n;; @breif Advanced macro practices - defining your own macros\n;;\n;; Macro definition skeleton:\n;; (defmacro name (parameter*)\n;;   \"Optional documentation string\"\n;;   body-form*)\n;;\n;; Note that backquote expression is most often used in the `body-form`\n;;\n\n; `primep` test a number for prime\n(defun primep (n)\n  \"test a number for prime\"\n  (if (< n 2) (return-from primep))\n  (do ((i 2 (1+ i)) (p t (not (zerop (mod n i)))))\n      ((> i (sqrt n)) p)\n    (when (not p) (return))))\n; `next-prime` return the next prime bigger than the specified number\n(defun next-prime (n)\n  \"return the next prime bigger than the speicified number\"\n  (do ((i (1+ n) (1+ i)))\n      ((primep i) i)))\n;\n; The recommended procedures to writting a new macro are as follows:\n; 1. Write a sample call to the macro and the code it should expand into\n(do-primes (p 0 19)\n  (format t \"~d \" p))\n; Expected expanded codes\n(do ((p (next-prime (- 0 1)) (next-prime p)))\n    ((> p 19))\n  (format t \"~d \" p))\n; 2. Write code that generate the hardwritten expansion from the arguments in\n; the sample call\n(defmacro do-primes (var-and-range &rest body)\n  (let ((var (first var-and-range))\n        (start (second var-and-range))\n        (end (third var-and-range)))\n    `(do ((,var (next-prime (- ,start 1)) (next-prime ,var)))\n         ((> ,var ,end))\n      ,@body)))\n; 2-1. More concise implementations with the 'parameter list destructuring' and\n; '&body' synonym, it also emits more friendly messages on incorrent input.\n(defmacro do-primes ((var start end) &body body)\n  `(do ((,var (next-prime (- ,start 1)) (next-prime ,var)))\n       ((> ,var ,end))\n    ,@body))\n; 2-2. Test the result of macro expansion with the `macroexpand-1` function\n(macroexpand-1 '(do-primes (p 0 19) (format t \"~d \" p)))\n; 3. Make sure the macro abstraction does not \"leak\"\n(defmacro do-primes ((var start end) &body body)\n  (let ((end-value-name (gensym)))\n    `(do ((,var (next-prime (- ,start 1)) (next-prime ,var))\n          (,end-value-name ,end))\n         ((> ,var ,end-value-name))\n      ,@body)))\n; 3-1. Rules to observe to avoid common and possible leaks\n;   a. include any subforms in the expansion in positions that will be evaluated\n;      in the same order as the subforms appear in the macro call\n;   b. make sure subforms are evaluated only once by creating a variable in the\n;      expansion to hold the value of evaluating the argument form, and then\n;      using that variable anywhere else the value is needed in the expansion\n;   c. use `gensym` at macro expansion time to create variable names used in the\n;      expansion\n;\n; Appendix I. Macro-writting macros, 'with-gensyms', to guranttee that rule c\n; gets observed.\n; Example usage of `with-gensyms`\n(defmacro do-primes-a ((var start end) &body body)\n  \"do-primes implementation with macro-writting macro 'with-gensyms'\"\n  (with-gensyms (end-value-name)\n    `(do ((,var (next-prime (- ,start 1)) (next-prime ,var))\n          (,end-value-name ,end))\n         ((> ,var ,end-value-name))\n      ,@body)))\n; Define the macro, note how comma is used to interpolate the value of the loop\n; expression\n(defmacro with-gensyms ((&rest names) &body body)\n  `(let ,(loop for n in names collect `(,n (gensym)))\n    ,@body)\n)"
  },
  {
    "path": "src/test/resources/samples/langs/Common Lisp/motor-inferencia.cl",
    "content": "#|\r\nESCUELA POLITECNICA SUPERIOR - UNIVERSIDAD AUTONOMA DE MADRID\r\nINTELIGENCIA ARTIFICIAL\r\n\r\nMotor de inferencia\r\nBasado en parte en \"Paradigms of AI Programming: Case Studies\r\nin Common Lisp\", de Peter Norvig, 1992\r\n|#\r\n\r\n\r\n;;;;;;;;;;;;;;;;;;;;;\r\n;;;; Global variables\r\n;;;;;;;;;;;;;;;;;;;;;\r\n\r\n\r\n(defvar *hypothesis-list*)\r\n(defvar *rule-list*)\r\n(defvar *fact-list*)\r\n\r\n;;;;;;;;;;;;;;;;;;;;;\r\n;;;; Constants\r\n;;;;;;;;;;;;;;;;;;;;;\r\n\r\n(defconstant +fail+ nil \"Indicates unification failure\")\r\n\r\n(defconstant +no-bindings+ '((nil))\r\n  \"Indicates unification success, with no variables.\")\r\n\r\n(defconstant *mundo-abierto* nil)\r\n\r\n\r\n\r\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\r\n;;;; Functions for the user\r\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\r\n\r\n\r\n;; Resets *fact-list* to NIL\r\n(defun erase-facts () (setq *fact-list* nil))\r\n\r\n(defun set-hypothesis-list (h) (setq *hypothesis-list* h))\r\n\r\n\r\n;; Returns a list of solutions, each one satisfying all the hypothesis contained\r\n;; in *hypothesis-list*\r\n(defun motor-inferencia ()\r\n  (consulta *hypothesis-list*))\r\n\r\n\r\n\r\n;;;;;;;;;;;;;;;;;;;;;;;;\r\n;;;; Auxiliary functions\r\n;;;;;;;;;;;;;;;;;;;;;;;;\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: CONSULTA\r\n\r\nCOMMENTS:\r\nCONSULTA receives a list of hypothesis (variable <hypotheses>), and returns\r\na list of binding lists (each binding list being a solution).\r\n\r\nEXAMPLES:\r\nhypotheses is:\r\n((brothers ?x ?y) (neighbours juan ?x)).\r\n\r\nThat is, we are searching the brothers of the possible neighbors of Juan.\r\n\r\nThe function can return in this case:\r\n \r\n(((?x . sergio) (?y . javier)) ((?x . julian) (?y . mario)) ((?x . julian) (?y . pedro))).\r\nThat is, the neighbors of Juan (Sergio and Julian) have 3 brothers in total(Javier, Mario, Pedro)\r\n____________________________________________________________________________|#\r\n\r\n(defun consulta (hypotheses)\r\n  (if (null hypotheses) (list +no-bindings+)\r\n    (mapcan #'(lambda (b)\r\n                (mapcar #'(lambda (x) (une-bindings-con-bindings b x))\r\n                  (consulta (subst-bindings b (rest hypotheses)))))\r\n      (find-hypothesis-value (first hypotheses)))))\r\n\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: FIND-HYPOTHESIS-VALUE\r\n\r\nCOMMENTS:\r\nThis function manages the query a single query (only one hypothesis) given a binding list.\r\nIt tries (in the following order) to:\r\n- Answer the query from *fact-list*\r\n- Answer the query from the rules in *rule-list*\r\n- Ask the user\r\n\r\nThe function returns a list of solutions (list of binding lists).\r\n\r\nEXAMPLES:\r\nIf hypothesis is (brothers ?x ?y)\r\nand the function returns:\r\n(((?x . sergio) (?y . javier)) ((?x . julian) (?y . maria)) ((?x . alberto) (?y . pedro))).\r\n\r\nMeans that Sergio and Javier and brothers, Julian and Mario are brothers, and Alberto and Pedro are brothers.\r\n____________________________________________________________________________|#\r\n\r\n(defun find-hypothesis-value (hypothesis)\r\n  (let (rules)\r\n   (cond\r\n    ((equality? hypothesis) \r\n     (value-from-equality hypothesis))\r\n    ((value-from-facts hypothesis))\r\n    ((setq good-rules (find-rules hypothesis)) \r\n     (value-from-rules hypothesis good-rules))\r\n    (t (ask-user hypothesis)))))\r\n\r\n\r\n\r\n; une-bindings-con-bindings takes two binding lists and returns a binding list\r\n; Assumes that b1 and b2 are not +fail+\r\n(defun une-bindings-con-bindings (b1 b2)\r\n  (cond\r\n   ((equal b1 +no-bindings+) b2)\r\n   ((equal b2 +no-bindings+) b1)\r\n   (T (append b1 b2))))\r\n\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: VALUE-FROM-FACTS\r\n\r\nCOMMENTS:\r\nReturns all the solutions of <hypothesis> obtained directly from *fact-list*\r\n\r\nEXAMPLES:\r\n> (setf *fact-list* '((man luis) (man pedro)(woman mart)(man daniel)(woman laura)))\r\n\r\n> (value-from-facts '(man ?x))\r\nreturns:\r\n\r\n(((?X . LUIS)) ((?X . PEDRO)) ((?X . DANIEL)))\r\n____________________________________________________________________________|#\r\n\r\n(defun value-from-facts (hypothesis)\r\n  (mapcan #'(lambda(x) (let ((aux (unify hypothesis x)))\r\n                         (when aux (list aux)))) *fact-list*))\r\n\r\n\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: FIND-RULES\r\n\r\nCOMMENTS:\r\nReturns the rules in *rule-list* whose THENs unify with the term given in <hypothesis>\r\nThe variables in the rules that satisfy this requirement are renamed.\r\n\r\nEXAMPLES:\r\n> (setq *rule-list*\r\n      '((R1 (pertenece ?E (?E . ?_)))\r\n        (R2 (pertenece ?E (?_ . ?Xs)) :- ((pertenece ?E ?Xs)))))\r\n\r\nThen:\r\n> (FIND-RULES (PERTENECE 1 (2 5)))\r\nreturns:\r\n((R2 (PERTENECE ?E.1 (?_ . ?XS.2)) :- ((PERTENECE ?E.1 ?XS.2))))\r\nThat is, only the THEN of rule R2 unify with <hypothesis>\r\n\r\nHowever,\r\n> (FIND-RULES (PERTENECE 1 (1 6 7)))\r\n\r\nreturns:\r\n((R1 (PERTENECE ?E.6 (?E.6 . ?_)))\r\n (R2 (PERTENECE ?E.7 (?_ . ?XS.8)) :- ((PERTENECE ?E.7 ?XS.8))))\r\nSo the THEN of both rules unify with <hypothesis>\r\n____________________________________________________________________________|#\r\n\r\n(defun find-rules (hypothesis)\r\n  (mapcan #'(lambda(b) (let ((renamed-rule (rename-variables b)))\r\n                         (when (in-then? hypothesis renamed-rule)\r\n                           (list renamed-rule)))) *rule-list*))\r\n\r\n(defun in-then? (hypothesis rule)\r\n  (unless (null (rule-then rule))\r\n    (not (equal +fail+ (unify hypothesis (rule-then rule))))))\r\n\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: VALUE-FROM-RULES\r\n\r\nCOMMENTS:\r\nReturns all the solutions to <hypothesis> found using all the rules given in\r\nthe list <rules>. Note that a single rule can have multiple solutions.\r\n____________________________________________________________________________|#\r\n(defun value-from-rules (hypothesis rules)\r\n  (mapcan #'(lambda (r) (eval-rule hypothesis r)) rules))\r\n\r\n(defun limpia-vinculos (termino bindings)\r\n  (unify termino (subst-bindings bindings termino)))\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: EVAL-RULE\r\n\r\nCOMMENTS:\r\nReturns all the solutions found using the rule given as input argument.\r\n\r\nEXAMPLES:\r\n> (setq *rule-list*\r\n      '((R1 (pertenece ?E (?E . ?_)))\r\n        (R2 (pertenece ?E (?_ . ?Xs)) :- ((pertenece ?E ?Xs)))))\r\nThen:\r\n> (EVAL-RULE \r\n   (PERTENECE 1 (1 6 7)) \r\n   (R1 (PERTENECE ?E.42 (?E.42 . ?_))))\r\nreturns:\r\n(((NIL)))\r\nThat is, the query (PERTENECE 1 (1 6 7)) can be proven from the given rule, and\r\nno binding in the variables in the query is necessary (in fact, the query has no variables).\r\nOn the other hand:\r\n> (EVAL-RULE \r\n   (PERTENECE 1 (7)) \r\n   (R2 (PERTENECE ?E.49 (?_ . ?XS.50)) :- ((PERTENECE ?E.49 ?XS.50))))\r\nreturns:\r\nNIL\r\nThat is, the query can not be proven from the rule R2.\r\n____________________________________________________________________________|#\r\n\r\n(defun eval-rule (hypothesis rule)\r\n  (let ((bindings-then \r\n          (unify (rule-then rule) hypothesis)))\r\n    (unless (equal +fail+ bindings-then)\r\n      (if (rule-ifs rule)\r\n          (mapcar #'(lambda(b) (limpia-vinculos hypothesis (append bindings-then b)))\r\n            (consulta (subst-bindings bindings-then (rule-ifs rule))))\r\n        (list (limpia-vinculos hypothesis bindings-then))))))\r\n\r\n\r\n(defun ask-user (hypothesis)\r\n  (let ((question hypothesis))\r\n    (cond\r\n     ((variables-in question) +fail+)\r\n     ((not-in-fact-list? question) +fail+)\r\n     (*mundo-abierto*\r\n      (format t \"~%Es cierto el hecho ~S? (T/nil)\" question)\r\n      (cond\r\n       ((read) (add-fact question) +no-bindings+)\r\n       (T (add-fact (list 'NOT question)) +fail+)))\r\n     (T +fail+))))\r\n\r\n\r\n; value-from-equality:\r\n(defun value-from-equality (hypothesis)\r\n  (let ((new-bindings (unify (second hypothesis) (third hypothesis))))\r\n    (if (not (equal +fail+ new-bindings)) \r\n\t(list new-bindings))))\r\n\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: UNIFY\r\n\r\nCOMMENTS:\r\nFinds the most general unifier of two input expressions, taking into account the\r\nbindings specified in the input <bingings>\r\nIn case the two expressions can unify, the function returns the total bindings necessary\r\nfor that unification. Otherwise, returns +fail+\r\n\r\nEXAMPLES:\r\n> (unify '1 '1)\r\n((NIL)) ;; which is the constant +no-bindings+\r\n> (unify 1 '2)\r\nnil     ;; which is the constant +fail+\r\n> (unify '?x 1)\r\n((?x . 1))\r\n> (unify '(1 1) ?x)\r\n((? x 1 1))\r\n> (unify '?_ '?x)\r\n((NIL))\r\n> (unify '(p ?x 1 2) '(p ?y ?_ ?_))\r\n((?x . ?y))\r\n> (unify '(?a . ?_) '(1 2 3)) \r\n((?a . 1)) \r\n> (unify '(?_ ?_) '(1 2))\r\n((nil))\r\n> (unify '(?a . ?b) '(1 2 3)) \r\n((?b 2 3) (?a . 1)) \r\n> (unify '(?a . ?b) '(?v . ?d)) \r\n((?b . ?d) (?a . ?v)) \r\n> (unify '(?eval (+ 1 1)) '1) \r\nnil\r\n> (unify '(?eval (+ 1 1)) '2) \r\n(nil)) \r\n____________________________________________________________________________|#\r\n\r\n(defun unify (x y &optional (bindings +no-bindings+))\r\n  \"See if x and y match with given bindings.  If they do,\r\n  return a binding list that would make them equal [p 303].\"\r\n  (cond ((eq bindings +fail+) +fail+)\r\n        ((eql x y) bindings)\r\n        ((eval? x) (unify-eval x y bindings))\r\n        ((eval? y) (unify-eval y x bindings))\r\n        ((variable? x) (unify-var x y bindings))\r\n        ((variable? y) (unify-var y x bindings))\r\n        ((and (consp x) (consp y))\r\n         (unify (rest x) (rest y) \r\n                (unify (first x) (first y) bindings)))\r\n        (t +fail+)))\r\n\r\n\r\n;; rename-variables: renombra ?X por ?X.1, ?Y por ?Y.2 etc. salvo ?_ que no se renombra\r\n(defun rename-variables (x)\r\n  \"Replace all variables in x with new ones. Excepto ?_\"\r\n  (sublis (mapcar #'(lambda (var) \r\n\t\t      (if (anonymous-var? var)\r\n\t\t\t  (make-binding var var)\r\n\t\t\t(make-binding var (new-variable var))))\r\n\t\t  (variables-in x))\r\n\t  x))\r\n\r\n\r\n\r\n;;;; Auxiliary Functions\r\n\r\n(defun unify-var (var x bindings)\r\n  \"Unify var with x, using (and maybe extending) bindings [p 303].\"\r\n  (cond ((or (anonymous-var? var)(anonymous-var? x)) bindings)\r\n\t((get-binding var bindings)\r\n\t (unify (lookup var bindings) x bindings))\r\n\t((and (variable? x) (get-binding x bindings))\r\n\t (unify var (lookup x bindings) bindings))\r\n\t((occurs-in? var x bindings)\r\n\t +fail+)\r\n\t(t (extend-bindings var x bindings))))\r\n\r\n(defun variable? (x)\r\n  \"Is x a variable (a symbol starting with ?)?\"\r\n  (and (symbolp x) (eql (char (symbol-name x) 0) #\\?)))\r\n\r\n(defun get-binding (var bindings)\r\n  \"Find a (variable . value) pair in a binding list.\"\r\n  (assoc var bindings))\r\n\r\n(defun binding-var (binding)\r\n  \"Get the variable part of a single binding.\"\r\n  (car binding))\r\n\r\n(defun binding-val (binding)\r\n  \"Get the value part of a single binding.\"\r\n  (cdr binding))\r\n\r\n(defun make-binding (var val) (cons var val))\r\n\r\n(defun lookup (var bindings)\r\n  \"Get the value part (for var) from a binding list.\"\r\n  (binding-val (get-binding var bindings)))\r\n\r\n(defun extend-bindings (var val bindings)\r\n  \"Add a (var . value) pair to a binding list.\"\r\n  (append \r\n   (unless (eq bindings +no-bindings+) bindings)\r\n   (list (make-binding var val))))\r\n\r\n(defun occurs-in? (var x bindings)\r\n  \"Does var occur anywhere inside x?\"\r\n  (cond ((eq var x) t)\r\n        ((and (variable? x) (get-binding x bindings))\r\n         (occurs-in? var (lookup x bindings) bindings))\r\n        ((consp x) (or (occurs-in? var (first x) bindings)\r\n                       (occurs-in? var (rest x) bindings)))\r\n        (t nil)))\r\n\r\n(defun subst-bindings (bindings x)\r\n  \"Substitute the value of variables in bindings into x,\r\n  taking recursively bound variables into account.\"\r\n  (cond ((eq bindings +fail+) +fail+)\r\n        ((eq bindings +no-bindings+) x)\r\n        ((and (listp x) (eq '?eval (car x)))\r\n         (subst-bindings-quote bindings x))\r\n        ((and (variable? x) (get-binding x bindings))\r\n         (subst-bindings bindings (lookup x bindings)))\r\n        ((atom x) x)\r\n        (t (cons (subst-bindings bindings (car x)) ;; s/reuse-cons/cons\r\n\t\t (subst-bindings bindings (cdr x))))))\r\n\r\n(defun unifier (x y)\r\n \"Return something that unifies with both x and y (or fail).\"\r\n (subst-bindings (unify x y) x))\r\n\r\n(defun variables-in (exp)\r\n  \"Return a list of all the variables in EXP.\"\r\n  (unique-find-anywhere-if #'variable? exp))\r\n\r\n(defun unique-find-anywhere-if (predicate tree &optional found-so-far)\r\n  \"Return a list of leaves of tree satisfying predicate,\r\n  with duplicates removed.\"\r\n  (if (atom tree)\r\n      (if (funcall predicate tree)\r\n          (pushnew tree found-so-far)\r\n          found-so-far)\r\n    (unique-find-anywhere-if\r\n        predicate\r\n        (first tree)\r\n        (unique-find-anywhere-if predicate (rest tree)\r\n                                 found-so-far))))\r\n\r\n(defun find-anywhere-if (predicate tree)\r\n  \"Does predicate apply to any atom in the tree?\"  \r\n  (if (atom tree)\r\n      (funcall predicate tree)\r\n      (or (find-anywhere-if predicate (first tree))\r\n          (find-anywhere-if predicate (rest tree)))))\r\n\r\n(defun new-variable (var)\r\n  \"Create a new variable.  Assumes user never types variables of form ?X.9\"\r\n  (gentemp (format nil \"~S.\" var)))\r\n;  (gentemp \"?\") )\r\n;;;\r\n\r\n(defun anonymous-var? (x)\r\n  (eq x '?_))\r\n\r\n(defun subst-bindings-quote (bindings x)\r\n  \"Substitute the value of variables in bindings into x,\r\n  taking recursively bound variables into account.\"\r\n  (cond ((eq bindings +fail+) +fail+)\r\n        ((eq bindings +no-bindings+) x)\r\n        ((and (variable? x) (get-binding x bindings))\r\n         (if (variable? (lookup x bindings))\r\n             (subst-bindings-quote bindings (lookup x bindings))\r\n             (subst-bindings-quote bindings (list 'quote (lookup x bindings)))\r\n         )\r\n        )     \r\n        ((atom x) x)\r\n        (t (cons (subst-bindings-quote bindings (car x)) ;; s/reuse-cons/cons\r\n\t\t (subst-bindings-quote bindings (cdr x))))))\r\n\r\n(defun eval? (x)\r\n  (and (consp x) (eq (first x) '?eval)))\r\n\r\n(defun unify-eval (x y bindings)\r\n  (let ((exp (subst-bindings-quote bindings (second x))))\r\n    (if (variables-in exp)\r\n\t+fail+\r\n      (unify (eval exp) y bindings))))\r\n\r\n\r\n\r\n(defun rule-ifs (rule) (fourth rule))\r\n(defun rule-then (rule) (second rule))\r\n\r\n\r\n(defun equality? (term)\r\n  (and (consp term) (eql (first term) '?=)))\r\n\r\n\r\n(defun in-fact-list? (expresion)\r\n  (some #'(lambda(x) (equal x expresion)) *fact-list*))\r\n                     \r\n(defun not-in-fact-list? (expresion)\r\n  (if (eq (car expresion) 'NOT)\r\n      (in-fact-list? (second expresion))\r\n    (in-fact-list? (list 'NOT expresion))))\r\n\r\n\r\n;; add-fact:\r\n\r\n(defun add-fact (fact)\r\n  (setq *fact-list* (cons fact *fact-list*)))\r\n\r\n\r\n(defun variable? (x)\r\n  \"Is x a variable (a symbol starting with ?) except ?eval and ?=\"\r\n  (and (not (equal x '?eval)) (not (equal x '?=)) \r\n       (symbolp x) (eql (char (symbol-name x) 0) #\\?)))\r\n\r\n\r\n;; EOF"
  },
  {
    "path": "src/test/resources/samples/langs/Common Lisp/rss.sexp",
    "content": "\n(:TURTLE\n\n (:@PREFIX \"rdf:\" \"<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\")\n (:@PREFIX \"owl:\" \"<http://www.w3.org/2002/07/owl#>\")\n (:@PREFIX \"dc:\" \"<http://purl.org/dc/elements/1.1/>\")\n (:@PREFIX \"xsd:\" \"<http://www.w3.org/2001/XMLSchema#>\")\n (:@PREFIX \"rdfs:\" \"<http://www.w3.org/2000/01/rdf-schema#>\")\n\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/channel>\")\n \n   (:PREDICATE-OBJECT-LIST\n     (:URIREF #1=\"<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>\")\n     (:OBJECTS\n       (:QNAME \"rdfs:Class\")))\n       \n   (:PREDICATE-OBJECT-LIST\n     (:QNAME \"rdfs:comment\")\n     (:OBJECTS\n       (:STRING \"An RSS information channel.\")))\n       \n   (:PREDICATE-OBJECT-LIST\n     (:QNAME \"rdfs:isDefinedBy\")\n     (:OBJECTS\n       (:URIREF \"<http://purl.org/rss/1.0/>\")))\n       \n   (:PREDICATE-OBJECT-LIST\n     (:QNAME \"rdfs:label\")\n     (:OBJECTS\n       (:STRING \"Channel\"))))\n       \n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/description>\")\n  \n   (:PREDICATE-OBJECT-LIST\n     (:URIREF #1#)\n     (:OBJECTS\n       (:QNAME \"rdf:Property\")))\n      \n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS (:STRING \"A short text description of the subject.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Description\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:subPropertyOf\") (:OBJECTS (:QNAME \"dc:description\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/image>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdfs:Class\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\") (:OBJECTS (:STRING \"An RSS image.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Image\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/item>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdfs:Class\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\") (:OBJECTS (:STRING \"An RSS item.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Item\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/items>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdf:Property\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS\n    (:STRING \"Points to a list of rss:item elements that are members of the subject channel.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Items\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/link>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdf:Property\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS (:STRING \"The URL to which an HTML rendering of the subject will link.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Link\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:subPropertyOf\") (:OBJECTS (:QNAME \"dc:identifier\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/name>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdf:Property\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS (:STRING \"The text input field's (variable) name.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Name\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/textinput>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdfs:Class\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\") (:OBJECTS (:STRING \"An RSS text input.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Text Input\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/title>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdf:Property\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS (:STRING \"A descriptive title for the channel.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Title\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:subPropertyOf\") (:OBJECTS (:QNAME \"dc:title\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/url>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdf:Property\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS\n    (:STRING\n     \"The URL of the image to used in the 'src' attribute of the channel's image tag when rendered as HTML.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"URL\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:subPropertyOf\") (:OBJECTS (:QNAME \"dc:identifier\")))))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Common Lisp/sample.lisp",
    "content": ";;;; -*- lisp -*-\n\n(in-package :foo)\n\n;;; Header comment.\n(defvar *foo*)\n\n(eval-when (:execute :compile-toplevel :load-toplevel)\n  (defun add (x &optional y &key z)\n    (declare (ignore z))\n    ;; Inline comment.\n    (+ x (or y 1))))\n\n#|\nMulti-line comment.\n|#\n\n(defmacro foo (x &body b)\n  (if x\n      `(1+ ,x)   ;After-line comment.\n      42))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Common Lisp/sample.lsp",
    "content": ";;;; -*- lisp -*-\n\n(in-package :foo)\n\n;;; Header comment.\n(defvar *foo*)\n\n(eval-when (:execute :compile-toplevel :load-toplevel)\n  (defun add (x &optional y &key z)\n    (declare (ignore z))\n    ;; Inline comment.\n    (+ x (or y 1))))\n\n#|\nMulti-line comment.\n|#\n\n(defmacro foo (x &body b)\n  (if x\n      `(1+ ,x)   ;After-line comment.\n      42))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Common Workflow Language/trunk-peak-score.cwl",
    "content": "#!/usr/bin/env cwl-runner\n# Originally from\n# https://github.com/Duke-GCB/GGR-cwl/blob/54e897263a702ff1074c8ac814b4bf7205d140dd/utils/trunk-peak-score.cwl\n# Released under the MIT License:\n# https://github.com/Duke-GCB/GGR-cwl/blob/54e897263a702ff1074c8ac814b4bf7205d140dd/LICENSE\n# Converted to CWL v1.0 syntax using\n# https://github.com/common-workflow-language/cwl-upgrader\n# and polished by Michael R. Crusoe <mrc@commonwl.org>\n# All modifications also released under the MIT License\ncwlVersion: v1.0\nclass: CommandLineTool\ndoc: Trunk scores in ENCODE bed6+4 files\n\nhints:\n  DockerRequirement:\n    dockerPull: dukegcb/workflow-utils\n\ninputs:\n  peaks:\n    type: File\n  sep:\n    type: string\n    default: \\t\n\noutputs:\n  trunked_scores_peaks:\n    type: stdout\n\nbaseCommand: awk\n\narguments:\n- -F $(inputs.sep)\n- BEGIN{OFS=FS}$5>1000{$5=1000}{print}\n- $(inputs.peaks.path)\n\nstdout: $(inputs.peaks.nameroot).trunked_scores$(inputs.peaks.nameext)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Component Pascal/Example.cp",
    "content": "MODULE ObxControls;\n(**\n    project         = \"BlackBox\"\n    organization    = \"www.oberon.ch\"\n    contributors    = \"Oberon microsystems\"\n    version         = \"System/Rsrc/About\"\n    copyright       = \"System/Rsrc/About\"\n    license         = \"Docu/BB-License\"\n    changes         = \"\"\n    issues          = \"\"\n\n**)\n\nIMPORT Dialog, Ports, Properties, Views;\n\nCONST beginner = 0; advanced = 1; expert = 2; guru = 3;    (* user classes *)\n\nTYPE\n    View = POINTER TO RECORD (Views.View)\n        size: INTEGER    (* border size in mm *)\n    END;\n\nVAR\n    data*: RECORD\n        class*: INTEGER;    (* current user class *)\n        list*: Dialog.List;    (* list of currently available sizes, derived from class *)\n        width*: INTEGER    (* width of next view to be opened. Derived from\n                                    class, or entered through a text entry field *)\n    END;\n\n    predef: ARRAY 6 OF INTEGER;    (* table of predefined sizes *)\n\n\nPROCEDURE SetList;\nBEGIN\n    IF data.class = beginner THEN\n        data.list.SetLen(1);\n        data.list.SetItem(0, \"default\")\n    ELSIF data.class = advanced THEN\n        data.list.SetLen(4);\n        data.list.SetItem(0, \"default\");\n        data.list.SetItem(1, \"small\");\n        data.list.SetItem(2, \"medium\");\n        data.list.SetItem(3, \"large\");\n    ELSE\n        data.list.SetLen(6);\n        data.list.SetItem(0, \"default\");\n        data.list.SetItem(1, \"small\");\n        data.list.SetItem(2, \"medium\");\n        data.list.SetItem(3, \"large\");\n        data.list.SetItem(4, \"tiny\");\n        data.list.SetItem(5, \"huge\");\n    END\nEND SetList;\n\n(* View *)\n\nPROCEDURE (v: View) CopyFromSimpleView (source: Views.View);\nBEGIN\n    v.size := source(View).size\nEND CopyFromSimpleView;\n\nPROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);\nBEGIN    (* fill view with a red square of size v.size *)\n    IF v.size = 0 THEN v.size := predef[0] END;    (* lazy initialization of size *)\n    f.DrawRect(0, 0, v.size, v.size, Ports.fill, Ports.red)\nEND Restore;\n\nPROCEDURE (v: View) HandlePropMsg (VAR msg: Views.PropMessage);\nBEGIN\n    WITH msg: Properties.SizePref DO\n        IF v.size = 0 THEN v.size := predef[0] END;    (* lazy initialization of size *)\n        msg.w := v.size; msg.h := v.size    (* tell environment about desired width and height *)\n    ELSE    (* ignore other messages *)\n    END\nEND HandlePropMsg;\n\n(* notifiers *)\n\nPROCEDURE ClassNotify* (op, from, to: INTEGER);\nBEGIN    (* react to change in data.class *)\n    IF op = Dialog.changed THEN\n        IF (to = beginner) OR (to = advanced) & (data.list.index > 3) THEN\n            (* if class is reduced, make sure that selection contains legal elements *)\n            data.list.index := 0; data.width := predef[0];    (* modify interactor *)\n            Dialog.Update(data)    (* redraw controls where necessary *)\n        END;\n        SetList;\n        Dialog.UpdateList(data.list)    (* reconstruct list box contents *)\n    END\nEND ClassNotify;\n\nPROCEDURE ListNotify* (op, from, to: INTEGER);\nBEGIN    (* reacto to change in data.list (index to was selected) *)\n    IF op = Dialog.changed THEN\n        data.width := predef[to];    (* modify interactor *)\n        Dialog.Update(data)    (* redraw controls where necessary *)\n    END\nEND ListNotify;\n\n(* guards *)\n\nPROCEDURE ListGuard* (VAR par: Dialog.Par);\nBEGIN    (* disable list box for a beginner *)\n    par.disabled := data.class = beginner\nEND ListGuard;\n\nPROCEDURE WidthGuard* (VAR par: Dialog.Par);\nBEGIN    (* make text entry field read-only if user is not guru *)\n    par.readOnly := data.class # guru\nEND WidthGuard;\n\n(* commands *)\n\nPROCEDURE Open*;\n    VAR v: View;\nBEGIN\n    NEW(v);    (* create and initialize a new view *)\n    v.size := data.width * Ports.mm;    (* define view's size in function of class *)\n    Views.OpenAux(v, \"Example\")    (* open the view in a window *)\nEND Open;\n\nBEGIN    (* initialization of global variables *)\n    predef[0] := 40; predef[1] := 30; predef[2] := 50;    (* predefined sizes *)\n    predef[3] := 70; predef[4] := 20; predef[5] := 100;\n    data.class := beginner;    (* default values *)\n    data.list.index := 0;\n    data.width := predef[0];\n    SetList\nEND ObxControls.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Component Pascal/Example2.cps",
    "content": "MODULE ObxFact;\n(**\n    project         = \"BlackBox\"\n    organization    = \"www.oberon.ch\"\n    contributors    = \"Oberon microsystems\"\n    version         = \"System/Rsrc/About\"\n    copyright       = \"System/Rsrc/About\"\n    license         = \"Docu/BB-License\"\n    changes         = \"\"\n    issues          = \"\"\n\n**)\n\nIMPORT\n    Stores, Models, TextModels, TextControllers, Integers;\n\nPROCEDURE Read(r: TextModels.Reader; VAR x: Integers.Integer);\n    VAR i, len, beg: INTEGER; ch: CHAR; buf: POINTER TO ARRAY OF CHAR;\nBEGIN\n    r.ReadChar(ch);\n    WHILE ~r.eot & (ch <= \" \") DO r.ReadChar(ch) END;\n    ASSERT(~r.eot & (((ch >= \"0\") & (ch <= \"9\")) OR (ch = \"-\")));\n    beg := r.Pos() - 1; len := 0;\n    REPEAT INC(len); r.ReadChar(ch) UNTIL r.eot OR (ch < \"0\") OR (ch > \"9\");\n    NEW(buf, len + 1);\n    i := 0; r.SetPos(beg);\n    REPEAT r.ReadChar(buf[i]); INC(i) UNTIL i = len;\n    buf[i] := 0X;\n    Integers.ConvertFromString(buf^, x)\nEND Read;\n\nPROCEDURE Write(w: TextModels.Writer; x: Integers.Integer);\n    VAR i: INTEGER;\nBEGIN\n    IF Integers.Sign(x) < 0 THEN w.WriteChar(\"-\") END;\n    i := Integers.Digits10Of(x);\n    IF i # 0 THEN\n        REPEAT DEC(i); w.WriteChar(Integers.ThisDigit10(x, i)) UNTIL i = 0\n    ELSE w.WriteChar(\"0\")\n    END\nEND Write;\n\nPROCEDURE Compute*;\n    VAR beg, end, i, n: INTEGER; ch: CHAR;\n        s: Stores.Operation;\n        r: TextModels.Reader; w: TextModels.Writer; attr: TextModels.Attributes;\n        c: TextControllers.Controller;\n        x: Integers.Integer;\nBEGIN\n    c := TextControllers.Focus();\n    IF (c # NIL) & c.HasSelection() THEN\n        c.GetSelection(beg, end);\n        r := c.text.NewReader(NIL); r.SetPos(beg); r.ReadChar(ch);\n        WHILE ~r.eot & (beg < end) & (ch <= \" \") DO r.ReadChar(ch); INC(beg) END;\n        IF ~r.eot & (beg < end) THEN\n            r.ReadPrev; Read(r, x);\n            end := r.Pos(); r.ReadPrev; attr :=r.attr;\n            IF (Integers.Sign(x) > 0) & (Integers.Compare(x, Integers.Long(MAX(LONGINT))) <= 0) THEN\n                n := SHORT(Integers.Short(x)); i := 2; x := Integers.Long(1);\n                WHILE i <= n DO x := Integers.Product(x, Integers.Long(i)); INC(i) END;\n                Models.BeginScript(c.text, \"computation\", s);\n                c.text.Delete(beg, end);\n                w := c.text.NewWriter(NIL); w.SetPos(beg); w.SetAttr(attr);\n                Write(w, x);\n                Models.EndScript(c.text, s)\n            END\n        END\n    END\nEND Compute;\n\nEND ObxFact."
  },
  {
    "path": "src/test/resources/samples/langs/Cool/list.cl",
    "content": "(* This simple example of a list class is adapted from an example in the\n   Cool distribution. *)\n\nclass List {\n   isNil() : Bool { true };\n   head()  : Int { { abort(); 0; } };\n   tail()  : List { { abort(); self; } };\n   cons(i : Int) : List {\n      (new Cons).init(i, self)\n   };\n};\n\nclass Cons inherits List {\n   car : Int;\t-- The element in this list cell\n   cdr : List;\t-- The rest of the list\n   isNil() : Bool { false };\n   head()  : Int { car };\n   tail()  : List { cdr };\n   init(i : Int, rest : List) : List {\n      {\n\t car <- i;\n\t cdr <- rest;\n\t self;\n      }\n   };\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/Cool/sample.cl",
    "content": "(* Refer to Alex Aiken, \"The Cool Reference Manual\":\n    http://theory.stanford.edu/~aiken/software/cool/cool-manual.pdf\n   for language specification.\n*)\n\n-- Exhibit various language constructs\nclass Sample {\n    testCondition(x: Int): Bool {\n        if x = 0\n        then false\n        else\n            if x < (1 + 2) * 3\n            then true\n            else false\n            fi\n        fi\n    };\n\n    testLoop(y: Int): Bool {\n        while y > 0 loop\n        {\n            if not condition(y)\n            then y <- y / 2\n            else y <- y - 1;\n        }\n        pool\n    };\n\n    testAssign(z: Int): Bool {\n        i : Int;\n        i <- ~z;\n    };\n\n    testCase(var: Sample): SELF_TYPE {\n        io : IO <- new IO;\n        case var of\n            a : A => io.out_string(\"Class type is A\\n\");\n            b : B => io.out_string(\"Class type is B\\n\");\n            s : Sample => io.out_string(\"Class type is Sample\\n\");\n            o : Object => io.out_string(\"Class type is object\\n\");\n        esac\n    };\n\n    testLet(i: Int): Int {\n        let (a: Int in\n            let(b: Int <- 3, c: Int <- 4 in\n                {\n                    a <- 2;\n                    a * b * 2 / c;\n                }\n            )\n        )\n    };\n};\n\n-- Used to test subclasses\nclass A inherits Sample {};\nclass B inherits A {};\n\nclass C {\n    main() : Int {\n        (new Sample).testLet(1)\n    };\n};\n\n-- \"Hello, world\" example\nclass Main inherits IO {\n    main(): SELF_TYPE {\n        out_string(\"Hello, World.\\n\")\n    };\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/Computation.v",
    "content": "(** The definition of computations, used to represent interactive programs. *)\nRequire Import Coq.NArith.NArith.\nRequire Import ListString.All.\n\nLocal Open Scope type.\n\n(** System calls. *)\nModule Command.\n  Inductive t :=\n  | AskCard\n  | AskPIN\n  | CheckPIN (pin : N)\n  | AskAmount\n  | CheckAmount (amount : N)\n  | GiveCard\n  | GiveAmount (amount : N)\n  | ShowError (message : LString.t).\n\n  (** The type of an answer for a command depends on the value of the command. *)\n  Definition answer (command : t) : Type :=\n    match command with\n    | AskCard => bool (* If the given card seems valid. *)\n    | AskPIN => option N (* A number or cancellation. *)\n    | CheckPIN _ => bool (* If the PIN number is valid. *)\n    | AskAmount => option N (* A number or cancellation. *)\n    | CheckAmount _ => bool (* If the amount can be withdrawn. *)\n    | GiveCard => bool (* If the card was given. *)\n    | GiveAmount _ => bool (* If the money was given. *)\n    | ShowError _ => unit (* Show an error message. *)\n    end.\nEnd Command.\n\n(** Computations with I/Os. *)\nModule C.\n  (** A computation can either does nothing, or do a system call and wait\n      for the answer to run another computation. *)\n  Inductive t : Type :=\n  | Ret : t\n  | Call : forall (command : Command.t), (Command.answer command -> t) -> t.\n  Arguments Ret.\n  Arguments Call _ _.\n\n  (** Some optional notations. *)\n  Module Notations.\n    (** A nicer notation for `Ret`. *)\n    Definition ret : t :=\n      Ret.\n\n    (** We define an explicit apply function so that Coq does not try to expand\n        the notations everywhere. *)\n    Definition apply {A B} (f : A -> B) (x : A) := f x.\n\n    (** System call. *)\n    Notation \"'call!' answer ':=' command 'in' X\" :=\n      (Call command (fun answer => X))\n      (at level 200, answer ident, command at level 100, X at level 200).\n\n    (** System call with typed answer. *)\n    Notation \"'call!' answer : A ':=' command 'in' X\" :=\n      (Call command (fun (answer : A) => X))\n      (at level 200, answer ident, command at level 100, A at level 200, X at level 200).\n\n    (** System call ignoring the answer. *)\n    Notation \"'do_call!' command 'in' X\" :=\n      (Call command (fun _ => X))\n      (at level 200, command at level 100, X at level 200).\n\n    (** This notation is useful to compose computations which wait for a\n        continuation. We do not have an explicit bind operator to simplify the\n        language and the proofs. *)\n    Notation \"'let!' x ':=' X 'in' Y\" :=\n      (apply X (fun x => Y))\n      (at level 200, x ident, X at level 100, Y at level 200).\n\n    (** Let with a typed answer. *)\n    Notation \"'let!' x : A ':=' X 'in' Y\" :=\n      (apply X (fun (x : A) => Y))\n      (at level 200, x ident, X at level 100, A at level 200, Y at level 200).\n\n    (** Let ignoring the answer. *)\n    Notation \"'do!' X 'in' Y\" :=\n      (apply X (fun _ => Y))\n      (at level 200, X at level 100, Y at level 200).\n  End Notations.\nEnd C.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/Imp.v",
    "content": "\nRequire Export SfLib.\n\nModule AExp.\n\nInductive aexp : Type :=\n\t| ANum : nat -> aexp\n\t| APlus : aexp -> aexp -> aexp\n\t| AMinus : aexp -> aexp -> aexp\n\t| AMult : aexp -> aexp -> aexp.\n\nInductive bexp : Type :=\n\t| BTrue : bexp\n\t| BFalse : bexp\n\t| BEq : aexp -> aexp -> bexp\n\t| BLe : aexp -> aexp -> bexp\n\t| BNot : bexp -> bexp\n\t| BAnd : bexp -> bexp -> bexp.\n\nFixpoint aeval (e: aexp) : nat :=\n\tmatch e with\n\t\t| ANum n => n\n\t\t| APlus a1 a2 => (aeval a1) + (aeval a2)\n\t\t| AMinus a1 a2 => (aeval a1) - (aeval a2)\n\t\t| AMult a1 a2 => (aeval a1) * (aeval a2)\n\tend.\n\nExample test_aeval1:\n\taeval (APlus (ANum 2) (ANum 2)) = 4.\nProof. reflexivity. Qed.\n\nFixpoint beval (e: bexp) : bool :=\n\tmatch e with\n\t\t| BTrue => true\n\t\t| BFalse => false\n\t\t| BEq a1 a2 => beq_nat (aeval a1) (aeval a2)\n\t\t| BLe a1 a2 => ble_nat (aeval a1) (aeval a2)\n\t\t| BNot b1 => negb (beval b1)\n\t\t| BAnd b1 b2 => andb (beval b1) (beval b2)\n\tend.\n\nFixpoint optimize_0plus (a:aexp) : aexp :=\n\tmatch a with\n\t\t| ANum n => ANum n\n\t\t| APlus (ANum 0) e2 => optimize_0plus e2\n\t\t| APlus e1 e2 => APlus (optimize_0plus e1) (optimize_0plus e2)\n\t\t| AMinus e1 e2 => AMinus (optimize_0plus e1) (optimize_0plus e2)\n\t\t| AMult e1 e2 => AMult (optimize_0plus e1) (optimize_0plus e2)\n\tend.\n\nExample test_optimize_0plus: \n  optimize_0plus (APlus (ANum 2) \n\t\t\t(APlus (ANum 0) \n\t\t\t (APlus (ANum 0) (ANum 1)))) =\n\tAPlus (ANum 2) (ANum 1).\nProof. reflexivity. Qed.\n\nTheorem optimize_0plus_sound: forall e,\n\taeval (optimize_0plus e) = aeval e.\nProof.\nintros e. induction e.\n  Case \"ANum\". reflexivity.\n  Case \"APlus\". destruct e1.\n    SCase \"e1 = ANum n\". destruct n.\n      SSCase \"n = 0\". simpl. apply IHe2.\n      SSCase \"n <> 0\". simpl. rewrite IHe2. reflexivity.\n    SCase \"e1 = APlus e1_1 e1_2\".\n      simpl. simpl in IHe1. rewrite IHe1. rewrite IHe2. reflexivity.\n    SCase \"e1 = AMinus e1_1 e1_2\".\n      simpl. simpl in IHe1. rewrite IHe1. rewrite IHe2. reflexivity.\n    SCase \"e1 = AMult e1_1 e1_2\".\n      simpl. simpl in IHe1. rewrite IHe1. rewrite IHe2. reflexivity.\n  Case \"AMinus\".\n    simpl. rewrite IHe1. rewrite IHe2. reflexivity.\n  Case \"AMult\".\n    simpl. rewrite IHe1. rewrite IHe2. reflexivity. Qed.\n\nTheorem optimize_0plus_sound': forall e,\n\taeval (optimize_0plus e) = aeval e.\nProof.\n\tintros e.\n\tinduction e;\n\t\ttry (simpl; rewrite IHe1; rewrite IHe2; reflexivity).\n\tCase \"ANum\". reflexivity.\n\tCase \"APlus\".\n\t\tdestruct e1;\n\t\ttry (simpl; simpl in IHe1; rewrite IHe1; rewrite IHe2; reflexivity).\n\t\tSCase \"e1 = ANum n\". destruct n;\n\t\t\tsimpl; rewrite IHe2; reflexivity. Qed.\n\nTheorem optimize_0plus_sound'': forall e,\n\taeval (optimize_0plus e) = aeval e.\nProof.\n\tintros e.\n\tinduction e;\n\t\ttry (simpl; rewrite IHe1; rewrite IHe2; reflexivity);\n\t\ttry reflexivity.\n\tCase \"APlus\".\n\t\tdestruct e1;\n\t\t\ttry (simpl; simpl in IHe1; rewrite IHe1; rewrite IHe2; reflexivity).\n\t\t\tSCase \"e1 = ANum n\". destruct n;\n\t\t\t\tsimpl; rewrite IHe2; reflexivity. Qed.\n\nTactic Notation \"simpl_and_try\" tactic(c) :=\n\tsimpl;\n\ttry c.\n\nTactic Notation \"aexp_cases\" tactic(first) ident(c) :=\n\tfirst;\n\t[ Case_aux c \"ANum\" | Case_aux c \"APlus\"\n\t\t| Case_aux c \"AMinus\" | Case_aux c \"AMult\" ].\n\nTheorem optimize_0plus_sound''': forall e,\n\taeval (optimize_0plus e) = aeval e.\nProof.\n\tintros e.\n\taexp_cases (induction e) Case;\n\t\ttry (simpl; rewrite IHe1; rewrite IHe2; reflexivity);\n\t\ttry reflexivity.\n\n\t\tCase \"APlus\".\n\t\t\taexp_cases (destruct e1) SCase;\n\t\t\t\ttry (simpl; simpl in IHe1; rewrite IHe1; rewrite IHe2; reflexivity).\n\t\t\tSCase \"ANum\". destruct n;\n\t\t\t\tsimpl; rewrite IHe2; reflexivity. Qed.\n\n\nFixpoint optimize_0plus_all (b:bexp) : bexp :=\n\tmatch b with\n\t\t| BTrue => BTrue\n\t\t| BFalse => BFalse\n\t\t| BEq a1 a2 => BEq (optimize_0plus a1) (optimize_0plus a2)\n\t\t| BLe a1 a2 => BLe (optimize_0plus a1) (optimize_0plus a2)\n\t\t| BNot b1 => BNot b1\n\t\t| BAnd b1 b2 => BAnd b1 b2\n\tend.\n\nTactic Notation \"bexp_cases\" tactic(first) ident(c) :=\n\tfirst;\n\t[ Case_aux c \"BTrue\" | Case_aux c \"BFalse\"\n\t\t\t  | Case_aux c \"BEq\" | Case_aux c \"BLe\" | Case_aux c \"BNot\"\n\t\t\t\t| Case_aux c \"BAnd\" ].\n\nTheorem optimize_0plus_all_sound: forall (e:bexp),\n\tbeval (optimize_0plus_all e) = beval e.\nProof.\n\tintros e.\n\tbexp_cases (destruct e) Case;\n\ttry (simpl; rewrite optimize_0plus_sound; rewrite optimize_0plus_sound);\n\ttry reflexivity.\nQed.\n\nFixpoint optimize_and (b: bexp): bexp :=\n\tmatch b with\n\t\t| BTrue => BTrue\n\t\t| BFalse => BFalse\n\t\t| BEq a1 a2 => BEq a1 a2\n\t\t| BLe a1 a2 => BLe a1 a2\n\t\t| BNot a1 => BNot (optimize_and a1)\n\t\t| BAnd BFalse a2 => BFalse\n\t\t| BAnd a1 a2 => BAnd (optimize_and a1) (optimize_and a2)\n\tend.\n\nTheorem optimize_and_sound: forall (e:bexp),\n\tbeval (optimize_and e) = beval e.\nProof.\n\tintros e.\n\tbexp_cases (induction e) Case;\n\ttry (simpl; rewrite IHe);\n\ttry reflexivity.\n\tCase \"BAnd\". simpl.\n\t\tbexp_cases (destruct e1) SCase;\n\t\t\ttry reflexivity;\n\t\t\ttry (simpl; rewrite IHe2; reflexivity);\n\t\t\ttry (simpl; simpl in IHe1; rewrite IHe2; rewrite IHe1; reflexivity).\nQed.\n\nModule aevalR_first_try.\n\nInductive aevalR : aexp -> nat -> Prop :=\n\t| E_Anum : forall (n : nat),\n\t\t\t\t\t\t\taevalR (ANum n) n\n\t| E_APlus : forall (e1 e2 : aexp) (n1 n2 : nat),\n\t\t\t\t\t\t\t\taevalR e1 n1 -> aevalR e2 n2 -> aevalR (APlus e1 e2) (n1 + n2)\n\t| E_AMinus: forall (e1 e2 : aexp) (n1 n2 : nat),\n\t\t\t\t\t\t\t\taevalR e1 n1 -> aevalR e2 n2 -> aevalR (AMinus e1 e2) (n1 - n2)\n\t| E_AMult : forall (e1 e2 : aexp) (n1 n2 : nat),\n\t\t\t\t\t\t\t\taevalR e1 n1 -> aevalR e2 n2 -> aevalR (AMult e1 e2) (n1 * n2).\n\nNotation \"e '==>' n\" := (aevalR e n) (at level 40).\n\nEnd aevalR_first_try.\n\nReserved Notation \"e '==>' n\" (at level 40).\n\nInductive aevalR : aexp -> nat -> Prop :=\n\t| E_ANum : forall (n : nat), (ANum n) ==> n\n\t| E_APlus : forall (e1 e2 : aexp) (n1 n2 : nat),\n\t\t\t\t\t\t\t\t(e1 ==> n1) -> (e2 ==> n2) -> (APlus e1 e2) ==> (n1 + n2)\n\t| E_AMinus : forall (e1 e2 : aexp) (n1 n2 : nat),\n\t\t\t\t\t\t\t\t(e1 ==> n1) -> (e2 ==> n2) -> (AMinus e1 e2) ==> (n1 - n2)\n\t| E_AMult : forall (e1 e2 : aexp) (n1 n2 : nat),\n\t\t\t\t\t\t\t\t(e1 ==> n1) -> (e2 ==> n2) -> (AMult e1 e2) ==> (n1 * n2)\nwhere \"e '==>' n\" := (aevalR e n).\n\nInductive bevalR : bexp -> bool -> Prop :=\n\t| E_BTrue : bevalR (BTrue) true\n\t| E_BFalse : bevalR (BFalse) false\n\t| E_BEq : forall (e1 e2: aexp) (n1 n2 : nat),\n\t\t\t\t\t\taevalR e1 n1 -> aevalR e2 n2 -> bevalR (BEq e1 e2) (beq_nat n1 n2)\n\t| E_BLe : forall (e1 e2 : aexp) (n1 n2 : nat),\n\t\t\t\t\t\taevalR e1 n1 -> aevalR e2 n2 -> bevalR (BLe e1 e2) (ble_nat n1 n2)\n\t| E_BNot : forall (e1 : bexp) (b : bool),\n\t\t\t\t\t\t\tbevalR e1 b -> bevalR (BNot e1) (negb b)\n\t| E_BAnd : forall (e1 e2 : bexp) (b1 b2 : bool),\n\t\t\t\t\t\t\tbevalR e1 b1 -> bevalR e2 b2 -> bevalR (BAnd e1 e2) (andb b1 b2).\n\nTactic Notation \"aevalR_cases\" tactic(first) ident(c) :=\n\tfirst;\n\t[ Case_aux c \"E_Anum\" | Case_aux c \"E_APlus\"\n\t\t| Case_aux c \"E_AMinus\" | Case_aux c \"E_AMult\" ].\n\nTheorem aeval_iff_aevalR : forall a n,\n\t(a ==> n) <-> aeval a = n.\nProof.\n\tsplit.\n\tCase \"->\".\n\t\tintros H; induction H; subst; reflexivity;\n\tCase \"<-\".\n\t\tgeneralize dependent n.\n\t\tinduction a; simpl; intros; subst; constructor;\n\t\t\ttry apply IHa1; try apply IHa2; reflexivity.\nQed.\n\nTactic Notation \"bevalR_cases\" tactic(first) ident(c) :=\n\tfirst;\n\t[ Case_aux c \"E_BTrue\" | Case_aux c \"E_BFalse\"\n\t\t| Case_aux c \"E_BEq\" | Case_aux c \"E_BLe\" | Case_aux c \"E_BNot\"\n\t\t| Case_aux c \"E_BAnd\" ].\n\nTheorem beval_iff_bevalR : forall a b,\n\tbevalR a b <-> beval a = b.\nProof.\nsplit.\nintros H.\ninduction H.\nsimpl in |- *.\nreflexivity.\n\nsimpl in |- *.\nreflexivity.\n\nsimpl in |- *.\napply aeval_iff_aevalR in H.\napply aeval_iff_aevalR in H0.\nsubst.\nreflexivity.\n\nsimpl in |- *.\napply aeval_iff_aevalR in H0.\napply aeval_iff_aevalR in H.\nsubst.\nreflexivity.\n\nsimpl in |- *.\nrewrite IHbevalR in |- *.\nreflexivity.\n\nsimpl in |- *.\nrewrite IHbevalR1 in |- *.\nrewrite IHbevalR2 in |- *.\nreflexivity.\ngeneralize dependent b.\ninduction a.\nintros b H. subst. constructor.\nintros b H.\nsubst.\nconstructor.\n\nintros b H.\nrewrite <- H in |- *.\nconstructor.\nsimpl in H.\nremember (aeval a)as A in *.\nassert (aeval a = A).\nsubst.\nreflexivity.\n\napply aeval_iff_aevalR in H0.\napply H0.\n\nremember (aeval a0)as A in *.\nassert (aeval a0 = A).\nsubst.\nreflexivity.\n\napply aeval_iff_aevalR in H0.\napply H0.\n\nintros b.\nintros H.\nsimpl in H.\nrewrite <- H in |- *.\nsimpl in |- *.\nconstructor.\nremember (aeval a)as A in *.\nassert (aeval a = A).\nsubst.\nreflexivity.\n\napply aeval_iff_aevalR in H0.\napply H0.\n\nremember (aeval a0)as A in *.\nassert (aeval a0 = A).\nsubst.\nreflexivity.\n\napply aeval_iff_aevalR in H0.\napply H0.\n\nintros b.\nintros H.\nsimpl in |- *.\nsimpl in H.\nrewrite <- H in |- *.\nconstructor.\napply IHa.\nreflexivity.\n\nintros b.\nsimpl in |- *.\nintros H.\nrewrite <- H in |- *.\nconstructor.\napply IHa1.\nreflexivity.\n\napply IHa2.\nreflexivity.\nQed.\n\nEnd AExp.\n\nExample silly_presburger_formula : forall m n o p,\n\tm + n <= n + o /\\ o + 3 = p + 3 ->\n\tm <= p.\nProof.\n\tintros. omega.\nQed.\n\nModule Id.\n\nInductive id : Type :=\n\tId : nat -> id.\n\nDefinition beq_id id1 id2 :=\n\tmatch (id1, id2) with\n\t\t(Id n1, Id n2) => beq_nat n1 n2\n\tend.\n\nTheorem beq_id_refl : forall i,\n\t\ttrue = beq_id i i.\nProof.\n\tintros. destruct i.\n\tapply beq_nat_refl. Qed.\n\nTheorem beq_id_eq : forall i1 i2,\n\ttrue = beq_id i1 i2 -> i1 = i2.\nProof.\nintros i1 i2.\ndestruct i1.\ndestruct i2.\nunfold beq_id in |- *.\nintros H.\napply beq_nat_eq in H.\nsubst.\nreflexivity.\nQed.\n\nTheorem beq_id_false_not_eq : forall i1 i2,\n\tbeq_id i1 i2 = false -> i1 <> i2.\nProof.\nintros i1 i2.\ndestruct i1.\ndestruct i2.\nunfold beq_id in |- *.\nintros H.\nintros C.\nunfold beq_id in |- *.\nassert (false = beq_nat n n0).\nsubst.\nrewrite <- H in |- *.\nreflexivity.\n\napply beq_false_not_eq in H0.\napply H0.\nsubst.\ninversion C.\nreflexivity.\nQed.\n\nTheorem not_eq_beq_id_false : forall i1 i2,\n\ti1 <> i2 -> beq_id i1 i2 = false.\nProof.\n\tintros i1 i2.\n\tdestruct i1. destruct i2.\n\tunfold beq_id in |- *.\n\tintros H.\n\tapply not_eq_beq_false.\n\tintros C.\n\tapply H.\n\tsubst.\n\treflexivity.\nQed.\n\nTheorem beq_nat_sym : forall (n m:nat), forall (b: bool),\n\tbeq_nat n m = b -> beq_nat m n = b.\nProof.\n\tintros n.\n\tinduction n as [| n'].\n\tCase \"n = O\".\n\t\tintros m b eq1.\n\t\tinduction m.\n\t\tSCase \"m = 0\".\n\t\t\tapply eq1.\n\t\tSCase \"m = S m'\".\n\t\t\tapply eq1.\n\tCase \"n = S n'\".\n\t\tinduction m.\n\t\tSCase \"m = 0\".\n\t\t\tintros b eq1.\n\t\t\tapply eq1.\n\t\tSCase \"m = S m'\".\n\t\t\tintros b eq1.\n\t\t\tapply IHn'.\n\t\t\tapply eq1.\n\t\tQed.\n\nTheorem beq_id_sym : forall i1 i2,\n\tbeq_id i1 i2 = beq_id i2 i1.\nProof.\n\tintros i1 i2.\n\tdestruct i1. destruct i2.\n\tunfold beq_id.\n\tapply beq_nat_sym.\n\treflexivity.\nQed.\n\nEnd Id.\n\nDefinition state := id -> nat.\nDefinition empty_state : state := fun _ => 0.\nDefinition update (st : state) (V:id) (n:nat) : state :=\n\tfun V' => if beq_id V V' then n else st V'.\n\nTheorem update_eq : forall n V st,\n\t(update st V n) V = n.\nProof.\nintros n V st.\nunfold update.\nrewrite <- beq_id_refl.\nreflexivity.\nQed.\n\nTheorem update_neq : forall V2 V1 n st,\n\tbeq_id V2 V1 = false ->\n\t\t(update st V2 n) V1 = (st V1).\nProof.\nintros V2 V1 n st.\nintros H.\nunfold update.\nrewrite H.\nreflexivity.\nQed.\n\nTheorem update_example : forall (n:nat),\n\t(update empty_state (Id 2) n) (Id 3) = 0.\nProof.\nunfold update.\nintros n.\nsimpl.\nunfold empty_state.\nreflexivity.\nQed.\n\nTheorem update_shadow : forall x1 x2 k1 k2 (f:state),\n\t(update (update f k2 x1) k2 x2) k1 = (update f k2 x2) k1.\nProof.\nintros x1 x2 k1 k2 f.\nunfold update in |- *.\ndestruct (beq_id k2 k1);\n reflexivity.\nQed.\n\nTheorem update_same : forall x1 k1 k2 (f : state),\n\tf k1 = x1 ->\n\t\t(update f k1 x1) k2 = f k2.\nProof.\nunfold update in |- *.\nintros x1 k1 k2 f.\nremember (beq_id k1 k2)as A in *.\ndestruct A.\napply beq_id_eq in HeqA.\nsubst.\nintros H.\nsubst.\nreflexivity.\n\nintros H.\nreflexivity.\nQed.\n\n\nTheorem update_permute : forall x1 x2 k1 k2 k3 f,\n\tbeq_id k2 k1 = false ->\n\t\t(update (update f k2 x1) k1 x2) k3 = (update (update f k1 x2) k2 x1) k3.\nProof.\nintros x1 x2 k1 k2 k3 f.\nintros H.\nunfold update in |- *.\nremember (beq_id k1 k3)as A1 in *.\ndestruct A1.\napply beq_id_eq in HeqA1.\nrewrite HeqA1 in H.\ndestruct (beq_id k2 k3).\ninversion H.\n\nreflexivity.\n\nremember (beq_id k2 k3)as B in *.\ndestruct B;\ntry reflexivity.\nQed.\n\nInductive aexp : Type := \n\t| ANum : nat -> aexp\n\t| AId : id -> aexp (* <----- NEW *)\n\t| APlus : aexp -> aexp -> aexp\n\t| AMinus : aexp -> aexp -> aexp\n\t| AMult : aexp -> aexp -> aexp.\n\nTactic Notation \"aexp_cases\" tactic(first) ident(c) :=\n\tfirst;\n\t[ Case_aux c \"ANum\" | Case_aux c \"AId\" | Case_aux c \"APlus\"\n\t| Case_aux c \"AMinus\" | Case_aux c \"AMult\" ].\n\nDefinition X : id := Id 0.\nDefinition Y : id := Id 1.\nDefinition Z : id := Id 2.\n\nInductive bexp : Type :=\n\t| BTrue : bexp\n\t| BFalse : bexp\n\t| BEq : aexp -> aexp -> bexp\n\t| BLe : aexp -> aexp -> bexp\n\t| BNot : bexp -> bexp\n\t| BAnd : bexp -> bexp -> bexp.\n\nTactic Notation \"bexp_cases\" tactic(first) ident(c) :=\n\tfirst;\n\t[ Case_aux c \"BTrue\" | Case_aux c \"BFalse\" | Case_aux c \"BEq\"\n\t| Case_aux c \"BLe\" | Case_aux c \"BNot\" | Case_aux c \"BAnd\" ].\n\nFixpoint aeval (st : state) (e : aexp) : nat :=\n  match e with\n  | ANum n => n\n  | AId i => st i (* <----- NEW *)\n  | APlus a1 a2 => (aeval st a1) + (aeval st a2)\n  | AMinus a1 a2 => (aeval st a1) - (aeval st a2)\n  | AMult a1 a2 => (aeval st a1) * (aeval st a2)\n  end.\n\nFixpoint beval (st : state) (e : bexp) : bool :=\n  match e with \n  | BTrue => true\n  | BFalse => false\n  | BEq a1 a2 => beq_nat (aeval st a1) (aeval st a2)\n  | BLe a1 a2 => ble_nat (aeval st a1) (aeval st a2)\n  | BNot b1 => negb (beval st b1)\n  | BAnd b1 b2 => andb (beval st b1) (beval st b2)\n  end.\n\nExample aexp1 : \n  aeval (update empty_state X 5) \n        (APlus (ANum 3) (AMult (AId X) (ANum 2))) \n  = 13.\nProof. reflexivity. Qed.\n\nExample bexp1 :\n  beval (update empty_state X 5) \n        (BAnd BTrue (BNot (BLe (AId X) (ANum 4))))\n  = true.\nProof. reflexivity. Qed.\n\nInductive com : Type :=\n\t| CSkip : com\n\t| CAss : id -> aexp -> com\n\t| CSeq : com -> com -> com\n\t| CIf : bexp -> com -> com -> com\n\t| CWhile : bexp -> com -> com.\n\nTactic Notation \"com_cases\" tactic(first) ident(c) :=\n\tfirst;\n\t[ Case_aux c \"SKIP\" | Case_aux c \"::=\" | Case_aux c \";\"\n\t| Case_aux c \"IFB\" | Case_aux c \"WHILE\" ].\n\nNotation \"'SKIP'\" := \n\tCSkip.\nNotation \"l '::=' a\" := \n\t(CAss l a) (at level 60).\nNotation \"c1 ; c2\" := \n\t(CSeq c1 c2) (at level 80, right associativity).\nNotation \"'WHILE' b 'DO' c 'END'\" := \n\t(CWhile b c) (at level 80, right associativity).\nNotation \"'IFB' e1 'THEN' e2 'ELSE' e3 'FI'\" := \n\t(CIf e1 e2 e3) (at level 80, right associativity).\n\nDefinition plus2 : com :=\n\tX ::= (APlus (AId X) (ANum 2)).\n\nDefinition XtimesYinZ : com :=\n\tZ ::= (AMult (AId X) (AId Y)).\n\nDefinition subtract_slowly_body : com :=\n\tZ ::= AMinus (AId Z) (ANum 1);\n\tX ::= AMinus (AId X) (ANum 1).\n\nDefinition subtract_slowly : com :=\n\tWHILE BNot (BEq (AId X) (ANum 0)) DO\n\t\tsubtract_slowly_body\n\tEND.\n\nDefinition subtract_3_from_5_slowly : com :=\n\tX ::= ANum 3 ;\n\tZ ::= ANum 5 ;\n\tsubtract_slowly.\n\nDefinition loop : com :=\n  WHILE BTrue DO\n\t\tSKIP\n\tEND.\n\nDefinition fact_body : com :=\n  Y ::= AMult (AId Y) (AId Z) ;\n\tZ ::= AMinus (AId Z) (ANum 1).\n\nDefinition fact_loop : com :=\n\tWHILE BNot (BEq (AId Z) (ANum 0)) DO\n\t\tfact_body\n\tEND.\n\nDefinition fact_com : com :=\n\tZ ::= AId X ;\n\tY ::= ANum 1 ;\n\tfact_loop.\n\nFixpoint ceval_step1 (st:state) (c:com) : state :=\n\tmatch c with\n\t\t| SKIP => st\n\t\t| l ::= a1 =>\n\t\t\t\tupdate st l (aeval st a1)\n\t\t| c1 ; c2 =>\n\t\t\tlet st' := ceval_step1 st c1 in\n\t\t\t\tceval_step1 st' c2\n\t\t| IFB b THEN c1 ELSE c2 FI =>\n\t\t\tif (beval st b) then ceval_step1 st c1 else ceval_step1 st c2\n\t\t| WHILE b1 DO c1 END =>\n\t\t\tst (* bogus *)\n\tend.\n\nFixpoint ceval_step2 (st: state) (c:com) (i:nat) : state :=\n\tmatch i with\n\t\t| O => empty_state\n\t\t| S i' =>\n\t\t\t\tmatch c with\n\t\t\t\t\t| SKIP => st\n\t\t\t\t\t| l ::= a1 =>\n\t\t\t\t\t\t\tupdate st l (aeval st a1)\n\t\t\t\t\t| c1 ; c2 => let st' := ceval_step2 st c1 i' in\n\t\t\t\t\t\t\t\t\t\t\tceval_step2 st' c2 i'\n\t\t\t\t\t| IFB b THEN c1 ELSE c2 FI =>\n\t\t\t\t\t\t\tif (beval st b) then ceval_step2 st c1 i' else ceval_step2 st c2 i'\n\t\t\t\t\t| WHILE b1 DO c1 END =>\n\t\t\t\t\t\t\tif (beval st b1)\n\t\t\t\t\t\t\tthen let st' := ceval_step2 st c1 i' in\n\t\t\t\t\t\t\t\t\tceval_step2 st' c i'\n\t\t\t\t\t\t\telse st\n\t\t\t\tend\n\tend.\n\nFixpoint ceval_step3 (st: state) (c:com) (i:nat) : option state :=\n\tmatch i with\n\t\t| O => None\n\t\t| S i' =>\n\t\t\t\tmatch c with\n\t\t\t\t\t| SKIP => Some st\n\t\t\t\t\t| l ::= a1 =>\n\t\t\t\t\t\t\tSome (update st l (aeval st a1))\n\t\t\t\t\t| c1 ; c2 => match (ceval_step3 st c1 i') with\n\t\t\t\t\t\t\t\t\t\t\t\t| Some st' => ceval_step3 st' c2 i'\n\t\t\t\t\t\t\t\t\t\t\t\t| None => None\n\t\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t| IFB b THEN c1 ELSE c2 FI =>\n\t\t\t\t\t\t\tif (beval st b) then ceval_step3 st c1 i' else ceval_step3 st c2 i'\n\t\t\t\t\t| WHILE b1 DO c1 END =>\n\t\t\t\t\t\t\tif (beval st b1)\n\t\t\t\t\t\t\tthen match (ceval_step3 st c1 i') with\n\t\t\t\t\t\t\t\t\t\t| Some st' => ceval_step3 st' c i'\n\t\t\t\t\t\t\t\t\t\t| None => None\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telse Some st\n\t\t\t\tend\n\tend.\n\nDefinition bind_option {X Y : Type} (xo : option X) (f : X -> option Y) : option Y :=\n\tmatch xo with\n\t\t| None => None\n\t\t| Some x => f x\n\tend.\n\nFixpoint ceval_step (st: state) (c:com) (i:nat) : option state :=\n\tmatch i with\n\t\t| O => None\n\t\t| S i' =>\n\t\t\t\tmatch c with\n\t\t\t\t\t| SKIP => Some st\n\t\t\t\t\t| l ::= a1 =>\n\t\t\t\t\t\t\tSome (update st l (aeval st a1))\n\t\t\t\t\t| c1 ; c2 => bind_option (ceval_step st c1 i')\n\t\t\t\t\t\t\t\t\t\t\t\t(fun st' => ceval_step st' c2 i')\n\t\t\t\t\t| IFB b THEN c1 ELSE c2 FI =>\n\t\t\t\t\t\t\tif (beval st b) then ceval_step st c1 i' else ceval_step st c2 i'\n\t\t\t\t\t| WHILE b1 DO c1 END =>\n\t\t\t\t\t\t\tif (beval st b1)\n\t\t\t\t\t\t\tthen bind_option (ceval_step st c1 i')\n\t\t\t\t\t\t\t\t\t  (fun st' => ceval_step st' c i')\n\t\t\t\t\t\t\telse Some st\n\t\t\t\tend\n\tend.\n\nDefinition test_ceval (st:state) (c:com) :=\n\tmatch ceval_step st c 500 with\n\t\t| None => None\n\t\t| Some st => Some (st X, st Y, st Z)\n\tend.\n\nDefinition pup_to_n: com :=\n\t(Y ::= (ANum 0) ;\n\t WHILE (BLe (ANum 1) (AId X)) DO\n\t \tY ::= (APlus (AId X) (AId Y)) ;\n\t\t \tX ::= (AMinus (AId X) (ANum 1))\n\tEND) .\n\nExample pup_to_n_1 :\n\ttest_ceval (update empty_state X 5) pup_to_n\n\t\t= Some (0, 15, 0).\nProof. reflexivity. Qed.\n\nDefinition ceval_even : com :=\n\tWHILE (BLe (ANum 2) (AId X)) DO\n\t\tX ::= (AMinus (AId X) (ANum 2))\n\tEND ;\n\tZ ::= (AId X).\n\nExample ceval_even_test1 :\n\ttest_ceval (update empty_state X 20) ceval_even\n\t\t= Some (0, 0, 0).\nProof. reflexivity. Qed.\n\nExample ceval_even_test2 :\n\ttest_ceval (update empty_state X 21) ceval_even\n\t\t= Some (1, 0, 1).\nProof. reflexivity. Qed.\n\nExample ceval_even_test3 :\n\ttest_ceval (update empty_state X 2) ceval_even\n\t\t= Some (0, 0, 0).\nProof. reflexivity. Qed.\n\nExample ceval_even_test4 :\n\ttest_ceval (update empty_state X 1) ceval_even\n\t\t= Some (1, 0, 1).\nProof. reflexivity. Qed.\n\nExample ceval_even_test5 :\n\ttest_ceval (update empty_state X 0) ceval_even\n\t\t= Some (0, 0, 0).\nProof. reflexivity. Qed.\n\nReserved Notation \"cl '/' st '==>' st'\" (at level 40, st at level 39).\n\nInductive ceval : com -> state -> state -> Prop :=\n\t| E_Skip : forall st,\n\t\tSKIP / st ==> st\n\t| E_Ass : forall st al n l,\n\t\taeval st al = n ->\n\t\t\t(l ::= al) / st ==> (update st l n)\n\t| E_Seq : forall c1 c2 st st' st'',\n\t\tc1 / st ==> st' ->\n\t\t\tc2 / st' ==> st'' ->\n\t\t\t\t(c1 ; c2) / st ==> st''\n\t| E_IfTrue : forall st st' b1 c1 c2,\n\t\tbeval st b1 = true ->\n\t\t\tc1 / st ==> st' ->\n\t\t\t\t(IFB b1 THEN c1 ELSE c2 FI) / st ==> st'\n\t| E_IfFalse : forall st st' b1 c1 c2,\n\t\tbeval st b1 = false ->\n\t\t\tc2 / st ==> st' ->\n\t\t\t\t(IFB b1 THEN c1 ELSE c2 FI) / st ==> st'\n\t| E_WhileEnd : forall b1 st c1,\n\t\tbeval st b1 = false ->\n\t\t\t(WHILE b1 DO c1 END) / st ==> st\n\t| E_WhileLoop : forall st st' st'' b1 c1,\n\t\tbeval st b1 = true ->\n\t\t\tc1 / st ==> st' ->\n\t\t\t\t(WHILE b1 DO c1 END) / st' ==> st'' ->\n\t\t\t\t\t(WHILE b1 DO c1 END) / st ==> st''\n\t\n\twhere \"c1 '/' st '==>' st'\" := (ceval c1 st st').\n\nTactic Notation \"ceval_cases\" tactic(first) ident(c) :=\n\tfirst;\n\t[ Case_aux c \"E_Skip\" | Case_aux c \"E_Ass\" | Case_aux c \"E_Seq\"\n\t\t| Case_aux c \"E_IfTrue\" | Case_aux c \"E_IfFalse\"\n\t\t| Case_aux c \"E_WhileEnd\" | Case_aux c \"E_WhileLoop\" ].\n\nExample ceval_example1 :\n\t(X ::= ANum 2;\n\t IFB BLe (AId X) (ANum 1)\n\t \tTHEN Y ::= ANum 3\n\t\tELSE Z ::= ANum 4\n\tFI)\n\t/ empty_state ==> (update (update empty_state X 2) Z 4).\nProof.\n(* We must supply the intermediate state *)\n\tapply E_Seq with (update empty_state X 2).\n\tCase \"assignment command\".\n\tapply E_Ass. reflexivity.\n\tCase \"if command\".\n\tapply E_IfFalse.\n\treflexivity.\n\tapply E_Ass. reflexivity. Qed.\n\nExample ceval_example2:\n\t(X ::= ANum 0; Y ::= ANum 1; Z ::= ANum 2) / empty_state ==>\n\t\t(update (update (update empty_state X 0) Y 1) Z 2).\nProof.\napply E_Seq with (update empty_state X 0);\ntry (apply E_Ass; reflexivity).\n\t  \napply E_Seq with (update (update empty_state X 0) Y 1);\ntry (apply E_Ass; reflexivity).\nQed.\n\nTheorem ceval_step__ceval : forall c st st',\n\t\t\t\t(exists i, ceval_step st c i = Some st') ->\n\t\t\t\t\tc / st ==> st'.\nProof.\nintros c st st' H.\ninversion H as (i, E).\nclear H.\ngeneralize dependent st'.\ngeneralize dependent st.\ngeneralize dependent c.\ninduction i as [| i'].\n intros c st st' H.\n inversion H.\n \n intros c st st' H.\n com_cases (destruct c) SCase; simpl in H; inversion H; subst; clear H.\n  apply E_Skip.\n  \n  apply E_Ass.\n  reflexivity.\n  \n  remember (ceval_step st c1 i')as r1 in *.\n  destruct r1.\n   apply E_Seq with s.\n    apply IHi'.\n    rewrite Heqr1 in |- *.\n    reflexivity.\n    \n    apply IHi'.\n    simpl in H1.\n    assumption.\n    \n   inversion H1.\n   \n  remember (beval st b)as r in *.\n  destruct r.\n   apply E_IfTrue.\n    rewrite Heqr in |- *.\n    reflexivity.\n    \n    apply IHi'.\n    assumption.\n    \n   apply E_IfFalse.\n    rewrite Heqr in |- *.\n    reflexivity.\n    \n    apply IHi'.\n    assumption.\n    \n  remember (beval st b)as r in *.\n  destruct r.\n   remember (ceval_step st c i')as r1 in *.\n   destruct r1.\n    apply E_WhileLoop with s.\n     rewrite Heqr in |- *.\n     reflexivity.\n     \n     apply IHi'.\n     rewrite Heqr1 in |- *.\n     reflexivity.\n     \n     apply IHi'.\n     simpl in H1.\n     assumption.\n     \n    inversion H1.\n    \n   inversion H1.\n   apply E_WhileEnd.\n   rewrite Heqr in |- *.\n   subst.\n   reflexivity.\nQed.\n\nTheorem ceval_step_more: forall i1 i2 st st' c,\n\ti1 <= i2 -> ceval_step st c i1 = Some st' ->\n\t\tceval_step st c i2 = Some st'.\nProof.\ninduction i1 as [| i1']; intros i2 st st' c Hle Hceval.\ninversion Hceval.\n\ndestruct i2 as [| i2'].\ninversion Hle.\n\nassert (i1' <= i2') as Hle' by complete omega.\ncom_cases (destruct c) SCase.\nSCase \"SKIP\".\nsimpl in Hceval.\ninversion Hceval.\nreflexivity.\n\nSCase \"::=\".\nsimpl in Hceval.\ninversion Hceval.\nreflexivity.\n\nSCase \";\".\nsimpl in Hceval.\nsimpl in |- *.\nremember (ceval_step st c1 i1')as st1'o in *.\ndestruct st1'o.\nSSCase \"st1'o = Some\".\nsymmetry  in Heqst1'o.\napply (IHi1' i2') in Heqst1'o; try assumption.\nrewrite Heqst1'o in |- *.\nsimpl in |- *.\nsimpl in Hceval.\napply (IHi1' i2') in Hceval; try assumption.\n\ninversion Hceval.\n\nSCase \"IFB\".\nsimpl in Hceval.\nsimpl in |- *.\nremember (beval st b)as bval in *.\ndestruct bval; apply (IHi1' i2') in Hceval; assumption.\n\nSCase \"WHILE\".\nsimpl in Hceval.\nsimpl in |- *.\ndestruct (beval st b); try assumption.\nremember (ceval_step st c i1')as st1'o in *.\ndestruct st1'o.\nSSCase \"st1'o = Some\".\nsymmetry  in Heqst1'o.\napply (IHi1' i2') in Heqst1'o; try assumption.\nrewrite Heqst1'o in |- *.\nsimpl in |- *.\nsimpl in Hceval.\napply (IHi1' i2') in Hceval; try assumption.\n\nSSCase \"i1'o = None\".\nsimpl in Hceval.\ninversion Hceval.\nQed.\n\nTheorem ceval__ceval_step : forall c st st',\n\t\t\t\tc / st ==> st' ->\n\t\t\t\t\texists i, ceval_step st c i = Some st'.\nProof.\n\tintros c st st' Hce.\n\tceval_cases (induction Hce) Case.\n\texists 1%nat.\n\tsimpl in |- *.\n\treflexivity.\n\n\tsimpl in |- *.\n\texists 1%nat.\n\tsimpl in |- *.\n\trewrite H in |- *.\n\treflexivity.\n\tinversion IHHce1 as (x1).\n\tinversion IHHce2 as (x2).\n\texists (S (x1 + x2)).\n\tsimpl in |- *.\n\tassert (ceval_step st c1 (x1 + x2) = Some st').\n\tapply ceval_step_more with x1.\n\tomega.\n\n\tassumption.\n\n\trewrite H1 in |- *.\n\tsimpl in |- *.\n\tapply ceval_step_more with x2.\n\tomega.\n\n\tassumption.\n\n\tinversion IHHce.\n\texists (S x).\n\tsimpl in |- *.\n\tsimpl in |- *.\n\trewrite H in |- *.\n\tapply H0.\n\n\tinversion IHHce.\n\texists (S x).\n\tsimpl in |- *.\n\tsimpl in |- *.\n\trewrite H in |- *.\n\tassumption.\n\n\texists 1%nat.\n\tsimpl in |- *.\n\trewrite H in |- *.\n\treflexivity.\n\n\tinversion IHHce1.\n\tsimpl in |- *.\n\tinversion IHHce2.\n\texists (S (x + x0)).\n\tsimpl in |- *.\n\tsimpl in |- *.\n\trewrite H in |- *.\n\tassert (ceval_step st c1 (x + x0) = Some st').\n\tapply ceval_step_more with x.\n\tomega.\n\n\tassumption.\n\n\trewrite H2 in |- *.\n\tsimpl in |- *.\n\tapply ceval_step_more with x0.\n\tomega.\n\n\tassumption.\nQed.\n\nTheorem ceval_and_ceval_step_coincide: forall c st st',\n\t\t\t\tc / st ==> st' <-> exists i, ceval_step st c i = Some st'.\nProof.\n\tintros c st st'.\n\tsplit. apply ceval__ceval_step. apply ceval_step__ceval.\nQed.\n\nTheorem ceval_deterministic : forall c st st1 st2,\n\tc / st ==> st1 ->\n\t\tc / st ==> st2 ->\n\t\t\tst1 = st2.\nProof.\nintros c st st1 st2 He1 He2.\napply ceval__ceval_step in He1.\napply ceval__ceval_step in He2.\ninversion He1 as (i1, E1).\ninversion He2 as (i2, E2).\napply ceval_step_more with (i2 := i1 + i2) in E1.\napply ceval_step_more with (i2 := i1 + i2) in E2.\nrewrite E1 in E2.\ninversion E2.\nreflexivity.\n\nomega.\n\nomega.\nQed.\n\nTheorem plus2_spec : forall st n st',\n\tst X = n ->\n\t\tplus2 / st ==> st' ->\n\t\t\tst' X = n + 2.\nProof.\nintros st n st' HX Heval.\ninversion Heval.\nsubst.\napply update_eq.\nQed.\n\n\nTheorem XtimesYinZ_spec : forall st nx ny st',\n\t\tst X = nx ->\n\t\t\tst Y = ny ->\n\t\t\t\tXtimesYinZ / st ==> st' ->\n\t\t\t\t\tst' Z = nx * ny.\nProof.\nintros st nx ny st' H1 H2 Heval.\ninversion Heval.\nsubst.  simpl.\napply update_eq.\nQed.\n\nTheorem loop_never_stops : forall st st',\n\t~(loop / st ==> st').\nProof.\n\tintros st st' contra. unfold loop in contra.\n\tremember (WHILE BTrue DO SKIP END) as loopdef.\n\tinduction contra.\n\tsimpl in Heqloopdef.\n\tinversion Heqloopdef.\n\n\tinversion Heqloopdef.\n\n\tinversion Heqloopdef.\n\n\tinversion Heqloopdef.\n\n\tinversion Heqloopdef.\n\n\tinversion Heqloopdef.\n\tsubst.\n\tsimpl in H.\n\tinversion H.\n\n\tinversion Heqloopdef.\n\tsubst.\n\tinversion contra1.\n\tsubst.\n\tapply IHcontra2.\n\treflexivity.\nQed.\n\nFixpoint no_whiles (c : com) : bool :=\n\tmatch c with\n\t\t| SKIP => true\n\t\t| _ ::= _ => true\n\t\t| c1 ; c2 => andb (no_whiles c1) (no_whiles c2)\n\t\t| IFB _ THEN ct ELSE cf FI => andb (no_whiles ct) (no_whiles cf)\n\t\t| WHILE _ DO _ END => false\n\tend.\n\nInductive no_Whiles : com -> Prop :=\n\t| noWhilesSKIP : no_Whiles (SKIP)\n\t| noWhilesAss : forall a1 a2, no_Whiles (a1 ::= a2)\n\t| noWhilesSeq : forall (a1 a2 : com), no_Whiles a1 -> no_Whiles a2 -> no_Whiles (a1 ; a2)\n\t| noWhilesIf : forall (b : bexp) (a1 a2 : com),\n\t\t\t\t\t\t\t\t\t\tno_Whiles a1 -> no_Whiles a2 ->\n\t\t\t\t\t\t\t\t\t\t\t\tno_Whiles (IFB b THEN a1 ELSE a2 FI).\n\nTheorem no_whiles_eqv:\n\tforall c, no_whiles c = true <-> no_Whiles c.\nProof.\nsplit.\ninduction c.\nintros H.\napply noWhilesSKIP.\n\nsimpl in |- *.\nintros H.\napply noWhilesAss.\n\nintros H.\napply noWhilesSeq.\napply IHc1.\nsimpl in H.\nsimpl in H.\nauto.\neauto   .\napply andb_true_elim1 in H.\napply H.\n\napply IHc2.\nsimpl in H.\napply andb_true_elim2 in H.\nassumption.\n\nsimpl in |- *.\nintros H.\napply noWhilesIf.\napply andb_true_elim1 in H.\napply IHc1.\nassumption.\n\napply IHc2.\napply andb_true_elim2 in H.\nassumption.\n\nsimpl in |- *.\nintros contra.\ninversion contra.\n\nintros H.\ninduction H.\nsimpl in |- *.\nreflexivity.\n\nreflexivity.\n\nsimpl in |- *.\nassert (no_whiles a1 = true /\\ no_whiles a2 = true).\nsplit.\nassumption.\n\nassumption.\n\neauto   .\nauto.\napply andb_true_intro.\napply H1.\n\nsimpl in |- *.\nassert (no_whiles a1 = true /\\ no_whiles a2 = true).\nsplit.\nassumption.\n\nassumption.\n\napply andb_true_intro.\nassumption.\nQed.\n\nTheorem no_whiles_terminate : forall (c : com) (st:state),\n\tno_whiles c = true ->\n\t\texists i, exists st', ceval_step st c i = Some st'.\nProof.\ninduction c.\nintros st.\nsimpl in |- *.\nintros H.\nexists 1%nat.\nexists st.\nreflexivity.\n\nsimpl in |- *.\nintros st.\nintros H.\nexists 1%nat.\nsimpl in |- *.\nexists (update st i (aeval st a)).\nreflexivity.\n\nintros st.\nintros H.\ninversion H.\nassert (no_whiles c1 = true).\napply andb_true_elim1 in H1.\nassumption.\n\nassert (no_whiles c2 = true).\napply andb_true_elim2 in H1.\nassumption.\n\napply IHc1 with st in H0.\ninversion H0.\ninversion H3.\napply IHc2 with x0 in H2.\ninversion H2.\ninversion H5.\nexists (S (x + x1)).\nexists x2.\nsimpl in |- *.\nremember (ceval_step st c1 (x + x1))as r in *.\ndestruct r.\nsymmetry  in Heqr.\nassert (x <= x + x1).\nomega.\n\nsimpl in |- *.\napply ceval_step_more with x1.\nomega.\n\napply ceval_step_more with (i2 := x + x1) in H4.\nassert (Some x0 = Some s).\nauto.\neauto   .\nrewrite <- Heqr in |- *.\nrewrite <- H4 in |- *.\nreflexivity.\n\ninversion H8.\nrewrite <- H10 in |- *.\nassumption.\n\nomega.\n\nsimpl in |- *.\nassert (x <= x + x1).\nomega.\n\napply ceval_step_more with (i2 := x + x1) in H4.\nrewrite H4 in Heqr.\ninversion Heqr.\n\nomega.\n\nintros st.\nsimpl in |- *.\nintros H1.\nsimpl in |- *.\nassert (no_whiles c1 = true).\napply andb_true_elim1 in H1.\nassumption.\n\nassert (no_whiles c2 = true).\napply andb_true_elim2 in H1.\nassumption.\n\napply IHc1 with st in H.\napply IHc2 with st in H0.\ninversion H.\ninversion H0.\nexists (S (x + x0)).\nsimpl in |- *.\ndestruct (beval st b).\ninversion H2.\nexists x1.\napply ceval_step_more with x.\nomega.\n\nassumption.\n\ninversion H3.\nexists x1.\napply ceval_step_more with x0.\nomega.\n\nassumption.\n\nintros st H.\ninversion H.\nQed.\n\nFixpoint beval_short_circuit (st : state) (e: bexp) : bool :=\n\tmatch e with\n\t\t| BTrue => true\n\t\t| BFalse => false\n\t\t| BEq a1 a2 => beq_nat (aeval st a1) (aeval st a2)\n\t\t| BLe a1 a2 => ble_nat (aeval st a1) (aeval st a2)\n\t\t| BNot b1 => negb (beval_short_circuit st b1)\n\t\t| BAnd b1 b2 => match (beval_short_circuit st b1) with\n\t\t\t\t\t\t\t\t\t\t\t| true => (beval st b2)\n\t\t\t\t\t\t\t\t\t\t\t| false => false\n\t\t\t\t\t\t\t\t\t  end\n\tend.\n\nTheorem beval_short_circuit_eqv : forall (e : bexp) (st : state),\n\tbeval st e = beval_short_circuit st e.\nProof.\ninduction e.\nintros st.\nsimpl in |- *.\nreflexivity.\n\nreflexivity.\n\nsimpl in |- *.\nreflexivity.\n\nreflexivity.\n\nintros st.\nsimpl in |- *.\nrewrite IHe in |- *.\nreflexivity.\n\nsimpl in |- *.\nintros st.\nrewrite IHe1 in |- *.\nrewrite IHe2 in |- *.\ndestruct (beval_short_circuit st e1).\nsimpl in |- *.\nreflexivity.\n\nreflexivity.\nQed.\n\t\t\nInductive sinstr : Type :=\n\t| SPush : nat -> sinstr\n\t| SLoad : id -> sinstr\n\t| SPlus : sinstr\n\t| SMinus : sinstr\n\t| SMult : sinstr.\n\nFixpoint s_execute (st : state) (stack : list nat) (prog : list sinstr)\n\t\t: list nat :=\nmatch ( prog ) with\n| [] =>stack\n|a :: l\n  => match (a) with\n   | SPush n => s_execute st (cons n stack) l\n   | SLoad i => s_execute st (cons (st i) stack) l\n   | SPlus  => match stack with\n              |[]=>nil\n              |a :: al'=> match al' with\n                         |[]=>nil\n                         |b :: bl'=>s_execute st (cons (a+b) bl') l\n                         end\n              end\n   | SMinus =>  match stack with \n              |[]=>nil\n              |a :: al'=> match al' with\n                         |[]=>nil\n                         |b :: bl'=>s_execute st (cons (b-a) bl') l\n                         end\n              end\n   | SMult => match stack with \n              |[]=>nil\n              |a :: al'=> match al' with\n                         |[]=>nil\n                         |b :: bl'=>s_execute st (cons (a*b) bl') l\n                         end\n              end \n   end\nend.\n\nExample s_execute1 :\n\ts_execute empty_state [] [SPush 5, SPush 3, SPush 1, SMinus] = [2, 5].\nProof. reflexivity. Qed.\n\nExample s_execute2:\n\ts_execute (update empty_state X 3) [3,4] [SPush 4, SLoad X, SMult, SPlus ]\n\t\t= [15, 4].\nProof. reflexivity. Qed.\n\nFixpoint s_compile (e : aexp) : list sinstr :=\n\tmatch e with\n\t\t| ANum v => [SPush v]\n\t\t| AId i => [SLoad i]\n\t\t| APlus a1 a2 => (s_compile a1) ++ (s_compile a2) ++ [SPlus]\n\t\t| AMinus a1 a2 => (s_compile a1) ++ (s_compile a2) ++ [SMinus]\n\t\t| AMult a1 a2 => (s_compile a1) ++ (s_compile a2) ++ [SMult]\n\tend.\n\nExample s_compile1 :\n\ts_compile (AMinus (AId X) (AMult (ANum 2) (AId Y))) =\n\t\t[SLoad X, SPush 2, SLoad Y, SMult, SMinus].\nProof. reflexivity. Qed.\n\nTheorem execute_theorem : forall (e : aexp) (st : state) (s1 : list nat) (other : list sinstr),\n\t\ts_execute st s1 (s_compile e ++ other) =\n\t\t\t\ts_execute st ((aeval st e) :: s1) other.\nProof.\ninduction e; try reflexivity.\nsimpl in |- *.\nintros st s1 other.\nassert\n((s_compile e1 ++ s_compile e2 ++ [SPlus]) ++ other =\n s_compile e1 ++ s_compile e2 ++ [SPlus] ++ other).\nrewrite -> app_ass.\nrewrite -> app_ass.\nreflexivity.\n\nrewrite H in |- *.\nassert\n(s_execute st s1 (s_compile e1 ++ s_compile e2 ++ SPlus :: other) =\n s_execute st (aeval st e1 :: s1) (s_compile e2 ++ SPlus :: other)).\napply IHe1.\n\nsimpl in |- *.\nrewrite H0 in |- *.\nassert\n(s_execute st (aeval st e1 :: s1) (s_compile e2 ++ SPlus :: other) =\n s_execute st (aeval st e2 :: aeval st e1 :: s1) (SPlus :: other)).\napply IHe2.\n\nrewrite H1 in |- *.\nsimpl in |- *.\nrewrite plus_comm in |- *.\nreflexivity.\n\nintros st s1 other.\nassert\n(s_execute st s1 (s_compile e1 ++ s_compile e2 ++ SMinus :: other) =\n s_execute st (aeval st e1 :: s1) (s_compile e2 ++ SMinus :: other)).\napply IHe1.\n\nsimpl in |- *.\nassert\n((s_compile e1 ++ s_compile e2 ++ [SMinus]) ++ other =\n s_compile e1 ++ s_compile e2 ++ [SMinus] ++ other).\nrewrite -> app_ass.\nrewrite -> app_ass.\nreflexivity.\n\nsimpl in |- *.\nrewrite H0 in |- *.\nsimpl in |- *.\nrewrite H in |- *.\nassert\n(s_execute st (aeval st e1 :: s1) (s_compile e2 ++ SMinus :: other) =\n s_execute st (aeval st e2 :: aeval st e1 :: s1) (SMinus :: other)).\napply IHe2.\n\nrewrite H1 in |- *.\nsimpl in |- *.\nreflexivity.\n\nintros st s1 other.\nsimpl in |- *.\nsimpl in |- *.\nassert\n((s_compile e1 ++ s_compile e2 ++ [SMult]) ++ other =\n s_compile e1 ++ s_compile e2 ++ [SMult] ++ other).\nrewrite -> app_ass.\nrewrite -> app_ass.\nreflexivity.\n\nrewrite H in |- *.\nsimpl in |- *.\nassert\n(s_execute st s1 (s_compile e1 ++ s_compile e2 ++ SMult :: other) =\n s_execute st (aeval st e1 :: s1) (s_compile e2 ++ SMult :: other)).\napply IHe1.\n\nrewrite H0 in |- *.\nassert\n(s_execute st (aeval st e1 :: s1) (s_compile e2 ++ SMult :: other) =\n s_execute st (aeval st e2 :: aeval st e1 :: s1) (SMult :: other)).\napply IHe2.\n\nrewrite H1 in |- *.\nsimpl in |- *.\nrewrite mult_comm in |- *.\nreflexivity.\nQed.\n\nTheorem s_compile_correct : forall (st : state) (e : aexp),\n\t\t\t\ts_execute st [] (s_compile e) = [ aeval st e].\nProof.\nintros st e.\nassert ([aeval st e] = s_execute st [aeval st e] []).\nsimpl in |- *.\nreflexivity.\n\nrewrite H in |- *.\nassert (s_compile e ++ [] = s_compile e).\nsimpl in |- *.\nrewrite -> app_nil_end.\nreflexivity.\n\nrewrite <- H0 in |- *.\napply execute_theorem.\nQed.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/JsCorrectness.v",
    "content": "Set Implicit Arguments.\nRequire Import Shared.\nRequire Import LibFix LibList.\nRequire Import JsSyntax JsSyntaxAux JsCommon JsCommonAux JsPreliminary.\nRequire Import JsInterpreterMonads JsInterpreter JsPrettyInterm JsPrettyRules.\n\nLtac tryfalse_nothing :=\n  try match goal with x: nothing |- _ => destruct x end;\n  tryfalse.\n\n(**************************************************************)\n(** ** Implicit Types -- copied from JsPreliminary *)\n\nImplicit Type b : bool.\nImplicit Type n : number.\nImplicit Type k : int.\nImplicit Type s : string.\nImplicit Type i : literal.\nImplicit Type l : object_loc.\nImplicit Type w : prim.\nImplicit Type v : value.\nImplicit Type r : ref.\nImplicit Type ty : type.\n\nImplicit Type rt : restype.\nImplicit Type rv : resvalue.\nImplicit Type lab : label.\nImplicit Type labs : label_set.\nImplicit Type R : res.\nImplicit Type o : out.\nImplicit Type ct : codetype.\n\nImplicit Type x : prop_name.\nImplicit Type str : strictness_flag.\nImplicit Type m : mutability.\nImplicit Type Ad : attributes_data.\nImplicit Type Aa : attributes_accessor.\nImplicit Type A : attributes.\nImplicit Type Desc : descriptor.\nImplicit Type D : full_descriptor.\n\nImplicit Type L : env_loc.\nImplicit Type E : env_record.\nImplicit Type Ed : decl_env_record.\nImplicit Type X : lexical_env.\nImplicit Type O : object.\nImplicit Type S : state.\nImplicit Type C : execution_ctx.\nImplicit Type P : object_properties_type.\nImplicit Type W : result.\n\nImplicit Type e : expr.\nImplicit Type p : prog.\nImplicit Type t : stat.\n\nImplicit Type T : Type.\n\n\n(**************************************************************)\n(** Correctness Properties *)\n\nRecord runs_type_correct runs :=\n  make_runs_type_correct {\n    runs_type_correct_expr : forall S C e o,\n       runs_type_expr runs S C e = o ->\n       red_expr S C (expr_basic e) o;\n    runs_type_correct_stat : forall S C t o,\n       runs_type_stat runs S C t = o ->\n       red_stat S C (stat_basic t) o;\n    runs_type_correct_prog : forall S C p o,\n       runs_type_prog runs S C p = o ->\n       red_prog S C (prog_basic p) o;\n\n    runs_type_correct_call : forall S C l v vs o,\n       runs_type_call runs S C l v vs = o ->\n       red_expr S C (spec_call l v vs) o;\n\n    runs_type_correct_call_prealloc : forall S C l B args o,\n       runs_type_call_prealloc runs S C B l args = result_some (specret_out o) ->\n       red_expr S C (spec_call_prealloc B l args) o;\n\n    runs_type_correct_construct : forall S C co l args o, \n      runs_type_construct runs S C co l args = o ->\n      red_expr S C (spec_construct_1 co l args) o;\n\n    runs_type_correct_function_has_instance : forall S C (lo lv : object_loc) o,\n       runs_type_function_has_instance runs S lo lv = o ->\n       red_expr S C (spec_function_has_instance_2 lv lo) o;\n\n    runs_type_correct_get_args_for_apply : forall S C array (index n : int) y,\n       runs_type_get_args_for_apply runs S C array index n = result_some y ->\n       red_spec S C (spec_function_proto_apply_get_args array index n) y;\n\n    runs_type_correct_object_has_instance : forall S C B l v o,\n       runs_type_object_has_instance runs S C B l v = result_some (specret_out o) ->\n       red_expr S C (spec_object_has_instance_1 B l v) o;\n\n    runs_type_correct_stat_while : forall S C rv ls e t o,\n       runs_type_stat_while runs S C rv ls e t = o ->\n       red_stat S C (stat_while_1 ls e t rv) o;\n    runs_type_correct_stat_do_while : forall S C rv ls e t o,\n       runs_type_stat_do_while runs S C rv ls e t = o ->\n       red_stat S C (stat_do_while_1 ls t e rv) o;\n    runs_type_correct_stat_for_loop : forall S C labs rv eo2 eo3 t o,\n       runs_type_stat_for_loop runs S C labs rv eo2 eo3 t = o ->\n       red_stat S C (stat_for_2 labs rv eo2 eo3 t) o;\n    runs_type_correct_object_delete : forall S C l x str o,\n       runs_type_object_delete runs S C l x str = o ->\n       red_expr S C (spec_object_delete l x str) o;\n    runs_type_correct_object_get_own_prop : forall S C l x sp,\n       runs_type_object_get_own_prop runs S C l x = result_some sp ->\n       red_spec S C (spec_object_get_own_prop l x) sp;\n    runs_type_correct_object_get_prop : forall S C l x sp,\n       runs_type_object_get_prop runs S C l x = result_some sp ->\n       red_spec S C (spec_object_get_prop l x) sp;\n    runs_type_correct_object_get : forall S C l x o,\n       runs_type_object_get runs S C l x = o ->\n       red_expr S C (spec_object_get l x) o;\n    runs_type_correct_object_proto_is_prototype_of : forall S C lthis l o,\n       runs_type_object_proto_is_prototype_of runs S lthis l = o ->\n       red_expr S C (spec_call_object_proto_is_prototype_of_2_3 lthis l) o;\n    runs_type_correct_object_put : forall S C l x v str o,\n       runs_type_object_put runs S C l x v str = o ->\n       red_expr S C (spec_object_put l x v str) o;\n    runs_type_correct_equal : forall S C v1 v2 o,\n       runs_type_equal runs S C v1 v2 = o ->\n       red_expr S C (spec_equal v1 v2) o;\n    runs_type_correct_to_integer : forall S C v o,\n       runs_type_to_integer runs S C v = o ->\n       red_expr S C (spec_to_integer v) o;\n    runs_type_correct_to_string : forall S C v o,\n       runs_type_to_string runs S C v = o ->\n       red_expr S C (spec_to_string v) o;\n\n    (* ARRAYS *)\n    runs_type_correct_array_element_list : forall S C l oes o k,\n       runs_type_array_element_list runs S C l oes k = o ->\n       red_expr S C (expr_array_3 l oes k) o;\n\n    runs_type_correct_object_define_own_prop_array_loop : \n      forall S C l newLen oldLen newLenDesc newWritable throw o \n             (def : state -> prop_name -> descriptor -> strictness_flag -> specres nothing) \n             (def_correct : forall S str o x Desc,\n                def S x Desc str = res_out o ->\n                red_expr S C (spec_object_define_own_prop_1 builtin_define_own_prop_default l x Desc str) o),\n       runs_type_object_define_own_prop_array_loop runs S C l newLen oldLen newLenDesc newWritable throw def = o -> \n       red_expr S C (spec_object_define_own_prop_array_3l l newLen oldLen newLenDesc newWritable throw) o;\n\n     runs_type_correct_array_join_elements : forall S C l k length sep s o, \n       runs_type_array_join_elements runs S C l k length sep s = result_some (specret_out o) ->\n       red_expr S C (spec_call_array_proto_join_elements l k length sep s) o\n  }.\n\n\n(**************************************************************)\n(** Useful Tactics *)\n\nLtac absurd_neg :=\n  let H := fresh in\n  introv H; inverts H; tryfalse.\n\nHint Constructors abort.\n\n\n(**************************************************************)\n(** General Lemmas *)\n\nLemma arguments_from_spec_1 : forall args,\n  exists v, arguments_from args (v::nil)\n         /\\ get_arg 0 args = v.\nProof.\n  Hint Constructors arguments_from.\n  intros. destruct args as [|v vs].\n  exists undef. splits*.\n  exists v. splits*.\nQed.\n\n\nLemma res_overwrite_value_if_empty_empty : forall R,\n  res_overwrite_value_if_empty resvalue_empty R = R.\nProof. introv. unfolds. cases_if~. destruct R; simpls; inverts~ e. Qed.\n\nLemma res_type_res_overwrite_value_if_empty : forall rv R,\n  res_type R = res_type (res_overwrite_value_if_empty rv R).\nProof.\n  introv. destruct R. unfold res_overwrite_value_if_empty. simpl.\n  cases_if; reflexivity.\nQed.\n\nLemma res_label_res_overwrite_value_if_empty : forall rv R,\n  res_label R = res_label (res_overwrite_value_if_empty rv R).\nProof.\n  introv. destruct R. unfold res_overwrite_value_if_empty. simpl.\n  cases_if; reflexivity.\nQed.\n\nLemma res_overwrite_value_if_empty_resvalue : forall rv1 rv2, exists rv3,\n  res_normal rv3 = res_overwrite_value_if_empty rv1 rv2 /\\ (rv3 = rv1 \\/ rv3 = rv2).\nProof. introv. unfolds res_overwrite_value_if_empty. cases_if*. Qed.\n\n\nLemma get_arg_correct : forall args vs,\n  arguments_from args vs ->\n  forall num,\n    num < length vs ->\n    get_arg num args = LibList.nth num vs.\nProof.\n  introv A. induction~ A.\n   introv I. false I. lets (I'&_): (rm I). inverts~ I'.\n   introv I. destruct* num. rewrite nth_succ. rewrite <- IHA.\n    unfolds. repeat rewrite~ nth_def_nil.\n    rewrite length_cons in I. nat_math.\n   introv I. destruct* num. rewrite nth_succ. rewrite <- IHA.\n    unfolds. rewrite~ nth_def_succ.\n    rewrite length_cons in I. nat_math.\nQed.\n\nLemma get_arg_correct_0 : forall args,\n  arguments_from args (get_arg 0 args :: nil).\nProof. introv. destruct args; do 2 constructors. Qed.\n\nLemma get_arg_correct_1 : forall args,\n  arguments_from args (get_arg 0 args :: get_arg 1 args :: nil).\nProof. introv. destruct args as [|? [|? ?]]; do 3 constructors. Qed.\n\nLemma get_arg_correct_2 : forall args,\n  arguments_from args (get_arg 0 args :: get_arg 1 args :: get_arg 2 args :: nil).\nProof. introv. destruct args as [|? [|? [|? ?]]]; do 4 constructors. Qed.\n\nLemma get_arg_first_and_rest_correct : forall args v lv,\n  (v, lv) = get_arg_first_and_rest args <-> \n  arguments_first_and_rest args (v, lv).\nProof.\n  induction args; introv; splits; introv Hyp; \n  unfolds get_arg_first_and_rest; unfolds get_arg; \n  simpls; inverts~ Hyp.\nQed.\n\nLemma and_impl_left : forall P1 P2 P3 : Prop,\n  (P1 -> P2) ->\n  P1 /\\ P3 ->\n  P2 /\\ P3.\nProof. auto*. Qed.\n\nLtac applys_and_base L :=\n  applys~ and_impl_left; [applys~ L|]; try reflexivity.\n\nTactic Notation \"applys_and\" constr(E) :=\n  applys_and_base (>> E).\n\nTactic Notation \"applys_and\" constr(E) constr(A1) :=\n  applys_and_base (>> E A1).\n\nTactic Notation \"applys_and\" constr(E) constr(A1) constr(A2) :=\n  applys_and_base (>> E A1 A2).\n\nTactic Notation \"applys_and\" constr(E) constr(A1) constr(A2) constr(A3) :=\n  applys_and_base (>> E A1 A2 A3).\n\nLtac constructors_and :=\n  let H := fresh in\n  eapply and_impl_left; [ intro H; constructors; exact H |].\n\n\nLemma run_callable_correct : forall S v co,\n  run_callable S v = Some co ->\n  callable S v co.\nProof.\n  introv E. destruct v; simpls~.\n   inverts~ E.\n   sets_eq <- B: (pick_option (object_binds S o)). destruct B; simpls; tryfalse.\n    exists o0. splits~. forwards~: @pick_option_correct EQB. inverts~ E.\nQed.\n\n\n(**************************************************************)\n(** Monadic Constructors, Lemmas *)\n\n(* Shared defs *)\n\n(** [eqabort o1 o] assert that [o1] and [o] are equal\n    and satisfy the [abort] predicate. *)\n\nDefinition eqabort o1 o :=\n  o = o1 /\\ abort o.\n\nLtac prove_abort :=\n  solve [ assumption | (constructor; absurd_neg) ].\n\n(** [isout W Pred] asserts that [W] is in fact\n    an outcome that satisfies [Pred]. *)\n\nDefinition isout W (Pred:out->Prop) :=\n  exists o1, W = res_out o1 /\\ Pred o1.\n\nHint Unfold isout.\nHint Unfold eqabort.\n\n(* Generic *)\n\nLemma if_empty_label_out : forall T K S R (o : T),\n  if_empty_label S R K = result_some o ->\n  res_label R = label_empty /\\ K tt = result_some o.\nProof. introv H. unfolds in H. cases_if; tryfalse. eexists; auto*. Qed.\n\nLemma if_some_out : forall (A B : Type) (oa : option A) K (b : B),\n  if_some oa K = result_some b ->\n  exists (a:A), oa = Some a /\\ K a = result_some b.\nProof. introv E. destruct* oa; tryfalse. Qed.\n\nLemma if_result_some_out : forall (A B : Type) (W : resultof A) K (b : B),\n  if_result_some W K = result_some b ->\n  exists (y : A), W = result_some y /\\ K y = result_some b.\nProof. introv H. destruct* W; tryfalse. Qed.\n\nLemma if_some_or_default_out : forall (A B : Type) (oa : option A) d K (b : B),\n  if_some_or_default oa d K = b ->\n     (oa = None /\\ d = b)\n  \\/ (exists a, oa = Some a /\\ K a = b).\nProof. introv E. destruct* oa; tryfalse. Qed.\n\n\n(* Results *)\n\nDefinition if_ter_post (K : _ -> _ -> result) o o1 :=\n     (o1 = out_div /\\ o = o1)\n  \\/ (exists S R, o1 = out_ter S R /\\ K S R = o).\n\nLemma if_ter_out : forall W K o,\n  if_ter W K = res_out o ->\n  isout W (if_ter_post K o).\nProof.\n  introv H. destruct W as [[|o1]| | | ]; simpls; tryfalse_nothing.\n  exists o1. splits~. unfolds. destruct o1 as [|S R].\n   inverts* H.\n   jauto.\nQed.\n\nDefinition if_success_state_post rv0 (K : _ -> _ -> result) o o1 :=\n  (o1 = out_div /\\ o = o1) \\/\n  (exists S R, o1 = out_ter S R /\\ res_type R = restype_throw /\\ o = out_ter S R) \\/\n  (exists S R, o1 = out_ter S R /\\ res_type R <> restype_throw /\\\n    res_type R <> restype_normal /\\ o = out_ter S (res_overwrite_value_if_empty rv0 R)) \\/\n  exists S rv, o1 = out_ter S (res_normal rv) /\\\n    K S (ifb rv = resvalue_empty then rv0 else rv) = res_out o.\n\nLemma if_success_state_out : forall rv W K o,\n  if_success_state rv W K = o ->\n  isout W (if_success_state_post rv K o).\nProof.\n  introv E. forwards~ (o1&WE&P): if_ter_out (rm E). subst W. eexists. splits*.\n  inversion_clear P as [?|(S&R&?&H)]. branch~ 1.\n  substs. destruct R as [rt rv' rl]. destruct~ rt; simpls;\n    try solve [branch 3; repeat eexists; [discriminate | discriminate | inverts~ H]].\n   forwards~ (?&?): if_empty_label_out (rm H). simpls. substs.\n    branch 4. repeat eexists. auto*.\n   inverts H. branch 2. repeat eexists.\nQed.\n\nDefinition if_success_post (K : _ -> _ -> result) o o1 :=\n  eqabort o1 o \\/\n  exists S rv, o1 = out_ter S (res_normal rv) /\\ K S rv = o.\n\nLemma if_success_out : forall W K o,\n  if_success W K = res_out o ->\n  isout W (if_success_post K o).\nProof.\n  introv E. forwards~ (o1&WE&P): if_ter_out (rm E). subst W. eexists. splits*.\n  inversion_clear P as [[? ?]|(S&R&?&H)]. substs. branch~ 1.\n  substs. destruct R as [rt rv' rl]. destruct~ rt; simpls;\n     try solve [inverts H; branch 1; splits~; prove_abort].\n   forwards~ (?&?): if_empty_label_out (rm H). simpls. substs.\n    branch 2. repeat eexists. auto*.\nQed.\n\n  (* Documentation: same with unfolding:\n    Lemma if_success_out : forall W K o,\n      if_success W K = o ->\n      exists o1, W = res_out o1 /\\\n       (   (o = o1 /\\ abort o)\n        \\/ (exists S rv, o1 = out_ter S rv /\\ K S rv = o)).\n  *)\n\nDefinition if_void_post (K : _ -> result) o o1 :=\n  eqabort o1 o \\/\n  exists S, o1 = out_void S /\\ K S = o.\n\nLemma if_void_out : forall W K o,\n  if_void W K = o ->\n  isout W (if_void_post K o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_success_out (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&?&?)]; subst; [ left* | right ].\n  exists S. destruct R; tryfalse. auto.\nAdmitted. (*faster*)\n\n(* if_not_throw *)\n\nDefinition if_not_throw_post (K : _ -> _ -> result) o o1 :=\n  eqabort o1 o \\/\n  (exists S R, o1 = out_ter S R /\\\n     ((res_type R <> restype_throw /\\ K S R = o) \\/\n      (res_type R  = restype_throw /\\ o = o1))).\n\nHint Extern 1 (_ <> _ :> restype) => congruence.\n\nLemma if_not_throw_out : forall W K o,\n  if_not_throw W K = o -> \n  isout W (if_not_throw_post K o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1 & WE & P): if_ter_out (rm E).\n  exists o1. split~.\n  unfolds. unfolds in P.\n\n  inversion_clear P as [[? ?] | (S & R & ? & ?)]. branch~ 1.\n  splits~. substs~.\n  right. exists S R; splits~.\n  destruct (res_type R); try solve [left; splits~; discriminate].\n  right; splits~. subst. inverts~ H0.\nQed.\n\nDefinition if_any_or_throw_post (K1 K2 : _ -> _ -> result) o o1 :=\n  (o1 = out_div /\\ o = o1) \\/\n  (exists S R, o1 = out_ter S R /\\\n    (   (res_type R <> restype_throw /\\ K1 S R = o)\n     \\/ (res_type R = restype_throw /\\ exists (v : value), res_value R = v\n           /\\ res_label R = label_empty /\\ K2 S v = o))). (* Didn't worked when writing [exists (v : value), R = res_throw v]. *)\n\nLemma if_any_or_throw_out : forall W K1 K2 o,\n  if_any_or_throw W K1 K2 = res_out o ->\n  isout W (if_any_or_throw_post K1 K2 o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_ter_out (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&?&?)]; subst; [ left* | right ].\n  exists S R. split~. destruct (res_type R); tryfalse; simple*.\n  right. destruct (res_value R); tryfalse; simple*. split*.\n  forwards*: if_empty_label_out.\nAdmitted. (*faster*)\n\nDefinition if_success_or_return_post (K1 : state -> result) (K2 : state -> resvalue -> result) o o1 :=\n     (o1 = out_div /\\ o = o1)\n  \\/ exists S R, o1 = out_ter S R /\\\n     (   (res_type R = restype_normal /\\ res_label R = label_empty /\\ K1 S = o)\n      \\/ (res_type R = restype_return /\\ res_label R = label_empty /\\ K2 S (res_value R) = o)\n      \\/ (res_type R <> restype_normal /\\ res_type R <> restype_return /\\ o1 = o)).\n\nLemma if_success_or_return_out : forall W (K1 : state -> result) (K2 : state -> resvalue -> result) o,\n  if_success_or_return W K1 K2 = o ->\n  isout W (if_success_or_return_post K1 K2 o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_ter_out (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  exists S R. split~. destruct (res_type R); tryfalse; simple*.\n  branch 1. forwards*: if_empty_label_out.\n  branch 3. inverts* E.\n  branch 3. inverts* E.\n  branch 2. forwards*: if_empty_label_out.\n  branch 3. inverts* E.\nAdmitted. (*faster*)\n\n(* TODO: misssing\n    if_normal_continue_or_break *)\n\nDefinition if_break_post (K : _ -> _ -> result) o o1 :=\n     (o1 = out_div /\\ o = o1)\n  \\/ (exists S R, o1 = out_ter S R /\\\n      (   (res_type R <> restype_break /\\ o1 = o)\n       \\/ (res_type R = restype_break /\\ K S R = o))).\n\nLemma if_break_out : forall W K o,\n  if_break W K = o ->\n  isout W (if_break_post K o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_ter_out (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  exists S R. split~. destruct (res_type R); try inverts E; simple*.\nAdmitted. (*faster*)\n\nDefinition if_value_post (K : _ -> _ -> result) o o1 :=\n  eqabort o1 o \\/\n  exists S v, o1 = out_ter S (res_val v) /\\ K S v = o.\n\nLemma if_value_out : forall W K o,\n  if_value W K = res_out o ->\n  isout W (if_value_post K o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_success_out (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. exists___*.\nAdmitted. (*faster*)\n\nDefinition if_bool_post (K : _ -> _ -> result) o o1 :=\n  eqabort o1 o \\/\n  exists S z, o1 = out_ter S (res_val (prim_bool z)) /\\ K S z = o.\n\nLemma if_bool_out : forall W K o,\n  if_bool W K = res_out o ->\n  isout W (if_bool_post K o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_value_out (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. destruct p; tryfalse. exists___*.\nAdmitted. (*faster*)\n\n\nDefinition if_object_post (K : _ -> _ -> result) o o1 :=\n  eqabort o1 o \\/\n  exists S l, o1 = out_ter S (res_val (value_object l)) /\\ K S l = o.\n\nLemma if_object_out : forall W K o,\n  if_object W K = res_out o ->\n  isout W (if_object_post K o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_value_out (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. exists___*.\nAdmitted. (*faster*)\n\n\nDefinition if_string_post (K : _ -> _ -> result) o o1 :=\n  eqabort o1 o \\/\n  exists S s, o1 = out_ter S (res_val (prim_string s)) /\\ K S s = o.\n\nLemma if_string_out : forall W K o,\n  if_string W K = res_out o ->\n  isout W (if_string_post K o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_value_out (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. destruct p; tryfalse. exists___*.\nAdmitted. (*faster*)\n\n\nDefinition if_number_post (K : _ -> _ -> result) o o1 :=\n  eqabort o1 o \\/\n  exists S n, o1 = out_ter S (res_val (prim_number n)) /\\ K S n = o.\n\nLemma if_number_out : forall W K o,\n  if_number W K = res_out o ->\n  isout W (if_number_post K o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1 & WE & P): if_value_out (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. destruct p; tryfalse. exists___*.\nAdmitted. (*faster*)\n\nDefinition if_prim_post (K : _ -> _ -> result) o o1 :=\n  eqabort o1 o \\/\n  exists S w, o1 = out_ter S (res_val (value_prim w)) /\\ K S w = o.\n\nLemma if_prim_out : forall W K o,\n  if_prim W K = res_out o ->\n  isout W (if_prim_post K o).\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_value_out (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. exists___*.\nAdmitted. (*faster*)\n\nLemma if_abort_out : forall T o K (t : T),\n  if_abort o K = result_some t ->\n  abort o /\\ K tt = result_some t.\nProof. introv H. destruct* o. simpls. cases_if*. Qed.\n\nDefinition if_spec_post (A B:Type) K (b:specret B) y :=\n     (exists o, y = specret_out o /\\ b = specret_out o /\\ abort o)\n  \\/ (exists (S:state) (a:A), y = specret_val S a /\\ K S a = result_some b).\n\nLemma if_spec_out : forall (A B : Type) (W : specres A) K (b : specret B),\n  if_spec W K = result_some b ->\n  exists y, W = result_some y /\\ if_spec_post K b y.\nProof.\n  introv E. unfolds in E. unfolds in E.\n  destruct W; tryfalse. exists s. split~.\n  unfolds. destruct s; [ right | left ].\n    exists___*.\n    lets (?&H): if_abort_out E. inverts H. exists___*.\nAdmitted. (* faster *)\n\n\nDefinition if_ter_spec_post T K (y:specret T) o :=\n     (y = specret_out o /\\ abort o)\n  \\/ (exists S, exists (R : res), o = out_ter S R /\\ K S R = result_some y).\n\nLemma if_ter_spec : forall T W K (y : specret T),\n  if_ter W K = result_some y ->\n  isout W (if_ter_spec_post K y).\nProof.\n  introv H. destruct W as [[|o1]| | | ]; simpls; tryfalse_nothing.\n  exists o1. splits~. unfolds. destruct o1 as [|S R].\n   inverts* H.\n   jauto.\nQed.\n\nDefinition if_success_spec_post T K (y:specret T) o :=\n     (y = specret_out o /\\ abort o)\n  \\/ (exists S, exists (rv : resvalue), o = out_ter S rv /\\ K S rv = result_some y).\n\nLemma if_success_spec : forall T W K (y : specret T),\n  if_success W K = result_some y ->\n  exists (o : out), W = o /\\ if_success_spec_post K y o. (* LATER:  Change to [isout] *)\nProof.\n  introv E. forwards~ (o1&WE&P): if_ter_spec (rm E). subst W. eexists. splits*.\n  inversion_clear P as [[? ?]|(S&R&?&H)]. substs. branch~ 1.\n  substs. destruct R as [rt rv' rl]. destruct~ rt; simpls;\n     try solve [inverts H; branch 1; splits~; prove_abort].\n   forwards~ (?&?): if_empty_label_out (rm H). simpls. substs.\n    branch 2. repeat eexists. auto*.\nQed.\n\nDefinition if_value_spec_post T K (y:specret T) o :=\n     (y = specret_out o /\\ abort o)\n  \\/ (exists S, exists (v : value), o = out_ter S v /\\ K S v = result_some y).\n\nLemma if_value_spec : forall T W K (y : specret T),\n  if_value W K = result_some y ->\n  exists (o : out), W = o /\\ if_value_spec_post K y o.\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_success_spec (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. exists___*.\nAdmitted. (*faster*)\n\nDefinition if_prim_spec_post T K (y:specret T) o :=\n     (y = specret_out o /\\ abort o)\n  \\/ (exists S, exists (w : prim), o = out_ter S w /\\ K S w = result_some y).\n\nLemma if_prim_spec : forall T W K (y : specret T),\n  if_prim W K = result_some y ->\n  exists (o : out), W = o /\\ if_prim_spec_post K y o.\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_value_spec (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. exists___*.\nAdmitted. (*faster*)\n\nDefinition if_bool_spec_post T K (y:specret T) o :=\n     (y = specret_out o /\\ abort o)\n  \\/ (exists S, exists (b : bool), o = out_ter S b /\\ K S b = result_some y).\n\nLemma if_bool_spec : forall T W K (y : specret T),\n  if_bool W K = result_some y ->\n  exists (o : out), W = o /\\ if_bool_spec_post K y o.\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_value_spec (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. destruct p; tryfalse. exists___*.\nAdmitted. (*faster*)\n\nDefinition if_number_spec_post T K (y:specret T) o :=\n     (y = specret_out o /\\ abort o)\n  \\/ (exists S, exists (n : number), o = out_ter S n /\\ K S n = result_some y).\n\nLemma if_number_spec : forall T W K (y : specret T),\n  if_number W K = result_some y ->\n  exists (o : out), W = o /\\ if_number_spec_post K y o.\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_value_spec (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. destruct p; tryfalse. exists___*.\nAdmitted. (*faster*)\n\nDefinition if_string_spec_post T K (y:specret T) o :=\n     (y = specret_out o /\\ abort o)\n  \\/ (exists S, exists (s : string), o = out_ter S s /\\ K S s = result_some y).\n\nLemma if_string_spec : forall T W K (y : specret T),\n  if_string W K = result_some y ->\n  exists (o : out), W = o /\\ if_string_spec_post K y o.\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_value_spec (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. destruct p; tryfalse. exists___*.\nAdmitted. (*faster*)\n\nDefinition if_object_spec_post T K (y:specret T) o :=\n     (y = specret_out o /\\ abort o)\n  \\/ (exists S, exists (l : object_loc), o = out_ter S l /\\ K S l = result_some y).\n\nLemma if_object_spec : forall T W K (y : specret T),\n  if_object W K = result_some y ->\n  exists (o : out), W = o /\\ if_object_spec_post K y o.\nProof.\n  introv E. unfolds in E.\n  forwards~ (o1&WE&P): if_value_spec (rm E). exists o1. split~.\n  unfolds. unfolds in P.\n  inversion_clear P as [[? ?]|(S&R&H&E)]; subst; [ left* | right ].\n  destruct R; tryfalse. exists___*.\nQed.\n\n\n(************************************************************)\n(* ** Correctness Tactics *)\n\n(** [prove_not_intercept] proves a goal of\n    the form \"~ abort_intercepted_* _\" *)\n\nLtac prove_not_intercept :=\nlet H := fresh in intros H; try solve [ inversion H; false~ ].\n\nHint Extern 1 (~ abort_intercepted_expr _) => prove_not_intercept.\nHint Extern 1 (~ abort_intercepted_stat _) => prove_not_intercept.\nHint Extern 1 (~ abort_intercepted_prog _) => prove_not_intercept.\n\nLtac abort_tactic L :=\n  try subst; apply L;\n  [ simpl; congruence\n  | try prove_abort\n  | try prove_not_intercept ].\n\nTactic Notation \"abort_expr\" :=\n    abort_tactic red_expr_abort.\nTactic Notation \"abort_stat\" :=\n    abort_tactic red_stat_abort.\nTactic Notation \"abort_prog\" :=\n    abort_tactic red_prog_abort.\nTactic Notation \"abort_spec\" :=\n    abort_tactic red_spec_abort.\nTactic Notation \"abort\" :=\n  match goal with\n  | |- red_expr _ _ _ _ => abort_expr\n  | |- red_stat _ _ _ _ => abort_stat\n  | |- red_prog _ _ _ _ => abort_prog\n  | |- red_spec _ _ _ _ => abort_spec\n  end.\n\n(** [run_select_ifres] selects the appropriate \"out\" lemma *)\n\nLtac run_select_extra T := fail.\n\nLtac run_select_ifres H :=\n  match type of H with ?T = _ => match T with\n  | @if_ter nothing _ _ => constr:(if_ter_out)\n  | @if_success nothing _ _ => constr:(if_success_out)\n  | @if_value nothing _ _ => constr:(if_value_out)\n  | @if_void nothing _ _ => constr:(if_void_out)\n  | if_break _ _ => constr:(if_break_out)\n  | @if_object nothing _ _ => constr:(if_object_out)\n  | @if_bool nothing _ _ => constr:(if_bool_out)\n  | @if_string nothing _ _ => constr:(if_string_out)\n  | @if_number nothing _ _ => constr:(if_number_out)\n  | @if_prim nothing _ _ => constr:(if_prim_out)\n  | if_ter _ _ => constr:(if_ter_spec)\n  | if_success _ _ => constr:(if_success_spec)\n  | if_value _ _ => constr:(if_value_spec)\n  | if_bool _ _ => constr:(if_bool_spec)\n  | if_string _ _ => constr:(if_string_spec)\n  | if_object _ _ => constr:(if_object_spec)\n  | if_number _ _ => constr:(if_number_spec)\n  | if_prim _ _ => constr:(if_prim_spec)\n  | if_spec _ _ => constr:(if_spec_out)\n  | if_void _ _ => constr:(if_void_out)\n  | if_not_throw _ _ => constr:(if_not_throw_out)\n  | if_any_or_throw _ _ _ => constr:(if_any_or_throw_out)\n  | if_success_or_return _ _ _ => constr:(if_success_or_return_out)\n  | if_success_state _ _ _ => constr:(if_success_state_out)\n  | ?x => run_select_extra T\n  end end.\n\n(* template:\nLtac run_select_extra T ::=\n  match T with\n  | if_any_or_throw _ _ _ => constr:(if_any_or_throw_out)\n  end.\n*)\n\n(** [run_select_proj] is used to obtain automatically\n    the right correctness lemma out of the correctness record *)\n\nLtac run_select_proj_extra_error HT := fail.\nLtac run_select_proj_extra_ref HT := fail.\nLtac run_select_proj_extra_conversions HT := fail.\nLtac run_select_proj_extra_construct HT := fail.\nLtac run_select_proj_extra_get_value HT := fail.\n\nLtac run_select_proj H :=\n  match type of H with ?T = _ => let HT := get_head T in\n  match HT with\n  | runs_type_expr => constr:(runs_type_correct_expr)\n  | runs_type_stat => constr:(runs_type_correct_stat)\n  | runs_type_prog => constr:(runs_type_correct_prog)\n  | runs_type_call => constr:(runs_type_correct_call)\n  | runs_type_construct => constr:(runs_type_correct_construct)\n  | runs_type_function_has_instance => constr:(runs_type_correct_function_has_instance)\n  | runs_type_object_has_instance => constr:(runs_type_correct_object_has_instance)\n  | runs_type_stat_while => constr:(runs_type_correct_stat_while)\n  | runs_type_stat_do_while => constr:(runs_type_correct_stat_do_while)\n  | runs_type_stat_for_loop => constr:(runs_type_correct_stat_for_loop)\n  | runs_type_object_delete => constr:(runs_type_correct_object_delete)\n  | runs_type_object_get_own_prop => constr:(runs_type_correct_object_get_own_prop)\n  | runs_type_object_get_prop => constr:(runs_type_correct_object_get_prop)\n  | runs_type_object_get => constr:(runs_type_correct_object_get)\n  | runs_type_object_proto_is_prototype_of => constr:(runs_type_correct_object_proto_is_prototype_of)\n  | runs_type_object_put => constr:(runs_type_correct_object_put)\n  | runs_type_equal => constr:(runs_type_correct_equal)\n  | runs_type_to_integer => constr:(runs_type_correct_to_integer)\n  | runs_type_to_string => constr:(runs_type_correct_to_string)\n  | runs_type_array_element_list => constr:(runs_type_correct_array_element_list)\n  | runs_type_object_define_own_prop_array_loop => constr:(runs_type_correct_object_define_own_prop_array_loop)\n  | ?x => run_select_proj_extra_error HT\n  | ?x => run_select_proj_extra_ref HT\n  | ?x => run_select_proj_extra_conversions HT\n  | ?x => run_select_proj_extra_construct HT\n  | ?x => run_select_proj_extra_get_value HT\n  end end.\n\n(** [prove_runs_type_correct] discharges the trivial goal\n    that consists in invoking the induction hypothesis*)\n\nLtac prove_runs_type_correct :=\n  match goal with |- runs_type_correct _ => assumption end.\n\n(* [run_hyp H] exploits the induction hypothesis\n   on [runs_type_correct] to the hypothesis [H] *)\n\nLtac run_hyp_core H R :=\n  let H' := fresh in rename H into H';\n  let Proj := run_select_proj H' in\n  lets R: Proj (rm H');\n  try prove_runs_type_correct.\n\n(** [select_ind_hyp] returns the induction hypothesis\n    on [runs_type_correct] *)\n\nLtac select_ind_hyp tt :=\n  match goal with IH: runs_type_correct _ |- _ => constr:(IH) end.\n\n(* old run_hyp H:\nLtac run_hyp_core H R :=\n  let H' := fresh in rename H into H';\n  let IH := select_ind_hyp tt in\n  let Proj := run_select_proj H' in\n  lets R: Proj IH (rm H').\n*)\n\nTactic Notation \"run_hyp\" hyp(H) \"as\" simple_intropattern(R) :=\n  run_hyp_core H R.\n\nTactic Notation \"run_hyp\" hyp(H) :=\n  let T := fresh in rename H into T;\n  run_hyp T as H.\n\nTactic Notation \"run_hyp\" :=\n  match goal with H: _ = result_some _ |- _ => run_hyp H end.\n\nTactic Notation \"run_hyp\" \"*\" hyp(H) :=\n  run_hyp H; auto*.\n\nTactic Notation \"run_hyp\" \"*\" :=\n  run_hyp; auto*.\n\n\n(* [run_pre] exploits the appropriate \"out\" lemma, whether it comes\n   from the correctness record or it is an auxiliary lemma. *)\n\nLtac run_pre_ifres H o1 R1 K :=\n   let L := run_select_ifres H in\n   lets (o1&R1&K): L (rm H). (* deconstruction of the \"isout\" *)\n\nLtac run_pre_core H o1 R1 K :=\n   run_pre_ifres H o1 R1 K;\n   let O1 := fresh \"O1\" in\n   try (rename R1 into O1; run_hyp O1 as R1).\n\nTactic Notation \"run_pre\" hyp(H) \"as\" ident(o1) ident(R1) ident(K) :=\n  let T := fresh in rename H into T;\n  run_pre_core T o1 R1 K.\n\nTactic Notation \"run_pre_ifres\" \"as\" ident(o1) ident(R1) :=\n  unfold result_some_out in *; unfold res_to_res_void in * ; unfold result_out in *; unfold res_out in *;\n  (* LATER: improve unfolds *)\n  match goal with H: _ = result_some _ |- _ =>\n    let T := fresh in rename H into T;\n    run_pre_ifres T o1 R1 H end.\n\nTactic Notation \"run_pre\" \"as\" ident(o1) ident(R1) :=\n  unfold result_some_out in *; unfold res_to_res_void in * ; unfold result_out in *; unfold res_out in *;\n  (* LATER: improve unfolds *)\n  match goal with H: _ = result_some _ |- _ =>\n    let T := fresh in rename H into T;\n    run_pre_core T o1 R1 H end.\n\nTactic Notation \"run_pre\" \"as\" ident(o1) :=\n  let R1 := fresh \"R1\" o1 in\n  run_pre as o1 R1.\n\nTactic Notation \"run_pre\" :=\n  let o1 := fresh \"o1\" in let R1 := fresh \"R1\" in\n  run_pre as o1 R1.\n\n(** [run_apply Red o1 R1] applys a reduction rule on a given\n    [o1] or reduction reaching [o1]. *)\n\nTactic Notation \"run_apply\" constr(Red) constr(o1orR1) :=\n  applys Red o1orR1.\n\nTactic Notation \"run_apply\" constr(Red) constr(o1) constr(R1) :=\n  first [ applys Red (rm R1)\n        | applys Red o1 ].\n\n(** [run_post] decomposes the conclusion of the \"out\"\n    lemma *)\n\nLtac run_post_run_expr_get_value := fail.\n\nLtac run_post_extra := fail.\n\nLtac run_post_core :=\n  let Er := fresh \"Er\" in\n  let Ab := fresh \"Ab\" in\n  let S := fresh \"S\" in\n  let O1 := fresh \"O1\" in\n  let go H X :=\n    destruct H as [(Er&Ab)|(S&X&O1&H)];\n    [ try abort | try subst_hyp O1 ] in\n  match goal with\n  | H: if_ter_post _ _ _ |- _ =>\n    let R := fresh \"R\" in go H R\n  | H: if_success_post _ _ _ |- _ =>\n    let rv := fresh \"rv\" in go H rv\n  | H: if_value_post _ _ _ |- _ =>\n    let v := fresh \"v\" in go H v\n  | H: if_void_post _ _ _ |- _ =>\n    destruct H as [(Er&Ab)|(S&O1&H)];\n    [ try abort | try subst_hyp O1 ]\n  | H: if_not_throw_post _ _ _ |- _ =>\n    let R := fresh \"R\" in\n    let N := fresh \"N\" in let v := fresh \"v\" in\n    let E := fresh \"E\" in let L := fresh \"L\" in\n    destruct H as [(Er & Ab) | (S & R & O1 & [(N & H) | (N & H)])];\n    [try abort | try subst_hyp O1 | try abort]\n  | H: if_break_post _ _ _ |- _ =>\n    let R := fresh \"R\" in let E := fresh \"E\" in\n    let HT := fresh \"HT\" in\n    destruct H as [(Er&E)|(S&R&O1&[(HT&E)|(HT&H)])];\n    [ try abort | try subst_hyp O1 | try subst_hyp O1 ]\n  | H: if_object_post _ _ _ |- _ =>\n    let l := fresh \"l\" in go H l\n  | H: if_bool_post _ _ _ |- _ =>\n    let b := fresh \"b\" in go H b\n  | H: if_string_post _ _ _ |- _ =>\n    let s := fresh \"s\" in go H s\n  | H: if_number_post _ _ _ |- _ =>\n    let m := fresh \"m\" in go H m\n  | H: if_prim_post _ _ _ |- _ =>\n    let w := fresh \"w\" in go H w\n  | H: if_ter_spec_post _ _ _ |- _ =>\n    let R := fresh \"R\" in go H R\n  | H: if_success_spec_post _ _ _ |- _ =>\n    let rv := fresh \"rv\" in go H rv\n  | H: if_value_spec_post _ _ _ |- _ =>\n    let v := fresh \"v\" in go H v\n  | H: if_bool_spec_post _ _ _ |- _ =>\n    let b := fresh \"b\" in go H b\n  | H: if_string_spec_post _ _ _ |- _ =>\n    let s := fresh \"s\" in go H s\n  | H: if_object_spec_post _ _ _ |- _ =>\n    let l := fresh \"l\" in go H l\n  | H: if_number_spec_post _ _ _ |- _ =>\n    let m := fresh \"m\" in go H m\n  | H: if_prim_spec_post _ _ _ |- _ =>\n    let w := fresh \"w\" in go H w\n  | H: if_spec_post _ _ _ |- _ =>\n    let o := fresh \"o\" in let Er' := fresh \"Er\" in\n    let S := fresh \"S\" in let a := fresh \"a\" in\n    destruct H as [(o&Er&Er'&Ab)|(S&a&O1&H)];\n    [ try abort | try subst_hyp O1 ]\n  | H: if_any_or_throw_post _ _ _ _ |- _ =>\n    let R := fresh \"R\" in\n    let N := fresh \"N\" in let v := fresh \"v\" in\n    let E := fresh \"E\" in let L := fresh \"L\" in\n    destruct H as [(Er&Ab)|(S&R&O1&[(N&H)|(N&v&E&L&H)])];\n    [ try subst_hyp Er; try subst_hyp Ab | try subst_hyp O1 | try subst_hyp O1 ]\n  | H: if_success_or_return_post _ _ _ _ |- _ =>\n     let S := fresh \"S\" in let R := fresh \"R\" in\n     let o1 := fresh \"o1\" in let W1 := fresh \"W1\" in let O1 := fresh \"O1\" in\n     let E1 := fresh \"E\" in let E2 := fresh \"E\" in\n     destruct H as [(Er&Ab)|(S&R&O1&[(E1&E2&K)|[(E1&E2&K)|(E1&E2&K)]])];\n    [ try subst_hyp Er; try subst_hyp Ab; try abort\n    | try subst_hyp O1 | try subst_hyp O1 | try subst_hyp O1 ]\n  | H: if_success_state_post _ _ _ _ |- _ =>\n    (* LATER: improve the statement of the lemma *)\n     let S := fresh \"S\" in let R := fresh \"R\" in\n     let O1 := fresh \"O1\" in\n     let E1 := fresh \"E\" in let E2 := fresh \"E\" in let rv := fresh \"rv\" in\n     destruct H as [(Er&Ab)|[(S&R&O1&E1&H)|[(S&R&O1&E1&E2&H)|(S&rv&O1&H)]]];\n    [ try subst_hyp Er; try subst_hyp Ab; try abort\n    | try subst_hyp O1 | try subst_hyp O1 | try subst_hyp O1 ]\n  | |- _ => run_post_run_expr_get_value\n  | |- _ => run_post_extra\n  end.\n\n(* template\nLtac run_post_extra ::=\n  let Er := fresh \"Er\" in let Ab := fresh \"Ab\" in\n  let O1 := fresh \"O1\" in let S := fresh \"S\" in\n  match goal with\n  | H: if_any_or_throw_post _ _ _ _ |- _ => ...\n  end.\n\n*)\n\nTactic Notation \"run_post\" :=\n  run_post_core.\n\n(** [run_inv] simplifies equalities in goals\n    by performing inversions on equalities. *)\n\nLtac run_inv :=\n  unfold result_some_out in *; unfold res_to_res_void in * ; unfold out_retn in *; unfold result_out in *;\n  repeat\n  match goal with\n  | H: resvalue_value ?v = resvalue_value ?v |- _ => clear H\n  | H: resvalue_value _ = resvalue_value _ |- _ => inverts H\n  | H: res_spec _ _ = _ |- _ => unfold res_spec in H\n  | H: _ = res_spec _ _ |- _ => unfold res_spec in H\n  | H: res_out _ = _ |- _ => unfold res_out in H\n  | H: _ = res_out _ |- _ => unfold res_out in H\n  | H: res_ter _ _ = _ |- _ => unfold res_ter in H\n  | H: _ = res_ter _ _ |- _ => unfold res_ter in H\n  | H: result_some ?o = result_some ?o |- _ => clear H\n  | H: result_some _ = result_some _ |- _ => inverts H\n  | H: out_ter ?S ?R = out_ter ?S ?R |- _ => clear H\n  | H: out_ter _ _ = out_ter _ _ |- _ => inverts H\n  | H: res_intro ?t ?v ?l = res_intro ?t ?v ?l |- _ => clear H\n  | H: res_intro _ _ _ = res_intro _ _ _ |- _ => inverts H\n  | H: ret _ _ = _ |- _ => unfold ret in H\n  | H: _ = ret _ _ |- _ => unfold ret in H\n  | H: ret_void _ = _ |- _ => unfold ret_void in H\n  | H: _ = ret_void _ |- _ => unfold ret_void in H\n  | H: res_void _ = _ |- _ => unfold res_void in H\n  | H: _ = res_void _ |- _ => unfold res_void in H\n  | H: specret_val ?S ?R = specret_val ?S ?R |- _ => clear H\n  | H: specret_val _ _ = specret_val _ _ |- _ => inverts H\n  | H: specret_out ?o = specret_out ?o |- _ => clear H\n  | H: specret_out _ = _ |- _ => inverts H\n  | H: _ = specret_out _ |- _ => inverts H\n  | H: out_from_retn ?sp = out_from_retn ?sp |- _ => clear H\n  | H: out_from_retn _ = out_from_retn _ |- _ => inverts H\n  end.\n\n(** [runs_inv] is the same as [run_inv] followed by subst. *)\n\nLtac runs_inv :=\n  run_inv; subst.\n\n(** Auxiliary tactics to select/check the current \"out\" *)\n\nLtac run_get_current_out tt :=\n  match goal with\n  | |- red_expr _ _ _ ?o => o\n  | |- red_stat _ _ _ ?o => o\n  | |- red_prog _ _ _ ?o => o\n  | |- red_spec _ _ _ ?o => o\n  | |- red_javascript _ ?o => o\n  end.\n\nLtac run_check_current_out o :=\n  match goal with\n  | |- red_expr _ _ _ o => idtac\n  | |- red_stat _ _ _ o => idtac\n  | |- red_prog _ _ _ o => idtac\n  | |- red_spec _ _ _ o => idtac\n  | |- red_javascript _ o => idtac\n  end.\n\n(** [run_step Red] combines [run_pre], [run_apply Red] and calls\n    [run_post] on the main reduction subgoal, followed\n    with a cleanup using [run_inv] *)\n\nLtac run_step Red :=\n  let o1 := fresh \"o1\" in let R1 := fresh \"R1\" in\n  run_pre as o1 R1;\n  match Red with ltac_wild => idtac | _ =>\n    let o := run_get_current_out tt in\n    run_apply Red o1 R1;\n    try (run_check_current_out o; run_post; run_inv; try assumption)\n  end.\n\n(** [run_step_using Red Lem] combines [run_pre],\n    a forward to exploit the correctness lemma [Lem],\n    [run_apply Red] and calls\n    [run_post] on the main reduction subgoal, followed\n    with a cleanup using [run_inv] *)\n\nLtac run_step_using Red Lem :=\n  let o1 := fresh \"o1\" in let O1 := fresh \"O1\" in\n  let R1 := fresh \"R1\" in\n  run_pre_ifres as o1 O1;\n  lets R1: Lem (rm O1);\n  try prove_runs_type_correct;\n  match Red with ltac_wild => idtac | _ =>\n    let o := run_get_current_out tt in\n    run_apply Red o1 R1;\n    try (run_check_current_out o; run_post; run_inv; try assumption)\n  end.\n\n(** [run_simpl] is intended for simplyfing simple monads\n    that do not match over a result, then run\n    [run_inv] to clean up the goal. *)\n\nLtac run_simpl_run_error H T K := fail.\n\nLtac run_simpl_base H K :=\n  let E := fresh \"E\" in\n  match type of H with ?T = _ => match T with\n  | if_some _ _ =>\n     let x := fresh \"x\" in\n     lets (x&E&K): if_some_out (rm H)\n  | if_some_or_default _ _ _ =>\n     let x := fresh \"x\" in\n     let E1 := fresh \"E\" in let E2 := fresh \"E\" in\n     lets [(E1&E2)|(n&E&K)]: if_some_or_default_out (rm H)\n  | if_empty_label _ _ _ =>\n     lets (E&K): if_empty_label_out (rm H)\n  | ?x => run_simpl_run_error H T K\n  | ?x => run_hyp_core H K\n  end end.\n\n\nLtac run_simpl_core H K :=\n  run_simpl_base H K; run_inv.\n\nTactic Notation \"run_simpl\" ident(H) \"as\" ident(K) :=\n  let T := fresh in rename H into T;\n  run_simpl_core T K.\n\nTactic Notation \"run_simpl\" :=\n  unfold result_some_out in *; unfold res_to_res_void in * ; unfold result_out in *; unfold res_out in *;\n  (* LATER: handle unfold *)\n  match goal with H: _ = result_some _ |- _ =>\n    let H' := fresh in rename H into H';\n    run_simpl_core H' H\n  end.\n\n(** [run Red] is the same as [run_step Red].\n    [run] without arguments is the same as [run_simpl].\n    [runs] is same as [run] followed with [subst]. *)\n\nTactic Notation \"run\" constr(Red) :=\n  run_step Red.\n\nTactic Notation \"run\" \"~\" constr(Red) :=\n  run Red; auto~.\n\nTactic Notation \"run\" \"*\" constr(Red) :=\n  run Red; auto*.\n\nTactic Notation \"run\" constr(Red) \"using\" constr(Lem) :=\n  run_step_using Red Lem.\n\nTactic Notation \"run\" \"~\" constr(Red) \"using\" constr(Lem) :=\n  run Red using Lem; auto~.\n\nTactic Notation \"run\" \"*\" constr(Red) \"using\" constr(Lem) :=\n  run Red using Lem; auto*.\n\n\nTactic Notation \"runs\" constr(Red) :=\n  run Red; subst.\n\nTactic Notation \"runs\" \"~\" constr(Red) :=\n  run Red; subst; auto~.\n\nTactic Notation \"runs\" \"*\" constr(Red) :=\n  run Red; subst; auto*.\n\nTactic Notation \"run\" :=\n  run_simpl.\n\nTactic Notation \"run\" \"~\" :=\n  run; auto~.\n\nTactic Notation \"run\" \"*\" :=\n  run; auto*.\n\nTactic Notation \"runs\" :=\n  run; subst.\n\nTactic Notation \"runs\" \"~\" :=\n  runs; auto~.\n\nTactic Notation \"runs\" \"*\" :=\n  runs; auto*.\n\n\n(* debugging of [run Red]:\n  run_pre as o1 R1.\n    or: run_pre H as o1 R1 K. (* where H is the hypothesis *)\n    or: run_pre_core H o1 R1 K. (* where H is the hypothesis *)\n    or: run_pre_lemma H o1 R1 K. (* where H is the hypothesis *)\n  run_apply __my_red_lemma__ R1. (* where R1 is the red hypothesis *)\n  run_post.\n  run_inv.\n*)\n\n\n(************************************************************)\n(* ** Correctness Lemmas *)\n\nLemma type_of_prim_not_object : forall w,\n  type_of w <> type_object.\nProof. destruct w; simpl; try congruence. Qed.\n\nHint Resolve type_of_prim_not_object.\n\nLemma is_lazy_op_correct : forall op,\n  match is_lazy_op op with\n  | None => regular_binary_op op\n  | Some b => lazy_op op b\n  end.\nProof.\n  Hint Constructors lazy_op.\n  unfold regular_binary_op.\n  intros. destruct op; simple*.\nAdmitted. (* faster *)\n\nLemma run_object_method_correct : forall Z (Proj : _ -> Z) S l (z : Z),\n  run_object_method Proj S l = Some z ->\n  object_method Proj S l z.\nProof.\n  introv B. unfolds. forwards (O&Bi&E): LibOption.map_on_inv B.\n  forwards: @pick_option_correct Bi. exists* O.\nQed.\n\nLemma run_object_heap_set_extensible_correct : forall b S l S',\n  run_object_heap_set_extensible b S l = Some S' ->\n  object_heap_set_extensible b S l S'.\nProof.\n  introv R. unfolds in R. forwards (O&H&E): LibOption.map_on_inv (rm R).\n  forwards: @pick_option_correct (rm H). exists O. splits~.\nQed.\n\nLemma build_error_correct : forall S C vproto vmsg o,\n  build_error S vproto vmsg = o ->\n  red_expr S C (spec_build_error vproto vmsg) o.\nProof.\n  introv R. unfolds in R.\n  match goal with H: context [object_alloc ?s ?o] |- _ => sets_eq X: (object_alloc s o) end.\n  destruct X as (l&S'). cases_if.\n  applys~ red_spec_build_error EQX. run_inv.\n   applys~ red_spec_build_error_1_no_msg.\nQed.\n\nLemma run_error_correct' : forall T S ne o C,\n  run_error S ne = (res_out o : specres T) ->\n  red_expr S C (spec_error ne) o /\\ abort o.\nProof.\n  introv R. unfolds in R. run_pre as o1 R1. forwards R0: build_error_correct (rm R1).\n  applys_and red_spec_error R0. run_post.\n   run_inv. splits~. abort.\n   run_inv. splits; [|prove_abort]. apply~ red_spec_error_1.\nQed.\n\nLemma run_error_correct : forall T S ne o C,\n  run_error S ne = (res_out o : specres T) ->\n  red_expr S C (spec_error ne) o.\nProof. intros. applys* run_error_correct'. Qed.\n\nLemma run_error_correct_2 : forall T S (ne : native_error) o C,\n  run_error S ne = (res_out o : specres T) -> red_expr S C (spec_error ne) o.\nProof. intros. apply* run_error_correct. Qed.\n\nHint Resolve run_error_correct run_error_correct_2.\n\nLtac run_simpl_run_error H T K ::=\n  match T with run_error _ _ =>\n     let N := fresh \"N\" in\n     let C := match goal with |- _ _ ?C _ _ => constr:(C) end in\n     lets (K&N): run_error_correct C (rm H)\n  end.\n\nLemma run_error_not_some_out_res : forall S v T,\n  ~ (run_error S native_error_type = result_some (@specret_out T (out_ter S (res_val v)))).\nProof.\n  set (C := execution_ctx_intro nil nil (value_prim (prim_bool true)) false). introv Hyp.\n  apply run_error_correct' with (C := C) in Hyp. \n  destruct Hyp as (Hred & Habort).\n  inverts Hred. simpls. inverts H.\n  inverts H3. simpls. inverts H.\n  inverts H0. simpls. inverts H.\n  inverts H9. simpls. inverts H.\n  inverts Habort. unfolds abrupt_res.\n  false~ H0. false~ H3.\nAdmitted. (*faster*)\n\nLemma out_error_or_void_correct : forall S C str (ne : native_error) o,\n  out_error_or_void S str ne = o ->\n  red_expr S C (spec_error_or_void str ne) o /\\\n    (~ abort o -> o = out_void S).\nProof.\n  introv E. unfolds in E. cases_if.\n   applys_and red_spec_error_or_void_true.\n   forwards~ (RC&Cr): run_error_correct' E. splits*.\n   inverts E. splits~. apply~ red_spec_error_or_void_false.\nQed.\n\nLemma out_error_or_cst_correct' : forall S C str (ne : native_error) v o,\n  out_error_or_cst S str ne v = o ->\n  red_expr S C (spec_error_or_cst str ne v) o /\\\n    (~ abort o -> o = out_ter S v).\nProof.\n  introv E. unfolds in E. cases_if.\n   applys_and red_spec_error_or_cst_true. forwards~ (RC&Cr): run_error_correct' E. splits*.\n   inverts E. splits~. apply~ red_spec_error_or_cst_false.\nQed.\n\n(* LATER: clean up redundant proof for the direct case *)\nLemma out_error_or_cst_correct : forall S C str ne v o,\n  out_error_or_cst S str ne v = o ->\n  red_expr S C (spec_error_or_cst str ne v) o.\nProof.\n  introv HR. unfolds in HR. case_if.\n  applys* red_spec_error_or_cst_true.\n  run_inv. applys* red_spec_error_or_cst_false.\nQed.\n\n\nLtac run_select_proj_extra_error HT ::=\n  match HT with\n  | run_error => constr:(run_error_correct)\n  | run_object_method => constr:(run_object_method_correct)\n  end.\n\n\n(**************************************************************)\n(** ** Object Get *)\n\nLemma object_has_prop_correct : forall runs S C l x o,\n  runs_type_correct runs ->\n  object_has_prop runs S C l x = o ->\n  red_expr S C (spec_object_has_prop l x) o.\nProof.\n  introv IH HR. unfolds in HR. run_simpl. run_hyp E as M.\n  applys~ red_spec_object_has_prop M. destruct x0.\n  run red_spec_object_has_prop_1_default using runs_type_correct_object_get_prop.\n  apply~ red_spec_object_has_prop_2. rewrite decide_def. repeat cases_if~.\nQed.\n\nLemma run_object_get_prop_correct : forall runs S C l x y,\n  runs_type_correct runs ->\n  run_object_get_prop runs S C l x = result_some y ->\n  red_spec S C (spec_object_get_prop l x) y.\nProof.\n  introv IH HR. unfolds in HR.\n  run. applys* red_spec_object_get_prop.\n   applys* run_object_method_correct. clear E.\n  destruct x0; tryfalse.\n  run red_spec_object_get_prop_1_default. case_if.\n   subst. run. applys red_spec_object_get_prop_2_undef.\n    applys* run_object_method_correct.\n    destruct x0; tryfalse.\n      destruct p; tryfalse. run_inv. applys red_spec_object_get_prop_3_null.\n      applys red_spec_object_get_prop_3_not_null. run_hyp*.\n  run_inv. destruct a; tryfalse.\n   applys* red_spec_object_get_prop_2_not_undef.\nAdmitted. (*faster*)\n\nLemma object_get_builtin_correct : forall runs S C B (vthis:value) l x o,\n  runs_type_correct runs ->\n  object_get_builtin runs S C B vthis l x = o ->\n  red_expr S C (spec_object_get_1 B vthis l x) o.\nProof.\n  introv IH HR. unfolds in HR.\n  let_name as Mdefault.\n  asserts Mdefault_correct: (forall S l o,\n    Mdefault S l = res_out o ->\n    red_expr S C (spec_object_get_1 builtin_get_default vthis l x) o).\n    clear HR o. subst. introv HR.\n   run red_spec_object_get_1_default. destruct a as [|[Ad|Aa]].\n    run_inv. applys* red_spec_object_get_2_undef.\n    run_inv. applys* red_spec_object_get_2_data.\n    applys red_spec_object_get_2_accessor.\n     destruct (attributes_accessor_get Aa); tryfalse.\n       destruct p; tryfalse. run_inv.\n        applys* red_spec_object_get_3_accessor_undef.\n       applys* red_spec_object_get_3_accessor_object. run_hyp*.\n  clear EQMdefault.\n  let_name as Mfunction.\n  asserts Mfunction_correct: (forall S o,\n    Mfunction S = res_out o ->\n    red_expr S C (spec_object_get_1 builtin_get_function vthis l x) o).\n    clear HR o. subst. introv HR.\n    run* red_spec_object_get_1_function. clear R1.\n    case_if.\n     applys* red_spec_function_get_1_error.\n     run_inv. applys* red_spec_function_get_1_normal.\n      clear EQMfunction. destruct B; tryfalse.\n      applys~ Mdefault_correct.\n      applys~ Mfunction_correct.\n  (* argument object *)\n  run. forwards* obpm: run_object_method_correct.\n  run. substs. run~ red_spec_object_get_args_obj.\n  destruct a. (* LTAC ARTHUR:  This [a] wasn't properly named. *)\n   apply* red_spec_object_get_args_obj_1_undef.\n   run_hyp. apply~ red_spec_object_get_args_obj_1_attrs.\nAdmitted. (* faster *)\n\n\nLemma run_object_get_correct : forall runs S C l x o,\n  runs_type_correct runs ->\n  run_object_get runs S C l x = o ->\n  red_expr S C (spec_object_get l x) o.\nProof.\n  introv IH HR. unfolds in HR. run.\n  applys* red_spec_object_get.\n   applys* run_object_method_correct. clear E.\n  applys* object_get_builtin_correct.\nQed.\n\n\nLemma object_can_put_correct : forall runs S C l x o,\n  runs_type_correct runs ->\n  object_can_put runs S C l x = o ->\n  red_expr S C (spec_object_can_put l x) o.\nProof.\n  introv IH HR. unfolds in HR. run. run_hyp E as CP.\n  applys~ red_spec_object_can_put CP. destruct x0.\n  run red_spec_object_can_put_1_default. destruct a.\n   run. run_hyp E as P. applys~ red_spec_object_can_put_2_undef P.\n    destruct x0 as [()|lproto]; tryfalse.\n     run. run_hyp E as E. apply~ red_spec_object_can_put_4_null.\n     run red_spec_object_can_put_4_not_null using run_object_get_prop_correct.\n      destruct a as [|[Ad|Aa]].\n       run. run_hyp E as E. apply~ red_spec_object_can_put_5_undef.\n       run. run_hyp E as E. applys~ red_spec_object_can_put_5_data E. destruct x0.\n        applys~ red_spec_object_can_put_6_extens_true.\n        applys~ red_spec_object_can_put_6_extens_false.\n       run_inv. apply~ red_spec_object_can_put_5_accessor. rewrite decide_def.\n        repeat cases_if~.\n   destruct a; run_inv.\n    apply~ red_spec_object_can_put_2_data.\n    apply~ red_spec_object_can_put_2_accessor. rewrite decide_def. repeat cases_if~.\nQed.\n\nLemma object_default_value_correct : forall runs S C l pref o,\n  runs_type_correct runs ->\n  object_default_value runs S C l pref = o ->\n  red_expr S C (spec_object_default_value l pref) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run. lets H: run_object_method_correct (rm E).\n  applys* red_spec_object_default_value (rm H).\n  destruct x.\n  let_name as M.\n  asserts M_correct: (forall S x (F:state->result) K (o:out),\n      (M S x F = res_out o) ->\n      (forall S' o', (F S' = o') -> red_expr S' C K o') ->\n      red_expr S C (spec_object_default_value_sub_1 l x K) o).\n    clears HR S o. introv HR HK. subst M.\n    run red_spec_object_default_value_sub_1\n      using run_object_get_correct.\n    run. forwards R1: run_callable_correct (rm E).\n    destruct x0.\n      simpls. run. destruct v; tryfalse.\n       run* red_spec_object_default_value_sub_2_callable.\n       destruct v; run_inv.\n         applys* red_spec_object_default_value_sub_3_prim.\n         applys* red_spec_object_default_value_sub_3_object.\n      applys* red_spec_object_default_value_sub_2_not_callable.\n    clear EQM.\n  let_name.\n  applys* red_spec_object_default_value_1_default.\n  applys* red_spec_object_default_value_2.\n  subst. applys* M_correct.\n  clears S o. intros S o HR. simpls.\n  applys* red_spec_object_default_value_3.\n  subst. applys* M_correct.\n  clears S o. intros S o HR. simpls.\n  applys* red_spec_object_default_value_4.\nAdmitted. (* faster *)\n\n(** Conversions *)\n\nLemma to_primitive_correct : forall runs S C v o prefo,\n  runs_type_correct runs ->\n  to_primitive runs S C v prefo = o ->\n  red_expr S C (spec_to_primitive v prefo) o.\nProof.\n  introv IH HR. unfolds in HR. destruct v.\n  run_inv. applys* red_spec_to_primitive_pref_prim.\n  applys* red_spec_to_primitive_pref_object.\n  applys* object_default_value_correct.\n  run_pre. rewrite R1. run_post; substs~.\nQed.\n\nLemma to_number_correct : forall runs S C v o,\n  runs_type_correct runs ->\n  to_number runs S C v = o ->\n  red_expr S C (spec_to_number v) o.\nProof.\n  introv IH HR. unfolds in HR. destruct v.\n  run_inv. applys* red_spec_to_number_prim.\n  run red_spec_to_number_object using to_primitive_correct.\n  applys* red_spec_to_number_1.\nQed.\n\nLemma to_string_correct : forall runs S C v o,\n  runs_type_correct runs ->\n  to_string runs S C v = o ->\n  red_expr S C (spec_to_string v) o.\nProof.\n  introv IH HR. unfolds in HR. destruct v.\n  run_inv. applys* red_spec_to_string_prim.\n  run red_spec_to_string_object using to_primitive_correct.\n  applys* red_spec_to_string_1.\nQed.\n\nLemma to_integer_correct : forall runs S C v o,\n  runs_type_correct runs ->\n  to_integer runs S C v = o ->\n  red_expr S C (spec_to_integer v) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_to_integer using to_number_correct.\n  applys* red_spec_to_integer_1.\nQed.\n\nLemma to_int32_correct : forall runs S C v (y:specret int),\n  runs_type_correct runs ->\n  to_int32 runs S C v = result_some y ->\n  red_spec S C (spec_to_int32 v) y.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_to_int32 using to_number_correct.\n  applys* red_spec_to_int32_1.\nQed.\n\nLemma to_uint32_correct : forall runs S C v (y:specret int),\n  runs_type_correct runs ->\n  to_uint32 runs S C v = result_some y ->\n  red_spec S C (spec_to_uint32 v) y.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_to_uint32 using to_number_correct.\n  applys* red_spec_to_uint32_1.\nQed.\n\nLtac run_select_proj_extra_conversions HT ::=\n  match HT with\n  | to_primitive => constr:(to_primitive_correct)\n  | to_number => constr:(to_number_correct)\n  | to_string => constr:(to_string_correct)\n  | to_int32 => constr:(to_int32_correct)\n  | to_uint32 => constr:(to_uint32_correct)\n  end.\n\nLemma run_object_define_own_prop_array_loop_correct :\n  forall runs S C l newLen oldLen newLenDesc newWritable throw o \n             (def : state -> prop_name -> descriptor -> strictness_flag -> specres nothing) \n             (def_correct : forall S str o x Desc,\n                def S x Desc str = res_out o ->\n                red_expr S C (spec_object_define_own_prop_1 builtin_define_own_prop_default l x Desc str) o),\n    runs_type_correct runs ->\n    run_object_define_own_prop_array_loop runs S C l newLen oldLen newLenDesc newWritable throw def = o -> \n    red_expr S C (spec_object_define_own_prop_array_3l l newLen oldLen newLenDesc newWritable throw) o.\nProof.\n  introv Hyp HR IH.\n  unfolds run_object_define_own_prop_array_loop.\n  cases_if*. let_name. \n  applys~ red_spec_object_define_own_prop_array_3l_condition_true. \n  rewrite <- EQoldLen'.\n  run~ red_spec_object_define_own_prop_array_3l_ii.\n  run~ red_spec_object_define_own_prop_array_3l_ii_1.\n  destruct b; cases_if*; clear n.\n  applys* red_spec_object_define_own_prop_array_3l_ii_2.\n  eapply runs_type_correct_object_define_own_prop_array_loop; eassumption.\n\n  applys* red_spec_object_define_own_prop_array_3l_ii_2_3. \n  eapply red_spec_object_define_own_prop_array_3l_iii_1. reflexivity.\n  destruct newWritable; try solve [false].\n  let_name as newLenDesc''. rewrite <- EQnewLenDesc''. \n  apply red_spec_object_define_own_prop_array_3l_iii_2_true.\n  let_name. cases_if*. subst newLenDesc0.\n  run~ red_spec_object_define_own_prop_array_3l_iii_3.\n  applys* red_spec_object_define_own_prop_array_3l_iii_4. \n  applys* red_spec_object_define_own_prop_reject.\n  applys* out_error_or_cst_correct.\n  let_name as newLenDesc''. rewrite <- EQnewLenDesc''. \n  apply red_spec_object_define_own_prop_array_3l_iii_2_false.\n  let_name. cases_if*. subst newLenDesc0.\n  run~ red_spec_object_define_own_prop_array_3l_iii_3.\n  applys* red_spec_object_define_own_prop_array_3l_iii_4. \n  applys* red_spec_object_define_own_prop_reject.\n  applys* out_error_or_cst_correct.\n  \n  applys~ red_spec_object_define_own_prop_array_3l_condition_false.\n  destruct newWritable; cases_if*; clear n.\n  inverts IH. applys* red_spec_object_define_own_prop_array_3n.\n\n  applys* red_spec_object_define_own_prop_array_3m.\nQed.\n\nLemma object_define_own_prop_correct : forall runs S C l x Desc str o,\n  runs_type_correct runs ->\n  object_define_own_prop runs S C l x Desc str = o ->\n  red_expr S C (spec_object_define_own_prop l x Desc str) o.\nProof.\n  introv IH HR. unfolds in HR.\n  let_name as rej. asserts Rej: (forall S str o,\n      rej S str = o ->\n      red_expr S C (spec_object_define_own_prop_reject str) o).\n    clear HR S str o. introv HR. subst.\n    applys* red_spec_object_define_own_prop_reject.\n    applys* out_error_or_cst_correct.\n  let_name as def. asserts Def: (forall S str o x Desc,\n      def S x Desc str = res_out o ->\n      red_expr S C (spec_object_define_own_prop_1 builtin_define_own_prop_default l x Desc str) o).\n    clear HR S str o Desc x. introv HR. subst.\n    run red_spec_object_define_own_prop_1_default.\n    run. applys* red_spec_object_define_own_prop_2.\n      applys* run_object_method_correct. clear E.\n    destruct a.\n      case_if.\n        let_name. run. forwards B: @pick_option_correct (rm E).\n         applys* red_spec_object_define_own_prop_3_undef_true A.\n         case_if; case_if*.\n        subst. applys* red_spec_object_define_own_prop_3_undef_false.\n      let_name as wri. asserts Wri: (forall S A o,\n          wri S A = res_out o ->\n          red_expr S C (spec_object_define_own_prop_write l x A Desc str) o).\n        clear HR o. introv HR. subst.\n        run. forwards B: @pick_option_correct (rm E).\n         applys* red_spec_object_define_own_prop_write.\n        clear EQwri.\n      case_if.\n        run_inv. applys* red_spec_object_define_own_prop_3_includes.\n        applys* red_spec_object_define_own_prop_3_not_include.\n        case_if.\n          run_inv. applys* red_spec_object_define_own_prop_4_reject.\n          applys* red_spec_object_define_own_prop_4_not_reject. case_if.\n            applys* red_spec_object_define_own_prop_5_generic. case_if.\n              applys* red_spec_object_define_own_prop_5_a. case_if;\n               [ | applys* red_spec_object_define_own_prop_6a_reject].\n    let_name. run. forwards B: @pick_option_correct (rm E).\n     applys* red_spec_object_define_own_prop_6a_accept A'.\n     case_if as HC1.\n       destruct a; inverts n2; tryfalse.\n         applys* red_spec_object_define_own_prop_5_b. case_if.\n           applys* red_spec_object_define_own_prop_6b_false_reject.\n           applys* red_spec_object_define_own_prop_6b_false_accept.\n       case_if. destruct a; tryfalse.\n        applys* red_spec_object_define_own_prop_5_c. case_if.\n          applys* red_spec_object_define_own_prop_6c_1.\n          applys* red_spec_object_define_own_prop_6c_2.\n    clear EQdef.\n  run.\n  applys* red_spec_object_define_own_prop.\n    applys* run_object_method_correct.\n  clear E. destruct x0. (* LTAC ARTHUR:  This [x0] wasn't properly named. *)\n    (* default *)\n    applys* Def.\n\n    (* Array object *)\n    run red_spec_object_define_own_prop_array_1. \n    destruct a; [inverts HR | ]. destruct a; [ | inverts HR].\n    let_name. subst oldLen. \n    eapply red_spec_object_define_own_prop_array_2. reflexivity.\n    destruct (attributes_data_value a); [ | inverts HR].\n    let_name. let_name. subst descValueOpt.\n    eapply red_spec_object_define_own_prop_array_2_1. reflexivity.\n    eapply red_spec_to_uint32. apply red_spec_to_number_prim. reflexivity.\n    apply red_spec_to_uint32_1. rewrite <- EQoldLen. \n    case_if. subst x.\n    \n    apply red_spec_object_define_own_prop_array_branch_3_4_3.\n    assert (Hyp : {v | descriptor_value Desc = Some v} + {descriptor_value Desc = None}).\n    {\n      destruct (descriptor_value Desc); [left | right]; auto. exists~ v.\n    } inverts Hyp as Hyp. \n\n    (* Step 3b *) \n    destruct Hyp as (v & EQv); rewrite EQv in *.\n    run~ red_spec_object_define_own_prop_array_3_3c; rename a0 into newLen.\n    run~ red_spec_object_define_own_prop_array_3c; rename m into newLenN.\n    case_if*. applys~ red_spec_object_define_own_prop_array_3d.\n    applys* run_error_correct. let_name.\n    applys~ red_spec_object_define_own_prop_array_3e.\n    clear dependent newLenN. case_if*.\n    subst; applys* red_spec_object_define_own_prop_array_3f.\n    case_if*. applys* red_spec_object_define_own_prop_array_3g.\n    applys~ red_spec_object_define_own_prop_array_3g_to_h.\n    rewrite <- EQnewLenDesc. let_name. let_name as newLenDesc'. \n    cases_if*; lets HnW : n1; rewrite EQnewWritable in n1. \n    apply red_spec_object_define_own_prop_array_3i.\n    destruct (descriptor_writable newLenDesc); jauto.\n    cases_if*. false~. clear n1 EQnewWritable. rewrite <- EQnewLenDesc'.\n    replace false with newWritable by (destruct newWritable; auto; false).\n    run* red_spec_object_define_own_prop_array_3j. destruct b; case_if*; clear n1.\n    apply red_spec_object_define_own_prop_array_to_3l.\n    applys* run_object_define_own_prop_array_loop_correct.\n    \n    inverts HR. apply red_spec_object_define_own_prop_array_3k.\n    apply red_spec_object_define_own_prop_array_3h.\n    destruct (descriptor_writable newLenDesc); jauto.\n    cases_if*. clear n1 EQnewWritable. subst newLenDesc'. \n    replace true with newWritable by (destruct newWritable; auto; false).\n    run* red_spec_object_define_own_prop_array_3j. destruct b; case_if*; clear n1.\n    apply red_spec_object_define_own_prop_array_to_3l.\n    applys* run_object_define_own_prop_array_loop_correct.\n\n    inverts HR. applys* red_spec_object_define_own_prop_array_3k.\n    \n    (* Step 3a *) \n    rewrite Hyp in HR. applys~ red_spec_object_define_own_prop_array_3_3a.\n\n    (* Branching between Step 4 and Step 5 *)\n    applys~ red_spec_object_define_own_prop_array_branch_3_4_4.\n    run red_spec_object_define_own_prop_array_branch_4_5.\n    run red_spec_object_define_own_prop_array_branch_4_5_a.\n    case_if. rename a0 into ilen, s into slen.\n    applys~ red_spec_object_define_own_prop_array_branch_4_5_b_4.\n    run red_spec_object_define_own_prop_array_4a.\n    case_if; rename a0 into index.\n    applys~ red_spec_object_define_own_prop_array_4b.\n    run~ red_spec_object_define_own_prop_array_4c.\n    destruct b; case_if*. case_if.\n    eapply red_spec_object_define_own_prop_array_4c_e. auto. reflexivity. auto.\n    run_inv. applys~ red_spec_object_define_own_prop_array_4f.\n    applys~ red_spec_object_define_own_prop_array_4c_d.\n    applys~ red_spec_object_define_own_prop_array_branch_4_5_b_5.\n    applys~ red_spec_object_define_own_prop_array_5. \n\n    (* arguments object *)\n    run. forwards~ obpm: run_object_method_correct (rm E).\n    run. subst. run~ red_spec_object_define_own_prop_args_obj.\n    run~ red_spec_object_define_own_prop_args_obj_1. cases_if; substs.\n     let_name. asserts Follow: (forall S o,\n         follow S = result_some (specret_out o) ->\n         red_expr S C spec_args_obj_define_own_prop_6 o).\n       introv RES. rewrite EQfollow in RES. inverts RES.\n       apply* red_spec_object_define_own_prop_args_obj_6.\n     clear EQfollow. destruct a as [|A]. (* LTAC ARTHUR: this [a] has been defined by tactics. *)\n      apply~ red_spec_object_define_own_prop_args_obj_2_true_undef.\n      cases_if.\n       run~ red_spec_object_define_own_prop_args_obj_2_true_acc.\n        apply* red_spec_object_define_own_prop_args_obj_5.\n       let_name as next. asserts Next: (forall S o,\n           next S = result_some (specret_out o) ->\n           red_expr S C (spec_args_obj_define_own_prop_4 l x Desc str x1) o).\n         introv RES. rewrite EQnext in RES. cases_if.\n          run~ red_spec_object_define_own_prop_args_obj_4_false.\n           apply~ red_spec_object_define_own_prop_args_obj_5.\n          apply~ red_spec_object_define_own_prop_args_obj_4_not_false.\n        clear EQnext. sets_eq <- dvDesc: (descriptor_value Desc). destruct dvDesc.\n         run~ red_spec_object_define_own_prop_args_obj_2_true_not_acc_some.\n          apply~ red_spec_object_define_own_prop_args_obj_3.\n         apply~ red_spec_object_define_own_prop_args_obj_2_true_not_acc_none.\n     apply~ red_spec_object_define_own_prop_args_obj_2_false.\nAdmitted. (* faster *)\n\nLemma prim_new_object_correct : forall S C w o,\n  prim_new_object S w = o ->\n  red_expr S C (spec_prim_new_object w) o.\nProof.\n introv H. destruct w; tryfalse;\n unfolds in H;  repeat let_simpl;\n match goal with H: context [object_alloc ?s ?o] |- _ => sets_eq X: (object_alloc s o) end;\n destruct X as (l&S').\n inversion H. applys* red_spec_prim_new_object_bool.\n inversion H. applys* red_spec_prim_new_object_number.\n run. applys* red_spec_prim_new_object_string.\n apply pick_option_correct in E. auto.\nQed.\n\n(* todo: move to the right place above here *)\nLemma to_object_correct : forall S C v o,\n  to_object S v = o ->\n  red_expr S C (spec_to_object v) o.\nProof.\n  hint run_error_correct_2, prim_new_object_correct.\n  introv HR. unfolds in HR. destruct v as [w|l].\n    destruct w.\n      applys* red_spec_to_object_undef_or_null.\n      applys* red_spec_to_object_undef_or_null.\n      applys* red_spec_to_object_prim. rew_logic*. splits; congruence.\n      applys* red_spec_to_object_prim. rew_logic*. splits; congruence.\n      applys* red_spec_to_object_prim. rew_logic*. splits; congruence.\n    run_inv. applys* red_spec_to_object_object.\nQed.\n\nLemma run_object_prim_value_correct : forall S l o,\n  run_object_prim_value S l = o ->\n  exists (v : value), o = out_ter S v /\\\n  object_prim_value S l v.\nProof.\n  introv HR. unfolds in HR. do 2 runs. eexists. splits*.\n  forwards~: run_object_method_correct E.\nQed.\n\nLemma prim_value_get_correct : forall runs S C v x o,\n  runs_type_correct runs ->\n  prim_value_get runs S C v x = o ->\n  red_expr S C (spec_prim_value_get v x) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_prim_value_get using to_object_correct.\n  applys* red_spec_prim_value_get_1.\n  applys* object_get_builtin_correct.\nAdmitted. (*faster*)\n\nLemma object_put_complete_correct : forall runs S C B vthis l x v str o,\n  runs_type_correct runs ->\n  object_put_complete runs B S C vthis l x v str = o ->\n  red_expr S C (spec_object_put_1 B vthis l x v str) o.\nProof.\n  introv IH HR. unfolds in HR. destruct B.\n  run red_spec_object_put_1_default using object_can_put_correct. cases_if.\n   run red_spec_object_put_2_true. let_name.\n    asserts follows_correct: (forall Aa o,\n        a = full_descriptor_undef \\/ (a = attributes_accessor_of Aa) ->\n        follow tt = res_out o ->\n        red_expr S0 C (spec_object_put_3 vthis l x v str (specret_val S2 a)) o).\n      clear HR. introv N E. substs.\n      run red_spec_object_put_3_not_data using run_object_get_prop_correct. apply* N.\n      clear N. tests Acc: (exists Aa', a0 = attributes_accessor_of Aa').\n       lets (Aa'&?): (rm Acc). let_simpl. substs.\n        sets_eq va': (attributes_accessor_set Aa'). destruct va' as [|la']; tryfalse.\n        run* red_spec_object_put_4_accessor. rewrite <- EQva'. discriminate.\n        apply~ red_spec_object_put_5_return.\n       let_name. asserts E': (follow' tt = o0).\n         destruct a0 as [|()]; try solve [false~ Acc]; exact E.\n        asserts (?&H'): (exists (Ad : attributes_data),\n          a0 = full_descriptor_undef \\/ a0 = Ad).\n         destruct a0 as [|()]. exists* (arbitrary : attributes_data). exists* a0. false~ Acc.\n        clear E. substs. destruct vthis.\n         forwards (H&_): out_error_or_void_correct C (rm E').\n          applys* red_spec_object_put_4_not_accessor_prim H.\n         let_simpl. run* red_spec_object_put_4_not_accessor_object using\n           object_define_own_prop_correct. apply~ red_spec_object_put_5_return.\n     destruct a as [|[Ad|Aa]]. applys~ follows_correct (arbitrary : attributes_accessor).\n     clear EQfollow follow follows_correct.\n     destruct vthis as [wthis|lthis].\n      apply~ red_spec_object_put_3_data_prim. apply~ out_error_or_void_correct.\n      let_simpl. run* red_spec_object_put_3_data_object\n        using object_define_own_prop_correct. apply~ red_spec_object_put_5_return.\n     apply~ follows_correct.\n   apply~ red_spec_object_put_2_false. apply~ out_error_or_void_correct.\nQed.\n\nLemma prim_value_put_correct : forall runs S C w x v str o,\n  runs_type_correct runs ->\n  prim_value_put runs S C w x v str = o ->\n  red_expr S C (spec_prim_value_put w x v str) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_prim_value_put using to_object_correct.\n  applys* red_spec_prim_value_put_1.\n  applys* object_put_complete_correct.\nQed.\n\n\n\n(*************************************************************)\n\nLemma env_record_get_binding_value_correct : forall runs S C L rn rs o,\n  runs_type_correct runs ->\n  env_record_get_binding_value runs S C L rn rs = o ->\n  red_expr S C (spec_env_record_get_binding_value L rn rs) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run_simpl. forwards B: @pick_option_correct (rm E).\n  applys~ red_spec_env_record_get_binding_value B. destruct x.\n   run_simpl. rewrite <- Heap.binds_equiv_read_option in E. destruct x as [mu v].\n    cases_if.\n     applys~ red_spec_env_record_get_binding_value_1_decl_uninitialized E.\n      apply~ out_error_or_cst_correct.\n     applys~ red_spec_env_record_get_binding_value_1_decl_initialized E.\n      run_inv. apply~ red_spec_returns.\n   run red_spec_env_record_get_binding_value_1_object using object_has_prop_correct.\n    cases_if; run_inv.\n     apply~ red_spec_env_record_get_binding_value_obj_2_true.\n      applys~ run_object_get_correct HR.\n     apply~ red_spec_env_record_get_binding_value_obj_2_false.\n      applys~ out_error_or_cst_correct HR.\nQed.\n\n\nLemma throw_result_run_error_correct : forall runs S C ne T (y:specret T),\n  runs_type_correct runs ->\n  throw_result (run_error S ne) = result_some y ->\n  red_spec S C (spec_error_spec ne) y.\nProof.\n  introv IH HR. unfolds throw_result.\n  lets ([|y1]&E&K): if_result_some_out (rm HR); tryfalse_nothing. run_inv.\n  lets (E2&Ab): run_error_correct' (rm E).\n  applys* red_spec_error_spec.\n  abort.\nQed.\n\n\nLemma ref_kind_env_record_inv : forall r,\n  ref_kind_of r = ref_kind_env_record ->\n  exists L, ref_base r = ref_base_type_env_loc L.\nProof.\n  introv E. unfolds ref_kind_of.\n  destruct (ref_base r).\n    destruct v; tryfalse. destruct p; tryfalse.\n    exists___*.\nQed.\n\nLemma ref_kind_base_object_inv : forall r,\n  (ref_kind_of r = ref_kind_primitive_base \\/\n     ref_kind_of r = ref_kind_object) ->\n  exists v, ref_base r = ref_base_type_value v.\nProof.\n  introv E. unfolds ref_kind_of.\n  destruct E; destruct (ref_base r); tryfalse;\n    destruct v; tryfalse; try solve [exists___*].\nQed.\n\n\nLemma ref_get_value_correct : forall runs S C rv y,\n  runs_type_correct runs ->\n  ref_get_value runs S C rv = result_some y ->\n  red_spec S C (spec_get_value rv) y.\nProof.\n  introv IH HR. unfolds in HR. destruct rv; tryfalse.\n  run_inv. applys* red_spec_ref_get_value_value.\n  let_name as M.\n  asserts M_correct: (\n    (  ref_kind_of r = ref_kind_primitive_base\n    \\/ ref_kind_of r = ref_kind_object) ->\n    M tt = result_some y ->\n    red_spec S C (spec_get_value r) y).\n   clear HR. introv EQ HR. subst M.\n   asserts: (ref_is_property r). unfolds. destruct* EQ.\n   lets (v&Ev): ref_kind_base_object_inv EQ. rewrite Ev in HR.\n   unfolds ref_has_primitive_base. case_if.\n     run* red_spec_ref_get_value_ref_b_has_primitive_base using prim_value_get_correct.\n      applys* red_spec_ref_get_value_ref_b_1.\n     destruct EQ; tryfalse. destruct v as [|l]; tryfalse.\n     run* red_spec_ref_get_value_ref_b_has_not_primitive_base using run_object_get_correct.\n      applys* red_spec_ref_get_value_ref_b_1.\n    clear EQM.\n  sets_eq k: (ref_kind_of r). destruct k; tryfalse.\n  (* case undef *)\n  applys* red_spec_ref_get_value_ref_a. unfolds*.\n   applys* throw_result_run_error_correct.\n  (* case prim *)\n  applys* M_correct.\n  (* case object *)\n  applys* M_correct.\n  (* case env_record *)\n  lets (L&EQL): ref_kind_env_record_inv (sym_eq EQk).\n  rewrite EQL in HR.\n  run* red_spec_ref_get_value_ref_c using env_record_get_binding_value_correct.\n  applys* red_spec_ref_get_value_ref_c_1.\nAdmitted. (*faster*)\n\n\nLemma object_put_correct : forall runs S C l x v str o,\n  runs_type_correct runs ->\n  object_put runs S C l x v str = o ->\n  red_expr S C (spec_object_put l x v str) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run. applys red_spec_object_put. apply* run_object_method_correct.\n  applys* object_put_complete_correct.\nAdmitted. (*faster*)\n\nLemma env_record_set_mutable_binding_correct : forall runs S C L x v str o,\n  runs_type_correct runs ->\n  env_record_set_mutable_binding runs S C L x v str = o ->\n  red_expr S C (spec_env_record_set_mutable_binding L x v str) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run_simpl. forwards B: @pick_option_correct (rm E).\n  applys~ red_spec_env_record_set_mutable_binding B. destruct x0.\n   run_simpl. rewrite <- Heap.binds_equiv_read_option in E. destruct x0 as [mu ?].\n    cases_if; run_inv.\n     applys~ red_spec_env_record_set_mutable_binding_1_decl_mutable E.\n      apply~ red_spec_returns.\n     applys~ red_spec_env_record_set_mutable_binding_1_decl_non_mutable E.\n      apply~ out_error_or_void_correct.\n   apply~ red_spec_env_record_set_mutable_binding_1_object.\n    applys~ object_put_correct HR.\nQed.\n\n\nLemma ref_is_property_from_not_unresolvable_value : forall r v,\n  ~ ref_is_unresolvable r ->\n  ref_base r = ref_base_type_value v ->\n  ref_is_property r.\nProof.\n  introv N E. unfolds ref_is_property, ref_is_unresolvable, ref_kind_of.\n  destruct (ref_base r); tryfalse. destruct* v0. destruct* p.\nAdmitted. (* faster *)\n\n\nLemma ref_put_value_correct : forall runs S C rv v o,\n  runs_type_correct runs ->\n  ref_put_value runs S C rv v = o ->\n  red_expr S C (spec_put_value rv v) o.\nProof.\n  introv IH HR. unfolds in HR.\n  destruct rv; tryfalse.\n   applys* red_spec_ref_put_value_value.\n   case_if.\n    case_if.\n     applys~ red_spec_ref_put_value_ref_a_1.\n      applys* run_error_correct.\n     applys~ red_spec_ref_put_value_ref_a_2.\n      applys* object_put_correct.\n    case_if.\n     cases (ref_base r); tryfalse.\n      case_if; destruct v0; tryfalse.\n       applys* red_spec_ref_put_value_ref_b_has_primitive_base.\n        applys* prim_value_put_correct.\n       applys* red_spec_ref_put_value_ref_b_has_not_primitive_base.\n        applys* object_put_correct.\n      cases (ref_base r); tryfalse.\n       applys* red_spec_ref_put_value_ref_c.\n       applys* env_record_set_mutable_binding_correct.\nAdmitted. (* faster *)\n\n\nLemma run_expr_get_value_correct : forall runs S C e y,\n  runs_type_correct runs ->\n  run_expr_get_value runs S C e = result_some y ->\n  red_spec S C (spec_expr_get_value e) y.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_expr_get_value.\n  applys* red_spec_expr_get_value_1.\n   applys* ref_get_value_correct.\nAdmitted. (* faster *)\n\n\nLtac run_select_proj_extra_ref HT ::=\n  match HT with\n  | object_put => constr:(object_put_correct)\n  | ref_put_value => constr:(ref_put_value_correct)\n  | run_expr_get_value => constr:(run_expr_get_value_correct)\n  | object_define_own_prop => constr:(object_define_own_prop_correct)\n  end.\n\nLemma env_record_create_mutable_binding_correct : forall runs S C L x deletable_opt o,\n  runs_type_correct runs ->\n  env_record_create_mutable_binding runs S C L x deletable_opt = o ->\n  red_expr S C (spec_env_record_create_mutable_binding L x deletable_opt) o.\nProof.\n  introv IH HR. unfolds in HR. let_simpl.\n  run_simpl. forwards B: @pick_option_correct (rm E).\n  applys~ red_spec_env_record_create_mutable_binding B.\n  destruct x0.\n   cases_if; run_inv. let_simpl. run_inv.\n    apply~ red_spec_env_record_create_mutable_binding_1_decl_indom.\n   run red_spec_env_record_create_mutable_binding_1_object\n     using object_has_prop_correct. cases_if. let_simpl.\n    run* red_spec_env_record_create_mutable_binding_obj_2.\n    apply~ red_spec_env_record_create_mutable_binding_obj_3.\nQed.\n\nLemma env_record_create_set_mutable_binding_correct : forall runs S C L x deletable_opt v str o,\n  runs_type_correct runs ->\n  env_record_create_set_mutable_binding runs S C L x deletable_opt v str = o ->\n  red_expr S C (spec_env_record_create_set_mutable_binding L x deletable_opt v str) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_env_record_create_set_mutable_binding\n    using env_record_create_mutable_binding_correct.\n  forwards: env_record_set_mutable_binding_correct IH (rm HR).\n  apply~ red_spec_env_record_create_set_mutable_binding_1.\nQed.\n\nLemma env_record_create_immutable_binding_correct : forall S C L x o,\n  env_record_create_immutable_binding S L x = o ->\n  red_expr S C (spec_env_record_create_immutable_binding L x) o.\nProof.\n  introv HR. unfolds in HR.\n  run_simpl. forwards B: @pick_option_correct (rm E).\n  destruct x0; tryfalse. cases_if. run_inv.\n  applys~ red_spec_env_record_create_immutable_binding B.\nQed.\n\nLemma env_record_initialize_immutable_binding_correct : forall S C L x v o,\n  env_record_initialize_immutable_binding S L x v = o ->\n  red_expr S C (spec_env_record_initialize_immutable_binding L x v) o.\nProof.\n  introv HR. unfolds in HR.\n  run. forwards B: @pick_option_correct (rm E). destruct x0; tryfalse.\n  run. forwards B': @pick_option_correct (rm E). cases_if. let_simpl. run_inv. substs.\n  applys~ red_spec_env_record_initialize_immutable_binding B B'.\nQed.\n\n(************************************************************)\n(* Treatement of [spec_expr_get_value_conv] *)\n\nDefinition if_spec_ter_post_bool (K:state->bool->result) o (y:specret value) :=\n     (y = specret_out o /\\ abort o)\n  \\/ (exists S, exists (b:bool), y = specret_val S (value_prim b)\n       /\\ K S b = o).\n\nLtac run_post_if_spec_ter_post_bool H := (* todo: integrate into run_post *)\n  let Ab := fresh \"Ab\" in\n  let Eq := fresh \"Eq\" in\n  let S1 := fresh \"S\" in\n  let b := fresh \"b\" in\n  let O1 := fresh \"O1\" in\n  destruct H as [(Er&Ab)|(S1&b&O1&H)];\n  [ try abort | try subst_hyp O1 ].\n\nLemma if_spec_post_to_bool : forall (K:state->bool->result) S C e o y1,\n  red_spec S C (spec_expr_get_value e) y1 ->\n  if_spec_post\n   (fun S v => 'let b := convert_value_to_boolean v in K S b) (specret_out o) y1 ->\n  exists y2,\n     red_spec S C (spec_expr_get_value_conv spec_to_boolean e) y2\n  /\\ if_spec_ter_post_bool K o y2.\nProof.\n  introv HR HP. run_post.\n  exists y1. splits.\n    subst. apply* red_spec_expr_get_value_conv. abort.\n    subst. left. splits; run_inv; auto~.\n  exists (specret_val S1 (value_prim (convert_value_to_boolean a))). splits.\n    applys* red_spec_expr_get_value_conv.\n     applys* red_spec_expr_get_value_conv_1.\n     applys* red_spec_to_boolean.\n     applys* red_spec_expr_get_value_conv_2.\n    right. exists S1 __. split. reflexivity. auto.\nQed.\n\n(* LATER: avoid the copy-paste, and rename the tactic *)\n\nDefinition if_spec_ter_post_object (K:state->object_loc->result) o (y:specret value) :=\n     (y = specret_out o /\\ abort o)\n  \\/ (exists S, exists (l:object_loc), y = specret_val S (value_object l)\n       /\\ K S l = o).\n\n\nLemma if_spec_post_to_object : forall (K:state->object_loc->result) S C e o y1,\n  red_spec S C (spec_expr_get_value e) y1 ->\n  if_spec_post\n   (fun S v => if_object (to_object S v) K) (specret_out o) y1 ->\n  exists y2,\n     red_spec S C (spec_expr_get_value_conv spec_to_object e) y2\n  /\\ if_spec_ter_post_object K o y2.\nProof.\n  introv HR HP. run_post.\n  exists y1. splits.\n    subst. apply* red_spec_expr_get_value_conv. abort.\n    subst. left. splits; run_inv; auto~.\n  run_pre. lets*: to_object_correct C (rm R1). run_post.\n    subst. exists (specret_out (T:=value) o1). split.\n      applys* red_spec_expr_get_value_conv.\n       applys* red_spec_expr_get_value_conv_1. abort.\n      left. splits~.\n    exists (specret_val S0 (value_object l)). split.\n      applys* red_spec_expr_get_value_conv.\n       applys* red_spec_expr_get_value_conv_1.\n       applys* red_spec_expr_get_value_conv_2.\n      right. exists___*.\nQed.\n\n\nDefinition lift2 T (C:T->value) y :=\n  match y with\n  | specret_val S' (x1,x2) => specret_val S' (C x1, C x2)\n  | specret_out o => specret_out o\n  end.\n\n\nLemma convert_twice_primitive_correct : forall runs S C v1 v2 y,\n  runs_type_correct runs ->\n  convert_twice_primitive runs S C v1 v2 = result_some y ->\n  red_spec S C (spec_convert_twice (spec_to_primitive_auto v1) (spec_to_primitive_auto v2)) (lift2 value_prim y).\nProof.\n  introv IH HR. unfolds in HR. unfolds in HR.\n  run red_spec_convert_twice.\n  run red_spec_convert_twice_1.\n  unfolds lift2. applys red_spec_convert_twice_2.\nAdmitted. (*faster*)\n\n\nLemma convert_twice_number_correct : forall runs S C v1 v2 y,\n  runs_type_correct runs ->\n  convert_twice_number runs S C v1 v2 = result_some y ->\n  red_spec S C (spec_convert_twice (spec_to_number v1) (spec_to_number v2)) (lift2 (fun n=>n:value) y).\nProof.\n  introv IH HR. unfolds in HR. unfolds in HR.\n  run red_spec_convert_twice.\n  run red_spec_convert_twice_1.\n  unfolds lift2. applys red_spec_convert_twice_2.\nAdmitted. (*faster*)\n\nLemma convert_twice_string_correct : forall runs S C v1 v2 y,\n  runs_type_correct runs ->\n  convert_twice_string runs S C v1 v2 = result_some y ->\n  red_spec S C (spec_convert_twice (spec_to_string v1) (spec_to_string v2)) (lift2 (fun s=>s:value) y).\nProof.\n  introv IH HR. unfolds in HR. unfolds in HR.\n  run red_spec_convert_twice.\n  run red_spec_convert_twice_1.\n  unfolds lift2. applys red_spec_convert_twice_2.\nAdmitted. (*faster*)\n\nLemma get_puremath_op_correct : forall op F,\n  get_puremath_op op = Some F ->\n  puremath_op op F.\nProof.\n  Hint Constructors puremath_op.\n  introv HR. destruct op; simpls; inverts* HR.\nAdmitted. (*faster*)\n\nLemma get_inequality_op_correct : forall op b1 b2,\n  get_inequality_op op = Some (b1,b2) ->\n  inequality_op op b1 b2.\nProof.\n  Hint Constructors inequality_op.\n  introv HR. destruct op; simpls; inverts* HR.\nAdmitted. (*faster*)\n\nLemma get_shift_op_correct : forall op F b,\n  get_shift_op op = Some (b,F) ->\n  shift_op op b F.\nProof.\n  Hint Constructors shift_op.\n  introv HR. destruct op; simpls; inverts* HR.\nAdmitted. (*faster*)\n\nLemma get_bitwise_op_correct : forall op F,\n  get_bitwise_op op = Some F ->\n  bitwise_op op F.\nProof.\n  Hint Constructors bitwise_op.\n  introv HR. destruct op; simpls; inverts* HR.\nAdmitted. (*faster*)\n\n\n(**************************************************************)\n\nLemma run_object_get_own_prop_correct : forall runs S C l x y,\n  runs_type_correct runs ->\n  run_object_get_own_prop runs S C l x = result_some y ->\n  red_spec S C (spec_object_get_own_prop l x) y.\nProof.\n  introv IH HR. unfolds in HR. run.\n  applys* red_spec_object_get_own_prop.\n    applys* run_object_method_correct. clear E.\n  let_name as M. asserts M_correct: (forall S y,\n    M S = result_some y ->\n    red_spec S C (spec_object_get_own_prop_1 builtin_get_own_prop_default l x) y).\n    clears HR S. subst. introv HR. run.\n     sets_eq <- Ao: (Heap.read_option x1 x).\n     applys~ red_spec_object_get_own_prop_1_default. eexists. splits.\n      applys run_object_method_correct E.\n      rewrite~ EQAo.\n     clear E. destruct Ao.\n      applys* red_spec_object_get_own_prop_2_some_data.\n      applys* red_spec_object_get_own_prop_2_none.\n    clear EQM.\n  destruct x0.\n  (* default *)\n  subst*.\n  (* argument object *)\n  run~ red_spec_object_get_own_prop_args_obj. destruct a as [|A]. (* LTAC ARTHUR: this [a] has been defined by tactics. *)\n   inverts HR. applys~ red_spec_object_get_own_prop_args_obj_1_undef.\n   run. forwards~ obpm: run_object_method_correct (rm E).\n   run. subst. run~ red_spec_object_get_own_prop_args_obj_1_attrs.\n   let_name. asserts Follow: (forall S A y,\n       follow S A = result_some y ->\n       red_spec S C (spec_args_obj_get_own_prop_4 A) y).\n     introv RES. rewrite EQfollow in RES. inverts RES.\n     apply~ red_spec_object_get_own_prop_args_obj_4.\n   clear EQfollow. destruct a. (* LTAC ARTHUR: idem. *)\n    apply* red_spec_object_get_own_prop_args_obj_2_undef.\n    run~ red_spec_object_get_own_prop_args_obj_2_attrs using run_object_get_correct.\n    destruct A as [Ad|]; tryfalse.\n    apply~ red_spec_object_get_own_prop_args_obj_3.\n  (* string *)\n  run~ red_spec_object_get_own_prop_string. destruct a as [|A]. (* LTAC ARTHUR: this [a] has been defined by tactics. *)\n   run red_spec_object_get_own_prop_string_1_undef using to_int32_correct.\n    run red_spec_object_get_own_prop_string_2.\n    cases_if.\n     inverts HR. apply~ red_spec_object_get_own_prop_string_3_different.\n     subst x. run_pre. forwards* (v&EQo&Opv): run_object_prim_value_correct. run_post.\n       inverts Ab as Ab'; false. inverts H0. false Ab'. reflexivity.\n     inverts EQo. applys~ red_spec_object_get_own_prop_string_3_same Opv.\n     run~ red_spec_object_get_own_prop_string_4.\n     let_name. apply~ red_spec_object_get_own_prop_string_5. cases_if.\n      inverts HR. apply~ red_spec_object_get_own_prop_string_6_outofbounds. math.\n      inverts HR. apply~ red_spec_object_get_own_prop_string_6_inbounds. math.\n   inverts HR. apply~ red_spec_object_get_own_prop_string_1_attrs.\nAdmitted. (*faster*)\n\n\nLemma run_function_has_instance_correct : forall runs S C (lo lv : object_loc) o,\n  runs_type_correct runs ->\n  run_function_has_instance runs S lo lv = o ->\n  red_expr S C (spec_function_has_instance_2 lv lo) o.\nProof.\n  intros runs IH lo S C lv o HR. unfolds in HR. run_simpl.\n  forwards~ M: run_object_method_correct (rm E).\n  applys~ red_spec_function_has_instance_2 M.\n  destruct x as [()|lproto]; tryfalse; run_inv.\n   apply~ red_spec_function_has_instance_3_null.\n   cases_if; run_inv.\n    apply~ red_spec_function_has_instance_3_eq.\n    apply~ red_spec_function_has_instance_3_neq.\n     applys~ runs_type_correct_function_has_instance HR.\nQed.\n\n\nLemma run_object_has_instance_correct : forall runs S C B l v o,\n  runs_type_correct runs ->\n  run_object_has_instance runs S C B l v = result_some (specret_out o) ->\n  red_expr S C (spec_object_has_instance_1 B l v) o.\nProof.\n  introv IH HR. unfolds in HR. destruct B.\n  destruct v.\n  run_inv. applys* red_spec_object_has_instance_1_function_prim.\n  run red_spec_object_has_instance_1_function_object\n    using run_object_get_correct.\n  destruct v.\n  applys* red_spec_function_has_instance_1_prim.\n  applys red_spec_function_has_instance_1_object.\n   applys* runs_type_correct_function_has_instance.\n\n   repeat run; apply run_object_method_correct in E;\n   apply run_object_method_correct in E1; subst.\n   apply red_spec_object_has_instance_after_bind.\n   applys~ red_spec_function_has_instance_after_bind_1. eassumption. \n   destruct x1. applys* red_spec_function_has_instance_after_bind_2_some.\n   applys* runs_type_correct_object_has_instance.\n   applys* red_spec_function_has_instance_after_bind_2_none.\nAdmitted. (* faster*)\n\n\nLemma run_binary_op_correct : forall runs S C (op : binary_op) v1 v2 o,\n  runs_type_correct runs ->\n  run_binary_op runs S C op v1 v2 = o ->\n  red_expr S C (expr_binary_op_3 op v1 v2) o.\nProof.\n\n  introv IH HR. unfolds in HR.\n  (* Add *)\n  case_if. subst.\n  run red_expr_binary_op_add using convert_twice_primitive_correct.\n  destruct a as [w1 w2]. case_if.\n  run* red_expr_binary_op_add_1_string using convert_twice_string_correct.\n  destruct a as [s1 s2]. run_inv.\n  applys* red_expr_binary_op_add_string_1.\n  run* red_expr_binary_op_add_1_number using convert_twice_number_correct.\n  destruct a as [n1 n2]. run_inv.\n  applys* red_expr_puremath_op_1.\n  (* Puremath *)\n  case_if. run.\n  run red_expr_puremath_op using convert_twice_number_correct.\n  applys* get_puremath_op_correct.\n  destruct a as [n1 n2]. run_inv.\n  applys* red_expr_puremath_op_1.\n  (* Shiftop *)\n  case_if. run. destruct x as [b F].\n  lets M: red_expr_shift_op b. case_if; subst.\n  run* M. applys* get_shift_op_correct.\n    run red_expr_shift_op_1. applys* red_expr_shift_op_2.\n  run* M. applys* get_shift_op_correct.\n    run red_expr_shift_op_1. applys* red_expr_shift_op_2.\n  (* bitwise *)\n  case_if. run.\n  run red_expr_bitwise_op. applys* get_bitwise_op_correct.\n  run red_expr_bitwise_op_1. applys* red_expr_bitwise_op_2.\n  (* inequality *)\n  clear n H H0 H1.\n  case_if. run. destruct x as [b1 b2].\n  applys red_expr_inequality_op. applys* get_inequality_op_correct.\n  run red_expr_inequality_op_1 using convert_twice_primitive_correct.\n  destruct a as [w1 w2]. let_name. destruct p as [wa wb]. simpls.\n  sets_eq wr: (inequality_test_primitive wa wb).\n  run_inv. applys_eq* (>> red_expr_inequality_op_2 EQp EQwr) 1.\n   fequals. case_if; case_if; case_if*; case_if*; case_if*; case_if*; case_if*; case_if*.\n  (* instanceof *)\n  case_if. subst.\n  destruct v2.\n  applys* red_expr_binary_op_instanceof_non_object.\n  run. lets M: run_object_method_correct (rm E).\n  destruct x.\n  applys* red_expr_binary_op_instanceof_normal.\n   simpls.\n   applys* red_spec_object_has_instance.\n   applys* run_object_has_instance_correct.\n  applys* red_expr_binary_op_instanceof_non_instance.\n  (* in *)\n  case_if. subst. destruct v2.\n  applys* red_expr_binary_op_in_non_object.\n  run red_expr_binary_op_in_object.\n    applys* red_expr_binary_op_in_1.\n    applys* object_has_prop_correct.\n  (* equal *)\n  clear n n0 H. case_if. subst.\n  applys* red_expr_binary_op_equal.\n    applys* runs_type_correct_equal.\n  (* disequal *)\n  case_if. subst.\n  run red_expr_binary_op_disequal.\n  applys* red_expr_binary_op_disequal_1.\n  (* strict equality *)\n  case_if. subst.\n  run_inv. applys* red_expr_binary_op_strict_equal.\n  (* strict disequality *)\n  case_if. subst.\n  run_inv. applys* red_expr_binary_op_strict_disequal.\n  (* coma *)\n  case_if. subst.\n  run_inv. applys* red_expr_binary_op_coma.\nAdmitted. (*faster*)\n\n(**************************************************************)\n(* Auxiliary results for [array_args_map_loop] *)\n\nLemma array_args_map_loop_no_abort : forall oes runs S o l C k,\n  array_args_map_loop runs S C l oes k = o -> exists S', o = out_ter S' res_empty.\nProof.\n  inductions oes; introv Hyp.\n\n  + simpls. exists S. inverts~ Hyp. \n  + simpls. run. eapply IHoes; eassumption.\nQed.\n\nLemma array_args_map_loop_correct : forall oes runs S S' l C k,\n   array_args_map_loop runs S C l oes k = res_void S' ->\n   red_expr S C (spec_call_array_new_3 l oes k) (out_ter S' l).\nProof.\n  induction oes; introv Hyp.\n\n  + simpls. inverts Hyp. apply red_spec_call_array_new_3_empty.\n  + simpls. unfolds res_void. run. rename x into S''.\n    apply pick_option_correct in E.\n    applys~ red_spec_call_array_new_3_nonempty. exact E.\n    jauto.\nQed.\n\n(**************************************************************)\n(* Auxiliary results for [spec_expr_get_value_conv] *)\n\nLemma run_construct_prealloc_correct : forall runs S C B args o,\n  runs_type_correct runs ->\n  run_construct_prealloc runs S C B args = o ->\n  red_expr S C (spec_construct_prealloc B args) o.\nProof.\n  introv IH HR. unfolds in HR.\n  destruct B.\n  (* prealloc_global *)\n  discriminate.\n  (* prealloc_global_eval *)\n  discriminate.\n  (* prealloc_global_parse_int *)\n  discriminate.\n  (* prealloc_global_parse_float *)\n  discriminate.\n  (* prealloc_global_is_finite *)\n  discriminate.\n  (* prealloc_global_is_nan *)\n  discriminate.\n  (* prealloc_global_decode_uri *)\n  discriminate.\n  (* prealloc_global_decode_uri_component *)\n  discriminate.\n  (* prealloc_global_encode_uri *)\n  discriminate.\n  (* prealloc_global_encode_uri_component *)\n  discriminate.\n  (* prealloc_object *)\n  let_name. subst.\n  applys* red_spec_call_object_new.\n    applys* get_arg_correct_0.\n  destruct (get_arg 0 args) as [p | l]; unfolds call_object_new; [destruct p | ]; simpls; repeat let_name; try destruct p as (l & S'); substs.\n  inverts HR. applys* red_spec_call_object_new_1_null_or_undef.\n  inverts HR. applys* red_spec_call_object_new_1_null_or_undef.\n  applys* red_spec_call_object_new_1_prim.\n  applys* to_object_correct.\n  applys* red_spec_call_object_new_1_prim.\n  applys* to_object_correct.\n  applys* red_spec_call_object_new_1_prim.\n  applys* to_object_correct.\n  inverts HR. applys* red_spec_call_object_new_1_object.  \n  (* prealloc_object_get_proto_of *)\n  discriminate.\n  (* prealloc_object_get_own_prop_descriptor *)\n  discriminate.\n  (* prealloc_object_get_own_prop_name *)\n  discriminate.\n  (* prealloc_object_create *)\n  discriminate.\n  (* prealloc_object_define_prop *)\n  discriminate.\n  (* prealloc_object_define_props *)\n  discriminate.\n  (* prealloc_object_seal *)\n  discriminate.\n  (* prealloc_object_freeze *)\n  discriminate.\n  (* prealloc_object_prevent_extensions *)\n  discriminate.\n  (* prealloc_object_is_sealed *)\n  discriminate.\n  (* prealloc_object_is_frozen *)\n  discriminate.\n  (* prealloc_object_is_extensible *)\n  discriminate.\n  (* prealloc_object_keys *)\n  discriminate.\n  (* prealloc_object_keys_call *)\n  discriminate.\n  (* prealloc_object_proto *)\n  discriminate.\n  (* prealloc_object_proto_to_string *)\n  discriminate.\n  (* prealloc_object_proto_value_of *)\n  discriminate.\n  (* prealloc_object_proto_has_own_prop *)\n  discriminate.\n  (* prealloc_object_proto_is_prototype_of *)\n  discriminate.\n  (* prealloc_object_proto_prop_is_enumerable *)\n  discriminate.\n  (* prealloc_function *)\n  discriminate. (* LATER *)\n  (* prealloc_function_proto *)\n  discriminate.\n  (* prealloc_function_proto_to_string *)\n  discriminate.\n  (* prealloc_function_proto_apply *)\n  discriminate.\n  (* prealloc_function_proto_call *)\n  discriminate.\n  (* prealloc_function_proto_bind *)\n  discriminate.\n  (* prealloc_bool *)\n  repeat let_name.\n  applys* red_spec_construct_bool.\n  apply get_arg_correct_0.\n  applys* red_spec_to_boolean.\n  destruct p as (l & S').\n  inverts HR.\n  applys* red_spec_construct_bool_1.\n  substs~. \n  (* prealloc_bool_proto *)\n  discriminate.\n  (* prealloc_bool_proto_to_string *)\n  discriminate.\n  (* prealloc_bool_proto_value_of *)\n  discriminate.\n  (* prealloc_number *)\n  let_name. cases_if*.\n  subst. repeat let_name. \n  remember (object_alloc S O) as p.\n  destruct p as (l & S1).\n  inverts HR.\n  applys* red_spec_construct_number_nil.\n  applys* red_spec_construct_number_1. substs~.\n  let_name. subst.\n  run~ red_spec_construct_number_not_nil.\n  applys~ get_arg_correct_0.\n  repeat let_name.\n  remember (object_alloc S0 O) as p.\n  destruct p as (l & S1).\n  inverts HR.\n  applys* red_spec_construct_number_1.\n  substs~.\n  (* prealloc_number_proto *)\n  discriminate.\n  (* prealloc_number_proto_to_string *)\n  discriminate.\n  (* prealloc_number_proto_value_of *)\n  discriminate.\n  (* prealloc_number_proto_to_fixed *)\n  discriminate.\n  (* prealloc_number_proto_to_exponential *)\n  discriminate.\n  (* prealloc_number_proto_to_precision *)\n  discriminate.\n\n  (* prealloc_array *)\n  repeat let_name. destruct p as (l & S'). repeat let_name.\n  subst arg_len. destruct args. case_if*. \n\n  applys~ red_spec_call_array_new_no_args. \n  eapply red_spec_call_array_new_1; try eassumption. \n  run. apply pick_option_correct in E.\n  applys* red_spec_call_array_new_2.\n  simpls. run. apply red_spec_call_array_new_3_empty.\n  destruct args. case_if*. clear e.\n  \n  unfolds get_arg. unfolds nth_def. subst v. \n  applys~ red_spec_call_array_new_single_arg.\n  applys~ red_spec_call_array_new_single_allocate; try (subst; eassumption).\n\n  destruct v0; [destruct p | ]; subst;\n  try solve [run; rename x into S''; run; rename x into S'''; apply pick_option_correct in E; apply pick_option_correct in E0;\n             apply (red_spec_call_array_new_single_not_prim_number S' S'') with (n := JsNumber.of_int 0); jauto;\n             introv Heq; inverts Heq].\n  \n  run~ red_spec_call_array_new_single_prim_number. cases_if*.\n  run; rename x into S''; apply pick_option_correct in E.\n  applys~ red_spec_call_array_new_single_number_correct.\n  applys~ red_spec_call_array_new_single_set_length.\n  applys~ red_spec_call_array_new_single_number_incorrect.\n  applys run_error_correct HR.\n  \n  cases_if*. eapply red_spec_call_array_new_multiple_args. reflexivity.\n  eapply red_spec_call_array_new_1; try eassumption.\n  run. apply pick_option_correct in E.\n  applys* red_spec_call_array_new_2.\n  remember (v1 :: args) as args'; clear dependent v1. \n  run_pre. run_post; subst.\n  apply array_args_map_loop_no_abort in R1.\n  destruct R1 as (S'' & Heq_o'). subst. inverts Ab.\n  false~ H0. inverts HR.\n  eapply array_args_map_loop_correct. eassumption.\n\n  (* prealloc_array_is_array *)\n  discriminate.\n  (* prealloc_array_proto *)\n  discriminate.\n  (* prealloc_array_proto_to_string *)\n  discriminate.\n  (* prealloc_array_proto_join *)\n  discriminate.\n  (* prealloc_array_proto_pop *)\n  discriminate.\n  (* prealloc_array_proto_push *)\n  discriminate.\n  (* prealloc_string *)\n  repeat let_name.\n  cases_if*. subst.\n  symmetry in EQarg_len. apply length_zero_inv in EQarg_len. subst.\n  apply red_spec_construct_string_empty. \n  let_name.\n  match goal with H: context [object_alloc ?s ?o] |- _ => sets_eq X: (object_alloc s o) end.\n  destruct X as (l & S'). let_name. subst.\n  run. rename x into S''. apply pick_option_correct in E.\n  remember (object_with_primitive_value\n             (object_with_get_own_property\n                (object_new prealloc_string_proto \"String\")\n                builtin_get_own_prop_string) \"\") as O.\n  applys* red_spec_construct_string_2; substs~.\n  applys* red_spec_construct_string_non_empty.\n  subst. destruct args; jauto; discriminate.\n  apply get_arg_correct_0. subst.\n  run red_spec_construct_string_1 using to_string_correct.\n  let_name.\n  match goal with H: context [object_alloc ?s ?o] |- _ => sets_eq X: (object_alloc s o) end.\n  destruct X as (l & S'). let_name. subst.\n  run. rename x into S''. apply pick_option_correct in E.\n  remember (object_with_primitive_value\n             (object_with_get_own_property\n                (object_new prealloc_string_proto \"String\")\n                builtin_get_own_prop_string) \"\") as O.\n  applys* red_spec_construct_string_2; substs~.\n  (* prealloc_string_proto *)\n  discriminate.\n  (* prealloc_string_proto_to_string *)\n  discriminate.\n  (* prealloc_string_proto_value_of *)\n  discriminate.\n  (* prealloc_string_proto_char_at *)\n  discriminate.\n  (* prealloc_string_proto_char_code_at *)\n  discriminate.\n  (* prealloc_math *)\n  discriminate.\n  (* prealloc_mathop *)\n  discriminate.\n  (* prealloc_date *)\n  discriminate.\n  (* prealloc_regexp *)\n  discriminate.\n  (* prealloc_error *)\n  let_name. apply~ red_spec_construct_error.\n    apply~ get_arg_correct_0.\n  substs. apply* build_error_correct.  \n  (* prealloc_error_proto *)\n  discriminate.\n  (* prealloc_native_error *)  \n  let_name. apply~ red_spec_construct_native_error.\n    apply~ get_arg_correct_0.\n  substs. apply* build_error_correct.\n  (* prealloc_native_error_proto *)\n  discriminate. (* TODO *)\n  (* prealloc_error_proto_to_string *)\n  discriminate.\n  (* prealloc_throw_type_error *)\n  discriminate.\n  (* prealloc_json *)\n  discriminate.\nAdmitted. (*faster*)\n\nLemma run_construct_default_correct : forall runs S C l args o,\n  runs_type_correct runs ->\n  run_construct_default runs S C l args = res_out o ->\n  red_expr S C (spec_construct_default l args) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_construct_default using run_object_get_correct.\n  let_simpl. let_simpl. let_name. destruct p as [l' S2].\n  run* red_spec_construct_default_1. rewrite* EQp. case_if; case_if*.\n  let_simpl. run_inv.\n  applys* red_spec_function_construct_2. case_if; case_if*.\nAdmitted. (*faster*)\n\nLemma run_construct_correct : forall runs S C co l args o,\n  runs_type_correct runs ->\n  run_construct runs S C co l args = o ->\n  red_expr S C (spec_construct_1 co l args) o.\nProof.\n  introv IH HR. unfolds in HR.\n  destruct co.\n    applys* red_spec_construct_1_default. applys* run_construct_default_correct.\n\n    repeat run. apply run_object_method_correct in E.  \n    apply run_object_method_correct in E1; subst.\n    applys* red_spec_construct_1_after_bind.\n    destruct x1. repeat run. let_name. \n    apply run_object_method_correct in E0; subst. \n    applys* red_spec_construct_1_after_bind_1_some.\n    applys* runs_type_correct_construct.\n    applys* red_spec_construct_1_after_bind_1_none.\n\n    applys* red_spec_construct_1_prealloc. applys* run_construct_prealloc_correct.\nAdmitted. (* faster *)\n\n\nLemma creating_function_object_proto_correct : forall runs S C l o,\n  runs_type_correct runs ->\n  creating_function_object_proto runs S C l = o ->\n  red_expr S C (spec_creating_function_object_proto l) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_creating_function_object_proto\n    using run_construct_prealloc_correct.\n  let_simpl. run red_spec_creating_function_object_proto_1.\n  let_simpl. applys* red_spec_creating_function_object_proto_2. run_hyp*.\nAdmitted. (* faster *)\n\n\nLemma creating_function_object_correct : forall runs S C names bd X str o,\n  runs_type_correct runs ->\n  creating_function_object runs S C names bd X str = o ->\n  red_expr S C (spec_creating_function_object names bd X str) o.\nProof.\n  introv IH HR. unfolds in HR.\n  let_simpl. let_simpl. let_simpl. let_simpl. let_name. destruct p as [l S1].\n  let_simpl. run* red_spec_creating_function_object.\n  run red_spec_creating_function_object_1\n    using creating_function_object_proto_correct.\n  case_if; destruct str; tryfalse.\n    run_inv. applys* red_spec_creating_function_object_2_not_strict.\n    let_simpl. let_simpl.\n     run* red_spec_creating_function_object_2_strict. clear EQp.\n     run* red_spec_creating_function_object_3.\n     applys* red_spec_creating_function_object_4.\nAdmitted. (* faster*)\n\n\nLemma env_record_has_binding_correct : forall runs S C L x o,\n  runs_type_correct runs ->\n  env_record_has_binding runs S C L x = o ->\n  red_expr S C (spec_env_record_has_binding L x) o.\nProof.\n  introv IH HR. unfolds in HR. run_simpl.\n  forwards B: @pick_option_correct (rm E).\n  applys~ red_spec_env_record_has_binding B. destruct x0; run_inv.\n   apply~ red_spec_env_record_has_binding_1_decl.\n    rewrite decide_def; auto.\n   apply~ red_spec_env_record_has_binding_1_object.\n    apply* object_has_prop_correct.\nQed.\n\n\nLemma binding_inst_function_decls_correct : forall runs S C args L fds str bconfig o,\n  runs_type_correct runs ->\n  binding_inst_function_decls runs S C L fds str bconfig = o ->\n  red_expr S C (spec_binding_inst_function_decls args L fds str bconfig) o.\nProof.\n  introv IH HR. gen S o. induction fds; introv HR.\n  simpls. run_inv. applys* red_spec_binding_inst_function_decls_nil.\n  simpls. let_name. let_name. let_name. let_name.\n  run (@red_spec_binding_inst_function_decls_cons str_fd)\n    using creating_function_object_correct. subst*. subst*. clear R1.\n  let_name as M. rename a into fd. rename l into fo.\n  asserts M_correct: (forall S o,\n      M S = o ->\n      red_expr S C (spec_binding_inst_function_decls_5 args L fd fds str fo bconfig) o).\n    clears HR S o. introv HR. subst M.\n    subst fname. run red_spec_binding_inst_function_decls_5\n      using env_record_set_mutable_binding_correct.\n    applys* red_spec_binding_inst_function_decls_6.\n    clear EQM.\n  subst fname. run red_spec_binding_inst_function_decls_1\n    using env_record_has_binding_correct.\n  case_if; subst.\n    case_if; try subst L.\n      run red_spec_binding_inst_function_decls_2_true_global\n        using run_object_get_prop_correct.\n       destruct a; tryfalse. case_if.\n         let_name. run* red_spec_binding_inst_function_decls_3_true.\n          applys* red_spec_binding_inst_function_decls_4.\n         applys red_spec_binding_inst_function_decls_3_false.\n           destruct (attributes_configurable a); tryfalse; auto. (* LATER: cleanup *)\n          case_if.\n            applys* red_spec_binding_inst_function_decls_3a_type_error.\n            applys* red_spec_binding_inst_function_decls_3a_no_error.\n        applys* red_spec_binding_inst_function_decls_2_true.\n    run red_spec_binding_inst_function_decls_2_false\n      using env_record_create_mutable_binding_correct.\n     applys* red_spec_binding_inst_function_decls_4.\nAdmitted. (* faster *)\n\n\nLemma binding_inst_var_decls_correct : forall runs S C L vds bconfig str o,\n  runs_type_correct runs ->\n  binding_inst_var_decls runs S C L vds bconfig str = o ->\n  red_expr S C (spec_binding_inst_var_decls L vds bconfig str) o.\nProof.\n  introv IH HR. gen S o. induction vds; introv HR.\n  simpls. run_inv. applys* red_spec_binding_inst_var_decls_nil.\n  simpls. let_simpl.\n  run red_spec_binding_inst_var_decls_cons\n    using env_record_has_binding_correct.\n  case_if; subst.\n    applys* red_spec_binding_inst_var_decls_1_true.\n    run red_spec_binding_inst_var_decls_1_false\n      using env_record_create_set_mutable_binding_correct.\n     applys* red_spec_binding_inst_var_decls_2.\nAdmitted. (* faster *)\n\nLemma binding_inst_formal_params_correct : forall runs S C L args names str o,\n  runs_type_correct runs ->\n  binding_inst_formal_params runs S C L args names str = o ->\n  red_expr S C (spec_binding_inst_formal_params args L names str) o.\nProof.\n  introv IH HR. gen S args o. induction names; introv HR.\n  simpls. run_inv. applys* red_spec_binding_inst_formal_params_empty.\n  simpls.\n  let_name. let_name.\n  run (@red_spec_binding_inst_formal_params_non_empty v args')\n    using env_record_has_binding_correct.\n    subst v args'. destruct* args.\n  let_name as M. asserts M_correct: (forall S o,\n      M S = o ->\n      red_expr S C (spec_binding_inst_formal_params_3 args' L a names str v) o).\n    clears HR S o. introv HR. subst M.\n    run red_spec_binding_inst_formal_params_3\n      using env_record_set_mutable_binding_correct.\n    applys* red_spec_binding_inst_formal_params_4.\n    clear EQM.\n  case_if; subst.\n    applys* red_spec_binding_inst_formal_params_1_declared.\n     run red_spec_binding_inst_formal_params_1_not_declared\n       using env_record_create_mutable_binding_correct.\n    applys* red_spec_binding_inst_formal_params_2.\nAdmitted. (* faster *)\n\n\nLemma make_arg_getter_correct : forall runs S C x X o,\n  runs_type_correct runs ->\n  make_arg_getter runs S C x X = o ->\n  red_expr S C (spec_make_arg_getter x X) o.\nProof.\n  introv IH HR. unfolds in HR.\n  apply~ red_spec_make_arg_getter. applys~ creating_function_object_correct HR.\nQed.\n\nLemma make_arg_setter_correct : forall runs S C x X o,\n  runs_type_correct runs ->\n  make_arg_setter runs S C x X = o ->\n  red_expr S C (spec_make_arg_setter x X) o.\nProof.\n  introv IH HR. unfolds in HR.\n  apply~ red_spec_make_arg_setter. applys~ creating_function_object_correct HR.\nQed.\n\nLemma arguments_object_map_loop_correct : forall runs S C l xs len args args' X str lmap xsmap o,\n  runs_type_correct runs ->\n  len = length args ->\n  arguments_object_map_loop runs S C l xs len args X str lmap xsmap = o ->\n  red_expr S C (spec_arguments_object_map_2 l xs (args ++ args') X str lmap xsmap (len - 1)) o.\nProof.\n  introv IH EQlen HR. gen o args args' S xsmap. induction len; introv EQlen HR.\n   simpls. apply~ red_spec_arguments_object_map_2_negative. math. cases_if.\n     substs. inverts HR. apply~ red_spec_arguments_object_map_8_nil.\n     run. let_name. inverts HR. forwards~ B: @pick_option_correct E.\n     applys~ red_spec_arguments_object_map_8_cons B. substs*.\n   unfolds in HR. fold arguments_object_map_loop in HR.\n    let_name. destruct tdl as (rmlargs&largs).\n    forwards EQargs: take_drop_last_spec EQtdl; [destruct args; tryfalse; discriminate|].\n    forwards EQlargs: take_drop_last_length EQtdl; [destruct args; tryfalse; discriminate|].\n    clear EQtdl. simpl in HR.\n    let_name. let_name. asserts Loop: (forall S xsmap o,\n        arguments_object_map_loop' S xsmap = o ->\n        red_expr S C (spec_arguments_object_map_2 l xs (rmlargs ++ largs :: args') X str lmap xsmap (len - 1)) o).\n      clear HR. introv RES. subst arguments_object_map_loop'. apply* IHlen. math.\n    clear EQarguments_object_map_loop'.\n    asserts_rewrite (Datatypes.S len - 1 = len). math.\n    run~ red_spec_arguments_object_map_2_positive using object_define_own_prop_correct.\n      clear HR. subst args. rew_app. applys~ ZNth_app_r ZNth_here. math.\n      subst A. auto*.\n    clear R1 EQA. cases_if.\n     apply~ red_spec_arguments_object_map_3_next.\n       apply~ nat_int_ge.\n      rewrite EQargs. rew_app. apply~ Loop.\n     let_name. asserts ZN: (ZNth len xs x).\n        apply Nth_to_ZNth. forwards (x'&N): length_Nth_lt len xs. math.\n        forwards EQx': Nth_to_nth_def \"\" N. subst x'. rewrite~ <- EQx in N.\n      cases_if.\n       applys~ red_spec_arguments_object_map_3_cont_next ZN.\n        rewrite EQargs. rew_app. apply~ Loop.\n       applys~ red_spec_arguments_object_map_3_cont_cont ZN.\n        rew_logic in n0. destruct n0 as [? NI]. splits.\n         destruct~ str; false.\n         auto*.\n        run red_spec_arguments_object_map_4 using make_arg_getter_correct.\n        run red_spec_arguments_object_map_5 using make_arg_setter_correct.\n        let_name. run~ red_spec_arguments_object_map_6.\n          rewrite EQA' in R1. simpl in R1.\n          simpl. auto*.\n        apply~ red_spec_arguments_object_map_7.\n        rewrite EQargs. rew_app. apply~ Loop.\nAdmitted. (* faster *)\n\nLemma arguments_object_map_correct : forall runs S C l xs args X str o,\n  runs_type_correct runs ->\n  arguments_object_map runs S C l xs args X str = o ->\n  red_expr S C (spec_arguments_object_map l xs args X str) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_arguments_object_map using run_construct_prealloc_correct.\n  apply~ red_spec_arguments_object_map_1.\n  rewrite <- (app_nil_r args).\n  apply* arguments_object_map_loop_correct; rew_app~.\nQed.\n\nLemma create_arguments_object_correct : forall runs S C lf xs args X str o,\n  runs_type_correct runs ->\n  create_arguments_object runs S C lf xs args X str = o ->\n  red_expr S C (spec_create_arguments_object lf xs args X str) o.\nProof.\n  introv IH HR. unfolds in HR. let_name. let_name. destruct p as [l S'].\n  let_name. run* red_spec_create_arguments_object; try solve [ substs* ].\n  clear EQA EQO EQp A. run red_spec_create_arguments_object_1\n    using arguments_object_map_correct. cases_if.\n   let_name. let_name.\n    run* red_spec_create_arguments_object_2_strict; try solve [ substs* ].\n    clear EQA. run red_spec_create_arguments_object_3.\n    apply~ red_spec_create_arguments_object_4.\n   let_name.\n    run* red_spec_create_arguments_object_2_non_strict; try solve [ substs* ].\n    clear EQA. apply~ red_spec_create_arguments_object_4.\nQed.\n\nLemma binding_inst_arg_obj_correct : forall runs S C lf p xs args L o,\n  runs_type_correct runs ->\n  binding_inst_arg_obj runs S C lf p xs args L = o ->\n  red_expr S C (spec_binding_inst_arg_obj lf p xs args L) o.\nProof.\n  introv IH HR. unfolds in HR. let_name.\n  run~ red_spec_binding_inst_arg_obj using create_arguments_object_correct.\n  cases_if.\n   run red_spec_binding_inst_arg_obj_1_strict\n     using env_record_create_immutable_binding_correct.\n    apply~ red_spec_binding_inst_arg_obj_2.\n    apply~ env_record_initialize_immutable_binding_correct.\n   apply~ red_spec_binding_inst_arg_obj_1_not_strict.\n    applys~ env_record_create_set_mutable_binding_correct HR.\nQed.\n\n\nLemma execution_ctx_binding_inst_correct : forall runs S C ct funco (p:prog) args o,\n  runs_type_correct runs ->\n  execution_ctx_binding_inst runs S C ct funco p args = o ->\n  red_expr S C (spec_binding_inst ct funco p args) o.\nProof.\n  introv IH HR. unfolds in HR.\n  cases (execution_ctx_variable_env C); tryfalse. rename e into L.\n  applys* red_spec_binding_inst. clears TEMP. let_simpl.\n  let_name as M. asserts M_correct: (forall S xs o,\n      M S xs = o ->\n      red_expr S C (spec_binding_inst_3 ct funco p xs args L) o).\n    clear HR S o. introv HR. subst M.\n    let_name. let_name.\n    run red_spec_binding_inst_3\n      using binding_inst_function_decls_correct.\n        subst bconfig. rewrite decide_def. auto.\n        auto.\n    applys red_spec_binding_inst_4.\n    run red_spec_binding_inst_5 using env_record_has_binding_correct.\n    let_name as N. asserts N_correct: (forall S o,\n      N S = o ->\n      red_expr S C (spec_binding_inst_8 p bconfig L) o).\n      clear HR S o. introv HR. subst N.\n      applys red_spec_binding_inst_8.\n        applys* binding_inst_var_decls_correct.\n      clear EQN.\n    destruct ct.\n      destruct funco.\n        destruct b; tryfalse.\n          applys* red_spec_binding_inst_6_no_arguments. rew_logic*.\n          run red_spec_binding_inst_6_arguments\n            using binding_inst_arg_obj_correct.\n           applys* red_spec_binding_inst_7.\n        destruct b; tryfalse.\n         applys* red_spec_binding_inst_6_no_arguments. rew_logic*.\n      applys* red_spec_binding_inst_6_no_arguments.\n       rew_logic*. left. congruence.\n      applys* red_spec_binding_inst_6_no_arguments.\n       rew_logic*. left; congruence.\n  destruct ct; destruct funco; tryfalse.\n    run. lets H: run_object_method_correct (rm E).\n     run. subst. run* red_spec_binding_inst_1_function\n       using binding_inst_formal_params_correct.\n     applys* red_spec_binding_inst_2.\n    applys* red_spec_binding_inst_1_not_function. congruence.\n    applys* red_spec_binding_inst_1_not_function. congruence.\nAdmitted. (* faster *)\n\n\nLemma entering_eval_code_correct : forall runs S C bdirect bd F K o,\n  runs_type_correct runs ->\n  entering_eval_code runs S C bdirect bd F = o ->\n  (forall S' C' o', F S' C' = o' -> red_expr S' C' K o') ->\n  red_expr S C (spec_entering_eval_code bdirect bd K) o.\nProof.\n  introv IH HR HK. unfolds in HR.\n  let_name. let_name.\n  applys* red_spec_entering_eval_code str C'. case_if; case_if*.\n  let_name. destruct p as [lex S'].\n  let_name. let_name.\n  run_pre. applys* red_spec_entering_eval_code_1 str lex S' C1 o1.\n    rewrite EQp. case_if; case_if*.\n    subst C1. case_if; case_if*.\n    subst p. applys* execution_ctx_binding_inst_correct R1.\n    run_post. clear R1.\n  applys* red_spec_entering_eval_code_2.\nAdmitted. (* faster *)\n\n\nLemma run_eval_correct : forall runs S C (is_direct_call : bool) vs o,\n  runs_type_correct runs ->\n  run_eval runs S C is_direct_call vs = o ->\n  red_expr S C (spec_call_global_eval is_direct_call vs) o.\nProof.\n  introv IH HR. unfolds in HR.\n  lets (v&H&E): arguments_from_spec_1 vs. rewrites (rm E) in *.\n  applys* red_spec_call_global_eval (rm H).\n  destruct v;\n   [| run_inv; applys* red_spec_call_global_eval_1_not_string; simpl; congruence].\n  destruct p; run_inv;\n     try (applys* red_spec_call_global_eval_1_not_string; simpl; congruence).\n  let_name. destruct (pick_option (parse s str)) eqn:P.\n   forwards B: @pick_option_correct (rm P).\n    applys* red_spec_call_global_eval_1_string_parse.\n    applys* entering_eval_code_correct (rm HR).\n    clear - IH. introv HR. run red_spec_call_global_eval_2.\n    sets_eq RT: (res_type R). destruct RT; tryfalse.\n     run. cases (res_value R); tryfalse; run_inv.\n      applys* red_spec_call_global_eval_3_normal_empty.\n      destruct R. simpls. subst.\n       applys* red_spec_call_global_eval_3_normal_value.\n     run_inv. applys* red_spec_call_global_eval_3_throw.\n   applys red_spec_call_global_eval_1_string_not_parse.\n    introv Pa. forwards (?&Par): @pick_option_defined (ex_intro _ p Pa).\n     rewrite Par in P. false.\n    applys run_error_correct HR.\nAdmitted. (*faster*)\n\nLemma run_list_expr_correct : forall runs S C es y,\n  runs_type_correct runs ->\n  run_list_expr runs S C nil es = result_some y ->\n  red_spec S C (spec_list_expr es) y.\nProof.\n  introv IH. cuts M: (forall es S C vs y,\n      run_list_expr runs S C vs es = result_some y ->\n      red_spec S C (spec_list_expr_1 (rev vs) es) y).\n    intros HR. apply red_spec_list_expr. applys* M (@nil value).\n  clears S C es y. intros es. induction es; introv HR.\n  simpls. run_inv. applys* red_spec_list_expr_1_nil.\n  simpls. run red_spec_list_expr_1_cons.\n   applys red_spec_list_expr_2. forwards M: IHes HR.\n   rew_list in M. auto.\nAdmitted. (*faster*)\n\n\nLemma run_call_default_correct : forall runs S C lf o,\n  runs_type_correct runs ->\n  run_call_default runs S C lf = o ->\n  red_expr S C (spec_call_default_1 lf) o.\nProof.\n  introv IH HR. unfolds in HR. let_simpl.\n  run. applys* red_spec_call_default_1.\n    applys* run_object_method_correct. clear E.\n  destruct x.\n    case_if.\n      applys* red_spec_call_default_2_empty_body.\n       run_inv. applys* red_spec_call_default_3_normal.\n      run* red_spec_call_default_2_body.\n        destruct R as [RT RV RL]; simpls. subst.\n         applys red_spec_call_default_3_normal.\n        destruct R as [RT RV RL]; simpls. subst.\n         applys red_spec_call_default_3_return.\n        subst. abort.\n    applys* red_spec_call_default_2_empty_body.\n     run_inv. applys* red_spec_call_default_3_normal.\nAdmitted. (* faster *)\n\n\nLemma env_record_implicit_this_value_correct : forall S C L v,\n  env_record_implicit_this_value S L = Some v ->\n  red_expr S C (spec_env_record_implicit_this_value L) (out_ter S v).\nProof.\n  introv HR. unfolds in HR.\n  run_simpl HR as H; tryfalse. inverts H. forwards B: @pick_option_correct (rm E).\n  applys~ red_spec_env_record_implicit_this_value B. destruct n.\n   applys~ red_spec_env_record_implicit_this_value_1_decl.\n   applys~ red_spec_env_record_implicit_this_value_1_object.\nQed.\n\nLemma run_expr_call_correct : forall runs S C e1 e2s o,\n  runs_type_correct runs ->\n  run_expr_call runs S C e1 e2s = o ->\n  red_expr S C (expr_call e1 e2s) o.\nProof.\n  introv IH HR. unfolds in HR.\n  let_name. run red_expr_call.\n  run red_expr_call_1 using ref_get_value_correct.\n  run red_expr_call_2 using run_list_expr_correct.\n  destruct a.\n    applys* red_expr_call_3.\n  case_if.\n  applys* red_expr_call_3_callable.\n  rename o0 into l. rename a0 into vs.\n  let_name as M. asserts M_correct: (forall S0 vthis o,\n      M vthis = o ->\n      red_expr S0 C (expr_call_5 l is_eval_direct vs (out_ter S3 vthis)) o).\n    clear HR S o. introv HR. subst M.\n    case_if.\n      subst. applys red_expr_call_5_eval. applys* run_eval_correct.\n      applys* red_expr_call_5_not_eval. apply* IH.\n    clear EQM.\n  subst. destruct rv; tryfalse.\n    applys* red_expr_call_4_not_ref.\n    cases (ref_base r).\n      case_if. applys* red_expr_call_4_prop.\n      run. applys* red_expr_call_4_env.\n       applys* env_record_implicit_this_value_correct.\n  (* other branch *)\n  applys* red_expr_call_3.\nAdmitted. (*faster*)\n\nLtac run_select_proj_extra_construct HT ::=\n  match HT with\n  | run_construct_prealloc => constr:(run_construct_prealloc_correct)\n  | run_construct => constr:(run_construct_correct)\n  | run_call_default => constr:(run_call_default_correct)\n  | creating_function_object_proto => constr:(creating_function_object_proto_correct)\n  | creating_function_object => constr:(creating_function_object_correct)\n  | run_list_expr => constr:(run_list_expr_correct)\n  | execution_ctx_binding_inst => constr:(execution_ctx_binding_inst_correct)\n  end.\n\n\n(**************************************************************)\n(** ** Property descriptors *)\n\nLemma from_prop_descriptor_correct : forall runs S0 S C D o,\n  runs_type_correct runs ->\n  from_prop_descriptor runs S C D = o ->\n  red_expr S0 C (spec_from_descriptor (ret S D)) o.\nProof.\n  introv IH HR. unfolds in HR. destruct D.\n  run_inv. applys* red_spec_from_descriptor_undef.\n  run* red_spec_from_descriptor_some.\n  rename a into A.\n  let_name as M. asserts M_correct: (forall S0 S b o,\n    M S b = res_out o ->\n    red_expr S0 C (spec_from_descriptor_4 l A (out_ter S b)) o).\n   clear HR S o. introv HR. subst M.\n    let_name. run* red_spec_from_descriptor_4. congruence.\n    let_name. run* red_spec_from_descriptor_5. congruence.\n    applys* red_spec_from_descriptor_6.\n    clear EQM.\n  destruct A.\n    let_name. run* red_spec_from_descriptor_1_data. congruence.\n     let_name. run red_spec_from_descriptor_2_data. congruence.\n     applys* M_correct.\n    let_name. run red_spec_from_descriptor_1_accessor. congruence.\n     let_name. run red_spec_from_descriptor_3_accessor. congruence.\n     applys* M_correct.\nAdmitted. (*faster*)\n\n\n(**************************************************************)\n(** ** Object Initialisation *)\n\nLemma create_new_function_in_correct : forall runs S C args bd o,\n  runs_type_correct runs ->\n  create_new_function_in runs S C args bd = o ->\n  red_expr S C (spec_create_new_function_in C args bd) o.\nProof.\n  introv IH HR. unfolds in HR. applys red_spec_create_new_function_in.\n  applys* creating_function_object_correct.\nQed.\n\nLemma init_object_correct : forall runs S C l (pds : propdefs) o,\n  runs_type_correct runs ->\n  init_object runs S C l pds = o ->\n  red_expr S C (expr_object_1 l pds) o.\nProof.\n  introv IH. gen S. induction pds as [|(pn&pb) pds]; introv HR.\n  simpls. run_inv. applys red_expr_object_1_nil.\n  simpls. let_name. let_name.\n  asserts follows_correct: (forall S Desc, follows S Desc = res_out o ->\n      red_expr S C (expr_object_4 l x Desc pds) o).\n    subst follows. clear HR. introv HR.\n    run red_expr_object_4 using object_define_own_prop_correct.\n     applys* red_expr_object_5.\n    clear EQfollows.\n  applys* red_expr_object_1_cons x.\n  destruct pb.\n   run red_expr_object_2_val.\n    applys* red_expr_object_3_val.\n   run red_expr_object_2_get using create_new_function_in_correct.\n    applys* red_expr_object_3_get.\n   run red_expr_object_2_set using create_new_function_in_correct.\n    applys* red_expr_object_3_set.\nQed.\n\nLemma red_expr_array_3_object_loc_eq : forall ElementList S S' C l l' k,\n  red_expr S C (expr_array_3 l ElementList k) (out_ter S' l') -> l = l'.\nProof.\n  induction ElementList using (measure_induction length).\n  destruct ElementList; introv Hyp.\n\n  + inverts~ Hyp. inverts~ H0. \n\n  + destruct o.\n    - inverts Hyp. inverts H0. \n      inverts H8.  inverts H1. unfolds abrupt_res. false~ H4.\n      inverts H10. inverts H1. unfolds abrupt_res. false~ H4.\n      inverts H12. inverts H1. unfolds abrupt_res. false~ H4.\n      inverts H13. inverts H1. unfolds abrupt_res. false~ H4.\n      inverts H14. inverts H1. unfolds abrupt_res. false~ H4.\n      specializes~ H H6. rew_length; nat_math.\n\n    - inverts Hyp. inverts H0.\n      specializes~ H H10. \n      inverts H4.\n      * rew_length; nat_math.\n      * destruct H as (e & oes' & Heq). subst.\n        rewrite H3. rew_length.\n        destruct Elision. rewrite app_nil_l in H3.\n        inverts H3. rew_length; nat_math.\nAdmitted. (*faster*)\n\nLemma run_array_element_list_correct : forall runs S C l oes o k,\n  runs_type_correct runs ->\n  run_array_element_list runs S C l oes k = o ->\n  red_expr S C (expr_array_3 l oes k) o.\nProof.\n  introv IH HR. gen runs S C l o. \n  destruct oes; intros. \n\n  + inverts HR. apply red_expr_array_3_nil.\n\n  + destruct o.\n    - unfolds run_array_element_list.       \n      let_name. subst. \n      run~ red_expr_array_3_some_val; rename a into v.\n      run~ red_expr_array_3_get_len using run_object_get_correct.\n      run~ red_expr_array_3_convert_len.\n      run~ red_expr_array_3_add_len.\n      let_name. subst. run~ red_expr_array_3_def_own_prop.\n      run red_expr_array_3_next. substs~. \n      \n    - simpls. let_name.   \n      eapply red_expr_array_3_none.\n      * apply elision_head_decomposition. \n      * jauto. * jauto. * jauto.                        \n      * substs. applys* runs_type_correct_array_element_list. \nQed.\n\nLemma init_array_correct : forall runs S C l oes o,\n  runs_type_correct runs ->\n  init_array runs S C l oes = o ->\n  red_expr S C (expr_array_1 l oes) o.\nProof.\n  introv IH HR. unfolds in HR. let_name. let_name. \n  apply red_expr_array_1 with (ElementList := ElementList) \n                              (Elision := list_repeat None ElisionLength) \n                              (ElisionLength := ElisionLength); \n    try solve [try rewrite my_Z_of_nat_def; substs~]. \n  \n  run red_expr_array_2.\n  eapply run_array_element_list_correct; eassumption.\n  apply run_array_element_list_correct in R1; auto. \n  apply red_expr_array_3_object_loc_eq in R1. subst l0.\n    \n  apply red_expr_array_add_length.  \n    run red_expr_array_add_length_0 using run_object_get_correct.\n    run red_expr_array_add_length_1. run red_expr_array_add_length_2. \n    run red_expr_array_add_length_3. apply red_expr_array_add_length_4.\nQed.\n\nLemma lexical_env_get_identifier_ref_correct : forall runs S C lexs x str y,\n  runs_type_correct runs ->\n  lexical_env_get_identifier_ref runs S C lexs x str = result_some y ->\n  red_spec S C (spec_lexical_env_get_identifier_ref lexs x str) y.\nProof.\n  introv IH. gen S C. induction lexs; introv HR.\n  simpls. run_inv.\n   applys* red_spec_lexical_env_get_identifier_ref_nil.\n  simpls.\n  applys red_spec_lexical_env_get_identifier_ref_cons.\n  run red_spec_lexical_env_get_identifier_ref_cons_1 using env_record_has_binding_correct.\n  cases_if; run_inv.\n   apply~ red_spec_lexical_env_get_identifier_ref_cons_2_true.\n   apply~ red_spec_lexical_env_get_identifier_ref_cons_2_false.\nQed.\n\nLemma run_typeof_value_correct : forall S v,\n  run_typeof_value S v = typeof_value S v.\nProof. intros. destruct v; simpl. auto. case_if; case_if*. Qed.\n\nLtac run_select_proj_extra_get_value HT ::=\n  match HT with\n  | ref_get_value => constr:(ref_get_value_correct)\n  end.\n\n\n(**************************************************************)\n(** ** Main theorem *)\n\nHint Extern 1 (regular_unary_op _) =>\n    intros ?; false_invert.\n\nLemma prepost_op_correct : forall u F ispre,\n  run_prepost_op u = Some (F,ispre) ->\n  prepost_op u F ispre.\nProof.\n  Hint Constructors prepost_op.\n  introv HR. destruct u; simpls; inverts* HR.\nQed.\n\n\nLemma object_delete_default_correct : forall runs S C l x str o,\n  runs_type_correct runs ->\n  object_delete_default runs S C l x str = o ->\n  red_expr S C (spec_object_delete_1 builtin_delete_default l x str) o.\nProof.\n  introv IH HR. unfolds in HR. run red_spec_object_delete_1_default. destruct a.\n   run_inv. applys red_spec_object_delete_2_undef. (* This rule is erroneous, the conclusion should contains [S0] instead [S]. *)\n   case_if.\n     run. forwards B: @pick_option_correct (rm E).\n       applys_eq* red_spec_object_delete_2_some_configurable 1.\n     applys* red_spec_object_delete_3_some_non_configurable.\n      applys* out_error_or_cst_correct.\nQed.\n\nLemma object_delete_correct : forall runs S C l x str o,\n  runs_type_correct runs ->\n  object_delete runs S C l x str = o ->\n  red_expr S C (spec_object_delete l x str) o.\nProof.\n  introv IH HR. unfolds in HR. run. rename x0 into B. (* LTAC ARTHUR *)\n  applys* red_spec_object_delete.\n   applys* run_object_method_correct. clear E.\n  destruct B.\n  (* default *)\n  applys~ object_delete_default_correct HR.\n  (* argument object *)\n  run. forwards* obpm: run_object_method_correct.\n  run. substs. run~ red_spec_object_delete_args_obj.\n  run red_spec_object_delete_args_obj_1 using object_delete_default_correct.\n  cases_if. destruct a. (* LTAC ARTHUR *)\n   apply~ red_spec_object_delete_args_obj_2_else.\n    inverts HR. apply~ red_spec_object_delete_args_obj_4.\n   run red_spec_object_delete_args_obj_2_if.\n    apply~ red_spec_object_delete_args_obj_3.\n    apply~ red_spec_object_delete_args_obj_4.\n   apply~ red_spec_object_delete_args_obj_2_else.\n    inverts HR. apply~ red_spec_object_delete_args_obj_4.\nQed.\n\n\nLemma env_record_delete_binding_correct : forall runs S C L x o,\n  runs_type_correct runs ->\n  env_record_delete_binding runs S C L x = o ->\n  red_expr S C (spec_env_record_delete_binding L x) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run_simpl. forwards B: @pick_option_correct (rm E).\n  applys~ red_spec_env_record_delete_binding B. destruct x0.\n   sets_eq <- ero E: (Heap.read_option d x). destruct ero as [[mu ?]|].\n    rewrite <- Heap.binds_equiv_read_option in E. destruct mu; run_inv;\n     applys~ red_spec_env_record_delete_binding_1_decl_indom E; case_if*.\n    rewrite <- Heap.not_indom_equiv_read_option in E. run_inv.\n     applys~ red_spec_env_record_delete_binding_1_decl_not_indom E.\n   run. apply~ red_spec_env_record_delete_binding_1_object.\nQed.\n\n\nLemma identifier_resolution_correct : forall runs S C x y,\n  runs_type_correct runs ->\n  identifier_resolution runs S C x = result_some y ->\n  red_spec S C (spec_identifier_resolution C x) y.\nProof.\n  introv IH HR.\n  unfolds spec_identifier_resolution, identifier_resolution.\n  applys* lexical_env_get_identifier_ref_correct.\nQed.\n\nLemma run_expr_correct : forall runs S C e o,\n  runs_type_correct runs ->\n  run_expr runs S C e = o ->\n  red_expr S C (expr_basic e) o.\nProof.\n  introv IH R. unfolds in R.\n  destruct e as [ | | | pds | oes | | |  | | | | | | ].\n  (* this *)\n  run_inv. apply~ red_expr_this.\n  (* identifier *)\n  run_inv. run red_expr_identifier using identifier_resolution_correct.\n  applys* red_expr_identifier_1.\n  (* literal *)\n  run_inv. apply~ red_expr_literal.\n  (* object *)\n  run red_expr_object using run_construct_prealloc_correct.\n  applys red_expr_object_0.\n  applys* init_object_correct.\n\n  (* _ARRAYS_ *)\n  run red_expr_array using run_construct_prealloc_correct.\n  applys red_expr_array_0.\n  applys* init_array_correct.\n\n  (* function *)\n  unfolds in R. destruct o0.\n    let_name. destruct p as (lex'&S').\n     destruct lex' as [|L lex']; simpls; tryfalse.\n     run_simpl. forwards: @pick_option_correct (rm E).\n     run* red_expr_function_named using env_record_create_immutable_binding_correct.\n     run red_expr_function_named_1 using creating_function_object_correct.\n     run red_expr_function_named_2 using env_record_initialize_immutable_binding_correct.\n     apply~ red_expr_function_named_3.\n    apply~ red_expr_function_unnamed. applys~ creating_function_object_correct IH.\n  (* Access *)\n  unfolds in R. run red_expr_access.\n  run red_expr_access_1. cases_if.\n    forwards [R1 N]: run_error_correct' C (rm R). applys red_expr_access_2.\n      applys* red_spec_check_object_coercible_undef_or_null.\n      abort.\n    applys red_expr_access_2.\n      applys* red_spec_check_object_coercible_return.\n     run red_expr_access_3.\n     applys* red_expr_access_4.\n  (* member *)\n  run_hyp R. apply~ red_expr_member.\n  (* new *)\n  unfolds in R. run red_expr_new.\n  run red_expr_new_1.\n  destruct a; tryfalse.\n    applys* red_expr_new_2_type_error_not_object.\n    run. lets M: run_object_method_correct (rm E).\n    destruct x; tryfalse.\n      applys red_expr_new_2_construct.\n       applys* red_spec_constructor.\n       applys* run_construct_correct.\n      applys* red_expr_new_2_type_error_no_construct.\n  (* call *)\n  applys* run_expr_call_correct.\n  (* unary operators *)\n  unfolds in R. case_if as N.\n    run* red_expr_prepost. run red_expr_prepost_1_valid.\n     run red_expr_prepost_2. run. destruct x as [F ispre].\n     let_simpl. let_name. lets: prepost_op_correct (rm E).\n     run* red_expr_prepost_3. subst. applys* red_expr_prepost_4.\n    destruct u; try solve [ false n; unfolds; do 2 eexists; constructors ].\n    (* delete *)\n    run red_expr_delete. destruct rv; run_inv.\n      apply~ red_expr_delete_1_not_ref. intro; false_invert.\n      apply~ red_expr_delete_1_not_ref. intro; false_invert.\n      case_if; run_inv.\n        apply~ red_expr_delete_1_ref_unresolvable. cases_if.\n         apply~ red_expr_delete_2_strict. apply* run_error_correct.\n         run_inv. apply~ red_expr_delete_2_not_strict.\n        cases (ref_base r).\n          run* red_expr_delete_1_ref_property using to_object_correct.\n            apply* ref_is_property_from_not_unresolvable_value.\n            apply~ red_expr_delete_3. runs~.\n          rename e0 into L. apply* red_expr_delete_1_ref_env_record. cases_if.\n            apply~ red_expr_delete_4_strict. apply* run_error_correct.\n            apply~ red_expr_delete_4_not_strict. applys* env_record_delete_binding_correct.\n    (* void *)\n    run* red_expr_unary_op. applys red_expr_unary_op_1.\n     applys* red_expr_unary_op_void.\n    (* typeof *)\n    run red_expr_typeof. destruct rv; tryfalse.\n      applys* red_expr_typeof_1_value. run_inv. applys* red_expr_typeof_2.\n        applys run_typeof_value_correct.\n      case_if.\n        run_inv. applys* red_expr_typeof_1_ref_unresolvable.\n        run* red_expr_typeof_1_ref_resolvable.\n         applys* red_expr_typeof_2.\n         applys* run_typeof_value_correct.\n   (* add *)\n   run* red_expr_unary_op. applys red_expr_unary_op_1.\n    applys red_expr_unary_op_add. run_hyp*.\n   (* neg *)\n   run* red_expr_unary_op. applys red_expr_unary_op_1.\n    run red_expr_unary_op_neg. applys* red_expr_unary_op_neg_1.\n   (* bitwise not *)\n   run* red_expr_unary_op. applys red_expr_unary_op_1.\n    run red_expr_unary_op_bitwise_not.\n    applys* red_expr_unary_op_bitwise_not_1.\n   (* not *)\n   run* red_expr_unary_op. applys red_expr_unary_op_1.\n   forwards* M: red_spec_to_boolean a.\n    applys* red_expr_unary_op_not. applys* red_expr_unary_op_not_1.\n  (* binary operators *)\n  unfolds in R. rename b into op.\n  lets: (is_lazy_op_correct op). cases (is_lazy_op op).\n    run* red_expr_binary_op_lazy.\n     let_name. applys* red_expr_lazy_op_1. applys* red_spec_to_boolean.\n     case_if; subst; run_inv.\n       applys* red_expr_lazy_op_2_first.\n       run* red_expr_lazy_op_2_second.\n       applys* red_expr_lazy_op_2_second_1.\n    run* red_expr_binary_op.\n     run red_expr_binary_op_1.\n     applys* red_expr_binary_op_2.\n     inverts R as M. applys* run_binary_op_correct M.\n  (* conditionnal *)\n  unfolds in R.\n  run_pre. lets (y1&R2&K): if_spec_post_to_bool (rm R1) (rm R).\n   applys* red_expr_conditional (rm R2). run_post_if_spec_ter_post_bool K.\n  let_name. run red_expr_conditional_1. case_if in EQe; case_if*.\n  applys* red_expr_conditional_2.\n  (* assign *)\n  unfolds in R. run red_expr_assign. let_name. rename rv into rv1.\n  asserts follow_correct: (forall S0 S rv o, follow S rv = o ->\n     exists v, rv = resvalue_value v /\\ red_expr S0 C (expr_assign_4 rv1 (ret S v)) o).\n    subst follow. clear R. introv HR.\n    destruct rv; tryfalse. exists v. split~.\n    run red_expr_assign_4_put_value.\n    applys* red_expr_assign_5_return.\n    clear EQfollow.\n  destruct o0.\n    run red_expr_assign_1_compound using ref_get_value_correct.\n      run red_expr_assign_2_compound_get_value.\n        run red_expr_assign_3_compound_op using run_binary_op_correct.\n        forwards (v&?&?): follow_correct (rm R). subst.\n        applys* red_expr_assign_3'.\n    run red_expr_assign_1_simple.\n    forwards (v&?&?): follow_correct (rm R). run_inv. auto*.\nAdmitted. (*faster*)\n\n\n(* Hints for automatically applying \"run_hyp\" in obvious cases *)\nHint Extern 1 (red_stat ?S ?C ?s ?o) =>\n  match goal with H: _ = result_some o |- _ => run_hyp H end.\nHint Extern 1 (red_expr ?S ?C ?s ?o) =>\n  match goal with H: _ = result_some o |- _ => run_hyp H end.\n\n\nLemma run_var_decl_item_correct : forall runs S C x eo o,\n  runs_type_correct runs ->\n  run_var_decl_item runs S C x eo = o ->\n  red_stat S C (stat_var_decl_item (x,eo)) o.\nProof.\n  introv IH HR. unfolds in HR. destruct eo.\n  run red_stat_var_decl_item_some using identifier_resolution_correct.\n   run red_stat_var_decl_item_1. run red_stat_var_decl_item_2.\n   applys* red_stat_var_decl_item_3.\n  run_inv. applys* red_stat_var_decl_item_none.\nAdmitted. (* faster *)\n\nLemma run_var_decl_correct : forall runs S C ls o,\n  runs_type_correct runs ->\n  run_var_decl runs S C ls = o ->\n  red_stat S C (stat_var_decl ls) o.\nProof.\n  introv IH. gen S. induction ls as [|[x eo]]; introv HR.\n  simpls. run_inv. applys* red_stat_var_decl_nil.\n  simpls. run red_stat_var_decl_cons using run_var_decl_item_correct.\n   applys* red_stat_var_decl_1.\nAdmitted. (* faster *)\n\n\nLemma run_elements_correct : forall runs S C str ls o,\n  runs_type_correct runs ->\n  run_elements runs S C ls = o ->\n  red_prog S C (prog_intro str (rev ls)) o.\nProof.\n  introv IH HR. gen S C str o.\n  induction ls; introv HR; unfolds in HR; rew_list.\n  run_inv. applys* red_prog_nil.\n  run_pre. eauto. applys* red_prog_cons. run_post. clear R1.\n   (* run* red_prog_cons. ==> LATER: should work*)\n  destruct a.\n  run red_prog_1_stat. applys* red_prog_2.\n  run_inv. applys red_prog_1_funcdecl.\nAdmitted. (*faster*)\n\n\nLemma run_block_correct : forall runs S C ls o,\n  runs_type_correct runs ->\n  run_block runs S C ls = o ->\n  red_stat S C (stat_block (rev ls)) o.\nProof.\n  introv IH HR. gen S C o.\n  induction ls; introv HR; unfolds in HR; rew_list.\n  run_inv. applys* red_stat_block_nil.\n  run_pre. eauto. applys* red_stat_block_cons.\n  run_post. clear R1.\n   (* run* red_stat_block_cons. ==> LATER: should work*)\n  run red_stat_block_1.\n  subst. applys* red_stat_block_2_throw.\n  subst. applys* red_stat_block_2_not_throw.\n  applys* red_stat_block_2_not_throw. simple*.\n   unfolds res_overwrite_value_if_empty. case_if; case_if*.\nAdmitted. (*faster*)\n\nLemma run_stat_switch_no_default_end_correct : forall runs S C rv scs o,\n  runs_type_correct runs ->\n  run_stat_switch_end runs S C rv scs = o ->\n  red_stat S C (stat_switch_nodefault_5 rv scs) o.\nProof.\n  introv IH HR. gen S C rv o. induction scs; introv HR; unfolds in HR.\n   run_inv. apply~ red_stat_switch_nodefault_5_nil.\n   destruct a as [e ts]. run red_stat_switch_nodefault_5_cons.\n    forwards~ H: run_block_correct R1. rew_list~ in H.\n    substs. abort.\n    substs. tests: (res_is_normal R).\n     apply~ red_stat_switch_nodefault_6_abrupt.\n    apply~ red_stat_switch_nodefault_6_normal. apply* IHscs. repeat case_if*.\nQed.\n\nLemma run_stat_switch_no_default_correct : forall runs S C vi rv scs o,\n  runs_type_correct runs ->\n  run_stat_switch_no_default runs S C vi rv scs = o ->\n  red_stat S C (stat_switch_nodefault_1 vi rv scs) o.\nProof.\n  introv IH HR. gen S C vi rv o. induction scs; introv HR; unfolds in HR.\n   run_inv. apply~ red_stat_switch_nodefault_1_nil.\n    apply~ red_stat_switch_nodefault_5_nil.\n   destruct a. run red_stat_switch_nodefault_1_cons. let_simpl.\n   apply~ red_stat_switch_nodefault_2. case_if.\n    run red_stat_switch_nodefault_3_true using run_block_correct. rew_list~ in R1.\n     apply~ red_stat_switch_nodefault_4.\n     applys~ run_stat_switch_no_default_end_correct HR.\n    apply~ red_stat_switch_nodefault_3_false.\nQed.\n\nLemma run_stat_switch_with_default_end_correct : forall runs S C rv scs o,\n  runs_type_correct runs ->\n  run_stat_switch_end runs S C rv scs = o ->\n  red_stat S C (stat_switch_default_7 rv scs) o.\nProof.\n  introv IH HR. gen S C rv o. induction scs; introv HR; unfolds in HR.\n   run_inv. apply~ red_stat_switch_default_7_nil.\n   destruct a as [e ts]. run red_stat_switch_default_7_cons.\n    forwards~ H: run_block_correct R1. rew_list~ in H.\n    substs. abort.\n    substs. tests: (res_is_normal R).\n     apply~ red_stat_switch_default_8_abrupt.\n    apply~ red_stat_switch_default_8_normal. apply* IHscs. repeat case_if*.\nQed.\n\nLemma run_stat_switch_with_default_default_correct : forall runs S C vi rv ts scs o,\n  runs_type_correct runs ->\n  run_stat_switch_with_default_default runs S C ts scs = o ->\n  red_stat S C (stat_switch_default_5 vi rv ts scs) o.\nProof.\n  introv IH HR. unfolds in HR. run red_stat_switch_default_5\n    using run_block_correct. rew_list~ in R1.\n  apply~ red_stat_switch_default_6.\n  applys~ run_stat_switch_with_default_end_correct HR.\nQed.\n\nLemma run_stat_switch_with_default_B_correct : forall runs S C vi rv ts scs o,\n  runs_type_correct runs ->\n  run_stat_switch_with_default_B runs S C vi rv ts scs = o ->\n  red_stat S C (stat_switch_default_B_1 vi rv ts scs) o.\nProof.\n  introv IH HR. gen S C vi rv ts o. induction scs; introv HR; unfolds in HR.\n   apply~ red_stat_switch_default_B_1_nil.\n    applys~ run_stat_switch_with_default_default_correct HR.\n   destruct a. run red_stat_switch_default_B_1_cons. let_simpl.\n    apply~ red_stat_switch_default_B_2. case_if.\n    run red_stat_switch_default_B_3_true using run_block_correct. rew_list~ in R1.\n     apply~ red_stat_switch_default_B_4.\n     applys~ run_stat_switch_with_default_end_correct HR.\n    apply~ red_stat_switch_default_B_3_false.\nQed.\n\nLemma run_stat_switch_with_default_A_correct : forall runs S C found vi rv scs1 ts scs2 o,\n  runs_type_correct runs ->\n  run_stat_switch_with_default_A runs S C found vi rv scs1 ts scs2 = o ->\n  red_stat S C (stat_switch_default_A_1 found vi rv scs1 ts scs2) o.\nProof.\n  introv IH HR. gen S C found vi rv ts scs2 o. induction scs1; introv HR; unfolds in HR.\n   case_if.\n    apply~ red_stat_switch_default_A_1_nil_true.\n     applys~ run_stat_switch_with_default_default_correct HR.\n    apply~ red_stat_switch_default_A_1_nil_false.\n     applys~ run_stat_switch_with_default_B_correct HR.\n   destruct a. let_name. asserts follow_correct: (forall S o,\n     follow S = res_out o ->\n     red_stat S C (stat_switch_default_A_4 rv vi l scs1 ts scs2) o).\n     clear HR. introv E. substs. run red_stat_switch_default_A_4\n       using run_block_correct. rew_list~ in R1. abort.\n      substs. applys~ red_stat_switch_default_A_5_abrupt.\n      apply~ red_stat_switch_default_A_5. apply~ IHscs1. repeat case_if~.\n    clear EQfollow. case_if.\n     apply~ red_stat_switch_default_A_1_cons_true.\n     run red_stat_switch_default_A_1_cons_false.\n     apply~ red_stat_switch_default_A_2. let_simpl. cases_if.\n      apply~ red_stat_switch_default_A_3_true.\n      apply~ red_stat_switch_default_A_3_false.\nQed.\n\nLemma run_stat_switch_correct : forall runs S C labs e sb o,\n  runs_type_correct runs ->\n  run_stat_switch runs S C labs e sb = o ->\n  red_stat S C (stat_switch labs e sb) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_stat_switch. let_name. asserts follow_correct: (forall S C o1 o,\n      follow o1 = res_out o -> red_stat S C (stat_switch_2 o1 labs) o).\n    clear HR. introv HR. substs.\n    do 2 (run_pre; run_post; run_inv; substs); try solve [abort].\n     case_if; run_inv.\n      destruct R. simpls. substs. apply* red_stat_switch_2_break.\n      abort.\n     apply~ red_stat_switch_2_normal.\n     case_if; run_inv; tryfalse.\n      destruct R. simpls. substs. apply* red_stat_switch_2_break.\n  asserts follow_arg: (forall W o,\n    follow W = res_out o -> exists (o1 : out), W = o1).\n    clear HR follow_correct. introv R. substs.\n    do 2 (run_pre; run_post; run_inv; substs); tryfalse; auto*.\n  clear EQfollow. destruct sb.\n   forwards~ (o1&E): follow_arg HR.\n    applys~ red_stat_switch_1_nodefault o1.\n    applys~ run_stat_switch_no_default_correct E.\n    apply~ follow_correct. rewrite~ <- E.\n   forwards~ (o1&E): follow_arg HR.\n    applys~ red_stat_switch_1_default o1.\n    applys~ run_stat_switch_with_default_A_correct E.\n    apply~ follow_correct. rewrite~ <- E.\nQed.\n\nLemma run_stat_for_correct : forall runs S C labs eo1 eo2 eo3 t o,\n  runs_type_correct runs ->\n  run_stat_for runs S C labs eo1 eo2 eo3 t = o ->\n  red_stat S C (stat_for labs eo1 eo2 eo3 t) o.\nProof.\n  introv IH R. unfolds in R. destruct eo1.\n   run red_stat_for_some. run_hyp.\n    apply~ red_stat_for_1.\n   run_hyp R. apply~ red_stat_for_none.\nQed.\n\nLemma run_stat_for_var_correct : forall runs S C labs ds eo2 eo3 t o,\n  runs_type_correct runs ->\n  run_stat_for_var runs S C labs ds eo2 eo3 t = o ->\n  red_stat S C (stat_for_var labs ds eo2 eo3 t) o.\nProof.\n  introv IH R. unfolds in R.\n  run red_stat_for_var. run_hyp. apply~ red_stat_for_var_1.\nQed.\n\n\nLemma run_stat_correct : forall runs S C t o,\n  runs_type_correct runs ->\n  run_stat runs S C t = o ->\n  red_stat S C (stat_basic t) o.\nProof.\n  introv RC R. unfolds in R.\n  destruct t as [ | | ls | ls | e t1 t2o | labs t e | labs e t | e t\n     | e | eo | labo | labo | t co fo | labs e1 e2 e3 t\n     | labs xeo1s e2 e3 t | labs e1 e2 e3 t | labs str eo e t | eo | ].\n  (* Expression *)\n  run red_stat_expr. apply red_stat_expr_1.\n  (* Label *)\n  unfolds in R. run red_stat_label.\n    tests HC: (res_is_normal R0).\n      inverts HC. run_inv. subst. applys* red_stat_label_1_normal.\n      subst. applys* red_stat_abort. intro M. inverts M. simpls. false.\n    case_if.\n      applys* red_stat_label_1_break_eq. destruct R0; simpls. fequal*.\n      applys* red_stat_abort. constructors. intro N. inverts N. false.\n       intro M. inverts M. simpls. false.\n      (* LATER: change interpreter to make it more faithful *)\n  (* Block *)\n  forwards* E: run_block_correct (rev ls). rew_list* in E.\n  (* Variable declaration *)\n  applys* run_var_decl_correct.\n  (* If *)\n  unfolds in R.\n  run_pre. lets (y1&R2&K): if_spec_post_to_bool (rm R1) (rm R).\n   applys* red_stat_if (rm R2). run_post_if_spec_ter_post_bool K.\n   case_if.\n     applys~ red_stat_if_1_true. apply~ RC.\n     destruct t2o.\n       applys~ red_stat_if_1_false.  apply~ RC.\n       run_inv. applys* red_stat_if_1_false_implicit.\n  (* Do-while *)\n  applys* red_stat_do_while. applys* runs_type_correct_stat_do_while.\n  (* While *)\n  apply~ red_stat_while. applys* runs_type_correct_stat_while.\n  (* With *)\n  unfolds in R.\n  run_pre. lets (y1&R2&K): if_spec_post_to_object (rm R1) (rm R).\n   applys* red_stat_with (rm R2). run_post_if_spec_ter_post_bool K.\n  let_name. let_name. destruct p as [lex' S3]. let_name.\n  subst lex. applys* red_stat_with_1. subst C'. run_inv. run_hyp*.\n  (* Throw *)\n  unfolds in R.\n  run red_stat_throw. applys* red_stat_throw_1.\n  (* Return *)\n  unfolds in R. destruct eo.\n    run red_stat_return_some. apply* red_stat_return_1.\n    inverts* R. applys red_stat_return_none.\n  (* Break *)\n  run_inv. applys* red_stat_break.\n  (* Continue *)\n  run_inv. applys* red_stat_continue.\n  (* Try *)\n  unfolds in R. let_name.\n  asserts finally_correct: (forall S (R:res),\n      finally S R = res_out o ->\n      red_stat S C (stat_try_4 R fo) o).\n    subst finally. clear R. introv HR.\n    destruct fo.\n      simpls. run red_stat_try_4_finally.\n       applys* red_stat_try_5_finally_result.\n      run_inv. applys* red_stat_try_4_no_finally.\n    clear EQfinally.\n  run red_stat_try. abort.\n    applys* red_stat_try_1_no_throw.\n    destruct co as [c|].\n      destruct c as [x t2]. let_name. let_name.\n       destruct p as [lex' S']. destruct lex'; tryfalse.\n       subst lex. run* red_stat_try_1_throw_catch\n        using env_record_create_set_mutable_binding_correct.\n       run red_stat_try_2_catch.\n        applys~ red_stat_try_3_catch_result finally_correct.\n      applys~ red_stat_try_1_throw_no_catch. applys~ finally_correct.\n      rewrite <- R. fequal. destruct R0; simpls; substs~.\n  (* For *)\n  apply* run_stat_for_correct.\n  (* For-var *)\n  apply* run_stat_for_var_correct.\n  (* For-in *)\n  discriminate.\n  (* For-in-var *)\n  discriminate.\n  (* Debugger *)\n  run_inv. apply red_stat_debugger.\n  (* switch *)\n  applys~ run_stat_switch_correct R.\nAdmitted. (*faster*)\n\nLemma run_prog_correct : forall runs S C p o,\n  runs_type_correct runs ->\n  run_prog runs S C p = o ->\n  red_prog S C (prog_basic p) o.\nProof.\n  introv RC R. unfolds in R. destruct p.\n  forwards*: run_elements_correct (rev l). rew_list* in H.\nAdmitted. (*faster*)\n\n(* LATER: generalize statement to handle continuations *)\nLemma entering_func_code_correct : forall runs S C lf vthis args o,\n  runs_type_correct runs ->\n  entering_func_code runs S C lf vthis args = result_some (specret_out o) ->\n  red_expr S C (spec_entering_func_code lf vthis args (spec_call_default_1 lf)) o.\nProof.\n  introv IH HR. unfolds in HR. sets_eq K: (spec_call_default_1 lf).\n  run. run. subst x. lets H: run_object_method_correct (rm E).\n  let_name. let_name as M. rename x0 into bd.\n  asserts M_correct: (forall S v o,\n      M S v = res_out o ->\n      red_expr S C (spec_entering_func_code_3 lf args str bd v K) o).\n    clears HR S o. introv HR. subst M.\n    run. run. subst x. lets H: run_object_method_correct (rm E).\n    let_name. destruct p as [lex' S1]. let_name.\n    run* (@red_spec_entering_func_code_3 lex' S1 C').\n    applys* red_spec_entering_func_code_4.\n    subst K. applys* run_call_default_correct.\n    clear EQM.\n  applys* red_spec_entering_func_code str.\n  case_if; subst str.\n    applys* red_spec_entering_func_code_1_strict.\n    destruct vthis.\n      destruct p. (* LATER: improve *)\n        applys* red_spec_entering_func_code_1_null_or_undef.\n        applys* red_spec_entering_func_code_1_null_or_undef.\n        run red_spec_entering_func_code_1_not_object.\n          simpls. splits; congruence.\n          applys* to_object_correct.\n          applys* red_spec_entering_func_code_2.\n        run red_spec_entering_func_code_1_not_object.\n          simpls. splits; congruence.\n          applys* to_object_correct.\n          applys* red_spec_entering_func_code_2.\n        run red_spec_entering_func_code_1_not_object.\n          simpls. splits; congruence.\n          applys* to_object_correct.\n          applys* red_spec_entering_func_code_2.\n      applys* red_spec_entering_func_code_1_object.\nAdmitted. (* faster *)\n\nLemma if_spec_throw_result : forall S K, if_spec (@throw_result descriptor (run_error S native_error_type)) K = @throw_result descriptor (run_error S native_error_type).\nProof.\n  intros. repeat unfolds.\n  remember (run_error S native_error_type) as Error.\n  unfolds run_error. unfolds if_object.\n  unfolds if_value. unfolds if_success. unfolds if_ter.\n  unfolds if_out_some. unfolds if_result_some. unfolds build_error. \n  cases_if*; rewrite decide_def in H; cases_if*; clear H.\n  remember (object_alloc S (object_new (prealloc_native_error_proto native_error_type) \"Error\")) as O.\n  destruct O as (l & S'). simpls.\n  unfolds if_empty_label.\n  cases_if*. subst. simpls. cases_if*.\nQed.\n\nLemma run_to_descriptor_correct : forall runs S C v y,\n  runs_type_correct runs ->\n  run_to_descriptor runs S C v = result_some y ->\n  red_spec S C (spec_to_descriptor v) y.\nProof.\n  introv IH HR. unfold run_to_descriptor in HR.\n  destruct v as [p | l]. \n\n  apply~ red_spec_to_descriptor_not_object.\n  applys* throw_result_run_error_correct.\n\n  applys* red_spec_to_descriptor_object.\n  run red_spec_to_descriptor_1a using object_has_prop_correct.\n  cases_if*; destruct b; inverts H.\n  + apply red_spec_to_descriptor_1b_false.\n    run red_spec_to_descriptor_2a using object_has_prop_correct.\n    cases_if*; destruct b; inverts H.\n    - apply red_spec_to_descriptor_2b_false.\n      run red_spec_to_descriptor_3a using object_has_prop_correct.\n      cases_if*; destruct b; inverts H.\n      * apply red_spec_to_descriptor_3b_false.\n        run red_spec_to_descriptor_4a using object_has_prop_correct.\n        { \n          cases_if*; destruct b; inverts H.\n          + apply red_spec_to_descriptor_4b_false.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n          + run red_spec_to_descriptor_4b_true using run_object_get_correct.\n            simpls. applys* red_spec_to_descriptor_4c.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n        }\n      * run red_spec_to_descriptor_3b_true using run_object_get_correct.\n        simpls. applys* red_spec_to_descriptor_3c. \n        run red_spec_to_descriptor_4a using object_has_prop_correct.\n        { \n          cases_if*; destruct b; inverts H.\n          + apply red_spec_to_descriptor_4b_false.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n          + run red_spec_to_descriptor_4b_true using run_object_get_correct.\n            simpls. applys* red_spec_to_descriptor_4c.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n        }\n    - run red_spec_to_descriptor_2b_true using run_object_get_correct.\n      simpls. applys* red_spec_to_descriptor_2c.\n      run red_spec_to_descriptor_3a using object_has_prop_correct.\n      cases_if*; destruct b; inverts H.\n      * apply red_spec_to_descriptor_3b_false.\n        run red_spec_to_descriptor_4a using object_has_prop_correct.\n        { \n          cases_if*; destruct b; inverts H.\n          + apply red_spec_to_descriptor_4b_false.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n          + run red_spec_to_descriptor_4b_true using run_object_get_correct.\n            simpls. applys* red_spec_to_descriptor_4c.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n        }\n      * run red_spec_to_descriptor_3b_true using run_object_get_correct.\n        simpls. applys* red_spec_to_descriptor_3c. \n        run red_spec_to_descriptor_4a using object_has_prop_correct.\n        { \n          cases_if*; destruct b; inverts H.\n          + apply red_spec_to_descriptor_4b_false.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n          + run red_spec_to_descriptor_4b_true using run_object_get_correct.\n            simpls. applys* red_spec_to_descriptor_4c.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n         }\n  + run red_spec_to_descriptor_1b_true using run_object_get_correct.\n    simpls. applys* red_spec_to_descriptor_1c.\n    run red_spec_to_descriptor_2a using object_has_prop_correct.\n    cases_if*; destruct b; inverts H.\n    - apply red_spec_to_descriptor_2b_false.\n      run red_spec_to_descriptor_3a using object_has_prop_correct.\n      cases_if*; destruct b; inverts H.\n      * apply red_spec_to_descriptor_3b_false.\n        run red_spec_to_descriptor_4a using object_has_prop_correct.\n        { \n          cases_if*; destruct b; inverts H.\n          + apply red_spec_to_descriptor_4b_false.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n          + run red_spec_to_descriptor_4b_true using run_object_get_correct.\n            simpls. applys* red_spec_to_descriptor_4c.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n        }\n      * run red_spec_to_descriptor_3b_true using run_object_get_correct.\n        simpls. applys* red_spec_to_descriptor_3c. \n        run red_spec_to_descriptor_4a using object_has_prop_correct.\n        { \n          cases_if*; destruct b; inverts H.\n          + apply red_spec_to_descriptor_4b_false.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n          + run red_spec_to_descriptor_4b_true using run_object_get_correct.\n            simpls. applys* red_spec_to_descriptor_4c.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n        }\n    - run red_spec_to_descriptor_2b_true using run_object_get_correct.\n      simpls. applys* red_spec_to_descriptor_2c.\n      run red_spec_to_descriptor_3a using object_has_prop_correct.\n      cases_if*; destruct b; inverts H.\n      * apply red_spec_to_descriptor_3b_false.\n        run red_spec_to_descriptor_4a using object_has_prop_correct.\n        { \n          cases_if*; destruct b; inverts H.\n          + apply red_spec_to_descriptor_4b_false.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n          + run red_spec_to_descriptor_4b_true using run_object_get_correct.\n            simpls. applys* red_spec_to_descriptor_4c.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n        }\n      * run red_spec_to_descriptor_3b_true using run_object_get_correct.\n        simpls. applys* red_spec_to_descriptor_3c. \n        run red_spec_to_descriptor_4a using object_has_prop_correct.\n        { \n          cases_if*; destruct b; inverts H.\n          + apply red_spec_to_descriptor_4b_false.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n          + run red_spec_to_descriptor_4b_true using run_object_get_correct.\n            simpls. applys* red_spec_to_descriptor_4c.\n            run red_spec_to_descriptor_5a using object_has_prop_correct.\n            cases_if*; destruct b; inverts H.\n            - apply red_spec_to_descriptor_5b_false.\n              run red_spec_to_descriptor_6a using object_has_prop_correct.\n              cases_if*; destruct b; inverts H.\n              * apply red_spec_to_descriptor_6b_false.\n                { \n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n              * run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                {\n                  cases_if*.\n                  rewrite if_spec_throw_result in *.\n                  applys* red_spec_to_descriptor_6c_error.\n                  applys* throw_result_run_error_correct.\n                  simpls. applys* red_spec_to_descriptor_6c_ok.\n                  cases_if*. \n                  + applys~ red_spec_to_descriptor_7_error.\n                    applys* throw_result_run_error_correct.\n                  + unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n            - run red_spec_to_descriptor_5b_true using run_object_get_correct.\n              cases_if*.\n              * rewrite if_spec_throw_result in *.\n                applys* red_spec_to_descriptor_5c_error.\n                applys* throw_result_run_error_correct.\n              * simpls. applys* red_spec_to_descriptor_5c_ok.\n                run red_spec_to_descriptor_6a using object_has_prop_correct.\n                {\n                  cases_if*; destruct b; inverts H.\n                  + apply red_spec_to_descriptor_6b_false.\n                    cases_if*. \n                    - applys~ red_spec_to_descriptor_7_error.\n                      applys* throw_result_run_error_correct.\n                    - unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                  + run red_spec_to_descriptor_6b_true using run_object_get_correct.\n                    cases_if*.\n                    - rewrite if_spec_throw_result in *.\n                      applys* red_spec_to_descriptor_6c_error.\n                      applys* throw_result_run_error_correct.\n                    - simpls. applys* red_spec_to_descriptor_6c_ok.\n                      cases_if*. \n                      * applys~ red_spec_to_descriptor_7_error.\n                        applys* throw_result_run_error_correct.\n                      * unfolds in HR. inverts HR. applys~ red_spec_to_descriptor_7_ok. \n                }\n         }\nAdmitted. (* Faster *)\n\n\nLemma run_object_freeze_correct : forall runs S C l xs o,\n  runs_type_correct runs ->\n  run_object_freeze runs S C l xs = result_some (specret_out o) ->\n  red_expr S C (spec_call_object_freeze_2 l xs) o.\nProof.\n  introv IH HR. gen S. induction xs; introv HR; unfolds in HR.\n   run. apply~ red_spec_call_object_freeze_2_nil.\n    apply~ run_object_heap_set_extensible_correct.\n   run red_spec_call_object_freeze_2_cons.\n    destruct a0 as [|A]; tryfalse.\n    applys~ red_spec_call_object_freeze_3.\n    run red_spec_call_object_freeze_4.\n     clear. rew_refl. destruct A as [()|()]; simpls; repeat cases_if;\n       simpls; fold_bool; rew_refl in *; intuit; tryfalse; repeat (fequals); tryfalse*.\n     applys~ red_spec_call_object_freeze_5.\nQed.\n\nLemma run_object_is_sealed_correct : forall runs S C l xs o,\n  runs_type_correct runs ->\n  run_object_is_sealed runs S C l xs = result_some (specret_out o) ->\n  red_expr S C (spec_call_object_is_sealed_2 l xs) o.\nProof.\n  introv IH HR. gen S. induction xs; introv HR; unfolds in HR.\n   run. apply~ red_spec_call_object_is_sealed_2_nil.\n    apply~ run_object_method_correct.\n   run red_spec_call_object_is_sealed_2_cons.\n    destruct a0 as [|A]; tryfalse. cases_if as CF.\n     inverts HR. applys~ red_spec_call_object_is_sealed_3_prop_configurable.\n     applys~ red_spec_call_object_is_sealed_3_prop_not_configurable.\nQed.\n\nLemma run_object_is_frozen_correct : forall runs S C l xs o,\n  runs_type_correct runs ->\n  run_object_is_frozen runs S C l xs = result_some (specret_out o) ->\n  red_expr S C (spec_call_object_is_frozen_2 l xs) o.\nProof.\n  introv IH HR. gen S o. induction xs; introv HR; unfolds in HR.\n   run. apply~ red_spec_call_object_is_frozen_2_nil.\n    apply~ run_object_method_correct.\n   run red_spec_call_object_is_frozen_2_cons. let_name.\n   asserts CC: (forall A o, check_configurable A = result_some (specret_out o) ->\n       red_expr S1 C (spec_call_object_is_frozen_5 l xs A) o).\n     rewrite EQcheck_configurable. clear - IHxs. introv HR. cases_if as AC.\n      inverts HR. apply~ red_spec_call_object_is_frozen_5_prop_configurable.\n      apply~ red_spec_call_object_is_frozen_5_prop_not_configurable.\n    clear EQcheck_configurable. destruct a0 as [|[Ad|Aa]].\n     discriminate.\n     apply red_spec_call_object_is_frozen_3_desc_is_data; simpls~. cases_if as W.\n      inverts HR. applys~ red_spec_call_object_is_frozen_4_prop_is_writable.\n      apply~ red_spec_call_object_is_frozen_4_prop_is_not_writable.\n      apply~ red_spec_call_object_is_frozen_3_desc_is_not_data.\nQed.\n\nLemma run_object_seal_correct : forall runs S C l xs o,\n  runs_type_correct runs ->\n  run_object_seal runs S C l xs = result_some (specret_out o) ->\n  red_expr S C (spec_call_object_seal_2 l xs) o.\nProof.\n  introv IH HR. gen o S. induction xs; introv HR; unfolds in HR.\n   run. apply~ red_spec_call_object_seal_2_nil.\n    apply~ run_object_heap_set_extensible_correct.\n   run red_spec_call_object_seal_2_cons.\n    destruct a0 as [|A]; tryfalse.\n    run red_spec_call_object_seal_3.\n      clear. repeat cases_if~. destruct~ A as [()|()].\n    applys~ red_spec_call_object_seal_4.\nQed.\n\nLemma run_function_proto_apply_get_args_correct : forall runs S C array (index n : int) y,\n  runs_type_correct runs ->\n  run_get_args_for_apply runs S C array index n = result_some y ->\n  red_spec S C (spec_function_proto_apply_get_args array index n) y.\nProof.\n  introv IH HR; unfolds run_get_args_for_apply. cases_if*.\n  + run~ red_spec_function_apply_get_args_true.\n    run red_spec_function_apply_get_args_1 using run_object_get_correct.\n    let_name; subst.\n    run red_spec_function_apply_get_args_2 using runs_type_correct_get_args_for_apply.\n    apply red_spec_function_apply_get_args_3.\n  + inverts HR. applys~ red_spec_function_apply_get_args_false.\nQed.\n\nLemma push_correct : forall S S' C l args a o runs,\n  runs_type_correct runs ->\n  push runs S' C l args a = result_some (specret_out o) ->\n  red_expr S C (spec_call_array_proto_push_3 l args (specret_val S' a)) o.\nProof.\n  introv IH HR. \n  apply red_spec_call_array_proto_push_3. \n  gen a o S S' C l runs. inductions args; intros.\n  + simpls; let_name; subst. \n    apply red_spec_call_array_proto_push_4_empty.\n    run red_spec_call_array_proto_push_5.\n    apply red_spec_call_array_proto_push_6.\n  + unfold push in HR. unfolds let_binding. (* Why doesn't let_name work here? *)\n    apply red_spec_call_array_proto_push_4_nonempty. \n    run red_spec_call_array_proto_push_4_nonempty_1. \n    run red_spec_call_array_proto_push_4_nonempty_2. \n    apply red_spec_call_array_proto_push_4_nonempty_3. \n    applys* IHargs.\nQed.\n\nLemma vtsfj_correct : forall runs S C l index sR,\n  runs_type_correct runs ->\n  valueToStringForJoin runs S C l index = result_some sR ->\n  red_spec S C (spec_call_array_proto_join_vtsfj l index) sR.\nProof.\n  introv IH HR. unfolds in HR.\n  run red_spec_call_array_proto_join_vtsfj. \n  run red_spec_call_array_proto_join_vtsfj_1 using run_object_get_correct.\n  destruct v as [p | loc].\n  + destruct p; try solve [inverts HR; applys* red_spec_call_array_proto_join_vtsfj_2_undef_null];\n    run* red_spec_call_array_proto_join_vtsfj_2_other; try solve [intuition; inverts H0]; \n    applys* red_spec_call_array_proto_join_vtsfj_3.\n  + run* red_spec_call_array_proto_join_vtsfj_2_other; try solve [intuition; inverts H0]; \n    applys* red_spec_call_array_proto_join_vtsfj_3.\nQed.\n\nLemma run_array_join_elements_correct : forall runs S C l k length sep sR o,\n  runs_type_correct runs -> \n  run_array_join_elements runs S C l k length sep sR = o ->\n  red_expr S C (spec_call_array_proto_join_elements l k length sep sR) o.\nProof.\n  introv IH HR. unfolds in HR. cases_if*.\n  + repeat let_name; subst.\n    applys* red_spec_call_array_proto_join_elements_continue.\n    run* red_spec_call_array_proto_join_elements_1 using vtsfj_correct. \n    let_name; subst.\n    apply red_spec_call_array_proto_join_elements_2.\n    applys* runs_type_correct_array_join_elements.\n  + inverts HR. applys* red_spec_call_array_proto_join_elements_exit.\nQed.\n\nLemma run_call_prealloc_correct : forall runs S C B vthis args o,\n  runs_type_correct runs ->\n  run_call_prealloc runs S C B vthis args = o ->\n  red_expr S C (spec_call_prealloc B vthis args) o.\nProof.\n  introv IH HR. unfolds in HR.\n  destruct B.\n  (* prealloc_global *)\n  discriminate.\n  (* prealloc_global_eval *)\n  discriminate.\n  (* prealloc_global_parse_int *)\n  discriminate.\n  (* prealloc_global_parse_float *)\n  discriminate.\n  (* prealloc_global_is_finite *)\n  let_name. run red_spec_call_global_is_finite.\n    substs. apply~ get_arg_correct_0.\n  applys red_spec_call_global_is_finite_1.\n  cases_if; fold_bool; rew_refl~.\n  (* prealloc_global_is_nan *)\n  let_name. run red_spec_call_global_is_nan.\n    substs. apply~ get_arg_correct_0.\n  applys red_spec_call_global_is_nan_1.\n  cases_if; fold_bool; rew_refl~.\n  (* prealloc_global_decode_uri *)\n  discriminate.\n  (* prealloc_global_decode_uri_component *)\n  discriminate.\n  (* prealloc_global_encode_uri *)\n  discriminate.\n  (* prealloc_global_encode_uri_component *)\n  discriminate.\n  (* prealloc_object *)\n  let_name. subst.\n  applys* red_spec_call_object_call.\n    applys* get_arg_correct_0.\n  destruct (get_arg 0 args) as [p | l].\n  destruct p.\n  applys* red_spec_call_object_call_1_null_or_undef.\n  apply run_construct_prealloc_correct in HR; auto.  \n  applys* red_spec_call_object_call_1_null_or_undef.\n  apply run_construct_prealloc_correct in HR; auto.  \n  applys* red_spec_call_object_call_1_other.\n  splits; discriminate.\n  applys~ to_object_correct.\n  applys* red_spec_call_object_call_1_other.\n  splits; discriminate.\n  applys~ to_object_correct.\n  applys* red_spec_call_object_call_1_other.\n  splits; discriminate.\n  applys~ to_object_correct.\n  applys* red_spec_call_object_call_1_other.\n  splits; discriminate.\n  applys~ to_object_correct.  \n  (* prealloc_object_get_proto_of *)\n  let_name. apply~ red_spec_call_object_get_proto_of.\n    substs. apply* get_arg_correct_0.\n  rewrite <- EQv in *. destruct v.\n   apply red_spec_call_object_get_proto_of_1_not_object.\n    apply* run_error_correct.\n   run. apply~ red_spec_call_object_get_proto_of_1_object.\n    apply* run_object_method_correct.\n  (* prealloc_object_get_own_prop_descriptor *)\n  let_name. apply~ red_spec_call_object_get_own_prop_descriptor.\n    apply* get_arg_correct_1.\n  rewrite <- EQv in *. destruct v.\n   apply red_spec_call_object_get_own_prop_descriptor_1_not_object.\n     destruct p; discriminate.\n    apply* run_error_correct.\n   run red_spec_call_object_get_own_prop_descriptor_1_object.\n    run red_spec_call_object_get_own_prop_descriptor_2.\n    apply* from_prop_descriptor_correct.\n  (* prealloc_object_get_own_prop_name *)\n  discriminate.\n  (* prealloc_object_create *)\n  discriminate.\n  (* prealloc_object_define_prop *)\n  let_name. let_name. let_name.\n  apply~ red_spec_call_object_object_define_prop.\n    apply* get_arg_correct_2.\n  rewrite <- EQo0 in *. rewrite <- EQp in *. rewrite <- EQattr in *.\n  destruct o0.\n   apply red_spec_call_object_object_define_prop_1_not_object.\n     destruct p0; discriminate.\n    apply* run_error_correct.\n   run red_spec_call_object_object_define_prop_1_object.\n    run red_spec_call_object_object_define_prop_2.\n      apply* run_to_descriptor_correct.\n    run red_spec_call_object_object_define_prop_3.\n    apply* red_spec_call_object_object_define_prop_4.\n  (* prealloc_object_define_props *)\n  discriminate.\n  (* prealloc_object_seal *)\n  let_name. apply~ red_spec_call_object_seal.\n    apply* get_arg_correct_0.\n  rewrite <- EQv in *. destruct v.\n   apply red_spec_call_object_seal_1_not_object.\n     destruct p; discriminate.\n    apply* run_error_correct.\n   run. forwards~ B: @pick_option_correct E.\n    applys~ red_spec_call_object_seal_1_object B.\n    applys~ run_object_seal_correct HR.\n  (* prealloc_object_freeze *)\n  let_name. apply~ red_spec_call_object_freeze.\n    apply* get_arg_correct_0.\n  rewrite <- EQv in *. destruct v.\n   apply red_spec_call_object_freeze_1_not_object.\n     destruct p; discriminate.\n    apply* run_error_correct.\n   run. forwards~ B: @pick_option_correct E.\n    applys~ red_spec_call_object_freeze_1_object B.\n    applys~ run_object_freeze_correct HR.\n  (* prealloc_object_prevent_extensions *)\n  let_name. apply~ red_spec_call_object_prevent_extensions.\n    apply* get_arg_correct_0.\n  rewrite <- EQv in *. destruct v.\n   apply red_spec_call_object_prevent_extensions_not_object.\n     destruct p; discriminate.\n    apply* run_error_correct.\n   run. forwards~ B: @pick_option_correct E.\n    applys~ red_spec_call_object_prevent_extensions_object B.\n  (* prealloc_object_is_sealed *)\n  let_name. apply~ red_spec_call_object_is_sealed.\n    apply* get_arg_correct_0.\n  rewrite <- EQv in *. destruct v.\n   apply red_spec_call_object_is_sealed_1_not_object.\n     destruct p; discriminate.\n    apply* run_error_correct.\n   run. forwards~ B: @pick_option_correct E.\n    applys~ red_spec_call_object_is_sealed_1_object B.\n    applys~ run_object_is_sealed_correct HR.\n  (* prealloc_object_is_frozen *)\n  let_name. apply~ red_spec_call_object_is_frozen.\n    apply* get_arg_correct_0.\n  rewrite <- EQv in *. destruct v.\n   apply red_spec_call_object_is_frozen_1_not_object.\n     destruct p; discriminate.\n    apply* run_error_correct.\n   run. forwards~ B: @pick_option_correct E.\n    applys~ red_spec_call_object_is_frozen_1_object B.\n    applys~ run_object_is_frozen_correct HR.\n  (* prealloc_object_is_extensible *)\n  let_name. apply~ red_spec_call_object_is_extensible.\n    apply* get_arg_correct_0.\n  rewrite <- EQv in *. destruct v.\n   apply red_spec_call_object_is_extensible_1_not_object.\n     destruct p; discriminate.\n    apply* run_error_correct.\n   run. apply~ red_spec_call_object_is_extensible_1_object.\n    apply~ run_object_method_correct.\n  (* prealloc_object_keys *)\n  discriminate.\n  (* prealloc_object_keys_call *)\n  discriminate.\n  (* prealloc_object_proto *)\n  discriminate.\n  (* prealloc_object_proto_to_string *)\n  apply red_spec_call_object_proto_to_string.\n  destruct vthis as [p | l]; [destruct p | ].\n  inverts HR. apply red_spec_call_object_proto_to_string_1_undef.\n  inverts HR. apply red_spec_call_object_proto_to_string_1_null.\n  run red_spec_call_object_proto_to_string_1_other using to_object_correct. rew_logic; splits; discriminate.\n  run. apply run_object_method_correct in E.\n  applys* red_spec_call_object_proto_to_string_2.\n  run red_spec_call_object_proto_to_string_1_other using to_object_correct. rew_logic; splits; discriminate.\n  run. apply run_object_method_correct in E.\n  applys* red_spec_call_object_proto_to_string_2.\n  run red_spec_call_object_proto_to_string_1_other using to_object_correct. rew_logic; splits; discriminate.\n  run. apply run_object_method_correct in E.\n  applys* red_spec_call_object_proto_to_string_2.\n  run red_spec_call_object_proto_to_string_1_other using to_object_correct. rew_logic. splits; discriminate.\n  run. apply run_object_method_correct in E.\n  applys* red_spec_call_object_proto_to_string_2.\n  (* prealloc_object_proto_value_of *)\n  apply~ red_spec_call_object_proto_value_of.\n  apply~ to_object_correct.\n  (* prealloc_object_proto_has_own_prop *)\n  let_name. run red_spec_call_object_proto_has_own_prop.\n    substs. apply~ get_arg_correct_0.\n  run red_spec_call_object_proto_has_own_prop_1 using to_object_correct.\n  run red_spec_call_object_proto_has_own_prop_2.\n  destruct a. (* LTAC ARTHUR *)\n   inverts HR. apply~ red_spec_call_object_proto_has_own_prop_3_undef.\n   inverts HR. apply~ red_spec_call_object_proto_has_own_prop_3_not_undef.\n  (* prealloc_object_proto_is_prototype_of *)\n  let_name. destruct v as [p | l].\n  inverts HR. applys* red_spec_call_object_proto_is_prototype_of_not_object.\n  applys* get_arg_correct_0.\n  applys* red_spec_call_object_proto_is_prototype_of_1_not_object. \n  rewrite~ <- EQv. \n  applys* red_spec_call_object_proto_is_prototype_of_not_object. \n  apply get_arg_correct_0.\n  rewrite <- EQv. run red_spec_call_object_proto_is_prototype_of_1_object using to_object_correct.\n  apply red_spec_call_object_proto_is_prototype_of_2.\n  applys* runs_type_correct_object_proto_is_prototype_of.\n  (* prealloc_object_proto_prop_is_enumerable *)\n  let_name. \n  applys* red_spec_call_object_proto_prop_is_enumerable.\n  apply get_arg_correct_0. subst.\n  run red_spec_call_object_proto_prop_is_enumerable_1.\n  run red_spec_call_object_proto_prop_is_enumerable_2 using to_object_correct.\n  run red_spec_call_object_proto_prop_is_enumerable_3.\n  destruct a; inverts HR.\n  apply red_spec_call_object_proto_prop_is_enumerable_4_undef.\n  applys* red_spec_call_object_proto_prop_is_enumerable_4_not_undef.\n  (* prealloc_function *)\n  discriminate. (* LATER *)\n  (* prealloc_function_proto *)\n  inverts HR. apply red_spec_call_function_proto_invoked.\n\n  (* prealloc_function_proto_to_string *)\n  cases_if*. applys* red_spec_function_proto_to_string_not_callable.\n\n  (* prealloc_function_proto_apply *)\n  repeat let_name.\n  cases_if*; [ | applys* red_spec_function_apply_1].\n  destruct vthis as [p | func]; [inverts i; inverts H | ]. \n  applys* red_spec_function_apply_1_2; [apply get_arg_correct_1 | substs].\n  destruct (get_arg 1 args) as [p | array].\n  destruct p;\n    try solve [apply runs_type_correct_call in HR; auto;\n               applys* red_spec_function_apply_2];\n    try solve [apply red_spec_function_apply_3 with (array := func); [splits; discriminate | applys* run_error_correct]].\n  run~ red_spec_function_apply_4 using run_object_get_correct.\n  run red_spec_function_apply_5.\n  run red_spec_function_apply_6 using run_function_proto_apply_get_args_correct. \n  apply red_spec_function_apply_7. applys* runs_type_correct_call.\n\n  (* prealloc_function_proto_call *)\n  cases_if*; [ | applys* red_spec_call_function_not_callable].\n  destruct vthis as [p | l]; [inverts i; inverts H |].\n  remember (get_arg_first_and_rest args) as gargs; destruct gargs.\n  applys* red_spec_call_function_callable.\n  rewrite* <- get_arg_first_and_rest_correct.\n  applys* runs_type_correct_call.\n\n  (* prealloc_function_proto_bind *)\n  cases_if*; [ | applys* red_spec_function_bind_1].\n  destruct vthis as [p | this]; [inverts HR | ].\n  remember (get_arg_first_and_rest args) as gargs; destruct gargs as (thisArg & A).\n  applys* red_spec_function_bind_2.\n  rewrite* <- get_arg_first_and_rest_correct.\n  repeat let_simpl; \n  match goal with H: context [object_alloc ?s ?o] |- _ => sets_eq X: (object_alloc s o) end;\n  destruct X as (l & S').  \n  applys* red_spec_function_bind_3.\n  let_name. subst. run red_spec_function_bind_4.\n  run. cases_if*; subst; apply run_object_method_correct in E.\n  applys* red_spec_function_bind_length_true. \n  run red_spec_function_bind_length_1 using run_object_get_correct.\n  run red_spec_function_bind_length_2. cases_if*; inverts R1.\n  applys* red_spec_function_bind_length_3_zero.\n  applys* red_spec_function_bind_length_3_L.\n  inverts R1. applys* red_spec_function_bind_length_false.\n  repeat let_name. \n  run; rename x into S''. run. repeat let_name.\n  forwards B: @pick_option_correct (rm E0).\n  applys* red_spec_function_bind_5.\n  applys* red_spec_function_bind_6. rewrite* <- EQA0. substs.\n  run* red_spec_function_bind_7. \n  run* red_spec_function_bind_8. \n  apply red_spec_function_bind_9.\n\n  (* prealloc_bool *)\n  inverts HR. apply~ red_spec_call_bool.\n    apply~ get_arg_correct_0.\n  apply~ red_spec_to_boolean.\n  (* prealloc_bool_proto *)\n  discriminate.\n  (* prealloc_bool_proto_to_string *)  \n  destruct vthis as [p | l].\n    destruct p; try solve [\n      apply red_spec_call_bool_proto_to_string_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]]. \n    inverts HR. applys* red_spec_call_bool_proto_to_string_bool. constructor.\n    remember (run_object_method object_class_ S l). destruct o0.\n    simpls. cases_if*. \n    remember (run_object_method object_prim_value_ S l). destruct o0.\n    simpls. destruct o0. destruct v. \n    destruct p.\n      apply red_spec_call_bool_proto_to_string_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_bool_proto_to_string_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      inverts HR. subst. \n      symmetry in Heqo1, Heqo0. \n      apply run_object_method_correct in Heqo0. \n      apply run_object_method_correct in Heqo1. \n      applys* red_spec_call_bool_proto_to_string_bool.\n      constructor*.\n      apply red_spec_call_bool_proto_to_string_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_bool_proto_to_string_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_bool_proto_to_string_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_bool_proto_to_string_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      simpls.  apply red_spec_call_bool_proto_to_string_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      destruct H3 as (O & Hb & Hv).\n      unfolds run_object_method.\n      assert (exists a, object_binds S l a).\n        eexists; jauto.\n      lets Hyp : (@pick_option_defined _ (object_binds S l) (object_binds_pickable_option S l) H). \n      destruct Hyp as (a & Heq). \n      rewrite Heq in Heqo1.\n      simpls. inverts Heqo1.\n      apply red_spec_call_bool_proto_to_string_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      destruct H0 as (O & Hb & Hv).\n      unfolds run_object_method.\n      assert (exists a, object_binds S l a).\n        exists~ O. \n      lets Hyp : (@pick_option_defined _ (object_binds S l) (object_binds_pickable_option S l) H). \n      destruct Hyp as (a & Heq). \n      rewrite Heq in Heqo0.\n      simpls. assert (a = O).\n      {\n        apply pick_option_correct in Heq.\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. rewrite Hv in Heqo0. false*.\n      simpls. apply red_spec_call_bool_proto_to_string_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      destruct H0 as (O & Hb & Hv).\n      unfolds run_object_method.\n      assert (exists a, object_binds S l a).\n        exists~ O. \n      lets Hyp : (@pick_option_defined _ (object_binds S l) (object_binds_pickable_option S l) H). \n      destruct Hyp as (a & Heq). \n      rewrite Heq in Heqo0.\n      simpls. inverts Heqo0. \n  (* prealloc_bool_proto_value_of *)\n  destruct vthis as [p | l].\n    destruct p; try solve [\n      apply red_spec_call_bool_proto_value_of_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]]. \n    inverts HR. apply red_spec_call_bool_proto_value_of_bool. constructor.\n    remember (run_object_method object_class_ S l). destruct o0.\n    simpls. cases_if*. \n    remember (run_object_method object_prim_value_ S l). destruct o0.\n    simpls. destruct o0. destruct v. \n    destruct p.\n      apply red_spec_call_bool_proto_value_of_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_bool_proto_value_of_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      inverts HR. subst. apply red_spec_call_bool_proto_value_of_bool.\n      symmetry in Heqo1, Heqo0. \n      apply run_object_method_correct in Heqo0. \n      apply run_object_method_correct in Heqo1. \n      constructor*.\n      apply red_spec_call_bool_proto_value_of_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_bool_proto_value_of_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_bool_proto_value_of_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_bool_proto_value_of_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      simpls.  apply red_spec_call_bool_proto_value_of_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      destruct H3 as (O & Hb & Hv).\n      unfolds run_object_method.\n      assert (exists a, object_binds S l a).\n        eexists; jauto.\n      lets Hyp : (@pick_option_defined _ (object_binds S l) (object_binds_pickable_option S l) H). \n      destruct Hyp as (a & Heq). \n      rewrite Heq in Heqo1.\n      simpls. inverts Heqo1.\n      apply red_spec_call_bool_proto_value_of_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      destruct H0 as (O & Hb & Hv).\n      unfolds run_object_method.\n      assert (exists a, object_binds S l a).\n        exists~ O. \n      lets Hyp : (@pick_option_defined _ (object_binds S l) (object_binds_pickable_option S l) H). \n      destruct Hyp as (a & Heq). \n      rewrite Heq in Heqo0.\n      simpls. assert (a = O).\n      {\n        apply pick_option_correct in Heq.\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. rewrite Hv in Heqo0. false*.\n      simpls. apply red_spec_call_bool_proto_value_of_not_bool;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      destruct H0 as (O & Hb & Hv).\n      unfolds run_object_method.\n      assert (exists a, object_binds S l a).\n        exists~ O. \n      lets Hyp : (@pick_option_defined _ (object_binds S l) (object_binds_pickable_option S l) H). \n      destruct Hyp as (a & Heq). \n      rewrite Heq in Heqo0.\n      simpls. inverts Heqo0. \n  (* prealloc_number *)\n  cases_if.\n  substs. inverts HR. apply~ red_spec_call_number_nil.\n  inverts HR. apply~ red_spec_call_number_not_nil.\n    apply~ get_arg_correct_0.\n  apply* to_number_correct.\n  (* prealloc_number_proto *)\n  discriminate.\n  (* prealloc_number_proto_to_string *)\n  discriminate.\n  (* prealloc_number_proto_value_of *)\n  destruct vthis as [p | l].\n    destruct p; try solve [\n      apply red_spec_call_number_proto_value_of_not_number;\n      [introv Hv; inverts Hv | applys* run_error_correct]]. \n    inverts HR. apply red_spec_call_number_proto_value_of_number. constructor.\n    remember (run_object_method object_class_ S l). destruct o0.\n    simpls. cases_if*. \n    remember (run_object_method object_prim_value_ S l). destruct o0.\n    simpls. destruct o0. destruct v. \n    destruct p.\n      apply red_spec_call_number_proto_value_of_not_number;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_number_proto_value_of_not_number;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_number_proto_value_of_not_number;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      inverts HR. subst. apply red_spec_call_number_proto_value_of_number.\n      symmetry in Heqo1, Heqo0. \n      apply run_object_method_correct in Heqo0. \n      apply run_object_method_correct in Heqo1. \n      constructor*.\n      apply red_spec_call_number_proto_value_of_not_number;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_number_proto_value_of_not_number;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      apply red_spec_call_number_proto_value_of_not_number;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      symmetry in Heqo1. apply run_object_method_correct in Heqo1.\n      destruct Heqo1 as (O1 & Hb1 & Hv1).\n      destruct H3 as (O2 & Hb2 & Hv2).\n      assert (O1 = O2).\n      {\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. false~.\n      simpls.  apply red_spec_call_number_proto_value_of_not_number;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      destruct H3 as (O & Hb & Hv).\n      unfolds run_object_method.\n      assert (exists a, object_binds S l a).\n        eexists; jauto.\n      lets Hyp : (@pick_option_defined _ (object_binds S l) (object_binds_pickable_option S l) H). \n      destruct Hyp as (a & Heq). \n      rewrite Heq in Heqo1.\n      simpls. inverts Heqo1.\n      apply red_spec_call_number_proto_value_of_not_number;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      destruct H0 as (O & Hb & Hv).\n      unfolds run_object_method.\n      assert (exists a, object_binds S l a).\n        exists~ O. \n      lets Hyp : (@pick_option_defined _ (object_binds S l) (object_binds_pickable_option S l) H). \n      destruct Hyp as (a & Heq). \n      rewrite Heq in Heqo0.\n      simpls. assert (a = O).\n      {\n        apply pick_option_correct in Heq.\n        applys* Heap_binds_func.\n        apply object_loc_comparable. \n      } subst. rewrite Hv in Heqo0. false*.\n      simpls. apply red_spec_call_number_proto_value_of_not_number;\n      [introv Hv; inverts Hv | applys* run_error_correct]. \n      destruct H0 as (O & Hb & Hv).\n      unfolds run_object_method.\n      assert (exists a, object_binds S l a).\n        exists~ O. \n      lets Hyp : (@pick_option_defined _ (object_binds S l) (object_binds_pickable_option S l) H). \n      destruct Hyp as (a & Heq). \n      rewrite Heq in Heqo0.\n      simpls. inverts Heqo0. \n  (* prealloc_number_proto_to_fixed *)\n  discriminate.\n  (* prealloc_number_proto_to_exponential *)\n  discriminate.\n  (* prealloc_number_proto_to_precision *)\n  discriminate.\n\n  (* prealloc_array *)\n  apply run_construct_prealloc_correct in HR; auto.\n  applys* red_spec_call_to_construct_array. auto.\n\n  (* prealloc_array_is_array *)\n  let_name; subst. \n  applys* red_spec_call_array_is_array_fetch_arg.\n    applys* get_arg_correct_0.\n  destruct (get_arg 0 args). \n    inverts HR. applys* red_spec_call_array_is_array_1. \n    run. apply run_object_method_correct in E. \n    applys* red_spec_call_array_is_array_2_branch.\n    cases_if*; inverts HR.\n      applys* red_spec_call_array_is_array_2.\n      applys* red_spec_call_array_is_array_3.\n\n  (* prealloc_array_proto *)\n  discriminate.\n\n  (* prealloc_array_proto_to_string *)\n  run red_spec_call_array_proto_to_string using to_object_correct.\n  run red_spec_call_array_proto_to_string_1 using run_object_get_correct.\n  cases_if*. \n  destruct v as [p | array]; inverts HR.\n  applys* red_spec_call_array_proto_to_string_2_true.\n  applys* runs_type_correct_call.\n  applys* red_spec_call_array_proto_to_string_2_false.\n  applys* runs_type_correct_call_prealloc.\n  \n  (* prealloc_array_proto_join *)\n  let_name; subst.\n  run red_spec_call_array_proto_join using to_object_correct.\n  run red_spec_call_array_proto_join_1 using run_object_get_correct.\n  run red_spec_call_array_proto_join_2. let_name; subst.\n  applys* red_spec_call_array_proto_join_3. \n  apply get_arg_correct_0. cases_if*.\n  run~ red_spec_call_array_proto_join_3_other.\n  cases_if*. inverts HR. applys* red_spec_call_array_proto_join_4.\n  let_name; subst.\n  run~ red_spec_call_array_proto_join_5 using vtsfj_correct. \n  apply red_spec_call_array_proto_join_6. applys* run_array_join_elements_correct.\n  run~ red_spec_call_array_proto_join_3_undef.\n  cases_if*. inverts HR. applys* red_spec_call_array_proto_join_4.\n  let_name; subst.\n  run~ red_spec_call_array_proto_join_5 using vtsfj_correct. \n  apply red_spec_call_array_proto_join_6. applys* run_array_join_elements_correct.\n\n  (* prealloc_array_proto_pop *)\n  run red_spec_call_array_proto_pop using to_object_correct. \n  run red_spec_call_array_proto_pop_1 using run_object_get_correct.\n  run red_spec_call_array_proto_pop_2. cases_if*. subst.\n  apply red_spec_call_array_proto_pop_3_empty.\n  run red_spec_call_array_proto_pop_3_empty_1.\n  apply red_spec_call_array_proto_pop_3_empty_2.\n  applys~ red_spec_call_array_proto_pop_3_nonempty.\n  run red_spec_call_array_proto_pop_3_nonempty_1.\n  run red_spec_call_array_proto_pop_3_nonempty_2 using run_object_get_correct.\n  run red_spec_call_array_proto_pop_3_nonempty_3 using object_delete_default_correct. \n  run red_spec_call_array_proto_pop_3_nonempty_4.\n  applys~ red_spec_call_array_proto_pop_3_nonempty_5.\n  \n  (* prealloc_array_proto_push *)\n  run red_spec_call_array_proto_push using to_object_correct. \n  run red_spec_call_array_proto_push_1 using run_object_get_correct.\n  run red_spec_call_array_proto_push_2.\n  applys* push_correct.\n\n  (* prealloc_string *)\n\n  cases_if; substs.\n    inverts HR. apply red_spec_call_string_empty.\n    let_name; substs. run red_spec_call_string_non_empty.\n      apply get_arg_correct_0.\n    apply red_spec_call_string_non_empty_1.\n\n  (* prealloc_string_proto *)\n  discriminate. (* LATER *)\n  (* prealloc_string_proto_to_string *)\n  applys* red_spec_call_string_proto_to_string.\n  destruct vthis as [p | l]. cases_if*. \n  inverts HR. applys* red_spec_call_string_proto_value_of_prim_string.\n  applys* red_spec_call_string_proto_value_of_bad_type.\n  run. apply run_object_method_correct in E.\n  cases_if*. subst.\n  apply run_object_prim_value_correct in HR.\n  destruct HR as (v & Heq & Hprim). subst.\n  applys* red_spec_call_string_proto_value_of_obj_string.\n  applys* red_spec_call_string_proto_value_of_obj_other.\n  destruct E as (y & Hbind & Hclass).\n  introv (y' & Hbind' & Hclass').\n  assert (y = y'). applys* Heap_binds_func.\n  apply object_loc_comparable. subst. false~.\n   (* prealloc_string_proto_value_of *)\n  destruct vthis as [p | l]. cases_if*. inverts HR. \n  applys* red_spec_call_string_proto_value_of_prim_string.\n  applys* red_spec_call_string_proto_value_of_bad_type.\nrun. apply run_object_method_correct in E.\n  cases_if*. subst.\n  apply run_object_prim_value_correct in HR.\n  destruct HR as (v & Heq & Hprim). subst.\n  applys* red_spec_call_string_proto_value_of_obj_string.\n  applys* red_spec_call_string_proto_value_of_obj_other.\n  destruct E as (y & Hbind & Hclass).\n  introv (y' & Hbind' & Hclass').\n  assert (y = y'). applys* Heap_binds_func.\n  apply object_loc_comparable. subst. false~.\n  (* prealloc_string_proto_char_at *)\n  discriminate.\n  (* prealloc_string_proto_char_code_at *)\n  discriminate.\n  (* prealloc_math *)\n  discriminate.\n  (* prealloc_mathop *)\n  discriminate.\n  (* prealloc_date *)\n  discriminate.\n  (* prealloc_regexp *)\n  discriminate.     \n  (* prealloc_error *)\n  let_name. apply~ red_spec_call_error.\n    apply~ get_arg_correct_0.\n  substs. apply* build_error_correct.\n  (* prealloc_error_proto *)\n  discriminate.\n  (* prealloc_native_error *)\n  let_name. applys* red_spec_call_native_error.\n    apply~ get_arg_correct_0.\n  substs; applys* build_error_correct.\n  (* prealloc_native_error_proto *)\n  discriminate.\n  (* prealloc_error_proto_to_string *)\n  discriminate.\n  (* prealloc_throw_type_error *)\n  apply~ red_spec_call_throw_type_error.\n  apply* run_error_correct.\n  (* prealloc_json *)\n  discriminate.\nAdmitted. (* faster *)\n\nLemma run_call_correct : forall runs S C l v vs o,\n  runs_type_correct runs ->\n  run_call runs S C l v vs = o ->\n  red_expr S C (spec_call l v vs) o.\nProof.\n  introv IH HR. simpls. unfolds in HR.\n  run. run. subst. lets H: run_object_method_correct (rm E).\n  applys* red_spec_call. clear H.\n  destruct x0.\n    applys* red_spec_call_1_default. applys* red_spec_call_default.\n    applys* entering_func_code_correct.\n\n    repeat run. let_name. subst.\n    apply run_object_method_correct in E; apply run_object_method_correct in E1; \n    apply run_object_method_correct in E3.\n    applys* red_spec_call_1_after_bind_full.\n    applys* runs_type_correct_call.\n\n    applys* red_spec_call_1_prealloc. applys* run_call_prealloc_correct.\nAdmitted. (* faster *)\n\n\nLemma run_stat_while_correct : forall runs S C rv ls e t o,\n  runs_type_correct runs ->\n  run_stat_while runs S C rv ls e t = o ->\n  red_stat S C (stat_while_1 ls e t rv) o.\nProof.\n  intros runs IH ls e t S C rv o R. unfolds in R.\n  run_pre. lets (y1&R2&K): if_spec_post_to_bool (rm R1) (rm R).\n   applys~ red_stat_while_1 (rm R2). run_post_if_spec_ter_post_bool K.\n    case_if.\n    run red_stat_while_2_true.\n     let_name. let_simpl. applys red_stat_while_3 rv'. case_if; case_if*.\n     case_if in K.\n       applys red_stat_while_4_not_continue. rew_logic*. case_if in K.\n         run_inv. applys* red_stat_while_5_break.\n         applys* red_stat_while_5_not_break. case_if in K; run_inv.\n           applys* red_stat_while_6_abort.\n           applys* red_stat_while_6_normal. run_hyp*.\n       rew_logic in *. applys* red_stat_while_4_continue. run_hyp*.\n   run_inv. applys red_stat_while_2_false.\nAdmitted. (*faster*)\n\nLemma run_stat_do_while_correct : forall runs S C rv ls e t o,\n  runs_type_correct runs ->\n  run_stat_do_while runs S C rv ls e t = o ->\n  red_stat S C (stat_do_while_1 ls t e rv) o.\nProof.\n  introv IH R. unfolds in R.\n  run red_stat_do_while_1. do 2 let_name.\n  applys~ red_stat_do_while_2 rv'.\n    repeat cases_if~. clear EQrv'.\n  asserts loop_correct: (forall o, loop tt = res_out o ->\n      red_stat S0 C (stat_do_while_6 ls t e rv') o).\n    clear R. introv H. subst loop.\n     run_pre. lets (y1&R2&K): if_spec_post_to_bool (rm R1) (rm H).\n     applys~ red_stat_do_while_6 (rm R2). run_post_if_spec_ter_post_bool K.\n     cases_if.\n      apply~ red_stat_do_while_7_true. apply* IH.\n      run_inv. apply* red_stat_do_while_7_false.\n  clear EQloop. cases_if in R.\n   apply~ red_stat_do_while_3_continue. rewrite decide_def in H. cases_if~ in H.\n   apply~ red_stat_do_while_3_not_continue.\n     rewrite decide_def in H. cases_if~ in H. clear H. cases_if.\n    run_inv. apply~ red_stat_do_while_4_break.\n    apply~ red_stat_do_while_4_not_break. cases_if; run_inv.\n     apply~ red_stat_do_while_5_abort.\n     apply~ red_stat_do_while_5_normal.\nAdmitted. (*faster*)\n\nLemma run_stat_for_loop_correct : forall runs S C labs rv eo2 eo3 t o,\n  runs_type_correct runs ->\n  run_stat_for_loop runs S C labs rv eo2 eo3 t = o ->\n  red_stat S C (stat_for_2 labs rv eo2 eo3 t) o.\nProof.\n  introv IH R. unfolds in R. let_name.\n  asserts follows_correct: (forall S o, follows S = res_out o ->\n    red_stat S C (stat_for_4 labs rv eo2 eo3 t) o).\n    clear R. introv R. rewrite EQfollows in R. clear EQfollows.\n    run red_stat_for_4. do 2 let_name. applys~ red_stat_for_5 rv'.\n     repeat cases_if*.\n    clear EQrv'. cases_if.\n     run_inv. apply~ red_stat_for_6_break.\n     apply~ red_stat_for_6_not_break. rew_logic~ in *. cases_if.\n      apply red_stat_for_7_continue. rew_logic~ in *. destruct eo3.\n       run red_stat_for_8_some. subst loop. run_hyp.\n        apply~ red_stat_for_9.\n       subst loop. run_hyp. apply~ red_stat_for_8_none.\n      run_inv. apply~ red_stat_for_7_abort. rew_logic* in *.\n  clear EQfollows. destruct eo2.\n   run_pre. lets (y1&R2&K): if_spec_post_to_bool (rm R1) (rm R).\n    applys~ red_stat_for_2_some (rm R2). run_post_if_spec_ter_post_bool K.\n    cases_if; run_inv.\n     apply~ red_stat_for_3_not_false. discriminate.\n     apply~ red_stat_for_3_false.\n   apply~ red_stat_for_2_none.\nAdmitted. (*faster*)\n\n\nLemma object_proto_is_prototype_of_correct : forall runs S C lthis l o,\n  runs_type_correct runs ->\n  object_proto_is_prototype_of runs S lthis l = o ->\n  red_expr S C (spec_call_object_proto_is_prototype_of_2_3 lthis l) o.\nProof.\n  introv IH HR. unfolds in HR.\n  run. forwards* Omp: run_object_method_correct.\n  applys~ red_spec_call_object_proto_is_prototype_of_3 Omp.\n  destruct x as [p|]. (* LTAC ARTHUR *)\n   destruct p; inverts HR.\n    apply~ red_spec_call_object_proto_is_prototype_of_4_null.\n   cases_if; substs; inverts HR.\n    apply~ red_spec_call_object_proto_is_prototype_of_4_equal.\n    run_hyp. apply* red_spec_call_object_proto_is_prototype_of_4_not_equal.\nAdmitted. (*faster*)\n\n\nLemma run_equal_correct : forall runs S C v1 v2 o,\n  runs_type_correct runs ->\n  run_equal runs S C v1 v2 = o ->\n  red_expr S C (spec_equal v1 v2) o.\nProof.\n  introv IH R. unfolds in R. let_simpl.\n  apply~ red_spec_equal. cases_if.\n   run_inv. rewrite e. apply~ red_spec_equal_1_same_type.\n   apply~ red_spec_equal_1_diff_type. let_name.\n   asserts dc_conv_correct: (forall v1 F Ext v2 o,\n     dc_conv v1 F v2 = res_out o ->\n     (forall S v o, F S v = o -> red_expr S C (Ext v) o) ->\n     red_expr S C (spec_equal_3 v1 Ext v2) o).\n     clear R. introv E Cor. substs. run red_spec_equal_3_convert_and_recurse.\n       run_inv. apply* Cor.\n     run_hyp. apply~ red_spec_equal_4_recurse.\n   clear EQdc_conv.\n  Ltac eqcas R :=\n     match type of R with context [ ifb ?P then _ else _ ] =>\n       let x := fresh \"x\" in set (x := P) in * end;\n     case_if in R as C; [ rewrite If_l; try assumption\n                        | rewrite If_r; try assumption ].\n   eqcas R. run_inv. applys red_spec_equal_2_return.\n   eqcas R. run_inv. applys red_spec_equal_2_return.\n   eqcas R. applys dc_conv_correct R. introv E. applys* to_number_correct E.\n   eqcas R. applys dc_conv_correct R. introv E. applys* to_number_correct E.\n   eqcas R. applys dc_conv_correct R. introv E. applys* to_number_correct E.\n   eqcas R. applys dc_conv_correct R. introv E. applys* to_number_correct E.\n   eqcas R. applys dc_conv_correct R. introv E. applys* to_primitive_correct E.\n   eqcas R. applys dc_conv_correct R. introv E. applys* to_primitive_correct E.\n   run_inv. applys red_spec_equal_2_return.\nAdmitted. (* faster *)\n\nTheorem runs_correct : forall num,\n  runs_type_correct (runs num).\nProof.\n  induction num.\n   constructors;\n     try (introv M; inverts M; introv P; inverts P). \n     introv Hyp M; inverts M. \n   constructors.\n     introv. apply~ run_expr_correct.\n     introv. apply~ run_stat_correct.\n     introv. apply~ run_prog_correct.\n     introv. apply~ run_call_correct.\n     introv. apply~ run_call_prealloc_correct.\n     introv. apply~ run_construct_correct.\n     introv. apply~ run_function_has_instance_correct.\n     introv. apply~ run_function_proto_apply_get_args_correct.\n     introv. apply~ run_object_has_instance_correct.\n     introv. apply~ run_stat_while_correct.\n     introv. apply~ run_stat_do_while_correct.\n     introv. apply~ run_stat_for_loop_correct.\n     introv. apply~ object_delete_correct.\n     introv. apply~ run_object_get_own_prop_correct.\n     introv. apply~ run_object_get_prop_correct.\n     introv. apply~ run_object_get_correct.\n     introv. apply~ object_proto_is_prototype_of_correct.\n     introv. apply~ object_put_correct.\n     introv. apply~ run_equal_correct.\n     introv. apply~ to_integer_correct.\n     introv. apply~ to_string_correct.\n     introv. apply~ run_array_element_list_correct.\n     introv Hyp. apply~ run_object_define_own_prop_array_loop_correct.\n     introv. apply~ run_array_join_elements_correct.\nQed.\n\nTheorem run_javascript_correct : forall runs p o,\n  runs_type_correct runs ->\n  run_javascript runs p = o ->\n  red_javascript p o.\nProof.\n  introv IH HR. unfolds in HR. run_pre as o1 R1.\n  applys* red_javascript_intro R1. run_post. run_inv. run_hyp.\n  apply~ red_javascript_intro_1.\nQed.\n\nCorollary run_javascript_correct_num : forall num p o,\n  run_javascript (runs num) p = result_out o ->\n  red_javascript p o.\nProof.\n  introv IH. applys~ run_javascript_correct IH.\n  apply~ runs_correct.\nQed. \n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/JsInterpreterExtraction.v",
    "content": "Set Implicit Arguments.\nRequire Import JsSyntax JsInterpreterMonads JsInterpreter JsInit.\nRequire Import LibFix LibList.\n\nRequire Export Shared.\nRequire Export LibTactics LibLogic LibReflect LibList\n  LibOperation LibStruct LibNat LibEpsilon LibFunc LibHeap.\nRequire Flocq.Appli.Fappli_IEEE Flocq.Appli.Fappli_IEEE_bits.\n\n\n\n(* Here stands some commands to extract relatively correctly the interpreter to Ocaml. *)\nExtraction Language Ocaml.\n\nRequire Import ExtrOcamlBasic.\nRequire Import ExtrOcamlNatInt.\nRequire Import ExtrOcamlString.\n\n(* Optimal fixpoint. *)\nExtraction Inline FixFun3 FixFun3Mod FixFun4 FixFun4Mod FixFunMod curry3 uncurry3 curry4 uncurry4.\n(* As classical logic statements are now unused, they should not be extracted\n   (otherwise, useless errors will be launched). *)\nExtraction Inline epsilon epsilon_def classicT arbitrary indefinite_description Inhab_witness Fix isTrue.\n\n(**************************************************************)\n(** ** Numerical values *)\n\n(* number *)\n\nExtract Inductive positive => float\n[ \"(fun p -> 1. +. (2. *. p))\"\n  \"(fun p -> 2. *. p)\"\n  \"1.\" ]\n\"(fun f2p1 f2p f1 p ->\nif p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.)))\".\n\nExtract Inductive Z => float [ \"0.\" \"\" \"(~-.)\" ]\n\"(fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z))\".\n\nExtract Inductive N => float [ \"0.\" \"\" ]\n\"(fun f0 fp n -> if n=0. then f0 () else fp n)\".\n\nExtract Constant Z.add => \"(+.)\".\nExtract Constant Z.succ => \"(+.) 1.\".\nExtract Constant Z.pred => \"(fun x -> x -. 1.)\".\nExtract Constant Z.sub => \"(-.)\".\nExtract Constant Z.mul => \"( *. )\".\nExtract Constant Z.opp => \"(~-.)\".\nExtract Constant Z.abs => \"abs_float\".\nExtract Constant Z.min => \"min\".\nExtract Constant Z.max => \"max\".\nExtract Constant Z.compare =>\n \"fun x y -> if x=y then Eq else if x<y then Lt else Gt\".\n\nExtract Constant Pos.add => \"(+.)\".\nExtract Constant Pos.succ => \"(+.) 1.\".\nExtract Constant Pos.pred => \"(fun x -> x -. 1.)\".\nExtract Constant Pos.sub => \"(-.)\".\nExtract Constant Pos.mul => \"( *. )\".\nExtract Constant Pos.min => \"min\".\nExtract Constant Pos.max => \"max\".\nExtract Constant Pos.compare =>\n \"fun x y -> if x=y then Eq else if x<y then Lt else Gt\".\nExtract Constant Pos.compare_cont =>\n \"fun x y c -> if x=y then c else if x<y then Lt else Gt\".\n\nExtract Constant N.add => \"(+.)\".\nExtract Constant N.succ => \"(+.) 1.\".\nExtract Constant N.pred => \"(fun x -> x -. 1.)\".\nExtract Constant N.sub => \"(-.)\".\nExtract Constant N.mul => \"( *. )\".\nExtract Constant N.min => \"min\".\nExtract Constant N.max => \"max\".\nExtract Constant N.div => \"(fun x y -> if x = 0. then 0. else floor (x /. y))\".\nExtract Constant N.modulo => \"mod_float\".\nExtract Constant N.compare =>\n \"fun x y -> if x=y then Eq else if x<y then Lt else Gt\".\n\nExtract Inductive Fappli_IEEE.binary_float => float [\n  \"(fun s -> if s then (0.) else (-0.))\"\n  \"(fun s -> if s then infinity else neg_infinity)\"\n  \"nan\"\n  \"(fun (s, m, e) -> failwith \"\"FIXME: No extraction from binary float allowed yet.\"\")\"\n]. \n\nExtract Constant JsNumber.of_int => \"fun x -> x\".\n\nExtract Constant JsNumber.nan => \"nan\".\nExtract Constant JsNumber.zero => \"0.\".\nExtract Constant JsNumber.neg_zero => \"(-0.)\".\nExtract Constant JsNumber.one => \"1.\".\nExtract Constant JsNumber.infinity => \"infinity\".\nExtract Constant JsNumber.neg_infinity => \"neg_infinity\".\nExtract Constant JsNumber.max_value => \"max_float\".\nExtract Constant JsNumber.min_value => \"(Int64.float_of_bits Int64.one)\".\nExtract Constant JsNumber.pi => \"(4. *. atan 1.)\".\nExtract Constant JsNumber.e => \"(exp 1.)\".\nExtract Constant JsNumber.ln2 => \"(log 2.)\".\nExtract Constant JsNumber.floor => \"floor\".\nExtract Constant JsNumber.absolute => \"abs_float\".\n\nExtract Constant JsNumber.from_string =>\n  \"(fun s ->\n    try\n      let s = (String.concat \"\"\"\" (List.map (String.make 1) s)) in\n      if s = \"\"\"\" then 0. else float_of_string s\n    with Failure \"\"float_of_string\"\" -> nan)\n   (* Note that we're using `float_of_string' there, which does not have the same\n      behavior than JavaScript.  For instance it will read \"\"022\"\" as 22 instead of\n      18, which should be the JavaScript result for it. *)\".\n\nExtract Constant JsNumber.to_string =>\n  \"(fun f -> \n    prerr_string (\"\"Warning:  JsNumber.to_string called.  This might be responsible for errors.  Argument value:  \"\" ^ string_of_float f ^ \"\".\"\");\n    prerr_newline();\n    let string_of_number n =\n      let sfn = string_of_float n in\n      (if (sfn = \"\"inf\"\") then \"\"Infinity\"\" else\n       if (sfn = \"\"-inf\"\") then \"\"-Infinity\"\" else\n       if (sfn = \"\"nan\"\") then \"\"NaN\"\" else\n       let inum = int_of_float n in\n       if (float_of_int inum = n) then (string_of_int inum) else (string_of_float n)) in\n    let ret = ref [] in (* Ugly, but the API for OCaml string is not very functional... *)\n    String.iter (fun c -> ret := c :: !ret) (string_of_number f);\n    List.rev !ret)\n   (* Note that this is ugly, we should use the spec of JsNumber.to_string here (9.8.1). *)\".\n\nExtract Constant JsNumber.add => \"(+.)\".\nExtract Constant JsNumber.sub => \"(-.)\".\nExtract Constant JsNumber.mult => \"( *. )\".\nExtract Constant JsNumber.div => \"(/.)\".\nExtract Constant JsNumber.fmod => \"mod_float\".\nExtract Constant JsNumber.neg => \"(~-.)\".\nExtract Constant JsNumber.sign => \"(fun f -> float_of_int (compare f 0.))\".\nExtract Constant JsNumber.number_comparable => \"(fun n1 n2 -> 0 = compare n1 n2)\".\nExtract Constant JsNumber.lt_bool => \"(<)\".\n\nExtract Constant JsNumber.to_int32 => \n\"fun n ->\n  match classify_float n with\n  | FP_normal | FP_subnormal ->\n    let i32 = 2. ** 32. in\n    let i31 = 2. ** 31. in\n    let posint = (if n < 0. then (-1.) else 1.) *. (floor (abs_float n)) in\n    let int32bit =\n      let smod = mod_float posint i32 in\n      if smod < 0. then smod +. i32 else smod\n    in\n    (if int32bit >= i31 then int32bit -. i32 else int32bit)\n  | _ -> 0.\". (* LATER:  do in Coq.  Spec is 9.5, p. 47.*)\n\nExtract Constant JsNumber.to_uint32 =>\n\"fun n ->\n  match classify_float n with\n  | FP_normal | FP_subnormal ->\n    let i32 = 2. ** 32. in\n    let posint = (if n < 0. then (-1.) else 1.) *. (floor (abs_float n)) in\n    let int32bit =\n      let smod = mod_float posint i32 in\n      if smod < 0. then smod +. i32 else smod\n    in\n    int32bit\n  | _ -> 0.\". (* LAER:  do in Coq.  Spec is 9.6, p47.*)\n\nExtract Constant JsNumber.modulo_32 => \"(fun x -> let r = mod_float x 32. in if x < 0. then r +. 32. else r)\".\nExtract Constant JsNumber.int32_bitwise_not => \"fun x -> Int32.to_float (Int32.lognot (Int32.of_float x))\".\nExtract Constant JsNumber.int32_bitwise_and => \"fun x y -> Int32.to_float (Int32.logand (Int32.of_float x) (Int32.of_float y))\".\nExtract Constant JsNumber.int32_bitwise_or => \"fun x y -> Int32.to_float (Int32.logor (Int32.of_float x) (Int32.of_float y))\".\nExtract Constant JsNumber.int32_bitwise_xor => \"fun x y -> Int32.to_float (Int32.logxor (Int32.of_float x) (Int32.of_float y))\".\nExtract Constant JsNumber.int32_left_shift => \"(fun x y -> Int32.to_float (Int32.shift_left (Int32.of_float x) (int_of_float y)))\".\nExtract Constant JsNumber.int32_right_shift => \"(fun x y -> Int32.to_float (Int32.shift_right (Int32.of_float x) (int_of_float y)))\".\nExtract Constant JsNumber.uint32_right_shift => \n\"(fun x y ->\n  let i31 = 2. ** 31. in\n  let i32 = 2. ** 32. in\n  let newx = if x >= i31 then x -. i32 else x in\n  let r = Int32.to_float (Int32.shift_right_logical (Int32.of_float newx) (int_of_float y)) in\n  if r < 0. then r +. i32 else r)\".\n\nExtract Constant int_of_char => \"(fun c -> float_of_int (int_of_char c))\".\n\nExtract Constant ascii_comparable => \"(=)\".\nExtract Constant lt_int_decidable => \"(<)\".\nExtract Constant le_int_decidable => \"(<=)\".\nExtract Constant ge_nat_decidable => \"(>=)\".\n\n(* TODO ARTHUR:  This TLC lemma does not extract to something computable... whereas it should! *)\nExtract Constant prop_eq_decidable => \"(=)\".\n\nExtract Constant env_loc_global_env_record => \"0\".\n\n(* The following functions make pattern matches with floats and shall thus be removed. *)\nExtraction Inline Fappli_IEEE.Bplus Fappli_IEEE.binary_normalize Fappli_IEEE_bits.b64_plus.\nExtraction Inline Fappli_IEEE.Bmult Fappli_IEEE.Bmult_FF Fappli_IEEE_bits.b64_mult.\nExtraction Inline Fappli_IEEE.Bdiv Fappli_IEEE_bits.b64_div.\n\n(* New options for the interpreter to work in Coq 8.4 *)\nSet Extraction AccessOpaque.\n\n(* These parameters are implementation-dependant according to the spec.\n   I've chosed some very simple values, but we could choose another thing for them. *)\nExtract Constant object_prealloc_global_proto => \"(Coq_value_prim Coq_prim_null)\".\nExtract Constant object_prealloc_global_class => \"(\n  let rec aux s = function\n  | 0 -> []\n  | n -> let n' = n - 1 in\n    s.[n'] :: aux s n'\n  in let aux2 s =\n    List.rev (aux s (String.length s))\n  in aux2 \"\"GlobalClass\"\")\".\n\n\n(* Parsing *)\nExtract Constant parse_pickable => \"(fun s strict ->\n    let str = String.concat \"\"\"\" (List.map (String.make 1) s) in\n    try\n      let parserExp = Parser_main.exp_from_string ~force_strict:strict str in\n      Some (JsSyntaxInfos.add_infos_prog strict\n        (Translate_syntax.exp_to_prog parserExp))\n    with\n    (* | Translate_syntax.CoqSyntaxDoesNotSupport _ -> assert false (* Temporary *) *)\n    | Parser.ParserFailure _\n    | Parser.InvalidArgument ->\n      prerr_string (\"\"Warning:  Parser error on eval.  Input string:  \\\"\"\"\" ^ str ^ \"\"\\\"\"\\n\"\");\n      None\n  )\".\n\n\n(* Debugging *)\nExtract Inlined Constant not_yet_implemented_because => \"(fun s ->\n  print_endline (__LOC__ ^ \"\": Not implemented because: \"\" ^ Prheap.string_of_char_list s) ;\n  Coq_result_not_yet_implemented)\".\nExtract Inlined Constant impossible_because => \"(fun s ->\n  print_endline (__LOC__ ^ \"\": Stuck because: \"\" ^ Prheap.string_of_char_list s) ;\n  Coq_result_impossible)\".\nExtract Inlined Constant impossible_with_heap_because => \"(fun s message ->\n  print_endline (__LOC__ ^ \"\": Stuck!\\nState:  \"\" ^ Prheap.prstate true s\n    ^ \"\"\\nMessage:\\t\"\" ^ Prheap.string_of_char_list message) ;\n  Coq_result_impossible)\".\n\n\n(* Final Extraction *)\nExtraction Blacklist string list bool.\nSeparate Extraction runs run_javascript.\n\n\n\n(* -- LATER: extract inequality_test_string in more efficient way*)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/JsNumber.v",
    "content": "Set Implicit Arguments.\nRequire Export Shared.\nRequire Flocq.Appli.Fappli_IEEE Flocq.Appli.Fappli_IEEE_bits.\n\n\n(**************************************************************)\n(** ** Type for number (IEEE floats) *)\n\nDefinition number : Type :=\n  Fappli_IEEE_bits.binary64.\n\n\n(**************************************************************)\n(** ** Particular values of numbers *)\n\n(* LATER: find definitions in Flocq *)\nParameter nan : number.\nParameter zero : number.\nParameter neg_zero : number.\nDefinition one := Fappli_IEEE.binary_normalize 53 1024 eq_refl eq_refl Fappli_IEEE.mode_NE 1 0 false.\nParameter infinity : number.\nParameter neg_infinity : number.\nParameter max_value : number.\nParameter min_value : number.\nParameter pi : number.\nParameter e : number.\nParameter ln2 : number.\n\n(**************************************************************)\n(** ** Conversions on numbers *)\n\n(* LATER: implement definitions *)\nParameter from_string : string -> number.\nParameter to_string : number -> string.\n\n(**************************************************************)\n(** ** Unary operations on numbers *)\n\n(* LATER: find definitions in Flocq *)\n\nParameter neg : number -> number.\nParameter floor : number -> number.\nParameter absolute : number -> number.\nParameter sign : number -> number. (* returns arbitrary when x is zero or nan *)\nParameter lt_bool : number -> number -> bool.\n\n\n(**************************************************************)\n(** ** Binary operations on numbers *)\n\nDefinition add : number -> number -> number :=\n  Fappli_IEEE_bits.b64_plus Fappli_IEEE.mode_NE.\n\nParameter sub : number -> number -> number. (* todo: bind *)\n\nParameter fmod : number -> number -> number. (* todo: bind *)\n\nDefinition mult : number -> number -> number :=\n  Fappli_IEEE_bits.b64_mult Fappli_IEEE.mode_NE.\n\nDefinition div : number -> number -> number :=\n  Fappli_IEEE_bits.b64_div Fappli_IEEE.mode_NE.\n\n(* Todo: find comparison operator *)\nGlobal Instance number_comparable : Comparable number.\nProof. Admitted.\n\n\n\n(**************************************************************)\n(** ** Conversions with Int32 *)\n\nParameter of_int : int -> number. (* LATER: this is quite complex. Should we make it precise? *)\n\nParameter to_int32 : number -> int. (* Remark: extracted code could, for efficiency reasons, use Ocaml Int32 *) \n\nParameter to_uint32 : number -> int.\n\nParameter to_int16 : number -> int. (* currently not used *)\n\n(* LATER: Check that the OCaml extraction is correct. *)\n\n\n(**************************************************************)\n\n(** Implements the operation that masks all but the 5 least significant bits\n   of a non-negative number (obtained as the result of to_uint32 *)\n\nParameter modulo_32 : int -> int.\n\n(** Implements int32 operation *)\n\nParameter int32_bitwise_not : int -> int.\n\nParameter int32_bitwise_and : int -> int -> int.\nParameter int32_bitwise_or : int -> int -> int.\nParameter int32_bitwise_xor : int -> int -> int.\n\nParameter int32_left_shift : int -> int -> int.\nParameter int32_right_shift : int -> int -> int.\nParameter uint32_right_shift : int -> int -> int.\n\n\n\n\n(**************************************************************)\n(** ** Int32 related conversion *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/JsPrettyInterm.v",
    "content": "Set Implicit Arguments.\nRequire Export JsSyntax JsSyntaxAux JsPreliminary.\n\n(**************************************************************)\n(** ** Implicit Types -- copied from JsPreliminary  *)\n\nImplicit Type b : bool.\nImplicit Type n : number.\nImplicit Type k : int.\nImplicit Type s : string.\nImplicit Type i : literal.\nImplicit Type l : object_loc.\nImplicit Type w : prim.\nImplicit Type v : value.\nImplicit Type r : ref.\n(*Implicit Type B : builtin.*)\nImplicit Type ty : type.\n\nImplicit Type rt : restype.\nImplicit Type rv : resvalue.\nImplicit Type lab : label.\nImplicit Type labs : label_set.\nImplicit Type R : res.\nImplicit Type o : out.\n\nImplicit Type x : prop_name.\nImplicit Type str : strictness_flag.\nImplicit Type m : mutability.\nImplicit Type Ad : attributes_data.\nImplicit Type Aa : attributes_accessor.\nImplicit Type A : attributes.\nImplicit Type Desc : descriptor.\nImplicit Type D : full_descriptor.\n\nImplicit Type L : env_loc.\nImplicit Type E : env_record.\nImplicit Type Ed : decl_env_record.\nImplicit Type X : lexical_env.\nImplicit Type O : object.\nImplicit Type S : state.\nImplicit Type C : execution_ctx.\nImplicit Type P : object_properties_type.\n\nImplicit Type e : expr.\nImplicit Type p : prog.\nImplicit Type t : stat.\n\n\n(****************************************************************)\n(** ** Intermediate expression for the Pretty-Big-Step semantic *)\n\n(** Grammar of extended expressions *)\n\nInductive ext_expr :=\n\n  (** Extended expressions include expressions *)\n\n  | expr_basic : expr -> ext_expr\n\n  (** Extended expressions associated with primitive expressions *)\n\n  | expr_identifier_1 : specret ref -> ext_expr\n\n  | expr_object_0 : out -> propdefs -> ext_expr\n  | expr_object_1 : object_loc -> propdefs -> ext_expr\n  | expr_object_2 : object_loc -> string -> propbody -> propdefs -> ext_expr \n  | expr_object_3_val : object_loc -> string -> specret value -> propdefs -> ext_expr\n  | expr_object_3_get : object_loc -> string -> out -> propdefs -> ext_expr\n  | expr_object_3_set : object_loc -> string -> out -> propdefs -> ext_expr\n  | expr_object_4 : object_loc -> string -> descriptor -> propdefs -> ext_expr\n  | expr_object_5 : object_loc -> propdefs -> out -> ext_expr\n\n\n\n\n\n  (* _ARRAYS_ : support for array intermediate forms *)\n  | expr_array_0 : out -> list (option expr) -> ext_expr\n  | expr_array_1 : object_loc -> list (option expr) -> ext_expr\n  | expr_array_2 : object_loc -> list (option expr) -> int -> ext_expr\n  | expr_array_3 : object_loc -> list (option expr) -> int -> ext_expr\n  | expr_array_3_1 : object_loc -> specret value -> list (option expr) -> int -> ext_expr\n  | expr_array_3_2 : object_loc -> value -> out -> list (option expr) -> int -> ext_expr\n  | expr_array_3_3 : object_loc -> value -> specret int -> list (option expr) -> int -> ext_expr\n  | expr_array_3_4 : object_loc -> value -> out -> list (option expr) -> ext_expr\n  | expr_array_3_5 : object_loc -> out -> list (option expr) -> ext_expr\n\n  | expr_array_add_length   : object_loc -> int -> out -> ext_expr\n  | expr_array_add_length_0 : object_loc -> int -> ext_expr\n  | expr_array_add_length_1 : object_loc -> int -> out -> ext_expr\n  | expr_array_add_length_2 : object_loc -> specret int -> int -> ext_expr\n  | expr_array_add_length_3 : object_loc -> specret int -> ext_expr\n  | expr_array_add_length_4 : object_loc -> out -> ext_expr\n\n\n\n\n\n  | expr_function_1 : string -> list string -> funcbody -> env_loc -> lexical_env -> out -> ext_expr\n  | expr_function_2 : string -> env_loc -> out -> ext_expr\n  | expr_function_3 : object_loc -> out -> ext_expr\n\n  | expr_access_1 : specret value -> expr -> ext_expr (* The left expression has been executed *)\n  | expr_access_2 : value -> specret value -> ext_expr (* The right expression is executed. *)\n  | expr_access_3 : value -> out -> value -> ext_expr\n  | expr_access_4 : value -> out -> ext_expr\n\n  | expr_new_1 : specret value -> list expr -> ext_expr (* The arguments too. *)\n  | expr_new_2 : value -> specret (list value) -> ext_expr (* The call has been executed. *)\n\n  | expr_call_1 : out -> bool -> list expr -> ext_expr\n  | expr_call_2 : res -> bool -> list expr -> specret value -> ext_expr (* The function has been evaluated. *)\n  | expr_call_3 : res -> value -> bool -> specret (list value) -> ext_expr (* The arguments have been executed. *)\n  | expr_call_4 : res -> object_loc -> bool -> list value -> ext_expr\n  | expr_call_5 : object_loc -> bool -> list value -> out -> ext_expr (* The call has been executed. *)\n\n  | spec_eval : bool -> value -> list value -> ext_expr\n\n  | expr_unary_op_1 : unary_op -> (specret value) -> ext_expr (* The argument have been executed. *)\n  | expr_unary_op_2 : unary_op -> value -> ext_expr (* The argument is a value. *)\n  | expr_delete_1 : out -> ext_expr\n  | expr_delete_2 : ref -> ext_expr\n  | expr_delete_3 : ref -> out -> ext_expr\n  | expr_delete_4 : ref -> env_loc -> ext_expr\n  | expr_typeof_1 : out -> ext_expr\n  | expr_typeof_2 : specret value -> ext_expr\n  | expr_prepost_1 : unary_op -> out -> ext_expr\n  | expr_prepost_2 : unary_op -> res -> specret value -> ext_expr\n  | expr_prepost_3 : unary_op -> res -> out -> ext_expr\n  | expr_prepost_4 : value -> out -> ext_expr\n  | expr_unary_op_neg_1 : out -> ext_expr\n  | expr_unary_op_bitwise_not_1 : specret int -> ext_expr\n  | expr_unary_op_not_1 : out -> ext_expr\n  | expr_conditional_1 : specret value -> expr -> expr -> ext_expr\n  | expr_conditional_1': out -> expr -> expr -> ext_expr\n  | expr_conditional_2 : specret value -> ext_expr\n\n  | expr_binary_op_1 : binary_op -> (specret value) -> expr -> ext_expr\n  | expr_binary_op_2 : binary_op -> value -> (specret value) -> ext_expr\n  | expr_binary_op_3 : binary_op -> value -> value -> ext_expr\n  | expr_binary_op_add_1 : specret (value*value) -> ext_expr\n  | expr_binary_op_add_string_1 : specret (value*value) -> ext_expr\n  | expr_puremath_op_1 : (number -> number -> number) -> specret (value*value) -> ext_expr\n  | expr_shift_op_1 : (int -> int -> int) -> specret int -> value -> ext_expr\n  | expr_shift_op_2 : (int -> int -> int) -> int -> specret int -> ext_expr\n  | expr_inequality_op_1 : bool -> bool -> value -> value -> ext_expr\n  | expr_inequality_op_2 : bool -> bool -> specret (value*value) -> ext_expr\n  | expr_binary_op_in_1 : object_loc -> out -> ext_expr\n  | expr_binary_op_disequal_1 : out -> ext_expr\n  | spec_equal : value -> value -> ext_expr\n  | spec_equal_1 : type -> type -> value -> value -> ext_expr\n  | spec_equal_2 : bool -> ext_expr\n  | spec_equal_3 : value -> (value -> ext_expr) -> value -> ext_expr\n  | spec_equal_4 : value -> out -> ext_expr\n  | expr_bitwise_op_1 : (int -> int -> int) -> specret int -> value -> ext_expr\n  | expr_bitwise_op_2 : (int -> int -> int) -> int -> specret int -> ext_expr\n  | expr_lazy_op_1 : bool -> (specret value) -> expr -> ext_expr\n  | expr_lazy_op_2 : bool -> value -> out -> expr -> ext_expr\n  | expr_lazy_op_2_1 : (specret value) -> ext_expr\n\n  | expr_assign_1 : out -> option binary_op -> expr -> ext_expr\n  | expr_assign_2 : res -> (specret value) -> binary_op -> expr -> ext_expr\n  | expr_assign_3 : res -> value -> binary_op -> (specret value) -> ext_expr\n  | expr_assign_3' : res -> out -> ext_expr\n  | expr_assign_4 : res -> (specret value) -> ext_expr\n  | expr_assign_5 : value -> out -> ext_expr\n\n  (** Extended expressions for conversions *)\n\n  | spec_to_primitive : value -> option preftype -> ext_expr\n  | spec_to_boolean : value -> ext_expr\n  | spec_to_number : value -> ext_expr\n  | spec_to_number_1 : out -> ext_expr\n  | spec_to_integer : value -> ext_expr\n  | spec_to_integer_1 : out -> ext_expr\n  | spec_to_string : value -> ext_expr\n  | spec_to_string_1 : out -> ext_expr\n  | spec_to_object : value -> ext_expr\n  | spec_check_object_coercible : value -> ext_expr\n\n  (** Extended expressions for comparison *)\n\n  | spec_eq : value -> value -> ext_expr\n  | spec_eq0 : value -> value -> ext_expr\n  | spec_eq1 : value -> value -> ext_expr\n  | spec_eq2 : ext_expr -> value -> value -> ext_expr\n\n  (** Extended expressions for operations on objects *)\n\n  | spec_object_get : object_loc -> prop_name -> ext_expr\n  | spec_object_get_1 : builtin_get -> value -> object_loc -> prop_name -> ext_expr\n  | spec_object_get_2 : value -> specret full_descriptor -> ext_expr\n  | spec_object_get_3 : value -> value -> ext_expr\n\n  | spec_object_can_put : object_loc -> prop_name -> ext_expr\n  | spec_object_can_put_1 : builtin_can_put -> object_loc -> prop_name -> ext_expr\n  | spec_object_can_put_2 : object_loc -> prop_name -> (specret full_descriptor) -> ext_expr\n\n  (* LATER: shift names since spec_object_can_put_3 is not used *)\n  | spec_object_can_put_4 : object_loc -> prop_name -> value -> ext_expr\n  | spec_object_can_put_5 : object_loc -> specret full_descriptor -> ext_expr\n  | spec_object_can_put_6 : attributes_data -> bool -> ext_expr\n\n  | spec_object_put : object_loc -> prop_name -> value -> bool -> ext_expr\n  | spec_object_put_1 : builtin_put -> value -> object_loc -> prop_name -> value -> bool -> ext_expr\n  | spec_object_put_2 : value -> object_loc -> prop_name -> value -> bool -> out -> ext_expr\n  | spec_object_put_3 : value -> object_loc -> prop_name -> value -> bool -> specret full_descriptor -> ext_expr\n  | spec_object_put_4 : value -> object_loc -> prop_name -> value -> bool -> specret full_descriptor -> ext_expr\n  | spec_object_put_5 : out -> ext_expr\n\n  | spec_object_has_prop : object_loc -> prop_name -> ext_expr\n  | spec_object_has_prop_1 : builtin_has_prop -> object_loc -> prop_name -> ext_expr\n  | spec_object_has_prop_2 : specret full_descriptor -> ext_expr\n\n  | spec_object_delete : object_loc -> prop_name -> bool -> ext_expr\n  | spec_object_delete_1 : builtin_delete -> object_loc -> prop_name -> bool -> ext_expr\n  | spec_object_delete_2 : object_loc -> prop_name -> bool -> (specret full_descriptor) -> ext_expr\n  | spec_object_delete_3 : object_loc -> prop_name -> bool -> bool -> ext_expr\n\n  | spec_object_default_value : object_loc -> option preftype -> ext_expr\n  | spec_object_default_value_1 : builtin_default_value -> object_loc -> option preftype -> ext_expr\n  | spec_object_default_value_2 : object_loc -> preftype -> preftype -> ext_expr\n  | spec_object_default_value_3 : object_loc -> preftype -> ext_expr\n  | spec_object_default_value_4 : ext_expr\n  | spec_object_default_value_sub_1 : object_loc -> string -> ext_expr -> ext_expr\n  | spec_object_default_value_sub_2 : object_loc -> out -> ext_expr -> ext_expr\n  | spec_object_default_value_sub_3 : out -> ext_expr -> ext_expr\n\n  | spec_object_define_own_prop : object_loc -> prop_name -> descriptor -> bool -> ext_expr\n  | spec_object_define_own_prop_1 : builtin_define_own_prop -> object_loc -> prop_name -> descriptor -> bool -> ext_expr\n  | spec_object_define_own_prop_2 : object_loc -> prop_name -> descriptor -> bool -> (specret full_descriptor) -> ext_expr\n  | spec_object_define_own_prop_3 : object_loc -> prop_name -> descriptor -> bool -> full_descriptor -> bool -> ext_expr\n  | spec_object_define_own_prop_4 : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr\n  | spec_object_define_own_prop_5 : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr\n  | spec_object_define_own_prop_6a : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr\n  | spec_object_define_own_prop_6b : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr\n  | spec_object_define_own_prop_6c : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr\n  | spec_object_define_own_prop_reject : bool -> ext_expr\n  | spec_object_define_own_prop_write : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr\n\n  | spec_prim_value_get : value -> prop_name -> ext_expr\n  | spec_prim_value_get_1 : value -> prop_name -> out -> ext_expr\n  | spec_prim_value_put : value -> prop_name -> value -> bool -> ext_expr\n  | spec_prim_value_put_1 : prim -> prop_name -> value -> bool -> out -> ext_expr\n\n  (* ARRAYS *)\n  | spec_object_define_own_prop_array_2 : object_loc -> prop_name -> descriptor -> bool -> (specret full_descriptor) -> ext_expr\n  | spec_object_define_own_prop_array_2_1 : object_loc -> prop_name -> descriptor -> bool -> descriptor -> value -> ext_expr\n  | spec_object_define_own_prop_array_branch_3_4 : object_loc -> prop_name -> descriptor -> bool -> descriptor -> (specret int) -> ext_expr\n  | spec_object_define_own_prop_array_branch_4_5   : object_loc -> prop_name -> descriptor -> bool -> descriptor -> int -> ext_expr\n  | spec_object_define_own_prop_array_branch_4_5_a : object_loc -> prop_name -> (specret int) -> descriptor -> bool -> descriptor -> int -> ext_expr\n  | spec_object_define_own_prop_array_branch_4_5_b : object_loc -> prop_name -> int -> out -> descriptor -> bool -> descriptor -> int -> ext_expr \n  | spec_object_define_own_prop_array_4a : object_loc -> prop_name -> descriptor -> bool -> descriptor -> int -> ext_expr\n  | spec_object_define_own_prop_array_4b : object_loc -> prop_name -> (specret int) -> descriptor -> bool -> descriptor -> int -> ext_expr\n  | spec_object_define_own_prop_array_4c : object_loc -> int -> descriptor -> bool -> int -> descriptor -> out -> ext_expr\n  | spec_object_define_own_prop_array_5  : object_loc -> prop_name -> descriptor -> bool -> ext_expr\n  | spec_object_define_own_prop_array_3 : object_loc -> descriptor -> bool -> descriptor -> int -> ext_expr\n  | spec_object_define_own_prop_array_3c : object_loc -> value -> (specret int) -> descriptor -> bool -> descriptor -> int -> ext_expr\n  | spec_object_define_own_prop_array_3d_e : object_loc -> out -> int -> descriptor -> bool -> descriptor -> int -> ext_expr\n  | spec_object_define_own_prop_array_3f_g : object_loc -> int -> int -> descriptor -> bool -> descriptor -> ext_expr\n  | spec_object_define_own_prop_array_3h_i : object_loc -> int -> int -> descriptor -> bool -> descriptor -> ext_expr\n  | spec_object_define_own_prop_array_3j : object_loc -> int -> int -> descriptor -> bool -> bool -> descriptor -> ext_expr\n  | spec_object_define_own_prop_array_3k_l : object_loc -> out -> int -> int -> descriptor -> bool -> bool -> descriptor -> ext_expr\n  | spec_object_define_own_prop_array_3l : object_loc -> int -> int -> descriptor -> bool -> bool -> ext_expr\n  | spec_object_define_own_prop_array_3l_ii : object_loc -> int -> int -> descriptor -> bool -> bool -> ext_expr\n  | spec_object_define_own_prop_array_3l_ii_1 : object_loc -> int -> int -> descriptor -> bool -> bool -> out -> ext_expr\n  | spec_object_define_own_prop_array_3l_ii_2 : object_loc -> int -> int -> descriptor -> bool -> bool -> out -> ext_expr\n  | spec_object_define_own_prop_array_3l_iii_1 : object_loc -> int -> descriptor -> bool -> bool -> ext_expr\n  | spec_object_define_own_prop_array_3l_iii_2 : object_loc -> descriptor -> bool -> bool -> ext_expr\n  | spec_object_define_own_prop_array_3l_iii_3 : object_loc -> descriptor -> bool -> ext_expr\n  | spec_object_define_own_prop_array_3l_iii_4 : object_loc -> bool -> out -> ext_expr\n  | spec_object_define_own_prop_array_3m_n : object_loc -> bool -> ext_expr\n\n  (** Extended expressions for operations on references *)\n  | spec_put_value : resvalue -> value -> ext_expr\n\n  (** Extended expressions for operations on environment records *)\n\n  | spec_env_record_has_binding : env_loc -> prop_name -> ext_expr\n  | spec_env_record_has_binding_1 : env_loc -> prop_name -> env_record -> ext_expr\n  | spec_env_record_get_binding_value : env_loc -> prop_name -> bool -> ext_expr\n  | spec_env_record_get_binding_value_1 : env_loc -> prop_name -> bool -> env_record -> ext_expr\n  | spec_env_record_get_binding_value_2 : prop_name -> bool -> object_loc -> out -> ext_expr\n\n  | spec_env_record_create_immutable_binding : env_loc -> prop_name -> ext_expr\n  | spec_env_record_initialize_immutable_binding : env_loc -> prop_name -> value -> ext_expr\n  | spec_env_record_create_mutable_binding : env_loc -> prop_name -> option bool -> ext_expr\n  | spec_env_record_create_mutable_binding_1 : env_loc -> prop_name -> bool -> env_record -> ext_expr\n  | spec_env_record_create_mutable_binding_2 : env_loc -> prop_name -> bool -> object_loc -> out -> ext_expr\n  | spec_env_record_create_mutable_binding_3 : out -> ext_expr\n  | spec_env_record_set_mutable_binding : env_loc -> prop_name -> value -> bool -> ext_expr\n  | spec_env_record_set_mutable_binding_1 : env_loc -> prop_name -> value -> bool -> env_record -> ext_expr\n  | spec_env_record_delete_binding : env_loc -> prop_name -> ext_expr\n  | spec_env_record_delete_binding_1 : env_loc -> prop_name -> env_record -> ext_expr\n\n  | spec_env_record_create_set_mutable_binding : env_loc -> prop_name -> option bool -> value -> bool -> ext_expr\n  | spec_env_record_create_set_mutable_binding_1 : out -> env_loc -> prop_name -> value -> bool -> ext_expr\n\n  | spec_env_record_implicit_this_value : env_loc -> ext_expr\n  | spec_env_record_implicit_this_value_1 : env_loc -> env_record -> ext_expr\n\n\n  (** Extended expressions for operations on property descriptors (8.10) *)\n\n  | spec_from_descriptor : (specret full_descriptor) -> ext_expr\n  | spec_from_descriptor_1 : attributes -> out -> ext_expr\n  | spec_from_descriptor_2 : object_loc -> attributes_data -> out -> ext_expr\n  | spec_from_descriptor_3 : object_loc -> attributes_accessor -> out -> ext_expr\n  | spec_from_descriptor_4 : object_loc -> attributes -> out -> ext_expr\n  | spec_from_descriptor_5 : object_loc -> attributes -> out -> ext_expr\n  | spec_from_descriptor_6 : object_loc -> out -> ext_expr\n\n                       \n                  \n  (** Extented expressions for eval *)\n\n  | spec_entering_eval_code : bool -> funcbody -> ext_expr -> ext_expr\n  | spec_entering_eval_code_1 : funcbody -> ext_expr -> bool -> ext_expr\n  | spec_entering_eval_code_2 : out -> ext_expr -> ext_expr\n\n  | spec_call_global_eval : bool -> list value -> ext_expr\n  | spec_call_global_eval_1 : bool -> value -> ext_expr\n  | spec_call_global_eval_2 : prog -> ext_expr\n  | spec_call_global_eval_3 : out -> ext_expr\n\n  (** Extended expressions for function calls *)\n\n  | spec_entering_func_code : object_loc -> value -> list value -> ext_expr -> ext_expr\n  | spec_entering_func_code_1 : object_loc -> list value -> funcbody -> value -> strictness_flag -> ext_expr -> ext_expr\n  | spec_entering_func_code_2 : object_loc -> list value -> funcbody -> out -> ext_expr -> ext_expr\n  | spec_entering_func_code_3 : object_loc -> list value -> strictness_flag -> funcbody -> value -> ext_expr -> ext_expr\n  | spec_entering_func_code_4 : out -> ext_expr -> ext_expr\n\n  | spec_binding_inst_formal_params : list value -> env_loc -> list string -> strictness_flag -> ext_expr\n  | spec_binding_inst_formal_params_1 : list value -> env_loc -> string -> list string -> strictness_flag -> value -> out -> ext_expr\n  | spec_binding_inst_formal_params_2 : list value -> env_loc -> string -> list string -> strictness_flag -> value -> out -> ext_expr\n  | spec_binding_inst_formal_params_3 : list value -> env_loc -> string -> list string -> strictness_flag -> value -> ext_expr\n  | spec_binding_inst_formal_params_4 : list value -> env_loc -> list string -> strictness_flag -> out -> ext_expr\n  | spec_binding_inst_function_decls :  list value -> env_loc -> list funcdecl -> strictness_flag -> bool -> ext_expr\n  | spec_binding_inst_function_decls_1 : list value -> env_loc -> funcdecl -> list funcdecl -> strictness_flag -> bool -> out -> ext_expr\n  | spec_binding_inst_function_decls_2 : list value -> env_loc -> funcdecl -> list funcdecl -> strictness_flag -> object_loc -> bool -> out -> ext_expr\n  | spec_binding_inst_function_decls_3 : list value -> funcdecl -> list funcdecl -> strictness_flag -> object_loc -> bool -> specret full_descriptor -> ext_expr\n  | spec_binding_inst_function_decls_3a : list value -> funcdecl -> list funcdecl -> strictness_flag -> object_loc -> bool -> full_descriptor -> ext_expr\n  | spec_binding_inst_function_decls_4 : list value -> env_loc -> funcdecl -> list funcdecl -> strictness_flag -> object_loc -> bool -> out -> ext_expr\n  | spec_binding_inst_function_decls_5 : list value -> env_loc -> funcdecl -> list funcdecl -> strictness_flag -> object_loc -> bool -> ext_expr\n  | spec_binding_inst_function_decls_6 : list value -> env_loc -> list funcdecl -> strictness_flag -> bool -> out -> ext_expr\n  | spec_binding_inst_arg_obj :   object_loc -> prog -> list string -> list value -> env_loc -> ext_expr\n  | spec_binding_inst_arg_obj_1 : prog -> env_loc -> strictness_flag -> out -> ext_expr\n  | spec_binding_inst_arg_obj_2 : prog -> env_loc -> object_loc -> out -> ext_expr\n  | spec_binding_inst_var_decls : env_loc -> list string -> bool -> strictness_flag -> ext_expr\n  | spec_binding_inst_var_decls_1 : env_loc -> string -> list string -> bool -> strictness_flag -> out -> ext_expr\n  | spec_binding_inst_var_decls_2 : env_loc -> list string -> bool -> strictness_flag -> out -> ext_expr\n  | spec_binding_inst : codetype -> option object_loc -> prog -> list value -> ext_expr\n  | spec_binding_inst_1 : codetype -> option object_loc -> prog -> list value -> env_loc -> ext_expr\n  | spec_binding_inst_2 : codetype -> object_loc -> prog -> list string -> list value -> env_loc -> out -> ext_expr\n  | spec_binding_inst_3 : codetype -> option object_loc -> prog -> list string -> list value -> env_loc -> ext_expr\n  | spec_binding_inst_4 : codetype -> option object_loc -> prog -> list string -> list value -> bool -> env_loc -> out -> ext_expr\n  | spec_binding_inst_5 : codetype -> option object_loc -> prog -> list string -> list value -> bool -> env_loc -> ext_expr\n  | spec_binding_inst_6 : codetype -> option object_loc -> prog -> list string -> list value -> bool -> env_loc -> out -> ext_expr\n  | spec_binding_inst_7 : prog -> bool -> env_loc -> out -> ext_expr\n  | spec_binding_inst_8 : prog -> bool -> env_loc -> ext_expr\n  \n  | spec_make_arg_getter : string -> lexical_env -> ext_expr\n  | spec_make_arg_setter : string -> lexical_env -> ext_expr\n  \n  | spec_args_obj_get_1 : value -> object_loc -> prop_name -> object_loc -> (specret full_descriptor) -> ext_expr\n  \n  \n  | spec_args_obj_define_own_prop_1 : object_loc -> prop_name -> descriptor -> bool -> object_loc -> specret full_descriptor -> ext_expr\n  | spec_args_obj_define_own_prop_2 : object_loc -> prop_name -> descriptor -> bool -> object_loc -> full_descriptor -> out -> ext_expr\n  | spec_args_obj_define_own_prop_3 : object_loc -> prop_name -> descriptor -> bool -> object_loc -> out -> ext_expr\n  | spec_args_obj_define_own_prop_4 : object_loc -> prop_name -> descriptor -> bool -> object_loc -> ext_expr\n  | spec_args_obj_define_own_prop_5 : out -> ext_expr\n  | spec_args_obj_define_own_prop_6 : ext_expr\n  \n  | spec_args_obj_delete_1 : object_loc -> prop_name -> bool -> object_loc -> specret full_descriptor -> ext_expr\n  | spec_args_obj_delete_2 : object_loc -> prop_name -> bool -> object_loc -> full_descriptor -> out -> ext_expr\n  | spec_args_obj_delete_3 : out -> ext_expr\n  | spec_args_obj_delete_4 : bool -> ext_expr\n  \n  | spec_arguments_object_map : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> ext_expr\n  | spec_arguments_object_map_1 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> out -> ext_expr\n  | spec_arguments_object_map_2 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> ext_expr\n  | spec_arguments_object_map_3 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> out -> ext_expr\n  | spec_arguments_object_map_4 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> string -> ext_expr\n  | spec_arguments_object_map_5 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> string -> out -> ext_expr\n  | spec_arguments_object_map_6 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> object_loc -> out -> ext_expr\n  | spec_arguments_object_map_7 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> out -> ext_expr\n  | spec_arguments_object_map_8 : object_loc -> object_loc -> list string -> ext_expr\n\n  | spec_create_arguments_object : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> ext_expr\n  | spec_create_arguments_object_1 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> out -> ext_expr\n  | spec_create_arguments_object_2 : object_loc -> strictness_flag -> object_loc -> out -> ext_expr\n  | spec_create_arguments_object_3 : object_loc -> value -> attributes -> out -> ext_expr\n  | spec_create_arguments_object_4 : object_loc -> out -> ext_expr\n\n  (* Functions *)\n\n  | spec_object_has_instance : object_loc -> value -> ext_expr\n  | spec_object_has_instance_1 : builtin_has_instance -> object_loc -> value -> ext_expr\n  | spec_function_has_instance_1 : object_loc -> out -> ext_expr\n  | spec_function_has_instance_2 : object_loc -> object_loc -> ext_expr\n  | spec_function_has_instance_3 : object_loc -> value -> ext_expr\n\n  | spec_function_has_instance_after_bind_1 : object_loc -> value -> ext_expr\n  | spec_function_has_instance_after_bind_2 : object_loc -> value  -> ext_expr\n\n  | spec_function_get_1 : object_loc -> prop_name -> out -> ext_expr\n\n  (* Function.prototype.apply *)\n\n  | spec_function_proto_apply   : object_loc -> value -> value -> ext_expr\n  | spec_function_proto_apply_1 : object_loc -> value -> object_loc -> out -> ext_expr   \n  | spec_function_proto_apply_2 : object_loc -> value -> object_loc -> specret int -> ext_expr\n  | spec_function_proto_apply_3 : object_loc -> value -> specret (list value) -> ext_expr \n\n  (* Function.prototype.bind *)\n\n  | spec_function_proto_bind_1 : object_loc -> value -> list value -> ext_expr\n  | spec_function_proto_bind_2 : object_loc -> value -> list value -> ext_expr\n  | spec_function_proto_bind_3 : object_loc -> specret int -> ext_expr\n  | spec_function_proto_bind_4 : object_loc -> int -> ext_expr\n  | spec_function_proto_bind_5 : object_loc -> ext_expr\n  | spec_function_proto_bind_6 : object_loc -> out -> ext_expr\n  | spec_function_proto_bind_7 : object_loc -> out -> ext_expr\n\n  (* Throwing of errors *)\n\n  | spec_error : native_error -> ext_expr \n  | spec_error_1 : out -> ext_expr\n  | spec_error_or_cst : bool -> native_error -> value -> ext_expr\n  | spec_error_or_void : bool -> native_error -> ext_expr\n\n  (* LATER: these are currently unused *)\n  | spec_init_throw_type_error : ext_expr\n  | spec_init_throw_type_error_1 : out -> ext_expr\n\n  | spec_build_error : value -> value -> ext_expr\n  | spec_build_error_1 : object_loc -> value -> ext_expr\n  | spec_build_error_2 : object_loc -> out -> ext_expr\n\n  (* Object creation and calling continuation with object address *)\n\n  | spec_new_object : (object_loc -> ext_expr) -> ext_expr\n  | spec_new_object_1 : out -> (object_loc -> ext_expr) -> ext_expr\n\n  | spec_prim_new_object : prim -> ext_expr\n\n  (* Auxiliary reduction for creating function object steps 16 - 18 *)\n  | spec_creating_function_object_proto : object_loc -> ext_expr\n  | spec_creating_function_object_proto_1 : object_loc -> out -> ext_expr\n  | spec_creating_function_object_proto_2 : object_loc -> object_loc -> out -> ext_expr\n\n  | spec_creating_function_object : list string -> funcbody -> lexical_env -> strictness_flag -> ext_expr\n  | spec_creating_function_object_1 : strictness_flag -> object_loc -> out -> ext_expr\n  | spec_creating_function_object_2 : strictness_flag -> object_loc -> out -> ext_expr\n  | spec_creating_function_object_3 : object_loc -> out -> ext_expr\n  | spec_creating_function_object_4 : object_loc -> out -> ext_expr\n\n  (* Function creation in give execution context*)\n  | spec_create_new_function_in :  execution_ctx -> list string -> funcbody -> ext_expr\n\n  (* TODO: Check if object_loc or value could be None *)\n  (* TODO: get rid of this: | spec_call : builtin -> option object_loc -> option value -> list value -> ext_expr *)\n  | spec_call : object_loc -> value -> list value -> ext_expr (* object with the call method, this value, arguments *)\n  | spec_call_1 : call -> object_loc -> value -> list value -> ext_expr\n\n  | spec_call_prealloc : prealloc -> value -> list value -> ext_expr\n\n  | spec_call_default : object_loc -> value -> list value -> ext_expr\n  | spec_call_default_1 : object_loc -> ext_expr\n  | spec_call_default_2 : option funcbody -> ext_expr\n  | spec_call_default_3 : out -> ext_expr\n \n  | spec_construct : object_loc -> list value -> ext_expr\n  | spec_construct_1 : construct -> object_loc -> list value -> ext_expr\n\n  | spec_construct_prealloc : prealloc -> list value -> ext_expr\n\n  | spec_construct_default : object_loc -> list value -> ext_expr\n  | spec_construct_default_1 : object_loc -> list value -> out -> ext_expr\n  | spec_construct_default_2 : object_loc -> out -> ext_expr\n\n  | spec_construct_1_after_bind : object_loc -> list value -> object_loc -> ext_expr\n\n  (** Extended expressions for calling global object builtin functions *)\n  (* LATER: rename all the spec_call into spec_builtin *)\n\n  | spec_call_global_is_nan_1 : out -> ext_expr\n  | spec_call_global_is_finite_1 : out -> ext_expr\n\n  | spec_call_object_call_1 : value -> list value -> ext_expr\n  | spec_call_object_new_1 : value -> ext_expr\n  | spec_call_object_get_proto_of_1 : value -> ext_expr\n  | spec_call_object_is_extensible_1 : value -> ext_expr\n\n  | spec_call_object_create_1 : value -> value -> ext_expr\n  | spec_call_object_create_2 : out -> value -> value -> ext_expr\n  | spec_call_object_create_3 : object_loc -> value -> ext_expr\n\n  | spec_call_object_define_props_1 : value -> value -> ext_expr\n  | spec_call_object_define_props_2 : out -> object_loc -> ext_expr\n  | spec_call_object_define_props_3 : object_loc -> object_loc -> list prop_name -> list (prop_name * attributes) -> ext_expr\n  | spec_call_object_define_props_4 : out -> object_loc -> object_loc -> prop_name -> list prop_name -> list (prop_name * attributes) -> ext_expr\n  | spec_call_object_define_props_5 : object_loc -> object_loc -> prop_name -> list prop_name -> list (prop_name * attributes) -> specret attributes -> ext_expr\n  | spec_call_object_define_props_6 : object_loc -> list (prop_name * attributes) -> ext_expr\n  | spec_call_object_define_props_7 : out -> object_loc -> list (prop_name * attributes) -> ext_expr\n\n  | spec_call_object_seal_1 : value -> ext_expr\n  | spec_call_object_seal_2 : object_loc -> list prop_name -> ext_expr\n  | spec_call_object_seal_3 : object_loc -> prop_name -> list prop_name -> specret full_descriptor -> ext_expr\n  | spec_call_object_seal_4 : object_loc -> list prop_name -> out -> ext_expr\n\n  | spec_call_object_is_sealed_1 : value -> ext_expr\n  | spec_call_object_is_sealed_2 : object_loc -> list prop_name -> ext_expr\n  | spec_call_object_is_sealed_3 : object_loc -> list prop_name -> specret full_descriptor -> ext_expr\n\n  | spec_call_object_freeze_1 : value -> ext_expr\n  | spec_call_object_freeze_2 : object_loc -> list prop_name -> ext_expr\n  | spec_call_object_freeze_3 : object_loc -> prop_name -> list prop_name -> specret full_descriptor -> ext_expr\n  | spec_call_object_freeze_4 : object_loc -> prop_name -> list prop_name -> full_descriptor -> ext_expr\n  | spec_call_object_freeze_5 : object_loc -> list prop_name -> out -> ext_expr\n\n  | spec_call_object_is_frozen_1 : value -> ext_expr\n  | spec_call_object_is_frozen_2 : object_loc -> list prop_name -> ext_expr\n  | spec_call_object_is_frozen_3 : object_loc -> list prop_name -> specret full_descriptor -> ext_expr\n  | spec_call_object_is_frozen_4 : object_loc -> list prop_name -> full_descriptor -> ext_expr\n  | spec_call_object_is_frozen_5 : object_loc -> list prop_name -> full_descriptor -> ext_expr\n\n\n  | spec_call_object_prevent_extensions_1 : value -> ext_expr\n\n  | spec_call_object_define_prop_1 : value -> value -> value -> ext_expr\n  | spec_call_object_define_prop_2 : object_loc -> out -> value -> ext_expr\n  | spec_call_object_define_prop_3 : object_loc -> string -> specret descriptor -> ext_expr\n  | spec_call_object_define_prop_4 : object_loc -> out -> ext_expr\n\n  | spec_call_object_get_own_prop_descriptor_1: value -> value -> ext_expr\n  | spec_call_object_get_own_prop_descriptor_2: object_loc -> out -> ext_expr\n\n\n  | spec_call_object_proto_to_string_1 : value -> ext_expr\n  | spec_call_object_proto_to_string_2 : out -> ext_expr\n\n  | spec_call_object_proto_has_own_prop_1 : out -> value -> ext_expr\n  | spec_call_object_proto_has_own_prop_2 : out -> prop_name -> ext_expr\n  | spec_call_object_proto_has_own_prop_3 : specret full_descriptor -> ext_expr\n\n  | spec_call_object_proto_is_prototype_of_2_1 : value -> value -> ext_expr\n  | spec_call_object_proto_is_prototype_of_2_2 : out -> object_loc -> ext_expr\n  | spec_call_object_proto_is_prototype_of_2_3 : object_loc -> object_loc -> ext_expr\n  | spec_call_object_proto_is_prototype_of_2_4 : object_loc -> value -> ext_expr\n\n  | spec_call_object_proto_prop_is_enumerable_1 : value -> value -> ext_expr\n  | spec_call_object_proto_prop_is_enumerable_2 : value -> out -> ext_expr\n  | spec_call_object_proto_prop_is_enumerable_3 : out -> string -> ext_expr\n  | spec_call_object_proto_prop_is_enumerable_4 : specret full_descriptor -> ext_expr\n\n  | spec_call_array_new_1 : list value -> ext_expr\n  | spec_call_array_new_2 : object_loc -> list value -> ext_expr\n  | spec_call_array_new_3 : object_loc -> list value -> int -> ext_expr\n\n  | spec_call_array_new_single_1 : value -> ext_expr\n  | spec_call_array_new_single_2 : object_loc -> value -> ext_expr\n  | spec_call_array_new_single_3 : object_loc -> number -> specret int -> ext_expr\n  | spec_call_array_new_single_4 : object_loc -> int -> ext_expr\n\n  | spec_call_array_is_array_1 : value -> ext_expr\n  | spec_call_array_is_array_2_3 : class_name -> ext_expr\n\n  | spec_call_array_proto_to_string : out -> ext_expr\n  | spec_call_array_proto_to_string_1 : object_loc -> out -> ext_expr\n\n  | spec_call_array_proto_join   : out -> list value -> ext_expr \n  | spec_call_array_proto_join_1 : object_loc -> out -> list value -> ext_expr \n  | spec_call_array_proto_join_2 : object_loc -> specret int -> list value -> ext_expr\n  | spec_call_array_proto_join_3 : object_loc -> int -> value -> ext_expr\n  | spec_call_array_proto_join_4 : object_loc -> int -> out -> ext_expr\n  | spec_call_array_proto_join_5 : object_loc -> int -> string -> specret string -> ext_expr\n\n  | spec_call_array_proto_join_elements : object_loc -> int -> int -> string -> string -> ext_expr\n  | spec_call_array_proto_join_elements_1 : object_loc -> int -> int -> string -> string -> ext_expr\n  | spec_call_array_proto_join_elements_2 : object_loc -> int -> int -> string -> string -> specret string -> ext_expr\n\n  | spec_call_array_proto_pop_1 : out -> ext_expr\n  | spec_call_array_proto_pop_2 : object_loc -> out -> ext_expr\n  | spec_call_array_proto_pop_3 : object_loc -> specret int -> ext_expr\n  | spec_call_array_proto_pop_3_empty_1 : object_loc -> ext_expr\n  | spec_call_array_proto_pop_3_empty_2 : out -> ext_expr\n  | spec_call_array_proto_pop_3_nonempty_1 : object_loc -> int -> ext_expr\n  | spec_call_array_proto_pop_3_nonempty_2 : object_loc -> out -> ext_expr\n  | spec_call_array_proto_pop_3_nonempty_3 : object_loc -> value -> out -> ext_expr\n  | spec_call_array_proto_pop_3_nonempty_4 : object_loc -> value -> value -> out -> ext_expr\n  | spec_call_array_proto_pop_3_nonempty_5 : value -> out -> ext_expr\n\n  | spec_call_array_proto_push_1 : out -> list value -> ext_expr\n  | spec_call_array_proto_push_2 : object_loc -> list value -> out -> ext_expr\n  | spec_call_array_proto_push_3 : object_loc -> list value -> specret int -> ext_expr\n  | spec_call_array_proto_push_4 : object_loc -> list value -> int -> ext_expr\n  | spec_call_array_proto_push_4_nonempty_1 : object_loc -> list value -> int -> value -> ext_expr\n  | spec_call_array_proto_push_4_nonempty_2 : object_loc -> list value -> int -> value -> out -> ext_expr\n  | spec_call_array_proto_push_4_nonempty_3 : object_loc -> list value -> int -> value -> out -> ext_expr\n  | spec_call_array_proto_push_5 : object_loc -> value -> ext_expr\n  | spec_call_array_proto_push_6 : value -> out -> ext_expr\n\n  | spec_call_string_non_empty : out -> ext_expr \n\n  | spec_construct_string_1 : value -> ext_expr\n  | spec_construct_string_2 : out -> ext_expr\n\n  | spec_construct_bool_1 : out -> ext_expr\n  | spec_call_bool_proto_to_string_1 : out -> ext_expr\n  | spec_call_bool_proto_value_of_1 : value -> ext_expr\n  | spec_call_bool_proto_value_of_2 : value -> ext_expr\n\n  | spec_call_number_proto_to_string_1 : value -> list value -> ext_expr\n  | spec_call_number_proto_to_string_2 : value -> out -> ext_expr\n  | spec_construct_number_1 : out -> ext_expr\n  | spec_call_number_proto_value_of_1 : value -> ext_expr\n\n  | spec_call_error_proto_to_string_1 : value -> ext_expr\n  | spec_call_error_proto_to_string_2 : object_loc -> out -> ext_expr\n  | spec_call_error_proto_to_string_3 : object_loc -> out -> ext_expr\n  | spec_call_error_proto_to_string_4 : object_loc -> string -> out -> ext_expr\n  | spec_call_error_proto_to_string_5 : object_loc -> string -> out -> ext_expr\n  | spec_call_error_proto_to_string_6 : object_loc -> string -> out -> ext_expr\n\n\n  (** Special state for returning an outcome *)\n\n  | spec_returns : out -> ext_expr\n\n(** Grammar of extended statements *)\n\nwith ext_stat :=\n\n  (** Extended expressions include statements *)\n\n  | stat_basic : stat -> ext_stat\n\n  (** Extended statements associated with primitive statements *)\n  | stat_expr_1: (specret value) -> ext_stat\n\n  | stat_block_1 : out -> stat -> ext_stat\n  | stat_block_2 : resvalue -> out -> ext_stat\n\n  | stat_label_1 : label -> out -> ext_stat\n\n  | stat_var_decl_1 : out -> list (string * option expr) -> ext_stat\n  | stat_var_decl_item : (string * option expr) -> ext_stat\n  | stat_var_decl_item_1 : string -> specret ref -> expr -> ext_stat\n  | stat_var_decl_item_2 : string -> ref -> (specret value) -> ext_stat\n  | stat_var_decl_item_3 : string -> out -> ext_stat\n\n  | stat_if_1 : specret value -> stat -> option stat -> ext_stat\n\n  | stat_while_1 : label_set -> expr -> stat -> resvalue -> ext_stat\n  | stat_while_2 : label_set -> expr -> stat -> resvalue -> specret value -> ext_stat\n  | stat_while_3 : label_set -> expr -> stat -> resvalue -> out -> ext_stat\n  | stat_while_4 : label_set -> expr -> stat -> resvalue -> res -> ext_stat\n  | stat_while_5 : label_set -> expr -> stat -> resvalue -> res -> ext_stat\n  | stat_while_6 : label_set -> expr -> stat -> resvalue -> res -> ext_stat\n\n\n  | stat_do_while_1 : label_set -> stat -> expr -> resvalue -> ext_stat\n  | stat_do_while_2 : label_set -> stat -> expr -> resvalue -> out -> ext_stat\n  | stat_do_while_3 : label_set -> stat -> expr -> resvalue -> res -> ext_stat\n  | stat_do_while_4 : label_set -> stat -> expr -> resvalue -> res -> ext_stat\n  | stat_do_while_5 : label_set -> stat -> expr -> resvalue -> res -> ext_stat\n  | stat_do_while_6 : label_set -> stat -> expr -> resvalue -> ext_stat\n  | stat_do_while_7 : label_set -> stat -> expr -> resvalue -> specret value -> ext_stat\n\n  | stat_for_1 : label_set -> specret value -> option expr -> option expr -> stat -> ext_stat\n  | stat_for_2 : label_set -> resvalue -> option expr -> option expr -> stat -> ext_stat\n  | stat_for_3 : label_set -> resvalue -> expr -> specret value -> option expr -> stat -> ext_stat\n  | stat_for_4 : label_set -> resvalue -> option expr -> option expr -> stat -> ext_stat\n  | stat_for_5 : label_set -> resvalue -> option expr -> out -> option expr -> stat -> ext_stat\n  | stat_for_6 : label_set -> resvalue -> option expr -> option expr -> stat -> res -> ext_stat\n  | stat_for_7 : label_set -> resvalue -> option expr -> option expr -> stat -> res -> ext_stat\n  | stat_for_8 : label_set -> resvalue -> option expr -> option expr -> stat -> ext_stat\n  | stat_for_9 : label_set -> resvalue -> option expr -> expr -> specret value -> stat -> ext_stat\n\n  | stat_for_var_1 : out -> label_set -> option expr -> option expr -> stat -> ext_stat\n\n\n(* LATER: define prop_names for [set prop_name] *)\n(* LATER\n  | stat_for_in_1 : expr -> stat -> out -> ext_stat\n  | stat_for_in_2 : expr -> stat -> out -> ext_stat\n  | stat_for_in_3 : expr -> stat -> out -> ext_stat\n  | stat_for_in_4 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> ext_stat \n  | stat_for_in_5 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> prop_name -> ext_stat\n  | stat_for_in_6 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> prop_name -> ext_stat\n  | stat_for_in_7 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> out -> ext_stat\n  | stat_for_in_8 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> out -> ext_stat\n  | stat_for_in_9 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> res -> ext_stat\n*)\n\n  (* Extended statements for 'switch' *)\n                                                                           \n  | stat_switch_1: (specret value) -> label_set -> switchbody -> ext_stat\n  | stat_switch_2: out -> label_set -> ext_stat\n  | stat_switch_nodefault_1: value -> resvalue -> list switchclause -> ext_stat\n  | stat_switch_nodefault_2: (specret value) -> value -> resvalue -> list stat -> list switchclause -> ext_stat\n  | stat_switch_nodefault_3: bool -> value -> resvalue -> list stat -> list switchclause -> ext_stat\n  | stat_switch_nodefault_4: out -> list switchclause -> ext_stat\n  | stat_switch_nodefault_5: resvalue -> list switchclause -> ext_stat\n  | stat_switch_nodefault_6: resvalue -> out -> list switchclause -> ext_stat\n\n  | stat_switch_default_1: value -> resvalue -> list switchclause -> list stat -> list switchclause -> ext_stat\n  | stat_switch_default_A_1: bool -> value -> resvalue -> list switchclause -> list stat -> list switchclause -> ext_stat\n  | stat_switch_default_A_2: (specret value) -> value -> resvalue -> list stat -> list switchclause -> list stat -> list switchclause -> ext_stat\n  | stat_switch_default_A_3: bool -> value -> resvalue -> list stat -> list switchclause -> list stat -> list switchclause -> ext_stat\n  | stat_switch_default_A_4: resvalue -> value -> list stat -> list switchclause -> list stat -> list switchclause -> ext_stat\n  | stat_switch_default_A_5: resvalue -> out -> value -> list switchclause -> list stat -> list switchclause -> ext_stat\n\n  | stat_switch_default_B_1: value -> resvalue -> list stat -> list switchclause -> ext_stat\n  | stat_switch_default_B_2: (specret value) -> value -> resvalue -> list stat -> list stat -> list switchclause -> ext_stat\n  | stat_switch_default_B_3: bool -> value -> resvalue -> list stat -> list stat -> list switchclause -> ext_stat\n  | stat_switch_default_B_4: out -> list stat -> list switchclause -> ext_stat\n\n  | stat_switch_default_5: value -> resvalue -> list stat -> list switchclause -> ext_stat\n  | stat_switch_default_6: out -> list switchclause -> ext_stat\n  | stat_switch_default_7: resvalue -> list switchclause -> ext_stat\n  | stat_switch_default_8: resvalue -> out -> list switchclause -> ext_stat\n\n  | stat_with_1 : stat -> specret value -> ext_stat (* The expression have been executed. *)\n\n  | stat_throw_1 : (specret value) -> ext_stat (* The expression have been executed. *)\n\n  | stat_return_1 : (specret value) -> ext_stat (* The expression have been executed. *)\n\n  | stat_try_1 : out -> option (string*stat) -> option stat -> ext_stat (* The try block has been executed. *)\n  | stat_try_2 : out -> lexical_env -> stat -> option stat -> ext_stat (* The catch block is actived and will be executed. *)\n  | stat_try_3 : out -> option stat -> ext_stat (* The try catch block has been executed:  there only stay an optional finally. *)\n  | stat_try_4 : res -> option stat -> ext_stat (* The try catch block has been executed:  there only stay an optional finally. *)\n  | stat_try_5 : res -> out -> ext_stat (* The finally has been executed. *)\n\n(** Grammar of extended programs *)\n\nwith ext_prog :=\n\n  | prog_basic : prog -> ext_prog\n  | javascript_1 : out -> prog -> ext_prog\n  | prog_1 : out -> element -> ext_prog\n  | prog_2 : resvalue -> out -> ext_prog\n\n\n(** Grammar of extended forms for specification functions *)\n\nwith ext_spec :=\n  | spec_to_int32 : value -> ext_spec\n  | spec_to_int32_1 : out -> ext_spec\n  | spec_to_uint32 : value -> ext_spec\n  | spec_to_uint32_1 : out -> ext_spec\n\n  | spec_expr_get_value_conv : (value -> ext_expr) -> expr -> ext_spec\n  | spec_expr_get_value_conv_1 : (value -> ext_expr) -> (specret value) -> ext_spec\n  | spec_expr_get_value_conv_2 : out -> ext_spec\n\n  | spec_convert_twice : ext_expr -> ext_expr -> ext_spec\n  | spec_convert_twice_1 : out -> ext_expr -> ext_spec\n  | spec_convert_twice_2 : value -> out -> ext_spec\n\n  (** Extended expressions for lists of expressions *)\n  | spec_list_expr : list expr -> ext_spec\n  | spec_list_expr_1 : list value -> list expr -> ext_spec\n  | spec_list_expr_2 : list value -> (specret value) -> list expr -> ext_spec \n\n  | spec_to_descriptor : value -> ext_spec\n  | spec_to_descriptor_1a : object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_1b : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_1c : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_2a : object_loc -> descriptor -> ext_spec                            \n  | spec_to_descriptor_2b : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_2c : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_3a : object_loc -> descriptor -> ext_spec                            \n  | spec_to_descriptor_3b : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_3c : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_4a : object_loc -> descriptor -> ext_spec                            \n  | spec_to_descriptor_4b : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_4c : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_5a : object_loc -> descriptor -> ext_spec                            \n  | spec_to_descriptor_5b : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_5c : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_6a : object_loc -> descriptor -> ext_spec                            \n  | spec_to_descriptor_6b : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_6c : out -> object_loc -> descriptor -> ext_spec\n  | spec_to_descriptor_7 : object_loc -> descriptor -> ext_spec    \n\n  | spec_object_get_own_prop : object_loc -> prop_name -> ext_spec\n  | spec_object_get_own_prop_1 : builtin_get_own_prop -> object_loc -> prop_name -> ext_spec\n  | spec_object_get_own_prop_2 : object_loc -> prop_name -> option attributes -> ext_spec\n\n  | spec_object_get_prop : object_loc -> prop_name -> ext_spec\n  | spec_object_get_prop_1 : builtin_get_prop -> object_loc -> prop_name -> ext_spec\n  | spec_object_get_prop_2 : object_loc -> prop_name -> specret full_descriptor -> ext_spec\n  | spec_object_get_prop_3 : object_loc -> prop_name -> value -> ext_spec\n\n  | spec_get_value : resvalue -> ext_spec\n  | spec_get_value_ref_b_1 : out -> ext_spec\n  | spec_get_value_ref_c_1 : out -> ext_spec\n\n  (** Shorthand for calling [red_expr] then [ref_get_value] *)\n\n  | spec_expr_get_value : expr -> ext_spec\n  | spec_expr_get_value_1 : out -> ext_spec\n\n  (** Extended expressions for operations on lexical environments *)\n\n  | spec_lexical_env_get_identifier_ref : lexical_env -> prop_name -> bool -> ext_spec\n  | spec_lexical_env_get_identifier_ref_1 : env_loc -> lexical_env -> prop_name -> bool -> ext_spec\n  | spec_lexical_env_get_identifier_ref_2 : env_loc -> lexical_env -> prop_name -> bool -> out -> ext_spec\n\n  (** Errors in the grammar of spec *) (* LATER: merge *)\n  | spec_error_spec : native_error -> ext_spec\n  | spec_error_spec_1 : out -> ext_spec\n\n  (* .. *)\n  | spec_args_obj_get_own_prop_1 : object_loc -> prop_name -> (specret full_descriptor) -> ext_spec\n  | spec_args_obj_get_own_prop_2 : object_loc -> prop_name -> object_loc -> full_descriptor -> (specret full_descriptor) -> ext_spec\n  | spec_args_obj_get_own_prop_3 : full_descriptor -> out -> ext_spec\n  | spec_args_obj_get_own_prop_4 : full_descriptor -> ext_spec\n\n  | spec_string_get_own_prop_1 : object_loc -> prop_name -> (specret full_descriptor) -> ext_spec\n  | spec_string_get_own_prop_2 : object_loc -> prop_name -> (specret int) -> ext_spec\n  | spec_string_get_own_prop_3 : object_loc -> prop_name -> out -> ext_spec\n  | spec_string_get_own_prop_4 : prop_name -> string -> ext_spec\n  | spec_string_get_own_prop_5 : string -> (specret int) -> ext_spec\n  | spec_string_get_own_prop_6 : string -> int -> int -> ext_spec\n\n  (* Argumenst for Function.prototype.apply *)\n\n  | spec_function_proto_apply_get_args   : object_loc -> int -> int -> ext_spec\n  | spec_function_proto_apply_get_args_1 : object_loc -> int -> int -> out -> ext_spec\n  | spec_function_proto_apply_get_args_2 : object_loc -> int -> int -> out -> ext_spec\n  | spec_function_proto_apply_get_args_3 : value -> specret (list value) -> ext_spec \n\n  (* Length for Function.prototype.bind *)\n\n  | spec_function_proto_bind_length   : object_loc -> list value -> ext_spec\n  | spec_function_proto_bind_length_1 : object_loc -> list value -> ext_spec\n  | spec_function_proto_bind_length_2 : list value -> out -> ext_spec\n  | spec_function_proto_bind_length_3 : specret int -> list value -> ext_spec\n\n  (* Conversion for Array.prototype.join *)\n\n  | spec_call_array_proto_join_vtsfj : object_loc -> int -> ext_spec\n  | spec_call_array_proto_join_vtsfj_1 : object_loc -> out -> ext_spec\n  | spec_call_array_proto_join_vtsfj_2 : object_loc -> out -> ext_spec\n  | spec_call_array_proto_join_vtsfj_3 : out -> ext_spec\n.\n\n(** Coercions *)\n\nCoercion expr_basic : expr >-> ext_expr.\nCoercion stat_basic : stat >-> ext_stat.\nCoercion prog_basic : prog >-> ext_prog.\n\n\n(** Shorthand for calling toPrimitive without prefered type *)\n\nDefinition spec_to_primitive_auto v :=\n  spec_to_primitive v None.\n\n\n(**************************************************************)\n(** ** Extracting outcome from an extended expression. *)\n\n(** Auxiliary definition for extracting [out] of [specret] *)\n\nDefinition out_of_specret T (y:specret T) :=\n  match y with\n  | specret_out o => Some o\n  | specret_val _ _ => None\n  end.\n\n(** The [out_of_ext_*] family of definitions is used by\n    the generic abort rule, which propagates exceptions,\n    and divergence, break and continues. *)\n\nDefinition out_of_ext_expr (e : ext_expr) : option out :=\n  match e with\n  | expr_basic _ => None\n\n  | expr_identifier_1 y => out_of_specret y   \n  | expr_object_0 o _ => Some o\n  | expr_object_1 _ _ => None\n  | expr_object_2 _ _ _ _ => None\n  | expr_object_3_val _ _ y _ => out_of_specret y\n  | expr_object_3_get _ _ o _ => Some o\n  | expr_object_3_set _ _ o _ => Some o\n  | expr_object_4 _ _ _ _ => None\n  | expr_object_5 _ _ o => Some o\n\n\n\n\n  (* _ARRAYS_ : support for array intermediate forms - CHECK!*)\n  | expr_array_0 o _ => Some o\n  | expr_array_1 _ _ => None\n  | expr_array_2 _ _ _ => None\n  | expr_array_3 _ _ _ => None\n  | expr_array_3_1 _ y _ _ => out_of_specret y\n  | expr_array_3_2 _ _ o _ _ => Some o\n  | expr_array_3_3 _ _ y _ _ => out_of_specret y\n  | expr_array_3_4 _ _ o _ => Some o\n  | expr_array_3_5 _ o _ => Some o\n  \n\n  | expr_array_add_length   _ _ o => Some o\n  | expr_array_add_length_0 _ _ => None\n  | expr_array_add_length_1 _ _ o => Some o \n  | expr_array_add_length_2 _ y _ => out_of_specret y\n  | expr_array_add_length_3 _ y => out_of_specret y\n  | expr_array_add_length_4 _ o => Some o\n\n\n\n\n\n  | expr_function_1 _ _ _ _ _ o => Some o\n  | expr_function_2 _ _ o => Some o\n  | expr_function_3 _ o => Some o\n\n  | expr_access_1 y _ => out_of_specret y\n  | expr_access_2 _ y => out_of_specret y\n  | expr_access_3 _ o _ => Some o\n  | expr_access_4 _ o => Some o\n\n  | expr_new_1 y _ => out_of_specret y\n  | expr_new_2 _ y => out_of_specret y  \n\n  | expr_call_1 o _ _ => Some o\n  | expr_call_2 _ _ _ y => out_of_specret y\n  | expr_call_3 _ _ _ y => out_of_specret y  \n  | expr_call_4 _ _ _ _ => None\n  | expr_call_5 _ _ _ o => Some o\n\n  | spec_eval _ _ _ => None\n\n  | expr_unary_op_1 _ y => out_of_specret y\n  | expr_unary_op_2 _ _ => None\n  | expr_delete_1 o => Some o\n  | expr_delete_2 _ => None\n  | expr_delete_3 _ o => Some o\n  | expr_delete_4 _ _ => None\n  | expr_typeof_1 o => Some o\n  | expr_typeof_2 y => out_of_specret y\n  | expr_prepost_1 _ o => Some o\n(*  | expr_prepost_2 _ _ o => Some o *)\n\n  | expr_prepost_2 _ _ y => out_of_specret y\n\n  | expr_prepost_3 _ _ o => Some o\n  | expr_prepost_4 _ o => Some o\n  | expr_unary_op_neg_1 o => Some o\n  | expr_unary_op_bitwise_not_1 y => out_of_specret y\n  | expr_unary_op_not_1 o => Some o\n  | expr_conditional_1 y _ _ => out_of_specret y\n  | expr_conditional_1' o _ _ => None\n  | expr_conditional_2 y => out_of_specret y\n\n  | expr_binary_op_1 _ y _ => out_of_specret y\n  | expr_binary_op_2 _ _ y => out_of_specret y\n  | expr_binary_op_3 _ _ _ => None\n  | expr_binary_op_add_1 y => out_of_specret y\n  | expr_binary_op_add_string_1 y => out_of_specret y\n  | expr_puremath_op_1 _ y => out_of_specret y\n  | expr_shift_op_1 _ y _ => out_of_specret y\n  | expr_shift_op_2 _ _ y => out_of_specret y\n  | expr_inequality_op_1 _ _ _ _ => None\n  | expr_inequality_op_2 _ _ y => out_of_specret y\n  | expr_binary_op_in_1 _ o => Some o\n  | expr_binary_op_disequal_1 o => Some o\n  | spec_equal _ _ => None\n  | spec_equal_1 _ _ _ _ => None\n  | spec_equal_2 _ => None\n  | spec_equal_3 _ _ _ => None\n  | spec_equal_4 _ o => Some o\n  | expr_bitwise_op_1 _ y _ => out_of_specret y\n  | expr_bitwise_op_2 _ _ y => out_of_specret y\n  | expr_lazy_op_1 _ y _ => out_of_specret y\n  | expr_lazy_op_2 _ _ o _ => Some o\n  | expr_lazy_op_2_1 y => out_of_specret y\n\n  | expr_assign_1 o _ _ => Some o\n  | expr_assign_2 _ y _ _ => out_of_specret y\n  | expr_assign_3 _ _ _ y => out_of_specret y\n  | expr_assign_3' _ o => Some o\n  | expr_assign_4 _ y => out_of_specret y\n  | expr_assign_5 _ o => Some o\n\n  | spec_to_primitive _ _ => None\n  | spec_to_boolean _ => None\n  | spec_to_number _ => None\n  | spec_to_number_1 o => Some o\n  | spec_to_integer _ => None\n  | spec_to_integer_1 o => Some o\n  | spec_to_string _ => None\n  | spec_to_string_1 o => Some o\n  | spec_to_object _ => None\n\n  | spec_check_object_coercible _ => None\n\n  | spec_eq _ _ => None\n  | spec_eq0 _ _ => None\n  | spec_eq1 _ _ => None\n  | spec_eq2 _ _ _ => None\n\n  | spec_object_get _ _ => None\n  | spec_object_get_1 _ _ _ _ => None\n  | spec_object_get_2 _ y => out_of_specret y\n  | spec_object_get_3 _ _ => None\n\n  | spec_object_can_put _ _ => None\n  | spec_object_can_put_1 _ _ _ => None\n  | spec_object_can_put_2 _ _ y => out_of_specret y\n  | spec_object_can_put_4 _ _ _ => None\n  | spec_object_can_put_5 _ y => out_of_specret y\n  | spec_object_can_put_6 _ _ => None\n\n  | spec_object_put _ _ _ _ => None\n  | spec_object_put_1 _ _ _ _ _ _ => None\n  | spec_object_put_2 _ _ _ _ _ o => Some o\n  | spec_object_put_3 _ _ _ _ _ y => out_of_specret y\n  | spec_object_put_4 _ _ _ _ _ y => out_of_specret y\n  | spec_object_put_5 o => Some o\n\n  | spec_object_has_prop _ _ => None\n  | spec_object_has_prop_1 _ _ _ => None\n  | spec_object_has_prop_2 y => out_of_specret y\n\n  | spec_object_delete _ _ _ => None\n  | spec_object_delete_1 _ _ _ _ => None\n  | spec_object_delete_2 _ _ _ y => out_of_specret y\n  | spec_object_delete_3 _ _ _ _ => None\n\n  | spec_object_default_value _ _ => None\n  | spec_object_default_value_1 _ _ _ => None\n  | spec_object_default_value_2 _ _ _ => None\n  | spec_object_default_value_3 _ _ => None\n  | spec_object_default_value_4 => None\n  | spec_object_default_value_sub_1 _ _ _ => None\n  | spec_object_default_value_sub_2 _ o _ => Some o\n  | spec_object_default_value_sub_3 o _ => Some o\n\n  | spec_object_define_own_prop _ _ _ _ => None\n  | spec_object_define_own_prop_1 _ _ _ _ _ => None\n  | spec_object_define_own_prop_2 _ _ _ _ y => out_of_specret y\n  | spec_object_define_own_prop_3 _ _ _ _ _ _ => None\n  | spec_object_define_own_prop_4 _ _ _ _ _ => None\n  | spec_object_define_own_prop_5 _ _ _ _ _ => None\n  | spec_object_define_own_prop_6a _ _ _ _ _ => None\n  | spec_object_define_own_prop_6b _ _ _ _ _ => None\n  | spec_object_define_own_prop_6c _ _ _ _ _ => None\n  | spec_object_define_own_prop_reject _ => None\n  | spec_object_define_own_prop_write _ _ _ _ _ => None\n\n\n\n  (* ARRAYS *)\n  | spec_object_define_own_prop_array_2 _ _ _ _ y => out_of_specret y\n  | spec_object_define_own_prop_array_2_1 _ _ _ _ _ _ => None\n  | spec_object_define_own_prop_array_branch_3_4 _ _ _ _ _ y => out_of_specret y\n  | spec_object_define_own_prop_array_branch_4_5 _ _ _ _ _ _ => None\n  | spec_object_define_own_prop_array_branch_4_5_a _ _ y _ _ _ _ => out_of_specret y\n  | spec_object_define_own_prop_array_branch_4_5_b _ _ _ o _ _ _ _ => Some o\n  | spec_object_define_own_prop_array_4a _ _ _ _ _ _ => None\n  | spec_object_define_own_prop_array_4b _ _ y _ _ _ _ => out_of_specret y\n  | spec_object_define_own_prop_array_4c _ _ _ _ _ _ o => Some o\n  | spec_object_define_own_prop_array_5 _ _ _ _ => None\n  | spec_object_define_own_prop_array_3 _ _ _ _ _ => None\n  | spec_object_define_own_prop_array_3c _ _ y _ _ _ _ => out_of_specret y\n  | spec_object_define_own_prop_array_3d_e _ o _ _ _ _ _ => Some o\n  | spec_object_define_own_prop_array_3f_g _ _ _ _ _ _ => None\n  | spec_object_define_own_prop_array_3h_i _ _ _ _ _ _ => None\n  | spec_object_define_own_prop_array_3j _ _ _ _ _ _ _ => None\n  | spec_object_define_own_prop_array_3k_l _ o _ _ _ _ _ _ => Some o\n  | spec_object_define_own_prop_array_3l _ _ _ _ _ _ => None\n  | spec_object_define_own_prop_array_3l_ii _ _ _ _ _ _ => None\n  | spec_object_define_own_prop_array_3l_ii_1 _ _ _ _ _ _ o => Some o\n  | spec_object_define_own_prop_array_3l_ii_2 _ _ _ _ _ _ o => Some o\n  | spec_object_define_own_prop_array_3l_iii_1 _ _ _ _ _ => None\n  | spec_object_define_own_prop_array_3l_iii_2 _ _ _ _ => None\n  | spec_object_define_own_prop_array_3l_iii_3 _ _ _ => None\n  | spec_object_define_own_prop_array_3l_iii_4 _ _ o => Some o\n  | spec_object_define_own_prop_array_3m_n _ _ => None\n\n  | spec_prim_value_get _ _ => None\n  | spec_prim_value_get_1 _ _ o => Some o\n\n  | spec_prim_value_put _ _ _ _ => None\n  | spec_prim_value_put_1 _ _ _ _ o => Some o\n\n  | spec_put_value _ _ => None\n\n\n  | spec_env_record_has_binding _ _ => None\n  | spec_env_record_has_binding_1 _ _ _ => None\n  | spec_env_record_get_binding_value _ _ _ => None\n  | spec_env_record_get_binding_value_1 _ _ _ _ => None\n  | spec_env_record_get_binding_value_2 _ _ _ o => Some o\n\n  | spec_env_record_create_immutable_binding _ _ => None\n  | spec_env_record_initialize_immutable_binding _ _ _ => None\n  | spec_env_record_create_mutable_binding _ _ _ => None\n  | spec_env_record_create_mutable_binding_1 _ _ _ _ => None\n  | spec_env_record_create_mutable_binding_2 _ _ _ _ o => Some o\n  | spec_env_record_create_mutable_binding_3 o => Some o\n  | spec_env_record_set_mutable_binding _ _ _ _ => None\n  | spec_env_record_set_mutable_binding_1 _ _ _ _ _ => None\n  | spec_env_record_delete_binding _ _ => None\n  | spec_env_record_delete_binding_1 _ _ _ => None\n\n  | spec_env_record_create_set_mutable_binding _ _ _ _ _ => None\n  | spec_env_record_create_set_mutable_binding_1 o _ _ _ _ => Some o\n\n  | spec_env_record_implicit_this_value _ => None\n  | spec_env_record_implicit_this_value_1 _ _ => None\n\n  | spec_from_descriptor y => out_of_specret y\n  | spec_from_descriptor_1 _ o => Some o\n  | spec_from_descriptor_2 _ _ o => Some o\n  | spec_from_descriptor_3 _ _ o => Some o\n  | spec_from_descriptor_4 _ _ o => Some o\n  | spec_from_descriptor_5 _ _ o => Some o\n  | spec_from_descriptor_6 _ o => Some o\n\n\n  | spec_entering_eval_code _ _ _ => None\n  | spec_entering_eval_code_1 _ _ _ => None\n  | spec_entering_eval_code_2 o _ => Some o\n\n  | spec_call_global_eval _ _ => None\n  | spec_call_global_eval_1 _ _ => None\n  | spec_call_global_eval_2 _ => None\n  | spec_call_global_eval_3 o => Some o\n\n  | spec_entering_func_code _ _ _ _ => None\n  | spec_entering_func_code_1 _ _ _ _ _ _ => None\n  | spec_entering_func_code_2 _ _ _ o _ => Some o\n  | spec_entering_func_code_3 _ _ _ _ _ _ => None\n  | spec_entering_func_code_4 o _ => Some o\n\n  | spec_binding_inst_formal_params _ _ _ _ => None\n  | spec_binding_inst_formal_params_1 _ _ _ _ _ _ o => Some o\n  | spec_binding_inst_formal_params_2 _ _ _ _ _ _ o => Some o\n  | spec_binding_inst_formal_params_3 _ _ _ _ _ _ => None\n  | spec_binding_inst_formal_params_4 _ _ _ _ o => Some o\n  | spec_binding_inst_function_decls _ _ _ _ _ => None\n  | spec_binding_inst_function_decls_1 _ _ _ _ _ _ o => Some o\n  | spec_binding_inst_function_decls_2 _ _ _ _ _ _ _ o => Some o\n  | spec_binding_inst_function_decls_3 _ _ _ _ _ _ y => out_of_specret y\n  | spec_binding_inst_function_decls_3a _ _ _ _ _ _ _ => None\n  | spec_binding_inst_function_decls_4 _ _ _ _ _ _ _ o => Some o\n  | spec_binding_inst_function_decls_5 _ _ _ _ _ _ _ => None\n  | spec_binding_inst_function_decls_6 _ _ _ _ _ o => Some o\n  | spec_binding_inst_arg_obj   object_loc _ _ _ _ => None\n  | spec_binding_inst_arg_obj_1 _ _ _ o => Some o\n  | spec_binding_inst_arg_obj_2 _ _ _ o => Some o\n  | spec_binding_inst_var_decls _ _ _ _ => None\n  | spec_binding_inst_var_decls_1 _ _ _ _ _ o => Some o\n  | spec_binding_inst_var_decls_2 _ _ _ _ o => Some o\n  | spec_binding_inst _ _ _ _ => None\n  | spec_binding_inst_1 _ _ _ _ _ => None\n  | spec_binding_inst_2 _ _ _ _ _ _ o => Some o\n  | spec_binding_inst_3 _ _ _ _ _ _ => None\n  | spec_binding_inst_4 _ _ _ _ _ _ _ o => Some o\n  | spec_binding_inst_5 _ _ _ _ _ _ _ => None\n  | spec_binding_inst_6 _ _ _ _ _ _ _ o => Some o\n  | spec_binding_inst_7 _ _ _ o => Some o\n  | spec_binding_inst_8 _ _ _ => None\n  \n  | spec_make_arg_getter _ _ => None\n  | spec_make_arg_setter _ _ => None\n  \n  | spec_args_obj_get_1 _ _ _ _ y => out_of_specret y\n  \n  \n  | spec_args_obj_define_own_prop_1 _ _ _ _ _ y => out_of_specret y\n  | spec_args_obj_define_own_prop_2 _ _ _ _ _ _ o => Some o\n  | spec_args_obj_define_own_prop_3 _ _ _ _ _ o => Some o\n  | spec_args_obj_define_own_prop_4 _ _ _ _ _ => None\n  | spec_args_obj_define_own_prop_5 o => Some o\n  | spec_args_obj_define_own_prop_6 => None\n  \n  | spec_args_obj_delete_1 _ _ _ _ y => out_of_specret y\n  | spec_args_obj_delete_2 _ _ _ _ _ o => Some o\n  | spec_args_obj_delete_3 o => Some o\n  | spec_args_obj_delete_4 _ => None\n  \n  | spec_arguments_object_map _ _ _ _ _ => None\n  | spec_arguments_object_map_1 _ _ _ _ _ o => Some o\n  | spec_arguments_object_map_2 _ _ _ _ _ _ _ _ => None\n  | spec_arguments_object_map_3 _ _ _ _ _ _ _ _ o => Some o\n  | spec_arguments_object_map_4 _ _ _ _ _ _ _ _ _ => None\n  | spec_arguments_object_map_5 _ _ _ _ _ _ _ _ _ o => Some o\n  | spec_arguments_object_map_6 _ _ _ _ _ _ _ _ _ o => Some o\n  | spec_arguments_object_map_7 _ _ _ _ _ _ _ _ o => Some o\n  | spec_arguments_object_map_8 _ _ _  => None\n\n\n  | spec_create_arguments_object _ _ _ _ _ => None\n  | spec_create_arguments_object_1 _ _ _ _ _ _ o => Some o\n  | spec_create_arguments_object_2 _ _ _ o => Some o\n  | spec_create_arguments_object_3 _ _ _ o => Some o\n  | spec_create_arguments_object_4 _ o => Some o\n\n  | spec_object_has_instance _ _ => None\n  | spec_object_has_instance_1 _ _ _ => None\n  | spec_function_has_instance_1 _ o => Some o\n  | spec_function_has_instance_2 _ _ => None\n  | spec_function_has_instance_3 _ _ => None\n  | spec_function_has_instance_after_bind_1 _ _ => None\n  | spec_function_has_instance_after_bind_2 _ _ => None \n\n  | spec_function_get_1 _ _ o => Some o\n\n  | spec_error _ => None\n  | spec_error_1 o => Some o \n  | spec_error_or_cst _ _ _ => None\n  | spec_error_or_void _ _ => None\n\n  | spec_init_throw_type_error => None\n  | spec_init_throw_type_error_1 o => Some o\n\n  | spec_build_error _ _ => None\n  | spec_build_error_1 _ _ => None\n  | spec_build_error_2 _ o => Some o\n\n  | spec_new_object _ => None\n  | spec_new_object_1 o _ => Some o\n\n  | spec_prim_new_object _ => None\n\n  | spec_creating_function_object_proto _ => None\n  | spec_creating_function_object_proto_1 _ o => Some o\n  | spec_creating_function_object_proto_2 _ _ o => Some o\n\n  | spec_creating_function_object _ _ _ _ => None\n  | spec_creating_function_object_1 _ _ o => Some o\n  | spec_creating_function_object_2 _ _ o => Some o\n  | spec_creating_function_object_3 _ o => Some o\n  | spec_creating_function_object_4 _ o => Some o\n\n  | spec_function_proto_apply _ _ _ => None\n  | spec_function_proto_apply_1 _ _ _ o => Some o  \n  | spec_function_proto_apply_2 _ _ _ y => out_of_specret y\n  | spec_function_proto_apply_3 _ _ y => out_of_specret y\n\n  | spec_function_proto_bind_1 _ _ _ => None \n  | spec_function_proto_bind_2 _ _ _ => None \n  | spec_function_proto_bind_3 _ y => out_of_specret y \n  | spec_function_proto_bind_4 _ _ => None \n  | spec_function_proto_bind_5 _ => None\n  | spec_function_proto_bind_6 _ o => Some o \n  | spec_function_proto_bind_7 _ o => Some o\n\n  | spec_create_new_function_in  execution_ctx _ _ => None\n\n  | spec_call _ _ _ => None\n  | spec_call_1 _ _ _ _ => None\n\n  | spec_call_prealloc _ _ _ => None\n\n  | spec_call_default _ _ _ => None\n  | spec_call_default_1 _ => None\n  | spec_call_default_2 _ => None\n  | spec_call_default_3 o => Some o\n\n  | spec_construct _ _ => None\n  | spec_construct_1 _ _ _ => None\n\n  | spec_construct_prealloc _ _ => None\n\n  | spec_construct_default _ _ => None\n  | spec_construct_default_1 _ _ o => Some o\n  | spec_construct_default_2 _ o => Some o\n\n  | spec_construct_1_after_bind _ _ _ => None\n\n  | spec_construct_bool_1 o => Some o\n\n  | spec_construct_number_1 o => Some o\n\n  | spec_call_global_is_nan_1 o => Some o\n  | spec_call_global_is_finite_1 o => Some o\n\n  | spec_call_object_call_1 _ _ => None\n  | spec_call_object_new_1 _ => None\n  | spec_call_object_get_proto_of_1 _ => None\n  | spec_call_object_is_extensible_1 _ => None\n\n  | spec_call_object_define_props_1 _ _ => None\n  | spec_call_object_define_props_2 o _ => Some o\n  | spec_call_object_define_props_3 _ _ _ _ => None\n  | spec_call_object_define_props_4 o _ _ _ _ _ => Some o\n  | spec_call_object_define_props_5 _ _ _ _ _ y => out_of_specret y\n  | spec_call_object_define_props_6 _ _ => None\n  | spec_call_object_define_props_7 o _ _ => Some o\n\n  | spec_call_object_create_1 _ _ => None\n  | spec_call_object_create_2 o _ _ => Some o\n  | spec_call_object_create_3 _ _ => None\n\n  | spec_call_object_seal_1 _ => None\n  | spec_call_object_seal_2 _ _ => None\n  | spec_call_object_seal_3 _ _ _ y => out_of_specret y\n  | spec_call_object_seal_4 _ _ o => Some o\n\n  | spec_call_object_is_sealed_1 _ => None\n  | spec_call_object_is_sealed_2 _ _ => None\n  | spec_call_object_is_sealed_3 _ _ y => out_of_specret y\n\n  | spec_call_object_freeze_1 _ => None\n  | spec_call_object_freeze_2 _ _ => None\n  | spec_call_object_freeze_3 _ _ _ y => out_of_specret y\n  | spec_call_object_freeze_4 _ _ _ _ => None\n  | spec_call_object_freeze_5 _ _ o => Some o\n\n  | spec_call_object_is_frozen_1 _ => None\n  | spec_call_object_is_frozen_2 _ _ => None\n  | spec_call_object_is_frozen_3 _ _ y => out_of_specret y\n  | spec_call_object_is_frozen_4 _ _ _ => None\n  | spec_call_object_is_frozen_5 _ _ _ => None\n\n\n  | spec_call_object_prevent_extensions_1 _ => None\n\n  | spec_call_object_define_prop_1 _ _ _ => None\n  | spec_call_object_define_prop_2 _ o _ => Some o\n  | spec_call_object_define_prop_3 _ _ y => out_of_specret y\n  | spec_call_object_define_prop_4 _ o => Some o\n\n  | spec_call_object_get_own_prop_descriptor_1 _ _ => None\n  | spec_call_object_get_own_prop_descriptor_2 _ o => Some o\n\n  | spec_call_object_proto_to_string_1 _ => None\n  | spec_call_object_proto_to_string_2 o => Some o\n\n  | spec_call_object_proto_has_own_prop_1 o _ => Some o\n  | spec_call_object_proto_has_own_prop_2 o _ => Some o\n  | spec_call_object_proto_has_own_prop_3 y => out_of_specret y\n\n  | spec_call_object_proto_is_prototype_of_2_1 _ _ => None\n  | spec_call_object_proto_is_prototype_of_2_2 o _ => Some o\n  | spec_call_object_proto_is_prototype_of_2_3 _ _ => None\n  | spec_call_object_proto_is_prototype_of_2_4 _ _ => None\n\n  | spec_call_object_proto_prop_is_enumerable_1 _ _ => None\n  | spec_call_object_proto_prop_is_enumerable_2 _ o => Some o\n  | spec_call_object_proto_prop_is_enumerable_3 o _ => Some o\n  | spec_call_object_proto_prop_is_enumerable_4 y => out_of_specret y\n\n  | spec_call_array_new_1 _ => None\n  | spec_call_array_new_2 _ _ => None\n  | spec_call_array_new_3 _ _ _ => None\n\n  | spec_call_array_new_single_1 _ => None\n  | spec_call_array_new_single_2 _ _ => None\n  | spec_call_array_new_single_3 _ _ y => out_of_specret y\n  | spec_call_array_new_single_4 _ _ => None\n  \n  | spec_call_array_is_array_1 _ => None\n  | spec_call_array_is_array_2_3 _ => None\n\n  | spec_call_array_proto_join   o _ => Some o \n  | spec_call_array_proto_join_1 _ o _ => Some o \n  | spec_call_array_proto_join_2 _ y _ => out_of_specret y\n  | spec_call_array_proto_join_3 _ _ _ => None\n  | spec_call_array_proto_join_4 _ _ o => Some o\n  | spec_call_array_proto_join_5 _ _ _ y => out_of_specret y\n\n  | spec_call_array_proto_join_elements _ _ _ _ _ => None\n  | spec_call_array_proto_join_elements_1 _ _ _ _ _ => None\n  | spec_call_array_proto_join_elements_2 _ _ _ _ _ y => out_of_specret y\n\n  | spec_call_array_proto_to_string o => Some o\n  | spec_call_array_proto_to_string_1 _ o => Some o\n\n  | spec_call_array_proto_pop_1 o => Some o\n  | spec_call_array_proto_pop_2 _ o => Some o\n  | spec_call_array_proto_pop_3 _ y  => out_of_specret y\n  | spec_call_array_proto_pop_3_empty_1 _ => None\n  | spec_call_array_proto_pop_3_empty_2 o => Some o\n  | spec_call_array_proto_pop_3_nonempty_1 _ _ => None\n  | spec_call_array_proto_pop_3_nonempty_2 _ o => Some o\n  | spec_call_array_proto_pop_3_nonempty_3 _ _ o => Some o\n  | spec_call_array_proto_pop_3_nonempty_4 _ _ _ o => Some o\n  | spec_call_array_proto_pop_3_nonempty_5 _ o => Some o\n\n  | spec_call_array_proto_push_1 o _ => Some o\n  | spec_call_array_proto_push_2 _ _ o => Some o\n  | spec_call_array_proto_push_3 _ _ y => out_of_specret y\n  | spec_call_array_proto_push_4 _ _ _ => None\n  | spec_call_array_proto_push_4_nonempty_1 _ _ _ _ => None\n  | spec_call_array_proto_push_4_nonempty_2 _ _ _ _ o => Some o\n  | spec_call_array_proto_push_4_nonempty_3 _ _ _ _ o => Some o\n  | spec_call_array_proto_push_5 _ _ => None\n  | spec_call_array_proto_push_6 _ o => Some o\n\n  | spec_call_string_non_empty o => Some o \n\n  | spec_construct_string_1 _ => None\n  | spec_construct_string_2 o => Some o\n\n  | spec_call_bool_proto_to_string_1 o => Some o\n  | spec_call_bool_proto_value_of_1 _ => None\n  | spec_call_bool_proto_value_of_2 _ => None\n\n  | spec_call_number_proto_to_string_1 _ _ => None\n  | spec_call_number_proto_to_string_2 _ o => Some o\n  | spec_call_number_proto_value_of_1 _ => None\n\n  | spec_call_error_proto_to_string_1 _ => None\n  | spec_call_error_proto_to_string_2 _ o => Some o\n  | spec_call_error_proto_to_string_3 _ o => Some o\n  | spec_call_error_proto_to_string_4 _ _ o => Some o\n  | spec_call_error_proto_to_string_5 _ _ o => Some o\n  | spec_call_error_proto_to_string_6 _ _ o => Some o\n\n  | spec_returns o => Some o\n  end.\n\nDefinition out_of_ext_stat (p : ext_stat) : option out :=\n  match p with\n  | stat_expr_1 (specret_out o) => Some o\n  | stat_expr_1 (specret_val _ _) => None\n  | stat_basic _ => None\n\n  | stat_block_1 o _ => Some o\n  | stat_block_2 _ o => Some o\n\n  | stat_label_1 _ o => Some o\n\n  | stat_var_decl_1 o _ => Some o\n  | stat_var_decl_item _ => None\n  | stat_var_decl_item_1 _ y _ => out_of_specret y\n  | stat_var_decl_item_2 _ _ y => out_of_specret y\n  | stat_var_decl_item_3 _ o => Some o\n\n  | stat_if_1 y _ _ => out_of_specret y\n\n  | stat_while_1 _ _ _ _ => None\n  | stat_while_2 _ _ _ _ y => out_of_specret y\n  | stat_while_3 _ _ _ _ o => Some o\n  | stat_while_4 _ _ _ _ _ => None\n  | stat_while_5 _ _ _ _ _ => None\n  | stat_while_6 _ _ _ _ _ => None\n\n  | stat_do_while_1 _ _ _ _ => None\n  | stat_do_while_2 _ _ _ _ o => Some o\n  | stat_do_while_3 _ _ _ _ _ => None\n  | stat_do_while_4 _ _ _ _ _ => None\n  | stat_do_while_5 _ _ _ _ _ => None\n  | stat_do_while_6 _ _ _ _ => None\n  | stat_do_while_7 _ _ _ _ y => out_of_specret y\n\n  | stat_for_1 _ y _ _ _ => out_of_specret y\n  | stat_for_2 _ _ _ _ _ => None\n  | stat_for_3 _ _ _ y _ _ => out_of_specret y\n  | stat_for_4 _ _ _ _ _ => None\n  | stat_for_5 _ _ _ o _ _ => Some o\n  | stat_for_6 _ _ _ _ _ _ => None\n  | stat_for_7 _ _ _ _ _ _ => None\n  | stat_for_8 _ _ _ _ _ => None\n  | stat_for_9 _ _ _ _ y _ => out_of_specret y\n  | stat_for_var_1 o _ _ _ _ => Some o\n\n  | stat_with_1 _ y => out_of_specret y\n\n  | stat_throw_1 y => out_of_specret y\n\n  | stat_return_1 y => out_of_specret y\n\n  | stat_try_1 o _ _ => Some o\n  | stat_try_2 o _ _ _ => Some o\n  | stat_try_3 o _ => Some o\n  | stat_try_4 _ _ => None\n  | stat_try_5 _ o => Some o\n\n  | stat_switch_1 y _ _ => out_of_specret y\n  | stat_switch_2 o _ => Some o\n  | stat_switch_nodefault_1 _ _ _=> None\n  | stat_switch_nodefault_2 y _ _ _ _  => out_of_specret y\n  | stat_switch_nodefault_3 _ _ _ _ _ => None\n  | stat_switch_nodefault_4 o _ => Some o\n  | stat_switch_nodefault_5 _ _ => None\n  | stat_switch_nodefault_6 _ o _ => Some o\n\n  | stat_switch_default_1 _ _ _ _ _ => None\n  | stat_switch_default_A_1 _ _ _ _ _ _ => None \n  | stat_switch_default_A_2 y _ _ _ _ _ _ => out_of_specret y\n  | stat_switch_default_A_3 _ _ _ _ _ _ _  => None\n  | stat_switch_default_A_4 _ _ _ _ _ _ => None\n  | stat_switch_default_A_5 _ o _ _ _ _ => Some o\n  | stat_switch_default_B_1 _ _ _ _ => None\n  | stat_switch_default_B_2 y _ _ _ _ _ => out_of_specret y\n  | stat_switch_default_B_3 _ _ _ _ _ _ => None\n  | stat_switch_default_B_4 o _ _ => Some o\n\n  | stat_switch_default_5 _ _ _ _ => None\n  | stat_switch_default_6 o _ => Some o \n  | stat_switch_default_7 _ _  => None\n  | stat_switch_default_8 _ o _ => Some o\n\n  end.\n\nDefinition out_of_ext_prog (p : ext_prog) : option out :=\n  match p with\n  | prog_basic _ => None\n  | javascript_1 o _ => Some o\n  | prog_1 o _ => Some o\n  | prog_2 _ o => Some o\n\n  end.\n\nDefinition out_of_ext_spec (es : ext_spec) : option out :=\n  match es with\n  | spec_to_int32 _ => None\n  | spec_to_int32_1 o => Some o\n  | spec_to_uint32 _ => None\n  | spec_to_uint32_1 o => Some o\n  | spec_expr_get_value_conv _ _ => None\n  | spec_expr_get_value_conv_1 _ y => out_of_specret y\n  | spec_expr_get_value_conv_2 o => Some o\n  | spec_convert_twice _ _ => None\n  | spec_convert_twice_1 o _ => Some o\n  | spec_convert_twice_2 _ o => Some o\n  | spec_list_expr _ => None\n  | spec_list_expr_1 _ _ => None\n  | spec_list_expr_2 _ y _ => out_of_specret y\n  | spec_to_descriptor _ => None\n  | spec_to_descriptor_1a _ _ => None\n  | spec_to_descriptor_1b o _ _ => Some o\n  | spec_to_descriptor_1c o _ _ => Some o\n  | spec_to_descriptor_2a _ _ => None\n  | spec_to_descriptor_2b o _ _ => Some o\n  | spec_to_descriptor_2c o _ _ => Some o\n  | spec_to_descriptor_3a _ _ => None\n  | spec_to_descriptor_3b o _ _ => Some o\n  | spec_to_descriptor_3c o _ _ => Some o\n  | spec_to_descriptor_4a _ _ => None\n  | spec_to_descriptor_4b o _ _ => Some o\n  | spec_to_descriptor_4c o _ _ => Some o\n  | spec_to_descriptor_5a _ _ => None\n  | spec_to_descriptor_5b o _ _ => Some o\n  | spec_to_descriptor_5c o _ _ => Some o\n  | spec_to_descriptor_6a _ _ => None\n  | spec_to_descriptor_6b o _ _=> Some o\n  | spec_to_descriptor_6c o _ _ => Some o\n  | spec_to_descriptor_7 _ _ => None\n  | spec_object_get_own_prop _ _ => None\n  | spec_object_get_own_prop_1 _ _ _ => None\n  | spec_object_get_own_prop_2 _ _ _ => None\n  | spec_object_get_prop _ _ => None\n  | spec_object_get_prop_1 _ _ _ => None\n  | spec_object_get_prop_2 _ _ y => out_of_specret y\n  | spec_object_get_prop_3 _ _ _ => None\n  | spec_get_value _ => None\n  | spec_get_value_ref_b_1 o => Some o\n  | spec_get_value_ref_c_1 o => Some o\n  | spec_expr_get_value _ => None\n  | spec_expr_get_value_1 o => Some o\n  | spec_lexical_env_get_identifier_ref _ _ _ => None\n  | spec_lexical_env_get_identifier_ref_1 _ _ _ _ => None\n  | spec_lexical_env_get_identifier_ref_2 _ _ _ _ o => Some o\n  | spec_error_spec _ => None\n  | spec_error_spec_1 o => Some o\n  | spec_args_obj_get_own_prop_1 _ _ y => out_of_specret y\n  | spec_args_obj_get_own_prop_2 _ _ _ _ y => out_of_specret y\n  | spec_args_obj_get_own_prop_3 _ o => Some o\n  | spec_args_obj_get_own_prop_4 _ => None\n  | spec_string_get_own_prop_1 _ _ y => out_of_specret y\n  | spec_string_get_own_prop_2 _ _ y => out_of_specret y\n  | spec_string_get_own_prop_3 _ _ o => Some o\n  | spec_string_get_own_prop_4 _ _ => None\n  | spec_string_get_own_prop_5 _ y => out_of_specret y\n  | spec_string_get_own_prop_6 _ _ _ => None\n  | spec_function_proto_apply_get_args _ _ _ => None\n  | spec_function_proto_apply_get_args_1 _ _ _ o => Some o \n  | spec_function_proto_apply_get_args_2 _ _ _ o => Some o \n  | spec_function_proto_apply_get_args_3 _ y => out_of_specret y\n  | spec_function_proto_bind_length _ _ => None\n  | spec_function_proto_bind_length_1 _ _ => None\n  | spec_function_proto_bind_length_2 _ o => Some o\n  | spec_function_proto_bind_length_3 y _ => out_of_specret y\n  | spec_call_array_proto_join_vtsfj _ _ => None\n  | spec_call_array_proto_join_vtsfj_1 _ o => Some o \n  | spec_call_array_proto_join_vtsfj_2 _ o => Some o \n  | spec_call_array_proto_join_vtsfj_3 o => Some o \n  end.\n\n\n(**************************************************************)\n(** ** Rules for propagating aborting expressions *)\n\n(** Definition of a result of type normal *)\n\nDefinition res_is_normal R :=\n  res_type R = restype_normal.\n\n(** Definition of aborting outcomes: diverging outcomes,\n    and terminating outcomes that are not of type \"normal\". *)\n\nInductive abort : out -> Prop :=\n  | abort_div :\n      abort out_div\n  | abort_not_normal : forall S R,\n      abrupt_res R ->\n      abort (out_ter S R).\n\n(** Definition of the behaviors caught by an exception handler,\n    and thus not propagated by the generic abort rule *)\n\nInductive abort_intercepted_prog : ext_prog -> Prop :=\n  | abort_intercepted_prog_block_2 : forall S R rv,\n      abort_intercepted_prog (prog_2 rv (out_ter S R)).\n\nInductive abort_intercepted_stat : ext_stat -> Prop :=\n\n  | abort_intercepted_stat_block_2 : forall S R rv,\n      abort_intercepted_stat (stat_block_2 rv (out_ter S R))\n  | abort_intercepted_stat_label_1 : forall lab rv S R,\n      R = res_intro restype_break rv lab ->\n      abort_intercepted_stat (stat_label_1 lab (out_ter S R))\n  | abort_intercepted_do_while_2 : forall labs e1 t2 rv S R,\n      res_label_in R labs ->\n      (res_type R = restype_continue \\/ res_type R = restype_break) ->\n      abort_intercepted_stat (stat_do_while_2 labs t2 e1 rv (out_ter S R))\n  | abort_intercepted_while_3 : forall labs e1 t2 rv S R,\n      res_label_in R labs ->\n      (res_type R = restype_continue \\/ res_type R = restype_break) ->\n      abort_intercepted_stat (stat_while_3 labs e1 t2 rv (out_ter S R))\n  | abort_intercepted_stat_try_1 : forall S R cb fo,\n      res_type R = restype_throw ->\n      abort_intercepted_stat (stat_try_1 (out_ter S R) (Some cb) fo)\n  | abort_intercepted_stat_try_3 : forall S R fo,\n      abort_intercepted_stat (stat_try_3 (out_ter S R) fo)\n  | abort_intercepted_stat_switch_2 : forall S R labs,\n      res_type R = restype_break ->\n      res_label_in R labs ->  \n      abort_intercepted_stat (stat_switch_2 (out_ter S R) labs)\n  | abort_intercepted_stat_switch_nodefault_6 : forall S rv R scs,\n      abrupt_res R ->\n      res_type R <> restype_throw -> \n      abort_intercepted_stat (stat_switch_nodefault_6 rv (out_ter S R) scs)\n  | abort_intercepted_stat_switch_default_8 : forall S rv R scs,\n      abrupt_res R ->\n      res_type R <> restype_throw ->\n      abort_intercepted_stat (stat_switch_default_8 rv (out_ter S R) scs)\n  | abort_intercepted_stat_switch_default_A_5 : forall S rv R vi scs ts1 scs2,\n      abrupt_res R ->\n      res_type R <> restype_throw ->\n      abort_intercepted_stat (stat_switch_default_A_5 rv (out_ter S R) vi scs ts1 scs2)\n   | abort_intercepted_stat_for_6 : forall S0 S C labs rv R eo2 eo3 t,\n      abort_intercepted_stat (stat_for_6 labs rv eo2 eo3 t R)\n   | abort_intercepted_stat_for_7 : forall S0 S C labs rv R eo2 eo3 t,\n      abort_intercepted_stat (stat_for_7 labs rv eo2 eo3 t R)\n.\n\nInductive abort_intercepted_expr : ext_expr -> Prop :=\n  | abort_intercepted_expr_call_default_2 : forall S R,\n      res_type R = restype_return ->\n      abort_intercepted_expr (spec_call_default_3 (out_ter S R))\n  | abort_intercepted_expr_call_global_eval_3 : forall S R,\n      res_type R = restype_throw ->\n      abort_intercepted_expr (spec_call_global_eval_3 (out_ter S R)).\n\nInductive abort_intercepted_spec : ext_spec -> Prop :=\n  .\n\n(**************************************************************)\n(** ** Auxiliary definition used in identifier resolution *)\n\n(** [spec_identifier_resolution C x] returns the extended expression\n    which needs to be evaluated in order to perform the lookup\n    of name [x] in the execution context [C]. Typically, a\n    reduction rule that performs such a lookup would have a\n    premise of the form [red_expr S C (identifier_resolution C x) o1]. *)\n\nDefinition spec_identifier_resolution C x :=\n  let lex := execution_ctx_lexical_env C in\n  let strict := execution_ctx_strict C in\n  spec_lexical_env_get_identifier_ref lex x strict.\n\n\n(**************************************************************)\n(** ** Instantiation of arguments in function calls *)\n\nInductive arguments_from : list value -> list value -> Prop :=\n | arguments_from_nil : forall Vs,\n      arguments_from Vs nil\n | arguments_from_undef : forall Vs: list value,\n      arguments_from nil Vs ->\n      arguments_from nil (undef::Vs)\n | arguments_from_cons : forall Vs1 Vs2 v,\n      arguments_from Vs1 Vs2 ->\n      arguments_from (v::Vs1) (v::Vs2).\n\nInductive arguments_first_and_rest : list value -> (value * list value) -> Prop :=\n | arguments_f_a_r_from_nil  : arguments_first_and_rest nil (undef, nil)\n | arguments_f_a_r_from_cons : forall v lv, \n     arguments_first_and_rest (v :: lv) (v, lv).\n\nHint Constructors arguments_first_and_rest.\n\n(**************************************************************)\n(** ** Rules for delete_events. *)\n\n(** [search_proto_chain S l x] returns the location l' of the first object \n    in the prototype chain of l which contains property x. *)\n\nInductive search_proto_chain : state -> object_loc -> prop_name -> option object_loc -> Prop :=\n  | search_proto_chain_found : forall S l x,\n                                 object_has_property S l x ->\n                                 search_proto_chain S l x (Some l)\n  | search_proto_chain_not_found : forall S l x,\n                                     not (object_has_property S l x) ->\n                                     object_proto S l prim_null ->\n                                     search_proto_chain S l x None\n  | search_proto_chain_inductive : forall S l x v l' res,\n                                     not (object_has_property S l x) ->\n                                     object_proto S l (value_object l') ->\n                                     search_proto_chain S l' x res ->\n                                     search_proto_chain S l x res.\n\n\n(** [make_delete_event S l x ev] constructs a delete_event \"ev\" which\nrecords the deletion of the property (l,x) in the state S. *)\n\nInductive make_delete_event : state -> object_loc -> prop_name -> event -> Prop :=\n  | make_delete_event_intro : forall S l x res ev,\n                                search_proto_chain S l x res ->\n                                ev = delete_event l x res ->\n                                make_delete_event S l x ev.\n\n(**************************************************************)\n(** ** Auxiliary definitions for the semantics of for-in. *)\n\n(* LATER *)\n\n\n(**************************************************************)\n(** ** Implementation Defined Object *)\n\n(** As stated in Section 2 of the ECMAScript specification, an\n  implementation can provide additionnal properties not described in\n  the specification. **)\n\n(** As we are only describing the core of JavaScrip here, this\n  inductive shall be empty.  But one can found in the other branches\n  of this developpment some examples of non-empty instantiation of\n  this predicate. **)\n\nInductive implementation_prealloc : prealloc -> Prop :=\n  .\n\n\n(**************************************************************)\n(** Shorthand **)\n\nDefinition vret : state -> value -> specret value := ret (T:=value).\nDefinition dret : state -> full_descriptor -> specret full_descriptor := ret (T:=full_descriptor).\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/Lists.v",
    "content": "Require Export Basics.\nModule NatList.\nImport Playground1.\n\nInductive natprod : Type :=\n\tpair : nat -> nat -> natprod.\n\nDefinition fst (p : natprod) : nat :=\n\tmatch p with\n\t\t| pair x y => x\n\tend.\n\nDefinition snd (p : natprod) : nat :=\n\tmatch p with\n\t\t| pair x y => y\n\tend.\n\nNotation \"( x , y )\" := (pair x y).\n\nDefinition swap_pair (p : natprod) : natprod :=\n\tmatch p with\n\t\t\t| (x, y) => (y, x)\n\tend.\n\nTheorem surjective_pairing' : forall (n m : nat),\n\t(n, m) = (fst (n, m), snd (n, m)).\nProof.\n\treflexivity.  Qed.\n\nTheorem surjective_pairing : forall (p : natprod),\n\tp = (fst p, snd p).\nProof.\n\tintros p.\n\tdestruct p as (n, m).\n\tsimpl.\n\treflexivity.\n\tQed.\n\nTheorem snd_fst_is_swap : forall (p : natprod),\n\t(snd p, fst p) = swap_pair p.\nProof.\n\tintros p.\n\tdestruct p.\n\treflexivity.\n\tQed.\n\nTheorem fst_swap_is_snd : forall (p : natprod),\n\t fst (swap_pair p) = snd p.\nProof.\n\tintros p.\n\tdestruct p.\n\treflexivity.\n\tQed.\n\nInductive natlist : Type :=\n\t| nil : natlist\n\t| cons : nat -> natlist -> natlist.\n\nDefinition l_123 := cons (S O) (cons (S (S O)) (cons (S (S (S O))) nil)).\n\nNotation \"x :: l\" := (cons x l) (at level 60, right associativity).\nNotation \"[ ]\" := nil.\nNotation \"[]\" := nil.\nNotation \"[ x , .. , y ]\" := (cons x .. (cons y nil) ..).\n\nFixpoint repeat (n count : nat) : natlist :=\n\tmatch count with\n\t\t| O => nil\n\t\t| S count' => n :: (repeat n count')\n\tend.\n\nFixpoint length (l:natlist) : nat :=\n\tmatch l with\n\t\t| nil => O\n\t\t| h :: t => S (length t)\n\tend.\n\nFixpoint app (l1 l2 : natlist) : natlist :=\n\tmatch l1 with\n\t\t| nil => l2\n\t\t| h :: t => h :: (app t l2)\n\tend.\n\nNotation \"x ++ y\" := (app x y) (right associativity, at level 60).\n\n(*\nExample test_app1: [1,2,3] ++ [4,5] = [1,2,3,4,5].\nProof. reflexivity. Qed.\nExample test_app2: nil ++ [4,5] = [4,5].\nProof. reflexivity. Qed.\nExample test_app3: [1,2,3] ++ [] = [1,2,3].\nProof. reflexivity. Qed.\n*)\n\nDefinition head (l : natlist) : nat :=\n\tmatch l with\n\t\t| nil => O\n\t\t| h :: t => h\n\tend.\n\nDefinition tl (l : natlist) : natlist :=\n\tmatch l with\n\t\t| nil => nil\n\t\t| h :: t => t\n\tend.\n\n\t\t\t(*\nExample test_tl: tl [1,2,3] = [2,3].\nProof. reflexivity. Qed.\n*)\n\nFixpoint nonzeros (l:natlist) : natlist :=\n\tmatch l with\n\t\t| nil => nil\n\t\t| O :: r => nonzeros r\n\t\t| n :: r => n :: (nonzeros r)\n\tend.\n\nExample test_nonzeros: nonzeros [O,S O,O,S (S O), S (S (S O)),O,O] = [S O,S (S O), S (S (S O))].\nProof. reflexivity. Qed.\n\nFixpoint oddmembers (l:natlist) : natlist :=\n\tmatch l with\n\t\t| nil => nil\n\t\t| n :: r => match (oddb n) with\n\t\t\t\t\t\t\t\t\t\t| true => n :: (oddmembers r)\n\t\t\t\t\t\t\t\t\t\t| false => oddmembers r\n\t\t\t\t\t\t\t\tend\n\tend.\n\nExample test_oddmembers: oddmembers [O, S O, O, S (S O), S (S (S O)), O, O] = [S O, S (S (S O))].\nProof. reflexivity. Qed.\n\nFixpoint countoddmembers (l:natlist) : nat :=\n\t\tlength (oddmembers l).\n\nExample test_countoddmembers2: countoddmembers [O, S (S O), S (S (S (S O)))] = O.\nProof. reflexivity. Qed.\n\nExample test_countoddmembers3: countoddmembers [] = O.\nProof. reflexivity. Qed.\n\nFixpoint alternate (l1 l2 : natlist) : natlist :=\n\t\tmatch l1 with\n\t\t\t\t| nil => l2\n\t\t\t\t| a :: r1 => match l2 with\n\t\t\t\t\t\t\t\t\t\t\t| nil => l1\n\t\t\t\t\t\t\t\t\t\t\t| b :: r2 => a :: b :: (alternate r1 r2)\n\t\t\t\t\t\t\t\t\t\tend\n\t\tend.\n\nExample test_alternative1: alternate [S O, S (S O), S (S (S O))] [S (S (S (S O))), S (S (S (S (S O)))), S (S (S (S (S (S O)))))] =\n\t\t[S O, S (S (S (S O))), S (S O), S (S (S (S (S O)))), S (S (S O)), S (S (S (S (S (S O)))))].\nProof. reflexivity. Qed.\n\nDefinition bag := natlist.\n\nFixpoint count (v : nat) (s: bag) : nat :=\n\tmatch s with\n\t\t| nil => O\n\t\t| v' :: r => match (beq_nat v' v) with\n\t\t\t\t\t\t\t\t\t\t| true => S (count v r)\n\t\t\t\t\t\t\t\t\t\t| false => count v r\n\t\t\t\t\t\t\t\t end\n\tend.\n\nExample test_count1: count (S O) [S O, S (S O), S (S (S O)), S O, S (S (S (S O))), S O] = S (S (S O)).\nProof. reflexivity. Qed.\n\nDefinition sum : bag -> bag -> bag := app.\n\nExample test_sum1: count (S O) (sum [S O, S (S O), S (S (S O))] [S O, S (S (S (S O))), S O]) = S (S (S O)).\nProof. reflexivity. Qed.\n\nDefinition add (v:nat) (s:bag) : bag := v :: s.\n\nExample test_add1: count (S O) (add (S O) [S O, S (S (S (S O))), S O]) = S (S (S O)).\nProof. reflexivity. Qed.\n\nDefinition member (v:nat) (s:bag) : bool :=\n\tble_nat (S O) (count v s).\n\nExample test_member1: member (S O) [S O, S (S (S (S O))), S O] = true.\nProof. reflexivity. Qed.\n\nExample test_member2: member (S (S O)) [S O, S (S (S (S O))), S O] = false.\nProof. reflexivity. Qed.\n\nFixpoint remove_one (v:nat) (s:bag) : bag :=\n\tmatch s with\n\t\t| nil => nil\n\t\t| v' :: r => match (beq_nat v v') with\n\t\t\t\t\t\t\t\t\t| true => r\n\t\t\t\t\t\t\t\t\t| false => v' :: (remove_one v r)\n\t\t\t\t\t\t\t\t end\n\tend.\n\nExample test_remove_one1: count (S (S (S (S (S O)))))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(remove_one (S (S (S (S (S O)))))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[S (S O), S O, S (S (S (S (S O)))), S (S (S (S O))), S O]) = O.\nProof. reflexivity. Qed.\n\nFixpoint remove_all (v:nat) (s:bag) : bag :=\n\tmatch s with\n\t\t| nil => nil\n\t\t| v' :: r => match (beq_nat v v') with\n\t\t\t\t\t\t\t\t\t\t| true => remove_all v r\n\t\t\t\t\t\t\t\t\t\t| false => v' :: (remove_all v r)\n\t\t\t\t\t\t\t\t end\n\tend.\n\nExample test_remove_all1: count (S (S (S (S (S O)))))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(remove_all (S (S (S (S (S O)))))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[S (S O), S O, S (S (S (S (S O)))), S (S (S (S O))), S O]) = O.\nProof. reflexivity. Qed.\n\nFixpoint subset (s1:bag) (s2:bag) : bool :=\n\t\tmatch s1 with\n\t\t\t| nil => true\n\t\t\t| v :: r => andb (member v s2)\n\t\t\t\t\t\t\t\t\t\t\t (subset r (remove_one v s2))\n\t\tend.\n\nDefinition test_subset1: subset [S O, S (S O)] [S (S O), S O, S (S (S (S O))), S O] = true.\nProof. reflexivity. Qed.\nDefinition test_subset2: subset [S O, S (S O), S (S O)] [S (S O), S O, S (S (S (S O))), S O] = false.\nProof. reflexivity. Qed.\n\nTheorem bag_count_add : forall n t: nat, forall s : bag,\n\t\t\t\tcount n s = t -> count n (add n s) = S t.\nProof.\n\tintros n t s.\n\tintros H.\n\tinduction s.\n\tsimpl.\n\trewrite <- beq_nat_refl.\n\trewrite <- H.\n\treflexivity.\n\trewrite <- H.\n\tsimpl.\n\trewrite <- beq_nat_refl.\n\treflexivity.\nQed.\n\nTheorem nil_app : forall l:natlist,\n\t[] ++ l = l.\nProof.\n\treflexivity. Qed.\n\nTheorem tl_length_pred : forall l:natlist,\n\tpred (length l) = length (tl l).\nProof.\n\tintros l. destruct l as [| n l'].\n\tCase \"l = nil\".\n\t\treflexivity.\n\tCase \"l = cons n l'\".\n\t\treflexivity. Qed.\n\nTheorem app_ass:forall l1 l2 l3 : natlist,\n\t(l1 ++ l2) ++ l3 = l1 ++ (l2 ++ l3).\nProof.\n\tintros l1 l2 l3. induction l1 as [| n l1'].\n\tCase \"l1 = nil\".\n\t\treflexivity.\n\tCase \"l1 = cons n l1'\".\n\t\tsimpl. rewrite -> IHl1'. reflexivity. Qed.\n\nTheorem app_length: forall l1 l2 : natlist,\n\tlength (l1 ++ l2) = (length l1) + (length l2).\nProof.\n\tintros l1 l2. induction l1 as [| n l1'].\n\tCase \"l1 = nil\".\n\t\treflexivity.\n\tCase \"l1 = cons\".\n\t\tsimpl. rewrite -> IHl1'. reflexivity. Qed.\n\nFixpoint snoc (l:natlist) (v:nat) : natlist :=\n\tmatch l with\n\t\t| nil => [v]\n\t\t| h :: t => h :: (snoc t v)\n\tend.\n\nFixpoint rev (l:natlist) : natlist :=\n\tmatch l with\n\t\t| nil => nil\n\t\t| h :: t => snoc (rev t) h\n\tend.\n\nExample test_rev1: rev [S O, S (S O), S (S (S O))] = [S (S (S O)), S (S O), S O].\nProof. reflexivity. Qed.\n\nTheorem length_snoc : forall n : nat, forall l : natlist,\n\tlength (snoc l n) = S (length l).\nProof.\n\tintros n l. induction l as [| n' l'].\n\tCase \"l = nil\".\n\t\treflexivity.\n\tCase \"l = cons n' l'\".\n\t\tsimpl. rewrite -> IHl'. reflexivity. Qed.\n\nTheorem rev_length : forall l : natlist,\n\tlength (rev l) = length l.\nProof.\n\tintros l. induction l as [| n l'].\n\tCase \"l = nil\".\n\t\treflexivity.\n\tCase \"l = cons\".\n\t\tsimpl. rewrite -> length_snoc.\n\t\trewrite -> IHl'. reflexivity. Qed.\n\nTheorem app_nil_end : forall l :natlist,\n\tl ++ [] = l.\nProof.\n\tintros l.\n\tinduction l.\n\tCase \"l = nil\".\n\t\treflexivity.\n\tCase \"l = cons\".\n\t\tsimpl. rewrite -> IHl. reflexivity. Qed.\n\n\n\nTheorem rev_snoc : forall l: natlist, forall n : nat,\n\trev (snoc l n) = n :: (rev l).\nProof.\n\tintros l n.\n\tinduction l.\n\tCase \"l = nil\".\n\t\treflexivity.\n\tCase \"l = cons\".\n\t\tsimpl.\n\t\trewrite -> IHl.\n\t\treflexivity.\n\t\tQed.\n\nTheorem rev_involutive : forall l : natlist,\n\trev (rev l) = l.\nProof.\n\tintros l.\n\tinduction l.\n\tCase \"l = nil\".\n\t\treflexivity.\n\tCase \"l = cons\".\n\t\tsimpl.\n\t\trewrite -> rev_snoc.\n\t\trewrite -> IHl.\n\t\treflexivity.\n\t\tQed.\n\nTheorem app_ass4 : forall l1 l2 l3 l4 : natlist,\n\tl1 ++ (l2 ++ (l3 ++ l4)) = ((l1 ++ l2) ++ l3) ++ l4.\nProof.\n\tintros l1 l2 l3 l4.\n\trewrite -> app_ass.\n\trewrite -> app_ass.\n\treflexivity.\n\tQed.\n\nTheorem snoc_append : forall (l : natlist) (n : nat),\n\tsnoc l n = l ++ [n].\nProof.\n\tintros l n.\n\tinduction l.\n\tCase \"l = nil\".\n\t\treflexivity.\n\tCase \"l = cons\".\n\t\tsimpl.\n\t\trewrite -> IHl.\n\t\treflexivity.\n\t\tQed.\n\nTheorem nonzeros_length : forall l1 l2 : natlist,\n\tnonzeros (l1 ++ l2) = (nonzeros l1) ++ (nonzeros l2).\nProof.\n\tintros l1 l2.\n\tinduction l1.\n\tCase \"l1 = nil\".\n\t\treflexivity.\n\tCase \"l1 = cons\".\n\t\tsimpl.\n\t\trewrite -> IHl1.\n\t\tdestruct n.\n\t\treflexivity.\n\t\treflexivity.\n\t\tQed.\n\nTheorem distr_rev : forall l1 l2 : natlist,\n\trev (l1 ++ l2) = (rev l2) ++ (rev l1).\nProof.\n\tintros l1 l2.\n\tinduction l1.\n\tCase \"l1 = nil\".\n\t\tsimpl.\n\t\trewrite -> app_nil_end.\n\t\treflexivity.\n\tCase \"l1 = cons\".\n\t\tsimpl.\n\t\trewrite -> IHl1.\n\t\tsimpl.\n\t\trewrite -> snoc_append.\n\t\trewrite -> snoc_append.\n\t\trewrite -> app_ass.\n\t\treflexivity.\n\t\tQed.\n\nTheorem count_number_nonzero : forall (s : bag),\n\tble_nat O (count (S O) (S O :: s)) = true.\nProof.\n\tintros s.\n\tinduction s.\n\t\treflexivity.\n\t\treflexivity.\n\t\tQed.\n\nTheorem ble_n_Sn : forall n,\n\tble_nat n (S n) = true.\nProof.\n\tintros n. induction n as [| n'].\n\tCase \"0\".\n\t\tsimpl. reflexivity.\n\tCase \"S n'\".\n\t\tsimpl. rewrite -> IHn'. reflexivity. Qed.\n\nTheorem remove_decreases_count: forall (s : bag),\n\tble_nat (count O (remove_one O s)) (count O s) = true.\nProof.\n\tintros s.\n\tinduction s.\n\tCase \"s = nil\".\n\t\treflexivity.\n\tCase \"s = cons\".\n\t\tsimpl.\n\t\tinduction n.\n\t\tSCase \"n = O\".\n\t\t\tsimpl.  rewrite -> ble_n_Sn.\n\t\t\treflexivity.\n\t\tSCase \"n = S n'\".\n\t\t\tsimpl.\n\t\t\trewrite -> IHs.\n\t\t\treflexivity.\n\t\t\tQed.\n\nInductive natoption : Type :=\n\t| Some : nat -> natoption\n\t| None : natoption.\n\nFixpoint index (n:nat) (l:natlist) : natoption :=\n\tmatch l with\n\t\t| nil => None\n\t\t| a :: l' => if beq_nat n O then Some a else index (pred n) l'\n  end.\n\nDefinition option_elim (o : natoption) (d : nat) : nat :=\n\tmatch o with\n\t\t| Some n' => n'\n\t\t| None => d\n\tend.\n\nDefinition hd_opt (l : natlist) : natoption :=\n\tmatch l with\n\t\t| nil => None\n\t\t| v :: r => Some v\n\tend.\n\nExample test_hd_opt1 : hd_opt [] = None.\nProof. reflexivity. Qed.\nExample test_hd_opt2 : hd_opt [S O] = Some (S O).\nProof. reflexivity. Qed.\n\nTheorem option_elim_hd : forall l:natlist,\n\thead l = option_elim (hd_opt l) O.\nProof.\n\tintros l.\n\tdestruct l.\n\treflexivity.\n\treflexivity.\n\tQed.\n\nFixpoint beq_natlist (l1 l2 : natlist) : bool :=\n\tmatch l1 with\n\t\t| nil => match l2 with\n\t\t\t\t\t\t\t| nil => true\n\t\t\t\t\t\t\t| _ => false\n\t\t\t\t\t\t end\n\t\t| v1 :: r1 => match l2 with\n\t\t\t\t\t\t\t\t\t | nil => false\n\t\t\t\t\t\t\t\t\t | v2 :: r2 => if beq_nat v1 v2 then beq_natlist r1 r2\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t else false\n\t\t\t\t\t\t\t\t\tend\n\tend.\n\nExample test_beq_natlist1 : (beq_natlist nil nil = true).\nProof. reflexivity. Qed.\nExample test_beq_natlist2 : (beq_natlist [S O, S (S O), S (S (S O))]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t [S O, S (S O), S (S (S O))] = true).\nProof. reflexivity. Qed.\n\nTheorem beq_natlist_refl : forall l:natlist,\n\tbeq_natlist l l = true.\nProof.\n\tintros l.\n\tinduction l.\n\tCase \"l = nil\".\n\t\treflexivity.\n\tCase \"l = cons\".\n\t\tsimpl.\n\t\trewrite <- beq_nat_refl.\n\t\trewrite -> IHl.\n\t\treflexivity.\n\tQed.\n\nTheorem silly1 : forall (n m o p : nat),\n\tn = m -> [n, o] = [n, p] -> [n, o] = [m, p].\nProof.\n\tintros n m o p eq1 eq2.\n\trewrite <- eq1.\n\tapply eq2. Qed.\n\nTheorem silly2a : forall (n m : nat),\n\t(n,n) = (m,m) ->\n\t\t(forall (q r : nat), (q, q) = (r, r) -> [q] = [r]) ->\n\t\t\t[n] = [m].\nProof.\n\tintros n m eq1 eq2.\n\tapply eq2.\n\tapply eq1.\n\tQed.\n\nTheorem silly_ex :\n\t(forall n, evenb n = true -> oddb (S n) = true) ->\n\tevenb (S (S (S O))) = true ->\n\toddb (S (S (S (S O)))) = true.\nProof.\n\tintros eq1 eq2.\n\tapply eq1.\n\tapply eq2.\n\tQed.\n\nTheorem silly3 : forall (n : nat),\n\ttrue = beq_nat n (S (S (S (S (S O))))) ->\n\tbeq_nat (S (S n)) (S (S (S (S (S (S (S O))))))) = true.\nProof.\n\tintros n H.\n\tsymmetry.\n\tapply H.\n\tQed.\n\nTheorem rev_exercise : forall (l l' : natlist),\n\tl = rev l' -> l' = rev l.\nProof.\n\tintros l l' H.\n\trewrite -> H.\n\trewrite -> rev_involutive.\n\treflexivity.\n\tQed.\n\nTheorem beq_nat_sym : forall (n m:nat), forall (b: bool),\n\tbeq_nat n m = b -> beq_nat m n = b.\nProof.\n\tintros n.\n\tinduction n as [| n'].\n\tCase \"n = O\".\n\t\tintros m b eq1.\n\t\tinduction m.\n\t\tSCase \"m = 0\".\n\t\t\tapply eq1.\n\t\tSCase \"m = S m'\".\n\t\t\tapply eq1.\n\tCase \"n = S n'\".\n\t\tinduction m.\n\t\tSCase \"m = 0\".\n\t\t\tintros b eq1.\n\t\t\tapply eq1.\n\t\tSCase \"m = S m'\".\n\t\t\tintros b eq1.\n\t\t\tapply IHn'.\n\t\t\tapply eq1.\n\t\tQed.\n\nTheorem app_ass' : forall l1 l2 l3 : natlist,\n\t(l1 ++ l2) ++ l3 = l1 ++ (l2 ++ l3).\nProof.\n\tintros l1. induction l1 as [ | n l1'].\n\treflexivity.\n\tsimpl.\n\tintros l2 l3.\n\trewrite -> IHl1'.\n\treflexivity.\n\tQed.\n\nEnd NatList.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/Main.v",
    "content": "Require Import FunctionNinjas.All.\nRequire Import ListString.All.\nRequire Import Computation.\n\nImport C.Notations.\n\nDefinition error (message : LString.t) : C.t :=\n  do_call! Command.ShowError message in\n  ret.\n\nDefinition main : C.t :=\n  call! card_is_valid := Command.AskCard in\n  if card_is_valid then\n    call! pin := Command.AskPIN in\n    match pin with\n    | None => error @@ LString.s \"No PIN given.\"\n    | Some pin =>\n      call! pin_is_valid := Command.CheckPIN pin in\n      if pin_is_valid then\n        call! ask_amount := Command.AskAmount in\n        match ask_amount with\n        | None => error @@ LString.s \"No amount given.\"\n        | Some amount =>\n          call! amount_is_valid := Command.CheckAmount amount in\n          if amount_is_valid then\n            call! card_is_given := Command.GiveCard in\n            if card_is_given then\n              call! amount_is_given := Command.GiveAmount amount in\n              if amount_is_given then\n                ret\n              else\n                error @@ LString.s \"Cannot give you the amount. Please contact your bank.\"\n            else\n              error @@ LString.s \"Cannot give you back the card. Please contact your bank.\"\n          else\n            error @@ LString.s \"Invalid amount.\"\n        end\n      else\n        error @@ LString.s \"Invalid PIN.\"\n    end\n  else\n    error @@ LString.s \"Invalid card.\".\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/Poly.v",
    "content": "Require Export Lists.\nRequire Export Basics.\n\nImport Playground1.\n\nInductive list (X : Type) : Type :=\n\t| nil : list X\n\t| cons : X -> list X -> list X.\n\nFixpoint length (X:Type) (l:list X) : nat :=\n\tmatch l with\n\t\t| nil => O\n\t\t| cons h t => S (length X t)\n\tend.\n\nFixpoint app (X : Type) (l1 l2 : list X)\n\t\t\t\t\t\t\t\t\t\t: (list X) :=\n\tmatch l1 with\n\t\t| nil => l2\n\t\t| cons h t => cons X h (app X t l2)\n\tend.\n\nFixpoint snoc (X:Type) (l:list X) (v:X) : (list X) :=\n\tmatch l with\n\t\t| nil => cons X v (nil X)\n\t\t| cons h t => cons X h (snoc X t v)\n\tend.\n\nFixpoint rev (X:Type) (l:list X) : list X :=\n\tmatch l with\n\t\t| nil => nil X\n\t\t| cons h t => snoc X (rev X t) h\n\tend.\n\n\nImplicit Arguments nil [[X]].\nImplicit Arguments cons [[X]].\nImplicit Arguments length [[X]].\nImplicit Arguments app [[X]].\nImplicit Arguments rev [[X]].\nImplicit Arguments snoc [[X]].\n\nDefinition list123 := cons 1 (cons 2 (cons 3 (nil))).\n\nNotation \"x :: y\" := (cons x y) (at level 60, right associativity).\nNotation \"[]\" := nil.\nNotation \"[ x , .. , y ]\" := (cons x .. (cons y []) ..).\nNotation \"x ++ y\" := (app x y) (at level 60, right associativity).\n\nFixpoint repeat (X : Type) (n : X) (count : nat) : list X :=\n\tmatch count with\n\t\t| O => nil\n\t\t| S count' => n :: (repeat _ n count')\n\tend.\n\nExample test_repeat1:\n\trepeat bool true (S (S O)) = [true, true].\nProof. reflexivity. Qed.\n\nTheorem nil_app : forall X:Type, forall l:list X,\n\tapp [] l = l.\nProof.\n\treflexivity.\n\tQed.\n\nTheorem rev_snoc : forall X : Type,\n\t\t\t\t\t\t\t\t\t forall v : X,\n\t\t\t\t\t\t\t\t\t forall s : list X,\n\trev (snoc s v) = v :: (rev s).\nProof.\n\tintros X v s.\n\tinduction s.\n\t\treflexivity.\n\t\tsimpl.\n\t\trewrite -> IHs.\n\t\treflexivity.\n\t\tQed.\n\nTheorem snoc_with_append : forall X : Type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t forall l1 l2 : list X,\n\t\t\t\t\t\t\t\t\t\t\t\t\t forall v : X,\n\tsnoc (l1 ++ l2) v = l1 ++ (snoc l2 v).\nProof.\n\tintros X l1 l2 v.\n\tinduction l1.\n\t\treflexivity.\n\t\tsimpl.\n\t\trewrite -> IHl1.\n\t\treflexivity.\n\t\tQed.\n\nInductive prod (X Y : Type) : Type :=\n\tpair : X -> Y -> prod X Y.\n\nImplicit Arguments pair [X Y].\n\nNotation \"( x , y )\" := (pair x y).\nNotation \"X * Y\" := (prod X Y) : type_scope.\n\nDefinition fst (X Y : Type) (p : X * Y) : X :=\n\tmatch p with (x,y) => x end.\nDefinition snd (X Y : Type) (p : X * Y) : Y :=\n\tmatch p with (x,y) => y end.\n\nFixpoint combine (X Y : Type) (lx : list X) (ly : list Y)\n\t\t\t: list (X * Y) :=\n\tmatch lx, ly with\n\t\t| [], _ => []\n\t\t| _,[] => []\n\t\t| x::tx, y::ty => (x,y) :: (combine _ _ tx ty)\n\tend.\n\nImplicit Arguments combine [X Y].\n\nFixpoint split {X Y: Type} (s : list (X * Y)) : (list X)*(list Y) :=\n\tmatch s with\n\t\t| nil => (nil, nil)\n\t\t| (x,y) :: tp => match split tp with\n\t\t\t\t\t\t\t\t\t\t\t| (lx, ly) => (x :: lx, y :: ly)\n\t\t\t\t\t\t\t\t\t\t end\n\tend.\n\nInductive option (X : Type) : Type :=\n\t| Some : X -> option X\n\t| None : option X.\n\nImplicit Arguments Some [X].\nImplicit Arguments None [X].\n\nFixpoint index (X : Type) (n : nat)\n\t\t\t\t\t\t\t (l : list X) : option X :=\n\tmatch n with\n\t\t| O => match l with\n\t\t\t\t\t\t\t\t| nil => None\n\t\t\t\t\t\t\t\t| x :: xs => Some x\n\t\t\t\t\t end\n\t\t| S n' => match l with\n\t\t\t\t\t\t\t\t\t| nil => None\n\t\t\t\t\t\t\t\t\t| x :: xs => index X n' xs\n\t\t\t\t\t\t\tend\n\tend.\n\nDefinition hd_opt (X : Type) (l : list X) : option X :=\n\t\tmatch l with\n\t\t\t| nil => None\n\t\t\t| x :: xs => Some x\n\t\tend.\n\nImplicit Arguments hd_opt [X].\n\nExample test_hd_opt1 : hd_opt [S O, S (S O)] = Some (S O).\nProof. reflexivity. Qed.\nExample test_hd_opt2 : hd_opt [[S O], [S (S O)]] = Some [S O].\nProof. reflexivity. Qed.\n\nDefinition plus3 := plus (S (S (S O))).\n\nDefinition prod_curry {X Y Z : Type}\n\t\t(f : X * Y -> Z) (x : X) (y : Y) : Z := f (x,y).\n\nDefinition prod_uncurry {X Y Z : Type}\n\t(f : X -> Y -> Z) (p : X * Y) : Z :=\n\tf (fst X Y p) (snd X Y p).\n\nTheorem uncurry_uncurry : forall (X Y Z : Type) (f : X -> Y -> Z) x y,\n\t\t\t\tprod_curry (prod_uncurry f) x y = f x y.\nProof.\n\treflexivity.\nQed.\n\nTheorem curry_uncurry : forall (X Y Z : Type) (f : (X * Y) -> Z)\n\t(p : X * Y),\n\t\tprod_uncurry (prod_curry f) p = f p.\nProof.\n\tdestruct p.\n\treflexivity.\n\tQed.\n\nFixpoint filter (X : Type) (test : X -> bool) (l:list X)\n\t\t\t\t: (list X) :=\n\t\tmatch l with\n\t\t\t| [] => []\n\t\t  | h :: t => if test h then h :: (filter _ test t)\n\t\t\t\t\t\t\t\t\telse filter _ test t\n\t\tend.\n\nDefinition countoddmembers' (l:list nat) : nat :=\n\tlength (filter _ oddb l).\n\nDefinition partition (X : Type) (test : X -> bool) (l : list X)\n\t\t\t\t\t\t\t: list X * list X :=\n\t(filter _ test l, filter _ (fun el => negb (test el)) l).\n\nExample test_partition1: partition _ oddb [S O, S (S O), S (S (S O)), S (S (S (S O))), S (S (S (S (S O))))] = ([S O, S (S (S O)), S (S (S (S (S O))))], [S (S O), S (S (S (S O)))]).\nProof. reflexivity. Qed.\n\nFixpoint map {X Y : Type} (f : X -> Y) (l : list X) : (list Y ) :=\n\t\tmatch l with\n\t\t\t| [] => []\n\t\t\t| h :: t => (f h) :: (map f t)\n\t\tend.\n\nExample test_map1: map (plus (S (S (S O)))) [S (S O), O, S (S O)] = [S (S (S (S (S O)))), S (S (S O)), S (S (S (S (S O))))].\nProof. reflexivity. Qed.\n\n Theorem map_rev_1 : forall (X Y: Type) (f: X -> Y) (l : list X) (x : X),\n \t\tmap f (snoc l x) = snoc (map f l) (f x).\nProof.\n\tintros X Y f l x.\n\tinduction l.\n\treflexivity.\n\tsimpl.\n\trewrite -> IHl.\n\treflexivity.\n\tQed.\n\nTheorem map_rev : forall (X Y : Type) (f : X -> Y) (l : list X),\n\t\t\t\tmap f (rev l) = rev (map f l).\nProof.\n\tintros X Y f l.\n\tinduction l.\n\t\treflexivity.\n\t\tsimpl.\n\t\trewrite <- IHl.\n\t\trewrite -> map_rev_1.\n\t\treflexivity.\n\t\tQed.\n\nFixpoint flat_map {X Y : Type} (f : X -> list Y) (l : list X)\n\t\t\t: (list Y) :=\n\tmatch l with\n\t\t| [] => []\n\t\t| x :: xs => (f x) ++ (flat_map f xs)\n\tend.\n\nDefinition map_option {X Y : Type} (f : X -> Y) (xo : option X)\n\t\t: option Y :=\n\tmatch xo with\n\t\t| None => None\n\t\t| Some x => Some (f x)\n\tend.\n\nFixpoint fold {X Y: Type} (f: X -> Y -> Y) (l:list X) (b:Y) : Y :=\n\tmatch l with\n\t\t| nil => b\n\t\t| h :: t => f h (fold f t b)\n\tend.\n\nExample fold_example : fold andb [true, true, false, true] true = false.\nProof. reflexivity. Qed.\n\nDefinition constfun {X : Type} (x: X) : nat -> X :=\n\tfun (k:nat) => x.\n\nDefinition ftrue := constfun true.\nExample constfun_example : ftrue O = true.\nProof. reflexivity. Qed.\n\nDefinition override {X : Type} (f: nat -> X) (k:nat) (x:X) : nat->X :=\n\tfun (k':nat) => if beq_nat k k' then x else f k'.\n\nDefinition fmostlytrue := override (override ftrue (S O) false) (S (S (S O))) false.\n\nExample override_example1 : fmostlytrue O = true.\nProof. reflexivity. Qed.\nExample override_example2 : fmostlytrue (S O) = false.\nProof. reflexivity. Qed.\nExample override_example3 : fmostlytrue (S (S O)) = true.\nProof. reflexivity. Qed.\nExample override_example4 : fmostlytrue (S (S (S O))) = false.\nProof. reflexivity. Qed.\n\nTheorem override_example : forall (b: bool),\n\t(override (constfun b) (S (S (S O))) true) (S (S O)) = b.\nProof.\n\treflexivity.\nQed.\n\nTheorem unfold_example_bad : forall m n,\n\t(S (S (S O))) + n = m ->\n\tplus3 n = m.\nProof.\n\tintros m n H.\n\tunfold plus3.\n\trewrite -> H.\n\treflexivity.\n\tQed.\n\nTheorem override_eq : forall {X : Type} x k (f : nat -> X),\n\t(override f k x) k = x.\nProof.\n\tintros X x k f.\n\tunfold override.\n\trewrite <- beq_nat_refl.\n\treflexivity.\n\tQed.\n\nTheorem override_neq : forall {X : Type} x1 x2 k1 k2 (f : nat->X),\n\tf k1 = x1 ->\n\t\tbeq_nat k2 k1 = false ->\n\t\t\t(override f k2 x2) k1 = x1.\nProof.\n\tintros X x1 x2 k1 k2 f eq1 eq2.\n\tunfold override.\n\trewrite -> eq2.\n\trewrite -> eq1.\n\treflexivity.\nQed.\n\nTheorem eq_add_S : forall (n m : nat),\n\tS n = S m ->\n\t\tn = m.\nProof.\n\tintros n m eq.\n\tinversion eq.\n\treflexivity.\nQed.\n\nTheorem silly4 : forall (n m : nat),\n\t[n] = [m] ->\n\t\tn = m.\nProof.\n\tintros n o eq.\n\tinversion eq.\n\treflexivity.\nQed.\n\nTheorem silly5 : forall (n m o : nat),\n\t[n,m] = [o,o] ->\n\t\t[n] = [m].\nProof.\n\tintros n m o eq.\n\tinversion eq.\n\treflexivity.\nQed.\n\nTheorem sillyex1 : forall (X : Type) (x y z : X) (l j : list X),\n\tx :: y :: l = z :: j ->\n\t\ty :: l = x :: j ->\n\t\t\tx = y.\nProof.\n\tintros X x y z l j.\n\tintros eq1 eq2.\n\tinversion eq1.\n\tinversion eq2.\n\tsymmetry.\n\trewrite -> H0.\n\treflexivity.\nQed.\n\nTheorem silly6 : forall (n : nat),\n\tS n = O ->\n\t\t(S (S O)) + (S (S O)) = (S (S (S (S (S O))))).\nProof.\n\tintros n contra.\n\tinversion contra.\nQed.\n\nTheorem silly7 : forall (n m : nat),\n\t\t\t\tfalse = true ->\n\t\t\t\t\t[n] = [m].\nProof.\n\tintros n m contra.\n\tinversion contra.\nQed.\n\nTheorem sillyex2 : forall (X : Type) (x y z : X) (l j : list X),\n\tx :: y :: l = [] ->\n\t\ty :: l = z :: j ->\n\t\t\tx = z.\nProof.\n\tintros X x y z l j contra.\n\tinversion contra.\n\tQed.\n\nTheorem beq_nat_eq : forall n m,\n\ttrue = beq_nat n m -> n = m.\nProof.\n\tintros n. induction n as [| n'].\n\tCase \"n = O\".\n\t\tintros m. destruct m as [| m'].\n\t\tSCase \"m = 0\". reflexivity.\n\t\tSCase \"m = S m'\". simpl. intros contra. inversion contra.\n\tCase \"n = S n'\".\n\t\tintros m. destruct m as [| m'].\n\t\tSCase \"m = 0\". simpl. intros contra. inversion contra.\n\t\tSCase \"m = S m'\". simpl. intros H.\n\t\t\tassert(n' = m') as Hl.\n\t\t\t\tSSCase \"Proof of assertion\". apply IHn'. apply H.\n\t\t\trewrite -> Hl. reflexivity.\nQed.\n\nTheorem beq_nat_eq' : forall m n,\n\t\t\t\tbeq_nat n m = true -> n = m.\nProof.\n\tintros m. induction m as [| m'].\n\tCase \"m = O\".\n\t\tdestruct n.\n\t\tSCase \"n = O\".\n\t\t\treflexivity.\n\t\tSCase \"n = S n'\".\n\t\t\tsimpl. intros contra. inversion contra.\n\tCase \"m = S m'\".\n\t\tsimpl.\n\t\tdestruct n.\n\t\tSCase \"n = O\".\n\t\t\tsimpl. intros contra. inversion contra.\n\t\tSCase \"n = S n'\".\n\t\t\tsimpl. intros H.\n\t\t\tassert (n = m') as Hl.\n\t\t\t\tapply IHm'.\n\t\t\t\tapply H.\n\t\t\trewrite -> Hl.\n\t\t\treflexivity.\nQed.\n\nTheorem length_snoc' : forall (X : Type) (v : X)\n(l : list X) (n : nat),\n\tlength l = n ->\n\tlength (snoc l v) = S n.\n\tProof.\n\tintros X v l. induction l as [| v' l'].\n\tCase \"l = []\". intros n eq. rewrite <- eq. reflexivity.\n\tCase \"l = v' :: l'\". intros n eq. simpl. destruct n as [| n'].\n\tSCase \"n = 0\". inversion eq.\n\tSCase \"n = S n'\".\n\tassert (length (snoc l' v) = S n').\n\tSSCase \"Proof of assertion\". apply IHl'.\n\tinversion eq. reflexivity.\n\trewrite -> H. reflexivity.\n\tQed.\n\n\tTheorem beq_nat_O_l : forall n,\n\ttrue = beq_nat O n -> O = n.\n\tProof.\n\tintros n. destruct n.\n\treflexivity.\n\tsimpl.\n\tintros contra.\n\tinversion contra.\n\tQed.\n\nTheorem beq_nat_O_r : forall n,\n\ttrue = beq_nat n O -> O = n.\nProof.\n\tintros n.\n\tinduction n.\n\tCase \"n = O\".\n\t\treflexivity.\n\tCase \"n = S n'\".\n\t\tsimpl.\n\t\tintros contra.\n\t\tinversion contra.\n\tQed.\n\nTheorem double_injective : forall n m,\n\tdouble n = double m ->\n\t\tn = m.\nProof.\n\tintros n. induction n as [| n'].\n\tCase \"n = O\".\n\t\tsimpl. intros m eq.\n\t\tdestruct m as [|m'].\n\t\tSCase \"m = O\". reflexivity.\n\t\tSCase \"m = S m'\". inversion eq.\n\tCase \"n = S n'\". intros m eq. destruct m as [| m'].\n\t\tSCase \"m = O\". inversion eq.\n\t\tSCase \"m = S m'\".\n\t\t\tassert(n' = m') as H.\n\t\t\t\tSSCase \"Proof of assertion\". apply IHn'. inversion eq. reflexivity.\n\t\t\trewrite -> H. reflexivity.\nQed.\n\nTheorem silly3' : forall (n : nat),\n\t(beq_nat n (S (S (S (S (S O))))) = true ->\n\t \tbeq_nat (S (S n)) (S (S (S (S (S (S (S O))))))) = true) ->\n\t\ttrue = beq_nat n (S (S (S (S (S O))))) ->\n\t\t\ttrue = beq_nat (S (S n)) (S (S (S (S (S (S (S O))))))).\nProof.\n\tintros n eq H.\n\tsymmetry in H.\n\tapply eq in H.\n\tsymmetry in H.\n\tapply H.\nQed.\n\nTheorem plus_n_n_injective : forall n m,\n\t\t\t\t\tn + n = m + m ->\n\t\t\t\t\t\tn = m.\nProof.\n\tintros n. induction n as [| n'].\n\tCase \"n = O\".\n\t\tsimpl. intros m.\n\t\tdestruct m.\n\t\t\tSCase \"m = O\".\n\t\t\treflexivity.\n\t\t\tSCase \"m = S m'\".\n\t\t\tsimpl.\n\t\t\tintros contra.\n\t\t\tinversion contra.\n\tCase \"n = S n\".\n\t\tintros m.\n\t\tdestruct m.\n\t\t\tSCase \"m = O\".\n\t\t\tintros contra.\n\t\t\tinversion contra.\n\t\t\tSCase \"m = S m'\".\n\t\t\tintros eq.\n\t\t\tinversion eq.\n\t\t\trewrite <- plus_n_Sm in H0.\n\t\t\trewrite <- plus_n_Sm in H0.\n\t\t\tinversion H0.\n\t\t\tapply IHn' in H1.\n\t\t\trewrite -> H1.\n\t\t\treflexivity.\n\tQed.\n\nTheorem override_shadow : forall {X : Type} x1 x2 k1 k2 (f : nat -> X),\n\t(override (override f k1 x2) k1 x1) k2 = (override f k1 x1) k2.\nProof.\n\tintros X x1 x2 k1 k2 f.\n\tunfold override.\n\tdestruct (beq_nat k1 k2).\n\treflexivity.\n\treflexivity.\n\tQed.\n\nTheorem combine_split : forall (X : Type) (Y : Type) (l : list (X * Y)) (l1: list X) (l2: list Y),\n\t\t\t\tsplit l = (l1, l2) -> combine l1 l2 = l.\nProof.\n\tintros X Y l.\n\tinduction l as [| x y].\n\tCase \"l = nil\".\n\t\tintros l1 l2.\n\t\tintros eq.\n\t\tsimpl.\n\t\tsimpl in eq.\n\t\tinversion eq.\n\t\treflexivity.\n\tCase \"l = ::\".\n\t\tintros l1 l2.\n\t\tsimpl.\n\t\tdestruct x.\n\t\tdestruct (split y).\n\t\tsimpl.\n\t\tdestruct l1.\n\t\tSCase \"l1 = []\".\n\t\t\tsimpl.\n\t\t\tinduction l2.\n\t\t\tSSCase \"l2 = []\".\n\t\t\t\tintros contra.\n\t\t\t\tinversion contra.\n\t\t\tSSCase \"l2 = ::\".\n\t\t\t\tintros contra.\n\t\t\t\tinversion contra.\n\t\tSCase \"l1 = ::\".\n\t\t\tinduction l2.\n\t\t\tSSCase \"l2 = []\".\n\t\t\t\tsimpl.\n\t\t\t\tintros contra.\n\t\t\t\tinversion contra.\n\t\t\tSSCase \"l2 = ::\".\n\t\t\t\tsimpl.\n\t\t\t\tintros eq.\n\t\t\t\tinversion eq.\n\t\t\t\tsimpl.\n\t\t\t\trewrite IHy.\n\t\t\t\treflexivity.\n\t\t\t\tsimpl.\n\t\t\t\trewrite H1.\n\t\t\t\trewrite H3.\n\t\t\t\treflexivity.\nQed.\n\nTheorem split_combine : forall (X : Type) (Y : Type) (l1: list X) (l2: list Y),\n\t\t\t\tlength l1 = length l2 -> split (combine l1 l2) = (l1, l2).\nProof.\nintros X Y.\nintros l1.\ninduction l1.\nsimpl.\nintros l2.\ninduction l2.\nreflexivity.\n\nintros contra.\ninversion contra.\n\ndestruct l2.\nsimpl.\nintros contra.\ninversion contra.\n\nsimpl.\nintros eq.\ninversion eq.\napply IHl1 in H0.\nrewrite H0.\nreflexivity.\nQed.\n\nDefinition sillyfun1 (n : nat) : bool :=\n\t if beq_nat n (S (S (S O))) then true\n\t else if beq_nat n (S (S (S (S (S O))))) then true\n\t\t\t\telse false.\n\nTheorem beq_equal : forall (a b : nat),\n\t\tbeq_nat a b = true ->\n\t\t\ta = b.\nProof.\nintros a.\ninduction a.\ndestruct b.\nreflexivity.\n\nintros contra.\ninversion contra.\n\ndestruct b.\nintros contra.\ninversion contra.\n\nsimpl.\nintros eq.\napply IHa in eq.\nrewrite eq.\nreflexivity.\nQed.\n\nTheorem override_same : forall {X : Type} x1 k1 k2 (f : nat->X),\n\tf k1 = x1 ->\n\t\t(override f k1 x1) k2 = f k2.\nProof.\n\tintros X x1 k1 k2 f eq.\n\tunfold override.\n\tremember (beq_nat k1 k2) as a.\n\tdestruct a.\n\trewrite <- eq.\n\tsymmetry in Heqa.\n\tapply beq_equal in Heqa.\n\trewrite -> Heqa.\n\treflexivity.\n\treflexivity.\n\tQed.\n\n\nTheorem filter_exercise : forall (X : Type) (test : X -> bool)\n\t(x : X) (l lf : list X),\n\tfilter _ test l = x :: lf ->\n\t\ttest x = true.\nProof.\nintros X.\nintros test.\nintros x.\ninduction l.\nsimpl.\nintros lf.\nintros contra.\ninversion contra.\n\nsimpl.\nremember (test x0) as a.\ndestruct a.\nsimpl.\nintros lf.\nintros eq.\nrewrite Heqa.\ninversion eq.\nreflexivity.\n\nintros lf.\nintros eq.\napply IHl in eq.\nrewrite eq.\nreflexivity.\nQed.\n\nTheorem trans_eq : forall {X:Type} (n m o : X),\n\t\t\t\tn = m -> m = o -> n = o.\nProof.\n\tintros X n m o eq1 eq2. rewrite -> eq1. rewrite -> eq2.\n\treflexivity.\nQed.\n\nExample trans_eq_example' : forall (a b c d e f : nat),\n\t\t\t\t[a,b] = [c,d] ->\n\t\t\t\t[c,d] = [e,f] ->\n\t\t\t\t[a,b] = [e,f].\nProof.\n\tintros a b c d e f eq1 eq2.\n\tapply trans_eq with (m := [c,d]). apply eq1. apply eq2.\n\tQed.\n\nTheorem trans_eq_exercise : forall (n m o p : nat),\n\t\tm = (minustwo o) ->\n\t\t(n + p) = m ->\n\t\t(n + p) = (minustwo o).\nProof.\nintros n m o p.\nintros eq1 eq2.\nrewrite eq2.\nrewrite <- eq1.\nreflexivity.\nQed.\n\nTheorem beq_nat_trans : forall n m p,\n\t\t\t\ttrue = beq_nat n m ->\n\t\t\t\ttrue = beq_nat m p ->\n\t\t\t\ttrue = beq_nat n p.\nProof.\nintros n m p.\nintros eq1 eq2.\nsymmetry  in eq1.\nsymmetry  in eq2.\napply beq_equal in eq1.\napply beq_equal in eq2.\nrewrite eq1.\nrewrite <- eq2.\napply beq_nat_refl.\nQed.\n\nTheorem override_permute : forall {X:Type} x1 x2 k1 k2 k3 (f : nat->X),\n\tfalse = beq_nat k2 k1 ->\n\t(override (override f k2 x2) k1 x1) k3 = (override (override f k1 x1) k2 x2) k3.\nProof.\nintros X x1 x2 k1 k2 k3 f.\nsimpl.\nunfold override.\nremember (beq_nat k1 k3).\nremember (beq_nat k2 k3).\ndestruct b.\ndestruct b0.\nsymmetry  in Heqb.\nsymmetry  in Heqb0.\napply beq_equal in Heqb.\napply beq_equal in Heqb0.\nrewrite <- Heqb in Heqb0.\nassert (k2 = k1 -> true = beq_nat k2 k1).\ndestruct k2.\ndestruct k1.\nreflexivity.\n\nintros contra.\ninversion contra.\n\ndestruct k1.\nintros contra.\ninversion contra.\n\nsimpl.\nintros eq.\ninversion eq.\nsymmetry .\nsymmetry .\napply beq_nat_refl.\n\napply H in Heqb0.\nrewrite <- Heqb0.\nintros contra.\ninversion contra.\n\nintros eq.\nreflexivity.\n\ndestruct b0.\nintros eq.\nreflexivity.\n\nintros eq.\nreflexivity.\n\nQed.\n\nDefinition fold_length {X : Type} (l : list X) : nat :=\n\tfold (fun _ n => S n) l O.\n\nExample test_fold_length1 : fold_length [S (S (S (S O))), S (S (S (S (S (S (S O)))))), O] = S (S (S O)).\nProof. reflexivity. Qed.\n\nTheorem fold_length_correct : forall X (l :list X),\n\tfold_length l = length l.\nProof.\n\tintros X l.\n\tunfold fold_length.\n\tinduction l.\n\tCase \"l = O\".\n\t\treflexivity.\n\tCase \"l = ::\".\n\t\tsimpl.\n\t\trewrite IHl.\n\t\treflexivity.\n\tQed.\n\nDefinition fold_map {X Y: Type} (f : X -> Y) (l : list X) : list Y :=\n\tfold (fun x total => (f x) :: total) l [].\n\nTheorem fold_map_correct : forall (X Y: Type) (f : X -> Y) (l : list X),\n\tfold_map f l = map f l.\nProof.\n\tintros X Y f l.\n\tunfold fold_map.\n\tinduction l.\n\treflexivity.\n\t  \n\tsimpl.\n\trewrite IHl.\n\treflexivity.\n\tQed.\n\nFixpoint forallb {X : Type} (f : X -> bool) (l : list X) :=\n\tmatch l with\n\t\t| nil => true\n\t\t| x :: xs => andb (f x) (forallb f xs)\n\tend.\n\nFixpoint existsb {X : Type} (f : X -> bool) (l : list X) :=\n\tmatch l with\n\t\t| nil => false\n\t\t| x :: xs => orb (f x) (existsb f xs)\n\tend.\n\nDefinition existsb2 {X : Type} (f: X -> bool) (l : list X) :=\n\tnegb (forallb (fun x => negb (f x)) l).\n\nTheorem existsb_correct : forall (X : Type) (f : X -> bool) (l : list X),\n\t\texistsb f l = existsb2 f l.\nProof.\nintros X f l.\ninduction l.\nreflexivity.\n\nsimpl.\nrewrite IHl.\nunfold existsb2.\nsimpl.\ndestruct (forallb (fun x0 : X => negb (f x0)) l).\nsimpl.\ndestruct (f x).\nreflexivity.\n\nreflexivity.\n\ndestruct (f x).\nreflexivity.\n\nreflexivity.\n\nQed.\n\nTheorem index_okx : forall (X:Type) (l : list X) (n : nat),\n\t\tlength l = n -> index X (S n) l = None.\nProof.\n\tintros X l.\n\tinduction l.\n\treflexivity.\n\n\tintros n.\n\tdestruct n.\n\tintros contra.\n\tinversion contra.\n\n\tintros eq.\n\tinversion eq.\n\tapply IHl.\n\treflexivity.\nQed.\n\nInductive mumble : Type :=\n  | a : mumble\n\t| b : mumble -> nat -> mumble\n\t| c : mumble.\nInductive grumble (X:Type) : Type :=\n | d : mumble -> grumble X\n | e : X -> grumble X.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/Rel.v",
    "content": "Require Export Logic.\nImport Playground1.\n\nDefinition relation (X:Type) := X -> X -> Prop.\n\nDefinition partial_function {X:Type} (R: relation X) :=\n\tforall x y1 y2 : X, R x y1 -> R x y2 -> y1 = y2.\n\nTheorem next_nat_partial_function :\n\tpartial_function next_nat.\nProof.\n\tunfold partial_function.\n\tintros x y1 y2 P Q.\n\tinversion P.\n\tinversion Q.\n\treflexivity.\nQed.\n\nTheorem le_not_a_partial_function :\n\t~ (partial_function le).\nProof.\n\tunfold not.\n\tunfold partial_function.\n\tintros H.\n\tassert (O = S O) as Nonsense.\n\t\tCase \"Proof of assertion.\".\n\t\tapply H with O.\n\t\tapply le_n.\n\n\t\tapply le_S.\n\t\tapply le_n.\n\n\tinversion Nonsense.\nQed.\n\nTheorem total_relation_not_partial_function :\n\t~ (partial_function total_relation).\nProof.\n\tunfold not.\n\tunfold partial_function.\n\tintros H.\n\tassert (O = S O) as Nonsense.\n\tapply H with O.\n\tapply total_relation1.\n\n\tapply total_relation1.\n\n\tinversion Nonsense.\nQed.\n\nTheorem empty_relation_not_partial_funcion :\n\tpartial_function empty_relation.\nProof.\n\tunfold partial_function.\n\tintros x y1 y2.\n\tintros H.\n\tinversion H.\nQed.\n\nDefinition reflexive {X:Type} (R: relation X) :=\n\tforall a : X, R a a.\n\nTheorem le_reflexive :\n\treflexive le.\nProof.\n\tunfold reflexive.\n\tintros n. apply le_n.\nQed.\n\nDefinition transitive {X:Type} (R: relation X) :=\n\tforall a b c : X, (R a b) -> (R b c) -> (R a c).\n\nTheorem le_trans:\n\ttransitive le.\nProof.\n\tintros n m o Hnm Hmo.\n\tinduction Hmo.\n\tCase \"le_n\". apply Hnm.\n\tCase \"le_S\". apply le_S. apply IHHmo.\nQed.\n\nTheorem lt_trans:\n\ttransitive lt.\nProof.\n\tunfold lt. unfold transitive.\n\tintros n m o Hnm Hmo.\n\tapply le_S in Hnm.\n\tapply le_trans with (a := (S n)) (b := (S m)) (c := o).\n\tapply Hnm.\n\tapply Hmo.\nQed.\n\nTheorem lt_trans' :\n\ttransitive lt.\nProof.\n\tunfold lt. unfold transitive.\n\tintros n m o Hnm Hmo.\n\tinduction Hmo as [| m' Hm'o].\n\tapply le_S.\n\tapply Hnm.\n\n\tapply le_S.\n\tapply IHHm'o.\nQed.\n\nTheorem le_Sn_le: forall n m, S n <= m -> n <= m.\nProof.\n\tintros n m H. apply le_trans with (S n).\n\tapply le_S. apply le_n.\n\tapply H. Qed.\n\nTheorem le_S_n : forall n m,\n\t(S n <= S m) -> (n <= m).\nProof.\nintros n m H.\napply Sn_le_Sm__n_le_m.\napply H.\nQed.\n\nTheorem le_Sn_n : forall n,\n\t~ (S n <= n).\nProof.\ninduction n.\nintros H.\ninversion H.\n\nunfold not in IHn.\nintros H.\napply le_S_n in H.\napply IHn.\napply H.\nQed.\n\n(*\n TODO\nTheorem lt_trans'' :\n\ttransitive lt.\nProof.\n\tunfold lt. unfold transitive.\n\tintros n m o Hnm Hmo.\n\tinduction o as [| o'].\n\t*)\n\nDefinition symmetric {X: Type} (R: relation X) :=\n\tforall a b : X, (R a b) -> (R b a).\n\nDefinition antisymmetric {X : Type} (R: relation X) :=\n\tforall a b : X, (R a b) -> (R b a) -> a = b.\n\nTheorem le_antisymmetric :\n\tantisymmetric le.\nProof.\nintros a b.\ngeneralize dependent a.\ninduction b.\nintros a.\nintros H.\nintros H1.\ninversion H.\nreflexivity.\n\nintros a H1 H2.\ndestruct a.\ninversion H2.\n\napply Sn_le_Sm__n_le_m in H1.\napply Sn_le_Sm__n_le_m in H2.\napply IHb in H1.\nrewrite H1 in |- *.\nreflexivity.\n\napply H2.\nQed.\n\n(*\n TODO\nTheorem le_step : forall n m p,\n\tn < m ->\n\tn <= S p ->\n\tn <= p.\nProof.\n*)\n\nDefinition equivalence {X:Type} (R: relation X) :=\n\t(reflexive R) /\\ (symmetric R) /\\ (transitive R).\n\nDefinition order {X:Type} (R: relation X) :=\n\t(reflexive R) /\\ (antisymmetric R) /\\ (transitive R).\n\nDefinition preorder {X:Type} (R: relation X) :=\n\t(reflexive R) /\\ (transitive R).\n\nTheorem le_order :\n\torder le.\nProof.\n\tunfold order. split.\n\tCase \"refl\". apply le_reflexive.\n\tsplit.\n\t\tCase \"antisym\". apply le_antisymmetric.\n\t\tCase \"transitive\". apply le_trans. Qed.\n\nInductive clos_refl_trans {A:Type} (R: relation A) : relation A :=\n\t| rt_step : forall x y, R x y -> clos_refl_trans R x y\n\t| rt_refl : forall x, clos_refl_trans R x x\n\t| rt_trans : forall x y z,\n\t\tclos_refl_trans R x y -> clos_refl_trans R y z -> clos_refl_trans R x z.\n\nTheorem next_nat_closure_is_le : forall n m,\n\t(n <= m) <-> ((clos_refl_trans next_nat) n m).\nProof.\nintros n m.\nsplit.\nintro H.\ninduction H.\napply rt_refl.\n\napply rt_trans with m.\napply IHle.\n\napply rt_step.\napply nn.\n\nintro H.\ninduction H.\ninversion H.\napply le_S.\napply le_n.\n\napply le_n.\n\napply le_trans with y.\napply IHclos_refl_trans1.\n\napply IHclos_refl_trans2.\nQed.\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    \n\nInductive refl_step_closure {X : Type} (R: relation X)\n\t\t\t\t\t\t\t\t\t\t\t: X -> X -> Prop :=\n\t| rsc_refl : forall (x : X), refl_step_closure R x x\n\t| rsc_step : forall (x y z : X), R x y ->\n\t\t\t\t\t\t\t\trefl_step_closure R y z ->\n\t\t\t\t\t\t\t\trefl_step_closure R x z.\n\nTactic Notation \"rt_cases\" tactic(first) ident(c) :=\n\tfirst;\n\t[ Case_aux c \"rt_step\" | Case_aux c \"rt_refl\" | Case_aux c \"rt_trans\" ].\n\nTactic Notation \"rsc_cases\" tactic(first) ident(c) :=\n\t  first;\n\t\t  [ Case_aux c \"rsc_refl\" | Case_aux c \"rsc_step\" ].\n\nTheorem rsc_R : forall (X:Type) (R:relation X) (x y:X),\n\t\t\t\tR x y -> refl_step_closure R x y.\nProof.\nintros X R x y r.\napply rsc_step with y.\n apply r.\n  \n  apply rsc_refl.\nQed.\n\nTheorem rsc_trans :\n\tforall (X : Type) (R : relation X) (x y z : X),\n\t\trefl_step_closure R x y ->\n\t\t\trefl_step_closure R y z ->\n\t\t\t\trefl_step_closure R x z.\nProof.\nintros X.\nintros R x y z.\nintros H.\ninduction H.\nintros H1.\napply H1.\n\nintros H1.\napply IHrefl_step_closure in H1.\napply rsc_step with y.\napply H.\n\napply H1.\nQed.\n\nTheorem rtc_rsc_coincide:\n\tforall (X:Type) (R: relation X) (x y : X),\n\t\tclos_refl_trans R x y <-> refl_step_closure R x y.\nProof.\nintros X R x y.\nsplit.\nintros H.\ninduction H.\napply rsc_step with y.\napply H.\n\napply rsc_refl.\n\napply rsc_refl.\n\napply rsc_trans with y.\napply IHclos_refl_trans1.\n\napply IHclos_refl_trans2.\n\nintros H1.\ninduction H1.\napply rt_refl.\n\napply rt_trans with y.\napply rt_step.\napply H.\n\napply IHrefl_step_closure.\nQed.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/Smallstep.v",
    "content": "Require Export Imp.\nRequire Export Relations.\n\nInductive tm : Type :=\n   | tm_const : nat -> tm\n   | tm_plus : tm -> tm -> tm.\n\nTactic Notation \"tm_cases\" tactic(first) ident(c) :=\n   first;\n   [ Case_aux c \"tm_const\" | Case_aux c \"tm_plus\" ].\n\nModule SimpleArith0.\n\nFixpoint eval (t : tm) : nat :=\n   match t with\n      | tm_const n => n\n      | tm_plus a1 a2 => eval a1 + eval a2\n   end.\n\nEnd SimpleArith0.\n\nModule SimpleArith1.\n\nReserved Notation \" t '===>' n \" (at level 50, left associativity).\n\nInductive eval : tm -> nat -> Prop :=\n   | E_Const : forall n,\n                  tm_const n ===> n\n   | E_Plus : forall t1 t2 n1 n2,\n                  t1 ===> n1 ->\n                  t2 ===> n2 ->\n                  tm_plus t1 t2 ===> plus n1 n2\n\n     where \" t '===>' n \" := (eval t n).\n\nEnd SimpleArith1.\n\nReserved Notation \" t '===>' t' \" (at level 50, left associativity).\n\nInductive eval : tm -> tm -> Prop :=\n   | E_Const : forall n1,\n      tm_const n1 ===> tm_const n1\n   | E_Plus : forall t1 n1 t2 n2,\n      t1 ===> tm_const n1 ->\n      t2 ===> tm_const n2 ->\n         tm_plus t1 t2 ===> tm_const (plus n1 n2)\n   where \" t '===>' t' \" := (eval t t').\n\nTactic Notation \"eval_cases\" tactic(first) ident(c) :=\n   first;\n   [ Case_aux c \"E_Const\" | Case_aux c \"E_Plus\" ].\n\nModule SimpleArith2.\n\nReserved Notation \" t '=>' t' \" (at level 40).\n\nInductive step : tm -> tm -> Prop :=\n   | ST_PlusConstConst : forall n1 n2,\n      tm_plus (tm_const n1) (tm_const n2) => tm_const (plus n1 n2)\n   | ST_Plus1 : forall t1 t1' t2,\n      t1 => t1' ->\n         tm_plus t1 t2 => tm_plus t1' t2\n   | ST_Plus2 : forall n1 t2 t2',\n      t2 => t2' ->\n      tm_plus (tm_const n1) t2 => tm_plus (tm_const n1) t2'\n\n   where \" t '=>' t' \" := (step t t').\n\nTactic Notation \"step_cases\" tactic(first) ident(c) :=\n   first;\n   [ Case_aux c \"ST_PlusConstConst\"\n   | Case_aux c \"ST_Plus1\" | Case_aux c \"ST_Plus2\" ].\n\nExample test_step_1 : \n      tm_plus \n        (tm_plus (tm_const 0) (tm_const 3))\n        (tm_plus (tm_const 2) (tm_const 4))\n      =>\n      tm_plus \n        (tm_const (plus 0 3))\n        (tm_plus (tm_const 2) (tm_const 4)).\nProof.\n  apply ST_Plus1. apply ST_PlusConstConst. Qed.\n\nExample test_step_2 : \n      tm_plus \n        (tm_const 0)\n        (tm_plus \n          (tm_const 2) \n          (tm_plus (tm_const 0) (tm_const 3)))\n      =>\n      tm_plus \n        (tm_const 0)\n        (tm_plus \n          (tm_const 2) \n          (tm_const (plus 0 3))).\nProof.\napply ST_Plus2.\nsimpl.\napply ST_Plus2.\napply ST_PlusConstConst.\nQed.\n\nTheorem step_deterministic:\n  partial_function step.\nProof.\n  unfold partial_function. intros x y1 y2 Hy1 Hy2.\n  generalize dependent y2.\n  step_cases (induction Hy1) Case; intros y2 Hy2.\n    Case \"ST_PlusConstConst\". step_cases (inversion Hy2) SCase.\n      SCase \"ST_PlusConstConst\". reflexivity.\n      SCase \"ST_Plus1\". inversion H2.\n      SCase \"ST_Plus2\". inversion H2.\n    Case \"ST_Plus1\". step_cases (inversion Hy2) SCase.\n      SCase \"ST_PlusConstConst\". rewrite <- H0 in Hy1. inversion Hy1.\n      SCase \"ST_Plus1\".\n        rewrite <- (IHHy1 t1'0).\n        reflexivity. assumption.\n      SCase \"ST_Plus2\". rewrite <- H in Hy1. inversion Hy1.\n    Case \"ST_Plus2\". step_cases (inversion Hy2) SCase.\n      SCase \"ST_PlusConstConst\". rewrite <- H1 in Hy1. inversion Hy1.\n      SCase \"ST_Plus1\". inversion H2.\n      SCase \"ST_Plus2\".\n        rewrite <- (IHHy1 t2'0).\n        reflexivity. assumption. Qed.\n\nEnd SimpleArith2.\n\nInductive value : tm -> Prop :=\n   v_const: forall n, value (tm_const n).\n\nReserved Notation \" t '=>' t' \" (at level 40).\n\nInductive step : tm -> tm -> Prop :=\n   | ST_PlusConstConst : forall n1 n2,\n      tm_plus (tm_const n1) (tm_const n2)\n         => tm_const (plus n1 n2)\n   | ST_Plus1 : forall t1 t1' t2,\n      t1 => t1' ->\n         tm_plus t1 t2 => tm_plus t1' t2\n   | ST_Plus2 : forall v1 t2 t2',\n      value v1 ->\n         t2 => t2' ->\n            tm_plus v1 t2 => tm_plus v1 t2'\n\n   where \" t '=>' t' \" := (step t t').\n\nTactic Notation \"step_cases\" tactic(first) ident(c) :=\n   first;\n   [ Case_aux c \"ST_PlusConstConst\"\n      | Case_aux c \"ST_Plus1\" | Case_aux c \"ST_Plus2\" ].\n\nTheorem step_deterministic :\n   partial_function step.\nProof.\nunfold partial_function.\nintros x y1 y2 Hy1 Hy2.\ngeneralize dependent y2.\nstep_cases (induction Hy1) Case; intros y2 Hy2.\n step_cases (inversion Hy2) SCase.\n  reflexivity.\n  \n  inversion H2.\n  \n  inversion Hy2.\n   subst.\n   assumption.\n   \n   subst.\n   inversion H3.\n   \n   subst.\n   inversion H3.\n   \n step_cases (inversion Hy2) SCase.\n  rewrite <- H0 in Hy1.\n  inversion Hy1.\n  \n  rewrite <- (IHHy1 t1'0).\n   reflexivity.\n   \n   assumption.\n   \n  rewrite <- H in Hy1.\n  rewrite <- H in H1.\n  subst.\n  inversion H1.\n  subst.\n  inversion Hy1.\n  \n step_cases (inversion Hy2) SCase.\n  subst.\n  inversion Hy1.\n  \n  subst.\n  inversion H.\n  subst.\n  inversion H3.\n  \n  subst.\n  inversion H2.\n  subst.\n  rewrite <- (IHHy1 t2'0).\n   reflexivity.\n   \n   assumption.\nQed.\n\nTheorem strong_progress : forall t,\n        value t \\/ (exists t', t => t').\nProof.\n   tm_cases (induction t) Case.\n      Case \"tm_const\". left. apply v_const.\n      Case \"tm_plus\". right. inversion IHt1.\n         SCase \"l\". inversion IHt2.\n            SSCase \"l\". inversion H. inversion H0.\n               exists (tm_const (plus n n0)).\n               apply ST_PlusConstConst.\n            SSCase \"r\". inversion H0 as [t' H1].\n               exists (tm_plus t1 t').\n               apply ST_Plus2. apply H. apply H1.\n         SCase \"r\". inversion H as [t' H0].\n            exists (tm_plus t' t2).\n            apply ST_Plus1. apply H0. Qed.\n\nDefinition normal_form {X:Type} (R: relation X) (t: X) : Prop :=\n    ~ (exists t', R t t'). \n\nLemma value_is_nf: forall t,\n      value t -> normal_form step t.\nProof.\n   unfold normal_form. intros t H. inversion H.\n   intros contra. inversion contra. inversion H1.\n   Qed.\n\nLemma nf_is_value: forall t,\n      normal_form step t -> value t.\nProof.\n   unfold normal_form. intros t H.\n   assert (G: value t \\/ (exists t', t => t')).\n      SCase \"Proof of assertion\". apply strong_progress.\n   inversion G.\n      SCase \"l\". assumption.\n      SCase \"r\". apply ex_falso_quodlibet. apply H. assumption. Qed.\n\nCorollary nf_same_as_value : forall t,\n            normal_form step t <-> value t.\nProof.\n   split. apply nf_is_value. apply value_is_nf.\nQed.\n\nModule Temp1.\n\nInductive value : tm -> Prop :=\n| v_const : forall n, value (tm_const n)\n| v_funny : forall t1 n2, (* <---- *)\n              value (tm_plus t1 (tm_const n2)).\n\nReserved Notation \" t '=>' t' \" (at level 40).\n\nInductive step : tm -> tm -> Prop :=\n  | ST_PlusConstConst : forall n1 n2,\n      tm_plus (tm_const n1) (tm_const n2) => tm_const (plus n1 n2)\n  | ST_Plus1 : forall t1 t1' t2,\n      t1 => t1' ->\n      tm_plus t1 t2 => tm_plus t1' t2\n  | ST_Plus2 : forall v1 t2 t2',\n      value v1 ->\n      t2 => t2' ->\n      tm_plus v1 t2 => tm_plus v1 t2'\n\n  where \" t '=>' t' \" := (step t t').\n\nLemma value_not_same_as_normal_form:\n   exists t, value t /\\ ~ normal_form step t.\nProof.\nintros.\nunfold normal_form.\nexists (tm_plus (tm_plus (tm_const 1) (tm_const 2)) (tm_const 2)).\nsplit.\n apply v_funny.\n \n unfold not.\n intros.\n apply H.\n exists (tm_plus (tm_const (1 + 2)) (tm_const 2)).\n apply ST_Plus1.\n apply ST_PlusConstConst.\nQed.\n\nEnd Temp1.\n\nModule Temp2.\n\nInductive value : tm -> Prop :=\n   | v_const : forall n, value (tm_const n).\n\n(*Reserved Notation \" t '===>' t' \" (at level 40).*)\n\nInductive step : tm -> tm -> Prop :=\n  | ST_Funny : forall n, (* <---- *)\n      tm_const n ===> tm_plus (tm_const n) (tm_const 0)\n  | ST_PlusConstConst : forall n1 n2,\n      tm_plus (tm_const n1) (tm_const n2) ===> tm_const (plus n1 n2)\n  | ST_Plus1 : forall t1 t1' t2,\n      t1 ===> t1' ->\n      tm_plus t1 t2 ===> tm_plus t1' t2\n  | ST_Plus2 : forall v1 t2 t2',\n      value v1 ->\n      t2 ===> t2' ->\n      tm_plus v1 t2 ===> tm_plus v1 t2'\n\n  where \" t '===>' t' \" := (step t t').\n\nLemma value_not_same_as_normal_form :\n  exists t, value t /\\ ~ normal_form step t.\nProof.\nexists (tm_const 0).\nsplit.\n apply v_const.\n \n unfold normal_form.\n unfold not.\n intro H.\n apply H.\n exists (tm_plus (tm_const 0) (tm_const 0)).\n apply ST_Funny.\nQed.\n\nEnd Temp2.\n\nModule Temp3.\n\nInductive value : tm -> Prop :=\n  | v_const : forall n, value (tm_const n).\n\n(*Reserved Notation \" t '===>' t' \" (at level 40).*)\n\nInductive step : tm -> tm -> Prop :=\n  | ST_PlusConstConst : forall n1 n2,\n      tm_plus (tm_const n1) (tm_const n2) ===> tm_const (plus n1 n2)\n  | ST_Plus1 : forall t1 t1' t2,\n      t1 ===> t1' ->\n      tm_plus t1 t2 ===> tm_plus t1' t2\n\n  where \" t '===>' t' \" := (step t t').\n\nLemma value_not_same_as_normal_form:\n   exists t, ~ value t /\\ normal_form step t.\nProof.\nexists (tm_plus (tm_const 1) (tm_plus (tm_const 0) (tm_const 0))).\nsplit.\n intros H.\n inversion H.\n \n unfold normal_form.\n intros H.\n inversion H.\n inversion H0.\n inversion H4.\nQed.\n\nEnd Temp3.\n\nModule Temp4.\nInductive tm : Type :=\n   | tm_true : tm\n   | tm_false : tm\n   | tm_if : tm -> tm -> tm -> tm.\n\nInductive value : tm -> Prop :=\n   | v_true : value tm_true\n   | v_false : value tm_false.\n\nInductive step : tm -> tm -> Prop :=\n   | ST_IfTrue : forall t1 t2,\n      tm_if tm_true t1 t2 ===> t1\n   | ST_IfFalse : forall t1 t2,\n      tm_if tm_false t1 t2 ===> t2\n   | ST_If : forall t1 t1' t2 t3,\n      t1 ===> t1' ->\n         tm_if t1 t2 t3 ===> tm_if t1' t2 t3\n\n   where \" t '===>' t' \" := (step t t').\n\nExample bool_step_prop3 :\n     tm_if\n       (tm_if tm_true tm_true tm_true)\n       (tm_if tm_true tm_true tm_true)\n       tm_false\n   ===>\n     tm_if\n       tm_true\n       (tm_if tm_true tm_true tm_true)\n       tm_false.\nProof.\napply ST_If.\napply ST_IfTrue.\nQed.\n\nTheorem strong_progress: forall t,\n        value t \\/ (exists t', t ===> t').\nProof.\ninduction t.\n left.\n constructor.\n \n left.\n constructor.\n \n right.\n inversion IHt1.\n  inversion H.\n   exists t2.\n   apply ST_IfTrue.\n   \n   exists t3.\n   apply ST_IfFalse.\n   \n  inversion H.\n  exists (tm_if x t2 t3).\n  apply ST_If.\n  assumption.\nQed.\n\nTheorem step_deterministic :\n  partial_function step.\nProof.\nunfold partial_function.\nintros x y1 y2 Hy1 Hy2.\ngeneralize dependent y2.\ninduction Hy1.\n intros.\n inversion Hy2.\n  reflexivity.\n  \n  subst.\n  inversion H3.\n  \n intros.\n inversion Hy2.\n  reflexivity.\n  \n  inversion H3.\n  \n intros.\n inversion Hy2.\n  subst.\n  inversion Hy1.\n  \n  subst.\n  inversion Hy1.\n  \n  subst.\n  apply IHHy1 in H3.\n  subst.\n  reflexivity.\nQed.\n\nModule Temp5.\n\n\nInductive step : tm -> tm -> Prop :=\n   | ST_IfTrue : forall t1 t2,\n      tm_if tm_true t1 t2 ===> t1\n   | ST_IfFalse : forall t1 t2,\n      tm_if tm_false t1 t2 ===> t2\n   | ST_If : forall t1 t1' t2 t3,\n      t1 ===> t1' ->\n         tm_if t1 t2 t3 ===> tm_if t1' t2 t3\n   | ST_ShortCut : forall v t,\n      value v ->\n         tm_if t v v ===> v\n\n   where \" t '===>' t' \" := (step t t').\n\nDefinition bool_step_prop4 :=\n         tm_if\n            (tm_if tm_true tm_true tm_true)\n            tm_false\n            tm_false\n     ===>\n         tm_false.\n\nExample bool_step_prop4_holds : \n  bool_step_prop4.\nProof.\n   unfold bool_step_prop4.\n   apply ST_ShortCut.\n   constructor.\nQed.\n\nTheorem strong_progress: forall t,\n        value t \\/ (exists t', t ===> t').\nProof.\n   induction t.\n left.\n constructor.\n \n left.\n constructor.\n \n inversion IHt1.\n  right.\n  inversion H.\n   exists t2.\n   constructor.\n   \n   exists t3.\n   constructor.\n   \n  right.\n  inversion H.\n  exists (tm_if x t2 t3).\n  apply ST_If.\n  assumption.\nQed.\n\nEnd Temp5.\nEnd Temp4.\n\nDefinition stepmany := refl_step_closure step.\n\nNotation \" t '===>*' t' \" := (stepmany t t') (at level 40).\n\nLemma test_stepmany_1:\n   tm_plus\n      (tm_plus (tm_const 0) (tm_const 3))\n      (tm_plus (tm_const 2) (tm_const 4))\n      ===>*\n         tm_const (plus (plus 0 3) (plus 2 4)).\nProof.\n   eapply rsc_step. apply ST_Plus1. apply ST_PlusConstConst.\n  eapply rsc_step. apply ST_Plus2. apply v_const.\n  apply ST_PlusConstConst.\n  eapply rsc_step. apply ST_PlusConstConst.\n  apply rsc_refl. Qed.\n\nLemma test_stepmany_2:\n   tm_const 3 ===>* tm_const 3.\nProof.\n   eapply rsc_refl.\nQed.\n\nLemma test_stepmany_3:\n   tm_plus (tm_const 0) (tm_const 3)\n      ===>*\n   tm_plus (tm_const 0) (tm_const 3).\nProof.\n   eapply rsc_refl.\nQed.\n\nLemma test_stepmany_4:\n   tm_plus\n      (tm_const 0)\n      (tm_plus\n         (tm_const 2)\n         (tm_plus (tm_const 0) (tm_const 3)))\n   ===>*\n      tm_plus\n         (tm_const 0)\n         (tm_const (plus 2 (plus 0 3))).\nProof.\neapply rsc_step.\n apply ST_Plus2.\n  apply v_const.\n  \n  apply ST_Plus2.\n   apply v_const.\n   \n   apply ST_PlusConstConst.\n   \n eapply rsc_step.\n  apply ST_Plus2.\n   apply v_const.\n   \n   apply ST_PlusConstConst.\n   \n  eapply rsc_refl.\nQed.\n\nDefinition step_normal_form := normal_form step.\n\nDefinition normal_form_of (t t' : tm) :=\n  (t ===>* t' /\\ step_normal_form t').\n\n   (*\nTheorem normal_forms_unique:\n   partial_function normal_form_of.\nProof.\n   unfold partial_function. unfold normal_form_of. intros x y1 y2 P1 P2.\n   destruct P1 as [P11 P12]. destruct P2 as [P21 P22].\n   generalize dependent y2.\n\n   unfold step_normal_form in P12.\n   unfold step_normal_form.\n   unfold normal_form.\n   unfold normal_form in P12.\n   induction x.\n   intros.\n   unfold stepmany.\n   inversion P11.\n   subst.\n   inversion P21.\n   subst.\n   reflexivity.\n\n   subst.\n   inversion P21.\n   reflexivity.\n\n   subst.\n   inversion H1.\n\n   inversion H.\n   *)\n\nDefinition normalizing {X:Type} (R:relation X) :=\n     forall t, exists t',\n         (refl_step_closure R) t t' /\\ normal_form R t'.\n\nLemma stepmany_congr_1 : forall t1 t1' t2,\n      t1 ===>* t1' ->\n         tm_plus t1 t2 ===>* tm_plus t1' t2.\nProof.\nintros t1 t1' t2 H.\nrsc_cases (induction H) Case.\n apply rsc_refl.\n  \n  apply rsc_step with (tm_plus y t2).\n    apply ST_Plus1.\n      apply H.\n        \n        apply IHrefl_step_closure.\nQed.\n\nLemma stepmany_congr2 : forall t1 t2 t2',\n      value t1 ->\n         t2 ===>* t2' ->\n            tm_plus t1 t2 ===>* tm_plus t1 t2'.\nProof.\nintros t1 t2 t2'.\nintros H1.\nintros H2.\ninduction H2.\n apply rsc_refl.\n  \n  apply rsc_step with (tm_plus t1 y).\n    apply ST_Plus2.\n       assumption.\n          \n          assumption.\n             \n            assumption.\nQed.\n\nTheorem step_normalizing :\n  normalizing step.\nProof.\n  unfold normalizing.\n  tm_cases (induction t) Case.\n    Case \"tm_const\".\n      exists (tm_const n).\n      split.\n      SCase \"l\". apply rsc_refl.\n      SCase \"r\".\n        (* We can use rewrite with \"iff\" statements, not\n           just equalities: *)\n        rewrite nf_same_as_value. apply v_const.\n    Case \"tm_plus\".\n      destruct IHt1 as [t1' H1]. destruct IHt2 as [t2' H2].\n      destruct H1 as [H11 H12]. destruct H2 as [H21 H22].\n      rewrite nf_same_as_value in H12. rewrite nf_same_as_value in H22.\n      inversion H12 as [n1]. inversion H22 as [n2].\n      rewrite <- H in H11.\n      rewrite <- H0 in H21.\n      exists (tm_const (plus n1 n2)).\n      split.\n        SCase \"l\".\n          apply rsc_trans with (tm_plus (tm_const n1) t2).\n          apply stepmany_congr_1. apply H11.\n          apply rsc_trans with \n             (tm_plus (tm_const n1) (tm_const n2)).\n          apply stepmany_congr2. apply v_const. apply H21.\n          apply rsc_R. apply ST_PlusConstConst.\n        SCase \"r\".\n          rewrite nf_same_as_value. apply v_const. Qed.\n          \n Lemma eval__value : forall t1 t2,\n      eval t1 t2 ->\n      value t2.\n Proof.\n   intros t1 t2 HE.\n   eval_cases (inversion HE) Case; apply v_const. Qed.\n   \n\n   (*\nTheorem eval__stepmany: forall t v,\n  eval t v -> t ===>* v.\nProof.   \n*)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/Spec.v",
    "content": "(** Specifications. *)\nRequire Import Coq.Lists.List.\nRequire Import Coq.Strings.Ascii.\nRequire Import FunctionNinjas.All.\nRequire Import ListString.All.\nRequire Import Computation.\n\nImport ListNotations.\nLocal Open Scope char.\n\n(** A run is an execution of the program with explicit answers for the\n    system calls. *)\nModule Run.\n  (** We define a run by induction on the structure of a computation. *)\n  Inductive t : C.t -> Type :=\n  | Ret : t C.Ret\n  | Call : forall (command : Command.t) (answer : Command.answer command)\n    {handler : Command.answer command -> C.t}, t (handler answer) ->\n    t (C.Call command handler).\n\n  (** The trace of a run. *)\n  Fixpoint trace {x : C.t} (run : t x)\n    : list {command : Command.t & Command.answer command} :=\n    match run with\n    | Ret => []\n    | Call command answer _ run => existT _ command answer :: trace run\n    end.\nEnd Run.\n\nModule Temporal.\n  Module All.\n    Inductive t (P : Command.t -> Prop) : C.t -> Prop :=\n    | Ret : t P C.Ret\n    | Call : forall (c : Command.t) (h : Command.answer c -> C.t),\n      P c -> (forall a, t P (h a)) ->\n      t P (C.Call c h).\n  End All.\n\n  Module One.\n    Inductive t (P : Command.t -> Prop) : C.t -> Prop :=\n    | CallThis : forall (c : Command.t) (h : Command.answer c -> C.t),\n      P c ->\n      t P (C.Call c h)\n    | CallOther : forall (c : Command.t) (h : Command.answer c -> C.t),\n      (forall a, t P (h a)) ->\n      t P (C.Call c h).\n  End One.\n\n  Module Then.\n    Inductive t (P1 P2 : Command.t -> Prop) : C.t -> Prop :=\n    | Ret : t P1 P2 C.Ret\n    | Call : forall (c : Command.t) (h : Command.answer c -> C.t),\n      (forall a, t P1 P2 (h a)) ->\n      t P1 P2 (C.Call c h)\n    | CallThen : forall (c : Command.t) (h : Command.answer c -> C.t),\n      P1 c -> (forall a, One.t P2 (h a)) ->\n      t P1 P2 (C.Call c h).\n  End Then.\nEnd Temporal.\n\nModule CardBeforeMoney.\nEnd CardBeforeMoney.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Coq/Stlc.v",
    "content": "\nRequire Export SfLib.\n\nModule STLC.\n\nInductive ty : Type :=\n   | ty_Bool : ty\n   | ty_arrow : ty -> ty -> ty.\n\nInductive tm : Type :=\n   | tm_var : id -> tm\n   | tm_app : tm -> tm -> tm\n   | tm_abs : id -> ty -> tm -> tm\n   | tm_true : tm\n   | tm_false : tm\n   | tm_if : tm -> tm -> tm -> tm.\n\nTactic Notation \"tm_cases\" tactic(first) ident(c) :=\n  first;\n  [ Case_aux c \"tm_var\" | Case_aux c \"tm_app\" \n  | Case_aux c \"tm_abs\" | Case_aux c \"tm_true\" \n  | Case_aux c \"tm_false\" | Case_aux c \"tm_if\" ].\n  \nNotation a := (Id 0).\nNotation b := (Id 1).\nNotation c := (Id 2).\n\nNotation idB :=\n   (tm_abs a ty_Bool (tm_var a)).\n   \nNotation idBB :=\n   (tm_abs a (ty_arrow ty_Bool ty_Bool) (tm_var a)).\n   \nNotation idBBBB :=\n   (tm_abs a (ty_arrow (ty_arrow ty_Bool ty_Bool) \n                         (ty_arrow ty_Bool ty_Bool)) \n       (tm_var a)).\n       \nNotation k := (tm_abs a ty_Bool (tm_abs b ty_Bool (tm_var a))).\n\nInductive value : tm -> Prop :=\n  | v_abs : forall x T t,\n      value (tm_abs x T t)\n  | t_true : \n      value tm_true\n  | t_false : \n      value tm_false.\n\nHint Constructors value.\n\nFixpoint subst (s:tm) (x:id) (t:tm) : tm :=\n   match t with\n   | tm_var x' => if beq_id x x' then s else t\n   | tm_abs x' T t1 => tm_abs x' T (if beq_id x x' then t1 else (subst s x t1))\n   | tm_app t1 t2 => tm_app (subst s x t1) (subst s x t2)\n   | tm_true => tm_true\n   | tm_false => tm_false\n   | tm_if t1 t2 t3 => tm_if (subst s x t1) (subst s x t2) (subst s x t3)\nend.\n\nReserved Notation \"t1 '==>' t2\" (at level 40).\n\nInductive step : tm -> tm -> Prop :=\n | ST_AppAbs : forall x T t12 v2,\n        value v2 ->\n        (tm_app (tm_abs x T t12) v2) ==> (subst v2 x t12)\n | ST_App1 : forall t1 t1' t2,\n        t1 ==> t1' ->\n        tm_app t1 t2 ==> tm_app t1' t2\n | ST_App2 : forall v1 t2 t2',\n        value v1 ->\n        t2 ==> t2' ->\n        tm_app v1 t2 ==> tm_app v1 t2'\n | ST_IfTrue : forall t1 t2,\n     (tm_if tm_true t1 t2) ==> t1\n | ST_IfFalse : forall t1 t2,\n     (tm_if tm_false t1 t2) ==> t2\n | ST_If : forall t1 t1' t2 t3,\n     t1 ==> t1' ->\n     (tm_if t1 t2 t3) ==> (tm_if t1' t2 t3)\n\nwhere \"t1 '==>' t2\" := (step t1 t2).\n\nTactic Notation \"step_cases\" tactic(first) ident(c) :=\n first;\n [ Case_aux c \"ST_AppAbs\" | Case_aux c \"ST_App1\" \n | Case_aux c \"ST_App2\" | Case_aux c \"ST_IfTrue\" \n | Case_aux c \"ST_IfFalse\" | Case_aux c \"ST_If\" ].\n\nNotation stepmany := (refl_step_closure step).\nNotation \"t1 '==>*' t2\" := (stepmany t1 t2) (at level 40).\n\nHint Constructors step.\n\nLemma step_example3 :\n       (tm_app (tm_app idBBBB idBB) idB)\n  ==>* idB.\nProof.\n eapply rsc_step.\n apply ST_App1.\n apply ST_AppAbs.\n apply v_abs.\n \n simpl.\n eapply rsc_step.\n  apply ST_AppAbs.\n  apply v_abs.\n  \n  simpl.\n  apply rsc_refl.\nQed.\n\nDefinition context := partial_map ty.\nModule Context.\n\nDefinition partial_map (A:Type) := id -> option A.\nDefinition empty {A:Type} : partial_map A := (fun _ => None).\nDefinition extend {A:Type} (Gamma : partial_map A) (x:id) (T : A) :=\n   fun x' => if beq_id x x' then Some T else Gamma x'.\n   \nLemma extend_eq : forall A (ctxt: partial_map A) x T,\n   (extend ctxt x T) x = Some T.\nProof.\n   intros. unfold extend. rewrite <- beq_id_refl. auto.\nQed.\n\nLemma extend_neq : forall A (ctxt: partial_map A) x1 T x2,\n   beq_id x2 x1 = false ->\n      (extend ctxt x2 T) x1 = ctxt x1.\nProof.\nintros. unfold extend. rewrite H. auto.\nQed.\n\nEnd Context.\n\nInductive has_type : context -> tm -> ty -> Prop :=\n   | T_Var : forall Gamma x T,\n      Gamma x = Some T ->\n         has_type Gamma (tm_var x) T\n   | T_Abs : forall Gamma x T11 T12 t12,\n      has_type (extend Gamma x T11) t12 T12 ->\n         has_type Gamma (tm_abs x T11 t12) (ty_arrow T11 T12)\n   | T_App : forall T11 T12 Gamma t1 t2,\n      has_type Gamma t1 (ty_arrow T11 T12) ->\n         has_type Gamma t2 T11 ->\n            has_type Gamma (tm_app t1 t2) T12\n   | T_True : forall Gamma,\n      has_type Gamma tm_true ty_Bool\n   | T_False : forall Gamma,\n      has_type Gamma tm_false ty_Bool\n   | T_If : forall t1 t2 t3 T Gamma,\n      has_type Gamma t1 ty_Bool ->\n      has_type Gamma t2 T ->\n      has_type Gamma t3 T ->\n      has_type Gamma (tm_if t1 t2 t3) T.\n      \nTactic Notation \"has_type_cases\" tactic(first) ident(c) :=\n  first;\n  [ Case_aux c \"T_Var\" | Case_aux c \"T_Abs\" \n  | Case_aux c \"T_App\" | Case_aux c \"T_True\" \n  | Case_aux c \"T_False\" | Case_aux c \"T_If\" ].\n\nHint Constructors has_type.\n\nHint Unfold beq_id beq_nat extend.\n\nExample typing_example_2_full :\n  has_type empty\n    (tm_abs a ty_Bool\n       (tm_abs b (ty_arrow ty_Bool ty_Bool)\n          (tm_app (tm_var b) (tm_app (tm_var b) (tm_var a)))))\n    (ty_arrow ty_Bool (ty_arrow (ty_arrow ty_Bool ty_Bool) ty_Bool)).\nProof.\napply T_Abs.\napply T_Abs.\napply T_App with (T11 := ty_Bool).\n apply T_Var.\n unfold extend.\n simpl.\n reflexivity.\n \n apply T_App with (T11 := ty_Bool).\n  apply T_Var.\n  unfold extend.\n  simpl.\n  reflexivity.\n  \n  apply T_Var.\n  unfold extend.\n  simpl.\n  reflexivity.\nQed.\n\nExample typing_example_3 :\n  exists T, \n    has_type empty\n      (tm_abs a (ty_arrow ty_Bool ty_Bool)\n         (tm_abs b (ty_arrow ty_Bool ty_Bool)\n            (tm_abs c ty_Bool\n               (tm_app (tm_var b) (tm_app (tm_var a) (tm_var c))))))\n      T.\n\nProof with auto.\nexists\n (ty_arrow (ty_arrow ty_Bool ty_Bool)\n    (ty_arrow (ty_arrow ty_Bool ty_Bool) (ty_arrow ty_Bool ty_Bool))).\napply T_Abs.\napply T_Abs.\napply T_Abs.\napply T_App with (T11 := ty_Bool).\n apply T_Var.\n unfold extend.\n simpl.\n reflexivity.\n \n apply T_App with (T11 := ty_Bool).\n  auto.\n  \n  auto.\nQed.\n\n\nTheorem coiso : forall a b e,\n   a ==>* b ->\n      tm_app a e ==>* tm_app b e.\nProof.\nintros.\ninduction H.\n apply rsc_refl.\n \n apply rsc_step with (tm_app y e).\n  apply ST_App1.\n  assumption.\n  \n  assumption.\nQed.\n\nTheorem reptrans : forall a b c,\n   a ==>* b ->\n      b ==>* c ->\n         a ==>* c.\nProof.\n\nintros a b c H.\ninduction H.\n intros.\n assumption.\n \n intros H1.\n apply IHrefl_step_closure in H1.\n apply rsc_step with y.\n  assumption.\n  \n  assumption.\nQed.\n\n(* TODO\nExample typing_nonexample_3 :\n  ~ (exists S, exists T,\n        has_type empty \n          (tm_abs a S\n             (tm_app (tm_var a) (tm_var a)))\n          T).\nProof.\n*)\n\nInductive appears_free_in : id -> tm -> Prop :=\n  | afi_var : forall x,\n      appears_free_in x (tm_var x)\n  | afi_app1 : forall x t1 t2,\n      appears_free_in x t1 -> appears_free_in x (tm_app t1 t2)\n  | afi_app2 : forall x t1 t2,\n      appears_free_in x t2 -> appears_free_in x (tm_app t1 t2)\n  | afi_abs : forall x y T11 t12,\n      y <> x ->\n      appears_free_in x t12 ->\n      appears_free_in x (tm_abs y T11 t12)\n  | afi_if1 : forall x t1 t2 t3,\n      appears_free_in x t1 ->\n      appears_free_in x (tm_if t1 t2 t3)\n  | afi_if2 : forall x t1 t2 t3,\n      appears_free_in x t2 ->\n      appears_free_in x (tm_if t1 t2 t3)\n  | afi_if3 : forall x t1 t2 t3,\n      appears_free_in x t3 ->\n      appears_free_in x (tm_if t1 t2 t3).\n      \nTactic Notation \"afi_cases\" tactic(first) ident(c) :=\n  first;\n  [ Case_aux c \"afi_var\"\n  | Case_aux c \"afi_app1\" | Case_aux c \"afi_app2\" \n  | Case_aux c \"afi_abs\" \n  | Case_aux c \"afi_if1\" | Case_aux c \"afi_if2\" \n  | Case_aux c \"afi_if3\" ].\n\nHint Constructors appears_free_in.\n\nDefinition closed (t:tm) :=\n  forall x, ~ appears_free_in x t.\n  \nLemma free_in_context : forall x t T Gamma,\n  appears_free_in x t ->\n  has_type Gamma t T ->\n  exists T', Gamma x = Some T'.\nProof.\n  intros. generalize dependent Gamma. generalize dependent T.\n  afi_cases (induction H) Case; \n         intros; try solve [inversion H0; eauto].\n  Case \"afi_abs\".\n    inversion H1; subst.\n    apply IHappears_free_in in H7.\n    apply not_eq_beq_id_false in H.\n    rewrite extend_neq in H7; assumption.\nQed.\n\nCorollary typable_empty__closed : forall t T, \n    has_type empty t T ->\n    closed t.\nProof.\nintros t T H x H1.\nremember (@empty ty) as Gamma.\nassert (exists t' : _, Gamma x = Some t').\n apply free_in_context with (t := t) (T := T).\n  assumption.\n  \n  assumption.\n  \n inversion H0.\n rewrite HeqGamma in H2.\n inversion H2.\nQed.\n\nLemma context_invariance : forall Gamma Gamma' t S,\n     has_type Gamma t S ->\n     (forall x, appears_free_in x t -> Gamma x = Gamma' x) ->\n     has_type Gamma' t S.\nProof with auto.\nintros.\ngeneralize dependent Gamma'.\nhas_type_cases (induction H) Case; intros; auto.\n apply T_Var.\n rewrite <- H0...\n \n apply T_Abs.\n apply IHhas_type.\n intros x0 Hafi.\n unfold extend.\n remember (beq_id x x0) as e.\n destruct e.\n  reflexivity.\n  \n  auto.\n  apply H0.\n  apply afi_abs.\n   auto.\n   eauto   .\n   apply beq_id_false_not_eq.\n   rewrite Heqe.\n   reflexivity.\n   \n   assumption.\n   \n apply T_App with T11.\n  auto.\n  \n  auto.\nQed.\n\nLemma substitution_preserves_typing : forall Gamma x U v t T,\n   has_type (extend Gamma x U) t T ->\n      has_type empty v U ->\n         has_type Gamma (subst v x t) T.\nProof with eauto.\n   intros Gamma x U v t T Ht Hv.\n   generalize dependent Gamma.\n   generalize dependent T.\n   tm_cases (induction t) Case; intros T Gamma H; inversion H; subst; simpl...\n   Case \"tm_var\".\n       rename i into y. remember (beq_id x y) as e. destruct e.\n       SCase \"x=y\".\n         apply beq_id_eq in Heqe. subst.\n         rewrite extend_eq in H2.\n         inversion H2; subst.\n         clear H2.\n           eapply context_invariance...\n           intros x Hcontra.\n           destruct (free_in_context _ _ T empty Hcontra) as (T', HT')...\n           inversion HT'.\n\n           apply T_Var.\n           rewrite extend_neq in H2.\n            assumption.\n\n            rewrite Heqe.\n            reflexivity.\n\n          rename i into y.\n          apply T_Abs.\n          remember (beq_id x y) as e.\n          destruct e.\n           eapply context_invariance...\n           apply beq_id_eq in Heqe.\n           subst.\n           intros x Hafi.\n           unfold extend.\n           destruct (beq_id y x).\n            reflexivity.\n\n            reflexivity.\n\n           apply IHt.\n           eapply context_invariance...\n           intros x0 Hafi.\n           unfold extend.\n           remember (beq_id y x0) as Coiso1.\n           remember (beq_id x x0) as Coiso2.\n           destruct Coiso1.\n            auto.\n            eauto   .\n            destruct Coiso2.\n             eauto   .\n             auto.\n             apply beq_id_eq in HeqCoiso1.\n             apply beq_id_eq in HeqCoiso2.\n             subst.\n             assert (x0 <> x0).\n              apply beq_id_false_not_eq.\n              rewrite Heqe.\n              auto.\n\n              apply ex_falso_quodlibet.\n              apply H0.\n              reflexivity.\n\n             reflexivity.\n\n            destruct Coiso2.\n             auto.\n\n             auto.\nQed.\n\nTheorem preservation : forall t t' T,\n     has_type empty t T ->\n     t ==> t' ->\n     has_type empty t' T.\nProof.\nremember (@empty ty) as Gamma.\nintros t t' T HT.\ngeneralize dependent t'.\ninduction HT.\n intros t' H1.\n inversion H1.\n \n intros t' H1.\n inversion H1.\n \n intros t' H1.\n inversion H1.\n  apply substitution_preserves_typing with T11.\n   subst.\n   inversion HT1.\n   subst.\n   apply H2.\n   \n   subst.\n   assumption.\n   \n  subst.\n  apply T_App with T11.\n   apply IHHT1.\n    reflexivity.\n    \n    assumption.\n    \n   assumption.\n   \n  subst.\n  apply T_App with T11.\n   assumption.\n   \n   apply IHHT2.\n    reflexivity.\n    \n    assumption.\n    \n intros t' H.\n inversion H.\n \n intros t' H.\n inversion H.\n \n intros t' H.\n inversion H.\n  subst.\n  assumption.\n  \n  subst.\n  assumption.\n  \n  subst.\n  apply T_If.\n   apply IHHT1.\n    reflexivity.\n    \n    assumption.\n    \n   assumption.\n   \n   assumption.\nQed.\n\nTheorem progress : forall t T,\n     has_type empty t T ->\n     value t \\/ exists t', t ==> t'.\nProof.\nintros t T.\nintros H.\nremember (@empty ty) as Gamma.\ninduction H.\n rewrite HeqGamma in H.\n unfold empty in H.\n inversion H.\n \n left.\n apply v_abs.\n \n right.\n assert (value t1 \\/ (exists t' : tm, t1 ==> t')).\n  apply IHhas_type1.\n  assumption.\n  \n  assert (value t2 \\/ (exists t' : tm, t2 ==> t')).\n   apply IHhas_type2.\n   assumption.\n   \n   inversion H1.\n    inversion H2.\n     inversion H3.\n      subst.\n      exists (subst t2 x t).\n      apply ST_AppAbs.\n      assumption.\n      \n      subst.\n      inversion H.\n      \n      subst.\n      inversion H.\n      \n     inversion H4.\n     exists (tm_app t1 x).\n     apply ST_App2.\n      assumption.\n      \n      assumption.\n      \n    inversion H3.\n    exists (tm_app x t2).\n    apply ST_App1.\n    assumption.\n    \n left.\n auto.\n \n left.\n auto.\n \n right.\n assert (value t1 \\/ (exists t' : tm, t1 ==> t')).\n  apply IHhas_type1.\n  assumption.\n  \n  inversion H2.\n   inversion H3.\n    subst.\n    inversion H.\n    \n    subst.\n    exists t2.\n    apply ST_IfTrue.\n    \n    subst.\n    exists t3.\n    apply ST_IfFalse.\n    \n   inversion H3.\n   exists (tm_if x t2 t3).\n   apply ST_If.\n   assumption.\nQed.\n\nTheorem progress' : forall t T,\n     has_type empty t T ->\n     value t \\/ exists t', t ==> t'.\nProof.\nintros t.\ntm_cases (induction t) Case; intros T Ht; auto.\n inversion Ht.\n inversion H1.\n \n right.\n inversion Ht.\n subst.\n assert (value t1 \\/ (exists t' : tm, t1 ==> t')).\n  apply IHt1 with (T := ty_arrow T11 T).\n  assumption.\n  \n  assert (value t2 \\/ (exists t' : tm, t2 ==> t')).\n   apply IHt2 with T11.\n   assumption.\n   \n   inversion H.\n    inversion H1.\n     subst.\n     inversion H0.\n      exists (subst t2 x t).\n      apply ST_AppAbs.\n      assumption.\n      \n      inversion H3.\n      exists (tm_app (tm_abs x T0 t) x0).\n      apply ST_App2.\n       assumption.\n       \n       assumption.\n       \n     subst.\n     inversion H2.\n     \n     subst.\n     inversion H2.\n     \n    inversion H1.\n    exists (tm_app x t2).\n    apply ST_App1.\n    assumption.\n    \n right.\n inversion Ht.\n subst.\n assert (value t1 \\/ (exists t' : tm, t1 ==> t')).\n  apply IHt1 with ty_Bool.\n  assumption.\n  \n  assert (value t2 \\/ (exists t' : tm, t2 ==> t')).\n   apply IHt2 with T.\n   assumption.\n   \n   assert (value t3 \\/ (exists t' : tm, t3 ==> t')).\n    apply IHt3 with T.\n    assumption.\n    \n    inversion H.\n     inversion H2.\n      subst.\n      inversion H3.\n      \n      subst.\n      subst.\n      exists t2.\n      apply ST_IfTrue.\n      \n      exists t3.\n      apply ST_IfFalse.\n      \n     inversion H2.\n     exists (tm_if x t2 t3).\n     apply ST_If.\n     assumption.\nQed.\n\nTheorem types_unique : forall t T Gamma,\n   has_type Gamma t T ->\n      (forall T', has_type Gamma t T' -> T' = T).\nProof.\nintros t T Gamma H.\ninduction H.\n intros T'.\n intros H1.\n inversion H1.\n subst.\n subst.\n auto.\n eauto   .\n inversion H1.\n subst.\n assert (Some T = Some T').\n  rewrite <- H3.\n  rewrite <- H.\n  reflexivity.\n  \n  inversion H0.\n  reflexivity.\n  \n intros T'.\n intros H1.\n inversion H1.\n subst.\n assert (T1 = T12).\n  apply IHhas_type.\n  assumption.\n  \n  rewrite H0.\n  reflexivity.\n  \n intros T' H1.\n subst.\n inversion H1.\n subst.\n assert (ty_arrow T0 T' = ty_arrow T11 T12).\n  apply IHhas_type1.\n  assumption.\n  \n  inversion H2.\n  reflexivity.\n  \n intros T'.\n intros H.\n inversion H.\n reflexivity.\n \n intros.\n inversion H.\n reflexivity.\n \n intros T'.\n intros H2.\n inversion H2.\n subst.\n apply IHhas_type2.\n assumption.\nQed."
  },
  {
    "path": "src/test/resources/samples/langs/Creole/creole.creole",
    "content": "= Creole\n\nCreole is a Creole-to-HTML converter for Creole, the lightweight markup\nlanguage (http://wikicreole.org/). Github uses this converter to render *.creole files.\n\nProject page on github:\n\n* http://github.com/minad/creole\n\nTravis-CI:\n\n* https://travis-ci.org/minad/creole\n\nRDOC:\n\n* http://rdoc.info/projects/minad/creole\n\n== INSTALLATION\n\n{{{\ngem install creole\n}}}\n\n== SYNOPSIS\n\n{{{\nrequire 'creole'\nhtml = Creole.creolize('== Creole text')\n}}}\n\n== BUGS\n\nIf you found a bug, please report it at the Creole project's tracker\non GitHub:\n\nhttp://github.com/minad/creole/issues\n\n== AUTHORS\n\n* Lars Christensen (larsch)\n* Daniel Mendler (minad)\n\n== LICENSE\n\nCreole is Copyright (c) 2008 - 2013 Lars Christensen, Daniel Mendler. It is free software, and\nmay be redistributed under the terms specified in the README file of\nthe Ruby distribution.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Crystal/const_spec.cr",
    "content": "#!/usr/bin/env bin/crystal --run\nrequire \"../../spec_helper\"\n\ndescribe \"Codegen: const\" do\n  it \"define a constant\" do\n    run(\"A = 1; A\").to_i.should eq(1)\n  end\n\n  it \"support nested constant\" do\n    run(\"class B; A = 1; end; B::A\").to_i.should eq(1)\n  end\n\n  it \"support constant inside a def\" do\n    run(\"\n      class Foo\n        A = 1\n\n        def foo\n          A\n        end\n      end\n\n      Foo.new.foo\n    \").to_i.should eq(1)\n  end\n\n  it \"finds nearest constant first\" do\n    run(\"\n      A = 1\n\n      class Foo\n        A = 2.5_f32\n\n        def foo\n          A\n        end\n      end\n\n      Foo.new.foo\n    \").to_f32.should eq(2.5)\n  end\n\n  it \"allows constants with same name\" do\n    run(\"\n      A = 1\n\n      class Foo\n        A = 2.5_f32\n\n        def foo\n          A\n        end\n      end\n\n      A\n      Foo.new.foo\n    \").to_f32.should eq(2.5)\n  end\n\n  it \"constants with expression\" do\n    run(\"\n      A = 1 + 1\n      A\n    \").to_i.should eq(2)\n  end\n\n  it \"finds global constant\" do\n    run(\"\n      A = 1\n\n      class Foo\n        def foo\n          A\n        end\n      end\n\n      Foo.new.foo\n    \").to_i.should eq(1)\n  end\n\n  it \"define a constant in lib\" do\n    run(\"lib Foo; A = 1; end; Foo::A\").to_i.should eq(1)\n  end\n\n  it \"invokes block in const\" do\n    run(\"require \\\"prelude\\\"; A = [\\\"1\\\"].map { |x| x.to_i }; A[0]\").to_i.should eq(1)\n  end\n\n  it \"declare constants in right order\" do\n    run(\"A = 1 + 1; B = true ? A : 0; B\").to_i.should eq(2)\n  end\n\n  it \"uses correct types lookup\" do\n    run(\"\n      module A\n        class B\n          def foo\n            1\n          end\n        end\n\n        C = B.new;\n      end\n\n      def foo\n        A::C.foo\n      end\n\n      foo\n      \").to_i.should eq(1)\n  end\n\n  it \"codegens variable assignment in const\" do\n    run(\"\n      class Foo\n        def initialize(@x)\n        end\n\n        def x\n          @x\n        end\n      end\n\n      A = begin\n            f = Foo.new(1)\n            f\n          end\n\n      def foo\n        A.x\n      end\n\n      foo\n      \").to_i.should eq(1)\n  end\n\n  it \"declaring var\" do\n    run(\"\n      BAR = begin\n        a = 1\n        while 1 == 2\n          b = 2\n        end\n        a\n      end\n      class Foo\n        def compile\n          BAR\n        end\n      end\n\n      Foo.new.compile\n      \").to_i.should eq(1)\n  end\n\n  it \"initialize const that might raise an exception\" do\n    run(\"\n      require \\\"prelude\\\"\n      CONST = (raise \\\"OH NO\\\" if 1 == 2)\n\n      def doit\n        CONST\n      rescue\n      end\n\n      doit.nil?\n    \").to_b.should be_true\n  end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Crystal/declare_var_spec.cr",
    "content": "#!/usr/bin/env bin/crystal --run\nrequire \"../../spec_helper\"\n\ndescribe \"Type inference: declare var\" do\n  it \"types declare var\" do\n    assert_type(\"a :: Int32\") { int32 }\n  end\n\n  it \"types declare var and reads it\" do\n    assert_type(\"a :: Int32; a\") { int32 }\n  end\n\n  it \"types declare var and changes its type\" do\n    assert_type(\"a :: Int32; while 1 == 2; a = 'a'; end; a\") { union_of(int32, char) }\n  end\n\n  it \"declares instance var which appears in initialize\" do\n    result = assert_type(\"\n      class Foo\n        @x :: Int32\n      end\n\n      Foo.new\") { types[\"Foo\"] }\n\n    mod = result.program\n\n    foo = mod.types[\"Foo\"] as NonGenericClassType\n    foo.instance_vars[\"@x\"].type.should eq(mod.int32)\n  end\n\n  it \"declares instance var of generic class\" do\n    result = assert_type(\"\n      class Foo(T)\n        @x :: T\n      end\n\n      Foo(Int32).new\") do\n        foo = types[\"Foo\"] as GenericClassType\n        foo_i32 = foo.instantiate([int32] of Type | ASTNode)\n        foo_i32.lookup_instance_var(\"@x\").type.should eq(int32)\n        foo_i32\n    end\n  end\n\n  it \"declares instance var of generic class after reopen\" do\n    result = assert_type(\"\n      class Foo(T)\n      end\n\n      f = Foo(Int32).new\n\n      class Foo(T)\n        @x :: T\n      end\n\n      f\") do\n        foo = types[\"Foo\"] as GenericClassType\n        foo_i32 = foo.instantiate([int32] of Type | ASTNode)\n        foo_i32.lookup_instance_var(\"@x\").type.should eq(int32)\n        foo_i32\n    end\n  end\n\n  it \"declares an instance variable in initialize\" do\n    assert_type(\"\n      class Foo\n        def initialize\n          @x :: Int32\n        end\n\n        def x\n          @x\n        end\n      end\n\n      Foo.new.x\n      \") { int32 }\n  end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Crystal/transformer.cr",
    "content": "module Crystal\n  class ASTNode\n    def transform(transformer)\n      transformer.before_transform self\n      node = transformer.transform self\n      transformer.after_transform self\n      node\n    end\n  end\n\n  class Transformer\n    def before_transform(node)\n    end\n\n    def after_transform(node)\n    end\n\n    def transform(node : Expressions)\n      exps = [] of ASTNode\n      node.expressions.each do |exp|\n        new_exp = exp.transform(self)\n        if new_exp\n          if new_exp.is_a?(Expressions)\n            exps.concat new_exp.expressions\n          else\n            exps << new_exp\n          end\n        end\n      end\n\n      if exps.length == 1\n        exps[0]\n      else\n        node.expressions = exps\n        node\n      end\n    end\n\n    def transform(node : Call)\n      if node_obj = node.obj\n        node.obj = node_obj.transform(self)\n      end\n      transform_many node.args\n\n      if node_block = node.block\n        node.block = node_block.transform(self)\n      end\n\n      if node_block_arg = node.block_arg\n        node.block_arg = node_block_arg.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : And)\n      node.left = node.left.transform(self)\n      node.right = node.right.transform(self)\n      node\n    end\n\n    def transform(node : Or)\n      node.left = node.left.transform(self)\n      node.right = node.right.transform(self)\n      node\n    end\n\n    def transform(node : StringInterpolation)\n      transform_many node.expressions\n      node\n    end\n\n    def transform(node : ArrayLiteral)\n      transform_many node.elements\n\n      if node_of = node.of\n        node.of = node_of.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : HashLiteral)\n      transform_many node.keys\n      transform_many node.values\n\n      if of_key = node.of_key\n        node.of_key = of_key.transform(self)\n      end\n\n      if of_value = node.of_value\n        node.of_value = of_value.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : If)\n      node.cond = node.cond.transform(self)\n      node.then = node.then.transform(self)\n      node.else = node.else.transform(self)\n      node\n    end\n\n    def transform(node : Unless)\n      node.cond = node.cond.transform(self)\n      node.then = node.then.transform(self)\n      node.else = node.else.transform(self)\n      node\n    end\n\n    def transform(node : IfDef)\n      node.cond = node.cond.transform(self)\n      node.then = node.then.transform(self)\n      node.else = node.else.transform(self)\n      node\n    end\n\n    def transform(node : MultiAssign)\n      transform_many node.targets\n      transform_many node.values\n      node\n    end\n\n    def transform(node : SimpleOr)\n      node.left = node.left.transform(self)\n      node.right = node.right.transform(self)\n      node\n    end\n\n    def transform(node : Def)\n      transform_many node.args\n      node.body = node.body.transform(self)\n\n      if receiver = node.receiver\n        node.receiver = receiver.transform(self)\n      end\n\n      if block_arg = node.block_arg\n        node.block_arg = block_arg.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : Macro)\n      transform_many node.args\n      node.body = node.body.transform(self)\n\n      if receiver = node.receiver\n        node.receiver = receiver.transform(self)\n      end\n\n      if block_arg = node.block_arg\n        node.block_arg = block_arg.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : PointerOf)\n      node.exp = node.exp.transform(self)\n      node\n    end\n\n    def transform(node : SizeOf)\n      node.exp = node.exp.transform(self)\n      node\n    end\n\n    def transform(node : InstanceSizeOf)\n      node.exp = node.exp.transform(self)\n      node\n    end\n\n    def transform(node : IsA)\n      node.obj = node.obj.transform(self)\n      node.const = node.const.transform(self)\n      node\n    end\n\n    def transform(node : RespondsTo)\n      node.obj = node.obj.transform(self)\n      node\n    end\n\n    def transform(node : Case)\n      node.cond = node.cond.transform(self)\n      transform_many node.whens\n\n      if node_else = node.else\n        node.else = node_else.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : When)\n      transform_many node.conds\n      node.body = node.body.transform(self)\n      node\n    end\n\n    def transform(node : ImplicitObj)\n      node\n    end\n\n    def transform(node : ClassDef)\n      node.body = node.body.transform(self)\n\n      if superclass = node.superclass\n        node.superclass = superclass.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : ModuleDef)\n      node.body = node.body.transform(self)\n      node\n    end\n\n    def transform(node : While)\n      node.cond = node.cond.transform(self)\n      node.body = node.body.transform(self)\n      node\n    end\n\n    def transform(node : Generic)\n      node.name = node.name.transform(self)\n      transform_many node.type_vars\n      node\n    end\n\n    def transform(node : ExceptionHandler)\n      node.body = node.body.transform(self)\n      transform_many node.rescues\n\n      if node_ensure = node.ensure\n        node.ensure = node_ensure.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : Rescue)\n      node.body = node.body.transform(self)\n      transform_many node.types\n      node\n    end\n\n    def transform(node : Union)\n      transform_many node.types\n      node\n    end\n\n    def transform(node : Hierarchy)\n      node.name = node.name.transform(self)\n      node\n    end\n\n    def transform(node : Metaclass)\n      node.name = node.name.transform(self)\n      node\n    end\n\n    def transform(node : Arg)\n      if default_value = node.default_value\n        node.default_value = default_value.transform(self)\n      end\n\n      if restriction = node.restriction\n        node.restriction = restriction.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : BlockArg)\n      node.fun = node.fun.transform(self)\n      node\n    end\n\n    def transform(node : Fun)\n      transform_many node.inputs\n\n      if output = node.output\n        node.output = output.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : Block)\n      node.args.map! { |exp| exp.transform(self) as Var }\n      node.body = node.body.transform(self)\n      node\n    end\n\n    def transform(node : FunLiteral)\n      node.def.body = node.def.body.transform(self)\n      node\n    end\n\n    def transform(node : FunPointer)\n      if obj = node.obj\n        node.obj = obj.transform(self)\n      end\n      node\n    end\n\n    def transform(node : Return)\n      transform_many node.exps\n      node\n    end\n\n    def transform(node : Break)\n      transform_many node.exps\n      node\n    end\n\n    def transform(node : Next)\n      transform_many node.exps\n      node\n    end\n\n    def transform(node : Yield)\n      if scope = node.scope\n        node.scope = scope.transform(self)\n      end\n      transform_many node.exps\n      node\n    end\n\n    def transform(node : Include)\n      node.name = node.name.transform(self)\n      node\n    end\n\n    def transform(node : Extend)\n      node.name = node.name.transform(self)\n      node\n    end\n\n    def transform(node : RangeLiteral)\n      node.from = node.from.transform(self)\n      node.to = node.to.transform(self)\n      node\n    end\n\n    def transform(node : Assign)\n      node.target = node.target.transform(self)\n      node.value = node.value.transform(self)\n      node\n    end\n\n    def transform(node : Nop)\n      node\n    end\n\n    def transform(node : NilLiteral)\n      node\n    end\n\n    def transform(node : BoolLiteral)\n      node\n    end\n\n    def transform(node : NumberLiteral)\n      node\n    end\n\n    def transform(node : CharLiteral)\n      node\n    end\n\n    def transform(node : StringLiteral)\n      node\n    end\n\n    def transform(node : SymbolLiteral)\n      node\n    end\n\n    def transform(node : RegexLiteral)\n      node\n    end\n\n    def transform(node : Var)\n      node\n    end\n\n    def transform(node : MetaVar)\n      node\n    end\n\n    def transform(node : InstanceVar)\n      node\n    end\n\n    def transform(node : ClassVar)\n      node\n    end\n\n    def transform(node : Global)\n      node\n    end\n\n    def transform(node : Require)\n      node\n    end\n\n    def transform(node : Path)\n      node\n    end\n\n    def transform(node : Self)\n      node\n    end\n\n    def transform(node : LibDef)\n      node.body = node.body.transform(self)\n      node\n    end\n\n    def transform(node : FunDef)\n      if body = node.body\n        node.body = body.transform(self)\n      end\n      node\n    end\n\n    def transform(node : TypeDef)\n      node\n    end\n\n    def transform(node : StructDef)\n      node\n    end\n\n    def transform(node : UnionDef)\n      node\n    end\n\n    def transform(node : EnumDef)\n      node\n    end\n\n    def transform(node : ExternalVar)\n      node\n    end\n\n    def transform(node : IndirectRead)\n      node.obj = node.obj.transform(self)\n      node\n    end\n\n    def transform(node : IndirectWrite)\n      node.obj = node.obj.transform(self)\n      node.value = node.value.transform(self)\n      node\n    end\n\n    def transform(node : TypeOf)\n      transform_many node.expressions\n      node\n    end\n\n    def transform(node : Primitive)\n      node\n    end\n\n    def transform(node : Not)\n      node\n    end\n\n    def transform(node : TypeFilteredNode)\n      node\n    end\n\n    def transform(node : TupleLiteral)\n      transform_many node.exps\n      node\n    end\n\n    def transform(node : Cast)\n      node.obj = node.obj.transform(self)\n      node.to = node.to.transform(self)\n      node\n    end\n\n    def transform(node : DeclareVar)\n      node.var = node.var.transform(self)\n      node.declared_type = node.declared_type.transform(self)\n      node\n    end\n\n    def transform(node : Alias)\n      node.value = node.value.transform(self)\n      node\n    end\n\n    def transform(node : TupleIndexer)\n      node\n    end\n\n    def transform(node : Attribute)\n      node\n    end\n\n    def transform_many(exps)\n      exps.map! { |exp| exp.transform(self) } if exps\n    end\n  end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Csound/allglass.orc",
    "content": "sr     = 44100\nkr     = 44100\nksmps  = 1\nnchnls = 2\n\n; pvanal -n 512 -w 8 allglass1-L.wav allglass1-L.pvc\n; pvanal -n 512 -w 8 allglass1-R.wav allglass1-R.pvc\ninstr 1\n  ktime line 0, p3, 17.5018\n  arL pvoc ktime, 1, \"allglass1-L.pvc\"\n  arR pvoc ktime, 1, \"allglass1-R.pvc\"\n  out arL, arR\nendin\n"
  },
  {
    "path": "src/test/resources/samples/langs/Csound/interp.orc",
    "content": "sr     = 44100\nkr     = 44100\nksmps  = 1\nnchnls = 2\n\n; pvanal -n 1024 -w 2 partA-L.wav partA-L.pvc\n; pvanal -n 1024 -w 2 partA-R.wav partA-R.pvc\n; pvanal -n 1024 -w 2 partB.wav partB.pvc\ninstr 1\n  iscale = 1\n\n  ktimpnt1     line 0, iscale*(82196/44100), 82196/44100\n  ktimpnt2     linseg 0, iscale*1.25, 0, iscale*(103518/44100), 103518/44100\n  kfreqscale   linseg 1, iscale*0.5, 1, iscale*1.6, 0.8\n  kfreqinterpL linseg 0, iscale*0.25, 0, iscale*1.6, 1\n  kampinterpL  linseg 0, iscale*0.25, 0, iscale*1.6, 1\n  kfreqinterpR linseg 0, iscale*0.5, 0, iscale*1.2, 1\n  kampinterpR  linseg 0, iscale*0.5, 0, iscale*1.2, 1\n\n        pvbufread ktimpnt1, \"partB.pvc\"\n  apvcL pvinterp ktimpnt2, 1, \"partA-L.pvc\", kfreqscale, 1, 1, 1, 1-kfreqinterpL, 1-kampinterpL\n        pvbufread ktimpnt1, \"partB.pvc\"\n  apvcR pvinterp ktimpnt2, 1, \"partA-R.pvc\", kfreqscale, 1, 1, 1, 1-kfreqinterpR, 1-kampinterpR\n\n  outs apvcL*0.8, apvcR*0.8\nendin\n"
  },
  {
    "path": "src/test/resources/samples/langs/Csound/test.orc",
    "content": "// Csound single-line comments can be preceded by a pair of forward slashes...\n; ...or a semicolon.\n\n/* Block comments begin with /* and end with */\n\n// Orchestras begin with a header of audio parameters.\nnchnls = 1\nnchnls_i = 1\nsr = 44100\n0dbfs = 1\nksmps = 10\n\n// The control rate kr = sr / ksmps can be omitted when the number of audio\n// samples in a control period (ksmps) is set, but kr may appear in older\n// orchestras.\nkr = 4410\n\n// Orchestras contain instruments. These begin with the keyword instr followed\n// by a comma-separated list of numbers or names of the instrument. Instruments\n// end at the endin keyword and cannot be nested.\ninstr 1, N_a_M_e_, +Name\n  // Instruments contain statements. Here is a typical statement:\n  aSignal oscil 0dbfs, 440, 1\n  // Statements are terminated with a newline (possibly preceded by a comment).\n  // To write a statement on several lines, precede the newline with a\n  // backslash.\n  prints \\\n    \"hello, world\\n\";comment\n\n  // Csound 6 introduced function syntax for opcodes with one or zero outputs.\n  // The oscil statement above is the same as\n  aSignal = oscil(0dbfs, 440, 1)\n\n  // Instruments can contain control structures.\n  kNote = p3\n  if (kNote == 0) then\n    kFrequency = 220\n  elseif kNote == 1 then // Parentheses around binary expressions are optional.\n    kFrequency = 440\n  endif\n\n  // Csound 6 introduced looping structures.\n  iIndex = 0\n  while iIndex < 5 do\n    print iIndex\n    iIndex += 1\n  od\n  iIndex = 0\n  until iIndex >= 5 do\n    print iIndex\n    iIndex += 1\n  enduntil\n  // Both kinds of loops can be terminated by either od or enduntil.\n\n  // Single-line strings are enclosed in double-quotes.\n  prints \"string\\\\\\r\\n\\t\\\"\"\n  // Multi-line strings are enclosed in pairs of curly braces.\n  prints {{\n    hello,\n\n    world\n  }}\n\n  // Instruments often end with a statement containing an output opcode.\n  outc aSignal\nendin\n\n// Orchestras can also contain user-defined opcodes (UDOs). Here is an\n// oscillator with one audio-rate output and two control-rate inputs:\nopcode anOscillator, a, kk\n  kAmplitude, kFrequency xin\n  aSignal vco2 kAmplitude, kFrequency\n  xout aSignal\nendop\ninstr TestOscillator\n  outc(anOscillator(0dbfs, 110))\nendin\n\n// Python can be executed in Csound\n// <https://csound.github.io/docs/manual/pyrun.html>. So can Lua\n// <https://csound.github.io/docs/manual/lua.html>.\npyruni {{\nimport random\n\npool = [(1 + i / 10.0) ** 1.2 for i in range(100)]\n\ndef get_number_from_pool(n, p):\n  if random.random() < p:\n    i = int(random.random() * len(pool))\n    pool[i] = n;\n  return random.choice(pool)\n}}\n\n// The Csound preprocessor supports conditional compilation and including files.\n#ifdef DEBUG\n#undef DEBUG\n#include \"filename.orc\"\n#endif\n\n// The preprocessor also supports object- and function-like macros. This is an\n// object-like macro that defines a number:\n#define A_HZ #440#\n\n// This is a function-like macro:\n#define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n\n// Bodies of macros are enclosed in # and can contain newlines. The arguments of\n// function-like macros are separated by single-quotes. Uses of macros are\n// prefixed with a dollar sign.\ninstr TestMacro\n  aSignal $OSCIL_MACRO(1'$A_HZ'1)\n  // Not unlike PHP, macros expand in double-quoted strings.\n  prints \"The frequency of the oscillator is $A_HZ Hz.\\n\"\n  out aSignal\nendin\n\n// Here are other things to note about Csound.\n\n// There are two bitwise NOT operators, ~ and ¬ (U+00AC). The latter is common\n// on keyboards in the United Kingdom\n// <https://en.wikipedia.org/wiki/British_and_American_keyboards>.\ninstr TestBitwiseNOT\n  print ~42\n  print ¬42\nendin\n\n// Csound uses # for bitwise XOR, which the Csound manual calls bitwise\n// non-equivalence <https://csound.github.io/docs/manual/opnonequiv.html>.\ninstr TestBitwiseXOR\n  print 0 # 0\n  print 0 # 1\n  print 1 # 0\n  print 1 # 1\nendin\n\n// Loops and if-then statements are relatively recent additions to Csound. There\n// are many flow-control opcodes that involve goto and labels.\ninstr TestGoto\n  // This...\n  if p3 > 0 goto if_label\n  goto else_label\nif_label:\n  prints \"if branch\\n\"\n  goto endif_label\nelse_label:\n  prints \"else branch\\n\"\nendif_label:\n\n  // ...is the same as this.\n  if p3 > 0 then\n    prints \"if branch\\n\"\n  else\n    prints \"else branch\\n\"\n  endif\n\n  // This...\n  iIndex = 0\nloop_label:\n  print iIndex\n  iIndex += 1\n  if iIndex < 10 goto loop_label\n\n  // ...is the same as this...\n  iIndex = 0\nloop_lt_label:\n  print iIndex\n  loop_lt iIndex, 1, 10, loop_lt_label\n\n  // ...and this.\n  iIndex = 0\n  while iIndex < 10 do\n    print iIndex\n    iIndex += 1\n  od\nendin\n\n// The prints and printks opcodes\n// <https://github.com/csound/csound/blob/develop/OOps/ugrw1.c#L831>, arguably\n// the primary methods of logging output, treat certain sequences of characters\n// different from printf in C.\ninstr TestPrints\n  // ^ prints an ESCAPE character (U+001B), not a CIRCUMFLEX ACCENT character\n  // (U+005E). ^^ prints a CIRCUMFLEX ACCENT.\n  prints \"^^\\n\"\n  // ~ prints an ESCAPE character (U+001B) followed by a [, not a TILDE\n  // character (U+007E). ~~ prints a TILDE.\n  prints \"~~\\n\"\n  // \\A, \\B, \\N, \\R, and \\T correspond to the escaped lowercase characters (that\n  // is, BELL (U+0007), BACKSPACE (U+0008), new line (U+000A), CARRIAGE RETURN\n  // (U+000D), and tab (U+0009)).\n  prints \"\\T\\R\\N\"\n  // %n, %r, and %t are the same as \\n, \\r, and \\t, as are %N, %R, and %T.\n  prints \"%t%r%n\"\n  // %! prints a semicolon. This is a hold-over from old versions of Csound that\n  // allowed comments to begin in strings.\n  prints \"; %!\\n\"\nendin\n\n// The arguments of function-like macros can be separated by # instead of '.\n// These two lines define the same macro.\n#define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n#define OSCIL_MACRO(VOLUME#FREQUENCY#TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n\n// Uses of macros can optionally be suffixed with a period.\ninstr TestMacroPeriodSuffix\n  aSignal $OSCIL_MACRO.(1'$A_HZ'1)\n  prints \"The frequency of the oscillator is $A_HZ.Hz.\\n\"\n  out aSignal\nendin\n\n// Csound has @ and @@ operator-like macros that, when followed by a literal\n// non-negative integer, expand to the next power of 2 and the next power of 2\n// plus 1:\n//    @x = 2^(ceil(log2(x + 1))), x >= 0\n//   @@0 = 2\n//   @@x = 2^(ceil(log2(x))) + 1, x > 0\ninstr TestAt\n  prints \"%d  %2d  %2d\\n\", 0, @0, @@0\n  prints \"%d  %2d  %2d\\n\", 1, @1, @@1\n  prints \"%d  %2d  %2d\\n\", 2, @2, @@2\n  prints \"%d  %2d  %2d\\n\", 3, @3, @@3\n  prints \"%d  %2d  %2d\\n\", 4, @4, @@4\n  prints \"%d  %2d  %2d\\n\", 5, @5, @@5\n  prints \"%d  %2d  %2d\\n\", 6, @6, @@6\n  prints \"%d  %2d  %2d\\n\", 7, @7, @@7\n  prints \"%d  %2d  %2d\\n\", 8, @8, @@8\n  prints \"%d  %2d  %2d\\n\", 9, @9, @@9\nendin\n\n// Including newlines in macros can lead to confusing code.\ninstr MacroAbuse\n  if 1 == 1 then\n    prints \"on\\n\"\n#define FOO#\nBAR\n#endif // This ends the if block. It is not a preprocessor directive.\nendin\n\nscoreline_i {{\nf 1 0 16384 10 1\ni \"N_a_M_e_\" 0 2\ni \"TestOscillator\" 2 2\ni \"TestBitwiseNOT\" 0 1\ni \"TestBitwiseXOR\" 0 1\ni \"TestGoto\" 0 1\ni \"TestMacroPeriodSuffix\" 4 1\ni \"TestAt\" 0 1\ni \"MacroAbuse\" 0 1\ne\n}}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Csound Document/allglass.csd",
    "content": "<CsoundSynthesizer>\n<CsInstruments>\nsr     = 44100\nkr     = 44100\nksmps  = 1\nnchnls = 2\n\n; pvanal -n 512 -w 8 allglass1-L.wav allglass1-L.pvc\n; pvanal -n 512 -w 8 allglass1-R.wav allglass1-R.pvc\ninstr 1\n  ktime line 0, p3, 17.5018\n  arL pvoc ktime, 1, \"allglass1-L.pvc\"\n  arR pvoc ktime, 1, \"allglass1-R.pvc\"\n  out arL, arR\nendin\n</CsInstruments>\n<CsScore>\ni 1 0 70.0073\ne\n</CsScore>\n</CsoundSynthesizer>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Csound Document/interp.csd",
    "content": "<CsoundSynthesizer>\n<CsInstruments>\nsr     = 44100\nkr     = 44100\nksmps  = 1\nnchnls = 2\n\n; pvanal -n 1024 -w 2 partA-L.wav partA-L.pvc\n; pvanal -n 1024 -w 2 partA-R.wav partA-R.pvc\n; pvanal -n 1024 -w 2 partB.wav partB.pvc\ninstr 1\n  iscale = 1\n\n  ktimpnt1     line 0, iscale*(82196/44100), 82196/44100\n  ktimpnt2     linseg 0, iscale*1.25, 0, iscale*(103518/44100), 103518/44100\n  kfreqscale   linseg 1, iscale*0.5, 1, iscale*1.6, 0.8\n  kfreqinterpL linseg 0, iscale*0.25, 0, iscale*1.6, 1\n  kampinterpL  linseg 0, iscale*0.25, 0, iscale*1.6, 1\n  kfreqinterpR linseg 0, iscale*0.5, 0, iscale*1.2, 1\n  kampinterpR  linseg 0, iscale*0.5, 0, iscale*1.2, 1\n\n        pvbufread ktimpnt1, \"partB.pvc\"\n  apvcL pvinterp ktimpnt2, 1, \"partA-L.pvc\", kfreqscale, 1, 1, 1, 1-kfreqinterpL, 1-kampinterpL\n        pvbufread ktimpnt1, \"partB.pvc\"\n  apvcR pvinterp ktimpnt2, 1, \"partA-R.pvc\", kfreqscale, 1, 1, 1, 1-kfreqinterpR, 1-kampinterpR\n\n  outs apvcL*0.8, apvcR*0.8\nendin\n</CsInstruments>\n<CsScore>\ni 1 0 7\ne\n</CsScore>\n</CsoundSynthesizer>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Csound Document/test.csd",
    "content": "<CsoundSynthesizer>\n<CsInstruments>\n// Csound single-line comments can be preceded by a pair of forward slashes...\n; ...or a semicolon.\n\n/* Block comments begin with /* and end with */\n\n// Orchestras begin with a header of audio parameters.\nnchnls = 1\nnchnls_i = 1\nsr = 44100\n0dbfs = 1\nksmps = 10\n\n// The control rate kr = sr / ksmps can be omitted when the number of audio\n// samples in a control period (ksmps) is set, but kr may appear in older\n// orchestras.\nkr = 4410\n\n// Orchestras contain instruments. These begin with the keyword instr followed\n// by a comma-separated list of numbers or names of the instrument. Instruments\n// end at the endin keyword and cannot be nested.\ninstr 1, N_a_M_e_, +Name\n  // Instruments contain statements. Here is a typical statement:\n  aSignal oscil 0dbfs, 440, 1\n  // Statements are terminated with a newline (possibly preceded by a comment).\n  // To write a statement on several lines, precede the newline with a\n  // backslash.\n  prints \\\n    \"hello, world\\n\";comment\n\n  // Csound 6 introduced function syntax for opcodes with one or zero outputs.\n  // The oscil statement above is the same as\n  aSignal = oscil(0dbfs, 440, 1)\n\n  // Instruments can contain control structures.\n  kNote = p3\n  if (kNote == 0) then\n    kFrequency = 220\n  elseif kNote == 1 then // Parentheses around binary expressions are optional.\n    kFrequency = 440\n  endif\n\n  // Csound 6 introduced looping structures.\n  iIndex = 0\n  while iIndex < 5 do\n    print iIndex\n    iIndex += 1\n  od\n  iIndex = 0\n  until iIndex >= 5 do\n    print iIndex\n    iIndex += 1\n  enduntil\n  // Both kinds of loops can be terminated by either od or enduntil.\n\n  // Single-line strings are enclosed in double-quotes.\n  prints \"string\\\\\\r\\n\\t\\\"\"\n  // Multi-line strings are enclosed in pairs of curly braces.\n  prints {{\n    hello,\n\n    world\n  }}\n\n  // Instruments often end with a statement containing an output opcode.\n  outc aSignal\nendin\n\n// Orchestras can also contain user-defined opcodes (UDOs). Here is an\n// oscillator with one audio-rate output and two control-rate inputs:\nopcode anOscillator, a, kk\n  kAmplitude, kFrequency xin\n  aSignal vco2 kAmplitude, kFrequency\n  xout aSignal\nendop\ninstr TestOscillator\n  outc(anOscillator(0dbfs, 110))\nendin\n\n// Python can be executed in Csound\n// <https://csound.github.io/docs/manual/pyrun.html>. So can Lua\n// <https://csound.github.io/docs/manual/lua.html>.\npyruni {{\nimport random\n\npool = [(1 + i / 10.0) ** 1.2 for i in range(100)]\n\ndef get_number_from_pool(n, p):\n  if random.random() < p:\n    i = int(random.random() * len(pool))\n    pool[i] = n;\n  return random.choice(pool)\n}}\n\n// The Csound preprocessor supports conditional compilation and including files.\n#ifdef DEBUG\n#undef DEBUG\n#include \"filename.orc\"\n#endif\n\n// The preprocessor also supports object- and function-like macros. This is an\n// object-like macro that defines a number:\n#define A_HZ #440#\n\n// This is a function-like macro:\n#define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n\n// Bodies of macros are enclosed in # and can contain newlines. The arguments of\n// function-like macros are separated by single-quotes. Uses of macros are\n// prefixed with a dollar sign.\ninstr TestMacro\n  aSignal $OSCIL_MACRO(1'$A_HZ'1)\n  // Not unlike PHP, macros expand in double-quoted strings.\n  prints \"The frequency of the oscillator is $A_HZ Hz.\\n\"\n  out aSignal\nendin\n\n// Here are other things to note about Csound.\n\n// There are two bitwise NOT operators, ~ and ¬ (U+00AC). The latter is common\n// on keyboards in the United Kingdom\n// <https://en.wikipedia.org/wiki/British_and_American_keyboards>.\ninstr TestBitwiseNOT\n  print ~42\n  print ¬42\nendin\n\n// Csound uses # for bitwise XOR, which the Csound manual calls bitwise\n// non-equivalence <https://csound.github.io/docs/manual/opnonequiv.html>.\ninstr TestBitwiseXOR\n  print 0 # 0\n  print 0 # 1\n  print 1 # 0\n  print 1 # 1\nendin\n\n// Loops and if-then statements are relatively recent additions to Csound. There\n// are many flow-control opcodes that involve goto and labels.\ninstr TestGoto\n  // This...\n  if p3 > 0 goto if_label\n  goto else_label\nif_label:\n  prints \"if branch\\n\"\n  goto endif_label\nelse_label:\n  prints \"else branch\\n\"\nendif_label:\n\n  // ...is the same as this.\n  if p3 > 0 then\n    prints \"if branch\\n\"\n  else\n    prints \"else branch\\n\"\n  endif\n\n  // This...\n  iIndex = 0\nloop_label:\n  print iIndex\n  iIndex += 1\n  if iIndex < 10 goto loop_label\n\n  // ...is the same as this...\n  iIndex = 0\nloop_lt_label:\n  print iIndex\n  loop_lt iIndex, 1, 10, loop_lt_label\n\n  // ...and this.\n  iIndex = 0\n  while iIndex < 10 do\n    print iIndex\n    iIndex += 1\n  od\nendin\n\n// The prints and printks opcodes\n// <https://github.com/csound/csound/blob/develop/OOps/ugrw1.c#L831>, arguably\n// the primary methods of logging output, treat certain sequences of characters\n// different from printf in C.\ninstr TestPrints\n  // ^ prints an ESCAPE character (U+001B), not a CIRCUMFLEX ACCENT character\n  // (U+005E). ^^ prints a CIRCUMFLEX ACCENT.\n  prints \"^^\\n\"\n  // ~ prints an ESCAPE character (U+001B) followed by a [, not a TILDE\n  // character (U+007E). ~~ prints a TILDE.\n  prints \"~~\\n\"\n  // \\A, \\B, \\N, \\R, and \\T correspond to the escaped lowercase characters (that\n  // is, BELL (U+0007), BACKSPACE (U+0008), new line (U+000A), CARRIAGE RETURN\n  // (U+000D), and tab (U+0009)).\n  prints \"\\T\\R\\N\"\n  // %n, %r, and %t are the same as \\n, \\r, and \\t, as are %N, %R, and %T.\n  prints \"%t%r%n\"\n  // %! prints a semicolon. This is a hold-over from old versions of Csound that\n  // allowed comments to begin in strings.\n  prints \"; %!\\n\"\nendin\n\n// The arguments of function-like macros can be separated by # instead of '.\n// These two lines define the same macro.\n#define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n#define OSCIL_MACRO(VOLUME#FREQUENCY#TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n\n// Uses of macros can optionally be suffixed with a period.\ninstr TestMacroPeriodSuffix\n  aSignal $OSCIL_MACRO.(1'$A_HZ'1)\n  prints \"The frequency of the oscillator is $A_HZ.Hz.\\n\"\n  out aSignal\nendin\n\n// Csound has @ and @@ operator-like macros that, when followed by a literal\n// non-negative integer, expand to the next power of 2 and the next power of 2\n// plus 1:\n//    @x = 2^(ceil(log2(x + 1))), x >= 0\n//   @@0 = 2\n//   @@x = 2^(ceil(log2(x))) + 1, x > 0\ninstr TestAt\n  prints \"%d  %2d  %2d\\n\", 0, @0, @@0\n  prints \"%d  %2d  %2d\\n\", 1, @1, @@1\n  prints \"%d  %2d  %2d\\n\", 2, @2, @@2\n  prints \"%d  %2d  %2d\\n\", 3, @3, @@3\n  prints \"%d  %2d  %2d\\n\", 4, @4, @@4\n  prints \"%d  %2d  %2d\\n\", 5, @5, @@5\n  prints \"%d  %2d  %2d\\n\", 6, @6, @@6\n  prints \"%d  %2d  %2d\\n\", 7, @7, @@7\n  prints \"%d  %2d  %2d\\n\", 8, @8, @@8\n  prints \"%d  %2d  %2d\\n\", 9, @9, @@9\nendin\n\n// Including newlines in macros can lead to confusing code.\ninstr MacroAbuse\n  if 1 == 1 then\n    prints \"on\\n\"\n#define FOO#\nBAR\n#endif // This ends the if block. It is not a preprocessor directive.\nendin\n</CsInstruments>\n<CsScore>\nf 1 0 16384 10 1\ni \"N_a_M_e_\" 0 2\ni \"TestOscillator\" 2 2\ni \"TestBitwiseNOT\" 0 1\ni \"TestBitwiseXOR\" 0 1\ni \"TestGoto\" 0 1\ni \"TestMacroPeriodSuffix\" 4 1\ni \"TestAt\" 0 1\ni \"MacroAbuse\" 0 1\ne\n</CsScore>\n</CsoundSynthesizer>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Csound Score/allglass.sco",
    "content": "i 1 0 70.0073\ne\n"
  },
  {
    "path": "src/test/resources/samples/langs/Csound Score/interp.sco",
    "content": "i 1 0 7\ne\n"
  },
  {
    "path": "src/test/resources/samples/langs/Csound Score/test.sco",
    "content": "f 1 0 16384 10 1\ni \"N_a_M_e_\" 0 2\ni \"TestOscillator\" 2 2\ni \"TestBitwiseNOT\" 0 1\ni \"TestBitwiseXOR\" 0 1\ni \"TestGoto\" 0 1\ni \"TestMacroPeriodSuffix\" 4 1\ni \"TestAt\" 0 1\ni \"MacroAbuse\" 0 1\ne\n"
  },
  {
    "path": "src/test/resources/samples/langs/Cuda/scalarProd_kernel.cuh",
    "content": "__global__ void scalarProdGPU(\n    float *d_C,\n    float *d_A,\n    float *d_B,\n    int vectorN,\n    int elementN\n)\n{\n    //Accumulators cache\n    __shared__ float accumResult[ACCUM_N];\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Cycle through every pair of vectors,\n    // taking into account that vector counts can be different\n    // from total number of thread blocks\n    ////////////////////////////////////////////////////////////////////////////\n    for (int vec = blockIdx.x; vec < vectorN; vec += gridDim.x)\n    {\n        int vectorBase = IMUL(elementN, vec);\n        int vectorEnd  = vectorBase + elementN;\n\n        ////////////////////////////////////////////////////////////////////////\n        // Each accumulator cycles through vectors with\n        // stride equal to number of total number of accumulators ACCUM_N\n        // At this stage ACCUM_N is only preferred be a multiple of warp size\n        // to meet memory coalescing alignment constraints.\n        ////////////////////////////////////////////////////////////////////////\n        for (int iAccum = threadIdx.x; iAccum < ACCUM_N; iAccum += blockDim.x)\n        {\n            float sum = 0;\n\n            for (int pos = vectorBase + iAccum; pos < vectorEnd; pos += ACCUM_N)\n                sum += d_A[pos] * d_B[pos];\n\n            accumResult[iAccum] = sum;\n        }\n\n        ////////////////////////////////////////////////////////////////////////\n        // Perform tree-like reduction of accumulators' results.\n        // ACCUM_N has to be power of two at this stage\n        ////////////////////////////////////////////////////////////////////////\n        for (int stride = ACCUM_N / 2; stride > 0; stride >>= 1)\n        {\n            __syncthreads();\n\n            for (int iAccum = threadIdx.x; iAccum < stride; iAccum += blockDim.x)\n                accumResult[iAccum] += accumResult[stride + iAccum];\n        }\n\n        if (threadIdx.x == 0) d_C[vec] = accumResult[0];\n    }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Cuda/vectorAdd.cu",
    "content": "#include <stdio.h>\n#include <cuda_runtime.h>\n\n/**\n * CUDA Kernel Device code\n *\n * Computes the vector addition of A and B into C. The 3 vectors have the same\n * number of elements numElements.\n */\n__global__ void\nvectorAdd(const float *A, const float *B, float *C, int numElements)\n{\n    int i = blockDim.x * blockIdx.x + threadIdx.x;\n\n    if (i < numElements)\n    {\n        C[i] = A[i] + B[i];\n    }\n}\n\n/**\n * Host main routine\n */\nint\nmain(void)\n{\n    // Error code to check return values for CUDA calls\n    cudaError_t err = cudaSuccess;\n\n    // Launch the Vector Add CUDA Kernel\n    int threadsPerBlock = 256;\n    int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;\n    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements);\n    err = cudaGetLastError();\n\n    if (err != cudaSuccess)\n    {\n        fprintf(stderr, \"Failed to launch vectorAdd kernel (error code %s)!\\n\", cudaGetErrorString(err));\n        exit(EXIT_FAILURE);\n    }\n\n    // Reset the device and exit\n    err = cudaDeviceReset();\n\n    return 0;\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Cycript/utils.cy",
    "content": "(function(utils) {\n\t// Load C functions declared in utils.loadFuncs\n\tvar shouldLoadCFuncs = true;\n\t// Expose the C functions to cycript's global scope\n\tvar shouldExposeCFuncs = true;\n\t// Expose C constants to cycript's global scope\n\tvar shouldExposeConsts = true;\n\t// Expose functions defined here to cycript's global scope\n\tvar shouldExposeFuncs = true;\n\t// Which functions to expose\n\tvar funcsToExpose = [\"exec\", \"include\", \"sizeof\", \"logify\", \"apply\", \"str2voidPtr\", \"voidPtr2str\", \"double2voidPtr\", \"voidPtr2double\", \"isMemoryReadable\", \"isObject\", \"makeStruct\"];\n\t\n\t// C functions that utils.loadFuncs loads\n\tvar CFuncsDeclarations = [\n\t\t// <stdlib.h>\n\t\t\"void *calloc(size_t num, size_t size)\",\n\t\t// <string.h>\n\t\t\"char *strcpy(char *restrict dst, const char *restrict src)\",\n\t\t\"char *strdup(const char *s1)\",\n\t\t\"void* memset(void* dest, int ch, size_t count)\",\n\t\t// <stdio.h>\n\t\t\"FILE *fopen(const char *, const char *)\",\n\t\t\"int fclose(FILE *)\",\n\t\t\"size_t fread(void *restrict, size_t, size_t, FILE *restrict)\",\n\t\t\"size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict)\",\n\t\t// <mach.h>\n\t\t\"mach_port_t mach_task_self()\",\n\t\t\"kern_return_t task_for_pid(mach_port_name_t target_tport, int pid, mach_port_name_t *tn)\",\n\t\t\"kern_return_t mach_vm_protect(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, boolean_t set_maximum, vm_prot_t new_protection)\",\n\t\t\"kern_return_t mach_vm_write(vm_map_t target_task, mach_vm_address_t address, vm_offset_t data, mach_msg_type_number_t dataCnt)\",\n\t\t\"kern_return_t mach_vm_read(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, vm_offset_t *data, mach_msg_type_number_t *dataCnt)\",\n\t];\n\t\n\t/*\n\t\tReplacement for eval that can handle @encode etc.\n\t\t\n\t\tUsage:\n\t\t\tcy# utils.exec(\"@encode(void *(int, char))\")\n\t\t\t@encode(void*(int,char))\n\t*/\n\tutils.exec = function(str) {\n\t\tvar mkdir = @encode(int (const char *, int))(dlsym(RTLD_DEFAULT, \"mkdir\"));\n\t\tvar tempnam = @encode(char *(const char *, const char *))(dlsym(RTLD_DEFAULT, \"tempnam\"));\n\t\tvar fopen = @encode(void *(const char *, const char *))(dlsym(RTLD_DEFAULT, \"fopen\"));\n\t\tvar fclose = @encode(int (void *))(dlsym(RTLD_DEFAULT, \"fclose\"));\n\t\tvar fwrite = @encode(int (const char *, int, int, void *))(dlsym(RTLD_DEFAULT, \"fwrite\"));\n\t\tvar symlink = @encode(int (const char *, const char *))(dlsym(RTLD_DEFAULT, \"symlink\"));\n\t\tvar unlink = @encode(int (const char *))(dlsym(RTLD_DEFAULT, \"unlink\"));\n\t\tvar getenv = @encode(const char *(const char *))(dlsym(RTLD_DEFAULT, \"getenv\"));\n\t\tvar setenv = @encode(int (const char *, const char *, int))(dlsym(RTLD_DEFAULT, \"setenv\"));\n\t\t\n\t\tvar libdir = \"/usr/lib/cycript0.9\";\n\t\tvar dir = libdir + \"/tmp\";\n\n\t\tmkdir(dir, 0777);\n\t\t\n\t\t// This is needed because tempnam seems to ignore the first argument on i386\n\t\tvar old_tmpdir = getenv(\"TMPDIR\");\n\t\tsetenv(\"TMPDIR\", dir, 1);\n\n\t\t// No freeing :(\n\t\tvar f = tempnam(dir, \"exec-\");\n\t\tsetenv(\"TMPDIR\", old_tmpdir, 1);\n\t\tif(!f) {\n\t\t\treturn false;\n\t\t}\n\n\t\tsymlink(f, f + \".cy\");\n\t\t\n\t\tstr = \"exports.result = \" + str;\n\n\t\tvar handle = fopen(f, \"w\");\n\t\tfwrite(str, str.length, 1, handle);\n\t\tfclose(handle);\n\t\t\n\t\tvar r;\n\t\tvar except = null;\n\t\ttry {\n\t\t\tr = require(f.replace(libdir + \"/\", \"\"));\n\t\t} catch(e) {\n\t\t\texcept = e;\n\t\t}\n\n\t\tunlink(f + \".cy\");\n\t\tunlink(f);\n\t\t\n\t\tif(except !== null) {\n\t\t\tthrow except;\n\t\t}\n\n\t\treturn r.result;\n\t};\n\t\n\t/*\n\t\tApplies known typedefs\n\t\tUsed in utils.include and utils.makeStruct\n\t\t\n\t\tUsage:\n\t\t\tcy# utils.applyTypedefs(\"mach_vm_address_t\")\n\t\t\t\"uint64_t\"\n\t*/\n\tutils.applyTypedefs = function(str) {\n\t\tvar typedefs = {\n\t\t\t\"struct\": \"\",\n\t\t\t\"restrict\": \"\",\n\t\t\t\"FILE\": \"void\",\n\t\t\t\"size_t\": \"uint64_t\",\n\t\t\t\"uintptr_t\": \"unsigned long\",\n\t\t\t\"kern_return_t\": \"int\",\n\t\t\t\"mach_port_t\": \"unsigned int\",\n\t\t\t\"mach_port_name_t\": \"unsigned int\",\n\t\t\t\"vm_offset_t\": \"unsigned long\",\n\t\t\t\"vm_size_t\": \"unsigned long\",\n\t\t\t\"mach_vm_address_t\": \"uint64_t\",\n\t\t\t\"mach_vm_offset_t\": \"uint64_t\",\n\t\t\t\"mach_vm_size_t\": \"uint64_t\",\n\t\t\t\"vm_map_offset_t\": \"uint64_t\",\n\t\t\t\"vm_map_address_t\": \"uint64_t\",\n\t\t\t\"vm_map_size_t\": \"uint64_t\",\n\t\t\t\"mach_port_context_t\": \"uint64_t\",\n\t\t\t\"vm_map_t\": \"unsigned int\",\n\t\t\t\"boolean_t\": \"unsigned int\",\n\t\t\t\"vm_prot_t\": \"int\",\n\t\t\t\"mach_msg_type_number_t\": \"unsigned int\",\n\t\t\t\"cpu_type_t\": \"int\",\n\t\t\t\"cpu_subtype_t\": \"int\",\n\t\t\t\"cpu_threadtype_t\": \"int\",\n\t\t};\n\t\t\n\t\tfor(var k in typedefs) {\n\t\t\tstr = str.replace(new RegExp(\"(\\\\s|\\\\*|,|\\\\(|^)\" + k + \"(\\\\s|\\\\*|,|\\\\)|$)\", \"g\"), \"$1\" + typedefs[k] + \"$2\");\n\t\t}\n\t\t\n\t\treturn str;\n\t};\n\t\n\t/*\n\t\tParses a C function declaration and returns the function name and cycript type\n\t\tIf load is true, tries to load it into cycript using utils.exec\n\t\t\n\t\tUsage:\n\t\t\tcy# var str = \"void *calloc(size_t num, size_t size)\";\n\t\t\t\"void *calloc(size_t num, size_t size)\"\n\t\t\tcy# utils.include(str)\n\t\t\t[\"calloc\",\"@encode(void *(uint64_t num,  uint64_t size))(140735674376857)\"]\n\t\t\tcy# var ret = utils.include(str, true)\n\t\t\t[\"calloc\",0x7fff93e0e299]\n\t\t\tcy# ret[1].type\n\t\t\t@encode(void*(unsigned long long int,unsigned long long int))\n\t\t\tcy# ret[1](100, 1)\n\t\t\t0x100444100\n\t*/\n\tutils.include = function(str, load) {\n\t\tvar re = /^\\s*([^(]*(?:\\s+|\\*))(\\w*)\\s*\\(([^)]*)\\)\\s*;?\\s*$/;\n\t\tvar match = re.exec(str);\n\t\tif(!match) {\n\t\t\treturn -1;\n\t\t}\n\t\tvar rType = utils.applyTypedefs(match[1]);\n\t\tvar name = match[2];\n\t\tvar args = match[3];\n\n\t\tvar argsRe = /([^,]+)(?:,|$)/g;\n\t\tvar argsTypes = [];\n\t\twhile((match = argsRe.exec(args)) !== null) {\n\t\t\tvar type = utils.applyTypedefs(match[1]);\n\t\t\targsTypes.push(type);\n\t\t}\n\t\t\n\t\tvar encodeString = \"@encode(\";\n\t\tencodeString += rType + \"(\";\n\t\tencodeString += argsTypes.join(\", \") + \"))\";\n\n\t\tvar fun = dlsym(RTLD_DEFAULT, name);\n\t\tif(fun !== null) {\n\t\t\tencodeString += \"(\" + fun + \")\";\n\t\t\tif(load) {\n\t\t\t\treturn [name, utils.exec(encodeString)];\n\t\t\t}\n\t\t} else if(load) {\n\t\t\tthrow \"Function couldn't be found with dlsym!\";\n\t\t}\n\n\t\treturn [name, encodeString];\n\t};\n\t\n\t/*\n\t\tLoads the function declaration in the defs array using utils.exec and exposes to cycript's global scope\n\t\tIs automatically called if shouldLoadCFuncs is true\n\t*/\n\tutils.funcs = {};\n\tutils.loadfuncs = function(expose) {\n\t\tfor(var i = 0; i < CFuncsDeclarations.length; i++) {\n\t\t\ttry {\n\t\t\t\tvar o = utils.include(CFuncsDeclarations[i], true);\n\t\t\t\tutils.funcs[o[0]] = o[1];\n\t\t\t\tif(expose) {\n\t\t\t\t\tCycript.all[o[0]] = o[1];\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t\tsystem.print(\"Failed to load function: \" + i);\n\t\t\t\ttry {\n\t\t\t\t\tsystem.print(utils.include(CFuncsDeclarations[i]));\n\t\t\t\t} catch(e2) {\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/*\n\t\tCalculates the size of a type like the C operator sizeof\n\t\t\n\t\tUsage:\n\t\t\tcy# utils.sizeof(int)\n\t\t\t4\n\t\t\tcy# utils.sizeof(@encode(void *))\n\t\t\t8\n\t\t\tcy# utils.sizeof(\"mach_vm_address_t\")\n\t\t\t8\n\t*/\n\tutils.sizeof = function(type) {\n\t\tif(typeof type === \"string\") {\n\t\t\ttype = utils.applyTypedefs(type);\n\t\t\ttype = utils.exec(\"@encode(\" + type + \")\");\n\t\t}\n\t\t\n\t\t// (const) char * has \"infinite\" preceision\n\t\tif(type.toString().slice(-1) === \"*\") {\n\t\t\treturn utils.sizeof(@encode(void *));\n\t\t}\n\t\t\n\t\t// float and double\n\t\tif(type.toString() === @encode(float).toString()) {\n\t\t\treturn 4;\n\t\t} else if (type.toString() === @encode(double).toString()) {\n\t\t\treturn 8;\n\t\t}\n\n\t\tvar typeInstance = type(0);\n\t\t\n\t\tif(typeInstance instanceof Object) {\n\t\t\t// Arrays\n\t\t\tif(\"length\" in typeInstance) {\n\t\t\t\treturn typeInstance.length * utils.sizeof(typeInstance.type);\n\t\t\t}\n\t\t\t\n\t\t\t// Structs\n\t\t\tif(typeInstance.toString() === \"[object Struct]\") {\n\t\t\t\tvar typeStr = type.toString();\n\t\t\t\tvar arrayTypeStr = \"[2\" + typeStr + \"]\";\n\t\t\t\tvar arrayType = new Type(arrayTypeStr);\n\t\t\t\t\n\t\t\t\tvar arrayInstance = new arrayType;\n\t\t\t\t\n\t\t\t\treturn @encode(void *)(&(arrayInstance[1])) - @encode(void *)(&(arrayInstance[0]));\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor(var i = 0; i < 5; i++) {\n\t\t\tvar maxSigned = Math.pow(2, 8 * Math.pow(2, i) - 1) - 1;\n\t\t\tif(i === 3) {\n\t\t\t\t// Floating point fix ;^)\n\t\t\t\tmaxSigned /= 1000;\n\t\t\t}\n\n\t\t\t// can't use !== or sizeof(void *) === 0.5\n\t\t\tif(type(maxSigned) != maxSigned) {\n\t\t\t\treturn Math.pow(2, i - 1);\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/*\n\t\tLogs a specific message sent to an instance of a class like logify.pl in theos\n\t\tRequires Cydia Substrate (com.saurik.substrate.MS) and NSLog (org.cycript.NSLog) modules\n\t\tReturns the old message returned by MS.hookMessage (Note: this is not just the old message!)\n\t\t\n\t\tUsage:\n\t\t\tcy# var oldm = utils.logify(objc_getMetaClass(NSNumber), @selector(numberWithDouble:))\n\t\t\t...\n\t\t\tcy# var n = [NSNumber numberWithDouble:1.5]\n\t\t\t2014-07-28 02:26:39.805 cycript[71213:507] +[<NSNumber: 0x10032d0c4> numberWithDouble:1.5]\n\t\t\t2014-07-28 02:26:39.806 cycript[71213:507]  = 1.5\n\t\t\t@1.5\n\t*/\n\tutils.logify = function(cls, sel) {\n\t\t@import com.saurik.substrate.MS;\n\t\t@import org.cycript.NSLog;\n\t\t\n\t\tvar oldm = {};\n\t\t\n\t\tMS.hookMessage(cls, sel, function() {\n\t\t\tvar args = [].slice.call(arguments);\n\t\t\t\n\t\t\tvar selFormat = sel.toString().replace(/:/g, \":%@ \").trim();\n\t\t\tvar logFormat = \"%@[<%@: 0x%@> \" + selFormat + \"]\";\n\t\t\t\n\t\t\tvar standardArgs = [logFormat, class_isMetaClass(cls)? \"+\": \"-\", cls.toString(), (&this).valueOf().toString(16)];\n\t\t\tvar logArgs = standardArgs.concat(args);\n\t\t\t\n\t\t\tNSLog.apply(null, logArgs);\n\t\t\t\n\t\t\tvar r = oldm->apply(this, arguments);\n\t\t\t\n\t\t\tif(r !== undefined) {\n\t\t\t\tNSLog(\" = %@\", r);\n\t\t\t}\n\t\t\t\n\t\t\treturn r;\n\t\t}, oldm);\n\t\t\n\t\treturn oldm;\n\t};\n\t\n\t/*\n\t\tCalls a C function by providing its name and arguments\n\t\tDoesn't support structs\n\t\tReturn value is always a void pointer\n\t\t\n\t\tUsage:\n\t\t\tcy# utils.apply(\"printf\", [\"%s %.3s, %d -> %c, float: %f\\n\", \"foo\", \"barrrr\", 97, 97, 1.5])\n\t\t\tfoo bar, 97 -> a, float: 1.500000\n\t\t\t0x22\n\t*/\n\tutils.apply = function(fun, args) {\n\t\tif(!(args instanceof Array)) {\n\t\t\tthrow \"Args needs to be an array!\";\n\t\t}\n\t\t\n\t\tvar argc = args.length;\n\t\tvar voidPtr = @encode(void *);\n\t\tvar argTypes = [];\n\t\tfor(var i = 0; i < argc; i++) {\n\t\t\tvar argType = voidPtr;\n\t\t\t\n\t\t\tvar arg = args[i];\n\t\t\tif(typeof arg === \"string\") {\n\t\t\t\targType = @encode(char *);\n\t\t\t}\n\t\t\tif(typeof arg === \"number\" && arg % 1 !== 0) {\n\t\t\t\targType = @encode(double);\n\t\t\t}\n\t\t\t\n\t\t\targTypes.push(argType);\n\t\t}\n\t\t\n\t\tvar type = voidPtr.functionWith.apply(voidPtr, argTypes);\n\t\t\n\t\tif(typeof fun === \"string\") {\n\t\t\tfun = dlsym(RTLD_DEFAULT, fun);\n\t\t}\n\t\t\n\t\tif(!fun) {\n\t\t\tthrow \"Function not found!\";\n\t\t}\n\n\t\treturn type(fun).apply(null, args);\n\t};\n\t\n\t/*\n\t\tConverts a string (char *) to a void pointer (void *)\n\t\tYou can't cast to strings to void pointers and vice versa in cycript. Blame saurik.\n\t\t\n\t\tUsage:\n\t\t\tcy# var voidPtr = utils.str2voidPtr(\"foobar\")\n\t\t\t0x100331590\n\t\t\tcy# utils.voidPtr2str(voidPtr)\n\t\t\t\"foobar\"\n\t*/\n\tutils.str2voidPtr = function(str) {\n\t\tvar strdup = @encode(void *(char *))(dlsym(RTLD_DEFAULT, \"strdup\"));\n\t\treturn strdup(str);\n\t};\n\t\n\t/*\n\t\tThe inverse function of str2voidPtr\n\t*/\n\tutils.voidPtr2str = function(voidPtr) {\n\t\tvar strdup = @encode(char *(void *))(dlsym(RTLD_DEFAULT, \"strdup\"));\n\t\treturn strdup(voidPtr);\n\t};\n\t\n\t/*\n\t\tConverts a double into a void pointer\n\t\tThis can be used to view the binary representation of a floating point number\n\t\t\n\t\tUsage:\n\t\t\tcy# var n = utils.double2voidPtr(-1.5)\n\t\t\t0xbff8000000000000\n\t\t\tcy# utils.voidPtr2double(n)\n\t\t\t-1.5\n\t*/\n\tutils.double2voidPtr = function(n) {\n\t\tvar doublePtr = new double;\n\t\t*doublePtr = n;\n\t\t\n\t\tvar voidPtrPtr = @encode(void **)(doublePtr);\n\t\t\n\t\treturn *voidPtrPtr;\n\t};\n\t\n\t/*\n\t\tThe inverse function of double2voidPtr\n\t*/\n\tutils.voidPtr2double = function(voidPtr) {\n\t\tvar voidPtrPtr = new @encode(void **);\n\t\t*voidPtrPtr = voidPtr;\n\t\t\n\t\tvar doublePtr = @encode(double *)(voidPtrPtr);\n\t\t\n\t\treturn *doublePtr;\n\t};\n\t\n\t/*\n\t\tDetermines in a safe way if a memory location is readable\n\t\t\n\t\tUsage:\n\t\t\tcy# utils.isMemoryReadable(0)\n\t\t\tfalse\n\t\t\tcy# utils.isMemoryReadable(0x1337)\n\t\t\tfalse\n\t\t\tcy# utils.isMemoryReadable(NSObject)\n\t\t\ttrue\n\t\t\tcy# var a = malloc(100); utils.isMemoryReadable(a)\n\t\t\ttrue\n\t*/\n\tutils.isMemoryReadable = function(ptr) {\n\t\tif(typeof ptr === \"string\") {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tvar fds = new @encode(int [2]);\n\t\tutils.apply(\"pipe\", [fds]);\n\t\tvar result = utils.apply(\"write\", [fds[1], ptr, 1]) == 1;\n\t\t\n\t\tutils.apply(\"close\", [fds[0]]);\n\t\tutils.apply(\"close\", [fds[1]]);\n\t\t\n\t\treturn result;\n\t};\n\t\n\t/*\n\t\tDetermines in a safe way if the memory location contains an Objective-C object\n\n\t\tUsage:\n\t\t\tcy# utils.isObject(0)\n\t\t\tfalse\n\t\t\tcy# utils.isObject(0x1337)\n\t\t\tfalse\n\t\t\tcy# utils.isObject(NSObject)\n\t\t\ttrue\n\t\t\tcy# utils.isObject(objc_getMetaClass(NSObject))\n\t\t\ttrue\n\t\t\tcy# utils.isObject([new NSObject init])\n\t\t\ttrue\n\t\t\tcy# var a = malloc(100); utils.isObject(a)\n\t\t\tfalse\n\t\t\tcy# *@encode(void **)(a) = NSObject; utils.isObject(a)\n\t\t\ttrue\n\t*/\n\tutils.isObject = function(obj) {\n\t\tobj = @encode(void *)(obj);\n\t\tvar lastObj = -1;\n\t\t\n\t\tfunction objc_isa_ptr(obj) {\n\t\t\t// See http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html\n\t\t\tvar objc_debug_isa_class_mask = 0x00000001fffffffa;\n\t\t\tobj = (obj & 1)? (obj & objc_debug_isa_class_mask): obj;\n\t\t\t\n\t\t\tif((obj & (utils.sizeof(@encode(void *)) - 1)) != 0) {\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\treturn obj;\n\t\t\t}\n\t\t}\n\t\t\n\t\tfunction ptrValue(obj) {\n\t\t\treturn obj? obj.valueOf(): null;\n\t\t}\n\t\t\n\t\tvar foundMetaClass = false;\n\t\t\n\t\tfor(obj = objc_isa_ptr(obj); utils.isMemoryReadable(obj); ) {\n\t\t\tobj = *@encode(void **)(obj);\n\t\t\t\n\t\t\tif(ptrValue(obj) == ptrValue(lastObj)) {\n\t\t\t\tfoundMetaClass = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tlastObj = obj;\n\t\t}\n\t\t\n\t\tif(!foundMetaClass) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tif(lastObj === -1 || lastObj === null) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tvar obj_class = objc_isa_ptr(@encode(void **)(obj)[1]);\n\t\t\n\t\tif(!utils.isMemoryReadable(obj_class)) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tvar metaclass = objc_isa_ptr(@encode(void **)(obj_class)[0]);\n\t\tvar superclass = objc_isa_ptr(@encode(void **)(obj_class)[1]);\n\t\t\n\t\treturn ptrValue(obj) == ptrValue(metaclass) && superclass == null;\n\t};\n\t\n\t/*\n\t\tCreates a cycript struct type from a C struct definition\n\t\t\n\t\tUsage:\n\t\t\tcy# var foo = makeStruct(\"int a; short b; char c; uint64_t d; double e;\", \"foo\");\n\t\t\t@encode(foo)\n\t\t\tcy# var f = new foo\n\t\t\t&{a:0,b:0,c:0,d:0,e:0}\n\t\t\tcy# f->a = 100; f\n\t\t\t&{a:100,b:0,c:0,d:0,e:0}\n\t\t\tcy# *@encode(int *)(f)\n\t\t\t100\n\t*/\n\tutils.makeStruct = function(str, name) {\t\t\n\t\tvar fieldRe = /(?:\\s|\\n)*([^;]+\\s*(?:\\s|\\*))([^;]+)\\s*;/g;\n\t\t\n\t\tif(!name) {\n\t\t\tname = \"struct\" + Math.floor(Math.random() * 100000);\n\t\t}\n\t\tvar typeStr = \"{\" + name + \"=\";\n\t\t\n\t\twhile((match = fieldRe.exec(str)) !== null) {\n\t\t\tvar fieldType = utils.applyTypedefs(match[1]);\n\t\t\tvar fieldName = match[2];\n\t\t\tvar encodedType = utils.exec(\"@encode(\" + fieldType + \")\").toString();\n\t\t\t\n\t\t\ttypeStr += '\"' + fieldName + '\"' + encodedType;\n\t\t}\n\t\t\n\t\ttypeStr += \"}\";\n\t\t\n\t\treturn new Type(typeStr);\n\t};\n\t\n\t// Various constants\n\tutils.constants = {\n\t\tVM_PROT_NONE:       0x0,\n\t\tVM_PROT_READ:       0x1,\n\t\tVM_PROT_WRITE:      0x2,\n\t\tVM_PROT_EXECUTE:    0x4,\n\t\tVM_PROT_NO_CHANGE:  0x8,\n\t\tVM_PROT_COPY:       0x10,\n\t\tVM_PROT_WANTS_COPY: 0x10,\n\t\tVM_PROT_IS_MASK:    0x40,\n\t};\n\tvar c = utils.constants;\n\tc.VM_PROT_DEFAULT = c.VM_PROT_READ | c.VM_PROT_WRITE;\n\tc.VM_PROT_ALL =     c.VM_PROT_READ | c.VM_PROT_WRITE | c.VM_PROT_EXECUTE;\n\t\n\tif(shouldExposeConsts) {\n\t\tfor(var k in c) {\n\t\t\tCycript.all[k] = c[k];\n\t\t}\n\t}\n\t\n\tif(shouldExposeFuncs) {\n\t\tfor(var i = 0; i < funcsToExpose.length; i++) {\n\t\t\tvar name = funcsToExpose[i];\n\t\t\tCycript.all[name] = utils[name];\n\t\t}\n\t}\n\t\n\tif(shouldLoadCFuncs) {\n\t\tutils.loadfuncs(shouldExposeCFuncs);\n\t}\n})(exports);\n"
  },
  {
    "path": "src/test/resources/samples/langs/D/aa.d",
    "content": "/**\n * Implementation of associative arrays.\n *\n * Copyright: Martin Nowak 2015 -.\n * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)\n * Authors:   Martin Nowak\n */\nmodule core.aa;\n\nimport core.memory : GC;\n\nprivate\n{\n    // grow threshold\n    enum GROW_NUM = 4;\n    enum GROW_DEN = 5;\n    // shrink threshold\n    enum SHRINK_NUM = 1;\n    enum SHRINK_DEN = 8;\n    // grow factor\n    enum GROW_FAC = 4;\n    // growing the AA doubles it's size, so the shrink threshold must be\n    // smaller than half the grow threshold to have a hysteresis\n    static assert(GROW_FAC * SHRINK_NUM * GROW_DEN < GROW_NUM * SHRINK_DEN);\n    // initial load factor (for literals), mean of both thresholds\n    enum INIT_NUM = (GROW_DEN * SHRINK_NUM + GROW_NUM * SHRINK_DEN) / 2;\n    enum INIT_DEN = SHRINK_DEN * GROW_DEN;\n\n    // magic hash constants to distinguish empty, deleted, and filled buckets\n    enum HASH_EMPTY = 0;\n    enum HASH_DELETED = 0x1;\n    enum HASH_FILLED_MARK = size_t(1) << 8 * size_t.sizeof - 1;\n}\n\nenum INIT_NUM_BUCKETS = 8;\n\nstruct AA(Key, Val)\n{\n    this(size_t sz)\n    {\n        impl = new Impl(nextpow2(sz));\n    }\n\n    @property bool empty() const pure nothrow @safe @nogc\n    {\n        return !length;\n    }\n\n    @property size_t length() const pure nothrow @safe @nogc\n    {\n        return impl is null ? 0 : impl.length;\n    }\n\n    void opIndexAssign(Val val, in Key key)\n    {\n        // lazily alloc implementation\n        if (impl is null)\n            impl = new Impl(INIT_NUM_BUCKETS);\n\n        // get hash and bucket for key\n        immutable hash = calcHash(key);\n\n        // found a value => assignment\n        if (auto p = impl.findSlotLookup(hash, key))\n        {\n            p.entry.val = val;\n            return;\n        }\n\n        auto p = findSlotInsert(hash);\n        if (p.deleted)\n            --deleted;\n        // check load factor and possibly grow\n        else if (++used * GROW_DEN > dim * GROW_NUM)\n        {\n            grow();\n            p = findSlotInsert(hash);\n            assert(p.empty);\n        }\n\n        // update search cache and allocate entry\n        firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr));\n        p.hash = hash;\n        p.entry = new Impl.Entry(key, val); // TODO: move\n        return;\n    }\n\n    ref inout(Val) opIndex(in Key key) inout @trusted\n    {\n        auto p = opIn_r(key);\n        assert(p !is null);\n        return *p;\n    }\n\n    inout(Val)* opIn_r(in Key key) inout @trusted\n    {\n        if (empty)\n            return null;\n\n        immutable hash = calcHash(key);\n        if (auto p = findSlotLookup(hash, key))\n            return &p.entry.val;\n        return null;\n    }\n\n    bool remove(in Key key)\n    {\n        if (empty)\n            return false;\n\n        immutable hash = calcHash(key);\n        if (auto p = findSlotLookup(hash, key))\n        {\n            // clear entry\n            p.hash = HASH_DELETED;\n            p.entry = null;\n\n            ++deleted;\n            if (length * SHRINK_DEN < dim * SHRINK_NUM)\n                shrink();\n\n            return true;\n        }\n        return false;\n    }\n\n    Val get(in Key key, lazy Val val)\n    {\n        auto p = opIn_r(key);\n        return p is null ? val : *p;\n    }\n\n    ref Val getOrSet(in Key key, lazy Val val)\n    {\n        // lazily alloc implementation\n        if (impl is null)\n            impl = new Impl(INIT_NUM_BUCKETS);\n\n        // get hash and bucket for key\n        immutable hash = calcHash(key);\n\n        // found a value => assignment\n        if (auto p = impl.findSlotLookup(hash, key))\n            return p.entry.val;\n\n        auto p = findSlotInsert(hash);\n        if (p.deleted)\n            --deleted;\n        // check load factor and possibly grow\n        else if (++used * GROW_DEN > dim * GROW_NUM)\n        {\n            grow();\n            p = findSlotInsert(hash);\n            assert(p.empty);\n        }\n\n        // update search cache and allocate entry\n        firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr));\n        p.hash = hash;\n        p.entry = new Impl.Entry(key, val);\n        return p.entry.val;\n    }\n\n    /**\n       Convert the AA to the type of the builtin language AA.\n     */\n    Val[Key] toBuiltinAA() pure nothrow\n    {\n        return cast(Val[Key]) _aaFromCoreAA(impl, rtInterface);\n    }\n\nprivate:\n\n    private this(inout(Impl)* impl) inout\n    {\n        this.impl = impl;\n    }\n\n    ref Val getLValue(in Key key)\n    {\n        // lazily alloc implementation\n        if (impl is null)\n            impl = new Impl(INIT_NUM_BUCKETS);\n\n        // get hash and bucket for key\n        immutable hash = calcHash(key);\n\n        // found a value => assignment\n        if (auto p = impl.findSlotLookup(hash, key))\n            return p.entry.val;\n\n        auto p = findSlotInsert(hash);\n        if (p.deleted)\n            --deleted;\n        // check load factor and possibly grow\n        else if (++used * GROW_DEN > dim * GROW_NUM)\n        {\n            grow();\n            p = findSlotInsert(hash);\n            assert(p.empty);\n        }\n\n        // update search cache and allocate entry\n        firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr));\n        p.hash = hash;\n        p.entry = new Impl.Entry(key); // TODO: move\n        return p.entry.val;\n    }\n\n    static struct Impl\n    {\n        this(size_t sz)\n        {\n            buckets = allocBuckets(sz);\n        }\n\n        @property size_t length() const pure nothrow @nogc\n        {\n            assert(used >= deleted);\n            return used - deleted;\n        }\n\n        @property size_t dim() const pure nothrow @nogc\n        {\n            return buckets.length;\n        }\n\n        @property size_t mask() const pure nothrow @nogc\n        {\n            return dim - 1;\n        }\n\n        // find the first slot to insert a value with hash\n        inout(Bucket)* findSlotInsert(size_t hash) inout pure nothrow @nogc\n        {\n            for (size_t i = hash & mask, j = 1;; ++j)\n            {\n                if (!buckets[i].filled)\n                    return &buckets[i];\n                i = (i + j) & mask;\n            }\n        }\n\n        // lookup a key\n        inout(Bucket)* findSlotLookup(size_t hash, in Key key) inout\n        {\n            for (size_t i = hash & mask, j = 1;; ++j)\n            {\n                if (buckets[i].hash == hash && key == buckets[i].entry.key)\n                    return &buckets[i];\n                else if (buckets[i].empty)\n                    return null;\n                i = (i + j) & mask;\n            }\n        }\n\n        void grow()\n        {\n            // If there are so many deleted entries, that growing would push us\n            // below the shrink threshold, we just purge deleted entries instead.\n            if (length * SHRINK_DEN < GROW_FAC * dim * SHRINK_NUM)\n                resize(dim);\n            else\n                resize(GROW_FAC * dim);\n        }\n\n        void shrink()\n        {\n            if (dim > INIT_NUM_BUCKETS)\n                resize(dim / GROW_FAC);\n        }\n\n        void resize(size_t ndim) pure nothrow\n        {\n            auto obuckets = buckets;\n            buckets = allocBuckets(ndim);\n\n            foreach (ref b; obuckets)\n                if (b.filled)\n                    *findSlotInsert(b.hash) = b;\n\n            firstUsed = 0;\n            used -= deleted;\n            deleted = 0;\n            GC.free(obuckets.ptr); // safe to free b/c impossible to reference\n        }\n\n        static struct Entry\n        {\n            Key key;\n            Val val;\n        }\n\n        static struct Bucket\n        {\n            size_t hash;\n            Entry* entry;\n\n            @property bool empty() const\n            {\n                return hash == HASH_EMPTY;\n            }\n\n            @property bool deleted() const\n            {\n                return hash == HASH_DELETED;\n            }\n\n            @property bool filled() const\n            {\n                return cast(ptrdiff_t) hash < 0;\n            }\n        }\n\n        Bucket[] allocBuckets(size_t dim) @trusted pure nothrow\n        {\n            enum attr = GC.BlkAttr.NO_INTERIOR;\n            immutable sz = dim * Bucket.sizeof;\n            return (cast(Bucket*) GC.calloc(sz, attr))[0 .. dim];\n        }\n\n        Bucket[] buckets;\n        uint used;\n        uint deleted;\n        uint firstUsed;\n    }\n\n    RTInterface* rtInterface()() pure nothrow @nogc\n    {\n        static size_t aaLen(in void* pimpl) pure nothrow @nogc\n        {\n            auto aa = const(AA)(cast(const(Impl)*) pimpl);\n            return aa.length;\n        }\n\n        static void* aaGetY(void** pimpl, in void* pkey)\n        {\n            auto aa = AA(cast(Impl*)*pimpl);\n            auto res = &aa.getLValue(*cast(const(Key*)) pkey);\n            *pimpl = aa.impl; // might have changed\n            return res;\n        }\n\n        static inout(void)* aaInX(inout void* pimpl, in void* pkey)\n        {\n            auto aa = inout(AA)(cast(inout(Impl)*) pimpl);\n            return aa.opIn_r(*cast(const(Key*)) pkey);\n        }\n\n        static bool aaDelX(void* pimpl, in void* pkey)\n        {\n            auto aa = AA(cast(Impl*) pimpl);\n            return aa.remove(*cast(const(Key*)) pkey);\n        }\n\n        static immutable vtbl = RTInterface(&aaLen, &aaGetY, &aaInX, &aaDelX);\n        return cast(RTInterface*)&vtbl;\n    }\n\n    static size_t calcHash(in ref Key key)\n    {\n        return hashOf(key) | HASH_FILLED_MARK;\n    }\n\n    Impl* impl;\n    alias impl this;\n}\n\npackage extern (C) void* _aaFromCoreAA(void* impl, RTInterface* rtIntf) pure nothrow;\n\nprivate:\n\nstruct RTInterface\n{\n    alias AA = void*;\n\n    size_t function(in AA aa) pure nothrow @nogc len;\n    void* function(AA* aa, in void* pkey) getY;\n    inout(void)* function(inout AA aa, in void* pkey) inX;\n    bool function(AA aa, in void* pkey) delX;\n}\n\nunittest\n{\n    AA!(int, int) aa;\n    assert(aa.length == 0);\n    aa[0] = 1;\n    assert(aa.length == 1 && aa[0] == 1);\n    aa[1] = 2;\n    assert(aa.length == 2 && aa[1] == 2);\n    import core.stdc.stdio;\n\n    int[int] rtaa = aa.toBuiltinAA();\n    assert(rtaa.length == 2);\n    puts(\"length\");\n    assert(rtaa[0] == 1);\n    assert(rtaa[1] == 2);\n    rtaa[2] = 3;\n\n    assert(aa[2] == 3);\n}\n\nunittest\n{\n    auto aa = AA!(int, int)(3);\n    aa[0] = 0;\n    aa[1] = 1;\n    aa[2] = 2;\n    assert(aa.length == 3);\n}\n\n//==============================================================================\n// Helper functions\n//------------------------------------------------------------------------------\n\nsize_t nextpow2(in size_t n) pure nothrow @nogc\n{\n    import core.bitop : bsr;\n\n    if (n < 2)\n        return 1;\n    return size_t(1) << bsr(n - 1) + 1;\n}\n\npure nothrow @nogc unittest\n{\n    //                            0, 1, 2, 3, 4, 5, 6, 7, 8,  9\n    foreach (const n, const pow2; [1, 1, 2, 4, 4, 8, 8, 8, 8, 16])\n        assert(nextpow2(n) == pow2);\n}\n\nT min(T)(T a, T b) pure nothrow @nogc\n{\n    return a < b ? a : b;\n}\n\nT max(T)(T a, T b) pure nothrow @nogc\n{\n    return b < a ? a : b;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/D/arrayops.d",
    "content": "/**\n * Benchmark for array ops.\n *\n * Copyright: Copyright Martin Nowak 2016 -.\n * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)\n * Authors:   Martin Nowak\n */\nimport core.cpuid, std.algorithm, std.datetime, std.meta, std.stdio, std.string,\n    std.range;\n\nfloat[6] getLatencies(T, string op)()\n{\n    enum N = (64 * (1 << 6) + 64) * T.sizeof;\n    auto a = Array!T(N), b = Array!T(N), c = Array!T(N);\n    float[6] latencies = float.max;\n    foreach (i, ref latency; latencies)\n    {\n        auto len = 1 << i;\n        foreach (_; 1 .. 32)\n        {\n            a[] = 24;\n            b[] = 4;\n            c[] = 2;\n            auto sw = StopWatch(AutoStart.yes);\n            foreach (off; size_t(0) .. size_t(64))\n            {\n                off = off * len + off;\n                enum op = op.replace(\"const\", \"2\").replace(\"a\",\n                        \"a[off .. off + len]\").replace(\"b\",\n                        \"b[off .. off + len]\").replace(\"c\", \"c[off .. off + len]\");\n                mixin(op ~ \";\");\n            }\n            latency = min(latency, sw.peek.nsecs);\n        }\n    }\n    float[6] res = latencies[] / 1024;\n    return res;\n}\n\nfloat[4] getThroughput(T, string op)()\n{\n    enum N = (40 * 1024 * 1024 + 64 * T.sizeof) / T.sizeof;\n    auto a = Array!T(N), b = Array!T(N), c = Array!T(N);\n    float[4] latencies = float.max;\n    size_t[4] lengths = [\n        8 * 1024 / T.sizeof, 32 * 1024 / T.sizeof, 512 * 1024 / T.sizeof, 32 * 1024 * 1024 / T\n        .sizeof\n    ];\n    foreach (i, ref latency; latencies)\n    {\n        auto len = lengths[i] / 64;\n        foreach (_; 1 .. 4)\n        {\n            a[] = 24;\n            b[] = 4;\n            c[] = 2;\n            auto sw = StopWatch(AutoStart.yes);\n            foreach (off; size_t(0) .. size_t(64))\n            {\n                off = off * len + off;\n                enum op = op.replace(\"const\", \"2\").replace(\"a\",\n                        \"a[off .. off + len]\").replace(\"b\",\n                        \"b[off .. off + len]\").replace(\"c\", \"c[off .. off + len]\");\n                mixin(op ~ \";\");\n            }\n            immutable nsecs = sw.peek.nsecs;\n            runMasked({latency = min(latency, nsecs);});\n        }\n    }\n    float[4] throughputs = void;\n    runMasked({throughputs = T.sizeof * lengths[] / latencies[];});\n    return throughputs;\n}\n\nstring[] genOps()\n{\n    string[] ops;\n    foreach (op1; [\"+\", \"-\", \"*\", \"/\"])\n    {\n        ops ~= \"a \" ~ op1 ~ \"= b\";\n        ops ~= \"a \" ~ op1 ~ \"= const\";\n        foreach (op2; [\"+\", \"-\", \"*\", \"/\"])\n        {\n            ops ~= \"a \" ~ op1 ~ \"= b \" ~ op2 ~ \" c\";\n            ops ~= \"a \" ~ op1 ~ \"= b \" ~ op2 ~ \" const\";\n        }\n    }\n    return ops;\n}\n\nvoid runOp(string op)()\n{\n    foreach (T; AliasSeq!(ubyte, ushort, uint, ulong, byte, short, int, long, float,\n            double))\n        writefln(\"%s, %s, %(%.2f, %), %(%s, %)\", T.stringof, op,\n            getLatencies!(T, op), getThroughput!(T, op));\n}\n\nstruct Array(T)\n{\n    import core.stdc.stdlib : free, malloc;\n\n    this(size_t n)\n    {\n        ary = (cast(T*) malloc(T.sizeof * n))[0 .. n];\n    }\n\n    ~this()\n    {\n        free(ary.ptr);\n    }\n\n    T[] ary;\n    alias ary this;\n}\n\nversion (X86)\n    version = SSE;\nelse version (X86_64)\n    version = SSE;\nelse\n    static assert(0, \"unimplemented\");\n\nversion (SSE)\n{\n    uint mxcsr()\n    {\n        uint ret = void;\n        asm\n        {\n            stmxcsr ret;\n        }\n        return ret;\n    }\n\n    void mxcsr(uint val)\n    {\n        asm\n        {\n            ldmxcsr val;\n        }\n    }\n\n    // http://softpixel.com/~cwright/programming/simd/sse.php\n    enum FPU_EXCEPTION_MASKS = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 7;\n    enum FPU_EXCEPTION_FLAGS = 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0;\n\n    void maskFPUExceptions()\n    {\n        mxcsr = mxcsr | FPU_EXCEPTION_MASKS;\n    }\n\n    void unmaskFPUExceptions()\n    {\n        mxcsr = mxcsr & ~FPU_EXCEPTION_MASKS;\n    }\n\n    uint FPUExceptionFlags()\n    {\n        return mxcsr & FPU_EXCEPTION_FLAGS;\n    }\n\n    void clearFPUExceptionFlags()\n    {\n        mxcsr = mxcsr & ~FPU_EXCEPTION_FLAGS;\n    }\n}\n\nvoid runMasked(scope void delegate() dg)\n{\n    assert(FPUExceptionFlags == 0);\n    maskFPUExceptions;\n    dg();\n    clearFPUExceptionFlags;\n    unmaskFPUExceptions;\n}\n\nvoid main()\n{\n    unmaskFPUExceptions;\n\n    writefln(\"type, op, %(latency%s, %), %-(throughput%s, %)\", iota(6)\n        .map!(i => 1 << i), [\"8KB\", \"32KB\", \"512KB\", \"32MB\"]);\n    foreach (op; mixin(\"AliasSeq!(%(%s, %))\".format(genOps)))\n        runOp!op;\n    maskFPUExceptions;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/D/function.d",
    "content": "void foo()\n{\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/D/hello_world.d",
    "content": "import std.stdio;\n\nvoid main()\n{\n    writeln(\"Hello World\");\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/D/mpq.d",
    "content": "/*\n *  mpq.d -- D programming language module for libmpq\n *\n *  Copyright (c) 2008 Georg Lukas <georg@op-co.de>\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *\n *  This module is written to support Phobos. Patches to allow binding to\n *  Tango are welcome.\n */\n\nmodule mpq;\n\n/* the following pragma does not work on DMD/Linux, generates a warning on\n * GDC/Linux and has not been tested on Windows. Commented out for now. */\n// pragma(lib, \"libmpq\");\n\nimport std.string; // for format() and toStringz()\nimport std.traits; // for ParameterTypeTuple!()\n\n/* XXX: this assumes that libmpq is compiled with Large File Support on */\nalias long off_t;\n\n/* libmpq error return values */\nconst LIBMPQ_ERROR_OPEN\t\t\t= -1;\t/* open error on file. */\nconst LIBMPQ_ERROR_CLOSE\t\t= -2;\t/* close error on file. */\nconst LIBMPQ_ERROR_SEEK\t\t\t= -3;\t/* lseek error on file. */\nconst LIBMPQ_ERROR_READ\t\t\t= -4;\t/* read error on file. */\nconst LIBMPQ_ERROR_WRITE\t\t= -5;\t/* write error on file. */\nconst LIBMPQ_ERROR_MALLOC\t\t= -6;\t/* memory allocation error. */\nconst LIBMPQ_ERROR_FORMAT\t\t= -7;\t/* format errror. */\nconst LIBMPQ_ERROR_NOT_INITIALIZED\t= -8;\t/* init() wasn't called. */\nconst LIBMPQ_ERROR_SIZE\t\t\t= -9;\t/* buffer size is to small. */\nconst LIBMPQ_ERROR_EXIST\t\t= -10;\t/* file or block does not exist in archive. */\nconst LIBMPQ_ERROR_DECRYPT\t\t= -11;\t/* we don't know the decryption seed. */\nconst LIBMPQ_ERROR_UNPACK\t\t= -12;\t/* error on unpacking file. */\n\n/** libmpq internal meta-data for an archive */\nextern struct mpq_archive_s;\n\nextern(C) {\n\n/* libmpq__generic information about library. */\nchar *libmpq__version();\n\n/* libmpq__generic mpq archive information. */\nint libmpq__archive_open(mpq_archive_s **mpq_archive, char *mpq_filename, off_t archive_offset);\nint libmpq__archive_close(mpq_archive_s *mpq_archive);\nint libmpq__archive_packed_size(mpq_archive_s *mpq_archive, off_t *packed_size);\nint libmpq__archive_unpacked_size(mpq_archive_s *mpq_archive, off_t *unpacked_size);\nint libmpq__archive_offset(mpq_archive_s *mpq_archive, off_t *offset);\nint libmpq__archive_version(mpq_archive_s *mpq_archive, uint *version_);\nint libmpq__archive_files(mpq_archive_s *mpq_archive, uint *files);\n\n/* libmpq__generic file processing functions. */\nint libmpq__file_packed_size(mpq_archive_s *mpq_archive, uint file_number, off_t *packed_size);\nint libmpq__file_unpacked_size(mpq_archive_s *mpq_archive, uint file_number, off_t *unpacked_size);\nint libmpq__file_offset(mpq_archive_s *mpq_archive, uint file_number, off_t *offset);\nint libmpq__file_blocks(mpq_archive_s *mpq_archive, uint file_number, uint *blocks);\nint libmpq__file_encrypted(mpq_archive_s *mpq_archive, uint file_number, uint *encrypted);\nint libmpq__file_compressed(mpq_archive_s *mpq_archive, uint file_number, uint *compressed);\nint libmpq__file_imploded(mpq_archive_s *mpq_archive, uint file_number, uint *imploded);\nint libmpq__file_number(mpq_archive_s *mpq_archive, char *filename, uint *number);\nint libmpq__file_read(mpq_archive_s *mpq_archive, uint file_number, ubyte *out_buf, off_t out_size, off_t *transferred);\n\n/* libmpq__generic block processing functions. */\nint libmpq__block_open_offset(mpq_archive_s *mpq_archive, uint file_number);\nint libmpq__block_close_offset(mpq_archive_s *mpq_archive, uint file_number);\nint libmpq__block_unpacked_size(mpq_archive_s *mpq_archive, uint file_number, uint block_number, off_t *unpacked_size);\nint libmpq__block_read(mpq_archive_s *mpq_archive, uint file_number, uint block_number, ubyte *out_buf, off_t out_size, off_t *transferred);\n\n}\n\n\n/** exception class for failed libmpq calls */\nclass MPQException : Exception {\n\tconst string[] Errors = [\n\t\t\"unknown error\",\n\t\t\"open error on file\",\n\t\t\"close error on file\",\n\t\t\"lseek error on file\",\n\t\t\"read error on file\",\n\t\t\"write error on file\",\n\t\t\"memory allocation error\",\n\t\t\"format errror\",\n\t\t\"init() wasn't called\",\n\t\t\"buffer size is to small\",\n\t\t\"file or block does not exist in archive\",\n\t\t\"we don't know the decryption seed\",\n\t\t\"error on unpacking file\"];\n\n\tpublic int errno;\n\tthis(char[] fnname = \"unknown_function\", int errno = 0) {\n\n\t\tthis.errno = errno;\n\t\tif (-errno >= Errors.length)\n\t\t\terrno = 0;\n\t\tsuper(std.string.format(\"Error in %s(): %s (%d)\",\n\t\t\t\t\tfnname, Errors[-errno], errno));\n\t}\n}\n\n\n/** template to wrap function calls and throw exceptions in case of error\n *\n * thanks for the idea to while(nan) blog,\n * http://while-nan.blogspot.com/2007/06/wrapping-functions-for-fun-and-profit.html\n *\n * use: MPQ_CHECKERR(libmpq__archive_open)(&m, \"foo.mpq\", -1);\n *   returns the retval of archive_open on success;\n *   throws an MPQException on failure.\n *\n * @param Fn libmpq__function reference\n * @param args libmpq__function parameters\n * @return return value of libmpq__function on success\n * @throw MPQException on error\n */\nint MPQ_CHECKERR(alias Fn)(ParameterTypeTuple!(Fn) args)\n{\n\tint result = Fn(args);\n\tif (result < 0) {\n\t\t/* XXX: relying on non-specified stringof() behaviour */\n\t\tthrow new MPQException((&Fn).stringof[2..$], result);\n\t}\n        return result;\n}\n\n\n/** mixin alias to wrap library functions into MPQ_CHECKERR.\n *\n * alias mpq.func_name(...) to MPQ_CHECKERR(libmpq__func_name)(...)\n * @param func_name name of the function to be wrapped\n */\ntemplate MPQ_FUNC(char[] func_name) {\n\tconst char[] MPQ_FUNC = \"alias MPQ_CHECKERR!(libmpq__\" ~ func_name ~ \") \" ~ func_name ~ \";\";\n}\n\nalias libmpq__version libversion; /* must be direct alias because it returns char*, not error int */\nmixin(MPQ_FUNC!(\"archive_open\"));\nmixin(MPQ_FUNC!(\"archive_close\"));\nmixin(MPQ_FUNC!(\"archive_packed_size\"));\nmixin(MPQ_FUNC!(\"archive_unpacked_size\"));\nmixin(MPQ_FUNC!(\"archive_offset\"));\nmixin(MPQ_FUNC!(\"archive_version\"));\nmixin(MPQ_FUNC!(\"archive_files\"));\nmixin(MPQ_FUNC!(\"file_packed_size\"));\nmixin(MPQ_FUNC!(\"file_unpacked_size\"));\nmixin(MPQ_FUNC!(\"file_offset\"));\nmixin(MPQ_FUNC!(\"file_blocks\"));\nmixin(MPQ_FUNC!(\"file_encrypted\"));\nmixin(MPQ_FUNC!(\"file_compressed\"));\nmixin(MPQ_FUNC!(\"file_imploded\"));\nmixin(MPQ_FUNC!(\"file_number\"));\nmixin(MPQ_FUNC!(\"file_read\"));\nmixin(MPQ_FUNC!(\"block_open_offset\"));\nmixin(MPQ_FUNC!(\"block_close_offset\"));\nmixin(MPQ_FUNC!(\"block_unpacked_size\"));\nmixin(MPQ_FUNC!(\"block_read\"));\n\n/** getter function named name for returning archive_* single values:\n *\n *   <type> Archive.<name>() { return libmpq__archive_<name>() }\n *\n * @param type return type for the original function reference\n * @param name name of the original function\n * @param name2 name for the prototype (defaults to name, used for \"version\")\n * @return getter function mixin\n */\ntemplate MPQ_A_GET(char[] type, char[] name, char[] name2 = name) {\n\tconst char[] MPQ_A_GET = type ~ \" \" ~ name2 ~ \"() { \" ~\n\t\t\ttype ~ \" ret; \" ~\n\t\t\t\"archive_\" ~ name ~ \"(m, &ret); return ret;\" ~\n\t\t\"}\";\n}\n\n/** wrapper class for an MPQ Archive\n *\n * syntax: auto a = new mpq.Archive(\"somefile.mpq\");\n */\nclass Archive {\n\tmpq_archive_s *m;\n\tFile listfile;\n\tchar[][] listfiledata;\n\n\tthis(char[] archivename, off_t offset = -1) {\n\t\tarchive_open(&m, toStringz(archivename), offset);\n\t}\n\n\tmixin(MPQ_A_GET!(\"off_t\", \"packed_size\"));\n\tmixin(MPQ_A_GET!(\"off_t\", \"unpacked_size\"));\n\tmixin(MPQ_A_GET!(\"off_t\", \"offset\"));\n\tmixin(MPQ_A_GET!(\"uint\", \"version\", \"version_\"));\n\tmixin(MPQ_A_GET!(\"uint\", \"files\"));\n\n\t~this() {\n\t\tarchive_close(m);\n\t}\n\n\tmpq_archive_s* archive() {\n\t\treturn m;\n\t}\n\n\tFile opIndex(char[] fname) {\n\t\treturn new File(this, fname);\n\t}\n\tFile opIndex(int fno) {\n\t\treturn new File(this, fno);\n\t}\n\n\tchar[][] filelist() {\n\t\ttry {\n\t\t\tif (!listfile) {\n\t\t\t\tlistfile = this[\"(listfile)\"];\n\t\t\t\tlistfiledata = (cast(char[])listfile.read()).splitlines();\n\t\t\t}\n\t\t\treturn listfiledata;\n\t\t} catch (MPQException e) {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/+uint filenumber(char[] filename) {\n\t\ttry {\n\t\t\tif (!listfile) {\n\t\t\t\tlistfile = this[\"(listfile)\"];\n\t\t\t\tlistfiledata = (cast(char[])listfile.read()).splitlines();\n\t\t\t}\n\t\t\treturn listfiledata;\n\t\t} catch (MPQException e) {\n\t\t\treturn [];\n\t\t}\n\t}+/\n\n}\n\n\n/** getter function named name for returning file_* single values:\n *\n *   <type> File.<name>() { return libmpq__file_<name>() }\n *\n * @param type return type for the original function reference\n * @param name name of the original function\n * @param name2 name for the prototype (defaults to name, used for \"version\")\n * @return getter function mixin\n */\ntemplate MPQ_F_GET(char[] type, char[] name, char[] name2 = name) {\n\tconst char[] MPQ_F_GET = type ~ \" \" ~ name2 ~ \"() { \" ~\n\t\t\ttype ~ \" ret; \" ~\n\t\t\t\"file_\" ~ name ~ \"(am, fileno, &ret); \" ~\n\t\t\t\"return ret;\" ~\n\t\t\"}\";\n}\n\n/** wrapper class for a single file in an MPQ Archive\n *\n * syntax:\n *    auto a = new mpq.Archive(\"somefile.mpq\");\n *    auto f = a[\"(listfile)\"];\n *    auto f2 = a[0];\n *    auto f3 = new File(a, \"(listfile)\");\n */\nclass File {\n\tArchive a;\n\tmpq_archive_s* am;\n\tchar[] filename;\n\tuint fileno;\n\n\tthis(Archive a, int fileno) {\n\t\tthis.a = a;\n\t\tthis.am = a.archive();\n\t\tif (fileno >= a.files) {\n\t\t\tthrow new MPQException(format(\"File(%d)\", fileno),\n\t\t\t\tLIBMPQ_ERROR_EXIST);\n\t\t}\n\t\tthis.filename = format(\"file%04d.xxx\", fileno);\n\t\tthis.fileno = fileno;\n\t}\n\n\tthis(Archive a, char[] filename) {\n\t\tthis.a = a;\n\t\tthis.am = a.archive();\n\t\tthis.filename = filename;\n\t\t/* this line will throw an exception when the file is not there */\n\t\tmpq.file_number(am, toStringz(filename), &this.fileno);\n\t}\n\n\tmixin(MPQ_F_GET!(\"off_t\", \"packed_size\"));\n\tmixin(MPQ_F_GET!(\"off_t\", \"unpacked_size\"));\n\tmixin(MPQ_F_GET!(\"off_t\", \"offset\"));\n\tmixin(MPQ_F_GET!(\"uint\", \"blocks\"));\n\tmixin(MPQ_F_GET!(\"uint\", \"encrypted\"));\n\tmixin(MPQ_F_GET!(\"uint\", \"compressed\"));\n\tmixin(MPQ_F_GET!(\"uint\", \"imploded\"));\n\n\tuint no() {\treturn fileno; }\n\tchar[] name() {\treturn filename; }\n\n\tubyte[] read() {\n\t\tubyte[] content;\n\t\tcontent.length = this.unpacked_size();\n\t\toff_t trans;\n\t\tmpq.file_read(am, fileno, content.ptr, content.length, &trans);\n\t\tcontent.length = trans;\n\t\treturn content;\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/D/template.d",
    "content": "template Fib(size_t N)\n{\n    static if (N < 2)\n        enum Fib = size_t(1);\n    else\n        enum Fib = Fib!(N - 2) + Fib!(N - 1);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/D/template_function.d",
    "content": "void bar(T)(T t)\n{\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/D/unittest1.d",
    "content": "unittest\n{\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/D/unittest2.d",
    "content": "unittest(\"optional name\")\n{\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/DIGITAL Command Language/fis_gtm_kitinstal.com",
    "content": "$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n$!\t\t\t\t\t\t\t\t!\n$!\tCopyright 2001, 2011 Fidelity Information Services, Inc\t!\n$!\t\t\t\t\t\t\t\t!\n$!\tThis source code contains the intellectual property\t!\n$!\tof its copyright holder(s), and is made available\t!\n$!\tunder a license.  If you do not know the terms of\t!\n$!\tthe license, please stop and do not read further.\t!\n$!\t\t\t\t\t\t\t\t!\n$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n$!\n$!\n$!\tKITINSTAL.COM PROCEDURE FOR THE GT.M PRODUCT\n$!\n$ ON CONTROL_Y THEN VMI$CALLBACK CONTROL_Y\n$! ON WARNING THEN EXIT $STATUS !! allow warning errors for INSTALL REPLACE\n$ IF P1 .EQS. \"VMI$_INSTALL\" THEN GOTO INSTALL\n$ IF P1 .EQS. \"VMI$_POSTINSTALL\" THEN GOTO POSTINSTALL\n$ IF P1 .EQS. \"VMI$_IVP\" THEN GOTO IVP\n$ EXIT VMI$_UNSUPPORTED\n$!\n$INSTALL:\n$ TYPE SYS$INPUT\n\n  GT.M  (c)  COPYRIGHT 1985 - 2000  by  Sanchez Computer Associates\n                            ALL RIGHTS RESERVED\n\n$!  the following 2 lines must be maintained\n$ GTM$VMS_VERSION :== 072\t! Minimum VMS version required\n$ ALPHA = (f$getsyi(\"arch_name\") .eqs. \"Alpha\")\n$ IF ALPHA\n$  THEN\n$   GTM$DISK_SPACE == 28000\t! Minumum disk space on system disk required\n$  ELSE\n$   GTM$DISK_SPACE == 16000\t! Minumum disk space on system disk required\n$ ENDIF\n$ IF F$ELEMENT(0,\",\",VMI$VMS_VERSION) .EQS. \"RELEASED\"\n$  THEN\n$   GTM$VMS_IS == F$ELEMENT(1,\",\",VMI$VMS_VERSION)\n$   IF GTM$VMS_IS .LTS. GTM$VMS_VERSION\n$    THEN\n$     VMI$CALLBACK MESSAGE E VMSMISMATCH \"This GT.M kit requires an existing VMS''GTM$VMS_VERSION' system.\"\n$     EXIT VMI$_FAILURE\n$   ENDIF\n$  ELSE\n$   GTM$VMS_IS :==\n$   WRITE SYS$OUTPUT \"  No VMS version checking performed for field test versions.\"\n$ ENDIF\n$ IF (GTM$VMS_IS .GES. \"052\") THEN T1 = F$VERIFY(VMI$KIT_DEBUG)\n$ VMI$CALLBACK CHECK_NET_UTILIZATION GTM$ROOM 'GTM$DISK_SPACE'\n$ IF .NOT. GTM$ROOM\n$  THEN\n$   VMI$CALLBACK MESSAGE E NOSPACE \"There is not enough disk space -- GT.M needs ''GTM$DISK_SPACE' blocks.\"\n$   EXIT VMI$_FAILURE\n$ ENDIF\n$!  setup default answers\n$ GTM$DOPURGE :== YES\n$ GTM$RUN_IVP :== YES\n$ GTM$STD_CNF :== YES\n$ GTM$DST_OWN :== SYSTEM\n$ IF F$IDENTIFIER(GTM$DST_OWN,\"NAME_TO_NUMBER\") .EQ. 0 THEN GTM$DST_OWN :== 1,4\n$ GTM$SYS_DST :== YES\n$ GTM$DST_DIR :== GTM_DIST\n$ GTM$DST_CRE == GTM$DST_DIR\n$ GTM$DST_DEV :==\n$ GTM$STARTDB :== YES\n$ GTM$MGR_COM :== YES\n$ GTM$HLP_DIR :== NO\n$ GTM$DEF_DCL :== YES\n$ GTM$DEF_SYS :== YES\n$ GTM$LNK_LOG :== YES\n$ GTM$INSTALL :== YES\n$ GTM$DEF_GLD :== YES\n$ GTM$GBL_DIR :== MUMPS.GLD\n$ GTM$DEF_RTN :== YES\n$ GTM$RTN_DIR :== [],GTM$DIST:\n$ GTM$PCT_RTN :== YES\n$ VMI$CALLBACK ASK GTM$DOPURGE \"Do you want to purge files replaced by this installation\" 'GTM$DOPURGE' B -\n  \"@VMI$KWD:GTMKITHLP HELP_PURGE\"\n$ IF .NOT. GTM$DOPURGE THEN VMI$CALLBACK SET PURGE NO\n$ VMI$CALLBACK ASK GTM$STD_CNF \"Do you want the standard GT.M configuration (performs INSTALL)\" 'GTM$STD_CNF' B -\n  \"@VMI$KWD:GTMKITHLP HELP_STD_CNF\"\n$ IF GTM$STD_CNF\n$  THEN\n$   GTM$SYS_DST == 1\n$   GTM$STARTDB == 1\n$   GTM$MGR_COM == 1\n$   GTM$HLP_DIR == 0\n$   GTM$DEF_DCL == 1\n$   GTM$DEF_SYS == 1\n$   GTM$INSTALL == 1\n$   GTM$LNK_LOG == 1\n$   GTM$INSTALL == 1\n$   GTM$DEF_GLD == 1\n$   GTM$DEF_RTN == 1\n$   GTM$PCT_RTN == 1\n$   GTM$DST_LOG :== SYS$COMMON:['GTM$DST_DIR']\n$   GTM$DIR_TYPE :== COMMON\n$  ELSE ! Not standard configuration\n$   VMI$CALLBACK ASK GTM$DST_OWN \"What UIC should own the GT.M distribution\" 'GTM$DST_OWN' S \"@VMI$KWD:GTMKITHLP HELP_DST_OWN\"\n$   GTM$DST_OWN == GTM$DST_OWN - \"[\" - \"]\"\n$   VMI$CALLBACK ASK GTM$SYS_DST \"Do you want the GT.M distribution to go into a System Directory\" 'GTM$SYS_DST' B -\n    \"@VMI$KWD:GTMKITHLP HELP_SYS_DST\"\n$   IF GTM$SYS_DST\n$    THEN\n$     VMI$CALLBACK ASK GTM$DST_DIR \"In what System Directory do you want to place GT.M\" 'GTM$DST_DIR' S -\n      \"@VMI$KWD:GTMKITHLP HELP_SYS_DIR\"\n$     GTM$DST_DIR == GTM$DST_DIR - \"[\" - \"]\"\n$     GTM$DST_CRE == GTM$DST_DIR\n$     GTM$DST_LOG :== SYS$COMMON:['GTM$DST_DIR']\n$     GTM$DIR_TYPE :== COMMON\n$    ELSE ! Not system disk\n$     VMI$CALLBACK ASK GTM$DST_DEV \"On which device do you want to place GT.M\" \"''GTM$DST_DEV'\" S \"@VMI$KWD:GTMKITHLP HELP_DST_DEV\"\n$     VMI$CALLBACK ASK GTM$DST_DIR \"In what directory on that device do you want to place GT.M\" 'GTM$DST_DIR' S -\n      \"@VMI$KWD:GTMKITHLP HELP_DST_DIR\"\n$     GTM$DST_DEV == GTM$DST_DEV - \":\"\n$     GTM$DST_DIR == GTM$DST_DIR - \"[\" - \"]\"\n$     GTM$DST_LOG :== 'GTM$DST_DEV':['GTM$DST_DIR']\n$     GTM$DST_CRE == GTM$DST_LOG\n$     GTM$DIR_TYPE :== USER\n$   ENDIF ! system disk\n$   VMI$CALLBACK ASK GTM$STARTDB \"Do you want GTMSTART.COM in the startup database\" 'GTM$STARTDB' B -\n    \"@VMI$KWD:GTMKITHLP HELP_STARTDB\"\n$   IF .NOT. GTM$STARTDB\n$    THEN\n$     VMI$CALLBACK ASK GTM$MGR_COM \"Do you want the GT.M .COM files in SYS$MANAGER\" 'GTM$MGR_COM' B -\n      \"@VMI$KWD:GTMKITHLP HELP_MGR_COM\"\n$   ENDIF\n$   VMI$CALLBACK ASK GTM$HLP_DIR \"Do you want the GT.M help files in SYS$HELP\" 'GTM$HLP_DIR' B \"@VMI$KWD:GTMKITHLP HELP_HLP_DIR\"\n$   VMI$CALLBACK ASK GTM$DEF_DCL \"Do you want to define GT.M commands to the system\" 'GTM$DEF_DCL' B -\n    \"@VMI$KWD:GTMKITHLP HELP_DEF_DCL\"\n$   VMI$CALLBACK ASK GTM$DEF_SYS \"Do you want to define GT.M logical names in the System Table\" 'GTM$DEF_SYS' B -\n    \"@VMI$KWD:GTMKITHLP HELP_DEF_SYS\"\n$   VMI$CALLBACK ASK GTM$LNK_LOG \"Do you want to define the LNK$LIBRARY logical names\" 'GTM$LNK_LOG' B -\n    \"@VMI$KWD:GTMKITHLP HELP_LNK_LOG\"\n$   VMI$CALLBACK ASK GTM$RUN_IVP \"Do you want to run the IVP (performs INSTALL)\" 'GTM$RUN_IVP' B -\n    \"@VMI$KWD:GTMKITHLP HELP_RUN_IVP\"\n$   IF GTM$RUN_IVP\n$    THEN\n$     GTM$PCT_RTN == 1\n$    ELSE\n$     VMI$CALLBACK ASK GTM$PCT_RTN \"Do you want to compile the GT.M percent routines (performs INSTALL)\" 'GTM$PCT_RTN' B -\n      \"@VMI$KWD:GTMKITHLP HELP_PCT_RTN\"\n$   ENDIF\n$   IF (GTM$RUN_IVP .OR. GTM$PCT_RTN)\n$    THEN\n$     GTM$INSTALL == 1\n$    ELSE\n$     VMI$CALLBACK ASK GTM$INSTALL \"Do you want to INSTALL the GT.M shareable images now\" 'GTM$INSTALL' B -\n      \"@VMI$KWD:GTMKITHLP HELP_INSTALL\"\n$   ENDIF\n$   VMI$CALLBACK ASK GTM$DEF_RTN \"Do you want to have a default definition for GTM$ROUTINES\" 'GTM$DEF_RTN' B -\n    \"@VMI$KWD:GTMKITHLP HELP_DEF_RTN\"\n$   IF GTM$DEF_RTN\n$    THEN\n$     VMI$CALLBACK ASK GTM$RTN_DIR \"What is the search specification for GTM$ROUTINES\" 'GTM$RTN_DIR' S -\n      \"@VMI$KWD:GTMKITHLP HELP_RTN_DIR\"\n$   ENDIF\n$   VMI$CALLBACK ASK GTM$DEF_GLD \"Do you want to have a default definition for GTM$GBLDIR\" 'GTM$DEF_GLD' B -\n    \"@VMI$KWD:GTMKITHLP HELP_DEF_GLD\"\n$   IF GTM$DEF_GLD\n$    THEN\n$     VMI$CALLBACK ASK GTM$GBL_DIR \"What is the file specification for GTM$GBLDIR\" 'GTM$GBL_DIR' S -\n      \"@VMI$KWD:GTMKITHLP HELP_GBL_DIR\"\n$   ENDIF\n$ ENDIF ! standard configuration\n$!  tell them what's happening\n$ IF GTM$MGR_COM\n$  THEN\n$   WRITE SYS$OUTPUT \"  The following command files are created and copied to SYS$MANAGER:\"\n$  ELSE\n$   WRITE SYS$OUTPUT \"  The following command files are created:\"\n$ ENDIF\n$ TYPE SYS$INPUT\n\n        GTMINSTALL.COM\n        GTMLOGICALS.COM\n        GTMLOGIN.COM\n        GTMSTART.COM\n        GTMSTOP.COM\n\n  Each file contains its own user documentation.\n\n  All the questions have been asked.   Installation now proceeds  without your\n  manual intervention for about 10-15 minutes.\n$ IF GTM$RUN_IVP THEN WRITE SYS$OUTPUT \"  Finally the Installation Verification Procedure tests the installation.\"\n$ WRITE SYS$OUTPUT \"\"\n$ VMI$CALLBACK CREATE_DIRECTORY 'GTM$DIR_TYPE' 'GTM$DST_CRE' \"/OWNER_UIC=[''GTM$DST_OWN'] /PROTECTION=(WO:RE)\"\n$ VMI$CALLBACK RESTORE_SAVESET B\n$ VMI$CALLBACK RESTORE_SAVESET C\n$ WRITE SYS$OUTPUT \"\"\n$ VMI$CALLBACK MESSAGE I CRECOM \"Creating command files.\"\n$!  Create GTMINSTALL.COM\n$ OPEN /WRITE OUFILE VMI$KWD:GTMINSTALL.COM\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$!\tGTMINSTALL.COM installs GTMSECSHR and other GT.M images.\"\n$ WRITE OUFILE \"$!      GTMSECSHR is a small protected image and must be installed.\"\n$ WRITE OUFILE \"$!      GTMSHR is the run-time library and is installed for performance.\"\n$ WRITE OUFILE \"$!      GTM$DMOD and MCOMPILE are small images frequently used in development.\"\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$ INSTALL\"\n$ WRITE OUFILE \"REPLACE  /OPEN/SHARED/HEADER/PROTECTED\tGTMSECSHR\"\n$ WRITE OUFILE \"REPLACE  /OPEN/SHARED/HEADER\t\tGTMSHR\"\n$ WRITE OUFILE \"REPLACE  /OPEN/SHARED/HEADER\t\tGTM$DMOD\"\n$ WRITE OUFILE \"REPLACE  /OPEN/SHARED/HEADER\t\tMCOMPILE\"\n$ WRITE OUFILE \"$ EXIT\"\n$ CLOSE OUFILE\n$!  Create GTMLOGICALS.COM\n$ GTM$HLP_LOG :== GTM$DIST\n$ IF GTM$HLP_DIR THEN GTM$HLP_LOG :== SYS$HELP\n$ OPEN /WRITE OUFILE VMI$KWD:GTMLOGICALS.COM\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$!\tGTMLOGICALS.COM defines the logical names required to use GT.M.\"\n$ WRITE OUFILE \"$!\tBy default the definitions are placed in the PROCESS table.\"\n$ WRITE OUFILE \"$!\tParameter 1, if supplied should be the name of a logical name table\"\n$ WRITE OUFILE \"$!\tand/or the mode of definition.\"\n$ WRITE OUFILE \"$!      Assignments in a \"\"permanent\"\" table reduce GT.M activation time.\"\n$ WRITE OUFILE \"$!\"\n$ IF GTM$LNK_LOG THEN WRITE OUFILE \"$!\tThe LNK$LIBRARY names many require adjustment to your environment.\"\n$ IF GTM$DEF_GLD THEN WRITE OUFILE \"$!\tGTM$GBLDIR is defined to provide default access to a global directory.\"\n$ IF GTM$DEF_RTN THEN WRITE OUFILE \"$!\tGTM$ROUTINES is defined to provide access to the GT.M utilities.\"\n$ IF GTM$DEF_RTN THEN WRITE OUFILE \"$!\tYou may wish to define a different structure for $ZROUTINES.\"\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$ IF (P1 .NES. \"\"\"\") .AND. (F$EXTRACT(0,1,P1) .NES. \"\"/\"\") THEN P1 := /'P1\"\n$ WRITE OUFILE \"$ DEFINE 'P1' GTM$DIST\t\t''GTM$DST_LOG'\"\n$ IF GTM$DEF_GLD THEN WRITE OUFILE \"$ DEFINE 'P1' GTM$GBLDIR\t''GTM$GBL_DIR'\"\n$ IF GTM$DEF_RTN THEN WRITE OUFILE \"$ DEFINE 'P1' GTM$ROUTINES\t\"\"''GTM$RTN_DIR'\"\"\"\n$ WRITE OUFILE \"$ DEFINE 'P1' GTM$HELP\t\t''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"$ DEFINE 'P1' GTMSHR\t\tGTM$DIST:GTMSHR.EXE\"\n$ WRITE OUFILE \"$ DEFINE 'P1' GTMSECSHR\t\tGTM$DIST:GTMSECSHR.EXE\"\n$ WRITE OUFILE \"$ DEFINE 'P1' GTM$DMOD\t\tGTM$DIST:GTM$DMOD.EXE\"\n$ WRITE OUFILE \"$ DEFINE 'P1' MCOMPILE\t\tGTM$DIST:MCOMPILE.EXE\"\n$ IF GTM$LNK_LOG\n$  THEN\n$   N1 = 0\n$   DN = 0\n$   T1 = F$TRNLNM(\"LNK$LIBRARY\")\n$   IF  (T1 .EQS. \"\") .OR. (F$LOCATE(\"GTMLIB\",T1) .NE. F$LENGTH(T1)) .OR. (F$LOCATE(\"GTMSHR\",T1) .NE. F$LENGTH(T1))\n$    THEN\n$     WRITE OUFILE \"$ DEFINE 'P1' LNK$LIBRARY\tGTM$DIST:GTMLIB.OLB\"\n$     DN = 1\n$    ELSE ! lnk$library is in use\n$LNK_LOOP:\n$     N1 = N1 + 1\n$     T1 = F$TRNLNM(\"LNK$LIBRARY_''N1'\")\n$     IF  (T1 .EQS. \"\") .OR. (F$LOCATE(\"GTMLIB\",T1) .NE. F$LENGTH(T1)) .OR. (F$LOCATE(\"GTMSHR\",T1) .NE. F$LENGTH(T1))\n$      THEN\n$       WRITE OUFILE \"$ DEFINE 'P1' LNK$LIBRARY_''N1'\tGTM$DIST:GTMLIB.OLB\"\n$       DN = 1\n$     ENDIF\n$     IF  (.NOT. DN) .AND. (N1 .LT. 998)  THEN  GOTO LNK_LOOP\n$   ENDIF ! gtmlib handling\n$   IF  DN ! placed gtmlib\n$    THEN\n$     N1 = N1 + 1\n$     WRITE OUFILE \"$ DEFINE 'P1' LNK$LIBRARY_''N1'\tGTM$DIST:GTMSHR.OLB\"\n$    ELSE\n$     VMI$CALLBACK MESSAGE I NOLNKLOG \"No LNK$LIBRARY logical names available\"\n$   ENDIF\n$ ENDIF ! setting up LNK$LIBRARYs\n$ WRITE OUFILE \"$ EXIT\"\n$ CLOSE OUFILE\n$!  Create GTMLOGIN.COM\n$ OPEN /WRITE OUFILE VMI$KWD:GTMLOGIN.COM\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$!\tGTMLOGIN.COM performs process specific setup for GT.M.\"\n$ WRITE OUFILE \"$!\tIt calls GTMLOGICALS.COM if the logical names are not\"\n$ WRITE OUFILE \"$!      in the SYSTEM table.\"\n$ WRITE OUFILE \"$!\tIt defines symbols to access GT.M images.\"\n$ WRITE OUFILE \"$!\tIt defines GT.M commands locally if they are not defined to the system.\"\n$ WRITE OUFILE \"$!      When the command and logical names are not defined on a process level,\"\n$ WRITE OUFILE \"$!      a production user may save start-up time by not using GTMLOGIN.\"\n$ WRITE OUFILE \"$!      CCE is infrequently used, but may be defined as a foreign command.\"\n$ WRITE OUFILE \"$!\"\n$ IF .NOT. GTM$DEF_SYS\n$  THEN\n$   WRITE OUFILE \"$ dir = F$ENVIRONMENT(\"\"PROCEDURE\"\")\"\n$   WRITE OUFILE \"$ dir = F$PARSE(dir,,,\"\"DEVICE\"\") + F$PARSE(dir,,,\"\"DIRECTORY\"\")\"\n$   WRITE OUFILE \"$ @'dir'GTMLOGICALS.COM\"\n$ ENDIF\n$ IF .NOT. GTM$DEF_DCL THEN WRITE OUFILE \"$ SET COMMAND GTM$DIST:GTMCOMMANDS.CLD\"\n$ WRITE OUFILE \"$ DSE :== $GTM$DIST:DSE.EXE\t! Database System Editor\"\n$ WRITE OUFILE \"$ GDE :== $GTM$DIST:GDE.EXE\t! Global Directory Editor\"\n$ WRITE OUFILE \"$ GTM :== MUMPS/DIRECT\t\t! Direct Mode MUMPS\"\n$ WRITE OUFILE \"$ LKE :== $GTM$DIST:LKE.EXE\t! Lock Editor\"\n$ WRITE OUFILE \"$ MUPI*P :== $GTM$DIST:MUPIP.EXE\t! MUMPS Peripheral Interchange Program\"\n$ WRITE OUFILE \"$ EXIT\"\n$ WRITE OUFILE \"$ CCE :== $GTM$DIST:CCE.EXE\t! GT.CX Operator Interface Program\"\n$ WRITE OUFILE \"$ EXIT\"\n$ CLOSE OUFILE\n$!  Create GTMSTART.COM\n$ OPEN /WRITE OUFILE VMI$KWD:GTMSTART.COM\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$!\tGTMSTART.COM should be placed in the VMS startup database.\"\n$ WRITE OUFILE \"$!\tIt invokes GTMLOGICALS.COM and GTMINSTALL.COM.\"\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$ dir = F$ENVIRONMENT(\"\"PROCEDURE\"\")\"\n$ WRITE OUFILE \"$ dir = F$PARSE(dir,,,\"\"DEVICE\"\") + F$PARSE(dir,,,\"\"DIRECTORY\"\")\"\n$ IF GTM$DEF_SYS THEN WRITE OUFILE \"$ IF P1 .EQS. \"\"\"\" .OR. (P1 .EQS. \"\"FULL\"\") THEN P1 := SYSTEM/EXEC\"\n$ WRITE OUFILE \"$ @'dir'GTMLOGICALS 'P1'\"\n$ WRITE OUFILE \"$ @'dir'GTMINSTALL\"\n$ WRITE OUFILE \"$ EXIT\"\n$ CLOSE OUFILE\n$!  Create GTMSTOP.COM\n$ OPEN /WRITE OUFILE VMI$KWD:GTMSTOP.COM\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$!\tGTMSTOP.COM stops all the active GT.M processes and does a RUNDOWN.\"\n$ WRITE OUFILE \"$!\tPlace an invocation or copy of this procedure in the site specific\"\n$ WRITE OUFILE \"$!\t shutdown: SYS$MANAGER:SYSHUTDWN to ensure all GT.M databases are\"\n$ WRITE OUFILE \"$!\t properly closed before VMS terminates.  GTMSTOP should follow\"\n$ WRITE OUFILE \"$!\t GTCMSTOP and precede GTCXSTOP, if they are used.\"\n$ WRITE OUFILE \"$!\tIf GTMSTOP is not intended to disable subsequent use of GT.M,\"\n$ WRITE OUFILE \"$!\t add a comment (!) before the INSTALL REMOVE GTMSECSHR.\"\n$ WRITE OUFILE \"$!\"\n$ IF .NOT. GTM$DEF_SYS\n$  THEN\n$   WRITE OUFILE \"$ dir = F$ENVIRONMENT(\"\"PROCEDURE\"\")\"\n$   WRITE OUFILE \"$ dir = F$PARSE(dir,,,\"\"DEVICE\"\") + F$PARSE(dir,,,\"\"DIRECTORY\"\")\"\n$   WRITE OUFILE \"$ @'dir'GTMLOGICALS.COM\"\n$ ENDIF\n$ WRITE OUFILE \"$ MUPIP := $GTM$DIST:MUPIP.EXE\"\n$ WRITE OUFILE \"$ STOP := $GTM$DIST:GTM$STOP\"\n$ WRITE OUFILE \"$ STOP 'P1'\"\n$ WRITE OUFILE \"$ MUPIP RUNDOWN\"\n$ WRITE OUFILE \"$ INSTALL REMOVE GTMSECSHR\"\n$ WRITE OUFILE \"$ EXIT\"\n$ IF GTM$DEF_SYS THEN WRITE OUFILE \"$ IF P2 .EQS. \"\"\"\" THEN P2 := /SYSTEM/EXEC\"\n$ WRITE OUFILE \"$ DEASSIGN 'P2' GTMSECSHR\"\n$ CLOSE OUFILE\n$ VMI$CALLBACK MESSAGE I PREINS \"Preparing files for installation.\"\n$!  GTMFILES.KIT must be maintained as kit contents change\n$ GTM$HLP_LOG == GTM$DST_LOG\n$ IF GTM$HLP_DIR THEN GTM$HLP_LOG :== VMI$ROOT:[SYSHLP]\n$ OPEN /WRITE OUFILE VMI$KWD:GTMFILES.KIT\n$ IF GTM$MGR_COM\n$  THEN\n$   WRITE OUFILE \"GTM$ GTMINSTALL.COM VMI$ROOT:[SYSMGR] C\"\n$   WRITE OUFILE \"GTM$ GTMLOGICALS.COM VMI$ROOT:[SYSMGR] C\"\n$   WRITE OUFILE \"GTM$ GTMLOGIN.COM VMI$ROOT:[SYSMGR] C\"\n$   WRITE OUFILE \"GTM$ GTMSTART.COM VMI$ROOT:[SYSMGR] C\"\n$   WRITE OUFILE \"GTM$ GTMSTOP.COM VMI$ROOT:[SYSMGR] C\"\n$ ENDIF\n$ WRITE OUFILE \"GTM$ GTMINSTALL.COM ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMLOGICALS.COM ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMLOGIN.COM ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMSTART.COM ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMSTOP.COM ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ DSE.HLB ''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"GTM$ GDE.HLB ''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"GTM$ LKE.HLB ''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"GTM$ MUMPS.HLB ''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"GTM$ MUPIP.HLB ''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMLIB.OLB ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMSHR.OLB ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMZCALL.MLB ''GTM$DST_LOG'\"\n$ IF ALPHA\n$  THEN\n$   WRITE OUFILE \"GTM$ GTM$DEFAULTS.M64 ''GTM$DST_LOG'\"\n$  ELSE\n$   WRITE OUFILE \"GTM$ GTM$DEFAULTS.MAR ''GTM$DST_LOG'\"\n$ ENDIF\n$ WRITE OUFILE \"GTM$ GTM$CE.H ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMCOLLECT.OPT ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMCOMMANDS.CLD ''GTM$DST_LOG' C\"\n$ WRITE OUFILE \"GTM$ *.M ''GTM$DST_LOG'\"\n$ CLOSE OUFILE\n$!  GTMIMAGES.KIT must be maintained as kit contents change\n$ OPEN /WRITE OUFILE VMI$KWD:GTMIMAGES.KIT\n$ WRITE OUFILE \"GTM$ GTMSECSHR.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMSHR.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ DSE.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GDE.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTM$DMOD.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ LKE.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ MCOMPILE.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ MUPIP.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTM$STOP.EXE ''GTM$DST_LOG'\"\n$ CLOSE OUFILE\n$!  Provide with file.KITs\n$ VMI$CALLBACK PROVIDE_FILE \"\" VMI$KWD:GTMFILES.KIT \"\" T\n$ VMI$CALLBACK PROVIDE_IMAGE \"\" VMI$KWD:GTMIMAGES.KIT \"\" T\n$ VMI$CALLBACK MESSAGE I FININS \"Finalizing the installation.\"\n$ IF GTM$DEF_DCL THEN VMI$CALLBACK PROVIDE_DCL_COMMAND GTMCOMMANDS.CLD\n$ IF GTM$STARTDB THEN VMI$CALLBACK MODIFY_STARTUP_DB ADD GTMSTART.COM LPMAIN\n$!  GTM$INSTALL is TRUE if GTM$RUN_IVP or GTM$PCT_RTN\n$ IF GTM$INSTALL THEN VMI$CALLBACK SET POSTINSTALL YES\n$ IF GTM$RUN_IVP THEN VMI$CALLBACK SET IVP YES\n$ EXIT VMI$_SUCCESS\n$!\n$POSTINSTALL:\n$ ON CONTROL_Y THEN EXIT VMI$_FAILURE\n$! remove MUPIP from command tables for change from V2.4 to V2.5\n$ SET NOON\n$ DEFINE /USER_MODE SYS$OUTPUT NL:\n$ DEFINE /USER_MODE SYS$ERROR NL:\n$ SET COMMAND /TABLE=SYS$COMMON:[SYSLIB]DCLTABLES /OUTPUT=SYS$COMMON:[SYSLIB]DCLTABLES /DELETE=MUPIP\n$ DEFINE /USER_MODE SYS$OUTPUT NL:\n$ DEFINE /USER_MODE SYS$ERROR NL:\n$ SET COMMAND /DELETE=MUPIP\n$ SET ON\n$ IF GTM$MGR_COM\n$  THEN\n$   T1 := SYS$MANAGER:\n$  ELSE\n$   T1 = GTM$DST_LOG\n$ ENDIF\n$ @'T1'GTMSTART\n$ @'T1'GTMLOGIN\n$ ON CONTROL_Y THEN EXIT VMI$_FAILURE\n$ SET DEFAULT GTM$DIST\n$ T2 = F$ENVIRONMENT(\"PROTECTION\")\n$ SET PROTECTION=(S=REWD,O=REWD,G=REWD,W=RE)/DEFAULT\n$ MUMPS GTM$DMOD.M\n$ IF GTM$LNK_LOG\n$  THEN\n$   T1 :=\n$  ELSE\n$   T1 :=,GTMLIB.OLB/LIB,GTMSHR.OLB/LIB\n$ ENDIF\n$ LINK GTM$DMOD.OBJ/NOTRACE'T1\n$ IF GTM$PCT_RTN\n$  THEN\n$   TYPE SYS$INPUT\n\n  Compiling the GT.M percent (%) routines.\n$   MUMPS *\n$   IF GTM$DOPURGE THEN PURGE *.*\n$   SET DEFAULT VMI$KWD\n$ ENDIF ! percent routines\n$ SET PROTECTION=('T2')/DEFAULT\n$ EXIT VMI$_SUCCESS\n$!\n$IVP:\n$!\tThe real Installation Verification Procedure.\n$ TYPE SYS$INPUT\n\n  GT.M  Installation Verification Procedure\n\n$!\tExtract the IVP .COM file from the text library.\n$ LIBRARIAN /EXTRACT=GTM$IVP /OUTPUT=GTM$IVP.COM\tGTM$IVP.TLB\n$ @GTM$IVP\n$ EXIT $STATUS\n$!\n"
  },
  {
    "path": "src/test/resources/samples/langs/DIGITAL Command Language/ghostpdl_zlib_make_vms.com",
    "content": "$! make libz under VMS written by\n$! Martin P.J. Zinser\n$!\n$! In case of problems with the install you might contact me at\n$! zinser@zinser.no-ip.info(preferred) or\n$! martin.zinser@eurexchange.com (work)\n$!\n$! Make procedure history for Zlib\n$!\n$!------------------------------------------------------------------------------\n$! Version history\n$! 0.01 20060120 First version to receive a number\n$! 0.02 20061008 Adapt to new Makefile.in\n$! 0.03 20091224 Add support for large file check\n$! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite\n$! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in\n$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples\n$!               subdir path, update module search in makefile.in\n$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned\n$!               shared image creation\n$! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared\n$!               image\n$! 0.09 20120305 SMS.  P1 sets builder (\"MMK\", \"MMS\", \" \" (built-in)).\n$!               \"\" -> automatic, preference: MMK, MMS, built-in.\n$!\n$ on error then goto err_exit\n$!\n$ true  = 1\n$ false = 0\n$ tmpnam = \"temp_\" + f$getjpi(\"\",\"pid\")\n$ tt = tmpnam + \".txt\"\n$ tc = tmpnam + \".c\"\n$ th = tmpnam + \".h\"\n$ define/nolog tconfig 'th'\n$ its_decc = false\n$ its_vaxc = false\n$ its_gnuc = false\n$ s_case   = False\n$!\n$! Setup variables holding \"config\" information\n$!\n$ Make    = \"''p1'\"\n$ name     = \"Zlib\"\n$ version  = \"?.?.?\"\n$ v_string = \"ZLIB_VERSION\"\n$ v_file   = \"zlib.h\"\n$ ccopt   = \"/include = []\"\n$ lopts   = \"\"\n$ dnsrl   = \"\"\n$ aconf_in_file = \"zconf.h.in#zconf.h_in#zconf_h.in\"\n$ conf_check_string = \"\"\n$ linkonly = false\n$ optfile  = name + \".opt\"\n$ mapfile  = name + \".map\"\n$ libdefs  = \"\"\n$ vax      = f$getsyi(\"HW_MODEL\").lt.1024\n$ axp      = f$getsyi(\"HW_MODEL\").ge.1024 .and. f$getsyi(\"HW_MODEL\").lt.4096\n$ ia64     = f$getsyi(\"HW_MODEL\").ge.4096\n$!\n$! 2012-03-05 SMS.\n$! Why is this needed?  And if it is needed, why not simply \".not. vax\"?\n$!\n$!!! if axp .or. ia64 then  set proc/parse=extended\n$!\n$ whoami = f$parse(f$environment(\"Procedure\"),,,,\"NO_CONCEAL\")\n$ mydef  = F$parse(whoami,,,\"DEVICE\")\n$ mydir  = f$parse(whoami,,,\"DIRECTORY\") - \"][\"\n$ myproc = f$parse(whoami,,,\"Name\") + f$parse(whoami,,,\"type\")\n$!\n$! Check for MMK/MMS\n$!\n$ if (Make .eqs. \"\")\n$ then\n$   If F$Search (\"Sys$System:MMS.EXE\") .nes. \"\" Then Make = \"MMS\"\n$   If F$Type (MMK) .eqs. \"STRING\" Then Make = \"MMK\"\n$ else\n$   Make = f$edit( Make, \"trim\")\n$ endif\n$!\n$ gosub find_version\n$!\n$  open/write topt tmp.opt\n$  open/write optf 'optfile'\n$!\n$ gosub check_opts\n$!\n$! Look for the compiler used\n$!\n$ gosub check_compiler\n$ close topt\n$ close optf\n$!\n$ if its_decc\n$ then\n$   ccopt = \"/prefix=all\" + ccopt\n$   if f$trnlnm(\"SYS\") .eqs. \"\"\n$   then\n$     if axp\n$     then\n$       define sys sys$library:\n$     else\n$       ccopt = \"/decc\" + ccopt\n$       define sys decc$library_include:\n$     endif\n$   endif\n$!\n$! 2012-03-05 SMS.\n$! Why /NAMES = AS_IS?  Why not simply \".not. vax\"?  And why not on VAX?\n$!\n$   if axp .or. ia64\n$   then\n$       ccopt = ccopt + \"/name=as_is/opt=(inline=speed)\"\n$       s_case = true\n$   endif\n$ endif\n$ if its_vaxc .or. its_gnuc\n$ then\n$    if f$trnlnm(\"SYS\").eqs.\"\" then define sys sys$library:\n$ endif\n$!\n$! Build a fake configure input header\n$!\n$ open/write conf_hin config.hin\n$ write conf_hin \"#undef _LARGEFILE64_SOURCE\"\n$ close conf_hin\n$!\n$!\n$ i = 0\n$FIND_ACONF:\n$ fname = f$element(i,\"#\",aconf_in_file)\n$ if fname .eqs. \"#\" then goto AMISS_ERR\n$ if f$search(fname) .eqs. \"\"\n$ then\n$   i = i + 1\n$   goto find_aconf\n$ endif\n$ open/read/err=aconf_err aconf_in 'fname'\n$ open/write aconf zconf.h\n$ACONF_LOOP:\n$ read/end_of_file=aconf_exit aconf_in line\n$ work = f$edit(line, \"compress,trim\")\n$ if f$extract(0,6,work) .nes. \"#undef\"\n$ then\n$   if f$extract(0,12,work) .nes. \"#cmakedefine\"\n$   then\n$       write aconf line\n$   endif\n$ else\n$   cdef = f$element(1,\" \",work)\n$   gosub check_config\n$ endif\n$ goto aconf_loop\n$ACONF_EXIT:\n$ write aconf \"\"\n$ write aconf \"/* VMS specifics added by make_vms.com: */\"\n$ write aconf \"#define VMS 1\"\n$ write aconf \"#include <unistd.h>\"\n$ write aconf \"#include <unixio.h>\"\n$ write aconf \"#ifdef _LARGEFILE\"\n$ write aconf \"# define off64_t __off64_t\"\n$ write aconf \"# define fopen64 fopen\"\n$ write aconf \"# define fseeko64 fseeko\"\n$ write aconf \"# define lseek64 lseek\"\n$ write aconf \"# define ftello64 ftell\"\n$ write aconf \"#endif\"\n$ write aconf \"#if !defined( __VAX) && (__CRTL_VER >= 70312000)\"\n$ write aconf \"# define HAVE_VSNPRINTF\"\n$ write aconf \"#endif\"\n$ close aconf_in\n$ close aconf\n$ if f$search(\"''th'\") .nes. \"\" then delete 'th';*\n$! Build the thing plain or with mms\n$!\n$ write sys$output \"Compiling Zlib sources ...\"\n$ if make.eqs.\"\"\n$ then\n$   if (f$search( \"example.obj;*\") .nes. \"\") then delete example.obj;*\n$   if (f$search( \"minigzip.obj;*\") .nes. \"\") then delete minigzip.obj;*\n$   CALL MAKE adler32.OBJ \"CC ''CCOPT' adler32\" -\n                adler32.c zlib.h zconf.h\n$   CALL MAKE compress.OBJ \"CC ''CCOPT' compress\" -\n                compress.c zlib.h zconf.h\n$   CALL MAKE crc32.OBJ \"CC ''CCOPT' crc32\" -\n                crc32.c zlib.h zconf.h\n$   CALL MAKE deflate.OBJ \"CC ''CCOPT' deflate\" -\n                deflate.c deflate.h zutil.h zlib.h zconf.h\n$   CALL MAKE gzclose.OBJ \"CC ''CCOPT' gzclose\" -\n                gzclose.c zutil.h zlib.h zconf.h\n$   CALL MAKE gzlib.OBJ \"CC ''CCOPT' gzlib\" -\n                gzlib.c zutil.h zlib.h zconf.h\n$   CALL MAKE gzread.OBJ \"CC ''CCOPT' gzread\" -\n                gzread.c zutil.h zlib.h zconf.h\n$   CALL MAKE gzwrite.OBJ \"CC ''CCOPT' gzwrite\" -\n                gzwrite.c zutil.h zlib.h zconf.h\n$   CALL MAKE infback.OBJ \"CC ''CCOPT' infback\" -\n                infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h\n$   CALL MAKE inffast.OBJ \"CC ''CCOPT' inffast\" -\n                inffast.c zutil.h zlib.h zconf.h inffast.h\n$   CALL MAKE inflate.OBJ \"CC ''CCOPT' inflate\" -\n                inflate.c zutil.h zlib.h zconf.h infblock.h\n$   CALL MAKE inftrees.OBJ \"CC ''CCOPT' inftrees\" -\n                inftrees.c zutil.h zlib.h zconf.h inftrees.h\n$   CALL MAKE trees.OBJ \"CC ''CCOPT' trees\" -\n                trees.c deflate.h zutil.h zlib.h zconf.h\n$   CALL MAKE uncompr.OBJ \"CC ''CCOPT' uncompr\" -\n                uncompr.c zlib.h zconf.h\n$   CALL MAKE zutil.OBJ \"CC ''CCOPT' zutil\" -\n                zutil.c zutil.h zlib.h zconf.h\n$   write sys$output \"Building Zlib ...\"\n$   CALL MAKE libz.OLB \"lib/crea libz.olb *.obj\" *.OBJ\n$   write sys$output \"Building example...\"\n$   CALL MAKE example.OBJ \"CC ''CCOPT' [.test]example\" -\n                [.test]example.c zlib.h zconf.h\n$   call make example.exe \"LINK example,libz.olb/lib\" example.obj libz.olb\n$   write sys$output \"Building minigzip...\"\n$   CALL MAKE minigzip.OBJ \"CC ''CCOPT' [.test]minigzip\" -\n              [.test]minigzip.c zlib.h zconf.h\n$   call make minigzip.exe -\n              \"LINK minigzip,libz.olb/lib\" -\n              minigzip.obj libz.olb\n$ else\n$   gosub crea_mms\n$   write sys$output \"Make ''name' ''version' with ''Make' \"\n$   'make'\n$ endif\n$!\n$! Create shareable image\n$!\n$ gosub crea_olist\n$ write sys$output \"Creating libzshr.exe\"\n$ call map_2_shopt 'mapfile' 'optfile'\n$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,'optfile'/opt\n$ write sys$output \"Zlib build completed\"\n$ delete/nolog tmp.opt;*\n$ exit\n$AMISS_ERR:\n$ write sys$output \"No source for config.hin found.\"\n$ write sys$output \"Tried any of ''aconf_in_file'\"\n$ goto err_exit\n$CC_ERR:\n$ write sys$output \"C compiler required to build ''name'\"\n$ goto err_exit\n$ERR_EXIT:\n$ set message/facil/ident/sever/text\n$ close/nolog optf\n$ close/nolog topt\n$ close/nolog aconf_in\n$ close/nolog aconf\n$ close/nolog out\n$ close/nolog min\n$ close/nolog mod\n$ close/nolog h_in\n$ write sys$output \"Exiting...\"\n$ exit 2\n$!\n$!\n$MAKE: SUBROUTINE   !SUBROUTINE TO CHECK DEPENDENCIES\n$ V = 'F$Verify(0)\n$! P1 = What we are trying to make\n$! P2 = Command to make it\n$! P3 - P8  What it depends on\n$\n$ If F$Search(P1) .Eqs. \"\" Then Goto Makeit\n$ Time = F$CvTime(F$File(P1,\"RDT\"))\n$arg=3\n$Loop:\n$       Argument = P'arg\n$       If Argument .Eqs. \"\" Then Goto Exit\n$       El=0\n$Loop2:\n$       File = F$Element(El,\" \",Argument)\n$       If File .Eqs. \" \" Then Goto Endl\n$       AFile = \"\"\n$Loop3:\n$       OFile = AFile\n$       AFile = F$Search(File)\n$       If AFile .Eqs. \"\" .Or. AFile .Eqs. OFile Then Goto NextEl\n$       If F$CvTime(F$File(AFile,\"RDT\")) .Ges. Time Then Goto Makeit\n$       Goto Loop3\n$NextEL:\n$       El = El + 1\n$       Goto Loop2\n$EndL:\n$ arg=arg+1\n$ If arg .Le. 8 Then Goto Loop\n$ Goto Exit\n$\n$Makeit:\n$ VV=F$VERIFY(0)\n$ write sys$output P2\n$ 'P2\n$ VV='F$Verify(VV)\n$Exit:\n$ If V Then Set Verify\n$ENDSUBROUTINE\n$!------------------------------------------------------------------------------\n$!\n$! Check command line options and set symbols accordingly\n$!\n$!------------------------------------------------------------------------------\n$! Version history\n$! 0.01 20041206 First version to receive a number\n$! 0.02 20060126 Add new \"HELP\" target\n$ CHECK_OPTS:\n$ i = 1\n$ OPT_LOOP:\n$ if i .lt. 9\n$ then\n$   cparm = f$edit(p'i',\"upcase\")\n$!\n$! Check if parameter actually contains something\n$!\n$   if f$edit(cparm,\"trim\") .nes. \"\"\n$   then\n$     if cparm .eqs. \"DEBUG\"\n$     then\n$       ccopt = ccopt + \"/noopt/deb\"\n$       lopts = lopts + \"/deb\"\n$     endif\n$     if f$locate(\"CCOPT=\",cparm) .lt. f$length(cparm)\n$     then\n$       start = f$locate(\"=\",cparm) + 1\n$       len   = f$length(cparm) - start\n$       ccopt = ccopt + f$extract(start,len,cparm)\n$       if f$locate(\"AS_IS\",f$edit(ccopt,\"UPCASE\")) .lt. f$length(ccopt) -\n          then s_case = true\n$     endif\n$     if cparm .eqs. \"LINK\" then linkonly = true\n$     if f$locate(\"LOPTS=\",cparm) .lt. f$length(cparm)\n$     then\n$       start = f$locate(\"=\",cparm) + 1\n$       len   = f$length(cparm) - start\n$       lopts = lopts + f$extract(start,len,cparm)\n$     endif\n$     if f$locate(\"CC=\",cparm) .lt. f$length(cparm)\n$     then\n$       start  = f$locate(\"=\",cparm) + 1\n$       len    = f$length(cparm) - start\n$       cc_com = f$extract(start,len,cparm)\n        if (cc_com .nes. \"DECC\") .and. -\n           (cc_com .nes. \"VAXC\") .and. -\n           (cc_com .nes. \"GNUC\")\n$       then\n$         write sys$output \"Unsupported compiler choice ''cc_com' ignored\"\n$         write sys$output \"Use DECC, VAXC, or GNUC instead\"\n$       else\n$         if cc_com .eqs. \"DECC\" then its_decc = true\n$         if cc_com .eqs. \"VAXC\" then its_vaxc = true\n$         if cc_com .eqs. \"GNUC\" then its_gnuc = true\n$       endif\n$     endif\n$     if f$locate(\"MAKE=\",cparm) .lt. f$length(cparm)\n$     then\n$       start  = f$locate(\"=\",cparm) + 1\n$       len    = f$length(cparm) - start\n$       mmks = f$extract(start,len,cparm)\n$       if (mmks .eqs. \"MMK\") .or. (mmks .eqs. \"MMS\")\n$       then\n$         make = mmks\n$       else\n$         write sys$output \"Unsupported make choice ''mmks' ignored\"\n$         write sys$output \"Use MMK or MMS instead\"\n$       endif\n$     endif\n$     if cparm .eqs. \"HELP\" then gosub bhelp\n$   endif\n$   i = i + 1\n$   goto opt_loop\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Look for the compiler used\n$!\n$! Version history\n$! 0.01 20040223 First version to receive a number\n$! 0.02 20040229 Save/set value of decc$no_rooted_search_lists\n$! 0.03 20060202 Extend handling of GNU C\n$! 0.04 20090402 Compaq -> hp\n$CHECK_COMPILER:\n$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc))\n$ then\n$   its_decc = (f$search(\"SYS$SYSTEM:DECC$COMPILER.EXE\") .nes. \"\")\n$   its_vaxc = .not. its_decc .and. (F$Search(\"SYS$System:VAXC.Exe\") .nes. \"\")\n$   its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm(\"gnu_cc\") .nes. \"\")\n$ endif\n$!\n$! Exit if no compiler available\n$!\n$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc))\n$ then goto CC_ERR\n$ else\n$   if its_decc\n$   then\n$     write sys$output \"CC compiler check ... hp C\"\n$     if f$trnlnm(\"decc$no_rooted_search_lists\") .nes. \"\"\n$     then\n$       dnrsl = f$trnlnm(\"decc$no_rooted_search_lists\")\n$     endif\n$     define/nolog decc$no_rooted_search_lists 1\n$   else\n$     if its_vaxc then write sys$output \"CC compiler check ... VAX C\"\n$     if its_gnuc\n$     then\n$         write sys$output \"CC compiler check ... GNU C\"\n$         if f$trnlnm(topt) then write topt \"gnu_cc:[000000]gcclib.olb/lib\"\n$         if f$trnlnm(optf) then write optf \"gnu_cc:[000000]gcclib.olb/lib\"\n$         cc = \"gcc\"\n$     endif\n$     if f$trnlnm(topt) then write topt \"sys$share:vaxcrtl.exe/share\"\n$     if f$trnlnm(optf) then write optf \"sys$share:vaxcrtl.exe/share\"\n$   endif\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! If MMS/MMK are available dump out the descrip.mms if required\n$!\n$CREA_MMS:\n$ write sys$output \"Creating descrip.mms...\"\n$ create descrip.mms\n$ open/append out descrip.mms\n$ copy sys$input: out\n$ deck\n# descrip.mms: MMS description file for building zlib on VMS\n# written by Martin P.J. Zinser\n# <zinser@zinser.no-ip.info or martin.zinser@eurexchange.com>\n\nOBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\\\n       gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\\\n       deflate.obj, trees.obj, zutil.obj, inflate.obj, \\\n       inftrees.obj, inffast.obj\n\n$ eod\n$ write out \"CFLAGS=\", ccopt\n$ write out \"LOPTS=\", lopts\n$ write out \"all : example.exe minigzip.exe libz.olb\"\n$ copy sys$input: out\n$ deck\n        @ write sys$output \" Example applications available\"\n\nlibz.olb : libz.olb($(OBJS))\n\t@ write sys$output \" libz available\"\n\nexample.exe : example.obj libz.olb\n              link $(LOPTS) example,libz.olb/lib\n\nminigzip.exe : minigzip.obj libz.olb\n              link $(LOPTS) minigzip,libz.olb/lib\n\nclean :\n\tdelete *.obj;*,libz.olb;*,*.opt;*,*.exe;*\n\n\n# Other dependencies.\nadler32.obj  : adler32.c zutil.h zlib.h zconf.h\ncompress.obj : compress.c zlib.h zconf.h\ncrc32.obj    : crc32.c zutil.h zlib.h zconf.h\ndeflate.obj  : deflate.c deflate.h zutil.h zlib.h zconf.h\nexample.obj  : [.test]example.c zlib.h zconf.h\ngzclose.obj  : gzclose.c zutil.h zlib.h zconf.h\ngzlib.obj    : gzlib.c zutil.h zlib.h zconf.h\ngzread.obj   : gzread.c zutil.h zlib.h zconf.h\ngzwrite.obj  : gzwrite.c zutil.h zlib.h zconf.h\ninffast.obj  : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h\ninflate.obj  : inflate.c zutil.h zlib.h zconf.h\ninftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h\nminigzip.obj : [.test]minigzip.c zlib.h zconf.h\ntrees.obj    : trees.c deflate.h zutil.h zlib.h zconf.h\nuncompr.obj  : uncompr.c zlib.h zconf.h\nzutil.obj    : zutil.c zutil.h zlib.h zconf.h\ninfback.obj  : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h\n$ eod\n$ close out\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Read list of core library sources from makefile.in and create options\n$! needed to build shareable image\n$!\n$CREA_OLIST:\n$ open/read min makefile.in\n$ open/write mod modules.opt\n$ src_check_list = \"OBJZ =#OBJG =\"\n$MRLOOP:\n$ read/end=mrdone min rec\n$ i = 0\n$SRC_CHECK_LOOP:\n$ src_check = f$element(i, \"#\", src_check_list)\n$ i = i+1\n$ if src_check .eqs. \"#\" then goto mrloop\n$ if (f$extract(0,6,rec) .nes. src_check) then goto src_check_loop\n$ rec = rec - src_check\n$ gosub extra_filnam\n$ if (f$element(1,\"\\\",rec) .eqs. \"\\\") then goto mrloop\n$MRSLOOP:\n$ read/end=mrdone min rec\n$ gosub extra_filnam\n$ if (f$element(1,\"\\\",rec) .nes. \"\\\") then goto mrsloop\n$MRDONE:\n$ close min\n$ close mod\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Take record extracted in crea_olist and split it into single filenames\n$!\n$EXTRA_FILNAM:\n$ myrec = f$edit(rec - \"\\\", \"trim,compress\")\n$ i = 0\n$FELOOP:\n$ srcfil = f$element(i,\" \", myrec)\n$ if (srcfil .nes. \" \")\n$ then\n$   write mod f$parse(srcfil,,,\"NAME\"), \".obj\"\n$   i = i + 1\n$   goto feloop\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Find current Zlib version number\n$!\n$FIND_VERSION:\n$ open/read h_in 'v_file'\n$hloop:\n$ read/end=hdone h_in rec\n$ rec = f$edit(rec,\"TRIM\")\n$ if (f$extract(0,1,rec) .nes. \"#\") then goto hloop\n$ rec = f$edit(rec - \"#\", \"TRIM\")\n$ if f$element(0,\" \",rec) .nes. \"define\" then goto hloop\n$ if f$element(1,\" \",rec) .eqs. v_string\n$ then\n$   version = 'f$element(2,\" \",rec)'\n$   goto hdone\n$ endif\n$ goto hloop\n$hdone:\n$ close h_in\n$ return\n$!------------------------------------------------------------------------------\n$!\n$CHECK_CONFIG:\n$!\n$ in_ldef = f$locate(cdef,libdefs)\n$ if (in_ldef .lt. f$length(libdefs))\n$ then\n$   write aconf \"#define ''cdef' 1\"\n$   libdefs = f$extract(0,in_ldef,libdefs) + -\n              f$extract(in_ldef + f$length(cdef) + 1, -\n                        f$length(libdefs) - in_ldef - f$length(cdef) - 1, -\n                        libdefs)\n$ else\n$   if (f$type('cdef') .eqs. \"INTEGER\")\n$   then\n$     write aconf \"#define ''cdef' \", 'cdef'\n$   else\n$     if (f$type('cdef') .eqs. \"STRING\")\n$     then\n$       write aconf \"#define ''cdef' \", \"\"\"\", '''cdef'', \"\"\"\"\n$     else\n$       gosub check_cc_def\n$     endif\n$   endif\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Check if this is a define relating to the properties of the C/C++\n$! compiler\n$!\n$ CHECK_CC_DEF:\n$ if (cdef .eqs. \"_LARGEFILE64_SOURCE\")\n$ then\n$   copy sys$input: 'tc'\n$   deck\n#include \"tconfig\"\n#define _LARGEFILE\n#include <stdio.h>\n\nint main(){\nFILE *fp;\n  fp = fopen(\"temp.txt\",\"r\");\n  fseeko(fp,1,SEEK_SET);\n  fclose(fp);\n}\n\n$   eod\n$   test_inv = false\n$   comm_h = false\n$   gosub cc_prop_check\n$   return\n$ endif\n$ write aconf \"/* \", line, \" */\"\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Check for properties of C/C++ compiler\n$!\n$! Version history\n$! 0.01 20031020 First version to receive a number\n$! 0.02 20031022 Added logic for defines with value\n$! 0.03 20040309 Make sure local config file gets not deleted\n$! 0.04 20041230 Also write include for configure run\n$! 0.05 20050103 Add processing of \"comment defines\"\n$CC_PROP_CHECK:\n$ cc_prop = true\n$ is_need = false\n$ is_need = (f$extract(0,4,cdef) .eqs. \"NEED\") .or. (test_inv .eq. true)\n$ if f$search(th) .eqs. \"\" then create 'th'\n$ set message/nofac/noident/nosever/notext\n$ on error then continue\n$ cc 'tmpnam'\n$ if .not. ($status)  then cc_prop = false\n$ on error then continue\n$! The headers might lie about the capabilities of the RTL\n$ link 'tmpnam',tmp.opt/opt\n$ if .not. ($status)  then cc_prop = false\n$ set message/fac/ident/sever/text\n$ on error then goto err_exit\n$ delete/nolog 'tmpnam'.*;*/exclude='th'\n$ if (cc_prop .and. .not. is_need) .or. -\n     (.not. cc_prop .and. is_need)\n$ then\n$   write sys$output \"Checking for ''cdef'... yes\"\n$   if f$type('cdef_val'_yes) .nes. \"\"\n$   then\n$     if f$type('cdef_val'_yes) .eqs. \"INTEGER\" -\n         then call write_config f$fao(\"#define !AS !UL\",cdef,'cdef_val'_yes)\n$     if f$type('cdef_val'_yes) .eqs. \"STRING\" -\n         then call write_config f$fao(\"#define !AS !AS\",cdef,'cdef_val'_yes)\n$   else\n$     call write_config f$fao(\"#define !AS 1\",cdef)\n$   endif\n$   if (cdef .eqs. \"HAVE_FSEEKO\") .or. (cdef .eqs. \"_LARGE_FILES\") .or. -\n       (cdef .eqs. \"_LARGEFILE64_SOURCE\") then -\n      call write_config f$string(\"#define _LARGEFILE 1\")\n$ else\n$   write sys$output \"Checking for ''cdef'... no\"\n$   if (comm_h)\n$   then\n      call write_config f$fao(\"/* !AS */\",line)\n$   else\n$     if f$type('cdef_val'_no) .nes. \"\"\n$     then\n$       if f$type('cdef_val'_no) .eqs. \"INTEGER\" -\n           then call write_config f$fao(\"#define !AS !UL\",cdef,'cdef_val'_no)\n$       if f$type('cdef_val'_no) .eqs. \"STRING\" -\n           then call write_config f$fao(\"#define !AS !AS\",cdef,'cdef_val'_no)\n$     else\n$       call write_config f$fao(\"#undef !AS\",cdef)\n$     endif\n$   endif\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Check for properties of C/C++ compiler with multiple result values\n$!\n$! Version history\n$! 0.01 20040127 First version\n$! 0.02 20050103 Reconcile changes from cc_prop up to version 0.05\n$CC_MPROP_CHECK:\n$ cc_prop = true\n$ i    = 1\n$ idel = 1\n$ MT_LOOP:\n$ if f$type(result_'i') .eqs. \"STRING\"\n$ then\n$   set message/nofac/noident/nosever/notext\n$   on error then continue\n$   cc 'tmpnam'_'i'\n$   if .not. ($status)  then cc_prop = false\n$   on error then continue\n$! The headers might lie about the capabilities of the RTL\n$   link 'tmpnam'_'i',tmp.opt/opt\n$   if .not. ($status)  then cc_prop = false\n$   set message/fac/ident/sever/text\n$   on error then goto err_exit\n$   delete/nolog 'tmpnam'_'i'.*;*\n$   if (cc_prop)\n$   then\n$     write sys$output \"Checking for ''cdef'... \", mdef_'i'\n$     if f$type(mdef_'i') .eqs. \"INTEGER\" -\n         then call write_config f$fao(\"#define !AS !UL\",cdef,mdef_'i')\n$     if f$type('cdef_val'_yes) .eqs. \"STRING\" -\n         then call write_config f$fao(\"#define !AS !AS\",cdef,mdef_'i')\n$     goto msym_clean\n$   else\n$     i = i + 1\n$     goto mt_loop\n$   endif\n$ endif\n$ write sys$output \"Checking for ''cdef'... no\"\n$ call write_config f$fao(\"#undef !AS\",cdef)\n$ MSYM_CLEAN:\n$ if (idel .le. msym_max)\n$ then\n$   delete/sym mdef_'idel'\n$   idel = idel + 1\n$   goto msym_clean\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Write configuration to both permanent and temporary config file\n$!\n$! Version history\n$! 0.01 20031029 First version to receive a number\n$!\n$WRITE_CONFIG: SUBROUTINE\n$  write aconf 'p1'\n$  open/append confh 'th'\n$  write confh 'p1'\n$  close confh\n$ENDSUBROUTINE\n$!------------------------------------------------------------------------------\n$!\n$! Analyze the project map file and create the symbol vector for a shareable\n$! image from it\n$!\n$! Version history\n$! 0.01 20120128 First version\n$! 0.02 20120226 Add pre-load logic\n$!\n$ MAP_2_SHOPT: Subroutine\n$!\n$ SAY := \"WRITE_ SYS$OUTPUT\"\n$!\n$ IF F$SEARCH(\"''P1'\") .EQS. \"\"\n$ THEN\n$    SAY \"MAP_2_SHOPT-E-NOSUCHFILE:  Error, inputfile ''p1' not available\"\n$    goto exit_m2s\n$ ENDIF\n$ IF \"''P2'\" .EQS. \"\"\n$ THEN\n$    SAY \"MAP_2_SHOPT:  Error, no output file provided\"\n$    goto exit_m2s\n$ ENDIF\n$!\n$ module1 = \"deflate#deflateEnd#deflateInit_#deflateParams#deflateSetDictionary\"\n$ module2 = \"gzclose#gzerror#gzgetc#gzgets#gzopen#gzprintf#gzputc#gzputs#gzread\"\n$ module3 = \"gzseek#gztell#inflate#inflateEnd#inflateInit_#inflateSetDictionary\"\n$ module4 = \"inflateSync#uncompress#zlibVersion#compress\"\n$ open/read map 'p1\n$ if axp .or. ia64\n$ then\n$     open/write aopt a.opt\n$     open/write bopt b.opt\n$     write aopt \" CASE_SENSITIVE=YES\"\n$     write bopt \"SYMBOL_VECTOR= (-\"\n$     mod_sym_num = 1\n$ MOD_SYM_LOOP:\n$     if f$type(module'mod_sym_num') .nes. \"\"\n$     then\n$         mod_in = 0\n$ MOD_SYM_IN:\n$         shared_proc = f$element(mod_in, \"#\", module'mod_sym_num')\n$         if shared_proc .nes. \"#\"\n$         then\n$             write aopt f$fao(\" symbol_vector=(!AS/!AS=PROCEDURE)\",-\n        \t\t       f$edit(shared_proc,\"upcase\"),shared_proc)\n$             write bopt f$fao(\"!AS=PROCEDURE,-\",shared_proc)\n$             mod_in = mod_in + 1\n$             goto mod_sym_in\n$         endif\n$         mod_sym_num = mod_sym_num + 1\n$         goto mod_sym_loop\n$     endif\n$MAP_LOOP:\n$     read/end=map_end map line\n$     if (f$locate(\"{\",line).lt. f$length(line)) .or. -\n         (f$locate(\"global:\", line) .lt. f$length(line))\n$     then\n$         proc = true\n$         goto map_loop\n$     endif\n$     if f$locate(\"}\",line).lt. f$length(line) then proc = false\n$     if f$locate(\"local:\", line) .lt. f$length(line) then proc = false\n$     if proc\n$     then\n$         shared_proc = f$edit(line,\"collapse\")\n$         chop_semi = f$locate(\";\", shared_proc)\n$         if chop_semi .lt. f$length(shared_proc) then -\n              shared_proc = f$extract(0, chop_semi, shared_proc)\n$         write aopt f$fao(\" symbol_vector=(!AS/!AS=PROCEDURE)\",-\n        \t\t\t f$edit(shared_proc,\"upcase\"),shared_proc)\n$         write bopt f$fao(\"!AS=PROCEDURE,-\",shared_proc)\n$     endif\n$     goto map_loop\n$MAP_END:\n$     close/nolog aopt\n$     close/nolog bopt\n$     open/append libopt 'p2'\n$     open/read aopt a.opt\n$     open/read bopt b.opt\n$ALOOP:\n$     read/end=aloop_end aopt line\n$     write libopt line\n$     goto aloop\n$ALOOP_END:\n$     close/nolog aopt\n$     sv = \"\"\n$BLOOP:\n$     read/end=bloop_end bopt svn\n$     if (svn.nes.\"\")\n$     then\n$        if (sv.nes.\"\") then write libopt sv\n$        sv = svn\n$     endif\n$     goto bloop\n$BLOOP_END:\n$     write libopt f$extract(0,f$length(sv)-2,sv), \"-\"\n$     write libopt \")\"\n$     close/nolog bopt\n$     delete/nolog/noconf a.opt;*,b.opt;*\n$ else\n$     if vax\n$     then\n$     open/append libopt 'p2'\n$     mod_sym_num = 1\n$ VMOD_SYM_LOOP:\n$     if f$type(module'mod_sym_num') .nes. \"\"\n$     then\n$         mod_in = 0\n$ VMOD_SYM_IN:\n$         shared_proc = f$element(mod_in, \"#\", module'mod_sym_num')\n$         if shared_proc .nes. \"#\"\n$         then\n$     \t      write libopt f$fao(\"UNIVERSAL=!AS\",-\n      \t  \t\t\t     f$edit(shared_proc,\"upcase\"))\n$             mod_in = mod_in + 1\n$             goto vmod_sym_in\n$         endif\n$         mod_sym_num = mod_sym_num + 1\n$         goto vmod_sym_loop\n$     endif\n$VMAP_LOOP:\n$     \t  read/end=vmap_end map line\n$     \t  if (f$locate(\"{\",line).lt. f$length(line)) .or. -\n   \t      (f$locate(\"global:\", line) .lt. f$length(line))\n$     \t  then\n$     \t      proc = true\n$     \t      goto vmap_loop\n$     \t  endif\n$     \t  if f$locate(\"}\",line).lt. f$length(line) then proc = false\n$     \t  if f$locate(\"local:\", line) .lt. f$length(line) then proc = false\n$     \t  if proc\n$     \t  then\n$     \t      shared_proc = f$edit(line,\"collapse\")\n$     \t      chop_semi = f$locate(\";\", shared_proc)\n$     \t      if chop_semi .lt. f$length(shared_proc) then -\n      \t  \t  shared_proc = f$extract(0, chop_semi, shared_proc)\n$     \t      write libopt f$fao(\"UNIVERSAL=!AS\",-\n      \t  \t\t\t     f$edit(shared_proc,\"upcase\"))\n$     \t  endif\n$     \t  goto vmap_loop\n$VMAP_END:\n$     else\n$         write sys$output \"Unknown Architecture (Not VAX, AXP, or IA64)\"\n$         write sys$output \"No options file created\"\n$     endif\n$ endif\n$ EXIT_M2S:\n$ close/nolog map\n$ close/nolog libopt\n$ endsubroutine\n"
  },
  {
    "path": "src/test/resources/samples/langs/DIGITAL Command Language/libxslt_build.com",
    "content": "$! BUILD_XSLT.COM\n$!\n$! Build the XSLT library\n$!\n$! Arguments:\n$!\n$!\tp1\t- \"DEBUG\" is you want to build with debug\n$!\n$! This package requires libxml to have already been installed.  You need\n$! to ensure that the logical name LIBXML is defined and points to the \n$! directory containing libxml's .h files\n$!\n$! This procedure creates the object libraries\n$!\n$!\tXML_LIBDIR:LIBXSLT.OLB\n$!\tXML_LIBDIR:LIBEXSLT.OLB\n$!\n$! and the program\n$!\n$!\tXSLTPROC\n$!\n$! After the library is built, you can link these routines into\n$! your code with the command  \n$!\n$! \tLINK your_modules,XML_LIBDIR:LIBEXSLT/LIB,LIBXSLT/LIBRARY,LIBXML/LIB\n$!\n$! Change History\n$! --------------\n$! Command file author : John A Fotheringham (jaf@jafsoft.com)\n$! Last update         : 2 Nov 2001\n$! \n$!- configuration -------------------------------------------------------------\n$!\n$!- compile command.\n$!\n$   cc_opts = \"/INCLUDE=([],XML_SRCDIR:,[-.libxslt])/NAMES=(SHORTENED)/FLOAT=IEEE/IEEE_MODE=DENORM_RESULTS\"\n$!\n$   if p1.eqs.\"DEBUG\"\n$   then\n$     debug = \"Y\"\n$     cc_command = \"CC''cc_opts'/DEBUG/NOOPTIMIZE/LIST/SHOW=ALL\"\n$   else\n$     debug = \"N\"\n$     cc_command = \"CC''cc_opts'\"\n$   endif\n$!\n$!- configure multiple build passes for each library. -------------------------\n$!\n$!  For each pass:\n$!\n$!  \"libname\" is the name of the library or module being created\n$!\n$!  \"progname\" is the name of the program being created\n$!\n$!  \"src\" is the list of sources to be built into the library  or program\n$!\t- This should be compared to the definition of \n$!\t  \"<NAME>_la_SOURCES\" in the MAKEFILE.IN file in \n$!\t  corresponding directory.\n$!\n$   num_passes = 3\t! two libraries and a program\n$!\n$!- pass 1 - library LIBXSLT\n$!\n$   libname_1  = \"LIBXSLT\"\n$   h_file_1   = \"xslt.h\"\n$   progname_1 = \"\"\n$!\n$   ! see \"libxslt_la_SOURCES\" in [.libxslt]makefile.in\n$   src_1 = \"xslt.c xsltutils.c pattern.c templates.c variables.c keys.c\"\n$   src_1 = src_1 + \" numbers.c extensions.c extra.c functions.c\"\n$   src_1 = src_1 + \" namespaces.c imports.c attributes.c documents.c\"\n$   src_1 = src_1 + \" preproc.c transform.c security.c\"\n$!\n$!- pass 2 - library LIBEXSLT\n$!\n$   libname_2  = \"LIBEXSLT\"\n$   h_file_2   = \"exslt.h\"\n$   progname_2 = \"\"\n$!\n$   ! see \"libexslt_la_SOURCES\" in [.libexslt]makefile.in\n$   src_2   = \"exslt.c common.c math.c sets.c functions.c strings.c date.c saxon.c dynamic.c\"\n$!\n$!- pass 3 - program XSLTPROC\n$!\n$   libname_3  = \"\"\n$   h_file_3   = \"\"\n$   progname_3 = \"XSLTPROC\"\n$!\n$   ! see \"xsltproc_SOURCES\" in [.xsltproc]makefile.in\n$   src_3   = \"xsltproc.c\"\n$!\n$!- set up and check logicals  -----------------------------------------------\n$!\n$!  XML_LIBDIR - object library directory\n$!  XML_SRCDIR - top-level build directory of libxml package -- needed for config.h and trio.h\n$!  LIBXML - source directory containing .h files for libxml package\n$!\n$   if f$trnlnm(\"XML_LIBDIR\").eqs.\"\"\n$   then\n$     on error then continue\n$     globfile = f$search(\"[--...]libxml.olb\")\n$     if globfile.eqs.\"\"\n$     then\n$       write sys$output \"\"\n$       write sys$output \"\tYou need to define the XML_LIBDIR logical name to\"\n$       write sys$output \"\tpoint to the directory containing your object\"\n$       write sys$output \"\tlibraries.  This should already contain LIBXML.OLB\"\n$       write sys$output \"\tfrom the libxml package, and will be the directory\"\n$       write sys$output \"\tthe new LIBXSLT.OLB library will be placed in\"\n$       write sys$output \"\"\n$       exit\n$     else\n$\tsrcdir = f$parse(globfile,,,\"DEVICE\") + f$parse(globfile,,,\"DIRECTORY\")\n$\tdefine/process XML_LIBDIR \"''srcdir'\"\n$       write sys$output \"Defining XML_LIBDIR as \"\"''srcdir'\"\"\"\n$     endif\n$   endif\n$!\n$   if f$trnlnm(\"libxml\").eqs.\"\"\n$   then\n$     ! look for globals.h in a directory installed paralle to this one\n$     on error then continue\n$     globfile = f$search(\"[--...]globals.h\")\n$     if globfile.eqs.\"\"\n$     then\n$       write sys$output \"\"\n$       write sys$output \"\tYou need to define a LIBXML logical directory to\"\n$       write sys$output \"\tpoint to the directory containing the .h files\"\n$       write sys$output \"\tfor the libxml package\"\n$       write sys$output \"\"\n$       exit\n$     else\n$\tsrcdir = f$element(0,\"]\",globfile)+ \"]\"\n$\tdefine/process LIBXML \"''srcdir'\"\n$       write sys$output \"Defining LIBXML as \"\"''srcdir'\"\"\"\n$     endif\n$   endif\n$!\n$   if f$trnlnm(\"XML_SRCDIR\").eqs.\"\"\n$   then\n$     globfile = f$search(\"[--...]globals.c\")\n$     if globfile.eqs.\"\"\n$     then\n$\twrite sys$output \"Can't locate globals.c.  You need to manually define a XML_SRCDIR logical\"\n$\texit\n$     else\n$\tsrcdir = f$parse(globfile,,,\"DEVICE\") + f$parse(globfile,,,\"DIRECTORY\")\n$\tdefine/process XML_SRCDIR \"''srcdir'\"\n$       write sys$output \"Defining XML_SRCDIR as \"\"''srcdir'\"\"\"\n$     endif\n$   endif\n$!\n$!- set up some working logicals -------------------\n$!\n$ pass_no = 1\n$ set_pass_logical:\n$!\n$   if pass_no.le.num_passes\n$   then\n$!\n$     Libname  = libname_'pass_no'\n$     progname = progname_'pass_no'\n$     if libname.nes.\"\"\n$     then\n$       logname  = \"''libname'_SRCDIR\"\n$     else\n$       logname  = \"''progname'_SRCDIR\"\n$     endif\n$     findfile = f$element(0,\" \",src_'pass_no')\n$!\n$!--- set up a source directory logical\n$!\n$     if f$trnlnm(\"''logname'\").eqs.\"\"\n$     then\n$       ! look for the target file in a parallel subdirectory\n$       globfile = f$search(\"[-...]''findfile'\")\n$       if globfile.eqs.\"\"\n$       then\n$  \t  write sys$output \"Can't locate ''findfile'.  You need to manually define a ''logname' logical\"\n$\t  exit\n$       else\n$  \t  srcdir = f$element(0,\"]\",globfile)+ \"]\"\n$\t  define/process 'logname' \"''srcdir'\"\n$         write sys$output \"Defining ''logname' as \"\"''srcdir'\"\"\"\n$       endif\n$     endif\n$!\n$!--- if it's a library, set up a logical pointing to the .h files\n$!\n$     if libname.nes.\"\" \n$     then\n$\tif f$trnlnm(\"''libname'\").eqs.\"\" \n$       then \n$         ! look for the target .h file in a parallel subdirectory\n$  \t  h_file = h_file_'pass_no'\n$         globfile = f$search(\"[-...]''h_file'\")\n$         if globfile.eqs.\"\"\n$         then\n$\t    write sys$output \"Can't locate ''h_file'.  You need to manually define a ''libname' logical\"\n$\t    exit\n$         else\n$\t    includedir = f$element(0,\"]\",globfile)+ \"]\"\n$\t    define/process 'libname' \"''includedir'\"\n$           write sys$output \"Defining ''libname' as \"\"''includedir'\"\"\"\n$\t  endif\n$       endif\n$     endif\n$!\n$     pass_no = pass_no +1\n$     goto set_pass_logical\n$!\n$   endif\t! for each pass\n$!\n$!- set up error handling (such as it is) -------------------------------------\n$!\n$ exit_status = 1\n$ saved_default = f$environment(\"default\")\n$ on error then goto ERROR_OUT \n$ on control_y then goto ERROR_OUT \n$!\n$ goto start_here\n$ start_here:\t  ! move this line to debug/rerun parts of this command file\n$!\n$!- compile modules into the library ------------------------------------------\n$!\n$!\n$ pass_no = 1\t! make three passes, one for each library, one for XSLTPROC\n$ pass_loop:\n$!\n$ if pass_no.le.num_passes\n$ then\n$   Libname  = libname_'pass_no'\n$   progname = progname_'pass_no'\n$   if libname.nes.\"\"\n$   then\n$     logname  = \"''libname'_SRCDIR\"\n$     pass_description = \"the XML_LIBDIR:''libname'.OLB object library\"\n$   else\n$     logname  = \"''progname'_SRCDIR\"\n$     pass_description = \"the programs in ''progname'\"\n$   endif\n$   src  = src_'pass_no'\n$!\n$!- create the library if need\n$!\n$   if libname.nes.\"\" \n$   then\n$     if f$search(\"XML_LIBDIR:''libname'.OLB\").eqs.\"\" \n$     then\n$       write sys$output \"Creating new object library XML_LIBDIR:''libname'.OLB...\"\n$       library/create XML_LIBDIR:'libname'.OLB\n$     endif\n$   endif\n$!\n$!- move to the source directory \n$!\n$   set def 'logname'\n$!\n$!- define the library and link commands (link command not used as is)\n$!\n$   if libname.nes.\"\"\n$   then\n$     lib_command  = \"LIBRARY/REPLACE XML_LIBDIR:''libname'.OLB\"\n$     link_command = \"\"\n$   else\n$     lib_command  = \"\"\n$     link_command = \"LINK\"\n$   endif\n$!\n$   write sys$output \"\"\n$   write sys$output \"Building ''pass_description'\n$   write sys$output \"\"\n$!\n$   s_no = 0\n$   src = f$edit(src,\"COMPRESS\")\n$!\n$ source_loop:\n$!\n$     next_source = f$element (S_no,\" \",src)\n$     if next_source.nes.\"\" .and. next_source.nes.\" \"\n$     then\n$       call build 'next_source'\n$       s_no = s_no + 1\n$       goto source_loop\n$     endif\n$!\n$     pass_no = pass_no + 1\n$     goto pass_loop\n$!\n$   endif\t! for each pass\n$!\n$!- Th-th-th-th-th-that's all folks! ------------------------------------------\n$!\n$EXIT_OUT:\n$!\n$ set def 'saved_default\n$ exit 'exit_status\n$!\n$\n$ERROR_OUT:\n$ exit_status = $status\n$ write sys$output \"''f$message(exit_status)'\"\n$ goto EXIT_OUT\n$!\f\n$!- the BUILD subroutine.  Compile then insert into library or link as required\n$!\n$BUILD: subroutine\n$   on warning then goto EXIT_BUILD\n$   source_file = p1\n$   name = f$element(0,\".\",source_file)\n$   object_file = f$fao(\"XML_LIBDIR:!AS.OBJ\",name)\n$!\n$!- compile\n$   write sys$output \"Compiling \",p1,p2,\"...\"\n$   cc_command /object='object_file 'source_file' 'p2'\n$!\n$!- insert into library if command defined\n$!\n$   if lib_command.nes.\"\"  \n$   then \n$     lib_command 'object_file'\n$     delete/nolog 'object_file';*\n$   endif\n$!\n$!- link module if command defined\n$!\n$   if link_command.nes.\"\" \n$   then\n$\ttext = f$element(0,\".\",p1)\t! lose the \".c\"\n$\twrite sys$output \"Linking \",text,\"...\"\n$\tdbgopts = \"\"\n$\tif debug then dbgopts = \"/DEBUG\"\n$\tlink_command'dbgopts' 'object_file',-\n      \t\tXML_LIBDIR:libexslt/lib,-\n      \t\tXML_LIBDIR:libxslt/lib,-\n      \t\tXML_LIBDIR:libxml/library\n$   endif\n$!\n$EXIT_BUILD:\n$   exit $status\n$!\n$endsubroutine\n"
  },
  {
    "path": "src/test/resources/samples/langs/DIGITAL Command Language/vmsbackup_build.com",
    "content": "$! Compiling with VAXC is said to work, but it requires the usual cruft\n$! (vaxcrtl and all), and to avoid hair we don't supply said cruft here.\n$ CC/DECC/PREFIX=all VMSBACKUP.C/DEFINE=(HAVE_MT_IOCTLS=0,HAVE_UNIXIO_H=1)\n$ CC/DECC/PREFIX=all DCLMAIN.C\n$! Probably we don't want match as it probably doesn't implement VMS-style\n$! matching, but I haven't looking into the issues yet.\n$ CC/DECC/PREFIX=all match\n$ LINK/exe=VMSBACKUP.EXE -\nvmsbackup.obj,dclmain.obj,match.obj,sys$input/opt\nidentification=\"VMSBACKUP4.1.1\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/DM/example.dm",
    "content": "// This is a single line comment.\n/*\n\tThis is a multi-line comment\n*/\n\n// Pre-processor keywords\n\n#define PI 3.1415\n\n#if PI == 4\n\n#define G 5\n\n#elif PI == 3\n\n#define I 6\n\n#else\n\n#define K 7\n\n#endif\n\n\nvar/GlobalCounter = 0\nvar/const/CONST_VARIABLE = 2\nvar/list/MyList = list(\"anything\", 1, new /datum/entity)\nvar/list/EmptyList[99] // creates a list of 99 null entries\nvar/list/NullList = null\n\n/*\n\tEntity Class\n*/\n\n/datum/entity\n\tvar/name = \"Entity\"\n\tvar/number = 0\n\n/datum/entity/proc/myFunction()\n\tworld.log << \"Entity has called myFunction\"\n\n/datum/entity/New()\n\tnumber = GlobalCounter++\n\n/*\n\tUnit Class, Extends from Entity\n*/\n\n/datum/entity/unit\n\tname = \"Unit\"\n\n/datum/entity/unit/New()\n\t..() // calls the parent's proc; equal to super() and base() in other languages\n\tnumber = rand(1, 99)\n\n/datum/entity/unit/myFunction()\n\tworld.log << \"Unit has overriden and called myFunction\"\n\n// Global Function\n/proc/ReverseList(var/list/input)\n\tvar/list/output = list()\n\tfor(var/i = input.len; i >= 1; i--) // IMPORTANT: List Arrays count from 1.\n\t\toutput += input[i] // \"+= x\" is \".Add(x)\"\n\treturn output\n\n// Bitflags\n/proc/DoStuff()\n\tvar/bitflag = 0\n\tbitflag |= 8\n\treturn bitflag\n\n/proc/DoOtherStuff()\n\tvar/bitflag = 65535 // 16 bits is the maximum amount\n\tbitflag &= ~8\n\treturn bitflag\n\n// Logic\n/proc/DoNothing()\n\tvar/pi = PI\n\tif(pi == 4)\n\t\tworld.log << \"PI is 4\"\n\telse if(pi == CONST_VARIABLE)\n\t\tworld.log << \"PI is [CONST_VARIABLE]!\"\n\telse\n\t\tworld.log << \"PI is approximety [pi]\"\n\n#undef PI // Undefine PI"
  },
  {
    "path": "src/test/resources/samples/langs/DNS Zone/sample.arpa",
    "content": "$ORIGIN 0.0.0.c.2.1.0.3.0.0.2.1.e.f.f.3.ip6.arpa.\n$TTL     60\n@ \t IN SOA ns root (\n\t     2002042901 ; SERIAL\n\t     7200       ; REFRESH\n\t     600        ; RETRY\n\t     36000000   ; EXPIRE\n\t     120        ; MINIMUM\n\t     )\n\n\t    NS\t ns.example.com.\n\nc.a.7.e.d.7.e.f.f.f.0.2.8.0.a.0 PTR  sip01.example.com.\n"
  },
  {
    "path": "src/test/resources/samples/langs/DNS Zone/sneaky.net.zone",
    "content": "$TTL 3d\n@ IN SOA root.localhost. root.sneaky.net. (\n    2015042907 ; serial\n    3d         ; refresh\n    1h         ; retry\n    12d        ; expire\n    2h         ; negative response TTL\n  )\n  IN NS root.localhost.\n  IN NS localhost. ; secondary name server is preferably externally maintained\n\nwww IN A 3.141.59.26\n"
  },
  {
    "path": "src/test/resources/samples/langs/DOS Batch/BatchInstall.bat",
    "content": "@ECHO OFF\r\nREM.-- Prepare the Command Processor\r\nSETLOCAL ENABLEEXTENSIONS\r\nSETLOCAL ENABLEDELAYEDEXPANSION\r\n\r\nREM.-- Version History --\r\nREM         XX.XXX           YYYYMMDD Author Description\r\nSET version=01.000-beta &rem 20051201 p.h.  initial version, providing the framework\r\nREM !! For a new version entry, copy the last entry down and modify Date, Author and Description\r\nSET version=%version: =%\r\n\r\nREM.-- Set the window title\r\nSET title=%~n0\r\nTITLE %title%\r\n\r\nREM.--initialize the variables\r\nset FilePersist=%~dpn0+.cmd&     rem --define the filename where persistent variables get stored\r\nset             SvrCli_choice=,Server,Client,\r\ncall:setPersist SvrCli=Server\r\nset             bShowReadMe_choice=,Yes,No,\r\ncall:setPersist bShowReadMe=No\r\nset             InstSize_choice=,Full,Regular,Mini,\r\ncall:setPersist InstSize=Full\r\n\r\nrem.--read the persistent variables from the storage\r\ncall:restorePersistentVars \"%FilePersist%\"\r\n\r\n\r\n\r\n:menuLOOP\r\necho.\r\necho.= Menu =================================================\r\necho.\r\nfor /f \"tokens=1,2,* delims=_ \" %%A in ('\"findstr /b /c:\":menu_\" \"%~f0\"\"') do echo.  %%B  %%C\r\nset choice=\r\necho.&set /p choice=Make a choice or hit ENTER to quit: ||(\r\n    call:savePersistentVars \"%FilePersist%\"&   rem --save the persistent variables to the storage\r\n    GOTO:EOF\r\n)\r\necho.&call:menu_%choice%\r\nGOTO:menuLOOP\r\n\r\n::-----------------------------------------------------------\r\n:: menu functions follow below here\r\n::-----------------------------------------------------------\r\n\r\n:menu_Options:\r\n\r\n:menu_1   Install version              : '!SvrCli!' [!SvrCli_choice:~1,-1!]\r\ncall:getNextInList SvrCli \"!SvrCli_choice!\"\r\ncls\r\nGOTO:EOF\r\n\r\n:menu_2   Size of installation         : '!InstSize!' [!InstSize_choice:~1,-1!]\r\ncall:getNextInList InstSize \"!InstSize_choice!\"\r\ncls\r\nGOTO:EOF\r\n\r\n:menu_3   Show Readme.txt when finished: '!bShowReadMe!' [!bShowReadMe_choice:~1,-1!]\r\ncall:getNextInList bShowReadMe \"!bShowReadMe_choice!\"\r\ncls\r\nGOTO:EOF\r\n\r\n:menu_\r\n:menu_Execute:\r\n\r\n:menu_I   Start Installation (simulation only)\r\n\r\nset maxcnt=20\r\nif /i \"%InstSize:~0,1%\"==\"F\" set maxcnt=11\r\nif /i \"%InstSize:~0,1%\"==\"R\" set maxcnt=7\r\nif /i \"%InstSize:~0,1%\"==\"M\" set maxcnt=3\r\n\r\necho.Simulating an installation for !maxcnt! files...\r\ncall:initProgress maxcnt\r\nfor /l %%C in (1,1,!maxcnt!) do (\r\n    echo.Pretend to install !SvrCli! file %%C.\r\n    call:sleep 1\r\n    call:doProgress\r\n)\r\ncall:sleep 1\r\nTITLE %title%\r\nif /i \"%bShowReadMe:~0,1%\"==\"Y\" notepad ReadMe.txt\r\nGOTO:EOF\r\n\r\n:menu_C   Clear Screen\r\ncls\r\nGOTO:EOF\r\n\r\n\r\n::-----------------------------------------------------------\r\n:: helper functions follow below here\r\n::-----------------------------------------------------------\r\n\r\n\r\n:setPersist -- to be called to initialize persistent variables\r\n::          -- %*: set command arguments\r\nset %*\r\nGOTO:EOF\r\n\r\n\r\n:getPersistentVars -- returns a comma separated list of persistent variables\r\n::                 -- %~1: reference to return variable\r\nSETLOCAL\r\nset retlist=\r\nset parse=findstr /i /c:\"call:setPersist\" \"%~f0%\"^|find /v \"ButNotThisLine\"\r\nfor /f \"tokens=2 delims== \" %%a in ('\"%parse%\"') do (set retlist=!retlist!%%a,)\r\n( ENDLOCAL & REM RETURN VALUES\r\n    IF \"%~1\" NEQ \"\" SET %~1=%retlist%\r\n)\r\nGOTO:EOF\r\n\r\n\r\n:savePersistentVars -- Save values of persistent variables into a file\r\n::                  -- %~1: file name\r\nSETLOCAL\r\necho.>\"%~1\"\r\ncall :getPersistentVars persvars\r\nfor %%a in (%persvars%) do (echo.SET %%a=!%%a!>>\"%~1\")\r\nGOTO:EOF\r\n\r\n\r\n:restorePersistentVars -- Restore the values of the persistent variables\r\n::                     -- %~1: batch file name to restore from\r\nif exist \"%FilePersist%\" call \"%FilePersist%\"\r\nGOTO:EOF\r\n\r\n\r\n:getNextInList -- return next value in list\r\n::             -- %~1 - in/out ref to current value, returns new value\r\n::             -- %~2 - in     choice list, must start with delimiter which must not be '@'\r\nSETLOCAL\r\nset lst=%~2&             rem.-- get the choice list\r\nif \"%lst:~0,1%\" NEQ \"%lst:~-1%\" echo.ERROR Choice list must start and end with the delimiter&GOTO:EOF\r\nset dlm=%lst:~-1%&       rem.-- extract the delimiter used\r\nset old=!%~1!&           rem.-- get the current value\r\nset fst=&for /f \"delims=%dlm%\" %%a in (\"%lst%\") do set fst=%%a&rem.--get the first entry\r\n                         rem.-- replace the current value with a @, append the first value\r\nset lll=!lst:%dlm%%old%%dlm%=%dlm%@%dlm%!%fst%%dlm%\r\n                         rem.-- get the string after the @\r\nfor /f \"tokens=2 delims=@\" %%a in (\"%lll%\") do set lll=%%a\r\n                         rem.-- extract the next value\r\nfor /f \"delims=%dlm%\" %%a in (\"%lll%\") do set new=%%a\r\n( ENDLOCAL & REM RETURN VALUES\r\n    IF \"%~1\" NEQ \"\" (SET %~1=%new%) ELSE (echo.%new%)\r\n)\r\nGOTO:EOF\r\n\r\n\r\n:initProgress -- initialize an internal progress counter and display the progress in percent\r\n::            -- %~1: in  - progress counter maximum, equal to 100 percent\r\n::            -- %~2: in  - title string formatter, default is '[P] completed.'\r\nset /a ProgressCnt=-1\r\nset /a ProgressMax=%~1\r\nset ProgressFormat=%~2\r\nif \"%ProgressFormat%\"==\"\" set ProgressFormat=[PPPP]\r\nset ProgressFormat=!ProgressFormat:[PPPP]=[P] completed.!\r\ncall :doProgress\r\nGOTO:EOF\r\n\r\n\r\n:doProgress -- display the next progress tick\r\nset /a ProgressCnt+=1\r\nSETLOCAL\r\nset /a per=100*ProgressCnt/ProgressMax\r\nset per=!per!%%\r\ntitle %ProgressFormat:[P]=!per!%\r\nGOTO:EOF\r\n\r\n\r\n\r\n\r\nFOR /l %%a in (%~1,-1,1) do (ping -n 2 -w 1 127.0.0.1>NUL)\r\ngoto :eof\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/DTrace/counts.d",
    "content": "/*\n * This software is in the public domain.\n *\n * $Id: counts.d 10510 2005-08-15 01:46:19Z kateturner $\n */\n\n#pragma D option quiet\n\nself int tottime;\nBEGIN {\n\ttottime = timestamp;\n}\n\nphp$target:::function-entry\n\t@counts[copyinstr(arg0)] = count();\n}\n\nEND {\n\tprintf(\"Total time: %dus\\n\", (timestamp - tottime) / 1000);\n\tprintf(\"# calls by function:\\n\");\n\tprinta(\"%-40s %@d\\n\", @counts);\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/DTrace/probes.d",
    "content": "/* ----------\n *\tDTrace probes for PostgreSQL backend\n *\n *\tCopyright (c) 2006-2009, PostgreSQL Global Development Group\n *\n *\t$PostgreSQL: pgsql/src/backend/utils/probes.d,v 1.11 2009/04/02 20:59:10 momjian Exp $\n * ----------\n */\n\n\n/*\n * Typedefs used in PostgreSQL.\n *\n * NOTE: Do not use system-provided typedefs (e.g. uintptr_t, uint32_t, etc)\n * in probe definitions, as they cause compilation errors on Mac OS X 10.5.\n */\n#define LocalTransactionId unsigned int\n#define LWLockId int\n#define LWLockMode int\n#define LOCKMODE int\n#define BlockNumber unsigned int\n#define Oid unsigned int\n#define ForkNumber int\n#define bool char\n\nprovider postgresql {\n\n\tprobe transaction__start(LocalTransactionId);\n\tprobe transaction__commit(LocalTransactionId);\n\tprobe transaction__abort(LocalTransactionId);\n\n\tprobe lwlock__acquire(LWLockId, LWLockMode);\n\tprobe lwlock__release(LWLockId);\n\tprobe lwlock__wait__start(LWLockId, LWLockMode);\n\tprobe lwlock__wait__done(LWLockId, LWLockMode);\n\tprobe lwlock__condacquire(LWLockId, LWLockMode);\n\tprobe lwlock__condacquire__fail(LWLockId, LWLockMode);\n\n\tprobe lock__wait__start(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE);\n\tprobe lock__wait__done(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE);\n\n\tprobe query__parse__start(const char *);\n\tprobe query__parse__done(const char *);\n\tprobe query__rewrite__start(const char *);\n\tprobe query__rewrite__done(const char *);\n\tprobe query__plan__start();\n\tprobe query__plan__done();\n\tprobe query__execute__start();\n\tprobe query__execute__done();\n\tprobe query__start(const char *);\n\tprobe query__done(const char *);\n\tprobe statement__status(const char *);\n\n\tprobe sort__start(int, bool, int, int, bool);\n\tprobe sort__done(bool, long);\n\n\tprobe buffer__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid, bool, bool);\n\tprobe buffer__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, bool, bool, bool);\n\tprobe buffer__flush__start(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\tprobe buffer__flush__done(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\n\tprobe buffer__checkpoint__start(int);\n\tprobe buffer__checkpoint__sync__start();\n\tprobe buffer__checkpoint__done();\n\tprobe buffer__sync__start(int, int);\n\tprobe buffer__sync__written(int);\n\tprobe buffer__sync__done(int, int, int);\n\tprobe buffer__write__dirty__start(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\tprobe buffer__write__dirty__done(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\n\tprobe deadlock__found();\n\n\tprobe checkpoint__start(int);\n\tprobe checkpoint__done(int, int, int, int, int);\n\tprobe clog__checkpoint__start(bool);\n\tprobe clog__checkpoint__done(bool);\n\tprobe subtrans__checkpoint__start(bool);\n\tprobe subtrans__checkpoint__done(bool);\n\tprobe multixact__checkpoint__start(bool);\n\tprobe multixact__checkpoint__done(bool);\n\tprobe twophase__checkpoint__start();\n\tprobe twophase__checkpoint__done();\n\n\tprobe smgr__md__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\tprobe smgr__md__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int);\n\tprobe smgr__md__write__start(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\tprobe smgr__md__write__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int);\n\n\tprobe xlog__insert(unsigned char, unsigned char);\n\tprobe xlog__switch();\n\tprobe wal__buffer__write__dirty__start();\n\tprobe wal__buffer__write__dirty__done();\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/DTrace/trace_futexes.d",
    "content": "#!/usr/sbin/dtrace -qs\n\n// Source: https://github.com/bycn82/freebsd/blob/12a4a4a008eac3cfa71e496b33eaeaf426c374c1/sys/compat/linux/trace_futexes.d\n\n/*-\n * Copyright (c) 2011-2012 Alexander Leidinger <netchild@FreeBSD.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer\n *    in this position and unchanged.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * $FreeBSD$\n */\n\n/**\n * Trace futex operations:\n *  - internal locks\n *  - size of the futex list\n *  - report error conditions (emulation errors, kernel errors,\n *    programming errors)\n *  - execution time (wallclock) of futex related functions\n */\n\n#pragma D option specsize=32m\n\n/* Error conditions */\nlinuxulator*:futex:futex_get:error,\nlinuxulator*:futex:futex_sleep:requeue_error,\nlinuxulator*:futex:futex_sleep:sleep_error,\nlinuxulator*:futex:futex_wait:copyin_error,\nlinuxulator*:futex:futex_wait:itimerfix_error,\nlinuxulator*:futex:futex_wait:sleep_error,\nlinuxulator*:futex:futex_atomic_op:missing_access_check,\nlinuxulator*:futex:futex_atomic_op:unimplemented_op,\nlinuxulator*:futex:futex_atomic_op:unimplemented_cmp,\nlinuxulator*:futex:linux_sys_futex:unimplemented_clockswitch,\nlinuxulator*:futex:linux_sys_futex:copyin_error,\nlinuxulator*:futex:linux_sys_futex:unhandled_efault,\nlinuxulator*:futex:linux_sys_futex:unimplemented_lock_pi,\nlinuxulator*:futex:linux_sys_futex:unimplemented_unlock_pi,\nlinuxulator*:futex:linux_sys_futex:unimplemented_trylock_pi,\nlinuxulator*:futex:linux_sys_futex:unimplemented_wait_requeue_pi,\nlinuxulator*:futex:linux_sys_futex:unimplemented_cmp_requeue_pi,\nlinuxulator*:futex:linux_sys_futex:unknown_operation,\nlinuxulator*:futex:linux_get_robust_list:copyout_error,\nlinuxulator*:futex:handle_futex_death:copyin_error,\nlinuxulator*:futex:fetch_robust_entry:copyin_error,\nlinuxulator*:futex:release_futexes:copyin_error\n{\n  printf(\"ERROR: %s in %s:%s:%s\\n\", probename, probeprov, probemod,\n      probefunc);\n  stack();\n  ustack();\n}\n\nlinuxulator*:futex:linux_sys_futex:invalid_cmp_requeue_use,\nlinuxulator*:futex:linux_sys_futex:deprecated_requeue,\nlinuxulator*:futex:linux_set_robust_list:size_error\n{\n  printf(\"WARNING: %s:%s:%s:%s in application %s, maybe an application error?\\n\",\n      probename, probeprov, probemod, probefunc, execname);\n  stack();\n  ustack();\n}\n\n\n/* Per futex checks/statistics */\n\nlinuxulator*:futex:futex:create\n{\n  ++futex_count;\n  @max_futexes = max(futex_count);\n}\n\nlinuxulator*:futex:futex:destroy\n/futex_count == 0/\n{\n  printf(\"ERROR: Request to destroy a futex which was not created,\\n\");\n  printf(\"       or this script was started after some futexes where\\n\");\n  printf(\"       created. Stack trace:\\n\");\n  stack();\n  ustack();\n}\n\nlinuxulator*:futex:futex:destroy\n{\n  --futex_count;\n}\n\n\n/* Internal locks */\n\nlinuxulator*:locks:futex_mtx:locked\n{\n  ++check[probefunc, arg0];\n  @stats[probefunc] = count();\n\n  ts[probefunc] = timestamp;\n  spec[probefunc] = speculation();\n  printf(\"Stacktrace of last lock operation of the %s:\\n\", probefunc);\n  stack();\n}\n\nlinuxulator*:locks:futex_mtx:unlock\n/check[probefunc, arg0] == 0/\n{\n  printf(\"ERROR: unlock attempt of unlocked %s (%p),\", probefunc, arg0);\n  printf(\"       missing SDT probe in kernel, or dtrace program started\");\n  printf(\"       while the %s was already held (race condition).\", probefunc);\n  printf(\"       Stack trace follows:\");\n  stack();\n}\n\nlinuxulator*:locks:futex_mtx:unlock\n{\n  discard(spec[probefunc]);\n  spec[probefunc] = 0;\n  --check[probefunc, arg0];\n}\n\n/* Timeout handling for internal locks */\n\ntick-10s\n/spec[\"futex_mtx\"] != 0 && timestamp - ts[\"futex_mtx\"] >= 9999999000/\n{\n  commit(spec[\"futex_mtx\"]);\n  spec[\"futex_mtx\"] = 0;\n}\n\n\n/* Timing statistings */\n\nlinuxulator*:futex::entry\n{\n  self->time[probefunc] = timestamp;\n  @calls[probeprov, execname, probefunc] = count();\n}\n\nlinuxulator*:futex::return\n/self->time[probefunc] != 0/\n{\n  this->timediff = self->time[probefunc] - timestamp;\n\n        @timestats[probeprov, execname, probefunc] = quantize(this->timediff);\n        @longest[probeprov, probefunc] = max(this->timediff);\n\n        self->time[probefunc] = 0;\n}\n\n\n/* Statistics */\n\nEND\n{\n  printf(\"Number of locks per type:\");\n  printa(@stats);\n  printf(\"Number of maximum number of futexes in the futex list:\");\n  printa(@max_futexes);\n  printf(\"Number of futexes still existing: %d\", futex_count);\n  printf(\"Number of calls per provider/application/kernel function:\");\n  printa(@calls);\n  printf(\"Wallclock-timing statistics per provider/application/kernel function (in ns):\");\n  printa(@timestats);\n  printf(\"Longest running (wallclock!) functions per provider (in ns):\");\n  printa(@longest);\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Dart/point.dart",
    "content": "import 'dart:math' as math;\n\nclass Point {\n  num x, y;\n\n  Point(this.x, this.y);\n\n  num distanceTo(Point other) {\n    var dx = x - other.x;\n    var dy = y - other.y;\n    return math.sqrt(dx * dx + dy * dy);\n  }\n}\n\nvoid main() {\n  var p = new Point(2, 3);\n  var q = new Point(3, 4);\n  print('distance from p to q = ${p.distanceTo(q)}');\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/DataWeave/customInterpolator.dwl",
    "content": "fun SQL(literals, parts) = ''\n---\n[\n  SQL `SELECT * FROM table WHERE id = $(1) AND name = $('a')`,\n  SQL `$('p')`,\n  SQL `$('a')$('b')`,\n  SQL `$('a')---$('b')`,\n  SQL `---$('a')---$('b')---`,\n  SQL `$('p')bbb`,\n  SQL `aaa$('p')`,\n  SQL `aaa$('p')bbb`\n]"
  },
  {
    "path": "src/test/resources/samples/langs/DataWeave/directives.dwl",
    "content": "%dw 2.0\nvar number = 1234\nfun foo(func,name=\"Mariano\") = func(name)\ninput payload application/test arg=\"value\"\noutput application/json\n---\n{\n  foo: \"bar\"\n}"
  },
  {
    "path": "src/test/resources/samples/langs/DataWeave/functions.dwl",
    "content": "%dw 2.0\nvar x=(param1, param2) -> { \"$param1\": param2 }\nvar y=(param1, param2 = \"c\") -> { \"$param1\": param2 }\nvar toUser = (user) -> { name: user.name,\tlastName: user.lastName }\nfun z(param1, param2) = { \"$param1\": param2 }\nvar a = { name: \"Mariano\" , toUser: ((param1, param2) -> { \"$param1\": param2 }) }\nvar applyFirst =  (array, func) -> (func(array[0]) ++  array[1 to -1])\n\nvar nested =  (array, func) -> (a) -> (b) -> (c) -> array map func(a ++ b ++ c)\n\n\nfun f2(a1, a2) = \"\"\nfun f3(a1:String, a2:Number):String = a1\nfun f4(a1:String, a2:(a:Number) -> Number):String = a1\n---\nresult: {\n  a: x(\"a\", \"b\"),\n  b: y(\"a\"),\n  c: y(\"a\", \"b\"),\n  users: { (in1 map ((user) -> { user: (toUser(user) ++ user) })) },\n  d: z(\"a\", \"b\"),\n  e: a.toUser(\"name\",\"Mariano\"),\n  f: a.toUser(\"name\",\"Mariano\").name,\n  f: applyFirst(\"mariano\", (s) -> upper(s) ),\n  g: [] map (s) -> upper(s),\n  h: 1 f2 2\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/DataWeave/literals.dwl",
    "content": "%dw 2.0\n---\n{\n  \"boolean\":{\n    \"true\" : true,\n    \"false\": false\n  },\n  \"Number\": {\n    \"int\": 123,\n    \"decimal\": 123.23\n  },\n  \"string\": {\n    \"singleQuote\" : 'A String',\n    \"doubleQuote\" : \"A String\"\n  },\n  \"regex\": /foo/,\n  \"date\": {\n    a: |2003-10-01|,\n    b: |2005-045|,\n    c: |2003-W14-3|,\n    d: |23:57:59|,\n    e: |23:57:30.700|,\n    f: |23:50:30Z|,\n    g: |+13:00|,\n    h: |Z|,\n    i: |-02:00|,\n    j: |2005-06-02T15:10:16|,\n    k: |2005-06-02T15:10:16Z|,\n    l: |2005-06-02T15:10:16+03:00|,\n    m: |P12Y7M11D|,\n    n: |P12Y5M|,\n    o: |P45DT9H20M8S|,\n    p: |PT9H20M8S|\n  }\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/DataWeave/match.dwl",
    "content": "{\n  // Regex Pattern Matching (Can be named or unnamed)\n  a: in0.phones map $ match {\n    case matches /\\+(\\d+)\\s\\((\\d+)\\)\\s(\\d+\\-\\d+)/ -> { country: $[0], area: $[1], number: $[2] }\n    case matches /\\((\\d+)\\)\\s(\\d+\\-\\d+)/ -> { area: $[1], number: $[2] }\n    case phone matches /\\((\\d+)\\)\\s(\\d+\\-\\d+)/ -> { area: phone[1], number: phone[2] }\n  },\n  // Type Pattern Matching (Can be named or unnamed)\n  b: in0.object match {\n    case is Object -> { object: $ }\n    case is Number -> { number: $ }\n    // This is how you name variables if needed\n    case y is Boolean -> { boolean: y }\n  },\n  // Literal Pattern Matching (Can be named or unnamed)\n  c: in0.value match {\n    case \"Emiliano\" -> { string: $ }\n    case 123 -> { number: $ }\n    // This is how you name variables if needed\n    case value: \"Mariano\" -> { name: value }\n  },\n  // Boolean Expression Pattern Matching (Always named)\n  d: in0.value match {\n    case x if x > 30 -> { biggerThan30: x }\n    case x if x == 9 -> { nine: x }\n  },\n  // Default matches\n  e: in0.value match {\n    case \"Emiliano\" -> \"string\"\n    case 3.14 -> number\n    else -> \"1234\"\n  }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Diff/dude-thing-okay--001.patch",
    "content": "diff --git a/lib/linguist.rb b/lib/linguist.rb\nindex d472341..8ad9ffb 100644\n--- a/lib/linguist.rb\n+++ b/lib/linguist.rb\n"
  },
  {
    "path": "src/test/resources/samples/langs/Dockerfile/filenames/Dockerfile",
    "content": "# This file describes the standard way to build Docker, using docker\ndocker-version 0.4.2\nfrom\tubuntu:12.04\nmaintainer\tSolomon Hykes <solomon@dotcloud.com>\n# Build dependencies\nrun\tapt-get install -y -q curl\nrun\tapt-get install -y -q git\n# Install Go\nrun\tcurl -s https://go.googlecode.com/files/go1.1.1.linux-amd64.tar.gz | tar -v -C /usr/local -xz\nenv\tPATH\t/usr/local/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin\nenv\tGOPATH\t/go\nenv\tCGO_ENABLED 0\nrun\tcd /tmp && echo 'package main' > t.go && go test -a -i -v\n# Download dependencies\nrun\tPKG=github.com/kr/pty REV=27435c699;\t\t git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV\nrun\tPKG=github.com/gorilla/context/ REV=708054d61e5; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV\nrun\tPKG=github.com/gorilla/mux/ REV=9b36453141c;\t git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV\n# Run dependencies\nrun\tapt-get install -y iptables\n# lxc requires updating ubuntu sources\nrun\techo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list\nrun\tapt-get update\nrun\tapt-get install -y lxc\nrun\tapt-get install -y aufs-tools\n# Upload docker source\nadd\t.       /go/src/github.com/dotcloud/docker\n# Build the binary\nrun\tcd /go/src/github.com/dotcloud/docker/docker && go install -ldflags \"-X main.GITCOMMIT '??' -d -w\"\nenv\tPATH\t/usr/local/go/bin:/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin\ncmd\t[\"docker\"]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Dogescript/example.djs",
    "content": "quiet\n wow \n    such language\n  very syntax\n        github recognized wow\nloud\n\nsuch language much friendly\n    rly friendly is true\n        plz console.loge with 'such friend, very inclusive'\n    but\n        plz console.loge with 'no love for doge'\n    wow\nwow\n\nmodule.exports is language"
  },
  {
    "path": "src/test/resources/samples/langs/E/Extends.E",
    "content": "# from\n# http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/Objects_and_Functions\ndef makeVehicle(self) {\n    def vehicle {\n        to milesTillEmpty() {\n            return self.milesPerGallon() * self.getFuelRemaining()\n        }\n    }\n    return vehicle\n}\n\ndef makeCar() {\n    var fuelRemaining := 20\n    def car extends makeVehicle(car) {\n        to milesPerGallon() {return 19}\n        to getFuelRemaining() {return fuelRemaining}\n    }\n    return car\n}\n\ndef makeJet() {\n    var fuelRemaining := 2000\n    def jet extends makeVehicle(jet) {\n        to milesPerGallon() {return 2}\n        to getFuelRemaining() {return fuelRemaining}\n    }\n    return jet\n}\n\ndef car := makeCar()\nprintln(`The car can go ${car.milesTillEmpty()} miles.`)\n"
  },
  {
    "path": "src/test/resources/samples/langs/E/Functions.E",
    "content": "# from\n# http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/Objects_and_Functions\ndef makeCar(var name) {\n    var x := 0\n    var y := 0\n    def car {\n        to moveTo(newX,newY) {\n            x := newX\n            y := newY\n        }\n        to getX() {return x}\n        to getY() {return y}\n        to setName(newName) {name := newName}\n        to getName() {return name}\n    } \n    return car\n}\n# Now use the makeCar function to make a car, which we will move and print\ndef sportsCar := makeCar(\"Ferrari\")\nsportsCar.moveTo(10,20)\nprintln(`The car ${sportsCar.getName()} is at X location ${sportsCar.getX()}`)\n"
  },
  {
    "path": "src/test/resources/samples/langs/E/Guards.E",
    "content": "# from\n# http://wiki.erights.org/wiki/Walnut/Advanced_Topics/Build_your_Own_Guards\ndef makeVOCPair(brandName :String) :near {\n\n    var myTempContents := def none {}\n\n    def brand {\n        to __printOn(out :TextWriter) :void {\n            out.print(brandName)\n        }\n    }\n\n    def ProveAuth {\n        to __printOn(out :TextWriter) :void {\n            out.print(`<$brandName prover>`)\n        }\n        to getBrand() :near { return brand }\n        to coerce(specimen, optEjector) :near {\n            def sealedBox {\n                to getBrand() :near { return brand }\n                to offerContent() :void {\n                    myTempContents := specimen\n                }\n            }\n            return sealedBox\n        }\n    }\n    def CheckAuth {\n        to __printOn(out :TextWriter) :void {\n            out.print(`<$brandName checker template>`)\n        }\n        to getBrand() :near { return brand }\n        match [`get`, authList :any[]] {\n            def checker {\n                to __printOn(out :TextWriter) :void {\n                    out.print(`<$brandName checker>`)\n                }\n                to getBrand() :near { return brand }\n                to coerce(specimenBox, optEjector) :any {\n                    myTempContents := null\n                    if (specimenBox.__respondsTo(\"offerContent\", 0)) {\n                      # XXX Using __respondsTo/2 here is a kludge\n                        specimenBox.offerContent()\n                    } else {\n                        myTempContents := specimenBox\n                    }\n                    for auth in authList {\n                        if (auth == myTempContents) {\n                            return auth\n                        }\n                    }\n                    myTempContents := none\n                    throw.eject(optEjector,\n                                `Unmatched $brandName authorization`)\n                }\n            }\n        }\n        match [`__respondsTo`, [`get`, _]] {\n            true\n        }\n        match [`__respondsTo`, [_, _]] {\n            false\n        }\n        match [`__getAllegedType`, []] {\n            null.__getAllegedType()\n        }\n    }\n    return [ProveAuth, CheckAuth]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/E/IO.E",
    "content": "# E sample from\n# http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/InputOutput\n#File objects for hardwired files:\ndef file1 := <file:myFile.txt>\ndef file2 := <file:/home/marcs/myFile.txt>\n\n#Using a variable for a file name:\ndef filePath := \"c:\\\\docs\\\\myFile.txt\"\ndef file3 := <file>[filePath]\n\n#Using a single character to specify a Windows drive\ndef file4 := <file:c:/docs/myFile.txt>\ndef file5 := <c:/docs/myFile.txt>\ndef file6 := <c:\\docs\\myFile.txt>\n"
  },
  {
    "path": "src/test/resources/samples/langs/E/Promises.E",
    "content": "# E snippet from\n# http://wiki.erights.org/wiki/Walnut/Distributed_Computing/Promises\nwhen (tempVow) -> {\n    #...use tempVow\n} catch prob {\n    #.... report problem\n} finally {\n    #....log event\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/E/atomic-updates.E",
    "content": "#!/usr/bin/env rune\npragma.syntax(\"0.9\")\n\ndef pi := (-1.0).acos()\ndef makeEPainter := <unsafe:com.zooko.tray.makeEPainter>\ndef colors := <awt:makeColor>\n\n# --------------------------------------------------------------\n# --- Definitions\n\n/** Execute 'task' repeatedly as long 'indicator' is unresolved. */\ndef doWhileUnresolved(indicator, task) {\n  def loop() {\n    if (!Ref.isResolved(indicator)) {\n      task()\n      loop <- ()\n    }\n  }\n  loop <- ()\n}\n\n/** The data structure specified for the task. */\ndef makeBuckets(size) {\n    def values := ([100] * size).diverge() # storage\n    def buckets {\n        to size() :int { return size }\n        /** get current quantity in bucket 'i' */\n        to get(i :int) { return values[i] }\n        /** transfer 'amount' units, as much as possible, from bucket 'i' to bucket 'j'\n            or vice versa if 'amount' is negative */\n        to transfer(i :int, j :int, amount :int) {\n            def amountLim := amount.min(values[i]).max(-(values[j]))\n            values[i] -= amountLim\n            values[j] += amountLim\n        }\n    }\n    return buckets\n}\n\n/** A view of the current state of the buckets. */\ndef makeDisplayComponent(buckets) {\n  def c := makeEPainter(def paintCallback {\n    to paintComponent(g) {\n      def pixelsW := c.getWidth()\n      def pixelsH := c.getHeight()\n      def bucketsW := buckets.size()\n\n      g.setColor(colors.getWhite())\n      g.fillRect(0, 0, pixelsW, pixelsH)\n\n      g.setColor(colors.getDarkGray())\n      var sum := 0\n      for i in 0..!bucketsW {\n        sum += def value := buckets[i]\n        def x0 := (i       * pixelsW / bucketsW).floor()\n        def x1 := ((i + 1) * pixelsW / bucketsW).floor()\n        g.fillRect(x0 + 1, pixelsH - value,\n                   x1 - x0 - 1, value)\n      }\n\n      g.setColor(colors.getBlack())\n      g.\"drawString(String, int, int)\"(`Total: $sum`, 2, 20)\n    }\n  })\n  c.setPreferredSize(<awt:makeDimension>(500, 300))\n  return c\n}\n\n# --------------------------------------------------------------\n# --- Application setup\n\ndef buckets := makeBuckets(100)\ndef done # Promise indicating when the window is closed\n\n# Create the window\ndef frame := <unsafe:javax.swing.makeJFrame>(\"Atomic transfers\")\nframe.setContentPane(def display := makeDisplayComponent(buckets))\nframe.addWindowListener(def mainWindowListener {\n  to windowClosing(event) :void {\n    bind done := null\n  }\n  match _ {}\n})\nframe.setLocation(50, 50)\nframe.pack()\n\n# --------------------------------------------------------------\n# --- Tasks\n\n# Neatens up buckets\nvar ni := 0\ndoWhileUnresolved(done, fn {\n  def i := ni\n  def j := (ni + 1) %% buckets.size()\n  buckets.transfer(i, j, (buckets[i] - buckets[j]) // 4)\n  ni := j\n})\n\n# Messes up buckets\nvar mi := 0\ndoWhileUnresolved(done, fn {\n    def i := (mi + entropy.nextInt(3)) %% buckets.size()\n    def j := (i + entropy.nextInt(3)) %% buckets.size() #entropy.nextInt(buckets.size())\n    buckets.transfer(i, j, (buckets[i] / pi).floor())\n    mi := j\n})\n\n# Updates display at fixed 10 Hz\n# (Note: tries to catch up; on slow systems slow this down or it will starve the other tasks)\ndef clock := timer.every(100, def _(_) {\n  if (Ref.isResolved(done)) {\n    clock.stop()\n  } else {\n    display.repaint()\n  }\n})\nclock.start()\n\n# --------------------------------------------------------------\n# --- All ready, go visible and wait\n\nframe.show()\ninterp.waitAtTop(done)\n"
  },
  {
    "path": "src/test/resources/samples/langs/E/minChat.E",
    "content": "# from\n# http://wiki.erights.org/wiki/Walnut/Secure_Distributed_Computing/Auditing_minChat\npragma.syntax(\"0.9\")\nto send(message) {\n    when (friend<-receive(message)) -> {\n        chatUI.showMessage(\"self\", message)\n    } catch prob {chatUI.showMessage(\"system\", \"connection lost\")}\n}\nto receive(message) {chatUI.showMessage(\"friend\", message)}\nto receiveFriend(friendRcvr) {\n    bind friend := friendRcvr        \n    chatUI.showMessage(\"system\", \"friend has arrived\")\n}\nto save(file) {file.setText(makeURIFromObject(chatController))}\nto load(file) {\n    bind friend := getObjectFromURI(file.getText())\n    friend <- receiveFriend(chatController)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/EBNF/grammar.ebnf",
    "content": "(*\n  Source:  https://github.com/sunjay/lion\n  License: MIT\n*)\n\nStatement = ( NamedFunction | AnonymousFunction | Assignment | Expr ) , \"\\n\" ;\nExpr = AnonymousFunction | Term | \"(\" , Expr , \")\" ,\n    { AnonymousFunction | Term | \"(\" , Expr , \")\" } ;\n\nAssignment = Symbol , \"=\" , Expr ;\n\nAnonymousFunction = \"\\\" , FunctionRHS ;\nNamedFunction = Symbol , FunctionRHS ;\n\nFunctionRHS = FunctionParams , \"=\" , FunctionBody ;\nFunctionParams = FunctionParam , { FunctionParam } ;\nFunctionParam = Term ;\nFunctionBody = Expr ;\n\nTerm = Symbol | Number | SingleWordString ;\nSingleWordString = '\"' , Symbol , '\"' ;\n(* Symbol is a collection of valid symbol characters, not defined here *)\n(* Number is a valid numeric literal *)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/EBNF/material.ebnf",
    "content": "(*\n  Source:  https://github.com/io7m/jsom0\n  License: ISC\n*)\n\nname =\n  \"name\" , string , \";\" ;\n\ndiffuse =\n  \"diffuse\" , real , real , real , \";\" ;\n\nambient =\n  \"ambient\" , real , real , real , \";\" ;\n\nspecular =\n  \"specular\" , real , real , real , real , \";\" ;\n\nshininess =\n  \"shininess\" , real , \";\" ;\n\nalpha =\n  \"alpha\" , real , \";\" ;\n\nmapping =\n  \"map_chrome\" | \"map_uv\" ;\n\ntexture =\n  \"texture\" , string , real , mapping , \";\" ;\n\nmaterial =\n  \"material\" , \";\" ,\n    name ,\n    diffuse ,\n    ambient ,\n    specular ,\n    shininess ,\n    alpha ,\n    [ texture ] ,\n  \"end\" , \";\" ;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/EBNF/object.ebnf",
    "content": "(*\n  Source:  https://github.com/io7m/jsom0\n  License: ISC\n*)\n\nvertex_p3n3_name =\n  \"vertex_p3n3\" ;\n\nvertex_p3n3t2_name =\n  \"vertex_p3n3t2\" ;\n\nvertex_type =\n  vertex_p3n3_name | vertex_p3n3t2_name ;\n\nvertex_position =\n  \"position\" , real , real , real , \";\" ;\n\nvertex_normal =\n  \"normal\" , real , real , real , \";\" ;\n\nvertex_uv =\n  \"uv\" , real , real , \";\" ;\n\nvertex_p3n3 =\n  vertex_p3n3_name , vertex_position , vertex_normal , \"end\" , \";\" ;\n\nvertex_p3n3t2 =\n  vertex_p3n3t2_name , vertex_position , vertex_normal , vertex_uv , \"end\" , \";\" ;\n\nvertex =\n  vertex_p3n3 | vertex_p3n3t2 ;\n\nvertex_array =\n  \"array\" , positive , vertex_type , { vertex } , \"end\" , \";\" ;\n\nvertices =\n  \"vertices\" , \";\" , vertex_array , \"end\" , \";\" ;\n\ntriangle =\n  \"triangle\" , natural , natural , natural , \";\" ;\n\ntriangle_array =\n  \"array\" , positive, \"triangle\" , { triangle } , \"end\" , \";\" ;\n\ntriangles =\n  \"triangles\" , \";\" , triangle_array , \"end\" , \";\" ;\n\nname =\n  \"name\" , string , \";\" ;\n\nmaterial_name =\n  \"material_name\" , string , \";\" ;\n\nobject =\n  \"object\" , \";\" ,\n    name ,\n    material_name ,\n    vertices ,\n    triangles ,\n  \"end\" , \";\" ;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/EBNF/types.ebnf",
    "content": "(*\n  Source:  https://github.com/io7m/jsom0\n  License: ISC\n*)\n\ndigit_without_zero =\n  \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\" ;\n\ndigit =\n  \"0\" | digit_without_zero ;\n\npositive =\n  digit_without_zero , { digit } ;\n\nnatural =\n  \"0\" | positive ;\n\nreal =\n  [ \"-\" ] , digit , [ \".\" , { digit } ] ;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/ECL/sample.ecl",
    "content": "/* \n * Multi-line comment\n */\n#option ('slidingJoins', true);\n\nnamesRecord :=\n            RECORD\nstring20        surname;\nstring10        forename;\ninteger2        age;\ninteger2        dadAge;\ninteger2        mumAge;\n            END;\n\nnamesRecord2 :=\n            record\nstring10        extra;\nnamesRecord;\n            end;\n\nnamesTable := dataset('x',namesRecord,FLAT);\nnamesTable2 := dataset('y',namesRecord2,FLAT);\n\ninteger2 aveAgeL(namesRecord l) := (l.dadAge+l.mumAge)/2;\ninteger2 aveAgeR(namesRecord2 r) := (r.dadAge+r.mumAge)/2;\n\n// Standard join on a function of left and right\noutput(join(namesTable, namesTable2, aveAgeL(left) = aveAgeR(right)));\n\n//Several simple examples of sliding join syntax\noutput(join(namesTable, namesTable2, left.age >= right.age - 10 and left.age <= right.age +10));\noutput(join(namesTable, namesTable2, left.age between right.age - 10 and right.age +10));\noutput(join(namesTable, namesTable2, left.age between right.age + 10 and right.age +30));\noutput(join(namesTable, namesTable2, left.age between (right.age + 20) - 10 and (right.age +20) + 10));\noutput(join(namesTable, namesTable2, aveAgeL(left) between aveAgeR(right)+10 and aveAgeR(right)+40));\n\n//Same, but on strings.  Also includes age to ensure sort is done by non-sliding before sliding.\noutput(join(namesTable, namesTable2, left.surname between right.surname[1..10]+'AAAAAAAAAA' and right.surname[1..10]+'ZZZZZZZZZZ' and left.age=right.age));\noutput(join(namesTable, namesTable2, left.surname between right.surname[1..10]+'AAAAAAAAAA' and right.surname[1..10]+'ZZZZZZZZZZ' and left.age=right.age,all));\n\n//This should not generate a self join\noutput(join(namesTable, namesTable, left.age between right.age - 10 and right.age +10));\n"
  },
  {
    "path": "src/test/resources/samples/langs/ECLiPSe/or-constraint.ecl",
    "content": ":- lib(ic).\r\n\r\n/**\r\n * Question 1.11\r\n * vabs(?Val, ?AbsVal)\r\n */\r\nvabs(Val, AbsVal):-\r\n\tAbsVal #> 0,\r\n\t(\r\n\t\tVal #= AbsVal\r\n\t;\r\n\t\tVal #= -AbsVal\r\n\t),\r\n\tlabeling([Val, AbsVal]).\r\n\r\n/**\r\n * vabsIC(?Val, ?AbsVal)\r\n */\r\nvabsIC(Val, AbsVal):-\r\n\tAbsVal #> 0,\r\n\tVal #= AbsVal or Val #= -AbsVal,\r\n\tlabeling([Val, AbsVal]).\r\n\r\n/**\r\n * Question 1.12\r\n */\r\n% X #:: -10..10, vabs(X, Y).\r\n% X #:: -10..10, vabsIC(X, Y).\r\n\r\n/**\r\n * Question 1.13\r\n * faitListe(?ListVar, ?Taille, +Min, +Max)\r\n */\r\nfaitListe([], 0, _, _):-!.\r\nfaitListe([First|Rest], Taille, Min, Max):-\r\n\tFirst #:: Min..Max,\r\n\tTaille1 #= Taille - 1,\r\n\tfaitListe(Rest, Taille1, Min, Max).\r\n\r\n/**\r\n * Question 1.14\r\n * suite(?ListVar)\r\n */\r\nsuite([Xi, Xi1, Xi2]):-\r\n\tcheckRelation(Xi, Xi1, Xi2).\r\nsuite([Xi, Xi1, Xi2|Rest]):-\r\n\tcheckRelation(Xi, Xi1, Xi2),\r\n\tsuite([Xi1, Xi2|Rest]).\r\n\r\n/**\r\n * checkRelation(?Xi, ?Xi1, ?Xi2)\r\n */\r\ncheckRelation(Xi, Xi1, Xi2):-\r\n\tvabs(Xi1, VabsXi1),\r\n\tXi2 #= VabsXi1 - Xi.\r\n\r\n/**\r\n * Question 1.15\r\n * checkPeriode(+ListVar).\r\n */\r\n% TODO Any better solution?\r\ncheckPeriode(ListVar):-\r\n\tlength(ListVar, Length),\r\n\tLength < 10.\r\ncheckPeriode([X1, X2, X3, X4, X5, X6, X7, X8, X9, X10|Rest]):-\r\n\tX1 =:= X10,\r\n\tcheckPeriode([X2, X3, X4, X5, X6, X7, X8, X9, X10|Rest]).\r\n% faitListe(ListVar, 18, -9, 9), suite(ListVar), checkPeriode(ListVar). => 99 solutions\r\n\r\n\r\n/**\r\n * Tests\r\n */\r\n/*\r\nvabs(5, 5). => Yes\r\nvabs(5, -5). => No\r\nvabs(-5, 5). => Yes\r\nvabs(X, 5).\r\nvabs(X, AbsX). \r\nvabsIC(5, 5). => Yes\r\nvabsIC(5, -5). => No\r\nvabsIC(-5, 5). => Yes\r\nvabsIC(X, 5).\r\nvabsIC(X, AbsX).\r\n\r\nfaitListe(ListVar, 5, 1, 3). => 243 solutions\r\nfaitListe([_, _, _, _, _], Taille, 1, 3). => Taille = 5 !!!!!!!!!!!!!!!!\r\n\r\nfaitListe(ListVar, 18, -9, 9), suite(ListVar). => 99 solutions\r\n*/"
  },
  {
    "path": "src/test/resources/samples/langs/EJS/dash.ejs",
    "content": "<% include parts/depend %>\n\n<div class=\"row\">\n  <% if (user.primaryAccount == \"teacher\") { %>\n    <% include teacher/sidebar %>\n    <% include teacher/dashboard %>\n  <% } else if (user.primaryAccount == \"student\") { %>\n    <% include student/sidebar %>\n    <% include student/dashboard %>\n  <% } else { %>\n    <center><h2>There seems to be a problem</h2></center>\n  <% } %>\n</div>\n"
  },
  {
    "path": "src/test/resources/samples/langs/EJS/page.ejs",
    "content": "<% include ../parts/depend %>\n\n<div class=\"row\">\n  <% include sidebar %>\n  <div class=\"col-lg-offset-3 col-lg-9 main-content\">\n    <div class=\"page-title\">\n      <h1>Pieces</h1>\n      <% if (pieces.length == 1) { %>\n        <p>You have\n          <strong>1</strong>\n          piece to practice</p>\n      <% } else { %>\n        <p>You have\n          <strong><%= pieces.length %></strong>\n          pieces to practice</p>\n      <% } %>\n    </div>\n    <div class=\"row\">\n      <% if (pieces == undefined || pieces.length == 0) { %>\n        <div class=\"error-main\">\n          <h1>No Pieces</h1>\n          <p>You have no\n            <strong>Pieces</strong>\n            assigned.</p>\n        </div>\n      <% } else { %>\n        <div class=\"col-lg-12 section-title\">\n          <div style=\"margin-top: 10px; margin-bottom: 10px;\" class=\"btn-group\" role=\"group\">\n            <button id=\"inProgressButton\" type=\"button\" class=\"btn btn-md btn-super-round btn-focus-off btn-primary btn-primary-active\">In Progress</button>\n            <button id=\"completedButton\" type=\"button\" class=\"btn btn-md btn-super-round btn-focus-off btn-purple\">Completed</button>\n          </div>\n        </div>\n\n        <div id=\"inProgressPieces\">\n          <% if (inProgressPieces == undefined || inProgressPieces.length == 0) { %>\n            <center>\n              <h2>No Pieces in Progress</h2>\n            </center>\n          <% } else { %>\n            <% for (var i = 0; i < inProgressPieces.length; i++) { %>\n              <div class=\"col-lg-6\">\n                <div class=\"box\">\n                  <div class=\"title\">\n                    <h1>\n                      <a href=\"/pieces/practice/<%= inProgressPieces[i].id %>\"><%= inProgressPieces[i].title %></a>\n                    </h1>\n                    <p>By\n                      <strong><%= inProgressPieces[i].author %></strong>\n                    </p>\n                    <p>\n                      Teacher:\n                      <strong><%= inProgressPieces[i].teacherName %></strong>\n                    </p>\n                    <p>Average Practice Time:\n                      <strong><%= inProgressPieces[i].averagePracticeTime %>\n                        mins</strong>\n                    </p>\n                    <a href=\"/pieces/practice/<%= inProgressPieces[i].id %>\" class=\"btn btn-success btn-block\">Practice\n                      <%= inProgressPieces[i].title %></a>\n                  </div>\n                </div>\n              </div>\n            <% } %>\n          <% } %>\n        </div>\n\n        <div id=\"completedPieces\" style=\"display: none;\">\n          <% if (completedPieces == undefined || completedPieces.length == 0) { %>\n            <center>\n              <h2>No Completed Pieces</h2>\n            </center>\n          <% } else { %>\n            <% for (var i = 0; i < completedPieces.length; i++) { %>\n              <div class=\"col-lg-6\">\n                <div class=\"box\">\n                  <div class=\"title\">\n                    <h1>\n                      <a href=\"/pieces/practice/<%= completedPieces[i].id %>\"><%= completedPieces[i].title %></a>\n                    </h1>\n                    <p>By\n                      <strong><%= completedPieces[i].author %></strong>\n                    </p>\n                    <p>\n                      Teacher:\n                      <strong><%= completedPieces[i].teacherName %></strong>\n                    </p>\n                    <p>Average Practice Time:\n                      <strong><%= completedPieces[i].averagePracticeTime %>\n                        mins</strong>\n                    </p>\n                    <a href=\"/pieces/practice/<%= completedPieces[i].id %>\" class=\"btn btn-success btn-block\">Practice\n                      <%= completedPieces[i].title %></a>\n                  </div>\n                </div>\n              </div>\n            <% } %>\n          <% } %>\n        </div>\n      <% } %>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "src/test/resources/samples/langs/EQ/HTTPServerVirtualHostListener.eq",
    "content": "\n/*\n * This file is part of Jkop\n * Copyright (c) 2016 Job and Esther Technologies, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nIFNDEF(\"target_posix\")\n{\n\tpublic class HTTPServerVirtualHostListener : EventLoopReadListener\n\t{\n\t\tpublic static HTTPServerVirtualHostListener create(String name, HTTPServer server, String prefix = null) {\n\t\t\tLogger logger;\n\t\t\tif(server != null) {\n\t\t\t\tlogger = server.get_logger();\n\t\t\t}\n\t\t\tLog.error(\"Virtual hosts are not supported on this platform.\", logger);\n\t\t\treturn(null);\n\t\t}\n\n\t\tpublic void on_read_ready() {\n\t\t}\n\n\t\tpublic void close() {\n\t\t}\n\t}\n}\n\nELSE {\n\npublic class HTTPServerVirtualHostListener : LoggerObject, EventLoopReadListener\n{\n\tclass Client : LoggerObject, EventLoopReadListener\n\t{\n\t\tHTTPServer server;\n\t\tLocalSocket socket;\n\t\tEventLoopEntry ee;\n\n\t\tembed \"c\" {{{\n\t\t\t#include <unistd.h>\n\t\t\t#include <sys/types.h>\n\t\t\t#include <sys/socket.h>\n\t\t}}}\n\n\t\tpublic static Client create(HTTPServer server, LocalSocket socket) {\n\t\t\tif(server == null || socket == null) {\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t\tvar eventloop = server.get_eventloop();\n\t\t\tif(eventloop == null) {\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t\tvar v = new Client();\n\t\t\tv.set_logger(server.get_logger());\n\t\t\tv.server = server;\n\t\t\tv.socket = socket;\n\t\t\tv.ee = eventloop.entry_for_object(socket);\n\t\t\tif(v.ee == null) {\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t\tv.ee.set_read_listener(v);\n\t\t\treturn(v);\n\t\t}\n\n\t\tpublic void close() {\n\t\t\tif(ee != null) {\n\t\t\t\tee.remove();\n\t\t\t\tee = null;\n\t\t\t}\n\t\t\tif(socket != null) {\n\t\t\t\tsocket.close();\n\t\t\t\tsocket = null;\n\t\t\t}\n\t\t\tserver = null;\n\t\t}\n\n\t\tpublic void on_read_ready() {\n\t\t\treceive_fd();\n\t\t\tclose();\n\t\t}\n\n\t\tprivate void receive_fd() {\n\t\t\tif(socket is FileDescriptor == false) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tint lsfd = ((FileDescriptor)socket).get_fd();\n\t\t\tint r;\n\t\t\tint newfd = -1;\n\t\t\tembed \"c\" {{{\n\t\t\t\tchar buf[64];\n\t\t\t\tstruct msghdr msg;\n\t\t\t\tstruct iovec iov[1];\n\t\t\t\tssize_t n;\n\t\t\t\tunion {\n\t\t\t\t\tstruct cmsghdr cm;\n\t\t\t\t\tchar control[CMSG_SPACE(sizeof(int))];\n\t\t\t\t} control_un;\n\t\t\t\tstruct cmsghdr* cmptr;\n\t\t\t\tmsg.msg_control = control_un.control;\n\t\t\t\tmsg.msg_controllen = sizeof(control_un.control);\n\t\t\t\tmsg.msg_name = NULL;\n\t\t\t\tmsg.msg_namelen = 0;\n\t\t\t\tiov[0].iov_base = buf;\n\t\t\t\tiov[0].iov_len = 64;\n\t\t\t\tmsg.msg_iov = iov;\n\t\t\t\tmsg.msg_iovlen = 1;\n\t\t\t\tr = recvmsg(lsfd, &msg, 0);\n\t\t\t}}}\n\t\t\tif(r < 0) {\n\t\t\t\tlog_error(\"FAILED to recvmsg() from the local socket in virtual host receiver.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tembed \"c\" {{{\n\t\t\t\tif((cmptr = CMSG_FIRSTHDR(&msg)) != NULL && cmptr->cmsg_len == CMSG_LEN(sizeof(int))) {\n\t\t\t\t\tif(cmptr->cmsg_level == SOL_SOCKET && cmptr->cmsg_type == SCM_RIGHTS) {\n\t\t\t\t\t\tnewfd = *((int*)CMSG_DATA(cmptr));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}}}\n\t\t\tif(newfd < 0) {\n\t\t\t\tlog_warning(\"No file descriptor was passed through the socket in virtual host receiver.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar newsock = TCPSocket.create();\n\t\t\tif(newsock == null) {\n\t\t\t\tembed \"c\" {{{ close(newfd); }}}\n\t\t\t\tlog_error(\"FAILED to create a new socket\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fds = newsock as FileDescriptorSocket;\n\t\t\tif(fds == null) {\n\t\t\t\tembed \"c\" {{{ close(newfd); }}}\n\t\t\t\tlog_error(\"TCPSocket is not a FileDescriptorSocket. Cannot set file descriptor.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfds.set_fd(newfd);\n\t\t\tserver.on_new_client_socket(newsock);\n\t\t}\n\t}\n\n\tHTTPServer server;\n\tLocalSocket socket;\n\tEventLoopEntry ee;\n\tString socketprefix;\n\n\tpublic static HTTPServerVirtualHostListener create(String name, HTTPServer server, String prefix = null) {\n\t\tif(server == null) {\n\t\t\treturn(null);\n\t\t}\n\t\tvar v = new HTTPServerVirtualHostListener();\n\t\tv.server = server;\n\t\tv.socketprefix = prefix;\n\t\tv.set_logger(server.get_logger());\n\t\tif(v.start(name) == false) {\n\t\t\tv = null;\n\t\t}\n\t\treturn(v);\n\t}\n\n\tpublic bool start(String name) {\n\t\tif(String.is_empty(name) || server == null) {\n\t\t\treturn(false);\n\t\t}\n\t\tsocket = LocalSocket.create();\n\t\tif(socket == null) {\n\t\t\tlog_error(\"Cannot create local socket\");\n\t\t\treturn(false);\n\t\t}\n\t\tvar pp = socketprefix;\n\t\tif(String.is_empty(pp)) {\n\t\t\tpp = \"sympathy_vhost_\";\n\t\t}\n\t\tvar socketname = \"%s%s\".printf().add(pp).add(name).to_string();\n\t\tif(socket != null) {\n\t\t\tif(socket.listen(socketname) == false) {\n\t\t\t\tsocket = null;\n\t\t\t}\n\t\t}\n\t\tif(socket == null) {\n\t\t\tlog_error(\"FAILED to listen to local socket `%s'\".printf().add(socketname));\n\t\t\treturn(false);\n\t\t}\n\t\tvar event_loop = server.get_eventloop();\n\t\tif(event_loop == null) {\n\t\t\tlog_error(\"No eventloop\");\n\t\t\treturn(false);\n\t\t}\n\t\tee = event_loop.entry_for_object(socket);\n\t\tif(ee == null) {\n\t\t\tlog_error(\"Failed to register socket with eventloop\");\n\t\t\treturn(false);\n\t\t}\n\t\tee.set_read_listener(this);\n\t\tlog_debug(\"HTTPServerVirtualHostListener: Listening for virtual host `%s'\".printf().add(name));\n\t\treturn(true);\n\t}\n\n\tpublic void close() {\n\t\tif(ee != null) {\n\t\t\tee.remove();\n\t\t\tee = null;\n\t\t}\n\t\tif(socket != null) {\n\t\t\tsocket.close();\n\t\t\tsocket = null;\n\t\t}\n\t\tserver = null;\n\t}\n\n\tpublic void on_read_ready() {\n\t\tvar ns = socket.accept();\n\t\tif(ns != null) {\n\t\t\tClient.create(server, ns);\n\t\t}\n\t}\n}\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/EQ/SEButtonEntity.eq",
    "content": "\n/*\n * This file is part of Jkop\n * Copyright (c) 2016 Job and Esther Technologies, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\npublic class SEButtonEntity : SESpriteEntity, SEPointerListener\n{\n\tclass SEImageButtonEntity : SEButtonEntity\n\t{\n\t\tproperty SEImage image_normal;\n\t\tproperty SEImage image_hover;\n\t\tproperty SEImage image_pressed;\n\n\t\tpublic void update() {\n\t\t\tif(get_pressed()) {\n\t\t\t\tvar img = image_pressed;\n\t\t\t\tif(img == null) {\n\t\t\t\t\timg = image_hover;\n\t\t\t\t}\n\t\t\t\tif(img == null) {\n\t\t\t\t\timg = image_normal;\n\t\t\t\t}\n\t\t\t\tset_image(img);\n\t\t\t}\n\t\t\telse if(get_has_pointer()) {\n\t\t\t\tvar img = image_hover;\n\t\t\t\tif(img == null) {\n\t\t\t\t\timg = image_normal;\n\t\t\t\t}\n\t\t\t\tset_image(img);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tset_image(image_normal);\n\t\t\t}\n\t\t}\n\t}\n\n\tclass SETextButtonEntity : SEButtonEntity\n\t{\n\t\tproperty String button_text;\n\t\tproperty String normal_font;\n\t\tproperty String hover_font;\n\t\tproperty String pressed_font;\n\n\t\tpublic void update() {\n\t\t\tif(get_pressed()) {\n\t\t\t\tvar ff = pressed_font;\n\t\t\t\tif(String.is_empty(ff)) {\n\t\t\t\t\tff = hover_font;\n\t\t\t\t}\n\t\t\t\tif(String.is_empty(ff)) {\n\t\t\t\t\tff = normal_font;\n\t\t\t\t}\n\t\t\t\tset_text(button_text, ff);\n\t\t\t}\n\t\t\telse if(get_has_pointer()) {\n\t\t\t\tvar ff = hover_font;\n\t\t\t\tif(String.is_empty(ff)) {\n\t\t\t\t\tff = normal_font;\n\t\t\t\t}\n\t\t\t\tset_text(button_text, ff);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tset_text(button_text, normal_font);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static SEButtonEntity for_image(SEImage img) {\n\t\treturn(SEButtonEntity.for_images(img, null, null));\n\t}\n\n\tpublic static SEButtonEntity for_images(SEImage normal, SEImage hover, SEImage pressed) {\n\t\treturn(new SEImageButtonEntity().set_image_normal(normal).set_image_hover(hover)\n\t\t\t.set_image_pressed(pressed));\n\t}\n\n\tpublic static SEButtonEntity for_text(String text, String normal_font = null, String hover_font = null, String pressed_font = null) {\n\t\treturn(new SETextButtonEntity().set_button_text(text).set_normal_font(normal_font).set_hover_font(hover_font)\n\t\t\t.set_pressed_font(pressed_font));\n\t}\n\n\tproperty SEMessageListener listener;\n\tproperty Object data;\n\tbool pressed = false;\n\tbool has_pointer = false;\n\n\tpublic bool get_pressed() {\n\t\treturn(pressed);\n\t}\n\n\tpublic bool get_has_pointer() {\n\t\treturn(has_pointer);\n\t}\n\n\tpublic void initialize(SEResourceCache rsc) {\n\t\tbase.initialize(rsc);\n\t\tupdate();\n\t}\n\n\tpublic virtual void update() {\n\t}\n\n\tpublic virtual void on_pointer_enter(SEPointerInfo pi) {\n\t\tif(has_pointer) {\n\t\t\treturn;\n\t\t}\n\t\thas_pointer = true;\n\t\tupdate();\n\t}\n\n\tpublic virtual void on_pointer_leave(SEPointerInfo pi) {\n\t\tif(has_pointer == false && pressed == false) {\n\t\t\treturn;\n\t\t}\n\t\thas_pointer = false;\n\t\tpressed = false;\n\t\tupdate();\n\t}\n\n\tpublic void on_pointer_move(SEPointerInfo pi) {\n\t\tif(pi.is_inside(get_x(), get_y(), get_width(), get_height())) {\n\t\t\tif(has_pointer == false) {\n\t\t\t\ton_pointer_enter(pi);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(has_pointer) {\n\t\t\t\ton_pointer_leave(pi);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void on_pointer_press(SEPointerInfo pi) {\n\t\tif(pressed) {\n\t\t\treturn;\n\t\t}\n\t\tif(pi.is_inside(get_x(), get_y(), get_width(), get_height()) == false) {\n\t\t\treturn;\n\t\t}\n\t\tpressed = true;\n\t\tupdate();\n\t}\n\n\tpublic void on_pointer_release(SEPointerInfo pi) {\n\t\tif(pressed == false) {\n\t\t\treturn;\n\t\t}\n\t\tif(pi.is_inside(get_x(), get_y(), get_width(), get_height()) == false) {\n\t\t\treturn;\n\t\t}\n\t\ton_pointer_click(pi);\n\t\tpressed = false;\n\t\tupdate();\n\t}\n\n\tpublic virtual void on_pointer_click(SEPointerInfo pi) {\n\t\tif(listener != null) {\n\t\t\tlistener.on_message(data);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/EQ/String.eq",
    "content": "\n/*\n * This file is part of Jkop\n * Copyright (c) 2016 Job and Esther Technologies, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\npublic interface String : Stringable, Integer, Double, Boolean\n{\n\tpublic static String instance(String o) {\n\t\tif(o == null) {\n\t\t\treturn(\"\");\n\t\t}\n\t\treturn(o);\n\t}\n\n\tpublic static String as_string(Object o) {\n\t\tif(o == null) {\n\t\t\treturn(null);\n\t\t}\n\t\tif(o is String) {\n\t\t\treturn((String)o);\n\t\t}\n\t\tif(o is Stringable) {\n\t\t\treturn(((Stringable)o).to_string());\n\t\t}\n\t\treturn(null);\n\t}\n\n\tpublic static strptr as_strptr(Object o) {\n\t\tvar str = as_string(o);\n\t\tif(str == null) {\n\t\t\treturn(null);\n\t\t}\n\t\treturn(str.to_strptr());\n\t}\n\n\tpublic static bool is_in_collection(String str, Collection c) {\n\t\tif(str == null) {\n\t\t\treturn(false);\n\t\t}\n\t\tforeach(String s in c) {\n\t\t\tif(s.equals(str)) {\n\t\t\t\treturn(true);\n\t\t\t}\n\t\t}\n\t\treturn(false);\n\t}\n\n\tpublic static bool is_empty(Object o) {\n\t\tif(o == null) {\n\t\t\treturn(true);\n\t\t}\n\t\tvar str = o as String;\n\t\tif(str == null && o is Stringable) {\n\t\t\tstr = ((Stringable)o).to_string();\n\t\t}\n\t\tif(str == null) {\n\t\t\treturn(true);\n\t\t}\n\t\tif(str.get_char(0) < 1) {\n\t\t\treturn(true);\n\t\t}\n\t\treturn(false);\n\t}\n\n\tpublic static String for_object(Object o) {\n\t\tif(o is String) {\n\t\t\treturn((String)o);\n\t\t}\n\t\tif(o is Stringable) {\n\t\t\treturn(((Stringable)o).to_string());\n\t\t}\n\t\treturn(null);\n\t}\n\n\tpublic static String for_character(int c) {\n\t\tvar sb = StringBuffer.create();\n\t\tsb.append_c(c);\n\t\treturn(sb.to_string());\n\t}\n\n\tpublic static String for_integer(int av) {\n\t\tIFDEF(\"target_cs\") {\n\t\t\tstrptr v;\n\t\t\tembed {{{\n\t\t\t\tv = av.ToString();\n\t\t\t}}}\n\t\t\treturn(String.for_strptr(v));\n\t\t}\n\t\tELSE IFDEF(\"target_java\") {\n\t\t\tstrptr st;\n\t\t\tembed {{{\n\t\t\t\tst = java.lang.String.valueOf(av);\n\t\t\t}}}\n\t\t\treturn(String.for_strptr(st));\n\t\t}\n\t\tELSE {\n\t\t\treturn(\"%d\".printf().add(av).to_string());\n\t\t}\n\t}\n\n\tpublic static String for_long(long av) {\n\t\tIFDEF(\"target_cs\") {\n\t\t\tstrptr v;\n\t\t\tembed {{{\n\t\t\t\tv = av.ToString();\n\t\t\t}}}\n\t\t\treturn(String.for_strptr(v));\n\t\t}\n\t\tELSE IFDEF(\"target_java\") {\n\t\t\tstrptr st;\n\t\t\tembed {{{\n\t\t\t\tst = java.lang.String.valueOf(av);\n\t\t\t}}}\n\t\t\treturn(String.for_strptr(st));\n\t\t}\n\t\tELSE {\n\t\t\treturn(for_integer((int)av));\n\t\t}\n\t}\n\n\tpublic static String for_double(double v) {\n\t\tIFDEF(\"target_java\") {\n\t\t\tstrptr st;\n\t\t\tembed {{{\n\t\t\t\tst = java.lang.String.valueOf(v);\n\t\t\t}}}\n\t\t\treturn(String.for_strptr(st));\n\t\t}\n\t\tELSE {\n\t\t\treturn(\"%f\".printf().add(v).to_string());\n\t\t}\n\t}\n\n\tpublic static String for_boolean(bool val) {\n\t\tif(val) {\n\t\t\treturn(\"true\");\n\t\t}\n\t\treturn(\"false\");\n\t}\n\n\tpublic static String for_strptr(strptr literal) {\n\t\tvar v = new StringImpl();\n\t\tv.set_strptr(literal);\n\t\treturn(v);\n\t}\n\n\tpublic static String for_utf8_buffer(Buffer data, bool haszero = true) {\n\t\tvar v = new StringImpl();\n\t\tv.set_utf8_buffer(data, haszero);\n\t\treturn(v);\n\t}\n\n\tpublic static String combine(Collection strings, int delim = -1, bool unique = false) {\n\t\tvar sb = StringBuffer.create();\n\t\tHashTable flags;\n\t\tif(unique) {\n\t\t\tflags = HashTable.create();\n\t\t}\n\t\tforeach(Object o in strings) {\n\t\t\tvar s = String.as_string(o);\n\t\t\tif(s == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(flags != null) {\n\t\t\t\tif(flags.get(s) != null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tflags.set(s, \"true\");\n\t\t\t}\n\t\t\tif(delim > 0 && sb.count() > 0) {\n\t\t\t\tsb.append_c(delim);\n\t\t\t}\n\t\t\tsb.append(s);\n\t\t}\n\t\treturn(sb.to_string());\n\t}\n\n\tpublic static String capitalize(String str) {\n\t\tif(str == null) {\n\t\t\treturn(null);\n\t\t}\n\t\tvar c0 = str.get_char(0);\n\t\tif(c0 < 1) {\n\t\t\treturn(null);\n\t\t}\n\t\tif(c0 >= 'a' && c0 <= 'z') {\n\t\t\tvar sb = StringBuffer.create();\n\t\t\tsb.append_c(c0 - 'a' + 'A');\n\t\t\tsb.append(str.substring(1));\n\t\t\treturn(sb.to_string());\n\t\t}\n\t\treturn(str);\n\t}\n\n\tpublic StringFormatter printf();\n\tpublic String dup();\n\tpublic String append(String str);\n\tpublic int get_length();\n\tpublic int get_char(int n);\n\tpublic String truncate(int len);\n\tpublic String replace(int o, int r);\n\tpublic String replace_char(int o, int r);\n\tpublic String replace_string(String o, String r);\n\tpublic String remove(int start, int len);\n\tpublic String insert(String str, int pos);\n\tpublic String substring(int start, int alength = -1);\n\tpublic String reverse();\n\tpublic String lowercase();\n\tpublic String uppercase();\n\tpublic String strip();\n\tpublic Iterator split(int delim, int max = -1);\n\tpublic int str(String s);\n\tpublic bool contains(String s);\n\tpublic int rstr(String s);\n\tpublic int chr(int c);\n\tpublic int rchr(int c);\n\tpublic bool has_prefix(String prefix);\n\tpublic bool has_suffix(String suffix);\n\tpublic int compare(Object ao);\n\tpublic int compare_ignore_case(Object ao);\n\tpublic bool equals(Object ao);\n\tpublic bool equals_ptr(strptr str);\n\tpublic bool equals_ignore_case(Object ao);\n\tpublic bool equals_ignore_case_ptr(strptr str);\n\tpublic StringIterator iterate();\n\tpublic StringIterator iterate_reverse();\n\tpublic int to_integer_base(int ibase);\n\tpublic strptr to_strptr();\n\tpublic Buffer to_utf8_buffer(bool zero = true);\n\tpublic int hash();\n\tpublic EditableString as_editable();\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Eagle/Eagle.brd",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"6.3\">\n<drawing>\n<settings>\n<setting alwaysvectorfont=\"no\"/>\n<setting verticaltext=\"up\"/>\n</settings>\n<grid distance=\"10\" unitdist=\"mil\" unit=\"mil\" style=\"lines\" multiple=\"1\" display=\"no\" altdistance=\"0.025\" altunitdist=\"inch\" altunit=\"inch\"/>\n<layers>\n<layer number=\"1\" name=\"Top\" color=\"4\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"2\" name=\"Route2\" color=\"1\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"3\" name=\"Route3\" color=\"4\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"4\" name=\"Route4\" color=\"1\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"5\" name=\"Route5\" color=\"4\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"6\" name=\"Route6\" color=\"1\" fill=\"8\" visible=\"no\" active=\"no\"/>\n<layer number=\"7\" name=\"Route7\" color=\"4\" fill=\"8\" visible=\"no\" active=\"no\"/>\n<layer number=\"8\" name=\"Route8\" color=\"1\" fill=\"2\" visible=\"no\" active=\"no\"/>\n<layer number=\"9\" name=\"Route9\" color=\"4\" fill=\"2\" visible=\"no\" active=\"no\"/>\n<layer number=\"10\" name=\"Route10\" color=\"1\" fill=\"7\" visible=\"no\" active=\"no\"/>\n<layer number=\"11\" name=\"Route11\" color=\"4\" fill=\"7\" visible=\"no\" active=\"no\"/>\n<layer number=\"12\" name=\"Route12\" color=\"1\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"13\" name=\"Route13\" color=\"4\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"14\" name=\"Route14\" color=\"1\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"15\" name=\"Route15\" color=\"4\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"16\" name=\"Bottom\" color=\"1\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"17\" name=\"Pads\" color=\"2\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"18\" name=\"Vias\" color=\"2\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"19\" name=\"Unrouted\" color=\"6\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"20\" name=\"Dimension\" color=\"15\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"21\" name=\"tPlace\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"22\" name=\"bPlace\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"23\" name=\"tOrigins\" color=\"15\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"24\" name=\"bOrigins\" color=\"15\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"25\" name=\"tNames\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"26\" name=\"bNames\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"27\" name=\"tValues\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"28\" name=\"bValues\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"29\" name=\"tStop\" color=\"7\" fill=\"3\" visible=\"no\" active=\"yes\"/>\n<layer number=\"30\" name=\"bStop\" color=\"7\" fill=\"6\" visible=\"no\" active=\"yes\"/>\n<layer number=\"31\" name=\"tCream\" color=\"7\" fill=\"4\" visible=\"no\" active=\"yes\"/>\n<layer number=\"32\" name=\"bCream\" color=\"7\" fill=\"5\" visible=\"no\" active=\"yes\"/>\n<layer number=\"33\" name=\"tFinish\" color=\"6\" fill=\"3\" visible=\"no\" active=\"yes\"/>\n<layer number=\"34\" name=\"bFinish\" color=\"6\" fill=\"6\" visible=\"no\" active=\"yes\"/>\n<layer number=\"35\" name=\"tGlue\" color=\"7\" fill=\"4\" visible=\"no\" active=\"yes\"/>\n<layer number=\"36\" name=\"bGlue\" color=\"7\" fill=\"5\" visible=\"no\" active=\"yes\"/>\n<layer number=\"37\" name=\"tTest\" color=\"7\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"38\" name=\"bTest\" color=\"7\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"39\" name=\"tKeepout\" color=\"4\" fill=\"11\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"40\" name=\"bKeepout\" color=\"1\" fill=\"11\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"41\" name=\"tRestrict\" color=\"4\" fill=\"10\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"42\" name=\"bRestrict\" color=\"1\" fill=\"10\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"43\" name=\"vRestrict\" color=\"2\" fill=\"10\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"44\" name=\"Drills\" color=\"7\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"45\" name=\"Holes\" color=\"7\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"46\" name=\"Milling\" color=\"3\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"47\" name=\"Measures\" color=\"7\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"48\" name=\"Document\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"49\" name=\"Reference\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"51\" name=\"tDocu\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"52\" name=\"bDocu\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"91\" name=\"Nets\" color=\"2\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"92\" name=\"Busses\" color=\"1\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"93\" name=\"Pins\" color=\"2\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"94\" name=\"Symbols\" color=\"4\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"95\" name=\"Names\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"96\" name=\"Values\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"97\" name=\"Info\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"98\" name=\"Guide\" color=\"6\" fill=\"1\" visible=\"no\" active=\"no\"/>\n</layers>\n<board>\n<plain>\n<wire x1=\"0\" y1=\"0\" x2=\"17.76\" y2=\"0\" width=\"0\" layer=\"20\"/>\n<wire x1=\"17.76\" y1=\"0\" x2=\"17.76\" y2=\"6.02\" width=\"0\" layer=\"20\"/>\n<wire x1=\"17.76\" y1=\"6.02\" x2=\"0\" y2=\"6.02\" width=\"0\" layer=\"20\"/>\n<wire x1=\"0\" y1=\"6.02\" x2=\"0\" y2=\"0\" width=\"0\" layer=\"20\"/>\n</plain>\n<libraries>\n<library name=\"rcl\">\n<description>&lt;b&gt;Resistors, Capacitors, Inductors&lt;/b&gt;&lt;p&gt;\nBased on the previous libraries:\n&lt;ul&gt;\n&lt;li&gt;r.lbr\n&lt;li&gt;cap.lbr \n&lt;li&gt;cap-fe.lbr\n&lt;li&gt;captant.lbr\n&lt;li&gt;polcap.lbr\n&lt;li&gt;ipc-smd.lbr\n&lt;/ul&gt;\nAll SMD packages are defined according to the IPC specifications and  CECC&lt;p&gt;\n&lt;author&gt;Created by librarian@cadsoft.de&lt;/author&gt;&lt;p&gt;\n&lt;p&gt;\nfor Electrolyt Capacitors see also :&lt;p&gt;\nwww.bccomponents.com &lt;p&gt;\nwww.panasonic.com&lt;p&gt;\nwww.kemet.com&lt;p&gt;\nhttp://www.secc.co.jp/pdf/os_e/2004/e_os_all.pdf &lt;b&gt;(SANYO)&lt;/b&gt;\n&lt;p&gt;\nfor trimmer refence see : &lt;u&gt;www.electrospec-inc.com/cross_references/trimpotcrossref.asp&lt;/u&gt;&lt;p&gt;\n\n&lt;table border=0 cellspacing=0 cellpadding=0 width=\"100%\" cellpaddding=0&gt;\n&lt;tr valign=\"top\"&gt;\n\n&lt;! &lt;td width=\"10\"&gt;&amp;nbsp;&lt;/td&gt;\n&lt;td width=\"90%\"&gt;\n\n&lt;b&gt;&lt;font color=\"#0000FF\" size=\"4\"&gt;TRIM-POT CROSS REFERENCE&lt;/font&gt;&lt;/b&gt;\n&lt;P&gt;\n&lt;TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;RECTANGULAR MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;BOURNS&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;BI&amp;nbsp;TECH&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;DALE-VISHAY&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;PHILIPS/MEPCO&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;MURATA&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;PANASONIC&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;SPECTROL&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;MILSPEC&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3 &gt;\n      3005P&lt;BR&gt;\n      3006P&lt;BR&gt;\n      3006W&lt;BR&gt;\n      3006Y&lt;BR&gt;\n      3009P&lt;BR&gt;\n      3009W&lt;BR&gt;\n      3009Y&lt;BR&gt;\n      3057J&lt;BR&gt;\n      3057L&lt;BR&gt;\n      3057P&lt;BR&gt;\n      3057Y&lt;BR&gt;\n      3059J&lt;BR&gt;\n      3059L&lt;BR&gt;\n      3059P&lt;BR&gt;\n      3059Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      89P&lt;BR&gt;\n      89W&lt;BR&gt;\n      89X&lt;BR&gt;\n      89PH&lt;BR&gt;\n      76P&lt;BR&gt;\n      89XH&lt;BR&gt;\n      78SLT&lt;BR&gt;\n      78L&amp;nbsp;ALT&lt;BR&gt;\n      56P&amp;nbsp;ALT&lt;BR&gt;\n      78P&amp;nbsp;ALT&lt;BR&gt;\n      T8S&lt;BR&gt;\n      78L&lt;BR&gt;\n      56P&lt;BR&gt;\n      78P&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      T18/784&lt;BR&gt;\n      783&lt;BR&gt;\n      781&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      2199&lt;BR&gt;\n      1697/1897&lt;BR&gt;\n      1680/1880&lt;BR&gt;\n      2187&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      8035EKP/CT20/RJ-20P&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ-20X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      1211L&lt;BR&gt;\n      8012EKQ&amp;nbsp;ALT&lt;BR&gt;\n      8012EKR&amp;nbsp;ALT&lt;BR&gt;\n      1211P&lt;BR&gt;\n      8012EKJ&lt;BR&gt;\n      8012EKL&lt;BR&gt;\n      8012EKQ&lt;BR&gt;\n      8012EKR&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      2101P&lt;BR&gt;\n      2101W&lt;BR&gt;\n      2101Y&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      2102L&lt;BR&gt;\n      2102S&lt;BR&gt;\n      2102Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      EVMCOG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      43P&lt;BR&gt;\n      43W&lt;BR&gt;\n      43Y&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      40L&lt;BR&gt;\n      40P&lt;BR&gt;\n      40Y&lt;BR&gt;\n      70Y-T602&lt;BR&gt;\n      70L&lt;BR&gt;\n      70P&lt;BR&gt;\n      70Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SQUARE MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n   &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MURATA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;SPECTROL&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MILSPEC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3250L&lt;BR&gt;\n      3250P&lt;BR&gt;\n      3250W&lt;BR&gt;\n      3250X&lt;BR&gt;\n      3252P&lt;BR&gt;\n      3252W&lt;BR&gt;\n      3252X&lt;BR&gt;\n      3260P&lt;BR&gt;\n      3260W&lt;BR&gt;\n      3260X&lt;BR&gt;\n      3262P&lt;BR&gt;\n      3262W&lt;BR&gt;\n      3262X&lt;BR&gt;\n      3266P&lt;BR&gt;\n      3266W&lt;BR&gt;\n      3266X&lt;BR&gt;\n      3290H&lt;BR&gt;\n      3290P&lt;BR&gt;\n      3290W&lt;BR&gt;\n      3292P&lt;BR&gt;\n      3292W&lt;BR&gt;\n      3292X&lt;BR&gt;\n      3296P&lt;BR&gt;\n      3296W&lt;BR&gt;\n      3296X&lt;BR&gt;\n      3296Y&lt;BR&gt;\n      3296Z&lt;BR&gt;\n      3299P&lt;BR&gt;\n      3299W&lt;BR&gt;\n      3299X&lt;BR&gt;\n      3299Y&lt;BR&gt;\n      3299Z&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      -&lt;BR&gt;\n      64W&amp;nbsp;ALT&lt;BR&gt;\n      -&lt;BR&gt;\n      64P&amp;nbsp;ALT&lt;BR&gt;\n      64W&amp;nbsp;ALT&lt;BR&gt;\n      64X&amp;nbsp;ALT&lt;BR&gt;\n      64P&lt;BR&gt;\n      64W&lt;BR&gt;\n      64X&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66P&lt;BR&gt;\n      66W&lt;BR&gt;\n      66X&lt;BR&gt;\n      67P&lt;BR&gt;\n      67W&lt;BR&gt;\n      67X&lt;BR&gt;\n      67Y&lt;BR&gt;\n      67Z&lt;BR&gt;\n      68P&lt;BR&gt;\n      68W&lt;BR&gt;\n      68X&lt;BR&gt;\n      67Y&amp;nbsp;ALT&lt;BR&gt;\n      67Z&amp;nbsp;ALT&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      5050&lt;BR&gt;\n      5091&lt;BR&gt;\n      5080&lt;BR&gt;\n      5087&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T63YB&lt;BR&gt;\n      T63XB&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      5887&lt;BR&gt;\n      5891&lt;BR&gt;\n      5880&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T93Z&lt;BR&gt;\n      T93YA&lt;BR&gt;\n      T93XA&lt;BR&gt;\n      T93YB&lt;BR&gt;\n      T93XB&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8026EKP&lt;BR&gt;\n      8026EKW&lt;BR&gt;\n      8026EKM&lt;BR&gt;\n      8026EKP&lt;BR&gt;\n      8026EKB&lt;BR&gt;\n      8026EKM&lt;BR&gt;\n      1309X&lt;BR&gt;\n      1309P&lt;BR&gt;\n      1309W&lt;BR&gt;\n      8024EKP&lt;BR&gt;\n      8024EKW&lt;BR&gt;\n      8024EKN&lt;BR&gt;\n      RJ-9P/CT9P&lt;BR&gt;\n      RJ-9W&lt;BR&gt;\n      RJ-9X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3103P&lt;BR&gt;\n      3103Y&lt;BR&gt;\n      3103Z&lt;BR&gt;\n      3103P&lt;BR&gt;\n      3103Y&lt;BR&gt;\n      3103Z&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3105P/3106P&lt;BR&gt;\n      3105W/3106W&lt;BR&gt;\n      3105X/3106X&lt;BR&gt;\n      3105Y/3106Y&lt;BR&gt;\n      3105Z/3105Z&lt;BR&gt;\n      3102P&lt;BR&gt;\n      3102W&lt;BR&gt;\n      3102X&lt;BR&gt;\n      3102Y&lt;BR&gt;\n      3102Z&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMCBG&lt;BR&gt;\n      EVMCCG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      55-1-X&lt;BR&gt;\n      55-4-X&lt;BR&gt;\n      55-3-X&lt;BR&gt;\n      55-2-X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      50-2-X&lt;BR&gt;\n      50-4-X&lt;BR&gt;\n      50-3-X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      64P&lt;BR&gt;\n      64W&lt;BR&gt;\n      64X&lt;BR&gt;\n      64Y&lt;BR&gt;\n      64Z&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SINGLE TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MURATA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;SPECTROL&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MILSPEC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3323P&lt;BR&gt;\n      3323S&lt;BR&gt;\n      3323W&lt;BR&gt;\n      3329H&lt;BR&gt;\n      3329P&lt;BR&gt;\n      3329W&lt;BR&gt;\n      3339H&lt;BR&gt;\n      3339P&lt;BR&gt;\n      3339W&lt;BR&gt;\n      3352E&lt;BR&gt;\n      3352H&lt;BR&gt;\n      3352K&lt;BR&gt;\n      3352P&lt;BR&gt;\n      3352T&lt;BR&gt;\n      3352V&lt;BR&gt;\n      3352W&lt;BR&gt;\n      3362H&lt;BR&gt;\n      3362M&lt;BR&gt;\n      3362P&lt;BR&gt;\n      3362R&lt;BR&gt;\n      3362S&lt;BR&gt;\n      3362U&lt;BR&gt;\n      3362W&lt;BR&gt;\n      3362X&lt;BR&gt;\n      3386B&lt;BR&gt;\n      3386C&lt;BR&gt;\n      3386F&lt;BR&gt;\n      3386H&lt;BR&gt;\n      3386K&lt;BR&gt;\n      3386M&lt;BR&gt;\n      3386P&lt;BR&gt;\n      3386S&lt;BR&gt;\n      3386W&lt;BR&gt;\n      3386X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      25P&lt;BR&gt;\n      25S&lt;BR&gt;\n      25RX&lt;BR&gt;\n      82P&lt;BR&gt;\n      82M&lt;BR&gt;\n      82PA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      91E&lt;BR&gt;\n      91X&lt;BR&gt;\n      91T&lt;BR&gt;\n      91B&lt;BR&gt;\n      91A&lt;BR&gt;\n      91V&lt;BR&gt;\n      91W&lt;BR&gt;\n      25W&lt;BR&gt;\n      25V&lt;BR&gt;\n      25P&lt;BR&gt;\n      -&lt;BR&gt;\n      25S&lt;BR&gt;\n      25U&lt;BR&gt;\n      25RX&lt;BR&gt;\n      25X&lt;BR&gt;\n      72XW&lt;BR&gt;\n      72XL&lt;BR&gt;\n      72PM&lt;BR&gt;\n      72RX&lt;BR&gt;\n      -&lt;BR&gt;\n      72PX&lt;BR&gt;\n      72P&lt;BR&gt;\n      72RXW&lt;BR&gt;\n      72RXL&lt;BR&gt;\n      72X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T7YB&lt;BR&gt;\n      T7YA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      TXD&lt;BR&gt;\n      TYA&lt;BR&gt;\n      TYP&lt;BR&gt;\n      -&lt;BR&gt;\n      TYD&lt;BR&gt;\n      TX&lt;BR&gt;\n      -&lt;BR&gt;\n      150SX&lt;BR&gt;\n      100SX&lt;BR&gt;\n      102T&lt;BR&gt;\n      101S&lt;BR&gt;\n      190T&lt;BR&gt;\n      150TX&lt;BR&gt;\n      101&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      101SX&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ET6P&lt;BR&gt;\n      ET6S&lt;BR&gt;\n      ET6X&lt;BR&gt;\n      RJ-6W/8014EMW&lt;BR&gt;\n      RJ-6P/8014EMP&lt;BR&gt;\n      RJ-6X/8014EMX&lt;BR&gt;\n      TM7W&lt;BR&gt;\n      TM7P&lt;BR&gt;\n      TM7X&lt;BR&gt;\n      -&lt;BR&gt;\n      8017SMS&lt;BR&gt;\n      -&lt;BR&gt;\n      8017SMB&lt;BR&gt;\n      8017SMA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      CT-6W&lt;BR&gt;\n      CT-6H&lt;BR&gt;\n      CT-6P&lt;BR&gt;\n      CT-6R&lt;BR&gt;\n      -&lt;BR&gt;\n      CT-6V&lt;BR&gt;\n      CT-6X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKV&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKX&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKP&lt;BR&gt;\n      8038EKZ&lt;BR&gt;\n      8038EKW&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3321H&lt;BR&gt;\n      3321P&lt;BR&gt;\n      3321N&lt;BR&gt;\n      1102H&lt;BR&gt;\n      1102P&lt;BR&gt;\n      1102T&lt;BR&gt;\n      RVA0911V304A&lt;BR&gt;\n      -&lt;BR&gt;\n      RVA0911H413A&lt;BR&gt;\n      RVG0707V100A&lt;BR&gt;\n      RVA0607V(H)306A&lt;BR&gt;\n      RVA1214H213A&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3104B&lt;BR&gt;\n      3104C&lt;BR&gt;\n      3104F&lt;BR&gt;\n      3104H&lt;BR&gt;\n      -&lt;BR&gt;\n      3104M&lt;BR&gt;\n      3104P&lt;BR&gt;\n      3104S&lt;BR&gt;\n      3104W&lt;BR&gt;\n      3104X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      EVMQ0G&lt;BR&gt;\n      EVMQIG&lt;BR&gt;\n      EVMQ3G&lt;BR&gt;\n      EVMS0G&lt;BR&gt;\n      EVMQ0G&lt;BR&gt;\n      EVMG0G&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMK4GA00B&lt;BR&gt;\n      EVM30GA00B&lt;BR&gt;\n      EVMK0GA00B&lt;BR&gt;\n      EVM38GA00B&lt;BR&gt;\n      EVMB6&lt;BR&gt;\n      EVLQ0&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMMSG&lt;BR&gt;\n      EVMMBG&lt;BR&gt;\n      EVMMAG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMMCS&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM1&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM0&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM3&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      62-3-1&lt;BR&gt;\n      62-1-2&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      67R&lt;BR&gt;\n      -&lt;BR&gt;\n      67P&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      67X&lt;BR&gt;\n      63V&lt;BR&gt;\n      63S&lt;BR&gt;\n      63M&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      63H&lt;BR&gt;\n      63P&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      63X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n&lt;/TABLE&gt;\n&lt;P&gt;&amp;nbsp;&lt;P&gt;\n&lt;TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;\n      &lt;FONT color=\"#0000FF\" SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SMD TRIM-POT CROSS REFERENCE&lt;/B&gt;&lt;/FONT&gt;\n      &lt;P&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURNS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;TOCOS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;AUX/KYOCERA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3224G&lt;BR&gt;\n      3224J&lt;BR&gt;\n      3224W&lt;BR&gt;\n      3269P&lt;BR&gt;\n      3269W&lt;BR&gt;\n      3269X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      44G&lt;BR&gt;\n      44J&lt;BR&gt;\n      44W&lt;BR&gt;\n      84P&lt;BR&gt;\n      84W&lt;BR&gt;\n      84X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST63Z&lt;BR&gt;\n      ST63Y&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST5P&lt;BR&gt;\n      ST5W&lt;BR&gt;\n      ST5X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SINGLE TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURNS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;TOCOS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;AUX/KYOCERA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3314G&lt;BR&gt;\n      3314J&lt;BR&gt;\n      3364A/B&lt;BR&gt;\n      3364C/D&lt;BR&gt;\n      3364W/X&lt;BR&gt;\n      3313G&lt;BR&gt;\n      3313J&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      23B&lt;BR&gt;\n      23A&lt;BR&gt;\n      21X&lt;BR&gt;\n      21W&lt;BR&gt;\n      -&lt;BR&gt;\n      22B&lt;BR&gt;\n      22A&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ST5YL/ST53YL&lt;BR&gt;\n      ST5YJ/5T53YJ&lt;BR&gt;\n      ST-23A&lt;BR&gt;\n      ST-22B&lt;BR&gt;\n      ST-22&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ST-4B&lt;BR&gt;\n      ST-4A&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST-3B&lt;BR&gt;\n      ST-3A&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      EVM-6YS&lt;BR&gt;\n      EVM-1E&lt;BR&gt;\n      EVM-1G&lt;BR&gt;\n      EVM-1D&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      G4B&lt;BR&gt;\n      G4A&lt;BR&gt;\n      TR04-3S1&lt;BR&gt;\n      TRG04-2S1&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      DVR-43A&lt;BR&gt;\n      CVR-42C&lt;BR&gt;\n      CVR-42A/C&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n&lt;/TABLE&gt;\n&lt;P&gt;\n&lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;ALT =&amp;nbsp;ALTERNATE&lt;/B&gt;&lt;/FONT&gt;\n&lt;P&gt;\n\n&amp;nbsp;\n&lt;P&gt;\n&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/table&gt;</description>\n<packages>\n<package name=\"R0805\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;</description>\n<wire x1=\"-0.41\" y1=\"0.635\" x2=\"0.41\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.41\" y1=\"-0.635\" x2=\"0.41\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.95\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.95\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4064\" y1=\"-0.6985\" x2=\"1.0564\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-1.0668\" y1=\"-0.6985\" x2=\"-0.4168\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.5001\" x2=\"0.1999\" y2=\"0.5001\" layer=\"35\"/>\n</package>\n</packages>\n</library>\n<library name=\"pinhead\">\n<description>&lt;b&gt;Pin Header Connectors&lt;/b&gt;&lt;p&gt;\n&lt;author&gt;Created by librarian@cadsoft.de&lt;/author&gt;</description>\n<packages>\n<package name=\"1X01\">\n<description>&lt;b&gt;PIN HEADER&lt;/b&gt;</description>\n<wire x1=\"-0.635\" y1=\"1.27\" x2=\"0.635\" y2=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"0.635\" y1=\"1.27\" x2=\"1.27\" y2=\"0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.27\" y1=\"0.635\" x2=\"1.27\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.27\" y1=\"-0.635\" x2=\"0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.27\" y1=\"0.635\" x2=\"-1.27\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-0.635\" y1=\"1.27\" x2=\"-1.27\" y2=\"0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.27\" y1=\"-0.635\" x2=\"-0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"0.635\" y1=\"-1.27\" x2=\"-0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"0\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-1.3462\" y=\"1.8288\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-0.254\" y1=\"-0.254\" x2=\"0.254\" y2=\"0.254\" layer=\"51\"/>\n</package>\n</packages>\n</library>\n</libraries>\n<attributes>\n</attributes>\n<variantdefs>\n</variantdefs>\n<classes>\n<class number=\"0\" name=\"default\" width=\"0\" drill=\"0\">\n</class>\n</classes>\n<designrules name=\"default\">\n<description language=\"de\">&lt;b&gt;EAGLE Design Rules&lt;/b&gt;\n&lt;p&gt;\nDie Standard-Design-Rules sind so gewählt, dass sie für \ndie meisten Anwendungen passen. Sollte ihre Platine \nbesondere Anforderungen haben, treffen Sie die erforderlichen\nEinstellungen hier und speichern die Design Rules unter \neinem neuen Namen ab.</description>\n<description language=\"en\">&lt;b&gt;EAGLE Design Rules&lt;/b&gt;\n&lt;p&gt;\nThe default Design Rules have been set to cover\na wide range of applications. Your particular design\nmay have different requirements, so please make the\nnecessary adjustments and save your customized\ndesign rules under a new name.</description>\n<param name=\"layerSetup\" value=\"(1*16)\"/>\n<param name=\"mtCopper\" value=\"0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm\"/>\n<param name=\"mtIsolate\" value=\"1.5mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm\"/>\n<param name=\"mdWireWire\" value=\"8mil\"/>\n<param name=\"mdWirePad\" value=\"8mil\"/>\n<param name=\"mdWireVia\" value=\"8mil\"/>\n<param name=\"mdPadPad\" value=\"8mil\"/>\n<param name=\"mdPadVia\" value=\"8mil\"/>\n<param name=\"mdViaVia\" value=\"8mil\"/>\n<param name=\"mdSmdPad\" value=\"8mil\"/>\n<param name=\"mdSmdVia\" value=\"8mil\"/>\n<param name=\"mdSmdSmd\" value=\"8mil\"/>\n<param name=\"mdViaViaSameLayer\" value=\"8mil\"/>\n<param name=\"mnLayersViaInSmd\" value=\"2\"/>\n<param name=\"mdCopperDimension\" value=\"40mil\"/>\n<param name=\"mdDrill\" value=\"8mil\"/>\n<param name=\"mdSmdStop\" value=\"0mil\"/>\n<param name=\"msWidth\" value=\"10mil\"/>\n<param name=\"msDrill\" value=\"24mil\"/>\n<param name=\"msMicroVia\" value=\"9.99mm\"/>\n<param name=\"msBlindViaRatio\" value=\"0.5\"/>\n<param name=\"rvPadTop\" value=\"0.25\"/>\n<param name=\"rvPadInner\" value=\"0.25\"/>\n<param name=\"rvPadBottom\" value=\"0.25\"/>\n<param name=\"rvViaOuter\" value=\"0.25\"/>\n<param name=\"rvViaInner\" value=\"0.25\"/>\n<param name=\"rvMicroViaOuter\" value=\"0.25\"/>\n<param name=\"rvMicroViaInner\" value=\"0.25\"/>\n<param name=\"rlMinPadTop\" value=\"10mil\"/>\n<param name=\"rlMaxPadTop\" value=\"20mil\"/>\n<param name=\"rlMinPadInner\" value=\"10mil\"/>\n<param name=\"rlMaxPadInner\" value=\"20mil\"/>\n<param name=\"rlMinPadBottom\" value=\"10mil\"/>\n<param name=\"rlMaxPadBottom\" value=\"20mil\"/>\n<param name=\"rlMinViaOuter\" value=\"8mil\"/>\n<param name=\"rlMaxViaOuter\" value=\"20mil\"/>\n<param name=\"rlMinViaInner\" value=\"8mil\"/>\n<param name=\"rlMaxViaInner\" value=\"20mil\"/>\n<param name=\"rlMinMicroViaOuter\" value=\"4mil\"/>\n<param name=\"rlMaxMicroViaOuter\" value=\"20mil\"/>\n<param name=\"rlMinMicroViaInner\" value=\"4mil\"/>\n<param name=\"rlMaxMicroViaInner\" value=\"20mil\"/>\n<param name=\"psTop\" value=\"-1\"/>\n<param name=\"psBottom\" value=\"-1\"/>\n<param name=\"psFirst\" value=\"-1\"/>\n<param name=\"psElongationLong\" value=\"100\"/>\n<param name=\"psElongationOffset\" value=\"100\"/>\n<param name=\"mvStopFrame\" value=\"1\"/>\n<param name=\"mvCreamFrame\" value=\"0\"/>\n<param name=\"mlMinStopFrame\" value=\"4mil\"/>\n<param name=\"mlMaxStopFrame\" value=\"4mil\"/>\n<param name=\"mlMinCreamFrame\" value=\"0mil\"/>\n<param name=\"mlMaxCreamFrame\" value=\"0mil\"/>\n<param name=\"mlViaStopLimit\" value=\"0mil\"/>\n<param name=\"srRoundness\" value=\"0\"/>\n<param name=\"srMinRoundness\" value=\"0mil\"/>\n<param name=\"srMaxRoundness\" value=\"0mil\"/>\n<param name=\"slThermalIsolate\" value=\"10mil\"/>\n<param name=\"slThermalsForVias\" value=\"0\"/>\n<param name=\"dpMaxLengthDifference\" value=\"10mm\"/>\n<param name=\"dpGapFactor\" value=\"2.5\"/>\n<param name=\"checkGrid\" value=\"0\"/>\n<param name=\"checkAngle\" value=\"0\"/>\n<param name=\"checkFont\" value=\"1\"/>\n<param name=\"checkRestrict\" value=\"1\"/>\n<param name=\"useDiameter\" value=\"13\"/>\n<param name=\"maxErrors\" value=\"50\"/>\n</designrules>\n<autorouter>\n<pass name=\"Default\">\n<param name=\"RoutingGrid\" value=\"50mil\"/>\n<param name=\"tpViaShape\" value=\"round\"/>\n<param name=\"PrefDir.1\" value=\"|\"/>\n<param name=\"PrefDir.2\" value=\"0\"/>\n<param name=\"PrefDir.3\" value=\"0\"/>\n<param name=\"PrefDir.4\" value=\"0\"/>\n<param name=\"PrefDir.5\" value=\"0\"/>\n<param name=\"PrefDir.6\" value=\"0\"/>\n<param name=\"PrefDir.7\" value=\"0\"/>\n<param name=\"PrefDir.8\" value=\"0\"/>\n<param name=\"PrefDir.9\" value=\"0\"/>\n<param name=\"PrefDir.10\" value=\"0\"/>\n<param name=\"PrefDir.11\" value=\"0\"/>\n<param name=\"PrefDir.12\" value=\"0\"/>\n<param name=\"PrefDir.13\" value=\"0\"/>\n<param name=\"PrefDir.14\" value=\"0\"/>\n<param name=\"PrefDir.15\" value=\"0\"/>\n<param name=\"PrefDir.16\" value=\"-\"/>\n<param name=\"cfVia\" value=\"8\"/>\n<param name=\"cfNonPref\" value=\"5\"/>\n<param name=\"cfChangeDir\" value=\"2\"/>\n<param name=\"cfOrthStep\" value=\"2\"/>\n<param name=\"cfDiagStep\" value=\"3\"/>\n<param name=\"cfExtdStep\" value=\"0\"/>\n<param name=\"cfBonusStep\" value=\"1\"/>\n<param name=\"cfMalusStep\" value=\"1\"/>\n<param name=\"cfPadImpact\" value=\"4\"/>\n<param name=\"cfSmdImpact\" value=\"4\"/>\n<param name=\"cfBusImpact\" value=\"0\"/>\n<param name=\"cfHugging\" value=\"3\"/>\n<param name=\"cfAvoid\" value=\"4\"/>\n<param name=\"cfPolygon\" value=\"10\"/>\n<param name=\"cfBase.1\" value=\"0\"/>\n<param name=\"cfBase.2\" value=\"1\"/>\n<param name=\"cfBase.3\" value=\"1\"/>\n<param name=\"cfBase.4\" value=\"1\"/>\n<param name=\"cfBase.5\" value=\"1\"/>\n<param name=\"cfBase.6\" value=\"1\"/>\n<param name=\"cfBase.7\" value=\"1\"/>\n<param name=\"cfBase.8\" value=\"1\"/>\n<param name=\"cfBase.9\" value=\"1\"/>\n<param name=\"cfBase.10\" value=\"1\"/>\n<param name=\"cfBase.11\" value=\"1\"/>\n<param name=\"cfBase.12\" value=\"1\"/>\n<param name=\"cfBase.13\" value=\"1\"/>\n<param name=\"cfBase.14\" value=\"1\"/>\n<param name=\"cfBase.15\" value=\"1\"/>\n<param name=\"cfBase.16\" value=\"0\"/>\n<param name=\"mnVias\" value=\"20\"/>\n<param name=\"mnSegments\" value=\"9999\"/>\n<param name=\"mnExtdSteps\" value=\"9999\"/>\n<param name=\"mnRipupLevel\" value=\"10\"/>\n<param name=\"mnRipupSteps\" value=\"100\"/>\n<param name=\"mnRipupTotal\" value=\"100\"/>\n</pass>\n<pass name=\"Follow-me\" refer=\"Default\" active=\"yes\">\n</pass>\n<pass name=\"Busses\" refer=\"Default\" active=\"yes\">\n<param name=\"cfNonPref\" value=\"4\"/>\n<param name=\"cfBusImpact\" value=\"4\"/>\n<param name=\"cfHugging\" value=\"0\"/>\n<param name=\"mnVias\" value=\"0\"/>\n</pass>\n<pass name=\"Route\" refer=\"Default\" active=\"yes\">\n</pass>\n<pass name=\"Optimize1\" refer=\"Default\" active=\"yes\">\n<param name=\"cfVia\" value=\"99\"/>\n<param name=\"cfExtdStep\" value=\"10\"/>\n<param name=\"cfHugging\" value=\"1\"/>\n<param name=\"mnExtdSteps\" value=\"1\"/>\n<param name=\"mnRipupLevel\" value=\"0\"/>\n</pass>\n<pass name=\"Optimize2\" refer=\"Optimize1\" active=\"yes\">\n<param name=\"cfNonPref\" value=\"0\"/>\n<param name=\"cfChangeDir\" value=\"6\"/>\n<param name=\"cfExtdStep\" value=\"0\"/>\n<param name=\"cfBonusStep\" value=\"2\"/>\n<param name=\"cfMalusStep\" value=\"2\"/>\n<param name=\"cfPadImpact\" value=\"2\"/>\n<param name=\"cfSmdImpact\" value=\"2\"/>\n<param name=\"cfHugging\" value=\"0\"/>\n</pass>\n<pass name=\"Optimize3\" refer=\"Optimize2\" active=\"yes\">\n<param name=\"cfChangeDir\" value=\"8\"/>\n<param name=\"cfPadImpact\" value=\"0\"/>\n<param name=\"cfSmdImpact\" value=\"0\"/>\n</pass>\n<pass name=\"Optimize4\" refer=\"Optimize3\" active=\"yes\">\n<param name=\"cfChangeDir\" value=\"25\"/>\n</pass>\n</autorouter>\n<elements>\n<element name=\"R1\" library=\"rcl\" package=\"R0805\" value=\"1K\" x=\"8.636\" y=\"2.54\" smashed=\"yes\">\n<attribute name=\"NAME\" x=\"6.223\" y=\"4.064\" size=\"1.27\" layer=\"25\"/>\n<attribute name=\"VALUE\" x=\"9.271\" y=\"4.064\" size=\"1.27\" layer=\"27\"/>\n</element>\n<element name=\"IN\" library=\"pinhead\" package=\"1X01\" value=\"\" x=\"1.778\" y=\"2.54\" smashed=\"yes\">\n<attribute name=\"NAME\" x=\"0.6858\" y=\"4.3688\" size=\"1.27\" layer=\"25\" ratio=\"10\"/>\n<attribute name=\"VALUE\" x=\"0.508\" y=\"-0.635\" size=\"1.27\" layer=\"27\"/>\n</element>\n<element name=\"OUT\" library=\"pinhead\" package=\"1X01\" value=\"\" x=\"16.002\" y=\"2.54\" smashed=\"yes\">\n<attribute name=\"NAME\" x=\"13.6398\" y=\"4.3688\" size=\"1.27\" layer=\"25\" ratio=\"10\"/>\n<attribute name=\"VALUE\" x=\"14.732\" y=\"-0.635\" size=\"1.27\" layer=\"27\"/>\n</element>\n</elements>\n<signals>\n<signal name=\"N$2\">\n<contactref element=\"R1\" pad=\"2\"/>\n<contactref element=\"OUT\" pad=\"1\"/>\n<wire x1=\"9.586\" y1=\"2.54\" x2=\"12.446\" y2=\"2.54\" width=\"0.4064\" layer=\"1\"/>\n<via x=\"12.446\" y=\"2.54\" extent=\"1-16\" drill=\"0.6\"/>\n<wire x1=\"12.446\" y1=\"2.54\" x2=\"16.002\" y2=\"2.54\" width=\"0.4064\" layer=\"16\"/>\n</signal>\n<signal name=\"N$1\">\n<contactref element=\"IN\" pad=\"1\"/>\n<contactref element=\"R1\" pad=\"1\"/>\n<wire x1=\"1.778\" y1=\"2.54\" x2=\"7.686\" y2=\"2.54\" width=\"0.4064\" layer=\"1\"/>\n</signal>\n<signal name=\"GND\">\n<polygon width=\"0.4064\" layer=\"16\">\n<vertex x=\"-0.254\" y=\"-0.254\"/>\n<vertex x=\"-0.254\" y=\"6.35\"/>\n<vertex x=\"18.034\" y=\"6.35\"/>\n<vertex x=\"18.034\" y=\"-0.254\"/>\n</polygon>\n<polygon width=\"0.4064\" layer=\"1\">\n<vertex x=\"-0.508\" y=\"6.604\"/>\n<vertex x=\"18.288\" y=\"6.604\"/>\n<vertex x=\"18.288\" y=\"-0.508\"/>\n<vertex x=\"-0.508\" y=\"-0.508\"/>\n</polygon>\n</signal>\n</signals>\n</board>\n</drawing>\n</eagle>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Eagle/Eagle.sch",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"6.3\">\n<drawing>\n<settings>\n<setting alwaysvectorfont=\"no\"/>\n<setting verticaltext=\"up\"/>\n</settings>\n<grid distance=\"0.1\" unitdist=\"inch\" unit=\"inch\" style=\"lines\" multiple=\"1\" display=\"no\" altdistance=\"0.01\" altunitdist=\"inch\" altunit=\"inch\"/>\n<layers>\n<layer number=\"1\" name=\"Top\" color=\"4\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"2\" name=\"Route2\" color=\"1\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"3\" name=\"Route3\" color=\"4\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"4\" name=\"Route4\" color=\"1\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"5\" name=\"Route5\" color=\"4\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"6\" name=\"Route6\" color=\"1\" fill=\"8\" visible=\"no\" active=\"no\"/>\n<layer number=\"7\" name=\"Route7\" color=\"4\" fill=\"8\" visible=\"no\" active=\"no\"/>\n<layer number=\"8\" name=\"Route8\" color=\"1\" fill=\"2\" visible=\"no\" active=\"no\"/>\n<layer number=\"9\" name=\"Route9\" color=\"4\" fill=\"2\" visible=\"no\" active=\"no\"/>\n<layer number=\"10\" name=\"Route10\" color=\"1\" fill=\"7\" visible=\"no\" active=\"no\"/>\n<layer number=\"11\" name=\"Route11\" color=\"4\" fill=\"7\" visible=\"no\" active=\"no\"/>\n<layer number=\"12\" name=\"Route12\" color=\"1\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"13\" name=\"Route13\" color=\"4\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"14\" name=\"Route14\" color=\"1\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"15\" name=\"Route15\" color=\"4\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"16\" name=\"Bottom\" color=\"1\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"17\" name=\"Pads\" color=\"2\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"18\" name=\"Vias\" color=\"2\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"19\" name=\"Unrouted\" color=\"6\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"20\" name=\"Dimension\" color=\"15\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"21\" name=\"tPlace\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"22\" name=\"bPlace\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"23\" name=\"tOrigins\" color=\"15\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"24\" name=\"bOrigins\" color=\"15\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"25\" name=\"tNames\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"26\" name=\"bNames\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"27\" name=\"tValues\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"28\" name=\"bValues\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"29\" name=\"tStop\" color=\"7\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"30\" name=\"bStop\" color=\"7\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"31\" name=\"tCream\" color=\"7\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"32\" name=\"bCream\" color=\"7\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"33\" name=\"tFinish\" color=\"6\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"34\" name=\"bFinish\" color=\"6\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"35\" name=\"tGlue\" color=\"7\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"36\" name=\"bGlue\" color=\"7\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"37\" name=\"tTest\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"38\" name=\"bTest\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"39\" name=\"tKeepout\" color=\"4\" fill=\"11\" visible=\"no\" active=\"no\"/>\n<layer number=\"40\" name=\"bKeepout\" color=\"1\" fill=\"11\" visible=\"no\" active=\"no\"/>\n<layer number=\"41\" name=\"tRestrict\" color=\"4\" fill=\"10\" visible=\"no\" active=\"no\"/>\n<layer number=\"42\" name=\"bRestrict\" color=\"1\" fill=\"10\" visible=\"no\" active=\"no\"/>\n<layer number=\"43\" name=\"vRestrict\" color=\"2\" fill=\"10\" visible=\"no\" active=\"no\"/>\n<layer number=\"44\" name=\"Drills\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"45\" name=\"Holes\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"46\" name=\"Milling\" color=\"3\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"47\" name=\"Measures\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"48\" name=\"Document\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"49\" name=\"Reference\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"51\" name=\"tDocu\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"52\" name=\"bDocu\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"91\" name=\"Nets\" color=\"2\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"92\" name=\"Busses\" color=\"1\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"93\" name=\"Pins\" color=\"2\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"94\" name=\"Symbols\" color=\"4\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"95\" name=\"Names\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"96\" name=\"Values\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"97\" name=\"Info\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"98\" name=\"Guide\" color=\"6\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n</layers>\n<schematic xreflabel=\"%F%N/%S.%C%R\" xrefpart=\"/%S.%C%R\">\n<libraries>\n<library name=\"frames\">\n<description>&lt;b&gt;Frames for Sheet and Layout&lt;/b&gt;</description>\n<packages>\n</packages>\n<symbols>\n<symbol name=\"A4L-LOC\">\n<wire x1=\"256.54\" y1=\"3.81\" x2=\"256.54\" y2=\"8.89\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"256.54\" y1=\"8.89\" x2=\"256.54\" y2=\"13.97\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"256.54\" y1=\"13.97\" x2=\"256.54\" y2=\"19.05\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"256.54\" y1=\"19.05\" x2=\"256.54\" y2=\"24.13\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"161.29\" y1=\"3.81\" x2=\"161.29\" y2=\"24.13\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"161.29\" y1=\"24.13\" x2=\"215.265\" y2=\"24.13\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"24.13\" x2=\"256.54\" y2=\"24.13\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"246.38\" y1=\"3.81\" x2=\"246.38\" y2=\"8.89\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"246.38\" y1=\"8.89\" x2=\"256.54\" y2=\"8.89\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"246.38\" y1=\"8.89\" x2=\"215.265\" y2=\"8.89\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"8.89\" x2=\"215.265\" y2=\"3.81\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"8.89\" x2=\"215.265\" y2=\"13.97\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"13.97\" x2=\"256.54\" y2=\"13.97\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"13.97\" x2=\"215.265\" y2=\"19.05\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"19.05\" x2=\"256.54\" y2=\"19.05\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"19.05\" x2=\"215.265\" y2=\"24.13\" width=\"0.1016\" layer=\"94\"/>\n<text x=\"217.17\" y=\"15.24\" size=\"2.54\" layer=\"94\" font=\"vector\">&gt;DRAWING_NAME</text>\n<text x=\"217.17\" y=\"10.16\" size=\"2.286\" layer=\"94\" font=\"vector\">&gt;LAST_DATE_TIME</text>\n<text x=\"230.505\" y=\"5.08\" size=\"2.54\" layer=\"94\" font=\"vector\">&gt;SHEET</text>\n<text x=\"216.916\" y=\"4.953\" size=\"2.54\" layer=\"94\" font=\"vector\">Sheet:</text>\n<frame x1=\"0\" y1=\"0\" x2=\"260.35\" y2=\"179.07\" columns=\"6\" rows=\"4\" layer=\"94\"/>\n</symbol>\n</symbols>\n<devicesets>\n<deviceset name=\"A4L-LOC\" prefix=\"FRAME\" uservalue=\"yes\">\n<description>&lt;b&gt;FRAME&lt;/b&gt;&lt;p&gt;\nDIN A4, landscape with location and doc. field</description>\n<gates>\n<gate name=\"G$1\" symbol=\"A4L-LOC\" x=\"0\" y=\"0\"/>\n</gates>\n<devices>\n<device name=\"\">\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n</devices>\n</deviceset>\n</devicesets>\n</library>\n<library name=\"rcl\">\n<description>&lt;b&gt;Resistors, Capacitors, Inductors&lt;/b&gt;&lt;p&gt;\nBased on the previous libraries:\n&lt;ul&gt;\n&lt;li&gt;r.lbr\n&lt;li&gt;cap.lbr \n&lt;li&gt;cap-fe.lbr\n&lt;li&gt;captant.lbr\n&lt;li&gt;polcap.lbr\n&lt;li&gt;ipc-smd.lbr\n&lt;/ul&gt;\nAll SMD packages are defined according to the IPC specifications and  CECC&lt;p&gt;\n&lt;author&gt;Created by librarian@cadsoft.de&lt;/author&gt;&lt;p&gt;\n&lt;p&gt;\nfor Electrolyt Capacitors see also :&lt;p&gt;\nwww.bccomponents.com &lt;p&gt;\nwww.panasonic.com&lt;p&gt;\nwww.kemet.com&lt;p&gt;\nhttp://www.secc.co.jp/pdf/os_e/2004/e_os_all.pdf &lt;b&gt;(SANYO)&lt;/b&gt;\n&lt;p&gt;\nfor trimmer refence see : &lt;u&gt;www.electrospec-inc.com/cross_references/trimpotcrossref.asp&lt;/u&gt;&lt;p&gt;\n\n&lt;table border=0 cellspacing=0 cellpadding=0 width=\"100%\" cellpaddding=0&gt;\n&lt;tr valign=\"top\"&gt;\n\n&lt;! &lt;td width=\"10\"&gt;&amp;nbsp;&lt;/td&gt;\n&lt;td width=\"90%\"&gt;\n\n&lt;b&gt;&lt;font color=\"#0000FF\" size=\"4\"&gt;TRIM-POT CROSS REFERENCE&lt;/font&gt;&lt;/b&gt;\n&lt;P&gt;\n&lt;TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;RECTANGULAR MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;BOURNS&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;BI&amp;nbsp;TECH&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;DALE-VISHAY&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;PHILIPS/MEPCO&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;MURATA&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;PANASONIC&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;SPECTROL&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;MILSPEC&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3 &gt;\n      3005P&lt;BR&gt;\n      3006P&lt;BR&gt;\n      3006W&lt;BR&gt;\n      3006Y&lt;BR&gt;\n      3009P&lt;BR&gt;\n      3009W&lt;BR&gt;\n      3009Y&lt;BR&gt;\n      3057J&lt;BR&gt;\n      3057L&lt;BR&gt;\n      3057P&lt;BR&gt;\n      3057Y&lt;BR&gt;\n      3059J&lt;BR&gt;\n      3059L&lt;BR&gt;\n      3059P&lt;BR&gt;\n      3059Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      89P&lt;BR&gt;\n      89W&lt;BR&gt;\n      89X&lt;BR&gt;\n      89PH&lt;BR&gt;\n      76P&lt;BR&gt;\n      89XH&lt;BR&gt;\n      78SLT&lt;BR&gt;\n      78L&amp;nbsp;ALT&lt;BR&gt;\n      56P&amp;nbsp;ALT&lt;BR&gt;\n      78P&amp;nbsp;ALT&lt;BR&gt;\n      T8S&lt;BR&gt;\n      78L&lt;BR&gt;\n      56P&lt;BR&gt;\n      78P&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      T18/784&lt;BR&gt;\n      783&lt;BR&gt;\n      781&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      2199&lt;BR&gt;\n      1697/1897&lt;BR&gt;\n      1680/1880&lt;BR&gt;\n      2187&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      8035EKP/CT20/RJ-20P&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ-20X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      1211L&lt;BR&gt;\n      8012EKQ&amp;nbsp;ALT&lt;BR&gt;\n      8012EKR&amp;nbsp;ALT&lt;BR&gt;\n      1211P&lt;BR&gt;\n      8012EKJ&lt;BR&gt;\n      8012EKL&lt;BR&gt;\n      8012EKQ&lt;BR&gt;\n      8012EKR&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      2101P&lt;BR&gt;\n      2101W&lt;BR&gt;\n      2101Y&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      2102L&lt;BR&gt;\n      2102S&lt;BR&gt;\n      2102Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      EVMCOG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      43P&lt;BR&gt;\n      43W&lt;BR&gt;\n      43Y&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      40L&lt;BR&gt;\n      40P&lt;BR&gt;\n      40Y&lt;BR&gt;\n      70Y-T602&lt;BR&gt;\n      70L&lt;BR&gt;\n      70P&lt;BR&gt;\n      70Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SQUARE MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n   &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MURATA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;SPECTROL&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MILSPEC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3250L&lt;BR&gt;\n      3250P&lt;BR&gt;\n      3250W&lt;BR&gt;\n      3250X&lt;BR&gt;\n      3252P&lt;BR&gt;\n      3252W&lt;BR&gt;\n      3252X&lt;BR&gt;\n      3260P&lt;BR&gt;\n      3260W&lt;BR&gt;\n      3260X&lt;BR&gt;\n      3262P&lt;BR&gt;\n      3262W&lt;BR&gt;\n      3262X&lt;BR&gt;\n      3266P&lt;BR&gt;\n      3266W&lt;BR&gt;\n      3266X&lt;BR&gt;\n      3290H&lt;BR&gt;\n      3290P&lt;BR&gt;\n      3290W&lt;BR&gt;\n      3292P&lt;BR&gt;\n      3292W&lt;BR&gt;\n      3292X&lt;BR&gt;\n      3296P&lt;BR&gt;\n      3296W&lt;BR&gt;\n      3296X&lt;BR&gt;\n      3296Y&lt;BR&gt;\n      3296Z&lt;BR&gt;\n      3299P&lt;BR&gt;\n      3299W&lt;BR&gt;\n      3299X&lt;BR&gt;\n      3299Y&lt;BR&gt;\n      3299Z&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      -&lt;BR&gt;\n      64W&amp;nbsp;ALT&lt;BR&gt;\n      -&lt;BR&gt;\n      64P&amp;nbsp;ALT&lt;BR&gt;\n      64W&amp;nbsp;ALT&lt;BR&gt;\n      64X&amp;nbsp;ALT&lt;BR&gt;\n      64P&lt;BR&gt;\n      64W&lt;BR&gt;\n      64X&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66P&lt;BR&gt;\n      66W&lt;BR&gt;\n      66X&lt;BR&gt;\n      67P&lt;BR&gt;\n      67W&lt;BR&gt;\n      67X&lt;BR&gt;\n      67Y&lt;BR&gt;\n      67Z&lt;BR&gt;\n      68P&lt;BR&gt;\n      68W&lt;BR&gt;\n      68X&lt;BR&gt;\n      67Y&amp;nbsp;ALT&lt;BR&gt;\n      67Z&amp;nbsp;ALT&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      5050&lt;BR&gt;\n      5091&lt;BR&gt;\n      5080&lt;BR&gt;\n      5087&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T63YB&lt;BR&gt;\n      T63XB&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      5887&lt;BR&gt;\n      5891&lt;BR&gt;\n      5880&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T93Z&lt;BR&gt;\n      T93YA&lt;BR&gt;\n      T93XA&lt;BR&gt;\n      T93YB&lt;BR&gt;\n      T93XB&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8026EKP&lt;BR&gt;\n      8026EKW&lt;BR&gt;\n      8026EKM&lt;BR&gt;\n      8026EKP&lt;BR&gt;\n      8026EKB&lt;BR&gt;\n      8026EKM&lt;BR&gt;\n      1309X&lt;BR&gt;\n      1309P&lt;BR&gt;\n      1309W&lt;BR&gt;\n      8024EKP&lt;BR&gt;\n      8024EKW&lt;BR&gt;\n      8024EKN&lt;BR&gt;\n      RJ-9P/CT9P&lt;BR&gt;\n      RJ-9W&lt;BR&gt;\n      RJ-9X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3103P&lt;BR&gt;\n      3103Y&lt;BR&gt;\n      3103Z&lt;BR&gt;\n      3103P&lt;BR&gt;\n      3103Y&lt;BR&gt;\n      3103Z&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3105P/3106P&lt;BR&gt;\n      3105W/3106W&lt;BR&gt;\n      3105X/3106X&lt;BR&gt;\n      3105Y/3106Y&lt;BR&gt;\n      3105Z/3105Z&lt;BR&gt;\n      3102P&lt;BR&gt;\n      3102W&lt;BR&gt;\n      3102X&lt;BR&gt;\n      3102Y&lt;BR&gt;\n      3102Z&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMCBG&lt;BR&gt;\n      EVMCCG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      55-1-X&lt;BR&gt;\n      55-4-X&lt;BR&gt;\n      55-3-X&lt;BR&gt;\n      55-2-X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      50-2-X&lt;BR&gt;\n      50-4-X&lt;BR&gt;\n      50-3-X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      64P&lt;BR&gt;\n      64W&lt;BR&gt;\n      64X&lt;BR&gt;\n      64Y&lt;BR&gt;\n      64Z&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SINGLE TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MURATA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;SPECTROL&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MILSPEC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3323P&lt;BR&gt;\n      3323S&lt;BR&gt;\n      3323W&lt;BR&gt;\n      3329H&lt;BR&gt;\n      3329P&lt;BR&gt;\n      3329W&lt;BR&gt;\n      3339H&lt;BR&gt;\n      3339P&lt;BR&gt;\n      3339W&lt;BR&gt;\n      3352E&lt;BR&gt;\n      3352H&lt;BR&gt;\n      3352K&lt;BR&gt;\n      3352P&lt;BR&gt;\n      3352T&lt;BR&gt;\n      3352V&lt;BR&gt;\n      3352W&lt;BR&gt;\n      3362H&lt;BR&gt;\n      3362M&lt;BR&gt;\n      3362P&lt;BR&gt;\n      3362R&lt;BR&gt;\n      3362S&lt;BR&gt;\n      3362U&lt;BR&gt;\n      3362W&lt;BR&gt;\n      3362X&lt;BR&gt;\n      3386B&lt;BR&gt;\n      3386C&lt;BR&gt;\n      3386F&lt;BR&gt;\n      3386H&lt;BR&gt;\n      3386K&lt;BR&gt;\n      3386M&lt;BR&gt;\n      3386P&lt;BR&gt;\n      3386S&lt;BR&gt;\n      3386W&lt;BR&gt;\n      3386X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      25P&lt;BR&gt;\n      25S&lt;BR&gt;\n      25RX&lt;BR&gt;\n      82P&lt;BR&gt;\n      82M&lt;BR&gt;\n      82PA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      91E&lt;BR&gt;\n      91X&lt;BR&gt;\n      91T&lt;BR&gt;\n      91B&lt;BR&gt;\n      91A&lt;BR&gt;\n      91V&lt;BR&gt;\n      91W&lt;BR&gt;\n      25W&lt;BR&gt;\n      25V&lt;BR&gt;\n      25P&lt;BR&gt;\n      -&lt;BR&gt;\n      25S&lt;BR&gt;\n      25U&lt;BR&gt;\n      25RX&lt;BR&gt;\n      25X&lt;BR&gt;\n      72XW&lt;BR&gt;\n      72XL&lt;BR&gt;\n      72PM&lt;BR&gt;\n      72RX&lt;BR&gt;\n      -&lt;BR&gt;\n      72PX&lt;BR&gt;\n      72P&lt;BR&gt;\n      72RXW&lt;BR&gt;\n      72RXL&lt;BR&gt;\n      72X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T7YB&lt;BR&gt;\n      T7YA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      TXD&lt;BR&gt;\n      TYA&lt;BR&gt;\n      TYP&lt;BR&gt;\n      -&lt;BR&gt;\n      TYD&lt;BR&gt;\n      TX&lt;BR&gt;\n      -&lt;BR&gt;\n      150SX&lt;BR&gt;\n      100SX&lt;BR&gt;\n      102T&lt;BR&gt;\n      101S&lt;BR&gt;\n      190T&lt;BR&gt;\n      150TX&lt;BR&gt;\n      101&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      101SX&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ET6P&lt;BR&gt;\n      ET6S&lt;BR&gt;\n      ET6X&lt;BR&gt;\n      RJ-6W/8014EMW&lt;BR&gt;\n      RJ-6P/8014EMP&lt;BR&gt;\n      RJ-6X/8014EMX&lt;BR&gt;\n      TM7W&lt;BR&gt;\n      TM7P&lt;BR&gt;\n      TM7X&lt;BR&gt;\n      -&lt;BR&gt;\n      8017SMS&lt;BR&gt;\n      -&lt;BR&gt;\n      8017SMB&lt;BR&gt;\n      8017SMA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      CT-6W&lt;BR&gt;\n      CT-6H&lt;BR&gt;\n      CT-6P&lt;BR&gt;\n      CT-6R&lt;BR&gt;\n      -&lt;BR&gt;\n      CT-6V&lt;BR&gt;\n      CT-6X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKV&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKX&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKP&lt;BR&gt;\n      8038EKZ&lt;BR&gt;\n      8038EKW&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3321H&lt;BR&gt;\n      3321P&lt;BR&gt;\n      3321N&lt;BR&gt;\n      1102H&lt;BR&gt;\n      1102P&lt;BR&gt;\n      1102T&lt;BR&gt;\n      RVA0911V304A&lt;BR&gt;\n      -&lt;BR&gt;\n      RVA0911H413A&lt;BR&gt;\n      RVG0707V100A&lt;BR&gt;\n      RVA0607V(H)306A&lt;BR&gt;\n      RVA1214H213A&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3104B&lt;BR&gt;\n      3104C&lt;BR&gt;\n      3104F&lt;BR&gt;\n      3104H&lt;BR&gt;\n      -&lt;BR&gt;\n      3104M&lt;BR&gt;\n      3104P&lt;BR&gt;\n      3104S&lt;BR&gt;\n      3104W&lt;BR&gt;\n      3104X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      EVMQ0G&lt;BR&gt;\n      EVMQIG&lt;BR&gt;\n      EVMQ3G&lt;BR&gt;\n      EVMS0G&lt;BR&gt;\n      EVMQ0G&lt;BR&gt;\n      EVMG0G&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMK4GA00B&lt;BR&gt;\n      EVM30GA00B&lt;BR&gt;\n      EVMK0GA00B&lt;BR&gt;\n      EVM38GA00B&lt;BR&gt;\n      EVMB6&lt;BR&gt;\n      EVLQ0&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMMSG&lt;BR&gt;\n      EVMMBG&lt;BR&gt;\n      EVMMAG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMMCS&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM1&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM0&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM3&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      62-3-1&lt;BR&gt;\n      62-1-2&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      67R&lt;BR&gt;\n      -&lt;BR&gt;\n      67P&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      67X&lt;BR&gt;\n      63V&lt;BR&gt;\n      63S&lt;BR&gt;\n      63M&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      63H&lt;BR&gt;\n      63P&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      63X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n&lt;/TABLE&gt;\n&lt;P&gt;&amp;nbsp;&lt;P&gt;\n&lt;TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;\n      &lt;FONT color=\"#0000FF\" SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SMD TRIM-POT CROSS REFERENCE&lt;/B&gt;&lt;/FONT&gt;\n      &lt;P&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURNS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;TOCOS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;AUX/KYOCERA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3224G&lt;BR&gt;\n      3224J&lt;BR&gt;\n      3224W&lt;BR&gt;\n      3269P&lt;BR&gt;\n      3269W&lt;BR&gt;\n      3269X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      44G&lt;BR&gt;\n      44J&lt;BR&gt;\n      44W&lt;BR&gt;\n      84P&lt;BR&gt;\n      84W&lt;BR&gt;\n      84X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST63Z&lt;BR&gt;\n      ST63Y&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST5P&lt;BR&gt;\n      ST5W&lt;BR&gt;\n      ST5X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SINGLE TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURNS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;TOCOS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;AUX/KYOCERA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3314G&lt;BR&gt;\n      3314J&lt;BR&gt;\n      3364A/B&lt;BR&gt;\n      3364C/D&lt;BR&gt;\n      3364W/X&lt;BR&gt;\n      3313G&lt;BR&gt;\n      3313J&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      23B&lt;BR&gt;\n      23A&lt;BR&gt;\n      21X&lt;BR&gt;\n      21W&lt;BR&gt;\n      -&lt;BR&gt;\n      22B&lt;BR&gt;\n      22A&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ST5YL/ST53YL&lt;BR&gt;\n      ST5YJ/5T53YJ&lt;BR&gt;\n      ST-23A&lt;BR&gt;\n      ST-22B&lt;BR&gt;\n      ST-22&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ST-4B&lt;BR&gt;\n      ST-4A&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST-3B&lt;BR&gt;\n      ST-3A&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      EVM-6YS&lt;BR&gt;\n      EVM-1E&lt;BR&gt;\n      EVM-1G&lt;BR&gt;\n      EVM-1D&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      G4B&lt;BR&gt;\n      G4A&lt;BR&gt;\n      TR04-3S1&lt;BR&gt;\n      TRG04-2S1&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      DVR-43A&lt;BR&gt;\n      CVR-42C&lt;BR&gt;\n      CVR-42A/C&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n&lt;/TABLE&gt;\n&lt;P&gt;\n&lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;ALT =&amp;nbsp;ALTERNATE&lt;/B&gt;&lt;/FONT&gt;\n&lt;P&gt;\n\n&amp;nbsp;\n&lt;P&gt;\n&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/table&gt;</description>\n<packages>\n<package name=\"R0402\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.245\" y1=\"0.224\" x2=\"0.245\" y2=\"0.224\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.245\" y1=\"-0.224\" x2=\"-0.245\" y2=\"-0.224\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.473\" y1=\"0.483\" x2=\"1.473\" y2=\"0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"0.483\" x2=\"1.473\" y2=\"-0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"-0.483\" x2=\"-1.473\" y2=\"-0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.473\" y1=\"-0.483\" x2=\"-1.473\" y2=\"0.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.65\" y=\"0\" dx=\"0.7\" dy=\"0.9\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.65\" y=\"0\" dx=\"0.7\" dy=\"0.9\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"0.635\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-1.905\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-0.554\" y1=\"-0.3048\" x2=\"-0.254\" y2=\"0.2951\" layer=\"51\"/>\n<rectangle x1=\"0.2588\" y1=\"-0.3048\" x2=\"0.5588\" y2=\"0.2951\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.4001\" x2=\"0.1999\" y2=\"0.4001\" layer=\"35\"/>\n</package>\n<package name=\"R0603\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.432\" y1=\"-0.356\" x2=\"0.432\" y2=\"-0.356\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.432\" y1=\"0.356\" x2=\"-0.432\" y2=\"0.356\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.473\" y1=\"0.983\" x2=\"1.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"0.983\" x2=\"1.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"-0.983\" x2=\"-1.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.473\" y1=\"-0.983\" x2=\"-1.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.85\" y=\"0\" dx=\"1\" dy=\"1.1\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.85\" y=\"0\" dx=\"1\" dy=\"1.1\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"0.635\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-1.905\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4318\" y1=\"-0.4318\" x2=\"0.8382\" y2=\"0.4318\" layer=\"51\"/>\n<rectangle x1=\"-0.8382\" y1=\"-0.4318\" x2=\"-0.4318\" y2=\"0.4318\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.4001\" x2=\"0.1999\" y2=\"0.4001\" layer=\"35\"/>\n</package>\n<package name=\"R0805\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;</description>\n<wire x1=\"-0.41\" y1=\"0.635\" x2=\"0.41\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.41\" y1=\"-0.635\" x2=\"0.41\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.95\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.95\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4064\" y1=\"-0.6985\" x2=\"1.0564\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-1.0668\" y1=\"-0.6985\" x2=\"-0.4168\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.5001\" x2=\"0.1999\" y2=\"0.5001\" layer=\"35\"/>\n</package>\n<package name=\"R0805W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt; wave soldering&lt;p&gt;</description>\n<wire x1=\"-0.41\" y1=\"0.635\" x2=\"0.41\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.41\" y1=\"-0.635\" x2=\"0.41\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.0525\" y=\"0\" dx=\"1.5\" dy=\"1\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.0525\" y=\"0\" dx=\"1.5\" dy=\"1\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4064\" y1=\"-0.6985\" x2=\"1.0564\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-1.0668\" y1=\"-0.6985\" x2=\"-0.4168\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.5001\" x2=\"0.1999\" y2=\"0.5001\" layer=\"35\"/>\n</package>\n<package name=\"R1005\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.245\" y1=\"0.224\" x2=\"0.245\" y2=\"0.224\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.245\" y1=\"-0.224\" x2=\"-0.245\" y2=\"-0.224\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.473\" y1=\"0.483\" x2=\"1.473\" y2=\"0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"0.483\" x2=\"1.473\" y2=\"-0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"-0.483\" x2=\"-1.473\" y2=\"-0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.473\" y1=\"-0.483\" x2=\"-1.473\" y2=\"0.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.65\" y=\"0\" dx=\"0.7\" dy=\"0.9\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.65\" y=\"0\" dx=\"0.7\" dy=\"0.9\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"0.635\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-1.905\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-0.554\" y1=\"-0.3048\" x2=\"-0.254\" y2=\"0.2951\" layer=\"51\"/>\n<rectangle x1=\"0.2588\" y1=\"-0.3048\" x2=\"0.5588\" y2=\"0.2951\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.3\" x2=\"0.1999\" y2=\"0.3\" layer=\"35\"/>\n</package>\n<package name=\"R1206\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"0.9525\" y1=\"-0.8128\" x2=\"-0.9652\" y2=\"-0.8128\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.9525\" y1=\"0.8128\" x2=\"-0.9652\" y2=\"0.8128\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"2\" x=\"1.422\" y=\"0\" dx=\"1.6\" dy=\"1.803\" layer=\"1\"/>\n<smd name=\"1\" x=\"-1.422\" y=\"0\" dx=\"1.6\" dy=\"1.803\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.6891\" y1=\"-0.8763\" x2=\"-0.9525\" y2=\"0.8763\" layer=\"51\"/>\n<rectangle x1=\"0.9525\" y1=\"-0.8763\" x2=\"1.6891\" y2=\"0.8763\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.7\" x2=\"0.3\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"R1206W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-0.913\" y1=\"0.8\" x2=\"0.888\" y2=\"0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-0.8\" x2=\"0.888\" y2=\"-0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.499\" y=\"0\" dx=\"1.8\" dy=\"1.2\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.499\" y=\"0\" dx=\"1.8\" dy=\"1.2\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.905\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-0.8763\" x2=\"-0.9009\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"0.889\" y1=\"-0.8763\" x2=\"1.6391\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.7\" x2=\"0.3\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"R1210\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.913\" y1=\"1.219\" x2=\"0.939\" y2=\"1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-1.219\" x2=\"0.939\" y2=\"-1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.4\" y=\"0\" dx=\"1.6\" dy=\"2.7\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.4\" y=\"0\" dx=\"1.6\" dy=\"2.7\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-1.3081\" x2=\"-0.9009\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"0.9144\" y1=\"-1.3081\" x2=\"1.6645\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.8999\" x2=\"0.3\" y2=\"0.8999\" layer=\"35\"/>\n</package>\n<package name=\"R1210W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-0.913\" y1=\"1.219\" x2=\"0.939\" y2=\"1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-1.219\" x2=\"0.939\" y2=\"-1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.499\" y=\"0\" dx=\"1.8\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.499\" y=\"0\" dx=\"1.8\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-1.3081\" x2=\"-0.9009\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"0.9144\" y1=\"-1.3081\" x2=\"1.6645\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.8001\" x2=\"0.3\" y2=\"0.8001\" layer=\"35\"/>\n</package>\n<package name=\"R2010\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-1.662\" y1=\"1.245\" x2=\"1.662\" y2=\"1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.637\" y1=\"-1.245\" x2=\"1.687\" y2=\"-1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.2\" y=\"0\" dx=\"1.8\" dy=\"2.7\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.2\" y=\"0\" dx=\"1.8\" dy=\"2.7\" layer=\"1\"/>\n<text x=\"-3.175\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-2.4892\" y1=\"-1.3208\" x2=\"-1.6393\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"1.651\" y1=\"-1.3208\" x2=\"2.5009\" y2=\"1.3292\" layer=\"51\"/>\n</package>\n<package name=\"R2010W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-1.662\" y1=\"1.245\" x2=\"1.662\" y2=\"1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.637\" y1=\"-1.245\" x2=\"1.687\" y2=\"-1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.311\" y=\"0\" dx=\"2\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.311\" y=\"0\" dx=\"2\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-2.4892\" y1=\"-1.3208\" x2=\"-1.6393\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"1.651\" y1=\"-1.3208\" x2=\"2.5009\" y2=\"1.3292\" layer=\"51\"/>\n</package>\n<package name=\"R2012\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.41\" y1=\"0.635\" x2=\"0.41\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.41\" y1=\"-0.635\" x2=\"0.41\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.85\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.85\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4064\" y1=\"-0.6985\" x2=\"1.0564\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-1.0668\" y1=\"-0.6985\" x2=\"-0.4168\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-0.1001\" y1=\"-0.5999\" x2=\"0.1001\" y2=\"0.5999\" layer=\"35\"/>\n</package>\n<package name=\"R2012W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-0.41\" y1=\"0.635\" x2=\"0.41\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.41\" y1=\"-0.635\" x2=\"0.41\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.94\" y=\"0\" dx=\"1.5\" dy=\"1\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.94\" y=\"0\" dx=\"1.5\" dy=\"1\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4064\" y1=\"-0.6985\" x2=\"1.0564\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-1.0668\" y1=\"-0.6985\" x2=\"-0.4168\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-0.1001\" y1=\"-0.5999\" x2=\"0.1001\" y2=\"0.5999\" layer=\"35\"/>\n</package>\n<package name=\"R2512\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-2.362\" y1=\"1.473\" x2=\"2.387\" y2=\"1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.362\" y1=\"-1.473\" x2=\"2.387\" y2=\"-1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.8\" y=\"0\" dx=\"1.8\" dy=\"3.2\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.8\" y=\"0\" dx=\"1.8\" dy=\"3.2\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.2004\" y1=\"-1.5494\" x2=\"-2.3505\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"2.3622\" y1=\"-1.5494\" x2=\"3.2121\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R2512W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-2.362\" y1=\"1.473\" x2=\"2.387\" y2=\"1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.362\" y1=\"-1.473\" x2=\"2.387\" y2=\"-1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.896\" y=\"0\" dx=\"2\" dy=\"2.1\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.896\" y=\"0\" dx=\"2\" dy=\"2.1\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.905\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.2004\" y1=\"-1.5494\" x2=\"-2.3505\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"2.3622\" y1=\"-1.5494\" x2=\"3.2121\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R3216\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.913\" y1=\"0.8\" x2=\"0.888\" y2=\"0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-0.8\" x2=\"0.888\" y2=\"-0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.4\" y=\"0\" dx=\"1.6\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.4\" y=\"0\" dx=\"1.6\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.905\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-0.8763\" x2=\"-0.9009\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"0.889\" y1=\"-0.8763\" x2=\"1.6391\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.7\" x2=\"0.3\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"R3216W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-0.913\" y1=\"0.8\" x2=\"0.888\" y2=\"0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-0.8\" x2=\"0.888\" y2=\"-0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.499\" y=\"0\" dx=\"1.8\" dy=\"1.2\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.499\" y=\"0\" dx=\"1.8\" dy=\"1.2\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.905\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-0.8763\" x2=\"-0.9009\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"0.889\" y1=\"-0.8763\" x2=\"1.6391\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.7\" x2=\"0.3\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"R3225\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.913\" y1=\"1.219\" x2=\"0.939\" y2=\"1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-1.219\" x2=\"0.939\" y2=\"-1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.4\" y=\"0\" dx=\"1.6\" dy=\"2.7\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.4\" y=\"0\" dx=\"1.6\" dy=\"2.7\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-1.3081\" x2=\"-0.9009\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"0.9144\" y1=\"-1.3081\" x2=\"1.6645\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-1\" x2=\"0.3\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R3225W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-0.913\" y1=\"1.219\" x2=\"0.939\" y2=\"1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-1.219\" x2=\"0.939\" y2=\"-1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.499\" y=\"0\" dx=\"1.8\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.499\" y=\"0\" dx=\"1.8\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.905\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-1.3081\" x2=\"-0.9009\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"0.9144\" y1=\"-1.3081\" x2=\"1.6645\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-1\" x2=\"0.3\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R5025\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-1.662\" y1=\"1.245\" x2=\"1.662\" y2=\"1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.637\" y1=\"-1.245\" x2=\"1.687\" y2=\"-1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.2\" y=\"0\" dx=\"1.8\" dy=\"2.7\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.2\" y=\"0\" dx=\"1.8\" dy=\"2.7\" layer=\"1\"/>\n<text x=\"-3.175\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-2.4892\" y1=\"-1.3208\" x2=\"-1.6393\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"1.651\" y1=\"-1.3208\" x2=\"2.5009\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R5025W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-1.662\" y1=\"1.245\" x2=\"1.662\" y2=\"1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.637\" y1=\"-1.245\" x2=\"1.687\" y2=\"-1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.311\" y=\"0\" dx=\"2\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.311\" y=\"0\" dx=\"2\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-3.175\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-2.4892\" y1=\"-1.3208\" x2=\"-1.6393\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"1.651\" y1=\"-1.3208\" x2=\"2.5009\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R6332\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nSource: http://download.siliconexpert.com/pdfs/2005/02/24/Semi_Ap/2/VSH/Resistor/dcrcwfre.pdf</description>\n<wire x1=\"-2.362\" y1=\"1.473\" x2=\"2.387\" y2=\"1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.362\" y1=\"-1.473\" x2=\"2.387\" y2=\"-1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-3.1\" y=\"0\" dx=\"1\" dy=\"3.2\" layer=\"1\"/>\n<smd name=\"2\" x=\"3.1\" y=\"0\" dx=\"1\" dy=\"3.2\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.2004\" y1=\"-1.5494\" x2=\"-2.3505\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"2.3622\" y1=\"-1.5494\" x2=\"3.2121\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R6332W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt; wave soldering&lt;p&gt;\nSource: http://download.siliconexpert.com/pdfs/2005/02/24/Semi_Ap/2/VSH/Resistor/dcrcwfre.pdf</description>\n<wire x1=\"-2.362\" y1=\"1.473\" x2=\"2.387\" y2=\"1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.362\" y1=\"-1.473\" x2=\"2.387\" y2=\"-1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-3.196\" y=\"0\" dx=\"1.2\" dy=\"3.2\" layer=\"1\"/>\n<smd name=\"2\" x=\"3.196\" y=\"0\" dx=\"1.2\" dy=\"3.2\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.2004\" y1=\"-1.5494\" x2=\"-2.3505\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"2.3622\" y1=\"-1.5494\" x2=\"3.2121\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"M0805\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.10 W</description>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"0.7112\" y1=\"0.635\" x2=\"-0.7112\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.7112\" y1=\"-0.635\" x2=\"-0.7112\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-0.95\" y=\"0\" dx=\"1.3\" dy=\"1.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.95\" y=\"0\" dx=\"1.3\" dy=\"1.6\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.0414\" y1=\"-0.7112\" x2=\"-0.6858\" y2=\"0.7112\" layer=\"51\"/>\n<rectangle x1=\"0.6858\" y1=\"-0.7112\" x2=\"1.0414\" y2=\"0.7112\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.5999\" x2=\"0.1999\" y2=\"0.5999\" layer=\"35\"/>\n</package>\n<package name=\"M1206\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.25 W</description>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.143\" y1=\"0.8382\" x2=\"-1.143\" y2=\"0.8382\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"1.143\" y1=\"-0.8382\" x2=\"-1.143\" y2=\"-0.8382\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-1.4\" y=\"0\" dx=\"1.6\" dy=\"2\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.4\" y=\"0\" dx=\"1.6\" dy=\"2\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.7018\" y1=\"-0.9144\" x2=\"-1.1176\" y2=\"0.9144\" layer=\"51\"/>\n<rectangle x1=\"1.1176\" y1=\"-0.9144\" x2=\"1.7018\" y2=\"0.9144\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.8001\" x2=\"0.3\" y2=\"0.8001\" layer=\"35\"/>\n</package>\n<package name=\"M1406\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.12 W</description>\n<wire x1=\"-2.973\" y1=\"0.983\" x2=\"2.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.973\" y1=\"-0.983\" x2=\"-2.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.973\" y1=\"-0.983\" x2=\"-2.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.973\" y1=\"0.983\" x2=\"2.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.3208\" y1=\"0.762\" x2=\"-1.3208\" y2=\"0.762\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"1.3208\" y1=\"-0.762\" x2=\"-1.3208\" y2=\"-0.762\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-1.7\" y=\"0\" dx=\"1.4\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.7\" y=\"0\" dx=\"1.4\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.8542\" y1=\"-0.8382\" x2=\"-1.2954\" y2=\"0.8382\" layer=\"51\"/>\n<rectangle x1=\"1.2954\" y1=\"-0.8382\" x2=\"1.8542\" y2=\"0.8382\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.7\" x2=\"0.3\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"M2012\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.10 W</description>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"0.7112\" y1=\"0.635\" x2=\"-0.7112\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.7112\" y1=\"-0.635\" x2=\"-0.7112\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-0.95\" y=\"0\" dx=\"1.3\" dy=\"1.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.95\" y=\"0\" dx=\"1.3\" dy=\"1.6\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.0414\" y1=\"-0.7112\" x2=\"-0.6858\" y2=\"0.7112\" layer=\"51\"/>\n<rectangle x1=\"0.6858\" y1=\"-0.7112\" x2=\"1.0414\" y2=\"0.7112\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.5999\" x2=\"0.1999\" y2=\"0.5999\" layer=\"35\"/>\n</package>\n<package name=\"M2309\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.25 W</description>\n<wire x1=\"-4.473\" y1=\"1.483\" x2=\"4.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"4.473\" y1=\"-1.483\" x2=\"-4.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-4.473\" y1=\"-1.483\" x2=\"-4.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"4.473\" y1=\"1.483\" x2=\"4.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.413\" y1=\"1.1684\" x2=\"-2.4384\" y2=\"1.1684\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"2.413\" y1=\"-1.1684\" x2=\"-2.413\" y2=\"-1.1684\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-2.85\" y=\"0\" dx=\"1.5\" dy=\"2.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.85\" y=\"0\" dx=\"1.5\" dy=\"2.6\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.048\" y1=\"-1.2446\" x2=\"-2.3876\" y2=\"1.2446\" layer=\"51\"/>\n<rectangle x1=\"2.3876\" y1=\"-1.2446\" x2=\"3.048\" y2=\"1.2446\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"M3216\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.25 W</description>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.143\" y1=\"0.8382\" x2=\"-1.143\" y2=\"0.8382\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"1.143\" y1=\"-0.8382\" x2=\"-1.143\" y2=\"-0.8382\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-1.4\" y=\"0\" dx=\"1.6\" dy=\"2\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.4\" y=\"0\" dx=\"1.6\" dy=\"2\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.7018\" y1=\"-0.9144\" x2=\"-1.1176\" y2=\"0.9144\" layer=\"51\"/>\n<rectangle x1=\"1.1176\" y1=\"-0.9144\" x2=\"1.7018\" y2=\"0.9144\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.8001\" x2=\"0.3\" y2=\"0.8001\" layer=\"35\"/>\n</package>\n<package name=\"M3516\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.12 W</description>\n<wire x1=\"-2.973\" y1=\"0.983\" x2=\"2.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.973\" y1=\"-0.983\" x2=\"-2.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.973\" y1=\"-0.983\" x2=\"-2.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.973\" y1=\"0.983\" x2=\"2.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.3208\" y1=\"0.762\" x2=\"-1.3208\" y2=\"0.762\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"1.3208\" y1=\"-0.762\" x2=\"-1.3208\" y2=\"-0.762\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-1.7\" y=\"0\" dx=\"1.4\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.7\" y=\"0\" dx=\"1.4\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.8542\" y1=\"-0.8382\" x2=\"-1.2954\" y2=\"0.8382\" layer=\"51\"/>\n<rectangle x1=\"1.2954\" y1=\"-0.8382\" x2=\"1.8542\" y2=\"0.8382\" layer=\"51\"/>\n<rectangle x1=\"-0.4001\" y1=\"-0.7\" x2=\"0.4001\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"M5923\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.25 W</description>\n<wire x1=\"-4.473\" y1=\"1.483\" x2=\"4.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"4.473\" y1=\"-1.483\" x2=\"-4.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-4.473\" y1=\"-1.483\" x2=\"-4.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"4.473\" y1=\"1.483\" x2=\"4.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.413\" y1=\"1.1684\" x2=\"-2.4384\" y2=\"1.1684\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"2.413\" y1=\"-1.1684\" x2=\"-2.413\" y2=\"-1.1684\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-2.85\" y=\"0\" dx=\"1.5\" dy=\"2.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.85\" y=\"0\" dx=\"1.5\" dy=\"2.6\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.048\" y1=\"-1.2446\" x2=\"-2.3876\" y2=\"1.2446\" layer=\"51\"/>\n<rectangle x1=\"2.3876\" y1=\"-1.2446\" x2=\"3.048\" y2=\"1.2446\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"0204/5\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0204, grid 5 mm</description>\n<wire x1=\"2.54\" y1=\"0\" x2=\"2.032\" y2=\"0\" width=\"0.508\" layer=\"51\"/>\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-2.032\" y2=\"0\" width=\"0.508\" layer=\"51\"/>\n<wire x1=\"-1.778\" y1=\"0.635\" x2=\"-1.524\" y2=\"0.889\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-1.778\" y1=\"-0.635\" x2=\"-1.524\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"1.524\" y1=\"-0.889\" x2=\"1.778\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"1.524\" y1=\"0.889\" x2=\"1.778\" y2=\"0.635\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-1.778\" y1=\"-0.635\" x2=\"-1.778\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.524\" y1=\"0.889\" x2=\"-1.27\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.143\" y1=\"0.762\" x2=\"-1.27\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.524\" y1=\"-0.889\" x2=\"-1.27\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.143\" y1=\"-0.762\" x2=\"-1.27\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.143\" y1=\"0.762\" x2=\"1.27\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.143\" y1=\"0.762\" x2=\"-1.143\" y2=\"0.762\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.143\" y1=\"-0.762\" x2=\"1.27\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.143\" y1=\"-0.762\" x2=\"-1.143\" y2=\"-0.762\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.524\" y1=\"0.889\" x2=\"1.27\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.524\" y1=\"-0.889\" x2=\"1.27\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.778\" y1=\"-0.635\" x2=\"1.778\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-2.0066\" y=\"1.1684\" size=\"0.9906\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.1336\" y=\"-2.3114\" size=\"0.9906\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-2.032\" y1=\"-0.254\" x2=\"-1.778\" y2=\"0.254\" layer=\"51\"/>\n<rectangle x1=\"1.778\" y1=\"-0.254\" x2=\"2.032\" y2=\"0.254\" layer=\"51\"/>\n</package>\n<package name=\"0204/7\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0204, grid 7.5 mm</description>\n<wire x1=\"3.81\" y1=\"0\" x2=\"2.921\" y2=\"0\" width=\"0.508\" layer=\"51\"/>\n<wire x1=\"-3.81\" y1=\"0\" x2=\"-2.921\" y2=\"0\" width=\"0.508\" layer=\"51\"/>\n<wire x1=\"-2.54\" y1=\"0.762\" x2=\"-2.286\" y2=\"1.016\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-2.54\" y1=\"-0.762\" x2=\"-2.286\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.286\" y1=\"-1.016\" x2=\"2.54\" y2=\"-0.762\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.286\" y1=\"1.016\" x2=\"2.54\" y2=\"0.762\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-2.54\" y1=\"-0.762\" x2=\"-2.54\" y2=\"0.762\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.286\" y1=\"1.016\" x2=\"-1.905\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.778\" y1=\"0.889\" x2=\"-1.905\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.286\" y1=\"-1.016\" x2=\"-1.905\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.778\" y1=\"-0.889\" x2=\"-1.905\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.778\" y1=\"0.889\" x2=\"1.905\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.778\" y1=\"0.889\" x2=\"-1.778\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.778\" y1=\"-0.889\" x2=\"1.905\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.778\" y1=\"-0.889\" x2=\"-1.778\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.286\" y1=\"1.016\" x2=\"1.905\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.286\" y1=\"-1.016\" x2=\"1.905\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.54\" y1=\"-0.762\" x2=\"2.54\" y2=\"0.762\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-3.81\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"3.81\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-2.54\" y=\"1.2954\" size=\"0.9906\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-1.6256\" y=\"-0.4826\" size=\"0.9906\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"2.54\" y1=\"-0.254\" x2=\"2.921\" y2=\"0.254\" layer=\"21\"/>\n<rectangle x1=\"-2.921\" y1=\"-0.254\" x2=\"-2.54\" y2=\"0.254\" layer=\"21\"/>\n</package>\n<package name=\"0207/10\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 10 mm</description>\n<wire x1=\"5.08\" y1=\"0\" x2=\"4.064\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-5.08\" y1=\"0\" x2=\"-4.064\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-3.175\" y1=\"0.889\" x2=\"-2.921\" y2=\"1.143\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-2.921\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"3.175\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"1.143\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"1.016\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"-1.143\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"-1.016\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"-2.413\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"-2.413\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.175\" y1=\"-0.889\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-5.08\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"5.08\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-3.048\" y=\"1.524\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.2606\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"3.175\" y1=\"-0.3048\" x2=\"4.0386\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-4.0386\" y1=\"-0.3048\" x2=\"-3.175\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"0207/12\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 12 mm</description>\n<wire x1=\"6.35\" y1=\"0\" x2=\"5.334\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.334\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-3.175\" y1=\"0.889\" x2=\"-2.921\" y2=\"1.143\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-2.921\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"3.175\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"1.143\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"1.016\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"-1.143\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"-1.016\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"-2.413\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"-2.413\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.175\" y1=\"-0.889\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.445\" y1=\"0\" x2=\"4.064\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<wire x1=\"-4.445\" y1=\"0\" x2=\"-4.064\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-3.175\" y=\"1.397\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.286\" y=\"-0.6858\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"3.175\" y1=\"-0.3048\" x2=\"4.0386\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-4.0386\" y1=\"-0.3048\" x2=\"-3.175\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"4.445\" y1=\"-0.3048\" x2=\"5.3086\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-5.3086\" y1=\"-0.3048\" x2=\"-4.445\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"0207/15\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 15mm</description>\n<wire x1=\"7.62\" y1=\"0\" x2=\"6.604\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-7.62\" y1=\"0\" x2=\"-6.604\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-3.175\" y1=\"0.889\" x2=\"-2.921\" y2=\"1.143\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-2.921\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"3.175\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"1.143\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"1.016\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"-1.143\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"-1.016\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"-2.413\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"-2.413\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.175\" y1=\"-0.889\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.715\" y1=\"0\" x2=\"4.064\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<wire x1=\"-5.715\" y1=\"0\" x2=\"-4.064\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<pad name=\"1\" x=\"-7.62\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"7.62\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-3.175\" y=\"1.397\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.286\" y=\"-0.6858\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"3.175\" y1=\"-0.3048\" x2=\"4.0386\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-4.0386\" y1=\"-0.3048\" x2=\"-3.175\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"5.715\" y1=\"-0.3048\" x2=\"6.5786\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-6.5786\" y1=\"-0.3048\" x2=\"-5.715\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"0207/2V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 2.5 mm</description>\n<wire x1=\"-1.27\" y1=\"0\" x2=\"-0.381\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-0.254\" y1=\"0\" x2=\"0.254\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<wire x1=\"0.381\" y1=\"0\" x2=\"1.27\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"1.016\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-0.0508\" y=\"1.016\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-0.0508\" y=\"-2.2352\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n</package>\n<package name=\"0207/5V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 5 mm</description>\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-0.889\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-0.762\" y1=\"0\" x2=\"0.762\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<wire x1=\"0.889\" y1=\"0\" x2=\"2.54\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.27\" width=\"0.1016\" layer=\"21\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.016\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-1.143\" y=\"0.889\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-1.143\" y=\"-2.159\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n</package>\n<package name=\"0207/7\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 7.5 mm</description>\n<wire x1=\"-3.81\" y1=\"0\" x2=\"-3.429\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-3.175\" y1=\"0.889\" x2=\"-2.921\" y2=\"1.143\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-2.921\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"3.175\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.921\" y1=\"1.143\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"1.016\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"-1.143\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"-1.016\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"-2.413\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"-2.413\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.175\" y1=\"-0.889\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"3.429\" y1=\"0\" x2=\"3.81\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-3.81\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"3.81\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-2.54\" y=\"1.397\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.286\" y=\"-0.5588\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-3.429\" y1=\"-0.3048\" x2=\"-3.175\" y2=\"0.3048\" layer=\"51\"/>\n<rectangle x1=\"3.175\" y1=\"-0.3048\" x2=\"3.429\" y2=\"0.3048\" layer=\"51\"/>\n</package>\n<package name=\"0309/10\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0309, grid 10mm</description>\n<wire x1=\"-4.699\" y1=\"0\" x2=\"-5.08\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-4.318\" y1=\"1.27\" x2=\"-4.064\" y2=\"1.524\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-4.318\" y1=\"-1.27\" x2=\"-4.064\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.064\" y1=\"-1.524\" x2=\"4.318\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.064\" y1=\"1.524\" x2=\"4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-4.318\" y1=\"-1.27\" x2=\"-4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-4.064\" y1=\"1.524\" x2=\"-3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.302\" y1=\"1.397\" x2=\"-3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.064\" y1=\"-1.524\" x2=\"-3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.302\" y1=\"-1.397\" x2=\"-3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"1.397\" x2=\"3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"1.397\" x2=\"-3.302\" y2=\"1.397\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"-1.397\" x2=\"3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"-1.397\" x2=\"-3.302\" y2=\"-1.397\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.064\" y1=\"1.524\" x2=\"3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.064\" y1=\"-1.524\" x2=\"3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.318\" y1=\"-1.27\" x2=\"4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"5.08\" y1=\"0\" x2=\"4.699\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-5.08\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"5.08\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-4.191\" y=\"1.905\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.6858\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-4.6228\" y1=\"-0.3048\" x2=\"-4.318\" y2=\"0.3048\" layer=\"51\"/>\n<rectangle x1=\"4.318\" y1=\"-0.3048\" x2=\"4.6228\" y2=\"0.3048\" layer=\"51\"/>\n</package>\n<package name=\"0309/12\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0309, grid 12.5 mm</description>\n<wire x1=\"6.35\" y1=\"0\" x2=\"5.08\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.08\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-4.318\" y1=\"1.27\" x2=\"-4.064\" y2=\"1.524\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-4.318\" y1=\"-1.27\" x2=\"-4.064\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.064\" y1=\"-1.524\" x2=\"4.318\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.064\" y1=\"1.524\" x2=\"4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-4.318\" y1=\"-1.27\" x2=\"-4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.064\" y1=\"1.524\" x2=\"-3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.302\" y1=\"1.397\" x2=\"-3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.064\" y1=\"-1.524\" x2=\"-3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.302\" y1=\"-1.397\" x2=\"-3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"1.397\" x2=\"3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"1.397\" x2=\"-3.302\" y2=\"1.397\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"-1.397\" x2=\"3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"-1.397\" x2=\"-3.302\" y2=\"-1.397\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.064\" y1=\"1.524\" x2=\"3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.064\" y1=\"-1.524\" x2=\"3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.318\" y1=\"-1.27\" x2=\"4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-4.191\" y=\"1.905\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.6858\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"4.318\" y1=\"-0.3048\" x2=\"5.1816\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-5.1816\" y1=\"-0.3048\" x2=\"-4.318\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"0411/12\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0411, grid 12.5 mm</description>\n<wire x1=\"6.35\" y1=\"0\" x2=\"5.461\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.461\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<wire x1=\"5.08\" y1=\"-1.651\" x2=\"5.08\" y2=\"1.651\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.699\" y1=\"2.032\" x2=\"5.08\" y2=\"1.651\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-5.08\" y1=\"-1.651\" x2=\"-4.699\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.699\" y1=\"-2.032\" x2=\"5.08\" y2=\"-1.651\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-5.08\" y1=\"1.651\" x2=\"-4.699\" y2=\"2.032\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"4.699\" y1=\"2.032\" x2=\"4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.937\" y1=\"1.905\" x2=\"4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.699\" y1=\"-2.032\" x2=\"4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.937\" y1=\"-1.905\" x2=\"4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"1.905\" x2=\"-4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"1.905\" x2=\"3.937\" y2=\"1.905\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"-1.905\" x2=\"-4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"-1.905\" x2=\"3.937\" y2=\"-1.905\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.08\" y1=\"1.651\" x2=\"-5.08\" y2=\"-1.651\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.699\" y1=\"2.032\" x2=\"-4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.699\" y1=\"-2.032\" x2=\"-4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<text x=\"-5.08\" y=\"2.413\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.5814\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-5.3594\" y1=\"-0.381\" x2=\"-5.08\" y2=\"0.381\" layer=\"21\"/>\n<rectangle x1=\"5.08\" y1=\"-0.381\" x2=\"5.3594\" y2=\"0.381\" layer=\"21\"/>\n</package>\n<package name=\"0411/15\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0411, grid 15 mm</description>\n<wire x1=\"5.08\" y1=\"-1.651\" x2=\"5.08\" y2=\"1.651\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.699\" y1=\"2.032\" x2=\"5.08\" y2=\"1.651\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-5.08\" y1=\"-1.651\" x2=\"-4.699\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.699\" y1=\"-2.032\" x2=\"5.08\" y2=\"-1.651\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-5.08\" y1=\"1.651\" x2=\"-4.699\" y2=\"2.032\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"4.699\" y1=\"2.032\" x2=\"4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.937\" y1=\"1.905\" x2=\"4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.699\" y1=\"-2.032\" x2=\"4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.937\" y1=\"-1.905\" x2=\"4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"1.905\" x2=\"-4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"1.905\" x2=\"3.937\" y2=\"1.905\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"-1.905\" x2=\"-4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"-1.905\" x2=\"3.937\" y2=\"-1.905\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.08\" y1=\"1.651\" x2=\"-5.08\" y2=\"-1.651\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.699\" y1=\"2.032\" x2=\"-4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.699\" y1=\"-2.032\" x2=\"-4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-7.62\" y1=\"0\" x2=\"-6.35\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<wire x1=\"6.35\" y1=\"0\" x2=\"7.62\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<pad name=\"1\" x=\"-7.62\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"7.62\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<text x=\"-5.08\" y=\"2.413\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.5814\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"5.08\" y1=\"-0.381\" x2=\"6.477\" y2=\"0.381\" layer=\"21\"/>\n<rectangle x1=\"-6.477\" y1=\"-0.381\" x2=\"-5.08\" y2=\"0.381\" layer=\"21\"/>\n</package>\n<package name=\"0411V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0411, grid 3.81 mm</description>\n<wire x1=\"1.27\" y1=\"0\" x2=\"0.3048\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<wire x1=\"-1.5748\" y1=\"0\" x2=\"-2.54\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.016\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<text x=\"-0.508\" y=\"1.143\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-0.5334\" y=\"-2.413\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-1.4732\" y1=\"-0.381\" x2=\"0.2032\" y2=\"0.381\" layer=\"21\"/>\n</package>\n<package name=\"0414/15\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0414, grid 15 mm</description>\n<wire x1=\"7.62\" y1=\"0\" x2=\"6.604\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-7.62\" y1=\"0\" x2=\"-6.604\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-6.096\" y1=\"1.905\" x2=\"-5.842\" y2=\"2.159\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-6.096\" y1=\"-1.905\" x2=\"-5.842\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"5.842\" y1=\"-2.159\" x2=\"6.096\" y2=\"-1.905\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"5.842\" y1=\"2.159\" x2=\"6.096\" y2=\"1.905\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-6.096\" y1=\"-1.905\" x2=\"-6.096\" y2=\"1.905\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.842\" y1=\"2.159\" x2=\"-4.953\" y2=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.826\" y1=\"2.032\" x2=\"-4.953\" y2=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.842\" y1=\"-2.159\" x2=\"-4.953\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.826\" y1=\"-2.032\" x2=\"-4.953\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.826\" y1=\"2.032\" x2=\"4.953\" y2=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.826\" y1=\"2.032\" x2=\"-4.826\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.826\" y1=\"-2.032\" x2=\"4.953\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.826\" y1=\"-2.032\" x2=\"-4.826\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.842\" y1=\"2.159\" x2=\"4.953\" y2=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.842\" y1=\"-2.159\" x2=\"4.953\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.096\" y1=\"-1.905\" x2=\"6.096\" y2=\"1.905\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-6.096\" y=\"2.5654\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-4.318\" y=\"-0.5842\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"6.096\" y1=\"-0.4064\" x2=\"6.5024\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"-6.5024\" y1=\"-0.4064\" x2=\"-6.096\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"0414V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0414, grid 5 mm</description>\n<wire x1=\"2.54\" y1=\"0\" x2=\"1.397\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-1.397\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.143\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-0.381\" y=\"1.1684\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-0.381\" y=\"-2.3622\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-1.2954\" y1=\"-0.4064\" x2=\"1.2954\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"0617/17\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0617, grid 17.5 mm</description>\n<wire x1=\"-8.89\" y1=\"0\" x2=\"-8.636\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-7.874\" y1=\"3.048\" x2=\"-6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.731\" y1=\"2.794\" x2=\"-6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-7.874\" y1=\"-3.048\" x2=\"-6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.731\" y1=\"-2.794\" x2=\"-6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"2.794\" x2=\"6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"2.794\" x2=\"-6.731\" y2=\"2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"-2.794\" x2=\"6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"-2.794\" x2=\"-6.731\" y2=\"-2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"7.874\" y1=\"3.048\" x2=\"6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"7.874\" y1=\"-3.048\" x2=\"6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.255\" y1=\"-2.667\" x2=\"-8.255\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.255\" y1=\"1.016\" x2=\"-8.255\" y2=\"-1.016\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-8.255\" y1=\"1.016\" x2=\"-8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.255\" y1=\"-2.667\" x2=\"8.255\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.255\" y1=\"1.016\" x2=\"8.255\" y2=\"-1.016\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"8.255\" y1=\"1.016\" x2=\"8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.636\" y1=\"0\" x2=\"8.89\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-8.255\" y1=\"2.667\" x2=\"-7.874\" y2=\"3.048\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"7.874\" y1=\"3.048\" x2=\"8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-8.255\" y1=\"-2.667\" x2=\"-7.874\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"7.874\" y1=\"-3.048\" x2=\"8.255\" y2=\"-2.667\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<pad name=\"1\" x=\"-8.89\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"8.89\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-8.128\" y=\"3.4544\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-6.096\" y=\"-0.7112\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-8.5344\" y1=\"-0.4064\" x2=\"-8.2296\" y2=\"0.4064\" layer=\"51\"/>\n<rectangle x1=\"8.2296\" y1=\"-0.4064\" x2=\"8.5344\" y2=\"0.4064\" layer=\"51\"/>\n</package>\n<package name=\"0617/22\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0617, grid 22.5 mm</description>\n<wire x1=\"-10.287\" y1=\"0\" x2=\"-11.43\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-8.255\" y1=\"-2.667\" x2=\"-8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-7.874\" y1=\"3.048\" x2=\"-6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.731\" y1=\"2.794\" x2=\"-6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-7.874\" y1=\"-3.048\" x2=\"-6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.731\" y1=\"-2.794\" x2=\"-6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"2.794\" x2=\"6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"2.794\" x2=\"-6.731\" y2=\"2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"-2.794\" x2=\"6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"-2.794\" x2=\"-6.731\" y2=\"-2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"7.874\" y1=\"3.048\" x2=\"6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"7.874\" y1=\"-3.048\" x2=\"6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.255\" y1=\"-2.667\" x2=\"8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"11.43\" y1=\"0\" x2=\"10.287\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-8.255\" y1=\"2.667\" x2=\"-7.874\" y2=\"3.048\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-8.255\" y1=\"-2.667\" x2=\"-7.874\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"7.874\" y1=\"3.048\" x2=\"8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"7.874\" y1=\"-3.048\" x2=\"8.255\" y2=\"-2.667\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<pad name=\"1\" x=\"-11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-8.255\" y=\"3.4544\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-6.477\" y=\"-0.5842\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-10.1854\" y1=\"-0.4064\" x2=\"-8.255\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"8.255\" y1=\"-0.4064\" x2=\"10.1854\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"0617V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0617, grid 5 mm</description>\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-1.27\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"1.27\" y1=\"0\" x2=\"2.54\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.143\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"0.635\" y=\"1.4224\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"0.635\" y=\"-2.6162\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-1.3208\" y1=\"-0.4064\" x2=\"1.3208\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"0922/22\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0922, grid 22.5 mm</description>\n<wire x1=\"11.43\" y1=\"0\" x2=\"10.795\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-11.43\" y1=\"0\" x2=\"-10.795\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-10.16\" y1=\"-4.191\" x2=\"-10.16\" y2=\"4.191\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.779\" y1=\"4.572\" x2=\"-8.89\" y2=\"4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.636\" y1=\"4.318\" x2=\"-8.89\" y2=\"4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.779\" y1=\"-4.572\" x2=\"-8.89\" y2=\"-4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.636\" y1=\"-4.318\" x2=\"-8.89\" y2=\"-4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.636\" y1=\"4.318\" x2=\"8.89\" y2=\"4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.636\" y1=\"4.318\" x2=\"-8.636\" y2=\"4.318\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.636\" y1=\"-4.318\" x2=\"8.89\" y2=\"-4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.636\" y1=\"-4.318\" x2=\"-8.636\" y2=\"-4.318\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.779\" y1=\"4.572\" x2=\"8.89\" y2=\"4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.779\" y1=\"-4.572\" x2=\"8.89\" y2=\"-4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"10.16\" y1=\"-4.191\" x2=\"10.16\" y2=\"4.191\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-10.16\" y1=\"-4.191\" x2=\"-9.779\" y2=\"-4.572\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-10.16\" y1=\"4.191\" x2=\"-9.779\" y2=\"4.572\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"9.779\" y1=\"-4.572\" x2=\"10.16\" y2=\"-4.191\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"9.779\" y1=\"4.572\" x2=\"10.16\" y2=\"4.191\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<pad name=\"1\" x=\"-11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-10.16\" y=\"5.1054\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-6.477\" y=\"-0.5842\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-10.7188\" y1=\"-0.4064\" x2=\"-10.16\" y2=\"0.4064\" layer=\"51\"/>\n<rectangle x1=\"10.16\" y1=\"-0.4064\" x2=\"10.3124\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"-10.3124\" y1=\"-0.4064\" x2=\"-10.16\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"10.16\" y1=\"-0.4064\" x2=\"10.7188\" y2=\"0.4064\" layer=\"51\"/>\n</package>\n<package name=\"P0613V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0613, grid 5 mm</description>\n<wire x1=\"2.54\" y1=\"0\" x2=\"1.397\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-1.397\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"2.286\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.143\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-0.254\" y=\"1.143\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-0.254\" y=\"-2.413\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-1.2954\" y1=\"-0.4064\" x2=\"1.3208\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"P0613/15\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0613, grid 15 mm</description>\n<wire x1=\"7.62\" y1=\"0\" x2=\"6.985\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-7.62\" y1=\"0\" x2=\"-6.985\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-6.477\" y1=\"2.032\" x2=\"-6.223\" y2=\"2.286\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-6.477\" y1=\"-2.032\" x2=\"-6.223\" y2=\"-2.286\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"6.223\" y1=\"-2.286\" x2=\"6.477\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"6.223\" y1=\"2.286\" x2=\"6.477\" y2=\"2.032\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-6.223\" y1=\"2.286\" x2=\"-5.334\" y2=\"2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.207\" y1=\"2.159\" x2=\"-5.334\" y2=\"2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.223\" y1=\"-2.286\" x2=\"-5.334\" y2=\"-2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.207\" y1=\"-2.159\" x2=\"-5.334\" y2=\"-2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.207\" y1=\"2.159\" x2=\"5.334\" y2=\"2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.207\" y1=\"2.159\" x2=\"-5.207\" y2=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.207\" y1=\"-2.159\" x2=\"5.334\" y2=\"-2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.207\" y1=\"-2.159\" x2=\"-5.207\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.223\" y1=\"2.286\" x2=\"5.334\" y2=\"2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.223\" y1=\"-2.286\" x2=\"5.334\" y2=\"-2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.477\" y1=\"-0.635\" x2=\"6.477\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.477\" y1=\"-0.635\" x2=\"6.477\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"6.477\" y1=\"2.032\" x2=\"6.477\" y2=\"0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.477\" y1=\"-2.032\" x2=\"-6.477\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.477\" y1=\"0.635\" x2=\"-6.477\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-6.477\" y1=\"0.635\" x2=\"-6.477\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-6.477\" y=\"2.6924\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-4.318\" y=\"-0.7112\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-7.0358\" y1=\"-0.4064\" x2=\"-6.477\" y2=\"0.4064\" layer=\"51\"/>\n<rectangle x1=\"6.477\" y1=\"-0.4064\" x2=\"7.0358\" y2=\"0.4064\" layer=\"51\"/>\n</package>\n<package name=\"P0817/22\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0817, grid 22.5 mm</description>\n<wire x1=\"-10.414\" y1=\"0\" x2=\"-11.43\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-8.509\" y1=\"-3.429\" x2=\"-8.509\" y2=\"3.429\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.128\" y1=\"3.81\" x2=\"-7.239\" y2=\"3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.985\" y1=\"3.556\" x2=\"-7.239\" y2=\"3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.128\" y1=\"-3.81\" x2=\"-7.239\" y2=\"-3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.985\" y1=\"-3.556\" x2=\"-7.239\" y2=\"-3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.985\" y1=\"3.556\" x2=\"7.239\" y2=\"3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.985\" y1=\"3.556\" x2=\"-6.985\" y2=\"3.556\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.985\" y1=\"-3.556\" x2=\"7.239\" y2=\"-3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.985\" y1=\"-3.556\" x2=\"-6.985\" y2=\"-3.556\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.128\" y1=\"3.81\" x2=\"7.239\" y2=\"3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.128\" y1=\"-3.81\" x2=\"7.239\" y2=\"-3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.509\" y1=\"-3.429\" x2=\"8.509\" y2=\"3.429\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"11.43\" y1=\"0\" x2=\"10.414\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-8.509\" y1=\"3.429\" x2=\"-8.128\" y2=\"3.81\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-8.509\" y1=\"-3.429\" x2=\"-8.128\" y2=\"-3.81\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"8.128\" y1=\"3.81\" x2=\"8.509\" y2=\"3.429\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"8.128\" y1=\"-3.81\" x2=\"8.509\" y2=\"-3.429\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<pad name=\"1\" x=\"-11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-8.382\" y=\"4.2164\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-6.223\" y=\"-0.5842\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<text x=\"6.604\" y=\"-2.2606\" size=\"1.27\" layer=\"51\" ratio=\"10\" rot=\"R90\">0817</text>\n<rectangle x1=\"8.509\" y1=\"-0.4064\" x2=\"10.3124\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"-10.3124\" y1=\"-0.4064\" x2=\"-8.509\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"P0817V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0817, grid 6.35 mm</description>\n<wire x1=\"-3.81\" y1=\"0\" x2=\"-5.08\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"1.27\" y1=\"0\" x2=\"0\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<circle x=\"-5.08\" y=\"0\" radius=\"3.81\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-5.08\" y=\"0\" radius=\"1.27\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-5.08\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-1.016\" y=\"1.27\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-1.016\" y=\"-2.54\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<text x=\"-6.858\" y=\"2.032\" size=\"1.016\" layer=\"21\" ratio=\"12\">0817</text>\n<rectangle x1=\"-3.81\" y1=\"-0.4064\" x2=\"0\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"V234/12\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype V234, grid 12.5 mm</description>\n<wire x1=\"-4.953\" y1=\"1.524\" x2=\"-4.699\" y2=\"1.778\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"4.699\" y1=\"1.778\" x2=\"4.953\" y2=\"1.524\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"4.699\" y1=\"-1.778\" x2=\"4.953\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-4.953\" y1=\"-1.524\" x2=\"-4.699\" y2=\"-1.778\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-4.699\" y1=\"1.778\" x2=\"4.699\" y2=\"1.778\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.953\" y1=\"1.524\" x2=\"-4.953\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.699\" y1=\"-1.778\" x2=\"-4.699\" y2=\"-1.778\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.953\" y1=\"1.524\" x2=\"4.953\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.35\" y1=\"0\" x2=\"5.461\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.461\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-4.953\" y=\"2.159\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.81\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"4.953\" y1=\"-0.4064\" x2=\"5.4102\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"-5.4102\" y1=\"-0.4064\" x2=\"-4.953\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"V235/17\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype V235, grid 17.78 mm</description>\n<wire x1=\"-6.731\" y1=\"2.921\" x2=\"6.731\" y2=\"2.921\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-7.112\" y1=\"2.54\" x2=\"-7.112\" y2=\"-2.54\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"-2.921\" x2=\"-6.731\" y2=\"-2.921\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"7.112\" y1=\"2.54\" x2=\"7.112\" y2=\"-2.54\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.89\" y1=\"0\" x2=\"7.874\" y2=\"0\" width=\"1.016\" layer=\"51\"/>\n<wire x1=\"-7.874\" y1=\"0\" x2=\"-8.89\" y2=\"0\" width=\"1.016\" layer=\"51\"/>\n<wire x1=\"-7.112\" y1=\"-2.54\" x2=\"-6.731\" y2=\"-2.921\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"6.731\" y1=\"2.921\" x2=\"7.112\" y2=\"2.54\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"6.731\" y1=\"-2.921\" x2=\"7.112\" y2=\"-2.54\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-7.112\" y1=\"2.54\" x2=\"-6.731\" y2=\"2.921\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<pad name=\"1\" x=\"-8.89\" y=\"0\" drill=\"1.1938\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"8.89\" y=\"0\" drill=\"1.1938\" shape=\"octagon\"/>\n<text x=\"-6.858\" y=\"3.302\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-5.842\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"7.112\" y1=\"-0.508\" x2=\"7.747\" y2=\"0.508\" layer=\"21\"/>\n<rectangle x1=\"-7.747\" y1=\"-0.508\" x2=\"-7.112\" y2=\"0.508\" layer=\"21\"/>\n</package>\n<package name=\"V526-0\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype V526-0, grid 2.5 mm</description>\n<wire x1=\"-2.54\" y1=\"1.016\" x2=\"-2.286\" y2=\"1.27\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"2.286\" y1=\"1.27\" x2=\"2.54\" y2=\"1.016\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"2.286\" y1=\"-1.27\" x2=\"2.54\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-2.54\" y1=\"-1.016\" x2=\"-2.286\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.286\" y1=\"1.27\" x2=\"-2.286\" y2=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.54\" y1=\"-1.016\" x2=\"2.54\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.286\" y1=\"-1.27\" x2=\"2.286\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.54\" y1=\"1.016\" x2=\"-2.54\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-2.413\" y=\"1.651\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.413\" y=\"-2.794\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0102AX\">\n<description>&lt;b&gt;Mini MELF 0102 Axial&lt;/b&gt;</description>\n<circle x=\"0\" y=\"0\" radius=\"0.6\" width=\"0\" layer=\"51\"/>\n<circle x=\"0\" y=\"0\" radius=\"0.6\" width=\"0\" layer=\"52\"/>\n<smd name=\"1\" x=\"0\" y=\"0\" dx=\"1.9\" dy=\"1.9\" layer=\"1\" roundness=\"100\"/>\n<smd name=\"2\" x=\"0\" y=\"0\" dx=\"1.9\" dy=\"1.9\" layer=\"16\" roundness=\"100\"/>\n<text x=\"-1.27\" y=\"0.9525\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.2225\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<hole x=\"0\" y=\"0\" drill=\"1.3\"/>\n</package>\n<package name=\"0922V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0922, grid 7.5 mm</description>\n<wire x1=\"2.54\" y1=\"0\" x2=\"1.397\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-5.08\" y1=\"0\" x2=\"-3.81\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<circle x=\"-5.08\" y=\"0\" radius=\"4.572\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-5.08\" y=\"0\" radius=\"1.905\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-5.08\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-0.508\" y=\"1.6764\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-0.508\" y=\"-2.9972\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<text x=\"-6.858\" y=\"2.54\" size=\"1.016\" layer=\"21\" ratio=\"12\">0922</text>\n<rectangle x1=\"-3.81\" y1=\"-0.4064\" x2=\"1.3208\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"MINI_MELF-0102R\">\n<description>&lt;b&gt;CECC Size RC2211&lt;/b&gt; Reflow Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-1\" y1=\"-0.5\" x2=\"1\" y2=\"-0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1\" y1=\"-0.5\" x2=\"1\" y2=\"0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1\" y1=\"0.5\" x2=\"-1\" y2=\"0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-1\" y1=\"0.5\" x2=\"-1\" y2=\"-0.5\" width=\"0.2032\" layer=\"51\"/>\n<smd name=\"1\" x=\"-0.9\" y=\"0\" dx=\"0.5\" dy=\"1.3\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.9\" y=\"0\" dx=\"0.5\" dy=\"1.3\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"0.9525\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.2225\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0102W\">\n<description>&lt;b&gt;CECC Size RC2211&lt;/b&gt; Wave Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-1\" y1=\"-0.5\" x2=\"1\" y2=\"-0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1\" y1=\"-0.5\" x2=\"1\" y2=\"0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1\" y1=\"0.5\" x2=\"-1\" y2=\"0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-1\" y1=\"0.5\" x2=\"-1\" y2=\"-0.5\" width=\"0.2032\" layer=\"51\"/>\n<smd name=\"1\" x=\"-0.95\" y=\"0\" dx=\"0.6\" dy=\"1.3\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.95\" y=\"0\" dx=\"0.6\" dy=\"1.3\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"0.9525\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.2225\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0204R\">\n<description>&lt;b&gt;CECC Size RC3715&lt;/b&gt; Reflow Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-1.7\" y1=\"-0.6\" x2=\"1.7\" y2=\"-0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.7\" y1=\"-0.6\" x2=\"1.7\" y2=\"0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.7\" y1=\"0.6\" x2=\"-1.7\" y2=\"0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-1.7\" y1=\"0.6\" x2=\"-1.7\" y2=\"-0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"0.938\" y1=\"0.6\" x2=\"-0.938\" y2=\"0.6\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-0.938\" y1=\"-0.6\" x2=\"0.938\" y2=\"-0.6\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-1.5\" y=\"0\" dx=\"0.8\" dy=\"1.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.5\" y=\"0\" dx=\"0.8\" dy=\"1.6\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"0.9525\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.2225\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0204W\">\n<description>&lt;b&gt;CECC Size RC3715&lt;/b&gt; Wave Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-1.7\" y1=\"-0.6\" x2=\"1.7\" y2=\"-0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.7\" y1=\"-0.6\" x2=\"1.7\" y2=\"0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.7\" y1=\"0.6\" x2=\"-1.7\" y2=\"0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-1.7\" y1=\"0.6\" x2=\"-1.7\" y2=\"-0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"0.684\" y1=\"0.6\" x2=\"-0.684\" y2=\"0.6\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-0.684\" y1=\"-0.6\" x2=\"0.684\" y2=\"-0.6\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-1.5\" y=\"0\" dx=\"1.2\" dy=\"1.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.5\" y=\"0\" dx=\"1.2\" dy=\"1.6\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"0.9525\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.2225\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0207R\">\n<description>&lt;b&gt;CECC Size RC6123&lt;/b&gt; Reflow Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-2.8\" y1=\"-1\" x2=\"2.8\" y2=\"-1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"2.8\" y1=\"-1\" x2=\"2.8\" y2=\"1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"2.8\" y1=\"1\" x2=\"-2.8\" y2=\"1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-2.8\" y1=\"1\" x2=\"-2.8\" y2=\"-1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.2125\" y1=\"1\" x2=\"-1.2125\" y2=\"1\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-1.2125\" y1=\"-1\" x2=\"1.2125\" y2=\"-1\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-2.25\" y=\"0\" dx=\"1.6\" dy=\"2.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.25\" y=\"0\" dx=\"1.6\" dy=\"2.5\" layer=\"1\"/>\n<text x=\"-2.2225\" y=\"1.5875\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.2225\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0207W\">\n<description>&lt;b&gt;CECC Size RC6123&lt;/b&gt; Wave Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-2.8\" y1=\"-1\" x2=\"2.8\" y2=\"-1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"2.8\" y1=\"-1\" x2=\"2.8\" y2=\"1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"2.8\" y1=\"1\" x2=\"-2.8\" y2=\"1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-2.8\" y1=\"1\" x2=\"-2.8\" y2=\"-1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.149\" y1=\"1\" x2=\"-1.149\" y2=\"1\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-1.149\" y1=\"-1\" x2=\"1.149\" y2=\"-1\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-2.6\" y=\"0\" dx=\"2.4\" dy=\"2.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.6\" y=\"0\" dx=\"2.4\" dy=\"2.5\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.5875\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"RDH/15\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype RDH, grid 15 mm</description>\n<wire x1=\"-7.62\" y1=\"0\" x2=\"-6.858\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-6.096\" y1=\"3.048\" x2=\"-5.207\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.953\" y1=\"2.794\" x2=\"-5.207\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.096\" y1=\"-3.048\" x2=\"-5.207\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.953\" y1=\"-2.794\" x2=\"-5.207\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.953\" y1=\"2.794\" x2=\"5.207\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.953\" y1=\"2.794\" x2=\"-4.953\" y2=\"2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.953\" y1=\"-2.794\" x2=\"5.207\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.953\" y1=\"-2.794\" x2=\"-4.953\" y2=\"-2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.096\" y1=\"3.048\" x2=\"5.207\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.096\" y1=\"-3.048\" x2=\"5.207\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.477\" y1=\"-2.667\" x2=\"-6.477\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.477\" y1=\"1.016\" x2=\"-6.477\" y2=\"-1.016\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-6.477\" y1=\"1.016\" x2=\"-6.477\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.477\" y1=\"-2.667\" x2=\"6.477\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.477\" y1=\"1.016\" x2=\"6.477\" y2=\"-1.016\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"6.477\" y1=\"1.016\" x2=\"6.477\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.858\" y1=\"0\" x2=\"7.62\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-6.477\" y1=\"2.667\" x2=\"-6.096\" y2=\"3.048\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"6.096\" y1=\"3.048\" x2=\"6.477\" y2=\"2.667\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-6.477\" y1=\"-2.667\" x2=\"-6.096\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"6.096\" y1=\"-3.048\" x2=\"6.477\" y2=\"-2.667\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<pad name=\"1\" x=\"-7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-6.35\" y=\"3.4544\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-4.318\" y=\"-0.5842\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<text x=\"4.572\" y=\"-1.7272\" size=\"1.27\" layer=\"51\" ratio=\"10\" rot=\"R90\">RDH</text>\n<rectangle x1=\"-6.7564\" y1=\"-0.4064\" x2=\"-6.4516\" y2=\"0.4064\" layer=\"51\"/>\n<rectangle x1=\"6.4516\" y1=\"-0.4064\" x2=\"6.7564\" y2=\"0.4064\" layer=\"51\"/>\n</package>\n<package name=\"0204V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0204, grid 2.5 mm</description>\n<wire x1=\"-1.27\" y1=\"0\" x2=\"1.27\" y2=\"0\" width=\"0.508\" layer=\"51\"/>\n<wire x1=\"-0.127\" y1=\"0\" x2=\"0.127\" y2=\"0\" width=\"0.508\" layer=\"21\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"0.889\" width=\"0.1524\" layer=\"51\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"0.635\" width=\"0.0508\" layer=\"51\"/>\n<pad name=\"1\" x=\"-1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-2.1336\" y=\"1.1684\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.1336\" y=\"-2.3114\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n</package>\n<package name=\"0309V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0309, grid 2.5 mm</description>\n<wire x1=\"1.27\" y1=\"0\" x2=\"0.635\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-0.635\" y1=\"0\" x2=\"-1.27\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"0.762\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"0.254\" y=\"1.016\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"0.254\" y=\"-2.2098\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"0.254\" y1=\"-0.3048\" x2=\"0.5588\" y2=\"0.3048\" layer=\"51\"/>\n<rectangle x1=\"-0.635\" y1=\"-0.3048\" x2=\"-0.3302\" y2=\"0.3048\" layer=\"51\"/>\n<rectangle x1=\"-0.3302\" y1=\"-0.3048\" x2=\"0.254\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"R0201\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt; chip&lt;p&gt;\nSource: http://www.vishay.com/docs/20008/dcrcw.pdf</description>\n<smd name=\"1\" x=\"-0.255\" y=\"0\" dx=\"0.28\" dy=\"0.43\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.255\" y=\"0\" dx=\"0.28\" dy=\"0.43\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"0.635\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-1.905\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-0.3\" y1=\"-0.15\" x2=\"-0.15\" y2=\"0.15\" layer=\"51\"/>\n<rectangle x1=\"0.15\" y1=\"-0.15\" x2=\"0.3\" y2=\"0.15\" layer=\"51\"/>\n<rectangle x1=\"-0.15\" y1=\"-0.15\" x2=\"0.15\" y2=\"0.15\" layer=\"21\"/>\n</package>\n<package name=\"VMTA55\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RNC55&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-5.08\" y1=\"0\" x2=\"-4.26\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"3.3375\" y1=\"-1.45\" x2=\"3.3375\" y2=\"1.45\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.3375\" y1=\"1.45\" x2=\"-3.3625\" y2=\"1.45\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.3625\" y1=\"1.45\" x2=\"-3.3625\" y2=\"-1.45\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.3625\" y1=\"-1.45\" x2=\"3.3375\" y2=\"-1.45\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.235\" y1=\"0\" x2=\"5.08\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-5.08\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"5.08\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.175\" y=\"1.905\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-4.26\" y1=\"-0.3048\" x2=\"-3.3075\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"3.2825\" y1=\"-0.3048\" x2=\"4.235\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VMTB60\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RNC60&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.585\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"4.6875\" y1=\"-1.95\" x2=\"4.6875\" y2=\"1.95\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.6875\" y1=\"1.95\" x2=\"-4.6875\" y2=\"1.95\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.6875\" y1=\"1.95\" x2=\"-4.6875\" y2=\"-1.95\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.6875\" y1=\"-1.95\" x2=\"4.6875\" y2=\"-1.95\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.585\" y1=\"0\" x2=\"6.35\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-4.445\" y=\"2.54\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-4.445\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-5.585\" y1=\"-0.3048\" x2=\"-4.6325\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"4.6325\" y1=\"-0.3048\" x2=\"5.585\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VTA52\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RBR52&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-15.24\" y1=\"0\" x2=\"-13.97\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"12.6225\" y1=\"0.025\" x2=\"12.6225\" y2=\"4.725\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"12.6225\" y1=\"4.725\" x2=\"-12.6225\" y2=\"4.725\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-12.6225\" y1=\"4.725\" x2=\"-12.6225\" y2=\"0.025\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-12.6225\" y1=\"0.025\" x2=\"-12.6225\" y2=\"-4.65\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-12.6225\" y1=\"-4.65\" x2=\"12.6225\" y2=\"-4.65\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"12.6225\" y1=\"-4.65\" x2=\"12.6225\" y2=\"0.025\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"13.97\" y1=\"0\" x2=\"15.24\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-15.24\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"15.24\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.81\" y=\"5.08\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-13.97\" y1=\"-0.3048\" x2=\"-12.5675\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"12.5675\" y1=\"-0.3048\" x2=\"13.97\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VTA53\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RBR53&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-12.065\" y1=\"0\" x2=\"-10.795\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"9.8975\" y1=\"0\" x2=\"9.8975\" y2=\"4.7\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.8975\" y1=\"4.7\" x2=\"-9.8975\" y2=\"4.7\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"4.7\" x2=\"-9.8975\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"0\" x2=\"-9.8975\" y2=\"-4.675\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"-4.675\" x2=\"9.8975\" y2=\"-4.675\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.8975\" y1=\"-4.675\" x2=\"9.8975\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"10.795\" y1=\"0\" x2=\"12.065\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-12.065\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"12.065\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.81\" y=\"5.08\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-10.795\" y1=\"-0.3048\" x2=\"-9.8425\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"9.8425\" y1=\"-0.3048\" x2=\"10.795\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VTA54\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RBR54&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-12.065\" y1=\"0\" x2=\"-10.795\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"9.8975\" y1=\"0\" x2=\"9.8975\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.8975\" y1=\"3.3\" x2=\"-9.8975\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"3.3\" x2=\"-9.8975\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"0\" x2=\"-9.8975\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"-3.3\" x2=\"9.8975\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.8975\" y1=\"-3.3\" x2=\"9.8975\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"10.795\" y1=\"0\" x2=\"12.065\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-12.065\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"12.065\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.81\" y=\"3.81\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-10.795\" y1=\"-0.3048\" x2=\"-9.8425\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"9.8425\" y1=\"-0.3048\" x2=\"10.795\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VTA55\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RBR55&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-8.255\" y1=\"0\" x2=\"-6.985\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"6.405\" y1=\"0\" x2=\"6.405\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.405\" y1=\"3.3\" x2=\"-6.405\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.405\" y1=\"3.3\" x2=\"-6.405\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.405\" y1=\"0\" x2=\"-6.405\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.405\" y1=\"-3.3\" x2=\"6.405\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.405\" y1=\"-3.3\" x2=\"6.405\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.985\" y1=\"0\" x2=\"8.255\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-8.255\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"8.255\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.81\" y=\"3.81\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-6.985\" y1=\"-0.3048\" x2=\"-6.35\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"6.35\" y1=\"-0.3048\" x2=\"6.985\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VTA56\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RBR56&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.08\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"4.5\" y1=\"0\" x2=\"4.5\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.5\" y1=\"3.3\" x2=\"-4.5\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.5\" y1=\"3.3\" x2=\"-4.5\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.5\" y1=\"0\" x2=\"-4.5\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.5\" y1=\"-3.3\" x2=\"4.5\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.5\" y1=\"-3.3\" x2=\"4.5\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.08\" y1=\"0\" x2=\"6.35\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.81\" y=\"3.81\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-5.08\" y1=\"-0.3048\" x2=\"-4.445\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"4.445\" y1=\"-0.3048\" x2=\"5.08\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"R4527\">\n<description>&lt;b&gt;Package 4527&lt;/b&gt;&lt;p&gt;\nSource: http://www.vishay.com/docs/31059/wsrhigh.pdf</description>\n<wire x1=\"-5.675\" y1=\"-3.375\" x2=\"5.65\" y2=\"-3.375\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"5.65\" y1=\"-3.375\" x2=\"5.65\" y2=\"3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"5.65\" y1=\"3.375\" x2=\"-5.675\" y2=\"3.375\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-5.675\" y1=\"3.375\" x2=\"-5.675\" y2=\"-3.375\" width=\"0.2032\" layer=\"51\"/>\n<smd name=\"1\" x=\"-4.575\" y=\"0\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<smd name=\"2\" x=\"4.575\" y=\"0\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<text x=\"-5.715\" y=\"3.81\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-5.715\" y=\"-5.08\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC0001\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-3.075\" y1=\"1.8\" x2=\"-3.075\" y2=\"-1.8\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-3.075\" y1=\"-1.8\" x2=\"3.075\" y2=\"-1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.075\" y1=\"-1.8\" x2=\"3.075\" y2=\"1.8\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"3.075\" y1=\"1.8\" x2=\"-3.075\" y2=\"1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-3.075\" y1=\"1.8\" x2=\"-3.075\" y2=\"1.606\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-3.075\" y1=\"-1.606\" x2=\"-3.075\" y2=\"-1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.075\" y1=\"1.606\" x2=\"3.075\" y2=\"1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.075\" y1=\"-1.8\" x2=\"3.075\" y2=\"-1.606\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-2.675\" y=\"0\" dx=\"2.29\" dy=\"2.92\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.675\" y=\"0\" dx=\"2.29\" dy=\"2.92\" layer=\"1\"/>\n<text x=\"-2.544\" y=\"2.229\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.544\" y=\"-3.501\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC0002\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-5.55\" y1=\"3.375\" x2=\"-5.55\" y2=\"-3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-5.55\" y1=\"-3.375\" x2=\"5.55\" y2=\"-3.375\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"5.55\" y1=\"-3.375\" x2=\"5.55\" y2=\"3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"5.55\" y1=\"3.375\" x2=\"-5.55\" y2=\"3.375\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-4.575\" y=\"0.025\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<smd name=\"2\" x=\"4.575\" y=\"0\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<text x=\"-5.65\" y=\"3.9\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-5.65\" y=\"-5.15\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC01/2\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-2.45\" y1=\"1.475\" x2=\"-2.45\" y2=\"-1.475\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-2.45\" y1=\"-1.475\" x2=\"2.45\" y2=\"-1.475\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"2.45\" y1=\"-1.475\" x2=\"2.45\" y2=\"1.475\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"2.45\" y1=\"1.475\" x2=\"-2.45\" y2=\"1.475\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-2.45\" y1=\"1.475\" x2=\"-2.45\" y2=\"1.106\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-2.45\" y1=\"-1.106\" x2=\"-2.45\" y2=\"-1.475\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"2.45\" y1=\"1.106\" x2=\"2.45\" y2=\"1.475\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"2.45\" y1=\"-1.475\" x2=\"2.45\" y2=\"-1.106\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-2.1\" y=\"0\" dx=\"2.16\" dy=\"1.78\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.1\" y=\"0\" dx=\"2.16\" dy=\"1.78\" layer=\"1\"/>\n<text x=\"-2.544\" y=\"1.904\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.544\" y=\"-3.176\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC2515\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-3.075\" y1=\"1.8\" x2=\"-3.075\" y2=\"-1.8\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-3.075\" y1=\"-1.8\" x2=\"3.05\" y2=\"-1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.05\" y1=\"-1.8\" x2=\"3.05\" y2=\"1.8\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"3.05\" y1=\"1.8\" x2=\"-3.075\" y2=\"1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-3.075\" y1=\"1.8\" x2=\"-3.075\" y2=\"1.606\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-3.075\" y1=\"-1.606\" x2=\"-3.075\" y2=\"-1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.05\" y1=\"1.606\" x2=\"3.05\" y2=\"1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.05\" y1=\"-1.8\" x2=\"3.05\" y2=\"-1.606\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-2.675\" y=\"0\" dx=\"2.29\" dy=\"2.92\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.675\" y=\"0\" dx=\"2.29\" dy=\"2.92\" layer=\"1\"/>\n<text x=\"-3.2\" y=\"2.15\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-3.2\" y=\"-3.4\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC4527\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-5.675\" y1=\"3.4\" x2=\"-5.675\" y2=\"-3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-5.675\" y1=\"-3.375\" x2=\"5.675\" y2=\"-3.375\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"5.675\" y1=\"-3.375\" x2=\"5.675\" y2=\"3.4\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"5.675\" y1=\"3.4\" x2=\"-5.675\" y2=\"3.4\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-4.575\" y=\"0.025\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<smd name=\"2\" x=\"4.575\" y=\"0\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<text x=\"-5.775\" y=\"3.925\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-5.775\" y=\"-5.15\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC6927\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-8.65\" y1=\"3.375\" x2=\"-8.65\" y2=\"-3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-8.65\" y1=\"-3.375\" x2=\"8.65\" y2=\"-3.375\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"8.65\" y1=\"-3.375\" x2=\"8.65\" y2=\"3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"8.65\" y1=\"3.375\" x2=\"-8.65\" y2=\"3.375\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-7.95\" y=\"0.025\" dx=\"3.94\" dy=\"5.97\" layer=\"1\"/>\n<smd name=\"2\" x=\"7.95\" y=\"0\" dx=\"3.94\" dy=\"5.97\" layer=\"1\"/>\n<text x=\"-8.75\" y=\"3.9\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-8.75\" y=\"-5.15\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"R1218\">\n<description>&lt;b&gt;CRCW1218 Thick Film, Rectangular Chip Resistors&lt;/b&gt;&lt;p&gt;\nSource: http://www.vishay.com .. dcrcw.pdf</description>\n<wire x1=\"-0.913\" y1=\"-2.219\" x2=\"0.939\" y2=\"-2.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.913\" y1=\"2.219\" x2=\"-0.939\" y2=\"2.219\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-1.475\" y=\"0\" dx=\"1.05\" dy=\"4.9\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.475\" y=\"0\" dx=\"1.05\" dy=\"4.9\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"2.54\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.81\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-2.3\" x2=\"-0.9009\" y2=\"2.3\" layer=\"51\"/>\n<rectangle x1=\"0.9144\" y1=\"-2.3\" x2=\"1.6645\" y2=\"2.3\" layer=\"51\"/>\n</package>\n<package name=\"1812X7R\">\n<description>&lt;b&gt;Chip Monolithic Ceramic Capacitors&lt;/b&gt; Medium Voltage High Capacitance for General Use&lt;p&gt;\nSource: http://www.murata.com .. GRM43DR72E224KW01.pdf</description>\n<wire x1=\"-1.1\" y1=\"1.5\" x2=\"1.1\" y2=\"1.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.1\" y1=\"-1.5\" x2=\"-1.1\" y2=\"-1.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-0.6\" y1=\"1.5\" x2=\"0.6\" y2=\"1.5\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"0.6\" y1=\"-1.5\" x2=\"-0.6\" y2=\"-1.5\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-1.425\" y=\"0\" dx=\"0.8\" dy=\"3.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.425\" y=\"0\" dx=\"0.8\" dy=\"3.5\" layer=\"1\" rot=\"R180\"/>\n<text x=\"-1.9456\" y=\"1.9958\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.9456\" y=\"-3.7738\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.4\" y1=\"-1.6\" x2=\"-1.1\" y2=\"1.6\" layer=\"51\"/>\n<rectangle x1=\"1.1\" y1=\"-1.6\" x2=\"1.4\" y2=\"1.6\" layer=\"51\" rot=\"R180\"/>\n</package>\n</packages>\n<symbols>\n<symbol name=\"R-US\">\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-2.159\" y2=\"1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"-2.159\" y1=\"1.016\" x2=\"-1.524\" y2=\"-1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"-1.524\" y1=\"-1.016\" x2=\"-0.889\" y2=\"1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"-0.889\" y1=\"1.016\" x2=\"-0.254\" y2=\"-1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"-0.254\" y1=\"-1.016\" x2=\"0.381\" y2=\"1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"0.381\" y1=\"1.016\" x2=\"1.016\" y2=\"-1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"1.016\" y1=\"-1.016\" x2=\"1.651\" y2=\"1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"1.651\" y1=\"1.016\" x2=\"2.286\" y2=\"-1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"2.286\" y1=\"-1.016\" x2=\"2.54\" y2=\"0\" width=\"0.2032\" layer=\"94\"/>\n<text x=\"-3.81\" y=\"1.4986\" size=\"1.778\" layer=\"95\">&gt;NAME</text>\n<text x=\"-3.81\" y=\"-3.302\" size=\"1.778\" layer=\"96\">&gt;VALUE</text>\n<pin name=\"2\" x=\"5.08\" y=\"0\" visible=\"off\" length=\"short\" direction=\"pas\" swaplevel=\"1\" rot=\"R180\"/>\n<pin name=\"1\" x=\"-5.08\" y=\"0\" visible=\"off\" length=\"short\" direction=\"pas\" swaplevel=\"1\"/>\n</symbol>\n</symbols>\n<devicesets>\n<deviceset name=\"R-US_\" prefix=\"R\" uservalue=\"yes\">\n<description>&lt;B&gt;RESISTOR&lt;/B&gt;, American symbol</description>\n<gates>\n<gate name=\"G$1\" symbol=\"R-US\" x=\"0\" y=\"0\"/>\n</gates>\n<devices>\n<device name=\"R0402\" package=\"R0402\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R0603\" package=\"R0603\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R0805\" package=\"R0805\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R0805W\" package=\"R0805W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1005\" package=\"R1005\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1206\" package=\"R1206\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1206W\" package=\"R1206W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1210\" package=\"R1210\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1210W\" package=\"R1210W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2010\" package=\"R2010\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2010W\" package=\"R2010W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2012\" package=\"R2012\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2012W\" package=\"R2012W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2512\" package=\"R2512\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2512W\" package=\"R2512W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R3216\" package=\"R3216\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R3216W\" package=\"R3216W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R3225\" package=\"R3225\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R3225W\" package=\"R3225W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R5025\" package=\"R5025\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R5025W\" package=\"R5025W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R6332\" package=\"R6332\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R6332W\" package=\"R6332W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M0805\" package=\"M0805\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M1206\" package=\"M1206\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M1406\" package=\"M1406\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M2012\" package=\"M2012\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M2309\" package=\"M2309\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M3216\" package=\"M3216\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M3516\" package=\"M3516\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M5923\" package=\"M5923\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0204/5\" package=\"0204/5\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0204/7\" package=\"0204/7\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/10\" package=\"0207/10\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/12\" package=\"0207/12\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/15\" package=\"0207/15\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/2V\" package=\"0207/2V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/5V\" package=\"0207/5V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/7\" package=\"0207/7\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0309/10\" package=\"0309/10\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0309/12\" package=\"0309/12\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0411/12\" package=\"0411/12\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0411/15\" package=\"0411/15\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0411/3V\" package=\"0411V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0414/15\" package=\"0414/15\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0414/5V\" package=\"0414V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0617/17\" package=\"0617/17\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0617/22\" package=\"0617/22\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0617/5V\" package=\"0617V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0922/22\" package=\"0922/22\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0613/5V\" package=\"P0613V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0613/15\" package=\"P0613/15\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0817/22\" package=\"P0817/22\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0817/7V\" package=\"P0817V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"V234/12\" package=\"V234/12\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"V235/17\" package=\"V235/17\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"V526-0\" package=\"V526-0\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0102AX\" package=\"MINI_MELF-0102AX\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0922V\" package=\"0922V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0102R\" package=\"MINI_MELF-0102R\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0102W\" package=\"MINI_MELF-0102W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0204R\" package=\"MINI_MELF-0204R\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0204W\" package=\"MINI_MELF-0204W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0207R\" package=\"MINI_MELF-0207R\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0207W\" package=\"MINI_MELF-0207W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"RDH/15\" package=\"RDH/15\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0204/2V\" package=\"0204V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0309/V\" package=\"0309V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R0201\" package=\"R0201\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VMTA55\" package=\"VMTA55\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VMTB60\" package=\"VMTB60\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VTA52\" package=\"VTA52\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VTA53\" package=\"VTA53\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VTA54\" package=\"VTA54\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VTA55\" package=\"VTA55\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VTA56\" package=\"VTA56\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R4527\" package=\"R4527\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC0001\" package=\"WSC0001\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC0002\" package=\"WSC0002\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC01/2\" package=\"WSC01/2\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC2515\" package=\"WSC2515\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC4527\" package=\"WSC4527\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC6927\" package=\"WSC6927\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1218\" package=\"R1218\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"1812X7R\" package=\"1812X7R\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n</devices>\n</deviceset>\n</devicesets>\n</library>\n<library name=\"pinhead\">\n<description>&lt;b&gt;Pin Header Connectors&lt;/b&gt;&lt;p&gt;\n&lt;author&gt;Created by librarian@cadsoft.de&lt;/author&gt;</description>\n<packages>\n<package name=\"1X01\">\n<description>&lt;b&gt;PIN HEADER&lt;/b&gt;</description>\n<wire x1=\"-0.635\" y1=\"1.27\" x2=\"0.635\" y2=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"0.635\" y1=\"1.27\" x2=\"1.27\" y2=\"0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.27\" y1=\"0.635\" x2=\"1.27\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.27\" y1=\"-0.635\" x2=\"0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.27\" y1=\"0.635\" x2=\"-1.27\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-0.635\" y1=\"1.27\" x2=\"-1.27\" y2=\"0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.27\" y1=\"-0.635\" x2=\"-0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"0.635\" y1=\"-1.27\" x2=\"-0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"0\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-1.3462\" y=\"1.8288\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-0.254\" y1=\"-0.254\" x2=\"0.254\" y2=\"0.254\" layer=\"51\"/>\n</package>\n</packages>\n<symbols>\n<symbol name=\"PINHD1\">\n<wire x1=\"-6.35\" y1=\"-2.54\" x2=\"1.27\" y2=\"-2.54\" width=\"0.4064\" layer=\"94\"/>\n<wire x1=\"1.27\" y1=\"-2.54\" x2=\"1.27\" y2=\"2.54\" width=\"0.4064\" layer=\"94\"/>\n<wire x1=\"1.27\" y1=\"2.54\" x2=\"-6.35\" y2=\"2.54\" width=\"0.4064\" layer=\"94\"/>\n<wire x1=\"-6.35\" y1=\"2.54\" x2=\"-6.35\" y2=\"-2.54\" width=\"0.4064\" layer=\"94\"/>\n<text x=\"-6.35\" y=\"3.175\" size=\"1.778\" layer=\"95\">&gt;NAME</text>\n<text x=\"-6.35\" y=\"-5.08\" size=\"1.778\" layer=\"96\">&gt;VALUE</text>\n<pin name=\"1\" x=\"-2.54\" y=\"0\" visible=\"pad\" length=\"short\" direction=\"pas\" function=\"dot\"/>\n</symbol>\n</symbols>\n<devicesets>\n<deviceset name=\"PINHD-1X1\" prefix=\"JP\" uservalue=\"yes\">\n<description>&lt;b&gt;PIN HEADER&lt;/b&gt;</description>\n<gates>\n<gate name=\"G$1\" symbol=\"PINHD1\" x=\"0\" y=\"0\"/>\n</gates>\n<devices>\n<device name=\"\" package=\"1X01\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n</devices>\n</deviceset>\n</devicesets>\n</library>\n</libraries>\n<attributes>\n</attributes>\n<variantdefs>\n</variantdefs>\n<classes>\n<class number=\"0\" name=\"default\" width=\"0\" drill=\"0\">\n</class>\n</classes>\n<parts>\n<part name=\"FRAME2\" library=\"frames\" deviceset=\"A4L-LOC\" device=\"\"/>\n<part name=\"R1\" library=\"rcl\" deviceset=\"R-US_\" device=\"R0805\" value=\"1K\"/>\n<part name=\"IN\" library=\"pinhead\" deviceset=\"PINHD-1X1\" device=\"\"/>\n<part name=\"OUT\" library=\"pinhead\" deviceset=\"PINHD-1X1\" device=\"\"/>\n</parts>\n<sheets>\n<sheet>\n<plain>\n</plain>\n<instances>\n<instance part=\"FRAME2\" gate=\"G$1\" x=\"0\" y=\"0\"/>\n<instance part=\"R1\" gate=\"G$1\" x=\"127\" y=\"93.98\"/>\n<instance part=\"IN\" gate=\"G$1\" x=\"114.3\" y=\"93.98\"/>\n<instance part=\"OUT\" gate=\"G$1\" x=\"144.78\" y=\"93.98\"/>\n</instances>\n<busses>\n</busses>\n<nets>\n<net name=\"N$2\" class=\"0\">\n<segment>\n<pinref part=\"R1\" gate=\"G$1\" pin=\"2\"/>\n<pinref part=\"OUT\" gate=\"G$1\" pin=\"1\"/>\n<wire x1=\"132.08\" y1=\"93.98\" x2=\"142.24\" y2=\"93.98\" width=\"0.1524\" layer=\"91\"/>\n</segment>\n</net>\n<net name=\"N$1\" class=\"0\">\n<segment>\n<pinref part=\"IN\" gate=\"G$1\" pin=\"1\"/>\n<pinref part=\"R1\" gate=\"G$1\" pin=\"1\"/>\n<wire x1=\"111.76\" y1=\"93.98\" x2=\"121.92\" y2=\"93.98\" width=\"0.1524\" layer=\"91\"/>\n</segment>\n</net>\n</nets>\n</sheet>\n</sheets>\n</schematic>\n</drawing>\n</eagle>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Easybuild/bzip2-1.0.6-GCC-4.9.2.eb",
    "content": "# not really (there's an EB_bzip2 easyblock), but fine for use in unit tests\neasyblock = 'ConfigureMake'\n\nname = 'bzip2'\nversion = '1.0.6'\n\nhomepage = 'http://www.bzip.org/'\ndescription = \"\"\"bzip2 is a freely available, patent free, high-quality data compressor. It typically\ncompresses files to within 10% to 15% of the best available techniques (the PPM family of statistical\ncompressors), whilst being around twice as fast at compression and six times faster at decompression.\"\"\"\n\ntoolchain = {'name': 'GCC', 'version': '4.9.2'}\ntoolchainopts = {'pic': True}\n\nsources = [SOURCE_TAR_GZ]\nsource_urls = ['http://www.bzip.org/%(version)s']\n\nbuilddependencies = [('gzip', '1.6')]\n\nmoduleclass = 'tools'\n"
  },
  {
    "path": "src/test/resources/samples/langs/Edje Data Collection/mild.edc",
    "content": "// https://raw.githubusercontent.com/billiob/terminology/master/data/themes/mild.edc\n/* overlay to default to make theme easier on the eyes, less effects */\n\n#ifndef BG_COLOR\n#define BG_COLOR 48 48 48 255\n#endif\n\n#ifndef BG_COLOR_TRANSLUCENT\n#define BG_COLOR_TRANSLUCENT 48 48 48 200\n#endif\n\n#ifndef BELL_OVERLAY_COLOR\n#define BELL_OVERLAY_COLOR 220 220 220 16\n#endif\n\n\ncollections {\n   group { name: \"terminology/background\";\n\n#ifndef INHERIT_PROVIDE_OWN_COLORS\n       color_classes {\n#include \"default_colors.in.edc\"\n       }\n#endif\n\n      images {\n        image: \"bg_bevel.png\" COMP;\n        image: \"bg_shine.png\" COMP;\n        image: \"bg_glint.png\" COMP;\n        image: \"bg_led_base.png\" COMP;\n        image: \"bg_led.png\" COMP;\n        image: \"bg_led_strobe.png\" COMP;\n        image: \"pm_shadow.png\" COMP;\n        image: \"pm_overlay.png\" COMP;\n        image: \"pm_fill.png\" COMP;\n        image: \"tab_bg_l0.png\" COMP;\n        image: \"tab_bg_l1.png\" COMP;\n        image: \"tab_bg_r0.png\" COMP;\n        image: \"tab_bg_r1.png\" COMP;\n        image: \"tab_shad_l0.png\" COMP;\n        image: \"tab_shad_l1.png\" COMP;\n        image: \"tab_shad_r0.png\" COMP;\n        image: \"tab_shad_r1.png\" COMP;\n      }\n      sounds {\n         sample { name: \"bell\" LOSSY 64;\n            source: \"bell.wav\";\n         }\n      }\n\n      script {\n         public message(Msg_Type:type, id, ...) {\n            new r, g, b, a, v;\n\n            if ((type != MSG_INT) || (id != 1)) return;\n\n            v = (getarg(2) * 255) / 100;\n\n            custom_state(PART:\"base\", \"default\", 0.0);\n            get_state_val(PART:\"base\", STATE_COLOR, r, g, b, a);\n            set_state_val(PART:\"base\", STATE_COLOR, r, g, b, v);\n            set_state(PART:\"base\", \"custom\", 0.0);\n\n            custom_state(PART:\"fade\", \"default\", 0.0);\n            get_state_val(PART:\"fade\", STATE_COLOR, r, g, b, a);\n            set_state_val(PART:\"fade\", STATE_COLOR, r, g, b, v);\n            set_state(PART:\"fade\", \"custom\", 0.0);\n         }\n      }\n\n      parts {\n         ////////////////////////////////////////////////////////////////////\n         // background handling\n\n         part { name: \"focusclip\"; type: RECT;\n            clip_to: \"bellclip\";\n            description { state: \"default\" 0.0;\n            }\n            description { state: \"unfocused\" 0.0;\n               color: 200 200 200 255;\n            }\n         }\n         program {\n            signal: \"focus,in\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: ACCELERATE 0.1;\n            target: \"focusclip\";\n         }\n         program {\n            signal: \"focused,set\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"focusclip\";\n         }\n         program {\n            signal: \"focus,out\";\n            source: \"terminology\";\n            action: STATE_SET \"unfocused\" 0.0;\n            transition: ACCELERATE 0.1;\n            target: \"focusclip\";\n         }\n\n         part { name: \"baseclip\"; type: RECT;\n            clip_to: \"focusclip\";\n            description { state: \"default\" 0.0;\n            }\n            description { state: \"image\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"scale\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"edje\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"movie\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n         }\n         part { name: \"base\"; type: RECT;\n            mouse_events: 1;\n            clip_to: \"baseclip\";\n            description { state: \"default\" 0.0;\n               color: BG_COLOR;\n            }\n         }\n         part { name: \"fade\"; type: RECT;\n            description { state: \"default\" 0.0;\n            }\n         }\n         part { name: \"terminology.background\"; type: SWALLOW;\n            clip_to: \"fade\";\n            description { state: \"default\" 0.0;\n            }\n            description { state: \"image\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n            description { state: \"scale\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n            description { state: \"edje\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n            description { state: \"movie\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n         }\n         program { name: \"media_off\";\n            signal: \"media,off\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"terminology.background\";\n            target: \"baseclip\";\n         }\n         program { name: \"media_img\";\n            signal: \"media,image\";\n            source: \"terminology\";\n            action: STATE_SET \"image\" 0.0;\n            target: \"terminology.background\";\n            target: \"baseclip\";\n         }\n         program { name: \"media_scale\";\n            signal: \"media,scale\";\n            source: \"terminology\";\n            action: STATE_SET \"scale\" 0.0;\n            target: \"terminology.background\";\n            target: \"baseclip\";\n         }\n         program { name: \"media_edje\";\n            signal: \"media,edje\";\n            source: \"terminology\";\n            action: STATE_SET \"edje\" 0.0;\n            target: \"terminology.background\";\n            target: \"baseclip\";\n         }\n         program { name: \"media_mov\";\n            signal: \"media,movie\";\n            source: \"terminology\";\n            action: STATE_SET \"movie\" 0.0;\n            target: \"terminology.background\";\n            target: \"baseclip\";\n         }\n\n         part { name: \"bellclip\"; type: RECT;\n            description { state: \"default\" 0.0;\n            }\n            description { state: \"pulse1\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 200 200 200 255;\n            }\n            description { state: \"pulse2\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n         }\n         part { name: \"belloverlay\"; type: RECT;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"pulse1\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n            description { state: \"pulse2\" 0.0;\n               inherit: \"default\" 0.0;\n               color: BELL_OVERLAY_COLOR;\n               visible: 1;\n            }\n         }\n         program {\n            signal: \"bell,ring\"; source: \"terminology\";\n#if (EFL_VERSION_MAJOR > 1) || (EFL_VERSION_MINOR >= 9)\n            action: PLAY_SAMPLE \"bell\" 1.0 ALERT;\n#else\n            action: PLAY_SAMPLE \"bell\" 1.0;\n#endif\n         }\n         program {\n            signal: \"bell\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"bellclip\";\n            target: \"belloverlay\";\n            after: \"bellclip_bell.2\";\n         }\n         program {\n            name: \"bellclip_bell.2\";\n            action: STATE_SET \"pulse1\" 0.0;\n            transition: ACCELERATE 0.2;\n            target: \"bellclip\";\n            target: \"belloverlay\";\n            after: \"bellclip_bell.3\";\n         }\n         program {\n            name: \"bellclip_bell.3\";\n            action: STATE_SET \"pulse2\" 0.0;\n            transition: ACCELERATE 0.2;\n            target: \"bellclip\";\n            target: \"belloverlay\";\n            after: \"bellclip_bell.4\";\n         }\n         program {\n            name: \"bellclip_bell.4\";\n            action: STATE_SET \"default\" 0.0;\n            transition: ACCELERATE 0.2;\n            target: \"bellclip\";\n            target: \"belloverlay\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // actual text grid for chars, cursors, selectiond etc. goes here\n         part { name: \"terminology.content\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n            }\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // indicator of other tabs and control\n         part { name: \"tabcount_clip\"; type: RECT;\n            description { state: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"on\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"terminology.tabmissed.label\"; type: TEXT; mouse_events: 0;\n            effect: GLOW;\n            scale: 1;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.tabcount.label\";\n               rel2.to: \"terminology.tabcount.label\";\n               rel1.offset: -4 0;\n               rel2.relative: 0.0 1.0;\n               rel2.offset: -5 -1;\n               color: 255 153 51 64;\n               align: 1.0 0.5;\n               text { font: \"Sans\"; size: 8;\n                  align: 1.0 0.5;\n                  min: 1 1;\n                  ellipsis: 0;\n               }\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 64 255;\n            }\n         }\n         part { name: \"terminology.tabcount.label\"; type: TEXT; mouse_events: 0;\n            scale: 1;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               rel1.relative: -0.2 0.0;\n               rel2.relative: -0.2 1.0;\n               color: 255 255 255 64;\n               align: 1.0 0.5;\n               text { font: \"Sans\"; size: 8;\n                  align: 1.0 0.5;\n                  min: 1 1;\n                  ellipsis: 0;\n               }\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"tabcount_r0\"; type: RECT;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               rel1.relative: 0.05 0.05;\n               rel2.relative: 0.45 0.45;\n               color: 255 255 255 32;\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"tabcount_r1\"; type: RECT;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               rel1.relative: 0.55 0.05;\n               rel2.relative: 0.95 0.45;\n               color: 255 255 255 32;\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"tabcount_r2\"; type: RECT;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               rel1.relative: 0.05 0.55;\n               rel2.relative: 0.45 0.95;\n               color: 255 255 255 32;\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"tabcount_r3\"; type: RECT;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               rel1.relative: 0.55 0.55;\n               rel2.relative: 0.95 0.95;\n               color: 255 255 255 32;\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"terminology.tabcount.control\"; type: SWALLOW;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.relative: 1.0 0.0;\n               rel1.offset: -3 2;\n               rel1.to: \"viewregion\";\n               rel2.relative: 1.0 0.0;\n               rel2.offset: -3 2;\n               rel2.to: \"viewregion\";\n               align: 1.0 0.0;\n               min: 16 16;\n            }\n         }\n         part { name: \"tabcount_ev\"; type: RECT; repeat_events: 1;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               color: 0 0 0 0;\n            }\n         }\n\n         part { name: \"terminology.tabregion\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.content\";\n               rel2.to: \"viewregion\";\n               rel2.relative: 1.0 0.0;\n            }\n         }\n         part { name: \"viewregion\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.content\";\n               rel2.to: \"terminology.content\";\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.to_y: \"tabmiddle\";\n               rel1.relative: 0.0 1.0;\n            }\n         }\n\n         program {\n            signal: \"mouse,in\"; source: \"tabcount_ev\";\n            action: STATE_SET \"over\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"tabcount_r0\";\n            target: \"tabcount_r1\";\n            target: \"tabcount_r2\";\n            target: \"tabcount_r3\";\n            target: \"terminology.tabcount.label\";\n            target: \"terminology.tabmissed.label\";\n         }\n         program {\n            signal: \"mouse,out\"; source: \"tabcount_ev\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 2.0;\n            target: \"tabcount_r0\";\n            target: \"tabcount_r1\";\n            target: \"tabcount_r2\";\n            target: \"tabcount_r3\";\n            target: \"terminology.tabcount.label\";\n            target: \"terminology.tabmissed.label\";\n         }\n         program {\n            signal: \"mouse,clicked,1\"; source: \"tabcount_ev\";\n            action: SIGNAL_EMIT \"tabcount,go\" \"terminology\";\n         }\n         program {\n            signal: \"tabcount,off\"; source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"tabcount_clip\";\n         }\n         program {\n            signal: \"tabcount,on\"; source: \"terminology\";\n            action: STATE_SET \"on\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"tabcount_clip\";\n         }\n         program {\n            signal: \"tabmissed,off\"; source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"terminology.tabmissed.label\";\n         }\n         program {\n            signal: \"tabmissed,on\"; source: \"terminology\";\n            action: STATE_SET \"over\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.tabmissed.label\";\n            after: \"tabmissed2\";\n         }\n         program { name: \"tabmissed2\";\n            signal: \"tabmissed,on\"; source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 3.0;\n            target: \"terminology.tabmissed.label\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // miniview\n         part { name: \"terminology.miniview\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n               rel1.to_x: \"terminology.content\";\n               rel1.to_y: \"viewregion\";\n               rel2.to: \"terminology.content\";\n               //color: 255 255 255 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"on\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               //color: 255 255 255 255;\n            }\n         }\n\n         program {\n            signal: \"miniview,off\"; source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"terminology.miniview\";\n         }\n         program {\n            signal: \"miniview,on\"; source: \"terminology\";\n            action: STATE_SET \"on\" 0.0;\n            target: \"terminology.miniview\";\n         }\n\n         part { name: \"tab_bevel_bg0\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tableft\";\n               rel2.to_y: \"tableft\";\n               rel2.to_x: \"tab_bevel_bg1\";\n               rel2.relative: 0.0 1.0;\n               image.normal: \"tab_bg_l0.png\";\n               image.border: 2 0 4 4;\n               fill.smooth: 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"tab_bevel_bg1\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tabmiddle\";\n               rel1.offset: -4 0;\n               rel2.to: \"tabmiddle\";\n               align: 0.0 0.0;\n               max: 12 99999;\n               min: 12 0;\n               image.normal: \"tab_bg_l1.png\";\n               image.border: 0 0 4 4;\n               fill.smooth: 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n              inherit: \"default\" 0.0;\n              visible: 1;\n            }\n         }\n         part { name: \"tab_bevel_bg2\"; type: SPACER;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tab_bevel_bg1\";\n               rel1.relative: 1.0 0.0;\n               rel2.to: \"tab_bevel_bg3\";\n               rel2.relative: 0.0 1.0;\n               fixed: 1 1;\n            }\n         }\n         part { name: \"tab_bevel_bg3\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tabmiddle\";\n               rel2.to: \"tabmiddle\";\n               rel2.offset: 3 -1;\n               align: 1.0 0.0;\n               max: 12 99999;\n               min: 12 0;\n               image.normal: \"tab_bg_r1.png\";\n               image.border: 0 0 4 4;\n               fill.smooth: 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"tab_bevel_bg4\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.to_y: \"tabright\";\n               rel1.to_x: \"tab_bevel_bg3\";\n               rel1.relative: 1.0 0.0;\n               rel2.to: \"tabright\";\n               image.normal: \"tab_bg_r0.png\";\n               image.border: 0 2 4 4;\n               fill.smooth: 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n\n         part { name: \"terminology.tabl.content\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tableft\";\n               rel2.to: \"tableft\";\n               fixed: 1 1;\n            }\n         }\n         part { name: \"terminology.tabr.content\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tabright\";\n               rel2.to: \"tabright\";\n               fixed: 1 1;\n            }\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // a swallow to hold a finger size rect for min tab size\n         program {\n            signal: \"tabbar,on\"; source: \"terminology\";\n            action: STATE_SET \"tab\" 0.0;\n            target: \"viewregion\";\n            target: \"tableft\";\n            target: \"tabmiddle\";\n            target: \"tabright\";\n            target: \"tab_bevel_bg0\";\n            target: \"tab_bevel_bg1\";\n            target: \"tab_bevel_bg3\";\n            target: \"tab_bevel_bg4\";\n            target: \"tabtitle\";\n         }\n         program {\n            signal: \"tabbar,off\"; source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"viewregion\";\n            target: \"tableft\";\n            target: \"tabmiddle\";\n            target: \"tabright\";\n            target: \"tab_bevel_bg0\";\n            target: \"tab_bevel_bg1\";\n            target: \"tab_bevel_bg3\";\n            target: \"tab_bevel_bg4\";\n            target: \"tabtitle\";\n         }\n\n         part { name: \"terminology.tab\"; type: SWALLOW;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.relative: 1.0 0.0;\n               rel1.to_x: \"terminology.tabl\";\n               rel2.relative: 0.0 0.0;\n               rel2.to_x: \"terminology.tabr\";\n               align: 0.5 0.0;\n               visible: 0;\n               fixed: 1 1;\n            }\n         }\n         // some slot for dragable parts to stayt in along top edge of bg\n         part { name: \"tabdrag\"; type: SPACER;\n            description { state: \"default\" 0.0;\n               rel2.relative: 1.0 0.0;\n               fixed: 1 1;\n            }\n         }\n         // left boundary of the active tab (ragable 0.0 -> 1.0)\n         part { name: \"terminology.tabl\"; type: SPACER;\n            dragable.x: 1 1 0;\n            dragable.confine: \"tabdrag\";\n            description { state: \"default\" 0.0;\n               rel2.relative: 1.0 0.0;\n               max: 1 1;\n               fixed: 1 1;\n            }\n         }\n         // right boundary of the active tab (ragable 0.0 -> 1.0)\n         part { name: \"terminology.tabr\"; type: SPACER;\n            dragable.x: 1 1 0;\n            dragable.confine: \"tabdrag\";\n            description { state: \"default\" 0.0;\n               rel2.relative: 1.0 0.0;\n               max: 1 1;\n               fixed: 1 1;\n            }\n         }\n\n         part { name: \"terminology.tab.title\"; type: TEXT; mouse_events: 0;\n            scale: 1;\n            effect: SOFT_SHADOW BOTTOM;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               color: 255 255 255 255;\n               color3: 0 0 0 18;\n               text { font: \"Sans:style=Bold\"; size: 10;\n                  align: 0.5 0.0;\n                  min: 0 1;\n               }\n               align: 0.5 0.0;\n               rel1.to_x: \"tab_bevel_bg2\";\n               rel1.offset: 0 2;\n               rel2.to_x: \"tab_bevel_bg2\";\n               rel2.offset: -1 2;\n               rel2.relative: 1.0 0.0;\n               visible: 0;\n               fixed: 1 1;\n            }\n         }\n         part { name: \"tabtitle\"; type: TEXT; mouse_events: 0;\n            scale: 1;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               color: 255 255 255 255;\n               text { font: \"Sans:style=Bold\"; size: 10;\n                  align: 0.5 0.5;\n                  min: 0 1;\n                  text_source: \"terminology.tab.title\";\n               }\n               align: 0.5 0.5;\n               rel1.to_x: \"tab_bevel_bg2\";\n               rel1.to_y: \"tabmiddle\";\n               rel2.to_x: \"tab_bevel_bg2\";\n               rel2.to_y: \"tabmiddle\";\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"tablimit0\"; type: SPACER;\n            description { state: \"default\" 0.0;\n               rel1.to_y: \"terminology.tab\";\n               rel1.relative: 0.0 1.0;\n               rel2.to_y: \"terminology.tab.title\";\n               align: 0.0 0.0;\n               fixed: 1 1;\n            }\n         }\n\n         part { name: \"tableft\"; type: RECT;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel2.to_x: \"terminology.tab\";\n               rel2.to_y: \"tabmiddle\";\n               rel2.relative: 0.0 1.0;\n               color: 0 0 0 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"tabright\"; type: RECT;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tab\";\n               rel1.relative: 1.0 0.0;\n               rel2.to_y: \"tabmiddle\";\n               color: 0 0 0 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"tabmiddle\"; type: RECT;\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tab\";\n               rel2.to_x: \"terminology.tab\";\n               rel2.to_y: \"tablimit0\";\n               rel2.offset: -1 0;\n               color: 0 0 0 0;\n               align: 0.0 0.0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // a place terminology will place an entry box for internal commands\n         part { name: \"cmdclip\"; type: RECT;\n            description { state: \"default\" 0.0;\n               color: 255 255 255 255;\n               rel1.to: \"terminology.cmdbox\";\n               rel1.offset: -100 -100;\n               rel2.to: \"terminology.cmdbox\";\n               rel2.offset: 99 99;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n               visible: 1;\n            }\n         }\n         part { name: \"cmdback\"; type: RECT;\n            clip_to: \"cmdclip\";\n            description { state: \"default\" 0.0;\n               color: 255 255 255 255;\n               rel1.to: \"terminology.cmdbox\";\n               rel1.offset: -2 -2;\n               rel2.to: \"terminology.cmdbox\";\n               rel2.offset: 1 1;\n            }\n         }\n         part { name: \"terminology.cmdbox\"; type: SWALLOW;\n            clip_to: \"cmdclip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               min: 8 8;\n               rel1.relative: 0.0 1.0;\n               rel1.offset: 8 9;\n               rel2.offset: -9 9;\n               align: 0.5 0.0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.offset: 8 -9;\n               rel2.offset: -9 -9;\n               align: 0.5 1.0;\n            }\n         }\n         program { name: \"cmdshow0\";\n            signal: \"cmdbox,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.4;\n            target: \"cmdclip\";\n         }\n         program { name: \"cmdshow\";\n            signal: \"cmdbox,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: SPRING 0.4 0.5 4;\n            target: \"terminology.cmdbox\";\n         }\n         program { name: \"cmdhide\";\n            signal: \"cmdbox,hide\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: ACCELERATE 0.5;\n            target: \"terminology.cmdbox\";\n            target: \"cmdclip\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // visual bell - spinning red siren light\n         part { name: \"bell_base\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               visible: 0;\n               color: 255 255 255 0;\n               min: 32 32;\n               max: 32 32;\n               rel2.offset: -1 -1;\n               align: 1.0 1.0;\n               image.normal: \"bg_led_base.png\";\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"bell\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               visible: 0;\n               color: 255 255 255 0;\n               rel1.to: \"bell_base\";\n               rel2.to: \"bell_base\";\n               image.normal: \"bg_led.png\";\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"bell_strobe\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               visible: 0;\n               color: 255 255 255 0;\n               rel1.to: \"bell\";\n               rel2.to: \"bell\";\n               image.normal: \"bg_led_strobe.png\";\n               map {\n                  on: 1;\n                  smooth: 1;\n                  rotation.center: \"bell\";\n               }\n            }\n            description { state: \"spin\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               color: 255 255 255 255;\n               map.rotation.z: 36.0;\n            }\n            description { state: \"spin_done\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 0;\n               color: 255 255 255 0;\n               map.rotation.z: 684.0;\n            }\n         }\n         program { name: \"bell0\";\n            signal: \"bell\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"bell_base\";\n            target: \"bell\";\n            target: \"bell_strobe\";\n            after: \"bell\";\n         }\n         program { name: \"bell\";\n            action: STATE_SET \"visible\" 0.0;\n            target: \"bell_base\";\n            after: \"bell2\";\n         }\n         program { name: \"bell2\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.1;\n            target: \"bell\";\n            after: \"bell3\";\n         }\n         program { name: \"bell3\";\n            action: STATE_SET \"spin\" 0.0;\n            transition: LINEAR 0.1;\n            target: \"bell_strobe\";\n            after: \"bell4.0\";\n            after: \"bell4.1\";\n            after: \"bell4.2\";\n         }\n         program { name: \"bell4.0\";\n            action: STATE_SET \"default\" 0.0;\n            transition: ACCELERATE 1.2;\n            target: \"bell\";\n         }\n         program { name: \"bell4.1\";\n            action: STATE_SET \"default\" 0.0;\n            transition: ACCELERATE 1.6;\n            target: \"bell_base\";\n         }\n         program { name: \"bell4.2\";\n            action: STATE_SET \"spin_done\" 0.0;\n            transition: LINEAR 0.9;\n            target: \"bell_strobe\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // popup media over the terminal (until dismissed)\n         part { name: \"popmedia_clip\"; type: RECT;\n            mouse_events: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               visible: 0;\n               color: 255 255 255 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"popmedia_shadow\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1 {\n                  to: \"terminology.popmedia\";\n               }\n               rel2 {\n                  to: \"terminology.popmedia\";\n               }\n               image.normal: \"pm_shadow.png\";\n               image.border: 64 64 64 64;\n               image.border_scale_by: 0.1;\n               fill.smooth: 0;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.offset: -32 -32;\n               rel2.offset: 31 31;\n               image.border_scale_by: 1.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_fill\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.popmedia\";\n               rel2.to: \"terminology.popmedia\";\n               image.normal: \"pm_fill.png\";\n               fill {\n                  size.relative: 0.0 0.0;\n                  size.offset: 64 64;\n               }\n            }\n         }\n         part { name: \"terminology.popmedia\"; type: SWALLOW;\n            clip_to: \"popmedia_clip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.relative: 0.5 0.5;\n               rel2.relative: 0.5 0.5;\n               visible: 0;\n            }\n            description { state: \"image\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.relative: 0.1 0.1;\n               rel2.relative: 0.9 0.9;\n               visible: 1;\n            }\n            description { state: \"scale\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.relative: 0.1 0.1;\n               rel2.relative: 0.9 0.9;\n               visible: 1;\n            }\n            description { state: \"edje\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.relative: 0.1 0.1;\n               rel2.relative: 0.9 0.9;\n               visible: 1;\n            }\n            description { state: \"movie\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.relative: 0.1 0.1;\n               rel2.relative: 0.9 0.9;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_overlay\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.popmedia\";\n               rel2.to: \"terminology.popmedia\";\n               image.normal: \"pm_overlay.png\";\n               fill.smooth: 0;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_bevel\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.popmedia\";\n               rel2.to: \"terminology.popmedia\";\n               image.normal: \"bg_bevel.png\";\n               image.border: 3 3 5 3;\n               image.middle: 0;\n               fill.smooth: 0;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_glintclip\"; type: RECT;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_glint\";\n            mouse_events: 0;\n            clip_to: \"popmedia_glintclip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               min: 79 5;\n               max: 79 5;\n               rel1 {\n                  to: \"terminology.popmedia\";\n                  relative: 0.0 0.0;\n                  offset: 0 0;\n               }\n               rel2 {\n                  to: \"terminology.popmedia\";\n                  relative: 1.0 0.0;\n                  offset: -1 0;\n               }\n               image.normal: \"bg_glint.png\";\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_shine\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.popmedia\";\n               rel2.to: \"terminology.popmedia\";\n               image.normal: \"bg_shine.png\";\n               fill.smooth: 0;\n               align: 0.5 0.0;\n               aspect: (255/120) (255/120);\n               aspect_preference: HORIZONTAL;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_dismiss\"; type: RECT;\n            mouse_events: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               color: 0 0 0 0;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         program { name: \"popmedia_dismiss\";\n            signal: \"mouse,clicked,*\";\n            source: \"popmedia_dismiss\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"terminology.popmedia\";\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n            after: \"popmedia_dismiss2\";\n         }\n         program { name: \"popmedia_dismiss2\";\n            action: SIGNAL_EMIT \"popmedia,done\" \"terminology\";\n         }\n         program { name: \"popmedia_off\";\n            signal: \"popmedia,off\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.popmedia\";\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n            after: \"popmedia_dismiss2\";\n         }\n         program { name: \"popmedia_img\";\n            signal: \"popmedia,image\";\n            source: \"terminology\";\n            action: STATE_SET \"image\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.popmedia\";\n         }\n         program { name: \"popmedia_scale\";\n            signal: \"popmedia,scale\";\n            source: \"terminology\";\n            action: STATE_SET \"scale\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.popmedia\";\n         }\n         program { name: \"popmedia_edje\";\n            signal: \"popmedia,edje\";\n            source: \"terminology\";\n            action: STATE_SET \"edje\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.popmedia\";\n         }\n         program { name: \"popmedia_mov\";\n            signal: \"popmedia,movie\";\n            source: \"terminology\";\n            action: STATE_SET \"movie\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.popmedia\";\n         }\n         program { name: \"popmedia_img2\";\n            signal: \"popmedia,image\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n         }\n         program { name: \"popmedia_scale2\";\n            signal: \"popmedia,scale\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n         }\n         program { name: \"popmedia_edje2\";\n            signal: \"popmedia,edje\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n         }\n         program { name: \"popmedia_mov2\";\n            signal: \"popmedia,movie\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // overlayed options and controls\n         part { name: \"terminology.about\"; type: SWALLOW;\n            scale: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               min: 198 198;\n               max: 198 198;\n               align: 0.5 0.0;\n               visible: 0;\n               rel1.relative: 0.0 1.0;\n               rel2.relative: 1.0 1.0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               align: 0.5 0.5;\n               rel1.relative: 0.0 0.0;\n               rel2.relative: 1.0 1.0;\n            }\n         }\n         program { name: \"ab_show\";\n            signal: \"about,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: SPRING 1.2 2.0 6;\n            target: \"terminology.about\";\n         }\n         program { name: \"ab_hide\";\n            signal: \"about,hide\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.6;\n            target: \"terminology.about\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // swallow to hold invisile rect to click on to dismiss things\n         part { name: \"terminology.dismiss\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n            }\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // overlayed options and controls\n         part { name: \"terminology.optdetails\"; type: SWALLOW;\n            scale: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               min: 40 40;\n               align: 0.0 0.5;\n               visible: 0;\n               rel1 {\n                  relative: 1.0 0.02;\n                  offset: 2 2;\n               }\n               rel2 {\n                  relative: 1.0 0.98;\n                  offset: 2 -3;\n               }\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               align: 1.0 0.5;\n               rel1 {\n                  relative: 0.1 0.02;\n                  offset: 2 2;\n               }\n               rel2 {\n                  to_x: \"terminology.options\";\n                  relative: 0.0 0.98;\n                  offset: -3 -3;\n               }\n            }\n         }\n         program { name: \"opdt_show\";\n            signal: \"optdetails,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.4;\n            target: \"terminology.optdetails\";\n         }\n         program { name: \"opdt_hide\";\n            signal: \"optdetails,hide\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.optdetails\";\n            after: \"opdt_hide2\";\n         }\n         program { name: \"opdt_hide2\";\n            action: SIGNAL_EMIT \"optdetails,hide,done\" \"terminology\";\n         }\n         \n         part { name: \"terminology.options\"; type: SWALLOW;\n            scale: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               align: 0.0 0.5;\n               visible: 0;\n               rel1.relative: 1.0 0.02;\n               rel2 {\n                  relative: 1.0 0.98;\n                  offset: -3 -3;\n               }\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               align: 1.0 0.5;\n               rel1 {\n                  offset: -3 2;\n               }\n               rel2 {\n                  offset: -3 -3;\n               }\n            }\n         }\n         program { name: \"op_show\";\n            signal: \"options,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.4;\n            target: \"terminology.options\";\n         }\n         program { name: \"op_hide\";\n            signal: \"options,hide\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.6;\n            target: \"terminology.options\";\n         }\n         \n         part { name: \"terminology.controls\"; type: SWALLOW;\n            scale: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               min: 100 100;\n               align: 0.0 1.0;\n               visible: 0;\n               rel1.relative: 1.0 1.0;\n               rel2.relative: 1.0 1.0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               align: 1.0 1.0;\n               rel1.offset: -3 -3;\n               rel2.offset: -3 -3;\n               visible: 1;\n            }\n         }\n         program { name: \"ct_show\";\n            signal: \"controls,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.3;\n            target: \"terminology.controls\";\n         }\n         program { name: \"ct_hide\";\n            signal: \"controls,hide\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"terminology.controls\";\n         }\n      }\n   }\n\n   group { name: \"terminology/tabbar_back\";\n      images {\n         image: \"tab_other_l.png\" COMP;\n         image: \"tab_other_m.png\" COMP;\n         image: \"tab_other_r.png\" COMP;\n         image: \"tab_shad_l2.png\" COMP;\n         image: \"tab_shad_r2.png\" COMP;\n      }\n      parts {\n         part { name: \"tab_bevel_shad1\";\n            mouse_events: 0;\n            clip_to: \"clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"tab_base_top1\";\n               rel2.to: \"tab_base_top1\";\n               image.normal: \"tab_shad_l2.png\";\n               image.border: 0 0 10 10;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"tab_bevel_shad3\";\n            mouse_events: 0;\n            clip_to: \"clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"tab_base_top3\";\n               rel2.to: \"tab_base_top3\";\n               image.normal: \"tab_shad_r2.png\";\n               image.border: 0 0 10 10;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"tab_base_top1\";\n            mouse_events: 0;\n            clip_to: \"clip\";\n            description { state: \"default\" 0.0;\n               align: 0.0 0.0;\n               rel1.offset: -4 0;\n               max: 12 99999;\n               min: 12 0;\n               image.normal: \"tab_other_l.png\";\n               image.border: 0 0 4 4;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"tab_base_top2\";\n            mouse_events: 0;\n            clip_to: \"clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"tab_base_top1\";\n               rel1.relative: 1.0 0.0;\n               rel2.to: \"tab_base_top3\";\n               rel2.relative: 0.0 1.0;\n               image.normal: \"tab_other_m.png\";\n               image.border: 0 0 4 4;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"tab_base_top3\";\n            mouse_events: 0;\n            clip_to: \"clip\";\n            description { state: \"default\" 0.0;\n               align: 1.0 0.0;\n               rel2.offset: 3 -1;\n               max: 12 99999;\n               min: 12 0;\n               image.normal: \"tab_base_r1.png\";\n               image.normal: \"tab_other_r.png\";\n               image.border: 0 0 4 4;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"terminology.title\"; type: TEXT; mouse_events: 0;\n            scale: 1;\n            description { state: \"default\" 0.0;\n               text { font: \"Sans:style=Bold\"; size: 10;\n                  align: 0.5 0.5;\n                  min: 0 1;\n               }\n               align: 0.5 0.5;\n               color: 96 96 96 255;\n               rel1.to: \"tab_base_top2\";\n               rel2.to: \"tab_base_top2\";\n            }\n         }\n         part { name: \"clip\"; type: RECT;\n            description { state: \"default\" 0.0;\n               rel2.offset: -1 -2;\n            }\n         }\n         part { name: \"event\"; type: RECT;\n            description { state: \"default\" 0.0;\n               color: 0 0 0 0;\n            }\n         }\n         program {\n            signal: \"mouse,clicked,1\"; source: \"event\";\n            action: SIGNAL_EMIT \"tab,activate\" \"terminology\";\n         }\n      }\n   }\n\n   //////////////////////////////////////////////////////////////////////////////\n   //// the cursor to show where text is typed\n   group { name: \"terminology/cursor\";\n      images {\n        image: \"cr_key.png\" COMP;\n        image: \"cr_out.png\" COMP;\n      }\n      sounds {\n         sample { name: \"key-tap1\" LOSSY 64;\n            source: \"kbd-tap.wav\";\n         }\n         sample { name: \"key-tap2\" LOSSY 64;\n            source: \"kbd-tap2.wav\";\n         }\n         sample { name: \"key-tap3\" LOSSY 64;\n            source: \"kbd-tap3.wav\";\n         }\n         sample { name: \"key-tap4\" LOSSY 64;\n            source: \"kbd-tap4.wav\";\n         }\n         sample { name: \"key-tap5\" LOSSY 64;\n            source: \"kbd-tap5.wav\";\n         }\n      }\n      parts {\n         part { name: \"pulsclip\"; type: RECT;\n            description { state: \"default\" 0.0;\n            }\n            description { state: \"pulse\" 0.0;\n               color: 255 255 255 80;\n            }\n         }\n         part { name: \"key\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1 {\n                  to: \"outline\";\n                  offset: -5 -5;\n               }\n               rel2 {\n                  to: \"outline\";\n                  offset: 4 4;\n               }\n               image {\n                  normal: \"cr_key.png\";\n                  border: 4 4 4 4;\n               }\n               color: 255 255 255 0;\n            }\n            description { state: \"on\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n            description { state: \"out\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 160 100 255 0;\n            }\n         }\n         part { name: \"outline\";\n            mouse_events: 0;\n            clip_to: \"pulsclip\";\n            description { state: \"default\" 0.0;\n               image {\n                  normal: \"cr_out.png\";\n                  border: 3 3 3 3;\n               }\n               color: 255 255 255 64;\n            }\n            description { state: \"focused\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         programs {\n            program { name: \"focus_in_noblink\";\n               signal: \"focus,in,noblink\";\n               source: \"terminology\";\n               action: STATE_SET \"focused\" 0.0;\n               target: \"outline\";\n            }\n            program { name: \"focus_in\";\n               signal: \"focus,in\";\n               source: \"terminology\";\n               action: STATE_SET \"focused\" 0.0;\n               target: \"outline\";\n               after: \"pulse-prepare\";\n            }\n            program { name: \"pulse-prepare\";\n               action: STATE_SET \"default\" 0.0;\n               target: \"pulsclip\";\n               after: \"pulse\";\n            }\n            program { name: \"pulse\";\n               action: STATE_SET \"pulse\" 0.0;\n               transition: DECELERATE 0.5;\n               target: \"pulsclip\";\n               after: \"pulse2\";\n            }\n            program { name: \"pulse2\";\n               action: STATE_SET \"default\" 0.0;\n               in: 1.5 0.0;\n               transition: DECELERATE 0.5;\n               target: \"pulsclip\";\n               after: \"pulse\";\n            }\n\n            program { name: \"focus_out\";\n               signal: \"focus,out\";\n               source: \"terminology\";\n               action: ACTION_STOP;\n               target: \"focus_in\";\n               target: \"pulse\";\n               target: \"pulse2\";\n               after: \"focus_out2\";\n            }\n            program { name: \"focus_out2\";\n               action: STATE_SET \"default\" 0.0;\n               target: \"outline\";\n               target: \"pulsclip\";\n            }\n            program {\n               signal: \"key,down\"; source: \"terminology\";\n               script {\n#if (EFL_VERSION_MAJOR > 1) || (EFL_VERSION_MINOR >= 8)\n                  new buf[32];\n                  snprintf(buf, 31, \"key-down%i\", (rand() % 5) + 1);\n                  run_program(get_program_id(buf));\n#else\n                  run_program(PROGRAM:\"key-down4\"); // chosen by a fair dice roll\n                                                    // guaranteed to be random.\n                                                    // http://xkcd.com/221/\n#endif\n               }\n            }\n            program { name: \"key-down1\";\n               action: PLAY_SAMPLE \"key-tap1\" 1.0;\n            }\n            program { name: \"key-down2\";\n               action: PLAY_SAMPLE \"key-tap2\" 1.0;\n            }\n            program { name: \"key-down3\";\n               action: PLAY_SAMPLE \"key-tap3\" 1.0;\n            }\n            program { name: \"key-down4\";\n               action: PLAY_SAMPLE \"key-tap4\" 1.0;\n            }\n            program { name: \"key-down5\";\n               action: PLAY_SAMPLE \"key-tap5\" 1.0;\n            }\n            program { name: \"key\";\n               signal: \"key,down\";\n               source: \"terminology\";\n               action: STATE_SET \"default\" 0.0;\n               target: \"key\";\n               after: \"key2\";\n            }\n            program { name: \"key2\";\n               action: STATE_SET \"on\" 0.0;\n               target: \"key\";\n               after: \"key3\";\n            }\n            program { name: \"key3\";\n               action: STATE_SET \"out\" 0.0;\n               transition: DECELERATE 0.3;\n               target: \"key\";\n            }\n         }\n      }\n   }\n\n   //////////////////////////////////////////////////////////////////////////////\n      //// an object to contain the selection tool used for selecting tabs (with\n      //// a glow grid of terms\n      group { name: \"terminology/sel/base\";\n         images {\n           image: \"pm_fill.png\" COMP;\n         }\n         script {\n            public message(Msg_Type:type, id, ...) {\n               if ((type != MSG_INT) || (id != 1)) return;\n\n               if (getarg(2) < 100)\n                 set_state(PART:\"fill\", \"translucent\", 0.0);\n               else\n                 set_state(PART:\"fill\", \"default\", 0.0);\n         }\n      }\n         parts {\n            ////////////////////////////////////////////////////////////////////\n            // background and shadows\n            part { name: \"fill\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  image.normal: \"pm_fill.png\";\n                  fill {\n                     size.relative: 0.0 0.0;\n                     size.offset: 64 64;\n                  }\n               }\n               description { state: \"translucent\" 0.0;\n                  inherit: \"default\" 0.0;\n                  visible: 0;\n               }\n            }\n            program {\n               signal: \"translucent,on\"; source: \"terminology\";\n               action: STATE_SET \"translucent\" 0.0;\n               target: \"fill\";\n            }\n            program {\n               signal: \"translucent,off\"; source: \"terminology\";\n               action: STATE_SET \"default\" 0.0;\n               target: \"fill\";\n            }\n\n            ////////////////////////////////////////////////////////////////////\n            // content (where the grid of terms goes)\n            part { name: \"clip\"; type: RECT;\n               description { state: \"default\" 0.0;\n               }\n            }\n            part { name: \"terminology.content\"; type: SWALLOW;\n               clip_to: \"clip\";\n               description { state: \"default\" 0.0;\n               }\n            }\n         }\n      }\n\n      group { name: \"terminology/sel/item\";\n         images {\n           image: \"bg_bevel.png\" COMP;\n           image: \"pm_shadow.png\" COMP;\n           image: \"cr_glow.png\" COMP;\n           image: \"bg_led_base.png\" COMP;\n           image: \"bg_led.png\" COMP;\n           image: \"bg_led_strobe.png\" COMP;\n         }\n         parts {\n            ////////////////////////////////////////////////////////////////////\n            // base background and selection image\n            part { name: \"clip\"; type: RECT;\n               description { state: \"default\" 0.0;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  color: 128 128 128 255;\n               }\n               description { state: \"selected\" 0.0;\n                  inherit: \"default\" 0.0;\n                  color: 255 255 255 255;\n               }\n            }\n            part { name: \"shadow\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  fixed: 1 1;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  rel1.offset: -5 -5;\n                  rel2.offset: 4 4;\n                  image.normal: \"pm_shadow.png\";\n                  image.border: 64 64 64 64;\n                  image.border_scale_by: 0.1;\n                  color: 255 255 255 128;\n                  fill.smooth: 0;\n               }\n               description { state: \"selected\" 0.0;\n                  inherit: \"default\" 0.0;\n                  rel1.offset: -40 -40;\n                  rel2.offset: 39 39;\n                  image.border_scale_by: 1.0;\n                  color: 255 255 255 255;\n               }\n            }\n\n            part { name: \"glow\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  rel1.offset: -4 -4;\n                  rel2.offset: 3 3;\n                  image {\n                     normal: \"cr_glow.png\";\n                     border: 9 9 9 9;\n                  }\n                  color: 255 255 255 0;\n               }\n               description { state: \"selected\" 0.0;\n                  inherit: \"default\" 0.0;\n                  color: 255 255 255 255;\n               }\n            }\n\n            ////////////////////////////////////////////////////////////////////\n            // swallowed terminal content + bg inside it\n            part { name: \"base\"; type: RECT;\n               clip_to: \"clip\";\n               description { state: \"default\" 0.0;\n                  color: BG_COLOR;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n               }\n            }\n            part { name: \"terminology.content\"; type: SWALLOW;\n               clip_to: \"clip\";\n               description { state: \"default\" 0.0;\n                  rel1.relative: 0.1 0.1;\n                  rel2.relative: 0.9 0.9;\n               }\n               description { state: \"selected\" 0.0;\n                  inherit: \"default\" 0.0;\n                  rel1.relative: 0.0 0.0;\n                  rel2.relative: 1.0 1.0;\n               }\n            }\n            program {\n               signal: \"selected\"; source: \"terminology\";\n               action: STATE_SET \"selected\" 0.0;\n               transition: DECELERATE 0.2 CURRENT;\n               target: \"terminology.content\";\n               target: \"terminology.label\";\n               target: \"shadow\";\n               target: \"clip\";\n               target: \"glow\";\n            }\n            program {\n               signal: \"selected,start\"; source: \"terminology\";\n               action: STATE_SET \"selected\" 0.0;\n               target: \"terminology.content\";\n               target: \"terminology.label\";\n               target: \"shadow\";\n               target: \"clip\";\n               target: \"glow\";\n            }\n            program {\n               signal: \"unselected\"; source: \"terminology\";\n               action: STATE_SET \"default\" 0.0;\n               transition: DECELERATE 0.4 CURRENT;\n               target: \"terminology.content\";\n               target: \"terminology.label\";\n               target: \"shadow\";\n               target: \"clip\";\n               target: \"glow\";\n            }\n\n            ////////////////////////////////////////////////////////////////////\n            // fancy stuff over the top of the terminal for shading and labelling\n            part { name: \"bevel\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  fixed: 1 1;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  image.normal: \"bg_bevel.png\";\n                  image.border: 3 3 5 3;\n                  image.middle: 0;\n                  fill.smooth: 0;\n               }\n            }\n            part { name: \"terminology.label\"; type: TEXT; mouse_events: 0;\n               scale: 1;\n               description { state: \"default\" 0.0;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  color: 255 255 255 255;\n                  align: 0.5 1.0;\n                  text { font: \"Sans\"; size: 10;\n                     align: 0.5 1.0;\n                     min: 0 1;\n                  }\n               }\n               description { state: \"selected\" 0.0;\n                  inherit: \"default\" 0.0;\n                  color: 255 255 255 255;\n                  text { font:\"Sans:style=Bold\"; }\n               }\n            }\n\n            ////////////////////////////////////////////////////////////////////\n            // visual bell - spinning red siren light\n            part { name: \"bell_base\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  fixed: 1 1;\n                  visible: 0;\n                  color: 255 255 255 0;\n                  min: 32 32;\n                  max: 32 32;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  align: 1.0 1.0;\n                  image.normal: \"bg_led_base.png\";\n               }\n               description { state: \"visible\" 0.0;\n                  inherit: \"default\" 0.0;\n                  visible: 1;\n                  color: 255 255 255 255;\n               }\n            }\n            part { name: \"bell\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  fixed: 1 1;\n                  visible: 0;\n                  color: 255 255 255 0;\n                  rel1.to: \"bell_base\";\n                  rel2.to: \"bell_base\";\n                  image.normal: \"bg_led.png\";\n               }\n               description { state: \"visible\" 0.0;\n                  inherit: \"default\" 0.0;\n                  visible: 1;\n                  color: 255 255 255 255;\n               }\n            }\n            part { name: \"bell_strobe\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  fixed: 1 1;\n                  visible: 0;\n                  color: 255 255 255 0;\n                  rel1.to: \"bell\";\n                  rel2.to: \"bell\";\n                  image.normal: \"bg_led_strobe.png\";\n                  map {\n                     on: 1;\n                     smooth: 1;\n                     rotation.center: \"bell\";\n                  }\n               }\n               description { state: \"spin\" 0.0;\n                  inherit: \"default\" 0.0;\n                  visible: 1;\n                  color: 255 255 255 255;\n                  map.rotation.z: 36.0;\n               }\n               description { state: \"spin_done\" 0.0;\n                  inherit: \"spin\" 0.0;\n                  map.rotation.z: 720.0;\n               }\n               description { state: \"spin_done2\" 0.0;\n                  inherit: \"spin\" 0.0;\n                  map.rotation.z: 1440.0;\n               }\n            }\n            program {\n               signal: \"bell\"; source: \"terminology\";\n               action: STATE_SET \"default\" 0.0;\n               target: \"bell_base\";\n               target: \"bell\";\n               target: \"bell_strobe\";\n               after: \"bell\";\n            }\n            program { name: \"bell\";\n               action: STATE_SET \"visible\" 0.0;\n               target: \"bell_base\";\n               after: \"bell2\";\n            }\n            program { name: \"bell2\";\n               action: STATE_SET \"visible\" 0.0;\n               transition: DECELERATE 0.1;\n               target: \"bell\";\n               after: \"bell3\";\n            }\n            program { name: \"bell3\";\n               action: STATE_SET \"spin\" 0.0;\n               transition: LINEAR 0.1;\n               target: \"bell_strobe\";\n               after: \"bell4.2\";\n            }\n            program { name: \"bell4.2\";\n               action: STATE_SET \"spin_done\" 0.0;\n               transition: LINEAR 0.9;\n               target: \"bell_strobe\";\n               after: \"bell4.3\";\n            }\n            program { name: \"bell4.3\";\n               action: STATE_SET \"spin_done2\" 0.0;\n               transition: LINEAR 1.0;\n               target: \"bell_strobe\";\n               after: \"bell4.4\";\n            }\n            program { name: \"bell4.4\";\n               action: STATE_SET \"spin_done\" 0.0;\n               target: \"bell_strobe\";\n               after: \"bell4.3\";\n            }\n         }\n      }\n\n\n//////////////////////////////////////////////////////////////////////////////\n   //// an object overlayd on text that is a link\n   group { name: \"terminology/link\";\n      images {\n        image: \"lk_bottom.png\" COMP;\n      }\n      parts {\n         part { name: \"bottom\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               image.normal: \"lk_bottom.png\";\n               image.border: 9 9 0 0;\n               align: 0.5 1.0;\n               min: 20 8;\n               rel1.offset: -6 0;\n               rel1.relative: 0.0 1.0;\n               rel2.offset: 5 0;\n               color: 100 200 255 255;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"event\"; type: RECT;\n            mouse_events: 1;\n            repeat_events: 1;\n            description { state: \"default\" 0.0;\n               color: 0 0 0 0;\n            }\n         }\n      }\n   }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Eiffel/application.e",
    "content": "note\n\tdescription : \"nino application root class\"\n\tdate        : \"$Date$\"\n\trevision    : \"$Revision$\"\n\nclass\n\tAPPLICATION\n\ninherit\n\tARGUMENTS\n\n\tHTTP_SERVER_SHARED_CONFIGURATION\n\ncreate\n\tmake\n\nfeature {NONE} -- Initialization\n\n\tmake\n\t\t\t-- Run application.\n\t\tlocal\n\t\t\tl_server : HTTP_SERVER\n\t\t\tl_cfg: HTTP_SERVER_CONFIGURATION\n\t\t\tl_http_handler : HTTP_HANDLER\n\t\tdo\n\t\t\tcreate l_cfg.make\n\t\t\tl_cfg.http_server_port := 9_000\n\t\t\tl_cfg.document_root := default_document_root\n\t\t\tset_server_configuration (l_cfg)\n\t\t\tdebug (\"nino\")\n\t\t\t\tl_cfg.set_is_verbose (True)\n\t\t\tend\n\n\t\t\tcreate l_server.make (l_cfg)\n\t\t\tcreate {APPLICATION_CONNECTION_HANDLER} l_http_handler.make (l_server)\n\t\t\tl_server.setup (l_http_handler)\n\t\tend\n\nfeature -- Access\n\n\tdefault_document_root: STRING = \"webroot\"\n\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Eiffel/book_collection.e",
    "content": "class\n\tBOOK_COLLECTION\n\ncreate\n\tmake\n\nfeature {NONE} -- Initialization\n\n\tmake (a_name: STRING_32)\n\t\t\t-- Create a book collection with `a_name' as `name'.\n\t\tdo\n\t\t\tset_name (a_name)\n\t\t\tcreate book_index.make (10)\n\t\tensure\n\t\t\tname_set: name = a_name\n\t\tend\n\nfeature -- Access\n\n\tname: STRING_32\n\t\t\t-- Name.\n\n\tbooks: LIST [BOOK]\n\t\t\t-- collection of book.\n\t\tdo\n\t\t\tcreate {LINKED_LIST [BOOK]} Result.make\n\t\t\tacross\n\t\t\t\tbook_index as it\n\t\t\tloop\n\t\t\t\tResult.append (it.item)\n\t\t\tend\n\t\tend\n\n\tbooks_by_author (a_author: STRING_32): LIST [BOOK]\n\t\t\t-- Books wrote by `a_author' in this collection.\n\t\tdo\n\t\t\tif attached book_index [a_author] as l_result then\n\t\t\t\tResult := l_result\n\t\t\telse\n\t\t\t\tcreate {LINKED_LIST [BOOK]} Result.make\n\t\t\tend\n\t\tend\n\nfeature -- Change\n\n\tset_name (a_name: STRING_32)\n\t\t\t-- Set `name' with `a_name'.\n\t\tdo\n\t\t\tname := a_name\n\t\tensure\n\t\t\tname_set: name = a_name\n\t\tend\n\n\tadd_book (a_book: BOOK)\n\t\t\t-- Extend collection with `a_book'.\n\t\tlocal\n\t\t\tl: detachable LIST [BOOK]\n\t\tdo\n\t\t\tl := book_index.at (a_book.author.name)\n\t\t\tif l = Void then\n\t\t\t\tcreate {LINKED_LIST [BOOK]} l.make\n\t\t\t\tbook_index.put (l, a_book.author.name)\n\t\t\tend\n\t\t\tl.force (a_book)\n\t\tend\n\n\tadd_books (book_list: like books)\n\t\t\t-- Append collection with `book_list'.\n\t\tdo\n\t\t\tacross\n\t\t\t\tbook_list as it\n\t\t\tloop\n\t\t\t\tadd_book (it.item)\n\t\t\tend\n\t\tend\n\nfeature {NONE} -- Implementation\n\n\tbook_index: HASH_TABLE [LIST [BOOK], STRING_32]\n\t\t\t-- Association of author name and its books.\n\nend -- class BOOK_COLLECTION\n"
  },
  {
    "path": "src/test/resources/samples/langs/Eiffel/git_checkout_command.e",
    "content": "note\n\tdescription: \"Git checkout command.\"\n\tauthor: \"Olivier Ligot\"\n\nclass\n\tGIT_CHECKOUT_COMMAND\n\ninherit\n\tGIT_COMMAND\n\ncreate\n\tmake,\n\tmake_master\n\nfeature {NONE} -- Initialization\n\n\tmake (a_branch: STRING)\n\t\t\t-- Checkout the branch `a_branch'.\n\t\tdo\n\t\t\tinitialize\n\t\t\targuments.force_last (a_branch)\n\t\t\tbranch := a_branch\n\t\tensure\n\t\t\tbranch_set: branch = a_branch\n\t\tend\n\n\tmake_master\n\t\t\t-- Checkout the master branch.\n\t\tdo\n\t\t\tmake (\"master\")\n\t\tend\n\nfeature -- Access\n\n\tbranch: STRING\n\t\t\t-- Branch to checkout\n\n\tname: STRING = \"checkout\"\n\t\t\t-- Git subcommand name\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Elixir/hello_world.exs",
    "content": "defmodule HelloWorld do\n  @moduledoc \"this is the obligatory hello, world example\"\n\n  @doc \"says hello to the name provided, or 'world' by default\"\n  def hi(name \\\\ \"world\") do\n    \"hello, #{name}\"\n  end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Elixir/hello_world_test.exs",
    "content": "Code.load_file(\"hello_world.exs\")\n\nExUnit.start\n\ndefmodule HelloWorldTest do\n  use ExUnit.Case\n\n  test \"say hello\" do\n    assert HelloWorld.hi() == \"hello, world\"\n  end\n\n  test \"say hello to michael\" do\n    assert HelloWorld.hi(\"michael\") == \"hello, michael\"\n  end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Elm/Basic.elm",
    "content": "\nimport List (intercalate,intersperse)\nimport Website.Skeleton\nimport Website.ColorScheme\n\naddFolder folder lst =\n  let add (x,y) = (x, folder ++ y ++ \".elm\") in\n  let f (n,xs) = (n, map add xs) in\n  map f lst\n\nelements = addFolder \"Elements/\"\n  [ (\"Primitives\",\n        [ (\"Text\"  , \"HelloWorld\")\n        , (\"Images\", \"Image\")\n        , (\"Fitted Images\", \"FittedImage\")\n        , (\"Videos\", \"Video\")\n        , (\"Markdown\", \"Markdown\")\n        ])\n  , (\"Formatting\",\n        [ (\"Size\"    , \"Size\")\n        , (\"Opacity\" , \"Opacity\")\n        , (\"Text\"    , \"Text\")\n        , (\"Typeface\", \"Typeface\")\n        ])\n  , (\"Layout\",\n        [ (\"Simple Flow\", \"FlowDown1a\")\n        , (\"Flow Down\"  , \"FlowDown2\")\n        , (\"Layers\"     , \"Layers\")\n        , (\"Positioning\", \"Position\")\n        , (\"Spacers\"    , \"Spacer\")\n        ])\n  , (\"Collage\", [ (\"Lines\"     , \"Lines\")\n                , (\"Shapes\"    , \"Shapes\")\n                , (\"Sprites\"   , \"Sprite\")\n                , (\"Elements\"  , \"ToForm\")\n                , (\"Colors\"    , \"Color\")\n                , (\"Textures\"  , \"Texture\")\n                , (\"Transforms\", \"Transforms\")\n                ])\n  ]\n\n\nfunctional = addFolder \"Functional/\"\n  [ (\"Recursion\",\n        [ (\"Factorial\"  , \"Factorial\")\n        , (\"List Length\", \"Length\")\n        , (\"Zip\"        , \"Zip\")\n        , (\"Quick Sort\" , \"QuickSort\")\n        ])\n  , (\"Functions\",\n        [ (\"Anonymous Functions\", \"Anonymous\")\n        , (\"Application\"        , \"Application\")\n        , (\"Composition\"        , \"Composition\")\n        , (\"Infix Operators\"    , \"Infix\")\n        ])\n  , (\"Higher-Order\",\n        [ (\"Map\"    , \"Map\")\n        , (\"Fold\"   , \"Sum\")\n        , (\"Filter\" , \"Filter\")\n        , (\"ZipWith\", \"ZipWith\")\n        ])\n  , (\"Data Types\",\n        [ (\"Maybe\", \"Maybe\")\n        , (\"Boolean Expressions\", \"BooleanExpressions\")\n        , (\"Tree\", \"Tree\")\n        ])\n  ]\n\nreactive = addFolder \"Reactive/\"\n  [ (\"Mouse\",  [ (\"Position\", \"Position\")\n               , (\"Presses\"    , \"IsDown\")\n               , (\"Clicks\"    , \"CountClicks\")\n               , (\"Position+Image\", \"ResizeYogi\")\n               , (\"Position+Collage\"    , \"Transforms\")\n               -- , (\"Hover\"     , \"IsAbove\")\n               ])\n  ,(\"Keyboard\",[ (\"Keys Down\"  , \"KeysDown\")\n               , (\"Key Presses\", \"CharPressed\")\n               ])\n  , (\"Window\", [ (\"Size\", \"ResizePaint\")\n               , (\"Centering\", \"Centering\")\n               ])\n  , (\"Time\",   [ (\"Before and After\", \"Between\")\n               , (\"Every\"           , \"Every\")\n               , (\"Clock\"           , \"Clock\")\n               ])\n  , (\"Input\",  [ (\"Text Fields\", \"TextField\")\n               , (\"Passwords\"  , \"Password\")\n               , (\"Check Boxes\", \"CheckBox\")\n               , (\"String Drop Down\", \"StringDropDown\")\n               , (\"Drop Down\", \"DropDown\")\n               ])\n  , (\"Random\", [ (\"Randomize\", \"Randomize\") ])\n  , (\"HTTP\",   [ (\"Zip Codes\", \"ZipCodes\") ])\n  , (\"Filters\",[ (\"Sample\", \"SampleOn\")\n               , (\"Keep If\", \"KeepIf\")\n               , (\"Drop Repeats\", \"DropRepeats\")\n               ])\n  ]\n\nexample (name, loc) = Text.link (\"/edit/examples/\" ++ loc) (toText name)\ntoLinks (title, links) =\n  flow right [ width 130 (text $ toText \"   \" ++ italic (toText title))\n             , text (intercalate (bold . Text.color accent4 $ toText \"  &middot;  \") $ map example links)\n             ]\n\ninsertSpace lst = case lst of { x:xs -> x : spacer 1 5 : xs ; [] -> [] }\n\nsubsection w (name,info) =\n  flow down . insertSpace . intersperse (spacer 1 1) . map (width w) $\n    (text . bold $ toText name) : map toLinks info\n\nwords = [markdown|\n\n### Basic Examples\n\nEach example listed below focuses on a single function or concept.\nThese examples demonstrate all of the basic building blocks of Elm.\n\n|]\n\ncontent w =\n  words : map (subsection w) [ (\"Display\",elements), (\"React\",reactive), (\"Compute\",functional) ]\n\nexampleSets w = flow down . map (width w) . intersperse (plainText \" \") $ content w\n\nmain = lift (skeleton exampleSets) Window.width\n"
  },
  {
    "path": "src/test/resources/samples/langs/Elm/QuickSort.elm",
    "content": "\nmain = asText (qsort [3,9,1,8,5,4,7])\n\nqsort lst =\n  case lst of\n    x:xs -> qsort (filter ((>=)x) xs) ++ [x] ++ qsort (filter ((<)x) xs)\n    [] -> []\n\n\n{---------------------\n\nQuickSort works as follows:\n - Choose a pivot element which be placed in the \"middle\" of the sorted list.\n   In our case we are choosing the first element as the pivot.\n - Gather all of the elements less than the pivot (the first filter).\n   We know that these must come before our pivot element in the sorted list.\n   Note: ((>=)x) === (\\y -> (>=) x y) === (\\y -> x >= y)\n - Gather all of the elements greater than the pivot (the second filter).\n   We know that these must come after our pivot element in the sorted list.\n - Run `qsort` on the lesser elements, producing a sorted list that contains\n   only elements less than the pivot. Put these before the pivot.\n - Run `qsort` on the greater elements, producing a sorted list. Put these\n   after the pivot.\n\nNote that choosing a bad pivot can have bad effects. Take a sorted list with\nN elements. The pivot will always be the lowest member, meaning that it does\nnot divide the list very evenly. The list of lessers has 0 elements\nand the list of greaters has N-1 elemens. This means qsort will be called\nN times, each call looking through the entire list. This means, in the worst\ncase, QuickSort will make N^2 comparisons.\n\n----------------------}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Elm/Tree.elm",
    "content": "\n{-----------------------------------------------------------------\n\nOverview: A \"Tree\" represents a binary tree. A \"Node\" in a binary\ntree always has two children. A tree can also be \"Empty\". Below\nI have defined \"Tree\" and a number of useful functions.\n\nThis example also includes some challenge problems :)\n\n-----------------------------------------------------------------}\n\n\ndata Tree a = Node a (Tree a) (Tree a) | Empty\n\nempty = Empty\nsingleton v = Node v Empty Empty\n\ninsert x tree =\n  case tree of\n    Empty -> singleton x\n    Node y left right ->\n      if x == y then tree else\n      if x <  y then Node y (insert x left) right\n                else Node y left (insert x right)\n\nfromList xs = foldl insert empty xs\n\ndepth tree =\n  case tree of\n    Node v left right -> 1 + max (depth left) (depth right)\n    Empty -> 0\n\nmap f tree =\n  case tree of\n    Node v left right -> Node (f v) (map f left) (map f right)\n    Empty -> Empty\n\nt1 = fromList [1,2,3]\nt2 = fromList [2,1,3]\n\nmain = flow down [ display \"depth\" depth t1\n                 , display \"depth\" depth t2\n                 , display \"map ((+)1)\" (map ((+)1)) t2\n                 ]\n\ndisplay name f v =\n  text . monospace . toText $\n  concat [ show (f v), \" &lArr; \", name, \" \", show v ]\n\n{-----------------------------------------------------------------\n\nExercises:\n\n(1) Sum all of the elements of a tree.\n\n       sum :: Tree Number -> Number\n\n(2) Flatten a tree into a list.\n\n       flatten :: Tree a -> [a]\n\n(3) Check to see if an element is in a given tree.\n\n       isElement :: a -> Tree a -> Bool \n\n(4) Write a general fold function that acts on trees. The fold\n    function does not need to guarantee a particular order of\n    traversal.\n\n       fold :: (a -> b -> b) -> b -> Tree a -> b\n\n(5) Use \"fold\" to do exercises 1-3 in one line each. The best\n    readable versions I have come up have the following length\n    in characters including spaces and function name:\n      sum: 16\n      flatten: 21\n      isElement: 46\n    See if you can match or beat me! Don't forget about currying\n    and partial application!\n\n(6) Can \"fold\" be used to implement \"map\" or \"depth\"?\n\n(7) Try experimenting with different ways to traverse a\n    tree: pre-order, in-order, post-order, depth-first, etc.\n    More info at: http://en.wikipedia.org/wiki/Tree_traversal\n\n-----------------------------------------------------------------}\n\n\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/.emacs.desktop",
    "content": ";; -*- mode: emacs-lisp; coding: emacs-mule; -*-\n;; --------------------------------------------------------------------------\n;; Desktop File for Emacs\n;; --------------------------------------------------------------------------\n;; Created Sat Jan  3 12:46:35 2015\n;; Desktop file format version 206\n;; Emacs version 24.3.1\n\n;; Global section:\n(setq desktop-missing-file-warning nil)\n(setq tags-file-name nil)\n(setq tags-table-list nil)\n(setq search-ring nil)\n(setq regexp-search-ring nil)\n(setq register-alist nil)\n(setq file-name-history nil)\n\n;; Buffer section -- buffers listed in same order as in buffer list:\n(desktop-create-buffer 206\n  \"/home/foo/bar\"\n  \"bar\"\n  'fundamental-mode\n  nil\n  11572\n  '(11554 nil)\n  nil\n  nil\n  '((buffer-file-coding-system . undecided-unix)))\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/dude.el",
    "content": "(print \"Dude!\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/ess-julia.el",
    "content": ";; ess-julia.el --- ESS julia mode and inferior interaction\n;;\n;; Copyright (C) 2012 Vitalie Spinu.\n;;\n;; Filename: ess-julia.el\n;; Author: Vitalie Spinu (based on julia-mode.el from julia-lang project)\n;; Maintainer: Vitalie Spinu\n;; Created: 02-04-2012 (ESS 12.03)\n;; Keywords: ESS, julia\n;;\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;; This file is *NOT* part of GNU Emacs.\n;; This file is part of ESS\n;;\n;; This program is free software; you can redistribute it and/or\n;; modify it under the terms of the GNU General Public License as\n;; published by the Free Software Foundation; either version 3, any later version.\n;;\n;; This program is distributed in the hope that it will be useful, but WITHOUT\n;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n;; FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\n;; details.\n;;\n;; You should have received a copy of the GNU General Public License along with\n;; this program; see the file COPYING.  If not, write to the Free Software\n;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n;; USA.\n;;\n;;\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;;; Commentary:\n;;  customise inferior-julia-program-name to point to your julia-release-basic\n;;  and start the inferior with M-x julia.\n;;\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n(require 'compile); for compilation-* below\n\n;;; Code:\n\n(defvar julia-mode-hook nil)\n\n(add-to-list 'auto-mode-alist '(\"\\\\.jl\\\\'\" . julia-mode))\n\n(defvar julia-syntax-table\n  (let ((table (make-syntax-table)))\n    (modify-syntax-entry ?_ \"_\" table)   ; underscores in words\n    (modify-syntax-entry ?@ \"_\" table)\n    (modify-syntax-entry ?. \"_\" table)\n    (modify-syntax-entry ?# \"<\" table)   ; #  single-line comment start\n    (modify-syntax-entry ?\\n \">\" table)  ; \\n single-line comment end\n    (modify-syntax-entry ?\\{ \"(} \" table)\n    (modify-syntax-entry ?\\} \"){ \" table)\n    (modify-syntax-entry ?\\[ \"(] \" table)\n    (modify-syntax-entry ?\\] \")[ \" table)\n    (modify-syntax-entry ?\\( \"() \" table)\n    (modify-syntax-entry ?\\) \")( \" table)\n    ;(modify-syntax-entry ?\\\\ \".\" table)  ; \\ is an operator outside quotes\n    (modify-syntax-entry ?'  \".\" table)  ; character quote or transpose\n    (modify-syntax-entry ?\\\" \"\\\"\" table)\n    (modify-syntax-entry ?` \"\\\"\" table)\n    ;; (modify-syntax-entry ?\\\" \".\" table)\n    (modify-syntax-entry ?? \".\" table)\n    (modify-syntax-entry ?$ \".\" table)\n    (modify-syntax-entry ?& \".\" table)\n    (modify-syntax-entry ?* \".\" table)\n    (modify-syntax-entry ?+ \".\" table)\n    (modify-syntax-entry ?- \".\" table)\n    (modify-syntax-entry ?< \".\" table)\n    (modify-syntax-entry ?> \".\" table)\n    (modify-syntax-entry ?= \".\" table)\n    (modify-syntax-entry ?% \".\" table)\n    table)\n  \"Syntax table for julia-mode\")\n\n;; syntax table that holds within strings\n(defvar julia-mode-string-syntax-table\n  (let ((table (make-syntax-table)))\n    table)\n  \"Syntax table for julia-mode\")\n\n;; disable \" inside char quote\n(defvar julia-mode-char-syntax-table\n  (let ((table (make-syntax-table)))\n    (modify-syntax-entry ?\\\" \".\" table)\n    table)\n  \"Syntax table for julia-mode\")\n\n;; not used\n;; (defconst julia-string-regex\n;;   \"\\\"[^\\\"]*?\\\\(\\\\(\\\\\\\\\\\\\\\\\\\\)*\\\\\\\\\\\"[^\\\"]*?\\\\)*\\\"\")\n\n(defconst julia-char-regex\n  \"\\\\(\\\\s(\\\\|\\\\s-\\\\|-\\\\|[,%=<>\\\\+*/?&|$!\\\\^~\\\\\\\\;:]\\\\|^\\\\)\\\\('\\\\(\\\\([^']*?[^\\\\\\\\]\\\\)\\\\|\\\\(\\\\\\\\\\\\\\\\\\\\)\\\\)'\\\\)\")\n\n(defconst julia-unquote-regex\n  \"\\\\(\\\\s(\\\\|\\\\s-\\\\|-\\\\|[,%=<>\\\\+*/?&|!\\\\^~\\\\\\\\;:]\\\\|^\\\\)\\\\($[a-zA-Z0-9_]+\\\\)\")\n\n(defconst julia-forloop-in-regex\n  \"for +[^ \t\r]+ +.*\\\\(in\\\\)\\\\(\\\\s-\\\\|$\\\\)+\")\n\n(defconst ess-subset-regexp\n      \"\\\\[[0-9:, ]*\\\\]\" )\n\n(defconst julia-font-lock-defaults\n  (list '(\"\\\\<\\\\(\\\\|Uint\\\\(8\\\\|16\\\\|32\\\\|64\\\\)\\\\|Int\\\\(8\\\\|16\\\\|32\\\\|64\\\\)\\\\|Integer\\\\|Float\\\\|Float32\\\\|Float64\\\\|Complex128\\\\|Complex64\\\\|ComplexNum\\\\|Bool\\\\|Char\\\\|Number\\\\|Scalar\\\\|Real\\\\|Int\\\\|Uint\\\\|Array\\\\|DArray\\\\|AbstractArray\\\\|AbstractVector\\\\|AbstractMatrix\\\\|SubArray\\\\|StridedArray\\\\|StridedVector\\\\|StridedMatrix\\\\|VecOrMat\\\\|StridedVecOrMat\\\\|Range\\\\|Range1\\\\|SparseMatrixCSC\\\\|Tuple\\\\|NTuple\\\\|Buffer\\\\|Size\\\\|Index\\\\|Symbol\\\\|Function\\\\|Vector\\\\|Matrix\\\\|Union\\\\|Type\\\\|Any\\\\|Complex\\\\|None\\\\|String\\\\|Ptr\\\\|Void\\\\|Exception\\\\|PtrInt\\\\|Long\\\\|Ulong\\\\)\\\\>\" .\n      font-lock-type-face)\n    (cons\n     (concat \"\\\\<\\\\(\"\n         (mapconcat\n          'identity\n          '(\"if\" \"else\" \"elseif\" \"while\" \"for\" \"begin\" \"end\" \"quote\"\n            \"try\" \"catch\" \"return\" \"local\" \"abstract\" \"function\" \"macro\" \"ccall\"\n\t    \"typealias\" \"break\" \"continue\" \"type\" \"global\" \"@\\\\w+\"\n\t    \"module\" \"import\" \"export\" \"const\" \"let\" \"bitstype\" \"using\")\n          \"\\\\|\") \"\\\\)\\\\>\")\n     'font-lock-keyword-face)\n    '(\"\\\\<\\\\(true\\\\|false\\\\|C_NULL\\\\|Inf\\\\|NaN\\\\|Inf32\\\\|NaN32\\\\)\\\\>\" . font-lock-constant-face)\n    (list julia-unquote-regex 2 'font-lock-constant-face)\n    (list julia-char-regex 2 'font-lock-string-face)\n    (list julia-forloop-in-regex 1 'font-lock-keyword-face)\n    ;; (cons ess-subset-regexp 'font-lock-constant-face)\n    (cons \"\\\\(\\\\sw+\\\\) ?(\" '(1 font-lock-function-name-face keep))\n    ;(list julia-string-regex 0 'font-lock-string-face)\n))\n\n(defconst julia-block-start-keywords\n  (list \"if\" \"while\" \"for\" \"begin\" \"try\" \"function\" \"type\" \"let\" \"macro\"\n\t\"quote\"))\n\n(defconst julia-block-other-keywords\n  (list \"else\" \"elseif\"))\n\n(defconst julia-block-end-keywords\n  (list \"end\" \"else\" \"elseif\" \"catch\"))\n\n(defun ess-inside-brackets-p (&optional pos)\n  (save-excursion\n    (let* ((pos (or pos (point)))\n\t   (beg (re-search-backward \"\\\\[\" (max (point-min) (- pos 1000)) t))\n\t   (end (re-search-forward \"\\\\]\" (min (point-max) (+ pos 1000)) t)))\n    (and beg end (> pos beg) (> end pos)))))\n\n(defun julia-at-keyword (kw-list)\n  ; not a keyword if used as a field name, X.word, or quoted, :word\n  (and (or (= (point) 1)\n\t   (and (not (equal (char-before (point)) ?.))\n\t\t(not (equal (char-before (point)) ?:))))\n       (not (ess-inside-string-or-comment-p (point)))\n       (not (ess-inside-brackets-p (point)))\n       (member (current-word) kw-list)))\n\n; get the position of the last open block\n(defun julia-last-open-block-pos (min)\n  (let ((count 0))\n    (while (not (or (> count 0) (<= (point) min)))\n      (backward-word 1)\n      (setq count\n\t    (cond ((julia-at-keyword julia-block-start-keywords)\n\t\t   (+ count 1))\n\t\t  ((and (equal (current-word) \"end\")\n\t\t\t(not (ess-inside-comment-p)) (not (ess-inside-brackets-p)))\n\t\t   (- count 1))\n\t\t  (t count))))\n    (if (> count 0)\n\t(point)\n      nil)))\n\n; get indent for last open block\n(defun julia-last-open-block (min)\n  (let ((pos (julia-last-open-block-pos min)))\n    (and pos\n\t (progn\n\t   (goto-char pos)\n\t   (+ julia-basic-offset (current-indentation))))))\n\n; return indent implied by a special form opening on the previous line, if any\n(defun julia-form-indent ()\n  (forward-line -1)\n  (end-of-line)\n  (backward-sexp)\n  (if (julia-at-keyword julia-block-other-keywords)\n      (+ julia-basic-offset (current-indentation))\n    (if (char-equal (char-after (point)) ?\\()\n        (progn\n          (backward-word 1)\n          (let ((cur (current-indentation)))\n            (if (julia-at-keyword julia-block-start-keywords)\n                (+ julia-basic-offset cur)\n              nil)))\n      nil)))\n\n(defun julia-paren-indent ()\n  (let* ((p (parse-partial-sexp (save-excursion\n\t\t\t\t  ;; only indent by paren if the last open\n\t\t\t\t  ;; paren is closer than the last open\n\t\t\t\t  ;; block\n\t\t\t\t  (or (julia-last-open-block-pos (point-min))\n\t\t\t\t      (point-min)))\n\t\t\t\t(progn (beginning-of-line)\n\t\t\t\t       (point))))\n         (pos (cadr p)))\n    (if (or (= 0 (car p)) (null pos))\n        nil\n      (progn (goto-char pos) (+ 1 (current-column))))))\n\t\t\t\t\t;  (forward-line -1)\n\t\t\t\t\t;  (end-of-line)\n\t\t\t\t\t;  (let ((pos (condition-case nil\n\t\t\t\t\t;                (scan-lists (point) -1 1)\n\t\t\t\t\t;              (error nil))))\n\t\t\t\t\t;   (if pos\n\t\t\t\t\t;       (progn (goto-char pos) (+ 1 (current-column)))\n\t\t\t\t\t;     nil)))\n\n(defun julia-indent-line ()\n  \"Indent current line of julia code\"\n  (interactive)\n\t\t\t\t\t;  (save-excursion\n    (end-of-line)\n    (indent-line-to\n     (or (and (ess-inside-string-p (point-at-bol)) 0)\n\t (save-excursion (ignore-errors (julia-form-indent)))\n         (save-excursion (ignore-errors (julia-paren-indent)))\n         ;; previous line ends in =\n\t (save-excursion\n           (beginning-of-line)\n           (skip-chars-backward \" \\t\\n\")\n           (when (eql (char-before) ?=)\n             (+ julia-basic-offset (current-indentation))))\n         (save-excursion\n           (let ((endtok (progn\n                           (beginning-of-line)\n                           (forward-to-indentation 0)\n                           (julia-at-keyword julia-block-end-keywords))))\n             (ignore-errors (+ (julia-last-open-block (point-min))\n                               (if endtok (- julia-basic-offset) 0)))))\n\t ;; take same indentation as previous line\n\t (save-excursion (forward-line -1)\n\t\t\t (current-indentation))\n         0))\n    (when (julia-at-keyword julia-block-end-keywords)\n      (forward-word 1)))\n\n(defvar julia-editing-alist\n  '((paragraph-start\t\t  . (concat \"\\\\s-*$\\\\|\" page-delimiter))\n    (paragraph-separate\t\t  . (concat \"\\\\s-*$\\\\|\" page-delimiter))\n    (paragraph-ignore-fill-prefix . t)\n    (require-final-newline\t  . t)\n    (comment-start\t\t  . \"# \")\n    (comment-add                  . 1)\n    (comment-start-skip\t\t  . \"#+\\\\s-*\")\n    (comment-column\t\t  . 40)\n    ;;(comment-indent-function\t. 'S-comment-indent)\n    ;;(ess-comment-indent\t    . 'S-comment-indent)\n    ;; (ess-indent-line\t\t\t    . 'S-indent-line)\n    ;;(ess-calculate-indent\t      . 'ess-calculate-indent)\n    (ess-indent-line-function\t  . 'julia-indent-line)\n    (indent-line-function\t  . 'julia-indent-line)\n    (parse-sexp-ignore-comments\t  . t)\n    (ess-style\t\t  \t  . ess-default-style) ;; ignored\n    (ess-local-process-name\t  . nil)\n    ;;(ess-keep-dump-files\t    . 'ask)\n    (ess-mode-syntax-table\t  . julia-syntax-table)\n    ;; For Changelog add, require ' ' before <- : \"attr<-\" is a function name :\n    ;; (add-log-current-defun-header-regexp . \"^\\\\(.+\\\\)\\\\s-+=[ \\t\\n]*function\")\n    (add-log-current-defun-header-regexp . \"^.*function[ \\t]*\\\\([^ \\t(]*\\\\)[ \\t]*(\")\n    (font-lock-defaults\t\t  . '(julia-font-lock-defaults\n                                      nil nil ((?\\_ . \"w\"))))\n    )\n  \"General options for julia source files.\")\n\n(autoload 'inferior-ess \"ess-inf\" \"Run an ESS process.\")\n(autoload 'ess-mode     \"ess-mode\" \"Edit an ESS process.\")\n\n(defun julia-send-string-function (process string visibly)\n  (let ((file (concat temporary-file-directory \"julia_eval_region.jl\")))\n    (with-temp-file file\n      (insert string))\n    (process-send-string process (format ess-load-command file))))\n\n(defun julia-get-help-topics (&optional proc)\n  (ess-get-words-from-vector \"ESS.all_help_topics()\\n\"))\n    ;; (ess-command com)))\n\n(defvar julia-help-command \"help(\\\"%s\\\")\\n\")\n\n(defvar ess-julia-error-regexp-alist '(julia-in julia-at)\n  \"List of symbols which are looked up in `compilation-error-regexp-alist-alist'.\")\n\n(add-to-list 'compilation-error-regexp-alist-alist\n             '(julia-in  \"^\\\\s-*in [^ \\t\\n]* \\\\(at \\\\(.*\\\\):\\\\([0-9]+\\\\)\\\\)\" 2 3 nil 2 1))\n(add-to-list 'compilation-error-regexp-alist-alist\n             '(julia-at \"^\\\\S-+\\\\s-+\\\\(at \\\\(.*\\\\):\\\\([0-9]+\\\\)\\\\)\"  2 3 nil 2 1))\n\n(defvar julia-customize-alist\n  '((comint-use-prompt-regexp\t\t. t)\n    (ess-eldoc-function           . 'ess-julia-eldoc-function)\n    (inferior-ess-primary-prompt\t. \"a> \") ;; from julia>\n    (inferior-ess-secondary-prompt\t. nil)\n    (inferior-ess-prompt\t\t. \"\\\\w*> \")\n    (ess-local-customize-alist\t\t. 'julia-customize-alist)\n    (inferior-ess-program\t\t. inferior-julia-program-name)\n    (inferior-ess-font-lock-defaults\t. julia-font-lock-defaults)\n    (ess-get-help-topics-function\t. 'julia-get-help-topics)\n    (ess-help-web-search-command        . \"http://docs.julialang.org/en/latest/search/?q=%s\")\n    (ess-load-command   \t\t. \"include(\\\"%s\\\")\\n\")\n    (ess-funargs-command                . \"ESS.fun_args(\\\"%s\\\")\\n\")\n    (ess-dump-error-re\t\t\t. \"in \\\\w* at \\\\(.*\\\\):[0-9]+\")\n    (ess-error-regexp\t\t\t. \"\\\\(^\\\\s-*at\\\\s-*\\\\(?3:.*\\\\):\\\\(?2:[0-9]+\\\\)\\\\)\")\n    (ess-error-regexp-alist\t\t. ess-julia-error-regexp-alist)\n    (ess-send-string-function\t\t. nil);'julia-send-string-function)\n    (ess-imenu-generic-expression       . julia-imenu-generic-expression)\n    ;; (inferior-ess-objects-command\t. inferior-R-objects-command)\n    ;; (inferior-ess-search-list-command\t. \"search()\\n\")\n    (inferior-ess-help-command\t\t. julia-help-command)\n    ;; (inferior-ess-help-command\t. \"help(\\\"%s\\\")\\n\")\n    (ess-language\t\t\t. \"julia\")\n    (ess-dialect\t\t\t. \"julia\")\n    (ess-suffix\t\t\t\t. \"jl\")\n    (ess-dump-filename-template\t\t. (ess-replace-regexp-in-string\n\t\t\t\t\t   \"S$\" ess-suffix ; in the one from custom:\n\t\t\t\t\t   ess-dump-filename-template-proto))\n    (ess-mode-syntax-table\t\t. julia-syntax-table)\n    (ess-mode-editing-alist\t        . julia-editing-alist)\n    (ess-change-sp-regexp\t\t. nil );ess-R-change-sp-regexp)\n    (ess-help-sec-regex\t\t\t. ess-help-R-sec-regex)\n    (ess-help-sec-keys-alist\t\t. ess-help-R-sec-keys-alist)\n    (ess-loop-timeout\t\t\t. ess-S-loop-timeout);fixme: dialect spec.\n    (ess-cmd-delay\t\t\t. ess-R-cmd-delay)\n    (ess-function-pattern\t\t. ess-R-function-pattern)\n    (ess-object-name-db-file\t\t. \"ess-r-namedb.el\" )\n    (ess-smart-operators\t\t. ess-R-smart-operators)\n    (inferior-ess-help-filetype        . nil)\n    (inferior-ess-exit-command\t\t. \"exit()\\n\")\n    ;;harmful for shell-mode's C-a: -- but \"necessary\" for ESS-help?\n    (inferior-ess-start-file\t\t. nil) ;; \"~/.ess-R\"\n    (inferior-ess-start-args\t\t. \"\")\n    (inferior-ess-language-start\t. nil)\n    (ess-STERM\t\t. \"iESS\")\n    (ess-editor\t. R-editor)\n    (ess-pager\t\t. R-pager)\n    )\n  \"Variables to customize for Julia -- set up later than emacs initialization.\")\n\n\n(defvar ess-julia-versions '(\"julia\")\n  \"List of partial strings for versions of Julia to access within ESS.\nEach string specifies the start of a filename.  If a filename\nbeginning with one of these strings is found on `exec-path', a M-x\ncommand for that version of Julia is made available.  \")\n\n(defcustom inferior-julia-args \"\"\n  \"String of arguments (see 'julia --help') used when starting julia.\"\n;; These arguments are currently not passed to other versions of julia that have\n;; been created using the variable `ess-r-versions'.\"\n  :group 'ess-julia\n  :type 'string)\n\n;;;###autoload\n(defun julia-mode  (&optional proc-name)\n  \"Major mode for editing julia source.  See `ess-mode' for more help.\"\n  (interactive \"P\")\n  ;; (setq ess-customize-alist julia-customize-alist)\n  (ess-mode julia-customize-alist proc-name)\n  ;; for emacs < 24\n  ;; (add-hook 'comint-dynamic-complete-functions 'ess-complete-object-name nil 'local)\n  ;; for emacs >= 24\n  ;; (remove-hook 'completion-at-point-functions 'ess-filename-completion 'local) ;; should be first\n  ;; (add-hook 'completion-at-point-functions 'ess-object-completion nil 'local)\n  ;; (add-hook 'completion-at-point-functions 'ess-filename-completion nil 'local)\n  (if (fboundp 'ess-add-toolbar) (ess-add-toolbar))\n  (set (make-local-variable 'end-of-defun-function) 'ess-end-of-function)\n  ;; (local-set-key  \"\\t\" 'julia-indent-line) ;; temp workaround\n  ;; (set (make-local-variable 'indent-line-function) 'julia-indent-line)\n  (set (make-local-variable 'julia-basic-offset) 4)\n  (setq imenu-generic-expression julia-imenu-generic-expression)\n  (imenu-add-to-menubar \"Imenu-jl\")\n  (run-hooks 'julia-mode-hook))\n\n\n(defvar ess-julia-post-run-hook nil\n  \"Functions run in process buffer after the initialization of\n  julia process.\")\n\n;;;###autoload\n(defun julia (&optional start-args)\n  \"Call 'julia',\nOptional prefix (C-u) allows to set command line arguments, such as\n--load=<file>.  This should be OS agnostic.\nIf you have certain command line arguments that should always be passed\nto julia, put them in the variable `inferior-julia-args'.\"\n  (interactive \"P\")\n  ;; get settings, notably inferior-julia-program-name :\n  (if (null inferior-julia-program-name)\n      (error \"'inferior-julia-program-name' does not point to 'julia-release-basic' executable\")\n    (setq ess-customize-alist julia-customize-alist)\n    (ess-write-to-dribble-buffer   ;; for debugging only\n     (format\n      \"\\n(julia): ess-dialect=%s, buf=%s, start-arg=%s\\n current-prefix-arg=%s\\n\"\n      ess-dialect (current-buffer) start-args current-prefix-arg))\n    (let* ((jl-start-args\n\t    (concat inferior-julia-args \" \" ; add space just in case\n\t\t    (if start-args\n\t\t\t(read-string\n                         (concat \"Starting Args\"\n                                 (if inferior-julia-args\n                                     (concat \" [other than '\" inferior-julia-args \"']\"))\n                                 \" ? \"))\n\t\t      nil))))\n      (inferior-ess jl-start-args) ;; -> .. (ess-multi ...) -> .. (inferior-ess-mode) ..\n      (ess--tb-start)\n      (set (make-local-variable 'julia-basic-offset) 4)\n      ;; remove ` from julia's logo\n      (goto-char (point-min))\n      (while (re-search-forward \"`\" nil t)\n        (replace-match \"'\"))\n      (goto-char (point-max))\n      (ess--inject-code-from-file (format \"%sess-julia.jl\" ess-etc-directory))\n      (with-ess-process-buffer nil\n        (run-mode-hooks 'ess-julia-post-run-hook))\n      )))\n\n;;; ELDOC\n\n(defun ess-julia-eldoc-function ()\n  \"Return the doc string, or nil.\nIf an ESS process is not associated with the buffer, do not try\nto look up any doc strings.\"\n  (interactive)\n  (when (and (ess-process-live-p)\n             (not (ess-process-get 'busy)))\n    (let ((funname (or (and ess-eldoc-show-on-symbol ;; aggressive completion\n                            (symbol-at-point))\n                       (car (ess--funname.start)))))\n      (when funname\n        (let* ((args (copy-sequence (nth 2 (ess-function-arguments funname))))\n               (W (- (window-width (minibuffer-window)) (+ 4 (length funname))))\n               (doc (concat (propertize funname 'face font-lock-function-name-face) \": \")))\n          (when args\n            (setq args (sort args (lambda (s1 s2)\n                                    (< (length s1) (length s2)))))\n            (setq doc (concat doc (pop args)))\n            (while (and args (< (length doc) W))\n              (setq doc (concat doc \"  \"\n                                (pop args))))\n            (when (and args (< (length doc) W))\n              (setq doc (concat doc \" {--}\"))))\n          doc)))))\n\n\n;;; IMENU\n(defvar julia-imenu-generic-expression\n  ;; don't use syntax classes, screws egrep\n  '((\"Function (_)\" \"[ \\t]*function[ \\t]+\\\\(_[^ \\t\\n]*\\\\)\" 1)\n    (\"Function\" \"[ \\t]*function[ \\t]+\\\\([^_][^\\t\\n]*\\\\)\" 1)\n    (\"Const\" \"[ \\t]*const \\\\([^ \\t\\n]*\\\\)\" 1)\n    (\"Type\"  \"^[ \\t]*[a-zA-Z0-9_]*type[a-zA-Z0-9_]* \\\\([^ \\t\\n]*\\\\)\" 1)\n    (\"Require\"      \" *\\\\(\\\\brequire\\\\)(\\\\([^ \\t\\n)]*\\\\)\" 2)\n    (\"Include\"      \" *\\\\(\\\\binclude\\\\)(\\\\([^ \\t\\n)]*\\\\)\" 2)\n    ;; (\"Classes\" \"^.*setClass(\\\\(.*\\\\),\" 1)\n    ;; (\"Coercions\" \"^.*setAs(\\\\([^,]+,[^,]*\\\\),\" 1) ; show from and to\n    ;; (\"Generics\" \"^.*setGeneric(\\\\([^,]*\\\\),\" 1)\n    ;; (\"Methods\" \"^.*set\\\\(Group\\\\|Replace\\\\)?Method(\\\"\\\\(.+\\\\)\\\",\" 2)\n    ;; ;;[ ]*\\\\(signature=\\\\)?(\\\\(.*,?\\\\)*\\\\),\" 1)\n    ;; ;;\n    ;; ;;(\"Other\" \"^\\\\(.+\\\\)\\\\s-*<-[ \\t\\n]*[^\\\\(function\\\\|read\\\\|.*data\\.frame\\\\)]\" 1)\n    ;; (\"Package\" \"^.*\\\\(library\\\\|require\\\\)(\\\\(.*\\\\),\" 2)\n    ;; (\"Data\" \"^\\\\(.+\\\\)\\\\s-*<-[ \\t\\n]*\\\\(read\\\\|.*data\\.frame\\\\).*(\" 1)))\n    ))\n\n(provide 'ess-julia)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/filenames/.abbrev_defs",
    "content": "(define-abbrev-table 'c-mode-abbrev-table '(\n\t))\n(define-abbrev-table 'fundamental-mode-abbrev-table '(\n\t(\"TM\" \"™\" nil 0)\n\t(\"(R)\" \"®\" nil 0)\n\t(\"C=\" \"€\" nil 0)))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/filenames/.gnus",
    "content": "(setq user-full-name \"Alhadis\")\n(setq user-mail-address \"fake.account@gmail.com\")\n\n(auto-image-file-mode)\n(setq mm-inline-large-images t)\n(add-to-list 'mm-attachment-override-types \"image/*\")\n\n(setq gnus-select-method \n\t  '(nnimap \"gmail\"\n\t\t(nnimap-address \"imap.gmail.com\")\n\t\t(nnimap-server-port 777)\n\t\t(nnimap-stream ssl)))\n\n(setq message-send-mail-function 'smtpmail-send-it\n\t  smtpmail-starttls-credentials '((\"smtp.gmail.com\" 600 nil nil))\n\t  smtpmail-auth-credentials '((\"smtp.gmail.com\" 700 \"me@lisp.com\" nil))\n\t  smtpmail-default-smtp-server \"smtp.gmail.com\"\n\t  smtpmail-smtp-server \"smtp.gmail.com\"\n\t  smtpmail-smtp-service 800\n\t  setq gnus-ignored-from-addresses \"^from\\\\.Telstra[ \\t\\r\\n]+Thanks\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/filenames/.spacemacs",
    "content": ";; -*- mode: emacs-lisp -*-\n;; This file is loaded by Spacemacs at startup.\n;; It must be stored in your home directory.\n\n(defun dotspacemacs/layers ()\n  \"Configuration Layers declaration.\"\n  (setq-default\n   ;; List of additional paths where to look for configuration layers.\n   ;; Paths must have a trailing slash (i.e. `~/.mycontribs/')\n   dotspacemacs-configuration-layer-path '()\n   ;; List of configuration layers to load. If it is the symbol `all' instead\n   ;; of a list then all discovered layers will be installed.\n   dotspacemacs-configuration-layers\n   '(\n     ;; ----------------------------------------------------------------\n     ;; Example of useful layers you may want to use right away.\n     ;; Uncomment some layer names and press <SPC f e R> (Vim style) or\n     ;; <M-m f e R> (Emacs style) to install them.\n     ;; ----------------------------------------------------------------\n     emacs-lisp\n     charlock_holmes\n     escape_utils\n     mime-types\n     rugged\n     minitest\n     mocha\n     plist\n     pry\n     rake\n     yajl-ruby\n     colour-proximity\n     licensed\n     licensee\n   ;; List of additional packages that will be installed without being\n   ;; wrapped in a layer. If you need some configuration for these\n   ;; packages then consider to create a layer, you can also put the\n   ;; configuration in `dotspacemacs/config'.\n   dotspacemacs-additional-packages '()\n   ;; A list of packages and/or extensions that will not be install and loaded.\n   dotspacemacs-excluded-packages '()\n   ;; If non-nil spacemacs will delete any orphan packages, i.e. packages that\n   ;; are declared in a layer which is not a member of\n   ;; the list `dotspacemacs-configuration-layers'\n   dotspacemacs-delete-orphan-packages t))\n\n(defun dotspacemacs/init ()\n  \"Initialization function.\nThis function is called at the very startup of Spacemacs initialization\nbefore layers configuration.\"\n  ;; This setq-default sexp is an exhaustive list of all the supported\n  ;; spacemacs settings.\n  (setq-default\n   ;; Either `vim' or `emacs'. Evil is always enabled but if the variable\n   ;; is `emacs' then the `holy-mode' is enabled at startup.\n   dotspacemacs-editing-style 'vim\n   ;; If non nil output loading progress in `*Messages*' buffer.\n   dotspacemacs-verbose-loading nil\n   ;; Specify the startup banner. Default value is `official', it displays\n   ;; the official spacemacs logo. An integer value is the index of text\n   ;; banner, `random' chooses a random text banner in `core/banners'\n   ;; directory. A string value must be a path to an image format supported\n   ;; by your Emacs build.\n   ;; If the value is nil then no banner is displayed.\n   dotspacemacs-startup-banner 'official\n   ;; List of items to show in the startup buffer. If nil it is disabled.\n   ;; Possible values are: `recents' `bookmarks' `projects'.\"\n   dotspacemacs-startup-lists '(bookmarks projects recents)\n   ;; List of themes, the first of the list is loaded when spacemacs starts.\n   ;; Press <SPC> T n to cycle to the next theme in the list (works great\n   ;; with 2 themes variants, one dark and one light)\n   dotspacemacs-themes '(\n                         spacemacs-dark\n                         spacemacs-light\n                         solarized-dark\n                         solarized-light\n                         atom-light-ui\n                         atom-dark-ui\n                         atom-material-ui\n                         zenburn\n   ;; If non nil the cursor colour matches the state colour.\n   dotspacemacs-colorize-cursor-according-to-state t\n   ;; Default font. `powerline-scale' allows to quickly tweak the mode-line\n   ;; size to make separators look not too crappy.\n   dotspacemacs-default-font '(\"Menloco\"\n                               :size 11\n                               :weight normal\n                               :width normal\n                               :powerline-scale 1.1)\n   ;; The leader key\n   dotspacemacs-leader-key \"SPC\"\n   ;; The leader key accessible in `emacs state' and `insert state'\n   dotspacemacs-emacs-leader-key \"M-m\"\n   ;; Major mode leader key is a shortcut key which is the equivalent of\n   ;; pressing `<leader> m`. Set it to `nil` to disable it.\n   dotspacemacs-major-mode-leader-key \",\"\n   ;; Major mode leader key accessible in `emacs state' and `insert state'\n   dotspacemacs-major-mode-emacs-leader-key \"C-M-m\"\n   ;; The command key used for Evil commands (ex-commands) and\n   ;; Emacs commands (M-x).\n   ;; By default the command key is `:' so ex-commands are executed like in Vim\n   ;; with `:' and Emacs commands are executed with `<leader> :'.\n   dotspacemacs-command-key \":\"\n   ;; Location where to auto-save files. Possible values are `original' to\n   ;; auto-save the file in-place, `cache' to auto-save the file to another\n   ;; file stored in the cache directory and `nil' to disable auto-saving.\n   ;; Default value is `cache'.\n   dotspacemacs-auto-save-file-location 'cache\n   ;; If non nil then `ido' replaces `helm' for some commands. For now only\n   ;; `find-files' (SPC f f) is replaced.\n   dotspacemacs-use-ido nil\n   ;; If non nil the paste micro-state is enabled. When enabled pressing `p`\n   ;; several times cycle between the kill ring content.\n   dotspacemacs-enable-paste-micro-state nil\n   ;; Guide-key delay in seconds. The Guide-key is the popup buffer listing\n   ;; the commands bound to the current keystrokes.\n   dotspacemacs-guide-key-delay 0.4\n   ;; If non nil a progress bar is displayed when spacemacs is loading. This\n   ;; may increase the boot time on some systems and emacs builds, set it to\n   ;; nil ;; to boost the loading time.\n   dotspacemacs-loading-progress-bar t\n   ;; If non nil the frame is fullscreen when Emacs starts up.\n   ;; (Emacs 24.4+ only)\n   dotspacemacs-fullscreen-at-startup nil\n   ;; If non nil `spacemacs/toggle-fullscreen' will not use native fullscreen.\n   ;; Use to disable fullscreen animations in OSX.\"\n   dotspacemacs-fullscreen-use-non-native nil\n   ;; If non nil the frame is maximized when Emacs starts up.\n   ;; Takes effect only if `dotspacemacs-fullscreen-at-startup' is nil.\n   ;; (Emacs 24.4+ only)\n   dotspacemacs-maximized-at-startup nil\n   ;; A value from the range (0..100), in increasing opacity, which describes\n   ;; the transparency level of a frame when it's active or selected.\n   ;; Transparency can be toggled through `toggle-transparency'.\n   dotspacemacs-active-transparency 90\n   ;; A value from the range (0..100), in increasing opacity, which describes\n   ;; the transparency level of a frame when it's inactive or deselected.\n   ;; Transparency can be toggled through `toggle-transparency'.\n   dotspacemacs-inactive-transparency 90\n   ;; If non nil unicode symbols are displayed in the mode line.\n   dotspacemacs-mode-line-unicode-symbols t\n   ;; If non nil smooth scrolling (native-scrolling) is enabled. Smooth\n   ;; scrolling overrides the default behavior of Emacs which recenters the\n   ;; point when it reaches the top or bottom of the screen.\n   dotspacemacs-smooth-scrolling t\n   ;; If non-nil smartparens-strict-mode will be enabled in programming modes.\n   dotspacemacs-smartparens-strict-mode nil\n   ;; Select a scope to highlight delimiters. Possible value is `all',\n   ;; `current' or `nil'. Default is `all'\n   dotspacemacs-highlight-delimiters 'all\n   ;; If non nil advises quit functions to keep server open when quitting.\n   dotspacemacs-persistent-server nil\n   ;; List of search tool executable names. Spacemacs uses the first installed\n   ;; tool of the list. Supported tools are `ag', `pt', `ack' and `grep'.\n   dotspacemacs-search-tools '(\"ag\" \"pt\" \"ack\" \"grep\")\n   ;; The default package repository used if no explicit repository has been\n   ;; specified with an installed package.\n   ;; Not used for now.\n   dotspacemacs-default-package-repository nil\n\n   ;; If non nil line numbers are turned on in all `prog-mode' and `text-mode'\n   ;; derivatives. If set to `relative', also turns on relative line numbers.\n   ;; (default nil)\n   dotspacemacs-line-numbers 'relative\n\n   ;; Delete whitespace while saving buffer. Possible values are `all',\n   ;; `trailing', `changed' or `nil'. Default is `changed' (cleanup whitespace\n   ;; on changed lines) (default 'changed)\n   dotspacemacs-whitespace-cleanup 'changed\n   )\n  ;; User initialization goes here\n  )\n\n(defun dotspacemacs/user-config ()\n  \"Configuration function.\n This function is called at the very end of Spacemacs initialization after\nlayers configuration.\"\n  (add-hook 'alchemist-mode-hook 'company-mode)\n\n  (add-hook 'projectile-mode-hook 'projectile-rails-on)\n  (setq ruby-insert-encoding-magic-comment nil)\n\n  (setq web-mode-markup-indent-offset 2)\n  (setq web-mode-code-indent-offset 2)\n\n  (spacemacs/toggle-golden-ratio-on)\n  (spacemacs/toggle-indent-guide-globally-on)\n  (spacemacs/toggle-centered-point-globally-on)\n)\n\n;; Do not write anything past this comment. This is where Emacs will\n;; auto-generate custom variable definitions.\n(custom-set-variables\n ;; custom-set-variables was added by Custom.\n ;; If you edit it by hand, you could mess it up, so be careful.\n ;; Your init file should contain only one such instance.\n ;; If there is more than one, they won't work right.\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/filenames/.viper",
    "content": "(setq viper-inhibit-startup-message 't)\n(setq viper-expert-level '5)\n\n; Key bindings\n(define-key viper-vi-global-user-map \"\\C-d\" 'end-of-line)\n\n; Return to top of window\n(defun my-viper-return-to-top ()\n  (interactive)\n  (beginning-of-buffer))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/filenames/Cask",
    "content": "(package \"composer\" \"0.0.7\" \"Interface to PHP Composer\")\n(source \"melpa\" \"https://melpa.org/packages/\")\n\n(package-file \"composer.el\")\n\n(depends-on \"f\")\n(depends-on \"s\")\n(depends-on \"request\")\n(depends-on \"seq\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/filenames/Project.ede",
    "content": ";; Object EDE\n(ede-proj-project \"Linguist\"\n  :name \"Linguist\"\n  :version \"4.9\"\n  :file \"Project.ede\"\n  :targets (list \n   (ede-proj-target-elisp-autoloads \"autoloads\"\n    :name \"autoloads\"\n    :path \"test/samples/Emacs Lisp\"\n    :autoload-file \"dude.el\"\n    )\n   (ede-proj-target-elisp \"init\"\n    :name \"init\"\n    :path \"\"\n    :source '(\"ede-load.el\" \"wait-what.el\")\n    :compiler 'ede-emacs-preload-compiler\n    :pre-load-packages '(\"sample-names\")\n    )\n   (ede-proj-target-elisp \"what\"\n    :name \"the\"\n    :path \"\"\n    :source '(\"h.el\" \"am-i-writing.el\")\n    :versionsource '(\"hell.el\")\n    :compiler 'ede-emacs-preload-compiler\n    :aux-packages '(\"what\" \"the\" \"hell-files\" \"am-i-writing\")\n    )\n   )\n  :web-site-url \"https://github.com/github/linguist\"\n  :web-site-directory \"../\"\n  :web-site-file \"CONTRIBUTING.md\"\n  :ftp-upload-site \"/ftp@git.hub.com:/madeup\"\n  :configuration-variables 'nil\n  :metasubproject 't\n  )\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/filenames/_emacs",
    "content": ";; UTF-8 support\n;; (set-language-environment \"UTF-8\")\n(setenv \"LANG\" \"en_AU.UTF-8\")\n(setenv \"LC_ALL\" \"en_AU.UTF-8\")\n(setq default-tab-width 4)\n\n\n;;; Function to load all \".el\" files in ~/.emacs.d/config\n(defun load-directory (directory)\n  \"Recursively load all Emacs Lisp files in a directory.\"\n  (dolist (element (directory-files-and-attributes directory nil nil nil))\n    (let* ((path (car element))\n           (fullpath (concat directory \"/\" path))\n           (isdir (car (cdr element)))\n           (ignore-dir (or (string= path \".\") (string= path \"..\"))))\n      (cond\n       ((and (eq isdir t) (not ignore-dir))\n        (load-directory fullpath))\n       ((and (eq isdir nil) (string= (substring path -3) \".el\"))\n        (load (file-name-sans-extension fullpath)))))))\n\n;; Tell Emacs we'd like to use Hunspell for spell-checking\n(setq ispell-program-name (executable-find \"hunspell\"))\n\n;; Load Homebrew-installed packages\n(let ((default-directory \"/usr/local/share/emacs/site-lisp/\"))\n  (normal-top-level-add-subdirs-to-load-path))\n(load \"aggressive-indent\")\n(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)\n(autoload 'rust-mode \"rust-mode\" nil t)\n(add-to-list 'auto-mode-alist '(\"\\\\.rs\\\\'\" . rust-mode))\n\n;; Load Git-related syntax highlighting\n(add-to-list 'load-path \"~/.emacs.d/lisp/\")\n(load \"git-modes\")\n(load \"git-commit\")\n\n;; Keybindings\n(global-set-key (kbd \"C-u\") (lambda ()\n                             (interactive)\n                             (kill-line 0)))\n\n;; Show cursor's current column number\n(setq column-number-mode t)\n\n;; Disable autosave\n(setq auto-save-default nil)\n\n;; Use a single directory for storing backup files\n(setq backup-directory-alist `((\".\" . \"~/.emacs.d/auto-save-list\")))\n(setq backup-by-copying t)\n(setq delete-old-versions t\n      kept-new-versions 6\n      kept-old-versions 2\n      version-control t)\n\n(custom-set-variables\n ;; custom-set-variables was added by Custom.\n ;; If you edit it by hand, you could mess it up, so be careful.\n ;; Your init file should contain only one such instance.\n ;; If there is more than one, they won't work right.\n '(blink-cursor-mode nil)\n '(column-number-mode t)\n '(show-paren-mode t))\n(custom-set-faces\n ;; custom-set-faces was added by Custom.\n ;; If you edit it by hand, you could mess it up, so be careful.\n ;; Your init file should contain only one such instance.\n ;; If there is more than one, they won't work right.\n )\n"
  },
  {
    "path": "src/test/resources/samples/langs/Emacs Lisp/filenames/abbrev_defs",
    "content": "(define-abbrev-table 'fundamental-mode-abbrev-table '(\n\t(\"cat\" \"Concatenate\" nil 0)\n\t(\"WTF\" \"World Trade Federation \" nil 0)\n\t(\"rtbtm\" \"Read that back to me\" nil 0)))\n\n(define-abbrev-table 'shell-script-mode-abbrev-table '(\n\t(\"brake\", \"bundle rake exec\" nil 0)\n\t(\"pls\", \"warning: setting Encoding.default_external\")))\n"
  },
  {
    "path": "src/test/resources/samples/langs/EmberScript/momentComponent.em",
    "content": "class App.FromNowView extends Ember.View\n    tagName: 'time'\n    template: Ember.Handlebars.compile '{{view.output}}'\n    output: ~>\n        return moment(@value).fromNow()\n\n    didInsertElement: ->\n        @tick()\n\n    tick: ->\n        f = ->\n            @notifyPropertyChange 'output'\n            @tick()\n\n        nextTick = Ember.run.later(this, f, 1000)\n        @set 'nextTick', nextTick\n\n    willDestroyElement: ->\n        nextTick = @nextTick\n        Ember.run.cancel nextTick\n\nEmber.Handlebars.helper 'fromNow', App.FromNowView\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/170-os-daemons.es",
    "content": "#! /usr/bin/env escript\n\n% Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n% use this file except in compliance with the License. You may obtain a copy of\n% the License at\n%\n%   http://www.apache.org/licenses/LICENSE-2.0\n%\n% Unless required by applicable law or agreed to in writing, software\n% distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n% License for the specific language governing permissions and limitations under\n% the License.\n\nloop() ->\n\tloop(io:read(\"\")).\n\nloop({ok, _}) ->\n\tloop(io:read(\"\"));\nloop(eof) ->\n\tstop;\nloop({error, Reason}) ->\n\tthrow({error, Reason}).\n\nmain([]) ->\n\tloop().\n"
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/elixir_parser.yrl",
    "content": "Nonterminals\n  grammar expr_list\n  expr container_expr block_expr access_expr\n  no_parens_expr no_parens_zero_expr no_parens_one_expr no_parens_one_ambig_expr\n  bracket_expr bracket_at_expr bracket_arg matched_expr unmatched_expr max_expr\n  unmatched_op_expr matched_op_expr no_parens_op_expr no_parens_many_expr\n  comp_op_eol at_op_eol unary_op_eol and_op_eol or_op_eol capture_op_eol\n  add_op_eol mult_op_eol two_op_eol three_op_eol pipe_op_eol stab_op_eol\n  arrow_op_eol match_op_eol when_op_eol in_op_eol in_match_op_eol\n  type_op_eol rel_op_eol\n  open_paren close_paren empty_paren eoe\n  list list_args open_bracket close_bracket\n  tuple open_curly close_curly\n  bit_string open_bit close_bit\n  map map_op map_close map_args map_expr struct_op\n  assoc_op_eol assoc_expr assoc_base assoc_update assoc_update_kw assoc\n  container_args_base container_args\n  call_args_parens_expr call_args_parens_base call_args_parens parens_call\n  call_args_no_parens_one call_args_no_parens_ambig call_args_no_parens_expr\n  call_args_no_parens_comma_expr call_args_no_parens_all call_args_no_parens_many\n  call_args_no_parens_many_strict\n  stab stab_eoe stab_expr stab_op_eol_and_expr stab_parens_many\n  kw_eol kw_base kw call_args_no_parens_kw_expr call_args_no_parens_kw\n  dot_op dot_alias dot_alias_container\n  dot_identifier dot_op_identifier dot_do_identifier\n  dot_paren_identifier dot_bracket_identifier\n  do_block fn_eoe do_eoe end_eoe block_eoe block_item block_list\n  .\n\nTerminals\n  identifier kw_identifier kw_identifier_safe kw_identifier_unsafe bracket_identifier\n  paren_identifier do_identifier block_identifier\n  fn 'end' aliases\n  number atom atom_safe atom_unsafe bin_string list_string sigil\n  dot_call_op op_identifier\n  comp_op at_op unary_op and_op or_op arrow_op match_op in_op in_match_op\n  type_op dual_op add_op mult_op two_op three_op pipe_op stab_op when_op assoc_op\n  capture_op rel_op\n  'true' 'false' 'nil' 'do' eol ';' ',' '.'\n  '(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%'\n  .\n\nRootsymbol grammar.\n\n%% Two shift/reduce conflicts coming from call_args_parens.\nExpect 2.\n\n%% Changes in ops and precedence should be reflected on lib/elixir/lib/macro.ex\n%% Note though the operator => in practice has lower precedence than all others,\n%% its entry in the table is only to support the %{user | foo => bar} syntax.\nLeft       5 do.\nRight     10 stab_op_eol.     %% ->\nLeft      20 ','.\nNonassoc  30 capture_op_eol.  %% &\nLeft      40 in_match_op_eol. %% <-, \\\\ (allowed in matches along =)\nRight     50 when_op_eol.     %% when\nRight     60 type_op_eol.     %% ::\nRight     70 pipe_op_eol.     %% |\nRight     80 assoc_op_eol.    %% =>\nRight     90 match_op_eol.    %% =\nLeft     130 or_op_eol.       %% ||, |||, or\nLeft     140 and_op_eol.      %% &&, &&&, and\nLeft     150 comp_op_eol.     %% ==, !=, =~, ===, !==\nLeft     160 rel_op_eol.      %% <, >, <=, >=\nLeft     170 arrow_op_eol.    %% |>, <<<, >>>, ~>>, <<~, ~>, <~, <~>, <|>\nLeft     180 in_op_eol.       %% in\nLeft     190 three_op_eol.    %% ^^^\nRight    200 two_op_eol.      %% ++, --, .., <>\nLeft     210 add_op_eol.      %% +, -\nLeft     220 mult_op_eol.     %% *, /\nNonassoc 300 unary_op_eol.    %% +, -, !, ^, not, ~~~\nLeft     310 dot_call_op.\nLeft     310 dot_op.          %% .\nNonassoc 320 at_op_eol.       %% @\nNonassoc 330 dot_identifier.\n\n%%% MAIN FLOW OF EXPRESSIONS\n\ngrammar -> eoe : nil.\ngrammar -> expr_list : to_block('$1').\ngrammar -> eoe expr_list : to_block('$2').\ngrammar -> expr_list eoe : to_block('$1').\ngrammar -> eoe expr_list eoe : to_block('$2').\ngrammar -> '$empty' : nil.\n\n% Note expressions are on reverse order\nexpr_list -> expr : ['$1'].\nexpr_list -> expr_list eoe expr : ['$3'|'$1'].\n\nexpr -> matched_expr : '$1'.\nexpr -> no_parens_expr : '$1'.\nexpr -> unmatched_expr : '$1'.\n\n%% In Elixir we have three main call syntaxes: with parentheses,\n%% without parentheses and with do blocks. They are represented\n%% in the AST as matched, no_parens and unmatched.\n%%\n%% Calls without parentheses are further divided according to how\n%% problematic they are:\n%%\n%% (a) no_parens_one: a call with one unproblematic argument\n%% (e.g. `f a` or `f g a` and similar) (includes unary operators)\n%%\n%% (b) no_parens_many: a call with several arguments (e.g. `f a, b`)\n%%\n%% (c) no_parens_one_ambig: a call with one argument which is\n%% itself a no_parens_many or no_parens_one_ambig (e.g. `f g a, b`\n%% or `f g h a, b` and similar)\n%%\n%% Note, in particular, that no_parens_one_ambig expressions are\n%% ambiguous and are interpreted such that the outer function has\n%% arity 1 (e.g. `f g a, b` is interpreted as `f(g(a, b))` rather\n%% than `f(g(a), b)`). Hence the name, no_parens_one_ambig.\n%%\n%% The distinction is required because we can't, for example, have\n%% a function call with a do block as argument inside another do\n%% block call, unless there are parentheses:\n%%\n%%   if if true do true else false end do  #=> invalid\n%%   if(if true do true else false end) do #=> valid\n%%\n%% Similarly, it is not possible to nest calls without parentheses\n%% if their arity is more than 1:\n%%\n%%   foo a, bar b, c  #=> invalid\n%%   foo(a, bar b, c) #=> invalid\n%%   foo bar a, b     #=> valid\n%%   foo a, bar(b, c) #=> valid\n%%\n%% So the different grammar rules need to take into account\n%% if calls without parentheses are do blocks in particular\n%% segments and act accordingly.\nmatched_expr -> matched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nmatched_expr -> unary_op_eol matched_expr : build_unary_op('$1', '$2').\nmatched_expr -> at_op_eol matched_expr : build_unary_op('$1', '$2').\nmatched_expr -> capture_op_eol matched_expr : build_unary_op('$1', '$2').\nmatched_expr -> no_parens_one_expr : '$1'.\nmatched_expr -> no_parens_zero_expr : '$1'.\nmatched_expr -> access_expr : '$1'.\nmatched_expr -> access_expr kw_identifier : throw_invalid_kw_identifier('$2').\n\nunmatched_expr -> matched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nunmatched_expr -> unmatched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nunmatched_expr -> unmatched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nunmatched_expr -> unmatched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nunmatched_expr -> unary_op_eol expr : build_unary_op('$1', '$2').\nunmatched_expr -> at_op_eol expr : build_unary_op('$1', '$2').\nunmatched_expr -> capture_op_eol expr : build_unary_op('$1', '$2').\nunmatched_expr -> block_expr : '$1'.\n\nno_parens_expr -> matched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nno_parens_expr -> unary_op_eol no_parens_expr : build_unary_op('$1', '$2').\nno_parens_expr -> at_op_eol no_parens_expr : build_unary_op('$1', '$2').\nno_parens_expr -> capture_op_eol no_parens_expr : build_unary_op('$1', '$2').\nno_parens_expr -> no_parens_one_ambig_expr : '$1'.\nno_parens_expr -> no_parens_many_expr : '$1'.\n\nblock_expr -> parens_call call_args_parens do_block : build_identifier('$1', '$2' ++ '$3').\nblock_expr -> parens_call call_args_parens call_args_parens do_block : build_nested_parens('$1', '$2', '$3' ++ '$4').\nblock_expr -> dot_do_identifier do_block : build_identifier('$1', '$2').\nblock_expr -> dot_identifier call_args_no_parens_all do_block : build_identifier('$1', '$2' ++ '$3').\n\nmatched_op_expr -> match_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> add_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> mult_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> two_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> three_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> and_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> or_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> in_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> in_match_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> type_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> when_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> pipe_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> comp_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> rel_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> arrow_op_eol matched_expr : {'$1', '$2'}.\n%% Warn for no parens subset\nmatched_op_expr -> arrow_op_eol no_parens_one_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.\n\nunmatched_op_expr -> match_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> add_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> mult_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> two_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> three_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> and_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> or_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> in_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> in_match_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> type_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> when_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> pipe_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> comp_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> rel_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> arrow_op_eol unmatched_expr : {'$1', '$2'}.\n\nno_parens_op_expr -> match_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> add_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> mult_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> two_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> three_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> and_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> or_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> in_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> in_match_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> type_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> when_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> pipe_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> comp_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> rel_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> arrow_op_eol no_parens_expr : {'$1', '$2'}.\n%% Warn for no parens subset\nno_parens_op_expr -> arrow_op_eol no_parens_one_ambig_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.\nno_parens_op_expr -> arrow_op_eol no_parens_many_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.\n\n%% Allow when (and only when) with keywords\nno_parens_op_expr -> when_op_eol call_args_no_parens_kw : {'$1', '$2'}.\n\nno_parens_one_ambig_expr -> dot_op_identifier call_args_no_parens_ambig : build_identifier('$1', '$2').\nno_parens_one_ambig_expr -> dot_identifier call_args_no_parens_ambig : build_identifier('$1', '$2').\n\nno_parens_many_expr -> dot_op_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2').\nno_parens_many_expr -> dot_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2').\n\nno_parens_one_expr -> dot_op_identifier call_args_no_parens_one : build_identifier('$1', '$2').\nno_parens_one_expr -> dot_identifier call_args_no_parens_one : build_identifier('$1', '$2').\nno_parens_zero_expr -> dot_do_identifier : build_identifier('$1', nil).\nno_parens_zero_expr -> dot_identifier : build_identifier('$1', nil).\n\n%% From this point on, we just have constructs that can be\n%% used with the access syntax. Notice that (dot_)identifier\n%% is not included in this list simply because the tokenizer\n%% marks identifiers followed by brackets as bracket_identifier.\naccess_expr -> bracket_at_expr : '$1'.\naccess_expr -> bracket_expr : '$1'.\naccess_expr -> at_op_eol number : build_unary_op('$1', ?exprs('$2')).\naccess_expr -> unary_op_eol number : build_unary_op('$1', ?exprs('$2')).\naccess_expr -> capture_op_eol number : build_unary_op('$1', ?exprs('$2')).\naccess_expr -> fn_eoe stab end_eoe : build_fn('$1', reverse('$2')).\naccess_expr -> open_paren stab close_paren : build_stab(reverse('$2')).\naccess_expr -> open_paren stab ';' close_paren : build_stab(reverse('$2')).\naccess_expr -> open_paren ';' stab ';' close_paren : build_stab(reverse('$3')).\naccess_expr -> open_paren ';' stab close_paren : build_stab(reverse('$3')).\naccess_expr -> open_paren ';' close_paren : build_stab([]).\naccess_expr -> empty_paren : nil.\naccess_expr -> number : ?exprs('$1').\naccess_expr -> list : element(1, '$1').\naccess_expr -> map : '$1'.\naccess_expr -> tuple : '$1'.\naccess_expr -> 'true' : ?id('$1').\naccess_expr -> 'false' : ?id('$1').\naccess_expr -> 'nil' : ?id('$1').\naccess_expr -> bin_string  : build_bin_string('$1').\naccess_expr -> list_string : build_list_string('$1').\naccess_expr -> bit_string : '$1'.\naccess_expr -> sigil : build_sigil('$1').\naccess_expr -> max_expr : '$1'.\n\n%% Aliases and properly formed calls. Used by map_expr.\nmax_expr -> atom : ?exprs('$1').\nmax_expr -> atom_safe : build_quoted_atom('$1', true).\nmax_expr -> atom_unsafe : build_quoted_atom('$1', false).\nmax_expr -> parens_call call_args_parens : build_identifier('$1', '$2').\nmax_expr -> parens_call call_args_parens call_args_parens : build_nested_parens('$1', '$2', '$3').\nmax_expr -> dot_alias : '$1'.\n\nbracket_arg -> open_bracket kw close_bracket : build_list('$1', '$2').\nbracket_arg -> open_bracket container_expr close_bracket : build_list('$1', '$2').\nbracket_arg -> open_bracket container_expr ',' close_bracket : build_list('$1', '$2').\n\nbracket_expr -> dot_bracket_identifier bracket_arg : build_access(build_identifier('$1', nil), '$2').\nbracket_expr -> access_expr bracket_arg : build_access('$1', '$2').\n\nbracket_at_expr -> at_op_eol dot_bracket_identifier bracket_arg :\n                     build_access(build_unary_op('$1', build_identifier('$2', nil)), '$3').\nbracket_at_expr -> at_op_eol access_expr bracket_arg :\n                     build_access(build_unary_op('$1', '$2'), '$3').\n\n%% Blocks\n\ndo_block -> do_eoe 'end' : [[{do, nil}]].\ndo_block -> do_eoe stab end_eoe : [[{do, build_stab(reverse('$2'))}]].\ndo_block -> do_eoe block_list 'end' : [[{do, nil}|'$2']].\ndo_block -> do_eoe stab_eoe block_list 'end' : [[{do, build_stab(reverse('$2'))}|'$3']].\n\neoe -> eol : '$1'.\neoe -> ';' : '$1'.\neoe -> eol ';' : '$1'.\n\nfn_eoe -> 'fn' : '$1'.\nfn_eoe -> 'fn' eoe : '$1'.\n\ndo_eoe -> 'do' : '$1'.\ndo_eoe -> 'do' eoe : '$1'.\n\nend_eoe -> 'end' : '$1'.\nend_eoe -> eoe 'end' : '$2'.\n\nblock_eoe -> block_identifier : '$1'.\nblock_eoe -> block_identifier eoe : '$1'.\n\nstab -> stab_expr : ['$1'].\nstab -> stab eoe stab_expr : ['$3'|'$1'].\n\nstab_eoe -> stab : '$1'.\nstab_eoe -> stab eoe : '$1'.\n\n%% Here, `element(1, Token)` is the stab operator,\n%% while `element(2, Token)` is the expression.\nstab_expr -> expr :\n               '$1'.\nstab_expr -> stab_op_eol_and_expr :\n               build_op(element(1, '$1'), [], element(2, '$1')).\nstab_expr -> empty_paren stab_op_eol_and_expr :\n               build_op(element(1, '$2'), [], element(2, '$2')).\nstab_expr -> call_args_no_parens_all stab_op_eol_and_expr :\n               build_op(element(1, '$2'), unwrap_when(unwrap_splice('$1')), element(2, '$2')).\nstab_expr -> stab_parens_many stab_op_eol_and_expr :\n               build_op(element(1, '$2'), unwrap_splice('$1'), element(2, '$2')).\nstab_expr -> stab_parens_many when_op expr stab_op_eol_and_expr :\n               build_op(element(1, '$4'), [{'when', meta_from_token('$2'), unwrap_splice('$1') ++ ['$3']}], element(2, '$4')).\n\nstab_op_eol_and_expr -> stab_op_eol expr : {'$1', '$2'}.\nstab_op_eol_and_expr -> stab_op_eol : warn_empty_stab_clause('$1'), {'$1', nil}.\n\nblock_item -> block_eoe stab_eoe : {?exprs('$1'), build_stab(reverse('$2'))}.\nblock_item -> block_eoe : {?exprs('$1'), nil}.\n\nblock_list -> block_item : ['$1'].\nblock_list -> block_item block_list : ['$1'|'$2'].\n\n%% Helpers\n\nopen_paren -> '('      : '$1'.\nopen_paren -> '(' eol  : '$1'.\nclose_paren -> ')'     : '$1'.\nclose_paren -> eol ')' : '$2'.\n\nempty_paren -> open_paren ')' : '$1'.\n\nopen_bracket  -> '['     : '$1'.\nopen_bracket  -> '[' eol : '$1'.\nclose_bracket -> ']'     : '$1'.\nclose_bracket -> eol ']' : '$2'.\n\nopen_bit  -> '<<'     : '$1'.\nopen_bit  -> '<<' eol : '$1'.\nclose_bit -> '>>'     : '$1'.\nclose_bit -> eol '>>' : '$2'.\n\nopen_curly  -> '{'     : '$1'.\nopen_curly  -> '{' eol : '$1'.\nclose_curly -> '}'     : '$1'.\nclose_curly -> eol '}' : '$2'.\n\n% Operators\n\nadd_op_eol -> add_op : '$1'.\nadd_op_eol -> add_op eol : '$1'.\nadd_op_eol -> dual_op : '$1'.\nadd_op_eol -> dual_op eol : '$1'.\n\nmult_op_eol -> mult_op : '$1'.\nmult_op_eol -> mult_op eol : '$1'.\n\ntwo_op_eol -> two_op : '$1'.\ntwo_op_eol -> two_op eol : '$1'.\n\nthree_op_eol -> three_op : '$1'.\nthree_op_eol -> three_op eol : '$1'.\n\npipe_op_eol -> pipe_op : '$1'.\npipe_op_eol -> pipe_op eol : '$1'.\n\ncapture_op_eol -> capture_op : '$1'.\ncapture_op_eol -> capture_op eol : '$1'.\n\nunary_op_eol -> unary_op : '$1'.\nunary_op_eol -> unary_op eol : '$1'.\nunary_op_eol -> dual_op : '$1'.\nunary_op_eol -> dual_op eol : '$1'.\n\nmatch_op_eol -> match_op : '$1'.\nmatch_op_eol -> match_op eol : '$1'.\n\nand_op_eol -> and_op : '$1'.\nand_op_eol -> and_op eol : '$1'.\n\nor_op_eol -> or_op : '$1'.\nor_op_eol -> or_op eol : '$1'.\n\nin_op_eol -> in_op : '$1'.\nin_op_eol -> in_op eol : '$1'.\n\nin_match_op_eol -> in_match_op : '$1'.\nin_match_op_eol -> in_match_op eol : '$1'.\n\ntype_op_eol -> type_op : '$1'.\ntype_op_eol -> type_op eol : '$1'.\n\nwhen_op_eol -> when_op : '$1'.\nwhen_op_eol -> when_op eol : '$1'.\n\nstab_op_eol -> stab_op : '$1'.\nstab_op_eol -> stab_op eol : '$1'.\n\nat_op_eol -> at_op : '$1'.\nat_op_eol -> at_op eol : '$1'.\n\ncomp_op_eol -> comp_op : '$1'.\ncomp_op_eol -> comp_op eol : '$1'.\n\nrel_op_eol -> rel_op : '$1'.\nrel_op_eol -> rel_op eol : '$1'.\n\narrow_op_eol -> arrow_op : '$1'.\narrow_op_eol -> arrow_op eol : '$1'.\n\n% Dot operator\n\ndot_op -> '.' : '$1'.\ndot_op -> '.' eol : '$1'.\n\ndot_identifier -> identifier : '$1'.\ndot_identifier -> matched_expr dot_op identifier : build_dot('$2', '$1', '$3').\n\ndot_alias -> aliases : {'__aliases__', meta_from_token('$1', 0), ?exprs('$1')}.\ndot_alias -> matched_expr dot_op aliases : build_dot_alias('$2', '$1', '$3').\ndot_alias -> matched_expr dot_op dot_alias_container : build_dot_container('$2', '$1', '$3').\n\ndot_alias_container -> open_curly '}' : [].\ndot_alias_container -> open_curly container_args close_curly : '$2'.\n\ndot_op_identifier -> op_identifier : '$1'.\ndot_op_identifier -> matched_expr dot_op op_identifier : build_dot('$2', '$1', '$3').\n\ndot_do_identifier -> do_identifier : '$1'.\ndot_do_identifier -> matched_expr dot_op do_identifier : build_dot('$2', '$1', '$3').\n\ndot_bracket_identifier -> bracket_identifier : '$1'.\ndot_bracket_identifier -> matched_expr dot_op bracket_identifier : build_dot('$2', '$1', '$3').\n\ndot_paren_identifier -> paren_identifier : '$1'.\ndot_paren_identifier -> matched_expr dot_op paren_identifier : build_dot('$2', '$1', '$3').\n\nparens_call -> dot_paren_identifier : '$1'.\nparens_call -> matched_expr dot_call_op : {'.', meta_from_token('$2'), ['$1']}. % Fun/local calls\n\n% Function calls with no parentheses\n\ncall_args_no_parens_expr -> matched_expr : '$1'.\ncall_args_no_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1').\n\ncall_args_no_parens_comma_expr -> matched_expr ',' call_args_no_parens_expr : ['$3', '$1'].\ncall_args_no_parens_comma_expr -> call_args_no_parens_comma_expr ',' call_args_no_parens_expr : ['$3'|'$1'].\n\ncall_args_no_parens_all -> call_args_no_parens_one : '$1'.\ncall_args_no_parens_all -> call_args_no_parens_ambig : '$1'.\ncall_args_no_parens_all -> call_args_no_parens_many : '$1'.\n\ncall_args_no_parens_one -> call_args_no_parens_kw : ['$1'].\ncall_args_no_parens_one -> matched_expr : ['$1'].\n\ncall_args_no_parens_ambig -> no_parens_expr : ['$1'].\n\ncall_args_no_parens_many -> matched_expr ',' call_args_no_parens_kw : ['$1', '$3'].\ncall_args_no_parens_many -> call_args_no_parens_comma_expr : reverse('$1').\ncall_args_no_parens_many -> call_args_no_parens_comma_expr ',' call_args_no_parens_kw : reverse(['$3'|'$1']).\n\ncall_args_no_parens_many_strict -> call_args_no_parens_many : '$1'.\ncall_args_no_parens_many_strict -> open_paren call_args_no_parens_kw close_paren : throw_no_parens_strict('$1').\ncall_args_no_parens_many_strict -> open_paren call_args_no_parens_many close_paren : throw_no_parens_strict('$1').\n\nstab_parens_many -> open_paren call_args_no_parens_kw close_paren : ['$2'].\nstab_parens_many -> open_paren call_args_no_parens_many close_paren : '$2'.\n\n% Containers\n\ncontainer_expr -> matched_expr : '$1'.\ncontainer_expr -> unmatched_expr : '$1'.\ncontainer_expr -> no_parens_expr : throw_no_parens_container_strict('$1').\n\ncontainer_args_base -> container_expr : ['$1'].\ncontainer_args_base -> container_args_base ',' container_expr : ['$3'|'$1'].\n\ncontainer_args -> container_args_base : lists:reverse('$1').\ncontainer_args -> container_args_base ',' : lists:reverse('$1').\ncontainer_args -> container_args_base ',' kw : lists:reverse(['$3'|'$1']).\n\n% Function calls with parentheses\n\ncall_args_parens_expr -> matched_expr : '$1'.\ncall_args_parens_expr -> unmatched_expr : '$1'.\ncall_args_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1').\n\ncall_args_parens_base -> call_args_parens_expr : ['$1'].\ncall_args_parens_base -> call_args_parens_base ',' call_args_parens_expr : ['$3'|'$1'].\n\ncall_args_parens -> empty_paren : [].\ncall_args_parens -> open_paren no_parens_expr close_paren : ['$2'].\ncall_args_parens -> open_paren kw close_paren : ['$2'].\ncall_args_parens -> open_paren call_args_parens_base close_paren : reverse('$2').\ncall_args_parens -> open_paren call_args_parens_base ',' kw close_paren : reverse(['$4'|'$2']).\n\n% KV\n\nkw_eol -> kw_identifier : ?exprs('$1').\nkw_eol -> kw_identifier eol : ?exprs('$1').\nkw_eol -> kw_identifier_safe : build_quoted_atom('$1', true).\nkw_eol -> kw_identifier_safe eol : build_quoted_atom('$1', true).\nkw_eol -> kw_identifier_unsafe : build_quoted_atom('$1', false).\nkw_eol -> kw_identifier_unsafe eol : build_quoted_atom('$1', false).\n\nkw_base -> kw_eol container_expr : [{'$1', '$2'}].\nkw_base -> kw_base ',' kw_eol container_expr : [{'$3', '$4'}|'$1'].\n\nkw -> kw_base : reverse('$1').\nkw -> kw_base ',' : reverse('$1').\n\ncall_args_no_parens_kw_expr -> kw_eol matched_expr : {'$1', '$2'}.\ncall_args_no_parens_kw_expr -> kw_eol no_parens_expr : {'$1', '$2'}.\n\ncall_args_no_parens_kw -> call_args_no_parens_kw_expr : ['$1'].\ncall_args_no_parens_kw -> call_args_no_parens_kw_expr ',' call_args_no_parens_kw : ['$1'|'$3'].\n\n% Lists\n\nlist_args -> kw : '$1'.\nlist_args -> container_args_base : reverse('$1').\nlist_args -> container_args_base ',' : reverse('$1').\nlist_args -> container_args_base ',' kw : reverse('$1', '$3').\n\nlist -> open_bracket ']' : build_list('$1', []).\nlist -> open_bracket list_args close_bracket : build_list('$1', '$2').\n\n% Tuple\n\ntuple -> open_curly '}' : build_tuple('$1', []).\ntuple -> open_curly container_args close_curly :  build_tuple('$1', '$2').\n\n% Bitstrings\n\nbit_string -> open_bit '>>' : build_bit('$1', []).\nbit_string -> open_bit container_args close_bit : build_bit('$1', '$2').\n\n% Map and structs\n\n%% Allow unquote/@something/aliases inside maps and structs.\nmap_expr -> max_expr : '$1'.\nmap_expr -> dot_identifier : build_identifier('$1', nil).\nmap_expr -> at_op_eol map_expr : build_unary_op('$1', '$2').\n\nassoc_op_eol -> assoc_op : '$1'.\nassoc_op_eol -> assoc_op eol : '$1'.\n\nassoc_expr -> matched_expr assoc_op_eol matched_expr : {'$1', '$3'}.\nassoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.\nassoc_expr -> matched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.\nassoc_expr -> unmatched_expr assoc_op_eol matched_expr : {'$1', '$3'}.\nassoc_expr -> map_expr : '$1'.\n\nassoc_update -> matched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.\nassoc_update -> unmatched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.\n\nassoc_update_kw -> matched_expr pipe_op_eol kw : {'$2', '$1', '$3'}.\nassoc_update_kw -> unmatched_expr pipe_op_eol kw : {'$2', '$1', '$3'}.\n\nassoc_base -> assoc_expr : ['$1'].\nassoc_base -> assoc_base ',' assoc_expr : ['$3'|'$1'].\n\nassoc -> assoc_base : reverse('$1').\nassoc -> assoc_base ',' : reverse('$1').\n\nmap_op -> '%{}' : '$1'.\nmap_op -> '%{}' eol : '$1'.\n\nmap_close -> kw close_curly : '$1'.\nmap_close -> assoc close_curly : '$1'.\nmap_close -> assoc_base ',' kw close_curly : reverse('$1', '$3').\n\nmap_args -> open_curly '}' : build_map('$1', []).\nmap_args -> open_curly map_close : build_map('$1', '$2').\nmap_args -> open_curly assoc_update close_curly : build_map_update('$1', '$2', []).\nmap_args -> open_curly assoc_update ',' close_curly : build_map_update('$1', '$2', []).\nmap_args -> open_curly assoc_update ',' map_close : build_map_update('$1', '$2', '$4').\nmap_args -> open_curly assoc_update_kw close_curly : build_map_update('$1', '$2', []).\n\nstruct_op -> '%' : '$1'.\n\nmap -> map_op map_args : '$2'.\nmap -> struct_op map_expr map_args : {'%', meta_from_token('$1'), ['$2', '$3']}.\nmap -> struct_op map_expr eol map_args : {'%', meta_from_token('$1'), ['$2', '$4']}.\n\nErlang code.\n\n-define(file(), get(elixir_parser_file)).\n-define(id(Token), element(1, Token)).\n-define(location(Token), element(2, Token)).\n-define(exprs(Token), element(3, Token)).\n-define(meta(Node), element(2, Node)).\n-define(rearrange_uop(Op), (Op == 'not' orelse Op == '!')).\n\n%% The following directive is needed for (significantly) faster\n%% compilation of the generated .erl file by the HiPE compiler\n-compile([{hipe, [{regalloc, linear_scan}]}]).\n-import(lists, [reverse/1, reverse/2]).\n\nmeta_from_token(Token, Counter) -> [{counter, Counter}|meta_from_token(Token)].\nmeta_from_token(Token) -> meta_from_location(?location(Token)).\n\nmeta_from_location({Line, Column, EndColumn})\n  when is_integer(Line), is_integer(Column), is_integer(EndColumn) -> [{line, Line}].\n\n%% Operators\n\nbuild_op({_Kind, Location, 'in'}, {UOp, _, [Left]}, Right) when ?rearrange_uop(UOp) ->\n  {UOp, meta_from_location(Location), [{'in', meta_from_location(Location), [Left, Right]}]};\n\nbuild_op({_Kind, Location, Op}, Left, Right) ->\n  {Op, meta_from_location(Location), [Left, Right]}.\n\nbuild_unary_op({_Kind, Location, Op}, Expr) ->\n  {Op, meta_from_location(Location), [Expr]}.\n\nbuild_list(Marker, Args) ->\n  {Args, ?location(Marker)}.\n\nbuild_tuple(_Marker, [Left, Right]) ->\n  {Left, Right};\nbuild_tuple(Marker, Args) ->\n  {'{}', meta_from_token(Marker), Args}.\n\nbuild_bit(Marker, Args) ->\n  {'<<>>', meta_from_token(Marker), Args}.\n\nbuild_map(Marker, Args) ->\n  {'%{}', meta_from_token(Marker), Args}.\n\nbuild_map_update(Marker, {Pipe, Left, Right}, Extra) ->\n  {'%{}', meta_from_token(Marker), [build_op(Pipe, Left, Right ++ Extra)]}.\n\n%% Blocks\n\nbuild_block([{Op, _, [_]}]=Exprs) when ?rearrange_uop(Op) -> {'__block__', [], Exprs};\nbuild_block([{unquote_splicing, _, Args}]=Exprs) when\n                                      length(Args) =< 2 -> {'__block__', [], Exprs};\nbuild_block([Expr])                                     -> Expr;\nbuild_block(Exprs)                                      -> {'__block__', [], Exprs}.\n\n%% Dots\n\nbuild_dot_alias(Dot, {'__aliases__', _, Left}, {'aliases', _, Right}) ->\n  {'__aliases__', meta_from_token(Dot), Left ++ Right};\n\nbuild_dot_alias(_Dot, Atom, {'aliases', _, _} = Token) when is_atom(Atom) ->\n  throw_bad_atom(Token);\n\nbuild_dot_alias(Dot, Other, {'aliases', _, Right}) ->\n  {'__aliases__', meta_from_token(Dot), [Other|Right]}.\n\nbuild_dot_container(Dot, Left, Right) ->\n  Meta = meta_from_token(Dot),\n  {{'.', Meta, [Left, '{}']}, Meta, Right}.\n\nbuild_dot(Dot, Left, Right) ->\n  {'.', meta_from_token(Dot), [Left, extract_identifier(Right)]}.\n\nextract_identifier({Kind, _, Identifier}) when\n    Kind == identifier; Kind == bracket_identifier; Kind == paren_identifier;\n    Kind == do_identifier; Kind == op_identifier ->\n  Identifier.\n\n%% Identifiers\n\nbuild_nested_parens(Dot, Args1, Args2) ->\n  Identifier = build_identifier(Dot, Args1),\n  Meta = ?meta(Identifier),\n  {Identifier, Meta, Args2}.\n\nbuild_identifier({'.', Meta, _} = Dot, Args) ->\n  FArgs = case Args of\n    nil -> [];\n    _ -> Args\n  end,\n  {Dot, Meta, FArgs};\n\nbuild_identifier({op_identifier, Location, Identifier}, [Arg]) ->\n  {Identifier, [{ambiguous_op, nil}|meta_from_location(Location)], [Arg]};\n\nbuild_identifier({_, Location, Identifier}, Args) ->\n  {Identifier, meta_from_location(Location), Args}.\n\n%% Fn\n\nbuild_fn(Op, [{'->', _, [_, _]}|_] = Stab) ->\n  {fn, meta_from_token(Op), build_stab(Stab)};\nbuild_fn(Op, _Stab) ->\n  throw(meta_from_token(Op), \"expected clauses to be defined with -> inside: \", \"'fn'\").\n\n%% Access\n\nbuild_access(Expr, {List, Location}) ->\n  Meta = meta_from_location(Location),\n  {{'.', Meta, ['Elixir.Access', get]}, Meta, [Expr, List]}.\n\n%% Interpolation aware\n\nbuild_sigil({sigil, Location, Sigil, Parts, Modifiers}) ->\n  Meta = meta_from_location(Location),\n  {list_to_atom(\"sigil_\" ++ [Sigil]), Meta, [{'<<>>', Meta, string_parts(Parts)}, Modifiers]}.\n\nbuild_bin_string({bin_string, _Location, [H]}) when is_binary(H) ->\n  H;\nbuild_bin_string({bin_string, Location, Args}) ->\n  {'<<>>', meta_from_location(Location), string_parts(Args)}.\n\nbuild_list_string({list_string, _Location, [H]}) when is_binary(H) ->\n  elixir_utils:characters_to_list(H);\nbuild_list_string({list_string, Location, Args}) ->\n  Meta = meta_from_location(Location),\n  {{'.', Meta, ['Elixir.String', to_char_list]}, Meta, [{'<<>>', Meta, string_parts(Args)}]}.\n\nbuild_quoted_atom({_, _Location, [H]}, Safe) when is_binary(H) ->\n  Op = binary_to_atom_op(Safe), erlang:Op(H, utf8);\nbuild_quoted_atom({_, Location, Args}, Safe) ->\n  Meta = meta_from_location(Location),\n  {{'.', Meta, [erlang, binary_to_atom_op(Safe)]}, Meta, [{'<<>>', Meta, string_parts(Args)}, utf8]}.\n\nbinary_to_atom_op(true)  -> binary_to_existing_atom;\nbinary_to_atom_op(false) -> binary_to_atom.\n\nstring_parts(Parts) ->\n  [string_part(Part) || Part <- Parts].\nstring_part(Binary) when is_binary(Binary) ->\n  Binary;\nstring_part({Location, Tokens}) ->\n  Form = string_tokens_parse(Tokens),\n  Meta = meta_from_location(Location),\n  {'::', Meta, [{{'.', Meta, ['Elixir.Kernel', to_string]}, Meta, [Form]}, {binary, Meta, nil}]}.\n\nstring_tokens_parse(Tokens) ->\n  case parse(Tokens) of\n    {ok, Forms} -> Forms;\n    {error, _} = Error -> throw(Error)\n  end.\n\n%% Keywords\n\nbuild_stab([{'->', Meta, [Left, Right]}|T]) ->\n  build_stab(Meta, T, Left, [Right], []);\n\nbuild_stab(Else) ->\n  build_block(Else).\n\nbuild_stab(Old, [{'->', New, [Left, Right]}|T], Marker, Temp, Acc) ->\n  H = {'->', Old, [Marker, build_block(reverse(Temp))]},\n  build_stab(New, T, Left, [Right], [H|Acc]);\n\nbuild_stab(Meta, [H|T], Marker, Temp, Acc) ->\n  build_stab(Meta, T, Marker, [H|Temp], Acc);\n\nbuild_stab(Meta, [], Marker, Temp, Acc) ->\n  H = {'->', Meta, [Marker, build_block(reverse(Temp))]},\n  reverse([H|Acc]).\n\n%% Every time the parser sees a (unquote_splicing())\n%% it assumes that a block is being spliced, wrapping\n%% the splicing in a __block__. But in the stab clause,\n%% we can have (unquote_splicing(1, 2, 3)) -> :ok, in such\n%% case, we don't actually want the block, since it is\n%% an arg style call. unwrap_splice unwraps the splice\n%% from such blocks.\nunwrap_splice([{'__block__', [], [{unquote_splicing, _, _}] = Splice}]) ->\n  Splice;\n\nunwrap_splice(Other) -> Other.\n\nunwrap_when(Args) ->\n  case elixir_utils:split_last(Args) of\n    {Start, {'when', Meta, [_, _] = End}} ->\n      [{'when', Meta, Start ++ End}];\n    {_, _} ->\n      Args\n  end.\n\nto_block([One]) -> One;\nto_block(Other) -> {'__block__', [], reverse(Other)}.\n\n%% Warnings and errors\n\nthrow(Meta, Error, Token) ->\n  Line =\n    case lists:keyfind(line, 1, Meta) of\n      {line, L} -> L;\n      false -> 0\n    end,\n  throw({error, {Line, ?MODULE, [Error, Token]}}).\n\nthrow_bad_atom(Token) ->\n  throw(meta_from_token(Token), \"atom cannot be followed by an alias. If the '.' was meant to be \"\n    \"part of the atom's name, the atom name must be quoted. Syntax error before: \", \"'.'\").\n\nthrow_no_parens_strict(Token) ->\n  throw(meta_from_token(Token), \"unexpected parentheses. If you are making a \"\n    \"function call, do not insert spaces between the function name and the \"\n    \"opening parentheses. Syntax error before: \", \"'('\").\n\nthrow_no_parens_many_strict(Node) ->\n  throw(?meta(Node),\n    \"unexpected comma. Parentheses are required to solve ambiguity in nested calls.\\n\\n\"\n    \"This error happens when you have nested function calls without parentheses. \"\n    \"For example:\\n\\n\"\n    \"    one a, two b, c, d\\n\\n\"\n    \"In the example above, we don't know if the parameters \\\"c\\\" and \\\"d\\\" apply \"\n    \"to the function \\\"one\\\" or \\\"two\\\". You can solve this by explicitly adding \"\n    \"parentheses:\\n\\n\"\n    \"    one a, two(b, c, d)\\n\\n\"\n    \"Elixir cannot compile otherwise. Syntax error before: \", \"','\").\n\nthrow_no_parens_container_strict(Node) ->\n  throw(?meta(Node),\n    \"unexpected comma. Parentheses are required to solve ambiguity inside containers.\\n\\n\"\n    \"This error may happen when you forget a comma in a list or other container:\\n\\n\"\n    \"    [a, b c, d]\\n\\n\"\n    \"Or when you have ambiguous calls:\\n\\n\"\n    \"    [one, two three, four, five]\\n\\n\"\n    \"In the example above, we don't know if the parameters \\\"four\\\" and \\\"five\\\" \"\n    \"belongs to the list or the function \\\"two\\\". You can solve this by explicitly \"\n    \"adding parentheses:\\n\\n\"\n    \"    [one, two(three, four), five]\\n\\n\"\n    \"Elixir cannot compile otherwise. Syntax error before: \", \"','\").\n\nthrow_invalid_kw_identifier({_, _, do} = Token) ->\n  throw(meta_from_token(Token), elixir_tokenizer:invalid_do_error(\"unexpected keyword \\\"do:\\\"\"), \"'do:'\");\nthrow_invalid_kw_identifier({_, _, KW} = Token) ->\n  throw(meta_from_token(Token), \"syntax error before: \", \"'\" ++ atom_to_list(KW) ++ \"':\").\n\n%% TODO: Make those warnings errors.\nwarn_empty_stab_clause({stab_op, {Line, _Begin, _End}, '->'}) ->\n  elixir_errors:warn(Line, ?file(),\n    \"an expression is always required on the right side of ->. \"\n    \"Please provide a value after ->\").\n\nwarn_pipe({arrow_op, {Line, _Begin, _End}, Op}, {_, [_|_], [_|_]}) ->\n  elixir_errors:warn(Line, ?file(),\n    io_lib:format(\n      \"you are piping into a function call without parentheses, which may be ambiguous. \"\n      \"Please wrap the function you are piping into in parentheses. For example:\\n\\n\"\n      \"    foo 1 ~ts bar 2 ~ts baz 3\\n\\n\"\n      \"Should be written as:\\n\\n\"\n      \"    foo(1) ~ts bar(2) ~ts baz(3)\\n\",\n      [Op, Op, Op, Op]\n    )\n  );\nwarn_pipe(_Token, _) ->\n  ok.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/factorial",
    "content": "#!/usr/bin/env escript\n%% -*- erlang -*-\n%%! -smp enable -sname factorial -mnesia debug verbose\nmain([String]) ->\n    try\n        N = list_to_integer(String),\n        F = fac(N),\n        io:format(\"factorial ~w = ~w\\n\", [N,F])\n    catch\n        _:_ ->\n            usage()\n    end;\nmain(_) ->\n    usage().\n\nusage() ->\n    io:format(\"usage: factorial integer\\n\"),\n    halt(1).\n\nfac(0) -> 1;\nfac(N) -> N * fac(N-1).\n"
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/filenames/Emakefile",
    "content": "{\"src/*\", [\n   report, \n   verbose, \n   {i, \"include\"}, \n   {outdir, \"ebin\"},\n   debug_info \n]}.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/filenames/rebar.config",
    "content": "%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-\n%% ex: ts=4 sw=4 ft=erlang et\n%% This is a sample rebar.conf file that shows examples of some of rebar's\n%% options.\n\n%% == Core ==\n\n%% Extend list of always recursive commands\n{recursive_cmds, []}.\n\n%% Check required ERTS or OTP release version\n{require_erts_vsn, \".*\"}.\n{require_otp_vsn, \".*\"}.\n{require_min_otp_vsn, \".*\"}.\n\n%% Additional library directories to add to the code path\n{lib_dirs, []}.\n\n%% == Erlang Compiler ==\n\n%% Erlang files to compile before the rest. Rebar automatically compiles\n%% parse_transforms and custom behaviours before anything other than the files\n%% in this list.\n{erl_first_files, [\"src/mymib1.erl\", \"src/mymib2.erl\"]}.\n\n%% Erlang compiler options\n{erl_opts, [no_debug_info,\n            {i, \"myinclude\"},\n            {src_dirs, [\"src\", \"src2\", \"src3\"]},\n            {platform_define,\n             \"(linux|solaris|freebsd|darwin)\", 'HAVE_SENDFILE'},\n            {platform_define, \"(linux|freebsd)\", 'BACKLOG', 128},\n            {platform_define, \"R13\", 'old_inets'}]}.\n\n%% MIB Options?\n{mib_opts, []}.\n\n%% SNMP mibs to compile first?\n{mib_first_files, []}.\n\n%% leex options\n{xrl_opts, []}.\n\n%% leex files to compile first\n{xrl_first_files, []}.\n\n%% yecc options\n{yrl_opts, []}.\n\n%% yecc files to compile first\n{yrl_first_files, []}.\n\n%% == EDoc ==\n\n%% EDoc options\n{edoc_opts, []}.\n\n%% == Port Compiler ==\n\n%% Port compilation environment variables. See rebar_port_compiler.erl for\n%% more info. Default is `[]'\n{port_env, [{\"CFLAGS\", \"$CFLAGS -Ifoo\"},\n            {\"freebsd\", \"LDFLAGS\", \"$LDFLAGS -lfoo\"}]}.\n\n%% port_specs\n%% List of filenames or wildcards to be compiled. May also contain a tuple\n%% consisting of a regular expression to be applied against the system\n%% architecture as a filter.\n{port_specs, [{\"priv/so_name.so\", [\"c_src/*.c\"]},\n              {\"linux\", \"priv/hello_linux\", [\"c_src/hello_linux.c\"]},\n              {\"linux\", \"priv/hello_linux\", [\"c_src/*.c\"], [{env, []}]}]}.\n\n%% == escriptize ==\n{escript_name, \"application\"}.\n{escript_incl_apps, []}.\n{escript_shebang, \"#!/usr/bin/env escript\\n\"}.\n{escript_comment, \"%%\\n\"}.\n{escript_emu_args, \"%%! -pa application/application/ebin\\n\"}.\n\n%% == LFE Compiler ==\n\n%% LFE files to compile before the rest\n{lfe_first_files, []}.\n\n%% Options for the LFE compiler: reuse {erl_opts, []}\n\n%% == ErlyDTL Compiler ==\n\n%% Options for the ErlyDTL compiler\n{erlydtl_opts, []}.\n\n%% == Proto compiler ==\n{proto_opts, [\n    {compiler, protobuffs},\n    {src_dirs, [\"src\"]}\n]}.\n%% Available compilers for protocol buffer files (*.proto):\n%%   protobuffs  (default)\n%%   gpb\n%% Optional src_dirs which is a list of directories where\n%% to look for .proto files, default is src\n\n%% Options for the gpb protocol buffer compiler,\n%% if selected by the proto_compiler option\n{gpb_opts, []}.\n\n%% == EUnit ==\n\n%% Options for eunit:test()\n{eunit_opts, []}.\n\n%% Additional compile options for eunit. erl_opts is also used\n{eunit_compile_opts, []}.\n\n%% Same as erl_first_files, but used only when running 'eunit'\n{eunit_first_files, []}.\n\n%% == Cover ==\n\n%% Whether to enable coverage reporting. Default is `false'\n{cover_enabled, false}.\n\n%% Whether to print coverage report to console. Default is `false'\n{cover_print_enabled, false}.\n\n%% Whether to export coverage report to file. Default is `false'\n{cover_export_enabled, false}.\n\n%% == Common Test ==\n\n%% Override the default \"test\" directory in which SUITEs are located\n{ct_dir, \"itest\"}.\n\n%% Override the default \"logs\" directory in which SUITEs are logged\n{ct_log_dir, \"test/logs\"}.\n\n%% Option to pass extra parameters when launching Common Test\n{ct_extra_params, \"-boot start_sasl -s myapp\"}.\n\n%% Option to use short names (i.e., -sname test) when starting ct\n{ct_use_short_names, true}.\n\n%% == QuickCheck ==\n\n%% If qc_mod is unspecified, rebar tries to detect Triq or EQC\n{qc_opts, [{qc_mod, module()}, Options]}.\n\n%% Additional compile options for qc. erl_opts is also used\n{qc_compile_opts, []}.\n\n%% Same as erl_first_files, but used only when running 'qc'\n{qc_first_files, []}.\n\n%% == Cleanup ==\n\n%% Which files to cleanup\n{clean_files, [\"file\", \"file2\"]}.\n\n%% == OTP Applications ==\n\n%% Enable validation of the OTP app module list. Default is 'true'\n{validate_app_modules, true}.\n\n%% == Dependencies ==\n\n%% Where to put any downloaded dependencies. Default is \"deps\"\n{deps_dir, \"deps\"}.\n\n%% What dependencies we have, dependencies can be of 3 forms, an application\n%% name as an atom, eg. mochiweb, a name and a version (from the .app file), or\n%% an application name, a version and the SCM details on how to fetch it (SCM\n%% type, location and revision).\n%% Rebar currently supports git, hg, bzr, svn, rsync, fossil, and p4.\n{deps, [app_name,\n        {rebar, \"1.0.*\"},\n        {rebar, \".*\",\n         {git, \"git://github.com/rebar/rebar.git\"}},\n        {rebar, \".*\",\n         {git, \"git://github.com/rebar/rebar.git\", \"Rev\"}},\n        {rebar, \"1.0.*\",\n         {git, \"git://github.com/rebar/rebar.git\", {branch, \"master\"}}},\n        {rebar, \"1.0.0\",\n         {git, \"git://github.com/rebar/rebar.git\", {tag, \"1.0.0\"}}},\n        %% Dependencies can be marked as 'raw'. Rebar does not require\n        %% such dependencies to have a standard Erlang/OTP layout\n        %% which assumes the presence of either\n        %% \"src/dependency_name.app.src\" or \"ebin/dependency_name.app\"\n        %% files.\n        %%\n        %% 'raw' dependencies can still contain 'rebar.config' and\n        %% even can have the proper OTP directory layout, but they\n        %% won't be compiled.\n        %%\n        %% Only a subset of rebar commands will be executed on the\n        %% 'raw' subdirectories: get-deps, update-deps, check-deps,\n        %% list-deps and delete-deps.\n        {rebar, \"\",\n         {git, \"git://github.com/rebar/rebar.git\", {branch, \"master\"}},\n         [raw]},\n        {app_name, \".*\", {hg, \"https://www.example.org/url\"}},\n        {app_name, \".*\", {rsync, \"Url\"}},\n        {app_name, \".*\", {svn, \"https://www.example.org/url\"}},\n        {app_name, \".*\", {svn, \"svn://svn.example.org/url\"}},\n        {app_name, \".*\", {bzr, \"https://www.example.org/url\", \"Rev\"}},\n        {app_name, \".*\", {fossil, \"https://www.example.org/url\"}},\n        {app_name, \".*\", {fossil, \"https://www.example.org/url\", \"Vsn\"}},\n        {app_name, \".*\", {p4, \"//depot/subdir/app_dir\"}}]}.\n\n%% == Subdirectories ==\n\n%% Subdirectories?\n{sub_dirs, [\"dir1\", \"dir2\"]}.\n\n%% == Plugins ==\n\n%% Plugins you wish to include.\n%% These can include any module on the code path, including deps.\n%% Alternatively, plugins can be placed as source files in the plugin_dir, in\n%% which case they will be compiled and loaded dynamically at runtime.\n{plugins, [plugin1, plugin2]}.\n\n%% Override the directory in which plugin sources can be found.\n%% Defaults to ./plugins\n{plugin_dir, \"some_other_directory\"}.\n\n\n%% == Pre/Post Command Hooks ==\n\n{pre_hooks, [{clean, \"./prepare_package_files.sh\"},\n             {\"linux\", compile, \"c_src/build_linux.sh\"},\n             {compile, \"escript generate_headers\"},\n             {compile, \"escript check_headers\"}]}.\n\n{post_hooks, [{clean, \"touch file1.out\"},\n              {\"freebsd\", compile, \"c_src/freebsd_tweaks.sh\"},\n              {eunit, \"touch file2.out\"},\n              {compile, \"touch postcompile.out\"}]}.\n\n%% == xref ==\n\n{xref_warnings, false}.\n\n%% optional extra paths to include in xref:set_library_path/2.\n%% specified relative location of rebar.config.\n%% e.g. {xref_extra_paths,[\"../gtknode/src\"]}\n{xref_extra_paths,[]}.\n\n%% xref checks to run\n{xref_checks, [undefined_function_calls, undefined_functions,\n               locals_not_used, exports_not_used,\n               deprecated_function_calls, deprecated_functions]}.\n\n%% Optional custom xref queries (xref manual has details) specified as\n%%     {xref_queries, [{query_string(), expected_query_result()},...]}\n%% The following for example removes all references to mod:*foo/4\n%% functions from undefined external function calls as those are in a\n%% generated module\n{xref_queries,\n [{\"(XC - UC) || (XU - X - B\"\n   \" - (\\\"mod\\\":\\\".*foo\\\"/\\\"4\\\"))\",[]}]}.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/hello.escript",
    "content": "#!/usr/bin/env escript\n-export([main/1]).\n\nmain([]) -> io:format(\"Hello, World!~n\").\n"
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/lfe_scan.xrl",
    "content": "%% Copyright (c) 2008-2013 Robert Virding\n%%\n%% Licensed under the Apache License, Version 2.0 (the \"License\");\n%% you may not use this file except in compliance with the License.\n%% You may obtain a copy of the License at\n%%\n%%     http://www.apache.org/licenses/LICENSE-2.0\n%%\n%% Unless required by applicable law or agreed to in writing, software\n%% distributed under the License is distributed on an \"AS IS\" BASIS,\n%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n%% See the License for the specific language governing permissions and\n%% limitations under the License.\n\n%% File    : lfe_scan.xrl\n%% Author  : Robert Virding\n%% Purpose : Token definitions for Lisp Flavoured Erlang.\n\nDefinitions.\nB    = [01]\nO    = [0-7]\nD    = [0-9]\nH    = [0-9a-fA-F]\nB36  = [0-9a-zA-Z]\nU    = [A-Z]\nL    = [a-z]\nA    = ({U}|{L})\nDEL  = [][()}{\";\\000-\\s]\nSYM  = [^][()}{\";\\000-\\s\\177-\\237]\nSSYM = [^][()}{\"|;#`',\\000-\\s\\177-\\237]\nWS   = ([\\000-\\s]|;[^\\n]*)\n\nRules.\n%% Bracketed Comments using #| foo |#\n#{D}*\\|[^\\|]*\\|+([^#\\|][^\\|]*\\|+)*# :\n        block_comment(string:substr(TokenChars, 3)).\n\n%% Separators\n'               :    {token,{'\\'',TokenLine}}.\n`               :    {token,{'`',TokenLine}}.\n,               :    {token,{',',TokenLine}}.\n,@              :    {token,{',@',TokenLine}}.\n\\.              :    {token,{'.',TokenLine}}.\n[][()}{]        :    {token,{list_to_atom(TokenChars),TokenLine}}.\n\n#{D}*[bB]\\(     :    {token,{'#B(',TokenLine}}.\n#{D}*[mM]\\(     :    {token,{'#M(',TokenLine}}.\n#{D}*\\(         :    {token,{'#(',TokenLine}}.\n#{D}*\\.         :    {token,{'#.',TokenLine}}.\n\n#{D}*`          :    {token,{'#`',TokenLine}}.\n#{D}*;          :    {token,{'#;',TokenLine}}.\n#{D}*,          :    {token,{'#,',TokenLine}}.\n#{D}*,@         :    {token,{'#,@',TokenLine}}.\n\n%% Characters\n#{D}*\\\\(x{H}+|.) :   char_token(skip_past(TokenChars, $\\\\, $\\\\), TokenLine).\n\n%% Based numbers\n#{D}*\\*{SYM}+   :    base_token(skip_past(TokenChars, $*, $*), 2, TokenLine).\n#{D}*[bB]{SYM}+ :    base_token(skip_past(TokenChars, $b, $B), 2, TokenLine).\n#{D}*[oO]{SYM}+ :    base_token(skip_past(TokenChars, $o, $O), 8, TokenLine).\n#{D}*[dD]{SYM}+ :    base_token(skip_past(TokenChars, $d, $D), 10, TokenLine).\n#{D}*[xX]{SYM}+ :    base_token(skip_past(TokenChars, $x, $X), 16, TokenLine).\n#{D}*[rR]{SYM}+ :\n        %% Scan over digit chars to get base.\n        {Base,[_|Ds]} = base1(tl(TokenChars), 10, 0),\n        base_token(Ds, Base, TokenLine).\n\n%% String\n\"(\\\\x{H}+;|\\\\.|[^\"\\\\])*\" :\n        %% Strip quotes.\n        S = string:substr(TokenChars, 2, TokenLen - 2),\n        {token,{string,TokenLine,chars(S)}}.\n%% Binary string\n#\"(\\\\x{H}+;|\\\\.|[^\"\\\\])*\" :\n        %% Strip quotes.\n        S = string:substr(TokenChars, 3, TokenLen - 3),\n        Bin = unicode:characters_to_binary(chars(S), utf8, utf8),\n        {token,{binary,TokenLine,Bin}}.\n%% Symbols\n\\|(\\\\x{H}+;|\\\\.|[^|\\\\])*\\| :\n        %% Strip quotes.\n        S = string:substr(TokenChars, 2, TokenLen - 2),\n        symbol_token(chars(S), TokenLine).\n%% Funs\n#'{SSYM}{SYM}*/{D}+ :\n        %% Strip sharpsign single-quote.\n        FunStr = string:substr(TokenChars,3),\n        {token,{'#\\'',TokenLine,FunStr}}.\n%% Atoms\n[+-]?{D}+       :\n        case catch {ok,list_to_integer(TokenChars)} of\n            {ok,I} -> {token,{number,TokenLine,I}};\n            _ -> {error,\"illegal integer\"}\n        end.\n[+-]?{D}+\\.{D}+([eE][+-]?{D}+)? :\n        case catch {ok,list_to_float(TokenChars)} of\n            {ok,F} -> {token,{number,TokenLine,F}};\n            _ -> {error,\"illegal float\"}\n        end.\n{SSYM}{SYM}*    :\n        symbol_token(TokenChars, TokenLine).\n{WS}+           :    skip_token.\n\nErlang code.\n%% Copyright (c) 2008-2013 Robert Virding\n%%\n%% Licensed under the Apache License, Version 2.0 (the \"License\");\n%% you may not use this file except in compliance with the License.\n%% You may obtain a copy of the License at\n%%\n%%     http://www.apache.org/licenses/LICENSE-2.0\n%%\n%% Unless required by applicable law or agreed to in writing, software\n%% distributed under the License is distributed on an \"AS IS\" BASIS,\n%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n%% See the License for the specific language governing permissions and\n%% limitations under the License.\n\n%% File    : lfe_scan.erl\n%% Author  : Robert Virding\n%% Purpose : Token definitions for Lisp Flavoured Erlang.\n\n-export([start_symbol_char/1,symbol_char/1]).\n\n-import(string, [substr/2,substr/3]).\n\n%% start_symbol_char(Char) -> true | false.\n%% symbol_char(Char) -> true | false.\n%%  Define start symbol chars and symbol chars.\n\nstart_symbol_char($#) -> false;\nstart_symbol_char($`) -> false;\nstart_symbol_char($') -> false;                 %'\nstart_symbol_char($,) -> false;\nstart_symbol_char($|) -> false;                 %Symbol quote character\nstart_symbol_char(C) -> symbol_char(C).\n\nsymbol_char($() -> false;\nsymbol_char($)) -> false;\nsymbol_char($[) -> false;\nsymbol_char($]) -> false;\nsymbol_char(${) -> false;\nsymbol_char($}) -> false;\nsymbol_char($\") -> false;\nsymbol_char($;) -> false;\nsymbol_char(C) -> ((C > $\\s) and (C =< $~)) orelse (C > $\\240).\n\n%% symbol_token(Chars, Line) -> {token,{symbol,Line,Symbol}} | {error,E}.\n%%  Build a symbol from list of legal characters, else error.\n\nsymbol_token(Cs, L) ->\n    case catch {ok,list_to_atom(Cs)} of\n        {ok,S} -> {token,{symbol,L,S}};\n        _ -> {error,\"illegal symbol\"}\n    end.\n\n%% base_token(Chars, Base, Line) -> Integer.\n%%  Convert a string of Base characters into a number. We only allow\n%%  base betqeen 2 and 36, and an optional sign character first.\n\nbase_token(_, B, _) when B < 2; B > 36 ->\n    {error,\"illegal number base\"};\nbase_token([$+|Cs], B, L) -> base_token(Cs, B, +1, L);\nbase_token([$-|Cs], B, L) -> base_token(Cs, B, -1, L);\nbase_token(Cs, B, L) -> base_token(Cs, B, +1, L).\n\nbase_token(Cs, B, S, L) ->\n    case base1(Cs, B, 0) of\n        {N,[]} -> {token,{number,L,S*N}};\n        {_,_} -> {error,\"illegal based number\"}\n    end.\n\nbase1([C|Cs], Base, SoFar) when C >= $0, C =< $9, C < Base + $0 ->\n    Next = SoFar * Base + (C - $0),\n    base1(Cs, Base, Next);\nbase1([C|Cs], Base, SoFar) when C >= $a, C =< $z, C < Base + $a - 10 ->\n    Next = SoFar * Base + (C - $a + 10),\n    base1(Cs, Base, Next);\nbase1([C|Cs], Base, SoFar) when C >= $A, C =< $Z, C < Base + $A - 10 ->\n    Next = SoFar * Base + (C - $A + 10),\n    base1(Cs, Base, Next);\nbase1([C|Cs], _Base, SoFar) -> {SoFar,[C|Cs]};\nbase1([], _Base, N) -> {N,[]}.\n\n-define(IS_UNICODE(C), ((C >= 0) and (C =< 16#10FFFF))).\n\n%% char_token(InputChars, Line) -> {token,{number,L,N}} | {error,E}.\n%%  Convert an input string into the corresponding character. For a\n%%  sequence of hex characters we check resultant is code is in the\n%%  unicode range.\n\nchar_token([$x,C|Cs], L) ->\n    case base1([C|Cs], 16, 0) of\n        {N,[]} when ?IS_UNICODE(N) -> {token,{number,L,N}};\n        _ -> {error,\"illegal character\"}\n    end;\nchar_token([C], L) -> {token,{number,L,C}}.\n\n%% chars(InputChars) -> Chars.\n%%  Convert an input string into the corresponding string characters.\n%%  We know that the input string is correct.\n\nchars([$\\\\,$x,C|Cs0]) ->\n    case hex_char(C) of\n        true ->\n            case base1([C|Cs0], 16, 0) of\n                {N,[$;|Cs1]} -> [N|chars(Cs1)];\n                _Other -> [escape_char($x)|chars([C|Cs0])]\n            end;\n        false -> [escape_char($x)|chars([C|Cs0])]\n    end;\nchars([$\\\\,C|Cs]) -> [escape_char(C)|chars(Cs)];\nchars([C|Cs]) -> [C|chars(Cs)];\nchars([]) -> [].\n\nhex_char(C) when C >= $0, C =< $9 -> true;\nhex_char(C) when C >= $a, C =< $f -> true;\nhex_char(C) when C >= $A, C =< $F -> true;\nhex_char(_) -> false.\n\nescape_char($b) -> $\\b;                %\\b = BS\nescape_char($t) -> $\\t;                %\\t = TAB\nescape_char($n) -> $\\n;                %\\n = LF\nescape_char($v) -> $\\v;                %\\v = VT\nescape_char($f) -> $\\f;                %\\f = FF\nescape_char($r) -> $\\r;                %\\r = CR\nescape_char($e) -> $\\e;                %\\e = ESC\nescape_char($s) -> $\\s;                %\\s = SPC\nescape_char($d) -> $\\d;                %\\d = DEL\nescape_char(C) -> C.\n\n%% Block Comment:\n%%  Provide a sensible error when people attempt to include nested\n%%  comments because currently the parser cannot process them without\n%%  a rebuild. But simply exploding on a '#|' is not going to be that\n%%  helpful.\n\nblock_comment(TokenChars) ->\n    %% Check we're not opening another comment block.\n    case string:str(TokenChars, \"#|\") of\n        0 -> skip_token; %% No nesting found\n        _ -> {error, \"illegal nested block comment\"}\n    end.\n\n%% skip_until(String, Char1, Char2) -> String.\n%% skip_past(String, Char1, Char2) -> String.\n\n%% skip_until([C|_]=Cs, C1, C2) when C =:= C1 ; C =:= C2 -> Cs;\n%% skip_until([_|Cs], C1, C2) -> skip_until(Cs, C1, C2);\n%% skip_until([], _, _) -> [].\n\nskip_past([C|Cs], C1, C2) when C =:= C1 ; C =:= C2 -> Cs;\nskip_past([_|Cs], C1, C2) -> skip_past(Cs, C1, C2);\nskip_past([], _, _) -> [].\n"
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/record_helper.erl",
    "content": "%% For each header file, it scans thru all records and create helper functions\n%% Helper functions are:\n%% setters, getters, fields, fields_atom, type\n\n-module(record_helper).\n\n-export([make/1, make/2]).\n\nmake(HeaderFiles) ->\n    make([ atom_to_list(X) || X <- HeaderFiles ], \".\").\n\n%% .hrl file, relative to current dir\nmake(HeaderFiles, OutDir) ->\n    ModuleName = \"record_utils\",\n    HeaderComment = \"%% This is auto generated file. Please don't edit it\\n\\n\",\n    ModuleDeclaration = \"-module(\" ++ ModuleName ++ \").\\n\"\n\t++ \"-author(\\\"trung@mdkt.org\\\").\\n\"\n\t++ \"-compile(export_all).\\n\"\n\t++ [ \"-include(\\\"\" ++ X ++ \"\\\").\\n\" || X <- HeaderFiles ]\n\t++ \"\\n\",\n    Src = format_src(lists:sort(lists:flatten([read(X) || X <- HeaderFiles] ++ [generate_type_default_function()]))),\n    file:write_file(OutDir++\"/\" ++ ModuleName ++ \".erl\", list_to_binary([HeaderComment, ModuleDeclaration, Src])).\n\nread(HeaderFile) ->\n    try epp:parse_file(HeaderFile,[],[]) of\n\t{ok, Tree} ->\n\t    parse(Tree);\n\t{error, Error} ->\n\t    {error, {\"Error parsing header file\", HeaderFile, Error}}\n    catch\n\t_:Error ->\n\t    {catched_error, {\"Error parsing header file\", HeaderFile, Error}}\n    end.\n\nformat_src([{_, _, _, Src}|T]) when length(T) == 0 ->\n    Src ++ \".\\n\\n\";\nformat_src([{Type, _, _, Src}|[{Type, A, B, NSrc}|T]]) ->\n    Src ++ \";\\n\\n\" ++ format_src([{Type, A, B, NSrc}|T]);\nformat_src([{_Type, _, _, Src}|[{Type1, A, B, NSrc}|T]]) ->\n    Src ++ \".\\n\\n\" ++ format_src([{Type1, A, B, NSrc}|T]);\nformat_src([{_, _, _, Src}|T]) when length(T) > 0 ->\n    Src ++ \";\\n\\n\" ++ format_src(T).\n\nparse(Tree) ->\n    [ parse_record(X) || X <- Tree ].\n\nparse_record({attribute, _, record, RecordInfo}) ->\n    {RecordName, RecordFields} = RecordInfo,\n    if\n\tlength(RecordFields) == 1 ->\n\t    lists:flatten([ generate_setter_getter_function(RecordName, X) || X <- RecordFields ]\n\t\t  ++ [generate_type_function(RecordName)]);\n\ttrue ->\n\t    lists:flatten([generate_fields_function(RecordName, RecordFields)]\n\t\t\t  ++ [generate_fields_atom_function(RecordName, RecordFields)]\n\t\t\t  ++ [ generate_setter_getter_function(RecordName, X) || X <- RecordFields ]\n\t\t  ++ [generate_type_function(RecordName)])\n    end;\nparse_record(_) -> [].\n\nparse_field_name({record_field, _, {atom, _, FieldName}}) ->\n    {field, \"\\\"\" ++ atom_to_list(FieldName) ++ \"\\\"\"};\nparse_field_name({record_field, _, {atom, _, _FieldName}, {record, _, ParentRecordName, _}}) ->\n\t{parent_field, \"fields(\" ++ atom_to_list(ParentRecordName) ++ \")\"};\nparse_field_name({record_field, _, {atom, _, FieldName}, _}) ->\n    {field, \"\\\"\" ++ atom_to_list(FieldName) ++ \"\\\"\"}.\n\nparse_field_name_atom({record_field, _, {atom, _, FieldName}}) ->\n    atom_to_list(FieldName);\nparse_field_name_atom({record_field, _, {atom, _, _FieldName}, {record, _, ParentRecordName, _}}) ->\n\t\"fields_atom(\" ++ atom_to_list(ParentRecordName) ++ \")\";\nparse_field_name_atom({record_field, _, {atom, _, FieldName}, _}) ->\n    atom_to_list(FieldName).\n\nconcat([], _S) -> [];\nconcat([F|T], _S) when length(T) == 0 -> F;\nconcat([F|T], S) -> F ++ S ++ concat(T, S).\n\nconcat_ext([], _S) -> [];\nconcat_ext([F|T], S) -> F ++ S ++ concat_ext(T, S).\n\nparse_field([], AccFields, AccParentFields) -> concat_ext(AccParentFields, \" ++ \") ++ \"[\" ++ concat(AccFields, \", \") ++ \"]\";\n%parse_field([F|T], AccFields, AccParentFields) when length(T) == 0 -> parse_field_name(F);\nparse_field([F|T], AccFields, AccParentFields) ->\n\tcase parse_field_name(F) of\n\t\t{field, Field} ->\n\t\t\tparse_field(T, AccFields ++ [Field], AccParentFields);\n\t\t{parent_field, PField} ->\n\t\t\tparse_field(T, AccFields, AccParentFields ++ [PField])\n\tend.\n\nparse_field_atom([F|T]) when length(T) == 0 -> parse_field_name_atom(F);\nparse_field_atom([F|T]) ->\n    parse_field_name_atom(F) ++ \", \" ++ parse_field_atom(T).\n\ngenerate_type_default_function() ->\n\t{type, zzz, 99, \"type(_) -> undefined\"}.\n\ngenerate_type_function(RecordName) ->\n    {type, RecordName, 0, \"type(Obj) when is_record(Obj, \" ++ atom_to_list(RecordName) ++ \") -> \" ++ atom_to_list(RecordName)}.\n\ngenerate_fields_function(RecordName, RecordFields) ->\n    Fields = parse_field(RecordFields, [], []),\n    {field, RecordName, 1, \"fields(\" ++ atom_to_list(RecordName) ++ \") -> \\n\\t\" ++ Fields}.\n\ngenerate_fields_atom_function(RecordName, RecordFields) ->\n    Fields = parse_field_atom(RecordFields),\n    {field_atom, RecordName, 1, \"fields_atom(\" ++ atom_to_list(RecordName) ++ \") -> \\n\\tlists:flatten([\" ++ Fields ++ \"])\"}.\n\ngenerate_setter_getter_function(RecordName, {record_field, _, {atom, _, FieldName}, {record, _, ParentRecordName, _}}) ->\n    to_setter_getter_function(atom_to_list(RecordName), atom_to_list(FieldName), atom_to_list(ParentRecordName));\ngenerate_setter_getter_function(RecordName, {record_field, _, {atom, _, FieldName}, _}) ->\n    to_setter_getter_function(atom_to_list(RecordName), atom_to_list(FieldName));\ngenerate_setter_getter_function(RecordName, {record_field, _, {atom, _, FieldName}}) ->\n    to_setter_getter_function(atom_to_list(RecordName), atom_to_list(FieldName)).\n\nto_setter_getter_function(RecordName, FieldName) ->\n    [{setter, RecordName, 1, \"set(Obj, \" ++ FieldName ++ \", Value) when is_record(Obj, \" ++ RecordName ++ \") -> \\n\"\n\t++ \"\\tNewObj = Obj#\" ++ RecordName ++ \"{\" ++ FieldName ++ \" = Value},\\n\"\n\t++ \"\\t{ok, NewObj, {\" ++ FieldName ++ \", Value}}\"},\n\t{getter, RecordName, 1, \"get(Obj, \" ++ FieldName ++ \") when is_record(Obj, \" ++ RecordName ++ \") -> \\n\"\n\t++ \"\\t{ok, Obj#\" ++ RecordName ++ \".\" ++ FieldName ++ \"}\"}\n\t].\n\nto_setter_getter_function(RecordName, FieldName, ParentRecordName) ->\n    [{setter, RecordName, 2, \"set(Obj, \" ++ FieldName ++ \", Value) when is_record(Obj, \" ++ RecordName ++ \") and is_record(Value, \" ++ ParentRecordName ++ \") -> \\n\"\n     ++ \"\\tNewObj = Obj#\" ++ RecordName ++ \"{\" ++ FieldName ++ \" = Value},\\n\"\n     ++ \"\\t{ok, NewObj, {\" ++ FieldName ++ \", Value}};\\n\\n\"\n     ++ \"set(Obj, ParentProperty, Value) when is_record(Obj, \" ++ RecordName ++ \") and is_atom(ParentProperty) -> \\n\"\n     ++ \"\\t{ok, NewParentObject, _} = set(Obj#\" ++ RecordName ++ \".parent, ParentProperty, Value),\\n\"\n     ++ \"\\tset(Obj, parent, NewParentObject)\"},\n\t{getter, RecordName, 2, \"get(Obj, \" ++ FieldName ++ \") when is_record(Obj, \" ++ RecordName ++ \") -> \\n\"\n\t ++ \"\\t{ok, Obj#\" ++ RecordName ++ \".\" ++ FieldName ++ \"};\\n\\n\"\n     ++ \"get(Obj, ParentProperty) when is_record(Obj, \" ++ RecordName ++ \") and is_atom(ParentProperty) -> \\n\"\n     ++ \"\\tget(Obj#\" ++ RecordName ++ \".parent, ParentProperty)\"}\n\t]."
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/record_utils.erl",
    "content": "%% This is auto generated file. Please don't edit it\n\n-module(record_utils).\n-compile(export_all).\n-include(\"messages.hrl\").\n\nfields(abstract_message) ->\n\t[\"clientId\", \"destination\", \"messageId\", \"timestamp\", \"timeToLive\", \"headers\", \"body\"];\n\nfields(async_message) ->\n\tfields(abstract_message) ++ [\"correlationId\", \"correlationIdBytes\"].\n\nfields_atom(abstract_message) ->\n\tlists:flatten([clientId, destination, messageId, timestamp, timeToLive, headers, body]);\n\nfields_atom(async_message) ->\n\tlists:flatten([fields_atom(abstract_message), correlationId, correlationIdBytes]).\n\nget(Obj, body) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.body};\n\nget(Obj, clientId) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.clientId};\n\nget(Obj, destination) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.destination};\n\nget(Obj, headers) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.headers};\n\nget(Obj, messageId) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.messageId};\n\nget(Obj, timeToLive) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.timeToLive};\n\nget(Obj, timestamp) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.timestamp};\n\nget(Obj, correlationId) when is_record(Obj, async_message) ->\n\t{ok, Obj#async_message.correlationId};\n\nget(Obj, correlationIdBytes) when is_record(Obj, async_message) ->\n\t{ok, Obj#async_message.correlationIdBytes};\n\nget(Obj, parent) when is_record(Obj, async_message) ->\n\t{ok, Obj#async_message.parent};\n\nget(Obj, ParentProperty) when is_record(Obj, async_message) and is_atom(ParentProperty) ->\n\tget(Obj#async_message.parent, ParentProperty).\n\nset(Obj, body, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{body = Value},\n\t{ok, NewObj, {body, Value}};\n\nset(Obj, clientId, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{clientId = Value},\n\t{ok, NewObj, {clientId, Value}};\n\nset(Obj, destination, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{destination = Value},\n\t{ok, NewObj, {destination, Value}};\n\nset(Obj, headers, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{headers = Value},\n\t{ok, NewObj, {headers, Value}};\n\nset(Obj, messageId, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{messageId = Value},\n\t{ok, NewObj, {messageId, Value}};\n\nset(Obj, timeToLive, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{timeToLive = Value},\n\t{ok, NewObj, {timeToLive, Value}};\n\nset(Obj, timestamp, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{timestamp = Value},\n\t{ok, NewObj, {timestamp, Value}};\n\nset(Obj, correlationId, Value) when is_record(Obj, async_message) ->\n\tNewObj = Obj#async_message{correlationId = Value},\n\t{ok, NewObj, {correlationId, Value}};\n\nset(Obj, correlationIdBytes, Value) when is_record(Obj, async_message) ->\n\tNewObj = Obj#async_message{correlationIdBytes = Value},\n\t{ok, NewObj, {correlationIdBytes, Value}};\n\nset(Obj, parent, Value) when is_record(Obj, async_message) and is_record(Value, abstract_message) ->\n\tNewObj = Obj#async_message{parent = Value},\n\t{ok, NewObj, {parent, Value}};\n\nset(Obj, ParentProperty, Value) when is_record(Obj, async_message) and is_atom(ParentProperty) ->\n\t{ok, NewParentObject, _} = set(Obj#async_message.parent, ParentProperty, Value),\n\tset(Obj, parent, NewParentObject).\n\ntype(Obj) when is_record(Obj, abstract_message) -> abstract_message;\n\ntype(Obj) when is_record(Obj, async_message) -> async_message;\n\ntype(_) -> undefined."
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/release",
    "content": "#!/usr/bin/env escript\n%%!\n%-*-Mode:erlang;coding:utf-8;tab-width:4;c-basic-offset:4;indent-tabs-mode:()-*-\n% ex: set ft=erlang fenc=utf-8 sts=4 ts=4 sw=4 et:\n%%%\n%%%------------------------------------------------------------------------\n%%% BSD LICENSE\n%%%\n%%% Copyright (c) 2013, Michael Truog <mjtruog at gmail dot com>\n%%% All rights reserved.\n%%%\n%%% Redistribution and use in source and binary forms, with or without\n%%% modification, are permitted provided that the following conditions are met:\n%%%\n%%%     * Redistributions of source code must retain the above copyright\n%%%       notice, this list of conditions and the following disclaimer.\n%%%     * Redistributions in binary form must reproduce the above copyright\n%%%       notice, this list of conditions and the following disclaimer in\n%%%       the documentation and/or other materials provided with the\n%%%       distribution.\n%%%     * All advertising materials mentioning features or use of this\n%%%       software must display the following acknowledgment:\n%%%         This product includes software developed by Michael Truog\n%%%     * The name of the author may not be used to endorse or promote\n%%%       products derived from this software without specific prior\n%%%       written permission\n%%%\n%%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n%%% CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n%%% INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n%%% OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n%%% DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n%%% CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n%%% SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n%%% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n%%% SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n%%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n%%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n%%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n%%% OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\n%%% DAMAGE.\n%%%------------------------------------------------------------------------\n\n-author('mjtruog [at] gmail (dot) com').\n\n-mode(compile).\n\nmain(_) ->\n    {ok,\n     [{sys, _} = RelToolConfig,\n      {target_dir, TargetDir},\n      {overlay, OverlayConfig}]} = file:consult(\"reltool.config\"),\n    {ok, Spec} = reltool:get_target_spec([RelToolConfig]),\n    case file:make_dir(TargetDir) of\n        ok ->\n            ok;\n        {error, eexist} ->\n            io:format(\"release already exists? (~p)~n\", [TargetDir]),\n            exit_code(1)\n    end,\n    ok = reltool:eval_target_spec(Spec, code:root_dir(), TargetDir),\n    ok = process_overlay(RelToolConfig, TargetDir, OverlayConfig),\n    exit_code(0).\n\nshell(Command, Arguments) ->\n    CommandSuffix = \" && echo 0 || echo 1\",\n    case lists:reverse(os:cmd(lists:flatten(\n        io_lib:format(Command ++ CommandSuffix, Arguments)))) of\n        [_, $0 | _] ->\n            ok;\n        [_, $1 | _] ->\n            io:format(\"\\\"~s\\\" failed!~n\", [io_lib:format(Command, Arguments)]),\n            error\n    end.\n\nboot_rel_vsn({sys, Config} = _RelToolConfig) ->\n    {rel, _Name, Ver, _} = proplists:lookup(rel, Config),\n    Ver.\n\n%% minimal parsing for handling mustache syntax\nmustache(Body, Context) ->\n    mustache(Body, \"\", Context).\nmustache([], Result, _Context) ->\n    lists:reverse(Result);\nmustache([${, ${ | KeyStr], Result, Context) ->\n    mustache_key(KeyStr, \"\", Result, Context);\nmustache([C | Rest], Result, Context) ->\n    mustache(Rest, [C | Result], Context).\nmustache_key([$}, $} | Rest], KeyStr, Result, Context) ->\n    Key = erlang:list_to_existing_atom(lists:reverse(KeyStr)),\n    {ok, Value} = dict:find(Key, Context),\n    mustache(Rest, lists:reverse(Value) ++ Result, Context);\nmustache_key([C | Rest], KeyStr, Result, Context) ->\n    mustache_key(Rest, [C | KeyStr], Result, Context).\n\n%% support minimal overlay based on rebar overlays\nprocess_overlay(RelToolConfig, TargetDir, OverlayConfig) ->\n    BootRelVsn = boot_rel_vsn(RelToolConfig),\n    OverlayVars =\n        dict:from_list([{erts_vsn, \"erts-\" ++ erlang:system_info(version)},\n                        {rel_vsn, BootRelVsn},\n                        {target_dir, TargetDir},\n                        {hostname, net_adm:localhost()}]),\n    {ok, BaseDir} = file:get_cwd(),\n    execute_overlay(OverlayConfig, OverlayVars, BaseDir, TargetDir).\n\nexecute_overlay([], _Vars, _BaseDir, _TargetDir) ->\n    ok;\nexecute_overlay([{mkdir, Out} | Rest], Vars, BaseDir, TargetDir) ->\n    OutDir = mustache(filename:join(TargetDir, Out), Vars),\n    ok = shell(\"mkdir -p ~s\", [OutDir]),\n    execute_overlay(Rest, Vars, BaseDir, TargetDir);\nexecute_overlay([{copy, In, Out} | Rest], Vars, BaseDir, TargetDir) ->\n    InFile = mustache(filename:join(BaseDir, In), Vars),\n    OutFile = mustache(filename:join(TargetDir, Out), Vars),\n    true = filelib:is_file(InFile),\n    ok = shell(\"cp -R ~s ~s\", [InFile, OutFile]),\n    execute_overlay(Rest, Vars, BaseDir, TargetDir).\n\nexit_code(ExitCode) ->\n    erlang:halt(ExitCode, [{flush, true}]).\n"
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/sample.app.src",
    "content": "{application, sample,\n [{description, \"sample app\"},\n  {vsn, \"1.0.0\"},\n  {registered, []},\n  {mod, {sample_app, []}},\n  {applications, [kernel, stdlib]},\n  {env, []},\n  {modules, []}]}.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Erlang/single-context.es",
    "content": "#! /usr/bin/env escript\n% This file is part of Emonk released under the MIT license. \n% See the LICENSE file for more information.\n\nmain([]) ->\n\tstart(64, 1000);\nmain([N]) ->\n\tstart(list_to_integer(N), 1000);\nmain([N, M]) ->\n\tstart(list_to_integer(N), list_to_integer(M)).\n\n\nstart(N, M) ->\n\tcode:add_pathz(\"test\"),\n\tcode:add_pathz(\"ebin\"),\n\t{ok, Ctx} = emonk:create_ctx(),\n\t{ok, undefined} = emonk:eval(Ctx, js()),\n\trun(Ctx, N, M),\n\twait(N).\n\nrun(_, 0, _) ->\n\tok;\nrun(Ctx, N, M) ->\n\tSelf = self(),\n\tPid = spawn(fun() -> do_js(Self, Ctx, M) end),\n\tio:format(\"Spawned: ~p~n\", [Pid]),\n\trun(Ctx, N-1, M).\n\nwait(0) ->\n\tok;\nwait(N) ->\n\treceive\n\t\t{finished, Pid} -> ok\n\tend,\n\tio:format(\"Finished: ~p~n\", [Pid]),\n\twait(N-1).\n\ndo_js(Parent, _, 0) ->\n\tParent ! {finished, self()};\ndo_js(Parent, Ctx, M) ->\n\tio:format(\"Running: ~p~n\", [M]),\n\tTest = random_test(),\n\t{ok, [Resp]} = emonk:call(Ctx, <<\"f\">>, [Test]),\n\tSorted = sort(Resp),\n\ttrue = Test == Sorted,\n\tdo_js(Parent, Ctx, M-1).\n\njs() -> \n\t<<\"var f = function(x) {return [x];};\">>.\n\nrandom_test() ->\n\tTests = [\n\t\tnull,\n\t\ttrue,\n\t\tfalse,\n\t\t1,\n\t\t-1,\n\t\t3.1416,\n\t\t-3.1416,\n\t\t12.0e10,\n\t\t1.234E+10,\n\t\t-1.234E-10,\n\t\t10.0,\n\t\t123.456,\n\t\t10.0,\n\t\t<<\"foo\">>,\n\t\t<<\"foo\", 5, \"bar\">>,\n\t\t<<\"\">>,\n\t\t<<\"\\n\\n\\n\">>,\n\t\t<<\"\\\" \\b\\f\\r\\n\\t\\\"\">>,\n\t\t{[]},\n\t\t{[{<<\"foo\">>, <<\"bar\">>}]},\n\t\t{[{<<\"foo\">>, <<\"bar\">>}, {<<\"baz\">>, 123}]},\n\t\t[],\n\t\t[[]],\n\t\t[1, <<\"foo\">>],\n\t\t{[{<<\"foo\">>, [123]}]},\n\t\t{[{<<\"foo\">>, [1, 2, 3]}]},\n\t\t{[{<<\"foo\">>, {[{<<\"bar\">>, true}]}}]},\n\t\t{[\n\t\t\t{<<\"foo\">>, []},\n\t\t\t{<<\"bar\">>, {[{<<\"baz\">>, true}]}}, {<<\"alice\">>, <<\"bob\">>}\n\t\t]},\n\t\t[-123, <<\"foo\">>, {[{<<\"bar\">>, []}]}, null]\n\t],\n\t{_, [Test | _]} = lists:split(random:uniform(length(Tests)) - 1, Tests),\n\tsort(Test).\n\nsort({Props}) ->\n\tobjsort(Props, []);\nsort(List) when is_list(List) ->\n\tlstsort(List, []);\nsort(Other) ->\n\tOther.\n\nobjsort([], Acc) ->\n\t{lists:sort(Acc)};\nobjsort([{K,V} | Rest], Acc) ->\n\tobjsort(Rest, [{K, sort(V)} | Acc]).\n\nlstsort([], Acc) ->\n\tlists:reverse(Acc);\nlstsort([Val | Rest], Acc) ->\n\tlstsort(Rest, [sort(Val) | Acc]).\n"
  },
  {
    "path": "src/test/resources/samples/langs/F#/Combinators.fs",
    "content": "﻿namespace Nessos.FsPickler.Combinators\n\n    open Nessos.FsPickler\n    open Nessos.FsPickler.Json\n\n    /// Json pickling methods\n    [<RequireQualifiedAccess>]\n    module Json =\n\n        let private jsonSerializer = lazy(FsPickler.CreateJson(omitHeader = true))\n\n        /// <summary>\n        ///     Pickles a value to Json.\n        /// </summary>\n        /// <param name=\"pickler\">utilized pickler.</param>\n        /// <param name=\"value\">input value.</param>\n        let pickle (pickler : Pickler<'T>) (value : 'T) : string =\n            jsonSerializer.Value.PickleToString (pickler, value)\n\n        /// <summary>\n        ///     Unpickles a value from Json.\n        /// </summary>\n        /// <param name=\"pickler\">utilized pickler.</param>\n        /// <param name=\"pickle\">input pickle.</param>\n        let unpickle (pickler : Pickler<'T>) (pickle : string) : 'T =\n            jsonSerializer.Value.UnPickleOfString (pickler, pickle)\n\n\n    /// Bson pickling methods\n    [<RequireQualifiedAccess>]\n    module Bson =\n\n        let private bsonPickler = lazy(FsPickler.CreateBson())\n\n        /// <summary>\n        ///     Pickles a value to Bson.\n        /// </summary>\n        /// <param name=\"pickler\">utilized pickler.</param>\n        /// <param name=\"value\">input value.</param>\n        let pickle (pickler : Pickler<'T>) (value : 'T) : byte [] =\n            bsonPickler.Value.Pickle (pickler, value)\n\n        /// <summary>\n        ///     Unpickles a value from bson.\n        /// </summary>\n        /// <param name=\"pickler\">utilized pickler.</param>\n        /// <param name=\"pickle\">input pickle.</param>\n        let unpickle (pickler : Pickler<'T>) (pickle : byte []) : 'T =\n            bsonPickler.Value.UnPickle (pickler, pickle)"
  },
  {
    "path": "src/test/resources/samples/langs/F#/JsonFormat.fs",
    "content": "﻿namespace Nessos.FsPickler.Json\n\n    open System\n    open System.IO\n    open System.Text\n\n    open Newtonsoft.Json\n\n    open Nessos.FsPickler\n\n    /// <summary>\n    ///     Factory methods for the Json serialization format.\n    /// </summary>\n    type JsonPickleFormatProvider internal (indent, omitHeader) as self =\n\n        let isCustomSeq isTopLevelSequence = \n            isTopLevelSequence && self.OmitHeader && self.UseCustomTopLevelSequenceSeparator\n\n        let mutable sequenceSeparator = \" \"\n\n        member val Indent = indent with get,set\n        member val OmitHeader = omitHeader with get,set\n        member val UseCustomTopLevelSequenceSeparator = false with get,set\n\n        member __.SequenceSeparator\n            with get () = sequenceSeparator\n            and set sep =\n                if sep <> null && String.IsNullOrWhiteSpace sep then\n                    sequenceSeparator <- sep\n                else\n                    invalidArg \"SequenceSeparator\" \"should be non-null whitespace.\"\n\n        interface ITextPickleFormatProvider with\n            member __.Name = \"Json\"\n\n            // see discussion : https://github.com/nessos/FsPickler/issues/17\n            member __.DefaultEncoding = new UTF8Encoding(false) :> Encoding\n\n            member __.CreateWriter (stream, encoding, isTopLevelSequence, leaveOpen) =\n#if NET40\n                if leaveOpen then raise <| new NotSupportedException(\"'leaveOpen' not supported in .NET 40.\")\n                let sw = new StreamWriter(stream, encoding)\n#else\n                let sw = new StreamWriter(stream, encoding, 1024, leaveOpen)\n#endif\n                let jw = new JsonTextWriter(sw)\n                new JsonPickleWriter(jw, __.OmitHeader, __.Indent, isCustomSeq isTopLevelSequence, sequenceSeparator, leaveOpen) :> _\n\n            member __.CreateReader (stream, encoding, isTopLevelSequence, leaveOpen) =\n#if NET40\n                if leaveOpen then raise <| new NotSupportedException(\"'leaveOpen' not supported in .NET 40.\")\n                let sr = new StreamReader(stream, encoding)\n#else\n                let sr = new StreamReader(stream, encoding, true, 1024, leaveOpen)\n#endif\n                let jr = new JsonTextReader(sr)\n                new JsonPickleReader(jr, __.OmitHeader, isCustomSeq isTopLevelSequence, leaveOpen) :> _\n\n            member __.CreateWriter (textWriter, isTopLevelSequence, leaveOpen) =\n                let jw = new JsonTextWriter(textWriter)\n                new JsonPickleWriter(jw, __.OmitHeader, __.Indent, isCustomSeq isTopLevelSequence, sequenceSeparator, leaveOpen) :> _\n\n            member __.CreateReader (textReader, isTopLevelSequence, leaveOpen) =\n                let jr = new JsonTextReader(textReader)\n                new JsonPickleReader(jr, __.OmitHeader, isCustomSeq isTopLevelSequence, leaveOpen) :> _"
  },
  {
    "path": "src/test/resources/samples/langs/F#/JsonReader.fs",
    "content": "﻿namespace Nessos.FsPickler.Json\n\n    open System\n    open System.Collections.Generic\n    open System.Globalization\n    open System.IO\n    open System.Numerics\n    open System.Text\n\n    open Newtonsoft.Json\n\n    open Nessos.FsPickler\n\n    /// <summary>\n    ///     Json format deserializer\n    /// </summary>\n    type internal JsonPickleReader (jsonReader : JsonReader, omitHeader, isTopLevelSequence, leaveOpen) =\n\n        do\n            jsonReader.CloseInput <- not leaveOpen\n            jsonReader.SupportMultipleContent <- isTopLevelSequence\n\n        let isBsonReader = match jsonReader with :? Bson.BsonReader -> true | _ -> false\n\n        let mutable depth = 0\n        let arrayStack = new Stack<int> ()\n        do arrayStack.Push Int32.MinValue\n\n        // do not write tag if omitting header or array element\n        let omitTag () = (omitHeader && depth = 0) || arrayStack.Peek() = depth - 1\n\n        interface IPickleFormatReader with\n            \n            member __.BeginReadRoot (tag : string) =\n                do jsonReader.Read() |> ignore\n                    \n                if omitHeader then () else\n\n                if jsonReader.TokenType <> JsonToken.StartObject then raise <| new FormatException(\"invalid json root object.\")\n                else\n                    do jsonReader.MoveNext()\n                    let version = jsonReader.ReadPrimitiveAs<string> false \"FsPickler\"\n                    if version <> jsonFormatVersion then\n                        let v = Version(version)\n                        raise <| new FormatException(sprintf \"Invalid FsPickler format version %O.\" version)\n\n                    let sTag = jsonReader.ReadPrimitiveAs<string> false \"type\"\n                    if tag <> sTag then\n                        raise <| new InvalidPickleTypeException(tag, sTag)\n\n            member __.EndReadRoot () = \n                if not omitHeader then jsonReader.Read() |> ignore\n\n            member __.BeginReadObject (tag : string) =\n                \n                if not <| omitTag () then\n                    jsonReader.ReadProperty tag\n                    jsonReader.MoveNext ()\n\n                if isTopLevelSequence && depth = 0 then\n                    arrayStack.Push depth\n                    depth <- depth + 1\n                    ObjectFlags.IsSequenceHeader\n\n                else\n                    match jsonReader.TokenType with\n                    | JsonToken.Null -> ObjectFlags.IsNull\n                    | JsonToken.StartArray ->\n                        jsonReader.MoveNext()\n                        arrayStack.Push depth\n                        depth <- depth + 1\n                        ObjectFlags.IsSequenceHeader\n\n                    | JsonToken.StartObject ->\n                        do jsonReader.MoveNext()\n                        depth <- depth + 1\n\n                        if jsonReader.ValueAs<string> () = \"_flags\" then\n                            jsonReader.MoveNext()\n                            let csvFlags = jsonReader.ValueAs<string>()\n                            jsonReader.MoveNext()\n                            parseFlagCsv csvFlags\n                        else\n                            ObjectFlags.None\n\n                    | token -> raise <| new FormatException(sprintf \"expected start of Json object but was '%O'.\" token)\n\n\n            member __.EndReadObject () =\n                if isTopLevelSequence && depth = 1 then\n                    arrayStack.Pop () |> ignore\n                    depth <- depth - 1\n                    jsonReader.Read() |> ignore\n                else\n                    match jsonReader.TokenType with\n                    | JsonToken.Null -> ()\n                    | JsonToken.EndObject -> depth <- depth - 1\n                    | JsonToken.EndArray ->\n                        arrayStack.Pop() |> ignore\n                        depth <- depth - 1\n\n                    | token -> raise <| new FormatException(sprintf \"expected end of Json object but was '%O'.\" token)\n\n                    if omitHeader && depth = 0 then ()\n                    else jsonReader.Read() |> ignore\n\n            member __.SerializeUnionCaseNames = true\n\n            member __.PreferLengthPrefixInSequences = false\n            member __.ReadNextSequenceElement () = \n                if isTopLevelSequence && depth = 1 then\n                    jsonReader.TokenType <> JsonToken.None\n                else\n                    jsonReader.TokenType <> JsonToken.EndArray\n\n            member __.ReadCachedObjectId () = jsonReader.ReadPrimitiveAs<int64> false \"id\"\n\n            member __.ReadBoolean tag = jsonReader.ReadPrimitiveAs<bool> (omitTag ()) tag\n            member __.ReadByte tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> byte\n            member __.ReadSByte tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> sbyte\n\n            member __.ReadInt16 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> int16\n            member __.ReadInt32 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> int\n            member __.ReadInt64 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag\n\n            member __.ReadUInt16 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint16\n            member __.ReadUInt32 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint32\n            member __.ReadUInt64 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint64\n\n            member __.ReadSingle tag =\n                if not <| omitTag () then\n                    jsonReader.ReadProperty tag\n                    jsonReader.MoveNext()\n\n                let value =\n                    match jsonReader.TokenType with\n                    | JsonToken.Float -> jsonReader.ValueAs<double> () |> single\n                    | JsonToken.String -> Single.Parse(jsonReader.ValueAs<string>(), CultureInfo.InvariantCulture)\n                    | _ -> raise <| new FormatException(\"not a float.\")\n\n                jsonReader.Read() |> ignore\n                value\n                \n            member __.ReadDouble tag =\n                if not <| omitTag () then\n                    jsonReader.ReadProperty tag\n                    jsonReader.MoveNext()\n\n                let value =\n                    match jsonReader.TokenType with\n                    | JsonToken.Float -> jsonReader.ValueAs<double> ()\n                    | JsonToken.String -> Double.Parse(jsonReader.ValueAs<string>(), CultureInfo.InvariantCulture)\n                    | _ -> raise <| new FormatException(\"not a float.\")\n\n                jsonReader.Read() |> ignore\n                value\n\n            member __.ReadChar tag = let value = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag in value.[0]\n            member __.ReadString tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag\n            member __.ReadBigInteger tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> BigInteger.Parse\n\n            member __.ReadGuid tag = \n                if isBsonReader then \n                    jsonReader.ReadPrimitiveAs<Guid> (omitTag ()) tag\n                else\n                    jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> Guid.Parse\n\n            member __.ReadTimeSpan tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> TimeSpan.Parse\n            member __.ReadDecimal tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> decimal\n\n            // BSON spec mandates the use of Unix time; \n            // this has millisecond precision which results in loss of accuracy w.r.t. ticks\n            // since the goal of FsPickler is to offer faithful representations of .NET objects\n            // we choose to override the spec and serialize ticks outright.\n            // see also https://json.codeplex.com/discussions/212067 \n            member __.ReadDate tag = \n                if isBsonReader then\n                    let ticks = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag\n                    DateTime(ticks)\n                else\n                    jsonReader.ReadPrimitiveAs<DateTime> (omitTag ()) tag\n\n            member __.ReadBytes tag =\n                if not <| omitTag () then\n                    jsonReader.ReadProperty tag\n                    jsonReader.Read() |> ignore\n\n                let bytes =\n                    if jsonReader.TokenType = JsonToken.Null then null\n                    elif isBsonReader then jsonReader.ValueAs<byte []> ()\n                    else\n                        let base64 = jsonReader.ValueAs<string> ()\n                        Convert.FromBase64String base64\n\n                jsonReader.Read() |> ignore\n\n                bytes\n\n            member __.IsPrimitiveArraySerializationSupported = false\n            member __.ReadPrimitiveArray _ _ = raise <| new NotImplementedException()\n\n            member __.Dispose () = (jsonReader :> IDisposable).Dispose()"
  },
  {
    "path": "src/test/resources/samples/langs/F#/JsonSerializer.fs",
    "content": "﻿namespace Nessos.FsPickler.Json\n\n    open System\n\n    open Nessos.FsPickler\n\n    type internal OAttribute = System.Runtime.InteropServices.OptionalAttribute\n    type internal DAttribute = System.Runtime.InteropServices.DefaultParameterValueAttribute\n\n    /// <summary>\n    ///     Json pickler instance.\n    /// </summary>\n    type JsonSerializer =\n        inherit FsPicklerTextSerializer\n        \n        val private format : JsonPickleFormatProvider\n\n        /// <summary>\n        ///     Initializes a new Json pickler instance.\n        /// </summary>\n        /// <param name=\"indent\">indent out Json pickles.</param>\n        /// <param name=\"omitHeader\">omit FsPickler header in Json pickles.</param>\n        /// <param name=\"typeConverter\">specify a custom type name converter.</param>\n        new ([<O;D(null)>] ?indent, [<O;D(null)>] ?omitHeader, [<O;D(null)>] ?typeConverter) =\n            let indent = defaultArg indent false\n            let omitHeader = defaultArg omitHeader false\n            let json = new JsonPickleFormatProvider(indent, omitHeader)\n            { \n                inherit FsPicklerTextSerializer(json, ?typeConverter = typeConverter)\n                format = json    \n            }\n\n        /// <summary>\n        ///     Gets or sets whether Json output should be indented.\n        /// </summary>\n        member x.Indent\n            with get () = x.format.Indent\n            and set b = x.format.Indent <- b\n\n        /// <summary>\n        ///     Gets or sets whether FsPickler headers should be ignored in pickle format.\n        /// </summary>\n        member x.OmitHeader\n            with get () = x.format.OmitHeader\n            and set b = x.format.OmitHeader <- b\n\n        /// <summary>\n        ///     Gets or sets a non-null whitespace string that serves as a custom, top-level sequence separator.\n        /// </summary>\n        member x.SequenceSeparator\n            with get () = x.format.SequenceSeparator\n            and set sep = x.format.SequenceSeparator <- sep\n\n        /// <summary>\n        ///     Gets or sets whether top-level sequences should be serialized using the custom separator.\n        /// </summary>\n        member x.UseCustomTopLevelSequenceSeparator\n            with get () = x.format.UseCustomTopLevelSequenceSeparator\n            and set e = x.format.UseCustomTopLevelSequenceSeparator <- e\n\n    /// <summary>\n    ///     BSON pickler instance.\n    /// </summary>\n    type BsonSerializer([<O;D(null)>] ?typeConverter) =\n        inherit FsPicklerSerializer(new BsonPickleFormatProvider(), ?typeConverter = typeConverter)\n\n\n    /// FsPickler static methods.\n    type FsPickler =\n\n        /// <summary>\n        ///     Initializes a new Json pickler instance.\n        /// </summary>\n        /// <param name=\"indent\">indent out Json pickles.</param>\n        /// <param name=\"omitHeader\">omit FsPickler header in Json pickles.</param>\n        /// <param name=\"typeConverter\">specify a custom type name converter.</param>\n        static member CreateJson([<O;D(null)>] ?indent, [<O;D(null)>] ?omitHeader, [<O;D(null)>] ?typeConverter) = \n            new JsonSerializer(?indent = indent, ?omitHeader = omitHeader, ?typeConverter = typeConverter)\n\n        /// <summary>\n        ///     Initializes a new Bson pickler instance.\n        /// </summary>\n        /// <param name=\"typeConverter\">specify a custom type name converter.</param>\n        static member CreateBson([<O;D(null)>] ?typeConverter) = \n            new BsonSerializer(?typeConverter = typeConverter)"
  },
  {
    "path": "src/test/resources/samples/langs/F#/JsonWriter.fs",
    "content": "﻿namespace Nessos.FsPickler.Json\n\n    open System\n    open System.IO\n    open System.Collections.Generic\n\n    open Newtonsoft.Json\n\n    open Nessos.FsPickler\n\n    /// <summary>\n    ///     Json format serializer.\n    /// </summary>\n    type internal JsonPickleWriter (jsonWriter : JsonWriter, omitHeader, indented, isTopLevelSequence, separator, leaveOpen) =\n\n        do \n            jsonWriter.Formatting <- if indented then Formatting.Indented else Formatting.None\n            jsonWriter.CloseOutput <- not leaveOpen\n\n        let isBsonWriter = match jsonWriter with :? Bson.BsonWriter -> true | _ -> false\n\n        let mutable depth = 0\n        let mutable isTopLevelSequenceHead = false\n        let mutable currentValueIsNull = false\n\n        let arrayStack = new Stack<int> ()\n        do arrayStack.Push Int32.MinValue\n\n        // do not write tag if omitting header or array element\n        let omitTag () = (omitHeader && depth = 0) || arrayStack.Peek() = depth - 1\n\n        interface IPickleFormatWriter with\n            \n            member __.BeginWriteRoot (tag : string) =\n                if omitHeader then () else\n\n                jsonWriter.WriteStartObject()\n                writePrimitive jsonWriter false \"FsPickler\" jsonFormatVersion\n                writePrimitive jsonWriter false \"type\" tag\n\n            member __.EndWriteRoot () = \n                if not omitHeader then jsonWriter.WriteEnd()\n\n            member __.BeginWriteObject (tag : string) (flags : ObjectFlags) =\n\n                if not <| omitTag () then\n                    jsonWriter.WritePropertyName tag\n\n                if flags.HasFlag ObjectFlags.IsNull then\n                    currentValueIsNull <- true\n                    jsonWriter.WriteNull()\n\n                elif flags.HasFlag ObjectFlags.IsSequenceHeader then\n                    if isTopLevelSequence && depth = 0 then\n                        isTopLevelSequenceHead <- true\n                    else\n                        jsonWriter.WriteStartArray()\n\n                    arrayStack.Push depth\n                    depth <- depth + 1\n                else\n                    jsonWriter.WriteStartObject()\n                    depth <- depth + 1\n\n                    if flags = ObjectFlags.None then ()\n                    else\n                        let flagCsv = mkFlagCsv flags\n                        writePrimitive jsonWriter false \"_flags\" flagCsv\n\n            member __.EndWriteObject () = \n                if currentValueIsNull then \n                    currentValueIsNull <- false\n                else\n                    depth <- depth - 1\n                    if arrayStack.Peek () = depth then\n                        if isTopLevelSequence && depth = 0 then ()\n                        else\n                            jsonWriter.WriteEndArray()\n\n                        arrayStack.Pop () |> ignore\n                    else\n                        jsonWriter.WriteEndObject()\n\n            member __.SerializeUnionCaseNames = true\n\n            member __.PreferLengthPrefixInSequences = false\n            member __.WriteNextSequenceElement hasNext =\n                if isTopLevelSequence && depth = 1 then\n                    if isTopLevelSequenceHead then\n                        isTopLevelSequenceHead <- false\n                    else\n                        jsonWriter.WriteWhitespace separator\n\n            member __.WriteCachedObjectId id = writePrimitive jsonWriter false \"id\" id\n\n            member __.WriteBoolean (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteByte (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteSByte (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n\n            member __.WriteInt16 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteInt32 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteInt64 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n\n            member __.WriteUInt16 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteUInt32 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteUInt64 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n\n            member __.WriteSingle (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteDouble (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteDecimal (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value)\n\n            member __.WriteChar (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteString (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteBigInteger (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value)\n\n            member __.WriteGuid (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteTimeSpan (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value)\n\n            // BSON spec mandates the use of Unix time; \n            // this has millisecond precision which results in loss of accuracy w.r.t. ticks\n            // since the goal of FsPickler is to offer faithful representations of .NET objects\n            // we choose to override the spec and serialize ticks outright.\n            // see also https://json.codeplex.com/discussions/212067 \n            member __.WriteDate (tag : string) value = \n                if isBsonWriter then\n                    writePrimitive jsonWriter (omitTag ()) tag value.Ticks\n                else\n                    writePrimitive jsonWriter (omitTag ()) tag value\n\n            member __.WriteBytes (tag : string) (value : byte []) =\n                if not <| omitTag () then \n                    jsonWriter.WritePropertyName tag\n\n                if obj.ReferenceEquals(value, null) then\n                    jsonWriter.WriteNull()\n                else\n                    jsonWriter.WriteValue value\n\n            member __.IsPrimitiveArraySerializationSupported = false\n            member __.WritePrimitiveArray _ _ = raise <| NotSupportedException()\n\n            member __.Dispose () = jsonWriter.Flush()"
  },
  {
    "path": "src/test/resources/samples/langs/F#/PerformanceTesters.fs",
    "content": "﻿namespace Nessos.FsPickler.Tests\n\n    open PerfUtil\n    open PerfUtil.NUnit\n\n    open NUnit.Framework\n\n    open Nessos.FsPickler\n    open Nessos.FsPickler.Json\n\n    [<AbstractClass>]\n    type PerfTester () =\n        inherit NUnitPerf<Serializer> ()\n\n        let tests = PerfTest.OfModuleMarker<PerformanceTests.Marker> ()\n\n        override __.PerfTests = tests\n\n\n    type ``Serializer Comparison`` () =\n        inherit PerfTester()\n\n        let fsp = FsPickler.initBinary()\n        let bfs = new BinaryFormatterSerializer() :> Serializer\n        let ndc = new NetDataContractSerializer() :> Serializer\n        let jdn = new JsonDotNetSerializer() :> Serializer\n        let bdn = new JsonDotNetBsonSerializer () :> Serializer\n        let pbn = new ProtoBufSerializer() :> Serializer\n        let ssj = new ServiceStackJsonSerializer() :> Serializer\n        let sst = new ServiceStackTypeSerializer() :> Serializer\n\n        let comparer = new WeightedComparer(spaceFactor = 0.2, leastAcceptableImprovementFactor = 1.)\n        let tester = new ImplementationComparer<_>(fsp, [bfs;ndc;jdn;bdn;pbn;ssj;sst], throwOnError = true, warmup = true, comparer = comparer)\n\n        override __.PerfTester = tester :> _\n        \n\n    type ``FsPickler Formats Comparison`` () =\n        inherit PerfTester ()\n\n        let binary = FsPickler.initBinary()\n        let json = FsPickler.initJson()\n        let bson = FsPickler.initBson()\n        let xml = FsPickler.initXml()\n\n        let tester = new ImplementationComparer<_>(binary, [json ; bson; xml], warmup = true, throwOnError = false)\n\n        override __.PerfTester = tester :> _\n\n\n    type ``Past FsPickler Versions Comparison`` () =\n        inherit PerfTester ()\n\n        let persistResults = true\n        let persistenceFile = \"fspPerf.xml\"\n\n        let fsp = FsPickler.initBinary()\n        let version = typeof<FsPickler>.Assembly.GetName().Version\n        let comparer = new WeightedComparer(spaceFactor = 0.2, leastAcceptableImprovementFactor = 0.8)\n        let tester = \n            new PastImplementationComparer<Serializer>(\n                fsp, version, historyFile = persistenceFile, throwOnError = true, warmup = true, comparer = comparer)\n\n        override __.PerfTester = tester :> _\n\n        [<TestFixtureTearDown>]\n        member __.Persist() =\n            if persistResults then tester.PersistCurrentResults ()"
  },
  {
    "path": "src/test/resources/samples/langs/F#/PerformanceTests.fs",
    "content": "﻿namespace Nessos.FsPickler.Tests\n\n    open System\n    open System.Collections.Generic\n\n    open PerfUtil\n\n    open Nessos.FsPickler\n    open Nessos.FsPickler.Tests.Serializer\n    open Nessos.FsPickler.Tests.TestTypes\n\n    module PerformanceTests =\n\n        type Marker = class end\n\n        let guid = Guid.NewGuid()\n\n        [<PerfTest(1000)>]\n        let ``Value: Guid`` s = roundtrip guid s\n\n        let date = DateTime.Now\n\n        [<PerfTest(1000)>]\n        let ``Value: DateTime`` s = roundtrip date s\n\n        [<PerfTest(10000)>]\n        let ``Value: String`` s = roundtrip stringValue s\n\n\n        let boxed = box ([| 1 .. 1000 |], \"lorem ipsum\")\n\n        [<PerfTest(1000)>]\n        let ``Boxed Object`` s = roundtrip boxed s\n\n        let fsClass = new Class(42, stringValue)\n\n        [<PerfTest(10000)>]\n        let ``Class: Simple F# Class`` s = roundtrip fsClass s\n\n        let serializableClass = new SerializableClass<_>(42, stringValue, [|1..1000|])\n\n        [<PerfTest(10000)>]\n        let ``Class: ISerializable`` s = roundtrip serializableClass s\n\n        let boxedClass = box(Some 42)\n\n        [<PerfTest(10000)>]\n        let ``Subtype Resolution`` s = roundtrip boxedClass s\n\n        let floatArray = Array.init 100000 (fun i -> float i)\n\n        [<PerfTest(10)>]\n        let ``Array: Float`` s = roundtrip floatArray s\n\n        let intArray = Array.init 100000 id\n\n        [<PerfTest(10)>]\n        let ``Array: Int`` s = roundtrip intArray s\n\n        let stringArray = Array.init 10000 (fun i -> stringValue + string i)\n        \n        [<PerfTest(100)>]\n        let ``Array: String`` s = roundtrip stringArray s\n\n        let kvarr = [|1..10000|] |> Array.map (fun i -> i, string i)\n\n        [<PerfTest(100)>]\n        let ``Array: Key-Value Pairs`` s = roundtrip kvarr s\n\n        let duArray = [| for i in 1 .. 10000 -> (Something (\"asdasdasdas\", i)) |]\n\n        [<PerfTest(100)>]\n        let ``Array: Discriminated Unions`` s = roundtrip duArray s\n\n        let objArray = \n            [| \n                box 2; box 3; box \"hello\" ; box <| Some 3; box(2,3) ; \n                box <| new Class(2, stringValue) ; box <| new SerializableClass<int option>(2, stringValue, Some 12); \n                box stringValue \n            |]\n\n        [<PerfTest(1000)>]\n        let ``Array: Objects`` s = roundtrip objArray s\n\n\n        let array3D = Array3D.init 100 100 100 (fun i j k -> float (i * j + k))\n\n        [<PerfTest(10)>]\n        let ``Array: Rank-3 Float`` s = roundtrip array3D s\n\n        let bclDict = dict [ for i in 1 .. 1000 -> (string i, i)]\n\n        [<PerfTest(100)>]\n        let ``.NET Dictionary`` s = roundtrip bclDict s\n\n        let bclStack = new Stack<string>([for i in 1 .. 1000 -> string i])\n\n        [<PerfTest(100)>]\n        let ``.NET Stack`` s = roundtrip bclStack s\n\n        let bclList = new List<string * int>([for i in 1 .. 1000 -> string i, i])\n\n        [<PerfTest(100)>]\n        let ``.NET List`` s = roundtrip bclList s\n\n        let bclSet = new SortedSet<_>([for i in 1 .. 1000 -> string i])\n\n        [<PerfTest(100)>]\n        let ``.NET Set`` s = roundtrip bclSet s\n\n        let smallTuple = (1, DateTime.Now,\"hello\")\n\n        [<PerfTest(10000)>]\n        let ``FSharp: Tuple Small`` s = roundtrip smallTuple s\n\n        let largeTuple = (stringValue, 1, 2, 3, true, \"\", Some(3.14, [2]), 3, 2, 1, stringValue)\n\n        [<PerfTest(10000)>]\n        let ``FSharp: Tuple Large`` s =\n            roundtrip largeTuple s\n\n        let intList = [1..1000]\n\n        [<PerfTest(1000)>]\n        let ``FSharp: List Int`` s = roundtrip intList s\n\n        let stringList = [ for i in 1 .. 1000 -> stringValue + string i ]\n\n        [<PerfTest(1000)>]\n        let ``FSharp: List String`` s = roundtrip stringList s\n\n        let pairList = [ for i in 1 .. 1000 -> (string i, i) ]\n\n        [<PerfTest(1000)>]\n        let ``FSharp: List Key-Value`` s = roundtrip pairList s\n\n        let nestedLst = let n = [1..1000] in [for _ in 1 .. 100 -> n]\n\n        [<PerfTest(1000)>]\n        let ``FSharp: List Nested`` s = roundtrip nestedLst s\n\n        let union = SomethingElse(stringValue, 42, box (Some 42))\n\n        [<PerfTest(10000)>]\n        let ``FSharp: Union`` s = roundtrip union s\n\n        let record = { Int = 42 ; String = stringValue ; Tuple = (13, \"\") }\n\n        [<PerfTest(10000)>]\n        let ``FSharp: Record`` s = roundtrip record s\n\n        let peano = int2Peano 100\n\n        [<PerfTest(100)>]\n        let ``FSharp: Peano Rectype`` s = roundtrip peano s\n\n        let closure = (@) [ Some([1..100], Set.ofList [1..100]) ]\n\n        [<PerfTest(1000)>]\n        let ``FSharp: Curried Function`` s = roundtrip closure s\n\n        let binTree = mkTree 10\n\n        [<PerfTest(100)>]\n        let ``FSharp: Binary Tree`` s = roundtrip binTree s\n\n        let intSet = [1..1000] |> List.map string |> set\n\n        [<PerfTest(1000)>]\n        let ``FSharp: Set`` s = roundtrip intSet s\n\n        let fsMap = [1..1000] |> Seq.map (fun i -> (string i,i)) |> Map.ofSeq\n\n        [<PerfTest(1000)>]\n        let ``FSharp: Map`` s = roundtrip fsMap s\n\n        let testType = typeof<int * string option * Map<int * string [], string ref option>>\n\n        [<PerfTest(1000)>]\n        let ``Reflection: Type`` s = roundtrip testType s\n\n        let quotationSmall = <@ fun x -> pown 2 x @>\n\n        let quotationLarge =\n            <@\n                async {\n                    let rec fibAsync n =\n                        async {\n                            match n with\n                            | _ when n < 0 -> return invalidArg \"negative\" \"n\"\n                            | _ when n < 2 -> return n\n                            | n ->\n                                let! fn = fibAsync (n-1)\n                                let! fnn = fibAsync (n-2)\n                                return fn + fnn\n                        }\n\n                    let! values = [1..100] |> Seq.map fibAsync |> Async.Parallel\n                    return Seq.sum values\n                }\n            @>\n\n        [<PerfTest(10000)>]\n        let ``FSharp: Quotation Small`` s = roundtrip quotationSmall s\n\n        [<PerfTest(1000)>]\n        let ``FSharp: Quotation Large`` s = roundtrip quotationLarge s"
  },
  {
    "path": "src/test/resources/samples/langs/F#/sample.fs",
    "content": "module Sample\n\nopen System\n\ntype Foo =\n    {\n        Bar : string\n    }\n\ntype Baz = interface end\n\nlet Sample1(xs : int list) : string =\n    xs\n    |> List.map (fun x -> string x)\n    |> String.concat \",\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/FLUX/gameserver.fx",
    "content": "typedef engine isEngineMessage;\ntypedef turn isTurnMessage;\ntypedef connect isConnectMessage;\ntypedef disconnect isDisconnectMessage;\n\nClientMessage(char* data) => ();\nParseMessage(char* data) => (int type, int client, char* data);\nReadMessage(int type, int client, char* data) => ();\n\nParseEngine(int type, int client, char* data) => (int client, int direction);\nDoEngine(int client, int direction) => ();\n\nParseTurn(int type, int client, char* data) => (int client, int direction);\nDoTurn(int client, int direction) => ();\n\nParseConnect(int type, int client, char* data) \n\t=> (int client, char* host, int port);\nDoConnect(int client, char* host, int port) => ();\n\nParseDisconnect(int type, int client, char* data) => (int client);\nDoDisconnect(int client) => ();\n\nUpdateBoard(ClientList clients) => (ClientList clients);\nSendData(ClientList clients) => ();\n\nDoUpdate(ClientList clients) => ();\n\nDataTimer() => (ClientList clients);\n\nGetClients() => (ClientList clients);\n\nWait(ClientList clients) => (ClientList clients);\n\nListen () => (char* data);\n\nsource Listen => ClientMessage;\nsource DataTimer => DoUpdate;\n\nDataTimer = GetClients -> Wait;\n\nDoUpdate = UpdateBoard -> SendData;\n\nClientMessage=ParseMessage -> ReadMessage;\n\nReadMessage:[engine, _, _] = ParseEngine -> DoEngine;\nReadMessage:[turn, _, _] = ParseTurn -> DoTurn;\nReadMessage:[connect, _, _] = ParseConnect -> DoConnect;\nReadMessage:[disconnect, _, _] = ParseDisconnect -> DoDisconnect;\n\natomic GetClients:{client_lock};\natomic DoConnect:{client_lock};\natomic DoDisconnect:{client_lock};\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/FLUX/imageserver.fx",
    "content": "typedef xml TestXML;\ntypedef html TestHTML;\n\ntypedef inCache TestInCache;\n\nPage (int socket) => ();\n\nReadRequest (int socket) => (int socket, bool close, image_tag *request);\n\nCheckCache (int socket, bool close, image_tag *request) \n\t=> (int socket, bool close, image_tag *request);\n\nHandler (int socket, bool close, image_tag *request)\n     => (int socket, bool close, image_tag *request);\n\nComplete (int socket, bool close, image_tag *request) => ();\n\nReadInFromDisk (int socket, bool close, image_tag *request)\n     => (int socket, bool close, image_tag *request, __u8 *rgb_data);\n\nWrite (int socket, bool close, image_tag *request)\n     => (int socket, bool close, image_tag *request);\n\nCompress(int socket, bool close, image_tag *request, __u8 *rgb_data)\n\t=> (int socket, bool close, image_tag *request);\n\nStoreInCache(int socket, bool close, image_tag *request)\n\t=> (int socket, bool close, image_tag *request);\n\nListen () \n\t=> (int socket);\n\nsource Listen => Page;\n\nHandler:[_, _, inCache]=;\nHandler:[_, _, _]=ReadInFromDisk -> Compress -> StoreInCache;\n\nPage = ReadRequest -> CheckCache-> Handler -> Write -> Complete;\n\natomic CheckCache:{cache};\natomic StoreInCache:{cache};\natomic Complete:{cache};\n\nhandle error ReadInFromDisk => FourOhFor;\n"
  },
  {
    "path": "src/test/resources/samples/langs/FLUX/mbittorrent.fx",
    "content": "typedef choke TestChoke;\ntypedef unchoke TestUnchoke;\ntypedef interested TestInterested;\ntypedef uninterested TestUninterested;\ntypedef request TestRequest;\ntypedef cancel TestCancel;\ntypedef piece TestPiece;\ntypedef bitfield TestBitfield;\ntypedef have TestHave;\ntypedef piececomplete TestPieceComplete;\n\nCheckinWithTracker (torrent_data_t *tdata)\n    => ();\n\nSendRequestToTracker (torrent_data_t *tdata)\n    => (torrent_data_t *tdata, int socket);\n    \nGetTrackerResponse (torrent_data_t *tdata, int socket)\n    => ();\n\nUpdateChokeList (torrent_data_t *tdata)\n    => ();\n\nPickChoked (torrent_data_t *tdata)\n    => (torrent_data_t *tdata, chokelist_t clist);\n    \nSendChokeUnchoke (torrent_data_t *tdata, chokelist_t clist)\n    => ();\n    \nSetupConnection (torrent_data_t *tdata, int socket)\n    => ();\n    \nHandshake (torrent_data_t *tdata, int socket)\n    => (torrent_data_t *tdata, client_data_t *client);\n    \nSendBitfield (torrent_data_t *tdata, client_data_t *client)\n    => ();\n\nMessage (torrent_data_t *tdata, client_data_t *client)\n    => ();\n    \nReadMessage (torrent_data_t *tdata, client_data_t *client)\n    => (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload);\n    \nHandleMessage (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n    \nMessageDone (client_data_t *client)\n    => ();\n    \nCompletePiece (torrent_data_t *tdata, client_data_t *client, int piece)\n    => (torrent_data_t *tdata, client_data_t *client);\n\nVerifyPiece (torrent_data_t *tdata, client_data_t *client, int piece)\n    => (torrent_data_t *tdata, client_data_t *client, int piece);\n\nSendHave (torrent_data_t *tdata, client_data_t *client, int piece)\n    => (torrent_data_t *tdata, client_data_t *client);\n\nSendUninterested (torrent_data_t *tdata, client_data_t *client)\n    => (torrent_data_t *tdata, client_data_t *client);\n    \nChoke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n    \nCancel (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n\nInterested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n\nUninterested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n\nBitfield (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n\nUnchoke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (torrent_data_t *tdata, client_data_t *client);\n\nSendRequest (torrent_data_t *tdata, client_data_t *client)\n    => (client_data_t *client);\n\nHave (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (torrent_data_t *tdata, client_data_t *client);\n\nPiece (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (torrent_data_t *tdata, client_data_t *client, int piece);\n\nRequest (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n    \nSendKeepAlives (torrent_data_t *tdata)\n    => ();\n\nGetClients () \n    => (int maxfd, fd_set *fds);\n\nSelectSockets (int maxfd, fd_set *fds)\n    => (fd_set *fds);\n\nCheckSockets (fd_set *fds)\n    => (torrent_data_t *tdata, client_data_t *client);\n\nTrackerTimer () \n    => (torrent_data_t *tdata);\n\nChokeTimer ()\n    => (torrent_data_t *tdata);\n\nConnect ()\n    => (torrent_data_t *tdata, int socket);\n\nKeepAliveTimer ()\n    => (torrent_data_t *tdata);\n\nListen ()\n    => (torrent_data_t *tdata, client_data_t *client);\n\nsource TrackerTimer => CheckinWithTracker;\nsource ChokeTimer => UpdateChokeList;\nsource Connect => SetupConnection;\nsource Listen => Message;\nsource KeepAliveTimer => SendKeepAlives;\n\nListen = GetClients -> SelectSockets -> CheckSockets;\nCheckinWithTracker = SendRequestToTracker -> GetTrackerResponse;\nUpdateChokeList = PickChoked -> SendChokeUnchoke;\nSetupConnection = Handshake -> SendBitfield;\nMessage = ReadMessage -> HandleMessage -> MessageDone;\n\nCompletePiece:[_, _, piececomplete] = VerifyPiece -> SendHave -> SendUninterested;\n\nHandleMessage:[_, _, choke, _, _] = Choke;\nHandleMessage:[_, _, unchoke, _, _] = Unchoke -> SendRequest;\nHandleMessage:[_, _, interested, _, _] = Interested;\n\nHandleMessage:[_, _, uninterested, _, _] = Uninterested;\nHandleMessage:[_, _, request, _, _] = Request;\nHandleMessage:[_, _, cancel, _, _] = Cancel;\nHandleMessage:[_, _, piece, _, _] = Piece -> CompletePiece -> SendRequest;\nHandleMessage:[_, _, bitfield, _, _] = Bitfield;\nHandleMessage:[_, _, have, _, _] = Have -> SendRequest;\n\natomic GetClients:{BigLock};\natomic CheckSockets:{BigLock};\natomic Message:{BigLock};\natomic CheckinWithTracker:{BigLock};\natomic UpdateChokeList:{BigLock};\natomic SetupConnection:{BigLock};\natomic SendKeepAlives:{BigLock};\n"
  },
  {
    "path": "src/test/resources/samples/langs/FLUX/test.fx",
    "content": "// concrete node signatures\nListen ()\n  => (int socket);\n\nReadRequest (int socket)\n  => (int socket, bool close, image_tag *request);\n\nCheckCache (int socket, bool close, image_tag *request)\n  => (int socket, bool close, image_tag *request);\n\n// omitted for space:\n// ReadInFromDisk, StoreInCache\nCompress (int socket, bool close, image_tag *request, __u8 *rgb_data)\n  => (int socket, bool close, image_tag *request);\nWrite (int socket, bool close, image_tag *request)\n  => (int socket, bool close, image_tag *request);\nComplete (int socket, bool close, image_tag *request) => ();\n\n// source node\nsource Listen => Image;\n\n// abstract node\nImage = ReadRequest -> CheckCache -> Handler -> Write -> Complete;\n\n// predicate type & dispatch\ntypedef hit TestInCache;\nHandler:[_, _, hit] = ;\nHandler:[_, _, _] =\nReadInFromDisk -> Compress -> StoreInCache;\n\n// error handler\nhandle error ReadInFromDisk => FourOhFor;\n\n// atomicity constraints\natomic CheckCache:{cache};\natomic StoreInCache:{cache};\natomic Complete:{cache};\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Factor/hello-world.factor",
    "content": "USE: io\n IN: hello-world\n \n : hello ( -- ) \"Hello world\" print ;\n \n MAIN: hello\n "
  },
  {
    "path": "src/test/resources/samples/langs/Fantom/sample1.fan",
    "content": "/*\n * Author: Robert Koeninger\n * License: WTFPL (http://www.wtfpl.net/)\n */\n\nclass Spelling {\n\n  ** Load sample text and offer corrections for input\n  static Void main(Str[] args) {\n    text := File.os(\"big.txt\").readAllStr\n    counts := Str:Int[:] { def = 0 }\n    text.split.each |word| { counts[word] += 1 }\n    args.each |arg| { echo(correction(counts, arg)) }\n  }\n\n  static const Range letters := Range.makeInclusive(97, 122)\n\n  ** Most probable spelling correction for `word`.\n  static Str correction(Str:Int counts, Str word) {\n    candidates(counts, word).max |x, y| { counts[x] <=> counts[y] }\n  }\n\n  ** Generate possible spelling corrections for `word`.\n  static Str[] candidates(Str:Int counts, Str word) {\n    result := known(counts, Str[word])\n    if (result.size > 0) return result\n\n    result = known(counts, edits1(word))\n    if (result.size > 0) return result\n\n    result = known(counts, edits2(word))\n    if (result.size > 0) return result\n\n    return Str[word]\n  }\n\n  ** The subset of `words` that appear in the map of `counts`.\n  static Str[] known(Str:Int counts, Str[] words) {\n    words.findAll |word, i| { counts[word] > 0 }.unique\n  }\n\n  ** All edits that are one edit away from `word`.\n  static Str[] edits1(Str word) {\n    edits := Str[,]\n\n    for (i := 0; i < word.size; ++i) {\n      edits.add(delete(word, i))\n\n      if (i < word.size - 2) {\n        edits.add(transpose(word, i))\n      }\n\n      edits.addAll(replace(word, i))\n      edits.addAll(insert(word, i))\n    }\n\n    edits = edits.unique\n    edits.remove(word)\n    return edits\n  }\n\n  ** Word with `i`th letter removed.\n  static Str delete(Str word, Int i) {\n    left := word.getRange(Range.makeExclusive(0, i))\n    right := word.getRange(Range.makeExclusive(i + 1, word.size))\n    return left + right\n  }\n\n  ** Word with `i`th and `i+1`st letter swapped.\n  static Str transpose(Str word, Int i) {\n    left := word.getRange(Range.makeExclusive(0, i))\n    right := word.getRange(Range.makeExclusive(i, word.size))\n    first := right.get(0).toChar\n    second := right.get(1).toChar\n    rest := right.getRange(Range.makeExclusive(2, right.size))\n    return left + second + first + rest\n  }\n\n  ** Word with `i`th letter replaced with every other letter.\n  static Str[] replace(Str word, Int i) {\n    left := word.getRange(Range.makeExclusive(0, i))\n    right := word.getRange(Range.makeExclusive(i + 1, word.size))\n    return letters.map |ch| { left + ch.toChar + right }\n  }\n\n  ** Word with each letter inserted at `i`.\n  static Str[] insert(Str word, Int i) {\n    left := word.getRange(Range.makeExclusive(0, i))\n    right := word.getRange(Range.makeExclusive(i, word.size))\n    return letters.map |ch| { left + ch.toChar + right }\n  }\n\n  ** All edits that are two edits away from `word`.\n  static Str[] edits2(Str word) {\n    (Str[])(edits1(word).map |w| { edits1(w) }.flatten)\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Fantom/sample2.fan",
    "content": "/*\n * Author: Robert Koeninger\n * License: WTFPL (http://www.wtfpl.net/)\n */\n\nmixin Expr\n{\n  abstract Obj? eval()\n}\n\nclass Constant : Expr\n{\n  Obj? value\n\n  new make(Obj? value) { this.value = value }\n  override Obj? eval() { value }\n}\n\nenum class Op\n{\n  plus,\n  minus\n}\n\nclass Infix : Expr\n{\n  Op op\n  Expr left\n  Expr right\n\n  new make(Op op, Expr left, Expr right)\n  {\n    this.op = op\n    this.left = left\n    this.right = right\n  }\n\n  override Obj? eval()\n  {\n    switch (op)\n    {\n      case Op.plus:\n        return (Int)left.eval() + (Int)right.eval()\n      case Op.minus:\n        return (Int)left.eval() - (Int)right.eval()\n      default:\n        throw Err(\"undefined Op\")\n    }\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Filebench WML/copyfiles.f",
    "content": "#\n# CDDL HEADER START\n#\n# The contents of this file are subject to the terms of the\n# Common Development and Distribution License (the \"License\").\n# You may not use this file except in compliance with the License.\n#\n# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE\n# or http://www.opensolaris.org/os/licensing.\n# See the License for the specific language governing permissions\n# and limitations under the License.\n#\n# When distributing Covered Code, include this CDDL HEADER in each\n# file and include the License file at usr/src/OPENSOLARIS.LICENSE.\n# If applicable, add the following below this CDDL HEADER, with the\n# fields enclosed by brackets \"[]\" replaced with your own identifying\n# information: Portions Copyright [yyyy] [name of copyright owner]\n#\n# CDDL HEADER END\n#\n#\n# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.\n# Use is subject to license terms.\n#\n\nset $dir=/tmp\nset $nfiles=1000\nset $meandirwidth=20\nset $meanfilesize=16k\nset $iosize=1m\nset $nthreads=1\n\nset mode quit firstdone\n\ndefine fileset name=bigfileset,path=$dir,size=$meanfilesize,entries=$nfiles,dirwidth=$meandirwidth,prealloc=100,paralloc\ndefine fileset name=destfiles,path=$dir,size=$meanfilesize,entries=$nfiles,dirwidth=$meandirwidth\n\ndefine process name=filereader,instances=1\n{\n  thread name=filereaderthread,memsize=10m,instances=$nthreads\n  {\n    flowop openfile name=openfile1,filesetname=bigfileset,fd=1\n    flowop readwholefile name=readfile1,fd=1,iosize=$iosize\n    flowop createfile name=createfile2,filesetname=destfiles,fd=2\n    flowop writewholefile name=writefile2,fd=2,srcfd=1,iosize=$iosize\n    flowop closefile name=closefile1,fd=1\n    flowop closefile name=closefile2,fd=2\n  }\n}\n\necho  \"Copyfiles Version 3.0 personality successfully loaded\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Filterscript/colormatrix.fs",
    "content": "/*\n * Copyright (C) 2012 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"ip.rsh\"\n\nstatic rs_matrix4x4 Mat;\n\nvoid init() {\n    rsMatrixLoadIdentity(&Mat);\n}\n\nvoid setMatrix(rs_matrix4x4 m) {\n    Mat = m;\n}\n\nuchar4 __attribute__((kernel)) root(uchar4 in) {\n    float4 f = convert_float4(in);\n    f = rsMatrixMultiply(&Mat, f);\n    f = clamp(f, 0.f, 255.f);\n    return convert_uchar4(f);\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Filterscript/fs_kernel.fs",
    "content": "#pragma version(1)\n#pragma rs java_package_name(foo)\n\nint __attribute__((kernel)) root(uint32_t ain) {\n  return 0;\n}\n\nvoid __attribute__((kernel)) in_only(uint32_t ain) {\n}\n\nint __attribute__((kernel)) out_only() {\n  return 0;\n}\n\nint __attribute__((kernel)) everything(uint32_t ain, uint32_t x, uint32_t y) {\n  return 0;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Formatted/NiAlH_jea.eam.fs",
    "content": "see James E Angelo, Neville R Moody, Michael I Baskes\n\"Trapping of hydrogen to lattice defects in nickel\", Modelling and\nSimulation in Materials Science & Engineering, vol. 3, pp. 289-307 (1995)\n    3   Ni  Al  H\n 1000  0.1300722995578975E-01 1000  0.5678391959798995E-02  0.5650000000000000E+01\n   28     58.710         3.5200        fcc \n  0.0000000000000000E+00 -0.1332662793615358E+00 -0.1452921454581837E+00 -0.1523531912368142E+00 -0.1581862523552362E+00\n -0.1639082041116888E+00 -0.1699426545382059E+00 -0.1764570476376752E+00 -0.1835109199136706E+00 -0.1911112227682255E+00\n -0.1992425242400153E+00 -0.2078735593152208E+00 -0.2169708161705926E+00 -0.2264981576262208E+00 -0.2364198685383210E+00\n -0.2467010212354559E+00 -0.2573089641630046E+00 -0.2682127177172648E+00 -0.2793832876249742E+00 -0.2907936148383499E+00\n -0.3024184814336230E+00 -0.3142343948579320E+00 -0.3262194641112117E+00 -0.3383532759151806E+00 -0.3506164751688710E+00\n -0.3629930849818281E+00 -0.3754632992578539E+00 -0.3880132539605681E+00 -0.4006282340364624E+00 -0.4132944249954278E+00\n -0.4259988342802910E+00 -0.4387292219786865E+00 -0.4514740394367802E+00 -0.4642223746432430E+00 -0.4769639034723383E+00\n -0.4896888460377404E+00 -0.5023882063058194E+00 -0.5150514008208491E+00 -0.5276733170954859E+00 -0.5402439685620584E+00\n -0.5527559057851690E+00 -0.5652019937956556E+00 -0.5775754037468577E+00 -0.5898697374354533E+00 -0.6020783706550734E+00\n -0.6141958187973504E+00 -0.6262163111449786E+00 -0.6381344390125845E+00 -0.6499424015305308E+00 -0.6616382540753616E+00\n -0.6731993263249691E+00 -0.6845796030423443E+00 -0.6957060801011892E+00 -0.7064948085245568E+00 -0.7168695757140675E+00\n -0.7267732527299753E+00 -0.7361710465584164E+00 -0.7450484575868490E+00 -0.7534069422321110E+00 -0.7612592416825148E+00\n -0.7686253227224800E+00 -0.7755292274454266E+00 -0.7819968032841373E+00 -0.7880540868431538E+00 -0.7937266203490037E+00\n -0.7990383766649565E+00 -0.8040117767243267E+00 -0.8086674652146524E+00 -0.8130242928279436E+00 -0.8170993717012625E+00\n -0.8209081734003210E+00 -0.8244646490459413E+00 -0.8277813583284139E+00 -0.8308695990447905E+00 -0.8337395320876144E+00\n -0.8364002989992798E+00 -0.8388601306360481E+00 -0.8411264464017005E+00 -0.8432059440847066E+00 -0.8451046806746021E+00\n -0.8468281447278194E+00 -0.8483813209452364E+00 -0.8497687476559737E+00 -0.8509945678935900E+00 -0.8520625747193371E+00\n -0.8529762514032520E+00 -0.8537388100896948E+00 -0.8543532100632678E+00 -0.8548222073722460E+00 -0.8551483635456201E+00\n -0.8553340719766496E+00 -0.8553815772750362E+00 -0.8552929923971586E+00 -0.8550703138095166E+00 -0.8547151651374190E+00\n -0.8542288599579191E+00 -0.8536141001159478E+00 -0.8528770375410186E+00 -0.8520101609408499E+00 -0.8510194840111716E+00\n -0.8499064644469634E+00 -0.8486725211340236E+00 -0.8473190381844873E+00 -0.8458473685456269E+00 -0.8442588372306652E+00\n -0.8425547442066161E+00 -0.8407363669700096E+00 -0.8388049628370240E+00 -0.8367617709719433E+00 -0.8346080141771175E+00\n -0.8323449004663495E+00 -0.8299736244409459E+00 -0.8274953684882504E+00 -0.8249113038193059E+00 -0.8222225913624328E+00\n -0.8194312028270083E+00 -0.8165381656110142E+00 -0.8135381986589678E+00 -0.8104430318985472E+00 -0.8072486480744487E+00\n -0.8039562298106482E+00 -0.8005669360809051E+00 -0.7970819051712361E+00 -0.7935022573432313E+00 -0.7898290971921718E+00\n -0.7860635135890277E+00 -0.7822065375250205E+00 -0.7782588382932190E+00 -0.7742197532367605E+00 -0.7700870580234671E+00\n -0.7658477859557991E+00 -0.7614923740747592E+00 -0.7569976237158578E+00 -0.7523403043259940E+00 -0.7474924540260339E+00\n -0.7424262490644793E+00 -0.7371152605107092E+00 -0.7315359786377336E+00 -0.7256688371398212E+00 -0.7194997208059100E+00\n -0.7130147649374017E+00 -0.7062107830858579E+00 -0.6990840527339586E+00 -0.6916355099263285E+00 -0.6838688833277935E+00\n -0.6757902321840703E+00 -0.6674074545321318E+00 -0.6587298477273151E+00 -0.6497677278712075E+00 -0.6405321085533657E+00\n -0.6310344355558080E+00 -0.6212863721358168E+00 -0.6112922466782784E+00 -0.6010783652240157E+00 -0.5906465248553197E+00\n -0.5800085678384548E+00 -0.5691757383537599E+00 -0.5581582564186043E+00 -0.5469659281367214E+00 -0.5356081318998811E+00\n -0.5240938131155666E+00 -0.5124314854938561E+00 -0.5006292372993926E+00 -0.4886947412876452E+00 -0.4766352673015746E+00\n -0.4644576967166927E+00 -0.4521685380961173E+00 -0.4397739435565100E+00 -0.4272797254586216E+00 -0.4146913731272406E+00\n -0.4020140693777172E+00 -0.3892527066834290E+00 -0.3764119028647137E+00 -0.3634960162151266E+00 -0.3505091600038455E+00\n -0.3374552163098947E+00 -0.3243378491869073E+00 -0.3111605171690215E+00 -0.2979264851148429E+00 -0.2846388353950218E+00\n -0.2713004784405015E+00 -0.2579141626735364E+00 -0.2444824838465252E+00 -0.2310078938154909E+00 -0.2174927087734169E+00\n -0.2039391169721405E+00 -0.1903491859578246E+00 -0.1767248693464794E+00 -0.1630680131652866E+00 -0.1493803617833507E+00\n -0.1356635634555516E+00 -0.1219191755016809E+00 -0.1081486691423308E+00 -0.9435343401120377E-01 -0.8054492422289172E-01\n -0.6670414857713070E-01 -0.5284236389642416E-01 -0.3896067277847237E-01 -0.2506137114673379E-01 -0.1114505736346416E-01\n  0.2787869992531000E-02  0.1673649714292225E-01  0.3069995798121283E-01  0.4467743152122949E-01  0.5866813997114662E-01\n  0.7267134735307934E-01  0.8668635275736136E-01  0.1007124932111410E+00  0.1147491401988674E+00  0.1287956978815430E+00\n  0.1428516014164529E+00  0.1569163153723068E+00  0.1709893322335105E+00  0.1850701709882827E+00  0.1991583757947666E+00\n  0.2132535147217212E+00  0.2273551785580352E+00  0.2414629796876397E+00  0.2555765510256194E+00  0.2696955450121337E+00\n  0.2838196326609008E+00  0.2979485026581798E+00  0.3120818605100766E+00  0.3262194277345074E+00  0.3403609410961295E+00\n  0.3545061518803436E+00  0.3686548252055175E+00  0.3828067393706931E+00  0.3969616852363487E+00  0.4111194656371424E+00\n  0.4252798948247261E+00  0.4394427979383266E+00  0.4536080105023714E+00  0.4677753779491880E+00  0.4819447551653937E+00\n  0.4961160060612713E+00  0.5102890031615175E+00  0.5244636272329899E+00  0.5386397670398893E+00  0.5528173195811590E+00\n  0.5669961916288884E+00  0.5811763038337503E+00  0.5953575986744184E+00  0.6095400529056221E+00  0.6237236940889446E+00\n  0.6379086197162707E+00  0.6520950167319981E+00  0.6662831791056405E+00  0.6804735214359070E+00  0.6946665872026117E+00\n  0.7088630510277696E+00  0.7230637149920511E+00  0.7372694995930971E+00  0.7514814302896511E+00  0.7657006207512822E+00\n  0.7799282539728765E+00  0.7941655623409360E+00  0.8084138075998624E+00  0.8226742614970703E+00  0.8369481877037046E+00\n  0.8512368254336948E+00  0.8655413750282932E+00  0.8798629856427098E+00  0.8942027450633461E+00  0.9085616716017455E+00\n  0.9229407079527192E+00  0.9373407168612360E+00  0.9517624784199370E+00  0.9662066888041991E+00  0.9806739602523891E+00\n  0.9951648221004206E+00  0.1009679722693299E+01  0.1024219032006336E+01  0.1038783044826459E+01  0.1053371984359273E+01\n  0.1067986006143130E+01  0.1082625202169261E+01  0.1097289605119975E+01  0.1111979192652043E+01  0.1126693891663521E+01\n  0.1141433582496241E+01  0.1156198103032580E+01  0.1170987252656857E+01  0.1185800796057570E+01  0.1200638466853661E+01\n  0.1215499971032784E+01  0.1230384990195972E+01  0.1245293184603845E+01  0.1260224196025355E+01  0.1275177650390923E+01\n  0.1290153160254313E+01  0.1305150327069121E+01  0.1320168743286779E+01  0.1335207994283188E+01  0.1350267660123350E+01\n  0.1365347317171768E+01  0.1380446539557269E+01  0.1395564900502009E+01  0.1410701973522016E+01  0.1425857333509093E+01\n  0.1441030557701353E+01  0.1456221226550525E+01  0.1471428924494518E+01  0.1486653240641253E+01  0.1501893769371186E+01\n  0.1517150110865678E+01  0.1532421871566029E+01  0.1547708664570152E+01  0.1563010109971501E+01  0.1578325835145321E+01\n  0.1593655474987493E+01  0.1608998672109891E+01  0.1624371180506387E+01  0.1639740502114151E+01  0.1655122356345302E+01\n  0.1670516417892671E+01  0.1685922369619611E+01  0.1701339902568634E+01  0.1716768715949499E+01  0.1732208517108212E+01\n  0.1747659021479414E+01  0.1763119952524256E+01  0.1778591041654877E+01  0.1794072028147745E+01  0.1809562659046684E+01\n  0.1825062689057695E+01  0.1840571880435753E+01  0.1856090002865933E+01  0.1871616833338670E+01  0.1887152156020591E+01\n  0.1902695762121880E+01  0.1918247449760493E+01  0.1933807023824201E+01  0.1949374295830467E+01  0.1964949083785456E+01\n  0.1980531212042564E+01  0.1996120511159695E+01  0.2011716817757780E+01  0.2027319974378536E+01  0.2042929829344224E+01\n  0.2058546236616969E+01  0.2074169055660697E+01  0.2089798151303690E+01  0.2105433393602993E+01  0.2121074657710956E+01\n  0.2136721823742874E+01  0.2152374776647946E+01  0.2168033406081115E+01  0.2183697606278244E+01  0.2199367275932566E+01\n  0.2215042318074360E+01  0.2230722639952553E+01  0.2246408152918789E+01  0.2262098772314182E+01  0.2277794417357875E+01\n  0.2293495011038814E+01  0.2309200480010006E+01  0.2324910754483760E+01  0.2340625768131687E+01  0.2356345457985135E+01\n  0.2372069764338704E+01  0.2387798630656611E+01  0.2403532003480336E+01  0.2419269832339658E+01  0.2435012069665014E+01\n  0.2450758670702946E+01  0.2466509593432718E+01  0.2482264798486547E+01  0.2498024249070006E+01  0.2513787910886542E+01\n  0.2529555752062322E+01  0.2545327743074537E+01  0.2561103856680077E+01  0.2576884067847857E+01  0.2592668353691494E+01\n  0.2608456693404804E+01  0.2624249068198495E+01  0.2640045461239012E+01  0.2655845857588801E+01  0.2671650244148466E+01\n  0.2687458609600455E+01  0.2703270944353804E+01  0.2719087240491504E+01  0.2734907491718758E+01  0.2750731693312261E+01\n  0.2766559842071786E+01  0.2782391936272532E+01  0.2798227975619128E+01  0.2814067961200806E+01  0.2829911895447779E+01\n  0.2845759782089161E+01  0.2861611626111980E+01  0.2877467433721947E+01  0.2893327212308449E+01  0.2909190970421690E+01\n  0.2925058717783131E+01  0.2940930465370343E+01  0.2956806225646105E+01  0.2972686013021615E+01  0.2988569844663630E+01\n  0.3004457741744432E+01  0.3020349731207816E+01  0.3036245848084562E+01  0.3052146138327856E+01  0.3068050662093938E+01\n  0.3083959497337403E+01  0.3099872743561932E+01  0.3115790525549542E+01  0.3131712996890727E+01  0.3147640343150343E+01\n  0.3163572784533585E+01  0.3179510577942580E+01  0.3195454018354155E+01  0.3211403439482311E+01  0.3227359213718501E+01\n  0.3243321751378190E+01  0.3259291499296893E+01  0.3275268938843027E+01  0.3291254583421065E+01  0.3307248975552397E+01\n  0.3323252683617341E+01  0.3339266298346260E+01  0.3355290429139160E+01  0.3371325700295216E+01  0.3387372747215409E+01\n  0.3403432212646379E+01  0.3419504743012368E+01  0.3435590984884243E+01  0.3451691581620338E+01  0.3467807170206726E+01\n  0.3483938378319635E+01  0.3500085821623841E+01  0.3516250101317652E+01  0.3532431801926151E+01  0.3548631489345226E+01\n  0.3564849709131778E+01  0.3581086985033565E+01  0.3597344652416893E+01  0.3613622490530517E+01  0.3629920843003930E+01\n  0.3646240132058665E+01  0.3662580753832387E+01  0.3678943078161282E+01  0.3695327448517830E+01  0.3711734182088804E+01\n  0.3728163569978022E+01  0.3744615877522165E+01  0.3761091344705235E+01  0.3777590186658585E+01  0.3794112594236921E+01\n  0.3810658734656357E+01  0.3827228752187168E+01  0.3843822768889325E+01  0.3860440885384449E+01  0.3877083181654072E+01\n  0.3893749717858398E+01  0.3910440535169144E+01  0.3927155656609344E+01  0.3943895087897474E+01  0.3960658818286859E+01\n  0.3977446821402751E+01  0.3994259056066866E+01  0.4011095467111076E+01  0.4027955986175584E+01  0.4044840532489744E+01\n  0.4061749013633730E+01  0.4078681326279053E+01  0.4095637356908441E+01  0.4112616982511369E+01  0.4129620071256468E+01\n  0.4146646483140302E+01  0.4163696070611252E+01  0.4180768679168807E+01  0.4197864147938219E+01  0.4214982310220819E+01\n  0.4232122994020187E+01  0.4249286022544283E+01  0.4266471214683492E+01  0.4283678385466899E+01  0.4300907346494270E+01\n  0.4318157906348262E+01  0.4335429870982637E+01  0.4352723044092500E+01  0.4370037227462390E+01  0.4387372221295607E+01\n  0.4404727824526063E+01  0.4422103835109979E+01  0.4439500050301689E+01  0.4456916266912927E+01  0.4474352281555639E+01\n  0.4491807890868955E+01  0.4509282891733321E+01  0.4526777081468666E+01  0.4544290258021121E+01  0.4561822220135298E+01\n  0.4579372767515736E+01  0.4596941700976757E+01  0.4614528822579842E+01  0.4632133935763207E+01  0.4649756845459109E+01\n  0.4667397358203146E+01  0.4685055282234032E+01  0.4702730427585877E+01  0.4720422606171269E+01  0.4738131631857456E+01\n  0.4755857320535952E+01  0.4773599490184296E+01  0.4791357960922696E+01  0.4809132555063428E+01  0.4826923097156268E+01\n  0.4844729414026645E+01  0.4862551334810888E+01  0.4880388690984844E+01  0.4898241316389871E+01  0.4916109047253045E+01\n  0.4933991722205747E+01  0.4951889182295560E+01  0.4969801270997834E+01  0.4987727834222142E+01  0.5005668720316748E+01\n  0.5023623780069656E+01  0.5041592866707418E+01  0.5059575835892119E+01  0.5077572545715171E+01  0.5095582856689347E+01\n  0.5113606631739316E+01  0.5131643736190284E+01  0.5149694037754543E+01  0.5167757406516841E+01  0.5185833714918900E+01\n  0.5203922837741345E+01  0.5222024652085636E+01  0.5240139037355135E+01  0.5258265875233761E+01  0.5276405049664660E+01\n  0.5294556446828821E+01  0.5312719955121622E+01  0.5330895465129331E+01  0.5349083197331439E+01  0.5367282875848076E+01\n  0.5385494235244209E+01  0.5403717174591350E+01  0.5421951595034059E+01  0.5440197399763505E+01  0.5458454493990288E+01\n  0.5476722784918579E+01  0.5495002181717851E+01  0.5513292595496480E+01  0.5531593939274245E+01  0.5549906127955438E+01\n  0.5568229078301286E+01  0.5586562708902733E+01  0.5604906940153441E+01  0.5623261694222876E+01  0.5641626895028466E+01\n  0.5660002468209782E+01  0.5678388341101183E+01  0.5696784442705152E+01  0.5715190703666806E+01  0.5733607056245972E+01\n  0.5752033434292926E+01  0.5770469773221294E+01  0.5788916009983083E+01  0.5807372083043617E+01  0.5825837932355000E+01\n  0.5844313499333083E+01  0.5862798726831699E+01  0.5881293559118404E+01  0.5899797941851205E+01  0.5918311822053070E+01\n  0.5936835148090665E+01  0.5955367869649308E+01  0.5973909937710687E+01  0.5992461304530181E+01  0.6010993710199870E+01\n  0.6029563495483089E+01  0.6048142443794930E+01  0.6066730512264272E+01  0.6085327659184557E+01  0.6103933843993559E+01\n  0.6122549027251964E+01  0.6141173170624000E+01  0.6159806236856411E+01  0.6178448189759933E+01  0.6197098994189034E+01\n  0.6215758616023336E+01  0.6234427022148239E+01  0.6253104180437035E+01  0.6271790059732240E+01  0.6290484629827574E+01\n  0.6309187861451164E+01  0.6327899726246912E+01  0.6346620196758565E+01  0.6365349246411810E+01  0.6384086849498459E+01\n  0.6402832981160216E+01  0.6421587617372310E+01  0.6440350734927804E+01  0.6459122311422306E+01  0.6477902325238560E+01\n  0.6496690755531631E+01  0.6515487582214305E+01  0.6534292785942100E+01  0.6553106348100002E+01  0.6571928250787252E+01\n  0.6590758476804609E+01  0.6609597009640567E+01  0.6628443833458164E+01  0.6647298933081430E+01  0.6666162293983589E+01\n  0.6685033902273446E+01  0.6703913744683604E+01  0.6722801808558643E+01  0.6741698081842145E+01  0.6760602553065809E+01\n  0.6779515211338037E+01  0.6798436046331943E+01  0.6817365048274937E+01  0.6836302207937280E+01  0.6855247516621816E+01\n  0.6874200966153282E+01  0.6893162548867991E+01  0.6912132257603389E+01  0.6931110085688530E+01  0.6950096026934304E+01\n  0.6969090075623598E+01  0.6988092226501735E+01  0.7007102474767507E+01  0.7026120816064235E+01  0.7045147246470421E+01\n  0.7064181762491003E+01  0.7083224361049062E+01  0.7102275039477362E+01  0.7121333795510111E+01  0.7140400627274076E+01\n  0.7159475533281437E+01  0.7178558512421901E+01  0.7197649563954585E+01  0.7216748687500626E+01  0.7235855883035654E+01\n  0.7254971150883136E+01  0.7274094491705881E+01  0.7293225906500751E+01  0.7312365396590522E+01  0.7331512963616746E+01\n  0.7350668609535120E+01  0.7369832336606407E+01  0.7389004147392185E+01  0.7408184044746747E+01  0.7427372031812411E+01\n  0.7446568112012670E+01  0.7465772289046285E+01  0.7484984566881565E+01  0.7504204949750658E+01  0.7523433442143897E+01\n  0.7542670048804212E+01  0.7561914774721672E+01  0.7581167625127947E+01  0.7600428605492169E+01  0.7619697721514100E+01\n  0.7638974979120491E+01  0.7658260384459254E+01  0.7677553943895177E+01  0.7696855664005213E+01  0.7716165551573454E+01\n  0.7735483613586325E+01  0.7754812044852841E+01  0.7774146430634772E+01  0.7793489013893222E+01  0.7812839802364948E+01\n  0.7832198803967884E+01  0.7851566026796888E+01  0.7870941479120802E+01  0.7890325169377391E+01  0.7909717106169680E+01\n  0.7929117298262355E+01  0.7948525754578284E+01  0.7967942484194026E+01  0.7987367496337072E+01  0.8006800800381754E+01\n  0.8026242405846276E+01  0.8045692322388845E+01  0.8065150559804493E+01  0.8084617128021762E+01  0.8104092037099576E+01\n  0.8123575297224079E+01  0.8143066918705415E+01  0.8162566911974665E+01  0.8182075287581299E+01  0.8201592056189469E+01\n  0.8221117228575778E+01  0.8240650815626054E+01  0.8260192828332890E+01  0.8279743277792548E+01  0.8299302175202868E+01\n  0.8318869531860187E+01  0.8338445359156225E+01  0.8358029668577160E+01  0.8377622471699610E+01  0.8397223780188767E+01\n  0.8416833605796000E+01  0.8436451960357047E+01  0.8456078855787993E+01  0.8475714304085500E+01  0.8495358317322456E+01\n  0.8515010907646797E+01  0.8534672087279333E+01  0.8554341868511301E+01  0.8574020263702693E+01  0.8593707285279649E+01\n  0.8613402945733171E+01  0.8633107257617183E+01  0.8652820233545668E+01  0.8672541886191894E+01  0.8692272228285830E+01\n  0.8712011272612585E+01  0.8731759032010899E+01  0.8751515519370983E+01  0.8771280747633298E+01  0.8791054729785913E+01\n  0.8810837478864300E+01  0.8830629007948218E+01  0.8850429330161134E+01  0.8870238458668837E+01  0.8890056406676365E+01\n  0.8909883187428321E+01  0.8929718814206822E+01  0.8949563300329515E+01  0.8969416659148337E+01  0.8989278904048760E+01\n  0.9009150048447722E+01  0.9029030105792657E+01  0.9048919089560115E+01  0.9068817013254048E+01  0.9088723890405547E+01\n  0.9108639734570488E+01  0.9128564559328495E+01  0.9148498378283008E+01  0.9168441205058130E+01  0.9188393053299251E+01\n  0.9208353936670647E+01  0.9228323868854844E+01  0.9248302863551771E+01  0.9268290934477903E+01  0.9288288095363413E+01\n  0.9308294359953749E+01  0.9328309742007235E+01  0.9348334255293310E+01  0.9368367913593602E+01  0.9388410730698894E+01\n  0.9408462720409801E+01  0.9428523896534983E+01  0.9448594272890006E+01  0.9468673863297340E+01  0.9488762681584802E+01\n  0.9508860741584925E+01  0.9528968057134250E+01  0.9549084642072614E+01  0.9569210510241618E+01  0.9589345675484282E+01\n  0.9609490151644962E+01  0.9629643952567108E+01  0.9649807092094022E+01  0.9669979584066937E+01  0.9690161442325262E+01\n  0.9710352680705284E+01  0.9730553313039422E+01  0.9750763353155946E+01  0.9770982814877840E+01  0.9791211712022829E+01\n  0.9811450058402528E+01  0.9831697867820566E+01  0.9851955154073806E+01  0.9872221930951270E+01  0.9892498212232454E+01\n  0.9912784011688075E+01  0.9933079343078646E+01  0.9953384220154447E+01  0.9973698656654562E+01  0.9994022666306762E+01\n  0.1001435626282665E+02  0.1003470009456882E+02  0.1005505370279354E+02  0.1007541692221616E+02  0.1009578976686720E+02\n  0.1011617225075480E+02  0.1013656438786407E+02  0.1015696619215623E+02  0.1017737767756941E+02  0.1019779885801728E+02\n  0.1021822974738978E+02  0.1023867035955192E+02  0.1025912070834428E+02  0.1027958080758259E+02  0.1030005067105711E+02\n  0.1032053031253292E+02  0.1034101974574955E+02  0.1036151898442014E+02  0.1038202804223235E+02  0.1040254693284723E+02\n  0.1042307566989899E+02  0.1044361426699570E+02  0.1046416273771851E+02  0.1048472109562067E+02  0.1050528935422884E+02\n  0.1052586752704187E+02  0.1054645562753072E+02  0.1056705366913900E+02  0.1058766166528144E+02  0.1060827962934513E+02\n  0.1062890757468810E+02  0.1064950908609077E+02  0.1067015700336870E+02  0.1069081494185409E+02  0.1071148291478914E+02\n  0.1073216093538781E+02  0.1075284901683381E+02  0.1077354717228192E+02  0.1079425541485676E+02  0.1081497375765323E+02\n  0.1083570221373617E+02  0.1085644079614013E+02  0.1087718951786965E+02  0.1089794839189827E+02  0.1091871743116957E+02\n  0.1093949664859596E+02  0.1096028605705928E+02  0.1098108566940994E+02  0.1100189549846826E+02  0.1102271555702228E+02\n  0.1104354585782909E+02  0.1106438641361461E+02  0.1108523723707299E+02  0.1110609834086651E+02  0.1112696973762601E+02\n  0.1114785143995061E+02  0.1116874346040703E+02  0.1118964581153000E+02  0.1121055850582263E+02  0.1123148155575473E+02\n  0.1125241497376490E+02  0.1127335877225852E+02  0.1129431296360895E+02  0.1131527756015691E+02  0.1133625257420954E+02\n  0.1135723801804252E+02  0.1137823390389772E+02  0.1139924024398471E+02  0.1142025705047962E+02  0.1144128433552578E+02\n  0.1146232211123331E+02  0.1148337038967921E+02  0.1150442918290690E+02  0.1152549850292635E+02  0.1154657836171509E+02\n  0.1156766877121638E+02  0.1158876974333961E+02  0.1160988128996192E+02  0.1163100342292520E+02  0.1165213615403900E+02\n  0.1167327949507859E+02  0.1169443345778498E+02  0.1171559805386622E+02  0.1173677329499617E+02  0.1175795919281455E+02\n  0.1177915575892700E+02  0.1180036300490579E+02  0.1182158094228856E+02  0.1184280958257915E+02  0.1186404893724685E+02\n  0.1188529901772762E+02  0.1190655983542237E+02  0.1192783140169806E+02  0.1194911372788769E+02  0.1197040682528970E+02\n  0.1199171070516803E+02  0.1201302537875296E+02  0.1203435085723962E+02  0.1205568715178919E+02  0.1207703427352811E+02\n  0.1209839223354848E+02  0.1211976104290818E+02  0.1214114071263091E+02  0.1216253125370503E+02  0.1218393267708453E+02\n  0.1220534499368958E+02  0.1222676821440496E+02  0.1224820235008141E+02  0.1226964741153520E+02  0.1229110340954733E+02\n  0.1231257035486524E+02  0.1233404825820068E+02  0.1235553713023114E+02  0.1237703698160018E+02  0.1239854782291576E+02\n  0.1242006966475194E+02  0.1244160251764720E+02  0.1246314639210712E+02  0.1248470129860064E+02  0.1250626724756299E+02\n  0.1252784424939512E+02  0.1254943231446288E+02  0.1257103145309731E+02  0.1259264167559508E+02  0.1261426299221796E+02\n  0.1263589541319379E+02  0.1265753894871477E+02  0.1267919360893930E+02  0.1270085940399096E+02  0.1272253634395807E+02\n  0.1274422443889557E+02  0.1276592369882235E+02  0.1278763413372411E+02  0.1280935575355105E+02  0.1283108856821895E+02\n  0.1285283258760953E+02  0.1287458782156935E+02  0.1289635427991064E+02  0.1291813197241135E+02  0.1293992090881460E+02\n  0.1296172109882920E+02  0.1298353255212942E+02  0.1300535527835513E+02  0.1302718928711147E+02  0.1304903458796954E+02\n  0.1307089119046614E+02  0.1309275910410295E+02  0.1311463833834799E+02  0.1313652890263444E+02  0.1315843080636154E+02\n  0.1318034405889441E+02  0.1320226866956276E+02  0.1322420464766316E+02  0.1324615200245751E+02  0.1326811074317337E+02\n  0.1329008087900448E+02  0.1331206241910968E+02  0.1333405537261467E+02  0.1335605974861005E+02  0.1337807555615254E+02\n  0.1340010280426523E+02  0.1342214150193681E+02  0.1344419165812167E+02  0.1346625328174062E+02  0.1348832638168022E+02\n  0.1351041096679353E+02  0.1353250704589885E+02  0.1355461462778115E+02  0.1357673372119115E+02  0.1359886433484638E+02\n  0.1362100647742997E+02  0.1364316015759144E+02  0.1366532538394614E+02  0.1368750216507624E+02  0.1370969050953028E+02\n  0.1373189042582217E+02  0.1375410192243334E+02  0.1377632500781127E+02  0.1379855969036910E+02  0.1382080597848685E+02\n  0.1384306388051198E+02  0.1386533340475719E+02  0.1388761455950183E+02  0.1390990735299232E+02  0.1393221179344152E+02\n  0.1395452788902909E+02  0.1397685564790063E+02  0.1399919507816944E+02  0.1402154618791462E+02  0.1404390898518284E+02\n  0.1406628347798727E+02  0.1408866967430708E+02  0.1411106758208999E+02  0.1413347720924909E+02  0.1415589856366520E+02\n  0.1417833165318584E+02  0.1420077648562560E+02  0.1422323306876623E+02  0.1424570141035628E+02  0.1426818151811159E+02\n  0.1429067339971510E+02  0.1431317706281675E+02  0.1433569251503422E+02  0.1435821976395167E+02  0.1438075881712129E+02\n  0.1440330968206166E+02  0.1442587236626011E+02  0.1444844687717011E+02  0.1447103322221295E+02  0.1449363140877790E+02\n  0.1451624144422053E+02  0.1453886333586524E+02  0.1456149709100336E+02  0.1458414271689378E+02  0.1460680022076286E+02\n  0.1462946960980574E+02  0.1465215089118382E+02  0.1467483217256191E+02  0.1469751345393999E+02  0.1472019473531807E+02\n  0.0000000000000000E+00  0.1353993104251454E-10  0.8388292241576100E-09  0.9249073098372293E-08  0.5030460210239372E-07\n  0.1857568627085415E-06  0.5369197789403567E-06  0.1310591025996369E-05  0.2826805415934704E-05  0.5547382204843158E-05\n  0.1010438933657199E-04  0.1732779196828242E-04  0.2827168149581216E-04  0.4423859602721504E-04  0.6680154505955162E-04\n  0.9782344112589946E-04  0.1394737204414197E-03  0.1942420040555485E-03  0.2649487116051849E-03  0.3547525922860875E-03\n  0.4671551828778767E-03  0.6060022412741116E-03  0.7754822366296253E-03  0.9801220045380374E-03  0.1224779698140599E-02\n  0.1514635184246249E-02  0.1855178047873591E-02  0.2252193379531577E-02  0.2711745527424523E-02  0.3240160001952968E-02\n  0.3844003722708506E-02  0.4530063798923195E-02  0.5305325033301281E-02  0.6176946336577127E-02  0.7152236236230247E-02\n  0.8238627657747143E-02  0.9443652150831976E-02  0.1077491372619769E-01  0.1224006246116400E-01  0.1384676802438050E-01\n  0.1560269326170134E-01  0.1751546797666743E-01  0.1959266303029807E-01  0.2184176487603834E-01  0.2427015063682662E-01\n  0.2688506382240104E-01  0.2969359077621229E-01  0.3270263793270082E-01  0.3591890995727141E-01  0.3934888883309312E-01\n  0.4299881395089809E-01  0.4687466325027261E-01  0.5098213545355013E-01  0.5532663342634311E-01  0.5991324869200370E-01\n  0.6474674712088738E-01  0.6983155580921956E-01  0.7517175115663279E-01  0.8077104814605506E-01  0.8663279082458433E-01\n  0.9275994397927995E-01  0.9915508599743368E-01  0.1058204028968442E+00  0.1127576835079031E+00  0.1199683157858993E+00\n  0.1274532842288529E+00  0.1352131683733934E+00  0.1432481423386811E+00  0.1515579753861312E+00  0.1601420334607315E+00\n  0.1689992816780165E+00  0.1781282877192849E+00  0.1875272260963912E+00  0.1971938832464155E+00  0.2071256634156783E+00\n  0.2173195952919433E+00  0.2277723393431911E+00  0.2384801958210745E+00  0.2494391133870441E+00  0.2606446983191641E+00\n  0.2720922242578070E+00  0.2837766424487163E+00  0.2956925924423432E+00  0.3078344132088888E+00  0.3201961546291090E+00\n  0.3327715893216590E+00  0.3455542247685515E+00  0.3585373157011766E+00  0.3717138767102711E+00  0.3850766950442213E+00\n  0.3986183435611380E+00  0.4123311938012285E+00  0.4262074291471305E+00  0.4402390580410298E+00  0.4544179272285823E+00\n  0.4687357350008659E+00  0.4831840444068136E+00  0.4977542964098284E+00  0.5124378229635098E+00  0.5272258599826819E+00\n  0.5421095601871498E+00  0.5570800057968556E+00  0.5721282210583372E+00  0.5872451845836121E+00  0.6024218414838124E+00\n  0.6176491152810919E+00  0.6329179195834939E+00  0.6482191695086116E+00  0.6635437928430084E+00  0.6788827409254566E+00\n  0.6942269992431367E+00  0.7095675977309721E+00  0.7248956207653083E+00  0.7402022168441228E+00  0.7554786079469059E+00\n  0.7707160985682907E+00  0.7859060844203938E+00  0.8010400607996875E+00  0.8161096306150647E+00  0.8311065120745426E+00\n  0.8460225460288135E+00  0.8608497029705907E+00  0.8755800896893798E+00  0.8902059555819789E+00  0.9047196986196469E+00\n  0.9191138709734521E+00  0.9333811842999254E+00  0.9475145146896305E+00  0.9615069072817952E+00  0.9753515805486259E+00\n  0.9890419302533513E+00  0.1002571533086473E+01  0.1015934149985090E+01  0.1029123729140496E+01  0.1042134408699634E+01\n  0.1054960519166231E+01  0.1067596585507774E+01  0.1080037328974709E+01  0.1092277668638490E+01  0.1104312722655314E+01\n  0.1116137809262549E+01  0.1127748447515049E+01  0.1139140357768670E+01  0.1150309461918440E+01  0.1161251883398932E+01\n  0.1171963946954482E+01  0.1182442178186937E+01  0.1192683302888721E+01  0.1202684246168965E+01  0.1212442131380551E+01\n  0.1221954278855855E+01  0.1231218204459002E+01  0.1240231617962418E+01  0.1248992421255417E+01  0.1257498706392534E+01\n  0.1265748753489242E+01  0.1273741028472617E+01  0.1281474180694483E+01  0.1288947040414400E+01  0.1296158616159860E+01\n  0.1303108091970871E+01  0.1309794824536052E+01  0.1316218340227214E+01  0.1322378332039313E+01  0.1328274656442483E+01\n  0.1333907330152773E+01  0.1339276526828055E+01  0.1344382573695405E+01  0.1349225948116168E+01  0.1353807274094698E+01\n  0.1358127318736686E+01  0.1362186988662762E+01  0.1365987326382977E+01  0.1369529506637536E+01  0.1372814832709058E+01\n  0.1375844732711431E+01  0.1378620755860210E+01  0.1381144568729309E+01  0.1383417951498597E+01  0.1385442794196838E+01\n  0.1387221092944273E+01  0.1388754946198940E+01  0.1390046551010727E+01  0.1391098199286932E+01  0.1391912274073011E+01\n  0.1392491245851972E+01  0.1392837668865793E+01  0.1392954177462024E+01  0.1392843482468616E+01  0.1392508367599889E+01\n  0.1391951685896345E+01  0.1391176356200982E+01  0.1390185359674514E+01  0.1388981736351864E+01  0.1387568581742103E+01\n  0.1385949043473885E+01  0.1384126317988323E+01  0.1382103647281089E+01  0.1379884315695416E+01  0.1377471646767576E+01\n  0.1374869000126249E+01  0.1372079768447110E+01  0.1369107374463862E+01  0.1365955268036790E+01  0.1362626923279866E+01\n  0.1359125835747256E+01  0.1355455519680076E+01  0.1351619505314043E+01  0.1347621336248676E+01  0.1343464566878517E+01\n  0.1339152759886839E+01  0.1334689483802160E+01  0.1330078310617843E+01  0.1325322813474955E+01  0.1320426564408511E+01\n  0.1315393132157122E+01  0.1310226080036051E+01  0.1304928963873535E+01  0.1299505330010257E+01  0.1293958713361729E+01\n  0.1288292635543297E+01  0.1282510603057466E+01  0.1276616105543136E+01  0.1270612614086314E+01  0.1264503579591840E+01\n  0.1258292431215576E+01  0.1251982574856509E+01  0.1245577391708143E+01  0.1239080236868539E+01  0.1232494438008325E+01\n  0.1225823294095955E+01  0.1219070074179471E+01  0.1212238016223985E+01  0.1205330326004104E+01  0.1198350176050432E+01\n  0.1191300704649328E+01  0.1184185014895046E+01  0.1177006173793340E+01  0.1169767211415667E+01  0.1162471120103017E+01\n  0.1155120853718478E+01  0.1147719326947540E+01  0.1140269414645216E+01  0.1132773951228974E+01  0.1125235730116526E+01\n  0.1117657503207466E+01  0.1110041980407784E+01  0.1102391829196240E+01  0.1094709674231619E+01  0.1086998096999836E+01\n  0.1079259635499933E+01  0.1071496783967914E+01  0.1063711992637463E+01  0.1055907667536516E+01  0.1048086170318704E+01\n  0.1040249818128692E+01  0.1032400883500383E+01  0.1024541594287072E+01  0.1016674133622509E+01  0.1008800639911969E+01\n  0.1000923206852306E+01  0.9930438834801176E+00  0.9851646742469989E+00  0.9772875391210279E+00  0.9694143937135093E+00\n  0.9615471094301068E+00  0.9536875136454389E+00  0.9458373899002650E+00  0.9379984781203971E+00  0.9301724748564474E+00\n  0.9223610335436100E+00  0.9145657647805825E+00  0.9067882366268739E+00  0.8990299749176214E+00  0.8912924635951891E+00\n  0.8835771450567167E+00  0.8758854205168844E+00  0.8682186503851309E+00  0.8605781546565948E+00  0.8529652133160540E+00\n  0.8453810667541574E+00  0.8378269161952663E+00  0.8303039241362116E+00  0.8228132147953376E+00  0.8153558745711390E+00\n  0.8079329525099168E+00  0.8005454607817869E+00  0.7931943751644794E+00  0.7858806355343143E+00  0.7786051463638074E+00\n  0.7713687772253328E+00  0.7641723633003079E+00  0.7570167058933844E+00  0.7499025729511121E+00  0.7428306995846062E+00\n  0.7358017885957079E+00  0.7288165110062022E+00  0.7218755065895981E+00  0.7149793844050807E+00  0.7081287233331618E+00\n  0.7013240726126531E+00  0.6945659523785421E+00  0.6878548542003931E+00  0.6811912416209033E+00  0.6745755506942478E+00\n  0.6680081905238785E+00  0.6614895437994238E+00  0.6550199673323996E+00  0.6485997925903795E+00  0.6422293262293763E+00\n  0.6359088506240991E+00  0.6296386243958603E+00  0.6234188829378302E+00  0.6172498389374158E+00  0.6111316828955082E+00\n  0.6050645836423746E+00  0.5990486888499783E+00  0.5930841255405085E+00  0.5871710005909401E+00  0.5813094012334057E+00\n  0.5754993955512363E+00  0.5697410329704640E+00  0.5640343447466610E+00  0.5583793444469337E+00  0.5527760284269526E+00\n  0.5472243763028636E+00  0.5417243514179740E+00  0.5362759013040796E+00  0.5308789581373305E+00  0.5255334391885358E+00\n  0.5202392472678002E+00  0.5149962711634282E+00  0.5098043860749818E+00  0.5046634540404551E+00  0.4995733243574682E+00\n  0.4945338339984403E+00  0.4895448080196743E+00  0.4846060599643165E+00  0.4797173922591353E+00  0.4748785966051021E+00\n  0.4700894543617143E+00  0.4653497369250721E+00  0.4606592060996474E+00  0.4560176144637674E+00  0.4514247057287724E+00\n  0.4468802150918596E+00  0.4423838695826035E+00  0.4379353884031551E+00  0.4335344832621323E+00  0.4291808587022021E+00\n  0.4248742124213836E+00  0.4206142355880688E+00  0.4164006131498095E+00  0.4122330241358657E+00  0.4081111419535712E+00\n  0.4040346346785266E+00  0.4000031653386660E+00  0.3960163921922264E+00  0.3920739689996687E+00  0.3881755452895829E+00\n  0.3843207666186236E+00  0.3805092748255328E+00  0.3767407082792822E+00  0.3730147021214013E+00  0.3693308885025316E+00\n  0.3656888968132757E+00  0.3620883539093817E+00  0.3585288843313358E+00  0.3550101105184098E+00  0.3515316530172374E+00\n  0.3480931306849715E+00  0.3446941608870878E+00  0.3413343596899074E+00  0.3380133420478924E+00  0.3347307219857906E+00\n  0.3314861127756896E+00  0.3282791271090590E+00  0.3251093772638369E+00  0.3219764752666408E+00  0.3188800330501668E+00\n  0.3158196626058555E+00  0.3127949761318864E+00  0.3098055861765790E+00  0.3068511057772733E+00  0.3039311485947566E+00\n  0.3010453290433147E+00  0.2981932624164749E+00  0.2953745650085209E+00  0.2925888542318437E+00  0.2898357487302072E+00\n  0.2871148684879984E+00  0.2844258349355381E+00  0.2817682710505188E+00  0.2791418014556485E+00  0.2765460525125659E+00\n  0.2739806524121053E+00  0.2714452312609780E+00  0.2689394211649400E+00  0.2664628563085241E+00  0.2640151730313972E+00\n  0.2615960099014194E+00  0.2592050077844695E+00  0.2568418099111116E+00  0.2545060619401636E+00  0.2521974120192415E+00\n  0.2499155108423418E+00  0.2476600117045342E+00  0.2454305705538249E+00  0.2432268460402566E+00  0.2410484995623153E+00\n  0.2388951953107000E+00  0.2367666003095238E+00  0.2346623844550057E+00  0.2325822205517195E+00  0.2305257843464541E+00\n  0.2284927545597522E+00  0.2264828129151803E+00  0.2244956441663966E+00  0.2225309361220672E+00  0.2205883796686914E+00\n  0.2186676687913947E+00  0.2167685005927387E+00  0.2148905753096101E+00  0.2130335963282359E+00  0.2111972701973850E+00\n  0.2093813066398013E+00  0.2075854185619259E+00  0.2058093220619543E+00  0.2040527364362842E+00  0.2023153841843948E+00\n  0.2005969910122156E+00  0.1988972858340233E+00  0.1972160007729189E+00  0.1955528711599284E+00  0.1939076355317738E+00\n  0.1922800356273561E+00  0.1906698163829959E+00  0.1890767259264730E+00  0.1875005155699057E+00  0.1859409398015150E+00\n  0.1843977562763068E+00  0.1828707258057186E+00  0.1813596123462640E+00  0.1798641829872162E+00  0.1783842079373634E+00\n  0.1769194605108787E+00  0.1754697171123329E+00  0.1740347572208903E+00  0.1726143633737163E+00  0.1712083211486371E+00\n  0.1698164191460766E+00  0.1684384489703060E+00  0.1670742052100373E+00  0.1657234854183902E+00  0.1643860900922608E+00\n  0.1630618226511230E+00  0.1617504894152905E+00  0.1604518995836656E+00  0.1591658652110027E+00  0.1578922011847117E+00\n  0.1566307252012296E+00  0.1553812577419816E+00  0.1541436220489565E+00  0.1529176440999246E+00  0.1517031525833137E+00\n  0.1504999788727721E+00  0.1493079570014363E+00  0.1481269236359270E+00  0.1469567180500930E+00  0.1457971820985229E+00\n  0.1446481601898438E+00  0.1435094992598286E+00  0.1423810487443264E+00  0.1412626605520352E+00  0.1401541890371375E+00\n  0.1390554909718100E+00  0.1379664255186285E+00  0.1368868542028802E+00  0.1358166408848024E+00  0.1347556517317591E+00\n  0.1337037551903719E+00  0.1326608219586172E+00  0.1316267249579071E+00  0.1306013393051614E+00  0.1295845422848884E+00\n  0.1285762133212826E+00  0.1275762339503552E+00  0.1265844877921041E+00  0.1256008605227379E+00  0.1246252398469633E+00\n  0.1236575154703454E+00  0.1226975790717512E+00  0.1217453242758857E+00  0.1208006466259300E+00  0.1198634435562893E+00\n  0.1189336143654594E+00  0.1180110601890202E+00  0.1170956839727626E+00  0.1161873904459593E+00  0.1152860860947805E+00\n  0.1143916791358692E+00  0.1135040794900743E+00  0.1126231987563555E+00  0.1117489501858582E+00  0.1108812486561707E+00\n  0.1100200106457653E+00  0.1091651542086276E+00  0.1083165989490820E+00  0.1074742659968154E+00  0.1066380779821052E+00\n  0.1058079590112519E+00  0.1049838346422265E+00  0.1041656318605295E+00  0.1033532790552702E+00  0.1025467059954647E+00\n  0.1017458438065610E+00  0.1009506249471885E+00  0.1001609831861390E+00  0.9937685357957692E-01  0.9859817244848566E-01\n  0.9782487735634983E-01  0.9705690708707349E-01  0.9629420162313919E-01  0.9553670212400750E-01  0.9478435090475915E-01\n  0.9403709141497944E-01  0.9329486821788784E-01  0.9255762696971309E-01  0.9182531439931366E-01  0.9109787828804443E-01\n  0.9037526744987140E-01  0.8965743171173354E-01  0.8894432189415159E-01  0.8823588979208480E-01  0.8753208815603555E-01\n  0.8683287067340226E-01  0.8613819195007733E-01  0.8544800749229453E-01  0.8476227368872161E-01  0.8408094779279952E-01\n  0.8340398790532604E-01  0.8273135295728512E-01  0.8206300269292026E-01  0.8139889765304979E-01  0.8073899915862499E-01\n  0.8008326929452908E-01  0.7943167089361686E-01  0.7878416752099129E-01  0.7814072345852002E-01  0.7750130368958605E-01\n  0.7686587388407512E-01  0.7623440038359473E-01  0.7560685018692687E-01  0.7498319093571042E-01  0.7436339090035288E-01\n  0.7374741896616860E-01  0.7313524461974377E-01  0.7252683793552536E-01  0.7192216956263091E-01  0.7132121071188088E-01\n  0.7072393314304767E-01  0.7013030915232332E-01  0.6954031156000041E-01  0.6895391369836718E-01  0.6837108939981353E-01\n  0.6779181298514624E-01  0.6721605925211059E-01  0.6664380346411826E-01  0.6607502133917825E-01  0.6550968903902774E-01\n  0.6494778315846379E-01  0.6438928071487048E-01  0.6383415913794230E-01  0.6328239625959906E-01  0.6273397030409252E-01\n  0.6218885987830131E-01  0.6164704396221248E-01  0.6110850189958664E-01  0.6057321338880634E-01  0.6004115847390429E-01\n  0.5951231753576908E-01  0.5898667128352685E-01  0.5846420074609691E-01  0.5794488726391903E-01  0.5742871248084910E-01\n  0.5691565833622340E-01  0.5640570705708669E-01  0.5589884115058460E-01  0.5539504339651542E-01  0.5489429684004177E-01\n  0.5439658478455860E-01  0.5390189078471544E-01  0.5341019863959112E-01  0.5292149238601910E-01  0.5243575629206128E-01\n  0.5195297485062703E-01  0.5147313277323774E-01  0.5099621498393213E-01  0.5052220661331305E-01  0.5005109299273101E-01\n  0.4958285964860470E-01  0.4911749229687554E-01  0.4865497683759399E-01  0.4819529934963621E-01  0.4773844608554897E-01\n  0.4728440346652141E-01  0.4683315807748007E-01  0.4638469666230777E-01  0.4593900611918208E-01  0.4549607349603369E-01\n  0.4505588598612064E-01  0.4461843092371864E-01  0.4418369577992455E-01  0.4375166815857148E-01  0.4332233579225347E-01\n  0.4289568653845881E-01  0.4247170837580991E-01  0.4205038940040735E-01  0.4163171782227736E-01  0.4121568196192090E-01\n  0.4080227024696274E-01  0.4039147120889799E-01  0.3998327347993617E-01  0.3957766578994016E-01  0.3917463696345855E-01\n  0.3877417591685010E-01  0.3837627165549899E-01  0.3798091327111933E-01  0.3758808993914695E-01  0.3719779091621782E-01\n  0.3681000553773126E-01  0.3642472321549702E-01  0.3604193343546399E-01  0.3566162575553031E-01  0.3528378980343305E-01\n  0.3490841527471608E-01  0.3453549193077510E-01  0.3416500959697864E-01  0.3379695816086406E-01  0.3343132757040658E-01\n  0.3306810783236118E-01  0.3270728901067565E-01  0.3234886122497425E-01  0.3199281464910996E-01  0.3163913950978563E-01\n  0.3128782608524168E-01  0.3093886470401072E-01  0.3059224574373675E-01  0.3024795963005924E-01  0.2990599683556058E-01\n  0.2956634787877624E-01  0.2922900332326631E-01  0.2889395377674870E-01  0.2856118989029233E-01  0.2823070235756949E-01\n  0.2790248191416771E-01  0.2757651933695894E-01  0.2725280544352705E-01  0.2693133109165141E-01  0.2661208717884729E-01\n  0.2629506464196176E-01  0.2598025445682497E-01  0.2566764763795566E-01  0.2535723523832159E-01  0.2504900834915327E-01\n  0.2474295809981158E-01  0.2443907565770799E-01  0.2413735222827780E-01  0.2383777905500606E-01  0.2354034741950517E-01\n  0.2324504864164501E-01  0.2295187407973472E-01  0.2266081513075604E-01  0.2237186323064830E-01  0.2208500985464502E-01\n  0.2180024651766184E-01  0.2151756477473634E-01  0.2123695622151859E-01  0.2095841249481422E-01  0.2068192527317876E-01\n  0.2040748627756411E-01  0.2013508727201714E-01  0.1986472006443057E-01  0.1959637650734679E-01  0.1933004849881481E-01\n  0.1906572798330038E-01  0.1880340695265023E-01  0.1854307744711091E-01  0.1828473155640220E-01  0.1802836142084625E-01\n  0.1777395923255295E-01  0.1752151723666215E-01  0.1727102773264334E-01  0.1702248307565384E-01  0.1677587567795624E-01\n  0.1653119801039607E-01  0.1628844260394024E-01  0.1604760205127793E-01  0.1580866900848456E-01  0.1557163619674996E-01\n  0.1533649640417201E-01  0.1510324248761716E-01  0.1487186737464884E-01  0.1464236406552526E-01  0.1441472563526792E-01\n  0.1418894523580252E-01  0.1396501609817369E-01  0.1374293153483488E-01  0.1352268494201562E-01  0.1330426980216726E-01\n  0.1308767968648953E-01  0.1287290825753935E-01  0.1265994927192371E-01  0.1244879658307933E-01  0.1223944414413996E-01\n  0.1203188601089432E-01  0.1182611634483635E-01  0.1162212941630988E-01  0.1141991960775031E-01  0.1121948141702494E-01\n  0.1102080946087490E-01  0.1082389847846042E-01  0.1062874333501194E-01  0.1043533902558977E-01  0.1024368067895393E-01\n  0.1005376356154735E-01  0.9865583081593922E-02  0.9679134793314684E-02  0.9494414401263529E-02  0.9311417764785166E-02\n  0.9130140902597625E-02  0.8950579997500882E-02  0.8772731401214267E-02  0.8596591639343950E-02  0.8422157416482423E-02\n  0.8249425621441884E-02  0.8078393332622082E-02  0.7909057823514530E-02  0.7741416568343256E-02  0.7575467247842871E-02\n  0.7411207755174127E-02  0.7248636201976184E-02  0.7087750924555473E-02  0.6928550490209059E-02  0.6771033703680868E-02\n  0.6615199613748215E-02  0.6461047519934641E-02  0.6308576979345235E-02  0.6157787813618597E-02  0.6008680115989046E-02\n  0.5861254258451652E-02  0.5715510899020261E-02  0.5571450989068522E-02  0.5429075780740853E-02  0.5288386834419521E-02\n  0.5149386026230897E-02  0.5012075555572173E-02  0.4876457952637328E-02  0.4742536085917297E-02  0.4610313169647435E-02\n  0.4479792771170533E-02  0.4350978818180493E-02  0.4223875605807347E-02  0.4098487803498918E-02  0.3974820461650163E-02\n  0.3852879017924298E-02  0.3732669303204216E-02  0.3614197547105479E-02  0.3497470382973937E-02  0.3382494852283408E-02\n  0.3269278408338597E-02  0.3157828919178777E-02  0.3048154669566634E-02  0.2940264361933685E-02  0.2834167116141327E-02\n  0.2729872467901025E-02  0.2627390365681719E-02  0.2526731165915232E-02  0.2427905626291050E-02  0.2330924896912227E-02\n  0.2235800509061165E-02  0.2142544361300639E-02  0.2051168702609613E-02  0.1961686112225166E-02  0.1874109475832896E-02\n  0.1788451957715710E-02  0.1704726968437611E-02  0.1622948127603452E-02  0.1543129221197582E-02  0.1465284152965789E-02\n  0.1389426889263572E-02  0.1315571396752711E-02  0.1243731572285281E-02  0.1173921164272465E-02  0.1106153684794404E-02\n  0.1040442311668004E-02  0.9767997796547971E-03  0.9152382599604941E-03  0.8557692271559906E-03  0.7984033126378760E-03\n  0.7431501437484684E-03  0.6900181676963877E-03  0.6390144594619438E-03  0.5901445129451447E-03  0.5434120147240581E-03\n  0.4988185999463610E-03  0.4563635900883120E-03  0.4160437125934487E-03  0.3778528027632167E-03  0.3417814887280997E-03\n  0.3078168608981688E-03  0.2759421279962239E-03  0.2461362626341978E-03  0.2183736404266527E-03  0.1926236778641105E-03\n  0.1688504756124491E-03  0.1470124755772384E-03  0.1270621419785909E-03  0.1089456788163143E-03  0.9260279843818645E-04\n  0.7796655839983218E-04  0.6496328632466781E-04  0.5351261488371726E-04  0.4352765109263255E-04  0.3491530554961739E-04\n  0.2757680758595959E-04  0.2140843101578471E-04  0.1630245156608879E-04  0.1214835033531085E-04  0.8834266891203550E-05\n  0.6248690035680286E-05  0.4282353222462611E-05  0.2830275035848309E-05  0.1793853932613698E-05  0.1082893085919590E-05\n  0.6174003285747537E-06  0.3289872539180627E-06  0.1616905202076728E-06  0.7206870776681014E-07  0.2849911999804606E-07\n  0.9712198708650968E-08  0.2742442283547959E-08  0.6076172112450161E-09  0.9772731077597771E-10  0.1017048852958432E-10\n  0.5734341782146348E-12  0.1311491489053561E-13  0.7338688834175233E-16  0.3808514445153469E-19  0.2185032842849075E-24\n  0.4450194794086531E-34  0.4448435176905321E-58  0.1173305758391880E-217  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.1353993104251454E-10  0.8388292241576100E-09  0.9249073098372293E-08  0.5030460210239372E-07\n  0.1857568627085415E-06  0.5369197789403567E-06  0.1310591025996369E-05  0.2826805415934704E-05  0.5547382204843158E-05\n  0.1010438933657199E-04  0.1732779196828242E-04  0.2827168149581216E-04  0.4423859602721504E-04  0.6680154505955162E-04\n  0.9782344112589946E-04  0.1394737204414197E-03  0.1942420040555485E-03  0.2649487116051849E-03  0.3547525922860875E-03\n  0.4671551828778767E-03  0.6060022412741116E-03  0.7754822366296253E-03  0.9801220045380374E-03  0.1224779698140599E-02\n  0.1514635184246249E-02  0.1855178047873591E-02  0.2252193379531577E-02  0.2711745527424523E-02  0.3240160001952968E-02\n  0.3844003722708506E-02  0.4530063798923195E-02  0.5305325033301281E-02  0.6176946336577127E-02  0.7152236236230247E-02\n  0.8238627657747143E-02  0.9443652150831976E-02  0.1077491372619769E-01  0.1224006246116400E-01  0.1384676802438050E-01\n  0.1560269326170134E-01  0.1751546797666743E-01  0.1959266303029807E-01  0.2184176487603834E-01  0.2427015063682662E-01\n  0.2688506382240104E-01  0.2969359077621229E-01  0.3270263793270082E-01  0.3591890995727141E-01  0.3934888883309312E-01\n  0.4299881395089809E-01  0.4687466325027261E-01  0.5098213545355013E-01  0.5532663342634311E-01  0.5991324869200370E-01\n  0.6474674712088738E-01  0.6983155580921956E-01  0.7517175115663279E-01  0.8077104814605506E-01  0.8663279082458433E-01\n  0.9275994397927995E-01  0.9915508599743368E-01  0.1058204028968442E+00  0.1127576835079031E+00  0.1199683157858993E+00\n  0.1274532842288529E+00  0.1352131683733934E+00  0.1432481423386811E+00  0.1515579753861312E+00  0.1601420334607315E+00\n  0.1689992816780165E+00  0.1781282877192849E+00  0.1875272260963912E+00  0.1971938832464155E+00  0.2071256634156783E+00\n  0.2173195952919433E+00  0.2277723393431911E+00  0.2384801958210745E+00  0.2494391133870441E+00  0.2606446983191641E+00\n  0.2720922242578070E+00  0.2837766424487163E+00  0.2956925924423432E+00  0.3078344132088888E+00  0.3201961546291090E+00\n  0.3327715893216590E+00  0.3455542247685515E+00  0.3585373157011766E+00  0.3717138767102711E+00  0.3850766950442213E+00\n  0.3986183435611380E+00  0.4123311938012285E+00  0.4262074291471305E+00  0.4402390580410298E+00  0.4544179272285823E+00\n  0.4687357350008659E+00  0.4831840444068136E+00  0.4977542964098284E+00  0.5124378229635098E+00  0.5272258599826819E+00\n  0.5421095601871498E+00  0.5570800057968556E+00  0.5721282210583372E+00  0.5872451845836121E+00  0.6024218414838124E+00\n  0.6176491152810919E+00  0.6329179195834939E+00  0.6482191695086116E+00  0.6635437928430084E+00  0.6788827409254566E+00\n  0.6942269992431367E+00  0.7095675977309721E+00  0.7248956207653083E+00  0.7402022168441228E+00  0.7554786079469059E+00\n  0.7707160985682907E+00  0.7859060844203938E+00  0.8010400607996875E+00  0.8161096306150647E+00  0.8311065120745426E+00\n  0.8460225460288135E+00  0.8608497029705907E+00  0.8755800896893798E+00  0.8902059555819789E+00  0.9047196986196469E+00\n  0.9191138709734521E+00  0.9333811842999254E+00  0.9475145146896305E+00  0.9615069072817952E+00  0.9753515805486259E+00\n  0.9890419302533513E+00  0.1002571533086473E+01  0.1015934149985090E+01  0.1029123729140496E+01  0.1042134408699634E+01\n  0.1054960519166231E+01  0.1067596585507774E+01  0.1080037328974709E+01  0.1092277668638490E+01  0.1104312722655314E+01\n  0.1116137809262549E+01  0.1127748447515049E+01  0.1139140357768670E+01  0.1150309461918440E+01  0.1161251883398932E+01\n  0.1171963946954482E+01  0.1182442178186937E+01  0.1192683302888721E+01  0.1202684246168965E+01  0.1212442131380551E+01\n  0.1221954278855855E+01  0.1231218204459002E+01  0.1240231617962418E+01  0.1248992421255417E+01  0.1257498706392534E+01\n  0.1265748753489242E+01  0.1273741028472617E+01  0.1281474180694483E+01  0.1288947040414400E+01  0.1296158616159860E+01\n  0.1303108091970871E+01  0.1309794824536052E+01  0.1316218340227214E+01  0.1322378332039313E+01  0.1328274656442483E+01\n  0.1333907330152773E+01  0.1339276526828055E+01  0.1344382573695405E+01  0.1349225948116168E+01  0.1353807274094698E+01\n  0.1358127318736686E+01  0.1362186988662762E+01  0.1365987326382977E+01  0.1369529506637536E+01  0.1372814832709058E+01\n  0.1375844732711431E+01  0.1378620755860210E+01  0.1381144568729309E+01  0.1383417951498597E+01  0.1385442794196838E+01\n  0.1387221092944273E+01  0.1388754946198940E+01  0.1390046551010727E+01  0.1391098199286932E+01  0.1391912274073011E+01\n  0.1392491245851972E+01  0.1392837668865793E+01  0.1392954177462024E+01  0.1392843482468616E+01  0.1392508367599889E+01\n  0.1391951685896345E+01  0.1391176356200982E+01  0.1390185359674514E+01  0.1388981736351864E+01  0.1387568581742103E+01\n  0.1385949043473885E+01  0.1384126317988323E+01  0.1382103647281089E+01  0.1379884315695416E+01  0.1377471646767576E+01\n  0.1374869000126249E+01  0.1372079768447110E+01  0.1369107374463862E+01  0.1365955268036790E+01  0.1362626923279866E+01\n  0.1359125835747256E+01  0.1355455519680076E+01  0.1351619505314043E+01  0.1347621336248676E+01  0.1343464566878517E+01\n  0.1339152759886839E+01  0.1334689483802160E+01  0.1330078310617843E+01  0.1325322813474955E+01  0.1320426564408511E+01\n  0.1315393132157122E+01  0.1310226080036051E+01  0.1304928963873535E+01  0.1299505330010257E+01  0.1293958713361729E+01\n  0.1288292635543297E+01  0.1282510603057466E+01  0.1276616105543136E+01  0.1270612614086314E+01  0.1264503579591840E+01\n  0.1258292431215576E+01  0.1251982574856509E+01  0.1245577391708143E+01  0.1239080236868539E+01  0.1232494438008325E+01\n  0.1225823294095955E+01  0.1219070074179471E+01  0.1212238016223985E+01  0.1205330326004104E+01  0.1198350176050432E+01\n  0.1191300704649328E+01  0.1184185014895046E+01  0.1177006173793340E+01  0.1169767211415667E+01  0.1162471120103017E+01\n  0.1155120853718478E+01  0.1147719326947540E+01  0.1140269414645216E+01  0.1132773951228974E+01  0.1125235730116526E+01\n  0.1117657503207466E+01  0.1110041980407784E+01  0.1102391829196240E+01  0.1094709674231619E+01  0.1086998096999836E+01\n  0.1079259635499933E+01  0.1071496783967914E+01  0.1063711992637463E+01  0.1055907667536516E+01  0.1048086170318704E+01\n  0.1040249818128692E+01  0.1032400883500383E+01  0.1024541594287072E+01  0.1016674133622509E+01  0.1008800639911969E+01\n  0.1000923206852306E+01  0.9930438834801176E+00  0.9851646742469989E+00  0.9772875391210279E+00  0.9694143937135093E+00\n  0.9615471094301068E+00  0.9536875136454389E+00  0.9458373899002650E+00  0.9379984781203971E+00  0.9301724748564474E+00\n  0.9223610335436100E+00  0.9145657647805825E+00  0.9067882366268739E+00  0.8990299749176214E+00  0.8912924635951891E+00\n  0.8835771450567167E+00  0.8758854205168844E+00  0.8682186503851309E+00  0.8605781546565948E+00  0.8529652133160540E+00\n  0.8453810667541574E+00  0.8378269161952663E+00  0.8303039241362116E+00  0.8228132147953376E+00  0.8153558745711390E+00\n  0.8079329525099168E+00  0.8005454607817869E+00  0.7931943751644794E+00  0.7858806355343143E+00  0.7786051463638074E+00\n  0.7713687772253328E+00  0.7641723633003079E+00  0.7570167058933844E+00  0.7499025729511121E+00  0.7428306995846062E+00\n  0.7358017885957079E+00  0.7288165110062022E+00  0.7218755065895981E+00  0.7149793844050807E+00  0.7081287233331618E+00\n  0.7013240726126531E+00  0.6945659523785421E+00  0.6878548542003931E+00  0.6811912416209033E+00  0.6745755506942478E+00\n  0.6680081905238785E+00  0.6614895437994238E+00  0.6550199673323996E+00  0.6485997925903795E+00  0.6422293262293763E+00\n  0.6359088506240991E+00  0.6296386243958603E+00  0.6234188829378302E+00  0.6172498389374158E+00  0.6111316828955082E+00\n  0.6050645836423746E+00  0.5990486888499783E+00  0.5930841255405085E+00  0.5871710005909401E+00  0.5813094012334057E+00\n  0.5754993955512363E+00  0.5697410329704640E+00  0.5640343447466610E+00  0.5583793444469337E+00  0.5527760284269526E+00\n  0.5472243763028636E+00  0.5417243514179740E+00  0.5362759013040796E+00  0.5308789581373305E+00  0.5255334391885358E+00\n  0.5202392472678002E+00  0.5149962711634282E+00  0.5098043860749818E+00  0.5046634540404551E+00  0.4995733243574682E+00\n  0.4945338339984403E+00  0.4895448080196743E+00  0.4846060599643165E+00  0.4797173922591353E+00  0.4748785966051021E+00\n  0.4700894543617143E+00  0.4653497369250721E+00  0.4606592060996474E+00  0.4560176144637674E+00  0.4514247057287724E+00\n  0.4468802150918596E+00  0.4423838695826035E+00  0.4379353884031551E+00  0.4335344832621323E+00  0.4291808587022021E+00\n  0.4248742124213836E+00  0.4206142355880688E+00  0.4164006131498095E+00  0.4122330241358657E+00  0.4081111419535712E+00\n  0.4040346346785266E+00  0.4000031653386660E+00  0.3960163921922264E+00  0.3920739689996687E+00  0.3881755452895829E+00\n  0.3843207666186236E+00  0.3805092748255328E+00  0.3767407082792822E+00  0.3730147021214013E+00  0.3693308885025316E+00\n  0.3656888968132757E+00  0.3620883539093817E+00  0.3585288843313358E+00  0.3550101105184098E+00  0.3515316530172374E+00\n  0.3480931306849715E+00  0.3446941608870878E+00  0.3413343596899074E+00  0.3380133420478924E+00  0.3347307219857906E+00\n  0.3314861127756896E+00  0.3282791271090590E+00  0.3251093772638369E+00  0.3219764752666408E+00  0.3188800330501668E+00\n  0.3158196626058555E+00  0.3127949761318864E+00  0.3098055861765790E+00  0.3068511057772733E+00  0.3039311485947566E+00\n  0.3010453290433147E+00  0.2981932624164749E+00  0.2953745650085209E+00  0.2925888542318437E+00  0.2898357487302072E+00\n  0.2871148684879984E+00  0.2844258349355381E+00  0.2817682710505188E+00  0.2791418014556485E+00  0.2765460525125659E+00\n  0.2739806524121053E+00  0.2714452312609780E+00  0.2689394211649400E+00  0.2664628563085241E+00  0.2640151730313972E+00\n  0.2615960099014194E+00  0.2592050077844695E+00  0.2568418099111116E+00  0.2545060619401636E+00  0.2521974120192415E+00\n  0.2499155108423418E+00  0.2476600117045342E+00  0.2454305705538249E+00  0.2432268460402566E+00  0.2410484995623153E+00\n  0.2388951953107000E+00  0.2367666003095238E+00  0.2346623844550057E+00  0.2325822205517195E+00  0.2305257843464541E+00\n  0.2284927545597522E+00  0.2264828129151803E+00  0.2244956441663966E+00  0.2225309361220672E+00  0.2205883796686914E+00\n  0.2186676687913947E+00  0.2167685005927387E+00  0.2148905753096101E+00  0.2130335963282359E+00  0.2111972701973850E+00\n  0.2093813066398013E+00  0.2075854185619259E+00  0.2058093220619543E+00  0.2040527364362842E+00  0.2023153841843948E+00\n  0.2005969910122156E+00  0.1988972858340233E+00  0.1972160007729189E+00  0.1955528711599284E+00  0.1939076355317738E+00\n  0.1922800356273561E+00  0.1906698163829959E+00  0.1890767259264730E+00  0.1875005155699057E+00  0.1859409398015150E+00\n  0.1843977562763068E+00  0.1828707258057186E+00  0.1813596123462640E+00  0.1798641829872162E+00  0.1783842079373634E+00\n  0.1769194605108787E+00  0.1754697171123329E+00  0.1740347572208903E+00  0.1726143633737163E+00  0.1712083211486371E+00\n  0.1698164191460766E+00  0.1684384489703060E+00  0.1670742052100373E+00  0.1657234854183902E+00  0.1643860900922608E+00\n  0.1630618226511230E+00  0.1617504894152905E+00  0.1604518995836656E+00  0.1591658652110027E+00  0.1578922011847117E+00\n  0.1566307252012296E+00  0.1553812577419816E+00  0.1541436220489565E+00  0.1529176440999246E+00  0.1517031525833137E+00\n  0.1504999788727721E+00  0.1493079570014363E+00  0.1481269236359270E+00  0.1469567180500930E+00  0.1457971820985229E+00\n  0.1446481601898438E+00  0.1435094992598286E+00  0.1423810487443264E+00  0.1412626605520352E+00  0.1401541890371375E+00\n  0.1390554909718100E+00  0.1379664255186285E+00  0.1368868542028802E+00  0.1358166408848024E+00  0.1347556517317591E+00\n  0.1337037551903719E+00  0.1326608219586172E+00  0.1316267249579071E+00  0.1306013393051614E+00  0.1295845422848884E+00\n  0.1285762133212826E+00  0.1275762339503552E+00  0.1265844877921041E+00  0.1256008605227379E+00  0.1246252398469633E+00\n  0.1236575154703454E+00  0.1226975790717512E+00  0.1217453242758857E+00  0.1208006466259300E+00  0.1198634435562893E+00\n  0.1189336143654594E+00  0.1180110601890202E+00  0.1170956839727626E+00  0.1161873904459593E+00  0.1152860860947805E+00\n  0.1143916791358692E+00  0.1135040794900743E+00  0.1126231987563555E+00  0.1117489501858582E+00  0.1108812486561707E+00\n  0.1100200106457653E+00  0.1091651542086276E+00  0.1083165989490820E+00  0.1074742659968154E+00  0.1066380779821052E+00\n  0.1058079590112519E+00  0.1049838346422265E+00  0.1041656318605295E+00  0.1033532790552702E+00  0.1025467059954647E+00\n  0.1017458438065610E+00  0.1009506249471885E+00  0.1001609831861390E+00  0.9937685357957692E-01  0.9859817244848566E-01\n  0.9782487735634983E-01  0.9705690708707349E-01  0.9629420162313919E-01  0.9553670212400750E-01  0.9478435090475915E-01\n  0.9403709141497944E-01  0.9329486821788784E-01  0.9255762696971309E-01  0.9182531439931366E-01  0.9109787828804443E-01\n  0.9037526744987140E-01  0.8965743171173354E-01  0.8894432189415159E-01  0.8823588979208480E-01  0.8753208815603555E-01\n  0.8683287067340226E-01  0.8613819195007733E-01  0.8544800749229453E-01  0.8476227368872161E-01  0.8408094779279952E-01\n  0.8340398790532604E-01  0.8273135295728512E-01  0.8206300269292026E-01  0.8139889765304979E-01  0.8073899915862499E-01\n  0.8008326929452908E-01  0.7943167089361686E-01  0.7878416752099129E-01  0.7814072345852002E-01  0.7750130368958605E-01\n  0.7686587388407512E-01  0.7623440038359473E-01  0.7560685018692687E-01  0.7498319093571042E-01  0.7436339090035288E-01\n  0.7374741896616860E-01  0.7313524461974377E-01  0.7252683793552536E-01  0.7192216956263091E-01  0.7132121071188088E-01\n  0.7072393314304767E-01  0.7013030915232332E-01  0.6954031156000041E-01  0.6895391369836718E-01  0.6837108939981353E-01\n  0.6779181298514624E-01  0.6721605925211059E-01  0.6664380346411826E-01  0.6607502133917825E-01  0.6550968903902774E-01\n  0.6494778315846379E-01  0.6438928071487048E-01  0.6383415913794230E-01  0.6328239625959906E-01  0.6273397030409252E-01\n  0.6218885987830131E-01  0.6164704396221248E-01  0.6110850189958664E-01  0.6057321338880634E-01  0.6004115847390429E-01\n  0.5951231753576908E-01  0.5898667128352685E-01  0.5846420074609691E-01  0.5794488726391903E-01  0.5742871248084910E-01\n  0.5691565833622340E-01  0.5640570705708669E-01  0.5589884115058460E-01  0.5539504339651542E-01  0.5489429684004177E-01\n  0.5439658478455860E-01  0.5390189078471544E-01  0.5341019863959112E-01  0.5292149238601910E-01  0.5243575629206128E-01\n  0.5195297485062703E-01  0.5147313277323774E-01  0.5099621498393213E-01  0.5052220661331305E-01  0.5005109299273101E-01\n  0.4958285964860470E-01  0.4911749229687554E-01  0.4865497683759399E-01  0.4819529934963621E-01  0.4773844608554897E-01\n  0.4728440346652141E-01  0.4683315807748007E-01  0.4638469666230777E-01  0.4593900611918208E-01  0.4549607349603369E-01\n  0.4505588598612064E-01  0.4461843092371864E-01  0.4418369577992455E-01  0.4375166815857148E-01  0.4332233579225347E-01\n  0.4289568653845881E-01  0.4247170837580991E-01  0.4205038940040735E-01  0.4163171782227736E-01  0.4121568196192090E-01\n  0.4080227024696274E-01  0.4039147120889799E-01  0.3998327347993617E-01  0.3957766578994016E-01  0.3917463696345855E-01\n  0.3877417591685010E-01  0.3837627165549899E-01  0.3798091327111933E-01  0.3758808993914695E-01  0.3719779091621782E-01\n  0.3681000553773126E-01  0.3642472321549702E-01  0.3604193343546399E-01  0.3566162575553031E-01  0.3528378980343305E-01\n  0.3490841527471608E-01  0.3453549193077510E-01  0.3416500959697864E-01  0.3379695816086406E-01  0.3343132757040658E-01\n  0.3306810783236118E-01  0.3270728901067565E-01  0.3234886122497425E-01  0.3199281464910996E-01  0.3163913950978563E-01\n  0.3128782608524168E-01  0.3093886470401072E-01  0.3059224574373675E-01  0.3024795963005924E-01  0.2990599683556058E-01\n  0.2956634787877624E-01  0.2922900332326631E-01  0.2889395377674870E-01  0.2856118989029233E-01  0.2823070235756949E-01\n  0.2790248191416771E-01  0.2757651933695894E-01  0.2725280544352705E-01  0.2693133109165141E-01  0.2661208717884729E-01\n  0.2629506464196176E-01  0.2598025445682497E-01  0.2566764763795566E-01  0.2535723523832159E-01  0.2504900834915327E-01\n  0.2474295809981158E-01  0.2443907565770799E-01  0.2413735222827780E-01  0.2383777905500606E-01  0.2354034741950517E-01\n  0.2324504864164501E-01  0.2295187407973472E-01  0.2266081513075604E-01  0.2237186323064830E-01  0.2208500985464502E-01\n  0.2180024651766184E-01  0.2151756477473634E-01  0.2123695622151859E-01  0.2095841249481422E-01  0.2068192527317876E-01\n  0.2040748627756411E-01  0.2013508727201714E-01  0.1986472006443057E-01  0.1959637650734679E-01  0.1933004849881481E-01\n  0.1906572798330038E-01  0.1880340695265023E-01  0.1854307744711091E-01  0.1828473155640220E-01  0.1802836142084625E-01\n  0.1777395923255295E-01  0.1752151723666215E-01  0.1727102773264334E-01  0.1702248307565384E-01  0.1677587567795624E-01\n  0.1653119801039607E-01  0.1628844260394024E-01  0.1604760205127793E-01  0.1580866900848456E-01  0.1557163619674996E-01\n  0.1533649640417201E-01  0.1510324248761716E-01  0.1487186737464884E-01  0.1464236406552526E-01  0.1441472563526792E-01\n  0.1418894523580252E-01  0.1396501609817369E-01  0.1374293153483488E-01  0.1352268494201562E-01  0.1330426980216726E-01\n  0.1308767968648953E-01  0.1287290825753935E-01  0.1265994927192371E-01  0.1244879658307933E-01  0.1223944414413996E-01\n  0.1203188601089432E-01  0.1182611634483635E-01  0.1162212941630988E-01  0.1141991960775031E-01  0.1121948141702494E-01\n  0.1102080946087490E-01  0.1082389847846042E-01  0.1062874333501194E-01  0.1043533902558977E-01  0.1024368067895393E-01\n  0.1005376356154735E-01  0.9865583081593922E-02  0.9679134793314684E-02  0.9494414401263529E-02  0.9311417764785166E-02\n  0.9130140902597625E-02  0.8950579997500882E-02  0.8772731401214267E-02  0.8596591639343950E-02  0.8422157416482423E-02\n  0.8249425621441884E-02  0.8078393332622082E-02  0.7909057823514530E-02  0.7741416568343256E-02  0.7575467247842871E-02\n  0.7411207755174127E-02  0.7248636201976184E-02  0.7087750924555473E-02  0.6928550490209059E-02  0.6771033703680868E-02\n  0.6615199613748215E-02  0.6461047519934641E-02  0.6308576979345235E-02  0.6157787813618597E-02  0.6008680115989046E-02\n  0.5861254258451652E-02  0.5715510899020261E-02  0.5571450989068522E-02  0.5429075780740853E-02  0.5288386834419521E-02\n  0.5149386026230897E-02  0.5012075555572173E-02  0.4876457952637328E-02  0.4742536085917297E-02  0.4610313169647435E-02\n  0.4479792771170533E-02  0.4350978818180493E-02  0.4223875605807347E-02  0.4098487803498918E-02  0.3974820461650163E-02\n  0.3852879017924298E-02  0.3732669303204216E-02  0.3614197547105479E-02  0.3497470382973937E-02  0.3382494852283408E-02\n  0.3269278408338597E-02  0.3157828919178777E-02  0.3048154669566634E-02  0.2940264361933685E-02  0.2834167116141327E-02\n  0.2729872467901025E-02  0.2627390365681719E-02  0.2526731165915232E-02  0.2427905626291050E-02  0.2330924896912227E-02\n  0.2235800509061165E-02  0.2142544361300639E-02  0.2051168702609613E-02  0.1961686112225166E-02  0.1874109475832896E-02\n  0.1788451957715710E-02  0.1704726968437611E-02  0.1622948127603452E-02  0.1543129221197582E-02  0.1465284152965789E-02\n  0.1389426889263572E-02  0.1315571396752711E-02  0.1243731572285281E-02  0.1173921164272465E-02  0.1106153684794404E-02\n  0.1040442311668004E-02  0.9767997796547971E-03  0.9152382599604941E-03  0.8557692271559906E-03  0.7984033126378760E-03\n  0.7431501437484684E-03  0.6900181676963877E-03  0.6390144594619438E-03  0.5901445129451447E-03  0.5434120147240581E-03\n  0.4988185999463610E-03  0.4563635900883120E-03  0.4160437125934487E-03  0.3778528027632167E-03  0.3417814887280997E-03\n  0.3078168608981688E-03  0.2759421279962239E-03  0.2461362626341978E-03  0.2183736404266527E-03  0.1926236778641105E-03\n  0.1688504756124491E-03  0.1470124755772384E-03  0.1270621419785909E-03  0.1089456788163143E-03  0.9260279843818645E-04\n  0.7796655839983218E-04  0.6496328632466781E-04  0.5351261488371726E-04  0.4352765109263255E-04  0.3491530554961739E-04\n  0.2757680758595959E-04  0.2140843101578471E-04  0.1630245156608879E-04  0.1214835033531085E-04  0.8834266891203550E-05\n  0.6248690035680286E-05  0.4282353222462611E-05  0.2830275035848309E-05  0.1793853932613698E-05  0.1082893085919590E-05\n  0.6174003285747537E-06  0.3289872539180627E-06  0.1616905202076728E-06  0.7206870776681014E-07  0.2849911999804606E-07\n  0.9712198708650968E-08  0.2742442283547959E-08  0.6076172112450161E-09  0.9772731077597771E-10  0.1017048852958432E-10\n  0.5734341782146348E-12  0.1311491489053561E-13  0.7338688834175233E-16  0.3808514445153469E-19  0.2185032842849075E-24\n  0.4450194794086531E-34  0.4448435176905321E-58  0.1173305758391880E-217  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.1353993104251454E-10  0.8388292241576100E-09  0.9249073098372293E-08  0.5030460210239372E-07\n  0.1857568627085415E-06  0.5369197789403567E-06  0.1310591025996369E-05  0.2826805415934704E-05  0.5547382204843158E-05\n  0.1010438933657199E-04  0.1732779196828242E-04  0.2827168149581216E-04  0.4423859602721504E-04  0.6680154505955162E-04\n  0.9782344112589946E-04  0.1394737204414197E-03  0.1942420040555485E-03  0.2649487116051849E-03  0.3547525922860875E-03\n  0.4671551828778767E-03  0.6060022412741116E-03  0.7754822366296253E-03  0.9801220045380374E-03  0.1224779698140599E-02\n  0.1514635184246249E-02  0.1855178047873591E-02  0.2252193379531577E-02  0.2711745527424523E-02  0.3240160001952968E-02\n  0.3844003722708506E-02  0.4530063798923195E-02  0.5305325033301281E-02  0.6176946336577127E-02  0.7152236236230247E-02\n  0.8238627657747143E-02  0.9443652150831976E-02  0.1077491372619769E-01  0.1224006246116400E-01  0.1384676802438050E-01\n  0.1560269326170134E-01  0.1751546797666743E-01  0.1959266303029807E-01  0.2184176487603834E-01  0.2427015063682662E-01\n  0.2688506382240104E-01  0.2969359077621229E-01  0.3270263793270082E-01  0.3591890995727141E-01  0.3934888883309312E-01\n  0.4299881395089809E-01  0.4687466325027261E-01  0.5098213545355013E-01  0.5532663342634311E-01  0.5991324869200370E-01\n  0.6474674712088738E-01  0.6983155580921956E-01  0.7517175115663279E-01  0.8077104814605506E-01  0.8663279082458433E-01\n  0.9275994397927995E-01  0.9915508599743368E-01  0.1058204028968442E+00  0.1127576835079031E+00  0.1199683157858993E+00\n  0.1274532842288529E+00  0.1352131683733934E+00  0.1432481423386811E+00  0.1515579753861312E+00  0.1601420334607315E+00\n  0.1689992816780165E+00  0.1781282877192849E+00  0.1875272260963912E+00  0.1971938832464155E+00  0.2071256634156783E+00\n  0.2173195952919433E+00  0.2277723393431911E+00  0.2384801958210745E+00  0.2494391133870441E+00  0.2606446983191641E+00\n  0.2720922242578070E+00  0.2837766424487163E+00  0.2956925924423432E+00  0.3078344132088888E+00  0.3201961546291090E+00\n  0.3327715893216590E+00  0.3455542247685515E+00  0.3585373157011766E+00  0.3717138767102711E+00  0.3850766950442213E+00\n  0.3986183435611380E+00  0.4123311938012285E+00  0.4262074291471305E+00  0.4402390580410298E+00  0.4544179272285823E+00\n  0.4687357350008659E+00  0.4831840444068136E+00  0.4977542964098284E+00  0.5124378229635098E+00  0.5272258599826819E+00\n  0.5421095601871498E+00  0.5570800057968556E+00  0.5721282210583372E+00  0.5872451845836121E+00  0.6024218414838124E+00\n  0.6176491152810919E+00  0.6329179195834939E+00  0.6482191695086116E+00  0.6635437928430084E+00  0.6788827409254566E+00\n  0.6942269992431367E+00  0.7095675977309721E+00  0.7248956207653083E+00  0.7402022168441228E+00  0.7554786079469059E+00\n  0.7707160985682907E+00  0.7859060844203938E+00  0.8010400607996875E+00  0.8161096306150647E+00  0.8311065120745426E+00\n  0.8460225460288135E+00  0.8608497029705907E+00  0.8755800896893798E+00  0.8902059555819789E+00  0.9047196986196469E+00\n  0.9191138709734521E+00  0.9333811842999254E+00  0.9475145146896305E+00  0.9615069072817952E+00  0.9753515805486259E+00\n  0.9890419302533513E+00  0.1002571533086473E+01  0.1015934149985090E+01  0.1029123729140496E+01  0.1042134408699634E+01\n  0.1054960519166231E+01  0.1067596585507774E+01  0.1080037328974709E+01  0.1092277668638490E+01  0.1104312722655314E+01\n  0.1116137809262549E+01  0.1127748447515049E+01  0.1139140357768670E+01  0.1150309461918440E+01  0.1161251883398932E+01\n  0.1171963946954482E+01  0.1182442178186937E+01  0.1192683302888721E+01  0.1202684246168965E+01  0.1212442131380551E+01\n  0.1221954278855855E+01  0.1231218204459002E+01  0.1240231617962418E+01  0.1248992421255417E+01  0.1257498706392534E+01\n  0.1265748753489242E+01  0.1273741028472617E+01  0.1281474180694483E+01  0.1288947040414400E+01  0.1296158616159860E+01\n  0.1303108091970871E+01  0.1309794824536052E+01  0.1316218340227214E+01  0.1322378332039313E+01  0.1328274656442483E+01\n  0.1333907330152773E+01  0.1339276526828055E+01  0.1344382573695405E+01  0.1349225948116168E+01  0.1353807274094698E+01\n  0.1358127318736686E+01  0.1362186988662762E+01  0.1365987326382977E+01  0.1369529506637536E+01  0.1372814832709058E+01\n  0.1375844732711431E+01  0.1378620755860210E+01  0.1381144568729309E+01  0.1383417951498597E+01  0.1385442794196838E+01\n  0.1387221092944273E+01  0.1388754946198940E+01  0.1390046551010727E+01  0.1391098199286932E+01  0.1391912274073011E+01\n  0.1392491245851972E+01  0.1392837668865793E+01  0.1392954177462024E+01  0.1392843482468616E+01  0.1392508367599889E+01\n  0.1391951685896345E+01  0.1391176356200982E+01  0.1390185359674514E+01  0.1388981736351864E+01  0.1387568581742103E+01\n  0.1385949043473885E+01  0.1384126317988323E+01  0.1382103647281089E+01  0.1379884315695416E+01  0.1377471646767576E+01\n  0.1374869000126249E+01  0.1372079768447110E+01  0.1369107374463862E+01  0.1365955268036790E+01  0.1362626923279866E+01\n  0.1359125835747256E+01  0.1355455519680076E+01  0.1351619505314043E+01  0.1347621336248676E+01  0.1343464566878517E+01\n  0.1339152759886839E+01  0.1334689483802160E+01  0.1330078310617843E+01  0.1325322813474955E+01  0.1320426564408511E+01\n  0.1315393132157122E+01  0.1310226080036051E+01  0.1304928963873535E+01  0.1299505330010257E+01  0.1293958713361729E+01\n  0.1288292635543297E+01  0.1282510603057466E+01  0.1276616105543136E+01  0.1270612614086314E+01  0.1264503579591840E+01\n  0.1258292431215576E+01  0.1251982574856509E+01  0.1245577391708143E+01  0.1239080236868539E+01  0.1232494438008325E+01\n  0.1225823294095955E+01  0.1219070074179471E+01  0.1212238016223985E+01  0.1205330326004104E+01  0.1198350176050432E+01\n  0.1191300704649328E+01  0.1184185014895046E+01  0.1177006173793340E+01  0.1169767211415667E+01  0.1162471120103017E+01\n  0.1155120853718478E+01  0.1147719326947540E+01  0.1140269414645216E+01  0.1132773951228974E+01  0.1125235730116526E+01\n  0.1117657503207466E+01  0.1110041980407784E+01  0.1102391829196240E+01  0.1094709674231619E+01  0.1086998096999836E+01\n  0.1079259635499933E+01  0.1071496783967914E+01  0.1063711992637463E+01  0.1055907667536516E+01  0.1048086170318704E+01\n  0.1040249818128692E+01  0.1032400883500383E+01  0.1024541594287072E+01  0.1016674133622509E+01  0.1008800639911969E+01\n  0.1000923206852306E+01  0.9930438834801176E+00  0.9851646742469989E+00  0.9772875391210279E+00  0.9694143937135093E+00\n  0.9615471094301068E+00  0.9536875136454389E+00  0.9458373899002650E+00  0.9379984781203971E+00  0.9301724748564474E+00\n  0.9223610335436100E+00  0.9145657647805825E+00  0.9067882366268739E+00  0.8990299749176214E+00  0.8912924635951891E+00\n  0.8835771450567167E+00  0.8758854205168844E+00  0.8682186503851309E+00  0.8605781546565948E+00  0.8529652133160540E+00\n  0.8453810667541574E+00  0.8378269161952663E+00  0.8303039241362116E+00  0.8228132147953376E+00  0.8153558745711390E+00\n  0.8079329525099168E+00  0.8005454607817869E+00  0.7931943751644794E+00  0.7858806355343143E+00  0.7786051463638074E+00\n  0.7713687772253328E+00  0.7641723633003079E+00  0.7570167058933844E+00  0.7499025729511121E+00  0.7428306995846062E+00\n  0.7358017885957079E+00  0.7288165110062022E+00  0.7218755065895981E+00  0.7149793844050807E+00  0.7081287233331618E+00\n  0.7013240726126531E+00  0.6945659523785421E+00  0.6878548542003931E+00  0.6811912416209033E+00  0.6745755506942478E+00\n  0.6680081905238785E+00  0.6614895437994238E+00  0.6550199673323996E+00  0.6485997925903795E+00  0.6422293262293763E+00\n  0.6359088506240991E+00  0.6296386243958603E+00  0.6234188829378302E+00  0.6172498389374158E+00  0.6111316828955082E+00\n  0.6050645836423746E+00  0.5990486888499783E+00  0.5930841255405085E+00  0.5871710005909401E+00  0.5813094012334057E+00\n  0.5754993955512363E+00  0.5697410329704640E+00  0.5640343447466610E+00  0.5583793444469337E+00  0.5527760284269526E+00\n  0.5472243763028636E+00  0.5417243514179740E+00  0.5362759013040796E+00  0.5308789581373305E+00  0.5255334391885358E+00\n  0.5202392472678002E+00  0.5149962711634282E+00  0.5098043860749818E+00  0.5046634540404551E+00  0.4995733243574682E+00\n  0.4945338339984403E+00  0.4895448080196743E+00  0.4846060599643165E+00  0.4797173922591353E+00  0.4748785966051021E+00\n  0.4700894543617143E+00  0.4653497369250721E+00  0.4606592060996474E+00  0.4560176144637674E+00  0.4514247057287724E+00\n  0.4468802150918596E+00  0.4423838695826035E+00  0.4379353884031551E+00  0.4335344832621323E+00  0.4291808587022021E+00\n  0.4248742124213836E+00  0.4206142355880688E+00  0.4164006131498095E+00  0.4122330241358657E+00  0.4081111419535712E+00\n  0.4040346346785266E+00  0.4000031653386660E+00  0.3960163921922264E+00  0.3920739689996687E+00  0.3881755452895829E+00\n  0.3843207666186236E+00  0.3805092748255328E+00  0.3767407082792822E+00  0.3730147021214013E+00  0.3693308885025316E+00\n  0.3656888968132757E+00  0.3620883539093817E+00  0.3585288843313358E+00  0.3550101105184098E+00  0.3515316530172374E+00\n  0.3480931306849715E+00  0.3446941608870878E+00  0.3413343596899074E+00  0.3380133420478924E+00  0.3347307219857906E+00\n  0.3314861127756896E+00  0.3282791271090590E+00  0.3251093772638369E+00  0.3219764752666408E+00  0.3188800330501668E+00\n  0.3158196626058555E+00  0.3127949761318864E+00  0.3098055861765790E+00  0.3068511057772733E+00  0.3039311485947566E+00\n  0.3010453290433147E+00  0.2981932624164749E+00  0.2953745650085209E+00  0.2925888542318437E+00  0.2898357487302072E+00\n  0.2871148684879984E+00  0.2844258349355381E+00  0.2817682710505188E+00  0.2791418014556485E+00  0.2765460525125659E+00\n  0.2739806524121053E+00  0.2714452312609780E+00  0.2689394211649400E+00  0.2664628563085241E+00  0.2640151730313972E+00\n  0.2615960099014194E+00  0.2592050077844695E+00  0.2568418099111116E+00  0.2545060619401636E+00  0.2521974120192415E+00\n  0.2499155108423418E+00  0.2476600117045342E+00  0.2454305705538249E+00  0.2432268460402566E+00  0.2410484995623153E+00\n  0.2388951953107000E+00  0.2367666003095238E+00  0.2346623844550057E+00  0.2325822205517195E+00  0.2305257843464541E+00\n  0.2284927545597522E+00  0.2264828129151803E+00  0.2244956441663966E+00  0.2225309361220672E+00  0.2205883796686914E+00\n  0.2186676687913947E+00  0.2167685005927387E+00  0.2148905753096101E+00  0.2130335963282359E+00  0.2111972701973850E+00\n  0.2093813066398013E+00  0.2075854185619259E+00  0.2058093220619543E+00  0.2040527364362842E+00  0.2023153841843948E+00\n  0.2005969910122156E+00  0.1988972858340233E+00  0.1972160007729189E+00  0.1955528711599284E+00  0.1939076355317738E+00\n  0.1922800356273561E+00  0.1906698163829959E+00  0.1890767259264730E+00  0.1875005155699057E+00  0.1859409398015150E+00\n  0.1843977562763068E+00  0.1828707258057186E+00  0.1813596123462640E+00  0.1798641829872162E+00  0.1783842079373634E+00\n  0.1769194605108787E+00  0.1754697171123329E+00  0.1740347572208903E+00  0.1726143633737163E+00  0.1712083211486371E+00\n  0.1698164191460766E+00  0.1684384489703060E+00  0.1670742052100373E+00  0.1657234854183902E+00  0.1643860900922608E+00\n  0.1630618226511230E+00  0.1617504894152905E+00  0.1604518995836656E+00  0.1591658652110027E+00  0.1578922011847117E+00\n  0.1566307252012296E+00  0.1553812577419816E+00  0.1541436220489565E+00  0.1529176440999246E+00  0.1517031525833137E+00\n  0.1504999788727721E+00  0.1493079570014363E+00  0.1481269236359270E+00  0.1469567180500930E+00  0.1457971820985229E+00\n  0.1446481601898438E+00  0.1435094992598286E+00  0.1423810487443264E+00  0.1412626605520352E+00  0.1401541890371375E+00\n  0.1390554909718100E+00  0.1379664255186285E+00  0.1368868542028802E+00  0.1358166408848024E+00  0.1347556517317591E+00\n  0.1337037551903719E+00  0.1326608219586172E+00  0.1316267249579071E+00  0.1306013393051614E+00  0.1295845422848884E+00\n  0.1285762133212826E+00  0.1275762339503552E+00  0.1265844877921041E+00  0.1256008605227379E+00  0.1246252398469633E+00\n  0.1236575154703454E+00  0.1226975790717512E+00  0.1217453242758857E+00  0.1208006466259300E+00  0.1198634435562893E+00\n  0.1189336143654594E+00  0.1180110601890202E+00  0.1170956839727626E+00  0.1161873904459593E+00  0.1152860860947805E+00\n  0.1143916791358692E+00  0.1135040794900743E+00  0.1126231987563555E+00  0.1117489501858582E+00  0.1108812486561707E+00\n  0.1100200106457653E+00  0.1091651542086276E+00  0.1083165989490820E+00  0.1074742659968154E+00  0.1066380779821052E+00\n  0.1058079590112519E+00  0.1049838346422265E+00  0.1041656318605295E+00  0.1033532790552702E+00  0.1025467059954647E+00\n  0.1017458438065610E+00  0.1009506249471885E+00  0.1001609831861390E+00  0.9937685357957692E-01  0.9859817244848566E-01\n  0.9782487735634983E-01  0.9705690708707349E-01  0.9629420162313919E-01  0.9553670212400750E-01  0.9478435090475915E-01\n  0.9403709141497944E-01  0.9329486821788784E-01  0.9255762696971309E-01  0.9182531439931366E-01  0.9109787828804443E-01\n  0.9037526744987140E-01  0.8965743171173354E-01  0.8894432189415159E-01  0.8823588979208480E-01  0.8753208815603555E-01\n  0.8683287067340226E-01  0.8613819195007733E-01  0.8544800749229453E-01  0.8476227368872161E-01  0.8408094779279952E-01\n  0.8340398790532604E-01  0.8273135295728512E-01  0.8206300269292026E-01  0.8139889765304979E-01  0.8073899915862499E-01\n  0.8008326929452908E-01  0.7943167089361686E-01  0.7878416752099129E-01  0.7814072345852002E-01  0.7750130368958605E-01\n  0.7686587388407512E-01  0.7623440038359473E-01  0.7560685018692687E-01  0.7498319093571042E-01  0.7436339090035288E-01\n  0.7374741896616860E-01  0.7313524461974377E-01  0.7252683793552536E-01  0.7192216956263091E-01  0.7132121071188088E-01\n  0.7072393314304767E-01  0.7013030915232332E-01  0.6954031156000041E-01  0.6895391369836718E-01  0.6837108939981353E-01\n  0.6779181298514624E-01  0.6721605925211059E-01  0.6664380346411826E-01  0.6607502133917825E-01  0.6550968903902774E-01\n  0.6494778315846379E-01  0.6438928071487048E-01  0.6383415913794230E-01  0.6328239625959906E-01  0.6273397030409252E-01\n  0.6218885987830131E-01  0.6164704396221248E-01  0.6110850189958664E-01  0.6057321338880634E-01  0.6004115847390429E-01\n  0.5951231753576908E-01  0.5898667128352685E-01  0.5846420074609691E-01  0.5794488726391903E-01  0.5742871248084910E-01\n  0.5691565833622340E-01  0.5640570705708669E-01  0.5589884115058460E-01  0.5539504339651542E-01  0.5489429684004177E-01\n  0.5439658478455860E-01  0.5390189078471544E-01  0.5341019863959112E-01  0.5292149238601910E-01  0.5243575629206128E-01\n  0.5195297485062703E-01  0.5147313277323774E-01  0.5099621498393213E-01  0.5052220661331305E-01  0.5005109299273101E-01\n  0.4958285964860470E-01  0.4911749229687554E-01  0.4865497683759399E-01  0.4819529934963621E-01  0.4773844608554897E-01\n  0.4728440346652141E-01  0.4683315807748007E-01  0.4638469666230777E-01  0.4593900611918208E-01  0.4549607349603369E-01\n  0.4505588598612064E-01  0.4461843092371864E-01  0.4418369577992455E-01  0.4375166815857148E-01  0.4332233579225347E-01\n  0.4289568653845881E-01  0.4247170837580991E-01  0.4205038940040735E-01  0.4163171782227736E-01  0.4121568196192090E-01\n  0.4080227024696274E-01  0.4039147120889799E-01  0.3998327347993617E-01  0.3957766578994016E-01  0.3917463696345855E-01\n  0.3877417591685010E-01  0.3837627165549899E-01  0.3798091327111933E-01  0.3758808993914695E-01  0.3719779091621782E-01\n  0.3681000553773126E-01  0.3642472321549702E-01  0.3604193343546399E-01  0.3566162575553031E-01  0.3528378980343305E-01\n  0.3490841527471608E-01  0.3453549193077510E-01  0.3416500959697864E-01  0.3379695816086406E-01  0.3343132757040658E-01\n  0.3306810783236118E-01  0.3270728901067565E-01  0.3234886122497425E-01  0.3199281464910996E-01  0.3163913950978563E-01\n  0.3128782608524168E-01  0.3093886470401072E-01  0.3059224574373675E-01  0.3024795963005924E-01  0.2990599683556058E-01\n  0.2956634787877624E-01  0.2922900332326631E-01  0.2889395377674870E-01  0.2856118989029233E-01  0.2823070235756949E-01\n  0.2790248191416771E-01  0.2757651933695894E-01  0.2725280544352705E-01  0.2693133109165141E-01  0.2661208717884729E-01\n  0.2629506464196176E-01  0.2598025445682497E-01  0.2566764763795566E-01  0.2535723523832159E-01  0.2504900834915327E-01\n  0.2474295809981158E-01  0.2443907565770799E-01  0.2413735222827780E-01  0.2383777905500606E-01  0.2354034741950517E-01\n  0.2324504864164501E-01  0.2295187407973472E-01  0.2266081513075604E-01  0.2237186323064830E-01  0.2208500985464502E-01\n  0.2180024651766184E-01  0.2151756477473634E-01  0.2123695622151859E-01  0.2095841249481422E-01  0.2068192527317876E-01\n  0.2040748627756411E-01  0.2013508727201714E-01  0.1986472006443057E-01  0.1959637650734679E-01  0.1933004849881481E-01\n  0.1906572798330038E-01  0.1880340695265023E-01  0.1854307744711091E-01  0.1828473155640220E-01  0.1802836142084625E-01\n  0.1777395923255295E-01  0.1752151723666215E-01  0.1727102773264334E-01  0.1702248307565384E-01  0.1677587567795624E-01\n  0.1653119801039607E-01  0.1628844260394024E-01  0.1604760205127793E-01  0.1580866900848456E-01  0.1557163619674996E-01\n  0.1533649640417201E-01  0.1510324248761716E-01  0.1487186737464884E-01  0.1464236406552526E-01  0.1441472563526792E-01\n  0.1418894523580252E-01  0.1396501609817369E-01  0.1374293153483488E-01  0.1352268494201562E-01  0.1330426980216726E-01\n  0.1308767968648953E-01  0.1287290825753935E-01  0.1265994927192371E-01  0.1244879658307933E-01  0.1223944414413996E-01\n  0.1203188601089432E-01  0.1182611634483635E-01  0.1162212941630988E-01  0.1141991960775031E-01  0.1121948141702494E-01\n  0.1102080946087490E-01  0.1082389847846042E-01  0.1062874333501194E-01  0.1043533902558977E-01  0.1024368067895393E-01\n  0.1005376356154735E-01  0.9865583081593922E-02  0.9679134793314684E-02  0.9494414401263529E-02  0.9311417764785166E-02\n  0.9130140902597625E-02  0.8950579997500882E-02  0.8772731401214267E-02  0.8596591639343950E-02  0.8422157416482423E-02\n  0.8249425621441884E-02  0.8078393332622082E-02  0.7909057823514530E-02  0.7741416568343256E-02  0.7575467247842871E-02\n  0.7411207755174127E-02  0.7248636201976184E-02  0.7087750924555473E-02  0.6928550490209059E-02  0.6771033703680868E-02\n  0.6615199613748215E-02  0.6461047519934641E-02  0.6308576979345235E-02  0.6157787813618597E-02  0.6008680115989046E-02\n  0.5861254258451652E-02  0.5715510899020261E-02  0.5571450989068522E-02  0.5429075780740853E-02  0.5288386834419521E-02\n  0.5149386026230897E-02  0.5012075555572173E-02  0.4876457952637328E-02  0.4742536085917297E-02  0.4610313169647435E-02\n  0.4479792771170533E-02  0.4350978818180493E-02  0.4223875605807347E-02  0.4098487803498918E-02  0.3974820461650163E-02\n  0.3852879017924298E-02  0.3732669303204216E-02  0.3614197547105479E-02  0.3497470382973937E-02  0.3382494852283408E-02\n  0.3269278408338597E-02  0.3157828919178777E-02  0.3048154669566634E-02  0.2940264361933685E-02  0.2834167116141327E-02\n  0.2729872467901025E-02  0.2627390365681719E-02  0.2526731165915232E-02  0.2427905626291050E-02  0.2330924896912227E-02\n  0.2235800509061165E-02  0.2142544361300639E-02  0.2051168702609613E-02  0.1961686112225166E-02  0.1874109475832896E-02\n  0.1788451957715710E-02  0.1704726968437611E-02  0.1622948127603452E-02  0.1543129221197582E-02  0.1465284152965789E-02\n  0.1389426889263572E-02  0.1315571396752711E-02  0.1243731572285281E-02  0.1173921164272465E-02  0.1106153684794404E-02\n  0.1040442311668004E-02  0.9767997796547971E-03  0.9152382599604941E-03  0.8557692271559906E-03  0.7984033126378760E-03\n  0.7431501437484684E-03  0.6900181676963877E-03  0.6390144594619438E-03  0.5901445129451447E-03  0.5434120147240581E-03\n  0.4988185999463610E-03  0.4563635900883120E-03  0.4160437125934487E-03  0.3778528027632167E-03  0.3417814887280997E-03\n  0.3078168608981688E-03  0.2759421279962239E-03  0.2461362626341978E-03  0.2183736404266527E-03  0.1926236778641105E-03\n  0.1688504756124491E-03  0.1470124755772384E-03  0.1270621419785909E-03  0.1089456788163143E-03  0.9260279843818645E-04\n  0.7796655839983218E-04  0.6496328632466781E-04  0.5351261488371726E-04  0.4352765109263255E-04  0.3491530554961739E-04\n  0.2757680758595959E-04  0.2140843101578471E-04  0.1630245156608879E-04  0.1214835033531085E-04  0.8834266891203550E-05\n  0.6248690035680286E-05  0.4282353222462611E-05  0.2830275035848309E-05  0.1793853932613698E-05  0.1082893085919590E-05\n  0.6174003285747537E-06  0.3289872539180627E-06  0.1616905202076728E-06  0.7206870776681014E-07  0.2849911999804606E-07\n  0.9712198708650968E-08  0.2742442283547959E-08  0.6076172112450161E-09  0.9772731077597771E-10  0.1017048852958432E-10\n  0.5734341782146348E-12  0.1311491489053561E-13  0.7338688834175233E-16  0.3808514445153469E-19  0.2185032842849075E-24\n  0.4450194794086531E-34  0.4448435176905321E-58  0.1173305758391880E-217  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n   13     26.982         4.0500        fcc \n  0.0000000000000000E+00 -0.9628279509886344E-01 -0.9953365511717502E-01 -0.1085367257834955E+00 -0.1214218487615201E+00\n -0.1368680672855588E+00 -0.1540621427490459E+00 -0.1724823698187966E+00 -0.1917766936082239E+00 -0.2116972667780488E+00\n -0.2320627441427241E+00 -0.2527367403313019E+00 -0.2736137350811652E+00 -0.2946105714789528E+00 -0.3156602493701524E+00\n -0.3367083306444053E+00 -0.3577089488344269E+00 -0.3786243739249987E+00 -0.3994221660811231E+00 -0.4200735094048743E+00\n -0.4404904782781875E+00 -0.4603267076635175E+00 -0.4791342002596235E+00 -0.4966697876448934E+00 -0.5129130363987204E+00\n -0.5279649398751899E+00 -0.5419673801142365E+00 -0.5550615741668476E+00 -0.5673715677751278E+00 -0.5790001198451177E+00\n -0.5900298137753388E+00 -0.6005259461781434E+00 -0.6105396931325852E+00 -0.6201109775165654E+00 -0.6292707959422479E+00\n -0.6380435230284373E+00 -0.6464477036605579E+00 -0.6544979268477449E+00 -0.6622058329958839E+00 -0.6695796004816827E+00\n -0.6766263822113870E+00 -0.6833513422524340E+00 -0.6897586759282083E+00 -0.6958513916294100E+00 -0.7016318963634165E+00\n -0.7071020397392846E+00 -0.7122632455033970E+00 -0.7171166154132189E+00 -0.7216630115090188E+00 -0.7259031214369276E+00\n -0.7298375104167867E+00 -0.7334666626446351E+00 -0.7367910666835507E+00 -0.7398107650409456E+00 -0.7425268555598952E+00\n -0.7449393618108722E+00 -0.7470487599589724E+00 -0.7488555593770301E+00 -0.7503603132693473E+00 -0.7515636266841099E+00\n -0.7524661625108897E+00 -0.7530686459172391E+00 -0.7533718513852463E+00 -0.7533768363262632E+00 -0.7530840012877273E+00\n -0.7524921131814579E+00 -0.7515804606478103E+00 -0.7502792607163535E+00 -0.7484607038243816E+00 -0.7459636916668000E+00\n -0.7426298640002307E+00 -0.7383310820407341E+00 -0.7329796809143272E+00 -0.7265308852606689E+00 -0.7189742772379484E+00\n -0.7103273715872973E+00 -0.7006269201238819E+00 -0.6899214100415596E+00 -0.6782669062893683E+00 -0.6657222644919032E+00\n -0.6523467518594732E+00 -0.6381981822655980E+00 -0.6233317828078055E+00 -0.6077995440370048E+00 -0.5916499059655702E+00\n -0.5749276704151935E+00 -0.5576740608036261E+00 -0.5399269902646231E+00 -0.5217207897977505E+00 -0.5030872174417831E+00\n -0.4840550838961484E+00 -0.4646507036272260E+00 -0.4448981173724120E+00 -0.4248192982742891E+00 -0.4044343519155205E+00\n -0.3837617000246638E+00 -0.3628182478945590E+00 -0.3416195360896790E+00 -0.3201798773328464E+00 -0.2985124796289278E+00\n -0.2766295567505006E+00 -0.2545424272145054E+00 -0.2322616028428013E+00 -0.2097968679392537E+00 -0.1871573500428596E+00\n -0.1643515831380795E+00 -0.1413875641241673E+00 -0.1182728032683014E+00 -0.9501436929434126E-01 -0.7161893009339959E-01\n -0.4809278834346697E-01 -0.2444191370712145E-01 -0.6719720983290323E-03  0.2321164851959434E-01  0.4720381488457415E-01\n  0.7129962756731612E-01  0.9549440222479744E-01  0.1197836527451308E+00  0.1441630239601834E+00  0.1686284833950578E+00\n  0.1931760053643994E+00  0.2178017590483101E+00  0.2425020494231500E+00  0.2672733026214353E+00  0.2921120755096318E+00\n  0.3170150833336578E+00  0.3419794799317026E+00  0.3670036243095800E+00  0.3920881689533946E+00  0.4172368973967129E+00\n  0.4424568644116991E+00  0.4677578158531293E+00  0.4931511605824372E+00  0.5186488234682329E+00  0.5442622221402917E+00\n  0.5700014909585294E+00  0.5958749808858199E+00  0.6218890074764571E+00  0.6480477945330341E+00  0.6743535566999124E+00\n  0.7008066705597229E+00  0.7274058941450217E+00  0.7541486054898794E+00  0.7810310401956295E+00  0.8080485153972305E+00\n  0.8351956330126833E+00  0.8624664590130959E+00  0.8898546780165009E+00  0.9173537241128331E+00  0.9449568897488558E+00\n  0.9726574149554992E+00  0.1000448559348619E+01  0.1028323659291245E+01  0.1056276172451073E+01  0.1084299711777170E+01\n  0.1112388070685622E+01  0.1140535241011345E+01  0.1168735425061202E+01  0.1196983042901978E+01  0.1225272735836553E+01\n  0.1253599366863931E+01  0.1281958018782363E+01  0.1310343990479578E+01  0.1338752791854684E+01  0.1367180137734465E+01\n  0.1395621941077129E+01  0.1424074305699794E+01  0.1452533518717449E+01  0.1480996042842949E+01  0.1509458508665117E+01\n  0.1537917706995331E+01  0.1566370831749105E+01  0.1594814471963946E+01  0.1623246104160209E+01  0.1651663086958648E+01\n  0.1680062903840593E+01  0.1708443156854245E+01  0.1736801560607192E+01  0.1765135936545083E+01  0.1793444207513674E+01\n  0.1821724397566120E+01  0.1849974626590099E+01  0.1878193078402154E+01  0.1906378032515773E+01  0.1934527846644618E+01\n  0.1962640952792409E+01  0.1990715853560963E+01  0.2018751118665230E+01  0.2046745381644585E+01  0.2074697336759590E+01\n  0.2102605736064189E+01  0.2130469386642917E+01  0.2158287148004209E+01  0.2186057929620079E+01  0.2213780688603973E+01\n  0.2241454427518249E+01  0.2269078192303640E+01  0.2296651070323292E+01  0.2324172188515120E+01  0.2351640711701886E+01\n  0.2379055842086045E+01  0.2406416827027384E+01  0.2433722996957316E+01  0.2460973865437883E+01  0.2488169306929864E+01\n  0.2515309789359613E+01  0.2542396607347866E+01  0.2569432057808982E+01  0.2596419519065771E+01  0.2623363422536599E+01\n  0.2650269129601363E+01  0.2677142739909846E+01  0.2703990861443457E+01  0.2730820370008068E+01  0.2757638179775513E+01\n  0.2784451039495457E+01  0.2811265362580523E+01  0.2838087094127737E+01  0.2864921614243932E+01  0.2891773674664324E+01\n  0.2918647364337785E+01  0.2945546099121457E+01  0.2972472630730262E+01  0.2999429070422704E+01  0.3026416923420929E+01\n  0.3053437130653784E+01  0.3080490115009347E+01  0.3107575829842219E+01  0.3134693807981898E+01  0.3161843209919625E+01\n  0.3189022870212173E+01  0.3216231341437487E+01  0.3243466935272163E+01  0.3270727760447288E+01  0.3298011757479649E+01\n  0.3325316730182467E+01  0.3352640374035690E+01  0.3379980301550311E+01  0.3407334064796215E+01  0.3434699175284783E+01\n  0.3462073121407959E+01  0.3489453383638473E+01  0.3516837447692921E+01  0.3544222815852538E+01  0.3571607016626300E+01\n  0.3598987612930495E+01  0.3626362208945728E+01  0.3653728455799938E+01  0.3681084056213634E+01  0.3708426768230866E+01\n  0.3735754408148046E+01  0.3763064852741161E+01  0.3790356040882480E+01  0.3817625974627172E+01  0.3844872719842444E+01\n  0.3872094406443206E+01  0.3899289228291301E+01  0.3926455442808664E+01  0.3953591370348690E+01  0.3980695393365072E+01\n  0.4007765955412338E+01  0.4034801560008381E+01  0.4061800769384807E+01  0.4088762203148616E+01  0.4115684536874605E+01\n  0.4142566500646071E+01  0.4169406877558640E+01  0.4196204502200039E+01  0.4222958259116835E+01  0.4249667081277604E+01\n  0.4276329948540632E+01  0.4302945886132529E+01  0.4329513963143877E+01  0.4356033291046330E+01  0.4382503022235336E+01\n  0.4408922348601389E+01  0.4435290500132353E+01  0.4461606743549172E+01  0.4487870380976208E+01  0.4514080748647457E+01\n  0.4540237215649173E+01  0.4566339182699858E+01  0.4592386080967303E+01  0.4618377370923009E+01  0.4644312541233742E+01\n  0.4670191107689631E+01  0.4696012612168792E+01  0.4721776621637420E+01  0.4747482727184995E+01  0.4773130543093758E+01\n  0.4798719705941583E+01  0.4824249873737505E+01  0.4849720725089056E+01  0.4875131958400324E+01  0.4900483291100185E+01\n  0.4925774458899197E+01  0.4951005215074943E+01  0.4976175329784288E+01  0.5001284589402100E+01  0.5026332801140161E+01\n  0.5051319771276494E+01  0.5076245336511819E+01  0.5101109341973393E+01  0.5125911646062397E+01  0.5150652119931829E+01\n  0.5175330646984699E+01  0.5199947122391546E+01  0.5224501452626964E+01  0.5248993555024179E+01  0.5273423357346785E+01\n  0.5297790805953600E+01  0.5322095829385203E+01  0.5346338394872665E+01  0.5370518467903519E+01  0.5394636022497286E+01\n  0.5418691040867781E+01  0.5442683513098503E+01  0.5466613436830711E+01  0.5490480816963549E+01  0.5514285665365584E+01\n  0.5538028000597862E+01  0.5561707847647368E+01  0.5585325237670777E+01  0.5608880207748139E+01  0.5632372800646136E+01\n  0.5655803064590023E+01  0.5679171053044746E+01  0.5702476824504079E+01  0.5725720442287942E+01  0.5748901974347438E+01\n  0.5772021493077228E+01  0.5795079075135007E+01  0.5818074801267764E+01  0.5841008756144801E+01  0.5863881028196719E+01\n  0.5886691709361872E+01  0.5909440895975128E+01  0.5932128683720454E+01  0.5954755179911128E+01  0.5977320485443878E+01\n  0.5999824709469358E+01  0.6022267962734361E+01  0.6044650358660738E+01  0.6066972013230976E+01  0.6089233044877606E+01\n  0.6111433574377054E+01  0.6133573724746905E+01  0.6155653621147478E+01  0.6177673390786589E+01  0.6199633162827851E+01\n  0.6221533068302496E+01  0.6243373240024188E+01  0.6265153812506977E+01  0.6286874921886278E+01  0.6308536705842656E+01\n  0.6330139303528365E+01  0.6351682855496508E+01  0.6373167503632674E+01  0.6394593391089307E+01  0.6415960662221997E+01\n  0.6437269462528379E+01  0.6458519938589133E+01  0.6479712238010886E+01  0.6500846509371517E+01  0.6521922902167027E+01\n  0.6542941566760541E+01  0.6563902654333011E+01  0.6584806316835689E+01  0.6605652706944284E+01  0.6626441978014737E+01\n  0.6647174088072036E+01  0.6667849577716816E+01  0.6688468412040860E+01  0.6709030746709217E+01  0.6729536737868406E+01\n  0.6749986542110525E+01  0.6770380316439014E+01  0.6790718218235369E+01  0.6811000456475160E+01  0.6831227079554464E+01\n  0.6851398303748420E+01  0.6871514287649720E+01  0.6891575190080648E+01  0.6911581170066203E+01  0.6931532386808209E+01\n  0.6951428999660269E+01  0.6971271168103572E+01  0.6991059051723765E+01  0.7010792810188176E+01  0.7030472603224527E+01\n  0.7050098590599536E+01  0.7069670932099115E+01  0.7089189787508612E+01  0.7108655316594129E+01  0.7128067679084379E+01\n  0.7147427034653132E+01  0.7166733542902411E+01  0.7185987363346015E+01  0.7205188655394117E+01  0.7224337578337899E+01\n  0.7243434291334958E+01  0.7262478953395287E+01  0.7281471723367670E+01  0.7300412759926576E+01  0.7319302221559616E+01\n  0.7338140266555139E+01  0.7356927052990867E+01  0.7375662738722378E+01  0.7394347481372199E+01  0.7412981438319438E+01\n  0.7431564766689641E+01  0.7450097623345021E+01  0.7468580164875283E+01  0.7487012547588363E+01  0.7505394927501915E+01\n  0.7523727460334936E+01  0.7542010301499733E+01  0.7560243606094313E+01  0.7578427528894725E+01  0.7596562224348212E+01\n  0.7614647846566118E+01  0.7632684549317478E+01  0.7650672486022634E+01  0.7668611809747173E+01  0.7686502673196021E+01\n  0.7704345228708073E+01  0.7722139628250660E+01  0.7739886023414384E+01  0.7757584565408455E+01  0.7775235405055646E+01\n  0.7792838692788044E+01  0.7810394578642622E+01  0.7827903212257197E+01  0.7845364742866390E+01  0.7862779319297943E+01\n  0.7880147089969217E+01  0.7897468202883433E+01  0.7914742805626958E+01  0.7931971045365675E+01  0.7949153068842364E+01\n  0.7966289022373804E+01  0.7983379051848088E+01  0.8000423302722167E+01  0.8017421920019366E+01  0.8034375048327233E+01\n  0.8051282831795312E+01  0.8068145414133273E+01  0.8084962938608882E+01  0.8101735548046269E+01  0.8118463384824164E+01\n  0.8135146590874683E+01  0.8151785307681390E+01  0.8168379676278345E+01  0.8184929837248552E+01  0.8201435930723028E+01\n  0.8217898096379580E+01  0.8234316473441851E+01  0.8250691200678498E+01  0.8267022416402313E+01  0.8283310258469461E+01\n  0.8299554864278941E+01  0.8315756370771805E+01  0.8331914914430893E+01  0.8348030631280192E+01  0.8364103656884673E+01\n  0.8380134126349787E+01  0.8396122174321329E+01  0.8412067934985277E+01  0.8427971542067645E+01  0.8443833128834413E+01\n  0.8459652828091619E+01  0.8475430772185273E+01  0.8491167093001646E+01  0.8506861921967246E+01  0.8522515390049147E+01\n  0.8538127627755209E+01  0.8553698765134389E+01  0.8569228931777127E+01  0.8584718256815695E+01  0.8600166868924553E+01\n  0.8615574896321021E+01  0.8630942466765738E+01  0.8646269707563008E+01  0.8661556745561711E+01  0.8676803707155621E+01\n  0.8692010718284379E+01  0.8707177904433900E+01  0.8722305390637324E+01  0.8737393301475592E+01  0.8752441761078339E+01\n  0.8767450893124774E+01  0.8782420820844322E+01  0.8797351667017651E+01  0.8812243553977586E+01  0.8827096603609940E+01\n  0.8841910937354429E+01  0.8856686676205864E+01  0.8871423940714820E+01  0.8886122850988944E+01  0.8900783526693864E+01\n  0.8915406087054141E+01  0.8929990650854535E+01  0.8944537336441012E+01  0.8959046261721827E+01  0.8973517544168701E+01\n  0.8987951300817869E+01  0.9002347648271487E+01  0.9016706702698437E+01  0.9031028579835858E+01  0.9045313394990188E+01\n  0.9059561263038376E+01  0.9073772298429056E+01  0.9087946615184084E+01  0.9102084326899423E+01  0.9116185546746657E+01\n  0.9130250387474085E+01  0.9144278961408215E+01  0.9158271380454892E+01  0.9172227756100682E+01  0.9186148199414212E+01\n  0.9200032821047387E+01  0.9213881731236844E+01  0.9227695039805166E+01  0.9241472856162442E+01  0.9255215289307372E+01\n  0.9268922447828803E+01  0.9282594439906916E+01  0.9296231373314885E+01  0.9309833355419986E+01  0.9323400493185019E+01\n  0.9336932882359978E+01  0.9350430594893881E+01  0.9363893783342821E+01  0.9377322553011272E+01  0.9390717008807609E+01\n  0.9404077255245511E+01  0.9417403396445167E+01  0.9430695536134984E+01  0.9443953777652798E+01  0.9457178223947256E+01\n  0.9470368977579316E+01  0.9483526140723573E+01  0.9496649815169690E+01  0.9509740102323899E+01  0.9522797103210273E+01\n  0.9535822238420437E+01  0.9548812165768359E+01  0.9561769891801452E+01  0.9574694732427433E+01  0.9587586786767478E+01\n  0.9600446153569266E+01  0.9613272931208536E+01  0.9626067217690245E+01  0.9638829110650304E+01  0.9651558707356724E+01\n  0.9664256104711166E+01  0.9676921399250290E+01  0.9689554687147089E+01  0.9702157469174860E+01  0.9714727037387689E+01\n  0.9727264885308301E+01  0.9739771107669302E+01  0.9752245798846879E+01  0.9764689052861872E+01  0.9777100963381457E+01\n  0.9789481623720420E+01  0.9801831126842281E+01  0.9814149565361319E+01  0.9826437031543161E+01  0.9838693617306955E+01\n  0.9850919414226038E+01  0.9863114513529872E+01  0.9875279006105066E+01  0.9887412982496855E+01  0.9899516532910610E+01\n  0.9911589747212901E+01  0.9923632714933214E+01  0.9935645525264956E+01  0.9947628267067159E+01  0.9959581028865557E+01\n  0.9971503898854007E+01  0.9983396964895977E+01  0.9995260314525778E+01  0.1000709403494981E+02  0.1001889821304812E+02\n  0.1003067293537552E+02  0.1004241828816303E+02  0.1005413435731925E+02  0.1006582122843160E+02  0.1007747898676759E+02\n  0.1008910771727630E+02  0.1010070750458943E+02  0.1011227843302306E+02  0.1012382058657841E+02  0.1013533404894347E+02\n  0.1014681890349423E+02  0.1015827523329602E+02  0.1016970312110463E+02  0.1018110264936784E+02  0.1019247390022638E+02\n  0.1020381695551557E+02  0.1021513189676633E+02  0.1022641880520652E+02  0.1023767776176225E+02  0.1024890884705905E+02\n  0.1026011214142316E+02  0.1027128772488293E+02  0.1028243567716970E+02  0.1029355607771946E+02  0.1030464900567390E+02\n  0.1031571453988140E+02  0.1032675275889879E+02  0.1033776374099216E+02  0.1034874756413813E+02  0.1035970430602517E+02\n  0.1037063404405489E+02  0.1038153685534300E+02  0.1039241281672065E+02  0.1040326200473567E+02  0.1041408449565369E+02\n  0.1042488036545932E+02  0.1043564968985735E+02  0.1044639254427403E+02  0.1045710900385802E+02  0.1046779914348181E+02\n  0.1047846303774262E+02  0.1048910076096391E+02  0.1049971238719612E+02  0.1051029799021812E+02  0.1052085764353829E+02\n  0.1053139142039568E+02  0.1054189939376099E+02  0.1055238163633786E+02  0.1056283822056399E+02  0.1057326921861215E+02\n  0.1058367470239147E+02  0.1059405474354847E+02  0.1060440941346801E+02  0.1061473878327465E+02  0.1062504292383371E+02\n  0.1063532190575210E+02  0.1064557579937992E+02  0.1065580467481084E+02  0.1066600860188387E+02  0.1067618765018412E+02\n  0.1068634188904373E+02  0.1069647138754325E+02  0.1070657621451248E+02  0.1071665643853165E+02  0.1072671212793241E+02\n  0.1073674335079890E+02  0.1074675017496875E+02  0.1075673266803417E+02  0.1076669089734308E+02  0.1077662492999989E+02\n  0.1078653483286685E+02  0.1079642067256462E+02  0.1080628251547384E+02  0.1081612042773567E+02  0.1082593447525316E+02\n  0.1083572472369191E+02  0.1084549123848135E+02  0.1085523408481566E+02  0.1086495332765466E+02  0.1087464903172486E+02\n  0.1088432126152055E+02  0.1089397008130446E+02  0.1090359555510911E+02  0.1091319774673763E+02  0.1092277671976472E+02\n  0.1093233253753738E+02  0.1094186526317629E+02  0.1095137495957662E+02  0.1096086168940853E+02  0.1097032555892928E+02\n  0.1097976666590150E+02  0.1098918498743821E+02  0.1099858058553585E+02  0.1100795352196447E+02  0.1101730385826855E+02\n  0.1102663165576839E+02  0.1103593697556089E+02  0.1104521987852084E+02  0.1105448042530153E+02  0.1106371867633628E+02\n  0.1107293247783943E+02  0.1108212631163812E+02  0.1109129802968301E+02  0.1110044769153667E+02  0.1110957535654645E+02\n  0.1111868108384563E+02  0.1112776493235422E+02  0.1113682696078008E+02  0.1114586722761977E+02  0.1115488579115973E+02\n  0.1116388270947705E+02  0.1117285804044050E+02  0.1118181184171143E+02  0.1119074417074485E+02  0.1119965508479030E+02\n  0.1120854464089276E+02  0.1121741289589355E+02  0.1122625990643143E+02  0.1123508572894327E+02  0.1124389041966516E+02\n  0.1125267403463331E+02  0.1126143662968485E+02  0.1127017826045877E+02  0.1127889898239682E+02  0.1128759885074458E+02\n  0.1129627792055189E+02  0.1130493624667420E+02  0.1131357388377320E+02  0.1132219088631773E+02  0.1133078730858470E+02\n  0.1133936320465983E+02  0.1134791862843856E+02  0.1135645363362708E+02  0.1136496827374269E+02  0.1137346260211521E+02\n  0.1138193667188745E+02  0.1139039053601605E+02  0.1139882424727257E+02  0.1140723785824395E+02  0.1141563142133352E+02\n  0.1142400498876172E+02  0.1143235861256712E+02  0.1144069234460682E+02  0.1144900623655768E+02  0.1145730033991675E+02\n  0.1146557470600226E+02  0.1147382938595421E+02  0.1148206443073531E+02  0.1149027989113191E+02  0.1149847581775414E+02\n  0.1150665226103736E+02  0.1151480927124249E+02  0.1152294689845698E+02  0.1153106519259537E+02  0.1153916420340013E+02\n  0.1154724398044246E+02  0.1155530457312277E+02  0.1156334603067165E+02  0.1157136840215052E+02  0.1157937173645239E+02\n  0.1158735608230234E+02  0.1159532148825857E+02  0.1160326800271278E+02  0.1161119567389111E+02  0.1161910454985465E+02\n  0.1162699467850026E+02  0.1163486610756115E+02  0.1164271888460782E+02  0.1165055305704804E+02  0.1165836867212856E+02\n  0.1166616577693494E+02  0.1167394441839248E+02  0.1168170464326700E+02  0.1168944649816522E+02  0.1169717002953568E+02\n  0.1170487528366932E+02  0.1171256230670009E+02  0.1172023114460535E+02  0.1172788184320704E+02  0.1173551444817181E+02\n  0.1174312900501185E+02  0.1175072555908556E+02  0.1175830415559807E+02  0.1176586483960187E+02  0.1177340765599744E+02\n  0.1178093264953387E+02  0.1178843986480948E+02  0.1179592934627236E+02  0.1180340113822094E+02  0.1181085528480470E+02\n  0.1181829166269570E+02  0.1182570985953448E+02  0.1183311348562248E+02  0.1184049703658763E+02  0.1184786329267578E+02\n  0.1185521227437533E+02  0.1186254400205932E+02  0.1186985849598701E+02  0.1187715577630568E+02  0.1188443611784194E+02\n  0.1189169878246886E+02  0.1189894457481569E+02  0.1190617328225404E+02  0.1191338494670332E+02  0.1192057960986771E+02\n  0.1192775731323726E+02  0.1193491809808902E+02  0.1194206200548831E+02  0.1194918907628982E+02  0.1195629935113887E+02\n  0.1196339287047247E+02  0.1197046967452045E+02  0.1197752980330694E+02  0.1198457329665118E+02  0.1199160019416887E+02\n  0.1199861053527344E+02  0.1200560435917693E+02  0.1201258170489155E+02  0.1201954261123063E+02  0.1202648711680959E+02\n  0.1203341526004761E+02  0.1204032707916849E+02  0.1204722261220184E+02  0.1205410189698429E+02  0.1206096497116060E+02\n  0.1206781187218495E+02  0.1207464559802799E+02  0.1208146027002577E+02  0.1208825888009797E+02  0.1209504146494779E+02\n  0.1210180806109399E+02  0.1210855896537541E+02  0.1211529410378007E+02  0.1212201340030601E+02  0.1212871689296240E+02\n  0.1213540461963384E+02  0.1214207661808061E+02  0.1214873292593939E+02  0.1215537358072345E+02  0.1216199861982349E+02\n  0.1216860808050769E+02  0.1217520199992239E+02  0.1218178041509279E+02  0.1218834336292295E+02  0.1219489088019657E+02\n  0.1220142300357730E+02  0.1220793976960926E+02  0.1221444121471769E+02  0.1222092737520902E+02  0.1222739828727144E+02\n  0.1223385398697564E+02  0.1224029451027501E+02  0.1224671989300593E+02  0.1225313017088853E+02  0.1225952537952718E+02\n  0.1226590555441035E+02  0.1227227073091185E+02  0.1227862094429078E+02  0.1228495622969180E+02  0.1229127662214604E+02\n  0.1229758215657148E+02  0.1230387286777276E+02  0.1231014879044237E+02  0.1231640995916075E+02  0.1232265640839672E+02\n  0.1232888817250763E+02  0.1233510528574038E+02  0.1234130778223132E+02  0.1234749569600697E+02  0.1235366906098424E+02\n  0.1235982791097082E+02  0.1236597227966591E+02  0.1237210220066028E+02  0.1237821770743661E+02  0.1238431883337027E+02\n  0.1239040561172962E+02  0.1239647807567605E+02  0.1240253625826483E+02  0.1240858019244517E+02  0.1241460991106090E+02\n  0.1242062544685069E+02  0.1242662683244833E+02  0.1243261410038329E+02  0.1243858728308130E+02  0.1244454641286415E+02\n  0.1245049152195065E+02  0.1245642264245671E+02  0.1246233980639583E+02  0.1246824304567928E+02  0.1247413239211681E+02\n  0.1248000787741680E+02  0.1248586953318652E+02  0.1249171739093289E+02  0.1249755148206230E+02  0.1250337183788155E+02\n  0.1250917848959775E+02  0.1251497146831911E+02  0.1252075080505461E+02  0.1252651653071523E+02  0.1253226867611377E+02\n  0.1253800727196519E+02  0.1254373234888717E+02  0.1254944393740030E+02  0.1255514206792864E+02  0.1256082677079984E+02\n  0.1256649807624557E+02  0.1257215601440174E+02  0.1257780061530919E+02  0.1258343190891375E+02  0.1258904992506636E+02\n  0.1259465469352414E+02  0.1260024624394981E+02  0.1260582460591276E+02  0.1261138980888892E+02  0.1261694188226133E+02\n  0.1262248085532045E+02  0.1262800675726433E+02  0.1263351961719898E+02  0.1263901946413904E+02  0.1264450285631671E+02\n  0.1264997675865174E+02  0.1265543773449255E+02  0.1266088581249014E+02  0.1266632102120516E+02  0.1267174338910899E+02\n  0.1267715294458313E+02  0.1268254971592008E+02  0.1268793373132342E+02  0.1269330501890832E+02  0.1269866360670164E+02\n  0.1270400952264229E+02  0.1270934279458158E+02  0.1271466345028335E+02  0.1271997151742474E+02  0.1272526702359572E+02\n  0.1273054999630008E+02  0.1273582044112639E+02  0.1274107829127974E+02  0.1274632368547512E+02  0.1275155665077283E+02\n  0.1275677721414707E+02  0.1276198540248610E+02  0.1276718124259236E+02  0.1277236476118314E+02  0.1277753598489035E+02\n  0.1278269494026117E+02  0.1278784165375827E+02  0.1279297615176009E+02  0.1279809846056095E+02  0.1280320860637152E+02\n  0.1280830661531907E+02  0.1281339251344765E+02  0.1281846632671840E+02  0.1282352808100990E+02  0.1282857780211833E+02\n  0.1283361551575781E+02  0.1283864124756066E+02  0.1284365502307763E+02  0.1284865686777834E+02  0.1285364680705105E+02\n  0.1285862486620364E+02  0.1286359107046338E+02  0.1286854544497717E+02  0.1287348801481206E+02  0.1287841880495558E+02\n  0.1288333784031538E+02  0.1288824514572031E+02  0.1289314074592015E+02  0.1289802466558600E+02  0.1290289692931037E+02\n  0.1290775756160805E+02  0.1291260658691528E+02  0.1291744402959128E+02  0.1292226991391726E+02  0.1292708426409754E+02\n  0.1293188710425972E+02  0.1293667845845432E+02  0.1294145835065556E+02  0.1294622680476155E+02  0.1295098384459444E+02\n  0.1295572949390062E+02  0.1296046377635092E+02  0.1296518671554123E+02  0.1296989833499209E+02  0.1297459865814951E+02\n  0.1297928770838488E+02  0.1298396550899552E+02  0.1298863208320455E+02  0.1299328745416105E+02  0.1299793164494091E+02\n  0.1300256467854653E+02  0.1300718657790715E+02  0.1301179736587904E+02  0.1301639706524610E+02  0.1302098569871943E+02\n  0.1302556328893826E+02  0.1303012985846953E+02  0.1303468542980876E+02  0.1303923002537965E+02  0.1304376366753469E+02\n  0.1304828637855533E+02  0.1305279818065219E+02  0.1305729909596507E+02  0.1306178914656352E+02  0.1306626835444681E+02\n  0.1307073674154426E+02  0.1307519432971517E+02  0.1307964114074970E+02  0.1308407719636832E+02  0.1308850251822266E+02\n  0.1309291712789514E+02  0.1309732104689959E+02  0.1310172496590404E+02  0.1310612888490850E+02  0.1311053280391295E+02\n  0.0000000000000000E+00  0.2350503764662797E-10  0.1452741565148498E-08  0.1598024605657181E-07  0.8670887247915710E-07\n  0.3194268290355064E-06  0.9210999532108705E-06  0.2243032243257230E-05  0.4826533736759059E-05  0.9449280963997414E-05\n  0.1717086310497067E-04  0.2937628005930804E-04  0.4781640004850213E-04  0.7464459701436190E-04  0.1124489746320072E-03\n  0.1642797466831127E-03  0.2336714851009560E-03  0.3246600692852489E-03  0.4417942752036344E-03  0.5901420321021944E-03\n  0.7752914499470295E-03  0.1003346783485080E-02  0.1280919550391384E-02  0.1615115062592291E-02  0.2013514662642524E-02\n  0.2484153982012019E-02  0.3035497556237696E-02  0.3676410143962806E-02  0.4416125103690986E-02  0.5264210184320288E-02\n  0.6230531083824742E-02  0.7325213125386473E-02  0.8558601392363368E-02  0.9941219653166928E-02  0.1148372839483666E-01\n  0.1319688227020127E-01  0.1509148724834461E-01  0.1717835774193908E-01  0.1946827396813322E-01  0.2197193978231332E-01\n  0.2469994120640449E-01  0.2766270585561205E-01  0.3087046344978465E-01  0.3433320757803945E-01  0.3806065886804223E-01\n  0.4206222969448004E-01  0.4634699054488188E-01  0.5092363814510472E-01  0.5580046543156136E-01  0.6098533344267084E-01\n  0.6648564518809444E-01  0.7230832154110638E-01  0.7845977918695805E-01  0.8494591064833676E-01  0.9177206639800155E-01\n  0.9894303905839608E-01  0.1064630496784886E+00  0.1143357360692630E+00  0.1225641431711653E+00  0.1311507154193881E+00\n  0.1400972910661206E+00  0.1494050984128002E+00  0.1590747538999337E+00  0.1691062619971989E+00  0.1794990168322592E+00\n  0.1902518054930074E+00  0.2013628129347618E+00  0.2128296284212524E+00  0.2246492534260200E+00  0.2368181109190946E+00\n  0.2493320559624748E+00  0.2621863875369867E+00  0.2753758615225286E+00  0.2888947047534727E+00  0.3027366300710904E+00\n  0.3168948522952475E+00  0.3313621050382702E+00  0.3461306582847914E+00  0.3611923366625136E+00  0.3765385383301647E+00\n  0.3921602544104397E+00  0.4080480888974157E+00  0.4241922789697600E+00  0.4405827156430124E+00  0.4572089646963136E+00\n  0.4740602878111100E+00  0.4911256638616449E+00  0.5083938102993529E+00  0.5258532045756759E+00  0.5434921055502246E+00\n  0.5612985748336912E+00  0.5792604980173683E+00  0.5973656057436424E+00  0.6156014945742982E+00  0.6339556476159732E+00\n  0.6524154548645443E+00  0.6709682332326954E+00  0.6896012462273114E+00  0.7083017232457365E+00  0.7270568784622643E+00\n  0.7458539292785299E+00  0.7646801143137046E+00  0.7835227109126022E+00  0.8023690521519213E+00  0.8212065433269309E+00\n  0.8400226779029110E+00  0.8588050529176166E+00  0.8775413838228915E+00  0.8962195187553934E+00  0.9148274522281129E+00\n  0.9333533382360560E+00  0.9517855027710543E+00  0.9701124557421923E+00  0.9883229022998167E+00  0.1006405753562465E+01\n  0.1024350136747383E+01  0.1042145404706545E+01  0.1059781144871260E+01  0.1077247187609600E+01  0.1094533614001869E+01\n  0.1111630763040373E+01  0.1128529238260637E+01  0.1145219913812065E+01  0.1161693939976847E+01  0.1177942748146633E+01\n  0.1193958055267189E+01  0.1209731867761823E+01  0.1225256484945006E+01  0.1240524501938026E+01  0.1255528812099049E+01\n  0.1270262608980346E+01  0.1284719387825761E+01  0.1298892946621899E+01  0.1312777386716678E+01  0.1326367113019209E+01\n  0.1339656833795096E+01  0.1352641560071424E+01  0.1365316604665792E+01  0.1377677580853886E+01  0.1389720400690019E+01\n  0.1401441272995214E+01  0.1412836701027270E+01  0.1423903479847286E+01  0.1434638693397013E+01  0.1445039711301291E+01\n  0.1455104185409776E+01  0.1464830046091919E+01  0.1474215498299109E+01  0.1483259017407622E+01  0.1491959344855860E+01\n  0.1500315483589179E+01  0.1508326693325296E+01  0.1515992485653126E+01  0.1523312618977543E+01  0.1530287093322397E+01\n  0.1536916145003750E+01  0.1543200241185077E+01  0.1549140074325868E+01  0.1554736556534737E+01  0.1559990813837915E+01\n  0.1564904180373601E+01  0.1569478192522416E+01  0.1573714582983838E+01  0.1577615274808202E+01  0.1581182375393509E+01\n  0.1584418170455991E+01  0.1587325117983052E+01  0.1589905842176854E+01  0.1592163127396545E+01  0.1594099912106772E+01\n  0.1595719282839819E+01  0.1597024468178396E+01  0.1598018832765788E+01  0.1598705871349761E+01  0.1599089202866354E+01\n  0.1599172564569312E+01  0.1598959806210704E+01  0.1598454884277914E+01  0.1597661856291940E+01  0.1596584875171653E+01\n  0.1595228183668366E+01  0.1593596108874842E+01  0.1591693056812536E+01  0.1589523507100701E+01  0.1587092007710641E+01\n  0.1584403169808198E+01  0.1581461662687349E+01  0.1578272208797470E+01  0.1574839578866685E+01  0.1571168587123450E+01\n  0.1567264086618331E+01  0.1563130964647693E+01  0.1558774138280876E+01  0.1554198549992189E+01  0.1549409163398889E+01\n  0.1544410959106127E+01  0.1539208930659677E+01  0.1533808080607080E+01  0.1528213416667707E+01  0.1522429948012042E+01\n  0.1516462681650386E+01  0.1510316618931021E+01  0.1503996752147732E+01  0.1497508061256460E+01  0.1490855510700755E+01\n  0.1484044046345540E+01  0.1477078592518635E+01  0.1469964049159342E+01  0.1462705289073315E+01  0.1455307155292826E+01\n  0.1447774458541496E+01  0.1440111974802394E+01  0.1432324442988392E+01  0.1424416562713602E+01  0.1416392992164560E+01\n  0.1408258346069873E+01  0.1400017193766902E+01  0.1391674057364033E+01  0.1383233409997026E+01  0.1374699674177898E+01\n  0.1366077220234727E+01  0.1357370364840755E+01  0.1348583369631108E+01  0.1339720439905439E+01  0.1330785723414737E+01\n  0.1321783309230582E+01  0.1312717226695031E+01  0.1303591444449351E+01  0.1294409869539786E+01  0.1285176346598528E+01\n  0.1275894657098056E+01  0.1266568518676988E+01  0.1257201584535619E+01  0.1247797442899263E+01  0.1238359616547584E+01\n  0.1228891562408019E+01  0.1219396671211496E+01  0.1209878267208578E+01  0.1200339607944202E+01  0.1190783884089205E+01\n  0.1181214219326823E+01  0.1171633670292365E+01  0.1162045226564264E+01  0.1152451810704780E+01  0.1142856278348570E+01\n  0.1133261418337408E+01  0.1123669952899346E+01  0.1114084537870646E+01  0.1104507762958775E+01  0.1094942152044870E+01\n  0.1085390163524009E+01  0.1075854190681740E+01  0.1066336562105254E+01  0.1056839542127690E+01  0.1047365331304049E+01\n  0.1037916066917227E+01  0.1028493823512701E+01  0.1019100613460447E+01  0.1009738387542688E+01  0.1000409035566070E+01\n  0.9911143869969610E+00  0.9818562116185301E+00  0.9726362202083267E+00  0.9634560652350970E+00  0.9543173415736288E+00\n  0.9452215872364120E+00  0.9361702841209427E+00  0.9271648587715566E+00  0.9182066831546644E+00  0.9092970754463097E+00\n  0.9004373008310244E+00  0.8916285723109384E+00  0.8828720515241635E+00  0.8741688495714935E+00  0.8655200278504954E+00\n  0.8569265988960664E+00  0.8483895272266132E+00  0.8399097301949807E+00  0.8314880788433289E+00  0.8231253987611650E+00\n  0.8148224709457564E+00  0.8065800326641964E+00  0.7983987783164219E+00  0.7902793602984723E+00  0.7822223898653531E+00\n  0.7742284379928720E+00  0.7662980362378170E+00  0.7584316775959118E+00  0.7506298173569868E+00  0.7428928739568187E+00\n  0.7352212298251275E+00  0.7276152322292518E+00  0.7200751941130188E+00  0.7126013949303633E+00  0.7051940814732806E+00\n  0.6978534686936988E+00  0.6905797405188852E+00  0.6833730506600221E+00  0.6762335234136188E+00  0.6691612544554096E+00\n  0.6621563116264519E+00  0.6552187357111161E+00  0.6483485412067125E+00  0.6415457170844840E+00  0.6348102275417313E+00\n  0.6281420127448483E+00  0.6215409895630656E+00  0.6150070522926947E+00  0.6085400733717113E+00  0.6021399040845107E+00\n  0.5958063752566826E+00  0.5895392979396676E+00  0.5833384640851877E+00  0.5772036472093250E+00  0.5711346030461549E+00\n  0.5651310701908592E+00  0.5591927707322315E+00  0.5533194108745153E+00  0.5475106815485299E+00  0.5417662590120353E+00\n  0.5360858054393003E+00  0.5304689694998603E+00  0.5249153869264497E+00  0.5194246810720941E+00  0.5139964634563777E+00\n  0.5086303343008993E+00  0.5033258830539155E+00  0.4980826889042317E+00  0.4929003212843441E+00  0.4877783403628898E+00\n  0.4827162975264554E+00  0.4777137358507827E+00  0.4727701905614446E+00  0.4678851894840552E+00  0.4630582534840750E+00\n  0.4582888968962981E+00  0.4535766279440972E+00  0.4489209491485098E+00  0.4443213577272558E+00  0.4397773459837845E+00\n  0.4352884016864413E+00  0.4308540084378585E+00  0.4264736460346724E+00  0.4221467908176804E+00  0.4178729160125361E+00\n  0.4136514920611062E+00  0.4094819869436024E+00  0.4053638664915989E+00  0.4012965946920645E+00  0.3972796339825281E+00\n  0.3933124455374964E+00  0.3893944895462572E+00  0.3855252254821869E+00  0.3817041123636960E+00  0.3779306090069412E+00\n  0.3742041742704262E+00  0.3705242672916375E+00  0.3668903477158274E+00  0.3633018759170965E+00  0.3597583132118892E+00\n  0.3562591220650529E+00  0.3528037662885790E+00  0.3493917112331675E+00  0.3460224239727477E+00  0.3426953734820877E+00\n  0.3394100308076194E+00  0.3361658692316251E+00  0.3329623644299036E+00  0.3297989946230563E+00  0.3266752407215223E+00\n  0.3235905864644950E+00  0.3205445185528428E+00  0.3175365267761750E+00  0.3145661041341699E+00  0.3116327469522978E+00\n  0.3087359549920661E+00  0.3058752315559112E+00  0.3030500835868565E+00  0.3002600217630693E+00  0.2975045605874296E+00\n  0.2947832184722352E+00  0.2920955178191660E+00  0.2894409850946181E+00  0.2868191509005325E+00  0.2842295500408273E+00\n  0.2816717215835535E+00  0.2791452089188812E+00  0.2766495598130334E+00  0.2741843264582723E+00  0.2717490655190478E+00\n  0.2693433381744174E+00  0.2669667101568407E+00  0.2646187517874495E+00  0.2622990380079024E+00  0.2600071484089175E+00\n  0.2577426672555859E+00  0.2555051835095635E+00  0.2532942908482358E+00  0.2511095876809479E+00  0.2489506771623981E+00\n  0.2468171672032794E+00  0.2447086704782614E+00  0.2426248044314016E+00  0.2405651912790701E+00  0.2385294580104723E+00\n  0.2365172363858518E+00  0.2345281629324596E+00  0.2325618789383613E+00  0.2306180304441682E+00  0.2286962682327625E+00\n  0.2267962478170977E+00  0.2249176294261405E+00  0.2230600779890333E+00  0.2212232631175415E+00  0.2194068590868594E+00\n  0.2176105448148379E+00  0.2158340038397009E+00  0.2140769242963177E+00  0.2123389988910903E+00  0.2106199248755169E+00\n  0.2089194040184958E+00  0.2072371425774233E+00  0.2055728512681448E+00  0.2039262452338156E+00  0.2022970440127238E+00\n  0.2006849715051299E+00  0.1990897559391716E+00  0.1975111298358903E+00  0.1959488299734197E+00  0.1944025973503926E+00\n  0.1928721771486053E+00  0.1913573186949898E+00  0.1898577754229339E+00  0.1883733048329959E+00  0.1869036684530497E+00\n  0.1854486317979078E+00  0.1840079643284546E+00  0.1825814394103312E+00  0.1811688342722097E+00  0.1797699299636905E+00\n  0.1783845113128567E+00  0.1770123668835237E+00  0.1756532889322104E+00  0.1743070733648679E+00  0.1729735196933954E+00\n  0.1716524309919727E+00  0.1703436138532354E+00  0.1690468783443259E+00  0.1677620379628421E+00  0.1664889095927099E+00\n  0.1652273134600088E+00  0.1639770730887696E+00  0.1627380152567701E+00  0.1615099699513493E+00  0.1602927703252654E+00\n  0.1590862526526123E+00  0.1578902562848216E+00  0.1567046236067624E+00  0.1555291999929633E+00  0.1543638337639696E+00\n  0.1532083761428563E+00  0.1520626812119101E+00  0.1509266058694993E+00  0.1498000097871428E+00  0.1486827553667961E+00\n  0.1475747076983654E+00  0.1464757345174640E+00  0.1453857061634240E+00  0.1443044955375730E+00  0.1432319780617891E+00\n  0.1421680316373446E+00  0.1411125366040483E+00  0.1400653756996955E+00  0.1390264340198362E+00  0.1379955989778688E+00\n  0.1369727602654673E+00  0.1359578098133525E+00  0.1349506417524104E+00  0.1339511523751675E+00  0.1329592400976282E+00\n  0.1319748054214808E+00  0.1309977508966756E+00  0.1300279810843844E+00  0.1290654025203415E+00  0.1281099236785748E+00\n  0.1271614549355259E+00  0.1262199085345698E+00  0.1252851985509296E+00  0.1243572408569959E+00  0.1234359530880505E+00\n  0.1225212546083961E+00  0.1216130664778956E+00  0.1207113114189237E+00  0.1198159137837281E+00  0.1189267995222068E+00\n  0.1180438961500998E+00  0.1171671327175942E+00  0.1162964397783483E+00  0.1154317493589289E+00  0.1145729949286663E+00\n  0.1137201113699259E+00  0.1128730349487938E+00  0.1120317032861783E+00  0.1111960553293266E+00  0.1103660313237529E+00\n  0.1095415727855802E+00  0.1087226224742927E+00  0.1079091243658972E+00  0.1071010236264925E+00  0.1062982665862460E+00\n  0.1055008007137718E+00  0.1047085745909144E+00  0.1039215378879289E+00  0.1031396413390617E+00  0.1023628367185243E+00\n  0.1015910768168619E+00  0.1008243154177097E+00  0.1000625072749386E+00  0.9930560809018427E-01  0.9855357449075822E-01\n  0.9780636400793745E-01  0.9706393505562982E-01  0.9632624690941162E-01  0.9559325968593356E-01  0.9486493432269383E-01\n  0.9414123255817297E-01  0.9342211691232764E-01  0.9270755066744044E-01  0.9199749784932158E-01  0.9129192320885827E-01\n  0.9059079220391024E-01  0.8989407098154546E-01  0.8920172636061409E-01  0.8851372581465511E-01  0.8783003745513447E-01\n  0.8715063001500779E-01  0.8647547283260665E-01  0.8580453583584287E-01  0.8513778952672810E-01  0.8447520496620298E-01\n  0.8381675375927530E-01  0.8316240804045885E-01  0.8251214045951316E-01  0.8186592416747822E-01  0.8122373280299988E-01\n  0.8058554047894315E-01  0.7995132176928955E-01  0.7932105169631275E-01  0.7869470571803144E-01  0.7807225971593283E-01\n  0.7745368998296467E-01  0.7683897321179178E-01  0.7622808648331135E-01  0.7562100725542614E-01  0.7501771335206921E-01\n  0.7441818295247755E-01  0.7382239458071076E-01  0.7323032709541087E-01  0.7264195967979867E-01  0.7205727183190487E-01\n  0.7147624335502985E-01  0.7089885434843042E-01  0.7032508519822850E-01  0.6975491656853922E-01  0.6918832939281314E-01\n  0.6862530486539103E-01  0.6806582443326617E-01  0.6750986978805110E-01  0.6695742285814540E-01  0.6640846580110123E-01\n  0.6586298099618196E-01  0.6532095103711212E-01  0.6478235872501446E-01  0.6424718706153042E-01  0.6371541924212147E-01\n  0.6318703864954746E-01  0.6266202884751911E-01  0.6214037357452046E-01  0.6162205673779986E-01  0.6110706240752450E-01\n  0.6059537481109686E-01  0.6008697832762830E-01  0.5958185748256901E-01  0.5907999694248869E-01  0.5858138151000727E-01\n  0.5808599611887154E-01  0.5759382582917469E-01  0.5710485582271634E-01  0.5661907139850073E-01  0.5613645796836825E-01\n  0.5565700105276017E-01  0.5518068627661225E-01  0.5470749936537444E-01  0.5423742614115482E-01  0.5377045251898517E-01\n  0.5330656450320408E-01  0.5284574818395761E-01  0.5238798973381230E-01  0.5193327540447994E-01  0.5148159152365149E-01\n  0.5103292449193595E-01  0.5058726077990446E-01  0.5014458692523559E-01  0.4970488952995948E-01  0.4926815525779950E-01\n  0.4883437083160901E-01  0.4840352303089959E-01  0.4797559868946120E-01  0.4755058469306943E-01  0.4712846797727979E-01\n  0.4670923552530574E-01  0.4629287436597942E-01  0.4587937157179187E-01  0.4546871425701189E-01  0.4506088957588125E-01\n  0.4465588472088415E-01  0.4425368692108926E-01  0.4385428344056262E-01  0.4345766157684944E-01  0.4306380865952269E-01\n  0.4267271204879778E-01  0.4228435913421057E-01  0.4189873733335742E-01  0.4151583409069603E-01  0.4113563687640473E-01\n  0.4075813318529899E-01  0.4038331053580396E-01  0.4001115646898086E-01  0.3964165854760631E-01  0.3927480435530239E-01\n  0.3891058149571723E-01  0.3854897759175296E-01  0.3818998028484157E-01  0.3783357723426573E-01  0.3747975611652434E-01\n  0.3712850462474054E-01  0.3677981046811218E-01  0.3643366137140177E-01  0.3609004507446641E-01  0.3574894933182556E-01\n  0.3541036191226535E-01  0.3507427059847887E-01  0.3474066318674111E-01  0.3440952748661676E-01  0.3408085132070126E-01\n  0.3375462252439219E-01  0.3343082894569176E-01  0.3310945844503797E-01  0.3279049889516447E-01  0.3247393818098731E-01\n  0.3215976419951815E-01  0.3184796485980308E-01  0.3153852808288556E-01  0.3123144180179359E-01  0.3092669396154863E-01\n  0.3062427251919747E-01  0.3032416544386438E-01  0.3002636071682391E-01  0.2973084633159302E-01  0.2943761029404197E-01\n  0.2914664062252300E-01  0.2885792534801624E-01  0.2857145251429220E-01  0.2828721017808998E-01  0.2800518640931039E-01\n  0.2772536929122391E-01  0.2744774692069189E-01  0.2717230740840119E-01  0.2689903887911129E-01  0.2662792947191326E-01\n  0.2635896734050006E-01  0.2609214065344760E-01  0.2582743759450599E-01  0.2556484636290022E-01  0.2530435517364029E-01\n  0.2504595225783962E-01  0.2478962586304191E-01  0.2453536425355501E-01  0.2428315571079263E-01  0.2403298853362201E-01\n  0.2378485103871834E-01  0.2353873156092471E-01  0.2329461845361733E-01  0.2305250008907579E-01  0.2281236485885801E-01\n  0.2257420117417889E-01  0.2233799746629312E-01  0.2210374218688127E-01  0.2187142380843883E-01  0.2164103082466791E-01\n  0.2141255175087165E-01  0.2118597512435002E-01  0.2096128950479806E-01  0.2073848347470486E-01  0.2051754563975416E-01\n  0.2029846462922549E-01  0.2008122909639606E-01  0.1986582771894261E-01  0.1965224919934375E-01  0.1944048226528158E-01\n  0.1923051567004319E-01  0.1902233819292149E-01  0.1881593863961467E-01  0.1861130584262509E-01  0.1840842866165638E-01\n  0.1820729598400922E-01  0.1800789672497538E-01  0.1781021982822961E-01  0.1761425426621972E-01  0.1741998904055397E-01\n  0.1722741318238660E-01  0.1703651575280017E-01  0.1684728584318532E-01  0.1665971257561794E-01  0.1647378510323276E-01\n  0.1628949261059417E-01  0.1610682431406360E-01  0.1592576946216329E-01  0.1574631733593689E-01  0.1556845724930608E-01\n  0.1539217854942354E-01  0.1521747061702217E-01  0.1504432286676001E-01  0.1487272474756165E-01  0.1470266574295493E-01\n  0.1453413537140393E-01  0.1436712318663735E-01  0.1420161877797267E-01  0.1403761177063589E-01  0.1387509182607664E-01\n  0.1371404864227910E-01  0.1355447195406791E-01  0.1339635153340976E-01  0.1323967718971016E-01  0.1308443877010535E-01\n  0.1293062615974990E-01  0.1277822928209887E-01  0.1262723809918580E-01  0.1247764261189538E-01  0.1232943286023138E-01\n  0.1218259892357987E-01  0.1203713092096717E-01  0.1189301901131328E-01  0.1175025339368011E-01  0.1160882430751480E-01\n  0.1146872203288826E-01  0.1132993689072848E-01  0.1119245924304928E-01  0.1105627949317382E-01  0.1092138808595317E-01\n  0.1078777550798031E-01  0.1065543228779879E-01  0.1052434899610681E-01  0.1039451624595617E-01  0.1026592469294671E-01\n  0.1013856503541558E-01  0.1001242801462182E-01  0.9887504414926333E-02  0.9763785063966725E-02  0.9641260832827890E-02\n  0.9519922636207538E-02  0.9399761432577210E-02  0.9280768224338752E-02  0.9162934057976000E-02  0.9046250024202221E-02\n  0.8930707258102832E-02  0.8816296939273676E-02  0.8703010291955119E-02  0.8590838585161509E-02  0.8479773132806546E-02\n  0.8369805293824308E-02  0.8260926472285997E-02  0.8153128117512804E-02  0.8046401724184376E-02  0.7940738832443478E-02\n  0.7836131027996606E-02  0.7732569942210602E-02  0.7630047252205678E-02  0.7528554680944333E-02  0.7428083997316856E-02\n  0.7328627016223001E-02  0.7230175598650108E-02  0.7132721651747814E-02  0.7036257128899153E-02  0.6940774029788536E-02\n  0.6846264400466227E-02  0.6752720333409701E-02  0.6660133967581916E-02  0.6568497488486375E-02  0.6477803128219479E-02\n  0.6388043165519663E-02  0.6299209925814047E-02  0.6211295781262146E-02  0.6124293150797016E-02  0.6038194500163917E-02\n  0.5952992341956366E-02  0.5868679235650055E-02  0.5785247787634298E-02  0.5702690651241371E-02  0.5621000526773856E-02\n  0.5540170161529816E-02  0.5460192349826328E-02  0.5381059933021076E-02  0.5302765799532243E-02  0.5225302884857029E-02\n  0.5148664171588471E-02  0.5072842689431090E-02  0.4997831515215207E-02  0.4923623772910095E-02  0.4850212633636272E-02\n  0.4777591315676702E-02  0.4705753084487369E-02  0.4634691252707118E-02  0.4564399180166933E-02  0.4494870273898941E-02\n  0.4426097988144961E-02  0.4358075824365064E-02  0.4290797331245945E-02  0.4224256104709619E-02  0.4158445787922197E-02\n  0.4093360071303100E-02  0.4028992692534918E-02  0.3965337436573796E-02  0.3902388135660784E-02  0.3840138669334105E-02\n  0.3778582964442547E-02  0.3717714995160261E-02  0.3657528783002880E-02  0.3598018396845369E-02  0.3539177952941635E-02\n  0.3481001614946027E-02  0.3423483593937147E-02  0.3366618148443765E-02  0.3310399584473416E-02  0.3254822255543565E-02\n  0.3199880562715664E-02  0.3145568954632342E-02  0.3091881927557716E-02  0.3038814025421337E-02  0.2986359839865667E-02\n  0.2934514010297470E-02  0.2883271223943334E-02  0.2832626215909399E-02  0.2782573769245732E-02  0.2733108715015361E-02\n  0.2684225932368273E-02  0.2635920348620736E-02  0.2588186939339922E-02  0.2541020728434335E-02  0.2494416788250113E-02\n  0.2448370239673485E-02  0.2402876252239763E-02  0.2357930044248895E-02  0.2313526882888074E-02  0.2269662084361452E-02\n  0.2226331014027437E-02  0.2183529086543647E-02  0.2141251766019886E-02  0.2099494566179429E-02  0.2058253050528833E-02\n  0.2017522832536582E-02  0.1977299575820819E-02  0.1937578994346416E-02  0.1898356852631761E-02  0.1859628965965341E-02\n  0.1821391200632576E-02  0.1783639474153031E-02  0.1746369755528287E-02  0.1709578065500809E-02  0.1673260476823867E-02\n  0.1637413114542927E-02  0.1602032156288575E-02  0.1567113832581223E-02  0.1532654427147850E-02  0.1498650277250755E-02\n  0.1465097774028671E-02  0.1431993362850165E-02  0.1399333543679485E-02  0.1367114871454921E-02  0.1335333956479567E-02\n  0.1303987464824598E-02  0.1273072118744786E-02  0.1242584697106271E-02  0.1212522035826240E-02  0.1182881028324278E-02\n  0.1153658625985074E-02  0.1124851838631879E-02  0.1096457735010339E-02  0.1068473443281882E-02  0.1040896151525936E-02\n  0.1013723108250083E-02  0.9869516229069582E-03  0.9605790664167954E-03  0.9346028716940452E-03  0.9090205341765010E-03\n  0.8838296123550832E-03  0.8590277283020786E-03  0.8346125681955534E-03  0.8105818828371373E-03  0.7869334881601800E-03\n  0.7636652657249203E-03  0.7407751631967363E-03  0.7182611948033279E-03  0.6961214417659799E-03  0.6743540526996259E-03\n  0.6529572439758464E-03  0.6319293000421489E-03  0.6112685736903467E-03  0.5909734862658870E-03  0.5710425278092155E-03\n  0.5514742571193334E-03  0.5322673017285347E-03  0.5134203577763651E-03  0.4949321897694443E-03  0.4768016302125221E-03\n  0.4590275790946831E-03  0.4416090032129194E-03  0.4245449353136761E-03  0.4078344730309316E-03  0.3914767775974666E-03\n  0.3754710723036193E-03  0.3598166406754878E-03  0.3445128243419585E-03  0.3295590205570407E-03  0.3149546793411112E-03\n  0.3006993002013562E-03  0.2867924283882840E-03  0.2732336506415988E-03  0.2600225903747107E-03  0.2471589022432513E-03\n  0.2346422660385661E-03  0.2224723798427698E-03  0.2106489523774314E-03  0.1991716944731751E-03  0.1880403095829506E-03\n  0.1772544832569928E-03  0.1668138714930798E-03  0.1567180878715900E-03  0.1469666893810824E-03  0.1375591608372710E-03\n  0.1284948977961454E-03  0.1197731878613226E-03  0.1113931902866863E-03  0.1033539137784803E-03  0.9565419240704367E-04\n  0.8829265954769630E-04  0.8126771978413778E-04  0.7457751872672617E-04  0.6821991072362678E-04  0.6219242447627770E-04\n  0.5649222661344906E-04  0.5111608333233986E-04  0.4606032028242377E-04  0.4132078095054316E-04  0.3689278390632745E-04\n  0.3277107938782920E-04  0.2894980585093507E-04  0.2542244727468145E-04  0.2218179221009314E-04  0.1921989578338595E-04\n  0.1652804611495441E-04  0.1409673689099332E-04  0.1191564811913617E-04  0.9973637403230573E-05  0.8258744369264157E-05\n  0.6758211140689631E-05  0.5458521963065276E-05  0.4345465168603044E-05  0.3404220589992921E-05  0.2619475202729796E-05\n  0.1975569103509067E-05  0.1456672814492850E-05  0.1046995232007964E-05  0.7310192213004316E-06  0.4937588492987344E-06\n  0.3210285891032542E-06  0.1997107219284094E-06  0.1180030350752796E-06  0.6562550627018659E-07  0.3396305969110393E-07\n  0.1612304561662313E-07  0.6892228656363058E-08  0.2589636663001748E-08  0.8280887390551865E-09  0.2156614040605737E-09\n  0.4301139703498805E-10  0.6010118005039632E-11  0.5149083260942099E-12  0.2193180426472887E-13  0.3274661750280784E-15\n  0.9138109562588437E-18  0.1354704193168576E-21  0.5668023630192864E-28  0.1003507143230543E-40  0.5696705688614969E-79\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n 0.0000000000000000E+00  0.2350503764662797E-10  0.1452741565148498E-08  0.1598024605657181E-07  0.8670887247915710E-07\n  0.3194268290355064E-06  0.9210999532108705E-06  0.2243032243257230E-05  0.4826533736759059E-05  0.9449280963997414E-05\n  0.1717086310497067E-04  0.2937628005930804E-04  0.4781640004850213E-04  0.7464459701436190E-04  0.1124489746320072E-03\n  0.1642797466831127E-03  0.2336714851009560E-03  0.3246600692852489E-03  0.4417942752036344E-03  0.5901420321021944E-03\n  0.7752914499470295E-03  0.1003346783485080E-02  0.1280919550391384E-02  0.1615115062592291E-02  0.2013514662642524E-02\n  0.2484153982012019E-02  0.3035497556237696E-02  0.3676410143962806E-02  0.4416125103690986E-02  0.5264210184320288E-02\n  0.6230531083824742E-02  0.7325213125386473E-02  0.8558601392363368E-02  0.9941219653166928E-02  0.1148372839483666E-01\n  0.1319688227020127E-01  0.1509148724834461E-01  0.1717835774193908E-01  0.1946827396813322E-01  0.2197193978231332E-01\n  0.2469994120640449E-01  0.2766270585561205E-01  0.3087046344978465E-01  0.3433320757803945E-01  0.3806065886804223E-01\n  0.4206222969448004E-01  0.4634699054488188E-01  0.5092363814510472E-01  0.5580046543156136E-01  0.6098533344267084E-01\n  0.6648564518809444E-01  0.7230832154110638E-01  0.7845977918695805E-01  0.8494591064833676E-01  0.9177206639800155E-01\n  0.9894303905839608E-01  0.1064630496784886E+00  0.1143357360692630E+00  0.1225641431711653E+00  0.1311507154193881E+00\n  0.1400972910661206E+00  0.1494050984128002E+00  0.1590747538999337E+00  0.1691062619971989E+00  0.1794990168322592E+00\n  0.1902518054930074E+00  0.2013628129347618E+00  0.2128296284212524E+00  0.2246492534260200E+00  0.2368181109190946E+00\n  0.2493320559624748E+00  0.2621863875369867E+00  0.2753758615225286E+00  0.2888947047534727E+00  0.3027366300710904E+00\n  0.3168948522952475E+00  0.3313621050382702E+00  0.3461306582847914E+00  0.3611923366625136E+00  0.3765385383301647E+00\n  0.3921602544104397E+00  0.4080480888974157E+00  0.4241922789697600E+00  0.4405827156430124E+00  0.4572089646963136E+00\n  0.4740602878111100E+00  0.4911256638616449E+00  0.5083938102993529E+00  0.5258532045756759E+00  0.5434921055502246E+00\n  0.5612985748336912E+00  0.5792604980173683E+00  0.5973656057436424E+00  0.6156014945742982E+00  0.6339556476159732E+00\n  0.6524154548645443E+00  0.6709682332326954E+00  0.6896012462273114E+00  0.7083017232457365E+00  0.7270568784622643E+00\n  0.7458539292785299E+00  0.7646801143137046E+00  0.7835227109126022E+00  0.8023690521519213E+00  0.8212065433269309E+00\n  0.8400226779029110E+00  0.8588050529176166E+00  0.8775413838228915E+00  0.8962195187553934E+00  0.9148274522281129E+00\n  0.9333533382360560E+00  0.9517855027710543E+00  0.9701124557421923E+00  0.9883229022998167E+00  0.1006405753562465E+01\n  0.1024350136747383E+01  0.1042145404706545E+01  0.1059781144871260E+01  0.1077247187609600E+01  0.1094533614001869E+01\n  0.1111630763040373E+01  0.1128529238260637E+01  0.1145219913812065E+01  0.1161693939976847E+01  0.1177942748146633E+01\n  0.1193958055267189E+01  0.1209731867761823E+01  0.1225256484945006E+01  0.1240524501938026E+01  0.1255528812099049E+01\n  0.1270262608980346E+01  0.1284719387825761E+01  0.1298892946621899E+01  0.1312777386716678E+01  0.1326367113019209E+01\n  0.1339656833795096E+01  0.1352641560071424E+01  0.1365316604665792E+01  0.1377677580853886E+01  0.1389720400690019E+01\n  0.1401441272995214E+01  0.1412836701027270E+01  0.1423903479847286E+01  0.1434638693397013E+01  0.1445039711301291E+01\n  0.1455104185409776E+01  0.1464830046091919E+01  0.1474215498299109E+01  0.1483259017407622E+01  0.1491959344855860E+01\n  0.1500315483589179E+01  0.1508326693325296E+01  0.1515992485653126E+01  0.1523312618977543E+01  0.1530287093322397E+01\n  0.1536916145003750E+01  0.1543200241185077E+01  0.1549140074325868E+01  0.1554736556534737E+01  0.1559990813837915E+01\n  0.1564904180373601E+01  0.1569478192522416E+01  0.1573714582983838E+01  0.1577615274808202E+01  0.1581182375393509E+01\n  0.1584418170455991E+01  0.1587325117983052E+01  0.1589905842176854E+01  0.1592163127396545E+01  0.1594099912106772E+01\n  0.1595719282839819E+01  0.1597024468178396E+01  0.1598018832765788E+01  0.1598705871349761E+01  0.1599089202866354E+01\n  0.1599172564569312E+01  0.1598959806210704E+01  0.1598454884277914E+01  0.1597661856291940E+01  0.1596584875171653E+01\n  0.1595228183668366E+01  0.1593596108874842E+01  0.1591693056812536E+01  0.1589523507100701E+01  0.1587092007710641E+01\n  0.1584403169808198E+01  0.1581461662687349E+01  0.1578272208797470E+01  0.1574839578866685E+01  0.1571168587123450E+01\n  0.1567264086618331E+01  0.1563130964647693E+01  0.1558774138280876E+01  0.1554198549992189E+01  0.1549409163398889E+01\n  0.1544410959106127E+01  0.1539208930659677E+01  0.1533808080607080E+01  0.1528213416667707E+01  0.1522429948012042E+01\n  0.1516462681650386E+01  0.1510316618931021E+01  0.1503996752147732E+01  0.1497508061256460E+01  0.1490855510700755E+01\n  0.1484044046345540E+01  0.1477078592518635E+01  0.1469964049159342E+01  0.1462705289073315E+01  0.1455307155292826E+01\n  0.1447774458541496E+01  0.1440111974802394E+01  0.1432324442988392E+01  0.1424416562713602E+01  0.1416392992164560E+01\n  0.1408258346069873E+01  0.1400017193766902E+01  0.1391674057364033E+01  0.1383233409997026E+01  0.1374699674177898E+01\n  0.1366077220234727E+01  0.1357370364840755E+01  0.1348583369631108E+01  0.1339720439905439E+01  0.1330785723414737E+01\n  0.1321783309230582E+01  0.1312717226695031E+01  0.1303591444449351E+01  0.1294409869539786E+01  0.1285176346598528E+01\n  0.1275894657098056E+01  0.1266568518676988E+01  0.1257201584535619E+01  0.1247797442899263E+01  0.1238359616547584E+01\n  0.1228891562408019E+01  0.1219396671211496E+01  0.1209878267208578E+01  0.1200339607944202E+01  0.1190783884089205E+01\n  0.1181214219326823E+01  0.1171633670292365E+01  0.1162045226564264E+01  0.1152451810704780E+01  0.1142856278348570E+01\n  0.1133261418337408E+01  0.1123669952899346E+01  0.1114084537870646E+01  0.1104507762958775E+01  0.1094942152044870E+01\n  0.1085390163524009E+01  0.1075854190681740E+01  0.1066336562105254E+01  0.1056839542127690E+01  0.1047365331304049E+01\n  0.1037916066917227E+01  0.1028493823512701E+01  0.1019100613460447E+01  0.1009738387542688E+01  0.1000409035566070E+01\n  0.9911143869969610E+00  0.9818562116185301E+00  0.9726362202083267E+00  0.9634560652350970E+00  0.9543173415736288E+00\n  0.9452215872364120E+00  0.9361702841209427E+00  0.9271648587715566E+00  0.9182066831546644E+00  0.9092970754463097E+00\n  0.9004373008310244E+00  0.8916285723109384E+00  0.8828720515241635E+00  0.8741688495714935E+00  0.8655200278504954E+00\n  0.8569265988960664E+00  0.8483895272266132E+00  0.8399097301949807E+00  0.8314880788433289E+00  0.8231253987611650E+00\n  0.8148224709457564E+00  0.8065800326641964E+00  0.7983987783164219E+00  0.7902793602984723E+00  0.7822223898653531E+00\n  0.7742284379928720E+00  0.7662980362378170E+00  0.7584316775959118E+00  0.7506298173569868E+00  0.7428928739568187E+00\n  0.7352212298251275E+00  0.7276152322292518E+00  0.7200751941130188E+00  0.7126013949303633E+00  0.7051940814732806E+00\n  0.6978534686936988E+00  0.6905797405188852E+00  0.6833730506600221E+00  0.6762335234136188E+00  0.6691612544554096E+00\n  0.6621563116264519E+00  0.6552187357111161E+00  0.6483485412067125E+00  0.6415457170844840E+00  0.6348102275417313E+00\n  0.6281420127448483E+00  0.6215409895630656E+00  0.6150070522926947E+00  0.6085400733717113E+00  0.6021399040845107E+00\n  0.5958063752566826E+00  0.5895392979396676E+00  0.5833384640851877E+00  0.5772036472093250E+00  0.5711346030461549E+00\n  0.5651310701908592E+00  0.5591927707322315E+00  0.5533194108745153E+00  0.5475106815485299E+00  0.5417662590120353E+00\n  0.5360858054393003E+00  0.5304689694998603E+00  0.5249153869264497E+00  0.5194246810720941E+00  0.5139964634563777E+00\n  0.5086303343008993E+00  0.5033258830539155E+00  0.4980826889042317E+00  0.4929003212843441E+00  0.4877783403628898E+00\n  0.4827162975264554E+00  0.4777137358507827E+00  0.4727701905614446E+00  0.4678851894840552E+00  0.4630582534840750E+00\n  0.4582888968962981E+00  0.4535766279440972E+00  0.4489209491485098E+00  0.4443213577272558E+00  0.4397773459837845E+00\n  0.4352884016864413E+00  0.4308540084378585E+00  0.4264736460346724E+00  0.4221467908176804E+00  0.4178729160125361E+00\n  0.4136514920611062E+00  0.4094819869436024E+00  0.4053638664915989E+00  0.4012965946920645E+00  0.3972796339825281E+00\n  0.3933124455374964E+00  0.3893944895462572E+00  0.3855252254821869E+00  0.3817041123636960E+00  0.3779306090069412E+00\n  0.3742041742704262E+00  0.3705242672916375E+00  0.3668903477158274E+00  0.3633018759170965E+00  0.3597583132118892E+00\n  0.3562591220650529E+00  0.3528037662885790E+00  0.3493917112331675E+00  0.3460224239727477E+00  0.3426953734820877E+00\n  0.3394100308076194E+00  0.3361658692316251E+00  0.3329623644299036E+00  0.3297989946230563E+00  0.3266752407215223E+00\n  0.3235905864644950E+00  0.3205445185528428E+00  0.3175365267761750E+00  0.3145661041341699E+00  0.3116327469522978E+00\n  0.3087359549920661E+00  0.3058752315559112E+00  0.3030500835868565E+00  0.3002600217630693E+00  0.2975045605874296E+00\n  0.2947832184722352E+00  0.2920955178191660E+00  0.2894409850946181E+00  0.2868191509005325E+00  0.2842295500408273E+00\n  0.2816717215835535E+00  0.2791452089188812E+00  0.2766495598130334E+00  0.2741843264582723E+00  0.2717490655190478E+00\n  0.2693433381744174E+00  0.2669667101568407E+00  0.2646187517874495E+00  0.2622990380079024E+00  0.2600071484089175E+00\n  0.2577426672555859E+00  0.2555051835095635E+00  0.2532942908482358E+00  0.2511095876809479E+00  0.2489506771623981E+00\n  0.2468171672032794E+00  0.2447086704782614E+00  0.2426248044314016E+00  0.2405651912790701E+00  0.2385294580104723E+00\n  0.2365172363858518E+00  0.2345281629324596E+00  0.2325618789383613E+00  0.2306180304441682E+00  0.2286962682327625E+00\n  0.2267962478170977E+00  0.2249176294261405E+00  0.2230600779890333E+00  0.2212232631175415E+00  0.2194068590868594E+00\n  0.2176105448148379E+00  0.2158340038397009E+00  0.2140769242963177E+00  0.2123389988910903E+00  0.2106199248755169E+00\n  0.2089194040184958E+00  0.2072371425774233E+00  0.2055728512681448E+00  0.2039262452338156E+00  0.2022970440127238E+00\n  0.2006849715051299E+00  0.1990897559391716E+00  0.1975111298358903E+00  0.1959488299734197E+00  0.1944025973503926E+00\n  0.1928721771486053E+00  0.1913573186949898E+00  0.1898577754229339E+00  0.1883733048329959E+00  0.1869036684530497E+00\n  0.1854486317979078E+00  0.1840079643284546E+00  0.1825814394103312E+00  0.1811688342722097E+00  0.1797699299636905E+00\n  0.1783845113128567E+00  0.1770123668835237E+00  0.1756532889322104E+00  0.1743070733648679E+00  0.1729735196933954E+00\n  0.1716524309919727E+00  0.1703436138532354E+00  0.1690468783443259E+00  0.1677620379628421E+00  0.1664889095927099E+00\n  0.1652273134600088E+00  0.1639770730887696E+00  0.1627380152567701E+00  0.1615099699513493E+00  0.1602927703252654E+00\n  0.1590862526526123E+00  0.1578902562848216E+00  0.1567046236067624E+00  0.1555291999929633E+00  0.1543638337639696E+00\n  0.1532083761428563E+00  0.1520626812119101E+00  0.1509266058694993E+00  0.1498000097871428E+00  0.1486827553667961E+00\n  0.1475747076983654E+00  0.1464757345174640E+00  0.1453857061634240E+00  0.1443044955375730E+00  0.1432319780617891E+00\n  0.1421680316373446E+00  0.1411125366040483E+00  0.1400653756996955E+00  0.1390264340198362E+00  0.1379955989778688E+00\n  0.1369727602654673E+00  0.1359578098133525E+00  0.1349506417524104E+00  0.1339511523751675E+00  0.1329592400976282E+00\n  0.1319748054214808E+00  0.1309977508966756E+00  0.1300279810843844E+00  0.1290654025203415E+00  0.1281099236785748E+00\n  0.1271614549355259E+00  0.1262199085345698E+00  0.1252851985509296E+00  0.1243572408569959E+00  0.1234359530880505E+00\n  0.1225212546083961E+00  0.1216130664778956E+00  0.1207113114189237E+00  0.1198159137837281E+00  0.1189267995222068E+00\n  0.1180438961500998E+00  0.1171671327175942E+00  0.1162964397783483E+00  0.1154317493589289E+00  0.1145729949286663E+00\n  0.1137201113699259E+00  0.1128730349487938E+00  0.1120317032861783E+00  0.1111960553293266E+00  0.1103660313237529E+00\n  0.1095415727855802E+00  0.1087226224742927E+00  0.1079091243658972E+00  0.1071010236264925E+00  0.1062982665862460E+00\n  0.1055008007137718E+00  0.1047085745909144E+00  0.1039215378879289E+00  0.1031396413390617E+00  0.1023628367185243E+00\n  0.1015910768168619E+00  0.1008243154177097E+00  0.1000625072749386E+00  0.9930560809018427E-01  0.9855357449075822E-01\n  0.9780636400793745E-01  0.9706393505562982E-01  0.9632624690941162E-01  0.9559325968593356E-01  0.9486493432269383E-01\n  0.9414123255817297E-01  0.9342211691232764E-01  0.9270755066744044E-01  0.9199749784932158E-01  0.9129192320885827E-01\n  0.9059079220391024E-01  0.8989407098154546E-01  0.8920172636061409E-01  0.8851372581465511E-01  0.8783003745513447E-01\n  0.8715063001500779E-01  0.8647547283260665E-01  0.8580453583584287E-01  0.8513778952672810E-01  0.8447520496620298E-01\n  0.8381675375927530E-01  0.8316240804045885E-01  0.8251214045951316E-01  0.8186592416747822E-01  0.8122373280299988E-01\n  0.8058554047894315E-01  0.7995132176928955E-01  0.7932105169631275E-01  0.7869470571803144E-01  0.7807225971593283E-01\n  0.7745368998296467E-01  0.7683897321179178E-01  0.7622808648331135E-01  0.7562100725542614E-01  0.7501771335206921E-01\n  0.7441818295247755E-01  0.7382239458071076E-01  0.7323032709541087E-01  0.7264195967979867E-01  0.7205727183190487E-01\n  0.7147624335502985E-01  0.7089885434843042E-01  0.7032508519822850E-01  0.6975491656853922E-01  0.6918832939281314E-01\n  0.6862530486539103E-01  0.6806582443326617E-01  0.6750986978805110E-01  0.6695742285814540E-01  0.6640846580110123E-01\n  0.6586298099618196E-01  0.6532095103711212E-01  0.6478235872501446E-01  0.6424718706153042E-01  0.6371541924212147E-01\n  0.6318703864954746E-01  0.6266202884751911E-01  0.6214037357452046E-01  0.6162205673779986E-01  0.6110706240752450E-01\n  0.6059537481109686E-01  0.6008697832762830E-01  0.5958185748256901E-01  0.5907999694248869E-01  0.5858138151000727E-01\n  0.5808599611887154E-01  0.5759382582917469E-01  0.5710485582271634E-01  0.5661907139850073E-01  0.5613645796836825E-01\n  0.5565700105276017E-01  0.5518068627661225E-01  0.5470749936537444E-01  0.5423742614115482E-01  0.5377045251898517E-01\n  0.5330656450320408E-01  0.5284574818395761E-01  0.5238798973381230E-01  0.5193327540447994E-01  0.5148159152365149E-01\n  0.5103292449193595E-01  0.5058726077990446E-01  0.5014458692523559E-01  0.4970488952995948E-01  0.4926815525779950E-01\n  0.4883437083160901E-01  0.4840352303089959E-01  0.4797559868946120E-01  0.4755058469306943E-01  0.4712846797727979E-01\n  0.4670923552530574E-01  0.4629287436597942E-01  0.4587937157179187E-01  0.4546871425701189E-01  0.4506088957588125E-01\n  0.4465588472088415E-01  0.4425368692108926E-01  0.4385428344056262E-01  0.4345766157684944E-01  0.4306380865952269E-01\n  0.4267271204879778E-01  0.4228435913421057E-01  0.4189873733335742E-01  0.4151583409069603E-01  0.4113563687640473E-01\n  0.4075813318529899E-01  0.4038331053580396E-01  0.4001115646898086E-01  0.3964165854760631E-01  0.3927480435530239E-01\n  0.3891058149571723E-01  0.3854897759175296E-01  0.3818998028484157E-01  0.3783357723426573E-01  0.3747975611652434E-01\n  0.3712850462474054E-01  0.3677981046811218E-01  0.3643366137140177E-01  0.3609004507446641E-01  0.3574894933182556E-01\n  0.3541036191226535E-01  0.3507427059847887E-01  0.3474066318674111E-01  0.3440952748661676E-01  0.3408085132070126E-01\n  0.3375462252439219E-01  0.3343082894569176E-01  0.3310945844503797E-01  0.3279049889516447E-01  0.3247393818098731E-01\n  0.3215976419951815E-01  0.3184796485980308E-01  0.3153852808288556E-01  0.3123144180179359E-01  0.3092669396154863E-01\n  0.3062427251919747E-01  0.3032416544386438E-01  0.3002636071682391E-01  0.2973084633159302E-01  0.2943761029404197E-01\n  0.2914664062252300E-01  0.2885792534801624E-01  0.2857145251429220E-01  0.2828721017808998E-01  0.2800518640931039E-01\n  0.2772536929122391E-01  0.2744774692069189E-01  0.2717230740840119E-01  0.2689903887911129E-01  0.2662792947191326E-01\n  0.2635896734050006E-01  0.2609214065344760E-01  0.2582743759450599E-01  0.2556484636290022E-01  0.2530435517364029E-01\n  0.2504595225783962E-01  0.2478962586304191E-01  0.2453536425355501E-01  0.2428315571079263E-01  0.2403298853362201E-01\n  0.2378485103871834E-01  0.2353873156092471E-01  0.2329461845361733E-01  0.2305250008907579E-01  0.2281236485885801E-01\n  0.2257420117417889E-01  0.2233799746629312E-01  0.2210374218688127E-01  0.2187142380843883E-01  0.2164103082466791E-01\n  0.2141255175087165E-01  0.2118597512435002E-01  0.2096128950479806E-01  0.2073848347470486E-01  0.2051754563975416E-01\n  0.2029846462922549E-01  0.2008122909639606E-01  0.1986582771894261E-01  0.1965224919934375E-01  0.1944048226528158E-01\n  0.1923051567004319E-01  0.1902233819292149E-01  0.1881593863961467E-01  0.1861130584262509E-01  0.1840842866165638E-01\n  0.1820729598400922E-01  0.1800789672497538E-01  0.1781021982822961E-01  0.1761425426621972E-01  0.1741998904055397E-01\n  0.1722741318238660E-01  0.1703651575280017E-01  0.1684728584318532E-01  0.1665971257561794E-01  0.1647378510323276E-01\n  0.1628949261059417E-01  0.1610682431406360E-01  0.1592576946216329E-01  0.1574631733593689E-01  0.1556845724930608E-01\n  0.1539217854942354E-01  0.1521747061702217E-01  0.1504432286676001E-01  0.1487272474756165E-01  0.1470266574295493E-01\n  0.1453413537140393E-01  0.1436712318663735E-01  0.1420161877797267E-01  0.1403761177063589E-01  0.1387509182607664E-01\n  0.1371404864227910E-01  0.1355447195406791E-01  0.1339635153340976E-01  0.1323967718971016E-01  0.1308443877010535E-01\n  0.1293062615974990E-01  0.1277822928209887E-01  0.1262723809918580E-01  0.1247764261189538E-01  0.1232943286023138E-01\n  0.1218259892357987E-01  0.1203713092096717E-01  0.1189301901131328E-01  0.1175025339368011E-01  0.1160882430751480E-01\n  0.1146872203288826E-01  0.1132993689072848E-01  0.1119245924304928E-01  0.1105627949317382E-01  0.1092138808595317E-01\n  0.1078777550798031E-01  0.1065543228779879E-01  0.1052434899610681E-01  0.1039451624595617E-01  0.1026592469294671E-01\n  0.1013856503541558E-01  0.1001242801462182E-01  0.9887504414926333E-02  0.9763785063966725E-02  0.9641260832827890E-02\n  0.9519922636207538E-02  0.9399761432577210E-02  0.9280768224338752E-02  0.9162934057976000E-02  0.9046250024202221E-02\n  0.8930707258102832E-02  0.8816296939273676E-02  0.8703010291955119E-02  0.8590838585161509E-02  0.8479773132806546E-02\n  0.8369805293824308E-02  0.8260926472285997E-02  0.8153128117512804E-02  0.8046401724184376E-02  0.7940738832443478E-02\n  0.7836131027996606E-02  0.7732569942210602E-02  0.7630047252205678E-02  0.7528554680944333E-02  0.7428083997316856E-02\n  0.7328627016223001E-02  0.7230175598650108E-02  0.7132721651747814E-02  0.7036257128899153E-02  0.6940774029788536E-02\n  0.6846264400466227E-02  0.6752720333409701E-02  0.6660133967581916E-02  0.6568497488486375E-02  0.6477803128219479E-02\n  0.6388043165519663E-02  0.6299209925814047E-02  0.6211295781262146E-02  0.6124293150797016E-02  0.6038194500163917E-02\n  0.5952992341956366E-02  0.5868679235650055E-02  0.5785247787634298E-02  0.5702690651241371E-02  0.5621000526773856E-02\n  0.5540170161529816E-02  0.5460192349826328E-02  0.5381059933021076E-02  0.5302765799532243E-02  0.5225302884857029E-02\n  0.5148664171588471E-02  0.5072842689431090E-02  0.4997831515215207E-02  0.4923623772910095E-02  0.4850212633636272E-02\n  0.4777591315676702E-02  0.4705753084487369E-02  0.4634691252707118E-02  0.4564399180166933E-02  0.4494870273898941E-02\n  0.4426097988144961E-02  0.4358075824365064E-02  0.4290797331245945E-02  0.4224256104709619E-02  0.4158445787922197E-02\n  0.4093360071303100E-02  0.4028992692534918E-02  0.3965337436573796E-02  0.3902388135660784E-02  0.3840138669334105E-02\n  0.3778582964442547E-02  0.3717714995160261E-02  0.3657528783002880E-02  0.3598018396845369E-02  0.3539177952941635E-02\n  0.3481001614946027E-02  0.3423483593937147E-02  0.3366618148443765E-02  0.3310399584473416E-02  0.3254822255543565E-02\n  0.3199880562715664E-02  0.3145568954632342E-02  0.3091881927557716E-02  0.3038814025421337E-02  0.2986359839865667E-02\n  0.2934514010297470E-02  0.2883271223943334E-02  0.2832626215909399E-02  0.2782573769245732E-02  0.2733108715015361E-02\n  0.2684225932368273E-02  0.2635920348620736E-02  0.2588186939339922E-02  0.2541020728434335E-02  0.2494416788250113E-02\n  0.2448370239673485E-02  0.2402876252239763E-02  0.2357930044248895E-02  0.2313526882888074E-02  0.2269662084361452E-02\n  0.2226331014027437E-02  0.2183529086543647E-02  0.2141251766019886E-02  0.2099494566179429E-02  0.2058253050528833E-02\n  0.2017522832536582E-02  0.1977299575820819E-02  0.1937578994346416E-02  0.1898356852631761E-02  0.1859628965965341E-02\n  0.1821391200632576E-02  0.1783639474153031E-02  0.1746369755528287E-02  0.1709578065500809E-02  0.1673260476823867E-02\n  0.1637413114542927E-02  0.1602032156288575E-02  0.1567113832581223E-02  0.1532654427147850E-02  0.1498650277250755E-02\n  0.1465097774028671E-02  0.1431993362850165E-02  0.1399333543679485E-02  0.1367114871454921E-02  0.1335333956479567E-02\n  0.1303987464824598E-02  0.1273072118744786E-02  0.1242584697106271E-02  0.1212522035826240E-02  0.1182881028324278E-02\n  0.1153658625985074E-02  0.1124851838631879E-02  0.1096457735010339E-02  0.1068473443281882E-02  0.1040896151525936E-02\n  0.1013723108250083E-02  0.9869516229069582E-03  0.9605790664167954E-03  0.9346028716940452E-03  0.9090205341765010E-03\n  0.8838296123550832E-03  0.8590277283020786E-03  0.8346125681955534E-03  0.8105818828371373E-03  0.7869334881601800E-03\n  0.7636652657249203E-03  0.7407751631967363E-03  0.7182611948033279E-03  0.6961214417659799E-03  0.6743540526996259E-03\n  0.6529572439758464E-03  0.6319293000421489E-03  0.6112685736903467E-03  0.5909734862658870E-03  0.5710425278092155E-03\n  0.5514742571193334E-03  0.5322673017285347E-03  0.5134203577763651E-03  0.4949321897694443E-03  0.4768016302125221E-03\n  0.4590275790946831E-03  0.4416090032129194E-03  0.4245449353136761E-03  0.4078344730309316E-03  0.3914767775974666E-03\n  0.3754710723036193E-03  0.3598166406754878E-03  0.3445128243419585E-03  0.3295590205570407E-03  0.3149546793411112E-03\n  0.3006993002013562E-03  0.2867924283882840E-03  0.2732336506415988E-03  0.2600225903747107E-03  0.2471589022432513E-03\n  0.2346422660385661E-03  0.2224723798427698E-03  0.2106489523774314E-03  0.1991716944731751E-03  0.1880403095829506E-03\n  0.1772544832569928E-03  0.1668138714930798E-03  0.1567180878715900E-03  0.1469666893810824E-03  0.1375591608372710E-03\n  0.1284948977961454E-03  0.1197731878613226E-03  0.1113931902866863E-03  0.1033539137784803E-03  0.9565419240704367E-04\n  0.8829265954769630E-04  0.8126771978413778E-04  0.7457751872672617E-04  0.6821991072362678E-04  0.6219242447627770E-04\n  0.5649222661344906E-04  0.5111608333233986E-04  0.4606032028242377E-04  0.4132078095054316E-04  0.3689278390632745E-04\n  0.3277107938782920E-04  0.2894980585093507E-04  0.2542244727468145E-04  0.2218179221009314E-04  0.1921989578338595E-04\n  0.1652804611495441E-04  0.1409673689099332E-04  0.1191564811913617E-04  0.9973637403230573E-05  0.8258744369264157E-05\n  0.6758211140689631E-05  0.5458521963065276E-05  0.4345465168603044E-05  0.3404220589992921E-05  0.2619475202729796E-05\n  0.1975569103509067E-05  0.1456672814492850E-05  0.1046995232007964E-05  0.7310192213004316E-06  0.4937588492987344E-06\n  0.3210285891032542E-06  0.1997107219284094E-06  0.1180030350752796E-06  0.6562550627018659E-07  0.3396305969110393E-07\n  0.1612304561662313E-07  0.6892228656363058E-08  0.2589636663001748E-08  0.8280887390551865E-09  0.2156614040605737E-09\n  0.4301139703498805E-10  0.6010118005039632E-11  0.5149083260942099E-12  0.2193180426472887E-13  0.3274661750280784E-15\n  0.9138109562588437E-18  0.1354704193168576E-21  0.5668023630192864E-28  0.1003507143230543E-40  0.5696705688614969E-79\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n 0.0000000000000000E+00  0.2350503764662797E-10  0.1452741565148498E-08  0.1598024605657181E-07  0.8670887247915710E-07\n  0.3194268290355064E-06  0.9210999532108705E-06  0.2243032243257230E-05  0.4826533736759059E-05  0.9449280963997414E-05\n  0.1717086310497067E-04  0.2937628005930804E-04  0.4781640004850213E-04  0.7464459701436190E-04  0.1124489746320072E-03\n  0.1642797466831127E-03  0.2336714851009560E-03  0.3246600692852489E-03  0.4417942752036344E-03  0.5901420321021944E-03\n  0.7752914499470295E-03  0.1003346783485080E-02  0.1280919550391384E-02  0.1615115062592291E-02  0.2013514662642524E-02\n  0.2484153982012019E-02  0.3035497556237696E-02  0.3676410143962806E-02  0.4416125103690986E-02  0.5264210184320288E-02\n  0.6230531083824742E-02  0.7325213125386473E-02  0.8558601392363368E-02  0.9941219653166928E-02  0.1148372839483666E-01\n  0.1319688227020127E-01  0.1509148724834461E-01  0.1717835774193908E-01  0.1946827396813322E-01  0.2197193978231332E-01\n  0.2469994120640449E-01  0.2766270585561205E-01  0.3087046344978465E-01  0.3433320757803945E-01  0.3806065886804223E-01\n  0.4206222969448004E-01  0.4634699054488188E-01  0.5092363814510472E-01  0.5580046543156136E-01  0.6098533344267084E-01\n  0.6648564518809444E-01  0.7230832154110638E-01  0.7845977918695805E-01  0.8494591064833676E-01  0.9177206639800155E-01\n  0.9894303905839608E-01  0.1064630496784886E+00  0.1143357360692630E+00  0.1225641431711653E+00  0.1311507154193881E+00\n  0.1400972910661206E+00  0.1494050984128002E+00  0.1590747538999337E+00  0.1691062619971989E+00  0.1794990168322592E+00\n  0.1902518054930074E+00  0.2013628129347618E+00  0.2128296284212524E+00  0.2246492534260200E+00  0.2368181109190946E+00\n  0.2493320559624748E+00  0.2621863875369867E+00  0.2753758615225286E+00  0.2888947047534727E+00  0.3027366300710904E+00\n  0.3168948522952475E+00  0.3313621050382702E+00  0.3461306582847914E+00  0.3611923366625136E+00  0.3765385383301647E+00\n  0.3921602544104397E+00  0.4080480888974157E+00  0.4241922789697600E+00  0.4405827156430124E+00  0.4572089646963136E+00\n  0.4740602878111100E+00  0.4911256638616449E+00  0.5083938102993529E+00  0.5258532045756759E+00  0.5434921055502246E+00\n  0.5612985748336912E+00  0.5792604980173683E+00  0.5973656057436424E+00  0.6156014945742982E+00  0.6339556476159732E+00\n  0.6524154548645443E+00  0.6709682332326954E+00  0.6896012462273114E+00  0.7083017232457365E+00  0.7270568784622643E+00\n  0.7458539292785299E+00  0.7646801143137046E+00  0.7835227109126022E+00  0.8023690521519213E+00  0.8212065433269309E+00\n  0.8400226779029110E+00  0.8588050529176166E+00  0.8775413838228915E+00  0.8962195187553934E+00  0.9148274522281129E+00\n  0.9333533382360560E+00  0.9517855027710543E+00  0.9701124557421923E+00  0.9883229022998167E+00  0.1006405753562465E+01\n  0.1024350136747383E+01  0.1042145404706545E+01  0.1059781144871260E+01  0.1077247187609600E+01  0.1094533614001869E+01\n  0.1111630763040373E+01  0.1128529238260637E+01  0.1145219913812065E+01  0.1161693939976847E+01  0.1177942748146633E+01\n  0.1193958055267189E+01  0.1209731867761823E+01  0.1225256484945006E+01  0.1240524501938026E+01  0.1255528812099049E+01\n  0.1270262608980346E+01  0.1284719387825761E+01  0.1298892946621899E+01  0.1312777386716678E+01  0.1326367113019209E+01\n  0.1339656833795096E+01  0.1352641560071424E+01  0.1365316604665792E+01  0.1377677580853886E+01  0.1389720400690019E+01\n  0.1401441272995214E+01  0.1412836701027270E+01  0.1423903479847286E+01  0.1434638693397013E+01  0.1445039711301291E+01\n  0.1455104185409776E+01  0.1464830046091919E+01  0.1474215498299109E+01  0.1483259017407622E+01  0.1491959344855860E+01\n  0.1500315483589179E+01  0.1508326693325296E+01  0.1515992485653126E+01  0.1523312618977543E+01  0.1530287093322397E+01\n  0.1536916145003750E+01  0.1543200241185077E+01  0.1549140074325868E+01  0.1554736556534737E+01  0.1559990813837915E+01\n  0.1564904180373601E+01  0.1569478192522416E+01  0.1573714582983838E+01  0.1577615274808202E+01  0.1581182375393509E+01\n  0.1584418170455991E+01  0.1587325117983052E+01  0.1589905842176854E+01  0.1592163127396545E+01  0.1594099912106772E+01\n  0.1595719282839819E+01  0.1597024468178396E+01  0.1598018832765788E+01  0.1598705871349761E+01  0.1599089202866354E+01\n  0.1599172564569312E+01  0.1598959806210704E+01  0.1598454884277914E+01  0.1597661856291940E+01  0.1596584875171653E+01\n  0.1595228183668366E+01  0.1593596108874842E+01  0.1591693056812536E+01  0.1589523507100701E+01  0.1587092007710641E+01\n  0.1584403169808198E+01  0.1581461662687349E+01  0.1578272208797470E+01  0.1574839578866685E+01  0.1571168587123450E+01\n  0.1567264086618331E+01  0.1563130964647693E+01  0.1558774138280876E+01  0.1554198549992189E+01  0.1549409163398889E+01\n  0.1544410959106127E+01  0.1539208930659677E+01  0.1533808080607080E+01  0.1528213416667707E+01  0.1522429948012042E+01\n  0.1516462681650386E+01  0.1510316618931021E+01  0.1503996752147732E+01  0.1497508061256460E+01  0.1490855510700755E+01\n  0.1484044046345540E+01  0.1477078592518635E+01  0.1469964049159342E+01  0.1462705289073315E+01  0.1455307155292826E+01\n  0.1447774458541496E+01  0.1440111974802394E+01  0.1432324442988392E+01  0.1424416562713602E+01  0.1416392992164560E+01\n  0.1408258346069873E+01  0.1400017193766902E+01  0.1391674057364033E+01  0.1383233409997026E+01  0.1374699674177898E+01\n  0.1366077220234727E+01  0.1357370364840755E+01  0.1348583369631108E+01  0.1339720439905439E+01  0.1330785723414737E+01\n  0.1321783309230582E+01  0.1312717226695031E+01  0.1303591444449351E+01  0.1294409869539786E+01  0.1285176346598528E+01\n  0.1275894657098056E+01  0.1266568518676988E+01  0.1257201584535619E+01  0.1247797442899263E+01  0.1238359616547584E+01\n  0.1228891562408019E+01  0.1219396671211496E+01  0.1209878267208578E+01  0.1200339607944202E+01  0.1190783884089205E+01\n  0.1181214219326823E+01  0.1171633670292365E+01  0.1162045226564264E+01  0.1152451810704780E+01  0.1142856278348570E+01\n  0.1133261418337408E+01  0.1123669952899346E+01  0.1114084537870646E+01  0.1104507762958775E+01  0.1094942152044870E+01\n  0.1085390163524009E+01  0.1075854190681740E+01  0.1066336562105254E+01  0.1056839542127690E+01  0.1047365331304049E+01\n  0.1037916066917227E+01  0.1028493823512701E+01  0.1019100613460447E+01  0.1009738387542688E+01  0.1000409035566070E+01\n  0.9911143869969610E+00  0.9818562116185301E+00  0.9726362202083267E+00  0.9634560652350970E+00  0.9543173415736288E+00\n  0.9452215872364120E+00  0.9361702841209427E+00  0.9271648587715566E+00  0.9182066831546644E+00  0.9092970754463097E+00\n  0.9004373008310244E+00  0.8916285723109384E+00  0.8828720515241635E+00  0.8741688495714935E+00  0.8655200278504954E+00\n  0.8569265988960664E+00  0.8483895272266132E+00  0.8399097301949807E+00  0.8314880788433289E+00  0.8231253987611650E+00\n  0.8148224709457564E+00  0.8065800326641964E+00  0.7983987783164219E+00  0.7902793602984723E+00  0.7822223898653531E+00\n  0.7742284379928720E+00  0.7662980362378170E+00  0.7584316775959118E+00  0.7506298173569868E+00  0.7428928739568187E+00\n  0.7352212298251275E+00  0.7276152322292518E+00  0.7200751941130188E+00  0.7126013949303633E+00  0.7051940814732806E+00\n  0.6978534686936988E+00  0.6905797405188852E+00  0.6833730506600221E+00  0.6762335234136188E+00  0.6691612544554096E+00\n  0.6621563116264519E+00  0.6552187357111161E+00  0.6483485412067125E+00  0.6415457170844840E+00  0.6348102275417313E+00\n  0.6281420127448483E+00  0.6215409895630656E+00  0.6150070522926947E+00  0.6085400733717113E+00  0.6021399040845107E+00\n  0.5958063752566826E+00  0.5895392979396676E+00  0.5833384640851877E+00  0.5772036472093250E+00  0.5711346030461549E+00\n  0.5651310701908592E+00  0.5591927707322315E+00  0.5533194108745153E+00  0.5475106815485299E+00  0.5417662590120353E+00\n  0.5360858054393003E+00  0.5304689694998603E+00  0.5249153869264497E+00  0.5194246810720941E+00  0.5139964634563777E+00\n  0.5086303343008993E+00  0.5033258830539155E+00  0.4980826889042317E+00  0.4929003212843441E+00  0.4877783403628898E+00\n  0.4827162975264554E+00  0.4777137358507827E+00  0.4727701905614446E+00  0.4678851894840552E+00  0.4630582534840750E+00\n  0.4582888968962981E+00  0.4535766279440972E+00  0.4489209491485098E+00  0.4443213577272558E+00  0.4397773459837845E+00\n  0.4352884016864413E+00  0.4308540084378585E+00  0.4264736460346724E+00  0.4221467908176804E+00  0.4178729160125361E+00\n  0.4136514920611062E+00  0.4094819869436024E+00  0.4053638664915989E+00  0.4012965946920645E+00  0.3972796339825281E+00\n  0.3933124455374964E+00  0.3893944895462572E+00  0.3855252254821869E+00  0.3817041123636960E+00  0.3779306090069412E+00\n  0.3742041742704262E+00  0.3705242672916375E+00  0.3668903477158274E+00  0.3633018759170965E+00  0.3597583132118892E+00\n  0.3562591220650529E+00  0.3528037662885790E+00  0.3493917112331675E+00  0.3460224239727477E+00  0.3426953734820877E+00\n  0.3394100308076194E+00  0.3361658692316251E+00  0.3329623644299036E+00  0.3297989946230563E+00  0.3266752407215223E+00\n  0.3235905864644950E+00  0.3205445185528428E+00  0.3175365267761750E+00  0.3145661041341699E+00  0.3116327469522978E+00\n  0.3087359549920661E+00  0.3058752315559112E+00  0.3030500835868565E+00  0.3002600217630693E+00  0.2975045605874296E+00\n  0.2947832184722352E+00  0.2920955178191660E+00  0.2894409850946181E+00  0.2868191509005325E+00  0.2842295500408273E+00\n  0.2816717215835535E+00  0.2791452089188812E+00  0.2766495598130334E+00  0.2741843264582723E+00  0.2717490655190478E+00\n  0.2693433381744174E+00  0.2669667101568407E+00  0.2646187517874495E+00  0.2622990380079024E+00  0.2600071484089175E+00\n  0.2577426672555859E+00  0.2555051835095635E+00  0.2532942908482358E+00  0.2511095876809479E+00  0.2489506771623981E+00\n  0.2468171672032794E+00  0.2447086704782614E+00  0.2426248044314016E+00  0.2405651912790701E+00  0.2385294580104723E+00\n  0.2365172363858518E+00  0.2345281629324596E+00  0.2325618789383613E+00  0.2306180304441682E+00  0.2286962682327625E+00\n  0.2267962478170977E+00  0.2249176294261405E+00  0.2230600779890333E+00  0.2212232631175415E+00  0.2194068590868594E+00\n  0.2176105448148379E+00  0.2158340038397009E+00  0.2140769242963177E+00  0.2123389988910903E+00  0.2106199248755169E+00\n  0.2089194040184958E+00  0.2072371425774233E+00  0.2055728512681448E+00  0.2039262452338156E+00  0.2022970440127238E+00\n  0.2006849715051299E+00  0.1990897559391716E+00  0.1975111298358903E+00  0.1959488299734197E+00  0.1944025973503926E+00\n  0.1928721771486053E+00  0.1913573186949898E+00  0.1898577754229339E+00  0.1883733048329959E+00  0.1869036684530497E+00\n  0.1854486317979078E+00  0.1840079643284546E+00  0.1825814394103312E+00  0.1811688342722097E+00  0.1797699299636905E+00\n  0.1783845113128567E+00  0.1770123668835237E+00  0.1756532889322104E+00  0.1743070733648679E+00  0.1729735196933954E+00\n  0.1716524309919727E+00  0.1703436138532354E+00  0.1690468783443259E+00  0.1677620379628421E+00  0.1664889095927099E+00\n  0.1652273134600088E+00  0.1639770730887696E+00  0.1627380152567701E+00  0.1615099699513493E+00  0.1602927703252654E+00\n  0.1590862526526123E+00  0.1578902562848216E+00  0.1567046236067624E+00  0.1555291999929633E+00  0.1543638337639696E+00\n  0.1532083761428563E+00  0.1520626812119101E+00  0.1509266058694993E+00  0.1498000097871428E+00  0.1486827553667961E+00\n  0.1475747076983654E+00  0.1464757345174640E+00  0.1453857061634240E+00  0.1443044955375730E+00  0.1432319780617891E+00\n  0.1421680316373446E+00  0.1411125366040483E+00  0.1400653756996955E+00  0.1390264340198362E+00  0.1379955989778688E+00\n  0.1369727602654673E+00  0.1359578098133525E+00  0.1349506417524104E+00  0.1339511523751675E+00  0.1329592400976282E+00\n  0.1319748054214808E+00  0.1309977508966756E+00  0.1300279810843844E+00  0.1290654025203415E+00  0.1281099236785748E+00\n  0.1271614549355259E+00  0.1262199085345698E+00  0.1252851985509296E+00  0.1243572408569959E+00  0.1234359530880505E+00\n  0.1225212546083961E+00  0.1216130664778956E+00  0.1207113114189237E+00  0.1198159137837281E+00  0.1189267995222068E+00\n  0.1180438961500998E+00  0.1171671327175942E+00  0.1162964397783483E+00  0.1154317493589289E+00  0.1145729949286663E+00\n  0.1137201113699259E+00  0.1128730349487938E+00  0.1120317032861783E+00  0.1111960553293266E+00  0.1103660313237529E+00\n  0.1095415727855802E+00  0.1087226224742927E+00  0.1079091243658972E+00  0.1071010236264925E+00  0.1062982665862460E+00\n  0.1055008007137718E+00  0.1047085745909144E+00  0.1039215378879289E+00  0.1031396413390617E+00  0.1023628367185243E+00\n  0.1015910768168619E+00  0.1008243154177097E+00  0.1000625072749386E+00  0.9930560809018427E-01  0.9855357449075822E-01\n  0.9780636400793745E-01  0.9706393505562982E-01  0.9632624690941162E-01  0.9559325968593356E-01  0.9486493432269383E-01\n  0.9414123255817297E-01  0.9342211691232764E-01  0.9270755066744044E-01  0.9199749784932158E-01  0.9129192320885827E-01\n  0.9059079220391024E-01  0.8989407098154546E-01  0.8920172636061409E-01  0.8851372581465511E-01  0.8783003745513447E-01\n  0.8715063001500779E-01  0.8647547283260665E-01  0.8580453583584287E-01  0.8513778952672810E-01  0.8447520496620298E-01\n  0.8381675375927530E-01  0.8316240804045885E-01  0.8251214045951316E-01  0.8186592416747822E-01  0.8122373280299988E-01\n  0.8058554047894315E-01  0.7995132176928955E-01  0.7932105169631275E-01  0.7869470571803144E-01  0.7807225971593283E-01\n  0.7745368998296467E-01  0.7683897321179178E-01  0.7622808648331135E-01  0.7562100725542614E-01  0.7501771335206921E-01\n  0.7441818295247755E-01  0.7382239458071076E-01  0.7323032709541087E-01  0.7264195967979867E-01  0.7205727183190487E-01\n  0.7147624335502985E-01  0.7089885434843042E-01  0.7032508519822850E-01  0.6975491656853922E-01  0.6918832939281314E-01\n  0.6862530486539103E-01  0.6806582443326617E-01  0.6750986978805110E-01  0.6695742285814540E-01  0.6640846580110123E-01\n  0.6586298099618196E-01  0.6532095103711212E-01  0.6478235872501446E-01  0.6424718706153042E-01  0.6371541924212147E-01\n  0.6318703864954746E-01  0.6266202884751911E-01  0.6214037357452046E-01  0.6162205673779986E-01  0.6110706240752450E-01\n  0.6059537481109686E-01  0.6008697832762830E-01  0.5958185748256901E-01  0.5907999694248869E-01  0.5858138151000727E-01\n  0.5808599611887154E-01  0.5759382582917469E-01  0.5710485582271634E-01  0.5661907139850073E-01  0.5613645796836825E-01\n  0.5565700105276017E-01  0.5518068627661225E-01  0.5470749936537444E-01  0.5423742614115482E-01  0.5377045251898517E-01\n  0.5330656450320408E-01  0.5284574818395761E-01  0.5238798973381230E-01  0.5193327540447994E-01  0.5148159152365149E-01\n  0.5103292449193595E-01  0.5058726077990446E-01  0.5014458692523559E-01  0.4970488952995948E-01  0.4926815525779950E-01\n  0.4883437083160901E-01  0.4840352303089959E-01  0.4797559868946120E-01  0.4755058469306943E-01  0.4712846797727979E-01\n  0.4670923552530574E-01  0.4629287436597942E-01  0.4587937157179187E-01  0.4546871425701189E-01  0.4506088957588125E-01\n  0.4465588472088415E-01  0.4425368692108926E-01  0.4385428344056262E-01  0.4345766157684944E-01  0.4306380865952269E-01\n  0.4267271204879778E-01  0.4228435913421057E-01  0.4189873733335742E-01  0.4151583409069603E-01  0.4113563687640473E-01\n  0.4075813318529899E-01  0.4038331053580396E-01  0.4001115646898086E-01  0.3964165854760631E-01  0.3927480435530239E-01\n  0.3891058149571723E-01  0.3854897759175296E-01  0.3818998028484157E-01  0.3783357723426573E-01  0.3747975611652434E-01\n  0.3712850462474054E-01  0.3677981046811218E-01  0.3643366137140177E-01  0.3609004507446641E-01  0.3574894933182556E-01\n  0.3541036191226535E-01  0.3507427059847887E-01  0.3474066318674111E-01  0.3440952748661676E-01  0.3408085132070126E-01\n  0.3375462252439219E-01  0.3343082894569176E-01  0.3310945844503797E-01  0.3279049889516447E-01  0.3247393818098731E-01\n  0.3215976419951815E-01  0.3184796485980308E-01  0.3153852808288556E-01  0.3123144180179359E-01  0.3092669396154863E-01\n  0.3062427251919747E-01  0.3032416544386438E-01  0.3002636071682391E-01  0.2973084633159302E-01  0.2943761029404197E-01\n  0.2914664062252300E-01  0.2885792534801624E-01  0.2857145251429220E-01  0.2828721017808998E-01  0.2800518640931039E-01\n  0.2772536929122391E-01  0.2744774692069189E-01  0.2717230740840119E-01  0.2689903887911129E-01  0.2662792947191326E-01\n  0.2635896734050006E-01  0.2609214065344760E-01  0.2582743759450599E-01  0.2556484636290022E-01  0.2530435517364029E-01\n  0.2504595225783962E-01  0.2478962586304191E-01  0.2453536425355501E-01  0.2428315571079263E-01  0.2403298853362201E-01\n  0.2378485103871834E-01  0.2353873156092471E-01  0.2329461845361733E-01  0.2305250008907579E-01  0.2281236485885801E-01\n  0.2257420117417889E-01  0.2233799746629312E-01  0.2210374218688127E-01  0.2187142380843883E-01  0.2164103082466791E-01\n  0.2141255175087165E-01  0.2118597512435002E-01  0.2096128950479806E-01  0.2073848347470486E-01  0.2051754563975416E-01\n  0.2029846462922549E-01  0.2008122909639606E-01  0.1986582771894261E-01  0.1965224919934375E-01  0.1944048226528158E-01\n  0.1923051567004319E-01  0.1902233819292149E-01  0.1881593863961467E-01  0.1861130584262509E-01  0.1840842866165638E-01\n  0.1820729598400922E-01  0.1800789672497538E-01  0.1781021982822961E-01  0.1761425426621972E-01  0.1741998904055397E-01\n  0.1722741318238660E-01  0.1703651575280017E-01  0.1684728584318532E-01  0.1665971257561794E-01  0.1647378510323276E-01\n  0.1628949261059417E-01  0.1610682431406360E-01  0.1592576946216329E-01  0.1574631733593689E-01  0.1556845724930608E-01\n  0.1539217854942354E-01  0.1521747061702217E-01  0.1504432286676001E-01  0.1487272474756165E-01  0.1470266574295493E-01\n  0.1453413537140393E-01  0.1436712318663735E-01  0.1420161877797267E-01  0.1403761177063589E-01  0.1387509182607664E-01\n  0.1371404864227910E-01  0.1355447195406791E-01  0.1339635153340976E-01  0.1323967718971016E-01  0.1308443877010535E-01\n  0.1293062615974990E-01  0.1277822928209887E-01  0.1262723809918580E-01  0.1247764261189538E-01  0.1232943286023138E-01\n  0.1218259892357987E-01  0.1203713092096717E-01  0.1189301901131328E-01  0.1175025339368011E-01  0.1160882430751480E-01\n  0.1146872203288826E-01  0.1132993689072848E-01  0.1119245924304928E-01  0.1105627949317382E-01  0.1092138808595317E-01\n  0.1078777550798031E-01  0.1065543228779879E-01  0.1052434899610681E-01  0.1039451624595617E-01  0.1026592469294671E-01\n  0.1013856503541558E-01  0.1001242801462182E-01  0.9887504414926333E-02  0.9763785063966725E-02  0.9641260832827890E-02\n  0.9519922636207538E-02  0.9399761432577210E-02  0.9280768224338752E-02  0.9162934057976000E-02  0.9046250024202221E-02\n  0.8930707258102832E-02  0.8816296939273676E-02  0.8703010291955119E-02  0.8590838585161509E-02  0.8479773132806546E-02\n  0.8369805293824308E-02  0.8260926472285997E-02  0.8153128117512804E-02  0.8046401724184376E-02  0.7940738832443478E-02\n  0.7836131027996606E-02  0.7732569942210602E-02  0.7630047252205678E-02  0.7528554680944333E-02  0.7428083997316856E-02\n  0.7328627016223001E-02  0.7230175598650108E-02  0.7132721651747814E-02  0.7036257128899153E-02  0.6940774029788536E-02\n  0.6846264400466227E-02  0.6752720333409701E-02  0.6660133967581916E-02  0.6568497488486375E-02  0.6477803128219479E-02\n  0.6388043165519663E-02  0.6299209925814047E-02  0.6211295781262146E-02  0.6124293150797016E-02  0.6038194500163917E-02\n  0.5952992341956366E-02  0.5868679235650055E-02  0.5785247787634298E-02  0.5702690651241371E-02  0.5621000526773856E-02\n  0.5540170161529816E-02  0.5460192349826328E-02  0.5381059933021076E-02  0.5302765799532243E-02  0.5225302884857029E-02\n  0.5148664171588471E-02  0.5072842689431090E-02  0.4997831515215207E-02  0.4923623772910095E-02  0.4850212633636272E-02\n  0.4777591315676702E-02  0.4705753084487369E-02  0.4634691252707118E-02  0.4564399180166933E-02  0.4494870273898941E-02\n  0.4426097988144961E-02  0.4358075824365064E-02  0.4290797331245945E-02  0.4224256104709619E-02  0.4158445787922197E-02\n  0.4093360071303100E-02  0.4028992692534918E-02  0.3965337436573796E-02  0.3902388135660784E-02  0.3840138669334105E-02\n  0.3778582964442547E-02  0.3717714995160261E-02  0.3657528783002880E-02  0.3598018396845369E-02  0.3539177952941635E-02\n  0.3481001614946027E-02  0.3423483593937147E-02  0.3366618148443765E-02  0.3310399584473416E-02  0.3254822255543565E-02\n  0.3199880562715664E-02  0.3145568954632342E-02  0.3091881927557716E-02  0.3038814025421337E-02  0.2986359839865667E-02\n  0.2934514010297470E-02  0.2883271223943334E-02  0.2832626215909399E-02  0.2782573769245732E-02  0.2733108715015361E-02\n  0.2684225932368273E-02  0.2635920348620736E-02  0.2588186939339922E-02  0.2541020728434335E-02  0.2494416788250113E-02\n  0.2448370239673485E-02  0.2402876252239763E-02  0.2357930044248895E-02  0.2313526882888074E-02  0.2269662084361452E-02\n  0.2226331014027437E-02  0.2183529086543647E-02  0.2141251766019886E-02  0.2099494566179429E-02  0.2058253050528833E-02\n  0.2017522832536582E-02  0.1977299575820819E-02  0.1937578994346416E-02  0.1898356852631761E-02  0.1859628965965341E-02\n  0.1821391200632576E-02  0.1783639474153031E-02  0.1746369755528287E-02  0.1709578065500809E-02  0.1673260476823867E-02\n  0.1637413114542927E-02  0.1602032156288575E-02  0.1567113832581223E-02  0.1532654427147850E-02  0.1498650277250755E-02\n  0.1465097774028671E-02  0.1431993362850165E-02  0.1399333543679485E-02  0.1367114871454921E-02  0.1335333956479567E-02\n  0.1303987464824598E-02  0.1273072118744786E-02  0.1242584697106271E-02  0.1212522035826240E-02  0.1182881028324278E-02\n  0.1153658625985074E-02  0.1124851838631879E-02  0.1096457735010339E-02  0.1068473443281882E-02  0.1040896151525936E-02\n  0.1013723108250083E-02  0.9869516229069582E-03  0.9605790664167954E-03  0.9346028716940452E-03  0.9090205341765010E-03\n  0.8838296123550832E-03  0.8590277283020786E-03  0.8346125681955534E-03  0.8105818828371373E-03  0.7869334881601800E-03\n  0.7636652657249203E-03  0.7407751631967363E-03  0.7182611948033279E-03  0.6961214417659799E-03  0.6743540526996259E-03\n  0.6529572439758464E-03  0.6319293000421489E-03  0.6112685736903467E-03  0.5909734862658870E-03  0.5710425278092155E-03\n  0.5514742571193334E-03  0.5322673017285347E-03  0.5134203577763651E-03  0.4949321897694443E-03  0.4768016302125221E-03\n  0.4590275790946831E-03  0.4416090032129194E-03  0.4245449353136761E-03  0.4078344730309316E-03  0.3914767775974666E-03\n  0.3754710723036193E-03  0.3598166406754878E-03  0.3445128243419585E-03  0.3295590205570407E-03  0.3149546793411112E-03\n  0.3006993002013562E-03  0.2867924283882840E-03  0.2732336506415988E-03  0.2600225903747107E-03  0.2471589022432513E-03\n  0.2346422660385661E-03  0.2224723798427698E-03  0.2106489523774314E-03  0.1991716944731751E-03  0.1880403095829506E-03\n  0.1772544832569928E-03  0.1668138714930798E-03  0.1567180878715900E-03  0.1469666893810824E-03  0.1375591608372710E-03\n  0.1284948977961454E-03  0.1197731878613226E-03  0.1113931902866863E-03  0.1033539137784803E-03  0.9565419240704367E-04\n  0.8829265954769630E-04  0.8126771978413778E-04  0.7457751872672617E-04  0.6821991072362678E-04  0.6219242447627770E-04\n  0.5649222661344906E-04  0.5111608333233986E-04  0.4606032028242377E-04  0.4132078095054316E-04  0.3689278390632745E-04\n  0.3277107938782920E-04  0.2894980585093507E-04  0.2542244727468145E-04  0.2218179221009314E-04  0.1921989578338595E-04\n  0.1652804611495441E-04  0.1409673689099332E-04  0.1191564811913617E-04  0.9973637403230573E-05  0.8258744369264157E-05\n  0.6758211140689631E-05  0.5458521963065276E-05  0.4345465168603044E-05  0.3404220589992921E-05  0.2619475202729796E-05\n  0.1975569103509067E-05  0.1456672814492850E-05  0.1046995232007964E-05  0.7310192213004316E-06  0.4937588492987344E-06\n  0.3210285891032542E-06  0.1997107219284094E-06  0.1180030350752796E-06  0.6562550627018659E-07  0.3396305969110393E-07\n  0.1612304561662313E-07  0.6892228656363058E-08  0.2589636663001748E-08  0.8280887390551865E-09  0.2156614040605737E-09\n  0.4301139703498805E-10  0.6010118005039632E-11  0.5149083260942099E-12  0.2193180426472887E-13  0.3274661750280784E-15\n  0.9138109562588437E-18  0.1354704193168576E-21  0.5668023630192864E-28  0.1003507143230543E-40  0.5696705688614969E-79\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n    1     1.0080         1.8000        fcc \n  0.0000000000000000E+00 -0.1535560579048078E+00 -0.2907237616945244E+00 -0.4159976694362098E+00 -0.5313742240924204E+00\n -0.6381516341634162E+00 -0.7372865497340048E+00 -0.8295323942693905E+00 -0.9155075568639930E+00 -0.9957340210656841E+00\n -0.1070661374993902E+01 -0.1140682768426532E+01 -0.1206146070115003E+01 -0.1267361986331669E+01 -0.1324610161159111E+01\n -0.1378143882981543E+01 -0.1428193796698535E+01 -0.1474970886958801E+01 -0.1518668914237085E+01 -0.1559466431801390E+01\n -0.1597528475905044E+01 -0.1633007997183788E+01 -0.1666047084236993E+01 -0.1696778018255523E+01 -0.1725324188761563E+01\n -0.1751800894031140E+01 -0.1776316044902340E+01 -0.1798970786973415E+01 -0.1819860053348930E+01 -0.1839073057876778E+01\n -0.1856693737076276E+01 -0.1872801147573207E+01 -0.1887469824748019E+01 -0.1900770107406360E+01 -0.1912768432550330E+01\n -0.1923527603729046E+01 -0.1933107035951585E+01 -0.1941562979733216E+01 -0.1948948726501137E+01 -0.1955314797295812E+01\n -0.1960709116458849E+01 -0.1965177171789682E+01 -0.1968762162475479E+01 -0.1971505135945817E+01 -0.1973445114672207E+01\n -0.1974619213818786E+01 -0.1975062750551728E+01 -0.1974809345728893E+01 -0.1973891018616083E+01 -0.1972338275210313E+01\n -0.1970180190692498E+01 -0.1967444486480829E+01 -0.1964157602310837E+01 -0.1960344763727966E+01 -0.1956030045342894E+01\n -0.1951236430167903E+01 -0.1945985865324263E+01 -0.1940299314385106E+01 -0.1934196806595530E+01 -0.1927697483190939E+01\n -0.1920819641016471E+01 -0.1913580773633311E+01 -0.1905997610082929E+01 -0.1898086151466418E+01 -0.1889861705483819E+01\n -0.1881338919067047E+01 -0.1872531809229777E+01 -0.1863453792248377E+01 -0.1854117711279363E+01 -0.1844535862511214E+01\n -0.1834720019941148E+01 -0.1824681458861012E+01 -0.1814430978130464E+01 -0.1803978921310083E+01 -0.1793335196722089E+01\n -0.1782509296501631E+01 -0.1771510314697401E+01 -0.1760346964476296E+01 -0.1749027594483329E+01 -0.1737560204404532E+01\n -0.1725952459777540E+01 -0.1714211706091635E+01 -0.1702344982216385E+01 -0.1690359033195583E+01 -0.1678260322440748E+01\n -0.1666055043356523E+01 -0.1653749130428169E+01 -0.1641348269799635E+01 -0.1628857909368793E+01 -0.1616283268425060E+01\n -0.1603629346852960E+01 -0.1590900933923877E+01 -0.1578102616696916E+01 -0.1565238788048639E+01 -0.1552313654350187E+01\n -0.1539331242809444E+01 -0.1526295408494650E+01 -0.1513209841055223E+01 -0.1500078071154424E+01 -0.1486903476627897E+01\n -0.1473689288381174E+01 -0.1460438596038697E+01 -0.1447154353356060E+01 -0.1433839383406718E+01 -0.1420496383553594E+01\n -0.1407127930215773E+01 -0.1393736483439595E+01 -0.1380324391283206E+01 -0.1366893894023143E+01 -0.1353447128190937E+01\n -0.1339986130447453E+01 -0.1326512841302277E+01 -0.1313029108685023E+01 -0.1299536691375160E+01 -0.1286037262296563E+01\n -0.1272532411682773E+01 -0.1259023650118594E+01 -0.1245512411463359E+01 -0.1232000055660992E+01 -0.1218487871441779E+01\n -0.1204977078920362E+01 -0.1191468832094503E+01 -0.1177964221248664E+01 -0.1164464275266519E+01 -0.1150969963856213E+01\n -0.1137482199691838E+01 -0.1124001840474834E+01 -0.1110529690918452E+01 -0.1097066504658454E+01 -0.1083612986093118E+01\n -0.1070169792155417E+01 -0.1056737534020013E+01 -0.1043316778747819E+01 -0.1029908050870580E+01 -0.1016511833917833E+01\n -0.1003128571888578E+01 -0.9897586706698354E+00 -0.9764024994041254E+00 -0.9630603918080221E+00 -0.9497326474434862E+00\n -0.9364195329439393E+00 -0.9231212831968543E+00 -0.9098381024844113E+00 -0.8965701655839697E+00 -0.8833176188297485E+00\n -0.8700805811373453E+00 -0.8568591449923775E+00 -0.8436533774046202E+00 -0.8304633208290344E+00 -0.8172889940547750E+00\n -0.8041303930634986E+00 -0.7909874918580566E+00 -0.7778602432626174E+00 -0.7647485796954503E+00 -0.7516524139151204E+00\n -0.7385716397412827E+00 -0.7255061327509165E+00 -0.7124557509508342E+00 -0.6994203354274540E+00 -0.6863997109745679E+00\n -0.6733936866998824E+00 -0.6604020566111790E+00 -0.6474246001827013E+00 -0.6344610829025981E+00 -0.6215112568020091E+00\n -0.6085748609664665E+00 -0.5956516220302268E+00 -0.5827412546541748E+00 -0.5698434619878014E+00 -0.5569579361158532E+00\n -0.5440843584902399E+00 -0.5312224003475492E+00 -0.5183717231128886E+00 -0.5055319787902968E+00 -0.4927028103404054E+00\n -0.4798838520455784E+00 -0.4670747298631208E+00 -0.4542750617668665E+00 -0.4414844580776081E+00 -0.4287025217826503E+00\n -0.4159288488449873E+00 -0.4031630285022929E+00 -0.3904046435562347E+00 -0.3776532706523132E+00 -0.3649084805505702E+00\n -0.3521698383875012E+00 -0.3394369039294391E+00 -0.3267092318177014E+00 -0.3139863718057774E+00 -0.3012678689887569E+00\n -0.2885532640253530E+00 -0.2758420933527601E+00 -0.2631338893944120E+00 -0.2504281807610877E+00 -0.2377244924455082E+00\n -0.2250223460105389E+00 -0.2123212597713198E+00 -0.1996207489715085E+00 -0.1869203259537742E+00 -0.1742195003247300E+00\n -0.1615177791145765E+00 -0.1488146669314823E+00 -0.1361096661109569E+00 -0.1234022768604086E+00 -0.1106919973989453E+00\n -0.9797832409262908E-01 -0.8526075158534008E-01 -0.7253877292531064E-01 -0.5981187968757973E-01 -0.4707956209239161E-01\n -0.3434130911979061E-01 -0.2159660862033985E-01 -0.8844947422254279E-02  0.3914188564942300E-02  0.1668131425026886E-01\n  0.2945694526441001E-01  0.4224159786604931E-01  0.5503578885129357E-01  0.6784003546613926E-01  0.8065485532187089E-01\n  0.9348076631322821E-01  0.1063182865393753E+00  0.1191679342274936E+00  0.1320302276589731E+00  0.1449056850980641E+00\n  0.1577948247229719E+00  0.1706981645593397E+00  0.1836162224158824E+00  0.1965495158223847E+00  0.2094985619696659E+00\n  0.2224638776517585E+00  0.2354459792100279E+00  0.2484453824792379E+00  0.2614626027354943E+00  0.2744981546460752E+00\n  0.2875525522209847E+00  0.3006263087661927E+00  0.3137199368386514E+00  0.3268339482028364E+00  0.3399688537888836E+00\n  0.3531251636522359E+00  0.3663033869348276E+00  0.3795040318275802E+00  0.3927276055344020E+00  0.4059746142374676E+00\n  0.4192455630638039E+00  0.4325409560532072E+00  0.4458612961272428E+00  0.4592070850596310E+00  0.4725788234476167E+00\n  0.4859770106845307E+00  0.4994021449334540E+00  0.5128547231018850E+00  0.5263352408174535E+00  0.5398441924046491E+00\n  0.5533820708624786E+00  0.5669493678430300E+00  0.5805465736309947E+00  0.5941741771240481E+00  0.6078326658140436E+00\n  0.6215225257691057E+00  0.6352442416164141E+00  0.6489982965258876E+00  0.6627851721945213E+00  0.6766053488314805E+00\n  0.6904593051439232E+00  0.7043475183234973E+00  0.7182704640335023E+00  0.7322286163966445E+00  0.7462224479835151E+00\n  0.7602524298016173E+00  0.7743190312849433E+00  0.7884227202841974E+00  0.8025639630575290E+00  0.8167432242618240E+00\n  0.8309609669444393E+00  0.8452176525355792E+00  0.8595137408410123E+00  0.8738496900353998E+00  0.8882259566559134E+00\n  0.9026429955964752E+00  0.9171012601023203E+00  0.9316012017649666E+00  0.9461432705176964E+00  0.9607279146312910E+00\n  0.9753555807102323E+00  0.9900267136892760E+00  0.1004741756830290E+01  0.1019501151719556E+01  0.1034305338265334E+01\n  0.1049154754695761E+01  0.1064049837557060E+01  0.1078991021712077E+01  0.1093978740339108E+01  0.1109013424930930E+01\n  0.1124095505294220E+01  0.1139225409549223E+01  0.1154403564129567E+01  0.1169630393782453E+01  0.1184906321569069E+01\n  0.1200231768865166E+01  0.1215607155361878E+01  0.1231032899066835E+01  0.1246509416305429E+01  0.1262037121722220E+01\n  0.1277616428282728E+01  0.1293247747275209E+01  0.1308931488312698E+01  0.1324668059335260E+01  0.1340457866612423E+01\n  0.1356301314745660E+01  0.1372198806671151E+01  0.1388150743662683E+01  0.1404157525334607E+01  0.1420219549645083E+01\n  0.1436337212899343E+01  0.1452510909753110E+01  0.1468741033216232E+01  0.1485027974656301E+01  0.1501372123802541E+01\n  0.1517773868749642E+01  0.1534233595961925E+01  0.1550751690277352E+01  0.1567328534911856E+01  0.1583964511463701E+01\n  0.1600659999917852E+01  0.1617415378650525E+01  0.1634231024433875E+01  0.1651107312440629E+01  0.1668044616248917E+01\n  0.1685043307847061E+01  0.1702103757638609E+01  0.1719226334447252E+01  0.1736411405521971E+01  0.1753659336542133E+01\n  0.1770970491622715E+01  0.1788345233319539E+01  0.1805783922634601E+01  0.1823286919021478E+01  0.1840854580390711E+01\n  0.1858487263115261E+01  0.1876185322036066E+01  0.1893949110467636E+01  0.1911778980203568E+01  0.1929675281522265E+01\n  0.1947638363192579E+01  0.1965668572479554E+01  0.1983766255150165E+01  0.2001931755479132E+01  0.2020165416254637E+01\n  0.2038467578784327E+01  0.2056838582901055E+01  0.2075278766968794E+01  0.2093788467888599E+01  0.2112368021104497E+01\n  0.2131017760609439E+01  0.2149738018951330E+01  0.2168529127238993E+01  0.2187391415148134E+01  0.2206325210927415E+01\n  0.2225330841404466E+01  0.2244408631991916E+01  0.2263558906693465E+01  0.2282781988109954E+01  0.2302078197445396E+01\n  0.2321447854513099E+01  0.2340891277741691E+01  0.2360408784181265E+01  0.2380000689509425E+01  0.2399667308037372E+01\n  0.2419408952716023E+01  0.2439225935142099E+01  0.2459118565564146E+01  0.2479087152888749E+01  0.2499132004686517E+01\n  0.2519253427198186E+01  0.2539451725340665E+01  0.2559727202713198E+01  0.2580080161603353E+01  0.2600510902993117E+01\n  0.2621019726564874E+01  0.2641606930707586E+01  0.2662272812522710E+01  0.2683017667830213E+01  0.2703841791174714E+01\n  0.2724745475831364E+01  0.2745729013811853E+01  0.2766792695870475E+01  0.2787936811510058E+01  0.2809161648987794E+01\n  0.2830467495321410E+01  0.2851854636294917E+01  0.2873323356464579E+01  0.2894873939164848E+01  0.2916506666514209E+01\n  0.2938221819421049E+01  0.2960019677589501E+01  0.2981900519525381E+01  0.3003864622541801E+01  0.3025912262765175E+01\n  0.3048043715140940E+01  0.3070259253439192E+01  0.3092559150260705E+01  0.3114943677042409E+01  0.3137413104063187E+01\n  0.3159967700449641E+01  0.3182607734181641E+01  0.3205333472098077E+01  0.3228145179902447E+01  0.3251043122168472E+01\n  0.3274027562345680E+01  0.3297098762765072E+01  0.3320256984644469E+01  0.3343502488094288E+01  0.3366835532122889E+01\n  0.3390256374642066E+01  0.3413765272472630E+01  0.3437362481349784E+01  0.3461048255928476E+01  0.3484822849788961E+01\n  0.3508686515442005E+01  0.3532639504334363E+01  0.3556682066854127E+01  0.3580814452335925E+01  0.3605036909066328E+01\n  0.3629349684289036E+01  0.3653753024210198E+01  0.3678247174003544E+01  0.3702832377815693E+01  0.3727508878771226E+01\n  0.3752276918977883E+01  0.3777136739531759E+01  0.3802088580522303E+01  0.3827132681037432E+01  0.3852269279168641E+01\n  0.3877498612015998E+01  0.3902820915693174E+01  0.3928236425332438E+01  0.3953745375089617E+01  0.3979347998149013E+01\n  0.4005044526728421E+01  0.4030835192083855E+01  0.4056720224514617E+01  0.4082699853368021E+01  0.4108774307044248E+01\n  0.4134943813001183E+01  0.4161208597759163E+01  0.4187568886905720E+01  0.4214024905100390E+01  0.4240576876079345E+01\n  0.4267225022660046E+01  0.4293969566746052E+01  0.4320810729331575E+01  0.4347748730506037E+01  0.4374783789458776E+01\n  0.4401916124483547E+01  0.4429145952983095E+01  0.4456473491473638E+01  0.4483898955589500E+01  0.4511422560087357E+01\n  0.4539044518850936E+01  0.4566765044895316E+01  0.4594584350371322E+01  0.4622502646570012E+01  0.4650520143926894E+01\n  0.4678637052026418E+01  0.4706853579606230E+01  0.4735169934561444E+01  0.4763586323948928E+01  0.4792102953991607E+01\n  0.4820720030082579E+01  0.4849437756789456E+01  0.4878256337858449E+01  0.4907175976218555E+01  0.4936196873985707E+01\n  0.4965319232466936E+01  0.4994543252164328E+01  0.5023869132779231E+01  0.5053297073216303E+01  0.5082827271587405E+01\n  0.5112459925215758E+01  0.5142195230639895E+01  0.5172033383617539E+01  0.5201974579129658E+01  0.5232019011384368E+01\n  0.5262166873820703E+01  0.5292418359112656E+01  0.5322773659173003E+01  0.5353232965157039E+01  0.5383796467466556E+01\n  0.5414464355753495E+01  0.5445236818923759E+01  0.5476114045141041E+01  0.5507096221830388E+01  0.5538183535682169E+01\n  0.5569376172655497E+01  0.5600674317982096E+01  0.5632078156169850E+01  0.5663587871006478E+01  0.5695203645563089E+01\n  0.5726925662197861E+01  0.5758754102559550E+01  0.5790689147591050E+01  0.5822730977532937E+01  0.5854879771926981E+01\n  0.5887135709619618E+01  0.5919498968765412E+01  0.5951969726830611E+01  0.5984548160596443E+01  0.6017234446162569E+01\n  0.6050028758950551E+01  0.6082931273707150E+01  0.6115942164507743E+01  0.6149061604759621E+01  0.6182289767205272E+01\n  0.6215626823925810E+01  0.6249072946344119E+01  0.6282628305228231E+01  0.6316293070694456E+01  0.6350067412210745E+01\n  0.6383951498599807E+01  0.6417945498042277E+01  0.6452049578080040E+01  0.6486263905619155E+01  0.6520588646933274E+01\n  0.6555023967666467E+01  0.6589570032836555E+01  0.6624227006838173E+01  0.6658995053445667E+01  0.6693874335816274E+01\n  0.6728865016493213E+01  0.6763967257408575E+01  0.6799181219886369E+01  0.6834507064645582E+01  0.6869944951802993E+01\n  0.6905495040876272E+01  0.6941157490786817E+01  0.6976932459862688E+01  0.7012820105841560E+01  0.7048820585873601E+01\n  0.7084934056524147E+01  0.7121160673776924E+01  0.7157500593036525E+01  0.7193953969131448E+01  0.7230520956316742E+01\n  0.7267201708277015E+01  0.7303996378128941E+01  0.7340905118424199E+01  0.7377928081152227E+01  0.7415065417742714E+01\n  0.7452317279068625E+01  0.7489683815448713E+01  0.7527165176650154E+01  0.7564761511891398E+01  0.7602472969844660E+01\n  0.7640299698638533E+01  0.7678241845860797E+01  0.7716299558560847E+01  0.7754472983252295E+01  0.7792762265915677E+01\n  0.7831167552000825E+01  0.7869688986429596E+01  0.7908326713598298E+01  0.7947080877380213E+01  0.7985951621128103E+01\n  0.8024939087676790E+01  0.8064043419345456E+01  0.8103264757940238E+01  0.8142603244756712E+01  0.8182059020582113E+01\n  0.8221632225698052E+01  0.8261322999882655E+01  0.8301131482413128E+01  0.8341057812068073E+01  0.8381102127129775E+01\n  0.8421264565386728E+01  0.8461545264135914E+01  0.8501944360185011E+01  0.8542461989854800E+01  0.8583098288981544E+01\n  0.8623853392919127E+01  0.8664727436541362E+01  0.8705720554244369E+01  0.8746832879948686E+01  0.8788064547101555E+01\n  0.8829415688679173E+01  0.8870886437188865E+01  0.8912476924671346E+01  0.8954187282702780E+01  0.8996017642397092E+01\n  0.9037968134408045E+01  0.9080038888931480E+01  0.9122230035707283E+01  0.9164541704021747E+01  0.9206974022709504E+01\n  0.9249527120155676E+01  0.9292201124297971E+01  0.9334996162628819E+01  0.9377912362197343E+01  0.9420949849611493E+01\n  0.9464108751040072E+01  0.9507389192214658E+01  0.9550791298431900E+01  0.9594315194555200E+01  0.9637961005016923E+01\n  0.9681728853820376E+01  0.9725618864541687E+01  0.9769631160331837E+01  0.9813765863918640E+01  0.9858023097608644E+01\n  0.9902402983288997E+01  0.9946905642429570E+01  0.9991531196084678E+01  0.1003627976489508E+02  0.1008115146908984E+02\n  0.1012614642848822E+02  0.1017126476250151E+02  0.1021650659013498E+02  0.1026187202998970E+02  0.1030736120026423E+02\n  0.1035297421875671E+02  0.1039871120286647E+02  0.1044457226959594E+02  0.1049055753555247E+02  0.1053666711695001E+02\n  0.1058290112961095E+02  0.1062925968896805E+02  0.1067574291006588E+02  0.1072235090756281E+02  0.1076908379573268E+02\n  0.1081594168846656E+02  0.1086292469927445E+02  0.1091003294128697E+02  0.1095726652725712E+02  0.1100462556956189E+02\n  0.1105211018020406E+02  0.1109972047081387E+02  0.1114745655265044E+02  0.1119531853660384E+02  0.1124330653319640E+02\n  0.1129142065258453E+02  0.1133966100456022E+02  0.1138802769855287E+02  0.1143652084363064E+02  0.1148514054850226E+02\n  0.1153388692151854E+02  0.1158276007067394E+02  0.1163176010360828E+02  0.1168088712760808E+02  0.1173014124960834E+02\n  0.1177952257619401E+02  0.1182903121360145E+02  0.1187866726772023E+02  0.1192843084409426E+02  0.1197832204792367E+02\n  0.1202834098406616E+02  0.1207848775703852E+02  0.1212876247101815E+02  0.1217916522984446E+02  0.1222969613702057E+02\n  0.1228035529571446E+02  0.1233114280876082E+02  0.1238205877866202E+02  0.1243310330759011E+02  0.1248427649738783E+02\n  0.1253557844957024E+02  0.1258700926532612E+02  0.1263856904551937E+02  0.1269025789069041E+02  0.1274207590105764E+02\n  0.1279402317651873E+02  0.1284609981665210E+02  0.1289830592071831E+02  0.1295064158766139E+02  0.1300310691611016E+02\n  0.1305570200437972E+02  0.1310842695047267E+02  0.1316128185208051E+02  0.1321426680658502E+02  0.1326738191105951E+02\n  0.1332062726227020E+02  0.1337400295667756E+02  0.1342750909043750E+02  0.1348114575940276E+02  0.1353491305912430E+02\n  0.1358881108485235E+02  0.1364283993153797E+02  0.1369699969383405E+02  0.1375129046609678E+02  0.1380571234238685E+02\n  0.1386026541647074E+02  0.1391494978182183E+02  0.1396976553162181E+02  0.1402471275876187E+02  0.1407979155584384E+02\n  0.1413500201518157E+02  0.1419034422880200E+02  0.1424581828844641E+02  0.1430142428557176E+02  0.1435716231135165E+02\n  0.1441303245667767E+02  0.1446903481216061E+02  0.1452516946813144E+02  0.1458143651464284E+02  0.1463783604146995E+02\n  0.1469436813811187E+02  0.1475103289379257E+02  0.1480783039746221E+02  0.1486476073779820E+02  0.1492182400320636E+02\n  0.1497902028182210E+02  0.1503634966151138E+02  0.1509381222987208E+02  0.1515140807423487E+02  0.1520913728166454E+02\n  0.1526699993896084E+02  0.1532499613265989E+02  0.1538312594903494E+02  0.1544138947409778E+02  0.1549978679359965E+02\n  0.1555831799303221E+02  0.1561698315762881E+02  0.1567578237236552E+02  0.1573471572196207E+02  0.1579378329088299E+02\n  0.1585298516333866E+02  0.1591232142328633E+02  0.1597179215443117E+02  0.1603139744022732E+02  0.1609113736387884E+02\n  0.1615101200834081E+02  0.1621102145632030E+02  0.1627116579027744E+02  0.1633144509242638E+02  0.1639185944473622E+02\n  0.1645240892893225E+02  0.1651309362649662E+02  0.1657391361866950E+02  0.1663486898645014E+02  0.1669595981059768E+02\n  0.1675718617163216E+02  0.1681854814983560E+02  0.1688004582525278E+02  0.1694167927769237E+02  0.1700344858672776E+02\n  0.1706535383169809E+02  0.1712739509170910E+02  0.1718957244563422E+02  0.1725188597211529E+02  0.1731433574956364E+02\n  0.1737692185616106E+02  0.1743964436986050E+02  0.1750250336838723E+02  0.1756549892923954E+02  0.1762863112968988E+02\n  0.1769190004678551E+02  0.1775530575734953E+02  0.1781884833798184E+02  0.1788252786505983E+02  0.1794634441473943E+02\n  0.1801029806295595E+02  0.1807438888542495E+02  0.1813861695764293E+02  0.1820298235488868E+02  0.1826748515222356E+02\n  0.1833212542449270E+02  0.1839690324632588E+02  0.1846181869213811E+02  0.1852687183613067E+02  0.1859206275229210E+02\n  0.1865739151439864E+02  0.1872285819601541E+02  0.1878846287049704E+02  0.1885420561098861E+02  0.1892008649042634E+02\n  0.1898610558153868E+02  0.1905226295684672E+02  0.1911855868866527E+02  0.1918499284910370E+02  0.1925156551006659E+02\n  0.1931827674325448E+02  0.1938512662016491E+02  0.1945211521209302E+02  0.1951924259013235E+02  0.1958650882517566E+02\n  0.1965391398791571E+02  0.1972145814884597E+02  0.1978914137826159E+02  0.1985696374625988E+02  0.1992492532274116E+02\n  0.1999302617740977E+02  0.2006126637977442E+02  0.2012964599914926E+02  0.2019816510465454E+02  0.2026682376521724E+02\n  0.2033562204957191E+02  0.2040456002626147E+02  0.2047363776363781E+02  0.2054285532986256E+02  0.2061221279290795E+02\n  0.2068171022055733E+02  0.2075134768040595E+02  0.2082112523986171E+02  0.2089104296614605E+02  0.2096110092629424E+02\n  0.2103129918715649E+02  0.2110163781539841E+02  0.2117211687750176E+02  0.2124273643976533E+02  0.2131349656830528E+02\n  0.2138439732905617E+02  0.2145543878777140E+02  0.2152662101002412E+02  0.2159794406120766E+02  0.2166940800653642E+02\n  0.2174101291104644E+02  0.2181275883959610E+02  0.2188464585686669E+02  0.2195667402736326E+02  0.2202884341541514E+02\n  0.2210115408517663E+02  0.2217360610062771E+02  0.2224619952557461E+02  0.2231893442365038E+02  0.2239181085831591E+02\n  0.2246482889286010E+02  0.2253798859040076E+02  0.2261129001388523E+02  0.2268473322609096E+02  0.2275831828962614E+02\n  0.2283204526693043E+02  0.2290591422027539E+02  0.2297992521176526E+02  0.2305407830333766E+02  0.2312837355676387E+02\n  0.2320281103364977E+02  0.2327739079543636E+02  0.2335211290340030E+02  0.2342697741865454E+02  0.2350198440214897E+02\n  0.2357713391467102E+02  0.2365242601684612E+02  0.2372786076913854E+02  0.2380343823185174E+02  0.2387915846512908E+02\n  0.2395502152895441E+02  0.2403102748315263E+02  0.2410717638739019E+02  0.2418346830117586E+02  0.2425990328386112E+02\n  0.2433648139464079E+02  0.2441320269255370E+02  0.2449006723648306E+02  0.2456707508515719E+02  0.2464422629715007E+02\n  0.2472152093088173E+02  0.2479895904461906E+02  0.2487654069647616E+02  0.2495426594441500E+02  0.2503213484624594E+02\n  0.2511014745962827E+02  0.2518830384207072E+02  0.2526660405093208E+02  0.2534504814342175E+02  0.2542363617660013E+02\n  0.2550236820737923E+02  0.2558124429252339E+02  0.2566026448864954E+02  0.2573942885222773E+02  0.2581873743958190E+02\n  0.2589819030689023E+02  0.2597778751018570E+02  0.2605752910535647E+02  0.2613741514814674E+02  0.2621744569415681E+02\n  0.2629762079884404E+02  0.2637794051752302E+02  0.2645840490536618E+02  0.2653901401740439E+02  0.2661976790852737E+02\n  0.2670066663348421E+02  0.2678171024688378E+02  0.2686289880319548E+02  0.2694423235674941E+02  0.2702571096173704E+02\n  0.2710733467221175E+02  0.2718910354208919E+02  0.2727101762514775E+02  0.2735307697502924E+02  0.2743528164523912E+02\n  0.2751763168914713E+02  0.2760012715998774E+02  0.2768276811086066E+02  0.2776555459473111E+02  0.2784848666443062E+02\n  0.2793156437265721E+02  0.2801478777197602E+02  0.2809815691481973E+02  0.2818167185348894E+02  0.2826533264015273E+02\n  0.2834913932684915E+02  0.2843309196548557E+02  0.2851719060783909E+02  0.2860143530555727E+02  0.2868582611015826E+02\n  0.2877036307303130E+02  0.2885504624543746E+02  0.2893987567850965E+02  0.2902485142325337E+02  0.2910997353054712E+02\n  0.2919524205114265E+02  0.2928065703566552E+02  0.2936621853461569E+02  0.2945192659836760E+02  0.2953778127717089E+02\n  0.2962378262115081E+02  0.2970993068030837E+02  0.2979622550452115E+02  0.2988266714354346E+02  0.2996925564700682E+02\n  0.3005599106442041E+02  0.3014287344517153E+02  0.3022990283852592E+02  0.3031707929362812E+02  0.3040440285950215E+02\n  0.3049187358505165E+02  0.3057949151906041E+02  0.3066725671019266E+02  0.3075516920699371E+02  0.3084322905789012E+02\n  0.3093143631119021E+02  0.3101979101508448E+02  0.3110829321764588E+02  0.3119694296683040E+02  0.3128574031047729E+02\n  0.3137468529630954E+02  0.3146377797193422E+02  0.3155301838484299E+02  0.3164240658241237E+02  0.3173194261190401E+02\n  0.3182162652046552E+02  0.3191145835513032E+02  0.3200143816281827E+02  0.3209156599033621E+02  0.3218184188437798E+02\n  0.3227226589152506E+02  0.3236283805824685E+02  0.3245355843090114E+02  0.3254442705573426E+02  0.3263544397888169E+02\n  0.3272660924636835E+02  0.3281792290410885E+02  0.3290938499790812E+02  0.3300099557346138E+02  0.3309275467635493E+02\n  0.3318466235206626E+02  0.3327671864596444E+02  0.3336892360331044E+02  0.3346127726925774E+02  0.3355377968885226E+02\n  0.3364643090703304E+02  0.3373923096863262E+02  0.3383217991837713E+02  0.3392527780088678E+02  0.3401852466067623E+02\n  0.3411192054215498E+02  0.3420546548962749E+02  0.3429915954729392E+02  0.3439300275925001E+02  0.3448699516948774E+02\n  0.3458113682189561E+02  0.3467542776025882E+02  0.3476986802825981E+02  0.3486445766947862E+02  0.3495919672739288E+02\n  0.3505408524537850E+02  0.3514912326671002E+02  0.3524431083456054E+02  0.3533964799200239E+02  0.3543513478200754E+02\n  0.3553077124744756E+02  0.3562655743109424E+02  0.3572249337561980E+02  0.3581857912359721E+02  0.3591481471750058E+02\n  0.3601120019970533E+02  0.3610773561248870E+02  0.3620442099802995E+02  0.3630125639841068E+02  0.3639824185561516E+02\n  0.3649537741153064E+02  0.3659266310794771E+02  0.3669009898656054E+02  0.3678768508896718E+02  0.3688542145666988E+02\n  0.3698330813107555E+02  0.3708134515349577E+02  0.3717938217591600E+02  0.3727741919833622E+02  0.3737545622075644E+02\n  0.0000000000000000E+00  0.8576998932607242E-09  0.5148474978702150E-07  0.5500333859843751E-06  0.2898571356744415E-05\n  0.1037065667137954E-04  0.2904394432880980E-04  0.6869069328866988E-04  0.1435525383839498E-03  0.2729524897641136E-03\n  0.4817179545381958E-03  0.8004046139757985E-03  0.1265323067409609E-02  0.1918378981427738E-02  0.2806743664553777E-02\n  0.3982376035816319E-02  0.5501419303057878E-02  0.7423496677200373E-02  0.9810930426149240E-02  0.1272790776956854E-01\n  0.1623961574245743E-01  0.2041136538278681E-01  0.2530772356585144E-01  0.3099166862766308E-01  0.3752378368081732E-01\n  0.4496149929855063E-01  0.5335839507962672E-01  0.6276356754813610E-01  0.7322106991690198E-01  0.8476942747035206E-01\n  0.9744123071429918E-01  0.1112628070018588E+00  0.1262539700776599E+00  0.1424278458837341E+00  0.1597907720342443E+00\n  0.1783422675846084E+00  0.1980750690841191E+00  0.2189752283993167E+00  0.2410222674169928E+00  0.2641893844693322E+00\n  0.2884437071578631E+00  0.3137465861762969E+00  0.3400539247340754E+00  0.3673165382520538E+00  0.3954805391293457E+00\n  0.4244877415567311E+00  0.4542760815685687E+00  0.4847800477740307E+00  0.5159311184824792E+00  0.5476582012304797E+00\n  0.5798880710234582E+00  0.6125458039182285E+00  0.6455552028889719E+00  0.6788392132348257E+00  0.7123203250985853E+00\n  0.7459209609702914E+00  0.7795638463441852E+00  0.8131723619807327E+00  0.8466708764954843E+00  0.8799850582522438E+00\n  0.9130421657784031E+00  0.9457713161447614E+00  0.9781037309602292E+00  0.1009972959823397E+01  0.1041315081248019E+01\n  0.1072068881238206E+01  0.1102176009831869E+01  0.1131581116058128E+01  0.1160231961866557E+01  0.1188079515683897E+01\n  0.1215078026337852E+01  0.1241185078158618E+01  0.1266361628127532E+01  0.1290572025989520E+01  0.1313784018282635E+01\n  0.1335968737264703E+01  0.1357100675734715E+01  0.1377157648755932E+01  0.1396120743289401E+01  0.1413974256741546E+01\n  0.1430705625418266E+01  0.1446305343861415E+01  0.1460766876022088E+01  0.1474086559199635E+01  0.1486263501646126E+01\n  0.1497299474703849E+01  0.1507198800308697E+01  0.1515968234655533E+01  0.1523616848783268E+01  0.1530155906797786E+01\n  0.1535598742410441E+01  0.1539960634428920E+01  0.1543258681796175E+01  0.1545511678732089E+01  0.1546739990491811E+01\n  0.1546965430214609E+01  0.1546211137297620E+01  0.1544501457690412E+01  0.1541861826468803E+01  0.1538318653010165E+01\n  0.1533899209057386E+01  0.1528631519925127E+01  0.1522544259069783E+01  0.1515666646213862E+01  0.1508028349186392E+01\n  0.1499659389613263E+01  0.1490590052565443E+01  0.1480850800248451E+01  0.1470472189793603E+01  0.1459484795190111E+01\n  0.1447919133377286E+01  0.1435805594497667E+01  0.1423174376295045E+01  0.1410055422625766E+01  0.1396478366037582E+01\n  0.1382472474357517E+01  0.1368066601218609E+01  0.1353289140445096E+01  0.1338167984206406E+01  0.1322730484842268E+01\n  0.1307003420254224E+01  0.1291012962752784E+01  0.1274784651244435E+01  0.1258343366638420E+01  0.1241713310349911E+01\n  0.1224917985773531E+01  0.1207980182599308E+01  0.1190921963841912E+01  0.1173764655453436E+01  0.1156528838389896E+01\n  0.1139234343002130E+01  0.1121900245622720E+01  0.1104544867221897E+01  0.1087185774007220E+01  0.1069839779843846E+01\n  0.1052522950374696E+01  0.1035250608722480E+01  0.1018037342658465E+01  0.1000897013126039E+01  0.9838427640104167E+00\n  0.9668870330493002E+00  0.9500415637828995E+00  0.9333174184453955E+00  0.9167249917036894E+00  0.9002740251531050E+00\n  0.8839736224835302E+00  0.8678322652333790E+00  0.8518578290525983E+00  0.8360576003997890E+00  0.8204382936023470E+00\n  0.8050060682122852E+00  0.7897665465941298E+00  0.7747248316849636E+00  0.7598855248702404E+00  0.7452527439225495E+00\n  0.7308301409539072E+00  0.7166209203354966E+00  0.7026278565420246E+00  0.6888533118809829E+00  0.6752992540701540E+00\n  0.6619672736296282E+00  0.6488586010574048E+00  0.6359741237603777E+00  0.6233144027150980E+00  0.6108796888351882E+00\n  0.5986699390246809E+00  0.5866848318987949E+00  0.5749237831558405E+00  0.5633859605859940E+00  0.5520702987046087E+00\n  0.5409755129995881E+00  0.5301001137840697E+00  0.5194424196473048E+00  0.5090005704981659E+00  0.4987725401971368E+00\n  0.4887561487740056E+00  0.4789490742297346E+00  0.4693488639221445E+00  0.4599529455361500E+00  0.4507586376402879E+00\n  0.4417631598321903E+00  0.4329636424765457E+00  0.4243571360398264E+00  0.4159406200268177E+00  0.4077110115246057E+00\n  0.3996651733602655E+00  0.3917999218790373E+00  0.3841120343502322E+00  0.3765982560085148E+00  0.3692553067386082E+00\n  0.3620798874117488E+00  0.3550686858825059E+00  0.3482183826548197E+00  0.3415256562262722E+00  0.3349871881197929E+00\n  0.3285996676120873E+00  0.3223597961681734E+00  0.3162642915914723E+00  0.3103098918988991E+00  0.3044933589304323E+00\n  0.2988114817025848E+00  0.2932610795151651E+00  0.2878390048206519E+00  0.2825421458654130E+00  0.2773674291118858E+00\n  0.2723118214507413E+00  0.2673723322118953E+00  0.2625460149830915E+00  0.2578299692446370E+00  0.2532213418286768E+00\n  0.2487173282112436E+00  0.2443151736451206E+00  0.2400121741413617E+00  0.2358056773071348E+00  0.2316930830473297E+00\n  0.2276718441371882E+00  0.2237394666729961E+00  0.2198935104076650E+00  0.2161315889778330E+00  0.2124513700288889E+00\n  0.2088505752441177E+00  0.2053269802839583E+00  0.2018784146411472E+00  0.1985027614173130E+00  0.1951979570263882E+00\n  0.1919619908299856E+00  0.1887929047096988E+00  0.1856887925810768E+00  0.1826477998538276E+00  0.1796681228426198E+00\n  0.1767480081326520E+00  0.1738857519039822E+00  0.1710796992184251E+00  0.1683282432726463E+00  0.1656298246209137E+00\n  0.1629829303707959E+00  0.1603860933549304E+00  0.1578378912818327E+00  0.1553369458685551E+00  0.1528819219578573E+00\n  0.1504715266224071E+00  0.1481045082583851E+00  0.1457796556707337E+00  0.1434957971521608E+00  0.1412517995578756E+00\n  0.1390465673779208E+00  0.1368790418088395E+00  0.1347481998263070E+00  0.1326530532602482E+00  0.1305926478738530E+00\n  0.1285660624478085E+00  0.1265724078709661E+00  0.1246108262385681E+00  0.1226804899590787E+00  0.1207806008705706E+00\n  0.1189103893675429E+00  0.1170691135389732E+00  0.1152560583183238E+00  0.1134705346461653E+00  0.1117118786460041E+00\n  0.1099794508138442E+00  0.1082726352219536E+00  0.1065908387372449E+00  0.1049334902546352E+00  0.1033000399456902E+00\n  0.1016899585228177E+00  0.1001027365192277E+00  0.9853788358483354E-01  0.9699492779823146E-01  0.9547341499485665E-01\n  0.9397290811138079E-01  0.9249298654638069E-01  0.9103324553728220E-01  0.8959329555354877E-01  0.8817276170606399E-01\n  0.8677128317262857E-01  0.8538851263947052E-01  0.8402411575864875E-01  0.8267777062120664E-01  0.8134916724591848E-01\n  0.8003800708345375E-01  0.7874400253576731E-01  0.7746687649051477E-01  0.7620636187027600E-01  0.7496220119635953E-01\n  0.7373414616695294E-01  0.7252195724937327E-01  0.7132540328616367E-01  0.7014426111477837E-01  0.6897831520058859E-01\n  0.6782735728294027E-01  0.6669118603398869E-01  0.6556960673003079E-01  0.6446243093505667E-01  0.6336947619623536E-01\n  0.6229056575105237E-01  0.6122552824581402E-01  0.6017419746523230E-01  0.5913641207280737E-01  0.5811201536172281E-01\n  0.5710085501597033E-01  0.5610278288142408E-01  0.5511765474658521E-01  0.5414533013271837E-01  0.5318567209310896E-01\n  0.5223854702116695E-01  0.5130382446711163E-01  0.5038137696297216E-01  0.4947107985564236E-01  0.4857281114773465E-01\n  0.4768645134597841E-01  0.4681188331691594E-01  0.4594899214965088E-01  0.4509766502540915E-01  0.4425779109367826E-01\n  0.4342926135469399E-01  0.4261196854804814E-01  0.4180580704719781E-01  0.4101067275965932E-01  0.4022646303267519E-01\n  0.3945307656414969E-01  0.3869041331864940E-01  0.3793837444827467E-01  0.3719686221820911E-01  0.3646577993676117E-01\n  0.3574503188971662E-01  0.3503452327882445E-01  0.3433416016424531E-01  0.3364384941079507E-01  0.3296349863782079E-01\n  0.3229301617255276E-01  0.3163231100677876E-01  0.3098129275669249E-01  0.3033987162577284E-01  0.2970795837055464E-01\n  0.2908546426915543E-01  0.2847230109242889E-01  0.2786838107761748E-01  0.2727361690438311E-01  0.2668792167309761E-01\n  0.2611120888527847E-01  0.2554339242606102E-01  0.2498438654859956E-01  0.2443410586029598E-01  0.2389246531075691E-01\n  0.2335938018138393E-01  0.2283476607650571E-01  0.2231853891596374E-01  0.2181061492906659E-01  0.2131091064983147E-01\n  0.2081934291343454E-01  0.2033582885379438E-01  0.1986028590221680E-01  0.1939263178703108E-01  0.1893278453415130E-01\n  0.1848066246849892E-01  0.1803618421622546E-01  0.1759926870767613E-01  0.1716983518103927E-01  0.1674780318662707E-01\n  0.1633309259173651E-01  0.1592562358604172E-01  0.1552531668746990E-01  0.1513209274851720E-01  0.1474587296296080E-01\n  0.1436657887292672E-01  0.1399413237627429E-01  0.1362845573426023E-01  0.1326947157944628E-01  0.1291710292381743E-01\n  0.1257127316707774E-01  0.1223190610509324E-01  0.1189892593845275E-01  0.1157225728111806E-01  0.1125182516913743E-01\n  0.1093755506939646E-01  0.1062937288838200E-01  0.1032720498093588E-01  0.1003097815897619E-01  0.9740619700164219E-02\n  0.9456057356497178E-02  0.9177219362806280E-02  0.8904034445141316E-02  0.8636431829023183E-02  0.8374341247546036E-02\n  0.8117692949311960E-02  0.7866417706180585E-02  0.7620446820816740E-02  0.7379712134019578E-02  0.7144146031816014E-02\n  0.6913681452302325E-02  0.6688251892216657E-02  0.6467791413225554E-02  0.6252234647907211E-02  0.6041516805413253E-02\n  0.5835573676791136E-02  0.5634341639947666E-02  0.5437757664233824E-02  0.5245759314629934E-02  0.5058284755509180E-02\n  0.4875272753955811E-02  0.4696662682613547E-02  0.4522394522037392E-02  0.4352408862520555E-02  0.4186646905366133E-02\n  0.4025050463570553E-02  0.3867561961883894E-02  0.3714124436208813E-02  0.3564681532297067E-02  0.3419177503699341E-02\n  0.3277557208920367E-02  0.3139766107727285E-02  0.3005750256555324E-02  0.2875456302949815E-02  0.2748831478978852E-02\n  0.2625823593545541E-02  0.2506381023522792E-02  0.2390452703627873E-02  0.2277988114946939E-02  0.2168937272013016E-02\n  0.2063250708333439E-02  0.1960879460254761E-02  0.1861775049045227E-02  0.1765889461065943E-02  0.1673175125893125E-02\n  0.1583584892244586E-02  0.1497072001553956E-02  0.1413590059026983E-02  0.1333093002004349E-02  0.1255535065446408E-02\n  0.1180870744346243E-02  0.1109054752869345E-02  0.1040041980010902E-02  0.9737874415562595E-03  0.9102462281261181E-03\n  0.8493734490870866E-03  0.7911241721104120E-03  0.7354533581681445E-03  0.6823157917680999E-03  0.6316660062474194E-03\n  0.5834582039715675E-03  0.5376461713226330E-03  0.4941831884102573E-03  0.4530219335027502E-03  0.4141143822583456E-03\n  0.3774117019399670E-03  0.3428641409258591E-03  0.3104209139870729E-03  0.2800300839961760E-03  0.2516384409654113E-03\n  0.2251913795924475E-03  0.2006327768245250E-03  0.1779048713433524E-03  0.1569481473297049E-03  0.1377012253937927E-03\n  0.1201007641585952E-03  0.1040813766598551E-03  0.8957556647504338E-04  0.7651368930508610E-04  0.6482394658893534E-04\n  0.5443241860150438E-04  0.4526314532314971E-04  0.3723826410463467E-04  0.3027821368846399E-04  0.2430201435404447E-04\n  0.1922763365777299E-04  0.1497244622116435E-04  0.1145379401469120E-04  0.8589650285013768E-05  0.6299385349542388E-05\n  0.4504625622961494E-05  0.3130188220885624E-05  0.2105062280742719E-05  0.1363395085845545E-05  0.8454270900288885E-06\n  0.4983067594254876E-06  0.2767065679872027E-06  0.1431594160449781E-06  0.6804490613003522E-07  0.2918182930693568E-07\n  0.1102919874006033E-07  0.3560261260656263E-08  0.9406176465862757E-09  0.1916420214061158E-09  0.2763777688791933E-10\n  0.2482312356945943E-11  0.1136644735947497E-12  0.1904831683752850E-14  0.6466043629846817E-17  0.1381172060080856E-20\n  0.1274303700193166E-26  0.2106088550891557E-38  0.1212886175035114E-71  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.8576998932607242E-09  0.5148474978702150E-07  0.5500333859843751E-06  0.2898571356744415E-05\n  0.1037065667137954E-04  0.2904394432880980E-04  0.6869069328866988E-04  0.1435525383839498E-03  0.2729524897641136E-03\n  0.4817179545381958E-03  0.8004046139757985E-03  0.1265323067409609E-02  0.1918378981427738E-02  0.2806743664553777E-02\n  0.3982376035816319E-02  0.5501419303057878E-02  0.7423496677200373E-02  0.9810930426149240E-02  0.1272790776956854E-01\n  0.1623961574245743E-01  0.2041136538278681E-01  0.2530772356585144E-01  0.3099166862766308E-01  0.3752378368081732E-01\n  0.4496149929855063E-01  0.5335839507962672E-01  0.6276356754813610E-01  0.7322106991690198E-01  0.8476942747035206E-01\n  0.9744123071429918E-01  0.1112628070018588E+00  0.1262539700776599E+00  0.1424278458837341E+00  0.1597907720342443E+00\n  0.1783422675846084E+00  0.1980750690841191E+00  0.2189752283993167E+00  0.2410222674169928E+00  0.2641893844693322E+00\n  0.2884437071578631E+00  0.3137465861762969E+00  0.3400539247340754E+00  0.3673165382520538E+00  0.3954805391293457E+00\n  0.4244877415567311E+00  0.4542760815685687E+00  0.4847800477740307E+00  0.5159311184824792E+00  0.5476582012304797E+00\n  0.5798880710234582E+00  0.6125458039182285E+00  0.6455552028889719E+00  0.6788392132348257E+00  0.7123203250985853E+00\n  0.7459209609702914E+00  0.7795638463441852E+00  0.8131723619807327E+00  0.8466708764954843E+00  0.8799850582522438E+00\n  0.9130421657784031E+00  0.9457713161447614E+00  0.9781037309602292E+00  0.1009972959823397E+01  0.1041315081248019E+01\n  0.1072068881238206E+01  0.1102176009831869E+01  0.1131581116058128E+01  0.1160231961866557E+01  0.1188079515683897E+01\n  0.1215078026337852E+01  0.1241185078158618E+01  0.1266361628127532E+01  0.1290572025989520E+01  0.1313784018282635E+01\n  0.1335968737264703E+01  0.1357100675734715E+01  0.1377157648755932E+01  0.1396120743289401E+01  0.1413974256741546E+01\n  0.1430705625418266E+01  0.1446305343861415E+01  0.1460766876022088E+01  0.1474086559199635E+01  0.1486263501646126E+01\n  0.1497299474703849E+01  0.1507198800308697E+01  0.1515968234655533E+01  0.1523616848783268E+01  0.1530155906797786E+01\n  0.1535598742410441E+01  0.1539960634428920E+01  0.1543258681796175E+01  0.1545511678732089E+01  0.1546739990491811E+01\n  0.1546965430214609E+01  0.1546211137297620E+01  0.1544501457690412E+01  0.1541861826468803E+01  0.1538318653010165E+01\n  0.1533899209057386E+01  0.1528631519925127E+01  0.1522544259069783E+01  0.1515666646213862E+01  0.1508028349186392E+01\n  0.1499659389613263E+01  0.1490590052565443E+01  0.1480850800248451E+01  0.1470472189793603E+01  0.1459484795190111E+01\n  0.1447919133377286E+01  0.1435805594497667E+01  0.1423174376295045E+01  0.1410055422625766E+01  0.1396478366037582E+01\n  0.1382472474357517E+01  0.1368066601218609E+01  0.1353289140445096E+01  0.1338167984206406E+01  0.1322730484842268E+01\n  0.1307003420254224E+01  0.1291012962752784E+01  0.1274784651244435E+01  0.1258343366638420E+01  0.1241713310349911E+01\n  0.1224917985773531E+01  0.1207980182599308E+01  0.1190921963841912E+01  0.1173764655453436E+01  0.1156528838389896E+01\n  0.1139234343002130E+01  0.1121900245622720E+01  0.1104544867221897E+01  0.1087185774007220E+01  0.1069839779843846E+01\n  0.1052522950374696E+01  0.1035250608722480E+01  0.1018037342658465E+01  0.1000897013126039E+01  0.9838427640104167E+00\n  0.9668870330493002E+00  0.9500415637828995E+00  0.9333174184453955E+00  0.9167249917036894E+00  0.9002740251531050E+00\n  0.8839736224835302E+00  0.8678322652333790E+00  0.8518578290525983E+00  0.8360576003997890E+00  0.8204382936023470E+00\n  0.8050060682122852E+00  0.7897665465941298E+00  0.7747248316849636E+00  0.7598855248702404E+00  0.7452527439225495E+00\n  0.7308301409539072E+00  0.7166209203354966E+00  0.7026278565420246E+00  0.6888533118809829E+00  0.6752992540701540E+00\n  0.6619672736296282E+00  0.6488586010574048E+00  0.6359741237603777E+00  0.6233144027150980E+00  0.6108796888351882E+00\n  0.5986699390246809E+00  0.5866848318987949E+00  0.5749237831558405E+00  0.5633859605859940E+00  0.5520702987046087E+00\n  0.5409755129995881E+00  0.5301001137840697E+00  0.5194424196473048E+00  0.5090005704981659E+00  0.4987725401971368E+00\n  0.4887561487740056E+00  0.4789490742297346E+00  0.4693488639221445E+00  0.4599529455361500E+00  0.4507586376402879E+00\n  0.4417631598321903E+00  0.4329636424765457E+00  0.4243571360398264E+00  0.4159406200268177E+00  0.4077110115246057E+00\n  0.3996651733602655E+00  0.3917999218790373E+00  0.3841120343502322E+00  0.3765982560085148E+00  0.3692553067386082E+00\n  0.3620798874117488E+00  0.3550686858825059E+00  0.3482183826548197E+00  0.3415256562262722E+00  0.3349871881197929E+00\n  0.3285996676120873E+00  0.3223597961681734E+00  0.3162642915914723E+00  0.3103098918988991E+00  0.3044933589304323E+00\n  0.2988114817025848E+00  0.2932610795151651E+00  0.2878390048206519E+00  0.2825421458654130E+00  0.2773674291118858E+00\n  0.2723118214507413E+00  0.2673723322118953E+00  0.2625460149830915E+00  0.2578299692446370E+00  0.2532213418286768E+00\n  0.2487173282112436E+00  0.2443151736451206E+00  0.2400121741413617E+00  0.2358056773071348E+00  0.2316930830473297E+00\n  0.2276718441371882E+00  0.2237394666729961E+00  0.2198935104076650E+00  0.2161315889778330E+00  0.2124513700288889E+00\n  0.2088505752441177E+00  0.2053269802839583E+00  0.2018784146411472E+00  0.1985027614173130E+00  0.1951979570263882E+00\n  0.1919619908299856E+00  0.1887929047096988E+00  0.1856887925810768E+00  0.1826477998538276E+00  0.1796681228426198E+00\n  0.1767480081326520E+00  0.1738857519039822E+00  0.1710796992184251E+00  0.1683282432726463E+00  0.1656298246209137E+00\n  0.1629829303707959E+00  0.1603860933549304E+00  0.1578378912818327E+00  0.1553369458685551E+00  0.1528819219578573E+00\n  0.1504715266224071E+00  0.1481045082583851E+00  0.1457796556707337E+00  0.1434957971521608E+00  0.1412517995578756E+00\n  0.1390465673779208E+00  0.1368790418088395E+00  0.1347481998263070E+00  0.1326530532602482E+00  0.1305926478738530E+00\n  0.1285660624478085E+00  0.1265724078709661E+00  0.1246108262385681E+00  0.1226804899590787E+00  0.1207806008705706E+00\n  0.1189103893675429E+00  0.1170691135389732E+00  0.1152560583183238E+00  0.1134705346461653E+00  0.1117118786460041E+00\n  0.1099794508138442E+00  0.1082726352219536E+00  0.1065908387372449E+00  0.1049334902546352E+00  0.1033000399456902E+00\n  0.1016899585228177E+00  0.1001027365192277E+00  0.9853788358483354E-01  0.9699492779823146E-01  0.9547341499485665E-01\n  0.9397290811138079E-01  0.9249298654638069E-01  0.9103324553728220E-01  0.8959329555354877E-01  0.8817276170606399E-01\n  0.8677128317262857E-01  0.8538851263947052E-01  0.8402411575864875E-01  0.8267777062120664E-01  0.8134916724591848E-01\n  0.8003800708345375E-01  0.7874400253576731E-01  0.7746687649051477E-01  0.7620636187027600E-01  0.7496220119635953E-01\n  0.7373414616695294E-01  0.7252195724937327E-01  0.7132540328616367E-01  0.7014426111477837E-01  0.6897831520058859E-01\n  0.6782735728294027E-01  0.6669118603398869E-01  0.6556960673003079E-01  0.6446243093505667E-01  0.6336947619623536E-01\n  0.6229056575105237E-01  0.6122552824581402E-01  0.6017419746523230E-01  0.5913641207280737E-01  0.5811201536172281E-01\n  0.5710085501597033E-01  0.5610278288142408E-01  0.5511765474658521E-01  0.5414533013271837E-01  0.5318567209310896E-01\n  0.5223854702116695E-01  0.5130382446711163E-01  0.5038137696297216E-01  0.4947107985564236E-01  0.4857281114773465E-01\n  0.4768645134597841E-01  0.4681188331691594E-01  0.4594899214965088E-01  0.4509766502540915E-01  0.4425779109367826E-01\n  0.4342926135469399E-01  0.4261196854804814E-01  0.4180580704719781E-01  0.4101067275965932E-01  0.4022646303267519E-01\n  0.3945307656414969E-01  0.3869041331864940E-01  0.3793837444827467E-01  0.3719686221820911E-01  0.3646577993676117E-01\n  0.3574503188971662E-01  0.3503452327882445E-01  0.3433416016424531E-01  0.3364384941079507E-01  0.3296349863782079E-01\n  0.3229301617255276E-01  0.3163231100677876E-01  0.3098129275669249E-01  0.3033987162577284E-01  0.2970795837055464E-01\n  0.2908546426915543E-01  0.2847230109242889E-01  0.2786838107761748E-01  0.2727361690438311E-01  0.2668792167309761E-01\n  0.2611120888527847E-01  0.2554339242606102E-01  0.2498438654859956E-01  0.2443410586029598E-01  0.2389246531075691E-01\n  0.2335938018138393E-01  0.2283476607650571E-01  0.2231853891596374E-01  0.2181061492906659E-01  0.2131091064983147E-01\n  0.2081934291343454E-01  0.2033582885379438E-01  0.1986028590221680E-01  0.1939263178703108E-01  0.1893278453415130E-01\n  0.1848066246849892E-01  0.1803618421622546E-01  0.1759926870767613E-01  0.1716983518103927E-01  0.1674780318662707E-01\n  0.1633309259173651E-01  0.1592562358604172E-01  0.1552531668746990E-01  0.1513209274851720E-01  0.1474587296296080E-01\n  0.1436657887292672E-01  0.1399413237627429E-01  0.1362845573426023E-01  0.1326947157944628E-01  0.1291710292381743E-01\n  0.1257127316707774E-01  0.1223190610509324E-01  0.1189892593845275E-01  0.1157225728111806E-01  0.1125182516913743E-01\n  0.1093755506939646E-01  0.1062937288838200E-01  0.1032720498093588E-01  0.1003097815897619E-01  0.9740619700164219E-02\n  0.9456057356497178E-02  0.9177219362806280E-02  0.8904034445141316E-02  0.8636431829023183E-02  0.8374341247546036E-02\n  0.8117692949311960E-02  0.7866417706180585E-02  0.7620446820816740E-02  0.7379712134019578E-02  0.7144146031816014E-02\n  0.6913681452302325E-02  0.6688251892216657E-02  0.6467791413225554E-02  0.6252234647907211E-02  0.6041516805413253E-02\n  0.5835573676791136E-02  0.5634341639947666E-02  0.5437757664233824E-02  0.5245759314629934E-02  0.5058284755509180E-02\n  0.4875272753955811E-02  0.4696662682613547E-02  0.4522394522037392E-02  0.4352408862520555E-02  0.4186646905366133E-02\n  0.4025050463570553E-02  0.3867561961883894E-02  0.3714124436208813E-02  0.3564681532297067E-02  0.3419177503699341E-02\n  0.3277557208920367E-02  0.3139766107727285E-02  0.3005750256555324E-02  0.2875456302949815E-02  0.2748831478978852E-02\n  0.2625823593545541E-02  0.2506381023522792E-02  0.2390452703627873E-02  0.2277988114946939E-02  0.2168937272013016E-02\n  0.2063250708333439E-02  0.1960879460254761E-02  0.1861775049045227E-02  0.1765889461065943E-02  0.1673175125893125E-02\n  0.1583584892244586E-02  0.1497072001553956E-02  0.1413590059026983E-02  0.1333093002004349E-02  0.1255535065446408E-02\n  0.1180870744346243E-02  0.1109054752869345E-02  0.1040041980010902E-02  0.9737874415562595E-03  0.9102462281261181E-03\n  0.8493734490870866E-03  0.7911241721104120E-03  0.7354533581681445E-03  0.6823157917680999E-03  0.6316660062474194E-03\n  0.5834582039715675E-03  0.5376461713226330E-03  0.4941831884102573E-03  0.4530219335027502E-03  0.4141143822583456E-03\n  0.3774117019399670E-03  0.3428641409258591E-03  0.3104209139870729E-03  0.2800300839961760E-03  0.2516384409654113E-03\n  0.2251913795924475E-03  0.2006327768245250E-03  0.1779048713433524E-03  0.1569481473297049E-03  0.1377012253937927E-03\n  0.1201007641585952E-03  0.1040813766598551E-03  0.8957556647504338E-04  0.7651368930508610E-04  0.6482394658893534E-04\n  0.5443241860150438E-04  0.4526314532314971E-04  0.3723826410463467E-04  0.3027821368846399E-04  0.2430201435404447E-04\n  0.1922763365777299E-04  0.1497244622116435E-04  0.1145379401469120E-04  0.8589650285013768E-05  0.6299385349542388E-05\n  0.4504625622961494E-05  0.3130188220885624E-05  0.2105062280742719E-05  0.1363395085845545E-05  0.8454270900288885E-06\n  0.4983067594254876E-06  0.2767065679872027E-06  0.1431594160449781E-06  0.6804490613003522E-07  0.2918182930693568E-07\n  0.1102919874006033E-07  0.3560261260656263E-08  0.9406176465862757E-09  0.1916420214061158E-09  0.2763777688791933E-10\n  0.2482312356945943E-11  0.1136644735947497E-12  0.1904831683752850E-14  0.6466043629846817E-17  0.1381172060080856E-20\n  0.1274303700193166E-26  0.2106088550891557E-38  0.1212886175035114E-71  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.8576998932607242E-09  0.5148474978702150E-07  0.5500333859843751E-06  0.2898571356744415E-05\n  0.1037065667137954E-04  0.2904394432880980E-04  0.6869069328866988E-04  0.1435525383839498E-03  0.2729524897641136E-03\n  0.4817179545381958E-03  0.8004046139757985E-03  0.1265323067409609E-02  0.1918378981427738E-02  0.2806743664553777E-02\n  0.3982376035816319E-02  0.5501419303057878E-02  0.7423496677200373E-02  0.9810930426149240E-02  0.1272790776956854E-01\n  0.1623961574245743E-01  0.2041136538278681E-01  0.2530772356585144E-01  0.3099166862766308E-01  0.3752378368081732E-01\n  0.4496149929855063E-01  0.5335839507962672E-01  0.6276356754813610E-01  0.7322106991690198E-01  0.8476942747035206E-01\n  0.9744123071429918E-01  0.1112628070018588E+00  0.1262539700776599E+00  0.1424278458837341E+00  0.1597907720342443E+00\n  0.1783422675846084E+00  0.1980750690841191E+00  0.2189752283993167E+00  0.2410222674169928E+00  0.2641893844693322E+00\n  0.2884437071578631E+00  0.3137465861762969E+00  0.3400539247340754E+00  0.3673165382520538E+00  0.3954805391293457E+00\n  0.4244877415567311E+00  0.4542760815685687E+00  0.4847800477740307E+00  0.5159311184824792E+00  0.5476582012304797E+00\n  0.5798880710234582E+00  0.6125458039182285E+00  0.6455552028889719E+00  0.6788392132348257E+00  0.7123203250985853E+00\n  0.7459209609702914E+00  0.7795638463441852E+00  0.8131723619807327E+00  0.8466708764954843E+00  0.8799850582522438E+00\n  0.9130421657784031E+00  0.9457713161447614E+00  0.9781037309602292E+00  0.1009972959823397E+01  0.1041315081248019E+01\n  0.1072068881238206E+01  0.1102176009831869E+01  0.1131581116058128E+01  0.1160231961866557E+01  0.1188079515683897E+01\n  0.1215078026337852E+01  0.1241185078158618E+01  0.1266361628127532E+01  0.1290572025989520E+01  0.1313784018282635E+01\n  0.1335968737264703E+01  0.1357100675734715E+01  0.1377157648755932E+01  0.1396120743289401E+01  0.1413974256741546E+01\n  0.1430705625418266E+01  0.1446305343861415E+01  0.1460766876022088E+01  0.1474086559199635E+01  0.1486263501646126E+01\n  0.1497299474703849E+01  0.1507198800308697E+01  0.1515968234655533E+01  0.1523616848783268E+01  0.1530155906797786E+01\n  0.1535598742410441E+01  0.1539960634428920E+01  0.1543258681796175E+01  0.1545511678732089E+01  0.1546739990491811E+01\n  0.1546965430214609E+01  0.1546211137297620E+01  0.1544501457690412E+01  0.1541861826468803E+01  0.1538318653010165E+01\n  0.1533899209057386E+01  0.1528631519925127E+01  0.1522544259069783E+01  0.1515666646213862E+01  0.1508028349186392E+01\n  0.1499659389613263E+01  0.1490590052565443E+01  0.1480850800248451E+01  0.1470472189793603E+01  0.1459484795190111E+01\n  0.1447919133377286E+01  0.1435805594497667E+01  0.1423174376295045E+01  0.1410055422625766E+01  0.1396478366037582E+01\n  0.1382472474357517E+01  0.1368066601218609E+01  0.1353289140445096E+01  0.1338167984206406E+01  0.1322730484842268E+01\n  0.1307003420254224E+01  0.1291012962752784E+01  0.1274784651244435E+01  0.1258343366638420E+01  0.1241713310349911E+01\n  0.1224917985773531E+01  0.1207980182599308E+01  0.1190921963841912E+01  0.1173764655453436E+01  0.1156528838389896E+01\n  0.1139234343002130E+01  0.1121900245622720E+01  0.1104544867221897E+01  0.1087185774007220E+01  0.1069839779843846E+01\n  0.1052522950374696E+01  0.1035250608722480E+01  0.1018037342658465E+01  0.1000897013126039E+01  0.9838427640104167E+00\n  0.9668870330493002E+00  0.9500415637828995E+00  0.9333174184453955E+00  0.9167249917036894E+00  0.9002740251531050E+00\n  0.8839736224835302E+00  0.8678322652333790E+00  0.8518578290525983E+00  0.8360576003997890E+00  0.8204382936023470E+00\n  0.8050060682122852E+00  0.7897665465941298E+00  0.7747248316849636E+00  0.7598855248702404E+00  0.7452527439225495E+00\n  0.7308301409539072E+00  0.7166209203354966E+00  0.7026278565420246E+00  0.6888533118809829E+00  0.6752992540701540E+00\n  0.6619672736296282E+00  0.6488586010574048E+00  0.6359741237603777E+00  0.6233144027150980E+00  0.6108796888351882E+00\n  0.5986699390246809E+00  0.5866848318987949E+00  0.5749237831558405E+00  0.5633859605859940E+00  0.5520702987046087E+00\n  0.5409755129995881E+00  0.5301001137840697E+00  0.5194424196473048E+00  0.5090005704981659E+00  0.4987725401971368E+00\n  0.4887561487740056E+00  0.4789490742297346E+00  0.4693488639221445E+00  0.4599529455361500E+00  0.4507586376402879E+00\n  0.4417631598321903E+00  0.4329636424765457E+00  0.4243571360398264E+00  0.4159406200268177E+00  0.4077110115246057E+00\n  0.3996651733602655E+00  0.3917999218790373E+00  0.3841120343502322E+00  0.3765982560085148E+00  0.3692553067386082E+00\n  0.3620798874117488E+00  0.3550686858825059E+00  0.3482183826548197E+00  0.3415256562262722E+00  0.3349871881197929E+00\n  0.3285996676120873E+00  0.3223597961681734E+00  0.3162642915914723E+00  0.3103098918988991E+00  0.3044933589304323E+00\n  0.2988114817025848E+00  0.2932610795151651E+00  0.2878390048206519E+00  0.2825421458654130E+00  0.2773674291118858E+00\n  0.2723118214507413E+00  0.2673723322118953E+00  0.2625460149830915E+00  0.2578299692446370E+00  0.2532213418286768E+00\n  0.2487173282112436E+00  0.2443151736451206E+00  0.2400121741413617E+00  0.2358056773071348E+00  0.2316930830473297E+00\n  0.2276718441371882E+00  0.2237394666729961E+00  0.2198935104076650E+00  0.2161315889778330E+00  0.2124513700288889E+00\n  0.2088505752441177E+00  0.2053269802839583E+00  0.2018784146411472E+00  0.1985027614173130E+00  0.1951979570263882E+00\n  0.1919619908299856E+00  0.1887929047096988E+00  0.1856887925810768E+00  0.1826477998538276E+00  0.1796681228426198E+00\n  0.1767480081326520E+00  0.1738857519039822E+00  0.1710796992184251E+00  0.1683282432726463E+00  0.1656298246209137E+00\n  0.1629829303707959E+00  0.1603860933549304E+00  0.1578378912818327E+00  0.1553369458685551E+00  0.1528819219578573E+00\n  0.1504715266224071E+00  0.1481045082583851E+00  0.1457796556707337E+00  0.1434957971521608E+00  0.1412517995578756E+00\n  0.1390465673779208E+00  0.1368790418088395E+00  0.1347481998263070E+00  0.1326530532602482E+00  0.1305926478738530E+00\n  0.1285660624478085E+00  0.1265724078709661E+00  0.1246108262385681E+00  0.1226804899590787E+00  0.1207806008705706E+00\n  0.1189103893675429E+00  0.1170691135389732E+00  0.1152560583183238E+00  0.1134705346461653E+00  0.1117118786460041E+00\n  0.1099794508138442E+00  0.1082726352219536E+00  0.1065908387372449E+00  0.1049334902546352E+00  0.1033000399456902E+00\n  0.1016899585228177E+00  0.1001027365192277E+00  0.9853788358483354E-01  0.9699492779823146E-01  0.9547341499485665E-01\n  0.9397290811138079E-01  0.9249298654638069E-01  0.9103324553728220E-01  0.8959329555354877E-01  0.8817276170606399E-01\n  0.8677128317262857E-01  0.8538851263947052E-01  0.8402411575864875E-01  0.8267777062120664E-01  0.8134916724591848E-01\n  0.8003800708345375E-01  0.7874400253576731E-01  0.7746687649051477E-01  0.7620636187027600E-01  0.7496220119635953E-01\n  0.7373414616695294E-01  0.7252195724937327E-01  0.7132540328616367E-01  0.7014426111477837E-01  0.6897831520058859E-01\n  0.6782735728294027E-01  0.6669118603398869E-01  0.6556960673003079E-01  0.6446243093505667E-01  0.6336947619623536E-01\n  0.6229056575105237E-01  0.6122552824581402E-01  0.6017419746523230E-01  0.5913641207280737E-01  0.5811201536172281E-01\n  0.5710085501597033E-01  0.5610278288142408E-01  0.5511765474658521E-01  0.5414533013271837E-01  0.5318567209310896E-01\n  0.5223854702116695E-01  0.5130382446711163E-01  0.5038137696297216E-01  0.4947107985564236E-01  0.4857281114773465E-01\n  0.4768645134597841E-01  0.4681188331691594E-01  0.4594899214965088E-01  0.4509766502540915E-01  0.4425779109367826E-01\n  0.4342926135469399E-01  0.4261196854804814E-01  0.4180580704719781E-01  0.4101067275965932E-01  0.4022646303267519E-01\n  0.3945307656414969E-01  0.3869041331864940E-01  0.3793837444827467E-01  0.3719686221820911E-01  0.3646577993676117E-01\n  0.3574503188971662E-01  0.3503452327882445E-01  0.3433416016424531E-01  0.3364384941079507E-01  0.3296349863782079E-01\n  0.3229301617255276E-01  0.3163231100677876E-01  0.3098129275669249E-01  0.3033987162577284E-01  0.2970795837055464E-01\n  0.2908546426915543E-01  0.2847230109242889E-01  0.2786838107761748E-01  0.2727361690438311E-01  0.2668792167309761E-01\n  0.2611120888527847E-01  0.2554339242606102E-01  0.2498438654859956E-01  0.2443410586029598E-01  0.2389246531075691E-01\n  0.2335938018138393E-01  0.2283476607650571E-01  0.2231853891596374E-01  0.2181061492906659E-01  0.2131091064983147E-01\n  0.2081934291343454E-01  0.2033582885379438E-01  0.1986028590221680E-01  0.1939263178703108E-01  0.1893278453415130E-01\n  0.1848066246849892E-01  0.1803618421622546E-01  0.1759926870767613E-01  0.1716983518103927E-01  0.1674780318662707E-01\n  0.1633309259173651E-01  0.1592562358604172E-01  0.1552531668746990E-01  0.1513209274851720E-01  0.1474587296296080E-01\n  0.1436657887292672E-01  0.1399413237627429E-01  0.1362845573426023E-01  0.1326947157944628E-01  0.1291710292381743E-01\n  0.1257127316707774E-01  0.1223190610509324E-01  0.1189892593845275E-01  0.1157225728111806E-01  0.1125182516913743E-01\n  0.1093755506939646E-01  0.1062937288838200E-01  0.1032720498093588E-01  0.1003097815897619E-01  0.9740619700164219E-02\n  0.9456057356497178E-02  0.9177219362806280E-02  0.8904034445141316E-02  0.8636431829023183E-02  0.8374341247546036E-02\n  0.8117692949311960E-02  0.7866417706180585E-02  0.7620446820816740E-02  0.7379712134019578E-02  0.7144146031816014E-02\n  0.6913681452302325E-02  0.6688251892216657E-02  0.6467791413225554E-02  0.6252234647907211E-02  0.6041516805413253E-02\n  0.5835573676791136E-02  0.5634341639947666E-02  0.5437757664233824E-02  0.5245759314629934E-02  0.5058284755509180E-02\n  0.4875272753955811E-02  0.4696662682613547E-02  0.4522394522037392E-02  0.4352408862520555E-02  0.4186646905366133E-02\n  0.4025050463570553E-02  0.3867561961883894E-02  0.3714124436208813E-02  0.3564681532297067E-02  0.3419177503699341E-02\n  0.3277557208920367E-02  0.3139766107727285E-02  0.3005750256555324E-02  0.2875456302949815E-02  0.2748831478978852E-02\n  0.2625823593545541E-02  0.2506381023522792E-02  0.2390452703627873E-02  0.2277988114946939E-02  0.2168937272013016E-02\n  0.2063250708333439E-02  0.1960879460254761E-02  0.1861775049045227E-02  0.1765889461065943E-02  0.1673175125893125E-02\n  0.1583584892244586E-02  0.1497072001553956E-02  0.1413590059026983E-02  0.1333093002004349E-02  0.1255535065446408E-02\n  0.1180870744346243E-02  0.1109054752869345E-02  0.1040041980010902E-02  0.9737874415562595E-03  0.9102462281261181E-03\n  0.8493734490870866E-03  0.7911241721104120E-03  0.7354533581681445E-03  0.6823157917680999E-03  0.6316660062474194E-03\n  0.5834582039715675E-03  0.5376461713226330E-03  0.4941831884102573E-03  0.4530219335027502E-03  0.4141143822583456E-03\n  0.3774117019399670E-03  0.3428641409258591E-03  0.3104209139870729E-03  0.2800300839961760E-03  0.2516384409654113E-03\n  0.2251913795924475E-03  0.2006327768245250E-03  0.1779048713433524E-03  0.1569481473297049E-03  0.1377012253937927E-03\n  0.1201007641585952E-03  0.1040813766598551E-03  0.8957556647504338E-04  0.7651368930508610E-04  0.6482394658893534E-04\n  0.5443241860150438E-04  0.4526314532314971E-04  0.3723826410463467E-04  0.3027821368846399E-04  0.2430201435404447E-04\n  0.1922763365777299E-04  0.1497244622116435E-04  0.1145379401469120E-04  0.8589650285013768E-05  0.6299385349542388E-05\n  0.4504625622961494E-05  0.3130188220885624E-05  0.2105062280742719E-05  0.1363395085845545E-05  0.8454270900288885E-06\n  0.4983067594254876E-06  0.2767065679872027E-06  0.1431594160449781E-06  0.6804490613003522E-07  0.2918182930693568E-07\n  0.1102919874006033E-07  0.3560261260656263E-08  0.9406176465862757E-09  0.1916420214061158E-09  0.2763777688791933E-10\n  0.2482312356945943E-11  0.1136644735947497E-12  0.1904831683752850E-14  0.6466043629846817E-17  0.1381172060080856E-20\n  0.1274303700193166E-26  0.2106088550891557E-38  0.1212886175035114E-71  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.3765610317640694E+00  0.7400358894127599E+00  0.1090712381667745E+01  0.1428873061247002E+01\n  0.1754795319320031E+01  0.2068751483890357E+01  0.2371008922950546E+01  0.2661830152878451E+01  0.2941472952229258E+01\n  0.3210190480819170E+01  0.3468231403786657E+01  0.3715840020150198E+01  0.3953256395252374E+01  0.4180716496383695E+01\n  0.4398452330811846E+01  0.4606692085398965E+01  0.4805660266967400E+01  0.4995577842570571E+01  0.5176662378836555E+01\n  0.5349128179575754E+01  0.5513186420878141E+01  0.5669045282968079E+01  0.5816910078133630E+01  0.5956983374101555E+01\n  0.6089465112286805E+01  0.6214552720405558E+01  0.6332441219002502E+01  0.6443323321505209E+01  0.6547389527480199E+01\n  0.6644828208826436E+01  0.6735825688701171E+01  0.6820566313030878E+01  0.6899232514514866E+01  0.6972004869081964E+01\n  0.7039062144810148E+01  0.7100581343365575E+01  0.7156737734061032E+01  0.7207704880673625E+01  0.7253654661198675E+01\n  0.7294757280749858E+01  0.7331181277846054E+01  0.7363093524351962E+01  0.7390659219363427E+01  0.7414041877348629E+01\n  0.7433403310874117E+01  0.7448903608259055E+01  0.7460701106512816E+01  0.7468952359920434E+01  0.7473812104646840E+01\n  0.7475433219735298E+01  0.7473966684877387E+01  0.7469561535331859E+01  0.7462364814367910E+01  0.7452521523604532E+01\n  0.7440174571612401E+01  0.7425464721137732E+01  0.7408530535299623E+01  0.7389508323102637E+01  0.7368532084596213E+01\n  0.7345733456000793E+01  0.7321241655108376E+01  0.7295183427252115E+01  0.7267682992125909E+01  0.7238861991720891E+01\n  0.7208839439630969E+01  0.7177731671964857E+01  0.7145652300086835E+01  0.7112712165393094E+01  0.7079019296315407E+01\n  0.7044678867728360E+01  0.7009793162921103E+01  0.6974461538279471E+01  0.6938780390809384E+01  0.6902843128617441E+01\n  0.6866740144450676E+01  0.6830558792382606E+01  0.6794383367719482E+01  0.6758295090186962E+01  0.6722372090444448E+01\n  0.6686689399961921E+01  0.6651318944281731E+01  0.6616329539676658E+01  0.6581786893203926E+01  0.6547753606144576E+01\n  0.6514289180807551E+01  0.6481450030667977E+01  0.6449289493800484E+01  0.6417857849559566E+01  0.6387202338451258E+01\n  0.6357367185132800E+01  0.6328393624470087E+01  0.6300319930576388E+01  0.6273181448749665E+01  0.6247010630220808E+01\n  0.6221837069619801E+01  0.6197687545062726E+01  0.6174586060758330E+01  0.6152553892029570E+01  0.6131609632642339E+01\n  0.6111769244331025E+01  0.6093046108408382E+01  0.6075451079345281E+01  0.6058992540204510E+01  0.6043676459811814E+01\n  0.6029506451546534E+01  0.6016483833633909E+01  0.6004607690820981E+01  0.5993874937318422E+01  0.5984280380890941E+01\n  0.5975816787979942E+01  0.5968474949742999E+01  0.5962243748896129E+01  0.5957110227246338E+01  0.5953059653803552E+01\n  0.5950075593363216E+01  0.5948139975452642E+01  0.5947233163536738E+01  0.5947334024380974E+01  0.5948419997472152E+01\n  0.5950467164400099E+01  0.5953450318106323E+01  0.5957343031908459E+01  0.5962117728212475E+01  0.5967745746827388E+01\n  0.5974197412800709E+01  0.5981442103695763E+01  0.5989448316235365E+01  0.5998183732239485E+01  0.6007615283788049E+01\n  0.6017709217542990E+01  0.6028431158167253E+01  0.6039746170781648E+01  0.6051618822403686E+01  0.6064013242315937E+01\n  0.6076893181314657E+01  0.6090222069792634E+01  0.6103963074613425E+01  0.6118079154737412E+01  0.6132533115562999E+01\n  0.6147287661949624E+01  0.6162305449892092E+01  0.6177549136818604E+01  0.6192981430488190E+01  0.6208565136465474E+01\n  0.6224263204154009E+01  0.6240038771371831E+01  0.6255855207455509E+01  0.6271676154881747E+01  0.6287465569397743E+01\n  0.6303187758654289E+01  0.6318807419337479E+01  0.6334289672797612E+01  0.6349600099175650E+01  0.6364704770029900E+01\n  0.6379570279467482E+01  0.6394163773787110E+01  0.6408452979641630E+01  0.6422406230730219E+01  0.6435992493032277E+01\n  0.6449181388596262E+01  0.6461943217898319E+01  0.6474248980787193E+01  0.6486070396033000E+01  0.6497379919498787E+01\n  0.6508150760955191E+01  0.6518356899559369E+01  0.6527973098020561E+01  0.6536974915475707E+01  0.6545338719099223E+01\n  0.6553041694472095E+01  0.6560061854736102E+01  0.6566378048559677E+01  0.6571969966942736E+01  0.6576818148888014E+01\n  0.6580903985967331E+01  0.6584209725811516E+01  0.6586718474552983E+01  0.6588414198250604E+01  0.6589281723326368E+01\n  0.6589306736044133E+01  0.6588475781060250E+01  0.6586776259076728E+01  0.6584196423626929E+01  0.6580725377024553E+01\n  0.6576353065506066E+01  0.6571070273597098E+01  0.6564868617732960E+01  0.6557740539163546E+01  0.6549679296172584E+01\n  0.6540678955640928E+01  0.6530734383983693E+01  0.6519841237490329E+01  0.6507995952096807E+01  0.6495195732618538E+01\n  0.6481438541472563E+01  0.6466723086916791E+01  0.6451048810834144E+01  0.6434415876088694E+01  0.6416825153480584E+01\n  0.6398278208326170E+01  0.6378777286689151E+01  0.6358325301288192E+01  0.6336925817105747E+01  0.6314583036722893E+01\n  0.6291301785403415E+01  0.6267087495951198E+01  0.6241946193363197E+01  0.6215884479300494E+01  0.6188909516399138E+01\n  0.6161029012441793E+01  0.6132251204410994E+01  0.6102584842443767E+01  0.6072039173707282E+01  0.6040623926214209E+01\n  0.6008349292596213E+01  0.5975225913853303E+01  0.5941264863095957E+01  0.5906477629296895E+01  0.5870876101068294E+01\n  0.5834472550479789E+01  0.5797279616932335E+01  0.5759310291102085E+01  0.5720577898967909E+01  0.5681096085935931E+01\n  0.5640878801073526E+01  0.5599940281464876E+01  0.5558295036699770E+01  0.5515957833506386E+01  0.5472943680538803E+01\n  0.5429267813328917E+01  0.5384945679412595E+01  0.5339992923638538E+01  0.5294425373668760E+01  0.5248259025678392E+01\n  0.5201510030262340E+01  0.5154194678555982E+01  0.5106329388576237E+01  0.5057930691789439E+01  0.5009015219911397E+01\n  0.4959599691945191E+01  0.4909700901461299E+01  0.4859335704124821E+01  0.4808521005473441E+01  0.4757273748950229E+01\n  0.4705610904194174E+01  0.4653549455591696E+01  0.4601106391091448E+01  0.4548298691284878E+01  0.4495143318754116E+01\n  0.4441657207689196E+01  0.4387857253775341E+01  0.4333760304351776E+01  0.4279383148842287E+01  0.4224742509458196E+01\n  0.4169855032173684E+01  0.4114737277973392E+01  0.4059405714371826E+01  0.4003876707203877E+01  0.3948166512685741E+01\n  0.3892291269744721E+01  0.3836266992617200E+01  0.3780109563712459E+01  0.3723834726741400E+01  0.3667458080107569E+01\n  0.3610995070558891E+01  0.3554460987097478E+01  0.3497870955145241E+01  0.3441239930962816E+01  0.3384582696318687E+01\n  0.3327913853406216E+01  0.3271247820004922E+01  0.3214598824883478E+01  0.3157980903440747E+01  0.3101407893581784E+01\n  0.3044893431825231E+01  0.2988450949638577E+01  0.2932093669997769E+01  0.2875834604167262E+01  0.2819686548696998E+01\n  0.2763662082632170E+01  0.2707773564932239E+01  0.2652033132094799E+01  0.2596452695980827E+01  0.2541043941836626E+01\n  0.2485818326509053E+01  0.2430787076849344E+01  0.2375961188301807E+01  0.2321351423672851E+01  0.2266968312076604E+01\n  0.2212822148052429E+01  0.2158922990850521E+01  0.2105280663881218E+01  0.2051904754323755E+01  0.1998804612890416E+01\n  0.1945989353741675E+01  0.1893467854548430E+01  0.1841248756696710E+01  0.1789340465631234E+01  0.1737751151333199E+01\n  0.1686488748928507E+01  0.1635560959422214E+01  0.1584975250555055E+01  0.1534738857778293E+01  0.1484858785342541E+01\n  0.1435341807496924E+01  0.1386194469794414E+01  0.1337423090499684E+01  0.1289033762095411E+01  0.1241032352883452E+01\n  0.1193424508676993E+01  0.1146215654580135E+01  0.1099410996851037E+01  0.1053015524845333E+01  0.1007034013035967E+01\n  0.9614710231061919E+00  0.9163309061121906E+00  0.8716178047119132E+00  0.8273356554569915E+00  0.7834881911441322E+00\n  0.7400789432232032E+00  0.6971112442584428E+00  0.6545882304400988E+00  0.6125128441430950E+00  0.5708878365301393E+00\n  0.5297157701959697E+00  0.4889990218502538E+00  0.4487397850361310E+00  0.4089400728816994E+00  0.3696017208819437E+00\n  0.3307263897082250E+00  0.2923155680431669E+00  0.2543705754380062E+00  0.2168925651904757E+00  0.1798825272404206E+00\n  0.1433412910812248E+00  0.1072695286845231E+00  0.7166775743626266E-01  0.3653634308175027E-01  0.1875502677966891E-02\n -0.3231469244926006E-01 -0.6603431374472693E-01 -0.9928357246226212E-01 -0.1320628167035092E+00 -0.1643725284591359E+00\n -0.1962133206540352E+00 -0.2275859341981871E+00 -0.2584912350448162E+00 -0.2889302112573159E+00 -0.3189039700865247E+00\n -0.3484137350596561E+00 -0.3774608430824280E+00 -0.4060467415555353E+00 -0.4341729855069461E+00 -0.4618412347410261E+00\n -0.4890532510058743E+00 -0.5158108951799040E+00 -0.5421161244787339E+00 -0.5679709896834355E+00 -0.5933776323912099E+00\n -0.6183382822893291E+00 -0.6428552544532798E+00 -0.6669309466699765E+00 -0.6905678367868668E+00 -0.7137684800877064E+00\n -0.7365355066956285E+00 -0.7588716190043869E+00 -0.7807795891382519E+00 -0.8022622564412896E+00 -0.8233225249964942E+00\n -0.8439633611754367E+00 -0.8641877912188305E+00 -0.8839988988484928E+00 -0.9033998229112149E+00 -0.9223937550548300E+00\n -0.9409839374369939E+00 -0.9591736604667737E+00 -0.9769662605796675E+00 -0.9943651180460338E+00 -0.1011373654813408E+01\n -0.1027995332382722E+01 -0.1044233649718800E+01 -0.1060092141195189E+01 -0.1075574374573462E+01 -0.1090683949017157E+01\n -0.1105424493140398E+01 -0.1119799663091301E+01 -0.1133813140670142E+01 -0.1147468631482395E+01 -0.1160769863126533E+01\n -0.1173720583416712E+01 -0.1186324558640121E+01 -0.1198585571849071E+01 -0.1210507421187702E+01 -0.1222093918253196E+01\n -0.1233348886491358E+01 -0.1244276159626517E+01 -0.1254879580125511E+01 -0.1265162997695628E+01 -0.1275130267816335E+01\n -0.1284785250304552E+01 -0.1294131807913390E+01 -0.1303173804963923E+01 -0.1311915106009982E+01 -0.1320359574535607E+01\n -0.1328511071684896E+01 -0.1336373455024057E+01 -0.1343950577335306E+01 -0.1351246285442432E+01 -0.1358264419067570E+01\n -0.1365008809719085E+01 -0.1371483279610062E+01 -0.1377691640607245E+01 -0.1383637693209943E+01 -0.1389325225558719E+01\n -0.1394758012473418E+01 -0.1399939814520254E+01 -0.1404874377107532E+01 -0.1409565429609723E+01 -0.1414016684519505E+01\n -0.1418231836627389E+01 -0.1422214562228558E+01 -0.1425968518356584E+01 -0.1429497342043625E+01 -0.1432804649606689E+01\n -0.1435894035959656E+01 -0.1438769073950589E+01 -0.1441433313724035E+01 -0.1443890282107847E+01 -0.1446143482024210E+01\n -0.1448196391924410E+01 -0.1450052465247018E+01 -0.1451715129899050E+01 -0.1453187787759769E+01 -0.1454473814206628E+01\n -0.1455576557663118E+01 -0.1456499339167960E+01 -0.1457245451965397E+01 -0.1457818161116118E+01 -0.1458220703128390E+01\n -0.1458456285609144E+01 -0.1458528086934452E+01 -0.1458439255939184E+01 -0.1458192911625301E+01 -0.1457792142888557E+01\n -0.1457240008263066E+01 -0.1456539535683532E+01 -0.1455693722264615E+01 -0.1454705534097164E+01 -0.1453577906060864E+01\n -0.1452313741653029E+01 -0.1450915912833076E+01 -0.1449387259882392E+01 -0.1447730591279191E+01 -0.1445948683588039E+01\n -0.1444044281363676E+01 -0.1442020097068773E+01 -0.1439878811005344E+01 -0.1437623071259354E+01 -0.1435255493658342E+01\n -0.1432778661741579E+01 -0.1430195126742490E+01 -0.1427507407583088E+01 -0.1424717990879937E+01 -0.1421829330961478E+01\n -0.1418843849896296E+01 -0.1415763937532114E+01 -0.1412591951545110E+01 -0.1409330217499327E+01 -0.1405981028915838E+01\n -0.1402546647351420E+01 -0.1399029302486348E+01 -0.1395431192221163E+01 -0.1391754482782035E+01 -0.1388001308834431E+01\n -0.1384173773604920E+01 -0.1380273949010718E+01 -0.1376303875796823E+01 -0.1372265563680394E+01 -0.1368160991502163E+01\n -0.1363992107384622E+01 -0.1359760828896748E+01 -0.1355469043224972E+01 -0.1351118607350228E+01 -0.1346711348230812E+01\n -0.1342249062990785E+01 -0.1337733519113769E+01 -0.1333166454641865E+01 -0.1328549578379474E+01 -0.1323884570101832E+01\n -0.1319173080768030E+01 -0.1314416732738336E+01 -0.1309617119995603E+01 -0.1304775808370537E+01 -0.1299894335770717E+01\n -0.1294974212413071E+01 -0.1290016921059716E+01 -0.1285023917256931E+01 -0.1279996629577071E+01 -0.1274936459863322E+01\n -0.1269844783477041E+01 -0.1264722949547587E+01 -0.1259572281224406E+01 -0.1254394075931317E+01 -0.1249189605622732E+01\n -0.1243960117041727E+01 -0.1238706831979822E+01 -0.1233430947538271E+01 -0.1228133636390794E+01 -0.1222816047047525E+01\n -0.1217479304120173E+01 -0.1212124508588114E+01 -0.1206752738065413E+01 -0.1201365047068555E+01 -0.1195962467284892E+01\n -0.1190546007841516E+01 -0.1185116655574617E+01 -0.1179675375299079E+01 -0.1174223110078329E+01 -0.1168760781494218E+01\n -0.1163289289916911E+01 -0.1157809514774660E+01 -0.1152322314823388E+01 -0.1146828528415948E+01 -0.1141328973770988E+01\n -0.1135824449241374E+01 -0.1130315733582035E+01 -0.1124803586217146E+01 -0.1119288747506621E+01 -0.1113771939011809E+01\n -0.1108253863760298E+01 -0.1102735206509786E+01 -0.1097216634010968E+01 -0.1091698795269313E+01 -0.1086182321805725E+01\n -0.1080667827915982E+01 -0.1075155910928945E+01 -0.1069647151463423E+01 -0.1064142113683687E+01 -0.1058641345553532E+01\n -0.1053145379088904E+01 -0.1047654730608969E+01 -0.1042169900985625E+01 -0.1036691375891408E+01 -0.1031219626045731E+01\n -0.1025755107459436E+01 -0.1020298261677578E+01 -0.1014849516020502E+01 -0.1009409283823040E+01 -0.1003977964671914E+01\n -0.9985559446412423E+00 -0.9931435965261650E+00 -0.9877412800745212E+00 -0.9823493422165672E+00 -0.9769681172927177E+00\n -0.9715979272792943E+00 -0.9662390820122231E+00 -0.9608918794086823E+00 -0.9555566056867116E+00 -0.9502335355826994E+00\n -0.9449229325667899E+00 -0.9396250490561532E+00 -0.9343401266261530E+00 -0.9290683962193379E+00 -0.9238100783522983E+00\n -0.9185653833203373E+00 -0.9133345113999997E+00 -0.9081176530493820E+00 -0.9029149891062611E+00 -0.8977266909840595E+00\n -0.8925529208655598E+00 -0.8873938318944620E+00 -0.8822495683646910E+00 -0.8771202659075404E+00 -0.8720060516765797E+00\n -0.8669070445303514E+00 -0.8618233552128786E+00 -0.8567550865319589E+00 -0.8517023335352547E+00 -0.8466651836841759E+00\n -0.8416437170255952E+00 -0.8366380063613471E+00 -0.8316481174155630E+00 -0.8266741089998076E+00 -0.8217160331760809E+00\n -0.8167739354176268E+00 -0.8118478547676139E+00 -0.8069378239956513E+00 -0.8020438697521995E+00 -0.7971660127208436E+00\n -0.7923042677684496E+00 -0.7874586440932471E+00 -0.7826291453708021E+00 -0.7778157698979398E+00 -0.7730185107345809E+00\n -0.7682373558435663E+00 -0.7634722882284258E+00 -0.7587232860691486E+00 -0.7539903228559367E+00 -0.7492733675209987E+00\n -0.7445723845683611E+00 -0.7398873342017247E+00 -0.7352181724504098E+00 -0.7305648512933688E+00 -0.7259273187813085E+00\n -0.7213055191569296E+00 -0.7166993929733191E+00 -0.7121088772104908E+00 -0.7075339053901175E+00 -0.7029744076884417E+00\n -0.6984303110474385E+00 -0.6939015392841926E+00 -0.6893880131985548E+00 -0.6848896506790639E+00 -0.6804063668071960E+00\n -0.6759380739599310E+00 -0.6714846819106545E+00 -0.6670460979284606E+00 -0.6626222268758263E+00 -0.6582129713047191E+00\n -0.6538182315511271E+00 -0.6494379058280859E+00 -0.6450718903171657E+00 -0.6407200792584876E+00 -0.6363823650392715E+00\n -0.6320586382809613E+00 -0.6277487879249267E+00 -0.6234527013167734E+00 -0.6191702642893190E+00 -0.6149013612442086E+00\n -0.6106458752322457E+00 -0.6064036880324198E+00 -0.6021746802297080E+00 -0.5979587312916264E+00 -0.5937557196436042E+00\n -0.5895655227431641E+00 -0.5853880171529922E+00 -0.5812230786128654E+00 -0.5770705821105107E+00 -0.5729304019514115E+00\n -0.5688024118275793E+00 -0.5646864848853448E+00 -0.5605824937921645E+00 -0.5564903108025173E+00 -0.5524098078228833E+00\n -0.5483408564758644E+00 -0.5442833281634526E+00 -0.5402370941295085E+00 -0.5362020255214600E+00 -0.5321779934512643E+00\n -0.5281648690556621E+00 -0.5241625235557782E+00 -0.5201708283160628E+00 -0.5161896549026552E+00 -0.5122188751411803E+00\n -0.5082583611740192E+00 -0.5043079855170916E+00 -0.5003676211161868E+00 -0.4964371414029022E+00 -0.4925164203501901E+00\n -0.4886053325275901E+00 -0.4847037531561659E+00 -0.4808115581632069E+00 -0.4769286242367184E+00 -0.4730548288797583E+00\n -0.4691900504646559E+00 -0.4653341682871753E+00 -0.4614870626206452E+00 -0.4576486147701215E+00 -0.4538187071266341E+00\n -0.4499972232215512E+00 -0.4461840477811270E+00 -0.4423790667812826E+00 -0.4385821675026696E+00 -0.4347932385860811E+00\n -0.4310121700882537E+00 -0.4272388535381303E+00 -0.4234731819936421E+00 -0.4197150500990645E+00 -0.4159643541430195E+00\n -0.4122209921171803E+00 -0.4084848637757519E+00 -0.4047558706957974E+00 -0.4010339163384737E+00 -0.3973189061112476E+00\n -0.3936107474311905E+00 -0.3899093497893938E+00 -0.3862146248166102E+00 -0.3825264863501910E+00 -0.3788448505024144E+00\n -0.3751696357302771E+00 -0.3715007629068495E+00 -0.3678381553942878E+00 -0.3641817391185885E+00 -0.3605314426461966E+00\n -0.3568871972625555E+00 -0.3532489370527205E+00 -0.3496165989841241E+00 -0.3459901229916214E+00 -0.3423694520649201E+00\n -0.3387545323385251E+00 -0.3351453131843082E+00 -0.3315417473068326E+00 -0.3279437908415819E+00 -0.3243514034561918E+00\n -0.3207645484548654E+00 -0.3171831928860834E+00 -0.3136073076537766E+00 -0.3100368676321130E+00 -0.3064718517840476E+00\n -0.3029122432838121E+00 -0.2993580296435038E+00 -0.2958092028439498E+00 -0.2922657594700352E+00 -0.2887277008506632E+00\n -0.2851950332035602E+00 -0.2816677677851020E+00 -0.2781459210453749E+00 -0.2746295147886844E+00 -0.2711185763397140E+00\n -0.2676131387155659E+00 -0.2641132408039054E+00 -0.2606189275474402E+00 -0.2571302501349864E+00 -0.2536472661993449E+00\n -0.2501700400222663E+00 -0.2466986427467328E+00 -0.2432331525968512E+00 -0.2397736551055949E+00 -0.2363202433506903E+00\n -0.2328730181989250E+00 -0.2294320885591435E+00 -0.2259975716442418E+00 -0.2225695932424345E+00 -0.2191482879980940E+00\n -0.2157337997024620E+00 -0.2123262815945201E+00 -0.2089258966723290E+00 -0.2055328180151234E+00 -0.2021472291164557E+00\n -0.1987693242286884E+00 -0.1953993087191055E+00 -0.1920373994379287E+00 -0.1886838250985003E+00 -0.1853388266698828E+00\n -0.1820026577821215E+00 -0.1786755851443744E+00 -0.1753578889761193E+00 -0.1720498634515968E+00 -0.1687518171576267E+00\n -0.1654640735649029E+00 -0.1621869715128154E+00 -0.1589208657078173E+00 -0.1556661272352739E+00 -0.1524231440846908E+00\n -0.1491923216881294E+00 -0.1459740834715274E+00 -0.1427688714185721E+00 -0.1395771466466322E+00 -0.1363993899941623E+00\n -0.1332361026188316E+00 -0.1300878066054895E+00 -0.1269550455829047E+00 -0.1238383853480043E+00 -0.1207384144961449E+00\n -0.1176557450556807E+00 -0.1145910131248316E+00 -0.1115448795085540E+00 -0.1085180303527610E+00 -0.1055111777728831E+00\n -0.1025250604733206E+00 -0.9956044435388604E-01 -0.9661812309881886E-01 -0.9369891874337012E-01 -0.9080368221234399E-01\n -0.8793329382426256E-01 -0.8508866375406340E-01 -0.8227073244639434E-01 -0.7948047097061904E-01 -0.7671888130764398E-01\n -0.7398699655753553E-01 -0.7128588105567601E-01 -0.6861663038386651E-01 -0.6598037126130515E-01 -0.6337826129880289E-01\n -0.6081148859784694E-01 -0.5828127117427706E-01 -0.5578885618432740E-01 -0.5333551892862030E-01 -0.5092256160742038E-01\n -0.4855131179798897E-01 -0.4622312062232615E-01 -0.4393936057086534E-01 -0.4170142294489704E-01 -0.3951071487762254E-01\n -0.3736865589081760E-01 -0.3527667394121730E-01 -0.3323620090791550E-01 -0.3124866746947142E-01 -0.2931549731709577E-01\n -0.2743810064840861E-01 -0.2561786688503255E-01 -0.2385615655688409E-01 -0.2215429229678155E-01 -0.2051354889121152E-01\n -0.1893514233719176E-01 -0.1742021786166798E-01 -0.1596983686930661E-01 -0.1458496279764457E-01 -0.1326644587608198E-01\n -0.1201500680808027E-01 -0.1083121942521028E-01 -0.9715492398480059E-02 -0.8668050137937885E-02 -0.7688913067140435E-02\n -0.6777877525966872E-02 -0.5934495634602323E-02 -0.5158055544131036E-02 -0.4447562605453990E-02 -0.3801722107660840E-02\n -0.3218924367835703E-02 -0.2697233092980475E-02 -0.2234378075199077E-02 -0.1827753413977412E-02 -0.1474422570309129E-02\n -0.1171131627019387E-02 -0.9143321317637030E-03 -0.7002148003936321E-03 -0.5247551181118452E-03 -0.3837714480605755E-03\n -0.2729955946109330E-03 -0.1881548319023403E-03 -0.1250631789481358E-03 -0.7971820570180325E-04 -0.4839798665393986E-04\n -0.2775118225470492E-04 -0.1487196131798424E-04 -0.7351058493098910E-05 -0.3295260747991843E-05 -0.1310550608265630E-05\n -0.4491803501599659E-06 -0.1275625109004752E-06 -0.2842493719500779E-07 -0.4598019108179812E-08 -0.4812641260020268E-09\n -0.2729062991232811E-10 -0.6277478184238277E-12 -0.3532884035284522E-14 -0.1843992263449434E-17 -0.1064033801639711E-22\n -0.2179574996326970E-32 -0.2191274365894180E-56 -0.5812978673716309E-216  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.8687248663605213E+00  0.1707263902374461E+01  0.2516310697140216E+01  0.3296545407385949E+01\n  0.4048635017677018E+01  0.4773233612655782E+01  0.5470982663629552E+01  0.6142511330615299E+01  0.6788436779961467E+01\n  0.7409364516870689E+01  0.8005888731517908E+01  0.8578592656974877E+01  0.9128048936794247E+01  0.9654819999856910E+01\n  0.1015945843992924E+02  0.1064250739729831E+02  0.1110450093984054E+02  0.1154596444092118E+02  0.1196741495160918E+02\n  0.1236936156481509E+02  0.1275230576911170E+02  0.1311674179017046E+02  0.1346315691793700E+02  0.1379203181786923E+02\n  0.1410384082476923E+02  0.1439905221795016E+02  0.1467812847668937E+02  0.1494152651512514E+02  0.1518969789595702E+02\n  0.1542308902250295E+02  0.1564214130885283E+02  0.1584729132803401E+02  0.1603897093826909E+02  0.1621760738756086E+02\n  0.1638362339698061E+02  0.1653743722316642E+02  0.1667946270065578E+02  0.1681010926478216E+02  0.1692978195595912E+02\n  0.1703888140625709E+02  0.1713780380924828E+02  0.1722694087415465E+02  0.1730667976538239E+02  0.1737740302856498E+02\n  0.1743948850426588E+02  0.1749330923051193E+02  0.1753923333533993E+02  0.1757762392054244E+02  0.1760883893779540E+02\n  0.1763323105833935E+02  0.1765114753736991E+02  0.1766293007427053E+02  0.1766891466979376E+02  0.1766943148126528E+02\n  0.1766480467684931E+02  0.1765535228987511E+02  0.1764138607418140E+02  0.1762321136139172E+02  0.1760112692098567E+02\n  0.1757542482398380E+02  0.1754639031101227E+02  0.1751430166546395E+02  0.1747943009241989E+02  0.1744203960394378E+02\n  0.1740238691130952E+02  0.1736072132467072E+02  0.1731728466062878E+02  0.1727231115810628E+02  0.1722602740288191E+02\n  0.1717865226109467E+02  0.1713039682197727E+02  0.1708146435003250E+02  0.1703205024682137E+02  0.1698234202248845E+02\n  0.1693251927710871E+02  0.1688275369189969E+02  0.1683320903030526E+02  0.1678404114892058E+02  0.1673539801819411E+02\n  0.1668741975280949E+02  0.1664023865162014E+02  0.1659397924698056E+02  0.1654875836329216E+02  0.1650468518455595E+02\n  0.1646186133070283E+02  0.1642038094245007E+02  0.1638033077441462E+02  0.1634179029619614E+02  0.1630483180112684E+02\n  0.1626952052237267E+02  0.1623591475605696E+02  0.1620406599106814E+02  0.1617401904520420E+02  0.1614581220729854E+02\n  0.1611947738496719E+02  0.1609504025761150E+02  0.1607252043430844E+02  0.1605193161621790E+02  0.1603328176313632E+02\n  0.1601657326382578E+02  0.1600180310974979E+02  0.1598896307184925E+02  0.1597803987999542E+02  0.1596901540476141E+02\n  0.1596186684115860E+02  0.1595656689399044E+02  0.1595308396448294E+02  0.1595138233785788E+02  0.1595142237152340E+02\n  0.1595316068356454E+02  0.1595655034122527E+02  0.1596154104908305E+02  0.1596807933662661E+02  0.1597610874495764E+02\n  0.1598557001234738E+02  0.1599640125838981E+02  0.1600853816650400E+02  0.1602191416454864E+02  0.1603646060332359E+02\n  0.1605210693274370E+02  0.1606878087548201E+02  0.1608640859789002E+02  0.1610491487801469E+02  0.1612422327054205E+02\n  0.1614425626850959E+02  0.1616493546163930E+02  0.1618618169115549E+02  0.1620791520096096E+02  0.1623005578505677E+02\n  0.1625252293110075E+02  0.1627523596000996E+02  0.1629811416152313E+02  0.1632107692564781E+02  0.1634404386992741E+02\n  0.1636693496247232E+02  0.1638967064070816E+02  0.1641217192580325E+02  0.1643436053274611E+02  0.1645615897605117E+02\n  0.1647749067108008E+02  0.1649828003097248E+02  0.1651845255918834E+02  0.1653793493767038E+02  0.1655665511064232E+02\n  0.1657454236406513E+02  0.1659152740077896E+02  0.1660754241136564E+02  0.1662252114077064E+02  0.1663639895072981E+02\n  0.1664911287805092E+02  0.1666060168880418E+02  0.1667080592848118E+02  0.1667966796818515E+02  0.1668713204691969E+02\n  0.1669314431004635E+02  0.1669765284398512E+02  0.1670060770723475E+02  0.1670196095779233E+02  0.1670166667705496E+02\n  0.1669968099028751E+02  0.1669596208374337E+02  0.1669047021852679E+02  0.1668316774128659E+02  0.1667401909183290E+02\n  0.1666299080776961E+02  0.1665005152623624E+02  0.1663517198285345E+02  0.1661832500796750E+02  0.1659948552028914E+02\n  0.1657863051802247E+02  0.1655573906758000E+02  0.1653079228997926E+02  0.1650377334501676E+02  0.1647466741331476E+02\n  0.1644346167633494E+02  0.1641014529445382E+02  0.1637470938319258E+02  0.1633714698769450E+02  0.1629745305554087E+02\n  0.1625562440799640E+02  0.1621165970977314E+02  0.1616555943740087E+02  0.1611732584629117E+02  0.1606696293657995E+02\n  0.1601447641783236E+02  0.1595987367269281E+02  0.1590316371956016E+02  0.1584435717436734E+02  0.1578346621154290E+02\n  0.1572050452422970E+02  0.1565548728383454E+02  0.1558843109898079E+02  0.1551935397393391E+02  0.1544827526656816E+02\n  0.1537521564594045E+02  0.1530019704953602E+02  0.1522324264024800E+02  0.1514437676315159E+02  0.1506362490213083E+02\n  0.1498101363641504E+02  0.1489657059707905E+02  0.1481032442355990E+02  0.1472230472024070E+02  0.1463254201315024E+02\n  0.1454106770682513E+02  0.1444791404137927E+02  0.1435311404982355E+02  0.1425670151567689E+02  0.1415871093090752E+02\n  0.1405917745424228E+02  0.1395813686987899E+02  0.1385562554663566E+02  0.1375168039756887E+02  0.1364633884009084E+02\n  0.1353963875661431E+02  0.1343161845575160E+02  0.1332231663409325E+02  0.1321177233858961E+02  0.1310002492955745E+02\n  0.1298711404433202E+02  0.1287307956158335E+02  0.1275796156631419E+02  0.1264180031555601E+02  0.1252463620477686E+02\n  0.1240650973501518E+02  0.1228746148075084E+02  0.1216753205852430E+02  0.1204676209631323E+02  0.1192519220367461E+02\n  0.1180286294265961E+02  0.1167981479950663E+02  0.1155608815711772E+02  0.1143172326832159E+02  0.1130676022992646E+02\n  0.1118123895756377E+02  0.1105519916132396E+02  0.1092868032218412E+02  0.1080172166922607E+02  0.1067436215764326E+02\n  0.1054664044753408E+02  0.1041859488347744E+02  0.1029026347488684E+02  0.1016168387713817E+02  0.1003289337346536E+02\n  0.9903928857617679E+01  0.9774826817272114E+01  0.9645623318193554E+01  0.9516353989134197E+01  0.9387054007464796E+01\n  0.9257758085527723E+01  0.9128500457703609E+01  0.8999314868181001E+01  0.8870234559419087E+01  0.8741292261293285E+01\n  0.8612520180912444E+01  0.8483949993096608E+01  0.8355612831503974E+01  0.8227539280395387E+01  0.8099759367023964E+01\n  0.7972302554638278E+01  0.7845197736086287E+01  0.7718473228007762E+01  0.7592156765602027E+01  0.7466275497958868E+01\n  0.7340855983939128E+01  0.7215924188591989E+01  0.7091505480096169E+01  0.6967624627211525E+01  0.6844305797227783E+01\n  0.6721572554397537E+01  0.6599447858839925E+01  0.6477954065901652E+01  0.6357112925962435E+01  0.6236945584671568E+01\n  0.6117472583602064E+01  0.5998713861309926E+01  0.5880688754784813E+01  0.5763416001279670E+01  0.5646913740506246E+01\n  0.5531199517183574E+01  0.5416290283926924E+01  0.5302202404464881E+01  0.5188951657171522E+01  0.5076553238901992E+01\n  0.4965021769119214E+01  0.4854371294299406E+01  0.4744615292604905E+01  0.4635766678812629E+01  0.4527837809486449E+01\n  0.4420840488382136E+01  0.4314785972074110E+01  0.4209684975792541E+01  0.4105547679460195E+01  0.4002383733918524E+01\n  0.3900202267332557E+01  0.3799011891764151E+01  0.3698820709903869E+01  0.3599636321951710E+01  0.3501465832636705E+01\n  0.3404315858366423E+01  0.3308192534496821E+01  0.3213101522713837E+01  0.3119048018517560E+01  0.3026036758800617E+01\n  0.2934072029512395E+01  0.2843157673401020E+01  0.2753297097824851E+01  0.2664493282626155E+01  0.2576748788059156E+01\n  0.2490065762765371E+01  0.2404445951788702E+01  0.2319890704624000E+01  0.2236400983291912E+01  0.2153977370433589E+01\n  0.2072620077419250E+01  0.1992328952464182E+01  0.1913103488746359E+01  0.1834942832520140E+01  0.1757845791220436E+01\n  0.1681810841551835E+01  0.1606836137557940E+01  0.1532919518665786E+01  0.1460058517700443E+01  0.1388250368865471E+01\n  0.1317492015684907E+01  0.1247780118901998E+01  0.1179111064331551E+01  0.1111480970661150E+01  0.1044885697198059E+01\n  0.9793208515582879E+00  0.9147817972939893E+00  0.8512636614565350E+00  0.7887613420918976E+00  0.7272695156654265E+00\n  0.6667826444134151E+00  0.6072949836187563E+00  0.5488005888082287E+00  0.4912933228690584E+00  0.4347668630826892E+00\n  0.3792147080735970E+00  0.3246301846712228E+00  0.2710064546832890E+00  0.2183365215789164E+00  0.1666132370796914E+00\n  0.1158293076575852E+00  0.6597730093832276E-01  0.1704965200881259E-01 -0.3096133037222471E-01 -0.7806345766145839E-01\n -0.1242646555170061E+00 -0.1695729578839355E+00 -0.2139965011800796E+00 -0.2575435185826074E+00 -0.3002223344158743E+00\n -0.3420413586411577E+00 -0.3830090814482432E+00 -0.4231340679495004E+00 -0.4624249529762802E+00 -0.5008904359780200E+00\n -0.5385392760237241E+00 -0.5753802869061535E+00 -0.6114223323483075E+00 -0.6466743213121019E+00 -0.6811452034089456E+00\n -0.7148439644120911E+00 -0.7477796218700159E+00 -0.7799612208208035E+00 -0.8113978296067292E+00 -0.8420985357887053E+00\n -0.8720724421598169E+00 -0.9013286628575624E+00 -0.9298763195738665E+00 -0.9577245378622440E+00 -0.9848824435414749E+00\n -0.1011359159194722E+01 -0.1037163800763434E+01 -0.1062305474235226E+01 -0.1086793272424552E+01 -0.1110636271845517E+01\n -0.1133843529675753E+01 -0.1156424080810253E+01 -0.1178386935004340E+01 -0.1199741074104586E+01 -0.1220495449366658E+01\n -0.1240658978858965E+01 -0.1260240544951108E+01 -0.1279248991885808E+01 -0.1297693123433412E+01 -0.1315581700627601E+01\n -0.1332923439581261E+01 -0.1349727009381238E+01 -0.1366001030060941E+01 -0.1381754070649363E+01 -0.1396994647295475E+01\n -0.1411731221466749E+01 -0.1425972198220502E+01 -0.1439725924546859E+01 -0.1453000687782247E+01 -0.1465804714091862E+01\n -0.1478146167020199E+01 -0.1490033146108215E+01 -0.1501473685575904E+01 -0.1512475753069052E+01 -0.1523047248468980E+01\n -0.1533196002763981E+01 -0.1542929776981157E+01 -0.1552256261177614E+01 -0.1561183073489532E+01 -0.1569717759238136E+01\n -0.1577867790091117E+01 -0.1585640563278520E+01 -0.1593043400861668E+01 -0.1600083549054143E+01 -0.1606768177593432E+01\n -0.1613104379162233E+01 -0.1619099168858133E+01 -0.1624759483710538E+01 -0.1630092182243682E+01 -0.1635104044084646E+01\n -0.1639801769615148E+01 -0.1644191979666060E+01 -0.1648281215253528E+01 -0.1652075937355576E+01 -0.1655582526728141E+01\n -0.1658807283759452E+01 -0.1661756428361703E+01 -0.1664436099898922E+01 -0.1666852357150144E+01 -0.1669011178306643E+01\n -0.1670918461002464E+01 -0.1672580022377071E+01 -0.1674001599169259E+01 -0.1675188847841216E+01 -0.1676147344732051E+01\n -0.1676882586239485E+01 -0.1677399989029130E+01 -0.1677704890270234E+01 -0.1677802547897067E+01 -0.1677698140895068E+01\n -0.1677396769610920E+01 -0.1676903456085609E+01 -0.1676223144409744E+01 -0.1675360701100275E+01 -0.1674320915497755E+01\n -0.1673108500183398E+01 -0.1671728091415232E+01 -0.1670184249582419E+01 -0.1668481459677102E+01 -0.1666624131783108E+01\n -0.1664616601580613E+01 -0.1662463130866198E+01 -0.1660167908087604E+01 -0.1657735048892448E+01 -0.1655168596690241E+01\n -0.1652472523227175E+01 -0.1649650729172852E+01 -0.1646707044718564E+01 -0.1643645230186273E+01 -0.1640468976647931E+01\n -0.1637181906554373E+01 -0.1633787574373395E+01 -0.1630289467236240E+01 -0.1626691005592231E+01 -0.1622995543870765E+01\n -0.1619206371150311E+01 -0.1615326711833899E+01 -0.1611359726330491E+01 -0.1607308511741977E+01 -0.1603176102555118E+01\n -0.1598965471338085E+01 -0.1594679529441171E+01 -0.1590321127701217E+01 -0.1585893057149300E+01 -0.1581398049721393E+01\n -0.1576838778971485E+01 -0.1572217860786824E+01 -0.1567537854104941E+01 -0.1562801261632051E+01 -0.1558010530562515E+01\n -0.1553168053298982E+01 -0.1548276168172963E+01 -0.1543337160165420E+01 -0.1538353261627133E+01 -0.1533326652998501E+01\n -0.1528259463528551E+01 -0.1523153771992774E+01 -0.1518011607409659E+01 -0.1512834949755512E+01 -0.1507625730677423E+01\n -0.1502385834204081E+01 -0.1497117097454231E+01 -0.1491821311342496E+01 -0.1486500221282453E+01 -0.1481155527886632E+01\n -0.1475788887663291E+01 -0.1470401913709823E+01 -0.1464996176402467E+01 -0.1459573204082366E+01 -0.1454134483737546E+01\n -0.1448681461680846E+01 -0.1443215544223580E+01 -0.1437738098344736E+01 -0.1432250452355627E+01 -0.1426753896559857E+01\n -0.1421249683908433E+01 -0.1415739030649932E+01 -0.1410223116975571E+01 -0.1404703087659131E+01 -0.1399180052691527E+01\n -0.1393655087910084E+01 -0.1388129235622212E+01 -0.1382603505223591E+01 -0.1377078873810667E+01 -0.1371556286787404E+01\n -0.1366036658466202E+01 -0.1360520872663014E+01 -0.1355009783286443E+01 -0.1349504214920848E+01 -0.1344004963403421E+01\n -0.1338512796395142E+01 -0.1333028453945557E+01 -0.1327552649051373E+01 -0.1322086068208856E+01 -0.1316629371959906E+01\n -0.1311183195431850E+01 -0.1305748148870926E+01 -0.1300324818169403E+01 -0.1294913765386324E+01 -0.1289515529261906E+01\n -0.1284130625725508E+01 -0.1278759548397190E+01 -0.1273402769082885E+01 -0.1268060738263149E+01 -0.1262733885575457E+01\n -0.1257422620290157E+01 -0.1252127331779953E+01 -0.1246848389983009E+01 -0.1241586145859656E+01 -0.1236340931842745E+01\n -0.1231113062281559E+01 -0.1225902833879501E+01 -0.1220710526125339E+01 -0.1215536401718194E+01 -0.1210380706986247E+01\n -0.1205243672299176E+01 -0.1200125512474344E+01 -0.1195026427176832E+01 -0.1189946601313249E+01 -0.1184886205419436E+01\n -0.1179845396042039E+01 -0.1174824316114016E+01 -0.1169823095324133E+01 -0.1164841850480436E+01 -0.1159880685867766E+01\n -0.1154939693599391E+01 -0.1150018953962708E+01 -0.1145118535759160E+01 -0.1140238496638358E+01 -0.1135378883426438E+01\n -0.1130539732448745E+01 -0.1125721069846856E+01 -0.1120922911890006E+01 -0.1116145265280953E+01 -0.1111388127456360E+01\n -0.1106651486881709E+01 -0.1101935323340800E+01 -0.1097239608219940E+01 -0.1092564304786787E+01 -0.1087909368463974E+01\n -0.1083274747097547E+01 -0.1078660381220247E+01 -0.1074066204309709E+01 -0.1069492143041646E+01 -0.1064938117538041E+01\n -0.1060404041610429E+01 -0.1055889822998297E+01 -0.1051395363602706E+01 -0.1046920559715141E+01 -0.1042465302241655E+01\n -0.1038029476922388E+01 -0.1033612964546500E+01 -0.1029215641162557E+01 -0.1024837378284490E+01 -0.1020478043093089E+01\n -0.1016137498633167E+01 -0.1011815604006419E+01 -0.1007512214560045E+01 -0.1003227182071147E+01 -0.9989603549270579E+00\n -0.9947115783015485E+00 -0.9904806943270184E+00 -0.9862675422627522E+00 -0.9820719586592493E+00 -0.9778937775186953E+00\n -0.9737328304516771E+00 -0.9695889468301108E+00 -0.9654619539365238E+00 -0.9613516771097025E+00 -0.9572579398867307E+00\n -0.9531805641415736E+00 -0.9491193702201466E+00 -0.9450741770719889E+00 -0.9410448023785890E+00 -0.9370310626784017E+00\n -0.9330327734886064E+00 -0.9290497494236897E+00 -0.9250818043108714E+00 -0.9211287513024286E+00 -0.9171904029850091E+00\n -0.9132665714859235E+00 -0.9093570685765163E+00 -0.9054617057726567E+00 -0.9015802944323839E+00 -0.8977126458507625E+00\n -0.8938585713520132E+00 -0.8900178823789437E+00 -0.8861903905797556E+00 -0.8823759078922311E+00 -0.8785742466254294E+00\n -0.8747852195388349E+00 -0.8710086399190866E+00 -0.8672443216543031E+00 -0.8634920793060465E+00 -0.8597517281789752E+00\n -0.8560230843882563E+00 -0.8523059649247257E+00 -0.8486001877179036E+00 -0.8449055716968552E+00 -0.8412219368489985E+00\n -0.8375491042768192E+00 -0.8338868962526480E+00 -0.8302351362714315E+00 -0.8265936491016083E+00 -0.8229622608341091E+00\n -0.8193407989295268E+00 -0.8157290922634788E+00 -0.8121269711702471E+00 -0.8085342674846857E+00 -0.8049508145824523E+00\n -0.8013764474186241E+00 -0.7978110025647080E+00 -0.7942543182440929E+00 -0.7907062343659974E+00 -0.7871665925579165E+00\n -0.7836352361966469E+00 -0.7801120104378853E+00 -0.7765967622444689E+00 -0.7730893404132703E+00 -0.7695895956008084E+00\n -0.7660973803475873E+00 -0.7626125491011952E+00 -0.7591349582382320E+00 -0.7556644660850415E+00 -0.7522009329373659E+00\n -0.7487442210788564E+00 -0.7452941947985601E+00 -0.7418507204073561E+00 -0.7384136662534099E+00 -0.7349829027366561E+00\n -0.7315583023223650E+00 -0.7281397395537861E+00 -0.7247270910639445E+00 -0.7213202355865901E+00 -0.7179190539663420E+00\n -0.7145234291680540E+00 -0.7111332462854418E+00 -0.7077483925489899E+00 -0.7043687573331715E+00 -0.7009942321630125E+00\n -0.6976247107200276E+00 -0.6942600888475667E+00 -0.6909002645555757E+00 -0.6875451380248399E+00 -0.6841946116106925E+00\n -0.6808485898462595E+00 -0.6775069794452312E+00 -0.6741696893042333E+00 -0.6708366305047628E+00 -0.6675077163147983E+00\n -0.6641828621900246E+00 -0.6608619857747765E+00 -0.6575450069026729E+00 -0.6542318475970094E+00 -0.6509224320708961E+00\n -0.6476166867272263E+00 -0.6443145401584339E+00 -0.6410159231461258E+00 -0.6377207686605807E+00 -0.6344290118601643E+00\n -0.6311405900906676E+00 -0.6278554428846229E+00 -0.6245735119605972E+00 -0.6212947412225088E+00 -0.6180190767589913E+00\n -0.6147464668428325E+00 -0.6114768619305104E+00 -0.6082102146618701E+00 -0.6049464798599574E+00 -0.6016856145310354E+00\n -0.5984275778648340E+00 -0.5951723312350204E+00 -0.5919198381999848E+00 -0.5886700645038960E+00 -0.5854229780781174E+00\n -0.5821785490429797E+00 -0.5789367497099552E+00 -0.5756975545842548E+00 -0.5724609403678959E+00 -0.5692268859632494E+00\n -0.5659953724771183E+00 -0.5627663832253617E+00 -0.5595399037381192E+00 -0.5563159217656418E+00 -0.5530944272847829E+00\n -0.5498754125061794E+00 -0.5466588718821447E+00 -0.5434448021153181E+00 -0.5402332021681084E+00 -0.5370240732729479E+00\n -0.5338174189434215E+00 -0.5306132449862715E+00 -0.5274115595143415E+00 -0.5242123729604776E+00 -0.5210156980924291E+00\n -0.5178215500287884E+00 -0.5146299462559857E+00 -0.5114409066464112E+00 -0.5082544534776542E+00 -0.5050706114529327E+00\n -0.5018894077227221E+00 -0.4987108719076290E+00 -0.4955350361225455E+00 -0.4923619350021070E+00 -0.4891916057274888E+00\n -0.4860240880545712E+00 -0.4828594243435082E+00 -0.4796976595897113E+00 -0.4765388414562883E+00 -0.4733830203079488E+00\n -0.4702302492464025E+00 -0.4670805841472636E+00 -0.4639340836984699E+00 -0.4607908094402333E+00 -0.4576508258065108E+00\n -0.4545142001680199E+00 -0.4513810028767579E+00 -0.4482513073120319E+00 -0.4451251899279745E+00 -0.4420027303025001E+00\n -0.4388840111876836E+00 -0.4357691185614755E+00 -0.4326581416807331E+00 -0.4295511731354427E+00 -0.4264483089040742E+00\n -0.4233496484099363E+00 -0.4202552945784125E+00 -0.4171653538949250E+00 -0.4140799364634484E+00 -0.4109991560653700E+00\n -0.4079231302184809E+00 -0.4048519802358120E+00 -0.4017858312840442E+00 -0.3987248124411331E+00 -0.3956690567527806E+00\n -0.3926187012873193E+00 -0.3895738871885333E+00 -0.3865347597258667E+00 -0.3835014683414236E+00 -0.3804741666930851E+00\n -0.3774530126929794E+00 -0.3744381685404753E+00 -0.3714298007487684E+00 -0.3684280801640104E+00 -0.3654331819758509E+00\n -0.3624452857181055E+00 -0.3594645752581452E+00 -0.3564912387734580E+00 -0.3535254687136594E+00 -0.3505674617460703E+00\n -0.3476174186827757E+00 -0.3446755443868791E+00 -0.3417420476554580E+00 -0.3388171410764583E+00 -0.3359010408565321E+00\n -0.3329939666165476E+00 -0.3300961411511784E+00 -0.3272077901487176E+00 -0.3243291418668700E+00 -0.3214604267599845E+00\n -0.3186018770527939E+00 -0.3157537262553701E+00 -0.3129162086136159E+00 -0.3100895584892342E+00 -0.3072740096627376E+00\n -0.3044697945526863E+00 -0.3016771433440111E+00 -0.2988962830179719E+00 -0.2961274362760575E+00 -0.2933708203499825E+00\n -0.2906266456898650E+00 -0.2878951145227867E+00 -0.2851764192741990E+00 -0.2824707408451726E+00 -0.2797782467393001E+00\n -0.2770990890342526E+00 -0.2744334021946651E+00 -0.2717813007251957E+00 -0.2691428766655449E+00 -0.2665181969328780E+00\n -0.2639073005217756E+00 -0.2613101955776174E+00 -0.2587268563663881E+00 -0.2561572201724773E+00 -0.2536011841663135E+00\n -0.2510586022957567E+00 -0.2485292822692960E+00 -0.2460129827152067E+00 -0.2435094106190135E+00 -0.2410182191615573E+00\n -0.2385390061013152E+00 -0.2360713128665393E+00 -0.2336146245440482E+00 -0.2311683709702571E+00 -0.2287319291436186E+00\n -0.2263046271825591E+00 -0.2238857500445038E+00 -0.2214745471939171E+00 -0.2190702423535930E+00 -0.2166720453861016E+00\n -0.2142791662241082E+00 -0.2118908305935776E+00 -0.2095062970515578E+00 -0.2071248745972281E+00 -0.2047459398312080E+00\n -0.2023689523724028E+00 -0.1999934670554019E+00 -0.1976191414090548E+00 -0.1952457371550912E+00 -0.1928731150462155E+00\n -0.1905012233025302E+00 -0.1881300810881581E+00 -0.1857597595959972E+00 -0.1833903639169085E+00 -0.1810220185223115E+00\n -0.1786548578143285E+00 -0.1762890213721006E+00 -0.1739246522622315E+00 -0.1715618967099617E+00 -0.1692009041513801E+00\n -0.1668418273480159E+00 -0.1644848225100573E+00 -0.1621300494242820E+00 -0.1597776715867397E+00 -0.1574278563403202E+00\n -0.1550807750173627E+00 -0.1527366030874480E+00 -0.1503955203105244E+00 -0.1480577108955310E+00 -0.1457233636646466E+00\n -0.1433926722233472E+00 -0.1410658351364051E+00 -0.1387430561099922E+00 -0.1364245441800418E+00 -0.1341105139070126E+00\n -0.1318011855772175E+00 -0.1294967854108453E+00 -0.1271975457768302E+00 -0.1249037054146965E+00 -0.1226155096635082E+00\n -0.1203332106980454E+00 -0.1180570677723090E+00 -0.1157873474704553E+00 -0.1135243239652422E+00 -0.1112682792840448E+00\n -0.1090195035824928E+00 -0.1067782954257439E+00 -0.1045449620773913E+00 -0.1023198197959724E+00 -0.1001031941390004E+00\n -0.9789542027442202E-01 -0.9569684329933507E-01 -0.9350781856577459E-01 -0.9132871201329762E-01 -0.8915990050804710E-01\n -0.8700177218790264E-01 -0.8485472681323365E-01 -0.8271917612269755E-01 -0.8059554419341119E-01 -0.7848426780471512E-01\n -0.7638579680463178E-01 -0.7430059447796174E-01 -0.7222913791482828E-01 -0.7017191837828506E-01 -0.6812944166942314E-01\n -0.6610222848819827E-01 -0.6409081478795155E-01 -0.6209575212134812E-01 -0.6011760797515669E-01 -0.5815696609097321E-01\n -0.5621442676864546E-01 -0.5429060714874503E-01 -0.5238614147002400E-01 -0.5050168129729559E-01 -0.4863789571467226E-01\n -0.4679547147851291E-01 -0.4497511312379645E-01 -0.4317754301696363E-01 -0.4140350134749559E-01 -0.3965374604968968E-01\n -0.3792905264519061E-01 -0.3623021399585374E-01 -0.3455803995547253E-01 -0.3291335690774033E-01 -0.3129700717659555E-01\n -0.2970984829376720E-01 -0.2815275210690626E-01 -0.2662660371018717E-01 -0.2513230017763598E-01 -0.2367074907776015E-01\n -0.2224286674626115E-01 -0.2084957629177444E-01 -0.1949180530768286E-01 -0.1817048326111876E-01 -0.1688653852836564E-01\n -0.1564089504398897E-01 -0.1443446852927493E-01 -0.1326816226396534E-01 -0.1214286236395461E-01 -0.1105943252668154E-01\n -0.1001870820551502E-01 -0.9021490174708021E-02 -0.8068537447652485E-02 -0.7160559513483508E-02 -0.6298207860858848E-02\n -0.5482066763324758E-02 -0.4712643308532483E-02 -0.3990356664167553E-02 -0.3315526587400327E-02 -0.2688361202633861E-02\n -0.2108944095059771E-02 -0.1577220795897805E-02 -0.1092984770086615E-02 -0.6558630595718385E-03 -0.2653017861664537E-03\n  0.7944822189490764E-04  0.3793453454019918E-03  0.6355702167323619E-03  0.8495373838452211E-03  0.1022904990027115E-02\n  0.1157581756795607E-02  0.1255730447553756E-02  0.1319766883295748E-02  0.1352353488459118E-02  0.1356386278494535E-02\n  0.1334974179358035E-02  0.1291409617048463E-02  0.1229129462600355E-02  0.1151665700113620E-02  0.1062585641275423E-02\n  0.9654221768740550E-03  0.8635954616548462E-03  0.7603285776664598E-03  0.6585610737771120E-03  0.5608657269660935E-03\n  0.4693752087118773E-03  0.3857262433307593E-03  0.3110288768033999E-03  0.2458671434387088E-03  0.1903343314865707E-03\n  0.1441011800570143E-03  0.1065093644667441E-03  0.7667716125666785E-04  0.5360156636052818E-04  0.3624338213230885E-04\n  0.2358881126340773E-04  0.1468957244294401E-04  0.8688517982512364E-05  0.4836926461183601E-05  0.2505806106186696E-05\n  0.1190778874910442E-05  0.5095498141563876E-06  0.1916497626697207E-06  0.6134629795982277E-07  0.1599283622173898E-07\n  0.3192844313628801E-08  0.4465991345509002E-09  0.3830055172706218E-10  0.1633011596692233E-11  0.2440735408533676E-13\n  0.6817882595562817E-16  0.1011756708173479E-19  0.4237417807138562E-26  0.7509788045435901E-39  0.4267446943283257E-77\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.5899841183367943E+00  0.1161355619573833E+01  0.1714505862663386E+01  0.2249819256784396E+01\n  0.2767673391510573E+01  0.3268439177645294E+01  0.3752481000506378E+01  0.4220156886514003E+01  0.4671818683172639E+01\n  0.5107812251922465E+01  0.5528477672848820E+01  0.5934149459862732E+01  0.6325156784687305E+01  0.6701823707789128E+01\n  0.7064469414269955E+01  0.7413408452670304E+01  0.7748950974623735E+01  0.8071402973330306E+01  0.8381066518882308E+01\n  0.8678239988567556E+01  0.8963218290390984E+01  0.9236293078186977E+01  0.9497752956839562E+01  0.9747883676281340E+01\n  0.9986968313100460E+01  0.1021528743874655E+02  0.1043311927348773E+02  0.1064073982542990E+02  0.1083842301406511E+02\n  0.1102644077796590E+02  0.1120506316638604E+02  0.1137455841466486E+02  0.1153519300345998E+02  0.1168723170195367E+02\n  0.1183093759528836E+02  0.1196657209658812E+02  0.1209439494401590E+02  0.1221466418339854E+02  0.1232763613702556E+02\n  0.1243356535929262E+02  0.1253270457991625E+02  0.1262530463549414E+02  0.1271161439022432E+02  0.1279188064662818E+02\n  0.1286634804714671E+02  0.1293525896749568E+02  0.1299885340267705E+02  0.1305736884654751E+02  0.1311104016584454E+02\n  0.1316009946956320E+02  0.1320477597456633E+02  0.1324529586829482E+02  0.1328188216942499E+02  0.1331475458729735E+02\n  0.1334412938091442E+02  0.1337021921827631E+02  0.1339323303679160E+02  0.1341337590546720E+02  0.1343084888954589E+02\n  0.1344584891822348E+02  0.1345856865604004E+02  0.1346919637850042E+02  0.1347791585244115E+02  0.1348490622162011E+02\n  0.1349034189796659E+02  0.1349439245888940E+02  0.1349722255100133E+02  0.1349899180057996E+02  0.1349985473104553E+02\n  0.1349996068770030E+02  0.1349945376993611E+02  0.1349847277108194E+02  0.1349715112602811E+02  0.1349561686673074E+02\n  0.1349399258566773E+02  0.1349239540728639E+02  0.1349093696745374E+02  0.1348972340089195E+02  0.1348885533655486E+02\n  0.1348842790087613E+02  0.1348853072879561E+02  0.1348924798244868E+02  0.1349065837738147E+02  0.1349283521613647E+02\n  0.1349584642903438E+02  0.1349975462196169E+02  0.1350461713095838E+02  0.1351048608338651E+02  0.1351740846544771E+02\n  0.1352542619580703E+02  0.1353457620507051E+02  0.1354489052085530E+02  0.1355639635818421E+02  0.1356911621492991E+02\n  0.1358306797202959E+02  0.1359826499818650E+02  0.1361471625877207E+02  0.1363242642864042E+02  0.1365139600856614E+02\n  0.1367162144501598E+02  0.1369309525296598E+02  0.1371580614147713E+02  0.1373973914174481E+02  0.1376487573734043E+02\n  0.1379119399636717E+02  0.1381866870525614E+02  0.1384727150393395E+02  0.1387697102209792E+02  0.1390773301634148E+02\n  0.1393952050787757E+02  0.1397229392061555E+02  0.1400601121935343E+02  0.1404062804785455E+02  0.1407609786658558E+02\n  0.1411237208990064E+02  0.1414940022246391E+02  0.1418712999471152E+02  0.1422550749716204E+02  0.1426447731339282E+02\n  0.1430398265150846E+02  0.1434396547393582E+02  0.1438436662538888E+02  0.1442512595885534E+02  0.1446618245946512E+02\n  0.1450747436611004E+02  0.1454893929069182E+02  0.1459051433488456E+02  0.1463213620430574E+02  0.1467374131999813E+02\n  0.1471526592713335E+02  0.1475664620085529E+02  0.1479781834918989E+02  0.1483871871295512E+02  0.1487928386261246E+02\n  0.1491945069200887E+02  0.1495915650896474E+02  0.1499833912267056E+02  0.1503693692786206E+02  0.1507488898574914E+02\n  0.1511213510168126E+02  0.1514861589953717E+02  0.1518427289283329E+02  0.1521904855255031E+02  0.1525288637168290E+02\n  0.1528573092652318E+02  0.1531752793469264E+02  0.1534822430994272E+02  0.1537776821374822E+02  0.1540610910372214E+02\n  0.1543319777888478E+02  0.1545898642182323E+02  0.1548342863778163E+02  0.1550647949072526E+02  0.1552809553642536E+02\n  0.1554823485261403E+02  0.1556685706626144E+02  0.1558392337803033E+02  0.1559939658396475E+02  0.1561324109447264E+02\n  0.1562542295066320E+02  0.1563590983810227E+02  0.1564467109805053E+02  0.1565167773625032E+02  0.1565690242932856E+02\n  0.1566031952888424E+02  0.1566190506332994E+02  0.1566163673755728E+02  0.1565949393049741E+02  0.1565545769064767E+02\n  0.1564951072963612E+02  0.1564163741389599E+02  0.1563182375452176E+02  0.1562005739537916E+02  0.1560632759954093E+02\n  0.1559062523411967E+02  0.1557294275356961E+02  0.1555327418152762E+02  0.1553161509126428E+02  0.1550796258481429E+02\n  0.1548231527085568E+02  0.1545467324140574E+02  0.1542503804740110E+02  0.1539341267322875E+02  0.1535980151027311E+02\n  0.1532421032954375E+02  0.1528664625344730E+02  0.1524711772676548E+02  0.1520563448690045E+02  0.1516220753344726E+02\n  0.1511684909715194E+02  0.1506957260831226E+02  0.1502039266467727E+02  0.1496932499890005E+02  0.1491638644559677E+02\n  0.1486159490806366E+02  0.1480496932470243E+02  0.1474652963520277E+02  0.1468629674652943E+02  0.1462429249875961E+02\n  0.1456053963081552E+02  0.1449506174613458E+02  0.1442788327831924E+02  0.1435902945680608E+02  0.1428852627259312E+02\n  0.1421640044406208E+02  0.1414267938293157E+02  0.1406739116037524E+02  0.1399056447333767E+02  0.1391222861107943E+02\n  0.1383241342198120E+02  0.1375114928063558E+02  0.1366846705525355E+02  0.1358439807541183E+02  0.1349897410016506E+02\n  0.1341222728654655E+02  0.1332419015847903E+02  0.1323489557611632E+02  0.1314437670563505E+02  0.1305266698949474E+02\n  0.1295980011718308E+02  0.1286580999646230E+02  0.1277073072513102E+02  0.1267459656331543E+02  0.1257744190630183E+02\n  0.1247930125792220E+02  0.1238020920450298E+02  0.1228020038938623E+02  0.1217930948803182E+02  0.1207757118370758E+02\n  0.1197502014377439E+02  0.1187169099657116E+02  0.1176761830890495E+02  0.1166283656414955E+02  0.1155738014095610E+02\n  0.1145128329257739E+02  0.1134458012680787E+02  0.1123730458653994E+02  0.1112949043093634E+02  0.1102117121721842E+02\n  0.1091238028306897E+02  0.1080315072964744E+02  0.1069351540521540E+02  0.1058350688936919E+02  0.1047315747787608E+02\n  0.1036249916810981E+02  0.1025156364508113E+02  0.1014038226805835E+02  0.1002898605777191E+02  0.9917405684197892E+01\n  0.9805671454913359E+01  0.9693813304017528E+01  0.9581860781611367E+01  0.9469843043828288E+01  0.9357788843408597E+01\n  0.9245726520809420E+01  0.9133683995842015E+01  0.9021688759828107E+01  0.8909767868266561E+01  0.8797947934001263E+01\n  0.8686255120881437E+01  0.8574715137904995E+01  0.8463353233835596E+01  0.8352194192283553E+01  0.8241262327241410E+01\n  0.8130581479064045E+01  0.8020175010883365E+01  0.7910065805447962E+01  0.7800276262377434E+01  0.7690828295821206E+01\n  0.7581743332512092E+01  0.7473042310204099E+01  0.7364745676484368E+01  0.7256873387949169E+01  0.7149444909733861E+01\n  0.7042479215386244E+01  0.6935994787073786E+01  0.6830009616114025E+01  0.6724541203818547E+01  0.6619606562640385E+01\n  0.6515222217614777E+01  0.6411404208083596E+01  0.6308168089693712E+01  0.6205528936659299E+01  0.6103501344278738E+01\n  0.6002099431696649E+01  0.5901336844901273E+01  0.5801226759948285E+01  0.5701781886401747E+01  0.5603014470983003E+01\n  0.5504936301418622E+01  0.5407558710478755E+01  0.5310892580196972E+01  0.5214948346263076E+01  0.5119736002580636E+01\n  0.5025265105980838E+01  0.4931544781084478E+01  0.4838583725304196E+01  0.4746390213979240E+01  0.4654972105634751E+01\n  0.4564336847358377E+01  0.4474491480286574E+01  0.4385442645193613E+01  0.4297196588176073E+01  0.4209759166425876E+01\n  0.4123135854085263E+01  0.4037331748177098E+01  0.3952351574603862E+01  0.3868199694209329E+01  0.3784880108896700E+01\n  0.3702396467797228E+01  0.3620752073483427E+01  0.3539949888221543E+01  0.3459992540257458E+01  0.3380882330130837E+01\n  0.3302621237012444E+01  0.3225210925059441E+01  0.3148652749783842E+01  0.3072947764429528E+01  0.2998096726353141E+01\n  0.2924100103404396E+01  0.2850958080301697E+01  0.2778670564998860E+01  0.2707237195038878E+01  0.2636657343891009E+01\n  0.2566930127267545E+01  0.2498054409416378E+01  0.2430028809386447E+01  0.2362851707262292E+01  0.2296521250364838E+01\n  0.2231035359415401E+01  0.2166391734659781E+01  0.2102587861949918E+01  0.2039621018780374E+01  0.1977488280277051E+01\n  0.1916186525135823E+01  0.1855712441508784E+01  0.1796062532835888E+01  0.1737233123619909E+01  0.1679220365142876E+01\n  0.1622020241122005E+01  0.1565628573303434E+01  0.1510041026992134E+01  0.1455253116516494E+01  0.1401260210626005E+01\n  0.1348057537820834E+01  0.1295640191612015E+01  0.1244003135710985E+01  0.1193141209147503E+01  0.1143049131314995E+01\n  0.1093721506942225E+01  0.1045152830990733E+01  0.9973374934770503E+00  0.9502697842192204E+00  0.9039438975069450E+00\n  0.8583539366947573E+00  0.8134939187180027E+00  0.7693577785309419E+00  0.7259393734669808E+00  0.6832324875204686E+00\n  0.6412308355501580E+00  0.5999280674039510E+00  0.5593177719650326E+00  0.5193934811192902E+00  0.4801486736441256E+00\n  0.4415767790185855E+00  0.4036711811552292E+00  0.3664252220536028E+00  0.3298322053757856E+00  0.2938853999441776E+00\n  0.2585780431619257E+00  0.2239033443561915E+00  0.1898544880448611E+00  0.1564246371270075E+00  0.1236069359975595E+00\n  0.9139451358676925E-01  0.5978048632501255E-01  0.2875796103333898E-01 -0.1679962259405253E-02 -0.3154018757241899E-01\n -0.6082962030108538E-01 -0.8955516461660286E-01 -0.1177237209366101E+00 -0.1453421834658722E+00 -0.1724174378064842E+00\n -0.1989563586366328E+00 -0.2249658074573321E+00 -0.2504526304061375E+00 -0.2754236561371938E+00 -0.2998856937666934E+00\n -0.3238455308829152E+00 -0.3473099316199632E+00 -0.3702856347944674E+00 -0.3927793521041590E+00 -0.4147977663876007E+00\n -0.4363475299441409E+00 -0.4574352629131093E+00 -0.4780675517114195E+00 -0.4982509475286878E+00 -0.5179919648788196E+00\n -0.5372970802072690E+00 -0.5561727305530091E+00 -0.5746253122642059E+00 -0.5926611797667505E+00 -0.6102866443846747E+00\n -0.6275079732115432E+00 -0.6443313880318098E+00 -0.6607630642913176E+00 -0.6768091301158876E+00 -0.6924756653771867E+00\n -0.7077687008048035E+00 -0.7226942171437692E+00 -0.7372581443564278E+00 -0.7514663608678986E+00 -0.7653246928540729E+00\n -0.7788389135713435E+00 -0.7920147427271221E+00 -0.8048578458902081E+00 -0.8173738339401606E+00 -0.8295682625548225E+00\n -0.8414466317350016E+00 -0.8530143853655495E+00 -0.8642769108119376E+00 -0.8752395385514281E+00 -0.8859075418380596E+00\n -0.8962861364005478E+00 -0.9063804801723496E+00 -0.9161956730529236E+00 -0.9257367566995721E+00 -0.9350087143488421E+00\n -0.9440164706668895E+00 -0.9527648916278635E+00 -0.9612587844196464E+00 -0.9695028973760704E+00 -0.9775019199350281E+00\n -0.9852604826214921E+00 -0.9927831570549439E+00 -0.1000074455980330E+01 -0.1007138833321882E+01 -0.1013980684259106E+01\n -0.1020604345324242E+01 -0.1027014094520476E+01 -0.1033214151460282E+01 -0.1039208677523227E+01 -0.1045001776032526E+01\n -0.1050597492449770E+01 -0.1055999814587213E+01 -0.1061212672836912E+01 -0.1066239940416186E+01 -0.1071085433628814E+01\n -0.1075752912141292E+01 -0.1080246079273645E+01 -0.1084568582304249E+01 -0.1088724012788046E+01 -0.1092715906887623E+01\n -0.1096547745716693E+01 -0.1100222955695317E+01 -0.1103744908916555E+01 -0.1107116923523791E+01 -0.1110342264098502E+01\n -0.1113424142057791E+01 -0.1116365716061343E+01 -0.1119170092427236E+01 -0.1121840325556284E+01 -0.1124379418364351E+01\n -0.1126790322722266E+01 -0.1129075939902947E+01 -0.1131239121035218E+01 -0.1133282667564084E+01 -0.1135209331716900E+01\n -0.1137021816975156E+01 -0.1138722778551496E+01 -0.1140314823871568E+01 -0.1141800513060382E+01 -0.1143182359432848E+01\n -0.1144462829988106E+01 -0.1145644345907359E+01 -0.1146729283054887E+01 -0.1147719972481915E+01 -0.1148618700933064E+01\n -0.1149427711355036E+01 -0.1150149203407336E+01 -0.1150785333974662E+01 -0.1151338217680745E+01 -0.1151809927403365E+01\n -0.1152202494790314E+01 -0.1152517910775978E+01 -0.1152758126098446E+01 -0.1152925051816752E+01 -0.1153020559828135E+01\n -0.1153046483385062E+01 -0.1153004617611814E+01 -0.1152896720020397E+01 -0.1152724511025663E+01 -0.1152489674459358E+01\n -0.1152193858082955E+01 -0.1151838674099132E+01 -0.1151425699661622E+01 -0.1150956477383416E+01 -0.1150432515843014E+01\n -0.1149855290088658E+01 -0.1149226242140391E+01 -0.1148546781489776E+01 -0.1147818285597133E+01 -0.1147042100386233E+01\n -0.1146219540736222E+01 -0.1145351890970717E+01 -0.1144440405343972E+01 -0.1143486308523956E+01 -0.1142490796072246E+01\n -0.1141455034920708E+01 -0.1140380163844745E+01 -0.1139267293933129E+01 -0.1138117509054281E+01 -0.1136931866318917E+01\n -0.1135711396538980E+01 -0.1134457104682830E+01 -0.1133169970326549E+01 -0.1131850948101341E+01 -0.1130500968136960E+01\n -0.1129120936501098E+01 -0.1127711735634675E+01 -0.1126274224782987E+01 -0.1124809240422688E+01 -0.1123317596684496E+01\n -0.1121800085771649E+01 -0.1120257478374031E+01 -0.1118690524077965E+01 -0.1117099951771584E+01 -0.1115486470045851E+01\n -0.1113850767591084E+01 -0.1112193513589038E+01 -0.1110515358100515E+01 -0.1108816932448459E+01 -0.1107098849596516E+01\n -0.1105361704523115E+01 -0.1103606074590946E+01 -0.1101832519911928E+01 -0.1100041583707593E+01 -0.1098233792664933E+01\n -0.1096409657287642E+01 -0.1094569672242852E+01 -0.1092714316703250E+01 -0.1090844054684662E+01 -0.1088959335379075E+01\n -0.1087060593483124E+01 -0.1085148249522008E+01 -0.1083222710168924E+01 -0.1081284368559944E+01 -0.1079333604604411E+01\n -0.1077370785290845E+01 -0.1075396264988352E+01 -0.1073410385743633E+01 -0.1071413477573506E+01 -0.1069405858753038E+01\n -0.1067387836099281E+01 -0.1065359705250640E+01 -0.1063321750941883E+01 -0.1061274247274852E+01 -0.1059217457984850E+01\n -0.1057151636702792E+01 -0.1055077027213080E+01 -0.1052993863707296E+01 -0.1050902371033679E+01 -0.1048802764942500E+01\n -0.1046695252327259E+01 -0.1044580031461829E+01 -0.1042457292233526E+01 -0.1040327216372171E+01 -0.1038189977675128E+01\n -0.1036045742228431E+01 -0.1033894668623957E+01 -0.1031736908172717E+01 -0.1029572605114311E+01 -0.1027401896822551E+01\n -0.1025224914007316E+01 -0.1023041780912662E+01 -0.1020852615511239E+01 -0.1018657529695029E+01 -0.1016456629462466E+01\n -0.1014250015101953E+01 -0.1012037781371852E+01 -0.1009820017676932E+01 -0.1007596808241376E+01 -0.1005368232278329E+01\n -0.1003134364156065E+01 -0.1000895273560783E+01 -0.9986510256561214E+00 -0.9964016812393415E+00 -0.9941472968943378E+00\n -0.9918879251414070E+00 -0.9896236145838693E+00 -0.9873544100515853E+00 -0.9850803527413915E+00 -0.9828014803544729E+00\n -0.9805178272307916E+00 -0.9782294244804987E+00 -0.9759363001124680E+00 -0.9736384791599416E+00 -0.9713359838033104E+00\n -0.9690288334901421E+00 -0.9667170450524106E+00 -0.9644006328210118E+00 -0.9620796087376083E+00 -0.9597539824638249E+00\n -0.9574237614878179E+00 -0.9550889512283189E+00 -0.9527495551361136E+00 -0.9504055747930490E+00 -0.9480570100085778E+00\n -0.9457038589139001E+00 -0.9433461180537021E+00 -0.9409837824755957E+00 -0.9386168458172143E+00 -0.9362453003910622E+00\n -0.9338691372671331E+00 -0.9314883463533257E+00 -0.9291029164737088E+00 -0.9267128354446561E+00 -0.9243180901489110E+00\n -0.9219186666075736E+00 -0.9195145500500918E+00 -0.9171057249822572E+00 -0.9146921752522568E+00 -0.9122738841148049E+00\n -0.9098508342934115E+00 -0.9074230080407725E+00 -0.9049903871973761E+00 -0.9025529532482975E+00 -0.9001106873782734E+00\n -0.8976635705250287E+00 -0.8952115834309455E+00 -0.8927547066930527E+00 -0.8902929208114043E+00 -0.8878262062358644E+00\n -0.8853545434113288E+00 -0.8828779128213984E+00 -0.8803962950305826E+00 -0.8779096707249944E+00 -0.8754180207516187E+00\n -0.8729213261561652E+00 -0.8704195682195257E+00 -0.8679127284928716E+00 -0.8654007888314326E+00 -0.8628837314269541E+00\n -0.8603615388388851E+00 -0.8578341940243193E+00 -0.8553016803666958E+00 -0.8527639817033201E+00 -0.8502210823517030E+00\n -0.8476729671347476E+00 -0.8451196214048268E+00 -0.8425610310667432E+00 -0.8399971825996356E+00 -0.8374280630778245E+00\n -0.8348536601906327E+00 -0.8322739622612096E+00 -0.8296889582643635E+00 -0.8270986378434532E+00 -0.8245029913263251E+00\n -0.8219020097403632E+00 -0.8192956848266297E+00 -0.8166840090531358E+00 -0.8140669756272810E+00 -0.8114445785074459E+00\n -0.8088168124137882E+00 -0.8061836728382580E+00 -0.8035451560538301E+00 -0.8009012591230101E+00 -0.7982519799055862E+00\n -0.7955973170657049E+00 -0.7929372700782288E+00 -0.7902718392344300E+00 -0.7876010256470514E+00 -0.7849248312546936E+00\n -0.7822432588256222E+00 -0.7795563119609465E+00 -0.7768639950972300E+00 -0.7741663135085275E+00 -0.7714632733078751E+00\n -0.7687548814482437E+00 -0.7660411457229735E+00 -0.7633220747657076E+00 -0.7605976780498430E+00 -0.7578679658874885E+00\n -0.7551329494280029E+00 -0.7523926406560499E+00 -0.7496470523892526E+00 -0.7468961982754271E+00 -0.7441400927894049E+00\n -0.7413787512294852E+00 -0.7386121897135014E+00 -0.7358404251745365E+00 -0.7330634753562915E+00 -0.7302813588081042E+00\n -0.7274940948796763E+00 -0.7247017037154513E+00 -0.7219042062487405E+00 -0.7191016241955283E+00 -0.7162939800480140E+00\n -0.7134812970679073E+00 -0.7106635992794407E+00 -0.7078409114621805E+00 -0.7050132591435788E+00 -0.7021806685913191E+00\n -0.6993431668054603E+00 -0.6965007815103690E+00 -0.6936535411464760E+00 -0.6908014748618515E+00 -0.6879446125036175E+00\n -0.6850829846091927E+00 -0.6822166223973989E+00 -0.6793455577594238E+00 -0.6764698232496565E+00 -0.6735894520763950E+00\n -0.6707044780924551E+00 -0.6678149357856630E+00 -0.6649208602692607E+00 -0.6620222872722230E+00 -0.6591192531294906E+00\n -0.6562117947721472E+00 -0.6532999497175199E+00 -0.6503837560592365E+00 -0.6474632524572266E+00 -0.6445384781276909E+00\n -0.6416094728330407E+00 -0.6386762768718036E+00 -0.6357389310685252E+00 -0.6327974767636543E+00 -0.6298519558034233E+00\n -0.6269024105297427E+00 -0.6239488837700962E+00 -0.6209914188274636E+00 -0.6180300594702640E+00 -0.6150648499223307E+00\n -0.6120958348529247E+00 -0.6091230593667976E+00 -0.6061465689942978E+00 -0.6031664096815428E+00 -0.6001826277806448E+00\n -0.5971952700400222E+00 -0.5942043835947710E+00 -0.5912100159571299E+00 -0.5882122150070307E+00 -0.5852110289827398E+00\n -0.5822065064716095E+00 -0.5791986964009260E+00 -0.5761876480288783E+00 -0.5731734109356420E+00 -0.5701560350145878E+00\n -0.5671355704636246E+00 -0.5641120677766707E+00 -0.5610855777352810E+00 -0.5580561514004118E+00 -0.5550238401043444E+00\n -0.5519886954427705E+00 -0.5489507692670410E+00 -0.5459101136765916E+00 -0.5428667810115466E+00 -0.5398208238455037E+00\n -0.5367722949785179E+00 -0.5337212474302724E+00 -0.5306677344334658E+00 -0.5276118094273992E+00 -0.5245535260517865E+00\n -0.5214929381407842E+00 -0.5184300997172553E+00 -0.5153650649872665E+00 -0.5122978883348268E+00 -0.5092286243168869E+00\n -0.5061573276585855E+00 -0.5030840532487656E+00 -0.5000088561357634E+00 -0.4969317915234724E+00 -0.4938529147677048E+00\n -0.4907722813728380E+00 -0.4876899469887706E+00 -0.4846059674081886E+00 -0.4815203985641517E+00 -0.4784332965280080E+00\n -0.4753447175076490E+00 -0.4722547178461055E+00 -0.4691633540205086E+00 -0.4660706826414067E+00 -0.4629767604524667E+00\n -0.4598816443305548E+00 -0.4567853912862148E+00 -0.4536880584645588E+00 -0.4505897031465675E+00 -0.4474903827508280E+00\n -0.4443901548357052E+00 -0.4412890771019746E+00 -0.4381872073959169E+00 -0.4350846037128897E+00 -0.4319813242013982E+00\n -0.4288774271676646E+00 -0.4257729710807258E+00 -0.4226680145780600E+00 -0.4195626164717658E+00 -0.4164568357553127E+00\n -0.4133507316108669E+00 -0.4102443634172216E+00 -0.4071377907583458E+00 -0.4040310734325635E+00 -0.4009242714623935E+00\n -0.3978174451050561E+00 -0.3947106548636826E+00 -0.3916039614992301E+00 -0.3884974260431417E+00 -0.3853911098107584E+00\n -0.3822850744155176E+00 -0.3791793817839579E+00 -0.3760740941715547E+00 -0.3729692741794092E+00 -0.3698649847718308E+00\n -0.3667612892948207E+00 -0.3636582514955066E+00 -0.3605559355425407E+00 -0.3574544060475049E+00 -0.3543537280873476E+00\n -0.3512539672278892E+00 -0.3481551895484317E+00 -0.3450574616675028E+00 -0.3419608507697824E+00 -0.3388654246342396E+00\n -0.3357712516635236E+00 -0.3326784009146562E+00 -0.3295869421310594E+00 -0.3264969457759724E+00 -0.3234084830672975E+00\n -0.3203216260139267E+00 -0.3172364474535990E+00 -0.3141530210923392E+00 -0.3110714215455339E+00 -0.3079917243806994E+00\n -0.3049140061619978E+00 -0.3018383444965689E+00 -0.2987648180827280E+00 -0.2956935067601084E+00 -0.2926244915618033E+00\n -0.2895578547685831E+00 -0.2864936799652645E+00 -0.2834320520992921E+00 -0.2803730575416270E+00 -0.2773167841500085E+00\n -0.2742633213346799E+00 -0.2712127601266646E+00 -0.2681651932486745E+00 -0.2651207151887529E+00 -0.2620794222767396E+00\n -0.2590414127636577E+00 -0.2560067869041315E+00 -0.2529756470419290E+00 -0.2499480976987507E+00 -0.2469242456663659E+00\n -0.2439042001022238E+00 -0.2408880726286486E+00 -0.2378759774357503E+00 -0.2348680313881797E+00 -0.2318643541358485E+00\n -0.2288650682287657E+00 -0.2258702992361172E+00 -0.2228801758697354E+00 -0.2198948301121145E+00 -0.2169143973491063E+00\n -0.2139390165074705E+00 -0.2109688301974238E+00 -0.2080039848603569E+00 -0.2050446309218908E+00 -0.2020909229504274E+00\n -0.1991430198213881E+00 -0.1962010848872974E+00 -0.1932652861539021E+00 -0.1903357964625070E+00 -0.1874127936787024E+00\n -0.1844964608876812E+00 -0.1815869865963202E+00 -0.1786845649422172E+00 -0.1757893959098759E+00 -0.1729016855542115E+00\n -0.1700216462315742E+00 -0.1671494968384586E+00 -0.1642854630580883E+00 -0.1614297776150348E+00 -0.1585826805380398E+00\n -0.1557444194312012E+00 -0.1529152497536538E+00 -0.1500954351078926E+00 -0.1472852475368416E+00 -0.1444849678297712E+00\n -0.1416948858371486E+00 -0.1389153007944590E+00 -0.1361465216550372E+00 -0.1333888674318927E+00 -0.1306426675484822E+00\n -0.1279082621983536E+00 -0.1251860027135053E+00 -0.1224762519412908E+00 -0.1197793846295987E+00 -0.1170957878199916E+00\n -0.1144258612484021E+00 -0.1117700177528869E+00 -0.1091286836878541E+00 -0.1065022993440523E+00 -0.1038913193734918E+00\n -0.1012962132183315E+00 -0.9871746554259221E-01 -0.9615557666540349E-01 -0.9361106299427452E-01 -0.9108445745667579E-01\n -0.8857630992797585E-01 -0.8608718765349675E-01 -0.8361767566217436E-01 -0.8116837716895883E-01 -0.7873991396273913E-01\n -0.7633292677617219E-01 -0.7394807563333809E-01 -0.7158604017067217E-01 -0.6924751992606029E-01 -0.6693323459041152E-01\n -0.6464392421534722E-01 -0.6238034936994107E-01 -0.6014329123865809E-01 -0.5793355165176966E-01 -0.5575195303860343E-01\n -0.5359933829294623E-01 -0.5147657053882339E-01 -0.4938453278367397E-01 -0.4732412744463571E-01 -0.4529627573227194E-01\n -0.4330191687455879E-01 -0.4134200716236433E-01 -0.3941751879595017E-01 -0.3752943851022626E-01 -0.3567876595462575E-01\n -0.3386651180149903E-01 -0.3209369555493235E-01 -0.3036134302986153E-01 -0.2867048346931652E-01 -0.2702214626567594E-01\n -0.2541735724993743E-01 -0.2385713451135265E-01 -0.2234248370839688E-01 -0.2087439283106441E-01 -0.1945382637408551E-01\n -0.1808171888098112E-01 -0.1675896782019106E-01 -0.1548642575704695E-01 -0.1426489178948888E-01 -0.1309510222150092E-01\n -0.1197772045673314E-01 -0.1091332610623831E-01 -0.9902403319266216E-02 -0.8945328365362132E-02 -0.8042356520369600E-02\n -0.7193608339198911E-02 -0.6399055435312237E-02 -0.5658505931682774E-02 -0.4971589801402351E-02 -0.4337744378844948E-02\n -0.3756200394787513E-02 -0.3225968971126078E-02 -0.2745830102014657E-02 -0.2314323246553361E-02 -0.1929740760130854E-02\n -0.1590124991640147E-02 -0.1293269963677403E-02 -0.1036728620523732E-02 -0.8178266578560640E-03 -0.6336839173092652E-03\n -0.4812442114554411E-03 -0.3573142088885663E-03 -0.2586116204308245E-03 -0.1818223529741868E-03 -0.1236655132753167E-03\n -0.8096414791917507E-04 -0.5071843506793948E-04 -0.3017679859046307E-04 -0.1689928305171012E-04 -0.8806800438416483E-05\n -0.4209924174242123E-05 -0.1812186230608453E-05 -0.6856430207874943E-06 -0.2207762234777510E-06 -0.5789808120346374E-07\n -0.1162764438867681E-07 -0.1636092194626611E-08 -0.1411469196261160E-09 -0.6053864648970130E-11 -0.9102103938482552E-13\n -0.2557695550579744E-15 -0.3818161159862620E-19 -0.1608640056516381E-25 -0.2867908542943528E-38 -0.1639405452192707E-76\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.1490972894185426E+01  0.2898594369705328E+01  0.4226102647398204E+01  0.5476628578286624E+01\n  0.6653199649346901E+01  0.7758744314426550E+01  0.8796096630727330E+01  0.9768001136837229E+01  0.1067711788189623E+02\n  0.1152602750277483E+02  0.1231723624359168E+02  0.1305318081663842E+02  0.1373623301352756E+02  0.1436870398832137E+02\n  0.1495284814912227E+02  0.1549086661002188E+02  0.1598491017060163E+02  0.1643708180475745E+02  0.1684943865406904E+02\n  0.1722399353297733E+02  0.1756271596351480E+02  0.1786753276618034E+02  0.1814032824076472E+02  0.1838294397656276E+02\n  0.1859717833554092E+02  0.1878478565478038E+02  0.1894747521601122E+02  0.1908691003043678E+02  0.1920470548645839E+02\n  0.1930242790649218E+02  0.1938159305696006E+02  0.1944366465286470E+02  0.1949005289524725E+02  0.1952211307638757E+02\n  0.1954114428394226E+02  0.1954838823141548E+02  0.1954502823850324E+02  0.1953218838101044E+02  0.1951093282627426E+02\n  0.1948226536638306E+02  0.1944712915800228E+02  0.1940640667433629E+02  0.1936091987169615E+02  0.1931143057032402E+02\n  0.1925864104655939E+02  0.1920319483112569E+02  0.1914567770627270E+02  0.1908661889272693E+02  0.1902649241587448E+02\n  0.1896571863932183E+02  0.1890466595293786E+02  0.1884365260166379E+02  0.1878294864077429E+02  0.1872277800286541E+02\n  0.1866332066162236E+02  0.1860471487736171E+02  0.1854705950943718E+02  0.1849041638082738E+02  0.1843481268057272E+02\n  0.1838024339018270E+02  0.1832667372067947E+02  0.1827404154756324E+02  0.1822225983166999E+02  0.1817121901462569E+02\n  0.1812078937837576E+02  0.1807082335907063E+02  0.1802115780640943E+02  0.1797161618037463E+02  0.1792201067812283E+02\n  0.1787214428462332E+02  0.1782181274145043E+02  0.1777080642893208E+02  0.1771891215763021E+02  0.1766591486587512E+02\n  0.1761159922079143E+02  0.1755575112093501E+02  0.1749815909930632E+02  0.1743861562611338E+02  0.1737691831122648E+02\n  0.1731287100679569E+02  0.1724628481099027E+02  0.1717697897426687E+02  0.1710478170998087E+02  0.1702953091152244E+02\n  0.1695107477848783E+02  0.1686927235468663E+02  0.1678399398103932E+02  0.1669512166663813E+02  0.1660254938142798E+02\n  0.1650618327411663E+02  0.1640594181904419E+02  0.1630175589583457E+02  0.1619356880571659E+02  0.1608133622844232E+02\n  0.1596502612374653E+02  0.1584461858128563E+02  0.1572010562296940E+02  0.1559149096155470E+02  0.1545878971931102E+02\n  0.1532202811049239E+02  0.1518124309126241E+02  0.1503648198061937E+02  0.1488780205575875E+02  0.1473527012519185E+02\n  0.1457896208281294E+02  0.1441896244597594E+02  0.1425536388050388E+02  0.1408826671541400E+02  0.1391777844999757E+02\n  0.1374401325574798E+02  0.1356709147548415E+02  0.1338713912187045E+02  0.1320428737738750E+02  0.1301867209766444E+02\n  0.1283043331994052E+02  0.1263971477828357E+02  0.1244666342705594E+02  0.1225142897398476E+02  0.1205416342406364E+02\n  0.1185502063538666E+02  0.1165415588789458E+02  0.1145172546589620E+02  0.1124788625511554E+02  0.1104279535490879E+02\n  0.1083660970619294E+02  0.1062948573553064E+02  0.1042157901572463E+02  0.1021304394318828E+02  0.1000403343227721E+02\n  0.9794698626690922E+01  0.9585188627981971E+01  0.9375650241143855E+01  0.9166227737187679E+01  0.8957062632560726E+01\n  0.8748293485208164E+01  0.8540055707031815E+01  0.8332481392456542E+01  0.8125699162775922E+01  0.7919834025914198E+01\n  0.7715007251210231E+01  0.7511336258802102E+01  0.7308934523167021E+01  0.7107911490350968E+01  0.6908372508405361E+01\n  0.6710418770533413E+01  0.6514147270438017E+01  0.6319650769353934E+01  0.6127017774240882E+01  0.5936332526610492E+01\n  0.5747675001458052E+01  0.5561120915770464E+01  0.5376741746084129E+01  0.5194604754569927E+01  0.5014773023128366E+01\n  0.4837305494984530E+01  0.4662257023280675E+01  0.4489678426173787E+01  0.4319616547955467E+01  0.4152114325723103E+01\n  0.3987210861143229E+01  0.3824941496860732E+01  0.3665337897121076E+01  0.3508428132186630E+01  0.3354236766142388E+01\n  0.3202784947701370E+01  0.3054090503634531E+01  0.2908168034465503E+01  0.2765029012085665E+01  0.2624681878960210E+01\n  0.2487132148611466E+01  0.2352382507080828E+01  0.2220432915085888E+01  0.2091280710604522E+01  0.1964920711632258E+01\n  0.1841345318874233E+01  0.1720544618147173E+01  0.1602506482281042E+01  0.1487216672323735E+01  0.1374658937865809E+01\n  0.1264815116314972E+01  0.1157665230963353E+01  0.1053187587702279E+01  0.9513588702517990E+00  0.8521542337834218E+00\n  0.7555473968256491E+00  0.6615107313528323E+00  0.5700153509680036E+00  0.4810311971000716E+00  0.3945271231455855E+00\n  0.3104709764939235E+00  0.2288296783834506E+00  0.1495693015446019E+00  0.7265514559315535E-01 -0.1948189855172862E-02\n -0.7427673437111640E-01 -0.1443670782148313E+00 -0.2122563061647371E+00 -0.2779819336760306E+00 -0.3415818453668393E+00\n -0.4030942358252462E+00 -0.4625575527254874E+00 -0.5200104422372566E+00 -0.5754916967079484E+00 -0.6290402045940768E+00\n -0.6806949026143181E+00 -0.7304947300937417E+00 -0.7784785854658435E+00 -0.8246852848961586E+00 -0.8691535229891830E+00\n -0.9119218355379459E+00 -0.9530285642737767E+00 -0.9925118235722190E+00 -0.1030409469069388E+01 -0.1066759068142054E+01\n -0.1101597872203433E+01 -0.1134962790765932E+01 -0.1166890367221378E+01 -0.1197416756288568E+01 -0.1226577703077706E+01\n -0.1254408523721037E+01 -0.1280944087518682E+01 -0.1306218800548890E+01 -0.1330266590691901E+01 -0.1353120894016819E+01\n -0.1374814642481296E+01 -0.1395380252894130E+01 -0.1414849617091440E+01 -0.1433254093277628E+01 -0.1450624498482941E+01\n -0.1466991102090209E+01 -0.1482383620384031E+01 -0.1496831212076521E+01 -0.1510362474764622E+01 -0.1523005442274803E+01\n -0.1534787582851975E+01 -0.1545735798150416E+01 -0.1555876422985430E+01 -0.1565235225805577E+01 -0.1573837409846275E+01\n -0.1581707614926664E+01 -0.1588869919852685E+01 -0.1595347845390397E+01 -0.1601164357774630E+01 -0.1606341872719178E+01\n -0.1610902259895794E+01 -0.1614866847850344E+01 -0.1618256429325549E+01 -0.1621091266960840E+01 -0.1623391099340840E+01\n -0.1625175147365167E+01 -0.1626462120913114E+01 -0.1627270225777996E+01 -0.1627617170846768E+01 -0.1627520175501631E+01\n -0.1626995977221341E+01 -0.1626060839360731E+01 -0.1624730559088164E+01 -0.1623020475461238E+01 -0.1620945477622288E+01\n -0.1618520013095815E+01 -0.1615758096171077E+01 -0.1612673316353719E+01 -0.1609278846871282E+01 -0.1605587453218097E+01\n -0.1601611501725963E+01 -0.1597362968147642E+01 -0.1592853446240992E+01 -0.1588094156342277E+01 -0.1583095953917781E+01\n -0.1577869338083636E+01 -0.1572424460084281E+01 -0.1566771131720695E+01 -0.1560918833720039E+01 -0.1554876724038992E+01\n -0.1548653646093535E+01 -0.1542258136908566E+01 -0.1535698435181091E+01 -0.1528982489251385E+01 -0.1522117964976844E+01\n -0.1515112253503763E+01 -0.1507972478932725E+01 -0.1500705505873594E+01 -0.1493317946886631E+01 -0.1485816169806484E+01\n -0.1478206304946291E+01 -0.1470494252179348E+01 -0.1462685687896228E+01 -0.1454786071835450E+01 -0.1446800653786156E+01\n -0.1438734480161472E+01 -0.1430592400441542E+01 -0.1422379073485444E+01 -0.1414098973711402E+01 -0.1405756397145003E+01\n -0.1397355467335255E+01 -0.1388900141138563E+01 -0.1380394214370867E+01 -0.1371841327328378E+01 -0.1363244970177461E+01\n -0.1354608488214437E+01 -0.1345935086996126E+01 -0.1337227837342175E+01 -0.1328489680210275E+01 -0.1319723431445484E+01\n -0.1310931786405037E+01 -0.1302117324460026E+01 -0.1293282513375510E+01 -0.1284429713570631E+01 -0.1275561182260429E+01\n -0.1266679077481073E+01 -0.1257785462000340E+01 -0.1248882307115163E+01 -0.1239971496338172E+01 -0.1231054828975166E+01\n -0.1222134023595495E+01 -0.1213210721397372E+01 -0.1204286489470143E+01 -0.1195362823955608E+01 -0.1186441153110434E+01\n -0.1177522840271803E+01 -0.1168609186728368E+01 -0.1159701434498662E+01 -0.1150800769019061E+01 -0.1141908321743441E+01\n -0.1133025172656630E+01 -0.1124152352703810E+01 -0.1115290846137928E+01 -0.1106441592787264E+01 -0.1097605490245227E+01\n -0.1088783395984451E+01 -0.1079976129397275E+01 -0.1071184473764625E+01 -0.1062409178155359E+01 -0.1053650959258049E+01\n -0.1044910503147221E+01 -0.1036188466985990E+01 -0.1027485480667053E+01 -0.1018802148393944E+01 -0.1010139050204464E+01\n -0.1001496743438119E+01 -0.9928757641494527E+00 -0.9842766284690484E+00 -0.9756998339140143E+00 -0.9671458606496940E+00\n -0.9586151727043447E+00 -0.9501082191384856E+00 -0.9416254351705762E+00 -0.9331672432606939E+00 -0.9247340541538072E+00\n -0.9163262678842421E+00 -0.9079442747428956E+00 -0.8995884562087340E+00 -0.8912591858460664E+00 -0.8829568301690750E+00\n -0.8746817494750385E+00 -0.8664342986476723E+00 -0.8582148279319598E+00 -0.8500236836818522E+00 -0.8418612090821510E+00\n -0.8337277448458742E+00 -0.8256236298884094E+00 -0.8175492019796625E+00 -0.8095047983754566E+00 -0.8014907564293513E+00\n -0.7935074141860654E+00 -0.7855551109576326E+00 -0.7776341878834073E+00 -0.7697449884750045E+00 -0.7618878591472366E+00\n -0.7540631497360738E+00 -0.7462712140046344E+00 -0.7385124101381848E+00 -0.7307871012290940E+00 -0.7230956557526664E+00\n -0.7154384480347357E+00 -0.7078158587119011E+00 -0.7002282751852088E+00 -0.6926760920681024E+00 -0.6851597116293913E+00\n -0.6776795442319780E+00 -0.6702360087680368E+00 -0.6628295330912921E+00 -0.6554605544470310E+00 -0.6481295199004043E+00\n -0.6408368867635551E+00 -0.6335831230220497E+00 -0.6263687077610380E+00 -0.6191941315915128E+00 -0.6120598970769715E+00\n -0.6049665191607240E+00 -0.5979145255940220E+00 -0.5909044573650831E+00 -0.5839368691290320E+00 -0.5770123296386506E+00\n -0.5701314221757601E+00 -0.5632947449829158E+00 -0.5565029116949882E+00 -0.5497565517700718E+00 -0.5430563109189926E+00\n -0.5364028515325477E+00 -0.5297968531054059E+00 -0.5232390126554224E+00 -0.5167300451368810E+00 -0.5102706838459522E+00\n -0.5038616808163805E+00 -0.4975038072031411E+00 -0.4911978536514589E+00 -0.4849446306482554E+00 -0.4787449688526985E+00\n -0.4725997194020929E+00 -0.4665097541888966E+00 -0.4604759661041344E+00 -0.4544992692419215E+00 -0.4485805990591846E+00\n -0.4427209124840173E+00 -0.4369211879653461E+00 -0.4311824254558134E+00 -0.4255056463188713E+00 -0.4198918931501576E+00\n -0.4143422295021775E+00 -0.4088577395001772E+00 -0.4034395273358983E+00 -0.3980887166245596E+00 -0.3928064496090112E+00\n -0.3875938861934557E+00 -0.3824522027875051E+00 -0.3773825909395854E+00 -0.3723862557368422E+00 -0.3674644139467203E+00\n -0.3626182918733373E+00 -0.3578491228995945E+00 -0.3531581446837392E+00 -0.3485465959768078E+00 -0.3440157130250673E+00\n -0.3395667255192788E+00 -0.3352008520504021E+00 -0.3309192950292724E+00 -0.3267232350259450E+00 -0.3226138244828918E+00\n -0.3185921807551977E+00 -0.3146593784305226E+00 -0.3108164408820478E+00 -0.3070643310091922E+00 -0.3034039411238457E+00\n -0.2998360819446073E+00 -0.2963614706684425E+00 -0.2929807180988327E+00 -0.2896943148224383E+00 -0.2865026164432708E+00\n -0.2834058279051005E+00 -0.2804039869602682E+00 -0.2774969468771566E+00 -0.2746843585203667E+00 -0.2719656519882723E+00\n -0.2693400180531267E+00 -0.2668063897203013E+00 -0.2643634243062732E+00 -0.2620094865300300E+00 -0.2597426332192892E+00\n -0.2575606003500299E+00 -0.2554607932624695E+00 -0.2534402810239623E+00 -0.2514957960316366E+00 -0.2496237400535760E+00\n -0.2478201979810306E+00 -0.2460809605838598E+00 -0.2444015574991944E+00 -0.2427773015044900E+00 -0.2412033447902379E+00\n -0.2396747474109387E+00 -0.2381865573144384E+00 -0.2367339003009647E+00 -0.2353120769446503E+00 -0.2339166619743637E+00\n -0.2325435999910598E+00 -0.2311892899420583E+00 -0.2298506498591054E+00 -0.2285251535007102E+00 -0.2272108322697357E+00\n -0.2259062395150722E+00 -0.2246103800296458E+00 -0.2233226143482858E+00 -0.2220425533758296E+00 -0.2207699612307818E+00\n -0.2195046807982463E+00 -0.2182465877415019E+00 -0.2169955687347858E+00 -0.2157515141286527E+00 -0.2145143163564465E+00\n -0.2132838697320672E+00 -0.2120600704271507E+00 -0.2108428164580473E+00 -0.2096320076725845E+00 -0.2084275457364440E+00\n -0.2072293341191706E+00 -0.2060372780798283E+00 -0.2048512846523208E+00 -0.2036712626303956E+00 -0.2024971225523388E+00\n -0.2013287766853885E+00 -0.2001661390098699E+00 -0.1990091252030775E+00 -0.1978576526229085E+00 -0.1967116402912710E+00\n -0.1955710088772761E+00 -0.1944356806802258E+00 -0.1933055796124141E+00 -0.1921806311817510E+00 -0.1910607624742264E+00\n -0.1899459021362168E+00 -0.1888359803566597E+00 -0.1877309288490946E+00 -0.1866306808335939E+00 -0.1855351710185818E+00\n -0.1844443355825659E+00 -0.1833581121557800E+00 -0.1822764398017569E+00 -0.1811992589988340E+00 -0.1801265116216080E+00\n -0.1790581409223451E+00 -0.1779940915123532E+00 -0.1769343093433298E+00 -0.1758787416886912E+00 -0.1748273371248939E+00\n -0.1737800455127509E+00 -0.1727368179787582E+00 -0.1716976068964338E+00 -0.1706623658676789E+00 -0.1696310497041661E+00\n -0.1686036144087650E+00 -0.1675800171570109E+00 -0.1665602162786198E+00 -0.1655441712390600E+00 -0.1645318426211851E+00\n -0.1635231921069348E+00 -0.1625181824591057E+00 -0.1615167775032033E+00 -0.1605189421093761E+00 -0.1595246421744391E+00\n -0.1585338446039885E+00 -0.1575465172946173E+00 -0.1565626291162327E+00 -0.1555821498944797E+00 -0.1546050503932762E+00\n -0.1536313022974632E+00 -0.1526608781955763E+00 -0.1516937515627348E+00 -0.1507298967436624E+00 -0.1497692889358336E+00\n -0.1488119041727559E+00 -0.1478577193073842E+00 -0.1469067119956771E+00 -0.1459588606802934E+00 -0.1450141445744331E+00\n -0.1440725436458233E+00 -0.1431340386008554E+00 -0.1421986108688733E+00 -0.1412662425866119E+00 -0.1403369165827954E+00\n -0.1394106163628882E+00 -0.1384873260940094E+00 -0.1375670305900030E+00 -0.1366497152966734E+00 -0.1357353662771839E+00\n -0.1348239701976193E+00 -0.1339155143127141E+00 -0.1330099864517488E+00 -0.1321073750046149E+00 -0.1312076689080463E+00\n -0.1303108576320237E+00 -0.1294169311663473E+00 -0.1285258800073831E+00 -0.1276376951449777E+00 -0.1267523680495491E+00\n -0.1258698906593478E+00 -0.1249902553678929E+00 -0.1241134550115789E+00 -0.1232394828574590E+00 -0.1223683325912011E+00\n -0.1214999983052166E+00 -0.1206344744869641E+00 -0.1197717560074267E+00 -0.1189118381097634E+00 -0.1180547163981319E+00\n -0.1172003868266877E+00 -0.1163488456887531E+00 -0.1155000896061621E+00 -0.1146541155187737E+00 -0.1138109206741603E+00\n -0.1129705026174663E+00 -0.1121328591814367E+00 -0.1112979884766172E+00 -0.1104658888817227E+00 -0.1096365590341772E+00\n -0.1088099978208190E+00 -0.1079862043687761E+00 -0.1071651780365066E+00 -0.1063469184050076E+00 -0.1055314252691870E+00\n -0.1047186986294014E+00 -0.1039087386831581E+00 -0.1031015458169785E+00 -0.1022971205984247E+00 -0.1014954637682864E+00\n -0.1006965762329294E+00 -0.9990045905680092E-01 -0.9910711345509600E-01 -0.9831654078657849E-01 -0.9752874254656095E-01\n -0.9674372036003734E-01 -0.9596147597497186E-01 -0.9518201125574054E-01 -0.9440532817672517E-01 -0.9363142881605759E-01\n -0.9286031534951537E-01 -0.9209199004456679E-01 -0.9132645525456264E-01 -0.9056371341307594E-01 -0.8980376702838780E-01\n -0.8904661867811879E-01 -0.8829227100400254E-01 -0.8754072670680409E-01 -0.8679198854137972E-01 -0.8604605931187735E-01\n -0.8530294186707681E-01 -0.8456263909586934E-01 -0.8382515392287562E-01 -0.8309048930419941E-01 -0.8235864822331807E-01\n -0.8162963368710800E-01 -0.8090344872200475E-01 -0.8018009637029486E-01 -0.7945957968654156E-01 -0.7874190173414135E-01\n -0.7802706558201103E-01 -0.7731507430140443E-01 -0.7660593096285831E-01 -0.7589963863326689E-01 -0.7519620037308256E-01\n -0.7449561923364434E-01 -0.7379789825463164E-01 -0.7310304046164423E-01 -0.7241104886390530E-01 -0.7172192645209033E-01\n -0.7103567619627764E-01 -0.7035230104402376E-01 -0.6967180391855922E-01 -0.6899418771710759E-01 -0.6831945530932572E-01\n -0.6764760953586510E-01 -0.6697865320705315E-01 -0.6631258910169627E-01 -0.6564941996600249E-01 -0.6498914851262336E-01\n -0.6433177741981720E-01 -0.6367730933073025E-01 -0.6302574685279916E-01 -0.6237709255727147E-01 -0.6173134897884694E-01\n -0.6108851861543815E-01 -0.6044860392805121E-01 -0.5981160734078578E-01 -0.5917753124095684E-01 -0.5854637797933600E-01\n -0.5791814987051506E-01 -0.5729284919339011E-01 -0.5667047819176833E-01 -0.5605103907509822E-01 -0.5543453401932198E-01\n -0.5482096516785345E-01 -0.5421033463268072E-01 -0.5360264449559476E-01 -0.5299789680954505E-01 -0.5239609360012387E-01\n -0.5179723686717961E-01 -0.5120132858656160E-01 -0.5060837071199547E-01 -0.5001836517709381E-01 -0.4943131389750106E-01\n -0.4884721877317583E-01 -0.4826608169081145E-01 -0.4768790452639723E-01 -0.4711268914792258E-01 -0.4654043741822612E-01\n -0.4597115119799098E-01 -0.4540483234889028E-01 -0.4484148273688456E-01 -0.4428110423567344E-01 -0.4372369873030461E-01\n -0.4316926812094350E-01 -0.4261781432680625E-01 -0.4206933929025882E-01 -0.4152384498108628E-01 -0.4098133340093556E-01\n -0.4044180658793538E-01 -0.3990526662149652E-01 -0.3937171562729746E-01 -0.3884115578245902E-01 -0.3831358932091222E-01\n -0.3778901853896358E-01 -0.3726744580106369E-01 -0.3674887354578273E-01 -0.3623330429199824E-01 -0.3572074064530062E-01\n -0.3521118530462180E-01 -0.3470464106909250E-01 -0.3420111084513349E-01 -0.3370059765378802E-01 -0.3320310463829990E-01\n -0.3270863507194550E-01 -0.3221719236612464E-01 -0.3172878007871772E-01 -0.3124340192271698E-01 -0.3076106177513717E-01\n -0.3028176368621473E-01 -0.2980551188890199E-01 -0.2933231080866432E-01 -0.2886216507358872E-01 -0.2839507952481046E-01\n -0.2793105922726807E-01 -0.2747010948079293E-01 -0.2701223583154306E-01 -0.2655744408378990E-01 -0.2610574031206566E-01\n -0.2565713087368143E-01 -0.2521162242162311E-01 -0.2476922191783597E-01 -0.2432993664690480E-01 -0.2389377423013912E-01\n -0.2346074264007272E-01 -0.2303085021538444E-01 -0.2260410567625017E-01 -0.2218051814013276E-01 -0.2176009713801780E-01\n -0.2134285263110349E-01 -0.2092879502794953E-01 -0.2051793520209298E-01 -0.2011028451013516E-01 -0.1970585481030489E-01\n -0.1930465848150186E-01 -0.1890670844282149E-01 -0.1851201817356444E-01 -0.1812060173372857E-01 -0.1773247378498237E-01\n -0.1734764961211651E-01 -0.1696614514496612E-01 -0.1658797698079692E-01 -0.1621316240714285E-01 -0.1584171942508113E-01\n -0.1547366677292802E-01 -0.1510902395033159E-01 -0.1474781124273767E-01 -0.1439004974619603E-01 -0.1403576139247217E-01\n -0.1368496897442080E-01 -0.1333769617157242E-01 -0.1299396757587675E-01 -0.1265380871753636E-01 -0.1231724609085785E-01\n -0.1198430718003442E-01 -0.1165502048476427E-01 -0.1132941554559642E-01 -0.1100752296888000E-01 -0.1068937445118038E-01\n -0.1037500280300520E-01 -0.1006444197166726E-01 -0.9757727063089234E-02 -0.9454894362331736E-02 -0.9155981352602857E-02\n -0.8861026732477590E-02 -0.8570070431026370E-02 -0.8283153620518910E-02 -0.8000318726330972E-02 -0.7721609433644288E-02\n -0.7447070690483597E-02 -0.7176748706588126E-02 -0.6910690947562739E-02 -0.6648946123695469E-02 -0.6391564172768492E-02\n -0.6138596236119977E-02 -0.5890094627143023E-02 -0.5646112791328837E-02 -0.5406705256875357E-02 -0.5171927574793084E-02\n -0.4941836247340325E-02 -0.4716488643516831E-02 -0.4495942900234213E-02 -0.4280257807663031E-02 -0.4069492677135494E-02\n -0.3863707189852578E-02 -0.3662961224513759E-02 -0.3467314661850819E-02 -0.3276827163911870E-02 -0.3091557925807099E-02\n -0.2911565397496689E-02 -0.2736906973081798E-02 -0.2567638644951017E-02 -0.2403814620049312E-02 -0.2245486895479086E-02\n -0.2092704790623673E-02 -0.1945514433017997E-02 -0.1803958195289058E-02 -0.1668074080673803E-02 -0.1537895054912087E-02\n -0.1413448322734187E-02 -0.1294754547748605E-02 -0.1181827015318322E-02 -0.1074670739037643E-02 -0.9732815127318119E-03\n -0.8776449115510747E-03 -0.7877352477807324E-03 -0.7035144894988547E-03 -0.6249311532533495E-03 -0.5519191855637202E-03\n -0.4843968523409821E-03 -0.4222656603112821E-03 -0.3654093402469373E-03 -0.3136929282422736E-03 -0.2669619883460904E-03\n -0.2250420274226155E-03 -0.1877381608793739E-03 -0.1548350954324305E-03 -0.1260975017208530E-03 -0.1012708544007759E-03\n -0.8008281908161370E-04 -0.6224526246190971E-04 -0.4745695222159778E-04 -0.3540699419800758E-04 -0.2577902344419184E-04\n -0.1825612034243538E-04 -0.1252636105889374E-04 -0.8288832859917125E-05 -0.5259851630896392E-05 -0.3179018438370757E-05\n -0.1814657830647114E-05 -0.9681145896094296E-06 -0.4763777092066571E-06 -0.2125847804801365E-06 -0.8416563922630169E-07\n -0.2871694661282378E-07 -0.8118483409326055E-08 -0.1800875019886702E-08 -0.2899912795055122E-09 -0.3021521412802248E-10\n -0.1705617717949463E-11 -0.3905505511147667E-13 -0.2187979755795985E-15 -0.1136823060733138E-18 -0.6529908184057616E-24\n -0.1331494455842040E-33 -0.1332533824576676E-57 -0.3518780789111388E-217  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.2980561953329615E-01  0.5916214233164482E-01  0.8807376775591262E-01  0.1165446070923979E+00\n  0.1445785896945104E+00  0.1721793127131528E+00  0.1993498372288393E+00  0.2260924395124203E+00  0.2524083296657185E+00\n  0.2782973516026372E+00  0.3037576786932059E+00  0.3287855187856478E+00  0.3533748410476745E+00  0.3775171353675275E+00\n  0.4012012131151563E+00  0.4244130560281678E+00  0.4471357179640750E+00  0.4693492823288160E+00  0.4910308762069837E+00\n  0.5121547406179706E+00  0.5326923549257166E+00  0.5526126122474077E+00  0.5718820417388514E+00  0.5904650728749644E+00\n  0.6083243362816283E+00  0.6254209952953163E+00  0.6417151022124156E+00  0.6571659731229090E+00  0.6717325752842186E+00\n  0.6853739211620790E+00  0.6980494635281584E+00  0.7097194863416821E+00  0.7203454865385274E+00  0.7298905422913191E+00\n  0.7383196637747241E+00  0.7456001229593330E+00  0.7517017594547573E+00  0.7565972599187180E+00  0.7602624090360081E+00\n  0.7626763105428430E+00  0.7638215772227638E+00  0.7636844892256079E+00  0.7622551204578512E+00  0.7595274331582714E+00\n  0.7554993411058685E+00  0.7501727422062439E+00  0.7435535214678834E+00  0.7356515256112056E+00  0.7264805107514307E+00\n  0.7160580647622865E+00  0.7044055060626673E+00  0.6915477606740609E+00  0.6775132194747052E+00  0.6623335776287783E+00\n  0.6460436581976104E+00  0.6286812219467698E+00  0.6102867653501249E+00  0.5909033087616116E+00  0.5705761766794121E+00\n  0.5493527719676207E+00  0.5272823458290659E+00  0.5044157652415996E+00  0.4808052794806210E+00  0.4565042872543610E+00\n  0.4315671058772241E+00  0.4060487438014351E+00  0.3800046777198434E+00  0.3534906353440669E+00  0.3265623848532687E+00\n  0.2992755319008061E+00  0.2716853249594787E+00  0.2438464696819385E+00  0.2158129528517275E+00  0.1876378764027582E+00\n  0.1593733018915083E+00  0.1310701057169563E+00  0.1027778452988341E+00  0.7454463634517153E-01  0.4641704126567402E-01\n  0.1843996871823178E-01 -0.9343415788128404E-02 -0.3689176836917064E-01 -0.6416563450906662E-01 -0.9112750630870141E-01\n -0.1177418695188684E+00 -0.1439752406767907E+00 -0.1697961946978080E+00 -0.1951753833029356E+00 -0.2200855446874273E+00\n -0.2445015048556650E+00 -0.2684001710639848E+00 -0.2917605178254852E+00 -0.3145635659398817E+00 -0.3367923550171064E+00\n -0.3584319099660255E+00 -0.3794692019194473E+00 -0.3998931040638364E+00 -0.4196943428370452E+00 -0.4388654449501550E+00\n -0.4574006806803239E+00 -0.4752960038707706E+00 -0.4925489890615999E+00 -0.5091587661615586E+00 -0.5251259530560686E+00\n -0.5404525865310800E+00 -0.5551420518758782E+00 -0.5691990115107658E+00 -0.5826293329679667E+00 -0.5954400165361110E+00\n -0.6076391228604799E+00 -0.6192357007728714E+00 -0.6302397156066638E+00 -0.6406619782344070E+00 -0.6505140750472834E+00\n -0.6598082990779603E+00 -0.6685575824509672E+00 -0.6767754303275997E+00 -0.6844758564958461E+00 -0.6916733207396428E+00\n -0.6983826681062417E+00 -0.7046190701754369E+00 -0.7103979684200303E+00 -0.7157350197331149E+00 -0.7206460441846081E+00\n -0.7251469750570049E+00 -0.7292538111984742E+00 -0.7329825717202728E+00 -0.7363492530549652E+00 -0.7393697883820587E+00\n -0.7420600094185869E+00 -0.7444356105635324E+00 -0.7465121153771925E+00 -0.7483048453692615E+00 -0.7498288910627880E+00\n -0.7510990852950691E+00 -0.7521299787110952E+00 -0.7529358174001737E+00 -0.7535305226219949E+00 -0.7539276725644879E+00\n -0.7541404860724225E+00 -0.7541818082827765E+00 -0.7540640981003759E+00 -0.7537994174452843E+00 -0.7533994222016963E+00\n -0.7528753547968463E+00 -0.7522380383374159E+00 -0.7514978722304342E+00 -0.7506648292152125E+00 -0.7497484537329505E+00\n -0.7487578615608312E+00 -0.7477017406379203E+00 -0.7465883530109418E+00 -0.7454255378288276E+00 -0.7442207153161546E+00\n -0.7429808916567682E+00 -0.7417126647203566E+00 -0.7404222305663006E+00 -0.7391153906607812E+00 -0.7377975597449168E+00\n -0.7364737742936068E+00 -0.7351487015066457E+00 -0.7338266487757376E+00 -0.7325115735730846E+00 -0.7312070937093148E+00\n -0.7299164979106890E+00 -0.7286427566676440E+00 -0.7273885333088894E+00 -0.7261561952575059E+00 -0.7249478254275804E+00\n -0.7237652337221139E+00 -0.7226099685950527E+00 -0.7214833286424112E+00 -0.7203863741895169E+00 -0.7193199388434760E+00\n -0.7182846409819289E+00 -0.7172808951511491E+00 -0.7163089233484455E+00 -0.7153687661656919E+00 -0.7144602937725963E+00\n -0.7135832167201219E+00 -0.7127370965461225E+00 -0.7119213561669281E+00 -0.7111352900401826E+00 -0.7103780740857679E+00\n -0.7096487753530824E+00 -0.7089463614243792E+00 -0.7082697095451826E+00 -0.7076176154740552E+00 -0.7069888020452744E+00\n -0.7063819274390548E+00 -0.7057955931550737E+00 -0.7052283516861344E+00 -0.7046787138897004E+00 -0.7041451560560322E+00\n -0.7036261266724787E+00 -0.7031200528842719E+00 -0.7026253466530071E+00 -0.7021404106145906E+00 -0.7016636436391807E+00\n -0.7011934460961990E+00 -0.7007282248280853E+00 -0.7002663978369600E+00 -0.6998063986888191E+00 -0.6993466806403545E+00\n -0.6988857204938393E+00 -0.6984220221858803E+00 -0.6979541201161606E+00 -0.6974805822225486E+00 -0.6970000128092043E+00\n -0.6965110551345379E+00 -0.6960123937660179E+00 -0.6955027567089953E+00 -0.6949809173168499E+00 -0.6944456959898160E+00\n -0.6938959616699598E+00 -0.6933306331398015E+00 -0.6927486801321128E+00 -0.6921491242584105E+00 -0.6915310397636959E+00\n -0.6908935541148920E+00 -0.6902358484304498E+00 -0.6895571577584888E+00 -0.6888567712107797E+00 -0.6881340319597943E+00\n -0.6873883371059062E+00 -0.6866191374217884E+00 -0.6858259369808462E+00 -0.6850082926764688E+00 -0.6841658136386904E+00\n -0.6832981605547428E+00 -0.6824050448998029E+00 -0.6814862280841192E+00 -0.6805415205224655E+00 -0.6795707806318362E+00\n -0.6785739137629465E+00 -0.6775508710711322E+00 -0.6765016483318922E+00 -0.6754262847062551E+00 -0.6743248614609347E+00\n -0.6731975006480673E+00 -0.6720443637491410E+00 -0.6708656502875580E+00 -0.6696615964141065E+00 -0.6684324734694262E+00\n -0.6671785865273722E+00 -0.6659002729230488E+00 -0.6645979007690805E+00 -0.6632718674635170E+00 -0.6619225981926605E+00\n -0.6605505444318366E+00 -0.6591561824471119E+00 -0.6577400118006743E+00 -0.6563025538625172E+00 -0.6548443503309030E+00\n -0.6533659617639238E+00 -0.6518679661243543E+00 -0.6503509573398282E+00 -0.6488155438802812E+00 -0.6472623473544041E+00\n -0.6456920011267967E+00 -0.6441051489573446E+00 -0.6425024436642409E+00 -0.6408845458119288E+00 -0.6392521224252083E+00\n -0.6376058457305376E+00 -0.6359463919255466E+00 -0.6342744399776308E+00 -0.6325906704524237E+00 -0.6308957643728299E+00\n -0.6291904021092484E+00 -0.6274752623015023E+00 -0.6257510208129137E+00 -0.6240183497169164E+00 -0.6222779163164849E+00\n -0.6205303821966133E+00 -0.6187764023100156E+00 -0.6170166240961311E+00 -0.6152516866334947E+00 -0.6134822198254523E+00\n -0.6117088436191340E+00 -0.6099321672576039E+00 -0.6081527885649929E+00 -0.6063712932644193E+00 -0.6045882543284419E+00\n -0.6028042313617739E+00 -0.6010197700159075E+00 -0.5992354014353167E+00 -0.5974516417348416E+00 -0.5956689915078388E+00\n -0.5938879353646483E+00 -0.5921089415009345E+00 -0.5903324612953872E+00 -0.5885589289362899E+00 -0.5867887610764325E+00\n -0.5850223565158195E+00 -0.5832600959116285E+00 -0.5815023415148403E+00 -0.5797494369329861E+00 -0.5780017069183963E+00\n -0.5762594571813876E+00 -0.5745229742277652E+00 -0.5727925252200571E+00 -0.5710683578618634E+00 -0.5693507003047140E+00\n -0.5676397610768275E+00 -0.5659357290331757E+00 -0.5642387733262232E+00 -0.5625490433967653E+00 -0.5608666689842511E+00\n -0.5591917601560096E+00 -0.5575244073547678E+00 -0.5558646814639211E+00 -0.5542126338899364E+00 -0.5525682966613572E+00\n -0.5509316825438423E+00 -0.5493027851706900E+00 -0.5476815791883145E+00 -0.5460680204161578E+00 -0.5444620460205136E+00\n -0.5428635747017666E+00 -0.5412725068945640E+00 -0.5396887249804451E+00 -0.5381120935124601E+00 -0.5365424594513395E+00\n -0.5349796524127961E+00 -0.5334234849255057E+00 -0.5318737526994184E+00 -0.5303302349039710E+00 -0.5287926944558559E+00\n -0.5272608783160018E+00 -0.5257345177954069E+00 -0.5242133288695329E+00 -0.5226970125009548E+00 -0.5211852549699725E+00\n -0.5196777282129478E+00 -0.5181740901680973E+00 -0.5166739851285399E+00 -0.5151770441023719E+00 -0.5136828851796083E+00\n -0.5121911139058056E+00 -0.5107013236622320E+00 -0.5092130960524547E+00 -0.5077260012952530E+00 -0.5062395986237541E+00\n -0.5047534366907523E+00 -0.5032670539801658E+00 -0.5017799792246062E+00 -0.5002917318290815E+00 -0.4988018223008544E+00\n -0.4973097526855100E+00 -0.4958150170093096E+00 -0.4943171017279344E+00 -0.4928154861817414E+00 -0.4913096430576898E+00\n -0.4897990388581003E+00 -0.4882831343764708E+00 -0.4867613851805592E+00 -0.4852332421030025E+00 -0.4836981517397486E+00\n -0.4821555569566233E+00 -0.4806048974043609E+00 -0.4790456100424820E+00 -0.4774771296724106E+00 -0.4758988894802721E+00\n -0.4743103215898168E+00 -0.4727108576259886E+00 -0.4710999292896421E+00 -0.4694769689439838E+00 -0.4678414102133217E+00\n -0.4661926885947614E+00 -0.4645302420834957E+00 -0.4628535118124025E+00 -0.4611619427066728E+00 -0.4594549841542420E+00\n -0.4577320906928324E+00 -0.4559927227144522E+00 -0.4542363471882220E+00 -0.4524624384024584E+00 -0.4506704787269636E+00\n -0.4488599593965099E+00 -0.4470303813165587E+00 -0.4451812558922650E+00 -0.4433121058818812E+00 -0.4414224662756842E+00\n -0.4395118852016028E+00 -0.4375799248587367E+00 -0.4356261624800019E+00 -0.4336501913251545E+00 -0.4316516217054698E+00\n -0.4296300820413793E+00 -0.4275852199543783E+00 -0.4255167033945205E+00 -0.4234242218048398E+00 -0.4213074873240124E+00\n -0.4191662360285776E+00 -0.4170002292160105E+00 -0.4148092547299044E+00 -0.4125931283284775E+00 -0.4103516950975684E+00\n -0.4080848309091941E+00 -0.4057924439266636E+00 -0.4034744761571206E+00 -0.4011309050522512E+00 -0.3987617451577198E+00\n -0.3963670498117089E+00 -0.3939469128927054E+00 -0.3915014706163934E+00 -0.3890309033812195E+00 -0.3865354376618079E+00\n -0.3840153479490107E+00 -0.3814709587348666E+00 -0.3789026465402212E+00 -0.3763108419821045E+00 -0.3736960318772730E+00\n -0.3710587613774890E+00 -0.3683996361312071E+00 -0.3657193244652975E+00 -0.3630185595792629E+00 -0.3602981417430927E+00\n -0.3575589404884341E+00 -0.3548018967810906E+00 -0.3520280251610328E+00 -0.3492384158340347E+00 -0.3464342366967726E+00\n -0.3436167352746726E+00 -0.3407872405489845E+00 -0.3379471646464616E+00 -0.3350980043615843E+00 -0.3322413424775305E+00\n -0.3293788488479631E+00 -0.3265122811972369E+00 -0.3236434855917447E+00 -0.3207743965298733E+00 -0.3179070365923667E+00\n -0.3150435155888747E+00 -0.3121860291300399E+00 -0.3093368565477600E+00 -0.3064983580792707E+00 -0.3036729712235190E+00\n -0.3008632061710796E+00 -0.2980716402017605E+00 -0.2953009109372595E+00 -0.2925537083300732E+00 -0.2898327652646850E+00\n -0.2871408466433073E+00 -0.2844807368267285E+00 -0.2818552253018305E+00 -0.2792670904519203E+00 -0.2767190813152813E+00\n -0.2742138972325089E+00 -0.2717541653057443E+00 -0.2693424156246247E+00 -0.2669810542566010E+00 -0.2646723340554829E+00\n -0.2624183234141169E+00 -0.2602208731776114E+00 -0.2580815820450847E+00 -0.2560017609230388E+00 -0.2539823968540338E+00\n -0.2520241173314579E+00 -0.2501271560242013E+00 -0.2482913211710008E+00 -0.2465159681564286E+00 -0.2447999780373049E+00\n -0.2431417440311489E+00 -0.2415391681797712E+00 -0.2399896705229777E+00 -0.2384902131086874E+00 -0.2370373409624846E+00\n -0.2356272416659091E+00 -0.2342558243668445E+00 -0.2329188177912029E+00 -0.2316118850938999E+00 -0.2303307511904072E+00\n -0.2290713356663495E+00 -0.2278298817525086E+00 -0.2266030696708936E+00 -0.2253881016292194E+00 -0.2241827467507004E+00\n -0.2229853380898954E+00 -0.2217947209120437E+00 -0.2206101607947411E+00 -0.2194312294160579E+00 -0.2182576912681023E+00\n -0.2170894123227367E+00 -0.2159263013992442E+00 -0.2147682815470252E+00 -0.2136152801508975E+00 -0.2124672267271450E+00\n -0.2113240526296465E+00 -0.2101856910076705E+00 -0.2090520767782083E+00 -0.2079231465985940E+00 -0.2067988388391586E+00\n -0.2056790935559256E+00 -0.2045638524633573E+00 -0.2034530589071708E+00 -0.2023466578372234E+00 -0.2012445957804879E+00\n -0.2001468208141218E+00 -0.1990532825386412E+00 -0.1979639320512100E+00 -0.1968787219190523E+00 -0.1957976061529950E+00\n -0.1947205401811518E+00 -0.1936474808227552E+00 -0.1925783862621419E+00 -0.1915132160229021E+00 -0.1904519309421991E+00\n -0.1893944931452612E+00 -0.1883408660200601E+00 -0.1872910141921747E+00 -0.1862449034998491E+00 -0.1852025009692512E+00\n -0.1841637747899360E+00 -0.1831286942905153E+00 -0.1820972299145447E+00 -0.1810693531966281E+00 -0.1800450367387435E+00\n -0.1790242541867973E+00 -0.1780069802074076E+00 -0.1769931904649212E+00 -0.1759828615986671E+00 -0.1749759712004503E+00\n -0.1739724977922888E+00 -0.1729724208043943E+00 -0.1719757205534020E+00 -0.1709823782208502E+00 -0.1699923758319090E+00\n -0.1690056962343670E+00 -0.1680223230778698E+00 -0.1670422407934179E+00 -0.1660654345731199E+00 -0.1650918903502081E+00\n -0.1641215947793118E+00 -0.1631545352169931E+00 -0.1621906997025439E+00 -0.1612300769390466E+00 -0.1602726562746950E+00\n -0.1593184276843816E+00 -0.1583673817515448E+00 -0.1574195096502818E+00 -0.1564748031277238E+00 -0.1555332544866742E+00\n -0.1545948565685086E+00 -0.1536596027363397E+00 -0.1527274868584397E+00 -0.1517985032919279E+00 -0.1508726468667154E+00\n -0.1499499128697113E+00 -0.1490302970292871E+00 -0.1481137954999969E+00 -0.1472004048475565E+00 -0.1462901220340763E+00\n -0.1453829444035485E+00 -0.1444788696675867E+00 -0.1435778958914185E+00 -0.1426800214801243E+00 -0.1417852451651289E+00\n -0.1408935659909356E+00 -0.1400049833021089E+00 -0.1391194967304976E+00 -0.1382371061827025E+00 -0.1373578118277804E+00\n -0.1364816140851888E+00 -0.1356085136129656E+00 -0.1347385112961426E+00 -0.1338716082353913E+00 -0.1330078057358998E+00\n -0.1321471052964751E+00 -0.1312895085988738E+00 -0.1304350174973551E+00 -0.1295836340084561E+00 -0.1287353603009860E+00\n -0.1278901986862372E+00 -0.1270481516084132E+00 -0.1262092216352652E+00 -0.1253734114489432E+00 -0.1245407238370528E+00\n -0.1237111616839186E+00 -0.1228847279620496E+00 -0.1220614257238084E+00 -0.1212412580932750E+00 -0.1204242282583109E+00\n -0.1196103394628140E+00 -0.1187995949991672E+00 -0.1179919982008737E+00 -0.1171875524353817E+00 -0.1163862610970906E+00\n -0.1155881276005403E+00 -0.1147931553737807E+00 -0.1140013478519165E+00 -0.1132127084708265E+00 -0.1124272406610577E+00\n -0.1116449478418844E+00 -0.1108658334155396E+00 -0.1100899007616072E+00 -0.1093171532315786E+00 -0.1085475941435698E+00\n -0.1077812267771939E+00 -0.1070180543685908E+00 -0.1062580801056096E+00 -0.1055013071231401E+00 -0.1047477384985937E+00\n -0.1039973772475303E+00 -0.1032502263194267E+00 -0.1025062885935886E+00 -0.1017655668751993E+00 -0.1010280638915064E+00\n -0.1002937822881413E+00 -0.9956272462557243E-01 -0.9883489337568613E-01 -0.9811029091849610E-01 -0.9738891953897792E-01\n -0.9667078142402649E-01 -0.9595587865953395E-01 -0.9524421322758671E-01 -0.9453578700377881E-01 -0.9383060175463867E-01\n -0.9312865913516950E-01 -0.9242996068649882E-01 -0.9173450783363590E-01 -0.9104230188333598E-01 -0.9035334402206746E-01\n -0.8966763531408090E-01 -0.8898517669957863E-01 -0.8830596899298146E-01 -0.8763001288129194E-01 -0.8695730892255034E-01\n -0.8628785754438455E-01 -0.8562165904264758E-01 -0.8495871358014560E-01 -0.8429902118545067E-01 -0.8364258175179907E-01\n -0.8298939503607108E-01 -0.8233946065785329E-01 -0.8169277809857793E-01 -0.8104934670074115E-01 -0.8040916566719632E-01\n -0.7977223406052095E-01 -0.7913855080245588E-01 -0.7850811467341570E-01 -0.7788092431206631E-01 -0.7725697821497177E-01\n -0.7663627473630474E-01 -0.7601881208762261E-01 -0.7540458833770475E-01 -0.7479360141245189E-01 -0.7418584909484364E-01\n -0.7358132902495440E-01 -0.7298003870002605E-01 -0.7238197547459475E-01 -0.7178713656067244E-01 -0.7119551902797848E-01\n -0.7060711980422413E-01 -0.7002193567544460E-01 -0.6943996328638005E-01 -0.6886119914090269E-01 -0.6828563960248966E-01\n -0.6771328089473920E-01 -0.6714411910192997E-01 -0.6657815016962187E-01 -0.6601536990529702E-01 -0.6545577397903950E-01\n -0.6489935792425362E-01 -0.6434611713841799E-01 -0.6379604688387538E-01 -0.6324914228865730E-01 -0.6270539834734140E-01\n -0.6216480992194123E-01 -0.6162737174282699E-01 -0.6109307840967654E-01 -0.6056192439245466E-01 -0.6003390403242120E-01\n -0.5950901154316545E-01 -0.5898724101166728E-01 -0.5846858639938206E-01 -0.5795304154335106E-01 -0.5744060015733360E-01\n -0.5693125583296245E-01 -0.5642500204092020E-01 -0.5592183213213570E-01 -0.5542173933900042E-01 -0.5492471677660394E-01\n -0.5443075744398622E-01 -0.5393985422540789E-01 -0.5345199989163673E-01 -0.5296718710124915E-01 -0.5248540840194668E-01\n -0.5200665623188704E-01 -0.5153092292102712E-01 -0.5105820069247997E-01 -0.5058848166388249E-01 -0.5012175784877501E-01\n -0.4965802115799089E-01 -0.4919726340105649E-01 -0.4873947628759936E-01 -0.4828465142876621E-01 -0.4783278033864765E-01\n -0.4738385443571101E-01 -0.4693786504423999E-01 -0.4649480339577959E-01 -0.4605466063058778E-01 -0.4561742779909139E-01\n -0.4518309586334694E-01 -0.4475165569850558E-01 -0.4432309809428110E-01 -0.4389741375642146E-01 -0.4347459330818220E-01\n -0.4305462729180289E-01 -0.4263750616998431E-01 -0.4222322032736679E-01 -0.4181176007201023E-01 -0.4140311563687321E-01\n -0.4099727718129280E-01 -0.4059423479246362E-01 -0.4019397848691562E-01 -0.3979649821199152E-01 -0.3940178384732158E-01\n -0.3900982520629698E-01 -0.3862061203754088E-01 -0.3823413402637604E-01 -0.3785038079629078E-01 -0.3746934191040018E-01\n -0.3709100687290486E-01 -0.3671536513054492E-01 -0.3634240607405034E-01 -0.3597211903958652E-01 -0.3560449331019496E-01\n -0.3523951811722967E-01 -0.3487718264178740E-01 -0.3451747601613299E-01 -0.3416038732511890E-01 -0.3380590560759827E-01\n -0.3345401985783308E-01 -0.3310471902689426E-01 -0.3275799202405693E-01 -0.3241382771818768E-01 -0.3207221493912545E-01\n -0.3173314247905550E-01 -0.3139659909387535E-01 -0.3106257350455455E-01 -0.3073105439848577E-01 -0.3040203043082867E-01\n -0.3007549022584622E-01 -0.2975142237823227E-01 -0.2942981545443215E-01 -0.2911065799395422E-01 -0.2879393851067332E-01\n -0.2847964549412637E-01 -0.2816776741079883E-01 -0.2785829270540316E-01 -0.2755120980214808E-01 -0.2724650710599997E-01\n -0.2694417300393482E-01 -0.2664419586618161E-01 -0.2634656404745713E-01 -0.2605126588819128E-01 -0.2575828971574435E-01\n -0.2546762384561452E-01 -0.2517925658263681E-01 -0.2489317622217316E-01 -0.2460937105129300E-01 -0.2432782934994559E-01\n -0.2404853939212278E-01 -0.2377148944701278E-01 -0.2349666778014561E-01 -0.2322406265452879E-01 -0.2295366233177469E-01\n -0.2268545507321884E-01 -0.2241942914102913E-01 -0.2215557279930686E-01 -0.2189387431517832E-01 -0.2163432195987824E-01\n -0.2137690400982439E-01 -0.2112160874768343E-01 -0.2086842446342893E-01 -0.2061733945539015E-01 -0.2036834203129333E-01\n -0.2012142050929418E-01 -0.1987656321900255E-01 -0.1963375850249907E-01 -0.1939299471534369E-01 -0.1915426022757691E-01\n -0.1891754342471287E-01 -0.1868283270872514E-01 -0.1845011649902528E-01 -0.1821938323343368E-01 -0.1799062136914412E-01\n -0.1776381938368037E-01 -0.1753896577584702E-01 -0.1731604906667307E-01 -0.1709505780034925E-01 -0.1687598054515926E-01\n -0.1665880589440464E-01 -0.1644352246732421E-01 -0.1623011891000752E-01 -0.1601858389630291E-01 -0.1580890612872058E-01\n -0.1560107433933019E-01 -0.1539507729065434E-01 -0.1519090377655698E-01 -0.1498854262312769E-01 -0.1478798268956219E-01\n -0.1458921286903872E-01 -0.1439222208959125E-01 -0.1419699931497929E-01 -0.1400353354555478E-01 -0.1381181381912668E-01\n -0.1362182921182277E-01 -0.1343356883894992E-01 -0.1324702185585244E-01 -0.1306217745876907E-01 -0.1287902488568931E-01\n -0.1269755341720873E-01 -0.1251775237738444E-01 -0.1233961113459019E-01 -0.1216311910237258E-01 -0.1198826574030775E-01\n -0.1181504055485940E-01 -0.1164343310023902E-01 -0.1147343297926770E-01 -0.1130502984424104E-01 -0.1113821339779698E-01\n -0.1097297339378707E-01 -0.1080929963815219E-01 -0.1064718198980239E-01 -0.1048661036150212E-01 -0.1032757472076096E-01\n -0.1017006509073034E-01 -0.1001407155110739E-01 -0.9859584239045534E-02 -0.9706593350073452E-02 -0.9555089139022180E-02\n -0.9405061920961404E-02 -0.9256502072145643E-02 -0.9109400030970487E-02 -0.8963746298940305E-02 -0.8819531441647413E-02\n -0.8676746089763751E-02 -0.8535380940045894E-02 -0.8395426756353708E-02 -0.8256874370684052E-02 -0.8119714684219669E-02\n -0.7983938668394324E-02 -0.7849537365975339E-02 -0.7716501892163617E-02 -0.7584823435712779E-02 -0.7454493260067761E-02\n -0.7325502704523865E-02 -0.7197843185407555E-02 -0.7071506197279220E-02 -0.6946483314159568E-02 -0.6822766190779977E-02\n -0.6700346563858386E-02 -0.6579216253401177E-02 -0.6459367164032316E-02 -0.6340791286350805E-02 -0.6223480698317331E-02\n -0.6107427566671246E-02 -0.5992624148378852E-02 -0.5879062792113993E-02 -0.5766735939772315E-02 -0.5655636128019704E-02\n -0.5545755989876484E-02 -0.5437088256338068E-02 -0.5329625758033137E-02 -0.5223361426920646E-02 -0.5118288298026128E-02\n -0.5014399511218785E-02 -0.4911688313029938E-02 -0.4810148058513781E-02 -0.4709772213151562E-02 -0.4610554354799431E-02\n -0.4512488175681280E-02 -0.4415567484426667E-02 -0.4319786208154660E-02 -0.4225138394604049E-02 -0.4131618214309937E-02\n -0.4039219962827338E-02 -0.3947938063001268E-02 -0.3857767067283620E-02 -0.3768701660096141E-02 -0.3680736660238960E-02\n -0.3593867023344052E-02 -0.3508087844372004E-02 -0.3423394360151161E-02 -0.3339781951956864E-02 -0.3257246148128755E-02\n -0.3175782626723511E-02 -0.3095387218199560E-02 -0.3016055908130390E-02 -0.2937784839941740E-02 -0.2860570317667780E-02\n -0.2784408808720544E-02 -0.2709296946665686E-02 -0.2635231533997301E-02 -0.2562209544902880E-02 -0.2490228128008725E-02\n -0.2419284609094953E-02 -0.2349376493767305E-02 -0.2280501470072159E-02 -0.2212657411038820E-02 -0.2145842377131630E-02\n -0.2080054618592456E-02 -0.2015292577651429E-02 -0.1951554890581906E-02 -0.1888840389572373E-02 -0.1827148104385303E-02\n -0.1766477263769774E-02 -0.1706827296590603E-02 -0.1648197832633426E-02 -0.1590588703040315E-02 -0.1533999940326040E-02\n -0.1478431777920006E-02 -0.1423884649172962E-02 -0.1370359185761869E-02 -0.1317856215419179E-02 -0.1266376758905965E-02\n -0.1215922026140108E-02 -0.1166493411382406E-02 -0.1118092487374301E-02 -0.1070720998310677E-02 -0.1024380851520841E-02\n -0.9790741077189988E-03 -0.9348029696732801E-03 -0.8915697691294780E-03 -0.8493769518112139E-03 -0.8082270603040555E-03\n -0.7681227146151712E-03 -0.7290665901840791E-03 -0.6910613931034242E-03 -0.6541098322911179E-03 -0.6182145883382149E-03\n -0.5833782787391545E-03 -0.5496034191941447E-03 -0.5168923806574943E-03 -0.4852473417906704E-03 -0.4546702364667819E-03\n -0.4251626959634362E-03 -0.3967259854759182E-03 -0.3693609345830440E-03 -0.3430678613055810E-03 -0.3178464894144324E-03\n -0.2936958586742664E-03 -0.2706142277521279E-03 -0.2485989695820504E-03 -0.2276464590608424E-03 -0.2077519530613687E-03\n -0.1889094628931880E-03 -0.1711116195232660E-03 -0.1543495320979493E-03 -0.1386126405900494E-03 -0.1238885637399120E-03\n -0.1101629438755946E-03 -0.9741929069423303E-04 -0.8563882667209854E-04 -0.7480033745236668E-04 -0.6488003134095919E-04\n -0.5585141292167375E-04 -0.4768517677466276E-04 -0.4034912832859186E-04 -0.3380813996360609E-04 -0.2802415155542768E-04\n -0.2295622562937124E-04 -0.1856066806040990E-04 -0.1479122565136393E-04 -0.1159937173437365E-04 -0.8934689902304919E-05\n -0.6745363761688971E-05 -0.4978776837729040E-05 -0.3582221071745688E-05 -0.2503704396851613E-05 -0.1692837474640400E-05\n -0.1101766951461853E-05 -0.6861082076102529E-06 -0.4058159914808505E-06 -0.2259190936022548E-06 -0.1170390843846189E-06\n -0.5561789832021472E-07 -0.2379962422071496E-07 -0.8951415949547709E-08 -0.2865311296782646E-08 -0.7469799452895257E-09\n -0.1491286872225022E-09 -0.2085937681520927E-10 -0.1788909961745903E-11 -0.7627333239967911E-13 -0.1139998169589491E-14\n -0.3184439268690364E-17 -0.4725628150249130E-21 -0.1979177475376566E-27 -0.3507608647733454E-40 -0.1993203231761145E-78\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.2092827306407022E+00  0.4057670184399992E+00  0.5898979350532600E+00  0.7621100296525628E+00\n  0.9228266176030425E+00  0.1072464703931703E+01  0.1211436937704310E+01  0.1340155639290343E+01  0.1459036896649656E+01\n  0.1568504688229295E+01  0.1668994708900562E+01  0.1760957569185768E+01  0.1844861052822834E+01  0.1921191152910295E+01\n  0.1990451661396074E+01  0.2053162158653891E+01  0.2109854336461265E+01  0.2161066684867483E+01  0.2207337676111377E+01\n  0.2249197680806415E+01  0.2287159946209046E+01  0.2321711046373938E+01  0.2353301272500611E+01  0.2382335462875013E+01\n  0.2409164771274074E+01  0.2434079838629096E+01  0.2457305766029753E+01  0.2478999191665430E+01  0.2499247656714136E+01\n  0.2518071314420061E+01  0.2535426902944383E+01  0.2551213776615215E+01  0.2565281681669818E+01  0.2577439879309795E+01\n  0.2587467166041904E+01  0.2595122320937184E+01  0.2600154520609984E+01  0.2602313301685621E+01  0.2601357711533437E+01\n  0.2597064364112607E+01  0.2589234201573016E+01  0.2577697846846366E+01  0.2562319511937518E+01  0.2542999496459417E+01\n  0.2519675368173886E+01  0.2492321960446077E+01  0.2460950350463687E+01  0.2425605997739516E+01  0.2386366226474959E+01\n  0.2343337229915742E+01  0.2296650762147126E+01  0.2246460665073238E+01  0.2192939357621151E+01  0.2136274392226351E+01\n  0.2076665161774061E+01  0.2014319819428672E+01  0.1949452454898987E+01  0.1882280554098696E+01  0.1813022755076766E+01\n  0.1741896901539862E+01  0.1669118386164077E+01  0.1594898769003028E+01  0.1519444651395879E+01  0.1442956782587889E+01\n  0.1365629374518453E+01  0.1287649599638170E+01  0.1209197246937915E+01  0.1130444512385982E+01  0.1051555901479737E+01\n  0.9726882234608905E+00  0.8939906587816835E+00  0.8156048835327433E+00  0.7376652366657381E+00  0.6602989178988580E+00\n  0.5836262061335374E+00  0.5077606900028175E+00  0.4328095037959179E+00  0.3588735634485049E+00  0.2860477985519050E+00\n  0.2144213774203916E+00  0.1440779231718307E+00  0.7509571953458535E-01  0.7547905706075591E-02 -0.5849733992897237E-01\n -0.1229766270456308E+00 -0.1858311911485266E+00 -0.2470067412388819E+00 -0.3064533166418045E+00 -0.3641251522021267E+00\n -0.4199805510487963E+00 -0.4739817641533713E+00 -0.5260948759595897E+00 -0.5762896954288581E+00 -0.6245396519239588E+00\n -0.6708216954350136E+00 -0.7151162007320108E+00 -0.7574068751038985E+00 -0.7976806694123654E+00 -0.8359276922467996E+00\n -0.8721411270148933E+00 -0.9063171518391930E+00 -0.9384548621556141E+00 -0.9685561959238236E+00 -0.9966258613642036E+00\n -0.1022671267132381E+01 -0.1046702454831763E+01 -0.1068732033749353E+01 -0.1088775117682357E+01 -0.1106849263704848E+01\n -0.1122974412708365E+01 -0.1137172831539331E+01 -0.1149469056553965E+01 -0.1159889838419920E+01 -0.1168464088017379E+01\n -0.1175222823334259E+01 -0.1180199117315087E+01 -0.1183428046714909E+01 -0.1184946642134393E+01 -0.1184793839575426E+01\n -0.1183010434064154E+01 -0.1179639036149073E+01 -0.1174724032402013E+01 -0.1168311551439714E+01 -0.1160449437451607E+01\n -0.1151187233775371E+01 -0.1140576179713346E+01 -0.1128669224538139E+01 -0.1115521063495940E+01 -0.1101188201577848E+01\n -0.1085729051876920E+01 -0.1069204076448596E+01 -0.1051675978683903E+01 -0.1033209957189757E+01 -0.1013874031892834E+01\n -0.9937394533112268E+00 -0.9728812053358954E+00 -0.9513786099635553E+00 -0.9293160385930985E+00 -0.9067837279225540E+00\n -0.8838786881577604E+00 -0.8607056760163188E+00 -0.8373781836996756E+00 -0.8140193666454354E+00 -0.7907627971280821E+00\n -0.7677528886053459E+00 -0.7451447902474176E+00 -0.7231035087242984E+00 -0.7018019856777432E+00 -0.6814178596116595E+00\n -0.6621286890901025E+00 -0.6441055293683786E+00 -0.6275049500959465E+00 -0.6124598554819389E+00 -0.5990697931249144E+00\n -0.5873917551816811E+00 -0.5774326999496706E+00 -0.5691450588850681E+00 -0.5624262731985009E+00 -0.5571229156877342E+00\n -0.5530392710790523E+00 -0.5499495211576281E+00 -0.5476120912055904E+00 -0.5457844127402661E+00 -0.5442364096307576E+00\n -0.5427613802609629E+00 -0.5411835048730576E+00 -0.5393618006932226E+00 -0.5371908460844405E+00 -0.5345989223491749E+00\n -0.5315443627327854E+00 -0.5280108835019925E+00 -0.5240025549054657E+00 -0.5195389048925442E+00 -0.5146504785947575E+00\n -0.5093750286076997E+00 -0.5037543971983343E+00 -0.4978320732717670E+00 -0.4916513597181557E+00 -0.4852540635555492E+00\n -0.4786796148269129E+00 -0.4719645242683226E+00 -0.4651420995758296E+00 -0.4582423523395834E+00 -0.4512920402678477E+00\n -0.4443148009770967E+00 -0.4373313437888304E+00 -0.4303596744600146E+00 -0.4234153346275730E+00 -0.4165116431348047E+00\n -0.4096599305448206E+00 -0.4028697612557244E+00 -0.3961491399203882E+00 -0.3895047005196642E+00 -0.3829418775915900E+00\n -0.3764650599017688E+00 -0.3700777273477470E+00 -0.3637825721974685E+00 -0.3575816059257799E+00 -0.3514762529766660E+00\n -0.3454674327743286E+00 -0.3395556312570763E+00 -0.3337409631312600E+00 -0.3280232259503844E+00 -0.3224019470255501E+00\n -0.3168764240734279E+00 -0.3114457604107825E+00 -0.3061088954126595E+00 -0.3008646308661068E+00 -0.2957116537733492E+00\n -0.2906485560879659E+00 -0.2856738518046101E+00 -0.2807859917668553E+00 -0.2759833765084032E+00 -0.2712643673995287E+00\n -0.2666272963328205E+00 -0.2620704741493222E+00 -0.2575921979776381E+00 -0.2531907576339031E+00 -0.2488644412092475E+00\n -0.2446115399531009E+00 -0.2404303525450218E+00 -0.2363191888342949E+00 -0.2322763731150775E+00 -0.2283002469950982E+00\n -0.2243891719075561E+00 -0.2205415313087940E+00 -0.2167557325982774E+00 -0.2130302087922870E+00 -0.2093634199784029E+00\n -0.2057538545741509E+00 -0.2022000304100722E+00 -0.1987004956548198E+00 -0.1952538295976336E+00 -0.1918586433016487E+00\n -0.1885135801398642E+00 -0.1852173162242242E+00 -0.1819685607370943E+00 -0.1787660561734181E+00 -0.1756085785009749E+00\n -0.1724949372454470E+00 -0.1694239755063514E+00 -0.1663945699093716E+00 -0.1634056305001383E+00 -0.1604561005841044E+00\n -0.1575449565168044E+00 -0.1546712074484661E+00 -0.1518338950266697E+00 -0.1490320930604994E+00 -0.1462649071494050E+00\n -0.1435314742798000E+00 -0.1408309623922306E+00 -0.1381625699217879E+00 -0.1355255253142844E+00 -0.1329190865205691E+00\n -0.1303425404712269E+00 -0.1277952025337876E+00 -0.1252764159544457E+00 -0.1227855512861943E+00 -0.1203220058051661E+00\n -0.1178852029168765E+00 -0.1154745915539778E+00 -0.1130896455670350E+00 -0.1107298631097586E+00 -0.1083947660200428E+00\n -0.1060838991980789E+00 -0.1037968299827469E+00 -0.1015331475274080E+00 -0.9929246217615594E-01 -0.9707440484152201E-01\n -0.9487862638456054E-01 -0.9270479699818115E-01 -0.9055260559454251E-01 -0.8842175919725527E-01 -0.8631198233909854E-01\n -0.8422301646589628E-01 -0.8215461934715129E-01 -0.8010656449399124E-01 -0.7807864058492887E-01 -0.7607065089990145E-01\n -0.7408241276301041E-01 -0.7211375699433867E-01 -0.7016452737119373E-01 -0.6823458009908026E-01 -0.6632378329267392E-01\n -0.6443201646703840E-01 -0.6255917003929234E-01 -0.6070514484090285E-01 -0.5886985164075899E-01 -0.5705321067914502E-01\n -0.5525515121271331E-01 -0.5347561107053028E-01 -0.5171453622124416E-01 -0.4997188035140731E-01 -0.4824760445495881E-01\n -0.4654167643385925E-01 -0.4485407070984989E-01 -0.4318476784728866E-01 -0.4153375418700541E-01 -0.3990102149109915E-01\n -0.3828656659858688E-01 -0.3669039109180319E-01 -0.3511250097343621E-01 -0.3355290635407111E-01 -0.3201162115010978E-01\n -0.3048866279191616E-01 -0.2898405194203557E-01 -0.2749781222332479E-01 -0.2602996995682040E-01 -0.2458055390917123E-01\n -0.2314959504944821E-01 -0.2173712631514516E-01 -0.2034318238717427E-01 -0.1896779947365720E-01 -0.1761101510230969E-01\n -0.1627286792121220E-01 -0.1495339750775495E-01 -0.1365264418554666E-01 -0.1237064884906971E-01 -0.1110745279586314E-01\n -0.9863097566016712E-02 -0.8637624788750709E-02 -0.7431076035862909E-02 -0.6243492681816734E-02 -0.5074915770246633E-02\n -0.3925385886656976E-02 -0.2794943037087542E-02 -0.1683626532521779E-02 -0.5914748788115108E-03  0.4814743281079707E-03\n  0.1535184501935395E-02  0.2569620160881108E-02  0.3584747017927284E-02  0.4580532066695804E-02  0.5556943663146154E-02\n  0.6513951603328201E-02  0.7451527197409622E-02  0.8369643340202203E-02  0.9268274578406274E-02  0.1014739717479459E-01\n  0.1100698916955656E-01  0.1184703043902031E-01  0.1266750275197406E-01  0.1346838982380348E-01  0.1424967736866517E-01\n  0.1501135314991321E-01  0.1575340702899826E-01  0.1647583101305540E-01  0.1717861930140175E-01  0.1786176833115984E-01\n  0.1852527682222726E-01  0.1916914582181181E-01  0.1979337874875210E-01  0.2039798143784515E-01  0.2098296218440263E-01\n  0.2154833178926046E-01  0.2209410360446425E-01  0.2262029357986047E-01  0.2312692031081800E-01  0.2361400508731372E-01\n  0.2408157194461195E-01  0.2452964771577501E-01  0.2495826208624157E-01  0.2536744765071304E-01  0.2575723997259286E-01\n  0.2612767764622501E-01  0.2647880236218226E-01  0.2681065897585869E-01  0.2712329557962571E-01  0.2741676357881194E-01\n  0.2769111777177585E-01  0.2794641643434182E-01  0.2818272140887457E-01  0.2840009819827491E-01  0.2859861606518020E-01\n  0.2877834813666253E-01  0.2893937151471862E-01  0.2908176739285332E-01  0.2920562117906286E-01  0.2931102262552834E-01\n  0.2939806596533533E-01  0.2946685005654058E-01  0.2951747853391014E-01  0.2955005996865805E-01  0.2956470803651828E-01\n  0.2956154169448472E-01  0.2954068536655733E-01  0.2950226913883336E-01  0.2944642896428323E-01  0.2937330687754944E-01\n  0.2928305122010533E-01  0.2917581687610584E-01  0.2905176551925757E-01  0.2891106587102654E-01  0.2875389397049235E-01\n  0.2858043345614350E-01  0.2839087585989199E-01  0.2818542091356523E-01  0.2796427686810767E-01  0.2772766082569555E-01\n  0.2747579908493241E-01  0.2720892749925168E-01  0.2692729184860401E-01  0.2663114822445014E-01  0.2632076342801500E-01\n  0.2599641538168244E-01  0.2565839355332355E-01  0.2530699939325154E-01  0.2494254678338238E-01  0.2456536249805061E-01\n  0.2417578667578270E-01  0.2377417330116236E-01  0.2336089069573457E-01  0.2293632201668000E-01  0.2250086576175244E-01\n  0.2205493627870053E-01  0.2159896427709156E-01  0.2113339734011533E-01  0.2065870043356471E-01  0.2017535640876495E-01\n  0.1968386649574995E-01  0.1918475078245607E-01  0.1867854867511944E-01  0.1816581933441314E-01  0.1764714208114318E-01\n  0.1712311676453094E-01  0.1659436408523645E-01  0.1606152586432164E-01  0.1552526524830300E-01  0.1498626683930028E-01\n  0.1444523673804386E-01  0.1390290248615655E-01  0.1336001289267242E-01  0.1281733772819916E-01  0.1227566726846887E-01\n  0.1173581166726628E-01  0.1119860013688112E-01  0.1066487991231793E-01  0.1013551497353980E-01  0.9611384498049214E-02\n  0.9093381014167966E-02  0.8582408223524964E-02  0.8079378459570645E-02  0.7585209747505587E-02  0.7100822429962137E-02\n  0.6627135322258290E-02  0.6165061361244632E-02  0.5715502712913672E-02  0.5279345306314358E-02  0.4857452765248114E-02\n  0.4450659715107746E-02  0.4059764450523725E-02  0.3685520960736674E-02  0.3328630324427772E-02  0.2989731504787848E-02\n  0.2669391599617415E-02  0.2368095630986141E-02  0.2086235995182996E-02  0.1824101737017772E-02  0.1581867863467087E-02\n  0.1359584970329603E-02  0.1157169521569523E-02  0.9743951931644752E-03  0.8108857691386213E-03  0.6661101530243749E-03\n  0.5393801270545922E-03  0.4298515449594449E-03  0.3365296699754433E-03  0.2582793513780087E-03  0.1938406504102719E-03\n  0.1418503565121643E-03  0.1008695525362177E-03  0.6941697110285677E-04  0.4600732088117413E-04  0.2919305903894978E-04\n  0.1760728677207078E-04  0.1000464291784026E-04  0.5296427334745831E-05  0.2575932371020878E-05  0.1130373835070578E-05\n  0.4371389867137730E-06  0.1443839527546615E-06  0.3903079296907923E-07  0.8136509367815676E-08  0.1200603994451306E-08\n  0.1103313091144371E-09  0.5169033352084336E-11  0.8862989414281884E-13  0.3078210235071099E-15  0.6727297563933329E-19\n  0.6350331239490211E-25  0.1073811882539351E-36  0.6326995303161769E-70  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n"
  },
  {
    "path": "src/test/resources/samples/langs/Formatted/long_seq.for",
    "content": "ACCEPTABLE LEFT PRIMERS\n                                  1-based     #                self   self hair-  qual-\n   # sequence                       start ln  N   GC%     Tm any_th end_th   pin   lity\n   0 tgctagctaggcgatgctag             411 20  0 55.00 60.028 23.16 23.16 38.59  0.028\n   1 actgatacgcgatgctagct             476 20  0 50.00 59.957 17.69  1.35  0.00  0.043\n   2 gatcgatgctagctaggcga             405 20  0 55.00 60.100 16.30 16.30  0.00  0.100\n   3 tcgatcgatgctagctaggc             403 20  0 55.00 60.100 18.63  8.45  0.00  0.100\n   4 tagctgatcgatcgtagcgg             565 20  0 55.00 60.101 25.02 17.36  0.00  0.101\n   5 gctgactgatcgatcgatgc             113 20  0 55.00 59.826 24.08 17.09 35.21  0.174\n   6 tatcatctctgcgcgatcga             361 20  0 50.00 59.747 22.07  1.72 38.48  0.253\n   7 agctaggcgatgctagctag             415 20  0 55.00 59.742 17.46 17.46 41.54  0.258\n   8 ctagctaggcgatgctagct             413 20  0 55.00 59.742 18.68 17.35 43.53  0.258\n   9 ggcgatctagctagctgact             583 20  0 55.00 59.671 17.44  7.44 37.58  0.329\n  10 tcgatgctagctaggcgatg             407 20  0 55.00 60.382 14.03  0.00  0.00  0.382\n  11 gctgatcgatcgatgctagc             398 20  0 55.00 59.618 25.97 24.79 35.21  0.382\n  12 gctagctgatcgatcgatgc             394 20  0 55.00 59.618 24.08 21.09 35.21  0.382\n  13 atcatctctgcgcgatcgat             362 20  0 50.00 60.382 22.07  5.02 38.48  0.382\n  14 gactgatacgcgatgctagc             475 20  0 55.00 59.551  8.61  8.61  0.00  0.449\n  15 atcgatgctagctaggcgat             406 20  0 50.00 59.452 18.43 18.43  0.00  0.548\n  16 gctagctgactgatacgcga             468 20  0 55.00 60.589 16.29  0.00  0.00  0.589\n  17 agctagctgactgatacgcg             467 20  0 55.00 60.590 17.99  3.89  0.00  0.590\n  18 atgctagctaggcgatgcta             410 20  0 50.00 59.375 10.59  8.91  0.00  0.625\n  19 ctatcatctctgcgcgatcg             360 20  0 55.00 59.347 12.19 12.19 39.07  0.653\n  20 gatgctagctaggcgatgct             409 20  0 55.00 60.668  7.01  7.53  0.00  0.668\n  21 gctactatcatctctgcgcg             356 20  0 55.00 59.273  0.00  0.00  0.00  0.727\n  22 cgtagcggcgatctagctag             577 20  0 60.00 60.791 15.64 15.64 37.58  0.791\n  23 cggcgatctagctagctgac             582 20  0 60.00 61.003 14.84  7.25 38.70  1.003\n  24 gctagctgatcgatcgtagc             563 20  0 55.00 58.995 23.70 23.70  0.00  1.005\n  25 gatcgatcgatgtgcggcta              81 20  0 55.00 61.006 19.16  0.00 41.65  1.006\n  26 atcgatcgatgtgcggctag              82 20  0 55.00 61.008 29.65  0.00 41.65  1.008\n  27 gctgactgatacgcgatgc              472 19  0 57.89 60.025  0.00  0.00  0.00  1.025\n  28 agctagctgatcatcgatgct            190 21  0 47.62 60.035 17.99 11.09  0.00  1.035\n  29 gctagctagctgactgatcga            105 21  0 52.38 60.037 34.38  0.00 46.11  1.037\n  30 tcatctctgcgcgatcgat              363 19  0 52.63 59.946 22.07  0.12 38.48  1.054\n  31 atcatctctgcgcgatcga              362 19  0 52.63 59.946 22.07  1.72 38.48  1.054\n  32 atcgatcgatgtgcggcta               82 19  0 52.63 59.945 29.65  0.00 41.65  1.055\n  33 gtagcggcgatctagctagc             578 20  0 60.00 61.071 16.97  7.15 39.86  1.071\n  34 gctagctgactgatcgatcg             109 20  0 55.00 58.924 16.84 13.89  0.00  1.076\n  35 gctgatcgatcgatgtgcg               78 19  0 57.89 60.097 29.87 18.15 42.69  1.097\n  36 tatcatctctgcgcgatcgat            361 21  0 47.62 60.172 22.07 11.47 38.48  1.172\n  37 gctagctagctgatcgatcga            390 21  0 52.38 60.172 34.38 22.52 46.11  1.172\n  38 gctagctagctgatcgatcga             70 21  0 52.38 60.172 34.38 22.52 46.11  1.172\n  39 catctctgcgcgatcgatg              364 19  0 57.89 59.810 13.74 13.74 38.48  1.190\n  40 tcgtagcggcgatctagcta             576 20  0 55.00 61.231 11.55  9.27 36.40  1.231\n  41 actgatacgcgatgctagcta            476 21  0 47.62 59.765 17.69  3.08  0.00  1.235\n  42 actgatcgatcgatgctagct            117 21  0 47.62 59.763 23.29 11.70 35.21  1.237\n  43 agctagctgatcgatcgatgt             73 21  0 47.62 59.763 17.99  2.62 35.21  1.237\n  44 tagcggcgatctagctagct             579 20  0 55.00 61.243 23.74 23.74 46.60  1.243\n  45 cgtagcggcgatctagcta              577 19  0 57.89 59.729 11.55  9.27 37.58  1.271\n  46 ctagctgatcgatcgtagcg             564 20  0 55.00 58.727 25.02 15.05  0.00  1.273\n  47 tagcggcgatctagctagc              579 19  0 57.89 59.725 16.97  9.14 39.86  1.275\n  48 catcgatcgatgcatgcatg             442 20  0 50.00 58.722 37.80 23.31 44.93  1.278\n  49 tcatctctgcgcgatcgatg             363 20  0 55.00 61.279 18.01 18.01 38.48  1.279\n  50 gctagctagctgatcgatcg             559 20  0 55.00 58.714 34.38 11.90 46.11  1.286\n  51 gctagctagctgatcgatcg             390 20  0 55.00 58.714 34.38 11.90 46.11  1.286\n  52 gctagctagctgatcgatcg              70 20  0 55.00 58.714 34.38 11.90 46.11  1.286\n  53 agcatcggattagctagctga              3 21  0 47.62 59.689 28.29 20.88  0.00  1.311\n  54 agctgatcgatcgtagcgg              566 19  0 57.89 60.315 25.02 17.36  0.00  1.315\n  55 cggcgatctagctagctga              582 19  0 57.89 59.650 21.57 16.66 38.70  1.350\n  56 ctagctgatcgatcgatgtgc             75 21  0 52.38 59.643 31.83 30.04 35.21  1.357\n  57 gctagctgatcgatcgatgtg             74 21  0 52.38 59.643 12.06  6.93 35.21  1.357\n  58 gctagctaggcgatgctagc             412 20  0 60.00 61.357 30.41 30.41 46.19  1.357\n  59 tagctagctgactgatacgcg            466 21  0 52.38 60.373 28.29  3.89  0.00  1.373\n  60 gctagctgactgatcgatcga            109 21  0 52.38 60.374 22.52 22.52  0.00  1.374\n  61 agctagctgactgatcgatcg            108 21  0 52.38 60.374 17.99 13.89  0.00  1.374\n  62 cgatcgatgctagctaggcg             404 20  0 60.00 61.409 15.59  9.14  0.00  1.409\n  63 gctagctagctgactgatcg             105 20  0 55.00 58.563 34.38  1.84 46.11  1.437\n  64 atgctagctaggcgatgct              410 19  0 52.63 59.561 10.59  7.53  0.00  1.439\n  65 agctagctgatcgatcgtagc            562 21  0 52.38 60.441 26.87 26.87  0.00  1.441\n  66 gctagctagctgatcgatcgt            559 21  0 52.38 60.441 34.38  2.65 46.11  1.441\n  67 tagctaggcgatgctagctag            414 21  0 52.38 59.559 18.42 17.46 42.44  1.441\n  68 ctagctaggcgatgctagcta            413 21  0 52.38 59.559 18.69 17.64 42.44  1.441\n  69 tagctgatcgatcgatgtgc              76 20  0 50.00 58.558 31.83 30.04 35.21  1.442\n  70 gatgctagctaggcgatgcta            409 21  0 52.38 60.444  9.82  8.91  0.00  1.444\n  71 atgctagctaggcgatgctag            410 21  0 52.38 60.444 23.16 23.16 38.59  1.444\n  72 gctagctgatcatcgatgct             191 20  0 50.00 58.539 16.29 12.14  0.00  1.461\n  73 agctagctgatcatcgatgc             190 20  0 50.00 58.539 21.42  9.22  0.00  1.461\n  74 gctgactgatacgcgatgct             472 20  0 55.00 61.494  2.33  0.00  0.00  1.494\n  75 agctgactgatacgcgatgc             471 20  0 55.00 61.494  3.47  0.00  0.00  1.494\n  76 ggcgatctagctagctgacta            583 21  0 52.38 59.491 17.44  5.40 37.58  1.509\n  77 gatcgatgctagctaggcgat            405 21  0 52.38 60.510 21.61 21.61  0.00  1.510\n  78 atcgatcgatgctagctaggc            402 21  0 52.38 60.510 29.65  8.45 33.56  1.510\n  79 ctgatcgatcgatgtgcgg               79 19  0 57.89 59.447 15.54  5.83 41.65  1.553\n  80 agctgatcgatcgatgtgcg              77 20  0 55.00 61.556 31.92 20.26 42.69  1.556\n  81 cgatcatcgatgctagctagc            548 21  0 52.38 59.444 34.89 34.89 46.99  1.556\n  82 tagctaggcgatgctagcta             414 20  0 50.00 58.433 19.37 17.81 42.44  1.567\n  83 agctagctactgatcgatgct            303 21  0 47.62 59.415 17.56 11.51  0.00  1.585\n  84 tcgatcgatgtgcggctag               83 19  0 57.89 60.606 18.63  0.00 41.65  1.606\n  85 gactgatcgatcgatgctagc            116 21  0 52.38 59.378 15.86  8.45 35.21  1.622\n  86 agctagctgactgatcgatca            260 21  0 47.62 59.347 26.99 26.99 35.44  1.653\n  87 ctgactgatacgcgatgctag            473 21  0 52.38 59.312  1.70  0.00  0.00  1.688\n  88 ctagctgactgatacgcgatg            469 21  0 52.38 59.312  0.00  0.00  0.00  1.688\n  89 gctactatcatctctgcgcga            356 21  0 52.38 60.707  2.71  2.71  0.00  1.707\n  90 agctactatcatctctgcgcg            355 21  0 52.38 60.709  0.00  0.00  0.00  1.709\n  91 actatcatctctgcgcgatc             359 20  0 50.00 58.270  4.99  0.00  0.00  1.730\n  92 actgatcgatcgatgctagc             117 20  0 50.00 58.270 23.29 13.61 35.21  1.730\n  93 gctagctgatcgatcgatgt              74 20  0 50.00 58.270 14.29  2.62 35.21  1.730\n  94 ctatcatctctgcgcgatcga            360 21  0 52.38 60.771 22.07  1.72 38.48  1.771\n  95 atcgatgctagctaggcgatg            406 21  0 52.38 60.779 21.16  4.37  0.00  1.779\n  96 tgactgatacgcgatgctag             474 20  0 50.00 58.207  1.70  0.00  0.00  1.793\n  97 ctgactgatacgcgatgcta             473 20  0 50.00 58.207  2.33  0.00  0.00  1.793\n  98 tagctgactgatacgcgatg             470 20  0 50.00 58.207  0.00  0.00  0.00  1.793\n  99 ctgactgatcgatcgatgct             114 20  0 50.00 58.197 26.44 12.40 35.21  1.803\n 100 agctgactgatcgatcgatg             112 20  0 50.00 58.197 23.05 13.21 35.21  1.803\n 101 tcggattagctagctgatgc               7 20  0 50.00 58.176 17.46 17.46 40.05  1.824\n 102 gcatcggattagctagctga               4 20  0 50.00 58.176 28.29 20.88  0.00  1.824\n 103 agcatcggattagctagctg               3 20  0 50.00 58.171 28.29 10.80  0.00  1.829\n 104 gatgctagctaggcgatgc              409 19  0 57.89 59.141  4.18  0.00  0.00  1.859\n 105 ctgatacgcgatgctagctag            477 21  0 52.38 59.113 17.46 17.46  0.00  1.887\n 106 gctagctgactgatacgcg              468 19  0 57.89 59.086  8.21  3.89  0.00  1.914\n 107 ctctgcgcgatcgatgctag             367 20  0 60.00 61.946 21.94 18.16 38.48  1.946\n 108 tctgcgcgatcgatgctag              368 19  0 57.89 60.966 21.94 18.16 38.48  1.966\n 109 ctctgcgcgatcgatgcta              367 19  0 57.89 60.966 26.61 17.10 38.48  1.966\n 110 cgatgctagctaggcgatgc             408 20  0 60.00 61.968 11.09  0.00  0.00  1.968\n 111 gactgatacgcgatgctagct            475 21  0 52.38 60.975 17.69  1.35  0.00  1.975\n 112 gctagctgactgatacgcgat            468 21  0 52.38 60.975  8.21  0.00  0.00  1.975\n 113 tgatacgcgatgctagctag             478 20  0 50.00 57.994 17.46 17.46  0.00  2.006\n 114 ctgatacgcgatgctagcta             477 20  0 50.00 57.994 17.69  3.08  0.00  2.006\n 115 cgcgatcgatgctagctagc             372 20  0 60.00 62.011 34.89 34.89 43.67  2.011\n 116 gcgcgatcgatgctagctag             371 20  0 60.00 62.011 21.66 17.46 38.48  2.011\n 117 ctgatcgatcgatgctagct             399 20  0 50.00 57.983 19.70  2.01 35.21  2.017\n 118 agctgatcgatcgatgctag             397 20  0 50.00 57.983 27.33 18.05 34.69  2.017\n 119 ctagctgatcgatcgatgct             395 20  0 50.00 57.983 33.87 33.38 38.16  2.017\n 120 agctagctgatcgatcgatg             393 20  0 50.00 57.983 21.99 11.03 35.21  2.017\n 121 ctgatcgatcgatgctagct             118 20  0 50.00 57.983 19.70  2.01 35.21  2.017\n 122 agctagctgatcgatcgatg              73 20  0 50.00 57.983 21.99 11.03 35.21  2.017\n 123 catcggattagctagctgatgc             5 22  0 50.00 59.982 24.41 24.41 40.05  2.018\n 124 gcatcggattagctagctgatg             4 22  0 50.00 59.982 27.81 27.81 33.28  2.018\n 125 tcgatgctagctaggcgat              407 19  0 52.63 58.964 14.03  3.01  0.00  2.036\n 126 atcgatgctagctaggcga              406 19  0 52.63 58.964 16.30 16.30  0.00  2.036\n 127 actatcatctctgcgcgatcg            359 21  0 52.38 61.037 12.19 12.19 39.07  2.037\n 128 gcgcgatcgatgctagcta              371 19  0 57.89 61.037 21.66  3.08 38.48  2.037\n 129 gctgatcgatcgatgctagct            398 21  0 52.38 61.044 27.88 12.70 35.21  2.044\n 130 agctgatcgatcgatgctagc            397 21  0 52.38 61.044 27.33 27.90 34.69  2.044\n 131 gctagctgatcgatcgatgct            394 21  0 52.38 61.044 33.87 33.38 38.16  2.044\n 132 agctagctgatcgatcgatgc            393 21  0 52.38 61.044 24.08 21.09 35.21  2.044\n 133 cgcgatcgatgctagctag              372 19  0 57.89 58.947 22.07 17.46 38.48  2.053\n 134 tcgtagcggcgatctagc               576 18  0 61.11 59.936  4.70  0.00 36.40  2.064\n 135 cgtagcggcgatctagct               577 18  0 61.11 59.935 11.03 11.03 37.58  2.065\n 136 gcggcgatctagctagct               581 18  0 61.11 59.933 23.74 23.74 38.05  2.067\n 137 agcggcgatctagctagc               580 18  0 61.11 59.933 16.97  7.15 39.86  2.067\n 138 ctagctgactgatacgcgat             469 20  0 50.00 57.918  1.43  0.00  0.00  2.082\n 139 ctagctgatcgatcgtagcgg            564 21  0 57.14 61.096 20.31 16.15  0.00  2.096\n 140 agctactatcatctctgcgc             355 20  0 50.00 57.898  0.00  0.00  0.00  2.102\n 141 gctagctactgatcgatgct             304 20  0 50.00 57.898 11.51 11.51  0.00  2.102\n 142 agctagctactgatcgatgc             303 20  0 50.00 57.898 17.56  1.76  0.00  2.102\n 143 agcatcggattagctagctgat             3 22  0 45.45 60.108 17.84 15.13  0.00  2.108\n 144 tgctagctaggcgatgcta              411 19  0 52.63 58.881 17.69  8.91  0.00  2.119\n 145 aagcatcggattagctagctg              2 21  0 47.62 58.879 28.29 10.80  0.00  2.121\n 146 tctgcgcgatcgatgcta               368 18  0 55.56 59.857 26.61 16.13 38.48  2.143\n 147 cgatgctagctaggcgatg              408 19  0 57.89 58.856 11.09  0.00  0.00  2.144\n 148 agctagctgatcatcgatgcta           190 22  0 45.45 59.845 17.99 13.09  0.00  2.155\n 149 tagctagctgatcatcgatgct           189 22  0 45.45 59.845 16.29 15.30  0.00  2.155\n 150 atcgatcgatgtgcggct                82 18  0 55.56 60.166 29.65  4.36 41.65  2.166\n 151 gctagctgactgatcgatca             261 20  0 50.00 57.829 26.99 26.99 35.44  2.171\n 152 tagctagctgactgatcgatcg           107 22  0 50.00 60.174 28.29 13.89  0.00  2.174\n 153 agctgatcatcatcgatgct             515 20  0 45.00 57.788 11.25  0.72 40.32  2.212\n 154 agctagctgactgatcgatcat           260 22  0 45.45 59.778 26.67 18.02 36.62  2.222\n 155 tgactgatacgcgatgctagc            474 21  0 52.38 61.238  8.61  8.61  0.00  2.238\n 156 gctgactgatacgcgatgcta            472 21  0 52.38 61.238  2.33  0.00  0.00  2.238\n 157 tagctgactgatacgcgatgc            470 21  0 52.38 61.238  3.47  0.00  0.00  2.238\n 158 tagctagctgatcgatcgtagc           561 22  0 50.00 60.238 26.87 26.87  0.00  2.238\n 159 gctagctagctgatcgatcgta           559 22  0 50.00 60.238 34.38  3.07 46.11  2.238\n 160 tgatcgatcgatgctagctagg           400 22  0 50.00 60.239 26.44  6.29 35.21  2.239\n 161 gctgactgatcgatcgatgct            113 21  0 52.38 61.244 26.44 12.40 35.21  2.244\n 162 agctgactgatcgatcgatgc            112 21  0 52.38 61.244 24.08 19.43 35.21  2.244\n 163 gatcgatcgatgtgcggct               81 19  0 57.89 61.263 19.16  0.00 41.65  2.263\n 164 gctgatcatcgatgctactagc           195 22  0 50.00 59.727 18.08 16.44 45.61  2.273\n 165 gctagctgatcatcgatgctac           191 22  0 50.00 59.727  9.57  5.47  0.00  2.273\n 166 gatcgatcgatgtgcggc                81 18  0 61.11 59.714 18.10  0.95 41.65  2.286\n 167 ctagctagctgactgatacgc            465 21  0 52.38 58.703 14.90  0.00  0.00  2.297\n 168 tagctgatcgatcgatgtgcg             76 21  0 52.38 61.299 31.92 20.26 42.69  2.299\n 169 agctgatcgatcgatgtgc               77 19  0 52.63 58.698 31.83 30.04 35.21  2.302\n 170 gctgatcatcatcgatgctagc           516 22  0 50.00 60.302 10.80 10.34 40.32  2.302\n 171 gctagctgatcatcatcgatgc           512 22  0 50.00 60.302 21.42  7.40 40.32  2.302\n 172 aagcatcggattagctagctga             2 22  0 45.45 60.306 28.29 20.88  0.00  2.306\n 173 gatcgatcgtagcggcga               570 18  0 61.11 60.318 13.01  8.51 45.59  2.318\n 174 atcggattagctagctgatgc              6 21  0 47.62 58.673 17.46 17.46 40.05  2.327\n 175 gcatcggattagctagctgat              4 21  0 47.62 58.673 17.84 15.13  0.00  2.327\n 176 gcggcgatctagctagctg              581 19  0 63.16 61.329 17.07  8.17 38.05  2.329\n 177 tgctagtgatgcatgctagt              24 20  0 45.00 57.636 24.96 11.17 35.89  2.364\n 178 ctactatcatctctgcgcga             357 20  0 50.00 57.636  2.71  2.71  0.00  2.364\n 179 actagctagctgactgatacgc           464 22  0 50.00 60.368 21.52  0.00  0.00  2.368\n 180 gctagctagctgatcatcga             187 20  0 50.00 57.613 34.38  0.24 46.11  2.387\n 181 tctctgcgcgatcgatgcta             366 20  0 55.00 62.413 26.61 17.10 38.48  2.413\n 182 tgatcgatcgatgctagctagt           119 22  0 45.45 59.586 26.44  5.69 35.21  2.414\n 183 actgatcgatcgatgctagcta           117 22  0 45.45 59.586 23.29  7.65 35.21  2.414\n 184 tagctagctgatcgatcgatgt            72 22  0 45.45 59.586 14.29  2.62 35.21  2.414\n 185 agctaggcgatgctagcta              415 19  0 52.63 58.572 17.69  3.08 41.54  2.428\n 186 tagctaggcgatgctagct              414 19  0 52.63 58.572 17.35 17.35 43.53  2.428\n 187 gatcgatcgatgctagctagg            401 21  0 52.38 58.567 23.89  6.29 35.21  2.433\n 188 gctagctagctgactgatcgat           105 22  0 50.00 60.434 34.38  0.00 46.11  2.434\n 189 gatcgatgctagctaggcg              405 19  0 57.89 58.563 15.59  9.02  0.00  2.437\n 190 cgatcgatgctagctaggc              404 19  0 57.89 58.563 14.87  8.45  0.00  2.437\n 191 tagctagctgactgatacgc             466 20  0 50.00 57.549 28.29  0.00  0.00  2.451\n 192 agctagctgactgatcgatc             260 20  0 50.00 57.536 19.32 19.32  0.00  2.464\n 193 agctagctgactgatcgatc             108 20  0 50.00 57.536 19.32 19.32  0.00  2.464\n 194 aaagcatcggattagctagctg             1 22  0 45.45 59.524 28.29 10.80  0.00  2.476\n 195 gctgactgatcgatcatcatgc           265 22  0 50.00 60.493 25.66 25.12 41.77  2.493\n 196 tagctactatcatctctgcgcg           354 22  0 50.00 60.495  0.00  0.00  0.00  2.495\n 197 ctgatcgatcgatgtgcggc              79 20  0 60.00 62.497 15.54  4.15 41.65  2.497\n 198 gctgatcgatcgatgtgcgg              78 20  0 60.00 62.497 29.87 22.23 41.65  2.497\n 199 tcgtagcggcgatctagct              576 19  0 57.89 61.503 11.03 11.03 36.40  2.503\n 200 agcggcgatctagctagct              580 19  0 57.89 61.519 23.74 23.74 42.96  2.519\n 201 ctagctagctgatcatcgatgc           188 22  0 50.00 59.470 21.42  9.22  0.00  2.530\n 202 gctagctagctgatcatcgatg           187 22  0 50.00 59.470 34.38 20.23 46.11  2.530\n 203 tcatctctgcgcgatcga               363 18  0 55.56 59.468 22.07  0.00 38.48  2.532\n 204 tcgatcgatgtgcggcta                83 18  0 55.56 59.465 18.63  0.00 41.65  2.535\n 205 tgatcgatcgatgtgcggc               80 19  0 57.89 61.549 21.27  8.44 41.65  2.549\n 206 ctagctaggcgatgctagctag           413 22  0 54.55 60.561 22.99 22.99 46.84  2.561\n 207 gctagctagctgatcgatcgat           390 22  0 50.00 60.561 34.38 30.53 46.11  2.561\n 208 gctagctagctgatcgatcgat            70 22  0 50.00 60.561 34.38 30.53 46.11  2.561\n 209 ctgcgcgatcgatgctag               369 18  0 61.11 59.415 19.79 13.97 38.48  2.585\n 210 aagcatcggattagctagct               2 20  0 45.00 57.413 23.74 23.74  0.00  2.587\n 211 gctagctgatcatcgatgcta            191 21  0 47.62 58.410 16.61 13.09  0.00  2.590\n 212 tagctagctgatcatcgatgc            189 21  0 47.62 58.410 21.42  9.22  0.00  2.590\n 213 actgatacgcgatgctagc              476 19  0 52.63 58.407  8.61  8.61  0.00  2.593\n 214 gctagctgactgatcgatcatc           261 22  0 50.00 59.406 23.93 21.92 36.62  2.594\n 215 atcgatcgatgctagctagg             402 20  0 50.00 57.396 29.65  6.29 33.56  2.604\n 216 atctctgcgcgatcgatgc              365 19  0 57.89 61.618 22.01 22.01 38.48  2.618\n 217 tgatcgatcgtagcggcg               569 18  0 61.11 60.621 20.58  0.86  0.00  2.621\n 218 atcatctctgcgcgatcgatg            362 21  0 52.38 61.633 18.01 18.01 38.48  2.633\n 219 agctagctgatcgatcgtag             562 20  0 50.00 57.344 17.99 16.86  0.00  2.656\n 220 ctagctagctgatcgatcgt             560 20  0 50.00 57.344 16.40  2.65  0.00  2.656\n 221 gctagctgactgatcgatcat            261 21  0 47.62 58.339 26.67 18.02 36.62  2.661\n 222 ctgatcgatcgtagcggcg              568 19  0 63.16 61.664 14.21  0.86  0.00  2.664\n 223 ctgactgatacgcgatgct              473 19  0 52.63 58.330  2.33  0.00  0.00  2.670\n 224 agctgactgatacgcgatg              471 19  0 52.63 58.330  0.00  0.00  0.00  2.670\n 225 gctagctgatcgatcgtagcg            563 21  0 57.14 61.676 24.18 16.49  0.00  2.676\n 226 ctagctgactgatcgatcga             110 20  0 50.00 57.276 22.52 22.52  0.00  2.724\n 227 agctagctactgatcgatgcta           303 22  0 45.45 59.252 17.56 12.23  0.00  2.748\n 228 tagctagctactgatcgatgct           302 22  0 45.45 59.252 27.80 11.51  0.00  2.748\n 229 gactgatacgcgatgctagcta           475 22  0 50.00 60.751 17.69  3.08  0.00  2.751\n 230 actgatacgcgatgctagctag           476 22  0 50.00 60.752 17.46 17.46  0.00  2.752\n 231 gactgatcgatcgatgctagct           116 22  0 50.00 60.753 18.04  9.56 35.21  2.753\n 232 gctagctgactgatcgatcgat           109 22  0 50.00 60.753 30.53 30.53 37.90  2.753\n 233 tgcgcgatcgatgctagcta             370 20  0 55.00 62.756 26.61  9.85 38.48  2.756\n 234 gcggcgatctagctagctga             581 20  0 60.00 62.765 21.57 16.66 38.70  2.765\n 235 agcggcgatctagctagctg             580 20  0 60.00 62.771 17.07  8.17 44.87  2.771\n 236 ctactatcatctctgcgcgatc           357 22  0 50.00 59.220  4.99  0.00  0.00  2.780\n 237 tatcatctctgcgcgatcg              361 19  0 52.63 58.199 12.19 12.19 39.07  2.801\n 238 tactatcatctctgcgcgatcg           358 22  0 50.00 60.811 12.19 12.19 39.07  2.811\n 239 tagctagctgactgatcgatca           259 22  0 45.45 59.187 28.29 26.99 35.44  2.813\n 240 gctgatcgatcgatgctagcta           398 22  0 50.00 60.816 27.88 12.57 35.21  2.816\n 241 tagctgatcgatcgatgctagc           396 22  0 50.00 60.816 30.84 27.90 36.80  2.816\n 242 gctagctgatcgatcgatgcta           394 22  0 50.00 60.816 34.11 32.56 36.80  2.816\n 243 tagctagctgatcgatcgatgc           392 22  0 50.00 60.816 24.08 21.09 35.21  2.816\n 244 gctaggcgatgctagctag              416 19  0 57.89 58.179 17.46 17.46 35.42  2.821\n 245 ctagctaggcgatgctagc              413 19  0 57.89 58.179 18.68  9.44 36.95  2.821\n 246 gctagctaggcgatgctag              412 19  0 57.89 58.179 23.16 23.16 38.59  2.821\n 247 catctctgcgcgatcgatgc             364 20  0 60.00 62.823 22.01 22.01 38.48  2.823\n 248 aaagcatcggattagctagct              1 21  0 42.86 58.168 23.74 23.74  0.00  2.832\n 249 ctgactgatcgatcgatgctag           114 22  0 50.00 59.155 22.81 19.44 35.21  2.845\n 250 ctagctgactgatcgatcgatg           110 22  0 50.00 59.155 23.05 13.21 35.21  2.845\n 251 tactatcatctctgcgcgatc            358 21  0 47.62 58.155  4.99  0.00  0.00  2.845\n 252 gctagctactgatcgatgctac           304 22  0 50.00 59.151  8.57  4.26  0.00  2.849\n 253 ctactatcatctctgcgcgat            357 21  0 47.62 58.150  4.99  2.52  0.00  2.850\n 254 agctgatcatcgatgctact             194 20  0 45.00 57.134 17.14  8.95  0.00  2.866\n 255 gctagctagctgatcatcgat            187 21  0 47.62 58.132 34.38  0.00 46.11  2.868\n 256 ctgatacgcgatgctagct              477 19  0 52.63 58.107 17.69  1.35  0.00  2.893\n 257 ggcgatctagctagctgac              583 19  0 57.89 58.106 14.84  7.25 37.58  2.894\n 258 tgactgatcgatcgatgctag            115 21  0 47.62 58.084 22.81 19.44 35.21  2.916\n 259 ctgactgatcgatcgatgcta            114 21  0 47.62 58.084 26.44 14.64 35.21  2.916\n 260 tagctgactgatcgatcgatg            111 21  0 47.62 58.084 23.05 13.21 35.21  2.916\n 261 actgatcgatcatcatgctagc           269 22  0 45.45 59.071 26.67  8.61 41.77  2.929\n 262 agctgactgatcgatcatca             264 20  0 45.00 57.064 26.49 26.49 39.98  2.936\n 263 ctagctagctgatcgatcga             391 20  0 50.00 57.060 22.52 22.52  0.00  2.940\n 264 ctagctagctgatcgatcga              71 20  0 50.00 57.060 22.52 22.52  0.00  2.940\n 265 gatcgatcgatgtgcggctag             81 21  0 57.14 61.947 19.16  0.00 41.65  2.947\n 266 tgctagctaggcgatgct               411 18  0 55.56 59.050 17.69  7.53  0.00  2.950\n 267 gctgatcgatcgtagcggc              567 19  0 63.16 61.960 20.49 19.38  0.00  2.960\n 268 cgatcgatgtgcggctag                84 18  0 61.11 59.032 10.82  0.00 41.65  2.968\n 269 tgatcgatcgatgtgcggct              80 20  0 55.00 62.987 22.21  0.00 41.65  2.987\n 270 ctgactgatcgatcatcatgct           266 22  0 45.45 59.004 20.99  6.82 41.77  2.996\n 271 agctgactgatcgatcatcatg           264 22  0 45.45 59.004 22.70 19.51 41.77  2.996\n 272 agctagctgactgatacgcga            467 21  0 52.38 62.000 17.99  0.00  0.00  3.000\n 273 tgactgatcgatcgatgctagc           115 22  0 50.00 61.008 18.17 12.52 35.21  3.008\n 274 gctgactgatcgatcgatgcta           113 22  0 50.00 61.008 26.44 14.64 35.21  3.008\n 275 tagctgactgatcgatcgatgc           111 22  0 50.00 61.008 24.08 19.43 35.21  3.008\n 276 agctagctgatcgatcgatgtg            73 22  0 50.00 61.010 17.99  6.93 35.21  3.010\n 277 ctgatcgatcgatgctagctag           399 22  0 50.00 58.963 19.70 17.46 35.21  3.037\n 278 ctagctgatcgatcgatgctag           395 22  0 50.00 58.963 37.86 37.86 43.17  3.037\n 279 ctagctagctgatcgatcgatg           391 22  0 50.00 58.963 21.99 11.03 35.21  3.037\n 280 ctgatcgatcgatgctagctag           118 22  0 50.00 58.963 19.70 17.46 35.21  3.037\n 281 ctagctagctgatcgatcgatg            71 22  0 50.00 58.963 21.99 11.03 35.21  3.037\n 282 gactgatcgatcatcatgctagc          268 23  0 47.83 60.053 24.51  9.03 41.77  3.053\n 283 gctagtgatgcatgctagtagtg           25 23  0 47.83 59.929 24.96 10.54  0.00  3.071\n 284 gctactatcatctctgcgcgat           356 22  0 50.00 61.073  4.99  2.52  0.00  3.073\n 285 gtagcggcgatctagctag              578 19  0 57.89 57.903 15.64 15.64 37.58  3.097\n 286 tgactgatcgatcatcatgct            267 21  0 42.86 57.900 26.79 12.28 41.77  3.100\n 287 ctagctactatcatctctgcgc           353 22  0 50.00 58.892  0.00  0.00  0.00  3.108\n 288 gctagctactatcatctctgcg           352 22  0 50.00 58.892  8.21  0.00  0.00  3.108\n 289 ctagctagctactgatcgatgc           301 22  0 50.00 58.892 14.00  1.76  0.00  3.108\n 290 gctagctagctactgatcgatg           300 22  0 50.00 58.892 34.38  7.78 46.11  3.108\n 291 catcgatcgatgctagtatgct           325 22  0 45.45 58.885 37.80 10.02 44.93  3.115\n 292 tgatcgatcgatgctagctag            400 21  0 47.62 57.879 26.44 17.46 35.21  3.121\n 293 ctgatcgatcgatgctagcta            399 21  0 47.62 57.879 19.70  3.77 35.21  3.121\n 294 tagctgatcgatcgatgctag            396 21  0 47.62 57.879 34.03 27.12 36.80  3.121\n 295 ctagctgatcgatcgatgcta            395 21  0 47.62 57.879 34.11 32.56 36.80  3.121\n 296 tagctagctgatcgatcgatg            392 21  0 47.62 57.879 21.99 11.03 35.21  3.121\n 297 tgatcgatcgatgctagctag            119 21  0 47.62 57.879 26.44 17.46 35.21  3.121\n 298 ctgatcgatcgatgctagcta            118 21  0 47.62 57.879 19.70  3.77 35.21  3.121\n 299 tagctagctgatcgatcgatg             72 21  0 47.62 57.879 21.99 11.03 35.21  3.121\n 300 gatcgatcgatgctagctagt            120 21  0 47.62 57.878 23.89  3.56 35.21  3.122\n 301 ctatcatctctgcgcgatcgat           360 22  0 50.00 61.132 22.07 11.47 38.48  3.132\n 302 tgatcgatcgtagcggcga              569 19  0 57.89 62.144 20.58  8.51 45.59  3.144\n 303 tcgtagcggcgatctagctag            576 21  0 57.14 62.173 15.64 15.64 36.40  3.173\n 304 tactagctagctgactgatacgc          463 23  0 47.83 60.176 13.17  0.00  0.00  3.176\n 305 ctgatcatcatcgatgctagct           517 22  0 45.45 58.807 17.69  1.76 40.32  3.193\n 306 agctgatcatcatcgatgctag           515 22  0 45.45 58.807  5.93  2.76 40.32  3.193\n 307 ctagctgatcatcatcgatgct           513 22  0 45.45 58.807 14.14  8.34 40.32  3.193\n 308 agctagctgatcatcatcgatg           511 22  0 45.45 58.807 20.23 20.23 41.48  3.193\n 309 ctgatcgatcatcatgctagct           270 22  0 45.45 58.807 26.67  0.00 41.77  3.193\n 310 ctagctgactgatcgatcgat            110 21  0 47.62 57.806 30.53 30.53 37.90  3.194\n 311 ttagctagctgactgatcgatca          258 23  0 43.48 59.798 28.29 26.99 35.44  3.202\n 312 tagctactatcatctctgcgc            354 21  0 47.62 57.798  0.00  0.00  0.00  3.202\n 313 gctagctactgatcgatgcta            304 21  0 47.62 57.798 12.99 12.23  0.00  3.202\n 314 tagctagctactgatcgatgc            302 21  0 47.62 57.798 27.80  1.76  0.00  3.202\n 315 tctctgcgcgatcgatgc               366 18  0 61.11 61.229 22.01 22.01 38.48  3.229\n 316 ctctgcgcgatcgatgct               367 18  0 61.11 61.232 26.61  0.00 38.48  3.232\n 317 agctagctactatcatctctgcg          351 23  0 47.83 60.238 17.56  0.00  0.00  3.238\n 318 ctagctagctactgatcgatgct          301 23  0 47.83 60.238 14.00 11.51  0.00  3.238\n 319 ctgatcgatcgtagcggc               568 18  0 61.11 58.727 14.21  0.00  0.00  3.273\n 320 gctgatcgatcgtagcgg               567 18  0 61.11 58.727 20.49 15.03  0.00  3.273\n 321 agctaggcgatgctagct               415 18  0 55.56 58.725 17.69 13.00 39.84  3.275\n 322 tgctagtgatgcatgctagtagt           24 23  0 43.48 60.302 24.96 12.98 35.89  3.302\n 323 gcgcgatcgatgctagct               371 18  0 61.11 61.306 21.66  1.35 38.48  3.306\n 324 tgatcatcatcgatgctagct            518 21  0 42.86 57.691 17.69  1.76 40.32  3.309\n 325 agctgatcatcatcgatgcta            515 21  0 42.86 57.691  0.24  0.00 40.32  3.309\n 326 tagctgatcatcatcgatgct            514 21  0 42.86 57.691 14.14  8.34 40.32  3.309\n 327 tgatcgatcatcatgctagct            271 21  0 42.86 57.691 27.48  0.00 37.38  3.309\n 328 ctagctagctgactgatacgcg           465 22  0 54.55 61.313 14.90  3.89  0.00  3.313\n 329 tgctagtgatgcatgctagtag            24 22  0 45.45 58.673 24.96 19.76 35.89  3.327\n 330 gctagtgatgcatgctagtagt            25 22  0 45.45 58.672 24.96 12.98  0.00  3.328\n 331 tagctagctgatcatcgatgcta          189 23  0 43.48 59.671 17.82 15.89  0.00  3.329\n 332 agctagctgactgatacgc              467 19  0 52.63 57.642 17.99  0.00  0.00  3.358\n 333 tatcatctctgcgcgatcgatg           361 22  0 50.00 61.383 18.01 18.01 38.48  3.383\n 334 agctgactgatcgatcatcat            264 21  0 42.86 57.616 26.31 18.90 41.77  3.384\n 335 actagctagctgatcatcatcga          508 23  0 43.48 59.607 22.43  0.00  0.00  3.393\n 336 tagctagctgactgatcgatcat          259 23  0 43.48 59.607 28.29 18.02 36.62  3.393\n 337 gatgctagctaggcgatgctag           409 22  0 54.55 61.393 23.16 23.16 38.59  3.393\n 338 cggcgatctagctagctgact            582 21  0 57.14 62.394 17.44  7.44 38.70  3.394\n 339 ctagctagctgatcgatcgat            391 21  0 47.62 57.600 30.53 30.53 37.90  3.400\n 340 ctagctagctgatcgatcgat             71 21  0 47.62 57.600 30.53 30.53 37.90  3.400\n 341 actgatcgatcatcatgctagct          269 23  0 43.48 60.428 26.67  4.70 41.77  3.428\n 342 ctagctagctgactgatcgatc           106 22  0 50.00 58.567 19.32 19.32  0.00  3.433\n 343 ctgactgatcgatcatcatgc            266 21  0 47.62 57.562 20.99 12.19 41.77  3.438\n 344 gctgactgatcgatcatcatg            265 21  0 47.62 57.562 22.70 19.51 41.77  3.438\n 345 gatcgatcgatgctagctaggc           401 22  0 54.55 61.448 23.89  8.45 35.21  3.448\n 346 gtgatgcatgctagtagtgatgt           29 23  0 43.48 59.551 11.60  0.00  0.00  3.449\n 347 tgctagtgatgcatgctagta             24 21  0 42.86 57.546 24.96 21.25 35.89  3.454\n 348 tagcggcgatctagctagctg            579 21  0 57.14 62.457 18.98  9.30 45.57  3.457\n 349 gtagcggcgatctagctagct            578 21  0 57.14 62.458 23.74 23.74 46.60  3.458\n 350 tagctgatcgatcgtagcg              565 19  0 52.63 57.539 25.02 11.96  0.00  3.461\n 351 gctagctagctactgatcgat            300 21  0 47.62 57.517 34.38  0.00 46.11  3.483\n 352 agctagctactgatcgatgctac          303 23  0 47.83 60.487 17.56  7.81  0.00  3.487\n 353 atcgatcgatgctagtatgct            326 21  0 42.86 57.502 29.65  2.17 33.56  3.498\n 354 agctactgatcgatgctacatc           307 22  0 45.45 58.484  7.41  0.00 37.97  3.516\n 355 agtgatgcatgctagtagtga             28 21  0 42.86 57.471  0.00  0.00  0.00  3.529\n 356 gactgatcgatcgatgctagcta          116 23  0 47.83 60.546 18.04  4.19 35.21  3.546\n 357 ctgatcgatcgatgctagctagt          118 23  0 47.83 60.547 22.18  3.56 35.21  3.547\n 358 actgatcgatcgatgctagctag          117 23  0 47.83 60.547 23.29 17.46 35.21  3.547\n 359 ctagctagctgatcgatcgatgt           71 23  0 47.83 60.547 14.29  2.62 35.21  3.547\n 360 catcgatcgatgctagtatgc            325 21  0 47.62 57.452 37.80  0.00 44.93  3.548\n 361 tagctagctgactgatcgatc            259 21  0 47.62 57.451 28.29 19.32  0.00  3.549\n 362 tagctagctgactgatcgatc            107 21  0 47.62 57.451 28.29 19.32  0.00  3.549\n 363 ctagctagctgactgatcgat            106 21  0 47.62 57.445 14.90  0.00  0.00  3.555\n 364 tcgatgctagctaggcga               407 18  0 55.56 58.427 15.59 13.52  0.00  3.573\n 365 tgatcgatcgatgctagctagta          119 23  0 43.48 59.424 26.44 18.77 35.21  3.576\n 366 ctgcgcgatcgatgctagc              369 19  0 63.16 62.586 20.26 12.12 38.48  3.586\n 367 agctagctgatcatcatcgat            511 21  0 42.86 57.405 17.99  0.00  0.00  3.595\n 368 tgcgcgatcgatgctagc               370 18  0 61.11 61.605 26.61 17.77 38.48  3.605\n 369 ctagctagctgatcgatcgtag           560 22  0 50.00 58.387 16.86 16.86  0.00  3.613\n 370 actagctagctgactgatacg            464 21  0 47.62 57.384 21.52  2.77  0.00  3.616\n 371 ctagctgactgatacgcga              469 19  0 52.63 57.370 16.29  0.00  0.00  3.630\n 372 gctactagctagctgactgat            461 21  0 47.62 57.360 15.96  3.00 44.92  3.640\n 373 ctgatcatcatcgatgctagc            517 21  0 47.62 57.358  8.61  8.61 40.32  3.642\n 374 gctgatcatcatcgatgctag            516 21  0 47.62 57.358  5.93  2.76 40.32  3.642\n 375 ctagctgatcatcatcgatgc            513 21  0 47.62 57.358 21.42  7.40 40.32  3.642\n 376 gctagctgatcatcatcgatg            512 21  0 47.62 57.358 20.23 20.23 41.48  3.642\n 377 ctgatcgatcatcatgctagc            270 21  0 47.62 57.358 26.67  8.61 41.77  3.642\n 378 agctactgatcgatgctacat            307 21  0 42.86 57.344  7.41  0.00  0.00  3.656\n 379 tgatcgatcgatgtgcggcta             80 21  0 52.38 62.663 22.21  0.24 41.65  3.663\n 380 atctctgcgcgatcgatg               365 18  0 55.56 58.327 12.03  4.19 38.48  3.673\n 381 catctctgcgcgatcgat               364 18  0 55.56 58.327 22.07  1.26 38.48  3.673\n 382 atcatctctgcgcgatcg               362 18  0 55.56 58.327 12.19 12.19 39.07  3.673\n 383 aagcatcggattagctagctgat            2 23  0 43.48 60.682 17.84 15.13  0.00  3.682\n 384 agtgatgcatgctagtagtgatg           28 23  0 43.48 59.299  7.49  7.49  0.00  3.701\n 385 gatcgatgctagctaggcgatg           405 22  0 54.55 61.702 24.26  6.24  0.00  3.702\n 386 atctctgcgcgatcgatgcta            365 21  0 52.38 62.723 26.61 17.10 38.48  3.723\n 387 tagctagctgactgatacgcga           466 22  0 50.00 61.730 28.29  0.00  0.00  3.730\n 388 tagctagctgatcgatcgtag            561 21  0 47.62 57.269 16.86 16.86  0.00  3.731\n 389 ctagctagctgatcgatcgta            560 21  0 47.62 57.269 11.68  3.07  0.00  3.731\n 390 tcgatcgatgctagctagtag            122 21  0 47.62 57.269 18.63  2.63  0.00  3.731\n 391 gctagctactgatcgatgctaca          304 23  0 47.83 60.734 11.21  0.06  0.00  3.734\n 392 agctagctgactgatcgatcatc          260 23  0 47.83 60.736 23.93 21.92 36.62  3.736\n 393 agctagctgactgatcgatcga           108 22  0 50.00 61.737 22.52 22.52  0.00  3.737\n 394 tctctgcgcgatcgatgct              366 19  0 57.89 62.740 26.61  0.00 38.48  3.740\n 395 tgatgcatgctagtagtgatgt            30 22  0 40.91 58.256 11.60  0.00  0.00  3.744\n 396 tgatcgatcgatgtgcgg                80 18  0 55.56 58.244 21.27  0.00 41.65  3.756\n 397 cgatcgatgctagctaggcga            404 21  0 57.14 62.770 16.30 16.30  0.00  3.770\n 398 tcgatcgatgctagctaggcg            403 21  0 57.14 62.770 18.63 11.67  0.00  3.770\n 399 atcgatcgatgcatgcatg              443 19  0 47.37 57.226 29.65 23.31 37.30  3.774\n 400 catcgatcgatgcatgcat              442 19  0 47.37 57.226 37.80 33.45 44.93  3.774\n 401 actagctagctgatcatcatcg           508 22  0 45.45 58.219 22.43  3.40  0.00  3.781\n 402 ctgatcatcgatgctactagct           196 22  0 45.45 58.219 10.86  0.00 45.92  3.781\n 403 agctgatcatcgatgctactag           194 22  0 45.45 58.219 13.67  9.68  0.00  3.781\n 404 ctagctgatcatcgatgctact           192 22  0 45.45 58.219 14.85  7.80  0.00  3.781\n 405 tttagctagctgactgatcga            257 21  0 42.86 57.216  0.38  0.00  0.00  3.784\n 406 tagctagctgatcgatcgatgtg           72 23  0 47.83 60.793 10.14  4.94 35.21  3.793\n 407 gctagctagctgatcatcatct           146 22  0 45.45 58.203 34.38  0.00 46.11  3.797\n 408 ctagctagctgatcatcgatgct          188 23  0 47.83 60.799 16.29 15.30  0.00  3.799\n 409 agctagctactatcatcgatcga          429 23  0 43.48 59.170 22.52 22.52  0.00  3.830\n 410 ttagctagctgactgatcgatc           258 22  0 45.45 58.159 28.29 19.32  0.00  3.841\n 411 ctagctgactgatcgatcatca           262 22  0 45.45 58.155 26.49 26.49 39.98  3.845\n 412 aaagcatcggattagctagctga            1 23  0 43.48 60.870 28.29 20.88  0.00  3.870\n 413 agctgactgatacgcgatgct            471 21  0 52.38 62.876  7.57  2.13  0.00  3.876\n 414 tagctagctactgatcgatgcta          302 23  0 43.48 59.102 27.80 12.23  0.00  3.898\n 415 tcatcatcgatgctagctagt            521 21  0 42.86 57.067 22.18  3.56 40.32  3.933\n 416 tcgatcatcatgctagctact            274 21  0 42.86 57.067  0.00  0.00  0.00  3.933\n 417 tgatcatcgatgctactagct            197 21  0 42.86 57.067 17.14  0.00 45.92  3.933\n 418 agctgatcatcgatgctacta            194 21  0 42.86 57.067 17.14  4.89  0.00  3.933\n 419 tagctgatcatcgatgctact            193 21  0 42.86 57.067 14.85  7.80  0.00  3.933\n 420 tcgatcgatgctagtatgctag           327 22  0 45.45 58.044 18.63 13.77 46.09  3.956\n 421 gcgatctagctagctgact              584 19  0 52.63 57.034 17.44  7.44  0.00  3.966\n 422 gctactgatcgatgctacatc            308 21  0 47.62 57.028  2.44  0.00 37.97  3.972\n 423 cggcgatctagctagctg               582 18  0 61.11 58.018 17.07  8.17 37.58  3.982\n 424 gctagctgactgatcgatcatca          261 23  0 47.83 60.983 26.49 26.49 39.98  3.983\n 425 actatcatctctgcgcgat              359 19  0 47.37 57.015  4.99  2.52  0.00  3.985\n 426 catcggattagctagctgatg              5 21  0 47.62 57.003 23.69 23.29  0.00  3.997\n 427 tagctgactgatcgatcatca            263 21  0 42.86 57.000 26.49 26.49 39.98  4.000\n 428 actagctagctgatcatcatcgat         508 24  0 41.67 59.995 22.43  0.00  0.00  4.005\n 429 agtgatgcatgctagtagtgat            28 22  0 40.91 57.984  0.00  0.00  0.00  4.016\n 430 ctagctagctgatcatcatcga           509 22  0 45.45 57.958 11.68  0.00  0.00  4.042\n 431 gctgatcatcgatgctactagct          195 23  0 47.83 61.046 20.91  5.24 45.92  4.046\n 432 agctgatcatcgatgctactagc          194 23  0 47.83 61.046 20.78 20.78 45.61  4.046\n 433 gctagctgatcatcgatgctact          191 23  0 47.83 61.046 12.59  8.92  0.00  4.046\n 434 agctagctgatcatcgatgctac          190 23  0 47.83 61.046 17.99  7.99  0.00  4.046\n 435 tagctagctactatcatctctgcg         350 24  0 45.83 60.058 27.80  0.00  0.00  4.058\n 436 ctagctagctactgatcgatgcta         301 24  0 45.83 60.058 14.00 12.23  0.00  4.058\n 437 agctactatcatctctgcgcga           355 22  0 50.00 62.058  2.71  2.71  0.00  4.058\n 438 gctatttagctagctgactgatcg         253 24  0 45.83 60.060  7.27  0.00 46.11  4.060\n 439 tgatcgatcatcatgctagctac          271 23  0 43.48 58.931 27.48  0.00 37.38  4.069\n 440 gtgatgcatgctagtagtgatg            29 22  0 45.45 57.921  7.49  7.49  0.00  4.079\n 441 ctagctagctgactgatcgatcg          106 23  0 52.17 61.091 16.84 13.89  0.00  4.091\n 442 ctagctactgatcgatgctaca           305 22  0 45.45 57.898 13.79  1.61  0.00  4.102\n 443 cggcgatctagctagctgacta           582 22  0 54.55 62.109 17.44  5.40 38.70  4.109\n 444 atgctagctaggcgatgc               410 18  0 55.56 57.890 10.59  0.00  0.00  4.110\n 445 ctgatcgatcatcatgctagctac         270 24  0 45.83 59.882 26.67  0.00 41.77  4.118\n 446 gctactagctagctgatcatca           505 22  0 45.45 57.879 14.37  0.00 44.92  4.121\n 447 gctactagctagctgatcatca           208 22  0 45.45 57.879 14.37  0.00 44.92  4.121\n 448 ctgactgatacgcgatgctagc           473 22  0 54.55 62.128  8.61  8.61  0.00  4.128\n 449 gctgactgatacgcgatgctag           472 22  0 54.55 62.128  1.70  0.00  0.00  4.128\n 450 ctagctgactgatacgcgatgc           469 22  0 54.55 62.128  3.47  0.00  0.00  4.128\n 451 gctagctgactgatacgcgatg           468 22  0 54.55 62.128  8.21  0.00  0.00  4.128\n 452 tgactgatcgatcatcatgctag          267 23  0 43.48 58.866 26.79 18.40 41.77  4.134\n 453 ctgactgatcgatcatcatgcta          266 23  0 43.48 58.866 20.99  8.89 41.77  4.134\n 454 tagctgactgatcgatcatcatg          263 23  0 43.48 58.866 22.70 19.51 41.77  4.134\n 455 ctagctagctgatcgatcgtagc          560 23  0 52.17 61.151 26.87 26.87  0.00  4.151\n 456 gctagctagctgatcgatcgtag          559 23  0 52.17 61.151 34.38 16.86 46.11  4.151\n 457 ctgatcgatcgatgctagctagg          399 23  0 52.17 61.158 22.67  6.29 35.21  4.158\n 458 gatcgatcgatgctagctagtag          120 23  0 47.83 58.829 23.89  2.63 35.21  4.171\n 459 ttagctagctgactgatcgatcat         258 24  0 41.67 60.177 28.29 18.02 36.62  4.177\n 460 ctgactgatcgatcatcatgctag         266 24  0 45.83 59.822 20.99 12.80 41.77  4.178\n 461 ctagctgactgatcgatcatcatg         262 24  0 45.83 59.822 22.70 19.51 41.77  4.178\n 462 ctagctgatcgatcgatgtgcg            75 22  0 54.55 62.180 31.92 20.85 42.69  4.180\n 463 tttagctagctgactgatcgatc          257 23  0 43.48 58.807 19.32 19.32  0.00  4.193\n 464 tgactgatcgatcatcatgcta           267 22  0 40.91 57.803 26.79 13.11 41.77  4.197\n 465 gctagctactatcatcgatcga           430 22  0 45.45 57.783 22.52 22.52  0.00  4.217\n 466 gatcgatcgatgctagctagta           120 22  0 45.45 57.783 23.89 18.77 35.21  4.217\n 467 agctagctactatcatcgatcg           429 22  0 45.45 57.777 17.56  9.87  0.00  4.223\n 468 atcgatcgatgctagctagtag           121 22  0 45.45 57.777 29.65  2.63 33.56  4.223\n 469 tgatcatcatcgatgctagctagt         518 24  0 41.67 60.238 22.18  3.56 40.32  4.238\n 470 tgatcgatcatcatgctagctact         271 24  0 41.67 60.238 27.48  0.00 37.38  4.238\n 471 actgatcgatcatcatgctagcta         269 24  0 41.67 60.238 26.67  2.76 41.77  4.238\n 472 catcgatcgatgctagtatgcta          325 23  0 43.48 58.753 37.80  6.23 44.93  4.247\n 473 tttagctagctgactgatcgat           257 22  0 40.91 57.736  0.38  0.00  0.00  4.264\n 474 atttagctagctgactgatcga           256 22  0 40.91 57.736  4.16  0.00  0.00  4.264\n 475 cgcgatcgatgctagcta               372 18  0 55.56 57.717 22.07  3.08 38.48  4.283\n 476 catcgatcgatgctagtatgctag         325 24  0 45.83 59.708 37.80 16.01 44.93  4.292\n 477 tagctagctactgatcgatgctac         302 24  0 45.83 60.297 27.80  7.81  0.00  4.297\n 478 agcatcggattagctagctgatg            3 23  0 47.83 61.299 27.81 27.81 33.28  4.299\n 479 agctagctgactgatacgcgat           467 22  0 50.00 62.317 17.99  0.00  0.00  4.317\n 480 tgatcatcatcgatgctagctag          518 23  0 43.48 58.678 17.46 17.46 40.32  4.322\n 481 ctgatcatcatcgatgctagcta          517 23  0 43.48 58.678 17.69  2.41 40.32  4.322\n 482 tagctgatcatcatcgatgctag          514 23  0 43.48 58.678  9.90  2.76 40.32  4.322\n 483 ctagctgatcatcatcgatgcta          513 23  0 43.48 58.678 14.58  9.63 40.32  4.322\n 484 tagctagctgatcatcatcgatg          510 23  0 43.48 58.678 20.23 20.23 41.48  4.322\n 485 ctgatcgatcatcatgctagcta          270 23  0 43.48 58.678 26.67  2.76 41.77  4.322\n 486 gatcatcatcgatgctagctagt          519 23  0 43.48 58.677 22.18  3.56 40.32  4.323\n 487 gatcgatcatcatgctagctact          272 23  0 43.48 58.677 21.11  0.00  0.00  4.323\n 488 gctagctagctgactgatcgatc          105 23  0 52.17 61.341 34.38 19.32 46.11  4.341\n 489 tgatcgatcgatgctagctagtag         119 24  0 45.83 60.356 26.44  2.63 35.21  4.356\n 490 ctgatcgatcgatgctagctagta         118 24  0 45.83 60.356 22.18 18.77 35.21  4.356\n 491 ctgatcatcatcgatgctagctag         517 24  0 45.83 59.644 17.46 17.46 40.32  4.356\n 492 ctagctgatcatcatcgatgctag         513 24  0 45.83 59.644 19.54 18.30 42.07  4.356\n 493 ctagctagctgatcatcatcgatg         509 24  0 45.83 59.644 20.23 20.23 41.48  4.356\n 494 tttagctagctgactgatcgatca         257 24  0 41.67 60.358 26.99 26.99 35.44  4.358\n 495 actatcatctctgcgcgatcga           359 22  0 50.00 62.365 22.07  1.72 38.48  4.365\n 496 agctgatcgatcgtagcg               566 18  0 55.56 57.634 25.02 11.96  0.00  4.366\n 497 gctactagctagctgactgatac          461 23  0 47.83 58.626 15.96  1.42 44.92  4.374\n 498 agctgatcgatcgatgctagct           397 22  0 50.00 62.388 30.32 30.32 38.42  4.388\n 499 agctagctgatcgatcgatgct           393 22  0 50.00 62.388 33.87 33.38 38.16  4.388\n 500 ctagctgactgatcgatcatcat          262 23  0 43.48 58.612 26.31 20.43 41.77  4.388\n 501 agctagctactatcatctctgc           351 22  0 45.45 57.608 17.56  0.00  0.00  4.392\n 502 ctagctactatcatctctgcgcg          353 23  0 52.17 61.393  0.00  0.00  0.00  4.393\n 503 tgatcatcatcgatgctagcta           518 22  0 40.91 57.602 17.69  3.08 40.32  4.398\n 504 tagctgatcatcatcgatgcta           514 22  0 40.91 57.602 15.95  9.16 40.32  4.398\n 505 tgatcgatcatcatgctagcta           271 22  0 40.91 57.602 27.48  3.08 37.38  4.398\n 506 atcatcatcgatgctagctagt           520 22  0 40.91 57.595 22.18  3.56 40.32  4.405\n 507 atcgatcatcatgctagctact           273 22  0 40.91 57.595  0.00  0.00  0.00  4.405\n 508 agctagctactatcatcgatcgat         429 24  0 41.67 59.573 25.37 25.37 35.13  4.427\n 509 gctagctgatcgatcgatgtgc            74 22  0 54.55 62.443 31.83 30.04 35.21  4.443\n 510 tagctgactgatcgatcatcat           263 22  0 40.91 57.531 26.31 20.43 41.77  4.469\n 511 tagctagctgactgatcgatcga          107 23  0 47.83 61.487 28.29 22.52  0.00  4.487\n 512 atcgatcgatgctagtatgctag          326 23  0 43.48 58.501 29.65 13.77 46.09  4.499\n 513 ctagtgatgcatgctagtagtga           26 23  0 43.48 58.483 20.00  1.46  0.00  4.517\n 514 tagctagctgactgatcgatcatc         259 24  0 45.83 60.536 28.29 21.92 36.62  4.536\n 515 tactagctagctgatcatcatcga         507 24  0 41.67 59.449  0.00  0.00  0.00  4.551\n 516 gctagctagctactatcatcga           426 22  0 45.45 57.437 34.38  0.00 46.11  4.563\n 517 tgactgatacgcgatgctagct           474 22  0 50.00 62.569 17.69  1.35  0.00  4.569\n 518 agctgactgatacgcgatgcta           471 22  0 50.00 62.569  7.57  0.00  0.00  4.569\n 519 tagctgactgatacgcgatgct           470 22  0 50.00 62.569 10.87  8.44  0.00  4.569\n 520 atcgatcgatgctagtatgcta           326 22  0 40.91 57.423 29.65  0.00 33.56  4.577\n 521 ctagctagctgatcatcatcgat          509 23  0 43.48 58.422 11.68  0.00  0.00  4.578\n 522 agctgactgatcgatcgatgct           112 22  0 50.00 62.580 26.44 23.13 35.21  4.580\n 523 ctagctagctgatcatcgatgcta         188 24  0 45.83 60.596 16.78 15.81  0.00  4.596\n 524 gtgatgcatgctagtagtgatgta          29 24  0 41.67 59.398 11.60  8.84  0.00  4.602\n 525 gctgatcatcatcgatgctagct          516 23  0 47.83 61.603 20.15  8.14 40.32  4.603\n 526 agctgatcatcatcgatgctagc          515 23  0 47.83 61.603 20.04 19.26 40.32  4.603\n 527 gctagctgatcatcatcgatgct          512 23  0 47.83 61.603 14.14  8.34 40.32  4.603\n 528 agctagctgatcatcatcgatgc          511 23  0 47.83 61.603 21.42  7.40 40.32  4.603\n 529 tagtgatgcatgctagtagtga            27 22  0 40.91 57.391  0.01  0.00  0.00  4.609\n 530 ctactagctagctgactgatacg          462 23  0 47.83 58.387  3.12  0.00  0.00  4.613\n 531 tagctactgatcgatgctacatc          306 23  0 43.48 58.368 13.79  0.00 37.97  4.632\n 532 gactgatacgcgatgctagctag          475 23  0 52.17 61.633 17.46 17.46  0.00  4.633\n 533 ctagctactgatcgatgctacat          305 23  0 43.48 58.364 13.79  0.09  0.00  4.636\n 534 gctagctactatcatctctgcgc          352 23  0 52.17 61.644  8.21  0.00  0.00  4.644\n 535 gctagctagctactgatcgatgc          300 23  0 52.17 61.644 34.38 12.71 46.11  4.644\n 536 gctactagctagctgatcatcat          505 23  0 43.48 58.350 14.37  0.00 44.92  4.650\n 537 gctactagctagctgatcatcat          208 23  0 43.48 58.350 14.37  0.00 44.92  4.650\n 538 ctagctactgatcgatgctacatc         305 24  0 45.83 59.349 13.79  0.00 37.97  4.651\n 539 gctactagctagctgatcatcatc         505 24  0 45.83 59.343 14.37  0.00 44.92  4.657\n 540 gctactagctagctgatcatcatc         208 24  0 45.83 59.343 14.37  0.00 44.92  4.657\n 541 gctgatcatcatctagctagtagc         154 24  0 45.83 59.343 15.25 15.25 45.79  4.657\n 542 tagctagctgatcatcatcgat           510 22  0 40.91 57.329 10.14  0.00  0.00  4.671\n 543 ctactatcatctctgcgcgatcg          357 23  0 52.17 61.686 12.19 12.19 39.07  4.686\n 544 tactagctagctgactgatacg           463 22  0 45.45 57.310 13.17  0.00  0.00  4.690\n 545 gctgatcgatcgatgctagctag          398 23  0 52.17 61.697 27.88 18.22 35.21  4.697\n 546 ctagctgatcgatcgatgctagc          395 23  0 52.17 61.697 38.64 35.38 43.05  4.697\n 547 gctagctgatcgatcgatgctag          394 23  0 52.17 61.697 41.07 41.07 46.89  4.697\n 548 ctagctagctgatcgatcgatgc          391 23  0 52.17 61.697 24.08 21.09 35.21  4.697\n 549 gctagctagctgatcgatcgatg          390 23  0 52.17 61.697 34.38 11.03 46.11  4.697\n 550 gctagctagctgatcgatcgatg           70 23  0 52.17 61.697 34.38 11.03 46.11  4.697\n 551 gctactagctagctgactgata           461 22  0 45.45 57.286 15.96  3.69 44.92  4.714\n 552 gatcgatcatcatgctagctac           272 22  0 45.45 57.284 21.11  0.00  0.00  4.716\n 553 cgatgctagctaggcgat               408 18  0 55.56 57.277 10.81  3.01  0.00  4.723\n 554 atcgatgctagctaggcg               406 18  0 55.56 57.277 15.59  9.02  0.00  4.723\n 555 tagctactgatcgatgctacat           306 22  0 40.91 57.270 13.79  0.09  0.00  4.730\n 556 gctagctactatcatcgatcgat          430 23  0 43.48 58.251 25.37 25.37 35.13  4.749\n 557 tgcatgctagtagtgatgtatacg          33 24  0 41.67 59.224 20.79  0.00  0.00  4.776\n 558 gcatgctagtagtgatgtatacgt          34 24  0 41.67 59.223 11.60  0.00  0.00  4.777\n 559 atttagctagctgactgatcgatc         256 24  0 41.67 59.219 19.32 19.32  0.00  4.781\n 560 gactgatcgatcatcatgctag           268 22  0 45.45 57.215 24.51 15.87 41.77  4.785\n 561 atttagctagctgactgatcgat          256 23  0 39.13 58.215  4.16  0.00  0.00  4.785\n 562 gctgactgatcgatcatcatgct          265 23  0 47.83 61.788 27.72 15.10 41.77  4.788\n 563 agctgactgatcgatcatcatgc          264 23  0 47.83 61.788 27.74 27.74 41.77  4.788\n 564 tagctactatcatctctgcgcga          354 23  0 47.83 61.796  2.71  2.71  0.00  4.796\n 565 gctgatcatcgatgctactagcta         195 24  0 45.83 60.834 20.91  7.37 45.92  4.834\n 566 tagctgatcatcgatgctactagc         193 24  0 45.83 60.834 20.78 20.78 45.61  4.834\n 567 gctagctgatcatcgatgctacta         191 24  0 45.83 60.834 11.65  8.83  0.00  4.834\n 568 tagctagctgatcatcgatgctac         189 24  0 45.83 60.834 17.82 12.06  0.00  4.834\n 569 tagtgatgcatgctagtagtgatg          27 24  0 41.67 59.155 11.56  7.49  0.00  4.845\n 570 agtgatgcatgctagtagtgatgt          28 24  0 41.67 60.846 11.60  0.00  0.00  4.846\n 571 tgatgcatgctagtagtgatgta           30 23  0 39.13 58.147 11.60  8.84  0.00  4.853\n 572 ctgactgatcgatcgatgctagc          114 23  0 52.17 61.878 18.17 12.52 35.21  4.878\n 573 gctgactgatcgatcgatgctag          113 23  0 52.17 61.878 22.81 19.44 35.21  4.878\n 574 ctagctgactgatcgatcgatgc          110 23  0 52.17 61.878 24.08 19.43 35.21  4.878\n 575 gctagctgactgatcgatcgatg          109 23  0 52.17 61.878 23.05 13.21 35.21  4.878\n 576 tcatcatcgatgctagctagtag          521 23  0 43.48 58.114  2.81  0.00 40.32  4.886\n 577 tactagctagctgatcatcatcg          507 23  0 43.48 58.114  0.00  0.00  0.00  4.886\n 578 tcgatcatcatgctagctactag          274 23  0 43.48 58.114  0.00  0.00 37.62  4.886\n 579 tgatcatcgatgctactagctag          197 23  0 43.48 58.114 20.04 20.04 45.92  4.886\n 580 ctgatcatcgatgctactagcta          196 23  0 43.48 58.114 10.86  0.00 45.92  4.886\n 581 tagctgatcatcgatgctactag          193 23  0 43.48 58.114 13.67  9.68  0.00  4.886\n 582 ctagctgatcatcgatgctacta          192 23  0 43.48 58.114 11.65  8.83  0.00  4.886\n 583 ctactagctagctgatcatcatcg         506 24  0 45.83 59.110  1.08  0.00  0.00  4.890\n 584 ctgatcatcgatgctactagctag         196 24  0 45.83 59.110 20.04 20.04 45.92  4.890\n 585 ctagctgatcatcgatgctactag         192 24  0 45.83 59.110 15.68 15.68  0.00  4.890\n 586 gctagctagctgatcatcatctag         146 24  0 45.83 59.102 34.38 13.13 44.71  4.898\n 587 gctagctagctgatcatcatcta          146 23  0 43.48 58.097 34.38  0.00 46.11  4.903\n 588 ctagtgatgcatgctagtagtg            26 22  0 45.45 57.072 20.00  3.96  0.00  4.928\n 589 gctactatcatctctgcgcgatc          356 23  0 52.17 61.936  4.99  0.00  0.00  4.936\n 590 gctgatcgatcgatgtgc                78 18  0 55.56 57.052 29.71 26.38 35.21  4.948\n 591 tagctagctactatcatcgatcga         428 24  0 41.67 59.031 27.80 22.52  0.00  4.969\n 592 agctagctgatcgatcgtagcg           562 22  0 54.55 62.971 27.20 18.31  0.00  4.971\n 593 tgactgatacgcgatgct               474 18  0 50.00 57.028  2.33  0.00  0.00  4.972\n 594 gatcatcatcgatgctagctag           519 22  0 45.45 57.019 17.46 17.46 40.32  4.981\n 595 tcatcatcgatgctagctagta           521 22  0 40.91 57.005 22.18 18.77 40.32  4.995\n 596 tcgatcatcatgctagctacta           274 22  0 40.91 57.005  0.00  0.00  0.00  4.995\n 597 tgatcatcgatgctactagcta           197 22  0 40.91 57.005 17.14  1.01 45.92  4.995\n 598 tagctgatcatcgatgctacta           193 22  0 40.91 57.005 12.62  8.42  0.00  4.995\n 599 tagctagctgactgatacgcgat          466 23  0 47.83 62.044 28.29  0.00  0.00  5.044\n 600 ctagctagctactatcatcgatcga        427 25  0 44.00 59.949 27.80 22.52  0.00  5.051\n 601 agctagctgactgatcgatcgat          108 23  0 47.83 62.053 30.53 30.53 37.90  5.053\n 602 ctactagctagctgactgatacgc         462 24  0 50.00 61.062  3.61  0.00  0.00  5.062\n 603 gctactagctagctgactgatacg         461 24  0 50.00 61.062 14.37  0.00 44.92  5.062\n 604 tgatcatcatcgatgctagctagta        518 25  0 40.00 60.062 22.18 18.77 40.32  5.062\n 605 tgatcgatcatcatgctagctacta        271 25  0 40.00 60.062 27.48  0.00 37.38  5.062\n 606 ctagtgatgcatgctagtagtgatg         26 25  0 44.00 60.064 20.00  7.49  0.00  5.064\n 607 gctagctagctactatcatcgatc         426 24  0 45.83 58.932 34.38  4.20 46.11  5.068\n 608 gctagctactgatcgatgctacat         304 24  0 45.83 61.072 11.21  0.00  0.00  5.072\n 609 gctagctagctactatcatcgat          426 23  0 43.48 57.922 34.38  0.00 46.11  5.078\n 610 ctagtgatgcatgctagtagtgat          26 24  0 41.67 58.911 20.00  4.64  0.00  5.089\n 611 tactatcatctctgcgcgatcga          358 23  0 47.83 62.092 22.07  1.72 38.48  5.092\n 612 agctgatcgatcgatgctagcta          397 23  0 47.83 62.111 31.26 14.51 40.03  5.111\n 613 tagctgatcgatcgatgctagct          396 23  0 47.83 62.111 33.22 33.22 42.08  5.111\n 614 agctagctgatcgatcgatgcta          393 23  0 47.83 62.111 34.11 32.56 36.80  5.111\n 615 tagctagctgatcgatcgatgct          392 23  0 47.83 62.111 33.87 33.38 38.16  5.111\n 616 tagtgatgcatgctagtagtgat           27 23  0 39.13 57.886 11.56  0.00  0.00  5.114\n 617 tactagctagctgatcatcatcgat        507 25  0 40.00 59.828  0.00  0.00  0.00  5.172\n 618 gctagctagctgatcatcgatgc          187 23  0 52.17 62.193 34.38  9.22 46.11  5.193\n 619 gctagtgatgcatgctagtagtga          25 24  0 45.83 61.195 24.96  4.57  0.00  5.195\n 620 aaagcatcggattagctagctgat           1 24  0 41.67 61.209 17.84 15.13  0.00  5.209\n 621 gtgatgcatgctagtagtgatgtat         29 25  0 40.00 59.774  1.07  1.07  0.00  5.226\n 622 ctatcatctctgcgcgatcgatg          360 23  0 52.17 62.227 18.01 18.01 38.48  5.227\n 623 tgactgatacgcgatgctagcta          474 23  0 47.83 62.287 17.69  3.08  0.00  5.287\n 624 tagctgactgatacgcgatgcta          470 23  0 47.83 62.287 12.64  9.09  0.00  5.287\n 625 tgctagtagtgatgtatacgtagct         37 25  0 40.00 59.713  9.37  8.73  0.00  5.287\n 626 tgactgatcgatcgatgctagct          115 23  0 47.83 62.296 20.19 11.59 35.21  5.296\n 627 agctgactgatcgatcgatgcta          112 23  0 47.83 62.296 26.44 14.64 35.21  5.296\n 628 tagctgactgatcgatcgatgct          111 23  0 47.83 62.296 31.98 30.27 35.21  5.296\n 629 ctagctagctactatcatcgatcg         427 24  0 45.83 58.703 12.49  9.87  0.00  5.297\n 630 tagctagctactatcatcgatcg          428 23  0 43.48 57.691 27.80  9.87  0.00  5.309\n 631 gactgatcgatcatcatgctagct         268 24  0 45.83 61.313 24.51  7.81 41.77  5.313\n 632 gctagctgactgatcgatcatcat         261 24  0 45.83 61.313 26.31 20.43 41.77  5.313\n 633 ctatttagctagctgactgatcga         254 24  0 41.67 58.679  0.00  0.00  0.00  5.321\n 634 gcatgctagtagtgatgtatacg           34 23  0 43.48 57.659 11.60  0.00  0.00  5.341\n 635 tatttagctagctgactgatcga          255 23  0 39.13 57.650  0.00  0.00  0.00  5.350\n 636 ctactagctagctgatcatcatcga        506 25  0 44.00 60.352  1.08  0.00  0.00  5.352\n 637 agctactatcatctctgcgcgat          355 23  0 47.83 62.360  4.99  2.52  0.00  5.360\n 638 gctgatcatcatcgatgctagcta         516 24  0 45.83 61.370 20.15  8.49 40.32  5.370\n 639 tagctgatcatcatcgatgctagc         514 24  0 45.83 61.370 20.04 19.26 40.32  5.370\n 640 gctagctgatcatcatcgatgcta         512 24  0 45.83 61.370 14.58  9.63 40.32  5.370\n 641 tagctagctgatcatcatcgatgc         510 24  0 45.83 61.370 21.42  7.40 40.32  5.370\n 642 atgcatgctagtagtgatgtatacg         32 25  0 40.00 59.604 11.70  0.00  0.00  5.396\n 643 tgatgcatgctagtagtgatgtat          30 24  0 37.50 58.592 12.66 12.66  0.00  5.408\n 644 gactgatcgatcgatgctagctag         116 24  0 50.00 61.409 18.04 17.46 35.21  5.409\n 645 gctatttagctagctgactgatc          253 23  0 43.48 57.572  7.27  0.00 46.11  5.428\n 646 tgctagtgatgcatgctagtagtg          24 24  0 45.83 61.434 24.96 10.54 35.89  5.434\n 647 ctagctagctactatcatctctgc         349 24  0 45.83 58.562 27.80  0.00  0.00  5.438\n 648 gctagctagctactatcatctctg         348 24  0 45.83 58.562 34.38  6.79 46.11  5.438\n 649 gatcatcatcgatgctagctagta         519 24  0 41.67 58.557 22.18 18.77 40.32  5.443\n 650 gatcgatcatcatgctagctacta         272 24  0 41.67 58.557 21.11  0.00  0.00  5.443\n 651 atcatcatcgatgctagctagtag         520 24  0 41.67 58.554  2.13  0.00 40.32  5.446\n 652 atcgatcatcatgctagctactag         273 24  0 41.67 58.554  0.00  0.00 37.62  5.446\n 653 tagctagctactatcatctctgc          350 23  0 43.48 57.527 27.80  0.00  0.00  5.473\n 654 atcatcatcgatgctagctagta          520 23  0 39.13 57.514 22.18 18.77 40.32  5.486\n 655 atcgatcatcatgctagctacta          273 23  0 39.13 57.514  0.00  0.00  0.00  5.486\n 656 gatcatcatcgatgctagctagtag        519 25  0 44.00 59.494  0.21  0.00 40.32  5.506\n 657 gatcgatcatcatgctagctactag        272 25  0 44.00 59.494 21.11  0.00 37.62  5.506\n 658 actagctagctgatcatcatctact        211 25  0 40.00 59.471 22.43  6.99  0.00  5.529\n 659 tgactgatcgatcatcatgctagc         267 24  0 45.83 61.547 26.79 14.13 41.77  5.547\n 660 gctgactgatcgatcatcatgcta         265 24  0 45.83 61.547 27.72 16.42 41.77  5.547\n 661 tagctgactgatcgatcatcatgc         263 24  0 45.83 61.547 27.74 27.74 41.77  5.547\n 662 tgctagtagtgatgtatacgtagc          37 24  0 41.67 58.446  4.93  4.93  0.00  5.554\n 663 ctagctagctgactgatacgcga          465 23  0 52.17 62.571 14.90  0.00  0.00  5.571\n 664 tagctagctactatcatcgatcgat        428 25  0 40.00 59.423 27.80 25.37 35.13  5.577\n 665 gctactagctagctgatcatcatct        208 25  0 44.00 60.585 14.37  0.00 44.92  5.585\n 666 agctgatcatcatctagctagtagc        153 25  0 44.00 60.585 15.25 15.25 40.45  5.585\n 667 ctagctagctgatcgatcgatgtg          71 24  0 50.00 61.642 11.68  4.94 35.21  5.642\n 668 agtgatgcatgctagtagtgatgta         28 25  0 40.00 60.646 11.60  8.84  0.00  5.646\n 669 tagtgatgcatgctagtagtgatgt         27 25  0 40.00 60.646 11.60  0.00  0.00  5.646\n 670 actatcatctctgcgcgatcgat          359 23  0 47.83 62.652 22.07 11.47 38.48  5.652\n 671 ctatttagctagctgactgatcg          254 23  0 43.48 57.339  0.00  0.00  0.00  5.661\n 672 tagctagctgatcgatcgtagcg          561 23  0 52.17 62.677 27.20 18.31  0.00  5.677\n 673 gcatcggattagctagctgatgc            4 23  0 52.17 62.687 34.10 34.10 41.15  5.687\n 674 tgcatgctagtagtgatgtatacgt         33 25  0 40.00 60.700 20.79  0.00  0.00  5.700\n 675 tttagctagctgactgatcgatcat        257 25  0 40.00 60.702 26.67 18.02 36.62  5.702\n 676 atttagctagctgactgatcgatca        256 25  0 40.00 60.702 26.99 26.99 35.44  5.702\n 677 gctagctagctactatcatctct          348 23  0 43.48 57.266 34.38  0.00 46.11  5.734\n 678 aagcatcggattagctagctgatg           2 24  0 45.83 61.794 27.81 27.81 33.28  5.794\n 679 agtgatgtatacgtagctagtagc          44 24  0 41.67 58.201 15.25 15.25 45.79  5.799\n 680 gctagtagtgatgtatacgtagct          38 24  0 41.67 58.201  5.92  5.92  0.00  5.799\n 681 tagctagctgactgatcgatcgat         107 24  0 45.83 61.800 30.53 30.53 37.90  5.800\n 682 actagctagctgactgatacgcg          464 23  0 52.17 62.816 21.52  3.89  0.00  5.816\n 683 actagctagctgatcatcatctac         211 24  0 41.67 58.178 22.43  0.00  0.00  5.822\n 684 tagctgatcgatcgatgctagcta         396 24  0 45.83 61.857 34.98 33.55 41.05  5.857\n 685 tagctagctgatcgatcgatgcta         392 24  0 45.83 61.857 34.11 32.56 36.80  5.857\n 686 tatttagctagctgactgatcgat         255 24  0 37.50 58.112  1.68  0.00  0.00  5.888\n 687 gcatgctagtagtgatgtatacgta         34 25  0 40.00 59.089 11.60  0.00  0.00  5.911\n 688 tatttagctagctgactgatcgatc        255 25  0 40.00 59.084 19.32 19.32  0.00  5.916\n 689 ctatttagctagctgactgatcgat        254 25  0 40.00 59.082  0.00  0.00  0.00  5.918\n 690 ctagctagctactatcatctctgcg        349 25  0 48.00 60.920 27.80  5.75  0.00  5.920\n 691 tgatcgatcgatgctagctaggc          400 23  0 52.17 62.955 26.44 12.49 35.21  5.955\n 692 agctagctactgatcgatgctaca         303 24  0 45.83 61.988 17.56  3.03  0.00  5.988\n 693 tgactgatcgatcgatgctagcta         115 24  0 45.83 62.034 20.19 11.16 35.21  6.034\n 694 tagctgactgatcgatcgatgcta         111 24  0 45.83 62.034 33.43 30.74 35.21  6.034\n 695 catgctagtagtgatgtatacgtagc        35 26  0 42.31 59.961  4.93  4.93  0.00  6.039\n 696 gcatgctagtagtgatgtatacgtag        34 26  0 42.31 59.961 11.60  0.00  0.00  6.039\n 697 actgatcgatcgatgctagctagt         117 24  0 45.83 62.039 23.29 15.07 35.21  6.039\n 698 ctatttagctagctgactgatcgatc       254 26  0 42.31 59.960 19.32 19.32  0.00  6.040\n 699 ttagctagctgactgatcgatcatc        258 25  0 44.00 61.041 28.29 21.92 36.62  6.041\n 700 atgctagtagtgatgtatacgtagct        36 26  0 38.46 60.068  9.37  8.73  0.00  6.068\n 701 ctagctagctgatcatcatctact         212 24  0 41.67 57.930 11.68  6.99  0.00  6.070\n 702 ctactagctagctgatcatcatct         209 24  0 41.67 57.930  1.08  0.00  0.00  6.070\n 703 agctgatcatcatctagctagtag         153 24  0 41.67 57.930  7.49  3.73 40.45  6.070\n 704 ctagctgatcatcatctagctagt         151 24  0 41.67 57.930 21.70  5.56 46.15  6.070\n 705 tagctactatcatctctgcgcgat         354 24  0 45.83 62.096  4.99  2.52  0.00  6.096\n 706 gactgatcgatcatcatgctagcta        268 25  0 44.00 61.099 24.51  4.57 41.77  6.099\n 707 ctgatcatcatcgatgctagctagt        517 25  0 44.00 61.101 22.18  3.56 40.32  6.101\n 708 actagctagctgatcatcatcgatg        508 25  0 44.00 61.101 22.43 20.23 41.48  6.101\n 709 ctgatcgatcatcatgctagctact        270 25  0 44.00 61.101 26.67  0.00 41.77  6.101\n 710 atgctagtagtgatgtatacgtagc         36 25  0 40.00 58.855  4.93  4.93  0.00  6.145\n 711 ctagctagctactgatcgatgctac        301 25  0 48.00 61.145 14.00  7.81  0.00  6.145\n 712 gctagctagctactatcatctctgc        348 25  0 48.00 61.152 34.38 11.74 46.11  6.152\n 713 agctagctgatcatcatctactatca       214 26  0 38.46 59.840 17.99  0.00  0.00  6.160\n 714 ctgatcgatcgatgctagctagtag        118 25  0 48.00 61.197 19.70  5.49 35.21  6.197\n 715 agctagctgactgatcgatcatca         260 24  0 45.83 62.232 26.49 26.49 39.98  6.232\n 716 gctagctagctactatcatcgatcg        426 25  0 48.00 61.252 34.38  9.87 46.11  6.252\n 717 gctatttagctagctgactgatcga        253 25  0 44.00 61.268  7.27  0.00 46.11  6.268\n 718 ctagctagctactatcatcgatcgat       427 26  0 42.31 60.291 27.80 25.37 35.13  6.291\n 719 agctgatcatcgatgctactagct         194 24  0 45.83 62.294 24.11 23.60 45.92  6.294\n 720 agctagctgatcatcgatgctact         190 24  0 45.83 62.294 17.99 10.88  0.00  6.294\n 721 ctagctagctgactgatcgatcga         106 24  0 50.00 62.312 22.52 22.52  0.00  6.312\n 722 actgatcgatcatcatgctagctac        269 25  0 44.00 61.328 26.67  0.00 41.77  6.328\n 723 tgatgcatgctagtagtgatgtatac        30 26  0 38.46 59.623  9.19  6.43  0.00  6.377\n 724 gtgatgcatgctagtagtgatgtata        29 26  0 38.46 59.623  4.23  0.00  0.00  6.377\n 725 tactatcatctctgcgcgatcgat         358 24  0 45.83 62.379 22.07 11.47 38.48  6.379\n 726 gctagctgatcatcatctactatca        215 25  0 40.00 58.607  8.21  0.00  0.00  6.393\n 727 gctactagctagctgatcatcatcta       208 26  0 42.31 60.404 14.37  0.00 44.92  6.404\n 728 tagctgatcatcatctagctagtagc       152 26  0 42.31 60.404 15.25 15.25 41.48  6.404\n 729 tgctagtagtgatgtatacgtagcta        37 26  0 38.46 59.564 10.00  8.05  0.00  6.436\n 730 gatgcatgctagtagtgatgtatacg        31 26  0 42.31 60.453  7.40  0.00  0.00  6.453\n 731 tagtgatgcatgctagtagtgatgta        27 26  0 38.46 60.461 11.60  8.84  0.00  6.461\n 732 gctagtgatgcatgctagtagtgat         25 25  0 44.00 61.506 24.96  8.51  0.00  6.506\n 733 tgcatgctagtagtgatgtatacgta        33 26  0 38.46 60.515 20.79  0.00  0.00  6.515\n 734 tatttagctagctgactgatcgatca       255 26  0 38.46 60.516 26.99 26.99 35.44  6.516\n 735 tgatgcatgctagtagtgatgtata         30 25  0 36.00 58.479  4.13  0.00  0.00  6.521\n 736 tactagctagctgactgatacgcg         463 24  0 50.00 62.538 13.17  3.89  0.00  6.538\n 737 ctagctactatcatctctgcgcga         353 24  0 50.00 62.603  2.71  2.71  0.00  6.603\n 738 agctagctgatcatcatctactatc        214 25  0 40.00 58.369 17.99  0.00  0.00  6.631\n 739 agctagctgatcatcatctactat         214 24  0 37.50 57.345 17.99  0.00  0.00  6.655\n 740 gctactagctagctgatcatcatcg        505 25  0 48.00 61.656 14.37  0.00 44.92  6.656\n 741 gctgatcatcgatgctactagctag        195 25  0 48.00 61.656 20.91 20.04 45.92  6.656\n 742 ctagctgatcatcgatgctactagc        192 25  0 48.00 61.656 20.78 20.78 45.61  6.656\n 743 gctagctgatcatcgatgctactag        191 25  0 48.00 61.656 20.13 20.13  0.00  6.656\n 744 ctagctagctgatcatcgatgctac        188 25  0 48.00 61.656 17.82 12.06  0.00  6.656\n 745 actagctagctgatcatcatctacta       211 26  0 38.46 59.328 22.43  8.11  0.00  6.672\n 746 tactagctagctgatcatcatctact       210 26  0 38.46 59.328  6.99  6.99  0.00  6.672\n 747 ctactagctagctgatcatcatcgat       506 26  0 42.31 60.681  1.08  0.00  0.00  6.681\n 748 tagctagctactgatcgatgctaca        302 25  0 44.00 61.746 27.80  5.02  0.00  6.746\n 749 gtagtgatgtatacgtagctagtagc        42 26  0 42.31 59.249 15.25 15.25 45.79  6.751\n 750 actgatcgatcgatgctagctagta        117 25  0 44.00 61.797 23.29 18.77 35.21  6.797\n 751 gatgcatgctagtagtgatgtatac         31 25  0 40.00 58.175 20.79  1.70  0.00  6.825\n 752 agctgatcatcatcgatgctagct         515 24  0 45.83 62.835 23.00 22.41 41.74  6.835\n 753 agctagctgatcatcatcgatgct         511 24  0 45.83 62.835 17.99  8.34 40.32  6.835\n 754 ctagctagctgactgatacgcgat         465 24  0 50.00 62.838 14.90  0.00  0.00  6.838\n 755 atgcatgctagtagtgatgtatac          32 24  0 37.50 57.161 11.70  0.53  0.00  6.839\n 756 agctagctactatcatctctgcgc         351 24  0 50.00 62.858 17.56  0.00  0.00  6.858\n 757 gctagctagctactgatcgatgct         300 24  0 50.00 62.858 34.38 11.51 46.11  6.858\n 758 ctactatcatctctgcgcgatcga         357 24  0 50.00 62.878 22.07  1.72 38.48  6.878\n 759 gctagctactgatcgatgctacatc        304 25  0 48.00 61.879 11.21  4.40 37.97  6.879\n 760 tagtgatgtatacgtagctagtagc         43 25  0 40.00 58.104 15.25 15.25 45.79  6.896\n 761 gctagtagtgatgtatacgtagcta         38 25  0 40.00 58.104  7.24  5.34  0.00  6.896\n 762 tgatcatcatcgatgctagctagtag       518 26  0 42.31 60.902 14.93  0.00 40.32  6.902\n 763 ctgatcatcatcgatgctagctagta       517 26  0 42.31 60.902 22.18 18.77 40.32  6.902\n 764 tactagctagctgatcatcatcgatg       507 26  0 42.31 60.902 20.23 20.23 41.48  6.902\n 765 tgatcgatcatcatgctagctactag       271 26  0 42.31 60.902 27.48  0.00 37.38  6.902\n 766 ctgatcgatcatcatgctagctacta       270 26  0 42.31 60.902 26.67  1.37 41.77  6.902\n 767 agctgatcgatcgatgctagctag         397 24  0 50.00 62.904 31.26 19.90 40.03  6.904\n 768 ctagctgatcgatcgatgctagct         395 24  0 50.00 62.904 35.51 33.22 43.05  6.904\n 769 agctagctgatcgatcgatgctag         393 24  0 50.00 62.904 41.07 41.07 46.89  6.904\n 770 ctagctagctgatcgatcgatgct         391 24  0 50.00 62.904 33.87 33.38 38.16  6.904\n 771 tactagctagctgatcatcatctac        210 25  0 40.00 58.081  0.00  0.00  0.00  6.919\n 772 gctagctgatcatcatctactatc         215 24  0 41.67 57.062  8.21  0.00  0.00  6.938\n 773 agtgatgcatgctagtagtgatgtat        28 26  0 38.46 60.969  1.07  1.07  0.00  6.969\n 774 gctagtagtgatgtatacgtagctag        38 26  0 42.31 59.027  8.99  8.99  0.00  6.973\n 775 tagctagctgactgatcgatcatca        259 25  0 44.00 61.981 28.29 26.49 39.98  6.981\n 776 ctactagctagctgatcatcatctac       209 26  0 42.31 59.015  1.08  0.00  0.00  6.985\n 777 agtagtgatgtatacgtagctagt          41 24  0 37.50 57.012  8.68  8.68  0.00  6.988\n 778 gctagctgatcatcatctactatcat       215 26  0 38.46 59.001  8.21  0.00  0.00  6.999\n 779 agctgatcatcatctactatcatca        218 25  0 36.00 57.993  0.00  0.00  0.00  7.007\n 780 atgcatgctagtagtgatgtatacgt        32 26  0 38.46 61.018 11.70  0.00  0.00  7.018\n 781 atttagctagctgactgatcgatcat       256 26  0 38.46 61.022 26.67 18.02 36.62  7.022\n 782 agctgatcatcgatgctactagcta        194 25  0 44.00 62.040 24.59  9.79 45.92  7.040\n 783 tagctgatcatcgatgctactagct        193 25  0 44.00 62.040 27.00 27.00 45.92  7.040\n 784 agctagctgatcatcgatgctacta        190 25  0 44.00 62.040 17.99 11.59  0.00  7.040\n 785 tagctagctgatcatcgatgctact        189 25  0 44.00 62.040 17.55 15.53  0.00  7.040\n 786 atgctagtagtgatgtatacgtagcta       36 27  0 37.04 59.911 10.00  8.05  0.00  7.089\n 787 gctagctgatcatcatctactatcatc      215 27  0 40.74 59.861  8.21  0.00  0.00  7.139\n 788 ctagctagctgatcatcatctacta        212 25  0 40.00 57.842 11.68  8.11  0.00  7.158\n 789 ctactagctagctgatcatcatcta        209 25  0 40.00 57.842  1.08  0.00  0.00  7.158\n 790 tagctgatcatcatctagctagtag        152 25  0 40.00 57.842 13.40  3.73 41.48  7.158\n 791 ctagctgatcatcatctagctagta        151 25  0 40.00 57.842 21.70  7.13 46.15  7.158\n 792 gctgatcatcatcgatgctagctag        516 25  0 48.00 62.165 20.15 17.46 40.32  7.165\n 793 ctagctgatcatcatcgatgctagc        513 25  0 48.00 62.165 19.27 19.26 41.96  7.165\n 794 gctagctgatcatcatcgatgctag        512 25  0 48.00 62.165 23.70 23.70 45.51  7.165\n 795 ctagctagctgatcatcatcgatgc        509 25  0 48.00 62.165 21.42  7.40 40.32  7.165\n 796 agctagctgatcatcatctactatcat      214 27  0 37.04 60.181 17.99  0.00  0.00  7.181\n 797 ctactagctagctgatcatcatctact      209 27  0 40.74 60.181  6.99  6.99  0.00  7.181\n 798 ctagctgatcatcatctagctagtag       151 26  0 42.31 58.789 21.70 10.73 46.15  7.211\n 799 aaagcatcggattagctagctgatg          1 25  0 44.00 62.249 27.81 27.81 33.28  7.249\n 800 agctagctactgatcgatgctacat        303 25  0 44.00 62.272 17.56  6.16  0.00  7.272\n 801 tagctagctgatcatcatctactatca      213 27  0 37.04 59.689  8.31  0.00  0.00  7.311\n 802 actagctagctgatcatcatctactat      211 27  0 37.04 59.688 22.43  2.36  0.00  7.312\n 803 ctgactgatcgatcatcatgctagc        266 25  0 48.00 62.333 20.99  8.86 41.77  7.333\n 804 gctgactgatcgatcatcatgctag        265 25  0 48.00 62.333 27.72 21.73 41.77  7.333\n 805 ctagctgactgatcgatcatcatgc        262 25  0 48.00 62.333 27.74 27.74 41.77  7.333\n 806 gctagctgactgatcgatcatcatg        261 25  0 48.00 62.333 22.70 19.51 41.77  7.333\n 807 tgctagtagtgatgtatacgtagctag       37 27  0 40.74 60.395  8.99  8.99  0.00  7.395\n 808 agtagtgatgtatacgtagctagtagc       41 27  0 40.74 60.395 15.25 15.25 45.79  7.395\n 809 gctagtagtgatgtatacgtagctagt       38 27  0 40.74 60.395 15.55 15.55  0.00  7.395\n 810 ctagtgatgcatgctagtagtgatgt        26 26  0 42.31 61.460 20.00  0.00  0.00  7.460\n 811 gctgatcatcatctactatcatcatca      219 27  0 37.04 59.533  0.00  0.00  0.00  7.467\n 812 agctagctgactgatcgatcatcat        260 25  0 44.00 62.507 26.31 20.43 41.77  7.507\n 813 tttagctagctgactgatcgatcatc       257 26  0 42.31 61.507 23.93 21.92 36.62  7.507\n 814 catgctagtagtgatgtatacgtag         35 25  0 40.00 57.441  4.74  0.00  0.00  7.559\n 815 agctgatcatcatcgatgctagcta        515 25  0 44.00 62.561 23.50 10.90 43.19  7.561\n 816 tagctgatcatcatcgatgctagct        514 25  0 44.00 62.561 26.21 26.21 44.79  7.561\n 817 agctagctgatcatcatcgatgcta        511 25  0 44.00 62.561 17.99  9.63 40.32  7.561\n 818 tagctagctgatcatcatcgatgct        510 25  0 44.00 62.561 14.14 10.38 40.32  7.561\n 819 gctatttagctagctgactgatcgat       253 26  0 42.31 61.564  7.27  0.00 46.11  7.564\n 820 ctagctagctgactgatcgatcgat        106 25  0 48.00 62.579 30.53 30.53 37.90  7.579\n 821 agctgatcatcatctactatcatcat       218 26  0 34.62 58.415  0.00  0.00  0.00  7.585\n 822 tagctagctactatcatctctgcgc        350 25  0 48.00 62.587 27.80  0.00  0.00  7.587\n 823 gctagctagctactgatcgatgcta        300 25  0 48.00 62.587 34.38 12.23 46.11  7.587\n 824 tgctagtgatgcatgctagtagtga         24 25  0 44.00 62.622 24.96 13.57 35.89  7.622\n 825 tagctgatcgatcgatgctagctag        396 25  0 48.00 62.632 33.71 21.46 41.05  7.632\n 826 ctagctgatcgatcgatgctagcta        395 25  0 48.00 62.632 35.51 32.61 43.05  7.632\n 827 tagctagctgatcgatcgatgctag        392 25  0 48.00 62.632 41.07 41.07 46.89  7.632\n 828 ctagctagctgatcgatcgatgcta        391 25  0 48.00 62.632 34.11 32.56 36.80  7.632\n 829 gtgatgcatgctagtagtgatgtatac       29 27  0 40.74 60.659  9.56  7.17  0.00  7.659\n 830 agctgatcatcatctactatcatcatc      218 27  0 37.04 59.314  0.00  0.00  0.00  7.686\n 831 tagctagctgatcatcatctactat        213 25  0 36.00 57.279  8.31  0.00  0.00  7.721\n 832 tagctagctgatcatcatctactatc       213 26  0 38.46 58.269  8.31  0.00  0.00  7.731\n 833 tgactgatcgatcatcatgctagct        267 25  0 44.00 62.733 26.79 10.55 41.77  7.733\n 834 agctgactgatcgatcatcatgcta        264 25  0 44.00 62.733 30.60 18.10 41.77  7.733\n 835 tagctgactgatcgatcatcatgct        263 25  0 44.00 62.733 32.31 32.31 41.77  7.733\n 836 ctagctagctgatcatcatctactat       212 26  0 38.46 58.265  9.41  0.00  0.00  7.735\n 837 agtgatgcatgctagtagtgatgtata       28 27  0 37.04 60.779  4.23  0.00  0.00  7.779\n 838 tagtgatgcatgctagtagtgatgtat       27 27  0 37.04 60.779 11.56  0.00  0.00  7.779\n 839 tgactgatcgatcgatgctagctag        115 25  0 48.00 62.800 20.19 17.46 35.21  7.800\n 840 ctgactgatcgatcgatgctagcta        114 25  0 48.00 62.800 20.19 11.97 35.21  7.800\n 841 tagctgactgatcgatcgatgctag        111 25  0 48.00 62.800 31.45 26.34 35.21  7.800\n 842 ctagctgactgatcgatcgatgcta        110 25  0 48.00 62.800 31.54 29.68 35.21  7.800\n 843 tagctagctgactgatcgatcgatg        107 25  0 48.00 62.800 28.29 13.21 35.21  7.800\n 844 gactgatcgatcgatgctagctagt        116 25  0 48.00 62.802 22.18 12.64 35.21  7.802\n 845 tactagctagctgatcatcatctacta      210 27  0 37.04 59.196  8.79  8.11  0.00  7.804\n 846 tagctgatcatcgatgctactagcta       193 26  0 42.31 61.805 28.86 27.39 45.92  7.805\n 847 tagctagctgatcatcgatgctacta       189 26  0 42.31 61.805 18.93 16.03  0.00  7.805\n 848 atgcatgctagtagtgatgtatacgta       32 27  0 37.04 60.828 11.70  0.00  0.00  7.828\n 849 tatttagctagctgactgatcgatcat      255 27  0 37.04 60.831 26.67 18.02 36.62  7.831\n 850 ctagctagctgatcatcatctactatc      212 27  0 40.74 59.162  9.41  0.06  0.00  7.838\n 851 tagctactatcatctctgcgcgatc        354 25  0 48.00 62.854  0.00  0.00  0.00  7.854\n 852 gctgatcatcatctactatcatcat        219 25  0 36.00 57.142  0.00  0.00  0.00  7.858\n 853 ctagctactatcatctctgcgcgat        353 25  0 48.00 62.859  4.99  2.52  0.00  7.859\n 854 gctgatcatcatctactatcatcatc       219 26  0 38.46 58.126  0.00  0.00  0.00  7.874\n 855 tagctagctactgatcgatgctacat       302 26  0 42.31 62.028 27.80  3.08  0.00  8.028\n 856 agtagtgatgtatacgtagctagtag        41 26  0 38.46 57.950  9.92  1.30  0.00  8.050\n 857 ctagtagtgatgtatacgtagctagt        39 26  0 38.46 57.950 15.52 15.52  0.00  8.050\n 858 catgctagtagtgatgtatacgtagct       35 27  0 40.74 61.089  9.37  8.73  0.00  8.089\n 859 gactgatcgatcatcatgctagctac       268 26  0 46.15 62.094 24.51  8.36 41.77  8.094\n 860 tagctgatcatcatctactatcatca       217 26  0 34.62 57.906  0.00  0.00  0.00  8.094\n 861 ctagctgatcatcatctactatcatca      216 27  0 37.04 58.826  0.00  0.00  0.00  8.174\n 862 ctagctgatcatcatctagctagtagc      151 27  0 44.44 61.196 21.70 15.25 46.15  8.196\n 863 tagctagctgactgatcgatcatcat       259 26  0 42.31 62.255 28.29 20.43 41.77  8.255\n 864 ctagtgatgcatgctagtagtgatgta       26 27  0 40.74 61.255 20.00  8.84  0.00  8.255\n 865 tgcatgctagtagtgatgtatacgtag       33 27  0 40.74 61.300 20.79  0.00  0.00  8.300\n 866 ctatttagctagctgactgatcgatca      254 27  0 40.74 61.304 26.99 26.99 35.44  8.304\n 867 tagctgatcatcatcgatgctagcta       514 26  0 42.31 62.307 28.23 26.63 43.19  8.307\n 868 tagctagctgatcatcatcgatgcta       510 26  0 42.31 62.307 14.58 11.03 40.32  8.307\n 869 gctagctagctactatcatcgatcga       426 26  0 46.15 62.381 34.38 22.52 46.11  8.381\n 870 gctactagctagctgatcatcatctac      208 27  0 44.44 61.407 14.37  0.00 44.92  8.407\n 871 ttagctagctgactgatcgatcatca       258 26  0 42.31 62.416 28.29 26.49 39.98  8.416\n 872 tgactgatcgatcatcatgctagcta       267 26  0 42.31 62.472 26.79 11.24 41.77  8.472\n 873 tagctgactgatcgatcatcatgcta       263 26  0 42.31 62.472 33.83 32.61 41.77  8.472\n 874 actgatcgatcatcatgctagctact       269 26  0 42.31 62.478 26.67  0.00 41.77  8.478\n 875 gctagtgatgcatgctagtagtgatg        25 26  0 46.15 62.484 24.96  9.07  0.00  8.484\n 876 ctagctagctactgatcgatgctaca       301 26  0 46.15 62.503 14.00  5.87  0.00  8.503\n 877 gactgatcgatcgatgctagctagta       116 26  0 46.15 62.543 22.18 18.77 35.21  8.543\n 878 actgatcgatcgatgctagctagtag       117 26  0 46.15 62.548 23.29 12.42 35.21  8.548\n 879 ctagctgatcatcatctactatcatc       216 26  0 38.46 57.395  0.00  0.00  0.00  8.605\n 880 ctgatcatcatcgatgctagctagtag      517 27  0 44.44 61.665 10.30  1.36 40.32  8.665\n 881 ctactagctagctgatcatcatcgatg      506 27  0 44.44 61.665 20.23 20.23 41.48  8.665\n 882 ctgatcgatcatcatgctagctactag      270 27  0 44.44 61.665 26.67  8.14 41.77  8.665\n 883 tagctgatcatcatctactatcatcat      217 27  0 33.33 58.315  0.00  0.00  0.00  8.685\n 884 tgatgcatgctagtagtgatgtatacg       30 27  0 40.74 61.778  9.81  0.00  0.00  8.778\n 885 gatgcatgctagtagtgatgtatacgt       31 27  0 40.74 61.779  7.40  0.00  0.00  8.779\n 886 gctactagctagctgatcatcatcga       505 26  0 46.15 62.779 14.37  0.00 44.92  8.779\n 887 agctgatcatcgatgctactagctag       194 26  0 46.15 62.784 24.59 20.04 45.92  8.784\n 888 ctagctgatcatcgatgctactagct       192 26  0 46.15 62.784 27.00 27.00 45.92  8.784\n 889 agctagctgatcatcgatgctactag       190 26  0 46.15 62.784 20.13 20.13  0.00  8.784\n 890 ctagctagctgatcatcgatgctact       188 26  0 46.15 62.784 17.55 15.53  0.00  8.784\n 891 atttagctagctgactgatcgatcatc      256 27  0 40.74 61.785 23.93 21.92 36.62  8.785\n 892 tctactatcatcatcatctactagct       230 26  0 34.62 57.155  0.00  0.00  0.00  8.845\n 893 tgctagtgatgcatgctagtagtgat        24 26  0 42.31 62.874 24.96  8.51 35.89  8.874\n 894 ctgatcatcatctactatcatcatca       220 26  0 34.62 57.026  0.00  0.00  0.00  8.974\n 895 agctagctactgatcgatgctacatc       303 26  0 46.15 62.999 17.56  7.89 37.97  8.999\n 896 tagtagtgatgtatacgtagctagtag       40 27  0 37.04 57.869 16.78  1.30  0.00  9.131\n 897 ctagtagtgatgtatacgtagctagta       39 27  0 37.04 57.869 16.85 15.97  0.00  9.131\n 898 actgatcgatcatcatgctagctacta      269 27  0 40.74 62.236 26.67  1.37 41.77  9.236\n 899 gcatgctagtagtgatgtatacgtagc       34 27  0 44.44 62.283 11.60  4.93  0.00  9.283\n 900 gctatttagctagctgactgatcgatc      253 27  0 44.44 62.291 19.32 19.32 46.11  9.291\n 901 atctactatcatcatcatctactagct      229 27  0 33.33 57.592  0.00  0.00  0.00  9.408\n 902 catctactatcatcatcatctactagc      228 27  0 37.04 57.549  0.00  0.00  0.00  9.451\n 903 tgatcatcatctactatcatcatcatc      221 27  0 33.33 57.467  0.00  0.00  0.00  9.533\n 904 tagctgatcatcgatgctactagctag      193 27  0 44.44 62.534 27.70 20.04 45.92  9.534\n 905 ctagctgatcatcgatgctactagcta      192 27  0 44.44 62.534 27.76 26.73 45.92  9.534\n 906 tagctagctgatcatcgatgctactag      189 27  0 44.44 62.534 20.13 20.13  0.00  9.534\n 907 ctagctagctgatcatcgatgctacta      188 27  0 44.44 62.534 17.74 15.95  0.00  9.534\n 908 ctgatcatcatctactatcatcatcat      220 27  0 33.33 57.462  0.00  0.00  0.00  9.538\n 909 gctagctagctactatcatcgatcgat      426 27  0 44.44 62.627 34.38 25.37 46.11  9.627\n 910 ttagctagctgactgatcgatcatcat      258 27  0 40.74 62.665 28.29 20.43 41.77  9.665\n 911 tagctagctactgatcgatgctacatc      302 27  0 44.44 62.742 27.80  7.89 37.97  9.742\n 912 ctagctagctactgatcgatgctacat      301 27  0 44.44 62.747 14.00  2.51  0.00  9.747\n 913 gatcatcatctactatcatcatcatct      222 27  0 33.33 57.242  0.00  0.00  0.00  9.758\n 914 tttagctagctgactgatcgatcatca      257 27  0 40.74 62.820 26.49 26.49 39.98  9.820\n 915 tctactatcatcatcatctactagcta      230 27  0 33.33 57.100  0.00  0.00  0.00  9.900\n"
  },
  {
    "path": "src/test/resources/samples/langs/Formatted/wksst8110.for",
    "content": " Weekly SST data starts week centered on 3Jan1990\n\n                Nino1+2      Nino3        Nino34        Nino4\n Week          SST SSTA     SST SSTA     SST SSTA     SST SSTA\n 03JAN1990     23.4-0.4     25.1-0.3     26.6 0.0     28.6 0.3\n 10JAN1990     23.4-0.8     25.2-0.3     26.6 0.1     28.6 0.3\n 17JAN1990     24.2-0.3     25.3-0.3     26.5-0.1     28.6 0.3\n 24JAN1990     24.4-0.5     25.5-0.4     26.5-0.1     28.4 0.2\n 31JAN1990     25.1-0.2     25.8-0.2     26.7 0.1     28.4 0.2\n 07FEB1990     25.8 0.2     26.1-0.1     26.8 0.1     28.4 0.3\n 14FEB1990     25.9-0.1     26.4 0.0     26.9 0.2     28.5 0.4\n 21FEB1990     26.1-0.1     26.7 0.2     27.1 0.3     28.9 0.8\n 28FEB1990     26.1-0.2     26.7-0.1     27.2 0.3     29.0 0.8\n 07MAR1990     26.7 0.3     26.7-0.2     27.3 0.2     28.9 0.7\n 14MAR1990     26.1-0.4     26.9-0.2     27.3 0.1     28.6 0.4\n 21MAR1990     26.1-0.2     27.2 0.0     27.6 0.3     28.7 0.5\n 28MAR1990     25.7-0.4     27.5 0.2     27.8 0.3     28.8 0.5\n 04APR1990     25.6-0.3     27.6 0.3     27.9 0.4     28.8 0.4\n 11APR1990     25.1-0.6     27.6 0.2     27.9 0.2     28.8 0.3\n 18APR1990     25.3 0.0     27.7 0.2     28.0 0.2     28.9 0.4\n 25APR1990     25.1 0.0     27.7 0.4     28.2 0.4     29.2 0.6\n 02MAY1990     24.6-0.2     27.6 0.3     28.1 0.3     29.0 0.4\n 09MAY1990     24.2-0.2     27.5 0.3     28.1 0.3     28.9 0.2\n 16MAY1990     24.3 0.1     27.4 0.3     28.0 0.2     28.8 0.1\n 23MAY1990     23.7-0.2     27.2 0.2     28.1 0.3     29.0 0.2\n 30MAY1990     23.4-0.1     27.1 0.3     27.9 0.2     28.9 0.1\n 06JUN1990     23.2 0.0     26.7 0.1     27.7 0.0     28.9 0.1\n 13JUN1990     22.8-0.2     26.6 0.1     27.7 0.0     29.0 0.1\n 20JUN1990     22.5-0.1     26.4 0.0     27.5-0.1     29.0 0.1\n 27JUN1990     22.1-0.3     26.0-0.1     27.3-0.2     28.9 0.1\n 04JUL1990     21.7-0.4     25.8-0.2     27.3-0.1     28.9 0.1\n 11JUL1990     21.3-0.5     25.4-0.3     27.2-0.1     28.8 0.0\n 18JUL1990     21.0-0.5     25.7 0.1     27.4 0.2     29.1 0.3\n 25JUL1990     20.2-1.1     25.1-0.4     27.3 0.1     29.1 0.3\n 01AUG1990     20.6-0.6     25.1-0.2     27.1 0.1     29.0 0.3\n 08AUG1990     20.4-0.5     25.2 0.1     27.2 0.3     29.3 0.6\n 15AUG1990     20.4-0.3     25.1 0.1     27.0 0.2     29.2 0.5\n 22AUG1990     19.8-0.7     24.9 0.0     27.0 0.2     29.2 0.5\n 29AUG1990     20.2-0.3     25.0 0.1     26.9 0.2     29.0 0.4\n 05SEP1990     19.7-0.8     24.9 0.0     26.7 0.0     28.9 0.3\n 12SEP1990     20.1-0.3     24.7-0.2     26.7 0.0     29.1 0.4\n 19SEP1990     20.3-0.1     24.9 0.1     26.8 0.0     29.1 0.4\n 26SEP1990     20.3-0.2     24.8-0.1     26.7 0.0     29.0 0.3\n 03OCT1990     20.8 0.1     25.1 0.2     26.9 0.2     29.2 0.5\n 10OCT1990     20.1-0.6     24.9 0.0     27.0 0.3     29.1 0.5\n 17OCT1990     20.3-0.6     24.9 0.0     27.0 0.3     29.3 0.6\n 24OCT1990     20.1-0.9     24.9-0.1     27.0 0.4     29.3 0.6\n 31OCT1990     20.2-1.0     24.7-0.2     26.9 0.2     29.2 0.6\n 07NOV1990     20.5-0.8     25.0 0.1     26.9 0.3     29.1 0.5\n 14NOV1990     20.8-0.8     24.8-0.1     26.7 0.0     29.0 0.4\n 21NOV1990     20.9-0.9     24.6-0.4     26.6 0.0     29.0 0.4\n 28NOV1990     21.5-0.6     24.8-0.3     26.5-0.1     28.9 0.4\n 05DEC1990     22.2-0.2     25.2 0.1     26.9 0.3     29.2 0.7\n 12DEC1990     22.1-0.5     25.0-0.1     26.8 0.3     29.3 0.8\n 19DEC1990     22.2-0.8     24.9-0.3     26.9 0.4     29.2 0.7\n 26DEC1990     23.3 0.0     25.3 0.0     27.0 0.4     29.0 0.6\n 02JAN1991     23.2-0.5     25.3-0.1     26.9 0.4     28.9 0.5\n 09JAN1991     23.5-0.6     25.4-0.1     27.0 0.4     29.1 0.8\n 16JAN1991     23.7-0.7     25.7 0.1     27.0 0.5     29.0 0.8\n 23JAN1991     24.2-0.6     25.8 0.0     27.1 0.5     29.0 0.8\n 30JAN1991     24.7-0.5     26.0 0.0     27.0 0.3     28.9 0.7\n 06FEB1991     25.4-0.2     26.1 0.0     27.0 0.3     28.8 0.6\n 13FEB1991     26.0 0.0     26.3 0.0     27.0 0.3     28.8 0.7\n 20FEB1991     26.5 0.3     26.3-0.2     26.9 0.1     28.7 0.6\n 27FEB1991     26.5 0.2     26.5-0.2     26.8-0.1     28.5 0.4\n 06MAR1991     26.5 0.2     26.6-0.3     26.8-0.2     28.5 0.3\n 13MAR1991     26.8 0.4     27.0-0.1     27.1-0.1     28.5 0.3\n 20MAR1991     26.6 0.2     27.1-0.1     27.4 0.1     28.6 0.4\n 27MAR1991     26.2 0.1     27.4 0.1     27.7 0.3     28.9 0.6\n 03APR1991     25.8-0.1     27.3 0.0     27.8 0.2     28.9 0.5\n 10APR1991     25.2-0.5     27.0-0.4     27.8 0.1     29.1 0.7\n 17APR1991     24.9-0.5     27.5 0.0     28.2 0.4     29.2 0.7\n 24APR1991     24.3-0.8     27.4 0.0     28.1 0.3     29.2 0.6\n 01MAY1991     24.6-0.2     27.6 0.4     28.1 0.3     29.1 0.4\n 08MAY1991     24.4-0.2     27.5 0.3     28.3 0.5     29.3 0.6\n 15MAY1991     24.5 0.2     27.5 0.4     28.4 0.5     29.5 0.7\n 22MAY1991     24.3 0.4     27.7 0.7     28.5 0.7     29.5 0.7\n 29MAY1991     24.2 0.5     27.6 0.8     28.5 0.7     29.5 0.7\n 05JUN1991     23.7 0.4     27.5 0.8     28.3 0.6     29.3 0.5\n 12JUN1991     23.2 0.2     27.4 0.9     28.3 0.6     29.3 0.5\n 19JUN1991     23.0 0.3     27.2 0.9     28.4 0.8     29.4 0.5\n 26JUN1991     22.2-0.2     27.3 1.1     28.4 0.9     29.4 0.6\n 03JUL1991     22.8 0.7     27.0 1.0     28.1 0.7     29.2 0.4\n 10JUL1991     22.3 0.4     26.8 1.0     28.1 0.8     29.2 0.4\n 17JUL1991     21.9 0.3     26.6 1.0     27.9 0.7     29.3 0.5\n 24JUL1991     21.6 0.3     26.2 0.7     27.7 0.5     29.2 0.5\n 31JUL1991     21.6 0.5     26.1 0.8     27.9 0.9     29.5 0.7\n 07AUG1991     21.2 0.3     25.6 0.4     27.5 0.6     29.3 0.6\n 14AUG1991     21.3 0.5     25.4 0.4     27.6 0.7     29.3 0.6\n 21AUG1991     20.9 0.3     25.4 0.5     27.4 0.6     29.3 0.6\n 28AUG1991     20.7 0.2     25.2 0.3     27.0 0.3     29.0 0.3\n 04SEP1991     20.9 0.4     25.1 0.2     27.1 0.3     29.1 0.5\n 11SEP1991     20.7 0.3     24.7-0.1     26.9 0.1     29.0 0.4\n 18SEP1991     20.7 0.3     25.1 0.2     27.2 0.5     29.4 0.7\n 25SEP1991     20.8 0.3     25.2 0.3     27.1 0.4     29.2 0.5\n 02OCT1991     20.8 0.2     25.3 0.4     27.2 0.5     29.3 0.6\n 09OCT1991     21.1 0.4     25.6 0.7     27.7 1.0     29.5 0.8\n 16OCT1991     20.7-0.1     25.5 0.6     27.8 1.1     29.6 1.0\n 23OCT1991     21.2 0.2     25.7 0.8     27.6 0.9     29.4 0.7\n 30OCT1991     21.9 0.7     25.9 1.0     27.8 1.1     29.4 0.8\n 06NOV1991     22.0 0.7     25.8 0.9     27.8 1.1     29.5 0.8\n 13NOV1991     21.9 0.4     25.9 1.0     27.8 1.1     29.5 0.9\n 20NOV1991     22.5 0.7     26.1 1.1     27.9 1.3     29.4 0.8\n 27NOV1991     22.3 0.3     26.1 1.1     28.0 1.4     29.4 0.9\n 04DEC1991     22.8 0.5     26.2 1.1     28.1 1.5     29.4 0.9\n 11DEC1991     23.4 0.8     26.5 1.4     28.3 1.7     29.4 0.9\n 18DEC1991     23.7 0.8     26.6 1.5     28.5 2.0     29.5 1.0\n 25DEC1991     23.6 0.3     26.7 1.4     28.5 1.9     29.6 1.2\n 01JAN1992     24.0 0.3     26.7 1.3     28.5 1.9     29.3 1.0\n 08JAN1992     24.2 0.2     26.8 1.3     28.5 1.9     29.2 0.9\n 15JAN1992     24.6 0.2     26.9 1.3     28.4 1.9     29.1 0.8\n 22JAN1992     25.3 0.5     27.1 1.3     28.4 1.8     29.0 0.7\n 29JAN1992     25.9 0.7     27.4 1.4     28.3 1.7     28.7 0.6\n 05FEB1992     26.3 0.8     27.5 1.3     28.4 1.7     28.8 0.7\n 12FEB1992     26.4 0.5     27.6 1.3     28.6 1.9     29.0 0.9\n 19FEB1992     26.8 0.6     27.8 1.3     28.8 2.0     29.2 1.1\n 26FEB1992     27.3 1.1     27.9 1.2     28.8 1.9     29.1 1.0\n 04MAR1992     27.3 1.0     27.9 1.1     28.6 1.6     29.1 0.9\n 11MAR1992     27.7 1.2     28.1 1.0     28.7 1.6     29.2 1.0\n 18MAR1992     27.9 1.4     28.5 1.3     28.8 1.6     28.9 0.7\n 25MAR1992     28.1 1.9     28.7 1.4     29.0 1.6     29.1 0.8\n 01APR1992     27.9 1.9     28.7 1.3     29.1 1.6     29.4 1.0\n 08APR1992     28.3 2.6     28.8 1.4     29.3 1.6     29.6 1.2\n 15APR1992     28.0 2.5     28.8 1.3     29.2 1.4     29.5 1.0\n 22APR1992     27.1 1.9     28.6 1.2     29.0 1.2     29.3 0.8\n 29APR1992     27.0 2.1     28.8 1.5     29.1 1.2     29.2 0.6\n 06MAY1992     27.0 2.4     28.8 1.6     29.2 1.3     29.4 0.7\n 13MAY1992     26.6 2.3     28.6 1.5     29.1 1.2     29.5 0.8\n 20MAY1992     25.8 1.8     28.2 1.2     29.0 1.1     29.5 0.8\n 27MAY1992     25.9 2.2     28.1 1.3     28.8 1.1     29.5 0.7\n 03JUN1992     24.2 0.9     27.5 0.8     28.6 0.9     29.4 0.6\n 10JUN1992     24.2 1.2     26.8 0.3     28.3 0.6     29.4 0.6\n 17JUN1992     23.9 1.1     26.6 0.2     27.8 0.2     29.2 0.4\n 24JUN1992     23.5 1.0     26.2 0.0     27.6 0.1     29.2 0.4\n 01JUL1992     22.3 0.1     25.8-0.2     27.6 0.1     29.2 0.4\n 08JUL1992     23.0 1.1     26.2 0.4     28.0 0.7     29.5 0.7\n 15JUL1992     21.4-0.3     25.7 0.0     27.7 0.5     29.5 0.7\n 22JUL1992     21.6 0.2     25.1-0.4     27.2 0.0     29.2 0.5\n 29JUL1992     21.5 0.3     24.9-0.5     27.1 0.1     29.2 0.5\n 05AUG1992     20.8-0.2     24.6-0.6     26.7-0.2     29.1 0.4\n 12AUG1992     20.8 0.0     24.9-0.2     26.6-0.3     28.8 0.1\n 19AUG1992     20.3-0.4     24.6-0.4     26.6-0.3     28.8 0.2\n 26AUG1992     20.3-0.3     24.8-0.2     26.7-0.1     28.9 0.3\n 02SEP1992     20.3-0.2     24.4-0.5     26.3-0.4     28.6 0.0\n 09SEP1992     19.7-0.8     24.4-0.5     26.4-0.3     28.7 0.1\n 16SEP1992     20.1-0.2     24.5-0.3     26.5-0.2     28.9 0.2\n 23SEP1992     20.1-0.3     24.6-0.3     26.5-0.2     28.9 0.2\n 30SEP1992     20.2-0.4     24.7-0.2     26.6-0.1     28.7 0.0\n 07OCT1992     20.5-0.2     24.5-0.4     26.4-0.3     28.8 0.1\n 14OCT1992     20.7 0.0     24.6-0.3     26.4-0.3     28.6-0.1\n 21OCT1992     20.9 0.0     24.6-0.4     26.2-0.5     28.8 0.1\n 28OCT1992     21.5 0.4     24.8-0.1     26.2-0.4     28.5-0.1\n 04NOV1992     21.2-0.1     24.7-0.2     26.3-0.4     28.6 0.0\n 11NOV1992     21.2-0.3     24.8-0.1     26.6-0.1     28.8 0.2\n 18NOV1992     21.2-0.5     24.7-0.3     26.4-0.2     28.5-0.1\n 25NOV1992     22.1 0.2     24.9-0.2     26.7 0.0     28.8 0.2\n 02DEC1992     22.2 0.0     24.9-0.2     26.7 0.1     28.9 0.4\n 09DEC1992     22.2-0.3     25.1 0.0     26.8 0.2     28.7 0.2\n 16DEC1992     22.3-0.5     24.9-0.3     26.7 0.1     28.7 0.3\n 23DEC1992     22.5-0.7     25.1-0.2     26.8 0.2     28.9 0.4\n 30DEC1992     23.3-0.2     25.1-0.3     26.6 0.0     28.6 0.2\n 06JAN1993     23.6-0.3     25.4-0.1     26.7 0.1     28.5 0.2\n 13JAN1993     24.4 0.1     25.6 0.0     26.8 0.2     28.7 0.4\n 20JAN1993     24.5-0.2     25.5-0.2     26.6 0.0     28.6 0.3\n 27JAN1993     25.2 0.1     25.8-0.2     26.7 0.0     28.6 0.4\n 03FEB1993     26.2 0.8     26.3 0.2     26.9 0.3     28.5 0.3\n 10FEB1993     26.6 0.7     26.4 0.2     26.8 0.1     28.3 0.2\n 17FEB1993     26.6 0.4     26.9 0.5     27.0 0.2     28.3 0.2\n 24FEB1993     26.6 0.4     26.7 0.1     27.1 0.2     28.5 0.4\n 03MAR1993     26.9 0.6     26.9 0.1     27.2 0.2     28.4 0.3\n 10MAR1993     27.2 0.7     27.3 0.3     27.4 0.3     28.4 0.3\n 17MAR1993     27.1 0.6     27.5 0.3     27.7 0.4     28.6 0.4\n 24MAR1993     27.2 1.0     28.0 0.7     28.0 0.7     28.8 0.5\n 31MAR1993     27.7 1.7     28.3 1.0     28.2 0.7     28.9 0.6\n 07APR1993     26.6 0.9     28.4 1.0     28.3 0.6     28.7 0.3\n 14APR1993     26.3 0.7     28.5 1.0     28.8 1.1     29.0 0.5\n 21APR1993     26.3 1.0     28.4 1.0     28.7 0.9     29.0 0.5\n 28APR1993     26.0 1.1     28.5 1.2     28.8 1.0     29.0 0.4\n 05MAY1993     25.9 1.2     28.5 1.2     28.8 1.0     28.9 0.3\n 12MAY1993     25.6 1.2     28.3 1.2     28.9 1.0     29.1 0.4\n 19MAY1993     24.9 0.8     28.1 1.1     28.8 1.0     29.2 0.4\n 26MAY1993     24.3 0.6     27.9 1.0     28.9 1.1     29.2 0.4\n 02JUN1993     24.5 1.1     27.7 0.9     28.6 0.9     29.2 0.4\n 09JUN1993     23.9 0.7     27.2 0.6     28.3 0.6     29.1 0.2\n 16JUN1993     23.6 0.8     27.1 0.6     28.2 0.6     29.1 0.2\n 23JUN1993     23.8 1.3     26.9 0.7     28.2 0.7     29.3 0.5\n 30JUN1993     23.0 0.7     26.7 0.6     28.1 0.6     29.3 0.5\n 07JUL1993     22.4 0.4     26.1 0.3     27.9 0.6     29.3 0.5\n 14JUL1993     22.2 0.5     25.8 0.1     27.4 0.2     29.2 0.4\n 21JUL1993     22.0 0.6     25.6 0.1     27.5 0.4     29.2 0.4\n 28JUL1993     21.3 0.0     25.3-0.1     27.2 0.1     29.1 0.4\n 04AUG1993     21.2 0.2     25.0-0.3     26.8-0.2     28.9 0.2\n 11AUG1993     20.8 0.0     25.0-0.1     26.9 0.0     29.0 0.3\n 18AUG1993     21.1 0.5     24.8-0.1     26.8 0.0     28.7 0.1\n 25AUG1993     21.2 0.6     24.9 0.0     26.9 0.1     29.1 0.4\n 01SEP1993     20.9 0.4     24.9 0.0     26.9 0.2     29.1 0.4\n 08SEP1993     20.8 0.3     25.0 0.1     26.8 0.1     29.0 0.4\n 15SEP1993     20.8 0.4     24.9 0.0     26.9 0.2     29.1 0.5\n 22SEP1993     21.0 0.5     25.0 0.2     27.0 0.3     29.1 0.4\n 29SEP1993     20.7 0.2     25.1 0.2     27.0 0.3     29.0 0.3\n 06OCT1993     20.6-0.1     25.2 0.3     26.9 0.2     28.8 0.1\n 13OCT1993     20.8 0.0     25.3 0.4     27.0 0.3     29.0 0.3\n 20OCT1993     21.2 0.3     25.0 0.1     26.6 0.0     28.9 0.2\n 27OCT1993     21.3 0.2     25.3 0.4     27.1 0.4     29.0 0.3\n 03NOV1993     22.0 0.8     25.4 0.4     27.2 0.5     29.0 0.3\n 10NOV1993     21.4 0.0     25.1 0.1     26.9 0.2     28.8 0.2\n 17NOV1993     21.7 0.0     25.1 0.2     26.9 0.2     28.9 0.3\n 24NOV1993     21.4-0.5     25.1 0.0     26.7 0.1     29.0 0.5\n 01DEC1993     21.8-0.4     25.3 0.2     26.9 0.3     29.2 0.6\n 08DEC1993     22.1-0.3     25.3 0.2     26.9 0.4     29.0 0.5\n 15DEC1993     23.1 0.4     25.3 0.2     26.8 0.3     28.9 0.4\n 22DEC1993     23.0-0.2     25.3 0.1     26.6 0.1     28.9 0.4\n 29DEC1993     23.3-0.2     25.4 0.0     26.5-0.1     28.6 0.2\n 05JAN1994     23.8 0.0     25.7 0.2     26.7 0.1     28.7 0.3\n 12JAN1994     23.9-0.3     25.7 0.1     26.7 0.2     28.5 0.2\n 19JAN1994     24.6 0.0     25.7-0.1     26.5-0.1     28.5 0.2\n 26JAN1994     24.8-0.2     25.8-0.1     26.5-0.2     28.2 0.0\n 02FEB1994     25.4 0.0     25.9-0.1     26.6 0.0     28.2 0.0\n 09FEB1994     25.9 0.1     26.2 0.0     26.7 0.0     28.1 0.0\n 16FEB1994     25.6-0.5     26.1-0.3     26.6-0.1     28.0 0.0\n 23FEB1994     26.1-0.1     25.9-0.7     26.4-0.5     27.9-0.2\n 02MAR1994     26.2-0.1     26.6-0.2     26.6-0.3     27.9-0.2\n 09MAR1994     25.5-0.9     27.0 0.1     27.2 0.1     28.2 0.1\n 16MAR1994     25.7-0.9     27.0-0.1     27.4 0.2     28.4 0.2\n 23MAR1994     25.0-1.2     26.8-0.4     27.3-0.1     28.3 0.0\n 30MAR1994     24.8-1.3     27.0-0.3     27.7 0.2     28.3 0.0\n 06APR1994     24.9-0.9     27.0-0.4     27.6 0.0     28.5 0.1\n 13APR1994     24.7-0.9     27.2-0.3     28.0 0.2     28.6 0.2\n 20APR1994     24.2-1.1     27.0-0.4     28.0 0.2     28.6 0.1\n 27APR1994     23.4-1.6     27.1-0.2     28.1 0.3     28.7 0.2\n 04MAY1994     23.4-1.3     27.0-0.3     27.9 0.1     28.8 0.1\n 11MAY1994     23.6-0.8     26.8-0.3     27.8 0.0     28.9 0.2\n 18MAY1994     23.0-1.1     27.2 0.1     28.2 0.4     29.0 0.2\n 25MAY1994     23.0-0.8     26.9 0.0     28.1 0.3     29.1 0.3\n 01JUN1994     22.8-0.7     26.9 0.1     28.3 0.5     29.3 0.5\n 08JUN1994     22.7-0.5     26.7 0.1     28.0 0.3     29.1 0.3\n 15JUN1994     22.7-0.1     26.8 0.4     28.2 0.6     29.1 0.3\n 22JUN1994     22.2-0.4     26.2-0.1     27.9 0.3     29.2 0.4\n 29JUN1994     21.7-0.6     25.9-0.2     27.6 0.1     29.2 0.4\n 06JUL1994     21.9-0.1     25.6-0.3     27.4 0.1     29.3 0.5\n 13JUL1994     21.3-0.4     25.2-0.5     27.3 0.1     29.4 0.6\n 20JUL1994     20.9-0.6     25.1-0.4     27.4 0.2     29.5 0.8\n 27JUL1994     20.8-0.5     24.8-0.6     27.2 0.1     29.4 0.6\n 03AUG1994     20.1-1.0     24.5-0.8     27.3 0.3     29.4 0.7\n 10AUG1994     19.2-1.6     24.8-0.3     27.6 0.7     29.5 0.8\n 17AUG1994     19.6-1.1     24.8-0.2     27.4 0.6     29.5 0.9\n 24AUG1994     20.0-0.5     24.8-0.2     27.3 0.5     29.5 0.8\n 31AUG1994     19.6-0.9     24.7-0.2     27.1 0.3     29.4 0.7\n 07SEP1994     20.1-0.4     24.6-0.3     26.9 0.2     29.3 0.6\n 14SEP1994     20.0-0.3     24.6-0.2     26.9 0.1     29.2 0.5\n 21SEP1994     20.5 0.1     24.9 0.0     27.0 0.2     29.2 0.5\n 28SEP1994     20.2-0.3     25.2 0.3     27.2 0.5     29.2 0.6\n 05OCT1994     21.0 0.3     25.4 0.5     27.3 0.6     29.4 0.8\n 12OCT1994     21.7 0.9     25.6 0.7     27.5 0.8     29.4 0.8\n 19OCT1994     21.8 0.9     25.6 0.6     27.5 0.8     29.4 0.8\n 26OCT1994     21.7 0.7     25.6 0.6     27.6 1.0     29.5 0.9\n 02NOV1994     22.1 0.9     25.7 0.7     27.8 1.1     29.6 1.0\n 09NOV1994     22.1 0.7     26.0 1.0     27.9 1.3     29.5 0.9\n 16NOV1994     22.3 0.7     25.8 0.8     27.8 1.1     29.6 1.0\n 23NOV1994     22.8 0.9     25.9 0.9     27.9 1.2     29.7 1.1\n 30NOV1994     22.9 0.7     26.0 0.9     28.0 1.4     29.8 1.3\n 07DEC1994     23.3 0.9     26.0 0.9     27.9 1.3     29.6 1.1\n 14DEC1994     23.4 0.7     25.9 0.8     27.9 1.3     29.5 1.1\n 21DEC1994     23.7 0.6     26.2 1.0     27.9 1.3     29.3 0.9\n 28DEC1994     24.3 0.9     26.3 0.9     27.8 1.3     29.3 0.9\n 04JAN1995     24.7 0.8     26.1 0.7     27.6 1.1     29.3 0.9\n 11JAN1995     25.1 0.9     26.2 0.7     27.6 1.0     29.2 0.9\n 18JAN1995     25.3 0.8     26.4 0.7     27.6 1.0     29.3 1.0\n 25JAN1995     25.9 0.9     26.5 0.6     27.5 0.8     29.1 0.8\n 01FEB1995     26.2 0.9     26.7 0.7     27.4 0.8     29.0 0.9\n 08FEB1995     26.7 0.9     26.9 0.7     27.4 0.7     29.1 1.0\n 15FEB1995     26.5 0.4     26.8 0.4     27.3 0.5     28.9 0.8\n 22FEB1995     26.4 0.2     26.9 0.3     27.5 0.7     29.0 0.9\n 01MAR1995     26.0-0.2     26.9 0.2     27.7 0.7     29.0 0.9\n 08MAR1995     26.0-0.4     26.7-0.2     27.4 0.4     28.9 0.7\n 15MAR1995     26.6 0.1     27.1 0.0     27.7 0.5     29.0 0.9\n 22MAR1995     26.4 0.1     27.2-0.1     27.7 0.3     29.0 0.8\n 29MAR1995     25.4-0.6     27.4 0.1     27.7 0.2     28.8 0.5\n 05APR1995     24.9-1.0     27.2-0.2     27.9 0.3     28.8 0.5\n 12APR1995     24.9-0.7     27.3-0.2     27.8 0.1     28.8 0.4\n 19APR1995     24.6-0.7     27.3-0.2     28.2 0.4     28.9 0.3\n 26APR1995     23.5-1.5     26.6-0.7     27.9 0.1     28.9 0.3\n 03MAY1995     23.3-1.4     26.6-0.6     28.0 0.2     29.2 0.6\n 10MAY1995     23.0-1.4     26.3-0.8     27.7-0.1     29.1 0.4\n 17MAY1995     23.0-1.2     26.2-0.8     27.7-0.2     29.2 0.4\n 24MAY1995     23.2-0.6     26.4-0.5     27.6-0.2     29.1 0.3\n 31MAY1995     22.8-0.7     26.4-0.3     27.7 0.0     29.0 0.2\n 07JUN1995     22.9-0.3     26.4-0.2     27.7 0.0     29.1 0.3\n 14JUN1995     22.9 0.0     26.4-0.1     27.7 0.1     29.1 0.3\n 21JUN1995     21.9-0.7     26.0-0.3     27.5 0.0     28.9 0.1\n 28JUN1995     21.8-0.5     25.8-0.3     27.3-0.1     28.8 0.0\n 05JUL1995     22.0 0.0     25.7-0.2     27.3-0.1     29.0 0.2\n 12JUL1995     21.2-0.5     25.6-0.1     27.1-0.2     28.8 0.0\n 19JUL1995     21.0-0.5     25.3-0.2     26.9-0.3     28.7-0.1\n 26JUL1995     20.8-0.5     25.1-0.3     26.8-0.3     28.6-0.1\n 02AUG1995     20.3-0.8     24.8-0.5     26.7-0.3     28.5-0.2\n 09AUG1995     19.9-1.0     24.3-0.8     26.3-0.6     28.3-0.4\n 16AUG1995     20.0-0.7     24.3-0.7     26.4-0.4     28.5-0.2\n 23AUG1995     19.9-0.7     24.3-0.7     26.3-0.5     28.4-0.2\n 30AUG1995     20.1-0.5     24.0-0.9     25.9-0.8     28.2-0.5\n 06SEP1995     20.4 0.0     24.1-0.8     26.0-0.8     28.2-0.5\n 13SEP1995     19.9-0.5     24.1-0.8     26.0-0.7     28.0-0.6\n 20SEP1995     20.2-0.2     24.0-0.9     26.1-0.7     28.4-0.3\n 27SEP1995     20.2-0.3     23.9-1.0     25.9-0.8     28.4-0.3\n 04OCT1995     19.6-1.0     23.9-1.0     25.6-1.1     28.1-0.5\n 11OCT1995     20.2-0.5     24.1-0.8     25.6-1.1     28.0-0.6\n 18OCT1995     20.0-0.8     24.1-0.9     25.8-0.9     28.2-0.5\n 25OCT1995     20.3-0.7     24.0-0.9     25.6-1.1     27.9-0.8\n 01NOV1995     21.0-0.2     24.1-0.8     25.6-1.0     28.0-0.7\n 08NOV1995     20.6-0.8     23.9-1.1     25.8-0.9     28.1-0.5\n 15NOV1995     21.3-0.2     24.1-0.9     25.7-1.0     27.8-0.8\n 22NOV1995     21.4-0.4     24.1-0.9     25.5-1.1     27.7-0.9\n 29NOV1995     21.6-0.5     24.1-1.0     25.7-0.9     28.1-0.5\n 06DEC1995     21.5-0.9     24.1-1.0     25.6-1.0     27.9-0.6\n 13DEC1995     21.7-1.0     24.0-1.1     25.4-1.2     27.9-0.5\n 20DEC1995     22.0-1.0     24.1-1.1     25.6-1.0     28.1-0.3\n 27DEC1995     22.8-0.6     24.5-0.8     25.7-0.9     28.1-0.3\n 03JAN1996     23.4-0.4     24.6-0.8     25.6-1.0     28.1-0.3\n 10JAN1996     23.6-0.6     24.9-0.6     25.6-1.0     27.9-0.4\n 17JAN1996     24.0-0.5     25.2-0.5     25.9-0.7     27.8-0.5\n 24JAN1996     23.9-1.0     25.0-0.8     25.9-0.7     27.9-0.4\n 31JAN1996     24.6-0.7     25.2-0.8     25.8-0.9     27.8-0.4\n 07FEB1996     25.4-0.3     25.4-0.8     25.6-1.1     27.5-0.6\n 14FEB1996     25.9-0.1     25.7-0.6     25.8-0.9     27.5-0.5\n 21FEB1996     26.0-0.2     25.9-0.6     25.8-1.0     27.4-0.7\n 28FEB1996     26.1-0.2     26.3-0.5     26.3-0.6     27.5-0.6\n 06MAR1996     26.6 0.2     26.5-0.4     26.2-0.8     27.5-0.6\n 13MAR1996     26.1-0.3     26.9-0.2     26.6-0.6     27.7-0.5\n 20MAR1996     26.3-0.1     27.0-0.2     26.8-0.5     27.7-0.5\n 27MAR1996     25.7-0.4     26.7-0.6     26.8-0.6     27.8-0.4\n 03APR1996     24.4-1.5     26.5-0.9     27.0-0.6     27.9-0.5\n 10APR1996     23.9-1.7     27.0-0.4     27.4-0.3     27.9-0.5\n 17APR1996     23.8-1.6     26.8-0.7     27.3-0.4     28.0-0.5\n 24APR1996     23.6-1.5     26.7-0.7     27.6-0.1     28.2-0.3\n 01MAY1996     23.0-1.9     26.4-0.9     27.4-0.4     28.2-0.4\n 08MAY1996     23.0-1.6     26.5-0.7     27.6-0.2     28.4-0.3\n 15MAY1996     23.0-1.3     26.3-0.8     27.3-0.5     28.3-0.4\n 22MAY1996     23.0-0.9     26.2-0.7     27.2-0.6     28.5-0.3\n 29MAY1996     22.6-1.1     26.2-0.6     27.3-0.4     28.6-0.2\n 05JUN1996     22.3-1.0     26.0-0.6     27.3-0.4     28.6-0.3\n 12JUN1996     21.9-1.0     26.0-0.5     27.3-0.4     28.5-0.4\n 19JUN1996     21.4-1.3     25.8-0.6     27.3-0.3     28.4-0.4\n 26JUN1996     20.6-1.8     25.7-0.5     27.3-0.2     28.6-0.2\n 03JUL1996     20.4-1.7     25.9 0.0     27.6 0.2     28.6-0.2\n 10JUL1996     20.1-1.8     25.4-0.3     27.1-0.2     28.5-0.3\n 17JUL1996     20.0-1.6     25.4-0.2     27.1-0.1     28.3-0.5\n 24JUL1996     20.2-1.2     25.1-0.4     26.9-0.2     28.5-0.3\n 31JUL1996     19.2-1.9     24.7-0.6     26.6-0.4     28.4-0.3\n 07AUG1996     19.2-1.7     24.8-0.4     26.7-0.3     28.5-0.2\n 14AUG1996     20.0-0.8     24.6-0.5     26.5-0.4     28.6 0.0\n 21AUG1996     20.1-0.5     24.6-0.3     26.5-0.3     28.6-0.1\n 28AUG1996     18.9-1.6     24.4-0.6     26.5-0.2     28.4-0.3\n 04SEP1996     19.1-1.3     24.3-0.6     26.4-0.4     28.5-0.2\n 11SEP1996     19.4-1.0     24.4-0.5     26.2-0.5     28.3-0.4\n 18SEP1996     19.1-1.3     24.3-0.5     26.4-0.3     28.5-0.2\n 25SEP1996     19.3-1.2     24.4-0.4     26.3-0.4     28.4-0.3\n 02OCT1996     19.5-1.2     24.5-0.4     26.2-0.5     28.3-0.4\n 09OCT1996     19.5-1.3     24.3-0.6     26.2-0.5     28.5-0.2\n 16OCT1996     20.2-0.6     24.4-0.5     26.3-0.3     28.5-0.1\n 23OCT1996     20.5-0.5     24.4-0.6     26.2-0.5     28.3-0.3\n 30OCT1996     20.0-1.1     24.3-0.7     26.1-0.5     28.3-0.3\n 06NOV1996     20.2-1.2     24.4-0.6     26.1-0.5     28.1-0.5\n 13NOV1996     20.1-1.4     24.4-0.6     26.2-0.5     28.3-0.3\n 20NOV1996     20.3-1.5     24.4-0.6     26.3-0.3     28.4-0.1\n 27NOV1996     20.4-1.6     24.3-0.7     26.2-0.4     28.3-0.2\n 04DEC1996     20.8-1.5     24.4-0.7     26.3-0.3     28.5 0.0\n 11DEC1996     21.6-1.0     24.1-1.0     26.1-0.5     28.6 0.1\n 18DEC1996     21.6-1.3     24.2-1.0     25.9-0.6     28.3-0.1\n 25DEC1996     22.1-1.1     24.1-1.1     25.9-0.7     28.3-0.1\n 01JAN1997     22.5-1.2     24.3-1.1     25.8-0.8     28.2-0.2\n 08JAN1997     23.0-1.0     24.5-1.0     25.9-0.6     28.4 0.1\n 15JAN1997     23.6-0.8     24.6-1.0     25.8-0.7     28.4 0.1\n 22JAN1997     24.3-0.5     24.8-1.0     25.9-0.7     28.4 0.2\n 29JAN1997     24.6-0.6     25.1-0.8     26.3-0.4     28.4 0.2\n 05FEB1997     25.3-0.2     25.2-0.9     26.2-0.5     28.4 0.2\n 12FEB1997     25.4-0.6     25.8-0.5     26.4-0.3     28.3 0.2\n 19FEB1997     26.3 0.1     25.9-0.6     26.4-0.4     28.2 0.1\n 26FEB1997     26.2-0.1     26.2-0.4     26.5-0.4     28.2 0.1\n 05MAR1997     26.8 0.5     26.6-0.3     26.6-0.4     28.1 0.0\n 12MAR1997     26.9 0.5     26.8-0.3     26.8-0.4     28.3 0.1\n 19MAR1997     27.0 0.6     27.3 0.1     27.4 0.1     28.5 0.3\n 26MAR1997     27.2 1.0     27.4 0.1     27.3-0.1     28.9 0.7\n 02APR1997     27.0 1.1     27.3-0.1     27.5 0.0     29.2 0.8\n 09APR1997     26.4 0.7     27.3-0.1     27.8 0.2     29.2 0.8\n 16APR1997     26.5 1.1     27.6 0.1     28.0 0.3     29.3 0.8\n 23APR1997     26.6 1.4     27.8 0.4     28.4 0.6     29.5 0.9\n 30APR1997     26.8 1.9     28.0 0.7     28.4 0.6     29.5 0.8\n 07MAY1997     26.8 2.2     28.2 1.0     28.6 0.8     29.4 0.8\n 14MAY1997     26.7 2.4     28.0 0.9     28.5 0.6     29.3 0.6\n 21MAY1997     26.6 2.6     27.9 1.0     28.6 0.8     29.5 0.7\n 28MAY1997     26.8 3.1     28.1 1.3     28.8 1.0     29.5 0.7\n 04JUN1997     26.4 3.1     28.0 1.3     28.8 1.1     29.4 0.6\n 11JUN1997     26.5 3.5     28.1 1.6     28.9 1.2     29.3 0.5\n 18JUN1997     26.0 3.3     28.2 1.8     29.0 1.4     29.4 0.6\n 25JUN1997     26.2 3.7     28.2 2.0     29.1 1.6     29.5 0.7\n 02JUL1997     25.9 3.7     28.1 2.1     29.0 1.5     29.4 0.6\n 09JUL1997     25.7 3.8     28.0 2.2     28.9 1.6     29.5 0.7\n 16JUL1997     25.7 4.1     28.1 2.5     29.0 1.8     29.5 0.7\n 23JUL1997     25.5 4.1     27.9 2.4     28.8 1.7     29.5 0.8\n 30JUL1997     25.2 4.0     27.9 2.6     28.9 1.9     29.5 0.8\n 06AUG1997     25.3 4.3     27.8 2.6     28.8 1.8     29.4 0.7\n 13AUG1997     25.4 4.6     27.9 2.9     28.9 2.0     29.3 0.6\n 20AUG1997     24.2 3.6     27.9 2.9     28.9 2.1     29.2 0.5\n 27AUG1997     24.3 3.7     27.7 2.7     28.8 2.0     29.2 0.5\n 03SEP1997     24.6 4.2     27.8 2.9     28.9 2.1     29.2 0.6\n 10SEP1997     24.6 4.2     27.8 2.9     28.9 2.2     29.3 0.6\n 17SEP1997     24.2 3.8     27.8 2.9     28.9 2.2     29.3 0.6\n 24SEP1997     24.4 3.9     27.9 3.0     28.9 2.2     29.5 0.8\n 01OCT1997     24.1 3.5     28.0 3.1     29.1 2.4     29.4 0.7\n 08OCT1997     24.5 3.8     28.1 3.2     29.2 2.6     29.3 0.6\n 15OCT1997     24.5 3.7     28.1 3.2     29.2 2.5     29.3 0.7\n 22OCT1997     24.9 3.9     28.2 3.3     29.3 2.6     29.5 0.8\n 29OCT1997     24.7 3.6     28.3 3.4     29.2 2.6     29.2 0.6\n 05NOV1997     25.0 3.7     28.4 3.4     29.2 2.6     29.2 0.6\n 12NOV1997     25.8 4.3     28.5 3.6     29.3 2.7     29.5 0.8\n 19NOV1997     25.8 4.1     28.6 3.6     29.3 2.7     29.7 1.1\n 26NOV1997     25.9 3.9     28.7 3.7     29.4 2.8     29.7 1.1\n 03DEC1997     26.2 3.9     28.6 3.6     29.2 2.6     29.4 0.9\n 10DEC1997     26.7 4.2     28.7 3.6     29.2 2.7     29.4 0.9\n 17DEC1997     27.0 4.1     28.8 3.6     29.3 2.7     29.3 0.8\n 24DEC1997     27.2 4.0     28.8 3.5     29.3 2.7     29.3 0.9\n 31DEC1997     27.7 4.1     28.9 3.5     29.2 2.7     29.2 0.8\n 07JAN1998     28.0 4.0     28.9 3.4     29.2 2.6     29.1 0.8\n 14JAN1998     28.4 4.0     28.9 3.3     29.1 2.5     29.0 0.7\n 21JAN1998     28.4 3.7     28.9 3.2     29.0 2.4     28.9 0.7\n 28JAN1998     28.3 3.2     29.1 3.1     29.1 2.4     28.9 0.7\n 04FEB1998     28.9 3.4     29.1 3.0     29.2 2.5     29.0 0.9\n 11FEB1998     28.9 3.0     29.0 2.7     29.0 2.3     29.0 0.9\n 18FEB1998     29.1 3.0     28.8 2.3     28.7 1.9     28.8 0.7\n 25FEB1998     29.1 2.9     28.9 2.2     28.6 1.7     28.8 0.7\n 04MAR1998     29.2 2.8     29.0 2.2     28.5 1.5     28.6 0.4\n 11MAR1998     29.2 2.8     29.1 2.1     28.7 1.6     28.8 0.7\n 18MAR1998     29.2 2.7     29.1 2.0     28.6 1.4     28.6 0.4\n 25MAR1998     29.1 2.8     29.2 2.0     28.8 1.5     28.6 0.4\n 01APR1998     29.1 3.1     29.3 1.9     28.7 1.2     28.6 0.2\n 08APR1998     28.8 3.0     29.2 1.8     28.6 1.0     28.5 0.0\n 15APR1998     28.6 3.1     29.1 1.6     28.4 0.6     28.5 0.0\n 22APR1998     28.4 3.2     29.0 1.6     28.5 0.7     28.5-0.1\n 29APR1998     28.3 3.4     28.9 1.6     28.7 0.8     28.7 0.1\n 06MAY1998     27.8 3.2     29.4 2.1     29.1 1.3     28.7 0.1\n 13MAY1998     28.1 3.8     28.7 1.6     28.8 0.9     28.7-0.1\n 20MAY1998     27.9 3.9     27.6 0.7     28.3 0.5     28.6-0.2\n 27MAY1998     27.0 3.3     27.1 0.2     27.9 0.1     28.8 0.0\n 03JUN1998     26.2 2.8     26.1-0.6     27.1-0.6     28.7-0.1\n 10JUN1998     26.1 3.0     26.2-0.3     26.9-0.8     28.6-0.2\n 17JUN1998     24.6 1.8     25.8-0.6     26.7-1.0     28.7-0.1\n 24JUN1998     24.5 2.0     26.0-0.2     26.4-1.1     28.5-0.3\n 01JUL1998     24.1 1.9     25.7-0.3     26.4-1.1     28.3-0.5\n 08JUL1998     23.6 1.7     25.6-0.2     26.2-1.2     28.2-0.6\n 15JUL1998     23.6 2.0     25.3-0.4     25.9-1.4     28.1-0.7\n 22JUL1998     23.0 1.5     24.9-0.6     25.7-1.4     28.0-0.8\n 29JUL1998     23.2 2.0     24.9-0.5     25.7-1.4     27.8-1.0\n 05AUG1998     22.6 1.7     24.8-0.4     25.6-1.4     27.9-0.8\n 12AUG1998     21.8 1.1     24.6-0.5     25.5-1.4     27.8-0.9\n 19AUG1998     21.3 0.7     24.4-0.6     25.2-1.6     27.6-1.0\n 26AUG1998     21.2 0.7     24.7-0.3     25.6-1.2     27.6-1.0\n 02SEP1998     21.1 0.6     24.5-0.4     25.6-1.2     27.8-0.8\n 09SEP1998     20.9 0.5     24.3-0.6     25.9-0.8     28.3-0.4\n 16SEP1998     21.0 0.7     24.2-0.7     25.7-1.0     28.0-0.7\n 23SEP1998     20.5 0.1     24.1-0.7     25.5-1.2     27.6-1.1\n 30SEP1998     20.9 0.3     23.7-1.2     25.1-1.6     27.2-1.4\n 07OCT1998     20.9 0.2     23.9-1.0     25.3-1.4     27.5-1.2\n 14OCT1998     21.2 0.4     24.1-0.8     25.4-1.3     27.3-1.4\n 21OCT1998     21.1 0.1     24.1-0.8     25.3-1.4     27.2-1.5\n 28OCT1998     21.6 0.5     24.2-0.7     25.5-1.2     27.3-1.3\n 04NOV1998     21.4 0.1     24.4-0.6     25.2-1.5     27.2-1.4\n 11NOV1998     21.0-0.4     24.0-0.9     25.2-1.5     27.2-1.4\n 18NOV1998     21.7 0.0     24.1-0.9     25.2-1.4     27.1-1.5\n 25NOV1998     21.5-0.5     24.0-1.0     25.1-1.5     27.2-1.4\n 02DEC1998     21.7-0.5     23.9-1.2     25.1-1.5     27.3-1.2\n 09DEC1998     22.0-0.5     23.8-1.3     24.8-1.8     27.2-1.2\n 16DEC1998     22.5-0.3     23.9-1.3     24.7-1.8     27.1-1.4\n 23DEC1998     23.3 0.2     23.8-1.4     24.6-1.9     27.0-1.4\n 30DEC1998     23.2-0.4     23.9-1.5     24.7-1.9     26.7-1.7\n 06JAN1999     23.4-0.5     24.1-1.4     24.7-1.9     26.7-1.7\n 13JAN1999     23.7-0.6     24.2-1.4     25.0-1.6     26.8-1.5\n 20JAN1999     23.3-1.4     24.5-1.3     25.0-1.6     26.4-1.8\n 27JAN1999     24.5-0.6     24.9-1.0     25.0-1.6     26.2-2.0\n 03FEB1999     24.8-0.6     25.1-1.0     25.2-1.5     26.6-1.6\n 10FEB1999     25.1-0.7     25.0-1.2     25.2-1.5     26.5-1.6\n 17FEB1999     25.5-0.6     25.5-0.9     25.5-1.3     26.3-1.7\n 24FEB1999     26.8 0.6     26.4-0.2     25.7-1.2     26.4-1.7\n 03MAR1999     27.4 1.1     26.7-0.1     26.1-0.9     26.8-1.3\n 10MAR1999     27.0 0.6     26.6-0.4     26.1-1.0     26.7-1.5\n 17MAR1999     26.4 0.0     26.7-0.4     26.2-1.0     26.9-1.2\n 24MAR1999     26.3 0.0     26.7-0.6     26.5-0.9     27.0-1.2\n 31MAR1999     25.8-0.3     26.6-0.7     26.5-1.0     27.0-1.3\n 07APR1999     24.4-1.3     26.7-0.7     26.7-0.9     27.1-1.3\n 14APR1999     24.6-0.9     26.5-0.9     26.8-0.9     27.3-1.1\n 21APR1999     23.8-1.4     26.7-0.7     27.0-0.8     27.4-1.1\n 28APR1999     23.7-1.3     26.8-0.6     27.0-0.8     27.5-1.1\n 05MAY1999     23.6-1.1     26.6-0.6     27.0-0.8     27.8-0.9\n 12MAY1999     23.7-0.7     26.7-0.4     27.1-0.7     27.9-0.8\n 19MAY1999     23.7-0.4     26.5-0.5     26.9-0.9     27.8-0.9\n 26MAY1999     23.2-0.6     26.1-0.8     26.9-0.9     27.9-0.9\n 02JUN1999     22.5-0.9     25.8-0.9     26.7-1.1     28.0-0.8\n 09JUN1999     22.4-0.8     25.8-0.7     26.6-1.1     27.9-0.9\n 16JUN1999     21.6-1.2     25.6-0.9     26.6-1.1     28.0-0.9\n 23JUN1999     21.3-1.2     25.4-0.8     26.5-1.0     28.0-0.8\n 30JUN1999     21.3-1.0     25.3-0.8     26.6-0.8     28.1-0.7\n 07JUL1999     20.4-1.5     25.2-0.7     26.6-0.7     28.1-0.7\n 14JUL1999     20.4-1.3     24.9-0.7     26.4-0.8     27.8-1.0\n 21JUL1999     20.3-1.1     24.8-0.7     26.2-0.9     27.8-1.0\n 28JUL1999     20.2-1.0     24.4-1.0     26.0-1.0     27.8-0.9\n 04AUG1999     20.2-0.8     24.3-0.9     26.0-1.0     27.8-0.9\n 11AUG1999     19.7-1.1     24.1-1.0     25.6-1.3     27.7-1.0\n 18AUG1999     19.5-1.1     23.9-1.1     25.4-1.4     27.8-0.9\n 25AUG1999     19.7-0.9     24.0-1.0     25.5-1.3     27.6-1.1\n 01SEP1999     19.5-1.0     23.6-1.3     25.4-1.4     27.6-1.0\n 08SEP1999     19.2-1.2     23.7-1.2     25.7-1.1     27.7-0.9\n 15SEP1999     18.9-1.5     23.6-1.3     25.7-1.0     27.7-0.9\n 22SEP1999     19.3-1.2     23.8-1.1     25.8-0.9     27.9-0.7\n 29SEP1999     19.5-1.1     24.0-0.8     25.9-0.8     27.8-0.8\n 06OCT1999     19.7-0.9     23.6-1.3     25.7-1.0     27.9-0.8\n 13OCT1999     20.1-0.7     23.7-1.2     25.8-0.9     28.0-0.6\n 20OCT1999     20.0-1.0     23.7-1.2     25.6-1.0     27.8-0.9\n 27OCT1999     20.6-0.5     23.8-1.1     25.4-1.3     27.7-1.0\n 03NOV1999     20.1-1.2     23.6-1.3     25.4-1.3     27.6-1.0\n 10NOV1999     20.1-1.3     23.7-1.2     25.4-1.3     27.5-1.1\n 17NOV1999     20.6-1.0     23.5-1.5     25.2-1.5     27.6-1.0\n 24NOV1999     20.9-1.1     23.1-1.9     24.7-1.9     27.4-1.1\n 01DEC1999     21.0-1.2     23.1-1.9     24.9-1.7     27.3-1.2\n 08DEC1999     21.1-1.4     23.6-1.5     25.1-1.4     27.3-1.2\n 15DEC1999     21.3-1.4     23.4-1.7     24.9-1.7     27.1-1.4\n 22DEC1999     22.0-1.1     23.8-1.4     24.9-1.6     27.1-1.3\n 29DEC1999     23.0-0.5     23.6-1.8     24.6-1.9     27.2-1.2\n 05JAN2000     23.2-0.6     23.4-2.1     24.5-2.0     27.0-1.3\n 12JAN2000     23.8-0.4     23.9-1.7     24.7-1.9     26.9-1.4\n 19JAN2000     23.7-0.9     24.0-1.7     24.8-1.8     26.9-1.4\n 26JAN2000     24.0-1.0     24.0-1.8     24.6-2.0     26.9-1.3\n 02FEB2000     25.0-0.4     24.7-1.3     24.8-1.9     26.7-1.5\n 09FEB2000     25.1-0.7     25.3-0.9     25.1-1.6     26.6-1.5\n 16FEB2000     25.6-0.5     25.5-0.9     25.4-1.4     26.7-1.4\n 23FEB2000     26.2 0.0     25.4-1.2     25.2-1.6     26.6-1.5\n 01MAR2000     26.4 0.1     25.7-1.0     25.5-1.5     26.5-1.6\n 08MAR2000     26.6 0.2     26.2-0.8     25.7-1.4     26.6-1.5\n 15MAR2000     26.2-0.3     26.5-0.6     26.0-1.2     26.7-1.5\n 22MAR2000     25.3-1.0     26.9-0.3     26.3-1.1     26.7-1.5\n 29MAR2000     25.6-0.5     27.5 0.2     26.8-0.7     27.0-1.3\n 05APR2000     25.7-0.1     27.6 0.2     27.0-0.6     27.2-1.2\n 12APR2000     26.1 0.5     27.4-0.1     26.9-0.8     27.3-1.2\n 19APR2000     25.6 0.3     27.5 0.0     27.0-0.8     27.4-1.1\n 26APR2000     25.3 0.3     27.5 0.1     27.1-0.7     27.5-1.0\n 03MAY2000     24.9 0.2     27.3 0.0     27.1-0.7     27.5-1.1\n 10MAY2000     24.3-0.1     27.2 0.0     27.1-0.7     27.7-1.0\n 17MAY2000     23.9-0.3     26.6-0.4     27.1-0.8     27.8-1.0\n 24MAY2000     23.2-0.6     26.4-0.5     27.1-0.7     28.0-0.8\n 31MAY2000     23.2-0.3     26.3-0.4     27.2-0.5     28.1-0.7\n 07JUN2000     22.6-0.6     26.0-0.7     27.0-0.7     28.0-0.8\n 14JUN2000     22.4-0.5     25.9-0.6     27.1-0.6     28.1-0.7\n 21JUN2000     21.7-0.9     25.8-0.5     27.0-0.6     28.2-0.7\n 28JUN2000     21.4-0.9     25.5-0.6     26.9-0.6     28.0-0.8\n 05JUL2000     21.0-1.0     25.6-0.3     26.9-0.5     28.0-0.8\n 12JUL2000     20.6-1.2     25.2-0.5     26.8-0.5     28.1-0.7\n 19JUL2000     20.3-1.2     24.9-0.6     26.7-0.5     28.2-0.5\n 26JUL2000     20.2-1.1     24.9-0.5     26.5-0.6     28.3-0.4\n 02AUG2000     20.2-0.8     24.7-0.5     26.6-0.4     28.4-0.3\n 09AUG2000     20.1-0.8     24.5-0.6     26.6-0.3     28.4-0.3\n 16AUG2000     20.5-0.2     24.4-0.6     26.4-0.4     28.3-0.3\n 23AUG2000     20.1-0.5     24.3-0.7     26.3-0.5     28.1-0.5\n 30AUG2000     19.3-1.2     24.5-0.4     26.4-0.4     28.2-0.4\n 06SEP2000     20.2-0.3     24.4-0.4     26.3-0.5     28.4-0.2\n 13SEP2000     19.7-0.7     24.3-0.6     26.1-0.6     28.4-0.2\n 20SEP2000     20.1-0.3     24.2-0.6     26.1-0.6     28.5-0.2\n 27SEP2000     19.9-0.6     24.4-0.5     26.3-0.4     28.4-0.3\n 04OCT2000     20.2-0.5     24.7-0.2     26.1-0.6     28.1-0.5\n 11OCT2000     20.2-0.5     24.4-0.5     26.0-0.6     28.2-0.4\n 18OCT2000     20.5-0.3     24.3-0.6     25.9-0.8     28.1-0.5\n 25OCT2000     20.7-0.4     24.3-0.6     25.9-0.8     28.1-0.6\n 01NOV2000     20.6-0.6     24.2-0.8     25.6-1.1     28.0-0.6\n 08NOV2000     20.6-0.8     24.0-1.0     25.6-1.1     28.1-0.6\n 15NOV2000     20.3-1.3     24.2-0.7     25.9-0.7     28.2-0.4\n 22NOV2000     20.2-1.7     24.1-0.9     25.9-0.7     28.1-0.5\n 29NOV2000     21.4-0.7     24.4-0.6     25.9-0.7     27.8-0.7\n 06DEC2000     21.8-0.6     24.4-0.7     25.6-1.0     27.5-1.1\n 13DEC2000     22.4-0.2     24.5-0.6     25.6-1.0     27.6-0.9\n 20DEC2000     22.4-0.6     24.4-0.8     25.6-1.0     27.6-0.8\n 27DEC2000     22.2-1.2     24.4-1.0     25.5-1.0     27.5-0.9\n 03JAN2001     22.8-0.9     24.5-0.9     25.6-1.0     27.5-0.8\n 10JAN2001     23.3-0.8     24.7-0.8     25.6-1.0     27.5-0.9\n 17JAN2001     23.7-0.8     25.1-0.6     25.8-0.8     27.5-0.8\n 24JAN2001     24.6-0.3     25.3-0.5     25.9-0.8     27.4-0.8\n 31JAN2001     25.2 0.0     25.4-0.6     26.0-0.7     27.3-0.9\n 07FEB2001     25.6-0.1     25.8-0.4     25.9-0.8     27.1-1.0\n 14FEB2001     25.6-0.4     25.9-0.5     26.0-0.7     27.2-0.9\n 21FEB2001     26.0-0.2     26.4-0.1     26.3-0.6     27.3-0.8\n 28FEB2001     26.7 0.4     26.7 0.0     26.4-0.5     27.4-0.8\n 07MAR2001     27.2 0.8     27.1 0.2     26.6-0.5     27.4-0.7\n 14MAR2001     27.3 0.8     27.2 0.1     26.8-0.4     27.6-0.6\n 21MAR2001     27.6 1.3     27.4 0.2     27.1-0.2     27.7-0.6\n 28MAR2001     27.7 1.6     27.4 0.2     27.0-0.4     27.8-0.5\n 04APR2001     27.3 1.5     27.6 0.2     27.3-0.3     27.9-0.4\n 11APR2001     27.2 1.6     27.7 0.3     27.6-0.1     28.1-0.3\n 18APR2001     26.2 0.8     27.7 0.2     27.7-0.1     28.3-0.2\n 25APR2001     25.9 0.8     27.2-0.1     27.6-0.2     28.2-0.3\n 02MAY2001     24.2-0.6     27.1-0.2     27.5-0.3     28.3-0.3\n 09MAY2001     23.9-0.6     27.0-0.1     27.6-0.2     28.6-0.1\n 16MAY2001     23.6-0.6     26.7-0.4     27.5-0.3     28.6-0.1\n 23MAY2001     23.3-0.6     26.9-0.1     27.7-0.1     28.8 0.0\n 30MAY2001     23.1-0.5     26.7 0.0     27.7-0.1     28.8 0.0\n 06JUN2001     22.1-1.2     26.7 0.1     27.8 0.1     28.8 0.0\n 13JUN2001     21.7-1.3     26.3-0.1     27.7 0.0     28.8 0.0\n 20JUN2001     21.5-1.2     26.3 0.0     27.7 0.1     28.8-0.1\n 27JUN2001     20.7-1.6     25.9-0.2     27.6 0.1     28.9 0.1\n 04JUL2001     20.7-1.4     25.6-0.3     27.5 0.1     29.0 0.2\n 11JUL2001     21.2-0.6     25.5-0.2     27.4 0.1     29.0 0.2\n 18JUL2001     20.9-0.7     25.5-0.1     27.3 0.1     29.1 0.3\n 25JUL2001     20.7-0.6     25.2-0.2     27.2 0.1     29.1 0.3\n 01AUG2001     20.3-0.8     25.0-0.3     27.2 0.1     29.1 0.4\n 08AUG2001     20.1-0.8     25.0-0.1     27.0 0.1     28.9 0.2\n 15AUG2001     19.8-0.9     24.7-0.3     26.8 0.0     28.9 0.2\n 22AUG2001     19.8-0.8     24.6-0.3     26.8 0.0     28.9 0.2\n 29AUG2001     19.7-0.9     24.3-0.6     26.6-0.2     29.0 0.4\n 05SEP2001     19.6-0.8     24.4-0.5     26.6-0.1     29.2 0.5\n 12SEP2001     19.1-1.3     24.2-0.7     26.6-0.2     29.1 0.4\n 19SEP2001     19.4-1.0     24.2-0.6     26.5-0.2     29.2 0.5\n 26SEP2001     19.6-0.9     24.3-0.6     26.5-0.2     29.1 0.4\n 03OCT2001     19.2-1.4     24.4-0.5     26.5-0.2     28.9 0.3\n 10OCT2001     19.6-1.1     24.4-0.5     26.5-0.2     29.0 0.4\n 17OCT2001     19.4-1.4     24.5-0.4     26.6 0.0     29.0 0.3\n 24OCT2001     19.6-1.4     24.5-0.4     26.6 0.0     29.1 0.4\n 31OCT2001     19.9-1.3     24.5-0.5     26.6 0.0     28.9 0.3\n 07NOV2001     20.3-1.1     24.3-0.7     26.6-0.1     29.1 0.5\n 14NOV2001     20.1-1.5     24.3-0.7     26.5-0.1     29.0 0.4\n 21NOV2001     20.6-1.2     24.3-0.7     26.3-0.3     28.8 0.2\n 28NOV2001     21.4-0.7     24.4-0.6     26.3-0.3     28.7 0.2\n 05DEC2001     21.4-1.0     24.5-0.6     26.1-0.5     28.6 0.1\n 12DEC2001     21.6-1.1     24.5-0.7     26.1-0.4     28.6 0.1\n 19DEC2001     22.0-0.9     24.6-0.5     26.2-0.4     28.5 0.0\n 26DEC2001     22.5-0.8     24.8-0.5     26.2-0.3     28.6 0.2\n 02JAN2002     23.2-0.5     24.8-0.7     26.2-0.4     28.6 0.2\n 09JAN2002     23.3-0.8     25.0-0.5     26.5-0.1     28.8 0.5\n 16JAN2002     23.5-1.0     25.0-0.7     26.4-0.1     28.9 0.6\n 23JAN2002     23.8-1.1     25.3-0.5     26.6 0.0     28.9 0.6\n 30JAN2002     24.3-0.9     25.5-0.5     26.7 0.1     28.7 0.6\n 06FEB2002     25.4-0.2     26.0-0.2     26.9 0.3     28.8 0.7\n 13FEB2002     25.9-0.1     26.2-0.2     27.0 0.3     28.9 0.8\n 20FEB2002     26.3 0.1     26.4-0.1     26.8 0.0     28.6 0.5\n 27FEB2002     27.4 1.1     26.7 0.0     27.1 0.1     28.6 0.5\n 06MAR2002     27.1 0.8     27.1 0.2     27.2 0.1     28.5 0.4\n 13MAR2002     27.6 1.2     27.2 0.1     27.3 0.1     28.6 0.4\n 20MAR2002     27.8 1.4     27.3 0.1     27.4 0.1     28.8 0.6\n 27MAR2002     27.4 1.3     27.4 0.2     27.4 0.0     28.7 0.5\n 03APR2002     27.1 1.2     27.6 0.2     27.7 0.2     28.8 0.5\n 10APR2002     27.1 1.5     27.8 0.4     28.0 0.3     29.0 0.6\n 17APR2002     26.3 0.9     27.6 0.1     27.9 0.2     29.1 0.6\n 24APR2002     25.4 0.3     27.3 0.0     28.0 0.2     29.3 0.7\n 01MAY2002     25.4 0.6     27.4 0.1     28.0 0.2     29.2 0.6\n 08MAY2002     25.0 0.5     27.3 0.1     28.0 0.2     29.2 0.5\n 15MAY2002     24.5 0.2     27.2 0.1     28.0 0.1     29.4 0.6\n 22MAY2002     24.4 0.5     27.1 0.2     28.3 0.4     29.6 0.8\n 29MAY2002     24.5 0.9     27.4 0.5     28.4 0.7     29.7 0.9\n 05JUN2002     23.5 0.2     27.3 0.6     28.6 0.9     29.8 1.0\n 12JUN2002     22.7-0.3     27.1 0.6     28.6 0.9     29.7 0.9\n 19JUN2002     22.1-0.6     27.0 0.6     28.4 0.8     29.6 0.8\n 26JUN2002     22.0-0.4     26.9 0.8     28.2 0.7     29.4 0.6\n 03JUL2002     21.8-0.3     26.6 0.6     28.0 0.6     29.4 0.6\n 10JUL2002     21.1-0.8     26.3 0.5     28.0 0.7     29.4 0.6\n 17JUL2002     21.2-0.4     26.0 0.4     28.0 0.8     29.5 0.7\n 24JUL2002     20.5-0.8     25.7 0.2     27.9 0.8     29.5 0.8\n 31JUL2002     20.3-0.8     25.5 0.2     27.9 0.9     29.6 0.9\n 07AUG2002     20.0-0.9     25.3 0.1     27.8 0.9     29.4 0.7\n 14AUG2002     20.3-0.4     25.5 0.5     27.8 0.9     29.4 0.7\n 21AUG2002     19.8-0.8     25.5 0.5     27.8 1.0     29.3 0.7\n 28AUG2002     19.8-0.7     25.6 0.7     27.8 1.0     29.4 0.7\n 04SEP2002     19.3-1.2     25.4 0.5     27.7 0.9     29.3 0.7\n 11SEP2002     20.2-0.2     25.5 0.6     27.8 1.0     29.4 0.7\n 18SEP2002     20.1-0.3     25.5 0.7     27.9 1.2     29.5 0.9\n 25SEP2002     20.1-0.4     25.7 0.8     27.9 1.2     29.5 0.8\n 02OCT2002     20.1-0.5     25.7 0.8     28.0 1.3     29.5 0.8\n 09OCT2002     20.7 0.0     25.6 0.7     27.9 1.2     29.4 0.7\n 16OCT2002     21.7 0.9     25.7 0.8     27.9 1.2     29.4 0.7\n 23OCT2002     21.6 0.6     26.0 1.1     28.2 1.6     29.8 1.2\n 30OCT2002     21.9 0.7     26.3 1.4     28.3 1.7     29.9 1.2\n 06NOV2002     22.0 0.6     26.2 1.3     28.2 1.6     29.8 1.2\n 13NOV2002     21.9 0.4     26.3 1.4     28.3 1.7     29.9 1.3\n 20NOV2002     22.5 0.7     26.5 1.5     28.3 1.7     29.9 1.3\n 27NOV2002     22.6 0.6     26.4 1.4     28.2 1.6     29.7 1.2\n 04DEC2002     23.0 0.7     26.6 1.6     28.2 1.6     29.6 1.0\n 11DEC2002     23.5 0.9     26.5 1.4     28.1 1.5     29.4 1.0\n 18DEC2002     23.3 0.4     26.5 1.3     28.1 1.5     29.4 1.0\n 25DEC2002     23.5 0.2     26.3 1.0     28.0 1.4     29.5 1.1\n 01JAN2003     24.2 0.6     26.6 1.2     28.1 1.5     29.4 1.1\n 08JAN2003     23.9-0.1     26.3 0.8     27.9 1.3     29.2 0.9\n 15JAN2003     24.1-0.3     26.3 0.7     27.7 1.2     29.3 1.0\n 22JAN2003     24.4-0.4     26.5 0.7     27.7 1.1     29.3 1.0\n 29JAN2003     24.9-0.3     26.3 0.3     27.5 0.8     29.1 0.9\n 05FEB2003     25.3-0.3     26.4 0.3     27.3 0.6     28.9 0.7\n 12FEB2003     25.7-0.3     26.6 0.3     27.4 0.7     28.9 0.9\n 19FEB2003     26.2 0.0     27.0 0.6     27.7 0.9     29.1 1.0\n 26FEB2003     26.0-0.3     26.8 0.1     27.6 0.7     29.2 1.1\n 05MAR2003     25.7-0.7     27.0 0.2     27.6 0.6     29.0 0.9\n 12MAR2003     25.7-0.8     27.2 0.1     27.7 0.6     29.0 0.8\n 19MAR2003     26.5 0.1     27.6 0.4     28.0 0.8     29.1 0.9\n 26MAR2003     25.5-0.7     27.4 0.2     27.9 0.5     29.0 0.7\n 02APR2003     25.7-0.3     27.2-0.1     27.8 0.3     28.9 0.6\n 09APR2003     24.8-0.9     27.3-0.1     27.8 0.2     29.0 0.6\n 16APR2003     24.3-1.1     27.3-0.2     27.9 0.1     28.9 0.5\n 23APR2003     23.6-1.6     27.2-0.2     27.8 0.0     28.9 0.4\n 30APR2003     23.2-1.6     26.5-0.8     27.7-0.1     28.9 0.3\n 07MAY2003     23.0-1.6     26.3-0.9     27.4-0.4     28.9 0.2\n 14MAY2003     22.5-1.8     26.2-0.9     27.3-0.5     28.8 0.1\n 21MAY2003     22.3-1.7     26.0-1.0     27.3-0.6     28.8 0.1\n 28MAY2003     22.0-1.6     26.0-0.9     27.4-0.4     29.0 0.2\n 04JUN2003     21.9-1.4     25.7-0.9     27.4-0.3     29.0 0.2\n 11JUN2003     21.6-1.5     25.7-0.8     27.4-0.2     29.1 0.2\n 18JUN2003     21.1-1.6     25.9-0.5     27.5-0.1     29.1 0.3\n 25JUN2003     21.6-0.8     25.9-0.2     27.6 0.0     29.1 0.3\n 02JUL2003     21.4-0.7     25.9-0.1     27.5 0.1     29.2 0.4\n 09JUL2003     21.1-0.8     25.9 0.0     27.6 0.3     29.2 0.4\n 16JUL2003     20.8-0.8     25.8 0.1     27.5 0.3     29.1 0.3\n 23JUL2003     20.2-1.2     25.7 0.2     27.3 0.2     29.1 0.3\n 30JUL2003     20.3-0.9     25.5 0.2     27.1 0.1     29.0 0.3\n 06AUG2003     20.2-0.8     25.3 0.1     27.0 0.0     29.0 0.3\n 13AUG2003     20.0-0.8     25.0 0.0     26.9 0.1     29.1 0.5\n 20AUG2003     20.6 0.0     24.9-0.1     26.7-0.1     29.0 0.4\n 27AUG2003     20.0-0.5     24.8-0.2     26.7-0.1     29.0 0.3\n 03SEP2003     20.4-0.1     25.0 0.1     26.9 0.1     29.0 0.3\n 10SEP2003     19.9-0.5     24.8-0.1     26.8 0.0     28.9 0.2\n 17SEP2003     19.5-0.8     25.0 0.1     26.9 0.2     28.9 0.3\n 24SEP2003     20.5 0.0     25.0 0.2     27.1 0.4     29.1 0.5\n 01OCT2003     20.1-0.5     25.3 0.4     27.3 0.6     29.1 0.4\n 08OCT2003     20.9 0.2     25.5 0.6     27.4 0.7     29.1 0.5\n 15OCT2003     20.9 0.1     25.2 0.3     27.1 0.4     29.1 0.5\n 22OCT2003     21.5 0.6     25.3 0.3     27.1 0.4     29.3 0.6\n 29OCT2003     21.4 0.3     25.4 0.4     27.2 0.5     29.3 0.7\n 05NOV2003     21.6 0.3     25.3 0.4     27.0 0.4     29.4 0.7\n 12NOV2003     21.8 0.3     25.3 0.4     26.9 0.3     29.3 0.7\n 19NOV2003     22.0 0.3     25.4 0.4     27.1 0.4     29.3 0.7\n 26NOV2003     22.3 0.3     25.5 0.5     27.2 0.5     29.2 0.6\n 03DEC2003     22.5 0.2     25.6 0.5     27.1 0.5     29.2 0.6\n 10DEC2003     22.9 0.3     25.5 0.4     27.0 0.4     29.1 0.6\n 17DEC2003     23.0 0.1     25.4 0.3     26.8 0.3     29.0 0.5\n 24DEC2003     23.0-0.2     25.6 0.3     26.8 0.2     28.9 0.4\n 31DEC2003     23.8 0.2     25.7 0.4     26.7 0.1     28.7 0.4\n 07JAN2004     24.2 0.2     25.7 0.2     26.6 0.0     28.7 0.3\n 14JAN2004     24.6 0.2     25.9 0.3     26.6 0.0     28.9 0.6\n 21JAN2004     24.8 0.0     26.0 0.3     27.0 0.4     28.9 0.7\n 28JAN2004     24.7-0.4     26.1 0.1     26.9 0.2     28.8 0.6\n 04FEB2004     25.0-0.5     26.0-0.1     26.8 0.1     28.7 0.6\n 11FEB2004     25.4-0.5     26.4 0.1     26.8 0.1     28.5 0.4\n 18FEB2004     26.1 0.0     26.7 0.2     26.9 0.1     28.5 0.4\n 25FEB2004     26.3 0.1     26.7 0.1     27.0 0.1     28.5 0.4\n 03MAR2004     25.8-0.6     26.7-0.1     26.9-0.1     28.5 0.4\n 10MAR2004     25.4-1.0     27.1 0.1     26.9-0.2     28.3 0.1\n 17MAR2004     25.6-0.8     27.4 0.2     27.1-0.1     28.3 0.1\n 24MAR2004     26.0-0.3     27.4 0.1     27.3-0.1     28.4 0.2\n 31MAR2004     26.1 0.1     27.4 0.1     27.5 0.0     28.5 0.2\n 07APR2004     26.0 0.2     27.4 0.0     27.7 0.1     28.6 0.2\n 14APR2004     25.2-0.3     27.4 0.0     27.8 0.1     28.7 0.2\n 21APR2004     24.8-0.4     27.4 0.0     28.0 0.2     28.8 0.3\n 28APR2004     24.1-0.9     27.2-0.1     28.1 0.3     28.9 0.3\n 05MAY2004     23.6-1.0     26.7-0.5     27.9 0.1     29.0 0.3\n 12MAY2004     23.1-1.3     26.6-0.6     28.0 0.1     29.0 0.3\n 19MAY2004     22.8-1.3     26.8-0.3     28.2 0.4     29.2 0.4\n 26MAY2004     22.7-1.0     26.7-0.2     28.1 0.3     29.4 0.6\n 02JUN2004     22.1-1.4     26.7 0.0     28.1 0.3     29.2 0.4\n 09JUN2004     21.7-1.4     26.6 0.0     28.0 0.3     29.2 0.4\n 16JUN2004     21.5-1.3     26.4-0.1     27.8 0.1     29.2 0.4\n 23JUN2004     21.3-1.2     26.0-0.3     27.5 0.0     29.1 0.2\n 30JUN2004     21.0-1.2     25.6-0.4     27.3-0.1     29.1 0.3\n 07JUL2004     20.8-1.2     25.4-0.4     27.6 0.3     29.4 0.6\n 14JUL2004     20.9-0.8     25.5-0.2     27.7 0.4     29.4 0.6\n 21JUL2004     20.7-0.7     25.2-0.3     27.7 0.6     29.4 0.7\n 28JUL2004     20.3-0.9     25.4 0.0     27.9 0.8     29.4 0.6\n 04AUG2004     19.9-1.1     25.2 0.0     27.8 0.8     29.4 0.7\n 11AUG2004     19.7-1.1     25.1 0.0     27.6 0.7     29.2 0.6\n 18AUG2004     19.6-1.0     24.9 0.0     27.4 0.6     29.2 0.5\n 25AUG2004     19.2-1.4     24.9 0.0     27.4 0.7     29.3 0.7\n 01SEP2004     20.1-0.4     25.0 0.1     27.4 0.7     29.6 0.9\n 08SEP2004     19.8-0.6     25.0 0.1     27.4 0.6     29.6 0.9\n 15SEP2004     19.8-0.5     25.1 0.3     27.5 0.7     29.6 0.9\n 22SEP2004     20.4-0.1     25.3 0.4     27.6 0.9     29.6 0.9\n 29SEP2004     20.5-0.1     25.4 0.5     27.5 0.8     29.5 0.8\n 06OCT2004     20.8 0.1     25.2 0.4     27.4 0.7     29.5 0.8\n 13OCT2004     20.5-0.2     25.2 0.3     27.3 0.6     29.4 0.8\n 20OCT2004     21.4 0.5     25.4 0.5     27.4 0.7     29.6 1.0\n 27OCT2004     21.3 0.2     25.4 0.5     27.4 0.7     29.7 1.0\n 03NOV2004     21.5 0.3     25.4 0.5     27.3 0.6     29.6 1.0\n 10NOV2004     22.0 0.5     25.5 0.5     27.3 0.6     29.5 0.9\n 17NOV2004     22.2 0.5     25.5 0.5     27.3 0.7     29.6 1.0\n 24NOV2004     21.9 0.0     25.4 0.4     27.3 0.7     29.5 1.0\n 01DEC2004     22.4 0.2     25.6 0.6     27.4 0.8     29.4 0.9\n 08DEC2004     22.3-0.2     25.7 0.6     27.4 0.8     29.4 0.8\n 15DEC2004     22.9 0.2     25.8 0.6     27.3 0.7     29.2 0.8\n 22DEC2004     22.9-0.2     25.9 0.6     27.3 0.7     29.5 1.1\n 29DEC2004     23.6 0.2     25.8 0.5     27.2 0.6     29.5 1.1\n 05JAN2005     23.7-0.2     25.7 0.3     27.1 0.5     29.3 0.9\n 12JAN2005     24.2 0.0     25.9 0.3     27.1 0.5     29.2 0.9\n 19JAN2005     25.0 0.3     26.0 0.3     27.1 0.5     29.2 0.9\n 26JAN2005     24.9-0.1     26.0 0.1     27.1 0.5     29.2 1.0\n 02FEB2005     24.6-0.8     25.9-0.2     26.9 0.2     29.0 0.8\n 09FEB2005     25.1-0.6     26.2-0.1     27.0 0.3     28.8 0.7\n 16FEB2005     25.8-0.3     26.4 0.0     27.0 0.3     28.8 0.7\n 23FEB2005     25.7-0.5     26.3-0.3     27.0 0.1     28.7 0.6\n 02MAR2005     25.2-1.1     26.2-0.6     27.0 0.0     28.8 0.6\n 09MAR2005     25.9-0.5     26.7-0.2     27.2 0.1     28.8 0.6\n 16MAR2005     25.9-0.6     27.3 0.2     27.6 0.4     29.0 0.8\n 23MAR2005     25.0-1.3     27.3 0.0     27.9 0.5     28.9 0.7\n 30MAR2005     24.9-1.1     27.4 0.1     28.0 0.5     29.0 0.7\n 06APR2005     24.8-1.0     27.4 0.0     28.0 0.4     28.9 0.5\n 13APR2005     24.6-0.9     27.7 0.2     27.9 0.1     28.8 0.3\n 20APR2005     24.8-0.5     27.9 0.5     28.2 0.4     28.9 0.4\n 27APR2005     25.4 0.4     28.1 0.8     28.3 0.5     29.1 0.5\n 04MAY2005     25.2 0.5     28.1 0.9     28.3 0.4     29.1 0.4\n 11MAY2005     24.6 0.2     27.6 0.5     28.2 0.4     29.1 0.3\n 18MAY2005     24.5 0.4     27.4 0.3     28.2 0.4     29.3 0.5\n 25MAY2005     23.5-0.3     27.1 0.2     28.2 0.4     29.2 0.4\n 01JUN2005     23.0-0.5     26.8 0.0     28.1 0.3     29.2 0.4\n 08JUN2005     22.6-0.5     26.9 0.3     28.1 0.4     29.2 0.4\n 15JUN2005     22.3-0.5     26.8 0.3     28.1 0.4     29.2 0.4\n 22JUN2005     22.2-0.3     26.9 0.6     28.0 0.5     29.1 0.3\n 29JUN2005     21.6-0.7     26.7 0.6     28.0 0.5     29.1 0.3\n 06JUL2005     21.5-0.5     26.3 0.4     27.8 0.4     29.2 0.4\n 13JUL2005     21.5-0.3     26.2 0.5     27.6 0.3     29.1 0.3\n 20JUL2005     20.7-0.8     25.8 0.2     27.3 0.2     29.0 0.2\n 27JUL2005     20.8-0.5     25.4 0.0     27.1 0.1     28.9 0.1\n 03AUG2005     20.8-0.2     25.2-0.1     26.9-0.1     28.8 0.1\n 10AUG2005     20.6-0.2     25.2 0.1     26.9 0.0     28.7 0.0\n 17AUG2005     20.4-0.2     25.4 0.4     27.0 0.2     28.9 0.2\n 24AUG2005     20.8 0.3     25.2 0.3     26.9 0.1     28.9 0.3\n 31AUG2005     20.4-0.1     24.8-0.1     26.7-0.1     28.9 0.2\n 07SEP2005     20.0-0.5     24.5-0.3     26.5-0.3     28.7 0.1\n 14SEP2005     19.7-0.7     24.5-0.4     26.4-0.3     28.7 0.0\n 21SEP2005     19.6-0.9     24.7-0.2     26.8 0.1     28.9 0.3\n 28SEP2005     19.6-0.9     24.5-0.4     26.7 0.0     28.9 0.3\n 05OCT2005     19.4-1.2     24.6-0.3     26.9 0.2     29.0 0.3\n 12OCT2005     20.0-0.8     24.9 0.0     26.9 0.2     28.9 0.3\n 19OCT2005     19.8-1.1     24.7-0.2     26.7 0.0     28.8 0.2\n 26OCT2005     19.9-1.2     24.7-0.2     26.6-0.1     28.8 0.1\n 02NOV2005     19.8-1.4     24.3-0.7     26.5-0.2     28.7 0.1\n 09NOV2005     20.2-1.2     24.2-0.7     26.3-0.4     28.6 0.0\n 16NOV2005     21.0-0.6     24.3-0.7     26.5-0.2     28.6 0.0\n 23NOV2005     21.2-0.7     24.3-0.7     26.3-0.3     28.7 0.1\n 30NOV2005     21.2-0.9     24.2-0.9     26.1-0.5     28.6 0.1\n 07DEC2005     21.4-1.1     24.1-1.0     26.0-0.6     28.6 0.0\n 14DEC2005     21.8-0.9     24.0-1.1     25.8-0.7     28.5 0.0\n 21DEC2005     23.1 0.1     24.3-0.9     25.8-0.8     28.1-0.3\n 28DEC2005     23.3-0.2     24.7-0.6     25.9-0.7     28.0-0.4\n 04JAN2006     23.4-0.4     25.0-0.5     25.8-0.7     27.9-0.5\n 11JAN2006     24.2 0.0     25.0-0.6     25.7-0.9     27.8-0.5\n 18JAN2006     24.3-0.2     24.8-0.9     25.5-1.1     27.6-0.7\n 25JAN2006     24.8-0.1     25.1-0.8     25.5-1.1     27.4-0.8\n 01FEB2006     25.0-0.3     25.5-0.6     25.8-0.9     27.4-0.7\n 08FEB2006     25.9 0.2     25.8-0.4     26.0-0.7     27.3-0.9\n 15FEB2006     27.1 1.0     26.3 0.0     26.1-0.6     27.3-0.8\n 22FEB2006     26.8 0.6     26.4-0.2     26.3-0.5     27.4-0.7\n 01MAR2006     27.0 0.7     26.2-0.6     26.1-0.9     27.4-0.7\n 08MAR2006     26.9 0.5     26.5-0.4     26.4-0.7     27.6-0.6\n 15MAR2006     26.7 0.2     26.5-0.6     26.5-0.7     27.7-0.5\n 22MAR2006     26.6 0.3     26.6-0.6     26.7-0.6     28.0-0.3\n 29MAR2006     26.0-0.1     26.8-0.5     27.0-0.5     28.1-0.2\n 05APR2006     24.9-0.9     27.1-0.3     27.3-0.3     28.1-0.2\n 12APR2006     24.0-1.5     27.6 0.1     27.7 0.0     28.3-0.1\n 19APR2006     23.4-2.0     27.2-0.2     27.7-0.1     28.4-0.1\n 26APR2006     23.1-1.9     27.2-0.2     27.7-0.1     28.5 0.0\n 03MAY2006     23.9-0.8     27.2-0.1     27.7-0.1     28.6-0.1\n 10MAY2006     24.1-0.4     27.1 0.0     27.8 0.0     28.8 0.1\n 17MAY2006     23.8-0.3     27.1 0.0     28.1 0.2     29.1 0.3\n 24MAY2006     23.5-0.3     26.9 0.0     28.0 0.2     29.0 0.2\n 31MAY2006     23.4-0.1     26.8 0.0     28.0 0.3     29.2 0.4\n 07JUN2006     22.6-0.6     26.6 0.0     28.0 0.3     29.2 0.4\n 14JUN2006     22.8-0.1     26.5 0.1     27.9 0.3     29.2 0.3\n 21JUN2006     22.5-0.1     26.3 0.0     27.8 0.2     29.2 0.3\n 28JUN2006     22.4 0.0     26.1 0.0     27.6 0.1     29.0 0.2\n 05JUL2006     22.2 0.1     26.0 0.1     27.5 0.1     29.0 0.1\n 12JUL2006     22.0 0.2     25.8 0.0     27.3 0.0     29.0 0.2\n 19JUL2006     22.3 0.8     25.8 0.2     27.3 0.1     29.1 0.3\n 26JUL2006     22.0 0.7     25.7 0.3     27.3 0.2     29.2 0.4\n 02AUG2006     21.9 0.8     25.5 0.3     27.2 0.2     29.2 0.5\n 09AUG2006     21.7 0.8     25.3 0.2     27.1 0.2     29.1 0.4\n 16AUG2006     21.6 0.9     25.4 0.4     27.2 0.4     29.2 0.6\n 23AUG2006     21.5 1.0     25.5 0.5     27.3 0.5     29.3 0.6\n 30AUG2006     21.1 0.6     25.6 0.6     27.3 0.5     29.3 0.7\n 06SEP2006     21.6 1.2     25.6 0.7     27.4 0.6     29.4 0.8\n 13SEP2006     21.3 0.9     25.8 0.9     27.3 0.6     29.4 0.7\n 20SEP2006     21.2 0.8     25.9 1.1     27.4 0.7     29.4 0.8\n 27SEP2006     21.7 1.1     25.7 0.8     27.2 0.5     29.3 0.7\n 04OCT2006     21.7 1.0     25.7 0.8     27.2 0.5     29.2 0.6\n 11OCT2006     22.2 1.4     26.1 1.2     27.5 0.8     29.4 0.8\n 18OCT2006     22.4 1.5     26.0 1.1     27.5 0.8     29.5 0.8\n 25OCT2006     22.7 1.6     26.1 1.1     27.6 0.9     29.6 1.0\n 01NOV2006     22.4 1.2     25.9 1.0     27.6 0.9     29.5 0.9\n 08NOV2006     22.5 1.1     25.9 0.9     27.6 0.9     29.6 1.0\n 15NOV2006     22.6 1.0     26.1 1.1     27.8 1.2     29.7 1.1\n 22NOV2006     22.7 0.8     26.3 1.2     27.8 1.2     29.6 1.1\n 29NOV2006     23.0 0.9     26.1 1.1     27.8 1.2     29.6 1.0\n 06DEC2006     22.9 0.5     26.1 1.1     27.9 1.3     29.6 1.1\n 13DEC2006     22.9 0.2     26.3 1.2     27.8 1.2     29.5 1.0\n 20DEC2006     23.7 0.6     26.5 1.3     27.7 1.2     29.4 1.0\n 27DEC2006     24.0 0.6     26.6 1.3     27.7 1.1     29.4 1.0\n 03JAN2007     24.3 0.5     26.4 0.9     27.5 0.9     29.2 0.8\n 10JAN2007     24.9 0.7     26.7 1.1     27.5 0.9     29.1 0.8\n 17JAN2007     25.0 0.4     26.4 0.7     27.2 0.6     28.8 0.6\n 24JAN2007     25.2 0.3     26.5 0.7     27.1 0.5     28.7 0.5\n 31JAN2007     25.6 0.3     26.6 0.6     27.0 0.3     28.7 0.5\n 07FEB2007     26.0 0.4     26.6 0.4     26.9 0.2     28.6 0.4\n 14FEB2007     26.3 0.3     26.3-0.1     26.7 0.0     28.6 0.6\n 21FEB2007     26.4 0.3     26.4-0.1     26.8-0.1     28.6 0.5\n 28FEB2007     25.7-0.6     26.4-0.3     26.9 0.0     28.5 0.4\n 07MAR2007     25.8-0.5     26.6-0.3     26.9-0.2     28.5 0.4\n 14MAR2007     26.0-0.5     27.3 0.2     27.3 0.1     28.6 0.4\n 21MAR2007     25.6-0.8     26.8-0.4     27.2-0.1     28.5 0.3\n 28MAR2007     25.1-1.0     26.6-0.7     27.4 0.0     28.5 0.2\n 04APR2007     24.5-1.4     26.7-0.7     27.5 0.0     28.7 0.3\n 11APR2007     24.4-1.2     27.2-0.2     27.8 0.1     28.7 0.3\n 18APR2007     23.9-1.4     27.4-0.1     27.9 0.2     28.7 0.2\n 25APR2007     24.1-1.0     27.3-0.1     27.8 0.0     28.7 0.1\n 02MAY2007     23.6-1.2     26.9-0.4     27.7-0.1     28.6 0.0\n 09MAY2007     23.0-1.5     26.3-0.9     27.4-0.4     28.7 0.0\n 16MAY2007     22.9-1.3     26.3-0.8     27.5-0.4     28.8 0.1\n 23MAY2007     22.3-1.6     26.3-0.6     27.7-0.1     29.0 0.2\n 30MAY2007     21.8-1.8     26.1-0.7     27.6-0.2     29.0 0.2\n 06JUN2007     21.6-1.6     25.8-0.9     27.6-0.1     29.0 0.2\n 13JUN2007     22.2-0.7     26.1-0.4     27.7 0.1     29.1 0.3\n 20JUN2007     21.8-0.8     25.9-0.5     27.6 0.0     28.9 0.1\n 27JUN2007     20.7-1.7     25.5-0.6     27.3-0.1     28.8 0.0\n 04JUL2007     21.2-0.9     25.3-0.6     27.0-0.4     28.7-0.1\n 11JUL2007     20.1-1.7     24.9-0.9     26.8-0.5     28.8 0.0\n 18JUL2007     19.9-1.7     24.8-0.8     26.9-0.3     28.9 0.1\n 25JUL2007     20.3-1.0     24.5-1.0     26.6-0.5     28.9 0.1\n 01AUG2007     19.6-1.5     24.1-1.2     26.4-0.6     28.7 0.0\n 08AUG2007     19.3-1.6     23.8-1.3     26.2-0.7     28.6-0.1\n 15AUG2007     19.7-1.0     24.0-1.0     26.3-0.6     28.6-0.1\n 22AUG2007     19.2-1.4     23.8-1.2     26.1-0.7     28.5-0.1\n 29AUG2007     18.4-2.1     23.7-1.3     26.1-0.7     28.4-0.2\n 05SEP2007     19.4-1.1     23.7-1.2     26.0-0.8     28.3-0.4\n 12SEP2007     18.6-1.8     23.6-1.3     25.8-1.0     28.0-0.6\n 19SEP2007     18.5-2.0     23.6-1.2     25.8-0.9     28.0-0.7\n 26SEP2007     18.4-2.1     23.2-1.7     25.6-1.1     28.0-0.7\n 03OCT2007     18.3-2.3     23.2-1.7     25.4-1.3     27.9-0.7\n 10OCT2007     18.8-1.9     23.3-1.6     24.9-1.8     27.7-1.0\n 17OCT2007     18.6-2.2     23.5-1.4     25.3-1.4     27.9-0.7\n 24OCT2007     19.2-1.8     23.5-1.4     25.3-1.4     27.8-0.8\n 31OCT2007     19.7-1.5     23.2-1.8     25.2-1.5     27.8-0.8\n 07NOV2007     19.3-2.1     23.0-2.0     25.0-1.6     27.5-1.1\n 14NOV2007     19.2-2.3     23.2-1.7     25.2-1.5     27.3-1.3\n 21NOV2007     19.8-2.0     23.2-1.8     24.9-1.7     27.1-1.5\n 28NOV2007     19.8-2.2     23.3-1.8     25.1-1.6     27.4-1.1\n 05DEC2007     20.6-1.8     23.5-1.5     25.1-1.5     27.5-1.0\n 12DEC2007     20.3-2.4     23.3-1.8     24.9-1.7     27.5-1.0\n 19DEC2007     21.3-1.6     23.7-1.5     25.0-1.6     27.2-1.3\n 26DEC2007     21.9-1.4     23.7-1.6     24.9-1.6     27.0-1.4\n 02JAN2008     22.6-1.1     23.9-1.5     25.0-1.6     26.8-1.6\n 09JAN2008     23.3-0.8     24.0-1.5     24.8-1.8     26.6-1.7\n 16JAN2008     24.1-0.4     24.0-1.6     24.6-2.0     26.6-1.7\n 23JAN2008     24.1-0.7     24.1-1.7     24.4-2.2     26.4-1.8\n 30JAN2008     25.1-0.1     24.7-1.3     24.9-1.7     26.5-1.7\n 06FEB2008     25.9 0.3     24.8-1.4     24.6-2.1     26.4-1.8\n 13FEB2008     25.9-0.1     24.7-1.7     24.5-2.2     26.4-1.7\n 20FEB2008     26.7 0.6     25.1-1.4     24.9-2.0     26.4-1.7\n 27FEB2008     27.2 0.9     25.8-0.9     25.3-1.6     26.3-1.8\n 05MAR2008     27.3 1.0     26.3-0.6     25.7-1.3     26.6-1.5\n 12MAR2008     27.2 0.7     26.5-0.5     26.0-1.1     26.7-1.4\n 19MAR2008     27.3 0.9     26.7-0.5     26.2-1.1     26.8-1.4\n 26MAR2008     27.1 0.9     26.8-0.5     26.3-1.0     27.0-1.2\n 02APR2008     27.2 1.2     26.9-0.4     26.5-1.0     27.2-1.2\n 09APR2008     25.9 0.2     27.3-0.2     26.7-1.0     27.3-1.1\n 16APR2008     25.5 0.0     27.3-0.2     26.9-0.9     27.4-1.1\n 23APR2008     25.5 0.4     27.1-0.3     26.9-0.9     27.5-1.1\n 30APR2008     24.5-0.3     27.3 0.0     27.1-0.7     27.7-0.9\n 07MAY2008     24.1-0.5     26.8-0.4     27.0-0.9     27.7-1.0\n 14MAY2008     24.5 0.2     27.1-0.1     27.1-0.7     27.8-0.9\n 21MAY2008     24.1 0.1     27.2 0.2     27.3-0.5     28.0-0.7\n 28MAY2008     24.1 0.5     27.2 0.4     27.3-0.5     28.0-0.8\n 04JUN2008     24.0 0.7     27.0 0.3     27.3-0.4     28.0-0.8\n 11JUN2008     23.7 0.7     26.7 0.2     27.2-0.5     28.0-0.8\n 18JUN2008     23.3 0.6     26.3-0.1     27.1-0.5     28.1-0.8\n 25JUN2008     23.0 0.6     26.2 0.0     27.1-0.4     28.1-0.7\n 02JUL2008     22.7 0.5     26.3 0.4     27.2-0.2     28.2-0.6\n 09JUL2008     22.7 0.8     26.3 0.5     27.3-0.1     28.3-0.5\n 16JUL2008     22.7 1.1     26.2 0.5     27.3 0.0     28.3-0.5\n 23JUL2008     22.6 1.2     25.9 0.5     27.1 0.0     28.2-0.6\n 30JUL2008     22.2 1.1     25.9 0.5     27.1 0.0     28.2-0.5\n 06AUG2008     22.0 1.1     25.9 0.7     27.0 0.1     28.2-0.5\n 13AUG2008     22.5 1.8     25.8 0.8     27.0 0.2     28.2-0.5\n 20AUG2008     21.1 0.5     25.5 0.5     26.7-0.1     28.1-0.6\n 27AUG2008     21.3 0.8     25.3 0.4     26.6-0.2     28.1-0.6\n 03SEP2008     21.3 0.8     25.3 0.4     26.6-0.2     28.1-0.6\n 10SEP2008     21.0 0.6     25.2 0.3     26.6-0.2     28.1-0.6\n 17SEP2008     21.1 0.8     24.9 0.1     26.4-0.4     28.1-0.6\n 24SEP2008     21.3 0.8     25.1 0.2     26.4-0.4     28.1-0.6\n 01OCT2008     21.0 0.4     24.7-0.2     26.2-0.5     28.3-0.4\n 08OCT2008     20.6-0.1     24.9 0.0     26.3-0.4     28.3-0.4\n 15OCT2008     20.7-0.1     24.9-0.1     26.4-0.3     28.3-0.4\n 22OCT2008     21.0 0.0     24.8-0.2     26.3-0.4     28.2-0.4\n 29OCT2008     20.5-0.7     24.6-0.3     26.4-0.2     28.2-0.4\n 05NOV2008     21.3 0.0     24.6-0.3     26.3-0.3     28.2-0.4\n 12NOV2008     21.8 0.3     24.9-0.1     26.5-0.2     28.1-0.5\n 19NOV2008     21.5-0.2     24.9-0.1     26.3-0.3     28.0-0.6\n 26NOV2008     21.2-0.8     24.6-0.4     26.1-0.5     27.9-0.6\n 03DEC2008     21.4-0.9     24.8-0.3     26.0-0.6     27.9-0.6\n 10DEC2008     22.1-0.4     24.6-0.5     25.8-0.8     27.7-0.7\n 17DEC2008     22.6-0.3     24.6-0.6     25.8-0.8     27.7-0.8\n 24DEC2008     22.8-0.5     24.5-0.8     25.6-1.0     27.5-0.9\n 31DEC2008     23.3-0.3     24.4-1.0     25.4-1.2     27.5-0.9\n 07JAN2009     23.4-0.6     24.5-0.9     25.4-1.2     27.4-1.0\n 14JAN2009     24.0-0.3     24.8-0.8     25.4-1.1     27.4-0.9\n 21JAN2009     25.3 0.5     25.5-0.2     25.8-0.8     27.4-0.8\n 28JAN2009     25.3 0.2     25.5-0.4     25.7-1.0     27.3-0.9\n 04FEB2009     25.1-0.4     25.4-0.7     25.7-0.9     27.2-0.9\n 11FEB2009     25.8 0.0     25.6-0.6     25.9-0.8     27.3-0.8\n 18FEB2009     26.3 0.2     26.1-0.4     26.2-0.6     27.4-0.7\n 25FEB2009     26.5 0.2     26.4-0.3     26.3-0.6     27.4-0.7\n 04MAR2009     26.5 0.2     26.1-0.7     26.4-0.7     27.5-0.6\n 11MAR2009     26.1-0.3     26.1-0.9     26.7-0.5     27.7-0.4\n 18MAR2009     26.0-0.4     26.4-0.7     26.7-0.6     27.8-0.4\n 25MAR2009     26.3 0.1     26.7-0.5     26.8-0.6     27.9-0.4\n 01APR2009     26.4 0.5     27.2-0.1     27.1-0.4     28.1-0.2\n 08APR2009     25.7 0.0     27.4 0.0     27.4-0.2     28.3-0.1\n 15APR2009     26.1 0.7     27.5 0.0     27.5-0.2     28.3-0.2\n 22APR2009     25.4 0.2     27.3-0.1     27.6-0.2     28.4-0.2\n 29APR2009     25.3 0.4     27.5 0.2     27.7-0.1     28.6 0.0\n 06MAY2009     25.3 0.7     27.6 0.4     27.9 0.1     28.8 0.1\n 13MAY2009     24.8 0.5     27.4 0.3     28.0 0.2     29.0 0.2\n 20MAY2009     24.4 0.4     27.4 0.4     28.2 0.4     29.1 0.3\n 27MAY2009     24.3 0.6     27.2 0.4     28.1 0.3     29.1 0.3\n 03JUN2009     23.7 0.4     27.1 0.4     27.9 0.2     29.0 0.2\n 10JUN2009     23.7 0.6     27.2 0.6     28.1 0.4     29.1 0.3\n 17JUN2009     23.9 1.1     27.2 0.8     28.2 0.5     29.2 0.4\n 24JUN2009     23.5 1.0     27.1 0.9     28.2 0.7     29.3 0.5\n 01JUL2009     22.9 0.7     26.9 0.9     28.2 0.7     29.3 0.5\n 08JUL2009     23.0 1.1     26.7 0.9     28.0 0.7     29.2 0.4\n 15JUL2009     22.7 1.0     26.6 1.0     28.0 0.7     29.2 0.4\n 22JUL2009     22.2 0.8     26.5 1.0     27.9 0.8     29.2 0.4\n 29JUL2009     22.1 0.9     26.2 0.8     27.7 0.6     29.1 0.4\n 05AUG2009     22.2 1.2     26.0 0.8     27.6 0.6     29.1 0.4\n 12AUG2009     21.4 0.6     25.9 0.8     27.4 0.6     29.1 0.4\n 19AUG2009     21.6 0.9     25.8 0.9     27.4 0.6     29.2 0.6\n 26AUG2009     21.5 1.0     25.9 1.0     27.6 0.8     29.3 0.7\n 02SEP2009     21.4 0.9     25.9 1.0     27.6 0.8     29.3 0.6\n 09SEP2009     21.1 0.6     25.7 0.8     27.5 0.8     29.3 0.6\n 16SEP2009     20.8 0.4     25.6 0.8     27.5 0.8     29.3 0.6\n 23SEP2009     20.5 0.0     25.6 0.7     27.4 0.7     29.2 0.6\n 30SEP2009     20.4-0.2     25.4 0.6     27.3 0.6     29.2 0.6\n 07OCT2009     20.1-0.5     25.5 0.6     27.3 0.6     29.4 0.7\n 14OCT2009     21.0 0.2     25.6 0.7     27.5 0.8     29.6 1.0\n 21OCT2009     21.2 0.3     25.8 0.8     27.7 1.0     29.8 1.2\n 28OCT2009     21.6 0.5     26.1 1.2     28.1 1.4     30.0 1.3\n 04NOV2009     21.8 0.5     26.2 1.3     28.2 1.6     29.9 1.3\n 11NOV2009     22.1 0.6     26.2 1.2     28.2 1.5     29.9 1.3\n 18NOV2009     22.2 0.5     26.2 1.2     28.2 1.6     29.8 1.2\n 25NOV2009     22.2 0.3     26.3 1.2     28.2 1.6     29.9 1.3\n 02DEC2009     22.7 0.4     26.5 1.4     28.2 1.6     29.7 1.2\n 09DEC2009     22.7 0.2     26.6 1.5     28.2 1.7     29.6 1.1\n 16DEC2009     22.6-0.2     26.7 1.5     28.3 1.8     29.7 1.2\n 23DEC2009     23.7 0.5     26.8 1.5     28.4 1.9     29.7 1.3\n 30DEC2009     24.3 0.7     26.7 1.4     28.3 1.7     29.6 1.2\n 06JAN2010     24.3 0.4     26.7 1.2     28.3 1.7     29.7 1.3\n 13JAN2010     24.6 0.3     26.7 1.1     28.2 1.6     29.6 1.3\n 20JAN2010     24.7 0.1     26.5 0.8     28.0 1.4     29.5 1.2\n 27JAN2010     25.5 0.4     26.6 0.7     27.8 1.2     29.3 1.1\n 03FEB2010     25.4 0.0     26.7 0.6     27.8 1.2     29.1 1.0\n 10FEB2010     25.7-0.2     27.0 0.7     27.9 1.2     29.0 0.9\n 17FEB2010     26.4 0.3     27.2 0.8     27.9 1.2     29.0 1.0\n 24FEB2010     26.5 0.3     27.4 0.8     28.0 1.1     29.2 1.1\n 03MAR2010     26.3-0.1     27.5 0.7     28.1 1.1     29.2 1.0\n 10MAR2010     26.0-0.4     27.5 0.5     28.3 1.2     29.3 1.1\n 17MAR2010     26.2-0.3     27.8 0.7     28.4 1.1     29.2 1.1\n 24MAR2010     26.3 0.0     27.9 0.7     28.4 1.0     29.2 0.9\n 31MAR2010     25.9-0.1     28.1 0.8     28.4 0.9     29.2 0.8\n 07APR2010     26.0 0.3     28.1 0.7     28.4 0.8     29.3 0.9\n 14APR2010     26.6 1.0     28.2 0.8     28.5 0.7     29.2 0.7\n 21APR2010     26.0 0.8     28.0 0.6     28.4 0.6     29.2 0.7\n 28APR2010     25.2 0.3     27.8 0.4     28.2 0.4     29.3 0.7\n 05MAY2010     24.8 0.2     27.7 0.5     28.0 0.2     29.1 0.4\n 12MAY2010     24.8 0.5     27.1 0.0     27.7-0.2     29.0 0.3\n 19MAY2010     24.0 0.0     26.8-0.3     27.5-0.3     29.0 0.2\n 26MAY2010     23.2-0.5     26.4-0.4     27.5-0.3     29.0 0.2\n 02JUN2010     23.4 0.0     26.1-0.6     27.3-0.5     28.8 0.0\n 09JUN2010     23.1 0.0     26.0-0.6     27.1-0.6     28.7-0.1\n 16JUN2010     22.3-0.5     25.8-0.6     27.0-0.7     28.6-0.2\n 23JUN2010     22.4-0.2     25.5-0.8     26.9-0.7     28.5-0.3\n 30JUN2010     21.6-0.7     25.3-0.8     26.7-0.8     28.3-0.5\n 07JUL2010     20.9-1.1     24.8-1.0     26.4-0.9     28.2-0.6\n 14JUL2010     20.0-1.6     24.6-1.1     26.1-1.1     28.2-0.6\n 21JUL2010     19.6-1.9     24.4-1.1     26.0-1.2     28.0-0.8\n 28JUL2010     19.5-1.7     24.0-1.4     25.6-1.4     27.8-1.0\n 04AUG2010     19.5-1.5     24.0-1.3     25.8-1.2     27.7-1.0\n 11AUG2010     19.6-1.2     24.1-1.0     25.7-1.2     27.5-1.2\n 18AUG2010     19.2-1.4     23.8-1.1     25.6-1.2     27.5-1.1\n 25AUG2010     19.2-1.4     23.7-1.3     25.2-1.6     27.1-1.5\n 01SEP2010     18.8-1.7     23.4-1.5     25.1-1.7     27.2-1.5\n 08SEP2010     19.1-1.3     23.5-1.4     25.2-1.6     27.1-1.6\n 15SEP2010     18.6-1.8     23.4-1.5     25.1-1.6     27.1-1.6\n 22SEP2010     19.3-1.2     24.0-0.8     25.1-1.6     27.1-1.6\n 29SEP2010     19.2-1.4     23.5-1.3     24.8-1.9     27.1-1.6\n 06OCT2010     18.7-1.9     23.2-1.7     24.8-1.9     27.1-1.6\n 13OCT2010     18.9-1.9     23.0-2.0     25.1-1.6     27.1-1.6\n 20OCT2010     19.1-1.8     23.2-1.7     25.1-1.6     27.0-1.7\n 27OCT2010     19.8-1.3     23.6-1.4     25.2-1.5     27.0-1.6\n 03NOV2010     19.7-1.6     23.4-1.6     25.2-1.4     27.0-1.6\n 10NOV2010     19.5-1.9     23.5-1.5     25.2-1.4     27.2-1.5\n 17NOV2010     20.2-1.5     23.5-1.5     25.0-1.6     27.1-1.5\n 24NOV2010     20.6-1.3     23.3-1.7     24.9-1.7     26.9-1.7\n 01DEC2010     20.5-1.7     23.3-1.7     25.0-1.7     27.0-1.5\n 08DEC2010     20.9-1.5     23.4-1.7     25.0-1.6     26.9-1.6\n 15DEC2010     21.1-1.7     23.5-1.7     25.0-1.5     26.9-1.6\n 22DEC2010     21.7-1.4     23.4-1.8     24.8-1.8     26.8-1.6\n 29DEC2010     22.9-0.6     23.8-1.5     25.0-1.5     26.7-1.7\n 05JAN2011     23.1-0.7     24.1-1.3     25.0-1.5     26.7-1.7\n 12JAN2011     23.6-0.7     24.1-1.5     24.7-1.8     26.6-1.7\n 19JAN2011     24.2-0.5     24.4-1.3     25.0-1.6     26.7-1.6\n 26JAN2011     25.0 0.0     24.5-1.4     24.9-1.7     26.8-1.4\n 02FEB2011     25.3-0.1     24.9-1.1     25.1-1.5     26.6-1.5\n 09FEB2011     25.9 0.2     25.5-0.8     25.5-1.2     26.8-1.3\n 16FEB2011     26.8 0.7     25.6-0.8     25.4-1.3     27.0-1.1\n 23FEB2011     26.4 0.2     25.9-0.7     25.6-1.3     27.0-1.1\n 02MAR2011     25.7-0.6     26.0-0.8     25.7-1.3     27.1-1.1\n 09MAR2011     26.3-0.2     26.2-0.8     26.0-1.1     27.3-0.9\n 16MAR2011     26.6 0.1     26.3-0.8     26.4-0.9     27.5-0.7\n 23MAR2011     25.8-0.5     26.6-0.6     26.4-0.9     27.5-0.7\n 30MAR2011     25.6-0.4     26.9-0.4     26.6-0.9     27.5-0.8\n 06APR2011     25.4-0.4     27.1-0.2     26.9-0.7     27.7-0.6\n 13APR2011     25.8 0.3     27.3-0.2     27.1-0.7     27.9-0.6\n 20APR2011     25.4 0.1     27.2-0.3     27.1-0.7     27.8-0.7\n 27APR2011     25.8 0.8     27.2-0.1     27.1-0.7     27.9-0.7\n 04MAY2011     25.1 0.4     27.0-0.3     27.2-0.6     28.0-0.7\n 11MAY2011     25.3 0.9     27.0-0.2     27.4-0.5     28.3-0.5\n 18MAY2011     24.6 0.5     27.0-0.1     27.6-0.3     28.4-0.4\n 25MAY2011     24.0 0.3     26.8 0.0     27.5-0.3     28.3-0.5\n 01JUN2011     24.3 0.8     26.8 0.1     27.5-0.2     28.4-0.4\n 08JUN2011     24.2 1.1     26.7 0.1     27.5-0.2     28.4-0.4\n 15JUN2011     23.8 1.0     26.6 0.1     27.4-0.2     28.4-0.4\n 22JUN2011     23.2 0.6     26.5 0.2     27.4-0.1     28.4-0.4\n 29JUN2011     22.9 0.6     26.1 0.1     27.4-0.1     28.6-0.2\n 06JUL2011     22.2 0.2     25.8-0.1     27.1-0.3     28.5-0.3\n 13JUL2011     21.9 0.2     25.7 0.0     27.1-0.2     28.5-0.3\n 20JUL2011     22.1 0.6     25.6 0.0     26.9-0.3     28.4-0.4\n 27JUL2011     21.9 0.7     25.3-0.1     26.8-0.3     28.4-0.4\n 03AUG2011     21.5 0.4     25.0-0.3     26.4-0.6     28.3-0.4\n 10AUG2011     20.9 0.0     24.6-0.5     26.3-0.6     28.4-0.3\n 17AUG2011     20.5-0.1     24.5-0.5     26.0-0.8     28.2-0.4\n 24AUG2011     20.2-0.4     24.3-0.6     26.1-0.7     28.3-0.4\n 31AUG2011     20.0-0.5     24.4-0.5     26.1-0.7     28.3-0.4\n 07SEP2011     19.7-0.7     24.2-0.7     26.1-0.7     28.2-0.5\n 14SEP2011     19.6-0.8     24.1-0.7     26.0-0.8     28.0-0.7\n 21SEP2011     19.8-0.6     24.3-0.6     25.9-0.9     27.8-0.9\n 28SEP2011     19.9-0.6     24.1-0.7     26.0-0.7     28.0-0.7\n 05OCT2011     19.8-0.8     24.1-0.8     25.7-1.0     27.7-0.9\n 12OCT2011     19.7-1.0     24.1-0.8     25.8-0.9     27.9-0.8\n 19OCT2011     20.0-0.9     23.9-1.1     25.8-0.8     28.1-0.6\n 26OCT2011     21.2 0.2     23.8-1.1     25.4-1.2     28.0-0.7\n 02NOV2011     20.5-0.8     23.9-1.1     25.6-1.0     27.9-0.8\n 09NOV2011     20.5-0.9     23.9-1.1     25.7-0.9     27.9-0.7\n 16NOV2011     20.5-1.1     23.8-1.1     25.6-1.0     27.9-0.7\n 23NOV2011     21.4-0.5     24.0-1.0     25.6-1.0     27.8-0.8\n 30NOV2011     21.0-1.2     23.8-1.3     25.4-1.2     27.7-0.9\n 07DEC2011     21.4-1.0     23.9-1.2     25.5-1.1     27.5-1.0\n 14DEC2011     21.5-1.2     24.1-1.0     25.6-1.0     27.4-1.1\n 21DEC2011     22.1-1.0     24.5-0.7     25.6-1.0     27.2-1.3\n 28DEC2011     22.6-0.9     24.4-0.9     25.5-1.1     27.1-1.3\n 04JAN2012     22.7-1.1     24.6-0.8     25.5-1.0     27.2-1.2\n 11JAN2012     23.7-0.5     24.8-0.7     25.6-1.0     27.1-1.2\n 18JAN2012     24.0-0.6     24.9-0.8     25.4-1.2     27.1-1.2\n 25JAN2012     24.6-0.4     25.2-0.7     25.5-1.2     26.9-1.3\n 01FEB2012     24.6-0.8     25.2-0.8     25.5-1.2     27.0-1.2\n 08FEB2012     25.2-0.5     25.6-0.6     25.7-1.0     27.1-1.0\n 15FEB2012     26.9 0.8     26.3-0.1     26.1-0.7     27.1-1.0\n 22FEB2012     26.9 0.8     26.8 0.2     26.5-0.4     27.4-0.7\n 29FEB2012     27.3 1.0     27.1 0.4     26.4-0.6     27.2-0.9\n 07MAR2012     26.6 0.2     26.7-0.2     26.4-0.7     27.3-0.9\n 14MAR2012     26.6 0.2     26.6-0.4     26.6-0.6     27.5-0.7\n 21MAR2012     26.7 0.4     27.0-0.2     26.7-0.6     27.8-0.5\n 28MAR2012     26.9 0.8     27.5 0.3     27.1-0.3     27.7-0.6\n 04APR2012     26.2 0.3     27.6 0.3     27.2-0.3     27.9-0.5\n 11APR2012     27.4 1.8     27.8 0.4     27.3-0.4     28.1-0.3\n 18APR2012     26.8 1.4     27.5 0.0     27.3-0.5     28.1-0.4\n 25APR2012     26.6 1.5     27.5 0.1     27.6-0.2     28.4-0.2\n 02MAY2012     26.3 1.6     27.4 0.1     27.7-0.1     28.4-0.2\n 09MAY2012     25.7 1.2     27.3 0.1     27.8 0.0     28.4-0.3\n 16MAY2012     25.2 1.0     27.2 0.1     27.8 0.0     28.5-0.3\n 23MAY2012     24.8 0.9     27.1 0.2     27.8 0.0     28.6-0.2\n 30MAY2012     24.5 0.9     27.2 0.4     27.9 0.2     28.7-0.1\n 06JUN2012     24.7 1.5     27.1 0.4     27.8 0.1     28.6-0.2\n 13JUN2012     24.4 1.5     27.1 0.6     27.9 0.3     28.6-0.2\n 20JUN2012     24.3 1.7     27.1 0.8     28.0 0.4     28.8 0.0\n 27JUN2012     23.8 1.5     27.1 0.9     28.1 0.6     28.9 0.0\n 04JUL2012     23.2 1.1     26.8 0.8     27.9 0.5     28.8 0.0\n 11JUL2012     22.6 0.8     26.6 0.8     27.7 0.4     28.8 0.0\n 18JUL2012     22.6 1.1     26.5 0.9     27.7 0.5     28.8 0.0\n 25JUL2012     22.0 0.7     26.4 1.0     27.7 0.6     28.9 0.1\n 01AUG2012     21.6 0.5     26.1 0.9     27.6 0.6     29.0 0.3\n 08AUG2012     20.9 0.0     25.9 0.8     27.7 0.8     29.1 0.4\n 15AUG2012     20.8 0.1     25.6 0.6     27.4 0.6     29.1 0.4\n 22AUG2012     21.0 0.4     25.5 0.5     27.4 0.6     29.1 0.4\n 29AUG2012     20.3-0.2     25.6 0.7     27.7 0.9     29.1 0.5\n 05SEP2012     20.7 0.3     25.5 0.6     27.5 0.8     29.2 0.5\n 12SEP2012     20.9 0.5     25.3 0.4     27.3 0.5     29.1 0.4\n 19SEP2012     21.0 0.5     25.2 0.3     27.0 0.3     29.0 0.4\n 26SEP2012     21.0 0.5     25.1 0.2     26.9 0.2     29.1 0.4\n 03OCT2012     20.5-0.1     24.8-0.1     26.8 0.1     29.0 0.3\n 10OCT2012     20.2-0.6     24.7-0.2     26.8 0.1     29.1 0.4\n 17OCT2012     20.5-0.4     25.0 0.1     27.0 0.3     29.1 0.5\n 24OCT2012     21.0 0.0     25.0 0.1     27.2 0.5     29.3 0.7\n 31OCT2012     21.5 0.3     25.2 0.2     27.1 0.4     29.2 0.6\n 07NOV2012     21.5 0.2     25.1 0.1     27.0 0.4     29.2 0.6\n 14NOV2012     21.0-0.5     25.2 0.2     27.2 0.5     29.3 0.7\n 21NOV2012     21.1-0.7     25.1 0.1     26.9 0.3     29.1 0.5\n 28NOV2012     20.7-1.4     24.9-0.1     26.8 0.2     28.9 0.4\n 05DEC2012     21.5-0.9     24.9-0.2     26.5-0.1     28.6 0.1\n 12DEC2012     21.8-0.8     24.8-0.3     26.5-0.1     28.8 0.4\n 19DEC2012     22.4-0.6     24.9-0.3     26.4-0.2     28.6 0.2\n 26DEC2012     22.7-0.6     25.0-0.3     26.4-0.1     28.6 0.2\n 02JAN2013     23.3-0.4     25.0-0.4     26.3-0.3     28.4 0.1\n 09JAN2013     23.7-0.4     24.8-0.7     26.0-0.6     28.3 0.0\n 16JAN2013     24.1-0.4     25.0-0.6     26.0-0.6     28.1-0.2\n 23JAN2013     24.2-0.6     25.3-0.5     26.4-0.2     28.2 0.0\n 30JAN2013     24.8-0.5     25.1-0.9     26.1-0.5     28.1 0.0\n 06FEB2013     25.4-0.2     25.5-0.7     26.2-0.5     28.1-0.1\n 13FEB2013     25.9-0.1     25.9-0.4     26.4-0.3     28.1 0.0\n 20FEB2013     25.6-0.6     26.2-0.3     26.3-0.5     27.9-0.1\n 27FEB2013     25.8-0.4     26.5-0.2     26.6-0.3     27.9-0.2\n 06MAR2013     26.7 0.4     27.0 0.1     26.9-0.1     27.9-0.2\n 13MAR2013     27.0 0.5     27.1 0.0     26.8-0.3     27.7-0.4\n 20MAR2013     26.6 0.2     27.6 0.4     27.1-0.1     28.0-0.2\n 27MAR2013     25.6-0.5     27.6 0.3     27.3-0.1     28.1-0.2\n 03APR2013     25.0-0.9     27.3 0.0     27.6 0.1     28.3 0.0\n 10APR2013     24.8-0.9     27.5 0.0     27.7 0.0     28.5 0.1\n 17APR2013     24.6-0.8     27.5 0.0     27.7-0.1     28.5 0.0\n 24APR2013     24.5-0.6     27.3-0.1     27.7-0.1     28.4-0.1\n 01MAY2013     23.6-1.2     26.9-0.4     27.8 0.0     28.7 0.0\n 08MAY2013     22.9-1.6     26.7-0.5     27.7-0.1     28.7 0.0\n 15MAY2013     23.2-1.1     26.5-0.6     27.5-0.4     28.6-0.2\n 22MAY2013     22.3-1.6     25.9-1.0     27.4-0.4     28.7-0.1\n 29MAY2013     21.5-2.1     25.9-0.9     27.5-0.2     28.8 0.0\n 05JUN2013     22.0-1.3     25.9-0.8     27.5-0.2     28.8 0.0\n 12JUN2013     21.9-1.1     25.9-0.6     27.5-0.2     28.8-0.1\n 19JUN2013     21.1-1.6     25.7-0.7     27.3-0.3     28.6-0.2\n 26JUN2013     20.5-1.9     25.6-0.6     27.4-0.1     28.8 0.0\n 03JUL2013     20.6-1.5     25.4-0.5     27.2-0.2     28.8 0.0\n 10JUL2013     20.5-1.3     25.0-0.8     26.9-0.4     28.8 0.0\n 17JUL2013     20.1-1.5     24.8-0.8     26.8-0.4     28.7-0.1\n 24JUL2013     20.3-1.1     24.9-0.6     26.8-0.3     28.7-0.1\n 31JUL2013     19.8-1.3     24.6-0.8     26.8-0.2     28.7 0.0\n 07AUG2013     19.8-1.1     24.5-0.7     26.7-0.3     28.6-0.1\n 14AUG2013     19.6-1.1     24.4-0.7     26.4-0.4     28.7 0.0\n 21AUG2013     19.9-0.8     24.4-0.6     26.4-0.4     28.7 0.0\n 28AUG2013     19.4-1.1     24.5-0.5     26.7-0.1     28.8 0.2\n 04SEP2013     19.6-0.9     24.6-0.3     26.8 0.0     28.8 0.1\n 11SEP2013     20.0-0.4     24.7-0.2     26.8 0.0     28.7 0.0\n 18SEP2013     19.9-0.5     24.9 0.1     26.7-0.1     28.6-0.1\n 25SEP2013     20.1-0.4     24.7-0.2     26.5-0.2     28.5-0.1\n 02OCT2013     19.7-0.9     24.6-0.2     26.4-0.3     28.7 0.0\n 09OCT2013     20.1-0.7     24.6-0.3     26.3-0.3     28.6 0.0\n 16OCT2013     20.3-0.5     24.8-0.1     26.3-0.4     28.6-0.1\n 23OCT2013     20.5-0.4     24.7-0.2     26.3-0.4     28.7 0.1\n 30OCT2013     20.5-0.7     24.8-0.1     26.5-0.2     28.8 0.2\n 06NOV2013     21.0-0.4     24.8-0.1     26.6 0.0     28.9 0.3\n 13NOV2013     21.1-0.4     24.7-0.2     26.6 0.0     28.9 0.3\n 20NOV2013     21.3-0.5     24.8-0.2     26.7 0.1     28.9 0.3\n 27NOV2013     21.7-0.4     24.9-0.1     26.7 0.1     28.8 0.2\n 04DEC2013     22.0-0.3     24.9-0.2     26.8 0.2     28.8 0.3\n 11DEC2013     22.4-0.2     25.1 0.0     26.6 0.0     28.7 0.2\n 18DEC2013     22.4-0.5     25.2 0.0     26.5-0.1     28.6 0.1\n 25DEC2013     22.8-0.4     25.2-0.1     26.4-0.2     28.5 0.1\n 01JAN2014     23.7 0.0     25.2-0.2     26.3-0.3     28.2-0.2\n 08JAN2014     24.2 0.1     25.1-0.5     26.0-0.5     28.2-0.2\n 15JAN2014     25.0 0.6     25.2-0.4     25.9-0.7     28.0-0.3\n 22JAN2014     25.4 0.6     25.6-0.2     26.2-0.4     28.1-0.1\n 29JAN2014     25.4 0.2     25.3-0.7     25.9-0.7     27.9-0.2\n 05FEB2014     25.1-0.4     25.3-0.8     25.9-0.7     28.1 0.0\n 12FEB2014     25.4-0.6     25.4-0.9     26.2-0.5     28.5 0.4\n 19FEB2014     25.1-1.1     25.7-0.7     26.4-0.4     28.5 0.4\n 26FEB2014     25.5-0.7     26.0-0.6     26.3-0.6     28.2 0.1\n 05MAR2014     26.1-0.3     26.4-0.5     26.6-0.4     28.5 0.3\n 12MAR2014     25.8-0.6     26.8-0.3     26.8-0.4     28.7 0.6\n 19MAR2014     25.2-1.2     27.3 0.1     27.4 0.1     28.8 0.6\n 26MAR2014     25.4-0.7     27.6 0.4     27.6 0.2     29.0 0.7\n 02APR2014     25.2-0.7     27.8 0.5     27.8 0.3     29.0 0.7\n 09APR2014     24.9-0.8     27.6 0.1     27.9 0.2     29.1 0.7\n 16APR2014     24.8-0.7     27.7 0.2     28.0 0.2     29.1 0.6\n 23APR2014     25.3 0.1     27.8 0.4     28.2 0.4     29.2 0.6\n 30APR2014     25.7 0.8     27.8 0.5     28.2 0.4     29.3 0.7\n 07MAY2014     25.8 1.2     27.8 0.6     28.3 0.5     29.5 0.8\n 14MAY2014     25.5 1.3     27.7 0.6     28.3 0.4     29.5 0.8\n 21MAY2014     25.4 1.5     27.6 0.7     28.3 0.5     29.6 0.8\n 28MAY2014     25.3 1.6     27.6 0.7     28.4 0.6     29.7 0.9\n 04JUN2014     24.8 1.4     27.5 0.8     28.3 0.5     29.6 0.8\n 11JUN2014     24.6 1.6     27.3 0.8     28.1 0.4     29.5 0.6\n 18JUN2014     24.8 2.1     27.4 1.0     28.1 0.5     29.4 0.5\n 25JUN2014     24.0 1.6     27.2 1.0     28.0 0.5     29.3 0.5\n 02JUL2014     23.6 1.4     27.0 1.0     27.8 0.4     29.1 0.3\n 09JUL2014     23.0 1.1     26.5 0.6     27.6 0.3     29.1 0.3\n 16JUL2014     23.1 1.5     26.2 0.6     27.4 0.2     29.1 0.4\n 23JUL2014     22.9 1.6     26.0 0.5     27.1-0.1     28.9 0.2\n 30JUL2014     21.8 0.6     25.5 0.2     26.9-0.1     29.0 0.3\n 06AUG2014     22.2 1.2     25.6 0.4     27.0 0.0     29.2 0.5\n 13AUG2014     21.9 1.2     25.5 0.5     26.9 0.0     29.0 0.4\n 20AUG2014     22.1 1.4     25.5 0.5     27.1 0.3     29.1 0.4\n 27AUG2014     21.3 0.8     25.4 0.4     27.2 0.4     29.2 0.5\n 03SEP2014     21.7 1.2     25.3 0.4     27.1 0.4     29.2 0.5\n 10SEP2014     21.1 0.7     25.3 0.4     27.3 0.5     29.4 0.7\n 17SEP2014     21.0 0.7     25.2 0.4     27.2 0.5     29.4 0.8\n 24SEP2014     21.2 0.8     25.4 0.5     27.1 0.4     29.3 0.6\n 01OCT2014     21.7 1.1     25.4 0.5     27.1 0.3     29.2 0.5\n 08OCT2014     21.3 0.6     25.5 0.6     27.1 0.4     29.1 0.5\n 15OCT2014     21.5 0.7     25.5 0.5     27.2 0.5     29.4 0.7\n 22OCT2014     21.8 0.8     25.8 0.8     27.2 0.5     29.4 0.7\n 29OCT2014     21.8 0.6     25.8 0.9     27.3 0.6     29.4 0.8\n 05NOV2014     21.9 0.5     25.8 0.9     27.4 0.8     29.5 0.9\n 12NOV2014     22.4 0.9     25.8 0.9     27.5 0.8     29.5 0.9\n 19NOV2014     22.6 0.8     26.0 1.0     27.5 0.9     29.5 0.9\n 26NOV2014     22.4 0.4     25.9 0.9     27.6 1.0     29.5 0.9\n 03DEC2014     22.3 0.0     25.8 0.7     27.4 0.8     29.4 0.9\n 10DEC2014     22.8 0.2     26.0 0.9     27.5 0.9     29.4 0.9\n 17DEC2014     22.9 0.1     26.0 0.8     27.4 0.8     29.4 1.0\n 24DEC2014     23.1-0.2     26.0 0.7     27.3 0.7     29.3 0.9\n 31DEC2014     23.6 0.0     25.9 0.6     27.1 0.5     29.2 0.8\n 07JAN2015     23.7-0.2     25.9 0.4     27.0 0.4     29.1 0.7\n 14JAN2015     24.0-0.4     25.9 0.3     27.1 0.5     29.1 0.9\n 21JAN2015     24.3-0.4     26.1 0.3     27.2 0.6     29.2 1.0\n 28JAN2015     24.8-0.3     26.2 0.3     27.2 0.5     29.1 0.9\n 04FEB2015     25.0-0.5     26.2 0.1     27.2 0.5     29.1 0.9\n 11FEB2015     25.1-0.8     26.6 0.3     27.2 0.5     29.0 0.9\n 18FEB2015     26.1-0.1     26.7 0.3     27.3 0.5     29.0 1.0\n 25FEB2015     26.1-0.1     26.8 0.1     27.5 0.6     29.3 1.2\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/KataDiversion.fth",
    "content": "\\ KataDiversion in Forth\n\n\\ -- utils\n\n\\ empty the stack\n: EMPTY\n    DEPTH 0 <> IF BEGIN\n                    DROP DEPTH 0 =\n                  UNTIL\n               THEN ;\n\n\\ power\n: ** ( n1 n2 -- n1_pow_n2 ) 1 SWAP ?DUP IF 0 DO OVER * LOOP THEN NIP ;\n\n\\ compute the highest power of 2 below N.\n\\ e.g. : 31 -> 16, 4 -> 4\n: MAXPOW2 ( n -- log2_n ) DUP 1 < IF 1 ABORT\" Maxpow2 need a positive value.\"\n                               ELSE DUP 1 = IF 1\n                                            ELSE\n                                                1 >R\n                                                BEGIN ( n |R: i=1)\n                                                    DUP DUP I - 2 *\n                                                    ( n n 2*[n-i])\n                                                    R> 2 * >R ( … |R: i*2)\n                                                    > ( n n>2*[n-i] )\n                                                UNTIL\n                                                R> 2 /\n                                            THEN\n                               THEN NIP ;\n\n\\ -- kata\n\n\\ test if the given N has two adjacent 1 bits\n\\ e.g. : 11 -> 1011 -> -1\n\\         9 -> 1001 ->  0\n: ?NOT-TWO-ADJACENT-1-BITS ( n -- bool )\n    \\ the word uses the following algorithm :\n    \\ (stack|return stack)\n    \\ ( A N | X )  A: 0, X: N LOG2\n    \\ loop: if N-X > 0 then A++ else A=0 ; X /= 2\n    \\       return 0 if A=2\n    \\       if X=1 end loop and return -1\n    0 SWAP DUP DUP 0 <> IF\n                            MAXPOW2 >R\n                            BEGIN\n                                DUP I - 0 >= IF \n                                                SWAP DUP 1 = IF 1+ SWAP\n                                                             ELSE DROP 1 SWAP I -\n                                                            THEN\n                                             ELSE NIP 0 SWAP\n                                             THEN\n                                OVER\n                                2 =\n                                I 1 = OR\n                                R> 2 / >R\n                            UNTIL\n                            R> 2DROP\n                            2 <>\n                        ELSE 2DROP INVERT\n                        THEN ;\n\n\\ return the maximum number which can be made with N (given number) bits\n: MAX-NB ( n -- m ) DUP 1 < IF DROP 0 ( 0 )\n                            ELSE \n                                DUP IF DUP 2 SWAP ** NIP 1 - ( 2**n - 1 )\n                                    THEN\n                            THEN ;\n\n\n\\ return the number of numbers which can be made with N (given number) bits\n\\ or less, and which have not two adjacent 1 bits.\n\\ see http://www.codekata.com/2007/01/code_kata_fifte.html\n: HOW-MANY-NB-NOT-TWO-ADJACENT-1-BITS ( n -- m )\n       DUP 1 < IF DUP 0\n               ELSE\n                   0 SWAP\n                   MAX-NB 1 + 0 DO I ?NOT-TWO-ADJACENT-1-BITS - LOOP\n               THEN ;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/asm.fr",
    "content": "\\ Copyright 2013-2014 Lars Brinkhoff\n\n\\ Assembler for x86.\n\n\\ Adds to FORTH vocabulary: ASSEMBLER CODE ;CODE.\n\\ Creates ASSEMBLER vocabulary with: END-CODE and x86 opcodes.\n\n\\ Conventional prefix syntax: \"<source> <destination> <opcode>,\".\n\\ Addressing modes:\n\\ - immediate: \"n #\"\n\\ - direct: n\n\\ - register: <reg>\n\\ - indirect: \"<reg> )\"\n\\ - indirect with displacement: \"n <reg> )#\"\n\\ - indexed: not supported yet\n\nrequire lib/common.fth\nrequire search.fth\n\nvocabulary assembler\nalso assembler definitions\n\n\\ Access to the target image.\n' header,   defer header,  is header,\n' cell   defer cell   is cell\n' dp   defer dp   is dp\n0 value delta\n\n: aligned   cell + 1 - cell negate nand invert ;\n: align   dp @ aligned dp ! ;\n: allot   dp +! ;\n: here   dp @ ;\n: cells   cell * ;\n: c!   delta + c! ;\n: c,   here c!  1 allot ;\n: h,   dup c,  8 rshift c, ;\n: ,   dup h,  16 rshift h, ;\n\nbase @  hex\n\n\\ This constant signals that an operand is not a direct address.\ndeadbeef constant -addr\n\n\\ Assembler state.\nvariable opcode\nvariable d\nvariable s\nvariable dir?\nvariable mrrm   defer ?mrrm,\nvariable sib    defer ?sib,\nvariable disp   defer ?disp,\nvariable imm    defer ?imm,\ndefer imm,\ndefer immediate-opcode\ndefer reg\ndefer ?opsize\n\n\\ Set opcode.  And destination: register or memory.\n: opcode!   3@ is immediate-opcode >r opcode ! ;\n: !reg   dir? @ if 2 d ! then dir? off ;\n: !mem   dir? off ;\n\n\\ Set bits in mod/reg/rm byte.\n: -mrrm   ['] nop is ?mrrm, ;\n: mod!   mrrm c0 !bits ;\n: reg@   mrrm 38 @bits ;\n: reg!   mrrm 38 !bits ;\n: rm@   mrrm 7 @bits ;\n: rm!   rm@ 3 lshift reg!  mrrm 7 !bits ;\n: reg>opcode   rm@ opcode 07 !bits ;\n: opcode>reg   opcode @ dup 3 rshift rm!  8 rshift opcode ! ;\n\n\\ Write parts of instruction to memory.\n: ds   d @ s @ + ;\n: ?twobyte   dup FF > if dup 8 rshift c, then ;\n: opcode,   opcode @ ?twobyte ds + c, ;\n: mrrm,   mrrm @ c, ;\n: sib,   sib @ c, ;\n: imm8,   imm @ c, ;\n: imm16,   imm @ h, ;\n: imm32,   imm @ , ;\n: disp8,   disp @ c, ;\n: disp32,   disp @ , ;\n\n\\ Set operand size.\n: -opsize   2drop r> drop ;\n: opsize!   is imm,  s !  ['] -opsize is ?opsize ;\n: !op8    0 ['] imm8, ?opsize ;\n: !op32   1 ['] imm32, ?opsize ;\n: !op16   1 ['] imm16, ?opsize 66 c, ;\n\n\\ Set SIB byte.\n: !sib   ['] sib, is ?sib, ;\n: sib!   3 lshift + sib !  !sib ;\n\n\\ Set displacement.\n: byte?   -80 80 within ;\n: disp!   is ?disp, disp ! ;\n: !disp8   ['] disp8, disp! ;\n: !disp32   ['] disp32, disp! ;\n: !disp ( a -- u ) dup byte? if !disp8 40 else !disp32 80 then ;\n: -pc   here 5 + negate ;\n: relative   -pc disp +! ;\n\n\\ Set immediate operand.\n: imm!   imm !  ['] imm, is ?imm, ;\n\n\\ Implements addressing modes: register, indirect, indexed, and direct.\n: reg1   rm! !reg ;\n: reg2   3 lshift reg! ;\n: !reg2   ['] reg2 is reg ;\n: ind   dup mod! rm! !mem !reg2 ;\n: ind#   swap !disp + ind ;\n: idx   04 ind  sib! ;\n: idx#   rot !disp 04 + ind  sib! ;\n: addr   !disp32  05 ind ;\n\n\\ Reset assembler state.\n: 0opsize   ['] opsize! is ?opsize ;\n: 0ds   d off  s off ;\n: 0reg   ['] reg1 is reg ;\n: 0mrrm   c0 mrrm !  ['] mrrm, is ?mrrm, ;\n: 0sib   ['] nop is ?sib, ;\n: 0disp   ['] nop is ?disp, ;\n: 0imm   imm off  ['] nop is ?imm,  0 is imm, ;\n: 0asm   0imm 0disp 0reg 0ds 0mrrm 0sib 0opsize  dir? on ;\n\n\\ Enter and exit assembler mode.\n: start-code   also assembler 0asm ;\n: end-code     align previous ;\n\n\\ Implements addressing mode: immediate.\n: imm8?   imm @ byte? ;\n: ?sign-extend   d off  imm8? if 2 d !  ['] imm8, is ?imm, then ;\n: alu#   opcode @ reg! 80 opcode ! ?sign-extend ;\n: mov#   B0 s @ 3 lshift + rm@ + opcode ! 0ds -mrrm ;\n: push#   imm8? if ['] imm8, 6A else ['] imm32, 68 then dup opcode ! rm! is ?imm, ;\n: test#   F6 opcode ! ;\n: imm-op   imm! immediate-opcode ;\n\n\\ Process one operand.  All operands except a direct address\n\\ have the stack picture ( n*x xt -addr ).\n: addr?   dup -addr <> ;\n: op   addr? if addr else drop execute then ;\n\n\\ Define instruction formats.\n: instruction,   opcode! opcode, ?mrrm, ?sib, ?disp, ?imm, 0asm ;\n: mnemonic ( u a \"name\" -- ) create ['] nop 3,  does> instruction, ;\n: format:   create ] !csp  does> mnemonic ;\n: immediate:   ' latestxt >body ! ;\n\n\\ Instruction formats.\nformat: 0op   -mrrm ;\nformat: 1reg   op reg>opcode 0ds -mrrm ;\nformat: 1op   opcode>reg op d off ;\nformat: 2op   op op ;\nformat: 2op-d   op op d off ;\nformat: 2op-ds   op op 0ds ;\nformat: 1addr   op relative -mrrm ;\nformat: 1imm8   !op8 op -mrrm ;\n\n\\ Instruction mnemonics.\n00 2op add,  immediate: alu#\n08 2op or,   immediate: alu#\n0F44 2op-ds cmove,  \\ Todo: other condition codes.\n0FB6 2op-ds movzx,\n0FBE 2op-ds movsx,\n10 2op adc,  immediate: alu#\n18 2op sbb,  immediate: alu#\n20 2op and,  immediate: alu#\n26 0op es,\n28 2op sub,  immediate: alu#\n2E 0op cs,\n30 2op xor,  immediate: alu#\n36 0op ss,\n38 2op cmp,  immediate: alu#\n3E 0op ds,\n50 1reg push,  immediate: push#\n58 1reg pop,\n64 0op fs,\n65 0op gs,\n\\ 70 jcc\n84 2op-d test,   immediate: test#\n86 2op-d xchg,\n88 2op mov,  immediate: mov#\n8D 2op-ds lea,\n\\ 8F/0 pop, rm\n90 0op nop,\nC3 0op ret,\n\\ C6/0 immediate mov to r/m\n\\ C7/0 immediate mov to r/m\nCD 1imm8 int,\nE8 1addr call,\nE9 1addr jmp,\n\\ EB jmp rel8\nF0 0op lock,\nF2 0op rep,\nF3 0op repz,\nF4 0op hlt,\nF5 0op cmc,\nF610 1op not,\nF618 1op neg,\nF8 0op clc,\nF9 0op stc,\nFA 0op cli,\nFB 0op sti,\nFC 0op cld,\nFD 0op std,\n\\ FE 0 inc rm\n\\ FF 1 dec rm\n\\ FF 2 call rm\n\\ FF 4 jmp rm\n\\ FF 6 push rm\n\n: sp?   dup 4 = ;\n\n\\ Addressing mode syntax: immediate, indirect, and displaced indirect.\n: #   ['] imm-op -addr ;\n: )   2drop  sp? if 4 ['] idx else ['] ind then -addr  0reg 0opsize ;\n: )#   2drop  sp? if 4 ['] idx# else ['] ind# then -addr  0reg 0opsize ;\n\n\\ Define registers.\n: reg8    create ,  does> @ ['] reg -addr !op8 ;\n: reg16   create ,  does> @ ['] reg -addr !op16 ;\n: reg32   create ,  does> @ ['] reg -addr !op32 ;\n: reg:    dup reg8 dup reg16 dup reg32 1+ ;\n\n\\ Register names.\n0\nreg: al ax eax   reg: cl cx ecx   reg: dl dx edx   reg: bl bx ebx\nreg: ah sp esp   reg: ch bp ebp   reg: dh si esi   reg: bh di edi\ndrop\n\n\\ Runtime for ;CODE.  CODE! is defined elsewhere.\n: (;code)   r> code! ;\n\nbase !  only forth definitions  also assembler\n\n\\ Standard assembler entry points.\n: code    parse-name header, ?code, start-code  ;\n: ;code   postpone (;code) reveal postpone [ ?csp start-code ; immediate\n\n0asm\nprevious\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/bitmap.frt",
    "content": "\\ Bit arrays.\n: bits ( u1 -- u2 ) 7 + 3 rshift ;\n: bitmap ( u \"name\" -- ) create bits here over erase allot\n   does> ( u -- a x ) over 3 rshift +  1 rot 7 and lshift ;\n: bit@ ( a x -- f ) swap c@ and ;\n: 1bit ( a x -- ) over c@ or swap c! ;\n: 0bit ( a x -- ) invert over c@ and swap c! ;\n: bit! ( f a x -- ) rot if 1bit else 0bit then ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/block.fth",
    "content": "( Block words. )\n\nvariable blk\nvariable current-block\n\n: block ( n -- addr )\n    current-block ! 0 ;\n\n: buffer ( n -- addr )\n    current-block ! 0 ;\n\n\\ evaluate (extended semantics)\n\\ flush ( -- )\n\n: load ( ... n -- ... )\n    dup current-block !\n    blk !\n    save-input\n    0 >in !\n    blk @ block ''source !  1024 ''#source !\n    ( interpret )\n    restore-input ;\n\n\\ save-buffers ( -- )\n\\ update ( -- )\n\n( Block extension words. )\n\n\\ empty-buffers ( -- )\n\nvariable  scr\n\n: list ( n -- )\n    dup scr !\n    dup current-block !\n    block 1024 bounds do i @ emit loop ;\n\n\\ refill (extended semantics)\n\n: thru ( x y -- )   +1 swap do i load loop ;\n\n\\ \\ (extended semantics)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/core-ext.fth",
    "content": "\\ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff\n\n\\ Kernel: #tib\n\\ TODO:   .r\n\n: .( ( \"<string><paren>\" -- )\n    [char] ) parse type ; immediate\n\n: 0<> ( n -- flag )   0 <> ;\n\n: 0> ( n -- flag )   0 > ;\n\n\\ Kernel: 2>r\n\n: 2r> ( -- x1 x2 ) ( R: x1 x2 -- )   r> r> r> rot >r swap ;\n\n: 2r@ ( -- x1 x2 ) ( R: x1 x2 -- x1 x2 )   2r> 2dup 2>r ;\n\n: :noname   align here  0 c, 15 allot  lastxt dup @ , !\n            [ ' enter >code @ ] literal , 0 , ] lastxt @ ;\n\n\\ Kernel: <>\n\n\\ : ?do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n\\     here  postpone 2>r  unresolved branch  here ;\n\n: again ( -- ) ( C: dest -- )\n    postpone branch , ; immediate\n\n: string+ ( caddr -- addr )\n    count + aligned ;\n\n: (c\") ( -- caddr ) ( R: ret1 -- ret2 )\n    r> dup string+ >r ;\n\n: c\" ( \"<string><quote>\" -- caddr )\n    postpone (c\")  [char] \" parse  dup c,  string, ; immediate\n\n: case ( -- ) ( C: -- case-sys )\n    0 ;\n\n: compile, ( xt -- )\n    , ;\n\n\\ TODO: convert\n\n: endcase ( x -- ) ( C: case-sys -- )\n    0 do  postpone then  loop\n    postpone drop ;\n\n: endof ( -- ) ( C: case-sys1 of-sys -- case-sys2 )\n    postpone else  swap 1+ ;\n\n\\ TODO: erase\n\\ TODO: expect\n\n: false ( -- 0 )\n    0 ;\n\n: hex ( -- )\n    16 base ! ;\n\n\\ TODO:   marker\n\\ Kernel: nip\n\n: of ( x x -- | x y -- x ) ( C: -- of-sys )\n    postpone over  postpone =  postpone if  postpone drop ;\n\n\\ Kernel: pad\n\\ Kernel: parse\n\n: pick ( xn ... x0 n -- xn ... x0 xn )\n    2 + cells 'SP @ + @ ;\n\n: query ( -- )\n    tib ''source !  #tib ''#source !  0 'source-id !\n    refill drop ;\n\n\\ Kernel: refill\n\\ Kernel: restore-input\n\n\\ TODO: roll ( xn xn-1 ... x0 n -- xn-1 ... x0 xn ) ;\n\n\\ Kernel: save-input\n\\ Kernel: source-id\n\\ TODO:   span\n\\ Kernel: tib\n\n: to ( x \"word\" -- )\n    ' >body , ;\n\n: true ( -- -1 )\n    -1 ;\n\n: tuck ( x y -- y x y )\n    swap over ;\n\n\\ TODO: u.r\n\n: u> ( x y -- flag )\n    2dup u< if 2drop false else <> then ;\n\n\\ TODO: unused\n\n: value ( x \"word\" -- )\n    create ,\n  does> ( -- x )\n    @ ;\n\n: within   over - >r - r> u< ;\n\n\\ TODO: [compile]\n\n\\ Kernel: \\\n\n\\ ----------------------------------------------------------------------\n\n( Forth2012 core extension words. )\n\n\\ TODO: action-of\n\n\\ TODO: buffer:\n\n: defer   create ['] abort ,  does> @ execute ;\n\n: defer! ( xt2 xt1 -- )   >body ! ;\n\n: defer@ ( xt1 -- xt2 )   >body @ ;\n\n\\ TODO: holds\n\n: is ( xt \"word\" -- )   ' defer! ;\n\n\\ TODO: parse-name\n\n\\ TODO: s\\\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/core.f",
    "content": ": immediate   lastxt @ dup c@ negate swap c! ;\n\n: \\   source nip >in ! ; immediate \\ Copyright 2004, 2012 Lars Brinkhoff\n\n: char \\ ( \"word\" -- char )\n    bl-word here 1+ c@ ;\n\n: ahead  here 0 , ;\n\n: resolve   here swap ! ;\n\n: '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;\n\n: postpone-nonimmediate   [ ' literal , ' compile, ] literal , ;\n\n: create   dovariable_code header, reveal ;\n\ncreate postponers\n    ' postpone-nonimmediate ,\n    ' abort ,\n    ' , ,\n\n: word \\ ( char \"<chars>string<char>\" -- caddr )\n    drop bl-word here ;\n\n: postpone \\ ( C: \"word\" -- )\n    bl word find 1+ cells  postponers + @ execute ; immediate\n\n: unresolved \\ ( C: \"word\" -- orig )\n    postpone postpone  postpone ahead ; immediate\n\n: chars \\ ( n1 -- n2 )\n    ;\n\n: else \\ ( -- ) ( C: orig1 -- orig2 )\n    unresolved branch swap resolve ; immediate\n\n: if \\ ( flag -- ) ( C: -- orig )\n    unresolved 0branch ; immediate\n\n: then \\ ( -- ) ( C: orig -- )\n    resolve ; immediate\n\n: [char] \\ ( \"word\" -- )\n    char  postpone literal ; immediate\n\n: (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ;\n\n: does>   postpone (does>) ; immediate\n\n: begin \\ ( -- ) ( C: -- dest )\n    here ; immediate\n\n: while \\ ( x -- ) ( C: dest -- orig dest )\n    unresolved 0branch swap ; immediate\n\n: repeat \\ ( -- ) ( C: orig dest -- )\n    postpone branch ,  resolve ; immediate\n\n: until \\ ( x -- ) ( C: dest -- )\n    postpone 0branch , ; immediate\n\n: recurse   lastxt @ compile, ; immediate\n\n: pad \\ ( -- addr )\n    here 1024 + ;\n\n: parse \\ ( char \"string<char>\" -- addr n )\n    pad >r  begin\n\tsource? if <source 2dup <> else 0 0 then\n    while\n\tr@ c!  r> 1+ >r\n    repeat  2drop  pad r> over - ;\n\n: ( \\ ( \"string<paren>\" -- )\n    [ char ) ] literal parse 2drop ; immediate\n    \\ TODO: If necessary, refill and keep parsing.\n\n: string, ( addr n -- )\n    here over allot align  swap cmove ;\n\n: (s\") ( -- addr n ) ( R: ret1 -- ret2 )\n    r> dup @ swap cell+ 2dup + aligned >r swap ;\n\ncreate squote   128 allot\n\n: s\" ( \"string<quote>\" -- addr n )\n    state @ if\n\tpostpone (s\")  [char] \" parse  dup ,  string,\n    else\n\t[char] \" parse  >r squote r@ cmove  squote r>\n    then ; immediate\n\n: (abort\") ( ... addr n -- ) ( R: ... -- )\n    cr type cr abort ;\n\n: abort\" ( ... x \"string<quote>\" -- ) ( R: ... -- )\n    postpone if  postpone s\"  postpone (abort\")  postpone then ; immediate\n\n\\ ----------------------------------------------------------------------\n\n( Core words. )\n\n\\ TODO: #\n\\ TODO: #>\n\\ TODO: #s\n\n: and  ( x y -- x&y )   nand invert ;\n\n: *   1 2>r 0 swap begin r@ while\n         r> r> swap 2dup dup + 2>r and if swap over + swap then dup +\n      repeat r> r> 2drop drop ;\n\n\\ TODO: */mod\n\n: +loop ( -- ) ( C: nest-sys -- )\n    postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate\n\n: space   bl emit ;\n\n: ?.-  dup 0 < if [char] - emit negate then ;\n\n: digit   [char] 0 + emit ;\n\n: (.)   base @ /mod  ?dup if recurse then  digit ;\n\n: .\" ( \"string<quote>\" -- )   postpone s\"  postpone type ; immediate\n\n: . ( x -- )   ?.- (.) space ;\n\n: postpone-number ( caddr -- )\n    0 0 rot count >number dup 0= if\n\t2drop nip\n\tpostpone (literal)  postpone (literal)  postpone ,\n\tpostpone literal  postpone ,\n    else\n\t.\" Undefined: \" type cr abort\n    then ;\n\n' postpone-number  postponers cell+  !\n\n: / ( x y -- x/y )   /mod nip ;\n\n: 0< ( n -- flag )   0 < ;\n\n: 1- ( n -- n-1 )   -1 + ;\n\n: 2! ( x1 x2 addr -- )   swap over ! cell+ ! ;\n\n: 2* ( n -- 2n )   dup + ;\n\n\\ Kernel: 2/\n\n: 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ;\n\n\\ Kernel: 2drop\n\\ Kernel: 2dup\n\n\\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )\n\\           3 pick 3 pick ;\n\n\\ TODO: 2swap\n\n\\ TODO: <#\n\n: abs ( n -- |n| )\n    dup 0< if negate then ;\n\n\\ TODO: accept\n\n: c, ( n -- )\n    here c!  1 chars allot ;\n\n: char+ ( n1 -- n2 )\n    1+ ;\n\n: constant   create , does> @ ;\n\n: decimal ( -- )\n    10 base ! ;\n\n: depth ( -- n )\n    data_stack 100 cells +  'SP @  - /cell /  2 - ;\n\n: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n    postpone 2>r  here ; immediate\n\n\\ TODO: environment?\n\\ TODO: evaluate\n\\ TODO: fill\n\\ TODO: fm/mod )\n\\ TODO: hold\n\n: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )\n    'RP @ 3 cells + @ ;\n\n\\ TODO: leave\n\n: loop ( -- ) ( C: nest-sys -- )\n    postpone 1  postpone (+loop)\n    postpone 0branch  ,\n    postpone unloop ; immediate\n\n: lshift   begin ?dup while 1- swap dup + swap repeat ;\n\n: rshift   1 begin over while dup + swap 1- swap repeat nip\n           2>r 0 1 begin r@ while\n              r> r> 2dup swap dup + 2>r and if swap over + swap then dup +\n           repeat r> r> 2drop drop ;\n\n: max ( x y -- max[x,y] )\n    2dup > if drop else nip then ;\n\n\\ Kernel: min\n\\ TODO:   mod\n\\ TODO:   move\n\n: (quit) ( R: ... -- )\n    return_stack 100 cells + 'RP !\n    0 'source-id !  tib ''source !  #tib ''#source !\n    postpone [\n    begin\n\trefill\n    while\n\tinterpret  state @ 0= if .\" ok\" cr then\n    repeat\n    bye ;\n\n' (quit)  ' quit >body cell+  !\n\n\\ TODO: s>d\n\\ TODO: sign\n\\ TODO: sm/rem\n\n: spaces ( n -- )\n    0 do space loop ;\n\n\\ TODO: u.\n\n: signbit ( -- n )   -1 1 rshift invert ;\n\n: xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ;\n\n: u<  ( x y -- flag )  signbit xor swap signbit xor > ;\n\n\\ TODO: um/mod\n\n: variable ( \"word\" -- )\n    create /cell allot ;\n\n: ['] \\ ( C: \"word\" -- )\n    ' postpone literal ; immediate\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/core.for",
    "content": ": immediate   lastxt @ dup c@ negate swap c! ;\n\n: \\   source nip >in ! ; immediate \\ Copyright 2004, 2012 Lars Brinkhoff\n\n: char \\ ( \"word\" -- char )\n    bl-word here 1+ c@ ;\n\n: ahead  here 0 , ;\n\n: resolve   here swap ! ;\n\n: '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;\n\n: postpone-nonimmediate   [ ' literal , ' compile, ] literal , ;\n\n: create   dovariable_code header, reveal ;\n\ncreate postponers\n    ' postpone-nonimmediate ,\n    ' abort ,\n    ' , ,\n\n: word \\ ( char \"<chars>string<char>\" -- caddr )\n    drop bl-word here ;\n\n: postpone \\ ( C: \"word\" -- )\n    bl word find 1+ cells  postponers + @ execute ; immediate\n\n: unresolved \\ ( C: \"word\" -- orig )\n    postpone postpone  postpone ahead ; immediate\n\n: chars \\ ( n1 -- n2 )\n    ;\n\n: else \\ ( -- ) ( C: orig1 -- orig2 )\n    unresolved branch swap resolve ; immediate\n\n: if \\ ( flag -- ) ( C: -- orig )\n    unresolved 0branch ; immediate\n\n: then \\ ( -- ) ( C: orig -- )\n    resolve ; immediate\n\n: [char] \\ ( \"word\" -- )\n    char  postpone literal ; immediate\n\n: (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ;\n\n: does>   postpone (does>) ; immediate\n\n: begin \\ ( -- ) ( C: -- dest )\n    here ; immediate\n\n: while \\ ( x -- ) ( C: dest -- orig dest )\n    unresolved 0branch swap ; immediate\n\n: repeat \\ ( -- ) ( C: orig dest -- )\n    postpone branch ,  resolve ; immediate\n\n: until \\ ( x -- ) ( C: dest -- )\n    postpone 0branch , ; immediate\n\n: recurse   lastxt @ compile, ; immediate\n\n: pad \\ ( -- addr )\n    here 1024 + ;\n\n: parse \\ ( char \"string<char>\" -- addr n )\n    pad >r  begin\n\tsource? if <source 2dup <> else 0 0 then\n    while\n\tr@ c!  r> 1+ >r\n    repeat  2drop  pad r> over - ;\n\n: ( \\ ( \"string<paren>\" -- )\n    [ char ) ] literal parse 2drop ; immediate\n    \\ TODO: If necessary, refill and keep parsing.\n\n: string, ( addr n -- )\n    here over allot align  swap cmove ;\n\n: (s\") ( -- addr n ) ( R: ret1 -- ret2 )\n    r> dup @ swap cell+ 2dup + aligned >r swap ;\n\ncreate squote   128 allot\n\n: s\" ( \"string<quote>\" -- addr n )\n    state @ if\n\tpostpone (s\")  [char] \" parse  dup ,  string,\n    else\n\t[char] \" parse  >r squote r@ cmove  squote r>\n    then ; immediate\n\n: (abort\") ( ... addr n -- ) ( R: ... -- )\n    cr type cr abort ;\n\n: abort\" ( ... x \"string<quote>\" -- ) ( R: ... -- )\n    postpone if  postpone s\"  postpone (abort\")  postpone then ; immediate\n\n\\ ----------------------------------------------------------------------\n\n( Core words. )\n\n\\ TODO: #\n\\ TODO: #>\n\\ TODO: #s\n\n: and  ( x y -- x&y )   nand invert ;\n\n: *   1 2>r 0 swap begin r@ while\n         r> r> swap 2dup dup + 2>r and if swap over + swap then dup +\n      repeat r> r> 2drop drop ;\n\n\\ TODO: */mod\n\n: +loop ( -- ) ( C: nest-sys -- )\n    postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate\n\n: space   bl emit ;\n\n: ?.-  dup 0 < if [char] - emit negate then ;\n\n: digit   [char] 0 + emit ;\n\n: (.)   base @ /mod  ?dup if recurse then  digit ;\n\n: .\" ( \"string<quote>\" -- )   postpone s\"  postpone type ; immediate\n\n: . ( x -- )   ?.- (.) space ;\n\n: postpone-number ( caddr -- )\n    0 0 rot count >number dup 0= if\n\t2drop nip\n\tpostpone (literal)  postpone (literal)  postpone ,\n\tpostpone literal  postpone ,\n    else\n\t.\" Undefined: \" type cr abort\n    then ;\n\n' postpone-number  postponers cell+  !\n\n: / ( x y -- x/y )   /mod nip ;\n\n: 0< ( n -- flag )   0 < ;\n\n: 1- ( n -- n-1 )   -1 + ;\n\n: 2! ( x1 x2 addr -- )   swap over ! cell+ ! ;\n\n: 2* ( n -- 2n )   dup + ;\n\n\\ Kernel: 2/\n\n: 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ;\n\n\\ Kernel: 2drop\n\\ Kernel: 2dup\n\n\\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )\n\\           3 pick 3 pick ;\n\n\\ TODO: 2swap\n\n\\ TODO: <#\n\n: abs ( n -- |n| )\n    dup 0< if negate then ;\n\n\\ TODO: accept\n\n: c, ( n -- )\n    here c!  1 chars allot ;\n\n: char+ ( n1 -- n2 )\n    1+ ;\n\n: constant   create , does> @ ;\n\n: decimal ( -- )\n    10 base ! ;\n\n: depth ( -- n )\n    data_stack 100 cells +  'SP @  - /cell /  2 - ;\n\n: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n    postpone 2>r  here ; immediate\n\n\\ TODO: environment?\n\\ TODO: evaluate\n\\ TODO: fill\n\\ TODO: fm/mod )\n\\ TODO: hold\n\n: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )\n    'RP @ 3 cells + @ ;\n\n\\ TODO: leave\n\n: loop ( -- ) ( C: nest-sys -- )\n    postpone 1  postpone (+loop)\n    postpone 0branch  ,\n    postpone unloop ; immediate\n\n: lshift   begin ?dup while 1- swap dup + swap repeat ;\n\n: rshift   1 begin over while dup + swap 1- swap repeat nip\n           2>r 0 1 begin r@ while\n              r> r> 2dup swap dup + 2>r and if swap over + swap then dup +\n           repeat r> r> 2drop drop ;\n\n: max ( x y -- max[x,y] )\n    2dup > if drop else nip then ;\n\n\\ Kernel: min\n\\ TODO:   mod\n\\ TODO:   move\n\n: (quit) ( R: ... -- )\n    return_stack 100 cells + 'RP !\n    0 'source-id !  tib ''source !  #tib ''#source !\n    postpone [\n    begin\n\trefill\n    while\n\tinterpret  state @ 0= if .\" ok\" cr then\n    repeat\n    bye ;\n\n' (quit)  ' quit >body cell+  !\n\n\\ TODO: s>d\n\\ TODO: sign\n\\ TODO: sm/rem\n\n: spaces ( n -- )\n    0 do space loop ;\n\n\\ TODO: u.\n\n: signbit ( -- n )   -1 1 rshift invert ;\n\n: xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ;\n\n: u<  ( x y -- flag )  signbit xor swap signbit xor > ;\n\n\\ TODO: um/mod\n\n: variable ( \"word\" -- )\n    create /cell allot ;\n\n: ['] \\ ( C: \"word\" -- )\n    ' postpone literal ; immediate\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/core.fs",
    "content": ": immediate   lastxt @ dup c@ negate swap c! ;\n\n: \\   source nip >in ! ; immediate \\ Copyright 2004, 2012 Lars Brinkhoff\n\n: char \\ ( \"word\" -- char )\n    bl-word here 1+ c@ ;\n\n: ahead  here 0 , ;\n\n: resolve   here swap ! ;\n\n: '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;\n\n: postpone-nonimmediate   [ ' literal , ' compile, ] literal , ;\n\n: create   dovariable_code header, reveal ;\n\ncreate postponers\n    ' postpone-nonimmediate ,\n    ' abort ,\n    ' , ,\n\n: word \\ ( char \"<chars>string<char>\" -- caddr )\n    drop bl-word here ;\n\n: postpone \\ ( C: \"word\" -- )\n    bl word find 1+ cells  postponers + @ execute ; immediate\n\n: unresolved \\ ( C: \"word\" -- orig )\n    postpone postpone  postpone ahead ; immediate\n\n: chars \\ ( n1 -- n2 )\n    ;\n\n: else \\ ( -- ) ( C: orig1 -- orig2 )\n    unresolved branch swap resolve ; immediate\n\n: if \\ ( flag -- ) ( C: -- orig )\n    unresolved 0branch ; immediate\n\n: then \\ ( -- ) ( C: orig -- )\n    resolve ; immediate\n\n: [char] \\ ( \"word\" -- )\n    char  postpone literal ; immediate\n\n: (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ;\n\n: does>   postpone (does>) ; immediate\n\n: begin \\ ( -- ) ( C: -- dest )\n    here ; immediate\n\n: while \\ ( x -- ) ( C: dest -- orig dest )\n    unresolved 0branch swap ; immediate\n\n: repeat \\ ( -- ) ( C: orig dest -- )\n    postpone branch ,  resolve ; immediate\n\n: until \\ ( x -- ) ( C: dest -- )\n    postpone 0branch , ; immediate\n\n: recurse   lastxt @ compile, ; immediate\n\n: pad \\ ( -- addr )\n    here 1024 + ;\n\n: parse \\ ( char \"string<char>\" -- addr n )\n    pad >r  begin\n\tsource? if <source 2dup <> else 0 0 then\n    while\n\tr@ c!  r> 1+ >r\n    repeat  2drop  pad r> over - ;\n\n: ( \\ ( \"string<paren>\" -- )\n    [ char ) ] literal parse 2drop ; immediate\n    \\ TODO: If necessary, refill and keep parsing.\n\n: string, ( addr n -- )\n    here over allot align  swap cmove ;\n\n: (s\") ( -- addr n ) ( R: ret1 -- ret2 )\n    r> dup @ swap cell+ 2dup + aligned >r swap ;\n\ncreate squote   128 allot\n\n: s\" ( \"string<quote>\" -- addr n )\n    state @ if\n\tpostpone (s\")  [char] \" parse  dup ,  string,\n    else\n\t[char] \" parse  >r squote r@ cmove  squote r>\n    then ; immediate\n\n: (abort\") ( ... addr n -- ) ( R: ... -- )\n    cr type cr abort ;\n\n: abort\" ( ... x \"string<quote>\" -- ) ( R: ... -- )\n    postpone if  postpone s\"  postpone (abort\")  postpone then ; immediate\n\n\\ ----------------------------------------------------------------------\n\n( Core words. )\n\n\\ TODO: #\n\\ TODO: #>\n\\ TODO: #s\n\n: and  ( x y -- x&y )   nand invert ;\n\n: *   1 2>r 0 swap begin r@ while\n         r> r> swap 2dup dup + 2>r and if swap over + swap then dup +\n      repeat r> r> 2drop drop ;\n\n\\ TODO: */mod\n\n: +loop ( -- ) ( C: nest-sys -- )\n    postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate\n\n: space   bl emit ;\n\n: ?.-  dup 0 < if [char] - emit negate then ;\n\n: digit   [char] 0 + emit ;\n\n: (.)   base @ /mod  ?dup if recurse then  digit ;\n\n: .\" ( \"string<quote>\" -- )   postpone s\"  postpone type ; immediate\n\n: . ( x -- )   ?.- (.) space ;\n\n: postpone-number ( caddr -- )\n    0 0 rot count >number dup 0= if\n\t2drop nip\n\tpostpone (literal)  postpone (literal)  postpone ,\n\tpostpone literal  postpone ,\n    else\n\t.\" Undefined: \" type cr abort\n    then ;\n\n' postpone-number  postponers cell+  !\n\n: / ( x y -- x/y )   /mod nip ;\n\n: 0< ( n -- flag )   0 < ;\n\n: 1- ( n -- n-1 )   -1 + ;\n\n: 2! ( x1 x2 addr -- )   swap over ! cell+ ! ;\n\n: 2* ( n -- 2n )   dup + ;\n\n\\ Kernel: 2/\n\n: 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ;\n\n\\ Kernel: 2drop\n\\ Kernel: 2dup\n\n\\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )\n\\           3 pick 3 pick ;\n\n\\ TODO: 2swap\n\n\\ TODO: <#\n\n: abs ( n -- |n| )\n    dup 0< if negate then ;\n\n\\ TODO: accept\n\n: c, ( n -- )\n    here c!  1 chars allot ;\n\n: char+ ( n1 -- n2 )\n    1+ ;\n\n: constant   create , does> @ ;\n\n: decimal ( -- )\n    10 base ! ;\n\n: depth ( -- n )\n    data_stack 100 cells +  'SP @  - /cell /  2 - ;\n\n: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n    postpone 2>r  here ; immediate\n\n\\ TODO: environment?\n\\ TODO: evaluate\n\\ TODO: fill\n\\ TODO: fm/mod )\n\\ TODO: hold\n\n: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )\n    'RP @ 3 cells + @ ;\n\n\\ TODO: leave\n\n: loop ( -- ) ( C: nest-sys -- )\n    postpone 1  postpone (+loop)\n    postpone 0branch  ,\n    postpone unloop ; immediate\n\n: lshift   begin ?dup while 1- swap dup + swap repeat ;\n\n: rshift   1 begin over while dup + swap 1- swap repeat nip\n           2>r 0 1 begin r@ while\n              r> r> 2dup swap dup + 2>r and if swap over + swap then dup +\n           repeat r> r> 2drop drop ;\n\n: max ( x y -- max[x,y] )\n    2dup > if drop else nip then ;\n\n\\ Kernel: min\n\\ TODO:   mod\n\\ TODO:   move\n\n: (quit) ( R: ... -- )\n    return_stack 100 cells + 'RP !\n    0 'source-id !  tib ''source !  #tib ''#source !\n    postpone [\n    begin\n\trefill\n    while\n\tinterpret  state @ 0= if .\" ok\" cr then\n    repeat\n    bye ;\n\n' (quit)  ' quit >body cell+  !\n\n\\ TODO: s>d\n\\ TODO: sign\n\\ TODO: sm/rem\n\n: spaces ( n -- )\n    0 do space loop ;\n\n\\ TODO: u.\n\n: signbit ( -- n )   -1 1 rshift invert ;\n\n: xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ;\n\n: u<  ( x y -- flag )  signbit xor swap signbit xor > ;\n\n\\ TODO: um/mod\n\n: variable ( \"word\" -- )\n    create /cell allot ;\n\n: ['] \\ ( C: \"word\" -- )\n    ' postpone literal ; immediate\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/core.fth",
    "content": ": immediate   lastxt @ dup c@ negate swap c! ;\n\n: \\   source nip >in ! ; immediate \\ Copyright 2004, 2012 Lars Brinkhoff\n\n: char \\ ( \"word\" -- char )\n    bl-word here 1+ c@ ;\n\n: ahead  here 0 , ;\n\n: resolve   here swap ! ;\n\n: '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;\n\n: postpone-nonimmediate   [ ' literal , ' compile, ] literal , ;\n\n: create   dovariable_code header, reveal ;\n\ncreate postponers\n    ' postpone-nonimmediate ,\n    ' abort ,\n    ' , ,\n\n: word \\ ( char \"<chars>string<char>\" -- caddr )\n    drop bl-word here ;\n\n: postpone \\ ( C: \"word\" -- )\n    bl word find 1+ cells  postponers + @ execute ; immediate\n\n: unresolved \\ ( C: \"word\" -- orig )\n    postpone postpone  postpone ahead ; immediate\n\n: chars \\ ( n1 -- n2 )\n    ;\n\n: else \\ ( -- ) ( C: orig1 -- orig2 )\n    unresolved branch swap resolve ; immediate\n\n: if \\ ( flag -- ) ( C: -- orig )\n    unresolved 0branch ; immediate\n\n: then \\ ( -- ) ( C: orig -- )\n    resolve ; immediate\n\n: [char] \\ ( \"word\" -- )\n    char  postpone literal ; immediate\n\n: (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ;\n\n: does>   postpone (does>) ; immediate\n\n: begin \\ ( -- ) ( C: -- dest )\n    here ; immediate\n\n: while \\ ( x -- ) ( C: dest -- orig dest )\n    unresolved 0branch swap ; immediate\n\n: repeat \\ ( -- ) ( C: orig dest -- )\n    postpone branch ,  resolve ; immediate\n\n: until \\ ( x -- ) ( C: dest -- )\n    postpone 0branch , ; immediate\n\n: recurse   lastxt @ compile, ; immediate\n\n: pad \\ ( -- addr )\n    here 1024 + ;\n\n: parse \\ ( char \"string<char>\" -- addr n )\n    pad >r  begin\n\tsource? if <source 2dup <> else 0 0 then\n    while\n\tr@ c!  r> 1+ >r\n    repeat  2drop  pad r> over - ;\n\n: ( \\ ( \"string<paren>\" -- )\n    [ char ) ] literal parse 2drop ; immediate\n    \\ TODO: If necessary, refill and keep parsing.\n\n: string, ( addr n -- )\n    here over allot align  swap cmove ;\n\n: (s\") ( -- addr n ) ( R: ret1 -- ret2 )\n    r> dup @ swap cell+ 2dup + aligned >r swap ;\n\ncreate squote   128 allot\n\n: s\" ( \"string<quote>\" -- addr n )\n    state @ if\n\tpostpone (s\")  [char] \" parse  dup ,  string,\n    else\n\t[char] \" parse  >r squote r@ cmove  squote r>\n    then ; immediate\n\n: (abort\") ( ... addr n -- ) ( R: ... -- )\n    cr type cr abort ;\n\n: abort\" ( ... x \"string<quote>\" -- ) ( R: ... -- )\n    postpone if  postpone s\"  postpone (abort\")  postpone then ; immediate\n\n\\ ----------------------------------------------------------------------\n\n( Core words. )\n\n\\ TODO: #\n\\ TODO: #>\n\\ TODO: #s\n\n: and  ( x y -- x&y )   nand invert ;\n\n: *   1 2>r 0 swap begin r@ while\n         r> r> swap 2dup dup + 2>r and if swap over + swap then dup +\n      repeat r> r> 2drop drop ;\n\n\\ TODO: */mod\n\n: +loop ( -- ) ( C: nest-sys -- )\n    postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate\n\n: space   bl emit ;\n\n: ?.-  dup 0 < if [char] - emit negate then ;\n\n: digit   [char] 0 + emit ;\n\n: (.)   base @ /mod  ?dup if recurse then  digit ;\n\n: .\" ( \"string<quote>\" -- )   postpone s\"  postpone type ; immediate\n\n: . ( x -- )   ?.- (.) space ;\n\n: postpone-number ( caddr -- )\n    0 0 rot count >number dup 0= if\n\t2drop nip\n\tpostpone (literal)  postpone (literal)  postpone ,\n\tpostpone literal  postpone ,\n    else\n\t.\" Undefined: \" type cr abort\n    then ;\n\n' postpone-number  postponers cell+  !\n\n: / ( x y -- x/y )   /mod nip ;\n\n: 0< ( n -- flag )   0 < ;\n\n: 1- ( n -- n-1 )   -1 + ;\n\n: 2! ( x1 x2 addr -- )   swap over ! cell+ ! ;\n\n: 2* ( n -- 2n )   dup + ;\n\n\\ Kernel: 2/\n\n: 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ;\n\n\\ Kernel: 2drop\n\\ Kernel: 2dup\n\n\\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )\n\\           3 pick 3 pick ;\n\n\\ TODO: 2swap\n\n\\ TODO: <#\n\n: abs ( n -- |n| )\n    dup 0< if negate then ;\n\n\\ TODO: accept\n\n: c, ( n -- )\n    here c!  1 chars allot ;\n\n: char+ ( n1 -- n2 )\n    1+ ;\n\n: constant   create , does> @ ;\n\n: decimal ( -- )\n    10 base ! ;\n\n: depth ( -- n )\n    data_stack 100 cells +  'SP @  - /cell /  2 - ;\n\n: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n    postpone 2>r  here ; immediate\n\n\\ TODO: environment?\n\\ TODO: evaluate\n\\ TODO: fill\n\\ TODO: fm/mod )\n\\ TODO: hold\n\n: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )\n    'RP @ 3 cells + @ ;\n\n\\ TODO: leave\n\n: loop ( -- ) ( C: nest-sys -- )\n    postpone 1  postpone (+loop)\n    postpone 0branch  ,\n    postpone unloop ; immediate\n\n: lshift   begin ?dup while 1- swap dup + swap repeat ;\n\n: rshift   1 begin over while dup + swap 1- swap repeat nip\n           2>r 0 1 begin r@ while\n              r> r> 2dup swap dup + 2>r and if swap over + swap then dup +\n           repeat r> r> 2drop drop ;\n\n: max ( x y -- max[x,y] )\n    2dup > if drop else nip then ;\n\n\\ Kernel: min\n\\ TODO:   mod\n\\ TODO:   move\n\n: (quit) ( R: ... -- )\n    return_stack 100 cells + 'RP !\n    0 'source-id !  tib ''source !  #tib ''#source !\n    postpone [\n    begin\n\trefill\n    while\n\tinterpret  state @ 0= if .\" ok\" cr then\n    repeat\n    bye ;\n\n' (quit)  ' quit >body cell+  !\n\n\\ TODO: s>d\n\\ TODO: sign\n\\ TODO: sm/rem\n\n: spaces ( n -- )\n    0 do space loop ;\n\n\\ TODO: u.\n\n: signbit ( -- n )   -1 1 rshift invert ;\n\n: xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ;\n\n: u<  ( x y -- flag )  signbit xor swap signbit xor > ;\n\n\\ TODO: um/mod\n\n: variable ( \"word\" -- )\n    create /cell allot ;\n\n: ['] \\ ( C: \"word\" -- )\n    ' postpone literal ; immediate\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/core1.F",
    "content": ": immediate   lastxt @ dup c@ negate swap c! ;\n\n: \\   source nip >in ! ; immediate \\ Copyright 2004, 2012 Lars Brinkhoff\n\n: char \\ ( \"word\" -- char )\n    bl-word here 1+ c@ ;\n\n: ahead  here 0 , ;\n\n: resolve   here swap ! ;\n\n: '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;\n\n: postpone-nonimmediate   [ ' literal , ' compile, ] literal , ;\n\n: create   dovariable_code header, reveal ;\n\ncreate postponers\n    ' postpone-nonimmediate ,\n    ' abort ,\n    ' , ,\n\n: word \\ ( char \"<chars>string<char>\" -- caddr )\n    drop bl-word here ;\n\n: postpone \\ ( C: \"word\" -- )\n    bl word find 1+ cells  postponers + @ execute ; immediate\n\n: unresolved \\ ( C: \"word\" -- orig )\n    postpone postpone  postpone ahead ; immediate\n\n: chars \\ ( n1 -- n2 )\n    ;\n\n: else \\ ( -- ) ( C: orig1 -- orig2 )\n    unresolved branch swap resolve ; immediate\n\n: if \\ ( flag -- ) ( C: -- orig )\n    unresolved 0branch ; immediate\n\n: then \\ ( -- ) ( C: orig -- )\n    resolve ; immediate\n\n: [char] \\ ( \"word\" -- )\n    char  postpone literal ; immediate\n\n: (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ;\n\n: does>   postpone (does>) ; immediate\n\n: begin \\ ( -- ) ( C: -- dest )\n    here ; immediate\n\n: while \\ ( x -- ) ( C: dest -- orig dest )\n    unresolved 0branch swap ; immediate\n\n: repeat \\ ( -- ) ( C: orig dest -- )\n    postpone branch ,  resolve ; immediate\n\n: until \\ ( x -- ) ( C: dest -- )\n    postpone 0branch , ; immediate\n\n: recurse   lastxt @ compile, ; immediate\n\n: pad \\ ( -- addr )\n    here 1024 + ;\n\n: parse \\ ( char \"string<char>\" -- addr n )\n    pad >r  begin\n\tsource? if <source 2dup <> else 0 0 then\n    while\n\tr@ c!  r> 1+ >r\n    repeat  2drop  pad r> over - ;\n\n: ( \\ ( \"string<paren>\" -- )\n    [ char ) ] literal parse 2drop ; immediate\n    \\ TODO: If necessary, refill and keep parsing.\n\n: string, ( addr n -- )\n    here over allot align  swap cmove ;\n\n: (s\") ( -- addr n ) ( R: ret1 -- ret2 )\n    r> dup @ swap cell+ 2dup + aligned >r swap ;\n\ncreate squote   128 allot\n\n: s\" ( \"string<quote>\" -- addr n )\n    state @ if\n\tpostpone (s\")  [char] \" parse  dup ,  string,\n    else\n\t[char] \" parse  >r squote r@ cmove  squote r>\n    then ; immediate\n\n: (abort\") ( ... addr n -- ) ( R: ... -- )\n    cr type cr abort ;\n\n: abort\" ( ... x \"string<quote>\" -- ) ( R: ... -- )\n    postpone if  postpone s\"  postpone (abort\")  postpone then ; immediate\n\n\\ ----------------------------------------------------------------------\n\n( Core words. )\n\n\\ TODO: #\n\\ TODO: #>\n\\ TODO: #s\n\n: and  ( x y -- x&y )   nand invert ;\n\n: *   1 2>r 0 swap begin r@ while\n         r> r> swap 2dup dup + 2>r and if swap over + swap then dup +\n      repeat r> r> 2drop drop ;\n\n\\ TODO: */mod\n\n: +loop ( -- ) ( C: nest-sys -- )\n    postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate\n\n: space   bl emit ;\n\n: ?.-  dup 0 < if [char] - emit negate then ;\n\n: digit   [char] 0 + emit ;\n\n: (.)   base @ /mod  ?dup if recurse then  digit ;\n\n: .\" ( \"string<quote>\" -- )   postpone s\"  postpone type ; immediate\n\n: . ( x -- )   ?.- (.) space ;\n\n: postpone-number ( caddr -- )\n    0 0 rot count >number dup 0= if\n\t2drop nip\n\tpostpone (literal)  postpone (literal)  postpone ,\n\tpostpone literal  postpone ,\n    else\n\t.\" Undefined: \" type cr abort\n    then ;\n\n' postpone-number  postponers cell+  !\n\n: / ( x y -- x/y )   /mod nip ;\n\n: 0< ( n -- flag )   0 < ;\n\n: 1- ( n -- n-1 )   -1 + ;\n\n: 2! ( x1 x2 addr -- )   swap over ! cell+ ! ;\n\n: 2* ( n -- 2n )   dup + ;\n\n\\ Kernel: 2/\n\n: 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ;\n\n\\ Kernel: 2drop\n\\ Kernel: 2dup\n\n\\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )\n\\           3 pick 3 pick ;\n\n\\ TODO: 2swap\n\n\\ TODO: <#\n\n: abs ( n -- |n| )\n    dup 0< if negate then ;\n\n\\ TODO: accept\n\n: c, ( n -- )\n    here c!  1 chars allot ;\n\n: char+ ( n1 -- n2 )\n    1+ ;\n\n: constant   create , does> @ ;\n\n: decimal ( -- )\n    10 base ! ;\n\n: depth ( -- n )\n    data_stack 100 cells +  'SP @  - /cell /  2 - ;\n\n: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n    postpone 2>r  here ; immediate\n\n\\ TODO: environment?\n\\ TODO: evaluate\n\\ TODO: fill\n\\ TODO: fm/mod )\n\\ TODO: hold\n\n: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )\n    'RP @ 3 cells + @ ;\n\n\\ TODO: leave\n\n: loop ( -- ) ( C: nest-sys -- )\n    postpone 1  postpone (+loop)\n    postpone 0branch  ,\n    postpone unloop ; immediate\n\n: lshift   begin ?dup while 1- swap dup + swap repeat ;\n\n: rshift   1 begin over while dup + swap 1- swap repeat nip\n           2>r 0 1 begin r@ while\n              r> r> 2dup swap dup + 2>r and if swap over + swap then dup +\n           repeat r> r> 2drop drop ;\n\n: max ( x y -- max[x,y] )\n    2dup > if drop else nip then ;\n\n\\ Kernel: min\n\\ TODO:   mod\n\\ TODO:   move\n\n: (quit) ( R: ... -- )\n    return_stack 100 cells + 'RP !\n    0 'source-id !  tib ''source !  #tib ''#source !\n    postpone [\n    begin\n\trefill\n    while\n\tinterpret  state @ 0= if .\" ok\" cr then\n    repeat\n    bye ;\n\n' (quit)  ' quit >body cell+  !\n\n\\ TODO: s>d\n\\ TODO: sign\n\\ TODO: sm/rem\n\n: spaces ( n -- )\n    0 do space loop ;\n\n\\ TODO: u.\n\n: signbit ( -- n )   -1 1 rshift invert ;\n\n: xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ;\n\n: u<  ( x y -- flag )  signbit xor swap signbit xor > ;\n\n\\ TODO: um/mod\n\n: variable ( \"word\" -- )\n    create /cell allot ;\n\n: ['] \\ ( C: \"word\" -- )\n    ' postpone literal ; immediate\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/enum.frt",
    "content": "\\ Implements ENUM.\n\n\\ Double DOES>!\n: enum   create 0 ,  does> create dup @ 1 rot +! ,  does> @ ;\n\n\\ But this is simpler.\n: enum   create 0 ,  does> dup @ constant 1 swap +! ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/hello-forth.forth",
    "content": ": HELLO  ( -- )\n    .\" Hello Forth (forth)!\" ; \n\nHELLO\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/hello-forth.fth",
    "content": ": HELLO  ( -- )\n    .\" Hello Forth (fth)!\" ; \n\nHELLO\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/macros.frt",
    "content": "\\ Simplifies compiling words.\n\n: [[     ; immediate\n: '<>    >in @ ' swap >in ! <> ;\n: (]])   begin dup '<> while postpone postpone repeat drop ;\n: ]]     ['] [[ (]]) ; immediate\n\n( Usage:   : foo ]] dup * [[ ; immediate   : bar 42 foo . ; )\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/tools.4TH",
    "content": "\\ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff\n\n( Tools words. )\n\n: .s ( -- )\n    [char] < emit  depth (.)  .\" > \"\n    'SP @ >r r@ depth 1- cells +\n    begin\n\tdup r@ <>\n    while\n\tdup @ .\n\t/cell -\n    repeat r> 2drop ;\n\n: ?   @ . ;\n\n: c?   c@ . ;\n\n: dump   bounds do i ? /cell +loop cr ;\n\n: cdump   bounds do i c? loop cr ;\n\n: again   postpone branch , ; immediate\n\n: see-find ( caddr -- end xt )\n    >r here lastxt @\n    begin\n\tdup 0= abort\" Undefined word\"\n\tdup r@ word= if r> drop exit then\n\tnip dup >nextxt\n    again ;\n\n: cabs ( char -- |char| )   dup 127 > if 256 swap - then ;\n\n: xt. ( xt -- )\n    ( >name ) count cabs type ;\n\n: xt? ( xt -- flag )\n    >r lastxt @ begin\n\t?dup\n    while\n\tdup r@ = if r> 2drop -1 exit then\n\t>nextxt\n    repeat r> drop 0 ;\n\n: disassemble ( x -- )\n    dup xt? if\n        ( >name ) count\n        dup 127 > if .\" postpone \" then\n        cabs type\n    else\n        .\n    then ;\n\n: .addr  dup . ;\n\n: see-line ( addr -- )\n    cr .\"     ( \" .addr .\" ) \"  @ disassemble ;\n\n: see-word ( end xt -- )\n    >r .\" : \" r@ xt.\n    r@ >body do i see-line /cell +loop\n    .\"  ;\" r> c@ 127 > if .\"  immediate\" then ;\n\n: see   bl word see-find see-word cr ;\n\n: #body   bl word see-find >body - ;\n\n: type-word ( end xt -- flag )\n    xt. space drop 0 ;\n\n: traverse-dictionary ( in.. xt -- out.. )\n    \\ xt execution: ( in.. end xt2 -- in.. 0 | in.. end xt2 -- out.. true )\n    >r  here lastxt @  begin\n\t?dup\n    while\n\tr> 2dup >r >r execute\n\tif r> r> 2drop exit then\n\tr> dup >nextxt\n    repeat r> 2drop ;\n\n: words ( -- )\n    ['] type-word traverse-dictionary cr ;\n\n\\ ----------------------------------------------------------------------\n\n( Tools extension words. )\n\n\\ ;code\n\n\\ assembler\n\n\\ in kernel: bye\n\n\\ code\n\n\\ cs-pick\n\n\\ cs-roll\n\n\\ editor\n\n: forget   ' dup >nextxt lastxt !  'here !  reveal ;\n\n\\ Kernel: state\n\n\\ [else]\n\n\\ [if]\n\n\\ [then]\n\n\\ ----------------------------------------------------------------------\n\n( Forth2012 tools extension words. )\n\n\\ TODO: n>r\n\n\\ TODO: nr>\n\n\\ TODO: synonym\n\n: [undefined]   bl-word find nip 0= ; immediate\n\n: [defined]   postpone [undefined] invert ; immediate\n\n\\ ----------------------------------------------------------------------\n\n: @+ ( addr -- addr+/cell x )   dup cell+ swap @ ;\n\n: !+ ( x addr -- addr+/cell )   tuck ! cell+ ;\n\n: -rot   swap >r swap r> ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Forth/tools.fth",
    "content": "\\ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff\n\n( Tools words. )\n\n: .s ( -- )\n    [char] < emit  depth (.)  .\" > \"\n    'SP @ >r r@ depth 1- cells +\n    begin\n\tdup r@ <>\n    while\n\tdup @ .\n\t/cell -\n    repeat r> 2drop ;\n\n: ?   @ . ;\n\n: c?   c@ . ;\n\n: dump   bounds do i ? /cell +loop cr ;\n\n: cdump   bounds do i c? loop cr ;\n\n: again   postpone branch , ; immediate\n\n: see-find ( caddr -- end xt )\n    >r here lastxt @\n    begin\n\tdup 0= abort\" Undefined word\"\n\tdup r@ word= if r> drop exit then\n\tnip dup >nextxt\n    again ;\n\n: cabs ( char -- |char| )   dup 127 > if 256 swap - then ;\n\n: xt. ( xt -- )\n    ( >name ) count cabs type ;\n\n: xt? ( xt -- flag )\n    >r lastxt @ begin\n\t?dup\n    while\n\tdup r@ = if r> 2drop -1 exit then\n\t>nextxt\n    repeat r> drop 0 ;\n\n: disassemble ( x -- )\n    dup xt? if\n        ( >name ) count\n        dup 127 > if .\" postpone \" then\n        cabs type\n    else\n        .\n    then ;\n\n: .addr  dup . ;\n\n: see-line ( addr -- )\n    cr .\"     ( \" .addr .\" ) \"  @ disassemble ;\n\n: see-word ( end xt -- )\n    >r .\" : \" r@ xt.\n    r@ >body do i see-line /cell +loop\n    .\"  ;\" r> c@ 127 > if .\"  immediate\" then ;\n\n: see   bl word see-find see-word cr ;\n\n: #body   bl word see-find >body - ;\n\n: type-word ( end xt -- flag )\n    xt. space drop 0 ;\n\n: traverse-dictionary ( in.. xt -- out.. )\n    \\ xt execution: ( in.. end xt2 -- in.. 0 | in.. end xt2 -- out.. true )\n    >r  here lastxt @  begin\n\t?dup\n    while\n\tr> 2dup >r >r execute\n\tif r> r> 2drop exit then\n\tr> dup >nextxt\n    repeat r> 2drop ;\n\n: words ( -- )\n    ['] type-word traverse-dictionary cr ;\n\n\\ ----------------------------------------------------------------------\n\n( Tools extension words. )\n\n\\ ;code\n\n\\ assembler\n\n\\ in kernel: bye\n\n\\ code\n\n\\ cs-pick\n\n\\ cs-roll\n\n\\ editor\n\n: forget   ' dup >nextxt lastxt !  'here !  reveal ;\n\n\\ Kernel: state\n\n\\ [else]\n\n\\ [if]\n\n\\ [then]\n\n\\ ----------------------------------------------------------------------\n\n( Forth2012 tools extension words. )\n\n\\ TODO: n>r\n\n\\ TODO: nr>\n\n\\ TODO: synonym\n\n: [undefined]   bl-word find nip 0= ; immediate\n\n: [defined]   postpone [undefined] invert ; immediate\n\n\\ ----------------------------------------------------------------------\n\n: @+ ( addr -- addr+/cell x )   dup cell+ swap @ ;\n\n: !+ ( x addr -- addr+/cell )   tuck ! cell+ ;\n\n: -rot   swap >r swap r> ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Fortran/bug-185631.f",
    "content": "! Codes/HYCOM/hycom/ATLb2.00/src_2.0.01_22_one/\n      real onemu, twomu\n      data onemu/0.0098/\n      data twomu/1./\n      data threemu/0.e9/\n      end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Fortran/m_filt2d.F90",
    "content": "!! ----------------------------------------------------------------------------------------------------------------------------- !!\n!>\n!! 2D wavenumber filtering\n!!\n!! @copyright\n!!   Copyright 2013-2018 Takuto Maeda. All rights reserved. This project is released under the MIT license.\n!<\n!! ----------------------------------------------------------------------------------------------------------------------------- !!\nmodule m_filt2d\n\n  use m_std\n  use m_fk\n  implicit none\n  public\n  save\n\n\ncontains\n\n  subroutine filt2d__lowpass ( nx, ny, dx, dy, img, kmax, np )\n\n    integer,  intent(in)     :: nx\n    integer,  intent(in)     :: ny\n    real(SP), intent(in)     :: dx\n    real(SP), intent(in)     :: dy\n    real(SP), intent(inout)  :: img(nx,ny)\n    real(SP), intent(in)     :: kmax\n    integer,  intent(in)     :: np\n    !! --\n    integer                  :: nx2, ny2\n    integer                  :: i, j\n    real(DP),    allocatable :: xdom(:,:)\n    complex(DP), allocatable ::  kdom(:,:)\n    real(DP),    allocatable :: kx(:), ky(:)\n    real(SP)                 :: k\n    real(SP)                 :: H\n    !! ----\n\n    !! power of 2\n    nx2  = 2 ** ceiling( log(dble(nx))/log(2.0_SP) )\n    ny2  = 2 ** ceiling( log(dble(ny))/log(2.0_SP) )\n\n    allocate( xdom(nx2,ny2), kdom(nx2,ny2) )\n    allocate( kx(nx2), ky(ny2) )\n\n    !! copy data\n    xdom(:,:) = 0.0_DP\n    xdom(1:nx,1:ny) = dble( img(1:nx,1:ny) )\n\n    !! wavenumber spectrum\n    call fk__x2k_2d( nx2, ny2, dble(dx), dble(dy), xdom, kdom, kx, ky )\n\n    !! filtering\n    do j=1, ny2\n      do i=1, nx2\n\n        !! absolute value of wavenumber\n        k = sqrt( kx(i)**2 + ky(j)**2 )\n\n        !! filter response\n        H = 1 / sqrt( 1.0_DP + (k/kmax)**(2*np) )\n        kdom(i,j) = kdom(i,j) * H\n\n      end do\n    end do\n\n    !! back to the space domain\n    call fk__k2x_2d( nx2, ny2, dble(dx), dble(dy), kdom, xdom )\n\n    !! restore filtered data\n    img(1:nx,1:ny) = real( xdom(1:nx,1:ny) )\n\n    !! release temporal memory\n    deallocate( xdom, kdom, kx, ky )\n\n  end subroutine filt2d__lowpass\n\n\n\nend module m_filt2d\n"
  },
  {
    "path": "src/test/resources/samples/langs/Fortran/sample1.f",
    "content": "c comment\n* comment\n\n      program main\n\n      end\n\n      subroutine foo( i, x, b )\n      INTEGER            i\n      REAL               x\n      LOGICAL            b\n\n      if( i.ne.0 ) then\n         call bar( -i )\n      end if\n\n      return\n      end\n\n      double complex function baz()\n\n      baz = (0.0d0,0.0d0)\n\n      return \n      end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Fortran/sample1.for",
    "content": "c comment\n* comment\n\n      program main\n\n      end\n\n      subroutine foo( i, x, b )\n      INTEGER            i\n      REAL               x\n      LOGICAL            b\n\n      if( i.ne.0 ) then\n         call bar( -i )\n      end if\n\n      return\n      end\n\n      double complex function baz()\n\n      baz = (0.0d0,0.0d0)\n\n      return \n      end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Fortran/sample2.f",
    "content": "      PROGRAM MAIN\n\n      END\n\nC comment\n* comment\n\n      SUBROUTINE foo( i, x, b )\n      INTEGER            i\n      REAL               x\n      LOGICAL            b\n\n      IF( i.NE.0 ) THEN\n         CALL bar( -i )\n      END IF\n\n      RETURN\n      END\n\n      DOUBLE COMPLEX FUNCTION baz()\n\n      baz = (0.0d0,0.0d0)\n\n      RETURN \n      END\n"
  },
  {
    "path": "src/test/resources/samples/langs/Fortran/sample3.F",
    "content": "c comment\n* comment\n\n      program main\n\n      end\n\n      subroutine foo( i, x, b )\n      INTEGER            i\n      REAL               x\n      LOGICAL            b\n\n      if( i.ne.0 ) then\n         call bar( -i )\n      end if\n\n      return\n      end\n\n      double complex function baz()\n\n      baz = (0.0d0,0.0d0)\n\n      return \n      end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Fortran/tst.f03",
    "content": "! ----------------------------------------------------------------------------------------------------------------------------- !!\n!>\n!! Testing: no real code\n!!\n!<\n!! ----------------------------------------------------------------------------------------------------------------------------- !!"
  },
  {
    "path": "src/test/resources/samples/langs/Fortran/tst.f08",
    "content": "! ----------------------------------------------------------------------------------------------------------------------------- !!\n!>\n!! Testing: no real code\n!!\n!<\n!! ----------------------------------------------------------------------------------------------------------------------------- !!"
  },
  {
    "path": "src/test/resources/samples/langs/Fortran/tst.f15",
    "content": "! ----------------------------------------------------------------------------------------------------------------------------- !!\n!>\n!! Testing: no real code\n!!\n!<\n!! ----------------------------------------------------------------------------------------------------------------------------- !!"
  },
  {
    "path": "src/test/resources/samples/langs/Fortran/tst.f95",
    "content": "! ----------------------------------------------------------------------------------------------------------------------------- !!\n!>\n!! Testing: no real code\n!!\n!<\n!! ----------------------------------------------------------------------------------------------------------------------------- !!"
  },
  {
    "path": "src/test/resources/samples/langs/FreeMarker/example.ftl",
    "content": "<#import \"layout.ftl\" as layout>\n\n<#assign results = [\n        {\n            \"title\": \"Example Result\",\n            \"description\": \"Lorem ipsum dolor sit amet, pede id pellentesque, sollicitudin turpis sed in sed sed, libero dictum.\"\n        }\n    ] />\n\n<@layout.page title=\"FreeMarker Example\">\n    <#if results?size == 0>\n        There were no results.\n    <#else>\n        <ul>\n            <#list results as result>\n                <li>\n                    <strong>${result.title}</strong>\n                    <p>${result.description}</p>\n                </li>\n            </#list>\n        </ul>\n    </#if>\n\n    <#-- This is a FreeMarker comment -->\n    <@currentTime />\n</@layout.page>\n\n\n<#macro currentTime>\n    ${.now?string.full}\n</#macro>\n"
  },
  {
    "path": "src/test/resources/samples/langs/FreeMarker/layout.ftl",
    "content": "<#ftl strip_text=true />\n\n<#macro page title>\n    <!doctype html>\n    <html lang=\"${.lang}\">\n        <head>\n            <title>${title}</title>\n            <@metaTags />\n        </head>\n        <body>\n            <#nested />\n            <@footer />\n        </body>\n    </html>\n</#macro>\n\n\n<#---\n  Default meta tags\n-->\n<#macro metaTags>\n    <#compress>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n        <meta name=\"format-detection\" content=\"telephone=no\">\n    </#compress>\n</#macro>\n\n<#macro footer>\n    <p>This page is using FreeMarker v${.version}</p>\n</#macro>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Frege/CommandLineClock.fr",
    "content": "{-- \n    This program displays the\n    current time on stdandard output\n    every other second.\n    -}\n    \nmodule examples.CommandLineClock where\n\ndata Date = native java.util.Date where\n    native new :: () -> IO (MutableIO Date)     -- new Date()\n    native toString :: Mutable s Date -> ST s String    -- d.toString()\n\n--- 'IO' action to give us the current time as 'String'\ncurrent :: IO String\ncurrent = do\n    d <- Date.new ()\n    d.toString\n\n{- \n    \"java.lang.Thread.sleep\" takes a \"long\" and\n    returns nothing, but may throw an InterruptedException.\n    This is without doubt an IO action.\n    \n    public static void sleep(long millis)\n                  throws InterruptedException\n    \n    Encoded in Frege:\n    - argument type  long   Long\n    - result         void   ()\n    - does IO               IO ()\n    - throws ...            throws ....\n     \n-}\n-- .... defined in frege.java.Lang\n-- native sleep java.lang.Thread.sleep :: Long -> IO () throws InterruptedException\n\n      \nmain args =  \n    forever do\n        current >>= print\n        print \"\\r\"\n        stdout.flush\n        Thread.sleep 999\n                "
  },
  {
    "path": "src/test/resources/samples/langs/Frege/Concurrent.fr",
    "content": "module examples.Concurrent where\n\nimport System.Random\nimport Java.Net (URL)\nimport Control.Concurrent as C\n\nmain2 args = do\n    m <- newEmptyMVar\n    forkIO do\n        m.put 'x'\n        m.put 'y' \n        m.put 'z'\n    replicateM_ 3 do\n        c <- m.take\n        print \"got: \"\n        println c  \n        \n            \nexample1 = do\n    forkIO (replicateM_ 100000 (putChar 'a'))\n    replicateM_ 100000 (putChar 'b')\n\nexample2 =  do\n    s <- getLine\n    case s.long of\n        Right n -> forkIO (setReminder n) >> example2\n        Left _  -> println (\"exiting ...\")\n    \nsetReminder :: Long -> IO ()\nsetReminder n = do\n        println (\"Ok, I remind you in \" ++ show n ++ \" seconds\")\n        Thread.sleep (1000L*n)\n        println (show n ++ \" seconds is up!\")\n\ntable = \"table\"\n            \nmainPhil _ = do\n    [fork1,fork2,fork3,fork4,fork5] <- mapM MVar.new [1..5]\n    forkIO (philosopher \"Kant\" fork5 fork1)\n    forkIO (philosopher \"Locke\" fork1 fork2)\n    forkIO (philosopher \"Wittgenstein\" fork2 fork3)\n    forkIO (philosopher \"Nozick\" fork3 fork4)\n    forkIO (philosopher \"Mises\" fork4 fork5)\n    return ()    \n\nphilosopher :: String -> MVar Int -> MVar Int -> IO ()\nphilosopher me left right = do\n    g <- Random.newStdGen\n    let phil g  = do\n            let (tT,g1) = Random.randomR (60L, 120L) g\n                (eT, g2)  = Random.randomR (80L, 160L) g1\n                thinkTime = 300L * tT\n                eatTime   = 300L * eT\n    \n            println(me ++ \" is going to the dining room and takes his seat.\") \n            fl <- left.take            \n            println (me ++ \" takes up left fork (\" ++ show fl ++ \")\")\n            rFork <- right.poll\n            case rFork of\n                Just fr -> do \n                    println (me ++ \" takes up right fork. (\" ++ show fr ++ \")\") \n                    println (me ++ \" is going to eat for \" ++ show eatTime ++ \"ms\")\n                    Thread.sleep eatTime\n                    println (me ++ \" finished eating.\")\n                    right.put fr\n                    println (me ++ \" took down right fork.\")\n                    left.put fl\n                    println (me ++ \" took down left fork.\")\n                    table.notifyAll \n                    println(me ++ \" is going to think for \" ++ show thinkTime ++ \"ms.\")\n                    Thread.sleep thinkTime\n                    phil g2\n                Nothing -> do\n                    println (me ++ \" finds right fork is already in use.\")\n                    left.put fl\n                    println (me ++ \" took down left fork.\")\n                    table.notifyAll\n                    println (me ++ \" is going to the bar to await notifications from table.\")\n                    table.wait\n                    println (me ++ \" got notice that something changed at the table.\")\n                    phil g2\n            \n        inter :: InterruptedException -> IO ()\n        inter _ = return ()        \n    \n    phil g `catch` inter\n\n    \ngetURL xx = do\n        url <- URL.new xx \n        con <- url.openConnection\n        con.connect\n        is  <- con.getInputStream\n        typ <- con.getContentType\n        -- stderr.println (\"content-type is \" ++ show typ) \n        ir  <- InputStreamReader.new is (fromMaybe \"UTF-8\" (charset typ))\n            `catch` unsupportedEncoding is \n        br  <- BufferedReader.new ir\n        br.getLines\n    where\n        unsupportedEncoding :: InputStream -> UnsupportedEncodingException -> IO InputStreamReader\n        unsupportedEncoding is x = do\n            stderr.println x.catched\n            InputStreamReader.new is \"UTF-8\"\n            \n        charset ctyp = do\n            typ <- ctyp\n            case typ of\n                m~´charset=(\\S+)´ -> m.group 1\n                _ -> Nothing\n\n    \ntype SomeException = Throwable\n\nmain [\"dining\"] = mainPhil []\n        \nmain _ =  do\n    m1 <- MVar.newEmpty\n    m2 <- MVar.newEmpty\n    m3 <- MVar.newEmpty\n    \n    forkIO do\n        r <- (catchAll . getURL) \"http://www.wikipedia.org/wiki/Haskell\"\n        m1.put r\n    \n    forkIO do\n        r <- (catchAll . getURL) \"htto://www.wikipedia.org/wiki/Java\"\n        m2.put r\n    \n    forkIO do\n        r <- (catchAll . getURL) \"http://www.wikipedia.org/wiki/Frege\"\n        m3.put r\n    \n    r1 <- m1.take\n    r2 <- m2.take\n    r3 <- m3.take\n    println (result r1, result r2, result r3)\n    -- case r3 of\n    --     Right ss -> mapM_ putStrLn ss\n    --     Left _   -> return ()\n  where\n    result :: (SomeException|[String]) -> (String|Int)\n    result (Left x)  = Left x.getClass.getName\n    result (Right y) = (Right . sum . map length)  y\n    -- mapM_ putStrLn r2\n\n        "
  },
  {
    "path": "src/test/resources/samples/langs/Frege/Sudoku.fr",
    "content": "package examples.Sudoku where\n\nimport Data.TreeMap (Tree, keys)\nimport Data.List as DL hiding (find, union)\n\n\ntype Element    = Int           -- 1,2,3,4,5,6,7,8,9\ntype Zelle      = [Element]     -- set of candidates\ntype Position   = Int           -- 0..80\ntype Feld       = (Position, Zelle)\ntype Brett      = [Feld]\n\n--- data type for assumptions and conclusions\ndata Assumption =\n              !ISNOT Position Element\n            | !IS    Position Element\n\n\nderive Eq Assumption\nderive Ord Assumption\ninstance Show Assumption where\n    show (IS p e)    = pname p ++ \"=\" ++ e.show\n    show (ISNOT p e) = pname p ++ \"/\" ++ e.show\n\nshowcs cs = joined \" \" (map Assumption.show cs)\n\nelements :: [Element]           -- all possible elements\nelements = [1 .. 9]\n\n{-\n    a  b  c   d  e  f   g  h  i\n     0  1  2 | 3  4  5 | 6  7  8    1\n     9 10 11 |12 13 14 |15 16 17    2\n    18 19 20 |21 22 23 |24 25 26    3\n    ---------|---------|--------\n    27 28 29 |30 31 32 |33 34 35    4\n    36 37 38 |39 40 41 |42 43 44    5\n    45 46 47 |48 49 50 |51 52 53    6\n    ---------|---------|--------\n    54 55 56 |57 58 59 |60 61 62    7\n    63 64 65 |66 67 68 |69 70 71    8\n    72 73 74 |75 76 77 |78 79 80    9\n-}\n\npositions :: [Position]         -- all possible positions\npositions = [0..80]\nrowstarts :: [Position]         -- all positions where a row is starting\nrowstarts =  [0,9,18,27,36,45,54,63,72]\ncolstarts :: [Position]         -- all positions where a column is starting\ncolstarts =  [0,1,2,3,4,5,6,7,8]\nboxstarts :: [Position]         -- all positions where a box is starting\nboxstarts =  [0,3,6,27,30,33,54,57,60]\nboxmuster :: [Position]         -- pattern for a box, by adding upper left position results in real box\nboxmuster =  [0,1,2,9,10,11,18,19,20]\n\n\n--- extract field for position\ngetf :: Brett -> Position  -> Feld\ngetf (f:fs) p\n    | fst f == p = f\n    | otherwise  = getf fs p\ngetf [] p = (p,[])\n\n\n--- extract cell for position\ngetc :: Brett -> Position -> Zelle\ngetc b p = snd (getf b p)\n\n--- compute the list of all positions that belong to the same row as a given position\nrow :: Position -> [Position]\nrow p = [z..(z+8)] where z = (p `quot` 9) * 9\n\n--- compute the list of all positions that belong to the same col as a given position\ncol :: Position -> [Position]\ncol p = map (c+) rowstarts where c = p `mod` 9\n\n--- compute the list of all positions that belong to the same box as a given position\nbox :: Position -> [Position]\nbox p  = map (z+) boxmuster where\n    ri = p `div` 27 * 27    -- 0, 27 or 54, depending on row\n    ci = p `mod` 9          -- column index 0..8, 0,1,2 is left, 3,4,5 is middle, 6,7,8 is right\n    cs = ci `div` 3 * 3     -- 0, 3 or 6\n    z  = ri + cs\n\n--- check if candidate set has exactly one member, i.e. field has been solved\nsingle :: Zelle -> Bool\nsingle [_] = true\nsingle _   = false\n\nunsolved :: Zelle -> Bool\nunsolved [_] = false\nunsolved _   = true\n\n-- list of rows, cols, boxes\nallrows = map row rowstarts\nallcols = map col colstarts\nallboxs = map box boxstarts\nallrcb  = zip (repeat \"row\") allrows\n          ++ zip (repeat \"col\") allcols\n          ++ zip (repeat \"box\") allboxs\n\n\ncontainers :: [(Position -> [Position], String)]\ncontainers = [(row, \"row\"), (col, \"col\"), (box, \"box\")]\n\n-- ----------------- PRINTING ------------------------------------\n-- printable coordinate of field, upper left is a1, lower right is i9\npname p = packed [chr (ord 'a' + p `mod` 9), chr (ord '1' + p `div` 9)]\n\n-- print board\nprintb b = mapM_ p1line allrows >> println \"\"\n    where\n        p1line row = do\n                print (joined \"\" (map pfld line))\n            where line = map (getc b) row\n\n-- print field (brief)\n--   ? = no candidate\n--   5 = field is 5\n--   . = some candidates\npfld [] = \"?\"\npfld [x] = show x\npfld zs = \"0\"\n\n-- print initial/final board\nresult msg b = do\n        println (\"Result: \" ++ msg)\n        print   (\"Board: \")\n        printb b\n        return b\n\nres012 b = case concatMap (getc b) [0,1,2] of\n    [a,b,c] -> a*100+b*10+c\n    _ -> 9999999\n\n-- -------------------------- BOARD ALTERATION ACTIONS ---------------------------------\n-- print a message about what is done to the board and return the new board\nturnoff1 :: Position -> Zelle -> Brett -> IO Brett\nturnoff1 i off b\n    | single nc = do\n            -- print (pname i)\n            -- print \": set to \"\n            -- print (head nc)\n            -- println \" (naked single)\"\n            return newb\n    | otherwise = return newb\n    where\n        cell   = getc b i\n        nc     = filter (`notElem` off) cell\n        newb   = (i, nc) : [ f | f <- b, fst f != i ]\n\nturnoff :: Int -> Zelle -> String -> Brett -> IO Brett\nturnoff i off msg b = do\n        -- print (pname i)\n        -- print \": set to \"\n        -- print nc\n        -- print \" by clearing \"\n        -- print off\n        -- print \" \"\n        -- println  msg\n        return newb\n    where\n        cell   = getc b i\n        nc     = filter (`notElem` off) cell\n        newb   = (i, nc) : [ f | f <- b, fst f != i ]\n\nturnoffh ps off msg b = foldM toh b ps\n    where\n        toh b p = turnoff p off msg b\n\nsetto :: Position -> Element -> String -> Brett -> IO Brett\nsetto i n cname b = do\n        -- print (pname i)\n        -- print \": set to \"\n        -- print n\n        -- print \" (hidden single in \"\n        -- print cname\n        -- println \")\"\n        return newb\n    where\n        nf     = [n]\n        newb   = (i, nf) : [ f | f <- b, fst f != i ]\n\n\n-- ----------------------------- SOLVING STRATEGIES ---------------------------------------------\n-- reduce candidate sets that contains numbers already in same row, col or box\n-- This finds (and logs) NAKED SINGLEs in passing.\nreduce b = [  turnoff1 p sss | (p,cell) <- b,               -- for each field\n                unsolved cell,                              --  with more than 1 candidate\n                --       single fields in containers that are candidates of that field\n                sss = [ s | (rcb, _) <- containers, [s] <- map (getc b) (rcb p), s `elem` cell],\n                sss != [] ]                                     -- collect field index, elements to remove from candidate set\n\n-- look for a number that appears in exactly 1 candidate set of a container\n-- this number can go in no other place (HIDDEN SINGLE)\nhiddenSingle b = [ setto i n cname |                     -- select index, number, containername\n            (cname, rcb) <- allrcb,                 -- FOR rcb IN allrcb\n            n <- elements,                          --  FOR n IN elements\n            fs     = filter (unsolved • snd) (map (getf b) rcb),\n            occurs  = filter ((n `elem`) • snd) fs,\n            length occurs == 1,\n            (i, _) <- occurs ]\n\n-- look for NAKED PAIRS, TRIPLES, QUADS\nnakedPair n b = [ turnoff p t (\"(naked tuple in \" ++ nm ++ \")\") |           -- SELECT pos, tuple, name\n            -- n <- [2,3,4],                    //  FOR n IN [2,3,4]\n            (nm, rcb) <- allrcb,             --    FOR rcb IN containers\n            fs = map (getf b) rcb,              --      let fs = fields for rcb positions\n            u  = (fold union [] . filter unsolved . map snd) fs,   -- let u = union of non single candidates\n            t <- n `outof` u,                   --      FOR t IN n-tuples\n            hit = (filter ((`subset` t) . snd) . filter (unsolved . snd)) fs,\n            length hit == n,\n            (p, cell) <- fs,\n            p `notElem` map fst hit,\n            any (`elem` cell) t\n            ]\n\n-- look for HIDDEN PAIRS, TRIPLES or QUADS\nhiddenPair n b = [ turnoff p off (\"(hidden \" ++ show t ++ \" in \" ++ nm ++ \")\") |           -- SELECT pos, tuple, name\n            -- n <- [2,3,4],                    //  FOR n IN [2,3,4]\n            (nm, rcb) <- allrcb,             --    FOR rcb IN containers\n            fs = map (getf b) rcb,              --      let fs = fields for rcb positions\n            u  = (fold union [] . filter ((>1) . length) . map snd) fs,   -- let u = union of non single candidates\n            t <- n `outof` u,                   --      FOR t IN n-tuples\n            hit = (filter (any ( `elem` t) . snd) . filter (unsolved . snd)) fs,\n            length hit == n,\n            off = (fold union [] . map snd) hit `minus` t,\n            off != [],\n            (p, cell) <- hit,\n            ! (cell `subset` t)\n            ]\n\na `subset` b = all (`elem` b) a\na `union`  b = uniq (sort (a ++ b))\na `minus`  b = filter (`notElem` b) a\na `common` b = filter (`elem` b) a\nn `outof` as\n    | length as < n = []\n    | [] <- as      = []\n    | 1 >= n        = map (:[]) as\n    | (a:bs) <- as  = map (a:) ((n-1) `outof` bs) ++ (n `outof` bs)\n    | otherwise     = undefined  -- cannot happen because either as is empty or not\n\nsame f a b = b `elem` f a\n\nintersectionlist = [(allboxs, row, \"box/row intersection\"), (allboxs, col, \"box/col intersection\"),\n                    (allrows ++ allcols, box, \"line/box intersection\")]\nintersections b = [\n    turnoff pos [c] reason |    -- SELECT position, candidate, reson\n        (from, container, reason) <- intersectionlist,\n        rcb <- from,\n        fs = (filter (unsolved . snd) . map (getf b)) rcb,        -- fs = fields in from with more than 1 candidate\n        c <- (fold union [] • map snd) fs,                          -- FOR c IN union of candidates\n        cpos = (map fst • filter ((c `elem`) • snd)) fs,            -- cpos = positions where c occurs\n        cpos != [],                                                 -- WHERE cpos is not empty\n        all (same container (head cpos)) (tail cpos),               -- WHERE all positions are in the intersection\n        -- we can remove all occurences of c that are in container, but not in from\n        (pos, cell) <- map (getf b) (container (head cpos)),\n        c `elem` cell,\n        pos `notElem` rcb ]\n\n\n-- look for an XY Wing\n--  - there exists a cell A with candidates X and Y\n--  - there exists a cell B with candidates X and Z that shares a container with A\n--  - there exists a cell C with candidates Y and Z that shares a container with A\n-- reasoning\n--  - if A is X, B will be Z\n--  - if A is Y, C will be Z\n--  - since A will indeed be X or Y -> B or C will be Z\n--  - thus, no cell that can see B and C can be Z\nxyWing board = [ turnoff p [z] (\"xy wing \" ++ pname b ++ \" \" ++ pname c ++ \" because of \" ++ pname a) |\n        (a, [x,y]) <- board,                            -- there exists a cell a with candidates x and y\n        rcba = map (getf board) (row a ++ col a ++ box a),  -- rcba = all fields that share a container with a\n        (b, [b1, b2]) <- rcba,\n        b != a,\n        b1 == x && b2 != y || b2 == x && b1 != y,       -- there exists a cell B with candidates x and z\n        z = if b1 == x then b2 else b1,\n        (c, [c1, c2]) <- rcba,\n        c != a, c!= b,\n        c1 == y && c2 == z || c1 == z && c2 == y,       -- there exists a cell C with candidates y and z\n        ps = (uniq . sort) ((row b ++ col b ++ box b) `common` (row c ++ col c ++ box c)),\n        -- remove z in ps\n        (p, cs) <- map (getf board) ps,\n        p != b, p != c,\n        z `elem` cs ]\n\n-- look for a N-Fish (2: X-Wing, 3: Swordfish, 4: Jellyfish)\n-- When all candidates for a particular digit in N rows are located\n-- in only N columns, we can eliminate all candidates from those N columns\n--  which are not located on those N rows\nfish n board = fish \"row\" allrows row col ++ fish \"col\" allcols col row where\n    fishname 2 = \"X-Wing\"\n    fishname 3 = \"Swordfish\"\n    fishname 4 = \"Jellyfish\"\n    fishname _ = \"unknown fish\"\n    fish nm allrows row col = [ turnoff p [x] (fishname n ++ \" in \" ++ nm ++ \" \" ++ show (map (pname . head) rset)) |\n        rset <- n `outof` allrows,          -- take n rows (or cols)\n        x <- elements,                      -- look for certain number\n        rflds = map (filter ((>1) . length . snd) . map (getf board)) rset,       -- unsolved fields in the rowset\n        colss  = (map (map (head . col . fst) . filter ((x `elem`) . snd)) rflds),   -- where x occurs in candidates\n        all ((>1) . length) colss,         -- x must appear in at least 2 cols\n        cols = fold union [] colss,\n        length cols == n,\n        cstart <- cols,\n        (p, cell) <- map (getf board) (col cstart),\n        x `elem` cell,\n        all (p `notElem`) rset]\n\n\n-- compute immediate consequences of an assumption of the form (p `IS` e) or (p `ISNOT` e)\nconseq board (IS p e) = uniq (sort ([ p `ISNOT` x | x <- getc board p, x != e ] ++\n    [ a `ISNOT` e |\n        (a,cs) <- map (getf board) (row p ++ col p ++ box p),\n        a != p,\n        e `elem` cs\n    ]))\nconseq board (ISNOT p  e) = uniq (sort ([ p `IS` x | cs = getc board p, length cs == 2, x <- cs, x != e ] ++\n    [ a `IS` e |\n        cp <- [row p, box p, col p],\n        as = (filter ((e `elem`) . getc board) . filter (p!=)) cp,\n        length as == 1,\n        a = head as\n    ]))\n\n-- check if two assumptions contradict each other\ncontradicts (IS a x)    (IS b y)    = a==b && x!=y\ncontradicts (IS a x)    (ISNOT b y) = a==b && x==y\ncontradicts (ISNOT a x) (IS b y)    = a==b && x==y\ncontradicts (ISNOT _ _) (ISNOT _ _) = false\n\n-- get the Position of an Assumption\naPos (IS p _)    = p\naPos (ISNOT p _) = p\n\n-- get List of elements that must be turned off when assumption is true/false\ntoClear board true  (IS p x)    = filter (x!=) (getc board p)\ntoClear board false (IS p x)    = [x]\ntoClear board true  (ISNOT p x) = [x]\ntoClear board false (ISNOT p x) = filter (x!=) (getc board p)\n\n\n-- look for assumptions whose implications contradict themself\nchain board paths = [ solution a (head cs) (reverse cs) |\n        (a, css) <-  paths,\n        cs <- take 1 [ cs | cs <- css, contradicts a (head cs) ]\n        ]\n    where\n        solution a c cs = turnoff (aPos a) (toClear board false a) reason where\n            reason = \"Assumption \" ++ show a ++ \" implies \" ++ show c ++ \"\\n\\t\"\n                ++ showcs cs ++ \"\\n\\t\"\n                ++ \"Therefore, \" ++ show a ++ \" must be false.\"\n\n-- look for an assumption that yields to contradictory implications\n-- this assumption must be false\nchainContra board paths = [ solution a (reverse pro) (reverse contra) |\n        (a, css) <- paths,          -- FOR ALL assumptions \"a\" with list of conlusions \"css\"\n        (pro, contra) <- take 1 [ (pro, contra) |\n            pro <- (uniqBy (using head) . sortBy (comparing head)) css,                 -- FOR ALL conslusion chains \"pro\"\n            c = head pro,               -- LET \"c\" BE the final conclusion\n            contra <- take 1 (filter ((contradicts c) . head) css)   -- THE FIRST conclusion that contradicts c\n        ]\n      ]\n    where\n        solution a pro con = turnoff (aPos a) (toClear board false a) reason where\n            reason = (\"assumption \" ++ show a ++ \" leads to contradictory conclusions\\n\\t\"\n                        ++ showcs pro ++ \"\\n\\t\" ++ showcs con)\n\n\n\n-- look for a common implication c of some assumptions ai, where at least 1 ai is true\n-- so that (a0 OR a1 OR a2 OR ...) IMPLIES c\n-- For all cells pi in same container that have x as candidate, we can construct (p0==x OR p1==x OR ... OR pi==x)\n-- For a cell p with candidates ci, we can construct (p==c0 OR p==c1)\ncellRegionChain board paths = [ solution b as (map head os) |\n        as <- cellas ++ regionas,           -- one of as must be true\n        iss = filter ((`elem` as) . fst) paths,    -- the implications for as\n        (a, ass) <- take 1 iss,             -- implications for first assumption\n        fs <- (uniqBy (using head) . sortBy (comparing head)) ass,\n        b = head fs,                        -- final conclusions of first assumption\n        os = [fs] : map (take 1 . filter ((b==) . head) . snd) (tail iss), -- look for implications with same conclusion\n        all ([]!=) os]\n    where\n        cellas   = [ map (p `IS`) candidates | (p, candidates@(_:_:_)) <- board ]\n        regionas = [ map (`IS` e) ps |\n            region <- map (map (getf board)) (allrows ++ allcols ++ allboxs),\n            e <- elements,\n            ps = map fst (filter ((e `elem`) . snd) region),\n            length ps > 1 ]\n        solution b as oss = turnoff (aPos b) (toClear board true b) reason where\n            reason = \"all of the assumptions \" ++ joined \", \" (map show as) ++ \" imply \" ++ show b ++ \"\\n\\t\"\n                ++ joined \"\\n\\t\" (map (showcs . reverse) oss) ++ \"\\n\\t\"\n                ++ \"One of them must be true, so \" ++ show b ++ \" must be true.\"\n\n\n{-\n    Wir brauchen für einige Funktionen eine Datenstruktur wie\n        [ (Assumption, [[Assumption]]) ]\n    d.i. eine Liste von möglichen Annahmen samt aller Schlußketten.\n    Idealerweise sollte die Schlußkette in umgekehrter Reihenfolge vorliegen,\n    dann kann man einfach finden:\n    - Annahmen, die zum Selbstwiderspruch führen.\n    - alles, was aus einer bestimmten Annahme folgt (map (map head) [[a]])\n    -...\n-}\n--- Liste aller Annahmen für ein bestimmtes Brett\nassumptions :: Brett -> [Assumption]\nassumptions board = [ a |\n                (p, cs) <- board,\n                !(single cs),\n                a <- map (ISNOT p) cs ++ map (IS p) cs ]\n\nconsequences :: Brett -> [Assumption] -> [[Assumption]]\nconsequences board as = map (conseq board) as\n\nacstree :: Brett -> Tree Assumption [Assumption]\nacstree board = Tree.fromList (zip as cs)\n    where\n        as = assumptions  board\n        cs = consequences board as\n\n-- bypass maybe on tree lookup\nfind :: Tree Assumption [Assumption] -> Assumption -> [Assumption]\nfind t a\n    | Just cs <- t.lookup a = cs\n    | otherwise = error (\"no consequences for \" ++ show a)\n\n-- for performance resons, we confine ourselves to implication chains of length 20 per assumption\nmkPaths :: Tree Assumption [Assumption] -> [ (Assumption, [[Assumption]]) ]\nmkPaths acst = map impl  (keys acst)   -- {[a1], [a2], [a3] ]\n    where\n        -- [Assumption] -> [(a, [chains, ordered by length]\n        impl a = (a, impls [[a]])\n        impls ns = (take 1000 • concat • takeUntil null • iterate expandchain) ns\n        -- expandchain :: [[Assumption]] -> [[Assumption]]\n        expandchain css = [ (n:a:as) |\n            (a : as) <- css,               -- list of assumptions\n            n <- find acst a,              -- consequences of a\n            n `notElem` as                 -- avoid loops\n          ]\n        -- uni (a:as) = a : uni (filter ((head a !=) • head) as)\n        -- uni [] = empty\n        -- empty = []\n\n\n-- ------------------ SOLVE A SUDOKU --------------------------\n-- Apply all available strategies until nothing changes anymore\n-- Strategy functions are supposed to return a list of\n-- functions, which, when applied to a board, give a changed board.\n-- When a strategy does not find anything to alter,\n-- it returns [], and the next strategy can be tried.\nsolve b\n    | all (single . snd) b       = result \"Solved\" b\n    | any (([]==) . snd) b       = result \"not solvable\" b\n    | res@(_:_) <- reduce b       = apply b res >>=solve       -- compute smallest candidate sets\n    -- comment \"candidate sets are up to date\" = ()\n    | res@(_:_) <- hiddenSingle b  = apply b res >>= solve     -- find HIDDEN SINGLES\n    -- comment \"no more hidden singles\" = ()\n    | res@(_:_) <- intersections b = apply b res >>= solve     -- find locked candidates\n    -- comment \"no more intersections\" = ()\n    | res@(_:_) <- nakedPair 2 b     = apply b res >>= solve     -- find NAKED PAIRS, TRIPLES or QUADRUPELS\n    -- comment \"no more naked pairs\" = ()\n    | res@(_:_) <- hiddenPair  2 b   = apply b res >>= solve      -- find HIDDEN PAIRS, TRIPLES or QUADRUPELS\n    -- comment \"no more hidden pairs\" = ()\n    -- res@(_:_) <- nakedPair 3 b     = apply b res >>= solve       // find NAKED PAIRS, TRIPLES or QUADRUPELS\n    -- | comment \"no more naked triples\" = ()\n    -- res@(_:_) <- hiddenPair  3 b    = apply b res >>= solve      // find HIDDEN PAIRS, TRIPLES or QUADRUPELS\n    -- | comment \"no more hidden triples\" = ()\n    -- res@(_:_) <- nakedPair 4 b     = apply b res >>=solve       // find NAKED PAIRS, TRIPLES or QUADRUPELS\n    -- | comment \"no more naked quadruples\" = ()\n    -- res@(_:_) <- hiddenPair  4 b    = apply b res >>=solve      // find HIDDEN PAIRS, TRIPLES or QUADRUPELS\n    -- | comment \"no more hidden quadruples\" = ()\n    | res@(_:_) <- xyWing b            = apply b res >>=solve      -- find XY WINGS\n    -- comment \"no more xy wings\"       = ()\n    | res@(_:_) <- fish 2 b            = apply b res >>=solve      -- find 2-FISH\n    -- comment \"no more x-wings\"        = ()\n    -- res@(_:_) <- fish 3 b            = apply b res >>=solve      // find 3-FISH\n    -- | comment \"no more swordfish\"      = ()\n    -- res@(_:_) <- fish 4 b            = apply b res >>=solve      // find 4-FISH\n    -- | comment \"no more jellyfish\"      = ()\n    -- | comment pcomment                 = ()\n    | res@(_:_) <- chain b paths             = apply b (take 9 res) >>= solve  -- find forcing chains\n    | res@(_:_) <- cellRegionChain b paths   = apply b (take 9 res) >>= solve  -- find common conclusion for true assumption\n    | res@(_:_) <- chainContra b paths       = apply b (take 9 res) >>= solve  -- find assumptions that allow to infer both a and !a\n    -- comment \"consistent conclusions only\"       = ()\n\n    | otherwise = result \"ambiguous\" b\n    where\n        apply brd fs = foldM (\\b\\f -> f b) brd fs\n        paths = mkPaths (acstree b)\n        -- pcomment = show (length paths) ++ \" assumptions with \" ++ show (fold (+) 0 (map (length <~ snd) paths))\n        --    ++ \" implication chains\"\n\n-- comment com = do stderr << com << \"\\n\" for false\n-- log com     = do stderr << com << \"\\n\" for true\n\n--- turn a string into a row\nmkrow :: String -> [Zelle]\nmkrow s = mkrow1 xs\n    where\n        xs = s ++ \"---------\" -- make sure at least 9 elements\n        mkrow1 xs = (take 9 • filter ([]!=) • map f • unpacked) xs\n        f x | x >= '1' && x <= '9'  =  [ord x - ord '0']\n            | x == ' '  = []    -- ignored\n            | otherwise = elements\n\nmain [\"-h\"]    = main []\nmain [\"-help\"] = main []\nmain [] = do\n        mapM_ stderr.println [\n            \"usage: java Sudoku file ...\",\n            \"       java Sudoku position\",\n            \"where position is a 81 char string consisting of digits\",\n            \"One can get such a string by going to\",\n            \"http://www.sudokuoftheday.com/pages/s-o-t-d.php\",\n            \"Right click on the puzzle and open it in new tab\",\n            \"Copy the 81 digits from the URL in the address field of your browser.\",\n            \"\",\n            \"There is also a file with hard sudokus in examples/top95.txt\\n\"]\n        return ()\n\n\nmain [s@#^[0-9\\W]{81}$#] = solve board >> return ()\n    where\n        board = zip positions felder\n        felder = decode s\n\nmain files = forM_ files sudoku\n    where\n        sudoku file = do\n            br <- openReader file\n            lines <- BufferedReader.getLines br\n            bs <- process lines\n            ss <- mapM (\\b -> print \"Puzzle: \" >> printb b >> solve b) bs\n            println (\"Euler: \" ++ show (sum (map res012 ss)))\n            return ()\n\n-- \"--3-\" => [1..9, 1..9, [3], 1..9]\ndecode s = map candi (unpacked s) where\n        candi c | c >= '1' && c <= '9'  = [(ord c - ord '0')]\n                | otherwise = elements\nprocess [] = return []\nprocess (s:ss)\n    | length s == 81 = consider b1\n    | length s == 9,\n      length acht == 8,\n      all ((9==) • length) acht = consider b2\n    | otherwise = do\n            stderr.println (\"skipped line: \" ++ s)\n            process ss\n    where\n        acht = take 8 ss\n        neun = fold (++) \"\" (s:acht)\n        b1 = zip positions (decode s)\n        b2 = zip positions (decode neun)\n        consider b = do\n            -- print \"Puzzle: \"\n            -- printb b\n            bs <- process ss\n            return (b:bs)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Frege/SwingExamples.fr",
    "content": "package examples.SwingExamples where\n\nimport Java.Awt  (ActionListener)\nimport Java.Swing\n\n\nmain _ = do\n    rs <- mapM Runnable.new [helloWorldGUI, buttonDemoGUI, celsiusConverterGUI]\n    mapM_ invokeLater rs\n    println \"Hit enter to end ....\"\n    s <- getLine\n    return ()\n\ncelsiusConverterGUI = do\n    tempTextField   <- JTextField.new()\n    celsiusLabel    <- JLabel.new ()\n    convertButton   <- JButton.new ()\n    fahrenheitLabel <- JLabel.new () \n    frame           <- JFrame.new ()\n    frame.setDefaultCloseOperation JFrame.dispose_on_close\n    frame.setTitle \"Celsius Converter\"\n    celsiusLabel.setText  \"Celsius\"\n    convertButton.setText \"Convert\"\n    let convertButtonActionPerformed _ = do\n            celsius <- tempTextField.getText\n            case celsius.double of\n                Left _  -> fahrenheitLabel.setText (\"not a valid number: \" ++ celsius)\n                Right c -> fahrenheitLabel.setText (show (c*1.8 + 32.0).long ++ \" Fahrenheit\") \n            return ()\n    ActionListener.new convertButtonActionPerformed >>= convertButton.addActionListener\n    fahrenheitLabel.setText \"Fahrenheit\"\n    contentPane <- frame.getContentPane\n    layout      <- GroupLayout.new contentPane\n    contentPane.setLayout layout\n    -- TODO continue\n    -- http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/learn/CelsiusConverterProject/src/learn/CelsiusConverterGUI.java\n    frame.pack\n    frame.setVisible true\n\nhelloWorldGUI = do\n    frame <- JFrame.new \"Hello World Frege\"\n    frame.setDefaultCloseOperation(JFrame.dispose_on_close)\n    label <- JLabel.new \"Hello World!\"\n    cp <- frame.getContentPane\n    cp.add label\n    frame.pack\n    frame.setVisible true\n\nbuttonDemoGUI = do\n    frame <- JFrame.new \"Button Demo\"\n    frame.setDefaultCloseOperation(JFrame.dispose_on_close)\n    newContentPane <- JPanel.new ()\n    b1::JButton <- JButton.new \"Disable middle button\"\n    b1.setVerticalTextPosition   SwingConstants.center\n    b1.setHorizontalTextPosition SwingConstants.leading\n    b2::JButton <- JButton.new \"Middle button\"\n    b2.setVerticalTextPosition   SwingConstants.center\n    b2.setHorizontalTextPosition SwingConstants.leading\n    b3::JButton <- JButton.new \"Enable middle button\"\n    b3.setVerticalTextPosition   SwingConstants.center\n    b3.setHorizontalTextPosition SwingConstants.leading\n    b3.setEnabled false\n    let action1 _ = do\n            b2.setEnabled false\n            b1.setEnabled false\n            b3.setEnabled true\n        action3 _ = do\n            b2.setEnabled true\n            b1.setEnabled true\n            b3.setEnabled false\n    ActionListener.new action1  >>= b1.addActionListener\n    ActionListener.new action3  >>= b3.addActionListener \n    newContentPane.add b1\n    newContentPane.add b2\n    newContentPane.add b3\n    newContentPane.setOpaque true\n    frame.setContentPane newContentPane\n    frame.pack\n    frame.setVisible true\n"
  },
  {
    "path": "src/test/resources/samples/langs/G-code/duettest.g",
    "content": "; RepRapPro Ormerod\n; Board test GCodes\nM111 S1; Debug on\nG21 ; mm\nG90 ; Absolute positioning\nM83 ; Extrusion relative\nM906 X800 Y800 Z800 E800 ; Motor currents (mA)\nT0 ; Extruder 0\nG1 X50 F500\nG1 X0\nG4 P500\nG1 Y50 F500\nG1 Y0\nG4 P500\nG1 Z20 F200\nG1 Z0\nG4 P500\nG1 E20 F200\nG1 E-20\nG4 P500\nM106 S255\nG4 P500\nM106 S0\nG4 P500\nM105\nG10 P0 S100\nT0\nM140 S100\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nM0\n\n\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/G-code/square.g",
    "content": "G28 X0 Y0\nG1 X55 Y5 F2000\nG1 Y180\nG1 X180\nG1 Y5\nG1 X55\nG1 Y180\nG1 X180\nG1 Y5\nG1 X55\nM0\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/GAMS/transport.gms",
    "content": "*Basic example of transport model from GAMS model library\n\n$Title  A Transportation Problem (TRNSPORT,SEQ=1)\n$Ontext\n\nThis problem finds a least cost shipping schedule that meets\nrequirements at markets and supplies at factories.\n\n\nDantzig, G B, Chapter 3.3. In Linear Programming and Extensions.\nPrinceton University Press, Princeton, New Jersey, 1963.\n\nThis formulation is described in detail in:\nRosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide.\nThe Scientific Press, Redwood City, California, 1988.\n\nThe line numbers will not match those in the book because of these\ncomments.\n\n$Offtext\n\n\n  Sets\n       i   canning plants   / seattle, san-diego /\n       j   markets          / new-york, chicago, topeka / ;\n  Parameters\n       a(i)  capacity of plant i in cases\n         /    seattle     350\n              san-diego   600  /\n       b(j)  demand at market j in cases\n         /    new-york    325\n              chicago     300\n              topeka      275  / ;\n  Table d(i,j)  distance in thousands of miles\n                    new-york       chicago      topeka\n      seattle          2.5           1.7          1.8\n      san-diego        2.5           1.8          1.4  ;\n  Scalar f  freight in dollars per case per thousand miles  /90/ ;\n  Parameter c(i,j)  transport cost in thousands of dollars per case ;\n            c(i,j) = f * d(i,j) / 1000 ;\n  Variables\n       x(i,j)  shipment quantities in cases\n       z       total transportation costs in thousands of dollars ;\n\n  Positive Variable x ;\n\n  Equations\n       cost        define objective function\n       supply(i)   observe supply limit at plant i\n       demand(j)   satisfy demand at market j ;\n\n  cost ..        z  =e=  sum((i,j), c(i,j)*x(i,j)) ;\n\n  supply(i) ..   sum(j, x(i,j))  =l=  a(i) ;\n\n  demand(j) ..   sum(i, x(i,j))  =g=  b(j) ;\n\n  Model transport /all/ ;\n\n  Solve transport using lp minimizing z ;\n\n  Display x.l, x.m ;\n\n$ontext\n#user model library stuff\nMain topic Basic GAMS\nFeatured item 1 Trnsport model\nFeatured item 2\nFeatured item 3\nFeatured item 4\nDescription\nBasic example of transport model from GAMS model library\n\n\n\n$offtext"
  },
  {
    "path": "src/test/resources/samples/langs/GAP/Magic.gd",
    "content": "#############################################################################\n##\n##  Magic.gd                                         AutoDoc package\n##\n##  Copyright 2013, Max Horn, JLU Giessen\n##                  Sebastian Gutsche, University of Kaiserslautern\n##\n#############################################################################\n\n\n#! @Description\n#! This is the main function of the &AutoDoc; package. It can perform\n#! any combination of the following three tasks:\n#! <Enum>\n#! <Item>\n#!     It can (re)generate a scaffold for your package manual.\n#!     That is, it can produce two XML files in &GAPDoc; format to be used as part\n#!     of your manual: First, a file named <F>doc/PACKAGENAME.xml</F>\n#!     (with your package's name substituted) which is used as\n#!     main file for the package manual, i.e. this file sets the\n#!     XML DOCTYPE and defines various XML entities, includes\n#!     other XML files (both those generated by &AutoDoc; as well\n#!     as additional files created by other means), tells &GAPDoc;\n#!     to generate a table of content and an index, and more.\n#!     Secondly, it creates a file <F>doc/title.xml</F> containing a title\n#!     page for your documentation, with information about your package\n#!     (name, description, version), its authors and more, based\n#!     on the data in your <F>PackageInfo.g</F>.\n#! </Item>\n#! <Item>\n#!     It can scan your package for &AutoDoc; based documentation (by using &AutoDoc;\n#!     tags and the Autodoc command.\n#!     This will\n#!     produce further XML files to be used as part of the package manual.\n#! </Item>\n#! <Item>\n#!     It can use &GAPDoc; to generate PDF, text and HTML (with\n#!     MathJaX enabled) documentation from the &GAPDoc; XML files it\n#!     generated as well as additional such files provided by you. For\n#!     this, it invokes <Ref Func='MakeGAPDocDoc' BookName='gapdoc'/>\n#!     to convert the XML sources, and it also instructs &GAPDoc; to copy\n#!     supplementary files (such as CSS style files) into your doc directory\n#!     (see <Ref Func='CopyHTMLStyleFiles' BookName='gapdoc'/>).\n#! </Item>\n#! </Enum>\n#! For more information and some examples, please refer to Chapter <Ref Label='Tutorials'/>.\n#! <P/>\n#! The parameters have the following meanings:\n#! <List>\n#!\n#! <Mark><A>package_name</A></Mark>\n#! <Item>\n#!     The name of the package whose documentation should be(re)generated.\n#! </Item>\n#!\n#!\n#! <Mark><A>option_record</A></Mark>\n#! <Item>\n#!     <A>option_record</A> can be a record with some additional options.\n#!     The following are currently supported:\n#!     <List>\n#!     <Mark><A>dir</A></Mark>\n#!     <Item>\n#!         This should be a string containing a (relative) path or a\n#!         Directory() object specifying where the package documentation\n#!         (i.e. the &GAPDoc; XML files) are stored.\n#!         <Br/>\n#!         <E>Default value: <C>\"doc/\"</C>.</E>\n#!     </Item>\n#!     <Mark><A>scaffold</A></Mark>\n#!     <Item>\n#!         This controls whether and how to generate scaffold XML files\n#!         for the main and title page of the package's documentation. \n#!         <P/>\n#!         The value should be either <K>true</K>, <K>false</K> or a\n#!         record. If it is a record or <K>true</K> (the latter is\n#!         equivalent to specifying an empty record), then this feature is\n#!         enabled. It is also enabled if <A>opt.scaffold</A> is missing but the\n#!         package's info record in <F>PackageInfo.g</F> has an <C>AutoDoc</C> entry.\n#!         In all other cases (in particular if <A>opt.scaffold</A> is\n#!         <K>false</K>), scaffolding is disabled.\n#!         <P/>\n#!\n#!         If <A>opt.scaffold</A> is a record, it may contain the following entries.\n#!\n#### TODO: mention merging with PackageInfo.AutoDoc!\n#!         <List>\n#!\n#!         <Mark><A>includes</A></Mark>\n#!         <Item>\n#!             A list of XML files to be included in the body of the main XML file.\n#!             If you specify this list and also are using &AutoDoc; to document\n#!             your operations with &AutoDoc; comments,\n#!             you can add <F>AutoDocMainFile.xml</F> to this list\n#!             to control at which point the documentation produced by &AutoDoc;\n#!             is inserted. If you do not do this, it will be added after the last\n#!             of your own XML files.\n#!         </Item>\n#!\n#!         <Mark><A>appendix</A></Mark>\n#!         <Item>\n#!             This entry is similar to <A>opt.scaffold.includes</A> but is used\n#!             to specify files to include after the main body of the manual,\n#!             i.e. typically appendices.\n#!         </Item>\n#!\n#!         <Mark><A>bib</A></Mark>\n#!         <Item>\n#!             The name of a bibliography file, in Bibtex or XML format.\n#!             If this key is not set, but there is a file <F>doc/PACKAGENAME.bib</F>\n#!             then it is assumed that you want to use this as your bibliography.\n#!         </Item>\n#!\n#### TODO: The 'entities' param is a bit strange. We should probably change it to be a bit more\n#### general, as one might want to define other entities... For now, we do not document it\n#### to leave us the choice of revising how it works.\n####\n####                 <Mark><A>entities</A></Mark>\n####                 <Item>\n####                     A list of package names or other entities which are used to define corresponding XML entities.\n####                     For example, if set to a list containing the string <Q>SomePackage</Q>,\n####                     then the following is added to the XML preamble:\n####                     <Listing><![CDATA[<!ENTITY SomePackage '<Package>SomePackage</Package>'>]]></Listing>\n####                     This allows you to write <Q>&amp;SomePackage;</Q> in your documentation\n####                     to reference that package. If another type of entity is desired, one can simply add,\n####                     instead of a string, add a two entry list <A>a</A> to the list. It will be handled as\n####                     <Listing><![CDATA[<!ENTITY a[ 2 ] '<a[ 1 ]>a[ 2 ]</a[ 1 ]>'>]]></Listing>,\n####                     so please be careful.\n####                 </Item>\n#!\n#!         <Mark><A>TitlePage</A></Mark>\n#!         <Item>\n#!             A record whose entries are used to embellish the generated titlepage\n#!             for the package manual with extra information, such as a copyright\n#!             statement or acknowledgments. To this end, the names of the record\n#!             components are used as XML element names, and the values of the\n#!             components are outputted as content of these XML elements. For\n#!             example, you could pass the following record to set a custom\n#!             acknowledgements text:\n#!             <Listing><![CDATA[\n#!             rec( Acknowledgements := \"Many thanks to ...\" )]]></Listing>\n#!             For a list of valid entries in the titlepage, please refer to the\n#!             &GAPDoc; manual, specifically section <Ref Subsect='Title' BookName='gapdoc'/>\n#!             and following.\n#!         </Item>\n#!         <Mark><A>document_class</A></Mark>\n#!         <Item>\n#!             Sets the document class of the resulting pdf. The value can either be a string\n#!             which has to be the name of the new document class, a list containing this string, or\n#!             a list of two strings. Then the first one has to be the document class name, the second one\n#!             the option string ( contained in [ ] ) in LaTeX.\n#!         </Item>\n#!         <Mark><A>latex_header_file</A></Mark>\n#!         <Item>\n#!             Replaces the standard header from &GAPDoc; completely with the header in this LaTeX file.\n#!             Please be careful here, and look at GAPDoc's latexheader.tex file for an example.\n#!         </Item>\n#!         <Mark><A>gapdoc_latex_options</A></Mark>\n#!         <Item>\n#!             Must be a record with entries which can be understood by SetGapDocLaTeXOptions. Each entry can be a string, which\n#!             will be given to &GAPDoc; directly, or a list containing of two entries: The first one must be the string \"file\",\n#!             the second one a filename. This file will be read and then its content is passed to &GAPDoc; as option with the name\n#!             of the entry.\n#!         </Item>\n#!\n#!         </List>\n#!     </Item>\n#!\n#!\n#!     <Mark><A>autodoc</A></Mark>\n#!     <Item>\n#!         This controls whether and how to generate addition XML documentation files\n#!         by scanning for &AutoDoc; documentation comments.\n#!         <P/>\n#!         The value should be either <K>true</K>, <K>false</K> or a\n#!         record. If it is a record or <K>true</K> (the latter is\n#!         equivalent to specifying an empty record), then this feature is\n#!         enabled. It is also enabled if <A>opt.autodoc</A> is missing but the\n#!         package depends (directly) on the &AutoDoc; package.\n#!         In all other cases (in particular if <A>opt.autodoc</A> is\n#!         <K>false</K>), this feature is disabled.\n#!         <P/>\n#!\n#!         If <A>opt.autodoc</A> is a record, it may contain the following entries.\n#!\n#!         <List>\n#!\n#!         <Mark><A>files</A></Mark>\n#!         <Item>\n#!             A list of files (given by paths relative to the package directory)\n#!             to be scanned for &AutoDoc; documentation comments.\n#!             Usually it is more convenient to use <A>autodoc.scan_dirs</A>, see below.\n#!         </Item>\n#!\n#!         <Mark><A>scan_dirs</A></Mark>\n#!         <Item>\n#!             A list of subdirectories of the package directory (given as relative paths)\n#!             which &AutoDoc; then scans for .gi, .gd and .g files; all of these files\n#!             are then scanned for &AutoDoc; documentation comments.\n#!             <Br/>\n#!             <E>Default value: <C>[ \"gap\", \"lib\", \"examples\", \"examples/doc\" ]</C>.</E>\n#!         </Item>\n#!\n#!         <Mark><A>level</A></Mark>\n#!         <Item>\n#!             This defines the level of the created documentation. The default value is 0.\n#!             When parts of the manual are declared with a higher value\n#!             they will not be printed into the manual.\n#!         </Item>\n#!\n#### TODO: Document section_intros later on.\n#### However, note that thanks to the new AutoDoc comment syntax, the only remaining\n#### use for this seems to be the ability to specify the order of chapters and\n#### sections.\n####                 <Mark><A>section_intros</A></Mark>\n####                 <Item>\n####                     TODO.\n####                 </Item>\n#!\n#!         </List>\n#!     </Item>\n#!\n#!\n#!     <Mark><A>gapdoc</A></Mark>\n#!     <Item>\n#!         This controls whether and how to invoke &GAPDoc; to create HTML, PDF and text\n#!         files from your various XML files.\n#!         <P/>\n#!         The value should be either <K>true</K>, <K>false</K> or a\n#!         record. If it is a record or <K>true</K> (the latter is\n#!         equivalent to specifying an empty record), then this feature is\n#!         enabled. It is also enabled if <A>opt.gapdoc</A> is missing.\n#!         In all other cases (in particular if <A>opt.gapdoc</A> is\n#!         <K>false</K>), this feature is disabled.\n#!         <P/>\n#!\n#!         If <A>opt.gapdoc</A> is a record, it may contain the following entries.\n#!\n#!         <List>\n#!\n#!\n#### Note: 'main' is strictly speaking also used for the scaffold.\n#### However, if one uses the scaffolding mechanism, then it is not\n#### really necessary to specify a custom name for the main XML file.\n#### Thus, the purpose of this parameter is to cater for packages\n#### that have existing documentation using a different XML name,\n#### and which do not wish to use scaffolding.\n####\n#### This explain why we only allow specifying gapdoc.main.\n#### The scaffolding code will still honor it, though, just in case.\n#!         <Mark><A>main</A></Mark>\n#!         <Item>\n#!             The name of the main XML file of the package manual.\n#!             This exists primarily to support packages with existing manual\n#!             which use a filename here which differs from the default.\n#!             In particular, specifying this is unnecessary when using scaffolding.\n#!             <Br/>\n#!             <E>Default value: <C>PACKAGENAME.xml</C></E>.\n#!         </Item>\n#!\n#!         <Mark><A>files</A></Mark>\n#!         <Item>\n#!             A list of files (given by paths relative to the package directory)\n#!             to be scanned for &GAPDoc; documentation comments.\n#!             Usually it is more convenient to use <A>gapdoc.scan_dirs</A>, see below.\n#!         </Item>\n#!\n#!         <Mark><A>scan_dirs</A></Mark>\n#!         <Item>\n#!             A list of subdirectories of the package directory (given as relative paths)\n#!             which &AutoDoc; then scans for .gi, .gd and .g files; all of these files\n#!             are then scanned for &GAPDoc; documentation comments.\n#!             <Br/>\n#!             <E>Default value: <C>[ \"gap\", \"lib\", \"examples\", \"examples/doc\" ]</C>.</E>\n#!         </Item>\n#!\n#!         </List>\n#!     </Item>\n## This is the maketest part. Still under construction.\n#!        <Mark><A>maketest</A></Mark>\n#!        <Item>\n#!          The maketest item can be true or a record. When it is true,\n#!          a simple maketest.g is created in the main package directory,\n#!          which can be used to test the examples from the manual. As a record,\n#!          the entry can have the following entries itself, to specify some options.\n#!          <List>\n#!          <Mark>filename</Mark>\n#!          <Item>\n#!            Sets the name of the test file.\n#!          </Item>\n#!          <Mark>commands</Mark>\n#!          <Item>\n#!            A list of strings, each one a command, which\n#!            will be executed at the beginning of the test file.\n#!          </Item>\n#!          </List>\n#!        </Item>\n#!\n#!     </List>\n#! </Item>\n#! </List>\n#!\n#! @Returns nothing\n#! @Arguments package_name[, option_record ]\n#! @ChapterInfo AutoDoc, The AutoDoc() function\nDeclareGlobalFunction( \"AutoDoc\" );\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/GAP/Magic.gi",
    "content": "#############################################################################\n##\n##  Magic.gi                                         AutoDoc package\n##\n##  Copyright 2013, Max Horn, JLU Giessen\n##                  Sebastian Gutsche, University of Kaiserslautern\n##\n#############################################################################\n\n# Check if a string has the given suffix or not. Another\n# name for this would \"StringEndsWithOtherString\".\n# For example, AUTODOC_HasSuffix(\"file.gi\", \".gi\") returns\n# true while AUTODOC_HasSuffix(\"file.txt\", \".gi\") returns false.\nBindGlobal( \"AUTODOC_HasSuffix\",\nfunction(str, suffix)\n    local n, m;\n    n := Length(str);\n    m := Length(suffix);\n    return n >= m and str{[n-m+1..n]} = suffix;\nend );\n\n# Given a string containing a \".\", , return its suffix,\n# i.e. the bit after the last \".\". For example, given \"test.txt\",\n# it returns \"txt\".\nBindGlobal( \"AUTODOC_GetSuffix\",\nfunction(str)\n    local i;\n    i := Length(str);\n    while i > 0 and str[i] <> '.' do i := i - 1; od;\n    if i < 0 then return \"\"; fi;\n    return str{[i+1..Length(str)]};\nend );\n\n# Check whether the given directory exists, and if not, attempt\n# to create it.\nBindGlobal( \"AUTODOC_CreateDirIfMissing\",\nfunction(d)\n    local tmp;\n    if not IsDirectoryPath(d) then\n        tmp := CreateDir(d); # Note: CreateDir is currently undocumented\n        if tmp = fail then\n            Error(\"Cannot create directory \", d, \"\\n\",\n                  \"Error message: \", LastSystemError().message, \"\\n\");\n            return false;\n        fi;\n    fi;\n    return true;\nend );\n\n\n# Scan the given (by name) subdirs of a package dir for\n# files with one of the given extensions, and return the corresponding\n# filenames, as relative paths (relative to the package dir).\n#\n# For example, the invocation\n#   AUTODOC_FindMatchingFiles(\"AutoDoc\", [ \"gap/\" ], [ \"gi\", \"gd\" ]);\n# might return a list looking like\n#  [ \"gap/AutoDocMainFunction.gd\", \"gap/AutoDocMainFunction.gi\", ... ]\nBindGlobal( \"AUTODOC_FindMatchingFiles\",\nfunction (pkg, subdirs, extensions)\n    local d_rel, d, tmp, files, result;\n\n    result := [];\n\n    for d_rel in subdirs do\n        # Get the absolute path to the directory in side the package...\n        d := DirectoriesPackageLibrary( pkg, d_rel );\n        if IsEmpty( d ) then\n            continue;\n        fi;\n        d := d[1];\n        # ... but also keep the relative path (such as \"gap\")\n        d_rel := Directory( d_rel );\n\n        files := DirectoryContents( d );\n        Sort( files );\n        for tmp in files do\n            if not AUTODOC_GetSuffix( tmp ) in [ \"g\", \"gi\", \"gd\", \"autodoc\" ] then\n                continue;\n            fi;\n            if not IsReadableFile( Filename( d, tmp ) ) then\n                continue;\n            fi;\n            Add( result, Filename( d_rel, tmp ) );\n        od;\n    od;\n    return result;\nend );\n\n\n# AutoDoc(pkg[, opt])\n#\n## Make this function callable with the package_name AutoDocWorksheet.\n## Which will then create a worksheet!\nInstallGlobalFunction( AutoDoc,\nfunction( arg )\n    local pkg, package_info, opt, scaffold, gapdoc, maketest,\n          autodoc, pkg_dir, doc_dir, doc_dir_rel, d, tmp,\n          title_page, tree, is_worksheet, position_document_class, i, gapdoc_latex_option_record;\n    \n    pkg := arg[1];\n    \n    if LowercaseString( pkg ) = \"autodocworksheet\" then\n        is_worksheet := true;\n        package_info := rec( );\n        pkg_dir := DirectoryCurrent( );\n    else\n        is_worksheet := false;\n        package_info := PackageInfo( pkg )[ 1 ];\n        pkg_dir := DirectoriesPackageLibrary( pkg, \"\" )[1];\n    fi;\n\n    if Length(arg) >= 2 then\n        opt := arg[2];\n    else\n        opt := rec();\n    fi;\n\n    # Check for certain user supplied options, and if present, add them\n    # to the opt record.\n    tmp := function( key )\n        local val;\n        val := ValueOption( key );\n        if val <> fail then\n            opt.(key) := val;\n        fi;\n    end;\n    \n    tmp( \"dir\" );\n    tmp( \"scaffold\" );\n    tmp( \"autodoc\" );\n    tmp( \"gapdoc\" );\n    tmp( \"maketest\" );\n    \n    #\n    # Setup the output directory\n    #\n    if not IsBound( opt.dir ) then\n        doc_dir := \"doc\";\n    elif IsString( opt.dir ) or IsDirectory( opt.dir ) then\n        doc_dir := opt.dir;\n    else\n        Error( \"opt.dir must be a string containing a path, or a directory object\" );\n    fi;\n    \n    if IsString( doc_dir ) then\n        # Record the relative version of the path\n        doc_dir_rel := Directory( doc_dir );\n\n        # We intentionally do not use\n        #   DirectoriesPackageLibrary( pkg, \"doc\" )\n        # because it returns an empty list if the subdirectory is missing.\n        # But we want to handle that case by creating the directory.\n        doc_dir := Filename(pkg_dir, doc_dir);\n        doc_dir := Directory(doc_dir);\n\n    else\n        # TODO: doc_dir_rel = ... ?\n    fi;\n\n    # Ensure the output directory exists, create it if necessary\n    AUTODOC_CreateDirIfMissing(Filename(doc_dir, \"\"));\n    \n    # Let the developer know where we are generating the documentation.\n    # This helps diagnose problems where multiple instances of a package\n    # are visible to GAP and the wrong one is used for generating the\n    # documentation.\n    # TODO: Using Info() instead of Print?\n    Print( \"Generating documentation in \", doc_dir, \"\\n\" );\n\n    #\n    # Extract scaffolding settings, which can be controlled via\n    # opt.scaffold or package_info.AutoDoc. The former has precedence.\n    #\n    if not IsBound(opt.scaffold) then\n        # Default: enable scaffolding if and only if package_info.AutoDoc is present\n        if IsBound( package_info.AutoDoc ) then\n            scaffold := rec( );\n        fi;\n    elif IsRecord(opt.scaffold) then\n        scaffold := opt.scaffold;\n    elif IsBool(opt.scaffold) then\n        if opt.scaffold = true then\n            scaffold := rec();\n        fi;\n    else\n        Error(\"opt.scaffold must be a bool or a record\");\n    fi;\n\n    # Merge package_info.AutoDoc into scaffold\n    if IsBound(scaffold) and IsBound( package_info.AutoDoc ) then\n        AUTODOC_APPEND_RECORD_WRITEONCE( scaffold, package_info.AutoDoc );\n    fi;\n    \n    if IsBound( scaffold ) then\n        AUTODOC_WriteOnce( scaffold, \"TitlePage\", true );\n        AUTODOC_WriteOnce( scaffold, \"MainPage\", true );\n    fi;\n\n    \n    #\n    # Extract AutoDoc settings\n    #\n    if not IsBound(opt.autodoc) and not is_worksheet then\n        # Enable AutoDoc support if the package depends on AutoDoc.\n        tmp := Concatenation( package_info.Dependencies.NeededOtherPackages,\n                              package_info.Dependencies.SuggestedOtherPackages );\n        if ForAny( tmp, x -> LowercaseString(x[1]) = \"autodoc\" ) then\n            autodoc := rec();\n        fi;\n    elif IsRecord(opt.autodoc) then\n        autodoc := opt.autodoc;\n    elif IsBool(opt.autodoc) and opt.autodoc = true then\n        autodoc := rec();\n    fi;\n    \n    if IsBound(autodoc) then\n        if not IsBound( autodoc.files ) then\n            autodoc.files := [ ];\n        fi;\n        \n        if not IsBound( autodoc.scan_dirs ) and not is_worksheet then\n            autodoc.scan_dirs := [ \"gap\", \"lib\", \"examples\", \"examples/doc\" ];\n        elif not IsBound( autodoc.scan_dirs ) and is_worksheet then\n            autodoc.scan_dirs := [ ];\n        fi;\n        \n        if not IsBound( autodoc.level ) then\n            autodoc.level := 0;\n        fi;\n        \n        PushOptions( rec( level_value := autodoc.level ) );\n        \n        if not is_worksheet then\n            Append( autodoc.files, AUTODOC_FindMatchingFiles(pkg, autodoc.scan_dirs, [ \"g\", \"gi\", \"gd\" ]) );\n        fi;\n    fi;\n\n    #\n    # Extract GAPDoc settings\n    #\n    if not IsBound( opt.gapdoc ) then\n        # Enable GAPDoc support by default\n        gapdoc := rec();\n    elif IsRecord( opt.gapdoc ) then\n        gapdoc := opt.gapdoc;\n    elif IsBool( opt.gapdoc ) and opt.gapdoc = true then\n        gapdoc := rec();\n    fi;\n    \n    #\n    # Extract test settings\n    #\n    \n    if IsBound( opt.maketest ) then\n        if IsRecord( opt.maketest ) then\n            maketest := opt.maketest;\n        elif opt.maketest = true then\n            maketest := rec( );\n        fi;\n    fi;\n    \n    if IsBound( gapdoc ) then\n\n        if not IsBound( gapdoc.main ) then\n            gapdoc.main := pkg;\n        fi;\n\n        # FIXME: the following may break if a package uses more than one book\n        if IsBound( package_info.PackageDoc ) and IsBound( package_info.PackageDoc[1].BookName ) then\n            gapdoc.bookname := package_info.PackageDoc[1].BookName;\n        elif not is_worksheet then\n            # Default: book name = package name\n            gapdoc.bookname := pkg;\n\n            Print(\"\\n\");\n            Print(\"WARNING: PackageInfo.g is missing a PackageDoc entry!\\n\");\n            Print(\"Without this, your package manual will not be recognized by the GAP help system.\\n\");\n            Print(\"You can correct this by adding the following to your PackageInfo.g:\\n\");\n            Print(\"PackageDoc := rec(\\n\");\n            Print(\"  BookName  := ~.PackageName,\\n\");\n            #Print(\"  BookName  := \\\"\", pkg, \"\\\",\\n\");\n            Print(\"  ArchiveURLSubset := [\\\"doc\\\"],\\n\");\n            Print(\"  HTMLStart := \\\"doc/chap0.html\\\",\\n\");\n            Print(\"  PDFFile   := \\\"doc/manual.pdf\\\",\\n\");\n            Print(\"  SixFile   := \\\"doc/manual.six\\\",\\n\");\n            Print(\"  LongTitle := ~.Subtitle,\\n\");\n            Print(\"),\\n\");\n            Print(\"\\n\");\n        fi;\n\n        if not IsBound( gapdoc.files ) then\n            gapdoc.files := [];\n        fi;\n\n        if not IsBound( gapdoc.scan_dirs ) and not is_worksheet then\n            gapdoc.scan_dirs := [ \"gap\", \"lib\", \"examples\", \"examples/doc\" ];\n        fi;\n        \n        if not is_worksheet then\n            Append( gapdoc.files, AUTODOC_FindMatchingFiles(pkg, gapdoc.scan_dirs, [ \"g\", \"gi\", \"gd\" ]) );\n        fi;\n\n        # Attempt to weed out duplicates as they may confuse GAPDoc (this\n        # won't work if there are any non-normalized paths in the list).\n        gapdoc.files := Set( gapdoc.files );\n        \n        # Convert the file paths in gapdoc.files, which are relative to\n        # the package directory, to paths which are relative to the doc directory.\n        # For this, we assume that doc_dir_rel is normalized (e.g.\n        # it does not contains '//') and relative.\n        d := Number( Filename( doc_dir_rel, \"\" ), x -> x = '/' );\n        d := Concatenation( ListWithIdenticalEntries(d, \"../\") );\n        gapdoc.files := List( gapdoc.files, f -> Concatenation( d, f ) );\n    fi;\n    \n    \n    # read tree\n    # FIXME: shouldn't tree be declared inside of an 'if IsBound(autodoc)' section?\n    tree := DocumentationTree( );\n    \n    if IsBound( autodoc ) then\n        if IsBound( autodoc.section_intros ) then\n            AUTODOC_PROCESS_INTRO_STRINGS( autodoc.section_intros : Tree := tree );\n        fi;\n    \n        AutoDocScanFiles( autodoc.files : PackageName := pkg, Tree := tree );\n    fi;\n    \n    if is_worksheet then\n        # FIXME: We use scaffold and autodoc here without checking whether\n        # they are bound. Does that mean worksheets always use them?\n        if IsRecord( scaffold.TitlePage ) and IsBound( scaffold.TitlePage.Title ) then\n            pkg := scaffold.TitlePage.Title;\n\n        elif IsBound( tree!.TitlePage.Title ) then\n            pkg := tree!.TitlePage.Title;\n\n        elif IsBound( autodoc.files ) and Length( autodoc.files ) > 0  then\n            pkg := autodoc.files[ 1 ];\n            \n            while Position( pkg, '/' ) <> fail do\n                Remove( pkg, 1 );\n            od;\n            \n            while Position( pkg, '.' ) <> fail do\n                Remove( pkg, Length( pkg ) );\n            od;\n\n        else\n            Error( \"could not figure out a title.\" );\n        fi;\n        \n        if not IsString( pkg ) then\n            pkg := JoinStringsWithSeparator( pkg, \" \" );\n        fi;\n        \n        gapdoc.main := ReplacedString( pkg, \" \", \"_\" );\n        gapdoc.bookname := ReplacedString( pkg, \" \", \"_\" );\n    fi;\n    \n    #\n    # Generate scaffold\n    #\n    gapdoc_latex_option_record := rec( );\n    \n    if IsBound( scaffold ) then\n        ## Syntax is [ \"class\", [ \"options\" ] ]\n        if IsBound( scaffold.document_class ) then\n            position_document_class := PositionSublist( GAPDoc2LaTeXProcs.Head, \"documentclass\" );\n            \n            if IsString( scaffold.document_class ) then\n                scaffold.document_class := [ scaffold.document_class ];\n            fi;\n            \n            if position_document_class = fail then\n                Error( \"something is wrong with the LaTeX header\" );\n            fi;\n            \n            GAPDoc2LaTeXProcs.Head := Concatenation(\n                  GAPDoc2LaTeXProcs.Head{[ 1 .. PositionSublist( GAPDoc2LaTeXProcs.Head, \"{\", position_document_class ) ]},\n                  scaffold.document_class[ 1 ],\n                  GAPDoc2LaTeXProcs.Head{[ PositionSublist( GAPDoc2LaTeXProcs.Head, \"}\", position_document_class ) .. Length( GAPDoc2LaTeXProcs.Head ) ]} );\n            \n            if Length( scaffold.document_class ) = 2 then\n                \n                GAPDoc2LaTeXProcs.Head := Concatenation(\n                      GAPDoc2LaTeXProcs.Head{[ 1 .. PositionSublist( GAPDoc2LaTeXProcs.Head, \"[\", position_document_class ) ]},\n                      scaffold.document_class[ 2 ],\n                      GAPDoc2LaTeXProcs.Head{[ PositionSublist( GAPDoc2LaTeXProcs.Head, \"]\", position_document_class ) .. Length( GAPDoc2LaTeXProcs.Head ) ]} );\n            fi;\n        fi;\n        \n        if IsBound( scaffold.latex_header_file ) then\n            GAPDoc2LaTeXProcs.Head := StringFile( scaffold.latex_header_file );\n        fi;\n        \n        if IsBound( scaffold.gapdoc_latex_options ) then\n            if IsRecord( scaffold.gapdoc_latex_options ) then\n                for i in RecNames( scaffold.gapdoc_latex_options ) do\n                    if not IsString( scaffold.gapdoc_latex_options.( i ) )\n                       and IsList( scaffold.gapdoc_latex_options.( i ) )\n                       and LowercaseString( scaffold.gapdoc_latex_options.( i )[ 1 ] ) = \"file\" then\n                        scaffold.gapdoc_latex_options.( i ) := StringFile( scaffold.gapdoc_latex_options.( i )[ 2 ] );\n                    fi;\n                od;\n                \n                gapdoc_latex_option_record := scaffold.gapdoc_latex_options;\n            fi;\n        fi;\n        \n        if not IsBound( scaffold.includes ) then\n            scaffold.includes := [ ];\n        fi;\n\n        if IsBound( autodoc ) then\n            # If scaffold.includes is already set, then we add\n            # AutoDocMainFile.xml to it, but *only* if it not already\n            # there. This way, package authors can control where\n            # it is put in their includes list.\n            if not \"AutoDocMainFile.xml\" in scaffold.includes then\n                Add( scaffold.includes, \"AutoDocMainFile.xml\" );\n            fi;\n        fi;\n\n        if IsBound( scaffold.bib ) and IsBool( scaffold.bib ) then\n            if scaffold.bib = true then\n                scaffold.bib := Concatenation( pkg, \".bib\" );\n            else\n                Unbind( scaffold.bib );\n            fi;\n        elif not IsBound( scaffold.bib ) then\n            # If there is a doc/PKG.bib file, assume that we want to reference it in the scaffold.\n            if IsReadableFile( Filename( doc_dir, Concatenation( pkg, \".bib\" ) ) ) then\n                scaffold.bib := Concatenation( pkg, \".bib\" );\n            fi;\n        fi;\n        \n        AUTODOC_WriteOnce( scaffold, \"index\", true );\n\n        if IsBound( gapdoc ) then\n            if AUTODOC_GetSuffix( gapdoc.main ) = \"xml\" then\n                scaffold.main_xml_file := gapdoc.main;\n            else\n                scaffold.main_xml_file := Concatenation( gapdoc.main, \".xml\" );\n            fi;\n        fi;\n\n        # TODO: It should be possible to only rebuild the title page. (Perhaps also only the main page? but this is less important)\n        if IsBound( scaffold.TitlePage ) then\n            if IsRecord( scaffold.TitlePage ) then\n                title_page := scaffold.TitlePage;\n            else\n                title_page := rec( );\n            fi;\n            \n            AUTODOC_WriteOnce( title_page, \"dir\", doc_dir );\n            AUTODOC_APPEND_RECORD_WRITEONCE( title_page, tree!.TitlePage );\n            \n            if not is_worksheet then\n                AUTODOC_APPEND_RECORD_WRITEONCE( title_page, ExtractTitleInfoFromPackageInfo( pkg ) );\n            fi;\n            \n            CreateTitlePage( title_page );\n        fi;\n        \n        if IsBound( scaffold.MainPage ) and scaffold.MainPage <> false then\n            scaffold.dir := doc_dir;\n            scaffold.book_name := pkg;\n            CreateMainPage( scaffold );\n        fi;\n    fi;\n    \n    #\n    # Run AutoDoc\n    #\n    if IsBound( autodoc ) then\n        WriteDocumentation( tree, doc_dir );\n    fi;\n    \n    \n    #\n    # Run GAPDoc\n    #\n    if IsBound( gapdoc ) then\n\n        # Ask GAPDoc to use UTF-8 as input encoding for LaTeX, as the XML files\n        # of the documentation are also in UTF-8 encoding, and may contain characters\n        # not contained in the default Latin 1 encoding.\n        SetGapDocLaTeXOptions( \"utf8\", gapdoc_latex_option_record );\n\n        MakeGAPDocDoc( doc_dir, gapdoc.main, gapdoc.files, gapdoc.bookname, \"MathJax\" );\n\n        CopyHTMLStyleFiles( Filename( doc_dir, \"\" ) );\n\n        # The following (undocumented) API is there for compatibility\n        # with old-style gapmacro.tex based package manuals. It\n        # produces a manual.lab file which those packages can use if\n        # they wish to link to things in the manual we are currently\n        # generating. This can probably be removed eventually, but for\n        # now, doing it does not hurt.\n        \n        # FIXME: It seems that this command does not work if pdflatex\n        #        is not present. Maybe we should remove it.\n        \n        if not is_worksheet then\n            GAPDocManualLab( pkg );\n        fi;\n\n    fi;\n    \n    if IsBound( maketest ) then\n        \n        AUTODOC_WriteOnce( maketest, \"filename\", \"maketest.g\" );\n        AUTODOC_WriteOnce( maketest, \"folder\", pkg_dir );\n        AUTODOC_WriteOnce( maketest, \"scan_dir\", doc_dir );\n        AUTODOC_WriteOnce( maketest, \"files_to_scan\", gapdoc.files );\n\n        if IsString( maketest.folder ) then\n            maketest.folder := Directory( maketest.folder );\n        fi;\n        \n        if IsString( maketest.scan_dir ) then\n            maketest.scan_dir := Directory( maketest.scan_dir );\n        fi;\n        \n        AUTODOC_WriteOnce( maketest, \"commands\", [ ] );\n        AUTODOC_WriteOnce( maketest, \"book_name\", gapdoc.main );\n        \n        CreateMakeTest( maketest );\n    fi;\n\n    return true;\nend );\n"
  },
  {
    "path": "src/test/resources/samples/langs/GAP/PackageInfo.g",
    "content": "#############################################################################\n##  \n##  PackageInfo.g for the package `cvec'                      Max Neunhoeffer\n##\n##  (created from Frank Lübeck's PackageInfo.g template file)\n##  \n\nSetPackageInfo( rec(\n\nPackageName := \"cvec\",\nSubtitle := \"Compact vectors over finite fields\",\nVersion := \"2.5.1\",\nDate := \"04/04/2014\", # dd/mm/yyyy format\n\n##  Information about authors and maintainers.\nPersons := [\n  rec( \n    LastName      := \"Neunhoeffer\",\n    FirstNames    := \"Max\",\n    IsAuthor      := true,\n    IsMaintainer  := false,\n    Email         := \"neunhoef@mcs.st-and.ac.uk\",\n    WWWHome       := \"http://www-groups.mcs.st-and.ac.uk/~neunhoef/\",\n    PostalAddress := Concatenation( [\n                       \"School of Mathematics and Statistics\\n\",\n                       \"University of St Andrews\\n\",\n                       \"Mathematical Institute\\n\",\n                       \"North Haugh\\n\",\n                       \"St Andrews, Fife KY16 9SS\\n\",\n                       \"Scotland, UK\" ] ),\n    Place         := \"St Andrews\",\n    Institution   := \"University of St Andrews\"\n  ),\n],\n\n##  Status information. Currently the following cases are recognized:\n##    \"accepted\"      for successfully refereed packages\n##    \"deposited\"     for packages for which the GAP developers agreed \n##                    to distribute them with the core GAP system\n##    \"dev\"           for development versions of packages \n##    \"other\"         for all other packages\n##\n# Status := \"accepted\",\nStatus := \"deposited\",\n\n##  You must provide the next two entries if and only if the status is \n##  \"accepted\" because is was successfully refereed:\n# format: 'name (place)'\n# CommunicatedBy := \"Mike Atkinson (St. Andrews)\",\n#CommunicatedBy := \"\",\n# format: mm/yyyy\n# AcceptDate := \"08/1999\",\n#AcceptDate := \"\",\n\nPackageWWWHome := \"http://neunhoef.github.io/cvec/\",\nREADME_URL     := Concatenation(~.PackageWWWHome, \"README\"),\nPackageInfoURL := Concatenation(~.PackageWWWHome, \"PackageInfo.g\"),\nArchiveURL     := Concatenation(\"https://github.com/neunhoef/cvec/\",\n                                \"releases/download/v\", ~.Version,\n                                \"/cvec-\", ~.Version),\nArchiveFormats := \".tar.gz .tar.bz2\",\n\n##  Here you  must provide a short abstract explaining the package content \n##  in HTML format (used on the package overview Web page) and an URL \n##  for a Webpage with more detailed information about the package\n##  (not more than a few lines, less is ok):\n##  Please, use '<span class=\"pkgname\">GAP</span>' and\n##  '<span class=\"pkgname\">MyPKG</span>' for specifing package names.\n##  \nAbstractHTML := \n  \"This package provides an implementation of compact vectors over finite\\\n   fields. Contrary to earlier implementations no table lookups are used\\\n   but only word-based processor arithmetic. This allows for bigger finite\\\n   fields and higher speed.\",\n\nPackageDoc := rec(\n  BookName  := \"cvec\",\n  ArchiveURLSubset := [\"doc\"],\n  HTMLStart := \"doc/chap0.html\",\n  PDFFile   := \"doc/manual.pdf\",\n  SixFile   := \"doc/manual.six\",\n  LongTitle := \"Compact vectors over finite fields\",\n),\n\nDependencies := rec(\n  GAP := \">=4.5.5\",\n  NeededOtherPackages := [\n    [\"GAPDoc\", \">= 1.2\"],\n    [\"IO\", \">= 4.1\"],\n    [\"orb\", \">= 4.2\"],\n  ],\n  SuggestedOtherPackages := [],\n  ExternalConditions := []\n),\n\nAvailabilityTest := function()\n  if not \"cvec\" in SHOW_STAT() and\n     Filename(DirectoriesPackagePrograms(\"cvec\"), \"cvec.so\") = fail then\n    #Info(InfoWarning, 1, \"cvec: kernel cvec functions not available.\");\n    return fail;\n  fi;\n  return true;\nend,\n\n##  *Optional*, but recommended: path relative to package root to a file which \n##  contains as many tests of the package functionality as sensible.\n#TestFile := \"tst/testall.g\",\n\n##  *Optional*: Here you can list some keyword related to the topic \n##  of the package.\nKeywords := []\n\n));\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/GAP/bugfix.tst",
    "content": "gap> START_TEST(\"Test for various former bugs\");\n\n\ngap> # The following used to trigger an error starting with:\ngap> # \"SolutionMat: matrix and vector incompatible called from\"\ngap> K:=AbelianPcpGroup([3,3,3]);;\ngap> A:=Subgroup(K,[K.1]);;\ngap> cr:=CRRecordBySubgroup(K,A);;\ngap> ExtensionsCR(cr);;\n\n\n# Comparing homomorphisms used to be broken\ngap> K:=AbelianPcpGroup(1,[3]);;\ngap> hom1:=GroupHomomorphismByImages(K,K,[K.1],[K.1]);;\ngap> hom2:=GroupHomomorphismByImages(K,K,[K.1^2],[K.1^2]);;\ngap> hom1=hom2;\ntrue\ngap> hom1=IdentityMapping(K);\ntrue\ngap> hom2=IdentityMapping(K);\ntrue\n\n\ngap> # The following incorrectly triggered an error at some point\ngap> IsTorsionFree(ExamplesOfSomePcpGroups(5));\ntrue\n\n\ngap> # Verify IsGeneratorsOfMagmaWithInverses warnings are silenced\ngap> IsGeneratorsOfMagmaWithInverses(GeneratorsOfGroup(ExamplesOfSomePcpGroups(5)));\ntrue\n\n\ngap> # Check for a bug reported 2012-01-19 by Robert Morse\ngap> g := PcGroupToPcpGroup(SmallGroup(48,1));\nPcp-group with orders [ 2, 2, 2, 2, 3 ]\ngap> # The next two commands used to trigger errors\ngap> NonAbelianTensorSquare(Centre(g));\nPcp-group with orders [ 8 ]\ngap> NonAbelianExteriorSquare(Centre(g));\nPcp-group with orders [  ]\n\n\ngap> # Check for a bug reported 2012-01-19 by Robert Morse\ngap> F := FreeGroup(\"x\",\"y\");\n<free group on the generators [ x, y ]>\ngap> x := F.1;; y := F.2;;\ngap> G := F/[x^2/y^24, y^24, y^x/y^23];\n<fp group on the generators [ x, y ]>\ngap> iso := IsomorphismPcGroup(G);\n[ x, y ] -> [ f1, f2*f5 ]\ngap> iso1 := IsomorphismPcpGroup(Image(iso));\n[ f1, f2, f3, f4, f5 ] -> [ g1, g2, g3, g4, g5 ]\ngap> G := Image(iso*iso1);\nPcp-group with orders [ 2, 2, 2, 2, 3 ]\ngap> # The next command used to trigger an error\ngap> NonAbelianTensorSquare(Image(iso*iso1));\nPcp-group with orders [ 2, 2, 3, 2, 2, 2, 2 ]\n\n\ngap> # The problem with the previous example is/was that Igs(G)\ngap> # is set to a non-standard value:\ngap> Igs(G);\n[ g1, g2*g5, g3*g4*g5^2, g4*g5, g5 ]\ngap> # Unfortunately, it seems that a lot of code that\ngap> # really should be using Ngs or Cgs is using Igs incorrectly.\ngap> # For example, direct products could return *invalid* embeddings:\ngap> D := DirectProduct(G, G);\nPcp-group with orders [ 2, 2, 2, 2, 3, 2, 2, 2, 2, 3 ]\ngap> hom:=Embedding(D,1);;\ngap> mapi:=MappingGeneratorsImages(hom);;\ngap> GroupHomomorphismByImages(Source(hom),Range(hom),mapi[1],mapi[2]) <> fail;\ntrue\ngap> hom:=Projection(D,1);;\ngap> mapi:=MappingGeneratorsImages(hom);;\ngap> GroupHomomorphismByImages(Source(hom),Range(hom),mapi[1],mapi[2]) <> fail;\ntrue\n\n\ngap> # Check for bug computing Schur extension of infinite cyclic groups,\ngap> # found by Max Horn 2012-05-25\ngap> G:=AbelianPcpGroup(1,[0]);\nPcp-group with orders [ 0 ]\ngap> # The next command used to trigger an error\ngap> SchurExtension(G);\nPcp-group with orders [ 0 ]\n\n\ngap> # Check for bug computing Schur extensions of subgroups, found by MH 2012-05-25.\ngap> G:=HeisenbergPcpGroup(2);\nPcp-group with orders [ 0, 0, 0, 0, 0 ]\ngap> H:=Subgroup(G,[G.2^3*G.3^2, G.1^9]);\nPcp-group with orders [ 0, 0, 0 ]\ngap> # The next command used to trigger an error\ngap> SchurExtension(H);\nPcp-group with orders [ 0, 0, 0, 0, 0, 0 ]\n\n\ngap> # Check for bug computing Schur extensions of subgroups, found by MH 2012-05-25.\ngap> G:=HeisenbergPcpGroup(2);\nPcp-group with orders [ 0, 0, 0, 0, 0 ]\ngap> H:=Subgroup(G,[G.1, G.2]);\nPcp-group with orders [ 0, 0 ]\ngap> # The next command used to trigger an error\ngap> SchurExtension(H);\nPcp-group with orders [ 0, 0, 0 ]\n\n\ngap> # Check for bug computing normalizer of two subgroups, found by MH 2012-05-30.\ngap> # The problem was caused by incorrect resp. overly restrictive use of Parent().\ngap> G:=HeisenbergPcpGroup(2);\nPcp-group with orders [ 0, 0, 0, 0, 0 ]\ngap> A:=Subgroup(Subgroup(G,[G.2,G.3,G.4,G.5]), [G.3]);\nPcp-group with orders [ 0 ]\ngap> B:=Subgroup(Subgroup(G,[G.1,G.4,G.5]), [G.4]);\nPcp-group with orders [ 0 ]\ngap> Normalizer(A,B);\nPcp-group with orders [ 0 ]\ngap> # The following used to trigger the error \"arguments must have a common parent group\"\ngap> Normalizer(B,A);\nPcp-group with orders [ 0 ]\n\n\ngap> # In polycyclic 2.9 and 2.10, the code for 2-cohomology computations was broken.\ngap> G := UnitriangularPcpGroup(3,0);\nPcp-group with orders [ 0, 0, 0 ]\ngap> mats := G!.mats;\n[ [ [ 1, 1, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ], \n  [ [ 1, 0, 0 ], [ 0, 1, 1 ], [ 0, 0, 1 ] ], \n  [ [ 1, 0, 1 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] ]\ngap> C := CRRecordByMats(G,mats);;\ngap> cc := TwoCohomologyCR(C);;\ngap> cc.factor.rels;\n[ 2, 0, 0 ]\ngap> c := cc.factor.prei[2];\n[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 1 ]\ngap> cc.gcb;\n[ [ 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0 ], \n  [ 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1 ], \n  [ -1, 0, 1, 1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], \n  [ 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1 ] ]\ngap> cc.gcc;\n[ [ 1, 0, 0, 0, 0, -2, -1, 0, 1, 1, -1, -1, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 0, 1, 0, 0, -2, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 0, 0, 1, 0, 0, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 1 ], \n  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1 ] ]\n\n\ngap> # LowerCentralSeriesOfGroup for non-nilpotent pcp-groups used to trigger\ngap> # an infinite recursion\ngap> G := PcGroupToPcpGroup(SmallGroup(6,1));\nPcp-group with orders [ 2, 3 ]\ngap> LowerCentralSeriesOfGroup(G);\n[ Pcp-group with orders [ 2, 3 ], Pcp-group with orders [ 3 ] ]\n\n\ngap> STOP_TEST( \"bugfix.tst\", 10000000);\n"
  },
  {
    "path": "src/test/resources/samples/langs/GAP/example.gd",
    "content": "#############################################################################\n##\n#W  example.gd\n##\n##  This file contains a sample of a GAP declaration file.\n##\nDeclareProperty( \"SomeProperty\", IsLeftModule );\nDeclareGlobalFunction( \"SomeGlobalFunction\" );\n\n\n#############################################################################\n##\n#C  IsQuuxFrobnicator(<R>)\n##\n##  <ManSection>\n##  <Filt Name=\"IsQuuxFrobnicator\" Arg='R' Type='Category'/>\n##\n##  <Description>\n##  Tests whether R is a quux frobnicator.\n##  </Description>\n##  </ManSection>\n##\nDeclareSynonym( \"IsQuuxFrobnicator\", IsField and IsGroup );\n"
  },
  {
    "path": "src/test/resources/samples/langs/GAP/example.gi",
    "content": "#############################################################################\n##\n#W  example.gd\n##\n##  This file contains a sample of a GAP implementation file.\n##\n\n\n#############################################################################\n##\n#M  SomeOperation( <val> )\n##\n##  performs some operation on <val>\n##\nInstallMethod( SomeProperty,\n    \"for left modules\",\n    [ IsLeftModule ], 0,\n    function( M )\n    if IsFreeLeftModule( M ) and not IsTrivial( M ) then\n      return true;\n    fi;\n    TryNextMethod();\n    end );\n\n\n\n#############################################################################\n##\n#F  SomeGlobalFunction( )\n##\n##  A global variadic funfion.\n##\nInstallGlobalFunction( SomeGlobalFunction, function( arg )\n    if Length( arg ) = 3 then\n      return arg[1] + arg[2] * arg[3];\n    elif Length( arg ) = 2 then\n      return arg[1] - arg[2]\n    else\n      Error( \"usage: SomeGlobalFunction( <x>, <y>[, <z>] )\" );\n    fi;\n    end );\n\n\n#\n# A plain function.\n#\nSomeFunc := function(x, y)\n    local z, func, tmp, j;\n    z := x * 1.0;\n    y := 17^17 - y;\n    func := a -> a mod 5;\n    tmp := List( [1..50], func );\n    while y > 0 do\n        for j in tmp do\n            Print(j, \"\\n\");\n        od;\n        repeat\n            y := y - 1;\n        until 0 < 1;\n        y := y -1;\n    od;\n    return z;\nend;\n        "
  },
  {
    "path": "src/test/resources/samples/langs/GAP/factor.tst",
    "content": "gap> START_TEST(\"Test of factor groups and natural homomorphisms\");\n\ngap> G:=HeisenbergPcpGroup(2);\nPcp-group with orders [ 0, 0, 0, 0, 0 ]\n\ngap> H:=Subgroup(G,[G.2,G.3,G.4,G.5]);\ngap> K:=G/H;\ngap> NaturalHomomorphism(K);\n\ngap> A:=Subgroup(H, [G.3]);\nPcp-group with orders [ 0 ]\ngap> B:=Subgroup(Subgroup(G,[G.1,G.4,G.5]), [G.4]);\nPcp-group with orders [ 0 ]\ngap> Normalizer(A,B);\nPcp-group with orders [ 0 ]\ngap> # The following used to trigger the error \"arguments must have a common parent group\"\ngap> Normalizer(B,A);\nPcp-group with orders [ 0 ]\n\n\ngap> STOP_TEST( \"factor.tst\", 10000000);\n"
  },
  {
    "path": "src/test/resources/samples/langs/GAP/vspc.gd",
    "content": "#############################################################################\n##\n#W  vspc.gd                     GAP library                     Thomas Breuer\n##\n##\n#Y  Copyright (C)  1997,  Lehrstuhl D für Mathematik,  RWTH Aachen,  Germany\n#Y  (C) 1998 School Math and Comp. Sci., University of St Andrews, Scotland\n#Y  Copyright (C) 2002 The GAP Group\n##\n##  This file declares the operations for vector spaces.\n##\n##  The operations for bases of free left modules can be found in the file\n##  <F>lib/basis.gd<F>.\n##\n\n\n#############################################################################\n##\n#C  IsLeftOperatorRing(<R>)\n##\n##  <ManSection>\n##  <Filt Name=\"IsLeftOperatorRing\" Arg='R' Type='Category'/>\n##\n##  <Description>\n##  </Description>\n##  </ManSection>\n##\nDeclareSynonym( \"IsLeftOperatorRing\",\n    IsLeftOperatorAdditiveGroup and IsRing and IsAssociativeLOpDProd );\n#T really?\n\n\n#############################################################################\n##\n#C  IsLeftOperatorRingWithOne(<R>)\n##\n##  <ManSection>\n##  <Filt Name=\"IsLeftOperatorRingWithOne\" Arg='R' Type='Category'/>\n##\n##  <Description>\n##  </Description>\n##  </ManSection>\n##\nDeclareSynonym( \"IsLeftOperatorRingWithOne\",\n    IsLeftOperatorAdditiveGroup and IsRingWithOne\n    and IsAssociativeLOpDProd );\n#T really?\n\n\n#############################################################################\n##\n#C  IsLeftVectorSpace( <V> )\n#C  IsVectorSpace( <V> )\n##\n##  <#GAPDoc Label=\"IsLeftVectorSpace\">\n##  <ManSection>\n##  <Filt Name=\"IsLeftVectorSpace\" Arg='V' Type='Category'/>\n##  <Filt Name=\"IsVectorSpace\" Arg='V' Type='Category'/>\n##\n##  <Description>\n##  A <E>vector space</E> in &GAP; is a free left module\n##  (see&nbsp;<Ref Func=\"IsFreeLeftModule\"/>) over a division ring\n##  (see Chapter&nbsp;<Ref Chap=\"Fields and Division Rings\"/>).\n##  <P/>\n##  Whenever we talk about an <M>F</M>-vector space <A>V</A> then <A>V</A> is\n##  an additive group (see&nbsp;<Ref Func=\"IsAdditiveGroup\"/>) on which the\n##  division ring <M>F</M> acts via multiplication from the left such that\n##  this action and the addition in <A>V</A> are left and right distributive.\n##  The division ring <M>F</M> can be accessed as value of the attribute\n##  <Ref Func=\"LeftActingDomain\"/>.\n##  <P/>\n##  Vector spaces in &GAP; are always <E>left</E> vector spaces,\n##  <Ref Filt=\"IsLeftVectorSpace\"/> and <Ref Filt=\"IsVectorSpace\"/> are\n##  synonyms.\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"IsLeftVectorSpace\",\n    IsLeftModule and IsLeftActedOnByDivisionRing );\n\nDeclareSynonym( \"IsVectorSpace\", IsLeftVectorSpace );\n\nInstallTrueMethod( IsFreeLeftModule,\n    IsLeftModule and IsLeftActedOnByDivisionRing );\n\n\n#############################################################################\n##\n#F  IsGaussianSpace( <V> )\n##\n##  <#GAPDoc Label=\"IsGaussianSpace\">\n##  <ManSection>\n##  <Func Name=\"IsGaussianSpace\" Arg='V'/>\n##\n##  <Description>\n##  The filter <Ref Filt=\"IsGaussianSpace\"/> (see&nbsp;<Ref Sect=\"Filters\"/>)\n##  for the row space (see&nbsp;<Ref Func=\"IsRowSpace\"/>)\n##  or matrix space (see&nbsp;<Ref Func=\"IsMatrixSpace\"/>) <A>V</A>\n##  over the field <M>F</M>, say,\n##  indicates that the entries of all row vectors or matrices in <A>V</A>,\n##  respectively, are all contained in <M>F</M>.\n##  In this case, <A>V</A> is called a <E>Gaussian</E> vector space.\n##  Bases for Gaussian spaces can be computed using Gaussian elimination for\n##  a given list of vector space generators.\n##  <Example><![CDATA[\n##  gap> mats:= [ [[1,1],[2,2]], [[3,4],[0,1]] ];;\n##  gap> V:= VectorSpace( Rationals, mats );;\n##  gap> IsGaussianSpace( V );\n##  true\n##  gap> mats[1][1][1]:= E(4);;   # an element in an extension field\n##  gap> V:= VectorSpace( Rationals, mats );;\n##  gap> IsGaussianSpace( V );\n##  false\n##  gap> V:= VectorSpace( Field( Rationals, [ E(4) ] ), mats );;\n##  gap> IsGaussianSpace( V );\n##  true\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareFilter( \"IsGaussianSpace\", IsVectorSpace );\n\nInstallTrueMethod( IsGaussianSpace,\n    IsVectorSpace and IsFullMatrixModule );\n\nInstallTrueMethod( IsGaussianSpace,\n    IsVectorSpace and IsFullRowModule );\n\n\n#############################################################################\n##\n#C  IsDivisionRing( <D> )\n##\n##  <#GAPDoc Label=\"IsDivisionRing\">\n##  <ManSection>\n##  <Filt Name=\"IsDivisionRing\" Arg='D' Type='Category'/>\n##\n##  <Description>\n##  A <E>division ring</E> in &GAP; is a nontrivial associative algebra\n##  <A>D</A> with a multiplicative inverse for each nonzero element.\n##  In &GAP; every division ring is a vector space over a division ring\n##  (possibly over itself).\n##  Note that being a division ring is thus not a property that a ring can\n##  get, because a ring is usually not represented as a vector space.\n##  <P/>\n##  The field of coefficients is stored as the value of the attribute\n##  <Ref Func=\"LeftActingDomain\"/> of <A>D</A>.\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonymAttr( \"IsDivisionRing\",\n        IsMagmaWithInversesIfNonzero\n    and IsLeftOperatorRingWithOne\n    and IsLeftVectorSpace\n    and IsNonTrivial\n    and IsAssociative\n    and IsEuclideanRing );\n\n\n#############################################################################\n##\n#A  GeneratorsOfLeftVectorSpace( <V> )\n#A  GeneratorsOfVectorSpace( <V> )\n##\n##  <#GAPDoc Label=\"GeneratorsOfLeftVectorSpace\">\n##  <ManSection>\n##  <Attr Name=\"GeneratorsOfLeftVectorSpace\" Arg='V'/>\n##  <Attr Name=\"GeneratorsOfVectorSpace\" Arg='V'/>\n##\n##  <Description>\n##  For an <M>F</M>-vector space <A>V</A>,\n##  <Ref Attr=\"GeneratorsOfLeftVectorSpace\"/> returns a list of vectors in\n##  <A>V</A> that generate <A>V</A> as an <M>F</M>-vector space.\n##  <Example><![CDATA[\n##  gap> GeneratorsOfVectorSpace( FullRowSpace( Rationals, 3 ) );\n##  [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonymAttr( \"GeneratorsOfLeftVectorSpace\",\n    GeneratorsOfLeftOperatorAdditiveGroup );\n\nDeclareSynonymAttr( \"GeneratorsOfVectorSpace\",\n    GeneratorsOfLeftOperatorAdditiveGroup );\n\n\n#############################################################################\n##\n#A  CanonicalBasis( <V> )\n##\n##  <#GAPDoc Label=\"CanonicalBasis\">\n##  <ManSection>\n##  <Attr Name=\"CanonicalBasis\" Arg='V'/>\n##\n##  <Description>\n##  If the vector space <A>V</A> supports a <E>canonical basis</E> then\n##  <Ref Attr=\"CanonicalBasis\"/> returns this basis,\n##  otherwise <K>fail</K> is returned.\n##  <P/>\n##  The defining property of a canonical basis is that its vectors are\n##  uniquely determined by the vector space.\n##  If canonical bases exist for two vector spaces over the same left acting\n##  domain (see&nbsp;<Ref Func=\"LeftActingDomain\"/>) then the equality of\n##  these vector spaces can be decided by comparing the canonical bases.\n##  <P/>\n##  The exact meaning of a canonical basis depends on the type of <A>V</A>.\n##  Canonical bases are defined for example for Gaussian row and matrix\n##  spaces (see&nbsp;<Ref Sect=\"Row and Matrix Spaces\"/>).\n##  <P/>\n##  If one designs a new kind of vector spaces\n##  (see&nbsp;<Ref Sect=\"How to Implement New Kinds of Vector Spaces\"/>) and\n##  defines a canonical basis for these spaces then the\n##  <Ref Attr=\"CanonicalBasis\"/> method one installs\n##  (see&nbsp;<Ref Func=\"InstallMethod\"/>)\n##  must <E>not</E> call <Ref Func=\"Basis\"/>.\n##  On the other hand, one probably should install a <Ref Func=\"Basis\"/>\n##  method that simply calls <Ref Attr=\"CanonicalBasis\"/>,\n##  the value of the method\n##  (see&nbsp;<Ref Sect=\"Method Installation\"/> and\n##  <Ref Sect=\"Applicable Methods and Method Selection\"/>)\n##  being <C>CANONICAL_BASIS_FLAGS</C>.\n##  <Example><![CDATA[\n##  gap> vecs:= [ [ 1, 2, 3 ], [ 1, 1, 1 ], [ 1, 1, 1 ] ];;\n##  gap> V:= VectorSpace( Rationals, vecs );;\n##  gap> B:= CanonicalBasis( V );\n##  CanonicalBasis( <vector space over Rationals, with 3 generators> )\n##  gap> BasisVectors( B );\n##  [ [ 1, 0, -1 ], [ 0, 1, 2 ] ]\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareAttribute( \"CanonicalBasis\", IsFreeLeftModule );\n\n\n#############################################################################\n##\n#F  IsRowSpace( <V> )\n##\n##  <#GAPDoc Label=\"IsRowSpace\">\n##  <ManSection>\n##  <Func Name=\"IsRowSpace\" Arg='V'/>\n##\n##  <Description>\n##  A <E>row space</E> in &GAP; is a vector space that consists of\n##  row vectors (see Chapter&nbsp;<Ref Chap=\"Row Vectors\"/>).\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"IsRowSpace\", IsRowModule and IsVectorSpace );\n\n\n#############################################################################\n##\n#F  IsGaussianRowSpace( <V> )\n##\n##  <ManSection>\n##  <Func Name=\"IsGaussianRowSpace\" Arg='V'/>\n##\n##  <Description>\n##  A row space is <E>Gaussian</E> if the left acting domain contains all\n##  scalars that occur in the vectors.\n##  Thus one can use Gaussian elimination in the calculations.\n##  <P/>\n##  (Otherwise the space is non-Gaussian.\n##  We will need a flag for this to write down methods that delegate from\n##  non-Gaussian spaces to Gaussian ones.)\n##  <!-- reformulate this when it becomes documented -->\n##  </Description>\n##  </ManSection>\n##\nDeclareSynonym( \"IsGaussianRowSpace\", IsGaussianSpace and IsRowSpace );\n\n\n#############################################################################\n##\n#F  IsNonGaussianRowSpace( <V> )\n##\n##  <ManSection>\n##  <Func Name=\"IsNonGaussianRowSpace\" Arg='V'/>\n##\n##  <Description>\n##  If an <M>F</M>-vector space <A>V</A> is in the filter\n##  <Ref Func=\"IsNonGaussianRowSpace\"/> then this expresses that <A>V</A>\n##  consists of row vectors (see&nbsp;<Ref Func=\"IsRowVector\"/>) such\n##  that not all entries in these row vectors are contained in <M>F</M>\n##  (so Gaussian elimination cannot be used to compute an <M>F</M>-basis\n##  from a list of vector space generators),\n##  and that <A>V</A> is handled via the mechanism of nice bases\n##  (see&nbsp;<Ref ???=\"...\"/>) in the following way.\n##  Let <M>K</M> be the field spanned by the entries of all vectors in\n##  <A>V</A>.\n##  Then the <Ref Attr=\"NiceFreeLeftModuleInfo\"/> value of <A>V</A> is\n##  a basis <M>B</M> of the field extension <M>K / ( K \\cap F )</M>,\n##  and the <Ref Func=\"NiceVector\"/> value of <M>v \\in <A>V</A></M>\n##  is defined by replacing each entry of <M>v</M> by the list of its\n##  <M>B</M>-coefficients, and then forming the concatenation.\n##  <P/>\n##  So the associated nice vector space is a Gaussian row space\n##  (see&nbsp;<Ref Func=\"IsGaussianRowSpace\"/>).\n##  </Description>\n##  </ManSection>\n##\nDeclareHandlingByNiceBasis( \"IsNonGaussianRowSpace\",\n    \"for non-Gaussian row spaces\" );\n\n\n#############################################################################\n##\n#F  IsMatrixSpace( <V> )\n##\n##  <#GAPDoc Label=\"IsMatrixSpace\">\n##  <ManSection>\n##  <Func Name=\"IsMatrixSpace\" Arg='V'/>\n##\n##  <Description>\n##  A <E>matrix space</E> in &GAP; is a vector space that consists of matrices\n##  (see Chapter&nbsp;<Ref Chap=\"Matrices\"/>).\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"IsMatrixSpace\", IsMatrixModule and IsVectorSpace );\n\n\n#############################################################################\n##\n#F  IsGaussianMatrixSpace( <V> )\n##\n##  <ManSection>\n##  <Func Name=\"IsGaussianMatrixSpace\" Arg='V'/>\n##\n##  <Description>\n##  A matrix space is Gaussian if the left acting domain contains all\n##  scalars that occur in the vectors.\n##  Thus one can use Gaussian elimination in the calculations.\n##  <P/>\n##  (Otherwise the space is non-Gaussian.\n##  We will need a flag for this to write down methods that delegate from\n##  non-Gaussian spaces to Gaussian ones.)\n##  </Description>\n##  </ManSection>\n##\nDeclareSynonym( \"IsGaussianMatrixSpace\", IsGaussianSpace and IsMatrixSpace );\n\n\n#############################################################################\n##\n#F  IsNonGaussianMatrixSpace( <V> )\n##\n##  <ManSection>\n##  <Func Name=\"IsNonGaussianMatrixSpace\" Arg='V'/>\n##\n##  <Description>\n##  If an <M>F</M>-vector space <A>V</A> is in the filter\n##  <Ref Func=\"IsNonGaussianMatrixSpace\"/>\n##  then this expresses that <A>V</A> consists of matrices\n##  (see&nbsp;<Ref Func=\"IsMatrix\"/>)\n##  such that not all entries in these matrices are contained in <M>F</M>\n##  (so Gaussian elimination cannot be used to compute an <M>F</M>-basis\n##  from a list of vector space generators),\n##  and that <A>V</A> is handled via the mechanism of nice bases\n##  (see&nbsp;<Ref ???=\"...\"/>) in the following way.\n##  Let <M>K</M> be the field spanned by the entries of all vectors in <A>V</A>.\n##  The <Ref Attr=\"NiceFreeLeftModuleInfo\"/> value of <A>V</A> is irrelevant,\n##  and the <Ref Func=\"NiceVector\"/> value of <M>v \\in <A>V</A></M>\n##  is defined as the concatenation of the rows of <M>v</M>.\n##  <P/>\n##  So the associated nice vector space is a (not necessarily Gaussian)\n##  row space (see&nbsp;<Ref Func=\"IsRowSpace\"/>).\n##  </Description>\n##  </ManSection>\n##\nDeclareHandlingByNiceBasis( \"IsNonGaussianMatrixSpace\",\n    \"for non-Gaussian matrix spaces\" );\n\n\n#############################################################################\n##\n#A  NormedRowVectors( <V> ) . . .  normed vectors in a Gaussian row space <V>\n##\n##  <#GAPDoc Label=\"NormedRowVectors\">\n##  <ManSection>\n##  <Attr Name=\"NormedRowVectors\" Arg='V'/>\n##\n##  <Description>\n##  For a finite Gaussian row space <A>V</A>\n##  (see&nbsp;<Ref Func=\"IsRowSpace\"/>, <Ref Func=\"IsGaussianSpace\"/>),\n##  <Ref Attr=\"NormedRowVectors\"/> returns a list of those nonzero\n##  vectors in <A>V</A> that have a one in the first nonzero component.\n##  <P/>\n##  The result list can be used as action domain for the action of a matrix\n##  group via <Ref Func=\"OnLines\"/>, which yields the natural action on\n##  one-dimensional subspaces of <A>V</A>\n##  (see also&nbsp;<Ref Func=\"Subspaces\"/>).\n##  <Example><![CDATA[\n##  gap> vecs:= NormedRowVectors( GF(3)^2 );\n##  [ [ 0*Z(3), Z(3)^0 ], [ Z(3)^0, 0*Z(3) ], [ Z(3)^0, Z(3)^0 ], \n##    [ Z(3)^0, Z(3) ] ]\n##  gap> Action( GL(2,3), vecs, OnLines );\n##  Group([ (3,4), (1,2,4) ])\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareAttribute( \"NormedRowVectors\", IsGaussianSpace );\n\n\n#############################################################################\n##\n#A  TrivialSubspace( <V> )\n##\n##  <#GAPDoc Label=\"TrivialSubspace\">\n##  <ManSection>\n##  <Attr Name=\"TrivialSubspace\" Arg='V'/>\n##\n##  <Description>\n##  For a vector space <A>V</A>, <Ref Attr=\"TrivialSubspace\"/> returns the\n##  subspace of <A>V</A> that consists of the zero vector in <A>V</A>.\n##  <Example><![CDATA[\n##  gap> V:= GF(3)^3;;\n##  gap> triv:= TrivialSubspace( V );\n##  <vector space over GF(3), with 0 generators>\n##  gap> AsSet( triv );\n##  [ [ 0*Z(3), 0*Z(3), 0*Z(3) ] ]\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonymAttr( \"TrivialSubspace\", TrivialSubmodule );\n\n\n#############################################################################\n##\n#F  VectorSpace( <F>, <gens>[, <zero>][, \"basis\"] )\n##\n##  <#GAPDoc Label=\"VectorSpace\">\n##  <ManSection>\n##  <Func Name=\"VectorSpace\" Arg='F, gens[, zero][, \"basis\"]'/>\n##\n##  <Description>\n##  For a field <A>F</A> and a collection <A>gens</A> of vectors,\n##  <Ref Func=\"VectorSpace\"/> returns the <A>F</A>-vector space spanned by\n##  the elements in <A>gens</A>.\n##  <P/>\n##  The optional argument <A>zero</A> can be used to specify the zero element\n##  of the space; <A>zero</A> <E>must</E> be given if <A>gens</A> is empty.\n##  The optional string <C>\"basis\"</C> indicates that <A>gens</A> is known to\n##  be linearly independent over <A>F</A>, in particular the dimension of the\n##  vector space is immediately set;\n##  note that <Ref Func=\"Basis\"/> need <E>not</E> return the basis formed by\n##  <A>gens</A> if the string <C>\"basis\"</C> is given as an argument.\n##  <!-- crossref. to <C>FreeLeftModule</C> as soon as the modules chapter\n##       is reliable!-->\n##  <Example><![CDATA[\n##  gap> V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );\n##  <vector space over Rationals, with 2 generators>\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareGlobalFunction( \"VectorSpace\" );\n\n\n#############################################################################\n##\n#F  Subspace( <V>, <gens>[, \"basis\"] )  . subspace of <V> generated by <gens>\n#F  SubspaceNC( <V>, <gens>[, \"basis\"] )\n##\n##  <#GAPDoc Label=\"Subspace\">\n##  <ManSection>\n##  <Func Name=\"Subspace\" Arg='V, gens[, \"basis\"]'/>\n##  <Func Name=\"SubspaceNC\" Arg='V, gens[, \"basis\"]'/>\n##\n##  <Description>\n##  For an <M>F</M>-vector space <A>V</A> and a list or collection\n##  <A>gens</A> that is a subset of <A>V</A>,\n##  <Ref Func=\"Subspace\"/> returns the <M>F</M>-vector space spanned by\n##  <A>gens</A>; if <A>gens</A> is empty then the trivial subspace\n##  (see&nbsp;<Ref Func=\"TrivialSubspace\"/>) of <A>V</A> is returned.\n##  The parent (see&nbsp;<Ref Sect=\"Parents\"/>) of the returned vector space\n##  is set to <A>V</A>.\n##  <P/>\n##  <Ref Func=\"SubspaceNC\"/> does the same as <Ref Func=\"Subspace\"/>,\n##  except that it omits the check whether <A>gens</A> is a subset of\n##  <A>V</A>.\n##  <P/>\n##  The optional string <A>\"basis\"</A> indicates that <A>gens</A> is known to\n##  be linearly independent over <M>F</M>.\n##  In this case the dimension of the subspace is immediately set,\n##  and both <Ref Func=\"Subspace\"/> and <Ref Func=\"SubspaceNC\"/> do\n##  <E>not</E> check whether <A>gens</A> really is linearly independent and\n##  whether <A>gens</A> is a subset of <A>V</A>.\n##  <!-- crossref. to <C>Submodule</C> as soon as the modules chapter\n##       is reliable!-->\n##  <Example><![CDATA[\n##  gap> V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );;\n##  gap> W:= Subspace( V, [ [ 0, 1, 2 ] ] );\n##  <vector space over Rationals, with 1 generators>\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"Subspace\", Submodule );\n\nDeclareSynonym( \"SubspaceNC\", SubmoduleNC );\n\n\n#############################################################################\n##\n#O  AsVectorSpace( <F>, <D> ) . . . . . . . . .  view <D> as <F>-vector space\n##\n##  <#GAPDoc Label=\"AsVectorSpace\">\n##  <ManSection>\n##  <Oper Name=\"AsVectorSpace\" Arg='F, D'/>\n##\n##  <Description>\n##  Let <A>F</A> be a division ring and <A>D</A> a domain.\n##  If the elements in <A>D</A> form an <A>F</A>-vector space then\n##  <Ref Oper=\"AsVectorSpace\"/> returns this <A>F</A>-vector space,\n##  otherwise <K>fail</K> is returned.\n##  <P/>\n##  <Ref Oper=\"AsVectorSpace\"/> can be used for example to view a given\n##  vector space as a vector space over a smaller or larger division ring.\n##  <Example><![CDATA[\n##  gap> V:= FullRowSpace( GF( 27 ), 3 );\n##  ( GF(3^3)^3 )\n##  gap> Dimension( V );  LeftActingDomain( V );\n##  3\n##  GF(3^3)\n##  gap> W:= AsVectorSpace( GF( 3 ), V );\n##  <vector space over GF(3), with 9 generators>\n##  gap> Dimension( W );  LeftActingDomain( W );\n##  9\n##  GF(3)\n##  gap> AsVectorSpace( GF( 9 ), V );\n##  fail\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"AsVectorSpace\", AsLeftModule );\n\n\n#############################################################################\n##\n#O  AsSubspace( <V>, <U> )  . . . . . . . . . . . view <U> as subspace of <V>\n##\n##  <#GAPDoc Label=\"AsSubspace\">\n##  <ManSection>\n##  <Oper Name=\"AsSubspace\" Arg='V, U'/>\n##\n##  <Description>\n##  Let <A>V</A> be an <M>F</M>-vector space, and <A>U</A> a collection.\n##  If <A>U</A> is a subset of <A>V</A> such that the elements of <A>U</A>\n##  form an <M>F</M>-vector space then <Ref Oper=\"AsSubspace\"/> returns this\n##  vector space, with parent set to <A>V</A>\n##  (see&nbsp;<Ref Func=\"AsVectorSpace\"/>).\n##  Otherwise <K>fail</K> is returned.\n##  <Example><![CDATA[\n##  gap> V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );;\n##  gap> W:= VectorSpace( Rationals, [ [ 1/2, 1/2, 1/2 ] ] );;\n##  gap> U:= AsSubspace( V, W );\n##  <vector space over Rationals, with 1 generators>\n##  gap> Parent( U ) = V;\n##  true\n##  gap> AsSubspace( V, [ [ 1, 1, 1 ] ] );\n##  fail\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareOperation( \"AsSubspace\", [ IsVectorSpace, IsCollection ] );\n\n\n#############################################################################\n##\n#F  Intersection2Spaces( <AsStruct>, <Substruct>, <Struct> )\n##\n##  <ManSection>\n##  <Func Name=\"Intersection2Spaces\" Arg='AsStruct, Substruct, Struct'/>\n##\n##  <Description>\n##  is a function that takes two arguments <A>V</A> and <A>W</A> which must\n##  be finite dimensional vector spaces,\n##  and returns the intersection of <A>V</A> and <A>W</A>.\n##  <P/>\n##  If the left acting domains are different then let <M>F</M> be their\n##  intersection.\n##  The intersection of <A>V</A> and <A>W</A> is computed as intersection of\n##  <C><A>AsStruct</A>( <A>F</A>, <A>V</A> )</C> and\n##  <C><A>AsStruct</A>( <A>F</A>, <A>V</A> )</C>.\n##  <P/>\n##  If the left acting domains are equal to <M>F</M> then the intersection of\n##  <A>V</A> and <A>W</A> is returned either as <M>F</M>-<A>Substruct</A>\n##  with the common parent of <A>V</A> and <A>W</A> or as\n##  <M>F</M>-<A>Struct</A>, in both cases with known basis.\n##  <P/>\n##  This function is used to handle the intersections of two vector spaces,\n##  two algebras, two algebras-with-one, two left ideals, two right ideals,\n##  two two-sided ideals.\n##  </Description>\n##  </ManSection>\n##\nDeclareGlobalFunction( \"Intersection2Spaces\" );\n\n\n#############################################################################\n##\n#F  FullRowSpace( <F>, <n> )\n##\n##  <#GAPDoc Label=\"FullRowSpace\">\n##  <ManSection>\n##  <Func Name=\"FullRowSpace\" Arg='F, n'/>\n##  <Meth Name=\"\\^\" Arg='F, n' Label=\"for a field and an integer\"/>\n##\n##  <Description>\n##  For a field <A>F</A> and a nonnegative integer <A>n</A>,\n##  <Ref Func=\"FullRowSpace\"/> returns the <A>F</A>-vector space that\n##  consists of all row vectors (see&nbsp;<Ref Func=\"IsRowVector\"/>) of\n##  length <A>n</A> with entries in <A>F</A>.\n##  <P/>\n##  An alternative to construct this vector space is via\n##  <A>F</A><C>^</C><A>n</A>.\n##  <Example><![CDATA[\n##  gap> FullRowSpace( GF( 9 ), 3 );\n##  ( GF(3^2)^3 )\n##  gap> GF(9)^3;           # the same as above\n##  ( GF(3^2)^3 )\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"FullRowSpace\", FullRowModule );\nDeclareSynonym( \"RowSpace\", FullRowModule );\n\n\n#############################################################################\n##\n#F  FullMatrixSpace( <F>, <m>, <n> )\n##\n##  <#GAPDoc Label=\"FullMatrixSpace\">\n##  <ManSection>\n##  <Func Name=\"FullMatrixSpace\" Arg='F, m, n'/>\n##  <Meth Name=\"\\^\" Arg='F, dims'\n##   Label=\"for a field and a pair of integers\"/>\n##\n##  <Description>\n##  For a field <A>F</A> and two positive integers <A>m</A> and <A>n</A>,\n##  <Ref Func=\"FullMatrixSpace\"/> returns the <A>F</A>-vector space that\n##  consists of all <A>m</A> by <A>n</A> matrices\n##  (see&nbsp;<Ref Func=\"IsMatrix\"/>) with entries in <A>F</A>.\n##  <P/>\n##  If <A>m</A><C> = </C><A>n</A> then the result is in fact an algebra\n##  (see&nbsp;<Ref Func=\"FullMatrixAlgebra\"/>).\n##  <P/>\n##  An alternative to construct this vector space is via\n##  <A>F</A><C>^[</C><A>m</A>,<A>n</A><C>]</C>.\n##  <Example><![CDATA[\n##  gap> FullMatrixSpace( GF(2), 4, 5 );\n##  ( GF(2)^[ 4, 5 ] )\n##  gap> GF(2)^[ 4, 5 ];    # the same as above\n##  ( GF(2)^[ 4, 5 ] )\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"FullMatrixSpace\", FullMatrixModule );\nDeclareSynonym( \"MatrixSpace\", FullMatrixModule );\nDeclareSynonym( \"MatSpace\", FullMatrixModule );\n\n\n#############################################################################\n##\n#C  IsSubspacesVectorSpace( <D> )\n##\n##  <#GAPDoc Label=\"IsSubspacesVectorSpace\">\n##  <ManSection>\n##  <Filt Name=\"IsSubspacesVectorSpace\" Arg='D' Type='Category'/>\n##\n##  <Description>\n##  The domain of all subspaces of a (finite) vector space or of all\n##  subspaces of fixed dimension, as returned by <Ref Func=\"Subspaces\"/>\n##  (see&nbsp;<Ref Func=\"Subspaces\"/>) lies in the category\n##  <Ref Filt=\"IsSubspacesVectorSpace\"/>.\n##  <Example><![CDATA[\n##  gap> D:= Subspaces( GF(3)^3 );\n##  Subspaces( ( GF(3)^3 ) )\n##  gap> Size( D );\n##  28\n##  gap> iter:= Iterator( D );;\n##  gap> NextIterator( iter );\n##  <vector space over GF(3), with 0 generators>\n##  gap> NextIterator( iter );\n##  <vector space of dimension 1 over GF(3)>\n##  gap> IsSubspacesVectorSpace( D );\n##  true\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareCategory( \"IsSubspacesVectorSpace\", IsDomain );\n\n\n#############################################################################\n##\n#M  IsFinite( <D> ) . . . . . . . . . . . . . . . . .  for a subspaces domain\n##\n##  Returns `true' if <D> is finite.\n##  We allow subspaces domains in `IsSubspacesVectorSpace' only for finite\n##  vector spaces.\n##\nInstallTrueMethod( IsFinite, IsSubspacesVectorSpace );\n\n\n#############################################################################\n##\n#A  Subspaces( <V>[, <k>] )\n##\n##  <#GAPDoc Label=\"Subspaces\">\n##  <ManSection>\n##  <Attr Name=\"Subspaces\" Arg='V[, k]'/>\n##\n##  <Description>\n##  Called with a finite vector space <A>v</A>,\n##  <Ref Oper=\"Subspaces\"/> returns the domain of all subspaces of <A>V</A>.\n##  <P/>\n##  Called with <A>V</A> and a nonnegative integer <A>k</A>,\n##  <Ref Oper=\"Subspaces\"/> returns the domain of all <A>k</A>-dimensional\n##  subspaces of <A>V</A>.\n##  <P/>\n##  Special <Ref Attr=\"Size\"/> and <Ref Oper=\"Iterator\"/> methods are\n##  provided for these domains.\n##  <!-- <C>Enumerator</C> would also be good ...\n##       (special treatment for full row spaces,\n##       other spaces delegate to this)-->\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareAttribute( \"Subspaces\", IsLeftModule );\nDeclareOperation( \"Subspaces\", [ IsLeftModule, IsInt ] );\n\n\n#############################################################################\n##\n#F  IsSubspace( <V>, <U> )\n##\n##  <ManSection>\n##  <Func Name=\"IsSubspace\" Arg='V, U'/>\n##\n##  <Description>\n##  check that <A>U</A> is a vector space that is contained in <A>V</A>\n##  <!-- Must also <A>V</A> be a vector space?\n##       If yes then must <A>V</A> and <A>U</A> have same left acting domain?\n##       (Is this function useful at all?) -->\n##  </Description>\n##  </ManSection>\n##\nDeclareGlobalFunction( \"IsSubspace\" );\n\n\n#############################################################################\n##\n#A  OrthogonalSpaceInFullRowSpace( <U> )\n##\n##  <ManSection>\n##  <Attr Name=\"OrthogonalSpaceInFullRowSpace\" Arg='U'/>\n##\n##  <Description>\n##  For a Gaussian row space <A>U</A> over <M>F</M>,\n##  <Ref Attr=\"OrthogonalSpaceInFullRowSpace\"/>\n##  returns a complement of <A>U</A> in the full row space of same vector\n##  dimension as <A>U</A> over <M>F</M>.\n##  </Description>\n##  </ManSection>\n##\nDeclareAttribute( \"OrthogonalSpaceInFullRowSpace\", IsGaussianSpace );\n\n\n#############################################################################\n##\n#P  IsVectorSpaceHomomorphism( <map> )\n##\n##  <ManSection>\n##  <Prop Name=\"IsVectorSpaceHomomorphism\" Arg='map'/>\n##\n##  <Description>\n##  A mapping <M>f</M> is a vector space homomorphism (or linear mapping)\n##  if the source and range are vector spaces\n##  (see&nbsp;<Ref Func=\"IsVectorSpace\"/>)\n##  over the same division ring <M>D</M>\n##  (see&nbsp;<Ref Func=\"LeftActingDomain\"/>),\n##  and if <M>f( a + b ) = f(a) + f(b)</M> and <M>f( s * a ) = s * f(a)</M>\n##  hold for all elements <M>a</M>, <M>b</M> in the source of <M>f</M> and\n##  <M>s \\in D</M>.\n##  </Description>\n##  </ManSection>\n##\nDeclareProperty( \"IsVectorSpaceHomomorphism\", IsGeneralMapping );\n\n\n#############################################################################\n##\n#E\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/GAP/vspc.gi",
    "content": "#############################################################################\n##\n#W  vspc.gi                     GAP library                     Thomas Breuer\n##\n##\n#Y  Copyright (C)  1997,  Lehrstuhl D für Mathematik,  RWTH Aachen,  Germany\n#Y  (C) 1998 School Math and Comp. Sci., University of St Andrews, Scotland\n#Y  Copyright (C) 2002 The GAP Group\n##\n##  This file contains generic methods for vector spaces.\n##\n\n\n#############################################################################\n##\n#M  SetLeftActingDomain( <extL>, <D> )\n##\n##  check whether the left acting domain <D> of the external left set <extL>\n##  knows that it is a division ring.\n##  This is used, e.g.,  to tell a free module over a division ring\n##  that it is a vector space.\n##\nInstallOtherMethod( SetLeftActingDomain,\n    \"method to set also 'IsLeftActedOnByDivisionRing'\",\n    [ IsAttributeStoringRep and IsLeftActedOnByRing, IsObject ],0,\n    function( extL, D )\n    if HasIsDivisionRing( D ) and IsDivisionRing( D ) then\n      SetIsLeftActedOnByDivisionRing( extL, true );\n    fi;\n    TryNextMethod();\n    end );\n\n\n#############################################################################\n##\n#M  IsLeftActedOnByDivisionRing( <M> )\n##\nInstallMethod( IsLeftActedOnByDivisionRing,\n    \"method for external left set that is left acted on by a ring\",\n    [ IsExtLSet and IsLeftActedOnByRing ],\n    function( M )\n    if IsIdenticalObj( M, LeftActingDomain( M ) ) then\n      TryNextMethod();\n    else\n      return IsDivisionRing( LeftActingDomain( M ) );\n    fi;\n    end );\n\n\n#############################################################################\n##\n#F  VectorSpace( <F>, <gens>[, <zero>][, \"basis\"] )\n##\n##  The only difference between `VectorSpace' and `FreeLeftModule' shall be\n##  that the left acting domain of a vector space must be a division ring.\n##\nInstallGlobalFunction( VectorSpace, function( arg )\n    if Length( arg ) = 0 or not IsDivisionRing( arg[1] ) then\n      Error( \"usage: VectorSpace( <F>, <gens>[, <zero>][, \\\"basis\\\"] )\" );\n    fi;\n    return CallFuncList( FreeLeftModule, arg );\n    end );\n\n\n#############################################################################\n##\n#M  AsSubspace( <V>, <C> )  . . . . . . . for a vector space and a collection\n##\nInstallMethod( AsSubspace,\n    \"for a vector space and a collection\",\n    [ IsVectorSpace, IsCollection ],\n    function( V, C )\n    local newC;\n\n    if not IsSubset( V, C ) then\n      return fail;\n    fi;\n    newC:= AsVectorSpace( LeftActingDomain( V ), C );\n    if newC = fail then\n      return fail;\n    fi;\n    SetParent( newC, V );\n    UseIsomorphismRelation( C, newC );\n    UseSubsetRelation( C, newC );\n\n    return newC;\n    end );\n\n\n#############################################################################\n##\n#M  AsLeftModule( <F>, <V> )  . . . . . .  for division ring and vector space\n##\n##  View the vector space <V> as a vector space over the division ring <F>.\n##\nInstallMethod( AsLeftModule,\n    \"method for a division ring and a vector space\",\n    [ IsDivisionRing, IsVectorSpace ],\n    function( F, V )\n\n    local W,        # the space, result\n          base,     # basis vectors of field extension\n          gen,      # loop over generators of 'V'\n          b,        # loop over 'base'\n          gens,     # generators of 'V'\n          newgens;  # extended list of generators\n\n    if Characteristic( F ) <> Characteristic( LeftActingDomain( V ) ) then\n\n      # This is impossible.\n      return fail;\n\n    elif F = LeftActingDomain( V ) then\n\n      # No change of the left acting domain is necessary.\n      return V;\n\n    elif IsSubset( F, LeftActingDomain( V ) ) then\n\n      # Check whether 'V' is really a space over the bigger field,\n      # that is, whether the set of elements does not change.\n      base:= BasisVectors( Basis( AsField( LeftActingDomain( V ), F ) ) );\n      for gen in GeneratorsOfLeftModule( V ) do\n        for b in base do\n          if not b * gen in V then\n\n            # The field extension would change the set of elements.\n            return fail;\n\n          fi;\n        od;\n      od;\n\n      # Construct the space.\n      W:= LeftModuleByGenerators( F, GeneratorsOfLeftModule(V), Zero(V) );\n\n    elif IsSubset( LeftActingDomain( V ), F ) then\n\n      # View 'V' as a space over a smaller field.\n      # For that, the list of generators must be extended.\n      gens:= GeneratorsOfLeftModule( V );\n      if IsEmpty( gens ) then\n        W:= LeftModuleByGenerators( F, [], Zero( V ) );\n      else\n\n        base:= BasisVectors( Basis( AsField( F, LeftActingDomain( V ) ) ) );\n        newgens:= [];\n        for b in base do\n          for gen in gens do\n            Add( newgens, b * gen );\n          od;\n        od;\n        W:= LeftModuleByGenerators( F, newgens );\n\n      fi;\n\n    else\n\n      # View 'V' first as space over the intersection of fields,\n      # and then over the desired field.\n      return AsLeftModule( F,\n                 AsLeftModule( Intersection( F,\n                     LeftActingDomain( V ) ), V ) );\n\n    fi;\n\n    UseIsomorphismRelation( V, W );\n    UseSubsetRelation( V, W );\n    return W;\n    end );\n\n\n#############################################################################\n##\n#M  ViewObj( <V> )  . . . . . . . . . . . . . . . . . . . view a vector space\n##\n##  print left acting domain, if known also dimension or no. of generators\n##\nInstallMethod( ViewObj,\n    \"for vector space with known generators\",\n    [ IsVectorSpace and HasGeneratorsOfLeftModule ],\n    function( V )\n    Print( \"<vector space over \", LeftActingDomain( V ), \", with \",\n           Length( GeneratorsOfLeftModule( V ) ), \" generators>\" );\n    end );\n\nInstallMethod( ViewObj,\n    \"for vector space with known dimension\",\n    [ IsVectorSpace and HasDimension ],\n    1, # override method for known generators\n    function( V )\n    Print( \"<vector space of dimension \", Dimension( V ),\n           \" over \", LeftActingDomain( V ), \">\" );\n    end );\n\nInstallMethod( ViewObj,\n    \"for vector space\",\n    [ IsVectorSpace ],\n    function( V )\n    Print( \"<vector space over \", LeftActingDomain( V ), \">\" );\n    end );\n\n\n#############################################################################\n##\n#M  PrintObj( <V> ) . . . . . . . . . . . . . . . . . . .  for a vector space\n##\nInstallMethod( PrintObj,\n    \"method for vector space with left module generators\",\n    [ IsVectorSpace and HasGeneratorsOfLeftModule ],\n    function( V )\n    Print( \"VectorSpace( \", LeftActingDomain( V ), \", \",\n           GeneratorsOfLeftModule( V ) );\n    if IsEmpty( GeneratorsOfLeftModule( V ) ) and HasZero( V ) then\n      Print( \", \", Zero( V ), \" )\" );\n    else\n      Print( \" )\" );\n    fi;\n    end );\n\nInstallMethod( PrintObj,\n    \"method for vector space\",\n    [ IsVectorSpace ],\n    function( V )\n    Print( \"VectorSpace( \", LeftActingDomain( V ), \", ... )\" );\n    end );\n\n\n#############################################################################\n##\n#M  \\/( <V>, <W> )  . . . . . . . . .  factor of a vector space by a subspace\n#M  \\/( <V>, <vectors> )  . . . . . .  factor of a vector space by a subspace\n##\nInstallOtherMethod( \\/,\n    \"method for vector space and collection\",\n    IsIdenticalObj,\n    [ IsVectorSpace, IsCollection ],\n    function( V, vectors )\n    if IsVectorSpace( vectors ) then\n      TryNextMethod();\n    else\n      return V / Subspace( V, vectors );\n    fi;\n    end );\n\nInstallOtherMethod( \\/,\n    \"generic method for two vector spaces\",\n    IsIdenticalObj,\n    [ IsVectorSpace, IsVectorSpace ],\n    function( V, W )\n    return ImagesSource( NaturalHomomorphismBySubspace( V, W ) );\n    end );\n\n\n#############################################################################\n##\n#M  Intersection2Spaces( <AsStruct>, <Substruct>, <Struct> )\n##\nInstallGlobalFunction( Intersection2Spaces,\n    function( AsStructure, Substructure, Structure )\n    return function( V, W )\n    local inters,  # intersection, result\n          F,       # coefficients field\n          gensV,   # list of generators of 'V'\n          gensW,   # list of generators of 'W'\n          VW,      # sum of 'V' and 'W'\n          B;       # basis of 'VW'\n\n    if LeftActingDomain( V ) <> LeftActingDomain( W ) then\n\n      # Compute the intersection as vector space over the intersection\n      # of the coefficients fields.\n      # (Note that the characteristic is the same.)\n      F:= Intersection2( LeftActingDomain( V ), LeftActingDomain( W ) );\n      return Intersection2( AsStructure( F, V ), AsStructure( F, W ) );\n\n    elif IsFiniteDimensional( V ) and IsFiniteDimensional( W ) then\n\n      # Compute the intersection of two spaces over the same field.\n      gensV:= GeneratorsOfLeftModule( V );\n      gensW:= GeneratorsOfLeftModule( W );\n      if   IsEmpty( gensV ) then\n        if Zero( V ) in W then\n          inters:= V;\n        else\n          inters:= [];\n        fi;\n      elif IsEmpty( gensW ) then\n        if Zero( V ) in W then\n          inters:= W;\n        else\n          inters:= [];\n        fi;\n      else\n        # Compute a common coefficient space.\n        VW:= LeftModuleByGenerators( LeftActingDomain( V ),\n                                     Concatenation( gensV, gensW ) );\n        B:= Basis( VW );\n\n        # Construct the coefficient subspaces corresponding to 'V' and 'W'.\n        gensV:= List( gensV, x -> Coefficients( B, x ) );\n        gensW:= List( gensW, x -> Coefficients( B, x ) );\n\n        # Construct the intersection of row spaces, and carry back to VW.\n        inters:= List( SumIntersectionMat( gensV, gensW )[2],\n                       x -> LinearCombination( B, x ) );\n\n        # Construct the intersection space, if possible with a parent.\n        if     HasParent( V ) and HasParent( W )\n           and IsIdenticalObj( Parent( V ), Parent( W ) ) then\n          inters:= Substructure( Parent( V ), inters, \"basis\" );\n        elif IsEmpty( inters ) then\n          inters:= Substructure( V, inters, \"basis\" );\n          SetIsTrivial( inters, true );\n        else\n          inters:= Structure( LeftActingDomain( V ), inters, \"basis\" );\n        fi;\n\n        # Run implications by the subset relation.\n        UseSubsetRelation( V, inters );\n        UseSubsetRelation( W, inters );\n      fi;\n\n      # Return the result.\n      return inters;\n\n    else\n      TryNextMethod();\n    fi;\n    end;\nend );\n\n\n#############################################################################\n##\n#M  Intersection2( <V>, <W> ) . . . . . . . . . . . . . for two vector spaces\n##\nInstallMethod( Intersection2,\n    \"method for two vector spaces\",\n    IsIdenticalObj,\n    [ IsVectorSpace, IsVectorSpace ],\n    Intersection2Spaces( AsLeftModule, SubspaceNC, VectorSpace ) );\n\n\n#############################################################################\n##\n#M  ClosureLeftModule( <V>, <a> ) . . . . . . . . . closure of a vector space\n##\nInstallMethod( ClosureLeftModule,\n    \"method for a vector space with basis, and a vector\",\n    IsCollsElms,\n    [ IsVectorSpace and HasBasis, IsVector ],\n    function( V, w )\n    local   B; # basis of 'V'\n\n    # We can test membership easily.\n    B:= Basis( V );\n#T why easily?\n    if Coefficients( B, w ) = fail then\n\n      # In the case of a vector space, we know a basis of the closure.\n      B:= Concatenation( BasisVectors( B ), [ w ] );\n      V:= LeftModuleByGenerators( LeftActingDomain( V ), B );\n      UseBasis( V, B );\n\n    fi;\n    return V;\n    end );\n\n\n#############################################################################\n##\n##  Methods for collections of subspaces of a vector space\n##\n\n\n#############################################################################\n##\n#R  IsSubspacesVectorSpaceDefaultRep( <D> )\n##\n##  is the representation of domains of subspaces of a vector space <V>,\n##  with the components 'structure' (with value <V>) and 'dimension'\n##  (with value either the dimension of the subspaces in the domain\n##  or the string '\\\"all\\\"', which means that the domain contains all\n##  subspaces of <V>).\n##\nDeclareRepresentation(\n    \"IsSubspacesVectorSpaceDefaultRep\",\n    IsComponentObjectRep,\n    [ \"dimension\", \"structure\" ] );\n#T not IsAttributeStoringRep?\n\n\n#############################################################################\n##\n#M  PrintObj( <D> )  . . . . . . . . . . . . . . . . . for a subspaces domain\n##\nInstallMethod( PrintObj,\n    \"method for a subspaces domain\",\n    [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ],\n    function( D )\n    if IsInt( D!.dimension ) then\n      Print( \"Subspaces( \", D!.structure, \", \", D!.dimension, \" )\" );\n    else\n      Print( \"Subspaces( \", D!.structure, \" )\" );\n    fi;\n    end );\n\n\n#############################################################################\n##\n#M  Size( <D> ) . . . . . . . . . . . . . . . . . . .  for a subspaces domain\n##\n##  The number of $k$-dimensional subspaces in a $n$-dimensional space over\n##  the field with $q$ elements is\n##  $$\n##  a(n,k) = \\prod_{i=0}^{k-1} \\frac{q^n-q^i}{q^k-q^i} =\n##           \\prod_{i=0}^{k-1} \\frac{q^{n-i}-1}{q^{k-i}-1}.\n##  $$\n##  We have the recursion\n##  $$\n##  a(n,k+1) = a(n,k) \\frac{q^{n-i}-1}{q^{i+1}-1}.\n##  $$\n##\n##  (The number of all subspaces is $\\sum_{k=0}^n a(n,k)$.)\n##\nInstallMethod( Size,\n    \"method for a subspaces domain\",\n    [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ],\n    function( D )\n\n    local k,\n          n,\n          q,\n          size,\n          qn,\n          qd,\n          ank,\n          i;\n\n    if D!.dimension = \"all\" then\n\n      # all subspaces of the space\n      n:= Dimension( D!.structure );\n\n      q:= Size( LeftActingDomain( D!.structure ) );\n      size:= 1;\n      qn:= q^n;\n      qd:= q;\n\n      # $a(n,0)$\n      ank:= 1;\n\n      for k in [ 1 .. Int( (n-1)/2 ) ] do\n\n        # Compute $a(n,k)$.\n        ank:= ank * ( qn - 1 ) / ( qd - 1 );\n        qn:= qn / q;\n        qd:= qd * q;\n\n        size:= size + ank;\n\n      od;\n\n      size:= 2 * size;\n\n      if n mod 2 = 0 then\n\n        # Add the number of spaces of dimension $n/2$.\n        size:= size + ank * ( qn - 1 ) / ( qd - 1 );\n      fi;\n\n    else\n\n      # number of spaces of dimension 'k' only\n      n:= Dimension( D!.structure );\n      if   D!.dimension < 0 or\n           n < D!.dimension then\n        return 0;\n      elif n / 2 < D!.dimension then\n        k:= n - D!.dimension;\n      else\n        k:= D!.dimension;\n      fi;\n\n      q:= Size( LeftActingDomain( D!.structure ) );\n      size:= 1;\n\n      qn:= q^n;\n      qd:= q;\n      for i in [ 1 .. k ] do\n        size:= size * ( qn - 1 ) / ( qd - 1 );\n        qn:= qn / q;\n        qd:= qd * q;\n      od;\n\n    fi;\n\n    # Return the result.\n    return size;\n    end );\n\n\n#############################################################################\n##\n#M  Enumerator( <D> ) . . . . . . . . . . . . . . . .  for a subspaces domain\n##\n##  Use the iterator to compute the elements list.\n#T This is not allowed!\n##\nInstallMethod( Enumerator,\n    \"method for a subspaces domain\",\n    [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ],\n    function( D )\n    local iter,    # iterator for 'D'\n          elms;    # elements list, result\n\n    iter:= Iterator( D );\n    elms:= [];\n    while not IsDoneIterator( iter ) do\n      Add( elms, NextIterator( iter ) );\n    od;\n    return elms;\n    end );\n#T necessary?\n\n\n#############################################################################\n##\n#M  Iterator( <D> ) . . . . . . . . . . . . . . . . .  for a subspaces domain\n##\n##  uses the subspaces iterator for full row spaces and the mechanism of\n##  associated row spaces.\n##\nBindGlobal( \"IsDoneIterator_Subspaces\",\n    iter -> IsDoneIterator( iter!.associatedIterator ) );\n\nBindGlobal( \"NextIterator_Subspaces\", function( iter )\n    local next;\n    next:= NextIterator( iter!.associatedIterator );\n    next:= List( GeneratorsOfLeftModule( next ),\n                 x -> LinearCombination( iter!.basis, x ) );\n    return Subspace( iter!.structure, next, \"basis\" );\n    end );\n\nBindGlobal( \"ShallowCopy_Subspaces\",\n    iter -> rec( structure          := iter!.structure,\n                 basis              := iter!.basis,\n                 associatedIterator := ShallowCopy(\n                                           iter!.associatedIterator ) ) );\n\nInstallMethod( Iterator,\n    \"for a subspaces domain\",\n    [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ],\n    function( D )\n    local V;      # the vector space\n\n    V:= D!.structure;\n    return IteratorByFunctions( rec(\n               IsDoneIterator     := IsDoneIterator_Subspaces,\n               NextIterator       := NextIterator_Subspaces,\n               ShallowCopy        := ShallowCopy_Subspaces,\n               structure          := V,\n               basis              := Basis( V ),\n               associatedIterator := Iterator(\n                      Subspaces( FullRowSpace( LeftActingDomain( V ),\n                                               Dimension( V ) ),\n                                 D!.dimension ) ) ) );\n    end );\n\n\n#############################################################################\n##\n#M  Subspaces( <V>, <dim> )\n##\nInstallMethod( Subspaces,\n    \"for a vector space, and an integer\",\n    [ IsVectorSpace, IsInt ],\n    function( V, dim )\n    if IsFinite( V ) then\n      return Objectify( NewType( CollectionsFamily( FamilyObj( V ) ),\n                                     IsSubspacesVectorSpace\n                                 and IsSubspacesVectorSpaceDefaultRep ),\n                        rec(\n                             structure  := V,\n                             dimension  := dim\n                           )\n                      );\n    else\n      TryNextMethod();\n    fi;\n    end );\n\n\n#############################################################################\n##\n#M  Subspaces( <V> )\n##\nInstallMethod( Subspaces,\n    \"for a vector space\",\n    [ IsVectorSpace ],\n    function( V )\n    if IsFinite( V ) then\n      return Objectify( NewType( CollectionsFamily( FamilyObj( V ) ),\n                                     IsSubspacesVectorSpace\n                                 and IsSubspacesVectorSpaceDefaultRep ),\n                        rec(\n                             structure  := V,\n                             dimension  := \"all\"\n                           )\n                      );\n    else\n      TryNextMethod();\n    fi;\n    end );\n\n\n#############################################################################\n##\n#F  IsSubspace( <V>, <U> ) . . . . . . . . . . . . . . . . . check <U> <= <V>\n##\nInstallGlobalFunction( IsSubspace, function( V, U )\n    return IsVectorSpace( U ) and IsSubset( V, U );\nend );\n\n\n#############################################################################\n##\n#M  IsVectorSpaceHomomorphism( <map> )\n##\nInstallMethod( IsVectorSpaceHomomorphism,\n    [ IsGeneralMapping ],\n    function( map )\n    local S, R, F;\n    S:= Source( map );\n    if not IsVectorSpace( S ) then\n      return false;\n    fi;\n    R:= Range( map );\n    if not IsVectorSpace( R ) then\n      return false;\n    fi;\n    F:= LeftActingDomain( S );\n    return ( F = LeftActingDomain( R ) ) and IsLinearMapping( F, map );\n    end );\n\n\n#############################################################################\n##\n#E\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/GCC Machine Description/pdp10.md",
    "content": ";;- Machine description for the PDP-10.\n;;  Copyright (C) 2001, 2002 Lars Brinkhoff.\n;;  Contributed by Lars Brinkhoff <lars@nocrew.org>, funded by XKL, LLC.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Index\n\n;;   Front Page\n;;   Index\n;;   Constraints for Immediate Operands\n;;   To-do List\n;;   Instruction Wish-List\n;;   Attributes\n;;\tlength, skip, reorg_type\n;;   Unspec Usage\n;;\tUNSPEC_ADJSP, UNSPEC_ADJBP, UNSPEC_ADDRESS, UNSPEC_FFO, UNSPEC_SUBBP,\n;;\tVUNSPEC_BLT, VUNSPEC_FSC, VUNSPEC_XBLT, VUNSPEC_MOVSLJ, VUNSPEC_MOVST\n;;   Constants\n;;      RIGHT_HALF, LEFT_HALF, SIGNBIT, SP_REGNUM\n;;   Optimizations\n;;   Data Movement\n;;\tLDB, ILDB, (LDBI), LDBE, ILDBE, (LDBEI), DPB, IDPB, (DPBI),\n;;\tHRR, HRL, HLR, HLL, HRRM, HRLM, HLRM, HLLM,\n;;\tHRRZ, HRLZ, HLRZ, HLLZ, HRRE, HRLE, HLRE, HLLE,\n;;\tSETZM, SETOM,\n;;\tMOVE, MOVEI, MOVSI, HRLOI, HRROI, MOVEM,\n;;\tMOVS, EXCH, SETZB,\n;;\tDMOVE, DMOVEM,\n;;\tBLT, XBLT, (MOVSLJ), (MOVST), (CMPS)\n;;   Conditional Data Movement\n;;\tSKIPL, SKIPE, SKIPLE, SKIPGE, SKIPN, SKIPG,\n;;\tTDZA\n;;   Integer Arithmetic\n;;\tAOS, SOS,\n;;\tADD, ADDI, ADDM, ADDB, DADD,\n;;\tSUB, SUBI, SUBM, SUBB, DSUB,\n;;\tIMUL, IMULI, IMULM, IMULB, MUL, MULI, MULM, MULB, DMUL,\n;;\tIDIV, IDIVI, IDIVM, DIV, DIVI, DIVM, DDIV,\n;;\tUIDIV, UIDIVI, UIDIVM, UIMOD, UIMODI, UIMODM,\n;;\tMOVN, MOVNM, MOVNS, MOVNI, DMOVN, DMOVNM,\n;;\tMOVM, MOVMM, MOVMS,\n;;\tFFS\n;;   Integer Conversions\n;;\tANDI, HRRZ, SEXT, HRRE, ANDI, HRR\n;;   Shifting and Rotating\n;;\tLSH, LSHC, ASH, ASHC, ROT, ROTC\n;;   Logical Operations\n;;\tAND, ANDI, ANDM, ANDB, TLZ, ANDCMI,\n;;\tANDCA, ANDCAI, ANDCAM, ANDCAB, ANDCBI,\n;;\tANDCM, ANDCMM, ANDCMB,\n;;\tXOR, XORI, XORM, XORB, TLC, EQVI,\n;;\tIOR, IORI, IORM, IORB, TLO, ORCMI,\n;;\tANDCB, ANDCBM, ANDCBB,\n;;\tEQV, EQVM, EQVB,\n;;\tSETCA, SETCAM, SETCAB,\n;;\tSETCM, SETCMM, SETCMB,\n;;\tORCA, ORCAI, ORCAM, ORCAB, ORCBI,\n;;\tORCM, ORCMM, ORCMB,\n;;\tORCB, ORCBM, ORCBB\n;;   Floating-point Arithmetic\n;;\tFADR, FADRI, FADRM, FADRB, DFAD, GFAD,\n;;\tFSBR, FSBRI, FSBRM, FSBRB, DFSB, GFSB,\n;;\tMOVM, MOVMM, MOVMS,\n;;\tMOVN, MOVNM, MOVNS, DMOVN, DMOVNM,\n;;\tFMPR, FMPRI, FMPRM, FMPRB, DFMP, GFMP,\n;;\tFDVR, FDVRI, FDVRM, FDVRB, DFDV, GFDV,\n;;\tSQRT, DSQRT, GSQRT,\n;;\tFSC, DFSC, GFSC\n;;   Floating-point Conversions\n;;\tFIX, DFIX, GFIX, DDFIX, GDFIX,\n;;\tFLTR, DFLTR, GFLTR, DDFLTR, DGFLTR,\n;;\tGSNGL, GDBLE\n;;   Pointer Arithmetic\n;;\tIBP, ADJBP, SUBBP\n;;   Unconditional Jumps\n;;\tJFCL, JRST, PUSHJ\n;;   Conditional Jumps\n;;\tTRNE, TLNE, TDNE, TRNN, TLNN, TDNN, TLZN,\n;;\tJUMP, SKIP, CAI, CAM,\n;;\tSOJ, SOS, AOJ, AOS,\n;;\tJFFO, CMPBP\n;;   Function prologue and epilogue\n;;\tPOPJ, ADJSP, PUSH, POP\n;;   Peepholes\n;;   Miscellaneous\n;;\n;; Instructions in parentheses are either commented out or not\n;; generated by the compiler.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Constraints for Immediate Operands\n\n;;   'G'\tAny valid immediate floating-point constant.\n;;   'I'\t0 .. 262143\n;;   'J'\t-262143 .. 0\n;;   'K'\t-131072 .. 131071\n;;   'L'\txxxxxx,,000000 (MOVSI, TLN, TLO, TLC)\n;;   'M'\t-1\n;;   'N'\txxxxxx,,777777 (HRLOI, TLZ)\n;;   'O'\t0\n;;   'P'\t777777,,xxxxxx (HRROI, ORCMI, ANDCBI, ANDCMI)\n;;   'Q'\t1\n;;   'R'\tFloating-point zero.\n;;   'S'\tLocal symbol.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; To-do List\n\n;; Use peep2_reg_dead_p in peepholes.\n\n;; Unsigned multiplication.\n;;\n;;\tmul 1,3\t\t; multiply AC1 by AC3\n;;\tlsh 2,1\n;;\tlshc 1,-1\t; result in AC2\n\n;; 71-bit arithmetic.\n;;\n;; Addition, subtraction, multiplication, division, arithmetic shift:\n;; supported in hardware.\n;;\n;; Logical shift (left or right).\n;;\n;;\tlsh 2,-1\n;;\tlshc 1,3\n;;\tlsh 2,1\n\n;; 72-bit arithmetic.\n;;\n;; Addition 72 x 72 -> 72.\n;;\n;;\tjfcl 17,.+1\t; add AC1 and AC2 to AC3 and AC4\n;;\tadd 2,4\n;;\tjcry0 [aoja 1,.+1]\n;;\tadd 1,3\t\t; result in AC1 and AC2\n;;\n;; Subtraction 72 x 72 -> 72.\n;;\n;;\tjfcl 17,.+1\t; add AC1 and AC2 to AC3 and AC4\n;;\tsub 2,4\n;;\tjcry0 .+2\n;;\t subi 1,1\n;;\tsub 1,3\t\t; result in AC1 and AC2\n;;\n;; Negation 72 -> 72.\n;;\n;;\tsetcm 1,3\n;;\tmovn 2,4\n;;\tjumpe 2,[aoja 1,.+1]\n;;\n;;\t; to self\n;;\tsetca 1,\n;;\tjumpe 2,[aoja 1,.+2]\n;;\t movn 2,2\n;;\n;; Magnitude 72 -> 72.\n;;\n;;\t; conditional negation\n;;\tjumpge 1,.+4\n;;\tsetca 1,\n;;\tjumpe 2,[aoja 1,.+2]\n;;\t movn 2,2\n;;\n;;\t; mask = x >> 71 (arithmetic shift)\n;;\t; y = (x ^ mask) - mask\n;;\tmove 3,1\n;;\tash 1,-43\t; shortcut\n;;\txor 1,3\n;;\txor 2,3\n;;\tjfcl 17,.+1\n;;\tsub 2,3\n;;\tjcry0 [aoja 1,.+1]\n;;\n;; Signed right shift 72 -> 72.\n;;\n;;\tVariable amount:\n;;\n;;\t; only works if n <= 35\n;;\tmovn 4,3\t; operand in AC1:AC2, shift amount in AC3\n;;\tlshc 1,4\n;;\tlsh 1,3\n;;\tash 1,4\t\t; result in AC1:AC2\n;;\n;;\t; loop\n;;\tjumple 3,.+5\n;;\t lshc 1,-1\n;;\t tlne 1,200000\n;;\t  tlo 1,400000\n;;\t sojg 3,.-3\n;;\n;;\t; only works if n <= 70\n;;\ttlnn 1,400000\n;;\t tdza 4,4\n;;\t  movsi 4,400000\n;;\tmovei 5,0\n;;\tashc 4,3\n;;\tlsh 5,1\n;;\tlshc 1,3\n;;\tior 1,4\n;;\tior 2,5\n;;\n;;\tFixed amount:\n;;\n;;\tlshc 1,-n\n;;\ttlne 1,mask1\n;;\t tlo 1,mask2\n;;\n;;\tskipge 1\t; or cail 1,0 or jumpge 1,.+2 or tlne 1,400000\n;;\t iori 2,<2^n-1>\n;;\trotc 1,-n\n;;\n;; Signed multiplication 36 x 36 -> 72.\n;;\n;;\tjfcl .+1\t; multiply AC1 by AC3\n;;\tmul 1,3\n;;\tlsh 2,1\n;;\tjov [movsi 1,200000\n;;\t     jrst .+4]\n;;\tlshc 1,-1\n;;\ttlne 1,200000\n;;\t tlo 1,400000\t; result in AC1 and AC2\n;;\n;;\tmul 1,3\n;;\tlsh 2,1\n;;\tjumpe 2,[cam 1,[400000000000]\n;;\t          jrst .+1\n;;\t         movsi 1,200000\n;;\t         jrst .+4]\n;;\tlshc 1,-1\n;;\ttlne 1,200000\n;;\t tlo 1,400000\t; result in AC1 and AC2\n;;\n;;\t...\n;;\tlshc 1,-1\n;;\tlsh 1,1\n;;\tash 1,-1\t; result in AC1 and AC2\n;;\n;;\t...\n;;\tskipge 1\n;;\t iori 2,1\n;;\trotc 1,-1\t; result in AC1 and AC2\n;;\n;;\tjfcl .+1\t; multiply AC1 by AC3\n;;\tmul 1,3\n;;\tjov [movsi 1,200000\n;;\t     movei 2,0\n;;\t     jrst .+5]\n;;\ttrne 1,1\n;;\t tloa 2,400000\n;;\t  tlz 2,400000\n;;\tash 1,-1\t; result in AC1 and AC2\n;;\n;;\t 377777,,777777 ^ 2\t\t =  177777,,777777 000000,,000001\n;;\t-400000,,000000 * 377777,,777777 = -177777,,777777 400000,,000000\n;;\t\t\t\t\t(=  600000,,000000 400000,,000000)\n;;\t-400000,,000000 ^ 2\t\t =  200000,,000000 000000,,000000\n;;\t-400000,,000000 * -1\t\t =  000000,,000000 400000,,000000\n;;\t-000000,,000001 ^ 2              =  000000,,000000 000000,,000001\n;;\t-000000,,000001 * 000000,,000001 = -000000,,000000 000000,,000001\n;;\t\t\t\t\t(=  777777,,777777 777777,,777777)\n;;\t-000000,,000001 * 000001,,000001 = -000000,,000000 000001,,000001\n;;\t\t\t\t\t(=  777777,,777777 777776,,777777)\n;;\n;; Signed high part multiplication 36 x 36 -> 36.\n;;\n;;\tjfcl .+1\t; multiply AC1 by AC2\n;;\tmulm 2,1\n;;\tjov [movsi 1,200000\n;;\t     jrst .+2]\n;;\tash 1,-1\t; result in AC1\n;;\n;; Unsigned multiplication 36 x 36 -> 72.\n;;\n;;\t377777,,777777 ^ 2\t\t= 177777,,777777 000000,,000001\n;;\t400000,,000000 * 377777,,777777 = 177777,,777777 400000,,000000\n;;\t400000,,000000 ^ 2\t\t= 200000,,000000 000000,,000000\n;;\t400000,,000000 * 777777,,777777 = 377777,,777777 400000,,000000\n;;\t777777,,777777 ^ 2              = 777777,,777776 000000,,000001\n;;\t777777,,777777 * 000000,,000001 = 000000,,000000 777777,,777777\n;;\t777777,,777777 * 000001,,000001 = 000001,,000000 777776,,777777\n;;\n;; Multiplication 72 x 72 -> 72.\n;;\n;;\tdmul 1,3\t; multiply AC1 and AC2 by AC3 and AC4\n;;\tlsh 3,1\n;;\tlshc 2,-1\n;;\tlsh 4,1\n;;\tlshc 3,1\n;;\ttrne 2,1\n;;\t tlo 3,400000\t; result in AC3 and AC4\n;;\n;;\tdmul 1,3\n;;\tlsh 4,1\n;;\tlshc 3,-1\n;;\tlsh 3,2\n;;\tlshc 2,-2\n;;\n;; Comparisons 72 x 72.\n;;\n;;\t; x == y\n;;\tCAMN x+1,y+1\t\t\n;;\t CAME x,y\n;;\t  ;here if false\n\n;; TSC, TSO, TSZ.  TSNE, TSNN.\n\n;; Ok to negate double-word integer with DMOVN?\n;; Answer: perhaps not.\n;;\n;; If comparison code cares about bit 0 in the second word of a\n;; double-word integer, negation has to set the bit to the right\n;; value.\n\n;; Converting from double float to single float (truncdfsf2) needs\n;; rounding.\n\n;; ANDCMI really faster than TRZ?\n\n;; Add `cmpdi' pattern.\n\n;; Revisit `casesi'.\n\n;; *move_and_skipsi and *move_and_skipsf clobbers accumulator 0.  Is\n;; it possible to allocate a scratch register?\n\n;; Peepholes for AOSA and SOSA.\n\n;; \"Self\" half-word instructions.\n\n;; AOBJP, AOBJN?\n\n;; SUBREG of DImode causes bad register allocation:\n;; divmodsi4, divmoddi4, expand_builtin_jffo, ffssi.\n\n;; String instructions.  Avoid them for now.  REG: \"None of these is\n;; fast.  None of these is thoroughly tested.  They all require a lot\n;; of registers for setup.  They are uncharacteristic of other PDP-10\n;; instructions.\"\n\n;; Test-modify-skip instructions?\n\n;; In case anyone would like to play strange games, this could be\n;; optimized to use a PUSHJ instruction:\n;;   static\n;;   foo (void **p, void *f)\tFOO:\n;;   {\t\t\t\t\tPUSHJ 1,(2)\n;;     *++p = &&label;\t\t\tPOPJ 17,\n;;     goto *f;\n;;    label:\n;;     return;\n;;   }\n;; And POPJ:\n;;   static void\n;;   bar (void **p)\t\tBAR:\n;;   {\t\t\t\t\tPOPJ 1,\n;;     goto *p--;\n;;   }\n\n;; Use JSP to call functions with __attribute__ ((fastcall)) or similar.\n\n;; Historical: KA10 software double precision floating-point.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Instruction Wish-List\n\n;; ILDBE, LDBE - (increment and) load sign-extended byte.\n\n;; LDBI, LDBEI, DPBI - load/deposit byte, then increment.\n\n;; SUBBP - subtract byte pointers.\n\n;; CMPBP - compare byte pointers.\n\n;; SEXT r,n - sign-extend n-bit byte in register r.\n\n;; Clear/set byte.\n\n;; Test byte >0 =0 <0.\n\n;; UIDIV, UDIV, UDDIV - unsigned division (udivsi3, udivdi3).\n\n;; UIMOD, UMOD, UDMOD - unsigned modulo (umodsi3, umoddi3).\n\n;; UJUMP, USKIP, UCAI, UCAM - compare unsigned values.\n\n;; MIN, MAX, UMIN, UMAX - min/max (minsi3, maxsi3, uminsi3, umaxsi3).\n\n;; SQRT, DSQRT, GSQRT - square root (sqrtM2).\n\n;; SIN, DSIN, GSIN - sine function (__builtin_sin).\n\n;; COS, DCOS, GCOS - cosine function (__builtin_cos).\n\n;; Any other mathematical function: TAN, ASIN, ACOS, ATAN, SINH, COSH,\n;; TANH, ASINH, ACOSH, ATANH, EXP, LN, LOG2, LOG10, POW, ...  All\n;; potentially in single, double, and giant versions.\n\n;; FFS - find first set, counting least significant bit first (ffsM2).\n\n;; ?DFIX, DFIXR - Double Floating to Integer (fix_truncdfsi2).\n;; ?DFIX, DFIXR - Single Floating to Double Precision Integer (fix_truncsfdi2).\n;; DDFIX, DDFIXR - Double Floating to Double Precision Integer (fix_truncdfdi2)\n\n;; ?DFLTR - Double Float and Round (floatsidf2).\n;; ?DFLTR - Float Double Precision Integer and Round (floatdisf2).\n;; DDFLTR - Double Float Double Precision Integer and Round (floatdidf2).\n\n;; UDFLTR, UGFLTR, ... - Unsigned Float and Round (floatuns...).\n\n;; WAIT - wait for interrupt.\n\n;; XPUSH, XPUSHJ, XPOP, XPOPJ - fast versions for use with a global\n;; stack pointer only.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Attributes\n\n;; Length of the instruction, in words.\n(define_attr \"length\" \"\" (const_int 1))\n\n;; The instruction is a skip instruction.\n(define_attr \"skip\" \"no,yes\" (const_string \"no\"))\n\n;; Instruction type used in the machine dependent reorg pass.\n(define_attr \"reorg_type\" \"none,ibp,ldb,dpb\" (const_string \"none\"))\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Unspec Usage\n\n(define_constants\n  [(UNSPEC_ADJSP\t0)\t; ADJSP operation (Pmode):\n\t\t\t\t;   Operand 0 is the stack pointer.\n\t\t\t\t;   Operand 1 is the adjustment.\n   (UNSPEC_ADJBP\t1)\t; ADJBP operation (Pmode):\n\t\t\t\t;   Operand 0 is the byte pointer.\n\t\t\t\t;   Operand 1 is the adjustment.\n   (UNSPEC_ADDRESS\t2)\t; Effective-address calculation (Pmode):\n\t\t\t\t;   Operand 0 is the memory operand.\n   (UNSPEC_FFO\t\t3)\t; Find-first-one operation in FFO (SImode):\n\t\t\t\t;   Operand 0 is the register.\n   (UNSPEC_FSC\t\t4)\t; FSC operation (SFmode, DFmode):\n\t\t\t\t;   Operand 0 is the floating-point value.\n\t\t\t\t;   Operand 1 is the scale factor.\n   (UNSPEC_SHIFT\t5)\t; Left-shift operation (SImode, Pmode):\n\t\t\t\t;   Used to compensate for unnecessary\n\t\t\t\t;   shifts generated by pointer arithmetic.\n\t\t\t\t;   Operand 0 is the value.\n\t\t\t\t;   Operand 1 is the shift count.\n   (UNSPEC_SHIFTRT\t6)\t; Right-shift operation (SImode, Pmode):\n\t\t\t\t;   Used to compensate for unnecessary\n\t\t\t\t;   shifts generated by pointer arithmetic.\n\t\t\t\t;   Operand 0 is the value.\n\t\t\t\t;   Operand 1 is the shift count.\n   (UNSPEC_TLNE_TLZA_TLO\t; TLNE-TLZA-TLO sequence (SImode):\n\t\t\t7)\t;   Operand 0 is the register.\n\t\t\t\t;   Operand 1 is the TLNE operand.\n\t\t\t\t;   Operand 2 is the TLZA operand.\n\t\t\t\t;   Operand 3 is the TLO operand.\n   (UNSPEC_SUBBP\t8)\t; Byte pointer difference (SImode):\n\t\t\t\t;   Operand 0 is the first pointer.\n\t\t\t\t;   Operand 1 is the second pointer.\n   (UNSPEC_CMPBP\t9)\t; Prepare byte pointer for comparison (SImode):\n\t\t\t\t;   Operand 0 is the pointer.\n   (UNSPEC_REAL_ASHIFT\t10)\t; Arithmetic left shift (SImode, DImode):\n\t\t\t\t;   Operand 0 is the value to shift.\n\t\t\t\t;   Operand 1 is the amount to shift by.\n   (UNSPEC_ASH71\t11)\t; 71-bit arithmetic shift (DImode):\n\t\t\t\t;   Operand 0 is the value to shift.\n\t\t\t\t;   Operand 1 is the amount to shift by.\n   (UNSPEC_MUL71\t12)\t; 71-bit multiplication (DImode):\n\t\t\t\t;   Operands 0 and 1 are the multiplicands.\n   (UNSPEC_SIGN_EXTEND\t13)\t; Sign extension (SImode):\n\t\t\t\t;   Operand 0 is the value to extend.\n\t\t\t\t;   Operand 1 is the number of bits to extend.\n   (UNSPEC_ZERO_EXTEND\t14)\t; Zero extension (SImode):\n\t\t\t\t;   Operand 0 is the value to extend.\n\t\t\t\t;   Operand 1 is the number of bits to extend.\n   (UNSPEC_TRUNCATE\t15)\t; Truncate (SImode):\n\t\t\t\t;   Operand 0 is the value to truncate.\n\t\t\t\t;   Operand 1 is the number of bits to trunc.\n   (UNSPEC_TRNE_TLO\t16)\t; TLNE-TLO sequence (SImode):\n\t\t\t\t;   Operand 0 is the TRNE operand.\n\t\t\t\t;   Operand 1 is the TLO operand.\n   (UNSPEC_ASHC\t\t17)\t; ASHC operation (DImode):\n\t\t\t\t;   Operand 0 is the value to shift.\n\t\t\t\t;   Operand 1 is the amount to shift by.\n   (UNSPEC_LSHC\t\t18)])\t; ASHC operation (DImode):\n\t\t\t\t;   Operand 0 is the value to shift.\n\t\t\t\t;   Operand 1 is the amount to shift by.\n\n(define_constants\n  [(VUNSPEC_BLOCKAGE\t0)\n   (VUNSPEC_BLT\t\t1)\t; BLT operation (BLKmode):\n\t\t\t\t;   Operand 0 is the source address.\n\t\t\t\t;   Operand 1 is the destination address.\n\t\t\t\t;   Operand 2 is the block length.\n   (VUNSPEC_XBLT\t2)\t; XBLT operation (BLKmode):\n\t\t\t\t;   operand 0 is the block length\n\t\t\t\t;   operand 1 is the source address\n\t\t\t\t;   operand 2 is the destination address\n   (VUNSPEC_MOVSLJ\t3)\t; MOVSLJ operation (BLKmode):\n\t\t\t\t;   operand 0 is the register block\n   (VUNSPEC_MOVST\t4)\t; MOVST operation (BLKmode):\n\t\t\t\t;   operand 0 is the register block\n   (VUNSPEC_CMPS\t5)])\t; CMPS operation (BLKmode):\n\t\t\t\t;   operand 0 is the register block\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Constants\n\n(define_constants\n  [(RIGHT_HALF\t262143)\t\t; 0000000777777\n   (LEFT_HALF\t-262144)\t; 0777777000000\n   (SIGNBIT\t-34359738368)\t; 0400000000000\n   (FP_REGNUM\t13)\t\t; Frame pointer register.\n   (SP_REGNUM\t15)])\t\t; Stack pointer register.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Optimizations\n\n;; Adding a constant to a word pointer is done fastest by (X)MOVEI\n;; op0,const(op1).  As a special case, recognize the stack pointer.\n(define_insn \"MOVEI_sp\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(plus:SI (reg:SI SP_REGNUM)\n\t\t (match_operand:SI 1 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    operands[1] = gen_rtx_PLUS (Pmode, stack_pointer_rtx, operands[1]);\n    /* ADDRESS: ...  */\n    return TARGET_EXTENDED ? \"xmovei %0,%a1\" : \"movei %0,%a1\";\n  })\n\n;; Moving from any word pointer is done fastest by (X)MOVEI op0,(op1).\n;; As a special case, recognize the stack pointer.\n(define_insn \"*move_from_sp\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(reg:SI SP_REGNUM))]\n  \"\"\n  {\n    /* ADDRESS: ...  */\n    return TARGET_EXTENDED ? \"xmovei %0,(17)\" : \"movei %0,(17)\";\n  })\n\n;; Load scalar signed chars using HRRE.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (sign_extend:SI\n\t (match_operand:QI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"hrre %0,%W1\")\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (sign_extract:SI\n\t (match_operand:SI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")\n\t (const_int 9)\n\t (const_int 27)))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"hrre %0,%1\")\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(subreg:QI\n\t (zero_extract:SI (match_operand: SI 1 \"memory_operand\" \"m\")\n\t\t\t  (const_int 9)\n\t\t\t  (const_int 27))\n\t 3))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"move %0,%1\")\n\n(define_insn \"\"\n  [(set (subreg:QI\n\t (zero_extract:SI (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t\t\t  (const_int 9)\n\t\t\t  (const_int 27))\n\t 3)\n\t(match_operand:QI 1 \"register_operand\" \"r\"))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%0\")\n\n(define_insn \"\"\n  [(set (subreg:HI\n\t (zero_extract:SI (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t\t\t  (const_int 18)\n\t\t\t  (const_int 18))\n\t 2)\n\t(match_operand:HI 1 \"register_operand\" \"r\"))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(subreg:SI (match_operand:QI 1 \"memory_operand\" \"m\") 0)\n\t\t    (match_operand 2 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_SIGN_EXTEND))]\n  \"MEM_SCALAR_P (operands[1]) && INTVAL (operands[2]) >= 18\"\n  \"hrre %0,%W1\")\n\n;; Load scalar unsigned chars using MOVE.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI\n\t (match_operand:QI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"move %0,%W1\")\n; (define_insn \"\"\n;   [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n; \t(and:SI\n\t ;; This could well be a scalar int variable.\n; \t (match_operand:SI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")\n; \t (const_int 511)))]\n;   \"MEM_SCALAR_P (operands[1])\"\n;   \"move %0,%W1\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(subreg:SI (match_operand:QI 1 \"memory_operand\" \"m\") 0)\n\t\t    (match_operand 2 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_ZERO_EXTEND))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"move %0,%W1\")\n\n;; Store scalar chars using MOVEM.\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"pdp10_maybe_volatile_memory_operand\" \"=m\")\n\t(match_operand:QI 1 \"register_operand\" \"r\"))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%W0\")\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"pdp10_maybe_volatile_memory_operand\" \"=m\")\n\t(sign_extract:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t (const_int 9)\n\t\t\t (const_int 27)))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%0\")\n(define_insn \"\"\n  [(set (zero_extract:SI\n\t (match_operand:SI 0 \"pdp10_maybe_volatile_memory_operand\" \"+m\")\n\t (const_int 9)\n\t (const_int 27))\n\t(and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t(const_int 511)))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"memory_operand\" \"=m\")\n\t(subreg:QI (unspec:SI [(match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t       (match_operand 2 \"const_int_operand\" \"\")]\n\t\t\t      UNSPEC_SIGN_EXTEND)\n\t\t   3))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%W0\")\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"memory_operand\" \"=m\")\n\t(subreg:QI (unspec:SI [(match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t       (match_operand 2 \"const_int_operand\" \"\")]\n\t\t\t      UNSPEC_ZERO_EXTEND)\n\t\t   3))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%W0\")\n\n;; Load scalar unsigned shorts using MOVE.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI\n\t (match_operand:HI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"move %0,%W1\")\n(define_insn \"\"\n   [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n\t (subreg:HI\n\t  (zero_extract:SI\n\t   (match_operand:SI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")\n\t   (const_int 18)\n\t   (const_int 18))\n\t  2))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"move %0,%W1\")\n; (define_insn \"\"\n;    [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t\t ;; This could well be a scalar int variable.\n; \t (and:SI (match_operand:SI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")\n; \t\t (const_int RIGHT_HALF)))]\n;   \"MEM_SCALAR_P (operands[1])\"\n;   \"move %0,%W1\")\n\n;; Load scalar signed shorts using HRRE.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI\n\t (match_operand:SI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")\n\t (const_int 18)\n\t (const_int 18)))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"hrre %0,%1\")\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extend:SI\n\t (match_operand:HI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"hrre %0,%W1\")\n\n;; Store scalar shorts using MOVEM.\n(define_insn \"\"\n  [(set (match_operand:HI 0 \"pdp10_maybe_volatile_memory_operand\" \"=m\")\n\t(match_operand:HI 1 \"register_operand\" \"r\"))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%W0\")\n(define_insn \"\"\n  [(set (zero_extract:SI\n\t (match_operand:SI 0 \"pdp10_maybe_volatile_memory_operand\" \"+m\")\n\t (const_int 18)\n\t (const_int 18))\n\t(and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t(const_int RIGHT_HALF)))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%0\")\n\n(define_insn \"*sgeu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(ge:SI (xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")\n\t\t       (const_int SIGNBIT))\n\t       (match_operand:SI 2 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35;\n    operands[2] = gen_int_mode (INTVAL (operands[2]) ^ sign, SImode);\n    if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777)\n      return \"skipl %0,%1\\;%_caml %0,[%2]\\;%_%_trna\\;%_%_%_tdza %0,%0\\;%_%_%_%_movei %0,1\";\n    else\n      return \"skipl %0,%1\\;%_cail %0,%2\\;%_%_trna\\;%_%_%_tdza %0,%0\\;%_%_%_%_movei %0,1\";\n  }\n  [(set_attr \"length\" \"5\")])\n\n(define_insn \"*sgeu_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=&r\")\n\t(ge:SI (xor:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t\t(match_operand:SI 2 \"const_int_operand\" \"\"))\n\t\t       (const_int SIGNBIT))\n\t       (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35;\n\n    output_asm_insn (\"movei %0,0\", operands);\n\n    operands[2] = gen_int_mode (-INTVAL (operands[2]), SImode);\n    if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777)\n      output_asm_insn (\"caml %1,[%2]\", operands);\n    else\n      output_asm_insn (\"cail %1,%2\", operands);\n          \n    operands[3] = gen_int_mode ((INTVAL (operands[3]) ^ sign)\n\t\t\t\t- INTVAL (operands[2]), SImode);\n    if (INTVAL (operands[3]) & ~(HOST_WIDE_INT)0777777)\n      output_asm_insn (\"%_caml %1,[%3]\", operands);\n    else\n      output_asm_insn (\"%_cail %1,%3\", operands);\n\n    return \"%_%_movei %0,1\";\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*cbranchgeu\"\n  [(set (pc)\n\t(if_then_else\n\t (ge (xor:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[0];\n    ops[1] = operands[0];\n    ops[2] = GEN_INT (0);\n    ops[3] = operands[1];\n    ops[4] = operands[2];\n    return pdp10_output_range_compare (insn, ops, 0);\n  }\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*cbranchgeu_mem\"\n  [(set (pc)\n\t(if_then_else\n\t (ge (xor:SI (match_operand:SI 0 \"memory_operand\" \"m\")\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))\n   (clobber (match_scratch:SI 3 \"=x\"))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[3];\n    ops[1] = operands[0];\n    ops[2] = GEN_INT (0);\n    ops[3] = operands[1];\n    ops[4] = operands[2];\n    return pdp10_output_range_compare (insn, ops, 0);\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*cbranchgeu_plus\"\n  [(set (pc)\n\t(if_then_else\n\t (ge (xor:SI (plus:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"r\")\n\t\t\t      (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[0];\n    ops[1] = operands[0];\n    ops[2] = operands[1];\n    ops[3] = operands[2];\n    ops[4] = operands[3];\n    return pdp10_output_range_compare (insn, ops, 0);\n  }\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*sltu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(lt:SI (xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")\n\t\t       (const_int SIGNBIT))\n\t       (match_operand:SI 2 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35;\n    operands[2] = gen_int_mode (INTVAL (operands[2]) ^ sign, SImode);\n    if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777)\n      return \"skipl %0,%1\\;%_caml %0,[%2]\\;%_%_tdza %0,%0\\;%_%_%_movei %0,1\";\n    else\n      return \"skipl %0,%1\\;%_cail %0,%2\\;%_%_tdza %0,%0\\;%_%_%_movei %0,1\";\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*sltu_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(lt:SI (xor:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t\t(match_operand:SI 2 \"const_int_operand\" \"\"))\n\t\t       (const_int SIGNBIT))\n\t       (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35;\n\n    operands[2] = gen_int_mode (-INTVAL (operands[2]), SImode);\n    if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777)\n      output_asm_insn (\"caml %1,[%2]\", operands);\n    else\n      output_asm_insn (\"cail %1,%2\", operands);\n\n    operands[3] = gen_int_mode ((INTVAL (operands[3]) ^ sign)\n\t\t\t\t- INTVAL (operands[2]), SImode);\n    if (INTVAL (operands[3]) & ~(HOST_WIDE_INT)0777777)\n      output_asm_insn (\"%_caml %1,[%3]\", operands);\n    else\n      output_asm_insn (\"%_cail %1,%3\", operands);\n\n    return \"%_%_tdza %0,%0\\;%_%_%_movei %0,1\";\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*cbranchltu\"\n  [(set (pc)\n\t(if_then_else\n\t (lt (xor:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[0];\n    ops[1] = operands[0];\n    ops[2] = GEN_INT (0);\n    ops[3] = operands[1];\n    ops[4] = operands[2];\n    return pdp10_output_range_compare (insn, ops, 1);\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*cbranchltu_mem\"\n  [(set (pc)\n\t(if_then_else\n\t (lt (xor:SI (match_operand:SI 0 \"memory_operand\" \"m\")\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))\n   (clobber (match_scratch:SI 3 \"=x\"))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[3];\n    ops[1] = operands[0];\n    ops[2] = GEN_INT (0);\n    ops[3] = operands[1];\n    ops[4] = operands[2];\n    return pdp10_output_range_compare (insn, ops, 1);\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*cbranchltu_plus\"\n  [(set (pc)\n\t(if_then_else\n\t (lt (xor:SI (plus:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"r\")\n\t\t\t      (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[0];\n    ops[1] = operands[0];\n    ops[2] = operands[1];\n    ops[3] = operands[2];\n    ops[4] = operands[3];\n    return pdp10_output_range_compare (insn, ops, 1);\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(lshiftrt:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"i\")))]\n  \"INTVAL (operands[2]) != 4 && INTVAL (operands[2]) != 18\n   && INTVAL (operands[2]) != 20\"\n  {\n    rtx ops[4];\n    ops[0] = operands[0];\n    ops[1] = operands[1];\n    ops[2] = GEN_INT (BITS_PER_WORD - INTVAL (operands[2]));\n    ops[3] = GEN_INT (0);\n    if (get_attr_length (insn) == 1)\n      output_asm_insn (pdp10_output_extzv (insn, ops), ops);\n    else\n      output_asm_insn (pdp10_output_extzv_sequence (ops), ops);\n    return \"\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else\n\t (and (ne (symbol_ref \"TARGET_LARGE\") (const_int 0))\n\t      (match_operand:SI 1 \"pdp10_constaddr_memory_operand\" \"\"))\n\t (const_int 1)\n\t (const_int 2)))])\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"=m\")\n\t(and:SI (match_operand:SI 1 \"memory_operand\" \"0\")\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"hllzs %W0\")\n\n(define_insn \"\"\n  [(set (match_operand:HI 0 \"memory_operand\" \"=m\")\n\t(const_int 0))]\n  \"MEM_ALIGN (operands[0]) == 36\"\n  \"hrrzs %W0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(and:SI (match_dup 0) (const_int RIGHT_HALF)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(and:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"hrrzs %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(and:SI (match_dup 0) (const_int LEFT_HALF)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(and:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"hllzs %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(ashift:SI (match_dup 0) (const_int 18)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(ashift:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t   (const_int 18)))]\n  \"\"\n  \"hrlzs %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(lshiftrt:SI (match_dup 0) (const_int 18)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(lshiftrt:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t     (const_int 18)))]\n  \"\"\n  \"hlrzs %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(ior:SI (match_dup 0) (const_int LEFT_HALF)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(ior:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"hrros %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(ior:SI (match_dup 0) (const_int RIGHT_HALF)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(ior:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"hllos %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (ashift:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")\n\t\t\t   (const_int 18))\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"hrlo %0,%1\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (lshiftrt:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")\n\t\t\t     (const_int 18))\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"hlro %0,%1\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Data Movement\n\n(define_expand \"movqi\"\n  [(set (match_operand:QI 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:QI 1 \"general_operand\" \"\"))]\n  \"\"\n  \"if (no_new_pseudos)\n     {\n       if (REG_P (operands[0]) && GET_CODE (operands[1]) == CONST_INT)\n         operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));\n     }\n   else\n     {\n       if (GET_CODE (operands[0]) == SUBREG\n\t   && GET_CODE (SUBREG_REG (operands[0])) == ZERO_EXTRACT)\n\t {\n\t   if (GET_CODE (XEXP (SUBREG_REG (operands[0]), 0)) == MEM\n\t       && SUBREG_BYTE (operands[0]) == 3\n\t       && GET_CODE (XEXP (SUBREG_REG (operands[0]), 1)) == CONST_INT\n\t       && INTVAL (XEXP (SUBREG_REG (operands[0]), 1)) == 9\n\t       && GET_CODE (XEXP (SUBREG_REG (operands[0]), 2)) == CONST_INT\n\t       && INTVAL (XEXP (SUBREG_REG (operands[0]), 2)) == 27\n\t       && MEM_SCALAR_P (XEXP (SUBREG_REG (operands[0]), 0)))\n\t     emit_move_insn (XEXP (SUBREG_REG (operands[0]), 0),\n\t\t\t     convert_to_mode (SImode, operands[1], 1));\n\t   else\n\t     emit_move_insn (SUBREG_REG (operands[0]),\n\t\t\t     convert_to_mode (SImode, operands[1], 1));\n\t   DONE;\n\t }\n       else if (GET_CODE (operands[1]) == SUBREG\n\t\t&& GET_CODE (SUBREG_REG (operands[1])) == ZERO_EXTRACT)\n\t {\n\t   rtx temp = gen_reg_rtx (SImode);\n\t   emit_move_insn (temp, SUBREG_REG (operands[1]));\n\t   operands[1] = gen_rtx_SUBREG (QImode, temp, 3);\n\t }\n       else if (GET_CODE (operands[1]) == CONST_INT)\n   \t {\n   \t   rtx temp = gen_reg_rtx (SImode);\n   \t   emit_insn (gen_movsi (temp, operands[1]));\n   \t   operands[1] = gen_rtx_SUBREG (QImode, temp, 3);\n   \t }\n       if (GET_CODE (operands[0]) == MEM)\n   \t operands[1] = force_reg (QImode, operands[1]);\n     }\")\n\n(define_insn \"*movqi_reg\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(match_operand:QI 1 \"register_operand\" \"r\"))]\n  \"\"\n  \"move %0,%1\")\n\n(define_insn \"*LDBzqi_sequence\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n        (zero_extend:SI (match_operand:QI 1 \"memory_operand\" \"m,>\")))]\n  \"TARGET_EXTENDED\n   && !CONSTANT_ADDRESS_P (XEXP (operands[1], 0))\n   && pdp10_pointer_alignment (XEXP (operands[1], 0)) >= UNITS_PER_WORD\n   && (GET_CODE (XEXP (operands[1], 0)) == REG\n       || (INTVAL (XEXP (XEXP (operands[1], 0), 1)) % UNITS_PER_WORD == 0))\"\n  {\n    rtx ops[4];\n    ops[0] = operands[0];\n    ops[1] = operands[1];\n    ops[2] = GEN_INT (9);\n    ops[3] = GEN_INT (0);\n    output_asm_insn (pdp10_output_extzv_sequence (ops), ops);\n    return \"\";\n  }\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*LDBzqi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n        (zero_extend:SI (match_operand:QI 1 \"memory_operand\" \">,m\")))]\n  \"\"\n  \"*return pdp10_output_load_unsigned_byte (insn, operands);\"\n  [(set_attr \"reorg_type\" \"none,ldb\")])\n\n(define_insn \"*LDBIzqi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI (match_operand:QI 1 \"memory_operand\" \"<\")))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_load_unsigned_byte (insn, operands);\")\n\n(define_insn \"*LDBEqi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n        (sign_extend:SI (match_operand:QI 1 \"memory_operand\" \">,<,m\")))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_load_signed_byte (insn, operands);\"\n  [(set_attr \"reorg_type\" \"none,none,ldb\")])\n\n(define_insn \"*LDBEqi_sequence\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n        (sign_extend:SI (match_operand:QI 1 \"memory_operand\" \">,m\")))]\n  \"!TARGET_XKL2\"\n  {\n    if (/*CONSTANT_ADDRESS_P (XEXP (operands[1], 0)) || */\n\tpdp10_pointer_alignment (XEXP (operands[1], 0)) >= UNITS_PER_WORD)\n      {\n\trtx ops[4];\n\tint offset = pdp10_pointer_offset (XEXP (operands[1], 0));\n\tops[0] = operands[0];\n\tops[1] = operands[1];\n\tops[2] = GEN_INT (9);\n\tops[3] = GEN_INT (0);\n\toutput_asm_insn (pdp10_output_extv_sequence (ops), ops);\n\treturn \"\";\n      }\n    else\n      {\n\tif (which_alternative == 0)\n\t  return \"ildb %0,%1\\;trne %0,400\\;%_orcmi %0,777\";\n\telse\n\t  return \"ldb %0,%1\\;trne %0,400\\;%_orcmi %0,777\";\n      }\n  }\n  [(set_attr \"length\" \"3\")\n   (set_attr \"reorg_type\" \"none,ldb\")])\n\n(define_insn \"*LDBqi\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r,r\")\n        (match_operand:QI 1 \"memory_operand\" \">,m\"))]\n  \"\"\n  \"*return pdp10_output_load_unsigned_byte (insn, operands);\"\n  [(set_attr \"reorg_type\" \"none,ldb\")])\n;   \"@\n;    ildb %0,%1\n;    ldb %0,%1\")\n\n(define_insn \"*LDBIqi\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n        (match_operand:QI 1 \"memory_operand\" \"<\"))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_load_unsigned_byte (insn, operands);\")\n\n(define_insn \"*DPBqi\"\n  [(set (match_operand:QI 0 \"memory_operand\" \"=>,m\")\n\t(match_operand:QI 1 \"register_operand\" \"r,r\"))]\n  \"\"\n  \"*return pdp10_output_store_byte (insn, operands);\"\n  [(set_attr \"reorg_type\" \"none,dpb\")])\n\n(define_insn \"*DPBIqi\"\n  [(set (match_operand:QI 0 \"memory_operand\" \"=<\")\n\t(match_operand:QI 1 \"register_operand\" \"r\"))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_store_byte (insn, operands);\")\n\n(define_expand \"movhi\"\n  [(set (match_operand:HI 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:HI 1 \"general_operand\" \"\"))]\n  \"\"\n  \"if (no_new_pseudos)\n     {\n       if (REG_P (operands[0]) && GET_CODE (operands[1]) == CONST_INT)\n         operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));\n     }\n   else\n     {\n       if (GET_CODE (operands[0]) == SUBREG\n\t   && GET_CODE (SUBREG_REG (operands[0])) == ZERO_EXTRACT)\n\t {\n\t   if (GET_CODE (XEXP (SUBREG_REG (operands[0]), 0)) == MEM\n\t       && SUBREG_BYTE (operands[0]) == 2\n\t       && GET_CODE (XEXP (SUBREG_REG (operands[0]), 1)) == CONST_INT\n\t       && INTVAL (XEXP (SUBREG_REG (operands[0]), 1)) == 18\n\t       && GET_CODE (XEXP (SUBREG_REG (operands[0]), 2)) == CONST_INT\n\t       && INTVAL (XEXP (SUBREG_REG (operands[0]), 2)) == 18\n\t       && MEM_SCALAR_P (XEXP (SUBREG_REG (operands[0]), 0)))\n\t     emit_move_insn (XEXP (SUBREG_REG (operands[0]), 0),\n\t\t\t     convert_to_mode (SImode, operands[1], 1));\n\t   else\n\t     emit_move_insn (SUBREG_REG (operands[0]),\n\t\t\t     convert_to_mode (SImode, operands[1], 1));\n\t   DONE;\n\t }\n       else if (GET_CODE (operands[1]) == SUBREG\n\t\t&& GET_CODE (SUBREG_REG (operands[1])) == ZERO_EXTRACT)\n\t {\n\t   rtx temp = gen_reg_rtx (SImode);\n\t   emit_move_insn (temp, XEXP (operands[1], 0));\n\t   operands[1] = gen_rtx_SUBREG (HImode, temp, 2);\n\t }\n       else if (GET_CODE (operands[1]) == CONST_INT)\n   \t {\n   \t   rtx reg = gen_reg_rtx (SImode);\n   \t   emit_insn (gen_movsi (reg, operands[1]));\n   \t   operands[1] = gen_rtx_SUBREG (HImode, reg, 2);\n   \t }\n       if (GET_CODE (operands[0]) == MEM)\n   \t operands[1] = force_reg (HImode, operands[1]);\n     }\")\n\n(define_insn \"*movhi\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n        (match_operand:HI 1 \"register_operand\" \"r\"))]\n  \"\"\n  \"move %0,%1\")\n\n; (define_insn \"*halfword_move\"\n;   [(set (match_operand:SI 0 \"pdp10_halfword_destination\" \"=\")\n; \t(match_operand:SI 1 \"pdp10_halfword_source\" \"\"))]\n;   \"\"\n;   \"*pdp10_output_halfword_move (operands);\")\n\n(define_insn \"*HLR\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 18))\n\t(subreg:SI (match_operand:HI 1 \"memory_operand\" \"m\") 0))]\n  \"\"\n  \"hlr %0,%W1\")\n\n(define_insn \"*HLL\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 0))\n\t(subreg:SI (match_operand:HI 1 \"memory_operand\" \"m\") 0))]\n  \"\"\n  \"hll %0,%W1\")\n\n(define_insn \"*HLLM\"\n  [(set (mem:SI (match_operand:SI 0 \"address_operand\" \"p\"))\n\t(ior:SI (and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t(const_int LEFT_HALF))\n\t\t(zero_extend:SI (mem:HI (match_dup 0)))))]\n  \"\"\n  {\n    if (GET_CODE (operands[0]) == CONST\n        && TARGET_EXTENDED && !TARGET_SMALLISH)\n      /* ADDRESS: ...  */\n      return \"hllm %1,@[%W0]\";\n    else\n      return \"hllm %1,%W0\";\n  })\n\n(define_insn \"HRR\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r,m\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 18))\n\t(and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"@\n   hrr %0,%1\n   hrrm %1,%0\")\n\n(define_insn \"*HRL\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r,m\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 0))\n\t(and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"@\n   hrl %0,%1\n   hrlm %1,%0\")\n\n; (define_insn \"*HxR\"\n;   [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n; \t\t\t (const_int 18)\n; \t\t\t (const_int 18))\n;         (subreg:SI (match_operand:HI 1 \"memory_operand\" \"m\") 0))]\n;   \"\"\n;   \"*return pdp10_output_halfword_insv (insn, operands, 18);\")\n\n(define_insn \"*HxRM\"\n  [(set (subreg:SI (match_operand:HI 1 \"memory_operand\" \"=m\") 0)\n\t(zero_extract:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 18)))]\n  \"\"\n  \"*return pdp10_output_halfword_extv (insn, operands, 18);\")\n\n; (define_insn \"*HxL\"\n;   [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n; \t\t\t (const_int 18)\n; \t\t\t (const_int 0))\n;         (subreg:SI (match_operand:HI 1 \"memory_operand\" \"m\") 0))]\n;   \"\"\n;   \"*return pdp10_output_halfword_insv (insn, operands, 0);\")\n\n(define_insn \"*HxLM\"\n  [(set (match_operand:HI 1 \"memory_operand\" \"=m\")\n\t(subreg:HI (lshiftrt:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t\t\t(const_int 18)) 2))]\n  \"\"\n  \"*return pdp10_output_halfword_extv (insn, operands, 0);\")\n\n(define_insn \"*HLR\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r,m\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 18))\n        (lshiftrt:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t     (const_int 18)))]\n  \"\"\n  \"@\n   hlr %0,%W1\n   hlrm %1,%W0\")\n\n(define_insn \"HRRZ\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  {\n    if (REG_P (operands[0]) && REG_P (operands[1])\n\t&& REGNO (operands[0]) == REGNO (operands[1])\n\t&& zero_extended_p (operands[0], 18, insn))\n      return \"\";\n    else\n      {\n        const char *insn[] = { \"hrrz %0,%W1\", \"hrrzm %1,%W0\" };\n\treturn insn[which_alternative];\n      }\n  })\n\n(define_insn \"*HRRO\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(ior:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"@\n   hrro %0,%W1\n   hrrom %1,%W0\")\n\n(define_insn \"*HLLZ\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"@\n   hllz %0,%W1\n   hllzm %1,%W0\")\n\n(define_insn \"*HLLO\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(ior:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"@\n   hllo %0,%W1\n   hllom %1,%W0\")\n\n(define_insn \"*HLL\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r,m\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 0))\n        (lshiftrt:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t     (const_int 18)))]\n  \"\"\n  \"@\n   hll %0,%W1\n   hllm %1,%W0\")\n\n(define_insn \"HLRZ\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(lshiftrt:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t     (const_int 18)))]\n  \"\"\n  \"@\n   hlrz %0,%1\n   hlrzm %1,%0\")\n\n(define_insn \"HLRE\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(ashiftrt:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t     (const_int 18)))]\n  \"\"\n  \"@\n   hlre %0,%1\n   hlrem %1,%0\")\n\n(define_insn \"*HLRE_extract\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:HI 1 \"memory_operand\" \"m\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 0)))]\n  \"\"\n  \"hlre %0,%W1\")\n\n(define_insn \"*HRLZ\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(ashift:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t   (const_int 18)))]\n  \"\"\n  \"@\n   hrlz %0,%1\n   hrlzm %1,%0\")\n\n(define_insn \"*loadhi\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n        (match_operand:HI 1 \"memory_operand\" \"m>\"))]\n  \"\"\n  \"*return pdp10_output_movhi (operands, 0);\")\n\n(define_insn \"*zloadhi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI (match_operand:HI 1 \"memory_operand\" \"m>\")))]\n  \"\"\n  \"*return pdp10_output_movhi (operands, 0);\")\n\n(define_insn \"*sloadhi_1\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (sign_extend:SI\n\t (match_operand:HI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"pdp10_pointer_alignment (XEXP (operands[1], 0)) >= UNITS_PER_WORD\"\n  \"*return pdp10_output_movhi (operands, 1);\")\n\n(define_insn \"*sloadhi_2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (sign_extend:SI\n\t (match_operand:HI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"pdp10_pointer_alignment (XEXP (operands[1], 0)) < UNITS_PER_WORD\"\n  {\n    output_asm_insn (pdp10_output_movhi (operands, 0), operands);\n    return \"hrre %0,%0\";\n  }\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"storehi\"\n  [(set (match_operand:HI 0 \"memory_operand\" \"=m>\")\n\t(match_operand:HI 1 \"register_operand\" \"r\"))]\n  \"\"\n  \"*return pdp10_output_movhi (operands, 0);\")\n\n(define_insn \"*zstorehi\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"=m\")\n        (zero_extend:SI (match_operand:HI 1 \"register_operand\" \"r\")))]\n  \"\"\n  \"hrrzm %1,%0\")\n\n(define_insn \"*sstorehi\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"=m\")\n        (sign_extend:SI (match_operand:HI 1 \"memory_operand\" \"r\")))]\n  \"\"\n  \"hrrem %1,%0\")\n\n(define_expand \"extv\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(sign_extract:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"\"\n  \"if (INTVAL (operands[2]) + INTVAL (operands[3]) > BITS_PER_WORD)\n     FAIL;\n   if (!TARGET_XKL2)\n     {\n       if (pdp10_expand_extv (operands))\n         DONE;\n     }\")\n\n(define_insn \"*extv_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"!TARGET_XKL2\"\n  \"*return pdp10_output_extv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*extv_mem\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:QI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"!TARGET_XKL2\"\n  \"*return pdp10_output_extv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*extv_memsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"!TARGET_XKL2\"\n  \"*return pdp10_output_extv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*LDBE_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_extv (insn, operands);\")\n\n(define_insn \"*LDBE_regqi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:QI 1 \"register_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_extv (insn, operands);\")\n\n(define_insn \"*LDBE_mem\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:QI 1 \"memory_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_extv (insn, operands);\")\n\n(define_expand \"extzv\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(zero_extract:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"\"\n  \"if (INTVAL (operands[2]) + INTVAL (operands[3]) > BITS_PER_WORD)\n     FAIL;\n   if (pdp10_expand_extzv (operands))\n     DONE;\")\n\n(define_insn \"*extzv_reg_sequence\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) == 16 || INTVAL (operands[3]) == 0\"\n  \"*return pdp10_output_extzv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*extzv_memsi_sequence\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) == 16\n   || (TARGET_EXTENDED\n       && (INTVAL (operands[3]) == 0\n\t   || INTVAL (operands[2]) + INTVAL (operands[3]) == 36)\n       && !CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))\"\n;       && (GET_CODE (XEXP (operands[1], 0)) == REG\n;\t   || GET_CODE (XEXP (operands[1], 0)) == PLUS))\"\n;\t   || (GET_CODE (XEXP (operands[1], 0)) == PLUS\n;\t       && INTVAL (XEXP (XEXP (operands[1], 0), 1))\n;\t\t  % UNITS_PER_WORD == 0)))\"\n  \"*return pdp10_output_extzv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*extzv_mem_sequence\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:QI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) == 16\n   || (TARGET_EXTENDED\n       && INTVAL (operands[3]) == 0\n       && !CONSTANT_ADDRESS_P (XEXP (operands[1], 0))\n       && (GET_CODE (XEXP (operands[1], 0)) == REG\n\t   || (GET_CODE (XEXP (operands[1], 0)) == PLUS\n\t       && INTVAL (XEXP (XEXP (operands[1], 0), 1))\n\t\t  % UNITS_PER_WORD == 0)))\"\n  \"*return pdp10_output_extzv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*extzv_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) != 16\"\n  \"*return pdp10_output_extzv (insn, operands);\")\n\n(define_insn \"*extzv_mem\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:QI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) != 16\"\n  \"*return pdp10_output_extzv (insn, operands);\")\n\n(define_insn \"*extzv_memsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) != 16\"\n  \"*return pdp10_output_extzv (insn, operands);\")\n\n(define_insn \"*move_dpb\"\n  [(set (match_operand:QI 0 \"memory_operand\" \"=m\")\n\t(subreg:QI (zero_extract:SI (match_operand:SI 2 \"memory_operand\" \"m\")\n\t\t\t\t    (const_int 9)\n\t\t\t\t    (const_int 27)) 3))\n   (clobber (match_scratch:SI 1 \"=r\"))]\n  \"\"\n  {\n    output_asm_insn (\"move %1,%2\", operands);\n    return pdp10_output_store_byte (insn, operands);\n  }\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*move_dpb2\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t\t\t (const_int 8)\n\t\t\t (const_int 0))\n\t(and:SI (match_operand:SI 2 \"memory_operand\" \"m\")\n\t\t(const_int 255)))\n   (clobber (match_scratch:SI 1 \"=r\"))]\n  \"\"\n  {\n    output_asm_insn (\"move %1,%2\", operands);\n    return pdp10_output_store_byte (insn, operands);\n  }\n  [(set_attr \"length\" \"2\")])\n\n(define_expand \"insv\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t\t\t (match_operand:SI 1 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t(match_operand:SI 3 \"register_operand\" \"\"))]\n  \"\"\n  \"if (INTVAL (operands[1]) + INTVAL (operands[2]) > BITS_PER_WORD)\n     FAIL;\n   /* FIXME: is this necessary?  According to test/misc/array-loop.c, yes. */\n   if (GET_CODE (operands[0]) == MEM\n       && GET_CODE (XEXP (operands[0], 0)) == REG\n       && INTVAL (operands[1]) == BITS_PER_WORD\n       && INTVAL (operands[2]) == 0)\n     {\n       emit_move_insn (gen_rtx_MEM (SImode, XEXP (operands[0], 0)),\n\t\t       operands[3]);\n       DONE;\n     }\")\n\n; (define_insn \"\"\n;   [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n; \t\t\t (const_int 18)\n; \t\t\t (const_int 18))\n; \t(match_operand:SI 3 \"register_operand\" \"r\"))]\n;   \"\"\n;   \"*return pdp10_output_insv (insn, operands);\")\n\n(define_insn \"*insv_reg\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n\t\t\t (match_operand:SI 1 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t(match_operand:SI 3 \"register_operand\" \"r\"))]\n  \"\"\n  \"*return pdp10_output_insv (insn, operands);\")\n\n(define_insn \"*insv_mem\"\n  [(set (zero_extract:SI (match_operand:QI 0 \"memory_operand\" \"+m\")\n\t\t\t (match_operand:SI 1 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t(match_operand:SI 3 \"register_operand\" \"r\"))]\n  \"\"\n  \"*return pdp10_output_insv (insn, operands);\")\n\n(define_insn \"*insv_memsi\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t\t\t (match_operand:SI 1 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t(match_operand:SI 3 \"register_operand\" \"r\"))]\n  \"\"\n  \"*return pdp10_output_insv (insn, operands);\")\n\n(define_expand \"movsi\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:SI 1 \"general_operand\" \"\"))]\n  \"\"\n  \"if (GET_CODE (operands[0]) == ZERO_EXTRACT)\n     operands[1] = force_reg (SImode, operands[1]);\")\n\n;; Special version using SKIPA to load a full-word constant.  This may\n;; be beneficial on processors with a cache.  Note the 'x' constraint\n;; on alternative 7.  Reload can fall back on the last alternative if\n;; instisting on moving to register 0.\n(define_insn \"*movsi_cache\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,r,r,x,m,m,m,r\")\n\t;; ADDRESS: the S constraint allows a symbol.\n        (match_operand:SI 1 \"general_operand\" \"rm,I,S,L,M,N,P,i,O,M,r,i\"))]\n  \"TARGET_CACHE && !optimize_size\"\n  \"*return pdp10_output_movsi (insn, which_alternative);\"\n  [(set_attr \"length\" \"1,1,1,1,1,1,1,2,1,1,1,1\")])\n\n(define_insn \"*movsi_nocache\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,r,r,r,m,m,m\")\n\t;; ADDRESS: the S constraint allows a symbol.\n        (match_operand:SI 1 \"general_operand\" \"rm,I,S,L,M,N,P,i,O,M,r\"))]\n  \"\"\n  \"*return pdp10_output_movsi (insn, which_alternative);\")\n\n(define_insn \"move_two_halves\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (ashift:SI (match_operand:SI 1 \"immediate_operand\" \"p\")\n\t\t\t   (const_int 18))\n\t\t(match_operand:SI 2 \"immediate_operand\" \"p\")))]\n  \"\"\n  \"move %0,[%1,,%2]\")\n\n(define_insn \"*MOVEI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t(const_int RIGHT_HALF)))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"movei %0,%2(%1)\")\n\n(define_insn \"*MOVS\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(match_operator:SI 1 \"pdp10_rotate_operator\"\n\t [(match_operand:SI 2 \"reg_or_mem_operand\" \"rm,r\") (const_int 18)]))]\n  \"\"\n  \"@\n   movs %0,%2\n   movsm %2,%0\")\n\n(define_insn \"*EXCH\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n        (match_operand:SI 1 \"register_operand\" \"r\"))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(match_dup 0))]\n  \"\"\n  \"exch %1,%0\")\n\n(define_insn \"*SETZB\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\") (const_int 0))\n   (set (match_operand:SI 1 \"register_operand\" \"=r\") (const_int 0))]\n  \"\"\n  \"setzb %1,%0\")\n\n(define_expand \"movdi\"\n  [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:DI 1 \"general_operand\" \"\"))]\n  \"\"\n  \"if (!HAVE_DMOVE && pdp10_expand_dmove (operands[0], operands[1]))\n     DONE;\")\n\n;; TODO: if there's a REG_UNUSED note attached to this insn, avoid\n;; moving the unused part of the DImode register.\n(define_insn \"DMOVE\"\n  [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,o,m\")\n        (match_operand:DI 1 \"general_operand\" \"rm,O,I,J,i,O,r\"))]\n  \"TARGET_KI10up\"\n  \"@\n   dmove %0,%1\n   setzb %0,%Z0\n   movei %0,0\\;movei %Z0,%1\n   seto %0,\\;movni %Z0,%n1\n   dmove %0,[%D1]\n   setzm %0\\;setzm %Z0\n   dmovem %1,%0\"\n  [(set_attr \"length\" \"1,1,2,2,1,2,1\")])\n\n(define_insn \"*movdi\"\n  [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,o,o\")\n        (match_operand:DI 1 \"general_operand\" \"ro,O,I,J,i,O,r\"))]\n  \"!TARGET_KI10up\"\n  \"@\n   move %0,%1\\;move %Z0,%Z1\n   setzb %0,%Z0\n   movei %0,0\\;movei %Z0,%1\n   seto %0,\\;movni %Z0,%n1\n   move %0,[%A1]\\;move %Z0,[%B1]\n   setzm %0\\;setzm %Z0\n   movem %1,%0\\;movem %Z1,%Z0\"\n  [(set_attr \"length\" \"2,1,2,2,2,2,2\")])\n\n(define_expand \"movti\"\n  [(set (match_operand:TI 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:TI 1 \"general_operand\" \"\"))]\n  \"TARGET_KI10up\"\n  \"if (pdp10_expand_move_4 (operands[0], operands[1]))\n     DONE;\")\n\n(define_insn \"movsf\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,r,r,r,m,m\")\n        (match_operand:SF 1 \"general_operand\" \"rm,R,G,F,R,r\"))]\n  \"\"\n  \"@\n   move %0,%1%; movsf\n   movei %0,0%; movsf\n   movsi %0,%G1%; movsf\n   move %0,[%1]%; movsf\n   setzm %0%; movsf\n   movem %1,%0%; movsf\")\n\n(define_expand \"movdf\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:DF 1 \"general_operand\" \"\"))]\n  \"\"\n  \"if (!HAVE_DMOVE && pdp10_expand_dmove (operands[0], operands[1]))\n     DONE;\")\n\n(define_insn \"*movdf_KI10up\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"=r,r,r,r,o,m\")\n        (match_operand:DF 1 \"general_operand\" \"rm,R,G,F,R,r\"))]\n  \"TARGET_KI10up\"\n  \"@\n   dmove %0,%1\n   setzb %0,%Z0%; movdf\n   movsi %0,%G1%; movdf\\;movei %Z0,0%; movdf\n   dmove %0,[%1]\n   setzm %0%; movdf\\;setzm %Z0%; movdf\n   dmovem %1,%0\"\n  [(set_attr \"length\" \"1,1,2,1,2,1\")])\n\n(define_insn \"*movdf_notKI10up\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"=r,r,r,r,o,o\")\n        (match_operand:DF 1 \"general_operand\" \"ro,R,G,F,R,r\"))]\n  \"!TARGET_KI10up\"\n  \"@\n   move %0,%1%; movdf\\;move %Z0,%Z1%; movdf\n   setzb %0,%Z0%; movdf\n   movsi %0,%G1%; movdf\\;movei %Z0,0%; movdf\n   move %0,[%A1]%; movdf\\;move %Z0,[%B1]%; movdf\n   setzm %0%; movdf\\;setzm %Z0%; movdf\n   movem %1,%0%; movdf\\;movem %Z1,%Z0%; movdf\"\n  [(set_attr \"length\" \"2,1,2,2,2,2\")])\n\n(define_expand \"movstrsi\"\n  [(match_operand:BLK 0 \"general_operand\" \"\")\n   (match_operand:BLK 1 \"general_operand\" \"\")\n   (match_operand:SI 2 \"general_operand\" \"\")\n   (match_operand:SI 3 \"const_int_operand\" \"\")]\n  \"\"\n  \"if (pdp10_expand_movstrsi (operands))\n     DONE;\n   FAIL;\")\n\n(define_expand \"clrstrsi\"\n  [(match_operand:BLK 0 \"general_operand\" \"\")\n   (match_operand:SI 1 \"general_operand\" \"\")\n   (match_operand:SI 2 \"const_int_operand\" \"\")]\n  \"\"\n  \"if (pdp10_expand_clrstrsi (operands))\n     DONE;\n   FAIL;\")\n\n; (define_expand \"cmpstrsi\"\n;   [(set (match_operand:SI 0 \"register_operand\" \"\")\n; \t(compare:SI (match_operand:BLK 1 \"general_operand\" \"\")\n; \t\t    (match_operand:BLK 2 \"general_operand\" \"\")))\n;    (use (match_operand:SI 3 \"general_operand\" \"\"))\n;    (use (match_operand:SI 4 \"const_int_operand\" \"\"))]\n;   \"TARGET_KL10up && TARGET_STRING\"\n;   \"if (pdp10_expand_cmpstrsi (operands))\n;      DONE;\n;    FAIL;\")\n\n(define_insn \"BLT\"\n  [(unspec_volatile:BLK\n    [(match_operand:SI 0 \"register_operand\" \"r\")] VUNSPEC_BLT)\n   (clobber (match_dup 0))\n   (use (match_operand:BLK 1 \"memory_operand\" \"m\"))]\n  \"\"\n  \"blt %0,%1\")\n\n(define_insn \"XBLT\"\n  [(unspec_volatile:BLK\n    [(match_operand:TI 0 \"register_operand\" \"+r\")] VUNSPEC_XBLT)\n  (clobber (match_dup 0))]\n  \"TARGET_KL10up\"\n  \"extend %0,[xblt]\")\n\n; (define_insn \"MOVSLJ\"\n;   [(unspec_volatile:BLK [(match_operand:SI 0 \"register_operand\" \"+r\")]\n; \t\t\t VUNSPEC_MOVSLJ)]\n;   \"TARGET_KL10up && TARGET_STRING\"\n;   \"extend %0,[movslj]\")\n\n; (define_insn \"MOVST\"\n;   [(unspec_volatile:BLK [(match_operand:SI 0 \"register_operand\" \"+r\")]\n; \t\t\t VUNSPEC_MOVST)]\n;   \"TARGET_KL10up && TARGET_STRING\"\n;   \"extend %0,[movst]\")\n\n; (define_insn \"CMPS\"\n;   [(unspec_volatile:BLK [(match_operand:SI 0 \"register_operand\" \"+r\")]\n;\t\t\t  VUNSPEC_CMPS)]\n;   \"TARGET_KL10up && TARGET_STRING\"\n;   \"extend %0,[cmps]\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Conditional Data Movement\n\n;; (define_expand \"cstoresi4\" ...)\n;; (define_expand \"cstoresf4\" ...)\n\n(define_expand \"seq\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(eq:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"sne\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ne:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"slt\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(lt:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"sgt\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(gt:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"sle\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(le:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"sge\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ge:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"sltu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(lt:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"sgtu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(gt:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"sleu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(le:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"sgeu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ge:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_insn \"*snesi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,x\")\n\t(ne:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm\")\n\t       (const_int 0)))]\n  \"\"\n  \"@\n   skipe %@%0\\;%_movei %0,1\n   skipe %0,%1\\;%_movei %0,1\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*sgesi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ge:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t       (const_int 0)))]\n  \"\"\n  \"lsh %0,-43\\;xori %0,1\"\n  [(set_attr \"length\" \"2\")])\n\n;; This seemingly useless instruction combination is needed to enable\n;; the combination below.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(xor:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t\t (match_operand:SI 2 \"reg_or_mem_operand\" \"rm\"))\n\t\t(const_int SIGNBIT)))]\n  \"0\"\n  \"add %0,%2\\;tlc %0,400000\")\n\n;; Calculate the truth value of this particular unsigned comparison\n;; with ADD and JCRY0.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(gt:SI (xor:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t       (const_int SIGNBIT))\n\t       (xor:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"0\")\n\t\t\t\t(match_operand:SI 3 \"reg_or_mem_operand\" \"1\"))\n\t\t       (const_int SIGNBIT))))]\n  \"0\"\n  \"jfcl 17,.+1\\;add %0,%3\\;jcry0 .+2\\;%_tdza %0,%0\\;movei %0,1\")\n\n(define_insn \"*sccsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n\t(match_operator:SI 1 \"pdp10_comparison_operator\"\n\t [(match_operand:SI 2 \"reg_or_mem_operand\" \"r,rm\")\n\t  (match_operand:SI 3 \"general_operand\" \"rm,O\")]))]\n  \"\"\n  \"@\n   cam%1 %2,%3\\;%_tdza %0,%0\\;%_%_movei %0,1\n   skip%1 %@%2\\;%_tdza %0,%0\\;%_%_movei %0,1\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*snesf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,x\")\n\t(ne:SI (match_operand:SF 1 \"reg_or_mem_operand\" \"0,rm\")\n\t       (match_operand:SF 2 \"immediate_operand\" \"R,R\")))]\n  \"\"\n  \"@\n   skipe %@%0\\;%_movei %0,1\n   skipe %0,%1\\;%_movei %0,1\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*sltsf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(lt:SI (match_operand:SF 1 \"register_operand\" \"0\")\n\t       (match_operand:SF 2 \"immediate_operand\" \"R\")))]\n  \"\"\n  \"lsh %0,-43\")\n\n(define_insn \"*sgesf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ge:SI (match_operand:SF 1 \"register_operand\" \"0\")\n\t       (match_operand:SF 2 \"immediate_operand\" \"R\")))]\n  \"\"\n  \"lsh %0,-43\\;xori %0,1\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*sccsf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n\t(match_operator:SI 1 \"pdp10_comparison_operator\"\n\t [(match_operand:SF 2 \"reg_or_mem_operand\" \"r,rm\")\n\t  (match_operand:SF 3 \"general_operand\" \"rm,R\")]))]\n  \"\"\n  \"@\n   cam%1 %2,%3\\;%_tdza %0,%0\\;%_%_movei %0,1\n   skip%1 %@%2\\;%_tdza %0,%0\\;%_%_movei %0,1\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*snedf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(ne:SI (match_operand:DF 1 \"reg_or_mem_operand\" \"ro\")\n\t       (match_operand:DF 2 \"pdp10_const_double_0_operand\" \"\")))]\n  \"\"\n  \"skipn %@%1\\;%_skipe %0,%Z1\\;%_%_movei %0,1\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*sltdf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(lt:SI (match_operand:DF 1 \"register_operand\" \"0\")\n\t       (match_operand:DF 2 \"immediate_operand\" \"R\")))]\n  \"\"\n  \"lsh %0,-43\")\n\n(define_insn \"*sgedf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ge:SI (match_operand:DF 1 \"register_operand\" \"0\")\n\t       (match_operand:DF 2 \"immediate_operand\" \"R\")))]\n  \"\"\n  \"lsh %0,-43\\;xori %0,1\"\n  [(set_attr \"length\" \"2\")])\n\n;; (define_expand \"cmovsi6\" ...)\n;; (define_expand \"cmovsf6\" ...)\n\n;; Reload can't handle JUMP_INSNs (such as this one) with spilled\n;; register outputs.  Therefore, this pattern must have a memory\n;; alternative for operand 3.\n(define_insn \"*move_and_skipsi\"\n  [(set (pc)\n\t(if_then_else (match_operator 0 \"pdp10_comparison_operator\"\n\t\t       [(match_operand:SI 1 \"reg_or_mem_operand\" \"r,rm,r,m\")\n\t\t        (const_int 0)])\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))\n   ;; The predicate is \"preferably_register_operand\" so that memory\n   ;; operands are invalid until after register allocation.  The\n   ;; memory constraint is just there as a last resort when operand 3\n   ;; is spilled to stack.  The \"r\" constraint is there to allow\n   ;; accumulator 0.\n   (set (match_operand:SI 3 \"preferably_register_operand\" \"=1,x,rm,!rm\")\n\t(match_dup 1))]\n  \"\"\n  {\n    if (which_alternative == 0)\n      return \"jump%0 %1,%F2\";\n    pdp10_remove_unnecessary_label (insn, operands[2]);\n    switch (get_attr_length (insn))\n      {\n      case 1:\n\treturn \"skip%0 %3,%1\";\n      case 2:\n\tif (which_alternative == 2)\n\t  return \"movem %1,%3\\;jump%0 %1,%F2\";\n\telse if (REGNO (operands[3]) == 0)\n\t  return \"move %3,%1\\;jump%0 %3,%F2\";\n\telse\n\t  {\n\t    output_asm_insn (\"skip%R0 %3,%1\", operands);\n\t    return pdp10_output_jrst (operands[2]);\n\t  }\n      /* FIXME: is the use of a fixed scratch register avoidable?  */\n      case 3:\n\treturn \"move 0,%1\\;movem 0,%3\\;jump%0 0,%F2\";\n      default:\n\tabort ();\n      }\n  }\n  [(set (attr \"length\")\n\t(cond [(eq_attr \"alternative\" \"0\") (const_int 1)\n\t       (eq_attr \"alternative\" \"2\") (const_int 2)\n\t       (eq_attr \"alternative\" \"3\") (const_int 3)\n\t       (eq (minus (match_dup 2) (pc)) (const_int 1)) (const_int 1)]\n\t       (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n; (define_insn \"*move_and_skipsi\"\n;   [(set (pc)\n; \t(if_then_else (match_operator 0 \"pdp10_comparison_operator\"\n; \t\t       [(match_operand:SI 1 \"reg_or_mem_operand\" \"r,rm,rm\")\n; \t\t        (const_int 0)])\n; \t (label_ref (match_operand 2 \"\" \"\"))\n; \t (pc)))\n;    ;; The predicate is \"preferably_register_operand\" so that memory\n;    ;; operands are invalid until after register allocation.  The\n;    ;; memory constraint is just there as a last resort when operand 3\n;    ;; is spilled to stack.  The \"r\" constraint is there to allow\n;    ;; accumulator 0.\n;    (set (match_operand:SI 3 \"preferably_register_operand\" \"=1,x,!rm\")\n; \t(match_dup 1))]\n;   \"\"\n;   {\n;     if (which_alternative == 0)\n;       return \"jump%0 %1,%F2\";\n;     pdp10_remove_unnecessary_label (insn, operands[2]);\n;     switch (get_attr_length (insn))\n;       {\n;       case 1:\n; \treturn \"skip%0 %3,%1\";\n;       case 2:\n; \tif (REGNO (operands[3]) == 0)\n; \t  return \"move %3,%1\\;jump%0 %3,%F2\";\n; \telse\n; \t  {\n; \t    output_asm_insn (\"skip%R0 %3,%1\", operands);\n; \t    return pdp10_output_jrst (operands[2]);\n; \t  }\n;       /* FIXME: is the use of a fixed scratch register avoidable?  */\n;       case 3:\n; \treturn \"move 0,%1\\;movem 0,%3\\;jump%0 0,%F2\";\n;       default:\n; \tabort ();\n;       }\n;   }\n;   [(set (attr \"length\")\n; \t(cond [(eq_attr \"alternative\" \"0\") (const_int 1)\n; \t       (eq_attr \"alternative\" \"2\") (const_int 3)\n; \t       (eq (minus (match_dup 2) (pc)) (const_int 1)) (const_int 1)]\n; \t       (const_int 2)))\n;    (set_attr \"skip\" \"yes\")])\n\n;; Reload can't handle JUMP_INSNs (such as this one) with spilled\n;; register outputs.  Therefore, this pattern must have a memory\n;; alternative for operand 4.\n(define_insn \"*move_and_skipsf\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 0 \"pdp10_comparison_operator\"\n\t  [(match_operand:SF 1 \"reg_or_mem_operand\" \"rm,rm,rm\")\n\t   (match_operand:SF 2 \"pdp10_const_double_0_operand\" \"\")])\n\t  (label_ref (match_operand 3 \"\" \"\"))\n\t  (pc)))\n   ;; The predicate is \"preferably_register_operand\" so that memory\n   ;; operands are invalid until after register allocation pass.  The\n   ;; memory constraint is just there as a last resort when operand 3\n   ;; is spilled to stack.  The \"r\" constraint is there to allow\n   ;; accumulator 0.\n   (set (match_operand:SF 4 \"preferably_register_operand\" \"=1,x,!rm\")\n\t(match_dup 1))]\n  \"\"\n  {\n    if (which_alternative == 0)\n      return \"jump%0 %1,%F3\";\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    switch (get_attr_length (insn))\n      {\n      case 1:\n\treturn \"skip%0 %4,%1\";\n      case 2:\n\tif (REGNO (operands[3]) == 0)\n\t  return \"move %4,%1\\;jump%0 %4,%F3\";\n\telse\n\t  {\n\t    output_asm_insn (\"skip%R0 %4,%1\", operands);\n\t    return pdp10_output_jrst (operands[3]);\n\t  }\n      /* FIXME: is the use of a fixed scratch register avoidable?  */\n      case 3:\n\treturn \"move 0,%1\\;movem 0,%4\\;jump%0 0,%F3\";\n      default:\n\tabort ();\n      }\n  }\n  [(set (attr \"length\")\n\t(cond [(eq_attr \"alternative\" \"0\") (const_int 1)\n\t       (eq_attr \"alternative\" \"2\") (const_int 3)\n\t       (eq (minus (match_dup 3) (pc)) (const_int 1)) (const_int 1)]\n\t       (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Integer Arithmetic\n\n(define_expand \"addsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n\t\t (match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  ;; Make sure that for a MEM + x, x can only be a register or +/-1.\n  \"if (memory_operand (operands[1], SImode)\n       && !(register_operand (operands[2], SImode)\n\t    || (const_int_operand (operands[2], SImode)\n\t\t&& (INTVAL (operands[2]) == 1 || INTVAL (operands[2]) == -1))))\n     operands[2] = force_reg (SImode, operands[2]);\")\n\n(define_insn \"*addsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,m,m,m\")\n\t(plus:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0,0,r,0,0,0,0\")\n\t\t ;; ADDRESS: an S constraint for the addi case would allow\n\t\t ;; a symbol.\n\t\t (match_operand:SI 2 \"general_operand\" \"rm,I,J,S,i,r,Q,M\")))]\n  \"\"\n;  ;; Make sure that for a MEM + x, x can only be a register or +/-1.\n;  \"!(memory_operand (operands[1], SImode)\n;     && !(register_operand (operands[2], SImode)\n;\t  || (const_int_operand (operands[2], SImode)\n;\t      && (INTVAL (operands[2]) == 1 || INTVAL (operands[2]) == -1))))\"\n  \"@\n   add %0,%2\n   addi %0,%2\n   subi %0,%N2\n   xmovei %0,%2(%1)\n   add %0,[%X2]\n   addm %2,%0\n   aos %@%0\n   sos %@%0\")\n\n(define_insn \"*ADDI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(plus:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t (const_int RIGHT_HALF))\n\t\t (match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"addi %0,(%1)\")\n(define_insn \"*ADDI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(plus:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t  (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t (const_int RIGHT_HALF))\n\t\t (match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"addi %0,%2(%1)\")\n\n(define_insn \"*ADDB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(plus:SI (match_dup 0) (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(plus:SI (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"addb %1,%0\")\n(define_insn \"*ADDB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(plus:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(plus:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"addb %1,%0\")\n\n(define_insn \"*AOS_and_move\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(plus:SI (match_dup 0) (const_int 1)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(plus:SI (match_dup 0) (const_int 1)))]\n  \"\"\n  \"aos %1,%0\")\n\n(define_expand \"adddi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(plus:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t (match_operand:DI 2 \"general_operand\" \"\")))]\n  \"TARGET_KL10up && TARGET_71BIT\"\n  \"\")\n\n(define_insn \"*adddi3\"\n  [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"=r,r,r,r,o,o,o\")\n\t(plus:DI (match_operand:DI 1 \"reg_or_mem_operand\" \"%0,0,0,0,0,0,0\")\n\t\t (match_operand:DI 2 \"general_operand\" \"ro,I,J,i,r,Q,M\")))]\n  \"0 && !TARGET_71BIT\"\n  \"@\n   jfcl 17,.+1\\;add %Z0,%Z2\\;jcry0 [aoja %0,.+1]\\;add %0,%2\n   jfcl 17,.+1\\;addi %Z0,%2\\;jcry0 [aoja %0,.+1]\n   jfcl 17,.+1\\;subi %Z0,%N2\\;jcry0 .+2\\;%_subi %0,1\n   jfcl 17,.+1\\;add %Z0,[%B2]\\;jcry0 [aoja %0,.+1]\\;add %0,[%A2]\n   jfcl 17,.+1\\;addm %Z2,%Z0\\;jcry0 [aos %0\\;jrst .+1]\\;add %2,%0\n   jfcl 17,.+1\\;aos %Z0\\;jcry0 [aos %0\\;jrst .+1]\\;aos %0\n   jfcl 17,.+1\\;sos %Z0\\;jcry0 .+2\\;sos %0\\;sos %0\"\n  [(set_attr \"length\" \"4,3,4,4,4,4,5\")])\n\n(define_insn \"*DADD\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r\")\n\t(plus:DI (match_operand:DI 1 \"register_operand\" \"%0,0\")\n\t\t (match_operand:DI 2 \"general_operand\" \"rm,i\")))]\n  \"TARGET_71BIT && TARGET_KL10up\"\n  \"@\n   dadd %0,%2\n   dadd %0,[%D2]\")\n\n(define_expand \"subsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(minus:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t  (match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  \"if (!register_operand (operands[1], SImode))\n     operands[1] = force_reg (SImode, operands[1]);\")\n\n(define_insn \"*subsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(minus:SI (match_operand:SI 1 \"register_operand\" \"0,r\")\n\t\t  (match_operand:SI 2 \"general_operand\" \"rm,0\")))]\n  \"\"\n  \"@\n   sub %0,%2\n   subm %1,%0\")\n\n(define_insn \"*SUBI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(minus:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t  (and:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (const_int RIGHT_HALF))))]\n  \"\"\n  \"subi %0,(%2)\")\n(define_insn \"*SUBI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(minus:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t  (and:SI (plus:SI\n\t\t\t   (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t   (match_operand:SI 3 \"const_int_operand\" \"I\"))\n\t\t (const_int RIGHT_HALF))))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[3]), 'I')\"\n  \"subi %0,%3(%2)\")\n\n(define_insn \"*SUBB\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(minus:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(minus:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"subb %1,%0\")\n\n(define_insn \"*SOS_and_move\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(plus:SI (match_dup 0) (const_int -1)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(plus:SI (match_dup 0) (const_int -1)))]\n  \"\"\n  \"sos %1,%0\")\n\n(define_expand \"subdi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(minus:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t  (match_operand:DI 2 \"general_operand\" \"\")))]\n  \"TARGET_KL10up && TARGET_71BIT\"\n  \"\")\n\n(define_insn \"*subdi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,o\")\n\t(minus:DI (match_operand:DI 1 \"register_operand\" \"%0,0\")\n\t\t  (match_operand:DI 2 \"reg_or_mem_operand\" \"ro,r\")))]\n  \"0 && !TARGET_71BIT\"\n  \"@\n   jfcl 17,.+1\\;sub %Z0,%Z2\\;jcry0 .+2\\;%_subi %0,1\\;sub %0,%2\n   jfcl 17,.+1\\;subm %Z2,%Z0\\;jcry0 .+2\\;%_sos %0\\;subm %2,%0\"\n  [(set_attr \"length\" \"5,5\")])\n\n(define_insn \"*DSUB\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r\")\n\t(minus:DI (match_operand:DI 1 \"register_operand\" \"0,0\")\n\t\t  (match_operand:DI 2 \"reg_or_mem_operand\" \"rm,i\")))]\n  \"TARGET_71BIT && TARGET_KL10up\"\n  \"@\n   dsub %0,%2\n   dsub %0,[%D2]\")\n\n(define_insn \"mulsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(mult:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0,0,0\")\n\t\t (match_operand:SI 2 \"general_operand\" \"rm,I,i,r\")))]\n  \"\"\n  \"@\n   imul %0,%2\n   imuli %0,%2\n   imul %0,[%2]\n   imulm %2,%0\")\n\n(define_insn \"*IMULI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(mult:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t (const_int RIGHT_HALF))\n\t\t (match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"imuli %0,(%1)\")\n(define_insn \"*IMULI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(mult:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t  (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t (const_int RIGHT_HALF))\n\t\t (match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"imuli %0,%2(%1)\")\n\n(define_insn \"*IMULB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(mult:SI (match_dup 0) (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(mult:SI (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"imulb %1,%0\")\n(define_insn \"*IMULB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(mult:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(mult:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"imulb %1,%0\")\n\n(define_expand \"mulsidi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(mult:DI\n\t (sign_extend:DI (match_operand:SI 1 \"register_operand\" \"\"))\n\t (sign_extend:DI (match_operand:SI 2 \"general_operand\" \"\"))))]\n  \"TARGET_71BIT\"\n  \"\")\n\n(define_insn \"*mulsidi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(mult:DI\n\t (sign_extend:DI (match_operand:SI 1 \"register_operand\" \"%0,0,0\"))\n\t (sign_extend:DI (match_operand:SI 2 \"general_operand\" \"rm,I,i\"))))]\n  \"TARGET_71BIT\"\n  \"@\n   mul %0,%2\n   muli %0,%2\n   mul %0,[%2]\")\n\n(define_insn \"MUL\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(unspec:DI\n\t [(sign_extend:DI (match_operand:SI 1 \"register_operand\" \"%0,0,0\"))\n\t  (sign_extend:DI (match_operand:SI 2 \"general_operand\" \"rm,I,i\"))]\n\t UNSPEC_MUL71))]\n  \"\"\n  \"@\n   mul %0,%2\n   muli %0,%2\n   mul %0,[%2]\")\n\n(define_expand \"smulsi3_highpart\"\n  [(set (match_dup 3)\n\t(truncate:SI\n\t (lshiftrt:DI\n\t  (mult:DI\n\t   (sign_extend:DI (match_operand:SI 1 \"register_operand\" \"%r\"))\n\t   (sign_extend:DI (match_operand:SI 2 \"reg_or_mem_operand\" \"0\")))\n\t  (const_int 35))))\n   (set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t(ashiftrt:SI (match_dup 3) (neg:SI (const_int -1))))]\n  \"0\"\n  \"operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"*smulsi3_highpart\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(truncate:SI\n\t (lshiftrt:DI\n\t  (mult:DI\n\t   (sign_extend:DI (match_operand:SI 1 \"register_operand\" \"%0\"))\n\t   (sign_extend:DI (match_operand:SI 2 \"register_operand\" \"r\")))\n\t  (const_int 36))))]\n  \"0\"\n  \"jfcl .+1\\;mulm %2,%0\\;jov [movsi %0,200000\\;%_%_%_%_%_jrst .+2]\\;ash %0,-1\"\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*smulsi3_highpart_71\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t(truncate:SI\n\t (lshiftrt:DI\n\t  (mult:DI\n\t   (sign_extend:DI (match_operand:SI 1 \"register_operand\" \"%r\"))\n\t   (sign_extend:DI (match_operand:SI 2 \"reg_or_mem_operand\" \"0\")))\n\t  (const_int 35))))]\n  \"0\"\n  \"mulm %1,%0\")\n\n(define_expand \"muldi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(mult:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t (match_operand:DI 2 \"reg_or_mem_operand\" \"\")))]\n  \"0\"\n  \"{\n     rtx temp = gen_reg_rtx (TImode);\n\n     emit_move_insn (gen_rtx_SUBREG (DImode, temp, 0), operands[1]);\n     emit_insn (gen_DMUL (temp, gen_rtx_SUBREG (DImode, temp, 8),\n\t\t\t  operands[2]));\n     emit_insn (gen_ashlsi3 (gen_rtx_SUBREG (SImode, temp, 8),\n\t\t\t     gen_rtx_SUBREG (SImode, temp, 8),\n\t\t\t     GEN_INT (1)));\n     emit_insn (gen_lshrdi3 (gen_rtx_SUBREG (DImode, temp, 4),\n\t\t\t     gen_rtx_SUBREG (DImode, temp, 4),\n\t\t\t     GEN_INT (1)));\n     emit_insn (gen_ashlsi3 (gen_rtx_SUBREG (SImode, temp, 12),\n\t\t\t     gen_rtx_SUBREG (SImode, temp, 12),\n\t\t\t     GEN_INT (1)));\n     emit_insn (gen_lshrdi3 (gen_rtx_SUBREG (DImode, temp, 8),\n\t\t\t     gen_rtx_SUBREG (DImode, temp, 8),\n\t\t\t     GEN_INT (1)));\n     emit_insn (gen_TRNE_TLO (gen_rtx_SUBREG (SImode, temp, 8),\n\t\t\t      gen_rtx_SUBREG (SImode, temp, 8),\n\t\t\t      gen_rtx_SUBREG (SImode, temp, 12)));\n\t\t\t\t\n     DONE;\n   }\")\n\n(define_insn \"TRNE_TLO\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"register_operand\" \"r\")]\n\t\t   UNSPEC_TRNE_TLO))]\n  \"\"\n  \"trne %2,1\\;%_tlo %0,400000\"\n  [(set_attr \"length\" \"2\")])\n\n(define_expand \"mulditi3\"\n  [(set (match_operand:TI 0 \"register_operand\" \"=r,r\")\n\t(mult:TI\n\t (sign_extend:TI (match_operand:DI 1 \"register_operand\" \"%0,0\"))\n\t (sign_extend:TI (match_operand:DI 2 \"general_operand\" \"rm,i\"))))]\n  \"TARGET_71BIT && TARGET_KL10up\"\n  \"\")\n\n(define_insn \"DMUL\"\n  [(set (match_operand:TI 0 \"register_operand\" \"=r,r\")\n\t(mult:TI\n\t (sign_extend:TI (match_operand:DI 1 \"register_operand\" \"%0,0\"))\n\t (sign_extend:TI (match_operand:DI 2 \"general_operand\" \"rm,i\"))))]\n  \"TARGET_71BIT && TARGET_KL10up\"\n  \"@\n   dmul %0,%2\n   dmul %0,[%D2]\")\n\n(define_insn \"IDIV\"\n  [(set (subreg:SI (match_operand:DI 0 \"register_operand\" \"=r,r,r\") 0)\n        (div:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n                (match_operand:SI 2 \"general_operand\" \"rm,I,i\")))\n   (set (subreg:SI (match_dup 0) 4)\n        (mod:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"@\n   idiv %0,%2\n   idivi %0,%2\n   idiv %0,[%2]\")\n\n(define_insn \"IDIVM\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n        (div:SI (match_operand:SI 1 \"register_operand\" \"r\")\n                (match_operand:SI 2 \"reg_or_mem_operand\" \"0\")))]\n  \"\"\n  \"idivm %1,%0\")\n\n;; IDIVI with indexing missing.\n;; IDIVB missing.\n\n(define_expand \"divsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(div:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t(match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  \"if (immediate_operand (operands[2], SImode))\n     {\n       rtx temp = gen_reg_rtx (DImode);\n       rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0);\n\n       emit_move_insn (temp0, operands[1]);\n       emit_insn (gen_IDIV (temp, temp0, operands[2]));\n       emit_move_insn (operands[0], temp0);\n     }\n   else\n     emit_insn (gen_IDIVM (operands[0], operands[1], operands[2]));\n   DONE;\")\n\n(define_expand \"modsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(mod:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t(match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  \"{\n     rtx temp = gen_reg_rtx (DImode);\n     rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0);\n     rtx temp1 = gen_rtx_SUBREG (SImode, temp, 4);\n\n     emit_move_insn (temp0, operands[1]);\n     emit_insn (gen_IDIV (temp, temp0, operands[2]));\n     emit_move_insn (operands[0], temp1);\n     DONE;\n   }\")\n\n;; This is disabled, since it doesn't seem to have any advantages over\n;; the `divsi3' and `modsi3' patterns.\n(define_expand \"_divmodsi4\"\n  [(parallel [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t\t   (div:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n\t\t\t   (match_operand:SI 2 \"general_operand\" \"\")))\n\t      (set (match_operand:SI 3 \"reg_or_mem_operand\" \"\")\n\t\t   (mod:SI (match_dup 1) (match_dup 2)))])]\n  \"0\"\n  \"{\n     rtx temp = gen_reg_rtx (DImode);\n     rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0);\n     rtx temp1 = gen_rtx_SUBREG (SImode, temp, 4);\n\n     emit_move_insn (temp0, operands[1]);\n     emit_insn (gen_IDIV (temp, temp0, operands[2]));\n     emit_move_insn (operands[0], temp0);\n     emit_move_insn (operands[3], temp1);\n     DONE;\n   }\")\n\n(define_insn \"*DIV\"\n  [(set (subreg:SI (match_operand:DI 0 \"register_operand\" \"=r,r,r\") 0)\n        (truncate:SI\n\t (div:DI\n\t  (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t  (sign_extend:DI (match_operand:SI 2 \"general_operand\" \"rm,I,i\")))))\n   (set (subreg:SI (match_dup 0) 4)\n        (truncate:SI (mod:DI (match_dup 1) (sign_extend:DI (match_dup 2)))))]\n  \"TARGET_71BIT\"\n  \"@\n   div %0,%2\n   divi %0,%2\n   div %0,[%D2]\")\n\n(define_insn \"*DIVM\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t(truncate:SI\n\t (div:DI\n\t  (match_operand:DI 1 \"register_operand\" \"r\")\n\t  (sign_extend:DI (match_operand:SI 2 \"memory_operand\" \"0\")))))]\n  \"TARGET_71BIT\"\n  \"divm %1,%0\")\n\n;; DIVB missing.\n\n(define_insn \"DDIV\"\n  [(set (subreg:DI (match_operand:TI 0 \"register_operand\" \"=r,r\") 0)\n        (truncate:DI\n\t (div:TI\n\t  (match_operand:TI 1 \"register_operand\" \"0,0\")\n\t  (sign_extend:TI (match_operand:DI 2 \"general_operand\" \"rm,i\")))))\n   (set (subreg:DI (match_dup 0) 8)\n        (truncate:DI (mod:TI (match_dup 1) (sign_extend:TI (match_dup 2)))))]\n  \"TARGET_71BIT\"\n  \"@\n   ddiv %0,%2\n   ddiv %0,[%D2]\")\n\n(define_expand \"divmoddi4\"\n  [(parallel [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"\")\n\t\t   (div:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t\t   (match_operand:DI 2 \"general_operand\" \"\")))\n\t      (set (match_operand:DI 3 \"register_operand\" \"\")\n\t\t   (mod:DI (match_dup 1) (match_dup 2)))])]\n  \"TARGET_71BIT\"\n  \"{\n     rtx temp = gen_reg_rtx (TImode);\n     emit_move_insn (gen_rtx_SUBREG (SImode, temp, 0),\n\t\t     gen_rtx_SUBREG (SImode, operands[1], 0));\n     emit_insn (gen_ashrsi3 (gen_rtx_SUBREG (SImode, temp, 0),\n\t\t\t     gen_rtx_SUBREG (SImode, temp, 0),\n\t\t\t     GEN_INT (35)));\n     emit_move_insn (gen_rtx_SUBREG (SImode, temp, 4),\n\t\t     gen_rtx_SUBREG (SImode, temp, 0));\n     emit_move_insn (gen_rtx_SUBREG (DImode, temp, 8), operands[1]);\n     emit_insn (gen_DDIV (temp, temp, operands[2]));\n     emit_move_insn (operands[0], gen_rtx_SUBREG (DImode, temp, 0));\n     emit_move_insn (operands[3], gen_rtx_SUBREG (DImode, temp, 8));\n     DONE;\n   }\")\n\n(define_insn \"udivsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(udiv:SI (match_operand:SI 1 \"register_operand\" \"0,0,0,r\")\n\t\t (match_operand:SI 2 \"general_operand\" \"I,i,rm,0\")))]\n  \"TARGET_XKL2\"\n  \"@\n   extend %0,[uidivi %2]\n   extend %0,[uidiv [%2]]\n   extend %0,[uidiv %2]\n   extend %1,[uidivm %0]\")\n\n;; UIDIVI with indexing missing.\n;; UIDIVB missing.\n\n(define_insn \"umodsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r,m\")\n\t(umod:SI (match_operand:SI 1 \"register_operand\" \"0,0,0,r\")\n\t\t (match_operand:SI 2 \"general_operand\" \"I,i,rm,0\")))]\n  \"TARGET_XKL2\"\n  \"@\n   extend %0,[uimodi %2]\n   extend %0,[uimod [%2]]\n   extend %0,[uimod %2]\n   extend %1,[uimodm %0]\")\n\n;; UIMODI with indexing missing.\n;; UIMODB missing.\n\n(define_insn \"negsi2\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m,r,m\")\n\t(neg:SI (match_operand:SI 1 \"general_operand\" \"rm,r,I,0\")))]\n  \"\"\n  \"@\n   movn %0,%1\n   movnm %1,%0\n   movni %0,%N1\n   movns %0\")\n\n(define_insn \"*MOVNI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(neg:SI (and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t(const_int RIGHT_HALF))))]\n  \"\"\n  \"movni %0,(%1)\")\n(define_insn \"*MOVNI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(neg:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t(const_int RIGHT_HALF))))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"movni %0,%2(%1)\")\n\n(define_insn \"*MOVNS\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(neg:SI (match_dup 0)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(neg:SI (match_dup 0)))]\n  \"\"\n  \"movns %1,%0\")\n\n(define_expand \"negdi2\"\n  [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"\")\n\t(neg:DI (match_operand:DI 1 \"reg_or_mem_operand\" \"\")))]\n  \"TARGET_KI10up && TARGET_71BIT\"\n  \"\")\n\n(define_insn \"*negdi2\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r\")\n\t(neg:DI (match_operand:DI 1 \"reg_or_mem_operand\" \"0,ro\")))]\n  \"!TARGET_71BIT\"\n  \"@\n   setca %0,\\;jumpe %Z0,[aoja %0,.+2]\\;%_movn %Z0,%Z0\n   setcm %0,%1\\;movn %Z0,%Z1\\;jumpe %Z0,[aoja %0,.+1]\"\n  [(set_attr \"length\" \"3,3\")])\n\n(define_insn \"*DMOVN\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(neg:DI (match_operand:DI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_71BIT && TARGET_KI10up\"\n  \"dmovn %0,%1\\;tlne %0,400000\\;%_tlo %Z0,400000\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"abssi2\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m,m\")\n\t(abs:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r,0\")))]\n  \"\"\n  \"@\n   movm %0,%1\n   movmm %1,%0\n   movms %0\")\n\n(define_insn \"*MOVMS\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(abs:SI (match_dup 0)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(abs:SI (match_dup 0)))]\n  \"\"\n  \"movms %1,%0\")\n\n(define_insn \"smaxsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r,r,r,x,x,x\")\n        (smax:SI (match_operand:SI 1 \"register_operand\" \"%0,0,0,0,r,r,r,r\")\n\t\t (match_operand:SI 2 \"general_operand\" \"rm,I,M,i,0,O,I,rm\")))]\n  \"\"\n  \"@\n   camge %1,%2\\;%_move %0,%2\n   caige %1,%2\\;%_movei %0,%2\n   camge %1,[%2]\\;%_seto %0,\n   camge %1,[%2]\\;%_move %0,[%2]\n   camle %1,%2\\;%_move %0,%1\n   skipge %0,%1\\;%_movei %0,0\n   caile %1,%2\\;%_skipa %0,%1\\;%_%_movei %0,%2\n   camle %1,%2\\;%_skipa %0,%1\\;%_%_move %0,%2\"\n  [(set_attr \"length\" \"2,2,2,2,2,2,3,3\")])\n\n(define_expand \"umaxsi3\"\n  [(set (match_dup 3)\n\t(xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n                (const_int SIGNBIT)))\n   (set (match_dup 4)\n\t(xor:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"\")\n                (const_int SIGNBIT)))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n\t(if_then_else:SI\n\t (ge (match_dup 3) (match_dup 4))\n\t (match_dup 1)\n\t (match_dup 2)))]\n  \"\"\n  \"operands[3] = gen_reg_rtx (SImode);\n   operands[4] = gen_reg_rtx (SImode);\")\n\n(define_insn \"*umaxsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,x\")\n\t(if_then_else:SI\n\t (ge (match_operand:SI 3 \"register_operand\" \"r,r,r\")\n\t     (match_operand:SI 4 \"reg_or_mem_operand\" \"rm,rm,rm\"))\n\t (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,rm\")\n\t (match_operand:SI 2 \"reg_or_mem_operand\" \"rm,0,rm\")))]\n  \"\"\n  \"@\n   camge %3,%4\\;%_move %0,%2\n   camle %3,%4\\;%_move %0,%1\n   camle %3,%4\\;%_skipa %0,%1\\;%_%_move %0,%2\"\n  [(set_attr \"length\" \"2,2,3\")])\n\n(define_insn \"sminsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r,r,r,x,x,x\")\n        (smin:SI (match_operand:SI 1 \"register_operand\" \"%0,0,0,0,r,r,r,r\")\n\t\t (match_operand:SI 2 \"general_operand\" \"rm,I,M,i,0,O,I,rm\")))]\n  \"\"\n  \"@\n   camle %1,%2\\;%_move %0,%2\n   caile %1,%2\\;%_movei %0,%2\n   camle %1,[%2]\\;%_seto %0,\n   camle %1,[%2]\\;%_move %0,[%2]\n   camge %1,%2\\;%_move %0,%1\n   skiple %0,%1\\;%_movei %0,0\n   caige %1,%2\\;%_skipa %0,%1\\;%_%_movei %0,%2\n   camge %1,%2\\;%_skipa %0,%1\\;%_%_move %0,%2\"\n  [(set_attr \"length\" \"2,2,2,2,2,2,3,3\")])\n\n(define_expand \"uminsi3\"\n  [(set (match_dup 3)\n\t(xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n                (const_int SIGNBIT)))\n   (set (match_dup 4)\n\t(xor:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"\")\n                (const_int SIGNBIT)))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n\t(if_then_else:SI\n\t (le (match_dup 3) (match_dup 4))\n\t (match_dup 1)\n\t (match_dup 2)))]\n  \"\"\n  \"operands[3] = gen_reg_rtx (SImode);\n   operands[4] = gen_reg_rtx (SImode);\")\n\n(define_insn \"*uminsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,x\")\n\t(if_then_else:SI\n\t (le (match_operand:SI 3 \"register_operand\" \"r,r,r\")\n\t     (match_operand:SI 4 \"reg_or_mem_operand\" \"rm,rm,rm\"))\n\t (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,rm\")\n\t (match_operand:SI 2 \"reg_or_mem_operand\" \"rm,0,rm\")))]\n  \"\"\n  \"@\n   camle %3,%4\\;%_move %0,%2\n   camge %3,%4\\;%_move %0,%1\n   camge %3,%4\\;%_skipa %0,%1\\;%_%_move %0,%2\"\n  [(set_attr \"length\" \"2,2,3\")])\n\n;; The JFFO instruction searches from the most significant bit while\n;; FFS searches from the least significant bit.  The bit index and\n;; treatment of zero also differ.\n(define_expand \"ffssi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ffs:SI (match_operand:SI 1 \"register_operand\" \"\")))]\n  \"TARGET_KA10up\"\n  \"if (!TARGET_XKL2)\n     {\n       rtx t1 = gen_reg_rtx (SImode);\n       rtx t2 = gen_reg_rtx (SImode);\n       rtx t3 = gen_reg_rtx (DImode);\n       rtx t4 = gen_reg_rtx (SImode);\n       rtx label = gen_label_rtx ();\n       extern int pdp10_expand_ffs;\n\n       pdp10_expand_ffs++;\n\n       emit_insn (gen_negsi2 (t1, operands[1]));\n       emit_insn (gen_andsi3 (t2, operands[1], t1));\n       emit_move_insn (gen_rtx_SUBREG (SImode, t3, 0), t2);\n       emit_jump_insn (gen_JFFO (t3, gen_rtx_LABEL_REF (Pmode, label)));\n       emit_move_insn (gen_rtx_SUBREG (SImode, t3, 4),\n\t\t       GEN_INT (36));\n       emit_label (label);\n       emit_insn (gen_subsi3 (t4,\n\t\t\t      gen_rtx_SUBREG (SImode, t3, 4),\n\t\t\t      GEN_INT (36)));\n       emit_insn (gen_negsi2 (operands[0], t4));\n       DONE;\n     }\")\n\n(define_insn \"*FFS\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ffs:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2\"\n  \"ffs %0,%1\")\n\n; (define_expand \"popcountsi\"\n;   Sequence taken from HAKMEM.\n;   LDB B,[014300,,A]      ;or MOVE B,A then LSH B,-1\n;   AND B,[333333,,333333]\n;   SUB A,B\n;   LSH B,-1\n;   AND B,[333333,,333333]\n;   SUBB A,B               ;each octal digit is replaced by number of 1's in it\n;   LSH B,-3\n;   ADD A,B\n;   AND A,[070707,,070707]\n;   IDIVI A,77             ;casting out 63.'s\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Integer Conversions\n\n; (define_insn \"zero_extendqisi2\"\n;   [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n;         (zero_extend:SI (match_operand:QI 1 \"register_operand\" \"r\")))]\n;   \"\"\n;   \"\"\n;   [(set_attr \"length\" \"0\")])\n(define_insn \"zero_extendqisi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI (match_operand:QI 1 \"register_operand\" \"0\")))]\n  \"\"\n  {\n    if (zero_extended_p (operands[0], 27, insn))\n      return \"\";\n    else\n      return \"andi %0,777%; zero_extendqisi2\";\n  })\n\n(define_insn \"zero_extendhisi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI (match_operand:HI 1 \"register_operand\" \"r\")))]\n  \"\"\n  {\n    if (REGNO (operands[0]) == REGNO (operands[1])\n\t&& zero_extended_p (operands[0], 18, insn))\n      return \"\";\n    else\n      return \"hrrz %0,%1%; zero_extendhisi2\";\n  })\n\n(define_insn \"zero_extendsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_ZERO_EXTEND))]\n  \"\"\n  {\n    int extend_bits = INTVAL (operands[2]);\n    int bitsize = BITS_PER_WORD - extend_bits;\n    if (zero_extended_p (operands[0], extend_bits, insn))\n      return \"\";\n    else if (extend_bits > 18)\n      {\n        operands[2] = GEN_INT ((1 << bitsize) - 1);\n        return \"andi %0,%2\";\n      }\n    else if (extend_bits == 18)\n      return \"hrrz %0,%0\";\n    else\n      {\n        operands[2] = GEN_INT (((1 << extend_bits) - 1) << (18 - extend_bits));\n        return \"tlz %0,%2\";\n      }\n  })\n\n(define_insn \"*extendqisi2_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (sign_extend:SI\n\t (subreg:QI (match_operand:SI 1 \"register_operand\" \"r\") 0)))]\n  \"\"\n  {\n    if (REGNO (operands[0]) == REGNO (operands[1]))\n      return \"\";\n    else\n      return \"move %0,%1%; extendqisi2_reg\";\n  })\n\n(define_expand \"extendqisi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(sign_extend:SI (match_operand:QI 1 \"register_operand\" \"\")))]\n  \"\"\n  \"\")\n;   \"if (!TARGET_XKL2)\n;      {\n;        rtx op1 = operands[1];\n;        if (GET_CODE (op1) == SUBREG && SUBREG_BYTE (op1) == 3)\n; \top1 = SUBREG_REG (op1);\n;        emit_insn (gen_ashlsi3 (operands[0],\n; \t\t\t       gen_rtx_SUBREG (SImode, op1, 0),\n; \t\t\t       GEN_INT (27)));\n;        emit_insn (gen_ASH_right (operands[0], operands[0], GEN_INT (-27)));\n;        DONE;\n;      }\")\n\n\n(define_insn \"*extendqisi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extend:SI (match_operand:QI 1 \"register_operand\" \"0\")))]\n  \"!TARGET_XKL2\"\n  {\n    if (sign_extended_p (operands[0], 27, insn))\n      return \"\";\n    else if (zero_extended_p (operands[0], 27, insn))\n      return \"trne %0,400\\;%_orcmi %0,777\";\n    else\n      return \"lsh %0,33\\;ash %0,-33\";\n  }\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*extendqisi2_xkl2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extend:SI (match_operand:QI 1 \"register_operand\" \"0\")))]\n  \"TARGET_XKL2\"\n  \"extend %0,[sext 9]\")\n\n(define_insn \"extendhisi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extend:SI (match_operand:HI 1 \"register_operand\" \"r\")))]\n  \"\"\n  {\n    if (sign_extended_p (operands[1], 18, insn)\n\t&& REGNO (operands[0]) == REGNO (operands[1]))\n      return \"\";\n    else\n      return \"hrre %0,%1%; extendhisi2\";\n  })\n\n(define_insn \"sign_extendsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_SIGN_EXTEND))]\n  \"\"\n  {\n    int extend_bits = INTVAL (operands[2]);\n    if (sign_extended_p (operands[0], extend_bits, insn))\n      return \"\";\n    else if (zero_extended_p (operands[0], extend_bits, insn))\n      {\n        int bitsize = BITS_PER_WORD - extend_bits;\n        operands[1] = GEN_INT ((HOST_WIDE_INT)1 << (bitsize - 1));\n        operands[2] = GEN_INT (((HOST_WIDE_INT)1 << bitsize) - 1);\n        return \"trne %0,%1\\;%_orcmi %0,%2\";\n      }\n    else\n      return \"lsh %0,%2\\;ash %0,-%2\";\n  })\n\n(define_insn \"truncsiqi2\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(truncate:QI (match_operand:SI 1 \"register_operand\" \"0\")))]\n  \"\"\n  \"andi %0,777%; truncsiqi2\")\n\n(define_insn \"truncsihi2\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n\t(truncate:HI (match_operand:SI 1 \"register_operand\" \"r\")))]\n  \"\"\n  \"hrr %0,%1%; truncsihi2\")\n\n(define_insn \"truncsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand 2 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_TRUNCATE))]\n  \"\"\n  {\n    int bits = BITS_PER_WORD - INTVAL (operands[2]);\n    if (bits < 18)\n      {\n\toperands[2] = GEN_INT (((HOST_WIDE_INT)1 << bits) - 1);\n\treturn \"andi %0,%2%; truncsi\";\n      }\n    else\n      {\n\toperands[2] = GEN_INT ((0777777 << (bits - 18)) & 0777777);\n\treturn \"tlz %0,%2%; truncsi\";\n      }\n  })\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Shifting and Rotating\n\n(define_insn \"real_ashlsi3\"\n [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n       (unspec:SI\n\t[(match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t (match_operand:SI 2 \"general_operand\" \"x,K,m\")]\n\tUNSPEC_REAL_ASHIFT))]\n \"\"\n \"@\n  ash %0,(%2)\n  ash %0,%2\n  ash %0,@%2\")\n\n(define_insn \"*ASH_left_plus\"\n [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n       (unspec:SI\n\t[(match_operand:SI 1 \"register_operand\" \"0\")\n\t (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\"))]\n\tUNSPEC_REAL_ASHIFT))]\n \"\"\n \"ash %0,%3(%2)\")\n\n(define_expand \"lshrsi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n\t(lshiftrt:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"\"\n  \"if (GET_CODE (operands[2]) == CONST_INT)\n     {\n       emit_insn (gen_LSH_right (operands[0], operands[1],\n\t\t\t\t GEN_INT (-INTVAL (operands[2]))));\n       DONE;\n     }\n   else\n     operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"LSH_right\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n\t(lshiftrt:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"\"\n  \"@\n   lsh %0,(%2)\n   lsh %0,%2\n   lsh %0,@%2\")\n\n(define_insn \"*LSH_right_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(lshiftrt:SI\n\t (match_operand:SI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"const_int_operand\" \"K\")))))]\n  \"\"\n  \"lsh %0,%3(%2)\")\n\n(define_insn \"real_ashldi3\"\n [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n       (unspec:DI\n\t[(match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t (match_operand:SI 2 \"general_operand\" \"x,K,m\")]\n\tUNSPEC_REAL_ASHIFT))]\n \"TARGET_71BIT\"\n \"@\n  ashc %0,(%2)\n  ashc %0,%2\n  ashc %0,@%2\")\n\n(define_insn \"*ASHC\"\n [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n       (unspec:DI\n\t[(match_operand:DI 1 \"register_operand\" \"0\")\n\t (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\"))]\n\tUNSPEC_REAL_ASHIFT))]\n \"TARGET_71BIT\"\n \"ashc %0,%3(%2)\")\n\n(define_expand \"lshrdi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:DI 0 \"register_operand\" \"\")\n\t(lshiftrt:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"\"\n  \"if (GET_CODE (operands[2]) == CONST_INT)\n     {\n       if (TARGET_71BIT)\n\t emit_insn (gen_LSHC_right_71 (operands[0], operands[1],\n\t\t\t\t       GEN_INT (-INTVAL (operands[2]))));\n       else\n\t emit_insn (gen_LSHC_right (operands[0], operands[1],\n\t\t\t\t    GEN_INT (-INTVAL (operands[2]))));\n       DONE;\n     }\n   else\n     operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"LSHC_right_71\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(lshiftrt:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"TARGET_71BIT\"\n  {\n    const char *asms[] =\n    {\n      \"lsh %Z0,1\\;lshc %0,(%2)\\;lsh %Z0,-1\",\n      \"lsh %Z0,1\\;lshc %0,%2\\;lsh %Z0,-1\",\n      \"lsh %Z0,1\\;lshc %0,@%2\\;lsh %Z0,-1\"\n    };\n    int n;\n\n    if (get_attr_length (insn) == 1)\n      {\n        operands[2] = GEN_INT (INTVAL (operands[2]) - 1);\n\treturn \"lshc %0,%2\";\n      }\n    /*else if (GET_CODE (operands[2]) == CONST_INT\n\t     && INTVAL (operands[2]) == -1)\n      return \"ashc %0,-1\\;tlze %0,400000\\;tlz %Z0,400000\";*/\n    else if (GET_CODE (operands[2]) == CONST_INT\n\t     && (n = INTVAL (operands[2])) >= -18)\n      {\n        int mask = (0777777 << (18 + n)) & 0777777;\n\tstatic char insn[100];\n\n\tsnprintf (insn, sizeof insn,\n\t\t  \"ashc %%0,%%2\\;tlze %%0,%o\\;tlz %%Z0,400000\",\n\t\t  mask);\n\treturn insn;\n      }\n    else\n      return asms[which_alternative];\n  }\n  [(set (attr \"length\")\n\t(if_then_else (and (match_operand 2 \"const_int_operand\" \"\")\n\t\t\t   (ge (symbol_ref \"-INTVAL (operands[2])\")\n\t\t\t       (const_int 35)))\n\t\t      (const_int 1)\n\t\t      (const_int 3)))])\n\n(define_insn \"LSHC_right\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(lshiftrt:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"!TARGET_71BIT\"\n  \"@\n   lshc %0,(%2)\n   lshc %0,%2\n   lshc %0,@%2\")\n\n(define_insn \"*LSHC_right_plus_71\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(lshiftrt:DI\n\t (match_operand:DI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"TARGET_71BIT\"\n  \"lsh %Z0,1\\;lshc %0,%3(%2)\\;lsh %Z0,-1\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*LSHC_right_plus\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(lshiftrt:DI\n\t (match_operand:DI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"!TARGET_71BIT\"\n  \"lshc %0,%3(%2)\")\n\n(define_insn \"ashlsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n\t(ashift:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"x,K,m\")))]\n  \"\"\n  \"@\n   lsh %0,(%2)\n   lsh %0,%2\n   lsh %0,@%2\")\n\n(define_insn \"*LSH_left_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ashift:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t   (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t    (match_operand:SI 3 \"immediate_operand\" \"K\"))))]\n  \"\"\n  \"lsh %0,%3(%2)\")\n\n(define_expand \"ashrsi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ashiftrt:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"\"\n  \"if (GET_CODE (operands[2]) == CONST_INT)\n     {\n       emit_insn (gen_ASH_right (operands[0], operands[1],\n\t\t\t\t GEN_INT (-INTVAL (operands[2]))));\n       DONE;\n     }\n   else\n     operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"ASH_right\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n\t(ashiftrt:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"\"\n  \"@\n   ash %0,(%2)\n   ash %0,%2\n   ash %0,@%2\")\n\n(define_insn \"*ASH_right_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:SI\n\t (match_operand:SI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"\"\n  \"ash %0,%3(%2)\")\n\n(define_expand \"ashldi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(ashift:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  \"\")\n\n(define_insn \"*ashldi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(ashift:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"x,K,m\")))]\n  \"!TARGET_71BIT\"\n  \"@\n   lshc %0,(%2)\n   lshc %0,%2\n   lshc %0,@%2\")\n\n(define_insn \"LSHC_left\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(unspec:DI [(match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t    (match_operand:SI 2 \"general_operand\" \"x,K,m\")]\n\t\t   UNSPEC_LSHC))]\n  \"TARGET_71BIT\"\n  \"@\n   lshc %0,(%2)\n   lshc %0,%2\n   lshc %0,@%2\")\n\n(define_insn \"*ashldi3_71bit\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(ashift:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"x,K,m\")))]\n  \"TARGET_71BIT\"\n  {\n    const char *asms[] =\n    {\n      \"lsh %Z0,1\\;lshc %0,(%2)\\;lsh %Z0,-1\",\n      \"lsh %Z0,1\\;lshc %0,%2\\;lsh %Z0,-1\",\n      \"lsh %Z0,1\\;lshc %0,@%2\\;lsh %Z0,-1\"\n    };\n\n    switch (get_attr_length (insn))\n      {\n      case 3:\n        operands[2] = GEN_INT (INTVAL (operands[2]) + 1);\n\toutput_asm_insn (\"lshc %0,%2\", operands);\n\tbreak;\n      case 4:\n        {\n\t  static char insn[100];\n\t  int n = INTVAL (operands[2]);\n\t  snprintf (insn, sizeof insn,\n\t\t    n < 18 ? \"tlne %%0,%o\" : \"trne %%0,%o\",\n\t\t    0400000 >> (n < 18 ? n: n - 18));\n\t  output_asm_insn (insn, operands);\n          return \"%_tloa %0,400000\\;%_%_tlz %0,400000\\;ashc %0,%2\";\n\t}\n      case 5:\n        output_asm_insn (asms[which_alternative], operands);\n\tbreak;\n      default:\n        abort ();\n      }\n\n    return \"tlne %0,400000\\;%_tlo %Z0,400000\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else (match_operand 2 \"const_int_operand\" \"\")\n\t\t      (if_then_else\n\t\t       (ge (symbol_ref \"INTVAL (operands[2])\") (const_int 36))\n\t\t       (const_int 3)\n\t\t       (const_int 4))\n\t\t      (const_int 5)))])\n\n(define_insn \"*LSHC_left_plus\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(ashift:DI (match_operand:DI 1 \"register_operand\" \"0\")\n\t\t   (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t    (match_operand:SI 3 \"immediate_operand\" \"K\"))))]\n  \"!TARGET_71BIT\"\n  \"lshc %0,%3(%2)\")\n\n(define_insn \"*LSHC_left_plus_71bit\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(ashift:DI (match_operand:DI 1 \"register_operand\" \"0\")\n\t\t   (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t    (match_operand:SI 3 \"immediate_operand\" \"K\"))))]\n  \"TARGET_71BIT\"\n  \"lsh %Z0,1\\;lshc %0,%3(%2)\\;lsh %Z0,-1\\;tlne %0,400000\\;%_tlo %Z0,400000\"\n  [(set_attr \"length\" \"5\")])\n\n(define_expand \"ashrdi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:DI 0 \"register_operand\" \"\")\n\t(ashiftrt:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"\"\n  \"if (!TARGET_71BIT)\n     {\n       HOST_WIDE_INT mask;\n       /*rtx op0hi = gen_rtx_SUBREG (SImode, operands[0], 0);\n       rtx op0lo = gen_rtx_SUBREG (SImode, operands[0], 4);*/\n       rtx temp = gen_reg_rtx (SImode);\n       rtx label;\n\t\n\n       if (GET_CODE (operands[2]) == CONST_INT)\n\t {\n\t   int n = INTVAL (operands[2]);\n\t   if (n <= 35)\n\t     {\n\t       label = gen_label_rtx ();\n\t       mask = (HOST_WIDE_INT)1 << (35 - n);\n\t       emit_insn (gen_lshrdi3 (operands[0], operands[1], operands[2]));\n\t       emit_jump_insn (gen_test_and_skip (gen_rtx_EQ (VOIDmode,\n\t\t\t\t\t\t\t      NULL_RTX,\n\t\t\t\t\t\t\t      NULL_RTX),\n\t\t\t\t\t\t  gen_rtx_SUBREG (SImode,\n\t\t\t\t\t\t\t\t  operands[0],\n\t\t\t\t\t\t\t\t  0),\n\t\t\t\t\t\t  gen_int_mode (mask, SImode),\n\t\t\t\t\t\t  label));\n\t       mask = ~(mask - 1);\n\t       if (n != 17 && n != 35)\n\t\t mask <<= 1;\n\t       emit_insn (gen_iorsi3 (gen_rtx_SUBREG (SImode, operands[0], 0),\n\t\t\t\t      gen_rtx_SUBREG (SImode, operands[0], 0),\n\t\t\t\t      gen_int_mode (mask, SImode)));\n\t       emit_label (label);\n\t     }\n\t   else if (n == 36)\n\t     /*{\n\t       emit_insn (gen_ashrsi3 (gen_rtx_SUBREG (SImode, operands[0], 0),\n\t\t\t\t       gen_rtx_SUBREG (SImode, operands[1], 0),\n\t\t\t\t       GEN_INT (35)));\n\t       emit_move_insn (gen_rtx_SUBREG (SImode, operands[0], 4),\n\t\t\t       gen_rtx_SUBREG (SImode, operands[1], 0));\n\t     }*/\n\t     /*{\n\t       emit_move_insn (gen_rtx_SUBREG (SImode, operands[0], 4),\n\t\t\t       gen_rtx_SUBREG (SImode, operands[1], 0));\n\t       emit_insn (gen_ashrsi3 (gen_rtx_SUBREG (SImode, operands[0], 0),\n\t\t\t\t       gen_rtx_SUBREG (SImode, operands[1], 0),\n\t\t\t\t       GEN_INT (35)));\n\t     }*/\n\t     emit_insn (gen_ashrdi3_36 (operands[0], operands[1]));\n\t   else if (n >= 71 && !optimize_size)\n\t     emit_insn (gen_sign_extension_di (operands[0], operands[1]));\n\t   else\n\t     emit_insn (gen_ASHC (operands[0], operands[1], GEN_INT (1 - n)));\n\t   DONE;\n\t }\n\t \n       /* Sequence adapted from Hacker's Delight, section 2-6.  */\n       emit_insn (gen_ashrsi3 (temp, gen_rtx_SUBREG (SImode, operands[1], 0),\n\t\t\t       GEN_INT (35)));\n       /*emit_move_insn (operands[0], operands[1]);\n       emit_insn (gen_xorsi3 (op0hi, op0hi, temp));\n       emit_insn (gen_xorsi3 (op0lo, op0lo, temp));*/\n       emit_insn (gen_xordisi3 (operands[0], operands[1], temp));\n       emit_insn (gen_lshrdi3 (operands[0], operands[0], operands[2]));\n       /*emit_insn (gen_xorsi3 (op0hi, op0hi, temp));\n       emit_insn (gen_xorsi3 (op0lo, op0lo, temp));*/\n       emit_insn (gen_xordisi3 (operands[0], operands[0], temp));\n\n       DONE;\n     }\n   else if (GET_CODE (operands[2]) == CONST_INT)\n     {\n       emit_insn (gen_ASHC_right (operands[0], operands[1],\n\t\t\t\t  GEN_INT (-INTVAL (operands[2]))));\n       DONE;\n     }\n   else\n     operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"ashrdi3_36\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:DI (match_operand:DI 1 \"register_operand\" \"0\")\n\t\t     (const_int 36)))]\n  \"!TARGET_71BIT\"\n  \"@\n   move %Z0,%0\\;ash %0,-43\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"sign_extension_di\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r\")\n\t(ashiftrt:DI (match_operand:DI 1 \"register_operand\" \"0,r\")\n\t\t     (const_int 71)))]\n  \"!TARGET_71BIT\"\n  {\n    if (which_alternative == 0)\n      return \"ash %0,-43\\;move %Z0,%0\";\n    else if (REGNO (operands[0]) + 1 == REGNO (operands[1]))\n      return \"ash %Z0,-43\\;move %0,%Z0\";\n    else\n      return \"move %0,%1\\;ash %0,-43\\;move %Z0,%0\";\n  }\n  [(set_attr \"length\" \"2,3\")])\n\n(define_insn \"ASHC_right\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(ashiftrt:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"TARGET_71BIT\"\n  \"@\n   ashc %0,(%2)\n   ashc %0,%2\n   ashc %0,@%2\")\n\n(define_insn \"ASHC\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(unspec:DI [(match_operand:DI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"const_int_operand\" \"K\")]\n\t\t   UNSPEC_ASHC))]\n  \"!TARGET_71BIT\"\n  \"ashc %0,%2\")\n\n(define_insn \"*ASHC_right_plus\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:DI\n\t (match_operand:DI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"TARGET_71BIT\"\n  \"ashc %0,%3(%2)\")\n\n(define_insn \"rotlsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n\t(rotate:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"x,K,m\")))]\n  \"\"\n  \"@\n   rot %0,(%2)\n   rot %0,%Y2\n   rot %0,@%2\")\n\n(define_insn \"*ROT_left_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(rotate:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t   (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t    (match_operand:SI 3 \"immediate_operand\" \"K\"))))]\n  \"\"\n  \"rot %0,%Y3(%2)\")\n\n(define_expand \"rotrsi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n\t(rotatert:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"\"\n  \"operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"*ROT_right\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n\t(rotatert:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"\"\n  \"@\n   rot %0,(%2)\n   rot %0,%Y2\n   rot %0,@%2\")\n\n(define_insn \"*ROT_right_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(rotatert:SI\n\t (match_operand:SI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"\"\n  \"rot %0,%Y3(%2)\")\n\n(define_insn \"rotldi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(rotate:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"x,K,m\")))]\n  \"!TARGET_71BIT\"\n  \"@\n   rotc %0,(%2)\n   rotc %0,%V2\n   rotc %0,@%2\")\n\n(define_insn \"*ROTC_left_plus\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(rotate:DI (match_operand:DI 1 \"register_operand\" \"0\")\n\t\t   (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t    (match_operand:SI 3 \"immediate_operand\" \"K\"))))]\n  \"!TARGET_71BIT\"\n  \"rotc %0,%V3(%2)\")\n\n(define_expand \"rotrdi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:DI 0 \"register_operand\" \"\")\n\t(rotatert:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"!TARGET_71BIT\"\n  \"operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"*ROTC_right\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(rotatert:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"!TARGET_71BIT\"\n  \"@\n   rotc %0,(%2)\n   rotc %0,%V2\n   rotc %0,@%2\")\n\n(define_insn \"*ROTC_right_plus\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(rotatert:DI\n\t (match_operand:DI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"!TARGET_71BIT\"\n  \"rotc %0,%V3(%2)\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Logical Operations\n\n;; SETZ -- in Data Movement\n\n;; AND -- andsi3\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (subreg:SI (match_operand:QI 1 \"memory_operand\" \"m\") 0)\n\t\t(const_int 63)))]\n  \"\"\n  \"*return pdp10_output_extzv_foo (insn, operands);\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t(match_operand:SI 2 \"const_int_operand\" \"i\")))]\n  \"TARGET_LARGE && CONSTANT_ADDRESS_P (XEXP (operands[1], 0))\n   && (INTVAL (operands[2]) == 077 || INTVAL (operands[2]) == 0777)\"\n  {\n    rtx ops[4];\n    int bitsize = exact_log2 (INTVAL (operands[2]) + 1);\n    ops[0] = operands[0];\n    ops[1] = operands[1];\n    ops[2] = GEN_INT (bitsize);\n    ops[3] = GEN_INT (BITS_PER_WORD - bitsize);\n    output_asm_insn (pdp10_output_extzv (insn, ops), ops);\n    return \"\";\n  })\n\n(define_expand \"andsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n        (and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n                (match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  \"\")\n\n(define_insn \"*andsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,m\")\n        (and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0,0,0,0,0\")\n                (match_operand:SI 2 \"general_operand\" \"rm,I,N,P,i,r\")))]\n  \"\"\n  \"@\n   and %0,%2\n   andi %0,%2\n   tlz %0,%T2\n   andcmi %0,%C2\n   and %0,[%2]\n   andm %2,%0\")\n\n(define_insn \"*ANDI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"andi %0,(%1)\")\n(define_insn \"*ANDI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"andi %0,%2(%1)\")\n(define_insn \"*TLZ_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (not:SI (ashift:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t   (const_int 18)))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"tlz %0,(%1)\")\n(define_insn \"*TLZ_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (not:SI (plus:SI (mult:SI\n\t\t\t\t  (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t  (const_int 262144))\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"L\")))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'L')\"\n  \"tlz %0,%S2(%1)\")\n\n(define_insn \"*ANDB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (match_dup 0) (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"andb %1,%0\")\n(define_insn \"*ANDB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"andb %1,%0\")\n\n;; ANDCA, ANDCM\n\n(define_insn \"ANDCx\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,m,m\")\n        (and:SI\n\t (not:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,0,0,r,0\"))\n\t (match_operand:SI 2 \"general_operand\" \"rm,0,I,P,0,r\")))]\n  \"\"\n  \"@\n   andca %0,%2\n   andcm %0,%1\n   andcai %0,%2\n   andcbi %0,%C2\n   andcam %1,%0\n   andcmm %2,%0\")\n\n(define_insn \"*ANDCMI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (ior:SI (not:SI (match_operand:SI 1 \"register_operand\" \"x\"))\n\t\t\t(const_int LEFT_HALF))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"andcmi %0,(%1)\")\n(define_insn \"*ANDCMI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (ior:SI (not:SI\n\t\t\t (plus:SI\n\t\t\t  (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 2 \"const_int_operand\" \"I\")))\n\t\t\t(const_int LEFT_HALF))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"andcmi %0,%2(%1)\")\n\n(define_insn \"*ANDCAB\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (not:SI (match_operand:SI 1 \"register_operand\" \"r\"))\n\t\t(match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (not:SI (match_dup 1)) (match_dup 0)))]\n  \"\"\n  \"andcab %1,%0\")\n\n(define_insn \"*ANDCMB\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (not:SI (match_dup 0))\n\t\t(match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (not:SI (match_dup 0)) (match_dup 1)))]\n  \"\"\n  \"andcmb %1,%0\")\n; (define_insn \"*ANDCMB\"\n;   [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n; \t(and:SI (not:SI (match_operand:SI 1 \"memory_operand\" \"+m\"))\n; \t\t(match_operand:SI 2 \"register_operand\" \"0\")))\n;    (set (match_dup 1)\n; \t(and:SI (not:SI (match_dup 1)) (match_dup 2)))]\n;   \"\"\n;   \"andcmb %0,%1\")\n\n;; SETM -- not useful\n\n;; SETA -- not useful\n\n;; XOR -- xorsi3\n\n(define_insn \"xorsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,m\")\n        (xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0,0,0,0,0\")\n                (match_operand:SI 2 \"general_operand\" \"rm,I,L,P,i,r\")))]\n  \"\"\n  \"@\n   xor %0,%2\n   xori %0,%2\n   tlc %0,%S2\n   eqvi %0,%C2\n   xor %0,[%2]\n   xorm %2,%0\")\n\n(define_insn \"*XORI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (xor:SI (and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"xori %0,(%1)\")\n(define_insn \"*XORI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (xor:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"xori %0,%2(%1)\")\n(define_insn \"*TLC_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (xor:SI (ashift:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t   (const_int 18))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"tlc %0,(%1)\")\n(define_insn \"*TLC_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(xor:SI (plus:SI (mult:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t  (const_int 262144))\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"L\"))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'L')\"\n  \"tlc %0,%S2(%1)\")\n\n(define_insn \"*XORB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(xor:SI (match_dup 0) (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(xor:SI (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"xorb %1,%0\")\n(define_insn \"*XORB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(xor:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(xor:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"xorb %1,%0\")\n\n(define_insn \"xordisi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n        (xor:DI (match_operand:DI 1 \"register_operand\" \"%0\")\n                (plus:DI\n\t\t (ashift:DI\n\t\t  (zero_extend:DI (match_operand:SI 2 \"register_operand\" \"r\"))\n\t\t  (const_int 36))\n\t\t (zero_extend:DI (match_dup 2)))))]\n  \"\"\n  \"xor %0,%2\\;xor %Z0,%2\")\n\n;; IOR -- iorsi3\n\n(define_insn \"iorsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,m\")\n        (ior:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0,0,0,0,0\")\n                (match_operand:SI 2 \"general_operand\" \"rm,I,L,P,i,r\")))]\n  \"\"\n  \"@\n   ior %0,%2\n   iori %0,%2\n   tlo %0,%S2\n   orcmi %0,%C2\n   ior %0,[%2]\n   iorm %2,%0\")\n\n(define_insn \"*IORI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"iori %0,(%1)\")\n(define_insn \"*IORI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"iori %0,%2(%1)\")\n(define_insn \"*TLO_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (ashift:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t   (const_int 18))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"tlo %0,(%1)\")\n(define_insn \"*TLO_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (plus:SI (mult:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t  (const_int 262144))\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"L\"))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'L')\"\n  \"tlo %0,%S2(%1)\")\n\n(define_insn \"*IORB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (match_dup 0) (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"iorb %1,%0\")\n(define_insn \"*IORB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"iorb %1,%0\")\n\n;; ANDCB\n\n(define_insn \"*ANCDB\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n        (and:SI (not:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0\"))\n                (not:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"rm,r\"))))]\n  \"\"\n  \"@\n   andcb %0,%2\n   andcbm %2,%0\")\n\n(define_insn \"*ANDCBI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (not:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t(const_int RIGHT_HALF)))\n\t\t(not:SI (match_operand:SI 2 \"register_operand\" \"0\"))))]\n  \"\"\n  \"andcbi %0,(%1)\")\n(define_insn \"*ANDCBI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (not:SI (and:SI\n\t\t\t (plus:SI\n\t\t\t  (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"const_int_operand\" \"I\"))\n\t\t\t (const_int RIGHT_HALF)))\n\t\t(not:SI (match_operand:SI 1 \"register_operand\" \"0\"))))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[3]), 'I')\"\n  \"andcbi %0,%3(%2)\")\n\n(define_insn \"*ANDCBB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (not:SI (match_dup 0))\n\t\t(not:SI (match_operand:SI 1 \"register_operand\" \"r\"))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (not:SI (match_dup 0)) (not:SI (match_dup 1))))]\n  \"\"\n  \"andcbb %1,%0\")\n(define_insn \"*ANDCBB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (not:SI (match_operand:SI 1 \"register_operand\" \"r\"))\n\t\t(not:SI (match_dup 0))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (not:SI (match_dup 1)) (not:SI (match_dup 0))))]\n  \"\"\n  \"andcbb %1,%0\")\n\n(define_insn \"*ANDCBB\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (not:SI (match_operand:SI 1 \"register_operand\" \"%0\"))\n\t\t(not:SI (match_operand:SI 2 \"memory_operand\" \"+m\"))))\n   (set (match_dup 2)\n\t(and:SI (not:SI (match_dup 1)) (not:SI (match_dup 2))))]\n  \"\"\n  \"andcbb %0,%2\")\n\n;; EQV\n\n(define_insn \"*EQV\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(not:SI (xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0\")\n\t\t\t(match_operand:SI 2 \"reg_or_mem_operand\" \"rm,r\"))))]\n  \"\"\n  \"@\n   eqv %0,%2\n   eqvm %2,%0\")\n\n(define_insn \"*EQVI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(not:SI (xor:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t(const_int RIGHT_HALF))\n\t\t\t(match_operand:SI 2 \"register_operand\" \"0\"))))]\n  \"\"\n  \"eqvi %0,(%1)\")\n(define_insn \"*EQVI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(not:SI (xor:SI (and:SI (plus:SI\n\t\t\t\t (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t\t(const_int RIGHT_HALF))\n\t\t\t(match_operand:SI 3 \"register_operand\" \"0\"))))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"eqvi %0,%2(%1)\")\n\n(define_insn \"*EQVB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(not:SI (xor:SI (match_dup 0)\n\t\t\t(match_operand:SI 1 \"register_operand\" \"r\"))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(not:SI (xor:SI (match_dup 0) (match_dup 1))))]\n  \"\"\n  \"eqvb %1,%0\")\n(define_insn \"*EQVB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(not:SI (xor:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t(match_dup 0))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(not:SI (xor:SI (match_dup 1) (match_dup 0))))]\n  \"\"\n  \"eqvb %1,%0\")\n\n;; SETCA, SETCM -- one_cmplsi2\n\n(define_insn \"one_cmplsi2\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,m,m\")\n        (not:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,r,0\")))]\n  \"\"\n  \"@\n   setca %0,\n   setcm %0,%1\n   setcam %1,%0\n   setcmm %0\")\n\n(define_insn \"*SETCAB\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(not:SI (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(not:SI (match_dup 1)))]\n  \"\"\n  \"setcab %1,%0\")\n\n(define_insn \"*SETCMB\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(not:SI (match_dup 0)))\n   (set (match_operand:SI 1 \"register_operand\" \"=r\")\n\t(not:SI (match_dup 0)))]\n  \"\"\n  \"setcmb %0,%1\")\n\n;; SETCMI is done with ORCBI.\n\n;; ORCA, ORCM\n\n(define_insn \"*ORCx\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,m,m\")\n        (ior:SI\n\t (not:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,0,0,r,0\"))\n\t (match_operand:SI 2 \"general_operand\" \"rm,0,I,P,0,r\")))]\n  \"\"\n  \"@\n   orca %0,%2\n   orcm %0,%1\n   orcai %0,%2\n   orcbi %0,%C2\n   orcam %1,%0\n   orcmm %2,%0\")\n\n(define_insn \"*ORCMI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (ior:SI (ior:SI (not:SI (match_operand:SI 1 \"register_operand\" \"x\"))\n\t\t\t(const_int LEFT_HALF))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"orcmi %0,(%1)\")\n(define_insn \"*ORCMI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (ior:SI (ior:SI (not:SI (plus:SI\n\t\t\t\t (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\")))\n\t\t\t(const_int LEFT_HALF))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"orcmi %0,%2(%1)\")\n\n(define_insn \"*ORCAB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (match_dup 0)\n\t\t(not:SI (match_operand:SI 1 \"register_operand\" \"r\"))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (match_dup 0) (not:SI (match_dup 1))))]\n  \"\"\n  \"orcab %1,%0\")\n(define_insn \"*ORCAB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (not:SI (match_operand:SI 1 \"register_operand\" \"r\"))\n\t\t(match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (not:SI (match_dup 1)) (match_dup 0)))]\n  \"\"\n  \"orcab %1,%0\")\n\n(define_insn \"*ORCMB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (not:SI (match_dup 0))\n\t\t(match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (not:SI (match_dup 0)) (match_dup 1)))]\n  \"\"\n  \"orcmb %1,%0\")\n(define_insn \"*ORCMB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t(not:SI (match_dup 0))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (match_dup 1) (not:SI (match_dup 0))))]\n  \"\"\n  \"orcmb %1,%0\")\n\n;; ORCB\n\n(define_insn \"*ORCB\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n        (ior:SI (not:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0\"))\n                (not:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"rm,r\"))))]\n  \"\"\n  \"@\n   orcb %0,%2\n   orcbm %2,%0\")\n\n(define_insn \"*ORCBI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (ior:SI (not:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t(const_int RIGHT_HALF)))\n\t\t(not:SI (match_operand:SI 2 \"register_operand\" \"0\"))))]\n  \"\"\n  \"orcbi %0,(%1)\")\n(define_insn \"*ORCBI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (ior:SI (not:SI (and:SI (plus:SI\n\t\t\t\t (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t\t(const_int RIGHT_HALF)))\n\t\t(not:SI (match_operand:SI 3 \"register_operand\" \"0\"))))]\n  \"\"\n  \"orcbi %0,%2(%1)\")\n\n(define_insn \"*ORCMB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (not:SI (match_dup 0))\n\t\t(not:SI (match_operand:SI 1 \"register_operand\" \"r\"))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (not:SI (match_dup 0)) (not:SI (match_dup 1))))]\n  \"\"\n  \"orcbb %1,%0\")\n(define_insn \"*ORCMB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (not:SI (match_operand:SI 1 \"register_operand\" \"r\"))\n\t\t(not:SI (match_dup 0))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (not:SI (match_dup 1)) (not:SI (match_dup 0))))]\n  \"\"\n  \"orcbb %1,%0\")\n\n;; SETO -- in Data Movement\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Floating-point Arithmetic\n\n(define_insn \"addsf3\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(plus:SF (match_operand:SF 1 \"reg_or_mem_operand\" \"%0,0,0,0\")\n\t\t (match_operand:SF 2 \"general_operand\" \"rm,G,F,r\")))]\n  \"\"\n  \"@\n   fadr %0,%2\n   fadri %0,%G2\n   fadr %0,[%2]\n   fadrm %2,%0\")\n\n(define_insn \"*FADRB1\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(plus:SF (match_dup 0) (match_operand:SF 1 \"register_operand\" \"r\")))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(plus:SF (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"fadrb %1,%0\")\n(define_insn \"*FADRB2\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(plus:SF (match_operand:SF 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(plus:SF (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"fadrb %1,%0\")\n\n(define_expand \"adddf3\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(plus:DF (match_operand:DF 1 \"register_operand\" \"\")\n\t\t (match_operand:DF 2 \"general_operand\" \"\")))]\n  \"(TARGET_KI10up && !TARGET_GFLOAT) || (TARGET_KL10up && TARGET_GFLOAT)\"\n  \"\")\n\n(define_insn \"DFAD\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(plus:DF (match_operand:DF 1 \"register_operand\" \"%0,0\")\n\t\t (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KI10up && !TARGET_GFLOAT\"\n  \"@\n   dfad %0,%2\n   dfad %0,[%2]\")\n\n(define_insn \"*GFAD\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(plus:DF (match_operand:DF 1 \"register_operand\" \"%0,0\")\n\t\t (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"@\n   gfad %0,%2\n   gfad %0,[%2]\")\n\n(define_insn \"subsf3\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(minus:SF (match_operand:SF 1 \"register_operand\" \"0,0,0,r\")\n\t\t  (match_operand:SF 2 \"general_operand\" \"rm,G,F,0\")))]\n  \"\"\n  \"@\n   fsbr %0,%2\n   fsbri %0,%G2\n   fsbr %0,[%2]\n   fsbrm %1,%0\")\n\n(define_insn \"*FSBRB\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(minus:SF (match_operand:SF 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(minus:SF (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"fsbrb %1,%0\")\n\n(define_expand \"subdf3\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(minus:DF (match_operand:DF 1 \"register_operand\" \"\")\n\t\t  (match_operand:DF 2 \"general_operand\" \"\")))]\n  \"TARGET_KI10up\"\n  \"\")\n\n(define_insn \"*DFSB\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(minus:DF (match_operand:DF 1 \"register_operand\" \"0,0\")\n\t\t  (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KI10up && !TARGET_GFLOAT\"\n  \"@\n   dfsb %0,%2\n   dfsb %0,[%2]\")\n\n(define_insn \"*GFSB\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(minus:DF (match_operand:DF 1 \"register_operand\" \"0,0\")\n\t\t  (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"@\n   gfsb %0,%2\n   gfsb %0,[%2]\")\n\n(define_insn \"abssf2\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,m,m\")\n\t(abs:SF (match_operand:SF 1 \"reg_or_mem_operand\" \"rm,r,0\")))]\n  \"\"\n  \"@\n   movm %0,%1\n   movmm %1,%0\n   movms %0\")\n\n(define_insn \"*MOVMSsf\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"+rm\")\n\t(abs:SF (match_dup 0)))\n   (set (match_operand:SF 1 \"register_operand\" \"=x\")\n\t(abs:SF (match_dup 0)))]\n  \"\"\n  \"movms %1,%0\")\n\n(define_insn \"negsf2\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,m,m\")\n\t(neg:SF (match_operand:SF 1 \"reg_or_mem_operand\" \"rm,r,0\")))]\n  \"\"\n  \"@\n   movn %0,%1\n   movnm %1,%0\n   movns %0\")\n\n(define_insn \"*MOVNS\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=rm\")\n\t(neg:SF (match_dup 0)))\n   (set (match_operand:SF 1 \"register_operand\" \"+x\")\n\t(neg:SF (match_dup 0)))]\n  \"\"\n  \"movns %1,%0\")\n\n(define_insn \"negdf2\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(neg:DF (match_operand:DF 1 \"reg_or_mem_operand\" \"rm,r\")))]\n  \"TARGET_KI10up\"\n  \"@\n   dmovn %0,%1\n   dmovnm %1,%0\")\n\n(define_insn \"mulsf3\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(mult:SF (match_operand:SF 1 \"reg_or_mem_operand\" \"%0,0,0,0\")\n\t\t (match_operand:SF 2 \"general_operand\" \"rm,G,F,r\")))]\n  \"\"\n  \"@\n   fmpr %0,%2\n   fmpri %0,%G2\n   fmpr %0,[%2]\n   fmprm %2,%0\")\n\n(define_insn \"*FMPRB1\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(mult:SF (match_dup 0) (match_operand:SF 1 \"register_operand\" \"r\")))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(mult:SF (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"fmprb %1,%0\")\n(define_insn \"*FMPRB2\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(mult:SF (match_operand:SF 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(mult:SF (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"fmprb %1,%0\")\n\n(define_expand \"muldf3\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(mult:DF (match_operand:DF 1 \"register_operand\" \"\")\n\t\t (match_operand:DF 2 \"general_operand\" \"\")))]\n  \"TARGET_KI10up\"\n  \"\")\n\n(define_insn \"*DFMP\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(mult:DF (match_operand:DF 1 \"register_operand\" \"%0,0\")\n\t\t (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KI10up && !TARGET_GFLOAT\"\n  \"@\n   dfmp %0,%2\n   dfmp %0,[%2]\")\n\n(define_insn \"*GFMP\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(mult:DF (match_operand:DF 1 \"register_operand\" \"%0,0\")\n\t\t (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"@\n   gfmp %0,%2\n   gfmp %0,[%2]\")\n\n(define_insn \"divsf3\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(div:SF (match_operand:SF 1 \"register_operand\" \"0,0,0,r\")\n\t\t(match_operand:SF 2 \"general_operand\" \"rm,G,F,0\")))]\n  \"\"\n  \"@\n   fdvr %0,%2\n   fdvri %0,%G2\n   fdvr %0,[%2]\n   fdvrm %1,%0\")\n\n(define_insn \"*FDVRB2\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(div:SF (match_operand:SF 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(div:SF (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"fdvrb %1,%0\")\n\n(define_expand \"divdf3\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(div:DF (match_operand:DF 1 \"register_operand\" \"\")\n\t\t(match_operand:DF 2 \"general_operand\" \"\")))]\n  \"TARGET_KI10up\"\n  \"\")\n\n(define_insn \"*DFDV\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(div:DF (match_operand:DF 1 \"register_operand\" \"0,0\")\n\t\t(match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KI10up && !TARGET_GFLOAT\"\n  \"@\n   dfdv %0,%2\n   dfdv %0,[%2]\")\n\n(define_insn \"*GFDV\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(div:DF (match_operand:DF 1 \"register_operand\" \"0,0\")\n\t\t(match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"@\n   gfdv %0,%2\n   gfdv %0,[%2]\")\n\n(define_insn \"sqrtsf2\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(sqrt:SF (match_operand:SF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2\"\n  \"extend %0,[sqrt %1]\")\n\n(define_expand \"sqrtdf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(sqrt:DF (match_operand:DF 1 \"reg_or_mem_operand\" \"\")))]\n  \"TARGET_XKL2\"\n  \"\")\n\n(define_insn \"*DSQRT\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(sqrt:DF (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[dsqrt %1]\")\n\n(define_insn \"*GSQRT\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(sqrt:DF (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && TARGET_GFLOAT\"\n  \"extend %0,[gsqrt %1]\")\n\n(define_insn \"FSC\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r,r\")\n\t(unspec:SF\n\t [(match_operand:SF 1 \"register_operand\" \"0,0\")\n\t  (match_operand:SI 2 \"nonmemory_operand\" \"K,x\")]\n\t UNSPEC_FSC))]\n  \"\"\n  \"@\n   fsc %0,%2\n   fsc %0,(%2)\")\n\n(define_expand \"DFSC\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(unspec:DF\n\t [(match_operand:DF 1 \"register_operand\" \"0,0\")\n\t  (match_operand:SI 2 \"nonmemory_operand\" \"K,r\")]\n\t UNSPEC_FSC))]\n  \"!TARGET_GFLOAT\"\n  \"if (!TARGET_XKL2)\n     {\n       rtx x = gen_rtx_REG (SFmode, REGNO (operands[0]));\n       if (!flag_unsafe_math_optimizations)\n\t emit_insn (gen_DFAD (operands[0], operands[1], CONST0_RTX (DFmode)));\n       emit_insn (gen_FSC (x, x, operands[2]));\n       DONE;\n     }\")\n\n(define_insn \"*DFSC\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(unspec:DF\n\t [(match_operand:DF 1 \"register_operand\" \"0,0\")\n\t  (match_operand:SI 2 \"nonmemory_operand\" \"K,x\")]\n\t UNSPEC_FSC))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"@\n   extend %0,[dfsc %2]\n   extend %0,[dfsc (%2)]\")\n\n(define_insn \"GFSC\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(unspec:DF\n\t [(match_operand:DF 1 \"register_operand\" \"0,0\")\n\t  (match_operand:SI 2 \"nonmemory_operand\" \"K,x\")]\n\t UNSPEC_FSC))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"@\n   extend %0,[gfsc %2]\n   extend %0,[gfsc (%2)]\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Floating-point Conversions\n\n(define_expand \"fix_truncsfsi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(fix:SI (match_operand:SF 1 \"reg_or_mem_operand\" \"\")))]\n  \"\"\n  \"if (!TARGET_KI10up)\n     {\n       rtx temp = gen_reg_rtx (DImode);\n       rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0);\n       rtx temp1 = gen_rtx_SUBREG (SImode, temp, 4);\n\n       /* Sequence taken from KCC.  */\n       emit_insn (gen_MUL (temp,\n\t\t\t   gen_rtx_SUBREG (SImode, operands[1], 0),\n\t\t\t   GEN_INT (0400)));\n       emit_insn (gen_TSC (temp0, temp0));\n       /*emit_insn (gen_ashrsi3 (operands[0], temp1,\n\t\t\t     gen_rtx_PLUS (SImode, temp0, GEN_INT (-0243))));*/\n       emit_insn\n\t (gen_rtx_SET\n\t    (VOIDmode,\n\t     operands[0],\n\t     gen_rtx_ASHIFTRT\n\t       (SImode,\n\t\ttemp0,\n\t\tgen_rtx_NEG\n\t\t  (SImode,\n\t\t   gen_rtx_PLUS\n\t\t     (SImode,\n\t\t      temp1,\n\t\t      GEN_INT (-0243))))));\n\t\t\t\t\t     \n       DONE;\n     }\")\n\n(define_insn \"*fix_truncsfsi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(fix:SI (match_operand:SF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KI10up\"\n  \"fix %0,%1\")\n\n; (define_insn \"fix_truncsfdi2\" ...)\n\n(define_expand \"fix_truncdfsi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(fix:SI (match_operand:DF 1 \"reg_or_mem_operand\" \"\")))]\n  \"(TARGET_KL10up && TARGET_GFLOAT) || (TARGET_XKL2 && !TARGET_GFLOAT)\"\n  \"\")\n\n(define_insn \"*DFIX\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(fix:SI (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[dfix %1]\")\n\n(define_insn \"*GFIX\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(fix:SI (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[gfix %1]\")\n\n(define_expand \"fix_truncdfdi2\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(fix:DI (match_operand:DF 1 \"reg_or_mem_operand\" \"\")))]\n  \"(TARGET_KL10up && TARGET_GFLOAT) || (TARGET_XKL2 && !TARGET_GFLOAT)\"\n  \"\")\n\n(define_insn \"*DDFIX\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(fix:DI (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[ddfix %1]\")\n\n(define_insn \"*GDFIX\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(fix:DI (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[gdfix %1]\")\n\n(define_insn \"floatunsqisf2\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:SF (match_operand:QI 1 \"register_operand\" \"0\")))]\n  \"\"\n  \"fsc %0,233\")\n\n(define_insn \"floatunshisf2\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:SF (match_operand:HI 1 \"register_operand\" \"0\")))]\n  \"\"\n  \"fsc %0,233\")\n\n(define_insn \"floatsisf2\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(float:SF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KI10up\"\n  \"fltr %0,%1\")\n\n(define_insn \"floatunssisf2\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:SF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KI10up\"\n  {\n    if (TARGET_XKL2)\n      return \"ufltr %0,%1\";\n    else\n      /* Sequence taken from KCC.  */\n      return \"skipge %0,%1\\;%_lsh %0,1\\;fltr %0,%0\\;skipge %@%1\\;%_fsc %0,1\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ne (symbol_ref \"TARGET_XKL2\") (const_int 0))\n\t\t      (const_int 1)\n\t\t      (const_int 5)))])\n\n; (define_insn \"floatdisf2\" ...)\n\n(define_insn \"floatunsqidf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:DF (match_operand:QI 1 \"register_operand\" \"0\")))]\n  \"!TARGET_GFLOAT\"\n  \"fsc %0,233\\;movei %Z0,0\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"floatunshidf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:DF (match_operand:HI 1 \"register_operand\" \"0\")))]\n  \"!TARGET_GFLOAT\"\n  \"fsc %0,233\\;movei %Z0,0\"\n  [(set_attr \"length\" \"2\")])\n\n(define_expand \"floatsidf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"\")))]\n  \"TARGET_KL10up || (TARGET_KI10 && !TARGET_GFLOAT)\"\n  \"if (TARGET_KI10up && !TARGET_XKL2 && !TARGET_GFLOAT)\n     {\n       rtx temp = gen_rtx_SUBREG (DImode, operands[0], 0);\n       rtx temp0 = gen_rtx_SUBREG (SImode, operands[0], 0);\n       rtx temp1 = gen_rtx_SUBREG (SImode, operands[0], 4);\n\n       /* Sequence taken from KCC.  */\n       emit_move_insn (temp0, operands[1]);\n       emit_move_insn (temp1, const0_rtx);\n       emit_insn (gen_ASHC_right (temp, temp, GEN_INT (8)));\n       emit_insn (gen_xorsi3 (temp0, temp0,\n\t\t\t      GEN_INT ((HOST_WIDE_INT)0243 << 27)));\n       if (!flag_unsafe_math_optimizations)\n\t emit_insn (gen_adddf3 (operands[0], operands[0],\n\t\t\t\tCONST0_RTX (DFmode)));\n       DONE;\n     }\")\n\n(define_insn \"*DFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[dfltr %1]\")\n\n(define_insn \"*GFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[gfltr %1]\")\n\n(define_expand \"floatunssidf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(unsigned_float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"\")))]\n  \"\"\n  \"if (!TARGET_XKL2)\n     {\n       rtx temp = gen_rtx_SUBREG (DImode, operands[0], 0);\n       rtx temp0 = gen_rtx_SUBREG (SImode, operands[0], 0);\n       rtx temp1 = gen_rtx_SUBREG (SImode, operands[0], 4);\n\n       /* Sequence taken from KCC.  */\n       emit_move_insn (temp0, operands[1]);\n       emit_move_insn (temp1, const0_rtx);\n       emit_insn (gen_lshrdi3 (temp, temp, GEN_INT (9)));\n       emit_insn (gen_lshrsi3 (temp1, temp1, GEN_INT (1)));\n       emit_insn (gen_xorsi3 (temp0, temp0,\n\t\t\t      TARGET_GFLOAT\n\t\t\t      ? GEN_INT ((HOST_WIDE_INT)02743 << 24)\n\t\t\t      : GEN_INT ((HOST_WIDE_INT)0243 << 27)));\n       if (!flag_unsafe_math_optimizations)\n\t emit_insn (gen_adddf3 (operands[0], operands[0],\n\t\t\t\tCONST0_RTX (DFmode)));\n       DONE;\n     }\")\n\n(define_insn \"*UDFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[udfltr %1]\")\n\n(define_insn \"*UGFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && TARGET_GFLOAT\"\n  \"extend %0,[ugfltr %1]\")\n\n(define_expand \"floatdidf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(float:DF (match_operand:DI 1 \"reg_or_mem_operand\" \"\")))]\n  \"(TARGET_KL10up && TARGET_GFLOAT) || (TARGET_XKL2 && !TARGET_GFLOAT)\"\n  \"\")\n\n(define_insn \"*DDFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(float:DF (match_operand:DI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[ddfltr %1]\")\n\n(define_insn \"*DGFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(float:DF (match_operand:DI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[dgfltr %1]\")\n\n(define_expand \"extendsfdf2\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"\")\n\t(float_extend:DF (match_operand:SF 1 \"reg_or_mem_operand\" \"\")))]\n  \"!TARGET_GFLOAT || TARGET_KL10up\"\n  \"\")\n\n;; Extend to D-float by moving the high-order word (if necessary) and\n;; zeroing the low-order word.\n(define_insn \"*extendsfdf2\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"=r,o,r,o\")\n\t(float_extend:DF\n\t (match_operand:SF 1 \"reg_or_mem_operand\" \"0,0,rm,r\")))]\n  \"!TARGET_GFLOAT\"\n  \"@\n   movei %Z0,0%; extendsfdf2\n   setzm %Z0%; extendsfdf2\n   move %0,%1%; extendsfdf2\\;movei %Z0,0%; extendsfdf2\n   movem %1,%0%; extendsfdf2\\;setzm %Z0%; extendsfdf2\"\n  [(set (attr \"length\")\n\t(if_then_else (eq_attr \"alternative\" \"0,1\")\n\t\t      (const_int 1)\n\t\t      (const_int 2)))])\n\n(define_insn \"*GSNGL\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(float_extend:DF (match_operand:SF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[gsngl %1]\")\n\n(define_expand \"truncdfsf2\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"\")\n\t(float_truncate:SF (match_operand:DF 1 \"reg_or_mem_operand\" \"\")))]\n  \"!TARGET_GFLOAT || TARGET_KL10up\"\n  \"\")\n\n;; Truncate from D-float by just dropping the low-order word.\n;; FIXME: this is not good enough, rounding needed.  Or is it??\n(define_insn \"*truncdfsf2\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,m,r,m\")\n\t(float_truncate:SF\n\t (match_operand:DF 1 \"reg_or_mem_operand\" \"0,0,rm,r\")))]\n  \"!TARGET_GFLOAT\"\n  \"@\n   \\\\t%; truncdfsf2\n   \\\\t%; truncdfsf2\n   move %0,%1%; truncdfsf2\n   movem %1,%0%; truncdfsf2\"\n  [(set (attr \"length\")\n\t(if_then_else (eq_attr \"alternative\" \"0,1\") \n\t\t      (const_int 0)\n\t\t      (const_int 1)))])\n\n(define_insn \"*GDBLE\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(float_truncate:SF (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[gdble %1]\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Pointer Arithmetic\n\n(define_insn \"*ADJBP_0\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm,r,m\")\n\t(unspec:SI\n\t [(match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,r\")\n\t  (const_int 0)]\n\t UNSPEC_ADJBP))]\n  \"\"\n  \"@\n   %; nothing\n   move %0,%1\n   movem %1,%0\"\n  [(set_attr \"length\" \"0,1,1\")])\n\n(define_insn \"IBP\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t(unspec:SI\n\t [(match_operand:SI 1 \"reg_or_mem_operand\" \"0\")\n\t  (const_int 1)]\n\t UNSPEC_ADJBP))]\n  \"!TARGET_KL10up\"\n  \"ibp %0\"\n  [(set_attr \"reorg_type\" \"ibp\")])\n\n(define_insn \"ADJBP\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm,x,x\")\n\t(unspec:SI\n\t [(match_operand:SI 1 \"general_operand\" \"0,rm,i\")\n\t  (match_operand:SI 2 \"general_operand\" \"Q,0,0\")]\n\t UNSPEC_ADJBP))]\n  \"TARGET_KL10up\"\n  \"@\n   ibp %0\n   adjbp %0,%1\n   adjbp %0,[%1]\"\n  [(set_attr \"reorg_type\" \"ibp,none,none\")])\n\n(define_insn \"MOVEI\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"address_operand\" \"p\")]\n\t\t    UNSPEC_ADDRESS))]\n  \"\"\n  {\n    if (TARGET_EXTENDED)\n      {\n\t/* ADDRESS: ... */\n        if (GET_CODE (operands[1]) == CONST_INT\n\t    && !pdp10_const_ok_for_letter_p (INTVAL (operands[1]), 'I'))\n\t  return \"move %0,[%1]\";\n\telse\n          return \"xmovei %0,%a1\";\n      }\n    else\n      return \"movei %0,%a1\";\n  })\n\n(define_insn \"MOVSI\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n\t(ashift:SI (unspec:SI [(match_operand:SI 1 \"address_operand\" \"r,p\")]\n\t\t\t      UNSPEC_ADDRESS)\n\t\t   (const_int 18)))]\n  \"\"\n  \"@\n   movs %0,%1\n   movsi %0,%a1\")\n\n(define_insn \"HRRI\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r,r\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 18))\n\t(unspec:SI [(match_operand:SI 1 \"address_operand\" \"r,p\")]\n\t\t   UNSPEC_ADDRESS))]\n  \"\"\n  \"@\n   hrr %0,%1\n   hrri %0,%a1\")\n\n(define_insn \"HRLI\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r,r\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 0))\n\t(unspec:SI [(match_operand:SI 1 \"address_operand\" \"r,p\")]\n\t\t   UNSPEC_ADDRESS))]\n  \"\"\n  \"@\n   hrl %0,%1\n   hrli %0,%a1\")\n\n(define_insn \"ADDI\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r,r\")\n\t(unspec:SI [(plus:SI (match_operand:SI 1 \"register_operand\" \"0,0,0,0\")\n\t\t\t     (match_operand:SI 2 \"address_operand\" \"r,I,i,p\"))]\n\t\t   UNSPEC_ADDRESS))]\n  \"\"\n  \"@\n   add %0,%2\n   addi %0,%2\n   add %0,[%2]\n   addi %0,%a2\")\n\n(define_insn \"ashrsi3_pointer\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"immediate_operand\" \"K\")]\n\t\t   UNSPEC_SHIFTRT))]\n  \"\"\n  \"ash %0,%N2%; ashrsi3_pointer\")\n\n(define_insn \"ashlsi3_pointer\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"immediate_operand\" \"K\")]\n\t\t   UNSPEC_SHIFT))]\n  \"\"\n  \"ash %0,%2%; ashlsi3_pointer\")\n\n(define_insn \"SUBBP\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"reg_or_mem_operand\" \"rm\")]\n\t\t   UNSPEC_SUBBP))]\n  \"TARGET_XKL2\"\n  \"extend %0,[subbp %2]\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Unconditional Jumps\n\n(define_insn \"nop\"\n  [(const_int 0)]\n  \"\"\n  ;; TODO: this is the traditional NOP instruction.  On KL10, TRN is\n  ;; faster.\n  \"jfcl%; nop\")\n\n(define_insn \"jump\"\n  [(set (pc)\n\t(label_ref (match_operand 0 \"\" \"\")))]\n  \"\"\n  {\n    return pdp10_output_jrst (operands[0]);\n  })\n\n(define_expand \"indirect_jump\"\n  [(set (pc)\n\t(match_operand:SI 0 \"general_operand\" \"\"))]\n  \"\"\n  \"/* Strip off any byte pointer fields, leaving only the word address.\n      TODO: do this earlier, before conversion to 'void *'?  */\n   if (GET_CODE (operands[0]) == CONST_INT)\n     {\n       HOST_WIDE_INT address = INTVAL (operands[0]);\n       address &= TARGET_EXTENDED ? 07777777777 : 0777777;\n       operands[0] = GEN_INT (address);\n     }\n   else if (GET_CODE (operands[0]) == CONST\n\t    && GET_CODE (XEXP (operands[0], 0)) == PLUS\n\t    && GET_CODE (XEXP (XEXP (operands[0], 0), 0)) == SYMBOL_REF\n\t    && GET_CODE (XEXP (XEXP (operands[0], 0), 1)) == CONST_INT)\n     {\n       HOST_WIDE_INT offset = INTVAL (XEXP (XEXP (operands[0], 0), 1));\n       offset &= TARGET_EXTENDED ? 07777777777 : 0777777;\n       operands[0] = plus_constant (XEXP (XEXP (operands[0], 0), 0), offset);\n     }\")\n\n(define_insn \"*indirect_jump\"\n  [(set (pc)\n\t;; ADDRESS: the S constraint allows a symbol.\n\t(match_operand:SI 0 \"general_operand\" \"x,IS,i,rm\"))]\n  \"\"\n  \"@\n   jrst (%0)\n   jrst %0\n   jrst @[%0]\n   jrst @%0\")\n\n(define_expand \"call\"\n  [(call (match_operand 0 \"memory_operand\" \"\")\n\t (match_operand 1 \"general_operand\" \"\"))]\n  \"\"\n  \"\")\n\n(define_insn \"*call_reg\"\n  [(call (mem:SI (match_operand:SI 0 \"register_operand\" \"x\"))\n         (match_operand 1 \"\" \"g\"))]\n  \"\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst (%0)\";\n    else\n      return \"pushj 17,(%0)\";\n  })\n\n(define_insn \"*call_mem2\"\n  [(call (mem:SI (match_operand 0 \"immediate_operand\" \"i\"))\n\t (match_operand 1 \"general_operand\" \"g\"))]\n  \"GET_CODE (operands[0]) != SYMBOL_REF\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst %a0\";\n    else\n      return \"pushj 17,%a0\";\n  })\n\n(define_insn \"*call_symbol\"\n  [(call (mem:SI (match_operand:SI 0 \"\" \"X\"))\n\t (match_operand:SI 1 \"general_operand\" \"g\"))]\n  \"GET_CODE (operands[0]) == SYMBOL_REF\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst %L0\";\n    else\n      return \"pushj 17,%L0\";\n  })\n\n(define_insn \"*call_mem1\"\n  [(call (match_operand:SI 0 \"memory_operand\" \"m\")\n\t (match_operand:SI 1 \"general_operand\" \"g\"))]\n  \"\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst @%0\";\n    else\n      return \"pushj 17,@%0\";\n  })\n\n(define_expand \"call_value\"\n  [(set (match_operand 0 \"\" \"\")\n\t(call (match_operand 1 \"memory_operand\" \"\")\n\t      (match_operand 2 \"general_operand\" \"\")))]\n  \"\"\n  \"\")\n\n(define_insn \"*call_value_reg\"\n  [(set (match_operand 0 \"\" \"=r\")\n        (call (mem:SI (match_operand:SI 1 \"register_operand\" \"x\"))\n\t      (match_operand:SI 2 \"general_operand\" \"g\")))]\n  \"\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst (%1)\";\n    else\n      return \"pushj 17,(%1)\";\n  })\n\n(define_insn \"*call_value_mem1\"\n  [(set (match_operand 0 \"\" \"=r\")\n\t(call (mem:SI (match_operand 1 \"memory_operand\" \"o\"))\n\t      (match_operand 2 \"general_operand\" \"g\")))]\n  \"CONSTANT_ADDRESS_P (XEXP (operands[1], 0))\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst @%1\";\n    else\n      return \"pushj 17,@%1\";\n  })\n\n(define_insn \"*call_value_mem2\"\n  [(set (match_operand 0 \"register_operand\" \"=r\")\n\t(call (mem:SI (match_operand 1 \"immediate_operand\" \"i\"))\n\t      (match_operand 2 \"general_operand\" \"g\")))]\n  \"GET_CODE (operands[1]) != SYMBOL_REF\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst %a1\";\n    else\n      return \"pushj 17,%a1\";\n  })\n\n(define_insn \"*call_value_symbol\"\n  [(set (match_operand 0 \"register_operand\" \"=r\")\n\t(call (mem:SI (match_operand:SI 1 \"\" \"X\"))\n\t      (match_operand:SI 2 \"general_operand\" \"g\")))]\n  \"GET_CODE (operands[1]) == SYMBOL_REF\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst %L1\";\n    else if (pdp10_output_call_as_jsp_p (operands[1]))\n      return \"jsp ?,%L1\";\n    else\n      return \"pushj 17,%L1\";\n  })\n\n(define_insn \"*call_value_mem3\"\n  [(set (match_operand 0 \"register_operand\" \"=r\")\n;\t(call (mem:SI (match_operand:SI 1 \"address_operand\" \"a\"))\n\t(call (match_operand:SI 1 \"memory_operand\" \"m\")\n\t      (match_operand:SI 2 \"general_operand\" \"g\")))]\n  \"\"\n  {\n/*    operands[1] = gen_rtx_MEM (SImode, operands[1]);*/\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst %1\";\n    else\n      return \"pushj 17,%1\";\n  })\n\n; (define_expand \"sibcall\" ...)\n\n; (define_expand \"sibcall_value\" ...)\n\n(define_expand \"untyped_call\"\n  [(parallel [(call (match_operand 0 \"\" \"\")\n\t\t    (const_int 0))\n\t      (match_operand 1 \"\" \"\")\n\t      (match_operand 2 \"\" \"\")])]\n  \"\"\n  \"{\n     int i;\n\n     emit_call_insn (gen_call (operands[0], const0_rtx));\n\n     for (i = 0; i < XVECLEN (operands[2], 0); i++)\n       {\n\t rtx set = XVECEXP (operands[2], 0, i);\n\t emit_move_insn (SET_DEST (set), SET_SRC (set));\n       }\n\n     /* The optimizer doesn't know that the call sets the function value\n\tregisters we stored in the result block.  We avoid problems by\n\tclaiming that all hard registers are used and clobbered at this\n\tpoint.  */\n     emit_insn (gen_blockage ());\n \n     DONE;\n   }\")\n\n(define_insn \"*PUSHJ\"\n  [(parallel\n    [(call (match_operand:SI 0 \"memory_operand\" \"m\")\n\t   (match_operand:SI 1 \"\" \"\"))\n     (use (match_operand:SI 2 \"register_operand\" \"+r\"))])]\n  \"\"\n  \"pushj %2,%0\")\n\n; (define_insn \"trap\"\n;   [(trap_if (const_int 1) (const_int 0))]\n;   \"\"\n;   \"<trap 0>%; trap\")\n\n(define_expand \"casesi\"\n  [(set (match_dup 5)\n\t(minus:SI (match_operand:SI 0 \"register_operand\" \"\")\n\t\t  (match_operand:SI 1 \"general_operand\" \"\")))\n   (set (pc)\n        (if_then_else (lt (match_dup 5) (const_int 0))\n\t\t      (label_ref (match_operand 4 \"\" \"\"))\n\t\t      (pc)))\n   (set (pc)\n        (if_then_else (gt (match_dup 5)\n\t\t\t  (match_operand:SI 2 \"general_operand\" \"\"))\n\t\t      (label_ref (match_dup 4))\n\t\t      (pc)))\n;;; This is too general.  The jump table label will always be local.\n;;; Unless the table is in .rodata located in another section.\n;  (set (match_dup 6)\n;\t(plus:SI (match_dup 5) (label_ref (match_operand 3 \"\" \"\"))))\n;  (parallel [(set (pc) (if_then_else (const_int 1)\n;\t\t\t\t      (mem:SI (match_dup 6))\n;\t\t\t\t      (label_ref (match_dup 4))))\n;\t      (use (label_ref (match_dup 3)))])]\n   (parallel [(set (pc)\n\t\t   (if_then_else\n\t\t    (const_int 1)\n\t\t    (mem:SI (plus:SI (match_dup 5)\n\t\t\t\t     (label_ref (match_operand 3 \"\" \"\"))))\n\t\t    (label_ref (match_dup 4))))\n\t      (use (label_ref (match_dup 3)))])]\n  \"\"\n  \"operands[5] = gen_reg_rtx (SImode);\n   /*operands[6] = gen_reg_rtx (SImode);*/\")\n\n;; This is the bare minimum of how an acceptable casesi dispatch\n;; instruction must look like.\n(define_insn \"\"\n  [(parallel [(set (pc)\n\t\t   (if_then_else (const_int 1)\n\t\t\t\t (match_operand:SI 0 \"address_operand\" \"p\")\n\t\t\t\t (label_ref (match_operand 1 \"\" \"\"))))\n\t      (use (label_ref (match_operand 2 \"\" \"\")))])]\n  \"\"\n  \"jrst %a0\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Conditional Jumps\n\n(define_expand \"cmpsi\"\n  [(set (cc0) (compare (match_operand:SI 0 \"register_operand\" \"\")\n                       (match_operand:SI 1 \"general_operand\" \"\")))]\n  \"\"\n  \"pdp10_compare_op0 = operands[0];\n   pdp10_compare_op1 = operands[1];\n   DONE;\")\n\n;; (define_expand \"cmpdi\"\n;;  [(set (cc0) (compare (match_operand:DI 0 \"register_operand\" \"\")\n;;                       (match_operand:DI 1 \"general_operand\" \"\")))]\n;;  \"\"\n;;  \"pdp10_compare_op0 = operands[0];\n;;   pdp10_compare_op1 = operands[1];\n;;   DONE;\")\n\n(define_expand \"cmpsf\"\n  [(set (cc0) (compare (match_operand:SF 0 \"register_operand\" \"\")\n                       (match_operand:SF 1 \"general_operand\" \"\")))]\n  \"\"\n  \"pdp10_compare_op0 = operands[0];\n   pdp10_compare_op1 = operands[1];\n   DONE;\")\n\n;; KCC generates this for double x, y:\n;; x == y:\n;;\tCAMN x+1,y+1\t\t\n;;\t CAME x,y\n;;\t  ;here if false\n;; x < y:\t\t\tx<y\tx==y\tx>y\n;;\tCAML x,y\t\t?\tfalse\tfalse\n;;\t CAMGE x+1,y+1\t\tfalse\ttrue\t?\n;;\t  CAMLE x,y\t\ttrue\t\tfalse\n;;\t   ;here if false\tno\tyes\tyes\n;; x <= y:\n;;\tCAML x,y\t\t?\tfalse\tfalse\n;;\t CAMG x+1,y+1\t\tfalse\tfalse\t?\n;;\t  CAMLE x,y\t\ttrue\ttrue\tfalse\n;;\t   ;here if false\tno\tno\tyes\n;; These may also work for long long after adaptions.\n\n;; To compare a double against zero:\n;; x < 0:\n;;\tJUMPL x,label\n;;\t;here if false\n;; x >= 0:\n;;\tJUMPGE x,label\n;;\t;here if false\n;; x <= 0:\t\t\tx<0\tx==0\tx>0\n;;\tJUMPL x,label\t\ttrue\tfalse\tfalse\n;;\t SKIPN x\t\t\tfalse\n;;\t  JUMPE x+1,label\t\ttrue\n;;\t   ;here if false\n;; x > 0:\n;;\tJUMPG x,label\t\tfalse\tfalse\tmaybe\n;;\t SKIPL x\t\ttrue\tfalse\tfalse\n;;\t  JUMPG x+1,label\t\tfalse\ttrue\n;;\t   ;here if false\n\n(define_expand \"cmpdf\"\n  [(set (cc0) (compare (match_operand:DF 0 \"register_operand\" \"\")\n                       (match_operand:DF 1 \"general_operand\" \"\")))]\n  \"\"\n  \"if (pdp10_const_double_0_operand (operands[1], DFmode))\n     pdp10_compare_op0 = operands[0];\n   else\n     {\n       pdp10_compare_op0 = gen_reg_rtx (DFmode);\n       gen_subdf3 (pdp10_compare_op0, operands[0], operands[1]);\n     }\n   pdp10_compare_op1 = CONST0_RTX (DFmode);\n   DONE;\")\n\n(define_insn \"test_and_skip\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 0 \"pdp10_equality_operator\"\n\t  [(and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"g\"))\n\t   (const_int 0)])\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  \"*pdp10_remove_unnecessary_label (insn, operands[3]);\n    return pdp10_output_test_and_skip (insn, operands);\"\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n;; Equality comparisons of a contigous group of bits with zero will be\n;; written using zero_extract rather than the equivalent AND operations.\n(define_insn \"test_extract_skip\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 0 \"pdp10_equality_operator\"\n\t  [(zero_extract:SI\n\t    (match_operand:SI 1 \"register_operand\" \"r\")\n\t    (match_operand:SI 2 \"const_int_operand\" \"\")\n\t    (match_operand:SI 3 \"const_int_operand\" \"\"))\n\t   (const_int 0)])\n\t (label_ref (match_operand 4 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    int len = INTVAL (operands[2]), pos = INTVAL (operands[3]);\n    HOST_WIDE_INT mask = (((HOST_WIDE_INT)1 << len) - 1) << (36 - pos - len);\n    /* Must assign operands[2] and operands[3], since\n       pdp10_output_test_and_skip use those to output the\n       instruction.  */\n    operands[2] = gen_int_mode (mask, SImode);\n    operands[3] = operands[4];\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    return pdp10_output_test_and_skip (insn, operands);\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 4) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n(define_insn \"TLZN\"\n  [(set (pc)\n\t(if_then_else\n\t (ne (and:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n\t\t     (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t     (const_int 0))\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 0) (and:SI (match_dup 0) (not:SI (match_dup 1))))]\n  \"\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[2]);\n    if (get_attr_length (insn) == 1)\n      return \"tlzn %0,%1\";\n    else\n      return \"tlze %0,%1\\;jrst %2\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 2) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n(define_insn \"TLNE_TLZA_TLO\"\n  [(set (match_operand:SI 0 \"register_operand\" \"+r\")\n\t(unspec:SI [(match_dup 0)\n\t\t    (match_operand:SI 1 \"const_int_operand\" \"\")\n\t\t    (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t    (match_operand:SI 3 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_TLNE_TLZA_TLO))]\n  \"\"\n  \"tlne %0,%1\\;%_tlza %0,%2\\;%_%_tlo %0,%3\"\n  [(set_attr \"length\" \"3\")])\n\n(define_expand \"bne\"\n  [(set (pc)\n\t(if_then_else (ne (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"if (pdp10_generate_cbranchdi (NE, pdp10_compare_op0, pdp10_compare_op1))\n     DONE;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"beq\"\n  [(set (pc)\n\t(if_then_else (eq (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"bge\"\n  [(set (pc)\n\t(if_then_else (ge (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"bgt\"\n  [(set (pc)\n\t(if_then_else (gt (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"ble\"\n  [(set (pc)\n\t(if_then_else (le (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"blt\"\n  [(set (pc)\n\t(if_then_else (lt (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"bgeu\"\n  [(set (pc)\n\t(if_then_else (ge (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"bgtu\"\n  [(set (pc)\n\t(if_then_else (gt (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"bleu\"\n  [(set (pc)\n\t(if_then_else (le (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"bltu\"\n  [(set (pc)\n\t(if_then_else (lt (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n; (define_insn \"cbranchsi4\" ...)\n\n(define_insn \"cbranchsi\"\n  [(set (pc)\n\t(if_then_else (match_operator 3 \"comparison_operator\"\n\t\t       [(match_operand:SI 1 \"reg_or_mem_operand\" \"r,m,r,r,r\")\n\t\t        ;; ADDRESS: an S constraint for the cai case\n\t\t        ;; (alternative 2) would allow a symbol.\n\t\t        (match_operand:SI 2 \"general_operand\" \"O,O,I,i,rm\")])\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  {\n    static const char *asms[] =\n    { \"jump%3 %1,%F0\",\n      \"skip%3 %@%1\",\n      \"cai%3 %1,%2\",\n      \"cam%3 %1,[%X2]\",\n      \"cam%3 %1,%2\" };\n    if (which_alternative != 0)\n      pdp10_remove_unnecessary_label (insn, operands[0]);\n    /* ADDRESS: unextended code can store the symbol in the immediate\n       field.  */\n    if (which_alternative == 3 && !TARGET_EXTENDED\n\t&& GET_CODE (operands[2]) == CONST)\n      which_alternative = 2;\n    if (get_attr_length (insn) == 1)\n      return asms[which_alternative];\n    else\n      {\n\t/* Reverse the skip condition and output a JRST.  */\n\toperands[3] = gen_rtx_fmt_ee (reverse_condition\n\t\t\t\t      (GET_CODE (operands[3])),\n\t\t\t\t      VOIDmode, NULL_RTX, NULL_RTX);\n\toutput_asm_insn (asms[which_alternative], operands);\n\treturn pdp10_output_jrst (operands[0]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ior (eq_attr \"alternative\" \"0\")\n\t\t\t   (eq (minus (match_dup 0) (pc)) (const_int 1)))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"no,yes,yes,yes,yes\")])\n\n(define_insn \"*CAI_reg\"\n  [(set (pc)\n\t(if_then_else (match_operator 0 \"comparison_operator\"\n\t\t       [(and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t(const_int RIGHT_HALF))\n\t\t        (match_operand:SI 2 \"register_operand\" \"r\")])\n\t\t      (label_ref (match_operand 3 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    if (get_attr_length (insn) == 1)\n      return \"cai%0 %2,(%1)\";\n    else\n      {\n\t/* Reverse the skip condition and output a JRST.  */\n\toutput_asm_insn (\"cai%R0 %2,(%1)\", operands);\n\treturn pdp10_output_jrst (operands[3]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n(define_insn \"*CAI_const_plus_reg\"\n  [(set (pc)\n\t(if_then_else (match_operator 0 \"comparison_operator\"\n\t\t       [(and:SI (plus:SI\n\t\t\t\t (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t\t(const_int RIGHT_HALF))\n\t\t        (match_operand:SI 3 \"register_operand\" \"r\")])\n\t\t      (label_ref (match_operand 4 \"\" \"\"))\n\t\t      (pc)))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[4]);\n    if (get_attr_length (insn) == 1)\n      return \"cai%0 %3,%2(%1)\";\n    else\n      {\n\t/* Reverse the skip condition and output a JRST.  */\n\toutput_asm_insn (\"cai%R0 %3,%2(%1)\", operands);\n\treturn pdp10_output_jrst (operands[4]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 4) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n(define_insn \"*cbranchsf\"\n  [(set (pc)\n\t(if_then_else (match_operator 3 \"pdp10_comparison_operator\"\n\t\t       [(match_operand:SF 1 \"reg_or_mem_operand\" \"r,m,r,r,r\")\n\t\t        (match_operand:SF 2 \"general_operand\" \"R,R,I,i,rm\")])\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  {\n    /* TODO: Copy from cbranchsi.  Maybe create an output function for\n       both?  */\n    const char *asms[][2] =\n    { { \"jump%3 %1,%F0\",\t0 },\n      { \"skip%3 %@%1\",\t\t\"skip%R3 %@%1\\;jrst %l0\" },\n      { \"cai%3 %1,%2\",\t\t\"cai%R3 %1,%2\\;jrst %l0\" },\n      { \"cam%3 %1,[%2]\",\t\"cam%R3 %1,[%2]\\;jrst %l0\" },\n      { \"cam%3 %1,%2\",\t\t\"cam%R3 %1,%2\\;jrst %l0\" } };\n    if (which_alternative != 0)\n      pdp10_remove_unnecessary_label (insn, operands[0]);\n    return asms[which_alternative][get_attr_length (insn) - 1];\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ior (eq_attr \"alternative\" \"0\")\n\t\t\t   (eq (minus (match_dup 0) (pc)) (const_int 1)))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"no,yes,yes,yes,yes\")])\n\n(define_insn \"*cbranchdf\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 3 \"pdp10_comparison_operator\"\n          [(match_operand:DF 1 \"reg_or_mem_operand\" \"r,m\")\n\t   (match_operand:DF 2 \"pdp10_const_double_0_operand\" \"\")])\n\t (label_ref (match_operand 0 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    if (which_alternative == 0)\n      return \"jump%3 %1,%F0\";\n    pdp10_remove_unnecessary_label (insn, operands[0]);\n    if (get_attr_length (insn) == 1)\n      return \"skip%3 %@%1\";\n    else\n      {\n\toutput_asm_insn (\"skip%R3 %@%1\", operands);\n\treturn pdp10_output_jrst (operands[0]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ior (eq_attr \"alternative\" \"0\")\n\t\t\t   (eq (minus (match_dup 0) (pc)) (const_int 1)))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"no,yes\")])\n\n(define_insn \"doloop_end\"\n  [(set (pc)\n\t(if_then_else\n\t (ge (plus:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r\")\n\t\t      (const_int -1))\n\t     (const_int 0))\n\t (label_ref (match_operand 4 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 0)\n\t(plus:SI (match_dup 0) (const_int -1)))\n   (use (match_operand 1 \"\" \"\"))\t; iterations; zero if unknown\n   (use (match_operand 2 \"\" \"\"))\t; max iterations\n   (use (match_operand 3 \"\" \"\"))]\t; loop level\n  \"\"\n  \"sojge %0,%l4%; doloop_end\")\n\n(define_insn \"decrement_and_branch_until_zero\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 2 \"pdp10_comparison_operator\"\n\t  [(plus:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r,m\")\n\t\t    (const_int -1))\n\t   (const_int 0)])\n\t (label_ref (match_operand 1 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 0)\n\t(plus:SI (match_dup 0) (const_int -1)))]\n  \"\"\n  {\n    if (which_alternative == 0)\n      return \"soj%2 %0,%l1%; decrement_and_branch_until_zero\";\n    pdp10_remove_unnecessary_label (insn, operands[1]);\n    if (get_attr_length (insn) == 1)\n      return \"sos%2 %@%0%; decrement_and_branch_until_zero\";\n    else\n      {\n\toutput_asm_insn (\"sos%R2 %@%0%; decrement_and_branch_until_zero\",\n\t\t\t operands);\n\treturn pdp10_output_jrst (operands[1]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ior (eq_attr \"alternative\" \"0\")\n\t\t\t   (eq (minus (match_dup 1) (pc)) (const_int 1)))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"no,yes\")])\n\n(define_insn \"*AOJ\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 0 \"pdp10_comparison_operator\"\n\t  [(plus:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"+r,m\")\n\t\t    (const_int 1))\n\t   (const_int 0)])\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 1)\n\t(plus:SI (match_dup 1) (const_int 1)))]\n  \"\"\n  {\n    if (which_alternative == 0)\n      return \"aoj%0 %1,%l2\";\n    pdp10_remove_unnecessary_label (insn, operands[2]);\n    if (get_attr_length (insn) == 1)\n      return \"aos%0 %@%1\";\n    else\n      {\n\toutput_asm_insn (\"aos%R0 %@%1\", operands);\n\treturn pdp10_output_jrst (operands[2]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ior (eq_attr \"alternative\" \"0\")\n\t\t\t   (eq (minus (match_dup 2) (pc)) (const_int 1)))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"no,yes\")])\n\n(define_insn \"*SOJA\"\n  [(set (pc)\n\t(label_ref (match_operand 2 \"\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(plus:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t (const_int -1)))]\n  \"\"\n  {\n    rtx next = next_nonnote_insn (insn);\n    if (next == operands[2]\n\t|| (GET_CODE (next) == BARRIER\n\t    && next_nonnote_insn (next) == operands[2]))\n      {\n\tpdp10_remove_unnecessary_label (insn, operands[1]);\n\treturn \"subi %0,1\";\n      }\n    else\n      return \"soja %0,%l2\";\n  })\n\n(define_insn \"*AOJA\"\n  [(set (pc)\n\t(label_ref (match_operand 2 \"\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(plus:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t (const_int 1)))]\n  \"\"\n  {\n    rtx next = next_nonnote_insn (insn);\n    if (next == operands[2]\n\t|| (GET_CODE (next) == BARRIER\n\t    && next_nonnote_insn (next) == operands[2]))\n      {\n\tpdp10_remove_unnecessary_label (insn, operands[2]);\n\treturn \"addi %0,1\";\n      }\n    else\n      return \"aoja %0,%l2\";\n  })\n\n(define_insn \"*SOSx_and_move\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 2 \"pdp10_comparison_operator\"\n\t  [(plus:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"+rm\")\n\t\t    (const_int -1))\n\t   (const_int 0)])\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 1)\n\t(plus:SI (match_dup 1) (const_int -1)))\n   (set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(plus:SI (match_dup 1) (const_int -1)))]\n  \"\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    if (get_attr_length (insn) == 1)\n      return \"sos%2 %0,%1\";\n    else\n      {\n\toutput_asm_insn (\"sos%R2 %0,%1\", operands);\n\treturn pdp10_output_jrst (operands[3]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n(define_insn \"*AOSx_and_move\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 2 \"pdp10_comparison_operator\"\n\t  [(plus:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"+rm\")\n\t\t    (const_int 1))\n\t   (const_int 0)])\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 1)\n\t(plus:SI (match_dup 1) (const_int 1)))\n   (set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(plus:SI (match_dup 1) (const_int 1)))]\n  \"\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    if (get_attr_length (insn) == 1)\n      return \"aos%2 %0,%1\";\n    else\n      {\n\toutput_asm_insn (\"aos%R2 %0,%1\", operands);\n\treturn pdp10_output_jrst (operands[3]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n(define_insn \"JFFO\"\n  [(set (pc)\n\t(if_then_else (ne (subreg:SI\n\t\t\t   (match_operand:DI 0 \"register_operand\" \"+r\") 0)\n\t\t\t  (const_int 0))\n\t\t      (match_operand 1 \"address_operand\" \"\")\n\t\t      (pc)))\n   (set (subreg:SI (match_dup 0) 4)\n\t(unspec:SI [(subreg:SI (match_dup 0) 0)] UNSPEC_FFO))]\n  \"TARGET_KA10up\"\n  {\n    if (GET_CODE (operands[1]) == LABEL_REF)\n      return \"jffo %0,%l1\";\n    else\n      return \"jffo %0,%1\";\n  })\n\n(define_insn \"CMPBP\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 0 \"comparison_operator\"\n\t  [(unspec:SI\n\t    [(match_operand:SI 1 \"register_operand\" \"r\")] UNSPEC_CMPBP)\n\t   (unspec:SI\n\t    [(match_operand:SI 2 \"reg_or_mem_operand\" \"rm\")] UNSPEC_CMPBP)])\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))]\n  \"TARGET_XKL2\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    if (get_attr_length (insn) == 1)\n      return \"extend %1,[cmpbp%0 %2]\";\n    else\n      return \"extend %1,[cmpbp%C0 %2]\\;jump %3\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n; (define_expand \"conditional_trap\"\n;   [(trap_if (match_operator 0 \"pdp10_comparison_operator\" \n;              [(match_dup 2) (const_int 0)])\n;             (match_operand 1 \"const_int_operand\" \"\"))]\n;   \"\"\n;   \"operands[2] = pdp10_compare_op0;\")\n\n; (define_insn \"*trap\"\n;   [(trap_if (match_operator 0 \"pdp10_comparison_operator\" \n;              [(match_operand 2 \"memory_operand\" \"m\") (const_int 0)])\n;             (match_operand 1 \"const_int_operand\" \"i\"))]\n;   \"\"\n;   \"skip%R0 %2\\;%_<trap %1>%; conditional_trap\"\n;   [(set_attr \"length\" \"2\")])\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Function Prologue and Epilogue\n\n(define_expand \"prologue\"\n  [(const_int 2)]\n  \"\"\n  \"pdp10_expand_prologue ();\n   DONE;\")\n\n(define_expand \"epilogue\"\n  [(return)]\n  \"\"\n  \"pdp10_expand_epilogue (1);\n   DONE;\")\n\n(define_expand \"sibcall_epilogue\"\n  [(const_int 3)]\n  \"\"\n  \"pdp10_expand_epilogue (0);\n   DONE;\")\n\n(define_insn \"POPJ\"\n  [(set (pc) (match_operand:SI 0 \"pdp10_pop_operand\" \"\"))]\n  \"\"\n  \"popj %P0,\")\n\n(define_insn \"POPJ_17\"\n  [(return)]\n  \"\"\n  {\n    return pdp10_output_return ();\n  })\n\n;; Allocate stack space, and return the word address of the allocated\n;; memory.\n(define_expand \"allocate_stack\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(unspec:SI [(plus:SI (reg:SI SP_REGNUM) (const_int 1))]\n\t\t   UNSPEC_ADDRESS))\n   (set (reg:SI SP_REGNUM)\n\t(unspec:SI\n\t [(reg:SI SP_REGNUM)\n\t  (match_operand:SI 1 \"general_operand\" \"\")]\n\t UNSPEC_ADJSP))]\n  \"\"\n  \"{\n     rtx x = plus_constant (stack_pointer_rtx, 1);\n     rtx y, z = gen_reg_rtx (Pmode);\n     if (GET_CODE (operands[1]) == CONST_INT)\n       y = GEN_INT ((INTVAL (operands[1]) + 3) / 4);\n     else\n       {\n\t y = gen_reg_rtx (Pmode);\n\t emit_insn (gen_addsi3 (y, operands[1], GEN_INT (3)));\n\t emit_insn (gen_ASH_right (y, y, GEN_INT (-2)));\n       }\n     emit_move_insn (z,\n\t\t     gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_ADDRESS));\n     emit_move_insn (operands[0], z);\n     emit_insn (pdp10_gen_stack_adjust (y));\n     DONE;\n   }\")\n\n(define_expand \"ADJSP\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(unspec:SI [(match_dup 0) (match_operand:SI 1 \"general_operand\" \"\")]\n\t\t   UNSPEC_ADJSP))]\n  \"\"\n  \"\")\n\n(define_insn \"*ADJSP_KL10up\"\n  [(set (match_operand:SI 0 \"register_operand\" \"+r,r,r,r\")\n\t(unspec:SI [(match_dup 0)\n\t\t    (match_operand:SI 1 \"general_operand\" \"K,i,x,m\")]\n\t\t   UNSPEC_ADJSP))]\n  \"TARGET_KL10up\"\n  \"@\n   adjsp %0,%1\n   adjsp %0,[%1]\n   adjsp %0,(%1)\n   adjsp %0,@%1\")\n\n(define_insn \"*ADJSP_noKL10up\"\n  [(set (match_operand:SI 0 \"register_operand\" \"+r\")\n\t(unspec:SI [(match_dup 0)\n\t\t    (match_operand:SI 1 \"immediate_operand\" \"K\")]\n\t\t   UNSPEC_ADJSP))]\n  \"!TARGET_KL10up && !TARGET_EXTENDED\"\n  \"add %0,[%1,,%1]\")\n\n(define_insn \"PUSH\"\n  [(set (match_operand:SI 0 \"pdp10_push_operand\" \"=m\")\n\t(match_operand:SI 1 \"reg_or_mem_operand\" \"rm\"))]\n  \"\"\n  \"push %P0,%1\")\n\n(define_insn \"*pushsi_combine\"\n  [(parallel\n    [(set (mem:SI (plus:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t\t   (const_int 1)))\n\t  ;; FIXME: empty predicate allowed?\n\t  (match_operand:SI 1 \"\" \"rm\"))\n     (set (match_operand:SI 2 \"register_operand\" \"=0\")\n\t  (plus:SI (match_dup 0) (const_int 1)))])]\n  \"optimize_size && TARGET_EXTENDED\"\n  \"push %0,%1\")\n\n(define_insn \"*pushsf_combine\"\n  [(parallel\n    [(set (mem:SF (plus:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t\t   (const_int 1)))\n\t  (match_operand:SF 1 \"reg_or_mem_operand\" \"rm\"))\n     (set (match_operand:SI 2 \"register_operand\" \"=0\")\n\t  (plus:SI (match_dup 0) (const_int 1)))])]\n  \"optimize_size && TARGET_EXTENDED\"\n  \"push %0,%1\")\n\n(define_insn \"POP\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t(match_operand:SI 1 \"pdp10_pop_operand\" \"m\"))]\n  \"\"\n  \"pop %P1,%0\")\n\n(define_insn \"*popsi_combine\"\n  [(parallel\n    [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t  (mem:SI (match_operand:SI 1 \"register_operand\" \"r\")))\n     (set (match_operand:SI 2 \"reg_or_mem_operand\" \"=1\")\n\t  (plus:SI (match_dup 1) (const_int -1)))])]\n  \"optimize_size && TARGET_EXTENDED\"\n  \"pop %1,%0\")\n\n(define_insn \"*popsf_combine\"\n  [(parallel\n    [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=rm\")\n\t  (mem:SF (match_operand:SI 1 \"register_operand\" \"+r\")))\n     (set (match_dup 1)\n\t  (plus:SI (match_dup 1) (const_int -1)))])]\n  \"optimize_size && TARGET_EXTENDED\"\n  \"pop %1,%0\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Peepholes\n\n;; The following four insns compensate for unnecessary shifts\n;; generated by pointer arithmetic.\n(define_insn \"*combine_nop_shift_left_right\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI\n\t [(ashift:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t  (match_operand:SI 3 \"const_int_operand\" \"\")]\n\t UNSPEC_SHIFTRT))]\n  \"INTVAL (operands[2]) == INTVAL (operands[3])\"\n  \"\"\n  [(set_attr \"length\" \"0\")])\n(define_insn \"*combine_shift_left_right\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI\n\t [(ashift:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t  (match_operand:SI 3 \"const_int_operand\" \"\")]\n\t UNSPEC_SHIFTRT))]\n  \"\"\n  {\n    operands[2] = GEN_INT (INTVAL (operands[2]) - INTVAL (operands[3]));\n    return \"ash %0,%2\";\n  })\n(define_insn \"*combine_nop_shift_right_left\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:SI\n\t (unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"\")]\n\t\t    UNSPEC_SHIFT)\n\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) == INTVAL (operands[3])\"\n  \"\"\n  [(set_attr \"length\" \"0\")])\n(define_insn \"*combine_shift_right_left\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:SI\n\t (unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"\")]\n\t\t    UNSPEC_SHIFT)\n\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    operands[2] = GEN_INT (INTVAL (operands[2]) - INTVAL (operands[3]));\n    return \"ash %0,%2\";\n  })\n\n;; Remove unnecessary shifts generated by pointer arithmetic.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(unspec:SI\n\t [(truncate:SI\n\t   (ashift:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t      (match_operand:SI 2 \"const_int_operand\" \"\")))\n\t  (match_operand:SI 3 \"const_int_operand\" \"\")]\n\t UNSPEC_SHIFTRT))]\n  \"INTVAL (operands[2]) == INTVAL (operands[3])\"\n  [(set (match_dup 0) (truncate:SI (match_dup 1)))])\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ashiftrt:SI\n\t (unspec:SI [(match_operand:SI 1 \"register_operand\" \"\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"\")]\n\t\t    UNSPEC_SHIFT)\n\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) == INTVAL (operands[3])\"\n  [(set (match_dup 0) (match_dup 1))])\n\n;; Generate EXCH instructions.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(match_operand:SI 1 \"reg_or_mem_operand\" \"\"))\n   (set (match_dup 1)\n\t(match_operand:SI 2 \"reg_or_mem_operand\" \"\"))\n   (set (match_dup 2)\n\t(match_dup 0))]\n  \"find_reg_note (next_nonnote_insn (next_nonnote_insn (insn)),\n\t\t  REG_DEAD, operands[0])\n   && (register_operand (operands[1], SImode)\n       || register_operand (operands[2], SImode))\"\n  ;\"peep2_reg_dead_p (2, operands[0]) && ...\"\n  [(parallel [(set (match_dup 1) (match_dup 2))\n\t      (set (match_dup 2) (match_dup 1))])]\n  \"if (register_operand (operands[1], SImode))\n     {\n       rtx tmp = operands[1];\n       operands[1] = operands[2];\n       operands[2] = tmp;\n     }\")\n\n;; Generate SETZB instructions.\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\") (const_int 0))\n   (set (match_operand:SI 1 \"reg_or_mem_operand\" \"\") (const_int 0))]\n  \"register_operand (operands[0], SImode)\n   || register_operand (operands[1], SImode)\"\n  [(parallel [(set (match_dup 0) (const_int 0))\n\t      (set (match_dup 1) (const_int 0))])]\n  \"if (register_operand (operands[0], SImode))\n     {\n       rtx tmp = operands[0];\n       operands[0] = operands[1];\n       operands[1] = tmp;\n     }\")\n\n;; Remove an unneccesary MOVEI instruction.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n        (unspec:SI\n\t [(plus:SI (match_dup 0) (match_operand 1 \"const_int_operand\" \"\"))]\n\t UNSPEC_ADDRESS))\n   (parallel [(unspec_volatile:BLK\n\t       [(match_operand:SI 2 \"register_operand\" \"\")]\n\t       VUNSPEC_BLT)\n\t      (use (mem:BLK (match_dup 0)))])]\n  \"dead_or_set_p (insn, operands[0])\"\n  ;\"peep2_reg_dead_p (0, operands[0])\"\n  [(parallel [(unspec_volatile:BLK [(match_dup 2)] VUNSPEC_BLT)\n\t      (use (mem:BLK (plus:SI (match_dup 0) (match_dup 1))))])])\n\n;; Optimize a block-copy operation with constant addresses.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(unspec:SI\n\t [(match_operand:SI 1 \"immediate_operand\" \"\")] UNSPEC_ADDRESS))\n   (set (zero_extract:SI (match_dup 0) (const_int 18) (const_int 0))\n\t(unspec:SI\n\t [(match_operand:SI 2 \"immediate_operand\" \"\")] UNSPEC_ADDRESS))]\n  \"\"\n  [(set (match_dup 0)\n\t(ior:SI (ashift:SI (match_dup 2) (const_int 18))\n\t\t (match_dup 1)))])\n\n;; Optimize a block-clear operation with a constant address.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(match_operand:SI 1 \"immediate_operand\" \"\"))\n   (set (match_operand:SI 2 \"register_operand\" \"\")\n\t(ashift:SI (unspec:SI [(match_dup 0)] UNSPEC_ADDRESS)\n\t\t    (const_int 18)))\n   (set (zero_extract:SI (match_dup 2) (const_int 18) (const_int 18))\n\t;; FIXME: (const_int 4) -> (const_int 1)?\n\t(unspec:SI [(plus:SI (match_dup 0) (const_int 4))] UNSPEC_ADDRESS))]\n  \"dead_or_set_p (insn, operands[0])\"\n  ;\"peep2_reg_dead_p (0, operands[0])\"\n  [(set (match_dup 2)\n\t(ior:SI (ashift:SI (match_dup 1) (const_int 18))\n\t\t (const:SI (plus:SI (match_dup 1) (const_int 1)))))])\n\n;; Generate a PUSHJ instruction from an equivalent sequence of\n;; instructions.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(label_ref:SI (match_operand 1 \"\" \"\")))\n   (parallel\n    [(set (mem:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"\")\n\t\t\t   (const_int 1)))\n\t  (match_operand:SI 3 \"\" \"\"))\n     (set (match_dup 2)\n\t  (plus:SI (match_dup 2) (const_int 1)))])\n   (set (pc)\n\t(match_operand:SI 4 \"\" \"\"))]\n  ;; TODO: find code_label corresponding to operands[1].\n  \"0 && TARGET_EXTENDED\"\n  [(parallel\n    [(call (mem:SI (match_dup 4)) (const_int 0))\n     (use (match_dup 2))])])\n\n;; Generate a POP instruction from an equivalent sequence of\n;; instructions.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(mem:SI (match_operand:SI 1 \"register_operand\" \"\")))\n   (set (match_operand:SI 2 \"reg_or_mem_operand\" \"\")\n\t(match_dup 0))\n   (set (match_dup 1)\n\t(plus:SI (match_dup 1) (const_int -1)))]\n  \"optimize_size && TARGET_EXTENDED\"\n  [(parallel\n    [(set (match_dup 2)\n\t  (mem:SI (match_dup 1)))\n     (set (match_dup 1)\n\t  (plus:SI (match_dup 1) (const_int -1)))])])\n(define_peephole2\n  [(set (match_operand:SF 0 \"register_operand\" \"\")\n\t(mem:SF (match_operand:SI 1 \"register_operand\" \"\")))\n   (set (match_operand:SF 2 \"reg_or_mem_operand\" \"\")\n\t(match_dup 0))\n   (set (match_dup 1)\n\t(plus:SI (match_dup 1) (const_int -1)))]\n  \"optimize_size && TARGET_EXTENDED\"\n  [(parallel\n    [(set (match_dup 2)\n\t  (mem:SF (match_dup 1)))\n     (set (match_dup 1)\n\t  (plus:SI (match_dup 1) (const_int -1)))])])\n\n;; XMOVEI AC1,OFFSET(17)\n;; MOVE AC2,AC1\t\t\t->\tMOVE AC2,OFFSET(17)\n;; AC1 is dead\n(define_peephole2\n  [(set (match_operand:SI 1 \"register_operand\" \"\")\n        (plus:SI (reg:SI SP_REGNUM)\n\t\t (match_operand:SI 2 \"const_int_operand\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n        (match_dup 1))]\n  ;\"dead_or_set_p (insn, operands[1])\"\n  \"find_regno_note (next_real_insn (insn), REG_DEAD, REGNO (operands[1]))\"\n  ;\"peep2_reg_dead_p (1, operands[1]);\"\n  [(set (match_dup 0)\n        (plus:SI (reg:SI SP_REGNUM) (match_dup 2)))])\n\n;; XMOVEI AC1,(17)\n;; ADDI AC1,OFFSET\t\t->\tXMOVEI AC1,OFFSET(17)\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(reg:SI SP_REGNUM))\n   (set (match_dup 0)\n\t(plus:SI (match_dup 0)\n\t\t (match_operand:SI 1 \"const_int_operand\" \"\")))]\n  \"\"\n  [(set (match_dup 0)\n\t(plus:SI (reg:SI SP_REGNUM) (match_dup 1)))])\n\n;; XMOVEI AC1,OFFSET1(17)\n;; ADDI AC1,OFFSET2\t\t->\tXMOVEI AC1,OFFSET1+OFFSET2(17)\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(plus:SI (reg:SI SP_REGNUM)\n\t\t (match_operand:SI 1 \"const_int_operand\" \"\")))\n   (set (match_dup 0)\n\t(plus:SI (match_dup 0)\n\t\t (match_operand:SI 2 \"const_int_operand\" \"\")))]\n  \"\"\n  [(set (match_dup 0)\n\t(plus:SI (reg:SI SP_REGNUM) (match_dup 3)))]\n  \"operands[3] = gen_int_mode (INTVAL (operands[1]) + INTVAL (operands[2]),\n\t\t\t       Pmode);\")\n\n;; AOS m\n;; MOVE a,m\t\t\t->\tAOS a,m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int 1)))\n   (set (match_operand:SI 1 \"register_operand\" \"\")\n\t(match_dup 0))]\n  \"REGNO (operands[1]) != 0\"\n  [(parallel\n    [(set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int 1)))\n     (set (match_dup 1)\n\t  (plus:SI (match_dup 0) (const_int 1)))])])\n\n;; SOS m\n;; MOVE a,m\t\t\t->\tSOS a,m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int -1)))\n   (set (match_operand:SI 1 \"register_operand\" \"\")\n\t(match_dup 0))]\n  \"REGNO (operands[1]) != 0\"\n  [(parallel\n    [(set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int -1)))\n     (set (match_dup 1)\n\t  (plus:SI (match_dup 0) (const_int -1)))])])\n\n;; AOS a,m\n;; CAILE a,0\t\t\t->\tAOSLE a,m\n;;  MOVEI a,0\t\t\t\t MOVEI a,0\n(define_peephole\n  [(parallel [(set (match_operand:SI 0 \"memory_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int 1)))\n\t      (set (match_operand:SI 1 \"register_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int 1)))])\n   (set (match_dup 1)\n\t(smin:SI (match_dup 1) (match_operand 2 \"const_int_operand\" \"\")))]\n  \"REGNO (operands[1]) != 0\n   && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)\"\n  {\n    if (INTVAL (operands[2]) == 0)\n      return \"aosle %1,%0\\;%_movei %1,0\";\n    else if (INTVAL (operands[2]) == 1)\n      return \"aosle %1,%0\\;%_movei %1,1\";\n    else\n      return \"aosl %1,%0\\;%_seto %1,\";\n  })\n\n;; SOS a,m\n;; CAILE a,0\t\t\t->\tSOSLE a,m\n;;  MOVEI a,0\t\t\t\t MOVEI a,0\n(define_peephole\n  [(parallel [(set (match_operand:SI 0 \"memory_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int -1)))\n\t      (set (match_operand:SI 1 \"register_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int -1)))])\n   (set (match_dup 1)\n\t(smin:SI (match_dup 1) (match_operand 2 \"const_int_operand\" \"\")))]\n  \"REGNO (operands[1]) != 0\n   && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)\"\n  {\n    if (INTVAL (operands[2]) == 0)\n      return \"sosle %1,%0\\;%_movei %1,0\";\n    else if (INTVAL (operands[2]) == 1)\n      return \"sosle %1,%0\\;%_movei %1,1\";\n    else\n      return \"sosl %1,%0\\;%_seto %1,\";\n  })\n\n;; AOS a,m\n;; CAIGE a,0\t\t\t->\tAOSGE a,m\n;;  MOVEI a,0\t\t\t\t MOVEI a,0\n(define_peephole\n  [(parallel [(set (match_operand:SI 0 \"memory_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int 1)))\n\t      (set (match_operand:SI 1 \"register_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int 1)))])\n   (set (match_dup 1)\n\t(smax:SI (match_dup 1) (match_operand 2 \"const_int_operand\" \"\")))]\n  \"REGNO (operands[1]) != 0\n   && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)\"\n  {\n    if (INTVAL (operands[2]) == 0)\n      return \"aosge %1,%0\\;%_movei %1,0\";\n    else if (INTVAL (operands[2]) == 1)\n      return \"aosg %1,%0\\;%_movei %1,1\";\n    else\n      return \"aosge %1,%0\\;%_seto %1,\";\n  })\n\n;; SOS a,m\n;; CAIGE a,0\t\t\t->\tSOSGE a,m\n;;  MOVEI a,0\t\t\t\t MOVEI a,0\n(define_peephole\n  [(parallel [(set (match_operand:SI 0 \"memory_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int -1)))\n\t      (set (match_operand:SI 1 \"register_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int -1)))])\n   (set (match_dup 1)\n\t(smax:SI (match_dup 1) (match_operand 2 \"const_int_operand\" \"\")))]\n  \"REGNO (operands[1]) != 0\n   && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)\"\n  {\n    if (INTVAL (operands[2]) == 0)\n      return \"sosge %1,%0\\;%_movei %1,0\";\n    else if (INTVAL (operands[2]) == 1)\n      return \"sosg %1,%0\\;%_movei %1,1\";\n    else\n      return \"sosge %1,%0\\;%_seto %1,\";\n  })\n\n;; AOS m\n;; SKIPx m\t\t\t->\tAOSx m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int 1)))\n    (set (pc)\n\t (if_then_else\n\t  (match_operator 2 \"pdp10_comparison_operator\"\n\t   [(match_dup 0)\n\t    (const_int 0)])\n\t  (label_ref (match_operand 1 \"\" \"\"))\n\t  (pc)))]\n  \"\"\n  [(parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_op_dup 2\n\t    [(plus:SI (match_dup 0) (const_int 1))\n\t     (const_int 0)])\n\t   (label_ref (match_dup 1))\n\t   (pc)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int 1)))])])\n\n;; SOS m\n;; SKIPx m\t\t\t->\tSOSx m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int -1)))\n    (set (pc)\n\t (if_then_else\n\t  (match_operator 2 \"pdp10_comparison_operator\"\n\t   [(match_dup 0)\n\t    (const_int 0)])\n\t  (label_ref (match_operand 1 \"\" \"\"))\n\t  (pc)))]\n  \"\"\n  [(parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_op_dup 2\n\t    [(plus:SI (match_dup 0) (const_int -1))\n\t     (const_int 0)])\n\t   (label_ref (match_dup 1))\n\t   (pc)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int -1)))])])\n\n;; AOS m\n;; SKIPx a,m\t\t\t->\tAOSx a,m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int 1)))\n   (parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_operator 3 \"pdp10_comparison_operator\"\n\t    [(match_dup 0)\n\t     (const_int 0)])\n\t   (label_ref (match_operand 1 \"\" \"\"))\n\t   (pc)))\n     (set (match_operand:SI 2 \"register_operand\" \"\")\n\t  (match_dup 0))])]\n  \"REGNO (operands[2]) != 0\"\n  [(parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_op_dup 3\n\t    [(plus:SI (match_dup 0) (const_int 1))\n\t     (const_int 0)])\n\t   (label_ref (match_dup 1))\n\t   (pc)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int 1)))\n     (set (match_dup 2)\n\t  (plus:SI (match_dup 0) (const_int 1)))])])\n\n;; SOS m\n;; SKIPx a,m\t\t\t->\tSOSx a,m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int -1)))\n   (parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_operator 3 \"pdp10_comparison_operator\"\n\t    [(match_dup 0)\n\t     (const_int 0)])\n\t   (label_ref (match_operand 1 \"\" \"\"))\n\t   (pc)))\n     (set (match_operand:SI 2 \"register_operand\" \"\")\n\t  (match_dup 0))])]\n  \"REGNO (operands[2]) != 0\"\n  [(parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_op_dup 3\n\t    [(plus:SI (match_dup 0) (const_int -1))\n\t     (const_int 0)])\n\t   (label_ref (match_dup 1))\n\t   (pc)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int -1)))\n     (set (match_dup 2)\n\t  (plus:SI (match_dup 0) (const_int -1)))])])\n\n;; ADDI a,1\n;; JRST m\t\t\t->\tAOJA a,m\n;; The traditional peephole is needed to detect sequences after basic\n;; block reordering.  peephole2 is run before that.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int 1)))\n   (set (pc)\n\t(label_ref (match_operand 1 \"\" \"\")))]\n  \"\"\n  [(parallel\n    [(set (pc)\n\t  (label_ref (match_dup 1)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0)\n\t\t   (const_int 1)))])])\n(define_peephole\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int 1)))\n   (set (pc)\n\t(label_ref (match_operand 1 \"\" \"\")))]\n  \"\"\n  \"aoja %0,%l1\")\n\n;; SUBI a,1\n;; JRST m\t\t\t->\tSOJA a,m\n;; The traditional peephole is needed to detect sequences after basic\n;; block reordering.  peephole2 is run before that.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int -1)))\n   (set (pc)\n\t(label_ref (match_operand 1 \"\" \"\")))]\n  \"\"\n  [(parallel\n    [(set (pc)\n\t  (label_ref (match_dup 1)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0)\n\t\t   (const_int -1)))])])\n(define_peephole\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int -1)))\n   (set (pc)\n\t(label_ref (match_operand 1 \"\" \"\")))]\n  \"\"\n  \"soja %0,%l1\")\n\n;; AOS m1\n;; JRST m2\t\t\t->\tAOSA m1,m2 (if possible)\n;; TODO.\n\n;; SOS m1\n;; JRST m2\t\t\t->\tSOSA m1,m2 (if possible)\n;; TODO.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Miscellaneous\n\n;; UNSPEC_VOLATILE is considered to use and clobber all hard registers\n;; and all of memory.  This blocks insns from being moved across this\n;; point.\n(define_insn \"blockage\"\n  [(unspec_volatile [(const_int 0)] VUNSPEC_BLOCKAGE)]\n  \"\"\n  \"\"\n  [(set_attr \"length\" \"0\")])\n\n(define_insn \"*movqi_subreg\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(subreg:QI (match_operand:SI 1 \"register_operand\" \"r\") 3))]\n  \"\"\n  \"move %0,%1%; (set (reg:QI %0) (subreg:QI (reg:SI %1) 3)\")\n\n(define_insn \"\"\n  [(set (subreg:QI (match_operand:SI 0 \"register_operand\" \"=r\") 3)\n\t(match_operand:QI 1 \"register_operand\" \"r\"))]\n  \"\"\n  \"move %0,%1%; (set (subreg:QI (reg:SI %0) 3) (reg:QI %1)\")\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(subreg:QI (match_operand:SI 1 \"register_operand\" \"0\") 0))]\n  \"\"\n  \"lsh %0,-33%; (set (reg:QI %0) (subreg:QI (reg:SI %1) 0))\")\n\n(define_insn \"\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n\t(subreg:HI (match_operand:SI 1 \"register_operand\" \"r\") 0))]\n  \"\"\n  \"hlrz %0,%1%; (set (reg:HI %0) (subreg:HI (reg:SI %1) 0))\")\n\n(define_insn \"\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n\t(subreg:HI (match_operand:SI 1 \"register_operand\" \"r\") 2))]\n  \"\"\n  \"hrrz %0,%1%; (set (reg:HI %0) (subreg:HI (reg:SI %1) 2))\")\n\n(define_insn \"\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n\t(subreg:HI (zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t\t    (const_int 18)\n\t\t\t\t    (const_int 18))\n\t\t   0))]\n  \"\"\n  \"hrrz %0,%1%; (set (reg:HI %0) (subreg:HI (zero_extr:SI %1 18 18) 0))\")\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(subreg:QI (zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t\t    (const_int 9)\n\t\t\t\t    (const_int 27))\n\t\t   0))]\n  \"\"\n  ;; FIXME: will this do?\n  \"move %0,%1\"\n  [(set_attr \"length\" \"3\")])\n\n;; Only used in KA10 expansion of FIX.\n(define_insn \"TSC\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (xor:SI\n\t (match_dup 0)\n\t (ior:SI\n\t  (ashift:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")\n\t\t     (const_int 18))\n\t  (lshiftrt:SI (match_dup 1) (const_int 18)))))]\n  \"\"\n  \"tsc %0,%1\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t     (const_int 27)))]\n  \"\"\n  \"move %0,%1\\;ash %0,-33\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n        (subreg:QI (zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t\t    (const_int 9)\n\t\t\t\t    (const_int 0))\n\t\t   3))]\n  \"\"\n  {\n    rtx ops[4];\n    ops[0] = operands[0];\n    ops[1] = operands[1];\n    ops[2] = GEN_INT (9);\n    ops[3] = GEN_INT (0);\n    if (get_attr_length (insn) == 1)\n      output_asm_insn (pdp10_output_extzv (insn, ops), ops);\n    else\n      output_asm_insn (pdp10_output_extzv_sequence (ops), ops);\n    return \"\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ne (symbol_ref \"TARGET_LARGE\") (const_int 0))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))])\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(subreg:QI (zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t\t    (const_int 9)\n\t\t\t\t    (const_int 9))\n\t\t   3))]\n  \"\"\n  {\n    rtx ops[4];\n    ops[0] = operands[0];\n    ops[1] = operands[1];\n    ops[2] = GEN_INT (9);\n    ops[3] = GEN_INT (9);\n    output_asm_insn (pdp10_output_extzv (insn, ops), ops);\n    return \"\";\n  })\n"
  },
  {
    "path": "src/test/resources/samples/langs/GDB/as3.gdbinit",
    "content": "# -*- gdb-script -*-\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Interactive commands to help inspecting ActionScript execution state while debugging in gdb.\n#\n# To use this file, type from the gdb prompt: \n# source $(hg root)/utils/as3.gdbinit\n# or include in your .gdbinit.\n#\n# See gdb help for individual commands.\n#\n# In case of undefined symbols, try running the gdb 'where' command before aswhere.\n#\n# Typical use case:\n# (gdb) run\n# ^C\n# (gdb) where\n# (gdb) aswhere\n# (gdb) asframe 4    # select 4th AS3 frame from the top\n# (gdb) aslocal      # print locals\n# (gdb) aslocal 2    # print 2nd local as a C++ value\n# $42 = ....\n# (gdb) print *$42   # dereference  $42, assuming it's a pointer (to a ScriptObject or String)\n#\n# Note that the gdb scripting language is rather limited.\n#\n\ndefine aswhere\n  set var $fcount = avmplus::AvmCore::getActiveCore()->debugger()->frameCount()\n  set var $i = 0\n  while ($i < $fcount) \n    #  set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($k)\n    #  call (void)avmplus::Debugger::printFrame($k)\n    asprintframe $i\n    set var $i = $i + 1\n  end\nend\n\ndocument aswhere\nPrint backtrace of all the ActionScript stack frames.\nMay not work in all contexts (notably inside MMgc).\nMay not work properly until gdb 'where' is called at least once.\nend\n\nset var $_asframe_selected=-1\n\ndefine asprintframe \n  set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($arg0)\n  if ($frame == 0)\n    echo no frame\\n\n  else\n    aspstring avmplus::Debugger::methodNameAt($frame)\n    echo (\n    set var $vcount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_ARGUMENT)\n    set var $j = 0\n    while ($j < $vcount) \n      set var $argname = avmplus::Debugger::autoVarName($frame, $j, avmplus::Debugger::AUTO_ARGUMENT)\n      aspstring $argname \n      echo =\n      set var $_atom = avmplus::Debugger::autoAtomAt($frame, $j, avmplus::Debugger::AUTO_ARGUMENT)\n      call (void)avmplus::Debugger::printAtom($_atom)\n      set var $j = $j + 1\n      if ($j != $vcount) \n        echo ,\n      end\n    end\n    echo )\n    echo \\n\n  end\nend\n\n\ndefine asframe \n  if ($argc != 0)\n    set var $_asframe_selected=$arg0\n  end\n  if ($_asframe_selected >= 0)\n    asprintframe $_asframe_selected\n  else\n    echo no frame\\n\n  end\nend\n\ndocument asframe\nSelect and print an ActionScript stack frame.\nWith no argument, print the selected AS stack frame.\nAn argument specifies the number of the stack frame to select.\nend\n\n\ndefine aspstring\n  call (void)avmplus::Debugger::printString($arg0)\nend\n\ndocument aspstring\nPrint the AS3 string.\nend\n\n# not pretty, but there's no switch\ndefine aslocal\n  set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected)\n  if ($frame == 0)\n    echo no frame\\n\n  else\n    if $argc == 0\n      set var $lcount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_LOCAL)\n      set var $k = 0\n      while ($k < $lcount) \n        set var $lname = avmplus::Debugger::autoVarName($frame, $k, avmplus::Debugger::AUTO_LOCAL)\n        output $k\n        echo :\\ \\  \n        aspstring $lname\n        echo :\\ \\ \n        aslocal $k\n        set var $k = $k + 1\n      end\n    else\n      set var $_last_type=avmplus::Debugger::autoAtomKindAt($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      if ($_last_type == 0)\n        echo unknown\\n\n      end\n      if ($_last_type == 1)\n        call avmplus::Debugger::autoVarAsObject($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      end\n      if ($_last_type == 2)\n        call avmplus::Debugger::autoVarAsString($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      end\n      if ($_last_type == 3)\n        ecno namespace (unfinished)\\n\n      end\n      if ($_last_type == 4)\n        echo undefined\\n\n      end\n      if ($_last_type == 5)\n        call avmplus::Debugger::autoVarAsBoolean($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      end\n      if ($_last_type == 6)\n        call avmplus::Debugger::autoVarAsInteger($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      end\n      if ($_last_type == 7)\n        call avmplus::Debugger::autoVarAsDouble($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      end\n    end\n  end\nend\n\ndocument aslocal \nPrint local variables of the currently selected AS stack frame, if debuging information present.\nInformation may be incorrect if not at a debugger safepoint.\nWith no argument, print all the local variables.\nWith a numeric argument print the specific local variable (gdb will store value in history \nfor further manipulation).\nend\n\ndefine asarg\n  set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected)\n  if ($frame == 0)\n    echo no frame\\n\n  else\n    if $argc == 0\n      set var $acount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_ARGUMENT)\n      set var $k = 0\n      while ($k < $acount) \n        set var $name = avmplus::Debugger::autoVarName($frame, $k, avmplus::Debugger::AUTO_ARGUMENT)\n        output $k\n        echo :\\ \\  \n        aspstring $name\n        echo :\\ \\ \n        asarg $k\n        set var $k = $k + 1\n      end\n    else\n      set var $_last_type=avmplus::Debugger::autoAtomKindAt($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      if ($_last_type == 0)\n        echo unknown\\n\n      end\n      if ($_last_type == 1)\n        print avmplus::Debugger::autoVarAsObject($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      end\n      if ($_last_type == 2)\n        print avmplus::Debugger::autoVarAsString($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      end\n      if ($_last_type == 3)\n        echo namespace (unfinished)\\n\n      end\n      if ($_last_type == 4)\n        echo undefined\\n\n      end\n      if ($_last_type == 5)\n        print avmplus::Debugger::autoVarAsBoolean($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      end\n      if ($_last_type == 6)\n        print avmplus::Debugger::autoVarAsInteger($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      end\n      if ($_last_type == 7)\n        print avmplus::Debugger::autoVarAsDouble($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      end\n    end\n  end\nend\n\ndocument asarg \nPrint arguments of the currently selected AS stack frame.\nIf no debugging information is available, argument names will not be printed.\nWith no argument, print all the arguments.\nWith a numeric argument print the specific argument (gdb will store value in history \nfor further manipulation).\nend\n\n\ndefine asthis\n  set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected)\n  if ($frame == 0)\n    echo no frame\\n\n  else\n    print avmplus::Debugger::autoVarAsObject($frame, 0, avmplus::Debugger::AUTO_THIS) \n  end\nend\n\ndocument asthis\nPrint the receiver of the currently selected frame.\nend\n\ndefine asmixon\n  print avmshell::DebugCLI::debuggerInterruptOnEnter\n  print avmshell::DebugCLI::debuggerInterruptOnEnter = true\nend\n\ndocument asmixon\n  turn on stepping.\n  Execution will return to gdb propmpt after asstep* instructions.\n  Requires debugging symbols in .abcs\nend\n\ndefine asstepout\n  call  avmplus::AvmCore::getActiveCore()->debugger()->stepOut()\n  continue\n  asprintframe 0\nend\n\ndefine asstepinto\n  output avmplus::AvmCore::getActiveCore()->debugger()->stepInto()\n  continue\n  asprintframe 0\nend\n\ndefine asstepover\n  output avmplus::AvmCore::getActiveCore()->debugger()->stepOver()\n  continue\n  asprintframe 0\nend\n\n\ndefine asprint\n  aspstring $arg0->traits()->name()\n  echo \\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/GDB/gdb_lpc17xx_program.gdb",
    "content": "#\r\n# MicropendousX LPC17xx Development Board\r\n#\r\n# http://www.MicropendousX.org\r\n#\r\n# Connect to a debugger controlling a LPC17xx\r\n# and download firmware.\r\n#\r\n# Start your OpenOCD gdb server before running\r\n# this script with:  arm-none-eabi-gdb -x gdb_lpc17xx_program.gdb\r\n#\r\n# Note the 'monitor' command just passes its\r\n# arguments to OpenOCD\r\n#\r\n# This file is released under the MIT License\r\n#\r\n\r\n# Connect to OpenOCD gdb server\r\ntarget remote localhost:3333\r\n\r\n# reset the LPC17xx IC with the OpenOCD reset command\r\nmonitor reset\r\n\r\n# the following are OpenOCD commands as in OpenOCD_program.script\r\n# which will download a hex file into your LPC17xx\r\nmonitor halt\r\nmonitor sleep 200\r\nmonitor wait_halt\r\nmonitor flash probe 0\r\nmonitor flash info 0\r\nmonitor flash write_image erase unlock USBtoSerial.hex\r\nmonitor sleep 200\r\nmonitor reset run\r\nmonitor exit\r\n\r\nquit\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/GDScript/example.gd",
    "content": "# Taken from https://github.com/okamstudio/godot/wiki/gdscript\n# a file is a class!\n\n# inheritance\n\nextends BaseClass\n\n# member variables\n\nvar a = 5 \nvar s = \"Hello\"\nvar arr = [1, 2, 3]\nvar dict = {\"key\":\"value\", 2:3}\n\n# constants\n\nconst answer = 42\nconst thename = \"Charly\"\n\n# built-in vector types\n\nvar v2 = Vector2(1, 2)\nvar v3 = Vector3(1, 2, 3)\n\n# function\n\nfunc some_function(param1, param2):\n    var local_var = 5\n\n    if param1 < local_var:\n        print(param1)\n    elif param2 > 5:\n        print(param2)\n    else:\n        print(\"fail!\")\n\n    for i in range(20):\n        print(i)\n\n    while(param2 != 0):\n        param2 -= 1\n\n    var local_var2 = param1+3\n    return local_var2\n\n\n# subclass\n\nclass Something:\n    var a = 10\n\n# constructor\n\nfunc _init():\n    print(\"constructed!\")\n    var lv = Something.new()\n    print(lv.a)\n"
  },
  {
    "path": "src/test/resources/samples/langs/GDScript/grid.gd",
    "content": "\n\nextends Control\n\n# Simple Tetris-like demo, (c) 2012 Juan Linietsky\n# Implemented by using a regular Control and drawing on it during the _draw() callback.\n# The drawing surface is updated only when changes happen (by calling update())\n\n\nvar score = 0\nvar score_label=null\n\nconst MAX_SHAPES = 7\n\nvar block = preload(\"block.png\")\n\nvar block_colors=[\n\tColor(1,0.5,0.5),\n\tColor(0.5,1,0.5),\n\tColor(0.5,0.5,1),\n\tColor(0.8,0.4,0.8),\n\tColor(0.8,0.8,0.4),\n\tColor(0.4,0.8,0.8),\n\tColor(0.7,0.7,0.7)]\n\nvar\tblock_shapes=[\n\t[ Vector2(0,-1),Vector2(0,0),Vector2(0,1),Vector2(0,2) ], # I\n\t[ Vector2(0,0),Vector2(1,0),Vector2(1,1),Vector2(0,1) ], # O\n\t[ Vector2(-1,1),Vector2(0,1),Vector2(0,0),Vector2(1,0) ], # S\n\t[ Vector2(1,1),Vector2(0,1),Vector2(0,0),Vector2(-1,0) ], # Z\n\t[ Vector2(-1,1),Vector2(-1,0),Vector2(0,0),Vector2(1,0) ], # L\n\t[ Vector2(1,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ], # J\n\t[ Vector2(0,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ]] # T\n\t\n\nvar block_rotations=[\n\tMatrix32( Vector2(1,0),Vector2(0,1), Vector2() ),\n\tMatrix32( Vector2(0,1),Vector2(-1,0), Vector2() ),\n\tMatrix32( Vector2(-1,0),Vector2(0,-1), Vector2() ),\n\tMatrix32( Vector2(0,-1),Vector2(1,0), Vector2() )\n]\n\t\n\nvar width=0\nvar height=0\n\nvar cells={}\n\nvar piece_active=false\nvar piece_shape=0\nvar piece_pos=Vector2()\nvar piece_rot=0\n\n\nfunc piece_cell_xform(p,er=0):\n\tvar r = (4+er+piece_rot)%4\n\treturn piece_pos+block_rotations[r].xform(p)\n\nfunc _draw():\n\n\tvar sb = get_stylebox(\"bg\",\"Tree\") # use line edit bg\n\tdraw_style_box(sb,Rect2(Vector2(),get_size()).grow(3))\n\t\n\tvar bs = block.get_size()\n\tfor y in range(height):\n\t\tfor x in range(width):\n\t\t\tif (Vector2(x,y) in cells):\n\t\t\t\tdraw_texture_rect(block,Rect2(Vector2(x,y)*bs,bs),false,block_colors[cells[Vector2(x,y)]])\n\t\t\t\t\n\tif (piece_active):\n\t\t\n\t\tfor c in block_shapes[piece_shape]:\n\t\t\tdraw_texture_rect(block,Rect2(piece_cell_xform(c)*bs,bs),false,block_colors[piece_shape])\n\t\t\t\n\nfunc piece_check_fit(ofs,er=0):\n\n\tfor c in block_shapes[piece_shape]:\n\t\tvar pos = piece_cell_xform(c,er)+ofs\n\t\tif (pos.x < 0):\n\t\t\treturn false\n\t\tif (pos.y < 0):\n\t\t\treturn false\n\t\tif (pos.x >= width):\n\t\t\treturn false\n\t\tif (pos.y >= height):\n\t\t\treturn false\n\t\tif (pos in cells):\n\t\t\treturn false\n\t\n\treturn true\t\n\nfunc new_piece():\n\n\tpiece_shape = randi() % MAX_SHAPES\t\n\tpiece_pos = Vector2(width/2,0)\n\tpiece_active=true\n\tpiece_rot=0\n\tif (piece_shape==0):\n\t\tpiece_pos.y+=1\n\t\t\n\tif (not piece_check_fit(Vector2())):\n\t\t#game over\n\t\t#print(\"GAME OVER!\")\n\t\tgame_over()\n\t\t\n\tupdate()\n\t\t\n\t\nfunc test_collapse_rows():\n\tvar accum_down=0\n\tfor i in range(height):\n\t\tvar y = height - i - 1\n\t\tvar collapse = true\n\t\tfor x in range(width):\n\t\t\tif (Vector2(x,y) in cells):\n\t\t\t\tif (accum_down):\n\t\t\t\t\tcells[ Vector2(x,y+accum_down) ] = cells[Vector2(x,y)]\n\t\t\telse:\n\t\t\t\tcollapse=false\n\t\t\t\tif (accum_down):\n\t\t\t\t\tcells.erase( Vector2(x,y+accum_down) )\n\t\t\t\t\t\t\n\t\tif (collapse):\n\t\t\taccum_down+=1\n\t\t\n\t\t\t\n\tscore+=accum_down*100\n\tscore_label.set_text(str(score))\n\t\t\t\n\t\t\nfunc game_over():\n\n\t\tpiece_active=false\n\t\tget_node(\"gameover\").set_text(\"Game Over\")\t\t\n\t\tupdate()\n\t\t\t\t\n\t\t\nfunc restart_pressed():\n\n\t\tscore=0\n\t\tscore_label.set_text(\"0\")\n\t\tcells.clear()\n\t\tget_node(\"gameover\").set_text(\"\")\t\t\n\t\tpiece_active=true\n\t\tupdate()\n\t\t\n\t\t\n\nfunc piece_move_down():\n\n\tif (!piece_active):\n\t\treturn\n\tif (piece_check_fit(Vector2(0,1))):\n\t\tpiece_pos.y+=1\n\t\tupdate()\t\t\n\telse:\n\n\t\tfor c in block_shapes[piece_shape]:\n\t\t\tvar pos = piece_cell_xform(c)\n\t\t\tcells[pos]=piece_shape\n\t\ttest_collapse_rows()\n\t\tnew_piece()\n\t\t\n\nfunc piece_rotate():\n\n\tvar adv = 1\n\tif (not piece_check_fit(Vector2(),1)):\n\t\treturn\n\tpiece_rot = (piece_rot + adv) % 4\n\tupdate()\n\t\n\t\n\nfunc _input(ie):\n\n\n\tif (not piece_active):\n\t\treturn\n\tif (!ie.is_pressed()):\n\t\treturn\n\n\tif (ie.is_action(\"move_left\")):\n\t\tif (piece_check_fit(Vector2(-1,0))):\n\t\t\tpiece_pos.x-=1\n\t\t\tupdate()\n\telif (ie.is_action(\"move_right\")):\n\t\tif (piece_check_fit(Vector2(1,0))):\n\t\t\tpiece_pos.x+=1\n\t\t\tupdate()\n\telif (ie.is_action(\"move_down\")):\n\t\tpiece_move_down()\n\telif (ie.is_action(\"rotate\")):\n\t\tpiece_rotate()\n\t\t\n\t\t\nfunc setup(w,h):\n\twidth=w\n\theight=h\n\tset_size( Vector2(w,h)*block.get_size() )\n\tnew_piece()\n\tget_node(\"timer\").start()\n\t\n\nfunc _ready():\n\t# Initalization here\n\n\tsetup(10,20)\n\tscore_label = get_node(\"../score\")\n\n\tset_process_input(true)\n\n\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/GDScript/player.gd",
    "content": "\nextends RigidBody\n\n# member variables here, example:\n# var a=2\n# var b=\"textvar\"\n\n#var dir=Vector3()\n\nconst ANIM_FLOOR = 0\nconst ANIM_AIR_UP = 1\nconst ANIM_AIR_DOWN = 2\n\nconst SHOOT_TIME = 1.5\nconst SHOOT_SCALE = 2\n\nconst CHAR_SCALE = Vector3(0.3,0.3,0.3)\n\nvar facing_dir = Vector3(1, 0, 0)\nvar movement_dir = Vector3()\n\nvar jumping=false\n\nvar turn_speed=40\nvar keep_jump_inertia = true\nvar air_idle_deaccel = false\nvar accel=19.0\nvar deaccel=14.0\nvar sharp_turn_threshhold = 140\n\nvar max_speed=3.1\nvar on_floor = false\n\nvar prev_shoot = false\n\nvar last_floor_velocity = Vector3()\n\nvar shoot_blend = 0\n\nfunc adjust_facing(p_facing, p_target,p_step, p_adjust_rate,current_gn):\n\n\tvar n = p_target # normal\n\tvar t = n.cross(current_gn).normalized()\n\t\n\tvar x = n.dot(p_facing)\n\tvar y = t.dot(p_facing)\n\t\n\tvar ang = atan2(y,x)\n\t\n\tif (abs(ang)<0.001): # too small\n\t\treturn p_facing\n\t\n\tvar s = sign(ang)\n\tang = ang * s\n\tvar turn = ang * p_adjust_rate * p_step\n\tvar a\n\tif (ang<turn):\n\t\ta=ang\n\telse:\n\t\ta=turn\n\tang = (ang - a) * s\n\t\n\treturn ((n * cos(ang)) + (t * sin(ang))) * p_facing.length()\n\n\n\nfunc _integrate_forces( state ):\n\n\tvar lv = state.get_linear_velocity() # linear velocity\n\tvar g = state.get_total_gravity()\n\tvar delta = state.get_step()\n\tvar d = 1.0 - delta*state.get_total_density()\n\tif (d<0):\n\t\td=0\n\tlv += g * delta #apply gravity\n\n\tvar anim = ANIM_FLOOR\n\n\tvar up = -g.normalized() # (up is against gravity)\n\tvar vv = up.dot(lv) # vertical velocity\n\tvar hv = lv - (up*vv) # horizontal velocity\n\n\n\n\tvar hdir = hv.normalized() # horizontal direction\n\tvar hspeed = hv.length()\t#horizontal speed\n\n\tvar floor_velocity\n\tvar onfloor = false\n\n\tif (state.get_contact_count() == 0):\n\t\tfloor_velocity = last_floor_velocity\n\telse:\n\t\tfor i in range(state.get_contact_count()):\n\t\t\tif (state.get_contact_local_shape(i) != 1):\n\t\t\t\tcontinue\n\t\t\t\n\t\t\tonfloor = true\n\t\t\tfloor_velocity = state.get_contact_collider_velocity_at_pos(i)\n\t\t\tbreak\n\t\t\n\n\tvar dir = Vector3() #where does the player intend to walk to\n\tvar cam_xform = get_node(\"target/camera\").get_global_transform()\n\t\n\tif (Input.is_action_pressed(\"move_forward\")):\n\t\tdir+=-cam_xform.basis[2] \n\tif (Input.is_action_pressed(\"move_backwards\")):\n\t\tdir+=cam_xform.basis[2] \n\tif (Input.is_action_pressed(\"move_left\")):\n\t\tdir+=-cam_xform.basis[0] \n\tif (Input.is_action_pressed(\"move_right\")):\n\t\tdir+=cam_xform.basis[0] \n\t\t\n\tvar jump_attempt = Input.is_action_pressed(\"jump\")\n\tvar shoot_attempt = Input.is_action_pressed(\"shoot\")\n\t\t\n\tvar target_dir = (dir - up*dir.dot(up)).normalized()\n\t\n\tif (onfloor):\n\n\t\tvar sharp_turn = hspeed > 0.1 and rad2deg(acos(target_dir.dot(hdir))) > sharp_turn_threshhold\n\n\t\tif (dir.length()>0.1 and !sharp_turn) :\n\t\t\tif (hspeed > 0.001) :\n\n\t\t\t\t#linear_dir = linear_h_velocity/linear_vel\n\t\t\t\t#if (linear_vel > brake_velocity_limit and linear_dir.dot(ctarget_dir)<-cos(Math::deg2rad(brake_angular_limit)))\n\t\t\t\t#\tbrake=true\n\t\t\t\t#else\n\t\t\t\thdir = adjust_facing(hdir,target_dir,delta,1.0/hspeed*turn_speed,up)\n\t\t\t\tfacing_dir = hdir\n\t\t\telse:\n\n\t\t\t\thdir = target_dir\n\t\t\t\n\t\t\tif (hspeed<max_speed):\n\t\t\t\thspeed+=accel*delta\n\n\t\telse:\n\t\t\thspeed-=deaccel*delta\n\t\t\tif (hspeed<0):\n\t\t\t\thspeed=0\n\t\t\n\t\thv = hdir*hspeed\n\t\t\n\t\tvar mesh_xform = get_node(\"Armature\").get_transform() \n\t\tvar facing_mesh=-mesh_xform.basis[0].normalized()\n\t\tfacing_mesh = (facing_mesh - up*facing_mesh.dot(up)).normalized()\n\t\tfacing_mesh = adjust_facing(facing_mesh,target_dir,delta,1.0/hspeed*turn_speed,up)\n\t\tvar m3 = Matrix3(-facing_mesh,up,-facing_mesh.cross(up).normalized()).scaled( CHAR_SCALE )\n\t\t\n\t\tget_node(\"Armature\").set_transform(Transform(m3,mesh_xform.origin))\n\t\t\t\t\n\t\tif (not jumping and jump_attempt):\n\t\t\tvv = 7.0\n\t\t\tjumping = true\t\t\n\t\t\tget_node(\"sfx\").play(\"jump\")\n\telse:\n\n\t\tif (vv>0):\n\t\t\tanim=ANIM_AIR_UP\n\t\telse:\n\t\t\tanim=ANIM_AIR_DOWN\n\t\t\t\n\t\tvar hs\n\t\tif (dir.length()>0.1):\n\n\t\t\thv += target_dir * (accel * 0.2) * delta\n\t\t\tif (hv.length() > max_speed):\n\t\t\t\thv = hv.normalized() * max_speed\n\n\t\telse:\n\n\t\t\tif (air_idle_deaccel):\n\t\t\t\thspeed = hspeed - (deaccel * 0.2) * delta\n\t\t\t\tif (hspeed<0):\n\t\t\t\t\thspeed=0\n\n\t\t\t\thv = hdir*hspeed\n\t\t\t\n\t\t\n\tif (jumping and vv < 0):\n\t\tjumping=false\n\n\tlv = hv+up*vv\n\t\n\t\n\n\tif (onfloor):\n\n\t\tmovement_dir = lv\n\t\t#lv += floor_velocity\n\t\tlast_floor_velocity = floor_velocity\n\telse:\n\n\t\tif (on_floor) :\n\n\t\t\t#if (keep_jump_inertia):\n\t\t\t#\tlv += last_floor_velocity\n\t\t\tpass\n\t\t\n\t\tlast_floor_velocity = Vector3()\n\t\tmovement_dir = lv\n\t\n\ton_floor = onfloor\n\n\tstate.set_linear_velocity(lv)\n\t\n\tif (shoot_blend>0):\n\t\tshoot_blend -= delta * SHOOT_SCALE\n\t\tif (shoot_blend<0):\n\t\t\tshoot_blend=0\n\t\n\tif (shoot_attempt and not prev_shoot):\n\t\tshoot_blend = SHOOT_TIME\t\t\n\t\tvar bullet = preload(\"res://bullet.scn\").instance()\n\t\tbullet.set_transform( get_node(\"Armature/bullet\").get_global_transform().orthonormalized() )\n\t\tget_parent().add_child( bullet )\n\t\tbullet.set_linear_velocity( get_node(\"Armature/bullet\").get_global_transform().basis[2].normalized() * 20 )\n\t\tPS.body_add_collision_exception( bullet.get_rid(), get_rid() ) #add it to bullet\n\t\tget_node(\"sfx\").play(\"shoot\")\n\t\t\n\tprev_shoot = shoot_attempt\n\t\n\tif (onfloor):\n\t\tget_node(\"AnimationTreePlayer\").blend2_node_set_amount(\"walk\",hspeed / max_speed)\n\t\t\n\tget_node(\"AnimationTreePlayer\").transition_node_set_current(\"state\",anim)\n\tget_node(\"AnimationTreePlayer\").blend2_node_set_amount(\"gun\",min(shoot_blend,1.0))\n#\tstate.set_angular_velocity(Vector3())\t\n\t\n\t\n\n\nfunc _ready():\n\n\n\t# Initalization here\n\tget_node(\"AnimationTreePlayer\").set_active(true)\n\tpass\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/GDScript/pong.gd",
    "content": "\nextends Node2D\n\n# member variables here, example:\n# var a=2\n# var b=\"textvar\"\nconst INITIAL_BALL_SPEED = 80\nvar ball_speed = INITIAL_BALL_SPEED\nvar screen_size = Vector2(640,400)\n#default ball direction\nvar direction = Vector2(-1,0)\nvar pad_size = Vector2(8,32)\nconst PAD_SPEED = 150\n\n\nfunc _process(delta):\n\n\n\t# get ball positio and pad rectangles\n\tvar ball_pos = get_node(\"ball\").get_pos()\n\tvar left_rect = Rect2( get_node(\"left\").get_pos() - pad_size*0.5, pad_size )\n\tvar right_rect = Rect2( get_node(\"right\").get_pos() - pad_size*0.5, pad_size )\n\t\n\t#integrate new ball postion\n\tball_pos+=direction*ball_speed*delta\n\t\n\t#flip when touching roof or floor\n\tif ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)):\n\t\tdirection.y = -direction.y\n\t\t\n\t#flip, change direction and increase speed when touching pads\t\n\tif ( (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0)):\n\t\tdirection.x=-direction.x\n\t\tball_speed*=1.1\n\t\tdirection.y=randf()*2.0-1\n\t\tdirection = direction.normalized()\n\n\t#check gameover\n\tif (ball_pos.x<0 or ball_pos.x>screen_size.x):\n\t\tball_pos=screen_size*0.5\n\t\tball_speed=INITIAL_BALL_SPEED\n\t\tdirection=Vector2(-1,0)\n\t\t\t\n\t\t\t\t\t\t\n\tget_node(\"ball\").set_pos(ball_pos)\n\n\t#move left pad\t\n\tvar left_pos = get_node(\"left\").get_pos()\n\t\n\tif (left_pos.y > 0 and Input.is_action_pressed(\"left_move_up\")):\n\t\tleft_pos.y+=-PAD_SPEED*delta\n\tif (left_pos.y < screen_size.y and Input.is_action_pressed(\"left_move_down\")):\n\t\tleft_pos.y+=PAD_SPEED*delta\n\t\t\n\tget_node(\"left\").set_pos(left_pos)\n\t\t\n\t#move right pad\t\n\tvar right_pos = get_node(\"right\").get_pos()\n\t\n\tif (right_pos.y > 0 and Input.is_action_pressed(\"right_move_up\")):\n\t\tright_pos.y+=-PAD_SPEED*delta\n\tif (right_pos.y < screen_size.y and Input.is_action_pressed(\"right_move_down\")):\n\t\tright_pos.y+=PAD_SPEED*delta\n\t\t\n\tget_node(\"right\").set_pos(right_pos)\n\t\n\t \n\nfunc _ready():\n\tscreen_size = get_viewport_rect().size # get actual size\n\tpad_size = get_node(\"left\").get_texture().get_size()\n\tset_process(true)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/SimpleLighting.gl2.frag",
    "content": "static const char* SimpleFragmentShader = STRINGIFY(\n\nvarying vec4 FrontColor;\n\nvoid main(void)\n{\n    gl_FragColor = FrontColor;\n}\n);\n"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/SyLens.glsl",
    "content": "#version 120\n\n/*\n  Original Lens Distortion Algorithm from SSontech (Syntheyes)\n  http://www.ssontech.com/content/lensalg.htm\n  \n  r2 is radius squared.\n  \n  r2 = image_aspect*image_aspect*u*u + v*v\n  f = 1 + r2*(k + kcube*sqrt(r2))\n  u' = f*u\n  v' = f*v\n\n*/\n\n// Controls\nuniform float kCoeff, kCube, uShift, vShift;\nuniform float chroma_red, chroma_green, chroma_blue;\nuniform bool apply_disto;\n\n// Uniform inputs\nuniform sampler2D input1;\nuniform float adsk_input1_w, adsk_input1_h, adsk_input1_aspect, adsk_input1_frameratio;\nuniform float adsk_result_w, adsk_result_h;\n\nfloat distortion_f(float r) {\n    float f = 1 + (r*r)*(kCoeff + kCube * r);\n    return f;\n}\n\n\nfloat inverse_f(float r)\n{\n    \n    // Build a lookup table on the radius, as a fixed-size table.\n    // We will use a vec3 since we will store the multipled number in the Z coordinate.\n    // So to recap: x will be the radius, y will be the f(x) distortion, and Z will be x * y;\n    vec3[48] lut;\n    \n    // Since out LUT is shader-global check if it's been computed alrite\n    // Flame has no overflow bbox so we can safely max out at the image edge, plus some cushion\n    float max_r = sqrt((adsk_input1_frameratio * adsk_input1_frameratio) + 1) + 0.1;\n    float incr = max_r / 48;\n    float lut_r = 0;\n    float f;\n    for(int i=0; i < 48; i++) {\n        f = distortion_f(lut_r);\n        lut[i] = vec3(lut_r, f, lut_r * f);\n        lut_r += incr;\n    }\n    \n    float t;\n    // Now find the nehgbouring elements\n    // only iterate to 46 since we will need\n    // 47 as i+1\n    for(int i=0; i < 47; i++) {\n        if(lut[i].z < r && lut[i+1].z > r) {\n            // BAM! our value is between these two segments\n            // get the T interpolant and mix\n            t = (r - lut[i].z) / (lut[i+1].z - lut[i]).z;\n            return mix(lut[i].y, lut[i+1].y, t );\n        }\n    }\n}\n\nfloat aberrate(float f, float chroma)\n{\n   return f + (f * chroma);\n}\n\nvec3 chromaticize_and_invert(float f)\n{\n   vec3 rgb_f = vec3(aberrate(f, chroma_red), aberrate(f, chroma_green), aberrate(f, chroma_blue));\n   // We need to DIVIDE by F when we redistort, and x / y == x * (1 / y)\n   if(apply_disto) {\n      rgb_f = 1 / rgb_f;\n   }\n   return rgb_f;\n}\n\nvoid main(void)\n{\n   vec2 px, uv;\n   float f = 1;\n   float r = 1;\n   \n   px = gl_FragCoord.xy;\n   \n   // Make sure we are still centered\n   px.x -= (adsk_result_w - adsk_input1_w) / 2;\n   px.y -= (adsk_result_h - adsk_input1_h) / 2;\n   \n   // Push the destination coordinates into the [0..1] range\n   uv.x = px.x / adsk_input1_w;\n   uv.y = px.y / adsk_input1_h;\n   \n       \n   // And to Syntheyes UV which are [1..-1] on both X and Y\n   uv.x = (uv.x *2 ) - 1;\n   uv.y = (uv.y *2 ) - 1;\n   \n   // Add UV shifts\n   uv.x += uShift;\n   uv.y += vShift;\n   \n   // Make the X value the aspect value, so that the X coordinates go to [-aspect..aspect]\n   uv.x = uv.x * adsk_input1_frameratio;\n   \n   // Compute the radius\n   r = sqrt(uv.x*uv.x + uv.y*uv.y);\n   \n   // If we are redistorting, account for the oversize plate in the input, assume that\n   // the input aspect is the same\n   if(apply_disto) {\n       r = r / (float(adsk_input1_w) / float(adsk_result_w));\n   }\n   \n   // Apply or remove disto, per channel honoring chromatic aberration\n   if(apply_disto) {\n      f = inverse_f(r);\n   } else {\n      f = distortion_f(r);\n   }\n   \n   vec2[3] rgb_uvs = vec2[](uv, uv, uv);\n   \n   // Compute distortions per component\n   vec3 rgb_f = chromaticize_and_invert(f);\n   \n   // Apply the disto coefficients, per component\n   rgb_uvs[0] = rgb_uvs[0] * rgb_f.rr;\n   rgb_uvs[1] = rgb_uvs[1] * rgb_f.gg;\n   rgb_uvs[2] = rgb_uvs[2] * rgb_f.bb;\n   \n   // Convert all the UVs back to the texture space, per color component\n   for(int i=0; i < 3; i++) {\n       uv = rgb_uvs[i];\n       \n       // Back from [-aspect..aspect] to [-1..1]\n       uv.x = uv.x / adsk_input1_frameratio;\n       \n       // Remove UV shifts\n       uv.x -= uShift;\n       uv.y -= vShift;\n       \n       // Back to OGL UV\n       uv.x = (uv.x + 1) / 2;\n       uv.y = (uv.y + 1) / 2;\n       \n       rgb_uvs[i] = uv;\n   }\n   \n   // Sample the input plate, per component\n   vec4 sampled;\n   sampled.r = texture2D(input1, rgb_uvs[0]).r;\n   sampled.g = texture2D(input1, rgb_uvs[1]).g;\n   sampled.b = texture2D(input1, rgb_uvs[2]).b;\n   \n   // and assign to the output\n   gl_FragColor.rgba = vec4(sampled.rgb, 1.0 );\n}"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/SyLens.shader",
    "content": "#version 120\n\n/*\n  Original Lens Distortion Algorithm from SSontech (Syntheyes)\n  http://www.ssontech.com/content/lensalg.htm\n  \n  r2 is radius squared.\n  \n  r2 = image_aspect*image_aspect*u*u + v*v\n  f = 1 + r2*(k + kcube*sqrt(r2))\n  u' = f*u\n  v' = f*v\n\n*/\n\n// Controls\nuniform float kCoeff, kCube, uShift, vShift;\nuniform float chroma_red, chroma_green, chroma_blue;\nuniform bool apply_disto;\n\n// Uniform inputs\nuniform sampler2D input1;\nuniform float adsk_input1_w, adsk_input1_h, adsk_input1_aspect, adsk_input1_frameratio;\nuniform float adsk_result_w, adsk_result_h;\n\nfloat distortion_f(float r) {\n    float f = 1 + (r*r)*(kCoeff + kCube * r);\n    return f;\n}\n\n\nfloat inverse_f(float r)\n{\n    \n    // Build a lookup table on the radius, as a fixed-size table.\n    // We will use a vec3 since we will store the multipled number in the Z coordinate.\n    // So to recap: x will be the radius, y will be the f(x) distortion, and Z will be x * y;\n    vec3[48] lut;\n    \n    // Since out LUT is shader-global check if it's been computed alrite\n    // Flame has no overflow bbox so we can safely max out at the image edge, plus some cushion\n    float max_r = sqrt((adsk_input1_frameratio * adsk_input1_frameratio) + 1) + 0.1;\n    float incr = max_r / 48;\n    float lut_r = 0;\n    float f;\n    for(int i=0; i < 48; i++) {\n        f = distortion_f(lut_r);\n        lut[i] = vec3(lut_r, f, lut_r * f);\n        lut_r += incr;\n    }\n    \n    float t;\n    // Now find the nehgbouring elements\n    // only iterate to 46 since we will need\n    // 47 as i+1\n    for(int i=0; i < 47; i++) {\n        if(lut[i].z < r && lut[i+1].z > r) {\n            // BAM! our value is between these two segments\n            // get the T interpolant and mix\n            t = (r - lut[i].z) / (lut[i+1].z - lut[i]).z;\n            return mix(lut[i].y, lut[i+1].y, t );\n        }\n    }\n}\n\nfloat aberrate(float f, float chroma)\n{\n   return f + (f * chroma);\n}\n\nvec3 chromaticize_and_invert(float f)\n{\n   vec3 rgb_f = vec3(aberrate(f, chroma_red), aberrate(f, chroma_green), aberrate(f, chroma_blue));\n   // We need to DIVIDE by F when we redistort, and x / y == x * (1 / y)\n   if(apply_disto) {\n      rgb_f = 1 / rgb_f;\n   }\n   return rgb_f;\n}\n\nvoid main(void)\n{\n   vec2 px, uv;\n   float f = 1;\n   float r = 1;\n   \n   px = gl_FragCoord.xy;\n   \n   // Make sure we are still centered\n   px.x -= (adsk_result_w - adsk_input1_w) / 2;\n   px.y -= (adsk_result_h - adsk_input1_h) / 2;\n   \n   // Push the destination coordinates into the [0..1] range\n   uv.x = px.x / adsk_input1_w;\n   uv.y = px.y / adsk_input1_h;\n   \n       \n   // And to Syntheyes UV which are [1..-1] on both X and Y\n   uv.x = (uv.x *2 ) - 1;\n   uv.y = (uv.y *2 ) - 1;\n   \n   // Add UV shifts\n   uv.x += uShift;\n   uv.y += vShift;\n   \n   // Make the X value the aspect value, so that the X coordinates go to [-aspect..aspect]\n   uv.x = uv.x * adsk_input1_frameratio;\n   \n   // Compute the radius\n   r = sqrt(uv.x*uv.x + uv.y*uv.y);\n   \n   // If we are redistorting, account for the oversize plate in the input, assume that\n   // the input aspect is the same\n   if(apply_disto) {\n       r = r / (float(adsk_input1_w) / float(adsk_result_w));\n   }\n   \n   // Apply or remove disto, per channel honoring chromatic aberration\n   if(apply_disto) {\n      f = inverse_f(r);\n   } else {\n      f = distortion_f(r);\n   }\n   \n   vec2[3] rgb_uvs = vec2[](uv, uv, uv);\n   \n   // Compute distortions per component\n   vec3 rgb_f = chromaticize_and_invert(f);\n   \n   // Apply the disto coefficients, per component\n   rgb_uvs[0] = rgb_uvs[0] * rgb_f.rr;\n   rgb_uvs[1] = rgb_uvs[1] * rgb_f.gg;\n   rgb_uvs[2] = rgb_uvs[2] * rgb_f.bb;\n   \n   // Convert all the UVs back to the texture space, per color component\n   for(int i=0; i < 3; i++) {\n       uv = rgb_uvs[i];\n       \n       // Back from [-aspect..aspect] to [-1..1]\n       uv.x = uv.x / adsk_input1_frameratio;\n       \n       // Remove UV shifts\n       uv.x -= uShift;\n       uv.y -= vShift;\n       \n       // Back to OGL UV\n       uv.x = (uv.x + 1) / 2;\n       uv.y = (uv.y + 1) / 2;\n       \n       rgb_uvs[i] = uv;\n   }\n   \n   // Sample the input plate, per component\n   vec4 sampled;\n   sampled.r = texture2D(input1, rgb_uvs[0]).r;\n   sampled.g = texture2D(input1, rgb_uvs[1]).g;\n   sampled.b = texture2D(input1, rgb_uvs[2]).b;\n   \n   // and assign to the output\n   gl_FragColor.rgba = vec4(sampled.rgb, 1.0 );\n}"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/gbuffers_textured_lit.fsh",
    "content": "#version 120\n\nuniform sampler2D texture;\n\nvarying vec3 color;\nvarying vec2 texcoord;\n\nvec4 GetDiffuse() {\n\tvec4 diffuse = vec4(color.rgb, 1.0);\n\t     diffuse *= texture2D(texture, texcoord);\n\t\n\treturn diffuse;\n}\n\n\nvoid main() {\n\tvec4 diffuse = GetDiffuse();\n\t\n\tgl_FragData[0] = diffuse;\n}"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/gbuffers_textured_lit.vsh",
    "content": "#version 120\n\nvarying vec3 color;\nvarying vec2 texcoord;\n\nvoid main() {\n\tcolor    = gl_Color.rgb;\n\ttexcoord = gl_MultiTexCoord0.st;\n\t\n\tgl_Position = ftransform();\n}"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/islandScene.glsl",
    "content": "//// High quality (Some browsers may freeze or crash)\n//#define HIGHQUALITY\n\n//// Medium quality (Should be fine on all systems, works on Intel HD2000 on Win7 but quite slow)\n//#define MEDIUMQUALITY\n\n//// Defaults\n//#define REFLECTIONS\n#define SHADOWS\n//#define GRASS\n//#define SMALL_WAVES\n#define RAGGED_LEAVES\n//#define DETAILED_NOISE\n//#define LIGHT_AA // 2 sample SSAA\n//#define HEAVY_AA // 2x2 RG SSAA\n//#define TONEMAP\n\n//// Configurations\n#ifdef MEDIUMQUALITY\n\t#define SHADOWS\n\t#define SMALL_WAVES\n\t#define RAGGED_LEAVES\n\t#define TONEMAP\n#endif\n\n#ifdef HIGHQUALITY\n\t#define REFLECTIONS\n\t#define SHADOWS\n\t//#define GRASS\n\t#define SMALL_WAVES\n\t#define RAGGED_LEAVES\n\t#define DETAILED_NOISE\n\t#define LIGHT_AA\n\t#define TONEMAP\n#endif\n\n// Constants\nconst float eps = 1e-5;\nconst float PI = 3.14159265359;\n\nconst vec3 sunDir = vec3(0.79057,-0.47434, 0.0);\nconst vec3 skyCol = vec3(0.3, 0.5, 0.8);\nconst vec3 sandCol = vec3(0.9, 0.8, 0.5);\nconst vec3 treeCol = vec3(0.8, 0.65, 0.3);\nconst vec3 grassCol = vec3(0.4, 0.5, 0.18);\nconst vec3 leavesCol = vec3(0.3, 0.6, 0.2);\nconst vec3 leavesPos = vec3(-5.1,13.4, 0.0);\n\n#ifdef TONEMAP\nconst vec3 sunCol = vec3(1.8, 1.7, 1.6);\n#else\nconst vec3 sunCol = vec3(0.9, 0.85, 0.8);\n#endif\n\nconst float exposure = 1.1; // Only used when tonemapping\n\n// Description : Array and textureless GLSL 2D/3D/4D simplex\n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\nvec3 mod289(vec3 x) {\n  return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x) {\n  return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x) {\n     return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r) {\n  return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nfloat snoise(vec3 v) {\n  const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n  const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n  vec3 i = floor(v + dot(v, C.yyy) );\n  vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n  vec3 g = step(x0.yzx, x0.xyz);\n  vec3 l = 1.0 - g;\n  vec3 i1 = min( g.xyz, l.zxy );\n  vec3 i2 = max( g.xyz, l.zxy );\n\n  // x0 = x0 - 0.0 + 0.0 * C.xxx;\n  // x1 = x0 - i1 + 1.0 * C.xxx;\n  // x2 = x0 - i2 + 2.0 * C.xxx;\n  // x3 = x0 - 1.0 + 3.0 * C.xxx;\n  vec3 x1 = x0 - i1 + C.xxx;\n  vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n  vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n  i = mod289(i);\n  vec4 p = permute( permute( permute(\n             i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n           + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n           + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n  float n_ = 0.142857142857; // 1.0/7.0\n  vec3 ns = n_ * D.wyz - D.xzx;\n\n  vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n  vec4 x_ = floor(j * ns.z);\n  vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n  vec4 x = x_ *ns.x + ns.yyyy;\n  vec4 y = y_ *ns.x + ns.yyyy;\n  vec4 h = 1.0 - abs(x) - abs(y);\n\n  vec4 b0 = vec4( x.xy, y.xy );\n  vec4 b1 = vec4( x.zw, y.zw );\n\n  //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n  //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n  vec4 s0 = floor(b0)*2.0 + 1.0;\n  vec4 s1 = floor(b1)*2.0 + 1.0;\n  vec4 sh = -step(h, vec4(0.0));\n\n  vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n  vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n  vec3 p0 = vec3(a0.xy,h.x);\n  vec3 p1 = vec3(a0.zw,h.y);\n  vec3 p2 = vec3(a1.xy,h.z);\n  vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n  vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n  p0 *= norm.x;\n  p1 *= norm.y;\n  p2 *= norm.z;\n  p3 *= norm.w;\n\n// Mix final noise value\n  vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n  m = m * m;\n  return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n                                dot(p2,x2), dot(p3,x3) ) );\n}\n\n\n\n// Main\nfloat fbm(vec3 p)\n{\n\tfloat final = snoise(p); \n\tp *= 1.94; final += snoise(p) * 0.5;\n\t#ifdef DETAILED_NOISE\n\tp *= 3.75; final += snoise(p) * 0.25;\n\treturn final / 1.75;\n\t#else\n\treturn final / 1.5;\n\t#endif\n}\n\nfloat waterHeight(vec3 p)\n{\n\tfloat d = length(p.xz);\n\tfloat h = sin(d * 1.5 + iGlobalTime * 3.0) * 12.0 / d; // Island waves\n\t#ifdef SMALL_WAVES\n\th += fbm(p*0.5); // Other waves\n\t#endif\n\treturn h;\n}\n\nvec3 bump(vec3 pos, vec3 rayDir)\n{\n\tfloat s = 2.0;\n\t\n\t// Fade out waves to reduce aliasing\n\tfloat dist = dot(pos, rayDir);\n\ts *= dist < 2.0 ? 1.0 : 1.4142 / sqrt(dist);\n\t\n\t// Calculate normal from heightmap\n\tvec2 e = vec2(1e-2, 0.0);\n\tvec3 p = vec3(pos.x, iGlobalTime*0.5, pos.z)*0.7;\n\tfloat m = waterHeight(p)*s;\n\treturn normalize(vec3(\n\t\twaterHeight(p+e.xyy)*s-m,\n\t\t1.0,\n\t\twaterHeight(p+e.yxy)*s-m\n\t));\n}\n\n// Ray intersections\nvec4 intersectSphere(vec3 rpos, vec3 rdir, vec3 pos, float rad)\n{\n\tvec3 op = pos - rpos;\n\tfloat b = dot(op, rdir); \n\tfloat det = b*b - dot(op, op) + rad*rad; \n\t\t\n\tif (det > 0.0)\n\t{\n\t\tdet = sqrt(det);\n\t\tfloat t = b - det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos+rdir*t-pos), t);\n\t}\n\t\n\treturn vec4(0.0);\n}\n\nvec4 intersectCylinder(vec3 rpos, vec3 rdir, vec3 pos, float rad)\n{\n\tvec3 op = pos - rpos;\n\tvec2 rdir2 = normalize(rdir.yz);\n\tfloat b = dot(op.yz, rdir2);\n\tfloat det = b*b - dot(op.yz, op.yz) + rad*rad; \n\t\n\tif (det > 0.0)\n\t{\n\t\tdet = sqrt(det);\n\t\tfloat t = b - det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);\n\t\tt = b + det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);\n\t}\n\t\n\treturn vec4(0.0);\n}\n\nvec4 intersectPlane(vec3 rayPos, vec3 rayDir, vec3 n, float d)\n{\n\tfloat t = -(dot(rayPos, n) + d) / dot(rayDir, n);\n\treturn vec4(n * sign(dot(rayDir, n)), t);\n}\n\n// Helper functions\nvec3 rotate(vec3 p, float theta)\n{\n\tfloat c = cos(theta), s = sin(theta);\n\treturn vec3(p.x * c + p.z * s, p.y,\n\t\t\t\tp.z * c - p.x * s);\n}\n\nfloat impulse(float k, float x) // by iq\n{\n    float h = k*x;\n    return h * exp(1.0 - h);\n}\n\n// Raymarched parts of scene\nfloat grass(vec3 pos)\n{\n\tfloat h = length(pos - vec3(0.0, -7.0, 0.0)) - 8.0;\n\t\n\tif (h > 2.0) return h; // Optimization (Avoid noise if too far away)\n\t\n\treturn h + snoise(pos * 3.0) * 0.1 + pos.y * 0.9;\n}\n\nfloat tree(vec3 pos)\n{\n\tpos.y -= 0.5;\n\tfloat s = sin(pos.y*0.03);\n\tfloat c = cos(pos.y*0.03);\n\tmat2 m = mat2(c, -s, s, c);\n\tvec3 p = vec3(m*pos.xy, pos.z);\n\t\n\tfloat width = 1.0 - pos.y * 0.02 - clamp(sin(pos.y * 8.0) * 0.1, 0.05, 0.1);\n\t\n\treturn max(length(p.xz) - width, pos.y - 12.5);\n}\n\nvec2 scene(vec3 pos)\n{\n\tfloat vtree = tree(pos);\n\t#ifdef GRASS\n\tfloat vgrass = grass(pos);\n\tfloat v = min(vtree, vgrass);\n\t#else\n\tfloat v = vtree;\n\t#endif\n\treturn vec2(v, v == vtree ? 2.0 : 1.0);\n}\n\nvec3 normal(vec3 pos)\n{\n\tvec2 eps = vec2(1e-3, 0.0);\n\tfloat h = scene(pos).x;\n\treturn normalize(vec3(\n\t\tscene(pos-eps.xyy).x-h,\n\t\tscene(pos-eps.yxy).x-h,\n\t\tscene(pos-eps.yyx).x-h\n\t));\n}\n\nfloat plantsShadow(vec3 rayPos, vec3 rayDir)\n{\n\t// Soft shadow taken from iq\n\tfloat k = 6.0;\n\tfloat t = 0.0;\n\tfloat s = 1.0;\t\n\tfor (int i = 0; i < 30; i++)\n\t{\n\t\tvec3 pos = rayPos+rayDir*t;\t\n\t\tvec2 res = scene(pos);\t\t\n\t\tif (res.x < 0.001) return 0.0;\n\t\ts = min(s, k*res.x/t); \n\t\tt += max(res.x, 0.01);\n\t}\n\t\n\treturn s*s*(3.0 - 2.0*s);\n}\n\n// Ray-traced parts of scene\nvec4 intersectWater(vec3 rayPos, vec3 rayDir)\n{\n\tfloat h = sin(20.5 + iGlobalTime * 2.0) * 0.03;\n\tfloat t = -(rayPos.y + 2.5 + h) / rayDir.y;\n\treturn vec4(0.0, 1.0, 0.0, t);\n}\n\nvec4 intersectSand(vec3 rayPos, vec3 rayDir)\n{\n\treturn intersectSphere(rayPos, rayDir, vec3(0.0,-24.1,0.0), 24.1);\n}\n\nvec4 intersectTreasure(vec3 rayPos, vec3 rayDir)\n{\n\treturn vec4(0.0);\n}\n\nvec4 intersectLeaf(vec3 rayPos, vec3 rayDir, float openAmount)\n{\t\n\tvec3 dir = normalize(vec3(0.0, 1.0, openAmount));\n\tfloat offset = 0.0;\n\t\t\t\n\tvec4 res = intersectPlane(rayPos, rayDir, dir, 0.0);\n\tvec3 pos = rayPos+rayDir*res.w;\n\t#ifdef RAGGED_LEAVES\n\toffset = snoise(pos*0.8) * 0.3;\n\t#endif\n\tif (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res.w = 0.0;\n\t\n\tvec4 res2 = intersectPlane(rayPos, rayDir, vec3(dir.xy, -dir.z), 0.0);\n\tpos = rayPos+rayDir*res2.w;\n\t#ifdef RAGGED_LEAVES\n\toffset = snoise(pos*0.8) * 0.3;\n\t#endif\n\tif (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res2.w = 0.0;\n\t\n\tif (res2.w > 0.0 && res2.w < res.w || res.w <= 0.0)\n\t\tres = res2;\n\t\t\n\treturn res;\n}\n\nvec4 leaves(vec3 rayPos, vec3 rayDir)\n{\n\tfloat t = 1e20;\n\tvec3 n = vec3(0.0);\n\t\n\trayPos -= leavesPos;\n\t\n\tfloat sway = impulse(15.0, fract(iGlobalTime / PI * 0.125));\n\tfloat upDownSway = sway * -sin(iGlobalTime) * 0.06;\n\tfloat openAmount = sway * max(-cos(iGlobalTime) * 0.4, 0.0);\n\t\n\tfloat angleOffset = -0.1;\t\n\tfor (float k = 0.0; k < 6.2; k += 0.75)\n\t{\n\t\t// Left-right\n\t\tfloat alpha = k + (k - PI) * sway * 0.015;\n\t\tvec3 p = rotate(rayPos, alpha);\n\t\tvec3 d = rotate(rayDir, alpha);\n\t\t\n\t\t// Up-down\n\t\tangleOffset *= -1.0;\n\t\tfloat theta = -0.4 + \n\t\t\tangleOffset + \n\t\t\tcos(k) * 0.35 + \n\t\t\tupDownSway + \n\t\t\tsin(iGlobalTime+k*10.0) * 0.03 * (sway + 0.2);\n\t\t\n\t\tp = rotate(p.xzy, theta).xzy;\n\t\td = rotate(d.xzy, theta).xzy;\n\t\n\t\t// Shift\n\t\tp -= vec3(5.4, 0.0, 0.0);\n\t\t\n\t\t// Intersect individual leaf\n\t\tvec4 res = intersectLeaf(p, d, 1.0+openAmount);\n\t\tif (res.w > 0.0 && res.w < t)\n\t\t{\n\t\t\tt = res.w;\n\t\t\tn = res.xyz;\n\t\t}\n\t}\n\t\n\treturn vec4(n, t);\n}\n\n// Lighting\nfloat shadow(vec3 rayPos, vec3 rayDir)\n{\t\n\tfloat s = 1.0;\n\t\n\t// Intersect sand\n\t//vec4 resSand = intersectSand(rayPos, rayDir);\n\t//if (resSand.w > 0.0) return 0.0;\n\t\n\t// Intersect plants\n\ts = min(s, plantsShadow(rayPos, rayDir));\n\tif (s < 0.0001) return 0.0;\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < 1e7) return 0.0;\n\t\n\treturn s;\n}\n\nvec3 light(vec3 p, vec3 n)\n{\n\tfloat s = 1.0;\n\t\n\t#ifdef SHADOWS\n\ts = shadow(p-sunDir*0.01, -sunDir);\n\t#endif\n\t\n\tvec3 col = sunCol * min(max(dot(n, sunDir), 0.0), s);\n\tcol += skyCol * (-n.y * 0.5 + 0.5) * 0.3;\n\treturn col;\n}\n\nvec3 lightLeaves(vec3 p, vec3 n)\n{\n\tfloat s = 1.0;\n\t\n\t#ifdef SHADOWS\n\ts = shadow(p-sunDir*0.01, -sunDir);\n\t#endif\n\t\n\tfloat ao = min(length(p - leavesPos) * 0.1, 1.0);\n\t\n\tfloat ns = dot(n, sunDir);\n\tfloat d = sqrt(max(ns, 0.0));\n\tvec3 col = sunCol * min(d, s);\n\tcol += sunCol * max(-ns, 0.0) * vec3(0.3, 0.3, 0.1) * ao;\n\tcol += skyCol * (-n.y * 0.5 + 0.5) * 0.3 * ao;\n\treturn col;\n}\n\nvec3 sky(vec3 n)\n{\n\treturn skyCol * (1.0 - n.y * 0.8);\n}\n\n// Ray-marching\nvec4 plants(vec3 rayPos, vec3 rayDir)\n{\n\tfloat t = 0.0;\n\t\n\tfor (int i = 0; i < 40; i++)\n\t{\n\t\tvec3 pos = rayPos+rayDir*t;\t\n\t\tvec2 res = scene(pos);\n\t\tfloat h = res.x;\n\t\t\n\t\tif (h < 0.001)\n\t\t{\n\t\t\tvec3 col = res.y == 2.0 ? treeCol : grassCol;\n\t\t\tfloat uvFact = res.y == 2.0 ? 1.0 : 10.0;\n\t\t\t\n\t\t\tvec3 n = normal(pos);\n\t\t\tvec2 uv = vec2(n.x, pos.y * 0.5) * 0.2 * uvFact;\n\t\t\tvec3 tex = texture2D(iChannel0, uv).rgb * 0.6 + 0.4;\n\t\t\tfloat ao = min(length(pos - leavesPos) * 0.1, 1.0);\n\t\t\treturn vec4(col * light(pos, n) * ao * tex, t);\n\t\t}\n\t\t\n\t\tt += h;\n\t}\n\t\n\treturn vec4(sky(rayDir), 1e8);\n}\n\n// Final combination\nvec3 traceReflection(vec3 rayPos, vec3 rayDir)\n{\n\tvec3 col = vec3(0.0);\n\tfloat t = 1e20;\n\t\t\t\n\t// Intersect plants\n\tvec4 resPlants = plants(rayPos, rayDir);\n\tif (resPlants.w > 0.0 && resPlants.w < t)\n\t{\n\t\tt = resPlants.w;\n\t\tcol = resPlants.xyz;\n\t}\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resLeaves.w;\n\t\tvec2 uv = (pos.xz - leavesPos.xz) * 0.3;\n\t\tfloat tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;\n\t\t\n\t\tt = resLeaves.w;\n\t\tcol = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;\n\t}\n\t\t\n\tif (t > 1e7) return sky(rayDir);\n\t\n\treturn col;\n}\n\nvec3 trace(vec3 rayPos, vec3 rayDir)\n{\n\tvec3 col = vec3(0.0);\n\tfloat t = 1e20;\n\t\n\t// Intersect sand\n\tvec4 resSand = intersectSand(rayPos, rayDir);\n\tif (resSand.w > 0.0)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resSand.w;\n\t\tt = resSand.w;\n\n\t\tcol = sandCol * light(pos, resSand.xyz);\n\t}\n\t\n\t// Intersect treasure chest\n\tvec4 resTreasure = intersectTreasure(rayPos, rayDir);\n\tif (resTreasure.w > 0.0 && resTreasure.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resTreasure.w;\n\t\tt = resTreasure.w;\n\t\tcol = leavesCol * light(pos, resTreasure.xyz);\n\t}\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resLeaves.w;\n\t\tvec2 uv = (pos.xz - leavesPos.xz) * 0.3;\n\t\tfloat tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;\n\t\t\n\t\tt = resLeaves.w;\n\t\tcol = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;\n\t}\n\t\n\t// Intersect plants\n\tvec4 resPlants = plants(rayPos, rayDir);\n\tif (resPlants.w > 0.0 && resPlants.w < t)\n\t{\n\t\tt = resPlants.w;\n\t\tcol = resPlants.xyz;\n\t}\n\t\t\n\t// Intersect water\t\n\tvec4 resWater = intersectWater(rayPos, rayDir);\n\tif (resWater.w > 0.0 && resWater.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resWater.w;\n\t\tfloat dist = t - resWater.w;\n\t\tvec3 n = bump(pos, rayDir);\n\t\t\n\t\tfloat ct = -min(dot(n,rayDir), 0.0);\n\t\tfloat fresnel = 0.9 - 0.9 * pow(1.0 - ct, 5.0);\n\t\t\n\t\tvec3 trans = col * exp(-dist * vec3(1.0, 0.7, 0.4) * 3.0);\n\t\tvec3 reflDir = normalize(reflect(rayDir, n));\n\t\tvec3 refl = sky(reflDir);\n\t\t\n\t\t#ifdef REFLECTIONS\n\t\tif (dot(pos, rayDir) < -2.0)\n\t\t\trefl = traceReflection(pos, reflDir).rgb;\n\t\t#endif\n\t\t\t\t\n\t\tt = resWater.t;\n\t\tcol = mix(refl, trans, fresnel);\n\t}\n\t\n\tif (t > 1e7) return sky(rayDir);\n\t\n\treturn col;\n}\n\n// Ray-generation\nvec3 camera(vec2 px)\n{\n\tvec2 rd = (px / iResolution.yy - vec2(iResolution.x/iResolution.y*0.5-0.5, 0.0)) * 2.0 - 1.0;\n\tfloat t = sin(iGlobalTime * 0.1) * 0.2;\n\tvec3 rayDir = normalize(vec3(rd.x, rd.y, 1.0));\n\tvec3 rayPos = vec3(0.0, 3.0, -18.0);\n\treturn trace(rayPos, rayDir);\n}\n\nvoid main(void)\n{\n\t#ifdef HEAVY_AA\n\t\tvec3 col = camera(gl_FragCoord.xy+vec2(0.0,0.5))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.25,0.0))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.5,0.75))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.75,0.25))*0.25;\n\t#else\n\t\tvec3 col = camera(gl_FragCoord.xy);\n\t\t#ifdef LIGHT_AA\n\t\t\tcol = col * 0.5 + camera(gl_FragCoord.xy+vec2(0.5,0.5))*0.5;\n\t\t#endif\n\t#endif\n\t\n\t#ifdef TONEMAP\n\t// Optimized Haarm-Peter Duiker’s curve\n\tvec3 x = max(vec3(0.0),col*exposure-0.004);\n\tcol = (x*(6.2*x+.5))/(x*(6.2*x+1.7)+0.06);\n\t#else\n\tcol = pow(col, vec3(0.4545));\n\t#endif\n\t\n\tgl_FragColor = vec4(col, 1.0);\n}"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/islandScene.shader",
    "content": "//// High quality (Some browsers may freeze or crash)\n//#define HIGHQUALITY\n\n//// Medium quality (Should be fine on all systems, works on Intel HD2000 on Win7 but quite slow)\n//#define MEDIUMQUALITY\n\n//// Defaults\n//#define REFLECTIONS\n#define SHADOWS\n//#define GRASS\n//#define SMALL_WAVES\n#define RAGGED_LEAVES\n//#define DETAILED_NOISE\n//#define LIGHT_AA // 2 sample SSAA\n//#define HEAVY_AA // 2x2 RG SSAA\n//#define TONEMAP\n\n//// Configurations\n#ifdef MEDIUMQUALITY\n\t#define SHADOWS\n\t#define SMALL_WAVES\n\t#define RAGGED_LEAVES\n\t#define TONEMAP\n#endif\n\n#ifdef HIGHQUALITY\n\t#define REFLECTIONS\n\t#define SHADOWS\n\t//#define GRASS\n\t#define SMALL_WAVES\n\t#define RAGGED_LEAVES\n\t#define DETAILED_NOISE\n\t#define LIGHT_AA\n\t#define TONEMAP\n#endif\n\n// Constants\nconst float eps = 1e-5;\nconst float PI = 3.14159265359;\n\nconst vec3 sunDir = vec3(0.79057,-0.47434, 0.0);\nconst vec3 skyCol = vec3(0.3, 0.5, 0.8);\nconst vec3 sandCol = vec3(0.9, 0.8, 0.5);\nconst vec3 treeCol = vec3(0.8, 0.65, 0.3);\nconst vec3 grassCol = vec3(0.4, 0.5, 0.18);\nconst vec3 leavesCol = vec3(0.3, 0.6, 0.2);\nconst vec3 leavesPos = vec3(-5.1,13.4, 0.0);\n\n#ifdef TONEMAP\nconst vec3 sunCol = vec3(1.8, 1.7, 1.6);\n#else\nconst vec3 sunCol = vec3(0.9, 0.85, 0.8);\n#endif\n\nconst float exposure = 1.1; // Only used when tonemapping\n\n// Description : Array and textureless GLSL 2D/3D/4D simplex\n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\nvec3 mod289(vec3 x) {\n  return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x) {\n  return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x) {\n     return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r) {\n  return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nfloat snoise(vec3 v) {\n  const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n  const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n  vec3 i = floor(v + dot(v, C.yyy) );\n  vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n  vec3 g = step(x0.yzx, x0.xyz);\n  vec3 l = 1.0 - g;\n  vec3 i1 = min( g.xyz, l.zxy );\n  vec3 i2 = max( g.xyz, l.zxy );\n\n  // x0 = x0 - 0.0 + 0.0 * C.xxx;\n  // x1 = x0 - i1 + 1.0 * C.xxx;\n  // x2 = x0 - i2 + 2.0 * C.xxx;\n  // x3 = x0 - 1.0 + 3.0 * C.xxx;\n  vec3 x1 = x0 - i1 + C.xxx;\n  vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n  vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n  i = mod289(i);\n  vec4 p = permute( permute( permute(\n             i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n           + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n           + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n  float n_ = 0.142857142857; // 1.0/7.0\n  vec3 ns = n_ * D.wyz - D.xzx;\n\n  vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n  vec4 x_ = floor(j * ns.z);\n  vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n  vec4 x = x_ *ns.x + ns.yyyy;\n  vec4 y = y_ *ns.x + ns.yyyy;\n  vec4 h = 1.0 - abs(x) - abs(y);\n\n  vec4 b0 = vec4( x.xy, y.xy );\n  vec4 b1 = vec4( x.zw, y.zw );\n\n  //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n  //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n  vec4 s0 = floor(b0)*2.0 + 1.0;\n  vec4 s1 = floor(b1)*2.0 + 1.0;\n  vec4 sh = -step(h, vec4(0.0));\n\n  vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n  vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n  vec3 p0 = vec3(a0.xy,h.x);\n  vec3 p1 = vec3(a0.zw,h.y);\n  vec3 p2 = vec3(a1.xy,h.z);\n  vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n  vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n  p0 *= norm.x;\n  p1 *= norm.y;\n  p2 *= norm.z;\n  p3 *= norm.w;\n\n// Mix final noise value\n  vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n  m = m * m;\n  return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n                                dot(p2,x2), dot(p3,x3) ) );\n}\n\n\n\n// Main\nfloat fbm(vec3 p)\n{\n\tfloat final = snoise(p); \n\tp *= 1.94; final += snoise(p) * 0.5;\n\t#ifdef DETAILED_NOISE\n\tp *= 3.75; final += snoise(p) * 0.25;\n\treturn final / 1.75;\n\t#else\n\treturn final / 1.5;\n\t#endif\n}\n\nfloat waterHeight(vec3 p)\n{\n\tfloat d = length(p.xz);\n\tfloat h = sin(d * 1.5 + iGlobalTime * 3.0) * 12.0 / d; // Island waves\n\t#ifdef SMALL_WAVES\n\th += fbm(p*0.5); // Other waves\n\t#endif\n\treturn h;\n}\n\nvec3 bump(vec3 pos, vec3 rayDir)\n{\n\tfloat s = 2.0;\n\t\n\t// Fade out waves to reduce aliasing\n\tfloat dist = dot(pos, rayDir);\n\ts *= dist < 2.0 ? 1.0 : 1.4142 / sqrt(dist);\n\t\n\t// Calculate normal from heightmap\n\tvec2 e = vec2(1e-2, 0.0);\n\tvec3 p = vec3(pos.x, iGlobalTime*0.5, pos.z)*0.7;\n\tfloat m = waterHeight(p)*s;\n\treturn normalize(vec3(\n\t\twaterHeight(p+e.xyy)*s-m,\n\t\t1.0,\n\t\twaterHeight(p+e.yxy)*s-m\n\t));\n}\n\n// Ray intersections\nvec4 intersectSphere(vec3 rpos, vec3 rdir, vec3 pos, float rad)\n{\n\tvec3 op = pos - rpos;\n\tfloat b = dot(op, rdir); \n\tfloat det = b*b - dot(op, op) + rad*rad; \n\t\t\n\tif (det > 0.0)\n\t{\n\t\tdet = sqrt(det);\n\t\tfloat t = b - det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos+rdir*t-pos), t);\n\t}\n\t\n\treturn vec4(0.0);\n}\n\nvec4 intersectCylinder(vec3 rpos, vec3 rdir, vec3 pos, float rad)\n{\n\tvec3 op = pos - rpos;\n\tvec2 rdir2 = normalize(rdir.yz);\n\tfloat b = dot(op.yz, rdir2);\n\tfloat det = b*b - dot(op.yz, op.yz) + rad*rad; \n\t\n\tif (det > 0.0)\n\t{\n\t\tdet = sqrt(det);\n\t\tfloat t = b - det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);\n\t\tt = b + det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);\n\t}\n\t\n\treturn vec4(0.0);\n}\n\nvec4 intersectPlane(vec3 rayPos, vec3 rayDir, vec3 n, float d)\n{\n\tfloat t = -(dot(rayPos, n) + d) / dot(rayDir, n);\n\treturn vec4(n * sign(dot(rayDir, n)), t);\n}\n\n// Helper functions\nvec3 rotate(vec3 p, float theta)\n{\n\tfloat c = cos(theta), s = sin(theta);\n\treturn vec3(p.x * c + p.z * s, p.y,\n\t\t\t\tp.z * c - p.x * s);\n}\n\nfloat impulse(float k, float x) // by iq\n{\n    float h = k*x;\n    return h * exp(1.0 - h);\n}\n\n// Raymarched parts of scene\nfloat grass(vec3 pos)\n{\n\tfloat h = length(pos - vec3(0.0, -7.0, 0.0)) - 8.0;\n\t\n\tif (h > 2.0) return h; // Optimization (Avoid noise if too far away)\n\t\n\treturn h + snoise(pos * 3.0) * 0.1 + pos.y * 0.9;\n}\n\nfloat tree(vec3 pos)\n{\n\tpos.y -= 0.5;\n\tfloat s = sin(pos.y*0.03);\n\tfloat c = cos(pos.y*0.03);\n\tmat2 m = mat2(c, -s, s, c);\n\tvec3 p = vec3(m*pos.xy, pos.z);\n\t\n\tfloat width = 1.0 - pos.y * 0.02 - clamp(sin(pos.y * 8.0) * 0.1, 0.05, 0.1);\n\t\n\treturn max(length(p.xz) - width, pos.y - 12.5);\n}\n\nvec2 scene(vec3 pos)\n{\n\tfloat vtree = tree(pos);\n\t#ifdef GRASS\n\tfloat vgrass = grass(pos);\n\tfloat v = min(vtree, vgrass);\n\t#else\n\tfloat v = vtree;\n\t#endif\n\treturn vec2(v, v == vtree ? 2.0 : 1.0);\n}\n\nvec3 normal(vec3 pos)\n{\n\tvec2 eps = vec2(1e-3, 0.0);\n\tfloat h = scene(pos).x;\n\treturn normalize(vec3(\n\t\tscene(pos-eps.xyy).x-h,\n\t\tscene(pos-eps.yxy).x-h,\n\t\tscene(pos-eps.yyx).x-h\n\t));\n}\n\nfloat plantsShadow(vec3 rayPos, vec3 rayDir)\n{\n\t// Soft shadow taken from iq\n\tfloat k = 6.0;\n\tfloat t = 0.0;\n\tfloat s = 1.0;\t\n\tfor (int i = 0; i < 30; i++)\n\t{\n\t\tvec3 pos = rayPos+rayDir*t;\t\n\t\tvec2 res = scene(pos);\t\t\n\t\tif (res.x < 0.001) return 0.0;\n\t\ts = min(s, k*res.x/t); \n\t\tt += max(res.x, 0.01);\n\t}\n\t\n\treturn s*s*(3.0 - 2.0*s);\n}\n\n// Ray-traced parts of scene\nvec4 intersectWater(vec3 rayPos, vec3 rayDir)\n{\n\tfloat h = sin(20.5 + iGlobalTime * 2.0) * 0.03;\n\tfloat t = -(rayPos.y + 2.5 + h) / rayDir.y;\n\treturn vec4(0.0, 1.0, 0.0, t);\n}\n\nvec4 intersectSand(vec3 rayPos, vec3 rayDir)\n{\n\treturn intersectSphere(rayPos, rayDir, vec3(0.0,-24.1,0.0), 24.1);\n}\n\nvec4 intersectTreasure(vec3 rayPos, vec3 rayDir)\n{\n\treturn vec4(0.0);\n}\n\nvec4 intersectLeaf(vec3 rayPos, vec3 rayDir, float openAmount)\n{\t\n\tvec3 dir = normalize(vec3(0.0, 1.0, openAmount));\n\tfloat offset = 0.0;\n\t\t\t\n\tvec4 res = intersectPlane(rayPos, rayDir, dir, 0.0);\n\tvec3 pos = rayPos+rayDir*res.w;\n\t#ifdef RAGGED_LEAVES\n\toffset = snoise(pos*0.8) * 0.3;\n\t#endif\n\tif (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res.w = 0.0;\n\t\n\tvec4 res2 = intersectPlane(rayPos, rayDir, vec3(dir.xy, -dir.z), 0.0);\n\tpos = rayPos+rayDir*res2.w;\n\t#ifdef RAGGED_LEAVES\n\toffset = snoise(pos*0.8) * 0.3;\n\t#endif\n\tif (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res2.w = 0.0;\n\t\n\tif (res2.w > 0.0 && res2.w < res.w || res.w <= 0.0)\n\t\tres = res2;\n\t\t\n\treturn res;\n}\n\nvec4 leaves(vec3 rayPos, vec3 rayDir)\n{\n\tfloat t = 1e20;\n\tvec3 n = vec3(0.0);\n\t\n\trayPos -= leavesPos;\n\t\n\tfloat sway = impulse(15.0, fract(iGlobalTime / PI * 0.125));\n\tfloat upDownSway = sway * -sin(iGlobalTime) * 0.06;\n\tfloat openAmount = sway * max(-cos(iGlobalTime) * 0.4, 0.0);\n\t\n\tfloat angleOffset = -0.1;\t\n\tfor (float k = 0.0; k < 6.2; k += 0.75)\n\t{\n\t\t// Left-right\n\t\tfloat alpha = k + (k - PI) * sway * 0.015;\n\t\tvec3 p = rotate(rayPos, alpha);\n\t\tvec3 d = rotate(rayDir, alpha);\n\t\t\n\t\t// Up-down\n\t\tangleOffset *= -1.0;\n\t\tfloat theta = -0.4 + \n\t\t\tangleOffset + \n\t\t\tcos(k) * 0.35 + \n\t\t\tupDownSway + \n\t\t\tsin(iGlobalTime+k*10.0) * 0.03 * (sway + 0.2);\n\t\t\n\t\tp = rotate(p.xzy, theta).xzy;\n\t\td = rotate(d.xzy, theta).xzy;\n\t\n\t\t// Shift\n\t\tp -= vec3(5.4, 0.0, 0.0);\n\t\t\n\t\t// Intersect individual leaf\n\t\tvec4 res = intersectLeaf(p, d, 1.0+openAmount);\n\t\tif (res.w > 0.0 && res.w < t)\n\t\t{\n\t\t\tt = res.w;\n\t\t\tn = res.xyz;\n\t\t}\n\t}\n\t\n\treturn vec4(n, t);\n}\n\n// Lighting\nfloat shadow(vec3 rayPos, vec3 rayDir)\n{\t\n\tfloat s = 1.0;\n\t\n\t// Intersect sand\n\t//vec4 resSand = intersectSand(rayPos, rayDir);\n\t//if (resSand.w > 0.0) return 0.0;\n\t\n\t// Intersect plants\n\ts = min(s, plantsShadow(rayPos, rayDir));\n\tif (s < 0.0001) return 0.0;\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < 1e7) return 0.0;\n\t\n\treturn s;\n}\n\nvec3 light(vec3 p, vec3 n)\n{\n\tfloat s = 1.0;\n\t\n\t#ifdef SHADOWS\n\ts = shadow(p-sunDir*0.01, -sunDir);\n\t#endif\n\t\n\tvec3 col = sunCol * min(max(dot(n, sunDir), 0.0), s);\n\tcol += skyCol * (-n.y * 0.5 + 0.5) * 0.3;\n\treturn col;\n}\n\nvec3 lightLeaves(vec3 p, vec3 n)\n{\n\tfloat s = 1.0;\n\t\n\t#ifdef SHADOWS\n\ts = shadow(p-sunDir*0.01, -sunDir);\n\t#endif\n\t\n\tfloat ao = min(length(p - leavesPos) * 0.1, 1.0);\n\t\n\tfloat ns = dot(n, sunDir);\n\tfloat d = sqrt(max(ns, 0.0));\n\tvec3 col = sunCol * min(d, s);\n\tcol += sunCol * max(-ns, 0.0) * vec3(0.3, 0.3, 0.1) * ao;\n\tcol += skyCol * (-n.y * 0.5 + 0.5) * 0.3 * ao;\n\treturn col;\n}\n\nvec3 sky(vec3 n)\n{\n\treturn skyCol * (1.0 - n.y * 0.8);\n}\n\n// Ray-marching\nvec4 plants(vec3 rayPos, vec3 rayDir)\n{\n\tfloat t = 0.0;\n\t\n\tfor (int i = 0; i < 40; i++)\n\t{\n\t\tvec3 pos = rayPos+rayDir*t;\t\n\t\tvec2 res = scene(pos);\n\t\tfloat h = res.x;\n\t\t\n\t\tif (h < 0.001)\n\t\t{\n\t\t\tvec3 col = res.y == 2.0 ? treeCol : grassCol;\n\t\t\tfloat uvFact = res.y == 2.0 ? 1.0 : 10.0;\n\t\t\t\n\t\t\tvec3 n = normal(pos);\n\t\t\tvec2 uv = vec2(n.x, pos.y * 0.5) * 0.2 * uvFact;\n\t\t\tvec3 tex = texture2D(iChannel0, uv).rgb * 0.6 + 0.4;\n\t\t\tfloat ao = min(length(pos - leavesPos) * 0.1, 1.0);\n\t\t\treturn vec4(col * light(pos, n) * ao * tex, t);\n\t\t}\n\t\t\n\t\tt += h;\n\t}\n\t\n\treturn vec4(sky(rayDir), 1e8);\n}\n\n// Final combination\nvec3 traceReflection(vec3 rayPos, vec3 rayDir)\n{\n\tvec3 col = vec3(0.0);\n\tfloat t = 1e20;\n\t\t\t\n\t// Intersect plants\n\tvec4 resPlants = plants(rayPos, rayDir);\n\tif (resPlants.w > 0.0 && resPlants.w < t)\n\t{\n\t\tt = resPlants.w;\n\t\tcol = resPlants.xyz;\n\t}\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resLeaves.w;\n\t\tvec2 uv = (pos.xz - leavesPos.xz) * 0.3;\n\t\tfloat tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;\n\t\t\n\t\tt = resLeaves.w;\n\t\tcol = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;\n\t}\n\t\t\n\tif (t > 1e7) return sky(rayDir);\n\t\n\treturn col;\n}\n\nvec3 trace(vec3 rayPos, vec3 rayDir)\n{\n\tvec3 col = vec3(0.0);\n\tfloat t = 1e20;\n\t\n\t// Intersect sand\n\tvec4 resSand = intersectSand(rayPos, rayDir);\n\tif (resSand.w > 0.0)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resSand.w;\n\t\tt = resSand.w;\n\n\t\tcol = sandCol * light(pos, resSand.xyz);\n\t}\n\t\n\t// Intersect treasure chest\n\tvec4 resTreasure = intersectTreasure(rayPos, rayDir);\n\tif (resTreasure.w > 0.0 && resTreasure.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resTreasure.w;\n\t\tt = resTreasure.w;\n\t\tcol = leavesCol * light(pos, resTreasure.xyz);\n\t}\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resLeaves.w;\n\t\tvec2 uv = (pos.xz - leavesPos.xz) * 0.3;\n\t\tfloat tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;\n\t\t\n\t\tt = resLeaves.w;\n\t\tcol = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;\n\t}\n\t\n\t// Intersect plants\n\tvec4 resPlants = plants(rayPos, rayDir);\n\tif (resPlants.w > 0.0 && resPlants.w < t)\n\t{\n\t\tt = resPlants.w;\n\t\tcol = resPlants.xyz;\n\t}\n\t\t\n\t// Intersect water\t\n\tvec4 resWater = intersectWater(rayPos, rayDir);\n\tif (resWater.w > 0.0 && resWater.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resWater.w;\n\t\tfloat dist = t - resWater.w;\n\t\tvec3 n = bump(pos, rayDir);\n\t\t\n\t\tfloat ct = -min(dot(n,rayDir), 0.0);\n\t\tfloat fresnel = 0.9 - 0.9 * pow(1.0 - ct, 5.0);\n\t\t\n\t\tvec3 trans = col * exp(-dist * vec3(1.0, 0.7, 0.4) * 3.0);\n\t\tvec3 reflDir = normalize(reflect(rayDir, n));\n\t\tvec3 refl = sky(reflDir);\n\t\t\n\t\t#ifdef REFLECTIONS\n\t\tif (dot(pos, rayDir) < -2.0)\n\t\t\trefl = traceReflection(pos, reflDir).rgb;\n\t\t#endif\n\t\t\t\t\n\t\tt = resWater.t;\n\t\tcol = mix(refl, trans, fresnel);\n\t}\n\t\n\tif (t > 1e7) return sky(rayDir);\n\t\n\treturn col;\n}\n\n// Ray-generation\nvec3 camera(vec2 px)\n{\n\tvec2 rd = (px / iResolution.yy - vec2(iResolution.x/iResolution.y*0.5-0.5, 0.0)) * 2.0 - 1.0;\n\tfloat t = sin(iGlobalTime * 0.1) * 0.2;\n\tvec3 rayDir = normalize(vec3(rd.x, rd.y, 1.0));\n\tvec3 rayPos = vec3(0.0, 3.0, -18.0);\n\treturn trace(rayPos, rayDir);\n}\n\nvoid main(void)\n{\n\t#ifdef HEAVY_AA\n\t\tvec3 col = camera(gl_FragCoord.xy+vec2(0.0,0.5))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.25,0.0))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.5,0.75))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.75,0.25))*0.25;\n\t#else\n\t\tvec3 col = camera(gl_FragCoord.xy);\n\t\t#ifdef LIGHT_AA\n\t\t\tcol = col * 0.5 + camera(gl_FragCoord.xy+vec2(0.5,0.5))*0.5;\n\t\t#endif\n\t#endif\n\t\n\t#ifdef TONEMAP\n\t// Optimized Haarm-Peter Duiker’s curve\n\tvec3 x = max(vec3(0.0),col*exposure-0.004);\n\tcol = (x*(6.2*x+.5))/(x*(6.2*x+1.7)+0.06);\n\t#else\n\tcol = pow(col, vec3(0.4545));\n\t#endif\n\t\n\tgl_FragColor = vec4(col, 1.0);\n}"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/myfragment.frg",
    "content": "varying vec4 v_color;\n\nvoid main()\n{\n\tgl_FragColor = v_color;\n}"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/myvertex.vrx",
    "content": "uniform mat4 u_MVPMatrix;\n\nattribute vec4 a_position;\nattribute vec4 a_color;\n\nvarying vec4 v_color;\n\nvoid main()\n{\n\tv_color = a_color;\n\tgl_Position =  u_MVPMatrix * pos;\n}"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/pntriangles.tesc",
    "content": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Sascha Willems\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#version 450\n\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\n// PN patch data\nstruct PnPatch\n{\n float b210;\n float b120;\n float b021;\n float b012;\n float b102;\n float b201;\n float b111;\n float n110;\n float n011;\n float n101;\n};\n\n// tessellation levels\nlayout (binding = 0) uniform UBO \n{\n\tfloat tessLevel;\n} ubo; \n\nlayout(vertices=3) out;\n\nlayout(location = 0) in vec3 inNormal[];\nlayout(location = 1) in vec2 inUV[];\n\nlayout(location = 0) out vec3 outNormal[3];\nlayout(location = 3) out vec2 outUV[3];\nlayout(location = 6) out PnPatch outPatch[3];\n\nfloat wij(int i, int j)\n{\n\treturn dot(gl_in[j].gl_Position.xyz - gl_in[i].gl_Position.xyz, inNormal[i]);\n}\n\nfloat vij(int i, int j)\n{\n\tvec3 Pj_minus_Pi = gl_in[j].gl_Position.xyz\n\t\t\t\t\t- gl_in[i].gl_Position.xyz;\n\tvec3 Ni_plus_Nj  = inNormal[i]+inNormal[j];\n\treturn 2.0*dot(Pj_minus_Pi, Ni_plus_Nj)/dot(Pj_minus_Pi, Pj_minus_Pi);\n}\n\nvoid main()\n{\n\t// get data\n\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n\toutNormal[gl_InvocationID]            = inNormal[gl_InvocationID];\n\toutUV[gl_InvocationID]          = inUV[gl_InvocationID];\n\n\t// set base \n\tfloat P0 = gl_in[0].gl_Position[gl_InvocationID];\n\tfloat P1 = gl_in[1].gl_Position[gl_InvocationID];\n\tfloat P2 = gl_in[2].gl_Position[gl_InvocationID];\n\tfloat N0 = inNormal[0][gl_InvocationID];\n\tfloat N1 = inNormal[1][gl_InvocationID];\n\tfloat N2 = inNormal[2][gl_InvocationID];\n\n\t// compute control points\n\toutPatch[gl_InvocationID].b210 = (2.0*P0 + P1 - wij(0,1)*N0)/3.0;\n\toutPatch[gl_InvocationID].b120 = (2.0*P1 + P0 - wij(1,0)*N1)/3.0;\n\toutPatch[gl_InvocationID].b021 = (2.0*P1 + P2 - wij(1,2)*N1)/3.0;\n\toutPatch[gl_InvocationID].b012 = (2.0*P2 + P1 - wij(2,1)*N2)/3.0;\n\toutPatch[gl_InvocationID].b102 = (2.0*P2 + P0 - wij(2,0)*N2)/3.0;\n\toutPatch[gl_InvocationID].b201 = (2.0*P0 + P2 - wij(0,2)*N0)/3.0;\n\tfloat E = ( outPatch[gl_InvocationID].b210\n\t\t\t+ outPatch[gl_InvocationID].b120\n\t\t\t+ outPatch[gl_InvocationID].b021\n\t\t\t+ outPatch[gl_InvocationID].b012\n\t\t\t+ outPatch[gl_InvocationID].b102\n\t\t\t+ outPatch[gl_InvocationID].b201 ) / 6.0;\n\tfloat V = (P0 + P1 + P2)/3.0;\n\toutPatch[gl_InvocationID].b111 = E + (E - V)*0.5;\n\toutPatch[gl_InvocationID].n110 = N0+N1-vij(0,1)*(P1-P0);\n\toutPatch[gl_InvocationID].n011 = N1+N2-vij(1,2)*(P2-P1);\n\toutPatch[gl_InvocationID].n101 = N2+N0-vij(2,0)*(P0-P2);\n\n\t// set tess levels\n\tgl_TessLevelOuter[gl_InvocationID] = ubo.tessLevel;\n\tgl_TessLevelInner[0] = ubo.tessLevel;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/pntriangles.tese",
    "content": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Sascha Willems\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#version 450\n\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\n// PN patch data\nstruct PnPatch\n{\n float b210;\n float b120;\n float b021;\n float b012;\n float b102;\n float b201;\n float b111;\n float n110;\n float n011;\n float n101;\n};\n\nlayout (binding = 1) uniform UBO \n{\n    mat4 projection;\n    mat4 model;\n    float tessAlpha;\n} ubo;\n\nlayout(triangles, fractional_odd_spacing, ccw) in;\n\nlayout(location = 0) in vec3 iNormal[];\nlayout(location = 3) in vec2 iTexCoord[];\nlayout(location = 6) in PnPatch iPnPatch[];\n\nlayout(location = 0) out vec3 oNormal;\nlayout(location = 1) out vec2 oTexCoord;\n\n#define uvw gl_TessCoord\n\nvoid main()\n{\n    vec3 uvwSquared = uvw * uvw;\n    vec3 uvwCubed   = uvwSquared * uvw;\n\n    // extract control points\n    vec3 b210 = vec3(iPnPatch[0].b210, iPnPatch[1].b210, iPnPatch[2].b210);\n    vec3 b120 = vec3(iPnPatch[0].b120, iPnPatch[1].b120, iPnPatch[2].b120);\n    vec3 b021 = vec3(iPnPatch[0].b021, iPnPatch[1].b021, iPnPatch[2].b021);\n    vec3 b012 = vec3(iPnPatch[0].b012, iPnPatch[1].b012, iPnPatch[2].b012);\n    vec3 b102 = vec3(iPnPatch[0].b102, iPnPatch[1].b102, iPnPatch[2].b102);\n    vec3 b201 = vec3(iPnPatch[0].b201, iPnPatch[1].b201, iPnPatch[2].b201);\n    vec3 b111 = vec3(iPnPatch[0].b111, iPnPatch[1].b111, iPnPatch[2].b111);\n\n    // extract control normals\n    vec3 n110 = normalize(vec3(iPnPatch[0].n110, iPnPatch[1].n110, iPnPatch[2].n110));\n    vec3 n011 = normalize(vec3(iPnPatch[0].n011, iPnPatch[1].n011, iPnPatch[2].n011));\n    vec3 n101 = normalize(vec3(iPnPatch[0].n101, iPnPatch[1].n101, iPnPatch[2].n101));\n\n    // compute texcoords\n    oTexCoord  = gl_TessCoord[2]*iTexCoord[0] + gl_TessCoord[0]*iTexCoord[1] + gl_TessCoord[1]*iTexCoord[2];\n\n    // normal\n    // Barycentric normal\n    vec3 barNormal = gl_TessCoord[2]*iNormal[0] + gl_TessCoord[0]*iNormal[1] + gl_TessCoord[1]*iNormal[2];\n    vec3 pnNormal  = iNormal[0]*uvwSquared[2] + iNormal[1]*uvwSquared[0] + iNormal[2]*uvwSquared[1]\n                   + n110*uvw[2]*uvw[0] + n011*uvw[0]*uvw[1]+ n101*uvw[2]*uvw[1];\n    oNormal = ubo.tessAlpha*pnNormal + (1.0-ubo.tessAlpha) * barNormal;\n\n    // compute interpolated pos\n    vec3 barPos = gl_TessCoord[2]*gl_in[0].gl_Position.xyz\n                + gl_TessCoord[0]*gl_in[1].gl_Position.xyz\n                + gl_TessCoord[1]*gl_in[2].gl_Position.xyz;\n\n    // save some computations\n    uvwSquared *= 3.0;\n\n    // compute PN position\n    vec3 pnPos  = gl_in[0].gl_Position.xyz*uvwCubed[2]\n                + gl_in[1].gl_Position.xyz*uvwCubed[0]\n                + gl_in[2].gl_Position.xyz*uvwCubed[1]\n                + b210*uvwSquared[2]*uvw[0]\n                + b120*uvwSquared[0]*uvw[2]\n                + b201*uvwSquared[2]*uvw[1]\n                + b021*uvwSquared[0]*uvw[1]\n                + b102*uvwSquared[1]*uvw[2]\n                + b012*uvwSquared[1]*uvw[0]\n                + b111*6.0*uvw[0]*uvw[1]*uvw[2];\n\n    // final position and normal\n    vec3 finalPos = (1.0-ubo.tessAlpha)*barPos + ubo.tessAlpha*pnPos;\n gl_Position   = ubo.projection * ubo.model * vec4(finalPos,1.0);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/recurse1.frag",
    "content": "#version 330 core\r\n\r\n// cross-unit recursion\r\n\r\nvoid main() {}\r\n\r\n// two-level recursion\r\n\r\nfloat cbar(int);\r\n\r\nvoid cfoo(float)\r\n{\r\n\tcbar(2);\r\n}\r\n\r\n// four-level, out of order\r\n\r\nvoid CB();\r\nvoid CD();\r\nvoid CA() { CB(); }\r\nvoid CC() { CD(); }\r\n\r\n// high degree\r\n\r\nvoid CBT();\r\nvoid CDT();\r\nvoid CAT() { CBT(); CBT(); CBT(); }\r\nvoid CCT() { CDT(); CDT(); CBT(); }\r\n\r\n// not recursive\r\n\r\nvoid norA() {}\r\nvoid norB() { norA(); }\r\nvoid norC() { norA(); }\r\nvoid norD() { norA(); }\r\nvoid norE() { norB(); }\r\nvoid norF() { norB(); }\r\nvoid norG() { norE(); }\r\nvoid norH() { norE(); }\r\nvoid norI() { norE(); }\r\n\r\n// not recursive, but with a call leading into a cycle if ignoring direction\r\n\r\nvoid norcA() { }\r\nvoid norcB() { norcA(); }\r\nvoid norcC() { norcB(); }\r\nvoid norcD() { norcC(); norcB(); } // head of cycle\r\nvoid norcE() { norcD(); } // lead into cycle\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/recurse1.fs",
    "content": "#version 330 core\r\n\r\n// cross-unit recursion\r\n\r\nvoid main() {}\r\n\r\n// two-level recursion\r\n\r\nfloat cbar(int);\r\n\r\nvoid cfoo(float)\r\n{\r\n\tcbar(2);\r\n}\r\n\r\n// four-level, out of order\r\n\r\nvoid CB();\r\nvoid CD();\r\nvoid CA() { CB(); }\r\nvoid CC() { CD(); }\r\n\r\n// high degree\r\n\r\nvoid CBT();\r\nvoid CDT();\r\nvoid CAT() { CBT(); CBT(); CBT(); }\r\nvoid CCT() { CDT(); CDT(); CBT(); }\r\n\r\n// not recursive\r\n\r\nvoid norA() {}\r\nvoid norB() { norA(); }\r\nvoid norC() { norA(); }\r\nvoid norD() { norA(); }\r\nvoid norE() { norB(); }\r\nvoid norF() { norB(); }\r\nvoid norG() { norE(); }\r\nvoid norH() { norE(); }\r\nvoid norI() { norE(); }\r\n\r\n// not recursive, but with a call leading into a cycle if ignoring direction\r\n\r\nvoid norcA() { }\r\nvoid norcB() { norcA(); }\r\nvoid norcC() { norcB(); }\r\nvoid norcD() { norcC(); norcB(); } // head of cycle\r\nvoid norcE() { norcD(); } // lead into cycle\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/GLSL/shader.fp",
    "content": "/*\n * Copyright (C) 2010 Josh A. Beam\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nconst int NUM_LIGHTS = 3;\nconst vec3 AMBIENT = vec3(0.1, 0.1, 0.1);\nconst float MAX_DIST = 2.5;\nconst float MAX_DIST_SQUARED = MAX_DIST * MAX_DIST;\n\nuniform vec3 lightColor[NUM_LIGHTS];\n\nvarying vec3 fragmentNormal;\nvarying vec3 cameraVector;\nvarying vec3 lightVector[NUM_LIGHTS];\n\nvoid\nmain()\n{\n\t// initialize diffuse/specular lighting\n\tvec3 diffuse = vec3(0.0, 0.0, 0.0);\n\tvec3 specular = vec3(0.0, 0.0, 0.0);\n\n\t// normalize the fragment normal and camera direction\n\tvec3 normal = normalize(fragmentNormal);\n\tvec3 cameraDir = normalize(cameraVector);\n\n\t// loop through each light\n\tfor(int i = 0; i < NUM_LIGHTS; ++i) {\n\t\t// calculate distance between 0.0 and 1.0\n\t\tfloat dist = min(dot(lightVector[i], lightVector[i]), MAX_DIST_SQUARED) / MAX_DIST_SQUARED;\n\t\tfloat distFactor = 1.0 - dist;\n\n\t\t// diffuse\n\t\tvec3 lightDir = normalize(lightVector[i]);\n\t\tfloat diffuseDot = dot(normal, lightDir);\n\t\tdiffuse += lightColor[i] * clamp(diffuseDot, 0.0, 1.0) * distFactor;\n\n\t\t// specular\n\t\tvec3 halfAngle = normalize(cameraDir + lightDir);\n\t\tvec3 specularColor = min(lightColor[i] + 0.5, 1.0);\n\t\tfloat specularDot = dot(normal, halfAngle);\n\t\tspecular += specularColor * pow(clamp(specularDot, 0.0, 1.0), 16.0) * distFactor;\n\t}\n\n\tvec4 sample = vec4(1.0, 1.0, 1.0, 1.0);\n\tgl_FragColor = vec4(clamp(sample.rgb * (diffuse + AMBIENT) + specular, 0.0, 1.0), sample.a);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/BUILD.2.gn",
    "content": "# Copyright 2016 the V8 project authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"../gni/isolate.gni\")\n\ngroup(\"gn_all\") {\n  testonly = true\n\n  if (v8_test_isolation_mode != \"noop\") {\n    deps = [\n      \":check-static-initializers_run\",\n      \":jsfunfuzz_run\",\n      \":run-deopt-fuzzer_run\",\n      \":run-gcmole_run\",\n      \":run-valgrind_run\",\n    ]\n  }\n}\n\nv8_isolate_run(\"check-static-initializers\") {\n  deps = [\n    \"..:d8_run\",\n  ]\n\n  isolate = \"check-static-initializers.isolate\"\n}\n\nv8_isolate_run(\"jsfunfuzz\") {\n  deps = [\n    \"..:d8_run\",\n  ]\n\n  isolate = \"jsfunfuzz/jsfunfuzz.isolate\"\n}\n\nv8_isolate_run(\"run-deopt-fuzzer\") {\n  deps = [\n    \"..:d8_run\",\n  ]\n\n  isolate = \"run-deopt-fuzzer.isolate\"\n}\n\nv8_isolate_run(\"run-gcmole\") {\n  deps = [\n    \"..:d8_run\",\n  ]\n\n  isolate = \"gcmole/run-gcmole.isolate\"\n}\n\nv8_isolate_run(\"run-valgrind\") {\n  deps = [\n    \"..:d8_run\",\n  ]\n\n  isolate = \"run-valgrind.isolate\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/BUILD.3.gn",
    "content": "# Copyright (c) 2013 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/android/config.gni\")\nimport(\"//build/config/chrome_build.gni\")\nimport(\"//build/config/compiler/compiler.gni\")\nimport(\"//build/config/nacl/config.gni\")\nimport(\"//build/toolchain/cc_wrapper.gni\")\nimport(\"//build/toolchain/toolchain.gni\")\nimport(\"//build_overrides/build.gni\")\n\nif (current_cpu == \"arm\" || current_cpu == \"arm64\") {\n  import(\"//build/config/arm.gni\")\n}\nif (current_cpu == \"mipsel\" || current_cpu == \"mips64el\") {\n  import(\"//build/config/mips.gni\")\n}\nif (is_mac) {\n  import(\"//build/config/mac/symbols.gni\")\n}\n\ndeclare_args() {\n  # Default to warnings as errors for default workflow, where we catch\n  # warnings with known toolchains. Allow overriding this e.g. for Chromium\n  # builds on Linux that could use a different version of the compiler.\n  # With GCC, warnings in no-Chromium code are always not treated as errors.\n  treat_warnings_as_errors = true\n\n  # Normally, Android builds are lightly optimized, even for debug builds, to\n  # keep binary size down. Setting this flag to true disables such optimization\n  android_full_debug = false\n\n  # Whether to use the binary binutils checked into third_party/binutils.\n  # These are not multi-arch so cannot be used except on x86 and x86-64 (the\n  # only two architectures that are currently checked in). Turn this off when\n  # you are using a custom toolchain and need to control -B in cflags.\n  linux_use_bundled_binutils =\n      linux_use_bundled_binutils_override && is_linux &&\n      (current_cpu == \"x64\" || current_cpu == \"x86\")\n  binutils_path = rebase_path(\"//third_party/binutils/Linux_x64/Release/bin\",\n                              root_build_dir)\n\n  # Compile in such a way as to make it possible for the profiler to unwind full\n  # stack frames. Setting this flag has a large effect on the performance of the\n  # generated code than just setting profiling, but gives the profiler more\n  # information to analyze.\n  # Requires profiling to be set to true.\n  enable_full_stack_frames_for_profiling = false\n\n  # When we are going to use gold we need to find it.\n  # This is initialized below, after use_gold might have been overridden.\n  gold_path = false\n\n  if (is_win) {\n    # Whether the VS xtree header has been patched to disable warning 4702. If\n    # it has, then we don't need to disable 4702 (unreachable code warning).\n    # The patch is preapplied to the internal toolchain and hence all bots.\n    msvs_xtree_patched = false\n  }\n\n  # Omit unwind support in official builds to save space.\n  # We can use breakpad for these builds.\n  exclude_unwind_tables = is_chrome_branded && is_official_build\n\n  # If true, gold linker will save symbol table inside object files.\n  # This speeds up gdb startup by 60%\n  gdb_index = false\n\n  # If true, optimize for size. Does not affect windows builds.\n  # Linux & Mac favor speed over size.\n  # TODO(brettw) it's weird that Mac and desktop Linux are different. We should\n  # explore favoring size over speed in this case as well.\n  optimize_for_size = is_android || is_ios\n\n  # Enable fatal linker warnings. Building Chromium with certain versions\n  # of binutils can cause linker warning.\n  # See: https://bugs.chromium.org/p/chromium/issues/detail?id=457359\n  fatal_linker_warnings = true\n\n  # AFDO (Automatic Feedback Directed Optimizer) is a form of profile-guided\n  # optimization that GCC supports. It used by ChromeOS in their official\n  # builds. To use it, set auto_profile_path to the path to a file containing\n  # the needed gcov profiling data.\n  auto_profile_path = \"\"\n\n  # Optimize for coverage guided fuzzing (balance between speed and number of\n  # branches)\n  optimize_for_fuzzing = false\n}\n\nif (is_clang && !is_nacl) {\n  update_args = [ \"--print-revision\" ]\n  if (llvm_force_head_revision) {\n    update_args += [ \"--llvm-force-head-revision\" ]\n  }\n  clang_revision =\n      exec_script(\"//tools/clang/scripts/update.py\", update_args, \"trim string\")\n}\n\n# Apply the default logic for these values if they were not set explicitly.\nif (gold_path == false) {\n  if (use_gold) {\n    gold_path = rebase_path(\"//third_party/binutils/Linux_x64/Release/bin\",\n                            root_build_dir)\n  } else {\n    gold_path = \"\"\n  }\n}\n\nif (use_debug_fission == \"default\") {\n  use_debug_fission = is_debug && !is_win && use_gold &&\n                      linux_use_bundled_binutils && cc_wrapper == \"\"\n}\n\n# default_include_dirs ---------------------------------------------------------\n#\n# This is a separate config so that third_party code (which would not use the\n# source root and might have conflicting versions of some headers) can remove\n# this and specify their own include paths.\nconfig(\"default_include_dirs\") {\n  include_dirs = [\n    \"//\",\n    root_gen_dir,\n  ]\n}\n\n# compiler ---------------------------------------------------------------------\n#\n# Base compiler configuration.\n#\n# See also \"runtime_library\" below for related stuff and a discussion about\n# where stuff should go. Put warning related stuff in the \"warnings\" config.\n\nconfig(\"compiler\") {\n  asmflags = []\n  cflags = []\n  cflags_c = []\n  cflags_cc = []\n  cflags_objc = []\n  cflags_objcc = []\n  ldflags = []\n  defines = []\n  configs = []\n\n  # System-specific flags. If your compiler flags apply to one of the\n  # categories here, add it to the associated file to keep this shared config\n  # smaller.\n  if (is_win) {\n    configs += [ \"//build/config/win:compiler\" ]\n  } else if (is_android) {\n    configs += [ \"//build/config/android:compiler\" ]\n  } else if (is_linux) {\n    configs += [ \"//build/config/linux:compiler\" ]\n  } else if (is_nacl) {\n    configs += [ \"//build/config/nacl:compiler\" ]\n  } else if (is_ios || is_mac) {\n    configs += [ \"//build/config/mac:compiler\" ]\n  }\n\n  # Applies to all Posix systems.\n  if (is_posix) {\n    configs += [ \"//build/config/posix:compiler\" ]\n  }\n\n  # See the definitions below.\n  configs += [\n    \":compiler_cpu_abi\",\n    \":compiler_codegen\",\n  ]\n\n  # In general, Windows is totally different, but all the other builds share\n  # some common GCC configuration.\n  if (!is_win) {\n    # Common GCC compiler flags setup.\n    # --------------------------------\n    cflags += [ \"-fno-strict-aliasing\" ]  # See http://crbug.com/32204\n    cflags_cc += [\n      # If this is removed then remove the corresponding /Zc:threadSafeInit- for\n      # Windows.\n      \"-fno-threadsafe-statics\",\n\n      # Not exporting C++ inline functions can generally be applied anywhere\n      # so we do so here. Normal function visibility is controlled by\n      # //build/config/gcc:symbol_visibility_hidden.\n      \"-fvisibility-inlines-hidden\",\n    ]\n\n    # Stack protection.\n    if (is_mac) {\n      # The strong variant of the stack protector significantly increases\n      # binary size, so only enable it in debug mode.\n      if (is_debug) {\n        cflags += [ \"-fstack-protector-strong\" ]\n      } else {\n        cflags += [ \"-fstack-protector\" ]\n      }\n    } else if (is_posix && !is_chromeos && !is_nacl) {\n      # TODO(phajdan.jr): Use -fstack-protector-strong when our gcc supports it.\n      # See also https://crbug.com/533294\n      cflags += [ \"--param=ssp-buffer-size=4\" ]\n\n      # The x86 toolchain currently has problems with stack-protector.\n      if (is_android && current_cpu == \"x86\") {\n        cflags += [ \"-fno-stack-protector\" ]\n      } else {\n        cflags += [ \"-fstack-protector\" ]\n      }\n    }\n\n    # Linker warnings.\n    if (fatal_linker_warnings && !(is_chromeos && current_cpu == \"arm\") &&\n        !(is_android && use_order_profiling) && !is_mac && !is_ios) {\n      # TODO(jochen): Enable this on chromeos on arm. http://crbug.com/356580\n      # TODO(lizeb,pasko): Fix link errors when linking with order_profiling=1\n      # crbug.com/485542\n      ldflags += [ \"-Wl,--fatal-warnings\" ]\n    }\n  }\n\n  if (is_clang && is_debug) {\n    # Allow comparing the address of references and 'this' against 0\n    # in debug builds. Technically, these can never be null in\n    # well-defined C/C++ and Clang can optimize such checks away in\n    # release builds, but they may be used in asserts in debug builds.\n    cflags_cc += [\n      \"-Wno-undefined-bool-conversion\",\n      \"-Wno-tautological-undefined-compare\",\n    ]\n  }\n\n  if (is_clang && !is_nacl) {\n    # This is here so that all files get recompiled after a clang roll and\n    # when turning clang on or off. (defines are passed via the command line,\n    # and build system rebuild things when their commandline changes). Nothing\n    # should ever read this define.\n    defines += [ \"CR_CLANG_REVISION=$clang_revision\" ]\n  }\n\n  # Non-Mac Posix compiler flags setup.\n  # -----------------------------------\n  if (is_posix && !(is_mac || is_ios)) {\n    if (enable_profiling) {\n      if (!is_debug) {\n        cflags += [ \"-g\" ]\n\n        if (enable_full_stack_frames_for_profiling) {\n          cflags += [\n            \"-fno-inline\",\n            \"-fno-optimize-sibling-calls\",\n          ]\n        }\n      }\n    }\n\n    defines += [ \"_FILE_OFFSET_BITS=64\" ]\n\n    if (!is_android) {\n      defines += [\n        \"_LARGEFILE_SOURCE\",\n        \"_LARGEFILE64_SOURCE\",\n      ]\n    }\n\n    if (!is_nacl) {\n      if (exclude_unwind_tables) {\n        cflags += [\n          \"-fno-unwind-tables\",\n          \"-fno-asynchronous-unwind-tables\",\n        ]\n        defines += [ \"NO_UNWIND_TABLES\" ]\n      } else {\n        cflags += [ \"-funwind-tables\" ]\n      }\n    }\n  }\n\n  # Linux/Android common flags setup.\n  # ---------------------------------\n  if (is_linux || is_android) {\n    cflags += [\n      \"-fPIC\",\n      \"-pipe\",  # Use pipes for communicating between sub-processes. Faster.\n    ]\n\n    ldflags += [\n      \"-fPIC\",\n      \"-Wl,-z,noexecstack\",\n      \"-Wl,-z,now\",\n      \"-Wl,-z,relro\",\n    ]\n    if (!using_sanitizer) {\n      if (!use_cfi_diag) {\n        ldflags += [ \"-Wl,-z,defs\" ]\n      }\n\n      # Functions interposed by the sanitizers can make ld think\n      # that some libraries aren't needed when they actually are,\n      # http://crbug.com/234010. As workaround, disable --as-needed.\n      if (!is_nacl && !is_android) {\n        # TODO(pcc): Fix linker bug which requires us to link pthread\n        # unconditionally here (crbug.com/623236).\n        ldflags += [\n          \"-Wl,--no-as-needed\",\n          \"-lpthread\",\n        ]\n      }\n      ldflags += [ \"-Wl,--as-needed\" ]\n    }\n  }\n\n  # Linux-specific compiler flags setup.\n  # ------------------------------------\n  if (is_android && is_clang) {\n    _rebased_android_toolchain_root =\n        rebase_path(android_toolchain_root, root_build_dir)\n\n    # Let clang find the linker in the NDK.\n    ldflags += [ \"--gcc-toolchain=$_rebased_android_toolchain_root\" ]\n  }\n\n  if (is_posix && use_lld && !is_nacl) {\n    ldflags += [ \"-fuse-ld=lld\" ]\n  } else if (use_gold) {\n    ldflags += [ \"-fuse-ld=gold\" ]\n    if (is_android) {\n      # Use -mstackrealign due to a bug on ia32 Jelly Bean.\n      # See crbug.com/521527\n      if (current_cpu == \"x86\") {\n        cflags += [ \"-mstackrealign\" ]\n      }\n    } else {\n      # On Android, this isn't needed.  gcc in the NDK knows to look next to\n      # it with -fuse-ld=gold, and clang gets a --gcc-toolchain flag passed\n      # above.\n      ldflags += [ \"-B$gold_path\" ]\n\n      if (linux_use_bundled_binutils) {\n        ldflags += [\n          # Experimentation found that using four linking threads\n          # saved ~20% of link time.\n          # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36\n          # Only apply this to the target linker, since the host\n          # linker might not be gold, but isn't used much anyway.\n          \"-Wl,--threads\",\n          \"-Wl,--thread-count=4\",\n        ]\n      }\n    }\n\n    if (gdb_index) {\n      ldflags += [ \"-Wl,--gdb-index\" ]\n    }\n\n    # TODO(thestig): Make this flag work with GN.\n    #if (!is_official_build && !is_chromeos && !(is_asan || is_lsan || is_tsan || is_msan)) {\n    #  ldflags += [\n    #    \"-Wl,--detect-odr-violations\",\n    #  ]\n    #}\n  } else if (linux_use_bundled_binutils) {\n    # Gold is the default linker for the bundled binutils so we explicitly\n    # enable the bfd linker when use_gold is not set.\n    ldflags += [ \"-fuse-ld=bfd\" ]\n  }\n\n  if (is_posix && (use_gold || (use_lld && !is_nacl)) && !using_sanitizer &&\n      !(is_android && use_order_profiling)) {\n    # TODO(crbug.com/576197) - gcc on x86 platforms + gold + icf=all\n    # doesn't currently work on non-chromeos platforms.\n    # Additionally, on Android x86 --icf=safe seems to cause issues as well.\n    # Additionally, on cast Android x86, --icf=all causes issues.\n    if (is_android && current_cpu == \"x86\") {\n      ldflags += [ \"-Wl,--icf=none\" ]\n    } else if ((is_clang && !is_android) || is_chromeos ||\n               (current_cpu != \"x86\" && current_cpu != \"x64\")) {\n      # TODO(thakis): Remove `!is_android` above once our gold has been rolled\n      # with the fix for https://sourceware.org/bugzilla/show_bug.cgi?id=17704\n      # merged.  See also https://crbug.com/663886\n      ldflags += [ \"-Wl,--icf=all\" ]\n    } else if (!is_android || is_clang) {\n      ldflags += [ \"-Wl,--icf=safe\" ]\n    }\n  }\n\n  if (linux_use_bundled_binutils) {\n    cflags += [ \"-B$binutils_path\" ]\n  }\n\n  # Clang-specific compiler flags setup.\n  # ------------------------------------\n  if (is_clang) {\n    cflags += [ \"-fcolor-diagnostics\" ]\n  }\n\n  # Print absolute paths in diagnostics. There is no precedent for doing this\n  # on Linux/Mac (GCC doesn't support it), but MSVC does this with /FC and\n  # Windows developers rely on it (crbug.com/636109) so only do this on Windows.\n  if (is_clang && is_win) {\n    cflags += [ \"-fdiagnostics-absolute-paths\" ]\n  }\n\n  # Makes builds independent of absolute file path.\n  # clang-cl (used if is_win) doesn't expose this flag.\n  # Currently disabled for nacl since its toolchain lacks this flag (too old).\n  # TODO(zforman): Once nacl's toolchain is updated, remove check.\n  if (is_clang && is_linux) {\n    absolute_path = rebase_path(\"//.\")\n    cflags += [ \"-fdebug-prefix-map=$absolute_path=.\" ]\n  }\n\n  # C++11 compiler flags setup.\n  # ---------------------------\n  if (is_linux || is_android || (is_nacl && is_clang)) {\n    # gnu++11 instead of c++11 is needed because some code uses typeof() (a\n    # GNU extension).\n    # TODO(thakis): Eventually switch this to c++11 instead,\n    # http://crbug.com/427584\n    cflags_cc += [ \"-std=gnu++11\" ]\n  } else if (!is_win && !is_nacl) {\n    # TODO(mcgrathr) - the NaCl GCC toolchain doesn't support either gnu++11\n    # or c++11; we technically don't need this toolchain any more, but there\n    # are still a few buildbots using it, so until those are turned off\n    # we need the !is_nacl clause and the (is_nacl && is_clang) clause, above.\n    cflags_cc += [ \"-std=c++11\" ]\n  }\n\n  if (is_mac) {\n    cflags_cc += [ \"-stdlib=libc++\" ]\n    ldflags += [ \"-stdlib=libc++\" ]\n  }\n\n  # Add flags for link-time optimization. These flags enable\n  # optimizations/transformations that require whole-program visibility at link\n  # time, so they need to be applied to all translation units, and we may end up\n  # with miscompiles if only part of the program is compiled with LTO flags. For\n  # that reason, we cannot allow targets to enable or disable these flags, for\n  # example by disabling the optimize configuration.\n  # TODO(pcc): Make this conditional on is_official_build rather than on gn\n  # flags for specific features.\n  if (!is_debug && (allow_posix_link_time_opt || is_cfi) && !is_nacl) {\n    if (use_thin_lto) {\n      cflags += [ \"-flto=thin\" ]\n      ldflags += [ \"-flto=thin\" ]\n\n      # Limit the parallelism to avoid too agressive competition between\n      # linker jobs. This is still suboptimal to a potential dynamic\n      # resource allocation scheme, but should be good enough.\n      if (use_lld) {\n        ldflags += [ \"-Wl,--thinlto-jobs=8\" ]\n      } else {\n        ldflags += [ \"-Wl,-plugin-opt,jobs=8\" ]\n      }\n    } else {\n      # Note: ThinLTO does not currently have this feature implemented\n      # For Full LTO, it provides a measurable runtime speedup of Chrome.\n      cflags += [\n        \"-flto\",\n        \"-fwhole-program-vtables\",\n      ]\n      ldflags += [\n        \"-flto\",\n        \"-fwhole-program-vtables\",\n      ]\n\n      # Apply a lower LTO optimization level as the default is too slow.\n      if (is_linux) {\n        if (use_lld) {\n          ldflags += [ \"-Wl,--lto-O1\" ]\n        } else {\n          ldflags += [ \"-Wl,-plugin-opt,O1\" ]\n        }\n      } else if (is_mac) {\n        ldflags += [ \"-Wl,-mllvm,-O1\" ]\n      }\n    }\n\n    # Work-around for http://openradar.appspot.com/20356002\n    if (is_mac) {\n      ldflags += [ \"-Wl,-all_load\" ]\n    }\n\n    # Allows the linker to apply ICF to the LTO object file. Also, when\n    # targeting ARM, without this flag, LTO produces a .text section that is\n    # larger than the maximum call displacement, preventing the linker from\n    # relocating calls (http://llvm.org/PR22999).\n    if (is_linux) {\n      ldflags += [ \"-Wl,-plugin-opt,-function-sections\" ]\n    }\n  }\n\n  # Pass the same C/C++ flags to the objective C/C++ compiler.\n  cflags_objc += cflags_c\n  cflags_objcc += cflags_cc\n\n  # Assign any flags set for the C compiler to asmflags so that they are sent\n  # to the assembler. The Windows assembler takes different types of flags\n  # so only do so for posix platforms.\n  if (is_posix) {\n    asmflags += cflags\n    asmflags += cflags_c\n  }\n}\n\n# This is separate from :compiler (and not even a sub-config there)\n# so that some targets can remove it from the list with:\n#   configs -= [ \"//build/config/compiler:pthread\" ]\nconfig(\"pthread\") {\n  if (is_linux) {\n    cflags = [ \"-pthread\" ]\n    ldflags = [ \"-pthread\" ]\n  }\n}\n\n# This provides the basic options to select the target CPU and ABI.\n# It is factored out of \"compiler\" so that special cases can use this\n# without using everything that \"compiler\" brings in.  Options that\n# tweak code generation for a particular CPU do not belong here!\n# See \"compiler_codegen\", below.\nconfig(\"compiler_cpu_abi\") {\n  cflags = []\n  ldflags = []\n\n  if (is_posix && !(is_mac || is_ios)) {\n    # CPU architecture. We may or may not be doing a cross compile now, so for\n    # simplicity we always explicitly set the architecture.\n    if (current_cpu == \"x64\") {\n      cflags += [\n        \"-m64\",\n        \"-march=x86-64\",\n      ]\n      ldflags += [ \"-m64\" ]\n    } else if (current_cpu == \"x86\") {\n      cflags += [ \"-m32\" ]\n      ldflags += [ \"-m32\" ]\n      if (!is_nacl) {\n        cflags += [\n          \"-msse2\",\n          \"-mfpmath=sse\",\n          \"-mmmx\",\n        ]\n      }\n    } else if (current_cpu == \"arm\") {\n      if (is_clang && !is_android && !is_nacl) {\n        cflags += [ \"--target=arm-linux-gnueabihf\" ]\n        ldflags += [ \"--target=arm-linux-gnueabihf\" ]\n      }\n      if (!is_nacl) {\n        cflags += [\n          \"-march=$arm_arch\",\n          \"-mfloat-abi=$arm_float_abi\",\n        ]\n      }\n      if (arm_tune != \"\") {\n        cflags += [ \"-mtune=$arm_tune\" ]\n      }\n    } else if (current_cpu == \"arm64\") {\n      if (is_clang && !is_android && !is_nacl) {\n        cflags += [ \"--target=aarch64-linux-gnu\" ]\n        ldflags += [ \"--target=aarch64-linux-gnu\" ]\n      }\n    } else if (current_cpu == \"mipsel\" && !is_nacl) {\n      if (mips_arch_variant == \"r6\") {\n        if (is_clang) {\n          cflags += [\n            \"--target=mipsel-linux-gnu\",\n            \"-march=mips32r6\",\n          ]\n          ldflags += [ \"--target=mipsel-linux-gnu\" ]\n        } else {\n          cflags += [\n            \"-mips32r6\",\n            \"-Wa,-mips32r6\",\n          ]\n          if (is_android) {\n            ldflags += [\n              \"-mips32r6\",\n              \"-Wl,-melf32ltsmip\",\n            ]\n          }\n        }\n        if (mips_use_msa == true) {\n          cflags += [\n            \"-mmsa\",\n            \"-mfp64\",\n          ]\n        }\n      } else if (mips_arch_variant == \"r2\") {\n        if (is_clang) {\n          if (is_android) {\n            cflags += [\n              \"--target=mipsel-linux-android\",\n              \"-march=mipsel\",\n              \"-mcpu=mips32r2\",\n            ]\n            ldflags += [ \"--target=mipsel-linux-android\" ]\n          } else {\n            cflags += [\n              \"--target=mipsel-linux-gnu\",\n              \"-march=mipsel\",\n              \"-mcpu=mips32r2\",\n            ]\n            ldflags += [ \"--target=mipsel-linux-gnu\" ]\n          }\n        } else {\n          cflags += [\n            \"-mips32r2\",\n            \"-Wa,-mips32r2\",\n          ]\n          if (mips_float_abi == \"hard\" && mips_fpu_mode != \"\") {\n            cflags += [ \"-m$mips_fpu_mode\" ]\n          }\n        }\n      } else if (mips_arch_variant == \"r1\") {\n        if (is_clang) {\n          if (is_android) {\n            cflags += [\n              \"--target=mipsel-linux-android\",\n              \"-march=mipsel\",\n              \"-mcpu=mips32\",\n            ]\n            ldflags += [ \"--target=mipsel-linux-android\" ]\n          } else {\n            cflags += [\n              \"--target=mipsel-linux-gnu\",\n              \"-march=mipsel\",\n              \"-mcpu=mips32\",\n            ]\n            ldflags += [ \"--target=mipsel-linux-gnu\" ]\n          }\n        } else {\n          cflags += [\n            \"-mips32\",\n            \"-Wa,-mips32\",\n          ]\n        }\n      }\n\n      if (mips_dsp_rev == 1) {\n        cflags += [ \"-mdsp\" ]\n      } else if (mips_dsp_rev == 2) {\n        cflags += [ \"-mdspr2\" ]\n      }\n\n      cflags += [ \"-m${mips_float_abi}-float\" ]\n    } else if (current_cpu == \"mips64el\") {\n      if (mips_arch_variant == \"r6\") {\n        if (is_clang) {\n          if (is_android) {\n            cflags += [\n              \"--target=mips64el-linux-android\",\n              \"-march=mips64el\",\n              \"-mcpu=mips64r6\",\n            ]\n            ldflags += [ \"--target=mips64el-linux-android\" ]\n          }\n        } else {\n          cflags += [\n            \"-mips64r6\",\n            \"-Wa,-mips64r6\",\n          ]\n          ldflags += [ \"-mips64r6\" ]\n        }\n        if (mips_use_msa == true) {\n          cflags += [\n            \"-mmsa\",\n            \"-mfp64\",\n          ]\n        }\n      } else if (mips_arch_variant == \"r2\") {\n        cflags += [\n          \"-mips64r2\",\n          \"-Wa,-mips64r2\",\n        ]\n        ldflags += [ \"-mips64r2\" ]\n      }\n    } else if (current_cpu == \"pnacl\" && is_nacl_nonsfi) {\n      if (target_cpu == \"x86\" || target_cpu == \"x64\") {\n        cflags += [\n          \"-arch\",\n          \"x86-32-nonsfi\",\n          \"--pnacl-bias=x86-32-nonsfi\",\n          \"--target=i686-unknown-nacl\",\n        ]\n        ldflags += [\n          \"-arch\",\n          \"x86-32-nonsfi\",\n          \"--target=i686-unknown-nacl\",\n        ]\n      } else if (target_cpu == \"arm\") {\n        cflags += [\n          \"-arch\",\n          \"arm-nonsfi\",\n          \"-mfloat-abi=hard\",\n          \"--pnacl-bias=arm-nonsfi\",\n          \"--target=armv7-unknown-nacl-gnueabihf\",\n        ]\n        ldflags += [\n          \"-arch\",\n          \"arm-nonsfi\",\n          \"--target=armv7-unknown-nacl-gnueabihf\",\n        ]\n      }\n    }\n  }\n\n  asmflags = cflags\n}\n\n# This provides options to tweak code generation that are necessary\n# for particular Chromium code or for working around particular\n# compiler bugs (or the combination of the two).\nconfig(\"compiler_codegen\") {\n  configs = []\n  cflags = []\n\n  if (is_nacl) {\n    configs += [ \"//build/config/nacl:compiler_codegen\" ]\n  } else if (is_posix && !is_mac && !is_ios) {\n    if (current_cpu == \"x86\") {\n      if (is_clang) {\n        cflags += [\n          # Else building libyuv gives clang's register allocator issues,\n          # see llvm.org/PR15798 / crbug.com/233709\n          \"-momit-leaf-frame-pointer\",\n        ]\n      }\n    } else if (current_cpu == \"arm\") {\n      if (is_android && !is_clang) {\n        # Clang doesn't support these flags.\n        cflags += [\n          # The tree-sra optimization (scalar replacement for\n          # aggregates enabling subsequent optimizations) leads to\n          # invalid code generation when using the Android NDK's\n          # compiler (r5-r7). This can be verified using\n          # webkit_unit_tests' WTF.Checked_int8_t test.\n          \"-fno-tree-sra\",\n\n          # The following option is disabled to improve binary\n          # size and performance in gcc 4.9.\n          \"-fno-caller-saves\",\n        ]\n      }\n    }\n  }\n\n  asmflags = cflags\n}\n\n# This is separate from :compiler_codegen (and not even a sub-config there)\n# so that some targets can remove it from the list with:\n#   configs -= [ \"//build/config/compiler:clang_stackrealign\" ]\n# See https://crbug.com/556393 for details of where it must be avoided.\nconfig(\"clang_stackrealign\") {\n  if (is_clang && current_cpu == \"x86\" && is_linux) {\n    cflags = [\n      # Align the stack on 16-byte boundaries, http://crbug.com/418554.\n      \"-mstack-alignment=16\",\n      \"-mstackrealign\",\n    ]\n  }\n}\n\nconfig(\"compiler_arm_fpu\") {\n  if (current_cpu == \"arm\" && !is_ios && !is_nacl) {\n    cflags = [ \"-mfpu=$arm_fpu\" ]\n    asmflags = cflags\n  }\n}\n\nconfig(\"compiler_arm_thumb\") {\n  if (current_cpu == \"arm\" && arm_use_thumb && is_posix &&\n      !(is_mac || is_ios || is_nacl)) {\n    cflags = [ \"-mthumb\" ]\n    if (is_android && !is_clang) {\n      # Clang doesn't support this option.\n      cflags += [ \"-mthumb-interwork\" ]\n    }\n  }\n}\n\nconfig(\"compiler_arm\") {\n  if (current_cpu == \"arm\" && is_chromeos) {\n    # arm is normally the default mode for clang, but on chromeos a wrapper\n    # is used to pass -mthumb, and therefor change the default.\n    cflags = [ \"-marm\" ]\n  }\n}\n\n# runtime_library -------------------------------------------------------------\n#\n# Sets the runtime library and associated options.\n#\n# How do you determine what should go in here vs. \"compiler\" above? Consider if\n# a target might choose to use a different runtime library (ignore for a moment\n# if this is possible or reasonable on your system). If such a target would want\n# to change or remove your option, put it in the runtime_library config. If a\n# target wants the option regardless, put it in the compiler config.\n\nconfig(\"runtime_library\") {\n  defines = []\n  configs = []\n\n  # System-specific flags. If your compiler flags apply to one of the\n  # categories here, add it to the associated file to keep this shared config\n  # smaller.\n  if (is_win) {\n    configs += [ \"//build/config/win:runtime_library\" ]\n  } else if (is_linux) {\n    configs += [ \"//build/config/linux:runtime_library\" ]\n  } else if (is_ios) {\n    configs += [ \"//build/config/ios:runtime_library\" ]\n  } else if (is_mac) {\n    configs += [ \"//build/config/mac:runtime_library\" ]\n  } else if (is_android) {\n    configs += [ \"//build/config/android:runtime_library\" ]\n  }\n\n  if (is_posix) {\n    configs += [ \"//build/config/posix:runtime_library\" ]\n  }\n\n  if (is_component_build) {\n    defines += [ \"COMPONENT_BUILD\" ]\n  }\n}\n\n# default_warnings ------------------------------------------------------------\n#\n# Collects all warning flags that are used by default.  This is used as a\n# subconfig of both chromium_code and no_chromium_code.  This way these\n# flags are guaranteed to appear on the compile command line after -Wall.\nconfig(\"default_warnings\") {\n  cflags = []\n  cflags_cc = []\n\n  if (is_win) {\n    if (treat_warnings_as_errors) {\n      cflags += [ \"/WX\" ]\n    }\n\n    cflags += [\n      # Warnings permanently disabled:\n\n      # C4091: 'typedef ': ignored on left of 'X' when no variable is\n      #                    declared.\n      # This happens in a number of Windows headers. Dumb.\n      \"/wd4091\",\n\n      # C4127: conditional expression is constant\n      # This warning can in theory catch dead code and other problems, but\n      # triggers in far too many desirable cases where the conditional\n      # expression is either set by macros or corresponds some legitimate\n      # compile-time constant expression (due to constant template args,\n      # conditionals comparing the sizes of different types, etc.).  Some of\n      # these can be worked around, but it's not worth it.\n      \"/wd4127\",\n\n      # C4251: 'identifier' : class 'type' needs to have dll-interface to be\n      #        used by clients of class 'type2'\n      # This is necessary for the shared library build.\n      \"/wd4251\",\n\n      # C4351: new behavior: elements of array 'array' will be default\n      #        initialized\n      # This is a silly \"warning\" that basically just alerts you that the\n      # compiler is going to actually follow the language spec like it's\n      # supposed to, instead of not following it like old buggy versions did.\n      # There's absolutely no reason to turn this on.\n      \"/wd4351\",\n\n      # C4355: 'this': used in base member initializer list\n      # It's commonly useful to pass |this| to objects in a class' initializer\n      # list.  While this warning can catch real bugs, most of the time the\n      # constructors in question don't attempt to call methods on the passed-in\n      # pointer (until later), and annotating every legit usage of this is\n      # simply more hassle than the warning is worth.\n      \"/wd4355\",\n\n      # C4503: 'identifier': decorated name length exceeded, name was\n      #        truncated\n      # This only means that some long error messages might have truncated\n      # identifiers in the presence of lots of templates.  It has no effect on\n      # program correctness and there's no real reason to waste time trying to\n      # prevent it.\n      \"/wd4503\",\n\n      # Warning C4589 says: \"Constructor of abstract class ignores\n      # initializer for virtual base class.\" Disable this warning because it\n      # is flaky in VS 2015 RTM. It triggers on compiler generated\n      # copy-constructors in some cases.\n      \"/wd4589\",\n\n      # C4611: interaction between 'function' and C++ object destruction is\n      #        non-portable\n      # This warning is unavoidable when using e.g. setjmp/longjmp.  MSDN\n      # suggests using exceptions instead of setjmp/longjmp for C++, but\n      # Chromium code compiles without exception support.  We therefore have to\n      # use setjmp/longjmp for e.g. JPEG decode error handling, which means we\n      # have to turn off this warning (and be careful about how object\n      # destruction happens in such cases).\n      \"/wd4611\",\n\n      # Warnings to evaluate and possibly fix/reenable later:\n\n      \"/wd4100\",  # Unreferenced formal function parameter.\n      \"/wd4121\",  # Alignment of a member was sensitive to packing.\n      \"/wd4244\",  # Conversion: possible loss of data.\n      \"/wd4505\",  # Unreferenced local function has been removed.\n      \"/wd4510\",  # Default constructor could not be generated.\n      \"/wd4512\",  # Assignment operator could not be generated.\n      \"/wd4610\",  # Class can never be instantiated, constructor required.\n      \"/wd4838\",  # Narrowing conversion. Doesn't seem to be very useful.\n      \"/wd4995\",  # 'X': name was marked as #pragma deprecated\n      \"/wd4996\",  # Deprecated function warning.\n\n      # These are variable shadowing warnings that are new in VS2015. We\n      # should work through these at some point -- they may be removed from\n      # the RTM release in the /W4 set.\n      \"/wd4456\",\n      \"/wd4457\",\n      \"/wd4458\",\n      \"/wd4459\",\n    ]\n\n    cflags += [\n      # C4312 is a VS 2015 64-bit warning for integer to larger pointer.\n      # TODO(brucedawson): fix warnings, crbug.com/554200\n      \"/wd4312\",\n    ]\n\n    if (current_cpu == \"x86\") {\n      cflags += [\n        # VC++ 2015 changes 32-bit size_t truncation warnings from 4244 to\n        # 4267. Example: short TruncTest(size_t x) { return x; }\n        # Since we disable 4244 we need to disable 4267 during migration.\n        # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.\n        \"/wd4267\",\n      ]\n    }\n\n    # VS xtree header file needs to be patched or 4702 (unreachable code\n    # warning) is reported if _HAS_EXCEPTIONS=0. Disable the warning if xtree is\n    # not patched.\n    if (!msvs_xtree_patched &&\n        exec_script(\"../../win_is_xtree_patched.py\", [], \"value\") == 0) {\n      cflags += [ \"/wd4702\" ]  # Unreachable code.\n    }\n\n    # Building with Clang on Windows is a work in progress and very\n    # experimental. See crbug.com/82385.\n    if (is_clang) {\n      cflags += [\n        # TODO(hans): Make this list shorter eventually, http://crbug.com/504657\n        \"-Wno-microsoft-enum-value\",  # http://crbug.com/505296\n        \"-Wno-unknown-pragmas\",  # http://crbug.com/505314\n        \"-Wno-microsoft-cast\",  # http://crbug.com/550065\n      ]\n    }\n  } else {\n    if (is_mac && !is_nacl) {\n      # When compiling Objective-C, warns if a method is used whose\n      # availability is newer than the deployment target. This is not\n      # required when compiling Chrome for iOS.\n      cflags += [ \"-Wpartial-availability\" ]\n    }\n\n    # Suppress warnings about ABI changes on ARM (Clang doesn't give this\n    # warning).\n    if (current_cpu == \"arm\" && !is_clang) {\n      cflags += [ \"-Wno-psabi\" ]\n    }\n\n    if (!is_clang) {\n      cflags_cc += [\n        # See comment for -Wno-c++11-narrowing.\n        \"-Wno-narrowing\",\n      ]\n\n      # Don't warn about the \"typedef 'foo' locally defined but not used\"\n      # for gcc 4.8.\n      # TODO: remove this flag once all builds work. See crbug.com/227506\n      cflags += [ \"-Wno-unused-local-typedefs\" ]\n\n      # Don't warn about \"maybe\" uninitialized. Clang doesn't include this\n      # in -Wall but gcc does, and it gives false positives.\n      cflags += [ \"-Wno-maybe-uninitialized\" ]\n    }\n  }\n\n  # Common Clang and GCC warning setup.\n  if (!is_win || is_clang) {\n    cflags += [\n      # Disables.\n      \"-Wno-missing-field-initializers\",  # \"struct foo f = {0};\"\n      \"-Wno-unused-parameter\",  # Unused function parameters.\n    ]\n  }\n\n  if (is_chromeos) {\n    # TODO(thakis): Remove, http://crbug.com/263960\n    if (is_clang) {\n      cflags_cc += [ \"-Wno-reserved-user-defined-literal\" ]\n    } else {\n      cflags_cc += [ \"-Wno-literal-suffix\" ]\n    }\n  }\n\n  if (is_clang) {\n    cflags += [\n      # TODO(thakis): Consider -Wloop-analysis (turns on\n      # -Wrange-loop-analysis too).\n\n      # This warns on using ints as initializers for floats in\n      # initializer lists (e.g. |int a = f(); CGSize s = { a, a };|),\n      # which happens in several places in chrome code. Not sure if\n      # this is worth fixing.\n      \"-Wno-c++11-narrowing\",\n\n      # Warns on switches on enums that cover all enum values but\n      # also contain a default: branch. Chrome is full of that.\n      \"-Wno-covered-switch-default\",\n\n      # Clang considers the `register` keyword as deprecated, but e.g.\n      # code generated by flex (used in angle) contains that keyword.\n      # http://crbug.com/255186\n      \"-Wno-deprecated-register\",\n\n      # TODO(thakis): This used to be implied by -Wno-unused-function,\n      # which we no longer use. Check if it makes sense to remove\n      # this as well. http://crbug.com/316352\n      \"-Wno-unneeded-internal-declaration\",\n\n      # TODO(hans): Get this cleaned up, http://crbug.com/428099\n      \"-Wno-inconsistent-missing-override\",\n    ]\n\n    # Chrome's hermetic Clang compiler, NaCl's Clang compiler and Xcode's Clang\n    # compiler will almost always have different versions. Certain flags may not\n    # be recognized by one version or the other.\n    if (!is_nacl) {\n      # Flags NaCl (Clang 3.7) does not recognize.\n      cflags += [\n        # TODO(thakis): Enable this, crbug.com/507717\n        \"-Wno-shift-negative-value\",\n      ]\n    }\n    if (!is_nacl && !use_xcode_clang) {\n      # Flags NaCl (Clang 3.7) and Xcode 7.3 (Clang clang-703.0.31) do not\n      # recognize.\n      cflags += [\n        # TODO(thakis): https://crbug.com/604888\n        \"-Wno-undefined-var-template\",\n\n        # TODO(thakis): https://crbug.com/617318\n        \"-Wno-nonportable-include-path\",\n\n        # TODO(hans): https://crbug.com/637306\n        \"-Wno-address-of-packed-member\",\n      ]\n    }\n  }\n}\n\n# chromium_code ---------------------------------------------------------------\n#\n# Toggles between higher and lower warnings for code that is (or isn't)\n# part of Chromium.\n\nconfig(\"chromium_code\") {\n  if (is_win) {\n    cflags = [ \"/W4\" ]  # Warning level 4.\n\n    # Assume UTF-8 by default to avoid code page dependencies.\n    cflags += [ \"/utf-8\" ]\n  } else {\n    cflags = [ \"-Wall\" ]\n    if (treat_warnings_as_errors) {\n      cflags += [ \"-Werror\" ]\n\n      # The compiler driver can sometimes (rarely) emit warnings before calling\n      # the actual linker.  Make sure these warnings are treated as errors as\n      # well.\n      ldflags = [ \"-Werror\" ]\n    }\n    if (is_clang) {\n      # Enable -Wextra for chromium_code when we control the compiler.\n      cflags += [ \"-Wextra\" ]\n    }\n\n    # In Chromium code, we define __STDC_foo_MACROS in order to get the\n    # C99 macros on Mac and Linux.\n    defines = [\n      \"__STDC_CONSTANT_MACROS\",\n      \"__STDC_FORMAT_MACROS\",\n    ]\n\n    if (!is_debug && !using_sanitizer &&\n        (!is_linux || !is_clang || is_official_build)) {\n      # _FORTIFY_SOURCE isn't really supported by Clang now, see\n      # http://llvm.org/bugs/show_bug.cgi?id=16821.\n      # It seems to work fine with Ubuntu 12 headers though, so use it in\n      # official builds.\n      #\n      # Non-chromium code is not guaranteed to compile cleanly with\n      # _FORTIFY_SOURCE. Also, fortified build may fail when optimizations are\n      # disabled, so only do that for Release build.\n      defines += [ \"_FORTIFY_SOURCE=2\" ]\n    }\n\n    if (is_mac || is_ios) {\n      cflags_objc = [ \"-Wobjc-missing-property-synthesis\" ]\n      cflags_objcc = [ \"-Wobjc-missing-property-synthesis\" ]\n    }\n  }\n\n  configs = [ \":default_warnings\" ]\n}\n\nconfig(\"no_chromium_code\") {\n  cflags = []\n  cflags_cc = []\n  defines = []\n\n  if (is_win) {\n    cflags += [\n      \"/W3\",  # Warning level 3.\n      \"/wd4800\",  # Disable warning when forcing value to bool.\n      \"/wd4267\",  # TODO(jschuh): size_t to int.\n      \"/wd4996\",  # Deprecated function warning.\n    ]\n    defines += [\n      \"_CRT_NONSTDC_NO_WARNINGS\",\n      \"_CRT_NONSTDC_NO_DEPRECATE\",\n    ]\n  } else {\n    # GCC may emit unsuppressible warnings so don't add -Werror for no chromium\n    # code. crbug.com/589724\n    if (treat_warnings_as_errors && is_clang) {\n      cflags += [ \"-Werror\" ]\n      ldflags = [ \"-Werror\" ]\n    }\n    if (is_clang && !is_nacl) {\n      # TODO(thakis): Remove !is_nacl once\n      # https://codereview.webrtc.org/1552863002/ made its way into chromium.\n      cflags += [ \"-Wall\" ]\n    }\n  }\n\n  if (is_clang) {\n    cflags += [\n      # Lots of third-party libraries have unused variables. Instead of\n      # suppressing them individually, we just blanket suppress them here.\n      \"-Wno-unused-variable\",\n    ]\n  }\n\n  if (is_linux || is_android) {\n    cflags_cc += [\n      # Don't warn about hash_map in third-party code.\n      \"-Wno-deprecated\",\n    ]\n  }\n\n  configs = [ \":default_warnings\" ]\n}\n\n# rtti ------------------------------------------------------------------------\n#\n# Allows turning Run-Time Type Identification on or off.\n\nconfig(\"rtti\") {\n  if (is_win) {\n    cflags_cc = [ \"/GR\" ]\n  } else {\n    cflags_cc = [ \"-frtti\" ]\n  }\n}\nconfig(\"no_rtti\") {\n  # CFI diagnostics and UBsan vptr require RTTI.\n  if (!use_cfi_diag && !is_ubsan_vptr && !is_ubsan_security) {\n    if (is_win) {\n      cflags_cc = [ \"/GR-\" ]\n    } else {\n      cflags_cc = [ \"-fno-rtti\" ]\n      cflags_objcc = cflags_cc\n    }\n  }\n}\n\n# Warnings ---------------------------------------------------------------------\n\n# This will generate warnings when using Clang if code generates exit-time\n# destructors, which will slow down closing the program.\n# TODO(thakis): Make this a blacklist instead, http://crbug.com/101600\nconfig(\"wexit_time_destructors\") {\n  # TODO: Enable on Windows too, http://crbug.com/404525\n  if (is_clang && !is_win) {\n    cflags = [ \"-Wexit-time-destructors\" ]\n  }\n}\n\n# On Windows compiling on x64, VC will issue a warning when converting\n# size_t to int because it will truncate the value. Our code should not have\n# these warnings and one should use a static_cast or a checked_cast for the\n# conversion depending on the case. However, a lot of code still needs to be\n# fixed. Apply this config to such targets to disable the warning.\n#\n# Note that this can be applied regardless of platform and architecture to\n# clean up the call sites. This will only apply the flag when necessary.\n#\n# TODO(jschuh): crbug.com/167187 fix this and delete this config.\nconfig(\"no_size_t_to_int_warning\") {\n  if (is_win && current_cpu == \"x64\") {\n    cflags = [ \"/wd4267\" ]\n  }\n}\n\n# Some code presumes that pointers to structures/objects are compatible\n# regardless of whether what they point to is already known to be valid.\n# gcc 4.9 and earlier had no way of suppressing this warning without\n# supressing the rest of them.  Here we centralize the identification of\n# the gcc 4.9 toolchains.\nconfig(\"no_incompatible_pointer_warnings\") {\n  cflags = []\n  if (is_clang) {\n    cflags += [ \"-Wno-incompatible-pointer-types\" ]\n  } else if (current_cpu == \"mipsel\") {\n    cflags += [ \"-w\" ]\n  } else if (is_chromeos && current_cpu == \"arm\") {\n    cflags += [ \"-w\" ]\n  }\n}\n\n# Optimization -----------------------------------------------------------------\n#\n# The BUILDCONFIG file sets the \"default_optimization\" config on targets by\n# default. It will be equivalent to either \"optimize\" (release) or\n# \"no_optimize\" (debug) optimization configs.\n#\n# You can override the optimization level on a per-target basis by removing the\n# default config and then adding the named one you want:\n#\n#   configs -= [ \"//build/config/compiler:default_optimization\" ]\n#   configs += [ \"//build/config/compiler:optimize_max\" ]\n\n# Shared settings for both \"optimize\" and \"optimize_max\" configs.\n# IMPORTANT: On Windows \"/O1\" and \"/O2\" must go before the common flags.\nif (is_win) {\n  common_optimize_on_cflags = [\n    \"/Ob2\",  # Both explicit and auto inlining.\n    \"/Oy-\",  # Disable omitting frame pointers, must be after /O2.\n    \"/d2Zi+\",  # Improve debugging of optimized code.\n    \"/Zc:inline\",  # Remove unreferenced COMDAT (faster links).\n  ]\n  if (!is_asan) {\n    common_optimize_on_cflags += [\n      # Put data in separate COMDATs. This allows the linker\n      # to put bit-identical constants at the same address even if\n      # they're unrelated constants, which saves binary size.\n      # This optimization can't be used when ASan is enabled because\n      # it is not compatible with the ASan ODR checker.\n      \"/Gw\",\n    ]\n  }\n  common_optimize_on_ldflags = []\n  if (!is_component_build) {\n    common_optimize_on_ldflags += [ \"/OPT:ICF\" ]  # Redundant COMDAT folding.\n  }\n  if (is_official_build) {\n    common_optimize_on_ldflags += [ \"/OPT:REF\" ]  # Remove unreferenced data.\n    if (!use_lld) {\n      common_optimize_on_ldflags += [\n        # Set the number of LTCG code-gen threads to eight. The default is four.\n        # This gives a 5-10% link speedup.\n        \"/cgthreads:8\",\n      ]\n      if (use_incremental_wpo) {\n        # Incremental Link-time code generation.\n        common_optimize_on_ldflags += [ \"/LTCG:INCREMENTAL\" ]\n      } else {\n        common_optimize_on_ldflags += [ \"/LTCG\" ]  # Link-time code generation.\n      }\n    }\n    if (full_wpo_on_official) {\n      if (use_incremental_wpo) {\n        arflags = [ \"/LTCG:INCREMENTAL\" ]\n      } else {\n        arflags = [ \"/LTCG\" ]\n      }\n    }\n  }\n} else {\n  common_optimize_on_cflags = []\n  common_optimize_on_ldflags = []\n\n  if (is_android) {\n    # TODO(jdduke) Re-enable on mips after resolving linking\n    # issues with libc++ (crbug.com/456380).\n    if (current_cpu != \"mipsel\" && current_cpu != \"mips64el\") {\n      common_optimize_on_ldflags += [\n        # Warn in case of text relocations.\n        \"-Wl,--warn-shared-textrel\",\n      ]\n    }\n  }\n\n  if (is_mac || is_ios) {\n    if (symbol_level == 2) {\n      # Mac dead code stripping requires symbols.\n      common_optimize_on_ldflags += [ \"-Wl,-dead_strip\" ]\n    }\n  } else {\n    # Non-Mac Posix flags.\n\n    common_optimize_on_cflags += [\n      # Don't emit the GCC version ident directives, they just end up in the\n      # .comment section taking up binary size.\n      \"-fno-ident\",\n\n      # Put data and code in their own sections, so that unused symbols\n      # can be removed at link time with --gc-sections.\n      \"-fdata-sections\",\n      \"-ffunction-sections\",\n    ]\n\n    common_optimize_on_ldflags += [\n      # Specifically tell the linker to perform optimizations.\n      # See http://lwn.net/Articles/192624/ .\n      \"-Wl,-O1\",\n      \"-Wl,--gc-sections\",\n    ]\n  }\n}\n\nconfig(\"default_stack_frames\") {\n  if (is_posix && !(is_mac || is_ios)) {\n    if (using_sanitizer || enable_profiling || is_debug ||\n        current_cpu == \"arm64\") {\n      # Explicitly ask for frame pointers, otherwise:\n      # * Stacks may be missing for sanitizer and profiling builds.\n      # * Debug tcmalloc can crash (crbug.com/636489).\n      # * Stacks may be missing for arm64 crash dumps (crbug.com/391706).\n      cflags = [ \"-fno-omit-frame-pointer\" ]\n    } else if (is_android) {\n      cflags = [ \"-fomit-frame-pointer\" ]\n    }\n  }\n}\n\n# Default \"optimization on\" config.\nconfig(\"optimize\") {\n  if (is_win) {\n    # TODO(thakis): Remove is_clang here, https://crbug.com/598772\n    if (is_official_build && full_wpo_on_official && !is_clang) {\n      common_optimize_on_cflags += [\n        \"/GL\",  # Whole program optimization.\n\n        # Disable Warning 4702 (\"Unreachable code\") for the WPO/PGO builds.\n        # Probably anything that this would catch that wouldn't be caught in a\n        # normal build isn't going to actually be a bug, so the incremental\n        # value of C4702 for PGO builds is likely very small.\n        \"/wd4702\",\n      ]\n    }\n\n    # Favor size over speed, /O1 must be before the common flags. The GYP\n    # build also specifies /Os and /GF but these are implied by /O1.\n    cflags = [ \"/O1\" ] + common_optimize_on_cflags + [ \"/Oi\" ]\n  } else if (optimize_for_size) {\n    # Favor size over speed.\n    cflags = [ \"-Os\" ] + common_optimize_on_cflags\n  } else {\n    cflags = [ \"-O2\" ] + common_optimize_on_cflags\n  }\n  ldflags = common_optimize_on_ldflags\n}\n\n# Same config as 'optimize' but without the WPO flag.\nconfig(\"optimize_no_wpo\") {\n  if (is_win) {\n    # Favor size over speed, /O1 must be before the common flags. The GYP\n    # build also specifies /Os and /GF but these are implied by /O1.\n    cflags = [ \"/O1\" ] + common_optimize_on_cflags + [ \"/Oi\" ]\n  } else if (optimize_for_size) {\n    # Favor size over speed.\n    cflags = [ \"-Os\" ] + common_optimize_on_cflags\n  } else if (optimize_for_fuzzing) {\n    cflags = [ \"-O1\" ] + common_optimize_on_cflags\n  } else {\n    cflags = [ \"-O2\" ] + common_optimize_on_cflags\n  }\n  ldflags = common_optimize_on_ldflags\n}\n\n# Turn off optimizations.\nconfig(\"no_optimize\") {\n  if (is_win) {\n    cflags = [\n      \"/Od\",  # Disable optimization.\n      \"/Ob0\",  # Disable all inlining (on by default).\n    ]\n  } else if (is_android && !android_full_debug) {\n    # On Android we kind of optimize some things that don't affect debugging\n    # much even when optimization is disabled to get the binary size down.\n    cflags = [ \"-Os\" ]\n  } else {\n    cflags = [ \"-O0\" ]\n    ldflags = []\n  }\n}\n\n# Turns up the optimization level. On Windows, this implies whole program\n# optimization and link-time code generation which is very expensive and should\n# be used sparingly.\nconfig(\"optimize_max\") {\n  if (is_nacl_irt) {\n    # The NaCl IRT is a special case and always wants its own config.\n    # Various components do:\n    #   if (!is_debug) {\n    #     configs -= [ \"//build/config/compiler:default_optimization\" ]\n    #     configs += [ \"//build/config/compiler:optimize_max\" ]\n    #   }\n    # So this config has to have the selection logic just like\n    # \"default_optimization\", below.\n    configs = [ \"//build/config/nacl:irt_optimize\" ]\n  } else {\n    ldflags = common_optimize_on_ldflags\n    if (is_win) {\n      # Favor speed over size, /O2 must be before the common flags. The GYP\n      # build also specifies /Ot, /Oi, and /GF, but these are implied by /O2.\n      cflags = [ \"/O2\" ] + common_optimize_on_cflags\n\n      if (is_official_build) {\n        if (!is_clang) {\n          cflags += [\n            \"/GL\",  # Whole program optimization.\n\n            # Disable Warning 4702 (\"Unreachable code\") for the WPO/PGO builds.\n            # Probably anything that this would catch that wouldn't be caught\n            # in a normal build isn't going to actually be a bug, so the\n            # incremental value of C4702 for PGO builds is likely very small.\n            \"/wd4702\",\n          ]\n        } else if (is_clang && use_lld) {\n          cflags += [ \"-flto\" ]  # Link-time optimization (whole program optimization).\n        }\n      }\n    } else if (optimize_for_fuzzing) {\n      cflags = [ \"-O1\" ] + common_optimize_on_cflags\n    } else {\n      cflags = [ \"-O2\" ] + common_optimize_on_cflags\n    }\n  }\n}\n\n# This config can be used to override the default settings for per-component\n# and whole-program optimization, optimizing the particular target for speed\n# instead of code size. This config is exactly the same as \"optimize_max\"\n# except that we use -O3 instead of -O2 on non-win, non-IRT platforms.\n#\n# TODO(crbug.com/621335) - rework how all of these configs are related\n# so that we don't need this disclaimer.\nconfig(\"optimize_speed\") {\n  if (is_nacl_irt) {\n    # The NaCl IRT is a special case and always wants its own config.\n    # Various components do:\n    #   if (!is_debug) {\n    #     configs -= [ \"//build/config/compiler:default_optimization\" ]\n    #     configs += [ \"//build/config/compiler:optimize_max\" ]\n    #   }\n    # So this config has to have the selection logic just like\n    # \"default_optimization\", below.\n    configs = [ \"//build/config/nacl:irt_optimize\" ]\n  } else {\n    ldflags = common_optimize_on_ldflags\n    if (is_win) {\n      # Favor speed over size, /O2 must be before the common flags. The GYP\n      # build also specifies /Ot, /Oi, and /GF, but these are implied by /O2.\n      cflags = [ \"/O2\" ] + common_optimize_on_cflags\n\n      # TODO(thakis): Remove is_clang here, https://crbug.com/598772\n      if (is_official_build && !is_clang) {\n        cflags += [\n          \"/GL\",  # Whole program optimization.\n\n          # Disable Warning 4702 (\"Unreachable code\") for the WPO/PGO builds.\n          # Probably anything that this would catch that wouldn't be caught in a\n          # normal build isn't going to actually be a bug, so the incremental\n          # value of C4702 for PGO builds is likely very small.\n          \"/wd4702\",\n        ]\n      }\n    } else if (optimize_for_fuzzing) {\n      cflags = [ \"-O1\" ] + common_optimize_on_cflags\n    } else {\n      cflags = [ \"-O3\" ] + common_optimize_on_cflags\n    }\n  }\n}\n\nconfig(\"optimize_fuzzing\") {\n  cflags = [ \"-O1\" ] + common_optimize_on_cflags\n  ldflags = common_optimize_on_ldflags\n  visibility = [ \":default_optimization\" ]\n}\n\n# The default optimization applied to all targets. This will be equivalent to\n# either \"optimize\" or \"no_optimize\", depending on the build flags.\nconfig(\"default_optimization\") {\n  if (is_nacl_irt) {\n    # The NaCl IRT is a special case and always wants its own config.\n    # It gets optimized the same way regardless of the type of build.\n    configs = [ \"//build/config/nacl:irt_optimize\" ]\n  } else if (is_debug) {\n    configs = [ \":no_optimize\" ]\n  } else if (optimize_for_fuzzing) {\n    assert(!is_win, \"Fuzzing optimize level not supported on Windows\")\n    configs = [ \":optimize_fuzzing\" ]\n  } else {\n    configs = [ \":optimize\" ]\n  }\n}\n\n# GCC supports a form of profile-guided optimization called AFDO, which\n# is used by ChromeOS in their official builds. However,\n# //base/allocator:tcmalloc currently doesn't work correctly with AFDO\n# so we provide separate config so that the flag can be disabled per-target.\n# TODO(crbug.com/633719): Remove this config once tcmalloc works with AFDO\n# or we remove tcmalloc or we stop using AFDO.\nconfig(\"afdo\") {\n  if (auto_profile_path != \"\" && current_toolchain == default_toolchain) {\n    cflags = [ \"-fauto-profile=${auto_profile_path}\" ]\n  }\n}\n\n# Symbols ----------------------------------------------------------------------\n\n# The BUILDCONFIG file sets the \"default_symbols\" config on targets by\n# default. It will be equivalent to one the three specific symbol levels.\n#\n# You can override the symbol level on a per-target basis by removing the\n# default config and then adding the named one you want:\n#\n#   configs -= [ \"//build/config/compiler:default_symbols\" ]\n#   configs += [ \"//build/config/compiler:symbols\" ]\n\n# Full symbols.\nconfig(\"symbols\") {\n  if (is_win) {\n    cflags = [ \"/Zi\" ]  # Produce PDB file, no edit and continue.\n\n    if (is_win_fastlink) {\n      # Tell VS 2015+ to create a PDB that references debug\n      # information in .obj and .lib files instead of copying\n      # it all. This flag is incompatible with /PROFILE\n      ldflags = [ \"/DEBUG:FASTLINK\" ]\n    } else {\n      ldflags = [ \"/DEBUG\" ]\n    }\n  } else {\n    if (is_mac || is_ios) {\n      cflags = [ \"-gdwarf-2\" ]\n      if (is_mac && enable_dsyms) {\n        # If generating dSYMs, specify -fno-standalone-debug. This was\n        # originally specified for https://crbug.com/479841 because dsymutil\n        # could not handle a 4GB dSYM file. But dsymutil from Xcodes prior to\n        # version 7 also produces debug data that is incompatible with Breakpad\n        # dump_syms, so this is still required (https://crbug.com/622406).\n        cflags += [ \"-fno-standalone-debug\" ]\n      }\n    } else if (is_android) {\n      # Breakpad can't handle DWARF 4 symbols properly yet, so use DWARF 3\n      # explicitly on android where we are hitting https://crbug.com/638485.\n      # The arguments MUST be in this order because of a gcc arg parsing bug.\n      cflags = [\n        \"-gdwarf-3\",\n        \"-g2\",\n      ]\n    } else {\n      cflags = [ \"-g2\" ]\n    }\n    if (use_debug_fission) {\n      cflags += [ \"-gsplit-dwarf\" ]\n    }\n    asmflags = cflags\n    ldflags = []\n  }\n}\n\n# Minimal symbols.\nconfig(\"minimal_symbols\") {\n  if (is_win) {\n    # Linker symbols for backtraces only.\n    cflags = []\n    ldflags = [ \"/DEBUG\" ]\n  } else {\n    if (is_android) {\n      # Breakpad can't handle DWARF 4 symbols properly yet, so use DWARF 3\n      # explicitly on android where we are hitting https://crbug.com/638485.\n      # The arguments MUST be in this order because of a gcc arg parsing bug.\n      cflags = [\n        \"-gdwarf-3\",\n        \"-g1\",\n      ]\n    } else {\n      cflags = [ \"-g1\" ]\n    }\n    if (use_debug_fission) {\n      cflags += [ \"-gsplit-dwarf\" ]\n    }\n    asmflags = cflags\n    ldflags = []\n  }\n}\n\n# No symbols.\nconfig(\"no_symbols\") {\n  if (!is_win) {\n    cflags = [ \"-g0\" ]\n    asmflags = cflags\n  }\n}\n\n# Default symbols.\nconfig(\"default_symbols\") {\n  if (symbol_level == 0) {\n    configs = [ \":no_symbols\" ]\n  } else if (symbol_level == 1) {\n    configs = [ \":minimal_symbols\" ]\n  } else if (symbol_level == 2) {\n    configs = [ \":symbols\" ]\n  } else {\n    assert(false)\n  }\n}\n\nif (is_ios || is_mac) {\n  # On Mac and iOS, this enables support for ARC (automatic ref-counting).\n  # See http://clang.llvm.org/docs/AutomaticReferenceCounting.html.\n  config(\"enable_arc\") {\n    common_flags = [ \"-fobjc-arc\" ]\n    cflags_objc = common_flags\n    cflags_objcc = common_flags\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/BUILD.gn",
    "content": "# Copyright 2014 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/android/config.gni\")\nimport(\"//build/config/arm.gni\")\nimport(\"//build/config/dcheck_always_on.gni\")\nimport(\"//build/config/mips.gni\")\nimport(\"//build/config/sanitizers/sanitizers.gni\")\n\nif (is_android) {\n  import(\"//build/config/android/rules.gni\")\n}\n\nimport(\"gni/v8.gni\")\nimport(\"gni/isolate.gni\")\nimport(\"//build_overrides/v8.gni\")\n\nimport(\"snapshot_toolchain.gni\")\n\ndeclare_args() {\n  # Print to stdout on Android.\n  v8_android_log_stdout = false\n\n  # Sets -DVERIFY_HEAP.\n  v8_enable_verify_heap = false\n\n  # Enable compiler warnings when using V8_DEPRECATED apis.\n  v8_deprecation_warnings = false\n\n  # Enable compiler warnings when using V8_DEPRECATE_SOON apis.\n  v8_imminent_deprecation_warnings = \"\"\n\n  # Embeds the given script into the snapshot.\n  v8_embed_script = \"\"\n\n  # Sets -dENABLE_DISASSEMBLER.\n  v8_enable_disassembler = \"\"\n\n  # Sets -dENABLE_GDB_JIT_INTERFACE.\n  v8_enable_gdbjit = \"\"\n\n  # Sets -dENABLE_HANDLE_ZAPPING.\n  v8_enable_handle_zapping = is_debug\n\n  # Enable ECMAScript Internationalization API. Enabling this feature will\n  # add a dependency on the ICU library.\n  v8_enable_i18n_support = true\n\n  # Enable slow dchecks.\n  v8_enable_slow_dchecks = false\n\n  # Interpreted regexp engine exists as platform-independent alternative\n  # based where the regular expression is compiled to a bytecode.\n  v8_interpreted_regexp = false\n\n  # Sets -dOBJECT_PRINT.\n  v8_object_print = \"\"\n\n  # With post mortem support enabled, metadata is embedded into libv8 that\n  # describes various parameters of the VM for use by debuggers. See\n  # tools/gen-postmortem-metadata.py for details.\n  v8_postmortem_support = false\n\n  # Similar to vfp but on MIPS.\n  v8_can_use_fpu_instructions = true\n\n  # Similar to the ARM hard float ABI but on MIPS.\n  v8_use_mips_abi_hardfloat = true\n}\n\n# Set project-specific defaults for some args if not provided in args.gn. The\n# defaults can be set in the respective build_overrides files.\nif (v8_imminent_deprecation_warnings == \"\") {\n  if (defined(v8_imminent_deprecation_warnings_default)) {\n    v8_imminent_deprecation_warnings = v8_imminent_deprecation_warnings_default\n  } else {\n    v8_imminent_deprecation_warnings = false\n  }\n}\nif (v8_enable_gdbjit == \"\") {\n  if (defined(v8_enable_gdbjit_default)) {\n    v8_enable_gdbjit = v8_enable_gdbjit_default\n  } else {\n    v8_enable_gdbjit = false\n  }\n}\n\n# Derived defaults.\nif (v8_object_print == \"\") {\n  v8_object_print = is_debug && !v8_optimized_debug\n}\nif (v8_enable_disassembler == \"\") {\n  v8_enable_disassembler = is_debug && !v8_optimized_debug\n}\n\nv8_generated_peephole_source = \"$target_gen_dir/bytecode-peephole-table.cc\"\nv8_random_seed = \"314159265\"\nv8_toolset_for_shell = \"host\"\n\n###############################################################################\n# Configurations\n#\nconfig(\"internal_config\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  include_dirs = [ \".\" ]\n\n  if (is_component_build) {\n    defines = [\n      \"V8_SHARED\",\n      \"BUILDING_V8_SHARED\",\n    ]\n  }\n}\n\nconfig(\"internal_config_base\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  include_dirs = [ \".\" ]\n}\n\n# This config should be applied to code using the libplatform.\nconfig(\"libplatform_config\") {\n  include_dirs = [ \"include\" ]\n}\n\n# This config should be applied to code using the libsampler.\nconfig(\"libsampler_config\") {\n  include_dirs = [ \"include\" ]\n}\n\n# This config should only be applied to code using V8 and not any V8 code\n# itself.\nconfig(\"external_config\") {\n  if (is_component_build) {\n    defines = [\n      \"V8_SHARED\",\n      \"USING_V8_SHARED\",\n    ]\n  }\n  include_dirs = [ \"include\" ]\n  libs = []\n  if (is_android && current_toolchain != host_toolchain) {\n    libs += [ \"log\" ]\n  }\n}\n\n# This config should only be applied to code that needs to be explicitly\n# aware of whether we are using startup data or not.\nconfig(\"external_startup_data\") {\n  if (v8_use_external_startup_data) {\n    defines = [ \"V8_USE_EXTERNAL_STARTUP_DATA\" ]\n  }\n}\n\nconfig(\"features\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  defines = []\n\n  if (v8_enable_disassembler) {\n    defines += [ \"ENABLE_DISASSEMBLER\" ]\n  }\n  if (v8_enable_gdbjit) {\n    defines += [ \"ENABLE_GDB_JIT_INTERFACE\" ]\n  }\n  if (v8_object_print) {\n    defines += [ \"OBJECT_PRINT\" ]\n  }\n  if (v8_enable_verify_heap) {\n    defines += [ \"VERIFY_HEAP\" ]\n  }\n  if (v8_interpreted_regexp) {\n    defines += [ \"V8_INTERPRETED_REGEXP\" ]\n  }\n  if (v8_deprecation_warnings) {\n    defines += [ \"V8_DEPRECATION_WARNINGS\" ]\n  }\n  if (v8_imminent_deprecation_warnings) {\n    defines += [ \"V8_IMMINENT_DEPRECATION_WARNINGS\" ]\n  }\n  if (v8_enable_i18n_support) {\n    defines += [ \"V8_I18N_SUPPORT\" ]\n  }\n  if (v8_enable_handle_zapping) {\n    defines += [ \"ENABLE_HANDLE_ZAPPING\" ]\n  }\n  if (v8_use_external_startup_data) {\n    defines += [ \"V8_USE_EXTERNAL_STARTUP_DATA\" ]\n  }\n}\n\nconfig(\"toolchain\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  defines = []\n  cflags = []\n  ldflags = []\n\n  if (v8_current_cpu == \"arm\") {\n    defines += [ \"V8_TARGET_ARCH_ARM\" ]\n    if (arm_version == 7) {\n      defines += [ \"CAN_USE_ARMV7_INSTRUCTIONS\" ]\n    }\n    if (arm_fpu == \"vfpv3-d16\") {\n      defines += [ \"CAN_USE_VFP3_INSTRUCTIONS\" ]\n    } else if (arm_fpu == \"vfpv3\") {\n      defines += [\n        \"CAN_USE_VFP3_INSTRUCTIONS\",\n        \"CAN_USE_VFP32DREGS\",\n      ]\n    } else if (arm_fpu == \"neon\") {\n      defines += [\n        \"CAN_USE_VFP3_INSTRUCTIONS\",\n        \"CAN_USE_VFP32DREGS\",\n        \"CAN_USE_NEON\",\n      ]\n    }\n\n    # TODO(jochen): Add support for arm_test_noprobe.\n\n    if (current_cpu != \"arm\") {\n      # These defines ares used for the ARM simulator.\n      if (arm_float_abi == \"hard\") {\n        defines += [ \"USE_EABI_HARDFLOAT=1\" ]\n      } else if (arm_float_abi == \"softfp\") {\n        defines += [ \"USE_EABI_HARDFLOAT=0\" ]\n      }\n    }\n  }\n  if (v8_current_cpu == \"arm64\") {\n    defines += [ \"V8_TARGET_ARCH_ARM64\" ]\n  }\n\n  # TODO(jochen): Add support for mips.\n  if (v8_current_cpu == \"mipsel\") {\n    defines += [ \"V8_TARGET_ARCH_MIPS\" ]\n    if (v8_can_use_fpu_instructions) {\n      defines += [ \"CAN_USE_FPU_INSTRUCTIONS\" ]\n    }\n    if (v8_use_mips_abi_hardfloat) {\n      defines += [\n        \"__mips_hard_float=1\",\n        \"CAN_USE_FPU_INSTRUCTIONS\",\n      ]\n    } else {\n      defines += [ \"__mips_soft_float=1\" ]\n    }\n    if (mips_arch_variant == \"r6\") {\n      defines += [\n        \"_MIPS_ARCH_MIPS32R6\",\n        \"FPU_MODE_FP64\",\n      ]\n    } else if (mips_arch_variant == \"r2\") {\n      defines += [ \"_MIPS_ARCH_MIPS32R2\" ]\n      if (mips_fpu_mode == \"fp64\") {\n        defines += [ \"FPU_MODE_FP64\" ]\n      } else if (mips_fpu_mode == \"fpxx\") {\n        defines += [ \"FPU_MODE_FPXX\" ]\n      } else if (mips_fpu_mode == \"fp32\") {\n        defines += [ \"FPU_MODE_FP32\" ]\n      }\n    } else if (mips_arch_variant == \"r1\") {\n      defines += [ \"FPU_MODE_FP32\" ]\n    }\n\n    # TODO(jochen): Add support for mips_arch_variant rx and loongson.\n  }\n\n  # TODO(jochen): Add support for mips64.\n  if (v8_current_cpu == \"mips64el\") {\n    defines += [ \"V8_TARGET_ARCH_MIPS64\" ]\n    if (v8_can_use_fpu_instructions) {\n      defines += [ \"CAN_USE_FPU_INSTRUCTIONS\" ]\n    }\n\n    # TODO(jochen): Add support for big endian host byteorder.\n    defines += [ \"V8_TARGET_ARCH_MIPS64_LE\" ]\n    if (v8_use_mips_abi_hardfloat) {\n      defines += [\n        \"__mips_hard_float=1\",\n        \"CAN_USE_FPU_INSTRUCTIONS\",\n      ]\n    } else {\n      defines += [ \"__mips_soft_float=1\" ]\n    }\n    if (mips_arch_variant == \"r6\") {\n      defines += [ \"_MIPS_ARCH_MIPS64R6\" ]\n    } else if (mips_arch_variant == \"r2\") {\n      defines += [ \"_MIPS_ARCH_MIPS64R2\" ]\n    }\n  }\n  if (v8_current_cpu == \"s390\" || v8_current_cpu == \"s390x\") {\n    defines += [ \"V8_TARGET_ARCH_S390\" ]\n    if (v8_current_cpu == \"s390x\") {\n      defines += [ \"V8_TARGET_ARCH_S390X\" ]\n    }\n    if (host_cpu == \"x64\" || host_cpu == \"x86\") {\n      defines += [ \"V8_TARGET_ARCH_S390_LE_SIM\" ]\n    }\n  }\n  if (v8_current_cpu == \"x86\") {\n    defines += [ \"V8_TARGET_ARCH_IA32\" ]\n    if (is_win) {\n      # Ensure no surprising artifacts from 80bit double math with x86.\n      cflags += [ \"/arch:SSE2\" ]\n    }\n  }\n  if (v8_current_cpu == \"x64\") {\n    defines += [ \"V8_TARGET_ARCH_X64\" ]\n    if (is_win) {\n      # Increase the initial stack size. The default is 1MB, this is 2MB. This\n      # applies only to executables and shared libraries produced by V8 since\n      # ldflags are not pushed to dependants.\n      ldflags += [ \"/STACK:2097152\" ]\n    }\n  }\n  if (is_android && v8_android_log_stdout) {\n    defines += [ \"V8_ANDROID_LOG_STDOUT\" ]\n  }\n\n  # TODO(jochen): Support v8_enable_prof on Windows.\n  # TODO(jochen): Add support for compiling with simulators.\n\n  if (is_debug) {\n    if (is_linux && v8_enable_backtrace) {\n      ldflags += [ \"-rdynamic\" ]\n    }\n\n    # TODO(jochen): Add support for different debug optimization levels.\n    defines += [\n      \"ENABLE_DISASSEMBLER\",\n      \"V8_ENABLE_CHECKS\",\n      \"OBJECT_PRINT\",\n      \"VERIFY_HEAP\",\n      \"DEBUG\",\n      \"TRACE_MAPS\",\n    ]\n    if (v8_enable_slow_dchecks) {\n      defines += [ \"ENABLE_SLOW_DCHECKS\" ]\n    }\n  } else if (dcheck_always_on) {\n    defines += [ \"DEBUG\" ]\n  }\n}\n\n###############################################################################\n# Actions\n#\n\naction(\"js2c\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  script = \"tools/js2c.py\"\n\n  # The script depends on this other script, this rule causes a rebuild if it\n  # changes.\n  inputs = [\n    \"tools/jsmin.py\",\n  ]\n\n  # NOSORT\n  sources = [\n    \"src/js/macros.py\",\n    \"src/messages.h\",\n    \"src/js/prologue.js\",\n    \"src/js/runtime.js\",\n    \"src/js/v8natives.js\",\n    \"src/js/symbol.js\",\n    \"src/js/array.js\",\n    \"src/js/string.js\",\n    \"src/js/math.js\",\n    \"src/js/regexp.js\",\n    \"src/js/arraybuffer.js\",\n    \"src/js/typedarray.js\",\n    \"src/js/iterator-prototype.js\",\n    \"src/js/collection.js\",\n    \"src/js/weak-collection.js\",\n    \"src/js/collection-iterator.js\",\n    \"src/js/promise.js\",\n    \"src/js/messages.js\",\n    \"src/js/array-iterator.js\",\n    \"src/js/string-iterator.js\",\n    \"src/js/templates.js\",\n    \"src/js/spread.js\",\n    \"src/js/proxy.js\",\n    \"src/debug/mirrors.js\",\n    \"src/debug/debug.js\",\n    \"src/debug/liveedit.js\",\n  ]\n\n  outputs = [\n    \"$target_gen_dir/libraries.cc\",\n  ]\n\n  if (v8_enable_i18n_support) {\n    sources += [ \"src/js/i18n.js\" ]\n  }\n\n  args = [\n           rebase_path(\"$target_gen_dir/libraries.cc\", root_build_dir),\n           \"CORE\",\n         ] + rebase_path(sources, root_build_dir)\n\n  if (v8_use_external_startup_data) {\n    outputs += [ \"$target_gen_dir/libraries.bin\" ]\n    args += [\n      \"--startup_blob\",\n      rebase_path(\"$target_gen_dir/libraries.bin\", root_build_dir),\n    ]\n  }\n}\n\naction(\"js2c_experimental\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  script = \"tools/js2c.py\"\n\n  # The script depends on this other script, this rule causes a rebuild if it\n  # changes.\n  inputs = [\n    \"tools/jsmin.py\",\n  ]\n\n  # NOSORT\n  sources = [\n    \"src/js/macros.py\",\n    \"src/messages.h\",\n    \"src/js/harmony-async-await.js\",\n    \"src/js/harmony-atomics.js\",\n    \"src/js/harmony-simd.js\",\n    \"src/js/harmony-string-padding.js\",\n  ]\n\n  outputs = [\n    \"$target_gen_dir/experimental-libraries.cc\",\n  ]\n\n  if (v8_enable_i18n_support) {\n    sources += [\n      \"src/js/icu-case-mapping.js\",\n      \"src/js/intl-extra.js\",\n    ]\n  }\n\n  args = [\n           rebase_path(\"$target_gen_dir/experimental-libraries.cc\",\n                       root_build_dir),\n           \"EXPERIMENTAL\",\n         ] + rebase_path(sources, root_build_dir)\n\n  if (v8_use_external_startup_data) {\n    outputs += [ \"$target_gen_dir/libraries_experimental.bin\" ]\n    args += [\n      \"--startup_blob\",\n      rebase_path(\"$target_gen_dir/libraries_experimental.bin\", root_build_dir),\n    ]\n  }\n}\n\naction(\"js2c_extras\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  script = \"tools/js2c.py\"\n\n  # The script depends on this other script, this rule causes a rebuild if it\n  # changes.\n  inputs = [\n    \"tools/jsmin.py\",\n  ]\n\n  sources = v8_extra_library_files\n\n  outputs = [\n    \"$target_gen_dir/extras-libraries.cc\",\n  ]\n\n  args = [\n           rebase_path(\"$target_gen_dir/extras-libraries.cc\", root_build_dir),\n           \"EXTRAS\",\n         ] + rebase_path(sources, root_build_dir)\n\n  if (v8_use_external_startup_data) {\n    outputs += [ \"$target_gen_dir/libraries_extras.bin\" ]\n    args += [\n      \"--startup_blob\",\n      rebase_path(\"$target_gen_dir/libraries_extras.bin\", root_build_dir),\n    ]\n  }\n}\n\naction(\"js2c_experimental_extras\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  script = \"tools/js2c.py\"\n\n  # The script depends on this other script, this rule causes a rebuild if it\n  # changes.\n  inputs = [\n    \"tools/jsmin.py\",\n  ]\n\n  sources = v8_experimental_extra_library_files\n\n  outputs = [\n    \"$target_gen_dir/experimental-extras-libraries.cc\",\n  ]\n\n  args = [\n           rebase_path(\"$target_gen_dir/experimental-extras-libraries.cc\",\n                       root_build_dir),\n           \"EXPERIMENTAL_EXTRAS\",\n         ] + rebase_path(sources, root_build_dir)\n\n  if (v8_use_external_startup_data) {\n    outputs += [ \"$target_gen_dir/libraries_experimental_extras.bin\" ]\n    args += [\n      \"--startup_blob\",\n      rebase_path(\"$target_gen_dir/libraries_experimental_extras.bin\",\n                  root_build_dir),\n    ]\n  }\n}\n\naction(\"d8_js2c\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  script = \"tools/js2c.py\"\n\n  # NOSORT\n  inputs = [\n    \"src/d8.js\",\n    \"src/js/macros.py\",\n  ]\n\n  outputs = [\n    \"$target_gen_dir/d8-js.cc\",\n  ]\n\n  args = rebase_path(outputs, root_build_dir) + [ \"D8\" ] +\n         rebase_path(inputs, root_build_dir)\n}\n\nif (is_android && enable_java_templates) {\n  android_assets(\"v8_external_startup_data_assets\") {\n    if (v8_use_external_startup_data) {\n      deps = [\n        \"//v8\",\n      ]\n      sources = [\n        \"$root_out_dir/natives_blob.bin\",\n      ]\n      renaming_sources = [ \"$root_out_dir/snapshot_blob.bin\" ]\n      if (current_cpu == \"arm\" || current_cpu == \"x86\" ||\n          current_cpu == \"mipsel\") {\n        renaming_destinations = [ \"snapshot_blob_32.bin\" ]\n      } else {\n        renaming_destinations = [ \"snapshot_blob_64.bin\" ]\n      }\n      disable_compression = true\n    }\n  }\n}\n\nif (v8_use_external_startup_data) {\n  action(\"natives_blob\") {\n    visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n    deps = [\n      \":js2c\",\n      \":js2c_experimental\",\n      \":js2c_experimental_extras\",\n      \":js2c_extras\",\n    ]\n\n    # NOSORT\n    sources = [\n      \"$target_gen_dir/libraries.bin\",\n      \"$target_gen_dir/libraries_experimental.bin\",\n      \"$target_gen_dir/libraries_extras.bin\",\n      \"$target_gen_dir/libraries_experimental_extras.bin\",\n    ]\n\n    outputs = [\n      \"$root_out_dir/natives_blob.bin\",\n    ]\n\n    script = \"tools/concatenate-files.py\"\n\n    args = rebase_path(sources + outputs, root_build_dir)\n  }\n}\n\naction(\"postmortem-metadata\") {\n  # Only targets in this file and the top-level visibility target can\n  # depend on this.\n  visibility = [\n    \":*\",\n    \"//:gn_visibility\",\n  ]\n\n  script = \"tools/gen-postmortem-metadata.py\"\n\n  # NOSORT\n  sources = [\n    \"src/objects.h\",\n    \"src/objects-inl.h\",\n  ]\n\n  outputs = [\n    \"$target_gen_dir/debug-support.cc\",\n  ]\n\n  args = rebase_path(outputs, root_build_dir) +\n         rebase_path(sources, root_build_dir)\n}\n\naction(\"run_mksnapshot\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  deps = [\n    \":mksnapshot($v8_snapshot_toolchain)\",\n  ]\n\n  script = \"tools/run.py\"\n\n  sources = []\n\n  outputs = [\n    \"$target_gen_dir/snapshot.cc\",\n  ]\n\n  args = [\n    \"./\" + rebase_path(get_label_info(\":mksnapshot($v8_snapshot_toolchain)\",\n                                      \"root_out_dir\") + \"/mksnapshot\",\n                       root_build_dir),\n    \"--startup_src\",\n    rebase_path(\"$target_gen_dir/snapshot.cc\", root_build_dir),\n  ]\n\n  if (v8_random_seed != \"0\") {\n    args += [\n      \"--random-seed\",\n      v8_random_seed,\n    ]\n  }\n\n  if (v8_use_external_startup_data) {\n    outputs += [ \"$root_out_dir/snapshot_blob.bin\" ]\n    args += [\n      \"--startup_blob\",\n      rebase_path(\"$root_out_dir/snapshot_blob.bin\", root_build_dir),\n    ]\n  }\n\n  if (v8_embed_script != \"\") {\n    sources += [ v8_embed_script ]\n    args += [ rebase_path(v8_embed_script, root_build_dir) ]\n  }\n}\n\naction(\"run_mkpeephole\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  deps = [\n    \":mkpeephole($v8_snapshot_toolchain)\",\n  ]\n\n  outputs = [\n    v8_generated_peephole_source,\n  ]\n\n  sources = []\n\n  script = \"tools/run.py\"\n\n  args = [\n    \"./\" + rebase_path(get_label_info(\":mkpeephole($v8_snapshot_toolchain)\",\n                                      \"root_out_dir\") + \"/mkpeephole\",\n                       root_build_dir),\n    rebase_path(v8_generated_peephole_source, root_build_dir),\n  ]\n}\n\naction(\"v8_dump_build_config\") {\n  script = \"tools/testrunner/utils/dump_build_config.py\"\n  outputs = [\n    \"$root_out_dir/v8_build_config.json\",\n  ]\n  args = [\n    rebase_path(\"$root_out_dir/v8_build_config.json\", root_build_dir),\n    \"dcheck_always_on=$dcheck_always_on\",\n    \"is_asan=$is_asan\",\n    \"is_cfi=$is_cfi\",\n    \"is_component_build=$is_component_build\",\n    \"is_debug=$is_debug\",\n    \"is_msan=$is_msan\",\n    \"is_tsan=$is_tsan\",\n    \"target_cpu=\\\"$target_cpu\\\"\",\n    \"v8_enable_i18n_support=$v8_enable_i18n_support\",\n    \"v8_target_cpu=\\\"$v8_target_cpu\\\"\",\n    \"v8_use_snapshot=$v8_use_snapshot\",\n  ]\n}\n\n###############################################################################\n# Source Sets (aka static libraries)\n#\n\nsource_set(\"v8_maybe_snapshot\") {\n  if (v8_use_snapshot && v8_use_external_startup_data) {\n    public_deps = [\n      \":v8_external_snapshot\",\n    ]\n  } else if (v8_use_snapshot) {\n    public_deps = [\n      \":v8_snapshot\",\n    ]\n  } else {\n    # Ignore v8_use_external_startup_data setting if no snapshot is used.\n    public_deps = [\n      \":v8_nosnapshot\",\n    ]\n  }\n}\n\nv8_source_set(\"v8_nosnapshot\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  deps = [\n    \":js2c\",\n    \":js2c_experimental\",\n    \":js2c_experimental_extras\",\n    \":js2c_extras\",\n    \":v8_base\",\n  ]\n\n  sources = [\n    \"$target_gen_dir/experimental-extras-libraries.cc\",\n    \"$target_gen_dir/experimental-libraries.cc\",\n    \"$target_gen_dir/extras-libraries.cc\",\n    \"$target_gen_dir/libraries.cc\",\n    \"src/snapshot/snapshot-empty.cc\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_source_set(\"v8_snapshot\") {\n  # Only targets in this file and the top-level visibility target can\n  # depend on this.\n  visibility = [\n    \":*\",\n    \"//:gn_visibility\",\n  ]\n\n  deps = [\n    \":js2c\",\n    \":js2c_experimental\",\n    \":js2c_experimental_extras\",\n    \":js2c_extras\",\n    \":v8_base\",\n  ]\n  public_deps = [\n    # This should be public so downstream targets can declare the snapshot\n    # output file as their inputs.\n    \":run_mksnapshot\",\n  ]\n\n  sources = [\n    \"$target_gen_dir/experimental-extras-libraries.cc\",\n    \"$target_gen_dir/experimental-libraries.cc\",\n    \"$target_gen_dir/extras-libraries.cc\",\n    \"$target_gen_dir/libraries.cc\",\n    \"$target_gen_dir/snapshot.cc\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nif (v8_use_external_startup_data) {\n  v8_source_set(\"v8_external_snapshot\") {\n    visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n    deps = [\n      \":js2c\",\n      \":js2c_experimental\",\n      \":js2c_experimental_extras\",\n      \":js2c_extras\",\n      \":v8_base\",\n    ]\n    public_deps = [\n      \":natives_blob\",\n      \":run_mksnapshot\",\n    ]\n\n    sources = [\n      \"src/snapshot/natives-external.cc\",\n      \"src/snapshot/snapshot-external.cc\",\n    ]\n\n    configs = [ \":internal_config\" ]\n  }\n}\n\nv8_source_set(\"v8_base\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  sources = [\n    \"//base/trace_event/common/trace_event_common.h\",\n    \"include/v8-debug.h\",\n    \"include/v8-experimental.h\",\n    \"include/v8-platform.h\",\n    \"include/v8-profiler.h\",\n    \"include/v8-testing.h\",\n    \"include/v8-util.h\",\n    \"include/v8-version.h\",\n    \"include/v8.h\",\n    \"include/v8config.h\",\n    \"src/accessors.cc\",\n    \"src/accessors.h\",\n    \"src/address-map.cc\",\n    \"src/address-map.h\",\n    \"src/allocation-site-scopes.cc\",\n    \"src/allocation-site-scopes.h\",\n    \"src/allocation.cc\",\n    \"src/allocation.h\",\n    \"src/api-arguments-inl.h\",\n    \"src/api-arguments.cc\",\n    \"src/api-arguments.h\",\n    \"src/api-experimental.cc\",\n    \"src/api-experimental.h\",\n    \"src/api-natives.cc\",\n    \"src/api-natives.h\",\n    \"src/api.cc\",\n    \"src/api.h\",\n    \"src/arguments.cc\",\n    \"src/arguments.h\",\n    \"src/asmjs/asm-js.cc\",\n    \"src/asmjs/asm-js.h\",\n    \"src/asmjs/asm-typer.cc\",\n    \"src/asmjs/asm-typer.h\",\n    \"src/asmjs/asm-types.cc\",\n    \"src/asmjs/asm-types.h\",\n    \"src/asmjs/asm-wasm-builder.cc\",\n    \"src/asmjs/asm-wasm-builder.h\",\n    \"src/assembler.cc\",\n    \"src/assembler.h\",\n    \"src/assert-scope.cc\",\n    \"src/assert-scope.h\",\n    \"src/ast/ast-expression-rewriter.cc\",\n    \"src/ast/ast-expression-rewriter.h\",\n    \"src/ast/ast-literal-reindexer.cc\",\n    \"src/ast/ast-literal-reindexer.h\",\n    \"src/ast/ast-numbering.cc\",\n    \"src/ast/ast-numbering.h\",\n    \"src/ast/ast-traversal-visitor.h\",\n    \"src/ast/ast-type-bounds.h\",\n    \"src/ast/ast-value-factory.cc\",\n    \"src/ast/ast-value-factory.h\",\n    \"src/ast/ast.cc\",\n    \"src/ast/ast.h\",\n    \"src/ast/context-slot-cache.cc\",\n    \"src/ast/context-slot-cache.h\",\n    \"src/ast/modules.cc\",\n    \"src/ast/modules.h\",\n    \"src/ast/prettyprinter.cc\",\n    \"src/ast/prettyprinter.h\",\n    \"src/ast/scopeinfo.cc\",\n    \"src/ast/scopeinfo.h\",\n    \"src/ast/scopes.cc\",\n    \"src/ast/scopes.h\",\n    \"src/ast/variables.cc\",\n    \"src/ast/variables.h\",\n    \"src/background-parsing-task.cc\",\n    \"src/background-parsing-task.h\",\n    \"src/bailout-reason.cc\",\n    \"src/bailout-reason.h\",\n    \"src/basic-block-profiler.cc\",\n    \"src/basic-block-profiler.h\",\n    \"src/bignum-dtoa.cc\",\n    \"src/bignum-dtoa.h\",\n    \"src/bignum.cc\",\n    \"src/bignum.h\",\n    \"src/bit-vector.cc\",\n    \"src/bit-vector.h\",\n    \"src/bootstrapper.cc\",\n    \"src/bootstrapper.h\",\n    \"src/builtins/builtins-api.cc\",\n    \"src/builtins/builtins-array.cc\",\n    \"src/builtins/builtins-arraybuffer.cc\",\n    \"src/builtins/builtins-boolean.cc\",\n    \"src/builtins/builtins-call.cc\",\n    \"src/builtins/builtins-callsite.cc\",\n    \"src/builtins/builtins-conversion.cc\",\n    \"src/builtins/builtins-dataview.cc\",\n    \"src/builtins/builtins-date.cc\",\n    \"src/builtins/builtins-debug.cc\",\n    \"src/builtins/builtins-error.cc\",\n    \"src/builtins/builtins-function.cc\",\n    \"src/builtins/builtins-generator.cc\",\n    \"src/builtins/builtins-global.cc\",\n    \"src/builtins/builtins-handler.cc\",\n    \"src/builtins/builtins-internal.cc\",\n    \"src/builtins/builtins-interpreter.cc\",\n    \"src/builtins/builtins-json.cc\",\n    \"src/builtins/builtins-math.cc\",\n    \"src/builtins/builtins-number.cc\",\n    \"src/builtins/builtins-object.cc\",\n    \"src/builtins/builtins-proxy.cc\",\n    \"src/builtins/builtins-reflect.cc\",\n    \"src/builtins/builtins-sharedarraybuffer.cc\",\n    \"src/builtins/builtins-string.cc\",\n    \"src/builtins/builtins-symbol.cc\",\n    \"src/builtins/builtins-typedarray.cc\",\n    \"src/builtins/builtins-utils.h\",\n    \"src/builtins/builtins.cc\",\n    \"src/builtins/builtins.h\",\n    \"src/cached-powers.cc\",\n    \"src/cached-powers.h\",\n    \"src/cancelable-task.cc\",\n    \"src/cancelable-task.h\",\n    \"src/char-predicates-inl.h\",\n    \"src/char-predicates.cc\",\n    \"src/char-predicates.h\",\n    \"src/checks.h\",\n    \"src/code-events.h\",\n    \"src/code-factory.cc\",\n    \"src/code-factory.h\",\n    \"src/code-stub-assembler.cc\",\n    \"src/code-stub-assembler.h\",\n    \"src/code-stubs-hydrogen.cc\",\n    \"src/code-stubs.cc\",\n    \"src/code-stubs.h\",\n    \"src/codegen.cc\",\n    \"src/codegen.h\",\n    \"src/collector.h\",\n    \"src/compilation-cache.cc\",\n    \"src/compilation-cache.h\",\n    \"src/compilation-dependencies.cc\",\n    \"src/compilation-dependencies.h\",\n    \"src/compilation-statistics.cc\",\n    \"src/compilation-statistics.h\",\n    \"src/compiler-dispatcher/compiler-dispatcher-job.cc\",\n    \"src/compiler-dispatcher/compiler-dispatcher-job.h\",\n    \"src/compiler-dispatcher/optimizing-compile-dispatcher.cc\",\n    \"src/compiler-dispatcher/optimizing-compile-dispatcher.h\",\n    \"src/compiler.cc\",\n    \"src/compiler.h\",\n    \"src/compiler/access-builder.cc\",\n    \"src/compiler/access-builder.h\",\n    \"src/compiler/access-info.cc\",\n    \"src/compiler/access-info.h\",\n    \"src/compiler/all-nodes.cc\",\n    \"src/compiler/all-nodes.h\",\n    \"src/compiler/ast-graph-builder.cc\",\n    \"src/compiler/ast-graph-builder.h\",\n    \"src/compiler/ast-loop-assignment-analyzer.cc\",\n    \"src/compiler/ast-loop-assignment-analyzer.h\",\n    \"src/compiler/basic-block-instrumentor.cc\",\n    \"src/compiler/basic-block-instrumentor.h\",\n    \"src/compiler/branch-elimination.cc\",\n    \"src/compiler/branch-elimination.h\",\n    \"src/compiler/bytecode-branch-analysis.cc\",\n    \"src/compiler/bytecode-branch-analysis.h\",\n    \"src/compiler/bytecode-graph-builder.cc\",\n    \"src/compiler/bytecode-graph-builder.h\",\n    \"src/compiler/bytecode-loop-analysis.cc\",\n    \"src/compiler/bytecode-loop-analysis.h\",\n    \"src/compiler/c-linkage.cc\",\n    \"src/compiler/checkpoint-elimination.cc\",\n    \"src/compiler/checkpoint-elimination.h\",\n    \"src/compiler/code-assembler.cc\",\n    \"src/compiler/code-assembler.h\",\n    \"src/compiler/code-generator-impl.h\",\n    \"src/compiler/code-generator.cc\",\n    \"src/compiler/code-generator.h\",\n    \"src/compiler/common-node-cache.cc\",\n    \"src/compiler/common-node-cache.h\",\n    \"src/compiler/common-operator-reducer.cc\",\n    \"src/compiler/common-operator-reducer.h\",\n    \"src/compiler/common-operator.cc\",\n    \"src/compiler/common-operator.h\",\n    \"src/compiler/control-builders.cc\",\n    \"src/compiler/control-builders.h\",\n    \"src/compiler/control-equivalence.cc\",\n    \"src/compiler/control-equivalence.h\",\n    \"src/compiler/control-flow-optimizer.cc\",\n    \"src/compiler/control-flow-optimizer.h\",\n    \"src/compiler/dead-code-elimination.cc\",\n    \"src/compiler/dead-code-elimination.h\",\n    \"src/compiler/diamond.h\",\n    \"src/compiler/effect-control-linearizer.cc\",\n    \"src/compiler/effect-control-linearizer.h\",\n    \"src/compiler/escape-analysis-reducer.cc\",\n    \"src/compiler/escape-analysis-reducer.h\",\n    \"src/compiler/escape-analysis.cc\",\n    \"src/compiler/escape-analysis.h\",\n    \"src/compiler/frame-elider.cc\",\n    \"src/compiler/frame-elider.h\",\n    \"src/compiler/frame-states.cc\",\n    \"src/compiler/frame-states.h\",\n    \"src/compiler/frame.cc\",\n    \"src/compiler/frame.h\",\n    \"src/compiler/gap-resolver.cc\",\n    \"src/compiler/gap-resolver.h\",\n    \"src/compiler/graph-reducer.cc\",\n    \"src/compiler/graph-reducer.h\",\n    \"src/compiler/graph-replay.cc\",\n    \"src/compiler/graph-replay.h\",\n    \"src/compiler/graph-trimmer.cc\",\n    \"src/compiler/graph-trimmer.h\",\n    \"src/compiler/graph-visualizer.cc\",\n    \"src/compiler/graph-visualizer.h\",\n    \"src/compiler/graph.cc\",\n    \"src/compiler/graph.h\",\n    \"src/compiler/instruction-codes.h\",\n    \"src/compiler/instruction-scheduler.cc\",\n    \"src/compiler/instruction-scheduler.h\",\n    \"src/compiler/instruction-selector-impl.h\",\n    \"src/compiler/instruction-selector.cc\",\n    \"src/compiler/instruction-selector.h\",\n    \"src/compiler/instruction.cc\",\n    \"src/compiler/instruction.h\",\n    \"src/compiler/int64-lowering.cc\",\n    \"src/compiler/int64-lowering.h\",\n    \"src/compiler/js-builtin-reducer.cc\",\n    \"src/compiler/js-builtin-reducer.h\",\n    \"src/compiler/js-call-reducer.cc\",\n    \"src/compiler/js-call-reducer.h\",\n    \"src/compiler/js-context-specialization.cc\",\n    \"src/compiler/js-context-specialization.h\",\n    \"src/compiler/js-create-lowering.cc\",\n    \"src/compiler/js-create-lowering.h\",\n    \"src/compiler/js-frame-specialization.cc\",\n    \"src/compiler/js-frame-specialization.h\",\n    \"src/compiler/js-generic-lowering.cc\",\n    \"src/compiler/js-generic-lowering.h\",\n    \"src/compiler/js-global-object-specialization.cc\",\n    \"src/compiler/js-global-object-specialization.h\",\n    \"src/compiler/js-graph.cc\",\n    \"src/compiler/js-graph.h\",\n    \"src/compiler/js-inlining-heuristic.cc\",\n    \"src/compiler/js-inlining-heuristic.h\",\n    \"src/compiler/js-inlining.cc\",\n    \"src/compiler/js-inlining.h\",\n    \"src/compiler/js-intrinsic-lowering.cc\",\n    \"src/compiler/js-intrinsic-lowering.h\",\n    \"src/compiler/js-native-context-specialization.cc\",\n    \"src/compiler/js-native-context-specialization.h\",\n    \"src/compiler/js-operator.cc\",\n    \"src/compiler/js-operator.h\",\n    \"src/compiler/js-typed-lowering.cc\",\n    \"src/compiler/js-typed-lowering.h\",\n    \"src/compiler/jump-threading.cc\",\n    \"src/compiler/jump-threading.h\",\n    \"src/compiler/linkage.cc\",\n    \"src/compiler/linkage.h\",\n    \"src/compiler/live-range-separator.cc\",\n    \"src/compiler/live-range-separator.h\",\n    \"src/compiler/liveness-analyzer.cc\",\n    \"src/compiler/liveness-analyzer.h\",\n    \"src/compiler/load-elimination.cc\",\n    \"src/compiler/load-elimination.h\",\n    \"src/compiler/loop-analysis.cc\",\n    \"src/compiler/loop-analysis.h\",\n    \"src/compiler/loop-peeling.cc\",\n    \"src/compiler/loop-peeling.h\",\n    \"src/compiler/loop-variable-optimizer.cc\",\n    \"src/compiler/loop-variable-optimizer.h\",\n    \"src/compiler/machine-operator-reducer.cc\",\n    \"src/compiler/machine-operator-reducer.h\",\n    \"src/compiler/machine-operator.cc\",\n    \"src/compiler/machine-operator.h\",\n    \"src/compiler/memory-optimizer.cc\",\n    \"src/compiler/memory-optimizer.h\",\n    \"src/compiler/move-optimizer.cc\",\n    \"src/compiler/move-optimizer.h\",\n    \"src/compiler/node-aux-data.h\",\n    \"src/compiler/node-cache.cc\",\n    \"src/compiler/node-cache.h\",\n    \"src/compiler/node-marker.cc\",\n    \"src/compiler/node-marker.h\",\n    \"src/compiler/node-matchers.cc\",\n    \"src/compiler/node-matchers.h\",\n    \"src/compiler/node-properties.cc\",\n    \"src/compiler/node-properties.h\",\n    \"src/compiler/node.cc\",\n    \"src/compiler/node.h\",\n    \"src/compiler/opcodes.cc\",\n    \"src/compiler/opcodes.h\",\n    \"src/compiler/operation-typer.cc\",\n    \"src/compiler/operation-typer.h\",\n    \"src/compiler/operator-properties.cc\",\n    \"src/compiler/operator-properties.h\",\n    \"src/compiler/operator.cc\",\n    \"src/compiler/operator.h\",\n    \"src/compiler/osr.cc\",\n    \"src/compiler/osr.h\",\n    \"src/compiler/pipeline-statistics.cc\",\n    \"src/compiler/pipeline-statistics.h\",\n    \"src/compiler/pipeline.cc\",\n    \"src/compiler/pipeline.h\",\n    \"src/compiler/raw-machine-assembler.cc\",\n    \"src/compiler/raw-machine-assembler.h\",\n    \"src/compiler/redundancy-elimination.cc\",\n    \"src/compiler/redundancy-elimination.h\",\n    \"src/compiler/register-allocator-verifier.cc\",\n    \"src/compiler/register-allocator-verifier.h\",\n    \"src/compiler/register-allocator.cc\",\n    \"src/compiler/register-allocator.h\",\n    \"src/compiler/representation-change.cc\",\n    \"src/compiler/representation-change.h\",\n    \"src/compiler/schedule.cc\",\n    \"src/compiler/schedule.h\",\n    \"src/compiler/scheduler.cc\",\n    \"src/compiler/scheduler.h\",\n    \"src/compiler/select-lowering.cc\",\n    \"src/compiler/select-lowering.h\",\n    \"src/compiler/simplified-lowering.cc\",\n    \"src/compiler/simplified-lowering.h\",\n    \"src/compiler/simplified-operator-reducer.cc\",\n    \"src/compiler/simplified-operator-reducer.h\",\n    \"src/compiler/simplified-operator.cc\",\n    \"src/compiler/simplified-operator.h\",\n    \"src/compiler/source-position.cc\",\n    \"src/compiler/source-position.h\",\n    \"src/compiler/state-values-utils.cc\",\n    \"src/compiler/state-values-utils.h\",\n    \"src/compiler/store-store-elimination.cc\",\n    \"src/compiler/store-store-elimination.h\",\n    \"src/compiler/tail-call-optimization.cc\",\n    \"src/compiler/tail-call-optimization.h\",\n    \"src/compiler/type-hint-analyzer.cc\",\n    \"src/compiler/type-hint-analyzer.h\",\n    \"src/compiler/type-hints.cc\",\n    \"src/compiler/type-hints.h\",\n    \"src/compiler/typer.cc\",\n    \"src/compiler/typer.h\",\n    \"src/compiler/unwinding-info-writer.h\",\n    \"src/compiler/value-numbering-reducer.cc\",\n    \"src/compiler/value-numbering-reducer.h\",\n    \"src/compiler/verifier.cc\",\n    \"src/compiler/verifier.h\",\n    \"src/compiler/wasm-compiler.cc\",\n    \"src/compiler/wasm-compiler.h\",\n    \"src/compiler/wasm-linkage.cc\",\n    \"src/compiler/zone-pool.cc\",\n    \"src/compiler/zone-pool.h\",\n    \"src/context-measure.cc\",\n    \"src/context-measure.h\",\n    \"src/contexts-inl.h\",\n    \"src/contexts.cc\",\n    \"src/contexts.h\",\n    \"src/conversions-inl.h\",\n    \"src/conversions.cc\",\n    \"src/conversions.h\",\n    \"src/counters-inl.h\",\n    \"src/counters.cc\",\n    \"src/counters.h\",\n    \"src/crankshaft/compilation-phase.cc\",\n    \"src/crankshaft/compilation-phase.h\",\n    \"src/crankshaft/hydrogen-alias-analysis.h\",\n    \"src/crankshaft/hydrogen-bce.cc\",\n    \"src/crankshaft/hydrogen-bce.h\",\n    \"src/crankshaft/hydrogen-canonicalize.cc\",\n    \"src/crankshaft/hydrogen-canonicalize.h\",\n    \"src/crankshaft/hydrogen-check-elimination.cc\",\n    \"src/crankshaft/hydrogen-check-elimination.h\",\n    \"src/crankshaft/hydrogen-dce.cc\",\n    \"src/crankshaft/hydrogen-dce.h\",\n    \"src/crankshaft/hydrogen-dehoist.cc\",\n    \"src/crankshaft/hydrogen-dehoist.h\",\n    \"src/crankshaft/hydrogen-environment-liveness.cc\",\n    \"src/crankshaft/hydrogen-environment-liveness.h\",\n    \"src/crankshaft/hydrogen-escape-analysis.cc\",\n    \"src/crankshaft/hydrogen-escape-analysis.h\",\n    \"src/crankshaft/hydrogen-flow-engine.h\",\n    \"src/crankshaft/hydrogen-gvn.cc\",\n    \"src/crankshaft/hydrogen-gvn.h\",\n    \"src/crankshaft/hydrogen-infer-representation.cc\",\n    \"src/crankshaft/hydrogen-infer-representation.h\",\n    \"src/crankshaft/hydrogen-infer-types.cc\",\n    \"src/crankshaft/hydrogen-infer-types.h\",\n    \"src/crankshaft/hydrogen-instructions.cc\",\n    \"src/crankshaft/hydrogen-instructions.h\",\n    \"src/crankshaft/hydrogen-load-elimination.cc\",\n    \"src/crankshaft/hydrogen-load-elimination.h\",\n    \"src/crankshaft/hydrogen-mark-deoptimize.cc\",\n    \"src/crankshaft/hydrogen-mark-deoptimize.h\",\n    \"src/crankshaft/hydrogen-mark-unreachable.cc\",\n    \"src/crankshaft/hydrogen-mark-unreachable.h\",\n    \"src/crankshaft/hydrogen-osr.cc\",\n    \"src/crankshaft/hydrogen-osr.h\",\n    \"src/crankshaft/hydrogen-range-analysis.cc\",\n    \"src/crankshaft/hydrogen-range-analysis.h\",\n    \"src/crankshaft/hydrogen-redundant-phi.cc\",\n    \"src/crankshaft/hydrogen-redundant-phi.h\",\n    \"src/crankshaft/hydrogen-removable-simulates.cc\",\n    \"src/crankshaft/hydrogen-removable-simulates.h\",\n    \"src/crankshaft/hydrogen-representation-changes.cc\",\n    \"src/crankshaft/hydrogen-representation-changes.h\",\n    \"src/crankshaft/hydrogen-sce.cc\",\n    \"src/crankshaft/hydrogen-sce.h\",\n    \"src/crankshaft/hydrogen-store-elimination.cc\",\n    \"src/crankshaft/hydrogen-store-elimination.h\",\n    \"src/crankshaft/hydrogen-types.cc\",\n    \"src/crankshaft/hydrogen-types.h\",\n    \"src/crankshaft/hydrogen-uint32-analysis.cc\",\n    \"src/crankshaft/hydrogen-uint32-analysis.h\",\n    \"src/crankshaft/hydrogen.cc\",\n    \"src/crankshaft/hydrogen.h\",\n    \"src/crankshaft/lithium-allocator-inl.h\",\n    \"src/crankshaft/lithium-allocator.cc\",\n    \"src/crankshaft/lithium-allocator.h\",\n    \"src/crankshaft/lithium-codegen.cc\",\n    \"src/crankshaft/lithium-codegen.h\",\n    \"src/crankshaft/lithium.cc\",\n    \"src/crankshaft/lithium.h\",\n    \"src/crankshaft/typing.cc\",\n    \"src/crankshaft/typing.h\",\n    \"src/crankshaft/unique.h\",\n    \"src/date.cc\",\n    \"src/date.h\",\n    \"src/dateparser-inl.h\",\n    \"src/dateparser.cc\",\n    \"src/dateparser.h\",\n    \"src/debug/debug-evaluate.cc\",\n    \"src/debug/debug-evaluate.h\",\n    \"src/debug/debug-frames.cc\",\n    \"src/debug/debug-frames.h\",\n    \"src/debug/debug-scopes.cc\",\n    \"src/debug/debug-scopes.h\",\n    \"src/debug/debug.cc\",\n    \"src/debug/debug.h\",\n    \"src/debug/liveedit.cc\",\n    \"src/debug/liveedit.h\",\n    \"src/deoptimize-reason.cc\",\n    \"src/deoptimize-reason.h\",\n    \"src/deoptimizer.cc\",\n    \"src/deoptimizer.h\",\n    \"src/disasm.h\",\n    \"src/disassembler.cc\",\n    \"src/disassembler.h\",\n    \"src/diy-fp.cc\",\n    \"src/diy-fp.h\",\n    \"src/double.h\",\n    \"src/dtoa.cc\",\n    \"src/dtoa.h\",\n    \"src/effects.h\",\n    \"src/eh-frame.cc\",\n    \"src/eh-frame.h\",\n    \"src/elements-kind.cc\",\n    \"src/elements-kind.h\",\n    \"src/elements.cc\",\n    \"src/elements.h\",\n    \"src/execution.cc\",\n    \"src/execution.h\",\n    \"src/extensions/externalize-string-extension.cc\",\n    \"src/extensions/externalize-string-extension.h\",\n    \"src/extensions/free-buffer-extension.cc\",\n    \"src/extensions/free-buffer-extension.h\",\n    \"src/extensions/gc-extension.cc\",\n    \"src/extensions/gc-extension.h\",\n    \"src/extensions/ignition-statistics-extension.cc\",\n    \"src/extensions/ignition-statistics-extension.h\",\n    \"src/extensions/statistics-extension.cc\",\n    \"src/extensions/statistics-extension.h\",\n    \"src/extensions/trigger-failure-extension.cc\",\n    \"src/extensions/trigger-failure-extension.h\",\n    \"src/external-reference-table.cc\",\n    \"src/external-reference-table.h\",\n    \"src/factory.cc\",\n    \"src/factory.h\",\n    \"src/fast-accessor-assembler.cc\",\n    \"src/fast-accessor-assembler.h\",\n    \"src/fast-dtoa.cc\",\n    \"src/fast-dtoa.h\",\n    \"src/field-index-inl.h\",\n    \"src/field-index.h\",\n    \"src/field-type.cc\",\n    \"src/field-type.h\",\n    \"src/fixed-dtoa.cc\",\n    \"src/fixed-dtoa.h\",\n    \"src/flag-definitions.h\",\n    \"src/flags.cc\",\n    \"src/flags.h\",\n    \"src/frames-inl.h\",\n    \"src/frames.cc\",\n    \"src/frames.h\",\n    \"src/full-codegen/full-codegen.cc\",\n    \"src/full-codegen/full-codegen.h\",\n    \"src/futex-emulation.cc\",\n    \"src/futex-emulation.h\",\n    \"src/gdb-jit.cc\",\n    \"src/gdb-jit.h\",\n    \"src/global-handles.cc\",\n    \"src/global-handles.h\",\n    \"src/globals.h\",\n    \"src/handles-inl.h\",\n    \"src/handles.cc\",\n    \"src/handles.h\",\n    \"src/heap-symbols.h\",\n    \"src/heap/array-buffer-tracker-inl.h\",\n    \"src/heap/array-buffer-tracker.cc\",\n    \"src/heap/array-buffer-tracker.h\",\n    \"src/heap/code-stats.cc\",\n    \"src/heap/code-stats.h\",\n    \"src/heap/gc-idle-time-handler.cc\",\n    \"src/heap/gc-idle-time-handler.h\",\n    \"src/heap/gc-tracer.cc\",\n    \"src/heap/gc-tracer.h\",\n    \"src/heap/heap-inl.h\",\n    \"src/heap/heap.cc\",\n    \"src/heap/heap.h\",\n    \"src/heap/incremental-marking-job.cc\",\n    \"src/heap/incremental-marking-job.h\",\n    \"src/heap/incremental-marking.cc\",\n    \"src/heap/incremental-marking.h\",\n    \"src/heap/mark-compact-inl.h\",\n    \"src/heap/mark-compact.cc\",\n    \"src/heap/mark-compact.h\",\n    \"src/heap/marking.h\",\n    \"src/heap/memory-reducer.cc\",\n    \"src/heap/memory-reducer.h\",\n    \"src/heap/object-stats.cc\",\n    \"src/heap/object-stats.h\",\n    \"src/heap/objects-visiting-inl.h\",\n    \"src/heap/objects-visiting.cc\",\n    \"src/heap/objects-visiting.h\",\n    \"src/heap/page-parallel-job.h\",\n    \"src/heap/remembered-set.cc\",\n    \"src/heap/remembered-set.h\",\n    \"src/heap/scavenge-job.cc\",\n    \"src/heap/scavenge-job.h\",\n    \"src/heap/scavenger-inl.h\",\n    \"src/heap/scavenger.cc\",\n    \"src/heap/scavenger.h\",\n    \"src/heap/slot-set.h\",\n    \"src/heap/spaces-inl.h\",\n    \"src/heap/spaces.cc\",\n    \"src/heap/spaces.h\",\n    \"src/heap/store-buffer.cc\",\n    \"src/heap/store-buffer.h\",\n    \"src/i18n.cc\",\n    \"src/i18n.h\",\n    \"src/ic/access-compiler.cc\",\n    \"src/ic/access-compiler.h\",\n    \"src/ic/call-optimization.cc\",\n    \"src/ic/call-optimization.h\",\n    \"src/ic/handler-compiler.cc\",\n    \"src/ic/handler-compiler.h\",\n    \"src/ic/ic-compiler.cc\",\n    \"src/ic/ic-compiler.h\",\n    \"src/ic/ic-inl.h\",\n    \"src/ic/ic-state.cc\",\n    \"src/ic/ic-state.h\",\n    \"src/ic/ic.cc\",\n    \"src/ic/ic.h\",\n    \"src/ic/stub-cache.cc\",\n    \"src/ic/stub-cache.h\",\n    \"src/icu_util.cc\",\n    \"src/icu_util.h\",\n    \"src/identity-map.cc\",\n    \"src/identity-map.h\",\n    \"src/interface-descriptors.cc\",\n    \"src/interface-descriptors.h\",\n    \"src/interpreter/bytecode-array-builder.cc\",\n    \"src/interpreter/bytecode-array-builder.h\",\n    \"src/interpreter/bytecode-array-iterator.cc\",\n    \"src/interpreter/bytecode-array-iterator.h\",\n    \"src/interpreter/bytecode-array-writer.cc\",\n    \"src/interpreter/bytecode-array-writer.h\",\n    \"src/interpreter/bytecode-dead-code-optimizer.cc\",\n    \"src/interpreter/bytecode-dead-code-optimizer.h\",\n    \"src/interpreter/bytecode-decoder.cc\",\n    \"src/interpreter/bytecode-decoder.h\",\n    \"src/interpreter/bytecode-flags.cc\",\n    \"src/interpreter/bytecode-flags.h\",\n    \"src/interpreter/bytecode-generator.cc\",\n    \"src/interpreter/bytecode-generator.h\",\n    \"src/interpreter/bytecode-label.cc\",\n    \"src/interpreter/bytecode-label.h\",\n    \"src/interpreter/bytecode-peephole-optimizer.cc\",\n    \"src/interpreter/bytecode-peephole-optimizer.h\",\n    \"src/interpreter/bytecode-peephole-table.h\",\n    \"src/interpreter/bytecode-pipeline.cc\",\n    \"src/interpreter/bytecode-pipeline.h\",\n    \"src/interpreter/bytecode-register-allocator.cc\",\n    \"src/interpreter/bytecode-register-allocator.h\",\n    \"src/interpreter/bytecode-register-optimizer.cc\",\n    \"src/interpreter/bytecode-register-optimizer.h\",\n    \"src/interpreter/bytecode-register.cc\",\n    \"src/interpreter/bytecode-register.h\",\n    \"src/interpreter/bytecode-traits.h\",\n    \"src/interpreter/bytecodes.cc\",\n    \"src/interpreter/bytecodes.h\",\n    \"src/interpreter/constant-array-builder.cc\",\n    \"src/interpreter/constant-array-builder.h\",\n    \"src/interpreter/control-flow-builders.cc\",\n    \"src/interpreter/control-flow-builders.h\",\n    \"src/interpreter/handler-table-builder.cc\",\n    \"src/interpreter/handler-table-builder.h\",\n    \"src/interpreter/interpreter-assembler.cc\",\n    \"src/interpreter/interpreter-assembler.h\",\n    \"src/interpreter/interpreter-intrinsics.cc\",\n    \"src/interpreter/interpreter-intrinsics.h\",\n    \"src/interpreter/interpreter.cc\",\n    \"src/interpreter/interpreter.h\",\n    \"src/isolate-inl.h\",\n    \"src/isolate.cc\",\n    \"src/isolate.h\",\n    \"src/json-parser.cc\",\n    \"src/json-parser.h\",\n    \"src/json-stringifier.cc\",\n    \"src/json-stringifier.h\",\n    \"src/keys.cc\",\n    \"src/keys.h\",\n    \"src/layout-descriptor-inl.h\",\n    \"src/layout-descriptor.cc\",\n    \"src/layout-descriptor.h\",\n    \"src/list-inl.h\",\n    \"src/list.h\",\n    \"src/log-inl.h\",\n    \"src/log-utils.cc\",\n    \"src/log-utils.h\",\n    \"src/log.cc\",\n    \"src/log.h\",\n    \"src/lookup.cc\",\n    \"src/lookup.h\",\n    \"src/machine-type.cc\",\n    \"src/machine-type.h\",\n    \"src/macro-assembler.h\",\n    \"src/messages.cc\",\n    \"src/messages.h\",\n    \"src/msan.h\",\n    \"src/objects-body-descriptors-inl.h\",\n    \"src/objects-body-descriptors.h\",\n    \"src/objects-debug.cc\",\n    \"src/objects-inl.h\",\n    \"src/objects-printer.cc\",\n    \"src/objects.cc\",\n    \"src/objects.h\",\n    \"src/ostreams.cc\",\n    \"src/ostreams.h\",\n    \"src/parsing/expression-classifier.h\",\n    \"src/parsing/func-name-inferrer.cc\",\n    \"src/parsing/func-name-inferrer.h\",\n    \"src/parsing/parameter-initializer-rewriter.cc\",\n    \"src/parsing/parameter-initializer-rewriter.h\",\n    \"src/parsing/parse-info.cc\",\n    \"src/parsing/parse-info.h\",\n    \"src/parsing/parser-base.h\",\n    \"src/parsing/parser.cc\",\n    \"src/parsing/parser.h\",\n    \"src/parsing/pattern-rewriter.cc\",\n    \"src/parsing/preparse-data-format.h\",\n    \"src/parsing/preparse-data.cc\",\n    \"src/parsing/preparse-data.h\",\n    \"src/parsing/preparser.cc\",\n    \"src/parsing/preparser.h\",\n    \"src/parsing/rewriter.cc\",\n    \"src/parsing/rewriter.h\",\n    \"src/parsing/scanner-character-streams.cc\",\n    \"src/parsing/scanner-character-streams.h\",\n    \"src/parsing/scanner.cc\",\n    \"src/parsing/scanner.h\",\n    \"src/parsing/token.cc\",\n    \"src/parsing/token.h\",\n    \"src/pending-compilation-error-handler.cc\",\n    \"src/pending-compilation-error-handler.h\",\n    \"src/perf-jit.cc\",\n    \"src/perf-jit.h\",\n    \"src/profiler/allocation-tracker.cc\",\n    \"src/profiler/allocation-tracker.h\",\n    \"src/profiler/circular-queue-inl.h\",\n    \"src/profiler/circular-queue.h\",\n    \"src/profiler/cpu-profiler-inl.h\",\n    \"src/profiler/cpu-profiler.cc\",\n    \"src/profiler/cpu-profiler.h\",\n    \"src/profiler/heap-profiler.cc\",\n    \"src/profiler/heap-profiler.h\",\n    \"src/profiler/heap-snapshot-generator-inl.h\",\n    \"src/profiler/heap-snapshot-generator.cc\",\n    \"src/profiler/heap-snapshot-generator.h\",\n    \"src/profiler/profile-generator-inl.h\",\n    \"src/profiler/profile-generator.cc\",\n    \"src/profiler/profile-generator.h\",\n    \"src/profiler/profiler-listener.cc\",\n    \"src/profiler/profiler-listener.h\",\n    \"src/profiler/sampling-heap-profiler.cc\",\n    \"src/profiler/sampling-heap-profiler.h\",\n    \"src/profiler/strings-storage.cc\",\n    \"src/profiler/strings-storage.h\",\n    \"src/profiler/tick-sample.cc\",\n    \"src/profiler/tick-sample.h\",\n    \"src/profiler/unbound-queue-inl.h\",\n    \"src/profiler/unbound-queue.h\",\n    \"src/property-descriptor.cc\",\n    \"src/property-descriptor.h\",\n    \"src/property-details.h\",\n    \"src/property.cc\",\n    \"src/property.h\",\n    \"src/prototype.h\",\n    \"src/regexp/bytecodes-irregexp.h\",\n    \"src/regexp/interpreter-irregexp.cc\",\n    \"src/regexp/interpreter-irregexp.h\",\n    \"src/regexp/jsregexp-inl.h\",\n    \"src/regexp/jsregexp.cc\",\n    \"src/regexp/jsregexp.h\",\n    \"src/regexp/regexp-ast.cc\",\n    \"src/regexp/regexp-ast.h\",\n    \"src/regexp/regexp-macro-assembler-irregexp-inl.h\",\n    \"src/regexp/regexp-macro-assembler-irregexp.cc\",\n    \"src/regexp/regexp-macro-assembler-irregexp.h\",\n    \"src/regexp/regexp-macro-assembler-tracer.cc\",\n    \"src/regexp/regexp-macro-assembler-tracer.h\",\n    \"src/regexp/regexp-macro-assembler.cc\",\n    \"src/regexp/regexp-macro-assembler.h\",\n    \"src/regexp/regexp-parser.cc\",\n    \"src/regexp/regexp-parser.h\",\n    \"src/regexp/regexp-stack.cc\",\n    \"src/regexp/regexp-stack.h\",\n    \"src/register-configuration.cc\",\n    \"src/register-configuration.h\",\n    \"src/runtime-profiler.cc\",\n    \"src/runtime-profiler.h\",\n    \"src/runtime/runtime-array.cc\",\n    \"src/runtime/runtime-atomics.cc\",\n    \"src/runtime/runtime-classes.cc\",\n    \"src/runtime/runtime-collections.cc\",\n    \"src/runtime/runtime-compiler.cc\",\n    \"src/runtime/runtime-date.cc\",\n    \"src/runtime/runtime-debug.cc\",\n    \"src/runtime/runtime-error.cc\",\n    \"src/runtime/runtime-forin.cc\",\n    \"src/runtime/runtime-function.cc\",\n    \"src/runtime/runtime-futex.cc\",\n    \"src/runtime/runtime-generator.cc\",\n    \"src/runtime/runtime-i18n.cc\",\n    \"src/runtime/runtime-internal.cc\",\n    \"src/runtime/runtime-interpreter.cc\",\n    \"src/runtime/runtime-literals.cc\",\n    \"src/runtime/runtime-liveedit.cc\",\n    \"src/runtime/runtime-maths.cc\",\n    \"src/runtime/runtime-numbers.cc\",\n    \"src/runtime/runtime-object.cc\",\n    \"src/runtime/runtime-operators.cc\",\n    \"src/runtime/runtime-proxy.cc\",\n    \"src/runtime/runtime-regexp.cc\",\n    \"src/runtime/runtime-scopes.cc\",\n    \"src/runtime/runtime-simd.cc\",\n    \"src/runtime/runtime-strings.cc\",\n    \"src/runtime/runtime-symbol.cc\",\n    \"src/runtime/runtime-test.cc\",\n    \"src/runtime/runtime-typedarray.cc\",\n    \"src/runtime/runtime-utils.h\",\n    \"src/runtime/runtime-wasm.cc\",\n    \"src/runtime/runtime.cc\",\n    \"src/runtime/runtime.h\",\n    \"src/safepoint-table.cc\",\n    \"src/safepoint-table.h\",\n    \"src/signature.h\",\n    \"src/simulator.h\",\n    \"src/small-pointer-list.h\",\n    \"src/snapshot/code-serializer.cc\",\n    \"src/snapshot/code-serializer.h\",\n    \"src/snapshot/deserializer.cc\",\n    \"src/snapshot/deserializer.h\",\n    \"src/snapshot/natives-common.cc\",\n    \"src/snapshot/natives.h\",\n    \"src/snapshot/partial-serializer.cc\",\n    \"src/snapshot/partial-serializer.h\",\n    \"src/snapshot/serializer-common.cc\",\n    \"src/snapshot/serializer-common.h\",\n    \"src/snapshot/serializer.cc\",\n    \"src/snapshot/serializer.h\",\n    \"src/snapshot/snapshot-common.cc\",\n    \"src/snapshot/snapshot-source-sink.cc\",\n    \"src/snapshot/snapshot-source-sink.h\",\n    \"src/snapshot/snapshot.h\",\n    \"src/snapshot/startup-serializer.cc\",\n    \"src/snapshot/startup-serializer.h\",\n    \"src/source-position-table.cc\",\n    \"src/source-position-table.h\",\n    \"src/source-position.h\",\n    \"src/splay-tree-inl.h\",\n    \"src/splay-tree.h\",\n    \"src/startup-data-util.cc\",\n    \"src/startup-data-util.h\",\n    \"src/string-builder.cc\",\n    \"src/string-builder.h\",\n    \"src/string-search.h\",\n    \"src/string-stream.cc\",\n    \"src/string-stream.h\",\n    \"src/strtod.cc\",\n    \"src/strtod.h\",\n    \"src/tracing/trace-event.cc\",\n    \"src/tracing/trace-event.h\",\n    \"src/transitions-inl.h\",\n    \"src/transitions.cc\",\n    \"src/transitions.h\",\n    \"src/type-cache.cc\",\n    \"src/type-cache.h\",\n    \"src/type-feedback-vector-inl.h\",\n    \"src/type-feedback-vector.cc\",\n    \"src/type-feedback-vector.h\",\n    \"src/type-info.cc\",\n    \"src/type-info.h\",\n    \"src/types.cc\",\n    \"src/types.h\",\n    \"src/unicode-cache-inl.h\",\n    \"src/unicode-cache.h\",\n    \"src/unicode-decoder.cc\",\n    \"src/unicode-decoder.h\",\n    \"src/unicode-inl.h\",\n    \"src/unicode.cc\",\n    \"src/unicode.h\",\n    \"src/uri.cc\",\n    \"src/uri.h\",\n    \"src/utils-inl.h\",\n    \"src/utils.cc\",\n    \"src/utils.h\",\n    \"src/v8.cc\",\n    \"src/v8.h\",\n    \"src/v8memory.h\",\n    \"src/v8threads.cc\",\n    \"src/v8threads.h\",\n    \"src/value-serializer.cc\",\n    \"src/value-serializer.h\",\n    \"src/version.cc\",\n    \"src/version.h\",\n    \"src/vm-state-inl.h\",\n    \"src/vm-state.h\",\n    \"src/wasm/ast-decoder.cc\",\n    \"src/wasm/ast-decoder.h\",\n    \"src/wasm/decoder.h\",\n    \"src/wasm/encoder.cc\",\n    \"src/wasm/encoder.h\",\n    \"src/wasm/leb-helper.h\",\n    \"src/wasm/module-decoder.cc\",\n    \"src/wasm/module-decoder.h\",\n    \"src/wasm/switch-logic.cc\",\n    \"src/wasm/switch-logic.h\",\n    \"src/wasm/wasm-debug.cc\",\n    \"src/wasm/wasm-debug.h\",\n    \"src/wasm/wasm-external-refs.cc\",\n    \"src/wasm/wasm-external-refs.h\",\n    \"src/wasm/wasm-function-name-table.cc\",\n    \"src/wasm/wasm-function-name-table.h\",\n    \"src/wasm/wasm-interpreter.cc\",\n    \"src/wasm/wasm-interpreter.h\",\n    \"src/wasm/wasm-js.cc\",\n    \"src/wasm/wasm-js.h\",\n    \"src/wasm/wasm-macro-gen.h\",\n    \"src/wasm/wasm-module.cc\",\n    \"src/wasm/wasm-module.h\",\n    \"src/wasm/wasm-opcodes.cc\",\n    \"src/wasm/wasm-opcodes.h\",\n    \"src/wasm/wasm-result.cc\",\n    \"src/wasm/wasm-result.h\",\n    \"src/zone-allocator.h\",\n    \"src/zone-containers.h\",\n    \"src/zone.cc\",\n    \"src/zone.h\",\n  ]\n\n  if (v8_current_cpu == \"x86\") {\n    sources += [\n      \"src/builtins/ia32/builtins-ia32.cc\",\n      \"src/compiler/ia32/code-generator-ia32.cc\",\n      \"src/compiler/ia32/instruction-codes-ia32.h\",\n      \"src/compiler/ia32/instruction-scheduler-ia32.cc\",\n      \"src/compiler/ia32/instruction-selector-ia32.cc\",\n      \"src/crankshaft/ia32/lithium-codegen-ia32.cc\",\n      \"src/crankshaft/ia32/lithium-codegen-ia32.h\",\n      \"src/crankshaft/ia32/lithium-gap-resolver-ia32.cc\",\n      \"src/crankshaft/ia32/lithium-gap-resolver-ia32.h\",\n      \"src/crankshaft/ia32/lithium-ia32.cc\",\n      \"src/crankshaft/ia32/lithium-ia32.h\",\n      \"src/debug/ia32/debug-ia32.cc\",\n      \"src/full-codegen/ia32/full-codegen-ia32.cc\",\n      \"src/ia32/assembler-ia32-inl.h\",\n      \"src/ia32/assembler-ia32.cc\",\n      \"src/ia32/assembler-ia32.h\",\n      \"src/ia32/code-stubs-ia32.cc\",\n      \"src/ia32/code-stubs-ia32.h\",\n      \"src/ia32/codegen-ia32.cc\",\n      \"src/ia32/codegen-ia32.h\",\n      \"src/ia32/cpu-ia32.cc\",\n      \"src/ia32/deoptimizer-ia32.cc\",\n      \"src/ia32/disasm-ia32.cc\",\n      \"src/ia32/frames-ia32.cc\",\n      \"src/ia32/frames-ia32.h\",\n      \"src/ia32/interface-descriptors-ia32.cc\",\n      \"src/ia32/macro-assembler-ia32.cc\",\n      \"src/ia32/macro-assembler-ia32.h\",\n      \"src/ic/ia32/access-compiler-ia32.cc\",\n      \"src/ic/ia32/handler-compiler-ia32.cc\",\n      \"src/ic/ia32/ic-compiler-ia32.cc\",\n      \"src/ic/ia32/ic-ia32.cc\",\n      \"src/ic/ia32/stub-cache-ia32.cc\",\n      \"src/regexp/ia32/regexp-macro-assembler-ia32.cc\",\n      \"src/regexp/ia32/regexp-macro-assembler-ia32.h\",\n    ]\n  } else if (v8_current_cpu == \"x64\") {\n    sources += [\n      \"src/builtins/x64/builtins-x64.cc\",\n      \"src/compiler/x64/code-generator-x64.cc\",\n      \"src/compiler/x64/instruction-codes-x64.h\",\n      \"src/compiler/x64/instruction-scheduler-x64.cc\",\n      \"src/compiler/x64/instruction-selector-x64.cc\",\n      \"src/compiler/x64/unwinding-info-writer-x64.cc\",\n      \"src/compiler/x64/unwinding-info-writer-x64.h\",\n      \"src/crankshaft/x64/lithium-codegen-x64.cc\",\n      \"src/crankshaft/x64/lithium-codegen-x64.h\",\n      \"src/crankshaft/x64/lithium-gap-resolver-x64.cc\",\n      \"src/crankshaft/x64/lithium-gap-resolver-x64.h\",\n      \"src/crankshaft/x64/lithium-x64.cc\",\n      \"src/crankshaft/x64/lithium-x64.h\",\n      \"src/debug/x64/debug-x64.cc\",\n      \"src/full-codegen/x64/full-codegen-x64.cc\",\n      \"src/ic/x64/access-compiler-x64.cc\",\n      \"src/ic/x64/handler-compiler-x64.cc\",\n      \"src/ic/x64/ic-compiler-x64.cc\",\n      \"src/ic/x64/ic-x64.cc\",\n      \"src/ic/x64/stub-cache-x64.cc\",\n      \"src/regexp/x64/regexp-macro-assembler-x64.cc\",\n      \"src/regexp/x64/regexp-macro-assembler-x64.h\",\n      \"src/x64/assembler-x64-inl.h\",\n      \"src/x64/assembler-x64.cc\",\n      \"src/x64/assembler-x64.h\",\n      \"src/x64/code-stubs-x64.cc\",\n      \"src/x64/code-stubs-x64.h\",\n      \"src/x64/codegen-x64.cc\",\n      \"src/x64/codegen-x64.h\",\n      \"src/x64/cpu-x64.cc\",\n      \"src/x64/deoptimizer-x64.cc\",\n      \"src/x64/disasm-x64.cc\",\n      \"src/x64/eh-frame-x64.cc\",\n      \"src/x64/frames-x64.cc\",\n      \"src/x64/frames-x64.h\",\n      \"src/x64/interface-descriptors-x64.cc\",\n      \"src/x64/macro-assembler-x64.cc\",\n      \"src/x64/macro-assembler-x64.h\",\n    ]\n  } else if (v8_current_cpu == \"arm\") {\n    sources += [\n      \"src/arm/assembler-arm-inl.h\",\n      \"src/arm/assembler-arm.cc\",\n      \"src/arm/assembler-arm.h\",\n      \"src/arm/code-stubs-arm.cc\",\n      \"src/arm/code-stubs-arm.h\",\n      \"src/arm/codegen-arm.cc\",\n      \"src/arm/codegen-arm.h\",\n      \"src/arm/constants-arm.cc\",\n      \"src/arm/constants-arm.h\",\n      \"src/arm/cpu-arm.cc\",\n      \"src/arm/deoptimizer-arm.cc\",\n      \"src/arm/disasm-arm.cc\",\n      \"src/arm/eh-frame-arm.cc\",\n      \"src/arm/frames-arm.cc\",\n      \"src/arm/frames-arm.h\",\n      \"src/arm/interface-descriptors-arm.cc\",\n      \"src/arm/interface-descriptors-arm.h\",\n      \"src/arm/macro-assembler-arm.cc\",\n      \"src/arm/macro-assembler-arm.h\",\n      \"src/arm/simulator-arm.cc\",\n      \"src/arm/simulator-arm.h\",\n      \"src/builtins/arm/builtins-arm.cc\",\n      \"src/compiler/arm/code-generator-arm.cc\",\n      \"src/compiler/arm/instruction-codes-arm.h\",\n      \"src/compiler/arm/instruction-scheduler-arm.cc\",\n      \"src/compiler/arm/instruction-selector-arm.cc\",\n      \"src/compiler/arm/unwinding-info-writer-arm.cc\",\n      \"src/compiler/arm/unwinding-info-writer-arm.h\",\n      \"src/crankshaft/arm/lithium-arm.cc\",\n      \"src/crankshaft/arm/lithium-arm.h\",\n      \"src/crankshaft/arm/lithium-codegen-arm.cc\",\n      \"src/crankshaft/arm/lithium-codegen-arm.h\",\n      \"src/crankshaft/arm/lithium-gap-resolver-arm.cc\",\n      \"src/crankshaft/arm/lithium-gap-resolver-arm.h\",\n      \"src/debug/arm/debug-arm.cc\",\n      \"src/full-codegen/arm/full-codegen-arm.cc\",\n      \"src/ic/arm/access-compiler-arm.cc\",\n      \"src/ic/arm/handler-compiler-arm.cc\",\n      \"src/ic/arm/ic-arm.cc\",\n      \"src/ic/arm/ic-compiler-arm.cc\",\n      \"src/ic/arm/stub-cache-arm.cc\",\n      \"src/regexp/arm/regexp-macro-assembler-arm.cc\",\n      \"src/regexp/arm/regexp-macro-assembler-arm.h\",\n    ]\n  } else if (v8_current_cpu == \"arm64\") {\n    sources += [\n      \"src/arm64/assembler-arm64-inl.h\",\n      \"src/arm64/assembler-arm64.cc\",\n      \"src/arm64/assembler-arm64.h\",\n      \"src/arm64/code-stubs-arm64.cc\",\n      \"src/arm64/code-stubs-arm64.h\",\n      \"src/arm64/codegen-arm64.cc\",\n      \"src/arm64/codegen-arm64.h\",\n      \"src/arm64/constants-arm64.h\",\n      \"src/arm64/cpu-arm64.cc\",\n      \"src/arm64/decoder-arm64-inl.h\",\n      \"src/arm64/decoder-arm64.cc\",\n      \"src/arm64/decoder-arm64.h\",\n      \"src/arm64/deoptimizer-arm64.cc\",\n      \"src/arm64/disasm-arm64.cc\",\n      \"src/arm64/disasm-arm64.h\",\n      \"src/arm64/eh-frame-arm64.cc\",\n      \"src/arm64/frames-arm64.cc\",\n      \"src/arm64/frames-arm64.h\",\n      \"src/arm64/instructions-arm64.cc\",\n      \"src/arm64/instructions-arm64.h\",\n      \"src/arm64/instrument-arm64.cc\",\n      \"src/arm64/instrument-arm64.h\",\n      \"src/arm64/interface-descriptors-arm64.cc\",\n      \"src/arm64/interface-descriptors-arm64.h\",\n      \"src/arm64/macro-assembler-arm64-inl.h\",\n      \"src/arm64/macro-assembler-arm64.cc\",\n      \"src/arm64/macro-assembler-arm64.h\",\n      \"src/arm64/simulator-arm64.cc\",\n      \"src/arm64/simulator-arm64.h\",\n      \"src/arm64/utils-arm64.cc\",\n      \"src/arm64/utils-arm64.h\",\n      \"src/builtins/arm64/builtins-arm64.cc\",\n      \"src/compiler/arm64/code-generator-arm64.cc\",\n      \"src/compiler/arm64/instruction-codes-arm64.h\",\n      \"src/compiler/arm64/instruction-scheduler-arm64.cc\",\n      \"src/compiler/arm64/instruction-selector-arm64.cc\",\n      \"src/compiler/arm64/unwinding-info-writer-arm64.cc\",\n      \"src/compiler/arm64/unwinding-info-writer-arm64.h\",\n      \"src/crankshaft/arm64/delayed-masm-arm64-inl.h\",\n      \"src/crankshaft/arm64/delayed-masm-arm64.cc\",\n      \"src/crankshaft/arm64/delayed-masm-arm64.h\",\n      \"src/crankshaft/arm64/lithium-arm64.cc\",\n      \"src/crankshaft/arm64/lithium-arm64.h\",\n      \"src/crankshaft/arm64/lithium-codegen-arm64.cc\",\n      \"src/crankshaft/arm64/lithium-codegen-arm64.h\",\n      \"src/crankshaft/arm64/lithium-gap-resolver-arm64.cc\",\n      \"src/crankshaft/arm64/lithium-gap-resolver-arm64.h\",\n      \"src/debug/arm64/debug-arm64.cc\",\n      \"src/full-codegen/arm64/full-codegen-arm64.cc\",\n      \"src/ic/arm64/access-compiler-arm64.cc\",\n      \"src/ic/arm64/handler-compiler-arm64.cc\",\n      \"src/ic/arm64/ic-arm64.cc\",\n      \"src/ic/arm64/ic-compiler-arm64.cc\",\n      \"src/ic/arm64/stub-cache-arm64.cc\",\n      \"src/regexp/arm64/regexp-macro-assembler-arm64.cc\",\n      \"src/regexp/arm64/regexp-macro-assembler-arm64.h\",\n    ]\n  } else if (v8_current_cpu == \"mipsel\") {\n    sources += [\n      \"src/builtins/mips/builtins-mips.cc\",\n      \"src/compiler/mips/code-generator-mips.cc\",\n      \"src/compiler/mips/instruction-codes-mips.h\",\n      \"src/compiler/mips/instruction-scheduler-mips.cc\",\n      \"src/compiler/mips/instruction-selector-mips.cc\",\n      \"src/crankshaft/mips/lithium-codegen-mips.cc\",\n      \"src/crankshaft/mips/lithium-codegen-mips.h\",\n      \"src/crankshaft/mips/lithium-gap-resolver-mips.cc\",\n      \"src/crankshaft/mips/lithium-gap-resolver-mips.h\",\n      \"src/crankshaft/mips/lithium-mips.cc\",\n      \"src/crankshaft/mips/lithium-mips.h\",\n      \"src/debug/mips/debug-mips.cc\",\n      \"src/full-codegen/mips/full-codegen-mips.cc\",\n      \"src/ic/mips/access-compiler-mips.cc\",\n      \"src/ic/mips/handler-compiler-mips.cc\",\n      \"src/ic/mips/ic-compiler-mips.cc\",\n      \"src/ic/mips/ic-mips.cc\",\n      \"src/ic/mips/stub-cache-mips.cc\",\n      \"src/mips/assembler-mips-inl.h\",\n      \"src/mips/assembler-mips.cc\",\n      \"src/mips/assembler-mips.h\",\n      \"src/mips/code-stubs-mips.cc\",\n      \"src/mips/code-stubs-mips.h\",\n      \"src/mips/codegen-mips.cc\",\n      \"src/mips/codegen-mips.h\",\n      \"src/mips/constants-mips.cc\",\n      \"src/mips/constants-mips.h\",\n      \"src/mips/cpu-mips.cc\",\n      \"src/mips/deoptimizer-mips.cc\",\n      \"src/mips/disasm-mips.cc\",\n      \"src/mips/frames-mips.cc\",\n      \"src/mips/frames-mips.h\",\n      \"src/mips/interface-descriptors-mips.cc\",\n      \"src/mips/macro-assembler-mips.cc\",\n      \"src/mips/macro-assembler-mips.h\",\n      \"src/mips/simulator-mips.cc\",\n      \"src/mips/simulator-mips.h\",\n      \"src/regexp/mips/regexp-macro-assembler-mips.cc\",\n      \"src/regexp/mips/regexp-macro-assembler-mips.h\",\n    ]\n  } else if (v8_current_cpu == \"mips64el\") {\n    sources += [\n      \"src/builtins/mips64/builtins-mips64.cc\",\n      \"src/compiler/mips64/code-generator-mips64.cc\",\n      \"src/compiler/mips64/instruction-codes-mips64.h\",\n      \"src/compiler/mips64/instruction-scheduler-mips64.cc\",\n      \"src/compiler/mips64/instruction-selector-mips64.cc\",\n      \"src/crankshaft/mips64/lithium-codegen-mips64.cc\",\n      \"src/crankshaft/mips64/lithium-codegen-mips64.h\",\n      \"src/crankshaft/mips64/lithium-gap-resolver-mips64.cc\",\n      \"src/crankshaft/mips64/lithium-gap-resolver-mips64.h\",\n      \"src/crankshaft/mips64/lithium-mips64.cc\",\n      \"src/crankshaft/mips64/lithium-mips64.h\",\n      \"src/debug/mips64/debug-mips64.cc\",\n      \"src/full-codegen/mips64/full-codegen-mips64.cc\",\n      \"src/ic/mips64/access-compiler-mips64.cc\",\n      \"src/ic/mips64/handler-compiler-mips64.cc\",\n      \"src/ic/mips64/ic-compiler-mips64.cc\",\n      \"src/ic/mips64/ic-mips64.cc\",\n      \"src/ic/mips64/stub-cache-mips64.cc\",\n      \"src/mips64/assembler-mips64-inl.h\",\n      \"src/mips64/assembler-mips64.cc\",\n      \"src/mips64/assembler-mips64.h\",\n      \"src/mips64/code-stubs-mips64.cc\",\n      \"src/mips64/code-stubs-mips64.h\",\n      \"src/mips64/codegen-mips64.cc\",\n      \"src/mips64/codegen-mips64.h\",\n      \"src/mips64/constants-mips64.cc\",\n      \"src/mips64/constants-mips64.h\",\n      \"src/mips64/cpu-mips64.cc\",\n      \"src/mips64/deoptimizer-mips64.cc\",\n      \"src/mips64/disasm-mips64.cc\",\n      \"src/mips64/frames-mips64.cc\",\n      \"src/mips64/frames-mips64.h\",\n      \"src/mips64/interface-descriptors-mips64.cc\",\n      \"src/mips64/macro-assembler-mips64.cc\",\n      \"src/mips64/macro-assembler-mips64.h\",\n      \"src/mips64/simulator-mips64.cc\",\n      \"src/mips64/simulator-mips64.h\",\n      \"src/regexp/mips64/regexp-macro-assembler-mips64.cc\",\n      \"src/regexp/mips64/regexp-macro-assembler-mips64.h\",\n    ]\n  } else if (v8_current_cpu == \"s390\" || v8_current_cpu == \"s390x\") {\n    sources += [\n      \"src/builtins/s390/builtins-s390.cc\",\n      \"src/compiler/s390/code-generator-s390.cc\",\n      \"src/compiler/s390/instruction-codes-s390.h\",\n      \"src/compiler/s390/instruction-scheduler-s390.cc\",\n      \"src/compiler/s390/instruction-selector-s390.cc\",\n      \"src/crankshaft/s390/lithium-codegen-s390.cc\",\n      \"src/crankshaft/s390/lithium-codegen-s390.h\",\n      \"src/crankshaft/s390/lithium-gap-resolver-s390.cc\",\n      \"src/crankshaft/s390/lithium-gap-resolver-s390.h\",\n      \"src/crankshaft/s390/lithium-s390.cc\",\n      \"src/crankshaft/s390/lithium-s390.h\",\n      \"src/debug/s390/debug-s390.cc\",\n      \"src/full-codegen/s390/full-codegen-s390.cc\",\n      \"src/ic/s390/access-compiler-s390.cc\",\n      \"src/ic/s390/handler-compiler-s390.cc\",\n      \"src/ic/s390/ic-compiler-s390.cc\",\n      \"src/ic/s390/ic-s390.cc\",\n      \"src/ic/s390/stub-cache-s390.cc\",\n      \"src/regexp/s390/regexp-macro-assembler-s390.cc\",\n      \"src/regexp/s390/regexp-macro-assembler-s390.h\",\n      \"src/s390/assembler-s390-inl.h\",\n      \"src/s390/assembler-s390.cc\",\n      \"src/s390/assembler-s390.h\",\n      \"src/s390/code-stubs-s390.cc\",\n      \"src/s390/code-stubs-s390.h\",\n      \"src/s390/codegen-s390.cc\",\n      \"src/s390/codegen-s390.h\",\n      \"src/s390/constants-s390.cc\",\n      \"src/s390/constants-s390.h\",\n      \"src/s390/cpu-s390.cc\",\n      \"src/s390/deoptimizer-s390.cc\",\n      \"src/s390/disasm-s390.cc\",\n      \"src/s390/frames-s390.cc\",\n      \"src/s390/frames-s390.h\",\n      \"src/s390/interface-descriptors-s390.cc\",\n      \"src/s390/macro-assembler-s390.cc\",\n      \"src/s390/macro-assembler-s390.h\",\n      \"src/s390/simulator-s390.cc\",\n      \"src/s390/simulator-s390.h\",\n    ]\n  }\n\n  configs = [ \":internal_config\" ]\n\n  defines = []\n  deps = [\n    \":v8_libbase\",\n    \":v8_libsampler\",\n  ]\n\n  sources += [ v8_generated_peephole_source ]\n  deps += [ \":run_mkpeephole\" ]\n\n  if (is_win) {\n    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.\n    cflags = [ \"/wd4267\" ]\n  }\n\n  if (v8_enable_i18n_support) {\n    deps += [ \"//third_party/icu\" ]\n    if (is_win) {\n      deps += [ \"//third_party/icu:icudata\" ]\n    }\n  } else {\n    sources -= [\n      \"src/i18n.cc\",\n      \"src/i18n.h\",\n    ]\n  }\n\n  if (v8_postmortem_support) {\n    sources += [ \"$target_gen_dir/debug-support.cc\" ]\n    deps += [ \":postmortem-metadata\" ]\n  }\n}\n\nv8_source_set(\"v8_libbase\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  sources = [\n    \"src/base/accounting-allocator.cc\",\n    \"src/base/accounting-allocator.h\",\n    \"src/base/adapters.h\",\n    \"src/base/atomic-utils.h\",\n    \"src/base/atomicops.h\",\n    \"src/base/atomicops_internals_arm64_gcc.h\",\n    \"src/base/atomicops_internals_arm_gcc.h\",\n    \"src/base/atomicops_internals_atomicword_compat.h\",\n    \"src/base/atomicops_internals_mac.h\",\n    \"src/base/atomicops_internals_mips64_gcc.h\",\n    \"src/base/atomicops_internals_mips_gcc.h\",\n    \"src/base/atomicops_internals_s390_gcc.h\",\n    \"src/base/atomicops_internals_tsan.h\",\n    \"src/base/atomicops_internals_x86_gcc.cc\",\n    \"src/base/atomicops_internals_x86_gcc.h\",\n    \"src/base/atomicops_internals_x86_msvc.h\",\n    \"src/base/bits.cc\",\n    \"src/base/bits.h\",\n    \"src/base/build_config.h\",\n    \"src/base/cpu.cc\",\n    \"src/base/cpu.h\",\n    \"src/base/debug/stack_trace.cc\",\n    \"src/base/debug/stack_trace.h\",\n    \"src/base/division-by-constant.cc\",\n    \"src/base/division-by-constant.h\",\n    \"src/base/file-utils.cc\",\n    \"src/base/file-utils.h\",\n    \"src/base/flags.h\",\n    \"src/base/format-macros.h\",\n    \"src/base/free_deleter.h\",\n    \"src/base/functional.cc\",\n    \"src/base/functional.h\",\n    \"src/base/hashmap.h\",\n    \"src/base/ieee754.cc\",\n    \"src/base/ieee754.h\",\n    \"src/base/iterator.h\",\n    \"src/base/lazy-instance.h\",\n    \"src/base/logging.cc\",\n    \"src/base/logging.h\",\n    \"src/base/macros.h\",\n    \"src/base/once.cc\",\n    \"src/base/once.h\",\n    \"src/base/platform/condition-variable.cc\",\n    \"src/base/platform/condition-variable.h\",\n    \"src/base/platform/elapsed-timer.h\",\n    \"src/base/platform/mutex.cc\",\n    \"src/base/platform/mutex.h\",\n    \"src/base/platform/platform.h\",\n    \"src/base/platform/semaphore.cc\",\n    \"src/base/platform/semaphore.h\",\n    \"src/base/platform/time.cc\",\n    \"src/base/platform/time.h\",\n    \"src/base/safe_conversions.h\",\n    \"src/base/safe_conversions_impl.h\",\n    \"src/base/safe_math.h\",\n    \"src/base/safe_math_impl.h\",\n    \"src/base/sys-info.cc\",\n    \"src/base/sys-info.h\",\n    \"src/base/utils/random-number-generator.cc\",\n    \"src/base/utils/random-number-generator.h\",\n  ]\n\n  configs = [ \":internal_config_base\" ]\n\n  defines = []\n\n  if (is_posix) {\n    sources += [ \"src/base/platform/platform-posix.cc\" ]\n  }\n\n  if (is_linux) {\n    sources += [\n      \"src/base/debug/stack_trace_posix.cc\",\n      \"src/base/platform/platform-linux.cc\",\n    ]\n\n    libs = [\n      \"dl\",\n      \"rt\",\n    ]\n  } else if (is_android) {\n    if (current_toolchain == host_toolchain) {\n      libs = [\n        \"dl\",\n        \"rt\",\n      ]\n      if (host_os == \"mac\") {\n        sources += [\n          \"src/base/debug/stack_trace_posix.cc\",\n          \"src/base/platform/platform-macos.cc\",\n        ]\n      } else {\n        sources += [\n          \"src/base/debug/stack_trace_posix.cc\",\n          \"src/base/platform/platform-linux.cc\",\n        ]\n      }\n    } else {\n      sources += [\n        \"src/base/debug/stack_trace_android.cc\",\n        \"src/base/platform/platform-linux.cc\",\n      ]\n    }\n  } else if (is_mac) {\n    sources += [\n      \"src/base/debug/stack_trace_posix.cc\",\n      \"src/base/platform/platform-macos.cc\",\n    ]\n  } else if (is_win) {\n    # TODO(jochen): Add support for cygwin.\n    sources += [\n      \"src/base/debug/stack_trace_win.cc\",\n      \"src/base/platform/platform-win32.cc\",\n      \"src/base/win32-headers.h\",\n    ]\n\n    defines += [ \"_CRT_RAND_S\" ]  # for rand_s()\n\n    libs = [\n      \"dbghelp.lib\",\n      \"shlwapi.lib\",\n      \"winmm.lib\",\n      \"ws2_32.lib\",\n    ]\n  }\n\n  # TODO(jochen): Add support for qnx, freebsd, openbsd, netbsd, and solaris.\n}\n\nv8_source_set(\"v8_libplatform\") {\n  sources = [\n    \"//base/trace_event/common/trace_event_common.h\",\n    \"include/libplatform/libplatform.h\",\n    \"include/libplatform/v8-tracing.h\",\n    \"src/libplatform/default-platform.cc\",\n    \"src/libplatform/default-platform.h\",\n    \"src/libplatform/task-queue.cc\",\n    \"src/libplatform/task-queue.h\",\n    \"src/libplatform/tracing/trace-buffer.cc\",\n    \"src/libplatform/tracing/trace-buffer.h\",\n    \"src/libplatform/tracing/trace-config.cc\",\n    \"src/libplatform/tracing/trace-object.cc\",\n    \"src/libplatform/tracing/trace-writer.cc\",\n    \"src/libplatform/tracing/trace-writer.h\",\n    \"src/libplatform/tracing/tracing-controller.cc\",\n    \"src/libplatform/worker-thread.cc\",\n    \"src/libplatform/worker-thread.h\",\n  ]\n\n  configs = [ \":internal_config_base\" ]\n\n  public_configs = [ \":libplatform_config\" ]\n\n  deps = [\n    \":v8_libbase\",\n  ]\n}\n\nv8_source_set(\"v8_libsampler\") {\n  sources = [\n    \"src/libsampler/sampler.cc\",\n    \"src/libsampler/sampler.h\",\n  ]\n\n  configs = [ \":internal_config_base\" ]\n\n  public_configs = [ \":libsampler_config\" ]\n\n  deps = [\n    \":v8_libbase\",\n  ]\n}\n\nv8_source_set(\"fuzzer_support\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  sources = [\n    \"test/fuzzer/fuzzer-support.cc\",\n    \"test/fuzzer/fuzzer-support.h\",\n  ]\n\n  configs = [ \":internal_config_base\" ]\n\n  deps = [\n    \":v8_maybe_snapshot\",\n  ]\n\n  public_deps = [\n    \":v8_libplatform\",\n  ]\n}\n\nv8_source_set(\"simple_fuzzer\") {\n  sources = [\n    \"test/fuzzer/fuzzer.cc\",\n  ]\n\n  configs = [ \":internal_config_base\" ]\n}\n\n###############################################################################\n# Executables\n#\n\nif (current_toolchain == v8_snapshot_toolchain) {\n  v8_executable(\"mksnapshot\") {\n    visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n    sources = [\n      \"src/snapshot/mksnapshot.cc\",\n    ]\n\n    configs = [ \":internal_config\" ]\n\n    deps = [\n      \":v8_base\",\n      \":v8_libplatform\",\n      \":v8_nosnapshot\",\n      \"//build/config/sanitizers:deps\",\n      \"//build/win:default_exe_manifest\",\n    ]\n  }\n}\n\nv8_executable(\"mkpeephole\") {\n  # mkpeephole needs to be built for the build host so the peephole lookup\n  # table can built during build. The table depends on the properties of\n  # bytecodes that are described in bytecodes.{cc,h}.\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  sources = [\n    \"src/interpreter/bytecode-peephole-optimizer.h\",\n    \"src/interpreter/bytecodes.cc\",\n    \"src/interpreter/bytecodes.h\",\n    \"src/interpreter/mkpeephole.cc\",\n  ]\n\n  configs = [\n    \":external_config\",\n    \":internal_config\",\n  ]\n\n  deps = [\n    \":v8_libbase\",\n    \"//build/config/sanitizers:deps\",\n    \"//build/win:default_exe_manifest\",\n  ]\n}\n\n###############################################################################\n# Public targets\n#\n\nwant_v8_shell =\n    (current_toolchain == host_toolchain && v8_toolset_for_shell == \"host\") ||\n    (current_toolchain == v8_snapshot_toolchain &&\n     v8_toolset_for_shell == \"host\") ||\n    (current_toolchain != host_toolchain && v8_toolset_for_shell == \"target\")\n\ngroup(\"gn_all\") {\n  testonly = true\n\n  deps = [\n    \":d8\",\n    \":v8_hello_world\",\n    \":v8_parser_shell\",\n    \":v8_sample_process\",\n    \":v8_simple_json_fuzzer\",\n    \":v8_simple_parser_fuzzer\",\n    \":v8_simple_regexp_fuzzer\",\n    \":v8_simple_wasm_asmjs_fuzzer\",\n    \":v8_simple_wasm_fuzzer\",\n    \"test:gn_all\",\n    \"tools:gn_all\",\n  ]\n\n  if (want_v8_shell) {\n    deps += [ \":v8_shell\" ]\n  }\n\n  if (v8_test_isolation_mode != \"noop\") {\n    deps += [ \":d8_run\" ]\n  }\n}\n\nif (is_component_build) {\n  v8_component(\"v8\") {\n    sources = [\n      \"src/v8dll-main.cc\",\n    ]\n\n    deps = [\n      \":v8_dump_build_config\",\n    ]\n\n    public_deps = [\n      \":v8_base\",\n      \":v8_maybe_snapshot\",\n    ]\n\n    configs = [ \":internal_config\" ]\n\n    public_configs = [ \":external_config\" ]\n  }\n} else {\n  group(\"v8\") {\n    deps = [\n      \":v8_dump_build_config\",\n    ]\n\n    public_deps = [\n      \":v8_base\",\n      \":v8_maybe_snapshot\",\n    ]\n    public_configs = [ \":external_config\" ]\n  }\n}\n\nv8_executable(\"d8\") {\n  sources = [\n    \"src/d8.cc\",\n    \"src/d8.h\",\n  ]\n\n  configs = [\n    # Note: don't use :internal_config here because this target will get\n    # the :external_config applied to it by virtue of depending on :v8, and\n    # you can't have both applied to the same target.\n    \":internal_config_base\",\n  ]\n\n  deps = [\n    \":d8_js2c\",\n    \":v8\",\n    \":v8_libplatform\",\n    \"//build/config/sanitizers:deps\",\n    \"//build/win:default_exe_manifest\",\n  ]\n\n  # TODO(jochen): Add support for vtunejit.\n\n  if (is_posix) {\n    sources += [ \"src/d8-posix.cc\" ]\n  } else if (is_win) {\n    sources += [ \"src/d8-windows.cc\" ]\n  }\n\n  if (!is_component_build) {\n    sources += [ \"$target_gen_dir/d8-js.cc\" ]\n  }\n  if (v8_enable_i18n_support) {\n    deps += [ \"//third_party/icu\" ]\n  }\n}\n\nv8_isolate_run(\"d8\") {\n  deps = [\n    \":d8\",\n  ]\n\n  isolate = \"//src/d8.isolate\"\n}\n\nv8_executable(\"v8_hello_world\") {\n  sources = [\n    \"samples/hello-world.cc\",\n  ]\n\n  configs = [\n    # Note: don't use :internal_config here because this target will get\n    # the :external_config applied to it by virtue of depending on :v8, and\n    # you can't have both applied to the same target.\n    \":internal_config_base\",\n  ]\n\n  deps = [\n    \":v8\",\n    \":v8_libplatform\",\n    \"//build/config/sanitizers:deps\",\n    \"//build/win:default_exe_manifest\",\n  ]\n\n  if (v8_enable_i18n_support) {\n    deps += [ \"//third_party/icu\" ]\n  }\n}\n\nv8_executable(\"v8_sample_process\") {\n  sources = [\n    \"samples/process.cc\",\n  ]\n\n  configs = [\n    # Note: don't use :internal_config here because this target will get\n    # the :external_config applied to it by virtue of depending on :v8, and\n    # you can't have both applied to the same target.\n    \":internal_config_base\",\n  ]\n\n  deps = [\n    \":v8\",\n    \":v8_libplatform\",\n    \"//build/config/sanitizers:deps\",\n    \"//build/win:default_exe_manifest\",\n  ]\n\n  if (v8_enable_i18n_support) {\n    deps += [ \"//third_party/icu\" ]\n  }\n}\n\nv8_executable(\"v8_parser_shell\") {\n  sources = [\n    \"tools/parser-shell.cc\",\n    \"tools/shell-utils.h\",\n  ]\n\n  configs = [\n    \":external_config\",\n    \":internal_config_base\",\n  ]\n\n  deps = [\n    \":v8_libplatform\",\n    \"//build/config/sanitizers:deps\",\n    \"//build/win:default_exe_manifest\",\n  ]\n\n  if (is_component_build) {\n    # v8_parser_shell can't be built against a shared library, so we\n    # need to depend on the underlying static target in that case.\n    deps += [ \":v8_maybe_snapshot\" ]\n  } else {\n    deps += [ \":v8\" ]\n  }\n\n  if (v8_enable_i18n_support) {\n    deps += [ \"//third_party/icu\" ]\n  }\n\n  if (is_win) {\n    # Suppress warnings about importing locally defined symbols.\n    if (is_component_build) {\n      ldflags = [\n        \"/ignore:4049\",\n        \"/ignore:4217\",\n      ]\n    }\n  }\n}\n\nif (want_v8_shell) {\n  v8_executable(\"v8_shell\") {\n    sources = [\n      \"samples/shell.cc\",\n    ]\n\n    configs = [\n      # Note: don't use :internal_config here because this target will get\n      # the :external_config applied to it by virtue of depending on :v8, and\n      # you can't have both applied to the same target.\n      \":internal_config_base\",\n    ]\n\n    deps = [\n      \":v8\",\n      \":v8_libplatform\",\n      \"//build/config/sanitizers:deps\",\n      \"//build/win:default_exe_manifest\",\n    ]\n\n    if (v8_enable_i18n_support) {\n      deps += [ \"//third_party/icu\" ]\n    }\n  }\n}\n\ntemplate(\"v8_fuzzer\") {\n  name = target_name\n  forward_variables_from(invoker, \"*\")\n  v8_executable(\"v8_simple_\" + name) {\n    deps = [\n      \":\" + name,\n      \":simple_fuzzer\",\n      \"//build/win:default_exe_manifest\",\n    ]\n\n    configs = [ \":external_config\" ]\n  }\n}\n\nv8_source_set(\"json_fuzzer\") {\n  sources = [\n    \"test/fuzzer/json.cc\",\n  ]\n\n  deps = [\n    \":fuzzer_support\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_fuzzer(\"json_fuzzer\") {\n}\n\nv8_source_set(\"parser_fuzzer\") {\n  sources = [\n    \"test/fuzzer/parser.cc\",\n  ]\n\n  deps = [\n    \":fuzzer_support\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_fuzzer(\"parser_fuzzer\") {\n}\n\nv8_source_set(\"regexp_fuzzer\") {\n  sources = [\n    \"test/fuzzer/regexp.cc\",\n  ]\n\n  deps = [\n    \":fuzzer_support\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_fuzzer(\"regexp_fuzzer\") {\n}\n\nv8_source_set(\"wasm_fuzzer\") {\n  sources = [\n    \"test/fuzzer/wasm.cc\",\n  ]\n\n  deps = [\n    \":fuzzer_support\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_fuzzer(\"wasm_fuzzer\") {\n}\n\nv8_source_set(\"wasm_asmjs_fuzzer\") {\n  sources = [\n    \"test/fuzzer/wasm-asmjs.cc\",\n  ]\n\n  deps = [\n    \":fuzzer_support\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_fuzzer(\"wasm_asmjs_fuzzer\") {\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/android-rules.gni",
    "content": "# Copyright 2014 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\n# Do not add any imports to non-//build directories here.\n# Some projects (e.g. V8) do not have non-build directories DEPS'ed in.\nimport(\"//build/config/android/config.gni\")\nimport(\"//build/config/android/internal_rules.gni\")\nimport(\"//build/config/compiler/compiler.gni\")\nimport(\"//build/config/dcheck_always_on.gni\")\nimport(\"//build/toolchain/toolchain.gni\")\n\nassert(is_android)\n\n# Creates a dist directory for a native executable.\n#\n# Running a native executable on a device requires all the shared library\n# dependencies of that executable. To make it easier to install and run such an\n# executable, this will create a directory containing the native exe and all\n# it's library dependencies.\n#\n# Note: It's usually better to package things as an APK than as a native\n# executable.\n#\n# Variables\n#   dist_dir: Directory for the exe and libraries. Everything in this directory\n#     will be deleted before copying in the exe and libraries.\n#   binary: Path to (stripped) executable.\n#   extra_files: List of extra files to copy in (optional).\n#\n# Example\n#   create_native_executable_dist(\"foo_dist\") {\n#     dist_dir = \"$root_build_dir/foo_dist\"\n#     binary = \"$root_build_dir/foo\"\n#     deps = [ \":the_thing_that_makes_foo\" ]\n#   }\ntemplate(\"create_native_executable_dist\") {\n  forward_variables_from(invoker, [ \"testonly\" ])\n\n  _libraries_list = \"${target_gen_dir}/${target_name}_library_dependencies.list\"\n\n  _find_deps_target_name = \"${target_name}__find_library_dependencies\"\n\n  # TODO(agrieve): Extract dependent libs from GN rather than readelf.\n  action(_find_deps_target_name) {\n    forward_variables_from(invoker, [ \"deps\" ])\n\n    script = \"//build/android/gyp/write_ordered_libraries.py\"\n    depfile = \"$target_gen_dir/$target_name.d\"\n    inputs = [\n      invoker.binary,\n      android_readelf,\n    ]\n    outputs = [\n      _libraries_list,\n    ]\n    rebased_binaries = rebase_path([ invoker.binary ], root_build_dir)\n    args = [\n      \"--depfile\",\n      rebase_path(depfile, root_build_dir),\n      \"--input-libraries=$rebased_binaries\",\n      \"--libraries-dir\",\n      rebase_path(root_shlib_dir, root_build_dir),\n      \"--output\",\n      rebase_path(_libraries_list, root_build_dir),\n      \"--readelf\",\n      rebase_path(android_readelf, root_build_dir),\n    ]\n  }\n\n  copy_ex(target_name) {\n    clear_dir = true\n\n    inputs = [\n      _libraries_list,\n      invoker.binary,\n    ]\n\n    dest = invoker.dist_dir\n    data = [\n      \"${invoker.dist_dir}/\",\n    ]\n\n    _rebased_libraries_list = rebase_path(_libraries_list, root_build_dir)\n    _rebased_binaries_list = rebase_path([ invoker.binary ], root_build_dir)\n    args = [\n      \"--files=@FileArg($_rebased_libraries_list:lib_paths)\",\n      \"--files=$_rebased_binaries_list\",\n    ]\n    if (defined(invoker.extra_files)) {\n      _rebased_extra_files = rebase_path(invoker.extra_files, root_build_dir)\n      args += [ \"--files=$_rebased_extra_files\" ]\n    }\n\n    deps = [\n      \":$_find_deps_target_name\",\n    ]\n    if (defined(invoker.deps)) {\n      deps += invoker.deps\n    }\n  }\n}\n\n# Writes a script to root_out_dir/bin that passes --output-directory to the\n# wrapped script, in addition to forwarding arguments. Most / all of these\n# wrappers should be made deps of //tools/android:android_tools.\n#\n# Variables\n#   target: Script to wrap.\n#   flag_name: Default is \"--output-directory\"\n#\n# Example\n#   wrapper_script(\"foo_wrapper\") {\n#     target = \"//pkg/foo.py\"\n#   }\ntemplate(\"wrapper_script\") {\n  action(target_name) {\n    _name = get_path_info(invoker.target, \"name\")\n    _output = \"$root_out_dir/bin/$_name\"\n\n    script = \"//build/android/gyp/create_tool_wrapper.py\"\n    outputs = [\n      _output,\n    ]\n\n    # The target isn't actually used by the script, but it's nice to have GN\n    # check that it exists.\n    inputs = [\n      invoker.target,\n    ]\n    args = [\n      \"--output\",\n      rebase_path(_output, root_build_dir),\n      \"--target\",\n      rebase_path(invoker.target, root_build_dir),\n      \"--output-directory\",\n      rebase_path(root_out_dir, root_build_dir),\n    ]\n    if (defined(invoker.flag_name)) {\n      args += [ \"--flag-name=${invoker.flag_name}\" ]\n    }\n  }\n}\n\nif (enable_java_templates) {\n  import(\"//build/config/sanitizers/sanitizers.gni\")\n  import(\"//tools/grit/grit_rule.gni\")\n\n  # Declare a jni target\n  #\n  # This target generates the native jni bindings for a set of .java files.\n  #\n  # See base/android/jni_generator/jni_generator.py for more info about the\n  # format of generating JNI bindings.\n  #\n  # Variables\n  #   sources: list of .java files to generate jni for\n  #   jni_package: subdirectory path for generated bindings\n  #\n  # Example\n  #   generate_jni(\"foo_jni\") {\n  #     sources = [\n  #       \"android/java/src/org/chromium/foo/Foo.java\",\n  #       \"android/java/src/org/chromium/foo/FooUtil.java\",\n  #     ]\n  #     jni_package = \"foo\"\n  #   }\n  template(\"generate_jni\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.sources))\n    assert(defined(invoker.jni_package))\n    jni_package = invoker.jni_package\n    base_output_dir = \"${target_gen_dir}/${target_name}\"\n    package_output_dir = \"${base_output_dir}/${jni_package}\"\n    jni_output_dir = \"${package_output_dir}/jni\"\n\n    jni_generator_include =\n        \"//base/android/jni_generator/jni_generator_helper.h\"\n\n    foreach_target_name = \"${target_name}__jni_gen\"\n    action_foreach(foreach_target_name) {\n      script = \"//base/android/jni_generator/jni_generator.py\"\n      depfile = \"$target_gen_dir/$target_name.{{source_name_part}}.d\"\n      sources = invoker.sources\n      outputs = [\n        \"${jni_output_dir}/{{source_name_part}}_jni.h\",\n      ]\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--input_file={{source}}\",\n        \"--optimize_generation=1\",\n        \"--ptr_type=long\",\n        \"--output_dir\",\n        rebase_path(jni_output_dir, root_build_dir),\n        \"--includes\",\n        rebase_path(jni_generator_include, jni_output_dir),\n        \"--native_exports_optional\",\n      ]\n\n      if (enable_profiling) {\n        args += [ \"--enable_profiling\" ]\n      }\n    }\n\n    config(\"jni_includes_${target_name}\") {\n      # TODO(cjhopman): #includes should probably all be relative to\n      # base_output_dir. Remove that from this config once the includes are\n      # updated.\n      include_dirs = [\n        base_output_dir,\n        package_output_dir,\n      ]\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"public_deps\",\n                               \"visibility\",\n                             ])\n      if (!defined(public_deps)) {\n        public_deps = []\n      }\n      public_deps += [ \":$foreach_target_name\" ]\n      public_configs = [ \":jni_includes_${target_name}\" ]\n    }\n  }\n\n  # Declare a jni target for a prebuilt jar\n  #\n  # This target generates the native jni bindings for a set of classes in a .jar.\n  #\n  # See base/android/jni_generator/jni_generator.py for more info about the\n  # format of generating JNI bindings.\n  #\n  # Variables\n  #   classes: list of .class files in the jar to generate jni for. These should\n  #     include the full path to the .class file.\n  #   jni_package: subdirectory path for generated bindings\n  #   jar_file: the path to the .jar. If not provided, will default to the sdk's\n  #     android.jar\n  #\n  #   deps, public_deps: As normal\n  #\n  # Example\n  #   generate_jar_jni(\"foo_jni\") {\n  #     classes = [\n  #       \"android/view/Foo.class\",\n  #     ]\n  #     jni_package = \"foo\"\n  #   }\n  template(\"generate_jar_jni\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.classes))\n    assert(defined(invoker.jni_package))\n\n    if (defined(invoker.jar_file)) {\n      jar_file = invoker.jar_file\n    } else {\n      jar_file = android_sdk_jar\n    }\n\n    jni_package = invoker.jni_package\n    base_output_dir = \"${root_gen_dir}/${target_name}/${jni_package}\"\n    jni_output_dir = \"${base_output_dir}/jni\"\n\n    jni_generator_include =\n        \"//base/android/jni_generator/jni_generator_helper.h\"\n\n    # TODO(cjhopman): make jni_generator.py support generating jni for multiple\n    # .class files from a .jar.\n    jni_actions = []\n    foreach(class, invoker.classes) {\n      _classname_list = []\n      _classname_list = process_file_template([ class ], \"{{source_name_part}}\")\n      classname = _classname_list[0]\n      jni_target_name = \"${target_name}__jni_${classname}\"\n      jni_actions += [ \":$jni_target_name\" ]\n      action(jni_target_name) {\n        # The sources aren't compiled so don't check their dependencies.\n        check_includes = false\n        depfile = \"$target_gen_dir/$target_name.d\"\n        script = \"//base/android/jni_generator/jni_generator.py\"\n        sources = [\n          jar_file,\n        ]\n        outputs = [\n          \"${jni_output_dir}/${classname}_jni.h\",\n        ]\n\n        args = [\n          \"--depfile\",\n          rebase_path(depfile, root_build_dir),\n          \"--jar_file\",\n          rebase_path(jar_file, root_build_dir),\n          \"--input_file\",\n          class,\n          \"--optimize_generation=1\",\n          \"--ptr_type=long\",\n          \"--output_dir\",\n          rebase_path(jni_output_dir, root_build_dir),\n          \"--includes\",\n          rebase_path(jni_generator_include, jni_output_dir),\n          \"--native_exports_optional\",\n        ]\n\n        if (enable_profiling) {\n          args += [ \"--enable_profiling\" ]\n        }\n      }\n    }\n\n    config(\"jni_includes_${target_name}\") {\n      include_dirs = [ base_output_dir ]\n    }\n\n    group(target_name) {\n      public_deps = []\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"public_deps\",\n                               \"visibility\",\n                             ])\n      public_deps += jni_actions\n      public_configs = [ \":jni_includes_${target_name}\" ]\n    }\n  }\n\n  # Declare a target for c-preprocessor-generated java files\n  #\n  # NOTE: For generating Java conterparts to enums prefer using the java_cpp_enum\n  #       rule instead.\n  #\n  # This target generates java files using the host C pre-processor. Each file in\n  # sources will be compiled using the C pre-processor. If include_path is\n  # specified, it will be passed (with --I) to the pre-processor.\n  #\n  # This target will create a single .srcjar. Adding this target to an\n  # android_library target's srcjar_deps will make the generated java files be\n  # included in that library's final outputs.\n  #\n  # Variables\n  #   sources: list of files to be processed by the C pre-processor. For each\n  #     file in sources, there will be one .java file in the final .srcjar. For a\n  #     file named FooBar.template, a java file will be created with name\n  #     FooBar.java.\n  #   inputs: additional compile-time dependencies. Any files\n  #     `#include`-ed in the templates should be listed here.\n  #   package_name: this will be the subdirectory for each .java file in the\n  #     .srcjar.\n  #\n  # Example\n  #   java_cpp_template(\"foo_generated_enum\") {\n  #     sources = [\n  #       \"android/java/templates/Foo.template\",\n  #     ]\n  #     inputs = [\n  #       \"android/java/templates/native_foo_header.h\",\n  #     ]\n  #\n  #     package_name = \"org/chromium/base/library_loader\"\n  #     include_path = \"android/java/templates\"\n  #   }\n  template(\"java_cpp_template\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    _include_path = \"//\"\n    if (defined(invoker.include_path)) {\n      _include_path = invoker.include_path\n    }\n\n    _apply_gcc_target_name = \"${target_name}__apply_gcc\"\n    _base_gen_dir = \"${target_gen_dir}/${target_name}/java_cpp_template\"\n\n    action_foreach(_apply_gcc_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"public_deps\",\n                               \"data_deps\",\n                             ])\n      script = \"//build/android/gyp/gcc_preprocess.py\"\n      if (defined(invoker.inputs)) {\n        inputs = invoker.inputs + []\n      }\n      depfile =\n          \"${target_gen_dir}/${invoker.target_name}_{{source_name_part}}.d\"\n\n      sources = invoker.sources\n\n      outputs = [\n        \"$_base_gen_dir/${invoker.package_name}/{{source_name_part}}.java\",\n      ]\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--include-path\",\n        rebase_path(_include_path, root_build_dir),\n        \"--output\",\n        rebase_path(outputs[0], root_build_dir),\n        \"--template={{source}}\",\n      ]\n\n      if (defined(invoker.defines)) {\n        foreach(def, invoker.defines) {\n          args += [\n            \"--defines\",\n            def,\n          ]\n        }\n      }\n    }\n\n    # Filter out .d files.\n    set_sources_assignment_filter([ \"*.d\" ])\n    sources = get_target_outputs(\":$_apply_gcc_target_name\")\n\n    zip(target_name) {\n      forward_variables_from(invoker, [ \"visibility\" ])\n      inputs = sources\n      output = \"${target_gen_dir}/${target_name}.srcjar\"\n      base_dir = _base_gen_dir\n      deps = [\n        \":$_apply_gcc_target_name\",\n      ]\n    }\n  }\n\n  # Declare a target for generating Java classes from C++ enums.\n  #\n  # This target generates Java files from C++ enums using a script.\n  #\n  # This target will create a single .srcjar. Adding this target to an\n  # android_library target's srcjar_deps will make the generated java files be\n  # included in that library's final outputs.\n  #\n  # Variables\n  #   sources: list of files to be processed by the script. For each annotated\n  #     enum contained in the sources files the script will generate a .java\n  #     file with the same name as the name of the enum.\n  #\n  # Example\n  #   java_cpp_enum(\"foo_generated_enum\") {\n  #     sources = [\n  #       \"src/native_foo_header.h\",\n  #     ]\n  #   }\n  template(\"java_cpp_enum\") {\n    action(target_name) {\n      # The sources aren't compiled so don't check their dependencies.\n      check_includes = false\n      set_sources_assignment_filter([])\n\n      assert(defined(invoker.sources))\n      forward_variables_from(invoker,\n                             [\n                               \"sources\",\n                               \"testonly\",\n                               \"visibility\",\n                             ])\n\n      script = \"//build/android/gyp/java_cpp_enum.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n\n      _srcjar_path = \"${target_gen_dir}/${target_name}.srcjar\"\n      _rebased_srcjar_path = rebase_path(_srcjar_path, root_build_dir)\n      _rebased_sources = rebase_path(invoker.sources, root_build_dir)\n\n      args = [\n               \"--depfile\",\n               rebase_path(depfile, root_build_dir),\n               \"--srcjar=$_rebased_srcjar_path\",\n             ] + _rebased_sources\n      outputs = [\n        _srcjar_path,\n      ]\n    }\n  }\n\n  # Declare a target for processing a Jinja template.\n  #\n  # Variables\n  #   input: The template file to be processed.\n  #   output: Where to save the result.\n  #   variables: (Optional) A list of variables to make available to the template\n  #     processing environment, e.g. [\"name=foo\", \"color=red\"].\n  #\n  # Example\n  #   jinja_template(\"chrome_public_manifest\") {\n  #     input = \"java/AndroidManifest.xml\"\n  #     output = \"$target_gen_dir/AndroidManifest.xml\"\n  #   }\n  template(\"jinja_template\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.input))\n    assert(defined(invoker.output))\n\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"visibility\",\n                               \"deps\",\n                             ])\n\n      sources = [\n        invoker.input,\n      ]\n      script = \"//build/android/gyp/jinja_template.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n\n      outputs = [\n        invoker.output,\n      ]\n\n      args = [\n        \"--loader-base-dir\",\n        rebase_path(\"//\", root_build_dir),\n        \"--inputs\",\n        rebase_path(invoker.input, root_build_dir),\n        \"--output\",\n        rebase_path(invoker.output, root_build_dir),\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n      ]\n      if (defined(invoker.variables)) {\n        variables = invoker.variables\n        args += [ \"--variables=${variables}\" ]\n      }\n    }\n  }\n\n  # Declare a target for processing Android resources as Jinja templates.\n  #\n  # This takes an Android resource directory where each resource is a Jinja\n  # template, processes each template, then packages the results in a zip file\n  # which can be consumed by an android resources, library, or apk target.\n  #\n  # If this target is included in the deps of an android resources/library/apk,\n  # the resources will be included with that target.\n  #\n  # Variables\n  #   resources: The list of resources files to process.\n  #   res_dir: The resource directory containing the resources.\n  #   variables: (Optional) A list of variables to make available to the template\n  #     processing environment, e.g. [\"name=foo\", \"color=red\"].\n  #\n  # Example\n  #   jinja_template_resources(\"chrome_public_template_resources\") {\n  #     res_dir = \"res_template\"\n  #     resources = [\"res_template/xml/syncable.xml\"]\n  #     variables = [\"color=red\"]\n  #   }\n  template(\"jinja_template_resources\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.resources))\n    assert(defined(invoker.res_dir))\n\n    _base_path = \"$target_gen_dir/$target_name\"\n    _resources_zip = _base_path + \".resources.zip\"\n    _build_config = _base_path + \".build_config\"\n\n    write_build_config(\"${target_name}__build_config\") {\n      build_config = _build_config\n      resources_zip = _resources_zip\n      type = \"android_resources\"\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n    }\n\n    action(\"${target_name}__template\") {\n      forward_variables_from(invoker, [ \"deps\" ])\n      sources = invoker.resources\n      script = \"//build/android/gyp/jinja_template.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n\n      outputs = [\n        _resources_zip,\n      ]\n\n      rebased_resources = rebase_path(invoker.resources, root_build_dir)\n      args = [\n        \"--inputs=${rebased_resources}\",\n        \"--inputs-base-dir\",\n        rebase_path(invoker.res_dir, root_build_dir),\n        \"--outputs-zip\",\n        rebase_path(_resources_zip, root_build_dir),\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n      ]\n      if (defined(invoker.variables)) {\n        variables = invoker.variables\n        args += [ \"--variables=${variables}\" ]\n      }\n    }\n\n    group(target_name) {\n      public_deps = [\n        \":${target_name}__build_config\",\n        \":${target_name}__template\",\n      ]\n    }\n  }\n\n  # Declare an Android resources target\n  #\n  # This creates a resources zip file that will be used when building an Android\n  # library or apk and included into a final apk.\n  #\n  # To include these resources in a library/apk, this target should be listed in\n  # the library's deps. A library/apk will also include any resources used by its\n  # own dependencies.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Any Android resources\n  #     listed in deps will be included by libraries/apks that depend on this\n  #     target.\n  #   resource_dirs: List of directories containing resources for this target.\n  #   generated_resource_dirs: List of directories containing resources for this\n  #     target which are *generated* by a dependency. |generated_resource_files|\n  #     must be specified if |generated_resource_dirs| is specified.\n  #   generated_resource_files: List of all files in |generated_resource_dirs|.\n  #     |generated_resource_dirs| must be specified in |generated_resource_files|\n  #     is specified.\n  #   android_manifest: AndroidManifest.xml for this target. Defaults to\n  #     //build/android/AndroidManifest.xml.\n  #   android_manifest_dep: Target that generates AndroidManifest (if applicable)\n  #   custom_package: java package for generated .java files.\n  #   v14_skip: If true, don't run v14 resource generator on this. Defaults to\n  #     false. (see build/android/gyp/generate_v14_compatible_resources.py)\n  #   shared_resources: If true make a resource package that can be loaded by a\n  #     different application at runtime to access the package's resources.\n  #   app_as_shared_lib: If true make a resource package that can be loaded as\n  #     both shared_resources and normal application.\n\n  # Example:\n  #   android_resources(\"foo_resources\") {\n  #     deps = [\":foo_strings_grd\"]\n  #     resource_dirs = [\"res\"]\n  #     custom_package = \"org.chromium.foo\"\n  #   }\n  #\n  #   android_resources(\"foo_resources_overrides\") {\n  #     deps = [\":foo_resources\"]\n  #     resource_dirs = [\"res_overrides\"]\n  #   }\n  template(\"android_resources\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.resource_dirs))\n\n    base_path = \"$target_gen_dir/$target_name\"\n    zip_path = base_path + \".resources.zip\"\n    srcjar_path = base_path + \".srcjar\"\n    r_text_path = base_path + \"_R.txt\"\n    build_config = base_path + \".build_config\"\n\n    build_config_target_name = \"${target_name}__build_config\"\n    process_resources_target_name = \"${target_name}__process_resources\"\n    final_target_name = target_name\n\n    write_build_config(build_config_target_name) {\n      type = \"android_resources\"\n      forward_variables_from(invoker,\n                             [\n                               \"android_manifest\",\n                               \"custom_package\",\n                             ])\n      resource_dirs = []\n      if (defined(invoker.resource_dirs)) {\n        resource_dirs += invoker.resource_dirs\n      }\n      if (defined(invoker.generated_resource_dirs)) {\n        resource_dirs += invoker.generated_resource_dirs\n      }\n\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n      if (defined(invoker.android_manifest_dep)) {\n        deps = [\n          invoker.android_manifest_dep,\n        ]\n      }\n\n      # No package means resources override their deps.\n      if (defined(custom_package) || defined(android_manifest)) {\n        r_text = r_text_path\n      } else {\n        assert(defined(invoker.deps),\n               \"Must specify deps when custom_package is omitted.\")\n      }\n\n      resources_zip = zip_path\n      srcjar = srcjar_path\n    }\n\n    process_resources(process_resources_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"app_as_shared_lib\",\n                               \"android_manifest\",\n                               \"custom_package\",\n                               \"deps\",\n                               \"generated_resource_dirs\",\n                               \"generated_resource_files\",\n                               \"resource_dirs\",\n                               \"shared_resources\",\n                               \"v14_skip\",\n                             ])\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += [ \":$build_config_target_name\" ]\n      if (defined(invoker.android_manifest_dep)) {\n        deps += [ invoker.android_manifest_dep ]\n      }\n\n      # Always generate R.onResourcesLoaded() method, it is required for\n      # compiling ResourceRewriter, there is no side effect because the\n      # generated R.class isn't used in final apk.\n      shared_resources = true\n      if (!defined(android_manifest)) {\n        android_manifest = \"//build/android/AndroidManifest.xml\"\n      }\n    }\n\n    group(final_target_name) {\n      forward_variables_from(invoker, [ \"visibility\" ])\n      public_deps = [\n        \":${target_name}__process_resources\",\n      ]\n    }\n  }\n\n  # Declare an Android assets target.\n  #\n  # Defines a set of files to include as assets in a dependent apk.\n  #\n  # To include these assets in an apk, this target should be listed in\n  # the apk's deps, or in the deps of a library target used by an apk.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Any Android assets\n  #     listed in deps will be included by libraries/apks that depend on this\n  #     target.\n  #   sources: List of files to include as assets.\n  #   renaming_sources: List of files to include as assets and be renamed.\n  #   renaming_destinations: List of asset paths for files in renaming_sources.\n  #   disable_compression: Whether to disable compression for files that are\n  #     known to be compressable (default: false).\n  #\n  # Example:\n  # android_assets(\"content_shell_assets\") {\n  #   deps = [\n  #     \":generates_foo\",\n  #     \":other_assets\",\n  #     ]\n  #   sources = [\n  #     \"//path/asset1.png\",\n  #     \"//path/asset2.png\",\n  #     \"$target_gen_dir/foo.dat\",\n  #   ]\n  # }\n  #\n  # android_assets(\"overriding_content_shell_assets\") {\n  #   deps = [ \":content_shell_assets\" ]\n  #   # Override foo.dat from content_shell_assets.\n  #   sources = [ \"//custom/foo.dat\" ]\n  #   renaming_sources = [ \"//path/asset2.png\" ]\n  #   renaming_destinations = [ \"renamed/asset2.png\" ]\n  # }\n  template(\"android_assets\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    _build_config = \"$target_gen_dir/$target_name.build_config\"\n    _build_config_target_name = \"${target_name}__build_config\"\n\n    write_build_config(_build_config_target_name) {\n      type = \"android_assets\"\n      build_config = _build_config\n\n      forward_variables_from(invoker, [ \"disable_compression\" ])\n\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n\n      if (defined(invoker.sources)) {\n        asset_sources = invoker.sources\n      }\n      if (defined(invoker.renaming_sources)) {\n        assert(defined(invoker.renaming_destinations))\n        _source_count = 0\n        foreach(_, invoker.renaming_sources) {\n          _source_count += 1\n        }\n        _dest_count = 0\n        foreach(_, invoker.renaming_destinations) {\n          _dest_count += 1\n        }\n        assert(\n            _source_count == _dest_count,\n            \"android_assets() renaming_sources.length != renaming_destinations.length\")\n        asset_renaming_sources = invoker.renaming_sources\n        asset_renaming_destinations = invoker.renaming_destinations\n      }\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"visibility\",\n                             ])\n      public_deps = [\n        \":$_build_config_target_name\",\n      ]\n    }\n  }\n\n  # Declare a group() that supports forwarding java dependency information.\n  #\n  # Example\n  #  java_group(\"conditional_deps\") {\n  #    if (enable_foo) {\n  #      deps = [\":foo_java\"]\n  #    }\n  #  }\n  template(\"java_group\") {\n    forward_variables_from(invoker, [ \"testonly\" ])\n    write_build_config(\"${target_name}__build_config\") {\n      type = \"group\"\n      build_config = \"$target_gen_dir/${invoker.target_name}.build_config\"\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n    }\n    group(target_name) {\n      forward_variables_from(invoker, \"*\")\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += [ \":${target_name}__build_config\" ]\n    }\n  }\n\n  # Declare a target that generates localized strings.xml from a .grd file.\n  #\n  # If this target is included in the deps of an android resources/library/apk,\n  # the strings.xml will be included with that target.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target.\n  #   grd_file: Path to the .grd file to generate strings.xml from.\n  #   outputs: Expected grit outputs (see grit rule).\n  #\n  # Example\n  #  java_strings_grd(\"foo_strings_grd\") {\n  #    grd_file = \"foo_strings.grd\"\n  #  }\n  template(\"java_strings_grd\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    base_path = \"$target_gen_dir/$target_name\"\n    resources_zip = base_path + \".resources.zip\"\n    build_config = base_path + \".build_config\"\n\n    write_build_config(\"${target_name}__build_config\") {\n      type = \"android_resources\"\n    }\n\n    # Put grit files into this subdirectory of target_gen_dir.\n    extra_output_path = target_name + \"_grit_output\"\n\n    grit_target_name = \"${target_name}__grit\"\n    grit_output_dir = \"$target_gen_dir/$extra_output_path\"\n    grit(grit_target_name) {\n      forward_variables_from(invoker, [ \"deps\" ])\n      grit_flags = [\n        \"-E\",\n        \"ANDROID_JAVA_TAGGED_ONLY=false\",\n      ]\n      output_dir = grit_output_dir\n      resource_ids = \"\"\n      source = invoker.grd_file\n      outputs = invoker.outputs\n    }\n\n    # This needs to get outputs from grit's internal target, not the final\n    # source_set.\n    generate_strings_outputs = get_target_outputs(\":${grit_target_name}_grit\")\n\n    zip(\"${target_name}__zip\") {\n      base_dir = grit_output_dir\n      inputs = generate_strings_outputs\n      output = resources_zip\n      deps = [\n        \":$grit_target_name\",\n      ]\n    }\n\n    group(target_name) {\n      public_deps = [\n        \":${target_name}__build_config\",\n        \":${target_name}__zip\",\n      ]\n    }\n  }\n\n  # Declare a target that packages strings.xml generated from a grd file.\n  #\n  # If this target is included in the deps of an android resources/library/apk,\n  # the strings.xml will be included with that target.\n  #\n  # Variables\n  #  grit_output_dir: directory containing grit-generated files.\n  #  generated_files: list of android resource files to package.\n  #\n  # Example\n  #  java_strings_grd_prebuilt(\"foo_strings_grd\") {\n  #    grit_output_dir = \"$root_gen_dir/foo/grit\"\n  #    generated_files = [\n  #      \"values/strings.xml\"\n  #    ]\n  #  }\n  template(\"java_strings_grd_prebuilt\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    base_path = \"$target_gen_dir/$target_name\"\n    resources_zip = base_path + \".resources.zip\"\n    build_config = base_path + \".build_config\"\n\n    build_config_target_name = \"${target_name}__build_config\"\n    zip_target_name = \"${target_name}__zip\"\n    final_target_name = target_name\n\n    write_build_config(build_config_target_name) {\n      type = \"android_resources\"\n    }\n\n    zip(zip_target_name) {\n      visibility = [ \":$final_target_name\" ]\n\n      base_dir = invoker.grit_output_dir\n      inputs = rebase_path(invoker.generated_files, \".\", base_dir)\n      output = resources_zip\n      deps = [\n        \":$build_config_target_name\",\n      ]\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n    }\n\n    group(final_target_name) {\n      forward_variables_from(invoker, [ \"visibility\" ])\n      public_deps = [\n        \":$zip_target_name\",\n      ]\n    }\n  }\n\n  # Declare a Java executable target\n  #\n  # This target creates an executable from java code and libraries. The executable\n  # will be in the output folder's /bin/ directory.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be included in the executable (and the javac classpath).\n  #   java_files: List of .java files included in this library.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #     will be added to java_files and be included in this library.\n  #   srcjars: List of srcjars to be included in this library, together with the\n  #     ones obtained from srcjar_deps.\n  #   bypass_platform_checks: Disables checks about cross-platform (Java/Android)\n  #     dependencies for this target. This will allow depending on an\n  #     android_library target, for example.\n  #   chromium_code: If true, extra analysis warning/errors will be enabled.\n  #   enable_errorprone: If true, enables the errorprone compiler.\n  #   enable_incremental_javac_override: Overrides the\n  #     global enable_incremental_javac.\n  #   main_class: When specified, a wrapper script is created within\n  #     $root_build_dir/bin to launch the binary with the given class as the\n  #     entrypoint.\n  #   wrapper_script_args: List of additional arguments for the wrapper script.\n  #\n  #   data_deps, testonly\n  #\n  # Example\n  #   java_binary(\"foo\") {\n  #     java_files = [ \"org/chromium/foo/FooMain.java\" ]\n  #     deps = [ \":bar_java\" ]\n  #     main_class = \"org.chromium.foo.FooMain\"\n  #   }\n  template(\"java_binary\") {\n    set_sources_assignment_filter([])\n\n    java_library_impl(target_name) {\n      forward_variables_from(invoker, \"*\")\n      supports_android = false\n      main_class = invoker.main_class\n      is_java_binary = true\n    }\n  }\n\n  # Declare a Junit executable target\n  #\n  # This target creates an executable from java code for running as a junit test\n  # suite. The executable will be in the output folder's /bin/ directory.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be included in the executable (and the javac classpath).\n  #\n  #   java_files: List of .java files included in this library.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #     will be added to java_files and be included in this library.\n  #   srcjars: List of srcjars to be included in this library, together with the\n  #     ones obtained from srcjar_deps.\n  #\n  #   chromium_code: If true, extra analysis warning/errors will be enabled.\n  #\n  # Example\n  #   junit_binary(\"foo\") {\n  #     java_files = [ \"org/chromium/foo/FooTest.java\" ]\n  #     deps = [ \":bar_java\" ]\n  #   }\n  template(\"junit_binary\") {\n    set_sources_assignment_filter([])\n    testonly = true\n\n    _java_binary_target_name = \"${target_name}__java_binary\"\n    _test_runner_target_name = \"${target_name}__test_runner_script\"\n\n    test_runner_script(_test_runner_target_name) {\n      test_name = invoker.target_name\n      test_suite = invoker.target_name\n      test_type = \"junit\"\n      ignore_all_data_deps = true\n    }\n\n    java_binary(_java_binary_target_name) {\n      deps = []\n      output_name = invoker.target_name\n      forward_variables_from(invoker, \"*\")\n      testonly = true\n      bypass_platform_checks = true\n      main_class = \"org.chromium.testing.local.JunitTestMain\"\n      wrapper_script_name = \"helper/$target_name\"\n      deps += [\n        \"//testing/android/junit:junit_test_support\",\n        \"//third_party/junit\",\n        \"//third_party/mockito:mockito_java\",\n        \"//third_party/robolectric:robolectric_all_java\",\n      ]\n    }\n    group(target_name) {\n      public_deps = [\n        \":$_java_binary_target_name\",\n        \":$_test_runner_target_name\",\n      ]\n    }\n  }\n\n  # Declare a java library target\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be added to the javac classpath.\n  #\n  #   java_files: List of .java files included in this library.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #     will be added to java_files and be included in this library.\n  #   srcjars: List of srcjars to be included in this library, together with the\n  #     ones obtained from srcjar_deps.\n  #\n  #   input_jars_paths: A list of paths to the jars that should be included\n  #     in the classpath. These are in addition to library .jars that\n  #     appear in deps.\n  #\n  #   chromium_code: If true, extra analysis warning/errors will be enabled.\n  #   enable_errorprone: If true, enables the errorprone compiler.\n  #   enable_incremental_javac_override: Overrides the global\n  #     enable_incremental_javac.\n  #\n  #   jar_excluded_patterns: List of patterns of .class files to exclude from the\n  #     final jar.\n  #\n  #   output_name: File name for the output .jar (not including extension).\n  #     Defaults to the input .jar file name.\n  #\n  #   proguard_preprocess: If true, proguard preprocessing will be run. This can\n  #     be used to remove unwanted parts of the library.\n  #   proguard_preprocess_config: Path to the proguard config for preprocessing.\n  #   proguard_configs: List of proguard configs to use in final apk step for\n  #     any apk that depends on this library.\n  #\n  #   supports_android: If true, Android targets (android_library, android_apk)\n  #     may depend on this target. Note: if true, this target must only use the\n  #     subset of Java available on Android.\n  #   bypass_platform_checks: Disables checks about cross-platform (Java/Android)\n  #     dependencies for this target. This will allow depending on an\n  #     android_library target, for example.\n  #\n  #   additional_jar_files: Use to package additional files into the output jar.\n  #     Pass a list of length-2 lists with format\n  #     [ [ path_to_file, path_to_put_in_jar ] ]\n  #\n  #\n  #   data_deps, testonly\n  #\n  # Example\n  #   java_library(\"foo_java\") {\n  #     java_files = [\n  #       \"org/chromium/foo/Foo.java\",\n  #       \"org/chromium/foo/FooInterface.java\",\n  #       \"org/chromium/foo/FooService.java\",\n  #     ]\n  #     deps = [\n  #       \":bar_java\"\n  #     ]\n  #     srcjar_deps = [\n  #       \":foo_generated_enum\"\n  #     ]\n  #     jar_excluded_patterns = [\n  #       \"*/FooService.class\", \"*/FooService\\$*.class\"\n  #     ]\n  #   }\n  template(\"java_library\") {\n    set_sources_assignment_filter([])\n    java_library_impl(target_name) {\n      forward_variables_from(invoker, \"*\")\n    }\n  }\n\n  # Declare a java library target for a prebuilt jar\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be added to the javac classpath.\n  #   jar_path: Path to the prebuilt jar.\n  #   jar_dep: Target that builds jar_path (optional).\n  #   main_class: When specified, a wrapper script is created within\n  #     $root_build_dir/bin to launch the binary with the given class as the\n  #     entrypoint.\n  #   output_name: File name for the output .jar (not including extension).\n  #     Defaults to the input .jar file name.\n  #   proguard_preprocess: If true, proguard preprocessing will be run. This can\n  #     be used to remove unwanted parts of the library.\n  #   proguard_preprocess_config: Path to the proguard config for preprocessing.\n  #   proguard_configs: List of proguard configs to use in final apk step for\n  #     any apk that depends on this library.\n  #   supports_android: If true, Android targets (android_library, android_apk)\n  #     may depend on this target. Note: if true, this target must only use the\n  #     subset of Java available on Android.\n  #\n  # Example\n  #   java_prebuilt(\"foo_java\") {\n  #     jar_path = \"foo.jar\"\n  #     deps = [\n  #       \":foo_resources\",\n  #       \":bar_java\"\n  #     ]\n  #   }\n  template(\"java_prebuilt\") {\n    set_sources_assignment_filter([])\n    java_prebuilt_impl(target_name) {\n      forward_variables_from(invoker, \"*\")\n    }\n  }\n\n  # Declare an Android library target\n  #\n  # This target creates an Android library containing java code and Android\n  # resources.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be added to the javac classpath. Android resources in dependencies\n  #     will be used when building this library.\n  #\n  #   java_files: List of .java files included in this library.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #     will be added to java_files and be included in this library.\n  #   srcjars: List of srcjars to be included in this library, together with the\n  #     ones obtained from srcjar_deps.\n  #\n  #   input_jars_paths: A list of paths to the jars that should be included\n  #     in the classpath. These are in addition to library .jars that\n  #     appear in deps.\n  #\n  #   chromium_code: If true, extra analysis warning/errors will be enabled.\n  #   enable_errorprone: If true, enables the errorprone compiler.\n  #   enable_incremental_javac_override: Overrides the global\n  #     enable_incremental_javac.\n  #\n  #   jar_excluded_patterns: List of patterns of .class files to exclude from the\n  #     final jar.\n  #\n  #   proguard_preprocess: If true, proguard preprocessing will be run. This can\n  #     be used to remove unwanted parts of the library.\n  #   proguard_preprocess_config: Path to the proguard config for preprocessing.\n  #   proguard_configs: List of proguard configs to use in final apk step for\n  #     any apk that depends on this library.\n  #\n  #   output_name: File name for the output .jar (not including extension).\n  #     Defaults to the input .jar file name.\n  #   dex_path: If set, the resulting .dex.jar file will be placed under this\n  #     path.\n  #\n  #   alternative_android_sdk_ijar: if set, the given android_sdk_ijar file\n  #     replaces the default android_sdk_ijar.\n  #\n  #   alternative_android_sdk_ijar_dep: the target that generates\n  #      alternative_android_sdk_ijar, must be set if alternative_android_sdk_ijar\n  #      is used.\n  #\n  #   emma_never_instrument: Disables EMMA Java code coverage for this target.\n  #\n  # Example\n  #   android_library(\"foo_java\") {\n  #     java_files = [\n  #       \"android/org/chromium/foo/Foo.java\",\n  #       \"android/org/chromium/foo/FooInterface.java\",\n  #       \"android/org/chromium/foo/FooService.java\",\n  #     ]\n  #     deps = [\n  #       \":bar_java\"\n  #     ]\n  #     srcjar_deps = [\n  #       \":foo_generated_enum\"\n  #     ]\n  #     jar_excluded_patterns = [\n  #       \"*/FooService.class\", \"*/FooService\\$*.class\"\n  #     ]\n  #   }\n  template(\"android_library\") {\n    set_sources_assignment_filter([])\n    assert(!defined(invoker.jar_path),\n           \"android_library does not support a custom jar path\")\n\n    if (defined(invoker.alternative_android_sdk_ijar)) {\n      assert(defined(invoker.alternative_android_sdk_ijar_dep))\n    }\n\n    java_library_impl(target_name) {\n      forward_variables_from(invoker, \"*\")\n\n      supports_android = true\n      requires_android = true\n\n      if (!defined(jar_excluded_patterns)) {\n        jar_excluded_patterns = []\n      }\n      jar_excluded_patterns += [\n        \"*/R.class\",\n        \"*/R\\$*.class\",\n        \"*/Manifest.class\",\n        \"*/Manifest\\$*.class\",\n      ]\n    }\n  }\n\n  # Declare a target that packages a set of Java dependencies into a standalone\n  # .dex.jar.\n  #\n  # Variables\n  #   deps: specifies the dependencies of this target. Android libraries in deps\n  #     will be packaged into the resulting .dex.jar file.\n  #   dex_path: location at which the output file will be put\n  template(\"android_standalone_library\") {\n    set_sources_assignment_filter([])\n    deps_dex(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"dex_path\",\n                               \"excluded_jars\",\n                             ])\n    }\n  }\n\n  # Declare an Android library target for a prebuilt jar\n  #\n  # This target creates an Android library containing java code and Android\n  # resources.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be added to the javac classpath. Android resources in dependencies\n  #     will be used when building this library.\n  #   jar_path: Path to the prebuilt jar.\n  #   output_name: File name for the output .jar (not including extension).\n  #     Defaults to the input .jar file name.\n  #   proguard_preprocess: If true, proguard preprocessing will be run. This can\n  #     be used to remove unwanted parts of the library.\n  #   proguard_preprocess_config: Path to the proguard config for preprocessing.\n  #   proguard_configs: List of proguard configs to use in final apk step for\n  #     any apk that depends on this library.\n  #\n  # Example\n  #   android_java_prebuilt(\"foo_java\") {\n  #     jar_path = \"foo.jar\"\n  #     deps = [\n  #       \":foo_resources\",\n  #       \":bar_java\"\n  #     ]\n  #   }\n  template(\"android_java_prebuilt\") {\n    set_sources_assignment_filter([])\n    java_prebuilt_impl(target_name) {\n      forward_variables_from(invoker, \"*\")\n      supports_android = true\n      requires_android = true\n      strip_resource_classes = true\n    }\n  }\n\n  # Declare an Android apk target\n  #\n  # This target creates an Android APK containing java code, resources, assets,\n  # and (possibly) native libraries.\n  #\n  # Variables\n  #   alternative_android_sdk_jar: The alternative android sdk jar used in\n  #     proguard.\n  #   android_aapt_path: Android aapt tool to replace default one to build\n  #     resource.\n  #   android_manifest: Path to AndroidManifest.xml.\n  #   android_manifest_dep: Target that generates AndroidManifest (if applicable)\n  #   chromium_code: If true, extra analysis warning/errors will be enabled.\n  #   dist_ijar_path: Path to create \"${target_name}_dist_ijar\" target\n  #     (used by instrumentation_test_apk).\n  #   data_deps: List of dependencies needed at runtime. These will be built but\n  #     won't change the generated .apk in any way (in fact they may be built\n  #     after the .apk is).\n  #   deps: List of dependencies. All Android java resources and libraries in the\n  #     \"transitive closure\" of these dependencies will be included in the apk.\n  #     Note: this \"transitive closure\" actually only includes such targets if\n  #     they are depended on through android_library or android_resources targets\n  #     (and so not through builtin targets like 'action', 'group', etc).\n  #   install_script_name: Name of wrapper script (default=target_name).\n  #   java_files: List of .java files to include in the apk.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #      will be added to java_files and be included in this apk.\n  #   apk_name: Name for final apk.\n  #   final_apk_path: Path to final built apk. Default is\n  #     $root_out_dir/apks/$apk_name.apk. Setting this will override apk_name.\n  #   loadable_modules: List of paths to native libraries to include. Different\n  #     from |shared_libraries| in that:\n  #       * dependencies of this .so are not automatically included\n  #       * \".cr.so\" is never added\n  #       * they are not side-loaded for _incremental targets.\n  #       * load_library_from_apk, use_chromium_linker,\n  #         and enable_relocation_packing do not apply\n  #     Use this instead of shared_libraries when you are going to load the library\n  #     conditionally, and only when shared_libraries doesn't work for you.\n  #   shared_libraries: List shared_library targets to bundle. If these\n  #     libraries depend on other shared_library targets, those dependencies will\n  #     also be included in the apk (e.g. for is_component_build).\n  #   secondary_abi_shared_libraries: secondary abi shared_library targets to\n  #     bundle. If these libraries depend on other shared_library targets, those\n  #     dependencies will also be included in the apk (e.g. for is_component_build).\n  #   native_lib_placeholders: List of placeholder filenames to add to the apk\n  #     (optional).\n  #   apk_under_test: For an instrumentation test apk, this is the target of the\n  #     tested apk.\n  #   include_all_resources - If true include all resource IDs in all generated\n  #     R.java files.\n  #   testonly: Marks this target as \"test-only\".\n  #   write_asset_list: Adds an extra file to the assets, which contains a list of\n  #     all other asset files.\n  #   requires_sdk_api_level_23: If defined and true, the apk is intended for\n  #     installation only on Android M or later. In these releases the system\n  #     linker does relocation unpacking, so we can enable it unconditionally.\n  #   secondary_native_libs (deprecated): The path of native libraries for secondary\n  #     app abi.\n  #   run_findbugs_override: Forces run_findbugs on or off. If undefined, the\n  #     default will use the build arg run_findbugs.\n  #   proguard_jar_path: The path to proguard.jar you wish to use. If undefined,\n  #     the proguard used will be the checked in one in //third_party/proguard.\n  #\n  # Example\n  #   android_apk(\"foo_apk\") {\n  #     android_manifest = \"AndroidManifest.xml\"\n  #     java_files = [\n  #       \"android/org/chromium/foo/FooApplication.java\",\n  #       \"android/org/chromium/foo/FooActivity.java\",\n  #     ]\n  #     deps = [\n  #       \":foo_support_java\"\n  #       \":foo_resources\"\n  #     ]\n  #     srcjar_deps = [\n  #       \":foo_generated_enum\"\n  #     ]\n  #     shared_libraries = [\n  #       \":my_shared_lib\",\n  #     ]\n  #   }\n  template(\"android_apk\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.final_apk_path) || defined(invoker.apk_name))\n    assert(defined(invoker.android_manifest))\n    gen_dir = \"$target_gen_dir/$target_name\"\n    base_path = \"$gen_dir/$target_name\"\n    _build_config = \"$target_gen_dir/$target_name.build_config\"\n    resources_zip_path = \"$base_path.resources.zip\"\n    _all_resources_zip_path = \"$base_path.resources.all.zip\"\n    _jar_path = \"$base_path.jar\"\n    _lib_dex_path = \"$base_path.dex.jar\"\n    _rebased_lib_dex_path = rebase_path(_lib_dex_path, root_build_dir)\n    _template_name = target_name\n\n    enable_multidex =\n        defined(invoker.enable_multidex) && invoker.enable_multidex\n    if (enable_multidex) {\n      final_dex_path = \"$gen_dir/classes.dex.zip\"\n    } else {\n      final_dex_path = \"$gen_dir/classes.dex\"\n    }\n    final_dex_target_name = \"${_template_name}__final_dex\"\n\n    _final_apk_path = \"\"\n    if (defined(invoker.final_apk_path)) {\n      _final_apk_path = invoker.final_apk_path\n    } else if (defined(invoker.apk_name)) {\n      _final_apk_path = \"$root_build_dir/apks/\" + invoker.apk_name + \".apk\"\n    }\n    _final_apk_path_no_ext_list =\n        process_file_template([ _final_apk_path ],\n                              \"{{source_dir}}/{{source_name_part}}\")\n    _final_apk_path_no_ext = _final_apk_path_no_ext_list[0]\n    assert(_final_apk_path_no_ext != \"\")  # Mark as used.\n\n    _install_script_name = \"install_$_template_name\"\n    if (defined(invoker.install_script_name)) {\n      _install_script_name = invoker.install_script_name\n    }\n    _incremental_install_script_path =\n        \"${root_out_dir}/bin/${_install_script_name}_incremental\"\n\n    _version_code = android_default_version_code\n    if (defined(invoker.version_code)) {\n      _version_code = invoker.version_code\n    }\n\n    _version_name = android_default_version_name\n    if (defined(invoker.version_name)) {\n      _version_name = invoker.version_name\n    }\n    _keystore_path = android_keystore_path\n    _keystore_name = android_keystore_name\n    _keystore_password = android_keystore_password\n\n    if (defined(invoker.keystore_path)) {\n      _keystore_path = invoker.keystore_path\n      _keystore_name = invoker.keystore_name\n      _keystore_password = invoker.keystore_password\n    }\n\n    _srcjar_deps = []\n    if (defined(invoker.srcjar_deps)) {\n      _srcjar_deps += invoker.srcjar_deps\n    }\n\n    _use_chromium_linker =\n        defined(invoker.use_chromium_linker) && invoker.use_chromium_linker\n    _enable_relocation_packing = defined(invoker.enable_relocation_packing) &&\n                                 invoker.enable_relocation_packing\n    _load_library_from_apk =\n        defined(invoker.load_library_from_apk) && invoker.load_library_from_apk\n    _requires_sdk_api_level_23 = defined(invoker.requires_sdk_api_level_23) &&\n                                 invoker.requires_sdk_api_level_23\n\n    assert(_use_chromium_linker || true)  # Mark as used.\n    assert(_requires_sdk_api_level_23 || true)\n    if (_enable_relocation_packing) {\n      assert(_use_chromium_linker || _requires_sdk_api_level_23,\n             \"enable_relocation_packing requires either use_chromium_linker \" +\n                 \"or requires_sdk_api_level_23\")\n    }\n    if (_load_library_from_apk) {\n      assert(_use_chromium_linker || _requires_sdk_api_level_23,\n             \"load_library_from_apk requires use_chromium_linker \" +\n                 \"or requires_sdk_api_level_23\")\n    }\n\n    # The dependency that makes the chromium linker, if any is needed.\n    _native_libs_deps = []\n    _shared_libraries_is_valid =\n        defined(invoker.shared_libraries) && invoker.shared_libraries != []\n    _secondary_abi_native_libs_deps = []\n    assert(_secondary_abi_native_libs_deps == [])  # mark as used.\n    _secondary_abi_shared_libraries_is_valid =\n        defined(invoker.secondary_abi_shared_libraries) &&\n        invoker.secondary_abi_shared_libraries != []\n\n    if (is_component_build || is_asan) {\n      if (_shared_libraries_is_valid) {\n        _native_libs_deps += [ \"//build/android:cpplib_stripped\" ]\n      }\n      if (_secondary_abi_shared_libraries_is_valid) {\n        _secondary_abi_native_libs_deps += [ \"//build/android:cpplib_stripped($android_secondary_abi_toolchain)\" ]\n      }\n    }\n\n    if (_shared_libraries_is_valid) {\n      _native_libs_deps += invoker.shared_libraries\n\n      # To determine the filenames of all dependent shared libraries, write the\n      # runtime deps of |shared_libraries| to a file during \"gn gen\".\n      # write_build_config.py will then grep this file for *.so to obtain the\n      # complete list.\n      _runtime_deps_file =\n          \"$target_gen_dir/${_template_name}.native.runtimedeps\"\n      group(\"${_template_name}__runtime_deps\") {\n        deps = _native_libs_deps\n        write_runtime_deps = _runtime_deps_file\n      }\n\n      _native_lib_version_rule = \"\"\n      if (defined(invoker.native_lib_version_rule)) {\n        _native_lib_version_rule = invoker.native_lib_version_rule\n      }\n      _native_lib_version_arg = \"\\\"\\\"\"\n      if (defined(invoker.native_lib_version_arg)) {\n        _native_lib_version_arg = invoker.native_lib_version_arg\n      }\n    }\n\n    if (_secondary_abi_shared_libraries_is_valid) {\n      _secondary_abi_native_libs_deps += invoker.secondary_abi_shared_libraries\n\n      # To determine the filenames of all dependent shared libraries, write the\n      # runtime deps of |shared_libraries| to a file during \"gn gen\".\n      # write_build_config.py will then grep this file for *.so to obtain the\n      # complete list.\n      _secondary_abi_runtime_deps_file =\n          \"$target_gen_dir/${_template_name}.secondary.abi.native.runtimedeps\"\n      group(\"${_template_name}_secondary_abi__runtime_deps\") {\n        deps = _secondary_abi_native_libs_deps\n        write_runtime_deps = _secondary_abi_runtime_deps_file\n      }\n    }\n\n    if (defined(invoker.deps)) {\n      set_sources_assignment_filter([ \"*manifest*\" ])\n      sources = invoker.deps\n      set_sources_assignment_filter([])\n      if (sources != invoker.deps) {\n        _bad_deps = invoker.deps - sources\n        assert(\n            false,\n            \"Possible manifest-generating dep found in deps. Use android_manifest_dep for this instead. Found: $_bad_deps\")\n      }\n      sources = []\n    }\n    _android_manifest_deps = []\n    if (defined(invoker.android_manifest_dep)) {\n      _android_manifest_deps = [ invoker.android_manifest_dep ]\n    }\n    _android_manifest = invoker.android_manifest\n\n    _rebased_build_config = rebase_path(_build_config, root_build_dir)\n    _create_abi_split =\n        defined(invoker.create_abi_split) && invoker.create_abi_split\n    _create_density_splits =\n        defined(invoker.create_density_splits) && invoker.create_density_splits\n    _create_language_splits =\n        defined(invoker.language_splits) && invoker.language_splits != []\n\n    # Help GN understand that _create_abi_split is not unused (bug in GN).\n    assert(_create_abi_split || true)\n\n    _proguard_enabled =\n        defined(invoker.proguard_enabled) && invoker.proguard_enabled\n    if (_proguard_enabled) {\n      _proguard_output_jar_path = \"$base_path.proguard.jar\"\n    }\n\n    _emma_never_instrument = defined(invoker.testonly) && invoker.testonly\n\n    build_config_target = \"${_template_name}__build_config\"\n    write_build_config(build_config_target) {\n      forward_variables_from(invoker, [ \"apk_under_test\" ])\n      type = \"android_apk\"\n      jar_path = _jar_path\n      dex_path = final_dex_path\n      apk_path = _final_apk_path\n      incremental_apk_path = \"${_final_apk_path_no_ext}_incremental.apk\"\n      incremental_install_script_path = _incremental_install_script_path\n      resources_zip = resources_zip_path\n      build_config = _build_config\n      android_manifest = _android_manifest\n\n      deps = _android_manifest_deps\n\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n\n      # Added emma to the target's classpath via its .build_config.\n      if (emma_coverage && !_emma_never_instrument) {\n        possible_config_deps +=\n            [ \"//third_party/android_tools:emma_device_java\" ]\n      }\n\n      proguard_enabled = _proguard_enabled\n      if (_proguard_enabled) {\n        proguard_info = \"$_proguard_output_jar_path.info\"\n      }\n\n      # Don't depend on the runtime_deps target in order to avoid having to\n      # build the native libraries just to create the .build_config file.\n      # The dep is unnecessary since the runtime_deps file is created by gn gen\n      # and the runtime_deps file is added to write_build_config.py's depfile.\n      if (_native_libs_deps != []) {\n        shared_libraries_runtime_deps_file = _runtime_deps_file\n      }\n      if (_secondary_abi_native_libs_deps != []) {\n        secondary_abi_shared_libraries_runtime_deps_file =\n            _secondary_abi_runtime_deps_file\n      }\n    }\n\n    _final_deps = []\n\n    _generated_proguard_config = \"$base_path.resources.proguard.txt\"\n    process_resources_target = \"${_template_name}__process_resources\"\n    process_resources(process_resources_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"alternative_android_sdk_jar\",\n                               \"android_aapt_path\",\n                               \"app_as_shared_lib\",\n                               \"include_all_resources\",\n                               \"shared_resources\",\n                             ])\n      srcjar_path = \"${target_gen_dir}/${target_name}.srcjar\"\n      r_text_path = \"${target_gen_dir}/${target_name}_R.txt\"\n      android_manifest = _android_manifest\n      resource_dirs = [ \"//build/android/ant/empty/res\" ]\n      zip_path = resources_zip_path\n      all_resources_zip_path = _all_resources_zip_path\n      generate_constant_ids = true\n      proguard_file = _generated_proguard_config\n\n      build_config = _build_config\n      deps = _android_manifest_deps + [ \":$build_config_target\" ]\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n    }\n    _srcjar_deps += [ \":$process_resources_target\" ]\n\n    if (_native_libs_deps != []) {\n      _enable_chromium_linker_tests = false\n      if (defined(invoker.enable_chromium_linker_tests)) {\n        _enable_chromium_linker_tests = invoker.enable_chromium_linker_tests\n      }\n      _ordered_libraries_json =\n          \"$target_gen_dir/$target_name.ordered_libararies.json\"\n      _rebased_ordered_libraries_json =\n          rebase_path(_ordered_libraries_json, root_build_dir)\n      _ordered_libraries_target = \"${_template_name}__write_ordered_libraries\"\n\n      # TODO(agrieve): Make GN write runtime deps in dependency order so as to\n      # not need this manual sorting step.\n      action(_ordered_libraries_target) {\n        script = \"//build/android/gyp/write_ordered_libraries.py\"\n        deps = _native_libs_deps + [ \":$build_config_target\" ]\n        outputs = [\n          _ordered_libraries_json,\n        ]\n        _rebased_android_readelf = rebase_path(android_readelf, root_build_dir)\n        args = [\n          \"--readelf=$_rebased_android_readelf\",\n          \"--output=$_rebased_ordered_libraries_json\",\n          \"--libraries-dir=.\",\n          \"--input-libraries=@FileArg($_rebased_build_config:native:libraries)\",\n        ]\n      }\n\n      java_cpp_template(\"${_template_name}__native_libraries_java\") {\n        package_name = \"org/chromium/base/library_loader\"\n        sources = [\n          \"//base/android/java/templates/NativeLibraries.template\",\n        ]\n        inputs = [\n          _ordered_libraries_json,\n        ]\n        deps = [\n          \":${_ordered_libraries_target}\",\n        ]\n        if (_native_lib_version_rule != \"\") {\n          deps += [ _native_lib_version_rule ]\n        }\n\n        defines = [\n          \"NATIVE_LIBRARIES_LIST=\" +\n              \"@FileArg($_rebased_ordered_libraries_json:java_libraries_list)\",\n          \"NATIVE_LIBRARIES_VERSION_NUMBER=$_native_lib_version_arg\",\n        ]\n        if (_use_chromium_linker) {\n          defines += [ \"ENABLE_CHROMIUM_LINKER\" ]\n        }\n        if (_load_library_from_apk) {\n          defines += [ \"ENABLE_CHROMIUM_LINKER_LIBRARY_IN_ZIP_FILE\" ]\n        }\n        if (_enable_chromium_linker_tests) {\n          defines += [ \"ENABLE_CHROMIUM_LINKER_TESTS\" ]\n        }\n      }\n      _srcjar_deps += [ \":${_template_name}__native_libraries_java\" ]\n    }\n\n    if (!defined(invoker.apk_under_test)) {\n      java_cpp_template(\"${_template_name}__build_config_java\") {\n        package_name = \"org/chromium/base\"\n        sources = [\n          \"//base/android/java/templates/BuildConfig.template\",\n        ]\n        deps = [\n          \":$build_config_target\",\n        ]\n\n        defines = []\n        if (enable_multidex) {\n          defines += [ \"ENABLE_MULTIDEX\" ]\n        }\n        if (is_java_debug || dcheck_always_on) {\n          defines += [ \"_DCHECK_IS_ON\" ]\n        }\n        defines += [\n          \"COMPRESSED_LOCALE_LIST=\" +\n              \"@FileArg($_rebased_build_config:compressed_locales_java_list)\",\n          \"UNCOMPRESSED_LOCALE_LIST=\" +\n              \"@FileArg($_rebased_build_config:uncompressed_locales_java_list)\",\n        ]\n      }\n      _srcjar_deps += [ \":${_template_name}__build_config_java\" ]\n    }\n\n    java_target = \"${_template_name}__java\"\n    java_library_impl(java_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"chromium_code\",\n                               \"java_files\",\n                               \"run_findbugs_override\",\n                             ])\n      supports_android = true\n      requires_android = true\n      override_build_config = _build_config\n      deps = _android_manifest_deps + [ \":$build_config_target\" ]\n\n      android_manifest = _android_manifest\n      srcjar_deps = _srcjar_deps\n      jar_path = _jar_path\n      dex_path = _lib_dex_path\n      emma_never_instrument = _emma_never_instrument\n\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n      if (defined(invoker.apk_under_test)) {\n        deps += [ \"${invoker.apk_under_test}__java\" ]\n      }\n      if (emma_coverage && !_emma_never_instrument) {\n        deps += [ \"//third_party/android_tools:emma_device_java\" ]\n      }\n    }\n\n    # TODO(cjhopman): This is only ever needed to calculate the list of tests to\n    # run. See build/android/pylib/instrumentation/test_jar.py. We should be\n    # able to just do that calculation at build time instead.\n    if (defined(invoker.dist_ijar_path)) {\n      _dist_ijar_path = invoker.dist_ijar_path\n      action(\"${_template_name}_dist_ijar\") {\n        script = \"//build/android/gyp/create_dist_jar.py\"\n        depfile = \"$target_gen_dir/$target_name.d\"\n        inputs = [\n          _build_config,\n        ]\n        outputs = [\n          \"${_dist_ijar_path}\",\n        ]\n        data = [\n          _dist_ijar_path,\n        ]\n        args = [\n          \"--depfile\",\n          rebase_path(depfile, root_build_dir),\n          \"--output\",\n          rebase_path(\"${_dist_ijar_path}\", root_build_dir),\n          \"--inputs=@FileArg($_rebased_build_config:dist_jar:all_interface_jars)\",\n        ]\n        deps = [\n          \":$build_config_target\",  # Generates the build config file.\n          \":$java_target\",  # Generates the jar file.\n        ]\n      }\n    }\n\n    if (_proguard_enabled) {\n      _proguard_configs = [ _generated_proguard_config ]\n      if (defined(invoker.proguard_configs)) {\n        _proguard_configs += invoker.proguard_configs\n      }\n      assert(_proguard_configs != [])  # Mark as used.\n      _proguard_target = \"${_template_name}__proguard\"\n      proguard(_proguard_target) {\n        forward_variables_from(invoker,\n                               [\n                                 \"alternative_android_sdk_jar\",\n                                 \"deps\",\n                                 \"proguard_jar_path\",\n                               ])\n        if (!defined(deps)) {\n          deps = []\n        }\n        deps += [\n          \":$build_config_target\",\n          \":$java_target\",\n          \":$process_resources_target\",\n        ]\n        inputs = [\n                   _build_config,\n                   _jar_path,\n                 ] + _proguard_configs\n\n        output_jar_path = _proguard_output_jar_path\n        _rebased_proguard_configs =\n            rebase_path(_proguard_configs, root_build_dir)\n        args = [\n          \"--proguard-configs=$_rebased_proguard_configs\",\n          \"--proguard-configs=@FileArg($_rebased_build_config:proguard:lib_configs)\",\n          \"--input-paths=@FileArg($_rebased_build_config:proguard:input_paths)\",\n          \"--classpath=@FileArg($_rebased_build_config:proguard:lib_paths)\",\n        ]\n        if (defined(invoker.apk_under_test)) {\n          deps += [\n            \"${invoker.apk_under_test}__build_config\",\n            \"${invoker.apk_under_test}__proguard\",\n          ]\n          _apk_under_test_build_config =\n              get_label_info(invoker.apk_under_test, \"target_gen_dir\") + \"/\" +\n              get_label_info(invoker.apk_under_test, \"name\") + \".build_config\"\n          _rebased_apk_under_test_build_config =\n              rebase_path(_apk_under_test_build_config, root_build_dir)\n          args += [ \"--tested-apk-info=@FileArg($_rebased_apk_under_test_build_config:deps_info:proguard_info)\" ]\n        }\n      }\n      _dex_sources = [ _proguard_output_jar_path ]\n      _dex_deps = [ \":$_proguard_target\" ]\n\n      _copy_proguard_mapping_target = \"${_template_name}__copy_proguard_mapping\"\n      copy(_copy_proguard_mapping_target) {\n        sources = [\n          \"$_proguard_output_jar_path.mapping\",\n        ]\n        outputs = [\n          \"$_final_apk_path.mapping\",\n        ]\n        deps = [\n          \":$_proguard_target\",\n        ]\n      }\n    } else {\n      if (enable_multidex) {\n        _dex_sources = [ _jar_path ]\n      } else {\n        _dex_sources = [ _lib_dex_path ]\n      }\n      _dex_deps = [ \":$java_target\" ]\n    }\n\n    dex(\"$final_dex_target_name\") {\n      deps = _dex_deps + [ \":$build_config_target\" ]\n      inputs = [\n        _build_config,\n      ]\n      sources = _dex_sources\n      output = final_dex_path\n\n      # All deps are already included in _dex_sources when proguard is used.\n      if (!_proguard_enabled) {\n        if (enable_multidex) {\n          _dex_arg_key = \"${_rebased_build_config}:dist_jar:dependency_jars\"\n        } else {\n          _dex_arg_key =\n              \"${_rebased_build_config}:final_dex:dependency_dex_files\"\n        }\n        args = [ \"--inputs=@FileArg($_dex_arg_key)\" ]\n      }\n    }\n\n    _native_libs_file_arg_dep = \":$build_config_target\"\n    _native_libs_file_arg = \"@FileArg($_rebased_build_config:native:libraries)\"\n    _secondary_abi_native_libs_file_arg_dep = \":$build_config_target\"\n    _secondary_abi_native_libs_file_arg =\n        \"@FileArg($_rebased_build_config:native:secondary_abi_libraries)\"\n    assert(_secondary_abi_native_libs_file_arg != \"\" &&\n           _secondary_abi_native_libs_file_arg_dep != \"\")  # Mark as used.\n\n    if (_native_libs_deps != [] && _enable_relocation_packing) {\n      _prepare_native_target_name = \"${_template_name}__prepare_native\"\n      _native_libs_json = \"$gen_dir/packed-libs/filelist.json\"\n      _rebased_native_libs_json = rebase_path(_native_libs_json, root_build_dir)\n      _native_libs_file_arg_dep = \":$_prepare_native_target_name\"\n      _native_libs_file_arg = \"@FileArg($_rebased_native_libs_json:files)\"\n\n      pack_relocation_section(_prepare_native_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"deps\",\n                                 \"public_deps\",\n                               ])\n        file_list_json = _native_libs_json\n        libraries_filearg =\n            \"@FileArg(${_rebased_build_config}:native:libraries)\"\n        inputs = [\n          _build_config,\n        ]\n\n        deps += _native_libs_deps\n        deps += [ \":$build_config_target\" ]\n      }\n      if (_secondary_abi_native_libs_deps != []) {\n        _prepare_native_target_name =\n            \"${_template_name}_secondary_abi__prepare_native\"\n        _native_libs_json =\n            \"$gen_dir/packed-libs/$android_secondary_abi_cpu/filelist.json\"\n        _rebased_native_libs_json =\n            rebase_path(_native_libs_json, root_build_dir)\n        _secondary_abi_native_libs_file_arg_dep =\n            \":$_prepare_native_target_name\"\n        _secondary_abi_native_libs_file_arg =\n            \"@FileArg($_rebased_native_libs_json:files)\"\n\n        pack_relocation_section(_prepare_native_target_name) {\n          forward_variables_from(invoker,\n                                 [\n                                   \"deps\",\n                                   \"public_deps\",\n                                 ])\n          file_list_json = _native_libs_json\n          libraries_filearg = \"@FileArg(${_rebased_build_config}:native:secondary_abi_libraries)\"\n          inputs = [\n            _build_config,\n          ]\n\n          deps += _secondary_abi_native_libs_deps\n          deps += [ \":$build_config_target\" ]\n        }\n      }\n    }\n\n    _extra_native_libs = []\n    _extra_native_libs_deps = []\n    _extra_native_libs_even_when_incremental = []\n    _extra_native_libs_even_when_incremental_deps = []\n    assert(_extra_native_libs_even_when_incremental_deps == [])  # Mark as used.\n    if (_native_libs_deps != []) {\n      # zipalign can't align gdb_server, don't pack gdbserver temporarily.\n      if (is_debug && (!defined(invoker.page_align_shared_libraries) ||\n                       !invoker.page_align_shared_libraries)) {\n        _extra_native_libs_even_when_incremental = [ android_gdbserver ]\n      }\n\n      if (_use_chromium_linker) {\n        _extra_native_libs =\n            [ \"$root_shlib_dir/libchromium_android_linker$shlib_extension\" ]\n        _extra_native_libs_deps +=\n            [ \"//base/android/linker:chromium_android_linker\" ]\n      }\n    }\n    if (defined(invoker.loadable_modules) && invoker.loadable_modules != []) {\n      _extra_native_libs_even_when_incremental += invoker.loadable_modules\n    }\n\n    _final_deps += [ \":${_template_name}__create\" ]\n    create_apk(\"${_template_name}__create\") {\n      forward_variables_from(invoker,\n                             [\n                               \"alternative_android_sdk_jar\",\n                               \"android_aapt_path\",\n                               \"app_as_shared_lib\",\n                               \"deps\",\n                               \"extensions_to_not_compress\",\n                               \"language_splits\",\n                               \"page_align_shared_libraries\",\n                               \"public_deps\",\n                               \"secondary_native_libs\",\n                               \"shared_resources\",\n                               \"uncompress_shared_libraries\",\n                               \"write_asset_list\",\n                             ])\n      if (!defined(deps)) {\n        deps = []\n      }\n      apk_path = _final_apk_path\n      android_manifest = _android_manifest\n      assets_build_config = _build_config\n      resources_zip = _all_resources_zip_path\n      dex_path = final_dex_path\n      load_library_from_apk = _load_library_from_apk\n      create_density_splits = _create_density_splits\n      emma_instrument = emma_coverage && !_emma_never_instrument\n\n      if (!defined(extensions_to_not_compress)) {\n        # Allow icu data, v8 snapshots, and pak files to be loaded directly from\n        # the .apk.\n        # Note: These are actually suffix matches, not necessarily extensions.\n        extensions_to_not_compress = \".dat,.bin,.pak\"\n      }\n\n      version_code = _version_code\n      version_name = _version_name\n\n      keystore_name = _keystore_name\n      keystore_path = _keystore_path\n      keystore_password = _keystore_password\n\n      # Incremental apk does not use native libs nor final dex.\n      incremental_deps = deps + _android_manifest_deps + [\n                           \":$build_config_target\",\n                           \":$process_resources_target\",\n                         ]\n\n      # This target generates the input file _all_resources_zip_path.\n      deps += _android_manifest_deps + [\n                \":$build_config_target\",\n                \":$process_resources_target\",\n                \":$final_dex_target_name\",\n              ]\n\n      if ((_native_libs_deps != [] ||\n           _extra_native_libs_even_when_incremental != []) &&\n          !_create_abi_split) {\n        deps += _native_libs_deps + _extra_native_libs_deps +\n                _extra_native_libs_even_when_incremental_deps +\n                [ _native_libs_file_arg_dep ]\n        native_libs_filearg = _native_libs_file_arg\n        native_libs = _extra_native_libs\n        native_libs_even_when_incremental =\n            _extra_native_libs_even_when_incremental\n      }\n\n      if (_secondary_abi_native_libs_deps != [] && !_create_abi_split) {\n        deps += _secondary_abi_native_libs_deps +\n                [ _secondary_abi_native_libs_file_arg_dep ]\n        secondary_abi_native_libs_filearg = _secondary_abi_native_libs_file_arg\n      }\n\n      # Placeholders necessary for some older devices.\n      # http://crbug.com/395038\n      forward_variables_from(invoker, [ \"native_lib_placeholders\" ])\n    }\n\n    if ((_native_libs_deps != [] ||\n         _extra_native_libs_even_when_incremental != []) && _create_abi_split) {\n      _manifest_rule =\n          \"${_template_name}__split_manifest_abi_${android_app_abi}\"\n      generate_split_manifest(_manifest_rule) {\n        main_manifest = _android_manifest\n        out_manifest =\n            \"$gen_dir/split-manifests/${android_app_abi}/AndroidManifest.xml\"\n        split_name = \"abi_${android_app_abi}\"\n        deps = _android_manifest_deps\n      }\n\n      _apk_rule = \"${_template_name}__split_apk_abi_${android_app_abi}\"\n      _final_deps += [ \":$_apk_rule\" ]\n\n      create_apk(_apk_rule) {\n        apk_path = \"${_final_apk_path_no_ext}-abi-${android_app_abi}.apk\"\n        base_path = \"$gen_dir/$_apk_rule\"\n\n        manifest_outputs = get_target_outputs(\":${_manifest_rule}\")\n        android_manifest = manifest_outputs[1]\n        load_library_from_apk = _load_library_from_apk\n\n        version_code = _version_code\n        version_name = _version_name\n\n        keystore_name = _keystore_name\n        keystore_path = _keystore_path\n        keystore_password = _keystore_password\n\n        # Placeholders necessary for some older devices.\n        # http://crbug.com/395038\n        deps = []\n        forward_variables_from(invoker,\n                               [\n                                 \"alternative_android_sdk_jar\",\n                                 \"android_aapt_path\",\n                                 \"deps\",\n                                 \"native_lib_placeholders\",\n                                 \"public_deps\",\n                               ])\n\n        incremental_deps =\n            deps + _extra_native_libs_even_when_incremental_deps +\n            [ \":$_manifest_rule\" ]\n        deps = []\n        deps = incremental_deps + _native_libs_deps + _extra_native_libs_deps +\n               [ _native_libs_file_arg_dep ]\n        native_libs_filearg = _native_libs_file_arg\n        native_libs = _extra_native_libs\n        native_libs_even_when_incremental =\n            _extra_native_libs_even_when_incremental\n      }\n    }\n\n    _create_incremental_script_rule_name =\n        \"${_template_name}__incremental_script\"\n    action(_create_incremental_script_rule_name) {\n      script = \"//build/android/incremental_install/create_install_script.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      deps = [\n        _native_libs_file_arg_dep,\n      ]\n\n      outputs = [\n        _incremental_install_script_path,\n      ]\n\n      _rebased_apk_path_no_ext =\n          rebase_path(_final_apk_path_no_ext, root_build_dir)\n      _rebased_incremental_install_script_path =\n          rebase_path(_incremental_install_script_path, root_build_dir)\n      _rebased_depfile = rebase_path(depfile, root_build_dir)\n      _dex_arg_key = \"${_rebased_build_config}:final_dex:dependency_dex_files\"\n      args = [\n        \"--apk-path=${_rebased_apk_path_no_ext}_incremental.apk\",\n        \"--script-output-path=$_rebased_incremental_install_script_path\",\n        \"--dex-file=$_rebased_lib_dex_path\",\n        \"--dex-file-list=@FileArg($_dex_arg_key)\",\n        \"--depfile=$_rebased_depfile\",\n      ]\n      if (_proguard_enabled) {\n        args += [ \"--show-proguard-warning\" ]\n      }\n      if (defined(_native_libs_file_arg)) {\n        args += [ \"--native-libs=$_native_libs_file_arg\" ]\n      }\n      if (_extra_native_libs != []) {\n        # Don't pass in _extra_native_libs_even_when_incremental, since these are\n        # end up in the apk and are not side-loaded.\n        _rebased_extra_native_libs =\n            rebase_path(_extra_native_libs, root_build_dir)\n        args += [ \"--native-libs=$_rebased_extra_native_libs\" ]\n      }\n      if (_create_density_splits) {\n        args += [ \"--split=${_rebased_apk_path_no_ext}-density-*.apk\" ]\n      }\n      if (_create_language_splits) {\n        args += [ \"--split=${_rebased_apk_path_no_ext}-language-*.apk\" ]\n      }\n      if (_load_library_from_apk) {\n        args += [ \"--dont-even-try=Incremental builds do not work with load_library_from_apk. Try setting is_component_build=true in your GN args.\" ]\n      }\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"data\",\n                               \"data_deps\",\n                             ])\n      public_deps = _final_deps\n\n      # Make the proguard .mapping file easy to find by putting it beside the .apk.\n      if (_proguard_enabled) {\n        deps = [\n          \":$_copy_proguard_mapping_target\",\n        ]\n      }\n    }\n    group(\"${target_name}_incremental\") {\n      forward_variables_from(invoker,\n                             [\n                               \"data\",\n                               \"data_deps\",\n                             ])\n      if (!defined(data_deps)) {\n        data_deps = []\n      }\n\n      # device/commands is used by the installer script to push files via .zip.\n      data_deps += [ \"//build/android/pylib/device/commands\" ] +\n                   _native_libs_deps + _extra_native_libs_deps\n\n      # Since the _incremental.apk does not include use .so nor .dex from the\n      # actual target, but instead loads them at runtime, we need to explicitly\n      # depend on them here.\n      public_deps = [\n        \":${_create_incremental_script_rule_name}\",\n        \":${_template_name}__create_incremental\",\n        \":${java_target}\",\n      ]\n    }\n  }\n\n  # Declare an Android instrumentation test apk\n  #\n  # This target creates an Android instrumentation test apk.\n  #\n  # Variables\n  #   android_manifest: Path to AndroidManifest.xml.\n  #   data_deps: List of dependencies needed at runtime. These will be built but\n  #     won't change the generated .apk in any way (in fact they may be built\n  #     after the .apk is).\n  #   deps: List of dependencies. All Android java resources and libraries in the\n  #     \"transitive closure\" of these dependencies will be included in the apk.\n  #     Note: this \"transitive closure\" actually only includes such targets if\n  #     they are depended on through android_library or android_resources targets\n  #     (and so not through builtin targets like 'action', 'group', etc).\n  #   java_files: List of .java files to include in the apk.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #      will be added to java_files and be included in this apk.\n  #   apk_name: Name for final apk.\n  #   final_apk_path: Path to final built apk. Default is\n  #     $root_out_dir/apks/$apk_name.apk. Setting this will override apk_name.\n  #   shared_libraries: List shared_library targets to bundle. If these\n  #     libraries depend on other shared_library targets, those dependencies will\n  #     also be included in the apk (e.g. for is_component_build).\n  #   apk_under_test: The apk being tested.\n  #\n  # Example\n  #   instrumentation_test_apk(\"foo_test_apk\") {\n  #     android_manifest = \"AndroidManifest.xml\"\n  #     apk_name = \"FooTest\"\n  #     apk_under_test = \"Foo\"\n  #     java_files = [\n  #       \"android/org/chromium/foo/FooTestCase.java\",\n  #       \"android/org/chromium/foo/FooExampleTest.java\",\n  #     ]\n  #     deps = [\n  #       \":foo_test_support_java\"\n  #     ]\n  #   }\n  template(\"instrumentation_test_apk\") {\n    assert(defined(invoker.apk_name))\n    testonly = true\n    _apk_target_name = \"${target_name}__apk\"\n    _test_runner_target_name = \"${target_name}__test_runner_script\"\n    _install_script_name = \"install_$target_name\"\n    _dist_ijar_path =\n        \"$root_build_dir/test.lib.java/\" + invoker.apk_name + \".jar\"\n\n    test_runner_script(_test_runner_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"additional_apks\",\n                               \"apk_under_test\",\n                               \"data\",\n                               \"data_deps\",\n                               \"deps\",\n                               \"ignore_all_data_deps\",\n                               \"public_deps\",\n                             ])\n      test_name = invoker.target_name\n      test_type = \"instrumentation\"\n      apk_target = \":$_apk_target_name\"\n      test_jar = _dist_ijar_path\n    }\n\n    test_runner_script(\"${_test_runner_target_name}_incremental\") {\n      forward_variables_from(invoker,\n                             [\n                               \"additional_apks\",\n                               \"apk_under_test\",\n                               \"data\",\n                               \"data_deps\",\n                               \"deps\",\n                               \"ignore_all_data_deps\",\n                               \"public_deps\",\n                             ])\n      test_name = \"${invoker.target_name}_incremental\"\n      test_type = \"instrumentation\"\n      apk_target = \":$_apk_target_name\"\n      test_jar = _dist_ijar_path\n      incremental_install = true\n    }\n\n    android_apk(_apk_target_name) {\n      deps = []\n      data_deps = []\n      forward_variables_from(invoker, \"*\")\n      install_script_name = _install_script_name\n      deps += [ \"//testing/android/broker:broker_java\" ]\n      data_deps += [\n        \"//build/android/pylib/device/commands\",\n        \"//tools/android/forwarder2\",\n        \"//tools/android/md5sum\",\n      ]\n      if (defined(invoker.additional_apks)) {\n        data_deps += invoker.additional_apks\n      }\n\n      if (defined(invoker.proguard_enabled) && invoker.proguard_enabled) {\n        # When ProGuard is on, we use ProGuard to combine the under test java\n        # code and the test java code. This is to allow us to apply all ProGuard\n        # optimizations that we ship with, but not have them break tests. The\n        # apk under test will still have the same resources, assets, and\n        # manifest, all of which are the ones used in the tests.\n        if (!defined(invoker.proguard_configs)) {\n          proguard_configs = []\n        }\n        proguard_configs += [ \"//testing/android/proguard_for_test.flags\" ]\n      }\n\n      dist_ijar_path = _dist_ijar_path\n      if (defined(invoker.run_findbugs_override)) {\n        # Only allow findbugs when there are java files.\n        run_findbugs_override =\n            invoker.run_findbugs_override && defined(invoker.java_files)\n      }\n    }\n\n    group(target_name) {\n      public_deps = [\n        \":$_apk_target_name\",\n        \":$_test_runner_target_name\",\n\n        # Required by test runner to enumerate test list.\n        \":${_apk_target_name}_dist_ijar\",\n      ]\n      if (defined(invoker.apk_under_test)) {\n        public_deps += [ invoker.apk_under_test ]\n      }\n    }\n\n    # TODO: Delete once recipes no longer use this target.\n    group(\"${target_name}_run\") {\n      public_deps = [\n        \":${invoker.target_name}\",\n      ]\n    }\n    group(\"${target_name}_incremental\") {\n      public_deps = [\n        \":${_apk_target_name}_dist_ijar\",\n        \":${_apk_target_name}_incremental\",\n        \":${_test_runner_target_name}_incremental\",\n      ]\n      if (defined(invoker.apk_under_test)) {\n        public_deps += [ \"${invoker.apk_under_test}_incremental\" ]\n      }\n    }\n  }\n\n  # Declare an Android gtest apk\n  #\n  # This target creates an Android apk for running gtest-based unittests.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. These will be passed to\n  #     the underlying android_apk invocation and should include the java and\n  #     resource dependencies of the apk.\n  #   shared_library: shared_library target that contains the unit tests.\n  #   apk_name: The name of the produced apk. If unspecified, it uses the name\n  #             of the shared_library target suffixed with \"_apk\"\n  #   use_default_launcher: Whether the default activity (NativeUnitTestActivity)\n  #     should be used for launching tests.\n  #   use_native_activity: Test implements ANativeActivity_onCreate().\n  #\n  # Example\n  #   unittest_apk(\"foo_unittests_apk\") {\n  #     deps = [ \":foo_java\", \":foo_resources\" ]\n  #     shared_library = \":foo_unittests\"\n  #   }\n  template(\"unittest_apk\") {\n    _use_native_activity =\n        defined(invoker.use_native_activity) && invoker.use_native_activity\n    _android_manifest = \"$target_gen_dir/$target_name/AndroidManifest.xml\"\n    assert(invoker.shared_library != \"\")\n\n    # This trivial assert is needed in case android_manifest is defined,\n    # as otherwise _use_native_activity and _android_manifest would not be used.\n    assert(_use_native_activity != \"\" && _android_manifest != \"\")\n\n    if (!defined(invoker.android_manifest)) {\n      jinja_template(\"${target_name}_manifest\") {\n        _native_library_name = get_label_info(invoker.shared_library, \"name\")\n        input = \"//testing/android/native_test/java/AndroidManifest.xml.jinja2\"\n        output = _android_manifest\n        variables = [\n          \"is_component_build=${is_component_build}\",\n          \"native_library_name=${_native_library_name}\",\n          \"use_native_activity=${_use_native_activity}\",\n        ]\n      }\n    }\n\n    android_apk(target_name) {\n      set_sources_assignment_filter([])\n      data_deps = []\n      deps = []\n      forward_variables_from(invoker, \"*\")\n      testonly = true\n\n      assert(!defined(invoker.proguard_enabled) || !invoker.proguard_enabled ||\n             invoker.proguard_configs != [])\n\n      if (!defined(apk_name)) {\n        apk_name = get_label_info(invoker.shared_library, \"name\")\n      }\n\n      if (!defined(android_manifest)) {\n        android_manifest_dep = \":${target_name}_manifest\"\n        android_manifest = _android_manifest\n      }\n\n      final_apk_path = \"$root_build_dir/${apk_name}_apk/${apk_name}-debug.apk\"\n\n      if (!defined(use_default_launcher) || use_default_launcher) {\n        deps += [ \"//testing/android/native_test:native_test_java\" ]\n      }\n      shared_libraries = [ invoker.shared_library ]\n      deps += [\n        \"//base:base_java\",\n        \"//testing/android/appurify_support:appurify_support_java\",\n        \"//testing/android/reporter:reporter_java\",\n      ]\n      data_deps += [\n        \"//build/android/pylib/device/commands\",\n        \"//tools/android/md5sum\",\n      ]\n      if (host_os == \"linux\") {\n        data_deps += [ \"//tools/android/forwarder2\" ]\n      }\n    }\n  }\n\n  # Generate .java files from .aidl files.\n  #\n  # This target will store the .java files in a srcjar and should be included in\n  # an android_library or android_apk's srcjar_deps.\n  #\n  # Variables\n  #   sources: Paths to .aidl files to compile.\n  #   import_include: Path to directory containing .java files imported by the\n  #     .aidl files.\n  #   interface_file: Preprocessed aidl file to import.\n  #\n  # Example\n  #   android_aidl(\"foo_aidl\") {\n  #     import_include = \"java/src\"\n  #     sources = [\n  #       \"java/src/com/foo/bar/FooBarService.aidl\",\n  #       \"java/src/com/foo/bar/FooBarServiceCallback.aidl\",\n  #     ]\n  #   }\n  template(\"android_aidl\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    srcjar_path = \"${target_gen_dir}/${target_name}.srcjar\"\n    aidl_path = \"${android_sdk_build_tools}/aidl\"\n    framework_aidl = \"$android_sdk/framework.aidl\"\n\n    action(target_name) {\n      script = \"//build/android/gyp/aidl.py\"\n      sources = invoker.sources\n\n      imports = [ framework_aidl ]\n      if (defined(invoker.interface_file)) {\n        assert(invoker.interface_file != \"\")\n        imports += [ invoker.interface_file ]\n      }\n\n      inputs = [ aidl_path ] + imports\n\n      depfile = \"${target_gen_dir}/${target_name}.d\"\n      outputs = [\n        srcjar_path,\n      ]\n      rebased_imports = rebase_path(imports, root_build_dir)\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--aidl-path\",\n        rebase_path(aidl_path, root_build_dir),\n        \"--imports=$rebased_imports\",\n        \"--srcjar\",\n        rebase_path(srcjar_path, root_build_dir),\n      ]\n      if (defined(invoker.import_include) && invoker.import_include != \"\") {\n        # TODO(cjhopman): aidl supports creating a depfile. We should be able to\n        # switch to constructing a depfile for the overall action from that\n        # instead of having all the .java files in the include paths as inputs.\n        rebased_import_includes =\n            rebase_path([ invoker.import_include ], root_build_dir)\n        args += [ \"--includes=$rebased_import_includes\" ]\n\n        _java_files_build_rel =\n            exec_script(\"//build/android/gyp/find.py\",\n                        rebase_path([ invoker.import_include ], root_build_dir),\n                        \"list lines\")\n        _java_files = rebase_path(_java_files_build_rel, \".\", root_build_dir)\n        inputs += _java_files\n      }\n      args += rebase_path(sources, root_build_dir)\n    }\n  }\n\n  # Compile a protocol buffer to java.\n  #\n  # This generates java files from protocol buffers and creates an Android library\n  # containing the classes.\n  #\n  # Variables\n  #   sources: Paths to .proto files to compile.\n  #   proto_path: Root directory of .proto files.\n  #\n  # Example:\n  #  proto_java_library(\"foo_proto_java\") {\n  #    proto_path = \"src/foo\"\n  #    sources = [ \"$proto_path/foo.proto\" ]\n  #  }\n  template(\"proto_java_library\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n    _protoc_dep =\n        \"//third_party/android_protobuf:android_protoc($host_toolchain)\"\n    _protoc_out_dir = get_label_info(_protoc_dep, \"root_out_dir\")\n    _protoc_bin = \"$_protoc_out_dir/android_protoc\"\n    _proto_path = invoker.proto_path\n\n    _template_name = target_name\n\n    action(\"${_template_name}__protoc_java\") {\n      srcjar_path = \"$target_gen_dir/$target_name.srcjar\"\n      script = \"//build/protoc_java.py\"\n\n      deps = [\n        _protoc_dep,\n      ]\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n\n      sources = invoker.sources\n      depfile = \"$target_gen_dir/$target_name.d\"\n      outputs = [\n        srcjar_path,\n      ]\n      args = [\n               \"--depfile\",\n               rebase_path(depfile, root_build_dir),\n               \"--protoc\",\n               rebase_path(_protoc_bin, root_build_dir),\n               \"--proto-path\",\n               rebase_path(_proto_path, root_build_dir),\n               \"--srcjar\",\n               rebase_path(srcjar_path, root_build_dir),\n             ] + rebase_path(sources, root_build_dir)\n    }\n\n    android_library(target_name) {\n      chromium_code = false\n      java_files = []\n      srcjar_deps = [ \":${_template_name}__protoc_java\" ]\n      deps = [\n        \"//third_party/android_protobuf:protobuf_nano_javalib\",\n      ]\n    }\n  }\n\n  # Declare an Android library target for a prebuilt AAR.\n  #\n  # This target creates an Android library containing java code and Android\n  # resources. For libraries without resources, it will not generate\n  # corresponding android_resources targets.\n  #\n  # Variables\n  #   aar_path: Path to the AAR.\n  #   proguard_configs: List of proguard configs to use in final apk step for\n  #     any apk that depends on this library.\n  #   ignore_aidl: Whether to ignore .aidl files found with the .aar.\n  #   ignore_assets: Whether to ignore assets found in the .aar.\n  #   ignore_manifest: Whether to ignore merging of AndroidManifest.xml.\n  #   ignore_native_libraries: Whether to ignore .so files found in the .aar.\n  #   TODO(jbudorick@): remove this arguments after crbug.com/522043 is fixed.\n  #   requires_android: Whether this target can only be used for compiling Android related targets.\n  #\n  # Example\n  #   android_aar_prebuilt(\"foo_java\") {\n  #     aar_path = \"foo.aar\"\n  #   }\n  template(\"android_aar_prebuilt\") {\n    _output_path = \"${target_gen_dir}/${target_name}\"\n    _unpack_target_name = \"${target_name}__unpack_aar\"\n    _ignore_aidl = defined(invoker.ignore_aidl) && invoker.ignore_aidl\n    _ignore_assets = defined(invoker.ignore_assets) && invoker.ignore_assets\n    _ignore_manifest =\n        defined(invoker.ignore_manifest) && invoker.ignore_manifest\n    _ignore_native_libraries = defined(invoker.ignore_native_libraries) &&\n                               invoker.ignore_native_libraries\n\n    # Scan the AAR file and determine the resources and jar files.\n    # Some libraries might not have resources; others might have two jars.\n    _scanned_files =\n        exec_script(\"//build/android/gyp/aar.py\",\n                    [\n                      \"--input-file\",\n                      rebase_path(invoker.aar_path, root_build_dir),\n                      \"--list\",\n                    ],\n                    \"scope\")\n\n    assert(_ignore_aidl || _scanned_files.aidl == [],\n           \"android_aar_prebuilt() aidl not yet supported.\" +\n               \" Implement or use ignore_aidl = true.\" +\n               \" http://crbug.com/644439\")\n    assert(_ignore_assets || _scanned_files.assets == [],\n           \"android_aar_prebuilt() assets not yet supported.\" +\n               \" Implement or use ignore_assets = true.\" +\n               \" http://crbug.com/643966\")\n    assert(_ignore_native_libraries || !_scanned_files.has_native_libraries,\n           \"android_aar_prebuilt() with .so files is not supported.\" +\n               \" Use ignore_native_libraries = true to silence this error.\")\n    assert(_ignore_manifest || _scanned_files.is_manifest_empty,\n           \"android_aar_prebuilt() manifest merging not yet supported and\" +\n               \" non-trivial AndroidManifest.xml detected.\" +\n               \" Implement or use ignore_manifest = true.\" +\n               \" http://crbug.com/643967\")\n    assert(_scanned_files.has_classes_jar || _scanned_files.subjars == [])\n\n    action(_unpack_target_name) {\n      script = \"//build/android/gyp/aar.py\"  # Unzips the AAR\n      args = [\n        \"--input-file\",\n        rebase_path(invoker.aar_path, root_build_dir),\n        \"--output-dir\",\n        rebase_path(_output_path, root_build_dir),\n        \"--extract\",\n      ]\n      inputs = [\n        invoker.aar_path,\n      ]\n      outputs = [\n        \"${_output_path}/AndroidManifest.xml\",\n      ]\n\n      if (_scanned_files.resources != []) {\n        outputs += [ \"${_output_path}/R.txt\" ]\n        outputs += get_path_info(\n                rebase_path(_scanned_files.resources, \"\", _output_path),\n                \"abspath\")\n      }\n      if (_scanned_files.has_classes_jar) {\n        outputs += [ \"${_output_path}/classes.jar\" ]\n      }\n      outputs +=\n          get_path_info(rebase_path(_scanned_files.subjars, \"\", _output_path),\n                        \"abspath\")\n      if (_scanned_files.has_proguard_flags) {\n        outputs += [ \"${_output_path}/proguard.txt\" ]\n      }\n    }\n\n    # Create the android_resources target for resources.\n    if (_scanned_files.resources != []) {\n      _res_target_name = \"${target_name}__res\"\n      android_resources(_res_target_name) {\n        forward_variables_from(invoker, [ \"deps\" ])\n        if (!defined(deps)) {\n          deps = []\n        }\n        deps += [ \":$_unpack_target_name\" ]\n        resource_dirs = []\n        generated_resource_dirs = [ \"${_output_path}/res\" ]\n        generated_resource_files =\n            rebase_path(_scanned_files.resources, \"\", _output_path)\n        android_manifest_dep = \":$_unpack_target_name\"\n        android_manifest = \"${_output_path}/AndroidManifest.xml\"\n        v14_skip = true\n      }\n    }\n\n    # Create android_java_prebuilt target for extra jars within jars/.\n    _subjar_targets = []\n    foreach(_tuple, _scanned_files.subjar_tuples) {\n      _current_target = \"${target_name}__subjar_${_tuple[0]}\"\n      _subjar_targets += [ \":$_current_target\" ]\n      java_prebuilt(_current_target) {\n        forward_variables_from(invoker,\n                               [\n                                 \"jar_excluded_patterns\",\n                                 \"requires_android\",\n                               ])\n        deps = [\n          \":$_unpack_target_name\",\n        ]\n        if (!defined(requires_android)) {\n          requires_android = true\n        }\n        supports_android = true\n        jar_path = \"$_output_path/${_tuple[1]}\"\n        _base_output_name = get_path_info(jar_path, \"name\")\n        output_name = \"${invoker.target_name}-$_base_output_name\"\n      }\n    }\n\n    # Create android_java_prebuilt target for classes.jar.\n    if (_scanned_files.has_classes_jar) {\n      _jar_target_name = \"${target_name}__classes\"\n      java_prebuilt(_jar_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"deps\",\n                                 \"input_jars_paths\",\n                                 \"jar_excluded_patterns\",\n                                 \"proguard_configs\",\n                                 \"requires_android\",\n                               ])\n        if (!defined(deps)) {\n          deps = []\n        }\n        deps += _subjar_targets + [ \":$_unpack_target_name\" ]\n        if (defined(_res_target_name)) {\n          deps += [ \":$_res_target_name\" ]\n        }\n        if (!defined(requires_android)) {\n          requires_android = true\n        }\n        supports_android = true\n        jar_path = \"$_output_path/classes.jar\"\n        output_name = invoker.target_name\n\n        if (_scanned_files.has_proguard_flags) {\n          if (!defined(proguard_configs)) {\n            proguard_configs = []\n          }\n          proguard_configs += [ \"$_output_path/proguard.txt\" ]\n        }\n      }\n    }\n\n    java_group(target_name) {\n      deps = []\n      if (defined(_jar_target_name)) {\n        deps += [ \":$_jar_target_name\" ]\n\n        # Although subjars are meant to be private, we add them as deps here\n        # because in practice they seem to contain classes required to be in the\n        # classpath.\n        deps += _subjar_targets\n      }\n      if (defined(_res_target_name)) {\n        deps += [ \":$_res_target_name\" ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/clang.gni",
    "content": "# Copyright 2014 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/toolchain/toolchain.gni\")\n\ndeclare_args() {\n  # Indicates if the build should use the Chrome-specific plugins for enforcing\n  # coding guidelines, etc. Only used when compiling with Clang.\n  clang_use_chrome_plugins = is_clang && !is_nacl && !use_xcode_clang\n\n  clang_base_path = \"//third_party/llvm-build/Release+Asserts\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/filenames/.gn",
    "content": "# This file is used by the GN meta build system to find the root of the source\n# tree and to set startup options. For documentation on the values set in this\n# file, run \"gn help dotfile\" at the command line.\n\nimport(\"//build/dotfile_settings.gni\")\n\n# The location of the build configuration file.\nbuildconfig = \"//build/config/BUILDCONFIG.gn\"\n\n# The secondary source root is a parallel directory tree where\n# GN build files are placed when they can not be placed directly\n# in the source tree, e.g. for third party source trees.\nsecondary_source = \"//build/secondary/\"\n\n# These are the targets to check headers for by default. The files in targets\n# matching these patterns (see \"gn help label_pattern\" for format) will have\n# their includes checked for proper dependencies when you run either\n# \"gn check\" or \"gn gen --check\".\ncheck_targets = []\n\n# These are the list of GN files that run exec_script. This whitelist exists\n# to force additional review for new uses of exec_script, which is strongly\n# discouraged except for gypi_to_gn calls.\nexec_script_whitelist =\n    build_dotfile_settings.exec_script_whitelist + [ \"//test/test262/BUILD.gn\" ]\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/gcc_toolchain.gni",
    "content": "# Copyright (c) 2013 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/android/config.gni\")\nimport(\"//build/config/clang/clang.gni\")\nimport(\"//build/config/nacl/config.gni\")\nimport(\"//build/config/sanitizers/sanitizers.gni\")\nimport(\"//build/config/v8_target_cpu.gni\")\nimport(\"//build/toolchain/cc_wrapper.gni\")\nimport(\"//build/toolchain/goma.gni\")\nimport(\"//build/toolchain/toolchain.gni\")\n\n# This template defines a toolchain for something that works like gcc\n# (including clang).\n#\n# It requires the following variables specifying the executables to run:\n#  - ar\n#  - cc\n#  - cxx\n#  - ld\n#\n# Optional parameters that control the tools:\n#\n#  - extra_cflags\n#      Extra flags to be appended when compiling C files (but not C++ files).\n#  - extra_cppflags\n#      Extra flags to be appended when compiling both C and C++ files. \"CPP\"\n#      stands for \"C PreProcessor\" in this context, although it can be\n#      used for non-preprocessor flags as well. Not to be confused with\n#      \"CXX\" (which follows).\n#  - extra_cxxflags\n#      Extra flags to be appended when compiling C++ files (but not C files).\n#  - extra_ldflags\n#      Extra flags to be appended when linking\n#\n#  - libs_section_prefix\n#  - libs_section_postfix\n#      The contents of these strings, if specified, will be placed around\n#      the libs section of the linker line. It allows one to inject libraries\n#      at the beginning and end for all targets in a toolchain.\n#  - solink_libs_section_prefix\n#  - solink_libs_section_postfix\n#      Same as libs_section_{pre,post}fix except used for solink instead of link.\n#  - link_outputs\n#      The content of this array, if specified, will be added to the list of\n#      outputs from the link command. This can be useful in conjunction with\n#      the post_link parameter.\n#  - post_link\n#      The content of this string, if specified, will be run as a separate\n#      command following the the link command.\n#  - deps\n#      Just forwarded to the toolchain definition.\n#  - executable_extension\n#      If this string is specified it will be used for the file extension\n#      for an executable, rather than using no extension; targets will\n#      still be able to override the extension using the output_extension\n#      variable.\n#  - rebuild_define\n#      The contents of this string, if specified, will be passed as a #define\n#      to the toolchain. It can be used to force recompiles whenever a\n#      toolchain is updated.\n#  - shlib_extension\n#      If this string is specified it will be used for the file extension\n#      for a shared library, rather than default value specified in\n#      toolchain.gni\n#  - strip\n#      Location of the strip executable. When specified, strip will be run on\n#      all shared libraries and executables as they are built. The pre-stripped\n#      artifacts will be put in lib.unstripped/ and exe.unstripped/.\ntemplate(\"gcc_toolchain\") {\n  toolchain(target_name) {\n    assert(defined(invoker.ar), \"gcc_toolchain() must specify a \\\"ar\\\" value\")\n    assert(defined(invoker.cc), \"gcc_toolchain() must specify a \\\"cc\\\" value\")\n    assert(defined(invoker.cxx), \"gcc_toolchain() must specify a \\\"cxx\\\" value\")\n    assert(defined(invoker.ld), \"gcc_toolchain() must specify a \\\"ld\\\" value\")\n\n    # This define changes when the toolchain changes, forcing a rebuild.\n    # Nothing should ever use this define.\n    if (defined(invoker.rebuild_define)) {\n      rebuild_string = \"-D\" + invoker.rebuild_define + \" \"\n    } else {\n      rebuild_string = \"\"\n    }\n\n    # GN's syntax can't handle more than one scope dereference at once, like\n    # \"invoker.toolchain_args.foo\", so make a temporary to hold the toolchain\n    # args so we can do \"invoker_toolchain_args.foo\".\n    assert(defined(invoker.toolchain_args),\n           \"Toolchains must specify toolchain_args\")\n    invoker_toolchain_args = invoker.toolchain_args\n    assert(defined(invoker_toolchain_args.current_cpu),\n           \"toolchain_args must specify a current_cpu\")\n    assert(defined(invoker_toolchain_args.current_os),\n           \"toolchain_args must specify a current_os\")\n\n    # When invoking this toolchain not as the default one, these args will be\n    # passed to the build. They are ignored when this is the default toolchain.\n    toolchain_args = {\n      # Populate toolchain args from the invoker.\n      forward_variables_from(invoker_toolchain_args, \"*\")\n\n      # The host toolchain value computed by the default toolchain's setup\n      # needs to be passed through unchanged to all secondary toolchains to\n      # ensure that it's always the same, regardless of the values that may be\n      # set on those toolchains.\n      host_toolchain = host_toolchain\n\n      if (!defined(invoker_toolchain_args.v8_current_cpu)) {\n        v8_current_cpu = invoker_toolchain_args.current_cpu\n      }\n    }\n\n    # When the invoker has explicitly overridden use_goma or cc_wrapper in the\n    # toolchain args, use those values, otherwise default to the global one.\n    # This works because the only reasonable override that toolchains might\n    # supply for these values are to force-disable them.\n    if (defined(toolchain_args.use_goma)) {\n      toolchain_uses_goma = toolchain_args.use_goma\n    } else {\n      toolchain_uses_goma = use_goma\n    }\n    if (defined(toolchain_args.cc_wrapper)) {\n      toolchain_cc_wrapper = toolchain_args.cc_wrapper\n    } else {\n      toolchain_cc_wrapper = cc_wrapper\n    }\n\n    # Compute the compiler prefix.\n    if (toolchain_uses_goma) {\n      assert(toolchain_cc_wrapper == \"\",\n             \"Goma and cc_wrapper can't be used together.\")\n      compiler_prefix = \"$goma_dir/gomacc \"\n    } else if (toolchain_cc_wrapper != \"\") {\n      compiler_prefix = toolchain_cc_wrapper + \" \"\n    } else {\n      compiler_prefix = \"\"\n    }\n\n    cc = compiler_prefix + invoker.cc\n    cxx = compiler_prefix + invoker.cxx\n    ar = invoker.ar\n    ld = invoker.ld\n    if (defined(invoker.readelf)) {\n      readelf = invoker.readelf\n    } else {\n      readelf = \"readelf\"\n    }\n    if (defined(invoker.nm)) {\n      nm = invoker.nm\n    } else {\n      nm = \"nm\"\n    }\n\n    if (defined(invoker.shlib_extension)) {\n      default_shlib_extension = invoker.shlib_extension\n    } else {\n      default_shlib_extension = shlib_extension\n    }\n\n    if (defined(invoker.executable_extension)) {\n      default_executable_extension = invoker.executable_extension\n    } else {\n      default_executable_extension = \"\"\n    }\n\n    # Bring these into our scope for string interpolation with default values.\n    if (defined(invoker.libs_section_prefix)) {\n      libs_section_prefix = invoker.libs_section_prefix\n    } else {\n      libs_section_prefix = \"\"\n    }\n\n    if (defined(invoker.libs_section_postfix)) {\n      libs_section_postfix = invoker.libs_section_postfix\n    } else {\n      libs_section_postfix = \"\"\n    }\n\n    if (defined(invoker.solink_libs_section_prefix)) {\n      solink_libs_section_prefix = invoker.solink_libs_section_prefix\n    } else {\n      solink_libs_section_prefix = \"\"\n    }\n\n    if (defined(invoker.solink_libs_section_postfix)) {\n      solink_libs_section_postfix = invoker.solink_libs_section_postfix\n    } else {\n      solink_libs_section_postfix = \"\"\n    }\n\n    if (defined(invoker.extra_cflags) && invoker.extra_cflags != \"\") {\n      extra_cflags = \" \" + invoker.extra_cflags\n    } else {\n      extra_cflags = \"\"\n    }\n\n    if (defined(invoker.extra_cppflags) && invoker.extra_cppflags != \"\") {\n      extra_cppflags = \" \" + invoker.extra_cppflags\n    } else {\n      extra_cppflags = \"\"\n    }\n\n    if (defined(invoker.extra_cxxflags) && invoker.extra_cxxflags != \"\") {\n      extra_cxxflags = \" \" + invoker.extra_cxxflags\n    } else {\n      extra_cxxflags = \"\"\n    }\n\n    if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != \"\") {\n      extra_ldflags = \" \" + invoker.extra_ldflags\n    } else {\n      extra_ldflags = \"\"\n    }\n\n    # These library switches can apply to all tools below.\n    lib_switch = \"-l\"\n    lib_dir_switch = \"-L\"\n\n    # Object files go in this directory.\n    object_subdir = \"{{target_out_dir}}/{{label_name}}\"\n\n    tool(\"cc\") {\n      depfile = \"{{output}}.d\"\n      command = \"$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{output}}\"\n      depsformat = \"gcc\"\n      description = \"CC {{output}}\"\n      outputs = [\n        # The whitelist file is also an output, but ninja does not\n        # currently support multiple outputs for tool(\"cc\").\n        \"$object_subdir/{{source_name_part}}.o\",\n      ]\n      if (enable_resource_whitelist_generation) {\n        compile_wrapper =\n            rebase_path(\"//build/toolchain/gcc_compile_wrapper.py\",\n                        root_build_dir)\n        command = \"$python_path \\\"$compile_wrapper\\\" --resource-whitelist=\\\"{{output}}.whitelist\\\" $command\"\n      }\n    }\n\n    tool(\"cxx\") {\n      depfile = \"{{output}}.d\"\n      command = \"$cxx -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} -c {{source}} -o {{output}}\"\n      depsformat = \"gcc\"\n      description = \"CXX {{output}}\"\n      outputs = [\n        # The whitelist file is also an output, but ninja does not\n        # currently support multiple outputs for tool(\"cxx\").\n        \"$object_subdir/{{source_name_part}}.o\",\n      ]\n      if (enable_resource_whitelist_generation) {\n        compile_wrapper =\n            rebase_path(\"//build/toolchain/gcc_compile_wrapper.py\",\n                        root_build_dir)\n        command = \"$python_path \\\"$compile_wrapper\\\" --resource-whitelist=\\\"{{output}}.whitelist\\\" $command\"\n      }\n    }\n\n    tool(\"asm\") {\n      # For GCC we can just use the C compiler to compile assembly.\n      depfile = \"{{output}}.d\"\n      command = \"$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}\"\n      depsformat = \"gcc\"\n      description = \"ASM {{output}}\"\n      outputs = [\n        \"$object_subdir/{{source_name_part}}.o\",\n      ]\n    }\n\n    tool(\"alink\") {\n      rspfile = \"{{output}}.rsp\"\n      whitelist_flag = \" \"\n      if (enable_resource_whitelist_generation) {\n        whitelist_flag = \" --resource-whitelist=\\\"{{output}}.whitelist\\\"\"\n      }\n\n      # This needs a Python script to avoid using simple sh features in this\n      # command, in case the host does not use a POSIX shell (e.g. compiling\n      # POSIX-like toolchains such as NaCl on Windows).\n      ar_wrapper =\n          rebase_path(\"//build/toolchain/gcc_ar_wrapper.py\", root_build_dir)\n      command = \"$python_path \\\"$ar_wrapper\\\"$whitelist_flag --output={{output}} --ar=\\\"$ar\\\" {{arflags}} rcsD @\\\"$rspfile\\\"\"\n      description = \"AR {{output}}\"\n      rspfile_content = \"{{inputs}}\"\n      outputs = [\n        \"{{output_dir}}/{{target_output_name}}{{output_extension}}\",\n      ]\n\n      # Shared libraries go in the target out directory by default so we can\n      # generate different targets with the same name and not have them collide.\n      default_output_dir = \"{{target_out_dir}}\"\n      default_output_extension = \".a\"\n      output_prefix = \"lib\"\n    }\n\n    tool(\"solink\") {\n      soname = \"{{target_output_name}}{{output_extension}}\"  # e.g. \"libfoo.so\".\n      sofile = \"{{output_dir}}/$soname\"  # Possibly including toolchain dir.\n      rspfile = sofile + \".rsp\"\n      pool = \"//build/toolchain:link_pool($default_toolchain)\"\n      whitelist_flag = \" \"\n      if (enable_resource_whitelist_generation) {\n        whitelist_file = \"$sofile.whitelist\"\n        whitelist_flag = \" --resource-whitelist=\\\"$whitelist_file\\\"\"\n      }\n\n      if (defined(invoker.strip)) {\n        unstripped_sofile = \"{{root_out_dir}}/lib.unstripped/$soname\"\n      } else {\n        unstripped_sofile = sofile\n      }\n\n      # These variables are not built into GN but are helpers that\n      # implement (1) linking to produce a .so, (2) extracting the symbols\n      # from that file (3) if the extracted list differs from the existing\n      # .TOC file, overwrite it, otherwise, don't change it.\n      tocfile = sofile + \".TOC\"\n\n      link_command = \"$ld -shared {{ldflags}}${extra_ldflags} -o \\\"$unstripped_sofile\\\" -Wl,-soname=\\\"$soname\\\" @\\\"$rspfile\\\"\"\n\n      assert(defined(readelf), \"to solink you must have a readelf\")\n      assert(defined(nm), \"to solink you must have an nm\")\n      strip_switch = \"\"\n      if (defined(invoker.strip)) {\n        strip_switch = \"--strip=${invoker.strip}\"\n      }\n\n      # This needs a Python script to avoid using a complex shell command\n      # requiring sh control structures, pipelines, and POSIX utilities.\n      # The host might not have a POSIX shell and utilities (e.g. Windows).\n      solink_wrapper = rebase_path(\"//build/toolchain/gcc_solink_wrapper.py\")\n      command = \"$python_path \\\"$solink_wrapper\\\" --readelf=\\\"$readelf\\\" --nm=\\\"$nm\\\" $strip_switch --sofile=\\\"$unstripped_sofile\\\" --tocfile=\\\"$tocfile\\\" --output=\\\"$sofile\\\"$whitelist_flag -- $link_command\"\n\n      rspfile_content = \"-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix\"\n\n      description = \"SOLINK $sofile\"\n\n      # Use this for {{output_extension}} expansions unless a target manually\n      # overrides it (in which case {{output_extension}} will be what the target\n      # specifies).\n      default_output_extension = default_shlib_extension\n\n      default_output_dir = \"{{root_out_dir}}\"\n      if (shlib_subdir != \".\") {\n        default_output_dir += \"/$shlib_subdir\"\n      }\n\n      output_prefix = \"lib\"\n\n      # Since the above commands only updates the .TOC file when it changes, ask\n      # Ninja to check if the timestamp actually changed to know if downstream\n      # dependencies should be recompiled.\n      restat = true\n\n      # Tell GN about the output files. It will link to the sofile but use the\n      # tocfile for dependency management.\n      outputs = [\n        sofile,\n        tocfile,\n      ]\n      if (enable_resource_whitelist_generation) {\n        outputs += [ whitelist_file ]\n      }\n      if (sofile != unstripped_sofile) {\n        outputs += [ unstripped_sofile ]\n      }\n      link_output = sofile\n      depend_output = tocfile\n    }\n\n    tool(\"solink_module\") {\n      soname = \"{{target_output_name}}{{output_extension}}\"  # e.g. \"libfoo.so\".\n      sofile = \"{{output_dir}}/$soname\"\n      rspfile = sofile + \".rsp\"\n      pool = \"//build/toolchain:link_pool($default_toolchain)\"\n\n      if (defined(invoker.strip)) {\n        unstripped_sofile = \"{{root_out_dir}}/lib.unstripped/$soname\"\n      } else {\n        unstripped_sofile = sofile\n      }\n\n      command = \"$ld -shared {{ldflags}}${extra_ldflags} -o \\\"$unstripped_sofile\\\" -Wl,-soname=\\\"$soname\\\" @\\\"$rspfile\\\"\"\n\n      if (defined(invoker.strip)) {\n        strip_command = \"${invoker.strip} --strip-unneeded -o \\\"$sofile\\\" \\\"$unstripped_sofile\\\"\"\n        command += \" && \" + strip_command\n      }\n      rspfile_content = \"-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix\"\n\n      description = \"SOLINK_MODULE $sofile\"\n\n      # Use this for {{output_extension}} expansions unless a target manually\n      # overrides it (in which case {{output_extension}} will be what the target\n      # specifies).\n      if (defined(invoker.loadable_module_extension)) {\n        default_output_extension = invoker.loadable_module_extension\n      } else {\n        default_output_extension = default_shlib_extension\n      }\n\n      default_output_dir = \"{{root_out_dir}}\"\n      if (shlib_subdir != \".\") {\n        default_output_dir += \"/$shlib_subdir\"\n      }\n\n      output_prefix = \"lib\"\n\n      outputs = [\n        sofile,\n      ]\n      if (sofile != unstripped_sofile) {\n        outputs += [ unstripped_sofile ]\n      }\n    }\n\n    tool(\"link\") {\n      exename = \"{{target_output_name}}{{output_extension}}\"\n      outfile = \"{{output_dir}}/$exename\"\n      rspfile = \"$outfile.rsp\"\n      unstripped_outfile = outfile\n      pool = \"//build/toolchain:link_pool($default_toolchain)\"\n\n      # Use this for {{output_extension}} expansions unless a target manually\n      # overrides it (in which case {{output_extension}} will be what the target\n      # specifies).\n      default_output_extension = default_executable_extension\n\n      default_output_dir = \"{{root_out_dir}}\"\n\n      if (defined(invoker.strip)) {\n        unstripped_outfile = \"{{root_out_dir}}/exe.unstripped/$exename\"\n      }\n\n      command = \"$ld {{ldflags}}${extra_ldflags} -o \\\"$unstripped_outfile\\\" -Wl,--start-group @\\\"$rspfile\\\" {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix\"\n      if (defined(invoker.strip)) {\n        link_wrapper =\n            rebase_path(\"//build/toolchain/gcc_link_wrapper.py\", root_build_dir)\n        command = \"$python_path \\\"$link_wrapper\\\" --strip=\\\"${invoker.strip}\\\" --unstripped-file=\\\"$unstripped_outfile\\\" --output=\\\"$outfile\\\" -- $command\"\n      }\n      description = \"LINK $outfile\"\n      rspfile_content = \"{{inputs}}\"\n      outputs = [\n        outfile,\n      ]\n      if (outfile != unstripped_outfile) {\n        outputs += [ unstripped_outfile ]\n      }\n      if (defined(invoker.link_outputs)) {\n        outputs += invoker.link_outputs\n      }\n    }\n\n    # These two are really entirely generic, but have to be repeated in\n    # each toolchain because GN doesn't allow a template to be used here.\n    # See //build/toolchain/toolchain.gni for details.\n    tool(\"stamp\") {\n      command = stamp_command\n      description = stamp_description\n    }\n    tool(\"copy\") {\n      command = copy_command\n      description = copy_description\n    }\n\n    forward_variables_from(invoker, [ \"deps\" ])\n  }\n}\n\n# This is a shorthand for gcc_toolchain instances based on the Chromium-built\n# version of Clang. Only the toolchain_cpu and toolchain_os variables need to\n# be specified by the invoker, and optionally toolprefix if it's a\n# cross-compile case. Note that for a cross-compile case this toolchain\n# requires a config to pass the appropriate -target option, or else it will\n# actually just be doing a native compile. The invoker can optionally override\n# use_gold too.\ntemplate(\"clang_toolchain\") {\n  if (defined(invoker.toolprefix)) {\n    toolprefix = invoker.toolprefix\n  } else {\n    toolprefix = \"\"\n  }\n\n  gcc_toolchain(target_name) {\n    prefix = rebase_path(\"$clang_base_path/bin\", root_build_dir)\n    cc = \"$prefix/clang\"\n    cxx = \"$prefix/clang++\"\n    ld = cxx\n\n    readelf = \"${toolprefix}readelf\"\n    ar = \"${toolprefix}ar\"\n    nm = \"${toolprefix}nm\"\n\n    forward_variables_from(invoker, [ \"strip\" ])\n\n    toolchain_args = {\n      if (defined(invoker.toolchain_args)) {\n        forward_variables_from(invoker.toolchain_args, \"*\")\n      }\n      is_clang = true\n    }\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/icu.gn",
    "content": "# Copyright 2016 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/linux/pkg_config.gni\")\nimport(\"//build/shim_headers.gni\")\n\ngroup(\"icu\") {\n  public_deps = [\n    \":icui18n\",\n    \":icuuc\",\n  ]\n}\n\nconfig(\"icu_config\") {\n  defines = [\n    \"USING_SYSTEM_ICU=1\",\n    \"ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC\",\n  ]\n}\n\npkg_config(\"system_icui18n\") {\n  packages = [ \"icu-i18n\" ]\n}\n\npkg_config(\"system_icuuc\") {\n  packages = [ \"icu-uc\" ]\n}\n\nsource_set(\"icui18n\") {\n  deps = [\n    \":icui18n_shim\",\n  ]\n  public_configs = [\n    \":icu_config\",\n    \":system_icui18n\",\n  ]\n}\n\nsource_set(\"icuuc\") {\n  deps = [\n    \":icuuc_shim\",\n  ]\n  public_configs = [\n    \":icu_config\",\n    \":system_icuuc\",\n  ]\n}\n\nshim_headers(\"icui18n_shim\") {\n  root_path = \"source/i18n\"\n  headers = [\n    # This list can easily be updated using the command below:\n    # find third_party/icu/source/i18n/unicode \\\n    # -iname '*.h' -printf '\"%p\",\\n' | \\\n    # sed -e 's|third_party/icu/i18n/common/||' | sort -u\n    \"unicode/alphaindex.h\",\n    \"unicode/basictz.h\",\n    \"unicode/calendar.h\",\n    \"unicode/choicfmt.h\",\n    \"unicode/coleitr.h\",\n    \"unicode/coll.h\",\n    \"unicode/compactdecimalformat.h\",\n    \"unicode/curramt.h\",\n    \"unicode/currpinf.h\",\n    \"unicode/currunit.h\",\n    \"unicode/datefmt.h\",\n    \"unicode/dcfmtsym.h\",\n    \"unicode/decimfmt.h\",\n    \"unicode/dtfmtsym.h\",\n    \"unicode/dtitvfmt.h\",\n    \"unicode/dtitvinf.h\",\n    \"unicode/dtptngen.h\",\n    \"unicode/dtrule.h\",\n    \"unicode/fieldpos.h\",\n    \"unicode/fmtable.h\",\n    \"unicode/format.h\",\n    \"unicode/fpositer.h\",\n    \"unicode/gender.h\",\n    \"unicode/gregocal.h\",\n    \"unicode/locdspnm.h\",\n    \"unicode/measfmt.h\",\n    \"unicode/measunit.h\",\n    \"unicode/measure.h\",\n    \"unicode/msgfmt.h\",\n    \"unicode/numfmt.h\",\n    \"unicode/numsys.h\",\n    \"unicode/plurfmt.h\",\n    \"unicode/plurrule.h\",\n    \"unicode/rbnf.h\",\n    \"unicode/rbtz.h\",\n    \"unicode/regex.h\",\n    \"unicode/region.h\",\n    \"unicode/reldatefmt.h\",\n    \"unicode/scientificnumberformatter.h\",\n    \"unicode/search.h\",\n    \"unicode/selfmt.h\",\n    \"unicode/simpletz.h\",\n    \"unicode/smpdtfmt.h\",\n    \"unicode/sortkey.h\",\n    \"unicode/stsearch.h\",\n    \"unicode/tblcoll.h\",\n    \"unicode/timezone.h\",\n    \"unicode/tmunit.h\",\n    \"unicode/tmutamt.h\",\n    \"unicode/tmutfmt.h\",\n    \"unicode/translit.h\",\n    \"unicode/tzfmt.h\",\n    \"unicode/tznames.h\",\n    \"unicode/tzrule.h\",\n    \"unicode/tztrans.h\",\n    \"unicode/ucal.h\",\n    \"unicode/ucol.h\",\n    \"unicode/ucoleitr.h\",\n    \"unicode/ucsdet.h\",\n    \"unicode/ucurr.h\",\n    \"unicode/udat.h\",\n    \"unicode/udateintervalformat.h\",\n    \"unicode/udatpg.h\",\n    \"unicode/udisplaycontext.h\",\n    \"unicode/ufieldpositer.h\",\n    \"unicode/uformattable.h\",\n    \"unicode/ugender.h\",\n    \"unicode/uldnames.h\",\n    \"unicode/ulocdata.h\",\n    \"unicode/umsg.h\",\n    \"unicode/unirepl.h\",\n    \"unicode/unum.h\",\n    \"unicode/unumsys.h\",\n    \"unicode/upluralrules.h\",\n    \"unicode/uregex.h\",\n    \"unicode/uregion.h\",\n    \"unicode/usearch.h\",\n    \"unicode/uspoof.h\",\n    \"unicode/utmscale.h\",\n    \"unicode/utrans.h\",\n    \"unicode/vtzone.h\",\n  ]\n}\n\nshim_headers(\"icuuc_shim\") {\n  root_path = \"source/common\"\n  headers = [\n    # This list can easily be updated using the command below:\n    # find third_party/icu/source/common/unicode \\\n    # -iname '*.h' -printf '\"%p\",\\n' | \\\n    # sed -e 's|third_party/icu/source/common/||' | sort -u\n    \"unicode/appendable.h\",\n    \"unicode/brkiter.h\",\n    \"unicode/bytestream.h\",\n    \"unicode/bytestrie.h\",\n    \"unicode/bytestriebuilder.h\",\n    \"unicode/caniter.h\",\n    \"unicode/chariter.h\",\n    \"unicode/dbbi.h\",\n    \"unicode/docmain.h\",\n    \"unicode/dtintrv.h\",\n    \"unicode/enumset.h\",\n    \"unicode/errorcode.h\",\n    \"unicode/filteredbrk.h\",\n    \"unicode/icudataver.h\",\n    \"unicode/icuplug.h\",\n    \"unicode/idna.h\",\n    \"unicode/listformatter.h\",\n    \"unicode/localpointer.h\",\n    \"unicode/locid.h\",\n    \"unicode/messagepattern.h\",\n    \"unicode/normalizer2.h\",\n    \"unicode/normlzr.h\",\n    \"unicode/parseerr.h\",\n    \"unicode/parsepos.h\",\n    \"unicode/platform.h\",\n    \"unicode/ptypes.h\",\n    \"unicode/putil.h\",\n    \"unicode/rbbi.h\",\n    \"unicode/rep.h\",\n    \"unicode/resbund.h\",\n    \"unicode/schriter.h\",\n    \"unicode/std_string.h\",\n    \"unicode/strenum.h\",\n    \"unicode/stringpiece.h\",\n    \"unicode/stringtriebuilder.h\",\n    \"unicode/symtable.h\",\n    \"unicode/ubidi.h\",\n    \"unicode/ubrk.h\",\n    \"unicode/ucasemap.h\",\n    \"unicode/ucat.h\",\n    \"unicode/uchar.h\",\n    \"unicode/ucharstrie.h\",\n    \"unicode/ucharstriebuilder.h\",\n    \"unicode/uchriter.h\",\n    \"unicode/uclean.h\",\n    \"unicode/ucnv.h\",\n    \"unicode/ucnv_cb.h\",\n    \"unicode/ucnv_err.h\",\n    \"unicode/ucnvsel.h\",\n    \"unicode/uconfig.h\",\n    \"unicode/udata.h\",\n    \"unicode/uenum.h\",\n    \"unicode/uidna.h\",\n    \"unicode/uiter.h\",\n    \"unicode/ulistformatter.h\",\n    \"unicode/uloc.h\",\n    \"unicode/umachine.h\",\n    \"unicode/umisc.h\",\n    \"unicode/unifilt.h\",\n    \"unicode/unifunct.h\",\n    \"unicode/unimatch.h\",\n    \"unicode/uniset.h\",\n    \"unicode/unistr.h\",\n    \"unicode/unorm.h\",\n    \"unicode/unorm2.h\",\n    \"unicode/uobject.h\",\n    \"unicode/urename.h\",\n    \"unicode/urep.h\",\n    \"unicode/ures.h\",\n    \"unicode/uscript.h\",\n    \"unicode/uset.h\",\n    \"unicode/usetiter.h\",\n    \"unicode/ushape.h\",\n    \"unicode/usprep.h\",\n    \"unicode/ustring.h\",\n    \"unicode/ustringtrie.h\",\n    \"unicode/utext.h\",\n    \"unicode/utf.h\",\n    \"unicode/utf16.h\",\n    \"unicode/utf32.h\",\n    \"unicode/utf8.h\",\n    \"unicode/utf_old.h\",\n    \"unicode/utrace.h\",\n    \"unicode/utypes.h\",\n    \"unicode/uvernum.h\",\n    \"unicode/uversion.h\",\n  ]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/internal_rules.gni",
    "content": "# Copyright 2014 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\n# Do not add any imports to non-//build directories here.\n# Some projects (e.g. V8) do not have non-build directories DEPS'ed in.\nimport(\"//build_overrides/build.gni\")\nimport(\"//build/config/android/config.gni\")\nimport(\"//build/config/dcheck_always_on.gni\")\nimport(\"//build/config/sanitizers/sanitizers.gni\")\n\nassert(is_android)\n\n# These identify targets that have .build_config files (except for android_apk,\n# java_binary, resource_rewriter, since we never need to depend on these).\n_java_target_whitelist = [\n  \"*:*_java\",\n  \"*:*_javalib\",\n  \"*:*_java_*\",  # e.g. java_test_support\n  \"*:java\",\n  \"*:junit\",\n  \"*:junit_*\",\n  \"*:*_junit_*\",\n  \"*:*javatests\",\n  \"*:*_assets\",\n  \"*android*:assets\",\n  \"*:*_apk_*resources\",\n  \"*android*:resources\",\n  \"*:*_resources\",\n  \"*:*_grd\",\n  \"*:*locale_paks\",\n\n  # TODO(agrieve): Rename targets below to match above patterns.\n  \"*android_webview/glue:glue\",\n  \"//build/android/rezip:rezip\",\n  \"//chrome/test/android/cast_emulator:cast_emulator\",\n]\n\n# Targets that match the whitelist but are not actually java targets.\n_java_target_blacklist = [\n  \"//chrome:packed_resources\",\n  \"//remoting/android:remoting_android_raw_resources\",\n  \"*:*_unpack_aar\",\n]\n\n# Write the target's .build_config file. This is a json file that contains a\n# dictionary of information about how to build this target (things that\n# require knowledge about this target's dependencies and cannot be calculated\n# at gn-time). There is a special syntax to add a value in that dictionary to\n# an action/action_foreachs args:\n#   --python-arg=@FileArg($rebased_build_config_path:key0:key1)\n# At runtime, such an arg will be replaced by the value in the build_config.\n# See build/android/gyp/write_build_config.py and\n# build/android/gyp/util/build_utils.py:ExpandFileArgs\ntemplate(\"write_build_config\") {\n  type = invoker.type\n  _is_prebuilt_binary =\n      defined(invoker.is_prebuilt_binary) && invoker.is_prebuilt_binary\n\n  # Don't need to enforce naming scheme for these targets since we never\n  # consider them in dependency chains.\n  if (!_is_prebuilt_binary && type != \"android_apk\" && type != \"java_binary\" &&\n      type != \"resource_rewriter\") {\n    set_sources_assignment_filter(_java_target_whitelist)\n    _parent_invoker = invoker.invoker\n    _target_label =\n        get_label_info(\":${_parent_invoker.target_name}\", \"label_no_toolchain\")\n    sources = [\n      _target_label,\n    ]\n    if (sources != []) {\n      set_sources_assignment_filter(_java_target_blacklist)\n      sources = []\n      sources = [\n        _target_label,\n      ]\n      if (sources != []) {\n        assert(false, \"Invalid java target name: $_target_label\")\n      }\n    }\n    sources = []\n  }\n\n  action(target_name) {\n    set_sources_assignment_filter([])\n    build_config = invoker.build_config\n\n    assert(type == \"android_apk\" || type == \"java_library\" ||\n           type == \"android_resources\" || type == \"deps_dex\" ||\n           type == \"android_assets\" || type == \"resource_rewriter\" ||\n           type == \"java_binary\" || type == \"group\" || type == \"java_prebuilt\")\n\n    forward_variables_from(invoker,\n                           [\n                             \"deps\",\n                             \"testonly\",\n                           ])\n    if (!defined(deps)) {\n      deps = []\n    }\n\n    script = \"//build/android/gyp/write_build_config.py\"\n    depfile = \"$target_gen_dir/$target_name.d\"\n    inputs = []\n\n    _deps_configs = []\n    if (defined(invoker.possible_config_deps)) {\n      foreach(_possible_dep, invoker.possible_config_deps) {\n        set_sources_assignment_filter(_java_target_whitelist)\n        _target_label = get_label_info(_possible_dep, \"label_no_toolchain\")\n        sources = [\n          _target_label,\n        ]\n        if (sources == []) {\n          set_sources_assignment_filter(_java_target_blacklist)\n          sources = []\n          sources = [\n            _target_label,\n          ]\n          if (sources != []) {\n            deps += [ \"${_target_label}__build_config\" ]\n            _dep_gen_dir = get_label_info(_possible_dep, \"target_gen_dir\")\n            _dep_name = get_label_info(_possible_dep, \"name\")\n            _deps_configs += [ \"$_dep_gen_dir/$_dep_name.build_config\" ]\n          }\n        }\n        sources = []\n      }\n      set_sources_assignment_filter([])\n    }\n    _rebased_deps_configs = rebase_path(_deps_configs, root_build_dir)\n\n    outputs = [\n      build_config,\n    ]\n\n    args = [\n      \"--type\",\n      type,\n      \"--depfile\",\n      rebase_path(depfile, root_build_dir),\n      \"--deps-configs=$_rebased_deps_configs\",\n      \"--build-config\",\n      rebase_path(build_config, root_build_dir),\n    ]\n\n    is_java = type == \"java_library\" || type == \"java_binary\" ||\n              type == \"java_prebuilt\"\n    is_apk = type == \"android_apk\"\n    is_android_assets = type == \"android_assets\"\n    is_android_resources = type == \"android_resources\"\n    is_deps_dex = type == \"deps_dex\"\n    is_group = type == \"group\"\n\n    supports_android = is_apk || is_android_assets || is_android_resources ||\n                       is_deps_dex || is_group ||\n                       (is_java && defined(invoker.supports_android) &&\n                        invoker.supports_android)\n    requires_android =\n        is_apk || is_android_assets || is_android_resources || is_deps_dex ||\n        (is_java && defined(invoker.requires_android) &&\n         invoker.requires_android)\n\n    assert(!requires_android || supports_android,\n           \"requires_android requires\" + \" supports_android\")\n\n    # Mark these variables as used.\n    assert(is_java || true)\n    assert(is_apk || true)\n    assert(is_android_resources || true)\n    assert(is_deps_dex || true)\n    assert(is_group || true)\n\n    if (is_java || is_apk) {\n      args += [\n        \"--jar-path\",\n        rebase_path(invoker.jar_path, root_build_dir),\n      ]\n    }\n\n    if (is_apk || is_deps_dex || (is_java && supports_android)) {\n      args += [\n        \"--dex-path\",\n        rebase_path(invoker.dex_path, root_build_dir),\n      ]\n    }\n    if (supports_android) {\n      args += [ \"--supports-android\" ]\n    }\n    if (requires_android) {\n      args += [ \"--requires-android\" ]\n    }\n    if (defined(invoker.bypass_platform_checks) &&\n        invoker.bypass_platform_checks) {\n      args += [ \"--bypass-platform-checks\" ]\n    }\n\n    if (defined(invoker.apk_under_test)) {\n      deps += [ \"${invoker.apk_under_test}__build_config\" ]\n      apk_under_test_gen_dir =\n          get_label_info(invoker.apk_under_test, \"target_gen_dir\")\n      apk_under_test_name = get_label_info(invoker.apk_under_test, \"name\")\n      apk_under_test_config =\n          \"$apk_under_test_gen_dir/$apk_under_test_name.build_config\"\n      args += [\n        \"--tested-apk-config\",\n        rebase_path(apk_under_test_config, root_build_dir),\n      ]\n    }\n\n    if (is_android_assets) {\n      if (defined(invoker.asset_sources)) {\n        _rebased_asset_sources =\n            rebase_path(invoker.asset_sources, root_build_dir)\n        args += [ \"--asset-sources=$_rebased_asset_sources\" ]\n      }\n      if (defined(invoker.asset_renaming_sources)) {\n        _rebased_asset_renaming_sources =\n            rebase_path(invoker.asset_renaming_sources, root_build_dir)\n        args += [ \"--asset-renaming-sources=$_rebased_asset_renaming_sources\" ]\n\n        # These are zip paths, so no need to rebase.\n        args += [ \"--asset-renaming-destinations=${invoker.asset_renaming_destinations}\" ]\n      }\n      if (defined(invoker.disable_compression) && invoker.disable_compression) {\n        args += [ \"--disable-asset-compression\" ]\n      }\n    }\n\n    if (is_android_resources || is_apk) {\n      assert(defined(invoker.resources_zip))\n      args += [\n        \"--resources-zip\",\n        rebase_path(invoker.resources_zip, root_build_dir),\n      ]\n      if (defined(invoker.android_manifest)) {\n        inputs += [ invoker.android_manifest ]\n        args += [\n          \"--android-manifest\",\n          rebase_path(invoker.android_manifest, root_build_dir),\n        ]\n      } else {\n        assert(!is_apk, \"apk build configs require an android_manifest\")\n      }\n      if (defined(invoker.custom_package)) {\n        args += [\n          \"--package-name\",\n          invoker.custom_package,\n        ]\n      }\n      if (defined(invoker.r_text)) {\n        args += [\n          \"--r-text\",\n          rebase_path(invoker.r_text, root_build_dir),\n        ]\n      }\n    }\n\n    if (is_android_resources && defined(invoker.resource_dirs)) {\n      resource_dirs = rebase_path(invoker.resource_dirs, root_build_dir)\n      args += [ \"--resource-dirs=$resource_dirs\" ]\n    }\n\n    if (is_apk) {\n      if (defined(invoker.shared_libraries_runtime_deps_file)) {\n        # Don't list shared_libraries_runtime_deps_file as an input in order to\n        # avoid having to depend on the runtime_deps target. See comment in\n        # rules.gni for why we do this.\n        args += [\n          \"--shared-libraries-runtime-deps\",\n          rebase_path(invoker.shared_libraries_runtime_deps_file,\n                      root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.secondary_abi_shared_libraries_runtime_deps_file)) {\n        # Don't list secondary_abi_shared_libraries_runtime_deps_file as an\n        # input in order to avoid having to depend on the runtime_deps target.\n        # See comment in rules.gni for why we do this.\n        args += [\n          \"--secondary-abi-shared-libraries-runtime-deps\",\n          rebase_path(invoker.secondary_abi_shared_libraries_runtime_deps_file,\n                      root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.proguard_enabled) && invoker.proguard_enabled) {\n        args += [\n          \"--proguard-enabled\",\n          \"--proguard-info\",\n          rebase_path(invoker.proguard_info, root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.apk_path)) {\n        _rebased_apk_path = rebase_path(invoker.apk_path, root_build_dir)\n        _rebased_incremental_apk_path =\n            rebase_path(invoker.incremental_apk_path, root_build_dir)\n        _rebased_incremental_install_script_path =\n            rebase_path(invoker.incremental_install_script_path, root_build_dir)\n        args += [ \"--apk-path=$_rebased_apk_path\" ]\n        args += [ \"--incremental-apk-path=$_rebased_incremental_apk_path\" ]\n        args += [ \"--incremental-install-script-path=$_rebased_incremental_install_script_path\" ]\n      }\n    }\n\n    if (defined(invoker.java_sources_file)) {\n      args += [\n        \"--java-sources-file\",\n        rebase_path(invoker.java_sources_file, root_build_dir),\n      ]\n    }\n    if (defined(invoker.srcjar)) {\n      args += [\n        \"--srcjar\",\n        rebase_path(invoker.srcjar, root_build_dir),\n      ]\n    }\n    if (defined(invoker.bundled_srcjars)) {\n      _rebased_bundled_srcjars =\n          rebase_path(invoker.bundled_srcjars, root_build_dir)\n      args += [ \"--bundled-srcjars=$_rebased_bundled_srcjars\" ]\n    }\n    if (defined(invoker.input_jars_paths)) {\n      _rebased_input_jars_paths =\n          rebase_path(invoker.input_jars_paths, root_build_dir)\n      args += [ \"--extra-classpath-jars=$_rebased_input_jars_paths\" ]\n    }\n    if (defined(invoker.proguard_configs)) {\n      _rebased_proguard_configs =\n          rebase_path(invoker.proguard_configs, root_build_dir)\n      args += [ \"--proguard-configs=$_rebased_proguard_configs\" ]\n    }\n    if (defined(invoker.gradle_treat_as_prebuilt) &&\n        invoker.gradle_treat_as_prebuilt) {\n      args += [ \"--gradle-treat-as-prebuilt\" ]\n    }\n    if (defined(invoker.main_class)) {\n      args += [\n        \"--main-class\",\n        invoker.main_class,\n      ]\n    }\n    if (current_toolchain != default_toolchain) {\n      # This has to be a built-time error rather than a GN assert because many\n      # packages have a mix of java and non-java targets. For example, the\n      # following would fail even though nothing depends on :bar(//baz):\n      #\n      # shared_library(\"foo\") {\n      # }\n      #\n      # android_library(\"bar\") {\n      #   deps = [ \":foo(//baz)\" ]\n      #   assert(current_toolchain == default_toolchain)\n      # }\n      _msg = [\n        \"Tried to build an Android target in a non-default toolchain.\",\n        \"target: \" + get_label_info(\":$target_name\", \"label_with_toolchain\"),\n        \"default_toolchain: $default_toolchain\",\n      ]\n      args += [ \"--fail=$_msg\" ]\n    }\n  }\n}\n\ntemplate(\"copy_ex\") {\n  set_sources_assignment_filter([])\n  action(target_name) {\n    forward_variables_from(invoker,\n                           [\n                             \"data\",\n                             \"deps\",\n                             \"inputs\",\n                             \"sources\",\n                             \"testonly\",\n                             \"visibility\",\n                           ])\n    if (!defined(sources)) {\n      sources = []\n    }\n    script = \"//build/android/gyp/copy_ex.py\"\n    depfile = \"$target_gen_dir/$target_name.d\"\n\n    _stamp_file = \"$target_gen_dir/$target_name.stamp\"\n    outputs = [\n      _stamp_file,\n    ]\n\n    args = [\n      \"--depfile\",\n      rebase_path(depfile, root_build_dir),\n      \"--stamp\",\n      rebase_path(_stamp_file, root_build_dir),\n      \"--dest\",\n      rebase_path(invoker.dest, root_build_dir),\n    ]\n    rebased_sources = rebase_path(sources, root_build_dir)\n    args += [ \"--files=$rebased_sources\" ]\n\n    if (defined(invoker.clear_dir) && invoker.clear_dir) {\n      args += [ \"--clear\" ]\n    }\n\n    if (defined(invoker.args)) {\n      args += invoker.args\n    }\n\n    if (defined(invoker.renaming_sources) &&\n        defined(invoker.renaming_destinations)) {\n      sources += invoker.renaming_sources\n      rebased_renaming_sources =\n          rebase_path(invoker.renaming_sources, root_build_dir)\n      args += [ \"--renaming-sources=$rebased_renaming_sources\" ]\n\n      renaming_destinations = invoker.renaming_destinations\n      args += [ \"--renaming-destinations=$renaming_destinations\" ]\n    }\n  }\n}\n\n# Generates a script in the build bin directory which runs the test\n# target using the test runner script in build/android/test_runner.py.\ntemplate(\"test_runner_script\") {\n  testonly = true\n  _test_name = invoker.test_name\n  _test_type = invoker.test_type\n  _incremental_install =\n      defined(invoker.incremental_install) && invoker.incremental_install\n\n  _runtime_deps =\n      !defined(invoker.ignore_all_data_deps) || !invoker.ignore_all_data_deps\n\n  if (_runtime_deps) {\n    # This runtime_deps file is used at runtime and thus cannot go in\n    # target_gen_dir.\n    _target_dir_name = get_label_info(\":$target_name\", \"dir\")\n    _runtime_deps_file =\n        \"$root_out_dir/gen.runtime/$_target_dir_name/$target_name.runtime_deps\"\n    _runtime_deps_target = \"${target_name}__write_deps\"\n    group(_runtime_deps_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"data\",\n                               \"data_deps\",\n                               \"deps\",\n                               \"public_deps\",\n                             ])\n      write_runtime_deps = _runtime_deps_file\n    }\n  }\n\n  action(target_name) {\n    forward_variables_from(invoker,\n                           [\n                             \"data_deps\",\n                             \"deps\",\n                           ])\n    if (!defined(deps)) {\n      deps = []\n    }\n    if (!defined(data_deps)) {\n      data_deps = []\n    }\n\n    script = \"//build/android/gyp/create_test_runner_script.py\"\n    depfile = \"$target_gen_dir/$target_name.d\"\n\n    data_deps += [ \"//build/android:test_runner_py\" ]\n    data = []\n\n    test_runner_args = [\n      _test_type,\n      \"--output-directory\",\n      rebase_path(root_build_dir, root_build_dir),\n    ]\n\n    if (_runtime_deps) {\n      deps += [ \":$_runtime_deps_target\" ]\n      data += [ _runtime_deps_file ]\n      test_runner_args += [\n        \"--runtime-deps-path\",\n        rebase_path(_runtime_deps_file, root_build_dir),\n      ]\n    }\n\n    # apk_target is not used for native executable tests\n    # (e.g. breakpad_unittests).\n    if (defined(invoker.apk_target)) {\n      assert(!defined(invoker.executable_dist_dir))\n      deps += [ \"${invoker.apk_target}__build_config\" ]\n      _apk_build_config =\n          get_label_info(invoker.apk_target, \"target_gen_dir\") + \"/\" +\n          get_label_info(invoker.apk_target, \"name\") + \".build_config\"\n      _rebased_apk_build_config = rebase_path(_apk_build_config, root_build_dir)\n      assert(_rebased_apk_build_config != \"\")  # Mark as used.\n    } else if (_test_type == \"gtest\") {\n      assert(\n          defined(invoker.executable_dist_dir),\n          \"Must define either apk_target or executable_dist_dir for test_runner_script()\")\n      test_runner_args += [\n        \"--executable-dist-dir\",\n        rebase_path(invoker.executable_dist_dir, root_build_dir),\n      ]\n    }\n\n    if (_test_type == \"gtest\") {\n      assert(defined(invoker.test_suite))\n      test_runner_args += [\n        \"--suite\",\n        invoker.test_suite,\n      ]\n    } else if (_test_type == \"instrumentation\") {\n      _test_apk = \"@FileArg($_rebased_apk_build_config:deps_info:apk_path)\"\n      if (_incremental_install) {\n        _test_apk = \"@FileArg($_rebased_apk_build_config:deps_info:incremental_apk_path)\"\n      }\n      test_runner_args += [\n        \"--test-apk=$_test_apk\",\n        \"--test-jar\",\n        rebase_path(invoker.test_jar, root_build_dir),\n      ]\n      if (defined(invoker.apk_under_test)) {\n        deps += [ \"${invoker.apk_under_test}__build_config\" ]\n        _apk_under_test_build_config =\n            get_label_info(invoker.apk_under_test, \"target_gen_dir\") + \"/\" +\n            get_label_info(invoker.apk_under_test, \"name\") + \".build_config\"\n        _rebased_apk_under_test_build_config =\n            rebase_path(_apk_under_test_build_config, root_build_dir)\n        _apk_under_test =\n            \"@FileArg($_rebased_apk_under_test_build_config:deps_info:apk_path)\"\n        if (_incremental_install) {\n          _apk_under_test = \"@FileArg($_rebased_apk_under_test_build_config:deps_info:incremental_apk_path)\"\n        }\n        test_runner_args += [ \"--apk-under-test=$_apk_under_test\" ]\n      }\n      if (emma_coverage) {\n        # Set a default coverage output directory (can be overridden by user\n        # passing the same flag).\n        test_runner_args += [\n          \"--coverage-dir\",\n          rebase_path(\"$root_out_dir/coverage\", root_build_dir),\n        ]\n      }\n    } else if (_test_type == \"junit\") {\n      assert(defined(invoker.test_suite))\n      test_runner_args += [\n        \"--test-suite\",\n        invoker.test_suite,\n      ]\n    } else {\n      assert(false, \"Invalid test type: $_test_type.\")\n    }\n\n    if (defined(invoker.additional_apks)) {\n      foreach(additional_apk, invoker.additional_apks) {\n        deps += [ \"${additional_apk}__build_config\" ]\n        _build_config = get_label_info(additional_apk, \"target_gen_dir\") + \"/\" +\n                        get_label_info(additional_apk, \"name\") + \".build_config\"\n        _rebased_build_config = rebase_path(_build_config, root_build_dir)\n        test_runner_args += [\n          \"--additional-apk\",\n          \"@FileArg($_rebased_build_config:deps_info:apk_path)\",\n        ]\n      }\n    }\n    if (defined(invoker.shard_timeout)) {\n      test_runner_args += [ \"--shard-timeout=${invoker.shard_timeout}\" ]\n    }\n    if (_incremental_install) {\n      test_runner_args += [\n        \"--test-apk-incremental-install-script\",\n        \"@FileArg($_rebased_apk_build_config:deps_info:incremental_install_script_path)\",\n      ]\n      if (defined(invoker.apk_under_test)) {\n        test_runner_args += [\n          \"--apk-under-test-incremental-install-script\",\n          \"@FileArg($_rebased_apk_under_test_build_config:deps_info:incremental_install_script_path)\",\n        ]\n      }\n      test_runner_args += [ \"--fast-local-dev\" ]\n    }\n    if (is_asan) {\n      test_runner_args += [ \"--tool=asan\" ]\n    }\n\n    generated_script = \"$root_build_dir/bin/run_${_test_name}\"\n    outputs = [\n      generated_script,\n    ]\n    data += [ generated_script ]\n\n    args = [\n      \"--depfile\",\n      rebase_path(depfile, root_build_dir),\n      \"--script-output-path\",\n      rebase_path(generated_script, root_build_dir),\n    ]\n    if (defined(android_test_runner_script)) {\n      args += [\n        \"--test-runner-path\",\n        android_test_runner_script,\n      ]\n    }\n\n    args += test_runner_args\n  }\n}\n\nif (enable_java_templates) {\n  import(\"//build/config/zip.gni\")\n  import(\"//third_party/ijar/ijar.gni\")\n  import(\"//third_party/android_platform/config.gni\")\n\n  rebased_android_sdk = rebase_path(android_sdk, root_build_dir)\n  rebased_android_sdk_build_tools =\n      rebase_path(android_sdk_build_tools, root_build_dir)\n\n  android_sdk_jar = \"$android_sdk/android.jar\"\n  rebased_android_sdk_jar = rebase_path(android_sdk_jar, root_build_dir)\n  android_default_aapt_path = \"$rebased_android_sdk_build_tools/aapt\"\n\n  android_configuration_name = \"Release\"\n  if (is_debug) {\n    android_configuration_name = \"Debug\"\n  }\n\n  template(\"android_lint\") {\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"data_deps\",\n                               \"public_deps\",\n                               \"testonly\",\n                             ])\n      if (!defined(deps)) {\n        deps = []\n      }\n\n      if (!defined(lint_suppressions_file)) {\n        lint_suppressions_file = \"//build/android/lint/suppressions.xml\"\n      }\n\n      _cache_dir = \"$root_build_dir/android_lint_cache\"\n      _result_path = \"$target_gen_dir/$target_name/result.xml\"\n      _config_path = \"$target_gen_dir/$target_name/config.xml\"\n      _suppressions_file = lint_suppressions_file\n      _platform_xml_path =\n          \"${android_sdk_root}/platform-tools/api/api-versions.xml\"\n      _rebased_lint_android_sdk_root =\n          rebase_path(lint_android_sdk_root, root_build_dir)\n\n      script = \"//build/android/gyp/lint.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      inputs = [\n        _platform_xml_path,\n        _suppressions_file,\n        invoker.android_manifest,\n      ]\n\n      outputs = [\n        _result_path,\n        _config_path,\n      ]\n\n      args = [\n        \"--lint-path=$_rebased_lint_android_sdk_root/tools/lint\",\n        \"--cache-dir\",\n        rebase_path(_cache_dir, root_build_dir),\n        \"--platform-xml-path\",\n        rebase_path(_platform_xml_path, root_build_dir),\n        \"--android-sdk-version=${lint_android_sdk_version}\",\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--config-path\",\n        rebase_path(_suppressions_file, root_build_dir),\n        \"--manifest-path\",\n        rebase_path(invoker.android_manifest, root_build_dir),\n        \"--product-dir=.\",\n        \"--processed-config-path\",\n        rebase_path(_config_path, root_build_dir),\n        \"--result-path\",\n        rebase_path(_result_path, root_build_dir),\n        \"--enable\",\n      ]\n\n      if (defined(invoker.create_cache) && invoker.create_cache) {\n        args += [\n          \"--create-cache\",\n          \"--silent\",\n        ]\n      } else {\n        inputs += invoker.java_files\n        inputs += [\n          invoker.jar_path,\n          invoker.build_config,\n        ]\n        if (invoker.java_files != []) {\n          inputs += [ invoker.java_sources_file ]\n          _rebased_java_sources_file =\n              rebase_path(invoker.java_sources_file, root_build_dir)\n          args += [ \"--java-sources-file=$_rebased_java_sources_file\" ]\n        }\n        deps += [ \"//build/android:prepare_android_lint_cache\" ]\n\n        _rebased_build_config =\n            rebase_path(invoker.build_config, root_build_dir)\n        args += [\n          \"--jar-path\",\n          rebase_path(invoker.jar_path, root_build_dir),\n          \"--classpath=@FileArg($_rebased_build_config:javac:interface_classpath)\",\n          \"--resource-sources=@FileArg($_rebased_build_config:deps_info:owned_resources_dirs)\",\n          \"--resource-sources=@FileArg($_rebased_build_config:deps_info:owned_resources_zips)\",\n          \"--can-fail-build\",\n        ]\n      }\n    }\n  }\n\n  template(\"proguard\") {\n    action(target_name) {\n      set_sources_assignment_filter([])\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"data_deps\",\n                               \"public_deps\",\n                               \"testonly\",\n                             ])\n      script = \"//build/android/gyp/proguard.py\"\n      if (defined(invoker.proguard_jar_path)) {\n        _proguard_jar_path = invoker.proguard_jar_path\n      } else {\n        _proguard_jar_path = \"//third_party/proguard/lib/proguard.jar\"\n      }\n      _output_jar_path = invoker.output_jar_path\n      inputs = [\n        _proguard_jar_path,\n      ]\n      if (defined(invoker.alternative_android_sdk_jar)) {\n        inputs += [ invoker.alternative_android_sdk_jar ]\n        _rebased_android_sdk_jar =\n            rebase_path(invoker.alternative_android_sdk_jar)\n      } else {\n        inputs += [ android_sdk_jar ]\n        _rebased_android_sdk_jar = rebased_android_sdk_jar\n      }\n      if (defined(invoker.inputs)) {\n        inputs += invoker.inputs\n      }\n      depfile = \"${target_gen_dir}/${target_name}.d\"\n      outputs = [\n        _output_jar_path,\n        \"$_output_jar_path.dump\",\n        \"$_output_jar_path.seeds\",\n        \"$_output_jar_path.mapping\",\n        \"$_output_jar_path.usage\",\n      ]\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--proguard-path\",\n        rebase_path(_proguard_jar_path, root_build_dir),\n        \"--output-path\",\n        rebase_path(_output_jar_path, root_build_dir),\n        \"--classpath\",\n        _rebased_android_sdk_jar,\n      ]\n      if (proguard_verbose) {\n        args += [ \"--verbose\" ]\n      }\n      if (defined(invoker.args)) {\n        args += invoker.args\n      }\n      if (defined(invoker.proguard_jar_path)) {\n        # We assume that if we are using a different ProGuard, this new version\n        # can handle the 'dangerous' optimizaions.\n        args += [ \"--enable-dangerous-optimizations\" ]\n      }\n    }\n  }\n\n  template(\"findbugs\") {\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"testonly\",\n                             ])\n      script = \"//build/android/findbugs_diff.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      _result_path = \"$target_gen_dir/$target_name/result.xml\"\n      _exclusions_file = \"//build/android/findbugs_filter/findbugs_exclude.xml\"\n\n      _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)\n\n      inputs = [\n        \"//build/android/pylib/utils/findbugs.py\",\n        _exclusions_file,\n        invoker.jar_path,\n        invoker.build_config,\n      ]\n\n      outputs = [\n        _result_path,\n      ]\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--exclude\",\n        rebase_path(_exclusions_file, root_build_dir),\n        \"--auxclasspath-gyp\",\n        \"@FileArg($_rebased_build_config:javac:classpath)\",\n        \"--output-file\",\n        rebase_path(_result_path, root_build_dir),\n        rebase_path(invoker.jar_path, root_build_dir),\n      ]\n\n      if (findbugs_verbose) {\n        args += [ \"-vv\" ]\n      }\n    }\n  }\n\n  # Generates a script in the build bin directory to run a java binary.\n  #\n  # Variables\n  #   main_class: The class containing the program entry point.\n  #   jar_path: The path to the jar to run.\n  #   script_name: Name of the script to generate.\n  #   build_config: Path to .build_config for the jar (contains classpath).\n  #   wrapper_script_args: List of extra arguments to pass to the executable.\n  #\n  template(\"java_binary_script\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    _main_class = invoker.main_class\n    _build_config = invoker.build_config\n    _jar_path = invoker.jar_path\n    _script_name = invoker.script_name\n\n    action(target_name) {\n      script = \"//build/android/gyp/create_java_binary_script.py\"\n      depfile = \"$target_gen_dir/$_script_name.d\"\n      java_script = \"$root_build_dir/bin/$_script_name\"\n      inputs = [\n        _build_config,\n      ]\n      outputs = [\n        java_script,\n      ]\n      forward_variables_from(invoker, [ \"deps\" ])\n      _rebased_build_config = rebase_path(_build_config, root_build_dir)\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--output\",\n        rebase_path(java_script, root_build_dir),\n        \"--classpath=@FileArg($_rebased_build_config:deps_info:java:full_classpath)\",\n        \"--jar-path\",\n        rebase_path(_jar_path, root_build_dir),\n        \"--main-class\",\n        _main_class,\n      ]\n      if (emma_coverage) {\n        args += [\n          \"--classpath\",\n          rebase_path(\"//third_party/android_tools/sdk/tools/lib/emma.jar\",\n                      root_build_dir),\n        ]\n        args += [ \"--noverify\" ]\n      }\n      if (defined(invoker.wrapper_script_args)) {\n        args += [ \"--\" ] + invoker.wrapper_script_args\n      }\n      if (defined(invoker.bootclasspath)) {\n        args += [\n          \"--bootclasspath\",\n          rebase_path(invoker.bootclasspath, root_build_dir),\n        ]\n      }\n    }\n  }\n\n  template(\"dex\") {\n    set_sources_assignment_filter([])\n\n    _enable_multidex =\n        defined(invoker.enable_multidex) && invoker.enable_multidex\n\n    if (_enable_multidex) {\n      _main_dex_list_path = invoker.output + \".main_dex_list\"\n      _main_dex_list_target_name = \"${target_name}__main_dex_list\"\n      action(_main_dex_list_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"deps\",\n                                 \"inputs\",\n                                 \"sources\",\n                                 \"testonly\",\n                               ])\n\n        script = \"//build/android/gyp/main_dex_list.py\"\n        depfile = \"$target_gen_dir/$target_name.d\"\n\n        main_dex_rules = \"//build/android/main_dex_classes.flags\"\n\n        if (!defined(inputs)) {\n          inputs = []\n        }\n        inputs += [ main_dex_rules ]\n\n        outputs = [\n          _main_dex_list_path,\n        ]\n\n        args = [\n          \"--depfile\",\n          rebase_path(depfile, root_build_dir),\n          \"--android-sdk-tools\",\n          rebased_android_sdk_build_tools,\n          \"--main-dex-list-path\",\n          rebase_path(_main_dex_list_path, root_build_dir),\n          \"--main-dex-rules-path\",\n          rebase_path(main_dex_rules, root_build_dir),\n        ]\n\n        if (defined(invoker.args)) {\n          args += invoker.args\n        }\n\n        if (defined(invoker.sources)) {\n          args += rebase_path(invoker.sources, root_build_dir)\n        }\n      }\n    }\n\n    assert(defined(invoker.output))\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"inputs\",\n                               \"sources\",\n                               \"testonly\",\n                             ])\n      script = \"//build/android/gyp/dex.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      outputs = [\n        invoker.output,\n      ]\n\n      rebased_output = rebase_path(invoker.output, root_build_dir)\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--android-sdk-tools\",\n        rebased_android_sdk_build_tools,\n        \"--dex-path\",\n        rebased_output,\n      ]\n\n      if (enable_incremental_dx) {\n        args += [ \"--incremental\" ]\n      }\n\n      # EMMA requires --no-locals.\n      if (emma_coverage) {\n        args += [ \"--no-locals=1\" ]\n      }\n\n      if (_enable_multidex) {\n        args += [\n          \"--multi-dex\",\n          \"--main-dex-list-path\",\n          rebase_path(_main_dex_list_path, root_build_dir),\n        ]\n        deps += [ \":${_main_dex_list_target_name}\" ]\n        inputs += [ _main_dex_list_path ]\n      }\n\n      if (defined(invoker.args)) {\n        args += invoker.args\n      }\n\n      if (defined(invoker.sources)) {\n        args += rebase_path(invoker.sources, root_build_dir)\n      }\n    }\n  }\n\n  template(\"process_java_prebuilt\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(invoker.build_config != \"\")\n    _build_config = invoker.build_config\n    _rebased_build_config = rebase_path(_build_config, root_build_dir)\n    assert(_rebased_build_config != \"\" || true)  # Mark used.\n\n    _input_jar_path = invoker.input_jar_path\n    _output_jar_path = invoker.output_jar_path\n\n    _jar_excluded_patterns = []\n    if (defined(invoker.jar_excluded_patterns)) {\n      _jar_excluded_patterns = invoker.jar_excluded_patterns\n    }\n    _strip_resource_classes = defined(invoker.strip_resource_classes) &&\n                              invoker.strip_resource_classes\n    _filter_jar = _jar_excluded_patterns != [] || _strip_resource_classes\n\n    _proguard_preprocess =\n        defined(invoker.proguard_preprocess) && invoker.proguard_preprocess\n\n    _enable_assert =\n        defined(invoker.supports_android) && invoker.supports_android &&\n        (is_java_debug || dcheck_always_on)\n\n    _retrolambda = defined(invoker.supports_android) &&\n                   invoker.supports_android && use_java8\n\n    _deps = []\n    _previous_output_jar = _input_jar_path\n\n    if (_filter_jar) {\n      _filter_target = \"${target_name}__filter\"\n      _filter_input_jar = _previous_output_jar\n      _filter_output_jar = \"$target_out_dir/$target_name-filtered.jar\"\n\n      action(_filter_target) {\n        script = \"//build/android/gyp/jar.py\"\n        deps = _deps\n        if (defined(invoker.deps)) {\n          deps += invoker.deps\n        }\n        if (defined(invoker.public_deps)) {\n          public_deps = invoker.public_deps\n        }\n        inputs = [\n          _build_config,\n          _filter_input_jar,\n        ]\n        outputs = [\n          _filter_output_jar,\n        ]\n        args = [\n          \"--input-jar\",\n          rebase_path(_filter_input_jar, root_build_dir),\n          \"--jar-path\",\n          rebase_path(_filter_output_jar, root_build_dir),\n          \"--excluded-classes=$_jar_excluded_patterns\",\n        ]\n        if (_strip_resource_classes) {\n          args += [ \"--strip-resource-classes-for=@FileArg($_rebased_build_config:javac:resource_packages)\" ]\n        }\n      }\n\n      _deps = []\n      _deps = [ \":$_filter_target\" ]\n      _previous_output_jar = _filter_output_jar\n    }\n\n    if (_proguard_preprocess) {\n      _proguard_target = \"${target_name}__proguard_process\"\n      _proguard_input_jar = _previous_output_jar\n      _proguard_output_jar = \"$target_out_dir/$target_name-proguarded.jar\"\n      _proguard_config_path = invoker.proguard_preprocess_config\n\n      proguard(_proguard_target) {\n        deps = _deps\n        if (defined(invoker.deps)) {\n          deps += invoker.deps\n        }\n        if (defined(invoker.public_deps)) {\n          public_deps = invoker.public_deps\n        }\n        inputs = [\n          _build_config,\n          _proguard_config_path,\n          _proguard_input_jar,\n        ]\n        output_jar_path = _proguard_output_jar\n\n        _rebased_input_paths =\n            [ rebase_path(_proguard_input_jar, root_build_dir) ]\n        _rebased_proguard_configs =\n            [ rebase_path(_proguard_config_path, root_build_dir) ]\n        args = [\n          \"--input-paths=$_rebased_input_paths\",\n          \"--proguard-configs=$_rebased_proguard_configs\",\n          \"--classpath=@FileArg($_rebased_build_config:javac:classpath)\",\n        ]\n      }\n\n      _deps = []\n      _deps = [ \":$_proguard_target\" ]\n      _previous_output_jar = _proguard_output_jar\n    }\n\n    if (_enable_assert) {\n      _assert_target = \"${target_name}__assert\"\n      _assert_input_jar = _previous_output_jar\n      _assert_output_jar = \"$target_out_dir/$target_name-asserted.jar\"\n\n      action(_assert_target) {\n        script = \"$root_build_dir/bin/helper/java_assertion_enabler\"\n        deps = [\n          \"//build/android/java_assertion_enabler($default_toolchain)\",\n        ]\n        deps += _deps\n        if (defined(invoker.deps)) {\n          deps += invoker.deps\n        }\n        if (defined(invoker.public_deps)) {\n          public_deps = invoker.public_deps\n        }\n        inputs = [\n          _assert_input_jar,\n        ]\n        outputs = [\n          _assert_output_jar,\n        ]\n        args = [\n          rebase_path(_assert_input_jar, root_build_dir),\n          rebase_path(_assert_output_jar, root_build_dir),\n        ]\n      }\n\n      _deps = []\n      _deps = [ \":$_assert_target\" ]\n      _previous_output_jar = _assert_output_jar\n    }\n\n    if (_retrolambda) {\n      _retrolambda_target = \"${target_name}__retrolambda\"\n      _retrolambda_input_jar = _previous_output_jar\n      _retrolambda_output_jar = \"$target_out_dir/$target_name-retrolambda.jar\"\n\n      android_sdk_jar = \"$android_sdk/android.jar\"\n      action(_retrolambda_target) {\n        script = \"//build/android/gyp/retrolambda.py\"\n        deps = _deps\n        if (defined(invoker.deps)) {\n          deps += invoker.deps\n        }\n        if (defined(invoker.public_deps)) {\n          public_deps = invoker.public_deps\n        }\n        inputs = [\n          _build_config,\n          _retrolambda_input_jar,\n        ]\n        outputs = [\n          _retrolambda_output_jar,\n        ]\n        args = [\n          \"--input-jar\",\n          rebase_path(_retrolambda_input_jar, root_build_dir),\n          \"--output-jar\",\n          rebase_path(_retrolambda_output_jar, root_build_dir),\n          \"--classpath=@FileArg($_rebased_build_config:javac:classpath)\",\n          \"--android-sdk-jar\",\n          rebase_path(android_sdk_jar, root_build_dir),\n        ]\n      }\n\n      _deps = []\n      _deps = [ \":$_retrolambda_target\" ]\n      _previous_output_jar = _retrolambda_output_jar\n    }\n\n    _output_jar_target = \"${target_name}__copy\"\n    copy(_output_jar_target) {\n      deps = _deps\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n      if (defined(invoker.public_deps)) {\n        public_deps = invoker.public_deps\n      }\n      sources = [\n        _previous_output_jar,\n      ]\n      outputs = [\n        _output_jar_path,\n      ]\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"data_deps\",\n                               \"visibility\",\n                             ])\n      public_deps = [\n        \":$_output_jar_target\",\n      ]\n    }\n  }\n\n  template(\"emma_instr\") {\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"testonly\",\n                             ])\n\n      _coverage_file = \"$target_out_dir/${target_name}.em\"\n      _source_dirs_listing_file = \"$target_out_dir/${target_name}_sources.txt\"\n      _emma_jar = \"${android_sdk_root}/tools/lib/emma.jar\"\n\n      script = \"//build/android/gyp/emma_instr.py\"\n      depfile = \"${target_gen_dir}/${target_name}.d\"\n      inputs = invoker.java_files + [\n                 _emma_jar,\n                 invoker.input_jar_path,\n               ]\n      outputs = [\n        _coverage_file,\n        _source_dirs_listing_file,\n        invoker.output_jar_path,\n      ]\n      args = [\n        \"instrument_jar\",\n        \"--input-path\",\n        rebase_path(invoker.input_jar_path, root_build_dir),\n        \"--output-path\",\n        rebase_path(invoker.output_jar_path, root_build_dir),\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--coverage-file\",\n        rebase_path(_coverage_file, root_build_dir),\n        \"--sources-list-file\",\n        rebase_path(_source_dirs_listing_file, root_build_dir),\n        \"--src-root\",\n        rebase_path(\"//\", root_build_dir),\n        \"--emma-jar\",\n        rebase_path(_emma_jar, root_build_dir),\n      ]\n      _rebased_java_sources_file =\n          rebase_path(invoker.java_sources_file, root_build_dir)\n      args += [ \"--java-sources-file=$_rebased_java_sources_file\" ]\n\n      if (emma_filter != \"\") {\n        args += [\n          \"--filter-string\",\n          emma_filter,\n        ]\n      }\n    }\n  }\n\n  # Creates an unsigned .apk.\n  #\n  # Variables\n  #   assets_build_config: Path to android_apk .build_config containing merged\n  #       asset information.\n  #   deps: Specifies the dependencies of this target.\n  #   dex_path: Path to classes.dex file to include (optional).\n  #   resource_packaged_apk_path: Path to .ap_ to use.\n  #   output_apk_path: Output path for the generated .apk.\n  #   native_lib_placeholders: List of placeholder filenames to add to the apk\n  #     (optional).\n  #   native_libs: List of native libraries.\n  #   native_libs_filearg: @FileArg() of additionaly native libraries.\n  #   write_asset_list: Adds an extra file to the assets, which contains a list of\n  #     all other asset files.\n  template(\"package_apk\") {\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"public_deps\",\n                               \"testonly\",\n                             ])\n      _native_lib_placeholders = []\n      if (defined(invoker.native_lib_placeholders)) {\n        _native_lib_placeholders = invoker.native_lib_placeholders\n      }\n\n      script = \"//build/android/gyp/apkbuilder.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      data_deps = [\n        \"//tools/android/md5sum\",\n      ]  # Used when deploying APKs\n\n      inputs = invoker.native_libs + [ invoker.resource_packaged_apk_path ]\n      if (defined(invoker.dex_path)) {\n        inputs += [ invoker.dex_path ]\n      }\n\n      outputs = [\n        invoker.output_apk_path,\n      ]\n\n      _rebased_resource_packaged_apk_path =\n          rebase_path(invoker.resource_packaged_apk_path, root_build_dir)\n      _rebased_packaged_apk_path =\n          rebase_path(invoker.output_apk_path, root_build_dir)\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--resource-apk=$_rebased_resource_packaged_apk_path\",\n        \"--output-apk=$_rebased_packaged_apk_path\",\n      ]\n      if (defined(invoker.assets_build_config)) {\n        inputs += [ invoker.assets_build_config ]\n        _rebased_build_config =\n            rebase_path(invoker.assets_build_config, root_build_dir)\n        args += [\n          \"--assets=@FileArg($_rebased_build_config:assets)\",\n          \"--uncompressed-assets=@FileArg($_rebased_build_config:uncompressed_assets)\",\n        ]\n      }\n      if (defined(invoker.write_asset_list) && invoker.write_asset_list) {\n        args += [ \"--write-asset-list\" ]\n      }\n      if (defined(invoker.dex_path)) {\n        _rebased_dex_path = rebase_path(invoker.dex_path, root_build_dir)\n        args += [ \"--dex-file=$_rebased_dex_path\" ]\n      }\n      if (invoker.native_libs != [] || defined(invoker.native_libs_filearg) ||\n          _native_lib_placeholders != []) {\n        args += [ \"--android-abi=$android_app_abi\" ]\n      }\n      if (invoker.native_libs != []) {\n        _rebased_native_libs = rebase_path(invoker.native_libs, root_build_dir)\n        args += [ \"--native-libs=$_rebased_native_libs\" ]\n      }\n      if (defined(invoker.native_libs_filearg)) {\n        args += [ \"--native-libs=${invoker.native_libs_filearg}\" ]\n      }\n      if (_native_lib_placeholders != []) {\n        args += [ \"--native-lib-placeholders=$_native_lib_placeholders\" ]\n      }\n\n      # TODO (michaelbai): Remove the secondary_native_libs variable.\n      if (defined(invoker.secondary_abi_native_libs_filearg)) {\n        assert(defined(android_app_secondary_abi))\n        args += [\n          \"--secondary-native-libs=${invoker.secondary_abi_native_libs_filearg}\",\n          \"--secondary-android-abi=$android_app_secondary_abi\",\n        ]\n      } else if (defined(invoker.secondary_native_libs) &&\n                 invoker.secondary_native_libs != []) {\n        assert(defined(android_app_secondary_abi))\n        inputs += invoker.secondary_native_libs\n        _secondary_native_libs = rebase_path(invoker.secondary_native_libs)\n        args += [\n          \"--secondary-native-libs=$_secondary_native_libs\",\n          \"--secondary-android-abi=$android_app_secondary_abi\",\n        ]\n      }\n\n      if (defined(invoker.emma_instrument) && invoker.emma_instrument) {\n        _emma_device_jar = \"$android_sdk_root/tools/lib/emma_device.jar\"\n        _rebased_emma_device_jar = rebase_path(_emma_device_jar, root_build_dir)\n        args += [ \"--emma-device-jar=$_rebased_emma_device_jar\" ]\n      }\n\n      if (defined(invoker.uncompress_shared_libraries) &&\n          invoker.uncompress_shared_libraries) {\n        args += [ \"--uncompress-shared-libraries\" ]\n      }\n    }\n  }\n\n  # Signs & zipaligns an apk.\n  #\n  # Variables\n  #   input_apk_path: Path of the .apk to be finalized.\n  #   output_apk_path: Output path for the generated .apk.\n  #   keystore_path: Path to keystore to use for signing.\n  #   keystore_name: Key alias to use.\n  #   keystore_password: Keystore password.\n  #   rezip_apk: Whether to add crazy-linker alignment.\n  template(\"finalize_apk\") {\n    action(target_name) {\n      deps = []\n      script = \"//build/android/gyp/finalize_apk.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"data_deps\",\n                               \"public_deps\",\n                               \"testonly\",\n                             ])\n\n      sources = [\n        invoker.input_apk_path,\n      ]\n      inputs = [\n        invoker.keystore_path,\n      ]\n      outputs = [\n        invoker.output_apk_path,\n      ]\n      data = [\n        invoker.output_apk_path,\n      ]\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--zipalign-path\",\n        rebase_path(zipalign_path, root_build_dir),\n        \"--unsigned-apk-path\",\n        rebase_path(invoker.input_apk_path, root_build_dir),\n        \"--final-apk-path\",\n        rebase_path(invoker.output_apk_path, root_build_dir),\n        \"--key-path\",\n        rebase_path(invoker.keystore_path, root_build_dir),\n        \"--key-name\",\n        invoker.keystore_name,\n        \"--key-passwd\",\n        invoker.keystore_password,\n      ]\n      if (defined(invoker.rezip_apk) && invoker.rezip_apk) {\n        deps += [ \"//build/android/rezip\" ]\n        _rezip_jar_path = \"$root_build_dir/lib.java/rezip_apk.jar\"\n        args += [\n          \"--load-library-from-zip=1\",\n          \"--rezip-apk-jar-path\",\n          rebase_path(_rezip_jar_path, root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.page_align_shared_libraries) &&\n          invoker.page_align_shared_libraries) {\n        args += [ \"--page-align-shared-libraries\" ]\n      }\n    }\n  }\n\n  # Packages resources, assets, dex, and native libraries into an apk. Signs and\n  # zipaligns the apk.\n  template(\"create_apk\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    _android_manifest = invoker.android_manifest\n    _base_path = invoker.base_path\n    _final_apk_path = invoker.apk_path\n    _incremental_final_apk_path_helper =\n        process_file_template(\n            [ _final_apk_path ],\n            \"{{source_dir}}/{{source_name_part}}_incremental.apk\")\n    _incremental_final_apk_path = _incremental_final_apk_path_helper[0]\n\n    if (defined(invoker.resources_zip)) {\n      _resources_zip = invoker.resources_zip\n      assert(_resources_zip != \"\")  # Mark as used.\n    }\n    if (defined(invoker.dex_path)) {\n      _dex_path = invoker.dex_path\n    }\n    _load_library_from_apk = invoker.load_library_from_apk\n\n    _deps = []\n    if (defined(invoker.deps)) {\n      _deps = invoker.deps\n    }\n    _incremental_deps = []\n    if (defined(invoker.incremental_deps)) {\n      _incremental_deps = invoker.incremental_deps\n    }\n    _native_libs = []\n    if (defined(invoker.native_libs)) {\n      _native_libs = invoker.native_libs\n    }\n    _native_libs_even_when_incremental = []\n    if (defined(invoker.native_libs_even_when_incremental)) {\n      _native_libs_even_when_incremental =\n          invoker.native_libs_even_when_incremental\n    }\n\n    _version_code = invoker.version_code\n    _version_name = invoker.version_name\n    assert(_version_code != -1)  # Mark as used.\n    assert(_version_name != \"\")  # Mark as used.\n\n    _base_apk_path = _base_path + \".apk_intermediates\"\n\n    _resource_packaged_apk_path = _base_apk_path + \".ap_\"\n    _incremental_resource_packaged_apk_path =\n        _base_apk_path + \"_incremental.ap_\"\n    _packaged_apk_path = _base_apk_path + \".unfinished.apk\"\n    _incremental_packaged_apk_path =\n        _base_apk_path + \"_incremental.unfinished.apk\"\n    _shared_resources =\n        defined(invoker.shared_resources) && invoker.shared_resources\n    assert(_shared_resources || true)  # Mark as used.\n    _app_as_shared_lib =\n        defined(invoker.app_as_shared_lib) && invoker.app_as_shared_lib\n    assert(_app_as_shared_lib || true)  # Mark as used.\n    assert(!(_shared_resources && _app_as_shared_lib))\n\n    _keystore_path = invoker.keystore_path\n    _keystore_name = invoker.keystore_name\n    _keystore_password = invoker.keystore_password\n\n    _split_densities = []\n    if (defined(invoker.create_density_splits) &&\n        invoker.create_density_splits) {\n      _split_densities = [\n        \"hdpi\",\n        \"xhdpi\",\n        \"xxhdpi\",\n        \"xxxhdpi\",\n        \"tvdpi\",\n      ]\n    }\n\n    _split_languages = []\n    if (defined(invoker.language_splits)) {\n      _split_languages = invoker.language_splits\n    }\n\n    template(\"package_resources_helper\") {\n      action(target_name) {\n        deps = invoker.deps\n\n        script = \"//build/android/gyp/package_resources.py\"\n        depfile = \"${target_gen_dir}/${target_name}.d\"\n        inputs = [\n          invoker.android_manifest,\n        ]\n        if (defined(_resources_zip)) {\n          inputs += [ _resources_zip ]\n        }\n        outputs = [\n          invoker.resource_packaged_apk_path,\n        ]\n\n        if (defined(invoker.android_aapt_path)) {\n          _android_aapt_path = invoker.android_aapt_path\n        } else {\n          _android_aapt_path = android_default_aapt_path\n        }\n\n        if (defined(invoker.alternative_android_sdk_jar)) {\n          _rebased_android_sdk_jar =\n              rebase_path(invoker.alternative_android_sdk_jar)\n        } else {\n          _rebased_android_sdk_jar = rebased_android_sdk_jar\n        }\n\n        args = [\n          \"--depfile\",\n          rebase_path(depfile, root_build_dir),\n          \"--android-sdk-jar\",\n          _rebased_android_sdk_jar,\n          \"--aapt-path\",\n          _android_aapt_path,\n          \"--configuration-name=$android_configuration_name\",\n          \"--android-manifest\",\n          rebase_path(invoker.android_manifest, root_build_dir),\n          \"--version-code\",\n          _version_code,\n          \"--version-name\",\n          _version_name,\n          \"--apk-path\",\n          rebase_path(invoker.resource_packaged_apk_path, root_build_dir),\n        ]\n\n        if (defined(_resources_zip)) {\n          args += [\n            \"--resource-zips\",\n            rebase_path(_resources_zip, root_build_dir),\n          ]\n        }\n        if (_shared_resources) {\n          args += [ \"--shared-resources\" ]\n        }\n        if (_app_as_shared_lib) {\n          args += [ \"--app-as-shared-lib\" ]\n        }\n        if (_split_densities != []) {\n          args += [ \"--create-density-splits\" ]\n          foreach(_density, _split_densities) {\n            outputs += [ \"${invoker.resource_packaged_apk_path}_${_density}\" ]\n          }\n        }\n        if (_split_languages != []) {\n          args += [ \"--language-splits=$_split_languages\" ]\n          foreach(_language, _split_languages) {\n            outputs += [ \"${invoker.resource_packaged_apk_path}_${_language}\" ]\n          }\n        }\n        if (defined(invoker.extensions_to_not_compress)) {\n          args += [\n            \"--no-compress\",\n            invoker.extensions_to_not_compress,\n          ]\n        }\n      }\n    }\n\n    _package_resources_target_name = \"${target_name}__package_resources\"\n    package_resources_helper(_package_resources_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"alternative_android_sdk_jar\",\n                               \"android_aapt_path\",\n                               \"extensions_to_not_compress\",\n                             ])\n      deps = _deps\n      android_manifest = _android_manifest\n      resource_packaged_apk_path = _resource_packaged_apk_path\n    }\n\n    _generate_incremental_manifest_target_name =\n        \"${target_name}_incremental_generate_manifest\"\n    _incremental_android_manifest =\n        get_label_info(_generate_incremental_manifest_target_name,\n                       \"target_gen_dir\") + \"/AndroidManifest.xml\"\n    action(_generate_incremental_manifest_target_name) {\n      deps = _incremental_deps\n      script =\n          \"//build/android/incremental_install/generate_android_manifest.py\"\n      depfile = \"${target_gen_dir}/${target_name}.d\"\n      inputs = [\n        _android_manifest,\n      ]\n      outputs = [\n        _incremental_android_manifest,\n      ]\n\n      _rebased_src_manifest = rebase_path(_android_manifest, root_build_dir)\n      _rebased_incremental_manifest =\n          rebase_path(_incremental_android_manifest, root_build_dir)\n      _rebased_depfile = rebase_path(depfile, root_build_dir)\n      args = [\n        \"--src-manifest=$_rebased_src_manifest\",\n        \"--out-manifest=$_rebased_incremental_manifest\",\n        \"--depfile=$_rebased_depfile\",\n      ]\n      if (disable_incremental_isolated_processes) {\n        args += [ \"--disable-isolated-processes\" ]\n      }\n    }\n\n    _incremental_package_resources_target_name =\n        \"${target_name}_incremental__package_resources\"\n\n    # TODO(agrieve): See if we can speed up this step by swapping the manifest\n    # from the result of the main package_resources step.\n    package_resources_helper(_incremental_package_resources_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"alternative_android_sdk_jar\",\n                               \"android_aapt_path\",\n                               \"extensions_to_not_compress\",\n                             ])\n      deps =\n          _incremental_deps + [ \":$_generate_incremental_manifest_target_name\" ]\n      android_manifest = _incremental_android_manifest\n      resource_packaged_apk_path = _incremental_resource_packaged_apk_path\n    }\n\n    package_target = \"${target_name}__package\"\n    package_apk(package_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"assets_build_config\",\n                               \"emma_instrument\",\n                               \"native_lib_placeholders\",\n                               \"native_libs_filearg\",\n                               \"secondary_abi_native_libs_filearg\",\n                               \"secondary_native_libs\",\n                               \"uncompress_shared_libraries\",\n                               \"write_asset_list\",\n                             ])\n      deps = _deps + [ \":${_package_resources_target_name}\" ]\n      native_libs = _native_libs + _native_libs_even_when_incremental\n\n      if (defined(_dex_path)) {\n        dex_path = _dex_path\n      }\n\n      output_apk_path = _packaged_apk_path\n      resource_packaged_apk_path = _resource_packaged_apk_path\n    }\n\n    _incremental_package_target = \"${target_name}_incremental__package\"\n    package_apk(_incremental_package_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"assets_build_config\",\n                               \"emma_instrument\",\n                               \"secondary_native_libs\",\n                               \"uncompress_shared_libraries\",\n                             ])\n      _dex_target = \"//build/android/incremental_install:bootstrap_java__dex\"\n      deps = _incremental_deps + [\n               \":${_incremental_package_resources_target_name}\",\n               _dex_target,\n             ]\n\n      if (defined(_dex_path)) {\n        dex_path =\n            get_label_info(_dex_target, \"target_gen_dir\") + \"/bootstrap.dex\"\n      }\n\n      native_libs = _native_libs_even_when_incremental\n\n      # http://crbug.com/384638\n      _has_native_libs =\n          defined(invoker.native_libs_filearg) || _native_libs != []\n      if (_has_native_libs && _native_libs_even_when_incremental == []) {\n        native_lib_placeholders = [ \"libfix.crbug.384638.so\" ]\n      }\n\n      output_apk_path = _incremental_packaged_apk_path\n      resource_packaged_apk_path = _incremental_resource_packaged_apk_path\n    }\n\n    _finalize_apk_rule_name = \"${target_name}__finalize\"\n    finalize_apk(_finalize_apk_rule_name) {\n      forward_variables_from(invoker, [ \"page_align_shared_libraries\" ])\n\n      input_apk_path = _packaged_apk_path\n      output_apk_path = _final_apk_path\n      keystore_path = _keystore_path\n      keystore_name = _keystore_name\n      keystore_password = _keystore_password\n      rezip_apk = _load_library_from_apk\n\n      public_deps = [\n        # Generator of the _packaged_apk_path this target takes as input.\n        \":$package_target\",\n      ]\n    }\n\n    _incremental_finalize_apk_rule_name = \"${target_name}_incremental__finalize\"\n    finalize_apk(_incremental_finalize_apk_rule_name) {\n      input_apk_path = _incremental_packaged_apk_path\n      output_apk_path = _incremental_final_apk_path\n      keystore_path = _keystore_path\n      keystore_name = _keystore_name\n      keystore_password = _keystore_password\n\n      public_deps = [\n        \":$_incremental_package_target\",\n      ]\n    }\n\n    _split_deps = []\n\n    template(\"finalize_split\") {\n      finalize_apk(target_name) {\n        _config = invoker.split_config\n        _type = invoker.split_type\n        input_apk_path = \"${_resource_packaged_apk_path}_${_config}\"\n        _output_paths = process_file_template(\n                [ _final_apk_path ],\n                \"{{source_dir}}/{{source_name_part}}-${_type}-${_config}.apk\")\n        output_apk_path = _output_paths[0]\n        keystore_path = _keystore_path\n        keystore_name = _keystore_name\n        keystore_password = _keystore_password\n        deps = [\n          \":${_package_resources_target_name}\",\n        ]\n      }\n    }\n\n    foreach(_split, _split_densities) {\n      _split_rule = \"${target_name}__finalize_${_split}_split\"\n      finalize_split(_split_rule) {\n        split_type = \"density\"\n        split_config = _split\n      }\n      _split_deps += [ \":$_split_rule\" ]\n    }\n    foreach(_split, _split_languages) {\n      _split_rule = \"${target_name}__finalize_${_split}_split\"\n      finalize_split(_split_rule) {\n        split_type = \"lang\"\n        split_config = _split\n      }\n      _split_deps += [ \":$_split_rule\" ]\n    }\n\n    group(target_name) {\n      public_deps = [ \":${_finalize_apk_rule_name}\" ] + _split_deps\n    }\n    group(\"${target_name}_incremental\") {\n      public_deps = [ \":${_incremental_finalize_apk_rule_name}\" ] + _split_deps\n    }\n  }\n\n  template(\"java_prebuilt_impl\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n    _supports_android =\n        defined(invoker.supports_android) && invoker.supports_android\n\n    assert(defined(invoker.jar_path))\n    if (defined(invoker.output_name)) {\n      _output_name = invoker.output_name\n    } else {\n      _output_name = get_path_info(invoker.jar_path, \"name\")\n    }\n    _base_path = \"${target_gen_dir}/$target_name\"\n\n    # Jar files can be needed at runtime (by Robolectric tests or java binaries),\n    # so do not put them under gen/.\n    _target_dir_name = get_label_info(\":$target_name\", \"dir\")\n    _jar_path = \"$root_out_dir/lib.java$_target_dir_name/$_output_name.jar\"\n    _ijar_path =\n        \"$root_out_dir/lib.java$_target_dir_name/$_output_name.interface.jar\"\n    _build_config = _base_path + \".build_config\"\n\n    if (_supports_android) {\n      _dex_path = _base_path + \".dex.jar\"\n    }\n    _deps = []\n    if (defined(invoker.deps)) {\n      _deps = invoker.deps\n    }\n    _jar_deps = []\n    if (defined(invoker.jar_dep)) {\n      _jar_deps = [ invoker.jar_dep ]\n    }\n\n    _template_name = target_name\n\n    _build_config_target_name = \"${_template_name}__build_config\"\n    _process_jar_target_name = \"${_template_name}__process_jar\"\n    _ijar_target_name = \"${_template_name}__ijar\"\n    if (_supports_android) {\n      _dex_target_name = \"${_template_name}__dex\"\n    }\n\n    write_build_config(_build_config_target_name) {\n      type = \"java_prebuilt\"\n      is_prebuilt_binary = defined(invoker.main_class)\n      forward_variables_from(invoker,\n                             [\n                               \"input_jars_paths\",\n                               \"proguard_configs\",\n                             ])\n      supports_android = _supports_android\n      requires_android =\n          defined(invoker.requires_android) && invoker.requires_android\n\n      if (defined(invoker.deps)) {\n        possible_config_deps = _deps\n      }\n      build_config = _build_config\n      jar_path = _jar_path\n      if (_supports_android) {\n        dex_path = _dex_path\n      }\n    }\n\n    process_java_prebuilt(_process_jar_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"jar_excluded_patterns\",\n                               \"proguard_preprocess\",\n                               \"proguard_preprocess_config\",\n                               \"strip_resource_classes\",\n                             ])\n\n      visibility = [\n        \":$_ijar_target_name\",\n        \":$_template_name\",\n      ]\n      if (_supports_android) {\n        visibility += [ \":$_dex_target_name\" ]\n      }\n\n      supports_android = _supports_android\n      build_config = _build_config\n      input_jar_path = invoker.jar_path\n      output_jar_path = _jar_path\n\n      deps = [ \":$_build_config_target_name\" ] + _deps + _jar_deps\n    }\n\n    generate_interface_jar(_ijar_target_name) {\n      if (!defined(invoker.proguard_preprocess) ||\n          !invoker.proguard_preprocess) {\n        # Always used the unfiltered .jar to create the interface jar so that\n        # other targets will resolve filtered classes when depending on\n        # BuildConfig, NativeLibraries, etc.\n        input_jar = invoker.jar_path\n        deps = _deps + _jar_deps\n      } else {\n        # However, still apply pre-proguarding, since ignoring that can break\n        # compiles.\n        input_jar = _jar_path\n        deps = [\n          \":$_process_jar_target_name\",\n        ]\n      }\n\n      output_jar = _ijar_path\n    }\n\n    if (_supports_android) {\n      dex(_dex_target_name) {\n        sources = [\n          _jar_path,\n        ]\n        output = _dex_path\n        deps = [ \":$_process_jar_target_name\" ] + _deps + _jar_deps\n      }\n    }\n\n    if (defined(invoker.main_class)) {\n      _binary_script_target_name = \"${_template_name}__java_binary_script\"\n      java_binary_script(_binary_script_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"bootclasspath\",\n                                 \"deps\",\n                                 \"main_class\",\n                                 \"wrapper_script_args\",\n                               ])\n        if (!defined(deps)) {\n          deps = []\n        }\n        build_config = _build_config\n        jar_path = _jar_path\n        script_name = _template_name\n        if (defined(invoker.wrapper_script_name)) {\n          script_name = invoker.wrapper_script_name\n        }\n        deps += [ \":$_build_config_target_name\" ]\n      }\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker, [ \"data_deps\" ])\n      public_deps = [\n        \":$_ijar_target_name\",\n        \":$_process_jar_target_name\",\n      ]\n      if (_supports_android) {\n        public_deps += [ \":$_dex_target_name\" ]\n      }\n      if (defined(invoker.main_class)) {\n        # Some targets use the generated script while building, so make it a dep\n        # rather than a data_dep.\n        public_deps += [ \":$_binary_script_target_name\" ]\n      }\n    }\n  }\n\n  # Compiles and jars a set of java files.\n  #\n  # Outputs:\n  #  $jar_path.jar\n  #  $jar_path.interface.jar\n  #\n  # Variables\n  #   java_files: List of .java files to compile (same as exists in java_sources_file)\n  #   java_sources_file: Path to file containing list of files to compile.\n  #   chromium_code: If true, enable extra warnings.\n  #   srcjar_deps: List of srcjar dependencies. The .java files contained in the\n  #     dependencies srcjar outputs will be compiled and added to the output jar.\n  #   jar_path: Use this to explicitly set the output jar path. Defaults to\n  #     \"${target_gen_dir}/${target_name}.jar.\n  template(\"compile_java\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.build_config))\n    assert(defined(invoker.jar_path))\n\n    _build_config = invoker.build_config\n\n    _chromium_code = false\n    if (defined(invoker.chromium_code)) {\n      _chromium_code = invoker.chromium_code\n    }\n\n    _supports_android = true\n    if (defined(invoker.supports_android)) {\n      _supports_android = invoker.supports_android\n    }\n\n    _requires_android =\n        defined(invoker.requires_android) && invoker.requires_android\n\n    _enable_errorprone = use_errorprone_java_compiler\n    if (!_chromium_code) {\n      _enable_errorprone = false\n    } else if (defined(invoker.enable_errorprone)) {\n      _enable_errorprone = invoker.enable_errorprone\n    }\n\n    _provider_configurations = []\n    if (defined(invoker.provider_configurations)) {\n      _provider_configurations = invoker.provider_configurations\n    }\n\n    _processors = []\n    _enable_interface_jars_javac = true\n    if (defined(invoker.processors_javac)) {\n      _processors = invoker.processors_javac\n      _enable_interface_jars_javac = _processors == []\n    }\n\n    _processor_args = []\n    if (defined(invoker.processor_args_javac)) {\n      _processor_args = invoker.processor_args_javac\n    }\n\n    _additional_jar_files = []\n    if (defined(invoker.additional_jar_files)) {\n      _additional_jar_files = invoker.additional_jar_files\n    }\n\n    if (defined(invoker.enable_incremental_javac_override)) {\n      # Use invoker-specified override.\n      _enable_incremental_javac = invoker.enable_incremental_javac_override\n    } else {\n      # Default to build arg if not overridden.\n      _enable_incremental_javac = enable_incremental_javac\n    }\n\n    _manifest_entries = []\n    if (defined(invoker.manifest_entries)) {\n      _manifest_entries = invoker.manifest_entries\n    }\n\n    _srcjar_deps = []\n    if (defined(invoker.srcjar_deps)) {\n      _srcjar_deps += invoker.srcjar_deps\n    }\n\n    _java_srcjars = []\n    if (defined(invoker.srcjars)) {\n      _java_srcjars = invoker.srcjars\n    }\n    foreach(dep, _srcjar_deps) {\n      _dep_gen_dir = get_label_info(dep, \"target_gen_dir\")\n      _dep_name = get_label_info(dep, \"name\")\n      _java_srcjars += [ \"$_dep_gen_dir/$_dep_name.srcjar\" ]\n    }\n\n    # Mark srcjar_deps as used.\n    assert(_srcjar_deps == [] || true)\n\n    _javac_target_name = \"${target_name}__javac\"\n    _process_prebuilt_target_name = \"${target_name}__process_prebuilt\"\n    _ijar_target_name = \"${target_name}__ijar\"\n    _final_target_name = target_name\n\n    _final_jar_path = invoker.jar_path\n    _javac_jar_path = \"$target_gen_dir/$target_name.javac.jar\"\n    _process_prebuilt_jar_path = _final_jar_path\n    _final_ijar_path = get_path_info(_final_jar_path, \"dir\") + \"/\" +\n                       get_path_info(_final_jar_path, \"name\") + \".interface.jar\"\n\n    _emma_instrument = defined(invoker.emma_instrument) &&\n                       invoker.emma_instrument && invoker.java_files != []\n    if (_emma_instrument) {\n      _emma_instr_target_name = \"${target_name}__emma_instr\"\n      _process_prebuilt_jar_path =\n          \"$target_gen_dir/$target_name.process_prebuilt.jar\"\n    }\n\n    _rebased_build_config = rebase_path(_build_config, root_build_dir)\n    _rebased_jar_path = rebase_path(_javac_jar_path, root_build_dir)\n\n    action(_javac_target_name) {\n      script = \"//build/android/gyp/javac.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      deps = _srcjar_deps\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n\n      outputs = [\n        _javac_jar_path,\n        _javac_jar_path + \".md5.stamp\",\n      ]\n      sources = invoker.java_files + _java_srcjars\n      inputs = [\n        _build_config,\n      ]\n      if (invoker.java_files != []) {\n        inputs += [ invoker.java_sources_file ]\n      }\n\n      _rebased_java_srcjars = rebase_path(_java_srcjars, root_build_dir)\n      _rebased_depfile = rebase_path(depfile, root_build_dir)\n      args = [\n        \"--depfile=$_rebased_depfile\",\n        \"--jar-path=$_rebased_jar_path\",\n        \"--java-srcjars=$_rebased_java_srcjars\",\n        \"--java-srcjars=@FileArg($_rebased_build_config:javac:srcjars)\",\n      ]\n      if (_enable_interface_jars_javac) {\n        args += [ \"--classpath=@FileArg($_rebased_build_config:javac:interface_classpath)\" ]\n      } else {\n        args +=\n            [ \"--classpath=@FileArg($_rebased_build_config:javac:classpath)\" ]\n      }\n      if (_enable_incremental_javac) {\n        args += [ \"--incremental\" ]\n        deps += [ \"//third_party/jmake($default_toolchain)\" ]\n        inputs += [ \"$root_build_dir/bin/jmake\" ]\n        outputs += [ \"${_javac_jar_path}.pdb\" ]\n      }\n      if (_requires_android) {\n        if (defined(invoker.alternative_android_sdk_ijar)) {\n          deps += [ invoker.alternative_android_sdk_ijar_dep ]\n          _android_sdk_ijar = invoker.alternative_android_sdk_ijar\n        } else {\n          deps += [ \"//build/android:android_ijar\" ]\n          _android_sdk_ijar = \"$root_out_dir/lib.java/android.interface.jar\"\n        }\n        inputs += [ _android_sdk_ijar ]\n        _rebased_android_sdk_ijar =\n            rebase_path(_android_sdk_ijar, root_build_dir)\n        args += [ \"--bootclasspath=$_rebased_android_sdk_ijar\" ]\n      }\n      if (use_java8) {\n        args += [ \"--java-version=1.8\" ]\n      } else if (_supports_android) {\n        args += [ \"--java-version=1.7\" ]\n      }\n      foreach(e, _manifest_entries) {\n        args += [ \"--manifest-entry=\" + e ]\n      }\n      if (_chromium_code) {\n        args += [ \"--chromium-code=1\" ]\n      }\n      if (_enable_errorprone) {\n        deps += [ \"//third_party/errorprone:chromium_errorprone\" ]\n        args += [\n          \"--use-errorprone-path\",\n          \"bin/chromium_errorprone\",\n        ]\n      }\n      foreach(e, _provider_configurations) {\n        args += [ \"--provider-configuration=\" + rebase_path(e, root_build_dir) ]\n      }\n      foreach(e, _processors) {\n        args += [ \"--processor=\" + e ]\n      }\n      foreach(e, _processor_args) {\n        args += [ \"--processor-arg=\" + e ]\n      }\n      foreach(file_tuple, _additional_jar_files) {\n        # Each element is of length two, [ path_to_file, path_to_put_in_jar ]\n        inputs += [ file_tuple[0] ]\n        args +=\n            [ \"--additional-jar-file=\" + file_tuple[0] + \":\" + file_tuple[1] ]\n      }\n      if (invoker.java_files != []) {\n        args += [ \"@\" + rebase_path(invoker.java_sources_file, root_build_dir) ]\n      }\n    }\n\n    process_java_prebuilt(_process_prebuilt_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"jar_excluded_patterns\",\n                               \"proguard_preprocess\",\n                               \"proguard_preprocess_config\",\n                             ])\n      supports_android = _supports_android\n      build_config = _build_config\n      input_jar_path = _javac_jar_path\n      output_jar_path = _process_prebuilt_jar_path\n\n      deps = [\n        \":$_javac_target_name\",\n      ]\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n    }\n\n    if (_emma_instrument) {\n      emma_instr(_emma_instr_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"deps\",\n                                 \"java_files\",\n                                 \"java_sources_file\",\n                               ])\n\n        input_jar_path = _process_prebuilt_jar_path\n        output_jar_path = _final_jar_path\n\n        if (!defined(deps)) {\n          deps = []\n        }\n        deps += [ \":$_process_prebuilt_target_name\" ]\n      }\n    }\n\n    generate_interface_jar(_ijar_target_name) {\n      if (!defined(invoker.proguard_preprocess) ||\n          !invoker.proguard_preprocess) {\n        # Always used the unfiltered .jar to create the interface jar so that\n        # other targets will resolve filtered classes when depending on\n        # BuildConfig, NativeLibraries, etc.\n        input_jar = _javac_jar_path\n        deps = [\n          \":$_javac_target_name\",\n        ]\n      } else {\n        # However, still apply pre-proguarding, since ignoring that can break\n        # compiles.\n        input_jar = _process_prebuilt_jar_path\n        deps = [\n          \":$_process_prebuilt_target_name\",\n        ]\n      }\n      output_jar = _final_ijar_path\n    }\n\n    group(_final_target_name) {\n      forward_variables_from(invoker, [ \"visibility\" ])\n      public_deps = [\n        \":$_ijar_target_name\",\n      ]\n      if (_emma_instrument) {\n        public_deps += [ \":$_emma_instr_target_name\" ]\n      } else {\n        public_deps += [ \":$_process_prebuilt_target_name\" ]\n      }\n    }\n  }\n\n  template(\"java_library_impl\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n    _accumulated_deps = []\n    if (defined(invoker.deps)) {\n      _accumulated_deps = invoker.deps\n    }\n\n    assert(defined(invoker.java_files) || defined(invoker.srcjars) ||\n           defined(invoker.srcjar_deps))\n    _base_path = \"$target_gen_dir/$target_name\"\n\n    if (defined(invoker.output_name)) {\n      _output_name = invoker.output_name\n    } else {\n      _output_name = target_name\n    }\n\n    # Jar files can be needed at runtime (by Robolectric tests or java binaries),\n    # so do not put them under gen/.\n    target_dir_name = get_label_info(\":$target_name\", \"dir\")\n    _jar_path = \"$root_out_dir/lib.java$target_dir_name/$_output_name.jar\"\n    if (defined(invoker.jar_path)) {\n      _jar_path = invoker.jar_path\n    }\n    _template_name = target_name\n\n    _final_deps = []\n\n    _supports_android =\n        defined(invoker.supports_android) && invoker.supports_android\n    _requires_android =\n        defined(invoker.requires_android) && invoker.requires_android\n    assert(_requires_android || true)  # Mark as used.\n    _android_manifest = \"//build/android/AndroidManifest.xml\"\n    if (defined(invoker.android_manifest)) {\n      _android_manifest = invoker.android_manifest\n    }\n    assert(_android_manifest != \"\")  # Mark as used.\n\n    if (defined(invoker.run_findbugs_override)) {\n      _run_findbugs = invoker.run_findbugs_override\n    } else {\n      _run_findbugs = run_findbugs  # Default to build arg if not overridden.\n    }\n    assert(_run_findbugs || true)  # Mark as used.\n\n    # Don't enable coverage, lint, findbugs unless the target has some\n    # non-generated files.\n    if (defined(invoker.chromium_code)) {\n      _chromium_code = invoker.chromium_code\n    } else {\n      _chromium_code = defined(invoker.java_files) && invoker.java_files != []\n      if (_chromium_code) {\n        # Make chromium_code = false be the default for targets within\n        # third_party which contain no chromium-namespaced java files.\n        set_sources_assignment_filter([ \"*\\bthird_party\\b*\" ])\n        sources = [\n          get_label_info(\":$target_name\", \"dir\"),\n        ]\n        if (sources == []) {\n          set_sources_assignment_filter([ \"*\\bchromium\\b*\" ])\n          sources = invoker.java_files\n          _chromium_code = invoker.java_files != sources\n        }\n        set_sources_assignment_filter([])\n        sources = []\n      }\n    }\n\n    _emma_never_instrument = !_chromium_code\n    if (defined(invoker.emma_never_instrument)) {\n      _emma_never_instrument = invoker.emma_never_instrument\n    }\n    assert(_emma_never_instrument || true)  # Mark as used\n    _emma_instrument = emma_coverage && !_emma_never_instrument\n\n    if (_supports_android) {\n      _dex_path = _base_path + \".dex.jar\"\n      if (defined(invoker.dex_path)) {\n        _dex_path = invoker.dex_path\n      }\n    }\n\n    _java_files = []\n    if (defined(invoker.java_files)) {\n      _java_files += invoker.java_files\n    }\n    if (_java_files != []) {\n      _java_sources_file = \"$_base_path.sources\"\n      write_file(_java_sources_file, rebase_path(_java_files, root_build_dir))\n    }\n\n    # Define build_config_deps which will be a list of targets required to\n    # build the _build_config.\n    if (defined(invoker.override_build_config)) {\n      _build_config = invoker.override_build_config\n    } else {\n      _build_config = _base_path + \".build_config\"\n      build_config_target_name = \"${_template_name}__build_config\"\n\n      write_build_config(build_config_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"gradle_treat_as_prebuilt\",\n                                 \"input_jars_paths\",\n                                 \"main_class\",\n                                 \"proguard_configs\",\n                               ])\n        if (defined(invoker.is_java_binary) && invoker.is_java_binary) {\n          type = \"java_binary\"\n        } else {\n          type = \"java_library\"\n        }\n        if (defined(invoker.deps)) {\n          possible_config_deps = invoker.deps\n        }\n        supports_android = _supports_android\n        requires_android = _requires_android\n        bypass_platform_checks = defined(invoker.bypass_platform_checks) &&\n                                 invoker.bypass_platform_checks\n\n        build_config = _build_config\n        jar_path = _jar_path\n        if (_supports_android) {\n          dex_path = _dex_path\n        }\n        if (_java_files != []) {\n          java_sources_file = _java_sources_file\n        }\n\n        if (defined(invoker.srcjar_deps)) {\n          bundled_srcjars = []\n          foreach(d, invoker.srcjar_deps) {\n            _dep_gen_dir = get_label_info(d, \"target_gen_dir\")\n            _dep_name = get_label_info(d, \"name\")\n            bundled_srcjars += [ \"$_dep_gen_dir/$_dep_name.srcjar\" ]\n          }\n        }\n      }\n      _accumulated_deps += [ \":$build_config_target_name\" ]\n    }\n\n    _srcjar_deps = []\n    if (defined(invoker.srcjar_deps)) {\n      _srcjar_deps = invoker.srcjar_deps\n    }\n\n    _srcjars = []\n    if (defined(invoker.srcjars)) {\n      _srcjars = invoker.srcjars\n    }\n\n    assert(_java_files != [] || _srcjar_deps != [] || _srcjars != [])\n\n    _compile_java_target = \"${_template_name}__compile_java\"\n    _final_deps += [ \":$_compile_java_target\" ]\n    compile_java(_compile_java_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"additional_jar_files\",\n                               \"alternative_android_sdk_ijar\",\n                               \"alternative_android_sdk_ijar_dep\",\n                               \"dist_jar_path\",\n                               \"enable_errorprone\",\n                               \"enable_incremental_javac_override\",\n                               \"jar_excluded_patterns\",\n                               \"manifest_entries\",\n                               \"processors_javac\",\n                               \"processor_args_javac\",\n                               \"proguard_preprocess_config\",\n                               \"proguard_preprocess\",\n                               \"provider_configurations\",\n                             ])\n      jar_path = _jar_path\n      build_config = _build_config\n      java_files = _java_files\n      if (_java_files != []) {\n        java_sources_file = _java_sources_file\n      }\n      srcjar_deps = _srcjar_deps\n      srcjars = _srcjars\n      chromium_code = _chromium_code\n      supports_android = _supports_android\n      requires_android = _requires_android\n      emma_instrument = _emma_instrument\n      deps = _accumulated_deps\n    }\n    _accumulated_deps += [ \":$_compile_java_target\" ]\n    assert(_accumulated_deps != [])  # Mark used.\n\n    if (defined(invoker.main_class)) {\n      # Targets might use the generated script while building, so make it a dep\n      # rather than a data_dep.\n      _final_deps += [ \":${_template_name}__java_binary_script\" ]\n      java_binary_script(\"${_template_name}__java_binary_script\") {\n        forward_variables_from(invoker,\n                               [\n                                 \"bootclasspath\",\n                                 \"main_class\",\n                                 \"wrapper_script_args\",\n                               ])\n        build_config = _build_config\n        jar_path = _jar_path\n        script_name = _template_name\n        if (defined(invoker.wrapper_script_name)) {\n          script_name = invoker.wrapper_script_name\n        }\n        deps = _accumulated_deps\n      }\n    }\n\n    _has_lint_target = false\n    if (_supports_android) {\n      if (_chromium_code) {\n        _has_lint_target = true\n        android_lint(\"${_template_name}__lint\") {\n          android_manifest = _android_manifest\n          build_config = _build_config\n          jar_path = _jar_path\n          java_files = _java_files\n          if (_java_files != []) {\n            java_sources_file = _java_sources_file\n          }\n          deps = _accumulated_deps\n        }\n\n        if (_run_findbugs) {\n          findbugs(\"${_template_name}__findbugs\") {\n            build_config = _build_config\n            jar_path = _jar_path\n            deps = _accumulated_deps\n          }\n        }\n\n        # Use an intermediate group() rather as the data_deps target in order to\n        # avoid lint artifacts showing up as runtime_deps (while still having lint\n        # run in parallel to other targets).\n        group(\"${_template_name}__analysis\") {\n          public_deps = [\n            \":${_template_name}__lint\",\n          ]\n          if (_run_findbugs) {\n            public_deps += [ \":${_template_name}__findbugs\" ]\n          }\n        }\n      }\n\n      _final_deps += [ \":${_template_name}__dex\" ]\n      dex(\"${_template_name}__dex\") {\n        sources = [\n          _jar_path,\n        ]\n        output = _dex_path\n        deps = [\n          \":$_compile_java_target\",\n        ]\n      }\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"data\",\n                               \"data_deps\",\n                               \"visibility\",\n                             ])\n      if (!defined(data_deps)) {\n        data_deps = []\n      }\n      public_deps = _final_deps\n      if (_has_lint_target) {\n        data_deps += [ \":${_template_name}__analysis\" ]\n      }\n    }\n  }\n\n  # Runs process_resources.py\n  template(\"process_resources\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    zip_path = invoker.zip_path\n    srcjar_path = invoker.srcjar_path\n    r_text_path = invoker.r_text_path\n    build_config = invoker.build_config\n    android_manifest = invoker.android_manifest\n\n    non_constant_id = true\n    if (defined(invoker.generate_constant_ids) &&\n        invoker.generate_constant_ids) {\n      non_constant_id = false\n    }\n\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"visibility\",\n                             ])\n      script = \"//build/android/gyp/process_resources.py\"\n\n      depfile = \"$target_gen_dir/$target_name.d\"\n      outputs = [\n        zip_path,\n        srcjar_path,\n        r_text_path,\n      ]\n\n      _all_resource_dirs = []\n      sources = []\n\n      if (defined(invoker.resource_dirs)) {\n        _all_resource_dirs += invoker.resource_dirs\n\n        # Speed up \"gn gen\" by short-circuiting the empty directory.\n        if (invoker.resource_dirs != [ \"//build/android/ant/empty/res\" ] &&\n            invoker.resource_dirs != []) {\n          _sources_build_rel =\n              exec_script(\"//build/android/gyp/find.py\",\n                          rebase_path(invoker.resource_dirs, root_build_dir),\n                          \"list lines\")\n          sources += rebase_path(_sources_build_rel, \".\", root_build_dir)\n        }\n      }\n\n      if (defined(invoker.generated_resource_dirs)) {\n        assert(defined(invoker.generated_resource_files))\n        _all_resource_dirs += invoker.generated_resource_dirs\n        sources += invoker.generated_resource_files\n      }\n\n      inputs = [\n        build_config,\n        android_manifest,\n      ]\n\n      _rebased_all_resource_dirs =\n          rebase_path(_all_resource_dirs, root_build_dir)\n      rebase_build_config = rebase_path(build_config, root_build_dir)\n\n      if (defined(invoker.android_aapt_path)) {\n        _android_aapt_path = invoker.android_aapt_path\n      } else {\n        _android_aapt_path = android_default_aapt_path\n      }\n\n      if (defined(invoker.alternative_android_sdk_jar)) {\n        _rebased_android_sdk_jar =\n            rebase_path(invoker.alternative_android_sdk_jar)\n      } else {\n        _rebased_android_sdk_jar = rebased_android_sdk_jar\n      }\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--android-sdk-jar\",\n        _rebased_android_sdk_jar,\n        \"--aapt-path\",\n        _android_aapt_path,\n        \"--android-manifest\",\n        rebase_path(android_manifest, root_build_dir),\n        \"--resource-dirs=$_rebased_all_resource_dirs\",\n        \"--srcjar-out\",\n        rebase_path(srcjar_path, root_build_dir),\n        \"--resource-zip-out\",\n        rebase_path(zip_path, root_build_dir),\n        \"--r-text-out\",\n        rebase_path(r_text_path, root_build_dir),\n        \"--dependencies-res-zips=@FileArg($rebase_build_config:resources:dependency_zips)\",\n        \"--extra-res-packages=@FileArg($rebase_build_config:resources:extra_package_names)\",\n        \"--extra-r-text-files=@FileArg($rebase_build_config:resources:extra_r_text_files)\",\n      ]\n\n      if (non_constant_id) {\n        args += [ \"--non-constant-id\" ]\n      }\n\n      if (defined(invoker.custom_package)) {\n        args += [\n          \"--custom-package\",\n          invoker.custom_package,\n        ]\n      }\n\n      if (defined(invoker.v14_skip) && invoker.v14_skip) {\n        args += [ \"--v14-skip\" ]\n      }\n\n      if (defined(invoker.shared_resources) && invoker.shared_resources) {\n        args += [ \"--shared-resources\" ]\n      }\n\n      if (defined(invoker.app_as_shared_lib) && invoker.app_as_shared_lib) {\n        args += [ \"--app-as-shared-lib\" ]\n      }\n\n      if (defined(invoker.include_all_resources) &&\n          invoker.include_all_resources) {\n        args += [ \"--include-all-resources\" ]\n      }\n\n      if (defined(invoker.all_resources_zip_path)) {\n        all_resources_zip = invoker.all_resources_zip_path\n        outputs += [ all_resources_zip ]\n        args += [\n          \"--all-resources-zip-out\",\n          rebase_path(all_resources_zip, root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.proguard_file)) {\n        outputs += [ invoker.proguard_file ]\n        args += [\n          \"--proguard-file\",\n          rebase_path(invoker.proguard_file, root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.args)) {\n        args += invoker.args\n      }\n    }\n  }\n\n  # Produces a single .dex.jar out of a set of Java dependencies.\n  template(\"deps_dex\") {\n    set_sources_assignment_filter([])\n    build_config = \"$target_gen_dir/${target_name}.build_config\"\n    build_config_target_name = \"${target_name}__build_config\"\n\n    write_build_config(build_config_target_name) {\n      forward_variables_from(invoker, [ \"dex_path\" ])\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n      type = \"deps_dex\"\n      build_config = build_config\n    }\n\n    rebased_build_config = rebase_path(build_config, root_build_dir)\n    dex(target_name) {\n      inputs = [\n        build_config,\n      ]\n      output = invoker.dex_path\n      dex_arg_key = \"${rebased_build_config}:final_dex:dependency_dex_files\"\n      args = [ \"--inputs=@FileArg($dex_arg_key)\" ]\n      if (defined(invoker.excluded_jars)) {\n        excluded_jars = rebase_path(invoker.excluded_jars, root_build_dir)\n        args += [ \"--excluded-paths=${excluded_jars}\" ]\n      }\n      deps = [\n        \":$build_config_target_name\",\n      ]\n    }\n  }\n\n  # Creates an AndroidManifest.xml for an APK split.\n  template(\"generate_split_manifest\") {\n    assert(defined(invoker.main_manifest))\n    assert(defined(invoker.out_manifest))\n    assert(defined(invoker.split_name))\n\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"testonly\",\n                             ])\n      depfile = \"$target_gen_dir/$target_name.d\"\n      args = [\n        \"--main-manifest\",\n        rebase_path(invoker.main_manifest, root_build_dir),\n        \"--out-manifest\",\n        rebase_path(invoker.out_manifest, root_build_dir),\n        \"--split\",\n        invoker.split_name,\n      ]\n      if (defined(invoker.version_code)) {\n        args += [\n          \"--version-code\",\n          invoker.version_code,\n        ]\n      }\n      if (defined(invoker.version_name)) {\n        args += [\n          \"--version-name\",\n          invoker.version_name,\n        ]\n      }\n      if (defined(invoker.has_code)) {\n        args += [\n          \"--has-code\",\n          invoker.has_code,\n        ]\n      }\n      args += [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n      ]\n\n      script = \"//build/android/gyp/generate_split_manifest.py\"\n      outputs = [\n        invoker.out_manifest,\n      ]\n      inputs = [\n        invoker.main_manifest,\n      ]\n    }\n  }\n\n  template(\"pack_relocation_section\") {\n    assert(defined(invoker.file_list_json))\n    assert(defined(invoker.libraries_filearg))\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"public_deps\",\n                               \"inputs\",\n                               \"testonly\",\n                             ])\n      script = \"//build/android/gyp/pack_relocations.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      _packed_libraries_dir = \"$target_gen_dir/$target_name/packed-libs\"\n      outputs = [\n        invoker.file_list_json,\n      ]\n      deps += [ relocation_packer_target ]\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--enable-packing=1\",\n        \"--android-pack-relocations\",\n        rebase_path(relocation_packer_exe, root_build_dir),\n        \"--stripped-libraries-dir\",\n        rebase_path(root_build_dir, root_build_dir),\n        \"--packed-libraries-dir\",\n        rebase_path(_packed_libraries_dir, root_build_dir),\n        \"--libraries=${invoker.libraries_filearg}\",\n        \"--filelistjson\",\n        rebase_path(invoker.file_list_json, root_build_dir),\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/ios-rules.gni",
    "content": "# Copyright 2015 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/ios/ios_sdk.gni\")\nimport(\"//build/config/mac/base_rules.gni\")\nimport(\"//build/config/mac/symbols.gni\")\nimport(\"//build/toolchain/toolchain.gni\")\n\n# Invokes lipo on multiple arch-specific binaries to create a fat binary.\n#\n# Arguments\n#\n#   arch_binary_target\n#     name of the target generating the arch-specific binaries, they must\n#     be named $target_out_dir/$toolchain_cpu/$arch_binary_output.\n#\n#   arch_binary_output\n#     (optional, defaults to the name of $arch_binary_target) base name of\n#     the arch-specific binary generated by arch_binary_target.\n#\n#   output_name\n#     (optional, defaults to $target_name) base name of the target output,\n#     the full path will be $target_out_dir/$output_name.\n#\n#   configs\n#     (optional) a list of configurations, this is used to check whether\n#     the binary should be stripped, when \"enable_stripping\" is true.\n#\ntemplate(\"lipo_binary\") {\n  assert(defined(invoker.arch_binary_target),\n         \"arch_binary_target must be defined for $target_name\")\n\n  _target_name = target_name\n  _output_name = target_name\n  if (defined(invoker.output_name)) {\n    _output_name = invoker.output_name\n  }\n\n  _all_target_cpu = [ current_cpu ] + additional_target_cpus\n  _all_toolchains = [ current_toolchain ] + additional_toolchains\n\n  _arch_binary_target = invoker.arch_binary_target\n  _arch_binary_output = get_label_info(_arch_binary_target, \"name\")\n  if (defined(invoker.arch_binary_output)) {\n    _arch_binary_output = invoker.arch_binary_output\n  }\n\n  action(_target_name) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"arch_binary_output\",\n                             \"arch_binary_target\",\n                             \"configs\",\n                             \"output_name\",\n                           ])\n\n    script = \"//build/toolchain/mac/linker_driver.py\"\n\n    outputs = [\n      \"$target_out_dir/$_output_name\",\n    ]\n\n    deps = []\n    _index = 0\n    inputs = []\n    foreach(_cpu, _all_target_cpu) {\n      _toolchain = _all_toolchains[_index]\n      _index = _index + 1\n\n      inputs +=\n          [ get_label_info(\"$_arch_binary_target($_toolchain)\",\n                           \"target_out_dir\") + \"/$_cpu/$_arch_binary_output\" ]\n\n      deps += [ \"$_arch_binary_target($_toolchain)\" ]\n    }\n\n    args = []\n    if (!use_system_xcode) {\n      args += [\n        \"--developer_dir\",\n        hermetic_xcode_path,\n      ]\n    }\n    args += [\n              \"xcrun\",\n              \"lipo\",\n              \"-create\",\n              \"-output\",\n              rebase_path(\"$target_out_dir/$_output_name\", root_build_dir),\n            ] + rebase_path(inputs, root_build_dir)\n\n    if (enable_dsyms) {\n      _dsyms_output_dir = \"$root_out_dir/$_output_name.dSYM\"\n      outputs += [\n        \"$_dsyms_output_dir/\",\n        \"$_dsyms_output_dir/Contents/Info.plist\",\n        \"$_dsyms_output_dir/Contents/Resources/DWARF/$_output_name\",\n      ]\n      args += [ \"-Wcrl,dsym,\" + rebase_path(\"$root_out_dir/.\", root_build_dir) ]\n    }\n\n    if (enable_stripping) {\n      # Check whether //build/config/mac:strip_all has been removed from the\n      # configs variables (as this is how stripping is disabled for a single\n      # target).\n      _strip_all_in_config = false\n      if (defined(invoker.configs)) {\n        foreach(_config, invoker.configs) {\n          if (_config == \"//build/config/mac:strip_all\") {\n            _strip_all_in_config = true\n          }\n        }\n      }\n\n      if (_strip_all_in_config) {\n        args += [ \"-Wcrl,strip,-x,-S\" ]\n        if (save_unstripped_output) {\n          outputs += [ \"$root_out_dir/$_output_name.unstripped\" ]\n          args += [ \"-Wcrl,unstripped,\" +\n                    rebase_path(\"$root_out_dir/.\", root_build_dir) ]\n        }\n      }\n    }\n  }\n}\n\n# Wrapper around create_bundle taking care of code signature settings.\n#\n# Arguments\n#\n#   product_type\n#       string, product type for the generated Xcode project.\n#\n#   bundle_deps\n#       (optional) list of additional dependencies\n#\n#   bundle_deps_filter\n#       (optional) list of dependencies to filter (for more information\n#       see \"gn help bundle_deps_filter\")\n#\n#   bundle_extension\n#       string, extension of the bundle, used to generate bundle name.\n#\n#   bundle_binary_target\n#       string, label of the target generating the bundle main binary.\n#\n#   bundle_binary_output\n#       (optional) string, base name of the binary generated by the\n#       bundle_binary_target target, defaults to the target name.\n#\n#   extra_system_frameworks\n#       (optional) list of system framework to copy to the bundle.\n#\n#   enable_code_signing\n#       (optional) boolean, control whether code signing is enabled or not,\n#       default to ios_enable_code_signing if not defined.\n#\n#   entitlements_path:\n#       (optional) path to the template to use to generate the application\n#       entitlements by performing variable substitutions, defaults to\n#       //build/config/ios/entitlements.plist.\n#\n#   entitlements_target:\n#       (optional) label of the target generating the application\n#       entitlements (must generate a single file as output); cannot be\n#       defined if entitlements_path is set.\n#\ntemplate(\"create_signed_bundle\") {\n  assert(defined(invoker.product_type),\n         \"product_type must be defined for $target_name\")\n  assert(defined(invoker.bundle_extension),\n         \"bundle_extension must be defined for $target_name\")\n  assert(defined(invoker.bundle_binary_target),\n         \"bundle_binary_target must be defined for $target_name\")\n\n  _target_name = target_name\n  _output_name = target_name\n  if (defined(invoker.output_name)) {\n    _output_name = invoker.output_name\n  }\n\n  _bundle_binary_target = invoker.bundle_binary_target\n  _bundle_binary_output = get_label_info(_bundle_binary_target, \"name\")\n  if (defined(invoker.bundle_binary_output)) {\n    _bundle_binary_output = invoker.bundle_binary_output\n  }\n\n  _bundle_extension = invoker.bundle_extension\n  _bundle_root_dir = \"$root_out_dir/$_output_name$_bundle_extension\"\n\n  if (!defined(invoker.entitlements_target)) {\n    _entitlements_path = \"//build/config/ios/entitlements.plist\"\n    if (defined(invoker.entitlements_path)) {\n      _entitlements_path = invoker.entitlements_path\n    }\n  } else {\n    assert(!defined(invoker.entitlements_path),\n           \"Cannot define both entitlements_path and entitlements_target \" +\n               \"for $target_name\")\n\n    _entitlements_target_outputs =\n        get_target_outputs(invoker.entitlements_target)\n    _entitlements_path = _entitlements_target_outputs[0]\n  }\n\n  _enable_code_signing = ios_enable_code_signing\n  if (defined(invoker.enable_code_signing)) {\n    _enable_code_signing = invoker.enable_code_signing\n  }\n\n  create_bundle(_target_name) {\n    forward_variables_from(invoker,\n                           [\n                             \"bundle_deps_filter\",\n                             \"data_deps\",\n                             \"deps\",\n                             \"product_type\",\n                             \"public_configs\",\n                             \"public_deps\",\n                             \"testonly\",\n                             \"visibility\",\n                           ])\n\n    bundle_root_dir = _bundle_root_dir\n    bundle_resources_dir = _bundle_root_dir\n    bundle_executable_dir = _bundle_root_dir\n    bundle_plugins_dir = \"$_bundle_root_dir/PlugIns\"\n\n    if (!defined(public_deps)) {\n      public_deps = []\n    }\n    public_deps += [ _bundle_binary_target ]\n\n    if (defined(invoker.bundle_deps)) {\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += invoker.bundle_deps\n    }\n    if (defined(invoker.entitlements_target)) {\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += [ invoker.entitlements_target ]\n    }\n\n    code_signing_script = \"//build/config/ios/codesign.py\"\n    code_signing_sources = [\n      _entitlements_path,\n      get_label_info(_bundle_binary_target, \"target_out_dir\") +\n          \"/$_bundle_binary_output\",\n    ]\n    code_signing_outputs = [ \"$_bundle_root_dir/$_output_name\" ]\n    if (_enable_code_signing) {\n      code_signing_outputs +=\n          [ \"$_bundle_root_dir/_CodeSignature/CodeResources\" ]\n    }\n    if (ios_code_signing_identity != \"\" && !use_ios_simulator) {\n      code_signing_outputs += [ \"$_bundle_root_dir/embedded.mobileprovision\" ]\n    }\n\n    if (defined(invoker.extra_system_frameworks)) {\n      foreach(_framework, invoker.extra_system_frameworks) {\n        code_signing_outputs += [ \"$bundle_root_dir/Frameworks/\" +\n                                  get_path_info(_framework, \"file\") ]\n      }\n    }\n\n    code_signing_args = []\n    if (!use_system_xcode) {\n      code_signing_args += [\n        \"--developer_dir\",\n        hermetic_xcode_path,\n      ]\n    }\n    code_signing_args += [\n      \"code-sign-bundle\",\n      \"-t=\" + ios_sdk_name,\n      \"-i=\" + ios_code_signing_identity,\n      \"-e=\" + rebase_path(_entitlements_path, root_build_dir),\n      \"-b=\" + rebase_path(\"$target_out_dir/$_output_name\", root_build_dir),\n      rebase_path(bundle_root_dir, root_build_dir),\n    ]\n    if (!_enable_code_signing) {\n      code_signing_args += [ \"--disable-code-signature\" ]\n    }\n    if (defined(invoker.extra_system_frameworks)) {\n      # All framework in extra_system_frameworks are expected to be\n      # system framework and the path to be already system absolute\n      # so do not use rebase_path here.\n      foreach(_framework, invoker.extra_system_frameworks) {\n        code_signing_args += [ \"-F=\" + _framework ]\n      }\n    }\n  }\n}\n\n# Generates Info.plist files for Mac apps and frameworks.\n#\n# Arguments\n#\n#     info_plist:\n#         (optional) string, path to the Info.plist file that will be used for\n#         the bundle.\n#\n#     info_plist_target:\n#         (optional) string, if the info_plist is generated from an action,\n#         rather than a regular source file, specify the target name in lieu\n#         of info_plist. The two arguments are mutually exclusive.\n#\n#     executable_name:\n#         string, name of the generated target used for the product\n#         and executable name as specified in the output Info.plist.\n#\n#     extra_substitutions:\n#         (optional) string array, 'key=value' pairs for extra fields which are\n#         specified in a source Info.plist template.\ntemplate(\"ios_info_plist\") {\n  assert(defined(invoker.info_plist) != defined(invoker.info_plist_target),\n         \"Only one of info_plist or info_plist_target may be specified in \" +\n             target_name)\n\n  if (defined(invoker.info_plist)) {\n    _info_plist = invoker.info_plist\n  } else {\n    _info_plist_target_output = get_target_outputs(invoker.info_plist_target)\n    _info_plist = _info_plist_target_output[0]\n  }\n\n  info_plist(target_name) {\n    format = \"binary1\"\n    extra_substitutions = []\n    if (defined(invoker.extra_substitutions)) {\n      extra_substitutions = invoker.extra_substitutions\n    }\n    extra_substitutions += [\n      \"IOS_BUNDLE_ID_PREFIX=$ios_app_bundle_id_prefix\",\n      \"IOS_DEPLOYMENT_TARGET=$ios_deployment_target\",\n      \"IOS_PLATFORM_BUILD=$ios_platform_build\",\n      \"IOS_PLATFORM_NAME=$ios_sdk_name\",\n      \"IOS_PLATFORM_VERSION=$ios_sdk_version\",\n      \"IOS_SDK_BUILD=$ios_sdk_build\",\n      \"IOS_SDK_NAME=$ios_sdk_name$ios_sdk_version\",\n      \"IOS_SUPPORTED_PLATFORM=$ios_sdk_platform\",\n    ]\n    plist_templates = [\n      \"//build/config/ios/BuildInfo.plist\",\n      _info_plist,\n    ]\n    if (defined(invoker.info_plist_target)) {\n      deps = [\n        invoker.info_plist_target,\n      ]\n    }\n    forward_variables_from(invoker,\n                           [\n                             \"executable_name\",\n                             \"output_name\",\n                             \"visibility\",\n                           ])\n  }\n}\n\n# Template to build an application bundle for iOS.\n#\n# This should be used instead of \"executable\" built-in target type on iOS.\n# As the template forward the generation of the application executable to\n# an \"executable\" target, all arguments supported by \"executable\" targets\n# are also supported by this template.\n#\n# Arguments\n#\n#   output_name:\n#       (optional) string, name of the generated application, if omitted,\n#       defaults to the target_name.\n#\n#   extra_substitutions:\n#       (optional) list of string in \"key=value\" format, each value will\n#       be used as an additional variable substitution rule when generating\n#       the application Info.plist\n#\n#   info_plist:\n#       (optional) string, path to the Info.plist file that will be used for\n#       the bundle.\n#\n#   info_plist_target:\n#       (optional) string, if the info_plist is generated from an action,\n#       rather than a regular source file, specify the target name in lieu\n#       of info_plist. The two arguments are mutually exclusive.\n#\n#   entitlements_path:\n#       (optional) path to the template to use to generate the application\n#       entitlements by performing variable substitutions, defaults to\n#       //build/config/ios/entitlements.plist.\n#\n#   entitlements_target:\n#       (optional) label of the target generating the application\n#       entitlements (must generate a single file as output); cannot be\n#       defined if entitlements_path is set.\n#\n#   bundle_extension:\n#       (optional) bundle extension including the dot, default to \".app\".\n#\n#   product_type\n#       (optional) string, product type for the generated Xcode project,\n#       default to \"com.apple.product-type.application\". Should generally\n#       not be overridden.\n#\n#   enable_code_signing\n#       (optional) boolean, control whether code signing is enabled or not,\n#       default to ios_enable_code_signing if not defined.\n#\n# For more information, see \"gn help executable\".\ntemplate(\"ios_app_bundle\") {\n  _output_name = target_name\n  _target_name = target_name\n  if (defined(invoker.output_name)) {\n    _output_name = invoker.output_name\n  }\n\n  _arch_executable_source = _target_name + \"_arch_executable_sources\"\n  _arch_executable_target = _target_name + \"_arch_executable\"\n  _lipo_executable_target = _target_name + \"_executable\"\n\n  source_set(_arch_executable_source) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"bundle_deps\",\n                             \"bundle_deps_filter\",\n                             \"bundle_extension\",\n                             \"enable_code_signing\",\n                             \"entitlements_path\",\n                             \"entitlements_target\",\n                             \"extra_substitutions\",\n                             \"extra_system_frameworks\",\n                             \"info_plist\",\n                             \"info_plist_target\",\n                             \"output_name\",\n                             \"product_type\",\n                             \"visibility\",\n                           ])\n\n    visibility = [ \":$_arch_executable_target\" ]\n  }\n\n  if (current_toolchain == default_toolchain || use_ios_simulator) {\n    _generate_entitlements_target = _target_name + \"_gen_entitlements\"\n    _generate_entitlements_output =\n        get_label_info(\":$_generate_entitlements_target($default_toolchain)\",\n                       \"target_out_dir\") + \"/$_output_name.xcent\"\n  }\n\n  executable(_arch_executable_target) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"bundle_deps\",\n                             \"bundle_deps_filter\",\n                             \"bundle_extension\",\n                             \"enable_code_signing\",\n                             \"entitlements_path\",\n                             \"entitlements_target\",\n                             \"extra_substitutions\",\n                             \"extra_system_frameworks\",\n                             \"info_plist\",\n                             \"info_plist_target\",\n                             \"output_name\",\n                             \"product_type\",\n                             \"sources\",\n                             \"visibility\",\n                           ])\n\n    visibility = [ \":$_lipo_executable_target($default_toolchain)\" ]\n    if (current_toolchain != default_toolchain) {\n      visibility += [ \":$_target_name\" ]\n    }\n\n    if (!defined(deps)) {\n      deps = []\n    }\n    deps += [ \":$_arch_executable_source\" ]\n\n    if (!defined(libs)) {\n      libs = []\n    }\n    libs += [ \"UIKit.framework\" ]\n\n    if (!defined(ldflags)) {\n      ldflags = []\n    }\n    ldflags += [\n      \"-Xlinker\",\n      \"-rpath\",\n      \"-Xlinker\",\n      \"@executable_path/Frameworks\",\n      \"-Xlinker\",\n      \"-objc_abi_version\",\n      \"-Xlinker\",\n      \"2\",\n    ]\n\n    if (use_ios_simulator) {\n      deps += [ \":$_generate_entitlements_target($default_toolchain)\" ]\n\n      if (!defined(inputs)) {\n        inputs = []\n      }\n      inputs += [ _generate_entitlements_output ]\n\n      if (!defined(ldflags)) {\n        ldflags = []\n      }\n      ldflags += [\n        \"-Xlinker\",\n        \"-sectcreate\",\n        \"-Xlinker\",\n        \"__TEXT\",\n        \"-Xlinker\",\n        \"__entitlements\",\n        \"-Xlinker\",\n        rebase_path(_generate_entitlements_output, root_build_dir),\n      ]\n    }\n\n    output_name = _output_name\n    output_prefix_override = true\n    output_dir = \"$target_out_dir/$current_cpu\"\n  }\n\n  if (current_toolchain != default_toolchain) {\n    # For fat builds, only the default toolchain will generate an application\n    # bundle. For the other toolchains, the template is only used for building\n    # the arch-specific binary, thus the default target is just a group().\n\n    group(_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"visibility\",\n                               \"testonly\",\n                             ])\n      public_deps = [\n        \":$_arch_executable_target\",\n      ]\n    }\n  } else {\n    lipo_binary(_lipo_executable_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"configs\",\n                               \"testonly\",\n                             ])\n\n      visibility = [ \":$_target_name\" ]\n      output_name = _output_name\n      arch_binary_target = \":$_arch_executable_target\"\n      arch_binary_output = _output_name\n    }\n\n    _generate_info_plist = target_name + \"_generate_info_plist\"\n    ios_info_plist(_generate_info_plist) {\n      forward_variables_from(invoker,\n                             [\n                               \"extra_substitutions\",\n                               \"info_plist\",\n                               \"info_plist_target\",\n                             ])\n\n      executable_name = _output_name\n    }\n\n    if (current_toolchain == default_toolchain) {\n      if (!defined(invoker.entitlements_target)) {\n        _entitlements_path = \"//build/config/ios/entitlements.plist\"\n        if (defined(invoker.entitlements_path)) {\n          _entitlements_path = invoker.entitlements_path\n        }\n      } else {\n        assert(!defined(invoker.entitlements_path),\n               \"Cannot define both entitlements_path and entitlements_target\" +\n                   \"for $_target_name\")\n\n        _entitlements_target_outputs =\n            get_target_outputs(invoker.entitlements_target)\n        _entitlements_path = _entitlements_target_outputs[0]\n      }\n\n      action(_generate_entitlements_target) {\n        _gen_info_plist_outputs = get_target_outputs(\":$_generate_info_plist\")\n        _info_plist_path = _gen_info_plist_outputs[0]\n\n        script = \"//build/config/ios/codesign.py\"\n        deps = [\n          \":$_generate_info_plist\",\n        ]\n        if (defined(invoker.entitlements_target)) {\n          deps += [ invoker.entitlements_target ]\n        }\n        sources = [\n          _entitlements_path,\n          _info_plist_path,\n        ]\n        outputs = [\n          _generate_entitlements_output,\n        ]\n\n        args = []\n        if (!use_system_xcode) {\n          args += [\n            \"--developer_dir\",\n            hermetic_xcode_path,\n          ]\n        }\n        args += [\n                  \"generate-entitlements\",\n                  \"-e=\" + rebase_path(_entitlements_path, root_build_dir),\n                  \"-p=\" + rebase_path(_info_plist_path, root_build_dir),\n                ] + rebase_path(outputs, root_build_dir)\n      }\n    }\n\n    _bundle_data_info_plist = target_name + \"_bundle_data_info_plist\"\n    bundle_data(_bundle_data_info_plist) {\n      forward_variables_from(invoker, [ \"testonly\" ])\n\n      sources = get_target_outputs(\":$_generate_info_plist\")\n      outputs = [\n        \"{{bundle_root_dir}}/Info.plist\",\n      ]\n      public_deps = [\n        \":$_generate_info_plist\",\n      ]\n    }\n\n    create_signed_bundle(_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"bundle_deps\",\n                               \"bundle_deps_filter\",\n                               \"bundle_extension\",\n                               \"data_deps\",\n                               \"deps\",\n                               \"enable_code_signing\",\n                               \"entitlements_path\",\n                               \"entitlements_target\",\n                               \"extra_system_frameworks\",\n                               \"product_type\",\n                               \"public_configs\",\n                               \"public_deps\",\n                               \"testonly\",\n                               \"visibility\",\n                             ])\n\n      output_name = _output_name\n      bundle_binary_target = \":$_lipo_executable_target\"\n      bundle_binary_output = _output_name\n\n      if (!defined(bundle_deps)) {\n        bundle_deps = []\n      }\n      bundle_deps += [ \":$_bundle_data_info_plist\" ]\n\n      if (use_ios_simulator) {\n        if (!defined(data_deps)) {\n          data_deps = []\n        }\n        data_deps += [ \"//testing/iossim\" ]\n      }\n\n      if (!defined(product_type)) {\n        product_type = \"com.apple.product-type.application\"\n      }\n\n      if (!defined(bundle_extension)) {\n        bundle_extension = \".app\"\n      }\n    }\n  }\n}\n\nset_defaults(\"ios_app_bundle\") {\n  configs = default_executable_configs\n}\n\n# Template to build an application extension bundle for iOS.\n#\n# This should be used instead of \"executable\" built-in target type on iOS.\n# As the template forward the generation of the application executable to\n# an \"executable\" target, all arguments supported by \"executable\" targets\n# are also supported by this template.\n#\n# Arguments\n#\n#   output_name:\n#       (optional) string, name of the generated application, if omitted,\n#       defaults to the target_name.\n#\n#   extra_substitutions:\n#       (optional) list of string in \"key=value\" format, each value will\n#       be used as an additional variable substitution rule when generating\n#       the application Info.plist\n#\n#   info_plist:\n#       (optional) string, path to the Info.plist file that will be used for\n#       the bundle.\n#\n#   info_plist_target:\n#       (optional) string, if the info_plist is generated from an action,\n#       rather than a regular source file, specify the target name in lieu\n#       of info_plist. The two arguments are mutually exclusive.\n#\n# For more information, see \"gn help executable\".\ntemplate(\"ios_appex_bundle\") {\n  ios_app_bundle(target_name) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"bundle_extension\",\n                             \"product_type\",\n                           ])\n    bundle_extension = \".appex\"\n    product_type = \"com.apple.product-type.app-extension\"\n\n    # Add linker flags required for an application extension (determined by\n    # inspecting the link command-line when using Xcode 9.0+).\n    if (!defined(ldflags)) {\n      ldflags = []\n    }\n    ldflags += [\n      \"-e\",\n      \"_NSExtensionMain\",\n      \"-fapplication-extension\",\n    ]\n  }\n}\n\nset_defaults(\"ios_appex_bundle\") {\n  configs = default_executable_configs\n}\n\n# Compile a xib or storyboard file and add it to a bundle_data so that it is\n# available at runtime in the bundle.\n#\n# Arguments\n#\n#   source:\n#       string, path of the xib or storyboard to compile.\n#\n# Forwards all variables to the bundle_data target.\ntemplate(\"bundle_data_xib\") {\n  assert(defined(invoker.source), \"source needs to be defined for $target_name\")\n\n  _source_extension = get_path_info(invoker.source, \"extension\")\n  assert(_source_extension == \"xib\" || _source_extension == \"storyboard\",\n         \"source must be a .xib or .storyboard for $target_name\")\n\n  _target_name = target_name\n  _compile_xib = target_name + \"_compile_xib\"\n\n  compile_xibs(_compile_xib) {\n    sources = [\n      invoker.source,\n    ]\n    visibility = [ \":$_target_name\" ]\n    ibtool_flags = [\n      \"--minimum-deployment-target\",\n      ios_deployment_target,\n      \"--auto-activate-custom-fonts\",\n      \"--target-device\",\n      \"iphone\",\n      \"--target-device\",\n      \"ipad\",\n    ]\n  }\n\n  bundle_data(_target_name) {\n    forward_variables_from(invoker, \"*\", [ \"source\" ])\n\n    if (!defined(public_deps)) {\n      public_deps = []\n    }\n    public_deps += [ \":$_compile_xib\" ]\n\n    sources = get_target_outputs(\":$_compile_xib\")\n\n    outputs = [\n      \"{{bundle_resources_dir}}/{{source_file_part}}\",\n    ]\n  }\n}\n\n# Compile a strings file and add it to a bundle_data so that it is available\n# at runtime in the bundle.\n#\n# Arguments\n#\n#   source:\n#       string, path of the strings file to compile.\n#\n#   output:\n#       string, path of the compiled file in the final bundle.\n#\n# Forwards all variables to the bundle_data target.\ntemplate(\"bundle_data_strings\") {\n  assert(defined(invoker.source), \"source needs to be defined for $target_name\")\n  assert(defined(invoker.output), \"output needs to be defined for $target_name\")\n\n  _source_extension = get_path_info(invoker.source, \"extension\")\n  assert(_source_extension == \"strings\",\n         \"source must be a .strings for $target_name\")\n\n  _target_name = target_name\n  _convert_target = target_name + \"_compile_strings\"\n\n  convert_plist(_convert_target) {\n    visibility = [ \":$_target_name\" ]\n    source = invoker.source\n    output =\n        \"$target_gen_dir/$_target_name/\" + get_path_info(invoker.source, \"file\")\n    format = \"binary1\"\n  }\n\n  bundle_data(_target_name) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"source\",\n                             \"output\",\n                           ])\n\n    if (!defined(public_deps)) {\n      public_deps = []\n    }\n    public_deps += [ \":$_convert_target\" ]\n\n    sources = get_target_outputs(\":$_convert_target\")\n\n    outputs = [\n      invoker.output,\n    ]\n  }\n}\n\n# Template to package a shared library into an iOS framework bundle.\n#\n# By default, the bundle target this template generates does not link the\n# resulting framework into anything that depends on it. If a dependency wants\n# a link-time (as well as build-time) dependency on the framework bundle,\n# depend against \"$target_name+link\". If only the build-time dependency is\n# required (e.g., for copying into another bundle), then use \"$target_name\".\n#\n# Arguments\n#\n#     output_name:\n#         (optional) string, name of the generated framework without the\n#         .framework suffix. If omitted, defaults to target_name.\n#\n#     public_headers:\n#         (optional) list of paths to header file that needs to be copied\n#         into the framework bundle Headers subdirectory. If omitted or\n#         empty then the Headers subdirectory is not created.\n#\n#     sources\n#         (optional) list of files. Needs to be defined and non-empty if\n#         public_headers is defined and non-empty.\n#\n#   enable_code_signing\n#       (optional) boolean, control whether code signing is enabled or not,\n#       default to ios_enable_code_signing if not defined.\n#\n# This template provides two targets for the resulting framework bundle. The\n# link-time behavior varies depending on which of the two targets below is\n# added as a dependency:\n#   - $target_name only adds a build-time dependency. Targets that depend on\n#     it will not link against the framework.\n#   - $target_name+link adds a build-time and link-time dependency. Targets\n#     that depend on it will link against the framework.\n#\n# The build-time-only dependency is used for when a target needs to use the\n# framework either only for resources, or because the target loads it at run-\n# time, via dlopen() or NSBundle. The link-time dependency will cause the\n# dependee to have the framework loaded by dyld at launch.\n#\n# Example of build-time only dependency:\n#\n#     framework_bundle(\"CoreTeleportation\") {\n#       sources = [ ... ]\n#     }\n#\n#     bundle_data(\"core_teleportation_bundle_data\") {\n#       deps = [ \":CoreTeleportation\" ]\n#       sources = [ \"$root_out_dir/CoreTeleportation.framework\" ]\n#       outputs = [ \"{{bundle_root_dir}}/Frameworks/{{source_file_part}}\" ]\n#     }\n#\n#     app_bundle(\"GoatTeleporter\") {\n#       sources = [ ... ]\n#       deps = [\n#         \":core_teleportation_bundle_data\",\n#       ]\n#     }\n#\n# The GoatTeleporter.app will not directly link against\n# CoreTeleportation.framework, but it will be included in the bundle's\n# Frameworks directory.\n#\n# Example of link-time dependency:\n#\n#     framework_bundle(\"CoreTeleportation\") {\n#       sources = [ ... ]\n#       ldflags = [\n#         \"-install_name\",\n#         \"@executable_path/../Frameworks/$target_name.framework\"\n#       ]\n#     }\n#\n#     bundle_data(\"core_teleportation_bundle_data\") {\n#       deps = [ \":CoreTeleportation+link\" ]\n#       sources = [ \"$root_out_dir/CoreTeleportation.framework\" ]\n#       outputs = [ \"{{bundle_root_dir}}/Frameworks/{{source_file_part}}\" ]\n#     }\n#\n#     app_bundle(\"GoatTeleporter\") {\n#       sources = [ ... ]\n#       deps = [\n#         \":core_teleportation_bundle_data\",\n#       ]\n#     }\n#\n# Note that the framework is still copied to the app's bundle, but dyld will\n# load this library when the app is launched because it uses the \"+link\"\n# target as a dependency. This also requires that the framework set its\n# install_name so that dyld can locate it.\n#\n# See \"gn help shared_library\" for more information on arguments supported\n# by shared library target.\ntemplate(\"ios_framework_bundle\") {\n  _target_name = target_name\n  _output_name = target_name\n  if (defined(invoker.output_name)) {\n    _output_name = invoker.output_name\n  }\n\n  _has_public_headers =\n      defined(invoker.public_headers) && invoker.public_headers != []\n\n  if (_has_public_headers) {\n    _framework_headers_target = _target_name + \"_framework_headers\"\n    _framework_headers_config = _target_name + \"_framework_headers_config\"\n    _headers_map_config = _target_name + \"_headers_map\"\n  }\n\n  _arch_shared_library_source = _target_name + \"_arch_shared_library_sources\"\n  _arch_shared_library_target = _target_name + \"_arch_shared_library\"\n  _lipo_shared_library_target = _target_name + \"_shared_library\"\n\n  source_set(_arch_shared_library_source) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"bundle_deps\",\n                             \"bundle_deps_filter\",\n                             \"data_deps\",\n                             \"enable_code_signing\",\n                             \"info_plist\",\n                             \"info_plist_target\",\n                             \"output_name\",\n                             \"visibility\",\n                           ])\n\n    visibility = [ \":$_arch_shared_library_target\" ]\n\n    if (_has_public_headers) {\n      configs += [\n        \":$_framework_headers_config($default_toolchain)\",\n        \":$_headers_map_config($default_toolchain)\",\n      ]\n\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += [ \":$_framework_headers_target($default_toolchain)\" ]\n    }\n  }\n\n  shared_library(_arch_shared_library_target) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"bundle_deps\",\n                             \"bundle_deps_filter\",\n                             \"data_deps\",\n                             \"enable_code_signing\",\n                             \"info_plist\",\n                             \"info_plist_target\",\n                             \"output_name\",\n                             \"sources\",\n                             \"visibility\",\n                           ])\n\n    visibility = [ \":$_lipo_shared_library_target($default_toolchain)\" ]\n    if (current_toolchain != default_toolchain) {\n      visibility += [ \":$_target_name\" ]\n    }\n\n    if (!defined(deps)) {\n      deps = []\n    }\n    deps += [ \":$_arch_shared_library_source\" ]\n\n    if (!defined(ldflags)) {\n      ldflags = []\n    }\n    ldflags += [\n      \"-Xlinker\",\n      \"-install_name\",\n      \"-Xlinker\",\n      \"@rpath/$_output_name.framework/$_output_name\",\n      \"-Xlinker\",\n      \"-objc_abi_version\",\n      \"-Xlinker\",\n      \"2\",\n    ]\n\n    output_extension = \"\"\n    output_name = _output_name\n    output_prefix_override = true\n    output_dir = \"$target_out_dir/$current_cpu\"\n  }\n\n  if (current_toolchain != default_toolchain) {\n    # For fat builds, only the default toolchain will generate a framework\n    # bundle. For the other toolchains, the template is only used for building\n    # the arch-specific binary, thus the default target is just a group().\n\n    group(_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"visibility\",\n                               \"testonly\",\n                             ])\n      public_deps = [\n        \":$_arch_shared_library_target\",\n      ]\n    }\n\n    group(_target_name + \"+link\") {\n      forward_variables_from(invoker,\n                             [\n                               \"visibility\",\n                               \"testonly\",\n                             ])\n      public_deps = [\n        \":$_target_name+link($default_toolchain)\",\n      ]\n    }\n\n    if (defined(invoker.bundle_deps)) {\n      assert(invoker.bundle_deps != [], \"mark bundle_deps as used\")\n    }\n  } else {\n    if (_has_public_headers) {\n      _public_headers = invoker.public_headers\n      _framework_root = \"$root_out_dir/$_output_name.framework\"\n\n      _header_map_filename = \"$target_gen_dir/$_output_name.headers.hmap\"\n\n      _compile_headers_map_target = _target_name + \"_compile_headers_map\"\n      action(_compile_headers_map_target) {\n        visibility = [ \":$_framework_headers_target\" ]\n        script = \"//build/config/ios/write_framework_hmap.py\"\n        outputs = [\n          _header_map_filename,\n        ]\n\n        # The header map generation only wants the list of headers, not all of\n        # sources, so filter any non-header source files from \"sources\". It is\n        # less error prone that having the developer duplicate the list of all\n        # headers in addition to \"sources\".\n        set_sources_assignment_filter([\n                                        \"*.c\",\n                                        \"*.cc\",\n                                        \"*.cpp\",\n                                        \"*.m\",\n                                        \"*.mm\",\n                                      ])\n        sources = invoker.sources\n        set_sources_assignment_filter([])\n\n        args = [\n                 rebase_path(_header_map_filename),\n                 rebase_path(_framework_root, root_build_dir),\n               ] + rebase_path(sources, root_build_dir)\n      }\n\n      _create_module_map_target = _target_name + \"_module_map\"\n      action(_create_module_map_target) {\n        visibility = [ \":$_framework_headers_target\" ]\n        script = \"//build/config/ios/write_framework_modulemap.py\"\n        outputs = [\n          \"$_framework_root/Modules/module.modulemap\",\n        ]\n        args = [ rebase_path(\"$_framework_root\", root_build_dir) ]\n      }\n\n      _copy_public_headers_target = _target_name + \"_copy_public_headers\"\n      copy(_copy_public_headers_target) {\n        visibility = [ \":$_framework_headers_target\" ]\n        sources = _public_headers\n        outputs = [\n          \"$_framework_root/Headers/{{source_file_part}}\",\n        ]\n      }\n\n      config(_headers_map_config) {\n        visibility = [ \":$_target_name\" ]\n        include_dirs = [ _header_map_filename ]\n      }\n\n      group(_framework_headers_target) {\n        deps = [\n          \":$_compile_headers_map_target\",\n          \":$_copy_public_headers_target\",\n          \":$_create_module_map_target\",\n        ]\n      }\n\n      config(_framework_headers_config) {\n        # The link settings are inherited from the framework_bundle config.\n        cflags = [\n          \"-F\",\n          rebase_path(\"$root_out_dir/.\", root_build_dir),\n        ]\n      }\n    }\n\n    lipo_binary(_lipo_shared_library_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"configs\",\n                               \"testonly\",\n                             ])\n\n      visibility = [ \":$_target_name\" ]\n      output_name = _output_name\n      arch_binary_target = \":$_arch_shared_library_target\"\n      arch_binary_output = _output_name\n    }\n\n    _framework_public_config = _target_name + \"_public_config\"\n    config(_framework_public_config) {\n      # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs\n      # and include_dirs to avoid duplicate values on the command-line.\n      visibility = [ \":$_target_name\" ]\n      ldflags = [\n        \"-F\",\n        rebase_path(\"$root_out_dir/.\", root_build_dir),\n      ]\n      lib_dirs = [ root_out_dir ]\n      libs = [ \"$_output_name.framework\" ]\n    }\n\n    _info_plist_target = _target_name + \"_info_plist\"\n    _info_plist_bundle = _target_name + \"_info_plist_bundle\"\n    ios_info_plist(_info_plist_target) {\n      visibility = [ \":$_info_plist_bundle\" ]\n      executable_name = _output_name\n      forward_variables_from(invoker,\n                             [\n                               \"extra_substitutions\",\n                               \"info_plist\",\n                               \"info_plist_target\",\n                             ])\n    }\n\n    bundle_data(_info_plist_bundle) {\n      visibility = [ \":$_target_name\" ]\n      forward_variables_from(invoker, [ \"testonly\" ])\n      sources = get_target_outputs(\":$_info_plist_target\")\n      outputs = [\n        \"{{bundle_root_dir}}/Info.plist\",\n      ]\n      public_deps = [\n        \":$_info_plist_target\",\n      ]\n    }\n\n    create_signed_bundle(_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"bundle_deps\",\n                               \"bundle_deps_filter\",\n                               \"data_deps\",\n                               \"deps\",\n                               \"enable_code_signing\",\n                               \"public_configs\",\n                               \"public_deps\",\n                               \"testonly\",\n                               \"visibility\",\n                             ])\n\n      product_type = \"com.apple.product-type.framework\"\n      bundle_extension = \".framework\"\n\n      output_name = _output_name\n      bundle_binary_target = \":$_lipo_shared_library_target\"\n      bundle_binary_output = _output_name\n\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += [ \":$_info_plist_bundle\" ]\n    }\n\n    group(_target_name + \"+link\") {\n      forward_variables_from(invoker,\n                             [\n                               \"public_deps\",\n                               \"public_configs\",\n                               \"testonly\",\n                               \"visibility\",\n                             ])\n      if (!defined(public_deps)) {\n        public_deps = []\n      }\n      public_deps += [ \":$_target_name\" ]\n      if (!defined(public_configs)) {\n        public_configs = []\n      }\n      public_configs += [ \":$_framework_public_config\" ]\n\n      if (_has_public_headers) {\n        public_configs += [ \":$_framework_headers_config\" ]\n      }\n    }\n\n    bundle_data(_target_name + \"+bundle\") {\n      forward_variables_from(invoker,\n                             [\n                               \"testonly\",\n                               \"visibility\",\n                             ])\n      public_deps = [\n        \":$_target_name\",\n      ]\n      sources = [\n        \"$root_out_dir/$_output_name.framework\",\n      ]\n      outputs = [\n        \"{{bundle_resources_dir}}/Frameworks/$_output_name.framework\",\n      ]\n    }\n  }\n}\n\nset_defaults(\"ios_framework_bundle\") {\n  configs = default_shared_library_configs\n}\n\n# For Chrome on iOS we want to run XCTests for all our build configurations\n# (Debug, Release, ...). In addition, the symbols visibility is configured to\n# private by default. To simplify testing with those constraints, our tests are\n# compiled in the TEST_HOST target instead of the .xctest bundle.\ntemplate(\"ios_xctest_test\") {\n  _target_name = target_name\n  _output_name = target_name\n  if (defined(invoker.output_name)) {\n    _output_name = invoker.output_name\n  }\n\n  _xctest_target = _target_name + \"_module\"\n  _xctest_output = _output_name + \"_module\"\n\n  _host_target = _target_name\n  _host_output = _output_name\n\n  _xctest_arch_loadable_module_target = _xctest_target + \"_arch_loadable_module\"\n  _xctest_lipo_loadable_module_target = _xctest_target + \"_loadable_module\"\n\n  loadable_module(_xctest_arch_loadable_module_target) {\n    visibility = [ \":$_xctest_lipo_loadable_module_target($default_toolchain)\" ]\n    if (current_toolchain != default_toolchain) {\n      visibility += [ \":$_xctest_target\" ]\n    }\n\n    sources = [\n      \"//build/config/ios/xctest_shell.mm\",\n    ]\n    configs += [ \"//build/config/ios:xctest_config\" ]\n\n    output_dir = \"$target_out_dir/$current_cpu\"\n    output_name = _xctest_output\n    output_prefix_override = true\n    output_extension = \"\"\n  }\n\n  if (current_toolchain != default_toolchain) {\n    # For fat builds, only the default toolchain will generate a test bundle.\n    # For the other toolchains, the template is only used for building the\n    # arch-specific binary, thus the default target is just a group().\n    group(_xctest_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"visibility\",\n                               \"testonly\",\n                             ])\n      public_deps = [\n        \":$_xctest_arch_loadable_module_target\",\n      ]\n    }\n  } else {\n    _xctest_info_plist_target = _xctest_target + \"_info_plist\"\n    _xctest_info_plist_bundle = _xctest_target + \"_info_plist_bundle\"\n    ios_info_plist(_xctest_info_plist_target) {\n      visibility = [ \":$_xctest_info_plist_bundle\" ]\n      info_plist = \"//build/config/ios/Module-Info.plist\"\n      extra_substitutions = [ \"MODULE_NAME=$_xctest_output\" ]\n      executable_name = _host_output\n    }\n\n    bundle_data(_xctest_info_plist_bundle) {\n      visibility = [ \":$_xctest_target\" ]\n      public_deps = [\n        \":$_xctest_info_plist_target\",\n      ]\n      sources = get_target_outputs(\":$_xctest_info_plist_target\")\n      outputs = [\n        \"{{bundle_root_dir}}/Info.plist\",\n      ]\n    }\n\n    lipo_binary(_xctest_lipo_loadable_module_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"configs\",\n                               \"testonly\",\n                             ])\n\n      visibility = [ \":$_xctest_target\" ]\n      output_name = _xctest_output\n      arch_binary_target = \":$_xctest_arch_loadable_module_target\"\n      arch_binary_output = _xctest_output\n    }\n\n    _xctest_bundle = _xctest_target + \"_bundle\"\n    create_signed_bundle(_xctest_target) {\n      forward_variables_from(invoker, [ \"enable_code_signing\" ])\n      visibility = [ \":$_xctest_bundle\" ]\n\n      product_type = \"com.apple.product-type.bundle.unit-test\"\n      bundle_extension = \".xctest\"\n\n      output_name = _xctest_output\n      bundle_binary_target = \":$_xctest_lipo_loadable_module_target\"\n      bundle_binary_output = _xctest_output\n\n      deps = [\n        \":$_xctest_info_plist_bundle\",\n      ]\n    }\n\n    bundle_data(_xctest_bundle) {\n      visibility = [ \":$_host_target\" ]\n      public_deps = [\n        \":$_xctest_target\",\n      ]\n      sources = [\n        \"$root_out_dir/$_xctest_output.xctest\",\n      ]\n      outputs = [\n        \"{{bundle_plugins_dir}}/$_xctest_output.xctest\",\n      ]\n    }\n  }\n\n  ios_app_bundle(_host_target) {\n    forward_variables_from(invoker, \"*\", [ \"testonly\" ])\n\n    testonly = true\n    output_name = _host_output\n    configs += [ \"//build/config/ios:xctest_config\" ]\n\n    if (!defined(invoker.info_plist) && !defined(invoker.info_plist_target)) {\n      info_plist = \"//build/config/ios/Host-Info.plist\"\n    }\n\n    # Xcode needs those two framework installed in the application (and signed)\n    # for the XCTest to run, so install them using extra_system_frameworks.\n    _ios_platform_library = \"$ios_sdk_platform_path/Developer/Library\"\n    extra_system_frameworks = [\n      \"$_ios_platform_library/Frameworks/XCTest.framework\",\n      \"$_ios_platform_library/PrivateFrameworks/IDEBundleInjection.framework\",\n    ]\n\n    if (current_toolchain == default_toolchain) {\n      if (!defined(bundle_deps)) {\n        bundle_deps = []\n      }\n      bundle_deps += [ \":$_xctest_bundle\" ]\n    }\n\n    if (!defined(ldflags)) {\n      ldflags = []\n    }\n    ldflags += [\n      \"-Xlinker\",\n      \"-rpath\",\n      \"-Xlinker\",\n      \"@executable_path/Frameworks\",\n      \"-Xlinker\",\n      \"-rpath\",\n      \"-Xlinker\",\n      \"@loader_path/Frameworks\",\n    ]\n  }\n}\n\nset_defaults(\"ios_xctest_test\") {\n  configs = default_executable_configs\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GN/isolate.gni",
    "content": "# Copyright 2016 the V8 project authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/sanitizers/sanitizers.gni\")\nimport(\"//third_party/icu/config.gni\")\nimport(\"v8.gni\")\n\ndeclare_args() {\n  # Sets the test isolation mode (noop|prepare|check).\n  v8_test_isolation_mode = \"noop\"\n}\n\ntemplate(\"v8_isolate_run\") {\n  forward_variables_from(invoker,\n                         \"*\",\n                         [\n                           \"deps\",\n                           \"isolate\",\n                         ])\n\n  # Remember target name as within the action scope the target name will be\n  # different.\n  name = target_name\n\n  assert(defined(invoker.deps))\n  assert(defined(invoker.isolate))\n\n  if (name != \"\" && v8_test_isolation_mode != \"noop\") {\n    action(name + \"_run\") {\n      testonly = true\n\n      deps = invoker.deps\n\n      script = \"//tools/isolate_driver.py\"\n\n      sources = [\n        invoker.isolate,\n      ]\n\n      inputs = [\n        # Files that are known to be involved in this step.\n        \"//tools/swarming_client/isolate.py\",\n        \"//tools/swarming_client/run_isolated.py\",\n      ]\n\n      if (v8_test_isolation_mode == \"prepare\") {\n        outputs = [\n          \"$root_out_dir/$name.isolated.gen.json\",\n        ]\n      } else if (v8_test_isolation_mode == \"check\") {\n        outputs = [\n          \"$root_out_dir/$name.isolated\",\n          \"$root_out_dir/$name.isolated.state\",\n        ]\n      }\n\n      # Translate gn to gyp variables.\n      if (is_asan) {\n        asan = \"1\"\n      } else {\n        asan = \"0\"\n      }\n      if (is_msan) {\n        msan = \"1\"\n      } else {\n        msan = \"0\"\n      }\n      if (is_tsan) {\n        tsan = \"1\"\n      } else {\n        tsan = \"0\"\n      }\n      if (is_cfi) {\n        cfi_vptr = \"1\"\n      } else {\n        cfi_vptr = \"0\"\n      }\n      if (target_cpu == \"x86\") {\n        target_arch = \"ia32\"\n      } else {\n        target_arch = target_cpu\n      }\n      if (is_debug) {\n        configuration_name = \"Debug\"\n      } else {\n        configuration_name = \"Release\"\n      }\n      if (is_component_build) {\n        component = \"shared_library\"\n      } else {\n        component = \"static_library\"\n      }\n      if (icu_use_data_file) {\n        icu_use_data_file_flag = \"1\"\n      } else {\n        icu_use_data_file_flag = \"0\"\n      }\n      if (v8_enable_inspector) {\n        enable_inspector = \"1\"\n      } else {\n        enable_inspector = \"0\"\n      }\n      if (v8_use_external_startup_data) {\n        use_external_startup_data = \"1\"\n      } else {\n        use_external_startup_data = \"0\"\n      }\n      if (v8_use_snapshot) {\n        use_snapshot = \"true\"\n      } else {\n        use_snapshot = \"false\"\n      }\n      if (v8_has_valgrind) {\n        has_valgrind = \"1\"\n      } else {\n        has_valgrind = \"0\"\n      }\n      if (v8_gcmole) {\n        gcmole = \"1\"\n      } else {\n        gcmole = \"0\"\n      }\n\n      # Note, all paths will be rebased in isolate_driver.py to be relative to\n      # the isolate file.\n      args = [\n        v8_test_isolation_mode,\n        \"--isolated\",\n        rebase_path(\"$root_out_dir/$name.isolated\", root_build_dir),\n        \"--isolate\",\n        rebase_path(invoker.isolate, root_build_dir),\n\n        # Path variables are used to replace file paths when loading a .isolate\n        # file\n        \"--path-variable\",\n        \"DEPTH\",\n        rebase_path(\"//\", root_build_dir),\n        \"--path-variable\",\n        \"PRODUCT_DIR\",\n        rebase_path(root_out_dir, root_build_dir),\n\n        # TODO(machenbach): Set variables for remaining features.\n        \"--config-variable\",\n        \"CONFIGURATION_NAME=$configuration_name\",\n        \"--config-variable\",\n        \"OS=$target_os\",\n        \"--config-variable\",\n        \"asan=$asan\",\n        \"--config-variable\",\n        \"cfi_vptr=$cfi_vptr\",\n        \"--config-variable\",\n        \"gcmole=$gcmole\",\n        \"--config-variable\",\n        \"has_valgrind=$has_valgrind\",\n        \"--config-variable\",\n        \"icu_use_data_file_flag=$icu_use_data_file_flag\",\n        \"--config-variable\",\n        \"is_gn=1\",\n        \"--config-variable\",\n        \"msan=$msan\",\n        \"--config-variable\",\n        \"tsan=$tsan\",\n        \"--config-variable\",\n        \"coverage=0\",\n        \"--config-variable\",\n        \"sanitizer_coverage=0\",\n        \"--config-variable\",\n        \"component=$component\",\n        \"--config-variable\",\n        \"target_arch=$target_arch\",\n        \"--config-variable\",\n        \"v8_enable_inspector=$enable_inspector\",\n        \"--config-variable\",\n        \"v8_use_external_startup_data=$use_external_startup_data\",\n        \"--config-variable\",\n        \"v8_use_snapshot=$use_snapshot\",\n      ]\n\n      if (is_win) {\n        args += [\n          \"--config-variable\",\n          \"msvs_version=2015\",\n        ]\n      } else {\n        args += [\n          \"--config-variable\",\n          \"msvs_version=0\",\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/GMLmenus.gml",
    "content": "// Source - https://github.com/faissaloo/GMLmenus/blob/master/GMLmenus.gml\n\n#define draw_menu\n///draw_menu(str,background,foreground,x,y,hpadding,vpadding,height,mouse_button)\n//Distributed under the MIT licence:\n/////////////////////////////////////////\n/*Permission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.*/\n/////////////////////////////////////////\n//Height is the height of 1 box\n//Menu syntax:\n//  |s = seperator (Bug: if |s is placed next to a |n an extra menu item would be added)\n//  |n = new item\nvar str, background, foreground,xx,yy, width, height;\nstr = \" \"+argument0 //A hacky thing so that it draws the first item properly, I should probably properly fix this later\nbackground = argument1\nforeground = argument2\nxx = argument3\nyy = argument4\nwidth = 0//argument5\nhpadding = argument5\nvpadding = argument6\nheight = argument7\nmb=argument8 //This is the main mouse button, I added this to give more choice to the dev\n//xx and yy should be corrected if they are placed outside of the room or if they will lead to the menu being cut off by the edge of the room\nitem_list = ds_list_create()\nitem_string = \"\"\n///////////////////////////////////\nfor (i=0;i<string_length(str);i+=1) //Parse the string, it's being set to -1 because it won't read the first character otherwise, yes this is very hacky and stupid, but I can't be bothered right now\n{\nif string_char_at(str,i)=\"|\" //If it finds a | it means there will be an escape character\n{\ni+=1 //Move to the next character\n\nswitch(string_char_at(str,i)) //Check which escape character it is\n{\ncase \"s\":\n    //i+=1\n    ds_list_add(item_list,\"|s\")\n    //ds_list_add(item_list,\"\") //This is for the meta info\n\ncase \"n\":\n    i+=1 //Skip the letter itself as we don't want it to be drawn\n    //For some reason this is always 10\n    //But it works perfectly fine if an escape code isn't the first character\n    //show_message(string(i)+\"<\"+string(string_length(str))) //Debug\n    for (ii=i;ii<=string_length(str);ii+=1)\n    {\n    //show_message(string_char_at(str,ii))\n    if string_char_at(str,ii)=\"|\"\n    {\n    //i-=1\n    break; //We don't want it to go any further if the next character is a backslash\n    }\n    //If the for loop hasn't been broken then it'll draw the character\n    item_string+=string_char_at(str,ii)\n    }\n    \n    if string_width(item_string)>width\n    {\n        width=string_width(item_string)\n    }\n    \n    \n    ds_list_add(item_list,item_string) //Add a new item to the list\n    item_string=\"\" //Reset the item_string\n}\n}\n}\ndraw_set_color(background)\n//draw_rectangle(xx,yy,xx+width,yy+(height*ds_list_size(item_list)),false) //Background, temporary?\ndraw_button(xx,yy,xx+width+(hpadding*2),yy+(height*(ds_list_size(item_list)-1))+vpadding,true) //Background, temporary?\n\nfor (i=0;i<ds_list_size(item_list);i+=1) //Go through the list of menu items\n{\n\n\n\n    draw_set_color(background)\n    //draw_rectangle(xx,yy+(height*i),xx+width,yy+(height),false) //Draw the rectange for this one, we're doing this so we can add cool effects to each of them\n    draw_set_color(foreground)\n    \n    if ds_list_find_value(item_list,i)=\"|s\"\n    {  \n        draw_line(xx+hpadding,yy+((height*(i+0.5))/2)+vpadding,xx+width,yy+((height*(i+0.5))/2)+vpadding) //Draw the seperator\n    }\n    else\n    {\n        //draw_text(xx+(width/10),yy+((height/2)*i),ds_list_find_value(item_list,i))\n        draw_text(xx+hpadding,yy+((height/2)*i)+vpadding,ds_list_find_value(item_list,i))\n        //padding\n    }\n    \n    if (mouse_x>xx) and (mouse_x<xx+width) and (mouse_y<yy+(height/2)*(i+1)) and (mouse_y>yy) and mouse_check_button_released(mb)\n    {\n        //show_message(i+1) //Debugging\n        return i+1; //Returns the number of the item in the list, we're adding 1 because 0 is reserved for if nothing is clicked\n    }\n\n    \n\n}\n\nif mouse_check_button_released(mb) and !(mouse_x>xx and mouse_y>yy and mouse_x<xx+width and mouse_y<yy+(height*(ds_list_size(item_list)-1))) //If the mouse was clicked outside\n{\n    return 0; //Return 0 to indicate that the user chose to exit the menu by clicking outside of it\n}\n\nreturn -1; //If we haven't already returned something, return a -1 to indicate that nothing was clicked\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/_piwikCacheRequest.gml",
    "content": "// Source - https://github.com/johnhatch14/GMS-Extensions/blob/master/PiwikAnalyticsForGMS/GMS_PiwikAnalytics.gmx/scripts/_piwikCacheRequest.gml\n\nvar jsonMap, fh;\n\nvar otz = date_get_timezone();\ndate_set_timezone(timezone_utc);\nvar requestToCache = argument0 + \"cdt=\"+_piwikUrlEncode(string(current_year)+\"-\"+\n                                 string(current_month)+\"-\"+\n                                 string(current_day)+\" \"+\n                                 string(current_hour)+\":\"+\n                                 string(current_minute)+\":\"+\n                                 string(current_second));\ndate_set_timezone(otz);\n\nif (file_exists(_Piwik_CacheFile))\n{\n //Verify cache signature to make sure no unwanted (heaven-forbid, malicious) requests have been added.\n var curCacheSig = sha1_string_utf8(sha1_file(_Piwik_CacheFile) + \"v5T7uAXnpQ3BGKq\" + string(game_id+2563542));\n ini_open(_Piwik_IniFile);\n var storedSig = ini_read_string(\"cache\", \"sig\", \"NULL\");\n ini_close();\n if (string_count(storedSig, curCacheSig) == 1)\n {\n    fh = file_text_open_read(_Piwik_CacheFile);\n    var cachedJson = base64_decode(file_text_read_string(fh));\n    file_text_close(fh);\n    \n    jsonMap = json_decode(cachedJson);\n    \n    if (!ds_exists(jsonMap, ds_type_map))\n       jsonMap = ds_map_create();\n }\n else\n {\n  if (_PiwikDebugOutput)\n     show_debug_message(\"Piwik Error: Signature mis-match. LOCAL REQUEST-CACHE HAS BEEN TAMPERED WITH! The ninjas are here somewhere...\");\n  jsonMap = ds_map_create();//Start with a fresh cache since the old one is corrupted. An ounce of lost analytics is worth a pound of security.\n }\n}\nelse\n{\n jsonMap = ds_map_create();\n}\n\nif (!is_undefined(jsonMap[? \"requests\"]))\n{\n ds_list_add(jsonMap[? \"requests\"], requestToCache);\n}\nelse\n{\n var requestList = ds_list_create();\n ds_list_add(requestList, requestToCache);\n \n ds_map_add_list(jsonMap, \"requests\", requestList);\n}\n\nvar newCachedJson = json_encode(jsonMap);\nds_map_destroy(jsonMap);\n\nfh = file_text_open_write(_Piwik_CacheFile);\nfile_text_write_string(fh, base64_encode(newCachedJson));\nfile_text_close(fh);\n\nvar cacheSig = sha1_string_utf8(sha1_file(_Piwik_CacheFile) + \"v5T7uAXnpQ3BGKq\" + string(game_id+2563542));\n\nini_open(_Piwik_IniFile);\nini_write_string(\"cache\", \"sig\", cacheSig);\nini_close();"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/_piwikSendBasicReq.gml",
    "content": "/***************************************************\n  Builds and sends the actual piwik tracking request\n  \n  Copyright (c) 2015 John Hatch\n  Licenced under the MIT licence: http://opensource.org/licenses/MIT\n ***************************************************/\n\n// Source - https://github.com/johnhatch14/GMS-Extensions/blob/master/PiwikAnalyticsForGMS/GMS_PiwikAnalytics.gmx/scripts/_piwikSendBasicReq.gml\n\n//Build argument map\n   var args = ds_map_create();\n   \n   //-----\n   // Populate GET arguments to Piwik HTTP API\n   // See full HTTP API reference at http://developer.piwik.org/api-reference/tracking-api\n   //-----\n   \n   //Required args\n   ds_map_add(args, \"idsite\", string(_Piwik_idsite));\n   ds_map_add(args, \"rec\", \"1\");\n   ds_map_add(args, \"url\", _piwikUrlEncode(_Piwik_baseurl + \"/\" + room_get_name(room)));\n   ds_map_add(args, \"apiv\", \"1\");\n   ds_map_add(args, \"_id\", _piwikUrlEncode(_Piwik_id));\n   ds_map_add(args, \"rand\", _piwikUrlEncode( string(round(random(999999999)+game_id)) ));\n   //ds_map_add(args, \"new_visit\", \"0\");\n   \n   //Pass local time to API\n   var ctz = date_get_timezone();\n   date_set_timezone(timezone_local);\n   var now = date_current_datetime();\n   ds_map_add(args, \"h\", _piwikUrlEncode(string(date_get_hour(now))));\n   ds_map_add(args, \"m\", _piwikUrlEncode(string(date_get_minute(now))));\n   ds_map_add(args, \"s\", _piwikUrlEncode(string(date_get_second(now))));\n   date_set_timezone(ctz);\n   \n   // Add any other arguments passed to script in the form \"param=value\" to the http arg map\n   //-----\n   var arg_keyval;\n   for (var i=0; i<argument_count; i++)\n   {\n    arg_keyval = _piwikStringExplode(argument[i],'=');\n    ds_map_add(args, arg_keyval[0], _piwikUrlEncode(string(arg_keyval[1])));\n   }\n\n//Build argument string\n   var argstring = \"\";\n   var prevkey = ds_map_find_first(args);\n   argstring += (prevkey + \"=\" + args[? prevkey] + \"&\");\n   repeat (ds_map_size(args)-1)\n   {\n    prevkey = ds_map_find_next(args, prevkey);\n    argstring += (prevkey + \"=\" + args[? prevkey] + \"&\");\n   }\nds_map_destroy(args);\n\n//Append query string to ds_list of requests to be sent at End Step. \nds_list_add(_PIWIK_REQS, \"?\" + argstring);"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/_piwikSendReq.gml",
    "content": "/***************************************************\n  Builds and sends the actual piwik tracking request\n  \n  Copyright (c) 2015 John Hatch\n  Licenced under the MIT licence: http://opensource.org/licenses/MIT\n ***************************************************/\n\n// Source - https://github.com/johnhatch14/GMS-Extensions/blob/master/PiwikAnalyticsForGMS/GMS_PiwikAnalytics.gmx/scripts/_piwikSendReq.gml\n\n//Build argument map\n   var args = ds_map_create();\n   \n   //-----\n   // Populate GET arguments to Piwik HTTP API\n   // See full HTTP API reference at http://developer.piwik.org/api-reference/tracking-api\n   //-----\n   \n   //Required args\n   ds_map_add(args, \"idsite\", string(_Piwik_idsite));\n   ds_map_add(args, \"rec\", \"1\");\n   //ds_map_add(args, \"send_image\", \"0\");\n   ds_map_add(args, \"url\", _piwikUrlEncode(_Piwik_baseurl));\n   \n   //\n   ds_map_add(args, \"apiv\", \"1\");\n   ds_map_add(args, \"_id\", _piwikUrlEncode(_Piwik_id));\n   ds_map_add(args, \"rand\", _piwikUrlEncode( string(round(random(999999999)+game_id)) ));\n   \n   //Pass local time to API\n   var ctz = date_get_timezone();\n   date_set_timezone(timezone_local);\n   var now = date_current_datetime();\n   ds_map_add(args, \"h\", _piwikUrlEncode(string(date_get_hour(now))));\n   ds_map_add(args, \"m\", _piwikUrlEncode(string(date_get_minute(now))));\n   ds_map_add(args, \"s\", _piwikUrlEncode(string(date_get_second(now))));\n   date_set_timezone(ctz);\n   \n   //Pass local display resolution\n   ds_map_add(args, \"res\", _piwikUrlEncode(string(display_get_width())+'x'+string(display_get_height())));\n   \n   //Pass local language\n   ds_map_add(args, \"lang\", _piwikUrlEncode(os_get_language()));\n   \n   //Pass stored values if they exist\n   if (_Piwik_idvc != -1)\n      ds_map_add(args, \"_idvc\", _piwikUrlEncode(string(_Piwik_idvc)));\n   if (_Piwik_idts != -1)\n      ds_map_add(args, \"_idts\", _piwikUrlEncode(string(_Piwik_idts)));\n   if (_Piwik_viewts != -1)\n      ds_map_add(args, \"_viewts\", _piwikUrlEncode(string(_Piwik_viewts)));\n   \n   //-----\n   // Add any other arguments passed to script in the form \"param=value\" to the http arg map\n   //-----\n   var arg_keyval;\n   for (var i=0; i<argument_count; i++)\n   {\n    arg_keyval = _piwikStringExplode(argument[i],'=');\n    ds_map_add(args, arg_keyval[0], _piwikUrlEncode(string(arg_keyval[1])));\n   }\n\n//Build argument string\n   var argstring = \"\";\n   var prevkey = ds_map_find_first(args);\n   argstring += (prevkey + \"=\" + args[? prevkey] + \"&\");\n   repeat (ds_map_size(args)-1)\n   {\n    prevkey = ds_map_find_next(args, prevkey);\n    argstring += (prevkey + \"=\" + args[? prevkey] + \"&\");\n   }\nds_map_destroy(args);\n\n//Append query string to ds_list of requests to be sent at End Step. \nds_list_add(_PIWIK_REQS, \"?\" + argstring);"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/characterDrawEvent.gml",
    "content": "// Originally from /spelunky/Scripts/Platform Engine/characterDrawEvent.gml in the Spelunky Community Update Project\n\n/**********************************************************************************\n    Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC\n    \n    This file is part of Spelunky.\n\n    You can redistribute and/or modify Spelunky, including its source code, under\n    the terms of the Spelunky User License.\n\n    Spelunky is distributed in the hope that it will be entertaining and useful,\n    but WITHOUT WARRANTY. Please see the Spelunky User License for more details.\n\n    The Spelunky User License should be available in \"Game Information\", which\n    can be found in the Resource Explorer, or as an external file called COPYING.\n    If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>\n    \n***********************************************************************************/\n\n/*\nThis event should be placed in the draw event of the platform character.\n*/\n//draws the sprite\ndraw = true;\nif (facing == RIGHT) image_xscale = -1;\nelse image_xscale = 1;\n\nif (blinkToggle != 1)\n{\n    if ((state == CLIMBING or (sprite_index == sPExit or sprite_index == sDamselExit or sprite_index == sTunnelExit)) and global.hasJetpack and not whipping)\n    {\n        draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha);\n        //draw_sprite(sprite_index,-1,x,y);\n        draw_sprite(sJetpackBack,-1,x,y);\n        draw = false;\n    }\n    else if (global.hasJetpack and facing == RIGHT) draw_sprite(sJetpackRight,-1,x-4,y-1);\n    else if (global.hasJetpack) draw_sprite(sJetpackLeft,-1,x+4,y-1);\n    if (draw)\n    {\n        if (redColor > 0) draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, make_color_rgb(200 + redColor,0,0), image_alpha);\n        else draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha);\n    }\n    if (facing == RIGHT)\n    {\n        if (holdArrow == ARROW_NORM)\n        {\n            draw_sprite(sArrowRight, -1, x+4, y+1);\n        }\n        else if (holdArrow == ARROW_BOMB)\n        {\n            if (holdArrowToggle) draw_sprite(sBombArrowRight, 0, x+4, y+2);\n            else draw_sprite(sBombArrowRight, 1, x+4, y+2);\n        }\n    }\n    else if (facing == LEFT)\n    {\n        if (holdArrow == ARROW_NORM)\n        {\n            draw_sprite(sArrowLeft, -1, x-4, y+1);\n        }\n        else if (holdArrow == ARROW_BOMB)\n        {\n            if (holdArrowToggle) draw_sprite(sBombArrowLeft, 0, x-4, y+2);\n            else draw_sprite(sBombArrowLeft, 1, x-4, y+2);\n        }\n    }\n}\n/*\nif canRun\n{\n  xOffset=80\n  if player=1\n    yOffset=120\n  else\n    yOffset=143\n  //draw the \"flySpeed\" bar, which shows how much speed the character has acquired while holding the \"run\" button\n  //draw_healthbar(view_xview[0]+224+xOffset,view_yview[0]+432+yOffset,view_xview[0]+400+xOffset,view_yview[0]+450+yOffset,flySpeed,make_color_rgb(0,64,128),c_blue,c_aqua,0,1,1)\n}\n*/\n"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/characterStepEvent.gml",
    "content": "// Originally from /spelunky/Scripts/Platform Engine/characterStepEvent.gml in the Spelunky Community Update Project\n\n/**********************************************************************************\n    Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC\n    \n    This file is part of Spelunky.\n\n    You can redistribute and/or modify Spelunky, including its source code, under\n    the terms of the Spelunky User License.\n\n    Spelunky is distributed in the hope that it will be entertaining and useful,\n    but WITHOUT WARRANTY. Please see the Spelunky User License for more details.\n\n    The Spelunky User License should be available in \"Game Information\", which\n    can be found in the Resource Explorer, or as an external file called COPYING.\n    If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>\n    \n***********************************************************************************/\n\n/*\nThis script should be placed in the step event for the platform character.\nIt updates the keys used by the character, moves all of the solids, moves the\ncharacter, sets the sprite index, and sets the animation speed for the sprite.\n*/\nhangCountMax = 3;\n\n//////////////////////////////////////\n// KEYS\n//////////////////////////////////////\n\nkLeft = checkLeft();\n\nif (kLeft) kLeftPushedSteps += 1;\nelse kLeftPushedSteps = 0;\n  \nkLeftPressed = checkLeftPressed();\nkLeftReleased = checkLeftReleased();\n  \nkRight = checkRight();\n  \nif (kRight) kRightPushedSteps += 1;\nelse kRightPushedSteps = 0;\n  \nkRightPressed = checkRightPressed();\nkRightReleased = checkRightReleased();\n  \nkUp = checkUp();\nkDown = checkDown();\n  \n//key \"run\"\nif canRun\n    kRun = 0;\n// kRun=runKey\nelse\n    kRun=0\n  \nkJump = checkJump();\nkJumpPressed = checkJumpPressed();\nkJumpReleased = checkJumpReleased();\n  \nif (cantJump > 0)\n{\n    kJump = 0;\n    kJumpPressed = 0;\n    kJumpReleased = 0;\n    cantJump -= 1;\n}\nelse\n{\n    if (global.isTunnelMan and\n        sprite_index == sTunnelAttackL and\n        !holdItem)\n    {\n        kJump = 0;\n        kJumpPressed = 0;\n        kJumpReleased = 0;\n        cantJump -= 1;\n    }\n}\n\nkAttack = checkAttack();\nkAttackPressed = checkAttackPressed();\nkAttackReleased = checkAttackReleased();\n\nkItemPressed = checkItemPressed();\n\nxPrev = x;\nyPrev = y;\n\nif (stunned or dead)\n{\n    kLeft = false;\n    kLeftPressed = false;\n    kLeftReleased = false;\n    kRight = false;\n    kRightPressed = false;\n    kRightReleased = false;\n    kUp = false;\n    kDown = false;\n    kJump = false;\n    kJumpPressed = false;\n    kJumpReleased = false;\n    kAttack = false;\n    kAttackPressed = false;\n    kAttackReleased = false;\n    kItemPressed = false;\n}\n\n//////////////////////////////////////////\n// Collisions\n//////////////////////////////////////////\n\ncolSolidLeft = false;\ncolSolidRight = false;\ncolLeft = false;\ncolRight = false;\ncolTop = false;\ncolBot = false;\ncolLadder = false;\ncolPlatBot = false;\ncolPlat = false;\ncolWaterTop = false;\ncolIceBot = false;\nrunKey = false;\nif (isCollisionMoveableSolidLeft(1)) colSolidLeft = true;\nif (isCollisionMoveableSolidRight(1)) colSolidRight = true;\nif (isCollisionLeft(1)) colLeft = true;\nif (isCollisionRight(1)) colRight = true;\nif (isCollisionTop(1)) colTop = true;\nif (isCollisionBottom(1)) colBot = true;\nif (isCollisionLadder()) colLadder = true;\nif (isCollisionPlatformBottom(1)) colPlatBot = true;\nif (isCollisionPlatform()) colPlat = true;\nif (isCollisionWaterTop(1)) colWaterTop = true;\nif (collision_point(x, y+8, oIce, 0, 0)) colIceBot = true;\nif (checkRun())\n{\n    runHeld = 100;\n    runKey = true;\n}\n\nif (checkAttack() and not whipping)\n{\n    runHeld += 1;\n    runKey = true;\n}\n\nif (not runKey or (not kLeft and not kRight)) runHeld = 0;\n\n// allows the character to run left and right\n// if state!=DUCKING and state!=LOOKING_UP and state!=CLIMBING\nif (state != CLIMBING and state != HANGING)\n{\n    if (kLeftReleased and approximatelyZero(xVel)) xAcc -= 0.5\n    if (kRightReleased and approximatelyZero(xVel)) xAcc += 0.5\n    \n    if (kLeft and not kRight)\n    {\n        if (colSolidLeft)\n        {\n            // xVel = 3;\n            if (platformCharacterIs(ON_GROUND) and state != DUCKING)\n            {\n                xAcc -= 1;\n                pushTimer += 10;\n                //if (not SS_IsSoundPlaying(global.sndPush)) playSound(global.sndPush);\n            }\n        }\n        else if (kLeftPushedSteps > 2) and (facing=LEFT or approximatelyZero(xVel))\n        {\n            xAcc -= runAcc;\n        }\n        facing = LEFT;\n        //if (platformCharacterIs(ON_GROUND) and abs(xVel) > 0 and alarm[3] < 1) alarm[3] = floor(16/-xVel);\n    }\n  \n    if (kRight and not kLeft)\n    {\n        if (colSolidRight)\n        {\n            // xVel = 3;\n            if (platformCharacterIs(ON_GROUND) and state != DUCKING)\n            {\n                xAcc += 1;\n                pushTimer += 10;\n                //if (not SS_IsSoundPlaying(global.sndPush)) playSound(global.sndPush);\n            }\n        }\n        else if (kRightPushedSteps > 2 or colSolidLeft) and (facing=RIGHT or approximatelyZero(xVel))\n        {\n            xAcc += runAcc;\n        }\n        facing = RIGHT;\n        //if (platformCharacterIs(ON_GROUND) and abs(xVel) > 0 and alarm[3] < 1) alarm[3] = floor(16/xVel);\n    }\n}\n\n/******************************************\n\n  LADDERS\n  \n*******************************************/\n\nif (state == CLIMBING)\n{\n    if (instance_exists(oCape))\n    {\n        oCape.open = false;\n    }\n    kJumped = false;\n    ladderTimer = 10;\n    ladder = collision_point(x, y, oLadder, 0, 0);\n    if (ladder) x = ladder.x + 8;\n\n    if (kLeft) facing = LEFT;\n    else if (kRight) facing = RIGHT;\n    if (kUp)\n    {\n        if (collision_point(x, y-8, oLadder, 0, 0) or collision_point(x, y-8, oLadderTop, 0, 0))\n        {\n            yAcc -= climbAcc;\n            if (alarm[2] < 1) alarm[2] = 8;\n        }\n    }\n    else if (kDown)\n    {\n        if (collision_point(x, y+8, oLadder, 0, 0) or collision_point(x, y+8, oLadderTop, 0, 0))\n        {\n            yAcc += climbAcc;\n            if (alarm[2] < 1) alarm[2] = 8;\n        }\n        else\n            state = FALLING;\n        if (colBot) state = STANDING;\n    }\n    \n    if (kJumpPressed and not whipping)\n    {\n        if (kLeft)\n            xVel = -departLadderXVel;\n        else if (kRight)\n            xVel = departLadderXVel;\n        else\n            xVel = 0;\n        yAcc += departLadderYVel;\n        state = JUMPING;\n        jumpButtonReleased = 0;\n        jumpTime = 0;\n        ladderTimer = 5;\n    }\n}\nelse\n{\n     if (ladderTimer > 0) ladderTimer -= 1;\n}\n\nif (platformCharacterIs(IN_AIR) and state != HANGING)\n{\n    yAcc += gravityIntensity;\n}\n\n// Player has landed\nif ((colBot or colPlatBot) and platformCharacterIs(IN_AIR) and yVel >= 0)\n{\n    if (not colPlat or colBot)\n    {\n        yVel = 0;\n        yAcc = 0;\n        state = RUNNING;\n        jumps = 0;\n    }\n    //playSound(global.sndLand);\n}\nif ((colBot or colPlatBot) and not colPlat) yVel = 0;\n\n// Player has just walked off of the edge of a solid\nif (colBot == 0 and (not colPlatBot or colPlat) and platformCharacterIs(ON_GROUND))\n{\n    state = FALLING;\n    yAcc += grav;\n    kJumped = true;\n    if (global.hasGloves) hangCount = 5;\n}\n\nif (colTop)\n{\n    if (dead or stunned) yVel = -yVel * 0.8;\n    else if (state == JUMPING) yVel = abs(yVel*0.3)\n}\n\nif (colLeft and facing == LEFT) or (colRight and facing == RIGHT)\n{\n    if (dead or stunned) xVel = -xVel * 0.5;\n    else xVel = 0;\n}\n\n/******************************************\n\n  JUMPING\n  \n*******************************************/\n\nif (kJumpReleased and platformCharacterIs(IN_AIR))\n{\n    kJumped = true;\n}\nelse if (platformCharacterIs(ON_GROUND))\n{\n    oCape.open = false;\n    kJumped = false;\n}\n\nif (kJumpPressed and collision_point(x, y, oWeb, 0, 0))\n{\n    obj = instance_place(x, y, oWeb);\n    obj.life -= 1;\n    yAcc += initialJumpAcc * 2;\n    yVel -= 3;\n    xAcc += xVel/2;\n    \n    state = JUMPING;\n    jumpButtonReleased = 0;\n    jumpTime = 0;\n    \n    grav = gravNorm;\n}\nelse if (kJumpPressed and colWaterTop)\n{\n    yAcc += initialJumpAcc * 2;\n    yVel -= 3;\n    xAcc += xVel/2;\n    \n    state = JUMPING;\n    jumpButtonReleased = 0;\n    jumpTime = 0;\n    \n    grav = gravNorm;\n}\nelse if (global.hasCape and kJumpPressed and kJumped and platformCharacterIs(IN_AIR))\n{\n    if (not oCape.open) oCape.open = true;\n    else oCape.open = false;\n}\nelse if (global.hasJetpack and kJump and kJumped and platformCharacterIs(IN_AIR) and jetpackFuel > 0)\n{\n    yAcc += initialJumpAcc;\n    yVel = -1;\n    jetpackFuel -= 1;\n    if (alarm[10] < 1) alarm[10] = 3;\n    \n    state = JUMPING;\n    jumpButtonReleased = 0;\n    jumpTime = 0;\n    \n    grav = 0;\n}\nelse if (platformCharacterIs(ON_GROUND) and kJumpPressed and fallTimer == 0)\n{\n    if (xVel > 3 or xVel < -3)\n    {\n        yAcc += initialJumpAcc * 2;\n        xAcc += xVel * 2;\n    }\n    else\n    {\n        yAcc += initialJumpAcc * 2;\n        xAcc += xVel/2;\n    }\n    \n    if (global.hasJordans)\n    {\n        yAcc *= 3;\n        yAccLimit = 12;\n        grav = 0.5;\n    }\n    else if (global.hasSpringShoes) yAcc *= 1.5;\n    else\n    {\n        yAccLimit = 6;\n        grav = gravNorm;\n    }\n    \n    playSound(global.sndJump);\n    \n    pushTimer = 0;\n\n    // the \"state\" gets changed to JUMPING later on in the code\n    state = FALLING;\n    // \"variable jumping\" states\n    jumpButtonReleased = 0;\n    jumpTime = 0;\n}\n\nif (jumpTime < jumpTimeTotal) jumpTime += 1;\n//let the character continue to jump\nif (kJump == 0) jumpButtonReleased = 1;\nif (jumpButtonReleased) jumpTime = jumpTimeTotal;\n\ngravityIntensity = (jumpTime/jumpTimeTotal) * grav;\n\nif (kUp and platformCharacterIs(ON_GROUND) and not colLadder)\n{\n    looking = UP;\n    if (xVel == 0 and xAcc == 0) state = LOOKING_UP;\n}\nelse looking = 0;\n\nif (not kUp and state == LOOKING_UP)\n{\n    state=STANDING\n}\n\n/******************************************\n\n  HANGING\n  \n*******************************************/\n\nif (not colTop)\n{\nif (global.hasGloves and yVel > 0)\n{\n    if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and\n        (collision_point(x+9, y-5, oSolid, 0, 0) or collision_point(x+9, y-6, oSolid, 0, 0)))\n    {\n        state = HANGING;\n        move_snap(1, 8);\n        yVel = 0;\n        yAcc = 0;\n        grav = 0;\n    }\n    else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and\n        (collision_point(x-9, y-5, oSolid, 0, 0) or collision_point(x-9, y-6, oSolid, 0, 0)))\n    {\n        state = HANGING;\n        move_snap(1, 8);\n        yVel = 0;\n        yAcc = 0;\n        grav = 0;\n    }\n}\nelse if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and\n        (collision_point(x+9, y-5, oTree, 0, 0) or collision_point(x+9, y-6, oTree, 0, 0)))\n{\n    state = HANGING;\n    move_snap(1, 8);\n    yVel = 0;\n    yAcc = 0;\n    grav = 0;\n}\nelse if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and\n        (collision_point(x-9, y-5, oTree, 0, 0) or collision_point(x-9, y-6, oTree, 0, 0)))\n{\n    state = HANGING;\n    move_snap(1, 8);\n    yVel = 0;\n    yAcc = 0;\n    grav = 0;\n}\nelse if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and\n    (collision_point(x+9, y-5, oSolid, 0, 0) or collision_point(x+9, y-6, oSolid, 0, 0)) and\n    not collision_point(x+9, y-9, oSolid, 0, 0) and not collision_point(x, y+9, oSolid, 0, 0))\n{\n  state = HANGING;\n  move_snap(1, 8);\n  yVel = 0;\n  yAcc = 0;\n  grav = 0;\n}\nelse if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and\n    (collision_point(x-9, y-5, oSolid, 0, 0) or collision_point(x-9, y-6, oSolid, 0, 0)) and\n    not collision_point(x-9, y-9, oSolid, 0, 0) and not collision_point(x, y+9, oSolid, 0, 0))\n{\n  state = HANGING;\n  move_snap(1, 8);\n  yVel = 0;\n  yAcc = 0;\n  grav = 0;\n}\n\nif (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and state == FALLING and\n    (collision_point(x, y-5, oArrow, 0, 0) or collision_point(x, y-6, oArrow, 0, 0)) and\n    not collision_point(x, y-9, oArrow, 0, 0) and not collision_point(x, y+9, oArrow, 0, 0))\n{\n    obj = instance_nearest(x, y-5, oArrow);\n    if (obj.stuck)\n    {\n        state = HANGING;\n        // move_snap(1, 8);\n        yVel = 0;\n        yAcc = 0;\n        grav = 0;\n    }\n}\n\n/*\nif (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and state == FALLING and\n    (collision_point(x, y-5, oTreeBranch, 0, 0) or collision_point(x, y-6, oTreeBranch, 0, 0)) and\n    not collision_point(x, y-9, oTreeBranch, 0, 0) and not collision_point(x, y+9, oTreeBranch, 0, 0))\n{\n  state = HANGING;\n  // move_snap(1, 8);\n  yVel = 0;\n  yAcc = 0;\n  grav = 0;\n}\n*/\n\n}\n\nif (hangCount > 0) hangCount -= 1;\n\nif (state == HANGING)\n{\n    if (instance_exists(oCape)) oCape.open = false;\n    kJumped = false;\n    \n    if (kDown and kJumpPressed)\n    {\n        grav = gravNorm;\n        state = FALLING;\n        yAcc -= grav;\n        hangCount = 5;\n        if (global.hasGloves) hangCount = 10;\n    }\n    else if (kJumpPressed)\n    {\n        grav = gravNorm;\n        if ((facing == RIGHT and kLeft) or (facing == LEFT and kRight))\n        {\n            state = FALLING;\n            yAcc -= grav;\n        }\n        else\n        {\n            state = JUMPING;\n            yAcc += initialJumpAcc * 2;\n            if (facing == RIGHT) x -= 2;\n            else x += 2;\n        }\n        hangCount = hangCountMax;\n    }\n    \n    if ((facing == LEFT and not isCollisionLeft(2)) or\n        (facing == RIGHT and not isCollisionRight(2)))\n    {\n        grav = gravNorm;\n        state = FALLING;\n        yAcc -= grav;\n        hangCount = 4;\n    }\n}\nelse\n{\n    grav = gravNorm;\n}\n\n// pressing down while standing\nif (kDown and platformCharacterIs(ON_GROUND) and not whipping)\n{\n    if (colBot)\n    {\n        state = DUCKING;\n    }\n    else if colPlatBot\n    {\n        // climb down ladder if possible, else jump down\n        fallTimer = 0;\n        if (not colBot)\n        {\n            ladder = 0;\n            ladder = instance_place(x, y+16, oLadder);\n            if (instance_exists(ladder))\n            {\n                if (abs(x-(ladder.x+8)) < 4)\n                {\n                    x = ladder.x + 8;\n\n                    xVel = 0;\n                    yVel = 0;\n                    xAcc = 0;\n                    yAcc = 0;\n                    state = CLIMBING;\n                }\n            }\n            else\n            {\n                y += 1;\n                state = FALLING;\n                yAcc += grav;\n            }\n        }\n        else\n        {\n            //the character can't move down because there is a solid in the way\n            state = RUNNING;\n        }\n    }\n}\nif (not kDown and state == DUCKING)\n{\n    state = STANDING;\n    xVel = 0;\n    xAcc = 0;\n}\nif (xVel == 0 and xAcc == 0 and state == RUNNING)\n{\n    state = STANDING;\n}\nif (xAcc != 0 and state == STANDING)\n{\n    state = RUNNING;\n}\nif (yVel < 0 and platformCharacterIs(IN_AIR) and state != HANGING)\n{\n    state = JUMPING;\n}\nif (yVel > 0 and platformCharacterIs(IN_AIR) and state != HANGING)\n{\n    state = FALLING;\n    setCollisionBounds(-5, -6, 5, 8);\n}\nelse setCollisionBounds(-5, -8, 5, 8);\n\n// CLIMB LADDER\ncolPointLadder = collision_point(x, y, oLadder, 0, 0) or collision_point(x, y, oLadderTop, 0, 0);\n\nif ((kUp and platformCharacterIs(IN_AIR) and collision_point(x, y-8, oLadder, 0, 0) and ladderTimer == 0) or\n    (kUp and colPointLadder and ladderTimer == 0) or\n    (kDown and colPointLadder and ladderTimer == 0 and platformCharacterIs(ON_GROUND) and collision_point(x, y+9, oLadderTop, 0, 0) and xVel == 0))\n{\n    ladder = 0;\n    ladder = instance_place(x, y-8, oLadder);\n    if (instance_exists(ladder))\n    {\n        if (abs(x-(ladder.x+8)) < 4)\n        {\n            x = ladder.x + 8;\n            if (not collision_point(x, y, oLadder, 0, 0) and\n                not collision_point(x, y, oLadderTop, 0, 0))\n            {\n                y = ladder.y + 14;\n            }\n\n            xVel = 0;\n            yVel = 0;\n            xAcc = 0;\n            yAcc = 0;\n            state = CLIMBING;\n        }\n    }\n}\n\n/*\nif (sprite_index == sDuckToHangL or sprite_index == sDamselDtHL)\n{\n    ladder = 0;\n    if (facing == LEFT and collision_rectangle(x-8, y, x, y+16, oLadder, 0, 0) and not collision_point(x-4, y+16, oSolid, 0, 0))\n    {\n        ladder = instance_nearest(x-4, y+16, oLadder);\n    }\n    else if (facing == RIGHT and collision_rectangle(x, y, x+8, y+16, oLadder, 0, 0) and not collision_point(x+4, y+16, oSolid, 0, 0))\n    {\n        ladder = instance_nearest(x+4, y+16, oLadder);\n    }\n    \n    if (ladder)\n    {\n        x = ladder.x + 8;\n\n        xVel = 0;\n        yVel = 0;\n        xAcc = 0;\n        yAcc = 0;\n        state = CLIMBING;\n    }\n}\n*/\n/*\nif (colLadder and state == CLIMBING and kJumpPressed and not whipping)\n{\n    if (kLeft)\n        xVel = -departLadderXVel;\n    else if (kRight)\n        xVel = departLadderXVel;\n    else\n        xVel = 0;\n    yAcc += departLadderYVel;\n    state = JUMPING;\n    jumpButtonReleased = 0;\n    jumpTime = 0;\n    ladderTimer = 5;\n}\n*/\n\n// Calculate horizontal/vertical friction\nif (state == CLIMBING)\n{\n    xFric = frictionClimbingX;\n    yFric = frictionClimbingY;\n}\nelse\n{\n    if (runKey and platformCharacterIs(ON_GROUND) and runHeld >= 10)\n    {\n        if (kLeft) // run\n        {\n            xVel -= 0.1;\n            xVelLimit = 6;\n            xFric = frictionRunningFastX;\n        }\n        else if (kRight)\n        {\n            xVel += 0.1;\n            xVelLimit = 6;\n            xFric = frictionRunningFastX;\n        }\n    }\n    else if (state == DUCKING)\n    {\n        if (xVel<2 and xVel>-2)\n        {\n            xFric = 0.2\n            xVelLimit = 3;\n            image_speed = 0.8;\n        }\n        else if (kLeft and global.downToRun) // run\n        {\n            xVel -= 0.1;\n            xVelLimit = 6;\n            xFric = frictionRunningFastX;\n        }\n        else if (kRight and global.downToRun)\n        {\n            xVel += 0.1;\n            xVelLimit = 6;\n            xFric = frictionRunningFastX;\n        }\n        else\n        {\n            xVel *= 0.8;\n            if (xVel < 0.5) xVel = 0;\n            xFric = 0.2\n            xVelLimit = 3;\n            image_speed = 0.8;\n        }\n    }\n    else\n    {\n        //decrease the friction when the character is \"flying\"\n        if (platformCharacterIs(IN_AIR))\n        {\n            if (dead or stunned) xFric = 1.0;\n            else xFric = 0.8;\n        }\n        else\n        {\n            xFric = frictionRunningX;\n        }\n    }\n    \n    // Stuck on web or underwater\n    if (collision_point(x, y, oWeb, 0, 0))\n    {\n        xFric = 0.2;\n        yFric = 0.2;\n        fallTimer = 0;\n    }\n    else if (collision_point(x, y, oWater, -1, -1))\n    {\n        if (instance_exists(oCape)) oCape.open = false;\n    \n        if (state == FALLING and yVel > 0)\n        {\n            yFric = 0.5;\n        }\n        else if (not collision_point(x, y-9, oWater, -1, -1))\n        {\n            yFric = 1;\n        }\n        else\n        {\n            yFric = 0.9;\n        }\n    }\n    else\n    {\n        swimming = false;\n        yFric = 1;\n    }\n}\n\nif (colIceBot and state != DUCKING and not global.hasSpikeShoes)\n{\n    xFric = 0.98;\n    yFric = 1;\n}\n\n// RUNNING\n\nif (platformCharacterIs(ON_GROUND))\n{\n    if (state == RUNNING and kLeft and colLeft)\n    {\n        pushTimer += 1;\n    }\n    else if (state == RUNNING and kRight and colRight)\n    {\n        pushTimer += 1;\n    }\n    else\n    {\n        pushTimer = 0;\n    }\n    \n    if (platformCharacterIs(ON_GROUND) and not kJump and not kDown and not runKey)\n    {   \n        xVelLimit = 3;\n    }\n    \n    \n    // ledge flip\n    if (state == DUCKING and abs(xVel) < 3 and facing == LEFT and\n        collision_point(x, y+9, oSolid, 0, 0) and not collision_line(x-1, y+9, x-10, y+9, oSolid, 0, 0) and kLeft)\n    {\n        state = DUCKTOHANG;\n        \n        if (holdItem)\n        {\n            holdItem.held = false;\n            if (holdItem.type == \"Gold Idol\") holdItem.y -= 8;\n            scrDropItem(-1, -4);\n        }\n        \n        with oMonkey\n        {\n            // knock off monkeys that grabbed you\n            if (status == 7)\n            {\n                xVel = -1;\n                yVel = -4;\n                status = 1;\n                vineCounter = 20;\n                grabCounter = 60;\n            }\n        }\n    }\n    else if (state == DUCKING and abs(xVel) < 3 and facing == RIGHT and\n        collision_point(x, y+9, oSolid, 0, 0) and not collision_line(x+1, y+9, x+10, y+9, oSolid, 0, 0) and kRight)\n    {\n        state = DUCKTOHANG;\n        \n        if (holdItem)\n        {\n            // holdItem.held = false;\n            if (holdItem.type == \"Gold Idol\") holdItem.y -= 8;\n            scrDropItem(1, -4);\n        }\n        \n        with oMonkey\n        {\n            // knock off monkeys that grabbed you\n            if (status == 7)\n            {\n                xVel = 1;\n                yVel = -4;\n                status = 1;\n                vineCounter = 20;\n                grabCounter = 60;\n            }\n        }\n    }\n}\n\nif (state == DUCKTOHANG)\n{\n    x = xPrev;\n    y = yPrev;\n    xVel = 0;\n    yVel = 0;\n    xAcc = 0;\n    yAcc = 0;\n    grav = 0;\n}\n\n// PARACHUTE AND CAPE\nif (instance_exists(oParachute))\n{\n    yFric = 0.5;\n}\nif (instance_exists(oCape))\n{\n    if (oCape.open) yFric = 0.5;\n}\n\nif (pushTimer > 100) pushTimer = 100;\n\n// limits the acceleration if it is too extreme\nif (xAcc > xAccLimit) xAcc = xAccLimit;\nelse if (xAcc < -xAccLimit) xAcc = -xAccLimit;\nif (yAcc > yAccLimit) yAcc = yAccLimit;\nelse if (yAcc < -yAccLimit) yAcc = -yAccLimit;\n\n// applies the acceleration\nxVel += xAcc;\nif (dead or stunned) yVel += 0.6;\nelse yVel += yAcc;\n\n// nullifies the acceleration\nxAcc = 0;\nyAcc = 0;\n\n// applies the friction to the velocity, now that the velocity has been calculated\nxVel *= xFric;\nyVel *= yFric;\n\n// apply ball and chain\nif (instance_exists(oBall))\n{\n    if (distance_to_object(oBall) >= 24)\n    {\n        if (xVel > 0 and oBall.x < x and abs(oBall.x-x) > 24) xVel = 0;\n        if (xVel < 0 and oBall.x > x and abs(oBall.x-x) > 24) xVel = 0;\n        if (yVel > 0 and oBall.y < y and abs(oBall.y-y) > 24)\n        {\n            if (abs(oBall.x-x) < 1)\n            {\n                x = oBall.x;\n            }\n            else if (oBall.x < x and not kRight)\n            {\n                if (xVel > 0) xVel *= -0.25;\n                else if (xVel == 0) xVel -= 1;\n            }\n            else if (oBall.x > x and not kLeft)\n            {\n                if (xVel < 0) xVel *= -0.25;\n                else if (xVel == 0) xVel += 1;\n            }\n            yVel = 0;\n            fallTimer = 0;\n        }\n        if (yVel < 0 and oBall.y > y and abs(oBall.y-y) > 24) yVel = 0;\n    }\n}\n\n// apply the limits since the velocity may be too extreme\nif (not dead and not stunned)\n{\n    if (xVel > xVelLimit) xVel = xVelLimit;\n    else if (xVel < -xVelLimit) xVel = -xVelLimit;\n}\nif (yVel > yVelLimit) yVel = yVelLimit;\nelse if (yVel < -yVelLimit) yVel = -yVelLimit;\n    \n// approximates the \"active\" variables\nif approximatelyZero(xVel) xVel=0\nif approximatelyZero(yVel) yVel=0\nif approximatelyZero(xAcc) xAcc=0\nif approximatelyZero(yAcc) yAcc=0\n\n// prepares the character to move up a hill\n// we need to use the \"slopeYPrev\" variable later to know the \"true\" y previous value\n// keep this condition the same\nif maxSlope>0 and platformCharacterIs(ON_GROUND) and xVel!=0\n{\n  slopeYPrev=y\n  for(y=y;y>=slopeYPrev-maxSlope;y-=1)\n    if colTop\n      break\n  slopeChangeInY=slopeYPrev-y\n}\nelse\n  slopeChangeInY=0\n\n// moves the character, and balances out the effects caused by other processes\n// keep this condition the same\nif maxSlope*abs(xVel)>0 and platformCharacterIs(ON_GROUND)\n{\n  // we need to check if we should dampen out the speed as the character runs on upward slopes\n  xPrev=x\n  yPrev=slopeYPrev       // we don't want to use y, because y is too high\n  yPrevHigh=y            // we'll use the higher previous variable later\n  moveTo(xVel,yVel+slopeChangeInY)\n  dist=point_distance(xPrev,yPrev,x,y)// overall distance that has been traveled\n  // we should have only ran at xVel\n  if dist>abs(xVelInteger)\n  {\n    // show_message(string(dist)+ \" \"+string(abs(xVelInteger)))\n    excess=dist-abs(xVelInteger)\n    if(xVelInteger<0)\n      excess*=-1\n    // move back since the character moved too far\n    x=xPrev\n    y=yPrevHigh     // we need the character to be high so the character can move down\n    // this time we'll move the correct distance, but we need to shorten out the xVel a little\n    // these lines can be changed for different types of slowing down when running up hills\n    ratio=abs(xVelInteger)/dist*0.9        //can be changed\n    moveTo( round(xVelInteger*ratio),round(yVelInteger*ratio+slopeChangeInY) )\n  }\n}\nelse\n{\n  // we simply move xVel and yVel while in the air or on a ladder\n  moveTo(xVel,yVel)\n}\n// move the character downhill if possible\n// we need to multiply maxDownSlope by the absolute value of xVel since the character normally runs at an xVel larger than 1\nif not colBot and maxDownSlope>0 and xVelInteger!=0 and platformCharacterIs(ON_GROUND)\n{\n  //the character is floating just above the slope, so move the character down\n  upYPrev=y\n  for(y=y;y<=upYPrev+maxDownSlope;y+=1)\n    if colBot             // we hit a solid below\n    {\n      upYPrev=y           // I know that this doesn't seem to make sense, because of the name of the variable, but it all works out correctly after we break out of this loop\n      break\n    }\n  y=upYPrev\n}\n\n//figures out what the sprite index of the character should be\ncharacterSprite();\n\n//sets the previous state and the previously previous state\nstatePrevPrev = statePrev;\nstatePrev = state;\n\n//calculates the image_speed based on the character's velocity\nif (state == RUNNING or state == DUCKING or state == LOOKING_UP)\n{\n    if (state == RUNNING or state == LOOKING_UP) image_speed = abs(xVel) * runAnimSpeed + 0.1;\n}\n\nif (state == CLIMBING) image_speed = sqrt(sqr(abs(xVel))+sqr(abs(yVel))) * climbAnimSpeed\nif (xVel >= 4 or xVel <= -4)\n{\n    image_speed = 1;\n    if (platformCharacterIs(ON_GROUND)) setCollisionBounds(-8, -8, 8, 8);\n    else setCollisionBounds(-5, -8, 5, 8);\n}\nelse setCollisionBounds(-5, -8, 5, 8);\nif (whipping) image_speed = 1;\nif (state == DUCKTOHANG)\n{\n    image_index = 0;\n    image_speed = 0.8;\n}\n//limit the image_speed at 1 so the animation always looks good\nif (image_speed > 1) image_speed = 1;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/draw_menu.gml",
    "content": "// Source - https://github.com/faissaloo/GMLmenus/blob/master/GMLmenus_example.gmx/scripts/draw_menu.gml\n\n///draw_menu(str,background,foreground,x,y,hpadding,vpadding,height,mouse_button)\n//Distributed under the MIT licence:\n/////////////////////////////////////////\n/*Permission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.*/\n/////////////////////////////////////////\n//Height is the height of 1 box\n//Menu syntax:\n//  |s = seperator (Bug: if |s is placed next to a |n an extra menu item would be added)\n//  |n = new item\nvar str, background, foreground,xx,yy, width, height;\nstr = \" \"+argument0 //A hacky thing so that it draws the first item properly, I should probably properly fix this later\nbackground = argument1\nforeground = argument2\nxx = argument3\nyy = argument4\nwidth = 0//argument5\nhpadding = argument5\nvpadding = argument6\nheight = argument7\nmb=argument8 //This is the main mouse button, I added this to give more choice to the dev\n//xx and yy should be corrected if they are placed outside of the room or if they will lead to the menu being cut off by the edge of the room\nitem_list = ds_list_create()\nitem_string = \"\"\n///////////////////////////////////\nfor (i=0;i<string_length(str);i+=1) //Parse the string, it's being set to -1 because it won't read the first character otherwise, yes this is very hacky and stupid, but I can't be bothered right now\n{\nif string_char_at(str,i)=\"|\" //If it finds a | it means there will be an escape character\n{\ni+=1 //Move to the next character\n\nswitch(string_char_at(str,i)) //Check which escape character it is\n{\ncase \"s\":\n    //i+=1\n    ds_list_add(item_list,\"|s\")\n    //ds_list_add(item_list,\"\") //This is for the meta info\n\ncase \"n\":\n    i+=1 //Skip the letter itself as we don't want it to be drawn\n    //For some reason this is always 10\n    //But it works perfectly fine if an escape code isn't the first character\n    //show_message(string(i)+\"<\"+string(string_length(str))) //Debug\n    for (ii=i;ii<=string_length(str);ii+=1)\n    {\n    //show_message(string_char_at(str,ii))\n    if string_char_at(str,ii)=\"|\"\n    {\n    //i-=1\n    break; //We don't want it to go any further if the next character is a backslash\n    }\n    //If the for loop hasn't been broken then it'll draw the character\n    item_string+=string_char_at(str,ii)\n    }\n    \n    if string_width(item_string)>width\n    {\n        width=string_width(item_string)\n    }\n    \n    \n    ds_list_add(item_list,item_string) //Add a new item to the list\n    item_string=\"\" //Reset the item_string\n}\n}\n}\ndraw_set_color(background)\n//draw_rectangle(xx,yy,xx+width,yy+(height*ds_list_size(item_list)),false) //Background, temporary?\ndraw_button(xx,yy,xx+width+(hpadding*2),yy+(height*(ds_list_size(item_list)-1))+vpadding,true) //Background, temporary?\n\nfor (i=0;i<ds_list_size(item_list);i+=1) //Go through the list of menu items\n{\n\n\n\n    draw_set_color(background)\n    //draw_rectangle(xx,yy+(height*i),xx+width,yy+(height),false) //Draw the rectange for this one, we're doing this so we can add cool effects to each of them\n    draw_set_color(foreground)\n    \n    if ds_list_find_value(item_list,i)=\"|s\"\n    {  \n        draw_line(xx+hpadding,yy+((height*(i+0.5))/2)+vpadding,xx+width,yy+((height*(i+0.5))/2)+vpadding) //Draw the seperator\n    }\n    else\n    {\n        //draw_text(xx+(width/10),yy+((height/2)*i),ds_list_find_value(item_list,i))\n        draw_text(xx+hpadding,yy+((height/2)*i)+vpadding,ds_list_find_value(item_list,i))\n        //padding\n    }\n    \n    if (mouse_x>xx) and (mouse_x<xx+width) and (mouse_y<yy+(height/2)*(i+1)) and (mouse_y>yy) and mouse_check_button_released(mb)\n    {\n        //show_message(i+1) //Debugging\n        return i+1; //Returns the number of the item in the list, we're adding 1 because 0 is reserved for if nothing is clicked\n    }\n\n    \n\n}\n\nif mouse_check_button_released(mb) and !(mouse_x>xx and mouse_y>yy and mouse_x<xx+width and mouse_y<yy+(height*(ds_list_size(item_list)-1))) //If the mouse was clicked outside\n{\n    return 0; //Return 0 to indicate that the user chose to exit the menu by clicking outside of it\n}\n\nreturn -1; //If we haven't already returned something, return a -1 to indicate that nothing was clicked\n"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/faucet-http.gml",
    "content": "#define __http_init\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Creates global.__HttpClient\r\n// real __http_init()\r\n\r\nglobal.__HttpClient = object_add();\r\nobject_set_persistent(global.__HttpClient, true);\r\n\r\n#define __http_split\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// real __http_split(string text, delimeter delimeter, real limit)\r\n// Splits string into items\r\n\r\n// text - string comma-separated values\r\n// delimeter - delimeter to split by\r\n// limit  if non-zero, maximum times to split text\r\n// When limited, the remaining text will be left as the last item.\r\n// E.g. splitting \"1,2,3,4,5\" with delimeter \",\" and limit 2 yields this list:\r\n// \"1\", \"2\", \"3,4,5\"\r\n\r\n// return value - ds_list containing strings of values\r\n\r\nvar text, delimeter, limit;\r\ntext = argument0;\r\ndelimeter = argument1;\r\nlimit = argument2;\r\n\r\nvar list, count;\r\nlist = ds_list_create();\r\ncount = 0;\r\n\r\nwhile (string_pos(delimeter, text) != 0)\r\n{\r\n    ds_list_add(list, string_copy(text, 1, string_pos(delimeter,text) - 1));\r\n    text = string_copy(text, string_pos(delimeter, text) + string_length(delimeter), string_length(text) - string_pos(delimeter, text));\r\n\r\n    count += 1;\r\n    if (limit and count == limit)\r\n        break;\r\n}\r\nds_list_add(list, text);\r\n\r\nreturn list;\r\n\r\n#define __http_parse_url\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Parses a URL into its components\r\n// real __http_parse_url(string url)\r\n\r\n// Return value is a ds_map containing keys for the different URL parts: (or -1 on failure)\r\n// \"url\" - the URL which was passed in\r\n// \"scheme\" - the URL scheme (e.g. \"http\")\r\n// \"host\" - the hostname (e.g. \"example.com\" or \"127.0.0.1\")\r\n// \"port\" - the port (e.g. 8000) - this is a real, unlike the others\r\n// \"abs_path\" - the absolute path (e.g. \"/\" or \"/index.html\")\r\n// \"query\" - the query string (e.g. \"a=b&c=3\")\r\n// Parts which are not included will not be in the map\r\n// e.g. http://example.com will not have the \"port\", \"path\" or \"query\" keys\r\n\r\n// This will *only* work properly for URLs of format:\r\n// scheme \":\" \"//\" host [ \":\" port ] [ abs_path [ \"?\" query ]]\"\r\n// where [] denotes an optional component\r\n// file: URLs will *not* work as they lack the authority (host:port) component\r\n// It will not work correctly for IPv6 host values\r\n\r\nvar url;\r\nurl = argument0;\r\n\r\nvar map;\r\nmap = ds_map_create();\r\nds_map_add(map, 'url', url);\r\n\r\n// before scheme\r\nvar colonPos;\r\n// Find colon for end of scheme\r\ncolonPos = string_pos(':', url);\r\n// No colon - bad URL\r\nif (colonPos == 0)\r\n    return -1;\r\nds_map_add(map, 'scheme', string_copy(url, 1, colonPos - 1));\r\nurl = string_copy(url, colonPos + 1, string_length(url) - colonPos);\r\n\r\n// before double slash\r\n// remove slashes (yes this will screw up file:// but who cares)\r\nwhile (string_char_at(url, 1) == '/')\r\n    url = string_copy(url, 2, string_length(url) - 1);\r\n\r\n// before hostname\r\nvar slashPos, colonPos;\r\n// Find slash for beginning of path\r\nslashPos = string_pos('/', url);\r\n// No slash ahead - http://host format with no ending slash\r\nif (slashPos == 0)\r\n{\r\n    // Find : for beginning of port\r\n    colonPos = string_pos(':', url);\r\n}\r\nelse\r\n{\r\n    // Find : for beginning of port prior to /\r\n    colonPos = string_pos(':', string_copy(url, 1, slashPos - 1));\r\n}\r\n// No colon - no port\r\nif (colonPos == 0)\r\n{\r\n    // There was no slash\r\n    if (slashPos == 0)\r\n    {\r\n        ds_map_add(map, 'host', url);\r\n        return map;\r\n    }\r\n    // There was a slash\r\n    else\r\n    {\r\n        ds_map_add(map, 'host', string_copy(url, 1, slashPos - 1));\r\n        url = string_copy(url, slashPos, string_length(url) - slashPos + 1);\r\n    }\r\n}\r\n// There's a colon - port specified\r\nelse\r\n{\r\n    // There was no slash\r\n    if (slashPos == 0)\r\n    {\r\n        ds_map_add(map, 'host', string_copy(url, 1, colonPos - 1));\r\n        ds_map_add(map, 'port', real(string_copy(url, colonPos + 1, string_length(url) - colonPos)));\r\n        return map;\r\n    }\r\n    // There was a slash\r\n    else\r\n    {\r\n        ds_map_add(map, 'host', string_copy(url, 1, colonPos - 1));\r\n        url = string_copy(url, colonPos + 1, string_length(url) - colonPos);\r\n        slashPos = string_pos('/', url);\r\n        ds_map_add(map, 'port', real(string_copy(url, 1, slashPos - 1)));\r\n        url = string_copy(url, slashPos, string_length(url) - slashPos + 1); \r\n    }\r\n}\r\n\r\n// before path\r\nvar queryPos;\r\nqueryPos = string_pos('?', url);\r\n// There's no ? - no query\r\nif (queryPos == 0)\r\n{\r\n    ds_map_add(map, 'abs_path', url);\r\n    return map;\r\n}\r\nelse\r\n{\r\n    ds_map_add(map, 'abs_path', string_copy(url, 1, queryPos - 1));\r\n    ds_map_add(map, 'query', string_copy(url, queryPos + 1, string_length(url) - queryPos));\r\n    return map;\r\n}\r\n\r\n// Return -1 upon unlikely error\r\nds_map_destroy(map);\r\nreturn -1;\r\n\r\n#define __http_resolve_url\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Takes a base URL and a URL reference and applies it to the base URL\r\n// Returns resulting absolute URL\r\n// string __http_resolve_url(string baseUrl, string refUrl)\r\n\r\n// Return value is a string containing the new absolute URL, or \"\" on failure\r\n\r\n// Works only for restricted URL syntax as understood by by http_resolve_url\r\n// The sole restriction of which is that only scheme://authority/path URLs work\r\n// This notably excludes file: URLs which lack the authority component\r\n\r\n// As described by RFC3986:\r\n//      URI-reference = URI / relative-ref\r\n//      relative-ref  = relative-part [ \"?\" query ] [ \"#\" fragment ]\r\n//      relative-part = \"//\" authority path-abempty\r\n//                    / path-absolute\r\n//                    / path-noscheme\r\n//                    / path-empty\r\n// However http_resolve_url does *not* deal with fragments\r\n\r\n// Algorithm based on that of section 5.2.2 of RFC 3986\r\n\r\nvar baseUrl, refUrl;\r\nbaseUrl = argument0;\r\nrefUrl = argument1;\r\n\r\n// Parse base URL\r\nvar urlParts;\r\nurlParts = __http_parse_url(baseUrl);\r\nif (urlParts == -1)\r\n    return '';\r\n\r\n// Try to parse reference URL\r\nvar refUrlParts, canParseRefUrl;\r\nrefUrlParts = __http_parse_url(refUrl);\r\ncanParseRefUrl = (refUrlParts != -1);\r\nif (refUrlParts != -1)\r\n    ds_map_destroy(refUrlParts);\r\n\r\nvar result;\r\nresult = '';\r\n\r\n// Parsing of reference URL succeeded - it's absolute and we're done\r\nif (canParseRefUrl)\r\n{\r\n    result = refUrl;\r\n}\r\n// Begins with '//' - scheme-relative URL\r\nelse if (string_copy(refUrl, 1, 2) == '//' and string_length(refUrl) > 2)\r\n{\r\n    result = ds_map_find_value(urlParts, 'scheme') + ':' + refUrl;\r\n}\r\n// Is or begins with '/' - absolute path relative URL\r\nelse if (((string_char_at(refUrl, 1) == '/' and string_length(refUrl) > 1) or refUrl == '/')\r\n// Doesn't begin with ':' and is not blank - relative path relative URL\r\n    or (string_char_at(refUrl, 1) != ':' and string_length(refUrl) > 0)) \r\n{\r\n    // Find '?' for query\r\n    var queryPos;\r\n    queryPos = string_pos('?', refUrl);\r\n    // No query\r\n    if (queryPos == 0)\r\n    {\r\n        refUrl = __http_resolve_path(ds_map_find_value(urlParts, 'abs_path'), refUrl);\r\n        ds_map_replace(urlParts, 'abs_path', refUrl);\r\n        if (ds_map_exists(urlParts, 'query'))\r\n            ds_map_delete(urlParts, 'query');\r\n    }\r\n    // Query exists, split\r\n    else\r\n    {\r\n        var path, query;\r\n        path = string_copy(refUrl, 1, queryPos - 1);\r\n        query = string_copy(refUrl, queryPos + 1, string_length(relUrl) - queryPos);\r\n        path = __http_resolve_path(ds_map_find_value(urlParts, 'abs_path'), path);\r\n        ds_map_replace(urlParts, 'abs_path', path);\r\n        if (ds_map_exists(urlParts, 'query'))\r\n            ds_map_replace(urlParts, 'query', query);\r\n        else\r\n            ds_map_add(urlParts, 'query', query);\r\n    }\r\n    result = __http_construct_url(urlParts);\r\n}\r\n\r\nds_map_destroy(urlParts);\r\nreturn result;\r\n\r\n#define __http_resolve_path\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Takes a base path and a path reference and applies it to the base path\r\n// Returns resulting absolute path\r\n// string __http_resolve_path(string basePath, string refPath)\r\n\r\n// Return value is a string containing the new absolute path\r\n\r\n// Deals with UNIX-style / paths, not Windows-style \\ paths\r\n// Can be used to clean up .. and . in non-absolute paths too ('' as basePath)\r\n\r\nvar basePath, refPath;\r\nbasePath = argument0;\r\nrefPath = argument1;\r\n\r\n// refPath begins with '/' (is absolute), we can ignore all of basePath\r\nif (string_char_at(refPath, 1) == '/')\r\n{\r\n    basePath = refPath;\r\n    refPath = '';\r\n}\r\n\r\nvar parts, refParts;\r\nparts = __http_split(basePath, '/', 0);\r\nrefParts = __http_split(refPath, '/', 0);\r\n\r\nif (refPath != '')\r\n{\r\n    // Find last part of base path\r\n    var lastPart;\r\n    lastPart = ds_list_find_value(parts, ds_list_size(parts) - 1);\r\n\r\n    // If it's not blank (points to a file), remove it\r\n    if (lastPart != '')\r\n    {\r\n        ds_list_delete(parts, ds_list_size(parts) - 1);\r\n    }\r\n    \r\n    // Concatenate refParts to end of parts\r\n    var i;\r\n    for (i = 0; i < ds_list_size(refParts); i += 1)\r\n        ds_list_add(parts, ds_list_find_value(refParts, i));\r\n}\r\n\r\n// We now don't need refParts any more\r\nds_list_destroy(refParts);\r\n\r\n// Deal with '..' and '.'\r\nfor (i = 0; i < ds_list_size(parts); i += 1)\r\n{\r\n    var part;\r\n    part = ds_list_find_value(parts, i);\r\n\r\n    if (part == '.')\r\n    {\r\n        if (i == 1 or i == ds_list_size(parts) - 1)\r\n            ds_list_replace(parts, i, '');\r\n        else\r\n            ds_list_delete(parts, i);\r\n        i -= 1;\r\n        continue;\r\n    }\r\n    else if (part == '..')\r\n    {\r\n        if (i > 1)\r\n        {\r\n            ds_list_delete(parts, i - 1);\r\n            ds_list_delete(part, i);\r\n            i -= 2;\r\n        }\r\n        else\r\n        {\r\n            ds_list_replace(parts, i, '');\r\n            i -= 1;\r\n        }\r\n        continue;\r\n    }\r\n    else if (part == '' and i != 0 and i != ds_list_size(parts) - 1)\r\n    {\r\n        ds_list_delete(parts, i);\r\n        i -= 1;\r\n        continue;\r\n    }\r\n}\r\n\r\n// Reconstruct path from parts\r\nvar path;\r\npath = '';\r\nfor (i = 0; i < ds_list_size(parts); i += 1)\r\n{\r\n    if (i != 0)\r\n        path += '/';\r\n    path += ds_list_find_value(parts, i);\r\n}\r\n\r\nds_map_destroy(parts);\r\nreturn path;\r\n\r\n#define __http_parse_hex\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Takes a lowercase hexadecimal string and returns its integer value\r\n// real __http_parse_hex(string hexString)\r\n\r\n// Return value is the whole number value (or -1 if invalid)\r\n// Only works for whole numbers (non-fractional numbers >= 0) and lowercase hex\r\n\r\nvar hexString;\r\nhexString = argument0;\r\n\r\nvar result, hexValues;\r\nresult = 0;\r\nhexValues = \"0123456789abcdef\";\r\n\r\nvar i;\r\nfor (i = 1; i <= string_length(hexString); i += 1) {\r\n    result *= 16;\r\n    var digit;\r\n    digit = string_pos(string_char_at(hexString, i), hexValues) - 1;\r\n    if (digit == -1)\r\n        return -1;\r\n    result += digit;\r\n}\r\n\r\nreturn result;\r\n\r\n#define __http_construct_url\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Constructs an URL from its components (as http_parse_url would return)\r\n// string __http_construct_url(real parts)\r\n\r\n// Return value is the string of the constructed URL\r\n// Keys of parts map:\r\n// \"scheme\" - the URL scheme (e.g. \"http\")\r\n// \"host\" - the hostname (e.g. \"example.com\" or \"127.0.0.1\")\r\n// \"port\" - the port (e.g. 8000) - this is a real, unlike the others\r\n// \"abs_path\" - the absolute path (e.g. \"/\" or \"/index.html\")\r\n// \"query\" - the query string (e.g. \"a=b&c=3\")\r\n// Parts which are omitted will be omitted in the URL\r\n// e.g. http://example.com lacks \"port\", \"path\" or \"query\" keys\r\n\r\n// This will *only* work properly for URLs of format:\r\n// scheme \":\" \"//\" host [ \":\" port ] [ abs_path [ \"?\" query ]]\"\r\n// where [] denotes an optional component\r\n// file: URLs will *not* work as they lack the authority (host:port) component\r\n// Should work correctly for IPv6 host values, but bare in mind parse_url won't\r\n\r\nvar parts;\r\nparts = argument0;\r\n\r\nvar url;\r\nurl = '';\r\n\r\nurl += ds_map_find_value(parts, 'scheme');\r\nurl += '://';\r\nurl += ds_map_find_value(parts, 'host');\r\nif (ds_map_exists(parts, 'port'))\r\n    url += ':' + string(ds_map_find_value(parts, 'port'));\r\nif (ds_map_exists(parts, 'abs_path'))\r\n{\r\n    url += ds_map_find_value(parts, 'abs_path');\r\n    if (ds_map_exists(parts, 'query'))\r\n        url += '?' + ds_map_find_value(parts, 'query');\r\n}\r\n\r\nreturn url;\r\n\r\n#define __http_prepare_request\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Internal function - prepares request\r\n// void __http_prepare_request(real client, string url, real headers)\r\n\r\n// client - HttpClient object to prepare\r\n// url - URL to send GET request to\r\n// headers - ds_map of extra headers to send, -1 if none\r\n\r\nvar client, url, headers;\r\nclient = argument0;\r\nurl = argument1;\r\nheaders = argument2;\r\n\r\nvar parsed;\r\nparsed = __http_parse_url(url);\r\n\r\nif (parsed == -1)\r\n    show_error(\"Error when making HTTP GET request - can't parse URL: \" + url, true);\r\n\r\nif (!ds_map_exists(parsed, 'port'))\r\n    ds_map_add(parsed, 'port', 80);\r\nif (!ds_map_exists(parsed, 'abs_path'))\r\n    ds_map_add(parsed, 'abs_path', '/');\r\n\r\nwith (client)\r\n{\r\n    destroyed = false;\r\n    CR = chr(13);\r\n    LF = chr(10);\r\n    CRLF = CR + LF;\r\n    socket = tcp_connect(ds_map_find_value(parsed, 'host'), ds_map_find_value(parsed, 'port'));\r\n    state = 0;\r\n    errored = false;\r\n    error = '';\r\n    linebuf = '';\r\n    line = 0;\r\n    statusCode = -1;\r\n    reasonPhrase = '';\r\n    responseBody = buffer_create();\r\n    responseBodySize = -1;\r\n    responseBodyProgress = -1;\r\n    responseHeaders = ds_map_create();\r\n    requestUrl = url;\r\n    requestHeaders = headers;\r\n\r\n    //  Request       = Request-Line              ; Section 5.1\r\n    //                  *(( general-header        ; Section 4.5\r\n    //                   | request-header         ; Section 5.3\r\n    //                   | entity-header ) CRLF)  ; Section 7.1\r\n    //                  CRLF\r\n    //                  [ message-body ]          ; Section 4.3\r\n\r\n    // \"The Request-Line begins with a method token, followed by the\r\n    // Request-URI and the protocol version, and ending with CRLF. The\r\n    // elements are separated by SP characters. No CR or LF is allowed\r\n    // except in the final CRLF sequence.\"\r\n    if (ds_map_exists(parsed, 'query'))\r\n        write_string(socket, 'GET ' + ds_map_find_value(parsed, 'abs_path') + '?' + ds_map_find_value(parsed, 'query') + ' HTTP/1.1' + CRLF);\r\n    else\r\n        write_string(socket, 'GET ' + ds_map_find_value(parsed, 'abs_path') + ' HTTP/1.1' + CRLF);\r\n\r\n    // \"A client MUST include a Host header field in all HTTP/1.1 request\r\n    // messages.\"\r\n    // \"A \"host\" without any trailing port information implies the default\r\n    // port for the service requested (e.g., \"80\" for an HTTP URL).\"\r\n    if (ds_map_find_value(parsed, 'port') == 80)\r\n        write_string(socket, 'Host: ' + ds_map_find_value(parsed, 'host') + CRLF);\r\n    else\r\n        write_string(socket, 'Host: ' + ds_map_find_value(parsed, 'host')\r\n            + ':' + string(ds_map_find_value(parsed, 'port')) + CRLF);\r\n\r\n    // \"An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to\r\n    // maintain a persistent connection unless a Connection header including\r\n    // the connection-token \"close\" was sent in the request.\"\r\n    write_string(socket, 'Connection: close' + CRLF);\r\n\r\n    // \"If no Accept-Encoding field is present in a request, the server MAY\r\n    // assume that the client will accept any content coding.\"\r\n    write_string(socket, 'Accept-Encoding:' + CRLF);\r\n    \r\n    // If headers specified\r\n    if (headers != -1)\r\n    {\r\n        var key;\r\n        // Iterate over headers map\r\n        for (key = ds_map_find_first(headers); is_string(key); key = ds_map_find_next(headers, key))\r\n        {\r\n            write_string(socket, key + ': ' + ds_map_find_value(headers, key) + CRLF);\r\n        }\r\n    }\r\n    \r\n    // Send extra CRLF to terminate request\r\n    write_string(socket, CRLF);\r\n    \r\n    socket_send(socket);\r\n\r\n    ds_map_destroy(parsed);\r\n}\r\n\r\n#define __http_parse_header\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Internal function - parses header\r\n// real __http_parse_header(string linebuf, real line)\r\n// Returns false if it errored (caller should return and destroy)\r\n\r\nvar linebuf, line;\r\nlinebuf = argument0;\r\nline = argument1;\r\n\r\n// \"HTTP/1.1 header field values can be folded onto multiple lines if the\r\n// continuation line begins with a space or horizontal tab.\"\r\nif ((string_char_at(linebuf, 1) == ' ' or ord(string_char_at(linebuf, 1)) == 9))\r\n{\r\n    if (line == 1)\r\n    {\r\n        errored = true;\r\n        error = \"First header line of response can't be a continuation, right?\";\r\n        return false;\r\n    }\r\n    headerValue = ds_map_find_value(responseHeaders, string_lower(headerName))\r\n        + string_copy(linebuf, 2, string_length(linebuf) - 1);\r\n}\r\n// \"Each header field consists\r\n// of a name followed by a colon (\":\") and the field value. Field names\r\n// are case-insensitive. The field value MAY be preceded by any amount\r\n// of LWS, though a single SP is preferred.\"\r\nelse\r\n{\r\n    var colonPos;\r\n    colonPos = string_pos(':', linebuf);\r\n    if (colonPos == 0)\r\n    {\r\n        errored = true;\r\n        error = \"No colon in a header line of response\";\r\n        return false;\r\n    }\r\n    headerName = string_copy(linebuf, 1, colonPos - 1);\r\n    headerValue = string_copy(linebuf, colonPos + 1, string_length(linebuf) - colonPos);\r\n    // \"The field-content does not include any leading or trailing LWS:\r\n    // linear white space occurring before the first non-whitespace\r\n    // character of the field-value or after the last non-whitespace\r\n    // character of the field-value. Such leading or trailing LWS MAY be\r\n    // removed without changing the semantics of the field value.\"\r\n    while (string_char_at(headerValue, 1) == ' ' or ord(string_char_at(headerValue, 1)) == 9)\r\n        headerValue = string_copy(headerValue, 2, string_length(headerValue) - 1);\r\n}\r\n\r\nds_map_add(responseHeaders, string_lower(headerName), headerValue);\r\n\r\nif (string_lower(headerName) == 'content-length')\r\n{\r\n    responseBodySize = real(headerValue);\r\n    responseBodyProgress = 0;\r\n}\r\n\r\nreturn true;\r\n\r\n#define __http_client_step\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Steps the HTTP client (needs to be called each step or so)\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nwith (client)\r\n{\r\n    if (errored)\r\n        exit;\r\n    \r\n    // Socket error\r\n    if (socket_has_error(socket))\r\n    {\r\n        errored = true;\r\n        error = \"Socket error: \" + socket_error(socket);\r\n        return __http_client_destroy();\r\n    }\r\n    \r\n    var available;\r\n    available = tcp_receive_available(socket);\r\n    \r\n    switch (state)\r\n    {\r\n    // Receiving lines\r\n    case 0:\r\n        if (!available && tcp_eof(socket))\r\n        {\r\n            errored = true;\r\n            error = \"Unexpected EOF when receiving headers/status code\";\r\n            return __http_client_destroy();\r\n        }\r\n    \r\n        var bytesRead, c;\r\n        for (bytesRead = 1; bytesRead <= available; bytesRead += 1)\r\n        {\r\n            c = read_string(socket, 1);\r\n            // Reached end of line\r\n            // \"HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all\r\n            // protocol elements except the entity-body (see appendix 19.3 for\r\n            // tolerant applications).\"\r\n            if (c == LF and string_char_at(linebuf, string_length(linebuf)) == CR)\r\n            {\r\n                // Strip trailing CR\r\n                linebuf = string_copy(linebuf, 1, string_length(linebuf) - 1);\r\n                // First line - status code\r\n                if (line == 0)\r\n                {\r\n                    // \"The first line of a Response message is the Status-Line, consisting\r\n                    // of the protocol version followed by a numeric status code and its\r\n                    // associated textual phrase, with each element separated by SP\r\n                    // characters. No CR or LF is allowed except in the final CRLF sequence.\"\r\n                    var httpVer, spacePos;\r\n                    spacePos = string_pos(' ', linebuf);\r\n                    if (spacePos == 0)\r\n                    {\r\n                        errored = true;\r\n                        error = \"No space in first line of response\";\r\n                        return __http_client_destroy();\r\n                    }\r\n                    httpVer = string_copy(linebuf, 1, spacePos);\r\n                    linebuf = string_copy(linebuf, spacePos + 1, string_length(linebuf) - spacePos);\r\n    \r\n                    spacePos = string_pos(' ', linebuf);\r\n                    if (spacePos == 0)\r\n                    {\r\n                        errored = true;\r\n                        error = \"No second space in first line of response\";\r\n                        return __http_client_destroy();\r\n                    }\r\n                    statusCode = real(string_copy(linebuf, 1, spacePos));\r\n                    reasonPhrase = string_copy(linebuf, spacePos + 1, string_length(linebuf) - spacePos);\r\n                }\r\n                // Other line\r\n                else\r\n                {\r\n                    // Blank line, end of response headers\r\n                    if (linebuf == '')\r\n                    {\r\n                        state = 1;\r\n                        // write remainder\r\n                        write_buffer_part(responseBody, socket, available - bytesRead);\r\n                        responseBodyProgress = available - bytesRead;\r\n                        break;\r\n                    }\r\n                    // Header\r\n                    else\r\n                    {\r\n                        if (!__http_parse_header(linebuf, line))\r\n                            return __http_client_destroy();\r\n                    }\r\n                }\r\n    \r\n                linebuf = '';\r\n                line += 1;\r\n            }\r\n            else\r\n                linebuf += c;\r\n        }\r\n        break;\r\n    // Receiving response body\r\n    case 1:\r\n        write_buffer(responseBody, socket);\r\n        responseBodyProgress += available;\r\n        if (tcp_eof(socket))\r\n        {\r\n            if (ds_map_exists(responseHeaders, 'transfer-encoding'))\r\n            {\r\n                if (ds_map_find_value(responseHeaders, 'transfer-encoding') == 'chunked')\r\n                {\r\n                    // Chunked transfer, let's decode it\r\n                    var actualResponseBody, actualResponseSize;\r\n                    actualResponseBody = buffer_create();\r\n                    actualResponseBodySize = 0;\r\n\r\n                    // Parse chunks\r\n                    // chunk          = chunk-size [ chunk-extension ] CRLF\r\n                    //                  chunk-data CRLF\r\n                    // chunk-size     = 1*HEX\r\n                    while (buffer_bytes_left(responseBody))\r\n                    {\r\n                        var chunkSize, c;\r\n                        chunkSize = '';\r\n                        \r\n                        // Read chunk size byte by byte \r\n                        while (buffer_bytes_left(responseBody))\r\n                        {\r\n                            c = read_string(responseBody, 1);\r\n                            if (c == CR or c == ';')\r\n                                break;\r\n                            else\r\n                                chunkSize += c;\r\n                        }\r\n                        \r\n                        // We found a semicolon - beginning of chunk-extension\r\n                        if (c == ';')\r\n                        {\r\n                            // skip all extension stuff\r\n                            while (buffer_bytes_left(responseBody) && c != CR)\r\n                            {\r\n                                c = read_string(responseBody, 1);\r\n                            }\r\n                        }\r\n                        // Reached end of header\r\n                        if (c == CR)\r\n                        {\r\n                            c += read_string(responseBody, 1);\r\n                            // Doesn't end in CRLF\r\n                            if (c != CRLF)\r\n                            {\r\n                                errored = true;\r\n                                error = 'header of chunk in chunked transfer did not end in CRLF';\r\n                                buffer_destroy(actualResponseBody);\r\n                                return __http_client_destroy();\r\n                            }\r\n                            // chunk-size is empty - something's up!\r\n                            if (chunkSize == '')\r\n                            {\r\n                                errored = true;\r\n                                error = 'empty chunk-size in a chunked transfer';\r\n                                buffer_destroy(actualResponseBody);\r\n                                return __http_client_destroy();\r\n                            }\r\n                            chunkSize = __http_parse_hex(chunkSize);\r\n                            // Parsing of size failed - not hex?\r\n                            if (chunkSize == -1)\r\n                            {\r\n                                errored = true;\r\n                                error = 'chunk-size was not hexadecimal in a chunked transfer';\r\n                                buffer_destroy(actualResponseBody);\r\n                                return __http_client_destroy();\r\n                            }\r\n                            // Is the chunk bigger than the remaining response?\r\n                            if (chunkSize + 2 > buffer_bytes_left(responseBody))\r\n                            {\r\n                                errored = true;\r\n                                error = 'chunk-size was greater than remaining data in a chunked transfer';\r\n                                buffer_destroy(actualResponseBody);\r\n                                return __http_client_destroy();\r\n                            }\r\n                            // OK, everything's good, read the chunk\r\n                            write_buffer_part(actualResponseBody, responseBody, chunkSize);\r\n                            actualResponseBodySize += chunkSize;\r\n                            // Check for CRLF\r\n                            if (read_string(responseBody, 2) != CRLF)\r\n                            {\r\n                                errored = true;\r\n                                error = 'chunk did not end in CRLF in a chunked transfer';\r\n                                return __http_client_destroy();\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            errored = true;\r\n                            error = 'did not find CR after reading chunk header in a chunked transfer, Faucet HTTP bug?';\r\n                            return __http_client_destroy();\r\n                        }\r\n                        // if the chunk size is zero, then it was the last chunk\r\n                        if (chunkSize == 0\r\n                            // trailer headers will be present\r\n                            and ds_map_exists(responseHeaders, 'trailer'))\r\n                        {\r\n                            // Parse header lines\r\n                            var line;\r\n                            line = 1;\r\n                            while (buffer_bytes_left(responseBody))\r\n                            {\r\n                                var linebuf;\r\n                                linebuf = '';\r\n                                while (buffer_bytes_left(responseBody))\r\n                                {\r\n                                    c = read_string(responseBody, 1);\r\n                                    if (c != CR)\r\n                                        linebuf += c;\r\n                                    else\r\n                                        break;\r\n                                }\r\n                                c += read_string(responseBody, 1);\r\n                                if (c != CRLF)\r\n                                {\r\n                                    errored = true;\r\n                                    error = 'trailer header did not end in CRLF in a chunked transfer';\r\n                                    return __http_client_destroy();\r\n                                }\r\n                                if (!__http_parse_header(linebuf, line))\r\n                                    return __http_client_destroy();\r\n                                line += 1;\r\n                            }\r\n                        }\r\n                    }\r\n                    responseBodySize = actualResponseBodySize;\r\n                    buffer_destroy(responseBody);\r\n                    responseBody = actualResponseBody;\r\n                }\r\n                else\r\n                {\r\n                    errored = true;\r\n                    error = 'Unsupported Transfer-Encoding: \"' + ds_map_find_value(responseHaders, 'transfer-encoding') + '\"';\r\n                    return __http_client_destroy();\r\n                }\r\n            }\r\n            else if (responseBodySize != -1)\r\n            {\r\n                if (responseBodyProgress < responseBodySize)\r\n                {\r\n                    errored = true;\r\n                    error = \"Unexpected EOF, response body size is less than expected\";\r\n                    return __http_client_destroy();\r\n                }\r\n            }\r\n            // 301 Moved Permanently/302 Found/303 See Other/307 Moved Temporarily\r\n            if (statusCode == 301 or statusCode == 302 or statusCode == 303 or statusCode == 307)\r\n            {\r\n                if (ds_map_exists(responseHeaders, 'location'))\r\n                {\r\n                    var location, resolved;\r\n                    location = ds_map_find_value(responseHeaders, 'location');\r\n                    resolved = __http_resolve_url(requestUrl, location);\r\n                    // Resolving URL didn't fail and it's http://\r\n                    if (resolved != '' and string_copy(resolved, 1, 7) == 'http://')\r\n                    {\r\n                        // Restart request\r\n                        __http_client_destroy();\r\n                        __http_prepare_request(client, resolved, requestHeaders);\r\n                    }\r\n                    else\r\n                    {\r\n                        errored = true;\r\n                        error = \"301, 302, 303 or 307 response with invalid or unsupported Location URL ('\" + location +  \"') - can't redirect\";\r\n                        return __http_client_destroy();\r\n                    }\r\n                    exit;\r\n                }\r\n                else\r\n                {\r\n                    errored = true;\r\n                    error = \"301, 302, 303 or 307 response without Location header - can't redirect\";\r\n                    return __http_client_destroy();\r\n                }\r\n            }\r\n            else\r\n                state = 2;\r\n        }\r\n        break;\r\n    // Done.\r\n    case 2:\r\n        break;\r\n    }\r\n}\r\n\r\n#define __http_client_destroy\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Clears up contents of an httpClient prior to destruction or after error\r\n\r\nif (!destroyed) {\r\n    socket_destroy(socket);\r\n    buffer_destroy(responseBody);\r\n    ds_map_destroy(responseHeaders);\r\n}\r\ndestroyed = true;\r\n\r\n#define http_new_get\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Makes a GET HTTP request\r\n// real http_new_get(string url)\r\n\r\n// url - URL to send GET request to\r\n\r\n// Return value is an HttpClient instance that can be passed to\r\n// fct_http_request_status etc.\r\n// (errors on failure to parse URL)\r\n\r\nvar url, client;\r\n\r\nurl = argument0;\r\n\r\nif (!variable_global_exists('__HttpClient'))\r\n    __http_init();\r\n\r\nclient = instance_create(0, 0, global.__HttpClient);\r\n__http_prepare_request(client, url, -1);\r\nreturn client;\r\n\r\n#define http_new_get_ex\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Makes a GET HTTP request with custom headers\r\n// real http_new_get_ex(string url, real headers)\r\n\r\n// url - URL to send GET request to\r\n// headers - ds_map of extra headers to send\r\n\r\n// Return value is an HttpClient instance that can be passed to\r\n// fct_http_request_status etc.\r\n// (errors on failure to parse URL)\r\n\r\nvar url, headers, client;\r\n\r\nurl = argument0;\r\nheaders = argument1;\r\n\r\nif (!variable_global_exists('__HttpClient'))\r\n    __http_init();\r\n\r\nclient = instance_create(0, 0, global.__HttpClient);\r\n__http_prepare_request(client, url, headers);\r\nreturn client;\r\n\r\n#define http_step\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Steps the HTTP client. This is what makes everything actually happen.\r\n// Call it each step. Returns whether or not the request has finished.\r\n// real http_step(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is either:\r\n// 0 - In progress\r\n// 1 - Done or Errored\r\n\r\n// Example usage:\r\n// req = http_new_get(\"http://example.com/x.txt\");\r\n// while (http_step(req)) {}\r\n// if (http_status_code(req) != 200) {\r\n//     // Errored!\r\n// } else {\r\n//     // Hasn't errored, do stuff here.\r\n// }\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\n__http_client_step(client);\r\n\r\nif (client.errored || client.state == 2)\r\n    return 1;\r\nelse\r\n    return 0;\r\n\r\n#define http_status_code\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the status code\r\n// real http_status_code(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is either:\r\n// * 0, if the request has not yet finished\r\n// * a negative value, if there was an internal Faucet HTTP error\r\n// * a positive value, the status code of the HTTP request\r\n\r\n// \"The Status-Code element is a 3-digit integer result code of the\r\n// attempt to understand and satisfy the request. These codes are fully\r\n// defined in section 10. The Reason-Phrase is intended to give a short\r\n// textual description of the Status-Code. The Status-Code is intended\r\n// for use by automata and the Reason-Phrase is intended for the human\r\n// user. The client is not required to examine or display the Reason-\r\n// Phrase.\"\r\n\r\n// See also: http_reason_phrase, gets the Reason-Phrase\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nif (client.errored)\r\n    return -1;\r\nelse if (client.state == 2)\r\n    return client.statusCode;\r\nelse\r\n    return 0;\r\n\r\n#define http_reason_phrase\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the reason phrase\r\n// string http_reason_phrase(real client)\r\n\r\n// client - HttpClient object\r\n// Return value is either:\r\n// * \"\", if the request has not yet finished\r\n// * an internal Faucet HTTP error message, if there was one\r\n// * the reason phrase of the HTTP request\r\n\r\n// \"The Status-Code element is a 3-digit integer result code of the\r\n// attempt to understand and satisfy the request. These codes are fully\r\n// defined in section 10. The Reason-Phrase is intended to give a short\r\n// textual description of the Status-Code. The Status-Code is intended\r\n// for use by automata and the Reason-Phrase is intended for the human\r\n// user. The client is not required to examine or display the Reason-\r\n// Phrase.\"\r\n\r\n// See also: http_status_code, gets the Status-Code\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nif (client.errored)\r\n    return client.error;\r\nelse if (client.state == 2)\r\n    return client.reasonPhrase;\r\nelse\r\n    return \"\";\r\n\r\n#define http_response_body\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the response body returned by an HTTP request as a buffer\r\n// real http_response_body(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is a buffer if client hasn't errored and is finished\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nreturn client.responseBody;\r\n\r\n#define http_response_body_size\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the size of response body returned by an HTTP request\r\n// real http_response_body_size(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is the size in bytes, or -1 if we don't know or don't know yet\r\n\r\n// Call this each time you use the size - it may have changed in the case of redirect\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nreturn client.responseBodySize;\r\n\r\n#define http_response_body_progress\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the size of response body returned by an HTTP request which is so far downloaded \r\n// real http_response_body_progress(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is the size in bytes, or -1 if we haven't started yet or client has errored\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nreturn client.responseBodyProgress;\r\n\r\n#define http_response_headers\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the response headers returned by an HTTP request as a ds_map\r\n// real http_response_headers(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is a ds_map if client hasn't errored and is finished\r\n\r\n// All headers will have lowercase keys\r\n// The ds_map is owned by the HttpClient, do not use ds_map_destroy() yourself\r\n// Call when the request has finished - otherwise may be incomplete or missing\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nreturn client.responseHeaders;\r\n\r\n#define http_destroy\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Cleans up HttpClient\r\n// void http_destroy(real client)\r\n\r\n// client - HttpClient object\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nwith (client)\r\n{\r\n    __http_client_destroy();\r\n    instance_destroy();\r\n}\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/jsonion.gml",
    "content": "// Originally from /jsonion.gml in JSOnion\r\n// JSOnion v1.0.0d is licensed under the MIT licence. You may freely adapt and use this library in commercial and non-commercial projects.\r\n\r\n#define __jso_gmt_tuple\r\n{\r\n\r\n  /**\r\n  tuple(>element_0<, >element_1<, ..., >element_n<): Return an n-tuple\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  //Position, address table and data\r\n  var pos, addr_table, data;\r\n  pos = 6*argument_count+4;\r\n  addr_table = \"\";\r\n  data = \"\";\r\n  \r\n  //Build the tuple element-by-element\r\n  var i, ca, isstr, datastr;\r\n  for (i=0; i<argument_count; i+=1) {\r\n    //Check the argument's type\r\n    ca = argument[i];\r\n    isstr = is_string(ca);\r\n    if (isstr) { //Save strings as-is\r\n      datastr = ca;\r\n    }\r\n    else { //Save reals in scientific notation, 15 significant digits\r\n      datastr = __jso_gmt_numtostr(ca);\r\n    }\r\n    //Add entry in address table and data\r\n    addr_table += chr(isstr+$30)\r\n    addr_table += string_format(pos, 5, 0);\r\n    pos += string_length(datastr);\r\n    data += datastr;\r\n  }\r\n  \r\n  //Return the tuple, with size header character, address table and data\r\n  return string_format(argument_count, 3, 0)+addr_table+data;\r\n  \r\n}\r\n\r\n#define __jso_gmt_elem\r\n{\r\n\r\n  /**\r\n  elem(tuple_source, n): Return the <n>th element of <tuple_source>\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  //Capture arguments\r\n  var t, n, size;\r\n  t = argument0;\r\n  n = argument1;\r\n  size = __jso_gmt_size(t);\r\n  \r\n  //Search for the bounding positions for the <n>th element in the address table\r\n  var start, afterend, isstr;\r\n  isstr = ord(string_char_at(t, 4+6*n))-$30;\r\n  start = real(string_copy(t, 5+6*n, 5));\r\n  if (n < size-1) {\r\n    afterend = real(string_copy(t, 11+6*n, 5));\r\n  } else {\r\n    afterend = string_length(t)+1;\r\n  }\r\n  \r\n  //Return the <n>th element with the correct type\r\n  if (isstr) {\r\n    return string_copy(t, start, afterend-start);\r\n  }\r\n  else {\r\n    return real(string_copy(t, start, afterend-start));\r\n  }\r\n\r\n}\r\n\r\n#define __jso_gmt_size\r\n{\r\n  \r\n  /**\r\n  size(tuple_source): Return the size of <tuple_source>\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  return real(string_copy(argument0, 1, 3));\r\n\r\n}\r\n\r\n#define __jso_gmt_numtostr\r\n{\r\n\r\n  /**\r\n  __gmt_numtostr(num): Return string representation of <num>. Decimal numbers expressed as scientific notation\r\n  with double precision (i.e. 15 digits)\r\n  @author: GameGeisha\r\n  @version: 1.2 (edited)\r\n  */\r\n  if (frac(argument0) == 0) {\r\n    return string(argument0);\r\n  }\r\n  \r\n    var mantissa, exponent;\r\n    exponent = floor(log10(abs(argument0)));\r\n    mantissa = string_format(argument0/power(10,exponent), 15, 14);\r\n    var i, ca;\r\n    i = string_length(mantissa);\r\n    do {\r\n      ca = string_char_at(mantissa, i);\r\n      i -= 1;\r\n    } until (ca != \"0\")\r\n    if (ca != \".\") {\r\n        mantissa = string_copy(mantissa, 1, i+1);\r\n    }\r\n    else {\r\n        mantissa = string_copy(mantissa, 1, i);\r\n    }\r\n    if (exponent != 0) {\r\n      return mantissa + \"e\" + string(exponent);\r\n    }\r\n    else {\r\n      return mantissa;\r\n    }\r\n\r\n}\r\n\r\n#define __jso_gmt_test_all\r\n{\r\n\r\n  /**\r\n  test_all(): Runs all test suites\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n  \r\n  //Automated testing sequence\r\n  __jso_gmt_test_elem();\r\n  __jso_gmt_test_size();\r\n  __jso_gmt_test_numtostr();\r\n\r\n}\r\n\r\n#define __jso_gmt_test_numtostr\r\n{\r\n  \r\n  /**\r\n  _test_numtostr(): Runs number-to-string tests\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  var tolerance;\r\n  tolerance = 1/10000000000;\r\n\r\n  if (real(__jso_gmt_numtostr(9)) != 9) {\r\n    show_message(\"Scientific notation conversion failed for 1-digit integer! Result: \" + __jso_gmt_numtostr(9));\r\n  }\r\n  if (real(__jso_gmt_numtostr(500)) != 500) {\r\n    show_message(\"Scientific notation conversion failed for 3-digit integer! Result: \" + __jso_gmt_numtostr(500));\r\n  }\r\n  if (abs(real(__jso_gmt_numtostr(pi))-pi) > tolerance) {\r\n    show_message(\"Scientific notation conversion failed for pi! Result: \" + __jso_gmt_numtostr(pi));\r\n  }\r\n  if (abs(real(__jso_gmt_numtostr(104729.903455))-104729.903455) > tolerance) {\r\n    show_message(\"Scientific notation conversion failed for large decimal number! Result: \" + __jso_gmt_numtostr(104729.903455));\r\n  }\r\n  if (abs(real(__jso_gmt_numtostr(-pi))+pi) > tolerance) {\r\n    show_message(\"Scientific notation conversion failed for -pi! Result: \" + __jso_gmt_numtostr(-pi));\r\n  }\r\n  if (abs(real(__jso_gmt_numtostr(1/pi))-1/pi) > tolerance) {\r\n    show_message(\"Scientific notation conversion failed for 1/pi! Result: \" + __jso_gmt_numtostr(1/pi));\r\n  }\r\n\r\n}\r\n\r\n#define __jso_gmt_test_elem\r\n{\r\n\r\n  /**\r\n  _test_elem(): Runs tuple element retrieval tests\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  if (__jso_gmt_elem(__jso_gmt_tuple(\"Qblock\", \"kll\"), 0) != \"Qblock\") {\r\n    show_message(\"Element retrieval failed for simple string. #Should be:Qblock#Actual:\" + __jso_gmt_elem(__jso_gmt_tuple(\"Qblock\"), 0));\r\n  }\r\n  if (__jso_gmt_elem(__jso_gmt_tuple(9, \"Q\", -7), 0) != 9) {\r\n    show_message(\"Element retrieval failed for simple number. #Should be 9#Actual:\" + string(__jso_gmt_elem(__jso_gmt_tuple(9, \"Q\", 7), 0)));\r\n  }\r\n  if (__jso_gmt_elem(__jso_gmt_tuple(\"Qblock\", \"\", \"Negg\"), 1) != \"\") {\r\n    show_message(\"Element retrieval failed for empty string#Should be empty string#Actual:\"+string(__jso_gmt_elem(__jso_gmt_tuple(\"Qblock\", \"\", \"Negg\"), 0)));\r\n  }\r\n  \r\n  if (__jso_gmt_elem(__jso_gmt_elem(__jso_gmt_tuple(\"Not this\", __jso_gmt_tuple(0, 1, 2, 3), \"Waahoo\"), 1), 3) != 3) {\r\n    show_message(\"Element retrieval failed in nested tuple. #Should be 3#Actual:\" + string(__jso_gmt_elem(__jso_gmt_elem(__jso_gmt_tuple(\"Not this\", __jso_gmt_tuple(0, 1, 2, 3), \"Waahoo\"), 1), 3)));\r\n  }  \r\n\r\n}\r\n\r\n#define __jso_gmt_test_size\r\n{\r\n\r\n  /**\r\n  _test_size(): Runs tuple size tests\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  if (__jso_gmt_size(__jso_gmt_tuple(\"Waahoo\", \"Negg\", 0)) != 3) {\r\n    show_message(\"Bad size for 3-tuple\");\r\n  }\r\n  if (__jso_gmt_size(__jso_gmt_tuple()) != 0) {\r\n    show_message(\"Bad size for null tuple\");\r\n  }\r\n  if (__jso_gmt_size(__jso_gmt_tuple(7)) != 1) {\r\n    show_message(\"Bad size for 1-tuple\");\r\n  }\r\n  if (__jso_gmt_size(__jso_gmt_tuple(1,2,3,4,5,6,7,8,9,10)) != 10) {\r\n    show_message(\"Bad size for 10-tuple\");\r\n  }\r\n\r\n}\r\n\r\n#define jso_new_map\r\n{\r\n    /**\r\n    jso_new_map(): Create a new map.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return ds_map_create();\r\n}\r\n\r\n#define jso_new_list\r\n{\r\n    /**\r\n    jso_new_list(): Create a new list.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return ds_list_create();\r\n}\r\n\r\n#define jso_map_add_real\r\n{\r\n    /**\r\n    jso_map_add_real(map, key, val): Add the key-value pair <key>:<val> to <map>, where <val> is a real value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_map_add(argument0, argument1, argument2);\r\n}\r\n\r\n#define jso_map_add_string\r\n{\r\n    /**\r\n    jso_map_add_string(map, key, str): Add the key-value pair <key>:<str> to <map>, where <str> is a string value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_map_add(argument0, argument1, \"s\" + argument2);\r\n}\r\n\r\n#define jso_map_add_sublist\r\n{\r\n    /**\r\n    jso_map_add_sublist(map, key, sublist): Add the key-value pair <key>:<sublist> to <map>, where <sublist> is a list.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_map_add(argument0, argument1, \"l\" + string(argument2));\r\n}\r\n\r\n#define jso_map_add_submap\r\n{\r\n    /**\r\n    jso_map_add_submap(map, key, submap): Add the key-value pair <key>:<submap> to <map>, where <submap> is a map.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_map_add(argument0, argument1, \"m\" + string(argument2));\r\n}\r\n\r\n#define jso_map_add_integer\r\n{\r\n    /**\r\n    jso_map_add_integer(map, key, int): Add the key-value pair <key>:<int> to <map>, where <int> is a integer value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_map_add(argument0, argument1, floor(argument2));\r\n}\r\n\r\n#define jso_map_add_boolean\r\n{\r\n    /**\r\n    jso_map_add_boolean(map, key, bool): Add the key-value pair <key>:<bool> to <map>, where <bool> is a boolean value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    if (argument2) {\r\n        ds_map_add(argument0, argument1, \"btrue\");\r\n    } else {\r\n        ds_map_add(argument0, argument1, \"bfalse\");\r\n    }\r\n}\r\n\r\n#define jso_list_add_real\r\n{\r\n    /**\r\n    jso_list_add_real(list, val): Append the real value <val> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_list_add(argument0, argument1);\r\n}\r\n\r\n#define jso_list_add_string\r\n{\r\n    /**\r\n    jso_list_add_string(list, str): Append the string value <str> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_list_add(argument0, \"s\" + argument1);\r\n}\r\n\r\n#define jso_list_add_sublist\r\n{\r\n    /**\r\n    jso_list_add_sublist(list, sublist): Append the list <sublist> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_list_add(argument0, \"l\" + string(argument1));\r\n}\r\n\r\n#define jso_list_add_submap\r\n{\r\n    /**\r\n    jso_list_add_submap(list, submap): Append the map <submap> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_list_add(argument0, \"m\" + string(argument1));\r\n}\r\n\r\n#define jso_list_add_integer\r\n{\r\n    /**\r\n    jso_list_add_integer(list, int): Append the integer <int> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_list_add(argument0, floor(argument1));\r\n}\r\n\r\n#define jso_list_add_boolean\r\n{\r\n    /**\r\n    jso_list_add_boolean(list, bool): Append the boolean value <bool> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    if (argument1) {\r\n        ds_list_add(argument0, \"btrue\");\r\n    } else {\r\n        ds_list_add(argument0, \"bfalse\");\r\n    }\r\n}\r\n\r\n#define jso_map_get\r\n{\r\n    /**\r\n    jso_map_get(map, key): Retrieve the value stored in <map> with the key value <key>, with the correct type.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n\r\n    //Grab the value\r\n    var v;\r\n    v = ds_map_find_value(argument0, argument1);\r\n    \r\n    //String; could be string, map or list\r\n    if (is_string(v)) {\r\n        switch (string_char_at(v, 1)) {\r\n            case \"s\":\r\n                return string_delete(v, 1, 1);\r\n            break;\r\n            case \"l\": case \"m\":\r\n                return real(string_delete(v, 1, 1));\r\n            break;\r\n            case \"b\":\r\n                if (v == \"btrue\") {\r\n                    return true;\r\n                }\r\n                else if (v == \"bfalse\") {\r\n                    return false;\r\n                }\r\n                else {\r\n                    show_error(\"Invalid boolean value.\", true);\r\n                }\r\n            break;\r\n            default: show_error(\"Invalid map contents.\", true); break;\r\n        }    \r\n    }\r\n    \r\n    //Real; return real value as-is\r\n    else {\r\n        return v;\r\n    }\r\n}\r\n\r\n#define jso_map_get_type\r\n{\r\n    /**\r\n    jso_map_get_type(map, key): Return the type of value to which the key value <key> is mapped to in <map>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n\r\n    //Grab the value\r\n    var v;\r\n    v = ds_map_find_value(argument0, argument1);\r\n    \r\n    //String; could be string, map or list\r\n    if (is_string(v)) {\r\n        switch (string_char_at(v, 1)) {\r\n            case \"s\":\r\n                return jso_type_string;\r\n            break;\r\n            case \"l\":\r\n                return jso_type_list;\r\n            break;\r\n            case \"m\":\r\n                return jso_type_map;\r\n            break;\r\n            case \"b\":\r\n                return jso_type_boolean;\r\n            break;\r\n            default: show_error(\"Invalid map content type.\", true); break;\r\n        }    \r\n    }\r\n    \r\n    //Real\r\n    else {\r\n        return jso_type_real;\r\n    }\r\n}\r\n\r\n#define jso_list_get\r\n{\r\n    /**\r\n    jso_list_get(list, index): Retrieve the value stored in <list> at position <index>, with the correct type.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n\r\n    //Grab the value\r\n    var v;\r\n    v = ds_list_find_value(argument0, argument1);\r\n    \r\n    //String; could be string, map or list\r\n    if (is_string(v)) {\r\n        switch (string_char_at(v, 1)) {\r\n            case \"s\":\r\n                return string_delete(v, 1, 1);\r\n            break;\r\n            case \"l\": case \"m\":\r\n                return real(string_delete(v, 1, 1));\r\n            break;\r\n            case \"b\":\r\n                if (v == \"btrue\") {\r\n                    return true;\r\n                }\r\n                else if (v == \"bfalse\") {\r\n                    return false;\r\n                }\r\n                else {\r\n                    show_error(\"Invalid boolean value.\", true);\r\n                }\r\n            break;\r\n            default: show_error(\"Invalid list contents.\", true); break;\r\n        }    \r\n    }\r\n    \r\n    //Real; return real value as-is\r\n    else {\r\n        return v;\r\n    }\r\n}\r\n\r\n#define jso_list_get_type\r\n{\r\n    /**\r\n    jso_list_get_type(list, index): Retrieve the type of value found at position <index> of <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Grab the value\r\n    var v;\r\n    v = ds_list_find_value(argument0, argument1);\r\n    \r\n    //String; could be string, map or list\r\n    if (is_string(v)) {\r\n        switch (string_char_at(v, 1)) {\r\n            case \"s\":\r\n                return jso_type_string;\r\n            break;\r\n            case \"l\":\r\n                return jso_type_list;\r\n            break;\r\n            case \"m\":\r\n                return jso_type_map;\r\n            break;\r\n            case \"b\":\r\n                return jso_type_boolean;\r\n            break;\r\n            default: show_error(\"Invalid list content type.\", true); break;\r\n        }    \r\n    }\r\n    \r\n    //Real\r\n    else {\r\n        return jso_type_real;\r\n    }\r\n}\r\n\r\n#define jso_cleanup_map\r\n{\r\n    /**\r\n    jso_cleanup_map(map): Recursively free up <map>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Loop through all keys\r\n    var i, l, k;\r\n    l = ds_map_size(argument0);\r\n    k = ds_map_find_first(argument0);\r\n    for (i=0; i<l; i+=1) {\r\n    \r\n        //Look for values that need to be recursed    \r\n        switch (jso_map_get_type(argument0, k)) {\r\n            //Maps\r\n            case jso_type_map:\r\n                jso_cleanup_map(jso_map_get(argument0, k));\r\n            break;\r\n            //Lists\r\n            case jso_type_list:\r\n                jso_cleanup_list(jso_map_get(argument0, k));\r\n            break;\r\n        }\r\n        \r\n        //Find next key\r\n        k = ds_map_find_next(argument0, k);\r\n    }\r\n    \r\n    //Done, clean up\r\n    ds_map_destroy(argument0);\r\n}\r\n\r\n#define jso_cleanup_list\r\n{\r\n    /**\r\n    jso_cleanup_list(list): Recursively free up <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Loop through all elements\r\n    var i, l, v;\r\n    l = ds_list_size(argument0);\r\n    for (i=0; i<l; i+=1) {\r\n        //Look for elements that need to be recursed\r\n        switch (jso_list_get_type(argument0, i)) {\r\n            //Maps\r\n            case jso_type_map:\r\n                jso_cleanup_map(jso_list_get(argument0, i));\r\n            break;\r\n            //Lists\r\n            case jso_type_list:\r\n                jso_cleanup_list(jso_list_get(argument0, i));\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Done, clean up\r\n    ds_list_destroy(argument0);\r\n}\r\n\r\n#define jso_encode_real\r\n{\r\n    /**\r\n    jso_encode_real(<real>): Return a JSON-encoded version of real value <real>.\r\n    This uses scientific notation with up to 15 significant digits for decimal values.\r\n    For integers, it just uses string().\r\n    This is adapted from the same algorithm used in GMTuple.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    return __jso_gmt_numtostr(argument0);\r\n}\r\n\r\n#define jso_encode_string\r\n{\r\n    /**\r\n    jso_encode_string(str): Return a JSON-encoded version of string <str>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Iteratively reconstruct the string\r\n    var i, l, s, c;\r\n    s = \"\";\r\n    l = string_length(argument0);\r\n    for (i=1; i<=l; i+=1) {\r\n        //Replace escape characters\r\n        c = string_char_at(argument0, i);\r\n        switch (ord(c)) {\r\n            case 34: case 92: case 47: //Double quotes, backslashes and slashes\r\n                s += \"\\\" + c;\r\n            break;\r\n            case 8: //Backspace\r\n                s += \"\\b\";\r\n            break;\r\n            case 12: //Form feed\r\n                s += \"\\f\";\r\n            break;\r\n            case 10: //New line\r\n                s += \"\\n\";\r\n            break;\r\n            case 13: //Carriage return\r\n                s += \"\\r\";\r\n            break;\r\n            case 9: //Horizontal tab\r\n                s += \"\\t\";\r\n            break;\r\n            default: //Not an escape character\r\n                s += c;\r\n            break;\r\n        }\r\n    }\r\n\r\n    //Add quotes\r\n    return '\"' + s + '\"';\r\n}\r\n\r\n#define jso_encode_list\r\n{\r\n    /**\r\n    jso_encode_list(list): Return a JSON-encoded version of list <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Iteratively encode each element\r\n    var i, l, s;\r\n    s = \"\";\r\n    l = ds_list_size(argument0);\r\n    for (i=0; i<l; i+=1) {\r\n        //Prepend comma except for the first element\r\n        if (i > 0) {\r\n            s += \",\";\r\n        }\r\n        //Select correct encoding for each element, then recursively encode each\r\n        switch (jso_list_get_type(argument0, i)) {\r\n            case jso_type_real:\r\n                s += jso_encode_real(jso_list_get(argument0, i));\r\n            break;\r\n            case jso_type_string:\r\n                s += jso_encode_string(jso_list_get(argument0, i));\r\n            break;\r\n            case jso_type_map:\r\n                s += jso_encode_map(jso_list_get(argument0, i));\r\n            break;\r\n            case jso_type_list:\r\n                s += jso_encode_list(jso_list_get(argument0, i));\r\n            break;\r\n            case jso_type_boolean:\r\n                s += jso_encode_boolean(jso_list_get(argument0, i));\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Done, add square brackets\r\n    return \"[\" + s + \"]\";\r\n}\r\n\r\n#define jso_encode_map\r\n{\r\n    /**\r\n    jso_encode_map(map): Return a JSON-encoded version of map <map>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Go through every key-value pair\r\n    var i, l, k, s;\r\n    s = \"\";\r\n    l = ds_map_size(argument0);\r\n    k = ds_map_find_first(argument0);\r\n    for (i=0; i<l; i+=1) {\r\n        //Prefix , if there is preceding item\r\n        if (i > 0) {\r\n            s += \",\";\r\n        }\r\n        //Find the key and encode it\r\n        if (is_real(k)) {\r\n            s += jso_encode_real(k);\r\n        } else {\r\n            s += jso_encode_string(k);\r\n        }\r\n        //Add the : separator\r\n        s += \":\";\r\n        //Select correct encoding for each value, then recursively encode each   \r\n        switch (jso_map_get_type(argument0, k)) {\r\n            case jso_type_real:\r\n                s += jso_encode_real(jso_map_get(argument0, k));\r\n            break;\r\n            case jso_type_string:\r\n                s += jso_encode_string(jso_map_get(argument0, k));\r\n            break;\r\n            case jso_type_map:\r\n                s += jso_encode_map(jso_map_get(argument0, k));\r\n            break;\r\n            case jso_type_list:\r\n                s += jso_encode_list(jso_map_get(argument0, k));\r\n            break;\r\n            case jso_type_boolean:\r\n                s += jso_encode_boolean(jso_map_get(argument0, k));\r\n            break;\r\n        }\r\n        //Get next key\r\n        k = ds_map_find_next(argument0, k);\r\n    }\r\n    \r\n    //Done, add braces\r\n    return \"{\" + s + \"}\";\r\n}\r\n\r\n#define jso_encode_integer\r\n{\r\n    /**\r\n    jso_encode_integer(int): Return a JSON-encoded version of the integer value <int>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return string(floor(argument0));\r\n}\r\n\r\n#define jso_encode_boolean\r\n{\r\n    /**\r\n    jso_encode_boolean(bool): Return a JSON-encoded version of the boolean value <bool>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    if (argument0) {\r\n        return \"true\";\r\n    } else {\r\n        return \"false\";\r\n    }\r\n}\r\n\r\n#define jso_decode_map\r\n{\r\n    /**\r\n    jso_decode_map(json): Return a JSOnion-compatible map representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_map(argument0, 1), 0);\r\n}\r\n\r\n#define jso_decode_list\r\n{\r\n    /**\r\n    jso_decode_list(json): Return a JSOnion-compatible list representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_list(argument0, 1), 0);\r\n}\r\n\r\n#define jso_decode_string\r\n{\r\n    /**\r\n    jso_decode_string(json): Return a string representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_string(argument0, 1), 0);\r\n}\r\n\r\n#define jso_decode_boolean\r\n{\r\n    /**\r\n    jso_decode_boolean(json): Return a boolean value representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_boolean(argument0, 1), 0);\r\n}\r\n\r\n#define jso_decode_real\r\n{\r\n    /**\r\n    jso_decode_real(json): Return a real value representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_real(argument0, 1), 0);\r\n}\r\n\r\n#define jso_decode_integer\r\n{\r\n    /**\r\n    jso_decode_integer(json): Return an integer value representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_integer(argument0, 1), 0);\r\n}\r\n\r\n#define _jso_decode_map\r\n{\r\n    /**\r\n    _jso_decode_map(json, startindex): Extract a map from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted map handle and the position after the ending }.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, map;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    map = jso_new_map();\r\n    \r\n    //Seek to first {\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (c != \"{\") {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n            if (!_jso_is_whitespace_char(c)) && (c != \"{\") {\r\n                show_error(\"Cannot parse map at position \" + string(i), true);\r\n            }\r\n        } until (c == \"{\")\r\n    }\r\n    i += 1;\r\n    \r\n    //Read until end of JSON or ending }\r\n    var found_end, state, found, current_key;\r\n    found_end = false;\r\n    state = 0;\r\n    for (i=i; i<=len && !found_end; i+=1) {\r\n        c = string_char_at(argument0, i);\r\n        switch (state) {\r\n            //0: Looking for a key or closing }\r\n            case 0:\r\n                switch (c) {\r\n                    case \"}\":\r\n                        found_end = true;\r\n                    break;\r\n                    case '\"':\r\n                        found = _jso_decode_string(argument0, i);\r\n                        current_key = __jso_gmt_elem(found, 0);\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\": case \"+\": case \"-\":\r\n                        found = _jso_decode_real(argument0, i);\r\n                        current_key = __jso_gmt_elem(found, 0);\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n            //1: Looking for the : separator\r\n            case 1:\r\n                switch (c) {\r\n                    case \":\":\r\n                        state = 2;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n            //2: Looking for a value\r\n            case 2:\r\n                switch (c) {\r\n                    case \"[\":\r\n                        found = _jso_decode_list(argument0, i);\r\n                        jso_map_add_sublist(map, current_key, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 3;\r\n                    break;\r\n                    case \"{\":\r\n                        found = _jso_decode_map(argument0, i);\r\n                        jso_map_add_submap(map, current_key, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 3;\r\n                    break;\r\n                    case '\"':\r\n                        found = _jso_decode_string(argument0, i);\r\n                        jso_map_add_string(map, current_key, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 3;\r\n                    break;\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\": case \"+\": case \"-\":\r\n                        found = _jso_decode_real(argument0, i);\r\n                        jso_map_add_real(map, current_key, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 3;\r\n                    break;\r\n                    case \"t\": case \"f\":\r\n                        found = _jso_decode_boolean(argument0, i);\r\n                        jso_map_add_boolean(map, current_key, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 3;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n            //3: Done looking for an entry, want comma or }\r\n            case 3:\r\n                switch (c) {\r\n                    case \"}\":\r\n                        found_end = true;\r\n                    break;\r\n                    case \",\":\r\n                        state = 0;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Return extracted map with ending position if the ending } is found\r\n    if (found_end) {\r\n        return __jso_gmt_tuple(map, i);\r\n    }\r\n    //Ended too early, throw error\r\n    else {\r\n        show_error(\"Unexpected end of map in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define _jso_decode_list\r\n{\r\n    /**\r\n    _jso_decode_list(json, startindex): Extract a list from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted list handle and the position after the ending ].\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, list;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    list = jso_new_list();\r\n    \r\n    //Seek to first [\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (c != \"[\") {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n            if (!_jso_is_whitespace_char(c)) && (c != \"[\") {\r\n                show_error(\"Cannot parse list at position \" + string(i), true);\r\n            }\r\n        } until (c == \"[\")\r\n    }\r\n    i += 1;\r\n    \r\n    //Read until end of JSON or ending ]\r\n    var found_end, state, found;\r\n    found_end = false;\r\n    state = 0;\r\n    for (i=i; i<=len && !found_end; i+=1) {\r\n        c = string_char_at(argument0, i);\r\n        switch (state) {\r\n            //0: Looking for an item\r\n            case 0:\r\n                switch (c) {\r\n                    case \"]\":\r\n                        found_end = true;\r\n                    break;\r\n                    case \"[\":\r\n                        found = _jso_decode_list(argument0, i);\r\n                        jso_list_add_sublist(list, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    case \"{\":\r\n                        found = _jso_decode_map(argument0, i);\r\n                        jso_list_add_submap(list, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    case '\"':\r\n                        found = _jso_decode_string(argument0, i);\r\n                        jso_list_add_string(list, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\": case \"+\": case \"-\":\r\n                        found = _jso_decode_real(argument0, i);\r\n                        jso_list_add_real(list, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    case \"t\": case \"f\":\r\n                        found = _jso_decode_boolean(argument0, i);\r\n                        jso_list_add_boolean(list, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n            //1: Done looking for an item, want comma or ]\r\n            case 1:\r\n                switch (c) {\r\n                    case \"]\":\r\n                        found_end = true;\r\n                    break;\r\n                    case \",\":\r\n                        state = 0;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Return extracted list with ending position if the ending ] is found\r\n    if (found_end) {\r\n        return __jso_gmt_tuple(list, i);\r\n    }\r\n    //Ended too early, throw error\r\n    else {\r\n        show_error(\"Unexpected end of list in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define _jso_decode_string\r\n{\r\n    /**\r\n    _jso_decode_string(json, startindex): Extract a string from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted string and the position after the ending double quote.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, str;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    str = \"\";\r\n    \r\n    //Seek to first double quote\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (c != '\"') {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n        } until (c == '\"')\r\n    }\r\n    i += 1;\r\n    \r\n    //Read until end of JSON or ending double quote\r\n    var found_end, escape_mode;\r\n    found_end = false;\r\n    escape_mode = false;\r\n    for (i=i; i<=len && !found_end; i+=1) {\r\n        c = string_char_at(argument0, i);\r\n        //Escape mode\r\n        if (escape_mode) {\r\n            switch (c) {\r\n                case '\"': case \"\\\": case \"/\":\r\n                    str += c;\r\n                    escape_mode = false;\r\n                break;\r\n                case \"b\":\r\n                    str += chr(8);\r\n                    escape_mode = false;\r\n                break;\r\n                case \"f\":\r\n                    str += chr(12);\r\n                    escape_mode = false;\r\n                break;\r\n                case \"n\":\r\n                    str += chr(10);\r\n                    escape_mode = false;\r\n                break;\r\n                case \"r\":\r\n                    str += chr(13);\r\n                    escape_mode = false;\r\n                break;\r\n                case \"t\":\r\n                    str += chr(9);\r\n                    escape_mode = false;\r\n                break;\r\n                case \"u\":\r\n                    var u;\r\n                    if (len-i < 5) {\r\n                        show_error(\"Invalid escape character at position \" + string(i) + \".\", true);\r\n                    } else {\r\n                        str += chr(_jso_hex_to_decimal(string_copy(argument0, i+1, 4)));\r\n                        escape_mode = false;\r\n                        i += 4;\r\n                    }\r\n                break;\r\n                default:\r\n                    show_error(\"Invalid escape character at position \" + string(i) + \".\", true);\r\n                break;\r\n            }\r\n        }\r\n        //Regular mode\r\n        else {\r\n            switch (c) {\r\n                case '\"': found_end = true; break;\r\n                case \"\\\": escape_mode = true; break;\r\n                default: str += c; break;\r\n            }\r\n        }\r\n    }\r\n    \r\n    //Return extracted string with ending position if the ending double quote is found\r\n    if (found_end) {\r\n        return __jso_gmt_tuple(str, i);\r\n    }\r\n    //Ended too early, throw error\r\n    else {\r\n        show_error(\"Unexpected end of string in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define _jso_decode_boolean\r\n{\r\n    /**\r\n    _jso_decode_boolean(json, startindex): Extract a boolean from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted boolean and the position after the last e.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, str;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    \r\n    //Seek to first t or f that can be found\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (c != \"t\") && (c != \"f\") {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n            if (!_jso_is_whitespace_char(c)) && (c != \"t\") && (c != \"f\") {\r\n                show_error(\"Cannot parse boolean value at position \" + string(i), true);\r\n            }\r\n        } until (c == \"t\") || (c == \"f\")\r\n    }\r\n    \r\n    //Look for true if t is found\r\n    if (c == \"t\") && (string_copy(argument0, i, 4) == \"true\") {\r\n        return __jso_gmt_tuple(true, i+4);\r\n    }\r\n    //Look for false if f is found\r\n    else if (c == \"f\") && (string_copy(argument0, i, 5) == \"false\") {\r\n        return __jso_gmt_tuple(false, i+5);\r\n    }\r\n    //Error: unexpected ending\r\n    else {\r\n        show_error(\"Unexpected end of boolean in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define _jso_decode_real\r\n{\r\n    /**\r\n    _jso_decode_real(json, startindex): Extract a real value from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted real value and the position after the real value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, str;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    str = \"\";\r\n    \r\n    //Seek to first character: +, -, or 0-9\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (string_pos(c, \"0123456789+-\") == 0) {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n            if (!_jso_is_whitespace_char(c)) && (string_pos(c, \"0123456789+-\") == 0) {\r\n                show_error(\"Cannot parse real value at position \" + string(i), true);\r\n            }\r\n        } until (string_pos(c, \"0123456789+-\") > 0)\r\n    }\r\n    \r\n    //Determine starting state\r\n    var state;\r\n    switch (c) {\r\n        case \"+\": case \"-\":\r\n            state = 0;\r\n        break;\r\n        default:\r\n            state = 1;\r\n        break;\r\n    }\r\n    str += c;\r\n    i += 1;\r\n    \r\n    //Loop until no more digits found\r\n    var done;\r\n    done = false;\r\n    for (i=i; i<=len && !done; i+=1) {\r\n        c = string_char_at(argument0, i);\r\n        switch (state) {\r\n            //0: Found a sign, looking for a starting number\r\n            case 0:\r\n                switch (c) {\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                        str += c;\r\n                        state = 1;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n            //1: Found a starting digit, looking for decimal dot, e, E, or more digits\r\n            case 1:\r\n                if (_jso_is_whitespace_char(c)) || (string_pos(c, \":,]}\") > 0) {\r\n                    done = true;\r\n                    i -= 1;\r\n                } else {\r\n                    switch (c) {\r\n                        case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                            str += c;\r\n                        break;\r\n                        case \".\":\r\n                            str += c;\r\n                            state = 2;\r\n                        break;\r\n                        case \"e\": case \"E\":\r\n                            str += c;\r\n                            state = 3;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Unexpected character at position \" + string(i) + \", expecting a dot, e, E or a digit.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n            break;\r\n            //2: Found a decimal dot, looking for more digits\r\n            case 2:\r\n                switch (c) {\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                        str += c;\r\n                        state = -2;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n            //-2: Found a decimal dot and a digit after it, looking for more digits, e, or E\r\n            case -2:\r\n                if (_jso_is_whitespace_char(c)) || (string_pos(c, \":,]}\") > 0) {\r\n                    done = true;\r\n                    i -= 1;\r\n                } else {\r\n                    switch (c) {\r\n                        case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                            str += c;\r\n                        break;\r\n                        case \"e\": case \"E\":\r\n                            str += c;\r\n                            state = 3;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Unexpected character at position \" + string(i) + \", expecting an e, E or a digit.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n            break;\r\n            //3: Found an e/E, looking for +, - or more digits\r\n            case 3:\r\n                switch (c) {\r\n                    case \"+\": case \"-\":\r\n                        str += c;\r\n                        state = 4;\r\n                    break;\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                        str += c;\r\n                        state = 5;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Unexpected character at position \" + string(i) + \", expecting a +, - or a digit.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n            //4: Found an e/E exponent sign, looking for more digits\r\n            case 4:\r\n                switch (c) {\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                        str += c;\r\n                        state = 5;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n            //5: Looking for final digits of the exponent\r\n            case 5:\r\n                if (_jso_is_whitespace_char(c)) || (string_pos(c, \":,]}\") > 0) {\r\n                    done = true;\r\n                    i -= 1;\r\n                } else {\r\n                    switch (c) {\r\n                        case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                            str += c;\r\n                            state = 5;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Am I still expecting more characters?\r\n    if (done) || (state == 1) || (state == -2) || (state == 5) {\r\n        return __jso_gmt_tuple(real(str), i);\r\n    }\r\n    //Error: unexpected ending\r\n    else {\r\n        show_error(\"Unexpected end of real in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define _jso_decode_integer\r\n{\r\n    /**\r\n    _jso_decode_real(json, startindex): Extract a real value from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted integer value (with leading i) and the position after the real value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, str;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    str = \"\";\r\n    \r\n    //Seek to first character: +, -, or 0-9\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (string_pos(c, \"0123456789+-\") == 0) {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n            if (!_jso_is_whitespace_char(c)) && (string_pos(c, \"0123456789+-\") == 0) {\r\n                show_error(\"Cannot parse integer value at position \" + string(i), true);\r\n            }\r\n        } until (string_pos(c, \"0123456789+-\") > 0)\r\n    }\r\n    \r\n    //Determine starting state\r\n    var state;\r\n    switch (c) {\r\n        case \"+\": case \"-\":\r\n            state = 0;\r\n        break;\r\n        default:\r\n            state = 1;\r\n        break;\r\n    }\r\n    str += c;\r\n    i += 1;\r\n    \r\n    //Loop until no more digits found\r\n    var done;\r\n    done = false;\r\n    for (i=i; i<=len && !done; i+=1) {\r\n        c = string_char_at(argument0, i);\r\n        switch (state) {\r\n            //0: Found a sign, looking for a starting number\r\n            case 0:\r\n                switch (c) {\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                        str += c;\r\n                        state = 1;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n            //1: Found a starting digit, looking for decimal dot, e, E, or more digits\r\n            case 1:\r\n                if (_jso_is_whitespace_char(c)) || (string_pos(c, \":,]}\") > 0) {\r\n                    done = true;\r\n                    i -= 1;\r\n                } else {\r\n                    switch (c) {\r\n                        case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                            str += c;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Am I still expecting more characters?\r\n    if (done) || (state == 1) {\r\n        return __jso_gmt_tuple(floor(real(str)), i);\r\n    }\r\n    //Error: unexpected ending\r\n    else {\r\n        show_error(\"Unexpected end of integer in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define jso_compare_maps\r\n{\r\n    /**\r\n    jso_compare_maps(map1, map2): Return whether the contents of JSOnion-compatible maps <map1> and <map2> are the same.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //If they aren't the same size, they can't be the same\r\n    var size;\r\n    size = ds_map_size(argument0);\r\n    if (size != ds_map_size(argument1)) {\r\n        return false;\r\n    }\r\n    \r\n    //Compare contents pairwise\r\n    var i, k, type, a, b;\r\n    k = ds_map_find_first(argument0);\r\n    for (i=0; i<size; i+=1) {\r\n        //Check that key exists on both sides\r\n        if (!ds_map_exists(argument1, k)) {\r\n            return false;\r\n        }\r\n        //Check type\r\n        type = jso_map_get_type(argument0, k);\r\n        if (jso_map_get_type(argument1, k) != type) {\r\n            return false;\r\n        }\r\n        //Check content\r\n        a = jso_map_get(argument0, k);\r\n        b = jso_map_get(argument1, k);\r\n        switch (type) {\r\n            case jso_type_map:\r\n                if (!jso_compare_maps(a, b)) {\r\n                    return false;\r\n                }\r\n            break;\r\n            case jso_type_list:\r\n                if (!jso_compare_lists(a, b)) {\r\n                    return false;\r\n                }\r\n            break;\r\n            default:\r\n                if (a != b) {\r\n                    return false;\r\n                }\r\n            break;\r\n        }\r\n        //Advance to next key\r\n        k = ds_map_find_next(argument0, k);\r\n    }\r\n    \r\n    //No mismatches, return true\r\n    return true;\r\n}\r\n\r\n#define jso_compare_lists\r\n{\r\n    /**\r\n    jso_compare_lists(list1, list2): Return whether the contents of JSOnion-compatible lists <list1> and <list2> are the same.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //If they aren't the same size, they can't be the same\r\n    var size;\r\n    size = ds_list_size(argument0);\r\n    if (size != ds_list_size(argument1)) {\r\n        return false;\r\n    }\r\n    \r\n    //Compare contents pairwise\r\n    var i, type, a, b;\r\n    for (i=0; i<size; i+=1) {\r\n        //Check type\r\n        type = jso_list_get_type(argument0, i);\r\n        if (jso_list_get_type(argument1, i) != type) {\r\n            return false;\r\n        }\r\n        //Check content\r\n        a = jso_list_get(argument0, i);\r\n        b = jso_list_get(argument1, i);\r\n        switch (type) {\r\n            case jso_type_map:\r\n                if (!jso_compare_maps(a, b)) {\r\n                    return false;\r\n                }\r\n            break;\r\n            case jso_type_list:\r\n                if (!jso_compare_lists(a, b)) {\r\n                    return false;\r\n                }\r\n            break;\r\n            default:\r\n                if (a != b) {\r\n                    return false;\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //No mismatches, return true\r\n    return true;\r\n}\r\n\r\n#define jso_map_check\r\n{\r\n    /**\r\n    jso_map_check(map, key1, key2, ...): Recursively look up keys/indices in the top-level map <map>, return whether a value exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_map, 0, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define jso_list_check\r\n{\r\n    /**\r\n    jso_list_check(list, key1, key2, ...): Recursively look up keys/indices in the top-level list <list>, return whether a value exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_list, 0, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define jso_map_lookup\r\n{\r\n    /**\r\n    jso_map_lookup(map, key1, key2, ...): Recursively look up keys/indices in the top-level map <map>, return the value that exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_map, 1, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define jso_map_lookup_type\r\n{\r\n    /**\r\n    jso_map_lookup_type(map, key1, key2, ...): Recursively look up keys/indices in the top-level map <map>, return the type of value that exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_map, 2, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define jso_list_lookup\r\n{\r\n    /**\r\n    jso_list_lookup(list, key1, key2, ...): Recursively look up keys/indices in the top-level list <list>, return the value that exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_list, 1, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define jso_list_lookup_type\r\n{\r\n    /**\r\n    jso_list_lookup_type(list, key1, key2, ...): Recursively look up keys/indices in the top-level list <list>, return the type of value that exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_list, 2, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define _jso_lookup_kernel\r\n{\r\n    /**\r\n    _jso_lookup_kernel(jso_ds, jso_type, task_type, ds_args_list): Kernel of the check and lookup functions.\r\n    - jso_ds: The JSOnion-compatible data structure handle.\r\n    - jso_type: The type of the JSOnion-compatible (jso_type_list or jso_type_map)\r\n    - task_type: 0=check, 1=lookup, 2=lookup type\r\n    - ds_args_list: ds_list of arguments passed in.\r\n    \r\n    PLEASE DO NOT CALL DIRECTLY --- use regular jso_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    var i, k, data, type, type_string, task_type, keys_size, ds_args_list;\r\n    data = argument0;\r\n    type = argument1;\r\n    if (type == jso_type_map) {\r\n        type_string = \"map\";\r\n    } else {\r\n        type_string = \"list\";\r\n    }\r\n    task_type = argument2;\r\n    ds_args_list = argument3;\r\n    keys_size = ds_list_size(ds_args_list);\r\n    \r\n    //Iteratively go through arguments in ds_args_list\r\n    for (i=0; i<keys_size; i+=1) {\r\n        k = ds_list_find_value(argument3, i);\r\n        switch (type) {\r\n            //Check for existence of the key in the current map\r\n            case jso_type_map:\r\n                if (!ds_map_exists(data, k)) {\r\n                    switch (task_type) {\r\n                        case 0:\r\n                            return false;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Cannot find value in \" + type_string + \" lookup.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n                type = jso_map_get_type(data, k);\r\n                data = jso_map_get(data, k);\r\n            break;\r\n            //Check for existence of the index in the current list\r\n            case jso_type_list:\r\n                if (is_string(k)) {\r\n                    switch (task_type) {\r\n                        case 0:\r\n                            return false;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Cannot use string indices for nested lists in \" + type_string + \" lookup.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n                if (k >= ds_list_size(data)) {\r\n                    switch (task_type) {\r\n                        case 0:\r\n                            return false;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Index overflow for nested lists in \" + type_string + \" lookup.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n                type = jso_list_get_type(data, k);\r\n                data = jso_list_get(data, k);\r\n            break;\r\n            //Trying to go through a leaf; don't attempt to look further\r\n            default:\r\n                switch (task_type) {\r\n                    case 0:\r\n                        return false;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Recursive overflow in \" + type_string + \" lookup.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Can find something, return the value requested by the task\r\n    switch (task_type) {\r\n        case 0:\r\n            return true;\r\n        break;\r\n        case 1:\r\n            return data;\r\n        break;\r\n        case 2:\r\n            return type;\r\n        break;\r\n    }\r\n}\r\n\r\n#define _jso_is_whitespace_char\r\n{\r\n    /**\r\n    _jso_is_whitespace_char(char): Return whether <char> is a whitespace character.\r\n    Definition of whitespace is given by Unicode 6.0, Chapter 4.6.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    switch (ord(argument0)) {\r\n        case $0009:\r\n        case $000A:\r\n        case $000B:\r\n        case $000C:\r\n        case $000D:\r\n        case $0020:\r\n        case $0085:\r\n        case $00A0:\r\n        case $1680:\r\n        case $180E:\r\n        case $2000:\r\n        case $2001:\r\n        case $2002:\r\n        case $2003:\r\n        case $2004:\r\n        case $2005:\r\n        case $2006:\r\n        case $2007:\r\n        case $2008:\r\n        case $2009:\r\n        case $200A:\r\n        case $2028:\r\n        case $2029:\r\n        case $202F:\r\n        case $205F:\r\n        case $3000:\r\n            return true;\r\n    }\r\n    return false;\r\n}\r\n\r\n#define _jso_hex_to_decimal\r\n{\r\n    /**\r\n    _jso_hex_to_decimal(hex_string): Return the decimal value of the hex number represented by <hex_string>\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var hex_string, hex_digits;\r\n    hex_string = string_lower(argument0);\r\n    hex_digits = \"0123456789abcdef\";\r\n    \r\n    //Convert digit-by-digit\r\n    var i, len, digit_value, num;\r\n    len = string_length(hex_string);\r\n    num = 0;\r\n    for (i=1; i<=len; i+=1) {\r\n        digit_value = string_pos(string_char_at(hex_string, i), hex_digits)-1;\r\n        if (digit_value >= 0) {\r\n            num *= 16;\r\n            num += digit_value;\r\n        } \r\n        //Unknown character\r\n        else {\r\n            show_error(\"Invalid hex number: \" + argument0, true);\r\n        }\r\n    }\r\n    return num;\r\n}\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/jsonion_test.gml",
    "content": "// Originally from /jsonion_test.gml in JSOnion\r\n// JSOnion v1.0.0d is licensed under the MIT licence. You may freely adapt and use this library in commercial and non-commercial projects.\r\n\r\n#define assert_true\r\n{\r\n    /**\r\n    assert_true(result, errormsg): Display error <errormsg> unless <result> is true.\r\n    */\r\n    \r\n    if (!argument0) {\r\n        _assert_error_popup(argument1 + string_repeat(_assert_newline(), 2) + \"Expected true, got false.\");\r\n    }\r\n}\r\n\r\n#define assert_false\r\n{\r\n    /**\r\n    assert_false(result, errormsg): Display error <errormsg> unless <result> is false.\r\n    */\r\n    \r\n    if (argument0) {\r\n        _assert_error_popup(argument1 + string_repeat(_assert_newline(), 2) + \"Expected false, got true.\");\r\n    }\r\n}\r\n\r\n#define assert_equal\r\n{\r\n    /**\r\n    assert_equal(expected, result, errormsg): Display error <errormsg> unless <expected> and <result> are equal.\r\n    */\r\n    \r\n    //Safe equality check; won't crash even if the two are different types\r\n    var match;\r\n    match = is_string(argument0) == is_string(argument1);\r\n    if (match) {\r\n        match = argument0 == argument1;\r\n    }\r\n\r\n    //No match?\r\n    if (!match) {\r\n        //Data types\r\n        var type;\r\n        type[0] = \"(Real)\";\r\n        type[1] = \"(String)\";\r\n        \r\n        //Construct message\r\n        var msg;\r\n        msg = argument2;\r\n        //Add expected value\r\n        msg += string_repeat(_assert_newline(), 2);\r\n        msg += \"Expected \" + type[is_string(argument0)] + \":\" + _assert_newline();\r\n        msg += _assert_debug_value(argument0);\r\n        //Add actual value\r\n        msg += string_repeat(_assert_newline(), 2);\r\n        msg += \"Actual \" + type[is_string(argument1)] + \":\" + _assert_newline();\r\n        msg += _assert_debug_value(argument1);\r\n        \r\n        //Display message\r\n        _assert_error_popup(msg);\r\n    }\r\n}\r\n\r\n#define _assert_error_popup\r\n{\r\n    /**\r\n    _assert_error_popup(msg): Display an assertion error.\r\n    */\r\n    \r\n    //Display message\r\n    if (os_browser == browser_not_a_browser) {\r\n        show_error(argument0, false); //Full-fledged error message for non-browser environments\r\n    } else {\r\n        show_message(argument0); //Browsers don't support show_error(), use show_message() instead\r\n    }\r\n}\r\n\r\n#define _assert_debug_value\r\n{\r\n    /**\r\n    _assert_debug_value(val): Returns a low-level debug value for the value <val>.\r\n    <val> can be a string or a real value.\r\n    */\r\n    \r\n    //String\r\n    if (is_string(argument0)) {\r\n        if (os_browser == browser_not_a_browser) {\r\n            return argument0;\r\n        } else {\r\n            return string_replace_all(argument0, \"#\", \"\\#\");\r\n        }\r\n    }\r\n    \r\n    //Numeric --- use GMTuple's algorithm\r\n    else {\r\n    \r\n        //Integers\r\n        if (frac(argument0) == 0) {\r\n            return string(argument0);\r\n        }\r\n        \r\n        //Decimal numbers; get exponent and mantissa  \r\n        var mantissa, exponent;\r\n        exponent = floor(log10(abs(argument0)));\r\n        mantissa = string_format(argument0/power(10,exponent), 15, 14);\r\n        //Look for trailing zeros in the mantissa\r\n        var i, ca;\r\n        i = string_length(mantissa);\r\n        do {\r\n            ca = string_char_at(mantissa, i);\r\n            i -= 1;\r\n        } until (ca != \"0\")\r\n        //Remove the dot if only the first digit of the normalized mantissa is nonzero\r\n        if (ca != \".\") {\r\n            mantissa = string_copy(mantissa, 1, i+1);\r\n        }\r\n        else {\r\n            mantissa = string_copy(mantissa, 1, i);\r\n        }\r\n        //Remove the exponent if it is 0\r\n        if (exponent != 0) {\r\n            return mantissa + \"e\" + string(exponent);\r\n        } else {\r\n            return mantissa;\r\n        }\r\n    \r\n    //GMTuple algorithm done\r\n    }\r\n}\r\n\r\n#define _assert_newline\r\n{\r\n    /**\r\n    _assert_newline(): Returns a system-appropriate newline character sequence.\r\n    */\r\n    \r\n    if (os_browser == browser_not_a_browser) {\r\n        return chr(13) + chr(10);\r\n    } else {\r\n        return \"#\";\r\n    }\r\n}\r\n\r\n#define jso_test_all\r\n{\r\n    /**\r\n    jso_test_all(): Run the test suite for the JSOnion library.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var a, b;\r\n    a = current_time;\r\n    _test_jso_new();\r\n    _test_jso_map_add();\r\n    _test_jso_list_add();\r\n    _test_jso_encode();\r\n    _test_jso_compare();\r\n    _test_jso_decode();\r\n    _test_jso_lookup();\r\n    _test_jso_bugs();\r\n    __jso_gmt_test_all();\r\n    b = current_time;\r\n    show_debug_message(\"JSOnion: Tests completed in \" + string(b-a) + \"ms.\");\r\n}\r\n\r\n#define _test_jso_new\r\n{\r\n    /**\r\n    _test_jso_new(): Test jso_new_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    var expected, actual;\r\n    \r\n    //jso_new_map()\r\n    actual = jso_new_map();\r\n    assert_true(actual >= 0, \"jso_new_map() failed to create a new map.\");\r\n    ds_map_destroy(actual);\r\n    \r\n    //jso_new_list()\r\n    actual = jso_new_list();\r\n    assert_true(actual >= 0, \"jso_new_list() failed to create a new list.\");\r\n    ds_list_destroy(actual);\r\n}\r\n\r\n#define _test_jso_map_add\r\n{\r\n    /**\r\n    _test_jso_map_add(): Test jso_map_add_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    var expected, actual, key, map;\r\n    map = jso_new_map();\r\n    \r\n    //jso_map_add_real()\r\n    expected = pi;\r\n    key = \"pi\";\r\n    jso_map_add_real(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_real() failed to add the number.\");\r\n    assert_equal(expected, actual, \"jso_map_add_real() added the wrong number.\");\r\n    ds_map_delete(map, key);\r\n    \r\n    //jso_map_add_string()\r\n    expected = \"waahoo\";\r\n    key = \"str\";\r\n    jso_map_add_string(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_string() failed to add the string.\");\r\n    assert_equal(expected, actual, \"jso_map_add_string() added the wrong string.\");\r\n    ds_map_delete(map, key);\r\n    \r\n    //jso_map_add_sublist()\r\n    expected = jso_new_list();\r\n    key = \"sublist\";\r\n    jso_map_add_sublist(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_sublist() failed to add the new sublist.\");\r\n    assert_equal(expected, actual, \"jso_map_add_sublist() added the wrong sublist.\");\r\n    ds_map_delete(map, key);\r\n    ds_list_destroy(expected);\r\n    \r\n    //jso_map_add_submap()\r\n    expected = jso_new_map();\r\n    key = \"sublist\";\r\n    jso_map_add_sublist(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_submap() failed to add the new submap.\");\r\n    assert_equal(expected, actual, \"jso_map_add_submap() added the wrong submap.\");\r\n    ds_map_delete(map, key);\r\n    ds_map_destroy(expected);\r\n    \r\n    //jso_map_add_integer()\r\n    expected = 2345;\r\n    key = \"integer\";\r\n    jso_map_add_integer(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_integer() failed to add the new integer.\");\r\n    assert_equal(expected, actual, \"jso_map_add_integer() added the wrong integer.\");\r\n    ds_map_delete(map, key);\r\n    \r\n    //jso_map_add_boolean() --- true\r\n    expected = true;\r\n    key = \"booleantrue\";\r\n    jso_map_add_boolean(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_boolean() failed to add true.\");\r\n    assert_true(actual, \"jso_map_add_boolean() added the wrong true.\");\r\n    ds_map_delete(map, key);\r\n    \r\n    //jso_map_add_boolean() --- false\r\n    expected = false;\r\n    key = \"booleanfalse\";\r\n    jso_map_add_boolean(map, key, expected);\r\n    actual = jso_map_get(map, key)\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_boolean() failed to add false.\");\r\n    assert_false(actual, \"jso_map_add_boolean() added the wrong false.\");\r\n    ds_map_delete(map, key);\r\n    \r\n    //Cleanup\r\n    ds_map_destroy(map);\r\n}\r\n\r\n#define _test_jso_list_add\r\n{\r\n    /**\r\n    _test_jso_list_add(): Test jso_list_add_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    var expected, actual, list;\r\n    list = jso_new_list();\r\n    \r\n    //jso_list_add_real()\r\n    expected = pi;\r\n    jso_list_add_real(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_real() failed to add the number.\");\r\n    assert_equal(expected, actual, \"jso_list_add_real() added the wrong number.\");\r\n    ds_list_clear(list);\r\n    \r\n    //jso_list_add_string()\r\n    expected = \"waahoo\";\r\n    jso_list_add_string(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_string() failed to add the string.\");\r\n    assert_equal(expected, actual, \"jso_list_add_string() added the wrong string.\");\r\n    ds_list_clear(list);\r\n    \r\n    //jso_list_add_sublist()\r\n    expected = jso_new_list();\r\n    jso_list_add_sublist(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_sublist() failed to add the sublist.\");\r\n    assert_equal(expected, actual, \"jso_list_add_sublist() added the wrong sublist.\");\r\n    ds_list_clear(list);\r\n    ds_list_destroy(expected);\r\n    \r\n    //jso_list_add_submap()\r\n    expected = jso_new_map();\r\n    jso_list_add_submap(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_submap() failed to add the submap.\");\r\n    assert_equal(expected, actual, \"jso_list_add_submap() added the wrong submap.\");\r\n    ds_list_clear(list);\r\n    ds_map_destroy(expected);\r\n    \r\n    //jso_list_add_integer()\r\n    expected = 2345;\r\n    jso_list_add_integer(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_integer() failed to add integer.\");\r\n    assert_equal(expected, actual, \"jso_list_add_integer() added the wrong integer.\");\r\n    ds_list_clear(list);\r\n    \r\n    //jso_list_add_boolean() --- true\r\n    expected = true;\r\n    jso_list_add_boolean(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_boolean() failed to add boolean true.\");\r\n    assert_true(actual, \"jso_list_add_boolean() added the wrong boolean true.\");\r\n    ds_list_clear(list);\r\n    \r\n    //jso_list_add_boolean() --- false\r\n    expected = false;\r\n    jso_list_add_boolean(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_boolean() failed to add boolean false.\");\r\n    assert_false(actual, \"jso_list_add_boolean() added the wrong boolean false.\");\r\n    ds_list_clear(list);\r\n    \r\n    //Cleanup\r\n    ds_list_destroy(list);\r\n}\r\n\r\n#define _test_jso_encode\r\n{\r\n    /**\r\n    _test_jso_encode(): Tests jso_encode_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    var original, expected, actual;\r\n    \r\n    //jso_encode_real() --- Positive\r\n    expected = 3.1415;\r\n    actual = jso_encode_real(3.1415);\r\n    assert_equal(expected, real(actual), \"jso_encode_real() failed to encode positive real!\");\r\n    \r\n    //jso_encode_real() --- Negative\r\n    expected = -2.71828;\r\n    actual = jso_encode_real(-2.71828);\r\n    assert_equal(expected, real(actual), \"jso_encode_real() failed to encode negative real!\");\r\n    \r\n    //jso_encode_real() --- Zero\r\n    expected = 0;\r\n    actual = jso_encode_integer(0);\r\n    assert_equal(expected, real(actual), \"jso_encode_real() failed to encode zero!\");\r\n    \r\n    //jso_encode_integer() --- Positive\r\n    expected = \"2345\";\r\n    actual = jso_encode_integer(2345);\r\n    assert_equal(expected, actual, \"jso_encode_integer() failed to encode positive integer!\");\r\n    \r\n    //jso_encode_integer() --- Negative\r\n    expected = \"-45\";\r\n    actual = jso_encode_integer(-45);\r\n    assert_equal(expected, actual, \"jso_encode_integer() failed to encode negative integer!\");\r\n    \r\n    //jso_encode_integer() --- Zero\r\n    expected = \"0\";\r\n    actual = jso_encode_integer(0);\r\n    assert_equal(expected, actual, \"jso_encode_integer() failed to encode zero!\");\r\n    \r\n    //jso_encode_boolean() --- true\r\n    expected = \"true\";\r\n    actual = jso_encode_boolean(true);\r\n    assert_equal(expected, actual, \"jso_encode_boolean() failed to encode true!\");\r\n    \r\n    //jso_encode_boolean() --- false\r\n    expected = \"false\";\r\n    actual = jso_encode_boolean(false);\r\n    assert_equal(expected, actual, \"jso_encode_boolean() failed to encode false!\");\r\n    \r\n    //jso_encode_string() --- Simple string\r\n    expected = '\"waahoo\"';\r\n    actual = jso_encode_string(\"waahoo\");\r\n    assert_equal(expected, actual, \"jso_encode_string() failed to encode simple string!\");\r\n    \r\n    //jso_encode_string() --- Empty string\r\n    expected = '\"\"';\r\n    actual = jso_encode_string(\"\");\r\n    assert_equal(expected, actual, \"jso_encode_string() failed to encode empty string!\");\r\n    \r\n    //jso_encode_string() --- Basic escape characters\r\n    expected = '\"\\\\\\\"\\b\\f\\n\\r\\t\"';\r\n    actual = jso_encode_string('\\\"' + chr(8) + chr(12) + chr(10) + chr(13) + chr(9));\r\n    assert_equal(expected, actual, \"jso_encode_string() failed to encode escape character string!\");\r\n    \r\n    //jso_encode_map() --- Empty map\r\n    var empty_map;\r\n    empty_map = jso_new_map();\r\n    expected = \"{}\";\r\n    actual = jso_encode_map(empty_map);\r\n    assert_equal(expected, actual, \"jso_encode_map() failed to encode empty map!\");\r\n    jso_cleanup_map(empty_map);\r\n    \r\n    //jso_encode_map() --- One-element map\r\n    var one_map;\r\n    one_map = jso_new_map();\r\n    jso_map_add_string(one_map, \"key\", \"value\");\r\n    expected = '{\"key\":\"value\"}';\r\n    actual = jso_encode_map(one_map);\r\n    assert_equal(expected, actual, \"jso_encode_map() failed to encode one-element map!\");\r\n    jso_cleanup_map(one_map);\r\n    \r\n    //jso_encode_map() --- Multi-element map\r\n    var multi_map, ok1, ok2;\r\n    multi_map = jso_new_map();\r\n    jso_map_add_string(multi_map, \"key1\", \"value\\1\");\r\n    jso_map_add_integer(multi_map, \"key2\", 2);\r\n    ok1 = '{\"key1\":\"value\\\\1\",\"key2\":2}';\r\n    ok2 = '{\"key2\":2,\"key1\":\"value\\\\1\"}';\r\n    actual = jso_encode_map(multi_map);\r\n    assert_true((actual == ok1) || (actual == ok2), \"jso_encode_map() failed to encode multi-element map!\");\r\n    jso_cleanup_map(multi_map);\r\n    \r\n    //jso_encode_list() --- Empty list\r\n    var empty_list;\r\n    empty_list = jso_new_list();\r\n    expected = \"[]\";\r\n    actual = jso_encode_list(empty_list);\r\n    assert_equal(expected, actual, \"jso_encode_list() failed to encode empty list!\");\r\n    jso_cleanup_list(empty_list);\r\n    \r\n    //jso_encode_list() --- One-element nested list\r\n    var one_list;\r\n    one_list = jso_new_list();\r\n    jso_list_add_submap(one_list, jso_new_map());\r\n    expected = \"[{}]\";\r\n    actual = jso_encode_list(one_list);\r\n    assert_equal(expected, actual, \"jso_encode_list() failed to encode one-element nested list!\");\r\n    jso_cleanup_list(one_list);\r\n    \r\n    //jso_encode_list() --- Multi-element nested list\r\n    var multi_list, submap, sublist;\r\n    multi_list = jso_new_list();\r\n    submap = jso_new_map();\r\n        jso_map_add_string(submap, \"1\", \"one\");\r\n    jso_list_add_submap(multi_list, submap);\r\n    jso_list_add_integer(multi_list, 2);\r\n    sublist = jso_new_list();\r\n        jso_list_add_string(sublist, \"three\");\r\n        jso_list_add_boolean(sublist, true);\r\n    jso_list_add_sublist(multi_list, sublist);\r\n    expected = '[{\"1\":\"one\"},2,[\"three\",true]]';\r\n    actual = jso_encode_list(multi_list);\r\n    assert_equal(expected, actual, \"jso_encode_list() failed to encode one-element nested list!\");\r\n    jso_cleanup_list(multi_list);\r\n}\r\n\r\n#define _test_jso_decode\r\n{\r\n    /**\r\n    _test_jso_decode(): Test core _jso_decode_*() functions.\r\n    The formatting is intentionally erratic here to simulate actual formatting deviations.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var json, expected, actual, expected_structure, actual_structure;\r\n    \r\n    ////Primitives\r\n    \r\n    //_jso_decode_string(): Empty string\r\n    json = '\"\"';\r\n    expected = __jso_gmt_tuple(\"\", 3);\r\n    actual = _jso_decode_string(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_string() failed to decode an empty string!\");\r\n    \r\n    //_jso_decode_string(): Small string\r\n    json = '\"key\"  ';\r\n    expected = __jso_gmt_tuple(\"key\", 6);\r\n    actual = _jso_decode_string(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_string() failed to decode a small string!\");\r\n    \r\n    //_jso_decode_string(): Simple string\r\n    json = '  \"The quick brown fox jumps over the lazy dog.\" ';\r\n    expected = __jso_gmt_tuple(\"The quick brown fox jumps over the lazy dog.\", 49);\r\n    actual = _jso_decode_string(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_string() failed to decode a simple string!\");\r\n    \r\n    //_jso_decode_string(): Escape characters\r\n    json = ' \"\\\"\\\\\\b\\f\\n\\r\\t\\u003A\"';\r\n    expected = __jso_gmt_tuple('\"\\' + chr(8) + chr(12) + chr(10) + chr(13) + chr(9) + chr($003a), 24);\r\n    actual = _jso_decode_string(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_string() failed to decode a string with escape characters!\");\r\n    \r\n    //_jso_decode_string(): Mixed characters\r\n    json = ' \"\\\"\\\\\\bWaahoo\\f\\n\\r\\tnegg\\u003a\"';\r\n    expected = __jso_gmt_tuple('\"\\' + chr(8) + \"Waahoo\" + chr(12) + chr(10) + chr(13) + chr(9) + \"negg\" + chr($003a), 34);\r\n    actual = _jso_decode_string(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_string() failed to decode a string with mixed characters!\");\r\n    \r\n    //_jso_decode_boolean(): True\r\n    json = 'true';\r\n    expected = __jso_gmt_tuple(true, 5);\r\n    actual = _jso_decode_boolean(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_boolean() failed to decode true!\");\r\n    \r\n    //_jso_decode_boolean(): False\r\n    json = '  false  ';\r\n    expected = __jso_gmt_tuple(false, 8);\r\n    actual = _jso_decode_boolean(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_boolean() failed to decode false!\");\r\n    \r\n    //_jso_decode_real(): Zero\r\n    json = '0';\r\n    expected = __jso_gmt_tuple(0, 2);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode standard zero!\");\r\n    \r\n    //_jso_decode_real(): Signed zero\r\n    json = '  +0 ';\r\n    expected = __jso_gmt_tuple(0, 5);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode signed zero!\");\r\n    \r\n    //_jso_decode_real(): Signed zero with decimal digits\r\n    json = ' -0.000';\r\n    expected = __jso_gmt_tuple(0, 8);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode signed zero with decimal digits!\");\r\n    \r\n    //_jso_decode_real(): Positive real\r\n    json = '3.14159';\r\n    expected = __jso_gmt_tuple(3.14159, 8);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode positive real number!\");\r\n    \r\n    //_jso_decode_real(): Negative real\r\n    json = ' -2.71828';\r\n    expected = __jso_gmt_tuple(-2.71828, 10);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode negative real number!\");\r\n    \r\n    //_jso_decode_real(): Positive real with positive exponent\r\n    json = ' 3.14159e2';\r\n    expected = __jso_gmt_tuple(3.14159*100, 11);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode positive real number with positive exponent!\");\r\n    \r\n    //_jso_decode_real(): Negative real with positive exponent\r\n    json = ' -2.71828E2';\r\n    expected = __jso_gmt_tuple(-2.71828*100, 12);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode negative real number with positive exponent!\");\r\n    \r\n    //_jso_decode_real(): Positive real with negative exponent\r\n    json = ' 314.159e-2';\r\n    expected = __jso_gmt_tuple(3.14159, 12);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode positive real number with negative exponent!\");\r\n    \r\n    //_jso_decode_real(): Negative real with negative exponent\r\n    json = ' -271.828E-2';\r\n    expected = __jso_gmt_tuple(-2.71828, 13);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode negative real number with negative exponent!\");\r\n    \r\n    //_jso_decode_real(): Positive integer\r\n    json = ' +1729';\r\n    expected = __jso_gmt_tuple(1729, 7);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode positive integer!\");\r\n    \r\n    //_jso_decode_real(): Negative integer\r\n    json = '-583';\r\n    expected = __jso_gmt_tuple(-583, 5);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode negative integer!\");\r\n    \r\n    //_jso_decode_integer(): Zero\r\n    json = ' 0  ';\r\n    expected = __jso_gmt_tuple(0, 3);\r\n    actual = _jso_decode_integer(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_integer() failed to decode zero!\");\r\n    \r\n    //_jso_decode_integer(): Positive integer\r\n    json = ' 1729   ';\r\n    expected = __jso_gmt_tuple(1729, 6);\r\n    actual = _jso_decode_integer(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_integer() failed to decode positive integer!\");\r\n    \r\n    //_jso_decode_integer(): Negative integer\r\n    json = '   -583';\r\n    expected = __jso_gmt_tuple(-583, 8);\r\n    actual = _jso_decode_integer(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_integer() failed to decode negative integer!\");\r\n    \r\n    \r\n    ////Data structures\r\n    \r\n    //_jso_decode_map(): Empty map #1\r\n    json = '{}';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 3);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (#1)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (#1)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode an empty map! (#1)\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): Empty map #2\r\n    json = '  {  }  ';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 7);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (#2)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (#2)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode an empty map! (#2)\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): One-entry map\r\n    json = ' {\"key\": \"value\"} ';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 18);\r\n    jso_map_add_string(expected_structure, \"key\", \"value\");\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (one-entry map)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (one-entry map)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode a one-entry map!\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): Multi-entry map\r\n    json = ' {\"key\"  :  \"value\", \"pi\":3.14,  \"bool\" : true} ';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 48);\r\n    jso_map_add_string(expected_structure, \"key\", \"value\");\r\n    jso_map_add_real(expected_structure, \"pi\", 3.14);\r\n    jso_map_add_boolean(expected_structure, \"bool\", true);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (multi-entry map)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (multi-entry map)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode a multi-entry map!\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): Nested maps\r\n    var submap;\r\n    json = '{ \"waahoo\" : { \"woohah\" : 3 } , \"woohah\" : 4 }';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 47);\r\n    jso_map_add_integer(expected_structure, \"woohah\", 4);\r\n    submap = jso_new_map();\r\n    jso_map_add_integer(submap, \"woohah\", 3);\r\n    jso_map_add_submap(expected_structure, \"waahoo\", submap);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (nested map)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (nested map)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode a nested map!\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): Map with nested lists\r\n    var sublist, subsublist;\r\n    json = '{ \"waahoo\" : [ \"woohah\", [true] ] , \"woohah\" : 4 }';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 51);\r\n    jso_map_add_real(expected_structure, \"woohah\", 4);\r\n    sublist = jso_new_list();\r\n    jso_list_add_string(sublist, \"woohah\");\r\n    subsublist = jso_new_list();\r\n    jso_list_add_boolean(subsublist, true);\r\n    jso_list_add_sublist(sublist, subsublist);\r\n    jso_map_add_sublist(expected_structure, \"waahoo\", sublist);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (map with nested lists)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (map with nested lists)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode a map with nested lists!\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): Mix-up nested map\r\n    var sublist;\r\n    json = ' { \"waahoo\" : [{}, \"a\", 1]  }';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 30);\r\n    sublist = jso_new_list();\r\n    jso_list_add_submap(sublist, jso_new_map());\r\n    jso_list_add_string(sublist, \"a\");\r\n    jso_list_add_real(sublist, 1);\r\n    jso_map_add_sublist(expected_structure, \"waahoo\", sublist);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (mix-up nested map)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (mix-up nested map)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode a mix-up nested map!\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_list(): Empty list #1\r\n    json = '[]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 3);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (#1)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (#1)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode an empty list! (#1)\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure)\r\n    \r\n    //_jso_decode_list(): Empty list #2\r\n    json = ' [  ] ';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 6);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (#2)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (#2)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode an empty list! (#2)\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n    \r\n    //_jso_decode_list(): One-entry list\r\n    json = '[3]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 4);\r\n    jso_list_add_integer(expected_structure, 3);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (one-entry list)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (one-entry list)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode a one-entry list!\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n   \r\n    //_jso_decode_list(): Multi-entry list\r\n    json = ' [4,\"multi-entry\",true]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 24);\r\n    jso_list_add_real(expected_structure, 4);\r\n    jso_list_add_string(expected_structure, \"multi-entry\");\r\n    jso_list_add_boolean(expected_structure, true);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (multi-entry list)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (multi-entry list)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode a multi-entry list!\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n    \r\n    //_jso_decode_list(): Nested list\r\n    var sublist;\r\n    json = ' [ [], 3, false, [\"waahoo\"]]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 29);\r\n    jso_list_add_sublist(expected_structure, jso_new_list());\r\n    jso_list_add_integer(expected_structure, 3);\r\n    jso_list_add_boolean(expected_structure, false);\r\n    sublist = jso_new_list();\r\n    jso_list_add_string(sublist, \"waahoo\");\r\n    jso_list_add_sublist(expected_structure, sublist);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (nested list)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (nested list)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode a nested list!\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n    \r\n    //_jso_decode_list(): List with nested maps\r\n    var submap;\r\n    json = ' [3, false, { \"waahoo\":\"woo\"}]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 31);\r\n    jso_list_add_integer(expected_structure, 3);\r\n    jso_list_add_boolean(expected_structure, false);\r\n    submap = jso_new_map();\r\n    jso_map_add_string(submap, \"waahoo\", \"woo\");\r\n    jso_list_add_submap(expected_structure, submap);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (list with nested maps)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (list with nested maps)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode a list with nested maps!\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n    \r\n    //_jso_decode_list(): Mix-up nested list\r\n    var submap;\r\n    json = '[{}, {\"a\":[]}]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 15);\r\n    jso_list_add_submap(expected_structure, jso_new_map());\r\n    submap = jso_new_map();\r\n    jso_map_add_sublist(submap, \"a\", jso_new_list());\r\n    jso_list_add_submap(expected_structure, submap);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (mix-up nested list)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (mix-up nested list)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode a mix-up nested list!\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n}\r\n\r\n#define _test_jso_compare\r\n{\r\n    /**\r\n    _test_jso_compare(): Test basic jso_compare_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var a, b;\r\n    \r\n    //jso_compare_maps(): Empty maps should equal each other\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    assert_true(jso_compare_maps(a, b), \"Empty maps should equal each other. (#1)\");\r\n    assert_true(jso_compare_maps(b, a), \"Empty maps should equal each other. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_maps(): An empty map should not equal a filled map\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    jso_map_add_string(b, \"junk\", \"info\");\r\n    jso_map_add_integer(b, \"taxi\", 1729);\r\n    assert_false(jso_compare_maps(a, b), \"An empty map should not equal a filled map. (#1)\");\r\n    assert_false(jso_compare_maps(b, a), \"An empty map should not equal a filled map. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_maps(): Maps with same content entered in different orders should equal each other\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    jso_map_add_real(a, \"A\", 1);\r\n    jso_map_add_real(a, \"B\", 2);\r\n    jso_map_add_real(a, \"C\", 3);\r\n    jso_map_add_real(b, \"C\", 3);\r\n    jso_map_add_real(b, \"A\", 1);\r\n    jso_map_add_real(b, \"B\", 2);\r\n    assert_true(jso_compare_maps(a, b), \"Maps with same content entered in different orders should equal each other. (#1)\");\r\n    assert_true(jso_compare_maps(b, a), \"Maps with same content entered in different orders should equal each other. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_maps(): Maps with different keys should not equal each other\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    jso_map_add_real(a, \"A\", 1);\r\n    jso_map_add_real(a, \"B\", 2);\r\n    jso_map_add_real(a, \"C\", 3);\r\n    jso_map_add_real(b, \"D\", 3);\r\n    jso_map_add_real(b, \"A\", 1);\r\n    jso_map_add_real(b, \"B\", 2);\r\n    assert_false(jso_compare_maps(a, b), \"Maps with different keys should not equal each other. (#1)\");\r\n    assert_false(jso_compare_maps(b, a), \"Maps with different keys should not equal each other. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_maps(): Maps with different values should not equal each other\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    jso_map_add_real(a, \"A\", 5);\r\n    jso_map_add_real(a, \"B\", 6);\r\n    jso_map_add_real(a, \"C\", 9);\r\n    jso_map_add_real(b, \"A\", 5);\r\n    jso_map_add_real(b, \"B\", 6);\r\n    jso_map_add_real(b, \"C\", 8);\r\n    assert_false(jso_compare_maps(a, b), \"Maps with different values should not equal each other. (#1)\");\r\n    assert_false(jso_compare_maps(b, a), \"Maps with different values should not equal each other. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_maps(): Maps with corresponding values of different types should not equal each other, and should not crash.\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    jso_map_add_real(a, \"A\", 5);\r\n    jso_map_add_real(a, \"B\", 6);\r\n    jso_map_add_real(a, \"C\", 8);\r\n    jso_map_add_real(b, \"A\", 5);\r\n    jso_map_add_string(b, \"B\", \"six\");\r\n    jso_map_add_real(b, \"C\", 8);\r\n    assert_false(jso_compare_maps(a, b), \"Maps with corresponding values of different types should not equal each other, and should not crash. (#1)\");\r\n    assert_false(jso_compare_maps(b, a), \"Maps with corresponding values of different types should not equal each other, and should not crash. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_lists(): Empty lists should equal each other\r\n    a = jso_new_list();\r\n    b = jso_new_list();\r\n    assert_true(jso_compare_lists(a, b), \"Empty lists should equal each other. (#1)\");\r\n    assert_true(jso_compare_lists(b, a), \"Empty lists should equal each other. (#2)\");\r\n    jso_cleanup_list(a);\r\n    jso_cleanup_list(b);\r\n    \r\n    //jso_compare_lists(): An empty list should not equal a filled list\r\n    a = jso_new_list();\r\n    b = jso_new_list();\r\n    jso_list_add_string(b, \"junk\");\r\n    jso_list_add_integer(b, 1729);\r\n    assert_false(jso_compare_lists(a, b), \"An empty list should not equal a filled list. (#1)\");\r\n    assert_false(jso_compare_lists(b, a), \"An empty list should not equal a filled list. (#2)\");\r\n    jso_cleanup_list(a);\r\n    jso_cleanup_list(b);\r\n    \r\n    //jso_compare_lists(): Lists with same content entered in different orders should not equal each other\r\n    a = jso_new_list();\r\n    b = jso_new_list();\r\n    jso_list_add_real(a, 1);\r\n    jso_list_add_real(a, 2);\r\n    jso_list_add_real(a, 3);\r\n    jso_list_add_real(b, 3);\r\n    jso_list_add_real(b, 1);\r\n    jso_list_add_real(b, 2);\r\n    assert_false(jso_compare_lists(a, b), \"Lists with same content entered in different orders should not equal each other. (#1)\");\r\n    assert_false(jso_compare_lists(b, a), \"Lists with same content entered in different orders should not equal each other. (#2)\");\r\n    jso_cleanup_list(a);\r\n    jso_cleanup_list(b);\r\n    \r\n    //jso_compare_lists(): Lists with corresponding entries of different types should not equal each other, should also not crash.\r\n    a = jso_new_list();\r\n    b = jso_new_list();\r\n    jso_list_add_real(a, 1);\r\n    jso_list_add_real(a, 2);\r\n    jso_list_add_real(a, 3);\r\n    jso_list_add_real(b, 1);\r\n    jso_list_add_string(b, \"two\");\r\n    jso_list_add_real(b, 3);\r\n    assert_false(jso_compare_lists(a, b), \"Lists with corresponding entries of different types should not equal each other, should also not crash. (#1)\");\r\n    assert_false(jso_compare_lists(b, a), \"Lists with corresponding entries of different types should not equal each other, should also not crash. (#2)\");\r\n    jso_cleanup_list(a);\r\n    jso_cleanup_list(b);\r\n}\r\n\r\n#define _test_jso_lookup\r\n{\r\n    /**\r\n    _test_jso_lookup(): Test core jso_*_lookup() and jso_*_check() functions for nested structures.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var json, structure, expected, actual;\r\n    \r\n    //jso_map_check(): Single argument --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3 }';\r\n    structure = jso_decode_map(json);\r\n    assert_true(jso_map_check(structure, \"one\"), \"jso_map_check() failed to find existing entry! (single argument)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup(): Single argument --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3 }';\r\n    structure = jso_decode_map(json);\r\n    expected = 1;\r\n    actual = jso_map_lookup(structure, \"one\")\r\n    assert_equal(expected, actual, \"jso_map_lookup() found the wrong entry! (single argument)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup_type(): Single argument --- exists\r\n    json = '{ \"one\" : -1, \"two\" : true, \"three\" : \"trap\" }';\r\n    structure = jso_decode_map(json);\r\n    expected = jso_type_real;\r\n    actual = jso_map_lookup_type(structure, \"one\")\r\n    assert_equal(expected, actual, \"jso_map_lookup_type() found the wrong type! (single argument)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Single argument --- doesn't exist\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3 }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"four\"), \"jso_map_check() found an inexistent entry! (single argument)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Single argument --- doesn't exist\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":false } }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"A\"), \"jso_map_check() found an inexistent entry! (single argument, nested)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments (recurse) --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":false } }';\r\n    structure = jso_decode_map(json);\r\n    assert_true(jso_map_check(structure, \"four\", \"A\"), \"jso_map_check() failed to find existing entry! (multiple arguments)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup(): Multiple arguments (recurse) --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":false } }';\r\n    structure = jso_decode_map(json);\r\n    expected = true;\r\n    actual = jso_map_lookup(structure, \"four\", \"A\");\r\n    assert_equal(expected, actual, \"jso_map_lookup() found the wrong entry! (multiple arguments)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup_type(): Multiple arguments (recurse) --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":\"trap\" } }';\r\n    structure = jso_decode_map(json);\r\n    expected = jso_type_boolean;\r\n    actual = jso_map_lookup_type(structure, \"four\", \"A\");\r\n    assert_equal(expected, actual, \"jso_map_lookup_type() found the wrong type! (multiple arguments)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments (recurse) --- doesn't exist\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":false } }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"four\", \"C\"), \"jso_map_check() found an inexistent entry! (multiple arguments, 1)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments (recurse) --- doesn't exist\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":false } }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"three\", \"\"), \"jso_map_check() found an inexistent entry! (multiple arguments, 2)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments with nested list --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : [ \"A\", true, [\"B\", false] ] }';\r\n    structure = jso_decode_map(json);\r\n    assert_true(jso_map_check(structure, \"four\", 2, 1), \"jso_map_check() failed to find an existing entry! (multiple arguments, nested)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup(): Multiple arguments with nested list --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : [ \"A\", true, [\"B\", false] ] }';\r\n    structure = jso_decode_map(json);\r\n    expected = false;\r\n    actual = jso_map_lookup(structure, \"four\", 2, 1);\r\n    assert_equal(expected, actual, \"jso_map_lookup() failed to find an existing entry! (multiple arguments, nested)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup_type(): Multiple arguments with nested list --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : [ \"A\", true, [false, \"false\"] ] }';\r\n    structure = jso_decode_map(json);\r\n    expected = jso_type_string;\r\n    actual = jso_map_lookup_type(structure, \"four\", 2, 1);\r\n    assert_equal(expected, actual, \"jso_map_lookup_type() found the wrong type! (multiple arguments, nested)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments with nested list --- wrong type\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : [ \"A\", true, [\"B\", false] ] }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"four\", \"A\", 1), \"jso_map_check() found an inexistent entry! (multiple arguments, nested, wrong type)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments with nested list --- index overflow\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : [ \"A\", true, [\"B\", false] ] }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"four\", 2, 3), \"jso_map_check() found an inexistent entry! (multiple arguments, nested, index overflow)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_list_check(): Single argument --- exists\r\n    json = '[\"one\", 2, \"three\", true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_true(jso_list_check(structure, 2), \"jso_list_check() failed to find an existing index! (single argument)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup(): Single argument --- exists\r\n    json = '[\"one\", 2, \"three\", true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = \"three\";\r\n    actual = jso_list_lookup(structure, 2);\r\n    assert_equal(expected, actual, \"jso_list_lookup() found the wrong index! (single argument)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup_type(): Single argument --- exists\r\n    json = '[\"one\", 2, \"three\", true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = jso_type_string;\r\n    actual = jso_list_lookup_type(structure, 2);\r\n    assert_equal(expected, actual, \"jso_list_lookup_type() found the wrong type! (single argument)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_check(): Single argument --- doesn't exist\r\n    json = '[\"one\", 2, \"three\", true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_false(jso_list_check(structure, 5), \"jso_list_check() found an inexistent index! (single argument)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_check(): Multiple arguments (recurse) --- exists\r\n    json = '[\"one\", 2, [\"three\", 3], true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_true(jso_list_check(structure, 2, 1), \"jso_list_check() failed to find an existing index! (multiple arguments)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup(): Multiple arguments (recurse) --- exists\r\n    json = '[\"one\", 2, [\"three\", 3], true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = 3;\r\n    actual = jso_list_lookup(structure, 2, 1);\r\n    assert_equal(expected, actual, \"jso_list_lookup() failed to find an existing index! (multiple arguments)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup_type(): Multiple arguments (recurse) --- exists\r\n    json = '[\"one\", 2, [\"three\", 3], true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = jso_type_real;\r\n    actual = jso_list_lookup_type(structure, 2, 1);\r\n    assert_equal(expected, actual, \"jso_list_lookup_type() found the wrong type! (multiple arguments)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_check(): Multiple arguments (recurse) --- doesn't exist, inner index overflow\r\n    json = '[\"one\", 2, [\"three\", 3], true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_false(jso_list_check(structure, 2, 2), \"jso_list_check() found an inexistent index! (multiple arguments, inner index overflow)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_check(): Multiple arguments (recurse) --- doesn't exist, trying to index single entry\r\n    json = '[\"one\", 2, [\"three\", 3], true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_false(jso_list_check(structure, 1, 0), \"jso_list_check() found an inexistent index! (multiple arguments, indexing single entry)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_check(): Multiple arguments with nested map --- exists\r\n    json = '[\"one\", 2, {\"three\":3}, true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_true(jso_list_check(structure, 2, \"three\"), \"jso_list_check() failed to find an existing entry! (multiple arguments, nested map)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup(): Multiple arguments with nested map --- exists\r\n    json = '[\"one\", 2, {\"three\":3}, true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = 3;\r\n    actual = jso_list_lookup(structure, 2, \"three\");\r\n    assert_equal(expected, actual, \"jso_list_lookup() failed to find an existing entry! (multiple arguments, nested map)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup_type(): Multiple arguments with nested map --- exists\r\n    json = '[\"one\", 2, {\"three\":false}, true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = jso_type_boolean;\r\n    actual = jso_list_lookup_type(structure, 2, \"three\");\r\n    assert_equal(expected, actual, \"jso_list_lookup_type() found the wrong type! (multiple arguments, nested map)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_exists(): Multiple arguments with nested map --- doesn't exist, key on single entry\r\n    json = '[\"one\", 2, {\"three\":3}, true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_false(jso_list_check(structure, 1, \"\"), \"jso_list_check() found an inexistent entry! (multiple arguments, nested map, key on single entry)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_exists(): Multiple arguments with nested map --- doesn't exist, bad key\r\n    json = '[\"one\", 2, {\"three\":3}, true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_false(jso_list_check(structure, 2, \"\"), \"jso_list_check() found an inexistent entry! (multiple arguments, nested map, bad key)\");\r\n    jso_cleanup_list(structure);\r\n}\r\n\r\n#define _test_jso_bugs\r\n{\r\n    /**\r\n    _test_jso_bugs(): Test reported bugs.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var expected, actual;\r\n    \r\n    //jso_encode_map() --- One-element map\r\n    //Bug 1: Crash when encoding boolean-valued entries in maps, unknown variable jso_type_integer\r\n    var one_map;\r\n    one_map = jso_new_map();\r\n    jso_map_add_boolean(one_map, \"true\", true);\r\n    expected = '{\"true\":true}';\r\n    actual = jso_encode_map(one_map);\r\n    assert_equal(expected, actual, \"jso_encode_map() failed to encode one-element map with boolean entry!\");\r\n    jso_cleanup_map(one_map);\r\n}\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Game Maker Language/scrInitLevel.gml",
    "content": "// Originally from /spelunky/Scripts/Level Generation/scrInitLevel.gml in the Spelunky Community Update Project\n\n//\n// scrInitLevel()\n//\n// Calls scrLevelGen(), scrRoomGen*(), and scrEntityGen() to build level.\n//\n\n/**********************************************************************************\n    Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC\n    \n    This file is part of Spelunky.\n\n    You can redistribute and/or modify Spelunky, including its source code, under\n    the terms of the Spelunky User License.\n\n    Spelunky is distributed in the hope that it will be entertaining and useful,\n    but WITHOUT WARRANTY.  Please see the Spelunky User License for more details.\n\n    The Spelunky User License should be available in \"Game Information\", which\n    can be found in the Resource Explorer, or as an external file called COPYING.\n    If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>\n    \n***********************************************************************************/\n\nglobal.levelType = 0;\n//global.currLevel = 16;\nif (global.currLevel > 4 and global.currLevel < 9) global.levelType = 1;\nif (global.currLevel > 8 and global.currLevel < 13) global.levelType = 2;\nif (global.currLevel > 12 and global.currLevel < 16) global.levelType = 3;\nif (global.currLevel == 16) global.levelType = 4;\n\nif (global.currLevel <= 1 or\n    global.currLevel == 5 or\n    global.currLevel == 9 or\n    global.currLevel == 13)\n{\n    global.hadDarkLevel = false;\n}\n\n// global.levelType = 3; // debug\n\n// DEBUG MODE //\n/*\nif (global.currLevel == 2) global.levelType = 4;\nif (global.currLevel == 3) global.levelType = 2;\nif (global.currLevel == 4) global.levelType = 3;\nif (global.currLevel == 5) global.levelType = 4;\n*/\n\n// global.levelType = 0;\n\nglobal.startRoomX = 0;\nglobal.startRoomY = 0;\nglobal.endRoomX = 0;\nglobal.endRoomY = 0;\noGame.levelGen = false;\n\n// this is used to determine the path to the exit (generally no bombs required)\nfor (i = 0; i < 4; i += 1)\n{\n    for (j = 0; j < 4; j += 1)\n    {\n        global.roomPath[i,j] = 0;\n    }\n}\n\n// side walls\nif (global.levelType == 4)\n    k = 54;\nelse if (global.levelType == 2)\n    k = 38;\nelse if (global.lake)\n    k = 41;\nelse\n    k = 33;\nfor (i = 0; i <= 42; i += 1)\n{\n    for (j = 0; j <= k; j += 1)\n    {\n        if (not isLevel())\n        {\n            i = 999;\n            j = 999;\n        }\n        else if (global.levelType == 2)\n        {\n            if (i*16 == 0 or\n                i*16 == 656 or\n                j*16 == 0)\n            {\n                obj = instance_create(i*16, j*16, oDark);\n                obj.invincible = true;\n                obj.sprite_index = sDark;\n            }\n        }\n        else if (global.levelType == 4)\n        {\n            if (i*16 == 0 or\n                i*16 == 656 or\n                j*16 == 0)\n            {\n                obj = instance_create(i*16, j*16, oTemple);\n                obj.invincible = true;\n                if (not global.cityOfGold) obj.sprite_index = sTemple;\n            }\n        }\n        else if (global.lake)\n        {\n            if (i*16 == 0 or\n                i*16 == 656 or\n                j*16 == 0 or\n                j*16 >= 656)\n            {\n                obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush;\n                obj.invincible = true;\n            }\n        }\n        else if (i*16 == 0 or\n            i*16 == 656 or\n            j*16 == 0 or\n            j*16 >= 528)\n        {\n            if (global.levelType == 0) { obj = instance_create(i*16, j*16, oBrick); obj.sprite_index = sBrick; }\n            else if (global.levelType == 1) { obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush; }\n            else { obj = instance_create(i*16, j*16, oTemple); if (not global.cityOfGold) obj.sprite_index = sTemple; }\n            obj.invincible = true;\n        }\n    }\n}\n\nif (global.levelType == 2)\n{\n    for (i = 0; i <= 42; i += 1)\n    {\n        instance_create(i*16, 40*16, oDark);\n        //instance_create(i*16, 35*16, oSpikes);\n    }\n}\n\nif (global.levelType == 3)\n{\n    background_index = bgTemple;\n}\n\nglobal.temp1 = global.gameStart;\nscrLevelGen();\n\nglobal.cemetary = false;\nif (global.levelType == 1 and rand(1,global.probCemetary) == 1) global.cemetary = true;\n\nwith oRoom\n{\n    if (global.levelType == 0) scrRoomGen();\n    else if (global.levelType == 1)\n    {\n        if (global.blackMarket) scrRoomGenMarket();\n        else scrRoomGen2();\n    }\n    else if (global.levelType == 2)\n    {\n        if (global.yetiLair) scrRoomGenYeti();\n        else scrRoomGen3();\n    }\n    else if (global.levelType == 3) scrRoomGen4();\n    else scrRoomGen5();\n}\n\nglobal.darkLevel = false;\n//if (not global.hadDarkLevel and global.currLevel != 0 and global.levelType != 2 and global.currLevel != 16 and rand(1,1) == 1)\nif (not global.hadDarkLevel and not global.noDarkLevel and global.currLevel != 0 and global.currLevel != 1 and global.levelType != 2 and global.currLevel != 16 and rand(1,global.probDarkLevel) == 1)\n{\n    global.darkLevel = true;\n    global.hadDarkLevel = true;\n    //instance_create(oPlayer1.x, oPlayer1.y, oFlare);\n}\n\nif (global.blackMarket) global.darkLevel = false;\n\nglobal.genUdjatEye = false;\nif (not global.madeUdjatEye)\n{\n    if (global.currLevel == 2 and rand(1,3) == 1) global.genUdjatEye = true;\n    else if (global.currLevel == 3 and rand(1,2) == 1) global.genUdjatEye = true;\n    else if (global.currLevel == 4) global.genUdjatEye = true;\n}\n\nglobal.genMarketEntrance = false;\nif (not global.madeMarketEntrance)\n{\n    if (global.currLevel == 5 and rand(1,3) == 1) global.genMarketEntrance = true;\n    else if (global.currLevel == 6 and rand(1,2) == 1) global.genMarketEntrance = true;\n    else if (global.currLevel == 7) global.genMarketEntrance = true;\n}\n\n////////////////////////////\n// ENTITY / TREASURES\n////////////////////////////\nglobal.temp2 = global.gameStart;\nif (not isRoom(\"rTutorial\") and not isRoom(\"rLoadLevel\")) scrEntityGen();\n\nif (instance_exists(oEntrance) and not global.customLevel)\n{\n    oPlayer1.x = oEntrance.x+8;\n    oPlayer1.y = oEntrance.y+8;\n}\n\nif (global.darkLevel or\n    global.blackMarket or\n    global.snakePit or\n    global.cemetary or\n    global.lake or\n    global.yetiLair or\n    global.alienCraft or\n    global.sacrificePit or\n    global.cityOfGold)\n{\n    if (not isRoom(\"rLoadLevel\"))\n    {\n        with oPlayer1 { alarm[0] = 10; }\n    }\n}\n\nif (global.levelType == 4) scrSetupWalls(864);\nelse if (global.lake) scrSetupWalls(656);\nelse scrSetupWalls(528);\n\n// add background details\nif (global.graphicsHigh)\n{\n    repeat(20)\n    {\n        // bg = instance_create(16*rand(1,42), 16*rand(1,33), oCaveBG);\n        if (global.levelType == 1 and rand(1,3) < 3)\n            tile_add(bgExtrasLush, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);\n        else if (global.levelType == 2 and rand(1,3) < 3)\n            tile_add(bgExtrasIce, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);\n        else if (global.levelType == 3 and rand(1,3) < 3)\n            tile_add(bgExtrasTemple, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);\n        else\n            tile_add(bgExtras, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);\n    }\n}\n\noGame.levelGen = true;\n\n// generate angry shopkeeper at exit if murderer or thief\nif ((global.murderer or global.thiefLevel > 0) and isRealLevel())\n{\n    with oExit\n    {\n        if (type == \"Exit\")\n        {\n            obj = instance_create(x, y, oShopkeeper);\n            obj.status = 4;\n        }\n    }\n    // global.thiefLevel -= 1;\n}\n\nwith oTreasure\n{\n    if (collision_point(x, y, oSolid, 0, 0))\n    {\n        obj = instance_place(x, y, oSolid);\n        if (obj.invincible) instance_destroy();\n    }\n}\n\nwith oWater\n{\n    if (sprite_index == sWaterTop or sprite_index == sLavaTop)\n    {\n        scrCheckWaterTop();\n    }\n    /*\n        obj = instance_place(x-16, y, oWater);\n        if (instance_exists(obj))\n        {\n            if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop)\n            {\n                if (type == \"Lava\") sprite_index = sLavaTop;\n                else sprite_index = sWaterTop;\n            }\n        }\n        obj = instance_place(x+16, y, oWater);\n        if (instance_exists(obj))\n        {\n            if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop)\n            {\n                if (type == \"Lava\") sprite_index = sLavaTop;\n                else sprite_index = sWaterTop;\n            }\n        }\n    */\n}\n\nglobal.temp3 = global.gameStart;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Genie/Class.gs",
    "content": "init\n\tnew Demo( \"Demonstration class\" ).run()\n\nclass Demo\n\t_message:string = \"\"\n\n\tconstruct ( message:string = \"Optional argument - no message passed in constructor\" )\n\t\t_message = message\n\n\tdef run()\n\t\tprint( _message )\n\t\t\n"
  },
  {
    "path": "src/test/resources/samples/langs/Genie/Hello.gs",
    "content": "init\n\tprint( \"Hello, World!\" )\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/FelinaePurr-B.Cu.gbl",
    "content": "G04 #@! TF.FileFunction,Copper,L2,Bot,Signal*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11C,0.175000*%\n%ADD12R,1.727200X2.032000*%\n%ADD13O,1.727200X2.032000*%\n%ADD14R,2.032000X1.727200*%\n%ADD15O,2.032000X1.727200*%\n%ADD16C,1.300000*%\n%ADD17C,2.800000*%\n%ADD18C,0.685800*%\n%ADD19C,0.800000*%\n%ADD20C,0.400000*%\n%ADD21C,0.800000*%\n%ADD22C,0.300000*%\n%ADD23C,0.500000*%\n%ADD24C,0.180000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX162816666Y-95670833D02*\nX162883333Y-95637500D01*\nX163016666Y-95637500D01*\nX163083333Y-95670833D01*\nX163150000Y-95737500D01*\nX163183333Y-95804166D01*\nX163183333Y-95937500D01*\nX163150000Y-96004166D01*\nX163083333Y-96070833D01*\nX163016666Y-96104166D01*\nX162883333Y-96104166D01*\nX162816666Y-96070833D01*\nX162950000Y-95404166D02*\nX163116666Y-95437500D01*\nX163283333Y-95537500D01*\nX163383333Y-95704166D01*\nX163416666Y-95870833D01*\nX157450000Y-95870833D01*\nX157483333Y-95837500D01*\nX157550000Y-95804166D01*\nX156816666Y-95504166D02*\nX156950000Y-95504166D01*\nX157016666Y-95537500D01*\nX157050000Y-95570833D01*\nX157116666Y-95670833D01*\nX157150000Y-95804166D01*\nX157150000Y-96070833D01*\nX157116666Y-96137500D01*\nX157083333Y-96170833D01*\nX157016666Y-96204166D01*\nX156883333Y-96204166D01*\nX156816666Y-96170833D01*\nX156783333Y-96137500D01*\nX156750000Y-96070833D01*\nX156750000Y-95904166D01*\nX156783333Y-95837500D01*\nX156816666Y-95804166D01*\nX156883333Y-95770833D01*\nX157016666Y-95770833D01*\nX157083333Y-95804166D01*\nX157116666Y-95837500D01*\nX157150000Y-95904166D01*\nX156450000Y-95937500D02*\nX155916666Y-95937500D01*\nX155616666Y-96170833D02*\nX155516666Y-96204166D01*\nX155350000Y-96204166D01*\nX155283333Y-96170833D01*\nX155250000Y-96137500D01*\nX155216666Y-96070833D01*\nX155216666Y-96004166D01*\nX155250000Y-95937500D01*\nX155283333Y-95904166D01*\nX155350000Y-95870833D01*\nX155483333Y-95837500D01*\nX155550000Y-95804166D01*\nX155583333Y-95770833D01*\nX155616666Y-95704166D01*\nX155616666Y-95637500D01*\nX155583333Y-95570833D01*\nX155550000Y-95537500D01*\nX155483333Y-95504166D01*\nX155316666Y-95504166D01*\nX155216666Y-95537500D01*\nX155016666Y-95737500D02*\nX154750000Y-95737500D01*\nX154916666Y-95504166D02*\nX154916666Y-96104166D01*\nX154883333Y-96170833D01*\nX154816666Y-96204166D01*\nX154750000Y-96204166D01*\nX154216666Y-95737500D02*\nX154216666Y-96204166D01*\nX154516666Y-95737500D02*\nX154516666Y-96104166D01*\nX154483333Y-96170833D01*\nX154416666Y-96204166D01*\nX154316666Y-96204166D01*\nX154250000Y-96170833D01*\nX154216666Y-96137500D01*\nX153583333Y-96204166D02*\nX153583333Y-95504166D01*\nX153583333Y-96170833D02*\nX153650000Y-96204166D01*\nX153783333Y-96204166D01*\nX156883333Y-96795833D01*\nX156850000Y-96762500D01*\nX156883333Y-96729166D01*\nX156883333Y-96795833D01*\nX156450000Y-97429166D02*\nX156516666Y-97395833D01*\nX156550000Y-97329166D01*\nX156550000Y-96729166D01*\nX156183333Y-96962500D02*\nX155650000Y-97162500D01*\nX156183333Y-97362500D01*\nX154883333Y-96729166D02*\nX154483333Y-96729166D01*\nX154683333Y-97429166D02*\nX154683333Y-96729166D01*\nX154250000Y-97429166D02*\nX154250000Y-96962500D01*\nX154250000Y-97095833D02*\nX154216666Y-97029166D01*\nX154183333Y-96995833D01*\nX154116666Y-96962500D01*\nX154050000Y-96962500D01*\nX153516666Y-97429166D02*\nX153516666Y-97062500D01*\nX153550000Y-96995833D01*\nX153616666Y-96962500D01*\nX153750000Y-96962500D01*\nX153816666Y-96995833D01*\nX153516666Y-97395833D02*\nX153583333Y-97429166D01*\nX153750000Y-97429166D01*\nX153816666Y-97395833D01*\nX153850000Y-97329166D01*\nX153850000Y-97262500D01*\nX153816666Y-97195833D01*\nX153750000Y-97162500D01*\nX153583333Y-97162500D01*\nX153516666Y-97129166D01*\nX153183333Y-96962500D02*\nX153183333Y-97662500D01*\nX153183333Y-96995833D02*\nX153116666Y-96962500D01*\nX152983333Y-96962500D01*\nX152916666Y-96995833D01*\nX152883333Y-97029166D01*\nX152850000Y-97095833D01*\nX152850000Y-97295833D01*\nX152883333Y-97362500D01*\nX152916666Y-97395833D01*\nX152983333Y-97429166D01*\nX153116666Y-97429166D01*\nX153183333Y-97395833D01*\nX152550000Y-97429166D02*\nX152550000Y-96962500D01*\nX152550000Y-96729166D02*\nX152583333Y-96762500D01*\nX152550000Y-96795833D01*\nX152516666Y-96762500D01*\nX152550000Y-96729166D01*\nX152550000Y-96795833D01*\nX151950000Y-97395833D02*\nX152016666Y-97429166D01*\nX152150000Y-97429166D01*\nX152216666Y-97395833D01*\nX152250000Y-97329166D01*\nX152250000Y-97062500D01*\nX152216666Y-96995833D01*\nX152150000Y-96962500D01*\nX152016666Y-96962500D01*\nX151950000Y-96995833D01*\nX151916666Y-97062500D01*\nX151916666Y-97129166D01*\nX152250000Y-97195833D01*\nX151616666Y-97429166D02*\nX151616666Y-96962500D01*\nX151616666Y-97095833D02*\nX151583333Y-97029166D01*\nX151550000Y-96995833D01*\nX151483333Y-96962500D01*\nX151416666Y-96962500D01*\nD12*\nX175640000Y-81600000D03*\nD13*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD14*\nX184000000Y-86460000D03*\nD15*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD16*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD17*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD18*\nX173700000Y-89200000D03*\nX162300004Y-87000000D03*\nX159600000Y-82700000D03*\nX161700000Y-94600000D03*\nX176200000Y-96600000D03*\nX179600000Y-91700000D03*\nX158100000Y-83900000D03*\nX168600000Y-89399998D03*\nX167200000Y-85000000D03*\nX159600000Y-81100000D03*\nX163800000Y-81100000D03*\nD19*\nX159300000Y-87400000D03*\nX167300000Y-96600000D03*\nX167300000Y-94500000D03*\nX160900000Y-87400000D03*\nD18*\nX174900000Y-90299999D03*\nX174900000Y-85300000D03*\nD19*\nX166500002Y-90900000D03*\nX177200000Y-90200000D03*\nX168000000Y-87400000D03*\nX173800000Y-87400000D03*\nD18*\nX154500000Y-89792900D03*\nX154500000Y-88907100D03*\nD20*\nX167200000Y-87999998D02*\nX168257101Y-89057099D01*\nX167200000Y-85000000D02*\nX167200000Y-87999998D01*\nX168257101Y-89057099D02*\nX168600000Y-89399998D01*\nD21*\nX163800000Y-81100000D02*\nX159600000Y-81100000D01*\nD22*\nX159300000Y-87965685D02*\nX159300000Y-87400000D01*\nX159300000Y-88600000D02*\nX159300000Y-87965685D01*\nX167300000Y-96600000D02*\nX159300000Y-88600000D01*\nX167300000Y-94500000D02*\nX160900000Y-88100000D01*\nX160900000Y-88100000D02*\nX160900000Y-87400000D01*\nD23*\nX174900000Y-85300000D02*\nX174900000Y-90299999D01*\nD22*\nX177200000Y-90200000D02*\nX175300000Y-92100000D01*\nX175300000Y-92100000D02*\nX167700002Y-92100000D01*\nX167700002Y-92100000D02*\nX166500002Y-90900000D01*\nX173800000Y-87400000D02*\nX168000000Y-87400000D01*\nX154500000Y-88907100D02*\nX154342900Y-88907100D01*\nX154342900Y-88907100D02*\nX152900000Y-90350000D01*\nD24*\nG36*\nX159316814Y-80416329D02*\nX159076741Y-80576741D01*\nX158916329Y-80816814D01*\nX158860000Y-81100000D01*\nX158916329Y-81383186D01*\nX159076741Y-81623259D01*\nX159316814Y-81783671D01*\nX159600000Y-81840000D01*\nX163800000Y-81840000D01*\nX164083186Y-81783671D01*\nX176823872Y-82748661D01*\nX176850260Y-82616000D01*\nX176850260Y-82265373D01*\nX151860838Y-81760869D01*\nX151114549Y-81487287D01*\nX150320374Y-81520123D01*\nX149739162Y-81760869D01*\nX149586248Y-82054317D01*\nX148415000Y-82054317D01*\nX148415000Y-81040874D01*\nX148467041Y-80779242D01*\nX148592092Y-80592091D01*\nX148779241Y-80467042D01*\nX149040874Y-80415000D01*\nX159323495Y-80415000D01*\nX159316814Y-80416329D01*\nX159316814Y-80416329D01*\nG37*\nX159316814Y-80416329D02*\nX159076741Y-80576741D01*\nX158916329Y-80816814D01*\nX158860000Y-81100000D01*\nX158916329Y-81383186D01*\nX159076741Y-81623259D01*\nX159323495Y-80415000D01*\nX159316814Y-80416329D01*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/FelinaePurr-B.Mask.gbs",
    "content": "G04 #@! TF.FileFunction,Soldermask,Bot*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11R,1.727200X2.032000*%\n%ADD12O,1.727200X2.032000*%\n%ADD13R,2.032000X1.727200*%\n%ADD14O,2.032000X1.727200*%\n%ADD15C,1.300000*%\n%ADD16C,2.800000*%\n%ADD17C,1.200000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX175640000Y-81600000D03*\nD12*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD13*\nX184000000Y-86460000D03*\nD14*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD15*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD16*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD17*\nX150800000Y-87100000D03*\nX150800000Y-91600000D03*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/FelinaePurr-B.SilkS.gbo",
    "content": "G04 #@! TF.FileFunction,Legend,Bot*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11C,0.175000*%\n%ADD12C,0.375000*%\n%ADD13C,0.254000*%\n%ADD14R,1.727200X2.032000*%\n%ADD15O,1.727200X2.032000*%\n%ADD16R,2.032000X1.727200*%\n%ADD17O,2.032000X1.727200*%\n%ADD18C,1.300000*%\n%ADD19C,2.800000*%\n%ADD20C,1.200000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX164233333Y-82450000D02*\nX164133333Y-82483333D01*\nX164100000Y-82516666D01*\nX164066666Y-82583333D01*\nX164066666Y-82683333D01*\nX164100000Y-82750000D01*\nX164133333Y-82783333D01*\nX164200000Y-82816666D01*\nX164466666Y-82816666D01*\nX164466666Y-82116666D01*\nX164233333Y-82116666D01*\nX164166666Y-82150000D01*\nX164133333Y-82183333D01*\nX164100000Y-82250000D01*\nX164100000Y-82316666D01*\nX164133333Y-82383333D01*\nX164166666Y-82416666D01*\nX164233333Y-82450000D01*\nX164466666Y-82450000D01*\nX163666666Y-82816666D02*\nX163733333Y-82783333D01*\nX163766666Y-82750000D01*\nX163800000Y-82683333D01*\nX163800000Y-82483333D01*\nX163766666Y-82416666D01*\nX163733333Y-82383333D01*\nX163666666Y-82350000D01*\nX163566666Y-82350000D01*\nX163500000Y-82383333D01*\nX163466666Y-82416666D01*\nX163433333Y-82483333D01*\nX163433333Y-82683333D01*\nX163466666Y-82750000D01*\nX163500000Y-82783333D01*\nX163566666Y-82816666D01*\nX163666666Y-82816666D01*\nX162833333Y-82816666D02*\nX162833333Y-82450000D01*\nX162866666Y-82383333D01*\nX162933333Y-82350000D01*\nX163066666Y-82350000D01*\nX163133333Y-82383333D01*\nX162833333Y-82783333D02*\nX162900000Y-82816666D01*\nX163066666Y-82816666D01*\nX163133333Y-82783333D01*\nX163166666Y-82716666D01*\nX163166666Y-82650000D01*\nX163133333Y-82583333D01*\nX163066666Y-82550000D01*\nX162900000Y-82550000D01*\nX162833333Y-82516666D01*\nX162500000Y-82816666D02*\nX162500000Y-82350000D01*\nX162500000Y-82483333D02*\nX162466666Y-82416666D01*\nX162433333Y-82383333D01*\nX162366666Y-82350000D01*\nX162300000Y-82350000D01*\nX161766666Y-82816666D02*\nX161766666Y-82116666D01*\nX161766666Y-82783333D02*\nX161833333Y-82816666D01*\nX161966666Y-82816666D01*\nX162033333Y-82783333D01*\nX162066666Y-82750000D01*\nX162100000Y-82683333D01*\nX162100000Y-82483333D01*\nX162066666Y-82416666D01*\nX162033333Y-82383333D01*\nX161966666Y-82350000D01*\nX161833333Y-82350000D01*\nX161766666Y-82383333D01*\nX160933333Y-82350000D02*\nX160433333Y-82350000D01*\nX160733333Y-82050000D02*\nX160933333Y-82950000D01*\nX160500000Y-82650000D02*\nX161000000Y-82650000D01*\nX160700000Y-82950000D02*\nX160500000Y-82050000D01*\nD12*\nX181899107Y-86482142D02*\nX180756250Y-86482142D01*\nX181327678Y-87053571D02*\nX181327678Y-85910714D01*\nX179327678Y-85553571D02*\nX180041964Y-85553571D01*\nX180113392Y-86267857D01*\nX180041964Y-86196428D01*\nX179899107Y-86125000D01*\nX179541964Y-86125000D01*\nX179399107Y-86196428D01*\nX179327678Y-86267857D01*\nX179256250Y-86410714D01*\nX179256250Y-86767857D01*\nX179327678Y-86910714D01*\nX179399107Y-86982142D01*\nX179541964Y-87053571D01*\nX179899107Y-87053571D01*\nX180041964Y-86982142D01*\nX180113392Y-86910714D01*\nX178827678Y-85553571D02*\nX178327678Y-87053571D01*\nX177827678Y-85553571D01*\nX176184821Y-87053571D02*\nX176184821Y-85553571D01*\nX175827678Y-85553571D01*\nX175613392Y-85625000D01*\nX175470535Y-85767857D01*\nX175399107Y-85910714D01*\nX175327678Y-86196428D01*\nX175327678Y-86410714D01*\nX175399107Y-86696428D01*\nX175470535Y-86839285D01*\nX175613392Y-86982142D01*\nX175827678Y-87053571D01*\nX176184821Y-87053571D01*\nX174684821Y-86267857D02*\nX174184821Y-86267857D01*\nX173970535Y-87053571D02*\nX174684821Y-87053571D01*\nX174684821Y-85553571D01*\nX173970535Y-85553571D01*\nX173541964Y-85553571D02*\nX173041964Y-87053571D01*\nX172541964Y-85553571D01*\nX181041964Y-89678571D02*\nX181541964Y-88964285D01*\nX181899107Y-89678571D02*\nX181899107Y-88178571D01*\nX181327678Y-88178571D01*\nX181184821Y-88250000D01*\nX181113392Y-88321428D01*\nX181041964Y-88464285D01*\nX181041964Y-88678571D01*\nX181113392Y-88821428D01*\nX181184821Y-88892857D01*\nX181327678Y-88964285D01*\nX181899107Y-88964285D01*\nX180541964Y-88178571D02*\nX179541964Y-89678571D01*\nX179541964Y-88178571D02*\nX180541964Y-89678571D01*\nX179184821Y-88178571D02*\nX178327678Y-88178571D01*\nX178756250Y-89678571D02*\nX178756250Y-88178571D01*\nX177970535Y-88178571D02*\nX176970535Y-89678571D01*\nX176970535Y-88178571D02*\nX177970535Y-89678571D01*\nX181113392Y-90875000D02*\nX181256250Y-90803571D01*\nX181470535Y-90803571D01*\nX181684821Y-90875000D01*\nX181827678Y-91017857D01*\nX181899107Y-91160714D01*\nX181970535Y-91446428D01*\nX181970535Y-91660714D01*\nX181899107Y-91946428D01*\nX181827678Y-92089285D01*\nX181684821Y-92232142D01*\nX181470535Y-92303571D01*\nX181327678Y-92303571D01*\nX181113392Y-92232142D01*\nX181041964Y-92160714D01*\nX181041964Y-91660714D01*\nX181327678Y-91660714D01*\nX180399107Y-92303571D02*\nX180399107Y-90803571D01*\nX179541964Y-92303571D01*\nX179541964Y-90803571D01*\nX178827678Y-92303571D02*\nX178827678Y-90803571D01*\nX178470535Y-90803571D01*\nX178256250Y-90875000D01*\nX178113392Y-91017857D01*\nX178041964Y-91160714D01*\nX177970535Y-91446428D01*\nX177970535Y-91660714D01*\nX178041964Y-91946428D01*\nX178113392Y-92089285D01*\nX178256250Y-92232142D01*\nX178470535Y-92303571D01*\nX178827678Y-92303571D01*\nD13*\nG36*\nX164873000Y-87373000D02*\nX154627000Y-87373000D01*\nX154627000Y-83127000D01*\nX164873000Y-83127000D01*\nX164873000Y-87373000D01*\nX164873000Y-87373000D01*\nG37*\nX164873000Y-87373000D02*\nX154627000Y-87373000D01*\nX154627000Y-83127000D01*\nX164873000Y-83127000D01*\nX164873000Y-87373000D01*\n%LPC*%\nD14*\nX175640000Y-81600000D03*\nD15*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD16*\nX184000000Y-86460000D03*\nD17*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD18*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD19*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD20*\nX150800000Y-87100000D03*\nX150800000Y-91600000D03*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/FelinaePurr-F.Cu.gtl",
    "content": "G04 #@! TF.FileFunction,Copper,L1,Top,Signal*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11R,0.800000X0.750000*%\n%ADD12R,0.750000X0.800000*%\n%ADD13R,1.198880X1.198880*%\n%ADD14R,1.727200X2.032000*%\n%ADD15O,1.727200X2.032000*%\n%ADD16R,0.500000X0.900000*%\n%ADD17R,0.450000X1.750000*%\n%ADD18R,1.060000X0.650000*%\n%ADD19R,2.032000X1.727200*%\n%ADD20O,2.032000X1.727200*%\n%ADD21R,0.900000X0.500000*%\n%ADD22C,1.300000*%\n%ADD23C,2.800000*%\n%ADD24C,0.685800*%\n%ADD25C,0.800000*%\n%ADD26C,0.500000*%\n%ADD27C,0.300000*%\n%ADD28C,0.400000*%\n%ADD29C,0.800000*%\n%ADD30C,0.250000*%\n%ADD31C,0.180000*%\n%ADD32C,0.160000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX165350000Y-82700000D03*\nX163850000Y-82700000D03*\nX162350000Y-82700000D03*\nX160850000Y-82700000D03*\nD12*\nX172700000Y-87350000D03*\nX172700000Y-88850000D03*\nD11*\nX181100000Y-90600000D03*\nX179600000Y-90600000D03*\nD13*\nX168800000Y-94500000D03*\nX168800000Y-96598040D03*\nX170800000Y-94500000D03*\nX170800000Y-96598040D03*\nX172800000Y-94500000D03*\nX172800000Y-96598040D03*\nD14*\nX175640000Y-81600000D03*\nD15*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD16*\nX181100000Y-89000000D03*\nX179600000Y-89000000D03*\nX179600000Y-87300000D03*\nX181100000Y-87300000D03*\nD17*\nX156775000Y-92600000D03*\nX157425000Y-92600000D03*\nX158075000Y-92600000D03*\nX158725000Y-92600000D03*\nX159375000Y-92600000D03*\nX160025000Y-92600000D03*\nX160675000Y-92600000D03*\nX161325000Y-92600000D03*\nX161975000Y-92600000D03*\nX162625000Y-92600000D03*\nX163275000Y-92600000D03*\nX163925000Y-92600000D03*\nX164575000Y-92600000D03*\nX165225000Y-92600000D03*\nX165225000Y-85400000D03*\nX164575000Y-85400000D03*\nX163925000Y-85400000D03*\nX163275000Y-85400000D03*\nX162625000Y-85400000D03*\nX161975000Y-85400000D03*\nX161325000Y-85400000D03*\nX160675000Y-85400000D03*\nX160025000Y-85400000D03*\nX159375000Y-85400000D03*\nX158725000Y-85400000D03*\nX158075000Y-85400000D03*\nX157425000Y-85400000D03*\nX156775000Y-85400000D03*\nD18*\nX175000000Y-87150000D03*\nX175000000Y-88100000D03*\nX175000000Y-89050000D03*\nX177200000Y-89050000D03*\nX177200000Y-87150000D03*\nD19*\nX184000000Y-86460000D03*\nD20*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD13*\nX174900000Y-94501960D03*\nX174900000Y-96600000D03*\nD11*\nX159000000Y-94600000D03*\nX160500000Y-94600000D03*\nX162350000Y-81100000D03*\nX160850000Y-81100000D03*\nD21*\nX171150000Y-88600000D03*\nX171150000Y-90100000D03*\nX169550000Y-88600000D03*\nX169550000Y-90100000D03*\nX168800000Y-91300000D03*\nX168800000Y-92800000D03*\nX170800000Y-91300000D03*\nX170800000Y-92800000D03*\nX172800000Y-91300000D03*\nX172800000Y-92800000D03*\nX174900000Y-91300000D03*\nX174900000Y-92800000D03*\nX176600000Y-91300000D03*\nX176600000Y-92800000D03*\nD22*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD23*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD24*\nX173700000Y-89200000D03*\nX162300004Y-87000000D03*\nX159600000Y-82700000D03*\nX161700000Y-94600000D03*\nX176200000Y-96600000D03*\nX179600000Y-91700000D03*\nX158100000Y-83900000D03*\nX168600000Y-89399998D03*\nX167200000Y-85000000D03*\nX159600000Y-81100000D03*\nX163800000Y-81100000D03*\nD25*\nX159300000Y-87400000D03*\nX167300000Y-96600000D03*\nX167300000Y-94500000D03*\nX160900000Y-87400000D03*\nD24*\nX174900000Y-90299999D03*\nX174900000Y-85300000D03*\nD25*\nX166500002Y-90900000D03*\nX177200000Y-90200000D03*\nX168000000Y-87400000D03*\nX173800000Y-87400000D03*\nD24*\nX154500000Y-89792900D03*\nX154500000Y-88907100D03*\nD26*\nX165325000Y-82700000D02*\nX165325000Y-83475000D01*\nX165325000Y-83475000D02*\nX164900000Y-83900000D01*\nX164900000Y-83900000D02*\nX164250677Y-83900000D01*\nX163947598Y-84375049D02*\nX163927410Y-84395237D01*\nX164250677Y-83900000D02*\nX163947598Y-84203079D01*\nX163947598Y-84203079D02*\nX163947598Y-84375049D01*\nX163927410Y-84395237D02*\nX163927410Y-85400000D01*\nD27*\nX165325000Y-82700000D02*\nX165325000Y-82826415D01*\nD26*\nX165350000Y-82700000D02*\nX165325000Y-82700000D01*\nX172700000Y-88850000D02*\nX173350000Y-88850000D01*\nX173350000Y-88850000D02*\nX173700000Y-89200000D01*\nX175000000Y-89050000D02*\nX173850000Y-89050000D01*\nX173850000Y-89050000D02*\nX173700000Y-89200000D01*\nX175000000Y-88100000D02*\nX175000000Y-89050000D01*\nX163850000Y-82700000D02*\nX163850000Y-83378030D01*\nX163850000Y-83378030D02*\nX163295188Y-83932842D01*\nX163275000Y-84125000D02*\nX163295188Y-84104812D01*\nX163295188Y-84104812D02*\nX163295188Y-83932842D01*\nX163275000Y-85400000D02*\nX163275000Y-84125000D01*\nX160850000Y-82700000D02*\nX160850000Y-83575000D01*\nX160850000Y-83575000D02*\nX160875000Y-83600000D01*\nX160875000Y-83600000D02*\nX160900000Y-83600000D01*\nX161325000Y-85400000D02*\nX161325000Y-84025000D01*\nX161325000Y-84025000D02*\nX160900000Y-83600000D01*\nX160675000Y-92600000D02*\nX160675000Y-93800000D01*\nX160500000Y-94600000D02*\nX160500000Y-93975000D01*\nX160500000Y-93975000D02*\nX160675000Y-93800000D01*\nX163275000Y-85400000D02*\nX163275000Y-86509937D01*\nX163275000Y-86509937D02*\nX162784937Y-87000000D01*\nX162784937Y-87000000D02*\nX162300004Y-87000000D01*\nX161325000Y-86509929D02*\nX161815071Y-87000000D01*\nX161325000Y-85400000D02*\nX161325000Y-86509929D01*\nX161815071Y-87000000D02*\nX162300004Y-87000000D01*\nX159700000Y-82700000D02*\nX159600000Y-82700000D01*\nX160850000Y-82700000D02*\nX159700000Y-82700000D01*\nX160850000Y-82700000D02*\nX160850000Y-81100000D01*\nX160500000Y-94600000D02*\nX161700000Y-94600000D01*\nX158075000Y-85400000D02*\nX158075000Y-83925000D01*\nX158075000Y-83925000D02*\nX158100000Y-83900000D01*\nX158075000Y-85400000D02*\nX158725000Y-85400000D01*\nX179600000Y-90600000D02*\nX179600000Y-91700000D01*\nX174900000Y-96600000D02*\nX176200000Y-96600000D01*\nX172800000Y-96598040D02*\nX174898040Y-96598040D01*\nX174898040Y-96598040D02*\nX174900000Y-96600000D01*\nX169250000Y-85000000D02*\nX170560000Y-83690000D01*\nX170560000Y-83690000D02*\nX170560000Y-81600000D01*\nX167200000Y-85000000D02*\nX169250000Y-85000000D01*\nX168600000Y-90500000D02*\nX168600000Y-89399998D01*\nX168800000Y-91300000D02*\nX168800000Y-90700000D01*\nX168800000Y-90700000D02*\nX168600000Y-90500000D01*\nD28*\nX170500000Y-88600000D02*\nX171150000Y-88600000D01*\nD26*\nX169550000Y-88600000D02*\nX170500000Y-88600000D01*\nX168600000Y-89399998D02*\nX168750002Y-89399998D01*\nX168750002Y-89399998D02*\nX169550000Y-88600000D01*\nX162350000Y-82700000D02*\nX162350000Y-83575000D01*\nX162350000Y-83575000D02*\nX161977410Y-83947590D01*\nX161977410Y-83947590D02*\nX161977410Y-85400000D01*\nD29*\nX162350000Y-81100000D02*\nX163800000Y-81100000D01*\nD30*\nX174222599Y-89677401D02*\nX175726921Y-89677401D01*\nX175726921Y-89677401D02*\nX176250000Y-89154322D01*\nX176250000Y-89154322D02*\nX176250000Y-88675000D01*\nX176250000Y-88675000D02*\nX177200000Y-87725000D01*\nX177200000Y-87725000D02*\nX177200000Y-87150000D01*\nD26*\nX177200000Y-87150000D02*\nX179450000Y-87150000D01*\nX179450000Y-87150000D02*\nX179600000Y-87300000D01*\nX159000000Y-94600000D02*\nX159000000Y-94000000D01*\nX159000000Y-94000000D02*\nX158725000Y-93725000D01*\nX158725000Y-93725000D02*\nX158725000Y-92600000D01*\nD28*\nX174222599Y-89677401D02*\nX173800000Y-90100000D01*\nX159600000Y-96600000D02*\nX159000000Y-96000000D01*\nD27*\nX181100000Y-87300000D02*\nX181100000Y-89000000D01*\nX181100000Y-90600000D02*\nX181100000Y-89000000D01*\nX181100000Y-89000000D02*\nX184000000Y-89000000D01*\nD26*\nX168800000Y-94500000D02*\nX168800000Y-92800000D01*\nX168800000Y-96598040D02*\nX167301960Y-96598040D01*\nX167301960Y-96598040D02*\nX167300000Y-96600000D01*\nD27*\nX159300000Y-87400000D02*\nX160025000Y-86675000D01*\nX160025000Y-86675000D02*\nX160025000Y-85400000D01*\nD26*\nX170800000Y-92800000D02*\nX170800000Y-94500000D01*\nX167300000Y-94500000D02*\nX167300000Y-95065685D01*\nX167300000Y-95065685D02*\nX167734314Y-95499999D01*\nX167734314Y-95499999D02*\nX167876797Y-95499999D01*\nX167876797Y-95499999D02*\nX167878639Y-95501841D01*\nX167878639Y-95501841D02*\nX170603241Y-95501841D01*\nX170603241Y-95501841D02*\nX170800000Y-95698600D01*\nX170800000Y-95698600D02*\nX170800000Y-96598040D01*\nD27*\nX160675000Y-85400000D02*\nX160675000Y-86400000D01*\nX160900000Y-86900000D02*\nX160675000Y-86675000D01*\nX160675000Y-86675000D02*\nX160675000Y-86400000D01*\nX160900000Y-87400000D02*\nX160900000Y-86900000D01*\nD26*\nX172800000Y-92800000D02*\nX172800000Y-94500000D01*\nD27*\nX175640000Y-81600000D02*\nX175640000Y-84560000D01*\nX175640000Y-84560000D02*\nX174900000Y-85300000D01*\nD26*\nX176600000Y-91300000D02*\nX175599999Y-90299999D01*\nX175599999Y-90299999D02*\nX174900000Y-90299999D01*\nD29*\nX175640000Y-81600000D02*\nX180803600Y-81600000D01*\nX180803600Y-81600000D02*\nX184000000Y-84796400D01*\nX184000000Y-84796400D02*\nX184000000Y-86460000D01*\nD26*\nX174900000Y-92800000D02*\nX174900000Y-94501960D01*\nD27*\nX165934317Y-90900000D02*\nX166500002Y-90900000D01*\nX159900000Y-90900000D02*\nX165934317Y-90900000D01*\nX159375000Y-91425000D02*\nX159900000Y-90900000D01*\nX159375000Y-92600000D02*\nX159375000Y-91425000D01*\nX177200000Y-90200000D02*\nX177200000Y-89050000D01*\nX177200000Y-89050000D02*\nX179550000Y-89050000D01*\nX179550000Y-89050000D02*\nX179600000Y-89000000D01*\nX166000000Y-89400000D02*\nX167600001Y-87799999D01*\nX158400000Y-89400000D02*\nX166000000Y-89400000D01*\nX167600001Y-87799999D02*\nX168000000Y-87400000D01*\nX156775000Y-91025000D02*\nX158400000Y-89400000D01*\nX175000000Y-87150000D02*\nX174050000Y-87150000D01*\nX174050000Y-87150000D02*\nX173800000Y-87400000D01*\nX156775000Y-91025000D02*\nX156800000Y-91000000D01*\nX156775000Y-92600000D02*\nX156775000Y-91025000D01*\nD26*\nX169550000Y-90100000D02*\nX169600000Y-90100000D01*\nX169600000Y-90100000D02*\nX170800000Y-91300000D01*\nX174900000Y-91300000D02*\nX175100000Y-91300000D01*\nX175100000Y-91300000D02*\nX176600000Y-92800000D01*\nX171150000Y-90100000D02*\nX171600000Y-90100000D01*\nX171600000Y-90100000D02*\nX172800000Y-91300000D01*\nD27*\nX154500000Y-89792900D02*\nX154342900Y-89792900D01*\nX154342900Y-89792900D02*\nX152900000Y-88350000D01*\nX157560197Y-89599999D02*\nX154692901Y-89599999D01*\nX154692901Y-89599999D02*\nX154500000Y-89792900D01*\nX165225000Y-86712500D02*\nX165150000Y-86787500D01*\nX165225000Y-85400000D02*\nX165225000Y-86712500D01*\nX165150000Y-86787500D02*\nX165150000Y-87703552D01*\nX165150000Y-87703552D02*\nX163905962Y-88947590D01*\nX163905962Y-88947590D02*\nX158212605Y-88947591D01*\nX158212605Y-88947591D02*\nX157560197Y-89599999D01*\nX157353101Y-89100001D02*\nX154692901Y-89100001D01*\nX154692901Y-89100001D02*\nX154500000Y-88907100D01*\nX164650000Y-86787500D02*\nX164650000Y-87496448D01*\nX158005501Y-88447601D02*\nX157353101Y-89100001D01*\nX164575000Y-85400000D02*\nX164575000Y-86712500D01*\nX164575000Y-86712500D02*\nX164650000Y-86787500D01*\nX164650000Y-87496448D02*\nX163698847Y-88447601D01*\nX163698847Y-88447601D02*\nX158005501Y-88447601D01*\nD31*\nG36*\nX161443040Y-80386260D02*\nX161404451Y-80479422D01*\nX161363152Y-80451826D01*\nX161250000Y-80429319D01*\nX160450000Y-80429319D01*\nX160336848Y-80451826D01*\nX160240922Y-80515922D01*\nX160176826Y-80611848D01*\nX160154319Y-80725000D01*\nX160154319Y-81475000D01*\nX160176826Y-81588152D01*\nX160240922Y-81684078D01*\nX160310000Y-81730235D01*\nX160310000Y-82069765D01*\nX160240922Y-82115922D01*\nX160211470Y-82160000D01*\nX159949905Y-82160000D01*\nX159726444Y-82067210D01*\nX159474661Y-82066991D01*\nX159241959Y-82163141D01*\nX159063767Y-82341023D01*\nX158967210Y-82573556D01*\nX158966991Y-82825339D01*\nX159063141Y-83058041D01*\nX159241023Y-83236233D01*\nX159473556Y-83332790D01*\nX159725339Y-83333009D01*\nX159950439Y-83240000D01*\nX160211470Y-83240000D01*\nX160240922Y-83284078D01*\nX160310000Y-83330235D01*\nX160310000Y-83575000D01*\nX160351105Y-83781649D01*\nX160468162Y-83956838D01*\nX160493160Y-83981835D01*\nX160493162Y-83981838D01*\nX160568503Y-84032179D01*\nX160765644Y-84229319D01*\nX160450000Y-84229319D01*\nX160350000Y-84249210D01*\nX160250000Y-84229319D01*\nX159800000Y-84229319D01*\nX159700000Y-84249210D01*\nX159600000Y-84229319D01*\nX159150000Y-84229319D01*\nX159050000Y-84249210D01*\nX158950000Y-84229319D01*\nX158648548Y-84229319D01*\nX158732790Y-84026444D01*\nX172906000Y-81774000D01*\nX172906000Y-81426000D01*\nX172926000Y-81426000D01*\nX172926000Y-81406000D01*\nX173274000Y-81406000D01*\nX173274000Y-81426000D01*\nX173274000Y-81426000D01*\nG37*\nX173274000Y-81426000D02*\nX180070000Y-89624732D01*\nX180070000Y-89953439D01*\nX180000000Y-89939515D01*\nX179200000Y-89939515D01*\nX179090750Y-89961246D01*\nX178998132Y-90023132D01*\nX178936246Y-90115750D01*\nX172926000Y-81774000D01*\nX172906000Y-81774000D01*\nX172906000Y-81426000D01*\nX172926000Y-81426000D01*\nX172926000Y-81406000D01*\nX173274000Y-81406000D01*\nX173274000Y-81426000D01*\nD31*\nG36*\nX181810000Y-87900000D02*\nX181816851Y-87934442D01*\nX181836360Y-87963640D01*\nX181865558Y-87983149D01*\nX181900000Y-87990000D01*\nX185210000Y-87990000D01*\nX185210000Y-89910000D01*\nX182100000Y-89910000D01*\nX182065558Y-89916851D01*\nX182036360Y-89936360D01*\nX182016851Y-89965558D01*\nX182010000Y-90000000D01*\nX182010000Y-91310000D01*\nX180490000Y-91310000D01*\nX180490000Y-86190000D01*\nX181810000Y-86190000D01*\nX181810000Y-87900000D01*\nX181810000Y-87900000D01*\nG37*\nX181810000Y-87900000D02*\nX181816851Y-87934442D01*\nX181836360Y-87963640D01*\nX181865558Y-87983149D01*\nX181900000Y-87990000D01*\nX185210000Y-87990000D01*\nX185210000Y-89910000D01*\nX182100000Y-89910000D01*\nX182065558Y-89916851D01*\nX182036360Y-89936360D01*\nX182016851Y-89965558D01*\nX182010000Y-90000000D01*\nX182010000Y-91310000D01*\nX180490000Y-91310000D01*\nX180490000Y-86190000D01*\nX181810000Y-86190000D01*\nX181810000Y-87900000D01*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/FelinaePurr-F.Mask.gts",
    "content": "G04 #@! TF.FileFunction,Soldermask,Top*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11R,0.800000X0.750000*%\n%ADD12R,0.750000X0.800000*%\n%ADD13R,1.198880X1.198880*%\n%ADD14R,1.727200X2.032000*%\n%ADD15O,1.727200X2.032000*%\n%ADD16R,0.500000X0.900000*%\n%ADD17R,0.450000X1.750000*%\n%ADD18R,1.060000X0.650000*%\n%ADD19R,2.032000X1.727200*%\n%ADD20O,2.032000X1.727200*%\n%ADD21R,0.900000X0.500000*%\n%ADD22C,1.300000*%\n%ADD23C,2.800000*%\n%ADD24C,1.200000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX165350000Y-82700000D03*\nX163850000Y-82700000D03*\nX162350000Y-82700000D03*\nX160850000Y-82700000D03*\nD12*\nX172700000Y-87350000D03*\nX172700000Y-88850000D03*\nD11*\nX181100000Y-90600000D03*\nX179600000Y-90600000D03*\nD13*\nX168800000Y-94500000D03*\nX168800000Y-96598040D03*\nX170800000Y-94500000D03*\nX170800000Y-96598040D03*\nX172800000Y-94500000D03*\nX172800000Y-96598040D03*\nD14*\nX175640000Y-81600000D03*\nD15*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD16*\nX181100000Y-89000000D03*\nX179600000Y-89000000D03*\nX179600000Y-87300000D03*\nX181100000Y-87300000D03*\nD17*\nX156775000Y-92600000D03*\nX157425000Y-92600000D03*\nX158075000Y-92600000D03*\nX158725000Y-92600000D03*\nX159375000Y-92600000D03*\nX160025000Y-92600000D03*\nX160675000Y-92600000D03*\nX161325000Y-92600000D03*\nX161975000Y-92600000D03*\nX162625000Y-92600000D03*\nX163275000Y-92600000D03*\nX163925000Y-92600000D03*\nX164575000Y-92600000D03*\nX165225000Y-92600000D03*\nX165225000Y-85400000D03*\nX164575000Y-85400000D03*\nX163925000Y-85400000D03*\nX163275000Y-85400000D03*\nX162625000Y-85400000D03*\nX161975000Y-85400000D03*\nX161325000Y-85400000D03*\nX160675000Y-85400000D03*\nX160025000Y-85400000D03*\nX159375000Y-85400000D03*\nX158725000Y-85400000D03*\nX158075000Y-85400000D03*\nX157425000Y-85400000D03*\nX156775000Y-85400000D03*\nD18*\nX175000000Y-87150000D03*\nX175000000Y-88100000D03*\nX175000000Y-89050000D03*\nX177200000Y-89050000D03*\nX177200000Y-87150000D03*\nD19*\nX184000000Y-86460000D03*\nD20*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD13*\nX174900000Y-94501960D03*\nX174900000Y-96600000D03*\nD11*\nX159000000Y-94600000D03*\nX160500000Y-94600000D03*\nX162350000Y-81100000D03*\nX160850000Y-81100000D03*\nD21*\nX171150000Y-88600000D03*\nX171150000Y-90100000D03*\nX169550000Y-88600000D03*\nX169550000Y-90100000D03*\nX168800000Y-91300000D03*\nX168800000Y-92800000D03*\nX170800000Y-91300000D03*\nX170800000Y-92800000D03*\nX172800000Y-91300000D03*\nX172800000Y-92800000D03*\nX174900000Y-91300000D03*\nX174900000Y-92800000D03*\nX176600000Y-91300000D03*\nX176600000Y-92800000D03*\nD22*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD23*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD24*\nX150800000Y-87100000D03*\nX150800000Y-91600000D03*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/FelinaePurr-F.Paste.gtp",
    "content": "G04 #@! TF.FileFunction,Paste,Top*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\nG04 APERTURE END LIST*\nD10*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/FelinaePurr-F.SilkS.gto",
    "content": "G04 #@! TF.FileFunction,Legend,Top*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11C,0.200000*%\n%ADD12C,0.500000*%\n%ADD13C,0.175000*%\n%ADD14C,0.120000*%\n%ADD15R,0.800000X0.750000*%\n%ADD16R,0.750000X0.800000*%\n%ADD17R,1.198880X1.198880*%\n%ADD18R,1.727200X2.032000*%\n%ADD19O,1.727200X2.032000*%\n%ADD20R,0.500000X0.900000*%\n%ADD21R,0.450000X1.750000*%\n%ADD22R,1.060000X0.650000*%\n%ADD23R,2.032000X1.727200*%\n%ADD24O,2.032000X1.727200*%\n%ADD25R,0.900000X0.500000*%\n%ADD26C,1.300000*%\n%ADD27C,2.800000*%\n%ADD28C,1.200000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX181000000Y-96250000D02*\nX181000000Y-96750000D01*\nX180750000Y-96500000D02*\nX181250000Y-96500000D01*\nX180750000Y-97250000D02*\nX181250000Y-97250000D01*\nD12*\nX156000000Y-92800000D02*\nG75*\nG03X156000000Y-92800000I-200000J0D01*\nG01*\nD13*\nX174800000Y-84116666D02*\nX174800000Y-83416666D01*\nX174966666Y-83416666D01*\nX175066666Y-83450000D01*\nX175133333Y-83516666D01*\nX175166666Y-83583333D01*\nX175200000Y-83716666D01*\nX175200000Y-83816666D01*\nX175166666Y-83950000D01*\nX175133333Y-84016666D01*\nX175066666Y-84083333D01*\nX174966666Y-84116666D01*\nX174800000Y-84116666D01*\nX175500000Y-83750000D02*\nX175733333Y-83750000D01*\nX157483333Y-97316666D02*\nX161783333Y-96816666D01*\nX162450000Y-97116666D02*\nX162783333Y-97116666D01*\nX162383333Y-97316666D02*\nX162616666Y-96616666D01*\nX162850000Y-97316666D01*\nD10*\nX164950000Y-83300000D02*\nX164250000Y-83300000D01*\nX164250000Y-82100000D02*\nX164950000Y-82100000D01*\nX161950000Y-83300000D02*\nX161250000Y-83300000D01*\nX161250000Y-82100000D02*\nX161950000Y-82100000D01*\nX173300000Y-87750000D02*\nX173300000Y-88450000D01*\nX172100000Y-88450000D02*\nX172100000Y-87750000D01*\nX180700000Y-91200000D02*\nX180000000Y-91200000D01*\nX180000000Y-90000000D02*\nX180700000Y-90000000D01*\nX169550000Y-97149020D02*\nX169550000Y-94449020D01*\nX168050000Y-97149020D02*\nX168050000Y-94449020D01*\nX168950000Y-95649020D02*\nX168700000Y-95649020D01*\nX168700000Y-95649020D02*\nX168850000Y-95799020D01*\nX168450000Y-95899020D02*\nX169150000Y-95899020D01*\nX168800000Y-95549020D02*\nX168800000Y-95199020D01*\nX168800000Y-95899020D02*\nX168450000Y-95549020D01*\nX168450000Y-95549020D02*\nX169150000Y-95549020D01*\nX169150000Y-95549020D02*\nX168800000Y-95899020D01*\nX171550000Y-97149020D02*\nX171550000Y-94449020D01*\nX170050000Y-97149020D02*\nX170050000Y-94449020D01*\nX170950000Y-95649020D02*\nX170700000Y-95649020D01*\nX170700000Y-95649020D02*\nX170850000Y-95799020D01*\nX170450000Y-95899020D02*\nX171150000Y-95899020D01*\nX170800000Y-95549020D02*\nX170800000Y-95199020D01*\nX175900000Y-86400000D02*\nG75*\nG03X175900000Y-86400000I-100000J0D01*\nG01*\nX176350000Y-86650000D02*\nX175850000Y-86650000D01*\nX176350000Y-89550000D02*\nX176350000Y-86650000D01*\nX175850000Y-89550000D02*\nX176350000Y-89550000D01*\nX175850000Y-86650000D02*\nX175850000Y-89550000D01*\nX182730000Y-87730000D02*\nX182730000Y-92810000D01*\nX182730000Y-92810000D02*\nX185270000Y-92810000D01*\nX185270000Y-92810000D02*\nX185270000Y-87730000D01*\nX185550000Y-84910000D02*\nX185550000Y-86460000D01*\nX185270000Y-87730000D02*\nX182730000Y-87730000D01*\nX175580000Y-92550000D01*\nX175920000Y-92550000D02*\nX175920000Y-91550000D01*\nX177280000Y-91550000D02*\nX177280000Y-92550000D01*\nD10*\nX148000000Y-95350000D02*\nX148000000Y-83350000D01*\nX134100000Y-83350000D02*\nX152800000Y-83350000D01*\nX134100000Y-95350000D02*\nX134100000Y-83350000D01*\nX152900000Y-95350000D02*\nX141352380Y-88850000D02*\nX140352380Y-88850000D01*\nX140495238Y-88945238D01*\nX140590476Y-89040476D01*\nX140638095Y-89135714D01*\n%LPC*%\nD15*\nX165350000Y-82700000D03*\nX163850000Y-82700000D03*\nX162350000Y-82700000D03*\nX160850000Y-82700000D03*\nD16*\nX172700000Y-87350000D03*\nX172700000Y-88850000D03*\nD15*\nX181100000Y-90600000D03*\nX179600000Y-90600000D03*\nD17*\nX168800000Y-94500000D03*\nX168800000Y-96598040D03*\nX170800000Y-94500000D03*\nX170800000Y-96598040D03*\nX172800000Y-94500000D03*\nX172800000Y-96598040D03*\nD18*\nX175640000Y-81600000D03*\nD19*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD20*\nX181100000Y-89000000D03*\nX179600000Y-89000000D03*\nX179600000Y-87300000D03*\nX181100000Y-87300000D03*\nD21*\nX156775000Y-92600000D03*\nX157425000Y-92600000D03*\nX158075000Y-92600000D03*\nX158725000Y-92600000D03*\nX159375000Y-92600000D03*\nX160025000Y-92600000D03*\nX160675000Y-92600000D03*\nX161325000Y-92600000D03*\nX161975000Y-92600000D03*\nX162625000Y-92600000D03*\nX163275000Y-92600000D03*\nX163925000Y-92600000D03*\nX164575000Y-92600000D03*\nX165225000Y-92600000D03*\nX165225000Y-85400000D03*\nX164575000Y-85400000D03*\nX163925000Y-85400000D03*\nX163275000Y-85400000D03*\nX162625000Y-85400000D03*\nX161975000Y-85400000D03*\nX161325000Y-85400000D03*\nX160675000Y-85400000D03*\nX160025000Y-85400000D03*\nX159375000Y-85400000D03*\nX158725000Y-85400000D03*\nX158075000Y-85400000D03*\nX157425000Y-85400000D03*\nX156775000Y-85400000D03*\nD22*\nX175000000Y-87150000D03*\nX175000000Y-88100000D03*\nX175000000Y-89050000D03*\nX177200000Y-89050000D03*\nX177200000Y-87150000D03*\nD23*\nX184000000Y-86460000D03*\nD24*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD17*\nX174900000Y-94501960D03*\nX174900000Y-96600000D03*\nD15*\nX159000000Y-94600000D03*\nX160500000Y-94600000D03*\nX162350000Y-81100000D03*\nX160850000Y-81100000D03*\nD25*\nX171150000Y-88600000D03*\nX171150000Y-90100000D03*\nX169550000Y-88600000D03*\nX169550000Y-90100000D03*\nX168800000Y-91300000D03*\nX168800000Y-92800000D03*\nX170800000Y-91300000D03*\nX170800000Y-92800000D03*\nX172800000Y-91300000D03*\nX172800000Y-92800000D03*\nX174900000Y-91300000D03*\nX174900000Y-92800000D03*\nX176600000Y-91300000D03*\nX176600000Y-92800000D03*\nD26*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD27*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD28*\nX150800000Y-87100000D03*\nX150800000Y-91600000D03*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/GOLMain_RevA-B.Paste.gbp",
    "content": "G04 #@! TF.FileFunction,Paste,Bot*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.4-stable) date 03/23/17 03:26:40*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11R,1.100000X2.400000*%\n%ADD12O,1.100000X2.400000*%\n%ADD13R,2.000000X2.032000*%\n%ADD14R,1.727200X2.032000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX153000000Y-135000000D03*\nD12*\nX151000000Y-135000000D03*\nX149000000Y-135000000D03*\nX147000000Y-135000000D03*\nX145000000Y-135000000D03*\nX143000000Y-135000000D03*\nX141000000Y-135000000D03*\nX139000000Y-135000000D03*\nX139000000Y-119000000D03*\nX141000000Y-119000000D03*\nX143000000Y-119000000D03*\nX145000000Y-119000000D03*\nX147000000Y-119000000D03*\nX149000000Y-119000000D03*\nX151000000Y-119000000D03*\nX153000000Y-119000000D03*\nD13*\nX94500000Y-125500000D03*\nX97040000Y-125500000D03*\nX99580000Y-125500000D03*\nX94500000Y-128500000D03*\nX97040000Y-128500000D03*\nX99580000Y-128500000D03*\nX94500000Y-131500000D03*\nX97040000Y-131500000D03*\nX99580000Y-131500000D03*\nX94500000Y-134500000D03*\nX97040000Y-134500000D03*\nX99580000Y-134500000D03*\nX97040000Y-137500000D03*\nX99580000Y-137500000D03*\nD14*\nX94500000Y-140500000D03*\nD13*\nX97040000Y-140500000D03*\nX99580000Y-140500000D03*\nX94500000Y-143500000D03*\nX97040000Y-143500000D03*\nX99580000Y-143500000D03*\nX94500000Y-146500000D03*\nX97040000Y-146500000D03*\nX99580000Y-146500000D03*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/nonaprs_contour.gko",
    "content": "G04 MADE WITH FRITZING*\nG04 WWW.FRITZING.ORG*\nG04 DOUBLE SIDED*\nG04 HOLES PLATED*\nG04 CONTOUR ON CENTER OF CONTOUR VECTOR*\n%ASAXBY*%\n%FSLAX23Y23*%\n%MOIN*%\n%OFA0B0*%\n%SFA1.0B1.0*%\n%ADD10R,1.267940X2.408830*%\n%ADD11C,0.008000*%\n%ADD10C,0.008*%\n%LNCONTOUR*%\nG90*\nG70*\nG54D10*\nG54D11*\nX4Y2405D02*\nX1264Y2405D01*\nX1264Y4D01*\nX4Y4D01*\nX4Y2405D01*\nD02*\nG04 End of contour*\nM02*"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/simonShield-B.Cu.gbr",
    "content": "G04 #@! TF.FileFunction,Copper,L2,Bot,Signal*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\n%ADD12C,0.300000*%\n%ADD13C,1.600000*%\n%ADD14O,1.600000X1.600000*%\n%ADD15R,2.000000X1.524000*%\n%ADD16O,2.000000X1.524000*%\n%ADD17R,1.300000X1.300000*%\n%ADD18C,1.300000*%\n%ADD19C,1.998980*%\n%ADD20R,1.900000X2.000000*%\n%ADD21C,1.900000*%\n%ADD22R,1.727200X1.727200*%\n%ADD23O,1.727200X1.727200*%\n%ADD24C,1.000760*%\n%ADD25C,1.397000*%\n%ADD26C,1.600200*%\n%ADD27C,1.270000*%\n%ADD28C,1.500000*%\n%ADD29C,1.200000*%\n%ADD30C,0.900000*%\n%ADD31C,0.600000*%\n%ADD32C,0.304800*%\n%ADD33C,0.635000*%\n%ADD34C,0.450000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nD12*\nX189307143Y-112775000D02*\nX188592857Y-112775000D01*\nX189450000Y-113203571D02*\nX188950000Y-111703571D01*\nX191107143Y-58571429D01*\nX191178571Y-58714286D01*\nX191321429Y-58857143D01*\nX191535714Y-58928571D01*\nX191892857Y-58928571D01*\nX190392857Y-57428571D02*\nX190392857Y-58642857D01*\nX190321429Y-58785714D01*\nX190250000Y-58857143D01*\nX190107143Y-58928571D01*\nX189821429Y-58928571D01*\nX189678571Y-58857143D01*\nX189607143Y-58785714D01*\nX189535714Y-58642857D01*\nX189535714Y-57428571D01*\nX188821428Y-58357143D02*\nX170107142Y-55928571D01*\nX170392856Y-55928571D01*\nX170535713Y-55857143D01*\nX170678570Y-55714286D01*\nX170749999Y-55428571D01*\nX170749999Y-54928571D01*\nX170678570Y-54642857D01*\nX170535713Y-54500000D01*\nX170392856Y-54428571D01*\nX169107141Y-55928571D02*\nX169107141Y-54428571D01*\nX168249998Y-55928571D01*\nX168249998Y-54428571D01*\nD13*\nX145400000Y-68800000D03*\nD14*\nX145400000Y-58640000D03*\nD15*\nX189230000Y-61468000D03*\nD16*\nX191770000Y-61468000D03*\nX189230000Y-74168000D03*\nX191770000Y-64008000D03*\nX189230000Y-76708000D03*\nX191770000Y-66548000D03*\nX189230000Y-79248000D03*\nX191770000Y-69088000D03*\nX189230000Y-81788000D03*\nX191770000Y-71628000D03*\nX189230000Y-84328000D03*\nX191770000Y-74168000D03*\nX189230000Y-86868000D03*\nX191770000Y-76708000D03*\nX189230000Y-89408000D03*\nX191770000Y-79248000D03*\nX189230000Y-91948000D03*\nX191770000Y-81788000D03*\nX189230000Y-94488000D03*\nX191770000Y-84328000D03*\nX189230000Y-97028000D03*\nX191770000Y-86868000D03*\nX189230000Y-99568000D03*\nX191770000Y-89408000D03*\nX191770000Y-91948000D03*\nX189230000Y-102108000D03*\nX191770000Y-94488000D03*\nX191770000Y-99568000D03*\nX191770000Y-102108000D03*\nX191770000Y-104648000D03*\nX191770000Y-107188000D03*\nX189230000Y-104648000D03*\nX189230000Y-107188000D03*\nX189230000Y-64008000D03*\nX189230000Y-66548000D03*\nX189230000Y-69088000D03*\nX189230000Y-71628000D03*\nX189230000Y-109728000D03*\nX191770000Y-109728000D03*\nX191770000Y-97028000D03*\nD15*\nX118110000Y-61468000D03*\nD16*\nX120650000Y-61468000D03*\nX118110000Y-64008000D03*\nX120650000Y-64008000D03*\nX118110000Y-66548000D03*\nX120650000Y-66548000D03*\nX118110000Y-69088000D03*\nX120650000Y-69088000D03*\nX118110000Y-71628000D03*\nX120650000Y-71628000D03*\nX118110000Y-74168000D03*\nX120650000Y-74168000D03*\nX118110000Y-76708000D03*\nX120650000Y-76708000D03*\nX118110000Y-79248000D03*\nX120650000Y-79248000D03*\nX118110000Y-81788000D03*\nX120650000Y-81788000D03*\nX118110000Y-84328000D03*\nX120650000Y-84328000D03*\nX118110000Y-86868000D03*\nX120650000Y-86868000D03*\nX118110000Y-89408000D03*\nX120650000Y-89408000D03*\nX118110000Y-91948000D03*\nX120650000Y-91948000D03*\nX118110000Y-94488000D03*\nX120650000Y-94488000D03*\nX118110000Y-97028000D03*\nX120650000Y-97028000D03*\nX118110000Y-99568000D03*\nX120650000Y-99568000D03*\nX118110000Y-102108000D03*\nX120650000Y-102108000D03*\nX118110000Y-104648000D03*\nX120650000Y-104648000D03*\nX118110000Y-107188000D03*\nX120650000Y-107188000D03*\nX118110000Y-109728000D03*\nX120650000Y-109728000D03*\nD17*\nX135255000Y-64008000D03*\nD18*\nX135255000Y-61508000D03*\nD19*\nX164465000Y-85471000D03*\nX164465000Y-77851000D03*\nD20*\nX136017000Y-72644000D03*\nD21*\nX133477000Y-72644000D03*\nD20*\nX173863000Y-72644000D03*\nD21*\nX176403000Y-72644000D03*\nD20*\nX136017000Y-96139000D03*\nD21*\nX133477000Y-96139000D03*\nD20*\nX173863000Y-96012000D03*\nD21*\nX176403000Y-96012000D03*\nD22*\nX127007800Y-61542700D03*\nD23*\nX129547800Y-61542700D03*\nX127007800Y-64082700D03*\nX129547800Y-64082700D03*\nD24*\nX166243000Y-67056000D03*\nX164973000Y-68326000D03*\nX164973000Y-65786000D03*\nX128143000Y-71374000D03*\nX129413000Y-72644000D03*\nX126873000Y-72644000D03*\nX181737000Y-73914000D03*\nX180467000Y-72644000D03*\nX183007000Y-72644000D03*\nX128143000Y-94742000D03*\nX129413000Y-96012000D03*\nX126873000Y-96012000D03*\nX181737000Y-97282000D03*\nX180467000Y-96012000D03*\nX183007000Y-96012000D03*\nD19*\nX134239000Y-85344000D03*\nX134239000Y-77724000D03*\nX145415000Y-85344000D03*\nX145415000Y-77724000D03*\nX175641000Y-85217000D03*\nX175641000Y-77597000D03*\nX145415000Y-108966000D03*\nX145415000Y-101346000D03*\nX134239000Y-108458000D03*\nX134239000Y-100838000D03*\nX175641000Y-108585000D03*\nX175641000Y-100965000D03*\nX164465000Y-108839000D03*\nX164465000Y-101219000D03*\nX169164000Y-62611000D03*\nX161544000Y-62611000D03*\nX169164000Y-59563000D03*\nX161544000Y-59563000D03*\nX129921000Y-85217000D03*\nX129921000Y-77597000D03*\nX126365000Y-85217000D03*\nX126365000Y-77597000D03*\nX180086000Y-85217000D03*\nX180086000Y-77597000D03*\nX183515000Y-85217000D03*\nX183515000Y-77597000D03*\nX129921000Y-108458000D03*\nX129921000Y-100838000D03*\nX126365000Y-108458000D03*\nX126365000Y-100838000D03*\nX179959000Y-108585000D03*\nX179959000Y-100965000D03*\nX183515000Y-108585000D03*\nX183515000Y-100965000D03*\nD13*\nX155000000Y-99000000D03*\nD14*\nX155000000Y-88840000D03*\nD25*\nX137287000Y-77724000D03*\nX142367000Y-77724000D03*\nX137287000Y-85344000D03*\nX142367000Y-85344000D03*\nX148463000Y-77724000D03*\nX153543000Y-77724000D03*\nX148463000Y-85344000D03*\nX153543000Y-85344000D03*\nX172593000Y-85344000D03*\nX167513000Y-85344000D03*\nX172593000Y-77724000D03*\nX167513000Y-77724000D03*\nX161417000Y-85344000D03*\nX156337000Y-85344000D03*\nX161417000Y-77724000D03*\nX156337000Y-77724000D03*\nX148463000Y-101219000D03*\nX153543000Y-101219000D03*\nX148463000Y-108839000D03*\nX153543000Y-108839000D03*\nX137287000Y-101219000D03*\nX142367000Y-101219000D03*\nX137287000Y-108839000D03*\nX142367000Y-108839000D03*\nX172593000Y-108712000D03*\nX167513000Y-108712000D03*\nX172593000Y-101092000D03*\nX167513000Y-101092000D03*\nX161417000Y-108712000D03*\nX156337000Y-108712000D03*\nX161417000Y-101092000D03*\nX156337000Y-101092000D03*\nD26*\nX157178971Y-64124429D03*\nX150828971Y-64124429D03*\nD27*\nX137287000Y-80137000D03*\nX137287000Y-83439000D03*\nX148336000Y-79629000D03*\nX148463000Y-83185000D03*\nX172593000Y-80137000D03*\nX172593000Y-83312000D03*\nX161417000Y-80010000D03*\nX161417000Y-83439000D03*\nX137287000Y-103505000D03*\nX137287000Y-106680000D03*\nX172593000Y-103378000D03*\nX172593000Y-106934000D03*\nX148463000Y-103505000D03*\nX148463000Y-106934000D03*\nX161417000Y-103759000D03*\nX161417000Y-106934000D03*\nD28*\nX145400000Y-68800000D02*\nX145400000Y-70800000D01*\nX148800000Y-74200000D02*\nX153200000Y-74200000D01*\nX153200000Y-74200000D02*\nX154947800Y-75947800D01*\nX154947800Y-75947800D02*\nX154947800Y-77858800D01*\nX145400000Y-70800000D02*\nX148800000Y-74200000D01*\nX145400000Y-61508000D02*\nX145400000Y-58640000D01*\nD29*\nX135255000Y-61508000D02*\nX142600000Y-61508000D01*\nX142600000Y-61508000D02*\nX145400000Y-61508000D01*\nX145400000Y-61508000D02*\nX148212542Y-61508000D01*\nX148212542Y-61508000D02*\nX150828971Y-64124429D01*\nD30*\nX118110000Y-64008000D02*\nX116908002Y-64008000D01*\nD28*\nX131147000Y-57400000D02*\nX135255000Y-61508000D01*\nD29*\nX118100000Y-57400000D02*\nX131147000Y-57400000D01*\nD30*\nX116100002Y-59399998D02*\nX118100000Y-57400000D01*\nX116100002Y-63200000D02*\nX116100002Y-59399998D01*\nX116908002Y-64008000D02*\nX116100002Y-63200000D01*\nX167513000Y-101092000D02*\nX167513000Y-108712000D01*\nD31*\nX156337000Y-101092000D02*\nX156337000Y-104037000D01*\nX177103500Y-105300000D02*\nX177998300Y-104405200D01*\nX157600000Y-105300000D02*\nX177103500Y-105300000D01*\nX156337000Y-104037000D02*\nX157600000Y-105300000D01*\nD30*\nX142367000Y-85344000D02*\nX142367000Y-81661000D01*\nD32*\nX142367000Y-81661000D02*\nX142367000Y-81608700D01*\nD28*\nX154947800Y-85598000D02*\nX154947800Y-77858800D01*\nD33*\nX154947800Y-85418700D02*\nX154947800Y-85598000D01*\nX154947800Y-77858800D02*\nX154940000Y-77851000D01*\nX154940000Y-77851000D02*\nX154940000Y-77798700D01*\nD30*\nX167513000Y-85344000D02*\nX167513000Y-81534000D01*\nD32*\nX167513000Y-81534000D02*\nX167520800Y-81534000D01*\nD29*\nX154940000Y-108786700D02*\nX154940000Y-101219000D01*\nD33*\nX154940000Y-101219000D02*\nX154940000Y-101166700D01*\nD29*\nX142367000Y-108839000D02*\nX142367000Y-105029000D01*\nD32*\nX142367000Y-105029000D02*\nX142367000Y-104976700D01*\nD33*\nX153550800Y-108786700D02*\nX154940000Y-108786700D01*\nX154940000Y-108786700D02*\nX156344800Y-108786700D01*\nD30*\nX153550800Y-85418700D02*\nX154947800Y-85418700D01*\nX154947800Y-85418700D02*\nX156344800Y-85418700D01*\nD33*\nX153550800Y-101166700D02*\nX154940000Y-101166700D01*\nX154940000Y-101166700D02*\nX155074800Y-101166700D01*\nX155074800Y-101166700D02*\nX156344800Y-101166700D01*\nD31*\nX174632800Y-98118700D02*\nX173870800Y-97356700D01*\nX173870800Y-97356700D02*\nX173870800Y-96086700D01*\nX132468800Y-104976700D02*\nX142367000Y-104976700D01*\nD32*\nX142367000Y-104976700D02*\nX142374800Y-104976700D01*\nX136024800Y-96086700D02*\nX136024800Y-96856700D01*\nD29*\nX131960800Y-98880700D02*\nX131960800Y-104468700D01*\nD31*\nX132422800Y-98418700D02*\nX131960800Y-98880700D01*\nX134462800Y-98418700D02*\nX132422800Y-98418700D01*\nX136024800Y-96856700D02*\nX134462800Y-98418700D01*\nX131960800Y-104468700D02*\nX132468800Y-104976700D01*\nD29*\nX142374800Y-101166700D02*\nX142374800Y-104976700D01*\nD30*\nX153550800Y-104214700D02*\nX153550800Y-101166700D01*\nX152788800Y-104976700D02*\nX153550800Y-104214700D01*\nD31*\nX142374800Y-104976700D02*\nX152788800Y-104976700D01*\nD32*\nX177426800Y-104976700D02*\nX177998300Y-104405200D01*\nX177998300Y-104405200D02*\nX177934800Y-104468700D01*\nD30*\nX177934800Y-104468700D02*\nX177934800Y-98880700D01*\nX177934800Y-98880700D02*\nX177172800Y-98118700D01*\nD31*\nX177172800Y-98118700D02*\nX174632800Y-98118700D01*\nX173870800Y-73988700D02*\nX173870800Y-72718700D01*\nD30*\nX174632800Y-74750700D02*\nX173870800Y-73988700D01*\nD32*\nX131960800Y-81100700D02*\nX132024300Y-81164200D01*\nD33*\nX132024300Y-81164200D02*\nX132468800Y-81608700D01*\nX131960800Y-75512700D02*\nX131960800Y-81100700D01*\nD30*\nX177172800Y-74750700D02*\nX174632800Y-74750700D01*\nX177934800Y-75512700D02*\nX177172800Y-74750700D01*\nX177934800Y-81100700D02*\nX177934800Y-75512700D01*\nD31*\nX177426800Y-81608700D02*\nX177934800Y-81100700D01*\nD33*\nX132722800Y-74750700D02*\nX131960800Y-75512700D01*\nX135262800Y-74750700D02*\nX132722800Y-74750700D01*\nX136024800Y-73988700D02*\nX135262800Y-74750700D01*\nX136024800Y-72718700D02*\nX136024800Y-73988700D01*\nX132468800Y-81608700D02*\nX142367000Y-81608700D01*\nD32*\nX142367000Y-81608700D02*\nX142374800Y-81608700D01*\nX167520800Y-81608700D02*\nX167520800Y-81534000D01*\nD30*\nX167520800Y-81534000D02*\nX167520800Y-77798700D01*\nD31*\nX157106800Y-81608700D02*\nX167520800Y-81608700D01*\nX167520800Y-81608700D02*\nX177426800Y-81608700D01*\nD33*\nX153550800Y-77798700D02*\nX154940000Y-77798700D01*\nX154940000Y-77798700D02*\nX156344800Y-77798700D01*\nX142374800Y-81608700D02*\nX152788800Y-81608700D01*\nD30*\nX152788800Y-81608700D02*\nX153550800Y-80846700D01*\nX153550800Y-80846700D02*\nX153550800Y-77798700D01*\nX156344800Y-77798700D02*\nX156344800Y-80846700D01*\nX156344800Y-80846700D02*\nX157106800Y-81608700D01*\nX142374800Y-77798700D02*\nX142374800Y-81608700D01*\nD32*\nX133484800Y-72718700D02*\nX133738800Y-72464700D01*\nX133738800Y-72464700D02*\nX133484800Y-72718700D01*\nD29*\nX129420800Y-72718700D02*\nX133484800Y-72718700D01*\nD30*\nX180474800Y-72718700D02*\nX176410800Y-72718700D01*\nX180474800Y-96086700D02*\nX176410800Y-96086700D01*\nD32*\nX166410164Y-67016464D02*\nX166936536Y-67016464D01*\nD30*\nX169235300Y-64717700D02*\nX169235300Y-62558700D01*\nX166936536Y-67016464D02*\nX169235300Y-64717700D01*\nX165140164Y-68286464D02*\nX163616164Y-68286465D01*\nX159552164Y-64222465D02*\nX157266164Y-64222465D01*\nX163616164Y-68286465D02*\nX159552164Y-64222465D01*\nD32*\nX157266164Y-64222465D02*\nX157178971Y-64124429D01*\nX157262972Y-64194429D02*\nX157178971Y-64124429D01*\nD34*\nX128150800Y-75004700D02*\nX128150800Y-71448700D01*\nD33*\nX128658800Y-75512700D02*\nX128150800Y-75004700D01*\nX129420800Y-75512700D02*\nX128658800Y-75512700D01*\nX129928800Y-76020700D02*\nX129420800Y-75512700D01*\nX129928800Y-77544700D02*\nX129928800Y-76020700D01*\nD31*\nX127084050Y-75715950D02*\nX127084050Y-75584050D01*\nX126873000Y-75373000D02*\nX126873000Y-72644000D01*\nX127084050Y-75584050D02*\nX126873000Y-75373000D01*\nD34*\nX128150800Y-76782700D02*\nX127084050Y-75715950D01*\nX127084050Y-75715950D02*\nX126880800Y-75512700D01*\nX128150800Y-79576700D02*\nX128150800Y-76782700D01*\nD30*\nX126372800Y-81354700D02*\nX128150800Y-79576700D01*\nX126372800Y-85164700D02*\nX126372800Y-81354700D01*\nX181744800Y-73988700D02*\nX181744800Y-75004700D01*\nX179966800Y-76020700D02*\nX179966800Y-77290700D01*\nX180474800Y-75512700D02*\nX179966800Y-76020700D01*\nX181236800Y-75512700D02*\nX180474800Y-75512700D01*\nX181744800Y-75004700D02*\nX181236800Y-75512700D01*\nD32*\nX179966800Y-77290700D02*\nX180220800Y-77544700D01*\nD30*\nX183522800Y-85164700D02*\nX183522800Y-81354700D01*\nD34*\nX183014800Y-75512700D02*\nX183014800Y-72718700D01*\nX181744800Y-76782700D02*\nX183014800Y-75512700D01*\nX181744800Y-79576700D02*\nX181744800Y-76782700D01*\nD30*\nX183522800Y-81354700D02*\nX181744800Y-79576700D01*\nD32*\nX179966800Y-100658700D02*\nX180220800Y-100912700D01*\nD31*\nX179966800Y-99388700D02*\nX179966800Y-100658700D01*\nX180474800Y-98880700D02*\nX179966800Y-99388700D01*\nX181236800Y-98880700D02*\nX180474800Y-98880700D01*\nX181744800Y-98372700D02*\nX181236800Y-98880700D01*\nX181744800Y-97356700D02*\nX181744800Y-98372700D01*\nX183515000Y-108585000D02*\nX183515000Y-106115000D01*\nX183600000Y-96605000D02*\nX183007000Y-96012000D01*\nX183600000Y-98100000D02*\nX183600000Y-96605000D01*\nX181700000Y-100000000D02*\nX183600000Y-98100000D01*\nX181700000Y-104300000D02*\nX181700000Y-100000000D01*\nX183515000Y-106115000D02*\nX181700000Y-104300000D01*\nD30*\nX120650000Y-84328000D02*\nX122828000Y-84328000D01*\nD34*\nX127000000Y-88100000D02*\nX131483000Y-88100000D01*\nX131483000Y-88100000D02*\nX134239000Y-85344000D01*\nX125100000Y-88100000D02*\nX123200000Y-86200000D01*\nX123200000Y-86200000D02*\nX123200000Y-84700000D01*\nX123200000Y-84700000D02*\nX122900000Y-84400000D01*\nX127000000Y-88100000D02*\nX125100000Y-88100000D01*\nD30*\nX122828000Y-84328000D02*\nX122900000Y-84400000D01*\nD29*\nX137287000Y-85344000D02*\nX137287000Y-83439000D01*\nX137287000Y-80137000D02*\nX137287000Y-77724000D01*\nD32*\nX137040800Y-85164700D02*\nX137294800Y-85418700D01*\nD29*\nX134246800Y-85164700D02*\nX137040800Y-85164700D01*\nD30*\nX120650000Y-86868000D02*\nX121668000Y-86868000D01*\nD34*\nX123900000Y-89100000D02*\nX122800000Y-88000000D01*\nX141659000Y-89100000D02*\nX145415000Y-85344000D01*\nX141659000Y-89100000D02*\nX123900000Y-89100000D01*\nD30*\nX121668000Y-86868000D02*\nX122800000Y-88000000D01*\nX148463000Y-85344000D02*\nX148463000Y-83185000D01*\nX148463000Y-79502000D02*\nX148463000Y-77724000D01*\nD32*\nX148336000Y-79629000D02*\nX148463000Y-79502000D01*\nD30*\nX148470800Y-85418700D02*\nX145422800Y-85418700D01*\nX120650000Y-91948000D02*\nX123152000Y-91948000D01*\nD34*\nX141100000Y-91300000D02*\nX123800000Y-91300000D01*\nX123800000Y-91300000D02*\nX123300000Y-91800000D01*\nD30*\nX165237000Y-92700000D02*\nX172593000Y-85344000D01*\nX142500000Y-92700000D02*\nX165237000Y-92700000D01*\nD34*\nX142050000Y-92250000D02*\nX142500000Y-92700000D01*\nX142050000Y-92250000D02*\nX141100000Y-91300000D01*\nD30*\nX123152000Y-91948000D02*\nX123300000Y-91800000D01*\nX175641000Y-85217000D02*\nX172720000Y-85217000D01*\nX172720000Y-85217000D02*\nX172593000Y-85344000D01*\nX172593000Y-85344000D02*\nX172593000Y-83312000D01*\nX172593000Y-80137000D02*\nX172593000Y-77724000D01*\nD32*\nX172600800Y-85418700D02*\nX172854800Y-85164700D01*\nD30*\nX120650000Y-89408000D02*\nX122108000Y-89408000D01*\nX122108000Y-89408000D02*\nX122800000Y-90100000D01*\nD34*\nX142100000Y-90100000D02*\nX122800000Y-90100000D01*\nX142100000Y-90100000D02*\nX143000000Y-91000000D01*\nD30*\nX143000000Y-91000000D02*\nX158936000Y-91000000D01*\nX164465000Y-85471000D02*\nX158936000Y-91000000D01*\nD34*\nX122800000Y-90100000D02*\nX122900000Y-90200000D01*\nD30*\nX161417000Y-85344000D02*\nX161417000Y-83439000D01*\nX161417000Y-80010000D02*\nX161417000Y-77724000D01*\nX161424800Y-85418700D02*\nX165234800Y-85418700D01*\nX120650000Y-104648000D02*\nX122548000Y-104648000D01*\nD34*\nX123500000Y-105600000D02*\nX122750000Y-104850000D01*\nX123500000Y-110100000D02*\nX123500000Y-105600000D01*\nX124900000Y-111500000D02*\nX123500000Y-110100000D01*\nD31*\nX131100000Y-111500000D02*\nX124900000Y-111500000D01*\nX131100000Y-111500000D02*\nX134142000Y-108458000D01*\nD30*\nX122548000Y-104648000D02*\nX122750000Y-104850000D01*\nD34*\nX134239000Y-108458000D02*\nX134142000Y-108458000D01*\nD30*\nX137287000Y-108839000D02*\nX137287000Y-106680000D01*\nX137287000Y-103505000D02*\nX137287000Y-101219000D01*\nD32*\nX137040800Y-108532700D02*\nX137294800Y-108786700D01*\nD30*\nX134246800Y-108532700D02*\nX137040800Y-108532700D01*\nD32*\nX120653400Y-104651400D02*\nX120650000Y-104648000D01*\nD30*\nX116100000Y-105700000D02*\nX116100000Y-105400000D01*\nD31*\nX175641000Y-110559000D02*\nX171100000Y-115100000D01*\nX171100000Y-115100000D02*\nX119900000Y-115100000D01*\nX119900000Y-115100000D02*\nX116100000Y-111300000D01*\nX116100000Y-111300000D02*\nX116100000Y-105700000D01*\nX175641000Y-108585000D02*\nX175641000Y-110559000D01*\nD30*\nX116852000Y-104648000D02*\nX118110000Y-104648000D01*\nX116100000Y-105400000D02*\nX116852000Y-104648000D01*\nX172593000Y-108712000D02*\nX172593000Y-106934000D01*\nX172593000Y-103378000D02*\nX172593000Y-101092000D01*\nX175641000Y-108585000D02*\nX172720000Y-108585000D01*\nD32*\nX172720000Y-108585000D02*\nX172593000Y-108712000D01*\nD28*\nX164973000Y-65786000D02*\nX164973000Y-61515307D01*\nX164700000Y-61242307D02*\nX163108164Y-59650464D01*\nX163108164Y-59650464D02*\nX161584164Y-59650465D01*\nX164973000Y-61515307D02*\nX164700000Y-61242307D01*\nD30*\nX129420800Y-96086700D02*\nX133484800Y-96086700D01*\nD32*\nX133738800Y-95832700D02*\nX133484800Y-96086700D01*\nX133484800Y-96086700D02*\nX133738800Y-95832700D01*\nD31*\nX129928800Y-99388700D02*\nX129420800Y-98880700D01*\nX129420800Y-98880700D02*\nX128658800Y-98880700D01*\nX128658800Y-98880700D02*\nX128150800Y-98372700D01*\nX129928800Y-100912700D02*\nX129928800Y-99388700D01*\nD34*\nX128150800Y-98372700D02*\nX128150800Y-94816700D01*\nD28*\nX126372800Y-104722700D02*\nX128150800Y-102944700D01*\nD34*\nX128150800Y-102944700D02*\nX128150800Y-100150700D01*\nX128150800Y-100150700D02*\nX126880800Y-98880700D01*\nD28*\nX126372800Y-108532700D02*\nX126372800Y-104722700D01*\nD31*\nX126880800Y-98880700D02*\nX126880800Y-96086700D01*\nD34*\nX120650000Y-107188000D02*\nX122488000Y-107188000D01*\nD31*\nX141800000Y-112700000D02*\nX145415000Y-109085000D01*\nX141800000Y-112700000D02*\nX124100000Y-112700000D01*\nD34*\nX124100000Y-112700000D02*\nX122600000Y-111200000D01*\nX122600000Y-107300000D02*\nX122600000Y-111200000D01*\nX122488000Y-107188000D02*\nX122600000Y-107300000D01*\nD30*\nX145415000Y-108966000D02*\nX145415000Y-109085000D01*\nX148463000Y-108839000D02*\nX148463000Y-106934000D01*\nX148463000Y-103505000D02*\nX148463000Y-101219000D01*\nX148470800Y-108786700D02*\nX145422800Y-108786700D01*\nD32*\nX145422800Y-108786700D02*\nX144660800Y-108786700D01*\nD30*\nX120650000Y-109728000D02*\nX120650000Y-111350000D01*\nD31*\nX160300000Y-113900000D02*\nX123200000Y-113900000D01*\nX123200000Y-113900000D02*\nX120900000Y-111600000D01*\nX160300000Y-113900000D02*\nX164465000Y-109735000D01*\nD30*\nX120650000Y-111350000D02*\nX120900000Y-111600000D01*\nD34*\nX164465000Y-108839000D02*\nX164465000Y-109735000D01*\nD30*\nX161417000Y-108712000D02*\nX161417000Y-106934000D01*\nX161417000Y-103759000D02*\nX161417000Y-101092000D01*\nX164465000Y-108839000D02*\nX161544000Y-108839000D01*\nD32*\nX161544000Y-108839000D02*\nX161417000Y-108712000D01*\nD29*\nX118110000Y-61468000D02*\nX118110000Y-60190000D01*\nX124665100Y-59200000D02*\nX127007800Y-61542700D01*\nX119100000Y-59200000D02*\nX124665100Y-59200000D01*\nX118110000Y-60190000D02*\nX119100000Y-59200000D01*\nX120650000Y-61468000D02*\nX122968000Y-61468000D01*\nX124882700Y-64082700D02*\nX127007800Y-64082700D01*\nX124000000Y-63200000D02*\nX124882700Y-64082700D01*\nX124000000Y-62500000D02*\nX124000000Y-63200000D01*\nX122968000Y-61468000D02*\nX124000000Y-62500000D01*\nD30*\nX120650000Y-81788000D02*\nX122488000Y-81788000D01*\nX122488000Y-81788000D02*\nX122600000Y-81900000D01*\nD34*\nX127400000Y-87100000D02*\nX125500000Y-87100000D01*\nX122600000Y-81900000D02*\nX122500000Y-81900000D01*\nX124300000Y-83600000D02*\nX122600000Y-81900000D01*\nX124300000Y-85900000D02*\nX124300000Y-83600000D01*\nX125500000Y-87100000D02*\nX124300000Y-85900000D01*\nD31*\nX129921000Y-86579000D02*\nX129921000Y-85217000D01*\nX129400000Y-87100000D02*\nX129921000Y-86579000D01*\nD34*\nX127400000Y-87100000D02*\nX129400000Y-87100000D01*\nD30*\nX120650000Y-94488000D02*\nX123012000Y-94488000D01*\nD34*\nX140500000Y-93400000D02*\nX139400000Y-92300000D01*\nX139400000Y-92300000D02*\nX125200000Y-92300000D01*\nX125200000Y-92300000D02*\nX123200000Y-94300000D01*\nD30*\nX180086000Y-87214000D02*\nX180086000Y-85217000D01*\nD34*\nX142700000Y-94900000D02*\nX141200000Y-93400000D01*\nD30*\nX166500000Y-94900000D02*\nX142700000Y-94900000D01*\nX171100000Y-90300000D02*\nX166500000Y-94900000D01*\nX177000000Y-90300000D02*\nX171100000Y-90300000D01*\nX180086000Y-87214000D02*\nX177000000Y-90300000D01*\nD34*\nX141200000Y-93400000D02*\nX140500000Y-93400000D01*\nD30*\nX123012000Y-94488000D02*\nX123200000Y-94300000D01*\nD32*\nX179966800Y-85164700D02*\nX180220800Y-85164700D01*\nD30*\nX120650000Y-102108000D02*\nX123408000Y-102108000D01*\nD34*\nX124500000Y-103200000D02*\nX123250000Y-101950000D01*\nX124500000Y-109300000D02*\nX124500000Y-103200000D01*\nX125600000Y-110400000D02*\nX124500000Y-109300000D01*\nX127900000Y-110400000D02*\nX125600000Y-110400000D01*\nD31*\nX127900000Y-110400000D02*\nX129842000Y-108458000D01*\nD30*\nX123408000Y-102108000D02*\nX123250000Y-101950000D01*\nD34*\nX129921000Y-108458000D02*\nX129842000Y-108458000D01*\nD30*\nX115800000Y-102600000D02*\nX116300000Y-102100000D01*\nD31*\nX179959000Y-110841000D02*\nX174400000Y-116400000D01*\nX174400000Y-116400000D02*\nX118500000Y-116400000D01*\nX118500000Y-116400000D02*\nX114800000Y-112700000D01*\nX114800000Y-112700000D02*\nX114800000Y-103600000D01*\nX114800000Y-103600000D02*\nX115800000Y-102600000D01*\nX179959000Y-108585000D02*\nX179959000Y-110841000D01*\nD30*\nX116300000Y-102100000D02*\nX118102000Y-102100000D01*\nX118102000Y-102100000D02*\nX118110000Y-102108000D01*\nX118110000Y-71628000D02*\nX115400000Y-71628000D01*\nX114600000Y-64700000D02*\nX115400000Y-65500000D01*\nX115400000Y-65500000D02*\nX115400000Y-71800000D01*\nD28*\nX159811000Y-62611000D02*\nX161544000Y-62611000D01*\nX157600000Y-60400000D02*\nX159811000Y-62611000D01*\nX157600000Y-58667000D02*\nX157600000Y-60400000D01*\nX153733000Y-54800000D02*\nX157600000Y-58667000D01*\nX117400000Y-54800000D02*\nX153733000Y-54800000D01*\nD30*\nX114600000Y-57600000D02*\nX117400000Y-54800000D01*\nX114600000Y-57600000D02*\nX114600000Y-64700000D01*\nX115400000Y-71628000D02*\nX115400000Y-71800000D01*\nD29*\nX145415000Y-97300000D02*\nX151200000Y-97300000D01*\nX158600000Y-97200000D02*\nX169200000Y-97200000D01*\nX158200000Y-96800000D02*\nX158600000Y-97200000D01*\nD30*\nX151700000Y-96800000D02*\nX158200000Y-96800000D01*\nX151200000Y-97300000D02*\nX151700000Y-96800000D01*\nX170900000Y-98900000D02*\nX169200000Y-97200000D01*\nX173500000Y-98900000D02*\nX170900000Y-98900000D01*\nX175565000Y-100965000D02*\nX173500000Y-98900000D01*\nD29*\nX164465000Y-97965000D02*\nX164400000Y-97900000D01*\nX164465000Y-101219000D02*\nX164465000Y-97965000D01*\nX145415000Y-101346000D02*\nX145415000Y-97300000D01*\nX145415000Y-97300000D02*\nX145415000Y-97200000D01*\nD30*\nX175641000Y-100965000D02*\nX175565000Y-100965000D01*\nD29*\nX138400000Y-98900000D02*\nX138700000Y-98900000D01*\nD30*\nX136200000Y-98900000D02*\nX138400000Y-98900000D01*\nX134262000Y-100838000D02*\nX136200000Y-98900000D01*\nD29*\nX138700000Y-98900000D02*\nX140400000Y-97200000D01*\nX145500000Y-97500000D02*\nX145500000Y-97200000D01*\nX145500000Y-97285000D02*\nX145500000Y-97500000D01*\nX145415000Y-97200000D02*\nX145500000Y-97285000D01*\nX139400000Y-94700000D02*\nX139400000Y-96200000D01*\nX139400000Y-96200000D02*\nX140400000Y-97200000D01*\nX171700000Y-93200000D02*\nX183300000Y-93200000D01*\nX169200000Y-97200000D02*\nX171100000Y-95300000D01*\nX171100000Y-95300000D02*\nX171100000Y-93800000D01*\nX171100000Y-93800000D02*\nX171700000Y-93200000D01*\nX140400000Y-97200000D02*\nX145500000Y-97200000D01*\nD30*\nX183250000Y-93150000D02*\nX183300000Y-93200000D01*\nD28*\nX183300000Y-93200000D02*\nX185900000Y-95800000D01*\nX183515000Y-100965000D02*\nX185900000Y-98580000D01*\nX185900000Y-95800000D02*\nX185900000Y-98580000D01*\nX183700000Y-92900000D02*\nX186316800Y-90283200D01*\nD29*\nX186316800Y-90283200D02*\nX186316800Y-75004700D01*\nD28*\nX185618300Y-68273700D02*\nX180093800Y-68273700D01*\nD29*\nX186316800Y-68972200D02*\nX185935800Y-68591200D01*\nD33*\nX185935800Y-68591200D02*\nX185618300Y-68273700D01*\nD29*\nX186316800Y-75004700D02*\nX186316800Y-68972200D01*\nD31*\nX134239000Y-100838000D02*\nX134262000Y-100838000D01*\nX126365000Y-100838000D02*\nX126338000Y-100838000D01*\nX126338000Y-100838000D02*\nX125000000Y-99500000D01*\nX125000000Y-99500000D02*\nX125000000Y-95200000D01*\nX125000000Y-95200000D02*\nX126700000Y-93500000D01*\nX126700000Y-93500000D02*\nX138200000Y-93500000D01*\nX138200000Y-93500000D02*\nX139400000Y-94700000D01*\nD30*\nX139400000Y-94700000D02*\nX139200000Y-94500000D01*\nD28*\nX170500000Y-75500000D02*\nX170500000Y-68273700D01*\nD29*\nX170500000Y-68273700D02*\nX170010000Y-68273700D01*\nD28*\nX164465000Y-77851000D02*\nX164465000Y-76285000D01*\nX165250000Y-75500000D02*\nX170500000Y-75500000D01*\nD30*\nX170500000Y-75500000D02*\nX171250000Y-75500000D01*\nD28*\nX164465000Y-76285000D02*\nX165250000Y-75500000D01*\nD30*\nX173544000Y-75500000D02*\nX175641000Y-77597000D01*\nX171250000Y-75500000D02*\nX173544000Y-75500000D01*\nD28*\nX145415000Y-77724000D02*\nX145415000Y-75665000D01*\nX144000000Y-74250000D02*\nX140500000Y-74250000D01*\nX145415000Y-75665000D02*\nX144000000Y-74250000D01*\nD31*\nX134239000Y-77724000D02*\nX134239000Y-77511000D01*\nX134239000Y-77511000D02*\nX136500000Y-75250000D01*\nD29*\nX136500000Y-75250000D02*\nX139500000Y-75250000D01*\nX139500000Y-75250000D02*\nX140500000Y-74250000D01*\nD28*\nX140500000Y-74250000D02*\nX140500000Y-71250000D01*\nX140500000Y-71250000D02*\nX137750000Y-68500000D01*\nX137750000Y-68500000D02*\nX129250000Y-68500000D01*\nD30*\nX129250000Y-68500000D02*\nX129250000Y-68750000D01*\nD31*\nX126365000Y-77597000D02*\nX126347000Y-77597000D01*\nD29*\nX126347000Y-77597000D02*\nX123200000Y-74450000D01*\nX123200000Y-74450000D02*\nX123200000Y-73050000D01*\nD28*\nX123200000Y-73050000D02*\nX127500000Y-68750000D01*\nX127500000Y-68750000D02*\nX129250000Y-68750000D01*\nD30*\nX129250000Y-68750000D02*\nX129000000Y-68750000D01*\nX129000000Y-68750000D02*\nX129547800Y-68202200D01*\nD28*\nX129547800Y-68202200D02*\nX129547800Y-64082700D01*\nX129547800Y-61542700D02*\nX129547800Y-64082700D01*\nX131000000Y-64082700D02*\nX129547800Y-64082700D01*\nX159974000Y-67750000D02*\nX150322000Y-67750000D01*\nX150322000Y-67750000D02*\nX146642000Y-64070000D01*\nX146642000Y-64070000D02*\nX142070000Y-64070000D01*\nD33*\nX142070000Y-64070000D02*\nX142070000Y-64082700D01*\nD28*\nX170010000Y-68273700D02*\nX168726300Y-68273700D01*\nX163224000Y-71000000D02*\nX159974000Y-67750000D01*\nX166000000Y-71000000D02*\nX163224000Y-71000000D01*\nX168726300Y-68273700D02*\nX166000000Y-71000000D01*\nD33*\nX171457800Y-68273700D02*\nX170010000Y-68273700D01*\nD28*\nX180093800Y-68273700D02*\nX171457800Y-68273700D01*\nD33*\nX170010000Y-68273700D02*\nX169806800Y-68273700D01*\nX142438300Y-64082700D02*\nX142070000Y-64082700D01*\nD28*\nX142070000Y-64082700D02*\nX131000000Y-64082700D01*\nD33*\nX131000000Y-64082700D02*\nX130817800Y-64082700D01*\nX132722800Y-64082700D02*\nX130817800Y-64082700D01*\nD28*\nX171521300Y-59637700D02*\nX171521300Y-59650464D01*\nD29*\nX169204164Y-59650464D02*\nX171521300Y-59650464D01*\nD33*\nX171521300Y-59650464D02*\nX171534064Y-59650464D01*\nD28*\nX171534064Y-59650464D02*\nX180093800Y-68210200D01*\nD33*\nX180093800Y-68210200D02*\nX180093800Y-68273700D01*\nD32*\nX145422800Y-101166700D02*\nX145422800Y-100658700D01*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/simonShield-B.Mask.gbr",
    "content": "G04 #@! TF.FileFunction,Soldermask,Bot*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\n%ADD12C,2.000000*%\n%ADD13O,2.000000X2.000000*%\n%ADD14R,2.400000X1.924000*%\n%ADD15O,2.400000X1.924000*%\n%ADD16R,1.700000X1.700000*%\n%ADD17C,1.700000*%\n%ADD18C,2.398980*%\n%ADD19R,2.300000X2.400000*%\n%ADD20C,2.300000*%\n%ADD21R,2.127200X2.127200*%\n%ADD22O,2.127200X2.127200*%\n%ADD23C,1.400760*%\n%ADD24C,1.797000*%\n%ADD25C,2.000200*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nD12*\nX145400000Y-68800000D03*\nD13*\nX145400000Y-58640000D03*\nD14*\nX189230000Y-61468000D03*\nD15*\nX191770000Y-61468000D03*\nX189230000Y-74168000D03*\nX189230000Y-109728000D03*\nX191770000Y-109728000D03*\nX191770000Y-97028000D03*\nD14*\nX118110000Y-61468000D03*\nD15*\nX120650000Y-61468000D03*\nX118110000Y-64008000D03*\nX120650000Y-64008000D03*\nX118110000Y-66548000D03*\nX120650000Y-66548000D03*\nX118110000Y-69088000D03*\nX120650000Y-69088000D03*\nX118110000Y-71628000D03*\nX120650000Y-71628000D03*\nX118110000Y-74168000D03*\nX120650000Y-74168000D03*\nX118110000Y-76708000D03*\nX120650000Y-76708000D03*\nX118110000Y-79248000D03*\nX120650000Y-79248000D03*\nX118110000Y-81788000D03*\nX120650000Y-81788000D03*\nX118110000Y-84328000D03*\nX120650000Y-84328000D03*\nX118110000Y-86868000D03*\nX120650000Y-86868000D03*\nX118110000Y-89408000D03*\nX120650000Y-89408000D03*\nX118110000Y-91948000D03*\nX120650000Y-91948000D03*\nX118110000Y-94488000D03*\nX120650000Y-94488000D03*\nX118110000Y-97028000D03*\nX120650000Y-97028000D03*\nX118110000Y-99568000D03*\nX120650000Y-99568000D03*\nX118110000Y-102108000D03*\nX120650000Y-102108000D03*\nX118110000Y-104648000D03*\nX120650000Y-104648000D03*\nX118110000Y-107188000D03*\nX120650000Y-107188000D03*\nX118110000Y-109728000D03*\nX120650000Y-109728000D03*\nD16*\nX135255000Y-64008000D03*\nD17*\nX135255000Y-61508000D03*\nD18*\nX164465000Y-85471000D03*\nX164465000Y-77851000D03*\nD19*\nX136017000Y-72644000D03*\nD20*\nX133477000Y-72644000D03*\nD19*\nX173863000Y-72644000D03*\nD20*\nX176403000Y-72644000D03*\nD19*\nX136017000Y-96139000D03*\nD20*\nX133477000Y-96139000D03*\nD19*\nX173863000Y-96012000D03*\nD20*\nX176403000Y-96012000D03*\nD21*\nX127007800Y-61542700D03*\nD22*\nX129547800Y-61542700D03*\nX127007800Y-64082700D03*\nX129547800Y-64082700D03*\nD23*\nX166243000Y-67056000D03*\nX164973000Y-68326000D03*\nX164973000Y-65786000D03*\nX128143000Y-71374000D03*\nX129413000Y-72644000D03*\nX126873000Y-72644000D03*\nX181737000Y-73914000D03*\nX180467000Y-72644000D03*\nX183007000Y-72644000D03*\nX128143000Y-94742000D03*\nX129413000Y-96012000D03*\nX126873000Y-96012000D03*\nX181737000Y-97282000D03*\nX180467000Y-96012000D03*\nX183007000Y-96012000D03*\nD18*\nX134239000Y-85344000D03*\nX134239000Y-77724000D03*\nX145415000Y-85344000D03*\nX145415000Y-77724000D03*\nX175641000Y-85217000D03*\nX175641000Y-77597000D03*\nX145415000Y-108966000D03*\nX145415000Y-101346000D03*\nX134239000Y-108458000D03*\nX134239000Y-100838000D03*\nX175641000Y-108585000D03*\nX175641000Y-100965000D03*\nX164465000Y-108839000D03*\nX164465000Y-101219000D03*\nX169164000Y-62611000D03*\nX161544000Y-62611000D03*\nX169164000Y-59563000D03*\nX161544000Y-59563000D03*\nX129921000Y-85217000D03*\nX129921000Y-77597000D03*\nX126365000Y-85217000D03*\nX126365000Y-77597000D03*\nX180086000Y-85217000D03*\nX180086000Y-77597000D03*\nX183515000Y-85217000D03*\nX183515000Y-77597000D03*\nX129921000Y-108458000D03*\nX129921000Y-100838000D03*\nX126365000Y-108458000D03*\nX126365000Y-100838000D03*\nX179959000Y-108585000D03*\nX179959000Y-100965000D03*\nX183515000Y-108585000D03*\nX183515000Y-100965000D03*\nD12*\nX155000000Y-99000000D03*\nD13*\nX155000000Y-88840000D03*\nD24*\nX137287000Y-77724000D03*\nX142367000Y-77724000D03*\nX137287000Y-85344000D03*\nX142367000Y-85344000D03*\nX148463000Y-77724000D03*\nX153543000Y-77724000D03*\nX148463000Y-85344000D03*\nX153543000Y-85344000D03*\nX172593000Y-85344000D03*\nX167513000Y-85344000D03*\nX172593000Y-77724000D03*\nX167513000Y-77724000D03*\nX161417000Y-85344000D03*\nX156337000Y-85344000D03*\nX161417000Y-77724000D03*\nX156337000Y-77724000D03*\nX148463000Y-101219000D03*\nX153543000Y-101219000D03*\nX148463000Y-108839000D03*\nX153543000Y-108839000D03*\nX137287000Y-101219000D03*\nX142367000Y-101219000D03*\nX137287000Y-108839000D03*\nX142367000Y-108839000D03*\nX172593000Y-108712000D03*\nX167513000Y-108712000D03*\nX172593000Y-101092000D03*\nX167513000Y-101092000D03*\nX161417000Y-108712000D03*\nX156337000Y-108712000D03*\nX161417000Y-101092000D03*\nX156337000Y-101092000D03*\nD25*\nX157178971Y-64124429D03*\nX150828971Y-64124429D03*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/simonShield-Edge.Cuts.gbr",
    "content": "G04 #@! TF.FileFunction,Profile,NP*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/simonShield-F.Cu.gbr",
    "content": "G04 #@! TF.FileFunction,Copper,L1,Top,Signal*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\n%ADD12C,1.600000*%\n%ADD13O,1.600000X1.600000*%\n%ADD14R,2.000000X1.524000*%\n%ADD15O,2.000000X1.524000*%\n%ADD16R,1.300000X1.300000*%\n%ADD17C,1.300000*%\n%ADD18C,1.998980*%\n%ADD19R,1.900000X2.000000*%\n%ADD20C,1.900000*%\n%ADD21C,1.000000*%\n%ADD22R,1.727200X1.727200*%\n%ADD23O,1.727200X1.727200*%\n%ADD24C,1.000760*%\n%ADD25C,1.397000*%\n%ADD26C,1.600200*%\n%ADD27C,1.270000*%\n%ADD28C,0.304800*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nD12*\nX145400000Y-68800000D03*\nD13*\nX145400000Y-58640000D03*\nD14*\nX189230000Y-61468000D03*\nD15*\nX191770000Y-61468000D03*\nX189230000Y-74168000D03*\nX191770000Y-64008000D03*\nX189230000Y-76708000D03*\nX191770000Y-66548000D03*\nX189230000Y-79248000D03*\nX191770000Y-69088000D03*\nX189230000Y-81788000D03*\nX191770000Y-71628000D03*\nX189230000Y-84328000D03*\nX191770000Y-74168000D03*\nX189230000Y-86868000D03*\nX191770000Y-76708000D03*\nX189230000Y-89408000D03*\nX191770000Y-79248000D03*\nX189230000Y-91948000D03*\nX191770000Y-81788000D03*\nX189230000Y-94488000D03*\nX191770000Y-84328000D03*\nX189230000Y-97028000D03*\nX191770000Y-86868000D03*\nX189230000Y-99568000D03*\nX191770000Y-89408000D03*\nX191770000Y-91948000D03*\nX189230000Y-102108000D03*\nX191770000Y-94488000D03*\nX191770000Y-99568000D03*\nX191770000Y-102108000D03*\nX191770000Y-104648000D03*\nX191770000Y-107188000D03*\nX189230000Y-104648000D03*\nX189230000Y-107188000D03*\nX189230000Y-64008000D03*\nX189230000Y-66548000D03*\nX189230000Y-69088000D03*\nX189230000Y-71628000D03*\nX189230000Y-109728000D03*\nX191770000Y-109728000D03*\nX191770000Y-97028000D03*\nD14*\nX118110000Y-61468000D03*\nD15*\nX120650000Y-61468000D03*\nX118110000Y-64008000D03*\nX120650000Y-64008000D03*\nX118110000Y-66548000D03*\nX120650000Y-66548000D03*\nX118110000Y-69088000D03*\nX120650000Y-69088000D03*\nX118110000Y-71628000D03*\nX120650000Y-71628000D03*\nX118110000Y-74168000D03*\nX120650000Y-74168000D03*\nX118110000Y-76708000D03*\nX120650000Y-76708000D03*\nX118110000Y-79248000D03*\nX120650000Y-79248000D03*\nX118110000Y-81788000D03*\nX120650000Y-81788000D03*\nX118110000Y-84328000D03*\nX120650000Y-84328000D03*\nX118110000Y-86868000D03*\nX120650000Y-86868000D03*\nX118110000Y-89408000D03*\nX120650000Y-89408000D03*\nX118110000Y-91948000D03*\nX120650000Y-91948000D03*\nX118110000Y-94488000D03*\nX120650000Y-94488000D03*\nX118110000Y-97028000D03*\nX120650000Y-97028000D03*\nX118110000Y-99568000D03*\nX120650000Y-99568000D03*\nX118110000Y-102108000D03*\nX120650000Y-102108000D03*\nX118110000Y-104648000D03*\nX120650000Y-104648000D03*\nX118110000Y-107188000D03*\nX120650000Y-107188000D03*\nX118110000Y-109728000D03*\nX120650000Y-109728000D03*\nD16*\nX135255000Y-64008000D03*\nD17*\nX135255000Y-61508000D03*\nD18*\nX164465000Y-85471000D03*\nX164465000Y-77851000D03*\nD19*\nX136017000Y-72644000D03*\nD20*\nX133477000Y-72644000D03*\nD19*\nX173863000Y-72644000D03*\nD20*\nX176403000Y-72644000D03*\nD19*\nX136017000Y-96139000D03*\nD20*\nX133477000Y-96139000D03*\nD19*\nX173863000Y-96012000D03*\nD20*\nX176403000Y-96012000D03*\nD21*\nX125250000Y-112250000D03*\nX160500000Y-70500000D03*\nX167250000Y-92250000D03*\nD22*\nX127007800Y-61542700D03*\nD23*\nX129547800Y-61542700D03*\nX127007800Y-64082700D03*\nX129547800Y-64082700D03*\nD24*\nX166243000Y-67056000D03*\nX164973000Y-68326000D03*\nX164973000Y-65786000D03*\nX128143000Y-71374000D03*\nX129413000Y-72644000D03*\nX126873000Y-72644000D03*\nX181737000Y-73914000D03*\nX180467000Y-72644000D03*\nX183007000Y-72644000D03*\nX128143000Y-94742000D03*\nX129413000Y-96012000D03*\nX126873000Y-96012000D03*\nX181737000Y-97282000D03*\nX180467000Y-96012000D03*\nX183007000Y-96012000D03*\nD18*\nX134239000Y-85344000D03*\nX134239000Y-77724000D03*\nX145415000Y-85344000D03*\nX145415000Y-77724000D03*\nX175641000Y-85217000D03*\nX175641000Y-77597000D03*\nX145415000Y-108966000D03*\nX145415000Y-101346000D03*\nX134239000Y-108458000D03*\nX134239000Y-100838000D03*\nX175641000Y-108585000D03*\nX175641000Y-100965000D03*\nX164465000Y-108839000D03*\nX164465000Y-101219000D03*\nX169164000Y-62611000D03*\nX161544000Y-62611000D03*\nX169164000Y-59563000D03*\nX161544000Y-59563000D03*\nX129921000Y-85217000D03*\nX129921000Y-77597000D03*\nX126365000Y-85217000D03*\nX126365000Y-77597000D03*\nX180086000Y-85217000D03*\nX180086000Y-77597000D03*\nX183515000Y-85217000D03*\nX183515000Y-77597000D03*\nX129921000Y-108458000D03*\nX129921000Y-100838000D03*\nX126365000Y-108458000D03*\nX126365000Y-100838000D03*\nX179959000Y-108585000D03*\nX179959000Y-100965000D03*\nX183515000Y-108585000D03*\nX183515000Y-100965000D03*\nD12*\nX155000000Y-99000000D03*\nD13*\nX155000000Y-88840000D03*\nD25*\nX137287000Y-77724000D03*\nX142367000Y-77724000D03*\nX137287000Y-85344000D03*\nX142367000Y-85344000D03*\nX148463000Y-77724000D03*\nX153543000Y-77724000D03*\nX148463000Y-85344000D03*\nX153543000Y-85344000D03*\nX172593000Y-85344000D03*\nX167513000Y-85344000D03*\nX172593000Y-77724000D03*\nX167513000Y-77724000D03*\nX161417000Y-85344000D03*\nX156337000Y-85344000D03*\nX161417000Y-77724000D03*\nX156337000Y-77724000D03*\nX148463000Y-101219000D03*\nX153543000Y-101219000D03*\nX148463000Y-108839000D03*\nX153543000Y-108839000D03*\nX137287000Y-101219000D03*\nX142367000Y-101219000D03*\nX137287000Y-108839000D03*\nX142367000Y-108839000D03*\nX172593000Y-108712000D03*\nX167513000Y-108712000D03*\nX172593000Y-101092000D03*\nX167513000Y-101092000D03*\nX161417000Y-108712000D03*\nX156337000Y-108712000D03*\nX161417000Y-101092000D03*\nX156337000Y-101092000D03*\nD26*\nX157178971Y-64124429D03*\nX150828971Y-64124429D03*\nD27*\nX137287000Y-80137000D03*\nX137287000Y-83439000D03*\nX148336000Y-79629000D03*\nX148463000Y-83185000D03*\nX172593000Y-80137000D03*\nX172593000Y-83312000D03*\nX161417000Y-80010000D03*\nX161417000Y-83439000D03*\nX137287000Y-103505000D03*\nX137287000Y-106680000D03*\nX172593000Y-103378000D03*\nX172593000Y-106934000D03*\nX148463000Y-103505000D03*\nX148463000Y-106934000D03*\nX161417000Y-103759000D03*\nX161417000Y-106934000D03*\nD28*\nX137287000Y-83439000D02*\nX137287000Y-80137000D01*\nX148336000Y-83058000D02*\nX148336000Y-79629000D01*\nX148463000Y-83185000D02*\nX148336000Y-83058000D01*\nX172593000Y-83312000D02*\nX172593000Y-80137000D01*\nX161417000Y-83439000D02*\nX161417000Y-80010000D01*\nX137287000Y-106680000D02*\nX137287000Y-103505000D01*\nX172593000Y-106934000D02*\nX172593000Y-103378000D01*\nX148463000Y-106934000D02*\nX148463000Y-103505000D01*\nX161417000Y-106934000D02*\nX161417000Y-103759000D01*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/simonShield-F.Mask.gbr",
    "content": "G04 #@! TF.FileFunction,Soldermask,Top*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\n%ADD12C,2.000000*%\n%ADD13O,2.000000X2.000000*%\n%ADD14R,2.400000X1.924000*%\n%ADD15O,2.400000X1.924000*%\n%ADD16R,1.700000X1.700000*%\n%ADD17C,1.700000*%\n%ADD18C,2.398980*%\n%ADD19R,2.300000X2.400000*%\n%ADD20C,2.300000*%\n%ADD21C,4.000000*%\n%ADD22R,2.127200X2.127200*%\n%ADD23O,2.127200X2.127200*%\n%ADD24C,1.400760*%\n%ADD25C,1.797000*%\n%ADD26C,2.000200*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nD12*\nX145400000Y-68800000D03*\nD13*\nX145400000Y-58640000D03*\nD14*\nX189230000Y-61468000D03*\nD15*\nX191770000Y-61468000D03*\nX189230000Y-74168000D03*\nX191770000Y-64008000D03*\nX189230000Y-76708000D03*\nX191770000Y-66548000D03*\nX189230000Y-79248000D03*\nX191770000Y-69088000D03*\nX189230000Y-81788000D03*\nX191770000Y-71628000D03*\nX189230000Y-84328000D03*\nX191770000Y-74168000D03*\nX189230000Y-86868000D03*\nX191770000Y-76708000D03*\nX189230000Y-89408000D03*\nX191770000Y-79248000D03*\nX189230000Y-91948000D03*\nX191770000Y-81788000D03*\nX189230000Y-94488000D03*\nX191770000Y-84328000D03*\nX189230000Y-97028000D03*\nX191770000Y-86868000D03*\nX189230000Y-99568000D03*\nX191770000Y-89408000D03*\nX191770000Y-91948000D03*\nX189230000Y-102108000D03*\nX191770000Y-94488000D03*\nX191770000Y-99568000D03*\nX191770000Y-102108000D03*\nX191770000Y-104648000D03*\nX191770000Y-107188000D03*\nX189230000Y-104648000D03*\nX189230000Y-107188000D03*\nX189230000Y-64008000D03*\nX189230000Y-66548000D03*\nX189230000Y-69088000D03*\nX189230000Y-71628000D03*\nX189230000Y-109728000D03*\nX191770000Y-109728000D03*\nX191770000Y-97028000D03*\nD14*\nX118110000Y-61468000D03*\nD15*\nX120650000Y-61468000D03*\nX118110000Y-64008000D03*\nX120650000Y-64008000D03*\nX118110000Y-66548000D03*\nX120650000Y-66548000D03*\nX118110000Y-69088000D03*\nX120650000Y-69088000D03*\nX118110000Y-71628000D03*\nX120650000Y-71628000D03*\nX118110000Y-74168000D03*\nX120650000Y-74168000D03*\nX118110000Y-76708000D03*\nX120650000Y-76708000D03*\nX118110000Y-79248000D03*\nX120650000Y-79248000D03*\nX118110000Y-81788000D03*\nX120650000Y-81788000D03*\nX118110000Y-84328000D03*\nX120650000Y-84328000D03*\nX118110000Y-86868000D03*\nX120650000Y-86868000D03*\nX118110000Y-89408000D03*\nX120650000Y-89408000D03*\nX118110000Y-91948000D03*\nX120650000Y-91948000D03*\nX118110000Y-94488000D03*\nX120650000Y-94488000D03*\nX118110000Y-97028000D03*\nX120650000Y-97028000D03*\nX118110000Y-99568000D03*\nX120650000Y-99568000D03*\nX118110000Y-102108000D03*\nX120650000Y-102108000D03*\nX118110000Y-104648000D03*\nX120650000Y-104648000D03*\nX118110000Y-107188000D03*\nX120650000Y-107188000D03*\nX118110000Y-109728000D03*\nX120650000Y-109728000D03*\nD16*\nX135255000Y-64008000D03*\nD17*\nX135255000Y-61508000D03*\nD18*\nX164465000Y-85471000D03*\nX164465000Y-77851000D03*\nD19*\nX136017000Y-72644000D03*\nD20*\nX133477000Y-72644000D03*\nD19*\nX173863000Y-72644000D03*\nD20*\nX176403000Y-72644000D03*\nD19*\nX136017000Y-96139000D03*\nD20*\nX133477000Y-96139000D03*\nD19*\nX173863000Y-96012000D03*\nD20*\nX176403000Y-96012000D03*\nD21*\nX125250000Y-112250000D03*\nX160500000Y-70500000D03*\nX167250000Y-92250000D03*\nD22*\nX127007800Y-61542700D03*\nD23*\nX129547800Y-61542700D03*\nX127007800Y-64082700D03*\nX129547800Y-64082700D03*\nD24*\nX166243000Y-67056000D03*\nX164973000Y-68326000D03*\nX164973000Y-65786000D03*\nX128143000Y-71374000D03*\nX129413000Y-72644000D03*\nX126873000Y-72644000D03*\nX181737000Y-73914000D03*\nX180467000Y-72644000D03*\nX183007000Y-72644000D03*\nX128143000Y-94742000D03*\nX129413000Y-96012000D03*\nX126873000Y-96012000D03*\nX181737000Y-97282000D03*\nX180467000Y-96012000D03*\nX183007000Y-96012000D03*\nD18*\nX134239000Y-85344000D03*\nX134239000Y-77724000D03*\nX145415000Y-85344000D03*\nX145415000Y-77724000D03*\nX175641000Y-85217000D03*\nX175641000Y-77597000D03*\nX145415000Y-108966000D03*\nX145415000Y-101346000D03*\nX134239000Y-108458000D03*\nX134239000Y-100838000D03*\nX175641000Y-108585000D03*\nX175641000Y-100965000D03*\nX164465000Y-108839000D03*\nX164465000Y-101219000D03*\nX169164000Y-62611000D03*\nX161544000Y-62611000D03*\nX169164000Y-59563000D03*\nX161544000Y-59563000D03*\nX129921000Y-85217000D03*\nX129921000Y-77597000D03*\nX126365000Y-85217000D03*\nX126365000Y-77597000D03*\nX180086000Y-85217000D03*\nX180086000Y-77597000D03*\nX183515000Y-85217000D03*\nX183515000Y-77597000D03*\nX129921000Y-108458000D03*\nX129921000Y-100838000D03*\nX126365000Y-108458000D03*\nX126365000Y-100838000D03*\nX179959000Y-108585000D03*\nX179959000Y-100965000D03*\nX183515000Y-108585000D03*\nX183515000Y-100965000D03*\nD12*\nX155000000Y-99000000D03*\nD13*\nX155000000Y-88840000D03*\nD25*\nX137287000Y-77724000D03*\nX142367000Y-77724000D03*\nX137287000Y-85344000D03*\nX142367000Y-85344000D03*\nX148463000Y-77724000D03*\nX153543000Y-77724000D03*\nX148463000Y-85344000D03*\nX153543000Y-85344000D03*\nX172593000Y-85344000D03*\nX167513000Y-85344000D03*\nX172593000Y-77724000D03*\nX167513000Y-77724000D03*\nX161417000Y-85344000D03*\nX156337000Y-85344000D03*\nX161417000Y-77724000D03*\nX156337000Y-77724000D03*\nX148463000Y-101219000D03*\nX153543000Y-101219000D03*\nX148463000Y-108839000D03*\nX153543000Y-108839000D03*\nX137287000Y-101219000D03*\nX142367000Y-101219000D03*\nX137287000Y-108839000D03*\nX142367000Y-108839000D03*\nX172593000Y-108712000D03*\nX167513000Y-108712000D03*\nX172593000Y-101092000D03*\nX167513000Y-101092000D03*\nX161417000Y-108712000D03*\nX156337000Y-108712000D03*\nX161417000Y-101092000D03*\nX156337000Y-101092000D03*\nD26*\nX157178971Y-64124429D03*\nX150828971Y-64124429D03*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/simonShield-F.SilkS.gbr",
    "content": "G04 #@! TF.FileFunction,Legend,Top*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\n%ADD12C,0.187500*%\n%ADD13C,0.125000*%\n%ADD14C,0.300000*%\n%ADD15C,0.120000*%\n%ADD16C,0.002540*%\n%ADD17C,0.200000*%\n%ADD18C,0.170000*%\n%ADD19C,0.175000*%\n%ADD20C,0.180000*%\n%ADD21C,0.190000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nD12*\nX171964285Y-68083333D02*\nX123317001Y-106767381D01*\nX123650334Y-106767381D02*\nX123745572Y-106767381D01*\nX123793191Y-106815000D01*\nX123840810Y-106910238D01*\nX123864619Y-107100714D01*\nX123864619Y-107434048D01*\nX123840810Y-107624524D01*\nX123793191Y-107719762D01*\nX123745572Y-107767381D01*\nX123650334Y-107767381D01*\nX123602715Y-107719762D01*\nX123555096Y-107624524D01*\nX123531286Y-107434048D01*\nX123531286Y-107100714D01*\nX123555096Y-106910238D01*\nX123602715Y-106815000D01*\nX123650334Y-106767381D01*\nX124031287Y-106767381D02*\nX196102429Y-69431810D01*\nD13*\nX193274334Y-66254381D02*\nX193393381Y-67254381D01*\nX193488619Y-66540095D01*\nX193583857Y-67254381D01*\nX193702905Y-66254381D01*\nX193869572Y-66968667D02*\nX194107667Y-66968667D01*\nX193821953Y-67254381D02*\nX193988620Y-66254381D01*\nX194155286Y-67254381D01*\nX194321953Y-67254381D02*\nX194321953Y-66254381D01*\nX194607667Y-67254381D02*\nX194393381Y-66682952D01*\nX194607667Y-66254381D02*\nX194321953Y-66825810D01*\nX194821953Y-66730571D02*\nX194988619Y-66730571D01*\nX195060048Y-67254381D02*\nX194821953Y-67254381D01*\nX194821953Y-66254381D01*\nX195060048Y-66254381D01*\nX195274334Y-66254381D02*\nX195274334Y-67063905D01*\nX195298143Y-67159143D01*\nX195321953Y-67206762D01*\nX195369572Y-67254381D01*\nX195464810Y-67254381D01*\nX195512429Y-67206762D01*\nX195536238Y-67159143D01*\nX195560048Y-67063905D01*\nX195560048Y-66254381D01*\nX195798144Y-67254381D02*\nX195798144Y-66254381D01*\nX195988620Y-66254381D01*\nX196036239Y-66302000D01*\nX196060048Y-66349619D01*\nX196083858Y-66444857D01*\nX196083858Y-66587714D01*\nX196060048Y-66682952D01*\nX196036239Y-66730571D01*\nX195988620Y-66778190D01*\nX195798144Y-66778190D01*\nD17*\nX193929096Y-64016000D02*\nX193833858Y-63968381D01*\nX193691001Y-63968381D01*\nX193548143Y-64016000D01*\nX193452905Y-64111238D01*\nX193405286Y-64206476D01*\nX193357667Y-64396952D01*\nX193357667Y-64539810D01*\nX193405286Y-64730286D01*\nX193452905Y-64825524D01*\nX193548143Y-64920762D01*\nX193691001Y-64968381D01*\nX193786239Y-64968381D01*\nX193929096Y-64920762D01*\nX193976715Y-64873143D01*\nX193976715Y-64539810D01*\nX193786239Y-64539810D01*\nX194405286Y-64968381D02*\nX194405286Y-63968381D01*\nX194976715Y-64968381D01*\nX194976715Y-63968381D01*\nX195452905Y-64968381D02*\nX195452905Y-63968381D01*\nX195691000Y-63968381D01*\nX195833858Y-64016000D01*\nX195929096Y-64111238D01*\nX195976715Y-64206476D01*\nX196024334Y-64396952D01*\nX196024334Y-64539810D01*\nX195976715Y-64730286D01*\nX195929096Y-64825524D01*\nX195833858Y-64920762D01*\nX195691000Y-64968381D01*\nX195452905Y-64968381D01*\nX193278286Y-61539429D02*\nX194040191Y-61539429D01*\nX193659239Y-61920381D02*\nX193659239Y-61158476D01*\nX194992572Y-60920381D02*\nX194516381Y-60920381D01*\nX194468762Y-61396571D01*\nX194516381Y-61348952D01*\nX194611619Y-61301333D01*\nX194849715Y-61301333D01*\nX194944953Y-61348952D01*\nX194992572Y-61396571D01*\nX186697905Y-84637524D01*\nX186602667Y-84732762D01*\nX186459809Y-84780381D01*\nX186221714Y-84780381D01*\nX187174095Y-84494667D02*\nX187650286Y-84494667D01*\nX187078857Y-84780381D02*\nX187412190Y-83780381D01*\nX187745524Y-84780381D01*\nD13*\nX185555048Y-81240381D02*\nX185721715Y-82240381D01*\nX185888381Y-81240381D01*\nX186055048Y-82240381D02*\nX186055048Y-81240381D01*\nX186174095Y-81240381D01*\nX186245524Y-81288000D01*\nX186293143Y-81383238D01*\nX186316952Y-81478476D01*\nX186340762Y-81668952D01*\nX186340762Y-81811810D01*\nX186316952Y-82002286D01*\nX186293143Y-82097524D01*\nX186245524Y-82192762D01*\nX186174095Y-82240381D01*\nX186055048Y-82240381D01*\nX186555048Y-82240381D02*\nX186555048Y-81240381D01*\nX186674095Y-81240381D01*\nX186745524Y-81288000D01*\nX186793143Y-81383238D01*\nX186816952Y-81478476D01*\nX186840762Y-81668952D01*\nX186840762Y-81811810D01*\nX186816952Y-82002286D01*\nX186793143Y-82097524D01*\nX186745524Y-82192762D01*\nX186674095Y-82240381D01*\nX186555048Y-82240381D01*\nX187031238Y-81954667D02*\nX187269333Y-81954667D01*\nX186983619Y-82240381D02*\nX187150286Y-81240381D01*\nX187316952Y-82240381D01*\nD17*\nX185245524Y-79700381D02*\nX185245524Y-78700381D01*\nX185483619Y-78700381D01*\nX185626477Y-78748000D01*\nX185721715Y-78843238D01*\nX185769334Y-78938476D01*\nX185816953Y-79128952D01*\nX185816953Y-79271810D01*\nX185769334Y-79462286D01*\nX185721715Y-79557524D01*\nX185626477Y-79652762D01*\nX185483619Y-79700381D01*\nX185245524Y-79700381D01*\nX186197905Y-79414667D02*\nX186674096Y-79414667D01*\nX186102667Y-79700381D02*\nX186436000Y-78700381D01*\nX186769334Y-79700381D01*\nX187674096Y-79605143D02*\nX187626477Y-79652762D01*\nX187483620Y-79700381D01*\nX187388382Y-79700381D01*\nX187245524Y-79652762D01*\nX187150286Y-79557524D01*\nX187102667Y-79462286D01*\nX187055048Y-79271810D01*\nX187055048Y-79128952D01*\nX187102667Y-78938476D01*\nX187150286Y-78843238D01*\nX187245524Y-78748000D01*\nX187388382Y-78700381D01*\nX187483620Y-78700381D01*\nX187626477Y-78748000D01*\nX187674096Y-78795619D01*\nX185745524Y-77065143D02*\nX185697905Y-77112762D01*\nX185555048Y-77160381D01*\nX185459810Y-77160381D01*\nX185316952Y-77112762D01*\nX185221714Y-77017524D01*\nX185174095Y-76922286D01*\nX185126476Y-76731810D01*\nX185126476Y-76588952D01*\nX185174095Y-76398476D01*\nX185221714Y-76303238D01*\nX185316952Y-76208000D01*\nX185459810Y-76160381D01*\nX185555048Y-76160381D01*\nX185697905Y-76208000D01*\nX185745524Y-76255619D01*\nX186174095Y-77160381D02*\nX186174095Y-76160381D01*\nX186174095Y-76636571D02*\nX186745524Y-76636571D01*\nX186745524Y-77160381D02*\nX186745524Y-76160381D01*\nX187745524Y-77160381D02*\nX187174095Y-77160381D01*\nX187459809Y-77160381D02*\nX187459809Y-76160381D01*\nX187364571Y-76303238D01*\nX187269333Y-76398476D01*\nX187174095Y-76446095D01*\nX185491524Y-74525143D02*\nX185443905Y-74572762D01*\nX185301048Y-74620381D01*\nX185205810Y-74620381D01*\nX185062952Y-74572762D01*\nX184967714Y-74477524D01*\nX184920095Y-74382286D01*\nX184872476Y-74191810D01*\nX184872476Y-74048952D01*\nX184920095Y-73858476D01*\nX184967714Y-73763238D01*\nX185062952Y-73668000D01*\nX185205810Y-73620381D01*\nX185301048Y-73620381D01*\nX185443905Y-73668000D01*\nX185491524Y-73715619D01*\nX185920095Y-74620381D02*\nX185920095Y-73620381D01*\nX185920095Y-74096571D02*\nX186491524Y-74096571D01*\nX186491524Y-74620381D02*\nX186491524Y-73620381D01*\nX186920095Y-73715619D02*\nX186967714Y-73668000D01*\nX187062952Y-73620381D01*\nX187301048Y-73620381D01*\nX187396286Y-73668000D01*\nX187443905Y-73715619D01*\nX187491524Y-73810857D01*\nX187491524Y-73906095D01*\nX187443905Y-74048952D01*\nX186872476Y-74620381D01*\nX187491524Y-74620381D01*\nX185491524Y-71985143D02*\nX185443905Y-72032762D01*\nX185301048Y-72080381D01*\nX185205810Y-72080381D01*\nX185062952Y-72032762D01*\nX184967714Y-71937524D01*\nX184920095Y-71842286D01*\nX184872476Y-71651810D01*\nX184872476Y-71508952D01*\nX184920095Y-71318476D01*\nX184967714Y-71223238D01*\nX185062952Y-71128000D01*\nX185205810Y-71080381D01*\nX185301048Y-71080381D01*\nX185443905Y-71128000D01*\nX185491524Y-71175619D01*\nX185920095Y-72080381D02*\nX185920095Y-71080381D01*\nX185920095Y-71556571D02*\nX186491524Y-71556571D01*\nX186491524Y-72080381D02*\nX186491524Y-71080381D01*\nX186872476Y-71080381D02*\nX187491524Y-71080381D01*\nX187158190Y-71461333D01*\nX187301048Y-71461333D01*\nX187396286Y-71508952D01*\nX187443905Y-71556571D01*\nX187491524Y-71651810D01*\nX187491524Y-71889905D01*\nX187443905Y-71985143D01*\nX187396286Y-72032762D01*\nX187301048Y-72080381D01*\nX187015333Y-72080381D01*\nX186920095Y-72032762D01*\nX186872476Y-71985143D01*\nD13*\nX186094762Y-68588000D02*\nX186047143Y-68540381D01*\nX185975715Y-68540381D01*\nX185904286Y-68588000D01*\nX185856667Y-68683238D01*\nX185832858Y-68778476D01*\nX185809048Y-68968952D01*\nX185809048Y-69111810D01*\nX185832858Y-69302286D01*\nX185856667Y-69397524D01*\nX185904286Y-69492762D01*\nX185975715Y-69540381D01*\nX186023334Y-69540381D01*\nX186094762Y-69492762D01*\nX186118572Y-69445143D01*\nX186118572Y-69111810D01*\nX186023334Y-69111810D01*\nX186332858Y-69540381D02*\nX186332858Y-68540381D01*\nX186618572Y-69540381D01*\nX186618572Y-68540381D01*\nX186856668Y-69540381D02*\nX186856668Y-68540381D01*\nX186975715Y-68540381D01*\nX187047144Y-68588000D01*\nX187094763Y-68683238D01*\nX187118572Y-68778476D01*\nX187142382Y-68968952D01*\nX187142382Y-69111810D01*\nX187118572Y-69302286D01*\nX187094763Y-69397524D01*\nX187047144Y-69492762D01*\nX186975715Y-69540381D01*\nX186856668Y-69540381D01*\nX187332858Y-69254667D02*\nX187570953Y-69254667D01*\nX187285239Y-69540381D02*\nX187451906Y-68540381D01*\nX187618572Y-69540381D01*\nD17*\nX185459810Y-67000381D02*\nX185459810Y-66000381D01*\nX185888381Y-66952762D02*\nX186031238Y-67000381D01*\nX186269334Y-67000381D01*\nX186364572Y-66952762D01*\nX186412191Y-66905143D01*\nX186459810Y-66809905D01*\nX186459810Y-66714667D01*\nX186412191Y-66619429D01*\nX186364572Y-66571810D01*\nX186269334Y-66524190D01*\nX186078857Y-66476571D01*\nX185983619Y-66428952D01*\nX185936000Y-66381333D01*\nX185888381Y-66286095D01*\nX185888381Y-66190857D01*\nX185936000Y-66095619D01*\nX185983619Y-66048000D01*\nX186078857Y-66000381D01*\nX186316953Y-66000381D01*\nX186459810Y-66048000D01*\nX186888381Y-67000381D02*\nX186888381Y-66000381D01*\nX170488095Y-97273810D01*\nX146122399Y-64195858D02*\nX146884304Y-64195858D01*\nX146503352Y-64576810D02*\nX146503352Y-63814905D01*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gerber Image/simonShield-drl_map.gbr",
    "content": "%FSLAX45Y45*%\nG04 Gerber Fmt 4.5, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:22 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.127000*%\n%ADD11C,0.150000*%\n%ADD12C,0.200000*%\n%ADD13C,0.300000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX19625000Y-11800000D02*\nX11300000Y-11800000D01*\nX19625000Y-5275000D02*\nX19625000Y-11800000D01*\nX11300000Y-5275000D02*\nX19625000Y-5275000D01*\nX11300000Y-11800000D02*\nX11300000Y-5275000D01*\nD12*\nX12657300Y-7234400D02*\nX12717300Y-7294400D01*\nX12717300Y-7234400D02*\nX12657300Y-7294400D01*\nX12657300Y-9571200D02*\nX18270700Y-9571200D02*\nX18330700Y-9631200D01*\nX18330700Y-9571200D02*\nX18270700Y-9631200D01*\nX13764260Y-8013700D02*\nG75*\nG03X13764260Y-8013700I-35560J0D01*\nG01*\nX13764260Y-8343900D02*\nG75*\nG03X13764260Y-8343900I-35560J0D01*\nG01*\nX13764260Y-10350500D02*\nG75*\nG03X13764260Y-10350500I-35560J0D01*\nG01*\nX13764260Y-10668000D02*\nG75*\nG03X13764260Y-10668000I-35560J0D01*\nG01*\nX14869160Y-7962900D02*\nG75*\nG03X14869160Y-7962900I-35560J0D01*\nG01*\nX14881860Y-8318500D02*\nG75*\nG03X14881860Y-8318500I-35560J0D01*\nG01*\nX14881860Y-10350500D02*\nG75*\nG03X14881860Y-10350500I-35560J0D01*\nG01*\nX14881860Y-10693400D02*\nG75*\nG03X14881860Y-10693400I-35560J0D01*\nG01*\nX16177260Y-8001000D02*\nG75*\nG03X16177260Y-8001000I-35560J0D01*\nG01*\nX16177260Y-8343900D02*\nG75*\nG03X16177260Y-8343900I-35560J0D01*\nG01*\nX16177260Y-10375900D02*\nG75*\nG03X16177260Y-10375900I-35560J0D01*\nG01*\nX16177260Y-10693400D02*\nG75*\nG03X16177260Y-10693400I-35560J0D01*\nG01*\nX17294860Y-8013700D02*\nG75*\nG03X17294860Y-8013700I-35560J0D01*\nG01*\nX17294860Y-8331200D02*\nG75*\nG03X17294860Y-8331200I-35560J0D01*\nG01*\nX17294860Y-10337800D02*\nG75*\nG03X17294860Y-10337800I-35560J0D01*\nG01*\nX17294860Y-10693400D02*\nG75*\nG03X17294860Y-10693400I-35560J0D01*\nG01*\nX13525500Y-6360800D02*\nX13525500Y-6440800D01*\nX13485500Y-6400800D02*\nX13565500Y-6400800D01*\nX14540000Y-5824000D02*\nX14540000Y-5904000D01*\nX14500000Y-5864000D02*\nX14580000Y-5864000D01*\nX14540000Y-6840000D02*\nX14540000Y-6920000D01*\nX14500000Y-6880000D02*\nX14580000Y-6880000D01*\nX15500000Y-8844000D02*\nX15500000Y-8924000D01*\nX15460000Y-8884000D02*\nX15540000Y-8884000D01*\nX15500000Y-9860000D02*\nX15500000Y-9940000D01*\nX15460000Y-9900000D02*\nX15540000Y-9900000D01*\nX12586462Y-7809738D01*\nX12686538Y-7759700D02*\nG75*\nG03X12686538Y-7759700I-50038J0D01*\nG01*\nX12586462Y-8471662D02*\nX12686538Y-8571738D01*\nX12686538Y-8471662D02*\nX12586462Y-8571738D01*\nX12686538Y-8521700D02*\nG75*\nG03X12686538Y-8521700I-50038J0D01*\nG01*\nX12586462Y-10033762D02*\nX12686538Y-10133838D01*\nX12686538Y-10033762D02*\nX12586462Y-10133838D01*\nX12686538Y-10083800D02*\nG75*\nG03X12686538Y-10083800I-50038J0D01*\nG01*\nX12586462Y-10795762D02*\nX12686538Y-10895838D01*\nX12686538Y-10795762D02*\nX12586462Y-10895838D01*\nX12686538Y-10845800D02*\nG75*\nG03X12686538Y-10845800I-50038J0D01*\nG01*\nX12942062Y-7709662D02*\nX13042138Y-7809738D01*\nX13042138Y-7709662D02*\nX12942062Y-7809738D01*\nX13042138Y-7759700D02*\nG75*\nG03X13042138Y-7759700I-50038J0D01*\nG01*\nX12942062Y-8471662D02*\nX13042138Y-8571738D01*\nX13042138Y-8471662D02*\nX12942062Y-8571738D01*\nX13042138Y-8521700D02*\nG75*\nG03X13042138Y-8521700I-50038J0D01*\nG01*\nX12942062Y-10033762D02*\nX13042138Y-10133838D01*\nX13042138Y-10033762D02*\nX12942062Y-10133838D01*\nX13042138Y-10083800D02*\nG75*\nG03X13042138Y-10083800I-50038J0D01*\nG01*\nX12942062Y-10795762D02*\nX13042138Y-10895838D01*\nX13042138Y-10795762D02*\nX12942062Y-10895838D01*\nX13042138Y-10845800D02*\nG75*\nG03X13042138Y-10845800I-50038J0D01*\nG01*\nX13297662Y-7214362D02*\nX13397738Y-7314438D01*\nX13397738Y-7214362D02*\nX13297662Y-7314438D01*\nX13397738Y-7264400D02*\nG75*\nG03X13397738Y-7264400I-50038J0D01*\nG01*\nX13297662Y-9563862D02*\nX13397738Y-9663938D01*\nX13397738Y-9563862D02*\nX13297662Y-9663938D01*\nX13397738Y-9613900D02*\nG75*\nG03X13397738Y-9613900I-50038J0D01*\nG01*\nX13373862Y-7722362D02*\nX13473938Y-7822438D01*\nX13473938Y-7722362D02*\nX13373862Y-7822438D01*\nX13473938Y-7772400D02*\nG75*\nG03X13473938Y-7772400I-50038J0D01*\nG01*\nX13373862Y-8484362D02*\nX13473938Y-8584438D01*\nX13473938Y-8484362D02*\nX13373862Y-8584438D01*\nX13473938Y-8534400D02*\nG75*\nG03X13473938Y-8534400I-50038J0D01*\nG01*\nX13373862Y-10033762D02*\nX13473938Y-10133838D01*\nX13473938Y-10033762D02*\nX13373862Y-10133838D01*\nX13473938Y-10083800D02*\nG75*\nG03X13473938Y-10083800I-50038J0D01*\nG01*\nX13373862Y-10795762D02*\nX13473938Y-10895838D01*\nX13473938Y-10795762D02*\nX13373862Y-10895838D01*\nX13473938Y-10845800D02*\nG75*\nG03X13473938Y-10845800I-50038J0D01*\nG01*\nX13551662Y-7214362D02*\nX13651738Y-7314438D01*\nX13651738Y-7214362D02*\nX13551662Y-7314438D01*\nX13651738Y-7264400D02*\nG75*\nG03X13651738Y-7264400I-50038J0D01*\nG01*\nX13551662Y-9563862D02*\nX13651738Y-9663938D01*\nX13651738Y-9563862D02*\nX13551662Y-9663938D01*\nX13651738Y-9613900D02*\nG75*\nG03X13651738Y-9613900I-50038J0D01*\nG01*\nX14491462Y-7722362D02*\nX14591538Y-7822438D01*\nX14591538Y-7722362D02*\nX14491462Y-7822438D01*\nX14591538Y-7772400D02*\nG75*\nG03X14591538Y-7772400I-50038J0D01*\nG01*\nX14491462Y-8484362D02*\nX14591538Y-8584438D01*\nX14591538Y-8484362D02*\nX14491462Y-8584438D01*\nX14591538Y-8534400D02*\nG75*\nG03X14591538Y-8534400I-50038J0D01*\nG01*\nX14491462Y-10084562D02*\nX14591538Y-10184638D01*\nX14591538Y-10084562D02*\nX14491462Y-10184638D01*\nX14591538Y-10134600D02*\nG75*\nG03X14591538Y-10134600I-50038J0D01*\nG01*\nX14491462Y-10846562D02*\nX14591538Y-10946638D01*\nX14591538Y-10846562D02*\nX14491462Y-10946638D01*\nX14591538Y-10896600D02*\nG75*\nG03X14591538Y-10896600I-50038J0D01*\nG01*\nX15032859Y-6362405D02*\nX15132935Y-6462481D01*\nX15132935Y-6362405D02*\nX15032859Y-6462481D01*\nX15132935Y-6412443D02*\nG75*\nG03X15132935Y-6412443I-50038J0D01*\nG01*\nX15667859Y-6362405D02*\nX15767935Y-6462481D01*\nX15767935Y-6362405D02*\nX15667859Y-6462481D01*\nX15767935Y-6412443D02*\nG75*\nG03X15767935Y-6412443I-50038J0D01*\nG01*\nX16104362Y-5906262D02*\nX16204438Y-6006338D01*\nX16204438Y-5906262D02*\nX16104362Y-6006338D01*\nX16204438Y-5956300D02*\nG75*\nG03X16204438Y-5956300I-50038J0D01*\nG01*\nX16104362Y-6211062D02*\nX16204438Y-6311138D01*\nX16204438Y-6211062D02*\nX16104362Y-6311138D01*\nX16204438Y-6261100D02*\nG75*\nG03X16204438Y-6261100I-50038J0D01*\nG01*\nX16396462Y-7735062D02*\nX16496538Y-7835138D01*\nX16496538Y-7735062D02*\nX16396462Y-7835138D01*\nX16496538Y-7785100D02*\nG75*\nG03X16496538Y-7785100I-50038J0D01*\nG01*\nX16396462Y-8497062D02*\nX16496538Y-8597138D01*\nX16496538Y-8497062D02*\nX16396462Y-8597138D01*\nX16496538Y-8547100D02*\nG75*\nG03X16496538Y-8547100I-50038J0D01*\nG01*\nX16396462Y-10071862D02*\nX16496538Y-10171938D01*\nX16496538Y-10071862D02*\nX16396462Y-10171938D01*\nX16496538Y-10121900D02*\nG75*\nG03X16496538Y-10121900I-50038J0D01*\nG01*\nX16396462Y-10833862D02*\nX16496538Y-10933938D01*\nX16496538Y-10833862D02*\nX16396462Y-10933938D01*\nX16496538Y-10883900D02*\nG75*\nG03X16496538Y-10883900I-50038J0D01*\nG01*\nX16866362Y-5906262D02*\nX16966438Y-6006338D01*\nX16966438Y-5906262D02*\nX16866362Y-6006338D01*\nX16966438Y-5956300D02*\nG75*\nG03X16966438Y-5956300I-50038J0D01*\nG01*\nX16866362Y-6211062D02*\nX16966438Y-6311138D01*\nX16966438Y-6211062D02*\nX16866362Y-6311138D01*\nX16966438Y-6261100D02*\nG75*\nG03X16966438Y-6261100I-50038J0D01*\nG01*\nX17336262Y-7214362D02*\nX17436338Y-7314438D01*\nX17436338Y-7214362D02*\nX17336262Y-7314438D01*\nX17436338Y-7264400D02*\nG75*\nG03X17436338Y-7264400I-50038J0D01*\nG01*\nX17336262Y-9551162D02*\nX17436338Y-9651238D01*\nX17436338Y-9551162D02*\nX17336262Y-9651238D01*\nX17436338Y-9601200D02*\nG75*\nG03X17436338Y-9601200I-50038J0D01*\nG01*\nX17514062Y-7709662D02*\nX17614138Y-7809738D01*\nX17614138Y-7709662D02*\nX17514062Y-7809738D01*\nX17614138Y-7759700D02*\nG75*\nG03X17614138Y-7759700I-50038J0D01*\nG01*\nX17514062Y-8471662D02*\nX17614138Y-8571738D01*\nX17614138Y-8471662D02*\nX17514062Y-8571738D01*\nX17614138Y-8521700D02*\nG75*\nG03X17614138Y-8521700I-50038J0D01*\nG01*\nX17514062Y-10046462D02*\nX17614138Y-10146538D01*\nX17614138Y-10046462D02*\nX17514062Y-10146538D01*\nX17614138Y-10096500D02*\nG75*\nG03X17614138Y-10096500I-50038J0D01*\nG01*\nX17514062Y-10808462D02*\nX17614138Y-10908538D01*\nX17614138Y-10808462D02*\nX17514062Y-10908538D01*\nX17614138Y-10858500D02*\nG75*\nG03X17614138Y-10858500I-50038J0D01*\nG01*\nX17590262Y-7214362D02*\nX17690338Y-7314438D01*\nX17690338Y-7214362D02*\nX17590262Y-7314438D01*\nX17690338Y-7264400D02*\nG75*\nG03X17690338Y-7264400I-50038J0D01*\nG01*\nX17590262Y-9551162D02*\nX17690338Y-9651238D01*\nX17690338Y-9551162D02*\nX17590262Y-9651238D01*\nX17690338Y-9601200D02*\nG75*\nG03X17690338Y-9601200I-50038J0D01*\nG01*\nX17945862Y-10046462D02*\nX18045938Y-10146538D01*\nX18045938Y-10046462D02*\nX17945862Y-10146538D01*\nX18045938Y-10096500D02*\nG75*\nG03X18045938Y-10096500I-50038J0D01*\nG01*\nX17945862Y-10808462D02*\nX18045938Y-10908538D01*\nX18045938Y-10808462D02*\nX17945862Y-10908538D01*\nX18045938Y-10858500D02*\nG75*\nG03X18045938Y-10858500I-50038J0D01*\nG01*\nX17958562Y-7709662D02*\nX18058638Y-7809738D01*\nX18058638Y-7709662D02*\nX17958562Y-7809738D01*\nX18058638Y-7759700D02*\nG75*\nG03X18058638Y-7759700I-50038J0D01*\nG01*\nX17958562Y-8471662D02*\nX18058638Y-8571738D01*\nX18058638Y-8471662D02*\nX17958562Y-8571738D01*\nX18058638Y-8521700D02*\nG75*\nG03X18058638Y-8521700I-50038J0D01*\nG01*\nX18301462Y-7709662D02*\nX18401538Y-7809738D01*\nX18401538Y-7709662D02*\nX18301462Y-7809738D01*\nX18401538Y-7759700D02*\nG75*\nG03X18401538Y-7759700I-50038J0D01*\nG01*\nX18301462Y-8471662D02*\nX18401538Y-8571738D01*\nX18401538Y-8471662D02*\nX18301462Y-8571738D01*\nX18401538Y-8521700D02*\nG75*\nG03X18401538Y-8521700I-50038J0D01*\nG01*\nX18301462Y-10046462D02*\nX18401538Y-10146538D01*\nX18401538Y-10046462D02*\nX18301462Y-10146538D01*\nX18401538Y-10096500D02*\nG75*\nG03X18401538Y-10096500I-50038J0D01*\nG01*\nX18301462Y-10808462D02*\nX18401538Y-10908538D01*\nX18401538Y-10808462D02*\nX18301462Y-10908538D01*\nX18401538Y-10858500D02*\nG75*\nG03X18401538Y-10858500I-50038J0D01*\nG01*\nX11760200Y-6096000D02*\nX11861800Y-6197600D01*\nX11861800Y-6096000D02*\nX18872200Y-10668000D02*\nX18973800Y-10769600D01*\nX18973800Y-10668000D02*\nX18872200Y-10769600D01*\nX18923000Y-10668000D02*\nX18923000Y-10769600D01*\nX18872200Y-10718800D02*\nX18973800Y-10718800D01*\nX18872200Y-10922000D02*\nX18973800Y-11023600D01*\nX18973800Y-10922000D02*\nX18872200Y-11023600D01*\nX18923000Y-10922000D02*\nX18923000Y-11023600D01*\nX18872200Y-10972800D02*\nX18973800Y-10972800D01*\nX19126200Y-6096000D02*\nX19227800Y-6197600D01*\nX19227800Y-6096000D02*\nX19126200Y-6197600D01*\nX19177000Y-6096000D02*\nX19177000Y-6197600D01*\nX19126200Y-6146800D02*\nX19227800Y-6146800D01*\nX19126200Y-6350000D02*\nX19227800Y-6451600D01*\nX19227800Y-6350000D02*\nX19126200Y-6451600D01*\nX19177000Y-6350000D02*\nX19177000Y-6451600D01*\nX19126200Y-6400800D02*\nX19227800Y-6400800D01*\nX19126200Y-6604000D02*\nX19227800Y-6705600D01*\nX19227800Y-6604000D02*\nX19126200Y-6705600D01*\nX19177000Y-6604000D02*\nX19177000Y-6705600D01*\nX19126200Y-6654800D02*\nX19227800Y-6654800D01*\nX19126200Y-6858000D02*\nX19227800Y-6959600D01*\nX19227800Y-6858000D02*\nX19126200Y-6959600D01*\nX19177000Y-6858000D02*\nX19177000Y-6959600D01*\nX19126200Y-6908800D02*\nX19227800Y-6908800D01*\nX19126200Y-7112000D02*\nX19227800Y-7213600D01*\nX19227800Y-7112000D02*\nX19126200Y-7213600D01*\nX19177000Y-7112000D02*\nX19177000Y-7213600D01*\nX19126200Y-7162800D02*\nX19227800Y-7162800D01*\nX19126200Y-7366000D02*\nX19227800Y-7467600D01*\nX19227800Y-7366000D02*\nX19126200Y-7467600D01*\nX19177000Y-7366000D02*\nX19177000Y-7467600D01*\nX19126200Y-7416800D02*\nX19227800Y-7416800D01*\nX19126200Y-7620000D02*\nX19227800Y-7721600D01*\nX19227800Y-7620000D02*\nX19126200Y-7721600D01*\nX19177000Y-7620000D02*\nX19177000Y-7721600D01*\nX19126200Y-7670800D02*\nX19227800Y-7670800D01*\nX19126200Y-7874000D02*\nX19227800Y-7975600D01*\nX19227800Y-7874000D02*\nX19126200Y-7975600D01*\nX19177000Y-7874000D02*\nX19177000Y-7975600D01*\nX19126200Y-7924800D02*\nX19227800Y-7924800D01*\nX19126200Y-8128000D02*\nX19227800Y-8229600D01*\nX19227800Y-8128000D02*\nX19126200Y-8229600D01*\nX19177000Y-8128000D02*\nX19177000Y-8229600D01*\nX19126200Y-8178800D02*\nX19227800Y-8178800D01*\nX19126200Y-8382000D02*\nX19227800Y-8483600D01*\nX19227800Y-8382000D02*\nX19126200Y-8483600D01*\nX19177000Y-8382000D02*\nX19177000Y-8483600D01*\nX19126200Y-8432800D02*\nX19227800Y-8432800D01*\nX19126200Y-8636000D02*\nX19227800Y-8737600D01*\nX19227800Y-8636000D02*\nX19126200Y-8737600D01*\nX19177000Y-8636000D02*\nX19177000Y-8737600D01*\nX19126200Y-8686800D02*\nX19227800Y-8686800D01*\nX19126200Y-8890000D02*\nX19227800Y-8991600D01*\nX19227800Y-8890000D02*\nX19126200Y-8991600D01*\nX19177000Y-8890000D02*\nX19177000Y-8991600D01*\nX19126200Y-8940800D02*\nX19227800Y-8940800D01*\nX19126200Y-9144000D02*\nX19227800Y-9245600D01*\nX19227800Y-9144000D02*\nX19126200Y-9245600D01*\nX19177000Y-9144000D02*\nX19177000Y-9245600D01*\nX19126200Y-9194800D02*\nX19227800Y-9194800D01*\nX19126200Y-9398000D02*\nX19227800Y-9499600D01*\nX19227800Y-9398000D02*\nX19126200Y-9499600D01*\nX19177000Y-9398000D02*\nX19177000Y-9499600D01*\nX19126200Y-9448800D02*\nX19227800Y-9448800D01*\nX19126200Y-9652000D02*\nX19227800Y-9753600D01*\nX19227800Y-9652000D02*\nX19126200Y-9753600D01*\nX19177000Y-9652000D02*\nX19177000Y-9753600D01*\nX19126200Y-9702800D02*\nX19227800Y-9702800D01*\nX19126200Y-9906000D02*\nX19227800Y-10007600D01*\nX19227800Y-9906000D02*\nX19126200Y-10007600D01*\nX19177000Y-9906000D02*\nX19177000Y-10007600D01*\nX19126200Y-9956800D02*\nX19227800Y-9956800D01*\nX19126200Y-10160000D02*\nX19227800Y-10261600D01*\nX19227800Y-10160000D02*\nX19126200Y-10261600D01*\nX19177000Y-10160000D02*\nX19177000Y-10261600D01*\nX19126200Y-10210800D02*\nX19227800Y-10210800D01*\nX19126200Y-10414000D02*\nX19227800Y-10515600D01*\nX19227800Y-10414000D02*\nX19126200Y-10515600D01*\nX19177000Y-10414000D02*\nX19177000Y-10515600D01*\nX19126200Y-10464800D02*\nX19227800Y-10464800D01*\nX19126200Y-10668000D02*\nX19227800Y-10769600D01*\nX19227800Y-10668000D02*\nX19126200Y-10769600D01*\nX19177000Y-10668000D02*\nX19177000Y-10769600D01*\nX19126200Y-10718800D02*\nX19227800Y-10718800D01*\nX19126200Y-10922000D02*\nX19227800Y-11023600D01*\nX19227800Y-10922000D02*\nX19126200Y-11023600D01*\nX19177000Y-10922000D02*\nX19177000Y-11023600D01*\nX19126200Y-10972800D02*\nX19227800Y-10972800D01*\nD13*\nX11563928Y-12273214D02*\nX11563928Y-11973214D01*\nX11635357Y-11973214D01*\nX11678214Y-11987500D01*\nX11706786Y-12016071D01*\nX11721071Y-12044643D01*\nX11735357Y-12101786D01*\nX11735357Y-12144643D01*\nX11721071Y-12201786D01*\nX11706786Y-12230357D01*\nX11678214Y-12258929D01*\nX11635357Y-12273214D01*\nX11563928Y-12273214D01*\nX11863928Y-12273214D02*\nX11863928Y-12073214D01*\nX11863928Y-12130357D02*\nX11878214Y-12101786D01*\nX11892500Y-12087500D01*\nX11921071Y-12073214D01*\nX11949643Y-12073214D01*\nX12049643Y-12273214D02*\nX12049643Y-12073214D01*\nX12049643Y-11973214D02*\nX12035357Y-11987500D01*\nX12049643Y-12001786D01*\nX12063928Y-11987500D01*\nX12049643Y-11973214D01*\nX18121071Y-12688929D01*\nX18106786Y-12646071D01*\nX18092500Y-12617500D01*\nX18063929Y-12574643D01*\nX18049643Y-12560357D01*\nX11292500Y-13163500D02*\nG75*\nG03X11292500Y-13163500I-35560J0D01*\nG01*\nX11621071Y-12999214D02*\nX11649643Y-12999214D01*\nX11678214Y-13013500D01*\nX11692500Y-13027786D01*\nX11706786Y-13056357D01*\nX11721071Y-13113500D01*\nX11721071Y-13184929D01*\nX11706786Y-13242071D01*\nX11692500Y-13270643D01*\nX12706786Y-13509500D01*\nX12735357Y-13495214D01*\nX12778214Y-13495214D01*\nX12806786Y-13509500D01*\nX12821071Y-13538071D01*\nX12821071Y-13695214D01*\nX12963928Y-13695214D02*\nX12963928Y-13495214D01*\nX12963928Y-13523786D02*\nX12978214Y-13509500D01*\nX13006786Y-13495214D01*\nX13049643Y-13495214D01*\nX13078214Y-13509500D01*\nX13092500Y-13538071D01*\nX13092500Y-13695214D01*\nX13092500Y-13538071D02*\nX13106786Y-13509500D01*\nX13135357Y-13495214D01*\nX13178214Y-13495214D01*\nX13206786Y-13509500D01*\nX13221071Y-13538071D01*\nX13221071Y-13695214D01*\nX13806786Y-13380929D02*\nX13549643Y-13766643D01*\nX14192500Y-13395214D02*\nX14221071Y-13395214D01*\nX14249643Y-13409500D01*\nX14263928Y-13423786D01*\nX14278214Y-13452357D01*\nX14292500Y-13509500D01*\nX14292500Y-13580929D01*\nX14278214Y-13638071D01*\nX14263928Y-13666643D01*\nX14249643Y-13680929D01*\nX14221071Y-13695214D01*\nX14192500Y-13695214D01*\nX14163928Y-13680929D01*\nX14149643Y-13666643D01*\nX14135357Y-13638071D01*\nX14121071Y-13580929D01*\nX14121071Y-13509500D01*\nX14135357Y-13452357D01*\nX14149643Y-13423786D01*\nX14163928Y-13409500D01*\nX14192500Y-13395214D01*\nX14421071Y-13666643D02*\nX14435357Y-13680929D01*\nX14421071Y-13695214D01*\nX14406786Y-13680929D01*\nX14421071Y-13666643D01*\nX14421071Y-13695214D01*\nX14621071Y-13395214D02*\nX14649643Y-13395214D01*\nX14678214Y-13409500D01*\nX14692500Y-13423786D01*\nX14706785Y-13452357D01*\nX14721071Y-13509500D01*\nX14721071Y-13580929D01*\nX14706785Y-13638071D01*\nX14692500Y-13666643D01*\nX14678214Y-13680929D01*\nX14649643Y-13695214D01*\nX14621071Y-13695214D01*\nX14592500Y-13680929D01*\nX14578214Y-13666643D01*\nX14563928Y-13638071D01*\nX14549643Y-13580929D01*\nX14549643Y-13509500D01*\nX14563928Y-13452357D01*\nX14578214Y-13423786D01*\nX14592500Y-13409500D01*\nX14621071Y-13395214D01*\nX14821071Y-13395214D02*\nX15006785Y-13395214D01*\nX14906785Y-13509500D01*\nX14949643Y-13509500D01*\nX14978214Y-13523786D01*\nX14992500Y-13538071D01*\nX15006785Y-13566643D01*\nX11292500Y-14797538D01*\nX11292500Y-14697462D02*\nX11192424Y-14797538D01*\nX11292500Y-14747500D02*\nG75*\nG03X11292500Y-14747500I-50038J0D01*\nG01*\nX11721071Y-14883214D02*\nX11549643Y-14883214D01*\nX11635357Y-14883214D02*\nX11635357Y-14583214D01*\nX11606786Y-14626071D01*\nX11578214Y-14654643D01*\nX18135357Y-15136357D01*\nX18121071Y-15064929D01*\nX18106786Y-15022071D01*\nX18092500Y-14993500D01*\nX18063929Y-14950643D01*\nX18049643Y-14936357D01*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gnuplot/dashcolor.1.gnu",
    "content": "# set terminal pngcairo  background \"#ffffff\" fontscale 1.0 dashed size 640, 480 \n# set output 'dashcolor.1.png'\nset label 1 \"set style line 1 lt 2 lc rgb \\\"red\\\" lw 3\" at -0.4, -0.25, 0 left norotate back textcolor rgb \"red\"  nopoint offset character 0, 0, 0\nset label 2 \"set style line 2 lt 2 lc rgb \\\"orange\\\" lw 2\" at -0.4, -0.35, 0 left norotate back textcolor rgb \"orange\"  nopoint offset character 0, 0, 0\nset label 3 \"set style line 3 lt 2 lc rgb \\\"yellow\\\" lw 3\" at -0.4, -0.45, 0 left norotate back textcolor rgb \"yellow\"  nopoint offset character 0, 0, 0\nset label 4 \"set style line 4 lt 2 lc rgb \\\"green\\\" lw 2\" at -0.4, -0.55, 0 left norotate back textcolor rgb \"green\"  nopoint offset character 0, 0, 0\nset label 5 \"plot ... lt 1 lc 3 \" at -0.4, -0.65, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0\nset label 6 \"plot ... lt 3 lc 3 \" at -0.4, -0.75, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0\nset label 7 \"plot ... lt 5 lc 3 \" at -0.4, -0.85, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0\nset style line 1  linetype 2 linecolor rgb \"red\"  linewidth 3.000 pointtype 2 pointsize default pointinterval 0\nset style line 2  linetype 2 linecolor rgb \"orange\"  linewidth 2.000 pointtype 2 pointsize default pointinterval 0\nset style line 3  linetype 2 linecolor rgb \"yellow\"  linewidth 3.000 pointtype 2 pointsize default pointinterval 0\nset style line 4  linetype 2 linecolor rgb \"green\"  linewidth 2.000 pointtype 2 pointsize default pointinterval 0\nset noxtics\nset noytics\nset title \"Independent colors and dot/dash styles\" \nset xlabel \"You will only see dashed lines if your current terminal setting permits it\" \nset xrange [ -0.500000 : 3.50000 ] noreverse nowriteback\nset yrange [ -1.00000 : 1.40000 ] noreverse nowriteback\nset bmargin  7\nunset colorbox\nplot cos(x)     ls 1 title 'ls 1',        cos(x-.2)  ls 2 title 'ls 2',     cos(x-.4)  ls 3 title 'ls 3',     cos(x-.6)  ls 4 title 'ls 4',      cos(x-.8)  lt 1 lc 3 title 'lt 1 lc 3',       cos(x-1.)  lt 3 lc 3 title 'lt 3 lc 3',       cos(x-1.2) lt 5 lc 3 title 'lt 5 lc 3'\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gnuplot/histograms.2.gnu",
    "content": "# set terminal pngcairo  transparent enhanced font \"arial,10\" fontscale 1.0 size 500, 350 \n# set output 'histograms.2.png'\nset boxwidth 0.9 absolute\nset style fill   solid 1.00 border lt -1\nset key inside right top vertical Right noreverse noenhanced autotitles nobox\nset style histogram clustered gap 1 title  offset character 0, 0, 0\nset datafile missing '-'\nset style data histograms\nset xtics border in scale 0,0 nomirror rotate by -45  offset character 0, 0, 0 autojustify\nset xtics  norangelimit font \",8\"\nset xtics   ()\nset title \"US immigration from Northern Europe\\nPlot selected data columns as histogram of clustered boxes\" \nset yrange [ 0.00000 : 300000. ] noreverse nowriteback\ni = 22\nplot 'immigration.dat' using 6:xtic(1) ti col, '' u 12 ti col, '' u 13 ti col, '' u 14 ti col\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gnuplot/rates.gp",
    "content": "#!/usr/bin/env gnuplot\n\nreset\n\nset terminal png\nset output 'rates100.png'\n\nset xlabel \"A2A price\"\nset ylabel \"Response Rate\"\n\n#set xr [0:5]\n#set yr [0:6]\n\nplot 'rates100.dat' pt 7 notitle\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gnuplot/surface1.16.gnu",
    "content": "# set terminal pngcairo  transparent enhanced font \"arial,10\" fontscale 1.0 size 500, 350 \n# set output 'surface1.16.png'\nset dummy u,v\nset label 1 \"increasing v\" at 6, 0, -1 left norotate back nopoint offset character 0, 0, 0\nset label 2 \"u=0\" at 5, 6.5, -1 left norotate back nopoint offset character 0, 0, 0\nset label 3 \"u=1\" at 5, 6.5, 0.100248 left norotate back nopoint offset character 0, 0, 0\nset arrow 1 from 5, -5, -1.2 to 5, 5, -1.2 head back nofilled linetype -1 linewidth 1.000\nset arrow 2 from 5, 6, -1 to 5, 5, -1 head back nofilled linetype -1 linewidth 1.000\nset arrow 3 from 5, 6, 0.100248 to 5, 5, 0.100248 head back nofilled linetype -1 linewidth 1.000\nset parametric\nset view 70, 20, 1, 1\nset samples 51, 51\nset isosamples 2, 33\nset hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover\nset ztics -1.00000,0.25,1.00000 norangelimit\nset title \"\\\"fence plot\\\" using separate parametric surfaces\" \nset xlabel \"X axis\" \nset xlabel  offset character -3, -2, 0 font \"\" textcolor lt -1 norotate\nset xrange [ -5.00000 : 5.00000 ] noreverse nowriteback\nset ylabel \"Y axis\" \nset ylabel  offset character 3, -2, 0 font \"\" textcolor lt -1 rotate by -270\nset yrange [ -5.00000 : 5.00000 ] noreverse nowriteback\nset zlabel \"Z axis\" \nset zlabel  offset character -5, 0, 0 font \"\" textcolor lt -1 norotate\nset zrange [ -1.00000 : 1.00000 ] noreverse nowriteback\nsinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)\nGPFUN_sinc = \"sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)\"\nxx = 6.08888888888889\ndx = 1.10888888888889\nx0 = -5\nx1 = -3.89111111111111\nx2 = -2.78222222222222\nx3 = -1.67333333333333\nx4 = -0.564444444444444\nx5 = 0.544444444444445\nx6 = 1.65333333333333\nx7 = 2.76222222222222\nx8 = 3.87111111111111\nx9 = 4.98\nsplot [u=0:1][v=-4.99:4.99] \tx0, v, (u<0.5) ? -1 : sinc(x0,v) notitle, \tx1, v, (u<0.5) ? -1 : sinc(x1,v) notitle, \tx2, v, (u<0.5) ? -1 : sinc(x2,v) notitle, \tx3, v, (u<0.5) ? -1 : sinc(x3,v) notitle, \tx4, v, (u<0.5) ? -1 : sinc(x4,v) notitle, \tx5, v, (u<0.5) ? -1 : sinc(x5,v) notitle, \tx6, v, (u<0.5) ? -1 : sinc(x6,v) notitle, \tx7, v, (u<0.5) ? -1 : sinc(x7,v) notitle, \tx8, v, (u<0.5) ? -1 : sinc(x8,v) notitle, \tx9, v, (u<0.5) ? -1 : sinc(x9,v) notitle\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gnuplot/surface1.17.gnu",
    "content": "# set terminal pngcairo  transparent enhanced font \"arial,10\" fontscale 1.0 size 500, 350 \n# set output 'surface1.17.png'\nset dummy u,v\nset label 1 \"increasing v\" at 6, 0, -1 left norotate back nopoint offset character 0, 0, 0\nset label 2 \"increasing u\" at 0, -5, -1.5 left norotate back nopoint offset character 0, 0, 0\nset label 3 \"floor(u)%3=0\" at 5, 6.5, -1 left norotate back nopoint offset character 0, 0, 0\nset label 4 \"floor(u)%3=1\" at 5, 6.5, 0.100248 left norotate back nopoint offset character 0, 0, 0\nset arrow 1 from 5, -5, -1.2 to 5, 5, -1.2 head back nofilled linetype -1 linewidth 1.000\nset arrow 2 from -5, -5, -1.2 to 5, -5, -1.2 head back nofilled linetype -1 linewidth 1.000\nset arrow 3 from 5, 6, -1 to 5, 5, -1 head back nofilled linetype -1 linewidth 1.000\nset arrow 4 from 5, 6, 0.100248 to 5, 5, 0.100248 head back nofilled linetype -1 linewidth 1.000\nset parametric\nset view 70, 20, 1, 1\nset samples 51, 51\nset isosamples 30, 33\nset hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover\nset ztics -1.00000,0.25,1.00000 norangelimit\nset title \"\\\"fence plot\\\" using single parametric surface with undefined points\" \nset xlabel \"X axis\" \nset xlabel  offset character -3, -2, 0 font \"\" textcolor lt -1 norotate\nset xrange [ -5.00000 : 5.00000 ] noreverse nowriteback\nset ylabel \"Y axis\" \nset ylabel  offset character 3, -2, 0 font \"\" textcolor lt -1 rotate by -270\nset yrange [ -5.00000 : 5.00000 ] noreverse nowriteback\nset zlabel \"Z axis\" \nset zlabel  offset character -5, 0, 0 font \"\" textcolor lt -1 norotate\nset zrange [ -1.00000 : 1.00000 ] noreverse nowriteback\nsinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)\nGPFUN_sinc = \"sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)\"\nxx = 6.08888888888889\ndx = 1.11\nx0 = -5\nx1 = -3.89111111111111\nx2 = -2.78222222222222\nx3 = -1.67333333333333\nx4 = -0.564444444444444\nx5 = 0.544444444444445\nx6 = 1.65333333333333\nx7 = 2.76222222222222\nx8 = 3.87111111111111\nx9 = 4.98\nxmin = -4.99\nxmax = 5\nn = 10\nzbase = -1\nsplot [u=.5:3*n-.5][v=-4.99:4.99] \t xmin+floor(u/3)*dx, v, ((floor(u)%3)==0) ? zbase : \t\t\t (((floor(u)%3)==1) ? sinc(xmin+u/3.*dx,v) : 1/0) notitle\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gnuplot/world2.1.gnu",
    "content": "# set terminal pngcairo  transparent enhanced font \"arial,10\" fontscale 1.0 size 500, 350 \n# set output 'world2.1.png'\nunset border\nset dummy u,v\nset angles degrees\nset parametric\nset view 60, 136, 1.22, 1.26\nset samples 64, 64\nset isosamples 13, 13\nset mapping spherical\nset noxtics\nset noytics\nset noztics\nset title \"Labels colored by GeV plotted in spherical coordinate system\" \nset urange [ -90.0000 : 90.0000 ] noreverse nowriteback\nset vrange [ 0.00000 : 360.000 ] noreverse nowriteback\nset cblabel \"GeV\" \nset cbrange [ 0.00000 : 8.00000 ] noreverse nowriteback\nset colorbox user\nset colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.02, 0.75, 0 front bdefault\nsplot cos(u)*cos(v),cos(u)*sin(v),sin(u) notitle with lines lt 5,       'world.dat' notitle with lines lt 2,       'srl.dat' using 3:2:(1):1:4 with labels notitle point pt 6 lw .1 left offset 1,0 font \"Helvetica,7\" tc pal\n"
  },
  {
    "path": "src/test/resources/samples/langs/Go/api.pb.go",
    "content": "// Code generated by protoc-gen-gogo.\n// source: api.proto\n// DO NOT EDIT!\n\n/*\n\tPackage proto is a generated protocol buffer package.\n\n\tIt is generated from these files:\n\t\tapi.proto\n\t\tconfig.proto\n\t\tdata.proto\n\t\terrors.proto\n\t\tgossip.proto\n\t\theartbeat.proto\n\t\tinternal.proto\n\n\tIt has these top-level messages:\n\t\tClientCmdID\n\t\tRequestHeader\n\t\tResponseHeader\n\t\tContainsRequest\n\t\tContainsResponse\n\t\tGetRequest\n\t\tGetResponse\n\t\tPutRequest\n\t\tPutResponse\n\t\tConditionalPutRequest\n\t\tConditionalPutResponse\n\t\tIncrementRequest\n\t\tIncrementResponse\n\t\tDeleteRequest\n\t\tDeleteResponse\n\t\tDeleteRangeRequest\n\t\tDeleteRangeResponse\n\t\tScanRequest\n\t\tScanResponse\n\t\tEndTransactionRequest\n\t\tEndTransactionResponse\n\t\tReapQueueRequest\n\t\tReapQueueResponse\n\t\tEnqueueUpdateRequest\n\t\tEnqueueUpdateResponse\n\t\tEnqueueMessageRequest\n\t\tEnqueueMessageResponse\n\t\tRequestUnion\n\t\tResponseUnion\n\t\tBatchRequest\n\t\tBatchResponse\n\t\tAdminSplitRequest\n\t\tAdminSplitResponse\n\t\tAdminMergeRequest\n\t\tAdminMergeResponse\n*/\npackage proto\n\nimport proto1 \"github.com/gogo/protobuf/proto\"\nimport math \"math\"\n\n// discarding unused import gogoproto \"github.com/gogo/protobuf/gogoproto/gogo.pb\"\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ = proto1.Marshal\nvar _ = math.Inf\n\n// ClientCmdID provides a unique ID for client commands. Clients which\n// provide ClientCmdID gain operation idempotence. In other words,\n// clients can submit the same command multiple times and always\n// receive the same response. This is common on retries over flaky\n// networks. However, the system imposes a limit on how long\n// idempotence is provided. Retries over an hour old are not\n// guaranteed idempotence and may be executed more than once with\n// potentially different results.\n//\n// ClientCmdID contains the client's timestamp and a client-generated\n// random number. The client Timestamp is specified in unix\n// nanoseconds and is used for some uniqueness but also to provide a\n// rough ordering of requests, useful for data locality on the\n// server. The Random is specified for additional uniqueness.\n// NOTE: An accurate time signal IS NOT required for correctness.\ntype ClientCmdID struct {\n\t// Nanoseconds since Unix epoch.\n\tWallTime         int64  `protobuf:\"varint,1,opt,name=wall_time\" json:\"wall_time\"`\n\tRandom           int64  `protobuf:\"varint,2,opt,name=random\" json:\"random\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ClientCmdID) Reset()         { *m = ClientCmdID{} }\nfunc (m *ClientCmdID) String() string { return proto1.CompactTextString(m) }\nfunc (*ClientCmdID) ProtoMessage()    {}\n\nfunc (m *ClientCmdID) GetWallTime() int64 {\n\tif m != nil {\n\t\treturn m.WallTime\n\t}\n\treturn 0\n}\n\nfunc (m *ClientCmdID) GetRandom() int64 {\n\tif m != nil {\n\t\treturn m.Random\n\t}\n\treturn 0\n}\n\n// RequestHeader is supplied with every storage node request.\ntype RequestHeader struct {\n\t// Timestamp specifies time at which read or writes should be\n\t// performed. If the timestamp is set to zero value, its value\n\t// is initialized to the wall time of the receiving node.\n\tTimestamp Timestamp `protobuf:\"bytes,1,opt,name=timestamp\" json:\"timestamp\"`\n\t// CmdID is optionally specified for request idempotence\n\t// (i.e. replay protection).\n\tCmdID ClientCmdID `protobuf:\"bytes,2,opt,name=cmd_id\" json:\"cmd_id\"`\n\t// The key for request. If the request operates on a range, this\n\t// represents the starting key for the range.\n\tKey Key `protobuf:\"bytes,3,opt,name=key,customtype=Key\" json:\"key\"`\n\t// End key is empty if request spans only a single key.\n\tEndKey Key `protobuf:\"bytes,4,opt,name=end_key,customtype=Key\" json:\"end_key\"`\n\t// User is the originating user. Used to lookup priority when\n\t// scheduling queued operations at target node.\n\tUser string `protobuf:\"bytes,5,opt,name=user\" json:\"user\"`\n\t// Replica specifies the destination for the request. This is a specific\n\t// instance of the available replicas belonging to RangeID.\n\tReplica Replica `protobuf:\"bytes,6,opt,name=replica\" json:\"replica\"`\n\t// RaftID specifies the ID of the Raft consensus group which the key\n\t// range belongs to. This is used by the receiving node to route the\n\t// request to the correct range.\n\tRaftID int64 `protobuf:\"varint,7,opt,name=raft_id\" json:\"raft_id\"`\n\t// UserPriority specifies priority multiple for non-transactional\n\t// commands. This value should be a positive integer [1, 2^31-1).\n\t// It's properly viewed as a multiple for how likely this\n\t// transaction will be to prevail if a write conflict occurs.\n\t// Commands with UserPriority=100 will be 100x less likely to be\n\t// aborted as conflicting transactions or non-transactional commands\n\t// with UserPriority=1. This value is ignored if Txn is\n\t// specified. If neither this value nor Txn is specified, the value\n\t// defaults to 1.\n\tUserPriority *int32 `protobuf:\"varint,8,opt,name=user_priority,def=1\" json:\"user_priority,omitempty\"`\n\t// Txn is set non-nil if a transaction is underway. To start a txn,\n\t// the first request should set this field to non-nil with name and\n\t// isolation level set as desired. The response will contain the\n\t// fully-initialized transaction with txn ID, priority, initial\n\t// timestamp, and maximum timestamp.\n\tTxn              *Transaction `protobuf:\"bytes,9,opt,name=txn\" json:\"txn,omitempty\"`\n\tXXX_unrecognized []byte       `json:\"-\"`\n}\n\nfunc (m *RequestHeader) Reset()         { *m = RequestHeader{} }\nfunc (m *RequestHeader) String() string { return proto1.CompactTextString(m) }\nfunc (*RequestHeader) ProtoMessage()    {}\n\nconst Default_RequestHeader_UserPriority int32 = 1\n\nfunc (m *RequestHeader) GetTimestamp() Timestamp {\n\tif m != nil {\n\t\treturn m.Timestamp\n\t}\n\treturn Timestamp{}\n}\n\nfunc (m *RequestHeader) GetCmdID() ClientCmdID {\n\tif m != nil {\n\t\treturn m.CmdID\n\t}\n\treturn ClientCmdID{}\n}\n\nfunc (m *RequestHeader) GetUser() string {\n\tif m != nil {\n\t\treturn m.User\n\t}\n\treturn \"\"\n}\n\nfunc (m *RequestHeader) GetReplica() Replica {\n\tif m != nil {\n\t\treturn m.Replica\n\t}\n\treturn Replica{}\n}\n\nfunc (m *RequestHeader) GetRaftID() int64 {\n\tif m != nil {\n\t\treturn m.RaftID\n\t}\n\treturn 0\n}\n\nfunc (m *RequestHeader) GetUserPriority() int32 {\n\tif m != nil && m.UserPriority != nil {\n\t\treturn *m.UserPriority\n\t}\n\treturn Default_RequestHeader_UserPriority\n}\n\nfunc (m *RequestHeader) GetTxn() *Transaction {\n\tif m != nil {\n\t\treturn m.Txn\n\t}\n\treturn nil\n}\n\n// ResponseHeader is returned with every storage node response.\ntype ResponseHeader struct {\n\t// Error is non-nil if an error occurred.\n\tError *Error `protobuf:\"bytes,1,opt,name=error\" json:\"error,omitempty\"`\n\t// Timestamp specifies time at which read or write actually was\n\t// performed. In the case of both reads and writes, if the timestamp\n\t// supplied to the request was 0, the wall time of the node\n\t// servicing the request will be set here. Additionally, in the case\n\t// of writes, this value may be increased from the timestamp passed\n\t// with the RequestHeader if the key being written was either read\n\t// or written more recently.\n\tTimestamp Timestamp `protobuf:\"bytes,2,opt,name=timestamp\" json:\"timestamp\"`\n\t// Transaction is non-nil if the request specified a non-nil\n\t// transaction. The transaction timestamp and/or priority may have\n\t// been updated, depending on the outcome of the request.\n\tTxn              *Transaction `protobuf:\"bytes,3,opt,name=txn\" json:\"txn,omitempty\"`\n\tXXX_unrecognized []byte       `json:\"-\"`\n}\n\nfunc (m *ResponseHeader) Reset()         { *m = ResponseHeader{} }\nfunc (m *ResponseHeader) String() string { return proto1.CompactTextString(m) }\nfunc (*ResponseHeader) ProtoMessage()    {}\n\nfunc (m *ResponseHeader) GetError() *Error {\n\tif m != nil {\n\t\treturn m.Error\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseHeader) GetTimestamp() Timestamp {\n\tif m != nil {\n\t\treturn m.Timestamp\n\t}\n\treturn Timestamp{}\n}\n\nfunc (m *ResponseHeader) GetTxn() *Transaction {\n\tif m != nil {\n\t\treturn m.Txn\n\t}\n\treturn nil\n}\n\n// A ContainsRequest is arguments to the Contains() method.\ntype ContainsRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ContainsRequest) Reset()         { *m = ContainsRequest{} }\nfunc (m *ContainsRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*ContainsRequest) ProtoMessage()    {}\n\n// A ContainsResponse is the return value of the Contains() method.\ntype ContainsResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tExists           bool   `protobuf:\"varint,2,opt,name=exists\" json:\"exists\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ContainsResponse) Reset()         { *m = ContainsResponse{} }\nfunc (m *ContainsResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*ContainsResponse) ProtoMessage()    {}\n\nfunc (m *ContainsResponse) GetExists() bool {\n\tif m != nil {\n\t\treturn m.Exists\n\t}\n\treturn false\n}\n\n// A GetRequest is arguments to the Get() method.\ntype GetRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *GetRequest) Reset()         { *m = GetRequest{} }\nfunc (m *GetRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*GetRequest) ProtoMessage()    {}\n\n// A GetResponse is the return value from the Get() method.\n// If the key doesn't exist, returns nil for Value.Bytes.\ntype GetResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tValue            *Value `protobuf:\"bytes,2,opt,name=value\" json:\"value,omitempty\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *GetResponse) Reset()         { *m = GetResponse{} }\nfunc (m *GetResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*GetResponse) ProtoMessage()    {}\n\nfunc (m *GetResponse) GetValue() *Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn nil\n}\n\n// A PutRequest is arguments to the Put() method. Note that to write\n// an empty value, the value parameter is still specified, but both\n// Bytes and Integer are set to nil.\ntype PutRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tValue            Value  `protobuf:\"bytes,2,opt,name=value\" json:\"value\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *PutRequest) Reset()         { *m = PutRequest{} }\nfunc (m *PutRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*PutRequest) ProtoMessage()    {}\n\nfunc (m *PutRequest) GetValue() Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn Value{}\n}\n\n// A PutResponse is the return value from the Put() method.\ntype PutResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *PutResponse) Reset()         { *m = PutResponse{} }\nfunc (m *PutResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*PutResponse) ProtoMessage()    {}\n\n// A ConditionalPutRequest is arguments to the ConditionalPut() method.\n//\n// - Returns true and sets value if ExpValue equals existing value.\n// - If key doesn't exist and ExpValue is nil, sets value.\n// - If key exists, but value is empty and ExpValue is not nil but empty, sets value.\n// - Otherwise, returns error and the actual value of the key in the response.\ntype ConditionalPutRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// The value to put.\n\tValue Value `protobuf:\"bytes,2,opt,name=value\" json:\"value\"`\n\t// ExpValue.Bytes empty to test for non-existence. Specify as nil\n\t// to indicate there should be no existing entry. This is different\n\t// from the expectation that the value exists but is empty.\n\tExpValue         *Value `protobuf:\"bytes,3,opt,name=exp_value\" json:\"exp_value,omitempty\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ConditionalPutRequest) Reset()         { *m = ConditionalPutRequest{} }\nfunc (m *ConditionalPutRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*ConditionalPutRequest) ProtoMessage()    {}\n\nfunc (m *ConditionalPutRequest) GetValue() Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn Value{}\n}\n\nfunc (m *ConditionalPutRequest) GetExpValue() *Value {\n\tif m != nil {\n\t\treturn m.ExpValue\n\t}\n\treturn nil\n}\n\n// A ConditionalPutResponse is the return value from the\n// ConditionalPut() method.\ntype ConditionalPutResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ConditionalPutResponse) Reset()         { *m = ConditionalPutResponse{} }\nfunc (m *ConditionalPutResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*ConditionalPutResponse) ProtoMessage()    {}\n\n// An IncrementRequest is arguments to the Increment() method. It\n// increments the value for key, and returns the new value. If no\n// value exists for a key, incrementing by 0 is not a noop, but will\n// create a zero value. IncrementRequest cannot be called on a key set\n// by Put() or ConditionalPut(). Similarly, Get(), Put() and\n// ConditionalPut() cannot be invoked on an incremented key.\ntype IncrementRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tIncrement        int64  `protobuf:\"varint,2,opt,name=increment\" json:\"increment\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *IncrementRequest) Reset()         { *m = IncrementRequest{} }\nfunc (m *IncrementRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*IncrementRequest) ProtoMessage()    {}\n\nfunc (m *IncrementRequest) GetIncrement() int64 {\n\tif m != nil {\n\t\treturn m.Increment\n\t}\n\treturn 0\n}\n\n// An IncrementResponse is the return value from the Increment\n// method. The new value after increment is specified in NewValue. If\n// the value could not be decoded as specified, Error will be set.\ntype IncrementResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tNewValue         int64  `protobuf:\"varint,2,opt,name=new_value\" json:\"new_value\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *IncrementResponse) Reset()         { *m = IncrementResponse{} }\nfunc (m *IncrementResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*IncrementResponse) ProtoMessage()    {}\n\nfunc (m *IncrementResponse) GetNewValue() int64 {\n\tif m != nil {\n\t\treturn m.NewValue\n\t}\n\treturn 0\n}\n\n// A DeleteRequest is arguments to the Delete() method.\ntype DeleteRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *DeleteRequest) Reset()         { *m = DeleteRequest{} }\nfunc (m *DeleteRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*DeleteRequest) ProtoMessage()    {}\n\n// A DeleteResponse is the return value from the Delete() method.\ntype DeleteResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *DeleteResponse) Reset()         { *m = DeleteResponse{} }\nfunc (m *DeleteResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*DeleteResponse) ProtoMessage()    {}\n\n// A DeleteRangeRequest is arguments to the DeleteRange method. It\n// specifies the range of keys to delete.\ntype DeleteRangeRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// If 0, *all* entries between Key (inclusive) and EndKey\n\t// (exclusive) are deleted. Must be >= 0\n\tMaxEntriesToDelete int64  `protobuf:\"varint,2,opt,name=max_entries_to_delete\" json:\"max_entries_to_delete\"`\n\tXXX_unrecognized   []byte `json:\"-\"`\n}\n\nfunc (m *DeleteRangeRequest) Reset()         { *m = DeleteRangeRequest{} }\nfunc (m *DeleteRangeRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*DeleteRangeRequest) ProtoMessage()    {}\n\nfunc (m *DeleteRangeRequest) GetMaxEntriesToDelete() int64 {\n\tif m != nil {\n\t\treturn m.MaxEntriesToDelete\n\t}\n\treturn 0\n}\n\n// A DeleteRangeResponse is the return value from the DeleteRange()\n// method.\ntype DeleteRangeResponse struct {\n\tResponseHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Number of entries removed.\n\tNumDeleted       int64  `protobuf:\"varint,2,opt,name=num_deleted\" json:\"num_deleted\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *DeleteRangeResponse) Reset()         { *m = DeleteRangeResponse{} }\nfunc (m *DeleteRangeResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*DeleteRangeResponse) ProtoMessage()    {}\n\nfunc (m *DeleteRangeResponse) GetNumDeleted() int64 {\n\tif m != nil {\n\t\treturn m.NumDeleted\n\t}\n\treturn 0\n}\n\n// A ScanRequest is arguments to the Scan() method. It specifies the\n// start and end keys for the scan and the maximum number of results.\ntype ScanRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Must be > 0.\n\tMaxResults       int64  `protobuf:\"varint,2,opt,name=max_results\" json:\"max_results\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ScanRequest) Reset()         { *m = ScanRequest{} }\nfunc (m *ScanRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*ScanRequest) ProtoMessage()    {}\n\nfunc (m *ScanRequest) GetMaxResults() int64 {\n\tif m != nil {\n\t\treturn m.MaxResults\n\t}\n\treturn 0\n}\n\n// A ScanResponse is the return value from the Scan() method.\ntype ScanResponse struct {\n\tResponseHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Empty if no rows were scanned.\n\tRows             []KeyValue `protobuf:\"bytes,2,rep,name=rows\" json:\"rows\"`\n\tXXX_unrecognized []byte     `json:\"-\"`\n}\n\nfunc (m *ScanResponse) Reset()         { *m = ScanResponse{} }\nfunc (m *ScanResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*ScanResponse) ProtoMessage()    {}\n\nfunc (m *ScanResponse) GetRows() []KeyValue {\n\tif m != nil {\n\t\treturn m.Rows\n\t}\n\treturn nil\n}\n\n// An EndTransactionRequest is arguments to the EndTransaction() method.\n// It specifies whether to commit or roll back an extant transaction.\ntype EndTransactionRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// False to abort and rollback.\n\tCommit bool `protobuf:\"varint,2,opt,name=commit\" json:\"commit\"`\n\t// Optional commit triggers. Note that commit triggers are for\n\t// internal use only and will be ignored if requested through the\n\t// public-facing KV API.\n\tSplitTrigger     *SplitTrigger `protobuf:\"bytes,3,opt,name=split_trigger\" json:\"split_trigger,omitempty\"`\n\tMergeTrigger     *MergeTrigger `protobuf:\"bytes,4,opt,name=merge_trigger\" json:\"merge_trigger,omitempty\"`\n\tXXX_unrecognized []byte        `json:\"-\"`\n}\n\nfunc (m *EndTransactionRequest) Reset()         { *m = EndTransactionRequest{} }\nfunc (m *EndTransactionRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*EndTransactionRequest) ProtoMessage()    {}\n\nfunc (m *EndTransactionRequest) GetCommit() bool {\n\tif m != nil {\n\t\treturn m.Commit\n\t}\n\treturn false\n}\n\nfunc (m *EndTransactionRequest) GetSplitTrigger() *SplitTrigger {\n\tif m != nil {\n\t\treturn m.SplitTrigger\n\t}\n\treturn nil\n}\n\nfunc (m *EndTransactionRequest) GetMergeTrigger() *MergeTrigger {\n\tif m != nil {\n\t\treturn m.MergeTrigger\n\t}\n\treturn nil\n}\n\n// An EndTransactionResponse is the return value from the\n// EndTransaction() method. The final transaction record is returned\n// as part of the response header. In particular, transaction status\n// and timestamp will be updated to reflect final committed\n// values. Clients may propagate the transaction timestamp as the\n// final txn commit timestamp in order to preserve causal ordering\n// between subsequent transactions. CommitWait specifies the commit\n// wait, which is the remaining time the client MUST wait before\n// signalling completion of the transaction to another distributed\n// node to maintain consistency.\ntype EndTransactionResponse struct {\n\tResponseHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Remaining time (ns).\n\tCommitWait       int64  `protobuf:\"varint,2,opt,name=commit_wait\" json:\"commit_wait\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *EndTransactionResponse) Reset()         { *m = EndTransactionResponse{} }\nfunc (m *EndTransactionResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*EndTransactionResponse) ProtoMessage()    {}\n\nfunc (m *EndTransactionResponse) GetCommitWait() int64 {\n\tif m != nil {\n\t\treturn m.CommitWait\n\t}\n\treturn 0\n}\n\n// A ReapQueueRequest is arguments to the ReapQueue() method. It\n// specifies the recipient inbox key to which messages are waiting\n// to be reapted and also the maximum number of results to return.\ntype ReapQueueRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Maximum results to return; must be > 0.\n\tMaxResults       int64  `protobuf:\"varint,2,opt,name=max_results\" json:\"max_results\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ReapQueueRequest) Reset()         { *m = ReapQueueRequest{} }\nfunc (m *ReapQueueRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*ReapQueueRequest) ProtoMessage()    {}\n\nfunc (m *ReapQueueRequest) GetMaxResults() int64 {\n\tif m != nil {\n\t\treturn m.MaxResults\n\t}\n\treturn 0\n}\n\n// A ReapQueueResponse is the return value from the ReapQueue() method.\ntype ReapQueueResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tMessages         []Value `protobuf:\"bytes,2,rep,name=messages\" json:\"messages\"`\n\tXXX_unrecognized []byte  `json:\"-\"`\n}\n\nfunc (m *ReapQueueResponse) Reset()         { *m = ReapQueueResponse{} }\nfunc (m *ReapQueueResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*ReapQueueResponse) ProtoMessage()    {}\n\nfunc (m *ReapQueueResponse) GetMessages() []Value {\n\tif m != nil {\n\t\treturn m.Messages\n\t}\n\treturn nil\n}\n\n// An EnqueueUpdateRequest is arguments to the EnqueueUpdate() method.\n// It specifies the update to enqueue for asynchronous execution.\n// Update is an instance of one of the following messages: PutRequest,\n// IncrementRequest, DeleteRequest, DeleteRangeRequest, or\n// AccountingRequest.\ntype EnqueueUpdateRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *EnqueueUpdateRequest) Reset()         { *m = EnqueueUpdateRequest{} }\nfunc (m *EnqueueUpdateRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*EnqueueUpdateRequest) ProtoMessage()    {}\n\n// An EnqueueUpdateResponse is the return value from the\n// EnqueueUpdate() method.\ntype EnqueueUpdateResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *EnqueueUpdateResponse) Reset()         { *m = EnqueueUpdateResponse{} }\nfunc (m *EnqueueUpdateResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*EnqueueUpdateResponse) ProtoMessage()    {}\n\n// An EnqueueMessageRequest is arguments to the EnqueueMessage() method.\n// It specifies the recipient inbox key and the message (an arbitrary\n// byte slice value).\ntype EnqueueMessageRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Message value to delivery to inbox.\n\tMsg              Value  `protobuf:\"bytes,2,opt,name=msg\" json:\"msg\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *EnqueueMessageRequest) Reset()         { *m = EnqueueMessageRequest{} }\nfunc (m *EnqueueMessageRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*EnqueueMessageRequest) ProtoMessage()    {}\n\nfunc (m *EnqueueMessageRequest) GetMsg() Value {\n\tif m != nil {\n\t\treturn m.Msg\n\t}\n\treturn Value{}\n}\n\n// An EnqueueMessageResponse is the return value from the\n// EnqueueMessage() method.\ntype EnqueueMessageResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *EnqueueMessageResponse) Reset()         { *m = EnqueueMessageResponse{} }\nfunc (m *EnqueueMessageResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*EnqueueMessageResponse) ProtoMessage()    {}\n\n// A RequestUnion contains exactly one of the optional requests.\ntype RequestUnion struct {\n\tContains         *ContainsRequest       `protobuf:\"bytes,1,opt,name=contains\" json:\"contains,omitempty\"`\n\tGet              *GetRequest            `protobuf:\"bytes,2,opt,name=get\" json:\"get,omitempty\"`\n\tPut              *PutRequest            `protobuf:\"bytes,3,opt,name=put\" json:\"put,omitempty\"`\n\tConditionalPut   *ConditionalPutRequest `protobuf:\"bytes,4,opt,name=conditional_put\" json:\"conditional_put,omitempty\"`\n\tIncrement        *IncrementRequest      `protobuf:\"bytes,5,opt,name=increment\" json:\"increment,omitempty\"`\n\tDelete           *DeleteRequest         `protobuf:\"bytes,6,opt,name=delete\" json:\"delete,omitempty\"`\n\tDeleteRange      *DeleteRangeRequest    `protobuf:\"bytes,7,opt,name=delete_range\" json:\"delete_range,omitempty\"`\n\tScan             *ScanRequest           `protobuf:\"bytes,8,opt,name=scan\" json:\"scan,omitempty\"`\n\tEndTransaction   *EndTransactionRequest `protobuf:\"bytes,9,opt,name=end_transaction\" json:\"end_transaction,omitempty\"`\n\tReapQueue        *ReapQueueRequest      `protobuf:\"bytes,10,opt,name=reap_queue\" json:\"reap_queue,omitempty\"`\n\tEnqueueUpdate    *EnqueueUpdateRequest  `protobuf:\"bytes,11,opt,name=enqueue_update\" json:\"enqueue_update,omitempty\"`\n\tEnqueueMessage   *EnqueueMessageRequest `protobuf:\"bytes,12,opt,name=enqueue_message\" json:\"enqueue_message,omitempty\"`\n\tXXX_unrecognized []byte                 `json:\"-\"`\n}\n\nfunc (m *RequestUnion) Reset()         { *m = RequestUnion{} }\nfunc (m *RequestUnion) String() string { return proto1.CompactTextString(m) }\nfunc (*RequestUnion) ProtoMessage()    {}\n\nfunc (m *RequestUnion) GetContains() *ContainsRequest {\n\tif m != nil {\n\t\treturn m.Contains\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetGet() *GetRequest {\n\tif m != nil {\n\t\treturn m.Get\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetPut() *PutRequest {\n\tif m != nil {\n\t\treturn m.Put\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetConditionalPut() *ConditionalPutRequest {\n\tif m != nil {\n\t\treturn m.ConditionalPut\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetIncrement() *IncrementRequest {\n\tif m != nil {\n\t\treturn m.Increment\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetDelete() *DeleteRequest {\n\tif m != nil {\n\t\treturn m.Delete\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetDeleteRange() *DeleteRangeRequest {\n\tif m != nil {\n\t\treturn m.DeleteRange\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetScan() *ScanRequest {\n\tif m != nil {\n\t\treturn m.Scan\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetEndTransaction() *EndTransactionRequest {\n\tif m != nil {\n\t\treturn m.EndTransaction\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetReapQueue() *ReapQueueRequest {\n\tif m != nil {\n\t\treturn m.ReapQueue\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetEnqueueUpdate() *EnqueueUpdateRequest {\n\tif m != nil {\n\t\treturn m.EnqueueUpdate\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetEnqueueMessage() *EnqueueMessageRequest {\n\tif m != nil {\n\t\treturn m.EnqueueMessage\n\t}\n\treturn nil\n}\n\n// A ResponseUnion contains exactly one of the optional responses.\ntype ResponseUnion struct {\n\tContains         *ContainsResponse       `protobuf:\"bytes,1,opt,name=contains\" json:\"contains,omitempty\"`\n\tGet              *GetResponse            `protobuf:\"bytes,2,opt,name=get\" json:\"get,omitempty\"`\n\tPut              *PutResponse            `protobuf:\"bytes,3,opt,name=put\" json:\"put,omitempty\"`\n\tConditionalPut   *ConditionalPutResponse `protobuf:\"bytes,4,opt,name=conditional_put\" json:\"conditional_put,omitempty\"`\n\tIncrement        *IncrementResponse      `protobuf:\"bytes,5,opt,name=increment\" json:\"increment,omitempty\"`\n\tDelete           *DeleteResponse         `protobuf:\"bytes,6,opt,name=delete\" json:\"delete,omitempty\"`\n\tDeleteRange      *DeleteRangeResponse    `protobuf:\"bytes,7,opt,name=delete_range\" json:\"delete_range,omitempty\"`\n\tScan             *ScanResponse           `protobuf:\"bytes,8,opt,name=scan\" json:\"scan,omitempty\"`\n\tEndTransaction   *EndTransactionResponse `protobuf:\"bytes,9,opt,name=end_transaction\" json:\"end_transaction,omitempty\"`\n\tReapQueue        *ReapQueueResponse      `protobuf:\"bytes,10,opt,name=reap_queue\" json:\"reap_queue,omitempty\"`\n\tEnqueueUpdate    *EnqueueUpdateResponse  `protobuf:\"bytes,11,opt,name=enqueue_update\" json:\"enqueue_update,omitempty\"`\n\tEnqueueMessage   *EnqueueMessageResponse `protobuf:\"bytes,12,opt,name=enqueue_message\" json:\"enqueue_message,omitempty\"`\n\tXXX_unrecognized []byte                  `json:\"-\"`\n}\n\nfunc (m *ResponseUnion) Reset()         { *m = ResponseUnion{} }\nfunc (m *ResponseUnion) String() string { return proto1.CompactTextString(m) }\nfunc (*ResponseUnion) ProtoMessage()    {}\n\nfunc (m *ResponseUnion) GetContains() *ContainsResponse {\n\tif m != nil {\n\t\treturn m.Contains\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetGet() *GetResponse {\n\tif m != nil {\n\t\treturn m.Get\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetPut() *PutResponse {\n\tif m != nil {\n\t\treturn m.Put\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetConditionalPut() *ConditionalPutResponse {\n\tif m != nil {\n\t\treturn m.ConditionalPut\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetIncrement() *IncrementResponse {\n\tif m != nil {\n\t\treturn m.Increment\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetDelete() *DeleteResponse {\n\tif m != nil {\n\t\treturn m.Delete\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetDeleteRange() *DeleteRangeResponse {\n\tif m != nil {\n\t\treturn m.DeleteRange\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetScan() *ScanResponse {\n\tif m != nil {\n\t\treturn m.Scan\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetEndTransaction() *EndTransactionResponse {\n\tif m != nil {\n\t\treturn m.EndTransaction\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetReapQueue() *ReapQueueResponse {\n\tif m != nil {\n\t\treturn m.ReapQueue\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetEnqueueUpdate() *EnqueueUpdateResponse {\n\tif m != nil {\n\t\treturn m.EnqueueUpdate\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetEnqueueMessage() *EnqueueMessageResponse {\n\tif m != nil {\n\t\treturn m.EnqueueMessage\n\t}\n\treturn nil\n}\n\n// A BatchRequest contains one or more requests to be executed in\n// parallel, or if applicable (based on write-only commands and\n// range-locality), as a single update.\ntype BatchRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tRequests         []RequestUnion `protobuf:\"bytes,2,rep,name=requests\" json:\"requests\"`\n\tXXX_unrecognized []byte         `json:\"-\"`\n}\n\nfunc (m *BatchRequest) Reset()         { *m = BatchRequest{} }\nfunc (m *BatchRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*BatchRequest) ProtoMessage()    {}\n\nfunc (m *BatchRequest) GetRequests() []RequestUnion {\n\tif m != nil {\n\t\treturn m.Requests\n\t}\n\treturn nil\n}\n\n// A BatchResponse contains one or more responses, one per request\n// corresponding to the requests in the matching BatchRequest. The\n// error in the response header is set to the first error from the\n// slice of responses, if applicable.\ntype BatchResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tResponses        []ResponseUnion `protobuf:\"bytes,2,rep,name=responses\" json:\"responses\"`\n\tXXX_unrecognized []byte          `json:\"-\"`\n}\n\nfunc (m *BatchResponse) Reset()         { *m = BatchResponse{} }\nfunc (m *BatchResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*BatchResponse) ProtoMessage()    {}\n\nfunc (m *BatchResponse) GetResponses() []ResponseUnion {\n\tif m != nil {\n\t\treturn m.Responses\n\t}\n\treturn nil\n}\n\n// An AdminSplitRequest is arguments to the AdminSplit() method. The\n// existing range which contains RequestHeader.Key is split by\n// split_key. If split_key is not specified, then this method will\n// determine a split key that is roughly halfway through the\n// range. The existing range is resized to cover only its start key to\n// the split key. The new range created by the split starts at the\n// split key and extends to the original range's end key. If split_key\n// is known, header.key should also be set to split_key.\n//\n// New range IDs for each of the split range's replica and a new Raft\n// ID are generated by the operation. Split requests are done in the\n// context of a distributed transaction which updates range addressing\n// records, range metadata and finally, provides a commit trigger to\n// update bookkeeping and instantiate the new range on commit.\n//\n// The new range contains range replicas located on the same stores;\n// no range data is moved during this operation. The split can be\n// thought of as a mostly logical operation, though some other\n// metadata (e.g. response cache and range stats must be copied or\n// recomputed).\ntype AdminSplitRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tSplitKey         Key    `protobuf:\"bytes,2,opt,name=split_key,customtype=Key\" json:\"split_key\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *AdminSplitRequest) Reset()         { *m = AdminSplitRequest{} }\nfunc (m *AdminSplitRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*AdminSplitRequest) ProtoMessage()    {}\n\n// An AdminSplitResponse is the return value from the AdminSplit()\n// method.\ntype AdminSplitResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *AdminSplitResponse) Reset()         { *m = AdminSplitResponse{} }\nfunc (m *AdminSplitResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*AdminSplitResponse) ProtoMessage()    {}\n\n// An AdminMergeRequest is arguments to the AdminMerge() method. A\n// merge is always performed by calling AdminMerge on the range\n// that is subsuming the passed in subsumed_range. The ranges must\n// be consecutive in the key space, such that the end_key of the\n// subsuming range must match the start_key of the range being subsumed.\n// After the merge operation, the subsumed_range will no longer exist and\n// the subsuming range will now encompass all keys from its original\n// start_key to the end_key of the subsumed_range.\ntype AdminMergeRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tSubsumedRange    RangeDescriptor `protobuf:\"bytes,2,opt,name=subsumed_range\" json:\"subsumed_range\"`\n\tXXX_unrecognized []byte          `json:\"-\"`\n}\n\nfunc (m *AdminMergeRequest) Reset()         { *m = AdminMergeRequest{} }\nfunc (m *AdminMergeRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*AdminMergeRequest) ProtoMessage()    {}\n\nfunc (m *AdminMergeRequest) GetSubsumedRange() RangeDescriptor {\n\tif m != nil {\n\t\treturn m.SubsumedRange\n\t}\n\treturn RangeDescriptor{}\n}\n\n// An AdminMergeResponse is the return value from the AdminMerge()\n// method.\ntype AdminMergeResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *AdminMergeResponse) Reset()         { *m = AdminMergeResponse{} }\nfunc (m *AdminMergeResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*AdminMergeResponse) ProtoMessage()    {}\n\nfunc init() {\n}\nfunc (this *RequestUnion) GetValue() interface{} {\n\tif this.Contains != nil {\n\t\treturn this.Contains\n\t}\n\tif this.Get != nil {\n\t\treturn this.Get\n\t}\n\tif this.Put != nil {\n\t\treturn this.Put\n\t}\n\tif this.ConditionalPut != nil {\n\t\treturn this.ConditionalPut\n\t}\n\tif this.Increment != nil {\n\t\treturn this.Increment\n\t}\n\tif this.Delete != nil {\n\t\treturn this.Delete\n\t}\n\tif this.DeleteRange != nil {\n\t\treturn this.DeleteRange\n\t}\n\tif this.Scan != nil {\n\t\treturn this.Scan\n\t}\n\tif this.EndTransaction != nil {\n\t\treturn this.EndTransaction\n\t}\n\tif this.ReapQueue != nil {\n\t\treturn this.ReapQueue\n\t}\n\tif this.EnqueueUpdate != nil {\n\t\treturn this.EnqueueUpdate\n\t}\n\tif this.EnqueueMessage != nil {\n\t\treturn this.EnqueueMessage\n\t}\n\treturn nil\n}\n\nfunc (this *RequestUnion) SetValue(value interface{}) bool {\n\tswitch vt := value.(type) {\n\tcase *ContainsRequest:\n\t\tthis.Contains = vt\n\tcase *GetRequest:\n\t\tthis.Get = vt\n\tcase *PutRequest:\n\t\tthis.Put = vt\n\tcase *ConditionalPutRequest:\n\t\tthis.ConditionalPut = vt\n\tcase *IncrementRequest:\n\t\tthis.Increment = vt\n\tcase *DeleteRequest:\n\t\tthis.Delete = vt\n\tcase *DeleteRangeRequest:\n\t\tthis.DeleteRange = vt\n\tcase *ScanRequest:\n\t\tthis.Scan = vt\n\tcase *EndTransactionRequest:\n\t\tthis.EndTransaction = vt\n\tcase *ReapQueueRequest:\n\t\tthis.ReapQueue = vt\n\tcase *EnqueueUpdateRequest:\n\t\tthis.EnqueueUpdate = vt\n\tcase *EnqueueMessageRequest:\n\t\tthis.EnqueueMessage = vt\n\tdefault:\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (this *ResponseUnion) GetValue() interface{} {\n\tif this.Contains != nil {\n\t\treturn this.Contains\n\t}\n\tif this.Get != nil {\n\t\treturn this.Get\n\t}\n\tif this.Put != nil {\n\t\treturn this.Put\n\t}\n\tif this.ConditionalPut != nil {\n\t\treturn this.ConditionalPut\n\t}\n\tif this.Increment != nil {\n\t\treturn this.Increment\n\t}\n\tif this.Delete != nil {\n\t\treturn this.Delete\n\t}\n\tif this.DeleteRange != nil {\n\t\treturn this.DeleteRange\n\t}\n\tif this.Scan != nil {\n\t\treturn this.Scan\n\t}\n\tif this.EndTransaction != nil {\n\t\treturn this.EndTransaction\n\t}\n\tif this.ReapQueue != nil {\n\t\treturn this.ReapQueue\n\t}\n\tif this.EnqueueUpdate != nil {\n\t\treturn this.EnqueueUpdate\n\t}\n\tif this.EnqueueMessage != nil {\n\t\treturn this.EnqueueMessage\n\t}\n\treturn nil\n}\n\nfunc (this *ResponseUnion) SetValue(value interface{}) bool {\n\tswitch vt := value.(type) {\n\tcase *ContainsResponse:\n\t\tthis.Contains = vt\n\tcase *GetResponse:\n\t\tthis.Get = vt\n\tcase *PutResponse:\n\t\tthis.Put = vt\n\tcase *ConditionalPutResponse:\n\t\tthis.ConditionalPut = vt\n\tcase *IncrementResponse:\n\t\tthis.Increment = vt\n\tcase *DeleteResponse:\n\t\tthis.Delete = vt\n\tcase *DeleteRangeResponse:\n\t\tthis.DeleteRange = vt\n\tcase *ScanResponse:\n\t\tthis.Scan = vt\n\tcase *EndTransactionResponse:\n\t\tthis.EndTransaction = vt\n\tcase *ReapQueueResponse:\n\t\tthis.ReapQueue = vt\n\tcase *EnqueueUpdateResponse:\n\t\tthis.EnqueueUpdate = vt\n\tcase *EnqueueMessageResponse:\n\t\tthis.EnqueueMessage = vt\n\tdefault:\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Go/embedded.go",
    "content": "// Code generated by go-bindata.\n// sources:\n// ui/css/app.css\n// ui/css/graph.css\n// ui/css/libs/nvd3/1.7.1/nv.d3.min.css\n// ui/css/rest_explorer.css\n// ui/index.html\n// ui/js/app.js\n// ui/js/libs/d3/3.3.5/d3.min.js\n// ui/js/libs/mithriljs/0.2.0/mithril.min.js\n// ui/js/libs/mithriljs/0.2.0/mithril.min.js.map\n// ui/js/libs/nvd3/1.7.1/nv.d3.min.js\n// ui/ts/app.ts\n// ui/ts/components/metrics.ts\n// ui/ts/header.ts\n// ui/ts/models/node_status.ts\n// ui/ts/models/stats.ts\n// ui/ts/models/store_status.ts\n// ui/ts/models/timeseries.ts\n// ui/ts/pages/graph.ts\n// ui/ts/pages/monitor.ts\n// ui/ts/pages/nodes.ts\n// ui/ts/pages/rest_explorer.ts\n// ui/ts/pages/stores.ts\n// ui/ts/tsconfig.json\n// ui/ts/typings/d3/d3.d.ts\n// ui/ts/typings/jquery/jquery.d.ts\n// ui/ts/typings/mithriljs/mithril.d.ts\n// DO NOT EDIT!\npackage resource\n\nimport (\n  \"bytes\"\n  \"compress/gzip\"\n  \"fmt\"\n  \"io\"\n  \"io/ioutil\"\n  \"os\"\n  \"path\"\n  \"path/filepath\"\n  \"strings\"\n  \"time\"\n)\n\nfunc bindataRead(data []byte, name string) ([]byte, error) {\n  gz, err := gzip.NewReader(bytes.NewBuffer(data))\n  if err != nil {\n    return nil, fmt.Errorf(\"Read %q: %v\", name, err)\n  }\n\n  var buf bytes.Buffer\n  _, err = io.Copy(&buf, gz)\n  clErr := gz.Close()\n\n  if err != nil {\n    return nil, fmt.Errorf(\"Read %q: %v\", name, err)\n  }\n  if clErr != nil {\n    return nil, err\n  }\n\n  return buf.Bytes(), nil\n}\n\ntype asset struct {\n  bytes []byte\n  info  os.FileInfo\n}\n\ntype bindataFileInfo struct {\n  name    string\n  size    int64\n  mode    os.FileMode\n  modTime time.Time\n}\n\nfunc (fi bindataFileInfo) Name() string {\n  return fi.name\n}\nfunc (fi bindataFileInfo) Size() int64 {\n  return fi.size\n}\nfunc (fi bindataFileInfo) Mode() os.FileMode {\n  return fi.mode\n}\nfunc (fi bindataFileInfo) ModTime() time.Time {\n  return fi.modTime\n}\nfunc (fi bindataFileInfo) IsDir() bool {\n  return false\n}\nfunc (fi bindataFileInfo) Sys() interface{} {\n  return nil\n}\n\nvar _uiCssAppCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x7c\\x54\\xdb\\x6e\\xdb\\x38\\x10\\x7d\\xe7\\x57\\x0c\\x52\\x2c\\x72\\x81\\x65\\x3b\\x4e\\x16\\x58\\xd8\\x2f\\xab\\xba\\x59\\xc4\\x68\\xa1\\x2c\\x22\\x67\\x8b\\x3e\\x52\\xd2\\x48\\x22\\x42\\x91\\x5c\\x92\\xb2\\xec\\x2e\\xfa\\xef\\x3b\\x94\\xe4\\x34\\xee\\xcd\\x0f\\x86\\x67\\xe6\\x78\\xe6\\x9c\\xb9\\x70\\x76\\x75\\xc5\\xd6\\xda\\x1c\\xac\\xa8\\x6a\\x0f\\x8b\\xf9\\xf5\\x2d\\x6c\\x6b\\x84\\xb5\\xce\\x9f\\xad\\xe6\\x79\\x0d\\x71\\xeb\\x6b\\x6d\\xdd\\x94\\xb1\\x0f\\x22\\x47\\xe5\\xb0\\x80\\x56\\x15\\x68\\xc1\\x13\\x2c\\x36\\x04\\x41\\x18\\x23\\x13\\xf8\\x07\\xad\\x13\\x5a\\xc1\\x62\\x3a\\x87\\x8b\\x00\\x38\\x1b\\x43\\x67\\x97\\x2b\\x76\\xd0\\x2d\\x34\\xfc\\x00\\x4a\\x7b\\x68\\x1d\\x52\\x02\\xe1\\xa0\\x14\\x12\\x01\\xf7\\x39\\x1a\\x0f\\x42\\x41\\xae\\x1b\\x23\\x05\\x57\\x39\\x42\\x27\\x7c\\xdd\\x17\\x19\\x53\\x4c\\xd9\\xa7\\x31\\x81\\xce\\x3c\\x27\\x2c\\x27\\xb4\\x21\\xab\\x7c\\x8d\\x02\\xee\\x19\\x03\\xfa\\xd4\\xde\\x9b\\xe5\\x6c\\xd6\\x75\\xdd\\x94\\xf7\\x2c\\xa7\\xda\\x56\\x33\\x39\\xa0\\xdc\\xec\\xc3\\x66\\x7d\\x97\\xa4\\x77\\x11\\x31\\x65\\xec\\x49\\x49\\x74\\x0e\\x2c\\xfe\\xdb\\x0a\\x4b\\x02\\xb3\\x03\\x70\\x43\\x3c\\x72\\x9e\\x11\\x3b\\xc9\\x3b\\xd0\\x16\\x78\\x65\\x91\\x62\\x5e\\x07\\x9e\\x9d\\x15\\x5e\\xa8\\x6a\\x02\\x4e\\x97\\xbe\\xe3\\x16\\x59\\x21\\x9c\\xb7\\x22\\x6b\\xfd\\x49\\x83\\x8e\\xac\\x48\\xe9\\x6b\\x00\\xb5\\x88\\x2b\\x38\\x8b\\x53\\xd8\\xa4\\x67\\xf0\\x36\\x4e\\x37\\xe9\\x84\\x7d\\xdc\\x6c\\xef\\x1f\\x9e\\xb6\\xf0\\x31\\x7e\\x7c\\x8c\\x93\\xed\\xe6\\x2e\\x85\\x87\\x47\\x58\\x3f\\x24\\xef\\x36\\xdb\\xcd\\x43\\x42\\xd6\\x5f\\x10\\x27\\x9f\\xe0\\xfd\\x26\\x79\\x37\\x01\\xa4\\xf6\\x50\\x11\\xdc\\x1b\\x1b\\xb8\\x6b\\xcb\\x44\\x68\\x1d\\x16\\x53\\x48\\x11\\x4f\\x8a\\x97\\x7a\\x20\\xe3\\x0c\\xe6\\xa2\\x14\\x39\\x29\\x52\\x55\\xcb\\x2b\\x84\\x4a\\xef\\xd0\\x2a\\x12\\xc2\\x0c\\xda\\x46\\xb8\\x30\\x3c\\x47\\xd4\\x0a\\x90\\xa2\\x11\\x9e\\xfb\\xde\\xfe\\x4e\\xce\\xd7\\x12\\xf1\\x13\\x71\\x7e\\x4c\\xfb\\x31\\xb2\\x50\\x47\\xf1\\x06\\x5d\\x98\\x49\\xae\\xd5\\x20\\x77\\x58\\x9e\\x61\\x8d\\x96\\x10\\xab\\xc2\\x62\\x07\\x6f\\xb5\\xda\\x21\\x01\\x10\\x2e\\xa8\\xda\\x21\\xa3\\x32\\x7f\\x56\\x0d\\x17\\x72\\x4a\\x1b\\x70\\xc9\\xae\\x66\\xec\\x0a\\xfe\\xa3\\x39\\x36\\xdc\\x56\\x42\\x2d\\x61\\xbe\\x22\\xc3\\xf0\\xa2\\x20\\xae\\xa3\\x15\\x35\\xfa\\x73\\x94\\xe9\\x7d\\xe4\\xc4\\xe7\\xde\\x9b\\x69\\x4b\\x3c\\x83\\xab\\x0f\\x77\\x98\\x3d\\x0b\\xff\\x0b\\xc4\\xcf\\x22\\x5f\\x58\\xed\\x1b\\x39\\x61\\x99\\x2e\\x0e\\x3d\\x89\\x1a\\xc3\\x71\\x2c\\xe1\\x7a\\x3e\\xff\\xed\\x5b\\x1e\\x5f\\xbe\\xc2\\x32\\x9e\\x3f\\x57\\x56\\x53\\xb7\\xa2\\x5c\\xcb\\x20\\xf6\\x4d\\x79\\x5d\\x2e\\xca\\x9b\\xf0\\x9f\\xa3\\xe7\\xe6\\xa6\\x37\\x4b\\xea\\x4e\\x54\\xf2\\x46\\xc8\\xc3\\x12\\xce\\x53\\xdd\\x5a\\xda\\xf8\\x94\\x53\\xb3\\xff\\xb6\\xfa\\x7c\\x02\\xe7\\xf7\\x28\\x77\\xe8\\x69\\x03\\x21\\xc1\\x16\\xc9\\xf3\\xe2\\xa0\\x9d\\x23\\x5c\\xe4\\xd0\\x8a\\xf2\\x25\\x55\\x37\\x52\\xbc\\x9d\\xcf\\x5f\\x7c\\xa4\\x0d\\x89\\xf4\\xad\\xe9\\x35\\x4d\\xcb\\x56\\xca\\xfb\\x1e\\xb6\\xa6\\x28\\x1d\\x10\\xcd\\xf4\\xb5\\xba\\x9c\\xcb\\xfc\\x22\\x48\\x84\\x08\\x7e\\x9f\\x9b\\xfd\\xe5\\x0a\\x66\\x57\\xf0\\x1e\\xd1\\x84\\x85\\x97\\x84\\x1f\\x4e\\x72\\xc0\\x87\\x11\\xd3\\x61\\x99\\x84\\xef\\x80\\xa6\\x45\\xf9\\x47\\xe3\\x75\\xca\\x90\\x66\\xf5\\x93\\xce\\x94\\xe5\\x30\\x83\\xb1\\xef\\xde\\xeb\\x86\\xc8\\x9a\\x3d\\x5d\\x94\\x14\\x05\\xbc\\x29\\x8a\\xe2\\xa4\\xd7\\xd7\\x94\\x8b\\xde\\xa7\\x51\\xcc\\x50\\x2c\\x22\\x56\\xcf\\xcb\\xf0\\x35\\x39\\x75\\xed\\x84\\x13\\xe1\\xce\\x02\\x19\\x8f\\x7b\\x1f\\x15\\x98\\x6b\\xdb\\xaf\\xf3\\x92\\xde\\x1f\\x85\\xab\\x63\\xc0\\x5b\\x6a\\x26\\x2d\\x2e\\x15\\x6f\\x0d\\x1d\\x41\\xce\\x1d\\xfe\\x60\\x5e\\x74\\xbc\\x46\\x72\\x9a\\x95\\x50\\xa1\\x13\\x51\\x26\\xe9\\x81\\x5c\\xbd\\x2c\\x68\\x64\\x07\\xc1\\x3f\\xe2\\x77\\xfc\\x5d\\xeb\\x06\\x13\\xba\\x8e\\x9e\\xd4\\xc9\\xd0\\xfe\\xf8\\x6e\\x68\\x8b\\xc5\\xd0\\xb8\\x6f\\x29\\x1e\\xa9\\xd3\\xd5\\x86\\x55\\x90\\x11\\x97\\xa2\\x22\\x49\\xd1\\x62\\xa8\\xfb\\x7f\\x00\\x00\\x00\\xff\\xff\\x4c\\xec\\x61\\x77\\xce\\x05\\x00\\x00\")\n\nfunc uiCssAppCssBytes() ([]byte, error) {\n  return bindataRead(\n    _uiCssAppCss,\n    \"ui/css/app.css\",\n  )\n}\n\nfunc uiCssAppCss() (*asset, error) {\n  bytes, err := uiCssAppCssBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/css/app.css\", size: 1486, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiCssGraphCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x7c\\x8d\\x31\\x0e\\xc2\\x30\\x0c\\x45\\xf7\\x9c\\xc2\\x12\\x2b\\xad\\xd2\\x81\\x25\\x9d\\x39\\x48\\x20\\x9f\\xc6\\x22\\x72\\x23\\x27\\x88\\x4a\\x88\\xbb\\x03\\x29\\x12\\x4c\\xdd\\xfc\\xf4\\x9e\\xed\\x3e\\xb1\\x80\\x1e\\x86\\xe8\\xc2\\x29\\x39\\x92\\x59\\x30\\xbe\\xa9\\x54\\x9d\\xaf\\xe8\\xee\\x1c\\x6a\\x74\\x34\\xf4\\x87\\xbc\\x8c\\xe6\\x69\\x4c\\xeb\\x6d\\x5b\\x58\\x13\\xa7\\x08\\x3f\\x33\\xfc\\x9b\\x53\\xba\\x61\\x55\\x7e\\xe1\\x42\\xd9\\xd7\\xb8\\xff\\xce\\x9b\\x5f\\x1d\\xed\\xac\\xb5\\x8d\\xa3\\xcf\\xe8\\x14\\x12\\xa0\\x2c\\x93\\xa3\\xb3\\x72\\xc9\\xc7\\x30\\xa1\\x7c\\x0e\\xbf\\x02\\x00\\x00\\xff\\xff\\xd9\\x8a\\x57\\x81\\xbd\\x00\\x00\\x00\")\n\nfunc uiCssGraphCssBytes() ([]byte, error) {\n  return bindataRead(\n    _uiCssGraphCss,\n    \"ui/css/graph.css\",\n  )\n}\n\nfunc uiCssGraphCss() (*asset, error) {\n  bytes, err := uiCssGraphCssBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/css/graph.css\", size: 189, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiCssLibsNvd3171NvD3MinCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xcc\\x5a\\x4f\\x6f\\xe3\\xba\\x11\\xff\\x2a\\x2a\\x16\\x05\\x1a\\x40\\x12\\x24\\xc5\\x4e\\x62\\xe9\\xf4\\x5e\\x1b\\xb4\\x87\\x3e\\xa0\\x87\\xa2\\x77\\x5a\\xa2\\x6d\\xc2\\x94\\x28\\x50\\x74\\x6c\\xc7\\xd8\\xef\\x5e\\xfe\\x11\\x25\\x52\\xa4\\x64\\x67\\x91\\xc3\\x83\\x91\\x0d\\x43\\xfe\\x66\\x38\\x1c\\xce\\x5f\\x7a\\xe3\\xe6\\xa3\\x7a\\x0e\\xf8\\xbf\\x11\\xb8\\xa0\\xee\\xd6\\x12\\xd4\\x30\\x48\\x23\\xf8\\x01\\x1b\\xd6\\xe5\\x0d\\x69\\x60\\x41\\x5a\\x50\\x22\\x76\\xcd\\xd3\\x9f\\x36\\x38\\x68\\x01\\x3b\\xdc\\x76\\x08\\x63\\x85\\xeb\\x18\\x25\\x47\\x98\\xff\\x48\\x92\\xa4\\x1f\\x47\\x9a\\x34\\x7e\\x5d\\x17\\xdd\\x01\\xb4\\x30\\xa2\\xb0\\xa9\\x20\\x45\\xcd\\x3e\\x2f\\x29\\xea\\xda\\xf7\\x6a\\x0f\\x3b\\x1f\\xdf\\xb8\\x22\\x35\\x40\\xcd\\xcd\\x65\\x34\\x41\\x8b\\xdf\\x97\\x25\\x92\\x64\\xca\\x1e\\xa3\\x06\\x7a\\xc4\\x86\\x6b\\xf1\\xf9\\x82\\x98\\xf1\\x27\\xa4\\x44\\x72\\x0b\\x3d\\x3b\\xc8\\xd5\\xfb\\xe2\\x0f\\x83\\x3f\\xc0\\xe5\\x0f\\xd4\\x04\\x0c\\x5e\\xd8\\x6d\\x47\\x1a\\x16\\x9d\\x21\\xda\\x1f\\x58\\xfe\\x9a\\x0c\\x07\\xb8\\x2c\\x52\\x69\\x21\\x2e\\xd9\\x63\\xb0\\x3b\\x32\\x88\\x7f\\x22\\xd0\\x94\\x07\\x42\\xf3\\x1a\\x55\\x15\\x86\\x1e\\xc5\\x57\\xa8\\x03\\x5b\\x0c\\xab\\x9b\\x4f\\xd9\\x5b\\x40\\xbb\\x80\\xc2\\x92\\x49\\x65\\x5b\\xb6\\xc0\\x28\\x68\\x3a\\xc4\\x10\\x69\\x72\\x73\\x2d\\xc8\\xd6\\x49\\xad\\xd4\\x07\\x68\\x11\\xd5\\xe4\\x33\\x7a\\x0c\\x79\\x86\\xdb\\x23\\x62\\x0f\\x81\\x7d\\x02\\xc6\\x07\\xf2\\x01\\xa9\\x2d\\x66\\x3a\\x05\\x2a\\xd0\\x78\\xa0\\xfc\\x07\\xa8\\xaa\\x37\\xf8\\x32\\xc5\\xa9\\x1b\\x14\\x00\\xba\\xdf\\x82\\xbf\\x25\\xa1\\xfc\\x3c\\xcd\\xb0\\xf3\\xa2\\x53\\x13\\x5d\\x9f\\x30\\x43\\x9c\\x44\\xfe\\xb1\\xa7\\xe4\\xd4\\x2a\\xa1\\x43\\x17\\xf2\\x2f\\x42\\xd1\\x27\\xb7\\x1d\\x80\\x17\\xc0\\xfc\\xce\\x4a\\x0a\\x19\\xf4\\xb0\\x74\\x5c\\xe7\\x4f\\x72\\x51\\x73\\x2a\\xc8\\xa5\\x0e\\xbf\\xa4\\x08\\x87\\x64\\x41\\x1d\\xf9\\x1d\\xb3\\x98\\x21\\x35\\xbd\\xec\\xae\\x4c\\x3e\\x7f\\x2f\\x5c\\x7b\\xd0\\x51\\xca\\x63\\x52\\xd2\\xa2\\x4e\\x18\\x43\\xc5\\x27\\x4f\\x93\\xf6\\x12\\x74\\x5c\\xbf\\x51\\xc7\\x23\\xd8\\x6e\\x0a\\x52\\x32\\x41\\xd0\\x9d\\x28\\x9c\\x38\\xe6\\xdb\\x12\\x76\\x41\\x19\\x53\\x02\\x40\\x8f\\x1c\\xe9\\x49\\x07\\x67\\x54\\xb1\\x43\\x9e\\xb5\\x97\\x05\\xba\\xff\\x52\\x04\\x9a\\x3d\\x86\\x16\\xbd\\xf2\\xb7\\xdd\\x6e\\x67\\x73\\x4a\\xe3\\xf5\\x0c\\x2f\\x86\\xca\\xa3\\x0a\\xf4\\x9a\\xcd\\xcb\\xcb\\x8b\\x4d\\x3c\\x4b\\xcb\\x6d\\x73\\x0f\\xc5\\xa0\\x4b\\x7a\\x47\\x87\\x10\\xde\\x41\\xa6\\x3d\\xb2\\xaa\\xaa\\x3b\\xc8\\xac\\x47\\x96\\x65\\x39\\x23\\x39\\xe3\\x87\\x97\\x16\\xd1\\xa1\\x4f\\x98\\xa7\\xab\\xf6\\x52\\x78\\x13\\xc2\\x84\\xb0\\x3b\\x6d\\x7b\\x5a\\xc9\\x7f\\xb3\\xd9\\xcc\\x4b\\xd2\\x63\\xb6\\x40\\x7c\\x0a\\xdb\\x0a\\x56\\xf3\\x64\\x3e\\x1b\\x88\\x5f\\x47\\xbc\\x50\\xf8\\x7f\\xf0\\xa9\\xfb\\xbd\\x77\\x08\\xe1\\x18\\xde\\x04\\x70\\x9f\\xe4\\x9e\\xef\\xf5\\xee\\x23\\xf3\\x7e\\xcf\\x66\\xcc\\xe9\\xf3\\x38\\x40\\x21\\xd0\\x26\\x31\\x22\\x35\\x87\\x60\\xf8\\xab\\x2b\\x01\\xe3\\x75\\x90\\xc9\\x42\\x0c\\x65\\x79\\x64\\x0b\\xe5\\xd4\\x3a\\xc6\\xed\\xf4\\x5c\\xe4\\x10\\x09\\xa3\\x56\\x0c\\x1e\\xe0\\x1a\\xaf\\xff\\x82\\xea\\x96\\x50\\x06\\x1a\\xe6\\x14\\x53\\xc6\\xda\\xcf\\xf8\\x8c\\xd8\\xc1\\x88\\xa7\\x5d\\xe0\\x9c\\x7d\\xdc\\xc2\\x08\\xbb\\xa6\\x2b\\x58\\x61\\x37\\xb4\\x77\\x5b\\x8e\\xf4\\xbf\\xc8\\xc5\\xcd\\x02\\xbf\\xc4\\xc8\\x51\\xb4\\xf7\\xd4\\xf1\\x34\\xe2\\xfb\\x01\\x37\\x2b\\x38\\xbc\\x0a\\xa7\\xb3\\x2e\\x64\\xb3\\x74\\x23\\x1b\\xeb\\x4a\\x86\\x9d\\x24\\xfb\\x48\\xd8\\x5e\\x5f\\x2c\\xeb\\x60\\x04\\x00\\x70\\xcc\\xa6\\x18\\x62\\x8d\\xbd\\xb3\\x59\\x52\\x21\\x5e\\x95\\x5e\\xfe\\x2d\\x6c\\xbd\\x3c\\xd1\\x8e\\x57\\x66\\xf0\\xcc\\x4b\\x55\\x11\\x27\\x7e\\x76\\x1f\\x7b\\x89\\x8b\\xf8\\xe0\\x36\\x68\\x98\\x9c\\xca\\x43\\x54\\x02\\x8c\\xc9\\x89\\xa9\\x72\\x57\\x2f\\x9d\\x78\\x76\\xe0\\x19\\x02\\x0b\\x5f\\x53\\x0b\\xc7\\x03\\xab\\xb1\\x67\\xbe\\xee\\x7c\\x93\\xdc\\x10\\x9c\\x59\\x67\\x82\\x67\\xc8\\x16\\x83\\x6b\\xbe\\xc5\\xa4\\x3c\\x16\\x7d\\xd0\\x4e\\x92\\xbf\\x16\\x07\\x15\\xcb\\xc4\\x58\\x1c\\x8f\\x11\\xc2\\x93\\x64\\xab\\x8c\\xf9\\xb9\\x8a\\x78\\x11\\x5e\\x91\\x73\\x38\\xf9\\x3b\\x18\\x91\\x37\\x29\\xc0\\x96\\x5c\\xfa\\xa5\\x3c\\x09\\x78\\x38\\x0f\\x64\\xee\\x33\\x72\\x64\\x9c\\x3d\\x0d\\x07\\x7e\\x08\\xfc\\x45\\x8e\\x94\\x37\\x09\\x3c\\x34\\x56\\xe8\\xd4\\xe5\\x1c\\x5d\\xf4\\x52\\x4d\\xa7\\x9d\\x99\\xfe\\x4a\\x87\\xe4\\x9f\\xaf\\x92\\x24\\x48\\x79\\x62\\x0c\\x7e\\xe3\\xe9\\x0f\\xeb\\x1b\\x1f\\x73\\x81\\x88\\xfa\\x81\\x48\\x05\\x36\\x40\\x06\\xcc\\xf2\\x28\\x2c\\xba\\xa9\\x6e\\x63\\x96\\xf4\\x19\\x90\\x00\\x37\\xe4\\x1f\\x80\\x01\\x33\\xbb\\xbc\\xf9\\xb3\\x4b\\xb4\\xa5\\xa7\\xee\\x10\\xc4\\x5c\\x40\\xe8\\xc4\\xa6\\x34\\xbb\\xd7\\x26\\x69\\x72\\x65\\x9b\\x46\\xa3\\x28\\xcd\\xdb\\x48\\xc9\\xc6\\x41\\x30\\xdc\\x73\\x6e\\x2a\\x95\\x71\\x9e\\xb0\\xd3\\x36\\xde\\xf7\\xa4\\x7e\\xa8\\xee\\x40\\x82\\x12\\xd1\\x12\\x4f\\x2a\\x1a\\xab\\x1b\\x99\\x3f\\x50\\xe2\\x75\\x5e\\x49\\xf0\\xfb\\xa0\\x5d\\xb3\\x40\\xf6\\x14\\x35\\xf1\\xaa\\x98\\x51\\xbf\\x99\\x20\\xc9\\x01\\x97\\x3a\\xd3\\x89\\x12\\xa5\\x1b\\x46\\x76\\xf8\\x49\\xcd\\xd2\\x64\\x9e\\xc8\\x17\\xb9\\xb2\\x07\\x49\\x5b\\x22\\x42\\xef\\xc7\\x58\\x20\\x65\\x25\\x48\\xb2\\xf2\\x21\\xda\\x06\\xee\\x81\\x45\\x5b\\xbd\\x64\\xaf\\xd9\\x9b\\x56\\xde\\x68\\x92\\x73\\x4f\\x04\\xef\\xef\\xef\\x4e\\x0c\\x5d\\x3d\\xd0\\x7a\\xef\\x08\\x85\\x4b\\x9c\\x1d\\xa5\\xab\\x30\\x0c\\x28\\x8f\\x80\\x10\\xff\\x9d\\x70\\x3f\\x44\\x0d\\x60\\xb0\\xf3\\x98\\x83\\xef\\xea\\x74\\xc9\\x98\\xef\\x29\\xb8\\x3e\\xf6\\x34\\xe0\\xd9\\x2c\\xf0\\xf6\\x97\\xb6\\xfd\\x3c\\x0f\\x41\\x21\\xae\\x51\\x27\\xaa\\x85\\xff\\x01\\x7c\\x82\\x9d\\x2c\\x4b\\x66\\x5e\\x2c\\x1c\\x23\\x4c\\xa7\\x6a\\x18\\x26\\x2a\\xc0\\x85\\xa7\\xfc\\x10\\xf9\\x3a\\x34\\xaa\\xaf\\x16\\x41\\x33\\x31\\x7d\\xb1\\xf1\\x0b\\xbf\\xa7\\x88\\xf8\\x76\\xfe\\x5f\\x68\\x32\\x7f\\x6d\\x0b\\x5b\\x81\\xfd\\x6f\\xa7\\x72\\xcf\\x56\\x7d\\x11\\xa1\\xba\\xb6\\x74\\x13\\xa6\\x9b\\x97\\x30\\x5b\\x6d\\xc2\\x78\\xbd\\x79\\x72\\x79\\xf0\\xbb\\x2e\\xa1\\xca\\x09\\xb3\\x37\\x9c\\xcc\\xde\\x9d\\xaf\\x3d\\xe2\\xfb\\x4f\\x0d\\x62\\xb2\\xad\\x7a\\x84\\x18\\x7c\\xc9\\x1b\\xb4\\xb4\\x7c\\x18\\x6c\\x21\\xf6\\xbd\\x10\\xce\\x40\\x3d\\xa5\\xff\\x5c\\xb1\\xfc\\x70\\x5d\\x96\\x25\\xee\\x99\\x62\\xf3\\x4d\\xcd\\xac\\x04\\x4d\\x2e\\x6e\\x23\\xc1\\x93\\x61\\x23\\x8f\\x02\\x4a\\x19\\xcb\\x66\\x0e\\x26\\x32\\x0c\\xbb\\x84\\x7a\\x74\\x5d\\x56\\x40\\xc7\\xdd\\xff\\x28\\x7d\\xd6\\x8e\\x4f\\x1e\\x44\\xcb\\xbb\\x9e\\x40\\xd4\\x6c\\x91\\x94\\x50\\xba\\xfb\\x83\\xcc\\x25\\xa9\\x4d\\x69\\x37\\xbb\\xcf\\xcf\\xcf\\x8b\\x9d\\xb2\\xc5\\x29\\x9c\\x93\\x6d\\x2a\\x0d\\x8f\\x6b\\x86\\xa6\\xe5\\xde\\xbf\\x89\\x7e\\xea\\xf1\\x7e\\xc8\\x39\\xc0\\x45\\x0a\\x3f\\x27\\x81\\x98\\xb9\\x2a\\xc5\\xd8\\x5e\\x50\\x8c\\x5e\\x16\\x6f\\x60\\x6d\\x55\\x30\\xab\\x64\\x71\\x47\\x8b\\x1f\\x77\\x1a\\x5d\\x83\\xf8\\xd1\\x35\\xb8\\xd8\\x78\\x95\\x25\\xfb\\x5c\\x3f\\x4d\\x99\\x1e\\x7a\\xd4\\xd8\\xf4\\x2a\\x53\\xf6\\xf4\\x66\\xda\\xf4\\xd3\\xf3\\x12\\x88\\xe7\\x1b\\xa6\\x78\\x38\\xcf\\x44\\x63\\x19\\x17\\xa7\\xb0\\x36\\xf8\\x30\\x9e\\x81\\x61\\x25\\x9a\\x5d\\xbb\\xf3\\x9d\\xf8\\xb8\\xdb\\x83\\x7c\\x25\\x66\\x7e\\x4f\\x70\\xff\\xb6\\x10\\x7e\\xa7\\x43\\x9c\\x51\\x89\\x2f\\x3c\\xc4\\x1b\\x3f\\x9d\\xb7\\xa7\\xf6\\xb6\\x71\\xb6\\xf1\\xeb\\x9e\\x45\\x95\\x5c\\xfc\\x2c\\x60\\xdb\\x11\\x7c\\x62\\xb0\\x18\\x2b\\xa5\\xa8\\x24\\x98\\xd7\\xba\\x32\\x53\\x64\\xeb\\x75\\xa8\\x7f\\xd2\\xa7\\xc2\\x58\\x19\\x9e\\x03\\x5b\\x50\\x55\\xa2\\x04\\x49\\x87\\xee\\x42\\x0c\\x03\\xce\\x16\\x55\\xd3\\x76\\xe5\\x53\\xb5\\x8d\\xa2\\xd9\\xe2\\x46\\x63\\xb7\\x64\\xd2\\x84\\x76\\xa0\\x46\\xf8\\x9a\\xcb\\xce\\xc2\\x34\\x2a\\x5e\\x93\\x14\\xea\\x6b\\x00\\x8c\\xf6\\x4d\\x8e\\xe1\\x8e\\x15\\xbe\\x2f\\x88\\xce\\x07\\xc4\\xa0\\x30\\xde\\x52\\x3c\\xaa\\x9c\\x29\\x68\\x8b\\xef\\x6d\\x40\\x7d\\xbd\\xa6\\xb7\\x2d\\x9d\\x4e\\x98\\xda\\x1f\\x75\\xed\\x6a\\x39\\x7e\\x7b\\x5a\\x56\\xe3\\xfa\\x69\\xd2\\xc4\\xad\\x54\\x38\\xb5\\x1a\\x57\\xe3\\x15\\x26\\xf4\\xbe\\xcb\\x68\\x51\\x0c\\xb3\\xd6\\x56\\xbb\\xe4\\x43\\x5e\\x8c\\xeb\\x21\\x3e\\xd8\\xb8\\x1c\\x55\\x50\\x5c\\x7b\\x96\\xf0\\xd5\\xe9\\x0e\\xf6\\x9a\\xc3\\xd9\\x5c\\x36\\x0f\\x7d\\x89\\x86\\x71\\x68\\x4c\\x5f\\x23\\xc3\\xe4\\x7b\\x3b\\x7d\\xb3\\xd4\\x15\\x1c\\x9e\\x6f\\x35\\xa0\\x7b\\xd4\\x70\\x7f\\xd1\\x10\\xd1\\xdc\\xca\\xc7\\x4e\\x21\\x7a\\xa4\\x1f\\x08\\xa6\\xfd\\x29\\x8f\\xee\\x73\\x5e\\xb3\\x7a\\x0d\\xf5\\x4f\\xfc\\xba\\xf6\\xfb\\x8d\\x61\\xce\\x25\\x14\\x86\\xac\\xaf\\x75\\x4b\\x18\\x23\\xb5\\x71\\xfb\\x3f\\xe0\\x56\\x7c\\xe6\\x9b\\x7d\\xf9\\x3c\\x90\\x04\\xc9\\x4c\\xd3\\x3f\\x2c\\xdb\\x2b\\xe9\\xb8\\x62\\x2a\\xa4\\x75\\xf5\\xb1\\xd6\\xfa\\x70\\x64\\x36\\x09\\xb9\\xd7\\x35\\x37\\xed\\xd3\\xa8\\x91\\xba\\x53\\xae\\xdd\\x33\\x14\\x8f\\x0a\\xd6\\x56\\x4c\\xf4\\xcb\\x7a\\xbb\\x97\\xf1\\x75\\x42\\xf8\\xaf\\xd8\\xd7\\x05\\x07\\xac\\x1a\\x2e\\x52\\xb0\\xdb\\xf0\\x1f\\xc9\\xb6\\xe0\\xa1\\x93\\x37\\x84\\x00\\xf7\\xe2\\x8d\\xdf\\x13\\x4e\\xe9\\xe3\\x23\\xbc\\xde\\x3c\\x59\\xda\\xc1\\x7d\\xc8\\x4c\\x67\\x1c\\x99\\x0a\\xb8\\xef\\x89\\x62\\x42\\x4a\\xe3\\x03\\x5f\\xc5\\x02\\x61\\xca\\x9b\\xf6\\xf2\\xa6\\x52\\x5e\\xeb\\xb2\\x79\\x6c\\xbf\\x62\\x98\\xcb\\xeb\\x9e\\xac\\x8c\\xf5\\x73\\x3f\\xcf\\x48\\xeb\\x83\\x8b\\x69\\xab\\x63\\x77\\xce\\xa3\\x9e\\x2a\\x94\\x9d\\x46\\xfb\\x13\\xaa\\x60\\x50\\xa1\\x8f\\x9b\\x22\\x12\\xc6\\xdd\\x1b\\xba\\x18\\x3e\\xae\\xcd\\x45\\xae\\xe2\\x1d\\x69\\x78\\x60\\xcb\\x7c\\x09\\x42\\x7f\\x39\\xa0\\xf9\\xf2\\xbe\\x9a\\x70\\xbb\\x1a\\x94\\xf6\\x7c\\xc7\\xea\\xa2\\x96\\xef\\xce\\x81\\xbc\\x17\\xae\\x09\\xbf\\x31\\xef\\x7f\\x1b\\xd0\\x46\\x39\\x79\\x90\\x37\\x4a\\xee\\x7f\\x0a\\xc1\\xe5\\x6b\\xe6\\x6c\\xd9\\xab\\xbe\\x4a\\x17\\x79\\x57\\x60\\xad\\x1a\\x57\\x7c\\x81\\xf2\\xff\\x00\\x00\\x00\\xff\\xff\\x04\\x28\\x3d\\x62\\xbe\\x20\\x00\\x00\")\n\nfunc uiCssLibsNvd3171NvD3MinCssBytes() ([]byte, error) {\n  return bindataRead(\n    _uiCssLibsNvd3171NvD3MinCss,\n    \"ui/css/libs/nvd3/1.7.1/nv.d3.min.css\",\n  )\n}\n\nfunc uiCssLibsNvd3171NvD3MinCss() (*asset, error) {\n  bytes, err := uiCssLibsNvd3171NvD3MinCssBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/css/libs/nvd3/1.7.1/nv.d3.min.css\", size: 8382, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiCssRest_explorerCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x94\\x54\\xdd\\x6f\\xdb\\x36\\x10\\x7f\\xe7\\x5f\\x71\\xc8\\x30\\xa4\\x0d\\xfc\\x91\\xb6\\xdb\\x8b\\x02\\x0c\\x53\\xdc\\x0c\\x13\\x16\\x38\\x83\\xe5\\xac\\xe8\\x23\\x45\\x9d\\x24\\xa2\\x14\\x8f\\x23\\xa9\\xc8\\xc6\\xb0\\xff\\x7d\\x47\\xc9\\xd9\\x9a\\x64\\x5f\\xf5\\x93\\x8f\\xbc\\xbb\\xdf\\xc7\\x1d\\xb5\\xbe\\xb8\\x10\\x1b\\x72\\x47\\xaf\\xdb\\x2e\\xc2\\xdb\\xcb\\x37\\xdf\\xc0\\xbe\\x43\\xd8\\x90\\xfa\\xe4\\x49\\xaa\\x0e\\xf2\\x21\\x76\\xe4\\xc3\\x4a\\x88\\x5b\\xad\\xd0\\x06\\xac\\x61\\xb0\\x35\\x7a\\x88\\x9c\\x96\\x3b\\x4e\\x41\\x38\\xdd\\x2c\\xe0\\x17\\xf4\\x41\\x93\\x85\\xb7\\xab\\x4b\\x78\\x95\\x12\\xce\\x4e\\x57\\x67\\xaf\\xaf\\xc4\\x91\\x06\\xe8\\xe5\\x11\\x2c\\x45\\x18\\x02\\x72\\x03\\x1d\\xa0\\xd1\\x06\\x01\\x0f\\x0a\\x5d\\x04\\x6d\\x41\\x51\\xef\\x8c\\x96\\x56\\x21\\x8c\\x3a\\x76\\x13\\xc8\\xa9\\xc5\\x4a\\x7c\\x3c\\x35\\xa0\\x2a\\x4a\\xce\\x95\\x9c\\xed\\x38\\x6a\\x3e\\xcf\\x02\\x19\\x85\\x00\\xfe\\x75\\x31\\xba\\x6c\\xbd\\x1e\\xc7\\x71\\x25\\x27\\x96\\x2b\\xf2\\xed\\xda\\xcc\\x59\\x61\\x7d\\x5b\\x6c\\x6e\\xb6\\xe5\\xcd\\x92\\x99\\x0a\\x71\\x6f\\x0d\\x86\\x00\\x1e\\x7f\\x1d\\xb4\\x67\\x81\\xd5\\x11\\xa4\\x63\\x1e\\x4a\\x56\\xcc\\xce\\xc8\\x11\\xc8\\x83\\x6c\\x3d\\xf2\\x5d\\xa4\\xc4\\x73\\xf4\\x3a\\x6a\\xdb\\x2e\\x20\\x50\\x13\\x47\\xe9\\x51\\xd4\\x3a\\x44\\xaf\\xab\\x21\\x3e\\x31\\xe8\\x91\\x15\\x2b\\xfd\\x3c\\x81\\x2d\\x92\\x16\\xce\\xf2\\x12\\x8a\\xf2\\x0c\\xae\\xf3\\xb2\\x28\\x17\\xe2\\x43\\xb1\\xff\\xf1\\xee\\x7e\\x0f\\x1f\\xf2\\xdd\\x2e\\xdf\\xee\\x8b\\x9b\\x12\\xee\\x76\\xb0\\xb9\\xdb\\xbe\\x2f\\xf6\\xc5\\xdd\\x96\\xa3\\x1f\\x20\\xdf\\x7e\\x84\\x9f\\x8a\\xed\\xfb\\x05\\x20\\xdb\\xc3\\x20\\x78\\x70\\x3e\\x71\\x27\\x2f\\x74\\xb2\\x0e\\xeb\\x15\\x94\\x88\\x4f\\xc0\\x1b\\x9a\\xc9\\x04\\x87\\x4a\\x37\\x5a\\xb1\\x22\\xdb\\x0e\\xb2\\x45\\x68\\xe9\\x01\\xbd\\x65\\x21\\xc2\\xa1\\xef\\x75\\x48\\xc3\\x0b\\x4c\\xad\\x06\\xa3\\x7b\\x1d\\x65\\x9c\\xe2\\x17\\x72\\xfe\\x82\\xc8\\xef\\x99\\xf3\\xae\\x9c\\xc6\\x28\\x12\\x8e\\x95\\x3d\\x86\\x34\\x13\\x45\\x76\\x96\\x3b\\x2f\\xcf\\xbc\\x46\\x19\\xe4\\xb6\\xf6\\x38\\xc2\\x35\\xd9\\x07\\xe4\\x04\\x84\\x57\\x8c\\x76\\xac\\x18\\xe6\\xfb\\xb6\\x97\\xda\\xac\\x78\\x03\\x5e\\x8b\\x8b\\xb5\\x58\\xb1\\xac\\x78\\x73\\x70\\x86\\x3c\\xfa\\xc5\\xd3\\x70\\x93\\x7a\\x93\\x09\\xcf\\x8e\\x6f\\xa9\\x85\\xdf\\x78\\xf8\\x1d\\xa6\\x65\\xce\\xe0\\xcd\\xe5\\xe5\\xd7\\x57\\xe2\\xf7\\x2f\\xaa\\x6d\\x0c\\x49\\x2e\\x35\\xd8\\xc4\\x2b\\x0e\\x9d\\xac\\x6b\\xb6\\x27\\xf5\\x72\\x07\\x7e\\x1e\\xee\\x90\\x4e\\x47\\x5d\\xc7\\x2e\\x83\\x6f\\xff\\xa5\\xfd\\xd4\\xac\\x92\\xea\\x53\\xeb\\x89\\xfd\\x5b\\x2a\\x32\\x49\\xfe\\x57\\x4d\\xd3\\xfc\\x63\\xcd\\x52\\xcd\\x7f\\xa6\\xda\\x5e\\xfa\\x56\\xdb\\x65\\x45\\x31\\x52\\x9f\\x9d\\xa0\\xff\\xab\\xf0\\x3b\\xe8\\xde\\xcd\\x32\\xf8\\x60\\x39\\x9e\\x7c\\xb0\\xe4\\x7b\\x69\\x12\\xf1\\x88\\x87\\xb8\\x8c\\x5e\\xda\\xc0\\xb3\\xe2\\xae\\x83\\xe3\\xb9\\x2b\\x19\\xf0\\xea\\x25\\xe2\\xbb\\xff\\x03\\xa8\\xad\\x1b\\xe2\\x9f\\x88\\x19\\xc7\\xbc\\x94\\x3a\\xbe\\x28\\x7c\\xb4\\xd7\\x51\\xd0\\x69\\xa9\\x32\\x7e\\x6c\\x86\\xd7\\xeb\\x61\\x42\\x9e\\xd8\\x36\\xb2\\xd7\\xe6\\x98\\xc1\\x79\\x49\\x83\\x57\\xe9\\x13\\x54\\x23\\xfc\\xec\\xe9\\x7c\\x01\\xe7\\x1b\\x3e\\xd2\\xbc\\x83\\x5b\\x1c\\x39\\x3c\\x45\\x0b\\xe8\\xc9\\x52\\xe0\\xc7\\x8d\\x7f\\x87\\xb7\\x54\\x06\\xa5\\xbf\\x1e\\x58\\x8d\\x7d\\x86\\x2d\\xab\\x40\\x86\\x1f\\x62\\xc2\\xf6\\xb3\\x47\\x8f\\xa3\\x8d\\xe4\\xe6\\x61\\xa7\\x96\\x7f\\x04\\x00\\x00\\xff\\xff\\x29\\xec\\xd5\\x5f\\x1d\\x05\\x00\\x00\")\n\nfunc uiCssRest_explorerCssBytes() ([]byte, error) {\n  return bindataRead(\n    _uiCssRest_explorerCss,\n    \"ui/css/rest_explorer.css\",\n  )\n}\n\nfunc uiCssRest_explorerCss() (*asset, error) {\n  bytes, err := uiCssRest_explorerCssBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/css/rest_explorer.css\", size: 1309, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiIndexHtml = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x94\\x55\\x51\\x93\\x9b\\x36\\x10\\x7e\\xe7\\x57\\x6c\\xe8\\x83\\x93\\x89\\x0d\\xbe\\x5c\\x3a\\x6d\\xaf\\xf6\\xb5\\xc4\\x71\\x1b\\x4f\\x53\\xae\\x63\\x7c\\xcd\\xe4\\xa9\\x23\\xc3\\x02\\x4a\\x84\\x44\\x25\\x61\\x1f\\x33\\xfd\\xf1\\x5d\\x01\\xbe\\xf8\\x5a\\x2e\\x93\\xf8\\xc5\\x48\\xfb\\xed\\xee\\xb7\\xbb\\xdf\\xc2\\xe2\\xc9\\x6c\\xe6\\xad\\x54\\xdd\\x6a\\x5e\\x94\\x16\\x5e\\xcc\\x2f\\x5e\\xc2\\xae\\x44\\x58\\xa9\\xf4\\xa3\\x56\\x2c\\x2d\\x21\\x6a\\x6c\\xa9\\xb4\\x09\\x3c\\xef\\x2d\\x4f\\x51\\x1a\\xcc\\xa0\\x91\\x19\\x6a\\xb0\\x04\\x8b\\x6a\\x82\\x20\\x0c\\x96\\x29\\xfc\\x89\\xda\\x70\\x25\\xe1\\x45\\x30\\x87\\xa7\\x0e\\xe0\\x0f\\x26\\xff\\xd9\\x8f\\x5e\\xab\\x1a\\xa8\\x58\\x0b\\x52\\x59\\x68\\x0c\\x52\\x00\\x6e\\x20\\xe7\\x02\\x01\\xef\\x52\\xac\\x2d\\x70\\x09\\xa9\\xaa\\x6a\\xc1\\x99\\x4c\\x11\\x8e\\xdc\\x96\\x5d\\x92\\x21\\x44\\xe0\\xbd\\x1f\\x02\\xa8\\xbd\\x65\\x84\\x65\\x84\\xae\\xe9\\x94\\x9f\\xa3\\x80\\x59\\xcf\\x03\\xfa\\x95\\xd6\\xd6\\x57\\x61\\x78\\x3c\\x1e\\x03\\xd6\\xb1\\x0c\\x94\\x2e\\x42\\xd1\\xa3\\x4c\\xf8\\x76\\xb3\\x5a\\xc7\\xc9\\x7a\\x46\\x4c\\x3d\\xef\\x56\\x0a\\x34\\x06\\x34\\xfe\\xdd\\x70\\x4d\\x05\\xee\\x5b\\x60\\x35\\xf1\\x48\\xd9\\x9e\\xd8\\x09\\x76\\x04\\xa5\\x81\\x15\\x1a\\xc9\\x66\\x95\\xe3\\x79\\xd4\\xdc\\x72\\x59\\x4c\\xc1\\xa8\\xdc\\x1e\\x99\\x46\\x2f\\xe3\\xc6\\x6a\\xbe\\x6f\\xec\\x83\\x06\\x9d\\x58\\x51\\xa5\\xe7\\x00\\x6a\\x11\\x93\\xe0\\x47\\x09\\x6c\\x12\\x1f\\x5e\\x45\\xc9\\x26\\x99\\x7a\\xef\\x36\\xbb\\x37\\x37\\xb7\\x3b\\x78\\x17\\x6d\\xb7\\x51\\xbc\\xdb\\xac\\x13\\xb8\\xd9\\xc2\\xea\\x26\\x7e\\xbd\\xd9\\x6d\\x6e\\x62\\x3a\\xfd\\x02\\x51\\xfc\\x1e\\x7e\\xdb\\xc4\\xaf\\xa7\\x80\\xd4\\x1e\\x4a\\x82\\x77\\xb5\\x76\\xdc\\x95\\xf6\\xb8\\x6b\\x1d\\x66\\x01\\x24\\x88\\x0f\\x92\\xe7\\xaa\\x27\\x63\\x6a\\x4c\\x79\\xce\\x53\\xaa\\x48\\x16\\x0d\\x2b\\x10\\x0a\\x75\\x40\\x2d\\xa9\\x10\\xaf\\x46\\x5d\\x71\\xe3\\x86\\x67\\x88\\x5a\\x06\\x82\\x57\\xdc\\x32\\xdb\\x9d\\xff\\x57\\xce\\xa7\\x14\\xd1\\x2d\\x71\\xde\\x26\\xdd\\x18\\x3d\\x97\\x47\\xb2\\x0a\\x8d\\x9b\\x49\\xaa\\x64\\x5f\\x6e\\x2f\\x9e\\x5e\\x46\\x57\\x10\\xc9\\x4c\\xe3\\x11\\x5e\\x29\\x79\\x40\\x02\\x20\\x3c\\xa5\\x6c\\xed\\x9e\\xd2\\xfc\\x5c\\x54\\x8c\\x8b\\x80\\x14\\xf0\\xcc\\x9b\\xcd\\xae\\xbd\\xc5\\x93\\x4c\\xa5\\xb6\\xad\\x91\\x46\\x59\\x09\\x3a\\xf7\\x7f\\x00\\x8b\\x12\\x59\\x76\\xdd\\x0d\\x79\\x51\\xa1\\x25\\x19\\x94\\x4c\\x1b\\xb4\\x4b\\xbf\\xb1\\xf9\\xec\\x7b\\x7f\\x30\\x09\\x2e\\x3f\\x42\\xa9\\x31\\x5f\\x4e\\x9c\\x16\\x0c\\x89\\x21\\x27\\x4e\\x26\\x28\\x94\\x2a\\x04\\xb2\\x9a\\x1b\\x97\\x2c\\x4c\\x8d\\xf9\\x29\\x67\\x15\\x17\\xed\\x32\\x51\\x8d\\x4e\\xf1\\x79\\xc2\\xa4\\x79\\xfe\\x87\\x56\\x57\\x2f\\xe7\\xf3\\xe9\\x0f\\xf3\\xf9\\x3f\\xc3\\xfd\\x4a\\x65\\xe8\\xee\\x27\\xa4\\x14\\xb1\\x9c\\x18\\xdb\\x92\\x6c\\x4a\\x44\\x3b\\x01\\xc7\\x73\\x39\\xb1\\x78\\x67\\x5d\\xbc\\xc9\\x39\\x05\\x87\\xf5\\x3f\\x61\\xfd\\x9e\\x93\\xef\\x70\\x24\\xc7\\xbd\\x09\\xe5\\x21\\xbb\\x0c\\x2f\\x82\\xef\\x82\\x0b\\x7a\\x0c\\xb2\\xcb\\xa0\\xe2\\x32\\x20\\xab\\xff\\xa5\\x51\\x48\\xab\\x5f\\x85\\x27\\xc1\\xd8\\xbf\\x48\\x38\\x42\\x69\\xd4\\x5f\\xe5\\x59\\x68\\x56\\x97\\xe7\\x1e\\x26\\xd5\\x9c\\x36\\xd7\\xe8\\x94\\x10\\x1f\\x86\\x82\\xa8\\x9c\\xcb\\xe0\\x32\\xf8\\x36\\x1c\\x6a\\xf9\\x40\\xf0\\x45\\xd8\\x43\\x3f\\xe7\\x37\\xda\\x88\\x2f\\x75\\x26\\xb9\\x96\\x9a\\x0b\\x3a\\xce\\x03\\x5a\\xea\\xd3\\xf9\\xb1\\x18\\x96\\x5b\\x81\\xd7\\xf7\\xaf\\xb9\\x45\\xd8\\x5f\\x38\\x79\\x85\\x27\\x7d\\x2d\\xf6\\x2a\\x6b\\x07\\xbc\\xbb\\xa3\\x25\\x48\\x05\\x33\\x66\\xe9\\x53\\xc7\\x63\\x76\\x18\\x9a\\x40\\x56\\x36\\x34\\xe9\\x9b\\xd0\\x7f\\x08\\x99\\x75\\x2d\\x1d\\x9e\\x4b\\x55\\x61\\x4c\\xfb\\xe1\\x9f\\xe7\\x65\\x23\\x41\\x2a\\x25\\x39\\xed\\xcd\\x58\\x2c\\xff\\xfa\\xf7\\xde\\x38\\xee\\xe9\\x46\\x3b\\x3b\\x8d\\x76\\xdc\\x7f\\xbb\\x4e\\x76\\xb0\\x1e\\x20\\xe3\\x51\\x24\\x09\\xdd\\x8c\\x7b\\xc7\\xce\\x34\\xee\\x65\\x88\\xd5\\x63\\x6e\\x49\\x67\\x1b\\xf7\\xeb\\x44\\x35\\xee\\xf6\\xab\\x33\\xdd\\x7b\\xf5\\x93\\x41\\x3d\\x9c\\x32\\x7e\\x00\\x9e\\x2d\\x7d\\xad\\x94\\xbd\\x77\\xcf\\x1b\\x21\\xde\\xa0\\xfb\\x98\\xad\\x68\\xd9\\xe9\\x33\\x41\\x6d\\xa0\\xd9\\x13\\xf6\\x11\\xf1\\xb8\\xe5\\xf9\\xaf\\x3e\\x16\\x61\\x3f\\x79\\x4a\\xd8\\xbd\\x73\\xfe\\x0d\\x00\\x00\\xff\\xff\\xee\\xd4\\x3d\\x5f\\x26\\x07\\x00\\x00\")\n\nfunc uiIndexHtmlBytes() ([]byte, error) {\n  return bindataRead(\n    _uiIndexHtml,\n    \"ui/index.html\",\n  )\n}\n\nfunc uiIndexHtml() (*asset, error) {\n  bytes, err := uiIndexHtmlBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/index.html\", size: 1830, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiJsAppJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xec\\x3d\\x7f\\x73\\xdb\\x36\\xb2\\x7f\\x5f\\x3f\\x05\\xaa\\x99\\x9c\\xa9\\x8b\\x4c\\xd9\\xed\\xdc\\xcd\\x7b\\xf2\\xb9\\x77\\x6e\\xec\\xa6\\xbe\\x4b\\xec\\x3c\\xdb\\xc9\\xbd\\x8e\\xc7\\xe3\\xa1\\x45\\x58\\x62\\x4b\\x91\\x2a\\x49\\xf9\\xc7\\xf5\\xfc\\xdd\\xdf\\x2e\\x7e\\x90\\x00\\x08\\x90\\x94\\x6c\\x39\\x69\\x5e\\x38\\x99\\x48\\x02\\x17\\x8b\\xc5\\x62\\xb1\\xd8\\x5d\\x00\\xeb\\xe1\\x90\\xbc\\xa6\\x09\\xcd\\x82\\x82\\x86\\xe4\\xea\\x9e\\x14\\xf9\\xd8\\xff\\x0a\\x0a\\xf3\\x74\\x91\\x8d\\xe9\\x88\\x8c\\xd3\\xf1\\x2f\\x59\\x1a\\x8c\\xa7\\xc3\\x8c\\xf2\\xb2\\xe1\\x22\\x1f\\x16\\xf9\\xd0\\xf7\\x19\\xdc\\xfe\\x31\\x39\\x3a\\x3e\\x23\\x07\\xfb\\x87\\x67\\x5f\\xc3\\x6f\\x2c\\x7a\\x95\\xce\\xef\\xb3\\x68\\x32\\x2d\\xc8\\x37\\x5b\\xdb\\x7f\\x26\\x67\\x53\\x0a\\x45\\x02\\x0b\\xd9\\x5b\\x14\\xd3\\x34\\xcb\\x7d\\x01\\xfb\\x26\\x1a\\xd3\\x24\\x87\\xa6\\x17\\x49\\x48\\x33\\x52\\x00\\xec\\xde\\x1c\\xe0\\xa8\\x7c\\x33\\x20\\x1f\\x68\\x96\\x47\\x69\\x42\\xbe\\xf1\\xb7\\x88\\x87\\x00\\x3d\\xf1\\xaa\\xd7\\xdf\\x41\\x14\\xf7\\xe9\\x82\\xcc\\x82\\x7b\\x92\\xa4\\x05\\x59\\xe4\\x14\\x70\\x44\\x39\\xb9\\x8e\\x62\\x4a\\xe8\\xdd\\x98\\xce\\x0b\\x12\\x25\\xd0\\x8b\\xd9\\x3c\\x8e\\x82\\x64\\x4c\\xc9\\x6d\\x54\\x4c\\x59\\x3b\\x02\\x0b\\xeb\\xc5\\x4f\\x02\\x47\\x7a\\x55\\x04\\x00\\x1e\\x40\\x85\\x39\\xfc\\xba\\x56\\x01\\x49\\x50\\x08\\xa2\\xf1\\x99\\x16\\xc5\\x7c\\x34\\x1c\\xde\\xde\\xde\\xfa\\x01\\x23\\xd8\\x4f\\xb3\\xc9\\x30\\xe6\\xa0\\xf9\\xf0\\xcd\\xe1\\xab\\x83\\xa3\\xd3\\x83\\x4d\\x20\\x5a\\x54\\x7a\\x9f\\xc4\\x34\\xcf\\x49\\x46\\x7f\\x5d\\x44\\x19\\xe7\\x75\\x30\\x07\\xa2\\xc6\\xc1\\x15\\x90\\x1a\\x07\\xb7\\x24\\xcd\\x48\\x30\\xc9\\x28\\xbc\\x2b\\x52\\x24\\xfa\\x36\\x8b\\x8a\\x28\\x99\\x0c\\x60\\x2c\\xae\\x8b\\xdb\\x20\\xa3\\x88\\x26\\x8c\\xf2\\x22\\x8b\\xae\\x16\\x85\\xc6\\x33\\x49\\x22\\xf4\\x5c\\x05\\x00\\xae\\x05\\x09\\xe9\\xed\\x9d\\x92\\xc3\\xd3\\x1e\\xf9\\x7e\\xef\\xf4\\xf0\\x74\\x80\\x48\\xfe\\x75\\x78\\xf6\\xe3\\xf1\\xfb\\x33\\xf2\\xaf\\xbd\\x93\\x93\\xbd\\xa3\\xb3\\xc3\\x83\\x53\\x72\\x7c\\x42\\x5e\\x1d\\x1f\\xc1\\x28\\x1e\\x1e\\x1f\\xc1\\xaf\\x1f\\xc8\\xde\\xd1\\x4f\\xe4\\x9f\\x87\\x47\\xfb\\x03\\x42\\x81\\x63\\xd0\\x0e\\xbd\\x9b\\x67\\xd8\\x83\\x34\\x43\\x14\\x11\\x32\\x94\\x86\\x3e\\x39\\xa5\\x54\\x23\\xe1\\x3a\\xe5\\x24\\xe5\\x73\\x3a\\x8e\\xae\\xa3\\x31\\x74\\x2d\\x99\\x2c\\x82\\x09\\x25\\x93\\xf4\\x86\\x66\\x09\\xf4\\x08\\xeb\\xcf\\x69\\x36\\x8b\\x72\\x1c\\xd8\\x1c\\x68\\x0c\\x49\\x1c\\xcd\\xa2\\x22\\x28\\xd8\\xef\\x5a\\xbf\\xaa\\x56\\xf6\\xde\\x03\\xe5\\x27\\xa7\\x6c\\x7c\\x11\\x0d\\xb6\\x96\\x04\\x33\\x9a\\xe3\\x60\\x8d\\xd3\\x84\\x77\\x5d\\x11\\x30\\x21\\x6f\\x23\\xf2\\x7d\\x16\\xcc\\xc8\\xeb\\x6c\\x91\\xd0\\x28\\x23\\xde\\x15\\xfc\\xf2\\x27\\xfc\\xd7\\xdf\\x27\\xb3\\x20\\x8a\\x7d\\x90\\x91\\x3e\\xd4\\xf8\\xc3\\x1f\\x70\\x78\\xf7\\x92\\x30\\xa3\\xb7\\xe4\\xfb\\x34\\xb9\\xa1\\x80\\x94\\x12\\x0f\\x88\\xbc\\xbf\\x02\\xea\\x6c\\xd0\\x6f\\x83\\xa2\\x20\\x67\\x59\\x30\\xbe\\x27\\xde\\x0c\\xbe\\xff\\xbd\\x9c\\x35\\x71\\x70\\x95\\x4b\\xd8\\xaf\\x6e\\x82\\x8c\\x4c\\x69\\x00\\x9d\\xdb\\xa7\\xf9\\x38\\x8b\\xe6\\xd8\\x5d\\xb2\\x4b\\x36\\xce\\x4a\\x91\\xc5\\x01\\xa4\\x79\\x34\\x49\\xb8\\x14\\x04\\x61\\xc8\\xba\\xcd\\x6b\\x61\\x09\\xfe\\x2a\\xd2\\xb9\\x94\\x4d\\x40\\x7d\\x15\\x21\\xf0\\xcf\\x1c\\x81\\xbf\\xb1\\xa3\\xce\\xde\\x59\\x1a\\xd2\\x18\\xa6\\x6b\\x04\\x1c\\xa2\\x59\\x44\\x73\\xbf\\xc8\\xe1\\xfd\\x90\\xfc\\x35\\xa3\\xd7\\x34\\xa3\\x38\\x21\\xe6\\x41\\x31\\xdd\\xed\\xf9\\xfe\\xb0\\xb8\\x9f\\xc3\\xe0\\xe4\\x43\\x18\\x88\\x69\\x16\\xc5\\x3f\\x97\\xdf\\xfc\\x10\\xaa\\xf5\\xc8\\xf0\\xbb\\x8a\\xa1\\xa3\\x4e\\x7d\\xc6\\x0e\\xbf\\x65\\x24\\xec\\x7c\\xe5\\x5d\\x2f\\x92\\x31\\xeb\\xb0\\xc7\\x8b\\xfa\\xe4\\xb7\\xaf\\x90\\x79\\x0c\\x88\\xc2\\xc0\\x8d\\x01\\x0a\\x0b\\x54\\x48\\x5e\\x2e\\x41\\x8d\\xb7\\xff\\xb3\\xa0\\xd9\\xfd\\xde\\x04\\xe6\\xcc\\x24\\x80\\x31\\x57\\xa1\\xf0\\x31\\x5e\\x9f\\x9b\\xbf\\x7b\\x7b\\x1f\\x5e\\xf7\\x2e\\x80\\xff\\xdb\\xf8\\x1f\\xfb\\xb5\\xb3\\x34\\x82\\xcb\\x93\\xbd\\xb3\\x03\\x86\\xe5\\x1b\\x89\\x85\\x17\\x55\\xa8\\x1e\\xfa\\xb2\\x1f\\xbe\\x81\\x81\\xfc\\xe7\\x3f\\xc4\\xf9\\x6e\\x97\\xfc\\xf6\\xd0\\xef\\x57\\x68\\x90\\x4f\\x75\\x18\\x47\\xed\\xaa\\x5a\\xc9\\xae\\x5f\\x11\\xc2\\xcb\\x8b\\x20\\x2b\\x60\\x4e\\x27\\xe1\\x00\\xb4\\x0d\\x2a\\x17\\x26\\x17\\x26\\xef\\xb0\\xb1\\x45\\x16\\x63\\x8f\\x50\\xd9\\xb3\\xba\\x06\\x77\\x10\\x24\\x0c\\x8a\\x00\\x09\\xd5\\x5e\\xe0\\xc3\\x9a\\xb9\\x4c\\x82\\x24\\x85\\xa9\\xc7\\x7e\\xf8\\x13\\x5a\\x9c\\x81\\x1c\\x7a\\x7d\\xf2\\x27\\xb2\\xed\\x6f\\xd1\\xbf\\x0c\\x6a\\xb5\\x80\\x2a\\x59\\x07\\xbe\\x76\\xa9\\x81\\x84\\x01\\xf9\\x23\\xd1\\x0d\\x7f\\x16\\xcc\\x15\\x01\\xa9\\x89\\x84\\x7c\\x32\\x5a\\x2c\\xb2\\xc4\\xf1\\x12\\x1f\\xd4\\x29\\x23\\x92\\xd5\\x1b\\x94\\x4f\\x50\\xb2\\x7a\\xc4\\xf8\\x68\\x05\\x7c\\xd8\\xa9\\x15\\x3f\\xf4\\x75\\x50\\x03\\x44\\x10\\x36\\xf3\\x71\\x9d\\xa0\\x79\\xe1\\xfd\\x86\\xc3\\x30\\xc2\\xff\\x06\\x64\\x46\\x61\\xea\\x85\\x23\\xd2\\x7b\\x77\\x7c\\x7a\\xd6\\x83\\x41\\xbc\\x2b\\x60\\xfe\\x15\\x23\\x58\\xfa\\x92\\x7f\\xe4\\x69\\x72\\x90\\x65\\xa0\\xea\\x06\\x6c\\x54\\x46\\x7c\\x6c\\x1e\\xfa\\x35\\x0a\\x7c\\xd0\\x1b\\x89\\xc2\\xa4\\xd0\\xc6\\xa4\\xe8\\x9a\\x78\\x5f\\x87\\x40\\x45\\xbe\\x88\\x8b\\x9a\\x74\\xc8\\xa7\\x04\\x00\\x19\\x38\\xbf\\xb0\\x74\\xb6\\x56\\x52\\xd6\\xf0\\x41\\x73\\x1f\\x80\\xb2\\xe8\\x32\\x5a\\x8c\\x98\\xcc\\xc7\\x0e\\xcd\\xd3\\x28\\x71\\xd3\\xc3\\x38\\xa8\\xc0\\x39\\xc8\\xb2\\x93\\xf6\\xd0\\xaf\\x43\\x8a\\xe1\\x08\\xf5\\x37\\x2a\\xe4\\x83\\x36\\x3f\\x4f\\x28\\xac\\x57\\x05\\x9b\\x8b\\xd0\\xb6\\xd2\\x37\\x93\\xe2\\xf2\\x8d\\x52\\xc3\\xbb\\x8d\\x92\\x30\\xbd\\xdd\\x5f\\x64\\x6c\\x1d\\x1c\\x90\\x4b\\x10\\x2c\\x5b\\x57\\xb1\\x25\\x2e\\xef\\x8e\\x0e\\xe2\\xaa\\xe8\\x21\\xd4\\x65\\x84\\x8a\\x69\\x07\\x3f\\xff\\x4a\\x82\\x6c\\xb2\\x98\\x41\\x63\\xb9\\x1f\\xd3\\x64\\x52\\x4c\\xb1\\xf8\\xe5\\x4b\\x17\\x2f\\x79\\x03\\xe7\\x50\\x73\\x93\\xab\\xb6\\xb2\\x3a\\x94\\x75\\x1a\\x6b\\x34\\xc4\\x7c\\xbd\\x4f\\x80\\x46\\x2f\\xa8\\xe3\\x61\\xb5\\xb0\\xe7\\x00\\x8b\\x1f\\x2e\\x88\\x92\\x01\\xfc\\x8b\\x31\\x42\\xda\\x2f\\x85\\xc7\\xfe\\x3c\\x4b\\x8b\\x14\\x56\\x3a\\xea\\xff\\x2a\\x46\\xc9\\x3d\\x48\\x92\\xd7\\xa0\\x8b\\x50\\x0f\\x01\\x6c\\x02\\x36\\xc1\\x3e\\x98\\xca\\x9e\\x45\\x56\\xd8\\xa8\\xa0\\xa6\\x33\\x61\\x45\\x75\\x45\\x9d\\x6d\\xda\\x78\\xe3\\x16\\x3f\\x45\\x73\\x23\\x82\\x81\\x24\\x68\\x50\\x31\\x6b\\xa0\\x71\\xc5\\x40\\x65\\xd7\\x31\\x0a\\x57\\xb4\\xb5\\x4a\\xa9\\x2c\\x17\\x17\\x5d\\xac\\xad\\x15\\xcb\\xd5\\xe9\\x6d\\x90\\x80\\xb1\\x97\\x75\\x14\\x7f\\xb5\\x8a\\x77\\xc9\\x3a\\x6a\\x1b\\x05\\xde\\x39\\x39\\x62\\xfc\\x8b\\x4b\\x30\\xb8\\x82\\xc1\\x01\\x58\\xc4\\xb1\\x0b\\x88\\xa2\\xaa\\x6c\\x81\\xe1\\x88\\x0e\\xe6\\x29\\xb8\\x2d\\xbb\\x64\\xcb\\x05\\x96\\x2e\\x0a\\x18\\x9a\\x24\\x04\\xdb\\xc9\\x8a\\xf0\\xa1\\x6e\\x53\\x88\\x0e\\x2b\\xc2\\x08\\xdf\\xc6\\x60\\x5c\\x1f\\x6b\\xb8\\x9a\\x25\\x13\\xb5\\x62\\x8d\\x02\\xd7\\x6c\\xc6\\xe1\\x61\\x4e\\x10\\x45\\xbf\\x60\\xd7\\x52\\xd3\\x67\\x2c\\x81\\x96\\xbe\\xe6\\x9d\\x40\\xdb\\xa4\\x0e\\xc4\\x79\\x52\\x41\\x59\\x84\\x56\\xd2\\x56\\x36\\xd7\\xa4\\xad\\x8d\\x21\\x73\\x37\\x68\\x6f\\xa7\\x42\\x21\\x07\\xd4\\xd9\\xaf\\x36\\x04\\x6d\\xc3\\xe8\\xa2\\x9a\\xc9\\xc7\\xcb\\x97\\x9d\\x57\\x99\\xa6\\x99\\xe9\\x10\\x8e\\x9c\\x96\\x73\\xaf\\x12\\x89\\x5f\\xdb\\xe7\\xc9\\xaf\\x8d\\x6a\\xc0\\xd1\\x58\\x39\\x16\\xcd\\xd2\\xc7\\x5a\\xaa\\x4b\\xad\\x8d\\xcf\\x42\\xdf\\xa8\\x4c\\x5b\\x85\\x30\\x2a\\x26\\xe2\\x3a\\xe9\\x62\\x83\\xb9\\x12\\x71\\x42\\xfc\\xd6\\x43\\x1c\\xc3\\xbe\\xda\\x60\\x5e\\x43\\xc7\\x3a\\x72\\xcd\\x3d\\xd5\\x98\\x01\\xd6\\x59\\xd7\\xd8\\xe6\\x53\\x83\\xbd\\xc6\\x5a\\x1d\\xa9\\xa2\\xcb\\x97\\x66\\xaf\\xef\\xb6\\xbe\\x19\\x43\\xc0\\xbd\\xc5\\xae\\xce\\x3d\\xa6\\x88\\x3a\\x5b\\xe0\\x56\\x12\\x45\\xe7\\xb9\\x6d\\x8c\\xf8\\x06\\x2e\\x4d\\x62\\x61\\x4f\\x7d\\x96\\x6b\\xa3\\x57\\x6f\\xa6\\xcb\\xf2\\xac\\x8e\\x68\\xdb\\xfa\\x6c\\x2c\\xbc\\xf6\\xaa\\xa5\\x04\\x68\\xde\\x82\\x77\\x37\\xcd\\x06\\x24\\x9d\\xd7\\x8d\\x6a\\x41\\x07\\xbc\\xf7\\x81\\xfc\\x62\\x91\\x93\\xef\\xc8\\x37\\x5b\\x5b\\xe4\\x6f\\xe4\\x1f\\xa7\\xc7\\x47\\x3e\\x46\\x99\\x92\\x49\\x74\\x7d\\x8f\\x18\\xb0\\x5f\\xf3\\x34\\xc9\\xe9\\x19\\xf8\\x24\\x7d\\x32\\x22\\x66\\x99\\x69\\x30\\x57\\x3e\\x31\\xfa\\xb0\\x2c\\x1e\\xe0\\xcb\\x02\\xe6\\x14\\xeb\\x45\\xd2\\x17\\xc6\\x6a\\xec\\x8d\\x02\\x54\\xbe\\xd4\\xa2\\x96\\x33\\x68\\x1a\\x8d\\xd5\\xe1\\x4c\\xf0\\xe8\\xb1\\x81\\x8f\\xe6\\xaa\\xe1\\xb7\\xf0\\xaf\\x1d\\xdc\\x16\\x8f\\x61\\x15\\x70\\x7d\\x7e\\x55\\x12\\xad\\x45\\x4b\\xaa\\xe2\\x15\\x23\\x26\\x08\\xfe\\x26\\x4a\\xe8\\xeb\\x2c\\x98\\x2b\\xca\\x4d\\xa9\\x54\\xbe\\xb5\\x85\\x01\\x5e\\x61\\x54\\x2d\\x8d\\xe3\\x36\\x9b\\x4e\\x93\\xb1\\xaa\\x92\\x77\\x33\\x6b\\x32\\x4a\\x2e\\x59\\xb8\\x96\\xaf\\xdb\\x0d\\x73\\xf5\\x66\\x06\\x30\\x37\\xb3\\x06\\x88\\xf1\\x14\\xcc\\x63\\x5c\\xb9\\x6f\\x7c\\xce\\x65\\x3f\\x86\\x5e\\xbd\\xc2\\x52\\xaf\\xee\\x04\\xcb\\xc7\\xbf\\x33\\x3c\\x61\\x29\\xf6\\xa5\\xf5\\x0e\\x63\\x8a\\xa3\\x55\\x04\\xb3\\x39\\x8f\\x4d\\x90\\x21\\x0f\\x46\\xf4\\x77\\x6c\\xde\\x75\\x89\\xf8\\xde\\x81\\x38\\xf4\\x6f\\x82\\x78\\x41\\x9b\\x2b\\x2f\\x72\\x7a\\x98\\x14\\x14\\xbd\\xfb\\xe8\\x86\\xbe\\x5e\\x44\\xd0\\x21\\xe8\\x8d\\x57\\x64\\x0b\\xda\\x50\\x2d\\x9f\\xa6\\xb7\\x6f\\xe8\\x04\\xdc\\x83\\x2e\\x90\\x3f\\xed\\xdd\\x45\\x79\\x17\\xc0\\xff\\xed\\x02\\x78\\x77\\x3a\\x0e\\x62\\x60\\xd7\\xb7\\x8c\\x5f\\x7e\\xce\\x7e\\xf5\\x1d\\x66\\x17\\x1b\\xb1\\x30\\x0b\\x6e\\x99\\xd4\\x69\\xcb\\x13\\x8d\\x29\\x7a\\x99\\x03\\x12\\xe5\\x87\\x49\\x54\\x44\\x41\\x1c\\xfd\\x9b\\x86\\x03\\x16\\xdc\\x65\\xca\\xc5\\xbd\\x94\\xb0\\x65\\x4a\\xab\\xd6\\x04\\x8d\\x0f\\x08\\x4b\\x10\\x86\\x8c\\x08\\xef\\xb2\\x12\\xa3\\x06\\x63\\xb1\\xae\\xeb\\xd5\\xd6\\x39\\x0e\\xe0\\xd9\\x22\\x0e\\x4f\\x28\\x86\\xb1\\x41\\x86\\x02\\x60\\x43\\x0b\\x1d\\x38\\x13\\xc0\\x69\\xc7\\x38\\x2a\\x0d\\xf7\\x79\\x50\\xcd\\x15\\xb9\\xa8\\xb7\\x77\\x33\\xe3\\x2b\\x66\\xb9\\x82\\xb7\\x35\\x87\\x8f\\xd9\\x9c\\x03\\x55\\x19\\xaf\\xd1\\x23\\x6b\\xad\\x9c\\x95\\x4f\\x6b\\xa4\\xad\\xce\\x0a\\x98\\x1d\\xf9\\x08\\xe6\\x49\\x15\\xc7\\x71\\x1b\\x02\\xe6\\xf3\\x0b\\xbd\\xc7\\xaa\\x18\\xbe\\xeb\\x5e\\x69\\x9c\\xc6\\x68\\x4d\\x54\\x3a\\xcb\\x67\\x25\\xb9\\xc7\\x11\\x35\\xd8\\x21\\xe6\\x13\\x64\\x34\\x00\\x53\\x06\\x66\\x4a\\xf7\\x3a\\xd7\\x51\\x1c\\x1f\\xcf\\x83\\x71\\x54\\x00\\xe9\\xfe\\x76\\xb7\\x8a\\x0e\\xbb\\x46\\x03\\x69\\x90\\x62\\xf6\\xbe\\xf1\\x2d\\xcc\\xe3\\x1c\\xa6\\xe2\\xb8\\x90\\x13\\xd2\\x3d\\xf5\\xe5\\x83\\x03\\xb6\\x98\\x79\\x9a\\x60\\x75\\xa8\\x55\\x64\\x41\\x92\\x47\\x28\\x56\\x20\\x6d\\xa1\\x08\\x86\\x78\\x7f\\xde\\xda\\xea\\x50\\x17\\x94\\x4c\\xfc\\xa8\\x89\\xdb\\x64\\x1f\\x32\\x8c\\xfe\\x1d\\x2a\\x3f\\xb7\\xda\\x2b\\xa2\\xf1\\x2f\\x3f\\xb0\\x1e\\x97\\xaa\\x8f\\x33\\xc0\\xdb\\x78\\x71\\x38\\x7a\\xf1\\x76\\xf4\\xe2\\x74\\xa3\\xdf\\xa2\\x5f\\xdf\\x06\\x77\\x6f\\xa3\\xc4\\xbb\\x0e\\xe2\\x9c\\x76\\x32\\x2f\\x15\\x49\\x55\\xbc\\x44\\x43\\xeb\\xb4\\x1a\\xfd\\xf8\\xb0\\xf0\\x96\\x70\\xac\\x74\\x05\\xc0\\x4a\\x5d\\x6e\\x33\\xea\\x1e\\x5e\\xed\\xbb\\xb2\\x5a\\x1c\\xe4\\xdc\\x7f\\x6a\\xf5\\xf7\\x55\\x60\\x68\\x97\\xd6\\x9d\\x2e\\xf5\\x91\\xb6\\x34\\x4c\\xaa\\xae\\x4e\\xb6\\x52\\x8d\\x31\\xd5\\xc2\\xd3\\x7a\\x91\\x95\\xa9\\xd3\\x20\\xef\\xcc\\x4b\\xd5\\xe8\\x37\\xd9\\x08\\x7c\\xb2\\x04\\x90\\x9a\\xa9\\xe0\\x4a\\x08\\x9a\\xc6\\xb9\\x88\\xcb\\x29\\x88\\x7b\\x41\\x27\\x69\\x76\\xbf\\xbd\\xd5\\xe0\\x32\\x56\\x18\\xcc\\xa8\\xb5\\x59\\xa9\\xec\\xd2\\xb8\\xb2\\xd6\\x98\\xed\\x64\\xeb\\xa1\\x62\\x17\\xbd\\x32\\xc1\\x9b\\x02\\x5e\\xa5\\x6d\\xe9\\x8f\\x55\\x43\\x72\\xec\\xa0\\xb2\\xa4\\xe9\\x26\\xa2\\xb7\\xde\\xb8\\xc8\\xac\\xc4\\xb0\\xf8\\x12\\xbc\\x93\\xe3\\xe3\\x5e\\xf2\\xe4\\x86\\x8a\\xd7\\x63\\xf6\\xe0\\x04\\x29\\xe9\\x0d\\xc0\\x1c\\xcb\\x8b\\xfb\\x18\\x3c\\x85\\xde\\x6d\\x14\\x16\\xd3\\x11\\xa8\\x9b\\xf9\\xdd\\xce\\x94\\xe2\\xb1\\x85\\xd1\\xb7\\xec\\x47\\x8f\\x3c\\x0c\\xb0\\x5e\\x7e\\x33\\xf1\\xab\\x6a\\x40\\xf7\\x75\\x34\\x01\\x0f\\x03\\x5b\\xaf\\x2c\\x98\\x07\\x9b\\xa5\\x53\\x17\\x4c\\x30\\x4b\\x69\\x2b\\xa1\\xd0\\x4e\\x2f\\x4e\\x03\\xe6\\x2f\\xfa\\x7e\\xaf\\x15\\xb1\\x8b\\xdf\\xc8\\x41\\xb4\\x9a\\xe1\\xc3\\x35\\xee\\xb0\\x5c\\x81\\x89\\xcb\\x24\\x75\\x80\\x6b\\xa7\\x2b\\x02\\xce\\xcc\\xef\\xdf\\x48\\x39\\x6b\\x47\\x64\\x6b\\xc0\\xc3\\xd2\\x23\\xfe\\x61\\x13\\x65\\x1c\\x24\\x07\\x4e\\x86\\x77\\xe6\\xc3\\x5b\\xc0\\x0b\\xff\\x2f\\xe1\\x53\\xcf\\xfc\\xd2\\xb9\\xab\\xfc\\x96\\x01\\x60\\xeb\\x2a\\x85\\xac\\xcf\\x28\\x81\\xec\\x8b\\xe6\\x5a\\x97\\x50\\xca\\xc6\\x6a\\x55\\xa6\\x6e\\xd6\\xaa\\x90\\xd5\\x36\\xad\\xe6\\xd5\\x56\\x7e\\x9b\\xe6\\xd9\\x5a\\x8a\\x15\\xef\\xb6\\x7a\\x6b\\x00\\xdb\\xbc\\xdc\\x39\\x38\\xf8\\xf9\\x90\\xc9\\xe6\\x27\\xee\\xde\\xba\\x2a\\x58\\xfd\\xf4\\xd2\\x21\\xde\\x0b\\x67\\x51\\xf2\\x01\\xc4\\x57\\x77\\x88\\xab\\x62\\xd5\\x21\\x56\\xbc\\x5b\\x05\\xb6\\xe6\\xd5\\x22\\xe8\\x3b\\xe0\\x9b\\xd5\\x0f\\xc6\\x17\\xeb\\x70\\x81\\x9f\\xc0\\x01\\xce\\x17\\x33\\x19\\xd6\\x45\\x15\\xac\\xc7\\x47\\xd4\\x0d\\x1a\\x6f\\x7b\\x8b\\xfc\\x89\\xfc\\x05\\xff\\xdb\\xde\\xda\\x82\\x69\\x6a\\x80\\x1a\\x07\\x05\\xfc\\xbd\\x0f\\xaf\\x41\\xdf\\x8c\\x33\\x3f\\x01\\x38\\x66\\x50\\x61\\x63\\x63\\x0c\\x51\\xfa\\xdb\\x36\\xe5\\x53\\x92\\x84\\x67\\xc6\\xd6\\x46\\x13\\x3b\\x44\\xb1\\x22\\x61\\x45\\x3a\\x99\\xc4\\xb4\\xee\\x5a\\x36\\x19\\x26\\xa5\\xe7\\x76\\x7b\\x02\\xdd\\xc2\\x01\\xf9\\xda\\x28\\x72\\x5b\\x28\\x9a\\xe7\\xc7\\x81\\xdb\\xdc\\x23\\x0e\\x3e\\x13\\x01\\x5b\\x19\\xe0\\x17\\x58\\x4a\\xc6\\xae\\xe4\\x87\\x36\\xac\\x31\\x9d\\x5a\\x97\\x92\\xb6\\x52\\xe3\\x3a\\x66\\x11\\x7e\\x76\\x59\\x91\\x4d\\xc6\\xf7\\xac\\x8c\\x66\\x5a\\x44\\x4b\\xdb\\x35\\xec\\x42\\xf4\\x32\\x54\\x31\\xd8\\x08\\xa3\\x2f\\xe0\\x8a\\xb2\\xfd\\xe5\\xe2\\x50\\xfc\\xd2\\xa7\\xbe\\x5c\\x91\\x5c\\x7d\\x46\\xfb\\x01\\xc5\\x7d\\x6b\\x75\\x9b\\x3e\\x4d\\x16\\x09\\x9a\\x02\\x9d\\xc4\\x78\\x1c\\xd3\\x20\\x2b\\x49\\xd5\\xba\\x61\\xa3\\x60\\x4d\\x06\\x64\\x77\\xdb\\xb1\\x71\\xc1\\x46\\x55\\xfc\\x94\\x16\\x23\\xaa\\xda\\xab\\x45\\x51\\xa4\\x89\\x1e\\x8e\\x96\\x4f\\x69\\x51\\xb6\\x4e\\xe1\\x0a\\x0b\\x9e\\x8e\\x3a\\x05\\x70\\x72\\x96\\x16\\xe0\\x66\\xf4\\x1e\\x69\\x01\\x5a\\x10\\x33\\x42\\x3a\\xe1\\x55\\xec\\x5c\\x66\\x10\\x20\\xff\\xc0\\x90\\x3c\\xb7\\xb6\\x04\\x50\\x3f\\x7e\\x8b\\x66\\x26\\xd7\\x91\\xfb\\x74\\x96\\xf6\\x1c\\x51\\x8e\\xba\\xb9\\xe2\\x9b\\xb6\\x14\\xe7\\x9b\\x90\\xff\\xf5\\xa2\\xe1\\xd6\\x31\\xfc\\x1f\\x25\\xf3\\x45\\x71\\x8e\\x73\\x64\\x97\\xb3\\xed\\x02\\xad\\x73\\xa7\\x5a\\x62\\x41\\xa5\\x91\\xc2\\x61\\x77\\x94\\x25\\x4d\\xc6\\x31\\xf8\\xf4\\xc2\\xc2\\x57\\x96\\x12\\xc7\\x06\\x53\\xdf\\x42\\xea\\x45\\xbb\\x68\\x5b\\x8d\\x73\\x98\\x61\\xf8\\x12\\xca\\x39\\x63\\xd8\\x0f\\xb4\\x03\\x95\\x9f\\x86\\xbd\\x29\\x57\\xb9\\xca\\x28\\xf2\\x2b\\x6b\\xb5\\x56\\xa8\\x58\\x9a\\xd5\\x3b\\x03\\xd4\\x6d\\x69\\xce\\xd2\\x24\\xc2\\xe5\\xf9\\x71\\xb6\\xe6\\xd2\\x96\\xdd\\x5b\\xde\\x6c\\x7d\\xab\\x83\\x97\\x3f\\xca\\xba\\x73\\x68\\xb0\\x27\\x52\\x46\\x0d\\xba\\x10\\x64\\x78\\xca\\xa6\\xa0\\xe8\\x05\\x79\\x17\\x07\\x63\\x3a\\x4d\\xe3\\x90\\x66\\xa6\\x71\\xb3\\xbc\\xf8\\x08\\xa4\\x95\\x00\\x69\\x05\\xa6\\xcb\\x22\\x28\\xd0\\x84\\x48\\x16\\x1a\\x62\\x54\\xc1\\xae\\x26\\x48\\xc2\\x43\\xc0\\x0d\\xc5\\x27\\x3c\\x8b\\xdc\\xf5\\x6c\\xb7\\x49\\x06\\x5a\\x96\\x97\\x7c\\x73\\x73\\x1d\\x0e\\x94\\xec\\xe5\\x6a\\xe4\\x76\\x3e\\x3c\\x7d\\x04\\x25\\xa7\\xac\\x13\\xb5\\x29\\x52\\xbd\\x32\\x67\\x09\\xbe\\xc9\\x3b\\x1e\\xd2\\x62\\xb0\\xee\\x73\\x03\\x97\\xe2\\x14\\xb0\\xd8\\x8d\\xff\\xcd\\x16\\x78\\xe6\\x1b\\x3e\\x34\\x1f\\x77\\x81\\xe3\\x23\\xc2\\xc8\\x73\\xc1\\xea\\x53\\x82\\x11\\xa8\\x98\\x4d\\xf5\\xd3\\x32\\x2e\\x93\\xa0\\xd9\\xfb\\x52\\x4f\\x41\\x0b\\x39\\x61\\x32\\x93\\x0f\\x2d\\x6b\\x72\\xb7\\xa3\\xbb\\xaf\\x0f\\xdc\\x27\\x77\\x5d\\x5b\\x82\\xe6\\x89\\xdd\\x96\\x53\\xb9\\x72\\xc7\\x26\\xb4\\x9c\\xb1\\xcd\\x6b\\xc2\\x60\\xeb\\x33\\xf6\\xf1\\x10\\x8d\\x4e\\x31\\x37\\x70\\xe0\\x98\\x1b\\x76\\x19\\x85\\x5d\\xdc\\x20\\x26\\x11\\x5e\\xff\\x9c\\xe3\\xb9\\x20\\xbb\\xe2\\xb0\\x58\\x27\\xb7\\xa4\\x56\\xb9\\x71\\x27\\xcc\\xed\\x8a\\x88\\xf3\\x98\\x40\\xff\\x9b\\x28\\x2f\\xca\\x1d\\x2e\\x03\\x7d\\x73\\x77\\xbc\\x0a\\x81\\x38\\x34\\x8b\\x7d\\xd9\\xea\\x83\\xa6\\x6b\\xec\\x89\\x52\\xef\\xbc\\x8e\\x62\\x93\\x6c\\x5f\\xf8\\x8b\\x79\\x88\\x77\\xae\\x2e\\x83\\x82\\xfc\\x55\\xf2\\xb9\\x2a\\x6b\\xdd\\xc2\\xb3\\x76\\xc6\\x9f\\x2f\\xc0\\xf3\\x10\\x63\\xdc\\xbc\\xfb\\x73\\xa9\\xcd\\x34\\x8d\\xdd\\xb9\\xa2\\x4b\\x6c\\x8f\\x63\\x27\\xc5\\xd1\\xa0\\x20\\x74\\x8e\\x0a\\xee\\x38\\x0e\\x0f\\xf0\\x8a\\x0e\\x36\\xd8\\x08\\xcd\\x19\\xa1\\xdc\\x92\\x71\\x56\\x10\\xb3\\x4e\\xc8\\xbc\\xc5\\x52\\x6e\\x3e\\x0b\\x6b\\x6a\\x0e\\x4b\\xcb\\xdd\\x0e\\x4f\\xe1\\x14\\xb1\\xab\\xb4\\x6a\\x42\\xd5\\xdf\\xb1\\x83\\xda\\x62\\xb6\\x45\\x09\\x51\\xc7\\xb4\\xf1\\x74\\x15\\x6b\\x4d\\x1d\\x33\\x9b\\x34\\x9c\\x5b\\x45\\x44\\x95\\x41\\x44\\xd3\\x1a\\x5d\\x6e\\x61\\x98\\x31\\xb0\\x9d\\xb4\\xee\\x13\\xb2\\xa3\\x9a\\xe5\\x0e\\x2e\\xb8\\x37\\xb0\\xc4\\xa4\\x13\\x0c\\xf9\\x4e\\x74\\x8d\\x55\\x7f\\x83\\xb7\\xd1\\x9a\\xa6\\x60\\xd9\\xa4\\x40\\x92\\xa3\\xd3\\x40\\x0d\\x94\\x9b\\x2a\\xca\\x77\\xc8\\xa7\\xf0\\x34\\xfa\\x37\\x1d\\x10\\x13\\x6c\\xdb\\x15\\x20\\x79\\xe4\\xd8\\x04\\x37\\x60\\x4d\\x04\\x57\\x51\\x1c\\x15\\xfa\\x72\\xc8\\x79\\xd3\\x34\\x3c\\x92\\x9b\\x75\\x0d\\x61\\xf7\\x9d\\x59\\x90\\x2e\\x66\\xd7\\xd4\\x2e\\xb3\\x20\\x99\\xd0\\xcb\\x71\\xba\\x48\\x0a\\xa1\\x2e\\x1b\\xb7\\x3c\\x7a\\xdb\\x5b\\x5b\\x2f\\x96\\x71\\x72\\x79\\x63\\xa2\\x73\\x31\\xd5\\xda\\x1b\\x12\\x17\\x25\\x2c\\xf6\\xd8\\x07\\x8f\\xee\\x94\\x9d\\x5c\\x03\\xe1\\x7c\\x49\\x7a\\x66\\xbb\\x6d\\x1c\\xcd\\x28\\xbb\\xb2\\xc9\\x0f\\x51\\x7f\\x5e\\xfc\\xac\\xba\\xb6\\x76\\x86\\x5e\\xf2\\x2d\\xf2\\x7d\\xbe\\x11\\xa3\\xb0\\x11\\xcf\\x57\\xb9\\xb8\\x88\\x7a\\xb9\\x30\\xae\\x56\\x18\\x07\\xb2\\x5c\\x1d\\xac\\xa6\\x21\\xc3\\xc0\\xf7\\xeb\\xc1\\xd3\\x93\\x05\\xcb\\xad\\x11\\xfb\\xb4\\x00\\xc9\\xcb\\x9f\\x41\\x00\\xda\\x0c\\xa7\\xca\\x97\\x0c\\xa3\\x1b\\x74\\x26\\x8f\\x52\\x7e\\xed\\x0b\\x6f\\xea\\x52\\x18\\xa2\\x7b\\x5a\\x74\\xd8\\x40\\xb4\\xa1\\x72\\x06\\x8e\\x0a\\x9c\\x72\\x4e\\x00\\x09\\x94\\x21\\x04\\x7e\\x09\\x91\\xac\\x53\\x70\\x19\\x61\\x69\\xf0\\x7a\\x20\\x21\\x4c\\x9a\\x72\\x2c\\x00\\x63\\xb2\\xd4\\x81\\x20\\x39\\xfd\\x91\\x2b\\x06\\xa5\\x22\\x46\\x7c\\xe7\\x06\\x0e\\xfd\\x68\\x12\\x2b\\xb7\\x8f\\x45\\x17\\x1e\\xba\\xfb\\x65\\x21\\x27\\x38\\x9f\\x82\\xd3\\xb7\\x3b\\x64\\x6d\\x82\\x57\\x00\\xfd\\x10\\xcd\\x63\\x8f\\x2e\\xb4\\x1d\\x63\\x70\\x0c\\xd2\\x05\\x08\\xfc\\xc3\\x40\\xc2\\x2c\\x71\\xb0\\xa8\\x07\\xd8\\x5a\\x2c\\x3a\\x7c\\x1e\\xfa\\x17\\xee\\xb3\\x26\\x17\\x0d\\xed\\xd5\\xc7\\xec\\x88\\x16\\xb7\\x69\\xf6\\x0b\\x0e\\x4a\\xc9\\x78\\xc6\\x77\\xe6\\x0c\\x04\\x61\\x88\\x97\\xc1\\xfd\\x84\\x43\\xf5\\x97\\xc3\\xbd\\xc7\\x6b\\xb7\\xe0\\x16\\x9f\\x4b\\xe2\\x3e\\xc5\\x6b\\x52\\xa0\\x9e\\x83\\x42\\x43\\x5f\\x53\\x3c\\x9e\\x10\\x22\\x06\\xcd\\x2c\\xee\\xe5\\xda\\x79\\xcf\\x6d\\xf5\\x8e\\xed\\xa8\\x96\\xfd\\x72\\xed\\x9c\\xa0\\xc6\\xb5\\xb0\\x4a\\xd1\\xc4\\x4b\\x62\\x7c\\xc3\\x2f\\x93\\xbb\\x10\\xd7\\x35\\xfd\\xb2\\xa3\\x2b\\x17\\x66\\x67\\x13\\xd6\\xa5\\x7b\\xc5\\x56\\x98\\x71\\xa3\\x35\\x21\\x2e\\xc5\\x29\\xb6\\x8f\\x54\\xcf\\xcb\\x0e\\x31\\x1e\\xa5\\xda\\x3c\\xa9\\x96\\xfc\\xee\\x2c\\x03\\xa3\\xae\\x61\\x51\\x5d\\x92\\x8e\\x1f\\x60\\x09\\xb8\\x27\\x15\\x1d\\x96\\xde\\x56\\xed\\x28\\x7d\\xb5\\x36\\x61\\x29\\xae\\x85\\xab\\xad\\x6b\\x76\\x69\\x17\\xe3\\x8d\\x79\\xdc\\xd6\\xda\\x72\\x82\\x55\\xb6\\x2e\\xc0\\xfe\\x77\\x13\\xa8\\xb6\\x1e\\xf3\\xa3\\x4e\\xea\\x19\\xba\\xde\\x8b\\x9f\\x36\\x5f\\xcc\\x36\\x5f\\x84\\xe4\\xc5\\x8f\\xfc\\x30\\x9d\\xb9\\x9a\\xa9\\x2b\\xbc\\x16\\x09\\x55\\xe0\\xaa\\x28\\x98\\x2f\\xc3\\x5e\\x06\\xfc\\xa7\\x76\\x37\\xa2\\xa2\\xb8\\xba\\x1e\\xa1\\x94\\x29\\x37\\x24\\x34\\xc8\\xe5\\x2e\\x49\\xf0\\xa0\\x3e\\x8b\\x67\\xad\\xe9\\xf8\\x88\\x35\\xcc\\xba\\xda\\x26\\x80\\x32\\x60\\x46\\x7c\\x53\\x1b\\x1c\\x2e\\x59\\x49\\xc9\\x14\\x36\\xd8\\xca\\x0e\\xb2\\x29\\x0a\\x9e\\x91\\x60\\xa1\\xeb\\x49\\x8f\\xae\\xa7\\x3c\\xea\\xf4\\xf0\\xe0\\xa4\\x2d\\x9c\\xc1\\x67\\xf2\\x32\\x3b\\xcf\\x0d\\xd8\\xd1\\xcc\\x50\\xb6\\x94\\xf9\\xc5\\xaa\\x83\\x1b\\xdc\\x37\\x3f\\x6d\\x8c\\xa5\\x3e\\x6e\\x1f\\xda\\xb2\\x07\\x7d\\xe9\\xd8\\x84\\x36\\xb4\\x8c\\x8b\\x58\\xa9\\x6d\\xac\\xd3\\xde\\xb6\\x55\\x5d\\x9f\\xfb\\xb9\\xaf\\x0d\\xab\\xad\\x52\\x29\\x62\\xce\\xdd\\xa3\\xf2\\x6d\\xc7\\x2d\\x24\\x97\\x85\\xbd\\xcc\\x26\\x78\\xd9\\xe6\\xd3\\x6f\\x3e\\xb5\\x58\\xf9\\xd3\\x6f\\xb8\\x3b\\x81\\xda\\x12\\x43\\x97\\x2e\\xd3\\x1c\\x40\\x17\\x71\\xa3\\xd5\\x7c\\x7c\\xf5\\x33\\x1d\\x17\\x78\\xd4\\x2f\\xf7\\x2c\\xf2\\xca\\x23\\x59\\x7d\\x3f\\x4f\\xf1\\x9e\\x8e\\x61\\xca\\xbb\\xbd\\x2a\\xf5\\x61\\xce\\x21\\xdf\\x5a\\x70\\x36\\xd0\\x1e\\xee\\xd5\\xd9\\x13\\x47\\xcc\\x76\\xe7\\xd7\\x09\\x94\\xe8\\xb7\\x38\\x13\\xda\\xd5\\x55\\x98\\xf9\\x45\\xb6\\xc8\\x61\\x1d\\xfb\\x63\\x72\\x95\\xcf\\x77\\xfe\\x78\\x85\\xd7\\x8a\\xf9\\xf7\\x36\\x67\\x87\\x55\\xaf\\x3c\\x0c\\xb1\\xed\\x00\\x6e\\x85\\x46\\x4e\\x93\\x97\\xc1\\x86\\x6f\\x64\\x56\\xe9\\xd0\\x6c\\x8f\\x27\\xc9\\x2a\\xad\\x74\\x89\\xc1\\x30\\xfa\\xb1\\xf1\\xcd\\xda\\x4b\\xf1\\xd9\\xd8\\xc8\\x85\\xeb\\x5e\\x10\\x3e\\x66\\x86\\x94\\xaa\\xd2\\xb2\\x1b\\xed\\xd5\\xf4\\x71\\x6d\\x97\\x96\\x10\\xa5\\xec\\x54\\x25\\xb8\\x78\\x9a\\x65\\xb6\\x9c\\x3c\\xf8\\xb6\\x51\\x6b\\x7c\\x04\\xa5\\xf1\\x94\\x3a\\x43\\xdb\\x10\\x12\\xe2\\xe5\\xcf\\x83\\x2c\\x00\\xe9\\x14\\x32\\x65\\x0b\\x31\\xac\\xa0\\x6a\\x08\\x9f\\xb4\\x0d\\xba\\xa6\\x6d\\xde\\x95\\xbb\\xea\\x4c\\xf4\\x89\\x8c\\x37\\x34\\xba\\xda\\x16\\x9d\\x21\\x22\\x3c\\x52\\xff\\xac\\x6c\\x47\\xdb\\xc7\\xa5\\x49\\x18\\x6b\\xb2\\x68\\x11\\x45\\xdb\\x1e\\xbe\\xb4\\x6b\\x95\\xad\\x7a\\x5e\\x64\\xec\\xdf\\x4b\\xb8\\xc7\\x1c\\x03\\x81\\xe9\\x5d\\x5c\\xd2\\xbb\\x79\\x9c\\x66\\xf4\\xd9\\x0f\\x83\\x9c\\x40\\xe3\\x07\\xa2\\xed\\x9a\\x39\\xa8\\xbe\\x34\\x37\\xbc\\x99\\x01\\x68\\x9d\\xa3\\xec\\x8d\\x29\\xf9\\xac\\xd0\\xcf\\x81\\xfe\\x98\\xfe\\x93\\x1d\\x53\\x17\\x5b\\xd1\\x3d\\x53\\xd8\\x55\\xc8\\x0f\\x78\\xce\\xa8\\x23\\xec\\x2b\\xf4\\x04\\xd9\\xdc\\x14\\xd0\\xe6\\x39\\x41\\x0e\\xcc\\xdc\\x46\\x16\\xd4\\x68\\xc5\\xcb\\x40\\x0f\\x92\\xb0\\x1d\\x50\\x78\\x1f\\x6f\\xd2\\x49\\x05\\x7b\\x6e\\x8a\\x6f\\xc9\\xa1\\x38\\x9d\\x9c\\x88\\x1a\\x6e\\x97\\x48\\xf2\\x19\\xfd\\x3f\\x7b\\x44\\x53\\xf3\\x7b\\xc0\\xaa\\x24\\xbb\\xbb\\xbb\\xa4\\xf7\\x33\\xb8\\x5b\\x3d\\x67\\x82\\x29\\x7e\\xb2\\xa0\\xc1\\xa9\\x7a\\xec\\xb5\\x0b\\xd1\\x82\\xdb\\x27\\x73\\x63\\x15\\x55\\xf1\\xa3\\xda\\x44\\x42\\x1f\\x90\\xbd\\x00\\xed\\x03\\xfa\\x83\\x48\\xa4\\xe4\\x2a\\x0d\\xef\\xfb\\x96\\xa8\\xbc\\xc0\\x72\\xbe\\x71\\xbe\\xc1\\x19\\xeb\\xf3\\xb3\\x02\\x03\\xb2\\x71\\x41\\xa0\\xa8\\xf2\\x31\\xa1\\x84\\x48\\x18\\x76\\xa8\\x60\\x63\\x84\\xbf\\x11\\xc1\\x85\\xff\\x73\\x1a\\x25\\xde\\xc6\\x86\\x85\\x1d\\xb5\\x21\\x07\\x33\\x8b\\xed\\x13\\x63\\x45\\xb7\\xe2\\x36\\x78\\x6e\\x01\\x7e\\xb0\\x4b\\x4b\\x3e\\x0e\\x12\\x8f\\xf7\\xa1\\x21\\xa1\\x12\\xbb\\xd8\\xc9\\x0e\\x56\\xfc\\x72\\xc3\\x34\\xca\\x90\\x49\\xef\\xdf\\x58\\x40\\x6e\\x17\\x15\\x37\\xe8\\x12\\xa0\\xfc\\xfd\\xc9\\x61\\x79\\x76\\xd0\\x33\\x67\\x84\\xf5\\x7e\\x31\\xbb\\x05\\xfc\\xb5\\x3e\\x23\\xdc\\xfb\\x87\\x25\\x29\\x2f\\x77\\xc9\\xc6\\x1f\\xe1\\xd7\\xee\\x46\\x6b\\xdb\\x1c\\xe1\\x32\\x51\\xf5\\xea\\x4c\\x88\\x7d\\x65\\x13\\xa7\\x43\\xc4\\xc8\\x5b\\x61\\xd8\\x59\\x12\\x49\\xad\\x1d\\xa4\\x3c\\x55\\xa2\\x4c\\xd8\\x3a\\x64\\xf3\\x51\\x1a\\xa1\\xa1\\x60\\x0c\\xd1\\x01\\x85\\x0f\\x87\\x4e\\xc0\\xac\\x98\\xf7\\xab\\x0c\\x33\\xab\\xc8\\x0c\\x59\\x43\\xc5\\xba\\x72\\x6a\\x09\\xd6\\x39\\x93\\x88\\x3c\\x2b\\xf3\\xf0\\xc1\\xab\\x2d\\xec\\x7a\\xf9\\x48\\x71\\x86\\xd9\\xfc\\x50\\x6e\\xf9\\xa3\\x16\\x04\\x23\\xbc\\xce\\x7d\\xbb\\xc0\\x72\\xe2\\xb9\\x46\\x64\\xd9\\xfd\\xdc\\x5b\\x3e\\x8c\\x1b\\x3e\\xb7\\xf7\\x35\\x7f\\xbc\\x51\\x35\\xcb\\x87\\xa9\\x13\\x5a\\x9c\\x70\\x34\\x3f\\xb2\\xc0\\xa5\\xd7\\x43\\xdb\\x12\\x06\\x66\\x13\\xd5\\x32\\x9a\\x4f\\x78\\xd3\\x7e\\x38\\x8f\\x83\\x28\\xd9\\x21\\x78\\x0d\\x16\\x6a\\xec\\xbe\\x3f\\xfb\\x61\\xf3\\xbf\\x5c\\xf7\\x2e\\x38\\x69\\x32\\x28\\xe6\\xd8\\xcd\\xb6\\x17\\xcb\\x1e\\x09\\x45\\x58\\x5b\\x4e\\x6d\\x72\\xd1\\x61\\xa6\\x89\\xcf\\x0e\\xc2\\xce\\x24\\x12\\xef\\xa1\\xe2\\xa7\\x43\\xdc\\xc7\\x7c\\xb1\\x5e\\x45\\xe0\\x45\\xd5\\x2f\\x22\\xaf\\x3c\\x9f\\xa0\\xc8\\x8b\\x64\\xcc\\x88\\x77\\x78\\xb7\\x79\\x7b\\x7b\\xbb\\x89\\x31\\xe8\\x4d\\x60\\x23\\x5f\\x0c\\xc2\\x8f\\x3a\\x13\\x84\\xb1\\xb8\\xf6\\xb9\\x30\\x2e\\x8d\\x52\\xf1\\xcd\\x35\\x1f\\x30\\xce\\xc7\\x6c\\x09\\x0b\\xe3\\xeb\\x16\\x47\\xcd\\xb6\\xb4\\xb6\\x2d\\x70\\x62\\xe3\\xe2\\xab\\x5e\\x49\\xf3\\x96\\x58\\x9d\\x2a\\xc2\\x5d\\x73\\xcd\\x4b\\x52\\xf9\\xa1\\x7f\\x0f\\x55\\xda\\x40\\x9e\\xee\\x1f\\x60\\x9a\\x6c\\xdc\\x80\\xaa\\x4d\\xe5\\xca\\x6d\\xed\\x78\\xc5\\x40\\x5c\\x2d\\x28\\xac\\x97\\x0a\\x64\\x2b\\xa3\\xf2\\x9b\\x2d\\xab\\x55\\x79\\xe5\\x40\\x52\\xa7\\xb3\\xca\\x9a\\x6d\\xb4\\xec\\xde\\x75\\x44\\xe3\\x50\\xf4\\x8e\\xd1\\xb2\\x64\\xdf\\xb0\\xa6\\xbd\\x67\\xf3\\xea\\x44\\xfa\\xe3\\xfa\\x27\\x58\\x74\\xc3\\xb5\\xb9\\xb5\\xff\\x53\\xb4\\xab\\x30\\x7a\\x85\\x91\\xa7\\xbd\\xa2\\x80\\x09\\xca\\xc0\\x7b\\xa2\\x53\\x66\\xd6\\x5c\\x67\\x06\\x56\\x3c\\x86\\x76\\x5f\\x5a\\x6d\\x56\\x7f\\x4f\\x07\\xf9\\x44\\xef\\x7b\\xca\\xd9\\xf3\\x8e\\xca\\x14\\x6a\\xc2\\x4d\\x73\\x65\\x89\\x28\\x6b\\xf2\\x4b\\xd5\\xc6\\x4a\\xd3\\x00\\xcf\\xf7\\x1a\\x6a\\xcb\\x6e\\x43\\x0d\\x99\\xd9\\xd1\\xdc\\x0d\\xd0\\x2f\\xc4\\x19\\x3d\\x90\\x84\\x37\\xde\\xfa\\x9b\\xd0\\x5a\\xe6\\x41\\x13\\x29\\xd7\\x68\\xec\\x1c\\x75\\x0b\\xb2\\x79\\x9a\\x77\\xc5\\xc6\\xd7\\x9f\\x66\\x74\\x98\\x83\\xbd\\x23\\xba\\x1f\\x0f\\xf6\\xf6\\xdb\\xd0\\x01\\xbb\\x3b\\xb0\\x50\\x20\\xdc\\x3f\\x78\\x73\\x70\\x76\\xe0\\x40\\xd9\\xf1\\x2e\\x61\\x65\\x54\\x54\\x2d\\xba\\xcd\\x99\\x92\\x4e\\x73\\x18\\x59\\x1a\\x28\\x7b\\xbf\\x14\\x73\\x4a\\x62\\xe6\\x47\\xd7\\x35\\xa9\\x19\\xe8\\x42\\xf4\\xfb\\xbb\\x9a\\xa8\\xeb\\x8f\\xa7\\xbc\\xa4\\x58\\x29\\xe8\\x9c\\x32\\x70\\xe4\\x7e\\x19\\xd1\\x12\\xf4\\xe5\\x9b\\xa2\\x91\\xc6\\xa0\\x2a\\x8b\\x82\\xfe\\x73\\xf8\\x81\\xbc\\x0b\\xa2\\xac\\x21\\xa2\\x8a\\x46\\x4e\\x63\\x48\\x95\\xaf\\x2f\\x3d\\xd0\\x21\\x00\\xc6\\xee\\xc4\\x81\\x82\\x11\\xdf\\x0c\\xd9\\x68\\x3a\\xd4\\x50\\x6e\\x84\\x64\\x41\\x96\\x35\\x6e\\x7e\\x88\\x06\\x3f\\x08\\xf5\\xcf\\x1a\\x02\\x1d\\xb5\\x74\\x93\\x62\\xdd\\xef\\xbd\\xa6\\x85\\x44\\x03\\xea\\x65\\x65\\x34\\x68\\x37\\x4a\\x3c\\xa8\\x0a\\x56\\x46\\xf4\\x6e\\x51\\xd2\\x83\\x1a\\x6a\\x65\\x3c\\xfb\\x4c\\x81\\x48\\x54\\x5c\\x9d\\x2c\\x85\\x6c\\xe9\\x08\\xb6\\x21\\xf8\\xae\\x38\\xb6\\x0e\\xc6\\x4c\\x34\\xa3\\xc8\\xb6\\x8d\\xc2\\xce\\xd6\\x34\\x2f\\xdc\\x3a\\xc8\\x67\\xb7\\x70\\x6b\\x91\\x5e\\x33\\xd4\\xd5\\x56\\x8f\\x87\\x7d\\xf5\\x20\\xd5\\xef\\x7f\\x09\\xff\\x6c\\x17\\x49\\x35\\x48\\xfa\\x39\\xae\\x91\\xfa\\x54\\xfd\\x94\\xd7\\x48\\x46\\xe9\\x13\\x2c\\x90\\x6c\\x96\\x4a\\x6d\\x5c\\xcd\\xdb\\x67\\x58\\x29\\x61\\xa6\\x6b\\xed\\x1e\\x24\\xab\\x2f\\x4e\\x4f\\xb4\\x58\\x3e\\xff\\xda\\x64\\x08\\x9c\\x6b\\x6d\\xd2\\xc1\\xd8\\xda\\x64\\x14\\xd9\\xd6\\x26\\x11\\x7d\\x69\\x5e\\x9d\\x4c\\xa0\\xcf\\x6e\\x7d\\x7a\\xbc\\x63\\xf9\\xca\\x16\\x53\\xd2\\xea\\xfc\\x4e\\xd6\\xa5\\x2f\\xae\\xe5\\x47\\x59\\x35\\x8d\\x28\\xfc\\xe7\\xb8\\x70\\x9a\\x5a\\xe4\\x53\\x5e\\x3a\\x05\\xad\\x5f\\xbc\\xcb\\x2f\\xde\\x65\\xfd\\x59\\x7a\\x05\\xaf\\x49\\xbe\\x6b\\x0d\\x37\\x01\\x45\\xa6\\x44\\xa3\\xd0\\xb6\\x8e\\xbf\\x49\\x27\\xcd\\x6b\\xb8\\x0a\\xf0\\xc8\\x23\\x7b\\x76\\xbd\\x17\\xa7\\x93\\x51\\x7d\\x7f\\xc4\\xce\\x41\\xb6\\x09\\x32\\x32\\x36\\x47\\x5a\\xb7\\xd7\\x8c\\xbc\\x97\\x4a\\x87\\xd6\\xa3\\x4a\\x34\\x1d\\x02\\xcd\\x75\\x51\\x1b\\x49\\x9e\\xc6\\x4e\\x9b\\x5b\\x4a\\xe0\\x2b\\xec\\xb1\\x14\\x40\\xd6\\xfd\\x81\\x7d\\x41\\xe3\\x29\\x7e\\x9d\\xe7\\x46\\x59\\xfd\\x98\\x1d\\x7b\\x31\\x2f\\x0a\\x3a\\xff\\xe2\\x9c\\xde\\xc5\\x1e\\xde\\xd8\\xb3\\xfd\\xe1\\x0f\\xc6\\xef\\x65\\xe5\\x5c\\x1b\\x12\\x97\\x8c\\xab\\x40\\x4c\\xbe\\xb5\\x02\\x9b\\x6c\\xff\\x6e\\xd2\\x1e\\x69\\x02\\xd3\\x24\\x2d\\xd6\\xd5\\xa9\\x71\\x35\\xd1\\xc3\\x4c\\x6e\\x25\\xa7\\x9b\\xfc\\x6e\\x38\\x53\\xa9\\x74\\x3f\\x98\\x8c\\x8f\\x3a\\x64\\xeb\\xc8\\x11\\xa6\\x9e\\x76\\xac\\x32\\x3d\\xd5\\x4b\\x8d\\xa3\\xa2\\x2a\\x80\\x7e\\x62\\x54\\x7b\\x63\\x1c\\x1c\\x35\\x6a\\x3d\\x32\\xfb\\x13\\xde\\xdc\\x5d\\x5f\\xde\\xa5\\x25\\x13\\xd7\\x5a\\xae\\x27\\x7d\\xcc\\x74\\x4e\\xec\\xb2\\xb4\\x23\\x9f\\x93\\xf2\\xce\\x3c\\xdf\\x2a\\xee\\x58\\x77\\xbb\\xb5\\xc4\\x81\\x3f\\xe5\\x94\\x4e\\x9c\\xc2\\x67\\xca\\xe9\\x24\\xaf\\x6f\\x3b\\x5d\\x83\\xcf\\x21\\xa9\\x93\\xbc\\x98\\xae\\x67\\x75\\x92\\xb7\\xe8\\xed\\x8b\\x1b\\x3e\\xf5\\xb4\\x4e\\x02\\xd3\\x8a\\x79\\x9d\\xaa\\xda\\xeb\\x49\\xec\\x24\\xf1\\x37\\xf7\\xe8\\xf7\\x92\\xd9\\x49\\xf6\\xe6\\x31\\xa9\\x9d\\x14\\x8e\\xff\\x7f\\xca\\xed\\x54\\x53\\x21\\x5f\\x92\\x3b\\xb5\\x24\\x10\\xaa\\x73\\xec\\xf3\\xc9\\xee\\x24\\xfa\\xf6\\xa4\\xe9\\x9d\\x54\\x9c\\xcf\\x90\\xdf\\xa9\\x3e\\x3c\\xce\\x04\\x4f\\x0d\\x49\\x50\\xca\\xb5\\xc0\\x92\\x91\\xc6\\xad\\x3b\\x39\\x4b\\xe1\\xed\\xb3\\x25\\x25\\xe2\\xad\\xb9\\xb2\\x3c\\x39\\x69\\x59\\x25\\x2b\\x51\\x9d\\xb1\\x8e\\x3c\\x4f\\x9f\\x0d\\x5b\\x9d\\xc9\\x9e\\xd6\\xc1\\xd7\\xe7\\x4e\\xf7\\xa4\\x4c\\xcb\\x55\\xf2\\x3d\\xd5\\xa4\\xc1\\x96\\xf0\\x69\\x7d\\x92\\xf0\\xb9\\x24\\x7d\\x62\\x37\\x3a\\x0f\\xf5\\x64\\x25\\xd6\\x0b\\xcd\\x5c\\xe4\\xca\\x3b\\xca\\x9d\\xee\\x36\\x3b\\xea\\x2c\\x9b\\xe1\\x85\\xd1\\x68\\xcb\\x74\\x64\\xe2\\x7f\\x5c\\xbe\\x23\\xd6\\x8c\\x2d\\xe9\\x91\\xab\\x99\\x27\\x4d\\x7d\\x54\\x9f\\x85\\x42\\x09\\x3c\\x79\\xf2\\x23\\x67\\x4b\\x4f\\x9a\\xfe\\x48\\x68\\xb0\\x35\\xe4\\x3f\\x72\\x29\\xbf\\xa7\\x4c\\x80\\xd4\\xb0\\xac\\xad\\x33\\x03\\x92\\xd4\\x57\\x6b\\x48\\x81\\xe4\\x5c\\x32\\x36\\x49\\xd3\\x62\\xb3\\xd6\\x24\\x48\\x4a\\x77\\x57\\xde\\x9d\\xb0\\xaf\\x65\\x6d\\x69\\x90\\xec\\x36\\xa1\\x3d\\x0f\\x92\\x6b\\xa1\\x7a\\x44\\x22\\x24\\x8e\\x52\\x0b\\x17\\x2a\\x80\\x4a\\xfc\\xc8\\x2f\\x03\\x46\\x66\\x95\\x4f\\x2d\\x19\\x92\\x42\\x74\\x95\\x0d\\x49\\x2d\\x54\\xd2\\x21\\xe9\\xb0\\xab\\xe4\\x43\\xe2\\xb1\\xa0\\xf5\\x26\\x44\\x32\\x02\\xa0\\xab\\xdd\\x84\\x57\\x87\\xcd\\x0c\\x11\\x6a\\x63\\x24\\xa4\\x2c\\xaf\\x58\\x63\\x66\\x45\\xaa\\x8b\\xc5\\xba\\xf3\\x22\\xd9\\x68\\x7a\\xca\\xcc\\x48\\x8d\\xf8\\xbf\\xe4\\x46\\xd2\\x06\\xa1\\x53\\x72\\x24\\x0e\\xeb\\xdc\\x64\\xaa\\x5e\\x3f\\x63\\xa6\\x93\\xaa\\xd1\\x8f\\x94\\x1f\\x49\\xa8\\xd0\\xa7\\x4b\\x90\\x64\\x15\\xdb\\xc6\\x14\\x49\\x1d\\xb3\\x9d\\x2a\\x39\\x92\\x1a\\xda\\xe8\\x10\\x3b\\xd5\\xb9\\x54\\x4b\\x93\\x24\\xc3\\xc9\\x1f\\x2d\\x4f\\xd2\\x92\\x99\\x58\\xf9\\x10\\x8e\\x14\\xf0\\x4e\\xf9\\x91\\x80\\xf3\\xbd\\xc7\\xa6\\x6f\\x5a\\x35\\x87\\xd3\\x13\\x24\\x72\\xb2\\xb9\\x34\\x7a\\x36\\x27\\x9b\\x37\\xd2\\xd8\\xdc\\x33\\xa5\\x74\\x52\\xa6\\xbc\\x6b\\x77\\xb4\\x02\\xa9\\x84\\x5d\\x29\\x43\\x1b\\xa0\\x5e\\x6a\\xdb\\x51\\x67\\xaf\\x9b\\x35\\xde\\xc7\\x50\\x78\\x4f\\x9d\\xdb\\xa9\\xda\\x17\\x32\\x92\\x3b\\xc9\\xb9\\xfc\\x04\\xd9\\x9d\\x18\\xe1\\x4f\\x98\\xde\\x89\\xcf\\x5a\\xd2\\x6d\\xda\\x5a\\x15\\x9e\\x4c\\xf1\\x24\\xab\\xaf\\xec\\x25\\x38\\x06\\xa8\\x51\\x3a\\x2d\\xc2\\x69\\x95\\x4d\\xdb\\xf6\\x7d\\x69\\xb6\\x2b\\x9b\\xf3\\xa2\\xcc\\xd8\\xb2\\x2f\\x21\\x57\\xdb\\xac\\x0f\\xe6\\x73\\xa7\\x15\\xbc\\xaa\\x09\\xac\\xff\\xc5\\xda\\x36\\xb8\\xea\\xef\\x8d\\xb5\\x41\\xca\\x24\\xa6\\x6d\\x70\\x66\\xea\\xaa\\x36\\xf8\\xd2\\x19\\x60\\x80\\x72\\x7e\\xa0\\x15\\x8f\\xfb\\xc7\\xd3\\x20\\x9f\\xf6\\x76\\x64\\xb1\\x17\\xa6\\xe3\\x05\\xfe\\xa5\\x7c\\x3c\\x08\\x78\\xc0\\xff\\x68\\xfe\\xf7\\xf7\\x87\\xa1\\xd7\\xcb\\xd2\\x14\\xed\\x03\\xd2\\x63\\xed\\x6f\\xd2\\xea\\xec\\x0b\\x9f\\x91\\x3d\\xce\\x91\\xde\\xa8\\xf6\\x57\\xdc\\xd8\\x01\\x8e\\x81\\x00\\x12\\xec\\xd0\\xc1\\xd4\\x3f\\xec\\x25\\x01\\x91\\x1b\\x3a\\x94\\x91\\xc7\\x4e\\x05\\xcc\\x3b\\x43\\x0e\\x47\\x32\\xdd\\x9b\\xa3\\x46\\x0d\\xf5\\x52\\x35\\x74\\xde\\x8c\\x5c\\x07\\x53\\xb4\\x9e\\xb2\\xf1\\xd1\\x61\\xcd\\xf9\\xa3\\x81\\xe6\\x6e\\xd8\\xbc\\x06\\x3c\\x1c\\x95\\x1a\\x70\\x89\\x16\\xba\\xd6\\xfa\\x0a\\xb7\\x13\\xff\\x2f\\x00\\x00\\xff\\xff\\x1f\\x41\\x30\\x6b\\x7e\\x9d\\x00\\x00\")\n\nfunc uiJsAppJsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiJsAppJs,\n    \"ui/js/app.js\",\n  )\n}\n\nfunc uiJsAppJs() (*asset, error) {\n  bytes, err := uiJsAppJsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/js/app.js\", size: 40318, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiJsLibsD3335D3MinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xbc\\xbd\\x69\\x77\\xdb\\x46\\xd2\\x28\\xfc\\xfd\\xfd\\x15\\x16\\x6f\\xa2\\x83\\xa5\\xc1\\x4d\\xde\\x02\\xaa\\xc9\\xe3\\x38\\xce\\x32\\xb1\\x1c\\xc7\\xca\\xce\\x61\\x74\\x20\\xb0\\x49\\x22\\x06\\x01\\x1a\\x8b\\x44\\xda\\xd2\\xf3\\xdb\\xdf\\xaa\\xea\\x6e\\xa0\\x01\\x52\\xb2\\x3d\\xf3\\xdc\\x3b\\x19\\x8b\\x00\\x7a\\xdf\\x6a\\xaf\\xea\\xa3\\x45\\x99\\x84\\x45\\x94\\x26\\x96\\xfd\\x41\\x3f\\x3e\\x48\\xac\\xc4\\xfe\\x90\\x89\\xa2\\xcc\\xe0\\xf9\\xf8\\xd8\\x4a\\xba\\xe9\\x75\\x22\\xb2\\x6f\\xd2\\xb0\\x5c\\x8b\\xa4\\xb8\\xb9\\x49\\xba\\xf3\\xfa\\xd9\\xae\\x5e\\x5e\\xc4\\x02\\x7f\\x6e\\xab\\x8a\\x8a\\xfb\\x2b\\x3a\\x3e\\x6e\\x7d\\xe8\\xce\\xc5\\x22\\x28\\xe3\\xe2\\xb7\\x48\\x5c\\x9b\\xad\\x40\\x46\\x7a\\xad\\x53\\xed\\xba\\x11\\x61\\x25\\xac\\xa8\\x9a\\x29\\xc6\\xc9\\xc4\\x1b\\xf8\\xc9\\xb8\\x98\\xe0\\x5f\\x5e\\x4c\\xfa\\x7e\\xbf\\xd7\\xaf\\xb3\\x67\\x66\\x9f\\xca\\x38\\xe6\\x9c\\x27\\x13\\xc8\\xe1\\xbb\\x49\\x9d\\xa9\\xac\\x33\\x1d\\x45\\xf9\\xab\\xe0\\x15\\xbc\\xd7\\xa9\\x51\\x9d\\xfa\\x21\\x16\\x8b\\xc2\\xaf\\x26\\xb1\\x60\\x82\\x65\\xac\\x84\\xb9\\x4c\\x33\\x2b\\xc8\\x96\\xd4\\xfb\\xbc\\x1b\\x8b\\x64\\x59\\xac\\x4e\\x4f\\x60\\x0a\\x32\\xde\\xb7\\xd9\\x5e\\xca\\x43\\x48\\x29\\x79\\xa1\\x5e\\xed\\x51\\x39\\xce\\x46\\xf6\\x87\\xab\\x20\\x7b\\x10\\xf1\\xcc\\x2d\\xc7\\xe3\\xf1\\x60\\x04\\xb5\\x4f\\xa3\\x19\\x13\\xf6\\x69\\x7f\\x92\\xf1\\xc8\\x1d\\xf8\\x25\\x8f\\x6e\\xd5\\x48\\xb2\\x5b\\x96\\x45\\xcb\\xd5\\xff\\xeb\\xae\\x8c\\xfb\\x13\\xe8\\x84\\x4f\\xdd\\xa9\\xbb\\x72\\x5b\\x4f\\x55\\x6a\\xce\\xb6\\xaa\\xb3\\x4e\\x0d\\x30\\x15\\xfb\\x87\\xd5\\x17\\x1c\\x2a\\x76\\x8a\\x2f\\x07\\x23\\xbb\\x70\\xf8\\xa0\\x3f\\xd2\\x2b\\x5a\\xe7\\x0f\\xe5\\x52\\xeb\\x12\\xe2\\x41\\x04\\xc9\\xf6\\x4f\\x97\\xff\\x88\\x90\\xf6\\x4e\\x94\\x88\\xd7\\x59\\xba\\x11\\x59\\xb1\\x83\\xbd\\xb6\\xc9\\xd2\\x22\\x2d\\x76\\x1b\\x01\\x33\\x01\\x03\\x88\\x4b\\xe1\\x17\\x53\\x01\\xdd\\x4e\\x60\\xc4\\x59\\x70\\x19\\x0b\\xff\\x68\\x70\\x6b\\xac\\x6b\\x0c\\x87\\xa0\\x58\\x45\\x79\\xf7\\x82\\xab\\x3a\\xc3\\x4c\\x04\\x05\\x6c\\x30\\xd8\\x27\\x46\\xbe\\xbc\\x1e\\x94\\x95\\xb8\\xbc\\xd3\\xb1\\x61\\x13\\x6d\\x02\\xd8\\xa2\\xd3\\xfe\\x0c\\x1e\\xaf\\x82\\xc9\\x55\\xe0\\x26\\xbe\\xb1\\xa1\\x16\\x7b\\x45\\xaa\\xac\\x49\\x37\\x8f\\xa3\\x50\\x58\\x03\\xdb\\x2c\\xb0\\x32\\x26\\x0e\\xdb\\xc3\\x91\\x52\\xd7\\xea\\x2c\\x4b\\xb3\\x4e\\x8e\\x99\\xea\\x5c\\xc7\\xc7\\x73\\x11\\x8b\\x42\\xa8\\xd7\\x69\\x32\\xab\\xcb\\x6d\\x2c\\xb9\\x9e\\x09\\x9f\\xce\\x46\\xd5\\xec\\x3f\\xa8\\xca\\xda\\x30\\x75\\x65\\xbe\\xb2\\x16\\x56\\x61\\xdb\\x7a\\x15\\x8c\\xae\\x5d\\x55\\xe5\\xfb\\x07\\x8b\\xbb\\x6e\\x72\\xa0\\xd4\\xdc\\xaa\\x17\\x2e\\x31\\x72\\xab\\x53\\x36\\x50\\x45\\x8e\\x8c\\xa3\\xba\\xfe\\xc4\\xf5\\xd8\\x99\\x9b\\xac\\xfe\\x7c\\x86\\xbb\\x05\\x36\\xa9\\x4e\\x32\\x40\\x1d\\x76\\x22\\xe3\\xa2\\x1b\\x6c\\x36\\xf1\\x0e\\x8e\\x4a\\x75\\x0a\\xaa\\xf1\\x66\\xb0\\x38\\xc5\\x24\\xf1\\x33\\x63\\x33\\x6f\\xe5\\xf6\\x8b\\x60\\x62\\x70\\x00\\x89\\xad\\x77\\xe8\\xa8\\x80\\x03\\x13\\xae\\x82\\xec\\x59\\x61\\xf5\\xed\\x6e\\x91\\xfe\\xba\\x81\\x4d\\xf8\\x3c\\xc8\\x85\\x65\\xbb\\x45\\xb5\\xbe\\xd5\\x6c\\x09\\xde\\x67\\x19\\x9f\\x07\\xea\\x40\\x8c\\xb2\\xb1\\x18\\xb9\\xae\\x90\\xfd\\x2a\\x21\\x01\\xb6\\xa9\\x5b\\x8c\\xa0\\xa1\\xb2\\xd1\\x50\\x69\\x74\\xe6\\x12\\x86\\x51\\xbf\\x5d\\x34\\xde\\xae\\xe9\\x5c\\xd5\\x50\\xd8\\x38\\x64\\xd0\\xae\\x60\\x25\\xf7\\x06\\x0c\\x8e\\xb3\\x6e\\xdf\\x75\\xcb\\xd3\\x68\\x64\\x5b\\x05\\xcf\\xa6\\xe5\\xac\\x9b\\x26\\xf6\\xf1\\x71\\xa1\\x27\\x07\\x16\\xe0\\xc0\\xfc\\x24\\xb7\\x72\\x20\\xd3\\x19\\xd4\\x98\\x88\\xeb\\x07\\x71\\x75\\x5e\\xa1\\x3c\\x37\\xc0\\x50\\xa9\\xa0\\x07\\x4b\\xa1\\xc1\\xa5\\x28\\x60\\x57\\xe9\\xac\\x7b\\xc0\\x67\\x38\\x49\\x8f\\x8f\\x53\\xa8\\xc0\\xb7\\xe0\\xc1\\xc2\\x27\\x8e\\x8b\\xcd\\x04\\x2c\\x96\\x9c\\xc6\\x3e\\x74\\x5c\\x74\\xa3\\x64\\x2e\\xb6\\x3f\\x2d\\xac\\xd4\\xb6\\xbb\\x61\\x9a\\x84\\x41\\x61\\xe9\\x0c\\x00\\x8a\\x6c\\x9b\\x65\\xdd\\x4c\\xac\\xd3\\x2b\\x81\\x7b\\x98\\x95\\xc7\\xc7\\x42\\xee\\xe9\\xac\\x9b\\x63\\x0f\\xd8\\x07\\x68\\xa2\\xbc\\x85\\x24\\x80\\xeb\\xcc\\x80\\x30\\xe7\\xb8\\xe5\\x82\\xae\\xb8\\x42\\x6c\\xb4\\xc9\\xe8\\xf7\\x1b\\x89\\x76\\x2c\\x63\\xc7\\xbd\\x35\\x37\\x33\\x83\\xd5\\x57\\x45\\x46\\x09\\x6c\\x84\\x3c\\x2d\\xb3\\x50\\xbc\\xa0\\x77\\xbb\\xe0\\xc9\\x01\\x40\\xf6\\xa2\\x09\\xf8\\x70\\xfe\\x2e\\x98\\xdc\\x15\\xed\\x39\\xc1\\x8d\\x71\\x0a\\x20\\xb8\\x98\\x56\\x29\\xb0\\x3b\\x66\\xfc\\xda\\x98\\x47\\x98\\xf2\\x45\\x3d\\xe5\\x00\\xf7\\xf7\\xf7\\x3c\\xac\\x42\\x91\\xed\\x14\\x1c\\x2f\\xcd\\x3e\\xd6\\x9d\\x2f\\xbb\\x05\\xb4\\x21\\xa0\\x3f\\x4c\\x7f\\xe3\\x25\\x2b\\xa6\\xf0\\x1d\\xa0\\xe8\\x4c\\x6d\\x08\\xac\\xfe\\x16\\x40\\x6d\\x10\\xc7\\xbb\\x6a\\xae\\x00\\x13\\xdd\\x36\\x26\\xf2\\x99\\x71\\x26\\x77\\x00\\xe7\\xd9\\x45\\x00\\x93\\x5d\\xa7\\xbf\\xaa\\xd3\\x3b\\xfa\\x63\\x07\\x8e\\x1c\\x34\\x94\\x2e\\x1e\\x24\\x70\\xf2\\x8c\\xe3\\xaa\\xea\\x39\\xc3\\x7a\\x70\\x3f\\xda\\xc6\\x39\\x78\\xfe\\x1f\\x54\\xb4\\x3d\\x54\\xd1\\x7b\\x85\\x5c\\x6a\\xba\\x42\\x41\\x1f\\xb9\\x91\\x9e\\x15\\x45\\x16\\x5d\\x96\\x08\\x7d\\x6c\\x93\\x9a\\x38\\x9c\\xe9\\xd5\\x39\\x20\\xa0\\x7c\\x13\\x84\\x82\\x01\\xda\\x4b\\xc3\\xc0\\x84\\x57\\xa5\\x2e\\x04\\x7b\\xd1\\xa8\\x16\\x5a\\x37\\x69\\x8c\\x03\\x79\\xf6\\x6b\\x6d\\x94\\x49\\x15\\x64\\x13\\xfc\\xae\\xc3\\x2b\\x09\\x1e\\x31\\xb9\\x63\\x5c\\xfe\\xa1\\x5e\\x09\\xdb\\x44\\xd8\\xff\\x4d\\x0b\\x07\\x26\\x65\\xbf\\xc5\\x03\\x63\\x84\\x1e\\x68\\xa8\\x83\\x9b\\x35\\xc9\\xbb\\xef\\xca\\x20\\x8e\\x16\\x08\\xf7\\x99\\x6c\\x10\\x40\\xb5\\xcc\\x3c\\xc9\\x7c\\xe1\\x1f\\xd8\\x08\\x75\\x86\\xc0\\x4f\\x7d\\xfd\\x1c\\x01\\x10\\xa8\\x06\\xf7\\xae\\x41\\xab\\x40\\x77\\x00\\xff\\xc0\\x10\\x36\\x31\\xf4\\xc5\\xea\\xfd\\x3b\\x77\\x7b\\x4b\\xd6\\x79\\xd0\\x31\\xa6\\xe3\\xa5\\x59\\x02\\xce\\xf0\\x1b\\xb1\\x7c\\xb1\\xdd\\x58\\x1d\\x6b\\xe2\\xff\\x7d\\xf3\\x6f\\x28\\x61\\x77\\x5c\\xe8\\x70\\x26\\xde\\x95\\x29\\x4d\\xb0\\x8b\\x49\\x98\\x70\\xf3\\x85\\xdd\\x61\\x9d\\xa5\\x59\\xd9\\x2f\\x0d\\x12\\x01\\x28\\x04\\xdd\\x85\\x7c\\x13\\x47\\x85\\xd5\\x83\\x1a\\xa1\\x0b\\x46\\x81\\x37\\x07\\x36\\x6c\\x8d\\x61\\xbc\\x01\\x41\\x8e\\x72\\x64\\x27\\x00\\x2f\\xe4\\x3a\\x15\\xad\\x9d\\x6b\\xe6\\x06\\xd0\\x73\\xd7\\x9a\\xee\\xd5\\x03\\x00\\x20\\xe1\\xd8\\xdf\\xee\\x3a\\xd8\\x58\\xdf\\xd8\\x23\\x89\\xb7\\x92\\x0a\\x9f\\xdd\\x75\\x1c\\x0b\\x5c\\x9e\\xba\\x0f\\xdf\\xe0\\x90\\x25\\x08\\xc4\\xa9\\x1c\\xb5\\x81\\x16\\x41\\x32\\xc4\\x82\\x00\\xf1\\xc3\\x38\\xc8\\xf3\\x97\\x51\\x5e\\x68\\x64\\x98\\x4d\\xca\\x6e\\x30\\x9f\\xe3\\xb6\\x2d\\x35\\xb0\\x4f\\x74\\x57\\x04\\x62\\x9a\\x7a\\x17\\x77\\xa8\\x74\\xc7\\xbe\\xb9\\xe9\\x74\\x46\\xd9\\xc4\\x02\\xf2\\x36\\xc8\\x8b\\x1f\\x10\\x89\\x00\\xd0\\x2d\\xba\\x85\\xc8\\x0b\\x00\\x91\\x37\\x37\\xa2\\xb9\\xfb\\x55\\x39\\xf6\\xce\\x2a\\x5d\\x58\\x7a\\x17\\x48\\x2c\\xdb\\xbf\\x3b\\x4f\\xb5\\x5b\\x0a\\xda\\x28\\xb6\\x09\\x5e\\x5e\\x6b\\x6a\\x64\\x1f\\x76\\xe4\\xc5\\x2e\\x16\\x6a\\x08\\x35\\xfd\\x7a\\x10\\x60\\x50\\x4e\\x68\\xbe\\xce\\x46\\x95\\x36\\xe1\\x86\\xa4\\x6e\\xee\\x3f\\xa1\\xd9\\xe4\\xbe\\xa6\\xfd\\x3b\\x5b\\xcb\\xcc\\xd3\\xa8\\x8e\\x5e\\x76\\xf8\\xc0\\x35\\x0e\\xd7\\xaf\\x07\\x36\\xab\\x41\\xa2\\x36\\x08\\x54\\x3d\\x31\\xf0\\x91\\x17\\xcd\\x59\\xf8\\x34\\xe0\\xd3\\xac\\xd8\\xd7\\x75\\x89\\x76\\xc7\\xef\\x80\\x14\\x25\\x50\\x7d\\x55\\xab\\xff\\xec\\xd1\\x52\\x72\\xc3\\xd2\\x0c\\x35\\xb8\\x57\\x40\\xe0\\xf4\\x31\\x09\\xd6\\x82\\x00\\xd8\\xaf\\x6f\\x7e\\xd0\\x5b\\x1a\\x00\\xa2\\x22\\x5e\\x15\\x93\\x0c\\x60\\x0e\\x00\\x1c\\x4c\\x74\\xf3\\x73\\x63\\xd9\\x45\\x8d\\xb1\\xf6\\x5b\\xdb\\xab\\x6e\\x0f\\xdf\\xdc\\x8b\\x14\\xad\\x7d\\x50\\x6a\\x2b\\xa0\\x08\\x6c\\x52\\xdd\\x87\\x6f\\x2b\\x62\\x9f\\xba\\xb0\\x09\\x32\\x6c\\x2d\\x9d\\x8b\\x51\\x82\\xec\\xbb\\xdc\\x39\\xcf\\x57\\x51\\x3c\\xb7\\x24\\x42\\xad\\x4a\\x7e\\x6f\\x70\\xc9\\x17\\x17\\xf3\\xa0\\x08\\x2e\\x2e\\x80\\xc3\\xa9\\x33\\xfc\\x64\\x40\\xcf\\x7d\\x1c\\x7d\\x19\\xc8\\xe5\\x4d\\xcc\\x43\\xf4\\x83\\x51\\xa4\\x4d\\x28\\xdd\\xdc\\xc0\\x98\\x84\\xcd\\x4c\\x0e\\xb8\\x9e\\x3f\\xa0\\x00\\x27\\xf0\\xa9\\xab\\x7b\\xc2\\x44\\xf5\\x68\\xfb\\x47\\x85\\x77\\x24\\x8c\\x66\\xfe\\x6c\\xf1\\x99\\x44\\x98\\x25\\x26\\xb5\\x2e\\x5c\\xd7\\xd6\\xc9\\x25\\x50\\xa4\\x08\\x1b\\x81\\xc0\\xed\\xb3\\x80\\x47\\x3a\\x5f\\x30\\x4e\\x47\\x29\\xe4\\x03\\xf0\\x15\\x4d\\xd3\\x19\\xd2\\xd4\\x56\\xc9\\x52\\xe8\\xd5\\x01\\xf6\\xe8\\xaf\\x36\\xbd\\x74\\xde\\xa4\\x97\\x7e\\xab\\x40\\x25\\x13\\x7b\\x70\\x12\\xf8\\x7c\\x16\\xc9\\xe4\\x14\\x7a\\x90\\x00\\x73\\xde\\x2d\\x37\\x30\\x3a\\xc1\\x42\\x5e\\x71\\x19\\xd8\\xdf\\xe8\\x88\\x0b\\x20\\xac\\x05\\x8f\\x80\\x6a\\x05\\xf6\\xbf\\x1c\\x73\\x98\\x1a\\x20\\xfc\\x4b\\xa0\\x9a\\x47\\x47\\x56\\xca\\x83\\x69\\x81\\x5d\\x75\\xdd\\xe2\\x34\\x1c\\x55\\x3d\\x4d\\x8d\\xd9\\xf9\\xe3\\x20\\x24\\xab\\x4f\\x05\\x8c\\x75\\x44\\x95\\xd6\\x24\\x00\\x11\\x9a\\x08\\xbc\\x05\\xec\\x60\\x2a\\x5e\\x74\\xbf\\xb0\\x99\\x79\\x4e\\x61\\x82\\xf6\\x8f\\x7a\\xc9\\x43\\x58\\xc6\\x2c\\xa8\\x05\\x18\\xc8\\x91\\x76\\x61\\x97\\xc6\\x72\\xbb\\x11\\x15\\x87\\x68\\x60\\xaf\\x05\\x59\\x27\\xd0\\xaf\\x65\\xf7\\x0b\\xdc\\x16\\x25\\x70\\x91\\xc5\\x3e\\x9c\\xc4\\x53\\x6b\\xa2\\xee\\xbf\\x2f\\x2e\\x60\\x42\\xa7\\x7f\\x77\\x67\\x07\\x90\\xf7\\x17\\x9d\\x9a\\x87\\xcb\\x34\\x0f\\x6b\\x23\\x3f\\x08\\xac\\xcd\\x3a\\x28\\xc2\\x95\\x25\\x6c\\xdd\\x73\\xea\\x41\\x06\\x53\\x71\\xd7\\x34\\x14\\xd3\\xc1\\x8c\\x51\\xff\\x9a\\x33\\x91\\xcd\\x6e\\x89\\xb9\\x4a\\x79\\x07\\x3b\\x03\\x58\\x07\\xd7\\xb4\\x62\\x79\\x3a\\xdd\\x8e\\x0d\\xcb\\xfa\\x05\\xec\\xaf\\x3e\\xca\\xd4\\x78\\x52\\x71\\x46\\x81\\x2d\\xf1\\x5f\\xcc\\xdf\\x06\\xc4\\x6a\\xd5\\x38\\x35\\xa6\\xac\\x31\\x14\\xfc\\xda\\x66\\xc1\\x84\\x80\\x9c\\x5f\\x4c\\x2e\\xfd\\xa8\\x9e\\x93\\x2f\\x1a\\x92\\xb4\\x1a\\x0b\\x57\\x18\\x45\\x33\\x0a\\x15\\xd5\\x2f\\x80\\x3b\\xe8\\xcf\\x24\\x68\\xd0\\xc7\\x69\\x84\\x7c\\x46\\x62\\x42\\xe8\\xe2\\x00\\xbf\\xd0\\x90\\x12\\x7d\\x2d\\x1b\\x96\\x67\\x4d\\xf6\\x62\\x6f\\x8f\\x27\\xe6\\x16\\xa3\\xe3\\x98\\x89\\x18\\x76\\xf8\\xfc\\x17\\xe2\\x59\\x46\\x19\\x49\\xb4\\x00\\xc6\\xdd\\xdc\\x3c\\x3d\\x86\\x2d\\x92\\xae\\x11\\x56\\x69\\x68\\xf9\\x3a\\xcd\\x23\\x09\\x14\\x6c\\xc2\\xf2\\x72\\x07\\x35\\x81\\xcb\\xef\\xf5\\x48\\x3b\\xdd\\x79\\x16\\x2c\\xf3\\x72\\x03\\x2c\\x60\\x9e\\x7b\\x1d\\xf7\\x81\\xeb\\x3e\\x0b\\x80\\x6f\\x06\\x64\\x1f\\x85\\x6f\\x3b\\x6e\\x06\\x67\\x1e\\xc6\\x92\\xc3\\xb2\\x85\\xc0\\x4f\\xe2\\xb2\\x03\\xaf\\x6a\\x75\\x8a\\xb4\\x0c\\x57\\xb8\\xd4\\x98\\xe5\\x5c\\x7e\\xa3\\xaa\\x80\\xb3\\x2a\\x8c\\x6f\\xb2\\xa0\\xf1\\x15\\x99\\x7d\\x89\\x96\\x5e\\x04\\x30\\x92\\x17\\x01\\xef\\xa4\\x89\\x99\\x2b\\x42\\x24\\x72\\x34\\xf0\\xb7\\xc8\\xe8\\x22\\x62\\x66\\x9d\\x32\\x17\\xd9\\x39\\x65\\x01\\x5a\\x83\\xbd\\x08\\x14\\x04\\xe0\\xb8\\x64\\x2a\\x4f\\xc0\\xd3\\xe9\\x8b\\x60\\x36\\xa2\\xbf\\xbc\\x93\\xa4\\x89\\xe8\\xdc\\x1e\\x98\\x5a\\x68\\x3d\\xea\\x12\\x24\\x21\\xd9\\x0a\\xa3\\x4e\\xc8\\x42\\x08\\x87\\xf4\\xdc\\x1b\\x60\\x9a\\xb2\\x97\\x32\\xfb\\xed\\x48\\xbd\\x19\\xe9\\xc0\\x49\\x33\\xe4\\x99\\xd9\\x11\\x80\\x19\\xa0\\x21\\x7e\\x89\\xd6\\x22\\x2d\\x91\\xf7\\xee\\xdb\\xe6\\xda\\xff\\x8b\\x58\\x8c\\x0f\\x02\\xe5\\x27\\xc9\\x12\\x96\\x13\\x67\\x50\\xe4\\x04\\xa4\\xda\\x1f\\x61\\xaf\\xc9\\x0d\\x8e\\xcb\\x4f\\xd8\\xf0\\xfc\\xb7\\xef\\x14\\x06\\xbc\\xb9\\x49\\x70\\x0e\\x33\\x85\\x17\\x21\\xe1\\x75\\x1a\\x25\\x85\\x3e\\x8d\\xed\\xef\\x16\\xcd\\x78\\x7f\\xfc\\x2a\\xd0\\xc2\\x4d\\x3a\\x2d\\x34\\x0f\\x79\\x98\\xa5\\x71\\xfc\\xc7\\xcd\\x8d\\x7e\\xfc\\x13\\x0e\\x85\\xb1\\xdc\\x9d\\xcb\\x74\\xbe\\x03\\xfa\\x1c\\xb6\\xb8\\x48\\xe6\\xb0\\x98\\x57\\x40\\xc8\\xcb\\x09\\xb7\\x3e\\x6c\\xd4\\x4e\\xf3\\x3b\\xc1\\x65\\x9e\\xc6\\x40\\x21\\x76\\x58\\x91\\x6e\\xfc\\x3e\\x23\\x51\\x71\\x9f\\xad\\x61\\xbf\\x46\\x09\\x3c\\x6c\\x00\\x6c\\x45\\xc9\\x12\\x9e\\x2e\\xd3\\x6c\\x2e\\x80\\x8a\\x92\\xcb\\xc3\\x3a\\xd1\\x7a\\x93\\x66\\x45\\x90\\xc0\\xba\\x8e\\xe4\\x92\\x66\\x30\\x74\\xf8\\x3f\\x1e\\xea\\x73\\x18\\x88\\x48\\x9e\\xff\\x72\\x06\\x43\\x78\\x15\\x70\\x80\\xd9\\xdd\\xc5\\xcd\\x4d\\xda\\x15\\x86\\xd0\\x03\\x66\\x58\\x2d\\xf2\\xab\\x60\\x02\\x74\\xe9\\x16\\xa6\\x72\\x13\\x2c\\xc5\\x1f\\x00\\x6d\\x76\\xea\\xf9\\x4f\\xdb\\x57\\x29\\xb0\\xa7\\x61\\x02\\x75\\x9a\\x7c\\xfb\\x13\\x20\\x26\\x2f\\x11\\xa8\\x65\\xd1\\xf6\\x97\\x2c\\x48\\x72\\x00\\x7c\\x6b\\x20\\x32\\x9a\\x3d\\x00\\xa8\\x74\\x25\\x32\\x94\\x73\\xd9\\x6c\\x0a\\xb5\\x61\\x1d\\x33\\x82\\x5e\\x08\\xb2\\x20\\xef\\xd7\\x69\\x99\\xe0\\x28\\x9f\\x53\\xad\\x6f\\x70\\xfa\\xf4\\xd9\\x9e\\x56\\x2d\\x7b\\x88\\xa3\\x16\\x85\\x97\\xa8\\x0f\\x2f\\xe1\\x85\\x55\\x3d\\x81\\x54\\x98\\xc0\\x2a\\xf1\\x97\\x74\\x63\\xd0\\x8a\\xdf\\x19\\x34\\x92\\x96\\xdb\\xec\\x6d\\x9a\\x6e\\x34\\x87\\xef\\xd1\\x22\\x12\\x06\\x61\\xf7\\xa3\\xc9\\xbc\\x8d\\xfb\\x93\\x81\\xdf\\x97\\xba\\x03\\x43\\x02\\xf9\\x73\\x53\\x84\\x68\\x21\\xb4\\xf3\\x50\\xca\\x6b\\x3b\\x96\\x00\\xf0\\x0d\\xcf\\x83\\x99\\xed\\x11\\x28\\x97\\xcf\\xf8\\x5d\\xe7\\xa9\\xeb\\x49\\x1a\\x9a\\x90\\xf1\\x60\\xd2\\xf7\\xbd\\x01\\xb4\\xf6\\x2e\\xf0\\xcf\\x82\\x62\\xd5\\x0d\\xc2\\x34\\x6f\\x90\\x7e\\x45\\xbb\\xc0\\x9b\\x40\\x96\\xf0\\xde\\xe8\\x22\\x79\\x94\\x34\\xa9\\x45\\xa3\\x88\\x05\\xb0\\x9e\\x72\\x09\\xc0\\x69\\x40\\xd9\\x79\\x83\\x5e\\x62\\xf7\\x86\\x06\\x89\\x7d\\x4f\\x66\\xb7\\x9d\\xb9\\xbc\\x2b\\xf3\\xd0\\xa1\\xba\\xed\\x1e\\x30\\xac\\x03\\x93\\x09\\x29\\x1a\\xa2\\x69\\xca\\x4f\\xdd\\xed\\x0d\\x6d\\xdb\\x31\\xa8\\x9a\\xb4\\x68\\xc8\\x2d\\x83\\xa2\\x25\\xb2\\x45\\x58\\x0f\\x78\\x16\\x20\\x60\\x12\\x22\\xe5\\x1a\\x14\\x13\\x49\\x56\\xac\\xb8\\x2b\\x71\\x7c\\x37\\xe7\\x6e\\xc1\\xae\\xd2\\x48\\xd2\\x9f\\xdd\\x98\\xbb\\x00\\x8b\\xfd\\x03\\x92\\xc5\\xa4\\x55\\x11\\x62\\x7d\\x6c\\xb0\\xbb\\x02\\x92\\x39\\x47\\xb2\\xd9\\xf6\\x2f\\xe1\\x70\\x23\\xbe\\xbd\\x28\\x58\\x50\\xd8\\xbe\\xce\\xd2\\xe2\\xb1\\xc2\\xe2\\x00\\x05\\x64\\x2e\\xd7\\xc9\\xe3\\xfe\\x24\\xf1\\x38\\xfc\\xe0\\x9e\\x42\\xcc\\xeb\\xe2\\x8b\\xcd\\x1e\\xe3\\x16\\x8b\\x5c\\x2b\\xf5\\x22\\x98\\x87\\x1e\\xa4\\x0f\\x9e\\xe2\\xa7\\xd4\\x1f\\x3e\\x34\\x93\\x2c\\x78\\xf5\\x60\\x11\\x20\\x43\\x74\\x50\\x2b\\xf5\\x80\\xe6\\x34\\xc3\\xc3\\x65\\x0d\\x1f\\x3d\\x72\\xb0\\x7d\\xfb\\x56\\xc9\\x59\\x2b\\xf2\\x92\\x6b\\xdd\\x15\\xec\\x37\\x2b\\xf9\\x92\\xfa\\x70\\x0a\\x5d\\x73\\xb1\\x67\\x28\\xb7\\x94\\xe9\\x05\\xa6\\xf7\\xc7\\xa8\\x2a\\x2b\\x60\\xab\\x0d\\x7c\\x24\\x8a\\xfa\\x63\\x01\\xef\\x82\\xde\\x05\\x90\\xb6\\xdd\\x47\\x63\\xe0\\xac\\x84\\x63\\x0d\\x5c\\x98\\x19\\xe1\\x16\\x9e\\x70\\x0a\\xc0\\x82\\x43\\x47\\x78\\x29\\xc3\\x99\\x5a\\x03\\x79\\x8b\\x1b\\x61\\x88\\x74\\x25\\x8a\\x66\\xe0\\x8f\\x87\\x6f\\xa6\\x8a\\xe5\\x63\\x2b\\x1c\\xef\\xaf\\x70\\xf8\\x1f\\xad\\x70\\x2c\\x57\\x38\\xd6\\x2b\\x1c\\xca\\x15\\x6e\\xe4\\x59\\x14\\x93\\x25\\xa6\\xc7\\x90\\x16\\xc0\\xbf\\x4b\\xdb\\x87\\x77\\xd8\\xb1\\xd7\\xf4\\x17\\xa9\\xbf\\xe5\\x25\\x71\\x46\\x80\\x17\\xbb\\x4b\\xca\\x61\\x9b\\xb9\\x75\\x0b\\xad\\x0d\\x92\\xb7\\x47\\xa9\\xd7\\x81\\x88\\x30\\x98\\x1e\\x3d\\xef\\x44\\x7a\\xc3\\x3b\\xd6\\xb3\\x00\\x2a\\x82\\xd1\\xb2\\x12\\x30\\x70\\xf8\\x37\\x81\\x0d\\x33\\x5c\\x1f\\x1e\\x78\\x33\\xda\\x58\\x7c\\x6c\\x26\\x17\\x7a\\x26\\xe3\\x6a\\x26\\x83\\xe6\\x4c\\x5e\\x7e\\xda\\x4c\\x2e\\xe4\\x4c\\x2e\\x5a\\x33\\xd5\\x9e\\xed\\xbc\\x35\\xd3\\x72\\x0e\\xd7\\x45\\x6b\\xfe\\x7c\\x5d\\x57\\x6b\\xce\\x56\\xd5\\x78\\x24\\x82\\xc7\\x9d\\xf4\\xd8\\xee\\x0d\\x06\\x8f\\x01\\x11\\x65\\x6e\\xd1\\x7b\\xd4\\x47\\xd1\\x7f\\xe6\\x89\\xde\\xb0\\x5f\\x29\\x07\\x4b\\xbe\\x41\\xc1\\x8d\\xf3\\x47\\x00\\x24\\x21\\x3c\\x66\\xb6\\xf3\\x45\\x00\\xd9\\xe0\\x11\\x8e\\xd1\\xd7\\x81\\xde\\x98\\xf3\\xc2\\x3a\\xe9\\xc2\\xa1\\x7a\\xf8\\xe8\\xe1\\xd0\\x29\\xbd\\x41\\xf7\\xd1\\xc9\\x93\\xc1\\xc9\\x53\\x38\\x38\\x5e\\xf7\\xe1\\x57\\x4f\\x1f\\x9d\\x0c\\x1e\\x3a\\x11\\x90\\xe1\\x85\\xe5\\x75\\xbf\\x7a\\xfc\\xd5\\xf0\\xf1\\x63\\x07\\x38\\xa2\\xee\\xd3\\x27\\x8f\\xfb\\x83\\xfe\\x53\\x27\\x73\\xbb\\xfd\\x87\\x83\\x47\\x8f\\x1e\\xab\\x4c\\xdd\\x3e\\x3c\\x3f\\x3c\\x79\\x08\\x55\\x75\\x87\\xfd\\x87\\xfd\\xe1\\xa3\\xaf\\x20\\xcf\\x00\\x3e\\x3f\\x19\\x0e\\x1f\\x0d\\x21\\x97\\x31\\xb2\\x65\\x7b\\xa5\\x10\\xdb\\xa8\\x9d\\x23\\x41\\x39\\xcc\\xe2\\x10\\x16\\xbf\\xb0\\x9d\\xd7\\x81\\x5a\\xf0\\x77\\x00\\xa1\\x0b\\xa7\\x70\\x85\\x23\\x90\\xfe\\xd2\\x3b\\xad\\xdf\\xeb\\x33\\xfc\\x67\\x02\\xfe\\x4d\\x13\\x57\\x40\\x87\\x1e\\x3f\\xfd\\xea\\xa4\\x7f\\xf2\\x70\\x92\\x38\\xf0\\x1f\\x9c\\x7c\\xef\\x61\\x6f\\xf8\\x95\\xdd\\x7b\\xd2\\x7d\\xf2\\xf4\\x49\\xff\\xe4\\x89\\xa1\\xca\\x6b\\x15\\xed\\xf7\\x9f\\x3e\\x7d\\xf4\\x78\\x42\\x5d\\xd8\\xa4\\xd7\\xd0\\xef\\x41\\xef\\xc4\\xf6\\x75\\x41\\x27\\x71\\xb1\\x26\\x43\\xa9\\x57\\xdc\\x0d\\x92\\x60\\x92\\xfa\\x27\\xfd\\x87\\x63\\x9e\\x4c\\x06\\xc3\\xee\\x57\\x80\\x2b\\x7c\\x9c\\xa0\\x47\\x4e\\xa3\\xf6\\x61\\xf7\\xa1\\xed\\xe1\\x67\\x73\\xc6\\xd6\\x1f\\xdb\\xdb\\x6b\\xbd\\xb7\\x33\\xfe\\x3f\\xff\\xa3\\x36\\xf7\\x12\\x1e\\x9b\\xbb\\xfb\\x7f\\xfe\\xe7\\x53\\xb6\\xf7\\x5a\\x6e\\x6f\\x6c\\xd3\\xdc\\xa6\\x1a\\x15\\xac\\x0b\\x16\\x2a\\x54\\xb0\\xde\\xdf\\xb5\\xbb\\xa2\\x25\\x02\\xc6\\x3c\\xe3\\x31\\x6c\\x5a\\xf8\\xfb\\xf4\\x18\\xe6\\x81\\xc1\\xbf\\x63\\x73\\xb9\\xce\\xcc\\x22\\x54\\xde\\xed\\x74\\x0c\\x25\\xa3\\x99\\x3c\\x78\\x0c\\x48\\xa1\\xd3\\xef\\xb8\\x34\\x67\\xeb\\x60\\x6b\\xe1\\xd2\\x03\\x39\\x74\\x0e\\x64\\x59\\xb2\\xb4\\xe0\\x84\\x48\\x6a\\x60\\x0d\\x00\\x02\\x1b\\x6b\\x25\\x1a\\xea\\xc2\\xe6\\xf1\\x42\\x81\\x81\\x92\\x57\\xf4\\x81\\x27\\xec\\x13\\xe9\\xcc\\x7b\\xd6\\x34\\xf0\\xde\\x03\\xe7\\xfb\\x6f\\xcb\\xea\\x3a\\xf6\\xbf\\xed\\x5e\\x04\\x78\\x5e\\x84\\x78\\x84\\xf3\\xeb\\x08\\xf9\\x5b\\x38\\x8b\\xd3\\xe1\\x4c\\xc9\\xa4\\x3b\\x0c\\x58\\xd1\\x0c\\xc9\\x9e\\x0f\\x61\\x90\\x8b\\xce\\x2a\\x8f\\x3b\\xbe\\x96\\x78\\x59\\xc0\\x7f\\xe5\\xe2\\xdb\\x38\\x05\\x0c\\x5a\\x22\\x39\\xc4\\x1a\\x1f\\xa0\\x50\\x6f\\xd0\\xef\\x37\\x3f\\x0e\\xe5\\x47\\x7b\\x44\\xd5\\x01\\xf0\\xad\\xaa\\x2b\\xac\\xb7\\xba\\x9a\\xb7\\xaa\\xb8\\x7c\\x80\\x22\\x5a\\xd4\\x65\\x45\\xfc\\x3b\\xc5\\xf7\\xc2\\x2c\\xbc\\x4c\\xaf\\xb5\\x0e\\xd6\\xb6\\x27\\x00\\x0f\\x60\\x75\\x23\\x58\\xdd\\x08\\x57\\x57\\xf1\\x5a\\xc9\\xcd\\x4d\\xe7\\xff\\x74\\x8e\\xe0\\xa1\\x56\\xdf\\x02\\xd9\\x4f\\xd0\\x19\\x80\\x08\\x76\\xed\\x07\\xa4\\xdd\\x2a\\x15\\x2e\\x83\\x49\\x85\\x1c\\xd6\\x43\\x34\\x1b\\x51\\x1b\\x6a\\x62\\xa5\\xdc\\x3a\\x79\\xfa\\xb0\\x7f\\x1c\\xd9\\xe3\\xf1\\x43\\x98\\xd6\\x14\\x7e\\x6e\\x50\\x12\\x33\\xc4\\x8f\\xf0\\x1b\\xe0\\x87\\x00\\x26\\x7a\\xf0\\x08\\xde\\x43\\x1e\\x9e\\x9e\\x3e\\xbc\\x09\\xe1\\x60\\x19\\xd5\\x20\\xc3\\xc5\\x61\\xd1\\x9e\\x00\\xc8\\x7b\\x2a\\xeb\\x82\\x6d\\x14\\x70\\xeb\\xf1\\xa3\\xa1\\x7a\\x7f\\x0a\\x45\\x71\\x3b\\x01\\x78\\x01\\xde\\x0a\\x1a\\x60\\xa1\\x79\\x6c\\x2e\\xf6\\xd7\\x98\\x57\\xbb\\x23\\xe9\\x61\\x51\\x56\\xc8\\x1f\\x41\\x3f\\x36\\xf4\\xb5\\xda\\x59\\xb2\\x28\\x72\\x8c\\x1e\\x76\\xd1\\x4a\\xdd\\x08\\xa8\\xc0\\x4a\\x55\\x0b\\x6c\\x04\\xd2\\x00\\xe1\\x24\\xe8\\x51\\x92\\x0f\\xbf\\x43\\x0f\\xa9\\x15\\x64\\xc6\\x39\\x4f\\xe1\\x44\\x7a\\xc2\\xee\\x05\\xae\\x25\\x80\\x94\\x78\\xec\\xf7\\x6d\\xbf\\xa0\\xcf\\x02\\x29\\x99\\xc0\\x1d\\x22\\x20\\x2a\\xf0\\xe9\\x21\\xcb\\x1c\\x0e\\xa4\\x88\\x8f\\x26\\x28\\x00\\xcc\\x4a\\x1e\\xa2\\x28\\x63\\x00\\x95\\xf7\\xfd\\x4c\\x62\\x43\\xd8\\x0e\\x38\\x80\\xd0\\x18\\xde\\x75\\x35\\xbc\\x84\\x9f\\xe3\\x29\\x01\\x02\\xe6\\x1c\\xd5\\xc9\\x40\\xad\\x9c\\x23\\x0b\\xae\\x58\\x43\\x00\\x6a\\x56\\xf7\\xe1\\x60\\xf8\\x10\\x40\\x34\\x40\\xac\\xee\\xc9\\xa3\\x27\\x8f\\x9e\\x3c\\x1e\\x00\\x30\\xed\\x02\\xb5\\xf5\\xf0\\xe4\\xc9\\x23\\x80\\xa9\\xbd\\x3f\\x02\\xe4\\x70\\x28\\xef\\x70\\x30\\x7c\\xfc\\x64\\xf8\\x15\\xe6\\x7d\\x32\\x78\\x34\\x78\\x34\\x1c\\x62\\xde\\xfe\\x93\\xe1\\x40\\x66\\xfd\\x02\\xb2\\x46\\x32\\x6b\\x7f\\xf0\\xd5\\xc9\\xc9\\x09\\x65\\x1d\\x0c\\xbe\\x1a\\x7c\\x45\\x39\\xbf\\x7a\\x84\\x80\\x6e\\x80\\x59\\xbf\\x0e\\x6a\\xc9\\x45\\x61\\xc1\\x4a\\x22\\xb2\\x79\\xcc\\x00\\x77\\x39\\x56\\xe6\\x95\\x36\\x1b\\xe2\\x53\\xe9\\x35\\x10\\xc4\\x79\\x83\\x5c\\x96\\x2b\\x73\\xca\\x01\\xe3\\x00\\xba\\x9a\\x24\\x3d\\x82\\x9e\\x7e\\x05\\x35\\x01\\x31\\x12\\xbc\\xec\\x11\\x34\\x65\\x08\\x40\\x0d\\xc5\\x74\\x51\\x0b\\x4a\\x8c\\x93\\x55\\xc9\\x81\\x3a\\x5f\\x76\\xb8\\xb1\\xdb\\xf5\\xde\\x03\\x1a\\x7e\\x62\\x82\\xef\\x2e\\x80\\x69\\x00\\x7a\\xa6\\xc6\\xba\\xf8\\x0f\\xf4\\xac\\xa6\\xb4\\xf7\\x59\\x71\\x48\\xdc\\x4b\\x56\\x4a\\xd5\\xe7\\x21\\xf4\\xad\\x0d\\xae\\x8f\\x8f\\x0f\\x34\\x27\\x48\\xd8\\x23\\x50\\x76\\x47\\xe2\\x8a\\x57\\x05\\xd5\\x94\\xa0\\x66\\xca\\xd0\\x31\\xab\\x0d\\x83\\x2d\\xec\\x89\\x16\\x91\\xfc\\x0d\\x81\\x69\\x0f\\x8a\\x32\\x47\\xe8\\x77\\x54\\x1c\\x1f\\xbf\\x2f\\xac\\x10\\x4e\\x77\\x31\\xe6\\xb0\\x4c\\xc7\\xc7\\x27\\x7d\\x20\\x8a\\x6f\\x6e\\x60\\x6d\\x51\\xae\\x24\\x15\\xe8\\x09\\x57\\xc2\\xa3\\x08\\xf7\\x66\\x48\\x32\\xbf\\x7a\\x00\\x88\\x7d\\x1e\\x00\\x2b\\x9e\\x65\\x69\\xa6\\xb3\\x41\\x97\\xd2\\x2e\\xac\\xc2\\x5c\\x7f\\x00\\x64\\x20\\xe2\\x5c\\xb4\\xf3\\x85\\x8a\\x7e\\xe7\\x1f\\x6e\\xe1\\x58\\x02\\xed\\x39\\x8f\\xf2\\x0d\\xd5\\xdf\\xb9\\x14\\xc0\\x7c\\x8b\\x5c\\x24\\x73\\x80\\xb8\\x9b\\x2c\\x5d\\xa2\\x54\\x0a\\x1e\\xb1\\x56\\xf8\\xa1\\x6a\\x3a\\x78\\x74\\xa1\\x68\\x48\\xe2\\xcc\\x3f\\xce\\x5e\\x7e\\x5f\\x14\\x9b\\x37\\xe2\\x5d\\x29\\xf2\\x82\\xc5\\x34\\x4f\\xda\\xc4\\x86\\xd0\\xe3\\x1f\\xdf\\xa4\\xeb\\x20\\x4a\\x54\\x0e\\x80\\x83\\x00\\xdf\\x57\\xcf\\x33\\x41\\x9c\\x72\\x10\\xe7\\x28\\x70\\x0a\\x6f\\x6e\\x8e\\x7a\\x7f\\x5b\\x2b\\xa8\\xc9\\xca\\xed\\x89\\x6f\\x4f\\xfe\\xdd\\xfb\\x77\\xaf\\x27\\xd5\\x65\\x09\\xc2\\x41\\xd5\\x5a\\xa3\\x2e\\x9b\\x75\\xd2\\x84\\xba\\x86\\x55\\x4c\\xc2\\xae\\x7c\\xe3\\xf8\\x40\\x5d\\xe5\\xa5\\x8f\\xcf\\x99\\x08\\xe6\\x3b\\x5c\\x00\\x21\\x19\\x76\\x53\\xba\\x14\\x76\\x29\\xf5\\x1c\\x53\\xc7\\x27\\xc7\\xc7\\x25\\x4a\\x92\\xb0\\x90\\x1e\\x3d\\x3f\\x20\\x18\\xdc\\x13\\x4f\\x26\\x24\\x8b\\x4c\\xbb\\xba\\x90\\x31\\xd5\\x7b\\x02\\xc9\\xe2\\xf6\\x16\\x50\\xc3\\x0a\\x5a\\x15\\x99\\x51\\xb9\\x21\\x10\\x4d\\xb8\\xd6\\xcb\\x9a\\xb8\\x65\\xdf\\x82\\x6e\\x38\\x09\\x50\\xeb\\x64\\x69\\x2d\\x93\\x92\\xed\\xd2\\xc7\\x80\\x74\\x5a\\x50\\x0b\\x8b\\x6c\\x6c\\x6f\\x1d\\xad\\xc5\\x2f\\xb0\\xa7\\x1b\\xc3\\xb9\\x43\\xc1\\x01\\x00\\x96\\x2b\\xb4\\x35\\xc1\\x5f\\x3f\\x91\\xf5\\xc0\\x31\\x85\\x9a\\x60\\x7c\\x1b\\x94\\x18\\x7e\\x7a\\x6d\\xb0\\x29\\xb0\\x74\\x6c\\x96\\x3e\\x54\\x52\\x60\\xbe\\x5b\\x36\\xed\\x00\\x66\\xc5\\xfd\\x97\\xe6\\x45\\x67\\xd6\\x85\\x1d\\xf9\\x22\\x80\\xcd\\xd9\\x90\\x22\\xe2\\xe8\\xf6\\xc1\\x40\\xd4\\xc5\\xad\\xab\\x24\\xc2\\x11\\x83\\x4c\\xda\\x66\\xa7\\x29\\xd9\\x87\\xb3\\x0b\\x80\\x96\\x32\\x37\\xac\\x59\\xd0\\x84\\x08\\x4e\\xe8\\x27\\x43\\x87\\x8c\\x4c\\x18\\x33\\xc4\\x4b\\x04\\x1d\\x60\\xdf\\x6c\\x04\\xd6\\x94\\x90\\x30\\x52\\xad\\x0b\\x6c\\xf9\\x20\\x0c\\xc5\\x86\\x44\\xab\\x01\\xec\\xe5\\xa0\\x2b\\xdf\\x71\\x7d\\x98\\xd3\\x73\\x50\\xcc\\x8e\\xda\\x4f\\xb5\\xad\\xbf\\xa7\\xad\\x51\\x69\\x7d\\x90\\x1e\\x7d\\x10\\xd8\\xfb\\x39\\xac\\x9c\\x05\\xd3\\x7c\\x56\\x2b\\x79\\xa0\\xb9\\x23\\xd4\\xb2\\x40\\x37\\xae\\x60\\xff\\x47\\x73\\x71\\xa6\\x56\\xfd\\xd0\\x37\\xc4\\x67\\xb2\\x08\\x8a\\xec\\xc3\\xe6\\xba\\xc6\\x3a\\xad\\x3c\\x3e\\x26\\x91\\xab\\x3a\\xfb\\x30\\x43\\xf4\\x26\\x01\\x82\\xb9\\x24\\x25\\x6d\\x43\\x84\\x39\\x80\\xec\\xbb\\x35\\x20\\xa9\\x8f\\x02\\x0d\\x12\\x80\\xbe\\xd6\\x0b\\xd3\\xd6\\x02\\x2c\\x1c\\xe1\\xbe\\x08\\x2e\\xd3\\xac\\x38\\xb0\\xa4\\xa1\\x4c\\xb1\\x28\\x1b\\x69\\x49\\x2e\\x23\\xa8\\x03\\x68\\x4a\\x3c\\xfc\\x1d\\x3d\\xc9\\xd9\\x24\\xf2\\x23\\xa2\\xc8\\x9e\\x23\\x6f\\x66\\x20\\xaa\\xe7\\x0d\\x32\\xd7\\xa4\\xa6\\x9a\\xfa\\xbb\\xc4\\xaa\\x95\\xb5\\x52\\xd6\\x6c\\x5a\\x49\\xbe\\x37\\xd0\\x5d\\xd2\\x98\\xaa\\x51\\xad\\xf8\\xeb\\x14\\x62\\x5b\\x20\\x91\\x87\\x36\\x20\\x3a\\x8f\\x6f\\x64\\x87\\x64\\xc3\\x0a\\xa4\\xa8\\x34\\x9e\\x2f\\x71\\x7c\\x05\\xff\\x05\\x7e\\x3c\\x00\\x25\\xe3\\xe1\\xc3\\x89\\x15\\xe5\\xdf\\x46\\x49\\x54\\x08\\xc9\\xbc\\x87\\xb1\\x08\\xb2\\x4a\\xb2\\x0d\\x73\\x59\\x84\\xdc\\x90\\x75\\xbf\\x2b\\x18\\x9a\\x9f\\x25\\x40\\x60\\x23\\xc9\\x09\\xe4\\x1f\\xcb\\x42\\xf8\\x6a\\x4e\\xc4\\xcb\\xba\\xbd\\x6f\\x00\\xd8\\x75\\x13\\x40\\xf1\\x52\\xcb\\x24\\x42\\xfe\\x63\\x30\\x12\\xe1\\xc8\\x4e\\xc6\\x5c\\x84\\x5d\\xd4\\xa9\\xc1\\xcf\\x02\\x9f\\x81\\x24\\xf7\\xf0\\x13\\xd4\\x0e\\xd9\\xe0\\xe9\\x90\\xc9\\xe5\\x2f\\x45\\xcb\\x4c\\xed\\xc7\\x00\\x30\\xe6\\xa0\\xd7\\x1f\\xa1\\x61\\x5a\\x77\\x31\\x29\\x10\\x92\\x74\\xd1\\x66\\x2d\\xf1\\x7f\\x0c\\xe8\\xc7\\x2a\\xba\\xc5\\xa9\\x54\\x11\\xc2\\x13\\x0e\\x1f\\x05\\x21\\x76\\xb7\\xd6\\x24\\xfd\\x1c\\x00\\x3c\\x30\\x8c\\x38\\xde\\x14\\x4d\\x03\\x6c\\xcf\\x4a\\x24\\x2d\\x11\\x8a\\x28\\x96\\x0c\\x6e\\x9c\\xa2\\xad\\x6a\\x8f\\x9e\\x5f\\xbe\\x1a\\xc0\\x64\\x98\\xd2\\xc2\\x6f\\x0a\\x53\\xfd\\x53\\xd1\\x39\\x83\\x3e\\x3b\\x71\\x96\\x81\\xf5\\xd4\\xab\\xcd\\x50\\x3f\\xe4\\xb0\\x6d\\x85\\x5f\\x8c\\x9f\\x4e\\x0e\\x00\\xaa\\xa4\\x27\\x6e\\xfd\\x43\\xdf\\x1d\\x71\\xcb\\xf2\\xdd\\xfa\\x32\\x8d\\x1b\\x0a\\xe8\\xd7\\x8d\\xdd\\x33\\x17\\x61\\xb4\\x46\\x6b\\x23\\x78\\x2e\\x56\\x69\\x99\\x07\\xc9\\x5c\\x2a\\x9a\\x96\\x40\\x15\\x6d\\x80\\xa3\\x62\\x68\\xe2\\x12\\x96\\x59\\x26\\x92\\x70\\x87\\xb2\\x08\\x54\\x2a\\x37\\x51\\x45\\xa5\\x13\\xae\\xf6\\x33\\xe4\\x9b\\x6a\\xd5\\x30\\x4a\\xf1\\x89\\xdb\\x2a\\x91\\xde\\x95\\xfa\\xbb\\xd0\\x0d\\xdc\\xc1\\x18\\xd7\\x36\\xa8\\x69\\xf1\\x01\\x2b\\x3c\\x20\\xed\\xe1\\x00\\x92\\xd5\\x22\\xf0\\x1f\\xe5\\x65\\x2e\\xb9\\xba\\xd2\\xe3\\x01\\x2b\\xdd\\x00\\x52\\x8f\\x2c\\x28\\xcd\\xa1\\xb8\\x3d\\xc6\\x29\\xb2\\xb1\\x81\\x14\\x09\\xf7\\x81\\xfd\\xa5\\xb6\\xed\\x9c\\x8d\\x2a\\x20\\x8c\\xd6\\x8c\\x24\\xaa\\xef\\xfe\\x93\\x46\\xa8\\x23\\xba\\xf5\\x77\\x77\\xa9\\xd9\\x04\\x8f\\x42\\xcd\\xfa\\xa1\\xc9\\x28\\xf0\\x5b\\x00\\x2f\\x1f\\x74\\x60\\x20\\x02\\x58\\x2e\\x78\\x1e\\x77\\x60\\x40\\x62\\x7a\\x82\\xcf\\x5e\\x07\\x46\\x25\\xa6\\x0f\\xf1\\xb9\\x03\\xc4\\x86\\x98\\x3e\\x9a\\xb1\\x9c\\xbb\\x62\\xfa\\x78\\xc6\\x60\\xbf\\x4e\\x9f\\xcc\\xd8\\x0a\\x7e\\x9e\\xce\\xd8\\x12\\x7e\\xbe\\x9a\\xb1\\x0d\\x1c\\x85\\x2b\\x0e\\x99\\xe7\\xf8\\x67\\xcd\\x8f\\x06\\x6c\\xc7\\x8f\\xfa\\x23\\xc5\\x65\\x22\\x33\\xb4\\xe2\\xee\\xca\\x18\\x37\\x1a\\x75\\x5a\\x31\\x34\\xd0\\x47\\x0a\\x16\\xa6\\xbe\\xc3\\xf1\\x21\\xc5\\x63\\x18\\xf3\\x8c\\xc3\\x77\\xe8\\x1c\\x7c\\xb4\\xd9\\x52\\xb1\\xa3\\x49\\xc7\\x5f\\x40\\xa5\\xd0\\x66\\x67\\xd9\\x19\\x5d\\x02\\x45\\xf1\\x56\\x32\\x96\\x5f\\x76\\x7c\\xe8\\x00\\x30\\x9f\\xd0\\xfa\\x97\\x1d\\x4c\\x5f\\x34\\xd2\\x37\\x7b\\xe9\\x59\\x23\\x1d\\xd8\\x52\\xfa\\x4d\\xd5\\xef\\x56\\xfd\\xfe\\xd1\\xf1\\x81\\x9d\\x84\\x5e\\x85\\xd0\\xa9\\x2b\\xec\\x92\\xbb\\x6c\\x71\\xa2\\xb2\\x82\\xb0\\xe3\\xc3\\x70\\x07\\xf2\\x65\\xde\\xf1\\xd7\\xd8\\xcd\\x15\\x6c\\x0c\\xa3\\x91\\x1c\\x3b\\xe1\\x0d\\x64\\xeb\\xb7\\x9d\\x2f\\xea\\x7a\\x91\\x0d\\x86\\xae\\x49\\x26\\x18\\x12\\x8f\\xf8\\xf2\\xe6\\x06\\xed\\x1f\\x68\\xa0\\x1a\\x45\\xe0\\x1c\\xc2\\x2b\\xe7\\xcb\\xc9\\xca\\xdc\\x59\\xb5\\xbc\\x60\\xc0\\x56\\x36\\xc0\\xa5\\x8e\\xc0\\x4c\\x30\\xb3\\x0b\\xfc\\xb5\\x69\\xea\\x0d\\x79\\x43\\x9d\\xbf\\x8f\\xf9\\x61\\x19\\x96\\x3c\\x0d\\x09\\xa8\\x2f\\x81\\x04\\xfc\\xb5\\x20\\xb6\\xeb\\x0c\\xd1\\xd5\\xe2\\xee\\xed\\x34\\x47\\x1a\\x7b\\x7d\\x7c\\x9c\\x7c\\x39\\x50\\x06\\x5c\\x9d\\x8e\\xb2\\xd5\\xea\\x8f\\x81\\x0d\\xef\\x23\\x0a\\x38\\x3e\\xee\\x8f\\x07\\xbd\\x64\\x02\\x20\\xc7\\x4b\\x18\\x6c\\x2b\\xdb\\x87\\x3f\\x88\\xf6\\x27\\x9d\\x8e\\x1f\\x48\\x8d\\xdd\\x46\\x56\\x19\\x22\\xbd\\x87\\x3a\\xa9\\xa0\\x78\\x9d\\x89\\x45\\x84\\x0c\\xec\\xca\\x1e\\x25\\x48\\xd4\\x23\\x90\\xc0\\x8d\\x2b\\xf0\\x85\\xce\\xbd\\x3b\\x97\\x34\\x77\\xe2\\xf0\\x0d\\xe4\\x59\\xca\\xcc\\x58\\xcf\\x96\\x5d\\xb2\\x0b\\x3c\\xad\\xda\\x20\\x4c\\xa9\\xd8\\x65\\x63\\x17\\xb2\\xb1\\x6b\\xbe\\x9b\\xb4\\xb2\\x08\\xe8\\x9c\\x37\\x18\\xf5\\xc7\\xd7\\x13\\x6b\\x0b\\x10\\xf1\\x12\\x8d\\xfa\\x7d\\x7c\\x34\\x36\\x6d\\x9f\\x5d\\xdb\\x90\\x62\\x7e\\xba\\xb6\\x15\\xf9\\xdf\\xce\\x79\\x81\\x39\\x0b\\xd7\\xfc\\x78\\x41\\x46\\x19\\x38\\xb1\\xb0\\x28\\x5b\\x1e\\x59\\x5b\\x06\\xd0\\x5b\\x29\\xf9\\xcf\\xf9\\x95\\x3a\\xe3\\xee\\x56\\x3f\\x5c\\xea\\x07\\xeb\\x0c\\x58\\xe9\\x52\\x3b\\x71\\xb0\\xb7\\x3c\\x1f\\x9f\\x93\\x98\\xeb\\x59\\x96\\x05\\x3b\\xeb\\x9c\\xe7\\xde\\x39\\x54\\x2e\\x21\\x41\\x06\\xd3\\xdc\\xd1\\x4b\\x77\\xa6\\x9a\\x7a\\xeb\\x6e\\xd9\\x5b\\x8d\\x93\\x73\\x4f\\xd7\\xec\\x53\\x07\\x00\\x00\\xf1\\x2b\\x96\\xf0\\xad\\x7b\\xc9\\xac\\xce\\x29\\x1d\\xc4\\x49\\xe9\\x26\\xee\\x5b\\x1f\\x00\\x03\\xbd\\xbd\\x75\\xe1\\xdd\\xef\\xfc\\xad\\xde\\x1a\\x43\\x3d\\x1f\\x8f\\xf9\\xc0\\x76\\xa9\\x80\\x91\\x70\\x6e\\xfb\\x25\\xf6\\x3c\\xf1\\xdf\\xa2\\xa5\\x9d\\x2b\\x4c\\x3d\\xf1\\xaf\\x0d\\x49\\x5b\\x43\\x64\\xf6\\x4f\\x51\\x3b\\x0a\\xe0\\x18\\x11\\x8f\\xee\\xb9\\xbc\\x8c\\x07\\x13\\xc2\\xaf\\xbf\\xfe\\xf2\\xfc\\xb0\\xf5\\x58\\x2d\\x28\\x6c\\xea\\xee\\xbe\\x3d\\xa4\\xed\\xa9\\xd0\\x15\\x5a\\x14\\x00\\x80\\x8c\\x80\\xba\\x1c\\xd4\\xce\\x03\\x5e\\x31\\x2e\\x3c\\x01\\x24\\x4b\\x66\\x6a\\x6f\\x0c\\x79\\xa6\\x85\\x25\\xb1\\xaf\\x61\\x68\\x09\\x0f\\x61\\xdb\\xc0\\x36\\x91\\x6a\\x24\\xb5\\xe2\\x55\\xf6\\x84\\xab\\xcc\\x2e\\x6e\\xeb\\x86\\x65\\x50\\x4a\\x56\\x79\\xda\\xfc\\x87\\x93\\xe6\\x25\\x40\\xd7\\x0e\\xd4\\x65\\x8f\\x07\\x44\\xb0\\x8e\\xb2\\x71\\x3a\\xb2\\x85\\x95\\xda\\x5f\\x46\\x37\\x37\\x81\\xc2\\x2a\\x7a\\xaa\\xdc\\x54\\xc9\\x93\\x60\\x04\\xb4\\x35\\xeb\\x22\\xf7\\x65\\xd5\\x8c\\x45\\xc3\\x9f\\x47\\xce\\x14\\xb2\\x5d\\x61\\xc8\\xff\\x29\\xb4\\xb6\\x1e\\xca\\xc3\\x8b\\x9e\\x1e\\x5c\\x27\\x96\\x5a\\x99\\x12\\xa6\\x2a\\x56\\x0c\\x0a\\x60\\x1b\\xb7\\xb7\\x49\\x77\\x11\\xa7\\xc0\\x26\\x26\\x2c\\x91\\x02\\x09\\x8e\\x72\\x59\\x24\\x27\\x78\\x09\\x0f\\xe9\\x62\\x01\\x34\\x16\\x8f\\x30\\x95\\xf8\\xc6\\x74\\x24\\x01\\x42\\xd2\\x2d\\x81\\xfe\\xfa\\xde\\x34\\x7b\\x09\\x55\\x55\\x21\\x50\\xb9\\xb2\\xaa\\xef\\x91\\x10\\x85\\x37\\xaa\\xee\\x7b\\x54\\x1e\\x20\\x7f\\x20\\xab\\xfc\\x1e\\xb5\\x06\\x98\\x93\\xaa\\x0d\\xcc\\x59\\xfe\\xfe\\x2e\\xf1\\xc5\\xa7\\x0c\\xb6\\x60\\x68\\x59\\x21\\x6c\\xf4\\xde\\x69\\x0f\\xd6\\xb0\\x87\\x2b\\x5a\\xa6\\x86\\xcd\\x37\\xd3\\x20\\x4d\\x89\\x6f\\x81\\xb0\\x08\\x10\\x45\\x20\\x49\\xe1\\xba\\x01\\xba\\x09\\x9c\\x3c\\xa9\\xe4\\x3b\\xcf\\xd3\\xb9\\x78\\x56\\x58\\x81\\x4d\\x9e\\x14\\x9a\\x90\\x20\\x41\\x66\\x88\\xa6\\x42\\x0a\\x4f\\x00\\xab\\x94\\x87\\x53\\x51\\x0b\\x85\\xa0\\x26\\x1b\\x4d\\xc0\\xac\\xd6\\x37\\xc0\\xbf\\x11\\x7f\\x35\\x15\\x2a\\x2d\\x42\\xfb\\x19\\xa2\\xcd\\xcb\\x09\\xa1\\x10\\x2e\\x26\\x40\\x21\\xf8\\x80\\xf5\\xfc\\xd2\\x46\\x6e\\x83\\x9a\\x14\\x68\\xac\\x84\\x34\\x4a\\x65\\x4a\\x76\\xa8\\x2b\\xa9\\x84\\x44\\x00\\x42\\x6f\\xb5\\x7d\\x47\\xc3\\x96\\xf8\\x41\\xd1\\x25\\x71\\x96\\xe1\\x58\\xa2\\x15\\x45\\x1f\\x76\\xfe\\xe0\\x2b\\xc0\\xd5\\x6b\\x1f\\xf0\\xb5\\x3f\\x60\\xdf\\xc3\\xef\\x19\\xfc\\x3b\\x87\\x7f\\x2f\\xe1\\xdf\\x5f\\xc4\\x37\\xdc\\x02\\xf1\\x26\\xd0\\xbc\\x85\\xa1\\x01\\x0a\\xb9\\xd6\\x1c\\xd5\\x5e\\x6e\\x06\\xab\\x36\\x02\\xec\\x0f\\x9c\\x1d\\x99\\x13\\x75\\xbf\\xe7\\xf0\\xef\\xcb\\xc1\\xd0\\x1d\\x0c\\x9d\\xac\\xbb\\x91\\x80\\x37\\xe2\\x72\\xe2\\xb2\\xee\\x5f\\xc0\\xc0\\x85\\xc0\\x58\\xfc\\x53\\xc0\\x62\\xc0\\xb2\\x5b\\xd1\\xe4\\x9f\\xc2\\x0f\\xc3\\x4a\\xda\\xf6\\x0f\\x55\\x35\\x49\\x91\\x49\\xfc\\x16\\x0a\\xfd\\x09\\xec\\x02\\x54\\xbb\\x63\\x7d\\x96\\x75\\xff\\x01\\xb0\\x7b\\xad\\xdb\\xea\\xfc\\x4e\\x4f\\x80\\x85\\x7f\\xa5\\x07\\x7b\\x62\\x1d\\x2a\\x35\\xc0\\xa9\\xda\\xff\\xac\\x4a\\x4f\\xe0\\xf5\\xda\\x7d\\x6c\\x7f\\xf9\\xc4\\x7d\\x02\\xfd\\xfd\\xdd\\x83\\x3a\\x00\\x4f\\x7f\\x03\\x10\\xdf\\x76\\x1f\\xc1\\x67\\x1f\\xd3\\x31\\xe9\\xd7\\x46\\x12\\x96\\x00\\x4a\\x60\\xbf\\xe6\\xac\\xbb\\x86\\x7f\\x73\\xd5\\xe8\\xf7\\x69\\x99\\xe5\\x38\\x2b\\x2e\\xfc\\xf9\\x0b\\x05\\xf5\\x37\\x7d\\x34\\x3a\\x39\\x73\\xe1\\xf5\\x4b\\xa4\\x97\\xb2\\xee\\x39\\xfc\\x7b\\x09\\x84\\x2b\\x8c\\xf9\\xc2\\x4f\\x6f\\xd1\\xb6\\x5a\\xe9\\x23\\x0e\\x70\\x91\\x49\\xc3\\x65\\x44\\x18\\xd2\\xba\\xda\\xb4\\x92\\xa5\\x4a\\x47\\xa1\\x17\\x0b\\xe9\\x4b\\xbd\\x39\\xc2\\x71\\x30\\x22\\xd9\\x40\\x36\\x06\\xde\\x58\\xd6\\x0a\\x48\\x99\\x4c\\xc6\\x8b\\xc6\\x21\\x70\\x5d\\x9b\\xd1\\xd9\\x90\\xb2\\x84\\xb4\\x76\\xd8\\xa2\\xa4\\x88\\x3f\\x9f\\xa6\\xc8\\xd1\\xe7\\xe1\\xa4\\x91\\xe2\\xa7\\x33\\x76\\x04\\x30\\xd3\\x42\\x18\\x9f\\x50\\xef\\xec\\xd3\\x7e\\xd5\\x94\\x44\\xe5\\x72\\x37\\x09\\xb3\\xc1\\x0c\\xca\\xd6\\xb9\\x34\\x2c\\x68\\xb8\\xa1\\x4a\\x50\\x79\\x61\\x9a\\xa2\\x2b\\x08\\x72\\x21\\x49\\x6f\\xed\\x39\\x26\\x6a\\x37\\x3c\\x58\\xe2\\xa4\\x7b\\xcd\\xaf\\x89\\xfc\\x42\\x76\\xa2\\x45\\x5e\\x32\\xe1\\xd2\\x57\\xb5\\xaf\\x81\\x42\\x69\\x98\\x0f\\xc8\\x26\\xb7\\x07\\x9a\\xdc\\x7e\\xac\\xc9\\xcb\\xff\\xa4\\xc9\\x48\\x37\\xf9\\xe2\\x40\\x93\\x2f\\xee\\x6f\\x72\\xcd\\x9f\\xfd\\x27\\x4d\\xa6\\xba\\xc9\\xf3\\x03\\x4d\\x9e\\x7f\\xac\\xc9\\xb7\\xff\\x49\\x93\\x12\\xed\\xd5\\x52\\x60\\xdc\\xc8\\xaf\\xba\\x61\\xad\\x89\\xb3\\x29\\xb9\\xe5\\xc7\\xba\\x57\\x60\\x7b\\x77\\x81\\xf8\\x60\\x81\\x3f\\xee\\x2e\\x90\\x37\\x95\\xe9\\x67\\xd2\\xf1\\x4e\\x0f\\x1b\\x06\\xc3\\x87\\x76\\x9b\\x33\\x69\\x18\\xc7\\x67\\x68\\x09\\x85\\x4e\\xb4\\x9c\\x2c\\xfe\\xb1\\x9a\\x05\\x32\\xc9\\x80\\xb3\\x50\\xba\\x01\\xcc\\x8a\\x7c\\x01\\x66\\x00\\xd8\\x65\\xfc\\xb2\\x81\\x87\\x8d\\xc8\\xa2\\x14\\xb8\\xe6\\x2b\\x4a\\xdd\\xe5\\xc0\\xa5\\x00\\x9c\\x5f\\xa5\\x19\\x02\\x9a\\x1c\\xf8\\x3c\\x98\\xe3\\x34\\x29\\x56\\x39\\x70\\x7b\\x2a\\xe1\\x8c\\xde\\x47\\x05\\xe1\\x6e\\x93\\x6f\\x30\\xe1\\x42\\x1b\\xc9\\x16\\x8a\\x1c\\xaa\\xb1\\x03\\x52\\x14\\x48\\x96\\xed\\x23\\x58\\x65\\xbb\\x6a\\x10\\x05\\xa2\\x8d\\x4b\\x0e\\xd4\\x9f\\xc9\\x3c\\x46\\xa9\\x02\\x7d\\x22\\x0f\\x20\\x70\\x26\\x6a\\x10\\x97\\x55\\x8f\\x40\\xcc\\x01\\xec\\x5b\\x97\\x71\\x11\\x71\\x1a\\x9b\\x7a\\x0e\\x84\\x62\\x97\\x80\\x7b\\x41\\xe7\\x19\\x9b\\x6d\\xf9\\x9f\\x85\\x75\\x85\\xc4\\xff\\x5f\\xf4\\x7b\\x81\\xef\\x00\\x72\\xaf\\xf1\\x1d\\x7e\\xcf\\xf1\\x7d\\x8d\\x34\\xfc\\x5f\\xf4\\xfb\\x02\\xdf\\x77\\x36\\x7b\\x86\\xef\\x3b\\x7b\\xb4\\x39\\x20\\x8a\\x45\\x51\\xc4\\x19\\xb9\\x3a\\xb6\\x34\\xa1\\x68\\x8b\\x2b\\xb1\\xd8\\x2b\\xfe\\x21\\x38\\x24\\x2c\\x99\\x4f\\x93\\x0a\\x31\\xcc\\x6e\\xd9\\xb3\\x43\\x79\\xae\\x9a\\x79\\x2e\\x0f\\xe5\\xd9\\xc9\\x3c\\xb4\\xbc\\x94\\xeb\\xeb\\x43\\xb9\\xd6\\xed\\x5c\\xa1\\x5f\\x58\\x0b\\x1b\\x10\\xf9\\x41\\x11\\xfc\\x0f\\x85\\xa5\\x5a\\x2e\\x68\\x30\\x6c\\x68\\xc3\\xfc\\x7f\\x46\\xde\\xef\\xef\\xcf\\x2b\\x31\\x9c\\xce\\xfc\\xc3\\x27\\x65\\x06\\xf2\\xe0\\xe6\\x66\\x30\\x54\\x65\\xfe\\xb9\\xb3\\xcc\\xc0\\x0d\\x42\\x3c\\x14\\x3f\\x2d\\x08\\xbd\\xa2\\xfa\\x92\\x9d\\x40\\x89\\x97\\xf7\\xb7\\x72\\x16\\xc5\\x71\\x94\\x8b\\x30\\x4d\\xe6\\xb2\\x67\\x58\\x66\\xfd\\x91\\x32\\x72\\x3a\\xdd\\x81\\xea\\xd4\\xd9\\xc7\\x9a\\x48\\xca\\x42\\xd4\\xe3\\xde\\x1c\\x5a\\xa9\\xcd\\xd4\\x6d\\x0c\\x1b\\x38\\xb8\\x21\\x2e\\xd8\\xf9\\xfd\\x75\\x9f\\x1b\\x3d\\xc7\\xba\\x7f\\xbd\\x33\\x3b\\xcc\\x4e\\x0e\\x04\\x7a\\x73\\x82\\xb0\\xc8\\xf5\\x41\\x99\\x5e\\xb5\\x01\\x6f\\xd9\\xef\\xf7\\xd5\\x09\\xf0\\xe6\\x40\\x9d\\x5b\\xd8\\x66\\xc0\\x17\\xff\\xe1\\xa3\\x10\\x83\\xed\\xee\\x1f\\x43\\x45\\x12\\xd9\\x44\\xe4\\xc8\\x1a\\xfe\\xfc\\xf4\\x32\\xe2\\x21\\x94\\x79\\x08\\x65\\xfe\\xf2\\x23\\xc1\\x50\\xfa\\xb4\\x47\\x0a\\xc1\\x47\\x80\\x24\\xcf\\xf1\\x4c\\x66\\x70\\xe6\\x4a\\x38\\x53\\x11\\x9c\\x98\\x14\\xce\\x43\\x00\\x87\\xe1\\x67\\x80\\xe5\\xf8\\xe7\\x7b\\x1f\\x20\\xee\\x0f\\xf8\\xe7\\x1f\\x3f\\x11\\xb0\\x75\\x4a\\x01\\x7b\\xe1\\xc7\\x02\\x56\\x58\\x00\\x04\\xf6\\x73\\x58\\x8e\\x4c\\xc0\\x24\\xff\\x51\\xc0\\xb4\\xfd\\x56\\xc0\\xd4\\x7c\\x51\\xc0\\x60\\x43\\x18\\x69\\x0c\\xc3\\xfc\\xbd\\x80\\x7e\\x7f\\x5d\\x40\\x47\\xfe\\x55\\x50\\x47\\x52\\x71\\x7b\\xc0\\x3d\\xf9\\x87\\x96\\x2d\\x16\\x9a\\x26\\x76\\x3c\\x20\\xed\\x3b\\x40\\x45\\x5b\\x80\\x1a\\x12\\x9f\\xac\\x56\\x18\\xba\\x12\\x37\\xe9\\xf4\\x0c\\xd5\\xff\\x91\\x21\\x6a\\x10\\x5e\\x54\\x09\\x1a\\x0a\\xe0\\xf9\\x81\\x37\\x30\\x1c\\x6d\\xda\\xe6\\x33\\x95\\x1b\\x86\\x35\\xf1\\x3b\\x6e\\x42\\x20\\xb2\\x76\\xc2\\x50\\xd5\\x74\\x6e\\x3a\\xd0\\x3a\\x3a\\x50\\x46\\xa6\\x03\\xe5\\x5f\\xc5\\xbe\\x57\\x35\\x8a\\x73\\xc9\\xb7\\x31\\x69\\xbb\\x53\\x4b\\xe8\\x08\\xdc\\x4c\\x0b\\x40\\xd6\\xde\\x39\\xc6\\x84\\xfc\\x56\\xcb\\x00\\xc2\\x03\\x64\\xc5\\x22\\x6c\\xd1\\x15\\x80\\x60\\x07\\x7b\\x14\\x14\\x11\\x10\\xf7\\xd1\\x11\\x7f\\x7c\\x66\\x2b\\xad\\x16\\x7e\\xfd\\x78\\x0b\\x5f\\xfc\\x77\\x2d\\xfc\\xfe\\xf1\\x16\\xbe\\xfe\\xfc\\x99\\x7a\\xd8\\x6a\\x65\\xf7\\xf1\\x56\\x7e\\xff\\xfc\\x56\\x86\\x7b\\xad\\x7c\\x07\\x6c\\x6d\\x46\\x16\\x45\\xf7\\xb4\\xf4\\xaf\\x96\\x29\\x5a\\xef\\xef\\xa9\\xeb\\xcd\\xfe\\x3d\\xff\\xf0\\xf0\\xf6\\x0b\\xa5\\x08\\xc7\\xe0\\x0f\\x75\\x3b\\x8f\\x6c\\x1b\\xab\\xff\\x8b\\x7b\\x05\\xbd\\x35\\x6a\\xfb\\xae\\x29\\xc4\\xb2\\x92\\xf1\\xe3\\xa7\\x13\\xe4\\x5e\\xfd\\xa1\\x38\\x31\\xb6\\xf2\\x8f\\xff\\xfd\\xf8\\xd6\\xa4\\x6d\\x80\\xbd\\x7f\\xcf\\xe0\\x7e\\xfe\\xef\\x9b\\x99\\x7f\\x7c\\xb1\\x12\\xf1\\xd9\\xad\\x9c\\xb4\\x5a\\xf9\\xe7\\xe3\\xad\\x14\\x9f\\xdf\\x4a\\x7b\\x2c\\xdf\\x7f\\xbc\\x15\\xf1\\xdf\\xb7\\x72\\xf6\\xf1\\x56\\xb2\\xff\\xbe\\x95\\xf3\\x8f\\xb7\\x52\\xfe\\xf7\\xeb\\xf2\\xf2\\xe3\\xad\\x44\\xc2\\x54\\xb2\\x2d\\xa5\\x72\\xf4\\x7d\\x9a\\x88\\x9f\\x48\\xe6\\x86\\x10\\x97\\x17\\xe3\\xbe\\xc4\\x2f\\x6e\\x07\\x40\\xf5\\x32\\x00\\x44\\xd1\\x7b\\xdc\\xbf\\x41\\xcb\\x30\\x7a\\xf9\\xf2\\x71\\x65\\xf0\\x2b\\xdc\\x1f\\xd0\\x32\\x0c\\xb5\\x3d\\x43\\x1b\\x9f\\x4b\\xf5\\x6c\\x70\\x80\\xd5\\xb8\\x56\\x87\\xc6\\xb5\\xfa\\x18\\xb0\\x6e\\x0c\\xa6\\xc9\\xe8\\x89\\x16\\x86\\xd1\\x22\\x89\\xca\\xdd\\xbe\\x90\\x6e\\xf2\\xda\\x29\\xce\\x52\\x2f\\xfb\\xee\\x6c\\xfb\\xee\\xa5\\x90\\x73\\x74\\x84\\xc6\\x94\\x18\\xd8\\xc3\\xc6\\x0f\\x50\\x61\\xa5\\xbe\\xc3\\x2e\\x21\\x7b\\x63\\x30\\x91\\xa2\\xe1\\x3b\\x11\\x8b\\x26\\xce\\x16\\xdd\\x9c\\x27\\x6e\\x81\\xc6\\xd3\\x5e\\x42\\x86\\xd3\\xe5\\x08\\x38\\x15\\x9e\\x00\\x3e\\xb6\\x0a\\xcf\\xc4\\xc2\\xb9\\x0a\\xa1\\x95\\x1c\\x1f\\xcf\\xc3\\xee\\x2a\\xc8\\x7f\\xba\\x4e\\x8c\\x38\\x4a\\x68\\x55\\x61\\x63\\xd2\\x54\\x3e\\xcf\\x5a\\xa1\\x2a\\x16\\xa2\\x65\\x76\\x28\\xa3\\xcb\\x54\\xb6\\x65\\x82\\xb4\\xd9\\x45\\x37\\x8e\\x12\\x71\\x8e\\xbe\\x6c\\x96\\xad\\x23\\xce\\xe0\\x28\\xcb\\x19\\x30\\x4a\\x1b\\xf2\\xc9\\xa2\\xbd\\x84\\x53\\xc0\\xd0\\xc8\\xd4\\x1e\\xc9\\x32\\x2f\\x92\\xb9\\x19\\x7b\\x65\\x25\\x4c\\x75\\x71\\x13\\xb9\\xcb\\x86\\x36\\x69\\xbc\\x5b\\xa6\\x49\\xdd\\x16\\x61\\x7c\\xec\\x26\\x7a\\xe9\\x16\\x28\\xbb\\xae\\x32\\xb5\\x2a\\x5f\\x8a\\x56\\x20\\x34\\x9a\\x17\\xb4\\xc5\\xc7\\x28\\x2f\\xce\\x37\\x41\\x6f\\xe8\\xbe\\x0b\\x7a\\x0f\\x47\\x4a\\xfa\\xef\\x65\\xa8\\x11\\x1d\\x73\\x74\\x1f\\x82\\xae\\x04\\x3c\\x75\\xd0\\xe7\\xb6\\x32\\xe3\\x2f\\x6c\\x16\\xd7\\xfe\\x2f\\xf0\\x96\\xf3\\xc8\\x89\\xd9\\x82\\x97\\x4e\\xe8\\xe6\\x4e\\x95\\x2f\\xb0\\x81\\xa3\\xce\\x9d\\xd4\\xa9\\xf2\\x06\\xf6\\x68\\x17\\x52\\x80\\x03\\xc3\\x46\\x7c\\xc5\\x16\\x36\\xd9\\x5b\\xa2\\xcd\\x24\\xcc\\x71\\x7c\\xab\\x7c\\x58\\x19\\x59\\x7b\\x8e\\xce\\x42\\x39\\x93\\x35\\x6b\\x9b\\xb2\\x00\\x58\\x41\\xfd\\x19\\x78\\x64\\x0e\\xf8\\x2a\\xb5\\x61\\x24\\x50\\x45\\xdd\\x3c\\xb7\\x04\\x0f\\xec\\x7a\\x7c\\xb6\\x36\\x1d\\x95\\x5d\\x01\\x16\\x22\\xd4\\x6b\\x61\\xca\\xf1\\xa4\\x04\\xdc\\xd8\\x94\\x1b\\xf3\\xb4\\x13\\x64\\xe0\\x09\\xad\\x67\\xdd\\x56\\x45\\x60\\x4d\\x33\\xc7\\x9c\\xa7\\xcc\\x31\\xe7\\xa9\\x7a\\x16\\xb6\\xe1\\xed\\x75\\xd5\\x0c\\xf6\\x86\\x2d\\x38\\xe8\\x93\\xe5\\x62\\x23\\x0e\\x7a\\x61\\xc1\\xd3\\x10\\x9f\\x86\\x46\\xa9\\x79\\xa3\\xd4\\x54\\xe5\\x1d\\xa2\\x97\\xd6\\x50\\x96\\x62\\xea\\x49\\x79\\x6e\\x51\\x2a\\x53\\x4f\\xca\\xb3\\x8b\\x52\\x8d\\x4a\\xd7\\xfa\\xd0\\x60\\xf3\\x1c\\x13\\x19\\x66\\xc3\\x47\\x55\\x1f\\x3e\\x9a\\xdd\\xd8\\xb5\\xbb\\x81\\xd5\\x33\\x59\\xb7\\xea\\x80\\x91\\xfb\\xcc\\x98\\xc9\\xda\\x25\\x80\\x0a\\x25\\xd5\\x88\\x93\\x6a\\xc4\\x09\\x1d\\x18\\x4c\\xe9\\x71\\x59\\xa9\\xfc\\x1d\\xe2\\xaf\\x61\\x5d\\x2e\\x6a\\x02\\x64\\x6a\\x6c\\xac\\x44\\x76\\x1a\\x89\\x21\\x74\\x3d\\xc3\\xca\\x8c\\xbe\\x5c\\x36\\xa7\\x1d\\x60\\x32\\x66\\xf5\\x70\\xd0\\xf6\\xe9\\xf3\\xe0\\xf8\\x98\\xbe\\x0c\\xf0\\xcb\\x80\\xbe\\x18\\x36\\xc9\\xc2\\x38\\x43\\x23\\xc3\\xc4\\x83\\x56\\x9d\\x9c\\x5c\\x46\\xd7\\x00\\x84\\xeb\\xad\\x80\\x0a\\x2e\\xc7\\xf0\\x7a\\x61\\xc6\\xb6\\x30\\xad\\x81\\x2b\\xa8\\xe3\\xba\\xdb\\x90\\x5d\\x84\\x2e\\xb7\\x12\\xef\\x22\\xb4\\x7b\\xf0\\x76\\x8d\\x6f\\x85\\x77\\x2d\\xdf\\xce\\xf1\\x4d\\x78\\xe7\\xf4\\x66\\x98\\xdd\\xee\\x9d\\xf5\\xd2\\xec\\x67\\x54\\xf7\\xb3\\xa4\\x7e\\xc2\\x49\\x8f\\x1a\\xdd\\x0c\\xf4\\xbb\\xea\\x68\\x58\\x1f\\x99\\xb2\\x3a\\xf7\\x72\\x7e\\xeb\\x15\\xb4\\x62\\x2e\\x9c\\xd0\\xcb\\x1c\\x38\\x6e\\xb1\\x8b\\xa6\\x0b\\x4e\\xea\\x15\\x4e\\xa8\\xde\\x0a\\x27\\xf0\\x84\\x03\\x07\\x34\\x86\\x95\\x70\\x52\\x57\\x38\\x81\\x9b\\x41\\xea\\xe8\\x12\\x06\\x11\\xb3\\xb7\\xf8\\xd7\\xb1\\x0a\\x97\\x4e\\xb1\\xcd\\x5e\\xc8\\x77\\xe1\\xd2\\xf9\\xb5\\xd9\\x33\\xf9\\x0e\\x5c\\x58\\xc6\\xd1\\x80\\xe4\\x5a\\x28\\x13\\xdb\\x1a\\x50\\x8c\\xde\\xed\\x01\\x09\\x8a\\x1e\\x50\\x56\\x23\\x4f\\xeb\\x91\\x47\\x72\\x85\\xa0\\xb1\\x7a\\xe4\\x25\\xa2\\x6c\\x03\\x52\\x95\\xb6\\x3e\\xde\\xf8\\x16\\xd9\\xec\\x5d\\x0d\\x6e\\xea\\xf6\\x0d\\x1b\\x65\\x9c\\xf7\\x2a\\xcf\\x85\\xa1\\xf5\\x7c\\x71\\x27\\xf4\\x3d\\xbc\\x73\\x10\\xf6\\xb6\\x56\\x44\\xdc\\xb5\\x22\\x04\\x89\\x01\\xea\\x7a\\x91\\x13\\x10\\x14\\x4e\\x61\\x0d\\x42\\x80\\xc4\\xb0\\x12\\x5e\\xe9\\xa4\\x6c\\x65\\x1c\\xb3\\x18\\x16\\x23\\x77\\x72\\x77\\xe1\\x2c\\xd0\\xdc\\x01\\x96\\xc8\\x2d\\x61\\x21\\x22\\x28\\xb0\\x41\\xc3\\x0a\\x2f\\x41\\xb9\\x41\\x6f\\xc5\\xae\\x78\\x03\\x3a\\x2f\\xed\\xd1\\x2b\\x58\\x81\\x0d\\x80\\xf8\\xe7\\xf4\\x9b\\xb3\\xf7\\xf4\\xbb\\x60\\xb8\\x7e\\x57\\xb4\\x7e\\x57\\x6a\\x7d\\xf4\\xfa\\xc1\\x7b\\xe9\\x5a\\x65\\xb5\\x7e\\xf0\\x0e\\x28\\x3a\\xd2\\xeb\\x27\\x83\\x3b\\xb4\\x00\\xfd\\xfe\\x1a\\x12\\xa0\\x87\\x75\\x62\\xa8\\xb8\\x34\\x56\\x20\\xad\\xa6\\xcf\\x40\\x4b\\x81\\x5c\\x56\\xd8\\x23\\xf5\\xf4\\xa5\\x68\\x0f\\x1f\\xd6\\xd3\\x97\\xb6\\x70\\x80\\xd1\\x17\\xac\\xff\\x4e\\x6c\\x60\\x26\\xbe\\x15\\xcc\\x5c\\x68\\xc3\\x1a\\x5c\\xec\\xc5\\x83\\x31\\x0d\\xc1\\x51\\x3b\\x8e\\xef\\xac\\x20\\x77\\x5a\\x86\\xf6\\x47\\x75\\xd8\\x19\\xe9\\x74\\x4c\\xf2\\x58\\xfd\\x64\\x09\\xf5\\xd8\\x30\\x1c\\x35\\xea\\xd3\\x59\\x65\\xb5\\x02\\x63\\x97\\xe8\\x0f\\x75\\x03\\x0d\\x15\\xfc\\xab\\x3a\\xfc\\x8a\\x19\\x94\\xf0\\x79\\xa5\\xa6\\xaa\\x22\\xdb\\x49\\x03\\x2f\\xa9\\x71\\x4f\\x0e\\x1b\\xc6\\x2e\\xac\\x23\\xcb\\xaa\\x09\\x46\\x6f\\x60\\x9f\\xf2\\xbe\\x6d\\x84\\xa0\\x20\\xca\\x07\\x7e\\x0a\\xaa\\xe5\\x52\\x4e\\x07\\x1c\\xca\\x06\\xd5\\xa4\\x29\\xc6\\x00\\x88\\xd9\\x62\\x1c\\xa0\\xce\\xd7\\x2e\\x15\\xed\\x84\\xda\\xda\\x69\\x30\\xb3\\xab\\xd1\\x8c\\x4c\\x9b\\xf4\\xd2\\xa0\\xa4\\x94\\xb2\\x5c\\x5c\\x3f\\x78\\x27\\xc8\\x28\\x96\\x2c\\x44\\xd1\\x32\\x36\\x36\\xbe\\xe2\\xb7\\x90\\x1d\\x01\\xad\\x14\\x76\\x53\\x80\\x3c\\xca\\x14\\x2d\\xac\\x14\\xbb\\x68\\x58\\xab\\xf3\\x67\\x55\\x2d\\x03\\xa3\\x96\\xac\\xaa\\xa5\\x4f\\x4a\\xf6\\xc3\\xb5\\xdc\\x92\\x65\\x6a\\x8e\\xd6\\xa4\\x70\\x46\\xdf\\x0b\\x84\\x20\\xef\\x05\\x6d\\x3f\\xcd\\x50\\x7c\\x30\\x06\\x8e\\x96\\x66\\xd0\\x44\\xaa\\x49\\xbe\\x58\\xcd\\x43\\x0a\\x83\\xef\\x0a\\x1e\\xf2\\xa3\\xb0\\x9a\\xa7\\x9c\\x2d\\xe0\\x58\\x47\\x30\\x25\\xa3\\x51\\x5d\\xc9\\x92\\xaf\\xe0\\x14\\x1f\\xf5\\x47\\xcb\\xee\\xd5\\x08\\xa3\\x77\\x58\\x4b\\xbe\\xec\\x26\\x18\\xc4\\x53\\x6b\\x82\\x47\\x39\\x7c\\x79\\xcf\\x9a\\xb3\\x3f\\x4f\\x71\\x1d\\xa1\\x10\\xa4\\xa5\\xf0\\x17\\x2d\\xcb\\xba\\x82\\x16\\x77\\x63\\x9b\\x3d\\x8c\\x79\\xde\\xee\\x5d\\xb5\\x4a\\x0b\\x9e\\xeb\\x55\\x5a\\xd0\\x2a\\x91\\x02\\x31\\x83\\x6a\\xb7\\x50\\x5b\\x02\\x7f\\x07\\xb0\\xaf\\x46\\xd4\\x23\\x52\\x2e\\xca\\xea\\x3f\\x60\\x87\\x36\\xdd\\xf7\\xc6\\x16\\xc8\\xab\\xbd\\x34\\x0a\\x80\\x00\\x1d\\x79\\xde\\x3d\\xcd\\xdc\\x36\\x9a\\xd9\\xc0\\x5f\\xaf\\x6a\\x67\\x73\\x8b\\x7f\\x53\\x26\\xc7\\x0c\\x33\\xb3\\xb9\\xbd\\x5e\\x45\\xc0\\x4f\\x1c\\xc1\\x58\\xed\\x91\\xb9\\x75\\xcc\\x70\\x79\\x42\\x6d\\xec\\x7a\\x57\\x9b\\x61\\x26\\x61\\xfb\\x72\\xe4\\xdf\\x70\\x63\\xc3\\x0c\\x64\\xc8\\x19\\x95\\xdd\\x84\\xe3\\x2e\\xcd\\x60\\x87\\x76\\x37\\x18\\x9a\\x85\\x8b\\x91\\xfe\\xd8\\x57\\x1f\\x8d\\x26\\xde\\x19\\x1a\\x61\\x32\\xef\\x41\\x3b\\x2b\\x7a\\x78\\x0f\\xb4\\x8d\\x0c\\x89\\x84\\x21\\x48\\xf0\\x41\\xf0\\x4c\\x3e\\x5c\\xa1\\x2d\\xa1\\x8c\\xc3\\xa4\\x42\\x16\\x91\\xba\\xde\\x30\\xb8\\x35\\x6a\\x6d\\x73\\x65\\x84\\x08\\x0d\\x55\\xa2\\xc1\\x4f\\x95\\xf4\\x82\\xa1\\x6f\\xa5\\x19\\x27\\x34\\x88\\x13\\x8b\\x76\\xd8\\x72\\xce\\x8b\\x56\\xa4\\x3c\\x83\\x49\\x29\\x65\\x48\\x93\\xb9\\xca\\x69\\x40\\x1c\\x43\\x25\\x68\\x7f\\xd8\\x29\\x48\\x19\\xb0\\xb9\\xb9\\xf1\\x4c\\x35\\x60\\x9d\\x29\\x55\\x99\\x5a\\x0c\\x4c\\xae\\xda\\x95\\xa7\\x6b\\x0a\\x2f\\x2a\\x64\\x46\\xd5\\x8b\\xed\\x3d\\xbd\\x58\\x58\\xa4\\x1d\\xae\\xdb\\x06\\x04\\x37\\x35\\x08\\xc1\\x15\\xa4\\xe7\\xd6\\x95\\x0c\\x46\\xc1\\xe8\\x17\\x6d\\x10\\xb7\\x75\\x4f\\x46\\xda\\xd6\\x78\\xdb\\x45\\xe3\\xe8\\x84\\xf8\\xfb\\xb3\\xee\\x65\\xb9\\x58\\x88\\xcc\\x22\\x5b\\x52\\x7d\\x36\\x60\\xef\\x40\\x37\\x53\\xd4\\x81\\x6d\\x64\\x77\\xaf\\xb0\\x3d\\x82\\x19\\x19\\x9e\\xcb\\xc1\\x31\\xa2\\x7f\\x8e\\x1d\\x95\\xa6\\x82\\x06\\xab\\x07\\xdb\\x37\\xe5\\x52\\xd5\\x9f\\x8d\\xfb\\x72\\xe7\\x5d\\xde\\xdc\\x58\\x51\\x8b\\xfb\\x63\\x97\\x1c\\xa1\\x4f\\xd4\\xe2\\x3e\\x53\\xe4\\x08\\xf5\\xca\\x59\\xb8\\x4d\\x53\\x79\\x5a\\xc8\\xa8\\x72\\x14\\x99\\x7b\\x5e\\x1e\\x9d\\xf1\\xe0\\xf8\\x78\\x78\\x5c\\x54\\x91\\x44\\x85\\xec\\xba\\x11\\x7d\\x74\\x15\\x2d\\x0a\\x8b\\xec\\x23\\x75\\x8e\\x45\\x14\\x17\\x30\\xea\\x5f\\x84\\xf2\\xcd\\x5f\\xb2\\x0d\\xbb\\x62\\x73\\x4e\\x66\\x46\\x6b\\x5e\\x6a\\x14\\x54\\xf1\\xbd\\x36\\xdb\\xf1\\x0f\\xd4\\x29\\x3f\\x65\\x55\\x8f\\xfd\\x90\\xa9\\xee\\xf8\\x31\\x33\\x87\\x67\\xea\\x11\\xf4\\xbe\\xc8\\xd9\\xae\\x1e\\x2b\\x5f\\xa8\\x37\\x44\\xc6\\x40\\x9e\\x20\\xa6\\xda\\xe0\\x8a\\xb2\\x9a\\xfd\\x3d\\x54\\x49\\xda\\xa8\\x24\\x34\\x2a\\x89\\xa1\\x12\\x54\\x5d\\x8a\\x0c\\x58\\xe5\\xa5\\x5a\\x6e\\xfe\\xad\\xb0\\xd6\\x6c\\x03\\xe0\\xa4\\x72\\x2e\\xb9\\x67\\x2d\\x00\\x83\\x2e\\xd9\\x37\\x88\\x78\\x04\\x1c\\x37\\xdb\\xc7\\x00\\x09\\x9f\\xba\\x74\\x4c\\x28\\x7f\\x06\\xfc\\x33\\x80\\xe2\\xcc\\x58\\x2a\\x28\\x01\\x55\\x45\\x0d\\xd6\\x1e\\x2b\\x19\\x20\\x0d\\xa7\\xc0\\x00\\xcb\\x37\\x2b\\x91\\x09\\x73\\xd0\\x7b\\xed\\x7e\\x7a\\x8b\\xac\\xd9\\xd8\\x2d\\xf0\\xc9\\xfc\\x8d\\x20\\xa5\\x6e\\x61\\x9d\\xc9\\xc6\\x35\\x1e\\xde\\x19\\x90\\xed\\x17\\x71\\x20\\x2e\\xf6\\xd8\\x90\\x34\\x61\\x25\\x95\\x9b\\xda\\x54\\x4b\\x81\\x3e\\xd4\\x5b\\xc2\\xe8\\x7f\\xa1\\x0c\\xaa\\x20\\x1f\\x2a\\xef\\x68\\xf7\\x34\\x2d\\xd4\\x54\\x40\\xe7\\x29\\xbc\\x60\\x16\\xbd\\x99\\x2e\\x99\\x3c\\x96\\x66\\x65\\x2a\\xc0\\x5e\\xa5\\x03\\xc1\\x1d\\xa3\\x63\\xf0\\xde\\xb2\\x4c\\xa0\\x02\\xa6\\xd9\\xb8\\xee\\x3c\\x92\\x63\\xd4\\x4c\\xd1\\x3c\\x19\\x45\\x7d\\x32\\x4c\\xfc\\xf1\\x4d\\x83\\xa7\\xb4\\x28\\x8e\\xd5\\x16\\x8f\\x20\\x06\\xa8\\x40\\x5e\\xf2\\x4d\\xe0\\x3d\\x0f\\x7c\\xf8\\xab\\x62\\xac\\x90\\x9c\\x5d\\xe7\\x28\\x1a\\x39\\x8a\\x26\\x14\\x7b\\x2d\\x8c\\x60\\x69\\xe4\\x61\\xaa\\xfd\\x4c\\xe1\\xef\\xbd\\x53\\x99\\x34\\x56\\xbe\\xe0\\x83\\xbd\\xf9\\x8c\\x58\\x2a\\xab\\x06\\xe6\\x6f\\xdc\\xc7\\x00\\x2e\\xde\\x3b\\x74\\xec\\x05\\x0e\\x38\\xf2\\x00\\x3f\\xc0\\x6f\\x08\\x5f\\x90\\x09\\x46\\x01\\xa9\\x02\\xb5\\x28\\x76\\xc9\\xdc\\xd4\\xee\\x0d\\xa1\\x0c\\x86\\x72\\x79\\x83\\x51\\x95\\x54\\x6a\\x89\\x14\\x69\\x62\\x6c\\xaa\\x66\\x2f\\x74\\xb6\\x40\\x66\\x93\\x2f\\x11\\x11\\xc7\\xe8\\x56\\x52\\x1e\\x71\\x0e\\x1c\\x78\\x38\\xe6\\xef\\x30\\x66\\x13\\xb4\\x2f\\xbc\\x52\\x72\\xe5\\xf0\\x04\\x1c\\xcf\\x73\\x68\\x8a\\x7a\\x17\\xa8\\xaf\\x91\\xc7\\x03\\xfa\\x9a\\xf1\\x5f\\x89\\xce\\x44\\x23\\xab\\xff\\xac\\x3b\\x32\\x78\\x85\\x1e\\x25\\x87\\x5e\\x71\\x62\\x23\\x82\\x7a\\x93\\xed\\xcd\\xae\\xac\\x14\\xd0\\x27\\xae\\xc6\\x2d\\x23\\x2c\\x71\\xc0\\x77\\x74\\xe8\\x15\\x0d\\xf3\\x5f\\x03\\x6b\\x57\\x96\\x61\\x46\\x64\\x19\\xaf\\xd6\\xdb\\xc1\\x60\\x53\\x7b\\x0c\\xf3\\x5f\\xb1\\x66\\x96\\x65\\xb0\\x81\\xc0\\x5d\\xd5\\x8c\\x10\\xd0\\xd8\\x8e\\x21\\x6a\\xf2\\xaa\\xe7\\x0c\\xf2\\x95\\xa6\\x1c\\xcf\\x36\\x19\\x4b\\xbb\\x67\\x95\\x0e\\xb0\\x90\\x68\\x3e\\x5f\\xb8\\x59\\x23\\x5a\\xce\\x3f\\xed\\x9e\\xd6\\xa1\\xbd\\x12\\x1b\\x28\\x1e\\xe7\\x0d\\x4c\\x9d\\x9a\\x32\\xdc\\x3b\\xc8\\x3e\\xab\\xd7\\xbe\\xf9\\xd2\\x4c\\x82\\xb7\\x7e\\xe3\\xcd\\x6b\\x94\\x33\\xdf\\xbc\\x56\\xaa\\xd7\\x2c\\x2b\\xdb\\x1c\\x69\\xc3\\xb5\\x86\\x30\\x07\\x66\\x4d\\xf3\\x34\\xf8\\xf1\\x14\\x3f\\xaa\\x3d\\x3e\\xc2\\xae\\x47\\xbd\\x61\\x5d\\x4f\\x74\\x67\\xd7\\x31\\x45\\xa1\\x4d\\x4d\\x1c\\x21\\x86\\x6b\\x1d\\xd3\\x6f\\x1b\\x82\\xdc\\x8a\\x03\\xc2\\xa0\\x78\\x7c\\x6a\\x2c\\x0a\\xf3\\x0c\\xd9\\x21\\x83\\x5c\\x11\\x50\\x96\\x29\\x50\\xbc\\x3b\\xf2\\x8e\\x13\\x2d\\xce\\xc8\\x30\\x15\\x24\\xfb\\x40\\x24\\xbf\\x3f\\xc8\\xa8\\x78\\x05\\xd0\\xc4\\x40\\xe6\\xc6\\x06\\x05\\x92\\x57\\x94\\xfb\\x82\\xc7\\xd8\\x85\\x15\\x5f\\xe0\\xcf\\x92\\x23\\xdd\\xac\\xa4\\xa1\\x80\\x33\\xab\\xfe\\x2c\\x6d\\xcd\\xf4\\x63\\x87\\xe0\\x6d\\xce\\x07\\xc8\\x5d\\xcc\\x81\\x7d\\xc0\\xa8\\x65\\x73\\x3a\\x12\\x50\\xd7\\x5c\\x12\\x2d\\x6b\\x39\\xb2\\x1d\\x8d\\x4c\\xd7\\x77\\x56\\xd7\\xb7\\x43\\x64\\x51\\xd5\\xb7\\x43\\x9c\\xb1\\xf6\\x56\\xec\\x82\\x5f\\x56\\x52\\xe5\\x6b\\x7e\\xe1\\x5c\\xb2\\x73\\x7e\\x3d\\x86\\xa5\\x7b\\xcb\\x37\\xce\\x19\\xf6\\x7c\\x5f\\x3a\\xfc\\xd6\\xb9\\xa8\\x37\\xe9\\x35\\xf4\\xd3\\xd9\\xba\\x6f\\x6b\\x06\\xff\\x1a\\x69\\x93\\xc8\\xe5\\xe7\\x93\\x4b\\xf7\\xc2\\x79\\x19\\x00\\xfc\\x3f\\xff\\x7b\\x35\\xe6\\xe2\\xef\\x35\\xfc\\x91\\x73\\xf4\\x82\\xcf\\x85\\xb5\\x11\\x68\\x82\\x43\\xa2\\x5c\\x7b\\x74\\x26\\xac\\x17\\x12\\xcd\\x3f\\xc3\\xb4\\x92\\xbd\\xa0\\x6f\\xcf\\xb4\\x15\\x91\\x75\\xfe\\x37\\xf5\\xd4\\x1b\\xf8\\x03\\xdb\\x29\\x0a\\xeb\\x19\\x49\\x22\\x81\\x2a\\x7b\\x75\\x73\\x83\\x01\\xf9\\x5e\\x61\\x38\\x3b\\x98\\x82\\x9b\\x9b\\x17\\xb8\\xfe\\x64\\x8d\\x0c\\x9d\\xf8\\xbb\\x1a\\x9f\\x7d\\x8b\\xec\\xf1\\xdc\\x75\\x6d\\xe9\\xfd\\xb2\\xe2\\x6b\\x9c\\x70\\x98\\xe6\\x2d\\x5b\\xf0\\x44\\x87\\x32\\xb3\\x00\\xd8\\x8f\\xa3\\x9b\\x1b\\xfc\\x8b\\x8e\\x22\\xbb\\xd0\\xfe\\x7b\\x70\\x9c\\x1a\\x26\\xda\\xa2\\x6d\\x3f\\x6d\\xc8\\x2c\\x0d\\x29\\x91\\x29\\x75\\x1e\\x47\\xb7\\x4d\\x3b\\x33\\x69\\x5e\\x1d\\x01\\xd3\\x1a\\xb3\\xfc\\x5e\\x5c\\x11\\x23\\xaf\\x39\\x80\\xed\\xb4\\x8f\\x24\\x80\\xeb\\x94\\x35\\x2d\\x91\\xda\\x82\\x37\\xa0\\x95\\x81\\x20\\xc0\\xcf\\xb0\\x5d\\xd2\\xc9\\x15\\x3a\\x67\\xd0\\xab\\x7f\\x35\\x81\\x07\\xd7\\xea\\x8f\\x17\\xea\\x9c\\xd9\\xf8\\x95\\xe2\\x71\\x1c\\x09\\x72\\x6d\\x0a\\xf9\\x95\\x8d\\xe2\\x8a\\x06\\x55\\x7e\\x24\\x7d\\x81\\x96\\x3c\\x03\\x00\\xbe\\xb1\\x99\\x94\\x18\\xa0\\x3f\\x0e\\x3c\\x6c\\xe0\\x01\\xa7\\x79\\x43\\xa2\\xe9\\xe7\\x01\\xdb\\x90\\x60\\x1a\\x1e\\xb0\\x17\\xf8\\x95\\xbe\\xe0\\x76\\xa0\\x8a\\xec\\x1c\\x4e\\xcd\\x15\\xa2\\x2b\\xb3\\x0d\\xac\\x7b\\x43\\xbe\\x06\\xea\\x0c\\x2f\\xe9\\x5c\\x50\\x41\\xbf\\x6e\\x79\\x3f\\xd5\\x44\\x1e\\x08\\xe8\\x97\\x15\\xac\\x01\\xec\\x03\\x63\\x4a\\xff\\xbe\\x92\\xb3\\xb3\\x1e\\xcd\\x8f\\x61\\x41\\x8f\\xac\\xb5\\x6c\\x0a\\xe5\\x04\\xe8\\x54\\x8e\\xdd\\x49\\xdb\\xdd\\xd1\\xed\\xac\\x15\\xf3\\xb1\\xd6\\xcc\\x47\\x9d\\x30\\x50\\x09\\x83\\xd9\\x5e\\x37\\x7c\\xeb\\x53\\xb2\\xdd\\x81\\xea\\xda\\x4d\\x02\\x21\\x73\\x74\\x75\\x73\\x03\\x43\\xa1\\x59\\xdf\\xd8\\x78\\x39\\x8d\\xcc\\x5a\\x4f\\x2e\\x0c\\x7c\\x03\\xa0\\xe8\\x0a\\xa0\\xd5\\xfc\\x20\\x36\\x0c\\xf5\\xa2\\x6a\\x84\\x28\\xe9\\xd3\\xbb\\xf0\\x61\\x7e\\x63\\xc5\\x80\\xe6\\xed\\xd3\\xd3\\x81\\x89\\x17\\xb3\\xa6\\xd6\\x8f\\x0e\\x2d\\xc0\\x4f\\xe9\\x47\\x9c\\xf2\\xe9\\x80\\xf5\\x11\\x64\\x06\\x78\\x76\\x51\\x62\\x85\\x5d\\x12\\x80\\xbc\\x03\\x94\\xd3\\x04\\xd8\\xdb\\x9c\\x87\\x5e\\xec\\xc4\\xb4\\xe3\\x72\\x7d\\x1d\\x07\\x0a\\xc8\\x46\\x12\\x2a\\x46\\x4e\\xd8\\xcb\\x01\\x2c\\x7a\\x91\\x13\\xc3\\xc3\\x12\\x6b\\x42\\x61\\x23\\x6c\\xed\\x1d\\x3e\\x2d\\x10\\x20\\xee\\xb0\\xce\\x95\\x3d\\x5a\\xe3\\xee\\xbb\\x92\\xb0\\x61\\xce\\x97\\xc0\\xe4\\x5c\\xe1\\x97\\x39\\x32\\x36\\xf0\\x34\\xc7\\xa7\\x33\\xbe\\x76\\xd6\\xde\\xce\\xb1\\x28\\x69\\x83\\x01\\xe4\\xa8\\x71\\x38\\x04\\x67\\x4a\\x24\\xb6\\x35\\x64\\xb1\\x44\\x46\\xef\\xb0\\xac\\xe5\\xad\\xbd\\xad\\xdd\\xdb\\x51\\x76\\x68\\xe9\\x12\\xf7\\xdf\\x25\\xdf\\xc2\\x93\\xcd\\x8e\\x84\\xb6\\xe2\\xbf\\xa4\\xd6\\x2f\\x00\\x6c\\x12\\xe4\\x3d\\x97\\xca\\x99\\xb7\\x12\\xb5\\xbc\\x20\\xfd\\xcc\\xe8\\x7a\\x7c\\x0e\\x07\\xe4\\x82\\x5f\\x43\\xae\\x73\\xc8\\x72\\xa1\\x41\\xdc\\xb9\\x77\\xcd\\x5e\\x21\\x35\\xf7\\x4c\\x51\\x71\\xec\\x39\\x7f\\x45\\x40\\xe7\\x19\\x75\\x12\\xa0\\xd9\\xdb\\xf1\\x0b\\x2a\\xfb\\x16\\xea\\x7c\\x01\\x15\\x5e\\x00\\x4b\\x33\\x79\\x35\\x79\\xeb\\xbe\\x18\\xf7\\xff\\xbe\\x84\\xda\\x4f\\x11\\xa9\\x5e\\x22\\x52\\xbd\\x26\\x3a\\xf0\\xad\\xff\\xc2\\xf6\\xdf\\x9e\\x72\\x4c\\x83\\x3d\\x83\\x39\\xf8\\x0b\\xff\\x19\\x40\\xf3\\xbf\\xad\\x6b\\xfc\\xdc\\xa7\\xcf\\x80\\x6f\\xf9\\xb9\\x9a\\x80\\xf7\\xd5\\x88\\x5d\\x39\\x62\\x6d\\x2f\\x29\\xac\\xf7\\x38\\xea\\xe9\\x25\\x83\\x61\\xbf\\xb7\\x67\\xe6\\x5e\\x28\\x4d\\x79\\x45\\x3a\\x49\\xfc\\x77\\x40\\x3c\\x23\\xd5\\xab\\x4a\\x7b\\xd9\\xb8\\x98\\x94\\x37\\x7c\\xe0\\x17\\x63\\xf2\\x91\\xbf\\xe1\\x43\\xc0\\xae\\xd9\\x58\\xe0\\xd7\\x87\\xbe\\xd0\\x5f\\x9f\\xc2\\x16\\xba\\x6d\\xe9\\x40\\x12\\xd2\\x7f\\x8c\\xd1\\x8d\\x15\\xa9\\x49\\x24\\x15\\x90\\xec\\xc5\\xfd\\xf7\\xd8\\xf9\\xa6\\x0e\\x7b\\xf2\\x52\\x4a\\xfc\\x43\\x38\\xc1\\x53\\xa0\\x4b\\x92\\x99\\x3f\\x45\\x8a\\x23\\x81\\x3f\\x26\\xf2\\xff\\xe9\\x3e\\x29\\x4c\\x7d\\x63\\x48\\xd9\\x85\\xad\\x0a\\x7f\\x2f\\xa1\\xad\\xb4\\xbb\\x25\\xc1\\xdf\\x0e\\xb6\\x6c\\xd0\\x45\\xdc\\x10\\xc0\\xf3\\x8a\\xa3\\x83\\xe7\\x00\\x76\\x63\\xee\\x85\\xb0\\x13\\x17\\x1e\\x6d\\x65\\x20\\x60\\xe0\\x75\\x83\\xd0\\x05\\x3a\\x6d\\xcb\\x08\\xa7\\x3d\\x38\\x92\\xe4\\x40\\x08\\x2f\\xab\\x71\\xa4\\x85\\x7d\\x4b\\x44\\x28\\x00\\xd1\\x22\\xbb\\x32\\xe7\\xdf\\xa0\\x4c\\x81\\x1c\\xa8\\x96\\x3a\\x57\\x34\\x96\\x5e\\xa9\\x11\\xe1\\xab\\x88\\x0b\\x5d\\x7f\\x1f\\x6a\\xda\\xaf\\xff\\x70\\xc9\\x76\\xfd\\x87\\x7b\\x41\\xf5\\x17\\x5e\\xcc\\xae\\xda\\xfd\\xbf\\x82\\xfa\\xaf\\x3e\\xa1\\xff\\x57\\x1f\\xef\\x7f\\xa6\\xeb\\x37\\xfb\\x5f\\xd7\\x7f\\x7f\\xff\\xaf\\xee\\xed\\xbf\\x5a\\xd0\\x15\\x39\\x38\\xc3\\x12\\xf2\\x0f\\x5b\\x3f\\x74\\x57\\xce\\x86\\xed\\xfc\\x18\\x7e\\xaf\\x6e\\x6d\\x36\\x18\\x2f\\x29\\xf1\\x52\\x26\\x2e\\x55\\xe2\\x92\\x12\\xcb\\x5b\\xfa\\x5f\\x6d\\x90\\x28\\x0e\\x46\\x72\\x21\\x11\\x7c\\x4d\\xf5\\x93\\xc1\\x53\\x42\\x47\\xae\\x04\\x3e\\xab\\xef\\x9f\\xf8\\xfa\\xab\\xa8\\xbe\\x0e\\xfd\\x81\\xfc\\x8a\\xea\\xca\\xea\\xeb\\xc0\\x07\\x8c\\x0c\\xbf\\x27\\xfe\\xb0\\xe5\\xbd\\x50\\x35\\x90\\x5a\\x28\\x9d\\x45\\x16\\xb4\\xe5\\x6c\\x60\\x4a\\xf9\\x06\\xc8\\x55\\xe1\\x39\\xac\\xfd\\x9d\\xc4\\x11\\x5a\\xd3\\x0b\\x2f\\xf3\\xfb\\xe4\\x23\\x55\\x69\\x94\\xfd\\x01\\xbd\\x57\\xd4\\xb7\\x3f\\x54\\xef\\x4a\\x91\\xea\\x57\\xfa\\xe8\\xbd\\x88\\xbd\\x81\\x31\\x0d\\x61\\xd3\\x26\\xa5\\x0f\\x98\\x64\\xae\\xed\\x52\\x2a\\x7a\\xba\\x3f\\x12\\xe3\\x12\\xad\\x2e\\x2a\\x72\\x17\\x4f\\x17\\x1a\\x2c\\xcc\\xd1\\x00\\xa3\\x8e\\x12\\xae\\xb0\\x02\\x50\\xce\\x29\\x8a\\xc9\\xec\\x08\\x5e\\xd3\\x19\\x8b\\x09\\x68\\x65\\x93\\x08\\x7e\\x11\\x4a\\xfc\\x6c\\xc5\\x0c\\x23\\xd9\\xe0\\x0a\\xbb\\x6e\\xe1\\x47\\x32\\xbd\\x4e\\x38\\x85\\x04\\xcf\\xc3\\xc8\\x33\\x91\\x9e\\x88\\x3e\\x86\\x60\\x30\\x85\\x99\\x11\\x06\\xb0\\x62\\xb1\\x9c\\x3f\\x44\\xfa\\x0b\\x19\\x88\\x4c\\x32\\x4b\\x11\\x51\\x02\\x25\\xc5\\xa8\\xb0\\xa1\\xa8\\xb5\\x80\\x17\\x8a\\x78\\x75\\x73\\x93\\x62\\x59\\x68\\xe3\\xef\\x10\\xf7\\xe1\\x3c\\x7d\\x10\\x6b\\x36\\x04\\xa9\\xf0\\x9b\\x9b\\x13\\xfc\\x01\\x00\\x28\\x58\\x3e\\x1e\\x4c\\x32\\xbf\\xb0\\x47\\x52\\xa4\\x0d\\x35\\x5a\\xb9\\x1b\\xba\\x0f\\xed\\x2f\\x1f\\x62\\xa5\\x0b\\xb5\\xa5\\x75\\x79\\xc2\\x88\\x41\\x93\\x4f\\xc9\\xa5\\x58\\x58\\x8d\\xa2\\x1c\\xa3\\x9f\\xb2\\x18\\x53\\x08\\x0e\\x8a\\x9e\\x9e\\x8d\\x79\\x64\\x8a\\x50\\x69\\x4b\\x48\\x39\\xec\\xf1\\x71\\xa0\\x2a\\x6e\\x9a\\xcc\\xa0\\x1c\\xf5\\xb9\\x92\\xb5\\x01\\x76\\x3c\\x3e\\x9e\\x4b\\xd1\\xc9\\x1a\\x65\\x38\\x80\\x8e\\x8e\\xfa\\x80\\x97\\x80\\xb8\\xbc\\xe4\\x17\\xbc\\x71\\x7b\\xdd\\x12\\x45\\x34\\x48\\xda\\x59\\x3b\\x06\\x88\\x71\\x7b\\x7c\\x7c\\x7d\\x7c\\xfc\\xac\\x2b\\xe5\\x32\\x48\\x18\\xca\\x7a\\x9e\\x55\\x02\\x57\\xa0\\xc0\\x74\\x43\\x0b\\x76\\x8d\\xfd\\x39\\x20\\x34\\xde\\x28\\x4d\\x6b\\xed\\xf6\\xed\\xfd\\x12\\xd6\\x8e\\xdf\\xf0\\x9c\\xa0\\xdb\\xe7\\xdd\\xc9\\x85\\xad\\x85\\xcc\\x72\\xdc\\xb8\\x8a\\x30\\xaa\\xb5\\x29\\x85\\x66\\xe7\\x36\\x30\\x41\\x80\\xfd\\x0b\\x60\\x78\\x04\\x0e\\x72\\x80\\x7a\\x38\\x2b\\x68\\xd0\\x5c\\xe6\\x7c\\xd5\\x4c\\x2a\\xe4\\xbb\\xb6\\xcd\\x24\\x4a\\xd1\\x0e\\x80\\x81\\x0f\\x20\\xe4\\x12\\xc0\\xc7\\x05\\xfa\\x22\\xc0\\x73\\x02\\xcf\\xc5\\xed\\xed\\xe8\\x95\\x85\\x7e\\x74\\xd7\\x14\\xdb\\xe5\\x50\\x23\\x59\\x17\\xf1\\x08\\xfe\\xdd\\xd9\\xe6\\xd7\\x4b\\xfa\\x7a\\x09\\x5f\\x99\\x40\\x77\\xd9\\x9a\\x4a\\x7b\\x8b\\xd2\\x44\\xff\\xfe\\x6e\\xcb\\x4c\\xb7\\x97\\x30\\x58\\x74\\xfd\\xbc\\xe6\\x82\\x70\\xe9\\x15\\x9b\\xb3\\x35\\x83\\x65\\x63\\xe4\\x72\\xce\\xae\\xd9\\x39\\x7b\\x0b\\xe4\\x43\\xc0\\x9e\\x49\\x99\\xe1\\x2b\\x6e\\x20\\x45\\xb4\\x05\\x57\\x5c\\x85\\x21\\x08\\x5e\\x55\\x84\\xe4\\xf2\\x4e\\x41\\x70\\xc0\\x9f\\x91\\xd4\\x1e\\x38\\x8d\\x29\\x92\\x3d\\x47\\xfd\\xbb\\xa4\\xbd\\x01\\x90\\x2f\\x57\\xb5\\x34\\x57\\x91\\x6d\\x05\\x0f\\x71\\xc5\\x32\\x22\\x61\\xdf\\x1e\\x1f\\xa3\\x09\\x99\\xf6\\x34\\x1f\\x59\\x30\\x1f\\xa5\\x4d\\xc3\\x6f\\x09\\x4d\\xf7\\xe7\\x24\\x6e\\x08\\x4e\\x03\\x9c\\x24\\x83\\x2f\\x80\\xe3\\xf3\\x1c\\xda\\x04\\x60\\x01\\x40\\x42\\xa6\\x9a\\xa2\\x54\\x24\\x2a\\xe7\\x7c\\x2d\\x89\\xe2\\xca\\x46\\xfd\\xb9\\x79\\x49\\x83\\x61\\x20\\x83\\x40\\x0f\\x18\\xeb\\x13\\xf4\\xc4\\xce\\x24\\x05\\x9c\\x49\\x7d\\x8d\\x3e\\xb5\\xe8\\xce\\x13\\xc4\\x31\\x6c\\x9b\\x4f\\x0a\\x8e\\x94\\x59\\xd2\\x7e\\xc9\\x81\\x5a\\x07\\x4f\\xfb\\xca\\x8c\\x49\\xbd\\xd9\\xfe\\xb4\\xe8\\xbd\\x0b\\x1c\\x4a\\x50\\x0f\\xb3\\x5b\\x66\\xdc\\x76\\xf2\\xd7\\xbe\\x7a\\xbb\\x1d\\xe2\\x84\\x68\\xdb\\xc8\\x1b\\x3a\\xa5\\x69\\xf7\\x64\\xf7\\x4a\\x6d\\x1d\\x65\\x5a\\x32\\x38\\x1c\\x28\\xf7\\xd4\\x6b\\x18\\x3b\\xcc\\x94\\x67\\x93\\x69\\xef\\x80\\xd6\\xf9\\x6e\\xa3\\xba\\x21\\xf0\\x1f\\x03\\x37\\x73\\x2c\\x0c\\x7b\\x9a\\x55\\x01\\xff\\x64\\xeb\\x75\\x6b\\x0f\\xf6\\xf5\\xe7\\x46\\x87\\x53\\x4f\\x0b\\x84\\x1b\\x36\\x43\\x30\\xbf\\xbd\\x12\\xed\\x85\\x60\\x1c\\xd0\\xc7\\x84\\x82\\x95\\xc2\\x78\\x4a\\xbb\\x87\\xcd\\xd9\\xe8\\x1e\\x62\\x28\\xd4\\x7f\\x3b\\x64\\xdd\\xf1\\x4d\\xe8\\xf2\\xd2\\x01\\xd2\\xd4\\x29\\x94\\x5d\\x5b\\x61\\x9a\\x3a\\x8c\\xbe\\xdf\\x33\\x74\\x20\\x09\\xec\\xf7\\xb5\\x81\\x43\\xc1\\x61\\xd1\\x61\\x81\\x4a\\x9e\\xde\\xb2\\xef\\x3f\\xcd\\x4c\\xed\\x0f\\xb5\\x1e\\xaf\\x43\\x0a\\xcf\\xfc\\x3a\\xe4\\x78\\x93\\xd4\\xf8\\x1f\\xe4\\xa9\\xff\\xa1\\x97\\x5f\\x43\\x8a\\xc9\\xf2\\x6b\\xc8\\x31\\x08\\xce\\xf8\\x5b\\x4c\\xf9\\x16\\x5f\\x0c\\x63\\xfa\\x43\\xe3\\x51\\x6a\\xed\\xce\\x59\\x87\\x25\\xac\\x03\\xff\\x15\\x68\\x30\\xd1\\x16\\x4a\\xec\\xe7\\xaa\\x40\\x08\\x17\\xb7\\xed\\x5d\\xa3\\x73\\xbf\\xac\\x73\\x9b\\x0c\\x20\\x1c\\x64\\x3d\\x19\\x26\\x2f\\x50\\x97\\xfb\\xab\\xa3\\x43\\xcb\\x7d\\x2d\\xac\\x87\\x5d\\x0a\\xfb\\x48\\xae\\xe3\\x0a\\xc2\\x24\\xec\\xa0\\x80\\x43\\xd7\\x5a\\xd4\\xec\\x6b\\x76\\x37\\xd4\\xa9\\xe6\\xbd\\xbc\\x13\\xdc\\x54\\x59\\x32\\x56\\xf7\\x58\\xca\\x4e\\xde\\x04\\xf3\\xa8\\xcc\\x0f\\x39\\xfa\\x50\\xa7\\xd1\\xb4\\x07\\xb5\\x0f\\x79\\x19\\x37\\x5a\\x45\\x4f\\xde\\x4a\\xf9\\x2c\\x55\\x51\\xb5\\x27\\x79\\xe5\\x70\\x4e\\x3a\\x8c\\xdb\\x1a\\x8a\\x18\\xe6\\x69\\x5f\\x1b\\x8a\\x98\\xce\\xba\\xcf\\x3a\\x6e\\xe2\\x76\\x02\\xfa\\x2b\\x9f\\x1f\\xf4\\x1f\\x0c\\xd8\\xe0\\x01\\xa6\\xc0\\x59\\xbd\\x3b\\x91\\xd2\\xde\\x1b\\x41\\x29\\x7e\\x57\\x8b\\x87\\x86\\x69\\x09\\x19\\xa4\\x15\\xcc\\x75\\xcf\\x0d\\xfb\\xb3\\x7f\\xed\\xed\\x1f\\x2d\\x31\\x06\\xde\\xa5\\x90\\xb1\\x8e\\x1b\\xe7\\x15\\x4e\\x96\\x1b\\x39\\x91\\x3d\\x42\\x2b\\xa2\\x14\\xad\\xc0\\x30\\x4e\\x3b\\xd9\\x10\\xa5\\x68\\x03\\x86\\x72\\x68\\xb2\\x20\\x4a\\x19\\xb4\\x8e\\x67\\x43\\xf0\\xda\\xf2\\x6b\\xf4\\xc3\\xde\\x51\\x22\\xfa\\xf9\\x87\\xfa\\x28\\x51\\xa9\\x0c\\xcf\\x92\\x79\\x58\\xbe\\xc3\\x7e\\x56\\xb9\\x7e\\x37\\xf6\\xe7\\x8f\\x87\\x4e\\x40\\x6d\\x19\\x8b\\x3c\\x4c\\xd9\\x18\\x01\\x00\\x88\\xc6\\x08\\xb2\\xc6\\x08\\x4a\\xb7\\xa8\\x47\\x90\\x56\\x60\\xe1\\x55\\x9d\\x97\\xac\\xaa\\x54\\x4e\\xb2\\xac\\x3a\\x71\\x68\\xac\\x0a\\x72\\x34\\xac\\xa4\\x0e\\x8c\\x97\\x40\\xc7\\xde\\x78\\x35\\xf4\\x40\\x8f\\xbf\\x4f\\x03\\x1f\\x3f\\xb7\\x25\\x8d\\x4a\\xcb\\x86\\x77\\x2f\\xfc\\x92\\xc2\\xba\\xa4\\x52\\x6e\\x16\\x64\\x21\\x31\\xc3\\x29\\xeb\\xb3\\x97\\x41\\xe3\\x66\\xa7\\x56\\x09\\x8a\\xbc\\xaa\\xfa\\xd5\\xf0\\x12\\x57\\xf9\\xb0\\x57\\x2a\\x5f\\xf3\\x8c\\xd7\\x87\\xd4\\x60\\x5b\\xb0\\x44\\x18\\xa7\\xb9\\x78\\x1d\\xa0\\x1f\\xa0\\xba\\x4d\\x06\\x4e\\x7e\\x7d\\xe6\\x8b\\xfb\\xcf\\xbc\\xa8\\xcf\\x7c\\xf9\\x09\\x67\\x3e\\xfa\\xf8\\x99\\x2f\\x99\\x01\\x4f\\x3e\\x72\\xe6\\x53\\x58\\x9b\\xfa\\xbc\\x5f\\x1e\\x3a\\xb8\\x49\\xb6\\x1f\\x2c\\x43\\xc9\\x89\\x03\\xbc\\x64\\xce\\x6e\\xdd\\xa4\\x55\\xf3\\x71\\x19\\x4e\\x6a\\xd3\\x4a\\xac\\x36\\x37\\xdb\\xb7\\x8d\\x68\\x80\\xda\\x03\\x16\\x6b\\xf7\\x95\\x6d\\x00\\xe9\\x33\\xd2\\x41\\x9e\\xab\\x49\\x00\\xb2\\xe7\\xb0\\x8d\\x47\\x64\\x55\\x9a\\xa3\\x08\\xc5\\x78\\x53\\x41\\xa4\\x58\\xaa\\x9a\\x19\\x95\\x16\\x12\\x90\\x3b\\x45\\x42\\x9e\\xf1\\x14\\x9b\\xdb\\xc2\\xcf\\x00\\x95\\x0c\\x02\\x58\\x06\\xb4\\x77\\x02\\xca\\x13\\x59\\x32\\x20\\x3e\\x23\\x34\\x65\\x0e\\x10\\xc1\\xe8\\x0e\\x42\\xf9\\xd6\\xa5\\x91\\xba\\x53\\x82\\x1d\\xb4\\xb8\\x47\\xdb\\x14\\xb4\\xdd\\xd0\\xd9\\x62\\x78\\xd2\\xcb\\x9a\\xb7\\x9c\\xd4\\x01\\x26\\x03\\xa3\\x96\\xb0\\x15\\xe2\\xcd\\x25\\x3f\\x63\\x1b\\xbe\\x05\\x52\\xee\\x12\\xa8\\xd1\\x0b\\xb6\\xe6\\xd7\\xf5\\x04\\x98\\x0c\\x16\\xc6\\x29\\x34\\x87\\x85\\x86\\x12\\x0b\\x26\\x29\\x66\\xea\\x7b\\xdd\\x20\\x40\\x06\\xb5\\xa3\\x17\\x6c\\xc5\\x94\\x45\\x45\\x9b\\xb0\\xd6\\xbb\\x5c\\x18\\xbb\\x3c\\xab\\x76\\x74\\x7a\\xe7\\x8e\\x6e\\xfb\\x0e\\xa8\\x76\\x95\\x19\\xc4\\xff\\x77\\xd7\\x2e\\x6f\\x7a\\x13\\x34\\x0a\\x65\\x35\\xda\\x39\\x6f\\x49\\xea\\x00\\x48\\x05\\x52\\xcf\\xc0\\x1a\\x43\\x91\\x8b\\xbf\\xe3\\x39\\x20\\x81\\x33\\xbe\\x00\\x24\\xb0\\xe5\\x3b\\x67\\xe7\\x9e\\x49\\xbd\\xcf\\x76\\xfc\\xd0\\x89\\x80\\x63\\xf4\\x3c\\x99\\xf1\\x92\\x07\\xee\\x12\\xd6\\x3b\\x74\\x37\\xb0\\xdc\\xb1\\x7b\\x05\\xc3\\xaf\\x21\\xee\\xa5\\x83\\xca\\x9e\\x0b\\xf7\\xda\\xb9\\x46\\xc6\\xa4\\xbe\\x3a\\xe4\\xba\\xc7\\xcf\\xd1\\x99\\x7c\\x19\\xa0\\xb4\\xf2\\x1a\\xa5\\xb0\\xa7\\xcf\\x83\\x9b\\x1b\\x94\\x8d\\x78\\x2b\\xa9\\xbf\\xce\\xdc\\x15\\x00\\x64\\xdf\\xa0\\xf9\\x2e\\xd8\\x25\\x7a\\x9e\\x27\\xd6\\x0b\\xf6\\x16\\x39\\x96\\x67\\xb8\\xd7\\x9e\\xc3\\x0f\\xec\\xb5\\xf7\\xfc\\x15\\xf4\\xf8\\x1d\\x7f\\x0e\\x3d\\x7e\\xc9\\xcf\\x9c\\xf7\\xde\\xce\\x79\\x37\\xb2\\x5e\\x3a\\x2f\\x7b\\x5b\\x54\\xdc\\x40\\xcd\\xd6\\xce\\x79\\x0f\\xe3\\x78\\x67\\xf7\\xb6\\x1e\\xd0\\x21\\xe3\\xee\\x09\\xf0\\xf2\\xe3\\xc0\\x59\\xba\\xa1\\xb3\\x71\\x63\\x07\\x35\\x1d\\x56\\x73\\x72\\x5e\\xb1\\xe7\\xec\\x05\\xbb\\x84\\xde\\xb2\\x0b\\xfc\\x73\\x4d\\x53\\xc4\\xd6\\x6a\\x33\\x43\\x32\\x5e\\x34\\xa1\\x72\\xd1\\xea\\xb7\\xa7\\xd3\\xbe\\x55\\xd4\\x0f\\xc0\\x3f\\xc3\\xb4\\xf9\\xa4\\x8f\\x62\\x4b\\x80\\x88\\x83\\xc7\\x46\\x90\\x99\\x4c\\x84\\x51\\x1e\\x99\\x37\\x18\\xdf\\x17\\x42\\x35\\xe0\\x28\\x68\\x74\\xa4\\x1c\\x64\\xf0\\x18\\x76\\xaa\\x6f\\x92\\xd7\\x8d\\xf0\\x26\\x45\\x66\\xb8\\x46\\x64\\x56\\xd3\\x42\\x43\\x9b\\x82\\x58\\xd3\\x02\\xef\\x00\\x10\\xf0\\x07\\x61\\xcf\\xa1\\x78\\x6a\\x1a\\x46\\x02\\x34\\xa2\\x4b\\x3f\\x0c\\x28\\x47\\x2d\\xa8\\xab\\x1b\\x33\\x11\\xac\\x4d\\x82\\x30\\xcb\\x4c\\x69\\x56\\x85\\x05\\xf6\\xcd\\x61\\xf0\\x1e\\x41\\xfc\\x66\\x29\\x4b\\x91\\xfb\\x8d\\x24\\x3e\\xa6\\xe8\\xbf\\xbd\\xf3\\xac\\x25\\xad\\xb3\\x76\\xd7\\xe1\\x4a\\x5a\\x26\\x36\\xc6\\x29\\x32\\x6f\\x5d\\x89\\x8c\\x29\\x35\\x02\\xcc\\xd8\\x0d\\xd8\\x7a\\x27\\xd2\\x00\\xc2\\x51\\xea\\xc1\\xd1\\x31\\x86\\x58\\x3d\\xdc\\x1b\\xd2\\x47\\x63\\xe5\\xc2\\x3e\\x94\\x3e\\x20\\xab\\x59\\x4b\\x5d\\x58\\x97\\xd6\\xb6\\x5c\\x52\\x9b\\x1e\\xa2\\x71\\xb8\\x25\\x4b\\xc1\\x23\\x10\\x03\\xc7\\xc7\\xb2\\xb6\\xd7\\xaa\\x7e\\x58\\xe0\\x16\\x11\\xcf\\x9f\\x09\\x2b\\xe5\\x71\\x66\\xad\\x11\\x94\\xd9\\xc0\\x37\\x28\\xeb\\xaa\\x08\\xd8\\xe4\\x79\\x1d\\xd2\\x8a\\x2f\\xa5\\x93\\x0a\\xca\\xea\\x36\\xd2\\x0f\\x64\\xc5\\x4a\\xab\\x45\\x18\\x68\\xb5\\x11\\x1c\\xa8\\xbc\\x7b\\x15\\xc4\\xd1\\x5c\\x6a\\x2b\\x65\\x48\\xdc\\x42\\xdf\\x15\\x53\\x83\\xa0\\xc6\\xa6\\x6c\\xc6\\x3d\\x96\\x82\\xd0\\x83\\xd3\\x81\\x7e\\x4b\\x83\\x47\\x28\\x82\\x7f\\x08\\xdc\\xf0\\x86\\x0f\\xe1\\xf9\\x8a\\x63\\xe4\\xc4\\x3e\\x80\\xfb\\x3e\\x00\\xb0\\x3e\\xc3\\x3b\\x56\\x2f\\xf9\\xcb\\x10\\x80\\xd4\\x0e\\xb5\\x32\\x28\\x10\\x38\\x37\\x23\\x52\\xc3\\xc1\\x53\\x1b\\xf6\\xc0\\x46\\x6f\\x8e\\x00\\x3d\\xa8\\xd0\\xd4\\x0f\\x15\\x4f\\xd6\\x05\\x1e\\x00\\x1b\\x3e\\xe9\\xe4\\x3e\\xcb\\x31\\xec\\x46\\x18\\x47\\x9b\\x67\\xc9\\x32\\xfe\\xc4\\x40\\xc8\\x97\\x55\\x58\\x65\\x0b\\x7a\\xc7\\x5e\\x86\\xb6\\xff\\xbd\\xb0\\xe0\\x19\\x28\\x4e\\xda\\x07\\x25\\x6a\\x10\\xaf\\x75\\xcd\\x2f\\xb6\\x85\\x30\\xa9\\xca\\xfb\\xaa\\x3e\\x27\\x21\\x50\\x32\\x41\\x01\\xb6\\xd2\\x22\\x26\\x52\\x8b\\x48\\xbb\\x40\\x7b\\x0d\\xe1\\x2e\\xf1\\x77\\xb2\\x9d\\x73\\x6c\\x87\\x42\\x18\\x7e\\x5a\\x13\\x74\\x51\\x0e\\x4a\\xfa\\xfc\\x15\\x85\\x5b\\xc2\\xbb\\xba\\xf0\\x62\\xbc\\x4f\\x2b\\xbd\\x84\\xd2\\xa4\\xb3\\xe4\\xae\\x74\\xd4\\xc2\\x8a\\xa6\\x00\\x3c\\x67\\x34\\x5c\\xc8\\xdb\\x08\\x87\\x7d\\x4f\\x4d\\x57\\x24\\x30\\xf9\\xf2\\xe4\\x31\\xc2\\x55\\x0c\\xfc\\x02\\xd5\\xe9\\x37\\x59\\xeb\\x15\\x6e\\xfe\\x39\\xed\\x7c\\xa8\\x3b\\x4b\\x8b\\x4f\\xee\\xe5\\xba\\x51\\xf7\\x59\\xa3\\xee\\x6d\\x65\\x13\\x3a\\x1e\\x4e\\xd0\\x73\\x49\\x25\\xf8\\x7d\\xd5\\xec\\x9a\\x6e\\x55\\xc1\\x3f\\x5b\\xd5\\x76\\x15\\xaf\\x18\\x08\\x41\\x0c\\xa8\\xae\\x60\\x7e\\xc7\\x66\\xfb\\x20\\x04\\x1d\\x19\\x0f\\xc6\\x0b\\x64\\xda\\xa5\\x80\\x47\\x95\\x1b\\x82\\xc0\\x26\\x0d\\x08\\x95\\x9a\\x10\\x8a\\x20\\xf0\\x9e\\x61\\x9e\\x34\\x8f\\xc1\\x81\\x08\\xdc\\x6b\\x26\\xbd\\x19\\x64\\x4d\\x87\\x31\\x66\\xfa\\x87\\x85\\xad\\xc4\\xf1\\xbb\\x60\\x92\\x78\\x2f\\xc9\\x86\\x60\\x9c\\x4c\\x12\\x17\\x1e\\x9b\\x25\\xe2\\xac\\x7d\\x0f\\xcd\\xa4\\xb8\\xb9\\x11\\x13\\x00\\x3b\\x0b\\x12\\x9a\\xad\\x24\\xbb\\x61\\xfb\\xf4\\xea\\x53\\xa2\\xfa\\xe6\\x87\\x06\\x57\\x92\\x67\\x77\\xc6\\xc2\\xd3\\xe7\\x19\\x79\\xde\\x69\\x81\\x7d\\x2a\\x74\\x9f\\x8a\\x49\\x81\\x7d\\x42\\x1b\\x44\\x63\\x86\\x16\\x06\\x56\\xa4\\x7a\\x6b\\x90\\xa0\\x66\\x17\\xbe\\x7a\\x18\\xb7\\xc3\\x90\\x9e\\x67\\x1f\\x95\\xae\\x29\\x9f\\xc2\\xc0\\xd4\\x5f\\xd6\\x9e\\x99\\xea\\x3a\\x25\\xb1\\xe7\\x9b\\x19\\x3b\\x99\\x1b\\x38\\xe5\\x01\\x61\\x57\\xe8\\x44\\x5e\\x0e\\xcc\\x66\\xe0\\x64\\x5e\\xec\\x94\\xe4\\x26\\x97\\x3b\\x11\\xd0\\x2d\\x69\\x53\\x12\\xa7\\x74\\xa5\\x65\\x43\\x2e\\x17\\x35\\x7a\\x95\\x9a\\xad\\x7e\\x92\\x00\\xee\\xbf\\x1b\\x53\\xe4\\x41\\x2f\\x0f\\x8f\\x09\\x68\\x2e\\x1a\\x93\\x9b\\x57\\x63\\xca\\x3c\\x98\\x81\\x96\\xe8\\x6e\\x99\\x1d\\xec\\x4d\\xd2\\xf0\\xfc\\x3a\\x70\\x81\\xb7\\x8a\\xdf\\xa6\\x23\\xb6\\xa6\\x4e\\x31\\x52\\xf1\\xcb\\xf1\\x3a\\x91\\x0d\\x9a\\x90\\x94\\x38\\x3b\\xf4\\x14\\xd9\\xcc\\x4a\\xc7\\xfd\\x49\\x34\\x2e\\xfd\\x72\\x1c\\x11\\x29\\x88\\xdc\\x3e\\x70\\xce\\x78\\x55\\x21\\x4f\\x5c\\x7c\\x46\\xcf\\x62\\xa0\\x1d\\xd1\\x25\\x4e\\xab\\xb2\\x00\\x7d\\xf1\\x72\\x84\\x45\\xf3\\x71\\xe4\\x47\\xe3\\x7c\\x94\\x7b\\x3c\\xac\\xf4\\x05\\x56\\x8c\\x26\\x02\\xc0\\x47\\x79\\x86\\xc3\\x69\\x6e\\x57\\xaf\\xd8\\xf7\\xdc\\x9e\\xd9\\x64\\xff\\x1d\\x13\\xe3\\x66\\xa8\\x46\\x1a\\x23\\x27\\xb3\\x8a\\x11\\xdd\\xf0\\x87\\xaa\\x0c\\x51\\x5f\\x3a\\x82\\x06\\x71\\xa6\\xdb\\x8d\\x85\\xaf\\x43\\x34\\x55\\xf5\\x32\\x3f\\xb3\\xdd\\xa1\\x6c\\xeb\\xf5\\x0f\\xde\\xf3\\xc0\\xfe\\xd2\\xaa\\x5e\\x8d\\xe3\\x7e\\xd5\\xb2\\xe5\\x40\\x30\\x85\\x81\\x28\\xf1\\x2b\\x94\\xc2\\xf8\\x91\\xda\\xa4\\xf6\\x3e\\xc2\\x30\\xa3\\xa0\\x29\\xf5\\xb1\\x6c\\xc2\\x0f\\x73\\x6c\\xf3\\xff\\xcb\\x0d\\x16\\x2c\\x69\\x36\\xb8\\x6e\\x5c\\x93\\xd7\\xcd\\xd3\\x32\\x0b\\x8d\\x5d\\xb6\\x6b\\x26\\x17\\x74\\xb1\\xab\\xe1\\x11\\x9b\\xb5\\x0c\\x2b\\x1b\\xc7\\x22\\x6a\\x6c\\xfb\\xd4\\x34\\xf1\\xd4\\x47\\x46\\xda\\x75\\xc2\\x81\\x29\\x1b\\x4e\\x83\\x31\\x2f\\x1b\\x4e\\x83\\xb9\\xe9\\xec\\x88\\x17\\x4a\\x9b\\xce\\x8e\\x02\\x09\\x1e\\xb5\\x7a\\xc4\\x47\\x19\\xf4\\x7e\\x01\\x9c\\x13\\x86\\xb8\\x71\\x52\\x07\\x9e\\xf1\\xda\\x1b\\x0a\\x96\\x3c\\xe8\\x55\\xa5\\x57\\x68\\x35\\xb3\\x6a\\xc4\\x2e\\x37\\x3d\\x7c\\xa5\\xa8\\x7f\\x65\\x3b\\x4b\\x26\\xea\\x4f\\x2b\\xa8\\x08\\xbe\\x64\\xe8\\x37\\xea\\x16\\x4e\\x8e\\x6e\\x33\\x4e\\x0c\\x4f\\x0b\\xf2\\x7f\\x8c\\xe0\\x29\\x38\\x70\\xba\\xd1\\x8e\\xb7\\xba\\x4f\\x4c\\x7e\\x4a\\x8d\\xcb\\xc5\\x32\\x38\\xf4\\x28\\xaa\\xb7\\x09\\x27\\xee\\x1b\\x1c\\x4d\\x13\\x2c\\x5c\\x50\\xaa\\x5e\\xfc\\x0d\\xde\\x49\\x42\\xf7\\x66\\xa1\\x0b\\x95\\xe1\\x55\\x9c\\x1d\\xf0\\xa4\\x35\\xec\\x47\\xc8\\x4b\\x54\\x7b\\x6c\\x9a\\x7e\\xa4\\x64\\x4b\\xa2\\xee\\xba\\x83\\xa9\\x33\\x3d\\xe7\\x03\\x7b\\xf4\\x67\\xe8\\xde\\xe1\\x43\\x1b\\xf0\\x86\\xa7\\xbc\\xed\\x04\\x2e\\x7c\\xcb\\x00\\xd2\\x09\\x98\\xfc\\x10\\xde\\xd1\\x89\\x38\\x72\\x33\\x7a\\x63\\x52\\x14\\x4a\\xd6\\xc9\\x86\\x1f\\xec\\x5f\\x87\\xfd\\x60\\x0b\\xd8\\x0e\\x88\\x8d\\x0d\\x97\\x56\\xd9\\x75\\x03\\xc0\\x03\\xa8\\xaa\\x4a\\x27\\xb7\\xf8\\x7c\\x40\\x6c\\x58\\xe5\\x30\\x92\\x2f\\x8d\\xd3\\x70\\xb9\\x8f\\xc6\\xcc\\x90\\x7d\\xc6\\xde\\x2e\\x4d\\xef\\x79\\x04\\x80\\xb0\\x7a\\x65\\xe5\\x46\\x1f\\x35\\x55\\x48\\x2c\\x72\\x1a\\xce\\xf3\\xf7\\xe0\\x97\\x66\\x63\\xd2\\xc1\\x5c\\xa9\\x71\\x50\\x9c\\x8a\\x87\\x25\\x6a\\xf8\\x34\\x37\\x56\\xef\\x90\\x4a\\xc8\\x81\\x49\\x06\\x8c\\xc8\\xea\\xf3\\x81\\x41\\xf2\\x9d\\xa8\\x97\\xb5\\x30\\xca\\xc5\\x1d\\x38\\x1c\\xa1\\xb8\\xf7\\x26\\x70\\x9f\\x07\\x63\\x79\\x31\\xb9\\x7c\\x01\\x6a\\x64\\x4c\\xe6\\xfe\\xf4\\x8d\\x9e\\xb4\\xc6\\x39\\x95\\xc7\\x0b\\xaf\\x0c\\x28\\x69\\xf8\\xf6\\x01\\x0d\\x5a\\xe4\\x24\\x2d\\x05\\x1a\\x7e\\x39\\x8c\\xb8\\x0f\\x80\\x38\\xca\\x80\\x86\\xe4\\x68\\xbd\\xeb\\xe2\\x35\\xa6\\xb7\\xb8\\x0c\\x78\\x2d\\xd0\\xc4\\x00\\x1d\\x92\\xf9\\xc7\\xdb\\x0e\\xb2\\x9e\\x69\\x3a\\xde\\xab\\xbe\\x63\\x0f\\x7b\\x18\\xa2\\x19\\xe7\\x32\\x73\\x8c\\x9e\\x23\\x95\\x60\\xf7\\x2a\\x63\\x89\\x68\\x72\\xc0\\xa5\\xb5\\xa9\\x92\\x83\\x0d\\xf9\\x23\\xde\\x72\\xb8\\xbf\\x78\\x77\\x29\\xeb\\x22\\xa6\\x21\\x17\\x8e\\xa5\\x6a\\x3c\\xed\\x65\\x6c\\xd0\\x8b\\x6c\\x1b\\xe6\\x1a\\x57\\x09\\x78\\x10\\x83\\xda\\xbb\\xbe\\x97\\xda\\x8a\\x6a\\xd5\\xa0\\x31\\xdd\\x25\\x4e\\x77\\x64\\x4e\\x77\\x79\\xe7\\x74\\xef\\xcf\\x22\\x80\\xd1\\xc6\\xec\\x59\\x85\\x47\\x34\\x54\\xd6\\x2b\\xdd\\xc4\\xb0\\xf2\\x27\\x37\\x87\\x49\\x90\\xf9\\xf7\\x4f\\x55\\x74\\x9f\\xf6\\x32\\xf2\\x7e\\xc4\\xfb\\x23\\xf7\\xe7\\x90\\x26\\xc2\\x08\\x16\\xd0\\xa6\\xc5\\xab\\x25\\x6d\\xee\\x8d\\x02\\xaf\\xb8\\x35\\x88\\xee\\xb7\\x99\\xe9\\x8b\\x42\\x12\\x0b\\xf2\\x81\\x23\\x06\\x0f\\x21\\x79\\xcd\\xb0\\xc1\\x08\\x85\\xc1\\x60\\xd6\\x84\\x61\\x8b\\x19\\xd4\\x9a\\xae\\x4c\\xf1\\x25\\xc2\\x60\\x4a\\x46\\x15\\xcf\\x4e\\xa6\\x46\\x13\\xb3\\x42\\x52\\xc7\\xdb\\xbe\\xf0\\x13\\x8a\\x59\\xb9\\xcf\\x27\\xea\\x8a\\xcb\\xff\\xaa\\xe2\\x3b\\x58\\x64\\xa9\\x83\\x88\\x0e\\x55\\x4d\\xf1\\x78\\x39\\x17\\xda\\x9d\\x54\\xf9\\x4a\\x28\\x37\\x9b\\x77\\x40\\x9e\\x5a\\x84\\xb5\\xf1\\xce\\x6e\\x6b\\x3a\\x0d\\x91\\xfc\\x0a\\x58\\x88\\x76\\x52\\xc1\\x8c\\xd1\\xbb\\x2b\\xdf\\xdd\\x60\\x36\\xd3\\x1e\\x7b\\x05\\x5d\\xa8\\x47\\x5d\\xab\\x34\\x81\\xcd\\xfe\\xc9\\x7e\\x1b\\xe1\\x07\\x9a\\x6b\\x7c\\xdf\\x0a\\xa3\\x61\\xa3\\xe1\\xcd\\xde\\x20\\x5c\\xd0\\x60\\xab\\x4a\\x7a\\xd5\\x4c\\x1a\\x18\\x49\\xcf\\xb3\\x3b\\xa3\\x09\\x4d\\xfb\\x8c\\x82\\xa6\\x0c\\x61\\x87\\x0c\\x47\\xc5\\xb8\\x1c\\x95\\xae\\x2b\\xf3\\x8e\\xc8\\x13\\xf1\\x67\\x8c\\x65\\x33\\xcd\\xbc\\xe1\\x0c\\x05\\x08\\xf8\\x34\\xa0\\xa7\\x72\\x86\\x8e\\xe5\\x23\\xdb\\xf3\\x32\\x20\\x53\\x33\\xd7\\x9d\\xf1\\xb2\\xc6\\x00\\x32\\xe0\\x51\\xbf\\x11\\x29\\xf6\\x7d\\xb6\\x17\\x52\\x85\\xac\\xd1\\x6e\\x6e\\x2a\\x43\\x34\\xc3\\x23\\xb7\\xc5\\x42\\xca\\xcb\\xae\\xc9\\x75\\xc4\\x31\\x23\\x80\\xc8\\xcb\\xb1\\x0b\\x79\\x21\\x76\\xed\\x5e\\x62\\x38\\xe1\\xee\\xd1\\x72\\x24\\x85\\x88\\xc8\\xd9\\x13\\xaf\\x3f\\xc3\\x32\\xa5\\xba\\x32\\x85\\xee\\x23\\x24\\xe9\\x44\\x4c\\x37\\x91\\x00\\x85\\x46\\x46\\x74\\x14\\xbd\\x01\\x1f\\x62\\xa0\\xc9\\xac\\xc0\\xb1\\x42\\x2f\\xb6\\xbd\\x85\\xba\\x5f\\xaf\\x67\\x2d\\x9c\\x14\\x78\\x99\\x6a\\xef\\x4e\\x4b\\x77\\x05\\xdc\\x0e\\x1a\\x22\\xe6\\xc6\\x98\\x7e\\xc9\\x0e\\x84\\xac\\xa9\\xdd\\x4c\\xb5\\xef\\xdd\\x91\\xbc\\xfc\\x5b\\xd0\\xd4\\x50\\xf3\\x2d\\x1d\\xcf\\x1b\\x24\\x82\\x8a\\x92\\xc4\\x04\\xb6\\x72\\x4a\\x9e\\x2f\\x85\\x74\\x42\\xce\\xa3\\x42\\x3d\\x85\\x51\\x16\\xc6\\xa2\\xe5\\x93\\xfc\\x8d\\xd1\\x07\\x11\\x4b\\xff\\x39\\x58\\x00\\x0c\\x88\\x98\\x19\\x32\\x32\\xac\\x24\\x31\\x39\\xe1\\xd7\\x54\\xee\\x0f\\x82\\x2a\\x3f\\x87\\xfa\\xf6\\x77\\x8c\\xa0\\x12\\x2b\\xa7\\x40\\xe8\\x49\\xd9\\x50\\x85\\xfd\\x6a\\x0e\\x57\\xf5\\x06\\x43\\x70\\xa1\\xc9\\x13\\x06\\xc5\\xde\\xc1\\x96\\xfb\\xb0\\xf5\\x05\\xdb\\xf9\\x19\\x21\\xb9\\xee\\x6b\\x54\\x3e\\x75\\x5f\\xe1\\xa5\\x02\\xc9\\x6c\\x44\\x4d\\x56\\xac\\x57\\xc8\\xa3\\x51\\xa8\\x6a\\xa1\\x30\\x30\\xc2\\xd3\\xaf\\xdd\\x6d\\x15\\x1b\\x26\\xab\\x3f\\x86\\x3b\\xfc\\x3a\\xb2\\x23\\x1e\\x42\\xc5\\x41\\xb7\\x4c\\xa4\\x77\\x20\\x50\\x69\\x50\\x33\\xde\\x46\\x05\\x35\\x36\\x3e\\xff\\x81\\x9f\\x6b\\x5e\\x8f\\xa7\\xa3\\xb8\\xd9\\x60\\x7c\\xa8\\xc1\\xb8\\xdd\\x60\\xca\\x63\\x1c\\x43\\x15\\xbb\\x00\\x5a\\x8b\\x91\\xf6\\x4f\\x47\\xf5\\xb7\\x3f\\xf0\\xdb\\x48\\x45\\x0e\\xa8\\x4c\\x22\\xa9\\xed\\x9c\\x0f\\x46\\x0b\\xe0\\x2c\\x5d\\x37\\xb7\\xd1\\x44\\x32\\x27\\xa3\\xc9\\x69\\x0e\\x1b\\x84\\xfd\\x08\\xc5\\x68\\xad\\xf1\\x2a\\x2d\\x58\\x23\\x16\\xcb\\x1f\\x20\\x91\\x42\\x69\\x63\\x8f\\x25\\x16\\x98\\x55\\xe6\\xe3\\xff\\x82\\x31\\x35\\xb2\\x92\\x4c\\x14\\x08\\xac\\xdf\\x68\\x0e\\x7e\\xc3\\x7e\\x18\\x1e\\x65\\x4d\\x40\\xa1\\x83\\x80\\xa0\\xc3\\x24\\x2d\\xcd\\x0e\\x96\\x06\\x56\\xff\\x62\\x14\\x50\\x38\\x83\\x8c\\x7f\\x9b\\x59\\x01\\x4b\\x6d\\x38\\x37\\x19\\x7a\\x74\\x05\\x30\\x94\\x97\\x23\\x1d\\x4c\\xa0\\x04\\x84\\xf8\\xbd\\xcc\\xc0\\x8e\\xac\\x12\\x33\\xc0\\x71\\x1e\\x7b\\xa8\\xf0\\x29\\x20\\xe7\\x6b\\x8c\\x20\\x62\\x03\\x07\\xae\\xbf\\xe0\\x7b\\xf7\\x15\\xde\\xe6\\x09\\x0f\\xf2\\x86\\x1a\\xf2\\xd8\\x09\\xba\\x6f\\x90\\x5a\\xd6\\x9f\\xb0\\x95\\x37\\x2a\\xb8\\x04\\xed\\x67\\x84\\xeb\\xd0\\xad\\x28\\xc9\\x51\\x2e\\x5e\\xe0\\x55\\x63\\x28\\x52\\x52\\x50\\x1e\\xe1\\xbd\\xda\\xd9\\x7f\\x64\\xf2\\x12\\xcf\\x6f\\x30\\x78\\x17\\x4e\\x07\\x6d\\x66\\x55\\x2e\\x44\\xd5\\x78\\x28\\xa7\\x4d\\x54\\xb3\\x27\\xf3\\xa9\\xf9\\xa6\\x09\\x83\\x1a\\x28\\xd2\\x05\\x3c\\x0a\\xe9\\x4f\\x50\\xd5\\x4f\\x77\\x02\\x87\\x77\\x94\\xb5\\x47\\xb2\\xf9\\x3f\\x32\\xcd\\xcc\\xc7\\x5c\\xe5\\x40\\x4f\\x31\\x34\\x33\\x8f\\xc9\\xcc\\x1c\\x66\\xdb\\xcb\\x29\\xdc\\xf5\\xce\\x5b\\x00\\x1b\\x27\\x64\\xa6\\x2b\\xbe\\xa1\\x84\\x39\\xfc\\x62\\xc2\\x1a\\xb8\\x43\\x6b\\xe5\\xcc\\xbd\\xa5\\x73\\x85\\x5e\\x0f\\x2b\\x67\\xe5\\x2e\\x81\\x7d\\x3b\\xe3\\x57\\xce\\x95\\x3b\\x77\\xe6\\x6c\\x8b\\xe7\\xcb\\x9a\\x3b\\x3b\\xc8\\x72\\x66\\xf7\\xd6\\x6e\\x0e\\x67\\x0d\\x8a\\x9c\\x79\\x57\\xce\\x0e\\xdf\\x17\\xb7\\x23\\xd8\\x52\\x72\\xb0\\x2c\\x66\\x1b\\x54\\x06\\xd4\\xdd\\x8f\\x75\\xac\\x0d\\xf8\\x5a\\x4f\\x48\\x02\\xd9\\xf4\\x57\\x39\\x1b\\x34\\x11\\x06\\xbb\\xf1\\x6d\\x43\\x92\\x91\\xc8\\xde\\x23\\x29\\xb2\\x25\\x32\\x04\\x2f\\xb4\\x2a\\x81\\x52\\xc2\\x99\\xd3\\x36\\xdd\\x0f\\x32\\x15\\x0f\\x08\\x80\\x00\\x25\\xa4\\x55\\x48\\xfb\\x5e\\x7f\\x04\\x44\\x28\\x55\\x32\\x92\\x78\\x1a\\x2b\\x0a\\xa9\\xa2\\x98\\x87\\xaa\\x22\\x1d\\x93\\xff\\x81\\x8c\\x40\\x93\\xf3\\xc0\\xcb\\x60\\x42\\x81\\xd8\\x84\\x1a\\x10\\x6a\\xe7\\xbd\\x4a\\x07\\xb0\\x98\\x58\\xde\\xca\\xad\\x09\\x31\\x98\\x38\\x6f\\xe8\\x00\\x34\\xcf\\x9d\\xbc\\x67\\xc1\\x23\\xc0\\xf6\\xd0\\x8d\\x7b\\x43\\x17\\xc0\\x3b\\xe2\\x60\\xbb\\xb7\\x70\\x81\\xf6\\xcb\\xdc\\xa0\\xe1\\x7f\\xf9\\x7d\\x6b\\x9c\\xaf\\xb0\\x27\\xd5\\x5e\\xf8\\x36\\xa3\\x8b\\xb6\\xb5\\xd4\\x46\\x0e\\xa0\\x12\\x64\\xec\\x88\\x16\\xcd\\xba\\x5b\\xbc\\xe6\\xc6\\x70\\x56\\x30\\x14\\x6b\\x0a\\x06\\x6b\\xf0\\x9e\\x37\\xe2\\x23\\xfc\\x70\\xf8\\xa4\\x36\\xd5\\x2c\\x4a\\x0f\\xb0\\xe2\\x5a\\x03\\xb0\\xe4\\x5a\\x27\\xb0\\xe1\\x4a\\x1b\\x00\\xdb\\xea\\xc7\\x10\\xf6\\x54\\x65\\x78\\x39\\xf7\\x3c\\x3a\\xdc\\x11\\xbf\\x9a\\xce\\x01\\x51\\x52\\xdc\\x89\\x4c\\x6c\\x02\\x54\\xd4\\x91\\x51\\x77\\x00\\xc4\\x15\\xf5\\xc8\\xb4\\xe6\\x46\\x37\\x49\\x34\\xe5\\xb6\\x73\\xb2\\xe3\\xee\\x0a\\x52\\x50\\x67\\x3c\\xa7\\x55\\xcf\\x69\\xb1\\x82\\xa9\\xeb\\xa6\\x5f\\x86\\x33\\xbc\\x0c\\x55\\xf9\\x3d\\xe3\\xbe\\x17\\xb4\\xef\\x2d\\x82\\xa6\\x05\\xba\\x7b\\x90\\x06\\xb7\\xf4\\x04\\x79\\x89\\x92\\xb5\\x27\\xde\\x02\\x1d\\xa2\\x0f\\x50\\x9f\\xee\\xec\\xfd\\x39\\xb3\\xbe\\xcb\\xac\\x48\\x1d\\x1e\\x46\\x25\\x17\\x12\\x26\\x6f\\x3c\\x04\\x34\\x13\\xd8\\xf8\\x0b\\xd8\\xec\\x18\\xd4\\x51\\xa6\\x4c\\x84\\xbf\\xb9\\xf5\\xa9\\xde\\x8d\\xcc\\xb9\\xf2\\x32\\x95\\x93\\x80\\x3b\\x7d\\x9d\\xa0\\xe5\\xeb\\x4e\\xe5\\x54\\xda\\xe9\\xe3\\xe3\\xd2\\x5b\\xaa\\x9c\\x2b\\x5d\\xe7\\x4a\\xd5\\xb9\\x54\\x75\\x2e\\x65\\x4e\\xe8\\x86\\x59\\xe7\\x52\\xd5\\x49\\x5d\\xb9\\x95\\xd7\\x0a\\xb2\\xa8\\x06\\xc4\\x40\\xde\\xb9\\xae\\x79\\xf3\\xf0\\x9f\\x4d\\x1a\\xa9\\xe8\\x06\\xa8\\x5c\\xf2\\x12\\xf9\\x6b\\x98\\x7d\\xee\\x93\\x00\\x5b\\x89\\xf5\\x77\\xf2\\x27\\xc8\\xc2\\x3d\\x7a\\x60\\xd7\\xa2\\x05\\x7e\\x6b\\x20\\xe8\\xd7\\xac\\xda\\xc3\\xa8\\x5f\\xa8\\x44\\x75\\x0a\\xc3\\xe8\\x73\\x1c\\x29\\x70\\x44\\xf1\\x30\\x8e\\x38\\xaf\\xaf\\x03\\x82\\x95\\x44\\x07\\x9a\\x1d\\xec\\x0a\\xd8\\xd7\\x5e\\x0a\\x0b\\x0e\\xfb\\xdc\\xa3\\x18\\x58\\xf4\\xbe\\x80\\x5f\\x7c\\x47\\xb1\\x96\\x15\\x3a\\x0b\\x2f\\x76\\x72\\xe5\\x90\\xb5\\x1a\\x73\\xef\\x7d\\xa0\\x5c\\x92\\x96\\x3c\\x74\\xe0\\xfc\\x39\\x31\\xba\\xda\\xc8\\xd8\\x58\\xb0\\x4b\\x81\\xc8\\x5a\\x42\\x89\\x0d\\xea\\x3b\\xe7\\x1c\\xca\\x6f\\xbc\\xdc\\xa1\\xd0\\x58\\x0b\\x3e\\x07\\xaa\\x7c\\xcd\\xb3\\x06\\x3d\\xf3\\x57\\x36\\x5a\\xd3\\x34\\x24\\x6c\\x2d\\x67\\xa1\\x84\\x87\\x2d\\xbf\\x72\\x53\\xf8\\xdd\\xf1\\x85\\x01\\x01\\x14\\xc0\\x44\\x65\\x3f\\xcc\\xd2\\x82\\x69\\x72\\x85\\xaf\\x2b\\x72\\x40\\x4e\\x1e\\x1a\\x95\\xc7\\x80\\xff\\xce\\xe8\\x88\\x40\\x35\\xa7\\x67\\xdd\\xdd\\xcd\\xcd\\x9a\\xce\\x33\\x3c\\xa2\\x25\\xfa\\xf6\\x14\\x9e\\xb6\\x32\\x14\\xd3\\x59\\xf7\\xa5\\xfd\\x61\\x07\\xef\\xaf\\x15\\xee\\x3a\\x83\\xe7\\x97\\x55\\xb8\\x1d\\x48\\x7f\\x43\\xe9\\x46\\xea\\x9b\\x5b\\x68\\x41\\xa1\\xa4\\x1d\\x1a\\x20\\x40\\xfd\\x56\\x12\\xf3\\xb5\\xdd\\x70\\x54\\xf9\\xe3\\x00\\x75\\x35\\x22\\x41\\x46\\xf7\\xb5\\x2c\\x50\\x00\\x2a\\x65\\x50\\x97\\xa2\\xd5\\x30\\xf0\\xa1\\xa2\\xd5\\x0a\\xa2\\xd5\\xf0\\xfa\\x4f\\x93\\x48\\x34\\x0d\\x4e\\xdb\\xd0\\x85\\x7f\\x17\\xc2\\x59\\xfe\\xe9\\xe3\\xba\\x45\\x82\\xf0\\x0a\\x92\\x94\\x08\\x49\\x00\\x97\\xa3\\xdf\\x87\\x75\\xf4\\x35\\xea\\x77\\xf0\\x2a\\xdf\\x23\\x44\\x1a\\x74\\xc4\\x0b\\xb4\\x8a\\xf7\\x0a\\xb4\\x82\\xaf\\x08\\x2a\\xfc\\xb6\\xa3\\x6f\\x44\\x4e\\xd9\\x34\\x22\\xbc\\x31\\xf2\\x52\\xc5\\x86\\xd0\\xb0\\xa0\\x64\\x03\\x33\\x4a\\xdf\\xd7\\x2d\\x60\\x7c\\x69\\x02\\xe3\\x23\\x15\\x92\\x55\\x11\\x33\\x81\\xa2\\xfb\\xc9\\x05\\x83\\x28\\xfc\\x29\\x5d\\x97\\x58\\xa8\\x41\\xc5\\xf2\\x1b\\xd1\\xff\\x40\\x9f\\x23\\x28\\xed\\x66\\x88\\x43\\x30\\xa6\\x11\\xc1\\xb2\\x0d\\x5f\\x74\\xd1\\xda\\x68\\x01\\xcf\\xb0\\x19\\x57\\xee\\x06\\xed\\x09\\xd7\\xdc\\x5a\\xba\\x57\\x78\\x97\\x39\\x3a\\x2e\\x71\\xbc\\xe3\\x8e\\x0c\\x47\\xc7\\xf3\\x9b\\x9b\\xf9\\x18\\x68\\x1d\\xed\\xe6\\x84\\xee\\x4c\\xca\\x79\\x4b\\xfe\\xed\\xee\\xea\\x6b\\x65\\x94\\xeb\\x13\\xe2\\xee\\x39\\xc0\\x8d\\xf0\\x16\\xf0\\x9f\\x7a\\x8e\\x6f\\xab\\xad\\x53\\x15\\x3c\\x0d\\x0f\\x97\\x8b\\x8d\\x72\\xe1\\xed\\x6d\\xe5\\x50\\x95\\x41\\x77\\x01\\xd8\\xf5\\xac\\x2b\\x00\\x4f\\xb0\\x5c\\x6b\\x2f\\x03\\x52\\xc1\\x1b\\x8c\\xb3\\x9b\\x1b\\xe0\\xf8\\xec\\x4f\\xee\\x1c\\x30\\x41\\xa5\\xdd\\xcb\\x8c\\x2e\\x5a\\xb1\\xfe\\xf2\\xa9\\x1d\\x35\\x4b\\xa8\\x3a\\x8c\\x5a\\x0d\\x27\\xb0\\x65\\xa3\\x43\\xdb\\x7a\\x32\\x8d\\xca\\x52\\xe4\\x24\\x30\\x80\\x9e\\xaa\\x2a\\xa0\\xf7\\x00\\xde\\xf7\\x3a\\xb3\\x3d\\x4d\\xf7\\xcb\\xd7\\xf9\\x65\\xf9\\xba\\xbe\\x3a\\x20\\x5c\\x40\\xb7\\x81\\x5d\\x72\\x74\\x21\\x36\\x4c\\x70\\xd5\\xe6\\x23\\x38\\x1b\\x6b\\xac\\x9d\\xe9\\xd8\\x51\\x81\\x04\\xc0\\x97\\x2d\\xf8\\xfb\\xaf\\x7d\\xd6\\x14\\xe0\\x96\\xaa\\x4b\\x93\\x0a\\xdf\\x85\\xf2\\xcc\\x96\\xe4\\xf8\\x00\\xd4\\x5a\\xc9\\x24\\x63\\xcc\\x32\\xf5\\x5a\\xd0\\x6d\\xe4\\xec\\x47\\x8c\\x9a\\x1b\\xcd\\x24\\x66\\xae\\x2f\\x53\\xfb\\x59\\x95\\xb0\\x29\\x47\\x71\\x57\\x8e\\x82\\x1c\\x6f\\x0c\\xc7\\x82\\xef\\x5a\\x2a\\x9b\\xaa\\x6b\\x0d\\x39\\x47\\x86\\x63\\x43\\x0f\\x16\\x98\\x10\\xdd\\x53\\xe8\\x8b\\x21\\xd4\\xfb\\xd1\\x18\\x24\\x4c\\x1f\\x3a\\x30\\x5f\\xe2\\x0d\\x87\\xd2\\x03\\x0d\\x0a\\x66\\x3e\\xce\\x6a\\x86\\x7e\\xd3\\x01\\x5d\\xbf\\x16\\x63\\x38\\x51\\x98\\x3c\\x53\\x28\\xf6\\x73\\xbb\\x37\\xdd\\x80\\x50\\xd2\\xe5\\xa8\\x66\\x7f\\xd5\\xac\\x4b\\x84\\xa7\\x26\\x9e\\x4c\\x33\\xc4\\xc4\\x90\\xc6\\x09\\x82\\x2e\\x3b\\x80\\x23\\x08\\x79\\xb6\\xb6\\x2f\\xfb\\x52\\x98\\x79\\x00\\x95\\x79\\x19\\x79\\xe6\\xec\\x3c\\x40\\x68\\xb6\\x69\\x97\\x86\\xa8\\x0d\\x51\\x1d\\x7c\\x87\\x3c\\x3b\\xa3\\x8f\\x49\\x69\\x5c\\x0e\\xd8\\x58\\x68\\x62\\x8c\\x3f\\x60\\xdc\\xfc\\xa4\\xfb\\x9c\\x63\\x30\\xeb\\xa4\\xfb\\x06\\x51\\x2e\\x22\\xdc\\x56\\x5e\\x51\\x9a\\x70\\xac\\x20\\x56\\xf9\\x0d\\x41\\xd5\\x5f\\x47\\xe5\\xa4\\x84\\xb2\\x38\\x71\\xf8\\x9b\\xf9\\x25\\xd4\\x82\\xd3\\x77\\x81\\x57\\x50\\x43\\xed\\x25\\x8c\\xea\\x57\\x34\\xab\\xc6\\xef\\xdd\\x97\\xf8\\x4b\\x01\\x0b\\xdf\\xc0\\x57\\xdc\\x30\\x50\\xc8\\xa0\\x21\\xb2\\x03\\x2d\\xbd\\xfc\\xec\\x96\\x20\\x15\\xfa\\x07\\xbf\\xd4\\xd2\\x4b\\xdd\\xd2\\x1b\\xb3\\xa5\\xb2\\xd4\\xe8\\x64\\x04\\x83\\x1f\\xd9\\x18\\x81\\xe7\\x65\\x25\\xe7\\x33\\xac\\xa6\\xcc\\x1e\\x55\\xac\\x27\\x05\\xec\\x4b\\x4b\\x5b\\x22\\x77\\x42\\xc8\\xdf\\x85\\x68\\x69\\xff\\xa3\\x8c\\x0a\\x28\\x6f\\x7f\\xa8\\x42\\xc3\\x01\\x47\\x47\\x9f\\x13\\xd8\\xd4\\xb1\\x7a\\x1a\\x11\\xba\\x86\\x0d\\x13\\x23\\x3d\\x6b\\x1d\\x95\\x37\\x37\\x08\\x90\\x4a\\xc4\\xdd\\x11\\xe1\\xee\\x12\\x71\\x37\\xc2\\x05\\x58\\x5b\\xdb\\x46\\x08\\x01\\xb4\\x8d\\xa0\\x54\\xf4\\xaa\\x44\\x34\\x04\\xc7\\x27\\x82\\xe3\\x43\\x55\\x02\\x9d\\x1e\\xd9\\xec\\x1f\\xfa\\x2b\\x90\\xbc\\x41\\x7f\\x20\\xf4\\xe2\\xc2\\x0e\\xcb\\x7e\\x56\\x38\\xbe\\x54\\xd1\\x26\\x7e\\xcd\\xd0\\x43\\x35\\x03\\x72\\x0f\\xd1\\xf4\\x17\\xc4\\x3a\\xfd\\x80\\x7f\\x6d\\xc5\\xfb\\x7c\\x08\\x45\\x1c\\xe7\\x3e\\x90\\xe3\\x74\\x42\\xfd\\xef\\xc2\\x4a\\x1f\\x06\\x63\\x82\\xc1\\xc0\\xb0\\x71\\xcc\\x88\\x06\\x8d\\x68\\x14\\x69\\xd9\\xa2\\x19\\x77\\x40\\x2f\\xc2\\xc0\\x60\\x77\\xc3\\xc3\\xd6\\xb0\\xf2\\x28\\x5b\\x32\\x35\\x64\\x34\\x51\\x98\\xe1\\x58\\xaa\\x90\\xed\\xd1\\xb7\\x82\\xbe\\x09\\xf5\\xcd\\xb0\\x04\\x29\\x1b\\x6a\\x53\\xa3\\xea\\xb8\\x99\\xb2\\x33\\x4c\\x38\\x6a\\x13\\xb1\\x0f\\xb1\\x08\\x16\\xfe\\x11\\x90\\xf0\\xe9\\x1c\\x86\\x87\\x11\\xc2\\xa4\\x57\\x08\\x71\\x93\\xf2\\x67\\x27\\xef\\xd0\\x33\\xcc\\x36\\xca\\x3a\\x0a\\x26\\x93\\xe0\\xfb\\x28\\xb1\\xea\\x0f\\x9a\\xfc\\xec\\x3e\\x42\\xc7\\x04\\xd2\\xf4\\xe1\\x63\\xe6\\xe2\\xfd\\x8a\\x78\\xd1\\x34\\xb6\\x35\\x0a\\xc9\\xf3\\x9d\\xea\\x0a\\x49\\xf2\\x06\\xa5\\x29\\xb4\\x40\\x48\\x9e\\xf2\\x2a\\x01\\x10\\x7e\\x4a\\xd5\\x52\\xc2\\xb0\\x4e\\x18\\x62\\x09\\xa0\\x1a\\xd0\\x72\\x20\\x9c\\x9e\\xd4\\x09\\x27\\x33\\xe2\\xb8\\x28\\x56\\xa9\\x61\\x36\\xd2\\xe8\\x73\\x15\\xc7\\x09\\xfa\\x33\\xa8\\xc2\\x42\\x3d\\x68\\x58\\x33\\x2b\\x4b\\x52\\x15\\xbf\\x33\\x47\\x23\\xd6\\xc5\\x38\\x45\\x84\\xbc\\xba\\xb9\\x29\\x01\\xfb\\xc9\\xe0\\x8f\\x5c\\x99\\xf1\\xc8\\x0a\\x37\\xe8\\x53\\x87\\x4b\\x0c\\x24\\x08\\xf2\\x08\\x3b\\x0c\\x82\\x20\\x29\\x59\\x24\\x31\\xc2\\x71\\x65\\xe0\\x5b\\x53\\xba\\x21\\xd0\\x91\\x23\\x38\\xe9\\x1e\\x4a\\xdf\\x84\\x87\\xbc\\x78\\xe1\\xee\\x50\\xbd\\xeb\\xa2\\x70\\x67\\x03\\xa3\\x50\\x54\\xdf\\x19\\x34\\x46\\x93\\xc7\\xb6\\x34\\xa3\\xb9\\xbb\\xc2\\x18\\x08\\xf8\\xb8\\x70\\x97\\x78\\x7b\\x54\\x31\\xe6\\x5b\\x74\\x3a\\x1c\\x73\\x8a\\x19\\x73\\x7a\\x3a\\xb8\\xb9\\x60\\x6f\\xf9\\xb9\\xfb\\x70\\xf4\\x76\\x7c\\x3e\\x72\\xdd\\x73\\x3c\\x75\\x09\\x3f\\x9b\\x9e\\x1c\\x9f\\xcf\\x6c\\x75\\xe3\\x32\\x3c\\xcb\\x5b\\x93\\x1f\\xf4\\x7d\\x3d\\xf4\\x2d\\xbb\\xb4\\x8d\\x1b\\x89\\x1f\\x0c\\x28\\x65\\x4b\\x93\\xd2\\x4c\\x19\\xaa\\x32\\x97\\x90\\xba\\x6c\\xa4\\x9c\\xa8\\x32\\x97\\x34\\x91\\x40\\xf0\\xa0\\x9b\\x8b\\x9a\\x7f\\x66\\xd8\\xf3\\x2f\\x4b\\xed\\x83\\x8a\\x56\\x08\\xcb\\x4b\\x92\\x5c\\xea\\xe7\\x42\\xeb\\xfa\\x90\\xe0\\xa3\\x1b\\xb9\\x25\\x9a\\xc1\\x69\\xea\\x4a\\x2f\\x99\\xa2\\xbb\\xf4\\x32\\x46\\x14\\xa9\\x57\\xde\\x6d\\xac\\xd0\\xf9\\x3f\\x1d\\x77\\x5b\\x48\\x89\\x3e\\xdd\\x07\\x6a\\xa1\\x43\\x0a\\x5e\\x36\\xdb\\xfc\\x9a\\xb9\\xe9\\x81\\xaf\\xa5\\x1b\\x38\\x4d\\x93\\xdb\\x4d\\x13\\x36\\xf2\\x0f\\x78\\xcf\\xe4\\x87\\x5b\\x79\\x7f\\x3b\\xde\\x27\\x98\\xd8\\xf4\\x53\\x4c\\xb2\\xa9\\x98\\xf1\\x75\\xa9\\x62\\xd0\\xe3\\x2d\\x9a\\x7e\\x89\\x9f\\x28\\xee\\x7f\\x95\\xbd\\x90\\xd9\\x13\\xe0\\x15\\x28\\x95\\x32\\x1e\\x1a\\x4e\\x55\\x22\\xb3\\x29\\x23\\x56\\x6f\\x58\\xe0\\x98\\x61\\x34\\xaf\\xca\\x96\\x39\\xa7\\x8b\\x4e\\x73\\xae\\xe9\\x04\\x61\\x5c\\x95\\x6e\\x0d\\x80\\xc3\\x77\\x0b\\xc7\\x8c\\xd6\\x3b\\x3f\\x80\\x01\\xa2\\xd8\\xb8\\x5b\\x21\\x35\\x5f\\xfa\\x14\\x99\\x91\\xee\\xa0\\x65\\x88\\x11\\x68\\x74\\x89\\x8b\\x17\\x7d\\x17\\xf8\\x77\\x84\\x91\\xc2\\x62\\x7d\\xbb\\x38\\xc2\\xf0\\x0c\\x2b\\x90\\x97\\x32\\xe0\\x3d\\xe6\\x80\\x12\\x32\\xe0\\xb5\\xa0\\x2e\\x9b\\x62\\x0a\\x94\\xd5\\x05\\x2b\\x14\\x72\\x0a\\x05\\x19\\x13\\xfc\\xe3\\xf2\\xd2\\x27\\xe1\\xc5\\x0c\\xdd\\x23\\xa1\\x56\\x14\\xce\\x63\\x18\\x57\\xa8\\x90\\x2e\\x76\\x99\\x18\\x59\\x33\\x9d\\x15\\x68\\x1a\\xf5\\x24\\xa3\\xd3\\x4a\\xf2\\xe8\\x43\\x04\\x84\\xe5\\xd6\\x87\\xb9\\xa2\\x68\\xd5\\x18\\x29\\xa9\\x31\\xaa\\x4a\\x2f\\x7b\\xaa\\x83\\x4b\\x35\\x3b\\x76\\x67\\xb7\\xb4\\x28\\xe6\\x74\\x38\\x41\\x18\\x87\\x12\\x55\\xfc\\x45\\xc1\\xe2\\xbe\\x9e\\x19\\x2d\\x92\\xf1\\x6a\\x63\\xfb\\x40\\x00\\x98\\xe2\\xd6\\xc7\\xb2\\x5a\\xb2\\xd3\\xde\\x0c\\x7a\\x07\\x62\\x64\\xe0\\x0c\\x23\\xae\\xda\\xc1\\x14\\xa6\\x24\\x9c\\x66\\x33\\x1b\\xf1\\x23\\x60\\x14\\x63\\x7f\\x04\\xf5\\x7d\\xab\\x06\\x26\\x59\\xab\\x75\\x36\\xeb\\x2b\\xd0\\xb2\\xb9\\x10\\xd9\\x26\\x8d\\x83\\x22\\xcd\\xaa\\xc8\\xb6\\x9e\\x97\\x8d\\x79\\xff\\xf8\\xf8\\x08\\x1a\\x69\\xe7\\x81\\x36\\x95\\x03\\x77\\x6d\\xde\\x66\\x98\\xf9\\xb4\\xce\\xcc\\x94\\x02\\x7e\\xcd\\x8c\\x2b\\x23\\xe8\\x3c\\xab\\x47\\x7d\\x2b\\x3e\\xaa\\x86\\xf5\\xb7\\xea\\xde\\x56\\x79\\x70\\x60\\xcc\\xc1\\x58\\xe0\\x3d\\x0f\\x76\\xa6\\xfc\\xe8\\xcd\\x73\\x26\\x73\\x8d\\x22\\x95\\xa5\\x79\\xea\\x46\\xa9\\xf9\\x19\\xf3\\xdf\\x79\\xda\\x8c\\x66\\x3e\\x76\\xe4\\xce\\xca\\x83\\x16\\x92\\xd5\\xa7\\xfe\\x18\\x48\\xdb\\xbe\\x0f\\xa0\\x7a\\x30\\x19\\xf8\\x49\\xf3\\x62\\x8f\\xed\\x47\\x0a\\x0f\\xbc\\x04\\x0e\\x69\\xa3\\xc8\\xe5\\xfd\\x45\\x10\\x3b\\x74\\x1f\\x8d\\x8b\\x49\\x62\\x0d\\x9d\\xc2\\xf6\\x87\\x50\\xc3\\xd0\\xc3\\x47\\xb3\\x92\\x8b\\x06\\xb5\\xe0\\x18\\x14\\xe0\\x75\\x2b\\xc5\\x4c\\x3b\\x2f\\x55\\x1c\\x60\\x18\\x53\\xa2\\xa5\\xac\\x32\\x8c\\x03\\x5e\\xf2\\xad\\xfb\\xac\\x5c\\xcb\\xa1\\x28\\x2a\\x9b\\x9c\\x4a\\x8d\\xff\\x90\\x7a\\x96\\x4c\\x84\\x7f\\xe2\\x58\\x09\\x9a\\x4f\\x09\\xaf\\xfb\\xe4\\x91\\xb1\\x29\\xdf\\x7e\\x64\\x3a\\x2a\\x33\\x06\\x64\\x96\\x8c\\xe1\\xbc\\x30\\xcb\\x0d\\x6a\\x8b\\x82\\xc4\\x79\\x63\\xba\\xe2\\x3d\\x2b\\xdb\\x76\\x1e\\x58\\xd7\\x90\\x0d\\xfa\\xd8\\x9f\\x86\\x30\\xe3\\xd5\\x81\\x1a\\x09\\x7d\\xc3\\x8a\\x38\\xa6\\x8e\\xed\\xb9\\xb9\\xc3\\x47\\x77\\x58\\x35\\x9f\\x0e\\xc9\\x96\\xa5\\xfb\\xf0\\x91\\xcd\\xf6\\x2c\\x9e\\x61\\x8e\\x7a\\x2f\\x03\\xc3\\xcc\\x6c\\xd0\\x43\\xc3\\x88\\x84\\x0f\\x70\\xfa\\xf0\\x7e\\x8e\\x6a\\x26\\xea\\x00\\x3a\\x03\\x37\\x71\\x8c\\x11\\x78\\x30\\x84\\xcc\\x08\\x5b\\x68\\x01\\xa6\\xb4\\x9d\\x97\\x41\\xaf\\xb1\\x75\\xde\\x37\\xd6\\x16\\x65\\x54\\x7c\\xd0\\x7d\\xd2\\x1f\\x3c\\x7a\\x6a\\xb4\\x61\\xd0\\xb1\\x4e\\xe1\\x58\\x00\\xcd\\x31\\xd6\\x9b\\xd7\\x98\\xef\\x77\\x8d\\xd9\\xe9\\x0d\\x61\\x15\\x61\\x5d\\x9f\\x74\\x1f\\x3d\\x1e\\x3e\\xc2\\x2d\\xe3\\x0f\\x5b\\xdf\\x60\\x7a\\xa1\\xa9\\x47\\xf4\\xd5\\x76\\x12\\x17\\x7e\\xfc\\xa1\\x7a\\x6f\\xe6\\x1a\\x76\\x87\\x46\\xb6\\xaf\\x4e\\x20\\x63\\x23\\xf5\\x71\\x23\\xf9\\xe9\\x43\\xc8\\x60\\xa8\\x9a\\x4d\\xca\\x62\\x15\\xc6\\x15\\x65\\x81\\xcf\\x06\\x65\\x41\\xd1\\x52\\xba\\x21\\x51\\x16\\x31\\x51\\x16\\x2b\\x45\\x59\\x84\\x8a\\xb2\\x88\\x6b\\xca\\x22\\xca\\x5f\\x05\\xaf\\xac\\x94\\x82\\xd9\\xd1\\xf5\\x3d\\xf2\\x43\\x66\\xe3\\xed\\xc1\\x3e\\xda\\x4d\\xd1\\x7b\\x64\\x4f\\xac\\x88\\xa2\\x13\\xc8\\x77\\x81\\xe9\\x2b\\x5f\\xd8\\x7e\\x34\\x1e\\x3c\\xed\\x4f\\x22\\x8f\\x9f\\x3c\\xee\\xfb\\x1e\\x3c\\x13\\xa6\\x8b\\x5c\\x7c\\xb7\\x0f\\xa1\\x86\\xbc\\x90\\xa4\\x0a\\x23\\xd2\\x84\\x49\\x52\\x04\\x71\\x85\\xa1\\xc9\\x6e\\x8c\\x34\\x37\\x46\\x9a\\x1f\\x18\\x69\\x7e\\x60\\xa4\\xf9\\xe7\\x8d\\x34\\xff\\xbf\\x32\\xd2\\xf0\\xe3\\x23\\x7d\\x63\\x8e\\x34\\x0e\\x6a\\x6a\\x11\\x9f\\x8d\\x91\\xc6\\xcc\\x10\\x4a\\xd0\\x48\\x63\\x35\\xd2\\xe0\\x53\\xa8\\xc5\\x07\\xab\\x8f\\x77\\xe5\\x9b\\x16\\x9f\\x87\\x86\\xc1\\x07\\x08\\x2b\\x83\\x8a\\x4c\\x90\\xba\\x32\\x4f\\xce\\xeb\\xb2\\x16\\x1a\\x4f\\xb1\\xbb\\xd0\\x59\\x34\\x43\\x98\\xe2\\x76\\x4c\\xba\\x73\\xb4\\x04\\xf9\\xa7\\x94\\x86\\x80\\xbf\\xca\\x20\\x5f\\x30\\x16\\xf8\\xf2\\x2d\\x52\\x2b\\x05\\x06\\xfb\\xb4\\x6f\\x6e\\x00\\xf1\\xa3\\x7b\\x0e\\x5a\\x25\\x9c\\x0a\\x7d\\x75\\x0d\\x82\\x18\\x7c\\x46\\x82\\x0c\\xdf\\xe9\\x21\\xa3\\xbf\\x25\\xfe\\x55\\x5a\\x0a\\xe5\\x8b\\x61\\x65\\xa6\\xbc\\x85\\x2e\\xb2\\x21\\xbb\\x0d\\x53\\xd2\\xe2\\xd5\\xfe\\xad\\x64\\x5e\\x4a\\xe5\\x6b\\x63\\x22\\xe8\\xb3\\x80\\x3e\\x2f\\x66\\x4a\\xec\\x43\\xa6\\x4b\\xd3\\x8c\\x45\\xfa\\xc3\\x5b\\x71\\xcd\\xa3\\x86\\x58\\x07\\xb8\\x34\\xa8\\xc8\\x37\\x04\\x77\\xbf\\x96\\x1f\\xbb\\xe6\\xc7\\x50\\x8e\\x97\\x6d\\x2b\\x5a\\x84\\xc8\\x54\\x43\\x62\\x9b\\x97\\xf7\\x5a\\xad\\xcb\\x71\\x1a\\x2e\\x05\\xdf\\x96\\x6d\\xdf\\x08\\x8a\\x9d\\x28\\x1c\\xe3\\x62\\x1f\\xa1\\xae\\x0a\\x32\\x54\\x8d\\x77\\x52\\x32\\xb0\\x15\\x69\\x4e\\x80\\x70\\x58\\xcb\\xd0\\x69\\x8d\\x2f\\x64\\xc6\\x1f\\x19\\xa6\\x5f\\x18\\xdd\\xac\\x7e\\x8b\\x21\\x4d\\x2e\\x09\\x1a\\x23\\xeb\\x47\\x54\\xd4\\xe0\\xf4\\xb1\\x15\\x2a\\x5e\\xf1\\x61\\x89\\x5f\\xc8\\x90\\x6c\\x83\\x9f\\xf0\\xa9\\xc2\\x36\\xd0\\xef\\x23\\xa2\\x34\\x6f\\x6e\\x30\\x9e\\x11\\x3e\\x0f\\x66\\x78\\x41\\xbc\\x8c\\x09\\x51\\x35\\x66\\x75\\xa4\\xde\\x18\\xe3\\x4a\\xc8\\x07\\xbb\\x03\\x1b\\xad\\xa2\\x8a\\x07\\x92\\x2a\\x26\\x33\\x86\\x90\\x8c\\x78\\x18\\x7c\\x3d\\xd1\\x5f\\x07\\x33\\xe2\\xd0\\x91\\x62\\xf6\\x55\\xdd\\xb2\\x51\\x6a\\xce\\x6c\\xc6\\x0d\\xf1\\xce\\x4e\\x1f\\x48\\x4e\\x16\\x1f\\xf1\\x7c\\x62\\xc5\\x5e\\x4e\\xa0\\x21\\x27\\x50\\xe0\\xe7\\x5e\\x8c\\xaf\\x18\\xf3\\x52\\xc1\\x86\\xba\\x13\\xaa\\xe6\\x4c\\x0a\\x71\\xdc\\x8e\\x9c\\x11\\xcb\\xe8\\xb1\\x37\\x94\\x3d\\x8a\\x59\\x4e\\x7d\\xc9\\x8f\\x8f\\xef\\x2a\\xe4\\xe6\\x2e\\x8d\\x71\\x71\\xc4\\x57\\x93\\xbb\\xdb\\xc0\\x19\\xfe\\xe3\\x50\\x13\\x18\\xb7\\x13\\x28\\xf4\\xd5\\x7e\\x0b\\xaa\\x88\\xbb\\x92\\x0d\\x2c\\x69\\x0d\\x36\\x34\\x1d\\x4b\\x5a\\x83\\x0d\\xad\\x81\\xe0\\x7b\\x05\\x71\\xe9\\x3e\\xb6\\x12\\xc2\\x7b\\x28\\x3b\\xb0\\x94\\x41\\x26\\xf5\\x5a\\x08\\xdd\\xb1\\x25\\xa9\\x90\\xf5\\x6a\\x58\\x03\\xdd\\xf6\\x40\\x36\\x6c\\x1f\\xe8\\xb0\\x6c\\xd7\\xdd\\xc8\\x0e\\x8b\\xea\\x3a\\xd7\\x83\\xec\\x05\\xc6\\xa4\\xa0\\x7b\\xee\\xa2\\x53\\x31\\xb2\\xb3\\x29\\x50\\x2f\\xe5\\x34\\x92\\xec\\x45\\xd1\\x60\\x2f\\xb2\\x9a\\xbd\\x30\\xb4\\xe8\\x2d\\x48\\x89\\x37\\x34\\x71\\xe4\\x46\\x01\\x78\\x0d\\x7a\\x87\\xd8\\x51\\xb2\\xa1\\xef\\x15\\x66\\x20\\xb8\\xcf\\xae\\xe3\\x41\\x15\\xb4\\xaa\\x5f\\x87\\xac\\x1a\\x30\\x55\\x75\\x83\\x00\\xfe\\xb3\\x6c\\x1b\\xe4\\x49\\x0f\\x05\\x52\\xc1\\x4a\\x6f\\x04\\x38\\xe4\\xbf\\x29\\x08\\x0c\\x27\\xbd\\x98\\x8d\\x0a\\x94\\x43\\xa2\\x3e\\xad\\xc0\\x08\\x43\\x40\\xc2\\xe9\\x05\\x2b\\x6a\\x9b\\x25\\xe3\\x96\\x5c\\x21\\xb3\\x97\\x5a\\x5d\\x16\\xb1\\x3e\\xd6\\x85\\xa6\\x2d\\xb2\\x78\\xcd\\x4d\\xd4\\x5a\\xe5\\x56\\xb7\\xa6\\x64\\xa2\\xa6\\xf3\\x4b\\x7f\\x1a\\x81\\x37\\xda\\x6a\\x8b\\xaf\\x84\\x8b\\x03\\x35\\xd6\\xe9\\xe6\\xc5\\xb6\\x6a\\x3e\\x49\\x22\\xc4\\x01\\x28\\x6a\\xf0\\x37\\xaa\\x6f\\x27\\xa4\\xf6\\x61\\xe0\\x7f\\x29\\x14\\xa4\\x6e\\x3e\\x40\\x83\\x5c\\xf5\\x24\\xcd\\x2c\\x47\\x25\\xd4\\x10\\xa1\\xa5\\x55\\x79\\x28\\x57\\x6d\\x84\\x59\\x6b\\x4b\\x95\\x04\\x7e\\x11\\x6d\\xc5\\xfc\\x86\\x1b\\x46\\x1c\\x5f\\x98\\x29\\xc7\\xdc\\x7b\\x62\\xa8\\x14\\x9b\\x85\\x1e\\x62\\x98\\xd6\\x2d\\xd9\\x42\\xc1\\x03\\x5e\\x2b\\x6f\\x88\\x39\\x7f\\x6f\\x55\\x63\\x90\\x85\\xff\\x2a\\x9b\\xba\\x0b\\x0a\\x0f\\x2f\\x6f\\xf0\\x09\\x57\\xb8\\xd6\\xf0\\xe5\\x08\\x39\\xce\\x60\\xd1\\x88\\x99\\xa7\\xc5\\x6f\\x41\\x75\\x05\\x0d\\x00\\x6f\\x3a\\x15\\xe1\\x29\\xd9\\xb5\\xa5\\xd3\\x70\\xc6\\xe4\\xaa\\x20\\xa1\\xf3\\x2f\\x8c\\x60\\x57\\xc8\\x78\\x20\\xb2\\x62\\x17\\xa0\\xb6\\x7c\\x02\\xb2\\xa2\\x7a\\x76\\xe0\\x61\\x0b\\x14\\x46\\xe3\\x83\\x0c\\x75\\x5a\\x89\\x17\\x65\\x77\\x90\\x46\\x97\\x5f\\xba\\x5b\\xe5\\x20\\x01\\x50\\x76\\x9e\\xae\\x2d\\xdb\\xeb\\x3e\\xd2\\x51\\x6b\\xbb\\xbb\\xfd\\xb4\\xca\\xbe\\x09\\xa8\\x04\\x9d\\x8d\\xe4\\x2c\\xb3\\x51\\xdd\\x39\\x95\\xf0\\x5c\\x4e\\x42\\x8c\\x7d\\x8c\\x9d\\xaa\\x41\\xec\\x61\\xfd\\xba\\xbb\\x85\\x72\\x5b\\x9e\\xf5\\x74\\x71\\x1c\\xe4\\x8e\\x97\\xd5\\xbb\\xa1\\xb9\\x6a\\x9d\\xdc\\xca\\x07\\x13\\x57\\xa1\\x83\\xda\\x04\\x80\\x7b\\xe1\\x2a\\x8a\\xe7\\xb0\\x69\\xe1\\xf1\\x2a\\x88\\x4b\\xd1\\xc1\\x59\\xa3\\xf9\\x06\\xaa\\x8a\\xbc\\xca\\xdf\\xe6\\x3c\\x8b\\x4c\\x1c\\xfc\\x63\\x5b\\x66\\x41\\x56\\x8a\\x72\\xfe\\x61\\x4f\\xab\\x6d\\x68\\x93\\xaa\\x01\\xc5\\x2b\\x0c\\x15\\x0e\\x5d\\xdd\\x90\\x94\\x3e\\xe9\\xe3\\x69\\x57\\x2b\\x8d\\xf1\\x63\\xa4\\x84\\x63\\x64\\xab\\x0b\\x3f\\x4a\\x94\\xa4\\x18\\xba\\xaf\\x43\\xed\\x12\\x0d\\x70\\x47\\xe3\\x59\\x75\\xfe\\x30\\x66\\x40\\xa3\\x07\\x25\\x8f\\xf6\\x7a\\x20\\x03\\xdc\\xd3\\xc6\\x4a\\x4f\\xcb\\xaa\\x17\\x11\\x5e\\x54\\x22\\x25\\x17\\x55\\x33\\x59\\xd5\\x4c\\xd1\\x30\\xf5\\x4c\\xa2\\x86\\xf8\\x5f\\xb7\\x68\\x68\\xc0\\x9a\\x19\\x68\\xca\\x0d\\x9d\\x57\\xd4\\xd2\\x60\\x50\\xba\\xb7\\x97\\x2f\\x33\\x6b\\xa9\\xa2\\xc9\\x25\\x4d\\xaf\\xb0\\xc4\\x50\\x6f\\xe8\\x8e\\xdc\\xdc\\x4c\\x01\\x79\\x1c\\x76\\x1e\\xfb\\x20\\x41\\x2f\\xba\\xb0\\x12\\xe0\\xc5\\x78\\x7e\\x88\\xd6\\x0c\\xf5\\x55\\x74\\x97\\xda\\x23\\x8a\\xee\\x52\\x7b\\xa4\\x91\\x3e\\xf4\\xf0\\xb9\\x4f\\x1a\\xcd\\x9d\\xa9\\x12\\x0b\\x5a\\x43\\x51\\xee\\x70\\x7a\\x71\\x0c\\x9d\\x4b\\xd4\\x84\\xc9\\x78\\xcf\\x32\\x59\\x71\\xd5\\x91\\x37\\xa7\\x78\\xef\\x51\\x21\\x31\\x65\\x31\\xab\\x82\\xf0\\x3e\\x30\\xb4\\xb0\\x71\\xd4\\x36\\xe8\\x18\\x18\\xd7\\x26\\x21\\x36\\xaf\\x65\\x62\\x95\\xfc\\x8a\\x22\\xd3\\x09\\x32\\xeb\\x18\\x97\\xb4\\x7d\\x05\\xc5\\x3e\\x3a\\x50\\x7f\\xde\\x9c\\x88\\x4c\\xcc\\x4b\\xc0\\x39\\x0b\\x40\\x3a\\xe6\\x9d\\x3f\\xcd\\x65\\x06\\xee\\xa4\\x41\\x5f\\xaf\\x9a\\xc9\\x4b\\x7c\\x95\\xb2\\x14\\x11\\xc5\\x56\\x65\\x23\\x5f\\x89\\xe4\\xa4\\xaf\\xcb\\xcb\\x57\\x43\\xb7\\x21\\x3b\\x59\\x46\\xed\\xe3\\x42\\x37\\xb7\\x4a\\xe7\\xf3\\x92\\x4b\\xe3\\xf1\\x0c\\x30\\x32\\x8b\\xe4\\xcc\\x89\\x53\\x5e\\xc0\\xb9\\x41\\x41\\x5b\\xe9\\x08\\xb7\\x32\\x83\\x36\\xe2\\xc6\\x6c\\x8c\\xe1\\x4d\\x71\\xe3\\x49\\xff\\x3d\\x7c\\x0a\\x90\\x1a\\x31\\x2f\\x0e\\x6d\\x0d\\x52\\xed\\xe5\\xa2\\xbd\\x97\\xe7\\x51\\xd3\\x5e\\xe5\\x62\\x13\\x84\\x6f\\x2f\\x12\\xb1\\x05\\x44\\x6b\\xbc\\xa0\\x26\\x5b\\xbd\\x6e\\x32\\x71\\x85\\x4a\\x6e\\x33\\x15\\xd0\\xaf\\x99\\x6a\\xe0\\xdb\\xb5\\xaa\\xff\\xde\\xca\\x0c\\x51\\x69\\xa3\\x3b\\x4a\\x75\\x48\\x2a\\x61\\x52\\x02\\x12\\x5f\\x9b\\xb9\\x45\\x57\\xcf\\x4e\\xf7\\xab\\xaf\\xbe\\xc2\\x00\\x7c\\x63\\x0c\\xb4\\x95\\x39\\xc6\\x56\\x38\\x8b\\xf6\\x43\\x5f\\xe4\\xa6\\x68\\x15\\xab\\xce\\x80\\x78\\x06\\x36\\xa3\\xa2\\x98\\xe0\\xab\\x8b\\x5f\\x17\\xb6\\xbe\\x1d\\x51\\xe6\\xdd\\x51\\xde\\x15\\x05\\xf8\\xa9\\xf3\\xee\\x28\\xef\\x92\\xc2\\x0b\\xe3\\x6d\\x74\\x0d\\x10\\x17\\x57\\x06\\x48\\x76\\x43\\x8f\\x50\\x9b\\x46\\xa2\\x16\\x0e\\x1a\\x47\\xd3\\x52\\x8c\\x29\\xd1\\xc3\\x98\\x12\\x64\\x67\\x8a\\x16\\x43\\xd5\\xad\\x7a\\xdb\\x88\\xfc\\x67\\xe8\\xb2\\x88\\xee\\x96\\x7b\\x19\\x6a\\x84\\xe0\\x10\\xf7\\x19\\xb9\\xab\\xc5\\xe8\\x1c\\x01\\xf0\\x94\\xdc\\x04\\x4a\\xc8\\x50\\x42\\x7a\\xa9\\xd2\\xf1\\x52\\xce\\xf1\\x50\\x82\\x58\\xf4\\x34\\x18\\xce\\xd8\\x75\\xa4\\xee\\x34\\x64\\x74\\x27\\xd3\\x1c\\x5f\\xb1\\x05\\x73\\x3d\\x22\\xfc\\x4c\\x9a\\x07\\xd4\\x4b\\xd4\\xeb\\x06\\xe0\\xf9\\x64\\x14\\x8f\\xd3\\x51\\x8a\\xbe\\x19\\xba\\x26\\xa8\\x37\\x55\\x57\\x6e\\x6d\\x30\\xac\\x3e\\x1c\\x69\\xbc\\x21\\x42\\x5a\\x68\\x96\\xe6\\x86\\x0a\\x80\\x16\\x2c\\x47\\x68\\x36\\x6d\\xd4\\x79\\x05\\x75\\xe1\\xe5\\x0e\\x91\\x15\\x90\\x1a\\x75\\x03\\x65\\x2b\\x93\\xeb\\x01\\xe7\\xf2\\xa6\\xb9\\x90\\x9b\\x3d\\x1c\\x85\\x78\\x07\\x8c\\xf1\\xe1\\xf8\\xf8\\x08\\x2a\\x08\\xd1\\x15\\x2e\\xe4\\xa1\\x91\\xc0\\xf0\\x96\\x85\\xd1\\x66\\x62\\xcd\\xc7\\x57\\x37\\x37\\x57\\x9c\\xcf\\x8f\\x8f\\x61\\x86\\x4e\\x61\\x16\\x27\\x6b\\x1a\\x00\\x9a\\x7e\\xe3\\x13\\x0f\\x19\\x85\\x9c\\xf4\\x80\\x91\\xd0\\xb3\\x52\\x62\\xd4\\x2a\\x98\\x26\\x19\\x7e\\x69\\x8d\\x91\\x74\\x17\\x68\\x60\\xb5\\x43\\x53\\xab\\x25\\x3e\\x9d\\x01\\x98\\xc3\\xfe\\xa1\\xd9\\xa9\\x9e\\x19\\x39\\x23\\x0c\\x8d\\x0d\\xf9\\x9a\\xa1\\xad\\x21\\xdf\\xe9\\x0b\\x30\\x70\\xe3\\x9c\\xc1\\xb7\\xcc\\xb0\\xfa\\x83\\x8c\\x40\\xfa\\x6c\\x5d\\xc8\\xe9\\xa0\\xf2\\xde\\x1e\\xa1\\xd9\\xc9\\x19\\xab\\xf7\\xc0\\x65\\x43\\xad\\xbb\\x8d\\x24\\x8d\\x67\\x1c\\xa8\\xe4\\x8e\\xe3\\x74\\x49\\x59\\xe7\\x22\\x16\\x85\\x78\\x60\\x96\\x60\\xad\\x6f\\x58\\xd0\\x10\\x8c\\x47\\x7b\\x16\\x41\\xd5\\xde\\x96\\xf4\\xd9\\x96\\x17\\x2e\\xcf\\x1c\\x49\\x84\\x02\\x46\\x91\\x2f\\x3b\\x34\\x98\\x71\\x38\\x46\\xd9\\xab\\x59\\x01\\xba\\xb8\\xac\\xe2\\x07\\x90\\x97\\x4a\\x47\\x36\\xb4\\x80\\x9c\\x94\\x6a\\xc4\\x10\\xbc\\x47\\x6d\\x03\\x9b\\xcc\\x15\\xb8\\xa3\\x2b\\x58\\x10\\x69\\x58\\x40\\x96\\x9f\\x14\\xbe\\xfd\\xa6\\x56\\xbf\\x17\\x2a\\x3f\\xec\\x3c\\x19\\x3b\\x70\\x94\\x3a\\x3c\\x45\\x01\\x50\\xa6\\xae\\x04\\xed\\x3e\\x72\\xad\\xcc\\x4b\\x29\\x62\\x67\\x50\\x5f\\x56\\x4d\\x81\\xf7\\x6b\\xc6\\x69\\xe8\\x50\\x00\\xbe\\xc0\\xf6\\x20\\x33\\x5e\\x14\\x0d\\x45\\xf0\\xf6\\x1b\\x59\\x6a\\x24\\xba\\x44\\x80\\xbb\\x21\\x34\\x12\\x3b\\x11\\x2c\\x15\\xd1\\xe1\\x2e\\x06\\x4d\\x88\\x9d\\x52\\x1a\\x73\\xe9\\x4c\\x99\\x4e\\x36\\x74\\x08\\x6d\\xe8\\x2c\\x39\\x17\\x5e\\x31\\x55\\x93\\x81\\x19\\x97\\xfb\\x6d\\xd4\\x30\\xb2\\xd4\\x2b\\x51\\xd1\\x29\\x4a\\x86\\x4e\\x31\\xb5\\x81\\x71\\x33\\x54\\x02\\x91\\xe9\\x8c\\xb7\\x57\\x14\\x30\\x6b\\x05\\xa4\\x26\\x62\\x5a\\x78\\x83\\x56\\xf9\\x67\\xad\\xe5\\x10\\x3d\\xc0\\x7b\\x11\\xcc\\x7e\\x84\\x37\\x8a\\x87\\x1e\\xde\\x41\\xd8\\xcd\\x5d\\x4e\\x64\\xb0\\x4b\\x6f\\xef\\x5d\\x8a\\xaa\\xb6\\x76\\x4d\\x32\\xe3\\xd5\\x1e\\xde\\xef\\x6b\\xbc\\x5f\\xf5\\x89\\x19\\x5c\\xa3\\xe7\\x45\\x44\\x89\\x4a\\x7e\\xbb\\x59\\x2b\\x83\\xcd\\x86\\x8d\\xc2\\xf2\\xa0\\xa8\\xda\\xd4\\x42\\x44\\x6d\\x99\\x56\\x37\\xa8\\x66\\xb6\\x9e\\x5a\\xf8\\xea\\x1b\\x7d\\x7b\\x6f\\xd2\\x0c\\x03\\x57\\x23\\xd3\\x43\\x82\\x5a\\x5c\\x43\\xa3\\xbd\\x77\\x87\\xa9\\x8d\\xaa\\x5c\\x93\\xc8\\x00\\x82\\x0d\\xc8\\x90\\x9e\\x26\\x6f\\x0c\\x79\\xfd\\xfd\\xab\\x8b\\xd7\\x8c\\xa9\\x05\\x86\\x9c\\x52\\x3c\\x69\\x1c\\xf1\\x5f\\xee\\x5f\\xe2\\x07\\x82\\x94\\x2e\\xf5\\x32\\x43\\x7e\\xb9\\xd2\\x8d\\x5a\\xde\\x18\\x43\\xc1\\x78\\xd2\\x70\\xd0\\x76\\x3e\\x1e\\xe8\\x39\\xbe\\xcc\\xb7\\x6c\\x8e\\xaf\\x73\\xf3\\x4a\\xb7\\x6f\\x5a\\x94\\xc3\\x16\\xe8\\xa8\\x13\\xba\\xd1\\x08\\x0e\\x42\\x21\\xa9\\x1c\\x2c\\x4a\\x5e\\x71\\x1e\\xa5\\x21\\x71\\x37\\xdf\\x91\\x6b\\x9c\\x87\\x57\\x85\\x8f\\x2a\\xed\\x20\\xd2\\x75\\xb0\\xae\\x65\\x0f\\x1d\\x00\\xfb\\x36\\x93\\x32\\x73\\xe4\\x16\\x29\\xa0\\x2f\\x7c\\xd1\\x2e\\x5a\\xd8\\xa3\\x12\\xbb\\x13\\x99\\x02\\xe5\\xe8\\x93\\x5c\\xda\\x1e\\x88\\x71\\x31\\xa1\\x4b\\xe1\\xfc\\xa9\\x68\\x84\\x8a\\xf9\\xb5\\xb5\\x94\\x48\\x06\\x4b\\x9f\\xc9\\x49\\xe3\\xcd\\xb2\\x7d\\x6c\\x4b\\xd1\\xc9\\x26\\xbd\\xf7\\xcf\\x1e\\xcc\\x94\\x56\\xca\\x24\\x4b\\x25\\xa9\\x80\\x71\\x27\\xd4\\x3d\\x12\\xf8\\x88\\x5c\\xa3\\x1b\\x7e\\x2c\\x51\\x53\\xe8\\x2a\\x8f\\x4d\\x75\\x2b\\x64\\x24\\x2f\\x18\\x05\\x46\\x7d\\x5a\\x56\\x03\\x8d\\xc6\\x29\\xce\\x28\\x9a\\xc9\\x49\\xe1\\x04\\x85\\x03\\x88\\x28\\xcc\\x28\\x72\\xe6\\x50\\x02\\x0e\\xc4\\x22\\x4e\\x53\\xb2\\x1d\\xc3\\xa2\\x78\\x98\\x90\\xc2\\xc5\\x9b\\xd1\\x0c\\x89\\x6f\\x63\\x62\\x26\\x1f\\xa8\\x88\\x7f\\x97\\x56\\x52\\x56\\x58\\xf4\\x12\\xdb\\x49\\x6e\\x19\\x56\\x77\\x67\\x56\\x6a\\x4b\\xe5\\xbc\\xf5\\xd7\\x86\\xe9\\xe1\\x4f\\x7b\\x33\\x49\\x12\\x66\\xba\\x73\\xb8\\x7f\\xbf\\x7a\\xdc\\x93\\x74\\x07\\xde\\x0b\\x7c\\x9a\\x90\\xad\\x15\\x5d\\xb3\\x27\\x4d\\x16\\x6c\\x38\\xa1\\x57\\x22\\xcb\\x05\\x79\\x7c\\x14\\xfb\\x5f\\xe5\\x3d\\x99\\x3c\\x40\\x71\\x95\\xbc\\xd0\\x12\\x6a\\x4a\\x3d\\x32\\x2f\\x07\\x12\\xc7\\xd6\\x97\\xf9\\xe2\\x4a\\xd2\\xe7\\x82\\x3e\\xef\\x2d\\x66\\x4d\\xbf\\x06\\xdd\\xcb\\x28\\x17\\x21\\x05\\x41\\xa6\\x90\\xe0\\x5e\\x75\\x3b\\x22\\x12\\xfa\\x64\\xf2\\x62\\x35\\x65\\x72\\x3f\\x18\\xa3\\xaf\\x59\\x3f\\xab\\x11\\x01\\xe4\\xf0\\xe0\\xc7\\xc3\\xc9\\x4f\\x91\\xff\\x0f\\xfa\\x8e\\x66\\x93\\x1f\\x4a\\xff\\xa7\\x4a\\xd1\\x93\\xca\\xab\\x50\\x19\\xb9\\x96\\x05\\x74\\x5d\\x43\\x02\\x2f\\x6b\\x0c\\x45\\x63\\x70\\x91\\xc6\\x4a\\xa7\\xc8\\x57\\x13\\x4a\\x65\\x41\\xd5\\xe3\\x7d\\x9f\\xf3\\x3a\\x82\\x15\\xe6\\x87\\xf9\\x99\\xa7\\xeb\\x20\\x32\\x62\\x09\\x16\\xf7\\xc4\\xb8\\x4a\\x60\\x0d\\x90\\x17\\x7e\\x55\\xae\\x2f\\x45\\xa6\\x82\\x8e\\x25\\x58\\x0b\\x9d\\xae\\x83\\xcd\\xec\\x55\\x82\\x91\\x2e\\xa8\\x60\\x51\\x15\\x7c\\x83\\x4a\\xa7\\x43\\xa5\\x23\\xcd\\xde\\xda\\x86\\xf5\\x86\\xb0\\xbe\\x29\\xa9\\xeb\\x61\\x1c\\xac\\x37\\x9f\\xd6\\x68\\xa6\\x1b\\x45\\x87\\x51\\xb3\\xae\\x4f\\x2b\\x2e\\x74\\x71\\x81\\xc5\\x8b\\x28\\x7c\\x9b\\x1f\\x9a\\xb1\\x3f\\xe4\\xb9\\xd7\\x79\\xbe\\x4d\\xb3\\x75\\x60\\x4c\\xbe\\x89\\xe8\\xbe\\xd0\\x98\\x0f\\x33\\x27\\xb0\\xad\\x0f\\xd5\\xf7\\x97\\x8a\\x6a\\x87\\x91\\xf3\\x70\\xbc\\xe9\\x66\\xc7\\xf7\\xad\\x6e\\x8c\\xfd\\x77\\xdb\\x0c\\xb2\\xf7\\x67\\x74\\x9f\\x40\\x8b\\xa6\\xb6\\xa3\\x7e\\x69\\x09\\xe0\\xc5\\x98\\x1a\\x14\\x76\\xe1\\x0c\\x77\\x8c\\x1a\\xff\\x6a\\xd6\\x48\\x80\\x0e\\x00\\xce\\x6f\\xf2\\x33\\x5e\\xab\\x66\\x64\\xfe\\x4d\\x73\\x92\\xe4\\x2d\\x2f\\x63\\x65\\x0c\\xfa\\x5a\\xf5\\x49\\x18\\x80\\x18\\xa5\\x81\\xf4\\x59\\xd6\\x31\\x44\\xd0\\x34\\x60\\xa0\\x24\\xe1\\x12\\x3c\\x19\\x31\\x2b\\x8a\\x8a\\x7b\\x87\\x9a\\x10\\x48\\x17\\xbd\\xac\\x8a\\x86\\xd5\\x1d\\x3c\\x1a\\xf3\\x68\\x52\\x3a\\xd0\\x8c\\xdf\\x3d\\xd1\\x2f\\x8f\\x7c\\x54\\xd7\\x93\\xa8\\x13\\xde\\x86\\x36\\xc3\\xd6\\x78\\x0d\\xd3\\xf0\\xb5\\x57\\xda\\x4e\\x49\\x3a\\x43\\x6e\\x34\\x8c\\xef\\x94\\xe2\\x76\\x1f\\x51\\xf2\\x70\\x86\\x16\\xcc\\x86\\x78\\x78\\x7f\\x86\\x71\\x36\\x75\\x38\\xb6\\x80\\xa9\\x39\\x30\\x5d\\x64\\x5a\\x14\\x9a\\xca\\x21\\xbd\\x4e\\x14\\xcc\\x88\\x42\\x69\\x6b\\x26\\xdd\\x44\\x4b\\x7d\\x3d\\x29\\xeb\\xe4\\x1d\\x34\\x39\\x9e\\x3e\\x9d\\xe9\\xe0\\x35\\xd0\\xe2\\x82\\xb6\\xd9\\xeb\\x4c\\x2c\\xa2\\x6d\\x4d\\x11\\xab\\x6b\\x65\\xe8\\x62\\xcd\\x4c\\x5e\\x09\\x56\\x09\\xee\\xa7\\x4f\\x66\\x64\\xbd\\xf7\\x64\\xc6\\x3b\\xdd\\x8e\\xfb\\x75\\x64\\x29\\x25\\x1d\\xe4\\x1c\\xd2\\xa5\\x6b\\xd8\\x04\\xef\\x2c\\x3a\\x4c\\xd4\\x2d\\x40\\x3f\\xb4\\xca\\xe4\\xa0\\x52\\x5c\\x54\\xb5\\xa0\\x59\\x22\\x3c\\xef\\xd6\\x97\\x69\\x7c\\x7b\\xdb\\x6e\\xee\\x77\\xe4\\x24\\x9e\\xce\\xf0\\xf2\\x78\\x52\\xe7\\x54\\x7a\\x18\\x49\\x83\\xf3\\x0e\\x93\\x7d\\xa2\\xbe\\xb8\\xd0\\x89\\x51\\x3d\\xbb\\xaa\\x27\\xa6\\x85\\xff\\xd7\\x06\\x14\\xf4\\x0e\\x6d\\x9a\\xc4\\xd8\\x32\\x6e\\xb7\\x3f\\x30\\xca\\xfe\\xde\\xa0\\x88\\xbe\\x46\\x62\\x6d\\x58\\xe3\\xfa\\x04\\x8d\\x17\\x77\\xb1\\xd2\\x04\\x5f\\xe6\\x96\\xf0\\x20\\x8b\\x39\\xc3\\x85\\x9e\\xe1\\x42\\xce\\xb0\\xed\\x3e\\x70\\xad\\x8e\\xe8\\x1c\\x61\\x70\\x08\\xd4\\x7a\\x39\\x56\\xe7\\x4b\\x5c\\x32\\x53\\xe6\\xf9\\xaf\\xc3\\xf8\\xa2\\x16\\x3f\\x2a\\xb7\\x03\\xec\\x7b\\x7f\\x9c\\x4c\\xfa\\x3e\\xd4\\xe5\\xd5\\xc3\\xa1\\x7b\\x83\\x30\\x72\\x53\\x1d\\xb3\\xa5\\xb0\\x0f\\x23\\x05\\x55\\x93\\x36\\x3d\\x52\\xb5\\xc8\\x57\\x2f\\x69\\x84\\x58\\x36\\x28\\x5f\\x0a\\x01\\x53\\x5d\\x91\\x94\\xee\\x21\\x91\\xc2\\x20\\x7d\\x12\\x1d\\x54\\x14\\x4b\\xb0\\xf4\\xb3\\xd0\\x89\\x20\\xbf\\x29\\x60\\x1b\\xd0\\x82\\x80\\xca\\x59\\x56\\xd6\\x44\\x31\\x52\\xf6\\x5a\\x62\\x2c\\x1a\\x82\\xdd\\x69\\xf7\\x32\\xc8\\x0d\\x58\\x29\\xee\\x45\\x34\\xae\\xa8\\x6b\\xce\\xcc\\x9a\\x0a\\xac\\xa9\\x09\\x75\\x35\\x31\\x0a\\x20\\x4d\\x67\\x65\\x72\\xfa\\xfc\\x6d\\xed\\xb6\\x52\\x55\\x87\\x4e\\x71\\xaa\\xab\\x40\\x8d\\xa5\\x58\\x5f\\x0b\\x2d\\xe8\\x50\\x25\\x00\\xe7\\xb2\\xea\\x3a\\x83\\x44\\xfa\\x8b\\xa9\\x48\\x11\\xc6\\x6e\\x2d\\x31\\x46\\x14\\xcb\\x0d\\xa8\\x54\\x5a\\x21\\x9e\\x33\\x5e\\x7c\\x39\\x98\\x0c\\x7d\\x72\\x56\\x8e\\xf2\\x6f\\xa3\\x24\\x02\\x04\\x98\\x7b\\xb1\\x34\\xec\\x16\\xca\\x3b\\x22\\x1f\\xc7\\xa3\\xd8\\x75\\x2b\\x26\\x7e\\x45\\xb1\\x00\\x56\\xa3\\x15\\x7c\\x53\\x77\\x2c\\x44\\x56\\x6c\\x3b\\x2b\\x7b\\x64\\xbc\\xaa\\x23\\x47\\xe2\\x10\\xe3\\x2b\\xd6\\x74\\x9a\\x8f\\x8c\\xca\\x16\\x40\\x05\\xad\\xc6\\xfd\\xd1\\xca\\xf3\\xda\\xd5\\x61\\xa6\\x18\\x38\\xbf\\x74\\x1a\\xcf\\x4e\\x03\\xea\\x84\\x8a\\x46\\xa0\\x95\\x4f\\x90\\x84\\x31\\x08\\xc6\\xe1\\x28\\x87\\xe2\\xa3\\x14\\xed\\x00\\x88\\x90\\x23\\x45\\x78\\xa5\\x72\\x53\\x33\\xd8\\x46\\x9a\\x5a\\xf7\\x77\\xd4\\x5e\\x60\\xad\\x07\\x3c\\x8b\\x47\\xfb\\x76\\x6b\\x93\\x82\\x9f\\xc5\\x7e\\x47\\xd7\\x02\\x07\\xb2\\xd8\\x6d\\x44\\xba\\x78\\x20\\xb1\\x50\\x0d\\x49\\xb4\\x13\\x45\\x56\\x91\\xa9\\x70\\xb2\\xbb\\x03\\x96\\xf4\\xd4\\x82\\x02\\xb9\\xa9\\xfd\\x43\\x42\\x2e\\x90\\x92\\x18\\x08\\x6f\\x30\\xac\\x05\\xcc\\x18\\x0c\\x88\\x7b\\xc6\\x47\\x5a\\xd0\\xfb\\x18\\x86\\xa4\\x17\\x59\\x21\\x31\\x0d\\x2e\\xec\\x70\\x20\\x5f\\x27\\x28\\xeb\\xf4\\xd1\\x66\\x07\\x26\\xe1\\x0e\\x2c\\x8f\\x50\\x83\\xd2\\x90\\x16\\x56\\xc8\\x1e\\xf0\\x7b\\xca\\xcc\\x63\\xfc\\x5d\\x85\\x5b\\x6a\\xd5\\xc7\\x81\\x93\\x2d\\x91\\xcc\\x8f\\x91\\x0c\\x4a\\x07\\xbf\\x83\\x9e\\x21\\x9c\\xff\\x8c\\xf3\\x9e\\x7d\\x1e\\xf9\\x58\\x9d\\x72\\x71\\xd7\\x29\\xcf\\x88\\xc4\\xca\\xda\\x67\\x29\\x31\\x49\\x2c\\x81\\x43\\x56\\x79\\x0e\\xee\\x96\\x9a\\xc4\\x12\\x4c\\xd2\\x63\\x59\\xeb\\xb0\\x9b\\x91\\x01\\x55\\x9f\\xfe\\x92\\x15\\x53\\x66\\xb1\\xdd\\xa4\\x49\\x23\\x3a\\x50\\x7a\\xcf\\xb0\\xe4\\x4c\\xe2\\xad\\xd2\\xd5\\x5c\\xd6\\x60\\x47\\x98\\x43\\x2b\\xb0\\xf2\\x3b\\xd6\\xf7\\xbb\\xe6\\xfa\\xca\\xd5\\xcd\\x1a\\xab\\xfb\\x63\\xf4\\x31\\x93\\xdd\\x62\\x52\\x43\\x78\\x8f\\x20\\xfe\\x5d\\xa6\\xa7\\x3f\\x47\\x7b\\x21\\xb3\\x6a\\x58\\x1a\\x4d\\x2d\\x40\\xf6\\x4b\\x81\\x88\\x16\\x30\\xb7\\xa2\\x14\\x49\\x22\\x53\\x4c\\x80\\x1a\\xc1\\x04\\xa6\\x6e\\x6c\\xc7\\x60\\xac\\xfd\\x1e\\xd0\\x62\\xde\\xc0\\xfe\\x52\\xeb\\x08\\x1b\\x71\\xa3\\x1b\\x51\\x57\\xf7\\x14\\x56\\x77\\xe8\\xe0\\x1e\\x14\\xae\\x00\\x3e\\x53\\xed\\x55\\x14\\xc2\\x57\\x12\\x81\\xbd\\x3d\\x97\\xdd\\x0f\\x20\\x92\\x51\\x22\\xcd\\x9e\\xd0\\xff\\x2a\\x1e\\x99\\x9a\\x72\\xf2\\x01\\xc8\\x6a\\x49\\x67\\x7a\\x4a\\xac\\xe4\\x2a\\xc8\\xf1\\xf6\\x41\\xe4\\x15\\x6f\\x6e\\xe4\\x78\\x23\\x3d\\xde\\xa8\\xa6\\xa3\\xc4\\x14\\xe6\\x63\\x56\\x85\\x8b\\x2a\\xba\\x81\\x8d\\xd1\\x9b\\x3e\\x83\\x17\\x8a\\x80\\xaf\\x40\\x16\\xb9\\xe0\\x1f\\x0a\\x5f\\x13\\xe4\\x81\\x5f\\x65\\xa4\\x48\\x67\\x51\\x55\\xe9\\x6b\\xd4\\x68\\x1b\\xc7\\x02\\xfd\\x8d\\x3e\\x1c\\x34\\xda\\x0d\\xb8\\xa2\\xb3\\x43\\xa0\\x16\\x29\\xba\\x4b\\x59\\x79\\x25\\x6b\\x10\\x69\\x85\\xdc\\x0a\\xdd\\x18\\x85\\xe2\\x7d\\x1b\\x1d\\x6a\\x43\\xbb\\x67\\xd5\\x62\\x0a\\xb7\\xbe\\x30\\x13\\x45\\x21\\xa1\\x9b\\x3b\\x01\\x64\\xcd\\xed\\x76\\x8f\\x65\\xaf\\xda\\xfd\\xae\\x3a\\x4d\\x9c\\xc5\\xff\\x7a\\xcf\\x15\\xf2\\x94\\xe6\\x8a\\x6a\\x18\\xf6\\x5d\\xe3\\xb8\\xe9\\x37\\x47\\x62\\x14\\xa5\\x41\\xb9\\x58\\xc8\\x6b\\x96\\x71\\x72\\xaa\\x71\\x7f\\xb8\\xc6\\x78\\xee\\x1c\\xf3\\xd7\\x41\\x32\\x6f\\x8e\\x96\\x85\\xf7\\x8c\\x77\\xcf\\xb8\\xfa\\xf4\\x04\\x52\\x42\\x1e\\x68\\x6b\\x08\\x9c\\x82\\xd3\\x52\\x5e\\x85\\x5b\\x4e\\x63\\x0f\\x1e\\x16\\xf8\\xd1\\x8b\\x31\\x48\\x87\\xb5\\xf0\\x72\\x73\\xc8\\x81\\x3b\\xc4\\xd8\\xb3\\xc6\\x90\\x73\\x77\\xe5\\x84\\xa8\\x0d\\x8b\\xd1\\x57\\xb1\\x16\\xaa\\xa4\\x7c\\x85\\xde\\x34\\x81\\x6d\\x0e\\x90\\x3a\\x7f\\xff\\x72\\xfe\\xbf\\x1d\\x9f\\x41\\x26\\x1d\\x1e\\x6a\\x6b\\xac\\xe6\\xce\\x80\\xfc\\xc6\\xc2\\x06\\x48\\xb2\\xe0\\xb2\\x1e\\x9a\\x0a\\xa3\\x98\\x9a\\x15\\x7b\\x6f\\xdd\\xef\\x9f\\x1b\\x4c\\x3d\\x00\\xda\\xd3\\x2a\\x43\\x3b\\xe8\\x5c\\x95\\x05\\x88\\x44\\x00\\x1f\\xd2\\x5e\\x4e\\xdc\\x85\\x22\\x7e\\xd6\\xe2\\x05\\x0d\\x02\\x9b\\xa6\\x14\\x69\\x0b\\xa2\\x47\\x96\\x66\\x6c\\xfa\\x44\\xab\\x1a\\xa1\\xa2\\x02\\xad\\xc0\\xce\\x46\\x76\\x30\\x05\\xd2\\x65\\x86\\x24\\xd1\\xbb\\x32\\x48\\x0a\\xbc\\x82\\x32\\x61\\xa2\\x97\\x1d\\xb2\\x86\\x4a\\x4d\\xd9\\x0c\\x19\\x51\\x93\\x61\\xdb\\x84\\xc2\\x1a\\xf5\\xfd\\x62\\x5a\\xcb\\xcf\\x02\\xa6\\xa3\\x29\\x56\\xe2\\xa8\\xcf\\xe3\\x0e\\xb4\\xb0\\x29\\xb3\\xbb\\x8b\\x28\\x2e\\x04\\xd0\\xc8\\xb6\\x74\\xe9\\x45\\xdb\\x62\\x25\\x79\\x4a\\x3f\\x57\\xf2\\x14\\x29\\xc9\\x53\\x5a\\x8d\\x36\\x3f\\x30\\xd3\\x01\\x66\\x90\\x84\\x4e\\x7b\\xc9\\x6a\\x5c\\x86\\x44\\x0c\\x99\\x26\\xfd\\xb4\\xa0\\x5b\\xff\\xc7\\x62\\x32\\xc5\\xfb\\x73\\xe0\\x1f\\x4a\\xab\\x81\\x4d\\x93\\x53\\xeb\\x4b\\xf9\\xf6\\xa9\\x76\\xb3\\xc2\\xcf\\xf8\\xd1\\x90\\x76\\xcf\\xee\\x21\\xfc\\xd4\\xba\\xde\\x62\\xd7\\x0d\\xbb\\x98\\xf4\\x5e\\x4a\\x4f\\x4c\\x0f\\xd9\\x14\\xa6\\xa6\\x50\\x25\\x72\\x28\\x68\\xa5\\xdd\\x88\\x05\\x59\\x9a\\x51\\xe5\\xb5\\x0a\\x42\\x45\\xb7\\x4c\\xab\\x0f\\x68\\x17\\xa1\\x6f\\x67\\x18\\xb5\\x08\\xa9\\x4f\\xe3\\xcd\\x60\\xdb\\x90\\xc8\\x07\\x79\\xb4\\x69\\x5d\\xed\\x4c\\x4a\\xd9\\x64\\x1c\\x68\\xa0\\x95\\x3e\\x63\\x71\\x4d\\x11\\x5d\\x76\\xc7\\xda\\x99\\x56\\x99\\xa2\\x5a\\x3b\\x34\\xb3\\xe6\\x48\\x3b\\xc1\\xc2\\xf9\\x45\\x2f\\x72\\x31\\x2e\\x3c\\x2b\\xdc\\x41\\x2f\\x9a\\xdd\\x43\\xb0\\x55\\x2b\\xd0\\x12\\xba\\x89\\xf6\\x39\\x34\\x29\\x2b\\x31\\xa6\\xeb\\x75\\x4d\\x31\\xb3\\xb0\\x67\\xbe\\x3c\\x3f\\xb7\\x77\\x52\\x38\\x1f\\x39\\x27\\x48\\x25\\x24\\x9f\\x49\\x7a\\x50\\xc0\\x61\\x3a\\x0a\\xe2\\x73\\x77\\xfa\\x34\\xa1\\x7d\\x8d\\x51\\x1d\\x71\\xe7\\xde\\x09\\xaf\\x84\\xde\\xb9\\xa6\\x25\\x56\\xba\\x6f\\xe4\\x21\\xb3\\xbb\\xc9\\x6d\\xa5\\x1e\\x55\\x1c\\x08\\x5a\\x9d\\xa8\\xa9\\x28\\xda\\x63\\xbb\\x7f\\x77\\x49\\xb2\\x1b\\x57\\x96\\x66\\xa6\\xf8\\x04\\x99\\x6d\\xf1\\x39\\x32\\xdb\\xe2\\xae\\x31\\xd3\\xf8\\x1a\\x97\\xea\\x94\\x69\\x9d\\x6a\\x38\\x10\\x44\\x69\\x43\\x7f\\x15\\x25\\x89\\xc8\\xe4\\x75\\x63\\x06\\xb8\\x6d\\xe6\\x49\\xcb\\x62\\x3f\\x4f\\xd0\\xcc\\x43\\x01\\xb2\\x9e\\x35\\x63\\x3e\\x85\\xcd\\x2c\\x22\\x99\\xb7\\x32\\xc4\\x8d\\x0c\\x78\\xe9\\xff\\x26\\x68\\xe7\\xc9\\xd3\\x5a\\x6a\\xa5\\xe4\\x54\\x09\\x3a\\x6b\\x15\\x1e\\x40\\x87\\xcc\\x76\\xa4\\x58\\x6a\\x60\\x18\\x6d\\xa5\\xb5\\x2f\\xbb\\x96\\x56\\x56\\x71\\x36\\x49\\xf9\\xa5\\xe2\\x6f\\x02\\x09\\x6e\\x95\\x93\\xcc\\x47\\xdb\\x2a\\xc3\\xc6\\xc2\\x89\\x5c\\x54\\xe0\\x63\\xa8\\x30\\x07\\x43\\x42\\x79\\x81\\x13\\x21\\x19\\x88\\x5e\\x0f\\x21\\x05\\x29\\x1b\\xcc\\x5c\\x0c\\xd0\\x56\\xc8\\x2f\\x4b\\x8a\\xbd\\xe3\\x62\\xec\\x27\\x72\\x39\\x07\\x5a\\x15\\x63\\x3f\\x49\\xab\\x8f\\x39\\x5f\\x79\\x39\\x5b\\xf3\\xa5\\xb7\\x60\\x3b\\x3e\\x77\\xe6\\xee\\xda\\x59\\xb3\\x33\\x2e\\xbc\\x8c\\x6d\\x79\\xee\\x2c\\xbd\\x95\\xb3\\x60\\x97\\xdc\\xea\\x8f\\xd7\\x13\\x6f\\xe0\\x0f\\xcc\\x78\\xbb\\x67\\xce\\x99\\xb3\\xf3\\xb6\\xce\\x16\\x7d\\xd7\\xad\\xad\\xb3\\xf6\\xe6\\xce\\xa5\\xdd\\xc3\\x8b\\x62\\x2c\\xf8\\x3c\\xf7\\xd6\\xf2\\xf5\\x9c\\x12\\x5d\\x95\\xf8\\x56\\x26\\xba\\x2a\\xf1\\x05\\xbf\\xf0\\x36\\xec\\x19\\xbf\\xf6\\xae\\xd8\\x2b\\x7e\\x0e\\xcf\\xcf\\xf9\\x5b\\xef\\x4a\\x83\\xcf\\x17\\xce\\x0b\\xf7\\x99\\xf3\\x6c\\xfc\\xca\\x79\\xe5\\x3e\\x77\\x9e\\xd3\\xed\\xfd\\xe7\\xd0\\xc0\\x5b\\x38\\x6e\\xd3\\x0b\\x2f\\x64\\xd7\\x48\\x0b\\x4d\\x2f\\x1c\\xd1\\x3b\\x63\\xd7\\xf8\\x77\\x66\\x5a\\xc0\\xb5\\x4f\\x95\\x09\\x7f\\x70\\xff\\xc5\\xf5\\x6d\\x9e\\xb0\\x89\\xf1\\x6a\\x81\\x00\\x65\\xd2\\x3a\\x44\\x26\\x4c\\xef\\x14\\x69\\xaf\\xe9\\x8c\\xcc\\x9b\\x70\\x52\\xb5\\xb2\\x6a\\xc9\\x5f\\x10\\xc6\\xdd\\xe0\\x6f\\x86\\x0a\\xb7\\xc5\\xe9\\x0a\\x99\\xa4\\x30\\x88\\x63\\x79\\xe1\\x08\\xc6\\x3f\\x5a\\x40\\x49\\x7b\\xa2\\x82\\xc3\\x4c\\xdd\\xa5\\x99\\x8c\\xc6\\x59\\xee\\xa6\\xf5\\x65\\x66\\xfb\\x79\\xed\\xa6\\x0c\\x7d\\xa4\\xe6\\x2b\\xa2\\xa3\\x4e\\xc3\\xa4\\x58\\x1f\\xed\\xb8\\x92\\x16\\xcb\\x70\\x0f\\x92\\xbe\\x79\\x86\\x4a\\xd3\\x57\\x68\\x73\\xf2\\x0a\\xe3\\x8c\\x2d\\x51\\x67\\x1a\\x75\\xdf\\x0a\\x0c\\x4c\\xd0\\x7d\\x52\\x5b\\x5d\\x6c\\x3f\\x1d\\x95\\x14\\x84\\x48\\x8a\\xee\\xee\\xd3\\xf5\\x4b\\x05\\x49\\x28\\x01\\x62\\x89\\x45\\x94\\x88\\x83\\xfa\\xac\\x43\\xc2\\x03\\x2a\\x58\\xde\\xd2\\x5d\\x2d\\x9f\\xa9\\x96\\x4a\\x79\\x2d\\xe1\\xe2\\x5a\\xc2\\x95\\x4c\\xe0\\x9c\\xf9\\xc0\\x5a\\xbe\\x88\\x89\\x85\\x47\\xbf\\x83\\x65\\x6a\\xd3\\x74\\x40\\x4b\\x29\\x41\\x3a\\x91\\x7c\\xce\\x0d\\x62\\xd4\\xc5\\xa0\\x01\\xd5\\x96\\x4d\\x98\\x22\\x57\\xe5\\xa5\\xa9\\x2a\\xda\\x98\\x39\\x28\\xbb\\xdb\\xf9\\xcb\\xb8\\x7d\\xf4\\x2a\\x6d\\xda\\xa7\\xd2\\x0d\\xc6\\xe6\\xad\\xf0\\xa4\\x11\\x9a\\xa2\\x12\\x83\\xfc\\x4d\\x50\\x89\\x51\\xd9\\xab\\x2a\\x75\\x6f\\xe7\\xfb\\x0e\\x23\\x35\\x87\\x8b\\x2b\\x30\\x2d\\x66\\x78\\x41\\x06\\x9e\\xf7\\xce\\x6f\\xb2\\x40\\xcd\\xab\\xa3\\xd5\\x9d\\x51\\x4a\\xea\\x46\\x0c\\xe5\\x43\\xd5\\xaf\\xf5\\xff\\x46\\xbf\\x7e\\xc3\\x7e\\xa9\\x1e\\x01\\x84\\xab\\x5a\\xac\\x54\\x30\\x07\\x1a\\xde\\xfd\\xaf\\x4d\\x48\\x35\\x15\\xfb\\xf3\\x70\\xa8\\xe1\\xb3\\xb4\\x65\\xdb\\xa4\\x98\\xb4\\x87\\x13\\x5a\\x36\\x9f\\x20\\xed\\x05\\x3c\\x2a\\xb9\\xed\\x80\\xa1\\x57\\xde\\x75\\xda\\xd6\\x6c\\x6d\\xef\\xa8\\xe7\\xa4\\xaa\\xa7\\x4f\\xf5\\x58\\x4a\\x94\\x92\\xd0\\x1a\\x24\\x54\\xd5\\xd4\\xa0\\x87\\x87\\xb3\\x99\\xbe\\xd5\\x23\\x41\\x62\\x03\\x86\\x69\\x37\\x5b\\xba\\xfc\\xc4\\x96\\x92\\x03\\xbd\\xbc\\x48\\x2b\\x99\\xb2\\x06\\x72\\xa7\\x03\\x8c\\x2e\\x25\\x9f\\x8f\\x78\\x1d\\x3d\\x61\\xff\\x9b\\x3b\\xb4\\xcd\\x1d\\x5d\\x7b\\x71\\xb6\\xf2\\xc1\\x7a\\x75\\x3a\\xac\\x0a\\x19\\x4d\\xf2\\x7e\\x19\\x3a\\x0e\\xbd\\x32\\x30\\x9e\\xcb\\x48\\xde\\x19\\x8f\\x16\\x33\\x9d\\x9f\\x3b\\xae\\x85\\x57\\x62\\x7a\\x43\\x07\\xef\\xca\\xec\\x9d\\xd8\\x74\\x7d\\xaf\\x85\\xf7\\x63\\xd2\\xb7\\x41\\xf5\\x0d\\xb3\\xa9\\x87\\x01\\xc9\\xb4\\xc8\\xbd\\x0d\\x95\\x9a\\xba\\xe9\\xf1\\x00\\x2f\\x6a\\x2b\\x94\\x69\\x36\\x7a\\x7a\\x84\\xae\\x8b\\x2e\\x12\\x9d\\xe7\\x50\\x25\\x32\\xd9\\x2e\\x36\\xa2\\x9a\\x40\\xce\\xdb\\xc5\\x06\\xaa\\x26\\x31\\x72\\x79\\x9d\\x4e\\x5d\\x08\\xaa\\xf4\\x46\\xf3\\x46\\xc4\\xe3\\xe1\\x28\\xae\\xa2\\x4e\\xa0\\x0e\\x00\\xdb\\xb4\\x55\\xf3\\xd8\\x19\\xc0\\x5d\\xd8\\x83\\xf3\\xcf\\x6c\\xe1\\xb6\\x56\\x8a\\xe6\\x54\\xd9\\xc8\\x9c\\x2e\\xe0\\xfd\\x83\\xf6\\x74\\xd1\\xb7\\x7a\\xba\\x72\\x5d\\x5b\\x8e\\xb5\\x69\\x1a\\xcd\\xb0\\x5e\\x4c\\xf7\\xc3\\x49\\x90\\xac\\x90\\xc2\\x17\\x90\\x25\\x53\\x52\\x93\\x2b\\x78\\x13\\x23\\x6a\\x6f\\x6a\\x81\\x61\\x70\\x1a\\x8e\\xec\\xda\\x50\\x07\\xcd\\x58\\x98\\xf2\\xa2\\x98\\x96\\x8e\\x95\\xea\\x78\\xdc\\x00\\x6a\\xf0\\x4d\\x87\\xe4\\x9e\\x1d\\x32\\x85\\x3f\\x4f\\x55\\x98\\x82\\x7a\\x3b\\xef\\x6f\\xb6\\x82\\xdc\\xeb\\xf7\\xc1\\x42\\x26\\x37\\x5a\\x26\\x37\\xda\\xb4\\x64\\xf8\\x1f\\x41\\x82\\x01\\x41\\x02\\xec\\xfb\\x14\\xba\\x09\\xff\\x11\\xdc\\xc0\\xb0\\x27\\x25\\x81\\x91\\x88\\xe1\\xad\\xdd\\xaf\\x52\\xeb\\x79\\x8c\\x01\\x6f\\xf0\\x93\\x7c\\x09\\x6c\\x15\\x17\\x45\\x9f\\x56\\x24\\xfa\\x6d\\x02\\x38\\xe8\\xcc\\x25\\xa1\\x0c\\xf0\\xad\\x5a\\x39\\xad\\x14\\x43\\x12\\xb2\\x06\\xd5\\xe7\\x40\\x7f\\x46\\xa3\\xaa\\xe7\\xa9\\x15\\x52\\xfc\\xa4\\x5a\\xa1\\x26\\x7d\\xb0\\xc2\\xfa\\x02\\x71\\xbc\\xff\\xe6\\x00\\x94\\x7a\\xbb\\x37\\x3d\\x0f\\x9b\\xd3\\x63\\x1a\\x2b\\x4e\\xd1\\xac\\x0d\\x3d\\x88\\xeb\\xa9\\x8a\\xb8\\x5c\\x48\\xf8\\x8b\\xb1\\x47\\x4e\\x4f\\xd0\\x58\\x91\\x0c\\xb1\\x94\\x91\\x90\\x54\\xe6\\xa6\\xfa\\x65\\xa0\\x9c\\x58\\x94\\x57\\x8b\\x9c\\x93\\x48\\x6e\\x2b\\x3d\\x5b\\x36\\xc3\\x28\\xf6\\x58\\x5b\\x69\\xd4\\xa6\\x47\\xde\\xaa\\xb7\\x35\\x4f\\x85\\x9e\\x10\\x41\\x91\\x86\\x6a\\xf1\\xf6\\xfe\\xd0\\x5f\\xa4\\x56\\x3b\\x66\\xef\\xde\\xe0\\x4a\\xf7\\xa1\\x56\\x32\\x4e\\xe5\\x00\\x1f\\xe2\\xce\\x84\\x2e\\x7d\\x59\\xce\\x74\\x9b\\x42\\xad\\x8d\\x7a\\xd1\\x43\\x2c\\xf8\\xf4\\xf0\\xfa\\x57\\xc3\\x8b\\x1a\\x75\\xb5\\x46\\x22\\x0e\\xaf\\xb8\\xd0\\x03\\x2c\\x1a\\x2b\\x5e\\x1c\\x18\\xe0\\xb3\\xb4\\x69\\x99\\xa8\\xe5\\x01\\xd2\\x28\\xc2\\xf0\\x78\\x52\\xe7\\x51\\x1f\\x49\\xe9\\x81\\x12\\x48\\x6f\\x93\\x2a\\x0a\\x3f\\x79\\x9e\\x50\\x18\\x59\\xf2\\x4d\\x8a\\xab\\xed\\x1a\\xe3\\x49\\x89\\x7b\\x82\\x70\\x31\\x2f\\x1c\\x49\\x39\\xe0\\x49\\x77\\xac\\xc8\\x2d\\xd1\\xba\\x18\\xb7\\x29\\xa5\\x0c\\xaa\\x94\\x14\\x52\\x6a\\x71\\x2a\\x9d\\x52\\xc3\\x4e\\x36\\xfd\\x98\\x1f\\xb8\\x8b\\x17\\xfe\\x39\\x68\\x58\\x00\\x4f\\x27\\xf8\\x74\\x62\\xde\\xb0\\x90\\xd6\\xee\\x3e\\xf2\\x04\\x3c\\xa7\\xf9\\x7f\\x16\\xa3\\xe1\\x8f\\x5a\\x0c\\x78\\x11\\xd5\\xcb\\x2b\\x33\\xe5\\x95\\x99\\xf2\\xdc\\x4c\\x79\\x8e\\x29\\xe6\\x25\\x0a\\x8d\\x8e\\xd2\\xee\\x53\\x57\\x7f\\xca\\x5b\\x03\\x08\\x19\\x1b\\x96\\xb2\\xf7\\x10\\x23\\xe4\\x16\\x23\\x35\\x2a\\x0d\\xf4\\x46\\xb3\\x0a\\xed\\xa0\\xb3\\x42\\xc3\\xb1\\x08\\xa6\\x10\\x68\\x55\\x4c\\x21\\x48\\x09\\x70\\xc3\\x25\\x73\\x89\\xde\\xb0\\x02\\x83\\x98\\x2d\\x35\\xc3\\x3f\\xbe\\xdc\\xdf\\xf3\\xb4\\xfc\\x64\\x54\\x48\\xbd\\x83\\x75\\xf7\\x4c\\x70\\x4c\\x8b\\x4d\\x00\\xb9\\xc0\\xb6\\x08\\x16\\xc3\\x1f\\x6c\\x8a\\x4c\\x34\\x28\\xa4\\x72\\x0a\\x5f\\x79\\x4a\\x5f\\x79\\xdf\\x07\\x52\\x1f\\x3f\\xf4\\xd0\\x69\\x56\\x7e\\x84\\x47\\xbc\\xbb\\x8a\\x5c\\x53\\x58\\x39\\xfe\\x8a\\x5c\\x35\\x4e\\x9c\\xc2\\xe0\\x4c\\xd1\\xe9\\x00\\x6b\\x29\\x1d\\xc1\\x54\\x4d\\xa5\\x93\\xa9\\x18\\x3e\\x01\\x57\\xdd\\xe0\\xd0\\x0f\\x72\\x1a\\xaa\\xa4\\x6f\\x21\\x83\\xbc\\xf6\\x4c\\x4e\\xb6\\x21\\x9e\\x0b\\x3c\\xf9\\x15\\x56\\xe2\\xb1\\x63\\x0d\\x5c\\xac\\xdc\\xc1\\x3f\\xb5\\xfd\\xe2\\xb4\\xbc\\xb9\\xe9\\x53\\xab\\x0e\\x3e\\xd5\\xe8\\xc3\\x30\\x06\\xfc\\xa5\\x49\\x91\\xdf\\x49\\x11\\xd1\\xc4\\x9a\\x97\\x42\\x1c\\x9a\\x68\\x2e\\xcd\\x54\\x6b\\x44\\x57\\x22\\x08\\x28\\xc8\\x62\\x95\\x49\\xbb\\x0d\\x94\\x29\\xe3\\x26\\x7a\\x13\\x50\\x04\\x06\\x6e\\xdc\\xa4\\x83\\x57\\x8d\\xe3\\x39\\x32\\xae\\xdb\\xa9\\xc5\\xc9\\x86\\xa9\\xea\\x37\\xf7\\xb1\\xad\\x78\\xa5\\xf7\\x55\\xcd\\xb6\\x06\\xc0\\xb6\\xae\\x6d\\x64\\x25\\x73\\x16\\xc3\\xf3\\xdc\\xb0\\x02\\xc5\\xaf\\xc0\\x5b\\xd4\\x0c\\xad\\xba\\x5b\\x19\\x37\\xcb\\x1c\\xff\\xac\\xf1\\xcf\\x0e\\x07\\x75\\x56\\x93\\x68\\x5b\\xc5\\xd9\\x5e\\xe2\\x6f\\x89\\xbc\\xbd\\xe0\\x9c\\x67\\x93\\x7d\\xa1\\xce\\xf2\\xd6\\x27\\xe6\\x17\\xf8\\x71\\x72\\x20\\x3e\\x90\\x65\\x43\\x59\\x68\\xdf\\xef\\x4e\\xcf\\x46\\x76\\x6a\\xb0\\xbb\\x28\\xa2\\xd8\\x41\\xfb\\xf6\\x04\\x7a\\x2d\\xd7\\x73\\xc9\\xdd\\xad\\x99\\x03\\x12\\xf1\\x7e\\xd3\\xcb\\xd6\\xb7\\x19\\xdd\\x22\\x2d\\x59\\xea\\x8b\\x76\\x7e\\xf7\\x7a\\x2f\\xb7\\xed\\xcf\\x6b\\x9e\\x1a\\x26\\xb0\\x1e\\x7d\\x35\\xfd\\x75\\x06\\x4c\\xd7\\xc1\\xdb\\x27\\x57\\x77\\x33\\xd6\\xcf\\x70\\x3f\\xf4\\x61\\x3b\\x00\\x87\\x9d\\x22\\x87\\x1d\\x20\\x87\\x8d\\x11\\xdc\\x91\\xa5\\x8c\\x39\\xc6\\xe9\\x46\\xbc\\xbd\\xf8\\xcf\\x78\\x6d\\x93\\x75\\xde\\xf6\\x3f\\x9f\\x43\\xdf\\x0e\\x3e\\x8f\\x45\\xff\\xff\\x3e\\x83\\xad\\x07\\x78\\x25\\x4b\\x45\\x54\\xe8\\x13\\x7b\\x67\\xf2\\xf4\\xbb\\x4f\\xec\\x9d\\xd9\\xce\\x67\\x09\\x10\\x52\\x59\\x30\\xfd\\x8f\\x04\\x08\\xe1\\x61\\x01\\x42\\x80\\x02\\x84\\xe0\\x90\\x00\\x01\\x56\\x5b\\x9f\\xbb\\x9b\\x1b\\x5c\\xf8\\xa0\\x1b\\xc6\\x69\\x2e\\xe6\\x13\\x38\\xa3\\x3e\\xee\\x02\\xe8\\x4b\\xf8\\xd9\\x22\\x86\\x85\\x1c\\xc4\\xa2\\x21\\x62\\x78\\x9d\\xb6\\x2c\\xfc\\x9b\\x82\\xcf\\x5f\\x8d\\xe4\\xa9\\x72\\x6b\\x32\\x83\\xae\\xa4\\x87\\x8c\\x25\\x6a\\xaf\\x8d\\xc3\\x17\\xe6\\xb6\\x41\\x9b\\xda\\xcf\\xd3\\x26\\x70\\x6b\\xc0\\x35\\xf3\\xaa\\xd8\\x6f\\x0d\\x59\\xef\\xe3\\x87\\x86\\x4d\\x7e\\xfd\\xbd\\x23\\x03\\xa7\\x1b\\x82\\x90\\x9f\\xd2\\x43\\xe1\\x61\\x92\\xde\\xbb\\x8a\\x66\\xea\\x9c\\xf5\\x81\\xe8\\x2c\\xdc\\xce\\x33\\xfa\\x2b\\x9f\\x1f\\xf4\\x1f\\x0c\\xd8\\xe0\\x01\\xa6\\x78\\x77\\x27\\x15\\x4d\\xa1\\xcb\\x0f\\xf7\\xcd\\x0a\\x13\\x23\\xb4\\x8d\\x82\\x29\\x99\\x26\\x18\\x8a\\x83\\x0c\\xf4\\x8a\\x6e\\x00\\x99\\xae\\x04\\x7d\\xf0\\x3c\\x14\\x7c\\x97\\x49\\x31\\x51\\xde\\x68\\x46\\xba\\xaf\\x3f\\xc9\\xf2\\x4c\\x27\\xb8\\x78\\xa9\\xbd\\xe8\\xc2\\xa6\\x49\\xf0\\x7a\\x00\\xf9\\x20\\xb7\\x6a\\x56\\x6e\\x0a\\x03\\x86\\xc9\\x10\\xc8\\x17\\xf3\\xa0\\x08\\x2e\\x2e\\x98\\x52\\xd0\\x34\\xc3\\x5f\\xa4\\x2d\\x7f\\xa1\\x1d\\xa0\\x05\\xf6\\x3a\\x26\\x1f\\xfc\\x60\\x2d\\xf2\\x4d\\x10\\x0a\\xf2\\x99\\x8e\\xe6\\xe8\\xe2\\x64\\x18\\x2e\\xa7\\xfb\\x0e\\x72\\xd1\\x9c\\x70\\x5c\\x55\\x50\\x03\\xaf\\x3f\\x21\\xeb\\x81\\x73\\x21\\x8c\\x4b\\x31\\xe5\\x95\\xb1\\xc9\\x34\\x9a\\x01\\x42\\xec\\x16\\xd7\\x42\\x24\\x64\\x26\\x02\\x84\\x04\\x30\\x0c\\x34\\x24\\x8c\\x06\\x50\\x0d\\x06\\xb3\\xc3\\x48\\x90\\xe0\\xc8\\xe8\\xc2\\x4e\\xe3\\x54\\x1c\\xaa\\x45\\x34\\x1d\\xc9\\x7f\\x6b\\x1c\\x05\\x79\\xf9\\x18\\x79\\x4a\\x74\\x9a\\x17\\x42\\xcb\\x48\\x47\\x62\\x5b\\x3c\\x4f\\x13\\x52\\xe6\\x24\\x66\\xe0\\xff\\x03\\x95\\x4c\\x3a\\x17\\x17\\x14\\x00\\x27\\xc2\\x2c\\x17\\x17\\x70\\x86\\x1b\\x1f\\x3a\\x6e\\xe2\\xc2\\x17\\x63\\x07\\x7d\\x71\\x50\\xac\\x2f\\xd0\\xc2\\x17\\x7f\\xf8\\x07\\xb9\\xea\\x7e\\x9f\\xd1\\x46\\xf1\\xfb\\xb7\\xa8\\x39\\x8c\\x80\\x33\\x52\\xd7\\xb3\\xa8\\x3b\\xd3\\xca\\x6e\\x11\\xad\\xc5\\x48\\x26\\xf1\\x0f\\x34\\x78\\x9f\\x2c\\x74\\x18\\x26\\xf8\\x01\\x3a\\x3c\\x06\\x3b\\xbf\\xec\\xd2\\x2f\\x9b\\x97\\x59\\x80\\x1d\\xc0\\x0f\\xea\\x91\\x89\\x20\\x17\\xf0\\x8e\\x3f\\x8c\\x36\\x0b\\xaa\\xb3\\x4a\\x19\\x34\\xd3\\x75\\x23\\xb9\\x55\\xd1\\xd9\\x1a\\x6b\\x34\\xae\\x8e\\x2f\\x1b\\x64\\x86\\x50\\xa1\\xdd\\x65\\xc7\\xc7\\x99\\xe6\\x2a\\x73\\x4b\\xb2\\xdc\\x80\\x04\\xa6\\x3a\\x75\\x36\\x2a\\xe9\\x18\\xe8\\xba\\xd5\\x9e\\x37\\x32\\xb0\\x52\\x6f\\xf5\\xf2\\xf0\\x56\\x6f\\xec\\x8b\\x52\\x6f\\x72\\xa6\\x2b\\xe0\\x80\\x64\\x75\\x0d\\xea\\x41\\x2a\\x75\\x0e\\x94\\xc6\\x5b\\x64\\xd5\\xb6\\xd1\\x8e\\xa7\\xb5\\x7e\\x0c\\x77\\x3a\\x46\\x19\\x3d\\x58\\x0e\\x0e\\xf3\\x95\\x0e\\xba\\x4e\\x17\\xe4\\xa7\\x72\\x16\\x17\\xf0\\x50\\x4d\\xef\\xfe\\xc4\\xd5\\xe4\\x4e\\x37\\xe4\\xb1\\x05\\x38\\x60\\x60\\x4f\\x5e\\x09\\x3f\\x66\\x83\\x5b\\x06\\x94\\xac\\xb1\\x65\\xe3\\xd6\\xbc\\x52\\x30\\x6c\\x55\\x7a\\x50\\xf1\\xea\\x40\\x6b\\xf7\\x16\\x40\\x50\\x50\\x98\\xfa\\xb0\\xbe\\x4b\\x26\\x1c\\xf7\\x47\\xf6\\xd5\\xd4\\xf3\\xc2\\x99\\xee\\x7f\\xcd\\x41\\x96\\x18\\x93\\xd2\\xda\\x9b\\x25\\x91\\xcc\\x0f\\xcf\\x51\\x8e\\x6a\\x61\\xa5\\x62\\xad\\xf5\\x59\\xd5\\x60\\xaa\\xd5\\x9c\\x54\\xab\\x99\\x55\\xd0\\xec\\xff\\x67\\xee\\xcf\\xbb\\xdb\\xc6\\x91\\x87\\x51\\xf8\\xef\\xf7\\xf9\\x14\\x1d\\xfd\\xa6\\x3d\\xa4\\x04\\x49\\xd4\\x6a\\x9b\\x0a\\xac\\x93\\x49\\xd2\\xdb\\xc4\\xe9\\x74\\x9c\\x5e\\x15\\x8d\\x0f\\x4d\\x51\\x12\\xdb\\x14\\xa9\\x70\\xb1\\xad\\xd8\\xfa\\xee\\x6f\\x55\\x01\\x20\\x41\\x89\\x72\\x9c\\xb9\\xbf\\xfb\\x9c\\x3b\\xd3\\xb1\\x48\\x10\\x6b\\x01\\x28\\x54\\x15\\x6a\\x21\\x1f\\x9d\\x1d\\x22\\x87\\xc8\\xd1\\x32\\xc2\\x87\\xd6\\xe3\\x9a\\x7b\\x2e\\x51\\x98\\xa3\\x1c\\x24\\x29\\x5f\\x34\\x1c\\x60\\x1a\\xf8\\x62\\xec\\x52\\x64\\x17\\x6a\\xd4\\x40\\x58\\xb9\\xa6\\x84\\x8f\\xa6\\xb7\\xae\\x71\\x7e\\x4e\\x9a\\xc6\\xd2\\xe1\\x15\\xea\\xa5\\xd6\\x4a\\xf8\\x41\\x86\\x53\\x31\\x72\\xdf\\x45\\x25\\x97\\x55\\x85\\x52\\x70\\x6c\\x8e\\x63\\x5b\\x28\\xdf\\xd7\\x98\\x65\\xd6\\x74\\xc3\\xc7\\xdf\\xff\\x37\\x1a\\xb3\\xd8\\xa1\\xe6\\xca\\x8d\\xfd\\x54\\x3e\\xb8\\xd3\\xe8\\xc7\\x8b\\x9f\\x2f\\xd2\\xd8\\x0f\\x17\\xfa\\x3d\\xf9\\xf7\\x8f\\x6b\\x30\\x84\\x25\\xa5\\xf6\\xcc\\xd0\\x42\\xc1\\x86\\x82\\x77\\x15\\x72\\xaf\\xb6\\x27\\x7c\\x99\\xc9\\xfb\\xf4\\xdf\\x30\\x46\\x59\\xa1\\x0e\\xc4\\x7f\\xcb\\xaf\\x8e\\xe0\\xa4\\xda\\x78\\x4e\\x4c\\x16\\x19\\x87\\x94\\x0e\\xc3\\x76\\xaf\\x33\\xe8\\x0d\\xbd\\x21\\xec\\x09\\x0f\\xcd\\x59\\xa6\\xb6\\x3f\\x4e\\x27\\x59\\xfb\\xb7\\x60\\xe2\\x37\\x3b\\xd3\\xe7\\xf8\\x3b\\x6d\\x67\\x63\\x78\\xb1\\xfd\\xa9\\x3d\\xf9\\x57\\x20\\x2c\\x3c\\x44\\xe6\\xed\\x13\\x54\\x68\\xff\\x1d\\xfd\\xef\\xe8\\xd0\\xa6\\xa4\\x51\\x9a\\xbf\\x0a\\x3d\\xca\\x7f\\x47\\x55\\xca\\xae\\x87\\xb4\\x11\\x9e\\x29\\x3f\\x88\\x47\\x47\\xcf\\x94\\x81\\xa4\\xc7\\xa0\\x83\\x0d\\xaf\\x81\\x6e\\xf7\\x94\\xe6\\xb3\\x50\\xf5\\xe0\\xb9\\xaa\\x2c\\x22\\xf4\\x77\\x3e\\x39\\x14\\x56\\x91\\x30\\xc7\\x99\\x11\\xb1\\x8e\\x65\\xda\\xb5\\x90\\x54\\x7a\\x35\\x6a\\x12\\x10\\x21\\x69\\x29\\xab\\x49\\x71\\xe8\\xe0\\x72\\x84\\xf6\\x07\\xc9\\x7d\\x73\\x10\\x18\\xdf\\xa1\\x17\\x83\\xf4\\xac\\x53\\x65\\xb5\\x48\\x7a\\xee\\x1e\\xea\\x2d\\x28\\xa3\\x45\\x72\\x27\\xc3\\xa1\\xbf\\x29\\x70\\xd0\\x39\\xe7\\x51\\x61\\xc5\\xa8\\x15\\x15\\x46\\x8c\\x79\\x49\\xa0\\x8f\\xf4\\xa2\\x5b\\x5b\\x6a\\x00\\xef\\xea\\x1f\\x17\\xc2\\x29\\x54\\xe7\\xcf\\x01\\x41\\x6e\\xfb\\x73\\x08\\x78\\x07\\x20\\x40\\x9f\\x80\\x07\\x57\\x40\\x3e\\x3a\\x9a\\xdc\\xd3\\x03\\xa9\\x26\\x14\\x16\\xa0\\x04\\x18\\x5f\\x00\\xc6\\x27\\xc0\\xe4\\xb3\\x82\\x89\\x34\\x31\\x28\\x50\\x82\\xb9\\xe9\\x9c\\xa1\\xc1\\x79\\x7a\\x50\\x0f\\xba\\xd0\\xc1\\x78\\x4c\\xe5\\x38\\xfa\\xb2\\xca\\x71\\x69\\x2b\\xc3\\xe9\\xfc\\x0a\\x11\\x81\\x9e\\xe3\\x17\\x3d\\xc7\\x4f\\x17\\x3f\\xbf\\x45\\xa3\\xed\\x04\\x15\\x7c\\x63\\xa0\\xaa\\xa2\\x30\\xf1\\x3e\\x00\\x3d\\xa2\\xeb\\xa9\\x39\\x05\\xb9\\x9b\\x01\\xfb\\x10\\x7b\\x50\\xe5\\x7b\\x61\\x9d\\x5b\\xb0\\x8f\\x09\\xa0\\x5f\\x37\\x7d\\x1b\\xcd\\x3c\\x03\\x32\\x5d\\x45\\xb3\\x0d\\xde\\x70\\x88\\xcc\\x44\\xdc\\xdc\\xa5\\x99\\x13\\x7c\\x17\\x3b\\x8b\\x15\\x85\\x49\\xdd\\x69\\x8d\\xaa\\x77\\xf8\\x3d\\x72\\x2a\\x48\\x34\\xd4\\x7a\\xad\\x41\\x6b\\x50\\xdb\\x02\\xc9\\x00\\x28\\x5b\\xdc\\x63\\xb1\\xd8\\xa9\\xe2\\x4e\\x3c\\x47\\x9e\\x22\\xa8\\xd8\\x23\\x03\\xb0\\xcc\\x22\\x97\\xf6\\x21\\x59\\x63\\x39\\x66\\x1a\\x6f\\x60\\x02\\xb1\\x63\\xea\\xc3\\xeb\\xc0\\xc3\\x1f\\x61\\xcb\\x8d\\xbd\\x4e\\x50\\xe8\\x4e\\x7e\\xa1\\x3e\\xc0\\x2a\\xd8\\xba\\x0e\\x7a\\xb0\\xf7\\x81\\x66\\xdc\\x69\\xb4\\x32\\xb6\\x6a\\x11\\x9c\\x22\\x35\\x47\\x29\\x06\\x43\\xf2\\x50\\x3e\\x86\\xf2\\xf6\\x5c\\x4c\\xbc\\xc5\\xbb\\x11\\x9c\\x0d\\x68\\xe4\\x16\\x88\\x2f\\xf5\\xb8\\x3f\\xcf\\x0d\\x35\\x6f\\x80\\xd4\\x64\\xe7\\x73\\xb8\\xcb\\x7e\\x1b\\xb5\\x57\\x3f\\xfe\\x56\\x33\\x81\\xd0\\xd8\\x04\\x1e\\x92\\xa0\\xef\\xe2\\x68\\x0d\\x18\\x6a\\x63\\xd4\\x22\\xa0\\x8c\\xfd\\x74\\x03\\x27\\x0a\\x43\\x91\\xad\\x18\\x48\\xe4\\x48\\x32\\x4e\\xc2\\x47\\x0d\\x7f\\x1d\\x47\\x69\\x84\\xcb\\x9e\\xb9\\x0e\\x77\\x1c\\xac\\xe9\\x05\\x9c\\x36\\xfe\\x55\\x86\\x2e\\x23\\xf7\\x92\\xde\\x5e\\xb0\\x44\\xd6\\xf0\\xf2\\xe2\\xe2\\x02\\x1b\\x7f\\xe5\\xb9\\x81\\x23\\xe8\\x0f\\xad\\xb6\\xb9\\xc3\\x13\\x47\\xef\\xd7\\x68\\xa7\\xa6\\x9d\\xad\\xea\\x3a\\x1a\\x5b\\x01\\x29\\x0d\\xec\\x3a\\xdb\\x6b\\xbd\\x54\\x0a\\xcf\\x97\\x60\\xa7\\x1c\\xf3\\x44\\xc9\\x72\\xe3\\x7b\\xc5\\xe6\\xfb\\xcd\\xe1\\x76\\xda\\xc2\\xb1\\xe4\\x24\\x2e\\xd0\\x25\\x70\\xf4\\xa1\\x37\\x04\\x58\\x2f\\x5e\\xfe\\x5e\\xee\\xb1\\xda\\x62\\xa8\\xc2\\x0f\\x1b\\xfb\\x2c\\xc4\\xed\\x7d\\xc6\\xd1\\xfa\\xcb\\x6a\\x5b\\x5b\\x26\\x7c\\x07\\x55\\x61\\xa4\\x0a\\x71\\x9d\\xf0\\xc3\\xc2\\xf7\\x14\\xe2\\x05\\x22\\x94\\xc2\\x3c\\xbc\\x49\\x11\\xee\\xb9\\x62\\x12\\xeb\\xa1\\xef\\xc5\\x33\\xa0\\xd1\\xee\\x81\\x04\\x95\\xfe\\x5c\\xf4\\xec\\xbb\\x79\\x81\\x50\\x16\\xf6\\xea\\xc2\\x88\\xe8\\x60\\xd5\\x05\\xdd\\x8a\\xa2\\xc3\\xcc\\x7c\\x6a\\x33\\x15\\xe5\\xb4\\x26\\x0b\\xec\\x26\\xbc\\x3f\\xfc\\x7f\\x08\\x30\\xf1\\x99\\xf7\\x7f\\x1b\\x30\\x5a\\x93\\x25\\xc0\\x78\\xbb\\x31\\xae\\x77\\x23\\x24\\x90\\xa7\\x97\\x27\\x43\\x87\\xfc\\xc0\\x94\\xa1\\xe3\\xeb\\xd0\\xc9\\x76\\x3b\\x4e\\x05\\x76\\x73\\x1b\\xc5\\x34\\xb2\\x98\\xdc\\x48\\x40\\x39\\xb3\\x0c\\xac\\xbd\\x96\\xb4\\x41\\xfb\\x53\\xf4\\x3a\\xf4\\xe4\\x56\\x2b\\x4a\\x1e\\xea\\x81\\x92\\xf5\\xb0\\x6c\\x4a\\xe0\\x4b\\xb2\\x55\\x35\\xec\\x48\\x1a\\xaa\\x45\\x02\\x10\\x17\\x55\\x95\\xb0\\x93\\x7d\\x8a\\x70\\x0a\\x81\\x0c\\x40\\x6f\\x62\\x11\\x41\\x21\\x6e\\x70\\x4f\\xc4\\xfa\\xf9\\x66\\x2f\\x8f\\xd6\\xe7\\x68\\x8a\\xd7\\x8c\\x79\\xfe\\xfc\\xd6\\x98\\xd6\\xbd\\xe7\\x54\\x63\\x04\\x9f\\x02\\x5c\\xe4\\x1d\\x94\\xf7\\x24\\xd1\\x97\\x3a\\xe9\\x20\\xe0\\x32\\x12\\x51\\x84\\x74\\xfd\\x30\\xf6\\xa1\\x51\\x1b\\x98\\xb0\\x52\\x3f\\xb5\\x6c\\x5a\\x47\\x9d\\x29\\x89\\x38\\x8a\\x22\\xb2\\xab\\xee\\xd8\\x6f\\xbb\\x8a\\xfb\\x62\\x9a\\x96\\x79\\x25\\x75\\xa5\\xd9\\x60\\x98\\x75\\xa0\\xcd\\x58\\x5c\\x32\\xc7\\x46\\x07\\x4f\\x00\\x41\\x0c\\x25\\x8e\\x6e\\xac\\x9a\\x85\\xcb\\xb5\\x31\\xfa\\x0e\\x32\\xf0\\x02\\xb6\\x99\\x09\\xd1\\x2b\\xc2\\x67\\xe6\\x57\\x42\\xc8\\xcf\\xcd\\x31\\x15\\x88\\xdc\\x27\\xcc\\x21\\x39\\xcf\\xcc\\xd0\\x30\\xc8\\x40\\x55\\x04\\x9c\\x15\\x65\\x0b\\x59\\x9e\\x48\\x2d\\xa3\\x06\\x20\\x54\\xc4\\x30\\xcb\\x85\\x72\\xbd\\x78\\xe5\\x0e\\x48\\xd3\\xc1\\x8f\\x72\\x5d\\xf7\\xd6\\xc0\\xd4\\xe1\\x07\\x03\\x80\\x51\\xed\\x11\\xf8\\x72\\xe6\\xcb\\xf3\\x6e\\xc1\\xc0\\x2c\\xba\\x07\\x65\\x89\\x70\\x1d\\xfa\\xd8\\x00\\x03\\x7d\\xfe\\x03\\x1a\\x20\\x3a\\x21\\x6b\\x3a\\xcc\\x41\\xb7\\x2e\\x8d\\x46\\xc2\\x5c\\x78\\xa8\\x1b\\x1e\\xda\\x46\\x94\\x86\\x1c\\x54\\xae\\x89\\x60\\xca\\x02\\xf3\\x4b\\xd5\\x28\\x69\\x0b\\x50\\xfd\\x6e\\xdb\\x48\\x60\\xe2\\xf5\\xd1\\xce\\xbc\\x1b\\x9f\\xa8\\x01\\xbe\\x23\\xad\\x24\\xbf\\xea\\x0a\\x16\\xd5\\xd2\\xdc\\xfc\\xc6\\x69\\xac\\x89\\x55\\x51\\x1f\\x98\\xc4\\x3a\\x4b\\x87\\xfb\\x68\\x60\\x9f\\xf3\\x8e\\x6f\\xbc\\x79\\xca\\x97\\xa8\\xa5\\x3f\\x27\\xa1\\x91\\x48\\x2d\\x78\\xcb\\xf7\\xfe\\x62\\x49\\x19\\x62\\x7c\\x28\\x72\\x44\\x71\\x15\\x19\\xe9\\x13\\xa8\\xd5\\x5c\\x8c\\x35\\x85\\xe2\\x58\\xb3\\x98\\x97\\x7c\\x1c\\xf2\\x1d\\x02\\xe5\\x2c\\xb3\\xf9\\x7c\\x67\\x6f\\x20\\x85\\x01\\x00\\xdc\\x9b\\x35\\x32\\xa2\\xd1\\x74\\x41\\xba\\xe4\\x81\\x27\\xe5\\x96\\x59\\xe8\\x42\\x48\\x7f\\x6f\\x18\\xeb\\x18\\xaf\\x23\\x4b\\xde\\x56\\xeb\\x7e\\xb3\\xf9\\x60\\x91\\x0a\\x89\\xdf\\x48\\xf1\\xae\\x14\\x7f\\xf0\\x18\\x13\\x6f\\xf8\\xc3\\xe3\\xe2\\xda\\x0e\\xfb\\x07\\xf4\\xcf\\x6a\\x9f\\xdc\\x2a\\x3c\\x26\\x6a\\xfa\\x4f\\x05\\x11\\x8b\\x78\\x0e\\x89\\xd8\\x58\\x84\\x35\\xc1\\x08\\x26\\xd3\\x32\\x26\\x5b\\x3b\\x7e\\x9c\\x54\\xd3\\xc5\\xd2\\xf3\\x94\\x76\\xf7\\x5c\\x5c\\x3b\\xe7\\x2d\\x58\\x67\\x31\\x10\\x4a\\x78\\xc7\\x78\\xe6\\x49\\x8f\\x8c\\x93\\x94\\xdc\\xe8\\x84\\x93\\x46\\x43\\x6b\\xce\\xa7\\xe6\\x3e\\xfb\\x6b\\x7d\\x39\\x51\\xe8\\xac\\x78\\x1f\\xc0\\x52\\x5c\\x35\\x29\\x14\\x9d\\x42\\x72\\x52\\xcf\\xa5\\x23\\xc7\\xbc\\x00\\xea\\x4d\\xec\\x50\\xed\\x8d\\x46\\xf8\\x3c\\x1d\\xe9\\xaa\\x0b\\x82\\x14\\xf1\\x26\\xe1\\x54\\xcb\\x49\\x0a\\xb5\\x19\\x9a\\xe1\\xf8\\xe8\\xd0\\x27\\xaf\\x11\\x5e\\xd0\\x47\\x6c\\xe9\\x34\\x27\\x41\\xcc\\x3a\\x4a\\x2a\\xef\\x76\\xc4\\xa8\\x0a\\xbf\\x13\\x72\\x3d\\x5d\\x7b\\x9b\\x32\\x5c\\x95\\x7f\\xe6\\xc2\\x79\\xb2\\x08\\x01\\x95\\x2a\\x6b\\x4e\\x8d\\x8f\\xa6\\x0d\\x16\\x64\\xde\\x57\\xd5\\x10\\xea\\xe1\\xa0\\x44\\x25\\x30\\xa0\\xd8\\xff\\xba\\x5a\\xee\\xa1\\xe3\\xb6\\xc7\\xa8\\x79\\x1b\\xab\\xdc\\xee\\xd4\\x49\\x1e\\x5c\\x0f\\xad\\x18\\xa2\\xfc\\x34\\xdd\\x18\\x22\\x73\\x2c\\x22\\x0d\\xb2\\x91\\x19\\x35\\x88\\x14\\xd1\\xed\\xa1\\xf4\\xc9\\x8b\\xcc\\x51\\xb3\\x99\\x91\\x33\\x33\\xfc\\x24\\xe8\\x3a\\x98\\xf4\\xdc\\x4c\\xb4\\xd9\\x4c\\x85\\xd3\\xdd\\x49\\xb3\\x89\\xc1\\x9a\\x4a\\x5c\\x19\\xa1\\x96\\x85\\xb4\\x25\\x77\\xae\\x92\\x91\\xb2\\x78\\xdd\\xdb\\xd2\\xb0\\xea\\x2a\\xcd\\xe2\\xd0\\xc3\\xea\\x81\\x40\\x2c\\x80\\x53\\x71\\x77\\x33\\xb2\\xc7\\x69\\xe3\\x6d\\x75\\xa7\\x6d\\x99\\xe9\\x32\\x8e\\x6e\\x89\\x39\\x7f\\x1d\\xc7\\xd0\\xe3\\x9a\\x1f\\xce\\x49\\x44\\xf7\\x8d\\x30\\x28\\x55\\x06\\xee\\xd2\\x2b\\x93\\x83\\x8e\\x2b\\x3c\\xf4\\x83\\x20\\xcf\\xbc\\xb0\\x8e\\x4e\\x13\\xf1\\x8f\\x87\\x7f\\xac\\x33\\xa1\\x71\\x33\\xc2\\xa1\\x37\\xbc\\x3a\\x10\\x26\\xe6\\x59\\x9a\\x6b\\x98\\xc6\\xed\\xd2\\x69\\xa7\\x65\\x7a\\xbe\\x93\\x49\\x49\\x6b\\x25\\x8d\\xbe\\xae\\x3c\\xf0\\x85\\x4d\\x2e\\xf6\\x02\\xe6\\x3f\\x49\\x11\\x99\\x47\\xf3\\x6f\\x02\\xb3\\x42\\xa2\\x4d\\xa5\\x88\\x3b\\x15\\x16\\x1b\\xb2\\x1b\\x50\\x96\\x26\\xae\\xe5\\x27\\x32\\xa0\\xa3\\xf4\\x2d\\xf8\\x74\\xf2\\x5f\\xa7\\xb3\\x45\\x03\\x19\\x51\\xd7\\xe5\\x33\\x4e\\xfb\\x9c\\x9f\\x71\\x72\\x75\\x64\\x84\\xc4\\xf3\\xcc\\xe4\\x86\\x49\\x86\\x56\\xa3\\xfc\\x91\\xf0\\x47\\xb5\\xb3\\x4c\\xd6\\x0e\\xaf\\x5d\\x5e\\x12\\x97\\x7b\\x79\\x59\\x83\\xc5\\xce\\x6b\\x1f\\xef\\x2c\\xab\\x36\\x72\\x8d\\x80\\xdd\\x2f\\x9d\\xc4\\x5e\\x32\\xf4\\x2b\\x5c\\xb5\\xdd\\xe9\\xaa\\x6c\\x92\\x18\\x68\\x64\\xc7\\x92\\x52\\x26\\xdd\\x1f\\x8d\\x96\\x8d\\xa3\\xf5\\x39\\x45\\x74\\xb6\\x17\\x0c\\xf1\\x82\\xbd\\x16\\xfb\\x2b\\xb1\\xf7\\x8e\\x56\\x6d\\x5f\\xa6\\x14\\xf3\\x8d\\xea\\x31\\xa5\\x8a\\x92\\xac\\x35\\xd5\\x3c\\xa5\\x6c\\x99\\xdc\\xe4\\x5f\\x5b\\x17\\x6d\\x74\\xb2\\xc1\\x12\\x7b\\x3d\\xaf\\x7b\\xab\\x57\\x9e\\xf8\\x9f\\x3d\\xfb\\x86\\x79\\xab\\x75\\xba\\xb1\\x67\\x4c\\x2e\\x0d\\xbb\\x72\\xfb\\x97\\xda\\x28\\xd8\\x72\\x61\\xe7\\x95\\xf7\\x7c\\xbb\\x25\\x2f\\xbc\\xa1\\x97\\x94\\xa4\\x66\\x85\\x94\\x4a\\x6a\\xad\\xd1\\x36\\x3d\\x2b\\x9c\\x5f\\xab\\x63\\x6b\\x2c\\xef\\x55\\x32\\x74\\x27\\xe2\\x8d\\x73\\x6a\\xcd\\x8e\\x46\\x85\\x55\\x85\\x0c\\xce\\x88\\xab\\x70\\x5d\\xf8\\x62\\xbf\\xe1\\xfe\\xc4\\x69\\x34\\x50\\x35\\x45\\xac\\xfe\\x46\\x63\\xf1\\x7c\\x3d\\x32\\x8d\\x25\\x9f\\xd1\\x85\\xbb\\xcb\\x6f\\xd0\\x7d\\xc6\\x64\\x81\\x3a\\x52\\xe3\\xa5\\x00\\x54\\x82\\xba\\x1d\\xb8\\x96\\x5c\\x36\\x49\\x34\\x0c\\x3b\\x86\\xac\\xa8\\x74\\x37\\xe7\\xe5\\xab\\x9f\\x44\\x99\\xe9\\x23\\xc5\\x41\\xd6\\x1e\\xa6\\x0d\\x59\\xef\\xb7\\xfb\\x39\\xe9\\x58\\x96\\xd9\\x00\\x2c\\xb3\\x62\\xeb\\x99\\x4c\\xbb\\x70\\x17\\xc6\\x6a\\xe4\\x75\\x64\\x1f\\x20\\xa1\\x40\\x32\\x42\\x2d\\x2c\\x9a\\x78\\x30\\xbe\\x42\\xc5\\xb3\\x62\\x2b\\x67\\xb0\\x46\\xb5\\x15\\x10\\xaa\\xa5\\x88\\x5b\\x0f\\x2f\\x3f\\x51\\x56\\x05\\x30\\x26\\xa8\\x56\\x2e\\xed\\x0c\\x58\\x05\\x32\\x69\\xc0\\xbf\\x38\\x38\\x61\\x91\\x28\\x70\\x3f\\x8c\\x52\\x6a\\x8a\\x15\\xf7\\x33\\x59\\x19\\x07\\x95\\xbc\\x4e\\x52\\x8c\\x1a\\x0b\\x05\\x7e\\xfb\\x87\\x95\\xe6\\xbc\\x00\\xc9\\x35\\x42\\x65\\x70\\xc4\\xa0\\xcb\\x43\\x2a\\x00\\xcd\\x57\\xd2\\x7f\\xb9\\x2f\\xf5\\x0c\\x73\\xe1\\x40\\xfe\\xbd\\x7b\\x18\\x2b\\xfa\\x7f\\xe2\\x17\\x16\\x90\\x68\\xc6\\xa8\\x0a\\xfc\\xb6\\x7f\\xfa\\x2a\\x0c\\xa2\\xb2\\xc5\\x51\\x10\\x64\\x95\\x4e\\xd0\\x62\\x99\\x45\\xd0\\x95\\x5e\\x5a\\x71\\xfc\\xe2\\xf2\\x5b\\x11\\xf2\\x35\\x0b\\x12\\x4e\\xa7\\xb6\\x88\\x9e\\x42\\x8f\\xde\\x69\\xcb\\x99\\xcd\\xf6\\xce\\x76\\xd7\\x58\\x29\\x3c\\x05\\x9f\\x1f\\xc7\\x53\\x18\\x56\\x11\\x90\\x10\\x06\\x71\\xd5\\xf0\\x90\\x9c\\xf5\\xf5\\xff\\xd6\\x0e\\x57\\xfb\\xfa\\xca\\x5b\\x3a\\x37\\x7e\\x44\\xd1\\x2e\\x73\\xb7\\x67\\x87\\xa8\\x56\\x18\\x30\\x52\\x95\\xbb\\xc7\\x82\\xd2\\xeb\\x85\\x51\\x6b\\x84\\x59\\x3c\\x9d\\xf2\\x73\\x3a\\xc3\\x4b\\x81\\x2f\\x25\\x53\\x31\\x73\\xf8\\xa4\\x76\\xeb\\x5d\\x5d\\xfb\\x18\\x2b\\x60\\x95\\xe0\\x9f\\xe8\\x33\\xfc\\x3d\\xa7\\xbf\\x11\\xfc\\xfb\\xb9\\x36\\x45\\xa2\\x60\\xe6\\x27\\x6b\\x94\\xa5\\x96\\xb0\\x4f\\x4e\\x66\\xe2\\xcc\\x5c\\x32\\xe9\\xb4\\xbd\\xa2\\x63\\xa4\\x5b\\x09\\x4c\\x77\\xde\\xad\\x14\\xba\\x75\\x5b\\xdc\\xda\\x21\\xd2\\xbc\\x2c\\x04\\xa8\\xad\\xa8\\x52\\x50\\x80\\x3a\\x10\\xd2\\xac\\xb3\\xd6\\xaa\\x99\\x64\\xb4\\x30\\x12\\xfb\\xdb\\x22\\xb7\\xed\\xca\\xe2\\x83\\xee\\x83\\x0a\\xbf\\x8c\\x18\\x10\\x04\\x0d\\x37\\x0e\\xdc\\x52\\xa1\\xfb\\x1d\\xa1\\x04\\xd2\\x22\\xef\\x1c\\xb6\\xfe\\x26\\x5d\\x9d\\x75\\x2b\\x05\\x4d\\x52\\xe4\\x83\\x51\\x3e\\x48\\xf3\\x5c\\xcd\\xb4\\x49\\xd3\\x0d\\x2b\\xed\\xe7\\xdb\\x30\\x17\\x4d\\xa3\\xd3\\xee\\x52\\xcd\\xa5\\x00\\xe3\\xf8\\x65\\x2b\\xc8\\xcf\\x1b\\xd2\\x84\\x40\\xa5\\x00\\x5a\\x0a\\x9f\\xb2\\xa8\\x5a\\x3f\\x0a\\x2f\\x11\\xd6\\x81\\x03\\x03\\x5c\\x39\\xac\\xf6\\xf1\\xe3\\x3f\\x8e\\x6a\\xa6\\x98\\xd6\\x95\\xc3\\xdb\\x93\\x8f\\x1f\\x3f\\xfe\\xe7\\xe3\\x3f\\x3e\\xd6\\x3f\\x36\\x3e\\x8e\\x3f\\x3e\\x7c\\x9c\\x7c\\x9c\\x7e\\x34\\x3e\\x9a\\x1f\\x5b\\x1f\\xef\\x3f\\x6e\\xa7\\xed\\x05\\xdb\\x38\\xb0\\xda\\x5a\\xf9\\x81\\x3e\\x2e\\x03\\x3c\\x2c\\xbe\\xc0\\x49\\x6c\\x1f\\x58\\x8a\\x22\\xc0\\x6a\\xa8\\x02\\x3d\\x6e\\xd9\\xb9\\x53\\x2d\\x28\\x4e\\x5b\\x9f\\x32\\x2f\\xde\\x5c\\xd0\\x35\\x09\\x82\\x0a\\x70\\xd1\\xdd\\xd3\\xf2\\xbe\\x90\\x97\\x1b\\x57\\xbb\\xd9\\xd5\\x9a\\x58\\xe1\\xba\\xf4\\x92\\x87\\x87\\x70\\x82\\x6e\\x75\\x6b\\xf2\\x5d\\x95\\x87\\x6d\\x2c\\x81\\x6c\\xec\\x55\\x91\\x2b\\xb1\\x4b\\xfa\\x08\\xc9\\x34\\xf1\\x33\\xaa\\xd0\\xa8\\xb9\\xf0\\x3f\\x7f\\x0e\\x50\\x74\\x79\\x68\\x94\\x22\\x83\\xf0\\x2d\\x88\\x61\\x82\\x48\\x35\\x11\\xc7\\x29\\x3e\\xe0\\x10\\xc4\\x53\\x6b\\xa7\\x8f\\xa6\\x40\\x7a\\xf8\\xb2\\x23\\x3b\\x28\\xf8\\x25\\xf1\\xb9\\xe2\\x16\\x47\\x4e\\xfa\\xa5\\xc3\\xf5\\x4a\\x8a\\xdd\\x84\\x87\\xca\\xa5\\xfa\\xb2\\x8f\\x56\\x35\\x55\\xe5\\x51\\xc8\\xdf\\xea\\xa6\\x09\\xd2\\xe3\\x8c\\x88\\xf6\\x5f\\x72\\x3a\\x73\\xaf\\x8c\\x05\\x50\\x57\\x93\\x29\\xcf\\xc7\\x78\\x93\\x44\\x42\\x4c\\x5c\\xe6\\x40\\x40\\x6a\\xc9\\x05\\x99\\x81\\x75\\x06\\xba\\x17\\x1b\\xf7\\x79\\x20\\x22\\xd4\\xa2\\x94\\x6a\\x6c\\x28\\xd6\\x8e\\x87\\x8a\\x64\\xc9\\x0a\\xf5\\x08\\x97\\xac\\x18\\x60\\x0e\\x6a\\x2a\\x09\\xd8\\x87\\x6f\\xc8\\xb9\\x6f\\x9e\\x89\\x17\\xf9\\xd1\\x79\\x82\\x3c\\xd8\\x70\\xb3\\x29\\x71\\xf3\\x0b\\xc3\\x87\\x05\\x95\\xc3\\x04\\x56\\x58\\x35\\x58\\x04\\x48\\x5e\\xea\\x20\\x91\\x34\\x7a\\x19\\x24\\x44\\x6a\\x17\\x40\\xa3\\xe1\\x67\\xd3\\x5c\\x90\\xb9\\x63\\x7f\\x23\\xb5\\xb8\\x49\\x4a\\xaa\\xa0\\x18\\x3b\\x86\\x1c\\x2e\\x45\\x3a\\x50\\xc3\\x75\\x50\\x60\\xbe\\x03\\xdf\\x82\\xe7\\x7d\\x81\\xda\\x30\\x34\\xf7\\xb7\\xb0\\x97\\x93\\x9b\\x85\\x5d\\x5b\\xa6\\xe9\\xda\\x6e\\xb7\\x6f\\x6f\\x6f\\x5b\\xb7\\xbd\\x56\\x14\\x2f\\xda\\x5d\\xcb\\xb2\\xda\\xf0\\xad\\xc6\\xee\\x96\\xe9\\x2a\\xa8\\xca\\xd2\\x39\\x3d\\x3d\\x6d\\xd3\\x57\\xc8\\x84\\x11\\x61\\x0e\\x67\\xc2\\xaf\\x90\\xa9\\xba\\x9e\\x3f\\xce\\xdf\\x60\\xb6\\x93\\x76\\xae\\xa2\\x46\\x59\\xc3\\xe4\\x60\\xbf\\xe8\\x6b\\xbb\\xb6\\xc5\\x13\\x26\\x04\\x6a\\x6f\\x4d\\x5e\\x21\\xed\\x5b\\x87\\x7d\\xca\\x9c\\xc0\\x9f\\x6f\\xec\\x0a\\x2a\\xa0\\x38\\x04\\x6c\\x8a\\xb0\\x55\\x78\\xb2\\x16\\xe7\\x80\\xa7\\x21\\xfe\\x54\\x3f\\x07\\xf0\\xf2\\xdc\\x64\\xb7\\xce\\x2e\\x66\\xf6\\xcc\\xf1\\x3d\\x75\\x17\\x1a\\x46\\xfd\\x99\\x20\\x82\\x99\\xb0\\xc3\\x2d\\xfc\\x47\\xab\\x04\\x35\\x50\\x76\\x36\\x7c\\x15\\x37\\xdc\\xa5\\xe4\\x5a\\x42\\xaa\\x23\\xda\\x7d\\x7a\\xee\\xac\\x17\\xd7\\x0c\\x5e\\xb1\\x16\\x17\\xc7\\x24\\x15\\x0c\\x93\\x96\\x1c\\x2d\\x92\\x5f\\x40\\xcb\\x60\\xf3\\x63\\x0f\\x69\\x6b\\xed\\xf2\\x0f\\xcd\\x19\\xb1\\x8f\\x2a\\x03\\x90\\xf1\\xa5\\x1c\\x74\\xcb\\x8d\\x6a\\x06\\x52\\x30\\x81\\x8d\\x79\\x48\\xc5\\x7e\\x46\\x5f\\x5a\\xc8\\x43\\x94\\xcf\\x1a\\x9d\\xe2\\x91\\xf9\\x84\\xe5\\x21\\x8e\\xd8\\x0d\\x9c\\x24\\xf1\\x76\\x29\\x90\\xff\\x87\\x83\\x86\\xfd\\x64\\x84\\xfc\\x03\\x32\\xbc\\x8a\\xb7\\xc8\\x24\\x4f\\x8f\\xfe\\x2d\\xa8\\xcd\\x37\\x7e\\x92\\x6a\\xd7\\x5b\\x31\\x5d\\xab\\x3c\\x43\\x2d\\xce\\x30\\x75\\x80\\xe3\\x36\\x88\\xcf\\x95\\x27\\xf9\\xb3\\x4e\\xc1\\xc3\\x62\\x0d\\x25\\x70\\xd4\\xa8\\xbe\\x9a\\xa9\\xd7\\xf3\\x46\\x14\\x6f\\xa5\\xc0\\x46\\x21\\xf5\\xa5\\xaa\\x91\\x80\\x79\\x66\\x55\\x43\\xf0\\xfd\\x13\\x21\\xf8\\x5e\\x83\\x20\\x5d\\x4d\\xeb\\xf0\\xd3\\x54\\x39\\xf7\\x08\\x24\\xe8\\x5b\\xef\\x2c\\x2b\\x41\\xf2\\x99\\x06\\xc9\\xae\\xf0\\x5e\\x8e\\x14\\x29\\xe1\\xa1\\x78\\xb7\\x83\\xef\\x90\\x9a\\x40\\x63\\x2e\\x6f\\xa7\\x8b\\x48\\xb9\\x9c\\xe5\\x7a\\x8f\\x15\\x0b\\x10\\x6d\\x00\\x10\\x6e\\x2f\\xa3\\xd5\\x1a\\xa0\\x36\\xa3\\x4b\\x6d\\xf4\\x1e\\x86\\xe8\\x12\\x3f\\xa8\\x4d\\x42\\xb4\\x3d\\xae\\x31\\x24\\xba\\xf6\\x87\\xfe\\x4e\\x8e\\x50\\x0c\\x7e\\x5d\\x75\\xf3\\xfc\\x95\\xeb\\x47\\x6f\\x42\\xf4\\x19\\x25\\x8c\\x95\\xf3\\xf3\\xeb\\x13\\xe7\\xe7\\x57\\x6d\\x7e\\x50\\x23\\xe3\\x49\\xca\\xde\\x45\\xf1\\x4a\\xdd\\xf3\\xa7\\xaa\\x6a\\x8f\\xf6\\x75\\x5d\\x05\\xe5\\x38\\xae\\xd5\\x6c\\x20\\xb0\\x94\\x5a\\xce\\x63\\xda\\xb1\\x00\\x78\\xfb\\x71\\xed\\x59\\x41\\xbb\\x4a\\x78\\xe9\\xdf\\x68\\xcc\\x88\\xe1\\xff\\xef\\x8f\\x99\\x5c\\x85\\xfc\\xf0\\xe1\\xfc\\xcd\\x13\\x47\\x5c\\xe4\\xaf\\x1a\\xaf\\x56\\xdb\\xce\\x68\\xf3\\x2f\\x02\\x67\\xaf\\xd7\\x5e\\xb5\\x93\\xee\\x90\\xff\\x8d\\x78\\x56\\xc4\\x4e\\x15\\x34\\x55\\x05\\xbd\\x85\\x5f\\x45\\x1d\\x2f\\x51\\x47\\xc6\\x38\\x30\\x44\\x64\\xfd\\xb1\\x39\\x40\\x4d\\x65\\xc7\\xe5\\xba\\x92\\x84\\x6c\\x10\\x68\\xab\\xf4\\x49\\xed\\x8a\\xca\\xfe\\xe5\\xc1\\x62\\xf7\\x0e\\x35\\x8c\\xfa\\xea\\x55\\xe9\\x82\\xe8\\x54\\xdd\\x12\\x8c\\x6b\\x15\\x3d\\x99\\xcf\\xf0\\x77\\x22\\x27\\x12\\x1c\\x87\\x75\\xf0\\x0a\\x6d\\x46\\x11\\x61\\xa8\\x90\\x56\\xcf\\x73\\x2f\\x4b\\x7a\\x40\\xa3\\x08\\x4d\\x9c\\x16\\x9a\\x94\\x7a\\x8e\\xf6\\x42\\xa5\\xd7\\x9b\\xb2\\x0c\\x1b\\x0f\\x01\\xd1\\xc4\\x8c\\xad\\x84\\xa0\\x89\\x6d\\xca\\x59\\x84\\x78\\x9b\\xec\\xd5\\x62\\xbc\\xbf\\x5b\\x91\\xe3\\xc3\\x99\\xba\\x32\\xcf\\x84\\x3d\\xab\\x46\\x2c\\x02\\x3a\\x1a\\xdf\\xa0\\xba\\x76\\x66\\xaf\\x48\\xbc\\x34\\x43\\xc9\\xe7\\x06\\x53\\x66\\xe5\\xda\\xe6\\x44\\x80\\xae\\x48\\x9c\\x95\\x57\\xe8\\xd1\\xfd\\x47\\x4c\\x9e\\x9f\\xcd\\x71\\xf6\\x8c\\xf3\\x67\\x48\\x5e\\x2c\\xa8\\x46\\xad\\x1d\\xee\\x9b\\xf6\\x1a\\x13\\x7f\\x40\\x1d\\x43\\xd5\\xd2\\x33\\xab\\xaa\\xc7\\xd8\\x00\\x76\\xc0\\x54\\xb5\\x51\\xff\\x42\\x0a\\x84\\x97\\x6b\\x14\\xe4\\x45\\xd0\\x71\\x89\\xb4\\xd2\\x15\\x3d\\xc9\\xc6\\x86\\xde\\x2e\\x13\\x7d\\xd1\\x9a\\x17\\x71\\xec\\xe6\\x67\\x64\\x06\\x6b\\xca\\x64\\x2c\\x6a\\xaa\\xd8\\xfc\\xe2\\x4b\\xde\\xec\\x76\\xdd\\xca\\xd6\\x33\\xb4\\xc0\\x59\\xb0\\xb5\\x4e\\x66\\x2e\\xf4\\x97\\x1b\\xfd\\x25\\xd4\\x5e\\x94\\xf1\\xec\\x3a\\x37\\x89\\x5e\\x98\\x4c\\xba\\x55\\xb9\\x11\\x7a\\x6d\\x9a\\xea\\x86\\x4e\\x35\\x57\\xba\\xc0\\xa4\\xe1\\x87\\xfa\\xb4\\xe7\\xec\\x84\\x35\\xcd\\x3d\\xdb\\x2a\\xa5\\x09\\xe2\\x19\\x84\\x92\\x06\\xde\\x90\\xe8\\x74\\x7f\\x21\\x57\\x10\\xea\\xfb\\x7f\\x19\\xc8\\xa7\\xb8\\xfc\\x05\\xfd\\x26\\xe2\\x17\\xfb\\x50\\x85\\xe0\\x4c\\x5d\\x33\\xc3\\x53\\x1d\\xf0\\xa7\\x4c\\x92\\xe8\\x18\\x1f\\xab\\x00\\x41\\xb1\\xde\\xfc\\x9d\\x5b\\xe6\\xfd\\xf2\\x79\\xbf\\x5c\\x14\\xdc\\x79\\x71\\xc5\\xce\\x74\\xb6\\x0c\\xbd\\xa9\\xfb\\x55\\xda\\x91\\x09\\x7c\\x53\\xbb\\xb5\\xa4\\xec\\xf1\\x05\\x54\\xbe\\xce\\xd5\\xe3\\x72\\xae\\x09\\x15\\x3c\\x0f\\x7d\\x13\\x18\\x41\\x78\\xb1\\x3b\\xc4\\x2f\\x22\\x6b\\x54\\xe1\\xaf\\x58\\x98\\x79\\xfc\\x8c\\x34\\x9e\\x16\\xac\\xd5\\xda\\x99\\xfb\\xe8\\xcc\\x1f\\xf9\\x18\\xe2\\x2b\\x3b\\xcc\\x45\\x7a\\x0a\\x6a\\x95\\x5c\\xa4\\xd0\\x15\\xf0\\x0a\\xfd\\x7b\\x67\\xe4\\x40\\x85\\x18\\xba\\x4f\\xb0\\x56\\xda\\x54\\x69\\xdc\\x94\\x8f\\x32\\x98\\xdc\\x90\\x20\\x67\\xa3\\x32\\x31\\xe2\\x28\\x9e\\x95\\xa7\\x64\\xf7\\x1e\\xb5\\xc4\\xf4\\x95\\x2e\\x4c\\x91\\x59\\x54\\x96\\x44\\x59\\xce\\xdc\\x12\\xab\\x18\\x63\\xd4\\x14\\x75\\x45\\x87\\x2a\\x07\\x42\\xef\\xca\\xf0\\x8f\\x8e\\x7c\\xc0\\x02\\x5e\\x0b\\xc3\\x65\\x5d\\xf8\\x57\\xc0\\x5a\\x2d\\xd0\\xc7\\xa3\\xb6\\xb2\\x4a\\x07\\x81\\x87\\x01\\xc3\\x7c\\x8d\\xfd\\x23\\x22\\x87\\x68\\xcd\\x68\\x27\\x66\\x46\\xc8\\x7f\\x3c\\x70\\x22\\xcf\\xcb\\xf1\\x15\\xcb\\x23\\x22\\x29\\x1d\\x8d\\x22\\x9d\\x0a\\x51\\x76\\x58\\x6a\\x4c\\x00\\xc8\\x10\\xc0\\xc2\\xc3\\xa3\\x6a\\x05\\xfe\\x29\\xa5\\x9b\\x9a\\xe0\\x1a\\x29\\x5f\\x25\\xf9\\xc4\\xc0\\x7c\\xb9\\xc9\\x14\\xde\\x42\\x49\\x86\\xc3\\xa9\\xe2\\xc1\\x91\\x2d\\xae\\xd0\\x8f\\x50\\x63\\x23\\xab\\x78\\xb2\\xc4\\x12\\xc7\\xaa\\xe8\\x17\\x8a\\x64\\xf7\\xf7\\xce\\x33\\x8d\\x54\\xa0\\x7c\\xf8\\x58\\x3d\\xd7\\xd6\\xce\\x54\\xa7\\x67\\xe1\\x28\\xd4\\x9c\\x95\\x7b\\xf9\\x4c\\x8b\\x50\\x39\\xf9\\x2a\\xcc\\x00\\xb9\\xc6\\xb8\\xac\\xc5\\xaa\\xf7\\xa4\\x11\\x91\\x6f\\xe6\\xb7\\xf9\\x9a\\x35\\x93\\x98\\x39\\xff\\xf3\\x9e\\x4f\\xf7\\xb0\\x08\\x6c\\xb9\\x0b\\x4b\\xf3\\x1e\\x96\\xdd\\x16\\xc3\\xe7\\x10\\xd7\\x7f\\x41\\xbe\\x13\\x4a\\x42\\x1f\\x81\\x55\\xfe\\x62\\xfb\\x89\\x9a\\x3c\\xe8\\xc2\\x61\\x17\\x39\\x85\\x94\\xd3\\x4a\\x98\\x26\\x80\\xa7\\xa0\\x88\\x29\\x04\\x26\\x09\\x2e\\x7c\\xa7\\x89\\x92\\x13\\x86\\xef\\x34\\x02\\x39\\x12\\x7a\\xdf\\x97\\x32\\xed\\x19\\xc5\\x2b\\x75\\x26\\x92\\x8e\\x94\\x97\\x20\\x09\\x48\\xee\\x81\\x51\\xcc\\x04\\x90\\x61\\x2f\\xcb\\xf3\\x29\\xf7\\x43\\xb1\\x8f\\x2b\\xb2\\x2a\\x0c\\x21\\xb5\\x88\\xb4\\xb8\\x70\\x01\\x3a\\x89\\x37\\x7c\\xf4\\xd8\\xaa\\xc9\\x99\\x62\\x78\\xe3\\x85\\xb0\\x49\\x3f\\xdb\\xfc\\x62\\xa9\\xa2\\x7b\\x09\\x53\\x93\\xcc\\xf0\\xe2\\xdb\\x21\\x11\\x13\\xda\\x36\\x5c\\x3c\\x4e\\x19\\x1e\\xb8\\x37\\xff\\x8d\\xa6\\x1d\\xda\\xcb\\x09\\xcb\\xb2\\xbe\\xae\\xd4\\xbd\\xd9\\x81\\xb4\\x92\\x88\\x2a\\x43\\x98\\x5d\\x96\\x2a\\x45\\x3b\\xe4\\xc9\\xb9\\x03\\x7b\\x30\\x43\\x5f\\x19\\x5e\\x09\\x84\\xfb\\x52\\x45\\x34\\xfe\\x43\\x8f\\x29\\xa5\\x7c\\xd8\\x8c\\xc9\\xe0\\xf4\\xf4\\xa6\\x7a\\x2f\\x2a\\x25\\x68\\x87\\x3a\\x12\\x8e\\x85\\xc0\\xeb\\x0e\\x8d\\x21\\x33\\x67\\x57\\xbe\\x55\\xd9\\x95\\x94\\x02\\x82\\xea\\x1d\\x41\\x60\\x63\\x47\\xf0\\x72\\x94\\x90\\x77\\xb8\\xa7\\xb2\\x20\\xae\\xf8\\xaa\\xb9\\xed\\xf8\\x11\\x6e\\x3b\\xa6\\x59\\x78\\xd6\\x91\\x0e\\x55\\x76\\xd9\\xcd\\x3f\\xf0\\x9a\\x12\\xe5\\x44\\x69\\x15\\xb7\\xad\\xac\\xc6\\xe4\\xb1\\xaf\\x78\\x57\\x38\\x5d\\xe1\\x9c\\x6c\\x84\\x22\\x66\\xfc\\xe5\\xc8\\x83\\xfa\\xf7\\x39\\xd4\\x3f\\x64\\xd7\\xa5\\x58\\xef\\x9a\\x44\\xba\\x68\\x29\\x73\\xbf\\x8a\\xb2\\xc4\\xa3\\x8d\\x6c\\xd7\\xe8\\x19\\xe8\\xfa\\xb8\\xc6\\xe8\\x31\\xf0\\x9c\\x1b\\x4f\\x25\\x67\\x69\\x6d\\x6b\\x8e\\x32\\xe7\\xe8\\xe8\\xda\\xa9\\xb8\\xc9\\x34\\xef\\x6b\\xd4\\x0f\\x1c\\x94\\xcc\\x24\\x98\\x04\\xe4\\xed\\x85\\xea\\xc5\\x6b\\x87\\xbd\\x80\\xf3\\x15\\x11\\x0b\\x55\\x59\\x85\\xe5\\x7f\\x82\\x8e\\x5e\\x1b\\xaa\\x9f\\x6f\\xa5\\x8c\\x38\\x74\\x6e\\xfc\\x85\\x93\\x46\\x00\\xc0\\xf6\\xef\\xde\\xd5\\xbf\\xfd\\xb4\\x2d\\x65\\x2d\\xa5\\xaf\\x2d\\xa8\\x34\\x7e\\xb1\\xc0\\x99\\x45\\xed\\x71\\x6a\\x29\\x8d\\xb2\\xd2\\x79\\xf2\\x25\\xa5\\x13\\x38\\x48\\x38\\x74\\x00\\x83\\x62\\x87\\x0b\\x6f\\xf6\\x01\\x8b\\x7b\\xc8\\x16\\x95\\x74\\x98\\x2c\\x8a\\xe6\\xa8\\xe6\\xfd\\x2c\\x43\\x61\\x10\\x4a\\x82\\x70\\x72\\x48\\x12\\xe4\\xcf\\xa0\\x6a\\x7f\\xee\\x03\\xd2\\x84\\xa3\\xd8\\xd4\\x46\\x17\\x8b\\xf5\\xad\\x6e\\xe6\\x5a\\xb3\\xd8\\x59\\x1c\\xb8\\x7a\\x97\\xac\\x29\\x24\\x8b\\x39\\x98\\x45\\xb7\\x21\\xe5\\xaf\\xc1\\x91\\x4d\\xc9\\x34\\x3a\\x61\\x16\\x29\\xd2\\x23\\xdd\\x03\\xab\\xb4\\x50\\x45\\xb7\\x3a\\x15\\xb6\\xce\\x79\\x3e\\x47\\x1d\\x10\\x24\\x9a\\x4e\\x8d\\x25\\xbb\\x81\\xf5\\x47\\x04\\x17\\xba\\x32\\x69\\x9e\\x8b\\xb8\\x74\\xe8\\x0b\\x06\\x9e\\x3b\\x53\\xb6\\x7e\\xe0\\xe1\\x83\\xc7\\xce\\x79\\xcc\\x16\\xc6\\x3d\\xae\\x70\\xbb\\x26\\x9a\\xbf\\xb3\\xc9\\x97\\x4c\\x80\\x25\\x36\\x36\\x79\\x8f\\x09\\xb0\\x04\\x06\\xe3\\xc3\\xd0\\x77\\x5e\\xc9\\x9c\\x17\\x5d\\x5b\\x88\\xe6\\xa0\\xb1\\x15\\x0e\\xc8\\x6f\\xcc\\xa4\\x88\\x08\\x5e\\x22\\xf5\\xc2\\x36\\xc6\\x1a\\xe8\\x2b\\x79\\x85\\x25\\xe3\\xfb\\x03\\x5c\\x91\\x17\\xd4\\xdb\\x87\\xc3\\xa6\\xb6\\x95\\x71\\x1d\\x30\\x4c\\xad\\x38\\xe4\\xf8\\x4e\\x41\\xe0\\x27\\x13\\x1d\\x1b\\x2f\\x80\\xac\\x8a\\xe6\\x46\\x89\\x09\\x16\\xf1\\x60\\x43\\xf2\\x1c\\x51\\x13\\xa0\\x6d\\xc8\\x2b\\xb9\\x1b\\x14\\x33\\xd4\\x9a\\xb5\\xc6\\x0d\\xf0\\x64\\xc5\\xcd\\x88\\xe1\\x01\\xf3\\x69\\xaa\\x31\\x38\\xf9\\x00\\x5c\\xe8\\x3d\\xff\\x1d\\x19\\xd3\\x73\\x05\\x5a\\x60\\xb6\\x02\\x38\\x3f\\x04\\xb1\\x51\\x6a\\x36\\xe0\\x93\\xa0\\x75\\x27\\x00\\x1e\\xb4\\x36\\x04\\xed\\xa9\\x69\\x43\\xb2\\xc5\\x20\\xa9\\x34\\x58\\x9a\\x75\\xb4\\x37\\x14\\xcc\\x10\\x7f\\x8d\\x57\\x54\\x62\\x16\\xb4\\xef\\x2c\\x07\\x8c\\xa9\\x2c\\x82\\x81\\x80\\x30\\xae\\x98\\xda\\x84\\x18\\x01\\x8b\\x1e\\x70\\xaf\\xd6\\xe4\\x73\\xb6\\xae\\x91\\x9f\\x63\\xe3\\x7b\\xa6\\xb6\\x10\\xdb\\x30\\xb1\\xda\\x64\\x3e\\x7a\\xa6\\x7a\\x0b\\xf2\\x29\\x8a\\xfd\\xc5\\x53\\x0d\\xf8\\x32\\x4e\\x71\\x19\\x32\\xed\\x5e\\x1a\\x37\\x07\\x43\\x2c\\x22\\x76\\x88\\x68\\x61\\xd7\\xfa\\xec\\xf1\\x13\\x0e\\x77\\x6e\\x9a\\x6f\\xd9\\x71\\x8c\\xee\\x6e\\xf6\\xc2\\x96\\x0b\\x5a\\xeb\\x27\\x11\\x6e\\x2a\\xbf\\xa9\\xd3\\x76\\x6c\\xaa\\xbd\\x30\\x58\\xb2\\xf6\\x64\\x2a\\xf0\\xd1\\x4b\\x07\\xa3\\x9e\\x0c\\xd9\\x67\\x87\\xbf\\x74\\xea\\x2f\\x1d\\xf6\\x49\\x6a\\xb8\\xbd\\xfb\\x91\\xbd\\x71\\x78\\xb7\\xfe\\xc9\\x61\\x1f\\x1c\\xfe\\xc6\\x69\\xc2\\xb7\\xf7\\x0e\\xff\\x84\\x91\\x02\\x5e\\xd1\\x6f\\xe7\\xc4\\x62\\xef\\xa0\\xf8\\x89\\xd5\\x86\\x4c\\xbf\\xca\\x72\\x17\\xbf\\xbc\\xff\\xd0\\x65\\x7f\\x43\\x51\\xf6\\x9d\\xc3\\xfb\\x88\\xb0\\x34\\xe7\\x15\\x7f\\x45\\xd1\\xae\\xe6\\xbd\\xbe\\xb9\\x73\\x29\\x59\\x9d\\x42\\xca\\xae\\xd4\\xc8\\x80\\xbe\\xbe\\x21\\x63\\xf3\\xb6\\xf1\\xb7\\x53\\x5f\\x9a\\x75\\xc3\\xab\\x67\\xa9\\xf1\\xab\\x53\\x4f\\x61\\xd1\\x36\\x3d\\xfc\\xac\\x06\\x3e\\x89\\x1b\\x51\\x3d\\x60\\x19\\xfc\\x4d\\x98\\x5f\\xf7\\xda\\x71\\x9e\\x51\\x99\\x71\\x42\\x96\\x90\\xb2\\x84\\x94\\x85\\xfa\\xed\\xdd\\xad\\x29\\x9b\\x74\\x6d\\x9e\\xbb\\x5f\\x0b\\x95\\xbb\\xbd\\xae\\xe6\\xe7\\x2f\\x15\\xbe\\xf9\\xd0\\xf5\\x13\\xac\\xf0\\xa8\\x19\\xa3\\xbf\\x8c\\x66\\x06\\x3b\\x33\\xa8\\x07\\x8d\\xa4\\x9e\\x28\\x09\\x0f\\x69\\x26\\x93\\x80\\xc7\\x70\\xeb\\x6e\\x13\\x5d\\xdf\\x7e\\xe7\\xd4\\xe7\\x14\\xbb\\xd6\\xaf\\xd3\\x58\\xd0\\xab\\xad\\xfc\\xd6\\xcc\\xbf\\xb9\\xf2\\xdb\\x0d\\xcf\\x23\\x41\\x15\\xf5\\x2d\\xea\\x8b\\x46\\xc7\\x6c\\x2e\\x70\\x2b\\x57\\x7c\\x5e\\xd7\\xd7\\xf8\\x79\\x8d\\x9b\\x79\\xd6\\xbc\\xc1\\x08\\xc9\\xab\\x87\\x87\\x3c\\xa3\\xdb\\x06\\xe6\\xbb\\xfd\\xab\\x53\\xac\\x13\\x65\\x16\\x0e\\x2b\\xa1\\x57\\xdf\\x30\\xaf\\x8c\\xcd\\x3f\\x97\\xa6\\xac\\x84\\xcd\\x29\\xf4\\x31\\x24\\x7e\\x62\\x73\\xc2\\x0e\\x3f\\x3b\\x8d\\x1a\\xe5\\xaf\\xb1\\x85\\xc0\\xe6\\xb3\\xab\\xc0\\x0d\\x7c\\xf7\\x5a\\xa6\\xae\\x29\\xf5\\x3d\\x5b\\x96\\x71\\x7a\\xee\\xec\\x83\\x1c\\x47\\x36\\xaf\\x5b\\x77\\x66\\xfb\\xba\\x75\\xcd\\x44\\x60\\xf6\\xeb\\xd6\\x86\\x5e\\x4b\\xa1\\x47\\x34\\x07\\x21\\xe8\\x98\\x0b\\x3e\\x37\\xae\\xd1\\x53\\x08\\xfa\\xe6\\x12\\x2f\\x9b\\x92\\xf3\\x73\\xc8\\x0f\\xc9\\x45\\x20\\xa0\\xb7\\x38\\x91\\xb9\\x10\\xee\\x2d\\xce\\x67\\xc9\\x77\\x92\\x0c\\xa2\\x92\\xa2\\xda\\xbb\\xc9\\xa0\\xea\\x86\\xe6\\xe2\\x18\\x2a\\x6f\\x14\\x5e\\x8e\\x8b\\x42\\x91\\x60\\xe1\\xf0\\x70\\x42\\xde\\x0d\\x0e\\xdc\\x38\\x05\\x02\\xf8\\xfe\\xce\\xbe\\xa6\\x20\\xae\\x50\\x8e\\x5d\\xc3\\xdf\\x6b\\x74\\x2c\\x9e\\xc7\\x6f\\xe9\\xd2\\x45\\xad\\x6f\\xa0\\x5f\\x8b\\xd8\\x14\\x4a\\xc8\\x12\\x03\\x43\\xd3\\x2f\\xcf\\x2c\\x11\\xd8\\xa8\\x55\\x38\\x6f\\x00\\x94\\xa0\\xe6\\xcc\\x78\\x49\\x44\\xa1\\xb8\\x94\\x17\\x87\\x82\\x36\\x0a\\x3c\\x07\\xaf\\x8e\\x8e\\xae\\x94\\x59\\xeb\\x9d\\x0a\\x96\\x7a\\xc0\\x4c\\xda\\x08\\x73\\xe0\\x6f\\x45\\x9e\\x3b\\x69\\xd1\\x8c\\xb7\\x81\\x47\\x47\\xb7\\xaa\\xa2\\xcb\\xa7\\x54\\xb4\\xd1\\x2b\\xba\\xcc\\x2b\\xd2\\x4f\\x4b\\x28\\xf0\\xb9\\xd1\\x78\\x78\\x08\\xd5\\x39\\x80\\xeb\\x24\\x3f\\x07\\xf2\\x8c\\xa8\\xd6\\x70\\x0f\\x83\\x61\\xa5\\x7c\\x35\\x46\\x41\\xe9\\x10\\xa0\\x2c\\xb7\\x65\\xb7\\x27\\x08\\x6b\\x9a\\x7e\\x53\\xf7\\x09\\x00\\x15\\x34\\x9b\\x9f\\x77\\x5a\\x12\\xc7\\x2b\\xaa\\xeb\\x21\\x9b\\x99\\xe7\\x9e\\xef\\x12\\x2d\\x73\\xde\\x81\\x09\\x52\\x07\\x0c\\x7a\\x34\\x80\\xcd\\x17\\x18\\xba\\x57\\x04\\x60\\xf6\\xef\\x97\\xb8\\xba\\xdf\\x14\\xc7\\xfd\\x07\\x79\\xd8\\x03\\x84\\xaa\\x0e\\xfb\\x08\\x1d\\x18\\x38\\x2a\\x68\\x13\\x1d\\xed\\xd1\\xde\\xd1\\xee\\xf0\\x57\\x78\\x96\\x67\\xfa\\xa1\\x3a\\xe7\\x18\\xa5\\x5e\\x5b\\x26\\x18\\x86\\x48\\xb6\\x2d\\x1b\\x8e\\x11\\xe7\\x78\\x7a\\x97\\x11\\xd1\\xfc\\x0e\\xbf\\xa3\\x57\\x81\\x64\\xe0\\x4c\\xe6\\x96\\x86\\xb0\\xdc\\x1d\\x76\\x6e\\x8d\\x21\\x0f\\x20\\x63\\x9d\\x9f\\x2e\\x0b\\x8e\\x50\\xaf\\x52\\x00\\x44\\x9c\\x50\\x1c\\x36\\x48\\x3c\\xcf\\x60\\x01\\xcf\\x26\\x7a\\xea\\x94\\x93\\x7b\\x81\\x6d\\x29\\xbc\\x6d\\x9a\\x5f\\x92\\xec\\xc0\\x60\\xa4\\x6f\\x08\\x1c\\xde\\x1d\\x0c\\x0f\\x7f\\xaf\\x80\\x2a\\x41\\x65\\x28\\x62\\x76\\x0b\\x89\\x8d\\x57\\x54\\x50\\xa6\\x79\\x25\\x99\\xeb\\xed\\x92\\xb9\\xb3\\x89\\x87\\x6e\\x5a\\xf4\\xfe\\xe1\\xc4\\xc9\\x60\\x35\\x48\\x33\\x05\\x5c\\x59\\xe1\\x1a\\xa6\\x52\\x36\\x76\\x75\\xe5\\xa6\\x81\\x65\\x9d\\x05\\xcd\\x73\\xe5\\xd1\\xd4\\x45\\x5f\\x94\\x91\\xb1\\x66\\x09\\x9b\\x4d\\x12\\xbd\\xe6\\xca\\xe8\\x97\\x00\\xcb\\x3c\\x94\\x61\\xd7\\x44\\x95\\xac\\x0b\\xc3\\xdc\\x9e\\xf3\\x60\\xab\\x14\\xa1\\x5d\\xcd\\x07\\x6c\\xd1\\x04\\xac\\x04\\x17\\x51\\x17\\xd0\\x7f\\x88\\x9c\\xe6\\x98\\xb4\\xe0\\xe8\\x11\\x15\\x9e\\x3b\\xd3\\xd1\\x8a\\x2f\\xeb\\xcb\\x06\\x9c\\x17\\xdb\\xf2\\x42\\x15\\xb4\\xb1\\x44\\x56\\x3b\\x13\\xac\\x96\\xc7\\xda\\xdc\\x11\\x21\\x46\\xba\\x08\\xb1\\xd1\\x70\\x50\\x9b\\x10\\x97\\x37\\xaa\\x95\\x91\\x9a\\x06\\x24\\x00\\x24\\xf5\\xc1\\x0a\\x5f\\xbc\\x26\\x19\\xf1\\x8d\\x42\\x34\\x94\\xe5\\x31\\xf2\\x7e\\xb1\\x1a\\x84\\x91\\x70\\x2f\\xf7\\x51\\x58\\x4f\\x1a\\xf4\\xae\\xfc\\x17\\xd6\\x91\\xd4\\x5d\\x1d\\x1d\\x15\\x47\\x5b\\xd2\\x5e\\x99\\x18\\xf3\\x89\\xce\\x09\\x8a\\x33\\x81\\x9e\\x5c\\xe9\\x98\\x20\\x03\\x7a\\x78\\x43\\x85\\xfe\\x09\\x09\\xbc\\x1a\\xb1\\xfa\\x4e\\xce\\x1a\\x63\\xf5\\x3d\\x33\\xe6\\xf5\\x05\\x42\\x57\\xd0\\x8e\\x84\\xe8\\x61\\x33\\xdf\\xec\\xe0\\x4d\\xec\\x79\\xbe\\x0e\\x05\\x78\\x4a\\xb2\\xf7\\x9d\\xa5\\xba\\xb3\\xd2\\x76\\x42\\xb3\\x28\\x6d\\x4b\\xe9\\x7b\\x64\\x46\\xa6\\x32\\x3a\\xa4\\x0a\\xad\\x19\\xda\\x31\\x8a\\xbd\\x22\\x7b\\x29\\x58\\x80\\x5b\\x5d\\x7e\\x60\\x5c\\xd2\\xea\\xdf\\x48\\xec\\x72\\xab\\x1f\\xc1\\x78\\xb6\\xb2\\xd7\\xe8\\x73\\x5d\\x5d\\x2a\\x2c\\x60\\xdf\\x13\\x6e\\xb9\\x11\\x98\\x64\\xad\\x63\\x92\\x19\\xaa\\x51\\xae\\xa0\\xaf\\x1b\\x2e\\x4e\\x6e\\xe0\\x02\\x0e\\x0c\\x09\\xad\\xde\\x35\\x22\\xf2\\x8e\\x6b\\xc4\\x73\\x63\\xc3\\xae\\x78\\x41\\x40\\xc3\\xeb\\x25\\xca\\xad\\x6e\\x35\\x1c\\x05\\xe4\\xc8\\x6b\\xc0\\x3f\\xb0\\xaa\\x50\\xa7\\xd9\\x45\\x7a\\x4e\\x76\\x3c\\x47\\x97\\xef\\x99\\x7e\\x76\\x2d\\x72\\x04\\x44\\xdd\\xde\\x15\\xcf\\x6e\\xc6\\x2e\\x30\\xf3\\xf1\\x07\\x7f\\x85\\x8c\\xbc\\xb1\\x31\\x6d\\xe3\\x06\\xb0\\xca\\x8c\\x03\\xad\\x93\\x63\\x3d\\x29\\x1c\\x52\\x4b\\x9a\\x5e\\x19\\x9e\\x3a\\xc8\\xc2\\x24\\x5e\\xaa\\x4a\\x6b\\xe4\\xcd\\x46\\x2c\\x8b\\x84\\x14\\xe9\\x06\\x16\\xed\\xc4\\xf2\\x69\\xdd\\xb2\\xac\\x6e\\xfd\\x07\\x58\\x22\\x26\\x52\\x1a\\x74\\x72\\x03\\x0f\\xc4\\x82\\x92\\xf3\\x84\\xb5\\x8e\\x3e\\xb5\\xce\\xb0\\x94\\x57\\xef\\x7a\\xc0\\x16\\x52\\x68\\xe5\\xd1\\x15\\xa8\\x9a\\x04\\x72\\xbd\\xfa\\x6f\\x6f\\x33\\xd6\\x22\\x75\\x9b\\xcd\\x8e\\xad\\xc7\\xf8\\x46\\x8c\\x41\\x73\\x7d\\xc3\\x66\\x6c\\x05\\x7c\\xcd\\x39\\xbb\\x63\\x57\\xec\\x92\\xdd\\xb2\\x6b\\xa4\\x3e\\x60\\x7a\\xe1\\xdf\\xb5\\xdd\\xd9\\xb2\\x17\\x7c\\x72\\x3a\\xb4\\x60\\x60\\x80\\x29\\xde\\xf2\\x1f\\x1d\\xf6\\x92\\x77\\x07\\x16\\xfb\\x0c\\x4b\\xe0\\x13\\xd7\\x78\\x72\\x71\\xbe\\xbe\\xe1\\x05\\x27\\x25\\x93\\x3e\\x70\\xc5\\x50\\xc9\\x84\\xf7\\x5c\\xe7\\xd9\\x45\\xda\\x2b\\xc1\\xbb\\x15\\x87\\x39\\x93\\x07\\x76\\x7e\\xea\\xe6\\x07\\xc9\\xcf\\xce\\xc3\\x03\\x10\\x8e\\x1c\\xb8\\xa4\\xdb\\xa5\\xe7\\x05\\xa4\\xa4\\xe6\\x8c\\x8d\\x1f\\x9c\\x7d\\xc9\\x74\\x33\\x87\\x0a\\xec\\xa3\\xd4\\xf9\\xb3\\x6e\\x94\\x13\\xce\\x81\\xf9\\x1d\\x77\\xba\\x96\\x0d\\xe0\\x60\\x35\\x51\\x9d\\x69\\x43\\xcd\\xd4\\xe3\\x2f\\x56\\xff\\x4d\\x5e\\x1b\\x65\\x7d\\x85\\x55\\x6e\\x25\\xff\\xa8\\x2a\\xfb\\x62\\xbf\\x52\\xc7\\x0f\\xb6\\xa4\\x15\\x7c\\x8e\\xe5\\xde\\xf9\\x77\\x5e\\x70\\xe1\\xa2\\x32\\x37\\x06\\xd7\\x95\\x24\\x5a\\xf9\\x0a\\x42\\x08\\xb4\\xf6\\x64\\xdb\\x55\\xcb\\x1e\\x45\\x39\\xa3\\x0f\\xc1\\x58\\x3b\\x11\\x71\\x55\\x95\\x69\\x43\\xa1\\x8e\\xa0\\xcf\\x87\\x56\\xf7\\x35\\x97\\xce\\xd8\\x24\\x75\\xfa\\xf0\\x50\\x5e\\x20\\x2e\\x49\\xb7\\x84\\xef\\x29\\x83\\xa6\\xcb\\xde\\xab\\x43\\x1c\\xb2\\x2f\\x84\\x3f\\xbd\\x17\\xc2\\x5d\\xf9\\x6c\\x3c\\x83\\x77\\xdb\\x23\\xcf\\xda\\xf8\\xd2\\x99\\xda\\x31\\xbc\\xd0\\xf1\\xb2\\xc3\\x01\\x1a\\x13\\x23\\xd3\\xa8\\x7c\\x3f\\xa7\\x15\\x99\\x47\\x84\\x3e\\xc3\\xef\\x29\\x7e\\x4f\\xc5\\xf7\\x14\\xbf\\xa7\\xf4\\x1d\\xfe\\x56\\xc4\\xec\\x4f\\x95\\x08\\x13\\xc3\\xdd\\x02\\xcd\\x04\\x5c\\x1f\\xf0\\x66\\xa3\\xf2\\x50\\x39\\x6d\\x86\\xac\\x89\\xe7\\x42\\xdd\\x81\\x21\\xfb\\x4d\\x3c\\x14\\xe0\\xf1\\x1a\\x63\\x20\\xd0\\x06\\xde\\x2a\\xf0\\x15\\xbe\\xbd\\xf6\\x86\\x9f\\x08\\x10\\x89\\x7c\\xe8\\x9b\\xea\\x40\\x0e\\xdb\\xd8\\x6d\\x9f\\xa0\\x4b\\x0d\\x11\\x82\\xa1\\x2b\\x9d\\xb0\\x95\\xd3\\xae\\x4f\\x93\\x33\\xd0\\x28\\x1a\\xa9\\x10\\x48\\x35\\x88\\x15\\x95\\x4c\\x05\\x51\\xc8\\xa6\\x46\\x01\\x43\\xe5\\x44\\x22\\x7f\\x45\\xc5\\x3a\\xa7\\xd2\\x48\\xf3\\x3a\\xa9\\x7e\\x59\\xdb\\xe1\\xe0\\x4b\\xfb\\x75\\xbe\\xcd\\x55\\x59\\x7e\\x74\\xec\\x89\\xe8\\x35\\xf5\\x19\\xf9\\x2d\\xfb\\x2d\\xd6\\xe9\\xee\\xdc\\xef\\x3e\\x56\\xdd\\x0a\\x83\\x8d\\xef\\x55\\xb3\\xa2\\xae\\x95\\x2e\\x88\\x1e\\xab\\xe4\\x45\\x65\\x25\\x2f\\xb0\\x92\\x9c\\x15\\x7e\\x52\\x45\\x2f\\x79\\x83\\x44\\x3e\\x2f\\xb1\\xe8\\xdd\\xd3\\xca\\x5c\\xf1\\x14\\xce\\xce\\x54\\x79\\xe7\\xd9\\xc5\\xcf\\x50\\xdb\\x15\\xd6\\xb6\\x79\\x5a\\x6d\\x70\\xc2\\xc2\\x51\\xfb\\x58\\x6d\\xb7\\x65\\x71\\xd4\\x2b\\x29\\x8e\\x22\\xda\\xf6\\x07\\x87\\xfd\\xec\\xb0\\x1f\\x1d\\x14\\xc6\\x75\\xda\\x16\\x5d\\x90\\xb9\\x51\\x10\\xc1\\x36\\x4a\\x59\\xa4\\x39\\x7d\\x01\\x02\\x48\\xb8\\xf9\\x3a\\xa4\\x1f\\x13\\x2f\\xae\\x0c\\xb3\\x51\\xab\\x51\\x63\\xcb\\x24\\xe0\\x4e\\x4a\\x2d\\xfc\\xe9\\xc0\\x93\\x76\\x9f\\x86\\xea\\x0a\\x51\\x3a\\xfa\\xd3\\x69\\x5d\\x91\\xad\\xb5\\x57\\x69\\x61\\x1d\\x16\\xe1\\xe2\\x5b\\xc7\\x7b\\x26\\x93\\xe3\\xd0\\x46\\x9b\\x05\\xa8\\xc9\\x91\\xe2\\xf2\\xa5\\x54\\x15\\x12\\x3f\\x41\\x1b\\x8f\\xee\\x3f\\xf1\\xea\\x3f\\xbe\\xfe\\x5f\\x6e\\x20\\xac\\x8b\\x26\\x44\\x03\\x30\\xea\\x0a\\x80\\xb8\\xd5\\xbd\\x12\\x22\\xc0\\xa5\\x1b\\xf0\\x40\\xc0\\xe6\\x2f\\x07\\x9e\\xf6\\x61\\xf3\\xd7\\x17\\x60\\x83\\xfa\\x3e\\xe5\\x16\\xdc\\x42\\x90\\xd1\\xb1\\x2c\\xd9\\x5c\\xe3\\x37\\xa7\\xbe\\x77\\x23\\x40\\x23\\x43\\xb5\\xbe\\xbf\\x1e\\x85\\xce\\xe1\\x26\\xc8\\xad\\xb5\\x68\\xa0\\xf9\\xa5\\x06\\xaa\\xa1\\x93\\xec\\x56\\x2c\\xa1\\x23\\x96\\x10\\xc1\\x28\\x70\\xa0\\xa0\\x80\\xd1\\x6f\\x28\\x5f\\x64\\x7f\\x38\\xbc\\x75\\x3a\\xb0\\xfa\\xc7\\xec\\x1f\\x18\\xa7\\xe1\\x5f\\xf0\\xa7\\x65\\x9d\\x9c\\x9c\\xf4\\xd8\\xef\\x70\\x1a\\x57\\xc0\\xf0\\xf7\\x2f\\xc3\\x70\\x9e\\x1a\\x5f\\x07\\x35\\x91\\xc3\\x11\\x3f\\x57\\xd0\\xd3\\xdf\\xbf\\x04\\xc3\\xbc\\x89\\xa7\\x41\\xad\\xaa\\x81\\x6a\\x18\\x2e\\x25\\x0c\\x83\\xbd\\x22\\xa9\\x28\\xb2\\x12\\xd0\\xfb\\xc9\\x81\\xa7\\x7d\\xe8\\xfc\\x74\\x00\\x3a\\x4f\\xd8\\x15\\x32\\x52\\x85\\xd8\\xf3\\x4a\\x2b\\x62\\x21\\x35\\x3a\\x5a\\x57\\x40\\x07\\xf4\\xf2\\x2b\\xf9\\xf4\\xe1\\xc1\\x7b\\x78\\x88\\xc7\\x06\\x7a\\xcc\\x3c\\x13\\xe1\\xb9\\x33\\xb2\\x48\\xc8\\xa4\\x57\\x1b\\x34\\xae\\xc5\\xb7\\x98\\x4c\\x92\\x32\\xb1\\xe7\\x56\\xda\\xc4\\x74\\x07\\x03\\x96\\xc2\\x76\\x66\\xa5\\x14\\x6f\\x2f\\x25\\x6e\\x63\\xb8\\x43\\x5b\\x16\\xa7\\x10\\x19\\x00\\x8c\\x9f\\xfe\\x37\\x50\\x00\\xd4\\x27\\x37\\x7d\\xac\\x76\\xff\\x42\\x3d\\x5c\\x89\\x46\\x10\\xdf\\xed\\x4f\\xd2\\xa5\\x9c\\xa4\\x98\\xc9\\x42\\x7a\\x91\\xc3\\xf8\\xb4\\xf6\\x3f\\xb5\\xc6\\x9d\\x2a\\x6a\\xe6\\x8f\\x8b\\xe2\\xf1\\x4a\\x62\\xef\\xef\\x8b\\x2b\\x4f\\x07\\x95\\xf6\\xaf\\xd0\\xca\\xb6\\x33\\x38\\x3e\\xed\\xf6\\x60\\x67\\xa0\\xb3\\x91\\x4f\\x19\\xd0\\xad\\x7e\\x0a\\xa9\\xc3\\x7e\\xbf\\xdf\\x3b\\x1e\\x30\\xe7\\x53\\xe6\\xd8\\xc3\\xc1\\xa0\\x27\\x1e\\x57\\x0e\\x74\\xc2\\xb3\\x4f\\x7a\\x27\\x27\\x83\\x61\\x9f\\x39\\x9f\\xb3\\x58\\x54\\xd1\\xef\\x40\\xe6\\x2b\\xcf\\x5f\\x60\\xd9\\x4e\\xe7\\xb4\\x0b\\x3c\\xc3\\x95\\x9f\\x7c\\xc2\\x16\\x86\\xc7\\xc7\\x56\\xb7\\xdf\\x67\\x57\\x81\\xe3\\x5e\\xc3\\x49\\x03\\xbf\\x21\\xf0\\x7d\\x33\\x27\\x58\\x45\\xe1\\x8c\\xbe\\x77\\xad\\x3e\\x14\\xc7\\xfe\\xe0\\xec\\xe0\\xc3\\x8d\\x1f\\x01\\xe7\\x6b\\x9f\\x5a\\x83\\x41\\xd7\\xea\\xb2\\xab\\x18\\x98\\x0c\\xbb\\x63\\x9d\\x74\\xfb\\xdd\\x1e\\x54\\x95\\xc5\\xc1\\xe6\\x36\\x8a\\xa0\\x74\\x7f\\x70\\x3a\\xec\\xf6\\x3a\\xcc\\x75\\x80\\x96\\xa6\\x2a\\x86\\xdd\\xe1\\x70\\xd0\\x3d\\x61\\x44\\x45\\xc5\\x1e\\x10\\xd5\\xd4\\xe1\\xde\\xa0\\x0b\\x49\\x91\\x4b\\x54\\xa5\\xdd\\xe9\\x1d\\x9f\\x9c\\xf6\\x8f\\xd1\\x37\\x6d\\xec\\x04\\xd8\\x89\\x7e\\xbf\\x7b\\xdc\\xc5\\xd7\\x10\\xb8\\xa4\\x5b\\x2f\\x16\\x75\\x0d\\x4e\\x3b\\xa7\\x27\\x1d\\x4a\\x4e\\xfc\\xe0\\x9a\\x7a\\x3b\\x80\\xda\\x98\\x1b\\xfb\\xab\\x24\\x82\\x3e\\x41\\xb9\\x1e\\x22\\x04\\x77\\xe3\\x84\\x12\\x54\\xb8\\x8a\\x04\\x74\\x7b\\xa7\\xf4\\x42\\xdf\\x7a\\x83\\xe3\\x6e\\x8f\\x5e\\x17\\x51\\x00\\x8c\\x71\\x8c\\xdd\\xef\\x5a\\xa7\\xdd\\x53\\x99\\x6b\\x11\\x3b\\x1b\\xbb\\x03\\xff\\x3b\\xb5\\x3a\\xc7\\x32\\x05\\x7d\\xe1\\x76\\x07\\x43\\xa8\\x5f\\xbe\\xef\\xe4\\xb8\\x5e\\x3a\\xd7\\x3e\\x54\\xd3\\xef\\xf5\\xba\\x03\\x51\\xcd\\x0a\\x6f\\xbb\\x52\\xc7\\x3e\\xed\\x58\\xa7\\xc3\\xbe\\x68\\x31\\x0a\\xfc\\x1b\\x4f\\xd4\\x36\\x18\\x9c\\x1e\\x9f\\x9e\\x8a\\xac\\x91\\x70\\x3e\\x88\\xa3\\x3f\\x06\\x38\\xcb\\x34\\x77\\xe9\\x43\\xcf\\x2c\\xab\\x6f\\x59\\x9d\\x2e\\xa5\\xc5\\xde\\x8c\\xaa\\x03\\x9c\\x4a\\xef\\x09\\xcd\\x1d\\xcc\\x7c\\xcf\\x3a\\xe9\\x77\\x44\\xb9\\xc4\\x73\\x44\\x03\\xb0\\x18\\x4e\\x01\\x6a\\x22\\x11\\x81\\x4d\\xa0\\xe8\\x1f\\xf7\\xfa\\xbd\\xfe\\x71\\x91\\x4a\\xa3\\x45\\xc8\\xf5\\x4f\\x07\\x7a\\xaa\\x57\\x4e\\x85\\x35\\xfe\\x29\\x8b\\x7c\\x98\\xc4\\x41\\xf7\\xb4\\x2f\\xd2\\xd4\\xe2\\x18\\x9e\\x9e\\x0e\\x10\\x76\\x9e\\xb7\\x5e\\xa3\\x6d\\x0d\\x8c\\xa3\\x33\\x3c\\xc5\\x46\\x20\\x25\\xb9\\xde\\x88\\x86\\x4f\\x3b\\x83\\x0e\\x9b\\xf9\\x2b\\x6a\\x70\\x78\\x0a\\x6b\\x68\\x38\\x10\\xef\\x9e\\xf6\\x1e\\xcd\\x16\\x72\\xce\\xbb\\x96\\xd5\\x83\\x11\\xb0\\xb9\\x0f\\x54\\x50\\xec\\xc3\\x9a\\xed\\x20\\x80\\x3a\\xfd\\x21\\x83\\x95\\x01\\xab\\x45\\xed\\x11\\x58\\x09\\xa7\\x00\\x34\\x54\\x21\\x4b\\x52\\x39\\x55\\xdd\\x61\\xef\\xa4\\xdf\\x05\\xda\\x1e\\x18\\x5c\\xdf\\xa1\\x1e\\x75\\x4e\\x61\\x49\\x2c\\xd0\\xc4\\xe2\\x2a\\x8a\\x23\\x5c\\x30\\xb0\\xd6\\x60\\x7f\\x2c\\x96\\x51\\x92\\xaa\\xba\\x7a\\x9d\\x21\\x64\\x65\\xb8\\x32\\xb0\\x10\\xbc\\x40\\xcd\\xda\\x3a\\xe9\\xf7\\xba\\xa7\\x1d\\x4c\\xc2\\x41\\x40\\x0b\\x1d\\x9c\\x0a\\xd1\\x66\\xaf\\x7b\\x3c\\x3c\\x11\\xcf\\x1b\\x2f\\x80\\xb5\\x0b\\xfd\\xed\\x5b\\x3d\\xd8\\x39\\x8c\\x86\\xa8\\x72\\x2f\\xa3\\xd0\\xdb\\xcc\\xbc\\x5b\\xb9\\x61\\xa1\\x07\\xcb\\x28\\x55\\x70\\xeb\\x9d\\x1c\\xf7\\x2d\\x74\\x9d\\xec\\x3b\\x21\\xce\\x76\\xa7\\xd7\\x1f\\x9c\\x0c\\xba\\x7d\\x4a\\x5a\\x44\\x04\\xc5\\x5e\\x0f\\x72\\xdc\\x44\\xf1\\x86\\xc6\\x0e\\x1d\\x04\\xaa\\x51\\x2c\\xbf\\xc1\\xf1\\x09\\x74\\xd9\\x62\\x81\\x03\\xdc\\xea\\xcc\\x8b\\x21\\xa5\\xd3\\xeb\\xe2\\xca\\x50\\x29\\x00\\xd9\\x64\\x49\\xe5\\x7a\\x3d\\x00\\x77\\xe0\\xdc\\x86\\xa2\\xf7\\x27\\xb0\\x96\\x4f\\x8f\\x87\\x2c\\xf0\\x60\\x45\\xc1\\xca\\x9b\\xcf\\x71\\x61\\x21\\x6c\\x01\\xc7\\xb0\\x00\\x8f\\x1d\\xb1\\x95\\x60\\x2f\\xc1\\x12\\xef\\x8b\\x24\\xb9\\x6b\\x07\\xc7\\x43\\xf4\\xd2\\x2a\\xd3\\x70\\x93\\x75\\x00\\xb8\\xb0\\xc2\\x4f\\x45\\x52\\x0e\\x40\\x05\\x18\\xc0\\x6b\\x27\\x5d\\xec\\x16\\x7d\\xa5\\xfd\\x06\\x9b\\xb9\\xdb\\x83\\x8d\\x29\\x93\\xc4\\x0a\\x3e\\x3d\\x81\\x4d\\x97\\x27\\xed\\xe6\\x52\\x40\\x1b\\x9c\\xf4\\x87\\xb2\\x8f\\x6a\\x47\\x40\\x22\\x4c\\x47\\x57\\x26\\xaa\\x2d\\xd1\\xed\\xf4\\xbb\\x27\\xa7\\xb2\\x59\\xb5\\x30\\x21\\xc1\\xea\\xf5\\x65\\x2b\\xc5\\x96\\x38\\x3e\\xe9\\x01\\xe6\\xed\\x95\\x92\\xbd\\xdd\\xe4\\xd4\\xf3\\x02\\x09\\x16\\xe8\\x04\\x6c\\x2d\\x91\\x9e\\x0f\\x13\\xa6\\xa7\\x73\\x82\\x89\\x2b\\xc4\\x61\\xdd\\x13\\x8b\\x1e\\xe5\\x7a\\x81\\xa5\\x84\\x53\\x19\\x00\\x2a\\x0f\\x09\\x24\\x83\\x21\\x20\\x42\\x85\\x36\\xf2\\x25\\x0b\\xc8\\x3e\\x82\\x21\\x21\\xee\\x1c\\x5a\\x27\\x0c\\x7d\\x68\\x65\\x2b\\xed\\x14\\x80\\x45\\x73\\xdc\\xeb\\x76\\xe5\\x07\\xb9\\x75\\x06\\xf2\\x55\\x61\\x91\\x6e\\xb7\\x83\\x2b\\x5b\\xa6\\xae\\xb3\\x78\\x1d\\x78\\xb0\\x71\\x01\\x47\\xc3\\x99\\x23\\x12\\x73\\x28\\xf5\\x4e\\x8f\\x4f\\x60\\x2d\\xa8\\xe4\\x1c\\x75\\x9c\\x58\\x27\\xc7\\xc7\\x00\\x3d\\x99\\xbe\\xc6\\x83\\x50\\x94\\x18\\xf6\\x3b\\xb0\\x22\\x44\\x7a\\x81\\x28\\xfa\\xb0\\x36\\x7b\\x96\\xca\\x2f\\x90\\x85\\x58\\xd3\\x40\\x12\\x76\\x8e\\xa1\\x5d\\x7f\\x16\\x16\\x0b\\x0b\\x00\\x00\\x5b\\x0b\\x12\\xc3\\x14\\x5d\\x61\\xae\\xf0\\x04\\xeb\\x76\\x4e\\x06\\x50\\x81\\x9f\\xa4\\x9b\\x38\\x4a\\xd4\\x21\\x86\\x45\\x23\\xd7\\x75\\x12\\x3f\\x94\\x29\\xdd\\x53\\x16\\x3a\\x37\\xce\\xdf\\x51\\x8e\\x13\\x86\\x27\\x43\\x58\\xb7\\x90\\x08\\x8b\\x06\\x0e\\x21\\x58\\x80\\x68\\x47\\x0c\\x5f\\x00\\x15\\x0f\\x06\\x98\\x80\\x3e\\xd1\\x71\\x4f\\xf6\\x60\\xd5\\xd3\\xdb\\x2c\\x76\\xae\\xec\\x63\\xab\\x7f\\x72\\x0c\\xc8\\xac\\x40\\xc9\\x80\\xda\\x60\\xc3\\x8b\\x77\\xea\\x3e\\xe0\\x84\\xd3\\x1e\\x1c\\xa4\\x0a\\xb6\\xfd\\x1e\\x6c\\x00\\x98\\xfa\\x35\\xf0\\xd8\\x1a\\xaa\\x18\\x0c\\x07\\xc7\\x30\\x54\\x91\\x4c\\x60\\x02\\x74\\xda\\x85\\xed\\x24\\x92\\x0a\\x38\\xc1\\xda\\xe9\\x9e\\xc2\\x5c\\x50\\xb2\\x06\\xa6\\x7e\\xef\\x04\\x50\\x4d\\x0f\\x92\\xd7\\xce\\xc6\\x81\\x91\\xad\\xc5\\xc6\\xb5\\x8e\\x8f\\xd9\\x1a\\xa5\\x18\\xeb\\x6c\\x3e\\xa7\\xb1\\xc2\\xff\\x21\\x9b\\x17\\x67\\x88\\x2f\\x86\\x27\\x80\\xf6\\x99\\xda\\x1b\\xc3\\x8e\\x05\\x6b\\x68\\x1d\\x64\\x2b\\x3c\\xa3\\xbb\\xfd\\x61\\x0f\\x0a\\x47\\xb7\\x33\\x89\\x64\\xa1\\x6d\\x38\\x23\\x60\\x27\\xca\\x25\\x81\\xab\\xec\\x18\\x76\\x32\\xa0\\x5c\\x0f\\x20\\x2c\\x53\\x87\\x43\\x58\\x12\\x70\\xfc\\xca\\xe1\\xc3\\x52\\x82\\x41\\xc0\\x84\\x6c\\x24\\x3d\\xd0\\x85\\x33\\x75\\x00\\x47\\x4d\\x1c\\x6d\\x1c\\xb1\\x1f\\x60\\x9f\\x0d\\xf1\\x98\\x48\\x9c\\xd9\\x2c\\xf0\\x44\\x36\\x98\\x5d\\xd8\\x0d\\xc7\\x2c\\xdf\\xa3\\x80\\xfc\\x60\\x3b\\xc3\\x7b\\x38\\x53\\x35\\x0d\\xad\\x1e\\x94\\xec\\xb3\\x62\\x31\\x5a\\x03\\x48\\x3a\\xc6\\x84\\x64\\x09\\xdb\\x8a\\x40\\x00\\xa3\\x38\\x61\\x89\\xef\\x85\\x21\\xec\\x13\\xc8\\x30\\x3c\\x86\\xe5\\x0a\\x74\\xc1\\x0d\\xa2\\x3c\\x40\\xfd\\x5d\\xc4\\x1a\\xa5\\xfd\\x0d\\x94\\x49\\xb1\\x90\\x61\\x34\\x96\\x35\\x94\\x29\\x62\\xb3\\xf7\\x60\\x4e\\x61\\x4a\\xb5\\x7d\\xae\\x52\\x42\\xb9\\x91\\x07\\xa7\\x30\\x97\\xa5\\x45\\x3f\\xe8\\x5b\\xd0\\x6a\\x8e\\x02\\xfa\\x43\\x20\\x22\\x00\\x2e\\x29\\xa2\\xbf\\x1e\\x6e\\x16\\x7c\\xf1\\x00\\x3f\\xc2\\x90\\x4e\\x87\\x44\\x47\\xa6\\x00\\x4c\\xc0\\x41\\xb0\\xc6\\x80\\x74\\x49\\xa3\\x95\\x93\\x46\\x84\\xf5\\x8f\\xe1\\x4c\\x67\\xda\\xce\\xe9\\x0e\\x60\\xe1\\x0f\\x99\\x3c\\x60\\x61\\x29\\xc1\\x51\\x7c\\x32\\x64\\xb7\\x4b\\xcf\\x49\\x89\\xb2\\xeb\\xe1\\x88\\x8a\\x03\\xf0\\x18\\x8e\\x16\\xf1\\x9a\\xac\\xa2\\x6b\\x45\\xfc\\xc1\\x06\\xd0\\x30\\xd1\\x10\\x05\\xc8\\xe2\\x5d\\x2d\\x47\\x58\\x11\\xd6\\x71\\x7f\\x6b\\x8e\\xbe\\xaf\\x52\\xa4\\xc3\\x8b\\xf4\\xef\\x1d\\xe9\\xde\\x67\\x23\\x9c\\x63\\x93\\x84\\x9b\\xb2\\x44\\x31\\x7f\\x4d\\x3e\\xd7\\xee\\x96\\x31\\x7f\\x81\\x92\\x7c\\xf2\\x0e\\x97\\xdc\\x3c\\x6a\\x63\\xc3\\x7c\\xf3\\xbe\\x52\\xdf\\xcd\\xe7\\x1e\\x93\\x3a\\x8f\\x23\\x61\\x63\\xfc\\x96\\xbc\\x0a\\x31\\x21\\x87\\xf2\\xc6\\xb1\\x9d\\x51\\x9c\\x79\\xcd\\x49\\x5f\\xac\\x3b\\xd7\\x7d\\xc4\\x42\\x20\\xca\\x7d\\x11\\x4b\\xcd\\x29\\x34\\xa0\\x35\\xa9\\xc6\\x50\\xc4\\x27\\x8f\\x2a\\x75\\x14\\xbe\\xf1\\xbe\\xe4\\x3a\\x39\\xab\\x0a\\xde\\x91\\xee\\x95\\x4f\\x4b\\xe5\\xd1\\x15\\x98\\xae\\xb1\\xa0\\xfb\\x05\\x40\\xb6\\x20\\x32\\x45\\xe8\\x1f\\xfd\\x5e\\x42\\xf7\\xe9\\xec\\x08\\x8d\\x43\\x18\\xc1\\x3f\\x6b\\xff\\x6c\\x14\\x3e\\x12\\xda\\x1f\\x6b\\xed\\x05\\xfb\\x67\\xad\\xf6\\x4f\\xb3\\x01\\x5f\\x6c\\x65\\x19\\x82\\xec\\xd0\\x7b\\x6f\\xf1\\xfa\\x6e\\x6d\\xfc\\x73\\x82\\x25\\x1a\\xb5\\x8f\\xe1\\xb4\\x66\\x52\\xa4\\x2e\\xa4\\xce\\x5f\\x46\\x33\\x0f\\x66\\xd0\\xd2\\x74\\x90\\xa8\\xdf\\x15\\xde\\x08\\xe2\\x9d\\x2c\\xef\\xa3\\xdb\\x04\\xbe\\xea\\x56\\xa0\\x74\\x05\\x97\\x47\\x16\\x88\\x31\\xa9\\xd9\\x51\\x81\\x1b\\xb0\\x2f\\xdf\\xa9\\xcc\\xb5\\x59\\x8d\\xd5\\x64\\xbe\\xfb\\x5a\\x63\\xd7\\x09\\xbc\\xa6\\x64\\x45\\x6e\\xac\\x85\\x26\\xab\\x30\\x22\\x6e\\xd4\\xec\\x6f\\x66\\x13\\x8a\\xa6\\x32\\xad\\x6d\\x25\\xc0\\xa0\\x36\\xf8\\xb0\\xc5\\x4b\\x0a\\x9e\\x8e\\xcb\\x7d\\xca\\xad\\x41\\x71\\xca\\xd0\\xa1\\x8d\\x9d\\xa1\\x14\\x57\\x1b\\xc6\\xe1\\x75\\x4b\\x23\\x4a\\xce\\x78\\xa0\\x06\\x45\\x8e\\x3b\\x33\\xf5\\x96\\xf1\\x67\\x1d\\xe6\\x4b\\x16\\x3b\\x21\\xe5\\xdb\\x3e\\x79\\x1a\\xd4\\x60\\x0b\\x7b\\x47\\x77\\xca\\x37\\xf2\\x1a\\x0d\\xf4\\x09\\x50\\x99\\xd7\\x33\\xa9\\xc1\\x5e\\xff\\xd9\\xee\\x07\\xb4\\xee\\x16\\x97\\xb2\\x8d\\x86\\xb7\\x4d\\xb8\\xd7\\xe8\\x4a\\x2f\\x3f\\x7b\\xf9\\xd4\\x3c\\x75\\x7a\\x14\\x42\\xcb\\xc8\\xd0\\xd1\\x4b\\xc7\\xda\\x6b\\xab\\xd1\\x35\\x8f\\x8e\\x1a\\x8d\\xc4\\xb4\\xe9\\x63\\x4c\\xbe\\x57\\x9f\\x59\\x78\\xe5\\x91\\x9b\\x94\\x03\\xb8\\x8a\\x45\\x56\\x13\\x8b\\xec\\x9f\\xc2\\x16\\x7b\\x14\\x9c\\x25\\xa3\\x3c\\x0c\\x80\\x5e\\x73\\xd2\\x68\\xa0\\x44\\x5f\\x38\\xf1\\xa4\\xaa\\x4d\\xac\\x38\\x77\\x11\\x26\\x3a\\x66\\x1e\\xe8\\x57\\x82\\x8a\\x98\\xe8\\x98\\xb2\\xd1\\x70\\x0a\\xb7\\x62\\x31\\x40\\xc4\\x35\\xd1\\x52\\xda\\x0f\\x33\\xaf\\x50\\xf7\\x93\\x3d\\x65\\x49\\xd3\\xc9\\xd5\\xd3\\xf3\\xd4\\x22\\x08\\x99\\xb0\\xd3\\xba\\x87\\xed\\x8e\\x7f\\xd0\\xb4\\x80\\x05\\x85\\x9d\\x5f\\xc2\\x2d\\xd4\\xd0\\x40\\x07\\x6a\\x18\\xc2\\x0c\\x9a\\x8a\\x46\\xc5\\xa4\\x2d\\xc9\\x71\\x11\\x24\\xfa\\x47\\x47\\xb1\\xf8\\xb6\\x54\\x66\\x36\\x8c\\x4a\\x8c\\xd2\\xa3\\x23\\x89\\x5e\\x96\\xa4\\x60\\x39\\x07\\x08\\x98\\x0f\\x0f\\xd2\\x7e\\x6c\\x99\\xf7\\xcc\\xc1\\x65\\x37\\xdf\\x0d\\x6b\\x4f\\x73\\x5e\\xf6\\x9b\\x46\\x71\\x2a\\xcd\\x7c\\xc3\\x89\\x22\\xb4\\xe3\\x52\\x53\\xcd\\x3b\\x8a\\x3a\\x84\\xad\\x52\\x8e\\x43\\xaa\\x74\\x3b\\x4a\\xae\\x7a\\x42\\x33\\x26\\xc3\\xc2\\x14\\x7a\\xa7\\xfc\\xc3\\x91\\x3b\\x21\\x81\\xe1\\x27\\xd9\\x0e\\x1a\\xca\\x83\\xff\\xa6\\x7b\\x1a\\x8c\\x6a\\x0b\\x1c\\x8a\\xdf\\x10\\xc1\\x20\\xc2\\xa9\\xb9\\x2d\\x50\\x9a\\xa9\\x36\\xeb\\x47\\x52\\xaf\\xd4\\x87\\x55\\xed\\x02\\x06\\x6b\\xf6\\x77\\x0a\\x91\\xc4\\xcc\\x85\\xb3\\x46\\x1c\\x39\\xb8\\xf3\\x59\\x0d\\x8d\\x81\\xdb\\x90\\x58\\xa3\\x93\\x28\\xd5\\xbe\\xfe\\xff\\xd4\\xd7\\xd4\\xb9\\x6a\\x26\\xde\\x1a\\xfd\\x99\\x7b\\xb3\\xa6\\xf0\\x75\\x24\\xdd\\xf1\\xfd\\xdb\\x61\\xbf\\x38\\x2c\\x74\\x59\\xea\\x32\\xcf\\x65\\xb1\\xb0\\xdb\\x98\\xdc\\x89\\xab\\xbc\\x1a\\x7a\\xa9\\x01\\xac\\xfb\\x22\\xf4\\x57\\x74\\xd3\\xf0\\x5d\\xec\\xac\\xbc\\x9a\\x39\\x7d\\x78\\xd0\\x3b\\xad\\xdd\\x4d\\x87\\xac\\x73\\x6c\\x92\\xdb\\x07\\x0a\\xd9\\xf2\\x54\\xd5\\x7d\\xa5\\x9b\\x0f\\x3b\\xb0\\x27\\x9d\\x22\\x17\\x2a\\x2c\\x0a\\x8b\\x7a\\x8d\\x14\\x17\\xb2\\x6b\\x43\\x5d\\x76\\xc6\\xe6\\x36\\x20\\xa0\\x50\\x84\\x89\\x1b\\xfd\\xe2\\x8c\\x7f\\x71\\x5a\\x21\\xf7\\xed\\x7f\\x3b\\xdc\\x87\\x31\\xc1\\x9f\\xd0\\x7d\\x78\\x30\\x52\\x97\\x97\\xae\\xde\\x53\\x17\\x36\\xb9\\xcb\\x81\\xaa\\x73\\x8d\\x4f\\x64\\x34\\xae\\xfa\\xda\\x9a\\x23\\x97\\xa8\\xcb\\xb8\\xde\\xe0\\xe5\\xff\\x87\\x54\\x0a\\x7a\\xe3\\x28\\xdb\\xf3\\xdd\\xa4\\x56\\x9f\\xb8\\xef\\xa6\\x1c\\x46\\x58\\x37\\xd2\\x42\\x5c\\xd7\\x41\\x5f\\x15\\xa6\\xd9\\x4e\\x6d\\x3d\\x8b\\x14\\x8a\\x65\\x2e\\x9f\\xd4\\x36\\x78\\xd1\\x0c\\xff\\x1c\\xf8\\x37\\x87\\x7f\\x6b\\xf8\\x17\\xc2\\xbf\\x8f\\x77\\x57\\x03\\x54\\x08\\x86\\x7f\\xf0\\xdf\\x35\\x3a\\x6f\\x82\\x7f\\xdf\\xc3\\xbf\\x0f\\xf0\\xef\\x1d\\xfc\\x7b\\x5d\\xc3\\x70\\x83\\xac\\xf6\\x67\\x6d\\x4a\\xeb\\xe5\\x55\\x4a\\x6e\\x64\\xc5\\xd2\\x7a\\x47\\x2e\\x37\\x2a\\x5d\\xeb\\xe4\\x42\\x4f\\xb4\\xea\\xb3\\xce\\xc8\\xb6\\xaf\\xce\\x31\\x98\\x76\\x4a\\x5a\\xe7\\x6a\\xb0\\x50\\xe6\\xbd\\x70\\x72\\x88\\x36\\x32\\xbc\\xd3\\xd0\\xae\\xf1\\x3b\\x70\\xbc\\x75\\x1b\\xb9\\x76\\x40\\x98\\xeb\\x06\\x74\\x2c\\xcc\\x9b\\x8b\\x92\\x9b\\xc0\\xc5\\x17\\xd2\\xcf\\x3e\\xeb\\xd5\\xb5\\x4a\\x0c\\x3c\\x23\\xdb\\x3d\\x13\\xeb\\xcf\\xdc\\xc9\\x49\\xc3\\x6b\\xf7\\xa4\\xaa\\xaf\\xef\\xf2\\xb6\\x31\\xb6\\x8d\\xc9\\x7f\\xee\\xd1\\xa8\\x67\\xf2\\xfc\\x8c\\xff\\x07\\x5d\\x41\\x1b\\x93\\xc6\\xc7\\xe6\\x37\\x94\\xf4\\x8f\\xff\\xc1\\x1f\\x0b\\xfe\\x7d\\x9c\\x35\\xe0\\x2f\\xc3\\xa7\\x56\\x73\\x2c\\xde\\x26\\x4e\\xf3\\xf3\\xb7\\x90\\xa1\\xed\\xb3\\xc8\\xcd\\x65\\x8f\\x57\\x55\\xde\\xc1\\xc2\\x5c\\xc2\\x69\\x74\\x61\\xae\\xdd\\xaa\\x3c\\xe2\\x7b\\x6b\\x1e\\x47\\xab\\x97\\x12\\x61\\x93\\xd2\\x45\\xf4\\x85\\x0a\\x4f\\xd0\\x21\\xd2\\x17\\xf2\\x74\\x86\\x90\\xe9\\x8f\\x2f\\x67\\x82\\x97\\x5f\\xd7\\xc0\\xf0\\xbc\\x74\\x12\\xb2\\x76\\x5b\\x54\\x7b\\x5b\\xc4\\x42\\x30\\xfb\\xae\\x9f\\x08\\x74\\x05\\x98\\xe3\\x70\\x46\\xa0\\x8f\\xa2\\x10\\xf5\\x64\\x9c\\x80\\xb2\\xce\\x0f\\x67\\xfd\\xce\\xbf\\xf3\\x66\\x94\\x29\\xae\\xcc\\x74\\x60\\xe5\\xe4\\x25\\xb5\\xeb\\x85\\x62\\x45\\x58\\x94\\x11\\xe3\\x8d\\xe2\\x8a\\x1a\\x50\\x80\\x75\\xe1\\x3e\\xcd\\xa1\\x59\\xc3\\xad\\x89\\xe7\\x96\\xeb\\x12\\x46\\x18\\xfd\\xad\\x5f\\x11\\xdc\\x2f\\xbc\\x14\\x53\\xed\\x03\\x17\\x7d\\x97\\x68\\x97\\xfd\\xeb\\x87\\x97\\x14\\x2d\\x04\\x01\\x86\\xd9\\x37\\x5f\\xce\\xbd\\x91\\x99\\xbf\\x03\\xdc\\xf2\\x27\\x20\\x8f\\x2f\\x95\\x50\\xf9\\x64\\xb1\\x1f\\xa2\\x2c\\x4e\\xbe\\x54\\x86\\x32\\xc9\\x02\\xe7\\x7e\\x10\\xa0\\x0f\\xe7\\x28\\x9c\\x7d\\xb1\\x9c\\x9e\\x37\\x2f\\x1e\\x66\\xa9\\xf7\\x84\\x92\\x94\\x4d\\x15\\x02\\x7a\\x62\\xf9\\xc5\\x22\\x98\\x49\\x16\\xb8\\x78\\x5a\\xff\\x2e\\x4a\\x5d\\x43\\xb4\\xfb\\x68\\x09\\xcc\\xa0\\xe5\\xfd\\x0c\\x8b\\xf1\\xe7\\xf9\\xbc\\xe4\\x49\\x34\\x2f\\x65\\x6d\\x85\\xa3\\xbe\\x9f\\xe7\\x87\\xab\\x94\\x19\\xb0\\xca\\x64\\x7f\\x71\\x04\\x2e\\x32\\x76\\x72\\x45\\x68\\xa6\\xb4\\xad\\x4b\\x4d\\x6d\\x45\\x96\\xdc\\x1c\\x28\\xb8\\x79\\xb4\\x5c\\xd5\\x92\\xc9\\x0b\\xab\\x8f\\x8f\\xd6\\xb0\\xb7\\x7a\\xf2\\xe2\\xf4\\xe5\\xd1\\xb2\\x87\\x16\\x52\\x5e\\x85\\x9e\\xe1\\x0b\\x35\\xed\\xad\\x29\\xad\\x12\\xfa\\xf6\\x78\\xf9\\xdd\\xe5\\x55\\x94\\xc6\\x2f\\x8f\\x96\\xad\\x58\\x69\\x79\\xe9\\x8b\\x27\\xf4\\x7d\\x77\\xd1\\x89\\xc2\\x98\\x7a\\xb0\\x98\\x38\\x74\\x02\\x81\\x64\\x0a\\x0c\\x33\\x72\\x5c\\x8a\\xd6\\xc5\\xbf\\x4b\\x2b\\xe3\\x74\\x71\\xf8\\x3e\\x73\\xa4\\x7f\\x27\\x35\\x6a\\xc0\\x6f\\x78\\x1d\\xb7\\x65\\x65\\x24\\x49\\x19\\x72\\x4c\\x11\\xb6\\x34\\xfc\\x62\\x98\\x0d\\xc2\\xbd\\x55\\x07\\x40\\x29\\x1b\\xa1\\x45\\xea\\x51\\xc2\\xe5\\x83\\xd0\\x6d\\xcf\\x93\\x5b\\x19\\x50\\x3c\\xea\\x13\\x3c\\x17\\x9f\\xa1\\x9f\\xbb\\xc3\\x28\\xdc\\x6f\\xba\\xae\\xd1\\xf5\\x7a\\xcc\\x2a\\x85\\x3e\\x3a\\xd8\\x5b\\x46\\xef\\x12\\x39\\x88\\x17\\x81\\x62\\x01\\x7d\\x57\\x0e\\x5b\\x84\\x6b\\x2a\\xf2\\x3d\\x3a\\x5c\\x91\\xa5\\xd9\\x11\\x83\\x85\\x6e\\x27\\x12\\xcc\\xa5\\xb1\\xe4\\x23\\xc5\\x0f\\xbb\\x03\\xfd\\x79\\x8e\\x1d\\xad\\x30\\x3c\\x97\\x90\\xd1\\x0c\\xe0\\x75\\x72\\x24\\x6c\\xa6\\xcd\\xa1\\xd7\\xaf\\x8b\\xae\\x96\\xf1\\x11\\xf4\\x28\\xad\\x4a\\x05\\xda\\xee\\x64\\xd8\\xf7\\x06\\x30\\xa0\\x49\\x2d\\x81\\xb3\\xcf\\xd9\\x90\\x19\\x97\\x7c\\x48\\x81\\x7e\\x16\\x4f\\xb7\\xde\\x2c\\x54\\xcf\\xe9\\x12\\x76\\xb2\\x78\\x9c\\xc7\\xbe\\x78\\x48\\x1c\\xe8\\x0f\\x3e\\x4e\\x0f\\x48\\xa5\\x52\\x7e\\xdc\\x14\\x57\\xe5\\x1e\\x8c\\x03\\x1d\\xb8\\x57\\xae\\x4a\\x43\\x5b\\x95\\x66\\x15\\xf0\\x9b\\xea\\x65\\x43\\x13\\xf1\\xed\\xf1\\xa1\\xc5\\xba\\x37\\x6b\\xc7\\xf5\\x92\\x22\\xe7\\xce\\x1c\\xaa\\x9e\\x29\\x08\\xe7\\x8d\\x54\\x81\\x5a\\x9f\\x27\\x94\\x6c\\x00\\x4f\\x4e\\x5d\\x69\\x1f\\x43\\xff\\x30\\x4a\\x23\\x79\\xd6\\xc6\\x61\\x36\\x6a\\x49\\x6d\\xca\\xbd\\x7c\\x7e\\x65\\x0a\\x4d\\xbf\\x57\\x9a\\x79\\xfc\\x22\\x6a\\x84\\x02\\xff\\x6f\\xf4\\x4c\\x90\\x25\\xad\\x5b\\xcf\\xbb\\xc6\\xda\\xc4\\x6c\\xab\\x94\\xa4\\x48\\x2a\\xd6\\x22\\x7d\\x50\\x2b\\x55\\x7e\\x2c\\x2d\\x56\\xcc\\x20\\x57\\x6b\\x9e\\x43\\xbc\\xd3\\x4c\\x27\\x2e\\xbf\\xaf\\x35\\x6b\\x36\\xb0\\x00\\x97\\x76\\xed\\x9b\\x1a\\xb3\\xec\\x9a\\x55\\x03\\xb8\\x03\\x79\\xfc\\x9f\\x8f\\x49\\x1d\\x68\\xdd\\x36\\x5b\\xe2\\xcb\\xb7\\x6d\\xa4\\xfd\\xc9\\x85\\x5c\\x95\\x65\\xef\\xbd\\x08\\x07\\x27\\x02\\xb4\\xd9\\xef\\x52\\x52\\xdb\\x85\\xa5\\x2c\\x13\\x7e\\x4e\\x49\\x9f\\x50\\xb8\\x8d\\x27\\xc2\\x4b\\xd4\\x64\\xdc\\xcf\\x80\\x90\\x5c\\x39\\x81\\x5d\\x6b\\xd5\\x58\\xba\\x8c\\x32\\x94\\x5b\\x27\\x36\\xb2\\x9e\\x0b\\x20\\xf5\\xd6\\x40\\x9a\\xda\\x93\\xde\\x94\\xb9\\x59\\x1c\\x7b\\xa1\\xbb\\xb1\\x27\\xb5\\x7f\\x20\\xc7\\x32\\x65\\x68\\xdc\\x4f\\x98\\xb8\\xf6\\xad\\xf3\\xcd\\xb7\\x57\\xdf\\x7c\\xeb\\x7d\\xf3\\xed\\x1f\\xdf\\x7c\\xfb\\x67\\x8d\\xbe\\x40\\xea\\xaa\\xfd\\xed\\xac\\x8d\\xef\\xa9\\xc8\\xf5\\x83\\xfd\\xed\\xb9\\xfd\\xed\\x45\\x0d\\x65\\xfa\\x7e\\x04\\x8d\\x4c\\x6a\\x2f\\x90\\xe5\\x79\\x77\\x4e\\xb5\\x6d\\x30\\xe1\\x42\\x6d\\xb0\\x73\\xb5\\xc1\\x3e\\xe4\\x1b\\xec\\x77\\x6d\\x83\\x7d\\x28\\x36\\xd8\\x77\\x6a\\x83\\x5d\\xe4\\x1b\\x8c\\x25\\xcb\\x28\\xc6\\x15\\x20\\xab\\x14\\xf5\\x89\\xca\\x44\\x45\\xa2\\x0a\\x51\\x5a\\x14\\x85\\x52\\x2b\\x44\\x78\\x58\\xe4\\x27\\x27\\xcc\\x9c\\x98\\x2a\\xf7\\xae\\x62\\xf9\\x78\\xee\\xc4\\xee\\x12\\x7e\\x5f\\xac\\x63\\x3f\\xa0\\x77\\x4c\\xfd\\x29\\x0b\\x3d\\xfa\\x09\\xf0\\xed\\x45\\xb6\\xc8\\x12\\x54\\x30\\xbe\\xf0\\xd6\\xa9\\x47\\xf1\\xf9\\x58\\xed\\x67\\x37\\x8d\\xc4\\xd3\\xdb\\xe8\\x46\\x25\\xbe\\xf2\\x5c\\xf1\\x28\\x3b\\x7b\\xae\\xb5\\x2d\\xda\\x15\\x4d\\x8a\\x06\\xf5\\xe6\\x44\\x6b\\xa2\\x31\\xd1\\x92\\x68\\x43\\xd4\\x2f\\xaa\\xae\\xa1\\x5f\\xf3\\x9c\\x55\\xe4\\x0b\\xb7\\xa5\\x2f\\x0f\\xe4\\x76\\x17\\x1e\\x89\\x8b\\x5c\\x4f\\x27\\xb7\\x13\\x1b\\xb8\\x59\\xf8\\xb7\\xeb\\x65\\x59\\xf8\\x46\\x25\\xb7\\x65\\x6c\\x0d\\x0c\\x36\\xbc\\xaf\\x5d\\xa5\\x4b\\x26\\x7e\\x94\\x83\\x2c\\xe1\\xb8\\x26\\x6d\\x70\\xc8\\x90\\x0a\\x4f\\x35\\x09\\x3d\\xff\\x1f\\x74\\xc7\\xbc\\x43\\xf7\\xc9\\xcf\\xa2\\x08\\xff\\x32\\xf9\\x97\\xc8\\x15\\xbc\\x76\\xc5\\xa1\\xe6\\x8d\\xc4\\x48\\x50\\x88\\xea\\x39\\xbb\\xb6\\x9c\\xc0\\xf7\\xde\\xb8\\x7b\\xde\\x7c\\x5b\\x38\\x54\\x73\\x7c\\x03\\xd8\\x84\\x1e\\xa7\\x94\\xd9\\x4e\\x3c\\xe9\\x3f\\x96\\x34\\xd7\\x61\\x57\\x7e\\xe7\\xe1\\x72\\xda\\xe5\\xac\\x12\\x81\\x30\\xa3\\x95\\x97\\xc6\\x1b\\xf2\\xe8\\x20\\xf3\\xbd\\x8c\\x02\\xe9\\xb6\\xe3\\x90\\xcf\\x5d\\x0c\\x28\\x29\\xf2\\x26\\x0c\\x3d\\x45\\xe9\\x1e\\x48\\xa4\\x0b\\xe8\\xc4\\x23\\x9f\\x4f\\xa5\\x06\\xb6\\x6c\\x06\\xbd\\xb9\\x58\\x2f\\xbd\\xbd\\xce\\xc0\\x19\\x4e\\xc9\\x48\\x0c\\xbf\\x8b\\xfc\\x70\\xd7\\x3b\\x3f\\x7a\\xd0\\x74\\x01\\xe7\\xcd\\xfc\\x10\\x76\\x64\\x82\\x8e\\x18\\x30\\x17\\xd9\\xab\\x90\\x71\\x22\\x43\\x43\\x52\\x28\\x7c\\x9e\\x05\\xa9\\x5f\\x55\\x83\\xde\\x79\\xbd\\xa6\\x03\\xfd\\x0f\\x85\\xb7\\xab\\x83\\xed\\xbc\\xf1\\x43\\x4f\\xb0\\xbb\\xbb\\xed\\x78\\xc6\\x4e\\x57\\xc9\\xeb\\x39\\xf5\\xeb\\x70\\xa1\\xaf\\xeb\\xdc\\x5c\\x00\\x57\\x56\\xfd\\x2e\\x0a\\x36\\x8b\\xbd\\xc9\\x5a\\xee\\xf5\\xa3\\x80\\x4e\\x55\\xfe\\xaf\\xec\\xc2\\x52\\x75\\x01\\x6a\\xfd\\x5e\\xce\\xf1\\x93\\x16\\x8e\\x5c\\x10\\xfe\\x17\\x97\\x0e\\xad\\x18\\xb5\\x2b\\x1c\\xd8\\x14\\x55\\xd2\\xc7\\x15\\x46\\x6b\\x2a\\xed\\x1c\\x68\\xf1\\x1c\\xf6\\xf5\\xca\\x95\\x7e\\xa8\\x5d\\xb6\\x51\\x5b\\x0c\\x3e\\x00\\x62\\xd8\\x59\\x7e\\xe6\\xfd\\xca\\x6d\\xf0\\x7e\\xfd\\x93\\xb3\\x65\\x34\\xd7\\xf6\\x15\\xdd\\xf8\\x5f\\xa0\\x9a\\xbf\\x7c\\x7e\\x1d\\xce\\xe0\\x69\\x2d\\xe0\\x26\\x3e\\xe8\\x96\\x2d\\x6e\\x8b\\xd0\\x01\\xd0\\x97\\xe7\\x6e\\x2b\\x2f\\xcb\\x17\\xde\\x56\\x95\\xc1\\x0a\\xf6\\xec\\x10\\xba\\xf5\\x8d\\x3b\\xc2\\xc6\\xad\\xb3\\x70\\x8c\\x1d\\x68\\x84\\x76\\x58\\xae\\x42\\xbe\\x40\\x71\\x7c\\xa4\\xee\\xf1\\xab\\x02\\x2a\\x57\\x28\\xc0\\x48\\x0e\\x19\\x11\\x23\\xe4\\xcf\\x85\\xf4\\xf8\\x8e\\x4f\\x12\\x1e\\xb2\\x25\\x0f\\xa7\\x26\\x9b\\x93\\xce\\xe0\\x9c\\xa3\\xcb\\xa2\\xb3\\x05\\xba\\x93\\xe3\\xfa\\x95\\x99\\x08\\xa6\\x2e\\xc5\\x9f\\x6b\\xcf\\x98\\xa4\\xf5\\x57\\x0e\\xf3\\xe0\\x8f\\x70\\x57\\xb6\\x52\\x3e\\x44\\x67\\x9e\\xb1\\x42\\x7b\\x48\\x9f\\x4f\\x32\\xdc\\x19\\xcd\\x0c\\x37\\x89\\x85\\xe6\\xdc\\x33\\x74\\xe0\\x99\\x99\\xa3\\x73\\xcf\\x88\\xd0\\xbe\\xfc\\x0e\\x7f\\xa5\\xd9\\x5f\\xda\\x5c\\xb3\\x80\\xbb\\x67\\xd6\\xb8\\x63\\xc3\\xfc\\xdf\\xf0\\x08\\xcd\\x06\\xde\\x39\\xf5\\x80\\xcd\\xf8\\xc2\\x31\\x5c\\xf3\\xac\\x73\\x42\\x91\\xb7\\x66\\xff\\x31\\x6e\\xce\\x82\\xfa\\xfa\\xe8\\x28\\xa8\\xa7\\x67\\x37\\x32\\x48\\xc9\\x06\\x0a\\x74\\xb0\\xc0\\x68\\x23\\x7b\\xbf\\x31\\x73\\x73\\xbe\\x1b\\x6e\\xdc\\x34\\x7a\\x43\\xcb\\xfc\\x16\\xfe\\x34\\xd1\\x92\\xfe\\x50\\x25\\x4d\\x55\\xcb\\xfc\\x6c\\x43\\xe0\\x50\\xb5\\xcc\\x49\\x89\\x72\\xce\\x3d\\x93\\x79\\xb2\\x01\\xcf\\x1c\\xcd\\xc6\\xeb\\xb3\\x74\\xec\\x18\\xb8\\x8f\\xce\\xf0\\x67\\x89\\x17\\x20\\x4b\\x80\\x9c\\x8d\\xee\\x6c\\x96\\x5a\\x62\\x82\\x89\\xcb\\x33\\x9e\\x8c\\x8d\\x84\\x40\\x9d\\x08\\x50\\x2f\\x65\\x01\\xd3\\x4e\\xcf\\xd6\\x4f\\xaf\\x4a\\xf4\\x4a\\x84\\x5f\\x18\\xad\\x78\\x8c\\x66\\x67\\xdb\\xd2\\xe5\\xd7\\x95\\x5c\\x19\\x69\\xd9\\x18\\xf1\\x0e\\x9d\\x53\\x25\\xec\\x0e\\xc6\\xc9\\x97\\x4c\\x65\\x0a\\xd1\\xb7\\x61\\xc9\\x2a\\x37\\xcb\\x2f\\x05\\x57\\xf9\\x45\\x51\\x73\\x3d\\xda\\x34\\x70\\x36\\x62\\x9a\\x8d\\x71\\xdc\\x30\\x62\\x98\\x31\\x00\\xaa\\xdd\\x44\\xf0\\xda\\xb1\\xe8\\xd6\\x0d\\xd4\\x37\\xe3\\xde\\x48\\xad\\x4e\\xaa\\x8a\\x89\\x1f\\xfd\\x0a\\x15\\x56\\xa2\\xb6\\xae\\x8d\\xd2\\xc5\\xa9\\x79\\x9f\\x19\\x37\\x6c\\x96\\xef\\x1e\\x58\\xed\\xb0\\x95\\xa0\\xed\\x8d\\x79\\xf6\\xd2\\x21\\x28\\x34\\x01\\x3c\\xd0\\x0d\\x60\\xda\\xca\\x83\\xda\\x1d\\x8a\\x53\\x12\\xf2\\xa5\\x4d\\x1e\\x9a\\xcf\\xad\\x71\\x8a\\x2b\\xc2\\x4e\\x4b\\xf6\\xd1\\xba\\xc0\\x50\\xd9\\x9f\\x97\\xec\\xa2\\x75\\x99\\x39\\x7c\\x7b\\x4e\\xbe\\x09\\xc6\\xe2\\x11\\x8e\\xe3\\x50\\x24\\xd8\\xe1\\xf3\\x94\\xfc\\xac\\xe3\\xcb\\x73\\x71\\xa1\\x2b\\x63\\x98\\xb0\\x35\\x2b\\x99\\x8d\\xf1\\x7b\\x81\\x5e\\x42\\x0d\\xbd\\x78\\x39\\x7a\\x89\\x0f\\xa2\\x17\\x35\\x71\\x19\\x4c\\x61\\x81\\x19\\x7c\\xf9\\x86\\xa8\\x21\\x62\\x1b\\xc0\\x82\\x34\\x05\\x45\\x15\\x78\\x92\\x56\\x63\\x9f\\x22\\xa3\\x80\\x74\\xb1\\x32\\xf4\\x06\\x3c\\xad\\x81\\x98\\x59\\x67\\x1b\\x77\\xac\\x4d\\x04\\x9b\\xc3\\xe3\\x82\\x9f\\xc2\\x94\\xd8\\x1b\\x98\\xa5\\x31\\x3e\\xdb\\xcd\\x97\\x8e\\xdc\\x4c\\x4d\\xf8\\x52\\x9e\\x2b\\xc0\\x5a\\xbb\\xf7\\xf0\\x80\\xc6\\x17\\x7c\\x09\\x15\\x01\\x0a\\xa3\\xb8\\x4c\\xec\\x1c\\xaf\\xfc\\x76\\xd1\\xf9\\x95\\xd2\\x8e\\x3e\\xd7\\xdc\\x27\\x11\\x6e\\x23\\x07\\x71\\xae\\x66\\xa0\\x2c\\xe3\\x52\\x9c\\x8b\\x68\\x67\\xe8\\xf5\\x2e\\x95\\xde\\x26\\x3d\\x48\\x84\\x33\\x25\\x10\\x81\\xa1\\x33\\xf3\\xe1\\x01\\x1f\\xd1\\xc2\\xca\\x1c\\x1b\\x8e\\x41\\xa8\\x8b\\x2c\\x5d\\xcf\\xe4\\x0b\\xa2\\x34\\xdc\\x82\\xf8\\x4b\\xb6\\xb3\\xc0\\x4f\\xc9\\xc2\\xd5\\xd9\\xac\\x29\\x99\\xdc\\x02\\x40\\xa4\\x63\\xfa\\x0c\\xf1\\x46\\xee\\x92\\x9d\\x79\\xb0\\x71\\x9b\\x30\\x4a\\x0c\\x55\\x5d\\x38\\xe7\\x13\\xfe\\xdb\\x7c\\x8c\\x88\\x95\\x9e\\xf1\\x78\\x04\\x85\\x98\\xe8\\x2f\\xc6\\xd4\\x67\\x46\\xc4\\x1d\\xea\\x02\\x13\\x75\\x9f\\x01\\x1e\\x33\\xd6\\x30\\xe3\\xc2\\xbe\\x17\\x30\\x3a\\x75\\x40\\xdd\\x5c\\x9e\\xf3\\x3b\\x61\\x66\\x09\\xed\\x70\\xce\\x93\\x87\\x07\\xf1\\x30\\x1f\\x4f\\x26\\x16\\x34\\x0d\\xff\\xa6\\x2c\\x7f\\x9a\\xda\\x93\\x09\\x2c\\x56\\x48\\x81\\xe5\\x3a\\x9d\\x6e\\xb7\\x86\\xa9\\x80\\x8f\\xb6\\x43\\x71\\xe4\\x97\\xbd\\xd7\\xde\\xb9\\xfc\\xca\\xe5\\x97\\x2e\\xbf\\x75\\xf9\\x85\\xcb\\xaf\\x5d\\xfe\\xda\\xe5\\x2f\\x5c\\xfe\\xd6\\xe5\\x2f\\x5d\\xfe\\xb9\\xea\\x28\\xfe\\xe4\\xaa\\xc9\\x7b\\xeb\\x32\\x0f\\xb2\\xc1\\x80\\x3f\\xbb\\x30\\xe2\\xb4\\x9e\\x36\\xbc\\xba\\xd7\\x88\\xeb\\xb9\\xc6\\xc2\\x67\\x87\\x9c\\x4c\\xa7\\x50\\x31\\x64\\x7d\\x8d\\x59\\x5f\\xb8\\x0c\\x96\\xd4\\x95\\x4b\\xc9\\x97\\x98\\x7c\\x8b\\xc9\\x17\\xae\\x59\\xae\\x82\\x61\\x59\\x73\\x9c\\x8f\\xcc\\x9e\\x88\\x68\\x62\\xa9\\x13\\x76\\x31\\x52\\x8d\\x09\\x88\\x9e\\xa5\\xa9\\x11\\xb7\\x0b\\x9b\\xe7\\xcc\\xc4\\x54\\x79\\x87\\x73\\xe7\\xb2\\x2b\\x97\\x41\\x0b\\x50\\xff\\x85\\xcb\\xa0\\x07\\xd0\\x3e\\xb4\\x0e\\xbd\\x86\\x3e\\x43\\x8f\\x3f\\x15\\xa4\\xc3\\x95\\xa4\\x13\\x2e\\x3d\\x6d\\x27\\x5f\\x14\\x5b\\xf9\\xda\\x3b\\xb8\\x97\\x3f\\xe9\\x87\\xfb\\xeb\\x83\\xf4\\x41\\x29\\xdb\\x85\\x07\\x84\\xf3\\x1b\\x97\\xbf\\xf1\\x8c\\xb7\\x1e\\x7b\\xe7\\xb1\\xbf\\x3d\\x36\\x69\\x7e\\x72\\x58\\x13\\x7d\\xc6\\xc0\\xb2\\xfc\\xe0\\xf2\\x8e\\x77\\xaa\\x68\\x02\\x37\\xf0\\xd7\\xbb\\x86\\x64\\x65\\xc3\\x74\\xe1\\xfe\\xee\\x5e\\xcc\\x51\\xd5\\x55\\x0e\\xc5\\x77\\x45\\xf1\\x34\\xcc\\xff\\xb3\\x0e\\x82\\xda\\xa7\\xa8\\x3c\\x2a\\xc9\\xc2\\x10\\x39\\x22\\x52\\x6e\\x51\\xdc\\x79\\xc4\\x9a\\xca\\xe7\\x3f\\x02\\x35\\xca\\x1b\\x18\\xc2\\x5e\\x04\\x6b\\x17\\x8f\\xb8\\xac\\xf1\\xb1\\x33\\x15\\x26\\x8f\\xe2\\x11\\xb7\\x5a\\xb9\\x0b\\xd2\\x1f\\x91\\x89\\x91\\xa3\\x26\\x13\\x18\\x07\\x2c\\x59\\x18\\x09\\x2e\\xd9\\x42\\xd9\\x48\\x74\\xc8\\x98\\x08\\x07\\x48\\xb9\\x35\\x2e\\x12\\xeb\\x86\\x82\\x4d\\x14\\xfa\\xee\\x6b\\xf4\\x74\\xff\\xa2\\x44\\x4f\\x16\\x9e\\x23\\x3d\\xe3\\x2f\\x8c\\xa5\\xd4\\x8a\\x9d\\x5b\\xfe\\x97\\xa7\\x96\\xb3\\x13\\x00\\xc3\\x99\\x54\\x1b\\xb6\\xee\\xd7\\x6b\\x40\\xf1\\x28\\x45\\x31\\x14\\x74\\x82\\xa1\\xd3\\x58\\x61\\x89\\x67\\x4c\\x9a\\xad\\x21\\xeb\\x9d\\xb4\\x8e\\x85\\x43\\x51\\x07\\xa8\\xe5\\x20\\x31\\x26\\xdd\\xd3\\xd6\\x80\\xf5\\x07\\xad\\x01\\x24\\x93\\x1d\\xa0\\xd1\\xb1\\x8e\\x2d\\x71\\x93\\x5b\\xb4\\xfe\\x6b\\xe2\\x1c\\xf6\\x16\\x23\\xbc\\x3d\\x12\\x93\\x12\\x91\\x03\\x95\\x5c\\x36\\x2a\\xd0\\x01\\x92\\x63\\x40\\x88\\xa5\\x0f\\x0f\\x46\\x2c\\x1f\\x51\\xb5\\x40\\x3e\\x6e\\xcb\\x41\\x38\\x4a\\xcd\\x1a\\xa6\\xb0\\x34\\x7d\\x74\\x98\\xa8\\x5c\\x5a\\x1a\\x67\\x97\\x0d\\x4e\\x68\\x3c\\xda\\x30\\x07\\x03\\x36\\x1c\\x20\\x16\\x7d\\x42\\x75\\xc7\\xe5\\xea\\x7a\\xac\\x73\\xda\\x3a\\x2d\\x57\\x77\\xc2\\x3a\\x27\\xe4\\x4f\\x57\\x1e\\xab\\x65\\x6d\\xa2\\x94\\xc3\\x32\\xf1\\xb4\\xf5\\x11\\x4a\\x37\\x29\\x15\\x82\\x56\\x5f\\x42\\x1d\\x2f\\x83\\xfd\\xc2\\x68\\x54\\x46\\x0b\\x40\\xe2\\x40\\x38\\x44\\x48\\x61\\x19\\x0a\\xcf\\x39\\xc2\\x25\\x82\\xf2\\x2e\\x68\\x64\\x67\\xbc\\xd5\\xe9\\x1e\\x1d\\xb5\\xba\\xbd\\x3e\\xa2\\xb0\\xf8\\x8c\\x37\\x5b\\xfd\\xee\\xe0\\xe8\\xa8\\xd9\\xea\\x76\\xfa\\x67\\xf1\\x38\\xb2\\x29\\xcf\\x70\\xb8\\x93\\x09\\xbe\\x62\\xa6\\x4e\\x67\\x00\\x99\\x1c\\xdb\\x37\\x65\\x2f\\xe9\\xbe\\x36\\xdc\\x97\\x05\\x68\\x5d\\x96\\x18\\x16\\x3b\\x1d\\x69\\x6f\\x31\\x77\\x8a\\x37\\xd9\\xc1\\x7d\\x08\\x65\\xc8\\x71\\x2b\\x82\\x0d\\x6d\\x87\\xf4\\x97\\x58\\x7b\\xd9\\xb2\\x7d\\x7e\\xa9\\xe0\\xd5\\xa1\\x5c\\xfe\\x18\\x6b\\x1c\\x7c\\x81\\x16\\x4b\\xc5\\x34\\xfa\\x0f\\x4a\\xea\\x6f\\x71\\x89\\x36\\xcc\\x31\\xe9\\x5e\\x69\\x41\\xb0\\x78\\xda\\x73\\x5c\\x3c\\x6f\\x0f\\xa2\\xdd\\x74\\x87\\x32\\xa2\\xf1\\x96\\x12\\xe2\\x27\\xd2\\x4e\\x69\\x99\\x74\\xf2\\xca\\xaf\\x71\\xe9\\x75\\xbb\\xc5\\x39\\x5c\\xab\\xeb\\xed\\xa7\\x19\\x9e\\xfa\\x45\\x01\\xb4\\xb8\\x8e\\xca\\xaf\\x4e\\xf9\\x35\\x24\\x5a\\x23\\x4f\\x31\\xbf\\xd2\\x2e\\x59\\x2d\\x7c\\x6a\\x47\\x3c\\xb6\\x7a\\x83\\x3a\\xb5\\x93\\x7f\\xd1\\xcc\\xa8\\x8d\\xd2\\xee\\x20\\x42\\x47\\xee\\x9c\\xc3\\xd6\\xd6\\x95\\x3e\\xb6\\x95\\x33\\x5a\\xbd\\x3a\\x71\\xab\\xa5\\x6d\\xc6\\x84\\x0b\\x4b\\xe2\\x39\\x27\\x5b\\xe2\\x5c\\xaf\\xb1\\xb4\\x47\\x53\\x53\\x3b\\xf0\\x00\\xf7\\x27\\xb0\\xf1\\x06\\x03\\x60\\x25\\xe7\\xb0\\xb9\\x7a\\x27\\xf5\\x00\\x4e\\x82\\xa4\\xa1\\xd2\\x1a\\x32\\x0d\\x11\\xad\\xd8\\x23\\xae\\x29\\x16\\x3b\\xec\\x9b\\x48\\xab\\x16\\xeb\\xe9\\x59\\xc7\\xb2\\x8c\\xd5\\x81\\x32\\x15\\x0d\\x75\\xa1\\xd2\\xc6\\x4b\\x07\\xf3\\x74\\xba\\xf4\\x88\\xad\\xd1\\xae\\xae\\x07\\x4d\\xf1\\x01\\x76\\x3b\\x3d\\x57\\xb5\\x99\\x71\\x67\\xa7\\xcd\\xae\\xa5\\xfa\\x89\\x15\\x56\\xb4\\x49\\x55\\xab\\x36\\x87\\x43\\xad\\x51\\xc0\\x21\\x4f\\x6a\\x34\\xcc\\x17\\x89\\x3c\\x66\\x08\\xf0\\xef\\x5d\\xf6\\xca\\x65\\xef\\x5c\\xf6\\xab\\xcb\\xfe\\x76\\xd9\\x77\\x2e\\xfb\\x21\\xc7\\xac\\x5f\\x2b\\x0f\\x79\\x85\\x84\\xe0\\x0f\\x3a\\x09\\xf3\\xdb\\x41\\x4a\\xa7\\x94\\xed\\x87\\x42\\xda\\xf1\\x43\\x2e\\xed\\x60\\xef\\x5d\\x62\\x44\\x5f\\xb9\\xed\\x2e\\x8a\\x10\\x7f\\xce\\xfb\\xf5\\x87\\xf7\\x94\\x8e\\x5d\\xe9\\x2d\\x5f\\x6d\\xd9\\x8f\\x79\\xf9\\xdf\\xf5\\xf2\\x3f\\x15\\xf4\\xdb\\xf7\\x87\\xe9\\xb7\\x1f\\xf5\\xee\\xfe\\xfb\\xe0\\xa8\\x7e\\x54\\xbd\\x87\\x26\\x4a\\x45\\x7e\\xca\\xdf\\x71\\x90\\xdf\\x7b\\x85\\x28\\x67\\x0d\\x74\\xe9\\xe1\\xf3\\x5d\\x53\\x82\\xaa\\xf0\\x16\\xef\\x90\\xcf\\x6e\\x6c\\xf0\\xbd\\x33\\xf3\\xb3\\xc4\\x68\\x38\\x07\\x42\\x45\\xb0\\x08\\x83\\xa9\\x13\\x59\\x05\\xa4\\x40\\xc4\\x81\\x02\\x30\\xcd\\x3d\\xa2\\x9d\\xdc\\xa6\\xa1\\x4c\\x2b\\x0b\\x4a\\xac\\x7a\\x5a\\x10\\x3e\\x91\\xa0\\x2b\\xc2\\x22\\x82\\x24\\x12\\x95\\x70\\xb6\\xf7\\x5b\\x03\\xcd\\x49\\xf6\\x01\\xa9\\xdd\\xfb\\x2a\\x56\\x21\\x33\\x7e\\x70\\xa1\\xe1\\xf7\\xae\\xf2\\x5d\\xb0\\xc7\\x7f\\x28\\x03\\xd0\\xaf\\x61\\x40\\x32\\xe3\\x47\\xac\\xf5\\xb3\\x3b\\x9e\\xbc\\x75\\xdb\\x9f\\x91\\x9c\\x87\\xbf\\x53\\xfb\\x05\\x24\\x5c\\xbb\\xed\\x17\\x48\\xe8\\xc3\\xdf\\xa9\\x7d\\x01\\x09\\x97\\x6e\\xfb\\x02\\x59\\x00\\xf8\\x0b\\x2c\\x84\\x62\\x26\\xb0\\x3f\\xbb\\x92\\xb6\\xa2\\x37\\x7f\\xbb\\xfc\\x3b\\x17\\x78\\xd8\\x77\\x2e\\xff\\xd5\\x15\\x5c\\xec\\x7e\\x1f\\x7e\\xc6\\x3e\\x4c\\x26\\xb4\\xbf\\x60\\xbb\\xd2\\x0e\\x9b\\x4e\\xc5\\xf1\\x10\\xfd\\xbd\\x1b\\x72\\xed\\x11\\x4d\\x79\\x60\\x2a\\x85\\x6e\\xbc\\x22\\x0e\\x1e\\x1e\\x52\\xbc\\xfa\\xb3\\x37\\x0c\\x2f\\x78\\x51\\x55\\x3e\\xa4\\x48\\x45\\x4f\\x8d\\x2d\\x03\\xb4\\xb9\\xd4\\x89\\x8d\\xa9\\x5a\\xef\\xf6\\x9b\\x7f\\x78\\x64\\xf0\\xfb\\x0b\\xf9\\xcb\\xa9\\x70\\xb0\\xbf\\xb7\\xdc\\x1c\\x53\\x34\\x1e\\xd3\\x80\\x8a\\x0f\\x4f\\x3b\\x85\\x1c\\x5e\\xb1\\xa4\\xd3\\x71\\x6a\\x1b\\x3b\\x8b\\x1a\\x0e\\xa3\\x86\\x38\\xf4\\x9c\\x32\\xe4\\x8c\\x5d\\x42\\x19\\x3a\\xa3\\x80\\x20\\x5d\\x62\\xab\\x39\\x21\\x74\\x8b\\x57\\x49\\x55\\xf7\\x8e\\xbb\\x1c\\x51\\x29\\xe4\\xb2\\x17\\xeb\\xae\\xd0\\x64\\xfc\\x23\\x4f\\xc5\\xb0\\xc8\\x4f\\x27\\x3c\\xf4\\x4b\\x9e\\xce\\xf7\\x89\\xaf\\x54\\xdd\\x16\\x51\\x73\\x39\\xb1\\x95\\x56\\x13\\x5b\\x5a\\xce\\x2f\\x11\\x58\\x5a\\xd6\\x2f\\x92\\x53\\x3b\\x79\\xbf\\x44\\x40\\x95\\xfa\\xfb\\x24\\x42\\x69\\xbf\\x84\\x24\\x8a\\xd4\\x54\\x68\\x2b\\x3f\\x8b\\xf7\\x13\\xcf\\xb3\\x14\\x1d\\x35\\x73\\x3f\\xce\\xd9\\x37\\xef\\x53\\xe6\\x03\\xb1\\x03\\x4c\\xfd\\x22\\x0b\\x9c\\xaa\\xc8\\x15\\x59\\x6c\\x38\\xb1\\xe2\\xdf\\x9c\\x58\\xd1\\xfc\\x4e\\x5e\\x3f\\xb1\\x18\\xbb\\x9b\\x4d\\x17\\x7d\\x17\\xac\\x1d\\x3a\\x1a\\x47\\xc9\\xf4\\x2b\\x87\\x21\\xfd\\x01\\xbf\\xb0\\xcc\\x31\\x81\\xbf\\x93\\x29\\xf4\\x90\\xab\\xb3\\xf3\\x20\\x26\\x6e\\x01\\x25\\xcf\\x58\\x28\\x14\\x85\\x98\\xd2\\x5f\\x3f\\xeb\\x8e\\xf1\\xee\\x08\\x92\\x6c\\xc4\\x11\\x7b\\xfc\\x48\\xa9\\x69\\xc5\\x07\\x3c\\xa9\\x07\\xf8\\x9f\\x5b\\x31\\x58\\xd7\\x8f\\xdd\\xc0\\x3b\\xe8\\x31\\x5a\\xdc\\x42\\x54\\x6c\\x3e\\x0c\\xd5\\x5c\\x79\\x7e\\xd8\\x50\\x35\\x0e\\x93\\xdc\\xca\\x61\\xb7\\x9a\\x6a\\x90\\x96\\xe2\\x5c\\x4a\\xaa\\xee\\xc2\\x9c\\x87\\x09\\x89\\x14\\xab\\x64\\xd4\\xa4\\x7a\\x7b\\xc8\\x85\\xcc\\x18\\xb6\\xb7\\x1a\\x60\\x28\\x07\\x88\\x9a\\x0c\\xd2\\xb5\\xa4\\xbc\\xb9\\xaa\\x31\\xed\\x82\\xca\\x9e\\x64\\xd3\\xed\\x56\\x8b\\x97\\x48\\xec\\x7f\\xc6\\x87\\xff\\x9d\\xb3\\xe1\\x58\\x38\\x1b\\x26\\x54\\x06\\xeb\\x4c\\x07\\x5f\\xfc\\x48\\x31\\x8f\\x2f\\x62\\xc3\\x48\\x79\\x23\\x36\\x11\\x1c\\x19\\xcd\\x15\\xc6\\x37\\x39\\xc0\\x02\\x7c\\xb1\\x2e\\xba\\x74\\x01\\x6c\\x2f\\x2a\\x34\\xa5\\x03\\x64\\xd9\\x27\\xe3\\x54\\x13\\x0f\\xcc\\x7c\\x11\\x04\\xbe\\x4a\\x7f\\x1a\\x39\\xd8\\xb4\\xf0\\x03\\x88\\x3d\\xe3\\x6a\\xca\\x7c\\x2e\\x17\\x15\\x30\\xf8\\x42\\x2a\\xe6\\x63\\xbf\\x98\\xf4\\x37\\xec\\x46\\x09\\xbe\\xb9\\xc5\\xb7\\x0c\\xdd\\x35\\xe6\\xdf\\x32\\xa4\\xd0\\xf3\\x6f\\x3e\\x4a\\x84\\xf3\\x6f\\x7e\\x59\\x5b\\x45\\x88\\xe1\\x0a\\xc9\\x1b\\x8c\\x70\\x5e\\x8f\\xcc\\xba\\xd7\\x80\\xa7\\xa0\\x9e\\x34\\xdd\\xfa\\xbc\\xee\\xc0\\x3b\\x34\\x57\\x4f\\x1a\\x01\\xbd\\xe5\\xe3\\x5b\\xa0\\xe7\\x20\\x37\\x7b\\x64\\x21\\x4b\\xf4\\x2d\\xd6\\xc8\\xce\\x45\\x6b\\x79\\xad\\x20\\xc2\\xaa\\xa4\\x67\\x50\\x1b\\x98\\x1c\\xaf\\x16\\xde\\xe0\\xfc\\xf6\\xcc\\xac\\xcf\\x80\\xb0\\x99\\x09\\x47\\xab\\x4b\\x33\\xb7\\xb2\\xd8\\xcf\\x1c\\xb4\\x57\\x66\\x7d\\xc5\\x5c\\xb6\\x12\\x99\\x17\\xe6\\x63\\xb9\\xe3\\xf6\\xda\\xac\\x63\\x48\\xec\\xb5\\x29\\x63\\xdc\\x54\\xa9\\xec\\x01\\xd1\\x1b\\x7e\\x3b\\xc3\\x3b\\x10\\xe9\\xea\\x35\\x79\\xb4\\x52\\xa7\\x7d\\x63\\xd6\\x6f\\x80\\x08\\xbb\\xf9\\x62\\xa5\\x2b\\xad\\xd2\\xb9\\xf4\\x82\\xae\\x11\\x71\\x30\\x8c\\x80\\xe5\\xb7\\x18\\xbc\\x83\\x0e\\xce\\xd7\\x6c\\xc6\\xd1\\xb4\\x98\\xf7\\xd0\\x48\\x91\\x77\\x75\\x32\\x0f\\x0f\\x90\\x4a\\xe9\\xd8\\x41\\x37\\xb6\\x72\\xae\\x0e\\x4d\\x53\\xb8\\x15\\x0e\\xbc\\xa2\\x2c\\xc5\\xba\\xf7\\xab\\x7e\\x14\\x1f\\x2c\\xd1\\x1a\\x45\\xc2\\x69\\x81\\x8c\\x8f\\xb0\\x33\\xea\\x98\\x6c\\x09\\xab\\x16\\xe8\\x5a\\xc0\\x53\\xa8\\x95\\x5e\\xa4\\x2f\\x8c\\xa0\\x2a\\xdd\\x9c\\x12\\x07\\xef\\x3d\\xdd\\x2d\\x17\\x1a\\xc3\\xfc\\x1d\\xc5\\x92\\x63\\x43\\x87\\xe2\\x7e\\xa8\\xbd\\xda\\x61\\x29\\x81\\xc6\\xa8\\x15\\x78\\x22\\xd7\\x2e\\xf8\\x62\\xe1\\x45\\x9b\\x58\\x63\\xf2\\x01\\x2f\\x53\\xc9\\x7f\\xb6\\x48\\x45\\xff\\xda\\x52\\xa2\\xee\\xc3\\x6e\\xcf\\x50\\x64\\x0e\\x5b\\xf8\\x4c\\x48\\xd3\\x03\\xbc\\x84\\x45\\x5f\\xdb\\xa6\\x8e\\xa1\\x8c\\x8d\\x89\\x22\\x56\\x9f\\x21\\xe3\\x9c\\x31\\x49\\xa4\\x6a\\x9d\\x7e\\x2a\\x16\\xcd\\xfb\\xe8\\x15\\x7d\\x74\\x8a\\x3e\\x46\\x45\\x1f\\x63\\xba\\x6f\\x4d\\x79\\x8c\\x56\\x5a\\xe8\\xfa\\x06\\x50\\xd0\\x59\\x44\\x49\\x0e\\x14\\x89\\x50\\xfe\\x58\\xd5\\xc7\\x98\\x39\\x24\\x06\\x8e\\x44\\x1f\\x93\\xd4\\x5b\\x7f\\xcd\\x1c\\x5d\\x40\\xfe\\x7c\\x86\\xe4\\x8b\\x9a\\x1f\\x7a\\x2d\\x66\\xe7\\xe2\\xa9\\x55\\x1b\\x33\\x29\\xb3\\x58\\x89\\xe1\\x91\\xd3\\xb8\\x19\\x5b\\x15\\x40\\x7c\\x7a\\x55\\x6b\\x59\\xd5\\x8d\\x56\\xd5\\x9a\\xdd\\x4c\\xff\\x0b\\x99\\xd2\\x06\\xdd\\xa9\\x25\\xfc\\x06\\x88\\x23\\xd8\\xde\\xa7\\x74\\x7b\\x37\\x8b\\x8d\\x18\\x10\\xd0\\x06\\x36\\x05\\x7e\\x08\\x60\\xcf\\xe3\\x87\\x05\\x7e\\xf0\\x01\\x11\\x6c\\xe8\\xc8\\xd9\\xec\\xac\\x50\\x63\\x32\\xa1\\x4b\\xf5\\xe6\\xa9\\x25\\x04\\x0f\\xf8\\x72\\x6a\\x49\\x51\\x83\\xbe\\xb6\\x55\\xc6\\x13\\xfa\\x28\\x32\\x9e\\x50\\xa1\\xa9\\x8e\\xda\\x3d\\x27\\x7d\\x11\\xbb\\x4f\\xc3\\xec\\x87\\xb0\\xc5\\x24\\x7d\\x78\\x38\\x40\\xb0\\x30\\x0f\\x0d\\xe8\\x2a\\x3f\\x95\\x88\\x86\\x15\\x46\\xea\\xd8\\xc4\\x05\\x4a\\xdb\\x3f\\x54\\x77\\x65\\xfe\\x2a\\x87\\xf1\\x5f\\xb5\\x2e\\x44\\x75\\x51\\x16\\xeb\\x4d\\x78\\x8f\\xee\\x28\\x74\\xf2\\x5b\\x41\\xac\\x79\\x63\\x24\\xaf\\x6c\\x2f\\xa7\\x5a\\xa4\\x1b\\xec\\x27\\xad\\x0c\\x0c\\xad\\xe0\\x55\\xf3\\x5f\\x54\\x6b\\x9a\\xd3\\x1d\\x15\\x4b\\xee\\x91\\x2d\\x66\\x5b\\x5b\\x14\\x34\\x49\\x50\\x69\\x5e\\x2a\\xab\\x8d\\xd2\\xce\\x05\\xe5\\xac\\x53\\xcd\\xbb\\x84\\x6f\\x5e\\x99\\x68\\xa2\\x8a\\xb7\\xfd\\xb3\\x8a\\xff\\xff\\xcb\\x35\\xd9\\x9f\\x52\\x17\\xe8\\x4f\\x17\\x5e\\xf7\\xae\\xf1\\x74\\xf1\\xd6\\x5d\\xfc\\x54\\x31\\xd2\\x6f\\x2e\\xbf\\xaa\\x3c\\x60\\x0b\\x32\\xa7\\xdb\\x36\\x3a\\x8d\\x70\\x57\\xf5\\x58\\x66\\xeb\\x0a\\xfd\\x64\\x74\\x91\\x61\\x84\\x28\\xd9\\x32\\x47\\x39\\x1b\\xfb\\xd9\\x5f\\x65\\xe9\\xd2\\x09\\x1e\\xbb\\xa9\\x02\\x4e\\xe7\\x37\\x57\\x71\\x3a\\xbf\\xb9\\x34\\xbe\\x3f\\xf6\\xfa\\x24\\xef\\xcd\\xa9\\x25\\x24\\xcc\\xb4\\x60\\x6a\\x47\\x47\\x69\\x3b\\x27\\xdf\\x90\\xf7\\xdc\\x54\\xf7\\xc0\\x17\\x0b\\xbd\\x2a\\x16\\x20\\xf4\\xe1\\x8f\\xbc\\x0f\\x7f\\xb8\\xe5\\x6b\\xb6\\x97\\x51\\x48\\x2a\\x9b\\x55\\x2e\\xbc\\xfe\\xf4\\x8c\\xcb\\x9c\\x4d\\xbb\\x8c\\xf7\\xee\\xe7\\x1e\\x69\\x13\\x8a\\xde\\xe6\\x45\\x6f\\x85\\xe6\\xf1\\x3f\\x0e\\xcd\\x45\\xa7\\x0d\\x8b\\x30\\x27\\x41\\x8b\\xf1\\x2d\\xc2\\x68\\x85\\x4d\\x55\\x8f\\xe9\\x1f\\xf9\\x98\\xfe\\xe1\\xb2\\x8b\\x78\\xff\\xe2\\xa8\\x58\\xb9\\x93\\x90\\xa9\\x89\\x84\\x06\\x8c\\x3c\\xe0\\x45\\x6a\\x9a\\xcd\\xf7\\xce\\xb4\\xb8\\x79\\x5c\\x79\\xb1\\x4b\\xec\\xec\\x7e\\x8b\\xd7\\xb1\\x71\\x91\\x8f\\xe8\\x42\\x8c\\xe8\\x5f\\xe5\\x11\\x15\\x03\\x52\\xc3\\x81\\x49\\x2b\\x86\\x13\\xc5\\xe9\\x32\\x02\\x32\\x79\\xbd\\x3c\\x34\\xa4\\x7f\\xe5\\x43\\xfa\\x97\\x58\\x2a\\xbf\\x1f\\x06\\x19\\x2d\\xda\\x47\\xd7\\x2c\\x0e\\x35\\xd4\\x57\\x2c\\x9c\\xbd\\xb1\\xf7\\x78\\x0f\\x7e\\xcf\\x7b\\xf0\\xbb\\xcb\\x5e\\x3f\\x0e\\xd4\\x66\\x5a\\x0d\\xd5\\x70\\x17\\xaa\\x24\\xcd\\x21\\xaa\\xed\\xbc\\x02\\xbe\\x82\\xbf\\x05\\xf0\\xbe\\xa6\\xe8\\x0f\\xca\\x21\\x2a\\x7a\\xb1\\x90\\x57\\x8d\\x05\\xbe\\xdf\\xf5\\x95\\xaa\\xc9\\x5c\\xc7\\x70\\x98\\x35\\xa5\\xea\\x27\\x5e\\x27\\xdb\\xc4\\xac\\x9a\\x6c\\x42\\x69\\x4d\\x91\\x88\\x28\\x52\\xd4\\x59\\x5d\\x87\\x67\\x4c\\x34\\x15\\xd2\\xb2\\x44\\xa0\\x71\\x6a\\xd9\\xa7\\x96\\xa8\\xd8\\x13\\x15\\xeb\\xca\\xa6\\x4d\\xfc\\xb6\\x65\\x50\\x03\\x70\\xb6\\x8c\\x5e\\x04\\x20\\x5f\\x2b\\x46\\x7f\\x85\\xea\\xcf\\xf2\\xb1\\xb5\\xcc\\x76\\x02\\xa1\\x69\\xec\\x4e\\x48\\xf7\\x31\\x61\\xee\\xd6\\x43\\x5e\\xc4\\x00\\xc3\\x2e\\x8e\\xc2\\x8c\\xbf\\x4e\\xc9\\x87\\x07\\xfe\\xc6\\xa6\\x1e\\x64\\x97\\x8c\\xf1\\x5d\\xe4\\xed\\x45\\xa8\\x73\\x6b\\x14\\x9d\\xa5\\xa3\\xb4\\xd1\\x30\\xa5\\xf9\\xfc\\xa4\\x91\\xe9\\x21\\xe2\\x30\\x6c\\x1b\\x0a\\xec\\xfc\\x8a\\xc4\\x54\\x86\\x82\\x15\\x61\\x23\\x8d\\xcf\\x34\\x3d\\x45\\x85\\x32\\x8a\\xeb\\xc4\\x81\\xec\\x08\\x89\\x26\\x3d\\x60\\x78\\x23\\x79\\x47\\xf4\\x32\\x46\\x91\\x63\\x82\\xbf\\x2e\\xd2\\x32\\xe8\\x42\\x9d\\x73\\x1e\\x08\\x85\\x98\\x64\\x92\\xe4\\xea\\x35\\x22\\x39\\x28\\xde\\x81\\xc0\\xc9\\x87\\x50\\x24\\xa3\\xea\\x8d\\x35\\x6a\\x36\\x53\\x73\\x21\\xc5\\x11\\xd0\\x78\\x00\\xad\\x4e\\x01\\xfe\\xb2\\xb3\\xc0\\xdb\\xcf\\x47\\xe9\\xf3\\xbc\\x6e\\x8a\\x56\\xa9\\xe7\\x4f\\x8a\\xfc\\x8a\\xd7\\xda\\x4a\\x87\\xce\\x48\\xda\\xbe\\xcd\\xa9\\x8b\\xfd\\x00\\xa9\\x28\\xc0\\x35\\x52\\xdd\\xd3\\xed\\x63\\x12\\x5b\\x8f\\x93\\x9a\\x37\\xda\\xd8\\xeb\\xee\\x6c\\x1f\\x2b\\x12\\x8b\\x22\\x40\\x1f\\xa4\\x66\\xb1\\x54\\xe4\\x89\\x56\\x55\\xc5\\x06\\x35\\xe9\\x7e\\x72\\xf3\\x38\\x8f\\x3f\\xb9\\x7c\\xa7\\x94\\x26\\xe2\\x04\\x88\\xfe\\xe4\\xee\\x08\\xfb\\xb5\\x68\\x96\\x6c\\x3f\\xd2\\xa7\\x0a\\x55\\xea\\x35\\xc9\\xc7\\xb5\\xa5\\x22\\x7f\\x86\\xc4\\x05\\xc8\\xf8\\x9f\\x2c\\x13\\xc1\\x60\\xea\\xb1\\x92\\x60\\xd4\\xe3\\xe2\\x22\\xb0\\x35\\xa8\\x03\\x61\\x02\\xed\\x56\\x5e\\x15\\x14\\xa4\\x1d\\xa9\\x18\\xeb\\x4d\\x8b\\x58\\xb0\\x16\\x13\\x01\\xe3\\x26\\x19\\x74\\x41\\xac\\xc6\\x1d\\xa8\\x3d\\x3c\\x18\\x18\\x74\\xb5\\x6d\\x0c\\x85\\x53\\x4a\\x87\\x94\\x14\\x4c\\x53\\xa9\\x29\\x0b\\xf6\\x84\\xea\\xc0\\xb0\\xf7\\x14\\xc2\\xa8\\x8e\\x0a\\x2c\\x4d\\xd4\\x6d\\xa9\\x13\\xd1\\xee\\x37\\x84\\xfc\\x85\\xd4\\x5d\\xcc\\x3a\\x30\\x2b\\x94\\xd0\\x99\\x92\\xa6\\x0b\\x24\\xc8\\xc1\\x4c\\xfc\\x7a\\xc8\\xa2\\x7a\\x38\\x15\\x23\\x0a\\xfc\\x75\\x79\\x0b\\xef\\x87\\xaf\\x84\\xa6\\x3f\\xa0\\xe0\\x1f\\xf6\\x24\\x8c\\x30\\xd0\\x47\\xd8\\x84\\x0f\\xc2\\x8e\\x41\\xd8\\x23\\x4c\\x02\\x1c\\x62\\xa3\\xe1\\xa2\\x43\\x93\\x7b\\xb1\\x96\\x95\\xf3\\x0d\\x33\\x47\\x46\\xa4\\x87\\x46\\xd9\\xdd\\x29\\xc9\\x86\\x8c\\x22\\xcc\\x42\\xd3\\x31\\x9b\\xa4\\xab\\x43\\x41\\xa1\\xbd\\xe7\\xf1\\xc8\\xc4\\x90\\x4d\\xde\\x94\\x7d\\x8a\\x8d\\x88\\x25\\xa4\\x44\\xf7\\x09\\x19\\x87\\x84\\x54\\xeb\\x42\\xb1\\x2b\\xde\\x90\\xae\\x09\\xa5\\x11\\x03\\x87\\x69\\x11\\xf0\\x6e\\x79\\x4e\\x8c\\x91\\xbb\\x9f\\xd3\\xe7\\xd1\\xc8\\xc9\\x3f\\x91\\xe4\\x0a\\xa3\\x68\\xe6\\x82\\x56\\xe9\\xa5\\xd3\\x65\\xff\\x76\\xd9\\x2f\\x2e\\x0b\\x03\\x96\\x06\\xcc\\x0b\\x10\\x41\\xc5\\xf8\\x77\\xf4\\xb3\\x26\\x7f\\x47\\xc2\\x15\\x23\\xb8\\x1d\\x5a\\x99\\x22\\xf0\\xe1\\x6c\\x41\\xa1\\x25\\xf2\\xb0\\x12\\x5e\\xb3\\x89\\x8b\\x91\\x82\\x49\\xe0\\x47\\xbc\\x01\\xc2\\x1e\\x39\\x0f\\x0f\\xa8\\xfd\\x40\\xa0\\xf3\\x58\\x47\\x37\\x41\\x44\\x4c\\xf6\\x27\\x62\\x32\\x59\\xc7\\x96\\xfd\\x52\\xba\\x06\\x48\\x76\\x65\\xea\\xba\\x35\\x08\\xb6\\xd1\\x0a\\x00\\x59\\x09\\xb1\\xb9\\x9f\\x7a\\xe3\\x22\\xdd\\xb1\\x8b\\x67\\xa0\\x3c\\xbd\\xb2\\xa0\\xfd\\xc9\\xd5\\x5c\\x69\\xd5\\x38\\x28\\xd8\\xc8\\xf4\\xee\\x89\\x20\\x9f\\x76\\xa5\\x0c\\x91\\x65\\xa8\\x71\\x29\\x0e\\x8f\\xb4\\xf5\\x8e\\xe2\\x60\\xbe\\x85\\x25\\xf4\\x16\\xc0\\xf2\\x16\\xdd\\x30\\xb4\\xde\\x42\\x2a\\x31\\xe9\\x6f\\x51\\x7c\\xda\\x7a\\x9f\\x47\\xd1\\x6e\\xbd\\x1f\\x85\\xad\\x37\\x08\\x4b\\xfc\\x81\\x7f\\x3c\\x95\\xfa\\xcc\\xad\\xf7\\xe8\\x65\\x87\\x87\\xe2\\x55\\x98\\xb9\\x8e\\xa1\\x48\\x96\\x49\\x9b\\x57\\x04\\xe5\\x3b\\x71\\xcd\\x48\\xcd\\x41\\xbd\\xef\\x38\\xd5\\x80\\x27\\x38\\x21\\x4c\\x68\\xb4\\xf5\\x56\\x66\\xa1\\x32\\xe2\\x1b\\xf9\\xa8\\xa2\\x75\\x8e\\xb9\\xa1\\x21\\x59\\xc9\\xaf\\xc8\\x43\\xb5\\x5e\\xa2\\x02\\x5b\\x88\\x8d\\x1f\\x1d\\x79\\xad\\x97\\x23\\x13\\x58\\xab\\xd6\\xaf\\x50\\x8e\\xf3\\xb8\\xf5\\x06\\x79\\xa2\\xb8\\xf5\\x1e\\x15\\xd0\\xb2\\xd6\\x4b\\x40\\xb6\\x90\\x3f\\xc3\\x32\\x1d\\x16\\xab\\xa2\\x31\\x1d\\xd5\\x18\\x37\\xf9\\x3d\\xfa\\xff\\x10\\x1d\\x46\\xbd\\xe7\\x50\\xf8\\xc8\\x6a\\xfd\\x8a\\x9a\\x21\\x7a\\x99\\x58\\xe6\\xc1\\x30\\xee\\x36\\xb5\\xf0\\xe6\\x89\\x2d\\xbc\\x41\\x17\\xbe\\x4f\\x68\\xc1\\xd3\\x5a\\x10\\x39\\xa4\\x93\\x7e\\xca\\x85\\x06\\x4b\\x18\\x6b\\xa2\\xa4\\xed\\xa7\\x4f\\x1e\\xc0\\x16\\xa7\\xef\\x1d\\x25\\xbc\\x13\\xb3\\x2b\\xe6\\x33\\x94\\x93\\x30\\xd2\\x10\\x10\\x56\\x8f\\xb1\\xdb\\x60\\x14\\x11\\xcd\\x31\\x85\\xaa\\xf1\\xc7\\xd1\\x18\\x66\\x2f\\x32\\x6d\\xdf\\x8e\\x58\\x36\\xce\\x00\\xfa\\x9c\\x87\\xf4\\xeb\\xd9\\x19\\xcc\\x83\\x67\\xcb\\x69\\xf2\\x98\\x7f\\x74\\x14\\x11\\x57\\xdb\\x7a\\x49\\x23\\x09\\xe9\\xf7\\x0d\\x4a\\xaa\\x68\\x9e\\xd0\\xae\\x32\\xc2\\xc9\\xa0\\xb9\\x81\\x24\\x6c\\x32\\x44\\x90\\x33\\xac\\x2f\\x84\\xb4\\xf7\\x28\\x1b\\xc2\\xcc\\x18\\x27\\x16\\x7e\\x51\\xc0\\xe5\\x89\\x3c\\x08\\xe5\\x98\\xea\\x0c\\x51\\x8f\\x9f\\xdc\\x86\\x60\\x0e\\x93\\x3d\\x13\\x51\\x57\\x51\\x83\\xbb\\xf5\\x52\\x8f\\x06\\x03\\x19\\x5e\\x52\\xc0\\xd5\\x59\\x44\\x19\\xd4\\x2e\\xba\\x94\\x0e\\x9d\\x64\\x1a\\x34\\x2e\\xf6\\x01\\x3c\\xbd\\xc7\\xd5\\x84\\x82\\x2a\\x31\\x13\\x59\\x79\\x26\\x32\\xa4\\x6a\\x20\\x13\\xae\\xe3\\x37\\x18\\xf3\\xfb\\x4d\\xeb\\x25\\xa2\\x8f\\xf7\\xf8\\xfc\\x1e\\x1a\\xbf\\x2f\\x9e\\xd1\\xfb\\x0b\\x7e\\xc7\\x6a\\xd2\\xf2\\x92\\x49\\xb5\\x6a\\x68\\xa1\\x50\\x3b\\x54\\x0a\\x73\\x6b\\xad\\x85\\xb2\\xc3\\x23\\xea\\xf0\\x36\\xb7\\x89\\xc0\\xe2\\x6f\\x2a\\xbb\\x1a\\x97\\xbb\\xfa\\xe6\\xb1\\xae\\x16\\xe9\\x46\\xde\\x78\\x5a\\x1e\\x71\\xaa\\x55\\xa3\\x77\\x55\\x0e\\x2c\\x3e\\xd8\\xd5\\x7c\\x53\\xe2\\x14\\x66\\xad\\x5f\\xb7\\xb7\\x4b\\x3f\\xf0\\x8c\\x67\\x38\\x45\\x23\\x31\\x79\\x34\\x37\\xdb\\x6d\\x41\\xbc\\xdc\\x44\\x71\\x14\\x46\\xfe\\x23\\xa4\\x6e\\x61\\x32\\x2e\\xbc\\x35\\xa9\\x93\\x8e\\x94\\xe4\\x72\\x09\\xaa\\x52\\x44\\xf5\\xb9\\xd2\\x43\\x8d\\xb8\\x54\\x43\\x55\\xd8\\xdd\\xcf\\x0c\\xba\\x0b\\x77\\x50\\x25\\x31\\x08\\x92\\x7d\\xa3\\x67\\x0f\\xbe\\xdd\\x0b\\xf3\\x16\\x4f\\x9e\\x26\\x01\\x3c\\x21\\x06\\xc6\\x43\\x78\\xe2\\x4c\\xf3\\xa8\\x56\\x63\\x77\\x4f\\x26\\x2e\\x3b\\xda\\x4a\\xc4\\x95\\xaa\\xa2\\x09\\x80\\x20\\x44\\x0a\\x6f\\xba\\x35\\xed\\xa0\\x75\\x77\\x86\\xae\\xbf\\xe0\\xf7\\x39\\x3a\\xb8\\x0a\\x5a\\x9b\\x33\\x9e\\xd1\\xef\\x73\\xd8\\x26\\x28\\x0c\\x8d\\xa6\\x6c\\xe2\\xcb\\xbf\\x19\\xfc\\x85\\x6d\\x8a\\x0a\\xde\\xd3\\x51\\xa2\\xd4\\xfb\\xa1\\x17\\xe8\\x1e\\x50\\xb7\\x1d\\xd9\\x75\\xe3\\x54\\xc5\\x8e\\xdd\\xdf\\xe9\\xfe\\x80\\x44\\x58\\xa7\\xf6\\x4b\\xc7\\xc4\\xa0\\x96\\x1b\\xfd\\x53\\x54\\xfa\\xe4\\xdb\\x29\\x4a\\xf1\\x85\\x3d\\xc9\\x0b\\x44\\x1a\\x6f\\x63\\x0c\\x45\\x0f\\xe0\\xcd\\x80\\x78\\xc9\\x82\\x91\\xc6\\x60\\x09\\x74\\x1e\\xf8\\xe1\\x75\\xa5\\x8e\\x85\\x9c\\x00\\x53\\x80\\xf6\\x91\\xdb\\x0d\\x98\\x62\\xdc\\xd8\\xf1\\x76\\x3f\\x94\\xa7\\xba\\xe3\\x27\\x99\\x9b\\x8d\\xd0\\x0d\\x5a\\x3e\\x1a\\x1b\\xa0\\xb4\\x8c\\xde\\x81\\x29\\x9d\\xd2\\xc5\\x03\\x86\\x04\\xf4\\xe9\\xa2\\x2d\\xa9\\xd0\\xbd\\x9c\\xec\\xae\\x8b\\x47\\x56\\x45\\x5c\\x10\\x1b\\x42\\xeb\\x5a\\xae\\x09\\x47\\x2d\\x93\\x82\\x6e\\x90\\x74\\x9c\\x53\\x78\\x3b\\x73\\x88\\x70\\x13\\xf4\\x07\\x30\\x39\\x74\\xb0\\x47\\xe3\\xa4\\x15\\xdb\\xf0\\xac\\xe8\\xb9\\x8c\\x27\\x00\\xd5\\x39\\x65\\x77\\x0f\\x65\\x66\\xf1\\x73\\xbf\\x85\\x7e\\xd1\\x9e\\xcf\\xf1\\xc7\\x01\\x24\\x0d\\xbd\\x99\\x9b\\xcf\\x2d\\xdc\\xd4\\x82\\xdb\\x42\\x2d\\x06\\xe0\\xd0\\x7c\\x04\\x4a\\x38\\x81\\x7c\\xc8\\xd5\\x92\\x93\\x84\\x27\\x33\\x26\\x82\\x6d\\xe4\\x68\\xae\\x2d\\x78\\x8d\\xa7\\xb2\\x27\\x11\\x16\\xcc\\x64\\x41\\x8c\\xf3\\x5a\\xa9\\xc5\\xfe\\x58\\x0d\\x8e\\xd4\\x62\\x81\\xd3\\x26\\xb0\\x89\\xd7\\x71\\x10\\x59\\x07\\x42\\x8c\\xe9\\x60\\x95\\xe5\\x38\\x26\\x8f\\x54\\xa6\\xb7\\x8e\\x07\\x85\\xd4\\x28\\x0f\\xa7\\x3b\\x95\\x02\\x20\\x31\\x4a\\x65\\x6e\\x6a\\x9b\\x01\\xf1\\x39\\x69\\x76\\xbc\\x21\\xc3\\x3f\\x28\\xf3\\x86\\x47\\x7c\\x9a\\x8e\\x14\\xd2\\x9a\\x79\\x81\\x93\\x85\\x4e\\x25\\x58\\x76\\x10\\x1b\\x86\\xa7\\x55\\xab\\x90\\xd4\\x81\\xd5\\xf7\\x4f\\x99\\x33\\x4b\\x63\\xcf\\xdb\\x71\\x58\\x86\\xe7\\xb2\\x86\\x01\\xfd\\x12\\x3e\\xf4\\x8d\\x92\\xf2\\x3f\\x62\\x2b\\x54\\xcc\\xf4\\x93\\xb7\\xce\\x5b\\x60\\xf8\\x8f\\x8e\\xe4\\x23\\x50\\x0f\\x52\\x40\\xe0\\xcc\\x15\\x42\\x0b\\x01\\x0d\\x25\\xf0\\x97\\x22\\xc7\\xe2\\xc8\\x9f\\x71\\x17\\x73\\xa1\\xa9\\x5e\\xd3\\x33\\x1b\\xf0\\x9b\\x34\\x63\\xf3\\x79\\xcb\\xea\\x98\\xc1\\x5e\\x3b\\xe4\\x1a\\x90\\x6a\\x9a\\x73\\xa9\\x1c\\x34\\xc2\\x98\\x2e\\x18\\x89\\x25\\x54\\x98\\x09\\xc9\\x33\\x2c\\x3a\\x67\\x2e\\xf2\\x00\\xb2\\x28\\xdb\\xaf\\x4d\\xd1\\x8e\\x77\\x78\\xd0\\x43\\x0d\\xb1\\x52\\x38\\x52\\x64\\x65\\x45\\x91\\x1c\\x08\\xfa\\x37\\xba\\xe5\\x14\\x23\\x0c\\x38\\xb0\\x92\\x46\\xd6\\x20\\x91\\x02\\x3e\\x46\\x0d\\x92\\x2a\\x78\\x67\\x3c\\x60\\x4b\\x1e\\x9f\\xc1\\x0e\\x5b\\xf0\\xe5\\xf3\\xe7\\x9d\\x87\\xf9\\x48\\x80\\x06\\x4f\\x33\\xa4\\x68\\x31\\xb0\\x7a\\x32\\x59\\x4c\\x91\\x55\\xcc\\x5f\\x78\\x92\\xa1\\x77\\x91\\xf9\\x38\\xe3\\xb0\\x48\\xb0\\x8e\\x71\\xc4\\x13\\xdb\\xc5\\x8d\\xba\\xd7\\x83\\x43\\x06\\x63\\xb8\\x21\\xa0\\x43\\x77\\xf8\\xeb\\x9a\\x05\\xe4\\x53\\xf3\\x06\\x68\\x5c\\x8c\\x68\\x8a\\x96\\x80\\x1b\\x9e\\xe5\\xae\\x17\\x57\\x7c\\xc3\\x9b\\xc6\\x0d\\x9f\\x09\\x1d\\xb4\\x39\\xb2\\x43\\xe8\\x13\\x91\\xad\\x0b\\x21\\x4e\\x44\\x91\\xc9\\x17\\xc0\\x6f\\xaf\\xcf\\x16\\x80\\x41\\x16\\x26\\x4c\\x2c\\x74\\x99\\x25\\x70\\xae\\xdc\\xc0\\x39\\x7b\\x03\\x98\\xe3\\x0e\\xe0\\x00\\xc7\\x0a\\x05\\x97\\x84\\xd7\\x0d\\xbe\\xde\\x9d\\xad\\x30\\xee\\x76\\xfe\\x95\\xac\\xbc\\x36\\xe2\\xeb\\x5c\\x20\\x10\\xfa\\xb4\\x54\\xcf\\x1b\\xe9\\x13\\x72\\xb7\\x3d\\x82\\xf8\\x15\\x6f\\x9c\\x1b\\xb2\\xe5\\x85\\xc9\\x2e\\x79\\xe3\\xce\\x00\\x18\\x9b\\xa3\\x9b\\xb3\\x2b\\xea\\xc4\\x95\\xc9\\x66\\x67\\x97\\xd4\\x01\\x60\\x03\\xae\\x64\\xe3\\x90\\x7a\\x29\\x1b\\xbe\\xcc\\x9b\\xbd\\xca\\x1b\\xbd\\x14\\xc0\\xbc\\xe5\\xab\\xe6\\x0d\\xbb\\xe0\\x9b\\xe6\\x6c\\x74\\x7b\\x76\\x31\\xde\\xf0\\x59\\xe3\\xd6\\x5e\\xf1\\x9b\\xc6\\x85\\x08\\x68\\x4f\\xf3\\x83\\x10\\xbd\\x46\\x97\\x8a\\xa5\\x9d\\xe8\\x1b\\xd7\\x2c\\x64\\xd0\\x39\\xf8\\x03\\x9d\\x65\\xd0\\xaf\\x10\\x7b\\x28\\xa7\\x05\\x36\\xe1\\x75\\xeb\\xc6\\x07\\x0c\\xbe\\x43\\x75\\x60\\x24\\xfa\\x52\\xa6\\xb9\\x1f\\x56\\xaa\\x2e\\x2e\\x33\\x6c\\x21\\x17\\xef\\x15\\x45\\x16\\x88\\xfd\\x65\\x44\\x27\\x71\\x66\\x20\\xb8\\x9e\\xaf\\x47\\x26\\xf5\\x09\\x21\\x35\\xc7\\x3f\\x4b\\xfc\\xa3\\x8a\\x8d\\x9a\\xcd\\x85\\xda\\x11\\xea\\xf0\\xa1\\x41\\x15\\x71\\xbc\\xf8\\x92\\x87\\x3c\\x11\\x3b\\xec\\x7a\\x2b\\x0c\\xd1\\x1c\\x3c\\x8e\\xdd\\x42\\x20\\x85\\x36\\x66\\xbb\\x1a\\xda\\x88\\x51\\xdd\\x0c\\x72\\x05\\x19\\x43\\x3f\\xa0\\x11\\xb9\\x1d\\xa5\\xa0\\xef\\xc8\\x27\\xa3\\xf7\\x43\\x9f\\x7c\\xf3\\x1a\\xfe\\x53\\x4f\\x07\\x40\\xd1\\xcc\\x27\\xdd\\x3d\\xff\\xa9\\xe7\\x82\\x2b\\x8a\\xb8\\x58\\x64\\xf7\\x16\\xfe\\xb1\\x72\\xea\\x2c\\x48\\xb9\\xc7\\x63\\x2e\\x8c\\x87\\x6c\\x94\\xe0\\x85\\xc5\\xa5\\x74\\x28\\xe9\\xbe\\x18\\x1f\\x3b\\xea\\x3a\\x3d\\x54\\x06\\x48\\xd0\\xac\\x0a\\xb0\\x45\\xa5\\x27\\x13\\x18\\xb8\\x22\\xab\\xb0\\x3f\\x4f\\x3e\\x4e\\x0e\\xf6\\x46\\x84\\xb2\\x6c\\x84\\x5a\\xd3\\x15\\xed\\xc6\\xcd\\x94\\x65\\x4d\\x0f\\xdb\\x14\\x87\\x80\\x76\\x9b\\xf6\\x7e\\x71\\xc5\\x17\\xd9\\x4e\\xe2\\xcf\\x57\\xa8\\x41\\xc7\\xd7\\xbb\\xe9\\x6f\\xc9\\x6d\\x06\\xbf\\xd9\\x4d\\x97\\x01\\x53\\x66\\x99\\x70\\x66\\x18\\xf0\\xf6\\xa4\\xd9\\x98\\x8e\\x8d\\xb1\\xfd\\x71\\xd6\\xf8\\xd8\\x1a\\x7f\\x9c\\xd5\\x1f\\xe8\\xa7\\x61\\x42\\xda\\xc4\\x7b\\x3d\\xa5\\xef\\xe4\\xba\\xb0\\xbd\\x60\\x51\\xa0\\xfb\\x2f\\xf6\\x03\\x79\\xab\\xc9\\x6a\\x8b\\x9a\\xb9\\x13\\xa4\\x9c\\xaf\\x76\\xda\\x8e\\xe2\\x84\\x4f\\x2a\\x44\\x0e\\xf9\\x2d\\xa4\\x5a\\xa1\\x35\\xe1\\x5a\\xb8\\x86\\x2c\\xf1\\xf8\\x7b\\x27\\x77\\x8e\\xda\\xfe\\x8f\\xf1\\x3f\\x0f\\xf1\\xe2\\xea\\xa3\\xf1\\xb0\\x4c\\x82\\x8f\\x86\\xd9\\x16\\xae\\x97\\x53\\x73\\xbc\\xc8\\xec\\x59\\x66\\xa3\\x3b\\x55\\x71\\x4f\\x0b\\xd5\\x45\\x29\\xa6\\xee\\xb8\\x70\\x35\\xc7\\x9b\\xcc\\xae\\x45\\x04\\x34\\xaa\\xff\\xe8\\x48\\x9c\\x85\\xf0\\x65\\x9d\\xd9\\x37\\x99\\x29\\x74\\x33\\xa7\\x3b\\x60\\xa3\\xe2\\x7c\\x23\\xa0\\x56\\x79\\xcb\\xb5\\xd9\\x32\\x37\\xc8\\xdd\\x39\\xe2\\xbd\\xa2\\x13\\xdb\\x4e\\x40\\x17\\x89\\xf6\\x75\\xc6\\xf0\\x20\\xaf\\x90\\xe4\\x5c\\x02\\x01\\xe4\\x66\\x57\\xbe\\x5b\\xf1\\xed\\x16\\xbe\\xa1\\x53\\xfd\\xfd\\x2f\\xaf\\xc9\\x24\\x6f\\x5d\\xf1\\xe5\\x05\\xd6\\x47\\x9a\\x80\\x15\\x1f\\xdf\\x62\\xb1\\xc0\\x49\\x52\\x68\\xee\\x65\\xc6\\xae\\x30\\xf2\\xcc\\x67\\xf8\\x05\\x82\\xde\\xad\\xca\\xff\\x29\\x43\\x75\\xbc\\xa0\\x18\\x56\\xcd\\x0f\\x6b\\xf6\\x86\\x45\\x59\\x6a\\xdf\\x65\\x0c\\xde\\x9a\\xf0\\x58\\xb3\\xaf\\xe0\\x19\\x1e\\x9a\\xf8\\xb5\\x62\\x93\\x5c\\x65\\xc6\\x1d\\xf9\\xf6\\xde\\x0a\\xe7\\x2e\\x9e\\x93\\x78\\x15\\xa4\\x36\\xaa\\x41\\xce\\xbc\\xbb\\x9f\\xe7\\x46\\xad\\x59\\x43\\xb1\\x06\\xca\\xe9\\xc7\\x4a\\x76\\x89\\xee\\x4a\\x81\\xd6\\x8b\\xcb\\xa9\\x69\\xa3\\x63\\xda\\xd8\\xab\\xc2\\x60\\xc4\\x0d\\xd0\\x8b\\x12\\xd0\\x39\\x0f\\x0f\\x00\\xfe\\x98\\x07\\xe2\\x3d\\x86\\x77\\x38\\x6a\\x33\\x23\\x36\\x94\\xb7\\x35\\x61\\x2c\\xe7\\x88\\x3b\\x8b\\x7c\\x27\\xb3\\x0e\\x39\\x7a\\xdc\\x59\\x00\\x3f\\xc0\\xe4\\xbe\\xd9\\xdd\\x4c\\x3f\\x24\\x01\\xff\\xb0\\x9b\\xf8\\xc6\\xb9\\xe2\\xef\\x77\\x13\\xdf\\x93\\x8f\\xd6\\x57\\x94\\x5c\\xad\\x95\\x2c\\x60\\x90\\x41\\x6f\\x50\\x4d\\xc2\\x7b\\x1d\\x78\\xd8\\x9b\\xb7\\x17\\x78\\xfb\\x15\\x26\\x28\\xd8\\x9c\\xfb\\x77\\xad\\xe4\\x66\\x21\\xf6\\x9a\\x32\\x7a\\x3f\\x54\\x5d\\x4e\\x43\\x84\\x64\\xc2\\xe5\\xa5\\x2f\\x52\\xd8\\x54\\x57\\x59\\xea\\x19\\xb5\\xbc\\x44\\x8d\\x85\\xa6\\xf4\\xdb\\x95\\x16\\xf5\\xb4\\xae\\x60\\x7e\\x7e\\x73\\x02\\xbc\\xa0\\x4d\\xa2\\xc0\\x9f\\x09\\x27\\x95\\x8a\\xe9\\x82\\xed\\xff\\x0e\\x58\\xa1\\xb1\\x07\\x4b\\x02\\xaa\\xbc\\xb3\\x93\\x00\\x58\\x07\\x22\\x5a\\xdf\\x65\\x4f\\x0a\\x76\\x57\\x2b\\xcc\\x60\\x6a\\x0d\\xe1\\x43\\x47\\x25\\x34\\x6a\\xa6\\xb4\\x0b\\x94\\x5f\\xc4\\x1b\\x24\\x27\\xd7\\xde\\xed\\x1f\\x2a\\x15\\x5f\\x30\\x8d\\x0c\\x5b\\x54\\x1a\\xbe\\x40\\x62\\x4d\\xd0\\xe7\\x30\\x35\\xf7\\x8e\\xdd\\x61\\x57\\xb6\\xc5\\x5c\\xf8\\x37\\x83\\x67\\x0f\\x7e\\xe7\\xb6\\xb5\\xdd\\xc1\\x54\\x1f\\x72\\x08\\xfe\\x90\\x89\\xc8\\x69\\x1b\\x58\\xcd\\xf2\\x9a\\x4d\\xbc\\xb4\\xae\\x60\\xfe\\x82\\x2a\\x05\\x91\\x4a\\xc9\\x3d\\x52\\x62\\x28\\x3f\\xc7\\xe0\\xce\\x85\\xbf\\x13\\x12\\xa5\\x4b\\x0e\\xec\\x4f\\xd8\\x10\\x13\\x6f\\x6a\\x16\\x42\\xe5\\xad\\xde\\x9c\\xbb\\x8c\\xe2\\xd9\\xe3\\xba\\xbc\\x2c\\xc8\\x75\\xf6\\xa0\\xa7\\x37\\xd8\\xe4\\x8c\\xe7\\x9a\\x82\\xbe\\x09\\x34\\xa3\\xbc\\xfc\\xf2\\x48\\x58\\x8e\\x7f\\x42\\x0a\\x79\\x4e\\x72\\xfd\\xe5\\x73\\x5f\\xde\\x0f\\x04\\x90\\xb8\\x10\\x89\\x0b\\x4c\\x0c\\x1a\\x3c\\x9b\\x2c\\xa7\\x40\\x7b\\x8c\\x6e\\x44\\x67\\x03\\xa8\\x4c\\xc6\\x07\\x2f\\xea\\x37\\x59\\xd8\\xe0\\x01\\x79\\xf3\\x06\\x7a\\x61\\x26\\x78\\xdb\\x4a\\x85\\x8f\\xc8\\xb8\\x99\\x84\\x40\\xc8\\x4c\\x52\\x62\\x32\\x81\\x95\\x5a\\x1d\\xf0\\x24\\x17\\xee\\xd5\\xa2\\x69\\xc9\\x18\\x19\\xde\\x0c\\x86\\x68\\x85\\x0f\\xbf\\x1e\\xd6\\x85\\xa1\\xcf\\xb9\\xf1\\xc6\\x69\\x26\\x75\\xdf\\x6c\\x03\\x48\\xaa\\xc6\\x37\\x07\\xaa\\x5c\\x1f\\x9f\\x74\\x09\\x32\\x83\\x31\\x02\\xe9\\xbd\\x9a\\x6c\\x70\\xa8\\x40\\x7c\\x67\\xf8\\x74\\x3e\\x65\\x57\\x90\\xff\\x92\\x03\\x14\\xee\\xea\\xe1\\x68\\x3d\\xd9\\x34\\x00\\x1d\\x35\\xce\\xa7\\x28\\x35\\x07\\xf4\\x04\\xe8\\x2f\\xc9\\xae\\xc4\\xe3\\x39\\x23\\x21\\xce\\x0b\\x64\\xdb\\xec\\x2b\\x94\\xd5\\x8b\\xc7\\x4b\\xe1\\x0f\\xca\\xbe\\xdb\\x6e\\x63\\xa8\\x54\\x2b\\x59\\x64\\x9f\\x17\\xd9\\x03\\x99\\xdd\\x08\\x9a\\x73\\x13\\x95\\x18\\xa0\\xed\\x84\\x00\\xab\\x8f\\x45\\x10\\xd7\\xcb\\x9d\\x71\\xdc\\xf2\\xf5\\x64\\x49\\x3d\\x84\\x31\\x5c\\xc0\\xcb\\x82\\x5e\\x96\\xd3\\x91\\x71\\x2b\\x7c\\x8e\\x3e\\x3c\\x5c\\x88\\x07\\x13\\x25\\xe0\\x34\\x8b\\xf2\\xcb\\x73\\xf9\\x61\\xac\\xe4\\x24\\x17\\x4a\\x40\\x72\\xbb\\xb5\\x55\\xda\\xad\\x4a\\xbb\\x00\\x70\\xbb\\x47\\x47\\x7b\\x36\\x42\\xde\\x23\\x33\\xef\\x1a\\x86\\x52\\x7c\\x12\\x4d\\x35\\x94\\xc6\\x92\\xec\\x12\\xc5\\x15\\x2f\\xe7\\x48\\x77\\x73\\x98\\xdb\\x4a\\x9d\\x55\\x5c\\xf5\\x49\\xe1\\x32\\x3a\\x90\\xe8\\xe8\\xa9\\xc2\\x0b\\x92\\x40\\xa0\\x50\\x5e\\x72\\x4b\\x48\\xad\\x09\\xd6\\x94\\x84\\x12\\x41\\x6b\\x0d\\xa4\\x75\\x09\\x7d\\x3d\\x56\\x1f\\xfa\\xdb\\xd1\\x6b\\x48\\xb0\\x06\\x84\\xcb\\xf7\\xe8\\x8b\\xae\\x52\\xcc\\x55\\x25\\x18\\x29\\x57\\x12\\xa9\\x4a\\x2e\\xb2\\xab\\xc5\\x57\\xd4\\xe3\\x50\\x3d\\xaa\\x16\\x47\\xd5\\xf2\\x12\\x71\\xca\\x13\\xab\\x40\\x5a\\xdc\\xa3\\xc9\\xc6\\x2a\\x5c\\xac\\xc2\\xdd\\x29\\x9e\\x97\\x86\\x15\\x86\\xc1\\xfd\\x3d\\xcc\\xb4\\xdb\\xcd\\x3c\\x53\\x2c\\x32\\xc5\\x90\\x49\\xc7\\x73\\xb0\\xa8\\xdd\\x43\\xaa\\xde\\x55\\xb1\\x3c\\x94\\xe4\\x83\\xee\\xa6\\x48\\x16\\x80\\x51\\x19\\x94\\x49\\x3c\\xe0\\xcd\\xbb\\x26\\x4a\\x30\\x22\\x7c\\xdc\\xc0\\xe3\\x06\\x85\\x8f\\x4d\\x0f\\x58\\x1b\\xbf\\xee\\x37\\xa2\\x3a\\x85\\x8a\\x70\\xcf\\x9c\\xba\\xd3\\x9e\\x51\\x2d\\xeb\\xb3\\x5c\\x30\\x40\\xa1\\xda\\x61\\xe5\\xb5\\x5d\\x60\\xfc\\xd7\\x77\\x4d\\x28\\x12\\xa0\\xc4\\x61\\xd3\\xe4\\x51\\x3d\\x90\\xe7\\xdf\\x33\\x6b\\x5b\\xb4\\x7d\\x74\\x04\\x1b\\xa2\\x54\\x03\\x25\\xbf\\x7c\\xac\\x1a\\x55\\x8f\\x6a\\xad\\xa4\\xa1\\x4e\\xf7\\x34\\xeb\\xbb\\x22\\x1e\\xfe\\x1d\\x95\\x2c\\xde\\x61\\x3c\\x64\\xaa\\x47\\xbe\\x89\\x77\\xad\\xf1\\xd0\\x2d\\x1e\\x39\\xd9\\xf7\\x93\\xb5\\x93\\xe6\\xd1\\xab\\xd1\\xad\\xa7\\xef\\xa2\\x9f\\x76\\x0a\\x19\\x0e\\x3b\\x67\\xd2\\x61\\xc0\\x0b\\x25\\xbc\\x75\\xca\\xe6\\x7c\\x8e\\x72\\x8f\\x25\\xa1\\x48\\x0c\\x8f\\xc4\\x17\\x80\\x8e\\x78\\xab\\x03\\x87\\x49\\x6b\\xd8\\xa7\\x43\\x84\\x1c\\xb5\\xe4\\xfa\\x0c\\x2d\\xac\\x4c\\x9f\\x32\\x80\\x87\\x11\\xd7\\xa1\\xb2\\x53\\x14\\x0b\\x59\\x03\\x75\\xcf\\xe2\\xb6\\xa0\\x3d\\x43\\xaa\\x73\\x62\\xd3\\xcc\\x09\\xd6\\x4b\\xc7\\x8e\\xb9\\x05\\x78\\xfb\\x99\\x95\\xdf\\x31\\x39\\x74\\x90\\xad\\x81\\xcf\\xdd\\x90\\xeb\\x9c\\x95\\xda\\x93\\x97\\x85\\x13\\x18\\x71\\x8e\\x59\\xa3\\xcb\\x33\\x0f\\x4f\\x52\\xd3\\xe1\\xe7\\x78\\x23\\x3d\\x47\\x03\\x78\\xc1\\x82\\x2c\\xd1\\xbe\\x96\\x30\\x07\\xdb\\xf0\\x65\\xeb\\xae\\x39\\x07\\xe8\\xdd\\xc1\\xd3\\x06\\x9e\\x36\\xcc\\x58\\xf3\\x4d\\x7d\\xd3\\xb8\\xab\\xdf\\x99\\xe4\\x54\\x25\\xae\\xfb\\x50\\x41\\xdd\\x80\\xc7\\x42\\x89\\x6f\\x6d\\x9a\\xcd\\x0c\\x8f\\x96\\xf6\\x9a\\x6d\\xea\\x7c\\xcd\\xee\\xf0\\x0f\\x56\\x06\\x85\\x0d\\x38\\x90\\x5b\\xb7\\x1e\\x86\\xc8\\x6a\\x1b\\x4b\\xf9\\xd4\\x50\\x49\\x26\\x8a\\x26\\x60\\x8e\\xef\\xea\\x33\\x06\\x2d\\x37\\x44\\x81\\x4e\\x73\\x86\\xc2\\x8b\\x0d\\x1e\\x26\\x33\\x92\\x43\\x40\\x62\\x5c\\xbf\\x31\\x49\\xb0\\x81\\x3a\\x2c\\x80\\x01\\xef\\xe0\\xa1\\x83\\x0f\\x44\\x32\\xcc\\x4c\\x53\\x4a\\x04\\xbc\\xe7\\x57\\x23\\x18\\xe8\\x0a\\x07\\xea\\x60\\x95\\xc6\\xa6\\x09\\xbf\\x68\\xa7\\xe0\\x60\\x95\\xc6\\x1d\\xbc\\x6e\\xe0\\x15\\xeb\\x5d\\x50\\xa9\\x9f\\x32\\x60\\x35\\x77\\x65\\x87\\xc6\\x0a\\x36\\x1e\\xfa\\x7e\\xc8\\xaf\\xf4\\xa1\\x5e\\x43\\x54\\x8c\\xd6\\x03\\x77\\xde\\x0c\\xef\\x7f\\x48\\xd6\\x61\\xa0\\x6f\\x0f\\x53\\x82\\xbb\\xc8\\x9d\\xf7\\x82\\x72\\x03\\x8a\\x69\\xdd\\x01\\xb8\\xd7\\x77\\xd8\\x11\\x7c\\xd8\\x98\\x36\\xa6\\x35\\xb9\\x81\\xa9\\x4d\\xfa\\xcb\\xb1\\xaf\\x66\\x3d\\xc1\\x3c\\xe2\\xc3\\x86\\x3e\\x60\\x81\\x0d\\x7e\\x30\\x47\\x2e\\x2d\\x26\\xb5\\x46\\xc4\\x2a\\x95\\x8b\\x04\\x45\\xf3\\x8e\\x10\\xb3\\x3d\\x0d\\x65\\xad\\x00\\x65\\x39\\x14\\xc5\\xda\\x39\\x7c\\xb7\\xb0\\x5f\\xec\\x5c\\x14\\x3b\\xc7\\x62\\x4f\\xe7\\xf2\\x03\\x51\\x2a\\x50\\x8d\\xbd\\xda\\x37\\xcb\\x79\\xa4\\xf4\\xbc\\x4a\\x09\\x37\\x1c\\x87\\x76\\x83\\x6a\\x9d\\x63\\xad\\xb9\\x4e\\x72\\xb9\\x01\\xd9\\x1e\\x90\\xd6\\x07\\x35\\x63\\xf7\\xdb\\x5b\\x3e\\xde\\xde\\x12\\xdb\\x9b\\xc7\\x3e\\x65\\x78\\xea\\x79\\x27\\x8a\\x26\\x58\\x54\\x20\\xb2\\xa7\\x15\\x5c\\x3c\\xde\\x95\\x45\\x51\\xdf\\xd7\\x81\\x74\\xcd\\xc3\\xba\\x98\\x48\\x6d\\x33\\x63\\x65\\x8b\\xd8\\xb9\\xf1\\xd3\\x27\\x8a\\xa0\\x6e\\xe4\\xb0\\x6e\\xb0\\x64\\xba\\xf4\\xd2\\x4a\\x83\\xe6\\x2a\\x4b\\x80\\xbd\\xd6\\x67\\xd4\\x3a\\x2d\\xe6\\x27\\x0a\\x8e\\xb0\\xed\\x78\\x0c\\xc7\\xff\\x99\\x85\\x3a\\xd5\\x36\\xfc\\x02\\x96\\x70\\xe5\\x45\\xa1\\xdc\\x23\\x12\\xa3\\x2b\\x4c\\x1a\\x8a\\x10\\x60\\x14\\x27\\xc4\\x10\\xa8\\xd9\\xc4\\xab\\x4b\\xbc\\x90\\x71\\x44\\xc9\\x83\\x0e\\x03\\xc5\\xdd\\xf8\\x33\\x4f\\x50\\xc9\\x9e\\x76\\x77\\xea\\xa2\\x5d\\x98\\x35\\x82\\x73\\x72\\x84\\x01\\x7f\\x3c\\xbc\\xd1\\x94\\xbc\\x04\\xa6\\x27\\x32\\x5d\\x7a\\x06\\x3c\\x87\\xcf\\x23\\x6f\\x92\\x29\\x32\\x8e\\x88\\xdd\\xa9\\xf4\\x8a\\x25\\x51\\x32\\xe0\\x9e\\x89\\x7a\\xde\\xc9\\x20\\x4a\\xa1\\xa5\\x96\\xe4\\x9e\\xe8\\xe6\\x0c\\x35\\xc2\\x1c\\x71\\x49\\x16\\x15\\x1c\\x94\\x23\\xa3\\x34\\xc9\\x0b\\x0c\\x9f\\x47\\xd0\\x36\\x46\\xb4\\xc9\\x9d\\x4c\\x94\\x4c\\xd1\\x80\\x55\\x99\\x45\\x2b\\xc3\\xac\\xc7\\x9a\\xd3\\x1b\\xb7\\x38\\x5f\\x92\\xfc\\x7c\\x81\\x73\\x2f\\x10\\xf6\\x17\\x88\\x8a\\x73\\xad\\x47\\xf7\\x2c\\x25\\xc5\\x3f\\x23\\x06\\xfc\\x07\\xdc\\x8b\\xe8\\x3a\\x4f\\x59\\x2c\\xb1\\x3e\\xe4\\x51\\x79\\x13\\x99\\x37\\x06\\x80\\x40\\xe7\\x6b\\xc2\\x71\\xad\\x66\\x67\\x29\\x47\\x8a\\x2a\\x1e\\xca\\x18\\x60\\x35\\x51\\x8f\\x53\\xb3\\xaa\\x84\\x00\\x18\\x95\\x90\\x8a\\xfe\\x58\\x42\\x3c\\x42\\x89\\x46\\x43\\x15\\x97\\xdd\\xa1\\x14\\x09\\x65\\x91\\xb2\\x37\\x14\\x31\\x12\\x26\\x6f\\x80\\x5a\\x74\\x1a\\xc6\\x78\\x45\\x63\\xd4\\xee\\x6a\\x6c\\x8d\\x1a\\x59\\xf2\\xd3\\x46\\x7c\\xda\\xe0\\xa7\\x4d\\x8d\\xdd\\x68\\x9f\\xd6\\xb2\\x18\\x20\\x79\\xac\\xa2\\x48\\x97\\x65\\x00\\xc7\\x63\\x79\\x8a\\xcb\\x85\\x04\\x44\\xc5\\x9e\\x9f\\x9b\\xbb\\x80\\x43\\xb6\\x8e\\xc3\\x79\\x5a\\xa8\\x90\\x9e\\x0b\\x15\\xd2\\xe2\\x72\\x61\\x2f\\xfb\\x1c\\x9b\\xf0\\x0f\\x34\\xb1\\xdc\\x6b\\xc2\\xa7\\x26\\x96\\x4f\\x6d\\x82\\xb2\\x93\\x03\\xba\\xe8\\x40\\x13\\x0b\\x73\\x17\\xbe\\x11\\x35\\xb1\\xd0\\x9a\\x58\\x55\\x35\\x51\\xca\\xbe\\x28\\x88\\xab\\x9c\\xb8\\xcb\\x09\\xbd\\x2a\\x13\\x0c\\x81\\x57\\x8c\\x56\\xc7\\x14\\xdb\\x3c\\x5a\\x3f\\x92\\xcb\\xa2\\x4c\\xb3\\xd8\\xa9\\x10\\xc5\\x20\\xf1\\x0e\\x5b\\x1f\\x50\\xc8\\x95\\xb7\\x04\\x44\\x19\\xc5\\x94\\xd1\\x30\\xa5\\x19\\xad\\xb1\\x81\\x27\\x0c\\x0d\\x07\\x89\\x84\\x4d\\x04\\xc5\\x5e\\x63\\x7f\\x64\\xc5\\x07\\x95\\x96\\x16\\x49\\x40\\xee\\xa9\\xd4\\x7f\\xa0\\x96\\xdf\\x1e\\xba\\x43\\x25\\x1c\\xa1\\x07\\x86\\x45\\x56\\x51\\x96\\x78\\xd1\\x0d\\xc6\\x3a\\x12\\x85\\xfe\\x25\\xab\\x17\\x1f\\xb2\\xbc\\xd9\\xdf\\x21\\x9d\\x20\\xeb\\x09\\x95\\x58\\x04\\x12\\x32\\xe3\\x06\\xb2\\x84\\xb5\\x08\\xc3\\x51\\x11\\x59\\x39\\x0f\\x78\\xd7\\x62\\xcb\\x80\\x77\\xd8\\x22\\xc0\\x3b\\xb2\\x51\\xc1\\x73\\x2c\\x7d\\x2f\\x46\\x97\\xd8\\x9b\\x03\\x98\\x31\\x93\\xec\\x04\\xa0\\xa1\\x49\\x36\\x25\\x5d\\x68\\xda\\x45\\x59\\x6b\\xe6\\xad\\x51\\x75\\x72\\x24\\x24\\x6b\\x88\\x7e\\x80\\xe0\\x5f\\x63\\x20\\x28\\x44\\x4a\\x52\\x35\\xda\\x37\\x99\\x81\\xea\\x20\\xd4\\xcd\\x90\\xa1\\x8a\\x13\\x95\\x33\\x71\\x6b\\xb8\\xb9\\x1e\\xb2\\x16\\x81\\x8e\\x0c\\x30\\x47\\xcd\\xa6\\x8b\\x7a\\xc9\\x66\\x24\\x6f\\xd5\\x00\\x13\\xb9\\xa8\\x0b\\x89\\x6e\\xb0\\xf0\\x2e\\xc4\\x87\\x47\\xd1\\x01\\x59\\x61\\xa3\\x33\\xc2\\x88\\x54\\xbe\\x60\\x94\\xe9\\x92\\x06\\x8e\\x4e\\x3f\\x98\\x41\\x76\\x1e\\x88\\xab\\x22\\x3d\\x03\\xa0\\x86\\xbd\\x3e\\x3d\\x3c\\x40\\xb1\\x99\\x17\\x78\\xa9\\xf7\\x4d\\x51\\x5a\\x2d\\xc7\\x5f\\x32\\x23\\xdb\\xf7\\xa4\\xcf\\x32\\x8c\\xad\\x66\\x90\\xeb\\x60\\x59\\x80\\x44\\x0b\\x24\\x06\\x48\\x29\\x18\\x3d\\x32\\xd7\\xb2\\xdf\\xa6\\xf2\\xed\\x06\\xac\\x3d\\x24\\x0a\\xa6\\x1e\\xa5\\x40\\x02\\x25\\x73\\xcf\\x47\\x5e\\xd5\\x47\\xc1\\xae\\x5f\\x68\\xe8\\x63\\x5d\\x4f\\x33\\x95\\x42\\xdf\\x95\\xca\\xf4\\x3a\\x1f\\xfd\\x93\\xcc\\xa1\\x3c\\x61\\xfc\\x4d\\x4e\\x34\\x04\\x84\\x9e\\x54\\x4c\\xb7\\x19\\x8f\\xbd\\x83\\x05\\x11\\x0a\\xff\\x06\\x6a\\x9c\\x95\\x95\\xf0\\x54\\x17\\x49\\xcd\\x49\\x4d\\x1c\\x80\\xe3\\x97\\x52\\x56\\x75\\x35\\x32\\x4a\\xf3\\x02\\xa4\\x89\\xb5\\x3b\\x91\\x29\\x4b\\xf5\\x89\\xc4\\x21\\x69\\x60\\x57\\x12\\x15\\x9e\\xe6\\x60\\x27\\x15\\x8f\\x50\\xe7\\xc0\\x21\\x7b\\xea\\x97\\x09\\xbf\\xd2\\x6e\\xc8\\x59\\xee\\x9c\\xc5\\x56\\x8b\\x84\\xf8\\xe0\\x3b\\xd2\\xb2\\x04\\x0e\\x55\\xf4\\xa3\\x9e\\x61\\x8f\\xe0\\x54\\xc0\\x9f\\x0d\\xcf\\x50\\xf3\\x0f\\x90\\xa7\\x5f\\x2c\\x7a\\x79\\x2b\\x49\\x12\\x1c\\xe0\\x2f\\x70\\x0f\\xc4\\xaa\\x83\\xe3\\xb8\\x2d\\x9f\\x6c\\x54\\x12\\x0f\\x9e\\x47\\x23\\x13\\xf8\\x11\\xee\\x4f\\x82\\x29\\x43\\x26\\xde\\x11\\x5f\\xeb\\x31\\xb9\\x31\\x6b\\x70\\x77\\x97\\x7b\\xce\\x7d\\x5a\\xcb\\x4e\\xa2\\xc7\\x4d\\xd2\\x57\\x14\\x37\\x9a\\x79\\x37\\x34\\x3d\\x1d\\xc1\\xe5\\xf8\\xa8\\xe4\\x1d\\x17\\xe1\\xc1\\x60\\x00\\x86\\x37\\xf1\\x35\\x01\\x6d\\xa7\\x11\\xeb\\xca\\x54\\x14\\x3b\\x55\\x84\\x46\\x8d\\x35\\x64\\xef\\x69\\x21\\x51\\x43\\x23\\x22\\x1f\\xc9\\x2c\\xf7\\x1d\\xda\\x4e\\x29\\x09\\x5d\\xf3\\x48\\x5d\\xa9\\x0a\\xb4\\x64\\xa0\\x0f\\x46\\x62\\xd1\\xf3\\x4b\\x8d\\xaf\\xe0\\x4c\\x32\\x94\\xdc\\x90\\x08\\xeb\\xfb\\x8c\\x74\\x92\\x4a\\x93\\xed\\x1f\\x12\\xb6\\x44\\x62\\x30\\x30\\x2f\\x39\\xbd\\x45\\xa4\\x57\\x49\\xb1\\x8a\\x54\\x9c\\x44\\xcb\\x8d\\x54\\xad\\x41\\x6a\\x83\\x1c\\x78\\x55\\x79\\x2b\\x7a\\xc4\\xbb\\x04\\xaa\\x2d\\x54\\x15\\x41\\x5d\\xd2\\xea\\x22\\x99\\xd9\\x4c\\x80\\xcf\\xcf\\x83\\x74\\x09\\xab\\xa1\\xab\\xc4\\x98\\x9b\\x6d\\x97\\x55\\xb6\\xef\\x8f\\xfd\\x03\\x95\\xa1\\x04\\x7b\\xc1\\x97\\x75\\xc3\\x3a\\x9b\\x8f\\x9b\\x1d\\xbb\\x63\\x02\\x11\\x68\\xcc\\x9b\\x6e\\x7d\\x61\\xb6\\x01\\x64\\x70\\xf6\\xa2\\xe0\\xfb\\xa6\\x90\\xa9\\x03\\x59\\x3c\\xd3\\x24\\x21\\xe2\\x14\\x80\\x95\\x75\\x23\\x50\\x1f\\xea\\x14\\xaf\\x83\\x71\\xa5\\x20\\x14\\xcd\\x4b\\x9a\\x01\\x50\\xaa\\xdb\\xea\\x30\\x66\\x1e\\xac\\x8b\\x70\\xca\\x22\\x29\\x22\\xbf\\xa9\\x8c\\x1a\\x39\\xc3\\xd0\\x2a\\xf7\\x33\\x27\\x75\\x6c\\xca\\x2d\\x76\\x8a\\xc3\\xb1\\x5e\\x5d\\xb4\\x9c\\x14\\xa2\\xe5\\xa4\\xc1\\x9d\\xfa\\xba\\xb1\\x60\\x6b\\x47\\xa6\\x2c\\xf1\\x4a\\x6f\\x26\\x91\\xaf\\xb8\\x25\\x06\\x04\\xbc\\x0e\\xa4\\x6f\\xda\\x37\\xe8\\x2a\\xa2\\x88\\xc3\\xb7\\x8b\\x18\\x9f\\x8a\\x89\\xcb\\xf8\\xfb\\xa9\\x58\\xb8\\x18\\xc3\\xd7\\xa3\\x62\\x35\\xe4\\xa7\\x9b\\xc2\\xe6\\xc6\\xae\\xce\\xd7\\x94\\xf4\\x45\\x49\\x7f\\xab\\x8c\\x65\\xd6\\x28\\x89\\xd6\\xc8\\x0b\\x18\\x44\\x59\\x3e\\xa6\\xed\\x32\\x52\\x43\\x42\\xfe\\xc5\\x58\\xe6\\xba\\x7f\\x39\\xef\\xe2\\x48\\x83\\x27\\xe7\\xe0\\xa6\\xfb\\x66\\x7f\\xd3\\x05\\x87\\x62\\x80\\xee\\x06\\x07\\x2d\\x6e\\x52\\x26\\x7e\\x71\\x7c\\x78\\xe8\\x0c\\x50\\x7b\\x9b\\xd2\\x9d\\xca\\xbc\\x20\\x5f\\x12\\xe8\\xf1\\x88\\x2e\\x80\\xd7\\x5e\\xbc\\xc2\\xeb\\xc3\\x80\\xcd\\xc9\\xd6\\xa4\\x48\\x49\\x20\\x85\\xfa\\x9e\\xab\\x35\\xf1\\x58\\x2f\\xcf\\x56\\xc4\\x5c\\xe9\\xa2\\xbc\\x35\\xac\\xb1\\xd5\\xd9\\x1a\\x10\\xef\\xda\\x14\\xb4\\x95\\xcc\\x8f\\x19\\x27\\x6b\\x64\\xc4\\x66\\xf8\\x93\\x88\\x57\\x52\\x96\\x58\\xf0\\xce\\x68\\x29\\x35\\x8b\\xb4\\xfc\\x0b\\x91\\xbf\\xc1\\x93\\xc9\\xa2\\xd9\\x91\\xb9\\x59\\x22\\xd2\\xb1\\x60\\x4e\\x5c\\xcb\\x45\\xbf\\x81\\xf5\\xee\\x20\\xc1\\xe1\\xfa\\xb0\\xe0\\x23\\xf2\\x96\\x80\\xc4\\x9e\\xef\\xef\\x2c\\xfb\\xe4\\xeb\\xd7\\x7d\\x14\\xcf\\x74\\xc3\\xc2\\xc7\\x17\\xfe\\x01\\x4f\\x58\\x37\\xe2\\xc2\\x1a\\x35\\x1e\\xa0\\x9b\\x6a\\x6f\\x44\\x14\\xd6\\xe9\\xa9\\xfb\\xe2\\x40\\xd5\\xb3\\xa2\\x6a\\xd7\\xcf\\xb7\\xce\\xdd\\x57\\xaf\\x7c\\x5d\\xa5\\xe7\\xb1\\x22\\x91\\x28\\x12\\x49\\xf7\\x1e\\x5f\\xbd\\x37\\x65\\x54\\x93\\x92\\x02\\x42\\xe2\\xcf\\x3c\\xa1\\x76\\xb0\\x77\\x7d\\x4e\\x26\\x60\\xb9\\xfe\\x1b\\xd2\\xa0\\x58\\x28\\xf0\\x4d\\x32\\x5f\\x20\\xa7\\x2a\\xbe\\xf4\\x70\\x2b\\x30\\x7a\\x6c\\x3e\\x72\\x79\\x95\\x01\\x5a\\x6d\\x22\\x97\\xb9\\x25\\x71\\x08\\x43\\x83\\x73\\xb2\\x3b\\x4a\\x74\\xc3\\xc8\\x58\\x32\\x72\\x1e\\x47\\xe4\\xcd\\xdc\\x33\\x67\\x6c\\x38\\x0d\\x8e\\xc2\\x65\\xbc\\x44\\x42\\x52\\xde\\x43\\xcd\\x29\\x57\\xa6\\x25\\x79\\x9a\\x5a\\x6d\\x89\\xe6\\x8c\\x44\\x3a\\x32\\x41\\x1f\\x66\\x32\\xb1\\x4a\\xa1\\x22\\xef\\x7f\\xae\\xe4\\x5e\\x54\\xb1\\x65\\xb5\\x99\\x37\\x77\\xb2\\x00\\x00\\xe4\\xf8\\x88\\xeb\\x0b\\xe8\\x25\\x7e\\xb0\\x8c\\x32\\x2f\\x4d\\xbd\\x6a\\xd8\\x11\\xc8\\x72\\xc3\\xb9\\xb0\\xd8\\xb3\\x8c\\xf8\\x5f\\x01\\x84\\xfc\\x52\\x19\\x08\\x2b\\x29\\x8c\\x97\\x66\\x66\\x16\\x51\\x5b\\x99\\x34\\xec\\x8c\\xd1\\x9e\\x8f\\x2e\\x6a\\x49\\xb9\\xfe\\x0c\\x7d\\xfb\\x3b\\x3c\\x26\\x2f\\xa7\\x22\\x50\\xf3\\x76\\xb7\\x1e\\x17\\x32\\x73\\xc3\\x69\\x46\\x24\\x82\\xef\\x2a\\x00\\xb9\\x5b\\x76\\xeb\\x2f\\x16\\xc1\\xc1\\x5e\\xeb\\x8e\\x6c\\x8a\\x11\\xcc\\x85\\x8b\\xe4\\x25\\x9f\\xab\\x94\\xdc\\x1c\\x74\\x81\\x36\\xa4\\xc0\\x8b\\x41\\x97\\x3d\\xc2\\x2a\\x3b\\xe3\\xc8\\x74\\x39\\x43\\x69\\x1c\\x2a\\x87\\x4f\\x36\\x85\\x73\\x4c\\xb5\\xa6\\xcd\\x39\\xd9\\x36\\xc2\\x53\\x5e\\xea\\x5e\\x10\\xb6\\x68\\x7c\\x68\\x14\\xc5\\x9b\\xe2\\xb1\\x29\\xd4\\xce\\xda\\x46\\xb7\\xee\\x98\\xb9\\xd3\\x7a\\xb4\\x16\\x44\\xbd\\xec\\x3c\\x6b\\xac\\x65\\x75\\x46\\x7e\\x83\\x47\\xf5\\xa2\\xaa\\xed\\x02\\x81\\xe5\\x36\\x79\\x36\\xf6\\xdb\\x59\\xdd\\xb1\\x2d\\xe9\\xec\\x25\\xe0\\x6e\\x01\\x59\\x35\\x32\\xcc\\xdc\\xe4\\x41\\x61\\xab\\x8a\\xea\\x43\\x4e\\x38\\xfb\\xfa\\x75\\xd0\\x69\\x67\\x05\\x4b\\xfc\\x95\\x8b\\x80\\x22\\xd1\\xab\\x8d\\xa3\\xb2\\x14\\xdf\\xdb\\x3c\\x2e\\x0b\\x49\\xf6\\xb3\\xf0\\x68\\x6f\\xd1\\x38\\x08\\x07\\xab\\x40\\xf2\\xec\\xb3\\x17\\x47\\xb6\\xeb\\x0b\\x5d\\xa3\\x9c\\xb8\\x4e\\x52\\x34\\x59\\x5f\\x1d\\x94\\x86\\xfa\\x05\\x3f\\x4e\\x6b\\x49\\x85\\x23\\xc7\\x8d\\xe3\\x31\\x65\\x61\\xa9\\x93\\xfa\\x01\\x23\\x3f\\x58\\xba\\x21\\xb4\\x4c\\x44\\x9e\\x02\\xd6\\x5d\\x50\\xac\\xbb\\x79\\x11\\x03\\x60\\xcd\\xd3\\x31\\x50\\x9b\\xed\\x25\\x71\\x1d\\x0b\\x34\\xae\\x74\\x81\\xd1\\xc0\\xf6\\x22\\x64\\x9d\\xe6\\x13\\xbf\\x01\\xd3\\x6f\\x44\\x2d\\x7a\\x9e\\xe2\\x86\\xd9\\x08\\x2e\\x66\\x71\\x66\\x11\\xf8\\x72\\x9e\\x65\\x89\\x37\\x33\\x01\\x64\\x62\\xce\\x19\\x19\\x46\\x1f\\x1d\\x39\\xcf\\xe1\\xa1\\x33\\x25\\xb6\\xcb\\x9d\\xa0\\x60\\x07\\xc3\\x6a\\x02\\x8a\\x83\\x41\\x75\\xd8\\x82\\x4c\\x3b\\x23\\xbc\\x3d\\x5a\\xab\\x8d\\x18\\x96\\xd8\\x1c\\x57\\x9e\\x92\\x68\\xe9\\xa3\\xe8\\xc3\\x98\\xaf\\xf1\\xa8\\x5c\\xee\\x1e\\x90\\x5f\\x4f\\xe1\\x11\\xda\\x7a\\xea\\x21\\xf6\\x3a\\x95\\x6e\\x8f\\xe9\\x94\\xba\\x02\\xd4\\xff\\xd4\\x03\\x64\\x4f\\x94\\x9a\\x8e\\x2b\\xd0\\xe8\\x42\\x98\\xb7\\x6c\\xed\\xbc\\x21\\xa2\\x07\\xe7\\x14\\x5c\\x3c\\x74\\x37\\x4f\\x3d\\xfe\\x9f\\x3d\\xcb\\x09\\x80\\x32\\x67\\x7d\\x90\\x0e\\x0c\\x0b\\xe6\\xd1\\xd3\\x4d\\xe6\\x71\\xf1\\x38\\x14\\x22\\x07\\x16\\x60\\x26\\x3c\\x3d\\x51\\x3c\\x88\\x84\\x2b\\x3d\\xd1\\xfc\\x86\\xc1\\x3e\\x70\\xc6\\xef\\xcb\\xf8\\xd2\\xed\\x88\\xc4\\x53\\x78\\x23\\x87\\xb1\\x43\\x7e\\xc9\\x80\\x10\\x2d\\x8b\\x25\\x62\\xde\\x48\\x0c\\x4d\\x3a\\x43\\x59\\xce\\xa1\\x37\\xb1\\x29\\xd5\\xf9\\xe3\\xba\\x81\\xeb\\x36\\x67\\x90\\x01\\x75\\xb5\\x62\\xe0\\xba\\xc4\\x6f\\x60\\x22\\xbe\\xae\\xaa\\xb8\\xc1\\xe7\\x7a\\x7d\\x55\\x59\\x9a\\x98\\x45\\xe9\\x97\\x5d\\xfa\\x48\\x25\\xb7\\xbb\\x2c\\x80\\x7f\\x62\\xa7\\x1c\\x6e\\x53\\xb2\\xd1\\xa4\\xa5\\x5c\\xc5\\x48\\x8b\\xd3\\xfd\\x06\\xc7\\x41\\x58\\xbd\\xc4\\x55\\x87\\x3b\\x5c\\xf5\\x53\\xf9\\x85\\x78\\xc7\\xdd\\xe9\\xe3\\x8b\\x43\\xcc\\x9b\\xf7\\xf0\\x50\\xe9\\xcd\\xc7\\xb3\\x1b\\x05\\xf1\\xb8\\xa7\\x71\\xf2\\x25\\xa7\\x5b\\x72\\x6f\\x7c\\x2f\\x62\\xfa\\xe8\\x6b\\xaf\\x6c\\x32\\xb2\\xb3\\xf6\\xa4\\x30\\x27\\xe1\\x51\\x69\\xed\\x65\\xca\\xbb\\x02\\xa0\\x2e\\xc0\\x17\\x24\\xbd\\x87\\xe9\\x5a\\x22\\x93\\xb0\\x94\\x62\\xa5\\xd6\\x8a\\x37\\x97\\xad\\xcf\\xec\\xdf\\x98\\x1e\\xa3\\x72\\x08\\x3c\\xcd\\x51\\xe6\\x91\\x5b\\x7e\\x40\\xff\\x01\\xc7\\xcd\\x81\\x82\\x9f\\x8f\\xe8\\x63\\x79\\xb6\\xef\\x9e\\x2f\\x5a\\x77\\x14\\x67\\x89\\x62\\xd3\\xde\\x9d\\xad\\xe9\\x75\\x2d\\x5e\\x49\\x88\\x74\\x76\\x23\\x7e\\xc9\\x3a\\x80\\x5c\\x8f\\x60\\xbd\\x33\\xee\\x18\\xc0\\x5e\\xc0\\x3a\\x6b\\x42\\x0d\\xc0\\x53\\xb8\\x78\\x7b\\x6e\\x40\\xf1\\x86\\x63\\xac\\x01\\xb3\\xb5\\xbb\\x8d\\x99\\xc9\\x36\\x90\\x0e\\x47\\x89\\x21\\xeb\\x78\\x78\\xe8\\x98\\x95\\xdd\\x80\\xb3\\x16\\x4a\\xce\\xd0\\x8f\\x9f\\xb0\\x4e\\x11\\xf2\\xab\\x4d\\xb1\\x12\\x93\\x1d\\xd9\\x92\\x66\\x97\\xcf\\xef\\x5f\\x90\\xe2\\x36\\x53\\x72\\x26\\x1b\\x59\\x7b\\xd4\\xb1\\xf3\\xa6\\x4a\\x3a\\x9c\\xf2\\x38\\x97\\x0e\\xeb\\xe2\\xa6\\x42\\x82\\x26\\x1d\\x13\\x28\\xe1\\xd8\\xc8\\x39\\x8b\\x00\\xab\\x47\\x66\\x2c\\xf0\\xb2\\xe1\\x4f\\xa2\\x29\\xcf\\xf8\\xfd\\xa5\\x8d\\x4f\\x4c\\xcc\\x80\\x9d\\x16\\x8d\\x1a\\x18\\x4b\\x26\\x9a\\xea\\x62\\xd8\\x4c\\x99\\xfa\\x3f\\x3c\\xc0\\x81\\x22\\x7b\\xe9\\x88\\x9f\\xcf\\x40\\x23\\xac\\xa4\\x3a\\xa4\\x88\\x98\\x48\\xc9\\x3e\\xd0\\xe7\\x66\\xcb\\xe1\\x99\\x59\\xc8\\x9b\\x54\\x8d\\xa5\\x38\\x49\\x9e\\xae\\xab\\x9b\\x0f\\xc2\\xcb\\x45\\xbd\\xba\\xd4\\x2d\\x6c\\xf9\\x63\\x6f\\x02\\x7f\\x9b\\x18\\x36\\x09\\x2d\\x8a\\x49\\x5c\\x28\\xc9\\xd5\\xfb\\xb7\\x68\\x4f\\x20\\x54\\xd0\\x85\\xcf\\x84\\xd6\\xe7\\x46\\x3a\\x49\\x0b\\xd7\\x1d\\xad\\xcf\\x44\\x00\\x8e\\x61\\x96\\x3e\\x03\\x20\\x3f\\xc3\\x1c\\x87\\xad\\x4b\\x16\\xa3\\xa5\\x38\\x1c\\xca\\x50\\xff\\xe7\\x26\\x6a\\xcf\\xc3\\x57\\xbf\\x10\\x75\\xef\\x67\\x36\\x47\\x79\\xef\\x5e\\x70\\xdc\\x27\\x64\\x44\\x24\\x13\\x1e\\x1e\\x28\\xd6\\x43\\x31\\xc2\\x58\\x2c\\x8e\\x4b\\x32\\x59\\xfa\\xdc\\xc8\\x73\\xe2\\x1a\\x59\\x35\\x8a\\x81\\xae\\x8a\\x22\\x99\\xe4\\x9c\\xef\\x45\\x98\\xa2\\xdc\\x65\\x30\\xd2\\x50\\x48\\x3c\\x21\\xbb\\x81\\xc8\\x7c\\x17\\x46\\x12\\xb9\\x43\\xd5\\x09\\xac\\x80\\x15\\x6c\\xbd\\x08\\xfe\\x2e\\xb9\\xdb\\x5a\\x8d\\x22\\xfe\\xda\\xc7\\x50\\x6a\\x19\\xbf\\xf6\\xd1\\xf5\\x66\\x04\\xf3\\x3a\\x32\\x5d\\x7c\\x73\\xc9\\x5f\\x8b\\x8f\\xb7\\x0c\\x7e\\x0b\\x15\\xbd\\xd0\\x95\\xfd\\xe7\\xc6\\xbc\\x99\\x01\\x40\\x02\\x18\\x78\\x04\\x03\\xcf\\x10\\x4a\\x31\\x5d\\x1f\\xbf\\xf0\\x8d\\x97\\x50\\x17\\xa3\\x48\\x5d\\x21\\x6d\\xd9\\x06\\x8f\\x59\\xd2\\x40\\x4a\\x7c\\xde\\xa0\\x46\\x51\\xe1\\x13\\xdb\\x6e\\x60\\xe3\\xf8\\xc9\\xc7\\x3e\\x1c\\x1d\\x3d\\xa3\\x76\\xe8\\x06\\x21\\xe5\\x11\\xb4\\x07\\x20\\x98\\x37\\x13\\x8a\\xd7\\xf2\\x8c\\xfa\\x42\\xf7\\xd3\\x18\\xac\\xca\\xc5\\x6f\\x41\\x73\\x49\\xc6\\xfa\\x6a\\x03\\x79\\x05\\x94\\x7c\\xb9\\xeb\\xea\\xb4\\x6b\\x4b\\x3b\\x0e\\xb7\\xab\\xb0\\x55\\x79\\x0c\\x87\\x93\\x99\\xbf\\x38\\x9f\\xc4\\x33\\x6c\\x9c\\x0b\\x1f\\xc9\\x34\\xd2\\x65\\x0a\\x84\\xd5\\x7a\\x81\\xd9\\xd1\\x0d\\xc4\\x8e\\xef\\xdf\\xc7\\xdd\\x52\\xa7\\xb9\\xab\\xe9\\xa7\\x9f\\x0a\\x81\\xf2\\xa6\\x8d\\x8e\\x15\\xc7\\xbe\\xd8\\x4e\\x50\\x8d\\xb4\\x19\\x24\\xdf\\xe6\\xa8\\xc1\\x72\\xf1\\x5f\\xd6\\x48\\xb5\\xf8\\xa2\\x46\\x97\\x6a\\x97\\xc8\\x3e\\x2a\\x21\\x7b\\x37\\xc8\\x92\\x92\\x3f\\xa3\\x03\\xb4\\x06\\x3a\\x30\\xd9\\xa5\\x36\\x5c\\x32\\x89\\x46\\xc5\\x59\\x3c\\xbd\\xdd\\xbd\\xdb\\x1e\\x7d\\xab\\xe3\\xb5\\x4f\\x5a\\xe8\\x2b\\xc0\\x26\\xf9\\xe4\\x8b\\xa0\\x11\\x1b\\xfe\\x19\\x9f\\xd0\\x8f\\x01\\xa4\\x46\\x63\\x58\\x51\\x1e\\x75\\x13\\xb0\\x4c\\x48\\x34\\x47\\x54\\x20\\xf2\\x84\\xbf\\xf1\\x85\\x2b\\x9f\\x0f\\xf4\\xbb\\x44\\x43\\xb3\\xa6\\x10\\x23\\xc1\\x99\\x8f\\xc4\\xf2\\x5d\\xc3\\x03\\x8c\\x9d\\x68\\x3c\\x20\\x75\\x2e\\x1b\\x57\\x21\\xf1\\xa6\\x8b\\x3a\\x51\\xb1\\x5a\\x57\\xb0\\x22\\x49\\xf3\\xcf\\x24\\xff\\x31\\x5b\\xbb\\xb2\\xc8\\x12\\x98\\xaf\\x05\\xfc\\xd5\\x8a\\x75\\x9a\\x58\\x72\\x0c\\xcf\\x6d\\xf8\\xb5\\x3b\\xa6\\xac\\xa0\\xb8\\xaa\\xfa\\xaa\\xe5\\xe9\\xe1\\xf2\\x8c\\xe5\\xf2\\xcc\\xf8\\xb3\\xce\\x7f\\xbf\\x38\\x4b\\x22\\xd2\\xaf\\x20\\x59\\x72\\x57\\xef\\x92\\xb8\\x15\\xeb\\x29\\xfe\\xfa\\x55\\x29\\xaa\\x7a\\xa6\\x57\\x15\\xeb\\xcb\\x31\\xdd\\xa3\\x3d\\x80\\x6b\\x3a\\xb8\\x1c\\xf5\\x10\\xa1\\xc4\\x6b\\x02\\x53\\xe4\\xeb\\x7a\\xf2\\x19\\x6a\\x37\\xc7\\xe4\\xfa\\x7e\\x92\\x4d\\x25\\x58\\x51\\x4e\\x9f\\x8e\\x2d\\x1b\\x55\\x49\\x84\\xf7\\x21\\x65\\xc4\\xfa\\xf0\\x60\\x9d\\xf1\\x18\\x3e\\xc5\\xfa\\x81\\xed\\xa9\\x1b\\x2b\\xaf\\x74\\x63\\xe5\\xa3\\x3b\\x7b\\x75\\x0a\\xe9\\x77\\x51\\x73\\x74\\x85\\x95\\x08\\x3b\\x4a\\x3f\\xf7\\x97\\xb3\\xc6\\xbb\\x63\\x20\\x65\\x6a\\x94\\x80\\x16\\x43\\x8b\\x71\\x00\\x5c\\x9a\\x5d\\x9b\\xe9\\xef\\x1b\\x5b\\x64\\x68\\x16\\xa9\\x9d\\x23\\x4f\\x20\\x38\\xf1\\x9d\\x0a\\xe5\\x17\\x17\\xf8\\xc6\\x30\\x5d\\x68\\xda\\x85\\x40\\x4c\\x61\\x52\\x1d\\x93\\xda\\xf2\\xda\\x0e\\xaf\\x7e\\x69\\x9c\\xd6\\x08\\xb0\\xc1\\x52\\x75\\xfa\\xcc\\x1a\\x99\\x52\\x86\\x14\\xf1\\xe5\\xc4\\x6d\\x76\\xa6\\x2a\\x27\\x62\\x73\\xfc\\x65\\xb5\\xe4\\x53\\xe6\\xc4\\xfe\\x7c\\x53\\x7b\\x06\\x5d\\x79\\x78\\x40\\xb9\\x0b\\x6c\\xaf\\x1b\\xd3\\x7c\\xce\\xd7\\x63\\x63\\x29\\xe8\\x12\\x18\\x9c\\x03\\x3b\\x56\\x94\\x6d\\xf2\\x44\\xa4\\x8a\\x1a\\x32\\xcc\\x0e\\xcc\\x2c\\x06\\x04\\xbb\\xe1\\x15\\xfd\\x66\\x6a\\x75\\x70\\xd5\\x4b\\x01\\x2b\\x73\\xa4\\x3e\\xe0\\x8d\\x9b\\xaa\\xc5\\xaa\\xc8\\x8f\\x07\\x98\\xba\\xe5\\x48\\x75\\x47\\xcd\\x9e\\xba\\xfe\\x8c\\x77\\x6e\\x1b\\xe1\\x84\\x8f\\x4b\\x73\\x87\\x52\\xdb\\x39\\x45\\xca\\x81\\x53\\x5f\\x4d\\x59\\x2e\\xa1\\x42\\x71\\x3b\\x72\\xd4\\xf5\\x08\\xa1\\xaa\\xee\\x40\\x99\\xab\\xa0\\xea\\xa3\\xe2\\x22\\x0e\\x79\\xa4\\x9c\\x90\\xf9\\xea\\x2b\\x1e\\x81\\x04\\x07\\xb1\\xee\\xfd\\xd6\\x67\\x1a\\x8d\\x0b\\x5d\\xfe\\x3c\\xc6\\x3a\\x6d\\xac\\x93\\x45\\xec\\x59\\x2e\\xc5\\x67\\xca\\xe5\\x03\\x57\\x0d\\x00\\x39\\x95\\x0f\\xd0\\xd3\\x07\\x18\\xef\\x6d\\x02\\x1e\\x4a\\xb0\\x93\\x64\\x09\\x97\\x5c\\x84\\xbb\\xc2\\xd1\\x77\\x45\\xf4\\xdc\\x19\\x99\\xb4\\x27\\x80\\xe2\\xc3\\xdc\\x74\\x32\\x93\\x3b\\x5d\\x5f\\x84\\x2f\\xcd\\xc4\\x25\\x67\\xc1\\xcb\\xc7\\x75\\xbc\\x88\\xad\\xa3\\xbe\\xd2\\x38\\x67\\xa2\\xd2\\x7a\\x56\\x5f\\xb7\\x81\\xa9\\x6f\\xc3\\xa3\\x5f\\x5f\\x03\\xd6\\x86\\x06\\xf7\\x08\\x1a\\xc5\\xf9\\x89\\x1b\\xd2\\xb2\\x73\\x38\\x0f\\xe8\\x6f\\x54\\x71\\xd8\\xe0\\x3d\\xc0\\xd8\\x35\\x44\\xef\\xdb\\x29\\xa0\\x7b\\x22\\xf3\\xd0\\x95\\xcd\\xec\\x4e\\x8c\\xd0\\x88\\x1f\\x1e\\x92\\x33\\x0f\\xd7\\x0c\\x05\\xf7\\xa4\\x27\\x12\\x5e\\x44\\xe8\\xcf\\x00\\x85\\x0f\\x40\\xaf\\x00\\x6b\\x0a\\x7f\\x37\\x3c\\x80\\xbf\\xb3\\x0d\\x4f\\x98\\x83\\x34\\xc9\\xec\\xae\\x58\\x7a\\x1e\\x1e\\x0a\\x90\\xd2\\x74\\x58\\x02\\x4d\\x66\\xa2\\xc9\\x04\\x9a\\x34\\x47\\x40\\xfb\\x50\\x9c\\x3a\\xf8\\xdc\\xe0\\x5a\\x46\\x0f\\xe5\\x1c\\x09\\xc3\\x26\\x61\\x7d\\x13\\x99\\x58\\xee\\xd3\\x5d\\xde\\xa7\\xbb\\x2f\\xf4\\xe9\\x0e\\xea\\x21\\x3a\\x09\\x7a\\xa7\\xf5\\x69\\xd3\\xa0\\xca\\x83\\x03\\x7d\\xea\\xd0\\x70\\xb0\\x4f\\x79\\x46\\xec\\x9e\\xe8\\xd3\\x1d\\xf6\\x49\\x27\\x91\\x14\\xc4\\x79\\xf4\\xf0\\x80\\xb1\\x58\\xf1\\x62\\x02\\x65\\x8a\\x4a\\xb7\\x0d\\x7a\\x64\\x91\\x39\\x2d\\xfe\\x9d\\xdd\\x09\\x8d\\x35\\x1f\\x7b\\x14\\x90\\x97\\xe5\\xa3\\x23\\x47\\x69\\x24\\xe0\\x52\\x0e\\x0d\\x1c\\x07\\xe6\\xac\\x63\\xa6\\xb6\\xaf\\x76\\x80\\x11\\x01\\xdf\\x99\\x9a\\x98\\x67\\x49\\x72\\x22\\x20\\x31\\xb3\\xdc\\x5c\\xb8\\xfa\\x46\\x5a\\x7a\\x86\\x27\\xdf\\x1f\\x9a\\x06\\x39\\x51\\x3c\\x73\\xfe\\xde\\x07\\xac\\x09\\xa3\\x5d\\xf0\\x02\\xf5\\x00\\x3e\\x40\\xfb\\xfa\\x4e\\xa3\\xd0\\x89\\x1c\\xc0\\xd2\\xfc\\x3f\\xf9\\x68\\xbe\\x4e\\xdb\\xd6\\x27\\x6d\\x5b\\xbf\\xd2\\x2c\\x43\\x43\\xfb\\xa9\\xa6\\x03\\x80\\x94\\x8e\\xaf\\xe9\\x48\\xe8\\x17\\xb7\\x68\\x5a\\xfa\\x1e\\x69\\x16\\xfb\\x15\\xfc\\xdd\\xd7\\xbd\\xf3\\xc6\\x13\\x8f\\xd1\\xff\\xa7\\xb6\\x1e\\xdc\\xd6\\xd3\\x0e\\x4a\\x2a\\x09\\x64\\xcd\\x63\\x51\\xaf\\x12\\x22\\x79\\xe2\\xc2\\x44\\x5b\\x1e\\xca\\x09\\xc6\\x5f\\x79\\xef\\x97\\x84\\x38\\x78\\xbc\\x4a\\x85\\x58\\x73\\x9c\\xda\\x45\\x9f\\x38\\xf2\\x41\\x18\\xe3\\x8e\\xfe\\x3f\\xc5\\xfb\\x7d\\x8f\\xf9\\x08\\x0d\\x9a\\x8f\\x27\\x9b\\x74\\x8c\\x8b\\x39\\xb4\\xa5\\x68\\x0f\\x0d\\xae\\x9f\\x49\\x39\\x1f\\x19\\x3a\\xa3\\x0a\\xe9\\x13\\xb5\\x65\\x97\\xc4\\xdd\\x08\\x1e\\x92\\xb4\\x88\\xa1\\x3f\\x48\\xd6\\x3c\\x59\\x63\\x17\\x8b\\xad\\xb1\\xd8\\x0a\\xc8\\x91\\xa7\\xea\\x0f\\x87\\x8d\\x5a\\x0d\\x0b\\x2e\\x88\\xf8\\xf0\\x99\\xf4\\x16\\x2c\\x74\\x3d\\xf9\\x7d\\x48\\x6e\\x68\\xab\\x5c\\x9b\\xed\\xd9\\xbd\\xab\\x49\\xe9\\x4a\\x9f\\xe4\\x70\\xd6\\x75\\xe8\\x31\\xc4\\xd3\\x49\\x23\\x5f\\x0a\\xcf\\x68\\xb3\\x08\\xea\\x91\\xee\\x4a\\x95\\x76\\x29\\x99\\xf9\\xed\\xa7\\x01\\x26\\x96\\x11\\x4f\\xa5\\x7f\\xa3\\xec\\xe1\\x21\\x3b\\x2b\\xbc\\xc8\\x85\\x8d\\xb4\\xee\\xd5\\x8b\\xcd\\xd1\\x94\\x55\\x04\\xd1\\x02\\x78\\xbe\\x76\\x86\\xc1\\x53\\xe0\\xf9\\xed\\xce\\x78\\x94\\xa7\\xd3\\x7c\\xc8\\x2d\\x31\\x62\\xa5\\xe5\\xe0\\x68\\x3a\\x0e\\xa3\\x5d\\xfb\\x99\\xb2\\xdf\\x62\\xf2\\xb2\\x6a\\xa0\\x59\\x2e\\xbb\\x22\\xdf\\xda\\xfb\\xc4\\x7f\\xd1\\x8a\\x1f\\xdf\\xfa\\xe1\\x0f\\x74\\xe9\\xfa\\x48\\xbd\\xa9\\x81\\x06\\x6c\\x30\\xa5\\x2a\\x77\\xd5\\xf5\\x95\\x4e\\x18\\xe6\\x16\\x93\\x28\\x6e\\xb6\\x46\\xe1\\x99\\x37\\xf2\\x1a\\x0d\\x33\\x6d\\xf0\\x12\\x3c\\x35\\x2b\\x49\\x9a\\x6d\\x11\\xf7\\xee\\x5e\\x46\\x7d\\x0f\\xf8\\xfd\\x3c\\x88\\xa2\\xd8\\xde\\x30\\x0c\\x8e\\x60\\x6f\\xe8\\x3e\\x9e\\xf2\\xb4\\x84\\x25\\x76\\x85\\xe6\\xe3\\x8f\\x3e\\xfa\\x58\\xed\\x60\\x84\\x5c\\xfc\\xbb\\xca\\x90\\xd8\\x11\\x15\\x6e\\xa0\\xc2\\xc4\\x06\\x74\\x06\\xff\\xd6\\xf0\\x2f\\x26\\xdb\\xd1\\x8e\\x5e\\x6b\\x54\\xa5\\x4c\\xf9\\x93\\x6f\\xec\\xb4\\x0b\\xf4\\x14\\xf4\\xdf\\x81\\xb3\\x82\\x5a\\x81\\x05\\x66\\x01\\x35\\xc4\\x10\\x7d\\xa2\\xe0\\x81\\x5a\\x3b\\xa7\\x0b\\x3a\\x72\\x9f\\x9c\\x1a\\xb5\\x96\\xe5\\xd5\\x4c\\x76\\x97\\x0f\\x69\\x1f\\x7e\\xcd\\x22\\x0a\\x44\\x13\\xad\\x6e\\x69\\xc8\\x87\\xb2\\x51\\x25\\x94\\x4f\\xeb\\xfd\\x3a\\xba\\xad\\xe8\\xfd\\xf7\\x15\\xbd\\x67\\x1d\\x01\\x1e\\xb3\\x80\\x3a\\xad\\xd6\\x8a\\xe2\\x7a\\xed\\x30\\x6c\\x58\\x5c\\x51\\x88\\x3e\\x75\\x5a\\x03\\xbd\\xb0\\x70\\xe4\\x5e\\x65\\x40\\xff\\x0b\\xcc\\xc7\\x94\\xdd\\x03\\xde\\xa3\\x4b\\x82\\x1a\\x73\\xec\\xc9\\x64\\x3a\\xdd\\xea\\xa5\\x5d\\x58\\xa6\\x8b\\x28\\xde\\x74\\xac\\xc7\\x3a\\x20\\xdb\\xc0\\x18\\xa3\\x74\\x4b\\x7a\\x15\\x54\\xd5\\xd1\\xfd\\xaa\\x3a\\x2e\\x0f\\xd4\\x71\\xf5\\x35\\x95\\xdc\\x1e\\xa8\\xa4\\xca\\x8b\\xf2\\xc1\\x4a\\x2e\\x02\\xb9\\x6e\\xae\\xe0\\x18\\xee\\x5a\\xc3\\x6e\\x77\\x08\\x33\\x34\\x3c\\xee\\xf7\\xe1\\x85\\x75\\x4f\\xbb\\xfd\\xc1\\xc9\\x09\\xeb\\xf4\\xad\\x5e\\xff\\xb8\\x7b\\xc2\\x4e\\x8f\\xbb\\xf0\\x3e\\x60\\xa7\\x9d\\xd3\\xe3\\x4e\\x0f\\xd6\\x5d\\xff\\xd4\\x3a\\xee\\xf5\\x2c\\x76\\xd2\\x1b\\x0c\\x8e\\x3b\\x90\\xd0\\xed\\x0d\\x4f\\x3b\\x27\\x43\\xd6\\x19\\x0c\\x86\\x9d\\xe3\\xc1\\x94\\xae\\xbc\\xce\\x81\\xaa\\xbe\\xd4\\x1b\\xe8\\xf4\\x07\\xfd\\x7e\\x5f\\x6b\\x09\\x1e\\x06\\xa7\\xc3\\xe3\\x6e\\xd1\\xa4\\x65\\x41\\x35\\xa7\\x5a\\xdb\\x98\\xc5\\x3a\\xee\\x77\\xf3\\x4e\\x74\\xba\\xa7\\x83\\xc1\\xc9\\xb0\\x53\\xf4\\xa6\\x0b\\xc9\\x1d\\xac\\x56\\x75\\xab\\x33\\xec\\xf6\\xfa\\x9d\\xd3\\x7e\\xd1\\xbf\\x9e\\x75\\xda\\x3d\\xb1\\x8e\\xb5\\x8e\\x42\\x3f\\x4e\\x06\\x27\\xa7\\xaa\\xc7\\xd0\\x72\\xbf\\x63\\x41\\x13\\x45\\xd7\\x6f\\xa1\\xeb\\x3d\\x6c\\xfc\\xf8\\x98\\x0d\\x7a\\xa7\\x90\\xed\\x94\\x1d\\x5b\\x7d\\xeb\\x18\\x7e\\x3b\\x56\\x77\\xd8\\xef\\x42\\x3d\\xc3\\x41\\xe7\\xd4\\x3a\\x3d\\x66\\xa7\\xdd\\xce\\x70\\x00\\x2d\\x76\\x3a\\xa7\\x9d\\x41\\xa7\\x03\\xf5\\x41\\xd3\\xc3\\x61\\x6f\\x08\\x5f\\xac\\xee\\xe9\\x69\\x0f\\x9a\\xee\\x77\\x87\\x27\\x16\\xb6\\x08\\x1d\\x80\\x0e\\xe3\\x03\\x94\\xed\\x75\\xd9\\xc9\\x70\\x38\\xec\\x0c\\xe1\\x0b\\x14\\x1a\\xc2\\x20\\x70\\xf4\\xfd\\xd3\\x61\\xbf\\x87\\x59\\x8e\\x8f\\x7b\\x00\\x20\\xe8\\xfc\\xf1\\xf0\\x04\\x12\\xac\\x93\\x5e\\xbf\\xd7\\xed\\x63\\xfd\\xdd\\x93\\x01\\x56\\x07\\x80\\x3b\\x1d\\x0e\\xfa\\x45\\xc7\\x2f\\xb0\\xe3\\xdd\\x7e\\x1f\\x60\\x01\\x1d\\x46\\x00\\x58\\x38\\x3c\\x6b\\x38\\xec\\x62\\xbf\\x2c\\xf8\\x86\\x60\\x83\\xc2\\x03\\x6b\\x00\\x55\\x62\\xe3\\xc7\\xc3\\x3e\\x3e\\x74\\x07\\xdd\\xc1\\x29\\x3e\\xf4\\xfa\\x30\\x11\\xac\\xd7\\x1d\\xf4\\xac\\xe3\\x21\\x3b\\x1e\\x0e\\xba\\xfd\\x63\\xac\\x65\\x68\\x1d\\x5b\\x16\\x94\\xe9\\x75\\x2c\\xa8\\xa0\\x0f\\x5f\\x4e\\xa1\\x1f\\x88\\x8a\\x7a\\xa7\\x50\\x6b\\x57\\x40\\x18\\x7b\\xdc\\xe9\\xf7\\x00\\x42\\xa7\\x1d\\x04\\x51\\x0f\\xa0\\xc8\\x4e\\x4f\\x86\\x27\\xd0\\x22\\x02\\xa2\\xd7\\x3f\\x01\\xa0\\x76\\xfa\\xdd\\xe3\\x63\\xeb\\xa4\\x93\\xf7\\xbc\\xc0\\x2e\\x40\\x00\\x86\\xa9\\x5f\\x69\\x2c\\x1f\\x46\\xb8\\xc7\\x27\\x25\\x74\\x22\\xb2\\x7f\\xae\\x0c\\xbe\\x10\\x19\\x56\\x15\\x06\\x4a\\x97\\xb1\\x97\\x2c\\xa3\\x60\\x56\\xa5\\xd0\\x0e\\x4d\\xb4\\x06\\xd3\\xfd\\x42\\xfe\\x0c\\xb0\\x51\\xc9\\x12\\xa8\\xd0\\xd5\\x8d\\x0c\\x3d\\xfb\\xcd\\x42\\xda\\xfe\\xc3\\x13\\x90\\xf4\\x87\\x03\\x56\\x88\\x93\\x38\\xe7\\xac\\x2c\\xd6\\xf0\\x0e\\x85\\x62\\x0c\\x4a\\xd9\\x0e\\xe8\\x44\\xa2\\x00\\x22\\xaa\\xfe\\xd4\\x7c\\xef\\x90\\xb1\\xe3\\xc1\\x8f\\x52\\x2d\\x92\\xb4\\x21\\x51\\x46\\xbb\\xe0\\xc9\\xd9\\x7c\\x6c\\xd9\\x1d\\x72\\x27\\x75\\x16\\xd0\\x1d\\x0b\\x86\\x81\\x01\\x0a\\x92\\xaf\\x81\\xf2\\x3f\\xe3\\x1f\\x1c\\x33\\x3f\\xb6\\x03\\xb6\\x30\\x1b\\x06\\x79\\xe7\\x63\\x9d\\xe6\\xc2\\xb4\\x6b\\x35\\xb3\\x51\\xfb\\xab\\x26\\x54\\xdc\\x0a\\x57\\x55\\x68\\xa0\\xc9\\x2e\\xd9\\x2d\\xbb\\x60\\xd7\\xec\\x35\\x9c\\xda\\x2f\\xe0\\xdf\\x5b\\x64\\xb9\\xd1\\xb6\\x71\\xc5\\x8d\\x86\\x5b\\xdd\\x47\\x54\\x50\\x6e\\x77\\x4d\\x72\\xf3\\xe4\\x03\\x49\\x7b\\x1d\\x14\\x57\\x99\\x46\\x58\\x0f\\x1b\\x41\\x3d\\x30\\xed\\xc6\\x01\\x6d\\x4d\\x86\\x52\\x8c\\x17\\x75\\xe0\\x44\\x01\\x94\\x28\\xd6\\xe6\\x69\\x6a\\xcc\\xda\\x41\\x3d\\x0f\\x6a\\xb0\\x42\\x57\\xa8\\xa8\\x56\\xfd\\x5a\\x7c\\x0a\\xcb\\x9f\\xf0\\xaa\\xea\\x1e\\x18\\xa5\\x7a\\x1e\\xb6\\x2a\\x69\\xbc\\x30\\xd9\\x39\\xd7\\xaa\\xa0\\x94\\x3b\\x3d\\xcf\\xbc\\x09\\x29\\x57\\x7a\\x1e\\x4c\\x21\\x98\\xbc\\x2c\\xc1\\x1b\\x88\\xb7\\x17\\xe6\\x73\\xfe\\xc9\\x51\\x10\\x7f\\x71\\x74\\x94\\x44\\x86\\x04\\x98\\x89\\x12\\xa1\\xff\\xbc\\x14\\x0b\\xe6\\x33\\x10\\xff\\x0d\\x94\\x74\\x8e\\x4a\\xdd\\xf9\\xbc\\xd3\\x99\\xcf\\xd8\\x95\\x2b\\xa2\\xae\\xa5\\x73\\x4f\\x60\\x3c\\x85\\x1a\\x00\\x1c\\xf1\\x97\\x3c\\xd4\\x7b\\xf9\\x1a\\x30\\x1e\\x0f\\xf5\\x5e\\x42\\xca\\x85\\x9e\\x27\\x69\\x40\\xca\\xb5\\x9e\\x07\\x53\\x68\\x24\\x9f\\x8a\\x91\\x24\\xcd\\x79\\xa3\\x5b\\x7f\\x5d\\x1a\\xc9\\x6b\\x1a\\x89\\x9c\\x72\\x1c\\x09\\x2c\\x8f\\xff\\x7c\\x12\\x63\\x79\\x93\\x8f\\xa5\\xd4\\xa1\\x37\\x3b\\xdd\\x79\\x83\\x9d\\xb9\\xd6\\xc7\\x72\\xc9\\x6f\\xc5\\x58\\x94\\xf9\\x6d\\x49\\x9d\\x37\\x00\\x7a\\xa5\\xdd\\x65\\x8d\\x43\\xe1\\x54\\xcc\\xb3\\x16\\x9c\\x35\\xd0\\x05\\x1e\\x9c\\x85\\xff\\x59\\x50\\x4f\\xb1\\x3b\\x1f\\x24\\x77\\x75\\x31\\x9e\\x40\\x7f\\xa7\\xd2\\xb7\\xd2\\xdd\\x78\\x02\\xf3\\x30\\xb5\\xdf\\xc4\\x06\\x3d\\xb0\\x09\\x0c\\x04\\xfe\\xc2\\xc4\\xc0\\x5f\\xcc\\x68\\xb2\\xf7\\x7c\\xd3\\xfc\\x80\\xec\\xf4\\x2b\\x7e\\x0e\\x0f\\x40\\x0f\\xbe\\xe3\\x77\\x22\\xe5\\x57\\x7e\\x25\\x52\\xfe\\xe6\\x9d\\x22\\x86\\x46\\x11\\x65\\xc3\\x78\\x5f\\x7f\\xd7\\x78\\x55\\xff\\xd5\\x6c\\x6b\\x41\\xcf\\xde\\xd7\\xdf\\x43\\xda\\x2b\\x53\\xa3\\xef\\xdf\\x41\\xb6\\x5f\\x21\\x1b\\xde\\x94\\x9b\\xec\\x3b\\xcd\\xea\\x18\\x9b\\xa9\\xe3\\x9f\\x06\\xb6\\x53\\xff\\x40\\x4a\\x8b\\xb9\\x03\\x97\\x3b\\x01\\xea\\x1f\\x0a\\x38\\xad\\x19\\x40\\xe8\\x3b\\x68\\xef\\xef\\x46\\x07\\x16\\xf6\\xcf\\x7c\\x1e\\x19\\xe5\\x81\\xcb\\x11\\xd2\\x68\\x03\\xf6\\x03\\x7a\\x35\\xfb\\x11\\x73\\x69\\x63\\x96\\xe9\\xa3\\x35\\xcc\\xe8\\x0f\\xe3\\xb7\\x42\\x00\\x56\\x3b\\xaf\\xb1\\x9f\\x71\\xd0\\xb5\\x17\\x35\\xf8\\x5c\\x63\\xf4\\xf7\\x1b\\xeb\\x1b\\x0b\\x9e\\x6e\\xe0\\x09\\x3f\\x77\\xc4\\xe7\\x80\\x3e\\x07\\xf4\\xb9\\x86\\x38\\xe3\\x3f\\xb0\\x4c\\x7e\\x96\\xce\\xb5\\x7e\\x96\\xe1\\x9e\\x7e\\x94\\xef\\x3f\\x2a\\x4f\\x5b\\x58\\x66\\x41\\x15\\xfd\\xa8\\x2a\\xaa\\x6e\\xe7\\x47\\xbc\\x99\\xb3\\xbf\\xd4\\xaf\\x4e\\x39\\xbf\\x58\\x5c\\x5a\\xa1\\x0d\\xe5\\x3d\\xd7\\xc0\\x79\\x21\\xc0\\xf9\\x67\\x09\\x9c\\xa1\\x00\\x67\\x13\\xc1\\xf9\\x17\\x01\\x4a\\x5b\\x28\\x21\\x6b\\xfe\\x89\\x10\\xfc\\x8d\\x3e\\x10\\xec\\xca\\x0b\\x4b\\x40\\x55\\x66\\x23\\x80\\xfe\\x99\\x03\\xf4\\x4d\\x8d\\xfd\\xa6\\x3a\\xfe\\x27\\x75\\xe6\\xcf\\x9d\\x81\\xfe\\xa6\\xe0\\x10\\xd2\\xe7\\x50\\x02\\x94\\xc0\\xf9\\x9b\\x04\\xdf\\x6f\\x12\\x9c\\x7f\\xc9\\xf7\\xbf\\x74\\x70\\x02\\xe8\\xa9\\xa2\\xbf\\x54\\x45\\xd5\\xed\\xfc\\x55\\x02\\xe8\\x97\\xfb\\xf5\\xd7\\x3e\\x40\\xa1\\xd0\\x25\\xe5\\xbd\\x3d\\x0c\\x69\\x29\\x32\\xbd\\x3b\\x3a\\x52\\x1f\\xf7\\xd6\\xca\\x4b\\x6d\\x15\\xdc\\xd1\\xf3\\x95\\xc9\\x2a\\xda\\x90\\x55\\x5d\\x94\\xaa\\x2a\\x43\\xe9\\x53\\x09\\x02\\x17\\xf4\\x76\\x9d\\x73\\x8b\\xaa\\xd8\\x5f\\x35\\xac\\xff\\xef\\x08\\x26\\x1b\\x8e\\xb5\\xd2\\xb5\\x7e\\xa1\\xef\\x59\\x3b\\x87\\xb1\\x37\\xc2\\x06\\x34\\x82\\x7f\\xc5\\xb3\\x58\\x62\\x8d\\x14\\x9f\\xe0\\xb7\\xf9\\xf8\\x67\\x19\\x20\\x99\\xfb\\x11\\x5e\\xcb\\x46\\xe8\\xde\\x38\\x62\\x3e\\x1c\\x75\\xe8\\x65\\x18\\x65\\x6b\\x6e\\x84\\x4e\\xf6\\xa2\\xe2\\x2a\\xc8\\x0f\\x43\\x2f\\xfe\\x9a\\xf8\\xb9\\x5e\\xa1\\x15\\xe5\\x49\\xad\\xda\\xaf\\xab\\x60\\x57\\xad\\xca\\x8d\\xe2\\xaf\\xec\\x42\\xc6\\xcb\\xfa\\x52\\x6b\\x67\\xf6\\x35\\xc5\\x7d\\x9e\\xd2\\xe9\\x7f\\x1d\\x14\\x7a\\x57\\xfe\\x7f\\xa3\\xfd\\x1f\\x15\\xfd\\x88\\xbe\\xde\\x02\\xc0\\x29\\x4a\\x3b\\x5f\\x6f\\x05\\xe0\\x16\\xa5\\x0f\\x44\\xb0\\x56\\xd4\\xa1\\x71\\x88\\x26\\x6c\\x7c\\x73\\x90\\x0c\\x44\\xcd\\x27\\x28\\x78\\x80\\x14\\x84\\x82\\x87\\x22\\x7e\\xb7\\xbb\\x40\\x0a\\xca\\xd5\\x35\\xc9\\x8f\\xe3\\xd4\\xac\\x87\\x4c\\x8b\\xfe\\x44\\x91\\x27\\xa4\\x6e\\xf5\\x75\\xc0\\x6b\\x4e\\x96\\x46\\xb5\\x91\\xa4\\x77\\xab\\x43\\x30\\x7e\\xb3\\x04\\x62\\x46\\xf2\\x9d\\xaf\\xf7\\xdc\\xdc\\x2d\\x22\\x56\\x13\\x8f\\x4d\\x37\\x88\\x12\\x6f\\x56\\xb3\\xd7\\x11\\xc3\\x18\\x7d\\xf6\\x0d\\x7c\\xc2\\x87\\xe6\\x95\\x37\\x8f\\x62\\xaf\\x66\\xaf\\x54\\x82\\x33\\x87\\x95\\x5b\\xb3\\x37\\x11\\xbb\\x72\\x12\\x3f\\xb1\\x2f\\xe0\\x03\\x3d\\x35\\xa3\\xb5\\x17\\xd6\\xec\\xeb\\xfc\\x5d\\xd5\\xf9\\x1a\\xb2\\x92\\x1b\\x2e\\xfb\\x05\\xec\\x23\\x47\\xf0\\xc5\\xf6\\x15\\xe4\\x53\\x2f\\xb2\\xe8\\xb9\\x9e\\xa4\\x4a\\xdf\\x45\\x6c\\x15\\x85\\x51\\x1a\\x85\\x9e\\xfd\\x21\\xda\\x9a\\xa3\\xd7\\xc1\\x01\\x2f\\x54\\x69\\xeb\\xda\\xdb\\x50\\xdc\\x03\\x51\\x96\\xb7\\x65\\x25\\xff\\x90\\x0e\\x07\\xf3\\xab\\xec\\x17\\x01\\x46\\xa0\\xed\\xb6\\x81\\xa9\\x82\\x7f\\x80\\x4e\\xdf\\x52\\x02\\xbe\\x74\\x45\\xc2\\x4b\\x99\\x30\\x94\\xb9\\x86\\x53\\x1d\\xd0\\xa4\\x4b\\x56\\x96\\x86\\x88\\x55\\x03\\xe0\\x7e\\x1f\\x15\\xa2\\x42\\xa5\\x73\\x86\\xbe\\x6d\\xa4\\xb5\\x66\\x48\\xbe\\x61\\x44\\xd0\\x5a\\xf4\\x73\\x93\\x27\\x6f\\x50\\x0b\\x71\\x15\\x29\\x8d\\x70\\x0e\\x00\\xde\\x14\\x6f\\x00\\xfe\\x9c\\xb1\\xa9\\x0c\\x35\\xf6\\x8a\\x26\\x5a\\xcf\\x74\\xb0\\x93\\xaf\\x9e\\xd8\\x49\\x1d\\xc9\\x41\\x8a\\xa5\\x7d\\xb5\\x76\\x50\\x18\\x24\\x75\\xb4\\xcf\\x9d\\x83\\x43\\xd4\\xb1\\x05\\x24\\x68\\x75\\x6e\\x2c\\x1d\\x17\\xc0\\xbb\\x56\\x21\\x3c\\x87\\xf9\\xd8\\x1e\\xf3\\xb1\\x16\\x16\\x2e\\xde\\x53\\xb1\\xcb\\x7c\\x16\\x92\\x97\\x62\\xf5\\x1e\\xd1\\xfb\\x48\\x9d\\x1d\\x35\\xe0\\x7b\\xd6\\x56\\x23\\x36\\xdc\\x56\\xcc\\xe0\\xb1\\x83\\x37\\x89\\x9d\\x26\\xfc\\xb1\\x80\\xaf\\xf2\\x0c\\x17\\xf8\\x8f\\x71\\xa6\\x7f\\xa5\\x07\\x0b\\x70\\x68\\x91\\x18\\xc0\\x43\\x80\\x89\\x50\\x8f\\x7c\\xc6\\x44\\xa8\\x27\\xa0\\x7a\\xb2\\x22\\x35\\x2f\\x4f\\x5c\\xda\\xce\\x91\\xa6\\xdd\\xde\\xf1\\x92\\xc9\\x10\\xfa\\xbd\\x57\\xef\\x19\\xa3\\x98\\x4f\\xae\\xfe\\x8e\\x8c\\x24\\xda\\x14\\x95\\x93\\xe4\\x20\\xef\\x63\\xdb\\x67\\x8e\\x65\\xc3\\x41\\xd6\\xb1\\x13\\xb6\\xb6\\xec\\x89\\x5f\\xd0\\xfc\\x11\\x54\\x5e\\x50\\xfc\\x91\\x39\\x65\\xeb\\x4e\\x29\\x43\\x52\\xca\\x40\\x21\\x19\\x75\\xcd\\x32\\xcd\\xf0\\x02\\xe6\\xdc\\xe2\\xd0\\x71\\xc7\\xa2\\x28\\x2c\\x1d\\x7a\\xee\\xec\\xdc\\x9f\\x16\\xf6\\x4c\\xbb\\x27\\x72\\x0d\\x10\\xa4\\xe1\\x9d\\x7d\\x72\\x00\\x34\\xac\\x03\\xaf\\x69\\xe5\\xe5\\xa6\\x2c\\xfc\\x0b\\x9c\\xdc\\x58\\x46\\xb8\\x88\\xf0\\x31\\x38\\x64\\xc4\\x37\\x31\\x1c\\xd6\\xef\\xf0\\xb0\\x86\\x63\\x3b\\x80\\x63\\x7b\\x6f\\x91\\xff\\x57\\x67\\xcc\\x6e\\x08\\xc8\\xc7\\x8f\\xc9\\xf2\\xe9\\xf8\\x35\\x81\\x1e\\x77\\x4f\\xc6\\xaf\\x3d\\x59\\x77\\x4f\\xb7\\xaf\\x3b\\x59\\x83\\xa2\\x74\\xb0\\xd5\\xf6\\x1b\\x20\\x91\\x45\\xb4\\x23\\xfb\\xad\\xd2\\x4b\\xf5\\x77\\xb4\\x94\\x50\\x01\\x6e\\x47\\x4d\\x3a\\xc3\\x2b\\x7f\\xc3\\x6f\\x6d\\xe0\\x8c\\xdc\\xe0\\x71\\xe9\\xf2\\x89\\xcf\\xee\\xef\\x6c\\x1f\\x10\\xce\\x06\\x81\\x7d\\x8f\\x57\\xf4\\xf2\\x39\\xca\\xaf\\x50\\x5d\\x2e\\xe2\\x31\\xc0\\xca\\xa7\\x2d\\x8b\\x3c\\x57\\xed\\xff\\x4f\\xdb\\xd5\\x38\\xb5\\xad\\x2b\\xfb\\x7f\\xa5\\x78\\x2e\\x8c\\xdd\\x38\\x21\\x90\\x53\\x7a\\x6f\\xa8\\xc9\\xf4\\xd0\\x76\\xe8\\xb9\\xd0\\xf6\\x95\\x94\\x7e\\x30\\x39\\x8c\\x49\\x1c\\xe2\\xd6\\xb1\\x53\\x7f\\x00\\x29\\xe1\\x7f\\x7f\\xfb\\x5b\\x49\\xb6\\xec\\x38\\x9c\\xd0\\x79\\x6f\\xce\\x29\\xb1\\xbe\\x77\\xa5\\xd5\\x6a\\x25\\xad\\x76\\x0f\\xf1\\xb1\\x43\\x1f\\x4f\\xf0\\xb1\\xab\\x3e\\x3a\\x03\\xa9\\xf6\\x33\\xc5\\x03\\xc9\\x39\\xb4\\xe0\\x3f\\x45\\xfa\\x0b\\xf5\\xf5\\xdd\\x79\\xa6\\xd2\\xd3\\x9a\\x52\\xf4\\x7d\\xcc\\x58\\x56\\x05\\x3e\\xcd\\x91\\xfe\\x9a\\xf2\\x5e\\xfe\\x46\\x72\\x69\\x24\\x56\\x72\\xf6\\x4a\\x3e\\x13\\xae\\x3e\\x3e\\x45\\x42\\xd5\\x33\\x6f\\xbf\\xe8\\x8b\\x3a\\x98\\x1e\\xb8\\xc4\\xf3\\xcc\\xef\\x11\\x34\\xa3\\x2d\\x4d\\x67\\x1e\\xcd\\x25\\xf3\\xe9\\x65\\xb4\\x9a\\x3c\\xf2\\x39\\x6b\\xfe\\x92\\xcf\\xd8\\x4a\\x34\\x11\\x5b\\xd6\\x62\\xf1\\x3e\\xb2\\x4c\\xaf\\x1a\\x2d\\xc7\\xf1\\x08\\x08\\xbc\\xd1\\x86\\x90\\x7d\\x21\\xfd\\xd6\\x00\\xae\\xaf\\x85\\x55\\x19\\x3e\\x21\\x41\\xfd\\x2a\\x24\\x28\\x69\\xab\\xf7\\x3d\\xf1\\x9a\\x38\\x4a\\xea\\xae\\xe0\\xb4\\x53\\xb2\\xed\\x67\\x85\\x46\\x1c\\xe8\\xb7\\xd9\\x79\\x9a\\x32\\xe3\\x6b\\xd2\\xcf\\x91\\xf8\\x39\\x53\\xd1\\x47\\xbc\\x2f\\x39\\xcb\\x13\\x39\\xf2\\x8c\\x23\\xf3\\x24\\x95\\xb1\\xa9\\x27\\x89\\xe2\\xb4\\xa8\\xd8\\x34\\xfe\\x24\\x32\\xd5\\x3c\\x12\\x2a\\x01\\x65\\xee\\x3e\\x3d\\x0e\\xd8\\x0f\\x51\\x4a\\x1f\\xfb\\xfa\\x6e\\x0a\\xf5\\x1e\\x1b\\x0d\\x8f\\x80\\xe4\\xad\\x25\\xef\\x94\\x28\\x9a\\x23\\xd0\\x02\\x6b\\x0b\\xd4\\xbc\\xeb\\xd2\\x1b\\xa8\\xe0\\x5c\\x60\\x7c\\xcc\\xf5\\xc9\\xc0\\x13\\x15\\x90\\x4d\\xe4\\x01\\x34\\x63\\x28\\xe7\\x0a\\xcd\\x51\\x74\\x13\\xd6\\xbc\\x1c\\x2c\\x21\\xf4\\x33\\x10\\xc8\\xfc\\x0c\\xb4\\x96\\x01\\xbd\\xa7\\xb7\\xe9\\xe9\\xed\\x20\\x54\\x6e\\x28\\x9b\\xfd\\x76\\x33\\x4d\\xbd\\x9d\\x52\\x33\\xa2\\x15\\xf1\\xb2\\xa9\\x98\\x31\\x7d\\xa2\\xe3\\xc4\\xa1\\x49\\x41\\x62\\x6b\\x62\\xca\\x43\\xbd\\x40\\x6b\\xab\\x63\\xd9\\xc7\\x32\\x0c\\x17\\x9b\\x9d\\x36\\x7c\\xec\\xee\\x5f\\x48\\xdb\\xc1\\xfe\\xd2\\xc4\\x2d\\x79\\xa0\\x73\\xfa\\xc1\\x62\\xd1\\x68\\x7c\\x0a\\x68\\x3b\\xfb\\x25\\x82\\x67\\x1c\\xb6\\xb7\\x13\\x39\\x1f\\x29\\xfe\\x0e\\x96\\xa7\\xba\\xaf\\xdc\\xd4\\x6b\\x85\\xb8\\xf6\\xb3\\x61\\xdb\\xb9\\x7b\\x9a\\x41\\xe4\\x72\\xe7\\x30\\xbb\\x9b\\x09\\x4d\\xc7\\xee\\xee\\xb3\\xf6\\xbd\\xb0\\xe8\\x34\\xd4\\xdd\\xd7\\xb1\\x51\\xa7\\xe1\\xbe\\x75\\xe7\\x4b\\x03\\xb3\\x54\\xb7\\x50\\x8a\\x93\\x26\\x15\\xe1\\xa3\\xce\\x85\\xaa\\x09\\x95\\x1c\\xe7\\x4f\\xaa\\xa8\\x58\\xf2\\x62\\xcc\\xfa\\x50\\xc1\\x79\\x32\\xb0\\xb6\\xb6\\xfe\\x15\\x99\\x1e\\xbb\\x93\\x60\\x4b\\x77\\xa9\\x7a\\x65\\xa9\\x74\\x91\\xbf\\x46\\xec\\xe8\\x1a\\xe6\\x10\\x2e\\xa4\\xf1\\xdf\\x38\\x9b\\xd5\\x5a\\x98\\x17\\x8e\\xd3\\xb0\\x2d\\x50\\xb6\\xdc\\x5f\\x05\\xdd\\xb7\\x91\\xc9\\xc8\\x5b\\x72\\x13\\xd4\\x0f\\xec\\x8f\\x81\\xfd\\x2a\\x70\\x44\\x02\\x91\\xff\\x07\\x7e\\x1b\\xfa\\x09\\x9a\\xb4\\x1f\\x84\\x04\\xe5\\x5c\\x08\\x61\\x8b\\x92\\x5a\\xde\\x74\\x96\\xce\\x11\\xc1\\x1f\\x88\\x81\\x0a\\x26\\x22\\xf0\\x8b\\x30\\xf3\\x94\\x0b\\x61\\x84\\x2e\\x37\\x13\\x5d\\x1d\\x1b\\x5d\\x4a\\x82\\x70\\x54\\x64\\xea\\xf5\\x83\\x9e\\x1e\\x66\\x07\\xe7\\x5d\\xd0\\x09\\x09\\xbf\\x92\\x9f\\xea\\xc9\\xd2\\xc9\\x48\\x11\\xa3\\xf9\\x87\\xfb\\xc0\\x20\\x8b\\x82\\xce\\xaa\\x17\\x82\\xdc\\x4d\\xfe\\x08\\x2f\\x1a\\xf0\\x15\\xba\\x53\\x2f\\x99\\xb9\\x43\\x8f\\xdf\\x8a\\xee\\x87\\xce\\x3b\\x28\\x0a\\xa8\\x81\\x7c\\x60\\xe0\\xa3\\xdf\\x1b\\xf8\\x58\\x0d\\xbc\\x99\\xeb\\xfa\\xc4\\xd0\\xf8\\xbf\\x80\\x7d\\x84\\x8b\\x0b\\x22\\x05\\xd7\\xb2\\x7a\\xa6\\xa1\\x22\\x0c\\x5f\\xd8\\x64\\xf1\\xf2\\x2c\\x4e\\x91\\xdb\\xb2\\x25\\xf9\\x30\\x8d\\x9c\\xfb\\x03\\xe8\\x9d\\x16\\x44\\x44\\x5c\\x5f\\x3e\\x95\\x83\\x6a\\xaf\\x46\\x52\\x70\\xac\\x93\\xc1\\xf0\\xb5\\xea\\xad\\x97\\x15\\x77\\xac\\x95\\x47\\xaa\\x79\\xa7\\xb9\\xd5\\x4e\\x1b\\x8a\\x4e\\x3b\\xd4\\x3b\\x0d\\x06\\x52\\xa4\\x57\\xc7\\x02\\xfb\\xe0\\x45\\x52\\xbc\\x27\\x19\\x4b\\x97\\x8f\\x03\\xb6\\x7a\\xac\\xbd\\x33\\x64\\xa3\\xc1\\x57\\x6c\\x96\\x28\\x76\\xc6\\xe7\\x93\\x01\\x4d\\x30\\x27\\x86\\xb1\\xb4\\x68\\x60\\xd7\\x77\\xd8\\x84\\x76\\x28\\xf6\\xb0\\x6e\\x30\\x66\\xa8\\xfb\\x3a\\xb7\\x9e\\x82\\x47\\xfb\\x2f\\xae\\x69\\x08\\x32\\xc7\\x3b\\x9f\\xc9\\xb9\\x97\\xd9\\x33\\x1b\\xfe\\xe6\\xfd\\xbc\\xdb\\x32\\xbd\\xa3\\x86\\x48\\x14\\x1d\\x25\\xfc\\x39\\xad\\x24\\x2b\\xea\\x86\\x42\\x27\\x6a\\x23\\x57\\x88\\x62\\xad\\x9c\\xf7\\x98\\x80\\x39\\x58\\xc2\\xb5\\xa7\\xde\\x3b\\xd1\\x81\\xbf\\xef\\x37\\x1a\\xd6\\x5d\\x56\\x87\\x86\\xf0\\x49\\xca\\x8f\\x25\\xf9\\x21\\x73\\x8e\\x0f\\xec\\xdc\\xb9\\x54\\x0c\\x0e\\xea\\xa8\\x8b\\xd8\\x51\\xe5\\x72\\xff\\xb8\\x36\\xde\\x42\\xa4\\xf9\\xe3\\xe5\\x02\\xb9\\xcc\\xae\\x0c\\xa6\\x1c\\x65\\x81\\x6f\\x7a\\xe3\\x79\\xd5\\x29\\x5c\\x80\\x03\\x62\\x88\\x2b\\xc4\\xb0\\xbf\\x42\\x9a\\x78\\xb1\\x2b\\x1c\\x3c\\x82\\x63\\x98\\x96\\x78\\x29\\x2c\\xaa\\x67\\x71\\x88\\x44\\x8c\\xaf\\x52\\xea\\x91\\x6f\\x05\\x75\\x09\\x25\\x2d\\xe5\\x17\\x0e\\x02\\xc1\\x04\\x8a\\x45\\x8a\\xc4\\xef\\xac\\x94\\x29\\xf1\\xc4\\x01\\xe9\\xbd\\x40\\xc4\\x4d\\xd3\\xb8\\x82\\x87\\xb6\\x81\\xa3\\x16\\xd8\\x5e\\x3b\\x57\\x5c\\x18\\x9b\\x77\\x4b\\xaf\\x6b\\xea\\x33\\xbd\\x3b\\x85\\x73\\x60\\xee\\x39\\xb7\\x15\\x44\\xd4\\xf5\\x56\\x69\\xc7\\x56\\xb0\\x3c\\xc9\\x8f\\xbd\\xae\\x19\\x36\\x1c\\xc3\\xa8\\xea\\x68\\xa5\\xca\\xef\\xec\\x95\\x6e\\xef\\xde\\x2d\\xde\\x35\\xc1\\x58\\x30\\xab\\x7a\\x61\\xb6\\x87\\x56\\xe9\\xb5\\x83\\x30\\x22\\x5f\\x2a\\x68\\xa7\\xec\\xb5\\x00\\xff\\x95\\x5f\\xb2\\x54\\xe0\\x89\\x1f\\x03\\x4f\\x0d\\xb6\\xbf\\x07\\xdf\\x72\\x45\\x1a\\xbc\\x78\\xf0\\xb9\\x44\\x3e\\xf2\\x8d\\xf6\\x13\\x62\\x85\\xa1\\x25\\xdc\\xdc\\x52\\x65\\x50\\x62\\x84\\xdd\\x99\\x7d\\x6d\\xfd\\x93\\x0f\\x72\\x34\\x57\\x01\\xc0\\xf3\\x28\\xeb\\x4e\\x33\\xa1\\x22\\x1a\\x26\\xb8\\xb8\\x0f\\xfc\\xf1\\x5c\\xd3\\x07\\xfb\\x16\\x09\\xfa\\x33\\x50\\x6d\\x8b\\xf6\\xe3\\xb4\\xd7\\x96\\xa0\\xf5\\xfc\\x6e\\x56\\x90\\x51\\xbf\\x66\\x4e\\x94\\x0e\\x03\\x3c\\x4d\\x03\\x5c\\x13\\xe6\\xe5\\xd4\\x2a\\x0d\\x6f\\xa6\\xe9\\x3b\\x6f\\x6d\\x3d\\x3c\\xa2\\xc4\\xdc\\x85\\x1f\\x8a\\xd2\\x59\\xc2\\xfa\\x8d\\x51\\x97\\x67\\xb2\\xcb\\x33\\x39\\x76\\x6b\\x37\\xbe\\x5c\\x56\\x01\\x23\\x0f\\x6a\\x56\\x74\\xaa\\x70\\x90\\x80\\x0e\\x33\\x8b\\x7e\\x95\\x35\\x10\\xe5\\x79\\x72\\xf9\\x49\\xe7\\x41\\xc9\\x49\\x98\\x70\\x47\\x57\\xcc\\x22\\x05\\x11\\xf2\\xc9\\x09\\xf8\\x21\\x8e\\x66\\x5e\\x9c\\xa2\\x31\\x9d\\xbe\\xbd\\x0a\\x7d\\x7b\\xbd\\xac\\x6b\\x7a\\x75\\xf4\\xcd\\xcf\\x19\\x85\\xf7\\x61\\x74\\xd3\\x61\\x34\\x9d\\x11\\xa2\\xa3\\x53\\xb4\\x51\\x70\\x22\\x4e\\x53\\x6d\\x9d\\x89\\x27\\x32\\x39\\x76\\xfe\\x06\\x3b\\x61\\xa1\\xb5\\x64\\x0a\\x65\\x4e\\xcf\\x2a\\x19\\x41\\xd3\\x40\\x4e\\x8a\\x3a\\x70\\x54\\xc0\\x86\\xe6\\x04\\xa9\\x0b\\x52\\x5d\\x52\\xee\\xa4\\x19\\xd0\\x39\\x88\\xf8\\x5d\\x9e\\x72\\x28\\x53\\x2c\\x27\\xd6\\xdd\\xee\\x41\\xc4\\xb2\\x83\\x61\\x88\\x15\\x22\\xd6\\x66\\x05\\xb7\\x48\\xdc\\x9f\\xbd\\xe4\\x79\\xe5\\x89\\x11\\x53\\x89\\xfb\\x2a\\xbd\\x0b\\x10\\x31\\x30\\x1e\\x3b\\xee\\x51\\x03\\xb2\\x44\\xe7\\xd5\\x51\\xc9\\xea\\x1f\\x82\\x43\\x58\\xf8\\xcd\\x8e\\xcd\\xa1\\x8d\\x34\\x7a\\x7c\\xa8\\x2b\\x23\\xd9\\x95\\xf7\\xab\\x56\\x9d\\x0e\\x4c\\x7a\\xa2\\x9f\\x6c\\x9d\\x14\\x0b\\x94\\xe5\\xbc\\x4e\\xbd\\xdb\\x5a\\x71\\x3a\\xef\\x24\\x64\\xc0\\xcd\\xdd\\x99\\x14\\x04\\x04\\x11\\xd6\\x1c\\x3e\\xd4\\x2e\\x86\\x85\\x54\\x0e\\x5b\\xe2\\x9a\\xdc\\xba\\xcc\\x75\\xd9\\x17\\xee\\x79\\x38\\x68\\x0d\\xa3\\x2c\\x4c\\x5f\\xec\\x32\\x47\\xe5\\xf2\\xe2\\x0d\\xe6\\x3b\\x5a\\x3f\\x79\\x29\\x17\\x10\\x1c\\xe2\\x89\\x89\\xe8\\x6c\\xb9\\xd2\\xad\\x70\\x50\\xa3\\xd6\\x6b\\x6f\\xdd\\xf5\\x7a\\xa7\\xb4\\x5e\\x7b\\x03\\xe2\\xb2\\x5c\\x77\\xd7\\x5c\\x29\\xe2\\x48\\xf7\\x38\\x75\\xda\\xbc\\x96\\x2d\\x97\\xf7\\x1c\\x32\\x9c\\x88\\x68\\xd5\\xc2\\x1a\\xb0\\x40\\x80\\x77\\x5f\\xff\\x5f\\x18\\x88\\xad\\x9d\\x84\\xa5\\xd6\\x9a\\x73\\x01\\xa0\\xcd\\x04\\x1e\\xeb\\x25\\x9d\\x46\\x9d\\x74\\x85\\x7c\\xf7\\x5d\\x61\\x04\\xb9\\x0e\\x3f\\x51\\xb4\\x40\\x30\\xab\\x3e\\xa0\\xfb\\x3f\\xc6\\x51\\x6d\\x5b\\x7f\\x0b\\x4d\\x05\\x5c\\xae\\xf2\\x85\\x7b\\x8c\\x7a\\x9c\\x05\\xd2\\x7a\\x46\\xab\\x1e\\x7f\\x55\\x67\\xde\\x05\\x98\\x0b\\x8f\\x13\\x2b\\x57\\xc8\\x04\\x62\\xf9\\xa1\\xdd\\xac\\x4f\\x5b\\xfd\\xfd\\x34\\x9e\\xdf\\xf5\\x03\\xc7\\x5b\\x22\\xb6\\x54\\x20\\xf9\\x91\\xb6\\x66\\x42\\x4a\\x54\\x38\\xe1\\x81\\x45\\x79\\x1c\\x69\\x39\\xc1\\xd5\\x5b\\x30\\x47\\xee\\xcc\\xa6\\xea\\x7c\\xa9\\xf7\\x53\\xad\\x34\\x3f\\xf2\\x95\\x92\\xe7\\xbe\\xe9\\x0b\\x4f\\x07\\x8b\\x85\\xfa\\xaa\\xf7\\x68\\xc0\\xfe\\x04\\x8c\\x7c\\x1f\\x6f\\xd0\\xc6\\xbc\\x25\\xbb\\xe1\\xbe\\xcc\\xb0\\x99\\x37\\xd5\\xec\\xa5\\x4b\\x9e\\xe1\\x97\\xf6\\xb4\\x7c\\xe0\\x11\\x55\\x77\\x69\\x30\\x7c\\x23\\xed\\x40\\xe9\\xfb\\x8e\\xe0\\x60\\xb8\\x3f\\xc4\\xbe\\x43\\x9a\\x80\\x0d\\x4b\\xfb\\x8e\\x34\\x77\\xb4\\x9f\\x50\\xc9\\x71\\xe1\\x77\\x7e\\x7c\\x90\\xec\\x27\\xd8\\x77\\xd0\\x98\\xc9\\xbd\\x2c\\x76\\x20\\x11\\x76\\x9f\\x6a\\x43\\x8a\\x1d\\xa6\\x38\\x64\\x89\\xd9\\xca\\xb7\\x38\\x60\\x89\\x79\\xbe\\xcb\\x43\\x96\\x58\\x4c\\x8e\\x46\\x9c\\x13\\x49\\x71\\xea\\x52\\xc4\\xdd\\x17\\x5e\\xf9\\x4b\\xa7\\x22\\x62\\xd3\\x56\\x5c\\xf8\\xdd\\xfa\\xc9\\xaa\\x13\\x58\\xbc\\x9f\\xf5\\x4a\\xd7\\xa5\\xb9\\x2b\\x22\\x27\\x3f\\x68\\x30\\x95\\xa9\\x1c\\xe1\\xf3\\xf9\\x02\\xc6\\xdc\\xd3\\x8b\\x8b\\xc5\\x02\\x9e\\x6a\\xcb\\x71\\x58\\xf2\\xa2\\x19\\x5e\\x17\\x4d\\xa4\\xe2\\xd6\\xb0\\x37\\x66\\x1b\\xe6\\x89\\xfa\\x95\\x7c\\x70\\xcc\\x66\\xf1\\x95\\x2a\\xbd\\xd5\\x1d\\xd2\\x56\\x37\\xdf\\xe4\\x70\\xce\\x37\\xac\\x3e\\x5f\\x0a\\xe8\\x65\\xe7\\xdd\\x14\\x26\\xbe\\x8b\\x5d\\xba\\x69\\x70\\x4e\\xc3\\x6a\\x81\\x70\\xcd\\x09\\x8c\\xda\\x5d\\x3b\\xb3\\x96\\x07\\x8a\\x32\\x61\\xe8\\x1b\\x1e\\xf2\\x4d\\xe3\\x8a\\xa8\\x4c\\xb6\\x4b\\x79\\x59\\x5c\\x36\\x86\\x81\\x9b\\x24\\xca\\xab\\x86\\x25\\xa5\\x05\\x23\\x22\\x0a\\xf1\\xd3\\xb9\\x61\\x1f\\xba\\x96\\xf0\\xc4\\xa4\\x9d\\xb6\\x50\\xc5\\xb7\\x7e\\x6a\\x5a\\xb5\\xb9\\xd5\\x6e\\x0c\\x86\\xf2\\xaa\\xc5\\xd8\\xa0\\x5c\\x5d\\xb9\\x1d\\xe8\\x0b\\xe6\\x7c\\x23\\xb3\\xdb\\x56\\x23\\xb2\\x6f\\x9d\\x4f\\xbe\\x39\\x66\\x95\\xc5\\x12\\xaa\\x39\\x02\\x8c\\x2c\\x14\\x7b\\xec\\x0b\\xc7\\xbc\\xcc\\xb1\\xa5\\x9e\\x82\\xaf\\x0e\\x83\\x26\\xd9\\x64\\x09\\x4d\\x55\\xb8\\x7c\\x5c\\x64\\x5e\\x92\\xa8\\x71\\x9d\\x97\\xc4\\x6d\\xb6\\x01\\xc3\\x95\\x2a\\x82\\x57\\x7b\\x71\\x16\\x29\\x95\\x45\\xed\\x97\\xce\\xb5\\x22\\x12\\x95\\xff\\x9d\\x33\\xad\\x46\\x1d\\xd2\\x28\\xa8\\x28\\x51\\x09\\x8b\\x16\\xe6\\x95\\x65\\xff\\xd2\\x2a\\x10\\x49\\xf6\\x4f\\xad\\x02\\x19\\x75\\x4c\\xdb\\x96\\x68\\xc6\\xcf\\xa6\\x16\\x0b\\x23\\xf0\\xc6\\xa9\\x78\\x42\\x05\\x1b\\x9f\\xe0\\x81\\xc6\\x65\\x94\\xa6\\xd1\\x54\\x65\\x50\\x79\\xf1\\xc4\\xea\\xcf\\xc8\\xbe\\x71\\x60\\x07\\xfd\\x87\\x03\\x93\\xe7\\xa7\\xf4\\xbd\\x6b\\xd8\\xaf\\x29\\x40\\x3f\\x87\\xb2\\x5f\\x46\\x94\\xd2\\x3e\\x38\\xee\\x19\\x6d\\x6f\\x6a\\x74\\x8d\\xd6\\xf3\\x1d\\xfa\\xcd\\x07\\x08\\x40\\x34\\xdd\\x10\\x97\\xcb\\xd4\\x77\\x53\\x7f\\x34\\x0a\\x80\\xd5\\x85\\x2a\\x6c\\xf0\\xcd\\xd3\\x2d\\xdf\\x3c\\xd9\\x46\\xe3\\xf8\\xa9\\xdf\\x30\\xce\\xda\\x47\\x88\\xc2\\x1d\\xd4\\x19\\x47\\xf1\\x4b\\x7a\\xe7\\x33\\x43\\x33\\x67\\x68\\x6e\\x19\\x9a\\xb9\\x80\\xe6\\xb6\\x02\\x8d\\xd1\\xea\\xec\\xae\\x84\\x81\\x41\\x05\\xbb\\x54\\xce\\x03\\x96\\x80\\x61\\x18\\x6c\\x05\\xd4\\x51\\xfb\\x4c\\x01\\x73\\x24\\x81\\xb1\\x5f\\x8a\\x02\\xaf\\xed\\xe3\\xa7\\x19\\x0d\\x83\\x08\\xfd\\xa0\\xd0\\x09\\x14\\xab\\x38\\x74\\x4a\\x14\\x58\\xca\\xf5\\x53\\x84\\x6e\\xf2\\x78\\x99\\x7f\\x2c\\xde\\x31\\xfc\\xe9\\x86\\x23\\xc1\\x3e\\xfa\\xce\\xd8\\xfe\\xe8\\xf4\\x8b\\x68\\x13\\x27\\xfe\\xc4\\x85\\xea\\xa4\\xc9\\x3e\\x7d\\x37\\x3e\\xca\\xd5\\x24\\x29\\xca\\xf4\\x28\\x7f\\x77\\xa4\\x2e\\xae\\x61\\x3b\\x80\\x88\\x33\\xb7\\x41\\x39\\x86\\x03\\xb3\\x3c\\x6d\\xac\\x76\\x0d\\xd2\\x6e\\x50\\xe5\\xc9\\x4b\\xec\\x7c\\xc7\\x59\\xf7\\x1e\\xad\\x02\\x7b\\xb4\\x04\\x74\\xc0\\xf5\\x77\\xd8\\x22\\x53\\xc5\\xc6\\x04\\xbf\\x41\\x5a\\xf3\\x16\\xa8\\x78\\xc1\\x1f\\xc5\\x7e\\xc9\\xb5\\xe9\\x3f\\x5c\\xde\\x61\\x5b\\xf2\\x26\\xe8\\xa5\\x0d\\xc3\\xe8\\x7e\\x0f\\x72\\xb5\\x2d\\xe6\\x8e\\x35\\xea\\x1b\\x75\\x97\\xd0\\x85\\x6b\\x43\\x75\\x11\\x8d\\xd2\\x67\\x15\\x13\\x97\\x0f\\x5f\\x08\\xa7\\xf9\\x65\\x70\\xc1\\x60\\x1f\\x6f\\x1e\\x13\\x65\\x97\\xcc\\x0e\\x3c\\xfc\\x38\\xcf\\x83\\xc2\\x59\\x23\\xc5\\x92\\x9c\\x67\\x61\\xb3\\x78\\xb9\\xfe\\x19\\xab\\x97\\xf4\\xeb\\x6a\\x7e\\x40\\x85\\xad\\x51\\xd8\\x73\\x62\\xfd\\x93\\xc7\\x95\\xf7\\x65\\x79\\x5f\\x21\\xf5\\xe1\\x31\\xa6\\x9b\\x22\\x59\\x3a\\xca\\xbb\\x24\\xbb\\x1c\\xf9\\xd7\\xfe\\xa8\\xd6\\xd6\\x7f\\xa5\\xf8\\xd6\\x56\\x98\\xdf\\x23\\x7e\\x0f\\x1c\\xc5\\xcc\\xec\\x37\\x81\\x73\\x47\\xac\\x0c\\xaf\\xd5\\xe0\\xf7\\x01\\x9e\\x0f\\x39\\x85\\x3e\\xc0\\x02\\xd5\\xeb\\x35\\x5a\\xe2\\x2f\\x63\\x12\\x02\\x56\\xac\\xf1\\xac\\xfd\\x54\\xb7\\xc6\\xa7\\xd5\\x15\\x5e\\xf1\\x1a\\xf6\\x78\\xe5\\xc5\\x4d\\x96\\xd5\\xb0\\x5c\\xd0\\x2c\\x2b\\x38\\x51\\xf3\\xc6\\xbb\\xfc\\xe1\\xa7\\xcd\\xd4\\x9d\\x35\\x27\\x04\\x57\\x00\\xd8\\x9a\\xc3\\x28\\x60\\xee\\x18\\x5f\\x5d\\xba\\x66\\xdb\\xe6\\xff\\x2c\\x43\\xb3\\xf8\\x8f\\x5b\\x3a\\x01\\x27\\x9e\\x7a\\x72\\x7c\\x1a\\x65\\xc3\\x89\\x70\\x41\\x90\\x27\\xb0\\x9f\\x2f\\x7d\\x9d\\x83\\x47\\xd3\\x2b\\x7e\\xdf\\xaa\\xaf\\x75\\xfb\\xd1\\xd2\\x42\\x17\\xc3\\xff\\x6b\\x75\\xa1\\x2b\\x95\\x96\\x08\\xc0\\x29\\xd2\\xa5\\x1f\\xf0\\x92\\x6b\\x4c\\x88\\x9b\\x7b\\x61\\x91\\x38\\xcc\\xe2\\x84\\x11\\xe1\\xbb\\xdb\\x89\\xeb\\xc7\\x58\\x25\\x4b\\x10\\x09\\x47\\xc6\\x3a\\x34\\xeb\\xc1\\x92\\x97\\xab\\x36\\x05\\x49\\x41\\xae\\xab\\x6e\\x05\\xfb\\xd8\\xc3\\xdd\\x91\\x6a\\xeb\\x1a\\x3e\\xa3\\x5d\\x29\\x77\\x14\\x22\\x86\\xbb\\xd4\\xfe\\x55\\xb5\\xf1\\x65\\xb6\\x6b\\x88\\xaa\\x9f\\x40\\xc5\\x75\\x09\\xa4\\x1a\\x2e\\x7d\\xc4\\xa6\\xae\\x57\\xa0\\x78\\x5b\\x57\\x64\\xfb\\xdc\\xbb\\x19\\x14\\xfa\\x75\\xbd\\x66\\x47\\x18\\x18\\x51\\x85\\xe6\\xb5\\x85\\xfe\\x3e\\x0f\\x93\\xc1\\xea\\x42\\x37\\xfe\\x88\\xe4\\x19\\x7b\\x4f\\x85\\x27\\xec\\x12\\x85\\x23\\x1e\\x1a\\x5e\\x76\\xa9\\xc1\\xc9\\xd8\\x77\\x90\\x68\\x6d\\x40\\x07\\x06\\xf7\\x76\\xa6\\xd5\\x33\\xc2\\x88\\xc4\\x14\\x6e\\x47\\x8c\\xc2\\x10\\x72\\xad\\x5b\\xbe\\x79\\x83\\x05\\xb5\\x52\\x54\\x64\\xed\\x07\\xec\\xfe\\x81\\xe4\\xb3\\x00\\xe6\\xd4\\xf2\\xae\\x18\\x32\\x4d\\x94\\xe0\\x85\\x36\\x4a\\x93\\xe3\\xed\\x98\\xa4\\x39\\x12\\xa6\\x55\\xd1\\xa4\\x28\\x3a\\x2f\\x17\\x55\\xa8\\x69\\x65\\x33\\x2e\\xeb\\x99\\xe3\\xd2\\xf9\\xb5\\x27\\xe4\\xf8\\x5a\\xba\\x11\\x55\\x69\\xee\\x61\\x6b\\x28\\x41\\xf7\\xdd\\x3a\\x3e\\x6f\\x6c\\x7b\\xc5\\xa0\\x09\\x89\\x66\\x42\\x91\\x7f\\x27\\x7a\\xa4\\x65\\xdc\\x2f\\xdb\\xd8\\x52\\x42\\x5b\\x31\\x43\\x0a\\xea\\x60\\xf0\\xc3\\x9a\\x79\\x64\\xb7\\xc2\\x03\\xd0\\x92\\xdd\\x4a\\x0e\\x4a\\x34\\x25\\x7b\\x6e\\x0c\\xec\\xc7\\x65\\x9b\\x5e\\xd9\\xc3\\xed\\x51\\x3f\\x4e\\x1e\\x68\\xcf\\x93\\xed\\xdd\\x94\\xdb\\x53\\xdd\\x3d\\x41\\x83\\x93\\x72\\x83\\xbe\\xce\\x52\\x11\\xe8\\xec\\x3a\\x85\\x07\\xbf\\x1f\\xde\\xfc\\x30\\x1a\\xe1\\xc8\\xf3\\x90\\xf6\\xb8\\x27\\xe2\\xf9\\xfc\\x4f\\x18\\x91\\x75\\x00\\x3d\\x7d\\x52\\x8d\\x0e\\xea\\x25\\x49\\x78\\xd7\\xb2\\x4f\\xf1\\x40\\x3b\\xaf\\xee\\x7a\\x65\\x75\\x14\\x79\\x48\\x95\\xa2\\xa6\\x46\\x51\\x53\\x43\\xd5\\xd4\\xae\\x54\\x34\\xd2\\x75\\x7d\\x98\\xe7\\xc2\\xb9\\x7e\\x0a\\x3b\\x45\\x30\\xc7\\x17\\x72\\x35\\xb7\\xca\\x77\\x3d\\x3e\\xf1\\xdc\\x00\\x20\\xe7\\x4d\\xbb\\x41\\xfa\\x5f\\x6f\\xde\\x33\\x4f\\x18\\x8f\\x73\\x13\\xfd\\xde\\x18\\xb3\\xb5\\xda\\x5d\\xdb\\x44\\xa7\\x34\\x26\\x22\\x44\\x25\\x01\\x17\\x81\\xd5\\xe0\\x9a\\x5f\\x9c\\xa0\\xc7\\x04\\x84\\x04\\x20\\x22\\x77\\x10\\x49\\x99\\x07\\x56\\x57\\xf4\\x09\\x09\\x9d\\x5b\\x5b\\x53\\x58\\xf8\\xa6\\xb5\\x01\\x3b\\x63\\xf3\\x07\\xc3\\xd7\\x26\\x89\\x53\\x24\\xc0\\x53\\x33\\x9b\\x65\\xc9\\x13\\xd8\\x2d\\x09\\x82\\x37\\xca\\x5d\\x96\\x5c\\x2a\\x60\\x5f\\xa0\\x7b\\xd8\\x13\\xcc\\xb3\\x2b\\xb9\\x99\\x71\\xaf\\x77\\xc8\\x54\\x29\\x15\\x4a\\xeb\\x6d\\x24\\x70\\x7c\\x62\\xeb\\x56\\x43\\xc7\\x17\\x16\\xb2\\x7c\\x61\\x88\\xf3\\x27\\x8e\\x3e\\xae\\x1d\\xaf\\x37\\xe9\\x8e\\x69\\x9f\\x77\\x8d\\xf1\\xba\\xd6\\xcc\\x74\\x60\\x14\\x86\\x4d\\x98\\x0b\\x69\\x3a\\xa3\\x46\\x02\\x79\\xd2\\xf4\\x7a\\xb3\\xee\\x95\\x55\\xd8\\x60\\x19\\xda\\x85\\x49\\x1d\\x5b\\xf8\\x01\\xee\\xe2\\xc7\\x3e\\xec\\x65\\x8e\\x19\\x37\\x9c\\xc4\\x6a\\x8c\\xba\\xe6\\x09\\x5b\\x27\\xa9\\x2f\\xb5\\xfb\\x14\\x0e\\x10\\x9b\\x31\\x9e\\xb6\\xc5\\x07\\x09\\x64\\x1a\\xa8\\xa8\\xc1\\x4b\\x02\\xfd\\xb1\\x01\\xd1\\x06\\xf6\\x37\\x80\\x6f\\xc3\\xc9\\x48\\x06\\xed\\xb9\\xc2\\x19\\xbd\\x34\\xd9\\x80\\x1c\\x54\\x04\\xe9\\x4e\\x06\\x13\\x3d\\x5d\\xf6\\xc9\\xa3\\x59\\x82\\x21\\x76\\x77\\x47\\x74\\x62\\xff\\xf8\\xa7\\xb5\\xbe\\x8e\\x97\\xac\\xc7\\x41\\xed\\x42\\xaa\\x20\\x49\\x86\\xf6\\x32\\x4b\\xab\\x8b\\xc8\\x76\\x5c\\xc8\\x06\\x18\\x43\\x25\\x02\\x88\\x53\\xf0\\x3c\\x29\\x9b\\x2d\\x27\\xb0\\xdc\\x50\\x5f\\x86\\x93\\x70\\x98\\xbc\\x94\\x42\\xb3\\x4a\\x17\\x41\\x4a\\x09\\x95\\x46\\xec\\x5f\\x66\\x95\\xde\\xb0\\xd9\\x92\\x3b\\x0c\\x7e\\xfe\\xc7\\xc7\\x1e\\xb4\\xe1\\xd6\\x24\\x28\\x35\\x87\\x94\\x77\\xb4\\x1b\\x67\\xd8\\x8a\\xc6\\xe6\\xa5\\xfe\\xe4\\xf1\\x87\\x56\\x80\\xe6\\xe6\\x6b\\xe7\\x02\\x0b\\x7b\\x36\\xa5\\xf6\\x5e\\x3a\\x1b\\xdb\\x7f\\x9b\\xe1\\x22\\xb1\\x14\\xf7\\x7d\\x4d\\x53\\x21\\xa0\\xed\\x34\\xe2\\xbd\\xc5\\x4d\\x29\\x3e\\xa1\\xf9\\x7f\\xd1\\xe2\\xc5\\xdd\\xa3\\xc5\\x58\\x31\\x40\\xda\\x4e\\x7f\\x46\\xc5\\x3f\\x4b\\x2c\\xe0\\x58\\x07\\x13\\x9b\\xfc\\xba\\x0e\\xf1\\x6b\\x7a\\xe3\\x9a\\x1f\\x59\\xe5\\x98\\x0d\\x27\\xd8\\x9a\\x8d\\xfa\\xdc\\xc7\\x49\\xef\\xb8\\x7e\\x30\\x46\\xf5\\x23\\x31\\xb7\\xba\\x2b\\x46\\x7c\\x54\\x3b\\xdc\\x73\\x10\\x69\\x7e\\x18\\x68\\x96\\x48\\xf2\\xa9\\x61\\xe9\\x49\\xf6\\xa1\\x25\\x79\\x11\\xb1\\x5c\\x7c\\x29\\x2e\\xc4\\xc1\\x9d\\x81\\xb0\\x40\\x8d\\x77\\x8f\\x6a\\x77\\xda\\xd8\\xbe\\x29\\x7a\\x93\\x76\\xaa\\xb4\\xbc\\x85\\x79\\x78\\xff\\xd6\\x39\\x27\\x9e\\xd7\\xec\\xcb\\xca\\x88\\xe3\\x35\\x3f\\x8a\\x9a\\x06\\x8a\\xe9\\xf5\\xf3\\x36\\x3e\\x0e\\xc4\\xc6\\xb5\\xc2\\x43\\x69\\x9a\\x9f\\x38\\x3f\\x95\\x05\\x2b\\x6b\\x7f\\xf5\\x84\\xe3\\xa9\\xb3\\xee\\x8c\\x5b\\x6f\\x82\\x5d\\x54\\x22\\xac\\x2a\\x39\\x8b\\x53\\x03\\x58\\x92\\x97\\x3e\\x67\\x85\\x7d\\xec\\xd7\\xc4\\x30\\xf5\\x0c\\xb6\\x62\\xb6\\xc5\\x24\\xb0\\xa4\\x5d\\xc6\\xc2\\x50\\xd0\\x79\\xdb\\x66\\xfb\\xb2\\xe2\\xf7\\x0a\\x56\\x9b\\x66\\xf8\\x73\\xed\\xbc\\x0f\\x34\\x1e\\x1a\\xca\\xa3\\x5f\\x5d\\xfe\\x58\\x71\\xf6\\x28\\x26\\x4e\\xf5\\xb9\\x70\\xea\\xdc\\xdd\\x12\\x7b\\x9e\\x77\\x27\\x30\\x6f\\x6a\\x7f\\xc7\\xb6\\xd7\\x5b\\x3a\\x92\\x14\\x37\\x45\\xda\\x81\\x64\\x6a\\xf7\\x69\\xab\\x5d\\xd9\\xe8\\x68\\x62\\x9c\\x25\\x6f\\xa0\\x4a\\xfb\\x10\\x0d\\x22\\xdc\\xe2\\xf9\\x6c\\x20\\xeb\\x3b\\x3b\\xd1\\xb8\\x25\\x54\\x61\\x26\\x2b\\xac\\xed\\x50\\x92\\x53\\xe5\\x65\\x1a\\x47\\x77\\x97\\xeb\\x13\\x5b\\xe3\\x39\\xcc\\xd7\\xa6\\xf0\\xb3\\x17\\xe3\\x7b\\x02\\x87\\x4b\\xc5\\x35\\x9f\\xe3\\xca\\xce\\xd5\\xce\\xd4\\x71\\xc8\\x7c\\xeb\\xe0\\x6e\\x1c\\x92\\x68\\x6b\\xee\\xc4\\xf8\\x0c\\xeb\\x56\\xc5\\x62\\x31\\xbc\\xbf\\xb7\\xb4\\x0b\\xb6\\x3a\\xe4\\x52\\x46\\x2e\\x25\\xe4\\xfe\\xa1\\xaa\\x4a\\xba\\x64\\x88\\x38\\xd4\\xaa\\xa7\\xac\\xdf\\xa9\\x8e\\x2f\\xeb\\xd6\\x76\\x5e\\x11\\xd0\\xd8\\x32\\x91\\x6d\\x04\\x2f\\x5e\\xec\\x2c\\x36\\x92\\x81\\xd2\\x4f\\x5f\\xd7\\x97\\x45\\x52\\x5b\\x43\\xc2\\xaf\\xbf\\x02\\x77\\x3a\\x5b\\x13\\x0e\\x62\\xc7\\xb0\\x62\\xb4\\xb1\\x01\\xab\\xb7\\x20\\x7e\\xfa\\x20\\xb9\\xa7\\x1b\\xf4\\x38\\xb2\\x9b\\xf0\\x43\\x7d\\xfa\\x12\\x0a\\xf4\\xc8\\x7e\\x7e\\x65\\xcf\\x06\\xc8\\xd0\\x4d\\x48\\x8e\\x10\\x76\\x17\\x43\\x29\\xa1\\x2e\\x9f\\xa4\\x48\\x5d\\xb3\\xe1\\xaa\\xfb\\x2e\\x86\\x81\\xaf\\x1c\\xa8\\xfd\\xd8\\x49\\x59\\xaa\\xe1\\x18\\x4f\\xc4\\xc4\\x2c\\x0e\\x47\\xce\\x39\\x55\\x05\\x1f\\x16\\x7e\\x78\\xed\\xc5\\xc2\\xe3\\x1b\\xfc\\xee\\x51\\x8e\\xc0\\x8c\\xb1\\xb3\\x38\\x88\\x79\\x5f\\xe2\\xc1\\x69\\x39\\xdc\\xa9\\xc0\\x01\\xd9\\x06\\x33\\xd6\\xc5\\x22\\xde\\x60\\x21\\x14\\x02\\xda\\x58\\xd4\\x24\\xf7\\x31\\x99\\x68\\xd8\\x17\\x0d\\x07\\x1c\\xc3\\x26\\xce\\x7d\\x16\\xb0\\xa0\\xd8\\x7f\\x4e\\xf0\\xc3\\x51\\x46\\xde\\x30\\x49\\x34\\xa0\\x5f\\x9f\\x7e\\x70\\x1a\\x99\\x1d\\xf8\\xdc\\x70\\x66\\x67\\x0e\\xbc\\xb7\\xa0\\xe1\\x6c\\x83\\x59\\xf8\\x62\\xe1\\x6f\\xb0\\xc8\\x8b\\x86\\x27\\xa2\\x26\\x8b\\x7b\\x92\\xb1\\x8e\\x70\\x14\\x17\\x09\\x34\\x23\\xee\\x76\\x0a\\x8f\\x45\\x98\\x65\\xe6\\x32\\xb6\\x32\\x20\\x91\\x56\\xa1\\x7a\\xdc\\x25\\x7a\\x2e\\x04\\x31\\x57\\x60\\xe8\\x8a\\x16\\x32\\x86\\x8c\\xc2\\x2c\\x8a\\x97\\xd1\\x52\\x75\\x0a\\xec\\x54\\xa8\\x1e\\x49\\x8b\\x4d\\x1f\\x10\\x39\\x50\\x77\\x66\\x03\\xfb\\x3c\\x26\\xdc\\x40\\x16\\xdc\\xbb\\xa0\\x1b\\x81\\xad\\x20\\xc8\\x7a\\x9b\\x47\\xb9\\x10\\x46\\x22\\x7b\\x95\\x19\\x2b\\x46\\x62\\x41\\x23\\x5f\\x66\\x5c\\xae\\x62\\x63\\x83\\x60\\x40\\x8f\\x39\\xdc\\x61\\x8b\\xc5\\xc6\\x06\\xb5\\x3c\\xe1\\x08\\xe0\\xa7\\xfb\\x64\\x0c\\xcb\\x3e\\x19\\x8f\\x02\\xe7\\x2e\\xec\\x1a\\x61\\xd2\\x94\\x13\\xdb\\x86\\x5f\\xf0\\x9b\\x3c\\x94\\x94\\xd2\\x6e\\x4a\\x69\\x21\\x05\\xc3\\x9b\\xc4\\x2b\\x22\\xa8\\x6c\\xe8\\x25\\x5a\\x69\\xaf\\x92\\x23\\xb9\\x29\\xe7\\xb8\\xb7\\xdf\\x07\\xce\\xf9\\xb9\\x11\\xe2\\x74\\x85\\xfe\\x61\\x39\\xbd\\xc1\\x92\\xca\\x7f\\x38\\x86\\xff\\xdc\\x18\\xd4\\xb7\\x9c\\x43\\x7c\\x85\\x9c\\x17\\x56\\x4b\\x06\\xf6\\xdb\\xc0\\x71\\x87\\xd2\\x54\\x93\\x73\\x35\\xe4\\x1b\\x39\\x71\\x16\\x6a\\x7f\\x0d\\x9c\\xb7\\x41\\x2b\\x4b\\x87\\xf6\\xb7\\xc0\\xf9\\x4a\\x0b\\xf3\\xe6\\xd7\\xe6\\xe6\\xb4\\xb9\\x39\\xea\\x6f\\x1e\\x75\\x37\\x4f\\xba\\x9b\\xa7\\xad\\xcd\\xe3\\x6f\\x86\\xb5\\x4f\\xb9\\xfc\\x24\\x72\\x58\\x67\\x3a\\x57\\xb9\\x6d\\xa5\\xd1\\xdb\\xd3\\xf7\\xa7\\xac\\xa6\\xb2\\xb5\\xd5\\x80\\x2b\\xde\\x57\\xbc\\xc7\\xde\\x6d\\xb7\\xdb\\xcd\\xf6\\x0e\\xfd\\xdf\\x6f\\xb7\\xbb\\xfc\\x7f\\x8b\\xa2\\xa8\\xa2\\xde\\x5f\\x51\\xf7\\x5b\\x60\\xff\\x15\\x41\\xab\\xa1\\x56\\x5f\\x21\\xaf\\x45\\x53\\xb7\\x61\\x9b\\xa9\\xca\\xb4\\x70\\x7a\\x8f\\xe2\\x69\\x24\\xda\\x75\\xbe\\x05\\xf9\\xb7\\x4d\\x68\\x26\\xde\\x30\\x0a\\x47\\xce\\x9b\\xd4\\xac\\x39\\xe1\\x41\\xdd\\xc3\\xa1\\xb9\\xe3\\x75\\x9e\\x6a\\x76\\xa6\\xc2\\x6d\\x8a\\xc0\\xfd\\x74\\xf9\\x5e\\x9a\\x55\\x09\\xfb\\xd4\\x57\\x26\\x6b\\x2a\\xf2\\x97\\xd5\\xa8\\x94\\x4d\\xcb\\xe5\\x34\\x9a\\xa5\\x22\\xa7\\x0c\\x4b\\x62\\xb2\\xe7\\x48\\x05\\x5a\\xe2\\xe4\\x9f\\xe2\\x22\\x40\\x4b\\xc2\\x48\\x68\\xc9\\x14\\x2a\\xb2\\xd0\\x06\\x2a\\x4b\\xbd\\x87\\x11\\xdb\\xf3\\xfe\\x28\\x23\\x46\\x11\\xeb\\x22\\x56\\x29\\xfb\\x20\\x62\\x27\\x0c\\x4b\\x8e\\x98\\x00\\x8d\\x11\\x13\\x9f\\x55\\xa8\\x73\\xc4\\x64\\x72\\x09\\xb1\\x49\\x94\\xc5\\x55\\xb4\\x94\\x11\\x67\\x09\\xde\\x2f\\x12\\x20\\xdf\\xb3\\x2b\\x29\\xd3\\xda\\xde\\x2b\\x1c\\xbd\\x09\\xac\\x3b\\x7b\\xde\\xb3\\xa7\\x66\\x09\\x6f\\x44\\x35\\x53\\xab\\x91\\xae\\x8b\\x3d\\xd7\\xb1\\x2e\\xfa\\x47\\x04\\x71\\x8e\\x3c\\xc0\\x67\\xd4\\xf1\\x51\\xc6\\x2a\\x47\\x9b\\x93\\xca\\xa3\\x19\\x85\\xe9\\x64\\xd5\\x60\\xa2\\xc8\\xc8\\x85\\x86\\x1b\\x9f\\xef\\xa4\\x3c\\x1d\\x76\\x98\\xc5\\xd5\\xe0\\x72\\x82\\xaa\\x04\\x32\\xe2\\x13\\x68\\x3f\\x30\\x76\\x22\\x8f\\x1c\\x39\\x04\\xc4\\xc0\\xe1\\xab\\x02\\x5f\\x31\\x6c\\x9c\\x98\\x23\\xc0\\x8c\\xf1\\x0c\\xf6\\x34\\xbd\\x8e\\xfd\\xcc\\x83\\xd1\\x28\\xfa\\xd3\\xf1\\xfe\\xb0\\x89\\x88\\xe8\\xf7\\x99\\xfd\\x1f\\xfa\\xb7\\xf3\\x6f\\xfa\\x83\\x7e\\x85\\x09\\x29\\xfa\\xbb\\xbb\\x83\\xef\\x3f\\x3a\\xbb\\xf4\\xf7\\xdf\\x7b\\x7f\\x20\\xfe\\xf9\\x2e\\x12\\xf6\\xda\\x7f\\x70\\xfa\\xb3\\xff\\xec\\x7a\\x7b\\xf6\\xf3\\xe7\\xcf\\xf7\\xe8\\xa7\\xb3\\xf3\\x8c\\xca\\xee\\x0d\\xec\\x2f\\xe0\\x7f\\xf9\\x9c\\x60\\xd3\\x77\\x45\\xe8\\x59\\x29\\xb4\\x53\\x0e\\x76\\xda\\x22\\x28\\x88\\x4e\\x95\\x94\\xa1\\x67\\xe5\\xb4\\x72\\x50\\x95\\xc4\\xb8\\xa9\\x72\\xfc\\xdd\\xd1\\xbe\\xf7\\xf4\\x3c\\xbb\\x22\\x40\\xa3\\xa6\\xf2\\xe3\\x53\\xc6\\x92\\xb8\\xfc\\x23\\x6f\\x1e\\x5d\\x59\\x0e\\xc8\\x4a\\xe7\\xb4\\xfa\\xd9\\xd8\\x80\\xfd\\x8b\\x99\\xf2\\x34\\x0b\\x52\\xdf\\x24\\xd6\\x4f\\x1c\\xb8\\xf6\\xb8\\x5a\\xce\\xc4\\x20\\xf0\\x93\\x9c\\xcf\\x80\\xf5\\x13\\xd3\\x5e\\x9d\\xff\\xb4\\x94\\x75\\xf3\\x2d\\x31\\xf9\\x87\\x2a\\x57\\xd3\\x5c\\x64\\x7e\\xb2\\x39\\x5b\\x9d\\x59\\x4d\\x0a\\xce\\xea\\x3e\\xd9\\x1c\\xad\\xce\\xfa\\x8a\\x68\\x9b\\x44\\x9d\\x9d\\x0d\\x47\\x06\\x53\\x4f\\x15\\xbc\\x5c\\x55\\xb0\\x2e\\xf3\\x9f\\x0f\\x80\\x2e\\xa9\\x9c\\xf3\\x7d\\x35\\xec\\x77\\xde\\x80\\xa4\\xb4\\x3f\\x69\\x31\\x67\\x0a\\x2e\\x59\\xda\\x2c\\x1e\\xe5\\x16\\x3e\\xca\\x0a\\x6b\\x85\\xe1\\xb6\\x67\\x3d\\xf5\\xec\\x06\\xb2\\xf1\\xeb\\xb7\\xff\\x42\\x13\\xb0\\x6a\\xb9\\xf1\\x4b\\xc0\\xe3\\xe7\\xa8\\x71\\x04\\x15\\x96\\x6f\\x5a\\x0b\\x8b\\x85\\x51\\x8d\\xc5\\xc2\\x2f\\x01\\x0d\\xbb\\x14\\x39\\x3e\\x07\\xce\\x97\\x8a\\x87\\xc4\\x1c\\xbb\\x73\\xf6\\x6b\\x85\\x05\\x1b\\xa7\\x8f\\xb0\\xf3\\xfe\\x17\\x16\\xee\\x35\\xa9\\xe5\\x53\\xff\\xf0\\xb1\\x04\\x43\\x45\\x1e\\x45\\x33\\xdc\\xc4\\x23\\xc8\\x86\\xf2\\x3f\\x82\\x72\\x28\\x77\\x85\\x78\\x38\\xe6\\x11\\xf4\\x53\\xc9\\xff\\x00\\x09\\x01\\x93\\x3a\\x2a\\xda\\xff\\x5c\\x1e\\x6b\\x1e\\x0d\\x35\\xde\\xcc\\x31\\xd7\\x1c\\xf3\\xcf\\x24\\x07\\x49\\xdb\\x8a\\xac\\x86\\xfa\\xb2\\x7e\\x35\\xc0\\x59\\xc9\\x2c\\x0a\\x13\\xaf\\x4f\\x99\\xee\\xf9\\x6c\\xe4\\x7b\\xb2\\xea\\x7d\\xd5\\x3b\\x3c\\x7e\\x30\\xa0\\x43\\xe4\\x0f\\x59\\x83\\x6a\\x1b\\x79\\x0d\\xfb\\x7f\\x22\\x65\\xef\\x7e\\x92\\x4e\\x83\\x87\\xca\\x02\\x94\\x6d\\x64\\x22\\x71\\xd5\\x55\\x85\\x6e\\xa9\\xcc\\x3f\\x81\\xf7\\xe5\\xe4\\x98\\xa0\\xab\\xd1\\x39\\x1c\\x79\\x63\\x42\\x79\\x6b\\x4b\\xfc\\xb6\\xdc\\xe9\\xa8\\x27\\x3e\\xa9\\x4f\\xac\\xae\\x11\\x5d\\xe2\\x19\\x6e\\x91\\x9d\\xb6\\xd1\\x59\\x40\\xd9\\xc5\\x2f\\x9b\\xe4\\x8c\\x53\\xec\\x52\\xca\\x11\\x0e\\x15\\x16\\xba\\xbd\\xa3\\x0e\\x7d\\xdf\\x9b\\xd6\\xfe\\xff\\x06\\x00\\x00\\xff\\xff\\x3b\\xc1\\xeb\\x31\\x55\\x4e\\x02\\x00\")\n\nfunc uiJsLibsD3335D3MinJsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiJsLibsD3335D3MinJs,\n    \"ui/js/libs/d3/3.3.5/d3.min.js\",\n  )\n}\n\nfunc uiJsLibsD3335D3MinJs() (*asset, error) {\n  bytes, err := uiJsLibsD3335D3MinJsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/js/libs/d3/3.3.5/d3.min.js\", size: 151125, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiJsLibsMithriljs020MithrilMinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x94\\x7c\\x79\\x77\\xdb\\xb6\\xd2\\xf7\\xff\\xf9\\x14\\x32\\xeb\\xe3\\x97\\xac\\x60\\x5a\\x4e\\x9e\\xf7\\x9e\\xe7\\x52\\x41\\x78\\x9c\\xc4\\x59\\xda\\x38\\x8b\\xe3\\xb4\\x4d\\x14\\x35\\xe5\\x02\\x89\\x94\\xb9\\xa8\\x22\\xe5\\x25\\x26\\xbf\\xfb\\x33\\x33\\x00\\xb8\\x48\\x72\\x7a\\xef\\xe9\\xa9\\x45\\x62\\x1d\\x0c\\x66\\xf9\\xcd\\x00\\xcc\\xd1\\xcf\\x0f\\xce\\xe2\\x32\\x5a\\xc5\\xc9\\xe0\\x6a\\x64\\x3f\\xb4\\x47\\x0f\\xa2\\xb2\\x5c\\x3a\\x47\\x47\\x73\\x28\\x5d\\xfb\\x76\\x90\\xa7\\x47\\x49\\x94\\xaf\\x62\\x71\\x94\\xca\\x76\\xf6\\xa2\\x78\\x60\\x06\\xd6\\xe0\\x8d\\xc8\\x07\\xaf\\xb0\\xe2\\xc1\\x9b\\x38\\x10\\x59\\x21\\x9c\\xc1\\xd9\\xeb\\x8b\\x07\\x3f\\x1f\\x3d\\xb8\\xf2\\x56\\x83\\x94\\xcf\\xd6\\x59\\x50\\xc6\\x79\\x36\\xf0\\x4c\\x9f\\x05\\xd6\\x5d\\xf3\\x1e\\x9a\\x9e\\x75\\xf7\\x9c\\x7b\\x76\\x98\\x07\\xeb\\x54\\x64\\x25\\x3b\\x85\\x97\\x24\\x0f\\x3c\\xac\\x66\\x2f\\xe1\\x25\\xf0\\xb2\\x40\\x24\\x27\\x59\\x9c\\x52\\xd9\\x8b\\x95\\x97\\x8a\\xaa\\x82\\xf2\\x44\\x78\\xab\\x8b\\x38\\x15\\xf9\\xba\\x64\\x2f\\xa0\\xe1\\x4a\\xfc\\xbd\\x16\\x45\\xb9\\xdd\\xb2\\x10\\xa5\\x6a\\x57\\x37\\x13\\x0b\\xd3\\xba\\x43\\xda\\x3c\\xe6\\xf3\\xc9\\xd4\\x2e\\x12\\xa0\\x1b\\xa6\\x4a\\x12\\xd3\\x5b\\xcd\\x89\\x92\\xc2\\x62\\x01\\xdf\\x33\\xb3\\x75\\x92\\x70\\xee\\x4f\\x8e\\xa7\\x55\\xf5\\x46\\xb6\\xc0\\x17\\x6b\\x8f\\xf3\\x57\\x55\\x65\\x94\\xde\\xdc\\x88\\xb3\\x81\\xac\\x37\\xae\\x62\\x71\\xdd\\x79\\x2d\\xd6\\x7e\\xb9\\x12\\x42\\x97\\x58\\x2c\\xe4\\x81\\x8b\\x4f\\xce\\x5d\\xcd\\x04\\x37\\x82\\xc4\\x2b\\x0a\\xac\\x0d\\x5d\\xf5\\xec\\xc8\\xdf\\xb7\\x40\\xb9\\xc1\\x66\\xfc\\x0e\\x86\\x77\\x8c\\x30\\xbe\\x32\\x98\\x57\\x96\\xab\\x02\\xfa\\xd5\\x6c\\x0e\\x04\\x8f\\xe3\\x99\\xd9\\x50\\x33\\x42\\x6a\\x7e\\xb1\\x60\\x47\\xf2\\xeb\\x41\\x26\\xae\\x07\\xa7\\xab\\x55\\xbe\\x32\\x8d\\x42\\x24\\x22\\x28\\xf3\\xd5\\x00\\x66\\x48\\x4d\\xfd\\xc6\\x06\\x34\\x14\\x1b\\x04\\x51\\x9c\\x84\\x2b\\x91\\x59\\x83\\x22\\xca\\xd7\\x49\\x38\\xf0\\xc5\\xc0\\x1b\\x14\\xe5\\x2a\\xce\\xe6\\x86\\x35\\x9e\\xc1\\x10\\x63\\x8f\\x9f\\xd9\\xe2\\x46\\x04\\x72\\x96\\xb1\\x05\\xd3\\x1a\\x06\\xe7\\xdc\\x83\\x45\\x1c\\x1c\\x78\\x93\\x87\\x53\\x6b\\x66\\x03\\x91\\x1c\\x1f\\xc7\\x22\\x29\\xc4\\x00\\x9b\\xfc\\xa4\\xdb\\x40\\x2d\\xcd\\x66\\xc7\\xe1\\x46\\x13\\xbb\\x69\\x32\\xb7\\x97\\xeb\\x22\\x32\\x69\\xb0\\xb6\\x7e\\x22\\xeb\\x1f\\x4d\\x71\\x62\\xda\\xaa\\x88\\xbf\\x95\\xb4\\x60\\x29\\xd0\\x27\\x47\\x9e\\x44\\x30\\xc6\\x94\\x47\\x50\\x56\\x55\\x66\\x04\\x83\\xb8\\x86\\xe1\\xec\\x8d\\xac\\x1a\\xfb\\xc4\\xdc\\x97\\x7b\\x6b\\x06\\xee\\x43\\xe7\\x18\\x7b\\xe9\\x65\\xf3\\x63\\x98\\x20\\xb6\\x13\\x91\\xcd\\xcb\\xe8\\xe0\\x40\\x71\\x33\\xc6\\xe9\\xa0\\xe2\\xb5\\x8b\\x4f\\x4e\\x4c\\x6c\\xc0\\x91\\x16\\xc8\\xc5\\xd0\\x0a\\xed\\xc8\\x2b\\xde\\x5d\\x67\\xef\\x57\\xf9\\x52\\xac\\xca\\x5b\\x73\\x61\\x1d\\x1c\\x98\\x0b\\xe8\\x21\\x0e\\x0e\\x50\\x56\\xf6\\x78\\x38\\x59\\x00\\x6f\\x0c\\x03\\x24\\x04\\x1f\\x5d\\x53\\x2d\\x10\\x5f\\x2c\\xa6\\xc9\\x5e\\x4c\\xb9\\x61\\x58\\x4e\\xe7\\x95\\xea\\xc7\\x2b\\x51\\xae\\x57\\xd9\\x60\\xae\\x08\\x7b\\x32\\x82\\xe1\\x75\\x23\\x31\\xe5\\x73\\x7b\\x91\\xc7\\x99\\x69\\x0c\\x0c\\x0b\\xc6\\x6a\\xe5\\x79\\x66\\x82\\x24\\xb3\\x90\\x2d\\x58\\xc2\\x52\\x96\\xb1\\x9c\\x2d\\xd9\\xdf\\x6c\\x65\\xdd\\x95\\xab\\xdb\\x3b\\x25\\xc4\\x49\\x55\\xa9\\x07\\xbb\\xcc\\x3f\\xd2\\x3e\\x9b\\x16\\x92\\x9f\\x20\\x29\\x35\\xe8\\x5c\\x10\\x99\\x85\\x75\\x87\\xaf\\x35\\xee\\x01\\xd0\\xe2\\xc5\\x19\\x6e\\x44\\x62\\x2b\\x59\\xb6\\x14\\x7d\\xe9\\x18\\x99\\x52\\x72\\xc5\\xb6\\xd4\\x62\\x6b\\xfd\\x9c\\x58\\x28\\x9d\\x72\\xa6\\xb4\\xaa\\x4a\\xe0\\xc3\\xda\\xba\\x53\\x45\\x7b\\x3c\\x45\\x21\\x0a\\x0f\\x0e\\x42\\x3b\\xcb\\x43\\x51\\xc8\\xbd\\xbd\\xe2\\xf9\\xe1\\x82\\x5d\\xf3\\xab\\xa1\\xb9\\x26\\xee\\x27\\x4e\\xaa\\xea\\x15\\x23\\xc6\\xb1\\xa9\\x7a\\xa8\\x0d\\xbd\\x62\\xd7\\xa0\\x50\\x9d\\x17\\xab\\x26\\xe1\\x51\\xfd\\x0e\\x0e\\x62\\x53\\x3d\\xb2\\xd4\\x1a\\xa7\\x1c\\x15\\x23\\x01\\x1b\\x96\\x81\\x84\\xaf\\x49\\x11\\x52\\x94\\x5c\\x58\\x7e\\xca\\xef\\x6a\\x8b\\xa9\\xc6\\xa0\\x5c\\xb8\\x76\\xa2\\x02\\x0c\\x95\\xda\\xfd\\x1b\\x3e\\x62\\xb7\\xc0\\x05\\x45\\xcb\\xed\\x93\\x9b\\xf1\\xcd\\x70\\x68\\xe9\\x15\\x4f\\x6e\\xa4\\xd0\\x10\\x2f\\x69\\x12\\x60\\xa6\\xed\\x2d\\x97\\xc9\\xad\\x39\\x99\\xb2\\xc4\\x62\\x37\\x87\\x87\\x9d\\x01\\xac\\x46\\xac\\xbe\\xc3\\x7c\\xec\\x84\\xa7\\xaa\\x82\\x58\\x2d\\x1f\\xd9\\x53\\x98\\xf3\\x19\\x3f\\x06\\x8b\\xf8\\x10\\xec\\xdb\\x23\\x30\\x86\\x60\\x35\\xce\\xf8\\xde\\x31\\x03\\x6a\\xc6\\x37\\x8f\\x75\\x1f\\xa2\\x24\\x05\\x12\\x0e\\x0e\\xf0\\xaf\\x94\\x15\\x2d\\x8c\\x6d\\x89\\x7d\\x29\\x6e\\x81\\x3e\\x18\\x60\\xc4\\x5e\\x4e\\xfa\\xe5\\x53\\x7e\\xe7\\x91\\x1c\\x39\\xcf\\x58\\x9c\\x85\\xe2\\xc6\\xb9\\xa9\\x5b\\x1a\\xdf\\x02\\x21\\xf7\\x30\\x00\\x38\\x95\\xd0\\xcc\\xc9\\xd6\\xcc\\x49\\x6f\\x86\\x96\\x95\\x1f\\x36\\x47\\xfa\\x30\\xfe\\x00\\x23\\x25\\x93\\x0f\\x34\\xcc\\x87\\xde\\x30\\xc0\\x8e\\xa6\\x44\\x2d\\xa0\\x5f\\xc0\\x8d\\x6f\\xdf\\x94\\x33\\xfa\\xf6\\xcd\\x18\\xbe\\x85\\x91\\xc6\\xfe\\x4a\\x78\\x97\\xb8\\x89\\x67\\x52\\xb8\\xce\\x81\\x67\\x28\\x92\\x7a\\xce\\xbd\\x86\\xdd\\x16\\x54\\x8d\\xa4\\xcd\\xd1\\xe4\\x7d\\x64\\x17\\xc4\\xdf\\x8f\\xc4\\x3a\\x76\\x41\\xeb\\xd0\\x6b\\xfd\\xa8\\x69\\xbb\\xd0\\x0f\\x1f\\x5b\\x52\\xf6\\xf8\\x45\\x77\\xbd\\x34\\x74\\x43\\xca\\xf9\\x3f\\xca\\xd2\\x7f\\xc1\\x4a\\x1c\\xe5\\xd3\\x46\\xe9\\xf8\\xe5\\xe4\\xd3\\x94\\xe3\\x1f\\x57\\xef\\xe5\\x0b\\xbd\\x97\\x6c\\xb6\\xca\\x53\\x07\\xeb\\x6c\\x2a\\x61\\xe0\\x0a\\xd0\\xc5\\x69\\x1d\\x9b\\xb4\\x55\\x60\\x44\\x9f\\xdb\\x01\\x50\\x5d\\x8a\\x53\\xd9\\xc8\\x24\\xff\\x63\\xd5\\x8e\\x1e\\xf6\\xb4\\x11\\x11\\x32\\xb1\\xbf\\xa1\\x3b\\xd2\\x6b\\xfb\\x1d\\xad\\xe4\\x4b\\xeb\\x37\\x69\\xf1\\x5e\\x4e\\x7e\\x07\\x8b\\x86\\xe5\\x7f\\xf0\\xdf\\xec\\x22\\x5f\\x95\\xe6\\xdc\\x62\\x9f\\x49\\x15\\x4f\\x56\\x2b\\xef\\xd6\\x6c\\x36\\x62\\xfc\\x59\\xa9\\x5f\\xda\\x53\\xf2\\x56\\x08\\xbf\\xd0\\xae\\x7c\\xe1\\x7f\\xe8\\xed\\x40\\x8b\\xf2\\xc5\\x96\\x34\\x81\\xda\\x3c\\x03\\xd1\\x00\\x8d\\x9f\\x7c\\x51\\xeb\\xd0\\xaa\\xdf\\x14\\xc0\\xc4\\x76\\xb1\\xa4\\x51\\x55\\x11\\x3b\\x06\\x1b\\xda\\x19\\xe2\\x54\\x72\\x76\\x9f\\xef\\xe6\\xc0\\x78\\x9f\\x04\\x2e\\x69\\xa7\\x68\\x98\\xcf\\x3c\\x28\\x2a\\xc0\\x1f\\x3c\\x15\\x40\\xaf\\x30\\xf7\\xa1\\x80\\xfc\\xcc\\x5b\\x62\\xef\\x97\\x86\\xb7\\xb8\\x9f\\x3b\\x08\\x19\\xb1\\x3b\\xe5\\xdf\\x61\\x30\\x67\\xd7\\x0c\\x35\\xa3\\xf5\\x38\\x93\\xfd\\x69\\x8d\\x03\\x64\\xbd\\x81\\xf9\\x7e\\xdd\\x59\\xc7\\x0b\\x60\\xc5\\xce\\xf9\\xc1\\x12\\x7f\\xb1\\xd5\\xde\\x6b\\xd9\\xea\\x96\\x6c\\xac\\xa2\\xa9\\xf9\\x87\\xd5\\xb4\\x64\\x20\\xb7\\x51\\xd6\\xa6\\xdb\\x14\\x36\\x83\\x59\\x75\\xca\\x3f\\xd7\\x75\\x57\\x1b\\xbe\\xed\\xd6\\x08\\xda\\x0d\\xdf\\xe7\\xd2\\xb7\\xa5\\xe0\\xd3\\x50\\xe4\\x61\\x4b\\xbf\\x4d\\xd1\\xc3\\x0d\\x9f\\x56\\xd5\\x53\\xe5\\xe6\\xc6\\xbe\\x0f\\x4b\\x09\\x60\\xe1\\xbe\\xaf\\x04\\x28\\xce\\x4a\\xe0\\x08\\x60\\x82\\x13\\x50\\x7f\\x8b\\x3d\\x1d\\x72\\xa8\\xda\\x07\\xdb\\x5f\\x94\\x22\\x74\\xb1\\x5d\\x4a\\x0e\\xef\\xe8\\xf1\\xe4\\xcf\\xaf\\x47\\xd3\\xea\\xeb\\x93\\xaf\\xc5\\xcf\\x93\\x3f\\x1f\\x4f\\x8f\\xe6\\x56\\x55\\x21\\x0c\\x50\\xf4\\x38\\x1a\\x68\\xf9\\x12\\x18\\x40\\x4f\\x55\\x71\\x8c\\xb4\\x0c\\x87\\x53\\x18\\xd9\\x42\\x25\\xdf\\x3b\\xf9\\x47\\x2d\\x6f\\xad\\xf2\\xc1\\xc1\\x77\\xd2\\x12\\xe5\\x26\\xbe\\x33\\x32\\xc9\\xd2\\xe7\\x35\\x52\\x1f\\xf8\\x24\\xf6\\x81\\xaf\\xf5\\x42\\x4b\\xbf\\x1c\\x27\\xf0\\xed\\xa5\\x07\\x58\\xa6\\xc4\\x9d\\xc1\\x01\\x89\\xd9\\xef\\x66\\x66\\xe0\\x5b\\x8f\\x47\\xe8\\x02\\x27\\x81\\x3f\\x65\\x64\\xed\\x41\\x13\\x35\\x35\\x8d\\xeb\\x40\\xe7\\xa7\\x3d\\x4f\\xe3\\x9b\\x1a\\x4f\\xf8\\xbd\\xae\\x35\\x1c\\x53\\x76\\xe8\\xe0\\x00\\xfd\\xe2\\xab\\x76\\x95\\x02\\xd1\\x33\\x9b\\xe1\\x5f\\x18\\x1d\\xe1\\xef\\x58\\x6e\\xdb\\xdc\\xe7\\xf2\\xdd\\xde\\x87\\xb8\\x60\\x1e\\x67\\x1e\\xa0\\x0f\\x59\\xc2\\x22\\x9f\\x83\\x46\\xcd\\x66\\x00\\x2c\\x04\\xa0\\xf6\\x70\\xe5\\x5d\\xdb\\xe0\\x94\\x41\\xe1\\xe6\\xb7\\x26\\xe0\\x91\\x94\\x9a\\x15\\xae\\xfa\\x6d\\x16\\x35\\xf7\\x2d\\xe7\\xf0\\x98\\xc5\\x3e\\x8f\\xfc\\x27\\x87\\xc7\\x50\\x0f\\x8e\\xb6\\x5c\\xe5\\x49\\x22\\x10\\x07\\xfa\\x53\\x07\\x0c\\x8b\\x99\\x74\\x4a\\xab\\xea\\xbd\\xc5\\x3e\\x21\\xdd\\x89\\xb6\\xa8\\x49\\xc7\\x64\\xa2\\xc9\\xe5\\x23\\x80\\x69\\x7e\\x55\\xa5\\x38\\x6f\\x67\\xbc\\x8d\\xd7\\x86\\x88\\xd8\\xb7\\x70\\x6e\\xb9\\x14\\x7c\\x73\\x24\\x48\\x5f\\x26\\x5e\\x20\\xa2\\x3c\\x09\\xc5\\xca\\xa8\\xd9\\x8f\\xa1\\xd3\\x27\\x74\\x63\\x92\\x0e\\x90\\x4f\\xf5\\x44\\x20\\xa4\\x43\\x1d\\xff\\x64\\xc1\\x52\\xed\\x3c\\x5b\\x67\\x49\\xee\\x01\\x60\\xf2\\x7c\\x69\\x55\\xef\\x5a\\xb2\\x9c\\xd8\\x67\\x91\\x97\\x85\\xf2\\xb1\\x69\\x0b\\x03\\x09\\xd5\\x18\\x78\\x06\\xdb\\x23\\x9f\\x63\\x25\\xa5\\x89\\xc4\\x3d\\x33\\x2d\\xc7\\xdb\\x91\\xc3\\xb3\\x3c\\x5d\\xe6\\x19\\xc8\\xd5\\xa0\\x14\\x29\\xac\\xac\\x04\\x58\\x05\\x7a\\x33\\x50\\x2b\\xf0\\x06\\x57\\xf1\\xaa\\x5c\\x7b\\xc9\\x40\\x1b\\x88\\x41\\x96\\x97\\x03\\x0f\\x6a\\xd0\\xaa\\x33\\x15\\x44\\xb0\\x81\\x28\\x03\\xdb\\x40\\xb9\\xdb\\xb5\\xd6\\xb4\\x29\\x4d\\xdb\\x52\\xf2\\x16\\x0b\\x9f\\xbf\\xf3\\x17\\x10\\xad\\x20\\x1f\\x0a\\xdd\\xc9\\x62\\x97\\x3e\\x5f\\x68\\xa2\\x9f\\x98\\x06\\x54\\x62\\xf0\\xa4\\xaa\\xdd\\x63\\x67\\x44\\xc8\\xd3\\xa4\\xf5\\xa1\\x93\\x87\\x9f\\xaa\\x82\\x1e\\xe4\\x79\\x2c\\x89\\x9c\\x21\\x54\\xea\\x8e\\xad\\xa6\\xb6\\xfa\\x6d\\x50\\x54\\x75\\xdc\\x82\\x03\\xe9\\xe7\\xb6\\x9c\\xfc\\x7d\\xda\\xbe\\x40\\xb4\\x07\\x36\\xe2\\x3e\\x89\\x36\\xf7\\x48\\x98\\x66\\xf1\\xfc\\x19\\xec\\x9d\\xb8\\x01\\xb3\\xb4\\x51\\x60\\x4b\\x81\\x01\\x23\\x06\\xa1\\x0b\\x0c\\xf6\\x63\\xfd\\xe8\\x75\\xdd\\x2a\\x50\\x63\\x81\\xec\\x81\\xe1\\x23\\x15\\x97\\x16\\x51\\xeb\\x7c\\x03\\x8c\\x71\\x0f\\x36\\x86\\x2a\\x6f\\x97\\x22\\x9f\\x0d\\x36\\x47\\xd4\\x92\\x05\\x63\\xfe\\xba\\x3d\\x9f\\xae\\x35\\xd5\\x80\\x5a\\x69\\x2c\\x4b\\xdb\\x89\\x58\\xda\\xb1\\x18\\xed\\x58\\x57\\x69\\x95\\x35\\x53\\xb3\\x76\\x44\\x58\\x4e\\xd4\\x29\\x30\\xef\\x96\\x2b\\x71\\x05\\xb2\\xf6\\x5c\\xcc\\xbc\\x75\\x52\\x3a\\xef\\x6b\\xab\\x13\\x05\\xd3\\x9e\\x53\\x18\\x2c\\x65\\x74\\xac\\xac\\x67\\xe2\\xa3\\x82\\xf3\\x3e\\x0b\\x24\\x18\\x94\\x7b\\x77\\x93\\x26\\x59\\xe1\\xfe\\xcd\\x7b\\xef\\x8e\\x51\\x5c\\xcd\\xa5\\xf2\\xc2\\xb0\\x50\\x6b\\xa8\\x4c\\xc8\\xf5\\xf5\\xb5\\x7d\\xfd\\xc8\\xce\\x57\\xf3\\xa3\\x87\\xa3\\xd1\\xe8\\x08\\x9b\\x39\\x06\\x38\\x92\\xa8\\x69\\x0d\\x0c\\xdf\\xd9\\xfe\\xf8\\xdf\\xff\\xfe\\xdf\\xa3\\x33\\x68\\x49\\x7f\\xce\\xde\\x18\\xa0\\xed\\x3e\\xa1\\x98\\xc0\\x6f\\x66\\x8f\\x91\\x14\\x70\\x64\\xee\\x26\\x04\\xa1\\xa1\\x59\\xdb\\xcc\\x72\\x36\\x5a\\xbc\\xfd\\x68\\xfe\\xcd\\xb6\\x5b\\xfd\\x60\\xb4\\x1f\\x0c\\x01\\xfb\\x28\\x73\\x0f\\x72\\x40\\x89\\x4d\\x2e\\x7d\\x37\\x32\\x91\\xa5\\xdd\\x49\\x18\\xc4\\x24\\x7f\\x5b\\x8e\\x7e\\xd3\\xc1\\xb5\\xa3\\x1c\\x46\\x13\\x6d\\xa3\\xe1\\xd5\\xcf\\x4d\\x68\\xeb\\xce\\xda\\xf1\\x02\\xf8\\xaf\\x6d\\x82\\x72\\xa4\\x1f\\x21\\x5e\\x19\\x35\\x6b\\x42\\xe1\\x01\\x52\\x45\\x18\\x97\\x9e\\x9f\\x08\\x37\\xf0\\x1d\\x89\\x00\\x9c\\x4e\\x67\\x05\\x95\\xc0\\xf5\\xd5\\xac\\xb5\\x72\\x77\\xca\\x9f\\x70\\xe1\\xf7\\xc5\\x94\\xcf\\xfc\\xf1\\xb6\\xa0\\xce\\xfc\\x0e\\xf0\\xef\\x19\\xe2\\xce\\x0b\\x78\\xb7\\x24\\x44\\xe4\\xd9\\x91\\xdc\\xcd\\x6a\\x88\\x52\\xfd\\x5e\\x27\\xe9\\x21\\x53\\xbf\\xdb\\x72\\xdc\\x1d\\xe1\\x3d\\xdb\\x1c\\x83\\xa7\\x7e\\x5d\\xa7\\x1d\\x6e\\xee\\xb5\\x2f\\x3a\\xde\\x35\\x37\\x8b\\xc0\\x29\\x5b\\x4c\\x65\\x81\\x3a\\xe2\\x69\\x5c\\x79\\xc9\\x5a\\x74\\x2c\\xe7\\xc1\\x41\\x67\\x5f\\xef\\xa8\\x56\\x6f\\xa8\\x4d\\x6f\\xb5\\xdc\\xe5\\x4d\\x94\\x0b\\x7d\\x7a\\xc0\\x30\\xd7\\x90\\x50\\xc2\\x86\\x0e\\x68\\x19\\x4d\\xc1\\x76\\xf7\\xa6\\xd1\\x02\\xa3\\x4c\\x28\\x8e\\xde\\x92\\xcf\\xff\\x33\\xb9\\x38\\xfe\\x4f\\xe4\\x42\\xa3\\x19\\x85\\x07\\x31\\xfa\\x6d\\x44\\x82\\x78\\x76\\xaf\\x4c\\x58\\x8c\\x4c\\xe8\\x48\\x23\\xe5\\xc0\\xdf\\x42\\xc8\\xf7\\x72\\x00\\x2d\\x8c\\x32\\x6a\\x1d\\x0a\\xc1\\x64\\xa2\\x5d\\x93\\xfb\\x9f\\x29\\x5b\\xd8\\xda\\xd1\\xcd\\xf7\\xaa\\x02\\xb6\\xe7\\x7e\\x93\\x3d\\x45\\x18\\x6c\\xdd\\x29\\x1f\\xdc\\x14\\x36\\x25\\x5e\\x6f\\x22\\x05\\x2b\\xb1\\x4b\\x5d\\x8f\\x57\\x12\\x01\\xe4\\xbe\\x99\\x30\\xd0\\x0b\\xb6\\x97\\xf8\\x2c\\x83\\x25\\x4f\\x2d\\xab\\x05\\x79\\x9a\\xe0\\x3d\\x4d\\xe2\\xf7\\xf1\\xb6\\xed\\x74\\xc1\\x78\\x34\\x28\\xfa\\x3b\\xbf\\x84\\x19\\x00\\x97\\x5b\\x8e\\xf9\\x9d\\x4f\\xb4\\x3d\\xb9\\x00\\xe2\\x91\\x21\\x66\\x62\\x4d\\x81\\x41\\xd8\\x1d\\x33\\x9a\\x0a\\x70\\xbf\\xb3\\x30\\x29\\xdb\\xe3\\xe3\\x77\\x94\\x90\\xdd\\x9c\\x44\\x53\\x64\\x48\\x3c\\x31\\xc8\\xd6\\xa9\\x2f\\x20\\x24\\xc8\\xf3\\x44\\x78\\x99\\xd1\\x60\\x32\\x4d\\x38\\x21\\xb3\\xad\\x3c\\x0f\\x50\\xe1\\x24\\x2d\\xa8\\xb5\\x20\\xea\\x25\\xa9\\x86\\x8e\\x98\\xc5\\x4d\\xda\\x37\\x98\\x92\\x76\\xdc\\x85\\xc5\\xe8\\xdc\\xd1\\xf2\\xe0\\x60\\x09\\x85\\xcf\\x29\\xbc\\xba\\xd2\\xa6\\x92\\xa0\\x4c\\x1b\\x4c\\xc4\\x08\\xdf\\x2d\\xd6\\xb2\\xc3\\x72\\x0c\\xdc\\x41\\xc0\\xe6\\x1e\\x6a\\x9e\\xef\\x7a\\x72\\x16\\x9e\\x38\\x4b\\x77\\x09\\x84\\x67\\x62\\xf5\\xea\\xe2\\xec\\x0d\\xbc\\x9b\\x26\\x26\\x22\\x91\\x03\\x34\\xe3\\x05\\xac\\xa5\\xaa\\xbe\\x6b\\x1b\\x49\\x0e\\xbc\\x9b\\xc9\\x62\\xf7\\xf0\\x79\\x4b\\x3b\\x7f\\xc0\\x53\\xd6\\xcc\\xf6\\x9b\\x24\\x8a\\xb8\\xbc\\x8b\\x71\\x7d\\xb6\\x6d\\x28\\x52\\xad\\x01\\x6d\\x9b\\x86\\x9c\\xf7\\x64\\xd4\\x53\\x31\\xe9\\xa1\\xaf\\x1e\\xe4\\xc6\\xc3\\xa6\\x41\\x09\\xfd\\xb6\\x3d\\x23\\x0a\\xf2\\x02\\x16\\x32\\xd1\\x86\\x17\\x33\\x4c\\x27\\x04\\x2a\\xa2\\xe0\\xc1\\x64\\x36\\x65\\x11\\x0f\\xe1\\x07\\xf5\\x8b\\x2a\\xc1\\xf8\\x62\\xd2\\x6c\\x6e\\x29\\xab\\x06\\xcf\\x33\\x30\\x71\\x71\\xb6\\x5c\\x93\\xcd\\x23\\x9d\\xa5\\xaa\\x3d\\x3e\\xa7\\xb8\\x58\\xee\\xc3\\x5c\\xa6\\x9a\\xef\\x70\\x30\\x3e\\x1f\\x63\\x96\\x14\\x33\\x9e\\x52\\x77\\x68\\x14\\x00\\x61\\x08\\x30\\xe1\\xc9\\x42\\xbb\\x10\\x67\\x6b\\xd1\\xd1\\xea\\xb9\\x04\\x28\\xa8\\x1f\\xb3\\x46\\x0e\\x8d\\x3c\\x33\\x2c\\xcb\\xc3\\x21\\x13\\x13\\xdc\\x66\\x27\\x9d\\x5d\\x94\\xb7\\x89\\xa6\\x4e\\x9a\\x93\\x79\\x93\\x73\\x9e\\x5b\\xfd\\xa0\\x2a\\xc6\\x85\\xcd\\x2d\\x95\\x42\\x8d\\xaa\\x2a\\x9a\\xc4\\x18\\xbb\\xcf\\xe1\\xc7\\xa2\\x35\\xd0\\x68\\xf0\\x26\\x8b\\xc6\\xbd\\x8e\\x91\\x25\\xfb\\x83\\x88\\x76\\x1a\\x62\\x82\\x97\\x88\\x91\\x93\\x0b\\xd7\\x88\\x56\\x62\\x46\\x04\\xb9\\x74\\x42\\x72\\x02\\xb6\\x23\\xf6\\xd7\\xa5\\x00\\x14\\xb0\\x1b\\xbd\\xfc\\xfb\\xe8\\x26\\x89\\xb3\\x4b\\x83\\xc9\\xae\\x0c\\x00\\x44\\xe7\\xb4\\x62\\xc7\\x48\\xa6\\x3a\\xd4\\xc0\\x96\\x1b\\x35\\x33\\x2c\\xa3\\x0d\\xf4\\x60\\xb7\\x92\\xb8\\x28\\x31\\x5d\\x8e\\x3b\\x27\\x19\\xa5\\x5e\\x60\\x61\\xa9\\x7e\\x46\\xc6\\xeb\\xe7\\xeb\\x38\\x04\\xc4\\xa5\\x5e\\x22\\x11\\xcf\\x23\\xd9\\xdf\\x35\\xd5\\xce\\xc3\\x0b\\xc4\\x74\\xb8\\x13\\xc8\\x37\\x62\\x1a\\x6d\\xf4\\x4e\\x42\\x54\\xe6\\x7b\\x41\\x60\\x6c\\x61\\xa7\\xa2\\x28\\xbc\\xb9\\x68\\x77\\xf5\\x75\\x06\\x32\\x13\\x87\\x03\\x7d\\x32\\x64\\x40\\x6c\\xad\\x62\\xa6\\x45\\x5d\\x6b\\x2d\\x08\\x5b\\x59\\x8e\\xa5\\x16\\x34\\x41\\x3c\\x1e\\x69\\x91\\x3a\\x1f\\x1e\\x8f\\x83\\x27\\xf8\\xe7\\xf0\\x10\\x51\\x85\\x37\\x09\\xe8\\x14\\x25\\x98\\x76\\xc2\\x78\\x99\\xb2\\xdf\\x28\\x04\\x48\\x9f\\xe6\\x57\\xe2\\x19\\x2a\\x33\\x75\\xd3\\x44\\x03\\x98\\xa8\\xe9\\x04\\x4b\\xe6\\x9c\\x4d\\xf0\\x5a\\x3e\\x8d\\xba\\x30\\x7d\\x6a\\x36\\xda\\x6b\\x66\\x27\\xd1\\x51\\xd1\\xfe\\xc8\\x6a\\xc9\\x5d\\xe0\\x21\\x1c\\x92\\x73\\x4f\\x30\\xe0\\xfd\\x30\\x18\\xd8\\xec\\xd6\\x8d\\x06\\xee\\xed\\x29\\xcd\\x90\\xd7\\x0b\\x16\\x34\\xbb\\xc0\\x0a\\x00\\x02\\xf3\\x79\\xaf\\x16\\xd6\\x32\\x0e\\xda\\x48\\x61\\x33\\x50\\xf8\\xe7\\x38\\xc1\\x6b\\x80\\x83\\xd5\\x46\\x0d\\x9d\\x42\\xca\\xf7\\x6b\\x12\\x42\\x22\\x21\\xe4\\x6d\\xbd\\x9e\\x7f\\x01\\x1c\\x97\\x5a\\xdd\\xd6\\x49\\x58\\xb5\\xe8\\x8e\\xd6\\x32\\xf7\\x52\\xda\\x35\\x69\\xc3\\x9a\\x11\\xa5\\x41\\xf6\\xc9\\x8e\\x29\\x3c\\x28\\xf8\\xf1\\x1e\\x0f\\x1b\\x1f\\xc0\\x66\\xdb\\x69\\xc8\\x62\\x09\\x5e\\x0f\\xa6\\x77\\xcd\\x0d\\x5b\\x3f\\x63\\xa1\\x36\\xed\\x33\\x55\\x73\\x12\\x2e\\xbc\\x00\\x7a\\xa1\\x97\\x31\\x0d\\x9f\\xda\\xf9\\x62\\x1e\\x67\\x06\\x10\\xc3\\xbc\\x9e\\x40\\xcd\\xc0\\x5f\\x85\\xff\\x49\\xbf\\x5a\\xad\\xfc\\xfe\\xa6\\x22\\x0b\\xb1\\x61\\x63\\x92\\xe8\\xb0\\x72\\x63\\xd1\\x78\\x30\\x36\\x6e\\x8e\\xfd\\xfa\\x75\\x20\\xbe\\xc3\\x61\\x73\\x08\\xd6\\xb2\\x31\\xd9\\x0d\\x7e\\x80\\xaf\\x01\\x0f\\xaa\\x8a\\x76\\x9c\\x6d\\x47\\xcb\\x32\\x8e\\xb6\\xa0\\xa6\\x00\\x67\\x5c\\x62\\x5e\\x63\\x5d\\x7a\\x12\\x37\\x91\\xd1\\x6f\\x3c\\x95\\x4c\\xf1\\xe1\\x1a\\x67\\x98\\xac\\x4a\\x6e\\xef\\x84\\x6f\\x02\\x38\\x6a\\x49\\x48\\x51\\x4d\\x48\\x40\\xf9\\xc7\\xc6\\x38\\x78\\xcd\\x89\\xdd\\xe8\\x89\\xef\\x7e\\x54\\x6b\\xb2\\x0e\\x8f\\x1d\\xbf\\xed\\x99\\xb5\\x3d\\x77\\xc0\\x36\\x7d\\xde\\xdc\\xd1\\x52\\xde\\x14\\x62\\x1e\\x92\\x79\\xb5\\x9e\\xc4\\xb7\\xcb\\xfc\\x97\\x8f\\xef\\xde\\xee\\x1a\\xa7\\x66\\x9d\\x29\\x73\\xc9\\x2f\\x69\\x7e\\xb6\\x1a\\x9b\\xde\\x46\\x92\\x4c\\xa1\\xc5\\x32\\x8a\\x0b\\xe8\\x56\\x55\\xf8\\x50\\xb3\\x90\\x77\\x19\\x7d\\x0f\\xbd\\x4f\\x8e\\x31\\xeb\\xca\\x7d\\x6d\\x81\\xee\\x39\\x4d\\xc7\\x64\\x3b\\xca\\x1d\\xe5\\x04\\x1b\\x6c\\xea\\xa2\\x99\\x6b\\x4c\\x97\\x43\\x16\\x6b\\x1c\\xb6\\x39\\x43\\x2e\\x3b\\x8c\\xa5\\x82\\x74\\x33\\x5f\\x01\\xc3\\x0a\\x27\\x6c\\x59\\x03\\xac\\xd2\\xbe\\x15\\x9f\\xd5\\x71\\x91\\xd0\\xb9\\x25\\xcc\\xac\\xeb\\x72\\x4c\\x90\\xb5\\xbc\\x5a\\x02\\x5f\\xf6\\xa1\\xe9\\x3e\\x58\\xac\\x7d\\x69\\x9a\\x1a\\xf9\\xc5\\xfb\\x01\\xa3\\xb1\\xc7\\x7f\\x43\\x65\\xf5\\x65\\x30\\xf8\\x07\\xca\\xa9\\x62\\xed\\xef\\xf0\\xdc\\xe1\\xe5\\xc1\\xc1\\x46\\x81\\xbd\\xbf\\x0f\\x2c\\x28\\xdc\\x09\\x76\\x6a\\x96\\xba\\xbb\\x11\\xac\\x9f\\x5a\\x8d\\x51\\x8e\\x41\\xbe\\x56\\xc0\\x21\\x6a\\x89\\x2b\\x75\\x9b\\x27\\x9a\\x1f\\x04\\xd5\\x41\\x9f\\xfe\\x0d\\xe8\\xfe\\x06\\x74\\x7f\\x53\\x26\\xf5\\x33\\xfd\\xb2\\x2f\\x84\\xe6\\x9e\\x83\\x12\\xdc\\xaf\\x14\\x2d\\x03\\xfe\\x46\\xf9\\x6c\\x34\\x41\\x9e\\xbc\\x44\\xfe\\x04\\x7a\\xe6\\xe0\\x23\\xed\\x14\\x74\\x73\\xaa\\xa3\\xe8\\xb6\\xd7\\x4a\\x5b\\xb6\\x99\\xcf\\xef\\xea\\xb1\\xb4\\x6f\\x41\\xeb\\x36\\x5d\\x30\\x55\\x87\\xc7\\xa8\\xec\\x78\\x84\\xed\\xf3\\x2b\\x33\\xc0\\x54\\x28\\x90\\x61\\x86\\xc3\\x63\\x16\\xe8\\x11\\xf1\\x9e\\x45\\x53\\x33\\x62\\xa1\\x25\\x93\\x80\\xb3\\x5e\\x9e\\x0e\\xfc\\xda\\xbc\\x83\\xb4\\x02\\xb2\\xe9\\x34\\xfa\\x5c\\xe7\\x55\\x91\\xd0\\x35\\x98\\x49\\xa0\\x6a\\x32\\x9b\\xcc\\xa7\\xa0\\x38\\x7b\\xa3\\x66\\x23\\x23\\x04\\x1b\\x32\\xdf\\x82\\x80\\x31\\xd8\\xd5\\x2b\\x92\\x5d\\xe4\\xc5\\x01\\x64\\xe0\\xb9\\x98\\x9f\\xde\\x2c\\x4d\\xe3\\x4f\\x63\\x18\\x01\\x1b\\x29\\xc7\\x6b\\x1e\\x39\\x74\\x60\\x30\\x74\\xbf\\xda\\x77\\x8f\\xea\\xa3\\x39\\x33\\x4c\\xfb\\x67\\xd7\\x32\\xac\\xad\\x16\\x54\\x07\\x8f\\xf8\\x0c\\xf5\\x43\\xe3\\xc8\\xdd\\x37\\x88\\xf2\\xd8\\x2e\\x45\\x51\\xc2\\x32\\x34\\x19\\x41\\xd3\\x39\\x66\\x1d\\x75\\x6d\\x21\\x44\\xa4\\x8f\\x2b\\x9a\\xb1\\xf1\\x94\\x62\\x0a\\x3a\\x7a\\xaf\\xc2\\xb1\\xc3\\x87\\xe0\\x0f\\xf8\\x08\\x38\\xa7\\x99\\x3d\\x9e\\x3f\\x99\\x8d\\x67\\x20\\xc6\\x33\\x40\\x07\\x80\\x88\\x3a\\x24\\x57\\x5f\\x6d\\xa4\\xd7\\xb0\\xa6\\x3c\\x14\\x01\\x6c\\xf9\\xa7\\xf3\\xd7\\x4d\\x1e\\xd8\\x44\\x9c\\x0c\\x9e\\xa7\\xcf\\xac\\x1a\\xd9\\xd5\\xb1\\x90\\x85\\x06\\x12\\xdc\\xd3\\x26\\x79\\x0f\\x2c\\x4d\\xb9\\x4a\\x7e\\x45\\x5d\\x84\\xe7\\x54\\x94\\x1e\\x3d\\x3f\\x84\\x9d\\xf3\\xec\\xeb\\x28\\x0e\\x22\\xeb\\xce\\xb3\\xfb\\x3e\\xdb\\xdd\\x2c\\x30\\x11\\xb7\\x49\\x4e\\xc9\\x88\\x65\\xef\\xb8\\xd9\\x58\\x02\\x0a\\xeb\\x15\\x22\\xa5\\x0b\\x58\\xbc\\x28\\xe9\\xca\\xcf\\x2a\\x50\\x5e\\x13\\x84\\xcb\\x58\\x7a\\x65\\x94\\x29\\x90\\xda\\x15\\x6a\\xc4\\x0d\\x85\\xf0\\x56\\x41\\xe4\\x5e\\x99\\xfa\\x51\\xc9\\x3f\\x98\\x2b\\x07\\xa4\\x1a\\xe2\\x07\\xe3\\x04\\xe0\\xa4\\xdf\\x46\\xb1\\x65\\xfe\\x69\\xb9\\x14\\xab\\x67\\x5e\\x81\\xe7\\x93\\x16\\x9a\\xbe\\x16\\xa8\\x8d\\xd5\\xf8\\xe6\\xa6\\xfa\\xfc\\x58\\xab\\xd0\\xef\\xb4\\x7c\\x84\\xf5\\xde\\x19\\x91\\x57\\x20\\xc4\\xed\\xd3\\x7b\\x8a\\xd7\\x4f\\x22\\x57\\xfe\\x70\\xf9\\xe3\\x00\\xe5\\x01\\x1a\\x92\\x8b\\x1c\\xd4\\xa7\\x0b\\xec\\xd6\\xad\\x13\\x08\\x39\\x5d\\x39\\xea\\x1c\\xd5\\x4a\\xf4\\xad\\x63\\x2b\\xdf\\xf5\\x87\\xc6\\xc4\\x18\\xce\\x86\\xc6\\xd4\\x70\\x66\\x10\\x66\\x21\\x60\\x66\\xb1\\xbe\\xd4\\x01\\x24\\x2e\\xb8\\x0c\\x48\\x78\\xe4\\x8a\\x6c\\x4b\\x40\\x00\\x5a\\xc7\\x18\\xc6\\xb8\\x6b\\x33\\x62\\xea\\xe5\\xb5\\x8b\\x5a\\x13\\xae\\x61\\xe1\\x3b\\x73\\x18\\x21\\x68\\x29\\x84\\x29\\xf8\\x43\\x27\\x02\\xf8\\x00\\xb6\\xcd\\xf5\\x1c\\x53\\x3d\\x62\\xba\\xc6\\xd3\\x56\\x73\\xe7\\xac\\x43\\x83\\x1b\\xc3\\x1d\\x35\\x3e\\xb8\\x9b\\x9a\\x4d\\xa6\\x2a\\xa5\\x6f\\x1c\\x18\\x96\\xf3\\x5f\\x0d\\x10\\x59\\xe3\\x48\\x9e\\x29\\x0a\\xe9\\xd5\\x17\\x56\\xdd\\xd8\\x8c\\x66\\xcc\\x96\\xd9\\x57\\x28\\xfc\\x60\\xf4\\xf0\\xda\\x12\\x60\\x1a\\x6f\\x75\\x52\\x9a\\x23\\x4b\\x7a\\x73\\x65\\xdd\\xf0\\xc2\\x0d\\xc8\\x55\\x4f\\x74\\xf1\\x24\\xb8\\xa4\\xa1\\x40\\x52\\xef\\xd0\\xe7\\x8e\\x60\\x9f\\x74\\x86\\x6a\\x2c\\x9e\\x84\\xe3\\x50\\x9f\\x85\\xce\\xc0\\xb1\\x85\\x53\\xdd\\x85\\x1b\\x68\\x13\\x77\\xe8\\xea\\x8c\\x40\\x43\\xc4\\x1f\\x62\\x6c\\xaa\\xb2\\x36\\x3b\\x9b\\x1d\\x4f\\x2d\\x4a\\xd4\\x8e\\x55\\x82\\x0b\\x78\\xee\\x6a\\x68\\x8c\\x2f\\x98\\x1e\\xc1\\x3b\\x2d\\xf8\\xcc\\x27\\x81\\xb4\\xa9\\xf8\\x23\\x19\\x02\\xa6\\xdb\\xa1\\xaa\\x48\\x33\\x26\\x68\\xd9\\x71\\xdd\\x62\\x1e\\x04\\x4e\\xe3\\xb8\\x87\\xf4\\xd8\\x05\\x61\\x3d\\xfc\\xcb\\x3b\\x9d\\x6e\\xba\\xa8\\x05\\xd8\\xbe\\xca\\x97\\xb0\\x91\\xe3\\xc6\\x35\\x95\\x91\\x40\\x28\\x02\\xbe\\x03\\x9f\\x3a\\xe8\\x04\\xbc\\x86\\x16\\x2a\\x18\\x43\\xb5\\x83\\x42\\xcc\\x7e\\xb1\\xce\\x04\\xb7\\x2a\\x32\\xd3\\xef\\x01\\x52\\x99\\xa0\\xb9\\x5a\\xb0\\x0c\\x2c\\xec\\xb2\\x23\\xa8\\x58\\xc1\\x79\\x8c\\x09\\x84\\x95\\x28\\xf2\\xe4\\x4a\\x98\\x29\\xa5\\xae\\x56\\x02\\xfd\\x12\\xbc\\xd4\\x9d\\xed\\x0f\\x75\\xfe\\x82\\x2c\\xa0\\xbe\\xeb\\xd4\\xc4\\xf8\\x29\\xc5\\xf8\\x00\\xac\\xd4\\xf9\\x0a\\xe5\\x01\\xdb\\x08\\x8b\\x5e\\x11\\x8f\\xca\\x6d\\x1e\\x8d\\x15\\x20\\x4d\\x59\\x97\\x1e\\x30\\xdc\\x78\\x5a\\xc6\\x61\\x26\\x13\\xa5\\x7b\\x77\\x5d\\x80\\x75\\x3a\\x3e\\x9c\\x5b\\x77\\xc2\\x0e\\xc5\\x4c\\x80\\x81\\x0c\\x21\\x48\\x12\\x74\\xc0\\x47\\x09\\xfe\\x39\\xb6\\x94\\x88\\x1e\\x62\\xb5\\xee\\x55\\x32\\xb9\\x03\\x0b\\x02\\xc8\\x0b\\x4e\\x27\\xa3\\xc8\\x51\\x35\\x64\\xd6\\xb0\\x7a\\xc7\\xc8\\x19\\x65\\x92\\x58\\xc2\\x23\\x06\\xe3\\xd4\\xa1\\xb9\\xe8\\xba\\xb3\\x04\\x26\\xc5\\xe2\\x7e\\x59\\xb4\\x55\\x86\\x13\\x23\\xf3\\xe7\\x7d\\x0e\\xb9\\xb0\\x3c\\xe0\\xa4\\x43\\x46\\x08\\xd3\\x03\\xaa\\x07\\xe8\\x9c\\x8e\\x0b\\xe9\\x3a\\x97\\x8f\\xf7\\xd1\\x60\\x2e\\xcd\\x84\\xd9\\x8f\\x28\\x9e\\x21\\xc5\\x33\\xe2\\x05\\xee\\xca\\xa5\\x0b\\x03\\x60\\x00\\x26\\x8f\\x42\\x2d\\x62\\xa7\\xb3\\xb1\\x8e\\xc0\\x8c\\x51\\xae\\xfa\\x45\\x8a\\xe0\\x18\\x99\\x2f\\x6f\\x1f\\xce\\xf9\\x31\\xaa\\x21\\x58\\xd1\\x47\\x60\\x3d\\xff\\x87\\x5d\\x72\\x02\\xd8\\x09\\xa8\\x78\\x0a\\xff\\x67\\x68\\x8e\\x2f\\x51\\xca\\xd3\\xb8\\x10\\xa8\\xfc\\x97\\x5a\\xd2\\x78\\x77\\x6b\\x15\\xed\\x89\\xda\\x5f\\xc5\\x44\\x8b\\x49\\x90\\x7e\\xa9\\xe4\\xf1\\xc7\\x5d\\xa2\\x7e\\x17\\x35\\xe7\\x86\\x1a\\x75\\x94\\x0f\\xd1\\x8f\\x54\\x16\\xad\\x7d\\xa4\\x0c\\x6e\\xd0\\xd1\\x05\\xda\\x87\\x05\\x15\\x29\\x85\\x70\\x32\\x69\\x19\\x48\\x45\\xd5\\x1c\\x1d\\xbf\\xf6\\xbd\\x8b\\x33\\xdb\\xe2\\x13\\x05\\x1b\\x00\\x1f\\x84\\x5e\\xe9\\xc9\\x0c\\xa8\\xb1\\x28\\xf2\\x6c\\x69\\x10\\x4c\\xd0\\xa5\\xe0\\x7a\\xdf\\xe4\\xd7\\xda\\xf5\\x6a\\xc7\\x86\\xa4\\xfa\\xf6\\x1f\\x67\\x6f\\x5e\\x95\\xe5\\xf2\\x5c\\x5e\\x02\\xa6\\xb8\\xda\\xce\\x97\\x02\\x43\\x1d\\x00\\x1d\\x51\\x1e\\x82\\x1f\\x59\\xaf\\x12\\x46\\x0e\\x65\\x0d\\xe1\\x2b\\xfc\\x2c\\xbd\\xa2\\xb8\\xce\\x57\\x78\\x42\\x03\\xe2\\x00\\xb1\\x76\\x78\\x0b\\x61\\x62\\x29\\xc0\\x7a\\x67\\x73\\xd1\\x0d\\x9b\\xfe\\x07\\x56\\x1a\\xda\\xd4\\xe2\\x23\\xb6\\x00\\x31\\x0b\\x31\\xa4\\x2c\\xd7\\xc5\\x13\\xfe\\x70\\x34\\xc2\\xeb\\x8c\\xf2\\xf5\\xf1\\xa3\\xd1\\x08\\xf0\\x4b\\xae\\x92\\x11\\x28\\x97\\x8e\\x81\\xcf\\x06\\x2b\\x09\\x9e\\x40\\xc8\\x82\\x68\\x46\\x8b\\x9f\\x6a\\x41\\x2f\\xdd\\x26\\x20\\x5f\\x98\\xaa\\x5a\\xc5\\x5e\\x12\\x7f\\x17\\x30\\x3d\\x86\\x7d\\xb6\\x74\\x22\\xf1\\xec\\x16\\xad\\x12\\xb2\\x05\\xb4\\xe0\\xe5\\xe9\\x85\\x64\\x93\\x5c\\x27\\x91\\x22\\x4a\\xc5\\x88\\x57\\x40\\xb2\\xa0\\x13\\x7d\\x3a\\x1f\\x39\\x44\\x36\\x1a\\xcc\\xc0\\x00\\x2c\\x96\\x97\\xac\\x8f\\x90\\xd1\\xe3\\x01\\x7a\\x2c\\xe8\\xc6\\xd7\\xe5\\xec\\xf0\\x7f\\x0d\\x8c\\xd4\\xc0\\x4c\\x6f\\x4e\\xbf\\xc4\\x36\\xbb\\x27\\x38\\x09\\x02\\xb1\\x2c\\x77\\x0c\\xcd\\x06\\x98\\xfa\\x39\\xfa\\x19\\xc6\\xdc\\xc8\\x27\\xb5\\x67\\x21\\x82\\xeb\\x32\\x33\\xc4\\xb4\\xa9\\x4a\\x52\\x22\\x97\\xb9\\x90\\xba\\x34\\xe3\\xdb\\x0b\\x95\\x2c\\x70\\xe5\\x0f\\x84\\x43\\x94\\x15\\x6e\\x4c\\xee\\x0c\\x8f\\x83\\x0f\\x0e\\x66\\xdd\\x94\\x36\\x02\\xb9\\x17\\xf9\\x2a\\x85\\xc8\\xc8\\x93\\x29\\x3c\\x43\\xad\\x63\\x80\\x63\\x74\\x6e\\x42\\x8b\\x18\\x74\\x63\\xd5\\xbd\\x13\\x3d\\xc8\\x57\\x03\\xdd\\xd7\\x1e\\x3c\\x8b\\x44\\x70\\x39\\x80\\x36\\x83\\xbf\\x1a\\x36\\xfd\\x35\\xc8\\x97\\x32\\x01\\x98\\x0d\\xfe\\x4a\\xf5\\x85\\xf4\\xbf\\x0c\\xad\\x42\\xc8\\xb7\\x0c\\xd3\\x2d\\x2c\\x54\\xf6\\xc1\\xd0\\x77\\x17\\x91\\x62\\xdf\\x0b\\x2e\\xbf\\x19\\x43\\x53\\x87\\x6e\\x96\\x3d\\x97\\x37\\xd7\\x4d\\x00\\x29\\x50\\x81\\xe7\\xc6\\x88\\x06\\x61\\x88\\x63\\x71\\xfc\\xaf\\x9f\\xe5\\xbb\\x97\\x85\\x79\\x0a\\xda\\xd0\\xde\\xe9\\x7d\\xf4\\x2f\\xf4\\xfe\\xdb\\xd9\\xa3\\x60\\x15\\xc3\\x0e\\x59\\x63\\x1f\\x7d\\x76\\x23\\xdc\\xe0\\xb0\\xa2\\xfb\\x32\\x8d\\x11\\xca\\xc1\\x0f\\x44\\x19\\x94\\xb9\\x00\\x34\\x51\\xd0\\x49\\x04\\x48\\x6d\\x8d\\xd9\\xc7\\x39\\xba\\x74\\x16\\x69\\x09\\xdf\\x91\\xaa\\xf8\\xa7\\xf9\\x7e\\xa0\\x19\\x77\\x52\\xcb\\x9c\\xff\\x3f\\x1a\\xb1\\xde\\xe4\\x7d\\xf5\\x30\\xef\\xa8\\x9b\\x63\\x90\\x15\\x1f\\xa4\\xde\\x25\\x6e\\x20\\x99\\x94\\x81\\xda\\x16\\x03\\x8c\\x74\\x43\\x2f\\xdb\\x3b\\x96\\x24\\x53\\x4a\\x71\\x8b\\x62\\x59\\x0b\\x41\\x05\\x27\\x23\\x32\\x34\\xe9\\xa7\\x17\\xea\\x3e\\x19\\xb9\\x00\\xe2\\x1c\\x7c\\xc4\\x6a\\xbd\\x9f\\x10\\xec\\xb8\\xbd\\x37\\xc7\\xd0\\x2f\\x86\\x84\\x9e\\xf3\\x21\\xf4\\x1b\\x02\\x54\\x27\\x29\\xc6\\x33\\x3f\\x8b\\x3d\\xb7\\xfd\\x3c\\xbc\\xc5\\x34\\x09\\xc8\\x8b\\x66\\x4d\\x6b\\x30\\x9f\\xea\\xc8\\x1b\\x4f\\x16\\x50\\x2b\\x78\\x57\\x2b\\x1a\\xcb\\xd9\\x1a\\xce\\x36\\xfb\\xb8\\x49\\xf6\\x63\\x20\\xdb\\x05\\xb2\\x0f\\x0c\\x40\\x9d\\x6b\\x04\\x5b\\xd4\\x46\\xaf\\x53\\xb8\\xe1\\x50\\x38\\xcd\\xe1\\x81\\x1c\\x91\\x07\\x5d\\x50\\xd6\\x92\\xf5\\xac\\xeb\\x40\\xbc\\x36\\x5e\\xf5\\x0e\\xbf\\x4f\\xbf\\x5e\\x43\\xc4\\x1a\\x53\\xec\\x0b\\x88\\xda\\x6f\\x33\\xad\\x98\\x67\\x7d\\xdc\\x84\\xa7\\x0d\\xd4\\x15\\x80\\x46\\xc3\\x69\\x13\\x8b\\x8d\\x3d\\xfa\\xc0\\x43\\xc6\\xaa\\x58\\x03\\xfb\\x26\\xf0\\x83\\x0a\\x91\\x88\\x52\\x0c\\xf0\\xa5\\x6e\\x08\\xc2\\xfe\\xcf\\xd9\\x29\\x7b\\xc1\\x5e\\xb2\\x57\\xdc\\x98\\xe4\\x94\\x47\\x18\\xc8\\x74\\xc2\\xd4\\x60\\xaf\\xdb\\x32\\xba\\x85\\x0a\\x45\\xbf\\xb4\\x45\\x52\\x89\\xa0\\xec\\x57\\xde\\x02\\x0c\\xf6\\x06\\xdc\\x73\\xa3\\x61\\xec\\x8c\\x1f\\x99\\xae\\x63\\xfe\\x59\\xfd\\x04\\x51\\xb3\\x05\\x21\\xfe\\x4f\\x5f\\xed\\xaf\\x93\\xaf\\x53\\x08\\xf3\\xad\\xca\\xfc\\x3a\\xb1\\x87\\xee\\xd7\\xa9\\x05\\xe1\\xf4\\x5b\\x7e\\xf4\\x75\\x62\\xc2\\xab\\x05\\xed\\xb9\\x69\\x54\\xff\\xaf\\xb2\\x28\\x5b\\xf0\\xf5\\xa1\\x05\\x4d\\x8e\\xd8\\x3b\\x7e\\xf4\\xa7\\x79\\x72\\x7e\\x7a\\x52\\x3d\\x3d\\xf9\\x78\\x5a\\x3d\\x3d\\xaf\\x9e\\xbd\\x7b\\x03\\xff\\x9f\\x9d\\x9d\\xbc\\x7d\\x5e\\x9d\\x9e\\x3d\\x3d\\x7d\\x5e\\xbd\\x3a\\xaf\\x5e\\x9f\\xbd\\xac\\x5e\\xbf\\x7d\\xff\\xe9\\xa2\\xfa\\xf5\\xf4\\xf3\\xcb\\xd3\\xb7\\xd5\\x9b\\xd7\\x6f\\x7f\\xad\\xce\\x4e\\x2f\\x4e\\xaa\\xf7\\x27\\xe7\\x27\\x67\\xd5\\xc7\\x77\\x9f\\xce\\x9f\\x9d\\x56\\x17\\xe7\\x27\\xcf\\x7e\\xad\\x7e\\x7f\\x7a\\x6e\\xed\\x1f\\xb1\\xf7\\x5d\\x41\\xae\\xc7\\x21\\xee\\x1a\\xdd\\xc0\\x66\\xe7\\xfc\\xae\\x23\\x5b\\x4e\\x17\\x39\\x7c\\xe0\\xf2\\x1e\\xe5\\x87\\x6d\\x03\\x12\\x95\\x69\\x82\\x9f\\x1d\\x3c\\x6f\\xbe\\xd6\\x39\\xd5\\x37\\x47\\xb7\\x8a\\xd0\\x4e\\xbb\\xcf\\xf5\\x96\\xa9\\x73\\x8b\\xed\\x9e\\x78\\x07\\xa5\\x2b\\xe5\\x9e\\x84\\x28\\x9d\\x48\\x01\\xc9\\x68\\x5e\\x6a\\xd6\\x4d\\x7b\\xf7\\xe8\\xa6\\x6e\\xfd\\xa1\\x6a\\xd6\\xf6\\x74\\x26\\xd3\\x9a\\x7d\\xc4\\xcb\\x8a\\x17\\x98\\xac\\xd2\\x19\\xb6\\x1e\\xf6\\x61\\x4d\\x26\\x5e\\x7e\\x60\\xb3\\xe7\\x6d\\xdf\\x8c\\x3b\\xcd\\x8a\\xf5\\x4a\\x90\\xdd\\x7f\\xfe\\xee\\x4c\\xdf\\x7f\\x03\\x37\\x81\\xf6\\x05\\xf1\\x84\\x08\\x07\\x65\\x3e\\x48\\x65\\xd4\\x7e\\x94\\xca\\x84\\xc9\\x51\\xaa\\xe6\\x1b\\xc4\\x05\\x5d\\x95\\x03\\x1b\\x2e\\x66\\x71\\x06\\x30\\xd4\\x90\\x7b\\x32\\xa7\\x28\\x09\\xc3\\x6e\\x3c\\x6c\\x06\\xb4\\x18\\x41\\xa4\\x41\\xe7\\xce\\x1b\\x1c\\x73\\xcf\\x1d\\x6f\\x8c\\xe0\\x97\\x76\\x03\\xfd\\x99\\xbc\\x73\\xe4\\xab\\x8f\\x85\\xa8\\xb8\\xf9\\x5a\\xa8\\xbd\\x90\\xe3\\xd7\\x18\\x6e\\x81\\xad\\xa3\\xed\\x8d\\xcd\\x45\\x87\\xad\\xf8\\x61\\x92\\xbc\\xe9\\x80\\x51\\x9b\\x6c\\x36\\x03\\xc4\\x4b\\xa9\\x44\\xbc\\x80\\xe1\\x53\\x99\\xbc\\x71\\xa1\\x0a\\x45\\x1b\\xc6\\x5e\\x02\\x96\\x4d\\x20\\x5c\\x53\\x3a\\x9c\\x3c\\xb9\\x1c\\x5f\\x82\\x1e\\x8b\\xc9\\xe5\\x14\\x71\\x3d\\xc0\\x36\\x3c\\x27\\xdf\\x85\\x4f\\x3d\\x02\\x6f\\xca\\x6d\\x79\\x68\\xfc\\xf5\\x99\\x3a\\x05\\xfe\\xd8\\x17\\x63\\xc0\\x1d\\x5d\\x55\\x80\\xe5\\x35\\xde\\xde\\xeb\\x07\\x58\\xde\\x46\\x80\\x25\\x91\\x2e\\xc6\\x10\\x10\\x1f\\x02\\x4e\\x45\\xf1\\x20\\xc6\\x7f\\x62\\x78\\x81\\x9d\\xfd\\x8e\\x7f\\xfe\\xc0\\x3f\\x4d\\x06\\x75\\xa4\\x92\\xc1\\x2a\\xb7\\xca\\x3c\\xba\\xeb\\xea\\xfb\\xfc\\xf8\\x5f\\x20\\x3f\\x81\\x8e\\xa3\\x77\\xad\\x0b\\xb3\\xef\\x3f\\xc8\\x83\\xe3\\xba\\x48\\x2e\\x38\\xe5\\x75\\xd6\\x89\\xd8\\xc0\\xe0\\xf7\\x08\\xdf\\xfb\\x44\\x00\\xf2\\x1d\\x88\\xdd\\x32\\x28\\x6e\\xe2\\xa2\\x2c\\x06\\xf2\\x1c\\x66\\x20\\xe5\\x0d\\xa5\\xd2\\x6b\\x2f\\x71\\xc6\\x19\\xc8\\x66\\x5c\\x6a\\xa1\\x0b\\xf8\\x6f\\xdd\\x83\\x8c\\xd1\\x13\\x54\\x7c\\x2c\\xdc\\xfc\\x4a\\x25\\x64\\x33\\xfc\\xee\\x64\\xce\\x37\\x0f\\xd7\\xba\\xa9\\x4a\\xdc\\xb2\\x7d\\x2e\\x99\\x55\\x83\\xbf\\x94\\x27\\x68\\x98\\x28\\x1c\\x47\\x20\\x0e\\xf8\\xe5\\x14\\xdd\\x54\\x95\\x0c\\x09\\x3b\\xf9\\x6f\\x36\\x47\\x04\\xde\\xc9\\x87\\xf7\\xce\\x09\\x09\\xd5\\x75\\x8e\\xe6\\xb6\\x07\\xde\\xd5\\xb3\\x99\\x4e\\x9d\\xd6\\xf9\\x4a\\xa9\\xff\\xa0\\xd3\\x51\\x25\\x16\\xf8\\xb2\\x71\\x92\\xd8\\x2b\\xc2\\x40\\x79\\x6f\\x86\\x21\\xf4\\x56\\x0e\\x1d\\x6f\\x7b\\xee\\x3e\\x57\\x62\\xbf\\xc1\\x10\\x10\\x74\\x6d\\x1d\\x94\\x3c\\x24\\x35\\x2d\\xd6\\x7e\\xd0\\x66\\xa9\\xee\\x15\\x93\\x87\\x96\\xca\\x83\\xc7\\xfc\\x13\\xf7\\xf1\\x34\\xbb\\x7b\\xfa\\xd1\\x35\\xec\\x35\\x58\\x0b\\xbf\\x7f\\x9e\\x03\\x91\\x26\\x8a\\xcd\\x42\\x3b\\x69\\x4c\\xc6\\xe1\\xa5\\x63\\x5c\\x1c\\xbf\\x64\\xbf\\xe3\\x8f\\x8f\\x97\\x84\\x81\\x5a\\x2c\\xab\\x6b\\x75\\x5f\\x12\\x13\\xab\\x7a\\xb1\\x3d\\xc1\\x0e\\x80\\x00\\xbc\\xa8\\x08\\x7b\\xfc\\x19\\x80\\xf7\\x9e\\xbc\\x26\\xf3\\x02\\x6f\\x58\\xdc\\xf7\\xe1\\xa5\\x86\\xb1\\x87\\x5f\\x9e\\xf8\\x3e\\x26\\xc2\\x3e\\xe3\\xc7\\x6c\\x2f\\xcd\\xcf\\x78\\x4a\\xf1\\xc2\\x5c\\x82\\x2a\\x41\\x64\\x6d\\x2e\\x4d\\xf9\\xde\\x59\\x92\\x54\\xc1\\x9a\\x1a\\x30\\x22\\x8a\\x54\\x66\\x63\\x0f\\x74\\x82\\x48\\xb2\\x29\\xc4\\x73\\x9a\\xed\\xed\\xe8\\xba\\xc0\\xd0\\x1f\\x0e\\x71\\x1c\\x74\\x11\\xf7\\xb5\\xe0\\x04\\xaa\\x53\\xef\\xc6\\x0c\\xfd\\x43\\x30\\x77\\x16\\xc3\\x2b\\x1e\\x78\\x81\\x4f\\xcf\\x6f\\x2a\\xc3\\x21\\x7a\\x87\\x79\\x46\\x06\\x1b\\xba\\xfb\\xc2\\xae\\x8b\\x43\\x1d\\xde\\x7f\\x0e\\x63\\x39\\x9b\\x24\\xe1\\x14\\xc2\\xbe\\x86\\xd0\\x00\\x2f\\x2a\\xfc\\xc3\\xfd\\xaf\\xde\\x11\\x68\\x73\\x0a\\xb3\\x91\\x11\\x47\\xef\\x38\\xf6\\x4d\\x8f\\xae\\xcc\\xb8\\xe1\\xc4\\x9b\\x3a\\x21\\x46\\x17\\xed\\x45\\x08\\x0f\\x6f\\x82\\xc9\\x83\\x17\\x9f\\xcd\\x7d\\xbc\\xa4\\x7f\\xa7\\xf3\\xe6\\x00\\x00\\x19\\x65\\x9a\\x8d\\x9f\\x0c\\x26\\xb3\\xe4\\x08\\x74\\x6b\\xbc\\x8a\\xff\\x9e\\x2d\\x48\\x6a\\x9a\\x04\\x0b\\x39\\xbe\\x2e\\x6b\\x40\\xe9\\x90\\x87\\x9b\\xea\\xa0\\x4f\\x3e\\xe6\\x3e\\xaa\\xe5\\xa3\\x1d\\x2d\\x5a\\xdb\\xde\\x9c\\x86\\x1e\\xd3\\x77\\x76\\xbf\\xa8\\x6f\\x77\\x7b\\xc7\\xa4\\x2c\\xe0\\xdd\\x76\\xe0\\xd2\\xda\\xd7\\x87\\x53\\xba\\xd1\\xa9\\x69\\xf2\\x75\\x3a\\x75\\xee\\xf3\\xbf\\x11\\x15\\xa1\\xbd\\xc5\\xe3\\x2c\\xb0\\x73\\x96\\xbc\\x05\\xe2\\xff\\xd0\\xf5\\x87\\xd2\\xfc\\x0d\\x68\\xad\\x03\\x02\\xba\\xa2\\x18\\x80\\x04\\x0c\\xc0\\xa8\\x60\\x03\\xaa\\x28\\x06\\xca\\xc9\\xd3\\x07\\xb8\\x92\\x31\\x60\\x79\\x17\\xa4\\x45\\xfa\\x9c\\x00\\x42\\x0f\\x10\\x32\\xe2\\xa1\\xe6\\x3f\\x97\\xb9\\xff\\x8d\\xc3\\x0a\\xd7\\xc8\\x33\\x2c\\x97\\xc9\\x09\\x80\\xec\\x00\\xf2\\xf3\\x25\\xe5\\x2b\\x0c\\x08\\xe9\\x66\\xd3\\x2e\\xcf\\x25\\x7b\\x4e\\xfb\\x87\\x0d\\xe3\\x1f\\x1c\\x84\\x98\\xde\\x90\\x9f\\xaa\\x13\\x10\\x0b\\xf6\\x7f\\x8f\\xe3\\xa1\\x20\\x5e\\x5b\\x25\\x20\\xb5\\xcf\\x4b\\x3c\\x55\\x9b\\xea\\x84\\x21\\x1e\\xf2\\x74\\x78\\x6f\\x7b\\x61\\x78\\x8a\\xf2\\xf7\\x06\\x5c\\x90\\xc8\\xd0\\x06\\xf5\\xab\\xcb\\xd2\\x0b\\x22\\x6a\\xa1\\x0f\\x1c\\x7a\\x5b\\x17\\xf1\\xde\\x1e\\xb3\\xee\\xce\\x75\\x5e\\xf0\\xb3\\xdf\\xb9\\x8d\\xb7\\x8f\\x00\\x4a\\x37\\x6b\\xd9\\xdb\\xe0\\xd3\\xa9\\xdd\\x91\\x5b\\x6b\\xb8\\x79\\xe4\\x32\\x8c\\xd4\\x3d\\x49\\x1c\\x87\\xcd\\xb7\\x48\\xc7\\xef\\x75\\x65\\x4c\\xda\\x2b\\xc6\\xcb\\x4c\\x31\\x04\\x6d\\x0c\\xd0\\xd2\\x76\\xa7\\x4e\\x2d\\x98\\xb4\\xb9\\x1d\\x8a\\x66\\xc1\\x78\\x2b\\xac\\xd7\\xb5\\xdc\\x5d\\xd5\\x72\\x76\\x4b\\xea\\x47\\x5d\\xa9\\x8f\\x41\\x6a\\xc7\\x20\\xb8\\xdd\\x6a\\xf9\\xd5\\x44\\x4f\\xfe\\xe9\\xf2\\xe8\\x25\\xb4\\xed\\x85\\x7b\\x80\\xd3\\x2e\\xf1\\x92\\xe4\\x95\\x39\\xd7\\x1f\\x46\\x5f\\x0e\\xd5\\x51\\x97\\xf6\\xb0\\x29\\x8a\\xeb\\xc2\\x4a\\x26\\xe9\\x94\\x2f\\xe0\\x0f\\x0d\\x9e\\x41\\x70\\x98\\x58\\x2c\\x97\\xdd\\x9b\\xce\\x23\\x76\\x69\\x39\\x40\\x4f\\x06\\x12\\x04\\x34\\xe5\\x43\\xf3\\x10\\x6f\\x33\\xe6\\xbd\\x49\\x75\\x84\\x69\\x0d\\x33\\x69\\xab\\x97\\x7c\\xa7\\xbe\\xbb\\xdd\\x6d\\x77\\x36\\x95\\x7e\\x6f\\x54\\x55\\x71\\xb7\\x17\\xae\\xdb\\xb7\\xc1\\xb0\\x95\\xf9\\xea\\x96\\xf2\\x8e\\x94\\x9a\\x73\\x4d\\x14\\xd6\\x6f\\x5d\\x6d\\x68\\x5a\\x4d\\x96\\xae\\xa1\\x42\\x12\\x6a\\x0b\\x64\\x35\\xfd\\x8c\\x29\\x61\\x4a\\x88\\x51\\xca\\xb8\\x4c\\x04\\xdb\\x92\\x9b\\x39\\x9e\\x25\\x80\\x3e\\xec\\xaa\\x80\\x4d\\xdf\\x50\\x36\\xe0\\xfc\\xbd\\x8d\\xeb\\x5a\\xab\\x3f\\x26\\x42\\xbc\\xb4\\xe7\\x69\\xd1\\x16\\xcd\\x76\\x98\\x9f\\xcf\\xf9\\x5a\\x7e\\x84\\x83\\xc2\\xa1\\xcd\\x89\\xd9\\x7c\\x80\\xa3\\x4c\\xd2\\x39\\x96\\x32\\x65\\x7f\\x2c\\x0d\\x06\\xb1\\x0b\\x42\\xc1\\xb4\\x3b\\xab\\x69\\x19\\x4d\\x14\\x3f\\xf3\\xc1\\x25\\xb4\\x54\\x21\\xa9\\xdc\\x90\\xd6\\xc0\\x68\\x4a\\xfd\\x35\\x04\\x0c\\x1f\\xd6\\x62\\x75\\x2b\\x11\\x3b\\x5f\\x77\\x97\\x51\\x88\\x6e\\xd5\\x15\\x6b\\x53\\xed\\xdb\\x86\\x89\\xb2\\xcb\\xed\\xb1\\x8e\\xce\\x80\\xe3\\xd1\\x8d\\x7a\\xb6\\x24\\xfa\\xdf\\xcc\\xd6\\x6f\\x72\\xaa\\x89\\xda\\x89\\x49\\x53\\xb4\\x6b\\x4d\\x3c\\x40\\x07\\xce\\x9d\\xdc\\x5f\\xe7\\xa3\\x77\\x9d\\x9b\\x90\\xdd\\x8e\\x2c\\xc5\\x6d\\x9a\\xb2\\xb8\\xcd\\x82\\xde\\x34\\x4d\\x7e\\xc3\\xdf\\xed\\x80\\x45\\x53\\x34\\x07\\x26\\x72\\xc1\\x08\\x2a\\x71\\x43\\x66\\xc5\\x0d\\x89\\x20\\x0e\\x0f\\x67\\x94\\x33\\x56\\xcb\\x43\\x60\\x19\\x02\\xf0\\x82\\x5f\\xbc\\x8a\\x52\\x4b\\x34\\x6e\\xa8\\xdc\\xba\\x01\\xce\\xab\\x5d\\xbb\\x89\\x87\\xf8\\xfa\\xe2\\x1e\\x60\\xf0\\xf6\\xeb\\xd9\\x99\\xba\\xd9\\xa6\\xbf\\xa7\\x68\\x40\\x32\\x42\\xe4\\xe8\\xb1\\xae\\x20\\x94\\xec\\x01\\x5c\\x96\\xe7\\x62\\x20\\x94\\xe4\\x73\\xe8\\x17\\x8f\\x23\\xe5\\x11\\x50\\x93\\xd8\\x9f\\xb4\\xff\\x0a\\x41\\x43\\xaf\\x84\\x5f\\x04\\xf3\\x7a\\xbc\\xf1\\x6c\\xcc\\x64\\xcd\\x29\\x29\\xb9\\x27\\x43\\xc8\\x9d\\x57\\xad\\xe4\\x41\\x20\\x6d\\x3b\\xfa\\xe9\\x26\\x31\\xd5\\x64\\xab\\xf8\\xfd\\x79\\x7e\\xf4\\xe4\\x9d\\x4c\\x78\\xe0\\x7e\\x77\\x3a\\xef\\x55\\xd5\\xcf\\xfc\\x11\\xaf\\xba\\xa9\\x6b\\xd9\\xbe\\x53\\xa2\\x7a\\x90\\xc8\\xe2\\xd5\\x08\\x77\\x57\\x60\\x6a\\x77\\x93\\x8b\\x35\\x0c\\x00\\x3f\\x2b\\xfa\\x9e\\x74\\x47\\x6b\\x82\\x37\\xbd\\x1e\\x0d\\x82\\x99\\xf5\\x52\\xe7\\x2e\\x5a\\x18\\x67\\x63\\xf0\\x56\\x0f\\x64\\x06\\x8f\\x37\\x47\\x16\\x55\\x45\\xd9\\x3d\\xab\\x7f\\xe5\\x40\\x1e\\x64\\xf0\\x67\\x32\\x09\\xc9\\x24\\xdb\\xa0\\x94\\x63\\x5a\\x50\\xbe\\xe1\\xc9\\xa7\\x4e\\xdc\\x72\\x6f\\x5b\\x79\\x02\\x79\\xc4\\xb6\\x85\\x1b\\x4d\\x99\\xde\\xc5\\x1c\\x81\\x8d\\x21\\x92\\x0b\\x53\\x64\\xd7\\x2b\\x6f\\xf9\\x71\\x1d\\x04\\xa2\\x28\\x1c\\xfd\\x4e\\x7a\\x63\\x55\\xd5\\x77\\xbc\\x8f\\x6d\\xce\\xcc\\xb9\\x09\\x1d\\x08\\x6b\\x32\\xcf\\xa2\\xf3\\x59\\x7a\\x21\\xf9\\xdc\\x18\\xb3\\x73\\xfd\\x32\\x52\\xff\\x68\\x82\\x27\\x2b\\x9a\\x6b\\xcc\\xf8\\x01\\xce\\xe3\\xa8\\xf9\\x58\\x0b\\xa4\\x17\\x6f\\x40\\x93\\xf8\\xc8\\xa6\\x66\\x44\\xf7\\x9e\\x55\\x4e\\xb2\\x24\\x41\\x32\\xa3\\x5e\\x03\\x0b\\xf3\\xdc\\x9b\\xcb\\x69\\x14\\xcc\\xd1\\xda\\x39\\xc5\\xc4\\xaa\\x3c\\x25\\x0c\\x76\\x1e\\x95\\x06\\xa0\\x28\\xfa\\x80\\x2b\\xb0\\xea\\x9d\\x02\\xbf\\x85\\xde\\x19\\x1e\\x69\\x41\\xbf\\xd6\\xb0\\x35\\xcf\\x74\\x4d\\x3f\\x2e\\x41\\x14\\xe9\\x26\\x4b\\xa7\\x95\\xb4\\x77\\xcb\\x62\\x57\\x42\\x21\\x84\\xc0\\xd1\\xab\\x2a\\xbc\\xdd\\xab\\x9b\\xd9\\x33\\x0f\\xad\\xda\\x2d\\x44\\x9a\\xa2\\x36\\x8d\\x26\\xa3\\x04\\x78\\x48\\x45\\xb7\\xd7\\xe0\\x84\\xf3\\x6b\\x57\\xfe\\x38\\xf8\\x71\\xe5\\xae\\x56\\x32\\x01\\xd1\\x7c\\x0e\\xae\\x5f\\xe5\\x2f\\x88\\xfd\\x32\\x5f\\x95\\x85\\xdb\\x7f\\xe5\\xa9\\xb3\\xe3\\xf0\\x55\\x0e\\x7d\\x70\\x20\\x7f\\x6d\\x2f\\x0d\\xf5\\xb3\\xb9\\x7d\\x06\\x90\\x02\\x39\\x0f\\x8e\\x8e\\x7e\\x1a\\x14\\xf9\\x7a\\x15\\x88\\x33\\x6f\\xb9\\x04\\x05\\xfe\\x74\\xfe\\x86\\xeb\\x7f\\x5b\\x28\\x8d\\x33\\x7b\\x51\\xe0\\xa1\\xfc\\x83\\xff\\x0b\\x00\\x00\\xff\\xff\\x5e\\x87\\x38\\xfe\\x9a\\x48\\x00\\x00\")\n\nfunc uiJsLibsMithriljs020MithrilMinJsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiJsLibsMithriljs020MithrilMinJs,\n    \"ui/js/libs/mithriljs/0.2.0/mithril.min.js\",\n  )\n}\n\nfunc uiJsLibsMithriljs020MithrilMinJs() (*asset, error) {\n  bytes, err := uiJsLibsMithriljs020MithrilMinJsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/js/libs/mithriljs/0.2.0/mithril.min.js\", size: 18586, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiJsLibsMithriljs020MithrilMinJsMap = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xac\\xbc\\x5b\\x53\\xea\\x4e\\xdb\\x27\\xfc\\x5d\\x56\\xdd\\x67\\x5a\\x8f\\xa2\\xe2\\xe6\\x7e\\x8f\\x92\\x4e\\x08\\x31\\x46\\x84\\x88\\xc8\\x7a\\x6b\\x6a\\x0a\\x21\\x42\\xd8\\x04\\x0c\\x01\\xd1\\xa9\\xf9\\xee\\xd3\\xd7\\xef\\xd7\\x21\\x41\\x5d\\xff\\x7b\\x3d\\x53\\xb3\\x0e\\x96\\x49\\x77\\xa7\\x37\\xd7\\x7e\\xd7\\xfc\\xaf\\x5f\\xdb\\x38\\x5b\\x27\\xcb\\xf4\\xd7\\xbf\\xcf\\x8f\\x7f\\xbd\\x26\\xf3\\xf8\\xd7\\xbf\\x7f\\x2d\\x92\\x7c\\x92\\x25\\xf3\\xff\\x5a\\x24\\xe9\\x7f\\x4d\\xd7\\xbf\\x8e\\x7f\\xad\\x97\\x9b\\x6c\\x18\\xaf\\x7f\\xfd\\xfb\\xff\\xdf\\xf7\\xe9\\xf6\\xff\\x71\\xfc\\x2b\\x1d\\x2c\\x4c\\xb3\\x1e\\x35\\x58\\xad\\xf4\\xff\\xef\\x49\\x3a\\x5a\\xbe\\xeb\\x87\\x4d\\x3a\\x8a\\x5f\\x93\\x34\\x1e\\xe9\\xe7\\x24\\x4d\\xf2\\x64\\x30\\x4f\\x3e\\x63\\xfd\\xf2\\xaf\\xd1\\x72\\xb8\\x59\\xc4\\x69\\xae\\x9f\\x2b\\x8f\\xff\\x9a\\x2f\\x87\\x83\\x5c\\xb6\\x72\\xfc\\xab\\xf2\\xf8\\xaf\\xe1\\x20\\x1d\\xc6\\x73\\x2b\\x4d\\x16\\x68\\x6a\\x64\\x7a\\x4d\\xdd\\xfe\\xa7\\xe6\\x79\\x3c\\xc8\\x1e\\x93\\x45\\xbc\\xdc\\x60\\xd2\\x2c\\x7e\\xdb\\xc4\\xeb\\xfc\\xdb\\xb8\\x3f\\xb5\\xaf\\xe3\\xbc\\xfc\\x5a\\x77\\x0d\\x27\\x72\\xb2\\x6c\\x0c\\x30\\xcc\\x93\\x21\\x97\\x9e\\xcf\\xd9\\x8a\\xbd\\x4b\\xd7\\x64\\xb0\\xb6\\xf2\\x3c\\x93\\xc7\\xfc\\x63\\x25\\x83\\x5a\\xf6\\xad\\xab\\x1e\\x65\\x98\\x69\\x1f\\xce\\x07\\x6b\\x0c\\xba\\x37\\x3b\\x8d\\x31\\x4b\\x3e\\x18\\x17\\x9d\\xb1\\x0c\\x8b\\x1e\\x3b\\xfe\\xbd\\xa7\\x1f\\xdc\\x2c\\x5b\\x66\\xfa\\xef\\x6a\\x90\\xad\\x63\\x79\\x88\\x77\\xf1\\x50\\x60\\x29\\x00\\x5d\\x6d\\xd6\\x13\\xf4\\x25\\x99\\x59\\xe2\\xa1\\x18\\x36\\x9c\\x24\\xf3\\x51\\x16\\x03\\x8c\\x71\\x3a\\xce\\x65\\x9c\\xd5\\xe9\\x58\\x7d\\x33\\xd0\\x2c\\xaf\\x77\\xdc\\x7a\\x4f\\x1f\\xb2\\xe5\\x2a\\xce\\xf2\\x0f\\xdd\\x30\\x5d\\x26\\xf2\\xcd\\xcb\\x46\\x7f\\xce\\x65\\xf5\\xd9\\xdc\\x79\\x6c\\xd0\\xc3\\xf7\\x47\\xec\\x96\\xcf\\x6a\\x30\\x9c\\xc4\\xfb\\x37\\x5f\\xa3\\x7b\\x27\\x18\\x1d\\xe4\\x03\\xc0\\x48\\x77\\xca\\x3c\\xeb\\xc9\\x72\\x33\\x1f\\x75\\x62\\xbd\\xf4\\x00\\xc0\\x4c\\xcc\\xc0\\x78\\x94\\xe4\\x83\\x97\\xb9\\xcc\\x00\\x32\\x5a\\x0d\\x08\\xdc\\x65\\xfa\\x9a\\x00\\xdc\\xf9\\x32\\xca\\xb3\\x24\\x95\\x05\\x81\\x99\\xcd\\x4b\\x9e\\xc5\\xf1\\x7e\\xee\\x47\\xc2\\x59\\xd6\\x33\\x8f\\xe9\\x72\\x04\\x10\\x2e\\x5f\\x5f\\x35\\x1a\\xe5\\xb3\\x74\\x54\\x90\\x04\\x67\\x5e\\xe7\\xd9\\x66\\x98\\x03\\xac\\x09\\xe1\\xc3\\x76\\x4d\\x6d\\x24\\xe0\\xf9\\x07\\x76\\xa8\\xb7\\x9a\\x73\\x49\\x2b\\xcb\\x06\\x1f\\x6a\\xb9\\x01\\x0c\\x1c\\xf7\\xce\\x7d\\xf4\\x5b\\xf7\\xfa\\xd1\\xbf\\x8f\\xdc\\x8e\\x79\\x0e\\x5b\\x4f\\x2e\\xf0\\x93\\xac\\x73\\xee\\x97\\x87\\x0e\\x07\\x32\\x53\\x92\\xfa\\x23\\x0d\\x1f\\xcd\\x00\\xd8\\xdc\\x2c\\x96\\x25\\xf4\\xfc\\x24\\xef\\xf1\\x06\\xf8\\x9c\\xb2\\x67\\xed\\x24\\xaf\\xaf\\xc4\\x22\\xce\\xa8\\x48\\x23\\x72\\x46\\xf3\\xf8\\x9a\\x2d\\x85\\xd7\\xe2\\x3d\\x5e\\x86\\x99\\x06\\x6d\\x5c\\xe2\\x89\\x33\\xcb\\x4a\\x2b\\x8d\\x5b\\xd0\\xc3\\x20\\x1d\\xc7\\x64\\xe3\\x2c\\x37\\x7f\\xd4\\xbe\\x31\\x8d\\xdf\\x55\\x81\\x2b\\x1c\\x76\\xff\\x89\\x0c\\x5d\\x19\\x92\\x1f\\x6d\\x16\\x0b\\x82\\x46\\x13\\x59\\x6e\\xc7\\xaf\\xcb\\x2c\\x2e\\x68\\xed\\xde\\x80\\x1d\\x5b\\x2e\\x40\\x95\\xe4\\xb1\\xec\\xf3\\x5f\\x1a\\xe0\\xeb\\x1c\\x93\\x0b\\x76\\xf6\\xd4\\x72\\xcf\\x17\\xd0\\x42\\xeb\\x55\\x3f\\x6d\\x93\\xf8\\x7d\\x4d\\x64\\xe4\\xd9\\x72\\x3e\\x8f\\xc1\\x33\\xd2\\x2a\\xb3\\x2c\\xb3\\x64\\x9c\\xa4\\x83\\xf9\\xc1\\x80\\x82\\xe2\\xb2\\x78\\x94\\x0d\\x64\\x98\\xc6\\xae\\x06\\xc5\\xf8\\xe3\\x60\\x14\\x56\\x06\\x20\\x56\\x9a\\x1c\\x34\\x7a\\x3a\\xe4\\x7c\\x10\\x4a\\xba\\x49\\xe7\\xcb\\xc1\\x08\\xd2\\x4a\\x1e\\xb8\\xaa\\x3e\\xfd\\x88\\x5f\\x0a\\xe0\\x85\\x65\\x03\\x8d\\x1a\\xe1\\xe9\\x97\\x69\\x0c\\xc2\\x98\\xf1\\x5d\\xf3\\x90\\xe9\\x21\\xd5\\x2a\\xbd\\x6a\\xbc\\xcb\\xb1\\x27\\x41\\xbc\\x7e\\x68\\x74\\xef\\x95\\x21\\x93\\x55\\x16\\x6f\\xf5\\xd1\\x9d\\xf8\\x75\\xb0\\x99\\x03\\x46\\xeb\\x7b\\x1c\\x6f\\xb7\\x98\\x03\\x61\\xc9\\xfa\\x2b\\x3e\\xef\\x23\\x8a\\x24\\xd9\\x43\\xf2\\xb2\\xc9\\xe3\\x02\\x44\\xba\\xaf\\xc2\\x3f\\xff\\x5a\\x82\\x65\\xb7\\x83\\xf9\\x26\\x2e\\x06\\x60\\x1b\\x22\\xa9\\x5e\\x06\\xc3\\x19\\x40\\x2d\\x7b\\x6f\\x3e\\x86\\x77\\xfb\\x45\\x1e\\xf5\\x20\\x83\\x08\\x41\\x8e\\x11\\x0c\\xdb\\x65\\x32\\x32\\xcb\\xaf\\x8b\\x49\\x81\\x22\\xa1\\xac\\x6d\\x85\\xd2\\x92\\x34\\x8d\\x33\\x33\\xa1\\x7c\\x5f\\xe1\\xc2\\x27\\xb3\\x13\\x91\\x04\\x2f\\x15\\x38\\xee\\xc9\\x64\\x54\\xbc\\x15\\x3d\\x07\\x1d\\xf2\\xe5\\x46\\xb3\\x69\\x81\\xd8\\x6c\\x83\\x63\\xae\\xf3\\x8f\\x79\\xfc\\x05\\x20\\xdf\\x20\\xa4\\x5f\\xb5\\x30\\x59\\x0f\\xc6\\x94\\xf2\\x8b\\xe5\\x36\\x56\\x13\\x8a\\xb4\\x3d\\xb2\\x87\\xa6\\x21\\xd5\\x00\\x88\\x92\\x97\\x39\\x99\\x36\\x59\\x57\\xa4\\xdd\\x5c\\x4b\\xa3\\x89\\x06\\x2b\\xc8\\x80\\x54\\x6f\\x8d\\xa6\\xba\\x31\\x2d\\x60\\xb8\\x2c\\x88\\x01\\x58\\xc5\\xf6\\x06\\x9a\\xb1\\x96\\x8b\\xd5\\x26\\x2f\\x94\\x97\\xa6\\xb8\\x46\\x92\\xad\\xbf\\xb4\\x8e\\xe3\\x5c\\xb8\\x19\\x6c\\x17\\x40\\x1c\\x08\\xcc\\x0a\\x71\\xaa\\x7b\\x73\\x4d\\x87\\xf8\\x1f\\xb3\\x92\\xd5\\xf2\\xe5\\x6d\\x44\\x32\\x1a\\x88\\xaa\\xd2\\x9d\\xd4\\xa6\\x43\\x3d\\xf5\\x32\\xe5\\x0e\\xf2\\x09\\x49\\x28\\xcf\\x84\\x53\\xb4\\x0e\\x5b\\x41\\x8d\\x0d\\xb1\\x7a\\xfc\\x90\\xc5\\x1d\\x40\\xb4\\xb9\\x5c\\x0a\\x45\\x64\\xcb\\x65\\x6e\\xfe\\xac\\xab\\x13\\xc9\\xcb\\xbf\\xfe\\x65\\x74\\x9e\\x66\\x56\\xc2\\xa0\\x98\\x64\\xb9\\xce\\x0f\\x66\\xd1\\x8a\\xcb\\x34\\xf8\\xa3\\x83\\x57\\xa5\\x69\\x4f\\x54\\xa9\\xc8\\xcd\\x41\\x4e\\xca\\xc8\\x16\\x30\\x02\\x3a\\x4b\\x22\\x2a\\x33\\x7f\\x17\\x46\\x82\\x2c\\x48\\x8c\\x68\\xb6\\x3f\\x0a\\x22\\xc2\\x2b\\x35\\x21\\x94\\x19\\xde\\x1f\\x04\\x0a\\xf2\\x8d\\x66\\xe6\\xec\\x23\\x12\\xd0\\xff\\x32\\xba\\xb2\\xcd\\x16\\xa3\\x3a\\xb4\\x0c\\x5f\\x83\\xa2\\x16\\x46\\x32\\x41\\xa9\\x63\\xbe\\x4e\\x3c\\x76\\x77\\x2b\\x1c\\x12\\xf8\\x16\\x08\\x6a\\xc9\\x50\\x10\\x3d\\xc8\\x33\\x1e\\xea\\x3d\\x75\\x3b\\xbe\\xaa\\x80\\x19\\x1b\\xe8\\xa6\\xcb\\x17\\x11\\x6e\\x9a\\x25\\x0c\\xc8\\x89\\x4a\\x8d\\x9a\\x01\\x9f\\xde\\x27\\x09\\x14\\x9e\\x96\\x05\\x9b\\x2c\\x2d\\x4e\\x33\\xdc\\x64\\x54\\xa4\\xd9\\x18\\x3a\\x6a\\x9d\\x0d\\x4b\\xb2\\x5b\\x6b\\x4d\\x85\\x6f\\xf2\\x65\\x77\\xa5\\x15\\xb3\\x1a\\xac\\x0d\\xc1\\x47\\x43\\x11\\x67\\x94\\x39\\x32\\x60\\x8d\\xf7\\xc7\\xe5\\x2f\\xa3\\xb1\\x0f\\x0f\\xad\\x45\\xcd\\x6b\\x02\\x6d\\xbc\\x11\\x09\\x3e\\xa0\\xe0\\x20\\x1c\\x70\\x36\\xc3\\xab\\x71\\xfa\\xd3\\xf1\\xe2\\xd1\\x66\\x48\\x3e\\x5a\\x2c\\xc1\\x2d\\x83\\xcc\\xca\\xf7\\xa0\\x34\\x2b\\x68\\xcb\\x03\\x73\\xea\\xf9\\xf3\\x82\\x2a\\x49\\x30\\xd4\\xbd\\xc3\\x92\\xba\\x87\\x05\\xb1\\xff\\xa2\\x52\\x4a\\x5e\\x3f\\xf8\\xb4\\x48\\xd6\\xd4\\x02\\xb0\\x0e\\x0b\\x08\\xe5\\x13\\xa8\\x65\\x3d\\xd1\\x72\\xbe\\x25\\x17\\x1b\\x4e\\xd3\\xa2\\x33\\xd6\\xd0\\x83\\x59\\xb1\\x19\\x6a\\x8b\\x74\\xad\\x4a\\x01\\xf7\\x3a\\x48\\xe6\\x9b\\x2c\\xae\\xb6\\xe8\\x89\\x09\\xac\\x9c\\x04\\xd8\\x71\\xc5\\x26\\x73\\x1d\\xc3\\xfa\\x20\\x86\\x15\\xb0\\xbc\\x9f\\xb7\\xe3\\x46\\xad\\xbb\\x27\\x0c\\x31\\x1b\\xac\\x6e\\x2b\\x2d\\x0c\\x96\\x65\\xfe\\x58\\xbc\\x56\\x16\\x1c\\x1a\\x12\\xd3\\x90\\x34\\xc6\\xdb\\x6b\\x92\\x95\\x0b\\xd3\\xae\\xe3\\x0a\\x7c\\x5e\\xc7\\x73\\x91\\xac\\x82\\x8d\\xc2\\xdc\\x4b\\x68\\x2c\\xc0\\x48\\x98\\x0e\\x04\\x87\\xcb\\x55\\xa1\\xd1\\xf3\\xe5\\xdd\\xf2\\x7d\\x4f\\x15\\xbb\\x89\\x8c\\x7f\\x0e\\xef\\x9a\\x79\\xbe\\x32\\x5a\\x0d\\xc3\\x01\\x3e\\x4d\\x87\\x93\\x25\\xa4\\x1e\\x84\\xc1\\x66\\x6d\\x58\\x68\\xbd\\x7e\\x5f\\x66\\x23\\x6c\\x52\\x2b\\x81\\xd1\\x07\\x60\\xb3\\x57\\xf8\\x68\\x8a\\x0c\\xb8\\xa4\\x6b\\x43\\x3d\\x69\\x04\\x67\\xbe\\xa7\\x5a\\x2d\\x7e\\x0a\\x7b\\xde\\xc8\\x25\\x92\\x06\\x71\\xab\\x49\\xc0\\x6c\\xa8\\x19\\x0f\\x28\\x3f\\x34\\x87\\x57\\xbe\\x01\\xa3\\xfe\\x2a\\xf4\\x26\\x10\\xf1\\xf1\\x12\\x3f\\xe3\\x44\\x0d\\x2d\\x26\\x1c\\x5a\\x91\\x6b\\x63\\xc1\\x19\\x10\\x93\\x9c\\xc6\\x34\\xd1\\xf5\\x53\\xb8\\x17\\x08\\x18\\x96\\x69\\xbd\\x0d\\xeb\\x48\\x33\\x47\\xb2\\x22\\x29\\xaf\\x57\\xe6\\x8f\\x86\\x20\\x14\\x9e\\x50\\xbd\\x01\\xb5\\x66\\x3d\\x61\\x9f\\xe5\\x08\\xc0\\x5e\\x89\\x7d\\x50\\xa8\\x8a\\x17\\x6d\\x99\\x98\\x3d\\x68\\x30\\xb7\\xf6\\x18\\x80\\xb4\\xa9\\x30\\x41\\x29\\x8a\\xbb\\x00\\x73\\xbe\\x9c\\xc5\\x18\\x38\\xc9\\x17\\xb0\\xdc\\x8c\\x7f\\x63\\xd4\\x6c\\xf1\\x5a\\x72\\xbc\\x11\\x3d\\xc5\\xba\\xda\\xae\\x1a\\x6a\\x29\\x0d\\xfd\\x4c\\x65\\x91\\xac\\x1d\\xf3\\x51\\x87\\xf2\\x1a\\x16\\x95\\xfe\\xbb\\x67\\xf6\\x7c\\xb9\\xaa\\xb2\\x6f\\xa3\\x63\\x85\\xee\\xff\\xb4\\xbb\\x8e\\xe7\\x3e\\x52\\xa6\\x52\\x7b\\x16\\x16\\x0e\\xe6\\x7c\\xa0\\x2d\\x62\\x58\\xe9\\xa5\\xaa\\x44\\x8c\\x80\\xfa\\x22\\x11\\xb4\\x40\\xe7\\x6a\\xd8\\x21\\x44\\xc7\\xe8\\x50\\xab\\x2d\\x40\\xac\\xef\\xda\\x3f\\x34\\x2a\\xbc\\x78\\xac\\x30\\xc8\\xf8\\x50\\x51\\x9b\\xa5\\x0a\\x75\\x20\\xf2\\x3d\\x2d\\xdc\\xb3\\x91\\xe6\\x9c\\x21\\xad\\x24\\x63\\x31\\x15\\xc3\\x46\\x87\\xaf\\x74\\x4e\\xf5\\xc3\\x5c\\x9b\\xdf\\x71\\x8a\\x03\\x0e\\x46\\x23\\x57\\xce\\x77\\x57\\x69\\x82\\xff\\xe1\\x1a\\x5d\\xbd\\x25\\xa1\\x4c\\xb4\\x9c\\xfc\\x55\\x98\\x09\\x5f\\xbf\\x18\\xc5\\xd5\\x2f\\xb4\\x2d\\x50\\xac\\x08\\x22\\x28\\xac\\x4f\\x73\\x86\\x07\\x92\\x62\\xe1\\xed\\x00\\xa9\\xcd\\x44\\x94\\xf7\\x87\\xab\\x4d\\x51\\xa1\\xb0\\x09\\x5f\\x7f\\xd1\\x7b\\x2b\\x98\\x4c\\xf3\\xfa\\x3c\\x2e\\x68\\x49\\x66\\xf8\\x48\\x87\\xe6\\xcf\\x24\\x5b\\xa6\\x9a\\xb2\\xc0\\xb7\\xcb\\x75\\x29\\x12\\x47\\x7c\\xd4\\x30\\x00\\x73\\x6e\\x72\\xcd\\xa8\\x30\\x6d\\x7f\\xed\\xfd\\x5a\\x21\\x61\\x0d\\xf2\\x71\\xc1\\x1a\\xc9\\x5a\\xb8\\xf4\\x41\\xf0\\xb6\\xd3\\x56\\x32\\x00\\x3b\\x5d\\x2f\\xd3\\x15\\x08\\xe3\\x3d\\x1b\\x94\\x0f\\x11\\x25\\xeb\\xfe\\xbd\\x10\\x4c\\x05\\x13\\x01\\x32\\x2b\\xaa\\x6b\\x23\\x78\\x87\\xe6\\x5c\\xf1\\x6e\\xa5\\x7d\\x0b\\xea\\x4d\\x71\\xfd\\x05\\xec\\x8b\\x91\\x04\\x0a\\xb4\\x9c\\x5d\\xe9\\x0d\\xae\\x7f\\xfd\\xfb\\xd7\\xff\\x87\\x7f\\x96\\xfe\\x77\\xec\\x59\\x96\\xcf\\xff\\x8f\\xdb\\x96\\xd5\\x55\\x78\\x54\\xc7\\xae\\x65\\xb5\\xe5\\xb9\\x77\\x65\\x4b\\x7b\\x84\\xf6\\x5e\\x43\\xff\\xaf\\x52\\xdb\\x93\\xee\\x7e\\x53\\xfe\\x6f\\xf9\\xc7\\x91\\x34\\xe1\\x8b\\xfe\\x1d\\x9a\\xc2\\x4a\\xd3\\xbb\\xfd\\x80\\xb6\\xf6\\xf1\\xda\\x96\\xb7\\x0e\\xde\\xa2\\xe3\\x81\\xa5\\x6e\\x1c\\x8c\\xf8\\xb0\\x9f\\xd0\\xd6\\x3b\\xde\\xd8\\xf2\\xf6\\x8c\\xb7\\xfe\\x71\\xcf\\x5a\\xd8\\x53\\x17\\x8b\\x8f\\x8e\\x03\\x4b\\x75\\xf4\\xda\\x81\\x1f\\xeb\\xff\\xef\\x2c\\xa5\\x1b\\x64\\xaf\\xa1\\x65\\x85\\x78\\x0e\\x94\\x1e\\xaf\\x32\\xbd\\xa6\\x6f\\x59\\x6b\\x5b\\x3a\\x9e\\x6f\\x65\\xa2\\x40\\x1a\\x86\\x01\\x1e\\x9b\\x18\\xd9\\x60\\xb3\\x1e\\xd1\\x0e\\xe5\\x50\\xfd\\xe3\\x96\\x5e\\xe2\\x5e\\x1e\\x31\\x38\\x04\\x1c\\xac\\xfd\\x7b\\xa4\\x67\\xb6\\x06\\xfb\\x77\\x75\\xd2\\x6c\\x01\\x3a\\x38\\x7e\\xef\\xb6\\x98\\x4d\\xed\\xec\\xb6\\x3c\\x8f\\x6d\\x7d\\x7a\\xab\\xe7\\xc8\\xf8\\x36\\xa6\\x3a\\xee\\x5b\\xea\\x4a\\xb9\\x68\\xc0\\xfe\\xb0\\x78\\xab\\x79\\xdc\\xb5\\xd4\\x8b\\x2f\\x53\\x3e\\x4b\\xab\\x7f\\xff\\x7d\\x93\\x01\\x20\\x21\\xab\\xc9\\x63\\x88\\x61\\x4a\\xf6\\x1b\\x1e\\x5f\\x3b\\x96\\x9a\\x3b\\x98\\x69\\x84\\x11\\x31\\xe0\\x46\\x68\\xbc\\x16\\x9f\\xab\\x13\\x5b\\xd6\\x4d\\x6c\\x69\\x7e\\x71\\xa4\\x19\\xb3\\xe8\\xf3\\xe0\\x51\\x90\\xdd\\xc5\\x60\\xec\\x2c\\x7c\\x66\\x73\\x4b\\x76\\x2c\\x0d\\x09\\x40\\xf9\\x52\\x8e\\xee\\x73\\x74\\x03\\xa0\\x8f\\x00\\x94\\xa9\\xbd\\xff\\xa8\\xfe\\x87\\x8f\\x78\\x86\\x10\\x7b\\x9b\\x9b\\xe1\\x6d\\x4b\\x7d\\x62\\xf8\\x12\\xc3\\x27\\x76\\x39\\xde\\x23\\x5e\\x94\\xde\\x05\\xb6\\xef\\x2f\\xf0\\xa7\\xa5\\x0c\\xc8\\x65\\x9a\\x89\\x5d\\x0c\\x57\\x53\\xd5\\xc5\\x46\\xb8\\xa9\\xde\\x1e\\xed\\xa1\\x55\\x42\\xd1\\x3c\\x16\\x48\\xf5\\xf5\\x93\\x3f\\x07\\x92\\x7c\\x60\\x66\\x6d\\xaf\\x6c\\x03\\x07\\x6c\\x06\\x24\\xbe\\xb6\\x0d\\x46\\x5d\\xcb\\x5d\\x39\\xfc\\xba\\xa7\\xd1\\xeb\\xcc\\x6c\\x99\\x64\\xc5\\x2d\\x6b\\xde\\x68\\xcb\\x28\\xee\\xc8\\x20\\x70\\x86\\x97\\x08\\x64\\xe6\\xea\\x47\\xb5\\x55\\x0d\\xb6\\x78\\x96\\xf7\\x68\\xe9\\xb3\\x79\\x53\\x20\\x05\\xb3\\xfa\\x9e\\x3c\\xf6\\x27\\x72\\x4c\\x55\\x40\\x42\\x83\\x31\\xb6\\xac\\xd8\\x11\\x34\\xca\\x52\\x82\\xb6\\x57\\x19\\xbd\\xc4\\x1e\\x53\\x9b\\xe8\\x1c\\x63\\x2f\\x1f\\x40\\xfc\\xca\\x6c\\x82\\x8d\\x6a\\xee\\xfe\\xae\\x00\\xfe\\xa9\\xd2\\x93\\xda\\xa3\\x0a\\x1e\\xc7\\x36\\x01\\xee\\x5b\\xee\\x8f\\x1d\\xe5\\xa4\\x9a\\x05\\x57\\x42\\x80\\x0d\\xff\\x37\\xe8\\xb9\\x0b\\xe6\\x91\\x0d\\x78\\xbf\\x2b\\xdf\\x29\\x12\\x1d\\x80\\xd8\\x1e\\xf2\\x98\\xa1\\xe5\\xd6\\x1c\\xcc\\xe4\\x76\\xc0\\xd5\\x09\\x26\\x0f\\x81\\xd4\\x98\\xa8\\xc5\\xff\\x83\\xca\\xff\\x61\\x21\\x89\\x80\\x07\\x65\\x48\\xdc\\x05\\xf3\\xf3\\x03\\xcf\\x3a\\xb3\\xeb\\x80\\x39\\xc9\\xae\\x03\\x4e\\x5e\\x18\\x10\\x11\\xed\\xad\\xe3\\xa1\\x90\\x19\\x25\\x51\\xc9\\x81\\x6d\\x80\\x9e\\x12\\x09\\x80\\x17\\xf1\\x66\\xbd\\xd9\\xc2\\xf0\\x53\\xf3\\x69\\x24\\x5b\\xa5\\x40\\x69\\xc9\\x48\\x95\\x83\\x66\\x7d\\x90\\xfe\\x60\\xa5\\x2a\\x28\\xbf\\xc6\\x79\\x22\\x30\\x48\\x2f\\xab\\xf6\\x5c\\xca\\xa9\\xd5\\xa7\\x03\\x59\\x24\\x53\\x3d\\x01\\x40\\x33\\x1b\\x90\\xe3\\xd9\\xbb\\x42\\xee\\x37\\x68\\xe7\\x10\\x41\\x97\\x6a\\x62\\x8b\\xf8\\x3f\\xc6\\x86\\xfa\\xe8\\x6c\\xc9\\xe0\\xac\\x90\\xd5\\xb2\\x2a\\x90\\xdb\\x16\\x69\\xa4\\xa6\\x36\\x44\\x41\\x08\\xea\\xee\\x36\\x40\\x37\\x24\\xee\\x76\\x54\\x02\\x50\\xcb\\x5b\\x8d\\xba\\x56\\x2e\\x47\\xd3\\xa2\\xf8\\x83\\xc8\\x20\\x2f\\x73\\x91\\xb0\\x46\\x01\\x7b\\x56\\x6a\\x03\\x2b\\x24\\x29\\xf4\\xeb\\xf6\\x61\\x57\\xdb\\x72\\x6f\\x9c\\x17\\x30\\x29\\xe7\\x05\\xea\\xc3\\x91\\x59\\x49\\xb6\\x2c\\xa2\\xc5\\xad\\x2b\\x08\\x52\\x40\\xcf\\xc7\\x06\\x03\\x4d\\x55\\x5a\\x40\\x8e\\x20\\xb2\\xb8\\x1d\\x2b\\x00\\xc0\\x0b\\x46\\x68\\x09\\xcb\\x79\\x1d\\xf3\\x49\\x79\\x1a\\x01\\x82\\xbb\\xb5\\x89\\x4f\\xe9\\x3c\\xa5\\xb0\\x90\\x3e\\x8f\\xd4\\x43\\x59\\xa3\\x29\\x5f\\x6f\\xa9\\x7f\\x81\\x97\\x5b\\x70\\x4d\\x24\\xec\\xa4\\x79\\xf2\\xfc\\x1b\\x9a\\xac\\x80\\x74\\xd4\\xae\\x81\\x51\\x6a\\x36\\x61\\x46\\x6a\\xd0\\x72\\xa8\\x05\\x00\\x6a\\x11\\xdf\\x5d\\x81\\x5b\\xaf\\xec\\x04\\x03\\xad\\x6f\\x2b\\x0e\\x5e\\x0a\\xfe\\x7e\\x74\\x48\\x41\\x7d\\xcc\\x15\\x99\\xed\\x3f\\x43\\x51\\x74\\xcb\\x1d\\xb6\\xc7\\x6a\\x2f\\x6f\\x5a\\x2b\\x97\\x14\\x5e\\x9e\\x06\\x42\\x94\\xaa\\x59\\x34\\x90\\xc6\\x3f\\x78\\x3e\\x06\\x62\\xce\\x6c\\x36\\x81\\x0e\\x08\\x02\\x6c\\xd9\\x9f\\x14\\x8b\\xc9\\x02\\x67\\xd8\\xea\\x8d\\x91\\x12\\x2d\\x8a\\x8e\\xb0\\x7c\\x13\\xd9\\xfb\\x09\\x05\\x33\\x06\\xee\\xb7\\xf6\\xc7\\xd7\\x3e\\x41\\xfb\\x52\\xf4\\x8e\\x4a\\x1d\\xa7\\x5c\\xf9\\x9c\\xd2\\x28\\xfa\\xfc\\xe3\\x78\\x21\\x13\\xd9\\x03\\xd4\\x9c\\x00\\x4f\\x88\\x62\\x28\\x12\\xa5\\xee\\x14\\x80\\x72\\x9c\\x01\\x68\\x48\\x66\\x6c\\xbc\\x94\\x47\\xf9\\x2b\\x6c\\x9e\\x93\\x1f\\xa6\\x7b\\x2c\\xfa\\x7b\\x82\\x0e\\x92\\xea\\xd9\\xae\\xb1\\x76\\x66\\xbf\\x7f\\xed\\x33\\x7b\\x15\\x12\\x13\\x06\\xab\\x39\\x25\\x6d\\x79\\x25\\x69\\xbd\\xfc\\x71\\x33\\x83\\x2a\\x69\\x9d\\x70\\xc0\\x11\\xf7\\x51\\xbe\\xc9\\x5a\\x5b\\xe7\\x87\\x7d\\x94\\x7d\\x25\\xcc\\x06\\xf5\\x3f\\xf4\\xc1\\x50\\x19\\x0a\\xb1\\xb8\\x22\\xb6\\x27\\x9e\\x9e\\xd0\\x6f\\x18\\x69\\xa1\\xbf\\xd0\\xbc\\x50\\xaa\\xcf\\x60\\x7f\\xa4\\x29\\x76\\xe3\\x4f\\x94\\xd9\\xbc\\xd8\\x27\\xbd\\x0a\\x81\\x9c\\x02\\x86\\x03\\x41\\x6f\\x4d\\xed\\xd5\\x13\\xc4\\xac\\xd5\\xc7\\x47\\xa9\\x4d\\x90\\x02\\x16\\x1f\\x36\\x88\\xd5\\x1a\\x70\\x42\\x83\\x76\\x3f\\x41\\x63\\x6f\\xae\\x2a\\xf0\\xf5\\x01\\x96\\x9c\\x5b\\xe4\\x57\\xbd\\x4f\\x80\\x21\\x3a\\x25\\x12\\x6b\\x7c\\xfb\\x70\\x8a\\x3e\\x73\\xd4\\x00\\x26\\xa5\\x19\\x51\\x1e\\x3f\\x80\\x0c\\x6c\\xf8\\xdc\\xb0\\x7e\\x7e\\x29\\x41\\x40\\x51\\x29\\x8d\\xaf\\x25\\x0a\\x5f\\xff\\x9b\\xd2\\xe1\\x6f\\xe9\\x49\\x79\\x7f\\x47\\x4e\\x37\\x76\\x69\\x6c\\x87\\xf5\\x3f\\x0c\\xf6\\x44\\x05\\xe3\\x10\\x91\\xd8\\x25\\xce\\x23\\xad\\x06\\x20\\xf9\\x85\\x0c\\x04\\x21\\xdf\\xc9\\x0b\\x06\\xd2\\x2f\\x0f\\x33\\x98\\x12\\xe1\\xa3\\x19\\x2b\\x62\\xf5\\x13\\x22\\x74\\x65\\x27\\xb0\\x4e\\xa2\\x54\\x95\\xa2\\x38\\x1c\\x1e\\x8e\\x13\\x22\\xb8\\xa2\\x12\\x3a\\x72\\x85\\xa8\\x86\\x5a\\x32\\xdd\\xcd\\xb5\\xc5\\x2d\\xcb\\xdd\\x51\\x9f\\x95\\xfc\\xda\\x9d\\xe3\\x4b\\xff\\x4d\\x16\\x55\\xb7\\xa5\\x11\\x03\\x82\\x69\\x43\\x0b\\x74\\x69\\xf1\\xad\\xc8\\xd9\\xef\\x98\\x3c\\x1a\\xc0\\x58\\x73\\x8c\\x15\\x4b\\xe5\\x24\\xa3\\x3c\\x63\\xc1\\xeb\\xde\\xad\\x71\\x24\\xcc\\x7c\\x62\\xe9\\x52\\x44\\x83\\x3e\\xb5\\xa5\\xf7\\x46\\xad\\x76\\x42\\x19\\xfd\\x5c\\x39\\x54\\x4d\\x86\\xbb\\x27\\xa5\\x51\\xd5\\x3b\\xc3\\x3e\\x1f\\xea\\x25\\xbd\\xf6\\x88\\xe5\\x08\\x67\\x6a\\x6f\\x4b\\xc2\\x04\\x35\\x05\\x53\\x99\\xfc\\xd6\\xe7\\xa0\\xd6\\x84\\x96\\xfc\\xbd\\xd0\\x42\\x46\\xc7\\xc5\\x28\\xb4\\x0b\\x6e\\x09\\x2b\\x8a\\x33\\x53\\xa8\\xb7\\x6a\\x8f\\x36\\x6f\\x27\\x0e\\x0f\\xde\\xf5\\x30\\xce\\x29\\xba\\x42\\x5a\\x21\\x6e\\xdd\\x3e\\x55\\xd5\\x95\\x08\\x69\\x21\\x95\\x09\\x49\\x6f\\x83\\x0d\\xb6\\x3f\\x1b\\x07\\xb8\\x11\\xb4\\xd2\\xe2\\x0d\\x53\\x12\\xa5\\x21\\xa6\\xcb\\x83\\x6d\\x9d\\xdb\\x25\\x01\\x6a\\xc5\\x40\\x0e\\x1d\\xea\\xd7\\x81\\xa6\\x47\\xee\\x25\\xc5\\x9f\\xa1\\x86\\x69\\xaf\\x70\\x65\\xb8\\x75\\x6d\\x8d\\xe8\\x55\\xea\\xee\\x3f\\xec\\x5f\\xf6\\x77\\x0e\\x75\\xd8\\x36\\xfc\\xf8\\x1f\\x76\\x11\\x50\\xd3\\xc8\\x07\\x0b\\xa1\\x14\\xb5\\x6d\\x60\\x45\\x83\\xcb\\x30\\xa9\\x7e\\x17\\x01\\x90\\xde\\x95\\xdd\\xa8\\x02\\xe8\\x56\\x8e\\x32\\xb5\\xaf\\xec\\x1f\\xb7\\x2d\\x23\\x0c\\x40\\x1f\\xe5\\xe5\\x1a\\x8b\\xa5\\x46\\x81\\x4b\\x93\\xda\\xba\\xbb\\x03\\x30\\x34\\x4d\\x97\\x70\\x88\\xe9\\xf9\\x03\\x30\\xdc\\xbc\\x61\\x80\\xe1\\x56\\xb7\\xd9\\xa8\\x62\\xfd\\x09\\x6e\\xa0\\x6a\\xff\\xf9\\x54\\x95\\xed\\x69\\x9e\\x27\\x4f\\x46\\x90\\xb9\\xc1\\x73\\x29\\xa8\\x6a\\x15\\x3b\\x86\\xdf\\x43\\xb1\\x78\\x93\\xbf\\x11\\x5b\\xa0\\x64\\x77\\x42\\x16\\x9d\\xc1\\x58\\x6d\\xed\\xe8\\x29\\x54\\x2d\\x6d\\xcc\\xde\\xe6\\x59\\x9a\\x55\\x31\\x6d\\x8c\\x81\\x04\\x7c\\x36\\x98\\xe0\\x4b\\x63\\x79\\xb7\\x17\\xc6\\x99\\x84\\x78\\x8d\\xb9\\x8f\\x6e\\x69\\xb9\\xab\\x89\\x20\\x5f\\x9f\\x3a\\x3a\\x11\\xab\\x53\\x75\\x8e\\x20\\xc8\\x82\\xad\\x32\\xde\\xa2\\x46\\x4a\\x7b\\x6f\\xff\\x05\\x13\\x25\\x07\\xbf\\xf5\\x2e\\x31\\xab\\xe6\\xff\\xae\\xf6\\x45\\x69\\x13\\xa6\\x74\\x23\\x4c\\x44\\x00\\x02\\x63\\x2d\\xd8\\x74\\x35\\x1d\\x57\\xbd\\xac\\x31\\xc6\\x75\\xeb\\xd8\\x65\\xfb\\x82\\x1f\\x5f\\x51\\x8f\\x60\\x43\\x6e\\xaf\\x38\\x4d\\xc0\\x63\\x68\\xb6\\xdb\\xd1\\x64\\xbc\\xa1\\x49\\xac\\xa1\\xa5\\x7d\\x99\\x3d\\xec\\x6f\\xff\\x9b\\x4a\\xa2\\x46\\x5f\\xf7\\xc0\\xa0\\x62\\x18\\x24\\xac\\x51\\x14\\xcd\\x78\\xfa\\x8e\\x91\\x62\\xa5\\x9a\\xf4\\xee\\x74\\x87\\x5f\\x73\\x4a\\x81\\xf5\\x01\\x74\\x3d\\xd0\\xab\\xc0\\x26\\xa2\\x25\\x24\\x41\\x6b\\xe5\\x54\\x24\\x5d\\x50\\xd1\\xa7\\x36\\xfd\\x1c\\x0e\\xd3\\x30\\xec\\x8b\\xb7\\x52\\xe3\\xd6\\xcf\\x40\\xbd\\x6d\\x78\\x00\\xf0\\x75\\xbc\\x9c\\xb3\\xad\\x29\\xa9\\xcd\\xa4\\xd8\\xb4\\x7b\\xee\\x4e\\x89\\x07\\x9c\\x34\\x2a\\x8c\\x02\\x41\\x59\\xc5\\x40\\x88\\xba\\x7b\\xc3\\x41\\xe5\\x4e\\xaf\\xdc\\x94\\xc6\\x6b\\x4b\\x7c\\x40\\x39\\x3e\\xdc\\x30\\xf8\\x87\\x63\\xbb\\x47\\x83\\x5d\\x15\\xb0\\x76\\x11\\x57\\x70\\x18\\x71\\x4a\\x1a\\x80\\xaa\\x00\\x48\\x3d\\x7e\\x62\\x37\\xc1\\x29\\x75\\xbc\\x31\\x56\\xf6\\xf2\\xb9\\x55\\xdb\\x77\\x17\\xe1\\x1e\\x6b\\x70\\x5e\\x69\\xd3\\xdc\\x04\\x9a\\xff\\xc0\\xa1\\xb7\\xf6\\x39\\x3c\\x10\\xf7\\xc2\\x33\\x16\\x7b\\x5f\\xa2\\x4f\\x57\\x3c\\xf1\\x86\\xf6\\xe8\\xb6\\xfa\\xa6\\xdd\\xa5\\x36\\x74\\x91\\x01\\x96\\x3a\\x69\\x00\\xce\\x83\\x26\\x5d\\x35\\xc0\\x86\\x0b\\xb6\\xde\\x1d\\x99\\xae\\x8f\\xb1\\x0b\\x52\\x13\\x49\\x30\\x38\\x42\\xcf\\x10\\xba\\x6c\\xee\\xf1\\xd8\\x22\\x9e\\x3d\\x40\\x48\\x46\\xec\\x20\\x95\\x22\\x63\\x2c\\xec\\xec\\x8a\\xe2\\x3f\\x27\\x68\\x28\\x47\\xe9\\xcc\\xa4\\x76\\xe2\\xc2\\xbd\\xb7\\xc9\\xd1\\x5d\\xab\\xd8\\x80\\x16\\x5f\\xf1\\xee\\x60\\x3b\\x0d\\x1c\\xa0\\x4d\\x27\\x53\\xb4\\xc3\\xc9\\x01\\xc8\\x10\\x07\\x89\\x57\\x0d\\xd2\\x7a\\xac\\x25\\x55\\x93\\x8e\\xee\\x1b\\xb7\\xf2\\xcd\\xd3\\x9d\\xab\\x33\\x68\\x78\\xb7\\xbe\\xdf\\x6b\\x5b\\x56\\xdb\\xbf\\x75\\x85\\xfe\\xbe\\x1d\\x84\\x81\\x17\\x7d\\x9c\\xd1\\x82\\x41\\x43\\x4f\\x0f\\x34\\x81\\xc5\\xee\\x94\\x8c\\x7d\\xe9\\xca\\xd2\\x7d\\x50\\x41\\x3f\\x80\\xf8\\xbd\\x33\\x63\\x25\\x8c\\xd7\\x78\\xc2\\xfe\\x73\\x97\\xd6\\x83\\x8b\\x18\\x19\\x98\\xbb\\xbf\\x65\\xdb\\x25\\x0c\\xa2\\x39\\x61\\x6f\\xce\\x99\\x81\\xdf\\x5a\\xd7\\x00\\x54\\x3f\\x75\\xa1\\x6a\\xca\\xb8\\x59\\x87\\x71\\xb3\\x23\\x11\\x0b\\x8e\\xc1\\xe7\\x4f\\x47\\x9a\\x16\\x3e\\x0f\\x2d\\xa3\\x56\\xf9\\x16\\x59\\x6e\\x8d\\xc2\\xe8\\xb2\\x61\\x1c\\xf7\\xd6\\x3e\\xe4\\xb6\\x75\\x4b\\xf4\\x6a\\x65\\x3b\\x86\\xc3\\xd0\\x05\\xf1\\x0c\\x4e\\x5c\\xaa\\x11\\x32\\x90\\xb7\\x07\\x57\\xbb\\xe0\\x73\\xf7\\x04\\x38\\xf2\\xcd\\x46\\xcc\\x49\\x18\\x7e\\x12\\x9f\\x58\\xde\\x4e\\x21\\x4c\\xc5\\x21\\x90\\x45\\x4f\\xa8\\x99\\x2e\\xdc\\xca\\x16\\x72\\xb7\\xd8\\xa9\\xb4\\x25\\x6e\\x75\\x60\\x58\\xc5\\x12\\xc2\\x0e\\xe1\\x78\\x7f\\xb0\\xb2\\x2d\\xfe\\x82\\xcc\\x80\\x2a\\xbc\\x32\\x8e\\x8d\\x47\\x58\\x43\\x73\\x99\\x7b\\xc8\\x65\\x43\\x21\\x55\\xc3\\x65\\x1a\\x6f\\xb1\\x68\\x8b\\x9d\\x5b\\xbc\\x0e\\xc1\\x1a\\x5d\\x31\\x72\\xf4\\x62\\x33\\xc3\\xa9\\x9f\\xcd\\x3f\\x73\\xea\\x3f\\xce\\xa1\\x69\\xf3\\xbc\\xf7\\xe9\\x56\\x24\\x63\\x0e\\x94\\xb5\\x89\\xb2\\x7d\\xf4\\xa1\\x25\\xb4\\xfc\\x5c\\x4c\\xf0\\x86\\x38\\xf4\\x0e\\x54\\x52\\x4c\\xf8\\x00\\x71\\x82\\xa8\\x44\\xb7\\x76\\xb0\\x94\\xf4\\xa8\\x89\\x37\\x75\\x4b\\xbe\\xd3\\x3e\\x76\\xa1\\x2e\\x7a\\x20\\xad\\x87\\x9b\\x52\\x60\\xc7\\xd7\\xf4\\xa0\\x6e\\x0e\\x58\\x73\\xa7\\x8c\\x24\\xd3\\xf4\\xb5\\x72\\xae\\x21\\xe6\\x41\\xeb\\xc5\\xa2\\xbf\\x2b\\x9c\\xd2\\x95\\x23\\x8f\\x6d\\x69\\xf2\\x33\\x10\\x9a\\x5f\\x6b\\x54\\x94\\xde\\xe5\\x9e\\x48\\x8a\\xe0\\xa2\\x26\\x24\\x6d\\xa1\\xa4\\x8c\\x4c\\x81\\x5d\\xac\\xf0\\x1d\\x14\\x3e\\x46\\xdb\\xce\\xae\\x7f\\x81\\x52\\xa8\\xb9\\x46\\x48\\xf9\\xd6\\x44\\x7f\\x0d\\xc6\\xd7\\x70\\x65\\x5a\\x84\\x29\\xd5\\xd8\\x41\\x97\\xb6\\xcf\\x05\\xc0\\x2f\\x37\\x6e\\xb1\\x05\\x61\\x83\\x53\\xc6\\x84\\x8e\\x2f\\x6d\\x09\\x2c\\x8a\\xca\\x78\\xb9\\xab\\x6c\\x71\\x6c\\x17\\x03\\xd6\\x5a\\xfe\\xe7\\xea\\x9d\\xa0\\xd7\\x12\\xbe\\x2f\\x7c\\xfe\\xbc\\xb0\\x77\\xd8\\xeb\\x6b\\xe6\\x54\\x17\\xdc\\x80\\x83\\x7a\\x35\\x1c\\x67\\x38\\x45\\x5f\\x1f\\xeb\\x16\\x96\\xb0\\x89\\xb1\\x71\\x17\\xc1\\x9b\\xfd\\xe5\\x6b\\x81\\x02\\x69\\xab\\x7b\\xda\\x3c\\x1e\\xdb\\xb2\\x13\\xd2\\x6b\\xef\\xee\\x3f\\x7c\\xa8\\xb2\\xdb\\xbf\\x5a\\x57\\xd8\\x23\\xb3\\xff\\x79\\x09\\x89\\xde\\x36\\xd7\\x88\\x15\\x89\\xba\\xae\\xac\\x88\\xf5\\xdd\\xa7\\x26\\x60\\x6e\\x04\\x06\\x8c\\xd5\\x21\\x35\\x46\\x98\\x39\\x3f\\xef\\x53\\x2c\\x5d\\x5a\\x4d\\x83\\x0a\\x8e\\xd4\\xb4\\x31\\x90\\xae\\x33\\x1c\\x64\\x6a\\x33\\x10\\xfe\\x2c\\x34\\xb5\\xdc\\xbf\\x44\\x88\\x57\\x17\\xf6\\xd1\\xa7\\x83\\xcc\\x48\\x78\\xea\\xfc\\xb0\\xde\\x96\\x4e\\x3a\\x34\\x4e\\x8f\\x26\\x2e\\x27\\xa0\\x73\\xd7\\xfa\\x0d\\x6a\\xc5\\xf7\\xb0\\x97\\x7a\\x55\\x30\\x9e\\x7a\\x00\\xc7\\xcc\\x66\\x08\\xa2\\x45\\x38\\x56\\xa2\\xb6\\xea\\xc6\\x24\\x3c\\x64\\x4a\\x75\\xbf\\xa1\\x67\\x80\\x30\\xb6\\x7b\\xe7\\x1f\\x88\\x70\\x25\\x74\\xd7\\xab\\x6a\\x6e\\x51\\x1c\\xea\\x75\\x5b\\xe5\\xb1\\xa1\\xec\\x53\\x65\\x15\\xf7\\xef\\x8f\\xbc\\x89\\x08\\x71\\xc9\\x93\\x62\\x12\\xca\\xf9\\x1d\\xff\\xba\\xa2\\xb0\\xfa\\x4d\\xf3\\x1c\\x31\\x54\\x2d\\xca\\x03\\x11\\x3f\\xd3\\xd6\\xfb\\xd2\\xaf\\xe1\\x7f\\xde\\xa0\\x42\\x5a\\xd0\\x81\\x67\\x1f\\xe2\\xba\\xe7\\xe5\\x5a\\xe5\\x87\\x6d\\xb1\\x1e\\x9b\\x46\\x14\\x44\\xc8\\xae\\x49\\x7c\\xd9\\x76\\x0e\\x27\\x16\\x1a\\x43\\xd8\\x26\\xa8\\xd9\\x46\\x0c\\xfd\\x86\\xe4\\x28\\xb0\\x20\\xe3\\x36\\xd4\\x55\\xcf\\x87\\x4d\\x5d\\xcb\\xbd\\x81\\xa5\\xf4\\xf2\\xbb\\x42\\xb1\\x4b\\x12\\xd0\\xdb\\x5e\\x05\\x8a\\xd8\\xfd\\xf0\\x7e\\x26\\x3c\\x51\\x9f\\x1f\\x94\\x0a\\xab\\x46\\x15\\xc1\\x17\\x84\\xd2\\x89\\x0b\\xa7\\xbe\\x89\\xd0\\x43\\xe1\\x56\\x01\\xfe\\xe1\\xe7\\x81\\x77\\x79\\x03\\x49\\xd4\\xd5\\x1f\\x79\\x2b\\x77\\x06\\x33\\xe1\\xd0\\xaa\\x3d\\x46\\xea\\xe3\\x02\\x3d\\xd1\\x5f\\xb1\\x41\\x78\\xa0\\x9d\\xe5\\x0d\\x4c\\xa1\\x32\\xf7\\xb6\\x84\\x43\\x2f\\xfc\\x7f\\x41\\xe1\\xad\\xff\\x1b\\x0a\\x9f\\x06\\x77\\x95\\xf3\\xc1\\xbe\\x02\\xd7\\xcd\\x8d\\xb9\\x2e\\x04\\xae\\x69\\xff\\xf5\\x2f\\x48\\x1b\\xc6\\xce\\x16\\xaa\\x97\\x4e\\xd8\\x98\\xc9\\x8e\\x05\\x73\\x0a\\x06\\xd4\\x7f\\x01\\xfe\\xc0\\xf2\\xe6\\x4d\\xa8\\xcf\\x66\\xc5\\x10\\x91\\x80\\x8f\\x15\\x2e\\x40\\x03\\x20\\xd8\\x2b\\x12\\x6c\\x17\\x1f\\x11\\xf1\\x46\\x23\\x8e\\x2b\\xba\\x78\\x66\\x5b\\xde\\x4e\\x21\\x64\\xdb\\x03\\xcd\\xe5\\x18\\x19\\x9e\\x98\\xc8\\x38\\x23\\x05\\x7d\\xcd\\xde\\x78\\x3a\\xb2\\x0f\\x96\\x6c\\x89\\xd2\\xa7\\x73\\xc4\\x88\\x78\\x08\\x95\\xe4\\xd5\\xd4\\x1b\\x56\\x6f\\xaf\\xc8\\xcc\\x4b\\x48\\xc6\\x88\\xa1\\xc3\\xd6\\x1b\\x49\\x87\\xea\\x8d\\x29\\x9c\\x48\\x6f\\x50\\x93\\x95\\x46\\x40\\x17\\x99\\x57\\xb1\\xe0\\xcf\\xdc\\xe2\\x2c\\xee\\x94\\x67\\x81\\x95\\xa8\\xde\\x31\\xe7\\xce\\x7e\\xfe\\x6a\\x35\\xa8\\xdf\\xd4\\x84\\x1a\\x86\\x1a\\x27\\x1d\\x46\\x03\\xcc\\x34\\xbd\\x73\\x9c\\x2b\\x06\\x15\\xb4\\x84\\x65\\xb5\\xf7\\xde\\xe7\\xae\\x88\\xf5\\x99\\x8f\\x5c\\xdd\\x0e\\x7e\\xef\\x95\\x0d\\xfa\\x1b\\x6a\\x2b\\x51\\x80\\xf2\\xd9\\x24\\xbd\\x80\\xd5\\xe3\\x9b\\x46\\x15\\x55\\xc6\\x43\\xa8\\x78\\xde\\x5f\\x11\\xa6\\x9d\\xde\\x5a\\xd3\\xa4\\x0e\\xdf\\x61\\xba\\xac\\x1d\\xc1\\x43\\xbc\\x75\\xf6\\x7e\\x5d\\xe1\\x10\\xca\\x23\\xd2\\x29\\x26\\x95\\x48\\x9f\\x43\\xd5\\x1a\\x95\\xe0\\x1f\\x08\\xcc\\x7d\\xe0\\xf9\\xb5\\x4d\\x29\\xf4\\xc5\\xe3\\x05\\x67\\x0d\\xc8\\x95\\xcf\\xc6\\x9e\\xcc\\xd4\\xdc\\x05\\x54\\x2a\\x81\\x36\\xf5\\x84\\x4c\\x4c\\x9f\\xf9\\x48\\x4a\\xd7\\xee\\xda\\x17\\x5e\\xd0\\x2e\\x58\\xbd\\x51\\x00\\x51\\x5b\\x3a\\x1d\\x2a\\xca\\x90\\x51\\x96\\x67\\x99\\xef\\xa5\\xf7\\x8f\\x60\\x15\\x8e\\xd4\\x60\\x19\\x99\\x10\\x36\\x29\\xf8\\x1d\\x3e\\x43\\x1b\\x54\\xa8\\x25\\x29\\x44\\x39\\xfd\\xa0\\xe8\\xa3\\x01\\x21\\x74\\xd5\\x40\\x78\\x54\\x76\\x94\\xdb\\xfd\\x3d\\x44\\xbd\\x19\\xba\\x67\\xf6\\x9c\\x64\\x99\\xd3\\xf5\\x12\\x8d\\x7c\\xa5\\xbe\\xd8\\x88\\x61\\xb1\\xc3\\x95\\xd6\\x34\\x3f\\x22\\x36\\x10\\x0b\\xeb\\xf6\\xbf\\x87\\x3c\\x89\\x07\\xb9\\x51\\xb9\\xa1\\x05\\xf7\\x8b\\xf0\\x88\\xbf\\x63\\x54\\xe5\\x5b\\x2e\\xac\\xc8\\x03\\xdf\\xd8\\xdf\\xd0\\xf6\\xfc\\xfc\\x93\\x40\\xf1\\x98\\x8d\\x6b\\x41\\x3d\\x99\\xe4\\xea\\x07\\x25\\xcc\\x1a\\xa7\\xf0\\xc8\\x01\\x18\\x84\\x85\\x5c\\xaa\\xd6\\x68\\x49\\xf3\\x7d\\x45\\xff\\x64\\xc1\\xb7\\x2b\\xc2\\xfb\\x1a\\x40\\x73\\x6f\\xe4\\x4d\\xe5\\x2c\\xc4\\xa0\\x6f\\x35\\xa4\\x43\\x18\\xd2\\x52\\x0e\\x36\\x4d\\x23\\xf2\\x5c\\x21\\x08\\x94\\x88\\x7c\\x56\\x32\\x27\\xc8\\x82\\xf5\\x4f\\x69\\xcd\\x89\\x6c\\x61\\x49\\x02\\xd3\\xee\\x3d\\x86\\x36\\x6b\\x1e\\xe4\\xb6\\x7d\\x09\\x09\\x34\\x40\\x63\\x1f\\x1e\\xbc\\x48\\x11\\x7a\\x94\\x12\\x59\\x38\\x83\\x55\\x97\\x20\\xe7\\x21\\x99\\x71\\xd7\\xda\\xa8\\xba\\xe8\\x39\\xeb\\xa5\\xee\\x19\\x7b\\x57\\xbf\\x74\\x10\\x83\\x5e\\xd8\\xa7\\xdc\\x20\\x9d\\x95\\x88\\x99\\xef\\xa9\\x7b\\xa2\\x8a\\x56\\x39\\xe6\\x58\\x3a\\x77\\xea\\x48\\xc9\\xd6\\xea\\x8e\\x53\\x2c\\x2d\\xd0\\xd3\\x3a\\x4e\\x49\\x61\\x87\\xe0\\xde\\xa4\\xb4\\xa1\\x4d\\xb9\\xd6\\x1b\\xec\\xa8\\xdf\\xa0\\xc4\\x85\\x88\\x10\\x71\\xe0\\x45\\x02\\x5d\\x20\\xa0\\x3d\\xf8\\xc4\\x39\\x37\\x20\\x85\\x73\\x3b\\x25\\x0f\\x1f\\x31\\xcc\\x20\\x30\\xfd\\x74\\xc8\\x2c\\x57\\xf4\\x6c\\xaf\\x71\\x76\\x03\\x90\\x13\\x99\\xdb\\x9b\\x17\\xe5\\x14\\x72\\x40\\x0e\\x63\\xee\\xff\\xf7\\x05\\x76\\xb0\\xb4\\x6f\\x18\\xbb\\xa3\\x63\\x90\\xf8\\xf2\\x67\\x78\\x85\\x36\\x98\\x4d\\x85\\xb7\\x2f\\xf0\\x1e\\xa3\\xb7\\x2d\\x6c\\xa6\\x5c\\x99\\x64\\x84\\x23\\xad\\x19\\xcd\\xeb\\xc1\\xaf\\xee\\xe2\\xd3\\x88\\xfa\\x7e\\x4e\\x5d\\xb9\\x28\\xc2\\x23\\x5e\\x51\\xf4\\x12\\xc9\\xe2\\x6e\\xbd\\x51\\x46\\xfe\\x2d\\x4c\\x0d\\xd4\\x3f\\x01\\x37\\x6d\\xec\\xa8\\x67\\x40\\x7d\\x30\\x85\\x3e\\xbf\\x4f\\xa3\\xe3\\x65\\x0e\\x0c\\x23\\x2e\\xf8\\x82\\xac\\xda\\x9b\\x7d\\xe9\\x14\\x02\\x44\\xd8\\xee\\xf8\\xc8\\x06\\x4e\\x99\\x87\\x90\\xa0\\x0c\\x64\\x9f\\x20\\x00\\x02\\xc2\\x8c\\x7e\\x23\\x3f\\x82\\x44\\xef\\x49\\x7f\\x66\\x65\\xd3\\x33\\xa7\\x1b\\x00\\xa8\\x05\\x9f\\x76\\x1d\\x64\\xd4\\xbf\\x04\\x95\\x6e\\xe8\\xb1\\xec\\xc1\\xdb\\x45\\xe9\\x0a\\xf1\\x1b\\x15\\xcf\\xcb\\xc3\\xe7\\xea\\x98\\x9e\\x79\\x76\\xb7\\xfe\\x0f\\xb4\\x77\\x05\\x9d\\x3d\\x24\\x49\\x74\\xcd\\xae\\x0c\\xc6\\xb1\\x1d\\x77\\x4f\\x90\\x3f\\xec\\xd5\\x9d\\x33\\xda\\x5e\\x17\\xd0\\xba\\xf7\\x06\\xd6\\xc2\\x96\\x0b\\x0f\\x74\\xb4\\x32\\xe4\\xb4\\xb4\\x8b\\x6a\\x15\\x2c\\x14\\x9e\\x88\\x1d\\xdd\\xde\\xb1\\x3e\\xe8\\xac\\x51\\xca\\x85\\x15\\xb4\\x68\\x55\\x24\\x67\\x95\\x0c\\xba\\xc9\\xdf\\xdd\\x1d\\x88\\x4b\\x99\\xf4\\xcc\\xe4\\x50\\xca\\xc0\\xa3\\xaa\\x8c\\x64\\xb5\\x4d\\xf1\\x2c\\x82\\x8e\\x70\\x41\\x06\\x6e\\xc5\\x9a\\x27\\x13\\x93\\xac\\x76\\xf7\\xd6\\xf4\\x8e\\x27\\xde\\x7e\\x16\\xb1\\x94\\x43\\x44\\xc8\\xf5\\xf3\\xc3\\x03\\x44\\xc7\\x8c\\x16\\xea\\x1c\\x42\\xf1\\x95\\x01\\x30\\x06\\x5a\\xfd\\x0b\\x5a\\x26\\x24\\x07\\x36\\x7a\\x72\\x28\\x6b\\x62\\xef\\xcf\\xa0\\xf1\\x36\\x20\\x68\\xf6\\x27\\x12\\x64\\x31\\x2d\\xb6\\x81\\x15\\xd4\\x02\\x43\\x07\\x92\\x20\\xbc\\xf5\\xad\\xc2\\xba\\xf9\\xa7\\x40\\x81\\xde\\xdd\\xca\\xfd\\x21\\x52\\x90\\x15\\x26\\xfa\\xbe\\x51\\x4c\\x50\\xf1\\xce\\xaf\\xec\\x32\\x86\\xd0\\xff\\x12\\x43\\xf0\\xbe\\xfb\\x29\\xee\\x7f\\x8e\\x21\\x78\\xdf\\x62\\x08\\xee\\x4f\\x31\\x04\\x8f\\x42\\x80\\xf6\\x0f\\x8d\\x62\\x85\\xf8\\x9a\\xff\\x5a\\x91\\x1d\\xd7\\xb6\\xe9\\x15\\x7b\\x00\\x05\\x4b\\x73\\x55\\x6e\\x91\\x60\\x7a\\xb8\\x6a\\xec\\xf7\\xd8\\xbd\\x64\\xee\\xee\\xca\\xdb\\xcf\\x6a\\x45\\x17\\xd5\\x84\\x9a\\xc1\\x0d\\xb2\\x72\\x5b\\xe7\\x0a\\x02\\xcb\\x8c\\x7b\\x62\\x60\\xdc\\xaf\\x22\\x4f\\x6c\\x6d\\xef\\x86\\x58\\x99\\x51\\x59\\x7c\\x31\\x0f\\x3c\\x14\\x8c\\xc9\\x02\\x47\\xe8\\x1f\\xa6\\xcd\\x2f\\x3a\\x17\\xf6\\x01\\x09\\x83\\x8a\\x04\\xb9\\x34\\x6e\\x4a\\x19\\xd6\\xf5\\xc4\\xfa\\xa3\\x94\\x9f\\x0a\\x71\\x68\\xf1\\xbe\\xa0\\xee\\x3e\\x67\\x3a\\xaa\\x48\\xb3\\xb5\\x84\\xc8\\xcf\\x10\\x7b\\x6c\\xae\\x9a\\x55\\xbd\\x9f\\xb8\\x46\\x4b\\x79\\x22\\xa2\\x24\\x2a\\xe2\\x30\\x60\\xa2\\x8e\\x17\\x36\\x74\\x81\\xd8\\x67\\x73\\xec\\xf8\\xc6\\x98\\x0c\\xe3\\x26\\x90\\x28\\x34\\xee\\xe6\\xcc\\x6a\\xf5\\xbd\\x2f\\xc3\\x25\\x7d\\xa9\\x90\\x80\\x18\\xae\\x9b\\x45\\x5f\\xbf\\x10\\x09\\x6e\\x2a\\xa2\\xc4\\x44\\xce\\x25\\xc6\\xae\\xbc\\x6f\\x46\\x47\\x40\\xed\\xe3\\x49\\xf6\\x3e\\x25\\x57\\x99\\x2c\\x44\\xf7\\x9b\\x79\\xa2\\x19\\x13\\x62\\xcb\\x31\\x49\\xcc\\xbd\\x88\\x60\\xa0\\xb1\\xc7\\xc9\\xbb\\x97\\x07\\xb6\\xbc\\xa6\\xad\\x08\\xca\\xd1\\x30\\xa2\\x31\\x3a\\x2f\\x10\\x1c\\x7a\\x4c\\x11\\x4d\\x28\\x23\\x79\\x82\\x6b\\x31\\xad\\xe7\\x36\\xc9\\xc4\\x5d\\x06\\xe2\\x33\\xa8\\x46\\x51\\x11\\x66\\xb5\\x68\\x0c\\x44\\xa9\\xc9\\xe7\\x00\\x58\\x6d\\xae\\x30\\x47\\x12\\x55\\x5d\\xcb\\x6c\\x89\\x6a\\x96\\x65\\xa8\\x63\\x51\\xa6\\x1e\\x14\\xb3\\xc0\\x82\\xf6\\x7d\\xfb\\x8d\\x72\\x93\\x25\\xa3\\xed\\x14\\x55\\x29\\x37\\x60\\x78\\xa9\\x19\\xb5\\x3a\\x53\\x66\\x96\\xcd\\xb0\\xdc\\x27\\x0d\\xd2\\xd9\\xc6\\x51\\x30\\x20\\x9a\\x43\\xa2\\x46\\x6b\\x46\\x6e\\x95\\x91\\x90\\xb2\\x4e\\x4a\\x07\\x44\\x43\\xd0\\x95\\x4c\\x9f\\xe3\\xa7\\x88\\x62\\x77\\x67\\x90\\x31\\xed\\x25\\x53\\x6a\\xf9\\x2d\\x9d\\x46\\x31\\x35\\xd4\\x5a\\xce\\xd3\\x92\\xc8\\xf3\\xad\\xc5\\xcf\\x83\\x65\\x83\\x32\\xa8\\x27\\x05\\x0b\\x34\\xc8\\xb4\\xd0\\x72\\x60\\x1e\\x0c\\x89\\x80\\xb7\\x86\\x59\\x5b\\xf8\\xb9\\x2e\\x04\\x51\\x24\\x84\\xaf\\xd9\\x83\\x98\\x24\\x03\\x26\\xd7\\x34\\x53\\x6f\\xca\\xbc\\x83\\x15\\xd6\\x55\\xe1\\xa0\\x8a\\x2a\\xb8\\xba\\x85\\x47\\x7d\\x79\\x2b\\x52\\x68\\xe7\\xac\\x28\\x85\\x80\\x9b\\x37\\x91\\x6d\\x6e\\x6a\\xe3\\x34\\x9a\\xfc\\xcd\\x69\\xf6\\x25\\x7d\\x0c\\x6d\\x99\\xda\\xa7\\x19\\xdc\\xab\\xee\\x94\\xba\\xbc\\xa8\\xba\\x2d\\x02\\xb1\\x27\\xce\\x07\\xd9\\x27\\x65\\x80\\x3e\\xe7\\x1e\\x18\\x56\\xe0\\x21\\xf4\\x66\\x6f\\xb9\\x3f\\xd2\\xc7\\x9c\\xae\\xfe\\xf5\\x2d\\x78\\xc2\\xcd\\x58\\x8f\\x80\\x29\\xfb\\x33\\xb7\\x98\\x4c\\x74\\x82\\xc9\\x00\\xc2\\xb2\\x10\\x04\\x33\\x77\\xe0\\x22\\x44\\x19\\x58\\xac\\xf3\\x74\\xeb\\x22\\x69\\x1c\\xff\\x93\\x60\\x96\\xa1\\x6f\\x20\\xda\\xd7\\xb2\\xf4\\xd3\\x3b\\x63\\x51\\xcd\\x92\\x22\\x67\\x77\\x4b\\x23\\x98\\xc6\\xaa\\x49\\x26\\x95\\xe3\\x54\\xcd\\xc1\\xc0\\x85\\xe1\\x0b\\x9c\\x4c\\xdd\\x2e\\x29\\x12\\xa0\\x05\\x2d\\xcc\\xbd\\x81\\x81\\xb8\\xb3\\xbf\\xd4\\xcb\\x3c\\x4c\\x9b\\x7b\\x71\\x19\\x25\\x4d\\x23\\x0d\\x85\\x27\\xe7\\xcd\\x6f\\x8a\\x94\\xc9\\xe5\\x42\\xc8\\x8b\\xdc\\x4a\\x4d\\x3e\\x16\\x14\\xda\\x5a\\x80\\xb5\\x7a\\x29\\xbe\\xf4\\xae\\x11\\x25\\x1f\\xbe\\xb9\\x5f\\x1a\\xa1\\x54\\x69\\xcc\\x33\\xe2\\x2b\\x13\\xfa\\x30\\xb6\\x91\\x12\\x68\\xfe\\x3c\\x5e\\x74\\x54\\x39\\x5e\\x22\\x17\\xb7\\x4c\\x37\\xb9\\x6f\\x77\\xf8\\x10\\xa8\\x0d\\x0f\\x56\\x63\\xc1\\x69\\xeb\\xf4\\x87\\xc6\\xc0\\xa9\\x9e\\x65\\x62\\xcc\\x3e\\xed\\xf1\\x5c\\xb9\\xeb\\xe0\\x2b\\xf0\\xde\\x05\\x49\\xee\\x27\\x7d\\x9d\\x58\\x20\\xfc\\xaa\\x68\\x0a\\x1a\\xb1\\x2d\\x96\\xb2\\xfd\\x79\\xf7\\xa3\\x64\\x59\\x7b\\x29\\xcb\\xd3\\x2f\\xb1\\xdd\\xd8\\xd4\\x90\\x80\\xaf\\x58\\x67\\x53\\x83\\x98\\x09\\xcf\\x18\\x13\\xa9\\x73\\x9a\\xb3\\x3b\\x34\\xc2\\x0a\\x0e\\x35\\x15\\x68\\xd3\\x7d\\x47\\xcd\\xf3\\x01\\x0a\\x1d\\xb0\\xc4\\x0b\\x65\\x32\\xa8\\x7b\\xd4\\x9e\\x2d\\x02\\x93\\xd0\\x6c\\x54\\x25\\x74\\x52\\x82\\x1a\\xb3\\x6e\\xc8\\x50\\x81\\xda\\x2e\\x10\\x02\\x68\\xe2\\xd0\\x50\\xa4\\xda\\x7e\\xa7\\x91\\xee\\x63\\xef\\x0d\\x2a\\x26\\x31\\xaa\\x38\\x83\\xe6\\xbb\\x48\\x32\\xd5\\x67\\xb7\\x15\\x66\\xe3\\x58\\x33\\xca\\x83\\x5f\\x2c\\x2b\\xd7\\x69\\x8c\\x38\\x95\\xa4\\xcf\\x07\\x02\\x70\\xa9\\x7d\\x45\\xf1\\x43\\x8f\\x4e\\xaa\\xa3\\x65\\x5b\\xa7\\xf0\\x99\\x3f\\xf1\\xf1\\x40\\x86\\x3f\\xdd\\x20\\xdd\\x24\\x3e\\x9d\\x63\\xb1\\xfe\\xd9\\x7d\\x0b\\xab\\x31\\x18\\x1c\\xda\\x64\\x00\\xc2\\x95\\xcb\\x22\\x22\\x29\\x57\\xee\\x94\\xe6\\xfe\\x07\\x84\\x67\\xe4\\x13\\xb1\\x0a\\x2b\\x78\\x48\\x9e\\x0b\\x83\\x0a\\xa5\\xba\\x2f\\x58\\x61\\x12\\xfe\\x71\\x05\\xa9\\x1b\\x52\\x23\\x4e\\x2c\\x47\\x83\\xd7\\xdd\\x35\\x38\\x97\\x58\\x26\\x6c\\x4a\\xd8\\x34\\xe1\\x80\\x30\\x4e\\x10\\x6e\\x03\\xee\\x2d\\xb6\\xc0\\xc6\\x1c\\x50\\x0b\\xbb\\xe7\\xb0\\xea\\xfd\\x6a\\x4d\\xd1\\xa3\\x9e\\x4f\\x8a\\x47\\x42\\xeb\\x9e\\x57\\x1d\\x82\\xb6\\x49\\x89\\xbb\\x94\\xc1\\x5e\\x69\\xfd\\x36\\x9c\\x89\\x89\\x30\\xf1\\xec\\x75\\x52\\x0e\\x03\\x1b\\xf6\\x19\\x24\\x4d\\xff\\xf3\\xee\\xbb\\xf4\\x83\\xd1\\xed\\x8b\\x8c\\xbe\\x2c\\x6d\\x38\\x53\\x3d\\xf0\\x46\\xa1\\x32\\x6d\\xfc\\xa9\\x58\\x23\\x61\\xa8\\x9b\\x49\\x83\\x20\\x07\\x46\\xbc\\x77\\x9f\\xc7\\x6b\\x33\\x5a\\x21\\xd5\\xb4\\xb4\\x06\\x4c\\x09\\x8e\\x0f\\x32\\x6f\\x16\\x3c\\xfa\\x23\\x74\\xb5\\x31\\x21\\xf6\\xac\\xff\\x54\\xa9\\xb5\\x4e\\xec\\x4c\\xe8\\xdb\\x05\\xba\\x1c\\xeb\\x8b\\x06\\xd7\\x06\\xcf\\x1d\\x8d\\x31\\x77\\x0d\\x25\\xd6\\xcb\\x41\\x92\\xee\\x46\\x28\\x54\\xa4\\x9c\\xde\\xf0\\xef\\x2d\\xdb\\xde\\x45\\x9d\\x58\\x13\\x78\\xcd\\xfe\\x8e\\x6d\\x4b\\x97\\x56\\x27\\x55\\x8c\\xbc\\x26\\x80\\x9d\\x79\\xd7\\xbc\\x35\\x10\\xc3\\x4a\\x01\\xea\\x81\\xd5\\xb0\\x4a\\xc3\\x6c\\x6c\\xd7\\x38\\xc7\\xe9\\x2d\\x13\\x7e\\xe6\\xf5\\xec\\x16\\x56\\xb5\\x9a\\x87\\x46\\x56\\x0c\\x24\\xb3\\x41\\xd3\\xe4\\x80\\x8d\\x37\\xf6\\x92\\xc6\\x10\\x03\\x1b\\x1c\\x91\\xd8\\xc3\\xb2\\xad\\x35\\x27\\x9c\\x60\\xd8\\x79\\x63\\x50\\xe6\\x07\\xbc\\xb3\\x9d\\x02\\x24\\x86\\x9f\\x2e\\xad\\x58\\x1c\\x63\\x4d\\xae\\x1d\\xd3\\x3d\\x1e\\xd6\\xc5\\xae\\xd6\\x36\\x55\\x06\\xd3\\xb3\\x58\\x9a\\x7e\\xc5\\x70\\x7a\\xff\\x5d\\xac\\xd4\\xff\\x4e\\xf0\\x58\\x11\\xb3\\x40\\x3b\\x06\\x58\\xde\\xa4\\x54\\x5f\\xf5\\xe5\\x79\\x62\\x67\\xdf\\xa7\\x9d\\xd9\\xf9\\x1d\\xad\\xd4\\x90\\x7e\\x5e\\x58\\x79\\x6b\\x55\\xdf\\xb4\\x7f\\xb2\\xc2\\xf7\\xad\\xb7\\x7b\\x8a\\x4b\\x97\\x17\\x2b\\xdc\\xcf\\xca\\x8d\\x9e\\xc4\\x66\\x9c\\xab\\xbd\\x71\\x20\\xf7\\x55\\x29\\x74\\x2d\\x18\\x89\\x95\\xf2\\xbe\\x8c\\x01\\x84\\x0b\\x77\\xcf\\xf6\\xc6\\x00\\xdb\\xd2\\xa7\\xbc\\xf6\\x0d\\x5d\\xbb\\xc6\\x7e\\x08\\x53\\x5a\\xf8\\x26\\x80\\x03\\xeb\\x9c\\x2c\\xd2\\x3e\\xa2\\x65\\x01\\x79\\xa6\\x5e\\xd7\\x18\\xd7\\xdf\\x32\\x49\\x6d\\x82\\x19\\x30\\x9f\\x73\\x7b\\x0a\\x8a\\xa4\\x55\\xf2\\x94\\x98\\x17\\x2d\\xd7\\xc8\\x10\\x73\\x5a\\x47\\x4e\\x02\\xd1\\x33\\xcc\\x59\\x27\\x3a\\x0b\\x89\\xfd\\x8c\\x2e\\x08\\xb2\\x3b\\xea\\x44\\x15\\x83\\x58\\xfd\\x47\\x07\\x26\\x3c\\x6b\\x50\\xd4\\x32\\x31\\x26\\x2d\\x57\\xb2\\xb2\\x0b\\x3b\\xc7\\x09\\xde\\x99\\xad\\x39\\xc1\\xd9\\xc3\\x23\\x56\\x11\\x9e\\xf8\\xb8\\xec\\x62\\x97\\xaf\\xc2\\x42\\xa8\\xd6\\xf3\\x47\\x97\\xf2\\x45\\xf3\\xfe\\xee\\x4b\\x97\\xcf\\x74\\xbf\\x9a\\xda\\x97\\x54\\x07\\x57\\xb0\\x3e\\x5a\\x9a\\xc2\\x2b\\x47\\x31\\xc0\\x9a\\x15\\x8d\\xe7\\x4d\\x44\\xb6\\xdd\\x4f\\x53\\x25\\xa4\\xf1\\xfa\\x7b\\x79\\xf7\\x4f\\x5f\\x20\\x55\\xac\\x21\\x82\\x90\\x4c\\x77\\x82\\xf5\\x7b\\xef\\xa0\\x04\\xbf\\x76\\xb7\\xaf\\xb4\\x94\\x6c\\x31\\xf2\\x27\\xa8\\xbb\\xf0\\xe7\\x77\\xc5\\xfc\\x52\\x06\\x04\\x2f\\xe0\\x96\\xf4\\x81\\x40\\xbb\\x42\\x08\\x7b\\x4e\\x5e\\xf0\\x03\\x42\\x2c\\xd8\\x57\\x3a\\xb1\\x39\\xa4\\xe1\\xab\\x3d\\xce\\x13\\x55\\x16\\x74\\xd3\\x38\\xc7\\xd5\\x0b\\xbf\\x4d\\x06\\x0c\\x8c\\x04\\x15\\xd1\\x10\\x7c\\x95\\x98\\x09\\x33\\x92\\x57\\x77\\xff\\x50\\xde\\xa6\\xa6\\xbc\\xb9\\xc3\\x8a\\xda\\xd6\\x98\\x29\\x9e\\x39\\x6d\\xb7\\x45\\x50\\xac\\xa2\\xa9\\x87\\x92\\x29\\x1c\\xfb\\x06\\x3a\\x9f\\xbc\\x09\\x76\\x8c\\x2a\\x78\\x52\\x13\\x8b\\x2c\\x5f\\x49\\x67\\x01\\x0c\\x8c\\xa1\\x36\\x53\\xbe\\x8e\\x47\\x15\\x89\\x62\\x1d\\xdf\\x2b\\x09\\xac\\xf5\\x89\\x82\\xc4\\x7b\\xb2\\x50\\x71\\xf1\\xe7\\xbe\\xe8\\x92\\xca\\xb4\\x8c\\x05\\x78\\xd7\\x77\\xe5\\x78\\xab\\x4d\\x4b\\x59\\xde\\x02\\x09\\x39\\x96\\xaf\\x1e\\xe3\\x24\\x98\\xc6\\x43\\x48\\x9b\\x5b\\x34\\x7d\\x12\\x09\\x90\\x9b\\x48\\xb4\\x6f\\x12\\xc4\\x2c\\x3a\\x25\\x2f\\x87\\x2b\\xd0\\xf9\\x08\\xa0\\x61\\x9d\\x6c\\x6f\\xe2\\x52\\x88\\x89\\x96\\x52\\x27\\x36\\xcd\\xb4\\x70\\xd1\\x2c\\xb4\\x92\\x28\\xd0\\x0d\\x1d\\x7a\\x87\\x2e\\x8b\\x32\\x2f\\xa2\\x95\\x52\\xb1\\x40\\xda\\xcc\\xf9\\x47\\x6f\\xa8\\xf9\\xe4\\x55\\x1c\\x2c\\x58\\x68\\xfd\\x15\\x37\\xc7\\xdc\\x8f\\xbb\\xa6\\x73\\xb7\\x94\\x43\\xc9\\x5d\\x2f\\x71\\x7d\\x68\\x01\\xd2\\x31\\x80\\x06\\x52\\xbc\\x1c\\x16\\xbc\\x41\\xbc\\x54\\x98\\x8f\\x13\\x1b\\x6f\\xf3\\xae\\x5c\\xd0\\x7c\\x5c\\x8e\\xb1\\xa2\\x26\\xc4\\xa6\\x5a\\xc9\\x42\\x21\\xc1\\xf0\\x8e\\x9d\\x70\\xa6\\xc4\\x96\\x61\\xef\\xf4\\x22\\xcd\\x37\\xad\\x3a\\xa2\\x83\\xaf\\x97\\xc0\\x51\\xfb\\xea\\x9e\\x5e\\xc9\\x3d\\x38\\x86\\x16\\x28\\xef\\xc1\\xf9\\x66\\x47\\x22\\x12\\xed\\xc2\\xaa\\x11\\x88\\x90\\x10\\xa1\\x53\\xdb\\x7d\\x06\\x67\\x69\\x4b\\x3c\\x82\\x27\\xc4\\x15\\xf2\\x6b\\x6e\\xb9\\x62\\x17\\xf9\\x85\\xd0\\x2f\\x76\\x84\\x3f\\xc2\\x23\\xe6\\x72\\xc1\\xda\\xdc\\x7d\\x83\\x04\\x7d\\xb7\\x01\\xf0\\x82\\x92\\xd6\\x60\\xb1\\x99\\x3d\\x07\\x7c\\x66\\xf6\\x0c\\xef\\x89\\xc4\\x7c\\x91\\xd2\\x4f\\x30\\x2c\\x82\\x97\\xa1\\x3e\\x01\\x0e\\x8a\\xef\\xa4\\x34\\xcc\\x7e\\x33\\xfa\\x11\\x7c\\xde\\x17\\x53\\xba\\x26\\xdb\\x17\\x65\\x10\\xb0\\x75\\xfb\\x5d\\x78\\x5b\\xdd\\x82\\x24\\xe2\\x0c\\x93\\xbd\\xd2\\x9f\\x87\\x3a\\xec\\x22\\x36\\xa6\\x3a\\x3f\\x0d\\xbb\\x14\\x6e\\xf1\\x1a\\xac\\x19\\x41\\x7c\\xf6\\x9e\\x89\\x4b\\x77\\x8d\\xc0\\x57\\x84\\xbb\\x94\\xed\\x2c\\xa4\\x89\\x9a\\x80\\x6b\\xe2\\x69\\x88\\x8f\\xb5\\xe4\\x69\\x6b\\xc7\\x57\\x52\\x92\\x3e\\x8c\\xe8\\x48\\x6c\\x36\\x97\\xf7\\x7c\\x50\\x75\\x09\\xe5\\xa3\\xa8\\x9c\\x5b\\x03\\x9a\\x09\\x78\\xc1\\xcd\\x1a\\x37\\xa3\\x04\\x5b\\xc9\\xc2\\xbe\\x64\\x18\\x9b\\xd6\\x96\\x16\\xed\\x5f\\xac\\x7e\\x46\\x25\\x20\\xc9\\x22\\xe5\\x08\\x2a\\xdc\\x0e\\xfd\\x57\\x22\\x4c\\xac\\x8e\\x57\\xde\\xf3\\x14\\x5b\\x5d\\x75\\x1a\\xa8\\x84\\x93\\xe6\\xc6\\x73\\xf9\\x65\\xc7\\x29\\x9b\\x85\\x7d\\x58\\xc5\\xdb\\x45\\x19\\xc6\\x52\\xcc\\x14\\xa4\\xdb\\x09\\xad\\xcc\\xb9\\x26\\xf0\\x1e\\xc9\\x92\\x0c\\x43\\xda\\xf7\\xf8\\x02\\xc9\\x44\\xed\\x03\\xce\\x6c\\xb9\\xc4\\x87\\xfb\\xae\\x39\\x0b\\x89\\xe3\\x0e\\x87\\xb3\\x26\\xd1\\xbe\\x37\\x7b\\xd2\\x52\\xf6\\x09\\xc7\\xdf\\xc9\\xf1\\x3c\\x39\\x7e\\xe3\\xef\\x8f\\xdf\\x39\\xbd\\x93\\xa8\\xc3\\x6d\\x8b\\x24\\x8c\\xb9\\x57\\x2c\\x71\\x8f\\x23\\x09\\x4f\\xbe\\x62\\xef\\x1e\\x2b\\xd4\\xaa\\x30\\xa1\\xe0\\x83\\x2c\\xbc\\xe3\\x5e\\xa4\\xf9\\x89\\x38\\x52\\xe6\\xf4\\xe2\\x1e\\x49\\xd0\\x63\\xda\\x9c\\x93\\x22\\x91\\xa5\\x44\\x62\\xce\\xa3\\x6f\\x88\\x47\\x28\\x05\\xda\\xcf\\xb7\\xc5\\xa3\\xda\\x3a\\x70\\x8e\\x5a\\x29\\xe4\\x48\\xf8\\x66\\xea\\x9b\\x64\\x10\\x4f\\x60\\xc6\\xfb\\x52\\xdb\\x00\\xb0\\x0d\\x25\\x22\\x33\\xa2\\x99\\x26\\x47\\x26\\xf3\\x42\\x8b\\xb7\\x50\\x9e\\x7b\\x1f\\x1c\\x79\\x70\\xdd\\xc3\\x2a\\xf1\\x1e\\x79\\x7b\\xf4\\xba\\x40\\xaf\\x1b\\x4e\\x84\\x94\\xbd\\xce\\xc2\\xf8\\x68\\xad\\xc3\\xb9\\x3e\\xff\\xe3\\x5c\\x7d\\xcc\\xe5\\x7c\\x9f\\x2b\\xa0\\x0c\\xc5\\x4d\\x48\\xdf\\x20\\x67\\x2f\\xa3\\x14\\x3d\\x64\\x1f\\x16\\x29\\xdc\\x20\\xbf\\x73\\x28\\xc7\\x5c\\xdc\\xcf\\x68\\x59\\x8f\\x3e\\xb3\\x34\\xa2\\x94\\xd4\\xcb\\xa1\\x2c\\xd2\\xc4\\xf4\\x48\\x5a\\x42\\x1c\\x74\\xce\\xcb\\x97\\x7b\\xb9\\xa4\\x69\\x64\\xc2\\xb4\\x74\\x90\\x52\\x16\\xbc\\x89\\xf4\\x73\\x6f\\x69\\xae\\xbd\\xe8\\x4d\\x25\\xcd\\x39\\x25\\x3d\\xef\\x02\\x46\\x27\\x4d\\x8a\\x91\\xc2\\x99\\x96\\x44\\xba\\x74\\x8f\\x69\\xd3\\x60\\xeb\\xc8\\xb9\\x32\\x64\\xde\\xae\\xc1\\x00\\x38\\x82\\x57\\x94\\xaa\\xd3\\xb0\\x68\\x94\\xe3\\x9e\\xc9\\x65\\xa5\\x0f\\xc9\\x05\\x28\\x8b\\x21\\x4e\\xda\\xfd\\x4c\\x9e\\xae\\xda\\x74\\xbc\\xda\\x7a\\xd0\\x10\\xf6\\xf0\\x8b\\x85\\xd3\\xf1\\xbc\\x01\\xa3\\x82\\x41\\x79\\x1d\\xc5\\xdc\\x68\\x05\\x59\\x92\\x0a\\x21\\x1b\\x43\\x50\\x54\\xbb\\x2d\\xa6\\xfa\\xdc\\xa5\\xcd\\xd3\\x82\\x26\\xc7\\xa5\\x4e\\x05\\x91\\x9b\\xda\\x85\\x31\\x32\\xd0\\x76\\x0d\\x68\\xde\\x8f\\x58\\x9f\\x19\\x20\\xf3\\xc0\\x86\\x22\\x08\\x16\\x14\\xec\\x2e\\x60\\x3e\\x7f\\x60\\x3d\\xa9\\x6c\\xe4\\xe2\\x01\\x7f\\x84\\xe3\\x55\\xdd\\xa5\\xd7\\xd9\\xc1\\x61\\xb7\\xdc\\x0c\\x80\\xb5\\x1f\\xa5\\x89\\xe1\\x9c\\x57\\x80\\xdb\\x43\\x13\\xab\\x2b\\x0b\\x99\\xe9\\xae\\xb4\\x33\\xd4\\x49\\x9c\\x01\\x0b\\xa9\\xfd\\x76\\x6f\\x8e\\xdd\\xd6\\xfc\\xeb\\x32\\x96\\x14\\xc3\\x09\\xe6\\xcd\\xe0\\xb1\\x7d\\xbc\\x50\\x92\\x22\\xe2\\x9d\\xa4\\xf6\\xcc\\x66\\x7d\\x06\\xb5\\x87\\xcf\\x3a\\x54\\x73\\x59\\x6b\\xff\\x1d\\x2a\\x92\\x66\\xfa\\xb3\\xcc\\x66\\x79\\x75\\xdb\\x94\\x03\\xdd\\x50\\xfc\\xa1\\xd8\\xca\\x44\\xd9\\x81\\xa7\\x1e\\x83\\x80\\x32\\xcc\\x64\\x61\\x84\\x86\\x60\\x64\\xa6\\x68\\xfa\\xfd\\x06\\xe3\\x76\\x66\\xa7\\x74\\x40\\x51\\x38\\xe0\\x99\\x9b\\x67\\x35\\x18\\x0d\\xa7\\xdf\\x4f\\xa4\\x31\\x72\\x57\\x9c\\x59\\x0c\\x49\\xd3\\xc5\\xb7\\x17\\x0a\\x02\\x43\\x5b\\x42\\x8b\\xb5\\x6a\\xd5\\xff\\x25\\x16\\x8c\\x18\\x20\\xeb\\x32\\x7a\\x2f\\xa9\\x73\\x09\\x04\\x14\\x75\\xa3\\x82\\x09\\xed\\x02\\x11\\x11\\x4b\\x4f\\x84\\x4d\\x4b\\xbb\\xbc\\xac\\xe0\\xe2\\xd5\\x25\\x2b\\xa8\\xe3\\xda\\x6f\\x63\\x23\\x6b\\x4f\\xdd\\x07\\x74\\xa1\\x52\\x4f\\x73\\xea\\x1b\\x33\\x6a\\x08\\xfc\\x32\\xea\\xb4\\x64\\xc5\\x13\\x0c\\xba\\x02\\x79\\x21\\x06\\x05\\xa2\\xc2\\x69\\xa1\\xbb\\xac\\x38\\xa8\\xd1\\xa6\\x41\\x35\\x88\\x77\\x06\\x45\\x12\\xd5\\x41\\x6b\\x95\\x2b\\x56\\x5a\\x83\\xcd\\x19\\x72\\x38\\x05\\xc3\\xc7\\x46\\x32\\x20\\xf7\\xcf\\x73\\x68\\xbf\\xb1\\x92\\x28\\x5b\\xfb\\xec\\xe3\\x05\\x18\\xd0\\xa4\\x7a\\x28\\x69\\x52\\xdd\\x6b\\x6a\\x93\\x90\\xf9\\x0c\\xb0\\x18\\xca\\x8e\\x34\\xd7\\x4f\\x78\\x01\\xc6\\xac\\xf1\\x29\\x7f\\xbc\\xad\\x7d\\xcd\\x0b\\x09\\x99\\xb9\\xe1\\xd2\\x43\\xd5\\x41\\x68\\x3d\\x5b\\x6f\\xc6\\x54\\xfa\\xbe\\xb2\\xbb\\x5f\\x19\\xd0\\x7d\\x28\\xe9\\x7c\\xbf\\x72\\x83\\x15\\x7b\\x72\\xf9\\x63\\xc9\\x4d\\x50\\x09\\x92\\xce\\x7b\\x63\\x93\\x46\\xd0\\x04\\xe8\\x6d\\xd5\\xfc\\xfb\\xc6\\x10\\xb3\\xf0\\x3a\\x66\\x73\\x53\\x7b\\x1f\\x2b\\x7f\\xa5\\xcf\\x21\\x9d\\xbc\\x5d\\xd8\\xf2\\x61\\x94\\x33\\xaa\\x0f\\x79\\xa0\\x69\\xfd\\xde\\xbc\\x08\\xe1\\xac\\x02\\x06\\x51\\x02\\x13\\x48\\xe3\\x78\\x31\\x62\\x32\\x75\\x4d\\x89\\xf2\\x8e\\xf4\\xca\\x70\\x67\\x57\\xdf\\xf8\\x73\\x0d\\xa5\\xcf\\x0a\\xa1\\x1a\\xae\\x4c\\x28\\x8f\\x55\\x62\\x42\\xa7\\x22\\x63\\x14\\xb3\\x9a\\xdd\\x24\\x32\\x87\\x14\\x58\\x89\\x5c\\xbd\\xb6\\xcd\\xef\\x66\\xb4\\x4a\\x49\\xde\\xaf\\x3d\\x90\\x41\\x40\\x75\\xa9\\x2a\\x39\\x23\\xb7\\x37\\xac\\x44\\x9b\\x00\\x1b\\x67\\x88\\x6f\\x6e\\x6d\\x5e\\x07\\xee\\x9d\\x80\\x96\\xde\\x70\\xa1\\xd3\\x5c\\xbd\\x23\\x6b\\x46\\xe3\\x06\\x07\\xd8\\xff\\x74\\x60\\xb1\\xea\\x9d\\x25\\xa4\\xf1\\x90\\x85\\x30\\x09\\xdd\\x1a\\xbd\\x85\\xd3\\x07\\x7a\\xb7\\xac\\xb1\\xa0\\x53\\xde\\xe3\\x15\\xba\\x16\\x57\\x1f\\x4e\\x69\\xdf\\x26\\x8d\\x42\\xbf\\xba\\x2b\\x97\\xbe\\x45\\x0d\\x84\\xd7\\x5a\\x60\\xb1\\x2e\\x4c\\x57\\x09\\x20\\x08\\x9e\\x30\\xaf\\x09\\x9b\\xbb\\x34\\xdc\\x88\\xa8\\xe0\\xfc\\xde\\x18\\xf8\\x72\\x8c\\x4b\\x2c\\x1f\\xf1\\x9e\\xa8\\xaf\\x09\\x19\\x8e\\xdb\\x10\\x21\\x5c\\x94\\xd9\\x83\\x32\\xba\\x57\\x0f\\xd0\\x77\\x65\\x9a\\x3a\\xa9\\x5c\\x90\\xa2\\xef\\x79\\xc1\\x24\\xe1\\xb6\\x5d\\x5e\\x73\\xa6\\xa7\\x68\\x64\\x19\\xd4\\x6a\\x98\\x70\\x14\\xd8\\x1e\\x5e\\x6a\\xc8\\xda\\x55\\x55\\xb3\\x3f\\xb0\\x15\\xe3\\xc9\\xce\\x99\\x43\\x32\\x69\\x02\\x0e\\x2f\\xee\\x81\\x5e\\xe0\\x92\\xc0\\xb9\\xcd\\xda\\xc4\\x00\\x29\\x4f\\x6f\\xc4\\xfa\\x36\\xb1\\x44\\xe7\\x73\\xfc\\x52\\x49\\xcb\\xcf\\xa0\\xd4\\x7a\\x8c\\x8f\\x43\\x55\\xbd\\x23\\xa4\\xf4\\x70\\xa3\\x78\\x4f\\x18\\xc6\\xde\\xc2\\xdc\\xa0\\x2d\\xa2\\x9b\\x4f\\xd5\\x2e\\x96\\xe0\\xf4\\x84\\xfe\\xaf\\x1a\\x19\\x4b\\x08\\x12\\x85\\x04\\x2e\\x69\\x36\\x3a\\xde\\x28\\xb1\\x1b\\x03\\x1a\\x2c\\x47\\xb6\\x5c\\xe5\\x5f\\x7b\\xb4\\x93\\x4e\\x1b\\x9a\\x6d\\x6a\\xe6\\xaa\\x7c\\xdf\\x1a\\x3c\\xb3\\xaa\\x05\\x15\\x26\\xeb\\x11\\x7f\\x73\\xe4\\x4c\\xac\\x50\\x09\\xf5\\x88\\x8f\\xff\\x80\\x64\\x23\\x84\\x50\\xca\\x1f\\xd6\\xb0\\x3f\\xc0\\x4b\\x51\\x0d\\xaa\\xb0\\x77\\x4a\\x86\\xdd\\x45\\x5f\\x04\\x99\\x4a\\x9d\\x13\\x26\\x6c\\xf4\\x88\\x84\\x61\\x88\\xa8\\x78\\x97\\xa3\\x2c\\xed\\x73\\xc0\\xf9\\xc6\\x39\\x61\\x7d\\xcb\\x59\\x84\\x4c\\x6a\\x9d\\x9e\\xbb\\x69\\xe4\\xc7\\x6e\\xaa\\xcc\\xc7\\xb3\\x08\\xfc\\xc4\\xbd\\x9c\\xdb\\x1f\\x34\\x06\\xae\\x5c\\xde\\xfd\\x31\\x13\\x49\\x05\\x9b\\x7b\\x65\\x3b\\x8c\\x2d\\xca\\xde\\x85\\x46\\xb4\\xeb\\x6f\\x86\\x9f\\x36\\x8b\\x49\\x50\\x43\\x29\\xe1\\x45\\xd7\\xdb\\xa0\\x6f\\x6c\\x8f\\x91\\xcb\\x59\\xd9\\x5b\\xa0\\xd8\\x64\\x3b\\x50\\x8f\\x12\\x31\\x70\\x60\\xe2\\x07\\xef\\x1d\\x5a\\xdf\\x20\\x84\\xfa\\xc3\\xf1\\xfe\\xde\\xeb\\x05\\xd4\\x32\\x43\\x1a\\x64\\xc2\\x5b\\x5e\\x33\\x59\\x36\\xf6\\x79\\x2b\\x40\\x3d\\x60\\x8c\\x6b\\x8c\\xea\\x32\\x95\\xd9\\x89\\x71\\x09\\xa7\\xe0\\xd2\\xa8\\x1e\\x90\\x0c\\x8f\\x18\\xb1\\xba\\x86\\x5d\\x34\\x3b\\xe8\\x05\\x7c\\x58\\x71\\x0a\\xdd\\x10\\x6b\\xab\\x54\\x2a\\x35\\xdd\\x04\\x83\\xae\\x21\\x49\\x7e\\x7f\\x42\\x72\\x52\\x33\\xc5\\x8e\\x71\\xa0\\xc1\\x0c\\x2d\\x54\\xe5\\x88\\xaa\\x07\\x8a\\xbb\\x30\\x5c\\x26\\x8d\\x6b\\xc6\\x0c\\xb7\\x38\\x43\\x9b\\x8c\\xd9\\x3b\\xe3\\x85\\xc1\\x35\\x79\\xf6\\x56\\x44\\xe2\\x4e\\x25\\xf7\\x74\\x67\\xc0\\x28\\x75\\x93\\x20\\x40\\xc8\\x61\\xa5\\x58\\x67\\x26\\xb3\\x48\\x27\\x8b\\xc2\\x4f\\x9d\\x12\\x36\\x8c\\xae\\x98\\x4a\\x5b\\x53\\x8d\\x51\\xae\\xec\\x1b\\x5b\\x8e\\x09\\x0f\\x66\\x2d\\x29\\x8b\\x66\\x28\\xda\\xdc\\x79\\x65\\x14\\xb2\\x57\\xb2\\x3e\\x03\\x46\\xfc\\x89\\x13\\xa6\\x43\\x7f\\x8a\\x17\\xd1\\x7e\\x93\\x1a\\x8c\\xd6\\x95\\xc3\\x78\\x88\\xbb\\x78\\x44\\xed\\x17\\x10\\x3d\\x11\\xae\\xf5\\xe6\\x36\\x3c\\x28\\x8b\\x26\\x2f\\x84\\xcc\\x1d\\xd2\\x10\\xd3\\x3b\\xfa\\x4f\\xfc\\x4d\\x96\\xc9\\x3e\\xe6\\xaf\\x9e\\xc6\\xc2\\x35\\x63\\xbb\\xc3\\x28\\xa7\\x09\\x7c\\x40\\x56\\x77\\x17\\xa8\\xb8\\x99\\x9b\\xec\\xb3\\x5e\\xea\\x11\\x13\\x27\\xf6\\xea\\xb6\\x62\\xc7\\x6c\\x40\\x43\\xbd\\xf4\\x96\\xfe\\xfd\\xe2\\xb6\\xa8\\x11\\x82\\x7b\\x7f\\x44\\x03\\x79\\xc6\\x80\\x36\\xbd\\xfc\\xd4\\x63\\x95\\x58\\xfb\\x44\\xe0\\xee\\x3d\\xe2\\x9c\\x48\\x52\\x9b\\x44\\xc6\\x75\\x70\\x01\\xeb\\xbc\\x16\\xa4\\x88\\x58\\xf6\\x15\\x63\\x06\\xe7\\x2e\\x63\\x09\\x47\\x2e\\x65\\x03\\x43\\x70\\x2e\\xd4\\x8a\\x80\\x12\\x54\\xb3\\x61\\xb9\\x77\\x11\\x6a\\x0f\\xa4\\x78\\x8d\\x19\\xa0\\xdd\\xdd\\x32\\xa4\\x85\\xe2\\x5a\\xc3\\xd4\\xce\\x1f\\xc1\\x2e\\x17\\x01\\x0d\\x22\\x26\\x64\\xbc\\xe2\\x36\\x22\\x4b\\x0c\\x07\\x58\\x59\\x8a\\x2a\\x7e\\x48\\x17\\xbb\\x9f\\x0e\\xad\\x45\\x93\\xbc\\x10\\x2f\\x55\\xde\\x36\\x8f\\x25\\x03\\xe6\\x00\\x6b\\x78\\x67\\x94\\xa5\\xa0\\x32\\xf8\\x03\\xb3\\x5d\\xb8\\x7b\\x66\\x63\\xda\\xb0\\x3d\\xe6\\xc7\\x75\\x0a\\x72\\x94\\x9b\\x32\\x30\\xd6\\x39\\x61\\xc5\\x3d\\x5d\\x16\\x33\\xec\\x4a\\x8c\\xe5\\xd6\\x55\\x25\\x81\\xbb\\x10\\x86\\xbf\\xfb\\x6d\\x7e\\x8e\\x45\\x3e\\xce\\xa9\\x72\\x77\\xca\\x98\\xde\\x3d\\x89\\x9d\\x5c\\xdf\\x95\\x03\\x3e\\x7d\\xc2\\xb0\\x00\\x9f\\x94\\xbd\\xa8\\xbc\\x4c\\x01\\x0f\\xde\\xe9\\xef\\xe6\\x80\\x64\\xd7\\xfc\\xf8\\x10\\x32\\xa1\\x73\\x87\\x7d\\x51\\x46\\x9f\\x7d\\x4a\\x7a\\x5f\\xf3\\xe7\\x42\\x6a\\x21\\xc2\\x74\\x88\\xe8\\xa9\\x73\\xf5\\x76\\x5b\\x69\\x35\\x37\\x07\\x44\\xb6\\x4d\\xcc\\xf5\\x1f\\x08\\xda\\x66\\x59\\xbb\\x83\\x75\\x1e\\x76\\x0f\\x7f\\xb1\\x11\\x2b\\x30\\xfb\\x38\\x98\\x7c\\x13\\x16\\x7b\\xeb\\x4b\\xd5\\x9f\\xc4\\xc5\\x43\\x09\\x1f\\xdc\\xfa\\x50\\x56\\xfd\\x1c\\x85\\x01\\x89\\xd4\\x25\\x7b\\x7c\\x15\\xfb\\xf1\\xc8\\xd9\\x97\\x26\\xa9\\x89\\x4b\\xb7\\xa1\\xd2\\x27\\x18\\xc6\\x2d\\x00\\x6f\\x67\\xa3\\x4a\\xa2\\xf8\\x7d\\x8a\\x4f\\x38\\x60\\x5f\\x32\\xbd\\xad\\xc3\\x1a\\x92\\x85\\xd4\\x90\\x0c\\xc9\\x90\\x20\\xf7\\xe8\\x08\\xec\\xf1\\x7c\\xc3\\xe2\\x8b\\x6a\\x0d\\x03\\xa3\\x9b\\xfd\\x6b\\x1f\\x0a\\xe7\\xc6\\xff\\x23\\x55\\xca\\x8f\\x76\\xb0\\x52\\xea\\x1d\\xf5\\x54\\x0b\\x5a\\x93\\x31\\xf1\\xca\\x7a\\xe7\\xe1\\x8d\\xc3\\x9c\\xe3\\x50\\x0a\\x7b\\x59\\xb7\\x37\\x64\\xd1\\x6a\\x59\\x82\\x81\\x1f\\x09\\x22\\x67\\x02\\xb2\\x18\\xd6\\xce\\x64\\x4f\\x77\\xfe\\x05\\x8c\\xa6\\x37\\x84\\x7d\\xd4\\xce\\xbe\\x0a\\x2b\\x70\\x89\\x2e\\x20\\xed\\x32\\xdb\\xe4\\xf5\\xa7\\x3c\\xdb\\x29\\xf2\\x11\\x99\\x0d\\xb5\\xd3\\xa2\\x83\\x23\\x5f\\xf8\\x05\\xd3\\xfb\\xa7\\x30\\xfa\\xfa\\xac\\x76\\xaa\\x1b\\xe6\\xf4\\x4a\\x56\\x4a\\x18\\xf6\\x44\\xb0\\xea\\x96\\x95\\xb4\\x7a\\x12\\xaf\\x93\\xf9\\xb4\\xcd\\xd6\\x80\\x0a\\x42\\xf7\\x9f\\xf6\\x54\\x6a\\xef\\xb4\\x13\\x7a\\xf8\\xab\\x6c\\x38\\xc9\\x45\\x60\\xf8\\x1b\\x82\\xe3\\x1a\\x11\\xc1\\x5a\\xe3\\x84\\x61\\x2d\\xd8\\x54\\x37\\x60\\xd1\\xb5\\x7d\\x0d\\x25\\x5c\\x67\\xec\\x2e\\x3e\\x0f\\xc8\\x1a\\x63\\x0a\\xaf\\x53\\xe1\\x79\\x0d\\x96\\x1a\\x8c\\x53\\x8b\\xc5\\xe0\\xfb\\x41\\x00\\xf0\\x59\\xc0\\x39\\x61\\x56\\x35\\x21\\x31\\xdc\\x90\\x1b\\x97\\xb0\\x78\\xfd\\x3b\\x91\\xf4\\x0c\\x79\\xac\\x25\\xee\\xb2\\xb6\\x73\\x03\\x19\\xe3\\x9b\\x0a\\x68\\x72\\x7b\\x82\\x88\\x86\\x50\\x10\\x8d\\x14\\x2c\\xb5\\x42\\xad\\xc7\\x54\\x4d\\x78\\x0d\\xf1\\xfa\\x91\\x09\\x48\\x61\\xf0\\xb9\\x7d\\x63\\x14\\xf1\\x75\\xc0\\xa4\\x14\\x79\\xec\\xc4\\xb4\\x52\\x5d\\xb1\\x12\\xc9\\xe7\\xef\\x81\\xa1\\xa0\\x74\\xb2\\xbf\\xd1\\x18\\x89\\xd3\\x84\\x6f\\x3e\\x8a\\x78\\x6f\\x4f\\x02\\x86\\xb8\\xf8\\x98\\x7d\\x29\\x97\\xd2\\x5a\\xf6\\x37\\x82\\x4b\\xd6\\xa4\\xf9\\x03\\x13\\xe8\\xb9\\x46\\xe6\\x90\\x7a\\x93\\xfa\\x04\\x5e\\xe7\\x86\\xb8\\x1e\\x77\\x29\\x05\\x64\\x58\\x0d\\x4a\\x34\\x3c\\x6b\\xd1\\x68\\x2a\\xcb\\xb6\\x6a\\x88\\xf2\\x7d\\x2d\\xdb\\xd2\\xab\\x01\\xdf\\xe6\\xee\\xd3\\xb7\\x3c\\x2c\\xaa\\x37\\xb5\\x15\\xbd\\x34\\xe9\\xa0\\x73\\x84\\x0c\\xdb\\x67\\xcd\\xe3\\x32\\x1c\\x3b\\x3c\\x67\\xa4\\xe8\\x8c\\x55\\x72\\x49\\x93\\xb6\\x9d\\x78\\x87\\x41\\x1d\\x71\\xd1\\x37\\x9b\\x95\\xdb\\x83\\x99\\x50\\x9c\\x73\\x63\\x6f\\x69\\xd8\\xbc\\xfb\\x0c\\x48\\x08\\x71\\xdd\\x78\\x7b\\xc1\\x1e\\x34\\x8b\\xbb\\xbb\\xda\\xc1\\x9a\\x31\\x03\\x97\\x83\\x1b\\x13\\xb5\\xb9\\x67\\xcc\\x52\\x63\\x74\\x1c\\x4f\\x45\\x39\\x9e\\x8c\\xac\\x1c\\x53\\x98\\x4c\\xa9\\x44\\x24\\x5d\\x00\\x86\\x3f\\x1d\\x90\\xd9\\xbb\\xa0\\x22\\x16\\xf8\\x03\\x5a\\xd7\\x1d\\x3a\\xb4\\x32\\xa0\\x18\\x36\\x79\\x2c\\x86\\x7d\\xff\\x3d\\x37\\xc5\\xe4\\x96\\x4c\\x0f\\xa9\\x8c\\xe8\\x7a\\x6e\\x7e\\x08\\x85\\x09\\x10\\x23\\x7c\\xd0\\xb4\\x04\\x81\\xc6\\xab\\xc7\\xb2\\xe9\\x02\\xd8\\x16\\x5b\\xce\\x5c\\x2a\\x52\\x9f\\xee\\x0c\\xb0\\x27\\xe2\\x3c\\xda\\x19\\x18\\xbb\\x03\\x63\\xb6\\x16\\x3e\\x3d\\x63\\x53\\x15\\xea\\xe3\\x23\\x0a\\xad\\x1a\\x45\\xf9\\xd7\\x42\\x15\\xfe\\x32\\x98\\xa9\\x29\\x5a\\x1b\\xf6\\x2e\\x15\\xe6\\x67\\x44\\x85\\xf9\\xee\\x8a\\xd1\\xf6\\x11\\xd1\\x38\\x38\\x46\\x5a\\x32\\x87\\xd5\\x56\\x64\\x9b\\x69\\x46\\x0c\\xa9\\xd5\\x1d\\x03\\x72\\x2d\\x1f\\xd2\\x8a\\x4d\\x7b\\x81\\xc8\\x91\\x16\\xd9\\x07\\x5f\\x1a\\x4b\\xc3\\x70\\x51\\x5f\\x32\\x1d\\xe7\\x50\\x93\\xad\\x0d\\x00\\xd1\\x27\\x67\\x61\\x87\\x9f\\x3c\\x27\\xab\\x7b\\xba\\x0f\\x5f\\xa7\\xd1\\x9e\\xd4\\x50\\x16\\xb8\\xfa\\x92\\x3d\\x6f\\x89\\xf8\\xc1\\x16\\xda\\xe6\\xd3\\x0b\\x44\\x21\\x4e\\xd4\\x18\\x8a\\x6f\\x6c\\x1b\\x90\\x41\\xc0\\xcc\\xd5\\x1b\\x05\\x69\\x26\\x44\\xe7\\x3d\\x13\\xaf\\x1b\\xfb\\x0d\\xa2\\x7a\\x6b\\xa7\\xcc\\xd8\\x6d\\x84\\x89\\x3c\\x7c\\xef\\xe7\\x25\\xde\\x3c\\x6d\\x93\\xd0\\x85\\xd9\\x56\\x1a\\xdf\\x1f\\xe9\\x2b\\x49\\x9d\\x16\\x89\\x60\\x07\\x07\\xb2\\x3b\\x71\\xf7\\x59\\xd0\\x95\\xfd\\x21\\x54\\xd8\\x18\\x8b\\x4e\\x33\\x8d\\xf8\\x4d\\xb3\\xe2\\xf9\\xa5\\x7c\\xcc\\xc4\\x15\\x91\\xf3\\x9c\\xc2\\x09\\xfe\\x30\\x85\\x0e\\x57\\xdf\\x21\\xbb\\x2e\\x2a\\x00\\x2e\\x1f\\x0b\\xd5\\xaf\\xdd\\x14\\x9f\\x46\\xf9\\xf7\\x2a\\x83\\x36\\x73\\xd4\\x41\\xf6\\xc8\\x82\\x85\\x47\\xa4\\x16\\x3c\\x86\\x22\\xda\\x9b\\x07\\xd4\\x63\\x3e\\x6f\\xf9\\x7a\\xf6\\x80\\x42\\xf2\\x25\\x43\\x17\\x73\\x44\\x9b\\x32\\xc5\\x3b\\xb4\\x32\\xd6\\xc4\\x10\\xa5\\xf3\\x46\\xd8\\xc2\\x9b\\x17\\x9d\\x17\\xf0\\x1d\\xfb\\xd0\\xa4\\xa9\\x4f\\x67\\xc9\\x74\\xbd\\x57\\xba\\x4e\\xa4\\x8a\\xd3\\xaf\\x93\\x86\\xb6\\x77\\xff\\x89\\xbf\\xea\\xaa\\x60\\x26\\x91\\x00\\x88\\x0a\\xbe\\x42\\xc4\\xc6\\x86\\x55\\x8f\\xf7\\xd5\\x4d\\xfc\\x8d\\xbc\\x16\\xab\\x9f\\xc5\\x5e\\x98\\xda\\xd7\\xe0\\xc1\\x01\\xcc\\xbe\\xc1\\xd5\\x7d\\x11\\x1c\\xd1\\xf4\\xc0\\x44\\x4c\\x64\\x6e\\x9b\\x40\\x14\\xde\\x18\\x7f\\x8c\\xc1\\xed\\xc1\\x9c\\xe0\\x1a\\x77\\x39\\x22\\xc4\\x8f\\x03\\xee\\x7d\\x90\\x29\\x6b\\xa1\\x18\\xb7\\x0f\\x97\\xa4\\x9f\\x15\\x7f\\x1f\\x92\\xbf\\x98\\x12\\x8c\\xa9\\xca\\xa9\\x2f\\x4e\\xe1\\x5e\\xee\\xa3\\x2f\\x7d\\xc2\\x87\\xa6\\xfc\\xb0\\xb4\\x14\\x82\\x51\\x75\\x6d\\x28\\x97\\x31\\xc8\\x6d\\x28\\x09\\x18\\x6d\\x8a\\x7f\\x82\\x95\\x07\\xd4\\xc6\\x31\\x34\\xee\\x05\\xc4\\xc1\\x15\\x05\\x71\\x5f\\xcb\\xdc\\x22\\x04\\x34\\x64\\xf4\\x47\\x5c\\x12\\x04\\x7f\\xe4\\x22\\x0f\\xf4\\x10\\xb6\\xc4\\x0b\\x98\\x5a\\xe4\\x75\\x2b\\x92\\x51\\x7e\\xd1\\xa5\\xa0\\xf0\\xc0\\x2a\\x20\\x49\\x77\\xa8\\x7d\\x09\\x51\\x35\\xb8\\xda\\x03\\xde\\xcd\\x9b\\x8c\\x20\\xb7\\x66\\xcc\\x41\\x28\\x32\\x76\\x16\\x1c\\xb2\\x17\\x7f\\xf9\\xec\\x1d\\x8a\\x6f\\x6b\\xaf\\x98\\x09\\x37\\x9f\\xe0\\xec\\x17\\x85\\xac\\x18\\x98\\x22\\xb5\\xf0\\x06\\x60\\xef\\x26\\xcc\\x70\\xd5\\x6e\\xff\\x48\\xdc\\x30\\x5c\\xdc\\x6d\\x13\\xbc\\x13\\x7d\\xfe\\x99\\x0b\\xd6\\x72\\xf9\\xc9\\x3b\\xb1\\x69\\x38\\x7c\\x95\\x34\\x66\\x84\\x64\\x65\\xed\\xbf\\x99\\xaa\\x65\\xf9\\x73\\x95\\x1e\\xca\\xcb\\xdb\\xd2\\xa3\\xac\\xb7\\x4b\\x9b\\x20\\x30\\x85\\xc4\\x15\\xa7\\x25\\xa0\\x0c\\x5e\\x37\\x50\\xe2\\x8c\\xc8\\x32\\x0a\\x0c\\xfa\\x39\\x72\\xb8\\xab\\xe2\\x47\\x15\\xaa\\x5c\\x2f\\x6e\\xe5\\x65\\xe3\\xf5\\x50\\x10\\x5e\\xda\\xc6\\x8e\\x61\\x6d\\x8d\\xbd\\x3b\\xa8\\x17\\x6a\\x57\\x3a\\xdb\\xe7\\x76\\x4a\\x0f\\x6b\\x6d\\x6e\\x24\\x68\\x64\\xfc\\x36\\x76\\xbf\\x57\\x66\\x9d\\x5c\\x54\\x03\\x4b\\xa0\\x9c\\x17\\x2b\\x5f\\x10\\x1c\\x66\\x85\\x10\\x7f\\x34\\x4c\\x12\\x45\\xea\\xca\\x16\\x7a\\x5d\\xfb\\x9d\\xfc\\xa1\\x32\\x29\\x13\\x8e\\x5d\\x26\\x97\\x11\\xb3\\x61\\x34\\x41\\xbb\\x64\\x92\\x82\\x99\\xda\\xf3\\xea\\x8f\\x2d\\xbe\\x81\\x70\\x2f\\x48\\xb8\\x6e\\x1b\\x32\\xe2\\x11\\x5e\\x87\\xf9\\xb9\\xa0\\xc2\\x57\\xb4\\xc2\\x77\\x21\\x59\\xef\\xbc\\x61\\x72\\xcb\\xef\\x4f\\x65\\xd1\\xc0\\x4e\\x88\\xb5\\x28\\x59\\xf9\\xe8\\x1a\\xc7\\xd3\\x2d\\xd2\\x53\\xb5\\x8a\\xfd\\xb3\\x13\\x23\\xb8\\xf5\\x8a\\x5a\\xc0\\x0f\\x66\\xfe\\x19\\x7c\\xdf\\x22\\xff\\xff\\xf4\\xce\\xec\\xd9\\xdc\\xd4\\x06\\x76\\x25\\xa5\\x8b\\xdc\\xfc\\x12\\x26\\xcc\\xdd\\xd6\\x33\\x00\\x10\\xc2\\x5d\\x20\\x79\\xae\\x95\\x26\\x1b\\x79\\x27\\xb7\\xbd\\xc0\\x3d\\xc4\\xe7\\x4f\\x99\\xfd\\xf1\\xb1\\xa2\\x83\\x65\\xba\\xc1\\x23\\x5d\\xde\\x5e\\x09\\x34\\xa9\\x01\\xdf\\x50\\x0a\\x50\\xd2\\xcb\\xe5\\xe6\\x96\\x58\\x01\\x1b\\xd2\\x29\\xa5\\x0d\\x82\\x9a\\xe1\\x0c\\xe5\\x43\\xa4\\x2a\\xbf\\x3a\\x9c\\x97\\x8a\\xa7\\x95\\x6b\\x3c\\x67\\xdf\\xe2\\xa3\\x46\\x2a\\x71\\xbc\\xf9\\x19\\xc8\\x89\\x2a\\x65\\x95\\xe8\\xb4\\x33\\xda\\xb8\\x14\\x4b\\x03\\x84\\xe3\\xf9\\x4b\\xbc\\xad\\x8f\\xce\\x41\\x53\\x5b\\xee\\xda\\xae\\xa1\\xd3\\xa3\\x27\\x24\\x5f\\x41\\xc5\\x5d\\x43\\x32\\x91\\x75\\xd4\\xd0\\x46\\x41\\x8b\\x96\\xea\\x53\\x85\\x28\\x9c\\xe3\\xf2\\xe7\\x6d\\x7b\\xe6\\x1a\\x2b\\xf8\\xec\\x04\\xce\\x46\\x71\\x3d\\xc0\\xfc\\xc4\\xea\\xac\\x51\\x25\\x4d\\xb1\\x5d\\x67\\xac\\xdd\\x27\\x1d\\x48\\x5c\\xbc\\x0b\\x49\\xa6\\xff\\xcf\\xd5\\x51\\xab\\x68\\xdc\\xe7\\x1b\\x55\\xc6\\x5c\\x72\\xdf\\x44\\xd7\\xb7\\x10\\x6f\\xfd\\x6b\\x86\\x2a\\x79\\x11\\xb7\\xb7\\x51\\x45\\x5f\\xaf\\x08\\x5a\\x40\\x19\\xa9\\xac\\x81\\x71\\x43\\xe6\\x97\\x7a\\x29\\xb3\\x03\\xa7\\x3f\\x7d\\x9c\\x32\\xf7\\x54\\x24\\xde\\xf0\\x53\\x00\\x66\\x20\\xe3\\x62\\xd8\\x93\\xa9\\x9b\\x2b\\x6b\\x93\\x79\\x99\\x6d\\xcc\\x88\\x41\\xef\\xdd\\x29\\x8d\\xf8\\x73\\xdc\\x6f\\x58\\xe1\\x1e\\x1e\\x7e\\x2c\\xcd\\xaa\\x9b\\xda\\xab\\x4b\\x8a\\xc9\\x9b\\x07\\xda\\xa8\\xc9\\x03\\xed\\x9d\\x72\\x69\\x93\\x00\\x30\\x79\\x3f\\x0c\\x3f\\xb5\\x51\\x7f\\xba\\xb3\\x99\\x6e\\x35\\x59\\x86\\xae\\x49\\x2f\\x98\\x37\\xa0\\x30\\x93\\x1d\\xa9\\xa9\\xf3\\x56\\x4d\\x2c\\x98\\xdf\\x30\\x1b\\xdb\\xd5\\xc6\\xc0\\x24\\x0b\\x6a\\x62\\xaf\\xa8\\xba\\x73\\x0a\\xa2\\xe6\\xef\\xca\\x99\\x74\\x87\\x55\\x0c\\x08\\xca\\xa4\\x87\\x63\\x50\\xc1\\xdf\\xa8\\x89\\x78\\x09\\xb7\\x77\\xa5\\xbe\\x4a\\x0e\\xfc\\x4a\\xa0\\x29\\xfd\\xf8\\xc1\\x59\\x19\\x43\\x94\\xbe\\xc1\\xfe\\x7c\\xae\\xc3\\x60\\x90\\xab\\x72\\x30\\x3c\\x97\\x20\\x56\\x09\\x61\\x02\\xb8\\x2c\\xeb\\xef\\x5d\\x98\\x57\\xdc\\x8a\\x51\\xab\\x06\\x63\\xfb\\x3d\\x56\\xe5\\x5f\\xb1\\xf6\\x9d\\x8e\\x68\\x9b\\xd1\\x67\\xf7\\xf4\\x1e\\xbc\\xf2\\x8e\\xe3\\x0e\\xe7\\x0f\\x65\\xa3\\x04\\xc5\\x7c\\x93\\xae\\x7b\\xae\\xdd\\x97\\xab\\xab\\x3b\\x23\\x52\\x4b\\x31\\xb7\\x84\\xb0\\x1a\\x4e\\xc8\\x1c\\x0b\\x14\\x32\\xf4\\x56\\x62\\x3f\\x68\\x6b\\xb5\\xc2\\xb1\\xea\\x2b\\xc7\\x9a\\xe0\\xcf\\xb4\\x5b\\xcd\\x68\\x98\\xc6\\x9c\\x3f\\xbc\\x8d\\x4f\\x3e\\x60\\x5b\\x70\\x4a\\xed\\xa0\\x3e\\x15\\x03\\xda\\x96\\x7b\\xe5\\x96\\x9d\\x22\\x41\\xd8\\x49\\x86\\xe2\\x15\\xc4\\xca\\x67\\x1e\\x7e\\x9e\\x19\\xca\\x8a\\x19\\xe1\\xe7\\x93\\xbb\\x03\\xb8\\x32\\xd6\\xd7\\xa5\\x5e\\xf6\\xe4\\x07\\xb1\\x41\\xca\\x27\\x88\\xf0\\xfc\\x63\\xdd\\xcf\\x11\\x26\\x32\\xa5\\x08\\xb9\\xc0\\xc8\\x7d\\x99\\x3d\\xfc\\x49\\x08\\x5c\\xc3\\xde\\x76\\xb7\\xca\\x5c\\xc8\\x58\\x43\\x92\\xdf\\xf1\\xb7\\x0a\\x7f\\xd4\\x48\\x28\\x4a\\x60\\xc8\\xe4\\xc4\\x10\\x70\\x7f\\xaf\\xac\\xfc\\xbd\\x28\\xda\\xf4\\x8e\\x2b\\xc5\\x66\\x54\\x1b\\x52\\xa4\\xbe\\x02\\x44\\x78\\xf1\\x36\\x5a\\xe3\\xa5\\x9d\\x9b\\x30\\xbd\\x90\\x9e\\xd7\\x69\\x54\\xbe\\x0f\\x78\\xbd\\x62\\x27\\x31\\x60\\xf7\\x09\\x12\\xad\\x0f\\xfd\\xf6\\x84\\x8e\\x77\\xd8\\xf7\\xee\\x0b\\x0c\\xe9\\xa7\\x37\\xd8\\xe8\\x4b\\x68\\xf9\\x67\\xd4\\xac\\x8b\\x3e\\x16\\x30\\x2c\\x78\\xcd\\x28\\x75\\x2a\\x6f\\xdd\\x1a\\x02\\xcb\\x1a\\x35\\xe2\\x70\\x3c\\x9f\\x41\\x16\\x7c\\x98\\x0f\\x8a\\x9b\\x15\\x48\\x83\\xf6\\xcc\\xaf\\xac\\xb5\\xce\\x7b\\xbf\\xfe\\xf7\\xff\\x09\\x00\\x00\\xff\\xff\\x2a\\x55\\x00\\x86\\x40\\x70\\x00\\x00\")\n\nfunc uiJsLibsMithriljs020MithrilMinJsMapBytes() ([]byte, error) {\n  return bindataRead(\n    _uiJsLibsMithriljs020MithrilMinJsMap,\n    \"ui/js/libs/mithriljs/0.2.0/mithril.min.js.map\",\n  )\n}\n\nfunc uiJsLibsMithriljs020MithrilMinJsMap() (*asset, error) {\n  bytes, err := uiJsLibsMithriljs020MithrilMinJsMapBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/js/libs/mithriljs/0.2.0/mithril.min.js.map\", size: 28736, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiJsLibsNvd3171NvD3MinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xec\\xbd\\xf7\\x76\\xe3\\x48\\x92\\x2f\\xfc\\xff\\x3e\\x85\\xc4\\x99\\xd5\\x02\\xc5\\x24\\x8b\\x54\\x55\\xf5\\xcc\\x90\\x0d\\xf1\\xc8\\x95\\x77\\xd3\\xd5\\x76\\x74\\x74\\xfa\\x02\\x20\\xe8\\x49\\x50\\xf4\\x54\\x89\\x0f\\xf5\\xbd\\xc2\\xf7\\x64\\x37\\x22\\x0d\\x90\\x09\\x64\\x02\\xa0\\x4a\\xea\\xde\\xdd\\x3b\\xa7\\x4f\\x97\\x88\\x44\\x7a\\xa4\\x09\\xf3\\x8b\\x88\\xa7\\x4f\\x0e\\x26\\xab\\xf6\\xb3\\x83\\x55\\x30\\x9b\\xf7\\xc3\\xc9\\x41\\xbd\\xfa\\xf7\\x6a\\xfd\\xc0\\xea\\x2d\\x16\\xd3\\x79\\xe3\\xe9\\xd3\\x6e\\x7f\\xd1\\x5b\\x7a\\x55\\x3f\\x1c\\x3f\\x9d\\x84\\xab\\xe5\\xfc\\x29\\x66\\xb6\\x0f\\x8e\\x6b\\xf5\\x17\\x95\\xda\\xb3\\xca\\xf1\\xb3\\x83\\x27\\x4f\\xff\\xe3\\xb0\\xb3\\x9c\\xf8\\x0b\\x28\\x6d\\xd9\\x5f\\x57\\xee\\xec\\xc0\\x75\\xbe\\xee\\x9a\\x6e\\xb5\\x1d\\xac\\x9c\\xc3\\x3a\\x71\\xab\\x8b\\x30\\x1c\\x2d\\xfa\\x53\\x27\\xfa\\x75\\x77\\xf7\\x75\\x07\\xe9\\xcb\\x45\\x7f\\x34\\x77\\xf8\\x5f\\x9e\\x36\\x0e\\xdb\\x01\\x4d\\x64\\x3f\\x78\\xaa\\xdf\\x73\\x67\\x8b\\xb9\\x43\\x7f\\x77\\x67\\xee\\xb4\\x37\\x77\\xae\\xae\\xe1\\xf7\\x28\\xec\\xf2\\xd4\\x76\\x38\\xe6\\x3f\\xfa\\xf3\\xa9\\xbb\\xf0\\x7b\\x4e\\xfb\\x59\\xf4\\xdb\\x2a\\xcd\\x82\\x49\\x3b\\x98\\xfd\\x3e\\x5f\\x40\\x3d\\x25\\x22\\x1e\\xe1\\xdf\\x92\\x4d\\x5e\\xf2\\xde\\x57\\xa7\\xb3\\x70\\x11\\x2e\\xb6\\xd3\\xa0\\xea\\xf5\\x27\\xed\\xbb\\x3b\\xcb\\xf0\\xc6\\x89\\xc6\\xeb\\xda\\x5f\\xfb\\x1d\\xab\\x24\\x9e\\x4b\\x87\\x0e\\x66\\x0a\\x3b\\x07\\x8b\\x5e\\x7f\\x6e\\x2f\\x7a\\xb3\\x70\\x7d\\x30\\x09\\xd6\\x07\\x3f\\x42\\xea\\xe5\\x6c\\x16\\xce\\xac\\x92\\xa1\\xce\\x83\\xca\\xc1\\xba\\xe7\\x2e\\x0e\\xfa\\xf3\\x83\\xc5\\x6c\\xdb\\x9f\\x74\\x0f\\x16\\xe1\\x81\\x17\\x1c\\x78\\xe1\\x12\\x5e\\x42\\xea\\x24\\x5c\\x1c\\xf8\\xee\\x68\\xe4\\x7a\\xa3\\xa0\\x64\\x37\\x71\\x9e\\x3d\\xe7\\x74\\x36\\x73\\xb7\\x52\\x4d\\xf3\\x51\\xdf\\x0f\\xaa\\x98\\xcd\\x72\\x67\\xdd\\xe5\\x38\\x98\\x2c\\xe6\\xa4\\x6e\\x13\\xdf\\xc1\\x0e\\x11\\xa9\\xe7\\x36\\x4c\\x56\\x20\\x3f\\xce\\x82\\xc5\\x72\\x36\\x39\\xf0\\xab\\xee\\x74\\x3a\\xda\\x5a\\x98\\xff\\xa0\\x3f\\x81\\x09\\x9b\\xf8\\x38\\xa0\\xf6\\xd1\\x91\\xdb\\xc2\\xc4\\x86\\x4b\\x70\\x3d\\x4c\\x7c\\x77\\x61\\x15\\x69\\xde\\xb6\\xed\\x5d\\x93\\x57\\xde\\x8e\\xf3\\xd2\\x0e\\xc5\\x8f\\x24\\x90\\x5e\\xe1\\x8c\\xb5\\x49\\xb0\\xb3\\x09\\x5d\\x44\\x47\\x47\\x56\\xfc\\x59\\xab\\xd0\\xd9\\xc4\\xd7\\x94\\x06\\xc1\\x56\\x44\\x95\\xbe\\xf8\\xb1\\x3f\\x0e\\x9c\\x32\\xd6\\x75\\xe1\\x2e\\x78\\x65\\x9a\\x4a\\x70\\x0d\\x68\\xaa\\x80\\x64\\xb5\\x02\\xbe\\xda\\x60\\x09\\x2f\\xdc\\x11\\x7d\\xa5\\xe6\\xac\\x24\\xdb\\x66\\x05\\xac\\x12\\x2d\\x50\\x4a\\x15\\xb7\\x77\\xb6\\xcd\\x12\\xe5\\xaf\\x00\\xab\\x89\\x8f\\x79\\x0d\\x8b\\x22\\x5c\\xe3\\x4c\\xcf\\xc3\\x51\\x70\\x74\\xc4\\x7f\\x60\\x01\\xe5\\x81\\x7d\\x2f\\x3b\\x95\\x62\\xf1\\x14\\x12\\x7f\\x89\\x26\\x6c\\xa8\\xe0\\xc0\\xdc\\x44\\xbc\\x8e\\x1d\\xb1\\x8e\\x95\\x56\\x0d\\x4b\\x97\\x6d\\x7a\\xcf\\x31\\xbc\\x66\\xeb\\x41\\xaa\\x88\\xf0\\xdf\\x76\\xd3\\x33\\x76\\x75\\xc7\\x57\\x4c\\x94\\x72\\x15\\xfd\\xaa\\x8e\\x82\\x49\\x77\\xd1\\xab\\xd4\\xaf\\xe9\\x76\\x0f\\xa6\\xb3\\x00\\xd6\\x62\\x20\\xef\\x4a\\xe2\\xd9\\x5f\\x53\\x13\\xb7\\x76\\x67\\x13\\xf5\\xc9\\x2a\\xd1\\xa3\\x0f\\x7f\\xc2\\x86\\x6b\\x1c\\xfc\\x9f\\x52\\xd9\\x2d\\x97\\xfe\\xcf\\x41\\xcf\\x9d\\xc3\\xd6\\x0b\\x60\\xbd\\x46\\x95\\x57\\x0f\\x4a\\xc4\\xbb\\xbb\\x2b\\x95\\x6c\\x6c\\x94\\x2d\\x9d\\xb8\\x41\\x68\\xce\\x73\\xe0\\x75\\x3d\\x7a\\x57\\x75\\xe1\\xcd\\x2a\\x70\\x0e\\x6b\\xf2\\xb2\\x93\\xd7\\xad\\xc5\\xf6\\xb0\\x2f\\x7f\\xfd\\x0e\\x1c\\x10\\x98\\x08\\x8b\\x9f\\x74\\x9c\\x5a\\xd3\\x3b\\xe9\\xc0\\xe2\\xc7\\x95\\xc6\\x6b\\xbd\\x59\\x06\\xcb\\xe0\\xaa\\x73\\x6d\\x37\\x3b\\xe5\\xb2\\xdd\\x76\\x82\\x6a\\x37\\x98\\x04\\x33\\xe8\\xa1\\x65\\x13\\xfe\\xc9\\xd8\\x06\\xf4\\x5c\\x7f\\x18\\x7d\\x45\\xf1\\x65\\x8e\\x8e\\xe2\\x97\\x56\\xdb\\x8e\\x0e\\xd3\\xea\\x74\\x39\\xef\\x41\\x42\\x53\\x6d\\xa8\\x3a\\x9f\\xe2\\x86\\xb6\\x6a\\xa4\\x63\\x93\\xc4\\x2b\\xf6\\x11\\x5a\\xf3\\x80\\xae\\xf5\\x70\\xb9\\xb0\\x7c\\xbb\\x61\\xa5\\xc7\\x0a\\xff\\x5a\\x76\\x7a\\x5a\\xea\\x70\\x28\\x28\\x65\\x77\\x9a\\x3c\\x89\\x36\\xd9\\x91\\xef\\xb6\\xdb\\xaf\\xb0\\xd3\\xca\\xec\\xf3\\x71\\xc6\\xab\\xa5\\x76\\xad\\x19\\xbc\\xe5\\x39\\x5f\\xc5\\x7c\\x35\\xe4\\xbc\\x44\\x4c\\x8a\\x94\\x0a\\xcb\\x2b\\x35\\x68\\x3a\\x4d\\x5e\\x6a\\x38\\x77\\x77\\x22\\xc1\\x82\\x71\\x94\\xe0\\xc0\\x0e\\x3a\\xfd\\x49\\xd0\\x8e\\xaf\\x03\\xb8\\xcc\\x96\\x74\\x87\\x69\\xde\\x05\\x9b\\x69\\x08\\x97\\x1b\\x74\\x8f\\xe5\\xaa\\xf2\\x04\\xc7\\xb5\\xb5\\x75\\xb1\\x5d\\x0b\\xd9\\xf9\\xf6\\x9d\\xac\\x30\\x27\\xbd\\x01\\xab\\xeb\\x59\\x7f\\x11\\x28\\xd7\\x13\\xdf\\x47\\xab\\xb0\\xdf\\x3e\\xa8\\x1d\\x3a\\x0e\\x2f\\xd4\\x71\\xe7\\x0b\\x28\\xd0\\xe2\\x7f\\x59\\x41\\xc8\\xdf\\x70\\x2d\\x9b\\x5f\\xa7\\x30\\x24\\xb7\\x7d\\x9f\\xba\\xb0\\x9c\\x54\\x55\\x7f\\xb2\\x80\\x19\\xa7\\x13\\xf5\\x6a\\xd9\\x87\\x4b\\x1d\\x86\\x23\\x2f\\xfa\\xd2\\x12\\x0e\\xa5\\xf9\\x62\\xd6\\xf7\\x17\\xa5\\xa6\\x48\\x3f\\xf0\\xac\\x91\\xfd\\x75\\x54\\x0d\\x5c\\xb8\\xbd\\xa3\\xcc\\x90\\x14\\x65\\x18\\x47\\xc4\\x06\\x5c\\xf4\\xe3\\x10\\x2a\\xa1\\x77\\x96\\x0d\\x97\\x9c\\x8b\\x9f\\x14\\x76\\x0d\\x7c\\x43\\xd2\\xc7\\x2d\\x38\\x80\\xc5\\xd4\\x84\\x73\\x6f\\x08\\xb3\\xd6\\xc6\\xfc\\xc1\\x0a\\xbe\\x71\\x35\\xec\\x74\\x60\\x0d\\xfe\\x0a\\x59\\x13\\x49\\xbf\\x91\\xd2\\x7c\\xd5\\x85\\x29\\x8f\\x5f\\xc0\\x96\\xed\\x06\\xf8\\xa7\\xfb\\xd1\\x1d\\xc3\\x97\\xb4\\xfa\\xb8\\x88\\x49\\xf2\\xbd\\x3f\\x72\\xe7\\x73\\xcc\\x51\\xf5\\xdc\\x79\\xf0\\xb3\\x3b\\xaa\\x8e\\x19\\x01\\x32\\x59\\x55\\x46\\x41\\x97\\x12\\x1c\\x50\\x18\\x3a\\x54\\x83\\xe3\\xbf\\x8f\\xfd\\xa9\\x38\\x1d\\xd8\\x4d\\x9d\\x05\\x09\\xf0\\xd7\\x22\\x9c\\xda\\xa4\\x76\\x02\\xd4\\x47\\xed\\x04\\x16\\x56\\xfb\\x24\\xbc\\xbb\\x0b\\x4e\\x80\\x62\\x8a\\x5a\\x9a\\x05\\x23\\x3c\\x91\\x7e\\xa4\\x0d\\x1e\\x1d\\xb1\\xaf\\xe1\\x48\\x5d\\x55\\x32\\x54\\xc3\\x35\\x2c\\xf8\\x2f\\x3f\\xbf\\xba\\x1c\\x05\\xb8\\xb0\\xef\\xee\\x06\\xf4\\x96\\x81\\xa9\\x78\\xa0\\x1a\\x61\\x0c\\x79\\x25\\xa2\\x59\\x31\\x0d\\x43\\x9a\\x37\\x36\\x5f\\x3e\\x2c\\xeb\\xcf\\x21\\x5d\\x3a\\x97\\x98\\x7d\\x7e\\x8e\\x19\\x80\\x96\\x60\\x6b\\x50\\x10\\x14\\xbd\\x6a\\xc0\\x3a\\xf1\\x01\\x17\\x00\\x9e\\x24\\x5f\\xe9\\x52\\xf8\\xb5\\xd1\\x26\\xf4\\xc7\\x6f\\x0d\\xbc\\xf9\\x3d\\xbe\\x3d\\xe9\\xfa\\x7b\\x0f\\xeb\\xcf\\x9a\\x2c\\x47\\x23\\x9b\\xd0\\x7e\\xfb\\xd5\\x5e\\xbf\\xdd\\x0e\\x26\\x16\\x7c\\x92\\x5d\\xfc\\x50\\x67\\xe7\\xf3\\xc8\\xe9\\xc2\\x0a\\x06\\xea\\x78\\x81\\xe7\\xa3\\xda\\xde\\x38\\x5c\\x05\\x9a\\x06\\xc9\\x14\\x3b\\xfe\\x2b\\x7c\\xfc\\x65\\xd0\\x18\\x41\\xf3\\xa5\\xb6\\x37\\xf2\\xe1\\x24\\x1d\\x96\\xe4\\x29\\xc2\\xed\\x7c\\x74\\x14\\xd5\\x78\\xc1\\xf3\\x14\\xaa\\x30\\xb7\\xb6\\xf3\\x82\\x55\\xed\\x70\\x8c\\x13\\xac\\x66\\x0e\\x25\\xfd\\x05\\xdf\\x43\\xa1\\x03\\x0b\\xf0\\x1f\\xdf\\xd5\\xc8\\xd4\\x81\\x6f\\xf6\\xbc\\x56\\x23\\x37\\xce\\x84\\x67\\x39\\x85\\xdb\\xbc\\xd4\\x85\\xef\\x53\\x59\\xc3\\x39\\x8c\\x7f\\xa5\\x1d\\x8e\\x93\\xfb\\xde\\xdd\\x06\\xb3\\x92\\x5d\\x6d\\xbb\\x0b\\xd7\\xba\\x1a\\x5d\\xdb\\x64\\xe6\\xdc\\x00\\x99\\xb4\\xc0\\xf3\\x11\\x6f\\x7c\\xbc\\x13\\x4a\\x5d\\xc8\\xe1\\x2e\\x16\\x40\\x11\\xd3\\x6f\\x0f\\x44\\xf9\\x01\\xaf\\xf2\\xc0\\x58\\x65\\x73\\x96\\x51\\x5c\\x2d\\x15\\x7d\\x6a\\x20\\xf0\\x07\\xb8\\xe3\\x28\\xcd\\xb7\\x08\\x97\\x7e\\x0f\\x3f\\x5b\\x89\\x8c\\x6d\\x9a\\x32\\x16\\x1f\\x12\\x52\\x08\\xac\\x80\\x38\\x11\\x56\\x93\\x9c\\x16\\x7d\\x43\\x51\\x32\\x7a\\x82\\xe5\\xd5\\x15\\xad\\x39\\xb8\\xb0\\xd2\\xeb\\x2d\\x3e\\xef\\x7c\\xd8\\x7d\\x78\\x13\\xc5\\x45\\x8e\\x8e\\xa4\\x07\\x3e\\xa6\\x4d\\xbd\\x64\\xc3\\xd7\\xf5\\xf1\\x66\\x89\\x8f\\xe7\\x04\\x9b\\xe5\\xc1\\xac\\xf2\\xaf\\x56\\xaa\\x1a\\x47\\x2f\\x7f\\xb5\\x11\\x4b\\xa1\\x1f\\x06\\x3b\\x7a\\xe8\\xf8\\xad\\x2b\\xce\\x7f\\x55\\x3f\\xba\\x1f\\x17\\xe1\\xbf\\x82\\x59\\x08\\x7d\\xbc\\x6e\\xc0\\x5d\\xfb\\x05\\xce\\xe4\\x49\\x17\\xa9\\xb4\\xe4\\xb7\\xe3\\xf5\\xa4\\xe6\\xbf\\x2b\\xce\\xf7\\xe8\\x25\\x0c\\x84\\x68\\xae\\x10\\x77\\x17\\x65\\x38\\xce\\xc9\\xb0\\x85\\x1a\\xa6\\xd1\\x03\\xe4\\xae\\xe1\\x84\\x07\\x9b\\x3e\\x50\\x50\\x30\\xcd\\x74\\x0f\\x22\\x2d\\xbd\\xb3\\xf9\\x6a\\xf6\\x23\\xe6\\x51\\xb0\\x9b\\x40\\x6a\\xf9\\xd5\\xf6\\x12\\xae\\x7d\\x6c\\x04\\xbe\\x27\\xec\\xf1\\xe0\\x02\\xce\\x9f\\x2d\\x3e\\xfc\\xde\\x9f\\xbf\\x91\\x56\\x1b\\xae\\x34\\x3c\\x0a\\x92\\x07\\x41\\x9b\\x7d\\x5a\\xfe\\x85\\x3b\\xce\\x57\\x3c\\xb3\\x1b\\x35\\x02\\x07\\x76\\xa3\\xb6\\x23\\x5d\\xba\\x87\\x80\\x8e\\x00\\xd2\\x08\\x26\\xc0\\x85\\xe9\\x22\\x09\\x1e\\x34\\x79\\x74\\xc0\\x9c\\x25\\x4e\\xaf\\x38\\xe5\\x9c\\x2d\\xae\\x52\\xe2\\x70\\x80\\xc5\\xcc\\x2f\\x34\\xda\\x8b\\xa1\\x53\\x3a\\xa5\\xbd\\xfe\\xf5\\x93\\x37\\x80\\x8f\\x5c\\xea\\x4f\\x38\\x79\\x20\\x0e\\x48\\x2f\\xe6\\x87\\x7b\\x30\\x6d\\x82\\x13\\xf7\\xe1\\xf7\\x18\\x4e\\xde\\xfe\\x44\\x77\\xc1\\x27\\x49\\xed\\x96\\x45\\xef\\x25\\x47\\x47\\x8d\\x20\\x4f\\x3f\\x6d\\xd1\\x7f\\x1b\\x34\\x17\\x61\\xb7\\x99\\x21\\x33\\xbe\\x6a\\xb1\\x3f\\x0d\\x7e\\xed\\x79\\x76\\xa3\\xb3\\x83\\xfe\\xac\\xfb\\xed\\x45\\xaf\\x58\\x77\\xe0\\x8a\\xc7\\x62\\x6d\\x2c\\xd6\\x0b\\xfa\\xdd\\xde\\xa2\\x58\\xb9\\x80\\x95\\x0b\\xb0\\xdc\\xe6\\x0b\\x7e\\xac\\x62\\xe5\\xba\\xac\\x5c\\x17\\xcb\\xcd\\x7b\\xe1\\x5a\\xb3\\xaf\\xb3\\x8a\\xf7\\x59\\xf1\\x3e\\x2d\\xbe\\xea\\x9e\\x87\\x93\\x85\\x0b\\x85\\x67\\xc5\\x4a\\x0f\\x58\\xe9\\x01\\x94\\x4e\\x90\\x53\\x67\\xfd\\x39\\x7c\\x74\\x85\\xef\\x21\\x7e\\x82\\xa0\\x82\\xab\\xfe\\xd0\\x72\\x65\\x4e\\x9e\\x32\\xed\\xe2\\x22\\x3d\\xc0\\x75\\xc4\\xd6\\x77\\xb3\\xed\\x68\\x04\\x19\\x7e\\x4b\\xd7\\xc9\\xea\\x66\\xd7\\xf0\\x69\\xb1\\x20\\xc1\\x76\\x09\\x4e\\x1f\\x72\\x57\\xa0\\xbf\\x1d\\xdc\\x02\\x1e\\xed\\x27\\xf0\\x36\\x81\\xcd\\x3e\\x39\\xdd\\x2c\\x63\\x77\\x63\\x5d\\x01\\x6b\\x41\\xcb\\x01\\x37\\x47\\xf7\\x8b\\xe5\\x5e\\x75\\x81\\xbb\\x41\\xa1\\x4a\\xbc\\x7e\\x22\\x52\\xbe\\x07\\x27\\x67\\xcf\\xe9\\x62\\x4e\\xc7\\xf1\\xc4\\x10\\xba\\xb4\\x23\\x7d\\x5a\\x67\\x7f\\x62\\x5d\\x75\\xcb\\xc8\\x39\\x44\\x5c\\x22\\x9c\\xff\\xb4\\xde\\x3e\\xd4\\xcb\\x4a\\xe8\\xaa\\xa6\\x77\\x84\\xd3\\xb7\\xc9\\x07\\x77\\xd1\\xab\\xba\\xde\\xdc\\x1a\\x54\\x3c\\xfb\\xc4\\x89\\x1e\\x7b\\xf0\\xd8\\xea\\xe2\\x47\\x74\\xab\\xb8\\xbf\\x83\\xf9\\x82\\xde\\xa2\\x6f\\xa0\\xae\\x4d\\xf6\\x37\\x60\\xc7\\x47\\xfd\\x69\\x8d\\x9f\\x1e\\xcd\\x68\\x1a\\x81\\xe1\\xbb\\x54\\x28\\x5c\\x17\\x58\\x2d\\x7a\\xb8\\x77\\xe3\\x96\\xbd\\x8a\\x6b\\x37\\xdb\\x27\\x0e\\xf2\\xfd\\x27\\x5d\\x4a\\xc2\\x76\\x51\\x76\\x03\\x07\\x1e\\x81\\xa5\\x6c\\x22\\xa5\\x93\\xa7\\xa0\\xc2\\x68\\xc6\\x64\\x36\\xa3\\x06\\x25\\x5a\\x9a\\x5f\\x29\\x43\\xbb\\x29\\x88\\x60\\x18\\x30\\xd4\\x04\\xc7\\x6d\\x4c\\xfd\\xba\\x90\\x28\\xee\\x1e\\xcc\\x65\\x0b\\x89\\x94\\xc8\\x0b\\x9b\\x9c\\x1d\\xd9\\xab\\x7e\\xb0\\x3e\\x0b\\x37\\x25\\xbb\\x41\\x87\\x0e\\x8d\\x31\\x6e\\x99\\x32\\x97\\x50\\xfa\\xa0\\x24\\x18\\xe1\\xa9\\x3b\\x9b\\xc3\\x74\\x2e\\x80\\x8b\\x9c\\x2f\\xb6\\xa3\\xc0\\x2a\\xd1\\x23\\x01\\xce\\xbc\\x7a\\xcd\\x7e\\xea\\x5d\\x1d\\x5f\\x37\\xa7\\xec\\x6c\\x61\\x7f\\x9e\\xf8\\x64\\x4a\\xcf\\x25\\xfa\\xef\\x13\\x7f\\xb7\\xdb\\x45\\xe3\\xf2\\xd9\\xb8\\x0e\\x27\\x7c\\x60\\x4d\\xd7\\x19\\xb6\\x86\\x8d\\x76\\xe8\\xd3\\xdd\\x55\\xf5\\xc2\\xf6\\x96\\xc8\\x74\\x8f\\x1b\\xdf\\x6e\\xed\\xfe\\x4a\\x73\\xb9\\xf1\\x59\\x3c\\x28\\x95\\xad\\x41\\x6b\\xd0\\x28\\x6d\\xb6\\x15\\x9e\\x04\\x83\\xe7\\xb9\\xfb\\xed\\x12\\x59\\xd9\\x64\\x22\\xfa\\x0f\\xdd\\xc2\\xfb\\x4a\\x3c\\x62\\xa7\\xe9\\xfd\\x15\\x65\\x08\\xa7\\xae\\xdf\\x5f\\x6c\\x45\\x62\\x7c\\x53\\x43\\x1f\\xc8\\xc1\\x02\\x65\\x7d\\xf0\\xa7\\x0d\\xff\\x23\\x41\\x45\\x3b\\x13\\xb4\\xad\\x35\\x12\\x25\\x90\\x5f\\x7d\\x0e\\x81\\x42\\x63\\x73\\x2f\\xcd\\x43\\x9b\\xcd\\xc3\\xec\\xe8\\xe8\\x0c\\x76\\x1f\\x4c\\x3c\\x17\\x3b\\x74\\xf8\\x1c\\xc2\\x56\\x64\\x84\\x80\\xd3\\x6f\\xf5\\x1b\\x74\\x22\\xe3\\xd5\\xa9\\xa5\\x3c\\x7c\\x2b\\x12\\x3e\\x5a\\x28\\xc2\\x81\\xc5\\x10\\xc2\\xa1\\x04\\xc7\\xd9\\xeb\\x1f\\x3f\\xbc\\x87\\x5d\\x49\\x80\\xb5\\x58\\xb6\\x62\\x16\\x32\\x49\\xb6\\xc0\\x97\\xa8\\x02\\xc9\\xcf\\xb9\\x87\\xf9\\xd9\\xf6\\x47\\xb6\\xaa\\xf8\\x42\\x42\\xde\\xcd\\x4b\\xdc\\xae\\xb8\\x6a\\x5c\\x56\\x1a\\x6f\\x77\\x28\\x7d\\x86\\x62\\x51\\xa0\\x4e\\xe0\\x9e\\x84\\x4a\\x7e\\xc0\\x2f\\x88\\x9c\\xdf\\xd0\\xf8\\x2e\\x70\\x7c\\x3a\\x38\\xa8\\x09\\x18\\x2b\\x56\\x57\\xdf\\x9c\\xbf\\x19\\xc4\\xfb\\x2f\\xb0\\x4f\\xfa\\xfc\\x9a\\x69\\xd5\\xe0\\xf2\\xf0\\xe8\\xa2\\x8b\\x5f\\x57\\xda\\x8c\\x6b\\xf3\\xd8\\xe2\\x8c\\x5e\\xf8\\xf4\\x19\\xde\\xe2\\x1f\\x7b\\xd7\\x29\\x43\\x73\\x8c\\xbf\\x7c\\x0f\\x09\\x65\\x96\\xbd\\x72\\xfc\\x64\\x08\\x74\\xc3\\x2c\\x1c\\x8d\\xde\\xd3\\xef\\x11\\xe7\\xfa\\x31\\x9c\\x96\\x69\\x5b\\x52\\x1e\\x48\\x23\\x70\\x0a\\xf6\\x4e\\x6a\\x30\\xef\\xfc\\x8c\\xe8\\x8c\\x42\\x38\\x5b\\xbb\\x4f\\x7b\\xf6\\x93\\x9e\\x4d\\xce\\xad\\xab\\x0e\\x81\\x33\\x74\\x67\\x37\\xe2\\x9f\\xa4\\xbd\\xdb\\xb1\\xd3\\x9a\\x53\\x2f\\xa5\\x75\\x09\\x3e\\xfd\\xf1\\x0b\\x38\\x49\\x6b\\x40\\x52\\xd0\\xd4\\x88\\xa8\\xa0\\x7f\\x46\\x48\\x67\\x8c\\x1d\\xa4\\xfd\\x27\\x2c\\x25\\x64\\x7f\\xa6\\xfc\\xe3\\xd0\\x07\\xfc\\x3e\\xf8\\x63\\x07\\x0c\\x42\\x82\\x22\\x9a\\x61\\x05\\x73\\xa7\\x0e\\x15\\x2c\\xf0\\xe7\\x12\\x25\\x3a\\x2b\\x27\\xde\\x4a\\x95\\x52\\x59\\xea\\x7f\\x3d\\x78\\xf1\\x84\\x3e\\xce\\x5c\\x20\\x60\\x80\\xbb\\xb7\\xc9\\x1a\\x33\\x57\\xa6\\x8c\\x0d\\xac\\x50\\x3e\\x67\\x5e\\x99\\x84\\x40\\x5e\\x92\\x8d\\xf6\\xee\\xdc\\x91\\xad\\x21\\xfd\\xd6\\x90\\x7e\\x9a\\x94\\xe5\\xe3\\x60\\xe0\\x72\\x71\\xf9\\xe5\\x52\\x2a\\xf1\\xc5\\x1e\\x9f\\x14\\xd1\\x19\\xe2\\xc3\\xea\\x5e\\x04\\x7c\\x1d\\xc3\\x66\\x67\\x92\\x79\\x7a\\x79\\x2d\\xc4\\x62\\xf5\\xe4\\x4d\\xbd\\xe8\\xc1\\x76\\x88\\x18\\x23\\xf7\\xda\\x4e\\x11\\xd6\\x3c\\x47\\xd3\\x8f\\x53\\x70\\xe3\\x47\\x0f\\xed\\xf8\\x60\\x0a\\x47\\x40\\xd7\\x4d\\x4a\\xe4\\x59\\xfc\\x1a\\x4e\\xfe\\x70\\xd2\\x95\\x0e\\x8a\\xd2\\xa6\\xb2\\xc2\\x3b\\xaa\\x44\\xb9\\x98\\xde\\x62\\x3c\\xb2\\xb6\\x70\\xba\\xd2\\x34\\x9b\\x51\\xcb\\xed\\x44\\x17\\xf1\\x60\\xcc\\xee\\x22\\xcb\\x81\\x42\\x13\\xa5\\x60\\xc4\\xf1\\x69\\xe9\\x85\\x79\\x30\\xeb\\x07\\xf3\\x9d\\xa6\\x3a\\xf9\\x60\\x2b\\xf5\\x60\\x93\\x8d\\x70\\xa3\\xe9\\x99\\x82\\x6a\\xf4\\x7e\\x07\\x3b\\x54\\x9d\\x96\\xa8\\x0e\\x26\\x66\\xa9\\xc0\\x04\\x85\\x33\\xc6\\x91\\xb0\\xe1\\xab\\xc7\\x3b\\x3f\\x80\\x51\\xe8\\xd7\\x9d\\xe1\\x01\\xc0\\x0a\\x18\\xda\\xa5\\xef\\xf0\\xba\\x35\\xb4\\x39\\x0c\\xb6\\xd2\\x1c\\x6b\\x29\\xa2\\x5b\\x98\\x78\\xc8\\x06\\x29\\x19\\xf5\\x24\\xbf\\x96\\xb6\\xa6\\x8d\\xf8\\x84\\xa2\\x2e\\xf9\\x33\\x60\\x75\\xaa\\xd0\\xcc\\xe5\\x5a\\x85\\x68\\xee\\x04\\xf7\\x98\\x62\\x58\\xf0\\xc8\\x76\\x91\\x82\\xaa\\x11\\x20\\x9b\\x70\\x23\\x76\\x03\\xeb\\xaa\\xf4\\x97\\x4e\\xa7\\x83\\xfa\\x0b\\x3a\\x09\\xd7\\xa8\\x4c\\xaa\\x7e\\xd7\\x4c\\x48\\x0c\\xa2\\xf9\\x0c\\x67\\xc0\\xf7\\x56\\xbc\\x70\\xb1\\x08\\xc7\\x62\\x4a\\x3d\\xe0\\x28\\x93\\x39\\xf0\\x58\\x93\\x5f\\xef\\x76\\xe2\\x62\\xf2\\x04\\xb5\\x01\\x0c\\x11\\xbb\\x54\\x9a\\x49\\xc1\\x23\\x12\\x4e\\x21\\xbc\\x84\\x33\\x10\\x4e\\xd5\\xd2\\xf7\\xf0\\x49\\x0f\\xe8\\x1c\\x3a\\xff\\xc5\\x5e\\xfc\\xd7\\x49\\xa9\\x2c\\x32\\x95\\x4b\\xdf\\x3f\\x85\\x0c\\x27\\xb0\\x66\\x81\\xcf\\x38\\x4b\\x6e\\x78\\xf7\\xe8\\x48\\x2c\\x4f\\x3e\\x51\\xec\\x21\\x4d\\x32\\xb3\\x5e\\x1c\\x1e\\x8a\\x1c\\x9c\\xc4\\x6c\\x1a\\x0a\\x31\\x96\\xcc\\x4e\\x6c\\x01\\xe7\\x4a\\xfc\\xba\\x86\\xcf\\xcc\\xd5\\x1c\\x87\\xf5\\x1d\\x39\\x57\\x04\\xda\\x21\\xf6\\xca\\x74\\x83\\xfa\\xa4\\x0d\\xdb\\x2f\\x22\\x97\\x42\\x7e\\x5f\\xbc\\xa6\\x57\\x14\\x12\\x4b\\x70\\xaa\\xa7\\xde\\xfe\\x82\\xb4\\x14\\x7d\\xd9\\x17\\x2a\\xd7\\x2a\\xe3\\x15\\xbf\\xf4\\x6f\\x71\\xba\\x29\\xb1\\x05\\x97\\x80\\xf6\\x25\\xbb\\xfe\\xe0\\x6e\\xe0\\x32\\xdf\\xa9\\xdb\\x0d\\x7e\\xfb\\x44\\x2b\\x86\\x0b\\x41\\x4a\\xfc\\x95\\x25\\x36\\x07\\x22\\x91\\x92\\x06\\xb4\\xf1\\x13\\x47\\x21\\xbf\\xf8\\x8d\\x46\\x5f\\x01\\x41\\x35\\xa8\\xd4\\xbf\\x83\\xae\\xc9\\xa5\\xd8\\x80\\xf4\\xc5\\xd8\\x3b\\xa0\\x59\\xfa\\x50\\x8e\\xae\\x9c\\x19\\x59\\xc0\\x1d\\x23\\x7f\\x5d\\xbe\\xcc\\x9b\\xed\\xf0\\xa0\\x3f\\xff\\xe8\\x7e\\x84\\xcf\\x14\\xdd\\xac\\xf6\\xdd\\x9d\\xe5\\x95\\x1d\\x39\\x85\\xb8\\xd1\\xe3\\x67\\xa0\\xef\\x27\\x8b\\xe6\\xba\\xd7\\x1f\\xa1\\x54\\x3c\\xe2\\xa6\\x77\\x70\\x81\\xa5\\x5b\\xf0\\xd3\\x2d\\xe0\\x5d\\x9e\\x68\\x82\\x26\\x15\\x69\\xa3\\x39\\x5f\\xf7\\x51\\x60\\x00\\x9c\\x80\\xef\\xce\\x83\\x52\\x50\\x6a\\xc0\\x45\\x02\\x74\\x51\\xa5\\x57\\xe9\\x02\\x91\\xe3\\x5d\\xd5\\xaf\\x2b\\xc1\\xd3\\x63\\xb8\\x61\\x57\\x56\\x68\\xc3\\xed\\xba\\xc4\\x3f\\xd3\\x13\\xdc\\x0f\\x2c\\x67\\xb9\\x7b\\x32\\x6d\\xb1\\x1f\\x8d\\x69\\x65\\x56\\xf6\\x81\\x2a\\x3b\\x59\\x50\\xd6\\x61\\x58\\x59\\x94\\xdb\\x50\\xa8\\x1c\\x9c\\x0c\\xcb\\x03\\x96\\x54\\x1e\\x60\\x62\\x05\\xc9\\x39\\x58\\x6f\\xc3\\x26\\x6d\\x76\\x2d\\x9a\\x2d\\x67\\x34\\x3a\\x2b\\xf7\\x4e\\xfa\\x51\\xb3\\xd8\\x41\\xa9\\xa5\\xf2\\x8b\\x22\\xed\\x4c\\xe2\\xe1\\x3d\\x3d\\xae\\xbc\\xe0\\x6d\\x41\\xa3\\xfa\\xe1\\x4d\\xb1\\xd6\\xb8\\x59\\x1f\\x4b\\x15\\x6b\\x68\\x2e\\x37\\x14\\x0d\\xa9\\xb2\\x6f\\x43\\xd1\\xf0\\xd4\\x51\\x20\\x59\\xc2\\xeb\\x17\\x75\\x27\\x6a\\xde\\xf9\\x15\\xe7\\x86\\x51\\xdd\\x6d\\xfc\\x85\\xe4\\x28\\x2e\\xa0\\xb5\\x13\\x1a\\xc9\\x56\\xdd\\x86\\xbb\\xbb\\x8b\\x36\\x84\\xf8\\xc1\\x89\\x10\\x89\\x48\\xd4\\x6d\\xca\\xdc\\x82\\x94\\x02\\xdd\\x38\\x70\\x29\\xbb\\x93\\x39\\x8a\\xe7\\x2d\\xe0\\x76\\xd6\\xb4\\xcb\\xe5\\xa9\\x5d\\x2e\\x4d\\x37\\xe4\\x80\\xa6\\x40\\xd7\\xcb\\x43\\x9a\\x60\\x97\\x80\\xe6\\x52\\x0a\\xf8\\x22\\x5f\\x9b\\xbf\\xbf\\xc5\\x9b\\x86\\xd2\\x70\\xd3\\x10\\xf3\\x30\\xb9\\xa2\\xb5\\x21\\x5b\\x1b\\xe8\\xaf\\x14\\x2f\\x64\\x7f\\x5f\\xad\\x37\\x47\\xad\\x49\\x95\\x56\\xda\\x67\\xe7\\x5e\\xb5\\x4d\\xc5\\x75\\x63\\x5b\\x91\\xe3\\xa5\\xb9\\xa8\\xc6\\x84\\xb5\\x34\\x5b\\x4e\\x51\\x3e\\xa8\\x56\\x21\\x4a\\x9e\\x02\\x19\\x2f\\xae\\xac\\x1f\\xd7\\x41\\x80\\x82\\x61\\xcc\\x08\\xdc\\xf8\\x58\\xc1\\x02\\x88\\xab\\x7b\\x47\\x4a\\xfd\\x31\\x2a\\xe5\\xdc\\xc9\\x22\\xa6\\x1d\\x2a\\xeb\\xc0\\x1b\\xf6\\x17\\x15\\xa9\\xec\\x36\\xdd\\xa7\\x3a\\xca\\x25\\x63\\x00\\x84\\x4e\\xad\\xe1\\xac\\x49\\xbb\\x1a\\x4e\\xb1\\xd1\\x08\\x0e\\x23\\x9e\\x51\\x7b\\x49\\xd5\\xe8\\xa8\\xaf\\x6d\\x57\\x7f\\x17\\xd9\\xd8\\xed\\xc2\\x69\\x50\\xeb\\xeb\\x8e\\x7c\\x15\\xc3\\x6b\\x7c\\x85\\xc5\\xd4\\x48\\x8f\\x62\\xbe\\x23\\x73\\xf9\\x05\\x1c\\x5f\\xd0\\xda\\x6e\\x47\\xba\\x33\\x77\\x05\\x5d\\x35\\x95\\xeb\\xa4\\xcb\\x75\\x68\\xb9\\x76\\x9f\\xdd\\x75\\xa6\\x82\\xdd\\x74\\xc1\\x2e\\x2d\\x38\\x9f\\xb8\\xd3\\x8b\\x9c\\xc2\\xbd\\x74\\xe1\\x1e\\x2d\\xcc\\x68\\xa5\\xb9\\xa9\\xdc\\x20\\x5d\\x6e\\xc0\\xca\\x21\\x84\\x28\\x12\\xbd\\x99\\x8a\\x0f\\xd3\\xc5\\x87\\xb4\\x78\\xa7\\xbf\\x09\\xda\\xb0\\xb1\\x4c\\x05\\xfb\\xe9\\x82\\x7d\\x5a\\x30\\x98\\x20\\x5f\\xd0\\x36\\x95\\x9b\\xa5\\xcb\\xcd\\x68\\xb9\\x48\\x46\\x6d\\x2a\\x39\\x4e\\x97\\x1c\\xb3\\x91\\xc2\\x20\\x61\\x6d\\xbd\\x62\\x9a\\xee\\xd0\\x38\\xd6\\xd3\\x74\\x05\\xa7\\xb4\\x02\\x4a\\x5c\\xbe\\x84\\x05\\x0d\\xac\\x86\\x79\\xaa\\x36\\xe9\\xe2\\x1b\\xd6\\x73\\x20\\x59\\x82\\x59\\x6e\\xf9\\x6d\\xba\\xfc\\x96\\x96\\x07\\x2a\\x39\\xb7\\xf0\\x6d\\xba\\xf0\\xad\\xd4\\xf8\\x65\\xf6\\xa4\\x2f\\xd2\\xa5\\x17\\xb4\\xb4\\x46\\x17\\x60\\xaa\\x63\\x99\\xae\\x03\\x38\\xdc\\x43\\xac\\x65\\x1a\\xb2\\x33\\xc7\\x54\\x74\\x9a\\x2e\\xca\\x05\\x5b\\x12\\x85\\x2b\\x4b\\xca\\xb9\\xac\\x86\\x49\\xbb\\xa4\\x3c\\xb1\\xe8\\x9d\\xbe\\x82\\xa6\\x19\\x69\\x61\\x6a\\xf8\\x26\\xdd\\xf0\\x4d\\x66\\xc3\\xfc\\xba\\xba\\x31\\x37\\x7c\\xc3\\x1b\\x66\\xda\\x12\\x53\\xc3\\xa3\\x74\\xc3\\xa3\\x43\\x07\\x48\\x6f\\x6b\\x84\\x73\\x46\\xda\\x16\\x72\\x00\\x04\\xf9\\x47\\x53\\x15\\x41\\xba\\x0a\\xb7\\x4a\\x65\\x03\\x14\\x1f\\x46\\xd7\\xac\\xc3\\x53\\xaa\\x1b\\x12\\xd1\\xdb\\xe2\\x07\\x47\\x12\\x72\\xd2\\x5d\\xcd\\xbe\\x8d\\x5f\\x50\\x9e\\x24\\x7a\\x41\\x9f\\x50\\x09\\x27\\xbf\\x45\\xde\\x17\\x3f\\x33\\x17\\x63\\xe0\\x15\\x6a\\xea\\x74\\x98\\xe8\\xb4\\xfd\\x15\\xca\\xf5\\x8d\\xeb\\x72\\xa5\\xc9\\x4e\\x51\\x28\\xec\\x4a\\xe8\\x4f\\xfa\\x8b\\x4f\\xec\\xfc\\xa7\\xb7\\xc1\\x6e\\x67\\xc5\\x2f\\x63\\x72\\xdd\\x49\\xc3\\x31\\x29\\x6d\\xdf\\xf8\\xee\\x79\\x8d\\x30\\x42\\xbe\\xf1\\xfc\\xef\\xb5\\xe8\\x52\\x4a\\x11\\xea\\x11\\x32\\x4c\\xa2\\xc2\\x5b\\x30\\xc7\\x4c\\x43\\x93\\xca\\x0e\\x5d\\xe0\\x4a\\x98\\x74\\x31\\xe2\\xda\\x8d\\xd2\\xf9\\x97\\x2f\\xf5\\xf3\\x70\\x3c\\x75\\x17\\x25\\x27\\x26\\xe6\\x7d\\x9a\\xf2\\x01\\x78\\xbd\\xa3\\x23\\x13\\x5d\\x62\\x7e\\x23\\x73\\x35\\x71\\xdf\\x8a\\xe4\\x8e\\xbb\\x9b\\x93\\x3b\\x1e\\x81\\xc2\\x80\\x48\\x7d\\xa2\\xfc\\x48\\x76\\x47\\x92\\x59\\x34\\xad\\x4b\\x59\\xe2\\x26\\xdd\\x5d\\xe2\\xcb\\xfe\\x10\\xcc\\x95\\x6f\\x1b\\xcb\\x03\\xf8\\xac\\xbb\\xed\\x36\\xa5\\x29\\xde\\xc3\\xcd\\x8a\\x47\\x7f\\xcb\\x90\\x8e\\xc8\\x47\\xac\\xaa\\x84\\x5a\\x25\\x8e\\x51\\xbc\\xfc\\xe1\\x87\\x4f\\x3f\\x34\\x0e\\x5e\\xba\\xc0\\x8b\\xb4\\x29\\xf2\\x14\\x21\\xa9\\xf0\\x97\\xd7\\xc1\\x4a\\xc0\\x13\\xac\\x22\\x44\\xc2\\xd9\\xe4\\x6b\\x04\\x99\\xf2\\xe0\\x4a\\x0e\\xdc\\x99\\xbc\\x6a\\xa3\\x52\\xa8\\xe6\\x34\\x36\\x0e\\x6b\\x3b\\x1a\\x23\\xec\\x87\\x73\\xba\\xf3\\xe4\\xf1\\x01\\x63\\x1d\\x21\\x4b\\xbc\\x98\\x91\\x66\\x25\\xda\\x41\\xc7\\x5d\\x8e\\x58\\x29\\x8b\\x0a\\xdd\\x18\\x1a\\xb5\\x3f\\xa7\\x7f\\xa1\\xbc\\x90\\xc1\\x45\\x72\\x8e\\x70\\x06\\xf4\\xb5\\x3b\\xb2\\x84\\x68\\xc3\\x8b\\x98\\x2e\\x55\\xce\\xc2\\xe4\\x62\\x71\\xd3\\x2d\\xb7\\xe1\\x35\\x55\\x59\\xd0\\xdd\\x9d\\x0f\\x5b\\x70\\xb7\\x8b\\x19\\x43\\x5d\\xbf\\x34\\xf8\\xda\\xe4\\x80\\xad\\xa8\\x77\\x88\\x33\\xec\\x86\\xb3\\xed\\x71\\x2d\\xea\\xa0\\x6d\\xc7\\xf5\\xfa\\xcb\\xf9\\x22\\x1c\\xff\\xd8\\x83\\x15\\x9a\\xd2\\x36\\x51\\xf0\\xa1\\x56\\x70\\x05\\x77\\x29\\x10\\x04\\x08\\x24\\xc8\\x6c\\x87\\xab\\xa8\\x7c\\x21\\xd2\\x48\\x4e\\x0b\\x17\\x98\\x77\\x1c\\x0f\\x65\\xfe\\x5c\\x34\\x9a\\x46\\x8b\\xba\\x57\\x9d\\xeb\\x16\\xfe\\x63\\xd9\\x8d\\xf8\\xb6\\x10\\x89\\x0d\\x0b\\x31\\xd5\\x71\\x2b\\x36\\xb2\\x41\\x75\\xe2\\x5f\\xb5\\xaf\\x6d\\x69\\x29\\x4c\\x07\\xae\\x24\\xdd\\xa5\\xe3\\x63\\xbd\\x8b\\xd2\\xda\\xf6\\x57\\x18\\x0d\\x15\\x90\\xb5\\x89\\x9c\\xca\\x44\\xdc\\xb1\\x68\\xca\\xb7\\xb9\\x2c\\xa9\\x19\\x00\\x1f\\x84\\xec\\xf6\\x47\\x78\\x84\\x75\\x39\\x1d\\xb9\\x7e\\x70\\x0e\\x9c\\x77\\xdb\\x92\\x04\\xbb\\x76\\xaa\\x1c\\x09\\x6c\\xa5\\x5f\\xb4\\x3b\\x48\\xcf\\x47\\xa5\\x50\\xea\\xe6\\x29\\x80\\x10\\xe9\\x9b\\xf7\\x60\\xd5\\xc3\\x4c\\x53\\xdc\\xe0\\x97\\x05\\x12\\xea\\x14\\xf5\\xdc\\x9b\\x05\\x1d\\x42\\x7f\\x2d\\x82\\x0d\\xa5\\x49\\xa1\\x67\\x24\\x7a\\x05\\xf3\\x62\\xc9\\x0f\\x02\\xe2\\x33\\x9d\\xd1\\xbf\\x17\\x6c\\x81\\x59\\x54\\xac\\x1f\\x75\\x9e\\x6d\\x39\\xd6\\x91\\x69\\x38\\x9d\\x63\\x6b\\x4a\\x5f\\xa2\\x6a\\xe8\\x2b\\x38\\xc4\\x2c\\x35\\x05\\x87\\x15\\x2f\\x36\\x77\\xe4\\x9f\\x4e\\xa7\\xb3\\x70\\xf3\\x23\\xf4\\xf0\\x97\\x94\\x66\\x5e\\x01\\xbd\\xc7\\x9f\\x9f\\x31\\x3f\\x5a\\x20\\xb1\\x4b\\xc7\\x2a\\x24\\x26\\x69\\x55\\x5f\\x07\\x66\\xa1\\x42\\x4f\\x06\\x5b\\x7c\\x1f\\x18\\xc8\\xa6\\x44\\x4a\\x4c\\xff\\x47\\x50\\xf1\\x83\\x55\\x58\\x76\\x62\\x91\\xfa\\x4f\\xbc\\x27\\xd5\\x17\\x62\\x27\\xd6\\xe2\\x41\\x44\\x80\\x16\\x8d\\xec\\xbf\\x34\\x59\\x8e\\xbd\\x60\\x26\\x41\\x13\\xee\\xee\\xb8\\x04\\xc7\\xbe\\xbb\\x13\\x4a\\x80\\xbb\\xbb\\xfa\\xd3\\x1a\\xfb\\xe1\\xc2\\x9f\\x0a\\x3c\\x01\\xeb\\x08\\x47\\x73\\x34\\xef\\x2a\\xdc\\x79\\x8d\\x40\\x8b\\x1f\\x23\\x9e\\x53\\x23\\x2a\\xba\\xc2\\x0f\\x7b\\x2d\\xf0\\xf3\\x57\\xd7\\x26\\xc4\\xbe\\x1d\\x9f\\x37\\x31\\x0f\\xcb\\xd1\\xd2\\x78\\x46\\xc5\\xa3\\x64\\x48\\xa3\\x5f\\x28\\xc4\\x43\\xdd\\x35\\x54\\xf5\\x9f\\xc4\\xf1\\x6b\\x8a\\xc5\\x58\\x80\\x60\\xad\\x7b\\x4f\\x6b\\x6b\\xca\\x87\\x22\\xec\\x6a\\xbf\\xe5\\x37\\x8e\\x5f\\xa0\\x46\\xfb\\xea\\x9a\\x74\\x28\\x9a\\xbf\\x49\\x17\\x2d\\x37\\xe0\\xd0\\x9d\\x46\\x8e\\x69\\xbc\\x35\\xdc\\x65\\x69\\x5d\\x38\\x52\\x78\\xbf\\xff\\xce\\x7a\\x12\\xb4\\x51\\x7d\\xa4\\xbe\\xd3\\xc0\\xf9\\x2f\\x53\\x68\\x7e\\xb9\\x82\\x1a\\xe9\\x54\\xa3\\x7c\\x08\\xf3\\x82\\xae\\x96\\x70\\xe1\\x43\\x7d\\x24\\x00\\xba\\xa5\\x1d\\x6c\\x3e\\xa1\\xaa\\xf1\\xfb\\x1a\\x42\\xa5\\x29\\xdc\\xd7\\xc5\\x7d\\x86\\x23\\xdb\\xb1\\x1d\\x0a\\xf7\\x57\\xa0\\xc2\\x4d\\xe2\\x93\\x8e\\xca\\x85\\xb0\\x2a\\x18\\x29\\xcf\\xbe\\xd0\\xad\\x06\\x22\\xbe\\x8f\\xe7\\x24\\xf1\\x1e\\x27\\xf5\\x96\\x79\\x55\\x20\\x2a\\x0b\\x75\\x4a\\x51\\x56\\x0f\\xe8\\xd4\\xa9\\x7c\\xd8\\xb6\\x5b\\x6d\\xfa\\x59\\x92\\x13\\x67\\x1c\\x1c\\xc1\\xf5\\xed\\xc7\\x97\\xab\\x3a\\x5d\\x2e\\x93\\xbb\\x68\\xee\\x31\\x36\\x23\\x6e\\x24\\x54\\x31\\x67\\x69\\x2a\\x95\\xd2\\xed\\x24\\xb0\\x2d\\x87\\xb0\\x99\\xf0\\x0c\\x9a\\x6d\\x35\\x5a\\xa3\\x43\\x91\\x6d\\x67\\x63\\xc6\\xc3\\x7a\\x93\\xe1\\x22\\x6a\\xba\\xad\\x21\\x8b\\x77\\xfc\\xa4\\x06\\xc4\\xfe\\x5a\\x2e\\x77\\x77\\x3c\\xb5\\x94\\x34\\xf8\\xc0\\x1e\\x55\\x2a\\x5d\\xca\\x45\\x18\\x17\\x8b\\x64\\x15\\x03\\xbb\\x8f\\x9e\\x95\\x7c\\x35\\xf0\\x0c\\xf2\\xf8\\x03\\xe3\\x98\\x94\\x09\\xde\\x21\\x12\\x38\\x28\\xb2\\xee\\x25\\x08\\x6b\\xa2\\x2f\\x92\\x99\\xcd\\x4e\\xa6\\x41\\x82\\xe9\\xe5\\x06\\x6e\\x95\\xb6\\x42\\x4f\\x71\\xfd\\xf9\\x9e\\x2b\\xae\\xe9\\xa7\\xbb\\xe8\\x4b\\xb6\\x0a\\x70\\xba\\x1c\\xf8\\xe2\\xee\\xf5\\xe0\\x32\\x4f\\x2a\\x4e\\x50\\xdd\\x1c\\x32\\x7c\\x5a\\x74\\x1d\\x60\\x3e\\xd2\\x4d\\xa7\\x23\\x31\\xd0\\xec\\x1c\\x1d\\x1d\\xc2\\x2d\\xd2\\x6d\\xa5\\xc7\\x63\\xd1\\x82\\x94\\x64\\x68\\xe0\\x4f\\x07\\x7f\\xee\\xe4\\xab\\x8b\\x5e\\x66\\x09\\x93\\x1a\\xf3\\x31\\xc8\\xae\\x3e\\xdd\\x01\\x48\\xdf\\x70\\xe5\\xef\\x57\\xa4\\xa1\\x64\\xae\\x4c\\xb5\\xa4\\x62\\xa5\\x91\\xb5\\x8b\\xf4\\xeb\\x14\\xeb\\x42\\x57\\x88\\xde\\x1e\\xcd\\xef\\x21\\xe1\\x05\\xb7\\x1b\\x1c\\x26\\x25\\x76\\xbe\\xa8\\xc7\\x19\\xa6\\x2b\\xc7\\x9d\\x0f\\xc7\\x06\\x22\\x94\\x79\\x66\\xa0\\x1f\\x17\\x7a\\x04\\x19\\x82\\xe3\\xa4\\xf3\\x6a\\x9e\\xcc\\x28\\x69\\x12\\x3d\\xd4\\x50\\x28\\x03\\xb3\\xe5\\x81\\xfa\\x04\\x68\\x2a\\x17\\x3e\\x36\\x69\\x1f\\x1d\\x79\\x16\\x5f\\xf3\\xbc\\x5e\\x64\\x46\\x95\\xd5\\x15\\x20\\x54\\xf8\\xab\\x6e\\x11\\x5a\\x54\\x53\\xc9\\xb7\\x6f\\x8a\\x39\\x6d\\x33\\xea\\xfd\\xed\\x97\\x4f\\x1f\\xab\\x73\\x2a\\x1a\\xee\\x77\\xe0\\x92\\x43\\xfc\\x6b\\x22\\xcd\\x13\\x1f\\x0a\\xce\\x02\\xb1\\xfc\\x7c\\x5c\\x7e\\xae\\x1d\\x13\\xeb\\x57\\xfe\\x35\\xe2\\x6b\\xe1\\x8f\\x83\\xc3\\xa1\\x3f\\x5c\\xf8\\x07\\x3e\\xca\\xa1\\x38\\x3a\\x0e\\x81\\xf9\\xa5\\x83\\x58\\x4e\\xdb\\x89\\xd5\\x82\\xe0\\x26\\x1f\\x3a\\x8c\\xe0\\x7e\\xf6\\x35\\x6d\\xd2\\x65\\xfb\\x82\\x2a\\x3a\\x8f\\x8e\\xd4\\x6f\\xc5\\x3e\\xa4\\xe5\\xc9\\xdb\\x4f\\x12\\xdd\\x6a\\xef\\x41\\x0a\\xbd\\x1f\\xbb\\x53\\x04\\x1d\\x69\\x10\\x60\\x30\\x97\\x1a\\x02\\x0a\\x9b\\xbd\\x72\\xaf\\x59\\xfb\\xf0\\x03\\x9b\\x64\\x82\\x61\\xda\\x2f\\x71\\x47\\xc9\\x14\\xdc\\x8f\\x40\\x8f\\xce\\x7f\\xd5\\xd2\\xd2\\x70\\x23\\xc0\\x41\\x8a\\x93\\x18\\x34\\x83\\xef\\x23\\xba\\x3f\\x28\\x3b\\x75\\x41\\xea\\xfb\\x57\\x01\\xb4\\x86\\xff\\x32\\x69\\xc9\\xbc\\x25\\xfd\\xe6\\x05\\x1a\\xb5\\x26\\xec\\x84\\x93\\x76\\xab\\xd3\\x68\\x47\\x26\\x5b\\x8c\\xa5\\xfc\\x21\\xb8\\x81\\x7c\\x0b\\x60\\x27\\x19\\xa9\\x75\\x80\\x63\\xc0\\x0e\\x71\\x06\\x92\\x67\\x3b\\x87\\x7e\\x2e\\xa9\\x25\\xc0\\xc1\\xd8\\xdd\\x1c\\xb0\\xda\\x99\\xed\\x23\\x66\\x6c\\xc3\\x17\\x74\\x3c\\x68\\xc0\\x73\\xda\\x95\\x3a\\xf0\\x9a\\x9e\\x53\\x3f\\xf1\\x5a\\xec\\x97\\x84\\x1e\\x49\\x57\\x48\\x4d\\x28\\xa1\\xbd\\x03\\x3f\\x5c\\x4e\\x16\\x07\\xae\\x68\\xd7\\xd3\\xcc\\xd1\\x6f\\x89\\x39\\x4a\\xf0\\x6a\\xf1\\x5c\\x32\\xfa\\x5f\\x23\\x90\\x49\\xec\\x2f\\xf7\\xca\\x83\\x55\\x57\\xfd\\x1d\\xd7\\xcd\\x1c\\x55\\xb9\\xec\\x17\\xa4\\xb6\\xa4\\xdf\\x0d\\xf9\\x3c\\x35\\xe2\\x3f\\xdd\\x48\\xe8\\x8f\\x95\\xfa\\x54\\x38\\x20\\x27\\xed\\x74\\xfd\\x99\\x6b\\x0e\\x7e\\xae\\x32\\x80\\x93\\xe3\\xd3\\x7a\\xf2\\x79\\x16\\x4e\\x83\\xd9\\x62\\x8b\\xc8\\xab\\xb9\\xe5\\x45\\x15\\xe2\\x16\\x46\\x24\\x55\\x76\\x66\\x3a\\x02\\x9a\\xb5\\x09\\xcc\\xa5\\x20\\x67\\xdb\\x76\\xb4\\x2d\\x03\\x76\\x2b\\xa4\\x3b\\x86\\x33\\x08\\xcb\\x48\\x99\\xc4\\x5e\\x30\\x8b\\xfa\\x7d\\xf1\\x2c\\x45\\x27\\xc1\\x68\\xdb\\xcf\\x84\\xde\\x23\\x6a\\x4c\\x4e\\xbd\\xbb\\xbb\\x42\\x5c\\x42\\x75\\x39\\x99\\xf7\\xfa\\x9d\\x05\\xae\\x86\\xf8\\xc1\\xa5\\x6c\\xd2\\x2c\\xa0\\xb6\\x88\\xd2\\xd5\\x29\\x7f\\x48\\x17\\xef\\xa9\\x9f\\x26\\x7d\\x58\\xb2\\xda\\x1d\\x5b\\x9d\\x87\\x68\\xb1\\x57\\xed\\xf4\\x47\\x08\\x5f\\xd1\\xad\\x96\\x43\\xe0\\xb1\\xbd\\x43\\x3c\\x6a\\xd0\\x32\\x51\\xbe\\x90\\xb6\\x63\\x2f\\x1c\\x7d\\x70\\xa7\\x0e\\xdf\\xf5\\x76\\xe2\\x95\\x01\\x98\\xe9\\x91\\x88\\xeb\\xf6\\xe3\\x03\\x88\\x60\\x32\\x02\\x68\\x13\\x49\\xfc\\x64\\xab\\xd4\\x99\\xd1\\xd2\\x7c\\xd5\\xe5\\xb5\\xa3\\xe9\\xf1\\x3c\\xa2\\xfe\\x3a\\x76\\x4b\\x79\\x8b\\x3a\\x32\\xc8\\x00\\xe9\\x55\\x64\\xbe\\xac\\xae\\x6d\\xe1\\xf2\\x4a\\xf4\\x1c\\x97\\x01\\x64\\x81\\xb7\\x3b\\x8e\\x3f\\x70\\xbe\\x7b\\x1e\\x43\\xcc\\xa9\\xd1\\xae\\x6e\\xda\\x52\\x6b\\x99\\x0a\\x63\\x68\\x4e\\x58\\x27\\xf0\\x61\\x3c\\xbb\\xe1\\x53\\x54\\xb4\\x22\\xda\\xca\\x86\\x7e\\xa7\\x6a\\x68\\xef\\xe4\\x4d\\xad\\x2e\\x27\\xed\\xe1\\x97\\xb1\\xb6\\xfd\\xc4\\x46\\x08\\x72\\x32\\xc7\\x1b\\x81\\xe0\\x67\\xfa\\x9d\\xb7\\x1e\\xb4\\x71\\x49\\xc2\\x67\\xf2\\x13\\xab\\x14\\x31\\xce\\x62\\x05\\x07\\xb6\\xf8\\xd5\\x89\\x7e\\x75\\xd1\\xc6\\x48\\xac\\x5c\\xb8\\x78\\x7b\\xf2\\x9a\\xd6\\x2e\\xe3\\x1e\\xd2\\x86\\x71\\xbb\\x8e\\x66\\x49\\x5b\\x99\\x4d\\xb6\\xa3\\x5f\\x5e\\xa2\\xff\\x36\\xad\\x3a\\xde\\x7b\\xba\\xaa\\xbb\\x52\\x61\\x75\\x3f\\x26\\xce\\xc9\\x2f\\x3f\\xbf\\x72\\x54\\x12\\x57\\xa0\\x9e\\xbe\\x52\\x33\\xdc\\x0a\\xa2\\x3f\\x1b\\x70\\x33\\xcb\\x5b\\xc7\\x85\\x82\\xb0\\x34\\x5e\\x27\\x31\\xfe\\x12\\x0d\\x03\\xbc\\x79\\x24\\x4d\\xf0\\x84\\x34\\x81\\x89\\x58\\x4b\\xb6\\x4d\\x8d\\x97\\xd2\\x15\\x26\\x25\\x1a\\x79\\xf5\\x71\\x20\\xb2\\x4d\\x8d\\xa2\\xa4\\x63\\x63\\xe5\\xf6\\xa9\\x41\\x7e\\xb2\\x83\\xb0\\xd8\\x90\\x76\\x4a\\xdc\\x23\\xea\\x70\\xe8\\x8a\\x64\\xd8\\x51\\xf8\\x97\\x21\\xa6\\x34\\x55\\x27\\xba\\x9a\\x5d\\x33\\xcd\\x2c\\x2a\\xe6\\xe8\\xd3\\x19\\xc5\\xcb\\x45\\x15\\x4f\\xc2\\x0b\\x77\\xe1\\x6a\\xf7\\x85\\x27\\x28\\x17\\x8b\\xc1\\xfb\\x98\\x85\\x88\\x85\\x4b\\xbb\\xcd\\xcb\\x59\\x36\\x47\\x0c\\x3b\\x4e\\xa7\\x75\\x55\\xfa\\x18\\xa2\\x6d\\xbc\\x7b\\x70\\x2a\\x7a\\x5b\\x2d\\x5d\\x37\\xae\\x3a\\xb8\\xcc\\x0d\\x73\\x04\\x6b\\x91\\x7d\\x1c\\xa8\\xc9\\xc7\\xa3\\xac\\x9f\\xce\\xc9\\x46\\xd1\\x66\\xa2\\x74\\x91\\x6f\\xe0\\x04\\x0c\\x88\\xd0\\x7f\\x7a\\x4c\\x86\\xf0\\x80\\x18\\x84\\xde\\xd3\\x63\\x60\\x4f\\x64\\xbb\\xb4\\x52\\x6c\\x14\\xc4\\xed\\xf7\\x94\\xf7\\x68\\x27\\xc5\\x46\\x22\\xe0\\x8a\\xb0\\xe3\\x46\\x69\\x54\\x62\\xb0\\x59\\x68\\x30\\xe0\\xed\\x67\\x07\\x72\\x79\\xf6\\xba\\xbd\\x85\\x77\\x95\\xea\\xdf\\x82\\x71\\x0c\\x0d\\xc0\\xf2\\x15\\x60\\x35\\x7a\\x88\\x6f\\x2b\\x8d\\xfb\\xed\\x36\\x42\\x43\\xc9\\x48\\x18\\x3d\\x95\\xc8\\x20\\x32\\x69\\x2a\\x91\\xa1\\xcd\\x24\\x5b\\xba\\x03\\x90\\x6d\\x07\\x8e\\xe4\\x77\\x37\\xfd\\x79\\x11\\xd3\\xd9\\x6e\\xac\\xf4\\x67\\xf2\\x0a\\xfc\\x6c\\x09\\xa6\\xd8\\x13\\x76\\x06\\x09\\x24\\x5f\\x33\\xb1\\x69\\x71\\x82\\x30\\xe3\\xd4\\xe9\\x1a\\x0d\\x00\\xb1\\x5f\\x11\\x68\\xd4\\x83\\xab\\xf8\\xc6\\x99\\x16\\x30\\xf8\\x13\\x13\\x2a\\x8c\\xfe\\x58\\x35\\x64\\xe1\\x58\\x37\\x72\\x29\\x32\\x8d\\x4c\\x0d\\xa8\\xa1\\x01\\x07\\xac\\x4f\\x5a\\x7e\\x95\\x12\\x94\\xd6\\xc4\\x6e\\x30\\xac\\xbd\\x03\\x1f\\x3b\\x9c\\x21\\x7c\\xc6\\x82\\xad\\x5a\\x62\\x7b\\x4a\\x49\\x05\\xfa\\x5d\\x94\\x8a\\x70\\xda\\x6d\\x21\\x05\\x47\\xcc\\x4e\\xfc\\x50\\xbb\\xb6\\x9f\\xd6\\x6b\\x35\\xe8\\x4f\\x52\\xae\\x67\\xcd\\x49\\x89\\x0f\\x99\\xf9\\x36\\x40\\x0b\\x47\\x54\\x09\\x30\\x09\\x3b\\x5f\\x79\\x4b\\x87\\xb5\\xc4\\x74\\xd9\\x16\\xeb\\xb7\\xe3\\x2c\\x81\\xc1\\x58\\x3a\\x33\\xe5\\x15\\x2b\\xb0\\x72\\x16\\x0a\\x94\\x13\\x96\\x84\\x98\\x5c\\xd8\\x16\\x28\\xa9\\xe2\\x33\\xdc\\x63\\x12\\xca\\x6b\\x28\\x96\\x34\\x84\\x63\\x80\\x22\\xb2\\x21\\x5b\\x81\\x22\\x93\\xc6\\xce\\xe0\\x64\\x38\\x51\\x8d\\x55\\xd1\\x25\\x2f\\x37\\x4f\\xb6\\x4e\\x34\\x3d\\xfc\\x42\\xfe\\xfe\\xb8\\x55\\x6b\\x1c\\xa3\\x21\\x6a\\xe2\\x45\\x4b\\x9e\\xd5\\x46\\xfc\\x90\\xcc\\x07\\xc4\\x52\\x39\\xe3\\x0b\\x90\\x15\\xef\\x91\\x7e\\x47\\xc5\\x7b\\xa8\\x66\\xc7\\x7b\\x6b\\xfb\\xf4\\x98\\xd9\\x56\\x6f\\x9c\\x69\\x6a\\xcd\\xe2\\x78\\x3e\\xb8\\x9b\\x0f\\xfd\\x89\\x98\\xcf\\xb6\\xc0\\xbd\\xc2\\x7d\\xb7\\x29\\xb4\\x6c\\xd5\\x4a\\xd4\\x19\\xc4\\x2a\\xd4\\x6f\\x02\\x29\\x7c\\x0c\\x1a\\x90\\x51\\x74\\xf1\\x28\\x18\\xaa\\xb4\\x4d\\x66\\x1b\\xb9\\xdf\\x32\\x8e\\xb3\\xb4\\x8b\\xf4\\x14\\xea\\x47\\x63\\x07\\x51\\xad\\xfa\\x82\\x9e\\x44\\xd1\\xcc\\x54\\xd8\\x32\\xfc\\xec\\xb6\\x11\\x5d\\x66\\x45\\xc6\\x2a\\x86\\x19\\x4d\\x9d\\x44\\x4c\\x04\\xb2\\x8c\\x21\\x8a\\x56\\xa9\\x54\\xf6\\x6c\\x61\\xd8\\x0e\\x5d\\x2c\\xd9\\xad\\x52\\xa9\\xe1\\xed\\x70\\xa4\\x9a\\xad\\x32\\xee\\x4f\\x2a\\xc8\\xdb\\xe1\\xc2\\xb3\\xb3\\xa6\\x22\\x26\\xa6\\xf3\\x26\\x23\\x5a\\x22\\xfe\\x75\\x34\\x29\\x0a\\x1c\\x8f\\x6f\\xfd\\xc6\\xda\\x09\\xcb\\xcf\\x18\\x3e\\xf4\\xd6\\x79\\x56\\x23\\xa7\\x4e\\x8d\\x9c\\xa9\\xfb\\xac\\x5b\\x4a\\xce\\x27\\x39\\x77\\x4a\\xd4\\x72\\x6e\\xf0\\x9f\\xcf\\xbe\\xab\\xd9\\x5f\\xcf\\x52\\xf2\\x44\\x26\\xb9\\x10\\x82\\x18\\x2d\\x72\\x0f\\x4d\\xa1\\xe8\\x05\\xd6\\x3c\\x75\\x84\\xce\\x97\\x78\\x27\\xb7\\xb0\\x2c\\x6f\\x1d\\x0a\\xdc\\x86\\x56\\x66\\xe1\\x82\\x8d\\x71\\x50\\x2e\\x1d\\xd4\\x48\\xa9\\x6c\\x9d\\x3e\\x3d\\x2e\\x27\\x3f\\x58\\xb9\\x64\\x33\\x33\\x84\\x8b\\xd8\\xb8\\x84\\xfe\\x98\\xc3\\xa2\\x1d\\x30\\xab\\x89\\xcf\\x6f\\x9e\\xd6\\xff\\x5e\\x83\\x49\\x58\\x3b\\xd6\\x45\\xeb\\xe2\\xc9\\x6d\\xe3\\xd6\\x2e\\xc3\\x80\\xcf\\xd2\\x13\\x7e\\xae\\xbf\\xa6\\xe8\\x60\\x4f\\x6a\\xad\\x12\\x73\\xab\\xd3\\xa0\\x82\\x52\\x20\\xf8\\xff\\xb7\\x9d\\x14\\xeb\\xfb\\x9f\\x14\\x57\\xf1\\x51\\x41\\x61\\x9e\\xf1\\x53\\xfc\\x33\\xee\\xed\\xf5\\x7f\\xf3\\xe3\\xa4\\x6c\\x8d\\xc5\\xdc\\x9f\\xb9\\xe8\\xa6\\xe5\\xe9\\x71\\xa3\\x56\\xe8\\x90\\xa9\\xfe\\xad\\xae\\x9e\\x31\\xa6\\x23\\x26\\x7f\\xd1\\xb5\\xb4\\xcb\\xae\\xf1\\x47\\x9c\\x47\\xfc\\x8c\\xc8\\x3c\\x92\\x1e\\x6e\\x3a\\x81\\xfa\\x3b\\x3a\\xd2\\xec\\x46\\x1d\\x13\\x22\\xb5\\x46\\x0f\\x05\\xef\\x3f\\x61\\xe3\\xc0\\x14\\xd5\\x60\\x62\\xea\\xc7\\x25\\x7a\\x20\\xec\\x94\\xf3\\x8e\\x12\\xf9\\xf7\\xbd\\xd6\\x57\\xda\\x4f\\x33\\x6c\\x89\\x8f\\xd0\\x28\\x79\\x41\\x97\\xad\\xcd\\x64\\xef\\x21\\x13\\x3f\\xc3\\xfe\\x01\\xa3\\x6c\\x94\\xe4\\x45\\x31\\x6c\\x55\\xe8\\xd1\\x84\\x86\\xbe\\x01\\x63\\x43\\x48\\xc7\\x2e\\xd7\\x8f\\x1b\\x95\\xba\\x7c\\x5d\\x0f\\x5b\\xdc\\x1a\\x38\\xda\\xcf\\x38\\x75\\xc9\\x25\\xf5\\xa7\\x5d\\xe8\\x3a\\x5b\\xcd\\x6f\\xdf\\x94\\xf8\\x5d\\x8d\\xb7\\x7c\\xde\\xf6\\x7b\\x76\\xac\\x6e\\x3f\\x79\\x36\\x53\\x5b\\x51\\xcb\\x92\\xb0\\xcd\\xf6\\x98\\xbb\\x8b\\xad\\xc8\\xfd\\xef\\x7b\\xc3\\xc4\\xa8\\x37\\xbe\\x6e\\x82\\xd2\\xc0\\x6b\\x65\\x87\\x50\\xe3\\xdb\\x47\\xdb\\x20\\xf4\\xae\\xcc\\xda\\x1e\\x95\\xbc\\xfd\\x41\\x81\\x96\\xb0\\x3d\\x8e\\x5f\\x54\\xac\\xf0\\xee\\xae\\x66\\xa7\\x76\\x49\\x45\\xb7\\x4d\\x52\\xd4\\xdd\\xff\\x13\\xfb\\x64\\xf6\\xed\\xfb\\xa4\\x18\\x59\\xcc\\xbe\\xeb\\xff\\xee\\x5d\\xb2\\x43\\x9c\\x5d\\x96\\x04\\x82\\x1c\\xf6\\x81\\x9b\\xa6\\x1b\\xe8\\x50\\x66\\xa6\\x8f\\x8e\\xf8\\xbd\\x73\\xa8\\x32\\xde\\x56\\x8a\\xbe\\x4e\\x59\\x24\\xa6\\xcc\\x07\\x75\\x1f\\x51\\xea\\x24\\xb1\\xd0\\xa3\\xc4\\xf7\\x32\\xf9\\x57\\xae\\xd7\\xee\\xee\\x30\\xf5\\x44\\xa6\\x03\\x71\\xd3\\xc0\\x06\\xb0\\xdc\\x93\\x7a\\x50\\xc1\\x1c\\x15\\xfa\\xf7\\xc4\\xb5\\xa9\\xd6\\x4d\\x69\\x34\\xd1\\x4a\\x4d\\xc6\\x53\\x15\\xe9\\x56\\xcd\\xa6\\x18\\x2c\\x99\\x26\\x44\\xf2\\x36\\x7a\\xac\\x5f\\x1f\\x1d\\xd5\\x94\\x94\\x1a\\xa4\\xe4\\xec\\xcc\\xe4\\x07\\xd2\\x2b\\x6e\\x81\\x96\\xae\\xef\\xf8\\x66\\xe7\\xa2\\x0f\\x83\\xec\\x43\\x16\\x7e\\xb0\\x85\\x7b\\xe9\\x5c\\xa1\\x27\\x85\\xcc\\x5e\\x04\\x69\\x9d\\xe4\\x62\\xb6\\xfd\\x7a\\xc9\\x5d\\xe0\\xb5\\xa8\\x7f\\x8f\\x2c\\xfe\\x87\\xf1\\x3e\\x95\\xe7\\x0d\\xcc\\x59\\xce\\xcf\\x59\\x7e\\x6e\\xef\\x7c\\xe6\\xfa\\xcb\\x4e\\x34\\xc3\\xeb\\x78\\x8e\\x36\\xa2\\x24\\x7f\\x69\\xb1\\x95\\x72\\x09\\x73\\xcd\\x97\\xc7\\x25\\x7c\\x08\\x5c\\x13\\xa9\\x25\\xd1\\x4a\\x7e\\x6e\\x71\\x4a\\x35\\x72\\xd6\\x81\\xc8\\x87\\x38\\x10\\xa5\\x43\\xf4\\x48\\x29\\xa5\\xf5\\x44\\x31\\xa8\\x85\\xca\\x96\\x5f\\x8e\\x42\\x77\\xc1\\x58\\x38\\x6a\\x7b\\x4c\\x8d\\xdf\\x5d\\xfb\\x69\\x3d\\xf8\\xce\\x16\\xfe\\xd7\\x10\\x4f\\xb4\\x93\\x4c\\x83\\x6f\\x61\\x83\\x53\\xcb\\x60\\x32\\xa3\\x2a\\x84\\xe9\\x96\\x22\\x00\\xe7\\x32\\xa0\\x09\\x3f\\xe1\\x41\\x7f\\x3c\\x0e\\xda\\x7d\\x84\\xff\\xa1\\xb2\\x33\\x86\\xc0\\xae\\xba\\x54\\x7e\\x48\\xfd\\x24\\xa4\\x7d\\x15\\x05\\xce\\x57\\x6a\\xb7\\x4f\\xe8\\x8e\\x86\\xbf\\x6c\\x01\\xc1\\x0f\\x66\\xd5\\x8f\\xae\\x5c\\xfe\\xf6\\x82\\x74\\x9d\\xef\\x6a\\xa4\\xc7\\x50\\x0e\\xdc\\x13\\x51\\x8d\\x0c\\xf1\\xc7\\x08\\x61\\x46\\x63\\xfc\\x27\\x72\\x17\\x80\\xee\\xc3\\x10\\x8c\\x74\\xa3\\xf3\\xc5\\x8b\\x48\\x2d\\x34\\x74\\x67\\x22\\xb3\\xb6\\x2d\\x56\\x69\\x29\\x22\\xcb\\x25\\x09\\x99\\xfe\\x5c\\xe2\\x66\\x9f\\xb1\\x62\\x42\\x06\\xad\\xdd\\x90\\x69\\x6c\\x53\\xc9\\x24\\xa7\\xe8\\xf5\\x28\\x82\\x63\\xdc\\x10\\x2f\\xdf\\xe6\\xca\\xa3\\x1a\\x10\\xb3\\xcd\\x15\\x56\\xfb\\x1e\\x89\\x84\\x3c\\x73\\xa6\\xa4\\x21\\x00\\x8c\\x23\\x64\\xb6\\x50\\x0b\\xb7\\xdb\\x0d\\x66\\xb4\\x12\\xa3\\x51\\x93\\xce\\x7c\\x82\\x96\\x66\\xc4\\x45\\x76\\x61\\xa3\\x45\\x14\\x2b\\xfc\\x1b\\x2d\\xbd\\xb7\\x3d\\x14\\xba\\x41\\x62\\xa7\\xc5\\xde\\x16\\x51\\xd1\\xa4\\xed\\x6d\\xfb\\xc5\\x8d\\x17\\xf6\\xb5\\x37\\x63\\xb0\\x03\\x43\\xa9\\x49\\xba\\xd4\\x84\\x96\\x62\\x36\\x13\\xfb\\x1a\\xc5\\x31\\x9d\\xc9\\x1e\\x46\\x2c\\x81\\xd9\\xb6\\x86\\xbe\\x22\\x9c\\x75\\x92\\xb3\\xd0\\x84\\x16\\xff\\xdb\\x10\\xbc\\x55\\xc0\\x95\\x48\\x72\\x4e\\x96\\xd2\\x12\\x3f\\x1a\\x22\\x0f\\x09\\x32\\xed\\x7e\\xd8\\x5b\\xb4\\xc8\\xc9\\x31\\x2a\\xd4\\x99\\x32\\x39\\x2e\\x11\\x6a\\x87\\x29\\xc2\\x62\\xe8\\x0e\\x37\\x55\\xd0\\x4e\\x54\\x10\\x00\\x6d\\xe0\\x04\\x24\\x3e\\x17\\xe0\\x4c\\xd1\\xa0\\x61\\x24\\x46\\x7b\\x6e\\x44\\x12\\x00\\xed\\xd4\\x26\\x57\\x25\\x76\\xfb\\xa2\\xd7\\x6f\\x8e\\xb9\\x8a\\x8a\\xca\\xbf\\xe7\\x25\\x44\\xa1\\x1b\\xac\\x6d\\x3c\\x3b\\xab\\x11\\x1f\\x1a\\x61\\xa7\\x17\\x54\\x88\\x8b\\x8d\\x3a\\x86\\x9a\\xf3\\x87\\x2f\\x4b\\xaf\\xdd\\x5f\\x51\\x37\\x14\\xec\\x99\\x9a\\x3f\\x94\\x24\\xe2\\x93\\x3f\\xb1\\xb3\\x0e\\xba\\xf1\\x70\\x03\\x62\\x8a\\x71\\xae\\x3d\\xf2\\xe0\\x54\\x96\\xa1\\xab\\x66\\xfd\\x51\\xac\\x60\\x6c\\x27\\xb5\\x46\\x84\\xc3\\xec\\x43\\x67\\x5c\\xe1\\x0e\\x6e\\x7c\\xbe\\xfe\\x66\\xce\\xa4\\x42\\x9d\\xec\\xc0\\xbf\\x7c\\x95\\xcd\\x73\\xb5\\x4b\\x90\\x44\\xeb\\x83\\x7e\\x29\\x88\\x06\\x04\\xe3\\x53\\xe7\\xc3\\x36\\xc3\\x5e\\xe0\\x0d\\x12\\xcc\\xfd\\x80\\x92\\x0f\\x36\\x59\\x3a\\xdd\\x7d\\xb2\\xaf\\x9c\\xde\\x3e\\xd9\\xd7\\x4e\\xdf\\x90\\x9d\\x6c\\x9c\\x81\\xe9\\xd5\\xd6\\x19\\x9a\\x5e\\xdd\\x9a\\x9d\\x6d\\x20\\x0a\\x1f\\x51\\x72\\xb4\\x13\\xe3\\x60\\x86\\x2e\\x37\\x46\\x64\\x71\\x0d\\xd4\\x1a\\x27\\x6b\\x83\\xd6\\x55\\x48\\x6a\\xd7\\x8d\\xab\\x1a\\x09\\xaf\\x6d\\x06\\x5c\\xfb\\xfd\\x77\\x6a\\xcf\\xfa\\xfb\\xef\\x92\\x61\\x87\\xce\\x8d\\xc7\\xd3\\x5a\\xe4\\xc8\\xe3\\x36\\x36\\x2a\\x51\\xab\\x70\\x6e\\xe9\\x45\\x7a\\x2a\\x1c\\xa8\\x2d\\x6c\\x72\\x26\\x1c\\xb4\\x2d\\x50\\x4c\\xbd\\x40\\x47\\xba\\x17\\xce\\xdc\\xa8\\xff\\x63\\x2b\\x4b\\xd1\\x00\\x5e\\x3a\\x17\\xf7\\xd0\\x00\\x8a\\x8a\\xc8\\x4b\\xe7\\x52\\x51\\x01\\xbe\\x82\\xea\\x24\\x25\\x60\\xf3\\x65\\xf4\\x76\\x86\\xf8\\x51\\x0d\\xa7\\x4a\\x07\\x7b\\x20\\x7e\\xc0\\x55\\x85\\xb5\\xee\\x59\\xea\\x14\\x1d\\x52\\xed\\x5d\\x8a\\x52\\xd0\\x05\\x4a\\x8d\\x03\\x77\\xbe\\x9c\\x05\\x4a\\x5e\\xa0\\x4d\\x7a\\xda\\xbc\\xee\\x6c\\x18\\xcc\\x7e\\x9c\\xf5\\xa1\\x01\\xaa\\x4a\\xbe\\x48\\xb3\\x8c\\xaa\\x15\\x3e\\x53\\x96\\x43\\x6a\\x99\\xee\\x49\\xe4\\x06\\x19\\xc1\\xf4\\x5a\\x07\\xb4\\x89\\xf4\\x0a\\xb7\\x48\\x71\\xdf\\x5a\\xc8\\xda\\x90\\x37\\xba\\x9c\\xf0\\x0e\\x28\\x67\\xb7\\x51\\xb3\\x77\\xcd\\x57\\xd1\\x37\\xc1\\x31\\x56\\x95\\xc9\\xe6\\xfd\\xe3\\x48\\x0c\\x32\\x13\\x09\\x0c\\x4a\\x41\\x5e\\x5b\\x67\\x27\\xb5\\xd6\\x59\\xe3\\xd4\\x96\\x78\\xf2\\x37\\x52\\x22\\x2c\\xa5\\xe5\\x38\\x7a\\x26\\x86\\xa6\\xe8\\x17\\xca\\x6d\\xea\\x5c\\x6d\\xe4\\x3c\\xaa\\xfe\\xdc\\x58\\xf1\\x07\\x49\\xde\\x99\\x31\\x86\\x44\\xef\\x6d\\xed\\x28\\x4f\\x1b\\xc9\\x7c\\x51\\x62\\x3c\\x4a\\x7c\\xd6\\x74\\x26\\x5a\\x24\\x91\\xa1\\x4c\\x7f\\x34\\x92\\x3c\\xa2\\x46\\x7d\\x7b\\xfa\\x4c\\x12\\x74\\x48\\x4f\\xbc\\x27\\xb5\\x93\\x55\\x0b\\x3f\\x2b\\x7c\\xdb\\x15\\xaa\\x4b\\x1a\\xfc\\x2f\\xfb\\xd6\\x72\\xe7\\x56\\xb6\\xec\\x04\\x77\\x15\\xcc\\x14\\xb4\\xfc\\x8d\\xea\\x71\\x19\\x5e\\x5b\\x5f\\x29\\x68\\xb3\\x81\\xd5\\x11\\x2a\\x31\\x6b\\x6c\\x29\\xf3\\x55\\x3a\\x5f\\xce\\x66\\xf4\\x52\\xa4\\x26\\x73\\x69\\xa6\\x4a\\x1a\\x10\\x75\\xdf\\x9a\\x74\\xc8\\x6b\\x6c\\x96\\x39\\x5e\\x7e\\xf8\\x66\\xa9\\x0b\\x56\\xf3\\x60\\xd1\\xbd\\xf4\\x43\\x35\\x4a\\xb7\\xe2\\x5b\\x67\\xf6\\xf4\\xbb\\xe6\\x12\\x6a\\x68\\xbd\\x92\\x0f\\x57\\x3c\\x05\\xaa\\x9a\\x5d\\x9f\\x21\\x26\\xd2\\x2a\\x2a\\x6e\\x2d\\xac\\xdb\\xa6\\xa7\\xc0\\xec\\xe9\\x31\\x97\\x08\\x71\\x09\\x19\\x24\\x7e\\x40\\x31\\xd2\\xdb\\x72\\xe9\\x3d\\xfd\\x17\\x7e\\x57\\xe0\\xcf\\x01\\xfb\\xc3\\x9f\\xfe\\x55\\xba\\xdf\\x6a\\x58\\xc6\\x33\\xb4\\x61\\x33\\xf4\\x79\\x16\\xac\\xfa\\x90\\xed\\x8f\\x5e\\x0e\\xdf\\xd0\\x6e\\xe1\\xf5\\xf0\\x00\\xa3\\x6d\\x14\\x5b\\x01\\x91\\x20\\xf5\\x22\\x09\\x6b\\x62\\xc4\\xa0\\xf9\\x6b\\x45\\xa6\\xad\\xbe\\xb3\\x86\\x2b\\x1a\\xa1\\xff\\xad\\x3a\\x5a\\xb7\\x96\\x3e\\x04\\xee\\xa4\\xd4\\x28\\xc1\\x91\\xd7\\x1f\\x2f\\xc7\\xf8\\x0b\\x58\\x34\\xfc\\x65\\x37\\xcd\\x1f\\xd8\\xe5\\xe3\\xf5\\xff\\xa7\\x7e\\xce\\x87\\x98\\x8f\\x78\\x05\\xec\\x3d\\x1d\\xbb\\x58\\x3a\\x93\\x27\\x79\\x69\\x3b\\xdc\\x75\\x28\\x0d\\x8a\\xd1\\xd1\\x23\\x94\\xe9\\xe7\\x9f\\xa3\\x23\\x6a\\xed\\x6b\\xb6\\x90\\xe6\\xad\\xe8\\x17\\x90\\x93\\xd7\\xc0\\x51\\x1b\\x72\\xb3\\x5b\\x07\\xaa\\xeb\\x67\\xb4\\xc6\\xe4\\x0e\\x2d\\xe5\\xa9\\x81\\x96\\x6f\\x83\\xac\\x3e\\x44\\xa5\\xe4\\x47\\x5a\\x6c\\x98\\xd9\\x99\\xb8\\x9c\\xfc\\x4c\\x0b\\x8e\\x1c\\x5c\\x26\\x63\\xe7\\xd9\\xdf\\xd1\\x59\\xe5\\xb3\\x5a\\xec\\xaa\\x32\\x65\\x6e\\x7d\\x55\\xfa\\x4b\\xbd\\xf3\\xb7\\xbf\\x79\\xcf\\x4b\\x14\\xa6\\x66\\x74\\xd0\\xcd\\x36\\x8f\\xd9\\x41\\x77\\xec\\xc5\\xdb\\xd6\\xf8\\xda\\x7e\\x10\\xe1\\x12\\xfb\\xa2\\xf7\\x91\\x40\\xd0\\xef\\xbb\\xaf\\x94\\x44\\x7c\\xf3\\xbd\\xa5\\x32\\x70\\x13\\xf9\\xc1\\xaf\\x7b\\xcb\\xae\\x32\\xe5\\x2b\\x46\\xe7\\x36\\xd9\\x22\\x20\\xa3\\x30\\x27\\xe6\\xaf\\xf7\\x96\\xd0\\x65\\x4b\\x74\\xfc\\x74\\x31\\xdf\\x2c\\xd1\\xa1\\xaf\\x88\\x9f\\x27\\xd1\\x11\\x1c\\xb5\\x5f\\x40\\xa2\\x13\\xf1\\xda\\x7e\\xa6\\x44\\xc7\\x17\\x12\\x1d\\x26\\xa8\\x28\\x2a\\x8e\\x41\\x55\\x8d\\xe3\\xc2\\xc1\\xc3\\x35\\x3d\\x0e\\x06\\x86\\x88\\x95\\x0b\\x6d\\xea\\x6e\\x68\\x64\\xf6\\x31\\x94\\x94\\x0f\\x79\\x54\\x3e\\x94\\xdc\\x94\\x5e\\xa6\\xe4\\x25\\x2d\\xc3\\x38\\x47\\xc6\\xf5\\xdb\\x04\\x19\\x01\\x99\\x08\\x41\\x46\\x9e\\x88\\x22\\x14\\x00\\x58\\x03\\x50\\x79\\x48\\x42\\xd2\\xc5\\xc3\\x64\\x54\\xe9\\x52\\xf1\\x47\\x97\\x7f\\x12\\xea\\xec\\x5a\\x63\\x63\\x86\\xfd\\xda\\xb1\\x28\\x6a\\xdc\\x11\\x3c\\x95\\x18\\x1c\\x06\\x77\\x77\\x87\\xb2\\x9c\\x02\\xfb\\x98\\x74\\x7b\\xc1\\x61\\xd8\\x1e\\x09\\x61\\x62\\x9a\\xa1\\x11\\xdb\\xac\\x00\\x42\\x67\\x4e\\xb2\\xda\\x4c\\xf1\\xc7\\x5c\\x11\\x7f\\xe4\\x66\\x5f\\x28\\x22\\x91\\xdc\\xec\\x4b\\x27\\xcc\\x11\\x24\\xd0\\xcf\\x1b\\x49\\x13\\x02\\xc4\\x76\\x39\\xcb\\x7b\\x4b\\x13\\x78\\x6d\\x64\\xed\\xac\\x14\\x91\\xc2\\x06\\xea\\x94\\x45\\x0a\\xeb\\x6c\\xcd\\x37\\xab\\xec\\x17\\xa8\\x1a\\xeb\\xca\\xce\\xbb\\xe8\\x2f\\x46\\x01\\x42\\x99\\x97\\x39\\x5c\\x7a\\x37\\xe6\\xd2\\xbb\\x2a\\x97\\xbe\\xcd\\x74\\xcf\\x1a\\xe1\\x06\\x66\\x78\\xf1\\xd1\\x10\\x56\\x0b\\xa4\\xf4\\x23\\x61\\x4f\\xa7\\x75\\x35\\xe5\\x32\\xa3\\xe9\\x35\\xca\\x9f\\xee\\x2b\\x35\\xda\\x46\\x52\\xa3\\x84\\xe0\\xc9\\xd9\\x72\\xa9\\xd1\\x5a\\x09\\x42\\x22\\x86\\xae\\x99\\x20\\x9d\\x66\\x3d\\x6b\\x7a\\x2a\\xdf\\x21\\xf6\\x29\\xb9\\xa9\\x6c\\xc6\\xc7\\xd8\\xcd\\xd3\\x5c\\x08\\x07\\xed\\x8b\\x4e\\x7d\\x1f\\x1b\\x90\\x63\\x0e\\x38\\x79\\xf2\\xeb\\x9a\\x2f\\x3d\\x51\\x9d\\x84\\x30\\x60\\x30\\x38\\x73\\xfd\\xa2\\x14\\xda\\xd5\\x72\\x73\\x86\\xa9\\x70\\xa6\\x6a\\xdd\\xb0\\x2f\\x7d\\xe6\\x6c\\x94\\x19\\x94\\x17\\x1a\\xfa\\x19\\x91\\x8c\\xdc\\xcf\\x22\\xc0\\x39\\x2d\\x79\\xee\\x8c\\xef\\xee\\xb6\\xb2\\x9e\\x6c\\xca\\x10\\xeb\\x17\\x51\\x95\\xf1\\x16\\xe3\\x9a\\x49\\xba\\xa7\\xb6\\x1c\\x02\\x3f\\x7d\\xfa\\x02\\x72\\x6b\\x7a\\x9e\\x74\\x4e\\x72\\x77\\x77\\xce\\x1c\\x21\\x14\\x15\\xeb\\x89\\xe6\\x32\\xe0\\x6e\\x06\\x8e\\xd5\\x95\\x00\\x88\\x49\\xac\\x42\\x50\\xf9\\xce\\x6e\\x5e\\xea\\xc3\\xd0\\x60\\x9c\\x98\\x1b\\x39\\x4e\\xcc\\xdf\\x9e\\xdc\\x3c\\xfd\\x0e\\x7a\\xac\\xff\\xb4\\x99\\x28\\x51\\xe9\\xdb\\x46\\x22\\x15\\x56\\x1d\\xfb\\xd6\\xe7\\x6c\\xfe\\x5f\\x3a\\xea\\xe7\\xb9\\xd8\\x7f\\xbc\\xdb\\xcc\\xf1\\xa2\\x9c\\x53\\x2c\\x8d\\x42\\x83\\x7d\\xa9\\x47\\x2c\\x44\\xdd\\x27\\x89\\x0e\\x73\\x78\\xce\\x43\\xf7\\x1b\\xbf\\x93\\x14\\x9b\\x87\\xb6\\xda\\x1f\\x07\\xb3\\x6a\\x67\\x84\\x7a\\xfd\\x98\\xf3\\x49\\xdc\\xeb\\x54\\x37\\x9d\\x8e\\xde\\x83\\xe4\\x07\\x63\\x80\\x3a\\xc8\\x00\\x75\\x19\\xc3\\xf4\\x82\\x33\\x4c\\xcf\\x23\\x8e\\xe9\\x98\\xb3\\x4c\\xf5\\xe3\\x9a\\x91\\xb3\\x11\\x6c\\x92\\x81\\xaf\\x31\\xb0\\x49\\x26\\x86\\x26\\x62\\x93\\x22\\xa7\\xf9\\x2f\\x5e\\x00\\x1f\\x42\\x7f\\x47\\x6a\\x70\\x85\\xc7\\xe0\\x83\\xfa\\xd2\\x0b\\xd7\\x78\\xd8\\xb1\\xa7\\xd7\\xa8\\x1d\\xb2\\x63\\x27\\xa1\\x4a\\xac\\x22\\xd9\\xa1\\x21\\x46\\x23\\x82\\x93\\x44\\xf1\\x14\\x90\\xe4\\x5a\\xc4\\xbc\\x95\\x12\\xde\\x52\\xb8\\x3f\\xbc\\xaf\\xc3\\x60\\x8b\\x6e\\xbf\\x90\\x7b\\x22\\x9c\\x77\\xe5\\xee\\xc4\\x19\\x25\\x27\\xbc\\x9d\\x23\\xb0\\x05\\x0f\\x0b\\x57\\x0e\\x85\\xb4\\xcb\\x6e\\x7e\\xb9\\xd0\\xb4\\x0e\\x24\\xa4\\x1c\\x62\\x2d\\xb3\\x06\\x5c\\x32\\x86\\x2a\\x84\\x57\\x45\\x8b\\x7e\\xfd\\xd8\\x2b\\x12\\x3a\\xc6\\x65\\xdf\\x5d\\x49\\xfb\\x75\\x67\\xd3\\xb5\\xe7\\x09\\xbd\\x97\\xa2\\xfd\\x0f\\xa5\\x60\\x48\\xed\\xc7\\x67\\xd6\\x8c\\xbc\\x53\\x0e\\xb3\\x66\\xd4\\xa1\\xe7\\x31\\x6b\\x46\\xa5\\x7f\\x26\\xd7\\x65\\xd4\\xf6\\x67\\x73\\x5d\\x46\\x16\\x2f\\x9f\\xeb\\x32\\xf2\\x79\\x8c\\x90\\xdd\\x9f\\xcf\\x63\\xdf\\xd4\\x38\\x2f\\xc0\\x06\\xf0\\x9d\\x64\\xa7\\x39\\x13\\x39\\x9a\\x6c\\xb4\\x53\\xf1\\x3e\\x43\\xee\\x82\\x92\\x3d\\x62\\xcd\\xc4\\xb5\\x50\\xa7\\x22\\x34\\x68\\x03\\x89\\xeb\\x3e\\x3c\\xa4\\xfe\\x20\\x78\\x66\\x7e\\x87\\x9a\\xbb\\x94\\x74\\xd8\\x5a\\xb8\\x6f\\xbc\\x66\\x6d\\x0f\\xd3\\x95\\x2a\\x5d\\x4d\\xbd\\xa6\\x3d\\xce\\xe6\\x75\\x75\\xa2\\x03\\x33\\xaf\\x4b\\x5f\\x91\\x6e\\x1e\\xaf\\xcb\\x33\\x90\\x6e\\x01\\x5e\\x57\\xe4\\x21\\xdd\\x4c\\x5e\\xb7\\x5b\\x8c\\xd7\\xd5\\x81\\x31\\x80\\xd7\\xed\\xc4\\xbc\\x6e\\x20\\xf3\\xba\\x41\\x82\\x47\\x95\\x55\\xf3\\x14\\xa5\\x69\\xe4\\x5f\\xff\\x43\\x62\\x60\\xfd\\xe5\\x98\\x7a\\xa7\\x60\\x71\\x0d\\x0b\\x33\\xb2\\xa3\\xa8\\xd7\\xaf\\x23\\x8b\\xce\\xd7\\xbc\\x4e\\xab\\x63\\x93\\xd9\\xd1\\x51\\xf4\\x88\\x1c\\x9c\\xf4\\xd8\\x43\\xbb\\x53\\x73\\x1c\\xd5\\x53\\x4b\\x46\\x63\\x4a\\x4c\\x69\\x74\\xaf\\xfb\\xcb\\xd9\\x9c\\x91\\xec\\xeb\\x0a\\xf7\\xde\\x68\\xc7\\x11\\x86\\x2e\\xa1\\xfc\\xab\\xea\\x26\\x8e\\x44\\xb9\\x21\\xaf\\xaa\\x7d\\x47\\x02\\xb7\\xbd\\x14\\x01\\x34\\x21\\x9b\\x6d\\x93\\x77\\x96\\x54\\xfa\\x75\\xf1\\xd6\\xdd\\xe5\\x22\\x44\\xcb\\x22\\xe6\\xcb\\xc0\\x81\\x46\\xc8\\x39\\xf3\\xd2\\x73\\xce\\x7c\\xb0\\x6c\\xa5\\x7a\\xdf\\x21\\x9b\\xed\\x71\\x0e\\xf2\\xd5\\x35\\xa3\\xd7\\x5c\\xc7\\x8b\\xaf\\x56\\x8c\\x6b\\x28\\xdd\\xb3\\x44\\x30\\xea\\x48\\x9d\\xc4\\x2f\\x5c\\xe6\\xf1\\xe0\\x7d\\xae\\x90\\xe0\\xbd\\x4d\\xde\\xc7\\x60\\x3d\\x20\\x80\\xe9\\x6e\\xac\\x94\\xca\\x1b\\xc4\\xec\\xd1\\xe6\\x3f\\x30\\x36\\xff\\xa3\\x49\\x8e\\x10\\x92\\xf7\\x18\\x4d\\xf2\\x93\\xd1\\x74\\x7a\\x4a\\x33\\x98\\xa4\\x0a\\xe8\\xfd\\xe6\\xa2\\xf5\\x9e\\x71\\x08\\x9e\\xdd\\x78\\x6f\\x70\\x8f\\x75\\x61\\x8b\\x2c\\x1a\\x19\\xc4\\x96\\xfb\\x0b\\xb2\\xde\\xc2\\x22\\x89\\xe6\\xc4\\xe6\\xee\\x86\\xac\\x37\\x90\\x6a\\xc7\\x13\\xb5\\xc5\\x0b\\x95\\x1e\\x79\\xce\\x88\\xba\\xb6\\xd0\\x00\\x1e\\x0f\\xdd\\x28\\x13\\x22\\x89\\x6f\\x99\\xd4\\xe5\\x73\\xf3\\xd6\\xf9\\xba\\xa3\\xee\\x42\\x3e\\xa3\\xab\\x90\\xad\\x7d\\x7b\\xf5\\xf9\\xda\\xd9\\xc2\\x3f\\x49\\xf7\\x51\\x2d\\x4c\\xe4\\x12\\x85\\x9a\\xdd\\xc0\\x27\\xfa\\x4d\\xfe\\x49\\x43\\xcb\\x05\\x3d\\x77\\xd5\\x0f\\x67\\xd5\\xf6\\xcc\\xed\\x5a\\x3c\\x52\\x27\\xfc\\xe4\\xa1\\xe1\\x4f\\xe3\\x94\\x12\\xb9\\x8c\\x1f\\xa8\\x0f\\xb0\\xd7\\x36\\x8b\\x8e\\x37\\x3a\\x3a\\x1a\\x71\\xab\\x2d\\xfc\\x65\\xc4\\x6e\\x1e\\xb8\\xaa\\xf3\\x9b\\x9d\\xb0\\xf5\\x32\\x0b\\x69\\xde\\xa3\\x90\\x06\\x1a\\x79\\x9f\\x2b\\xa7\\x41\\x8f\\x52\\x3c\\x26\\x21\\x25\\x78\\x3b\\xd5\\xad\\x78\\x58\\xdb\\xf0\\x70\\xc1\\xb8\\x73\\xea\\x90\\x88\\xc6\\x71\\xa7\\xd3\\xf8\\x83\\x93\\xd1\\x5f\\x65\\xe6\\x53\\x9f\\x27\\x8a\\x01\\xc3\\xd1\\x27\\x62\\x70\\x04\\x1a\\xb3\\x62\\xff\\x83\\x18\\xcf\\xe0\\xfb\\x4a\\xf5\\x1f\\x2f\\xa8\\x53\\xa5\\xda\\xb5\\x83\\xbf\\x6d\\x72\\x45\\x1f\\x2a\\x18\\xe6\\xc0\\x7e\\x6a\\xd5\\xcb\\xf4\\x07\\xb1\\x68\\xd8\\x03\\x8f\\x9a\\x4e\\xd3\\x44\\x14\\x49\\xc0\\x57\\xff\\xe2\\x5c\\x71\\x6c\\xc9\\x0f\\xda\\xf8\\x3a\\x48\\x63\\x53\\x2e\\x01\\x45\\x1a\\x86\\x2c\\xe8\\x54\\xe5\\xba\\x19\\xcf\\xc4\\x17\\x7b\\xf7\\x52\\x92\\x59\\x8c\\xa0\\x0e\\xf5\\xf3\\x54\\xa4\\x18\\x36\\x35\\xf2\\xf1\\x9a\\x62\\x69\\xc7\\x53\\x4b\\x6c\\xc7\\x91\\xe3\\x5b\\x78\\x88\\xc0\\x3a\\xff\\xd1\\x59\\xb5\\x78\\x04\\x87\\x92\\x8b\\xea\\xf5\\x9f\\x9c\\xf7\\x46\\x19\\x95\\x7a\\x82\\x2b\\x71\\x6e\\x7f\\x76\\x7e\\xba\\x87\\x98\\x2a\\x55\\xa1\\x2c\\xa5\\xfa\\x05\\xaa\\x94\\xa5\\x54\\xb0\\x98\\x7e\\x2e\\x1c\\x04\\x17\\xca\\xe7\\x64\\xde\\xc4\\x76\\xf7\\xe2\\xc0\\x55\\xe3\\x6d\\x61\\xb6\\x70\\x52\\xa0\\xa6\\xad\\x64\\xc1\\x9f\\x93\\x35\\x0e\\xba\\x94\\x9f\\x17\\xd9\\xde\\x39\\x13\\x86\\x98\\x3a\\xf8\\x63\\x6e\\x25\\xee\\xaa\\xfb\\x3e\\xbf\\x9e\\x82\\x03\\x65\\xf1\\xa5\\xb8\\x20\\x30\\x27\\x2f\\x9e\\xae\\xb3\\x70\\xc4\\x1b\\x26\\x37\\x18\\x37\\x9c\\xcb\\x81\\x3e\\xc2\\xb7\\x55\\xe4\\x3e\\x72\\xbd\\x1c\\x17\\x32\\xe2\\x47\\x75\\xdf\\x26\\x63\\xa4\\xa6\\x0e\\x9d\\x7e\\xe4\\x3d\\x03\\xe3\\xc5\\x53\\xe2\\x2b\\x4e\\xca\\xbd\\x3a\\x32\\x9b\\xcc\\x12\\xc5\\x21\\x4e\\xa0\\x32\\x8e\\x24\\x94\\x36\\x59\\xb2\\x03\\xe4\\x57\\xe7\\x8a\\xf2\\x93\\xa5\\x1f\\x82\\x0a\\x15\\x27\\x1e\\x6c\\xd9\\x1a\\x20\\xe2\\xe4\\x69\\x1c\\xae\\x77\\xd7\\xcd\\x01\\x1f\\x74\\xfd\\x79\\xcd\\x66\\xec\\x25\\x2a\\xe2\\x9e\\x3f\\x7f\\x0e\\xad\\xc8\\x7f\\x70\\xc7\\x62\\x7f\\x4f\\x47\\xfd\\x2e\\xe5\\x37\\x85\\x0f\\x12\\x85\\xe3\\x8f\\x18\\xfe\\x17\\x8c\\xef\\x03\\x76\\x3f\\x39\\x32\\x75\\xe2\\xf9\\x74\\xfe\\xba\\xd7\\x20\\xd9\\xd4\\x0f\\xec\\xdd\\x4f\\x39\\x42\\xdc\\x71\\x2c\\xc4\\x8d\\x4b\\x93\\xc5\\xd1\\x91\\xda\\xa5\\xad\\xe4\\x29\\x23\\xbb\\xc2\\x8f\\x4c\\xb2\\xc2\\x8e\\xa9\\xdf\\xb2\\x8e\\x78\\xea\\x56\\x77\\x8c\\xc1\\x34\\xf8\\x31\\xdf\\x8c\\x4f\\x0b\\xe5\\x8d\\x7c\\xd3\\xfc\\x16\\x5d\\x76\\x3f\\x65\\x8b\\x3d\\x13\\x15\\x44\\x18\\xa1\\x8f\\x4f\\x8f\\x25\\xc9\\x12\\xfa\\x3e\\xa9\\x9b\\x9d\\x9f\\x48\\x16\\x54\\xbf\\x19\\x68\\x04\\xee\\xa7\\xda\\xae\\x0e\\x60\\x47\\x5a\\x25\\x72\\x80\\x16\\xae\\xc2\\x15\\x9c\\xef\\x4e\\x26\\xe1\\xe2\\xc0\\x03\\xfe\\x26\\x76\\x15\\x07\\x93\\x46\\x65\\x94\\x07\\x28\\x56\\x3a\\x98\\x02\\x25\\x1e\\xb6\\xab\\x68\\xa8\\x07\\xbb\\x62\\x18\\x6d\\x30\\xb1\\x31\\x3e\\xc5\\xcb\\x88\\xae\\x17\\xf6\\xc1\\x68\\x9c\\x42\\xfa\\xc1\\x50\\x84\\x25\\x85\\xe5\\x05\\x5a\\x4e\\xdc\\xc4\\x6d\\x9b\\xfc\\x64\\x8a\\xb1\\x2d\\x56\\xc8\\xd0\\xc6\\x63\\x40\\x91\\xe0\\x4a\\xe7\\x5b\\x02\\x05\\x98\\x58\\xa6\\x71\\xce\\x03\\x05\\x25\\xc8\\x41\\x5b\\x1f\\x93\\x28\\xaf\\x4f\\x36\\xbd\\x9e\\xb5\\x53\\x88\\xb2\\x8d\\x91\\xbb\\xad\\xe2\\x44\\x6a\\x66\\x80\\xed\\xba\\x24\\x99\\x26\\x3b\\x3e\\x12\\x9e\\xcd\\x59\\xf2\\x4e\\x63\\xc5\\x12\\xe7\\x3e\\x1c\\x5d\\x79\\xd7\\x11\\x79\\x71\\x74\\xc4\\x9e\\xd5\\xb5\\xc8\\xd6\\xef\\xbf\\x9c\\xc4\\x99\\x23\\x1d\\xc4\\xfc\\x94\\x2b\\x44\\xc2\\x40\\x1b\\xc9\\xc5\\x6e\\x37\\xff\\xc5\\x3e\\x41\\x07\\x59\\x1c\\xbd\\x27\\x45\\x21\\xf7\\x62\\x61\\x7a\\x3d\\x0e\\xbc\\xfa\\x6b\\x41\\xba\\x09\\x1a\\x3d\\x3c\\x63\\x92\\xef\\xdf\\x13\\xe3\\x48\\xde\\x29\\xfa\\x28\\xeb\\x7f\\xd5\\xc7\\x13\\xa4\\xcb\\x9d\\xb8\\x9e\\xc6\\x43\\x74\\x60\\x61\\x83\\x11\\xfd\\x55\\x3b\\x41\\x5b\\x2f\\xef\\xe4\\x53\\xeb\\x53\\xc3\\xdb\\x35\\x7f\\x37\\xc5\\x62\\xe7\\x7b\\x0f\\x43\\x40\\x0e\\x83\\x0a\\x5f\\x3f\\xc7\\xc9\\xf4\\xb6\\x3b\\xef\\x51\\xef\\x5d\\x28\\xdf\\xae\\x91\\x7a\\x2d\\x59\\x52\\x1b\\xff\\xb0\\xc3\\x17\\x8f\\x0d\\x53\\xaa\\xcc\\xa7\\x1d\\x87\\x71\\xaf\\xcb\\xd6\\x95\\xc7\\xd2\\xd2\\x45\\x51\\xb5\\xeb\\xc9\\xb2\\x6a\\x78\\x22\\xbf\\x27\\x3a\\xa6\\x31\\x77\\x33\\x4f\\xc8\\xdd\\x1d\\xce\\x07\\xb5\\x80\\xbb\\x77\\xf3\\x3a\\xbf\\x39\\x9e\\xe7\\xfc\\x2b\\x49\\xa8\\x53\\x66\\x53\\x21\\xf4\\x90\\x9b\\xf4\\xd2\\x31\\xf1\\x4d\\x28\\x5f\\xb9\\x02\\x65\\x73\\x3f\\x93\\x8d\\x51\\xa3\\x03\\x95\\xc1\\x3b\\xa1\\xb6\\xf8\\xc4\\xc5\\xa4\\x78\\x82\\xaa\\x2f\\xcc\\x04\\x0c\\xd2\\xae\\xfc\\x54\\xfa\\x27\\x70\\x1e\\xde\\xde\\x62\\xfd\\x97\\xc0\\x06\\xf4\\x63\\xc1\\x7e\\xea\\xf0\\xc1\\xc8\\x68\\xdd\\xd8\\x64\\x8b\\x69\\x91\\xba\\xfc\\xaf\\xdd\\x8a\\x7e\\x35\\x34\\xae\\x33\\x3f\\x3e\\xfd\\x1b\\x90\\xe9\\x36\\x2b\\x45\\xc3\\x0a\\x56\\x3e\\xa1\\xcd\\xa5\\xba\\xad\\x36\\x05\\x6f\\x49\\xbc\\xac\\x03\\xc9\\xee\\x93\\x5d\\xba\\xe6\\xba\\xe8\\xa4\\x74\\x6d\\x2a\\x1a\\xb1\\x7a\\x7c\\x08\\x81\\x18\\x42\\x2f\\x1a\\x42\\xcf\\x3c\\x84\\xdf\\xac\\x4f\\x4f\\x9f\\x7d\\x97\\x18\\xc2\\xc7\\xf4\\x10\\xb6\\xc9\\x66\\x7b\\x29\\xc2\\x2b\\x7d\\xee\\x87\\xda\\x00\\x02\\x5c\\xb0\\x42\\xd1\\x6b\\x4c\\xf0\\x80\\xaa\\xde\\x6c\\xf9\\x4a\\x96\\x80\\x84\\x0a\\x5f\\xf0\\x0e\\xd1\\x09\\xe0\\xcf\\x13\\xcd\\xbb\\xd8\\x7e\\x5f\\xc4\\xc2\\xa1\\x1b\\x9e\\x60\\x87\\x5e\\x22\\xdb\\x54\\xa8\\x9d\\x81\\xda\\x0e\\x23\\x37\\x35\\xcd\\xc4\\x07\\xae\\x23\\x1d\\xbe\\x64\\xad\\x3c\\x6d\\x51\\xf0\\x85\\x9f\\xed\\x37\\x67\\x9d\\x6e\\x30\\x16\\xdf\\x40\\xbb\\xfd\\x84\\x2f\\xe5\\x38\\xab\\xda\\x6e\\xc2\\x89\\xf0\\x56\\xf8\\x0a\\x6e\\x66\\x57\\x3f\\xcc\\xd6\\x5f\\x48\\x6d\\xa0\\x9f\\xec\\x2a\\x0d\\x8f\\xf2\\x5a\\x44\\x5f\\x9d\\x8b\\x68\\x1b\\x24\\x20\\x7d\\x32\\x40\\x5b\\x5c\\xe0\\xe9\\x34\\xd7\\x91\\x72\\x35\\x2b\\x97\\x18\\x51\\x39\\xfb\\xd4\\xc5\\xd7\\x25\\x3d\\x2a\\xca\\xac\\x4a\\xd4\\xca\\x19\\x8d\\xc1\\x0f\\x7b\\x95\\x73\\xf9\\x3e\\xfb\\xaa\\xbf\\xfe\\xcc\\x02\\xc9\\x56\\x37\\xe8\\x04\\xa0\\x13\\x07\\x89\\xa5\\x51\\xea\\xac\\x1e\\x74\\x52\\xf0\\xcb\\x43\\x47\\x14\\xbe\\x0a\\xae\\x9b\\x52\\x0c\\xfd\\x28\\x86\\xc2\\x10\\x8d\\x91\\x35\\xb1\\xf5\\xdb\\x3c\\x5e\\x22\\xd1\\xbd\\x44\\x0b\\xe6\\xbe\\xe3\\x45\\xb2\\x0f\\x8b\\xf6\\xc5\\x1a\\x92\\xc0\\xb6\\x71\\x05\\x51\\x4b\\x60\\xca\\x64\\x74\\x69\\xfc\\x5c\\xa6\\xb2\\xf2\\x50\\x48\\x41\\x33\\x71\\xad\\x15\\x8e\\xba\\x9b\\xb8\\x9b\\xd8\\x12\\xe4\\x5e\\xce\\x8f\\x05\\xdc\\xc7\\x8b\\x24\\x2b\\x62\\xdf\\xf8\\x6c\\x83\\xfd\\x66\\x13\\x29\\xac\\xb7\\x94\\x4d\\x32\\xdf\\xae\\xe8\\x92\\xeb\\x14\\x4a\\x58\\xad\\x3d\\x7b\\x32\\x25\\x18\\x3b\\x0a\\x01\\x15\\xc1\\x7c\\x41\\xa7\\x96\\xf6\\xc5\\x1a\\x98\\x29\\x5f\\x3a\\x1e\\xe8\\x68\\x48\\x6e\\x22\\xd7\\x76\\x78\\xcc\\x0e\\xae\\x66\\xd7\\xf1\\xe7\\x70\\x50\\x73\\x86\\xfd\\x9f\\x3b\\x5d\\xc5\\x75\\x1c\\x9f\\xae\\x36\\xce\\x44\\x60\\x37\\x87\\x91\\xfc\\x3f\\x56\\x97\\x51\\x9a\\xb7\\x5f\\x96\\xa8\\x5e\\x31\\xe0\\xb2\\x20\\x7f\\xd5\\xe0\\x78\\xd6\\x07\\x29\\x5a\\x8a\\x5d\\x55\\xc3\\xc1\\xe9\\x46\\xd1\\x53\\xbb\\x84\\xf4\\x12\\xbb\\x2c\\x39\\x38\\x76\\x4e\\xd8\\x87\\x69\\x0c\\x50\\x29\\x07\\xfb\\x87\\x19\\xea\\xbe\\xc2\\xe0\\xcc\\x78\\x35\\x02\\x83\\x9b\\xbd\\xad\\x92\\x40\\x6c\\xcd\\xa6\\x42\\x87\\x5a\\xec\\x14\\xa5\\x9b\\xf6\\x4b\\x22\\x00\\x8a\\x8b\\xb2\\xf5\\xf4\\x92\\x95\\x49\\x3d\\x4b\\x43\\x43\\xb2\\xf0\\x3a\\xf1\\xf1\\x14\\xe7\\x87\\x63\\x62\\xa7\\x48\\x40\\xe3\\x57\\xca\\x42\\x97\\x9a\\xa2\\xe7\\x25\\xb4\\xc3\\x4e\\xd5\\xbe\\xe9\\x40\\x15\\xaf\\x64\\xf9\\xb5\\xa9\\x4a\\x71\\x24\\x42\\xad\\x6b\\x27\\x7e\\x54\\x0f\\xac\\x1d\\xea\\x0a\\x24\\x33\\x71\\x8d\\x0e\\x22\\x61\\x35\\x1e\\xc9\\xd1\\x7d\\xe5\\x1c\\x7a\\x77\\x77\\x67\\xbd\\x73\\x98\\x80\\x10\\x5a\\x50\\xd6\\x34\\x8b\\xd7\\x74\\xe8\\xf1\\x33\\x42\\x88\\x44\\xbd\\xa6\\x08\\x84\\xce\\xcf\\x0e\\x97\\x9e\\x77\\xcc\\x17\\xa2\\xaf\\xe6\\x6a\\x3b\\xef\\x2c\\xf4\\x6f\\x2d\\x7c\\x19\\x57\\xff\\xf1\\xe2\\x04\\x49\\xf0\\xcb\\x16\\xac\\x72\\x99\\xf4\\x47\\x7b\\x73\\xcf\\x6e\\xa4\\x52\\xeb\\x44\\x34\\x13\\xb5\\x97\\xc5\\xef\\x70\\x8e\\xc9\\xf9\\xba\\x6d\\x58\\xef\\xe8\\xbb\\x4a\\x9b\\x0a\\x2e\\x11\\x9e\\x87\\x7e\\x2f\\x90\\x0b\\xda\\x89\\xc3\\xba\\x13\\x23\\x13\\x90\\xe6\\xa6\\x9e\\x50\\x15\\xcf\\x9c\\x96\\x4d\\xdd\\x9e\\xaa\\x29\\x7d\\xa9\\x14\\xbd\\xfe\\x2c\\x9b\\xc6\\x58\\x4e\\xa6\\x0d\\xd5\\xe3\\x9a\\x6e\\x0d\\xde\\xcc\\x48\\x07\\x89\\x18\\x33\\x10\\xc4\\x33\\x01\\x1b\\x7f\\x16\\x0b\\x45\\x38\\x0a\\x02\\x1d\\xd5\\x4e\\x1c\\x7d\\xb8\\xac\\x18\\x20\\x4d\\xff\\xdc\\xe0\\x84\\xf2\\x78\\xfd\\x87\\x34\\x5c\\x7f\\x1d\\xc3\\xf5\\xd7\\xc8\\x0a\\x7f\\xad\\xf1\\xd7\\x06\\x3e\\x7b\\xbf\\x4d\\xad\\x1c\\x95\\x08\\x09\\xd4\\xb8\\x91\\x56\\x72\\xca\\xfe\\x9c\\xe9\\xa1\\x12\\x2e\\x9c\\xb4\\x6e\\x37\\xc0\\x38\\xd7\\x0a\\x1e\\x42\\xb9\\x9b\\xd5\\xbd\\x2b\\x3b\\x0a\\x20\\x17\\xd4\\x93\\xc0\\x25\\xf4\\xa7\\x29\\xf6\\x49\\x4d\\x25\\x09\\xba\\x7a\\x0f\\x02\\xc2\\xc1\\xcb\\xdf\\xd0\\x99\\x32\\xcf\\xb1\\x68\\x09\\x87\\x59\\x0c\\x57\\x82\\xec\\xa3\\xf1\\x94\\x93\\x96\\x4c\\xf2\\x9c\\x63\\x6c\\x72\\x22\\xde\\xa5\\xbe\\x68\\x57\\x57\\x14\\x6e\\x27\\xb6\\x4b\\x59\\x70\\xa8\\xc3\\xba\\x84\\x2b\\x4a\\xf8\\x67\\x78\\xe5\\x7c\\xed\\x37\\xe0\\x33\\xa0\\x3d\\xc0\\x6b\\xad\\xc3\\x83\\x73\\x72\\x61\\xeb\\x4d\\xf6\\x52\\xaa\\xcf\\xaf\\x6c\\x91\\x35\\x5c\\x93\\xd2\\x46\\xd1\\xd9\\xd0\\xd9\\x6e\\x20\\x99\\x27\\x66\\xbb\\xb1\\xc6\\xd8\\x6d\\x6f\\x33\\xdb\\xf2\\xa4\\xc0\\x38\\x9e\\x72\\xf4\\xf1\\x27\\x9b\\x48\\xef\\x95\\x73\\xcc\\x93\\xce\\x31\\x29\\x0f\\xeb\\x34\\x7a\\xd3\\xd7\\xb0\\xfa\\xbe\\x4a\\x45\\x8a\\xdc\\xf4\\x94\\xde\\xed\\x9a\\x7a\\x8a\\x37\\x07\\x33\\xc3\\xad\\x33\\x36\\x0d\\x76\\xc7\\x72\\x42\\x18\\xb6\\x00\\x27\\x3f\\xa2\\x04\\x01\\x9c\\x91\\x82\\x46\\xee\\x9a\\xfc\\xd1\\xf1\\x61\\x71\\x09\\x20\\x4d\\x74\\x29\\xe3\\xcb\\x79\\x02\\x58\\x93\\xd5\\x47\\x03\\xb0\\x66\\xa4\\x00\\x6b\\xe8\\xe2\\x79\\xc7\\x62\\x8f\\xa4\\x6d\\x12\\xce\\xe1\\x70\\xa4\\xc2\\x17\\xa7\\x83\\xbf\\xe8\\xc1\\xe3\\xf4\\xb9\\x0a\\x10\\x65\\xa5\\xce\\x00\\xe9\\xc0\\x53\\xf4\\x94\\xd1\\x85\\x5f\\x5b\\xfa\\xab\\x47\\x3c\\xf9\\x5c\\xa2\\x21\\x51\\x9d\\x21\\xba\\x6c\\xa7\\x71\\x56\\xb6\\x12\\x8e\\x66\\xf4\\x10\\x38\\x9a\\x4c\\x7c\\x8a\\x11\\xa3\\x9f\\x8d\\x4f\\xd1\\x3b\\x29\\x40\\x0f\\x18\\x62\\x3d\\x1b\\x0a\\xae\\xd3\\x05\\xd7\\x91\\xf7\\x8b\\x73\\x3e\\x6d\\x7b\\x05\\x88\\x15\\x85\\xdf\\xd3\\xe9\\xdf\\x27\\x4e\\x2b\\x73\\x9d\\xc1\\x4e\\x51\\x53\\xb9\\xb3\\x74\\xb9\\x33\\x16\\xaa\\x99\\x9d\\xfe\\xf4\\x98\\xd9\\x3b\\xa4\\x6e\\x36\\x14\\xc7\\x18\\x45\\x18\\x87\\xf9\\x2b\\xae\\xa1\\xbd\\x43\\x1f\\x63\\xc9\\xdf\\xb2\\x4a\\x1a\\x43\\x59\\x4f\\xc2\\xcb\\xd9\\x2c\\x9c\\x9d\\xf7\\x02\\x7f\\x68\\x2a\\x7c\\x99\\x2e\\x7c\\x59\\x08\\x3b\\x34\\x7a\\x44\\xec\\xd0\\xe8\\x7e\\xd8\\xa1\\xd1\\x9f\\x80\\x1d\\xd2\\xb4\\x59\\x00\\x3b\\xa4\\x03\\x7a\\x99\\xb1\\x43\\xf4\\x15\\x19\\xe7\\x61\\x87\\x78\\x06\\xc8\\x98\\x8f\\x1d\\x12\\x79\\xc8\\x38\\x13\\x3b\\x34\\x16\\xd8\\xa1\\x4c\\xb3\\x96\\x24\\xfe\\xcc\\xa3\\xf8\\xb3\\xb4\\x59\\x0b\\xe9\\x73\\xd1\\xe9\\x04\\x67\\x68\\x49\\xa3\\x0a\\xa4\\x48\\xbc\\xa2\\xd1\\x80\\xf1\\x46\\x72\\x5c\\x82\\x91\\x08\\x0f\\x6b\\xa8\\x8e\\x97\\x0f\\x66\\x8a\\x0c\\x05\\xa2\\x7f\\x1e\\xfc\\x1c\\xce\\xc2\\x49\\xd8\\xc7\\x04\\x6c\\x34\\xd6\\xa7\\x65\\x6e\\x29\\x7d\\x48\\xec\\x98\\x64\\x72\\x93\\x24\\x53\\x01\\xe7\\x30\\x17\\xe9\\x3a\\x2f\\x10\\x60\\x25\\x63\\x51\\x80\\x6c\\x93\\x9f\\x7a\\xca\\x93\\xc0\\x3a\\x5d\\x24\\xed\\x83\\x12\\xd8\\xab\\x4e\\x21\\xdb\\x21\\xb8\\x09\\xe1\\xa2\\x59\\x04\\x67\\xee\\x6c\\x3f\\xc8\\xd5\\x26\\x82\\x5c\\x25\\x81\\x54\\xdc\\x82\\x74\\xe4\\x0c\\x2a\\x7d\\xe6\\x0c\\xa5\\xcf\\x97\\xe4\\xda\\x19\\xc2\\x6f\\x34\\x5c\\xe8\\x8b\\x85\\xb7\\xcd\\x05\\x11\\x51\\x41\\x93\\x49\\x8f\\xc1\\xf9\\x19\\x7d\\xb8\\x38\\x0e\\xee\\xf5\\x22\\xd3\\xf2\\x5b\\xc7\\x3f\\x3a\\x6a\\xb7\\xae\\xae\\x1b\\x5e\\x8e\\xec\\xc1\\xcc\\x22\\x01\\xe5\\x13\\xd2\\x67\\xa0\\x78\\xa6\\xfc\\x07\\x46\\xec\\xdb\\xd6\\x76\\xb4\\x9d\\xb1\\x10\\x81\\xb0\\xf0\\xb2\\xcc\\x79\\xc9\\x6d\\x1a\\x6a\\x12\\xb5\\xb7\\xd9\\x09\\xa7\\x26\\xd4\\x41\\x8d\\x15\\xdc\\xdd\\x21\\x74\\xe3\\x9a\\x54\\x61\\xf1\\x4e\\x22\\x8f\\x28\\xb4\\xb6\\xa4\\x53\\x94\\xac\\x7a\\x51\\xe5\\xc5\\xc3\\x90\\xdc\\xa0\\xd4\\x68\\xc2\\x05\\xc3\\xf3\\x56\\x07\\x5a\\x58\\x57\\xac\\x89\\x2c\\xc3\\xf9\\xbe\\xd6\\xaa\\xa3\\x6b\\x5e\\x32\\x91\\x45\\x38\\x27\\x2c\\xf5\\xba\\x41\\x8b\\x10\\xf4\\x28\\xdd\\x75\\xba\\x77\\x77\\x63\\x60\\xea\\xd0\\xe1\\x3e\\x77\\xb9\\x26\\x10\\x25\\x14\\x33\\x86\\xff\\x5c\\x73\\x07\\x36\\xa7\\xce\\xd6\\x08\\x19\\x11\\x2b\\xcf\\x73\\x67\\x8a\\x93\\x94\\x33\\xe7\\xf4\\x1e\\x78\\x11\\xa5\\x36\\xe0\\xa7\\xce\\xe4\\xb2\\xcd\\x53\\x19\\x2e\\xb2\\x3b\\xcf\\xc6\\x27\\xa0\\x0c\\x7a\\x8a\\x88\\x8d\\xd3\\x1c\\x95\\x74\\x3f\\xd6\\x71\\xf7\\x55\\x43\\xa5\\x0b\\xe7\\x54\\x11\\x6d\\x8b\\x2a\\x93\\x8a\\x14\\x9a\\x2e\\x46\\xaf\\xfb\\x8a\\xbb\\x0c\\x55\\x59\\x53\\x6f\\x75\\x62\\xd0\\x21\\x31\\xfb\\x03\\xc9\\xe2\\x3a\\xf1\\x8a\\x08\\xbb\\x87\\x94\\x67\\xce\\x0d\\x29\\x49\\xa7\\x44\\xe3\\x00\\xb3\\x1d\\xc4\\x23\\xba\\x5f\\x73\\xb2\\xcd\\xbe\\xf2\\x05\\x74\\x7b\\x2e\\xfa\\x2a\\xf8\\xa5\\xd9\\xae\\xae\\x94\\xca\\x9e\\xec\\x09\\xb0\\x97\\x34\\xec\\x97\\x66\\x8b\\xbe\\xdb\\x61\\x4b\\x79\\x43\\xcb\\x1d\\x95\\x61\\x48\\xd5\\xbf\\xbd\\x60\\x1f\\xfe\\xd2\\xb9\\x48\\x2d\\x78\\x69\\x81\\x67\\x1c\\x38\\x3b\\x34\\xe2\\xd1\\x29\\xe0\\xd0\\xeb\\x8f\\x79\\x3f\\x14\\x77\\x9a\\x5d\\x2a\\x5b\\x63\\x8b\\x1d\\x5d\\x76\\xb9\\x5a\\x7b\\xf1\\x64\\x2c\\xfb\\xe5\\x46\\xfd\\xd6\\x41\\xa9\\x8c\\x9b\\x97\\x7b\\xc4\\x08\\xb3\\x5c\\x26\\x24\\x2d\\xf9\\x93\\xdf\\x01\\x5d\\x32\\x2e\\x35\\x6e\\x12\\x70\\x16\\x1a\\x2e\\xe7\\x9e\\xbd\\x07\\xf1\\x56\\x90\\xdb\\x95\\x7a\\xaa\\x2b\\xe8\\xa1\\xe0\\x5b\\x7b\\x92\\x50\\x6a\\xd0\\xae\\x2c\\x35\\x2e\\x1b\\xbe\\xa1\\x9d\\xa4\\xea\\x4b\\x6d\\x83\\xaa\\x8c\\xee\\x57\\x3f\\x91\\xa2\\x5c\\x87\\x53\\x8c\\xdf\\xe5\\x76\\x39\\x00\\x98\\x37\\xdd\\xf6\\x46\\xd9\\xad\\x5f\\x78\\xa3\\xc7\\xea\\x80\\xc9\\x8f\\x95\\x50\\xb9\\xd6\\x12\\x3a\\xe3\\xea\\x3f\\xd4\\xa5\\xfc\\xd4\\x8b\\x62\\xa9\\xcf\\x5b\\xd6\\xcb\\x7d\\x4c\\xdd\\xc8\\x65\\xd2\\x56\\x2c\\x61\\xc6\\x28\\x09\\xaf\\x16\\x16\\xbb\\xfe\\x71\\xca\\xf2\\xce\\x15\\x38\\x02\\xe6\\x07\\x4a\\xfb\\x1b\\x4d\\xbf\\x65\\x00\\x91\\xb6\\x49\\xd6\\x20\\x5c\\xd5\\x13\\xd1\\x76\\x85\\x6e\\x58\\xf4\\x1e\\xff\\x1c\\xc8\\x88\\xc6\\x65\\x32\\x56\\x8e\\x0c\\x71\\xba\\xcc\\x3f\\x68\\xe3\\x16\\x18\\x24\\x71\\x76\\x30\\x09\\xba\\x54\\x28\\x0e\\x24\\x2e\\x4f\\x61\\xe2\\x1a\\x48\\xd9\\x25\\xdc\\x2f\\x65\\x03\\x68\\x66\\x42\\x32\\x68\\x84\\x56\\x64\\x97\\x92\\x5c\\x40\\x25\\x2f\\xed\\x55\\xc1\\x0f\\xa0\\x43\\x13\\x65\\x2c\\x9e\\xcb\\x42\\xb5\\xe6\\x9f\\xc4\\x4c\\x62\\x96\\x71\\xf6\\x92\\xb6\\x23\\x7d\\xd9\\x9a\\xdd\\xc0\\x7f\\x2a\\xd1\\x37\\xfe\\xbe\\x4e\\x53\\x2b\\xf5\\x46\\x94\\xd4\\xd4\\x9c\\xee\\x3e\\x3b\\xc1\\xdb\\x09\\x17\\xd7\\xda\\x2d\\xa4\\x9d\\xf4\\xc8\\x7e\\x3a\\x52\\xf7\\xc9\\xcb\\xac\\x0d\\x94\\x33\\x75\\x36\\x53\\xc3\\x88\\x6f\\x54\\x36\\xd7\\x75\\xc6\\x9c\\x00\\x44\\xef\\xb7\\xb1\\xfb\\xdd\\x8d\\xac\\x57\\x91\\x26\\x4c\\xe7\\x85\\x97\\x50\\x2d\\x02\\xe9\\x92\\x1e\\xe9\\xe7\\xfa\\x7c\\x19\\x38\\xff\\xf8\\x0e\\x3d\\xeb\\xbe\\xa8\\xa1\\x6b\\x5d\\x29\\xd2\\x69\\x3d\\x78\\xce\\x22\\xbe\\xc0\\x7c\\x00\\xf9\\x8a\\x9a\\x98\\x71\\x2c\\x2f\\x0e\\x67\\xed\\xfe\\xc4\\x1d\\x41\\x37\\x27\\x1a\\x21\\xb2\\x2e\\x12\\x3e\\x25\\xcb\\xc9\\x54\\xff\\x66\\xbb\\x23\\x37\\xd4\\xb7\\xca\\xcc\\xa4\\x48\\x98\\xa3\\x86\\x60\\x41\\x83\\x32\\x32\\xd9\\x36\\xac\\xb3\\xe3\\x0e\\x9a\\xbe\\xa7\\x02\\x1e\\xcf\\x04\\xc2\\x20\\x01\\x38\\x28\\x25\\xce\\xd9\\xa4\\xdb\\x95\\xc2\\x9e\\x58\\x54\\x8d\\xc1\\xca\\x91\\x3f\\x48\\x09\\x38\\x32\\xd4\\x20\\x6c\\xb4\\xb2\\xf3\\x25\\x59\\xeb\\xdc\\xb8\\x2c\\x1f\\x5d\\xa2\\x69\\xb4\\xd3\\xcb\\x96\\x68\\x1a\\x0d\\xf5\\xa8\\x2f\\x16\\xa3\\x3c\\xd3\\x28\\x57\\x44\\x89\\x1b\\x73\\x5a\\xba\\xb7\\xc8\\x6d\\xb3\\xb7\\xb0\\x76\\xbb\\xb7\\x9c\\x96\\x61\\x03\\xf6\\xb6\\x21\\xdc\\x66\\x16\\x33\\xda\\x10\\x6e\\x98\\x85\\xc1\\x3e\\x1e\\x5f\\x58\\x73\\xd9\\xe5\\xf4\\xae\\x55\\xb0\\xbd\\x1f\\xf0\\x7c\\xdc\\xcf\\x4a\\x0d\\x9b\\xcb\\x2c\\x66\\x74\\x0f\\x24\\xe9\\xb9\\xf6\\x93\\x05\\x41\\xd9\\xbe\\x51\\x62\\x6d\\xf6\\x50\\x0d\\xbb\\xe1\\x1c\\xef\\xae\\xfd\\xa4\\x5c\\xb9\\xf2\\x44\\x9d\\x65\\xac\\x59\\x9e\\x48\\x5f\\x91\\x7e\\x9e\\x3c\\x51\\x08\\x6f\\xfa\\x05\\xe4\\x89\\x91\\x58\\xa7\\x9f\\x29\\x4f\\xec\\x17\\x92\\x27\\x26\\x45\\xe1\\x1e\\x15\\x85\\xeb\\xdc\\xe4\\xe4\\x0a\\xdd\\xf4\\x3a\\x0b\\x22\\x64\\x58\\xeb\\xc2\\xae\\x76\\xa4\\xc3\\xb3\\xb0\\x99\\x62\\x2f\\x5e\\x43\\x91\\xcc\\x6c\\x21\\x0c\\x11\\x03\\xb8\\xa9\\x8e\\x8e\\x16\\x92\\xd5\\xe2\\x44\\x7a\\xec\\xa2\\xf0\\x4f\\x95\\xae\\xf5\\x84\\x74\\x2d\\x4f\\x6e\\x36\\x62\\xec\\xe3\\x8d\\xc9\\xb2\\x6e\\x40\\x46\\xa4\\x8f\\x8e\\x6a\\x4c\\xe6\\x11\\x43\\x9a\\xc1\\x64\\x59\\x37\\xab\\x7a\\x01\\x1c\\xac\\xc1\\x4f\\xc2\\xee\\x6d\\x64\\x30\\xad\\x9b\\x67\\x99\\xd6\\x1d\\x5a\\xbd\\xa3\\xa3\\x5e\\x84\\xbd\\xef\\x3d\\xa8\\xa1\\x19\\x1a\\xeb\\x35\\x47\\xf9\\x56\\x66\\xbe\\x13\\xc4\\x56\\x66\\x6d\\x78\\x88\\xd0\\x4c\\xaa\\x71\\xd4\\xd2\\x19\\xe5\\x4a\\xb3\\x60\\x61\\xfc\\xd2\\x5f\\xf4\\x4e\\x37\\x41\\x1c\\xfc\\xb3\\x77\\x6f\\x67\\x3d\\xfa\\x5a\\x65\\x53\\x28\\xd9\\x81\\x0f\\x50\\x21\\x73\\x8d\\x0f\\x9f\\x55\\x61\\x6b\\x27\\x92\\x93\\x55\\x32\\x67\\xca\\xce\\x88\\x71\\x19\\x12\\x76\\x5b\\x0c\\x92\\x9d\\xd7\\x02\\x52\\xd4\\xdc\\x2e\\x48\\x13\\x14\\x27\\x5f\\xfa\\x46\\xc2\\xa3\\xa3\\xcd\\x3d\\x2d\\x4c\\x6e\\xb8\\x85\\x09\\x09\\xb8\\xa9\\xc0\\x4d\\x64\\x2a\\xb0\\x10\\xfe\\x87\\x12\\x5e\\x69\\xa2\\xde\\x72\\xd4\\x7e\\xc6\\xfa\\x55\\xe0\\x03\\x74\\x57\\x6d\\xd5\\x0d\\x43\\x37\\x49\\x20\\xbb\\x51\\x02\\x0e\\x7c\\xfa\\x59\\xf6\\x7d\\xdc\\x6f\\xf3\\x4f\\x56\\xa1\\x9e\\x2a\\x2a\\x98\\xa1\\x82\\x90\\x5f\\x04\\xa1\\xa4\\xac\\x2a\\xe2\\xbe\\xfe\\xc5\\x54\\xa6\\x5c\\xd2\\x32\\x45\\xbe\\xcc\\x9d\\x3c\\xb1\\xa6\\xad\\xe3\\x46\\xdd\\x4e\\xf2\\x10\\xf5\\xef\\xd4\\xc0\\x41\\x32\\x13\\x05\\x45\\xea\\x8d\\x63\\xa4\\xc2\\x11\\x96\\xc6\\x70\\xc5\\xbe\\xc0\\x15\\x77\\x22\\x5c\\x71\\x27\\x0b\\x1a\\x7d\\x83\\x6e\\x7b\\x48\\x4f\\x01\\x16\\x2f\\x58\\xfc\\xa4\\xfb\\x62\\xa3\\x2d\\x39\\x28\\x4e\\xd9\\x0a\\xaa\\x31\\x89\\x87\\xb6\\x63\\xed\\xa4\\x40\\xfc\\x3b\\x16\\xab\\xce\\x2e\\x65\\x35\\xca\\x8d\\x2d\\xb8\\x82\\xc1\\x9c\\x4f\\x0d\\xd1\\xd2\\x9c\\x1e\\x1d\\xdd\\x6a\\xb8\\xf5\\x4c\\x5e\\xd2\\x18\\xf5\\xc8\\xf2\\x79\\x30\\xbc\\x17\\x18\\x0c\\xef\\x6f\\x22\\x18\\xde\\x6e\\x72\\x6f\\x68\\xfa\\x6f\\xd6\\x02\\x71\\xdd\\xea\\xf4\\xdf\\xa4\\xa7\\x3f\\x85\\xeb\\xee\\xda\\xc9\\x2c\\xe2\\x30\\x38\\x50\\xbc\\xf5\\xa4\\xac\\x13\\x6e\\x64\\xeb\\x84\\xb6\\xe4\\x80\\x19\\xed\\x13\\xe8\\x33\\x8d\\x74\\x63\\x60\\x2d\\x7d\\x0d\\x60\\x2f\\x62\\x30\\x1d\\xdd\\xfd\\x4d\\x43\\x78\\x27\\x91\\x69\\x99\\xe8\\xb5\\x18\\x68\\xc6\\x59\\xd5\\xba\\x30\\xbe\\xab\\x6b\\x81\\x66\\x03\\x06\\xfe\\x8a\\xdc\\xe0\\xa4\\x68\\x17\\xe4\\x52\\x0f\\xd1\\x3b\\xe7\\x21\\x7a\\xe7\\x04\\x9e\\x71\\x8a\\xff\\xdc\\xb0\\xfc\\x33\\x95\\x57\\x94\\x6f\\xdb\\x04\\x53\\x37\\x47\\x26\\xae\\xd9\\x49\\x43\\xbd\\xe2\\x78\\x24\\xd4\\x6c\\x30\\x37\\x76\\x4c\\x0c\\x17\\x0b\\x93\\x9a\\x4d\\xb9\\xb0\\xc2\\xd7\\xd6\\x3b\\x68\\xfa\\xd8\\xcb\\x76\\xcf\\x53\\x08\\x48\\xa6\\x45\\x83\\xa1\\xaa\\x23\\xa7\\x5c\\x47\\x57\\xae\\xc9\\xe2\\x27\\xe8\\xf8\\xda\\x19\\x99\\x47\\x7c\\x6d\\xf0\\xed\\x6e\\x83\\x04\\x0e\\x0a\\xef\\x7a\\x5b\\x41\\x62\\x8b\\xb4\\x84\\x0b\\xa1\\x9e\\xde\\x85\\x50\\x56\\x57\\x0c\\x48\\xa7\\x9e\\xea\\x42\\x28\\xa3\\x06\\xa3\\x0b\\xa1\\xde\\xfd\\x5d\\x08\\x45\\x12\\x81\\x19\\x7b\\x10\\xfa\\x37\\x27\\x88\\x20\\x53\\x9d\\x08\\x32\\xd5\\x95\\x30\\x51\\xbd\\xff\\x71\\x12\\x84\\x42\\x01\\x89\\x8c\\x9c\\x7a\\x2e\\xe8\\xc7\\xc8\\xac\\xe7\\x82\\x7e\\x8c\\xfc\\x7a\\x36\\x3e\\xc9\\x28\\xf3\\xc8\\x83\\xfb\\xf4\\x1e\\x11\\xee\\xd3\\xbb\\x1f\\xdc\\xa7\\xf7\\x27\\xc0\\x7d\\x34\\x6d\\x16\\x80\\xfb\\xfc\\x8f\\x63\\xcf\\xf3\\xd8\\x6a\\xbd\\xfc\\x8b\\x08\\x36\\x77\\x4e\\x8f\\xa4\\x98\\x0f\\x94\\x41\\x2e\\x73\\x05\\xe4\\x32\\xb7\\xf3\\x84\\x01\\x49\\x59\\x8a\\x47\\x65\\x29\\x1a\\x70\\x51\\x20\\x8c\\x7a\\xf7\\xc0\\xf9\\xe8\\xa5\\x72\\xf1\\x6d\\xa8\\xc1\\xf9\\x64\\x21\\x6f\\x82\\xa2\\xa2\\x84\\xc5\\xac\\xef\\x2d\\xf1\\x65\\x11\\x31\\xc2\\x30\\x3e\\x2e\\x22\\x31\\xc2\\x50\\x0f\\xbd\\x19\\x3a\\x56\\x50\\x41\\xba\\xdc\\x71\\x9c\\x6e\\xab\\xcd\\x18\\xa5\\x36\\x5f\\x30\\x6d\\xca\\x2c\\xb5\\x85\\xe7\\x50\\x42\\xb3\\x75\\x5b\\xa5\\x2d\\x8c\\x0e\\xe3\\xc1\\x14\\x91\\x2c\\x00\\xcb\\xec\\xdf\\xdd\\x0d\\xe8\\x25\\x3b\\xd1\\x70\\xc5\\xf2\\xd8\\x14\\x70\\x47\\xe8\\x4c\\xf6\\x60\\x83\\xd5\\x6a\\x80\\x3a\\xb2\\x42\\x85\\xf9\\x9d\\xc8\\x7c\\xae\\xdd\\x9c\\xe4\\x30\\x78\\xed\\x98\\x63\\x6c\\xab\\x78\\x8d\\x1b\\x4d\\x68\\x58\\x6c\\xfc\\xde\\xd0\\x8c\\x1b\\xdd\\x28\\xc9\\x4d\\x31\\xa8\\x03\\xb6\\x9c\\x42\\x3a\\x14\\x51\\x9b\\xf5\\x65\\xe2\\x67\\xe6\\xdc\\x24\\x0d\\xb0\\xa3\\x61\\x95\\xbb\\x85\\x00\\x09\\x33\\x93\\x61\\x35\\x1d\\x46\\xb7\\x5c\\xaa\\x1b\\x3a\\xe2\\x5b\\xbd\\x48\\x37\\x2a\\xf2\\x1e\\xe7\\xe7\\x45\\x87\\x1e\\x31\\x4b\\x7c\\x23\\xe0\\x10\\x19\\xa3\\xa0\\x0a\\xb9\\x05\\x85\\xa4\\x14\\xe8\\xd6\\x60\\x8f\\x6e\\xc9\\x79\\x0d\\x68\\x90\\x9a\\x24\\x43\\x9a\\x15\\xff\\xb4\\xd0\\x6f\\xe0\\xbb\\xe5\\x07\\xfe\\x89\\x69\\x0d\\x43\\xda\\xfd\\x5a\\xfc\\x84\\x1d\\x4c\\xcc\\xcc\\x8c\\x0d\\xfb\\xf1\\x46\\x0c\\xfb\\x7b\\x10\\xeb\\xf3\\xc6\\x09\\xa6\\x2b\\xda\\x93\\x7a\\x7e\\x2b\\x57\\x8d\\x17\\x38\\xcf\\x81\\xb3\\xef\\x38\\x7f\\x07\\x76\\x0b\\x85\\x07\\x7a\\xaf\\xa4\\x57\\xdd\\xeb\\x1d\\xb5\\x14\\xd2\\xaa\\xd8\\x06\\x1a\\x4d\\xde\\x90\\x2a\\xb3\\x46\\xc6\\xc0\\x9a\\xc0\\x6d\\xe9\\xf8\\x01\\xe0\\xd0\\x24\\x3d\\x57\\x31\\xc2\\x34\\xa2\\x7d\\x47\\xd4\\xe4\\x0b\\x6f\\x7d\\xed\\x20\\x66\\xdd\\x25\\xd2\\xe0\\x42\\x68\\xd9\\xb2\\xe8\\xc1\\xe3\\xe8\\xed\\xd6\\xe2\\xbb\\x9f\\xe6\\x22\\xfc\\xc4\\x36\\xe4\\x56\\xc9\\x00\\x9e\\x97\\x88\\x73\\xdd\\x50\\x28\\x49\\x11\\x88\\xec\\x84\\x9d\\x8d\\x86\\x52\\x32\\x71\\xc0\\x32\\xa2\\xa5\\x59\\x1b\\xe5\\xb9\\x94\\x0c\\x2f\\x36\\x74\\xf4\\x23\\x08\\xc5\\x02\\x2c\\x46\\x43\\x8f\\x16\\x2a\\xd5\\x65\\xa5\\xba\\x58\\x0a\\xdd\\xec\\x15\\x2b\\xd5\\x61\\xa5\\x3a\\x58\\x0a\\xee\\x7c\\xa4\\x85\\x8b\\x15\\xec\\x51\\xad\\x2d\\xe6\\x84\\x65\\xe6\\xa2\\xb5\\x5b\\xa3\\x47\\x9b\\xc6\\xa5\\x56\\xac\\x8a\\x01\\x6b\\x7b\\xc0\\xc4\\xdd\\xb0\\x5c\\xe3\\x62\\x7e\\x46\\xb1\\x7e\\x9a\\x9c\\xf1\\x69\\xfb\\xfd\\x9d\\xe4\\x7c\\xaf\\x58\\x17\\x80\\x6b\\x21\\x82\\x4a\\x18\\xd2\\x4a\\x80\\xb5\\x91\\x89\\x0f\\xb8\\xd7\\x61\\x80\\x7d\\x18\\x54\\x41\\xe0\\xef\\x3a\\xd6\\xa5\\x68\\x68\\x0e\\x41\\x90\\xd0\\x8b\\x67\\x9d\\x24\\x20\\x24\\xfd\\x72\\x42\\x07\\xd1\\x23\\x6b\\x8c\\x12\\xb0\\x35\\xea\\x20\\xfa\\x34\\x43\\x8a\\x02\\x59\\x53\\xc3\\x58\\x19\\x67\\xcb\\x91\\xb1\\x9e\\xe4\\xf1\\x0c\\x91\\xb1\\xe3\\x08\\x03\\x1b\\x22\\x06\\x76\\xc8\\xe5\\x7f\\x37\\x2d\\x44\\xd9\\x56\\x5f\\x3c\\xd9\\x3c\\xf5\\x52\\x3e\\xd2\\xc8\\xe6\\x89\\x95\\x4e\\xad\\x54\\x5f\\xd8\\x9a\\xcc\\xd7\\x0d\\x86\\xd7\\xdd\\x5c\\xa3\\x06\\x44\\x07\\xd6\\x4d\\x76\\x69\\x12\\x75\\x69\\x1a\\x87\\x33\\x44\\x7c\\xed\\x96\\xe2\\x6b\\x87\\x6a\\xe4\\x6c\\x67\\xa8\\x86\\xce\\x8e\\x1e\\x95\\x7c\\xad\\x2b\\xe5\\xb1\\x52\\xad\\xd5\\x9f\\x28\\x29\\x44\\xa9\\xa6\\x9c\\x78\\x5f\\xbf\\xbe\\x6e\\x5c\\x55\\xea\\xa4\\x2e\\x0f\\x82\\xb7\\x3f\\x52\\xdb\\x8f\\x1e\\x47\\x6a\\xfb\\xca\\x23\\xad\\x5f\\x49\\x21\\x4a\\x35\\x95\\xc4\\x7b\\xa9\\x7d\\x2e\\x46\\x5d\\x1b\\x15\\x2d\\xca\\xca\\x85\\x8b\\x73\\x10\\x91\\x97\\xf1\\x3c\\xc3\\x30\\x4e\\x9d\\xdb\\x7b\\xe8\\x5b\\xd2\\x95\\x53\\x38\\x72\\x42\\xc1\\x72\\x2e\\x25\\x75\\xa9\\x19\\xe6\\xad\\xa2\\x70\\xc9\\xc1\\x17\\x33\\xd4\\x10\\xb9\\xbd\\x4f\\x18\\x04\\xb2\\x36\\x23\\x03\\x17\\xd5\\x18\\x4f\\x92\\x82\\xe5\\x4d\\xc3\\x79\\x24\\xc7\\x41\\x95\\xf5\\x80\\x5a\\x40\\x9f\\xe5\\xeb\\x1a\\x98\\xcb\\x4e\\xaa\\x35\\xc0\\xf8\\x5b\\x6c\\xc6\\x13\\x9a\\x86\\x5b\\x45\\xd3\\xa0\\x29\\x61\\xd0\\x33\\x6c\\x92\\x3a\\x85\\xad\\x0c\\x07\\xe6\\xe5\\x4b\\x64\\xd6\\x2a\\x2d\\x67\\x23\\xcb\\x58\\xb7\\x0d\\x9c\\x4b\\x49\\xe0\\x6f\\x6f\\x53\\x1a\\x9a\\x34\\xec\\x3a\\x07\\x91\\xbb\\xd3\\xd3\\x47\\x63\\x41\\x5d\\xa7\\x70\\xba\\x24\\x8d\\xd0\\x55\\x86\\xbb\\x91\\x44\\xdd\\x32\\xb6\\x4f\\x12\\xe8\\x47\\xda\\xcb\\x8f\\xee\\xc7\\x45\\xf8\\xaf\\x60\\x16\\x5a\\x23\\x2b\\x42\\x64\\xd5\\x08\\xcb\\x6c\\xc7\\x84\\x5c\\x1a\\xcb\\x95\\x5d\\x5b\\x04\\xea\\x1a\\x59\\xbc\\xae\\xca\\x08\\x85\\xea\\x71\\x85\\x7a\\xa5\\x83\\x4e\\xe5\\x50\\x2a\\x5b\\x43\\x6b\\x4c\\x5f\\xda\\x15\\xdd\\x11\\xfa\\xa4\\xfa\\xfc\\x45\\xec\\x31\\x27\\xcc\\x42\\x12\\x2f\\xd1\\x0f\\x46\\x01\\x34\\xf1\\xe2\\x81\\xd0\\xc4\\x79\\x70\\xe2\\x42\\xfd\\xa9\\xa7\\xfa\\x73\\x5f\\x48\\x71\\x3e\\xa6\\x18\\xe1\\x00\\x7f\\x00\\xac\\x18\\x86\\xbd\\x78\\x5c\\x68\\x71\\x2e\\xb6\\x58\\xee\\xc2\\xa3\\xe1\\x8b\\x69\\xc0\\x0e\\xc5\\xaf\\x94\\x76\\xb3\\xcf\\x85\\xfe\\xc1\\xc8\\xd6\\xc5\\x3b\\xc3\\x9a\\xec\\x81\\x9a\\xb5\\x19\\xef\\xe7\\xd1\\xfb\\xc5\\x8f\\x78\\xbf\\x24\\xd4\\x74\\x45\\x4a\\x05\\xd0\\xa5\\x0f\\xb0\\x39\\xd5\\x03\\x59\\x9b\\xfd\\x1f\\x3a\\x2c\\x6c\\xb2\\x83\\xa9\\x73\\x8d\\x39\\xaf\\x60\\x0f\\x30\\x35\\x78\\xd8\\x34\\xf0\\x9f\\x4a\\x74\\x00\\x7d\\x5f\\xa7\\xa9\\x95\\x7a\\x23\\x4a\\x6a\\x1a\\xcf\\xaf\\xf6\\xb7\\x9d\\x7c\\x0a\\xae\\x35\\x71\\x04\\x12\\x34\\x0a\\xc4\\x75\\xb1\\x92\\x19\\x5d\\x85\\x16\\xc8\\x82\\xae\\xe6\\xf2\\xbb\\x3d\\xa6\\xd0\\xeb\\xb3\\x3f\\x83\\x1c\\xe0\\xea\\x50\\xc3\\xd9\\x8e\\x34\\x69\\x63\\x23\\x6e\\x55\\xcf\\x24\\x20\\x6e\\x35\\x74\\xae\\xae\\xc9\\x94\\x82\\x57\\x6f\\x50\\xd5\\xc8\\xdd\\x5b\\x18\\x78\\xec\\xc5\\x9f\\x8d\\x56\\xe5\\xee\\x36\\x74\\x4c\\x3b\\x22\\x01\\x62\\xa6\\x5d\\xf5\\xd0\\xe4\\xa8\\x3b\\x3a\\x3e\\x2b\\x4a\\x06\\x02\\x32\\x49\\x31\\x1c\\xf0\\x1f\\x95\\x1a\\xbc\\x77\\xd3\\xe7\\x3f\\x87\\x32\\xa9\\xde\\x76\\x64\\x2e\\xea\\xfe\\x4d\\x32\\x63\\xa5\\x92\\xf6\\xce\\xd9\\xc9\\x82\\x87\\xc5\\xa3\\x2b\\xd1\\x8c\\xf1\\x39\\xb2\\x95\\x68\\xc6\\xf0\\x1c\\xd9\\x21\\x11\\x8d\\xc8\\xd8\\x6c\\xf4\\xae\\x51\\xe9\\x36\\x75\\xdb\\xf7\\xd2\\x80\\x19\\xa1\\xbb\\x66\\x44\\xed\\xfe\\x60\\xda\\x4c\\x0c\\xae\\x51\\x0b\\x99\\x0d\\xdd\\x35\\xa2\\x4d\\xff\\x77\\x43\\x77\\x91\\x17\\xb8\\x6c\\x9b\\x0b\\x1a\\x1d\\x2a\\x98\\x71\\xbb\\x46\\xed\\xb1\\x64\\x5a\\xbe\\xb7\\x83\\x8b\\xff\\x65\\x51\\x44\\x32\\x95\\x75\\x49\\xbd\\xa0\\x47\\xf5\\x82\\xf7\\x0f\\x70\\xa9\\x9c\\x9f\\x09\\xdc\\xad\\x67\\x92\\x59\\xf9\\x56\\x4c\\xcd\\x79\\x09\\x99\\xd5\\xd0\\xfe\\x7a\\x1b\\x29\\xd1\\x6e\\x25\\xf0\\xed\\x0d\\xa2\\xb2\\x62\\xf0\\xed\\x4c\\x7a\\xec\\x99\\xa4\\x5b\\xa7\\x14\\xca\\xaa\\x91\\x51\\xf1\\x48\\x76\\x06\\xd9\\xd7\\x84\\xac\\x11\\xa1\\x7a\\x6e\\x94\\x7d\\x85\\x34\\x03\\x22\\x05\\x7d\\x0d\\xfe\\x76\\x6d\\x80\\xdb\\x6e\\xa3\\x70\\x78\\xf0\\x91\\x92\\x70\\xdb\\x65\\xec\\x0d\\x68\\x58\\x30\\x36\\xc5\\x8a\\x51\\x72\\x17\\xcd\\x95\\x88\\x4d\\x71\\x81\\x8e\\x21\\x97\\xf6\\xea\\xea\\xe2\\xda\\x59\\xc2\\x3f\\xa9\\xd8\\x14\\x98\\x18\\xc7\\xa6\\xc0\\xa7\\x1d\\x8d\\x29\\x31\\x44\\xf1\\x95\\x80\\xfa\\x0e\\x1f\\x10\\xea\\xeb\\x93\\xb5\\x4d\\xfc\\xe6\\xfa\\x1b\\x02\\x4a\\x70\\xe9\\x41\\x41\\xb9\\x93\\x1a\\x8c\\x73\\x78\\x6d\\x93\\x6c\\x2b\\xdd\\x42\\xf2\\x26\\x51\\xa9\\x2c\\x5a\\x7a\\xe5\\x5c\\x2a\\xa2\\xa5\\x97\\xc5\\xb1\\xbc\\x39\\x59\\xb7\\xc5\\xb3\\x4a\\xa0\\xdc\\x9c\\x9c\\x4a\\x18\\x80\\x9c\\xbc\\x6a\\x48\\x86\\xa9\\x14\\x05\\xe0\\x0c\\xc6\\x9d\\x17\\x05\\x60\\x18\\x47\\x01\\x18\\x69\\xa2\\x00\\x8c\\x92\\x51\\x00\\xf2\\xb6\\x99\\x6c\\xfa\\xb9\\x7f\\x14\\x80\\x91\\x14\\x05\\xe0\\x32\\x47\\xae\\x37\\x8a\\xe5\\x7a\\x71\\x31\\xf4\\xc0\\xfb\\xea\\x9e\\xb8\\xe5\\x33\\x81\\x5b\\x5e\\xa0\\x87\\xcc\\x68\\x0e\\xc5\\xd8\\xcf\\x13\\x8e\\xde\\x47\\xb1\\xcb\\xcb\\x91\\xce\\xd1\\xfb\\x5a\\x76\\xf4\\x7e\\x99\\xe7\\xe8\\x7d\\x40\\x3d\\xa4\\x6a\\xda\\x64\\x28\\x8c\\xe4\\x29\\xa3\\xb3\\xf1\\x1c\\x17\\x71\\xad\\x3e\\x94\\x5d\\xab\\x0b\\x37\\xea\\xaf\\x9d\\x57\\xd9\\x78\\xec\\x8c\\x43\\x26\\x81\\xc7\\x7e\\xad\\x01\\x63\\xb3\\xfb\\xe0\\xde\\xbe\\x9d\\xcf\\x28\\x80\\x79\\xa8\\x20\\x68\\xcf\\x11\\x41\\xfb\\xea\\x01\\x9d\\x3b\\x9b\\xeb\\x4a\\x8f\\x07\\xa1\\xb9\\xb3\\x6f\\xf0\\xf4\\x7c\\x8e\\x88\\x60\\x75\\x3c\\x67\\xe9\\xf1\\x6c\\x33\\xfb\\xd0\\xb3\\x53\\x1e\\x90\\x33\\x5c\\x05\\x7b\\x79\\xae\\x82\\x27\\xe8\\x2a\\x58\\xf3\\x95\\xbf\\xc1\\x4f\\x70\\xae\\x97\\x60\\x4f\\xf1\\x12\\xec\\x1b\\xbc\\x04\\xc7\\x3e\\x82\\x7b\\x8a\\x8f\\xe0\\x88\\xb0\\x82\\x3b\\xd0\\x62\\x0f\\x8e\\xe3\\x30\\x6f\\xc0\\x3d\\xe1\\xda\\x0f\\x52\\x98\\x0b\\x60\\x3f\\x76\\x01\\x4c\\x1b\\x42\\xe7\\xc3\\xcc\\x99\\x8b\\xde\\x05\\xb0\\x4f\\x81\\xa7\\xbd\\xd8\\x05\\xf0\\x38\\xe5\\x02\\x98\\x50\\x81\\x9a\\xd4\\x25\\x2a\\x84\\x6c\\x32\\x3f\\xc0\\x09\\x0c\\xae\\x1f\\xf9\\xd1\\xb5\\x9b\\x03\\xb3\\x17\\x5d\\xe9\\x48\\xf1\\x84\\x17\\xdd\\x91\\xde\\x8b\\xee\\xe9\\x03\\x7b\\xd1\\x0d\\x85\\x17\\xdd\\x09\\xf5\\xa2\\x3b\\xd0\\x7b\\xd1\\xcd\\x58\\x71\\x49\\x2f\\xba\\x9b\\xaa\\x14\\x7f\\x14\\x31\\xe2\\x5a\\xaf\\xba\\xfd\\x6f\\x73\\xe2\\x5d\\xf4\\x5c\\xe2\\x74\\xcf\\xdd\\x9d\\x89\\x5a\\x3b\\x90\\x1b\\xa8\\x93\\xcb\\x24\\x05\\xc4\\x26\\x47\\x16\\x27\\x88\\xec\\x4c\\x8a\\x8d\\xa0\\xef\\xfd\\x89\\xc2\\x8d\\xe2\\x09\\x7c\\x89\\x42\\x86\\xf4\\x4e\\xf7\\x8d\\xf3\\x74\\xa1\\x11\\x00\\x03\\x8f\\x6b\\xf0\\xe2\\x14\\x8f\\xaf\\x46\\xb9\\x05\\x79\\xbc\\x0f\\xd0\\x75\\x5f\\x76\\x62\\xbe\\xf9\\x46\\x67\\xc9\\x9a\\x31\\xe4\\x39\\x4b\\x5e\\xea\\x9d\\x25\\xfb\\xaa\\xab\\xe2\\x5b\\xa3\\x64\\x32\\xed\\xa9\\xd8\\x97\\xbc\\xf3\\x7a\\x77\\x77\\x7a\\x2e\\xea\\x1b\\x3d\\xf5\\x1a\\xbc\\xf2\\x0e\\x75\\xc6\\x12\\xa3\\x84\\x57\\xde\\x7f\\xa4\\x8c\\x25\\xfe\\x51\\xdb\\x49\\xd8\\x9c\\x84\\x14\\x32\\x0a\\x19\\xcc\\x9d\\xf3\\x52\\x0b\\x09\\xc9\\x35\\x6f\\x5d\\xb8\\xe6\\xfd\\xba\\x23\\x2b\\x96\\x69\\xcd\\xfe\\x6c\\xee\\xe7\\x55\\x77\\x4b\\xcd\\x29\\xf6\\xf0\\x9c\\x3b\\x4f\\x79\\xce\\x1d\\x3e\\x80\\x39\\xc4\\x43\\xfb\\xd5\\xe5\\x9a\\x75\\x9d\\x30\\x75\\x23\\x09\\x53\\xef\\xe5\\x14\\x56\\xb5\\x88\\xf0\\x35\\x16\\x11\\x7e\\x96\\x45\\xc4\\x50\\x6f\\x11\\x71\\x0f\\xdf\\xaf\\x43\\xd5\\x22\\x22\\xa3\\x06\\xa3\\x45\\xc4\\xf0\\xbe\\x16\\x11\\x71\\x04\\x67\\x67\\x03\\x0f\\x48\\x8c\\x3a\\x1d\\xf8\\x11\\x79\\x95\\xf5\\x23\\x47\\xb2\\x7e\\xe4\\x48\\xd6\\x4f\\x3b\\x92\\x1d\\x40\\xa2\\x30\\x95\\x18\\xc2\\xef\\x5c\\x29\\xaf\\x8f\\x6d\\xdf\\x57\\xca\\x6b\\x14\\x52\\x66\\x4b\\x79\\x8d\\xe2\\xda\\x7c\\x47\\xae\\xf7\\xb7\\x93\\xc8\\x74\\xd5\\x90\\x89\\xf0\\x36\\x4a\\x01\\x8b\\x38\\x81\\x35\\x5a\\xe3\\x67\\x1b\\x59\\x18\\x1d\\xe5\\xe6\\x19\\x59\\x0c\\x1f\\xd1\\xc8\\x62\\x78\\x3f\\x23\\x8b\\xe1\\x9f\\x60\\x64\\xa1\\x69\\xb3\\x80\\x91\\x85\\x4e\\x0c\\x6e\\x96\\xa4\\xd2\\x57\\x64\\x94\\x27\\x49\\xe5\\x19\\x20\\x63\\xbe\\x24\\x55\\xe4\\x21\\xa3\\x4c\\x49\\xea\\xa8\\x90\\x24\\x35\\xa9\\x74\\xf0\\xa8\\xd2\\x21\\xc3\\xa7\\xea\\x98\\x52\\xac\\xfc\\x67\\x01\\x13\\x8e\\x6d\\x7a\\xba\\xb6\\x8e\\x4b\\x84\\x74\\x74\\xab\\x98\\xf6\\x6d\\x15\\xa3\\x8d\\xed\\x1e\\x16\\x16\\x06\\x4b\\x91\\x4c\\x4f\\xaa\\x7b\\x7a\\x86\\x35\\x38\\x6b\\x15\\x9e\\x61\\xfd\\xa4\\x63\\xd8\\x2c\\x1b\\x0e\\xdf\\xe4\\x3d\\x15\\x8f\\x5a\\x49\\x30\\x1d\\xf6\\x46\\xbe\\xce\\x15\\x04\\x0b\\xd2\\x95\\x21\\xbf\\xb6\\x92\\x55\\xc8\\xd1\\x65\\xab\\x86\\x91\\xe3\\xa5\\xa6\\xf1\\x3c\\x6e\\xde\\x4d\\xca\\x89\\x45\\xbd\\x50\\x89\\x8b\\x1a\\xb5\\xfc\\x78\\xe7\\x92\\xb6\\x83\\x17\\x4c\\x30\\xf9\\xde\\x07\\x16\\x21\\x9c\\x07\\xad\\xd2\\xb1\\xef\\xd6\\x8e\\x7d\\xf8\\x10\\xed\\xef\\x8e\\xff\\x76\\xfc\\xf7\\x12\\xef\\xd6\\x7f\\x7d\\xdf\\x7b\\x76\\x40\\x61\\x16\\x4e\\x89\\x2d\\xd9\\x83\\xbf\\xfc\\x57\\xb9\\x5d\\xfe\\xaf\\xd2\\xc9\\x7f\\x95\\xb9\\xc0\\xb6\\x5c\\xfa\\xfe\\x69\\xef\\xd9\\xc9\\xf7\\x0b\\x3c\\x61\\xe0\\xcf\\x0c\\xfe\\x6f\\x9f\\x60\\xf5\\x8d\\xef\\x9f\\xc2\\x2f\\x7c\\x2a\\x95\\xb9\\x49\\x60\\x92\\xd3\\xc4\\x6c\\x36\\xd6\\x80\\x19\\x9f\\xd2\\xb2\\xac\\x3c\\xed\\x57\\x81\\x0a\\x68\\x3e\\x6d\\x0d\\xc8\\x9a\\xe7\\x97\\xc7\\x5c\\xda\\xe2\\xa3\\x70\\x5d\\xa0\\x79\\xc8\\xa5\\x96\\x7e\\xca\\xa6\\xa1\\xb4\\x53\\x95\\x19\\x9c\\x1c\\x30\\x61\\x6e\\xff\\x43\\x02\\xdd\\x4e\\xe2\\x5b\\x5a\\x6f\\xe8\\x33\\x71\\xda\\x15\\x9f\\xf9\\xd8\\xf5\\xf9\\x11\\x15\\xe6\\x9a\\xef\\x84\\x8c\\x14\\x9c\\x3a\\x61\\x4a\\xd8\\xcd\\xfa\\xa6\\x58\\xec\\xdc\\x38\\xd6\\x74\\x0f\\xc9\\x76\\x54\\x83\\x2c\\xc5\\x9e\\xaa\\x76\\x3a\\xd3\\x1c\\x81\\xa6\\x1f\\x4b\\x48\\x7d\\xd5\\x4e\\x27\\x61\\xd3\\xa2\\x70\\xb8\\x66\\x38\\x1f\\x5a\\x48\\xa7\\x4d\\x59\\xb4\\x42\\x69\\x51\\x1b\\x6a\\x5d\\xe6\\x31\\x38\\xb2\\x3f\\xf3\\x47\\x59\\x01\\x05\\x0d\\x82\\xf0\\xca\\x7c\\x3b\\xf6\\xc2\\x51\\xd4\\xd0\\xac\\x44\\x5e\\x40\\x67\\x8a\\x78\\x24\\x64\\xb1\\xba\\xcd\\x35\\x2b\\x45\\xdb\\x18\\xba\\xb0\\xfa\\xec\\x98\\x06\\x1c\\xe5\\x49\\x1b\\x48\\xfa\\x7b\\x09\\x0d\\x53\\xc2\\x2c\\xf8\\xdd\\x98\\xaf\\xc7\\x18\\x55\\xc7\\x19\\x8d\\x30\\x03\\x23\\xa7\\x16\\x5a\\x2e\\xe4\\x32\\x5a\\x68\\x97\\x28\\xc0\\x20\\x5d\\x98\\xc4\\x23\\xe0\\xcc\\xd8\\x67\\xb3\\x9b\\x18\\x26\\x6b\\xd4\\x82\\x6d\\xb4\\xb7\\x10\\xc0\\x6e\\x58\\x06\\x29\\x8b\\x8f\\x44\\xfa\\xcc\\x1c\\x19\\x94\\xcb\\x04\\xf0\\x6e\\xc8\\x6b\\xb5\\xbe\\x43\\x67\\x16\\x8a\\xec\\xe0\\x6b\\x14\\xcd\\xd7\\x2f\\x24\\x7a\\xd8\\xe5\\x02\\xe0\\x60\\xcd\\x89\\x89\\x12\\x22\\x12\\xe6\\x60\\x7a\\x28\\x8e\\xef\\x68\\xba\\xee\\x31\\x4f\\xdf\\xdc\\x7d\\xbc\\x2f\\x67\\xb1\\x20\\x89\\x19\\x30\\x71\\x59\\x52\\xce\\x14\\x43\\xb9\\x24\\x64\\x76\\x16\\x9d\\x09\\xc9\\xdd\\x55\\xc4\\x9b\\x64\\xf7\\x5e\\xde\\x24\\x45\\x29\\xa9\\x71\\xc5\\xcd\\xa7\\x4d\\xb8\\x77\\xa5\\x05\\x8a\\x95\\x67\\x89\\x33\\x97\\x5f\\xeb\\xc4\\x4f\\x9e\\xb0\\x89\\xca\\x9a\\x8b\\xd9\\x16\\xbf\\xa5\\x07\\x57\\xeb\\x24\\x44\\x21\\x22\\xa3\\xd4\\xc6\\xd3\\x25\\xd0\\xc5\\x3f\\x42\\x9e\\xf7\\x54\\xaa\\x07\\x93\\x50\\x3b\\x71\\x3c\\x7b\\xd1\\x9b\\x85\\xeb\\x03\\x1a\\xa3\\x01\\x88\\x6a\\x9f\\x72\\xe4\\x6d\\xfb\\xab\\xe7\\xc8\\x22\\xf8\\xd3\\xe9\\x74\\x16\\x6e\\xb0\\x30\\xd3\\x1e\\xfb\\xf6\\x6e\\xc1\\x64\\xc0\\x5e\\x19\\x45\\x9c\\x4d\\x11\\xb6\\x6f\\xe9\\x20\\x64\\xaa\\x46\\xd6\\x38\\x84\\xc9\\xc9\\xea\\xe8\\x68\\xf9\\xfd\\x82\\xcb\\x11\\x9b\\xf6\\xfa\\x6a\\x79\\xed\\x2c\\xe0\\x1f\\xb2\\x2a\\xe3\\xdf\\x72\\xf9\\x9a\\x96\\x44\\x89\\x33\\xe2\\x2f\\x97\\x0e\\x86\\xdb\\x39\\x99\\x40\\xa9\\x93\\x7a\\x13\\x19\\x96\\xab\\x6b\\xb2\\xac\\x54\\xa2\\xea\\x37\\x4e\\xad\\xb9\\x89\\x2b\\xdc\\x94\\xcb\\xf6\\xe2\\x6a\\x73\\x7d\\x62\\xad\\xaf\\x36\\xff\\xb9\\xa4\\xee\\x21\\x31\\x5c\\x0d\\x7d\\x70\\xf0\\x0d\\x54\\xe7\\xac\\xe1\\xb3\\xb7\\x97\\x7e\\x60\\x10\\xd0\\x23\\x00\\x72\\x27\\x1a\\xd8\\x62\\x8b\\xb7\\x30\\x80\\x53\\x68\\x69\\x79\\x72\\xdb\\xbc\\x85\\x26\\xb6\\x57\\xb7\\xd7\\xce\\x29\\x39\\x2d\\x3b\\x6b\\xf8\\xd5\\x9c\\xdd\\xc3\\xf9\\xf1\\xf6\\xca\\x83\\x2e\\xd1\\x4b\\xc5\\x7a\\x51\\x3e\\xae\\x3d\\x91\\x50\\x78\\xde\\xd3\\xa5\\xcd\\x5d\\xa6\\x90\\x41\\xeb\\x26\\xe7\\x7a\\xb2\\xda\\xe2\\xb2\\xad\\xac\\xec\\xc4\\x2d\\xd5\\xc8\\x2e\\x5c\\x53\\x32\\x93\\xc0\\x61\\x0f\\x3e\\x67\\x19\\xa2\\x6e\\xf9\\x41\\x7f\\x64\\x89\\x49\\x86\\xce\\xed\\x80\\x70\\x08\\xe8\\xf2\\x3b\\x23\\xe7\\xce\\x0b\\x72\\x01\\xff\\x5f\\xc2\\xfc\\x64\\x4d\\x04\\x5b\\xae\\x6e\\xce\\x62\\xcd\\x59\\xa1\\xe5\\xbe\\xa0\\x4a\\xcf\\x9c\\x0b\\xd2\\xfe\\x9e\\x5f\\xcd\\x7c\\xfc\\xe5\\xb3\\xb2\\x0b\\x5f\\xfb\\xc2\\x39\\x83\\xfe\\x9c\\x97\\x9d\\x63\\xa0\\x4f\\x2f\\xca\\x40\\x74\\x5f\\x9c\\x5c\\x42\\xfa\\xa5\\x73\\x61\\xa7\\x55\\x95\\xa5\\xf2\\x39\\x9f\\xea\\x3d\\x26\\xfa\\x32\\x39\\xd1\\xe9\\xb9\\x3b\\x2f\\xd7\\x5f\\xec\\x76\\x11\\x3a\\xd3\\xc9\\x8c\\x8e\\x5e\\x03\\xce\\x88\\x5a\\x21\\x06\\xd0\\x69\\xd2\\xd1\\x03\\x26\\xd1\\x94\\x97\\x4a\\x49\\xb5\\x72\\xc9\\x1e\\xca\\x1f\\xfb\\xce\\xf1\\xdf\\xc9\\x00\\x7f\\x0d\\xf1\\x9f\\x11\\x3d\\x67\\x55\\xb1\\xa3\\xa2\\x1b\\x48\\x49\\xc0\\x4b\\x89\\xeb\\x37\\x91\\x42\\x51\\x92\\xb2\\xe0\\x52\\xe7\\x91\\x73\\xfc\\xe8\\x50\\x40\\x23\\xd6\\x2b\\x5b\\x48\\x64\\xc4\\x7a\\xa1\\x94\\x70\\x5f\\xa0\\x97\\x8b\\x4c\\xe6\\xde\\x58\\xc5\\x98\\x3f\\xdd\\x1b\\xed\\x35\\x65\\xa2\\xde\\xbd\\x71\\x8e\\x52\\xf4\\xb2\\xbd\\x21\\x7e\\x33\\xb7\\xdd\\x0f\\xcf\\x96\\xb0\\x54\\x27\\x1f\\x60\\x63\\xee\\x8d\\xf5\\xcb\\x96\\x8d\\xe8\\xa0\\x7e\\x66\\xd9\\x08\\x7d\\x45\\xfc\\x3c\\xd9\\x88\\x60\\x3c\\xfc\\x02\\xb2\\x11\\x91\\x87\\xf8\\x99\\xb2\\x11\\xbf\\x90\\x6c\\x24\\x89\\x99\\x83\\x73\\xbf\\xfb\\x2d\\x28\\x33\\x64\\xb1\\x8b\\x98\\x42\\xde\\xc4\\x60\\xbf\\x08\\x43\\xb6\\x94\\xfc\\x39\\xde\\xe8\\x79\\xb5\\x1b\\xa7\\x5b\\xe9\\x30\\x5e\\xad\\xc3\\xa7\\x6c\\xe6\\xf4\\xe0\\x37\\xc6\\x43\\xe9\\x88\\x89\\x59\\xe5\\xb2\\x6f\\xab\\x0c\\x87\\x85\\xc0\\xe8\\xcc\\xef\\xee\\x7c\\xb2\\x70\\x16\\x77\\x77\\x6d\\x8e\\x57\\x5b\\x19\\x31\\x4d\\x72\\x50\\x76\\xca\\xec\\x6d\\xe0\\xaa\\xde\\x1f\\xc5\\xc4\\x5d\\xfb\\xa1\\x77\\xbc\\x84\\xa5\\xdc\\xad\\x94\\x84\\x8c\\xe0\\x69\\x04\\xb0\\x62\\x70\\xa6\\xdb\\x82\\x91\\x38\\x72\\xf2\\xcd\\x7d\\xaa\\x0c\\xe1\\xb8\\xa3\\x75\\xce\\xb5\\xd2\\x89\\xd9\\xcb\\x8e\\x74\\x9f\\xa4\\x9c\\xfe\\xcd\\x04\\x80\\x6f\\xad\\xe0\\x1b\\x94\\xc6\\x9a\\x67\\x91\\xdf\\xbe\\x6d\\xbe\\x2d\\x5d\\xd0\\xee\\x06\\x39\\x4e\\xfb\\xd6\\x8a\\x29\\x5d\\xba\\x80\\xc1\\x92\\xee\\x26\\x69\\x1b\\x31\\x3b\\xa9\\xb5\\x66\\x18\\xcf\\xe5\\x34\\x6d\\x4f\\x17\\xc6\\xf6\\x74\\xba\\x06\\x98\\x39\\x1d\\xda\\x06\\xde\\xab\\x20\\x9d\\xb4\\xf3\\xc4\\xa4\\x3d\\x4e\\x00\\x94\\xf3\\x7b\\x07\\x40\\x51\\x39\\x78\\x6d\\x13\\x2c\\x0b\\xa5\\xb6\\xef\\xee\\xfa\\xbb\\xcc\\xd8\\x29\\xe7\\x29\\xf6\\xe6\\x3c\\xdf\\x1f\\x04\\xb0\\xad\\x9c\\x99\\xba\\xbb\\x2b\\x09\\xbb\\xa0\\x6f\\x0f\\x73\\x52\\x80\\x8d\\x1a\\xec\\xc3\\x3d\\x89\\xcc\\x30\\xa4\\xa4\\x0d\\xd0\\x92\\x50\\x87\\x1c\\xf7\\x8f\\x9b\\xa2\\x1d\\x07\\x66\\xf9\\xc4\\x72\\xdc\\xdd\\x55\\x5f\\xec\\x44\\x48\\x9d\\x73\\x79\\xf1\\xe0\\x82\\xa4\\x40\\x23\\xa0\\x60\\x32\\xd6\\x0f\\xfe\\x6e\\x5d\\xb9\\xd7\\x8d\\xab\\x6b\\x6d\\xc0\\x9c\\xa9\\xbc\\x4d\\xa5\\x13\\x85\\x57\\xcb\\x65\\x29\\x2a\\x22\\x49\\xd0\\x44\\xcf\\x10\\x37\\x57\\xc5\\x9c\\x34\\x6a\\x36\\x54\\x3c\\x0d\\xe9\\x11\\x33\\xb5\\xab\\x1c\\x26\\x80\\xf6\\xe7\\x9b\\x04\\x16\\xc0\\x68\\xa7\\x34\\xb7\\x86\\xdc\\xc8\\x13\\xbe\\xcc\\xb6\\x56\\xb4\\xd8\\xc2\\x1a\\x49\\xc5\\xea\\x96\\x46\\x32\\x6e\\xa9\\x9e\\x2d\\x9d\\x5a\\xab\\xad\\x44\\x79\\x82\\x84\\x5a\\x43\\x49\\x6a\\x28\\x25\\xa8\\xe9\\xd5\\x74\\x3a\\xda\\xd2\\x2b\\x89\\x5c\\x79\\x91\\x9d\\xf5\\x4e\\x5a\\xfb\\xe6\\xaf\\x23\\xc5\\xfa\\x31\\x2e\\x21\\xcc\\x8a\\x87\\xe6\\xfc\\x31\\xa6\\xbd\\x9d\\x31\\x7f\\x3e\\x9d\\xf6\\xf6\\xbe\\xd3\\xde\\xce\\x9d\\xf6\\xf6\\x63\\x4e\\x3b\\xc7\\x2b\\x6b\\xf7\\x84\\x7c\\xad\\xa7\\xf7\\xc4\\x95\\x40\\x57\\x5f\\x33\\x53\\xe6\\x82\\x3b\\x42\\x71\\xde\\x09\\x9f\\x86\\x7f\\x07\\x06\\xfc\\x78\\xf8\\xe5\\x7f\\x9f\\xd5\\xaf\\x33\\x53\\x8c\\xd6\\x17\\xfe\\x9b\\x5a\\x5f\\xf7\\x1a\\x44\\xf1\\xc5\\x74\\x9f\\xb5\\x84\\x34\\x9c\\x2f\\xc2\\x6a\\x2c\\x9c\\x76\\xec\\x86\\x67\\x29\\x63\\x80\\xb0\\xcb\\xf9\\xee\\x4e\\x39\\xad\\x42\\x5d\\x9d\\xe6\\x59\\x29\\x76\\x69\\x70\\x8d\\x1e\\x0d\\xae\\xd1\\x77\\xea\\xd5\\x17\\x14\\xe8\\xa3\\x65\\x7d\\x87\\x46\\xd3\\xc3\\x91\\xd1\\xf4\\x70\\xec\\x68\\x71\\xbd\\xfd\\x39\\x4c\\x03\\x0c\\x9f\\x3a\\x1e\\x3a\\x3a\\xe2\\xb1\\xfe\\xd9\\xb3\\xd1\\x92\\x11\\x37\\xff\\x4e\\x78\\x4c\\x2d\\x31\\x8b\\x48\\xa0\\x81\\xa8\\xfb\\x9f\\x84\\xdb\\x54\\xbd\\x9d\\x62\\xb6\\x55\\xa2\\x04\\x06\\x6a\\x06\\x0c\\xec\\x49\\xd1\\xae\\xe8\\xf1\\x98\\x3e\\x31\\xc3\\x28\\xeb\\xaa\\xfe\\x1d\\x39\\x7e\\xf1\\x1d\\x77\\x5a\\x31\\x27\\x0b\\xb2\\x34\\x38\\x1c\\xbd\\xd1\\xb1\\xed\\x33\\xe6\\x56\\x06\\x3f\\x90\\x13\\x18\\x9c\\x77\\x26\\x21\\x85\\x30\\x09\\x8a\\x91\\xb6\\x7c\\x3e\\x44\\x6e\\x60\\xf2\\xbc\\x89\\xaa\\x24\\x84\\x54\\x65\\x8c\\xf2\\xb9\\x4f\\xb5\\x09\\x20\\xe5\\x2c\\x69\\x20\\x6f\\xac\\xf4\\xb1\\xa5\\x17\\x3a\\xe3\\xaa\\x02\\xd2\\x0b\\xa3\\x4c\\x81\\x1f\\x0c\\x7b\\x1b\\x0a\\x4a\\xe7\\xcb\\xde\\xd8\\x98\\x3c\\x33\\x37\\x23\\x1e\\x27\\x5b\\x22\\xa0\\x93\\xb6\\x98\\x25\\x02\\xf4\\x15\\xe9\\xe4\\x49\\x04\\x04\\x7b\\xdb\\x29\\x20\\x11\\x88\\x18\\xdf\\x4e\\xa6\\x44\\xa0\\x53\\xd4\\x25\\xa5\\x1e\\x22\\x44\\x04\\xa7\\x7e\\xa3\\xb8\\xa4\\xbc\\x41\\x98\\x41\\x7f\\x7e\\x0a\\xeb\\x68\\x2f\\x78\\x94\\xe2\\x22\\x2a\\xcb\\x66\\x54\\x2f\\xe7\\x81\\x2e\\x6c\\x58\\x41\\xa3\\x14\\x4c\\x2f\\xe0\\x81\\x82\\x5b\\x56\\x30\\x53\\x30\\x92\\x94\\x68\\x79\\x54\\xa2\\x95\\xe1\\x2b\\x73\\xf0\\x20\\x0e\\x2d\\xf1\\x1c\\x2e\\x1c\\x14\\x63\\x10\\x23\\x50\\x22\\x21\\xca\\x56\\x12\\xa2\\x4c\\x8f\\x8e\\xb6\\xaa\\x5d\\xde\\x56\\xb2\\xcb\\x1b\\x24\\x44\\x2c\\x03\\x26\\x62\\x49\\x09\\x4f\\xc8\\x56\\x6f\\x9b\\xb7\\xca\\xb1\\xcd\\x1b\\x93\\x15\\x19\\x66\\x19\\x0d\\x4d\\x68\\x06\\x53\\x6c\\x0c\\xd4\\xa6\\x6c\\x5a\\x2b\\x11\\xf7\\xa2\\xb1\\x32\\xd8\\xea\\x6d\\xb2\\x42\\x63\\x2c\\x60\\x24\\xf4\\xf2\\x3e\\x85\\xe1\\x11\\xd1\\x0c\\x95\\xd4\\x63\\xea\\x2d\\x9a\\xde\\x44\\x20\\x61\\xc8\\x1d\\xa9\\xfa\\x06\\x05\\x2d\\xfb\\x96\\xc2\\xb2\\x6f\\xa9\\x58\\xf6\\x2d\\x6c\\xb4\\xd8\\x73\\x16\\x3a\\xcb\\xbe\\x85\\x62\\xd9\\xb7\\x88\\x2c\\xfb\\x06\\x47\\x47\\x83\\xc8\\xb2\\x6f\\xf0\\xa0\\x41\\x3c\\x56\\x18\\xc4\\x63\\xf5\\x0d\\x41\\x3c\\x38\\xa5\\x9c\\x2d\\x05\\x53\\x0d\\xfa\\x06\\xf7\\x36\\xe8\\x93\\xeb\\x2a\\x66\\xc7\\xc7\\xa5\\x39\\x9c\\x3d\\x96\\x7c\\x4b\\xe6\\xd9\\xcf\\x3d\\x8e\\xad\\x1f\\x0e\\xe0\\xd1\\x8d\\xfd\\x5e\\xe9\\xa3\\xd3\\x71\\x69\\xcc\\x59\\x52\\x96\\x75\\x7e\\x52\\x6b\\x9d\\xa3\\x2c\\x2b\\xa4\\xc6\\x4b\\xc5\\x8d\\x04\\x07\\x91\\xd1\\x11\\x19\\x32\\x23\\xc1\\x9e\\x6c\\x24\\x48\\xd3\\xa4\\xa4\\xdc\\xfd\\xfe\\x6d\\x46\\x82\\xc3\\x3d\\x8c\\x04\\x87\\xb1\\x8c\\x32\\x2e\\x86\\xc6\\x5b\\xdf\\x6c\\x24\\x38\\x57\\x0c\\x2d\\x4d\\x46\\x82\\xc3\\xd8\\xa2\\x67\\xa8\\x33\\x12\\x5c\\x45\\x46\\x82\\x7e\\x01\\x23\\xc1\\xbe\\x1d\\xcb\\x57\\x35\\x46\\x82\\xc9\\x03\\x4b\\xa7\\xba\\x1f\\x15\\x31\\x12\\x1c\\x14\\x31\\x12\\x94\\x56\\xb8\\x58\\x26\\x7b\\x58\\x09\\x0a\\x69\\x2f\\xda\\xab\\xde\\x37\\xb2\\x09\\x33\\x0c\\x1c\\x3c\\xa4\\x61\\x60\\x7b\\x0f\\xc3\\x40\\x6e\\xdb\\xf8\\x2d\\xc6\\x8d\\xdc\\x16\\x70\\xb0\\x8f\\x2d\\x60\\x64\\x82\\xd8\\x53\\x79\\x08\\xc5\\x2c\\x43\\x21\\x44\\x39\\x22\\xc0\\xc7\\x5b\\xc9\\xb5\\x17\\x57\\xfe\\xb5\\xe3\\xc2\\x3f\\x68\\xe7\\x2d\\x01\\x59\\x16\\xf1\\xe5\\xa8\\x33\\xcd\\xca\\xb0\\x2e\\x04\\x96\\x3c\\x30\\x5a\\x17\\xf6\\xc8\\x98\\x59\\x17\\xc2\\x05\\xa7\\x59\\x20\\xf7\\x37\\x30\\xec\\x90\\x2e\\x65\\x24\\x34\\x26\\x86\\x1d\\x61\\x62\\xe8\\x2b\\x26\\x86\\x1e\\x33\\x31\\x0c\\x92\\x26\\x86\\x18\\x34\\x53\\x18\\x19\\xf6\\x1d\\x51\\xf8\\xaa\\x27\\x19\\x19\\xf6\\xd3\\x46\\x86\\x7d\\xc9\\xc8\\x70\\x0c\\x29\\x63\\xc7\\x8b\\x8d\\x0c\\x59\\x30\\x8b\\x3e\\xc6\\x7d\\x51\\x8d\\x0c\\x3b\\x92\\x91\\x21\\x8b\\x6e\\x81\\x99\\x38\\x1d\\x0a\\xcb\\x09\\xe8\\x77\\xd9\\xc8\\x90\\x82\\x9d\\xa0\\x02\\x76\\xbb\\x9f\\x1c\\x33\\x52\\x23\\x84\\xa6\\xa2\\xd8\\x5a\\xfd\\x09\\x30\\x9a\\x0b\\xcb\\xe7\\x06\\x83\\xe8\\xde\\x3b\\x72\\xd0\\x24\\x65\\x93\\xdd\\x5a\\xea\\x92\\xeb\\x14\\xa3\\x58\\xad\\x3d\\x7b\\x32\\xa5\\x01\\x39\\x51\\x16\\x10\\xcc\\x17\\x74\\xe6\\x68\\x5f\\xac\\x49\\x4e\\xac\\x7f\\xe8\\x68\\x88\\x1c\\x3a\\x97\\x3d\\xa0\\x85\\xec\\xe4\\x6a\\x76\\x1d\\xcf\\xb6\\x83\\xc6\\x24\\x94\\xc5\\x77\\x12\\xb1\\x46\\x3c\\x6e\\x1f\\xd9\\xc3\\x88\\x4e\\x26\\xfb\\x48\\x3e\\xc2\\x5f\\xcb\\xd2\\xa1\\x2a\\x46\\x5d\\x1e\\xea\\xcd\\x24\\xb7\\x7b\\x9a\\x49\\x26\\x2d\\x7e\\x92\\x66\\x92\\x73\\xd5\\x4c\\xb2\\x9f\\x32\\x93\\x1c\\x9b\\xb7\\x4e\\x52\\x06\\x21\\x7c\\x7b\\x91\\x0e\\x6e\\x8f\\x07\\xdd\\x1b\\x01\\xab\\xba\\xab\\xdd\\x1d\\x41\\xe6\\xee\\xe8\\x39\\xe2\\xfd\\x55\\x97\\x6e\\x5a\\x9d\\xb1\\x5e\\x4f\\xb1\\xe1\\x73\\x44\\x32\\xdb\\x18\\xa9\\x6d\\xd0\\x83\\x9d\\x6a\\x8b\\xed\\x15\\xaf\\x3d\\xcb\\xe3\\x46\\xb6\\xf0\\xb6\\xd9\\xe1\\x7b\\x84\\xf6\\xa8\\xd1\\x23\\xf4\\x2f\\x1d\\x6d\\xa3\\x4b\\x9d\\x6e\\x5e\\xb5\\x49\\xff\\x9a\\x48\\xb3\\xd0\\x08\\xe4\\x39\\x11\\xdf\\x25\\x60\\xf8\\x3a\\x49\\xbe\\xa2\\xf8\\xe2\\xeb\\xe4\\x9c\\x6c\\x49\\xe1\\x8b\\xe6\\x5c\\xdb\\x45\\xce\\x43\\xef\\x6b\\xde\\x28\\x48\\x7c\\xc7\\x91\\x4c\\x15\\x23\\xb2\\x1f\\x4f\\xc9\\x7d\\x8d\\x1f\\x17\\x7a\\xe3\\x47\\x4f\\x35\\x7e\\xdc\\x26\\x05\\x9f\\x69\\x9b\\x47\\xad\\xf4\\x93\\x1b\\x25\\xee\\x19\\xe5\\x29\\xb2\\x73\\xec\\x9b\\xed\\x1c\\x07\\x3a\\x3b\\xc7\\x61\\xc2\\xce\\xf1\\x58\\x1b\\x14\\x6a\\x64\\x12\\xaa\\x8e\\x99\\xd1\\x62\\x64\\xee\\x78\\x58\\x43\\x63\\xc7\\x5a\\x64\\xec\\x58\\x17\\xc6\\x8e\\xa2\\x3c\\xbd\\x04\\x11\\x7b\\xc0\\x4a\\x44\\xb6\\x8f\\x8a\\xfc\\x93\\x77\\xef\\x4b\\x2f\\x5c\\x23\\xd1\\x10\\x9b\\x36\\x27\\x70\\x45\\x59\\x06\\x91\\x1b\\x53\\x7c\\xa9\\x84\\x41\\x64\\x64\\x32\\x39\\x4b\\x19\\x44\\x0e\\xbe\\x21\\x02\\x54\\x21\\x93\\x47\\x73\\x10\\xa8\\xad\\x56\\x26\\xbb\\x26\\x1b\\x84\\x27\\x68\\x8e\\xd2\\x94\\x3c\\xe5\\x2b\\xf7\\xf8\\xe4\\x9a\\xf8\\x6a\\x05\\x26\\xbb\\xdb\\x91\\xd3\\xcc\\x6a\\x11\\x0e\\x22\\xae\\x67\\xaf\\xca\\xea\\x3e\\x3a\\x72\\x35\\x80\\x5e\\xdc\\x3c\\x32\\x84\\x57\\xe4\\xa6\\x7b\\x67\\xb7\\x13\\x22\\xe5\\x7b\\xc5\\xb0\\x1a\\x44\\x26\\x97\\xd1\\x6d\\xe5\\xe2\\xcf\\x6f\\x0f\\x4a\\x35\\x50\\x4d\\x30\\x25\\x81\\xf7\\x1a\\x1e\\x28\\xf5\\x4d\\x23\\x44\\x71\\x3b\\x88\\x9e\\x21\\x58\\x54\\xca\\x2c\\xb2\\x2f\\x45\\x90\\x1a\\x24\\xab\\x7d\\x5c\\x01\\xb2\\x51\\xa2\\x9b\\x2d\\x40\\x36\\x9a\\x56\\xe6\\xdb\\x48\\x66\\x9a\\x57\\x66\\xda\\x48\\x66\\x5a\\x57\\x66\\xda\\x68\\x19\\xad\\x2b\\x8b\\xd8\\x48\\x1a\\xfd\\x9e\\x65\\xdb\\x48\\x1a\\x4d\\x2b\\xf3\\x6c\\x24\\x07\\x8f\\x68\\x23\\x39\\xb8\\x9f\\x8d\\xe4\\xe0\\x4f\\xb0\\x91\\xd4\\xb4\\x59\\xc0\\x46\\x52\\x27\\x96\\x36\\x4b\\xfd\\xe9\\x2b\\x74\\x9d\\x9f\\x2d\\xf5\\xe7\\x19\\x20\\x63\\xbe\\xd4\\x5f\\xe4\\x21\\xc3\\x4c\\xa9\\xff\\xb0\\xa8\\xd4\\x7f\\x93\\x1e\\xd0\\xc6\\x71\\x89\\x10\\x2d\\x6f\\x14\\xa9\\xff\\x46\\x09\\x44\\xb5\\x51\\x6c\\x1a\\x37\\x0f\\x17\\x88\\xaa\\x17\\x05\\xa2\\xba\\x57\\x4c\\x2a\\xbd\\xc5\\x72\\xc6\\x1d\\xbb\\xbf\\xc5\\xa4\\xc1\\x28\\x13\\x25\\x44\\x41\\xd2\\x5a\\x12\\xc6\\x00\\xb5\\xff\\x1c\\xce\\xc2\\x49\\xd8\\xc7\\x84\\x07\\x53\\x19\\x7c\\x1e\\x2d\\xe7\\xfb\\x84\\xd3\\x5e\\xc5\\x87\\x47\\x42\\x0b\\x00\\x6f\\xa2\\x7c\\x6f\\x85\\xcd\\xa3\\xe7\\x94\\xe1\\xde\\x02\\x5a\\x1f\\xdd\\x0e\\x38\\x5e\\xab\\xde\\xa8\\xd4\\x49\\xdb\\xf9\\xf5\\xe9\\x33\\x7e\\x7f\\x96\\x3e\\x94\\xca\\xd5\\x17\\x4f\\x7c\\x16\\x17\\xaa\\x5c\\x3a\\xfd\\x8e\\x7c\\x77\\x50\\x83\\xff\\x4a\\x65\\xaf\\x5c\\x82\\x7f\\xbf\\x8b\\xde\\x5a\\xed\\xf2\\x77\\x76\\xb9\\xf4\\x33\\xfc\\x3a\\x7e\\xd2\\xae\\xe0\\xef\\x54\\xee\\x28\\x33\\xe4\\x28\\x97\\xfe\\x05\\x95\\x1f\\xcb\\xe5\\xff\\x2e\\x95\\xc7\\xdf\\xf0\\xfe\\xb9\\xf9\\xfd\\x2e\\x1a\\xcf\\x17\\x98\\x91\\x65\\x35\\x18\\x4f\\x17\\xc0\\x7b\\xdc\\xdd\\x2d\\x45\\x74\\x89\\x37\\x40\\x77\\x7a\\x5c\\x6c\\x1d\\xbd\\x6f\\x05\\x11\\x7f\\xdc\\x78\\x73\\x6d\\x27\\xa6\\x29\\x9a\\x98\\xc0\\x72\\x11\\x65\\x52\\x91\\xbd\\x4a\\x51\\x39\\xba\\x78\\xac\\x5f\\x57\\x30\\x0f\\x86\\x65\\x30\\x59\\x11\\x54\\x79\\x78\\x50\\x45\\x82\\x5b\\x3b\\xf1\\x5a\\xb5\\x86\\x47\\xdd\\x70\\xeb\\x4b\\xb1\\xa5\\x2b\\xf9\\xc7\\xe7\\xed\\xa4\\x2a\\xf2\\xa1\\x22\\xf4\\x24\\x13\\xcf\\xc4\\x8f\\x30\\x13\\x6f\\x9c\\x78\\xac\\x48\\xf5\\x36\\xa2\\xf9\\xc0\\x8f\\xac\\x9d\\x07\\x29\\xc7\\xbb\\xaa\\x37\\xa3\\x4c\\x1b\\x4b\\x69\\xf8\\x84\\x3e\\x37\\x96\\xb0\\xa0\\xbf\\xd0\\x48\\xe6\\x4c\\x54\\xf9\\x73\\x24\\xaa\\xfc\\x45\\x88\\x2a\\x57\\x05\\x44\\x95\\xe7\\x45\\x44\\x95\\x2b\\x59\\x54\\x79\\x74\\x44\\x1f\\x3d\\x77\\xb6\\xa3\\xee\\xb1\\xfe\\xf0\\xe6\\x0f\\xa5\\xf6\\x9b\\x6c\\x71\\xb4\\x3d\\x45\\x92\\xd7\\x09\\xfd\\x65\\xe4\\xa4\\x58\\x15\\x9f\\xfe\\x4b\\x84\\x9d\\xf9\\x97\\x81\\x40\\xa6\\x02\\x24\\x37\\x16\\x20\\xcd\\x1b\\x91\\x1a\\x28\\x4b\\x76\\x30\\x62\\x6e\\x44\\x20\\xe5\\xc4\\xf1\\x61\\x69\\x62\\xf0\\x11\\x91\\xf2\\x3d\\xa4\\xd4\\x29\\x15\\x6c\\x37\\xae\\xbe\\xf2\\x5a\\xaf\\xae\\x77\\xd7\\xc8\\xca\\x19\\xbb\\x9e\\x16\\xfd\\xfe\\x95\\x1a\\x42\\xf3\\x79\\x68\\x29\\x35\\x35\\xfe\\x6a\\x1a\\x0e\\xc2\\x4f\\x1a\\x0c\\x85\\x42\\x24\\xb0\\x62\\x43\\x81\\x2e\\x92\\xfb\\x0d\\x7a\\x90\\x1a\\xf4\\x40\\x37\\x68\\xd8\\x90\\x4e\\x34\\xef\\xa3\\x48\\x70\\xd1\\x18\\xc4\\x3a\\xb0\\x49\\x52\\xb2\\x3b\\x89\\x24\\xbb\\x93\\x2c\\xe9\\xf4\\xcf\\x54\\x3a\\xbd\\x52\\x44\\xbb\\xbf\\xa0\\x68\\x77\\x22\\x36\\xd3\\x55\\x6c\\xa3\\x84\\x5d\\xb4\\x89\\x64\\x4a\\x85\\x3d\\xb4\\x21\\x29\\xf1\\x0d\\x8c\\x8e\\xe9\\xa2\\x9b\\xf7\\x3d\\x97\\x10\\x4f\\x52\\xde\\xa4\\x52\\x59\\x46\\x78\\xb9\\x66\\x67\\x19\\xa4\\x7a\\x10\\xaf\\x82\\x7d\\xe4\\xea\\x9d\\x94\\x5c\\x7d\\xca\\xa7\\xb5\\x23\\xa6\\x75\\x1a\\x4d\\xeb\\x34\\x4b\\x60\\xfe\\x0b\\x0a\\xcc\\xd5\\x59\\xfd\\x19\\x67\\xf5\\x86\\xd7\\xd7\\x15\\xf5\\xdd\\x44\\xf5\\xdd\\xec\\x57\\x5f\\xb4\\x1e\\x6a\\x0d\\x56\\xb5\\x71\\x06\\xb6\\x75\\x39\\x2e\\x79\\x42\\xf3\\x18\\x55\\x53\\x6f\\x64\\xd6\\x71\\x9c\\x51\\xc7\\x5f\\x23\\xa9\\xd0\\xa1\\xba\\xc3\\xb0\\xce\\xdc\\x28\\x8d\\xf1\\xf5\\x23\\x94\\x56\\xc5\\x46\\x92\\xbd\\x24\\xa6\\x45\\x07\\x93\\x5d\\xcd\\x0d\\x13\\x05\\xff\\x94\\x6b\\xa7\\xf1\\x13\\x3b\\x49\\x7f\\x36\\x61\\x0c\\xb6\\xe4\\x27\\x74\\x5b\\xfb\\x8b\\x51\\xe7\\x78\\x4b\\x33\\x54\\xac\\xcb\\xd6\\x6b\\xfc\\x12\\xbf\\x3a\\xaf\\x2b\\x1b\\x6a\\x2c\\xb2\\xe1\\xd4\\xb3\\x09\\x7e\\xf0\\x53\\xce\\x10\\xb4\\x70\\x83\\x0f\\x02\\x6e\\xf0\\x03\\x5a\\x98\\xa4\\xe0\\x06\\xff\\xb4\\x56\\x32\\xdc\\xe0\\x43\\x2c\\x96\\x48\\xde\\x49\\x26\\xb8\\xc1\\x47\\x46\\x76\\xfc\\xd6\\xfc\\x28\\xe0\\x06\\xbf\\xa1\\x62\\xe7\\x83\\xfd\\xf1\\xea\\xb7\\x6b\\xe7\\x03\\xfc\\x93\\x82\\x1b\\x60\\x62\\x0c\\x37\\xc0\\x27\\x06\\x37\\x58\\xc1\\x85\\x19\\xad\\xb0\\xd5\\x83\\xc2\\x0d\\x7e\\x42\\xb8\\xc1\\x4f\\xb9\\x70\\x03\\xfa\\x69\\xff\\xe5\\x64\\xb4\\x7d\\x28\\x4b\\x4e\\x5d\\x76\\xb7\\x92\\xbf\\xe6\\x94\\xa0\\xb9\\xe0\\x68\\x1f\\xc9\\x4e\\x8a\\x43\\x7e\\x42\\xa0\\x24\\x73\\x14\\x9b\\xfa\\x74\\x9d\\x41\\xfc\\xd0\\x73\\xc6\\xf1\\x43\\xdf\\x19\\xaa\\xe8\\x87\\xdf\\xf7\\xed\\x68\\x8e\\xc6\\x64\\x6e\\x24\\x43\\xbe\\x6e\\x1a\\xa7\\xcc\\x66\\x7d\\xdb\\x38\\x63\\x84\\x08\\x15\\xe1\\xba\\x5e\\xe1\\x2e\\x1c\\x3e\\x52\\x1f\\x9a\\xe2\\x60\\xb9\\xaa\\x91\\x9f\\xaf\\x29\\x47\\xc8\\xa3\\xb5\\x45\\xa1\\xda\\xe0\\xd7\\x38\\x98\\x41\\x96\\xdf\\x45\\x88\\x36\\xd7\\x43\\xdf\\x9e\\x7a\\xb0\\x6b\\x14\\xbc\\x8d\\x55\\xc8\\xe8\\x26\\xcf\\xf9\\x29\\x13\\x68\\xc2\\xb9\\x9d\\x08\\x6a\\xb2\\x82\\x9e\\xf8\\x9e\\xe3\\x79\\xf7\\x04\\x9b\\xc4\\xf5\\xc9\\x70\\x93\\x36\\xad\\x51\\x06\\x9c\\xf8\\x5e\\x71\\x30\\x07\\x1d\\x49\\xe0\\x39\\x79\\x65\\xe8\\xf9\\x89\\x18\\xd9\\x9c\\x7c\\x32\\x52\\x25\\x2f\\xef\\xb6\\xbe\\x4f\\xe6\\xe3\\x3d\\x32\\x4b\\x5e\\xac\\xf3\\xb2\\x4a\\x74\\x22\\x9d\\x8b\\x4e\\xfe\\x5c\\x50\\x31\\x0c\\xb5\\xfe\\x87\\x13\\xaa\\xb3\\xc7\\x84\\xe4\\xe5\\x55\\x26\\x24\\x37\\xf3\\xf1\\x1e\\x99\\xa5\\x09\\xc9\\xcb\\x2a\\xa3\\x82\\x72\\xab\\x45\\x5e\\xea\\xcc\\xf5\\x87\\x68\\x14\\x44\\xf5\\x07\\x85\\xa6\\x83\\x16\\xc3\\x60\\x7a\\x5c\\x05\\xe8\\x39\\x8b\\x2a\\x35\\xf9\\x05\\x42\\xe8\\xe7\\xa7\\xc7\\x8d\\x9f\\x49\\x4f\\x4e\\xea\\x7a\\x8d\\x5a\\x73\\xc1\\x39\\xa5\\xae\\x97\\xba\\xdb\\x35\\x68\\x20\\xd3\\x45\\x05\\x9b\\x39\\x04\\x7e\\xb4\\x3f\\x71\\x47\\xef\\x82\\xad\\x13\\x29\\xc7\\x95\\xe4\\x16\\x25\\xe5\\x1b\\x4a\\x1a\\xa1\\x69\\x6a\\xbe\\xb2\\x45\\x8f\\xaf\\xd6\\xa7\\xc6\\x67\\xea\\x5d\\x95\\x5f\\xb9\\x0b\\x54\\xbe\\x51\\x04\\xd2\\x42\\x46\\x20\\xd1\\x34\\x29\\x29\\x9f\\x1a\\x78\\x9d\\x3d\\xd2\\x6c\\xd2\\xaa\\xe7\\x51\\x31\\x43\\x65\\x1d\\x41\\x8a\\x76\\x70\\x4c\\x64\\x97\\x59\\xc7\\x48\\xa4\\xb8\\x58\\xb2\\x0f\\xd1\\xea\\x17\\x94\\x20\\x0a\\xe7\\x47\\x2e\\x50\\x82\\x97\\xad\\x12\\x12\\x44\\x7d\\x77\\x84\\xb1\\xb0\\x42\\x6a\\x28\\x3a\\x4e\\x31\\xb8\\xbf\\xfe\\x91\\xfc\\xf5\\xf0\\x8f\\x6f\\x3e\\xc5\\x5f\\xf7\\x53\\x0c\\x36\\x9f\\xc2\\x3c\\x16\\x3b\\xc9\\xed\\x0e\\x32\\x2b\\xda\\x93\\xe1\\x85\\x3b\\xd2\\xf4\\x5d\\xf3\\x18\\x25\\xeb\\x17\\x58\\x1e\\xdc\\x13\\x03\\xa5\\x52\\x6d\\xb6\\x50\\xfa\\x3a\\xd7\\xc0\\x63\\xec\\xb7\\x26\\x7d\\x68\\x93\\x57\\xb0\\x2b\\x42\\xce\\xf7\\x84\\x11\\x27\\x14\\xee\\xcb\\xb0\\xfe\\xaa\\xe1\\x7f\\xe4\\x89\\xd9\\x87\\x07\\xec\\xa5\\x78\\xc0\\x82\\x15\\xa7\\x07\\x18\\xc2\\xf2\\x7b\\x09\\x23\\x9c\\x71\\x92\\xae\\x27\\x98\\xbe\\x59\\x34\\xd4\\xe8\\x57\\xe3\\x57\\xe0\\xf0\\x52\\xec\\xe2\\x9c\\x97\\xec\\x8b\\x92\\xf3\\xa8\\xe4\\xdc\\x54\\x32\\x8f\\x31\\x94\\xfb\\xbf\\x7d\\x56\\x94\\x35\\xbc\\x87\\xb3\\xfa\\xac\\x76\\x8b\\xb0\\x93\\x45\\xd8\\xc7\\x20\\x9f\\x7d\\x54\\xda\\x35\\x32\\x90\\xf4\\x83\\xcd\\x8a\\x77\\x3a\\x5d\\x78\\x6e\\xa3\\xd1\\xd6\\x06\\xfd\\xec\\xa3\\xf2\\x94\\xdd\\x70\\xe4\\x47\\x9b\\xbc\\x39\\x3a\\x92\\x04\\xb8\\xf4\\x40\\x18\\xa6\\xf6\\x71\\xea\\x1e\\x55\\xe8\\xca\\x88\\x80\\x7c\\x23\\x09\\x83\\x51\\xf0\\x32\\xf2\\x9c\\xa1\\x96\\x98\\x6c\\x8e\\x3c\\x7d\\x74\\x52\\x71\\x13\\x2b\\x92\\xdc\\x44\\xc8\\xd2\\x5a\\x12\\x93\\xfb\\x2b\\xb6\\x94\\x5d\\x5f\\x4a\\xc6\\x9b\\x53\\x21\\x9d\\x87\\x71\\x6a\\x1e\\x36\\xd5\\x98\\x3a\\x60\\xf3\\xba\\xb4\\x9b\\x63\\x4f\\x9e\\x0d\\xa5\\x79\\xa9\\x87\\x6a\\x2e\\x54\\x06\\xc1\\x76\\x28\\x19\\x6c\\x1d\\xdb\\x25\\xf2\\x96\\x23\\x52\\xf6\\x07\\x27\\x7e\\x88\\xc0\\x89\\xef\\x14\\x70\\xe2\\x87\\x04\\x38\\xf1\\xdd\\x37\\x3a\\x18\\x5f\\xed\\x8f\\xb1\\xf9\\x90\\x8f\\xb1\\x21\\x3f\\xd2\\x7f\\x13\\x71\\x0d\\x49\\x8f\\xf4\\x65\\xa4\\x4b\\xda\\xc7\\x37\\x4f\\x19\\x19\\x3c\\x5d\\x5a\\x2c\\xe2\\xbe\\xe1\\xd5\\x24\\x05\\xc2\\x09\\x53\\x29\\xd3\\x54\\xca\\x4d\\x2a\\x65\\x96\\x4a\\x99\\xa7\\x52\\x16\\x1a\\x78\\xcf\\xd2\\xe1\\xd6\\x9f\\x4c\\x19\\x60\\xd3\\x40\\x83\\x29\\x50\\xcf\\x3a\\x01\\xea\\x79\\x16\\x81\\x7a\\x9e\\x49\\xa0\\x9e\\x8d\\x6a\\x5d\\x19\\x67\\x3a\\x96\\x32\\x6d\\x19\\x40\\xe7\\x96\\xfd\\xd1\\x82\\x44\\xa8\\x0d\\xe5\\x99\\xd1\\x86\\xf2\\xdc\\x84\\x1d\\xba\\x40\\x8c\\xd0\\x25\\xfe\\xf3\\x12\\x31\\x42\\xaf\\xf0\\xd7\\x6b\\xe7\\x45\\x8d\\xbc\\x61\\x8d\\xbd\\x65\\x7f\\xde\\xa9\\xd8\\x20\\x7e\\x20\\x65\\xe0\\x80\\x6c\\xf2\\xde\\xa9\\x91\\x0f\\x29\\xc8\\xd1\\x47\\x56\\xdf\\x27\\xa7\\x74\\x60\\xe1\\xf8\\x0e\\x70\\x9e\\xed\\x12\\xf9\\x8c\\x09\\x74\\x0e\\x78\\x4a\\x73\\x50\\x15\\x96\\x6b\\xd4\\x7b\\xe9\\x30\\xa5\\x57\\x9c\\x64\\xc3\\x8a\\x5e\\xa0\\xc4\\x55\\xe4\\xe0\\x60\\xa2\\x9b\\x28\\x81\\x1f\\x31\\x24\\xcc\\xad\\x64\\x96\\xac\\x64\\x9e\\xaa\\x64\\x95\\x74\\xd4\\x5e\\x2b\\x88\\x3d\\x9a\\x18\\xb1\\x47\\xff\\x7c\\x1c\\x80\\xd1\\x0f\\x7f\\x2c\\xc0\\x28\\x2b\\x7a\\x86\\x11\\x60\\xb4\\x8a\\xe5\\x8e\\x40\\x9e\\x15\\x73\\x79\\x7f\\xa3\\xc5\\x7f\\x15\\x02\\x2a\\x65\\x47\\xf8\\xd0\\x02\\x95\\x56\\x2a\\x50\\x69\\x74\\x3f\\xc7\\xf7\\x74\\x5c\\x8e\\xa7\\xb8\\xbc\\x8f\\xdd\\xe1\\xcb\\x80\\x69\\x83\\xf3\\xfb\\x95\\x12\\x2b\\xa0\\xc8\\x34\\x4d\\x33\\xa7\\x49\\x99\\x96\\xac\\x41\\x7d\\xf3\\xb4\\x18\\x5d\\xe8\\xaf\\xee\\xeb\\x42\\x5f\\x42\\x75\\xbd\\x8b\\x21\\x62\\x8b\\x08\\x37\\x36\\x10\\xbf\\x8e\\x9d\\x21\\xfc\\xa4\\x2e\\xf6\\x47\\xfc\\xc7\\x31\\xf5\\x83\\xc6\\xa0\\x64\\x13\\xfc\\x75\\x4c\\x7f\\x86\\x88\\x2a\\xab\\xd3\\x9f\\x53\\xfc\\xc9\\x52\\x6f\\xf0\\xe7\\x33\\xfa\\x13\\xcd\\xb0\\xb7\\xcf\\xe9\\xcf\\xb9\\x04\\x31\\x5b\\x3d\\x3a\\xaa\\x4c\\xef\\x7a\\x3b\\x17\\x55\\x76\\x9b\\x2e\\x76\\x5b\\x10\\x55\\x76\\x91\\x2e\\x7a\\x41\\x8b\\xd2\\x9b\\xe0\\x72\\x93\\x85\\x6e\\x7a\\x93\\x2e\\xfb\\xa6\\x00\\xc0\\xeb\\x6d\\xba\\xd8\\x5b\\x1e\\xd6\\xd5\\x5f\\xce\\xd9\\x51\\x6b\\x2a\\x7b\\x99\\x2e\\x7b\\x19\\x97\\x7d\\x9d\\x39\\x4b\\xaf\\xd3\\x65\\x5f\\xc7\\x65\\x11\\x0e\\x8b\\x5f\\xdc\\x18\\x8d\\xf6\\x55\\xba\\xf8\\xab\\x74\\x71\\x63\\x54\\xda\\x97\\xe9\\xe2\\x2f\\x69\\x71\\xb6\\xa2\\xdf\\xc3\\x06\\xc0\\xf2\\xaf\\xfb\\xe6\\xf9\\xfe\\x94\\xae\\xe2\\x93\\x54\\xc5\\x0f\\x14\\x45\\x94\\x53\\xc7\\xe7\\x74\\x1d\\x9f\\x0b\\xa1\\xeb\\x56\\x8f\\x88\\xae\\x5b\\xdd\\x0f\\x5d\\xb7\\xfa\\x13\\xd0\\x75\\x9a\\x36\\x0b\\xa0\\xeb\\x74\\x71\\x1f\\xcc\\xe8\\x3a\\xfa\\x8a\\xac\\xf3\\xd0\\x75\\x3c\\x03\\x59\\x17\\x40\\xd7\\x89\\x3c\\x64\\x9d\\x89\\xae\\x5b\\x17\\x45\\xd7\\xbd\\x4f\\x0f\\xe8\\x3d\\x73\\x4a\\x90\\x05\\x94\\x3b\\x4f\\x7f\\x9d\\x73\\x2d\\x50\\x6e\\xc1\\x85\\x6f\\xe7\\x99\\xa6\\xf4\\xa7\\xe9\\x4e\\x9c\\x3a\\x2e\\x19\\x50\\x53\\x7a\\xa0\\x2b\\xe9\\x9f\\x11\\xfb\\x33\\xce\\xb5\\xaf\\x3f\\x4b\\xd7\\x76\\x46\\x6b\\xdb\\xb2\\xda\\xb6\\xac\\xb6\\x2d\\xab\\x8d\\x19\\xdd\\x67\\xc1\\xdd\\x06\\x85\\xe1\\x6e\\xbf\\xf4\\x17\\xbd\\x97\\x78\\x88\\x14\\x06\\xbc\\x85\\x31\\x2a\\x38\\x81\\xe4\\x0a\\x25\\xc0\\xdb\\x26\\x07\\xf0\\xf6\\xf6\\x7f\\x18\\xe0\\xed\\x12\\x66\\x64\\x12\\x03\\xde\\x26\\x42\\xc6\\xb1\\xb6\\xc9\\x0f\\x5c\\xf4\\x31\\xd1\\xe1\\xbc\\xd6\\xf9\\x78\\x37\\x5f\\xc6\\xbb\\xb5\\x9d\\xd7\\x7f\\x3a\\xc8\\xad\\x8d\\x7e\\xa0\\x14\\x90\\xdb\\x4b\\x8c\\xf0\\xeb\\x4c\\x54\\x90\\x5b\\x34\\x07\\x8c\\xb9\\x70\\x1d\\xed\\x04\\x48\\xb9\\xa8\\xb2\\x3c\\x32\\xaa\\xc3\\xc1\\x57\\x68\\x07\\xbe\\x77\\xea\\x36\\x10\\x1b\\x09\\x18\\x9c\\xcb\\x61\\x70\\x13\\x58\\xe8\\x97\\x96\\xc0\\x81\\x7d\\x2c\\x8c\\xa5\\x0a\\x8b\\x06\\xb5\\x53\\xb8\\x1c\\x4f\\x41\\x89\\x79\\x14\\x30\\x45\\x01\\x56\\x1e\\x03\\x58\\x71\\x01\\xb5\\x67\\x02\\x4f\\xc9\\x9e\\x95\\xba\\x94\\x0a\\xc7\\x94\\x13\\xc7\\xa5\\xe0\\xa9\\x38\\xe5\\x7b\\xc7\\x8d\\xc1\\x53\\x26\\x84\\xd1\\x6d\\x64\\xa6\\x4a\\x4c\\xe3\\xce\\x47\\x32\\xdd\\xc6\\xa1\\x69\\x4d\\x95\\x18\\x63\\x64\\xa6\\x2a\\x41\\xd7\\x1c\\xf8\\x21\\x5e\\xe5\\xe2\\x4d\\x5e\\x09\\x73\\x67\\x03\\xde\\x64\\x4e\\x5e\\x91\\xa9\\x4d\\xde\\x18\\x35\\x4c\\x0b\\x9a\\xa1\\xb2\\x24\\x6f\\x9d\\x65\\xe5\\x86\\x22\\x4d\\x6e\\x72\\x90\\x26\\xaf\\x72\\x7a\\xaf\\x45\\x9a\\x9c\\x0a\\xa4\\xc9\\x05\\x1c\\x60\\x69\\xa4\\xc9\\x39\\x4a\\xc9\\x63\\xa4\\xc9\\x69\\xcc\\x9f\\x86\\x05\\x91\\x26\\x67\\x6c\\xc3\\xbf\\x6b\\x9e\\x09\\xa4\\xc9\\x3b\\x94\\xd2\\x9d\\xda\\x67\\x57\\xef\\xae\\x9d\\x53\\xf8\\x27\\x85\\x34\\xc1\\xc4\\x18\\x69\\x82\\x4f\\x0c\\x69\\x12\\x1e\\x1d\\x85\\x11\\xd2\\x24\\x63\\x81\\xdf\\x03\\x69\\xf2\\x0a\\x91\\x26\\xaf\\x8a\\x38\\xb6\\xe8\\xca\\x8e\\x2d\\xba\\x31\\xce\\x23\\x70\\x7a\\xf1\\x9b\\x0e\\x3c\\x28\\xa0\\x8f\\xf7\\xce\\xab\\x4c\\x24\\x82\\x7a\\x11\\x45\\xf2\\xe4\\x10\\xf1\\x7c\\xce\\xfb\\x7b\\xc2\\x11\\x52\\x95\\xca\\xa8\\x84\\x8f\\x50\\xad\\x8c\\x49\\xf8\\xb0\\x27\\x24\\xe1\\x93\\x93\\x53\\x42\\x00\\x12\\x3e\\x15\\x57\\xbf\\xe7\\x64\\xdd\\x16\\xcf\\x9a\\x04\\x0d\\x7c\\xce\\xeb\\x6d\\x0c\\x19\\xf8\\x5c\\xbc\\xbf\\x39\\x59\\xb7\\xc5\\xb3\\xca\\x3a\\xfd\\x9c\\xac\\x69\\x95\\x7e\\x91\\x1e\\x0b\\x8d\\xfe\\x0a\\x8d\\xcc\\xb9\\xce\\xf5\\x75\\xf2\\x4c\\xd4\\xe8\\xe9\\xc3\\x58\\x4b\\x38\\x65\\x3a\\xf3\\xb1\\xac\\x33\\xa7\\x69\\x52\\x52\\x81\\x13\\x2d\\xb3\\xd1\\x5c\\xbf\\x1d\\x53\\xc9\\x6f\\xc7\\xfb\\x1c\\xed\\xd3\\x34\\xd6\\x96\\xc7\\xc5\\x48\\x37\\x1a\\xbd\\xe8\\xf5\\x1b\\xa1\\x71\\x4e\\x9e\\x69\\x3a\\x8d\\xf3\\xac\\x88\\xc6\\x39\\x4c\\xf8\\xbe\\x40\\x37\\x0b\\xdc\\x81\\x61\\x37\\xfa\\x05\\x07\\x6b\\xb2\\x27\\x6f\\x1f\\xbf\\x27\\x1f\\xef\\xab\\x53\\x7e\\x03\\x93\\xc8\\x75\\xca\\x37\\xb1\\x4e\\x99\\x4b\\x56\\xb5\\xb5\\x7e\\x23\\x69\\x42\\x49\\x40\\xe9\\x4a\\xfb\\x67\\xec\\x40\\xa6\\x9f\\x74\\xf6\\xd1\\x8f\\x14\\xaf\\xfd\\x2c\\xed\\xf4\\x6b\\xaa\\x9d\\x0e\\x15\\xed\\xf4\\x1b\\x54\\xc2\\x0e\\x92\\xf8\\xec\\x41\\x54\\xe1\\x20\\x0b\\xf8\\xfb\\x06\\x81\\xbf\\x6a\\x7d\\xaf\\xb1\\xbe\\x22\\x04\\x4b\\xde\\x8c\\xbf\\x61\\xeb\\x75\\x92\\x52\\x5a\\x4a\\x77\\xfe\\x4b\\x66\\x4a\\x7e\\x74\\x24\\x91\\xe4\\xf4\\x93\\xfc\\x90\\xf8\\x24\\x05\\x15\\x98\\x6b\\x89\\xb8\\x47\\x05\\xe6\\x17\\xe7\\x07\\xad\\xfa\\xf2\\xcb\\x03\\x6a\\x2f\\xdf\\x42\\x33\\x0f\\xa9\\xbc\\x7c\\xcb\\x66\\xe0\\xc7\\xc4\\x0c\\xa4\\x55\\x97\\x13\\xbb\\xf9\\x63\\xae\\xe6\\x12\\x7a\\xf7\\xe3\\x7e\\x8a\\xcb\\x8d\\x4d\\x5e\\xa2\\x6a\\x2e\\x19\\xd8\\x7d\\x18\\x2d\\xa9\\xe1\\xbe\\x6b\\xf4\\x6d\\x7a\\x4d\\xdd\\x17\\x40\\x91\\x06\\xd1\\xab\\xbb\\xac\\x50\\x2b\\x31\\x44\\x64\\x94\\x44\\xe0\\x8f\\xa2\\x51\\x8e\\xb2\\x36\\xce\\x5b\\xc3\\xc6\\x29\\xda\\x99\\x6d\\xaa\\x33\\xa3\\xc7\\x9b\\xa1\\xf1\\xfd\\xf4\\xd0\\xa7\\x91\\x1e\\x7a\\xab\\xe8\\xa1\\x4f\\x13\\x0a\\xdf\\xed\\xb7\\xe9\\xa1\\xc3\\xfd\\xd5\\xd0\\x09\\x9f\\x0e\\x09\\x5d\\x73\\x4a\\xa7\\xdc\\x4b\\xa5\\xf4\\x53\\x5a\\xdd\\x41\\x2a\\x65\\x98\\x4a\\x19\\xa5\\x52\\xc6\\x1a\\x5d\\xf0\\x24\\xa9\\x0b\\x0e\\x75\\xba\\xe0\\x69\\x21\\x5d\\xf0\\x4d\\x11\\x5d\\xf0\\xcc\\xa4\\xc9\\x9d\\x33\\xcd\\xea\\x82\\xfd\\x59\\xa2\\x0e\\x77\\x85\\xda\\xdc\\x28\\xa4\\x35\\xfd\\xb3\\xdd\\x5f\\x91\\x7b\\x4b\\xbd\\xe3\\x9e\\xa6\\x54\\xb9\\x67\\xb4\\xc6\\x66\\x57\\xd1\\xd3\\xca\\x2a\\x29\\x20\\x24\\x92\\x3a\\xdb\\x7e\\xae\\xba\\x75\\x90\\x54\\xb7\\x0e\\x73\\x8b\\x8c\\x92\\x45\\xc2\\x42\\xca\\xb0\\xc1\\xfd\\x7d\\x46\\xf4\\x8d\\x7a\\xdb\\xf3\\xc7\\xd1\\xdb\\x5e\\xfc\\xb1\\x7a\\xdb\\xee\\x7d\\x34\\x9a\\x61\\x31\\x7d\\x6b\\x56\\xdd\\x06\\xc5\\x62\\x68\\x74\\x0c\\xb1\\x8d\\x75\\x7d\\xe3\\x48\\xd7\\xd7\\x8d\\x75\\x7d\\xb1\\x8f\\x88\\x7e\\xe4\\x23\\x62\\x10\\xab\\xf8\\x86\\xb1\\x5e\\x6f\\x24\\x69\\xf0\\xc2\\x47\\xd7\\xe0\\xe9\\x0d\\xa8\\x73\\x35\\x78\\xfa\\x48\\xb5\\xc5\\xf4\\x5a\\x46\\x3f\\x0b\\xf9\\xda\\x3f\\xa3\\xaf\\x85\\x02\\xda\\x3f\\x63\\x2c\\xeb\\x22\\xbe\\x21\\xf4\\xc2\\xf6\\x5c\\xd5\\xa1\\xde\\xa8\\xbf\\x80\\xf6\\x2a\\x7c\\x44\\xed\\x55\\x78\\x3f\\xed\\x55\\xf8\\x27\\x68\\xaf\\x34\\x6d\\x16\\xd0\\x5e\\xe9\\xfc\\x87\\x98\\xb5\\x57\\xf4\\x15\\xb0\\xe9\\x39\\xda\\x2b\\x9e\\x81\\x4c\\x0b\\x68\\xaf\\x44\\x1e\\x32\\xcd\\xd4\\x5e\\x4d\\x0b\\xc5\\x88\\x4a\\x7a\\x51\\xf0\\xa8\\x17\\x05\\x8d\\x12\\x6a\\xcc\\xb9\\xe0\\x99\\x5d\\xcc\\x51\\x77\\x57\\x89\\x16\\x90\\xfc\\x96\\xe8\\x61\\x5c\\xc9\\xe0\\x46\\xd7\\x68\\x94\\x80\\xca\\xae\\x1f\\xa3\\xfb\\xc7\\x18\\x65\\xac\\x2a\\x65\\xd2\\xb5\\xa3\\x66\\x60\\xaa\\x30\\x25\\x01\\xd5\\x60\\xf9\\xed\\x0c\\xaa\\xdb\\xec\\x76\\xd4\\x0c\\x4c\\x3b\\x96\\x6c\\x27\\x4f\\x91\\xa8\\x87\\x2e\\x20\\x76\\x27\\x16\\x1c\\xa3\\x97\\xb3\\xf8\\x29\\x4b\\x23\\x48\\x65\\xfb\\xba\\x89\\xdf\\xb0\\xe9\\xce\\xd3\\x01\\x76\\x11\\x95\\xa3\\x2b\\xbf\\x65\\xe5\\xf3\\xb5\\x7e\\xdd\\x42\\x5a\\xbf\\x31\\x9c\\x8f\\xfd\\x33\\x77\\x56\\x44\\xd7\\x77\\x11\\x1f\\x9a\\x91\\x5b\\xec\\x0b\\x7d\\x3c\\xb1\\x0b\\x67\\x58\\x19\\xb0\\x78\\x62\\x03\\xbe\\xbd\\x2e\\x9d\\x11\\xfc\\x46\\xc1\\xfd\\x40\\x6c\\xa2\\x97\\xb9\\x7a\\x83\\x97\\x76\\x13\\x98\\x79\\x2f\\xf6\\xe3\\xb6\\x76\\x22\\xb3\\x00\\x0f\\xad\\x05\\xb4\\xe6\\x76\\x92\\xb1\\x9d\\x5b\\xdd\\xc0\\x24\\xd7\\x84\\x27\\x3b\\x01\\x7e\\x22\\xc8\\xb3\\x36\\xaa\\xb5\\x3a\\x5a\\xdf\\x01\\x5f\\xbf\\x80\\xaa\\x3d\\xec\\xcd\\xc8\\xdd\\x22\\x89\\x00\\x04\\xa8\\x3f\\x04\\x1e\\x3f\\xec\\x74\\x70\\x9c\\x4b\\x8e\\x7d\\x9a\\x67\\x49\\xd7\\x69\\x50\\x8d\\x1b\\xdb\\x3a\\x8c\\xbb\\xbb\\x6e\\xad\\x1b\\x68\\xa4\\xe7\\xe9\\xe8\\x24\\x2f\\x42\\x68\\xcd\\xd3\\xaf\\x7d\\x8c\\x7e\\xc7\\x81\\x5a\\xc0\\xbd\\x70\\x5b\\x1e\\x1a\\x59\\x6a\\x47\\xbb\\x6b\\x1e\\x3d\\x11\\x3e\\x10\\x1d\\x8c\\x20\\x59\\x6b\\x7a\\xa9\\xd9\\x11\\x11\\xe0\\xb9\\x4b\\x42\\x60\\xc8\\xbc\\x2a\\x4e\\x88\\xe2\\xe3\\x12\\x7b\\xbd\\xfd\\xbe\\xd6\\xc2\\xdf\\x75\\x8c\\x01\\x51\\x71\\x58\\x2e\\xbb\\xc1\\x92\\xd8\\x53\\xb9\\x4d\\xda\\x65\\xf1\\x66\\x27\\x68\\xd4\\x57\\xe8\\xcf\\x33\\x68\\x5d\\x5d\\x37\\xd2\\xad\\xef\\x61\\x2a\\x39\\x15\\xa6\\x92\\x37\\xfc\\x47\\x0d\\xbe\\xe0\\xb6\\x46\\xb6\\x75\\xfc\\x5b\\x67\\xa6\\x93\\xe3\\xc8\\x56\\xf2\\xee\\x2e\\x32\\x92\\x7c\\x95\\x61\\xa2\\x19\\x5b\\x47\\x9e\\xb9\\x93\\x36\\x7c\\xd3\\xbb\\xbb\\xab\\x1a\\xb9\\xb8\\x26\\xb7\\x92\\x1f\\x81\\x80\\x56\\x96\\xb4\\xbd\\x34\\x57\\x8b\\x67\\xff\\xf6\\xa4\\x86\\xff\\xb2\\xce\\x95\\xe1\\x1f\\xfc\\xf1\\x1f\\xe8\\x40\\x93\\x19\\x6c\\xce\\xec\\xc8\\x2c\\xb3\\x0b\\x6d\\x5e\\x12\\xf4\\x4f\\x30\\x96\\xbd\\x88\\xa2\\xdb\\x53\\xd9\\x7d\\xe8\\xd1\\x51\\xf4\\xa8\\xe4\\x6b\\x5d\\x29\\x8f\\x15\\x58\\xc9\\x4f\\x94\\x14\\xa2\\x54\\x53\\x4e\\xbc\\xaf\\x5f\\x5f\\x37\\xae\\x2a\\x75\\x82\\xfe\\x49\\x27\\x89\\xf6\\x27\\x6a\\xfb\\xd1\\xe3\\x44\\x6d\\x5f\\x79\\xa4\\xf5\\x2b\\x29\\x44\\xa9\\xa6\\x92\\x78\\x2f\\xb7\\xdf\\x73\\x7a\\x77\\x77\\x63\\xe0\\xa0\\xfb\\x77\\x77\\x13\\xae\\x25\\x7c\\x69\\x54\\x0e\\xd1\\xf3\\xca\\x93\\x6c\\x54\\x31\\x32\\xe0\\x1b\\xe7\\xf5\\x3d\\x54\\x42\\x71\\x55\\xe4\\xad\\xf3\\x26\\x19\\x1d\\xf0\\x9d\\x94\\xd4\\xa5\\x58\\xe3\\xd7\\x8a\\x7e\\xe8\\x5d\\xc1\\xe8\\x80\\xaf\\x73\\x84\\xf2\\x83\\x58\\x28\\x3f\\x88\\x85\\xf2\\x6f\\xf7\\x8b\\xd7\\x17\\xa6\\x42\\xf5\\xbd\\x36\\x86\\xea\\x0b\\x0d\\x51\\xfa\\x2e\\x92\\x92\\xbe\\xcb\\x58\\xa3\\x20\\x85\\xd9\\x9b\\xeb\\xc3\\xec\\x85\\x4a\\x84\\xbd\\x0f\\xd2\\x64\\x3d\\x58\\x84\\x3d\\x89\\x39\\xf6\\x76\\xa8\\xa0\\xbb\\x6f\\x7c\\x3d\\x4d\\x90\\x3c\\xda\\xeb\\x8f\\xce\\x99\\x2c\\x6c\\xfb\\xa0\\x89\\x1d\\x86\\x13\\xc7\\x8d\\xe0\\x60\\x92\\x4b\\x62\\x09\\x5d\\x42\\xc6\\x12\\xf3\\x34\\x32\\xee\\x53\\x4c\\x31\\xd9\\xda\\x92\\x4c\\x56\\x33\\xb4\\xbe\\x45\\x4f\\x8c\\x5a\\xa3\\x66\\xdf\\xdd\\xd5\\x76\\xc9\\xc9\\xaf\\x49\\xe6\\xfc\\x1f\\x81\\xf2\\x86\\x7b\\xe9\\xe8\\x88\\xff\\x48\\x9c\\x96\\x2c\\xa2\\xb0\\xf7\\xc4\\xda\\x3e\\xb5\\xce\\xcb\\x75\\xdb\\xae\\x78\\x82\\xc9\\xf6\\xa9\\x89\\x45\\x6e\\xb0\\xbf\\x68\\xc1\\x3e\\x76\\x6c\\xbf\\xd5\\x3e\\xb1\\xfd\\x44\\x66\\xf4\\xfe\\xb0\\x5f\\xe4\\xbe\\xea\\xdf\\x5e\\xc4\\x4a\\x59\\xd3\\xd7\\x33\\x2e\\x3a\\x20\\x38\\xa2\\x2b\\xbc\\xb5\\xae\\x26\\x1c\\xe4\\xec\\x50\\x83\\x9b\\x08\\xa8\\x88\\x29\\x89\\xb5\\xa8\\x93\\xdb\\x6b\\x47\\xc9\\x6e\\x36\\xb8\\x67\\xb9\\xd5\\xf3\\xc1\\x24\\xe8\\xba\\xd4\\x3f\\x7d\\x43\\xa4\\x30\\x59\\x07\\xa4\\xec\\x24\\x91\\xbf\\x7c\\xdf\\x4b\\x51\\xbf\\x16\\x88\\xd6\\x81\\xa3\\x3e\\xba\\xde\\x2c\\xfb\\xa9\\x17\\xeb\\xfd\\xbf\\x6d\\x45\\x2a\\xe7\\x85\\xda\\x06\\x94\\xad\\x37\\xbc\\x08\\x57\\x70\\x8f\\x18\\xe8\\x63\\x8b\\xdd\\xf6\\x36\\x33\\x8c\\xa3\\xf3\\x6c\\x5c\\x51\\x12\\xae\\x66\\x45\\x67\\x20\\x6f\\x55\\xe9\\x0b\\xa0\\x74\\x68\\xac\\x09\\x3b\\x45\\xfb\\x98\\x84\\x4e\\x25\\xf7\\xc2\\x21\\x0d\\x60\\x9a\\x14\\x5c\\x59\\x5f\\x71\\x5d\\x35\\x5c\\xe0\\xd3\\xd0\\x9f\\xb2\\xc7\\x59\\xc0\\x14\\x0e\\x4b\\x1a\\x19\\x25\\x9b\\xa4\\xbe\\x28\\xee\\x92\\x8b\\x75\\xa5\\x9e\\xea\\xca\\x72\\xf1\\xed\\x3d\\x49\\xb8\\xa4\\xa7\\x5d\\x51\\x9b\\xa1\\xeb\\xff\\x5b\\xda\\xf1\\x13\\xfe\\xbb\\xd5\\x36\\x98\\x7f\\xe9\\x7b\\xd5\\x4f\\x22\\x0c\\xff\\x1c\\x6e\\xd5\\xcf\\x33\\x38\\x1c\\xba\\x8c\\x71\\x13\\x4d\\xb7\\xa3\\x38\\xe7\\x86\\xd6\\x2f\\xbc\\xd1\\x63\\x75\\x00\\xf1\\x1a\\x8f\\x73\\x34\\x7c\\xd3\\x96\\x23\\x1b\\xe0\\x83\\xfc\\xbb\\x3b\\x0b\\xee\\x13\\x95\\xd0\\x8d\\xc4\\xc6\\x35\\x54\\x9a\\x67\\xed\\xcc\\xf8\\x2c\\x82\\x09\\x98\\x75\\x3d\\x6b\\xc3\\xda\\x80\\xf3\\x76\\x36\\x84\\xfd\\xe1\\x9b\\x55\\xf9\\x5e\\x8e\\xf2\\xde\\x07\\x6a\\x6f\\x67\\x5f\\xb5\\xaf\\x6d\\xa0\\x94\\xbe\\x00\\x83\\x3a\\xe9\\x5a\\x79\\xfb\\xfe\\x8f\\xef\\x8e\\x40\\xd8\\x7c\\x4a\\xc5\\x7b\\x3c\\x8b\\x29\\x06\\x89\\x5a\\x40\\xd5\\x07\\x52\\x0b\\xa9\\xbb\\x3d\\x3e\\xb2\\xfc\\x27\\xdb\\xa7\\x32\\xc3\\x27\\xce\\xf3\\xe6\\xa2\\xf5\\x39\\xf3\\x4c\\x47\\xf9\\xf8\\xb6\\x6e\\xa7\\x0e\\x73\\x4d\\x56\\xd6\\x1f\\x77\\x13\\x63\\x32\\x69\\x61\\x64\\x63\\x6a\\x76\\x85\\xfe\\xae\\xc1\\xa7\\x97\\x2a\\xdb\\xa8\\x21\\xf5\\x58\\x35\\xf1\\xc5\\xa1\\xbb\\x27\\xec\\xc6\\x67\\xdd\\x15\\x26\\x11\\x13\\x8c\\xfc\\xc8\\xbb\\xc1\\xb4\\x77\\x50\\x74\\xfd\\xe8\\xa6\\x44\\xb7\\xaf\\x50\\x83\\xd4\\xc0\\x7f\\x60\\x78\\x2c\\xd1\\xfe\\xbe\\x4e\\x53\\x2b\\xf5\\x46\\x94\\xa4\\xbb\\x0c\\xb5\\xf5\\xea\\x66\\x90\\xd7\\x51\\xc1\\x4a\\x71\\xf2\\x68\\x65\\xd4\\x23\\x12\\x8f\\xa2\\xd9\\x07\\x86\\x8b\\xff\\xf4\\x28\\x2a\\x54\\xfa\\xce\\xb0\\x19\\xcf\\x9d\\xf4\\x77\\xc7\\xf3\\xe3\\x4c\\x76\\x3b\\x2f\\x16\\x95\\xc9\\xeb\\xbc\\x64\\x30\\x9b\\x17\\x68\\x73\\x48\\x03\\x6d\\x8e\\x68\\xa0\\xcd\\x31\\x15\\xcf\\xa0\\x3a\\xbb\\x1a\\xce\\xda\\xe8\\x43\\x24\\xd2\\x46\\xd2\\x44\\x16\\xdb\\x92\\x2a\\x24\\x25\\x27\\x7b\\xf5\\xe0\\xf9\\x13\\xfa\\x08\\x9f\\x06\\x18\\x3e\\x0c\\x7f\\x30\\x35\\x9a\\x93\\xde\\x18\\xcd\\x49\\x67\\x0e\\x72\\x91\\x73\\x54\\x2f\\x2e\\xd0\\x6c\\x74\\xe9\\x94\\x6e\\x83\\x59\\x58\\xa2\\x96\\xb0\\x5a\\xed\\xe4\\x1a\\xb3\\x45\\x3a\\x48\\x1c\\xc0\\xad\\x53\\xad\\x93\\x53\\x55\\x1d\\xc9\\x62\\x59\\xa8\\x11\\x37\\x13\\x8f\\xe2\\xdc\\x2f\\x1a\\x92\\x33\\x1d\\xc5\\x45\\xf1\\x50\\x7f\\xa6\\xf5\\xf1\\x7e\\x0a\\x7b\\x9e\\x9c\\x3b\\x35\\x41\\xaa\\x4b\\x1a\\xa7\\xd3\\x47\\xd7\\x0d\\xe9\\x43\\xff\\xe5\\xea\\x86\\xf4\\x81\\xff\\xb2\\xc4\\xa0\\x46\\x87\\xdf\\x46\\xc1\\xa7\\xd1\\xd1\\x37\\x03\\x93\\xee\\xed\\x05\\x7d\\x9b\\x59\\xcc\\xe8\\x05\\x7d\\xc3\\xc2\\xa8\\x9a\\xca\\xb5\\xd3\\xe5\\xda\\xac\\xb9\\xec\\x72\\x41\\xba\\x5c\\xc0\\xda\\xfb\\x01\\x0f\\xb2\\x7d\\x22\\x61\\xb2\\xe6\\x32\\x8b\\x19\\x63\\x8b\\x02\\x7d\\xe0\\x07\\x46\\x03\\x31\\xbd\\x77\\x67\\x54\\xe3\\xa1\\x54\\xd4\\x1c\\x5b\\xd4\\xa8\\x3a\\xa4\\xe5\\x3e\\x51\\x51\\xea\\xde\\xaa\\xc3\\xbc\\xd8\\xa2\\x46\\x35\\xa7\\xd0\\x40\\x9b\\x0a\\xfa\\xe9\\x82\\x3e\\x8b\\x84\\xba\\xbf\\xe3\\xfb\\x5e\\xbf\\x1d\\x64\\x19\\x0b\\x1a\\x35\\x94\\x94\\xeb\\xfe\\x82\\x7c\\xeb\\xa4\\xbb\\xb7\\x4d\\x65\\xb6\\xae\\x2c\\x19\\x68\\x93\\xaa\\x49\\x8c\\xba\\x32\\xfa\\x8a\\x0c\\xf2\\x74\\x65\\x42\\x98\\x3f\\x28\\xa0\\x2b\\x8b\\xc4\\xfc\\x83\\x4c\\x5d\\xd9\\xa0\\xa8\\xa5\\x97\\xde\\x24\\x95\\x08\\x5d\\xc4\\x36\\xd7\\x3b\\x7a\\x52\\xc7\\xec\\x51\\x1d\\x73\\x5a\\xdf\\x86\\x5a\\x67\\x77\\x76\\x9e\\x55\\x55\\x52\\xfd\\xeb\\xa1\\xfa\\xd7\\x6b\\x69\\x2a\\x6b\\xe0\\x7d\\x94\\xd0\\xd4\\xe4\\x6a\\x63\\xee\\x11\\xa9\\xf4\\x42\\x52\\xc9\\xc4\\x91\\x4a\\x67\\x47\\x47\\x17\\x52\\xa4\\xd2\\xb9\\xf4\\x68\\x8e\\x54\\x7a\\x9b\\xab\\x96\\xb9\\x65\\x34\\xee\\x85\\xc9\\x9c\\x63\\x44\\x6e\\x31\\x44\\xa9\\xc6\\xdc\\x83\\x83\\x9f\\xc7\\x34\\x43\\x56\\x88\\xd2\\xf3\\xd6\\x6d\\x14\\xa2\\xf4\\xd6\\x60\\xc9\\x71\\x9e\\x65\\xc9\\xb1\\x11\\x96\\x1c\\xaf\\xb4\\x21\\x4a\\x5f\\xaa\\x21\\x4a\\x37\\xfb\\x87\\x28\\xdd\\xb2\\xd9\\x7a\\xd3\\xdc\\x0a\\x4b\\x8e\\x37\\x88\\x73\\xdb\\xd8\\xdb\\xab\\x37\\xd7\\xce\\x06\\xfe\\x49\\x59\\x72\\x60\\x62\\x6c\\xc9\\x81\\x4f\\x8f\\x1e\\xa2\\xf4\\x16\\x2d\\x39\\x6e\\xbf\\x35\\x44\\xe9\\x5b\\xe7\\x36\\x5b\\x24\\x0f\\x8b\\x16\\xcd\\x2b\\x18\\xc8\\x43\\x89\\x55\\xfa\\xce\\x79\\x7b\\x5f\\xe1\\x7c\\xb2\\x52\\x55\\x1e\\xff\\x56\\x91\\xc7\\xc3\\x3c\\xe6\\x88\\xe4\\x65\\x4b\\x85\\x9c\\xac\\xdb\\xe2\\x59\\x25\\x47\\x85\\x39\\x39\\x95\\x90\\xa4\\x39\\x79\\x71\\x2d\\xcf\\xc2\\x91\\xa8\\xf9\\x46\\x8a\\x2d\\x7a\\x51\\x39\\xb3\\x28\\xd8\\xff\\x81\\xe3\\x8b\\xe6\\x6d\\xd6\\xcc\\x26\\x73\\xe2\\x7b\\x5a\\x36\\xf3\\xed\\x27\\x47\\x19\\x0d\\xd9\\xf6\\xf9\\xe0\\x5c\\x51\\xe3\\xba\\x69\\x95\\xde\\x85\\x41\\xfb\\xee\\xae\\xf4\\x8a\\xfd\\x2a\\xc5\\x77\\x78\\x50\\xe5\\xb4\\x07\\x2a\\xc5\\x79\\x7e\\x9e\\x02\\xf9\\xbf\\xb0\\x5f\\x52\\xfe\\x43\\xb9\\xc0\\x75\\x33\\x8a\\x29\\x8a\\x46\\x06\\x0c\\x4b\\x71\\x55\\xfa\\xcb\\xf3\\xe7\\xcf\\xa1\\x57\\xf2\\x9f\\xeb\\xe4\\x20\\xd5\\xef\\xc0\\x67\\xf6\\xc3\\x5e\\xf1\\x54\\x85\\xbd\\xdd\\xee\\xed\\xbd\\xc2\\xaa\\x2e\\x8e\\x8e\\xde\\xdf\\x33\\xac\\xea\\x85\\x70\\x31\\x16\\x44\\xe7\\x56\\x2a\\x9c\\xa9\\x74\\xb2\\x48\\x96\\x06\\x62\\xa9\\x45\\x86\\x18\\xaf\\xf7\\x09\\x87\\x3a\\xb9\\x77\\x38\\x54\\xd9\\x08\\x4b\\xeb\\x6b\\xb0\\x78\\x34\\x54\\x38\\x0f\\x3e\\x46\\x01\\x51\\x67\\x18\\x39\\xfe\\x7e\\xf1\\x50\\x2f\\x34\\xf1\\x50\\x29\\x32\\xfb\\xfd\\x03\\xc6\\x43\\x35\\xd7\\xc5\\xe3\\xa1\\x72\\x6d\\x86\\x21\\xdf\\xc1\\xc9\\x41\\x37\\x65\\xc1\\x80\\x33\\xf0\\x49\\x4e\\x43\\x76\\x9d\\x1c\\xa8\\xae\\x30\\x25\\x55\\x0a\\x59\\xb1\\x0d\\xf9\\xd9\\xc9\\x95\\x1b\\xba\\x74\\x91\\x7a\\xd8\\xf7\\x1d\\xf9\\xa7\\xf3\\x82\\xfc\\xe0\\xd4\\xff\\xd6\\x54\\x1a\\x33\\x59\\xd1\\x18\\x64\\xf2\\x9f\\x61\\x62\\xfc\\xff\\x3c\\x76\\x9c\\x5a\\xeb\\x9f\\x8d\\x1f\\x04\\x8a\\xe0\\x4b\\x4c\\x88\\x44\\x37\\x57\\x3c\\x68\\x71\\x07\\x1d\\x74\\xe1\\x3f\\xd6\\x1e\\x8a\\x4a\\xd8\\x85\\xd8\\x7c\\x9f\\x5d\\x10\\x7f\\x7c\\x70\\x37\\x1f\\x30\\xa6\\x78\\x81\\xae\\x2a\\x1d\\x45\\xf2\\xc4\\xbb\\xbb\\xfb\\xf2\\x9f\\xc7\\x87\\xd8\\xe1\\x1f\\x1a\\xff\\x44\\x79\\xf6\\xf2\\xe8\\xe8\\x53\\x66\\xf4\\x04\\xef\\x3f\\xe3\\xd0\\x04\\x83\\x94\\x50\\xe7\\x29\\x5b\\x69\\xb6\\x8d\\x75\\xee\\xec\\xe4\\x5c\\x92\\x03\\xfc\\x7c\\x9a\\x0f\\x57\\xa3\\xe6\\x2e\\xca\\xdc\\xd3\\x95\\x6a\\x1c\\x56\\x69\\x16\\x2e\\xb8\\xf7\\xd4\\x72\\xe9\\xa0\\x46\\x4f\\x08\\x51\\x2b\\x96\\xa9\\x00\\xc5\\xd2\\x0b\\x67\\x25\\xb2\\x3e\\xa9\\xb5\\x10\\xb5\\x3d\\xc3\\x30\\x3e\\xf4\\x02\\xce\\x58\\xa7\\x49\\xe2\\x20\\x3d\\xbf\\xe9\\x15\\xb7\\x9b\\x7f\\x43\\x8c\\xdf\\xd7\\xe9\\x18\\xbf\\x17\\xe9\\x6d\\xf9\\x90\\x31\\x7e\\x37\\x91\\xf9\\xc2\\xa9\\x62\\xbe\\xb0\\xc9\\x8e\\xf1\\xcb\\xee\\xc9\\x64\\x9c\\x52\\x04\\xc7\\x75\\x2c\\xc9\\xe7\\xdd\\xd7\\xf9\\xba\\x8f\\x72\\xa1\\x0f\\xce\\x87\\xfc\\x23\\x1a\\xa5\\x62\\x2e\\x65\\x29\\xe2\\x94\\x3a\\xf3\\xf8\\x0b\\x5c\\xac\\x3b\\x0f\\xa2\\x2b\\xb4\\x81\\x4f\\x07\\xd1\\xe5\\x2a\\x5d\\xa4\\x87\\x75\\xbb\\xe9\\xcd\\x02\\x77\\xd8\\xa4\\x05\\xc4\\x1d\\x2a\\x0a\\x08\\x5e\\x5f\\x2a\\x50\\xb3\\x77\\x1b\\xf1\\xe4\\x48\\x17\\x2c\\xc9\\x9a\\x8f\\x1d\\xbe\\x0e\\xbf\\xc9\\xaf\\xe0\\x3d\\x62\\x77\\x6e\\xf4\\x7e\\x05\\xf5\\x4d\\xf1\\x81\\xd0\\xc8\\x52\\x62\\x50\\x51\\x2a\\xd6\\x25\\xc6\\x1c\\x25\\x92\\x4b\\x47\\xca\\x90\\xb0\\x1e\\xb9\\xd0\\x89\\x66\\xfd\\x62\\x51\\x41\\x05\\xd9\\xfb\\x8d\\x91\\x41\\x93\\x69\\xdf\\x14\\x12\\x94\\x0a\\x54\\xa3\\x00\\xa0\\x06\\xe1\\x2b\\x0f\\x09\\xfa\\x75\\x17\\x85\\x04\\xad\\x29\\xc2\\xdb\\x43\\x6a\\x2a\\x52\\x27\\x6b\\xa7\\x46\\x36\\x29\\x3b\\x8f\\xa4\\xf7\\x41\\x45\\x62\\x5b\\x34\\x12\\xe8\\x99\\xa3\\x91\\xd8\\xb4\\xea\\x7f\\xaf\\xa1\\x5c\\xfb\\x9c\\x86\\x09\\x8d\\x3f\\x25\\x74\\x45\\xd9\\x0a\\x24\\x37\\x82\\x68\\x15\\x41\\xec\\xec\\x48\\xc3\\x02\\xb2\\x79\\x86\\x16\\xb9\\x22\\x85\\x1c\\x5d\\x24\\xc3\\xa1\\xc9\\x85\\x61\\xac\\x1d\\xf6\\xab\\x44\\xaa\\xf5\\x4e\\x89\\x06\\x59\\xda\\xd7\\xeb\\xda\\x43\\x07\\x27\\x85\\x43\\x8c\\xad\\x69\\x3a\\xd1\\xf4\\xac\\x50\\x19\\x7e\\x45\\x94\\x6d\\xa3\\x7b\\xc7\\x3a\\x79\\xf9\\xf0\\x86\\x29\\x91\\xc8\\xf1\\x12\\x4d\\x54\\x5e\\xed\\x61\\xa2\\x12\\x6f\\xea\\xcb\\xf8\\x49\\x44\\x17\\xff\\x53\\xa3\\x9b\\xe6\\xb9\\xe5\\x63\\xae\\xdc\\x31\\x35\\x15\\xd6\\xdc\\xe0\\xa5\\x6f\\xa0\\xf7\\xaf\\xf7\\xed\\xf1\\x51\\x33\\x6a\\x30\\xfa\\xd7\\x1b\\x3c\\x80\\x7f\\x3d\\xd4\\x80\\x88\\x93\\x33\\x19\\x8f\\x55\\xb0\\x64\\xd4\\xdc\\x46\\x17\\x9c\\x95\\x9e\\x17\\xce\\x26\\x11\\x91\\xf5\\x71\\x15\\x2a\\x46\\xcd\\x48\\xb6\\x42\\xc5\\xa8\\xb5\\xc8\\x37\\x98\\x31\\xea\\x49\\xb0\\xe8\\x39\\x9f\\xa3\\xbd\\x05\\xd9\\x7c\\x72\\xdf\\xbb\\x5e\\x60\\x2e\\x9d\\x19\\xc5\\x35\\x33\\xfe\\xab\\x59\\xb3\\x90\\x17\\xff\\xd5\\x2c\\xe6\\x2f\\x60\\xe3\\x63\\x74\\x66\\x98\\x6d\\xe3\\x63\\x14\\xbc\\xcf\\x82\\xf6\\xd2\\x0f\\x7e\\xa5\\x94\\xe8\\xde\\x0a\\x0d\\x46\\x7e\\x67\\xcf\\xb0\\x51\\x5f\\x00\\x6b\\xbb\\xdb\\x0d\\x66\\xd9\\xa5\\xff\\x1d\\xb7\\xf6\\xdf\\x71\\x6b\\x1f\\x20\\x6e\\x6d\\xd2\\x47\\x9e\\x4b\\x7d\\xe4\\xc9\\xc1\\x6a\\xcf\\x95\\x60\\xb5\\xe7\\x4a\\xb0\\xda\\x73\\x46\\x08\\xa3\\x4a\\xe2\\x3c\\x57\\x33\\x93\\x54\\xc3\\x7a\\x54\\x0d\\x9b\\x11\\xb7\\x76\\xb2\\x47\\xb0\\x5a\\xbd\\x5a\\x32\\x83\\x3a\\x2b\\xa0\\xff\\x09\\xaa\\x22\\x87\\x46\\xa1\\x1b\\xbd\\x63\\xa6\\x3a\\xac\\xc7\\x5a\\xda\\x8b\\x43\\x92\\x4a\\x7f\\xf1\\x7d\\xbf\\x14\\x41\\x92\\xea\\xd5\\x17\\x4f\\x3c\\x15\\x53\\xf4\\x10\\xf1\\x6c\\x05\\x6f\\xf1\\x1a\\xc6\\x7d\\x8b\\xba\\x92\\x51\\x11\\x0d\\xd3\\x58\\xa3\\x61\\x1a\\xeb\\x8d\\x7e\\xc6\\x69\\xa3\\x9f\\xb3\\xb4\\xd1\\xcf\\x65\\xae\\x76\\xe9\\x92\\xb9\\xe5\\xc9\\xb0\\xc7\\x61\\x50\\x90\\x7d\\x8c\\x72\\x1e\\xc3\\x0a\\x67\\xf5\\xc7\\x5b\\xe1\\x54\\x58\\x96\\xb4\\x31\\x8e\\xd6\\x0a\\xe7\\xe5\\x1f\\x68\\x85\\x33\\xd1\\x59\\xe1\\xbc\\xdc\\xdb\\x0a\\xe7\\x8c\\x5a\\xe1\\x84\\xd9\\x56\\x38\\xe6\\x6a\\x57\\x92\\x15\\x8e\\x30\\xc0\\xa1\\xbd\\x8c\\x8d\\x70\\xe6\\x36\\x2a\\x1f\\xb8\\x08\\x16\\xb1\\xde\\xab\\x16\\x1a\\xe3\\x84\\xb2\\xf5\\x0a\\x4c\\x38\\x1a\\x8d\\x8d\\x2b\\x56\\x28\\x1b\\xad\\x9c\\xd0\\x64\\xfb\\xba\\xd1\\xa5\\x7d\\x1d\\x0b\\xeb\\x95\\x09\\xb3\\x5e\\x49\\x01\\xa3\\x44\\xd9\\xb8\\x92\\x28\\x2a\\x5b\\x88\\xce\\x0b\\xf0\\x9f\\x6b\\xbb\\xf9\\x55\\xeb\\x43\\x2f\\xd7\\x04\\x26\\xde\\xc7\\x8a\\x31\\xcc\\x6b\\xe7\\xd5\\x37\\x18\\xc3\\xc8\\x95\\x92\\x37\\x8e\\xf5\\x3a\\x69\\x17\\xf3\\x5a\\xae\\xd4\\x8e\\x7c\\xc4\\xd1\\xc7\\xdd\\x9b\\x82\\x46\\x31\\xaf\\xee\\x63\\x14\\xc3\\x15\\x91\\xaf\\x1e\\xdd\\xb2\\x44\\xaf\\xaf\\xbc\\xa7\\x65\\x09\\x79\\x2b\\xac\\x05\\x92\\x68\\xd0\\x8b\\x18\\x0d\\xda\\x8b\\x66\\xbd\\x71\\x80\\xb9\\x0f\\xe2\\x61\\xdd\\xaf\\xd5\\x58\\xaf\\xfb\\xf6\\xbf\\x91\\xf9\\xc7\\x62\\x1f\\xf3\\x0f\\x91\\x19\\x46\\x50\\x70\\xe6\\x72\\x27\\x2d\\xcf\\x5c\\xe4\\x5d\\xa4\\x53\\x8e\\x77\\x5d\\xb6\\xad\\x88\\x64\\x15\\xf2\\x2e\\x65\\x15\\xc2\\x1c\\x1d\\xbe\\xcb\\xd8\\x8d\\x7a\\x6d\\x83\\x64\\xcf\\xa1\\xec\\x8a\\xbe\\xb5\\x12\\x06\\x1a\\xcc\\x41\\xed\\x8a\\x1a\\x7b\\x4c\\xb4\\x20\\xd8\\xf2\\x84\\x82\\xbb\\x7d\\xdb\\xa6\\x8e\\xc9\\xa0\\x83\\xef\\xf5\\xc6\\x29\\xc2\\xd1\\x6b\\x12\\xe2\\xaa\\x56\\x0b\\x6d\\xc9\\xf6\\x1d\\x3c\\x56\\xcc\\x37\\xd9\\x4e\\x9c\\xff\\xf7\\xb1\\x9d\\x38\\x7f\\x78\\xdb\\x09\\x4d\\x4f\\x1e\\xa1\\x15\\x9d\\x85\\xc6\\xf9\\x1f\\x60\\xa1\\x71\\xfe\\xa7\\x5a\\x68\\x9c\\xff\\x11\\x16\\x1a\\xc0\\x6f\\x20\\x02\\xb9\\x86\\x60\\x89\\x78\\xeb\\x4c\\xc3\\xd1\\x96\\x69\\xe2\\x60\\x0b\\x88\\x8b\\x28\\x4e\\xe4\\x7b\\x88\\x9d\\x81\\x3c\\xa4\\x20\\x4f\\x9b\\x86\\xfd\\xc9\\x42\\x3d\\x81\\x23\\x12\\x71\\x46\\x1f\\x80\\x4e\\xac\\xfe\\x3d\\xb1\\x9d\\xad\\xe3\\x27\\x89\\xad\\xd7\\x6c\\x3b\\x6d\\x61\\x9d\\xd6\\x6e\\x5c\\x55\\x22\\x6a\\xb1\\xcd\\x63\\x9d\\xb3\\xdf\\xe8\\x3c\\xba\\x6d\\x22\\x93\\x42\\xf8\\x5d\\x41\\xea\\x83\\x13\\x8a\\x1d\\xe7\\xea\\xaa\\x8d\\xa3\\xad\\x04\\xd7\\x84\\xfd\\x8a\\x7e\\xd4\\xe8\\x8f\\xba\\xf4\\x83\\x67\\xaa\\x63\\xa6\\xeb\\x66\\x24\\x46\\x36\\x52\\x7a\\x03\\x18\\xb9\\x05\\xd3\\x81\\x9f\\x95\\xfd\\x3e\\x28\\xd9\\x39\\x06\\x2b\\xd1\\xd4\\xe4\\x4e\\x87\\xe6\\xa0\\xa4\\xa8\\x7b\\x1f\\x11\\xfe\\xb5\\x46\\xc8\\x1f\\xd8\\x78\\xf1\\xe0\\x3c\\xa0\\x8e\\xc5\\xf1\\x48\\xa4\\x06\\xae\\xfc\\xc3\\x32\\x2d\\x25\\x61\\x04\\xa1\\x15\\x7f\\x5b\\x55\\x8d\\x2a\\xeb\\x47\\xb5\\xb7\\x56\\x6c\\xb3\\x83\\x1a\\xd3\\x06\\xd7\\x9f\\xca\\x96\\x77\\xa9\\x01\\xa5\\xac\\xe6\\xda\\x90\\xab\\x54\\x7d\\x76\\x1c\\x50\\x25\\x04\\x34\\xa9\\x35\\xf8\\x3c\\x15\\xb6\\x05\\x84\\xad\\x1f\\x4f\\x4c\\xc5\\x41\\x14\\x24\\xb4\\xdd\\xf2\\x1b\\xd1\\x5a\\xf1\\xcb\\x25\\xf8\\xef\\x34\\x36\\x4e\\x68\\x53\\x77\\xdf\\xe5\\x52\\x25\\x91\\x5a\\x83\\xd4\\x06\\xe4\\xfe\\xff\\xff\\x3f\\xf5\\x85\\xcd\\x62\\x84\\x15\\xbc\\x8c\\x11\\xba\\x51\\xb2\\xf5\\xd3\\xb8\\xc9\\x9b\\xbc\\xca\\x73\\xfe\\xdd\\x3c\\xfe\\xdd\\xca\\xcf\\xe1\\x6b\\x35\\xde\\x69\\x10\\x06\\x74\\x7e\\x4a\\x25\\x6a\\xba\\x84\\x5f\\x2e\\xf9\\x45\\xe3\\xf3\\x9e\\x5d\\xe6\\x95\\x11\\xca\\xce\\xd8\\x0d\\xa4\\x7e\\xe5\\xaa\\x92\\xe1\\x3e\\x9f\\x5c\\x56\\x96\\x3f\\xec\\x27\\x17\\x92\\x57\\x41\\x13\\x7d\\xcb\\x67\\xd0\\x8f\\x33\\xf7\\x9b\\xe0\\x67\\xa8\\x44\\x5f\\xa5\\xfc\\xbc\\x51\\xd1\\x7f\\x93\\x64\\xf5\\xd1\\x07\\x7a\\xf7\\xe0\\x26\\x6f\\x64\\x59\\xcc\\x5c\\xed\\xdd\\x3e\\xe6\\x6a\\xcb\\xff\\x5e\\xe6\\x6a\\x8f\\xde\\x1d\\x9b\\xac\\x5a\\xfb\\x2e\\xa7\\xfd\\x4d\\x0d\\x43\\x66\\x88\\x46\\xe9\\xd6\\x49\\x6c\\x76\\x88\\xa7\\x70\\xb4\\x38\\x75\\x64\\xa9\\x76\\xa4\\xd1\\x99\\x24\\x96\\x23\\x37\\x52\\x0b\\xb9\\x91\\x5a\\xca\\x5c\\x6b\\xa2\\xda\\xa0\\x3d\\xe4\\x70\\x7d\\xc3\\x70\\xa3\\x2b\\x88\\xfd\\x88\\x68\\xf6\\xc8\\xc2\\xad\\x20\\xd9\\xae\\x9f\\x1d\\x3d\\x91\\x9e\\x34\\x80\\xcb\\x9d\\x43\\xc5\\x58\\x4d\\x3d\\x71\\x99\\xa5\\x1f\\xe9\\xc5\\xe6\\x69\\x7d\\x27\\xe4\\x3f\\x4d\\x20\\x87\\x58\\x78\\xf0\\xe0\\x96\\x68\\xd9\\x06\\x66\\x13\\x9d\\xa5\\x5a\\xa8\\xb1\\x54\\xbb\\x9f\\x25\\x9a\\xfe\\xcd\\xe5\\x0c\\x85\\xbf\\xd4\\x4c\\x6d\\x61\\x82\\x45\\x2c\\x19\\xa2\\x81\\x43\\x1f\\xa8\\x7d\\x1a\\xfc\\xb3\\x75\\xbe\\x93\\x8d\\xd3\\x62\\xf5\\xff\\x71\\x87\\xe2\\x18\\xd0\\x22\\xf4\\xfc\\xcf\\x36\\x5b\\xd3\\xeb\\xfa\\xcf\\xc9\\x99\\xad\\x31\\x59\\x3b\\xff\\xb7\\xc9\\x9a\\x46\\x15\\x8b\\x4b\\x64\\x6f\\x55\\x68\\xb6\\x9d\\x9b\\xd1\\x60\\x2d\\xdb\\xce\\xcd\\xa8\\xf0\\xfd\\x7f\\xd9\\xce\\xcd\\xa8\\x53\\xce\\xb1\\x73\\x33\\xea\\x57\\x51\\x8b\\xfd\\x33\\x73\\x17\\xb2\\xb7\\xab\\xca\\x87\\xb7\\x56\\x33\\x82\\x0b\\x24\\x40\\xd1\\x7e\\x01\\xad\\x44\\x59\\x0e\\x8a\\xda\\x5b\\xdd\\xfe\\x6f\\x6b\\xb7\\xe2\\xd6\\x6e\\x86\\x20\\x60\\x42\\x09\\x77\\x96\\xab\\x53\\x4d\\xaa\\x3d\\x3d\\xaa\\xf6\\xbc\\x97\\xb5\\x5b\\x12\\xcb\\xe0\\x21\\x96\\xe1\\xe1\\xac\\xdd\\x62\\xb2\\xe1\\x1e\\x76\\x6f\\xe7\\x91\\x56\\xf2\\x5c\\xb5\\x7b\\x3b\\x57\\xed\\xde\\xce\\xf3\\xed\\xde\\xd6\\xb9\\x9a\\xc9\\xb5\\xf0\\xc0\\x6c\\xb4\\x7b\\x5b\\xa3\\xdd\\x9b\\xc6\\x2e\\x2e\\x32\\xa5\\x59\\x67\\xd8\\xbd\\xad\\xef\\x13\\xb1\\x68\\xa1\\x40\\x71\\x97\\xc2\\xea\\xed\\x4c\\x6b\\xf5\\x76\\xaa\\x5a\\xbd\\x2d\\xf7\\xb7\\x7a\\xe3\\x56\\x02\\x97\\xcd\\x95\\xb0\\x7a\\xbb\\x44\\x78\\xf4\\xd2\\x5e\\x5d\\x5d\\x5e\\x3b\\x4b\\xf8\\x27\\x65\\xf5\\x86\\x89\\xb1\\xd5\\x1b\\x3e\\x3d\\xba\\xd5\\xdb\\x1a\\xad\\xde\\xd6\\xdf\\x6a\\xf5\\xf6\\xd2\\x59\\xe7\\x5a\\xbd\\x25\\x16\\xaf\\x62\\xfa\\xf6\\xca\\x79\\xf9\\x0d\\xa6\\x6f\\xe9\\x9a\\x65\\xfb\\xb7\\xd8\\x49\\x5e\\x64\\xed\\xf1\\xaa\\xb8\\xfd\\x5b\\x4e\\x56\\xc9\\xfe\\x2d\\x3b\\x23\\xea\\xe1\\xdf\\x73\\xc9\\x27\\xcf\\xc7\\xa5\\xa3\\x39\\x2d\\x48\\x66\\x73\\x39\\x39\\x15\\xb3\\xb9\\x9c\\xbc\\x19\\x66\\x73\\xe7\\x95\\x2d\\x72\\x0a\\xaf\\x1f\\xda\\x6c\\x2e\\x6f\\xaf\\x67\\x36\\x99\\xad\\x05\\xdd\\x66\\x98\\xcd\\xbd\\xf9\\x23\\xcd\\xe6\\xb6\\xf9\\x66\\x73\\xaf\\xf3\\xcd\\xe6\\xde\\xdc\\xcf\\x6c\\xee\\xe5\\xbd\\xcc\\xe6\\xee\\x6b\\xf2\\x76\\x1e\\x99\\xbc\\x5d\\xfc\\x31\\x26\\x6f\\x6f\\x13\\xae\\x12\\xbf\\xcd\\xe4\\xed\\xad\\x7a\\x83\\x7c\\xb3\\xfd\\xdb\\x6f\\xd6\\xc5\\xd3\\xe3\\xe7\\x09\\x3b\\x9b\\x73\\xb4\\xb3\\x79\\x5d\\xc8\\x64\\xed\\x9d\\x63\\xce\\x97\\x30\\x57\\x7b\\x67\\xb2\\x55\\xfb\\x06\\x33\\xa1\\x5f\\xad\\x73\\x8d\\xf9\\xde\\x45\\xba\\xff\\x45\\x8d\\x2a\\x71\\x91\\x5e\\xb0\\x15\\x66\\xae\\x20\\x32\\x34\\x52\\xb3\\x88\\xb3\\xf2\\x40\\x51\\x15\\x6d\\xea\\xb0\\xff\\x50\\xde\\x22\\x9e\\x8f\\xd5\\xe7\\x6d\\x5d\\x0e\\xef\\x03\\x2f\\x2b\\x17\\xf7\\xb6\\x60\\x5a\\x46\\x16\\x4c\\x1b\\xc5\\x62\\x67\\xf9\\xa0\\x16\\x4c\\x6f\\x9c\\x37\\x0f\\x6a\\xc1\\x94\\x6f\\xb2\\xa4\\xda\\x28\\x2d\\xb5\\x36\\x4a\\xa9\\x11\\xab\\x74\\x93\\x6a\\xb1\\xb4\\xf9\\xe3\\x2d\\x96\\x96\\x0f\\x68\\xb1\\xb4\\xd4\\x58\\x2c\\x2d\\x32\\x2c\\x96\\xce\\xb5\\xce\\xa4\\x62\\x41\\xe8\\xc1\\x9e\\xd6\\x4b\\x31\\xe5\\x72\\x7f\\x3b\\x26\\x71\\x0c\\x3f\\xab\\x69\\x4d\\x9a\\xe4\\xd7\\x7f\\xbe\\x75\\x53\\xd2\\x9e\\x69\\xc5\\xea\\x8b\\xe2\\xe2\\xdc\\xcb\\x9e\\x69\\x9b\\x65\\xcf\\x44\\x23\\xe6\\x34\\x97\\x7a\\x7b\\xa6\\x85\\x6c\\xce\\x24\\x59\\x1c\\xc5\\x01\\x6d\\xbe\\xc1\\x98\\x49\\xb5\\x8f\\xfa\\x1f\\x68\\xc4\\x74\\xfa\\x88\\x66\\x4a\\x0b\\x34\\x53\\x3a\\xbb\\x97\\x99\\xd2\\xe2\\xe1\\xcd\\x94\\xc8\\xb9\\x56\\x86\\xbb\\x21\\xb7\\xf6\\xbf\\x2d\\x98\\x1e\\xd7\\x82\\x69\\xf3\\xed\\x16\\x4c\\xcb\\x7f\\x5b\\x30\\xfd\\xdb\\x82\\x29\\x4f\\xe4\\x9c\\x6d\\xc1\\x64\\x14\\x37\\xff\\xdb\\x12\\xe8\\xdf\\x96\\x40\\xc5\\x2d\\x81\\x0c\\xa1\\x71\\x84\\xe8\\xf5\\xd6\\x96\\x8d\\x82\\x6e\\x15\\xa3\\xa0\\x5b\\xc5\\x28\\xe8\\xf6\\x91\\x2c\\x81\\xfe\\xd7\\x9a\\xeb\\xdc\\x43\\x20\\xae\\x11\\x6e\\x47\\xf9\\x86\\xb1\\xdd\\xc9\\xb1\\xe3\\x38\\x83\\x2b\\x71\\x67\\xbf\\x41\\xdc\\xe4\\x35\\xbb\\x82\\x5a\\xb7\\x8d\\x6d\\x53\\x5c\\xf1\\x18\\x5e\\xaf\\x0f\\xd7\\xdc\\x46\\xba\\xde\\xd9\\x7d\\x2e\\xde\\x6c\\xa3\\xbb\\x9c\\x3d\\xf3\\x1b\\xfd\\x2c\\xfe\\xea\\xe8\\xd6\\x24\\x83\\x00\\x8c\\xbd\\xc0\\x78\\x49\\x2a\\xce\\x47\\x02\\xb0\\x40\\xc8\\xbf\\x68\\x80\\xa3\\x3d\\x06\\xc8\\x07\\xe6\\xac\\x38\\x15\\x43\\x9f\\xf1\\xd3\\xf0\\x71\\xc1\\x8b\\xad\\xfc\\xe2\\xcf\\x19\\xd1\\x24\\x3d\\x22\\x4a\\x58\\xb1\\x61\\xe9\\x3e\\xd9\\xc2\\x40\\x95\\xb1\\xcf\\xb6\\xc8\\x22\\xc3\\xce\\x0a\\xd2\\xec\\x45\\x07\\x28\\x0d\\x88\\xe9\\x4d\\xf2\\x14\\x2c\\xe7\\x31\\x6f\\x2a\\xaf\\xfa\\x73\\x8d\\x58\\x4b\\xa7\\x0c\\xc9\\xf6\\x4a\\xd8\\x25\\xe7\\xb8\\xf7\\x2e\\x8d\\x12\\xdb\\x1e\\xcb\\xf0\\xd2\\xc9\\x90\\xb9\\x31\\xf9\\x36\\x3d\\xc2\\x81\\x1b\\x3f\\x3a\\xaa\\xe3\\x4f\\xfa\\x11\\x76\\x28\\xf0\\xdf\\xa3\\xe4\\xb1\\x5c\\xf2\\x75\\x66\\x49\\x34\\x42\\x30\\x34\\xf9\\x66\\x8f\\x82\\x4a\\x8b\\x6f\\x33\\x0b\\xba\\x40\\x36\\x9a\\x9a\\x7c\\xb7\\x4f\\x49\\xb9\\xcd\\xe6\\x63\\xab\\x7d\\x70\\xf9\\x34\\xcf\\x73\\xd5\\x3e\\xdc\\x32\\xa3\\x98\\x64\\x55\\x1d\\xfc\\x9e\\x76\\x74\\x92\\x15\\x1d\\x8b\\x44\\x86\\x88\\x22\\x2a\\x73\\xf9\\x50\\xb8\\xf9\\xe3\\x47\\x68\\xbe\\x19\\x99\\xa4\\x69\\xcc\\xeb\\xde\\x0b\\x53\\xb9\\x0f\\xc0\\xc6\\x6b\\x1b\\x8b\\x6d\\xf7\\x2c\\x1a\\x39\\x4b\\x78\\x6f\\x3b\\x57\\xd5\\x65\\x54\\x57\\x16\\xdf\\x63\\x8a\\x6e\\xec\\x93\\xf3\\xb1\\x80\\x6e\\x8c\\xeb\\xc4\\xda\\xcf\\x0e\\x94\\x6a\\xe4\\xd0\\xeb\\x9f\\x8a\\x6b\\xbd\\x72\\xb2\\x6e\\xeb\\x7b\\xe4\\x3d\\x2e\\x98\\x97\\x46\\x89\\xad\\x73\\x85\\x54\\x6e\\xc6\\xe3\\x02\\x19\\x51\\x43\\x50\\xa4\\x42\\xcc\\x57\\xa4\\x3e\\x2a\\x74\\x28\\x52\\x21\\xcd\\x58\\xa4\\x46\\x59\\xc7\\xc5\\x83\\x21\\x7c\\x94\\x95\\x95\\xe4\\x9f\\x29\\x75\\xb3\\x1c\\x34\\x19\\xd5\\x24\\x5c\\xaf\\xd2\\xe1\\xa2\\x1c\\x3c\\x39\\xfa\\xec\\x1e\\xfc\\xc1\\x39\\xad\\xba\\x68\\xf4\\x6d\\xd9\\xad\\x8b\\xa7\\xc7\\x8d\\x0b\\xf2\\x45\\x4a\\xf9\\xa1\\x51\\x6b\\x9e\\x72\\x5d\\xce\\x0f\\xe8\\x7a\\x8a\\x91\\x73\\xff\\xb4\\xc9\\xe7\\x58\\x18\\xaf\\x53\\xfb\\x99\\x77\\x56\\x08\\x84\\x37\\x42\\x0a\\xdf\\x05\\x5b\\x27\\x82\\xd6\\x2b\\xc9\\x2d\\x2a\\xe7\\x68\\x28\\x69\\x4c\\x96\\xad\\xe6\\x2b\\x5b\\xf1\\x51\\xd2\\x2a\\x95\\x1a\\xa5\\x03\\x8b\\x12\\xf5\\x07\\xb8\\x8e\\x50\\xa7\\xe0\\xee\\x44\\xf4\\xf6\\x53\\xa4\\xa9\\xa9\\xfa\\xf1\\x54\\x56\\x3f\\xd2\\x34\\x29\\x29\\xf7\\x32\\x33\\x8f\\x3b\\x5b\\xab\\xf6\\x85\\x69\\x1e\\x83\\x48\\xa3\\xb6\\x9b\\xa5\\x9c\\x42\\x5e\\xda\\x4a\\xd4\\xd0\\xb1\\x50\\x98\\xfd\\xb3\\xb8\\x16\\x8c\\x1e\\xae\\x34\\x85\\x4e\\xca\\xd1\\x91\\xb8\\x24\\x69\\x1a\\xde\\x20\\x08\\x50\\x9e\\x3f\\x4e\\xd3\\xc7\\x05\\x9a\\x5e\\xe8\\x9a\\x7e\\x80\\x61\\xb2\\x8b\\x59\\x69\\x6a\\xf9\\x40\\x4d\\x25\\x87\\xa5\\x69\\x6a\\xf5\\x48\\xa3\\xe2\\x77\\xbf\\xd2\\xd6\\xfa\\x91\\x86\\xa5\\x6b\\xeb\\x73\\xce\\xaa\\x0e\\x62\\x5d\\x71\\xa0\\xda\\x15\\xff\\xe8\\xc8\\xfb\\x44\\x3a\\xb3\\xf9\\xf9\\xf0\\xb2\\xa8\\x16\\x96\\xfc\\x24\\xd7\\x24\\x9d\\xd5\\xbc\\xa2\\xd7\\x85\\x2b\\xfa\\x59\\xae\\x48\\x3e\\xa4\\x79\\x4d\\x6f\\x0b\\xd7\\xf4\\x4b\\x6a\\x70\\xc7\\x4a\\x4d\\xaf\\x0a\\xd7\\xf4\\x6b\\x72\\x70\\x6a\\x45\\x6f\\x0a\\x57\\xf4\\x5b\\x6a\\x70\\x6a\\x4d\\xef\\x0a\\xd7\\xf4\\x2f\\xe7\\xad\\x30\\x71\\x7a\\x9b\\x47\\x1e\\xed\\x90\\x06\\x44\\xdf\\x3d\\x26\\x75\\x7e\\xda\\x87\\x43\\x9a\\x80\\x2a\\x7b\\x57\\xfe\\x35\\xa7\\xa3\\x04\\xa5\\x74\\x05\\x19\\x6a\\x18\\x68\\x76\\x77\\x6d\\x37\\xae\\xae\\xc9\\x5f\\x9d\\x77\\xa2\\x53\\xef\\xfe\\xbb\\x74\\xaa\\x39\\x15\\x34\\x9f\\xaf\\xf5\\xaa\\xf0\\x3e\\x2a\\xf8\\x2f\\x03\\xd9\\xb7\\x55\\xc8\\xbe\\x4b\\xa0\\xe2\\x6e\\x54\\xaf\\x0f\\xc9\\x2a\\x3f\\x44\\x55\\xfe\\xb5\\x70\\x95\\xb3\\x2a\\xc7\\x16\\x5b\\xd3\\xd8\\x6d\\x02\\x9c\\xc3\\xba\\xd4\\x95\\x36\\x75\\x1e\\xa5\\xde\\x48\\xa9\\x4b\\x6d\\xea\\x5a\\x9b\\xfa\\x36\\xe2\\x4f\\x60\\x28\\x12\\xeb\\xf9\\x33\\xbf\\x9d\\x57\\x68\\x53\\xa4\\xcf\\xf2\\x1b\\xcf\\xb2\\x46\\xf5\\xbf\\x3e\\xcb\\x4f\\x3c\\xcb\\x02\\xb8\\x37\\x43\\x96\\x5f\\x79\\x96\\x25\\x70\\xa3\\x86\\x2c\\x3f\\xf2\\x2c\\x33\\x44\\x45\\xe9\\xb3\\xfc\\xc2\\xb3\\xcc\\x51\\xa3\\xcd\\x40\\x12\\x05\\x3d\\x1c\\x5f\\x22\\x44\\xe2\\xf3\\xbd\\x3d\\x1c\\x5f\\x32\\x88\\x84\\xda\\x1b\\x63\\x75\\xbc\\x97\\x1b\\x9b\\x6c\\x4d\\xbd\\xfc\\xcd\\xba\\x34\\xf8\\x7b\\xcd\\x6a\\x63\\x5b\\x4f\\x35\\xb2\\xb5\\xc9\\xed\\x03\\x37\\x72\\x9c\\x6a\\xe4\\x36\\x39\\x77\\x72\\x47\\x14\\x83\\x44\\x71\\x90\\x95\\xc8\\x7b\\x71\\x5e\\x1c\\xd6\\x1b\\x87\\xb5\\x3c\\xf2\\x2c\\x54\\x5c\\x48\\x33\\x2f\\xdf\\xe6\\x6e\\x19\\x9a\\xfc\\x70\\xcf\\x26\\xeb\\x51\\x93\\xa7\\x45\\x70\\x28\\x08\\x7b\\x90\\xc0\\x25\\xb3\\xa2\\x1a\\xc7\\x21\\xee\\xe4\\xe2\\x79\\xb3\\xea\\x35\\xe8\\x0a\\xcf\\x54\\x5d\\x61\\x56\\x6b\\xc5\\x6a\\x58\\x15\\xed\\xef\\x08\\x4f\\x9e\\xe2\\x79\\xb3\\xea\\x2d\\xd6\\xb3\\xac\\xd6\\x8a\\xd5\\xb0\\x28\\xda\\xdf\\x09\\x07\\xb3\\x14\\xcc\\x9b\\x55\\x6f\\xb1\\x9e\\x65\\xb5\\xf6\\xcd\\x63\\x33\\x6a\\x89\\xcf\\xee\\xab\\x25\\xce\\xe8\\xee\\x83\\x37\\xb6\\x53\\x91\\x3a\\x45\\x20\\x31\\x1d\\x13\\x08\\xa6\\xcb\\xd0\\x2c\\x3d\\xf6\\xa7\\x8f\\xf0\\x97\\x01\\xfb\\x3d\\x34\\x5a\\xd5\\x8d\\x0c\\xb6\\x73\\xff\\xb1\\x23\\x63\\xa7\\x34\\x0e\\x27\\xe1\\x02\\x7d\\x24\\x90\\x09\\xd6\\xa6\\x37\\xd8\\x4b\\xa7\\xdd\\x68\\xd2\\x66\\x12\\x44\\x08\\xd2\\x2c\\x5b\\x20\\xb9\\xa7\\xb0\\xaf\\x4d\\xef\\x6e\\x6c\\x0a\\x8b\\x4a\\xf9\\x5e\\x96\\x01\\x67\\x52\\x3d\\xcb\\xa2\\x79\\x6f\\x6c\\x1a\\xa5\\x8e\\xe7\\xe5\\x19\\x4e\\x81\\x5f\\x51\\xba\\xb5\\xce\\xc9\\x02\\xb5\\x6c\\x92\\x48\\x29\\x8e\\x82\\x0c\\xed\\x6c\\x6f\\xc5\\x2f\\x10\\x3d\\xa4\\x2f\\x3a\\xb5\\x13\\xc8\\x20\\x72\\x6b\\xc8\\x79\\x13\\xe7\\x64\\xfe\\xf1\\xe0\\xbc\\xcf\\x06\\x62\\x9d\\xe9\\x80\\x58\\xaa\\x21\\xa3\\xc9\\x78\\x90\\xb1\\x5c\\xce\\x4c\\xfc\\x3c\\x76\\xe6\\xf0\\x93\\xb2\\x4f\\xce\\x82\\xff\\x3a\\xa6\\x90\\x08\\xc6\\x09\\x39\\x2b\\xf1\\xf3\\xd8\\x59\\x47\\x30\\x8a\\x8d\\x80\\x51\\xd4\\x9d\\xad\\xf8\\x79\\xec\\xdc\\x4a\\x40\\x8a\\xb3\\x47\\x07\\x52\\x18\\x8d\\xd1\\xb2\\x81\\x14\\xbd\\x74\\xb1\\x5e\\x41\\x20\\x45\\x3f\\x5d\\xb4\\x2f\\x1b\\xe9\\xd5\\xf7\\x36\\x2a\\xe3\\x05\\x8f\\xf7\\x36\\x0b\\xcc\\x86\\x23\\xe8\\x8c\\xb4\\x98\\x11\\x5b\\x2c\\xcb\\xd9\\x1b\\x68\\x92\\x07\\x65\\x38\\x7b\\x44\\x28\\xc3\\xd9\\xfd\\xa0\\x0c\\x67\\x7f\\x02\\x94\\x41\\xd3\\x66\\x01\\x28\\x83\\xce\\x8e\\xd3\\x0c\\x65\\xa0\\xaf\\x48\\x90\\x07\\x65\\xe0\\x19\\x20\\x63\\x3e\\x94\\x41\\xe4\\x21\\x41\\x26\\x94\\x21\\x10\\x50\\x86\\x4c\\x70\\x41\\xd2\\xbc\\xd4\\xa3\\xe6\\xa5\\x5a\\x93\\x38\\xa3\\x79\\xb0\\xde\\x0e\\x19\\xa8\\xcf\\x0d\\xc2\\x07\\xe6\\xec\\xcf\\x82\\xfd\\x59\\xb2\\x3f\\x2b\\xf6\\x67\\x4d\\xff\\x64\\x19\\x12\\xeb\\x31\\x58\\xc8\\x11\\xb3\\xba\\xb7\\xac\\xb6\\x2d\\xab\\x6d\\xcb\\x5a\\xda\\xb2\\x96\\xb6\\xac\\x6e\\x58\\x15\\x3f\\x87\\x33\\xb8\\x57\\xfb\\xfb\\x59\\x10\\x43\\x23\\x71\\x51\\xd6\\x9a\\xfa\\xbc\\x4a\\x3c\\xaf\\xd5\\xe7\\xa2\\x36\\x7f\\x61\\x6f\\xe4\\xc3\\xbd\\x59\\x04\\xd2\\xb0\\x89\\xba\\xbc\\xd1\\xfb\\x1b\\xdd\\x24\\xd5\\xc9\\xf4\\x2a\\xd3\\xaa\\x7e\\x7b\\x64\\x43\\xba\\xec\\xfe\\xd2\\x4b\\xcb\\xfb\\x34\\x43\\x4a\\x1f\\xbd\\x41\\x2b\\x20\\x9d\\xd4\\x24\\xe9\\xf8\\x73\\xac\\xfa\\x97\\x1c\\x72\\x66\\x69\\xd9\\x0a\\xee\\xee\\xae\\xaa\\x2f\\x9e\\xdc\\x6a\\xe2\\x37\\x93\\xdb\\x27\\x56\\x3a\\xb5\\x52\\x7d\\x61\\x6b\\x32\\x5f\\x37\\x02\\xea\\x74\\xf2\\xf6\\xda\\x26\\x23\\x49\\xea\\x72\\x85\\xc2\\x16\\xf8\\x99\\xec\\xd0\\x2c\\xea\\xd0\\xc2\\xa6\\x0c\\x2c\\xfa\\x7a\\x48\\x66\\xba\\x91\\x33\\x5d\\x0b\\x41\\x0c\\x7a\\xe2\\x3c\\x25\\xb5\\x6b\\x69\\xec\\xc8\\x67\\x3a\\x8e\\x33\\x94\\xbd\\x61\\x1e\\x1d\\x45\\x8f\\x4a\\xbe\\xd6\\x95\\xf2\\x58\\xa9\\xd6\\xea\\x4f\\x94\\x14\\xa2\\x54\\x53\\x4e\\xbc\\xaf\\x5f\\x5f\\x37\\xae\\x2a\\x75\\x52\\x97\\x07\\xca\\xdb\\x1f\\xa9\\xed\\x47\\x8f\\x23\\xb5\\x7d\\xe5\\x91\\xd6\\xaf\\xa4\\x10\\xa5\\x9a\\x4a\\xe2\\xbd\\xd4\\x3e\\x95\\x0c\\x9f\\x15\\x76\\xcc\\xc9\\xd7\\x76\\xec\\x8d\\x33\\x9e\\xed\\x6b\\xa4\\x83\\xce\\xee\\x61\\x0c\\x18\\xd5\\x49\\x2e\\x9c\\xf3\\xa4\\x2f\\xce\\x4b\\x29\\x09\\xd5\\x6a\\x2f\\xa1\\x09\\xd9\\x26\\xf0\\x32\\x5b\\x87\\x49\\xc5\\x20\\xf4\\x6a\\xc8\\xe6\\xfc\\xbb\\xb1\\xd4\\xbc\\x1b\\x5b\\x58\\x6d\\xcc\\xde\\xe1\\xb6\\xd5\\xd8\\x5d\\x45\\xca\\x35\\x1b\\x30\\x32\\x11\\xab\\x82\\xd6\\xeb\\x03\\x1e\\x34\\x45\\x74\\x15\\x03\\xbe\\x7e\\x76\\x17\\xbd\\xa8\\xc7\\xfd\\x36\\x37\\xee\\xc3\\x3a\\x2b\\xf8\\xba\\x02\\x74\\x63\\xaf\\x52\\x2a\\x0f\\xec\\x84\\x4b\\x43\\x12\\x8f\\xff\\x2f\\xfa\\x12\\xe5\\xd2\\x81\\xce\\xcd\\xcc\\x6d\\xd2\\xb1\\xca\\x29\\x0a\\xde\\xc4\\x8c\\xf1\\xf2\\x25\\xb2\\x6a\\x95\\x96\\xb3\\x91\\x65\\xac\\xfb\\xff\\x92\\xf7\\xa5\\xdd\\x6d\\xdb\\x5a\\xbb\\xdf\\xef\\xaf\\xb0\\x75\\xfa\\x7a\\x91\\x31\\xe4\\x48\\x6e\\xd3\\xd3\\x4a\\x65\\xbc\\x1c\\xcf\\x89\\x9d\\xa4\\x49\\xda\\x93\\xd4\\x4b\\x2b\\x4b\\x03\\x25\\x51\\xa2\\x06\\x6b\\xb0\\x25\\xc7\\xfa\\xef\\x17\\x7b\\x63\\x20\\x40\\x02\\x24\\x25\\x3b\\xed\\x7d\\xcf\\xfd\\x60\\x4b\\x22\\x01\\x10\\x04\\x41\\x60\\x8f\\xcf\\xe3\\x16\\x2a\\x05\\xee\\x50\\x38\\x53\\x9e\\xc5\\x5e\\x34\\xd8\\xf1\\xd8\\x04\\x38\\x9c\\x0a\\x53\\x0a\\x10\\xab\\x31\\x60\\x49\\x92\\x04\\x78\\x1d\\xab\\x03\\x66\\x00\\x58\\x8a\\x8c\\xc6\\xce\\x08\\x9f\\xd1\\x4b\\x06\\xc1\\x73\\x20\\xe6\\x41\\x0c\\x68\\x09\\x0f\\x49\\xa4\\x25\\x97\\x8e\\x1a\\x3f\\x48\\xef\\xb3\\x89\\x90\\x61\\x0d\\x09\\xb2\\xd3\\x32\\x03\\xb7\\x99\\x56\\xbc\\x67\\x7b\\xbf\\x72\\xf9\\xbf\\x30\\x28\\x91\\x52\\x08\\xb6\\x42\\x27\\xc4\\x2e\\x01\\x42\\x5b\\x28\\xb0\\xda\\xe8\\x05\\xc3\\xc2\\x6e\\xb1\\xf5\\x7c\\x1f\\x2c\\x4d\\xf4\\xab\\xf8\\xc6\\x2b\\x4c\\x64\\x85\\x51\\x54\\x81\\x9f\\x1b\\xcb\\x73\\x13\\xb5\\xb1\\xa8\\x2d\\xd1\\xec\\x7d\\x21\\x03\\x83\\xce\\x8c\\x64\\xd4\\x77\\x06\\x02\\xbd\\x88\\x5e\\x30\\x94\\x80\\x58\\x0c\\xad\\x47\\xc5\\xff\\x33\\xc4\\xe3\\xd2\\x11\\x91\\x85\\x12\\xf8\\x4f\\xe6\\x62\\x0b\\x35\\xff\\xcb\\x02\\xe6\\x13\\x3a\\x12\\xce\\xa7\\x44\\xd8\\x29\\x03\\x0a\\x92\\xb1\\xaa\\x84\\xff\\x09\\x1d\\x5e\\x91\\x8e\\x1c\\x62\\x28\\x49\\x94\\xde\\xbf\\x6b\\x3e\\xc5\\xcc\\xac\\x67\\xdf\\xeb\\xe9\\xfc\\x6f\\x9e\\xb0\\xab\\x04\\x9c\\x52\\x26\\x90\\x92\\x34\\xd8\\xe0\\x47\\x2f\\x03\\x4a\\xa9\\x6f\\x30\\xae\\x84\\x86\\x63\\x03\\xab\\xcd\\x67\\x68\\x45\\x52\\x1a\\x99\\xcf\\x8c\\xe8\\x1a\\xb6\\xb2\\x41\\x33\\x35\\xc3\\xd1\\xd4\\xb7\\xc2\\x33\\x75\\xe9\\x4d\\x5b\\x11\\x9a\\xc2\\xd1\\x1d\\x02\\x34\\x01\\x3e\\x13\\xfd\\x37\\x87\\x24\\xa9\\x5b\\x30\\x34\\xdd\\xd9\\x4c\\x5c\\x1c\\x9d\\x49\\x4b\\xd7\\xe2\\xda\\xd5\\x47\\xaa\\x86\\xc3\\xbe\\xc8\\x7e\\x9d\\x07\\x2d\\x9f\\x45\\xc4\\xe4\\x48\\xe5\\x22\\x7f\\x0b\\x7a\\x93\\x62\\x59\\x81\\x51\\x09\\x61\\x3a\\xbc\\x87\\xc8\\x55\\x4f\\x9f\\xec\\x0d\\x3a\\xa4\\xf4\\x11\\x9e\\x8b\\x32\\x90\\x7f\\x17\\x49\\x38\\x05\\x45\\x90\\xd9\\x12\\x1b\\x54\\xb1\\x44\\x5f\\xd0\\x7a\\x12\\x3a\\xb7\\xc9\\x42\\x30\\xf5\\xe6\\x54\\xd1\\x3e\\xa3\\x5d\\x06\\x1d\\x5d\\x30\\x62\\xf2\\xae\\xd4\\x6c\\x9a\\xe5\\x77\\xb7\\xda\\x58\\xcd\\x2f\\xe9\\x56\\x1b\\xab\\xe9\\x25\\x1d\\xc5\\xc9\\x0a\\x66\\x95\\x8e\\xe2\\x64\\x07\\xb3\\x4a\\x47\\x63\\xca\\xb2\\xf3\\xac\\x6d\\xe6\\x49\\x47\\x71\\xb2\\x82\\x3f\\xa5\\xa3\\x38\\x59\\xc1\\x9f\\x10\\xc5\\xe9\\xf3\\xda\\x79\\x35\\xe9\\xe0\\x4f\\x66\\x56\\x10\\x5a\\x6d\\x5c\\x6f\\xa5\\xd9\\xb0\\xac\\xbc\\x3e\\x20\\x0a\\x9e\\xb4\\xec\\xb7\\x67\\x4d\\xe1\\xb1\\x23\\x38\\xa5\\xdb\\xcb\\x78\\x82\\x62\\x4e\\x86\\xfa\\x3a\\x30\\xd4\\xa7\\x02\\x9f\\x59\\x2d\\x6c\\x56\\x7b\\x85\\x15\\x8c\\x0c\\x56\\x74\\x6b\\xe6\\x56\\xc2\\xd6\\x15\\xe5\\x6e\\xc1\\x5a\\x6f\\xcd\\xd9\\x32\\xd5\\x63\\x59\\x5b\\xb0\\xde\\xad\\x9d\\x65\\x46\\x77\\x87\\xb5\\x93\\xbc\\xd2\\x8d\\x65\\x26\\xcb\\xaf\\x66\\x2c\\x53\\x6d\\x65\\x78\\x86\\x74\\x62\\xb6\\xb2\\xb8\\xa9\\x8c\\x9f\\xa7\\xe5\\x62\\xa6\\xb2\\xa4\\xa5\\x4c\\x14\\x21\\x1d\\xdd\\x52\\xa6\\x1b\\xca\\x3a\\xb9\\x0c\\x65\\xf1\\xbc\\xb1\\x06\\xe6\\x8d\\x99\\x0c\\x65\\xf9\\xac\\x3e\\xe3\\xfa\\xa4\\x1e\\x86\\x7e\\x78\\x34\\x62\\xf0\\x8c\\x33\\x7f\\x9a\\xc7\\x02\\x34\\x8e\\x1e\\x7e\\xd2\\x02\\x24\\xcb\\x8d\\x95\\x4d\\xff\\xd4\\xe9\\xea\\xe1\\x32\\x0d\\x44\\x29\\x08\\xa6\\x6f\\xeb\\x6f\\x9d\\x3a\\xf0\\x63\\x3c\\x3c\\xb0\\x1f\\xb4\\x4b\\x53\\xff\\x34\\x1c\\xd5\\x67\\xec\\xb8\\x2b\\x70\\x95\\x3b\\x18\\x76\\xc6\\xad\\x01\\xa4\\xc5\\x7e\\x73\\xd7\\x37\\xf1\\xbd\\x26\\x98\\x34\\x9c\\x26\\x18\\x0e\\xe0\\xab\\xfb\\xfc\\x57\\x86\\xbb\\x81\\xea\\xed\\xbb\\xb6\\x03\\xe8\\xb5\\xac\\xa9\\x6e\\x52\\x6a\\x12\\xed\\x5e\\xfb\\x04\\x5a\\x90\\x16\\x97\\xeb\\x45\\xb1\\xbc\\x4f\\x5a\\x78\\xa8\\x8a\\x17\\x6c\\x4c\\xe6\\xd3\\xee\\xde\\x12\\x60\\x68\\x5e\\xef\\x8d\\xe9\\x77\\x18\\x6d\\x76\\x93\\xd7\\x70\\x11\\x02\\xa5\\x1c\\xdf\\xad\\xf1\\x83\\x5b\\x22\\x64\\xe5\\x65\\xe9\\xc0\\x39\\x16\\x10\\xb3\\xb0\\x81\\x86\\x75\\xc0\\x16\\x0e\\x86\\x1c\\x97\\xe7\\xc4\\x7e\\xce\\xad\\x98\\x6a\\x32\\x10\\x73\\x53\\x3d\\x76\\xc6\\x25\\x4a\\x87\\x70\\x28\\xa9\\xee\\xa2\\x24\\xb0\\xdc\\x38\\x6c\\x38\\xea\\x5e\\x37\\x25\\xa6\\xab\\x73\\x5d\\x17\\x37\\xed\\x0f\\xc6\\x33\\x06\\x32\\x0a\\xec\\x38\\x96\\xe0\\x29\\xb5\\x3c\\xb3\\xc8\\x41\\x94\\x70\\x1f\\xe4\\x3c\\x5b\\xa2\\x74\\x1f\\xd0\\x2f\\xbe\\xb5\\x02\\x2a\\x36\\x4d\\xe9\\xc1\\x4a\\x9d\\xb0\\x9a\\x15\\x08\\x9d\\x82\\x89\\x1c\\x42\\xed\\xab\\xc4\\x7d\\xca\\x56\\xa4\\xa6\\x50\\x07\\xeb\\xc5\\x64\\xa9\\xb6\\x1f\\xe1\\xf6\\xb2\\xe9\\xd5\\xa4\\xfd\\x73\\x81\\x1f\\xa8\\x55\\x43\\xd3\\x95\\xd2\\xdf\\x65\\x34\\x0f\\xd0\\x5c\\xb5\\x5d\\xaa\\xf0\\x62\\xbf\\x79\\x50\\x6d\\x67\\x07\\xfe\\xff\\xe6\\xe1\\xc1\\x32\\x1d\\x4c\\x21\\xd8\\xb5\\xc0\\xe2\\x85\\x73\\xa1\\x49\\x27\\xe6\\x01\\x88\\xf3\\x15\\xf6\\x10\\x56\\xc0\\x68\\x83\\xad\\x3b\\xdf\\xd8\\x18\\x4f\\x2b\\x7d\\xc2\\x37\\x88\\x70\\xa5\\x3c\\x8d\\x09\\x2e\\xeb\\xb4\\x7d\\xcc\\x97\\x81\\x17\\x93\\x8e\\xc0\\x5b\\xfa\\x96\\xee\\x7d\\xfd\\xca\\x22\\x95\\xbf\\x7e\\xf5\\xda\\x60\\xe0\\xbd\\xe4\\xda\\xd2\\x6d\\x30\\x0d\\x1a\\x41\\x88\\x4c\\x19\\x05\\xe6\\x35\\x2f\\x28\\x0d\\x4e\\x65\\x83\\x4c\\x05\\xa5\\x77\\x75\\x47\\x14\\x6d\\xd4\\x7e\\x99\\x5d\\x4f\\x7a\\xac\\x17\\x74\\x16\\x5d\\x45\\xda\\xd9\\x18\\xf2\\xf0\\xa6\\xa3\\x89\\x05\\x05\\x7b\\x4e\\x2f\\x59\\x9c\\x3b\\x98\\xe2\\xdf\\x16\\x43\\x49\\x5f\\x94\\xb7\\x69\\xfa\\xa2\\x51\\x5b\\x84\\x96\\x98\\x6a\\x18\\xdd\\xd0\\x0c\\xc5\\x1c\\x2a\\xb5\\xce\\xfc\\x2d\\x7b\\xe7\\x09\\x2f\\x01\\x77\\x4e\\x74\\x03\\xa1\\x52\\x21\\x2b\\xa6\\xa6\\xcd\\xaf\\x1f\\xbf\\xfb\\x4b\\xf5\\x97\\xe1\\x39\\xc0\\xa3\\x57\\xba\\x3c\\x8f\\x72\\xc4\\xa0\\x3f\\x62\\xbe\\x40\\x29\\xcf\\x6b\\x1c\\xc0\\x55\\x2a\\x4c\\x6b\\xbc\\x4d\\x98\\xcc\\xef\\x6c\\x26\\xf3\\x16\\xb9\\x05\\x4e\\x82\\x85\\xd5\\x64\\xee\\x63\\x81\\x84\\xc9\\xfc\\x16\\x5e\\xa4\\x06\\x7d\\x30\\xb8\\xb4\\xa1\\x06\\x32\\x85\\xd8\\xbe\\xbb\\x1a\\x10\\xb0\\xc8\\xa7\\x85\\x46\\xb2\\x25\\x60\\xc8\\x75\\x0d\\xef\\xab\\x58\\x8c\\x15\\x83\\x3b\\x51\\xd7\\x74\\x76\\x87\\xbb\\x0d\\x7a\\xb7\\xd1\\xfb\\xb1\\x84\\x59\\x08\\x3a\\x9e\\x08\\xd2\\x87\\x05\\x7a\\x67\\xc7\\x61\\xc7\\x4b\\x04\\x7e\\x7a\\x25\\x5c\\x79\\xbd\\x92\\xcb\\x7e\\x42\\x21\\x30\\x25\\x3b\\xf8\\x0b\\x17\\xf7\\x32\\x2b\\x01\\xff\\x76\\xcb\\xb0\\xae\\xd1\\xda\\xd6\\x95\\xbc\\x29\\x97\\xf0\\xbd\\x5f\\x9f\\x39\\xb0\\x8c\\xbb\\x68\\x39\\x8f\\xde\\x77\\xac\\x7b\\xdb\\xe1\\xaf\\x27\\xd0\\x91\\xc1\\x39\\x46\\x70\\x81\\xc7\\x0a\\xe4\\xc6\\xa5\\x8b\\x69\\x7d\\xe0\\x17\\xe8\\x6e\\xcd\\x19\\x19\\xee\\xbd\\x5b\\xab\\x9d\\xd9\\xb0\\x9b\\x6a\\x0c\\x50\\x87\\xde\\xfd\\x06\\x96\\x66\\x63\\xab\\xe4\\x15\\xe4\\x56\\x28\\x26\\xe6\\x23\\xda\\xb6\\x6a\\x62\\x7e\\x95\\x6e\\x62\\x36\\x34\\xba\\xd5\\xa8\\x37\\xfb\\x00\\x5a\\xc6\\x48\\x9b\\xd7\\xaf\\x4f\\x67\\x8b\\xff\\x98\\xfa\\x83\\x60\\x3a\\x0d\\x86\\x1d\\x06\\xd4\\xca\\x77\\xc5\\xfb\\x8c\\x17\\xb5\\x19\\x99\\xc0\\x9b\\x7a\\xe0\\xf8\\x31\\x39\\x21\\xa7\\xe2\\x19\\xf3\\xf0\\x12\\x35\\x35\\xa1\\xd0\\xac\\x33\\x44\\x6a\\x84\\xc2\\xc7\\x9d\\xc7\\x19\\x42\\xa6\\x20\\xaf\\xc2\\x43\\x2e\\x62\\x31\\x19\\xe7\\x70\\xba\\xe1\\x77\\xeb\\xb7\\xc1\\x68\\xb2\\xd7\\x9a\\xd4\\x3b\\x0e\\xa7\\x44\\xa1\\x5f\\x19\\xcd\\x00\\x99\\x44\\x47\\x0a\\x64\\x1a\\xfd\\x00\\xf6\\x01\\x02\\xb1\\xa5\\x5e\\x5b\\x09\\xd9\\x2b\\xb6\\x95\\x90\\x41\\xf2\\x1a\\xb6\\xba\\x37\\xde\\x75\\x69\\xf7\\xe2\\xf9\\x3e\\x41\\xe9\\xe3\\xae\\x28\\xbe\\xd6\\xaa\\xc7\\xca\\x53\\xde\\x33\\x8c\\x57\\x1c\\xaa\\x4b\\x4e\\xbf\\x37\\x35\\x30\\xe5\\xc7\\x27\\x1f\\x1f\\xe4\\xe3\\x84\\x21\\xfb\\x58\\x01\\xc1\\x32\\x99\\x70\\x54\\x3b\\xe8\\xd2\\x56\\xa6\\xac\\xd8\\x4a\\xf7\\x2d\\x65\\xf6\\x95\\x76\\x6c\\x65\\x7e\\x04\\x18\\xa6\\x93\\x35\\xee\\x9c\\x13\\x4c\\xb0\\x3b\\x8f\\x80\\x9a\\xb6\\x98\\x05\\x11\\x50\\xf1\\x4e\\xe2\\x64\\x14\\xa9\\x65\\xe3\\xc3\\xc6\\x29\\x49\\x4e\\x12\\xc3\\x76\\x12\\x99\\x83\\x17\\x8a\\x99\\xf8\\xae\\xf8\\xeb\\x3e\\x3c\\xc4\\x04\\x83\\x84\\xe6\\x4e\\x60\\xb9\\x8f\\xf7\\x6a\\x18\\x7f\\xf4\\x3e\\xaa\\xb7\\xc7\\x7d\\x0a\\xd8\\xe5\\x06\\xd0\\x47\\x99\\x9d\\x0e\\x74\\xb3\\x8a\\xf7\\x4f\\xdb\\xbe\\xf0\\x82\\x57\\xea\\x05\\xd5\\x17\\x38\\xe5\\x82\\x57\\xb6\\x0b\\x5e\\x25\\x2e\\x78\\x65\\xd8\\x2f\\x85\\x79\\xbd\\x07\\xa7\\x47\\x8f\\x25\\xab\\x1a\\x19\\xc8\\xaa\\x90\\xe1\\xa2\\x52\\xdf\\x83\\xa5\\x9b\\x30\\x2f\\x17\\x76\\x5e\\x73\\x75\\xa1\\x7f\\x16\\xea\\x24\\x64\\x03\\x78\\x0f\\xed\\x27\\xa9\\x2a\\xc0\\xf2\\x44\\x1f\\x4d\\x6e\\x35\\x4a\\xd2\\x4e\\x65\\xf5\\x5c\\x32\\x48\\xc6\\x52\\x3a\\xf7\\xa4\\xf4\\x2c\\x9e\\x53\\x37\\x6f\\x26\\xa7\\x65\\x31\\x56\\x1a\\xcc\\xca\\xe4\\x34\\x55\\xcf\\x9d\\xaf\\x69\\xa8\\x5c\\x64\\xbb\\xaf\\x5a\\x55\\x63\\xa9\\xc9\\xbe\\x34\\xa7\\x38\\xd9\\x40\\xf0\\x64\\x82\\x1f\\x04\\x51\\xaf\\xa0\\x7a\\x7c\\x3e\\xbf\\xd5\\x21\\x43\\x39\\x93\\x0a\\x57\\x4c\\x9a\\xf3\\xc9\\x14\\xc8\\x68\\x0a\\xcc\\xec\\xab\\x32\\xc8\\x14\\xcb\\x48\\x20\\x63\\x60\\xae\\x29\\x0c\\xa8\\xe4\\x1e\\xfa\\x82\\x8f\\x85\\x41\\x55\\xb8\\xf6\\xf7\\xc2\\xfd\\x66\\x9a\\xf1\\xf4\\x69\\x51\\xb5\\x29\\x75\\x5a\\xe7\\x9d\\xe1\\xa6\\xc9\\x6e\\x9d\\xea\\x89\\xde\\x20\\x77\\x1a\\x74\\x86\\xe5\\xbb\\x40\\xd0\\xfd\\x79\\x7c\\xd8\\x78\\xec\\xbb\\x9f\\x24\\x7c\\x4d\\xbc\\x35\\x50\\xff\\x8c\\x87\\x3d\\x32\\xe9\\xcc\\x88\\x6d\\x16\\x30\\x43\\xc1\\x2a\\x7e\\xa5\\x94\\xc9\\x15\\xbf\\xbc\\xe5\\xe2\\x91\\xb8\\xe8\\xae\\xb4\\x35\\x51\\x73\\x56\\xd3\\x35\\xbe\\xf8\\x4b\\xcc\\x73\\x5d\\xfe\\x59\\xf1\\x09\\xc5\\x02\\x7c\\xa5\\x33\\xa8\\x1c\\x79\\x83\\x5a\\xcc\\x0d\\xe4\\xb3\\x8f\\xb6\\x89\\x38\\xa3\\x03\\x40\\x77\\x5d\\x90\\x10\\x02\\xf8\\xd7\\xb3\\x79\\x4b\\x50\\xdb\\x46\\xa5\\x79\\x00\\xff\\x86\\x5e\\x99\\x85\\xf0\\x46\\xbe\\x13\\x2e\\xdf\\xe6\\xf1\\x68\\x98\\x02\\x43\\x47\\xdf\\xdd\\xec\\x6f\\xb5\\x70\\xa7\\x9b\\xfd\\xad\\x16\\x6e\\xb9\\x9c\\xbd\\xa5\\x2b\\xab\\x35\\x24\\xd1\\xea\\x6c\\x90\\xd5\\xd9\\xd4\\xb3\\x36\\x60\\x75\\x3b\\x80\\x90\\xf2\\x89\\xdb\\x37\\xd6\\x35\\xda\\xca\\x8b\\xe7\\xee\\x77\\x22\\x48\\x31\\x6a\\x82\\x07\\x28\\xea\\xe3\\xa1\\x84\\x23\\x76\\xbd\\x46\\xa6\\x3d\\xd5\\xe4\\xb6\\xb0\\x07\\x1f\\xe2\\x29\\xd2\\xcc\\x0a\\x3e\\xe4\\x05\\x68\\xc1\\xec\\xe0\\x43\\x51\\x86\\x34\\x53\\x83\\x0f\\x9b\\xb9\\x6c\\xaa\\x71\\x63\\x7e\\x03\\x8d\\xf9\\x8f\\xb0\\xa9\\x06\\x7e\\x1e\\x1b\\xea\\xb1\\xec\\x40\\x84\\x94\\x7f\\x9c\\x62\\x4d\\x3d\\x16\\x9c\\xd8\\x74\\x43\\x3c\\x1c\\x76\\x42\\xdf\\xe3\\xc6\\x53\\x79\\xc0\\x3d\\x00\\xfe\\x67\\xf1\\x8b\\x20\\xac\\xe8\\x64\\xa6\\x97\\x8d\\x0e\\xb1\\xd2\\xd1\\x6f\\x32\\x7a\\x78\\xa0\\x05\\x82\\xe1\\xd0\\x9f\\x7c\\xa8\\xb7\\x82\\xf9\\x94\\xea\\xe2\\x55\\xa9\\xed\\xab\\xaa\\x13\\xee\\x18\\x5f\\xe9\\x76\\x07\\x1b\\x05\\xa9\\xcb\\x15\\x42\\x3b\\xee\\x35\\x81\\x49\\xd9\\x20\\xeb\\x1e\\x82\\x3d\\xb2\\x49\\x0f\\xd0\\x11\\x45\\xc4\\x7a\\xaf\\x55\\x64\\x4f\\xaa\\x28\\xe6\\xc0\\xa9\\xe7\\x17\\x71\\xda\\x14\\xe5\\x93\\x3e\\x8b\\xcc\\x58\\x54\\xaf\\x73\\xa9\\x46\\x74\\x0e\\x6b\\xdb\\x05\\xfc\\x7b\\x9d\\x80\\xaf\\x09\\xda\\x0e\\xd8\\x19\\x96\\x02\\x98\\x44\\xe0\\xed\\xbe\\xf1\\xce\\x8a\\x67\\xcf\\x5f\\x90\\x4b\\x6f\\xf1\\xec\\x8c\\x5c\\x79\\xa5\\xea\\xd5\\x6f\\x18\\x5c\\xc0\\xca\\x55\\xaf\\x76\\x77\\xdd\\x73\\x66\\xca\\x7b\\x03\\x49\\x80\\xf8\\xed\\xd2\\xad\\xd2\\xe7\\xea\\x6f\\x9d\\xd3\\xf6\\xcc\\x56\\x4f\\x3a\\x6e\\x74\\xa9\\xf4\\x27\\x45\\xfe\\xf9\\xfc\\x85\\xfb\\xec\\x0c\\x31\\x60\\x52\\x6a\\xe0\\x48\\x17\\xf9\\xa7\\xa8\\x81\\xa1\\x93\\x70\\x93\\xb6\\x8a\\x5b\\x89\\x8a\\x80\\x30\\x1d\\xb7\\xf5\\xbc\\x16\\x52\\xe2\\xeb\\x78\\x5c\\x93\\xb4\\x55\\x04\\x7e\\x24\\xd2\\xe7\\x16\\x15\\x63\\x96\\x89\\xc0\\xdf\\x92\\x11\\x57\\x85\\x5d\\x2a\\x72\\xbe\\xf7\\x34\\x71\\x8f\\xfc\\x1e\\xc3\\x97\\xf8\\xe0\\xbd\\xcf\\x10\\x07\\xa1\\x5b\\xd5\\xec\\x42\\x0c\\x46\\xd0\\x2c\\xe2\\x65\\x1b\\x08\\xc8\\xef\\xba\\x98\\x10\\xf8\\x99\\xb8\\x0b\\x27\\x18\\xea\\x51\\xd8\\x3d\\x85\\x4f\\x63\\x13\\xa2\\x4b\\xeb\\x36\\xf4\\xda\\x1e\\xaf\\x77\\xbf\\x4e\\xbc\\x5e\\x17\\xd5\\x92\\x43\\x78\\x21\\x5e\\xd1\\x7f\\x55\\x31\\xe7\\xcd\\xb3\\x1c\\xed\\x78\\x1f\\xa5\\xb1\\x63\\xd2\\x04\\x3b\\x06\\xcc\\x5d\\xf6\\xee\\x3b\\xe7\\xd7\\x57\\x54\\xf7\\xfd\\x94\\x5e\\x60\\xf7\\x85\\x5b\\x9d\\xd1\\x65\\x77\\xbb\\xbc\\xb3\\xe3\\x7c\\x54\\x16\\x13\\x48\\xa1\\xfd\\xa4\\xff\\x76\\xc9\\x6d\\x54\\x52\\x2c\\x52\\x60\\x94\\xfc\\xa4\\xfe\\xa2\\x5a\\x11\\x16\\x50\\x96\\x21\\xe7\\x82\\x75\\x25\\x79\\xcc\\x25\\x1f\\xf7\\x9a\\xa3\\x89\\x3c\\xba\\xb3\\x73\\x87\\x95\\xd5\\x63\\x90\\xef\\xfb\\x29\\x7e\\x04\\x12\\x24\\xf1\\xd5\\xfe\\x08\\x86\\x2a\\xfc\\xf6\\x89\\x21\\x61\\xfd\\x01\\x37\\x1c\\xd6\\x97\\x90\\x9f\\x46\\x9f\\x29\\xe4\\xdc\\x80\\xb9\\x1b\\xed\\xba\\x2c\\x02\\x29\\x1d\\x3e\\x9b\\x2e\\xaa\\x1d\\x88\\xba\\x76\\xab\\x7f\\x50\\x41\\x9a\\xdd\\xd6\\xce\\xce\\x7c\\x67\\x27\\xfa\\x09\\xb9\\xc3\\xf4\\x26\\xc7\\xb4\\xab\\x1f\\xb2\\x15\\x9c\\xc0\\x2f\\xce\\x82\\x19\\x28\\x08\\x71\\xd9\\x36\\x3a\\x23\\x14\\x90\\x34\\xc5\\xc2\\xe0\\xb7\\x55\\xa8\\xc1\\x47\\xc3\\x59\\x71\\x1a\\xdc\\x53\\xad\\x5c\\x5b\\x65\\x9f\\x2d\\x9e\\xed\\x3f\\x77\\xc6\\x82\\x02\\x6f\\x9f\\xaa\\x46\\xe3\\x85\\xae\\xd9\\x94\\xf6\\x7e\\x7c\\xa1\\xea\\x36\\x06\\x4d\\xcb\\xa0\\x68\\x95\\x80\\xec\\x75\\xc2\\xc9\\x5e\\x71\\xa9\\xfa\\xd3\\x4b\\xdc\\x5e\\x32\\x28\\x13\\xb9\\x4a\\xc4\\xb2\\xf5\\x07\\xe0\\x27\\x24\\x2a\\xc9\\xb7\\x30\\x56\\x55\\xe8\\x6a\\xbc\\x6a\\xf5\\xcf\\x84\\x6e\\xf7\\x1f\\x23\\x4f\\xf8\\x67\\xef\\x4f\\xd3\\xca\\x58\\xfd\\x9c\\x7c\\x56\\xbc\\x77\\xe4\\xf3\\xe3\\xad\\x1a\\x37\\x98\\x31\\x6e\\x08\\x6e\\x96\\xc6\\x18\\x33\\x21\\xcd\\xbf\\x4b\\x4a\\x2c\\xdd\\x2b\\x34\\x3a\\xdf\\x5b\\xd9\\xbc\\x75\\x9b\\x48\\x4e\\xea\\x69\\xed\\xee\\x36\\xb3\\x7b\\x6c\\x7a\\x73\\x2f\\xd4\\x9b\\x3b\\x34\\xdd\\x5c\\xc4\\xdc\\x9d\\xb0\\x9a\\xa8\\xfd\\x36\\x91\\x73\\xdf\\x5b\\xc9\\xb9\\x6d\\x4d\\x59\\x56\\x6c\\xdf\\xc0\\xbf\\xfd\\x98\\x91\\xb6\\x71\\x6d\\xdf\\xdb\\xb8\\xb6\\x37\\xbb\\xd8\\x9f\\xe6\\x08\\x59\\xd5\\xbd\\x17\\x70\\x74\\x42\\x86\\xe1\\xfd\\xa7\\x2d\\x5a\\xd6\\x5a\\x05\\xde\\x19\\x3d\\x2c\\x3a\\xa1\\x83\\xeb\\x12\\x64\\x9d\\xe1\\x4b\\xfd\\x99\\x3a\\x3d\\x4c\\xa1\\xa3\\x0d\\x5d\\xd8\\xac\\x8b\\x90\\xdb\\x4f\\x77\\xbe\\x3f\\xc4\\xc2\\xc7\\x54\\x4b\\x8e\\x68\\x18\\xbe\\xa0\\x83\\xd9\\xb8\\x4f\\x7e\\x61\\xdb\\x83\\xb6\\x0d\\xaa\\x1b\\x11\\x10\\x72\\x86\\x74\\x29\\x1f\\x1d\\x38\\x5f\\xe8\\x9e\\x64\\xdf\\x2f\\x0f\\xe9\\x59\\xed\\x00\\x80\\x67\\xf0\\x1d\\x11\\x6a\\xc6\\x76\\xcf\\x5b\\xf5\\x94\\xba\\x41\\x56\\xf0\\x32\\xd0\\x9a\\x5b\\xfd\\x8f\\x51\\x68\\x53\\x41\\x05\\x22\\x52\\xe5\\xe4\\x60\\x33\\xc7\\x64\\x5c\\x74\\x6e\\x64\\x05\\xf7\\xd2\\x27\\x32\\x05\\x3d\\x44\\xb9\\x17\\xef\\x9c\\x0e\\xf3\\x6e\\xb9\\x44\\x74\\xfd\\x81\\x1d\\x7d\\xc1\\x95\\x08\\x4d\\xfb\\xd8\\x55\\xd4\\x96\\xe7\\xfb\\xcf\\x9c\\xf2\\x2f\\xa5\\xe7\\xb8\\xf5\\xbc\\xbf\\x10\\xea\\x44\\x4a\\xf9\\xdf\\x78\\xd1\\x83\\x66\\xd1\\xfb\\xb5\\x54\\x69\\xee\\xd2\\xff\\xba\\x94\\xf5\\x05\\xb1\\xca\\x7c\\x80\\x9c\\x0e\\x5a\\xcc\\x99\\xbb\\x35\\x19\\xcd\\xb8\\x4c\\x88\\x1b\\x4f\\x14\\xe6\\xaa\\xdc\\xc8\\x59\\xf2\\x2e\\xe8\\xa1\\x17\\x99\\x8d\\x17\\x10\\x65\\x5c\\x4f\\x7a\\x88\\xf3\\x09\\x17\\xfe\\xd5\\x6e\\xb7\\x0b\\xfa\\xcb\\x27\\x0f\\xb2\\x41\\x9f\\x2c\\x0a\\xe4\\x47\\xf9\\x63\\x09\\x3f\\x94\\x66\\xb9\\x90\\x60\\xda\\xed\\xa7\\x07\\x79\\x86\\x4b\\x23\\xc2\\xae\\x44\\x12\\x42\\xac\\x47\\xa5\\x52\\xa9\\x20\\x0c\\xcd\\x7f\\x81\\xcd\\xe9\\x07\\xaf\\xfc\\x13\\xf9\\x4a\\xff\\xd1\\xb1\\x69\\x98\\x62\\x7a\\x95\\xd0\\x65\\xf0\\x0d\\x3d\\xff\\xea\\x3e\\xfb\\x8a\\x52\\xae\\x76\\xa2\\x5c\\x7b\\xfe\\x83\\xfb\\xec\\x87\\x15\\x9d\\xb7\\x71\\x9e\\xdf\\x23\\x52\\x00\\x6d\\x22\\xb4\\xca\\xd0\\xff\\x9d\\x73\\x30\\xd7\\xe4\\xab\\xb2\\xe0\\x96\\x78\\x73\\x55\\x64\\x79\\x41\\x99\\x94\\xbd\\xcb\\xbe\\x57\\x6f\\x38\\x2d\\xb7\\xfa\\xd7\\xb5\\x0f\\x8e\\x73\\x88\\x5a\\x2a\\x7a\\x3f\\xb8\\xe4\\xaf\\x6b\\x3c\\x0e\\xae\\xf6\\x95\\xc1\\xe4\\xcd\\x39\\xf7\\xa9\\xfc\\x93\\xb0\\x6d\\x6f\\xa5\\xcc\\x38\\xc3\\x2c\\x78\\xcc\\x24\\x5c\\x19\\x9c\\x63\\x6c\\x81\\x52\\x2c\\x1c\\x45\\xcd\\x80\\x01\\x84\\xed\\xe2\\x79\\x91\\xa6\\x57\\x28\\x20\\x8c\\x29\\x1f\\x92\\x87\\x87\\xe1\\xcb\\x06\\xc7\\x23\\xa5\\x67\\x38\\x05\\xce\\x80\\x73\\xd8\\xf4\\xfd\\x65\\xa1\\xd2\\xf4\\xda\\x02\\x6f\\x57\\x65\\xaf\\xc1\\xea\\x70\\xb6\\xe7\\x74\\xc4\\x79\\xad\\xc0\\xd8\\x9f\\xc0\\x63\\x60\\x45\\x64\\xf4\\xd7\\x56\\x73\\x85\\x14\\x35\\x1a\\x67\\x0b\\xcc\\x69\\x03\\x3b\\x4b\\x66\\x6a\\x40\\x0b\\xd9\\x95\\x7d\\xfc\\xdf\\xb6\\x06\\xf4\\x77\\xac\\x01\\xfd\\xdd\\x8c\\x64\\x82\\xc0\\x66\\x3a\\xee\\x19\\x78\\x8f\\xfb\\x10\\xa3\\x11\\x42\\x00\\xc7\\xc0\\xc3\\x91\\x23\\x43\\x6f\\xaf\\xb4\\x0f\\xe4\\x2b\\x65\\x32\\x86\\x7f\\x9c\\x7c\\x05\\xb9\\x57\\xca\\x82\\x7b\\x85\\x05\\xf5\\x03\\xbd\\x72\\x89\\x2c\\xbc\\xbd\\x17\\x64\\x09\\xbb\\xec\\xfd\\x3f\\x4d\\x9f\\x2c\\x15\\x64\\x0b\\x09\\xc7\\xbd\\xc9\\xe0\\x7d\\xff\\x14\\x06\\x6f\\x2a\\x13\\x4c\\xd9\\x6b\\xbd\\x36\\x41\\xeb\\xdf\\x6a\\x2b\\x47\\x60\\x83\\x54\\x9a\\x06\\x6b\\x98\\x3c\\x2a\\xa4\\x6b\\x93\\x3b\\x60\\xad\\x77\\xed\\x36\\x9c\\x5d\\x37\\xf2\\x17\\xd7\\xa9\\x4f\\xdd\\x89\\x4f\\x7b\\x1d\\x5a\\x03\\xb6\\xad\\xb6\\xf5\\x1c\\x94\\xbb\\xd6\\x60\\x6f\\x6b\\xc0\\xb6\\x35\\x60\\xde\\x1e\\x51\\x6e\\xf5\\x3c\\x88\\xa5\\x6f\\x7d\\xce\\x63\\xb9\\x50\\x6e\\x12\\x69\\x9f\\x5a\\xd1\\x1e\\x6a\\xaf\\x98\\x59\\xd6\\x67\\x5a\\x1e\\x0d\\xe7\\xb3\\x0f\\xa0\\xea\\xad\\x1d\\x3a\\xcf\\xc4\\x86\\x77\\xf3\\xd9\\x34\\x68\\xad\\x9f\\xa4\\x81\\xb5\\x3f\\xce\\x87\\x0d\\xbf\\x3e\\xb8\\x44\\xd3\\xcf\\xfa\\x54\\x21\\xd0\\xf7\\xb5\\x29\\x51\\x3a\\x93\\xd1\\xdd\\xbb\\xe1\\x39\\xac\\x64\\x6b\\x47\\xc9\\x4b\\x53\\xc7\\x9a\\x77\\xdd\\x80\\xbb\\x6e\\x10\\xdd\\x3d\\x14\\x6f\\x8c\\x3b\\x89\\xb4\\x61\\x8d\\x7c\\x44\\xe2\\x7e\\x9f\\xee\\xfa\\xc9\\xe6\\x32\\x7b\\x80\\x67\\xd6\\x7b\\x71\\xd1\\xb1\\x13\\xbf\\xb4\\xd2\\x0e\\xbf\\xa6\\xb2\\x24\\x68\\x57\\xdc\\xd0\\x27\\x66\\x26\\x8a\\xb3\\xb9\\xc7\\xcc\\xa5\\x33\\x3c\\x65\\xe6\\x4a\\x59\\x4e\\x33\\x73\\x2d\\xa3\\xff\\xcc\\x9a\\x68\\x62\\xc4\\xd4\\x01\\x09\\x02\\x0e\\x20\\x71\\x47\\x96\\xf7\\x2d\\xee\\x31\\x6d\\xa0\\xc7\\xd4\\x08\\xfd\\xc1\\x96\\x7a\\xda\\xd1\\xf5\\x12\\x65\\x1e\\x1e\\x50\\x68\\x59\\xc3\\x7d\\x97\\x9b\\xdc\\xc3\\x8f\\xde\\x53\\xe9\\xc3\\xbb\\x11\\x7c\\xd6\\x4d\\x40\\x8a\\xd6\\x95\\x6e\\x2e\\xa8\\xf7\\x33\\xe9\\x16\\xfa\\x4c\\xf9\\x1a\\xda\\x19\\x13\\xfa\\xa4\\x0d\\xf4\\x77\\x76\\x90\\x69\\x28\\x60\\xe3\\xb3\\xee\\xe7\\xa4\\x6d\\x20\\xa1\\x60\\xad\\x46\\xf2\\xee\\x04\\x6b\\xf5\\x84\\x1e\\x55\\x58\\xab\\xc3\\x88\\xf1\\xcc\\xcf\\xc9\\x5a\\x3d\\x60\\x23\\x72\\x53\\x1d\\x08\\xd6\\xea\\x1b\\xa0\\xc4\\x0c\\xdd\\xc1\\xf5\\x4d\\xcd\\x0b\\xe9\\xbf\\x04\\x6b\\x35\\x1c\\x8c\\x58\\xab\\xe1\\x17\\xb2\\x56\\x53\\x89\\x7f\\xdb\\x17\\xfe\\x3e\\x29\\x0b\\xc7\\x78\\x08\\xfa\\xc0\\x43\\xd0\\xcf\\xc7\\x43\\x30\\xf3\\xfa\\xf6\\x48\\x5f\\x3e\\x49\\x64\\xe4\\xa0\\x5f\\x03\\x18\\xb2\\xd9\\x66\\x4e\\x34\\x13\\x8d\\xf4\\x2d\\x6d\\x4c\\x8d\\xe7\\x9d\\x67\\xba\\xc4\\x38\\xfe\\x7b\\x46\\x41\\x8d\\xb5\\x39\\xa0\\x6a\\x62\\x81\\x2e\\x3f\\x05\\x20\\x30\\x39\\x70\\x5a\\x1c\\x11\\x7a\\xe8\\x02\\x44\\xba\\xd3\\x04\\xbe\\x12\\x40\\xb2\\xc9\\x60\\x66\\xf6\\xf9\\x0c\\x6a\\x41\\xd4\\x3f\\x42\\xa3\\xb7\\x54\\x68\\x74\\x3c\\xa6\\x1c\\xca\\x9c\\xb5\\xa9\\x97\\xcc\\x64\\x2a\\x6e\\x47\\x9c\\xcc\\x15\\x8e\\x8f\\x06\\x77\\x07\\x0a\\xb1\\xe8\\xc2\\x48\\xbb\\xbf\\x36\\x5b\\x4e\\xa1\\xd7\\xec\\xf6\\x5d\\x2c\\xcb\\xbf\\xbf\\x1c\\x3e\\xdf\\x57\\x7e\\xd3\\x5f\\x2e\\x19\\x16\\xa3\\xb2\\xb2\\xbe\\x7a\\x68\\x8d\\x21\\xcb\\xf0\\x16\\x0e\\x39\\xa2\\x27\\x36\\x9a\\x91\\xb3\\x10\\x79\\x3a\\xa3\\x31\\xa0\\x8b\\xbd\\x7c\\xa6\\xf2\\xee\\xab\\x8c\\x54\\xff\\x36\\xee\\x3b\\xd1\\xba\\x08\\x53\\xba\\xaa\\x27\\xfe\\xdf\\xf1\\x5e\\x43\\x96\\xcb\\x66\\x44\\xb7\\xa1\\x24\\xba\\x1d\\x6b\\xb4\\xaf\\x61\\x8c\\xe8\\x76\\xfc\\x48\\x9e\\x57\\x7f\\x7d\\x9e\\xd7\\xd0\\xcc\\xf3\\x1a\\x63\\x64\\xbd\\x89\\x69\\xf7\\x47\\x36\\x02\\x56\\x4f\\xdd\\x50\\x30\\x5f\\x2d\\x81\\xd0\\xa7\\x32\\xb4\\x46\\xb0\\x7c\\x6d\\x2b\\x18\\xe4\\x3e\\xb7\\x0f\\xec\\x97\\x56\\x66\\xcc\\x47\\x7c\\x95\\xa9\\xba\\x6e\\xd1\\xed\\xc3\\x04\\x1d\\xaa\\xa4\\x57\\xc5\\x8f\\x11\\x50\\x97\\x32\\x60\\xc7\\xa7\\xcc\\xb2\\x77\\xab\\x3e\\xe7\\x0a\\x3d\\x11\\x98\\x6c\\x65\\x77\\x6d\\x0e\\xd2\\xa6\\x5a\\x4a\\x32\\x89\\xe2\\x4c\\xbe\\x31\\xea\\xf1\\x63\\xd7\\x0c\\x3f\\x90\\x10\\x1b\\xd6\\x22\\x14\\x05\\x1a\\xd1\\xe9\\x1a\\x34\\xa2\\x8f\\x20\\x09\\xad\\xca\\x3b\\xdf\\x88\\x09\\x54\\xe5\\xfc\\xd4\\xf9\\x40\\x73\\xd0\\x7e\\xfa\\x66\\xda\\xcf\\xb4\\xae\\x58\\x00\\x5d\\x7d\\x1d\\xd0\\x35\\xa5\\x05\\x2b\\xc6\\xaa\\xbf\\x39\\xed\\x27\\x27\\xf7\\x6c\\xa9\\x98\\x05\\x63\\xfa\\x03\\x62\\xb4\\x9a\\x0a\\xfa\\xa4\\xff\\x14\\xf6\\x9d\\x74\\x8c\\x45\\xab\\x09\\xe2\\x11\\x38\\x92\\xec\\xf6\\xde\\xf3\\xd1\\x59\\xdb\\x80\\x91\\x87\\xe0\\x72\\x63\\x78\\x47\\xff\\x3b\\xc2\\x3b\\xfa\\x9b\\xc1\\x3b\\xfa\\xff\\x00\\xbc\\xa3\\xe1\\x9a\\x8d\\x4c\\xa5\\xc8\\x82\\x65\\xd8\\xe2\\xf4\\x1c\\x7d\\x78\\x8f\\xc4\\xd7\\x1c\\x34\\x91\\x66\\x03\\x04\\x11\\x3a\\xcb\\x28\\x5b\\xbb\\x35\\x59\\xb4\\xec\\x11\\x9f\\x78\\x4a\\xca\\x45\\xd6\\x88\\x4f\\x5e\\x80\\x16\\xcc\\x8e\\xf8\\x14\\x65\\x48\\x3b\\x35\\xe2\\xb3\\xcd\\x35\\xd6\\x34\\x96\\xc7\\x66\\x2e\\x35\\x70\\xda\\xc4\\xcd\\x28\\x8f\\x16\\x78\\x25\\x87\\xe9\\x9d\\xd4\\x02\\xaf\\x52\\x22\\x39\\xaf\\x1c\\x74\\x60\\xbd\\x05\\xe3\\xf8\\xf6\\x2d\\xd7\\x55\\xb6\\xcb\\x55\\x96\\x8c\\x2d\\x39\\x1a\\x1a\\x76\\x26\\x26\\x0b\\xab\\x58\\x04\\x99\\xc4\\xc0\\x8c\\xa8\\x80\\xc1\\x30\\x8c\\xf8\\x56\\x72\\x0d\\x02\\xe7\\x6e\\xd9\\x2f\\xc6\\xfc\\x01\\x04\\x04\\x52\\xd3\\x71\\x3a\\x58\\x04\\x12\\x39\\xd3\\xe8\\x60\\xb6\\xee\\x9c\\xfa\\xf5\\x4f\\x35\\xdc\\x8e\\x21\\x98\\x87\\xde\\xd9\\x25\\x15\\xb8\\xe9\\x72\\xff\\x8d\\x45\\x61\\xd6\\x75\\xa5\\x8c\\xde\\xa8\\x38\\xf2\\xdb\\x8f\\x54\\x54\\xab\\x33\\x07\\xfb\\x75\\xa8\\xa4\\xc1\\x15\\xa9\\xa8\\x33\\x88\\xfd\\x66\\x92\\x0a\\xfd\\x57\\x43\\x2a\\xc8\\x58\\x9d\\x72\\x6d\\x57\\xab\\xc3\\x7e\\xa7\\xd7\\x49\\x5e\\x27\\xbb\\x4e\\xf2\\x3a\\xb1\\xbe\\x29\\x21\\xb3\\x1d\\x7f\\x34\\xa0\\x5b\\x57\\xb8\\xec\\xd0\\x11\\xbb\\xbe\\x2e\\x96\\x4b\\x84\\xfe\\xd5\\x08\\x7e\\x0b\\x76\\xf1\\x6b\\x77\\x37\\xf6\\x1d\\x4a\\xd4\\x40\\x5c\\x14\\x0d\\xdc\\x4a\\x28\\xcf\\x18\\x80\\x42\\x94\\xda\\xce\\x02\\x3f\\xe8\\x92\\x10\\x52\\x09\\x92\\xce\\x63\\xb6\\xf5\\x57\\xea\\x90\\xa7\\xbe\\x5f\\x23\\x48\\x93\\xc9\\x7e\\xfd\\x08\\xf9\\xf4\\xd5\\x3f\\x74\\xc1\\x1f\\x4e\\x23\\x56\\xde\\xd4\\x98\\xf6\\xa5\\x29\\xc5\\xbe\\xb7\\x5e\\x65\\x14\\x23\\x40\\x31\\xf4\\xfc\\x84\\x6e\\x3c\\xbd\\xed\\x54\\x34\\x7c\\xbc\\x96\\x39\\x01\\x10\\xa4\\x27\\x68\\x67\\x67\\x87\\xbd\\xf0\\x48\\xb3\\xc9\\x19\\x12\\x0a\\x57\\x85\\x5d\\x7e\\xa4\\x47\\xbb\\xe2\\xd0\\x05\\xda\\xdd\\x2d\\xfc\\x55\\xa8\\x14\\xae\\xb6\\x4a\\x5b\\xa5\\x08\\x5b\\x2c\\xb0\\x44\\x88\\xb0\\x2c\\x22\\xc4\\x09\\x8c\\x90\\xf3\\x14\\x64\\x41\\x63\\x1d\\x89\\x35\\x08\\xe5\\x68\\x45\\xe6\\x41\\x85\\xa9\\xff\\x6a\\x67\\xa7\\xad\\xbb\\xd3\\x39\\x37\\xed\\x3e\\x15\\xe8\\xf9\\x9f\\xab\\x39\\xdc\\x8b\\xa3\\x71\\xbd\\x89\\xc9\\xe3\\x7b\\x3f\\xc5\\x42\\x06\\xa2\\x53\\xe5\\x44\\x30\\x81\\x68\\xb6\\x44\\x9b\\x64\\x7f\\x10\\xd5\\xe8\\x7e\\xfb\\x43\\x03\\x5a\\x64\\x8f\\x07\\xba\\x39\\x8d\\x3f\\xc9\\x3e\\x7d\\x92\\xea\\x93\\xe8\\x24\\x70\\x1d\\xb5\\xca\\xba\\xd5\\x44\\xc1\\x82\\x14\\x82\\xa2\\xe9\\xe9\\x1a\\x21\\x23\\x6d\\x4f\\x41\\x0c\\xe6\\x2a\\xd6\\x46\\x30\\x69\\x86\\x51\\x7c\\x6e\\x73\\x91\\x9d\\x91\\xda\\x5c\\x66\\x67\\xa4\\x4e\\x0a\\xe4\\x88\\x85\\x7c\\x0e\\x63\\x38\\x5c\\xb0\\x34\\x0b\\x03\\x52\\x89\\xfb\\xde\\x1b\\x92\\xaf\\xb6\\x06\\x4f\\x59\\xee\\x3e\\x2d\\xe1\\x79\\x6f\\xf1\\x15\\xf9\\x9a\\xb3\\xd2\\xd6\\xaa\\x3e\\xdb\\xa1\\xbd\\x9e\\xd3\\x92\\x5c\\xaf\\x20\\x0e\\x2c\\xe8\\xe2\\xec\\xc3\\x97\\x25\\x5d\\x9c\\x7d\\xf6\\x2c\\xda\\xde\\xef\\x7b\\x43\\xba\\xef\\x38\\x68\\x59\\x7b\\x05\\x19\\x98\\xc1\\xb0\\x73\\x14\\x42\\xea\\xf1\\x07\\x78\\x98\\x90\\x97\\x71\\x47\\x65\\xd0\\xd1\\x1d\\x13\\x7a\\x99\\xb3\\xec\\xe1\\xa1\\x35\\x6a\\xce\\x41\\x80\\xde\\x13\\x5f\\x4e\\x98\\x40\\x4d\\xb7\\xaf\\xc9\\x28\\x0c\\x3f\\xd1\\x6d\\x38\\x50\\x2b\\x7e\\xce\\x59\\xf1\\x92\\xee\\xa2\\x54\\x91\\xfc\\x86\\x9b\\x2a\\x60\\xe3\\xf9\\x82\\x7e\\xd7\\x75\\x85\\xa1\\x21\\x10\\xf8\\xa3\\x74\\xd5\\x82\\x5d\\x7f\\xe0\\x8c\\x63\\xc5\\xc0\\x08\\xd1\\xe5\\xd0\\xa4\\xe5\\xd2\\xaa\\xda\\x74\\xbe\\xb1\\xb5\\xc8\\x17\\x4b\\x54\\x0b\\xa3\\x98\\xfb\\x44\\xe1\\x02\\xae\\x88\\xc1\\x62\\xeb\\x96\\x38\\x86\\x3f\\x50\\x2d\\xf2\\xcd\\xd1\\x77\\x54\\x9c\\xa6\\xcf\\xef\\x8d\\x16\\x7f\\x27\\x52\\xd7\\x4c\\x31\\x74\\xb1\\xf2\\xc2\\xcb\\xac\\x67\\xbb\\x25\\x92\\xef\\xb4\\x3a\\x52\\x07\\x4b\\x4f\\x91\\x33\\xd4\\x99\\xcf\\x60\\xb7\\xc4\\xac\\x02\\x7d\\x3d\\x85\\xf4\\xdb\\xb1\\x21\\x7c\\x15\\x8f\\x27\\x0f\\xe3\\xa8\\x14\\x5c\\x4b\\x3c\\x22\\x9f\\xcc\\x0f\\x0f\\xdb\\xca\\xfc\\x4d\\x99\\xda\\x44\\x99\\xc7\\xcd\\x5a\\xf5\\x4d\\x2c\\x96\\xd1\\xf8\\xec\\xae\\xd9\\xec\\x68\\xd2\\x07\\xce\\xa6\\x03\\x61\\xf3\\x80\\x1d\\xa0\\x4f\\xbe\\x96\\xf9\\x70\\x9b\\xab\\xb4\\xe7\\xf4\\x64\\x77\\x11\\xc5\\x49\\x7e\\xff\\x1b\\x31\\x07\\xff\\x3e\\xd5\\x9d\\x28\\x91\\xbc\\xdf\\xed\\x56\\xb8\\x82\\xd2\\xe3\\xcc\\xd1\\x29\\x13\\xfc\\x89\\x6f\\x0b\\x62\\x78\\x13\\x77\\xb5\\x7e\\x77\\x71\\x69\\xff\\x3d\\x81\\xaa\\xf2\\xc1\\x0e\\x44\\xfe\\x3b\\x00\\x91\\x7f\\x4c\\x01\\x22\\xff\\xdd\\x04\\x44\\xfe\\x3b\\x18\\x05\\x0c\\xb6\\x1d\\x54\\x24\\xb9\\x94\\x6e\\x82\\x51\\x91\\x06\\x9a\\x28\\xa7\\xfb\\x93\\x77\\xbc\\xb3\\x73\\xb2\\xb3\\x73\\x7e\\x70\\x5d\\xab\\x58\\xd5\\x80\\x4c\\x25\\x40\\x6e\\xaa\\xdf\\x16\\x15\\x86\\x01\\x4b\\x96\\x15\\x86\\x02\\x4b\\x20\\xc6\\xbf\\xc2\\xa0\\x57\\x57\\x4c\\x5c\\x97\\x00\\xdb\\xc7\\x2a\\x8a\\xfa\\x27\\xfb\\x45\\x17\\x2b\\x1d\\x51\\x5d\\xc8\\xc6\\x0b\\x00\\x55\\x2a\\xd5\\x0e\\x4e\\x1f\\x1e\\xae\\x9d\\x0f\\xcf\\x96\\xbb\\x1f\\x30\\x40\\x2b\\x09\\xdd\\x4a\\x1f\\x42\\xf1\\xc3\\x33\\xa7\\xbc\\xbb\\xb4\\x15\\xa8\\x55\\x4e\\x11\\x52\\xfd\\x03\\x15\\x84\\x07\\xa2\\x7f\\x27\\x39\\xfb\\xb7\\x5c\\xa9\\xd8\\xe9\\x02\\x05\\xe6\\x8c\\x36\\xf8\\x11\\x01\\x60\\x86\\xa2\\xc1\\xf3\\x9c\\x0d\\xc2\\x98\\x45\\x6d\\xce\\xa3\\x36\\x2f\\x1e\\x1e\\xde\\x03\\x5d\\x77\\x2a\\x18\\xfa\\xc3\\xc3\\x20\\x76\\x7a\\xa0\\x9e\\x7e\\x12\\x24\\xf5\\x38\\x52\\x7a\\x1c\\x49\\x3d\\x8e\\xb4\\xae\\x22\\xb9\\xa7\\xf6\\x6e\\x67\\x47\\xfe\\x1c\\xe8\\xd7\\x1f\\x24\\xae\\xaf\\x1d\\x21\\x83\\xc4\\xf5\\x07\\xe6\\xeb\\xb3\\xc4\\x44\\xad\\xf3\\xae\\x72\\xdb\\x7a\\xb1\\x41\\xac\\xd8\\x20\\x5e\\xac\\xe9\\x35\\x1f\\x1e\\x42\\xd0\\x9e\\xe8\\xb8\\xd3\\x75\\x06\\xc2\\x00\\xab\\x2c\\xaf\\xe7\\x77\\xab\\x33\\x8f\\xab\\xfa\\x1a\\x54\\xcf\\x9f\\x54\\x3a\\x5e\\xdf\\x97\\xc7\\x5b\\x52\\x93\\xe2\\xfa\\x90\\xa5\\xf2\\x67\\x1c\\x20\\xfe\\xb3\\x72\\x08\\xbc\\x7d\\x5f\\x14\\xb5\\x0a\\xbc\\x7d\\x7f\\x68\\x41\\xdc\\x80\\x75\\x12\\xfa\\x7c\\xb3\\x27\\xaf\\x21\\x33\\x20\\xd5\\xc7\\x27\\x84\\x88\\xac\\x72\\x9a\\xf2\\x46\\xfe\\xd8\\x08\\x6d\\xfe\\x3f\\xd9\\xf8\\xf0\\x7e\\xab\\xe3\\x0b\\xe9\\xbe\\x9f\\x40\\x86\\xd7\\x15\\x16\\xad\\xac\\x05\\x13\\xfe\\x43\\x1c\\x3f\\xfb\\xe3\\xcb\\xd2\\xc1\\xc7\\x4a\\x89\\x0e\\x63\\x52\\x7f\\xbb\\x8f\\x90\\xe1\\x63\\x6d\\x33\\x4c\\x78\\xf2\\xd6\\xdb\\x2e\\xf1\\x48\\xe7\\xf5\\x44\\x31\\x3b\\x34\\xbc\\x99\\x51\\xb3\\xef\\xd3\\xa5\\xa9\\xfa\\x97\\x71\\x5a\\xd9\\xd4\\x3e\\xbf\\xf8\\xb3\\x45\\x59\\xc4\\x53\\xe4\\xaf\\x44\\x16\\xd3\\x5f\\x76\\x6c\\x70\\x55\\xd9\\xc2\\x9b\\xc0\\x29\\x8b\\xbb\\x10\\xd7\\xbb\\xe2\\xd9\\x3a\\xc6\\xfb\\xc0\\x73\\x2b\\xb8\\x52\\x3c\\x88\\xfb\\x1d\\x29\\xf0\\x37\\xa0\\xb2\\x15\\x8d\\x9e\\xaa\\x0c\\x1b\\x0d\\x48\\x3d\\xee\\xcc\\x89\\xab\\xb8\\x6b\\x14\\x36\\x69\\xca\\x31\\xe5\\xfa\\x05\\xdb\\x64\\x7f\\xf0\\xfe\\x8a\\x9b\\x29\\x54\\x41\\xda\\xfa\\x50\\xb3\\x36\\xdb\\x6b\\xfa\\x3d\\x8f\\xa5\\xac\\x24\\x2c\\x65\\xd5\\x1f\\x6c\\x64\\x01\\x96\\x11\\x53\\xfa\\xc2\\xbc\\x34\\x29\\x03\\x66\\x28\\xbb\\x2e\\x12\\x4a\\x13\\x10\\xd1\\xa1\\xbb\\xa0\\x36\\x73\\xd8\\xf6\\x16\\x60\\xa2\\xab\\xc7\\x74\\xf0\\x76\\xe9\\x5e\\x5c\\x0e\\x1a\\xa3\\x90\\xde\\x18\\xb8\\x66\\x4d\\xa3\\xc9\\xb2\\x04\\xf0\\x29\\x02\\x97\\xa7\\xa1\\xc4\\x10\\x00\\xdc\\xa3\\x2b\\x01\\x9f\\xf0\\x0f\\x86\\xb9\\xce\\x8f\\xa4\\x3c\\x50\\xfb\\x1c\\xdd\\x82\\xca\\xe9\\xa9\\x06\\xc6\\x81\\x09\\x0d\\x03\\x33\\x30\\x0e\\x8c\\xec\\xe8\\x0f\\x39\\xd0\\x46\\x94\\xf5\\x9e\\x2f\\xf4\\x90\\xb4\\x93\\x38\\x0c\\x80\\xdf\\x20\\x37\\xc4\\x4f\\x0e\\x47\\x43\\x05\\x7c\\xb8\\x00\\x86\\x65\\x23\\x7a\\x37\\x74\\x26\\x65\\x4c\\xf0\\x1a\\x19\\x09\\x18\\x8f\\x1c\\x95\\xbf\\x69\\xba\\x20\\xfa\\xf9\\xa7\\x60\\x80\\x1a\\x45\\x1b\\x2c\\x90\\x53\\x7f\\x26\\x7e\\x5f\\x91\\x1f\\x4b\\x80\\x34\\x48\\xc5\\xad\\xe6\\x68\\xbc\\x44\\xff\\xfc\\x40\\x7c\\xf5\\xbd\\x21\\xff\\xba\\x02\\x0c\\x22\\xc5\\xe1\\x2f\\x46\\xc9\\xe0\\xef\\xdf\\x18\\xf5\\xdf\\x8a\\xe1\\xa2\\x45\\xf0\\xbf\\x88\\x47\\xf0\\x9b\\xa1\\xff\\x93\\xc7\\x86\\x86\\x63\\x16\\xb8\\xff\\x85\\x15\\xeb\\x7f\\x69\\xc5\\xf9\\x87\\x07\\xf2\\xf0\\x50\\xb6\\x42\\xfd\\x4f\\xbb\\xf5\\x31\\x2d\\x50\\xe0\\x56\\x3c\\x1d\\xf6\\x9f\\xfe\\xe3\\xb0\\xff\\x46\\xaf\\xfb\\x70\\x34\\x3b\\xc4\\xd9\\xbc\\x12\\xf8\\xff\\x7b\\x65\\x72\\x0f\\xdf\\x0e\\xa1\\xd6\\x2b\\xf8\\x76\\xe4\\x25\\x9d\\x55\\xfb\\x2f\\x56\\xe4\\x98\\x0d\\xef\\x09\\xfb\\x38\\x65\\x1f\\x67\\xec\\xe3\\x9c\\x7d\\x5c\\xb0\\x8f\\xd7\\xd0\\xcc\\x1b\\x3d\\xe8\\xe1\\x69\\x12\\x11\\xd4\\xac\\x83\\x4b\\xe8\\xf1\\x15\\x06\\x58\\xa0\\xdf\\xe7\\x9d\\x31\\x66\\xe1\\x0d\\xb9\\x02\\x0c\\x85\\xeb\\xf2\\xcf\\x64\\xff\\xc5\\xcf\\x35\\x43\\x22\\xc2\\x9b\\xfc\\x8e\\x6a\\x08\\xd5\\x99\\x7a\\x43\\xff\\x4e\\x0d\\x79\\xc0\\x04\\xcb\\x14\\x62\\x80\\x28\\xa1\\x7d\\x34\\xd8\\xbb\\x9b\\x04\\x33\\x5f\\xcd\\x1c\\x97\\x8b\\x96\\x14\\x86\\xa4\\x98\\x4b\\x65\\x35\\xb9\\xec\\xa6\\xd2\\x07\\xb8\\xe8\\x28\\x59\\x31\\xfc\\x59\\x1b\\x21\\x02\\x38\\x9e\\x5a\\xe8\\x8a\\x35\\x75\\x83\\x3b\\xca\\x84\\x09\\xf3\\x66\\xee\\x4f\\x96\\x1f\\xb1\\x5f\\xf4\\x5d\\x31\\x76\\x2b\\x92\\x72\\xd4\\x7e\\x02\\xc7\\x09\\xc6\\x38\\xf1\\x95\\xd8\\xc0\\xa4\\xd0\\x82\\xbd\\x7a\\x45\\xde\\x98\\x43\\x2f\\xf8\\x42\\xad\\xce\\xde\\x5b\\xaa\\x06\\xf3\\xb1\\x8f\\xdd\\x9d\\x23\\x54\\x7e\\x34\\x59\\x08\\x43\\x29\\xfb\\xc1\\x82\\x23\\x0c\\x57\\x01\\x18\\x82\\x27\\xbb\\x48\\x99\\x05\\x45\\xfc\\xef\\xa0\\x62\\xb0\\x86\\xeb\\xa7\\x53\\x31\\x58\\xe3\\x15\\x70\\x20\\x52\\xab\\x5a\\x23\\x34\\x32\\x58\\x1c\\x8e\\x93\\xf5\\x8e\\xf3\\xb0\\x38\\x9c\\x24\\xeb\\x9d\\x44\\x5d\\x4d\\xaf\\x7b\\x9e\\xac\\x7b\\x9e\\x83\\x01\\xe2\\x34\\x59\\xed\\x34\\x07\\x03\\xc4\\x59\\xb2\\xda\\x59\\xd4\\xd3\\xd4\\xaa\\x17\\xc9\\xaa\\x17\\xff\\x00\\x79\\x04\\x56\\xc3\\x37\\x64\\xed\\xa4\\x96\\x1c\\x9c\\x0e\\xd6\\x24\\x1c\\x1c\\x9f\\xc3\\xd4\\xba\\xd6\\x7c\\x18\\xce\\x77\\xf1\\x0e\\x12\\x44\\xd7\\x4e\\x18\\xcb\\x20\\xcb\\xb0\\x66\\xd2\\x64\\x91\\x65\\xdc\\x27\\x2b\\xde\\xcb\\x8a\\x19\\x04\\x97\\x87\\xc9\\xba\\x87\\xb2\\x6e\\x7a\\xd2\\xd0\\x51\\xb2\\xea\\x91\\x0c\\x9e\\xca\\xb8\\xec\\xab\\x64\\xdd\\x57\\x19\\xd9\\x58\\xd6\\xfc\\x36\\x6b\\xca\\x97\\x31\\xc4\\x26\\x9e\\x08\\x61\\x4d\\xa3\\x30\\x66\\xc6\\xc5\\x6b\\xb3\\x05\\x0c\\x0c\\xb8\\xeb\\xe4\\x0a\\x99\\x5b\\x01\\xa9\\x6c\\xad\\x54\\xbb\\x78\\x33\\x8f\\x24\\xdc\\xc8\\xc1\\xb8\\x91\\x9f\\x72\\x63\\x0d\\xce\\x0d\\x1b\\xe9\\x46\\x56\\x04\\xd5\\xd5\\xff\\x49\\xde\\xd1\\x95\\x57\\x27\\x22\\xe0\\xe7\\x2a\\x33\\xa4\\x2b\\x3f\\xca\\x5c\\x0e\\xaa\\xd8\\xcb\\x64\\x6f\\x2e\\x69\\x6f\\x30\\xee\\x06\\x00\\x96\\xa8\\x7c\\x5c\\xce\\x8d\\x57\\xc7\\x95\\x9a\\xdc\\x49\\x2f\\xcb\\xe8\\xad\\x94\\xe1\\x4e\\x47\\x4a\\xd2\\xcb\\x74\\x67\\x47\\xfe\\x6c\\xb9\\x64\\xa6\\xfc\\xf4\\x5d\\x32\\x56\\x7e\\x76\\x10\\x0b\\x46\\xfe\\xec\\xba\\x64\\x19\\x53\\x94\\x97\\x4c\\xd8\\x3b\\xcd\\x4c\\x98\\x39\\x15\\xe4\\x8e\\x16\\xf7\\x4e\\x9f\\x9c\\x02\\xe0\\xf0\\xb9\\xd5\\xbd\\x13\\x62\\x01\\x5b\\xc2\\x0c\\x80\\xc9\\xdd\\x1f\\x9c\\x8a\\x4c\\x99\\xca\\xa9\\x05\\xa2\\xe6\\x3e\\x2d\\x99\\xe6\\x56\\x24\\xd3\\x9c\\xd0\\xfb\\x4a\\x26\\xd3\\x1c\\xd3\\xa3\\x4a\\x32\\xcd\\x6d\\x14\\x19\\x6c\\xc3\\x82\\x8b\\x27\\xd3\\xdc\\xb1\\xd1\\xba\\xa8\\xde\\x89\\x64\\x9a\\x0b\\x08\\xbb\\xbf\\x75\\xef\\xae\\x2f\\x6a\\xde\\x2d\\xfd\\x97\\x48\\xa6\\x81\\x83\\x51\\x32\\x0d\\xfc\\xc2\\x64\\x1a\\x67\\xb9\\xb3\\x23\\xc0\\xf3\\xe0\\x9b\\x95\\x1f\\x24\\x32\\x8c\\xb1\\xc2\\x54\\x47\\xe7\\x4e\\x1c\\x6b\\x0e\\xce\\x69\\x2c\\x47\\xde\\xa8\\x54\\x57\\x4f\\x33\\x93\\x74\\xa8\\x6a\\xdb\\xdc\\x63\\x32\\x24\\xea\\xb4\\x4d\\xc1\\xcf\\xcf\\xa6\\xc2\\x6b\\xef\\x34\\xcb\\xe2\\xaf\\xa7\\xf0\\x2c\\x6b\\x54\\x02\\xf7\\x5e\\x6f\\x6e\\xf6\\x67\\xb9\\x00\\x8a\\xf6\\xd1\\xdc\\x0b\\x5a\\xa0\\xab\\x5f\\x7a\\x6f\\x34\\x6b\\xff\\x95\\x84\\xe5\\x63\\xd6\\x7e\\x08\\x99\\x8b\\x63\\x87\\x98\\xaf\\xa8\\x43\\x82\\x33\\xeb\\x1f\\xae\\xe8\\xfe\\xa4\\x88\\xf1\\xcf\\xd3\\x88\\x18\\xe6\\x32\\xdd\\xf8\\xbf\\x50\\x30\\x9a\\x33\\x8a\\x2e\\xf3\\x17\\xe5\\x43\\xc1\\xf3\\x8b\\x32\\x0a\\x03\\xda\\xb8\\x3f\\x05\\x14\\xd2\\x4b\\xfa\\x96\\x4c\\xf3\\x55\\xa2\\x13\\x7e\\x96\\xaf\\xa4\\x96\\xea\\x34\\xdf\\xd9\\xb9\\xd2\\xcc\\xfb\\x4b\\x05\\x8a\\x38\\xdd\\xf1\\x71\\xc6\\x73\\x70\\xc8\\x84\\xbd\\x5f\\x6f\\xbd\\xb3\\x6a\\x9b\\xa7\\xd5\\xbc\\x05\\xfc\\xbe\\x8c\\x64\\x9f\\x25\\x5f\\x14\\xda\\x2e\\xe9\\xb1\\xfc\\xa8\\xb6\\x9a\\x1f\\x85\\xc7\\x94\\x43\\x99\\x8b\\x54\\xea\\x25\\x33\\xf3\\xa3\\x7a\\xd2\\x77\\xb3\\x7a\\x9d\\x71\\xe3\\xbd\\xc8\\xe3\\xd3\\x4b\\x66\\x14\\x9d\\xc9\\x8c\\xa2\\x73\\x97\\x47\\x23\\xc7\\x17\\x2a\\x2d\\x64\\x15\\x8b\\x3c\\x3c\\x0c\\x84\\x01\\x3f\\xc5\\x52\\xbe\\xbd\\x44\\xae\\x27\\xb9\\xb4\\xc5\\xef\\x58\\x9b\\x65\\x62\\x94\\x53\\x48\\x8c\\xd4\\x65\\x32\\xca\\x61\\xd2\\xdb\\x34\\x4e\\xc6\\xa4\\x3f\\xc9\\xe8\\x4d\\x62\\x2f\\x7a\\xc4\\x3d\\xf1\\xce\\xcb\\xd3\\x76\\x6c\\x81\\xa3\\x85\\xf0\\x6c\\x06\\xeb\\xf0\\xbb\\x7c\\x98\\xee\\x51\\x6b\\xd8\\x23\\x00\\xe6\\x34\\x5f\\xcf\\x7e\\x39\\xc6\\xe1\\xf2\\xde\\xc2\\x1a\\x61\\xbd\\xa4\\xdd\\x9d\\x55\\x72\\xc9\\xfb\\xd4\\xad\\x04\\x17\\xb2\\xa6\\x3f\\x9e\\x41\\xc8\\xe7\\x34\\x1c\\x8d\\xc1\\xf1\\x6e\\x80\\x0a\\xe2\\xcf\\xff\\x7d\\x38\\x9f\\xc2\\x15\\x71\\xe1\\xad\\x6c\\xd1\\xeb\\x6b\\x5d\\x03\\xf2\\x8a\\xa1\\x12\\xdd\\xab\\x92\\x51\\x0c\\x95\\x08\\xde\\x0c\\x22\\x8b\\x91\\x33\\x54\\xdd\\xce\\xcf\\x78\\xcf\\x76\\x95\\xee\\xba\\x59\\x24\\x16\\x5a\\x1b\\x65\\x6b\\x1b\\x29\\x0e\\xb0\\x88\\xd8\\x77\\x6b\\xc0\\x83\\x5c\\x6c\\xc3\\x6c\\x1c\\x5a\\xf1\\x02\\x3c\\x3c\\x28\\xc9\\x73\\x5e\\x94\\x3c\\x87\\xfd\\xb1\\x9d\\x94\\x9d\\x3c\\x28\\x55\\xca\\x2b\\x14\\xf1\\x9c\\x16\\x87\\x65\\x1f\\x32\\x4c\\x76\\x2a\\xeb\\xf1\\x4f\\xf7\\x40\\x7e\\xab\\x88\\x85\\x8c\\x96\\x6c\\x7e\\x82\\x63\\x9f\\x9d\\xb3\\xe7\\xe5\\x52\\x89\\x80\\xa8\\x03\\x85\\x40\\x9f\\x71\\x8a\\xe7\\x30\\x35\\xf4\\xe5\\x79\\x91\\x73\\x79\\x86\\x35\\x6d\\xa4\\x86\\x70\\xc3\\x4b\\x28\\x92\\x2b\\x51\\xfa\\x74\\x7c\\xde\\xd3\\x91\\xe8\\xa9\\x2f\\x7b\\xea\\xdb\\x7b\\xfa\\xc5\\x39\\x7f\\xfe\\xe3\\xcf\\xb1\\x8e\\x9e\\x25\\x3b\\xaa\\xee\\x23\\x78\\x59\\xdf\\x45\\x29\\xd7\\xe9\\x80\\x60\\x87\\x32\\x0f\\x4b\\x34\\x8d\\xc6\\x4b\\xae\\x9f\\xdf\\x7b\\xd5\\xbc\\xd4\\x7a\\x1a\\xed\\x9c\\xd9\\x3b\\xec\\x24\\x68\\xcc\\xa1\\xfd\\xcf\\x85\\xf8\\xfd\\xc6\\xce\\x6e\\xf0\\x70\\x36\\x5a\\xaf\\x3b\\x2e\\x2a\\x0b\\x4e\\x57\\x19\\xd5\\x65\\x34\\xaa\\x23\\x31\\xaa\\x7f\\xc3\\x5e\\xf4\\xf8\\x51\\xfd\\x92\\x3a\\xaa\\x5f\\x32\\x25\\x12\\x67\\x7e\\x70\\x56\\x29\\x76\\x99\\x3b\\xcc\\xe5\\x84\\x15\\x1b\\x0e\\x6c\\x17\\x53\\x98\\x37\\xca\\xe6\\xbd\\x95\\xd9\\xbc\\x0b\\x2d\\x9b\\xf7\\x36\\x96\\xcd\\xbb\\x78\\x64\\x36\\xef\\x72\\xfd\\x6c\\xde\\xdb\\xec\\x6c\\xde\\xf5\\xb3\\x19\\xc1\\x72\\xad\\xa4\\x33\\xc6\\xd9\\x99\\x75\\xb1\\x3f\\xee\\x79\\xd0\\x0c\\xf3\\xfc\\x24\\x3c\\xf5\\x05\\x9e\\x8b\\xcc\\xf4\\xea\\x6e\\xf4\\x54\\xd7\\x58\\x5a\\xae\\x01\\x3b\\xa1\\x9c\\x45\\x19\\x23\\x62\\x4d\\x35\\xfd\\xee\\xa3\\x00\\xc7\\xa7\\x88\\x06\\x7f\\xce\\xa4\\xd7\\xbf\\x61\\x54\\xd8\\x35\\x51\\xfc\\xed\\xf0\\x01\\x2a\\x32\\x71\\xd8\\x25\\x41\\x94\\x8f\\x8a\\xc5\\x5c\\x73\\xb2\\xec\\xa1\\x74\\x23\\x93\\x57\\xde\\x28\\xf2\\x28\\x1b\\x95\\xdf\\xbb\\x60\\xd6\\xdd\\x02\\xe9\\x25\\x3d\\x97\\x9c\\x17\\xd7\\xf3\\xc9\\x19\\x53\\x99\\x9a\\x4d\\xce\\x8f\\xb4\\x0d\\x39\\xe7\\x9d\\xe8\\x98\\xba\\xe6\\x60\\x86\\x81\\xed\\x4c\\x60\\xca\\x53\\xef\\x59\\xf3\\xd4\\x5f\\x70\\x67\\xf7\\xbf\\x5f\\xac\\x48\\x9f\\x39\\x59\\x43\\xf6\\x31\\xb0\\x79\\xbb\\xad\\xaa\\xbc\\xc4\\x97\\x2b\\x93\\x09\\xb8\\x50\\xa7\\xf0\\x6f\\x06\\xff\\x38\\xc0\\x5c\\x3c\\xa5\\xfd\\x8e\\x5d\\x69\\xa1\\x3b\\x74\\x73\\x66\\xaa\\x93\\x25\\xab\\x7d\\x0f\\x8e\\xda\\xaa\\xec\\x12\\xdd\\xb2\\x79\\x7f\\x46\\x80\\x7c\\x20\\x28\\xe1\\xd8\\xed\\x16\\x98\\x7c\\xf0\\xbe\\xde\\x82\\x9c\\x0d\\xa7\\x5c\\x82\\xdc\\x0e\\x5e\\x64\\x7e\\xc0\\x11\\x28\\x2a\\x9c\\x3f\\x2e\\x51\\x94\\xf3\\xcc\\x15\\x16\\x40\\xbd\\xc1\\xbf\\x2f\\x01\\x99\\x83\\xa7\\xcc\\x67\\x64\\xc5\\xb7\\x54\\x3e\\x1c\\x91\\x14\\x9f\\x2b\\x9f\\xde\\x37\\xd5\\x44\\x55\\xe1\\x90\\xbc\\xb2\\x40\\xe3\\x2d\\xc8\\xbd\\x4b\\x8e\\xbf\\x4f\\x52\\xfd\\xc9\\xdf\\x9b\\x54\\xaf\\xb8\\xd4\\x17\\x74\\x57\\x10\\xd9\\x9e\\xcd\\x28\\x67\\xbc\\x4d\\xbf\\x2e\\x0e\\xe9\\x03\\xc1\\xec\\xf1\\x25\\x7e\\xf3\\x59\\x1e\\xf9\\xec\\xb3\\xd7\\xe1\\xdf\\xbe\\x78\\x5d\\x25\\x8d\\x3c\\xf8\\xee\\xbc\\x38\\x56\\xcf\\x44\\xba\\x0f\\xd6\\xea\\x4c\\x05\\xff\\xc9\\x31\\xdc\\xd1\\xda\\xa0\\x7d\\xa2\\xa6\\xd5\\x17\\x67\\x85\\x2e\\xcb\\x4e\\x78\\xb7\\xa2\\xfd\\x41\\xd5\\xcf\\xf0\\x28\\xd6\\xf6\\x1b\\x42\\xcd\\x2f\\x69\\x35\\xad\\xae\\xc3\\x3c\\x59\\xf2\\x56\\x27\\x5e\\x3a\\x26\\x80\\xd5\\x7d\\x97\\xe5\\x8f\\xb0\\xba\\xe1\\xb2\\xb2\\xf2\\x83\\xef\\x98\\x95\\x1f\\x6c\\x96\\x95\\x1f\\xfc\\x03\\x59\\xf9\\x86\\x6b\\xaa\\x3d\\xfe\\xfc\\xf8\\x2e\\x67\\xf6\\xf8\\x53\\x37\\x98\\x6e\\xb1\\x55\\x60\\x8b\\x7e\\x63\\x56\\xed\\x16\\xd9\\x1a\\xcf\\x67\\x9c\\x7c\\x92\\xf6\\x77\\x36\\xda\\x02\\xa3\\xc1\\x96\\xb8\\xa9\\x82\\xd2\\xc9\\x2f\\xff\\x4f\\x77\\x32\\xdd\\x41\\x68\\x82\\xa4\\xb0\\x3b\\x08\\xf1\\x14\\xe9\\x65\\x39\\x08\\x79\\x01\\x5a\\x30\\xdb\\x41\\x28\\xca\\x90\\x5e\\xaa\\x83\\xb0\\x27\\x1c\\x84\\xd8\\xf2\\x61\\x18\\x74\\x86\\xa9\\x8b\\x88\\x39\\x88\\x20\\x12\\x08\\xea\\x71\\x81\\x20\\xcb\\x6d\\x18\\x0f\\x67\\x69\\x60\\x38\\x4b\\xd2\\x6d\\x48\\x55\\x38\\xa6\\xf6\\x0e\\x40\\xa6\\x90\\x5f\\xbb\\xf2\\xeb\\x93\\x60\\x22\\x8c\\xeb\\x93\\x3e\\x08\\xa9\\x79\\xdc\\x84\\xbd\\xe8\\x61\\x27\\xb1\\x10\\x40\\xce\\xe8\\x79\\xdd\\x22\\x73\\xc0\\x16\\x85\\x6b\\x97\\xee\\xa0\\x45\\xf4\\x06\\x17\\xa5\\x03\\xf7\\x26\\xd3\\xf5\\x77\\xe3\\x92\\xbe\\x64\\x7d\\x56\\x73\\x7a\\x1a\\x64\\x20\\x73\\x75\\x7c\\x4c\\x28\\xea\\xd5\\xdc\\x28\\x33\\xa6\\xa5\\x97\\x1d\\xca\\xb2\\x6d\\x5a\\x76\\x0c\\xb9\\x42\\x55\\xec\\xe7\\xc4\\xbb\\xb1\\x3b\\x92\\xc4\\x88\\x68\\xc9\\x23\\x53\\x6f\\xb2\\x89\\x17\\x29\\x6a\\xab\\x3a\\xd5\\xfc\\x45\\x13\\xd5\\x5b\\xb4\\x9a\\x6c\\x92\\xa7\\xc1\\x11\\xed\\x26\\xb6\\x14\\x7d\\x9b\\xf5\\x37\\x89\\x68\\xc7\\xb9\\x5e\\x67\\x89\\x68\\xec\\x59\\xae\\xf8\\x7d\\x69\\x7b\\x19\\x09\\x69\\x55\\xc6\\x03\\xeb\\x5c\\xcd\\x0b\\xb3\\xdc\\xda\\x77\\x98\\xd1\\x06\\x6a\\x2e\\xcd\\x45\\x42\\x67\\x28\\x8a\\xb0\\xfb\\x9e\\xeb\\xf7\\xcd\\x62\\x51\\x53\\xa3\\xfe\\x95\\x79\\xcc\\xd0\\xe6\\x8b\\xe5\\x6d\\xaf\\x21\\xc8\\xcf\\xeb\\xf4\\x29\\x0b\\x41\\xb2\\xa9\\x28\\x90\\x1e\\x7d\\x91\\x04\\x1a\\x38\\x06\\x39\\x4a\\xed\\xcd\\x66\\x89\\x1a\\xf2\\x41\\xa0\\xea\\x5c\\xc3\\x69\\xee\\xd1\\x99\\xc1\\x5a\\x7a\\xd7\\x76\\xb4\\x7c\\x2d\\x17\\xd4\\x3b\\x28\\x11\\x24\\xcf\\x96\\xe0\\x6c\\x9b\\xd5\\x47\\xd7\\x6b\\xb1\\x2c\\x01\\x3f\\x7c\\xd2\\x22\\xed\\x5a\\x8a\\xcd\\x1d\\xba\\x89\\xe4\\xe6\\x2b\\x80\\x18\\x8c\\x3f\\x6b\\x91\\x7b\\x4f\\xe6\\x89\\xa7\\x3d\\x4f\\xcf\\xc7\\x67\\x8f\\x49\\xd3\\xae\\xdd\\xac\\xfc\\x7c\\xf6\\xdc\\x2c\\x75\\x26\\x05\\xb2\\xef\\xda\\x72\\x5b\\x34\\xd3\\xb8\\xd6\\x80\\xe7\\xf5\\xd5\\x71\\x3c\\x90\\x71\\xf4\\xe8\\xa7\\x65\\x3c\\x23\\x7f\\x32\\xc0\\xf7\\xc4\\xc5\\x3d\\x3d\\xb3\\x4f\\xaf\\x3b\\x08\\x86\\xbc\\x9e\\x7e\\xb8\\xbe\\x60\\x87\\x57\\x0a\\xfb\\xa7\\x1e\\x1b\\xbe\\x1f\\x8f\\x0d\\xdf\\x57\\x62\\xc3\\x7f\\x2a\\x95\\xa8\\xba\\xfd\\xe3\\x3e\\x55\\xaf\\xa9\\x8e\\xdb\\x37\\x04\\x6f\\x9b\\x03\\xbf\\x8d\\x36\\xff\\x05\\x95\\x3f\\xad\\x01\\xdd\\xa3\\xe4\\x36\\x72\\xcd\\xa8\\x1f\\x6a\\x0a\\x02\\xfa\\xf7\\xd5\\x66\\x9e\\x3c\\xa2\\x34\\x3d\\x68\\xd2\\x84\\xd1\\x9b\\x27\\x50\\xd3\\x0a\\xb0\\x9e\\x1e\\x6c\\x69\\x05\\x58\\x4f\\x0f\\xb6\\xb4\\xa2\\x87\\xa7\\xc7\\xcb\\x5a\\x35\\xc3\\xf4\\x78\\x59\\xab\\x66\\x58\\x1f\\x06\\x83\\x14\\x8d\\x67\\x7d\\x54\\x74\\x63\\x64\\x6e\\xee\\x10\\x39\\x63\\x70\\xee\\x7f\\x79\\x54\\x5a\\xaa\\x64\\x18\\x8f\\x38\\x6c\\x20\\xa8\\xd7\\xe6\\xb4\\xa5\\x52\\xfc\\x00\\xaf\\x6a\\x1e\\x01\\x6f\\x1c\\xd9\\x08\\x62\\x02\\xde\\x8d\\xb2\\x81\\x4e\\x18\\xd8\\xd5\\x76\\x4f\\x84\\xed\\x1f\\xc6\\xfd\\xd0\\x18\\x69\\xcf\\x16\\x4d\\xbe\\x13\\x07\\xb4\\x67\\x5e\\x3d\\x9f\\x9f\\x5b\\xab\\x6d\\xf5\\x3b\\x9b\\x73\\x02\\x4b\\x20\\x4c\\xf2\\x8d\\xcd\\x1c\\xcf\\xb5\\xff\\xa2\\xb4\\x41\\xab\\xd1\\x2e\\x59\\xdf\\x20\\xed\\xce\\x47\\xb0\\xc6\\x1b\\x2a\\x7f\\x91\\xba\\x2b\\xc9\\xc8\\x37\\xe8\\xa0\\x2d\\x15\\xb2\\x0c\\xfa\\xaf\\x88\\xed\\x72\\x1a\\x66\\xbf\\xfe\\x02\\xdd\\x0f\\x8a\\x15\\x9e\\x01\\xeb\\xaa\\x36\\xf2\\x92\\xea\\xf4\\xbe\\x35\\x10\\x15\\x25\\x63\\x8e\\xc4\\x83\\x8a\\x68\\xb3\\x7f\\x96\\x8d\\xc4\\x2f\\xa1\\xb3\\x19\\xfa\\x18\\xf2\\xa4\\x10\\x0f\\xee\\xfd\\x0a\\xb4\\x83\\xe4\\x50\\x73\\x04\\x44\\xb3\\x01\\xad\\xfc\\xf2\\x7a\\x48\\x2d\\xd3\\x97\\x43\\x1b\\xd0\\xed\\xbc\\x46\\x02\\x14\\x9d\\xf2\\xf4\\x7b\\x99\\xe8\\x77\\xde\\x6e\\x33\\xae\\x9b\\xb5\\x3b\\xbe\\xd4\\x3a\\x1e\\xd2\\x8e\\x2f\\x93\\x1d\\xa7\\xaf\\xb6\\x7c\\xcd\\xa6\\x8e\\xf2\\xce\\xd5\\x99\\x8c\\x29\\xbd\\x75\\x2c\\x95\\xac\\xde\\x98\\xf2\\x01\\xc0\\x4c\\xb9\\x92\\x5b\\x6c\\x80\\xdc\\x09\\x04\\x33\\xa5\\x6a\\xfb\\x37\\x01\\xa9\\x55\\x6d\\xef\\xee\\xba\\x89\\x0a\\xed\\x1a\\x69\\x43\\x85\\xdf\\x9a\\x74\\xca\\x18\\x1a\\x14\\xe7\\x69\\x83\\x6d\\x29\\x3e\\xb4\\x56\\xca\\x9b\\x8f\\x4c\\x63\\x11\\xe3\\x3c\\xe2\\x06\\x30\\x24\\xa1\\x6a\\xe0\\x5d\\xd7\\x9d\\x1b\\x46\\x3d\\x89\\xc1\\x6d\\x28\\xe8\\xd2\\x01\\xa1\\x7a\\x19\\xbd\\xcd\\x1a\\x01\\xcb\\xc5\\x8a\\x69\\x30\\x59\\xda\\xe0\\x4c\\x88\\xfc\\x56\\xe4\\xf4\\x19\\x20\\xa7\\xdf\\xa6\\x60\\x50\\xcf\\x52\\x90\\xd3\\x61\\xd9\\x33\\x84\\x76\\x6e\\xdf\\x3c\\x3c\\x6c\\xdf\\x64\\xa1\\x8f\\xcf\\x20\\xb0\\x71\\x96\\x0f\\x7d\\xfc\\xce\\x13\\xcf\\xfc\\x46\\x8a\\xf5\\x35\\x72\\xa3\\x88\\xf8\\x4d\\x5a\\x42\\xfa\\x4c\\x00\\x71\\x5d\\x0b\\x7f\\x5c\\x78\\xb3\\x6c\\xad\\x75\\x4c\\x97\\x7a\\xa9\\xb9\\xde\\xd4\\xc0\\xff\\xb1\\x78\\x8c\\xe6\\xca\\xda\\x23\\xf7\\xde\\x52\\xd3\\x5f\\x0f\\x69\\xab\\x6a\\xbc\\xe3\\x7d\\x46\\x0c\\xa1\\x68\\x8e\\x87\\xee\\x65\\x14\\x47\\x3b\\x54\\xbe\\xa2\\xf8\\x96\\x1d\\x52\\xe1\\xb4\\x00\\x4e\\xe9\\x0d\\xe0\\xb4\\x71\\x68\\x5f\\x79\\xfa\\xbb\\x1b\\xeb\\x2f\\x4c\\x1d\\x9f\\x47\\x23\\xcc\\x65\\x8c\\xdc\\x2d\\x30\\xcd\\xf2\\xf8\\x10\\xc2\\x51\\xef\\x8f\\x62\\x0d\\xa9\\x77\\x72\\xec\\x1d\\x25\\x72\\xed\\x54\\x75\\x45\\x3c\\xb5\\x3b\\x2a\\xad\\x1f\\x27\\x9e\\x99\\x6d\\x21\\x8b\\x35\\xc1\\x57\\x25\\xba\\x9e\\x8d\\x0e\\x8a\\xbf\\x54\\x7e\\x31\\xac\\x53\\x46\\xee\\xaf\\xd1\\x01\\x27\\xef\\xe2\\xcb\\x1b\\x39\\x8e\\x56\\xc6\\xf9\\xae\\x33\\x3a\\xe0\\xd0\\x9e\\x15\\xc0\\xba\\x93\\xeb\\xe4\\xf0\\xc0\\xa0\\x8b\\x00\\x93\\xd9\\xaa\\x52\\x8a\\x65\\xbd\\x73\\xf0\\xb4\\xb4\\xf9\\x2f\\xd7\\xc6\\x3b\\xba\\x10\\xde\\x27\\x17\\x53\\xf6\\x98\\xe3\\x61\\xb5\\x23\\x9d\\x03\\x74\\x6a\\x86\\xce\\x02\\x59\\x76\\xbb\\x67\\xc7\\x3c\\x02\\x7d\\xe3\\x9a\\x2d\\x4b\\xc6\\x85\\x1c\\xae\\xad\\x43\\x57\\xe4\\xe4\\xc5\\x45\\xfc\\x7a\\x39\\xef\\x22\\x2c\\xfb\\x55\\x0c\\x02\\x63\\x2e\\xa6\\x27\\x1f\\xe8\\x38\\x22\\xc6\\x2d\\x9b\\xb3\\x31\\x1d\\xd4\\x4b\\x0a\\x7b\\x11\\xe0\\x78\\xf9\\x05\\xd7\\x4b\\x21\\x3c\\x8b\\x0b\\xac\\x65\\xee\\xc9\\x7d\\x61\\x40\\x1c\\xa7\\xf7\\xdf\\x03\\x17\\x6c\\x5f\\x63\\x0c\\x9b\\x14\\xb8\\x86\\x1a\\xe3\\x10\\x1b\\x80\\x3a\\x3b\\x84\\x7f\\x9c\\x35\\x0c\\x5a\\x89\\xd4\\xcc\\xc8\\xb2\\xf8\\x24\\x48\\xcc\\xa9\\x4a\\xa7\\x91\\xb3\\x24\\x5b\\xe9\\xb4\\xea\\xaa\\x8b\\x4f\\xd2\\x91\\xba\\xbe\\x6e\\x96\\x5d\\x37\\xd5\\x75\\x77\\x59\\x9f\\xb2\\x97\\x79\\xed\\x74\\xc8\\x3a\\xd8\\xb2\\x53\\xab\\x5a\\xd3\\x21\\x23\\x5b\\x78\\x6a\\x7d\\x2b\\xed\\x51\\xba\\x4f\\xcc\\xea\\x70\\xfc\\xff\\x07\\xa1\\xd8\\xcf\\xa7\\xb0\\xcd\\xea\\xcd\\xbe\\xdf\\x82\\xb5\\x26\\x8f\\xba\\x16\\x46\\x9e\\x4e\\x99\\xb6\\x33\\x13\\xa9\\x37\\x37\\x60\\x17\\xd7\\x95\\xb8\\xd0\\xe5\\xd6\\xef\\x76\\xd1\\x67\\x56\\x7a\\x9f\\x8f\\xc6\\xdc\\xeb\\x14\\x7d\\xb4\\xd2\\xfb\\xe2\\x9e\\x6f\\x33\\xe5\\xb2\\x5b\\x40\\x5b\\xb8\\x51\\x05\\x96\\x1b\\x5d\\x60\\xb9\\xf3\\xc2\\x6a\\x68\\x45\\x52\\x53\\x22\\x78\\x90\\xc2\\x89\\x39\\x9f\\xbc\\x14\\x20\\x64\\x25\\xa8\\x18\\x2a\\x35\\x49\\xa2\\x11\\x09\\xbc\\xb6\\xf0\\xc2\\x9c\\x31\\x73\\xd5\\x50\\xe1\\x87\\xc7\\x07\\x00\\x2c\\xbf\\x93\\x16\\xad\\x39\\xa4\\x5f\\x10\\x5c\\xd3\\x19\\xf0\\x08\\x8c\\x69\\x5a\\xbe\\xcc\\x0a\\x2c\\xdc\\x3d\\xb0\\x61\\xf7\\x91\\x27\\x58\\xbb\\xe3\\x08\\xc8\\x19\\x12\\x8f\\xfa\\xb4\\xfa\\x41\\xa9\\xd2\\xac\\x62\\x4f\\xc6\\xf4\\xea\\xde\\xb7\\x65\\xa5\\x45\\x96\\xa5\\x4a\\x83\\xce\\x23\\x67\\xc1\\xee\\x62\\x29\\x09\\x3d\\x0c\\x12\\x1f\\x9b\\x2b\\x75\\xb6\\x27\\x32\\xc9\\x01\\x00\\x8e\\x41\\x52\\xdb\\x40\\xde\\x53\\x5b\\xa3\\xd2\\xdd\\x7d\\x1c\\xde\\xea\\x95\\xa7\\x09\\x62\\xe4\\x88\\x5e\\x46\\x15\\x00\\x5f\\xa5\\x8b\\x69\\xd0\\x30\\x17\\x83\\x32\\x4a\\xea\\xe9\\x26\\xcb\\x0c\\x91\\xce\\x8f\\xb6\\x56\\x3f\\xca\\x67\\xb8\\xe1\\xb2\\xda\\x44\\xca\\x6a\\x73\\xf9\\x6c\\x8c\\x0f\\x90\\x3f\\x84\\xbd\\xe5\\xae\\xf2\\xbd\\x04\\x51\\xa4\\x98\\x9b\\xec\\x60\\xa8\\x39\\x93\\x5f\\x42\\x3b\\xac\\x1c\\x77\\x83\\x74\\xd1\\xea\\xac\\xcc\\x4c\\xe9\\xb5\\x88\\x24\\x40\\x7b\\xd2\\x43\\x08\\xc2\\x1f\\x4a\\x95\\x37\\x20\\x88\\xac\\x05\\xc5\\x15\\x24\\xa0\\xb8\\x96\\x56\\x28\\xae\\xc0\\x02\\xc5\\x35\\x89\\x0b\\x1e\\x73\\x88\\x6f\\x4b\\x24\\x4d\\x8c\\xcd\\x20\\x5c\\x81\\x00\\xe1\\xc2\\xfb\\x3d\\x89\\xb8\\xb3\\xfd\\xba\\xdd\\x01\\xd4\\x74\\x7a\\x91\\x03\\xa8\\x64\\x1a\\xdb\\x96\\xa3\\x3e\\x17\\x2c\\x57\\xce\\x2c\\xb7\\x1b\\xaf\\x83\\x31\\xef\\xe3\\x11\\x4e\\x9d\\x91\\x4b\\x4e\\xff\\xd1\\xde\\x21\\x3c\\xc4\\x59\\x6c\\x42\\x44\\xaf\\x89\\x09\\x00\\x49\\x7d\\xd7\\x4d\\x13\\x90\\x2e\\x66\\x67\\x36\\x04\\xaa\\x5c\\x10\\x62\\x70\\x81\\x2d\\xfe\\xa9\\xa1\\x67\\x9b\\x61\\xbc\\x4f\\x05\\x59\\xf1\\x34\\x31\\xdf\\xd3\\x00\\x77\\xad\\x38\\x49\\x02\\x52\\xa4\\xe4\\x92\\x29\\x3e\\x94\\x04\\x2a\\x6a\\x5d\\x02\\xa1\\x03\\xf6\\x1a\\x43\\x46\\xd5\\x79\\x42\\x88\\x4e\\x25\\x62\\x86\\x45\\xc5\\x5f\\xa9\\x08\\xa8\\x39\\x7a\\x59\\xd6\\x7b\\x19\\x81\\x9c\\x7e\\x97\\x4e\\x1a\\xc0\\x8e\\xf3\\xf7\\x50\\x03\\xc9\\x7d\\xea\\xee\\x91\\xb3\\x84\\x27\\xf1\\x2c\\x2f\\xe0\\x99\\x79\\xb1\\xcc\\x0f\\x82\\x66\\xae\\x4f\\xaf\\x1f\\xcf\\x30\\x9a\\xa1\\xdd\\x4e\\x08\\x57\\x5b\\x76\\x8c\\x7a\\xe5\\xc5\\x3f\\x89\\xa6\\x77\\x83\\x11\\x45\\xa5\\x87\\x52\\xe3\\xeb\\xa9\\x75\\xf6\\xc8\\x18\\xd2\\x1c\\xf0\\x80\\x65\\xfe\\x96\\xe9\\xbd\\x37\\xbd\\x0d\\x19\\xd7\\xa6\\x72\\xcb\\x77\\xba\\x34\\x47\\x97\\x69\\xfd\\xf8\\x95\\x0f\\x1e\\xc3\\x1a\\x67\\xbf\\xde\\x33\\xce\\x6c\\xcd\\x1b\\x89\\x56\\x41\\x22\\x34\\x53\\xa6\\xd8\\x43\\xcc\\x32\\x00\\xc2\\xf2\\x5f\\x1d\\xaf\\xfc\\xdc\\xa7\\x3a\\xe7\\x75\\x0d\\xd3\\x99\\x9b\\x60\\xa9\\x7c\\xd9\\xac\\xee\\xee\\x36\\x99\\x79\\xb3\\xe1\\x95\\xc0\\x84\\x59\\x6d\\xfc\\x76\\x27\\xcc\\x97\\x8d\\xdd\\x5d\\xb7\\xb5\\x4b\\x85\\xa6\\x3b\\xc8\\xdb\\x90\\x30\\xc3\\x68\\x96\\x69\\xb9\\xbc\\x52\\xd5\\x7f\\xd9\\xc0\\x92\\xe0\\xca\\xa7\\x67\\x81\\x9a\\xde\\x6b\\x55\\x11\\x90\\xdb\\x5e\\xc4\\xeb\\xac\\xe2\\xbd\\xe8\\x42\\x0a\\x44\\xa9\\x2a\\x75\\xc4\\x15\\x08\\xd5\\x6a\\x7c\\xb7\\x32\\x8f\\x2c\\xa8\\x61\\x99\\x88\\x61\\x6d\\xef\\xd7\\x9f\\x4b\\x74\\x28\\x80\\x0c\\xbc\\x6b\\x8b\\xa0\\x0e\\x32\\xf0\\xc2\\x7a\\x56\\x17\\x71\\xdf\\xea\\x22\\x0e\\x3d\\xd6\\xff\\x02\\x10\\x7f\\xdf\\xfb\\x93\\x11\\x30\\x7f\\x17\\xf8\\x85\\x0b\\x54\\x93\\x2f\\x30\\x0f\\x74\\x41\\x44\\x69\\x1b\\xe2\\xd4\\x27\\x88\\x79\\x35\\xd5\\xc3\\xb1\\xe5\\x32\\x43\\xa5\\x12\\x6d\\xe9\\xd6\\x7e\\xc7\\x40\\xb4\\x6c\\xfc\\xe0\\x69\\x20\\x5c\\x6e\\xf5\\x66\\x4f\\xe2\\x66\\x38\\xfb\\x7b\\xfb\\xee\\x9e\\x02\\xae\\xe3\\x5c\\xd3\\x23\\x84\\xfe\\xd5\\x44\\x7c\\x8c\\x29\\xea\\x79\\x4a\\xa5\\x1c\\x43\\xd8\\xf0\\x54\\x09\\x1b\\xbe\\xb1\\xbc\\x72\\x47\\x09\\xbb\\xd2\\x54\\xc3\\x54\\x87\\x7d\\x37\\x5c\\xe2\\x8a\\x4c\\xa8\\x76\\x8b\\x70\\x56\\xd3\\x1c\\xab\\x87\\xb9\\x49\\x65\\x71\\xd9\\xa0\\xd9\\x98\\x81\\x6b\\x1a\\x47\\xe5\\xb6\\x36\\xda\\x50\\x45\\x25\\xe3\\x5c\\x12\\xa5\\x05\\x69\\x87\\x03\\xec\\x43\\x0d\\xb7\\x32\\x02\\x4b\\xba\\x70\\x65\\xe5\\xab\\x39\\xa1\\x35\\x85\\xfe\\x3a\\xc1\\x1b\\x12\\x9e\\x30\\xfa\\x8b\\x36\\x39\\x59\\x11\\xeb\\x33\\xfa\\xde\\x86\\x25\\xab\\xe3\\x3e\\xdd\\xb0\\x64\\xb5\\x47\\x65\\x61\\xf1\\x58\\x2d\\x25\\xa3\\x54\\x2a\\x75\\xab\\x49\\x08\\xf5\\xd8\\xb5\\xad\\x41\\xca\\xc3\\x5f\\xdb\\x12\\x64\\x8d\\x15\\x30\\x46\\x17\\xe4\\x8e\\x15\\x30\\x9a\\xdb\\xd6\\x8b\\x15\\x30\\xc5\\x6e\\xd8\\xcd\\x49\\x78\\x8a\\xf8\\x59\\xe6\\x24\\x61\\x40\\xf1\\x73\\x98\\x93\\xa4\\x69\\xc5\\x4f\\x35\\x27\\xf9\\xb9\\x62\\x05\\xe2\\xb6\\xcb\\x06\\xda\\x2e\\x8d\\xe0\\x33\\x28\\x4d\\xad\\x61\\x8b\\x9c\\xde\\x05\\xb0\\x48\\x86\\x1e\\x04\\xd3\\xd4\\xa7\\x3e\\xdf\\x31\\x2a\\x0d\\x61\\x0d\\x61\\x1b\\x07\\xbc\\x57\\xcc\\x4e\\x22\\xf7\\x0f\\xb7\\xda\\xa0\\x2f\\x56\\xbf\\xca\\x6b\\xd1\\xef\\x03\\xb5\\xda\\x5d\\xd0\\xe9\\x60\\xec\\x99\\xac\\x18\\x0c\\x81\\x05\\xbc\\xc8\\xd6\\xf5\\x44\\xdd\\x62\\x13\\x95\\x19\\xb5\\x89\\x69\\x10\\x76\\x47\\x73\\x40\\x57\\xc9\\xd3\\x8c\\xbf\\x18\\xd7\\xc1\\xa9\\x11\\xd5\\xe7\\x47\\xb2\\xfb\\x4e\\xef\\xf8\\xeb\\x98\\x49\\x38\\x4a\\xfd\\x0c\\x59\\xc8\\xd4\\xec\\x2a\\x47\\xec\\xbf\\x39\\x39\\xc2\\xba\\x2a\\xa6\\x9b\\x1a\\x6f\\xd6\\x35\\x35\\xe6\\x86\\x09\\xea\\x47\\xa2\\xb1\\xb4\\x37\\x9e\\x28\\x40\\x40\\x93\\x9d\\x1d\\xf9\\xb3\\x8d\\x29\\xe5\\x27\\x0a\\x2e\\x50\\x3f\\x66\\x8d\\xec\\x33\\x71\\x71\\x91\\x20\\x74\\x38\\x41\\x07\\x6c\\xc2\\xdc\\xc8\\x6d\\x62\\x17\\x36\\x37\\xf0\\x80\\x2c\\x48\\x08\\xe0\\xfd\\x36\\x37\\xf0\\x10\\x0b\\xd8\\xdc\\xc0\\x0b\\x4b\\x38\\xc6\\x51\\x2e\\xfc\\x9f\\x73\\x60\\xf0\\x4b\\xe0\\xff\\x00\\xeb\\xb7\\x19\\xff\\xa7\\xbf\\x1e\\xfe\\xcf\\x9b\\x08\\xff\\xe7\\x8d\\xc0\\xff\\x79\\x03\\xf8\\x3f\\x6f\\x4c\\xf8\\x3f\\x6f\\x34\\xfc\\x9f\\x37\\x1c\\xff\\xa7\\xbf\\xb3\\xd3\\x97\\x31\\x22\\xfd\\x27\\xc5\\xff\\x59\\x80\\x17\\x7c\\x91\\x0d\\xef\\x93\\xee\\xdf\\xbe\\xf4\\x16\\x59\\xd6\\x4e\\x39\\x5d\\xa5\\xc9\\xb3\\x5f\\x03\\xf0\\x9d\\xcb\\xcd\\x4d\\x9e\\x6a\\x93\\xaa\\x81\\xf3\\xad\\x77\\x19\\x47\\xf4\\xb9\\x8a\\xbb\\x1e\\xb9\\x9e\\xaa\\xa2\\x61\\x5c\\xe5\\x87\\xe8\\xc9\\x28\\xba\\xcc\\x5f\\x94\\xdf\\x0a\\xb7\\x99\\x66\\x14\\xd6\\x30\\x74\\x32\\xca\\xc2\\x74\\x9f\\x8c\\xc2\\x69\\xbe\\xd2\\x2a\\x5a\\x35\\x1d\\x40\\x39\\x7c\\x26\\x33\\xe3\\x45\\xdc\\xcc\\xf8\\x9a\\x2e\\x72\\x6c\\xb2\\xbf\\xf3\\xc6\\x07\\x17\\xc5\\xfb\\xca\\x45\\xb5\\xcb\\xed\\xb8\\xef\\xd4\\xd6\\x2c\\x90\\x3c\\x7d\\x99\\xfc\\x4e\\x42\\x06\\xc9\\xd3\\x55\\x21\\x79\\xf0\\x98\\x72\\x28\\x73\\x9d\\x48\\xbd\\x64\\x46\\x2e\\xff\\x45\\xf1\\x1d\\x83\\xcb\\x2e\\x86\\x11\\x34\\x0f\\x9d\\x40\\x63\\x76\\x83\\xef\\xbd\\x6b\\xe4\\xf0\\x7d\\x25\\x56\\xe1\\x87\\x87\\xc2\\x47\\xf6\\x8d\\xea\\x65\\xfe\\xac\\xfe\\x86\\x9e\\x8c\\x8e\\x88\\xf5\\xa0\\xc2\\x37\\xe2\\x6d\\xfa\\xe2\\xb0\\x99\\xe7\\xf2\\xbd\\x9d\\x9f\\xa0\\xd2\\xac\\x68\\x16\\xb6\\x4f\\x6c\\x15\\xf7\\x60\\xb5\\x51\\x76\\x40\\x6d\\x13\\x8f\\x18\\x1b\\xc5\\x33\\xb2\\x55\\xb6\\x77\\x62\\x6f\\x4f\\xf8\\x57\\xa5\\xe5\\xe8\\x50\\xd4\\x36\\xdf\\x6d\\x0d\\x6d\\xf3\\x33\\x4a\\x8f\\x95\\x0d\\x57\\x0c\\xc7\\xd6\\xff\\xc4\\x87\\xe3\\x2b\\xdf\\x68\\x13\\x83\\x22\\xf7\\x6a\\xdb\\xe0\\xc8\\x02\\xab\\x5a\\xf5\\xde\\x3b\\xe4\\x4b\\xda\\xf3\\x1f\\x9f\\xed\\x53\\x45\\xfc\\xbd\\x97\\x02\\x62\\x03\\x79\\x02\\xb4\\x82\\x08\\xd3\\xa7\\x3b\\x28\\xeb\\x12\\x28\\x4a\\x01\\x9f\\xa0\\xf7\\xc2\\x3b\\x70\\x5d\\xf8\\xd7\\x4f\\x3f\\xfd\\x44\\x1f\\xbd\\xfa\\x51\\x8b\\xcf\\x25\\xfd\\xb5\\xe2\\x13\\xf8\\x3d\\x9f\\xc0\\x81\\x9c\\xc0\\xa8\\xef\\x0f\\xea\\x0b\\x27\\x88\\xa6\\x6d\\x34\\x83\\xa3\\x59\\x9d\\x51\\x6e\\xed\\xa9\\x1e\\xeb\\x5e\\x26\\xfe\\x94\\x32\\xc9\\x2f\\x33\\x5e\\x8d\\x30\\xf2\\xd7\\x44\\xb5\\x00\\xd2\\xe5\\xed\\x86\\x48\\x5e\\x17\\x02\\xc9\\x6b\\x8e\\xb8\\x5b\\xec\\x71\\x5c\\x48\\xbf\\xcf\\x6b\\xa0\\xd8\\x04\\xad\\xc0\\xe1\\xc4\\x77\\x8c\\x3c\\x0b\\x24\\x7c\\xbc\\x3e\\x18\\x1b\\x6f\\x3b\\x47\\x62\\x57\\xa7\\x42\\x86\\xd8\\xa0\\x9a\\x71\\x54\\x10\\x6d\\x75\\x63\\x8f\\x0a\\x80\\xbb\\x7c\\xc3\\x35\\xab\\x8c\\xa9\\x4a\\xbf\\x27\\x6d\\x91\\x96\\x8b\\x16\\xec\\x2b\\xbf\\xeb\\xa2\\x87\\x08\\x29\\xa2\\xe2\\x94\\xd3\\xe6\\x60\\x28\\x4d\\x01\\x74\\xd3\\x96\\x40\\x37\\xed\\x34\\x48\\x9e\\x0b\\x84\\xe4\\xe9\\x6b\\x48\\x37\\xaf\\x61\\x7f\\x7a\\xbb\\x31\\x24\\xcf\\x6b\\xf6\\xac\\xec\\x0d\\x98\\xe5\\xa7\\x92\\x84\\x4a\\xa3\\x2f\\x24\\x5b\\xff\\x3e\\x54\\x3f\\x78\\x42\\x19\\xf0\\x3c\\xfa\\xc2\\x72\\xe9\\x1a\\x5c\\xa2\\x1d\\x79\\x7f\\x9d\\x34\\x20\\x9f\\xd7\\x00\\xe4\\xd3\\x87\\xc4\\x38\\x36\\x3e\\x2d\\x31\\x3e\\x1f\\xd4\\x3b\\xbe\\x80\\x3b\\x16\\x6b\\x0d\\x5e\\x89\\x2f\\x0d\\x74\\x85\\xd1\\x57\\x05\\xf5\\xe4\\x81\\x73\\xec\\x75\\xb4\\x5c\\x7a\\xa2\\xfd\\x54\\x42\\x61\\xfe\\xa7\\xe0\\xba\\x6e\\xe5\\x78\\x67\\x47\\x2b\\x70\\x1c\\x1f\\xa5\\x65\\xee\\x51\\xea\\xb8\\x2b\\x5f\\xb7\\xe8\\x48\\xc3\\x1a\\x9d\\xae\\x38\\x62\\x9a\\x99\\xb7\\x2f\\xdd\\xeb\\x65\\x70\\x2b\\xe7\\xf4\\x79\\x0b\\xdb\\x8b\\x5a\\x4c\\xcd\\xb0\\x2f\\xaf\\x14\\xc5\\x32\\x06\\xcb\\xd2\\xdc\\xf6\\x62\\x2e\\x80\\x0d\\xe4\\xda\\x65\\x2a\\xb8\\x4c\\xf7\\xb1\\xd8\\x35\\xe9\\xcd\\x07\\x7a\\xf3\\x6c\\x63\\x8f\\xdb\\xf5\\xb4\\x11\\xa1\\x2f\\x22\\x6c\\x11\\x56\\xc7\\x6f\\x34\\x72\\x25\\x88\\x41\\x20\\xda\\x58\\x12\\x31\\xb1\\xea\\xec\\x13\\xc6\\x0b\\xbf\\x28\\x3b\\x55\\x4a\\x87\\xa1\\xc7\\xbd\\x74\\x8a\\x7d\\xa5\\xdb\\x4d\\x30\\x6a\\xc4\\xc8\\x00\\xb8\\x78\\xdd\\x22\\x5d\\x12\\x90\\x01\\x18\\xde\\xe9\\x9a\\x63\\x98\\x2a\\x5a\\x4a\\x9f\\x1e\\x58\\xa1\\xcf\\x9e\\x44\\x44\\x47\\x9b\\x74\\x98\\xf9\\x41\\x59\\x23\\x5f\\x05\\x53\\x98\\xff\\x6d\\xe1\\x42\\xe1\\x59\\x75\\x9f\\x31\\xc0\\x08\\x80\\x18\\x1c\\x5c\\x3c\\x63\\x58\\xf7\\x1d\\xda\\xc9\\xed\\x12\\xeb\\x70\\xcf\\x13\\x95\\xaf\\xbb\\xd8\\x67\\x13\\xaa\\x50\\x4f\\x03\\x1b\\x92\\x00\\x67\\xf0\\xc8\\x5a\\x5e\\x8f\\xbe\\xfd\\x86\\x93\\x01\\x3d\\x19\\x78\\x0d\\xa9\\x8a\\x38\\xd8\\x1b\\xa7\\x47\\xa8\\x8a\\x23\\x98\\x74\\xa3\\x55\\x23\\x5a\\x17\\x7a\\x91\\xf7\\xb6\\xd2\\xc0\\x50\\x5e\\xa8\\x52\\x1d\\x30\\x4a\\x69\\x94\\x64\\xda\\xe8\\x53\\xc3\\x5e\\x57\\xfa\\xdc\\x82\\x33\\xa2\\xe3\\xd3\\xd6\\x3c\\x2d\\x84\\xef\\x05\\x2c\\xd8\\x4a\\x36\\x0b\\x68\\x16\\x40\\xdf\\x36\\xf1\\x6f\\xfd\\xc9\\x14\\xe6\\xc5\\x80\\xbf\\xa9\\x2f\\xf7\\xd9\\xca\\x39\\xa4\\xbd\\x16\\x3a\\x93\\x88\\xa7\\x6e\\xb2\\x10\\xec\\x2f\\xae\\x08\\xc1\\x1b\\x58\\x42\\x6e\\x86\\x51\\x8c\\xf7\\x50\\x70\\x5a\\xcb\\x23\\xf5\\x3d\\xb5\\x4f\\xe0\\x9e\\xa6\\x0a\\x9a\\xf5\\xac\\xb4\\x9e\\x0f\\x5f\\x7a\\xcd\\x9d\\x9d\\xd6\\x6e\\xf3\\xa5\\x37\\x3c\\x00\\x83\\x96\\x33\\xf6\\x1a\\x54\\xeb\\x44\\xd3\\x16\\x27\\x86\\xd8\\xf6\\x00\\x3b\\x6d\\x70\\x3d\\xae\\x45\\x4f\\x1b\\xc8\\xc4\\xd1\\x5f\\x72\\xe3\\xb5\\x75\\xd8\\x12\\xf6\\x2c\\x5a\\xf0\\x2c\\xc8\\xc4\\xf8\\x18\\x4c\\x9e\\xf5\\x68\\x49\\xde\\x2b\\xd3\\x45\\x19\\x23\\x50\\x0d\\xe5\\x3a\\x31\\x88\\x14\\x77\\x55\\xed\\x49\\x78\\x01\\x09\\x01\\xc4\\x44\\x85\\x60\\x57\\x11\\x16\\xc4\\x20\\xef\\x0a\\xa9\\x01\\x3d\\x6a\\x91\\xdc\\x70\\xb2\\x37\\xae\\x43\\x18\\xee\\xdb\\x51\\xcb\\x4f\\xa0\\xb5\\x4c\\xb8\\xb2\\xfa\\x8d\\xcd\\x8b\\x1b\\xe1\\x80\\x1d\\xac\\x5c\\x40\\xdd\\xe1\\xae\\x89\\xb3\\x79\\xd0\\xf2\\x01\\xfb\\x90\\x4a\\x80\\xe9\\xef\\x7c\\xdc\\xb0\\x6f\\x78\\xe3\\x71\\x8d\\x1d\\x3d\\x06\\xa2\\x4b\\xd8\\x0a\\x3c\\x4f\\x81\\xdb\\x8a\\x72\\x4c\\xfa\\x4f\\x06\\xe0\\x65\\xee\\x08\\x3e\\x6c\\x86\\xf4\\xa7\\x2f\\x9e\\xa7\\x9e\\xfc\\xaa\\xae\\xea\\x2b\\x30\\x45\\x25\\xbd\\x74\\x5b\\xe8\\xa6\\xc3\\x87\\x65\\x75\\xd6\\x99\\x6c\\x62\\x3a\\xd4\\x12\\x07\\x5f\\xea\\x24\\x8e\\x74\\x0d\\x70\\x4c\\x81\\xe1\\x58\\x4f\\x5f\\x1b\\xf1\\x51\\xf3\\x58\\xdd\\xbe\\x09\\x89\\x29\\x8c\\x23\\x31\\xbd\\x88\\x23\\x31\\xfd\\x5c\\x5a\\xd1\\xb5\\x9c\\xb1\\xd4\\xb3\\x8f\\x91\\xcd\\x8f\\x38\\x86\\x6d\\xe9\\x06\\xfe\\x69\\x78\\x4b\\xe5\\x4c\\xbc\\x25\\xfc\\x58\\x6e\\x06\\xbb\\x84\\x78\\x4b\\xe4\\xd0\\xbb\\x8e\\xf4\\x58\\xa9\\x7c\\x46\\xba\\x62\\x8d\\xbc\\xf2\\xbe\\xad\\xc8\\x11\\x82\\x33\\x25\\xb7\\xc5\\x76\\x3a\\x30\\xd3\\xbf\\x41\\x30\\xe3\\x25\\x66\\x71\\x18\\x06\\xd2\\xcf\\x87\\xb7\\xd4\\xde\\x18\\x6f\\x29\\xbe\\x98\\x44\\x78\\x4b\\x8c\\xaa\\xa8\\x1a\\xf0\\xf9\\x89\\xe3\\x03\\x10\\x62\\x3c\\x28\\xca\\xe4\\x92\\x5c\\xc2\\xcc\\x8e\\xee\\xfc\\xec\\xe9\\x21\\x99\\xb8\\x3a\\x2c\\xaf\\x01\\x86\\xe9\\xf3\\x35\\x20\\x9a\\xc4\\x1b\\x79\\x2a\\xbe\\xd3\\x37\\xfa\\x49\\x01\\x9c\\xfc\\x4d\\xa0\\xea\\x78\\x7a\\xf7\\xde\\xc2\\xe3\\x79\\x4b\\x9c\\xac\\x5c\\xe4\\x7d\\xef\\x2d\\x79\\xd6\\x8d\\x3c\\xd1\\x97\\xd8\\x6e\\x71\\xcc\\x37\\x0d\\xeb\\x2d\\xad\\x37\\x46\\x28\\x41\\x10\\xc6\\x23\\x24\\x41\\x16\\x38\\x21\\xbc\\x96\\x4b\\xf0\\x5a\\xb2\\xf7\\x00\\xc3\\xe1\\x39\\x20\\x55\\x97\\x5b\\x94\\x41\\xd9\\x46\\xa4\\x29\\x86\\x4e\\xd5\\x96\\xe8\\x54\\x1d\\xe1\\x8a\\x65\\x03\\x76\\x59\\x5f\\xfa\\x13\\xaf\\xa7\\xc0\\x53\\xf5\\xe3\\x57\\xf9\\xbe\\xfe\\x50\\xab\\xa3\\x31\\xdd\\x1f\\x6a\\xf5\\x34\\x66\\xe3\\x46\\xa5\\x42\\x4e\\xa5\\xe2\\x46\\xa5\\x22\\x4e\\xa5\\x42\\xbe\\x58\\x11\\xa7\\xbe\\x23\\x6e\\x94\\x95\\xbe\\x05\\x7a\\x7b\\xc4\\xe7\\xc8\\xda\\x6e\\x63\\x3e\\xb9\\x2e\\xeb\\x0d\\xdf\\x5e\\xdb\\xca\\xa6\\x92\\x85\\x3c\\xd5\\xff\\x8e\\xc8\\x53\\xfd\\xcd\\x90\\xa7\\xfa\\xff\\x00\\xf2\\x94\\xe1\\x9a\\x8d\\x6c\\x77\\xb4\\x29\\x09\\xc4\\xee\\x8e\\xc6\\x53\\x40\\xcc\\x9d\\xee\\x8e\\xe6\\x05\\x68\\xc1\\x6c\\x77\\xb4\\x28\\x43\\xc2\\x54\\x77\\x74\\x98\\x97\\x50\\xc5\\x4c\\xe8\\x43\\x84\\xab\\xf0\\x08\\x97\\xd4\\xc8\\xab\\x06\\x08\\xb5\\xca\\xaf\\x8e\\xfa\\xeb\\xa9\\x12\\xe5\\x25\\x58\\xd2\\xc8\\x95\\xf9\\x67\\x23\\x37\\x3f\\xf6\\x93\\x19\\x40\\x2e\\x45\\xe8\\x60\\x54\\x2f\\x17\\x06\\x49\\x6f\\x2d\\x78\\xa9\\xed\\xed\\xba\\xbe\\xf0\\x3b\\xdb\\x75\\x14\\x77\\x25\\x8d\\x0c\\x1e\\xf0\\x45\\x24\\x4c\\xbc\\xe8\\x93\\xe4\\xa2\\xcc\\x87\\x8d\\xf9\\x64\\x9a\\xcb\\x31\\x1c\\xe1\\x06\\x8c\\xa4\\x63\\x38\\x8e\\x20\\xd0\\x50\\xb2\\x99\\x47\\x6c\\xe7\\x5e\\x94\\xe8\\x43\\x03\\x46\\xbb\\x16\\x7e\\x6b\\x2d\\xa2\\xe4\\xe7\\xb1\\x8c\\x26\\x04\\xf1\\x53\\x0d\\xdc\\x8e\\xc0\\x5f\\xc8\\x35\\xab\\xbd\\x80\\x40\\xef\\x05\\x52\\x85\\xc7\\xca\\x86\\x5a\\xd9\\x25\\xf2\\x89\\xb7\\x92\\x85\\x38\\x9a\\x35\\x96\\x39\\xd8\\x2f\\x55\\x4a\\x64\\x1e\\x01\\xa6\\x28\\x62\\x8c\\x1f\\xc5\\x92\\x1c\\x18\\x36\\x39\\x5d\\xe9\\xf4\\x95\\x35\\x89\\xf7\\xa2\\x81\\x40\\xe2\\xb2\\x53\\x4d\\xf8\\xc9\\x2f\\xde\\xc2\\x53\\xd8\\x04\\x4b\\x8b\\xbe\\x21\\x93\\x84\\x63\\x7c\\x6a\\x73\\x7d\\xfb\\x64\\x42\\x80\\x97\\xc7\\x6a\\xe7\\x6f\\xb3\\x02\\x73\\xee\\x2a\\xa0\\x17\\x9f\\x92\\x99\\xfb\\x7c\\x3f\\xe1\\x64\\x9f\\x30\\x19\\xf5\\x56\\x87\\x57\\xd2\\x3c\\xb1\\x7c\\x5e\\x08\\x0f\\x6c\\x03\\x14\\x86\\xdb\\x4d\\xfc\\xaf\\xbc\\x21\\x95\\x5e\\xa5\\xe3\\x52\\xb5\\xe3\\x4e\\xbd\\xb4\\x76\\x45\\xaa\\x22\\xa4\\x7b\\x03\\xa6\\xcf\\xf7\\xd1\\xb7\\x30\\x83\\x4f\\xe4\\xf7\\x30\\x07\\x4f\\x83\\x14\\xdf\\xe3\\x3a\\x3c\\x8b\\x8d\\x86\\x7b\\xa9\\xd4\\x09\\x7a\\x79\\x2a\\x0d\\x8c\\x8a\\x16\\x51\\xd0\\xc0\\x2a\\xd6\\x41\\x0d\\x53\\x4c\\x95\\x6b\\x9c\\x21\\x8c\\x9a\\xbe\\x41\\x55\\xab\\x05\\x1b\\x8a\\xc1\\xde\\x90\\xbe\\x3b\\x54\\x90\\x4c\\x8d\\xc1\\xa7\\x9a\\xd0\\x30\\x9b\\x11\\xba\\xeb\\x50\\xa9\\xb4\\xd9\\x0d\\xc2\\x16\\xd5\\x12\\x0e\\x68\\xd7\\xb8\\x81\\xc1\\xdd\\x1b\\xd6\\x07\\xbe\\x21\\x48\\xba\\xf0\\xaf\\xd3\\xd3\\xd3\\x82\\x35\\x58\\xbc\\x49\\xd7\\xad\\x1b\\x8b\\xf1\\x39\\x60\\x5d\\xfb\\x74\\xe7\\x53\\xd9\\x15\\xfa\\x07\\x6f\\x1f\\x5c\\x02\\xdf\\xe0\\xd1\\x63\\x83\\xf9\\x13\\x6e\\xf2\\xbd\\x5f\\xc0\\xbc\\x11\\x97\\xef\\xe5\\x33\\x60\\x4b\\x7f\\xbc\\x61\\x75\\xc0\\xdc\\xc7\\xc7\\xee\\x27\\x3a\\x55\\x4e\\xf4\\x09\\x22\\xfa\\x59\\x97\\xf4\\xcb\\xc5\\x4c\\xae\\x08\\x74\\x18\\x37\\xc9\\xaa\\x35\\xe9\\xc4\\x19\\x69\\xa6\\x09\\x31\\xf1\\x8d\\x06\\x89\\xcc\\xd8\\x61\\x9f\\xe9\\xe5\\x6d\\xf6\\xd1\\xd1\\x83\\x84\\x7f\\x8a\\x07\\x09\\xa7\\x44\\x17\\x43\\xf0\\x71\\x4f\\xd7\\xee\\xa3\\x37\\xc2\\x1a\\x9b\\x6b\\xa1\\xcc\\x65\\x83\\xb2\\x3e\\x8b\\xae\\x01\\x0f\\x2b\\x7a\\xc9\\xf6\\xd9\\xdd\\xbc\\xbf\\xa8\\x69\\x20\\x59\\xd3\\x9b\\xc9\\x4c\\x70\\x23\\xf3\\xc4\\x3d\\xfa\\x72\\xcc\\xc4\\xbc\\x9e\\x8e\\xe8\\x69\\x18\\x1c\\xae\\xc6\\x3b\\xc9\\xb5\\x1a\\x18\\x2f\\x86\\x51\\xfa\\x4f\\x13\\x6a\\x41\\xde\\xfb\\xe1\\xb0\\x13\\x1a\\xd9\\xa8\\xa5\\x8b\\xb5\\x44\\xe4\\x12\\x2a\\x7b\\x47\\xfa\\xf4\\x5d\\x5d\\xb8\\xec\\x95\\x19\\xb6\\x1e\\xd3\\x08\\x6e\\x65\\xac\\xa5\\x60\\x48\\xa5\\x49\\xc6\\xa1\\x98\\xd1\\x58\\x48\\x6b\\x2e\\xb1\\xce\\x08\\x98\\x25\\xf3\\xd7\\x81\\xab\\x61\\x45\\xc5\\x78\\xa4\\x1a\\x25\\x7a\\xa6\\x28\\xe9\\xde\\x77\\xd7\\x32\\xad\\x28\\x5b\\xe9\\x5a\\xa6\\x35\\x58\\xd7\\xce\\x0a\\x69\\x0d\\xd4\\xcd\\x12\\x76\\xad\\x78\\x65\\xe9\\x42\\xbf\\x09\\x76\\x4c\\x13\\xfa\\x55\\x99\\x1f\\xcf\\x90\\x56\\x4c\\xe6\\x8f\\x8b\\xfc\\xfc\\x3c\\x2d\\x17\\x13\\xf9\\x93\\x12\\xbf\\x28\\x42\\x5a\\xba\\xc4\\xaf\\x0b\\xfc\\xad\\x27\\x8e\\x3f\\xcd\\x89\\x55\\xc5\\x17\\xc5\\xdc\\xc1\\x88\\xad\\xc8\\x28\\x21\\x65\\xce\\x81\\xc2\\x59\\xd8\\x8a\\xc9\\x9f\\x2d\\x26\\x4f\\x76\\x33\\xd3\\x9a\\xbb\\x4c\\x04\\x0a\\x6c\\xc2\\x56\\x9b\\x74\\x41\\x84\\xee\\x59\\x85\\xad\\x0e\\x16\\x48\\xe3\\x1d\\xec\\x1f\\x74\\x25\\xef\\x60\\xd7\\xb2\\x29\\xf7\\xd3\\xe2\\x0e\\xb7\\x5b\\x0f\\x0f\\xdb\\xad\\x2c\\x70\\x9a\\x2e\\x84\\xe5\\x75\\xf3\\x81\\xd3\\x84\\x5e\\xd7\\x1e\\x7c\\xa7\\x3e\\x1b\\x21\\xf7\\xb5\\x60\\x01\\x0e\\x1f\\x21\\xf7\\x99\\x82\\xee\\x86\\xb4\\x45\\x35\\xe8\\x6e\\x90\\x11\\xf7\\xc6\\x9b\\xe2\\xe1\\x69\\xe1\\x46\\xc9\\xc2\\x82\\xfc\\x2c\\x90\\x01\\x1c\\x3d\\x36\\x24\\x23\\x6f\\xa8\\x07\\x70\\x68\\x57\\xe3\\x11\\x1c\\x2d\\x64\\x1b\\x57\\x1e\\xe1\\x48\\xb2\\x91\\x71\\x5f\\x5e\\x62\\xdf\\x3f\\xb2\\x79\\x23\\xbc\\xc4\\xdb\\xa0\\xb3\\x42\\x44\\xfe\\x01\\xdf\\xca\\xd4\\xb0\\xcf\\x05\\x85\\x7d\\xcc\\x32\\xe2\\x22\\x02\\x87\\xf9\\xb0\\x4a\\x02\\x8e\\x82\\xd3\\x64\\x48\\x34\\xc2\\xbd\\x94\\x4e\\x78\\x6c\\xa6\\x8f\\x86\\xfd\\x50\\x97\\x1b\\x78\\xcf\\x3e\\x76\\x47\\x77\\x30\\xe6\\xec\\xd7\\x39\\x55\\x7d\\x19\\x5e\\x56\\x2e\\x8f\\xc1\\xc0\\xb8\\x05\\x85\\x11\\xf4\\x14\\xb7\\xe7\\x9f\\x08\\xbb\\x50\\x59\\x8f\\x9f\\xb0\\x9a\\xec\\xd5\\x04\\xd9\\xcd\\xf8\\x50\\x84\\x3b\\xdc\\x43\\x1f\\x6f\\x1d\\x5f\\x00\\x94\\xc3\\xb9\\xa7\\x97\\x1f\\x01\\x52\\x11\\xbe\\x6a\\xf2\\xfc\\x44\\xba\\x91\\x98\\x99\\x44\\xd6\\x26\\xaa\\x81\\x8d\\x42\\xb3\\x2e\\xa7\\xb4\\x00\\xaf\\xb5\\xa5\\x89\\xc8\\xc7\\x89\\x3b\\x8c\\x96\\xe7\\xc9\\x26\\x8e\\x9e\\x0a\\x0a\\x1e\\x4a\\xdd\\x94\\x1d\\x82\\x29\\x5b\\xd8\\x06\\x9a\\x4f\\x21\\x0b\\xa4\\x1b\\x46\\xad\\xa8\\x94\\x79\\x8c\\xb1\\xd6\\x6d\\x7a\\xad\\xbd\\x8d\\xe1\\xc2\\xd0\\x11\\x67\\x16\\xa4\\xae\\x9b\\x43\\x40\\x30\\xe3\\xc3\\x10\\xb1\\x57\\xf5\\xff\\xfb\\xf2\\x55\\x1e\\x01\\x46\\x0e\\xe1\\x0e\\xf4\\x80\\x57\\x28\\xef\\xfd\\xb2\\x57\\x2e\\xac\\xe8\\x9e\\xf4\\x7f\\x03\\x00\\x00\\xff\\xff\\xdc\\x02\\x04\\xb3\\x7b\\xeb\\x02\\x00\")\n\nfunc uiJsLibsNvd3171NvD3MinJsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiJsLibsNvd3171NvD3MinJs,\n    \"ui/js/libs/nvd3/1.7.1/nv.d3.min.js\",\n  )\n}\n\nfunc uiJsLibsNvd3171NvD3MinJs() (*asset, error) {\n  bytes, err := uiJsLibsNvd3171NvD3MinJsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/js/libs/nvd3/1.7.1/nv.d3.min.js\", size: 191355, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsAppTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x94\\x92\\xcf\\x6e\\xe2\\x30\\x10\\xc6\\xef\\x79\\x8a\\x91\\x4f\\x41\\x62\\xe3\\x7b\\x58\\x56\\x0b\\x12\\x42\\x7b\\xd8\\xaa\\x6a\\xa5\\x5e\\x91\\x89\\xa7\\x89\\x2b\\x6c\\x47\\x63\\xa7\\x14\\x55\\x7d\\xf7\\x1a\\x43\\xda\\xa4\\x29\\x28\\xcd\\xc1\\xff\\xf2\\xfb\\x3c\\x9e\\x6f\\x86\\x73\\x70\\xb6\\xa1\\x02\\x73\\x10\\x75\\x9d\\x79\\x97\\xf0\\x70\\xf4\\x9b\\xf0\\x11\\x09\\x4d\\x81\\x50\\x0b\\x5f\\xcd\\x99\\x3f\\xd4\\xca\\x94\\x8e\\x6b\\xe5\\x2b\\x52\\xbb\\xa7\\x8f\\x55\\x26\\x83\\x86\\x01\\xff\\x93\\x7c\\x2f\\xac\\x45\\x89\\x8e\\x97\\x24\\xea\\xaa\\x05\\xaf\\x70\\xda\\x1a\\xe5\\x2d\\x8d\\x20\\x8d\\x95\\xe8\\x46\\x70\\x84\\xce\\x6f\\xf0\\xa5\\xde\\x59\\xc2\\x31\\xf7\\xba\\x10\\xfe\\xf3\\xe2\\x40\\xc2\\xa2\\xf1\\x95\\xa5\\x1c\\x16\\x46\\x12\\xee\\x61\\x69\\xcd\\x33\\x1a\\x4f\\x08\\xa9\\x30\\xf2\\xb0\\xb5\\xc6\\xfd\\x2d\\xb5\\x08\\x4e\\x14\\x56\\x4f\\xba\\x82\\x25\\x09\\x0d\\x6b\\x6a\\x0c\\x2a\\x82\\x74\\x1b\\x76\\xe5\\x69\\xd3\\xe5\\x13\\x9d\\x91\\x6d\\x3c\\x66\\x3a\\x24\\x04\\x73\\x60\\x95\\x70\\x15\\x9b\\xb5\\xc7\\xa9\\xb4\\x45\\xa3\\x43\\xbc\\xac\\x44\\xbf\\xda\\xe1\\x71\\xb9\\x3c\\xfc\\x93\\x29\\x23\\x6b\\x3d\\x9b\\x4c\\x81\\xc5\\x14\\x7f\\xb5\\x29\\xb2\\x29\\xbc\\x26\\x10\\x3e\\x76\\x32\\x9d\\x85\\x87\\x4b\\xad\\xcc\\x83\\xc2\\xbd\\xcb\\xd6\\xb1\\x0e\\xb7\\x21\\xd3\\xe9\\x19\\x3a\\x3b\\xde\\xc7\\xfe\\x9f\\xcb\\xd0\\x05\\x8f\\x86\\xf7\\xa9\\x9b\\x58\\x82\\x38\\x7e\\x05\\xdd\\x68\\x92\\xe7\\xc7\\x71\\xa3\\xe4\\x25\\xc5\\xe0\\xea\\x1f\\x29\\xfa\\xde\\xf4\\x04\\x77\\xe1\\xd7\\xaa\\x6d\\x8c\\xae\\x26\\xb6\\x40\\x9f\\xbd\\x3f\\x75\\x45\\x9c\\x06\\xa8\\xbb\\xcc\\xba\\x01\\xcc\\xf3\\x38\\x0d\\x9e\\x7f\\x3d\\xc2\\x58\\x55\\xf2\\x36\\x99\\x25\\xef\\x01\\x00\\x00\\xff\\xff\\x27\\x3f\\x35\\x45\\xd3\\x03\\x00\\x00\")\n\nfunc uiTsAppTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsAppTs,\n    \"ui/ts/app.ts\",\n  )\n}\n\nfunc uiTsAppTs() (*asset, error) {\n  bytes, err := uiTsAppTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/app.ts\", size: 979, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsComponentsMetricsTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xa4\\x58\\x6b\\x8f\\xdb\\xb8\\x15\\xfd\\xee\\x5f\\xc1\\x1a\\x08\\x56\\x0e\\x66\\xe9\\x09\\x06\\xed\\x07\\xa5\\x93\\xb6\\x48\\xb6\\x8b\\x00\\x3b\\xbb\\x68\\x53\\xa4\\x2d\\x8a\\xa2\\xa0\\x25\\xda\\x66\\x86\\x12\\x55\\x92\\xf2\\xa3\\x03\\xff\\xf7\\x9e\\x4b\\x4a\\xf2\\x43\\xb2\\x3c\\x45\\x89\\x20\\x63\\x49\\x97\\xe7\\x92\\xf7\\x79\\xc8\\xf9\\x9c\\x39\\x53\\xdb\\x4c\\xa6\\x2c\\x33\\x45\\x65\\x4a\\x59\\x7a\\x37\\x2f\\xa4\\xb7\\x2a\\x73\\xdc\\xbb\\xc9\\x1c\\x12\\xbf\\xb5\\x72\\x29\\xad\\x2c\\x33\\xc9\\x2a\\xe1\\xd7\\x8f\\x53\\xce\\xe7\\x7e\\x5f\\xa9\\x72\\x05\\x51\\xe5\\xd7\\x56\\xe9\\x6f\\xdd\\x2f\\x9e\\x63\\xda\\x94\\xcd\\x3f\\xdc\\x9c\\x9a\\x3f\\xe0\\xdf\\x6d\\xf1\\xc2\\xe4\\x52\\xbb\\xb9\\x57\\x85\\x74\\xd2\\x2a\\xe9\\xda\\x09\\x93\\xc9\\xfc\\xed\\x5b\\x36\\x61\\x6f\\xd9\\xc7\\x6e\\xe9\\x2c\\x97\\x4b\\x55\\x4a\\xc7\\xac\\xac\\x9d\\x58\\x68\\x79\\xb2\\x2d\\xb6\\x5d\\xab\\x6c\\xcd\\x0a\\xb1\\x67\\x0b\\xc9\\x6a\\x27\\x73\\x66\\x4a\\x56\\xd4\\xda\\xab\\x4a\\x93\\xc2\\x95\\x74\\x77\\x04\\x67\\xec\\xf1\\x6d\\x50\\x4b\\x72\\x7e\\x2d\\x99\\x13\\x45\\x94\\xe3\\x10\\x9b\\x4f\\xb0\\xb2\\x1a\\x22\\x27\\xda\\x5f\\x26\\x0c\\x03\\xcb\\x0a\\x7f\\x01\\x55\\x6e\\x58\\xb6\\x16\\x16\\x9f\\x1a\\xe1\\xdc\\x00\\xae\\x34\\x9e\\x65\\xb5\\xc5\\x46\\xbd\\xde\\xb3\\xb5\\xd8\\x48\\x26\\x18\\xcc\\x22\\x5d\\x66\\x55\\xe5\\xe3\\x26\\x94\\x57\\xa6\\xe4\\x0d\\xd0\\x3c\\xfc\\xcd\\x65\\xa6\\x85\\x95\\x6c\\x23\\x2c\\x90\\x53\\x51\\xee\\xdf\\x4f\\x2e\\x35\\x3e\\x45\\xdf\\x61\\xdf\\xa5\\x17\\xaa\\x74\\xa7\\x06\\x08\\x7b\\xf6\\x86\\xe5\\xca\\x55\\x1a\\x66\\x68\\xfc\\xcc\\x72\\xe1\\xc5\\xb9\\x26\\xb9\\xab\\x8c\\xf5\\xed\\xa2\\x5b\\xcc\\xb8\\xbd\\x33\\x85\\x51\\xe9\\x4f\\xb0\\xf9\\x8f\\x56\\x54\\xeb\\x16\\xda\\x61\\x43\\x1a\\x2f\\xd9\\x2a\\xbc\\x35\\xcb\\x60\\x3f\\xd2\\x03\\xcf\\xf8\\xda\\x96\\x58\\xc8\\xd2\\x9a\\x82\\xf6\\x0d\\x0b\\x9f\\x62\\x45\\x27\\xb3\\x7f\\xd7\\xd2\\xee\\xf9\\xc9\\x87\\x79\\xf7\\xfb\\x7c\\x71\\x47\\xdd\\xc7\\xe5\\xf5\\x96\\x18\\xa1\\xbf\\x2a\\xb9\\x7d\\xa2\\x70\\x62\\xca\\x85\\x05\\x85\\xd8\\x62\\x4b\\x38\\x5c\\x30\\x57\\xc9\\x4c\\x2d\\x55\\x76\\x02\\xf8\\x3d\\x53\\x25\\x13\\x79\\x1e\\x5c\\x01\\xc3\\x5d\\xe2\\x11\\xc4\\x42\\x64\\xcf\\x08\\x67\\xf6\\x27\\x5a\\x2f\\x33\\x8b\\x6f\\x32\\xf3\\x77\\x4c\\x79\\x26\\xb4\\x33\\x08\\x36\\xd5\\xb8\\xc1\\x40\\xd8\\xb2\\x4a\\xda\\xef\\x3b\\x87\\x5c\\xc2\\xb5\\x6e\\x31\\x15\\xe9\\x73\\xfc\\xe2\\xfb\\xfc\\xec\\x19\\xb8\\xd2\\x2e\\x05\\x32\\xe5\\xb8\\xab\\x73\\x03\\xd0\\x08\\x56\\x4c\\xc3\\x57\\xc7\\x1b\\x37\\xf2\\xb0\\xd4\\x27\\x51\\x22\\x90\\xed\\xfb\\xde\\x14\\x2d\\x9c\\xff\\xa1\\x32\\xd9\\x3a\\x2d\\xeb\\x62\\x31\\x24\\xf1\\x2c\\xf7\\xbf\\x1b\\xfc\\x78\\x98\\xdc\\xf2\\xc0\\x47\\x44\\xa5\\x35\\x5a\\xc3\\x14\\x5d\\x80\\x06\\x2b\\xd6\\xfa\\x99\\xa2\\x64\\x59\\x97\\x19\\x6d\\x5e\\x68\\xe5\\xf7\\xac\\x94\\x32\\x8f\\x11\\x8b\\x54\\xc9\\x31\\x47\\x5c\\xe2\\x75\\xbe\\x1a\\x37\\x16\\xd2\\xc6\\xb9\\x53\\xe5\\x7d\\x4b\\xa1\\xfa\\x94\\x9b\\xfc\\x21\\xa6\\x2b\\xef\\x7d\\x0e\\xaf\\xd9\\x23\\x64\\x78\\x2c\\x48\\x9c\\xc2\\xfb\\x23\\xbd\\x4d\\x66\\x3d\\x69\\x1a\\x7c\\x97\\x24\\xf9\\x8c\\x3d\\x7e\\xc0\\x36\\xb6\\xec\\x93\\xf0\\x32\\x41\\xad\\xa3\\x72\\xe2\\x45\\x51\\xfd\\xab\\x14\\xa5\\x71\\xf3\\x77\\xfc\\x5e\\xfe\\x66\\x76\\x05\\x60\\xdf\\x02\\xe4\\x7c\\x23\\x74\\x2d\\x87\\xc5\\xe6\\x73\\x1e\\x62\\x41\\xc0\\x70\\x1b\\x99\\x78\\x7b\\x4d\\x90\\x23\\xfd\\x3f\\x1f\\x25\\x7f\\xac\\x15\\xf6\\x81\\x4d\\xc4\\x29\\x6c\\x78\\x8e\\x5b\\x9b\\xed\\x4f\\x72\\x05\\xf3\\x8f\\x21\\x93\\xd4\\xdf\\xff\\xb0\\x53\\xee\\x96\\xd0\\xdf\\x6e\\x09\\xed\\xbe\\x64\\x42\\xc3\\x52\\x0f\\xc1\\x54\\xdc\\x85\\xa7\\xd9\\xec\\xfd\\xa4\\x27\\x0e\\x33\\x7a\\x64\\x6b\\x66\\xb4\\xb1\\x0e\\x9e\\xc1\\x94\\x20\\xcd\\x33\\x98\\x7a\\x65\\xec\\xfe\\xdd\\x7d\\x32\\x34\\x0f\\x71\\xe7\\xb0\\x80\\xcc\\x1b\\x9b\\x54\\xf5\\x42\\x03\\x63\\x53\\xa4\\x5d\\x12\\xcd\\x06\\x62\\x83\\x06\\xe2\\xe3\\x8b\\xf4\\x6c\\x47\\x1b\\x40\\xcd\\xca\\x9e\\x1d\\xc5\\x65\\x65\\x0d\\x52\\x1a\\x45\\x1c\\x35\\xa4\\x10\\x03\\x71\\x43\\xc3\\xaf\\x95\\xe3\\x31\\xae\\xc2\\xf4\\x41\\xa1\\xb0\\x7b\\xc2\\xfd\\x63\\x40\\xea\\x2c\\x10\\x81\\x93\\xef\\xde\\x7c\\x4e\\xdf\\x3c\\xa5\\x6f\\xbe\\x7c\\x77\\x25\\x5a\\x3a\\x13\\x3f\\x89\\xdd\\x93\\x2a\\x93\\x25\\xea\\x8f\\x9c\\xf5\\x93\\xf7\\xd0\\xb7\\x48\\x2f\\x4f\\x69\\xa0\\x10\\xaf\\x4d\\xad\\xf3\\x3f\\x87\\xcc\\xfb\\x74\\xac\\xdc\\xd8\\x37\\xdc\\xc7\\x54\\x28\\xe9\\x68\\x46\\x30\\x07\\x05\\x78\\xa8\\xed\\x5d\\xa6\\x0e\\x18\\xe2\\x22\\x25\\x69\\x5c\\x6a\\x48\\x66\\xe9\\xc2\\x18\\x2d\\x45\\x79\\xc5\\x09\\xd4\\xf8\\x24\\xd5\\x26\\xf8\\x3b\\x58\\x75\\x53\\xf0\\xd8\\x28\\xc2\\xdb\\x2b\\x99\\x88\\xa5\\x26\\x71\\xd6\\x87\\x6e\\x56\\x57\\xe5\\xae\\xf9\\x9b\\x46\\x4f\\x18\\x6a\\x03\\xd0\\xd5\\x19\\xd1\\x44\\xc1\\x42\\x7d\\xd3\\xd3\\x38\\x0c\\xbe\\x6d\\xa6\\x05\\x9f\\xbd\\xd6\\x65\\x03\\x09\\xfb\\x16\\x5c\\xc2\\x0d\\xba\\x2a\\xb6\\xe1\\xe0\\x23\\xf8\\x4b\\x6c\\x84\\xd2\\x81\\x1d\\xfd\\x8f\\x0e\\x6b\\xe0\\x6f\\xfa\\xa9\\x35\\xc3\\x90\\x8b\\xe0\\x84\\xfb\\xff\\x67\\x8b\\xb9\\x15\\xdb\\xd8\\x9e\\x57\\x92\\x08\\x9f\\xb2\\xe8\\xb8\\x4c\\x64\\x99\\x74\\x21\\x25\\x03\\x51\\xdb\\xac\\x98\\xd4\\xb2\\x40\\x93\\x6d\\xb9\\x47\\xb0\\xc0\\x10\\x9e\\x58\\xa2\\x24\\x52\\xc3\\x26\\xc3\\xe4\\x4d\\xbf\\xf9\\xf4\\xcb\\x13\\x67\\x7f\\x0d\\x2c\\x91\\xfd\\xfc\\xf5\\xd3\\x43\\x60\\x4d\\x50\\x7c\\xa4\\x31\\xc4\\x5e\\x86\\xe0\\x48\\xe0\\x92\\xbb\\x8c\\x58\\xf4\\xb8\\x9b\\x47\\x04\\x69\\x5c\\x72\\xfa\\x43\\xfc\\x0b\\x1a\\xe1\\x3e\\x13\\x0f\\x44\\x37\\xfc\\x8f\\xcc\\x5b\\x9b\\xdf\\x85\\xd6\\x29\\x77\\x9e\\x08\\x60\\xe8\\x0f\\xc3\\x4e\\xa0\\xb0\\xff\\xd5\\x19\\xc2\\x58\\xac\\xa3\\xb1\\x61\\xf7\\x61\\x29\\xc9\\xb1\\x60\\x0d\\x14\\x10\\x1a\\x07\\xd6\\xf7\\x57\\xab\\x32\\x4c\\xee\\x67\\xf6\\x98\\x6e\\x4a\\xeb\\x58\\xe7\\xbc\\xcc\\x43\\xfc\\x3e\\xb2\\x7f\\xfc\\xf3\\xaa\\x38\\x4a\\xf1\\x5f\\x60\\x65\\x2b\\x1d\\x58\\x3a\\x02\\x2a\\x16\\x61\\xf0\\x85\\xad\\xd2\\x9a\\xb8\\xbd\\x2c\\x2a\\x3c\\x61\\x31\\x08\\x50\\x69\\xad\\xb1\\x63\\x50\\x26\\x03\\x15\\x97\\x39\\x67\\x28\\xbc\\x60\\xe6\\xdb\\x3b\\xb6\\x95\\x11\\xe9\\x5b\\xed\\x7c\\x47\\xca\\xc8\\xaf\\xd3\\x9f\\x0d\\x35\\x72\\x31\\x1d\\xc3\\x43\\x83\\x77\\x60\\x56\\xac\\x2e\\xbd\\xd2\\x84\\x05\\xd6\\xae\\xf2\\x78\\xd8\\x20\\x90\\xb8\\x5a\\xb6\\x25\\xcc\\x8e\\x8a\\x8f\\x01\\x86\\x1d\\xb4\\xb0\\x97\\xac\\xf0\\x64\\x74\\xc6\\xef\\x32\\xae\\xb5\\xd0\\x98\\xed\\x69\\x5c\\xda\\x7e\\x18\\xa5\\xf9\\xe1\\x78\\x21\\xaa\\x96\\x99\\x8c\\xe3\\xd2\\x68\\x4a\\xc1\\x6d\\x41\\x1a\\x81\\xe6\\xb8\\x14\\x84\\x87\\x72\\xac\\x32\\x20\\x36\\x74\\x24\\x7b\\xc5\\x00\\x27\\xa5\\x69\\x25\\x4e\\x68\\xaf\\x9b\\x10\\x78\\x43\\x7a\\xc2\\x09\\x79\\x64\\x12\\x49\\x04\\x99\\xbd\\x0e\\x05\\xa7\\x31\\x91\\x52\\x91\\x7d\\x9d\\xf8\\x12\\x61\\xf5\\x4b\\x25\\x32\\x90\\xdb\\x94\\xbf\\xbb\\x3d\\xe7\\x30\\x9c\\x7e\\xdd\\xe7\\x2b\\xe9\\x19\\xbe\\x5d\\xfd\\x42\\x44\\x09\\x95\\x26\\xf3\\x6d\\xbd\\xb9\\x4e\\x28\\x68\\x90\\x2b\\xea\\x22\\x39\\x8b\\x91\\x11\\x0a\\xe2\\xad\\x28\\x5d\\x38\\x30\\x21\\x62\\xf2\\xda\\x8a\\xf0\\xf3\\xd7\\xf7\\xf7\\x37\\xb4\\x80\\xba\\xe9\\x57\\x14\\x9e\\x81\\xce\\x71\\xfe\\x74\\xf6\\xd8\\x9c\\x14\\xdb\\x53\\x45\\x28\\x9c\\xd1\\xdb\\x49\\x60\\xf1\\xe3\\xb4\\xaf\\x09\\x5d\\x62\\x37\\x1f\\x2f\\x26\\xce\\x46\\x0f\\x3e\\x97\\x6a\\x37\\xd0\\x92\\x64\\xde\\xea\\xf4\\x88\\x33\\xa4\\x90\\x32\\x98\\xc4\\x78\\xd7\\x67\\xaf\\x65\\x6e\\xb3\\xb4\\x22\\x99\\x86\\x73\\x48\\x68\\x6e\\xd3\\xbb\\x61\\x0e\\xdf\\x8e\\x17\\xe7\\xf7\\x5a\\xa6\\xd3\\xad\\xca\\xfd\\x3a\\x85\\x47\\xaa\\xdd\\xfb\\xb5\\x54\\xab\\xb5\\x4f\\x1f\\xc2\\xc3\\xf4\\x30\\x1e\\x91\\xd0\\x86\\xc6\\xca\\x5b\\x65\\x2f\\xb0\\xe6\\x52\\xad\\x52\\x16\\x96\\xdc\\x35\\xb2\\xc3\\xb8\\xa3\\x87\\x28\\x29\\x7a\\x35\\xfa\\xec\\xad\\x9d\\x42\\xe5\\x54\\x1b\\x91\\xe3\\xb4\\xcd\\x39\\x9f\\x0e\\x72\\xdb\\xf3\\xa7\\x5b\\xa7\\xd1\\x0c\\xd9\\xeb\\xc1\\x8f\\x70\\x20\\x10\\xa8\\xd6\\xf8\\x4d\\xf7\\x16\\x0e\\x0a\\x74\\xfb\\x16\\xe7\\xeb\\x86\\x40\\x1c\\xaf\\x05\\xae\\x1e\\xe0\\xe3\\x05\\x53\\x77\\x05\\xd2\\xf1\\x84\\xc8\\x49\\xea\\xaa\\xd2\\x0a\\x7d\\xe0\\xec\\x18\\xde\\xdc\\x18\\x5c\\x1e\\x5f\\x2f\\x91\\x7f\\x5f\\x09\\x2b\\x0a\\xaa\\x72\\xa1\\xf5\\xd1\\xdf\\xf8\\x46\\x35\\xb7\\x3a\\x8b\\x3d\\x6b\\x2e\\xe0\\x02\\x07\\xc2\\x19\\xef\\xb9\\x81\\x76\\x74\\x89\\xa1\\x95\\xeb\\x2e\\xc0\\x32\\x74\\xc5\\x05\\xb5\\x4f\\x61\\x91\\xab\\x2b\\xb4\\xbe\\xd1\\xb3\\x73\\x2f\\x87\\x82\\xd1\\x92\\x9b\\x37\\x0b\\x77\\xa7\\xf7\\x04\\xb3\\xbe\\x73\\xa9\\xe9\\x9f\\x1e\\xbc\\xd0\\x77\\x5e\\x8e\\x77\\x0f\\xf7\\x77\\xcd\\xdd\\x45\\xf8\\xbf\\x9f\\xf6\\x94\\x2a\\xc0\\xbf\\x96\\x1f\\x68\\x5e\\x64\\xa3\\x47\\x5a\\xc3\\xad\\x38\\xa1\\xd1\\x46\\x19\\xef\\x7c\\x9b\\x74\\xfe\\xbe\\x03\\xda\\x6c\\x32\\x3c\\x3f\\xfe\\x3a\\x4c\\x0e\\x93\\xff\\x06\\x00\\x00\\xff\\xff\\x8c\\xe7\\x71\\x33\\x4a\\x15\\x00\\x00\")\n\nfunc uiTsComponentsMetricsTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsComponentsMetricsTs,\n    \"ui/ts/components/metrics.ts\",\n  )\n}\n\nfunc uiTsComponentsMetricsTs() (*asset, error) {\n  bytes, err := uiTsComponentsMetricsTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/components/metrics.ts\", size: 5450, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsHeaderTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x6c\\x53\\x41\\x6f\\x9b\\x4c\\x10\\x3d\\xc7\\xbf\\x62\\x3e\\x5f\\xe2\\x48\\xfe\\x20\\x8d\\xd4\\x4b\\xa2\\x4a\\x21\\xb1\\x9b\\xa2\\xa6\\x58\\x32\\xa4\\x51\\x8e\\xcb\\x32\\x86\\x6d\\x61\\x97\\xce\\x2e\\x21\\xfc\\xfb\\xce\\x02\\x4e\\x13\\xb5\\x3e\\x79\\x66\\xdf\\xbc\\x79\\x6f\\x66\\x08\\x43\\xb8\\x43\\x8d\\x24\\x1c\\x16\\x90\\x0f\\xe0\\xac\\x0c\\x16\\x9c\\xb4\\xa6\\x23\\x89\\x97\\x20\\x8d\\xfc\\x49\\x46\\xc8\\x2a\\x24\\x9c\\x72\\x61\\x67\\x43\\x67\\xc3\\x20\\x18\\x71\\x9b\\x1d\\x24\\xbb\\x0c\\xb6\\x9b\\x38\\xfb\\x8f\\x63\\x9f\\xba\\x35\\xed\\x40\\xaa\\xac\\x1c\\x5c\\x9c\\x7f\\xf8\\x08\\x59\\x85\\x9c\\x9a\\x59\\x20\\xea\\x5c\\x65\\xc8\\x06\\x33\\xf6\\x5e\\x49\\xd4\\x96\\x5b\\x77\\xba\\x40\\x02\\xc7\\xd8\\xa8\\x65\\x1c\\x1e\\x5f\\xd6\\xf0\\x1d\\xc9\\x2a\\xa3\\xe1\\x22\\x38\\x87\\x95\\x07\\x2c\\xe7\\xa7\\xe5\\xd9\\x95\\xa7\\x18\\x4c\\x07\\x8d\\x18\\x40\\x1b\\x07\\x9d\\x45\\xe6\\x50\\x16\\x0e\\xaa\\x46\\xc0\\x17\\x89\\xad\\x03\\xa5\\xd9\\x45\\xd3\\xd6\\x4a\\x68\\x89\\xd0\\x2b\\x57\\x8d\\x7d\\x66\\x96\\xd1\\xc5\\xd3\\xcc\\x61\\x72\\x27\\x18\\x2e\\xb8\\xa0\\xe5\\xe8\\xf0\\x16\\x08\\xc2\\xcd\\xa2\\xfd\\xaf\\x72\\xae\\xbd\\x0c\\xc3\\xbe\\xef\\x03\\x31\\x0a\\x0e\\x0c\\x95\\x61\\x3d\\x41\\x6d\\x78\\x1f\\xdf\\x6e\\x93\\x74\\xfb\\x3f\\x8b\\x9e\\x8b\\x1e\\x74\\x8d\\xd6\\x02\\xe1\\xaf\\x4e\\xd1\\x34\\x6b\\xd1\\xb2\\x28\\x29\\x72\\x96\\x5a\\x8b\\x1e\\x0c\\x81\\x28\\x09\\xf9\\xcd\\x19\\x2f\\xba\\x27\\xe5\\x94\\x2e\\xd7\\xbc\\x8b\\x83\\xeb\\x05\\xa1\\xa7\\x29\\x94\\x75\\xa4\\xf2\\xce\\xbd\\x9b\\xd9\\x51\\x22\\x3b\\x7f\\x0b\\xe0\\xa9\\x09\\x0d\\xcb\\x28\\x85\\x38\\x5d\\xc2\\x4d\\x94\\xc6\\xe9\\xda\\x93\\x3c\\xc6\\xd9\\x97\\xdd\\x43\\x06\\x8f\\xd1\\x7e\\x1f\\x25\\x59\\xbc\\x4d\\x61\\xb7\\x87\\xdb\\x5d\\xc2\\x5b\\x8c\\x77\\x09\\x47\\x9f\\x21\\x4a\\x9e\\xe0\\x6b\\x9c\\x6c\\xd6\\x80\\x3c\\x31\\xee\\x83\\x2f\\x2d\\x79\\x07\\x86\\x3c\\x85\\xf2\\x03\\xc5\\x22\\x80\\x14\\xf1\\x9d\\x84\\x83\\x99\\x24\\xd9\\x16\\xa5\\x3a\\x28\\xc9\\xd6\\x74\\xd9\\x89\\x12\\xa1\\x34\\xcf\\x48\\x9a\\x1d\\xf9\\xfa\\x16\\xa9\\x51\\xd6\\x2f\\xd6\\xb2\\xc6\\x02\\x6a\\xd5\\x28\\x27\\xdc\\x18\\xff\\xe5\\xeb\\x4f\\x97\\xe8\\x81\\x95\\xef\\xd3\\x71\\xbf\\x9e\\xc6\\x77\\xd3\\xa2\\x41\\xeb\\x97\\x25\\x8d\\x9e\\xac\\xbf\\x39\\xb0\\xf9\\xde\\x2e\\xe1\\x86\\x44\\x03\\x77\\xd4\\x69\\x54\\x04\\xab\\x9c\\xa3\\xa0\\x9c\\xa2\\xeb\\xb2\\x11\\xaa\\x0e\\xf8\\x46\\xce\\xb8\\xe2\\xe4\\xc4\\xaf\\x37\\xd2\\x05\\x61\\x0f\\x37\\x46\\x3f\\x23\\x93\\x22\\xac\\x58\\xe4\\x90\\xb3\\xba\\x7f\\xa1\\xbf\\x09\\xe7\\x20\\x23\\x21\\x07\\x58\\x35\\xfc\\xff\\xfa\\xf5\\xab\\xa9\\x45\\x6e\\x8f\\xd8\\xc5\\xe2\\x59\\x10\\x54\\x28\\xd8\\xdd\\x06\\xad\\x24\\xd5\\x7a\\xbf\\xf0\\x09\\x4e\\xb3\\xd7\\x9b\\xf5\\x1b\\x44\\xab\\x4a\\x3d\\x9d\\x81\\x28\\x8a\\xd1\\xf7\\x54\\xe5\\x33\\x3e\\x72\\xa6\\x3d\\x1e\\x27\\x73\\xe7\\xca\\x83\\x7f\\x4c\\x04\\xc1\\xe9\\xd5\\xe2\\x77\\x00\\x00\\x00\\xff\\xff\\x05\\xd5\\x4c\\x27\\xd4\\x03\\x00\\x00\")\n\nfunc uiTsHeaderTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsHeaderTs,\n    \"ui/ts/header.ts\",\n  )\n}\n\nfunc uiTsHeaderTs() (*asset, error) {\n  bytes, err := uiTsHeaderTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/header.ts\", size: 980, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsModelsNode_statusTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xdc\\x19\\xe9\\x6e\\xdb\\x36\\xf8\\x7f\\x9e\\x82\\x10\\x60\\x40\\xca\\x12\\x39\\xd9\\x80\\x01\\x53\\x8e\\xad\\x6b\\xd2\\x0b\\x39\\xba\\xb8\\x2b\\x3a\\x18\\x46\\xc0\\x58\\x74\\xcc\\x4d\\xa2\\x34\\x92\\x72\\xeb\\xa5\\x7e\\xf7\\x7d\\xa4\\x28\\x4b\\x96\\x68\\xc9\\x0a\\x36\\x60\\x18\\x7f\\xd4\\x0a\\xf9\\xdd\\x37\\xd9\\xe1\\x10\\x89\\x24\\xe3\\x53\\x12\\xa0\\x38\\x09\\x49\\x24\\x86\\x0c\\x7e\\xee\\x85\\xc4\\x32\\x13\\xbe\\x14\\x7b\\x43\\x80\\x38\\xe5\\x64\\x46\\x38\\x61\\x53\\x82\\x52\\x2c\\xe7\\x67\\x8e\\xef\\x0f\\xe5\\x32\\xa5\\xec\\x51\\x0c\\x63\\x2a\\xe7\\x9c\\x46\\xbf\\xaf\\xbf\\xfc\\x10\\xd0\\x1c\\x34\\x3c\\xb7\\xa3\\x2a\\xca\\xa2\\x84\\x40\\x2f\\x32\\x39\\x4f\\x78\\x80\\x7e\\xe6\\x38\\x46\\xaf\\x79\\xc6\\x08\\xe5\\xc8\\x7d\\x80\\xbf\\xfc\\xc7\\xfc\\xaf\\x9f\\x1e\\x63\\x0c\\x64\\xa7\\x49\\xec\\xed\\xed\\x81\\x90\\x59\\x44\\xd0\\xb5\\x96\\x15\\x3d\\xed\\x21\\x58\\xe4\\x4b\\x9a\\x70\\x89\\xcc\\xd1\\x0d\\x1c\\x8d\\xb4\\xf8\\xe6\\x58\\x2d\\x1a\\x6b\\x90\\x94\\x27\\x31\\x15\\x04\\x9d\\xa1\\xfb\\x42\\xda\\xeb\\xfc\\xf7\\x7d\\x7e\\x72\\xb2\\xb7\\x46\\x31\\x54\\x29\\x93\\x84\\xcf\\x30\\xc8\\xff\\x22\\x0c\\x39\\x11\\x55\\xaa\\x6a\\x31\\x22\\x3f\\x27\\xfc\\x8f\\x00\\x09\\xc9\\xc1\\x20\\x27\\x1b\\x87\\x38\\x47\\x69\\x1e\\xae\\x5a\\xf8\\x28\\x05\\x2e\\x88\\x98\\x72\\x9a\\x4a\\x9a\\xb0\\x3a\\x3f\\xe5\\x1e\\x1a\\x06\\x88\\x65\\xf1\\x03\\xe1\\x5b\\xf8\\x19\\x59\\x6b\\xa7\\x52\\x72\\x38\\xc3\\x6c\\xb9\\xbb\\x20\\x0d\\x4b\\xaa\\x15\\x82\\x74\\x41\\x5d\\xce\\x4d\\x5e\\x42\\x26\\x5c\\xc9\\x29\\x0a\\x41\\xc7\\x93\\x4d\\x00\\x8e\\xd9\\x23\\xb9\\x9f\\x26\\x19\\x93\\x76\\x5d\\x20\\x50\\xb8\\x24\\xe1\\x3d\\xde\\x72\\x9e\\xa5\\x21\\x6e\\x3b\\xd7\\x81\\x16\\x98\\x48\\xf1\\x47\\x3a\\xec\\xae\\x3f\\xbe\\x7c\\xa9\\xbf\\x36\\x41\\x23\\x82\\x43\\xc2\\xef\\x3b\\x45\\xe2\\x24\\x8d\\xe8\\x54\\x73\\xed\\x84\\xc5\\x0b\\x08\\x5a\\xfc\\x10\\x91\\x76\\xd0\\xdd\\xec\\x7f\\x47\\x44\\x9a\\x30\\x41\\x46\\x44\\xd6\\x5d\\x11\\x54\\xc0\\xc6\\x93\\x9e\\x74\\xaf\\xa8\\x90\\xd7\\x38\\xad\\xd1\\x1c\\xab\\x18\\x7b\\xbb\\x0e\\xb1\\xc9\\x33\\x59\\x54\\x62\\x63\\x57\\x1e\\x15\\x94\\x9e\\x9a\\xf4\\xd3\\xa2\\x85\\xf8\\x34\\xc2\\x90\\xe3\\x0a\\xb4\\x1e\\xf5\\x29\\xa7\\x0b\\xf0\\xbd\\x0e\\x2c\\x3a\\x45\\xf7\\x10\\x7e\\xf8\\x8a\\x42\\x1d\\x81\\x72\\x72\\x7c\\xa4\\xd6\\x49\\x27\\xfc\\x7b\\x55\\xd2\\xc2\\x11\\xfd\\x4b\\xd5\\xa0\\x1f\\xb6\\xe3\\x68\\xe0\\xc0\\x56\\xa5\\x52\\xc2\\xe5\\xf2\\xb4\\xe1\\xc2\\x73\\xa0\\x17\\xfb\\x50\\xdf\\x52\\xd7\\x76\\xf8\\xb4\\xf2\\x2a\\xa5\\x4d\\x73\\xca\\x1e\\x20\\x96\\x4d\\x2a\\xb7\\xf2\\xd9\\xf4\\x63\\x9d\\x51\\xfd\\x54\\x73\\xb2\\x30\\xca\\x3b\\x0a\\x11\\x3b\\x29\\xb5\\x55\\xa1\\x2d\\xca\\xfc\\x92\\x11\\xbe\\x74\\x3d\\x2b\\x6d\\x55\\xd6\\x4f\\xad\\xa9\\x74\\x5e\\x73\\xb0\\x5a\\x0b\\xcc\\x51\\xc6\\x23\\x60\\xee\\x0c\\x4d\\x17\\xd4\\x1d\\x51\\x0c\\x9d\\x93\\x06\\x30\\x27\\x32\\xe3\\x0c\\xc4\\xe4\\xe4\\xcf\\x8c\\x08\\xe9\\x3e\\x29\\xdc\\x40\\xfd\\x73\\x80\\x62\\x02\\x8d\\x0d\\xc2\\xcf\\x79\\x7d\\xf9\\xc1\\x39\\x80\\xf0\\x92\\x1c\\x4f\\x55\\x05\\x48\\xd8\\x3b\\x91\\xb0\\x4b\\xce\\x13\\x2e\\xd0\\xca\\x6b\\x50\\x55\\xcb\\x97\\x73\\xc2\\x5c\\x17\\x6a\\x78\\x16\\xa9\\x2a\\x66\\x95\\xdf\\x43\\x67\\x36\\x15\\x4a\\xe9\\x34\\x32\\xf4\\xe3\\x59\\xc2\\x2f\\xf1\\x74\\xee\\xba\\xb9\\x42\\x1d\\x78\\x85\\x19\\xf2\\xfc\\x01\\x4b\\x98\\x61\\x40\\x85\\x8a\\x6f\\xda\\x4f\\xd3\\x16\\xd5\\x45\\x67\\xc8\\x95\\x73\\x2a\\x7c\\x1d\\xc6\\xae\\x67\\x52\\x71\\x82\\xce\\xce\\x20\\x1b\\xa3\\xc8\\xeb\\xe0\\xae\\x96\\x1d\\x1f\\xd5\\xdb\\x48\\x7d\\xad\\x3a\\xd5\\x12\\xeb\\xcc\\x00\\x72\\x36\\x2e\\xdd\\xba\\xb9\\x25\\x0d\\x3f\\x22\\xec\\x51\\xce\\x95\\x66\\x47\\x1e\\xfa\\xfa\\xb5\\x53\\xaf\\x0a\\xee\\xb8\\x49\\xe6\\x10\\x1d\\x4f\\xfc\\xb2\\xb3\\xa1\\xd3\\xc2\\xf8\\xe5\\x9e\\xf7\\x5c\\xeb\\xf9\\x69\\x26\\xe6\\x45\\x08\\xb4\\x2b\\xb9\\x26\\x51\\x64\\xed\\x86\\x0f\\xf2\\xcd\\xe7\\xfa\\xa1\\x5e\\x1f\\x9a\\x62\\xa7\\xaa\\x48\\xde\\x46\\xe1\\x25\\x83\\xa9\\x49\\xf1\\xee\\x42\\xc8\\x8d\\x53\\xa9\\x44\\xad\\x38\\x26\\x6b\\x4d\\x7a\\xd8\\xe1\\xea\\x42\\xae\\xf6\\xec\\x65\\xda\\xc6\\x39\\x40\\x8b\\x84\\x86\\x16\\x27\\x69\\x61\\x55\\x16\\xed\\x58\\x39\\xd5\\x2a\\x13\\xd1\\x3e\\x61\\xaa\\x05\\xe9\\x8d\\x5c\\x93\\xad\\x94\\x6d\\xf8\\x7e\\x5b\\xac\\x94\\xa2\\x54\\x1d\\x6b\\x8b\\x9a\\xb1\\x35\\x94\\xaa\\xe1\\xaa\\xc8\\x34\\x85\\x5a\\xed\\x64\\xbf\\x86\\xab\\xb7\\x1a\\xef\\x5f\\x32\\x44\\x59\\x11\\x7a\\x55\\x03\\x55\\x05\\x4c\\x66\\x1a\\x53\\x9c\\xe7\\x33\\x83\\x5f\\x8e\\x05\\x6d\\x79\\xba\\x66\\x69\\x88\\x88\\x29\\xf4\\x48\\x52\\x23\\x79\\x58\\x25\\x59\\x4e\\x0e\\x07\\x75\\xa8\\x63\\x7b\\x0f\\x69\\xa6\\x60\\xab\\x4f\\xe0\\x2e\\xf6\\xe1\\xf6\\xe2\\xd6\\x55\\x17\\x31\\x4f\\xcd\\xcd\\x0b\\x82\\x64\\x82\\x32\\x49\\x23\\x2a\\x97\\xf9\\x5c\\xe4\\xdb\\xbd\\x68\\x66\\x5d\\x0d\\xe8\\x6e\\x3a\\xc9\\x2b\\x3e\\x5a\\x5c\\x5a\\x58\\xbe\\x59\\x6c\\x9a\\xc6\\x57\\x86\\x57\\x87\\x7e\\x73\\x66\\x37\\x35\\xd8\\x6e\\x74\\x93\\xf4\\x0e\\x0c\\x6a\\x03\\x4b\\x27\\x6f\\xda\\xca\\x20\\xe4\\xcc\\xac\\xc3\\x3c\\x1a\\xa2\\x6d\\x92\\xec\\xab\\x81\\xd0\\xf3\\x65\\x32\\xd2\\xba\\xbb\\x1e\\xfa\\x06\\x39\\x75\\xbe\\xff\\x9c\\xfd\\xcb\\x7b\\xc9\\xff\\xd2\\xfa\\xf6\\x6b\\xd7\\x7f\\xc6\\xfc\\x95\\xf9\\x9e\\x48\\x1a\\x93\\x57\\x09\\x8f\\xe1\\x93\\x83\\x61\\xc3\\xef\\x7c\\xb5\\xa3\\x06\\x30\\xd8\\x72\\x9d\\xc1\\x6f\\x87\\x83\\xf8\\x70\\x10\\xa2\\xc1\\x9b\\x60\\x70\\x1d\\x0c\\x46\\x8e\\xd7\\x4a\\x32\\xc7\\xbb\\x80\\x2d\\x97\\x61\\x96\\xac\\x2f\\xd3\\x5d\\x7e\\x2d\\x44\\x01\\x11\\x18\\xf9\\x8c\\x4a\\x02\\x60\\xb4\\x63\\xff\\x88\\x7c\\x6f\\xe9\\x34\\xc6\\xe4\\x65\\xc9\\xd9\\x50\\xc6\\x2d\\x36\\x3a\\x1a\\x63\\x3e\\xec\\x5f\\x10\\x09\\x09\\x23\\x9a\\xd1\\x58\\x9f\\xcf\\x3f\\x52\\x2e\\x33\\x1c\\x5d\\x46\\x24\\x26\\xac\\x7e\\xb7\\x2d\\xb4\\x79\\x6e\\x94\\x76\\x8d\\x9b\\xc5\\xf8\\xee\\x3a\\x21\\x5d\\xc0\\x88\\xee\\xdc\\x24\\xca\\x72\\x18\\xdc\\x40\\x84\\x12\\x67\\x49\\xa4\\xef\\x34\\x8b\\x6b\\x4d\\x67\\x1b\\xa9\\xb1\\x95\\x21\\x1c\\x4b\\x55\\x45\\xb6\\x02\\x14\\x40\\x5c\\x41\\xa8\\x8f\\x50\\x89\\x35\\x52\\x6f\\x29\\x02\\xb9\\x0e\\x84\\xb1\\x0e\\xf9\\xf5\\xe3\\x4a\\xd1\\x03\\x20\\xbc\\xbd\\xc0\\xf1\\x0e\\x5a\\x47\\xb2\\x82\\xde\\xb8\\x46\\x23\\xc6\\xa9\\x3b\\xcb\\xd8\\x54\\x0d\\x22\\xae\\xde\\x7e\\x1b\\xee\\x32\\x63\\xee\\xa6\\xb3\\x45\\x0a\\x3c\\x9e\\x73\\x32\\x3b\\x1b\\x6a\\x5e\\x70\\xb1\\x02\\xf1\\x0d\\x5b\\xa5\\xc8\\x04\\x48\\x3d\\xa1\\x69\\xc2\\x66\\xf4\\x31\\x50\\x77\\xab\\x24\\x83\\x8c\\x58\\x1d\\x14\\x30\\x1d\\x5a\\x16\\xcb\\x01\\x4a\\x1d\\x53\\xee\\xca\\x9b\\xd8\\x3b\\xa7\\x5a\\x93\\x16\\x3e\\x4d\\x17\\xdd\\x98\\x57\\x40\\xf0\\xc1\\xda\\xce\\xda\\xcc\\xfa\\xd2\\x64\\x9e\\xe5\\x7c\\xf3\\x56\\xe8\\xf5\\xa3\\x6d\\xde\\xf2\\x3a\\x68\\x9b\\xdf\\x9e\\xb4\\x47\\xf9\\x23\\x1b\\xc2\\x72\\x83\\xbc\\x29\\x02\\xd5\\xf2\\x93\\xc7\\x4c\\xf1\\x24\\xe7\\xf5\\xe4\\xf3\\x6b\\x7e\\x7d\\xd9\\x91\\x4f\\xf5\\xb2\\xd3\\x8f\\xcf\\x9d\\xea\\x02\\x16\\x53\\x55\\xba\\x43\\x4f\\x8a\\x57\\xba\\xbd\\xa0\\x6d\\x84\\x9b\\xdd\\xa7\\xaf\\x77\\x8b\\xd1\\x62\\x2b\\x0b\\xeb\\xf0\\xf1\\x4c\\x2e\\xba\\x99\\x6d\\xb0\\xc8\\x67\\x5e\\xcb\\x04\\xd7\\xdb\\xc5\\x0c\\x0c\\x71\\x78\\xb7\\xee\\xd5\\x3d\\x4c\\x06\\x33\\x6c\\x4b\\xa3\\xef\\x29\\xc7\\x2b\\xa8\\xf8\\x4b\\x54\\xca\\x61\\xd1\\xb6\\x31\\x2f\\x79\\xdb\\x2a\\x81\\x65\\xbb\\x5e\\x55\\x56\\xb6\\xc7\\xc4\\xe1\\xfe\\x7e\\x09\\xb4\\x5f\\x7b\\xf3\\x21\\x4c\\x64\\xaa\\xa0\\xcb\\x39\\xdc\\xf0\\x89\\xda\\x43\\x31\\xa4\\x2e\\x06\\x6b\\x99\\xa2\\x0a\\xd6\\x9b\\xf1\\x24\\x06\\x08\\x98\\x05\\x08\\x5f\\x10\\x5e\\xa5\\x86\\xb9\\xfa\\xcf\\x14\\x2e\\x88\\x0e\\x1b\\x2c\\xd0\\xbb\\xd1\\xed\\x8d\\xe9\\xb1\\xd5\\x19\\x65\\x7f\\xb8\\xfe\\x2e\\xea\\xfb\\xa6\\x24\\xee\\x97\\x39\\x0f\\xd0\\xa7\\xeb\\xab\\x37\\x52\\xa6\\x77\\xf9\\x1b\\xd6\\x01\\x4a\\x52\\x69\\x79\\xa5\\xfb\\xf4\\xe6\\xee\\x36\\xbf\\xe1\\x6e\\x1b\\x3e\\x4c\\x3f\\x00\\x9a\\xa6\\x4b\\xc3\\x9d\\xe8\\xdb\\xa3\\x23\\xf4\\xa3\\x96\\xcf\\xcf\\x71\\xe8\\x6c\\xa9\\xb8\\x82\\xab\\xf3\\x67\\xac\\x0f\\xe4\\x0b\\x5c\\x94\\x02\\x54\\xdf\\xab\\xbe\\x90\\xe7\\xff\\xae\\xf6\\xfe\\x0e\\x00\\x00\\xff\\xff\\x68\\xfa\\x72\\xbe\\xac\\x1a\\x00\\x00\")\n\nfunc uiTsModelsNode_statusTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsModelsNode_statusTs,\n    \"ui/ts/models/node_status.ts\",\n  )\n}\n\nfunc uiTsModelsNode_statusTs() (*asset, error) {\n  bytes, err := uiTsModelsNode_statusTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/models/node_status.ts\", size: 6828, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsModelsStatsTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x84\\x92\\x3f\\x4f\\xc3\\x30\\x10\\xc5\\x77\\x7f\\x8a\\x53\\x27\\xe8\\x10\\xef\\xe5\\x8f\\x80\\x0e\\x4c\\x9d\\x90\\x58\\xab\\xab\\x73\\x4d\\x42\\xfd\\x27\\x3a\\x9f\\x2b\\x22\\xd4\\xef\\x8e\\xd3\\x06\\x04\\xa8\\x35\\x37\\x58\\x3e\\xfd\\xde\\xf3\\xbb\\x93\\xac\\x35\\xc4\\x90\\xd8\\xd0\\x02\\x5c\\xa8\\xc9\\x46\\x1d\\x05\\x25\\x56\\x12\\x95\\xce\\xec\\x96\\x69\\x4b\\x4c\\xde\\x10\\xf4\\x28\\xed\\xdd\\xac\\xaa\\xb4\\x0c\\x7d\\xe7\\x9b\\xa8\\x5d\\x27\\x2d\\x77\\xf6\\xed\\xfb\\x56\\xd5\\xd9\\x36\\x03\\x7d\\x9f\\xad\\xf0\\x98\\xa4\\x0d\\xbc\\x80\\x27\\x46\\x07\\xcf\\x9c\\x3c\\x75\\x0c\\x57\\x9b\\xdc\\x55\\xcd\\xa9\\x7b\\x68\\x1c\\x66\\x93\\x09\\xee\\x5a\\x29\\x3d\\x9f\\x2b\\x98\\xc3\\xea\\x38\\x03\\x98\\xe0\\x05\\x3b\\x1f\\xa1\\x46\\xc1\\x69\\x30\\xe8\\x93\\xb5\\x54\\xc3\\x96\\x83\\xcb\\x02\\xb3\\xe3\\x80\\xa6\\xad\\xb2\\x4b\\xab\\xac\\x48\\x96\\xbe\\xdc\\x1f\\x0a\\x72\\xd1\\x7b\\x1f\\x58\\x60\\x42\\x2f\\xe3\\x56\\x13\\xf9\\x41\\x3b\\x2f\\xc4\\x5b\\xcc\\xeb\\xad\\x5e\\x97\\xcb\\xbf\\xa2\\xb1\\x6c\\xb7\\xa7\\xf5\\x66\\x10\\x8a\\x0b\\xf0\\xc9\\x6d\\x88\\x6f\\x7e\\xf1\\x1d\\x0d\\x25\\xbc\\x47\\x5b\\xc2\\x63\\xbe\\x97\\x92\\xe2\\x98\\x6f\\x42\\xf2\\x72\\x39\\xbf\\x80\\xc7\\xfc\\x02\\x9e\\xf2\\xff\\x57\\x60\\x43\\xe7\\x79\\x63\\x4e\\xd3\\x5f\\x56\\xc4\\x21\\x96\\x16\\x1c\\x71\\x21\\xdf\\x62\\x94\\x75\\xea\\xf3\\x47\\xa0\\xb5\\x47\\x1f\\xce\\xbc\\x72\\x50\\xa7\\xf3\\xa0\\x3e\\x03\\x00\\x00\\xff\\xff\\xf7\\xb6\\xa5\\x6d\\xce\\x02\\x00\\x00\")\n\nfunc uiTsModelsStatsTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsModelsStatsTs,\n    \"ui/ts/models/stats.ts\",\n  )\n}\n\nfunc uiTsModelsStatsTs() (*asset, error) {\n  bytes, err := uiTsModelsStatsTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/models/stats.ts\", size: 718, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsModelsStore_statusTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xdc\\x19\\x69\\x6f\\xdb\\x36\\xfb\\xbb\\x7f\\x05\\x21\\xc0\\x80\\x94\\xd7\\x91\\x93\\xb7\\xc0\\x80\\x29\\xc7\\xd6\\x25\\x69\\xbb\\x22\\x47\\x17\\x77\\x45\\x07\\xc3\\x08\\x18\\x89\\xb6\\xb5\\xe9\\x1a\\x49\\xb9\\xf1\\x52\\xff\\xf7\\x3d\\x3c\\x64\\x5d\\x94\\x8f\\x6c\\x03\\x86\\x09\\x85\\xa5\\x92\\xcf\\x7d\\x93\\x19\\x0e\\x11\\x4b\\x73\\xea\\x13\\x0f\\xc5\\x69\\x40\\x22\\x36\\x64\\x3c\\xa5\\xe4\\x81\\x71\\xcc\\x73\\xe6\\x72\\xd6\\x1b\\x02\\xc8\\x29\\x25\\x53\\x42\\x49\\xe2\\x13\\x94\\x61\\x3e\\x3f\\xb3\\x5c\\x77\\xc8\\x97\\x59\\x98\\xcc\\xd8\\x30\\x0e\\xf9\\x9c\\x86\\xd1\\xaf\\xeb\\x2f\\x37\\x00\\x34\\x0b\\x0d\\xcf\\xb7\\xa2\\x06\\xaf\\xe0\\xdf\\x16\\xf0\\x04\\xa4\\x2a\\xa5\\xe9\\x86\\x13\\x20\\x15\\x08\\xf4\\x3a\\xe7\\xf3\\x94\\x7a\\xe8\\x07\\x8a\\x63\\xf4\\x96\\xe6\\x09\\x09\\x29\\xb2\\x1f\\xe1\\x7f\\xee\\x4c\\xfd\\xef\\xfb\\x59\\x8c\\x41\\x5a\\x3f\\x8d\\x9d\\x5e\\x0f\\x94\\xcf\\x23\\x82\\x6e\\xa4\\x0d\\xd0\\x73\\x0f\\xc1\\x43\\x9e\\xb2\\x94\\x72\\xa4\\xb7\\x46\\xc2\\x2e\\x23\\x29\\x88\\xde\\x17\\x4f\\x18\\x4b\\x98\\x8c\\xa6\\x71\\xc8\\x08\\x3a\\x43\\x0f\\x85\\x15\\x6e\\xd4\\xfb\\x83\\xda\\x39\\xe9\\xad\\x51\\x34\\xd9\\x30\\xe1\\x84\\x4e\\xb1\\xaf\\x29\\x5f\\x12\\xe6\\xd3\\x30\\xe3\\x61\\x9a\\x54\\xc8\\x8b\\x47\\x39\\x24\\x0c\\x3c\\x94\\xe4\\xf1\\x23\\xa1\\x27\\xb5\\x5d\\x61\\x1f\\x4f\\xcb\\xed\\xde\\xc2\\x4b\\x89\\x28\\x3f\\x2b\\x34\\xeb\\x48\\x98\\x73\\xca\\x3c\\x84\\x93\\x65\\xb9\\xbe\\xda\\x20\\xe1\\x05\\xce\\xb0\\x1f\\xf2\\x65\\x43\\xb2\\x62\\xd9\\x2c\\xd9\\xeb\\x05\\x98\\x17\\x3f\\x46\\xc4\\xbc\\x7d\\x8f\\x93\\x19\\xb9\\x48\\xf3\\x84\\xb7\\xf7\\x37\\xc9\\x62\\xf6\\x83\\x78\\x02\\x50\\xd7\\x6b\\x59\\xb3\\xce\\x95\\x0a\\xae\\x0f\\xbe\\x99\\xad\\xb2\\x36\\xa6\\x9c\\x04\\x0f\\xb8\\x63\\x3f\\xcf\\x02\\xbc\\x69\\x5f\\xc6\\xe1\\xda\\x21\\x23\\x19\\x95\\x37\\x9f\\x2e\\x2e\\xe4\\x57\\x1d\\x34\\x22\\x38\\x20\\xf4\\x61\\xab\\x48\\x94\\x64\\x51\\xe8\\x4b\\xae\\x5b\\x61\\x71\\x61\\xf4\\xcd\\xa0\\x3b\\x1a\\xf8\\x9e\\xb0\\x2c\\x4d\\x18\\x19\\x11\\xde\\xb4\\xb5\\x57\\x85\\x1b\\x4f\\xf6\\xa5\\x7c\\x1d\\x32\\x7e\\x83\\xb3\\x06\\xd5\\xb1\\x8c\\xf5\\x1f\\xd7\\xa1\\x3e\\x79\\x31\\x97\\x4a\\x00\\xec\\xce\\xa6\\x82\\xb4\\xaf\\x3e\\xfb\\xea\\xb2\\x81\\xbe\\x1f\\x61\\xc6\\x14\\x6c\\x33\\xc2\\x33\\x1a\\x2e\\x20\\x0e\\x64\\x90\\x85\\x3e\\x7a\\x80\\x50\\xc4\\xd7\\x21\\x54\\x1c\\x28\\x3c\\xc7\\x47\\xe2\\x39\\xd9\\x0a\\xff\\x41\\x54\\xbf\\x60\\x14\\xfe\\x21\\xaa\\xd5\\xb7\\xdd\\x38\\x12\\xd8\\x33\\xd5\\xb3\\x8c\\x50\\xbe\\x3c\\x6d\\x3b\\xf3\\x1c\\x08\\xc6\\x2e\\x94\\xc2\\xcc\\x36\\xee\\x3e\\xaf\\x9c\\x4a\\x19\\x94\\xbc\\xf2\\x47\\x88\\x6c\\x9d\\xb8\\x9b\\x39\\xd5\\x1d\\xda\\x62\\xd5\\xdc\\x96\\xbc\\x0c\\xac\\x54\\x27\\x21\\x6c\\x37\\xc5\\xba\\x95\\xea\\x50\\xe8\\xa7\\x9c\\xd0\\xa5\\xed\\x18\\xa9\\x8b\\x36\\x70\\x6a\\x4e\\xae\\xf3\\x86\\x9f\\xc5\\xb3\\xc0\\x14\\xe5\\x34\\x02\\xf6\\xd6\\x50\\x37\\x40\\xd5\\x9b\\xd9\\xd0\\x3a\\x69\\x41\\x53\\xc2\\x73\\x9a\\x80\\xa4\\x94\\xfc\\x9e\\x13\\xc6\\xed\\x67\\x81\\xec\\x89\\x9f\\x01\\x8a\\x09\\xf4\\x42\\x08\\x44\\xeb\\xed\\xd5\\x47\\x6b\\x00\\x71\\xc6\\x29\\xf6\\x45\\x55\\x48\\x93\\xf7\\x2c\\x4d\\xae\\x28\\x4d\\x29\\x43\\x2b\\xa7\\x45\\x55\\x3c\\x2e\\x9f\\x93\\xc4\\xb6\\x81\\x6f\\x1e\\x89\\xca\\x66\\xd6\\xc0\\x41\\x67\\x26\\x25\\x4a\\xf1\\x24\\x36\\xf4\\xfa\\x69\\x4a\\xaf\\xb0\\x3f\\xb7\\x6d\\xa5\\xd2\\x16\\xbc\\xc2\\x10\\x3a\\x97\\xc0\\x18\\x7a\\x14\\x10\\x21\\xe3\\x16\\x9d\\xb1\\x6d\\x8e\\xea\\x13\\x4e\\x91\\xcd\\xe7\\x21\\x73\\x65\\x44\\xdb\\x4e\\x91\\x98\\x13\\x74\\x76\\x06\\xb9\\x19\\x45\\xce\\x16\\x01\\xc4\\xd3\\x41\\x00\\x8d\\x27\\x9b\\x99\\xaf\\x76\\x50\\xad\\x48\\x12\\x20\\x67\\x64\\xb3\\x5d\\x3d\\xbb\\x24\\xe2\\x46\\x24\\x99\\xf1\\xb9\\xd0\\xed\\xc8\\x41\\x5f\\xbf\\x6e\\xd5\\xac\\x82\\x3b\\x6e\\x93\\x39\\x44\\xc7\\x13\\xb7\\xec\\x79\\xe8\\xb4\\x70\\x40\\xb9\\xe6\\xbc\\xd8\\x7e\\x6e\\x96\\xb3\\x79\\x11\\x08\\x9b\\xb5\\x5c\\xd3\\x28\\x12\\xb8\\xee\\x06\\xb5\\xfa\\x52\\x57\\x34\\x6b\\x45\\x5b\\xf0\\x4c\\x14\\xcd\\xbb\\x28\\xb8\\x4a\\x38\\x0d\\x05\\xf3\\x6d\\x08\\xca\\x3c\\x95\\xaa\\xb4\\x11\\x47\\x67\\xaf\\xce\\x12\\x33\\x5c\\x53\\xc8\\x55\\xcf\\x5c\\xb6\\x4d\\x9c\\x3d\\xb4\\x48\\xc3\\xc0\\xe0\\x26\\x29\\xac\\xc8\\xa5\\x5d\\xcb\\xa8\\x78\\x44\\xd4\\x8a\\xb1\\x53\\xf4\\x36\\x06\\xf6\\x48\\x66\\x6d\\x18\\x48\\x73\\x64\\x2b\\x20\\x68\\x98\\x35\\xf7\\x77\\x85\\x4b\\x29\\x8b\\x33\\x56\\x98\\x93\\x66\\x46\\xe8\\xe5\\xb1\\x69\\xb1\\x16\\xb1\\x82\\x4c\\x5b\\xa8\\xd5\\x4e\\x06\\x6c\\xf9\\xba\\xd3\\x7a\\xff\\x90\\x21\\xca\\xaa\\xd0\\xa1\\xbf\\x39\\x40\\x44\\x21\\xd0\\xc9\\xa9\\x4d\\x71\\xae\\xa7\\x08\\xb7\\x1c\\x14\\x36\\xe5\\xea\\x9a\\xa7\\xa6\\xc2\\x7c\\xe8\\x98\\xa4\\x41\\xf3\\xb0\\x46\\xb3\\x1c\\x26\\x06\\xa8\\x09\\x77\\x6c\\xee\\x27\\xed\\x34\\xdc\\xe8\\x16\\x38\\xca\\x7d\\xbc\\xbb\\xbc\\xb3\\xc5\\x39\\xce\\x11\\x73\\xf5\\x82\\x20\\x9e\\xa2\\x9c\\x87\\x91\\x38\\x90\\xc8\\x61\\xc9\\x35\\x3b\\x52\\xcf\\xc2\\x12\\xd0\\x2e\\xa6\\x31\\xe5\\x27\\x47\\xbf\\x3b\\x9c\\x2a\\x81\\x0b\\xe3\\x1b\\x2a\\x4e\\xdb\\x01\\xca\\xf8\\xb0\\xeb\\xb6\\xa7\\x7a\\x5d\\x8b\\xcd\\x86\\xd7\\xa9\\x6f\\xc1\\xf8\\xd6\\x37\\xf4\\xf5\\xb6\\xb5\\x34\\x82\\xe6\\x66\\x9c\\xf7\\xd1\\x10\\x75\\xca\\x72\\x20\\x06\\x45\\xc7\\xe5\\xe9\\x48\\x1a\\xc0\\x76\\xd0\\xff\\x90\\xd5\\xe4\\xfc\\xf7\\xf9\\xa0\\x3c\\xbb\\xac\\x3d\\x80\\x0a\\x17\\xa0\\xff\\x88\\x0f\\xcc\\xe7\\xb3\\x7f\\x8f\\x13\\x2a\\xd3\\x3f\\xe1\\x61\\x4c\\xde\\xa4\\x34\\x86\\x4f\\x0a\\xc6\\x0d\\x5e\\xb9\\x62\\x45\\x4c\\x65\\xb0\\x64\\x5b\\xfd\\x5f\\x0e\\xfb\\xf1\\x61\\x3f\\x40\\xfd\\x77\\x5e\\xff\\xc6\\xeb\\x8f\\x2c\\x67\\x23\\x49\\x85\\x77\\x09\\x4b\\x76\\x82\\x93\\x94\\x15\\x87\\x9d\\x6d\\xce\\x2d\\x44\\x01\\x11\\x12\\xf2\\x05\\x95\\x04\\xc0\\x6a\\xc7\\xee\\x11\\xf9\\xc6\\xd0\\x76\\xb4\\xd1\\x2b\\xe5\\xa7\\xa6\\x8d\\x5d\\x2c\\x6c\\xe9\\x93\\xea\\x1c\\x70\\x49\\x38\\x24\\x0e\\x6b\\x95\\x85\\xe6\\xdc\\xfe\\x29\\xa4\\x3c\\xc7\\xd1\\x55\\x44\\x62\\x92\\x34\\x0f\\xc1\\x85\\x36\\x7f\\x21\\x54\\xb7\\xcd\\xa0\\xc5\\x5c\\x6f\\x5b\\x41\\xb8\\x80\\xd9\\xdd\\xba\\x4d\\x85\\xf1\\x30\\x78\\x82\\x30\\x21\\xd1\\x92\\x70\\xd7\\x6a\\x57\\xda\\xce\\x98\\x2d\\x28\\x8d\\x8d\\xec\\x60\\x97\\x8b\\x6a\\x02\\x9c\\xcc\\x00\\x0a\\x84\\x8a\\x7d\\xf1\\x11\\x28\\x91\\x02\\x82\\xc0\\x86\\x96\\x33\\x40\\xc5\\x22\\xbc\\xf1\\x78\\x4e\\xc9\\xf4\\x6c\\x28\\x9a\\x16\\x9c\\x59\\x20\\xc4\\x55\\x3e\\xc8\\xd1\\x5d\\x2c\\xca\\x1f\\x18\\xdf\\x45\\xf0\\x4f\\x00\\xe7\\x19\\xf9\\x69\\x32\\x0d\\x67\\x9e\\x38\\xc6\\xa4\\x39\\x84\\xd9\\x6a\\xd0\\x85\\xe3\\x38\\x13\\x67\\xb0\\x9f\\x84\\xb7\\x84\\x7f\\x49\\xe9\\x6f\\x35\\x31\\x9b\\xd4\\x71\\x10\\x80\\x5d\\x99\\x9b\\x28\\xd8\\xfd\\x99\\xbc\\x56\\x04\\x76\\x62\\xa2\\xdf\\x7b\\x31\\x19\\xa9\\xeb\\x29\\x84\\x79\\x8d\\x45\\x91\\x14\\x95\\x7c\\x54\\x5c\\xcb\\xeb\\xac\\xfd\\x2c\\xf6\\xb3\\x1a\\xef\\x77\\xe6\\x53\\x3d\\x0e\\xec\\xc3\\x47\\xde\\x02\\x9a\\xcc\\x55\\x29\\x97\\x7b\\x11\\xbc\\x96\\xd5\\x16\\x75\\xd2\\x6d\\x57\\xe3\\xbd\\xc8\\xaf\\x2f\\x35\\xbb\\x39\\x18\\x5b\\xf2\\x8b\\x98\\xc8\\xca\\x5e\\xe3\\xa0\\xa6\\x41\\xd3\\x60\\xb3\\xa7\\x7b\\x13\\x30\\xc2\\xe1\\xfd\\xba\\x71\\xed\\x63\\x2f\\x18\\xed\\x36\\xf5\\xbd\\xbd\\xe4\\x78\\x03\\xa5\\x6f\\x89\\x4a\\x39\\x0c\\xca\\xb6\\x27\\x08\\xa1\\xaa\\x91\\x83\\x61\\x79\\xd2\\xea\\x06\\xe5\\xd7\\xfa\\x73\\x78\\x70\\x50\\x02\\x1d\\x34\\xae\\x45\\x48\\xc2\\x72\\x71\\x13\\xc7\\xe7\\x70\\xfc\\x25\\x62\\x0d\\xc5\\x90\\xb5\\x18\\xcc\\xa5\\x6b\\x2a\\x98\\x6f\\x4a\\xd3\\x18\\x20\\xa0\\x31\\x12\\xba\\x20\\xb4\\x4a\\x0d\\x53\\xf1\\x27\\x0a\\xca\\x88\\x8c\\x1a\\xcc\\xd0\\xfb\\xd1\\xdd\\xad\\xee\\x8e\\xd5\\x86\\x7d\\x30\\x5c\\x7f\\x4f\\xf3\\xc4\\x97\\x7f\\x08\\xa8\\x49\\x62\\x3f\\xcd\\xa9\\x87\\x3e\\xdf\\x5c\\xbf\\xe3\\x3c\\xbb\\x57\\xd7\\x3c\\x03\\x94\\x66\\xdc\\x70\\x99\\xf5\\xf9\\xdd\\xfd\\x9d\\x3a\\xfc\\x75\\x75\\x62\\xdd\\x0e\\x80\\xa6\\xee\\x58\\x70\\x5a\\xf8\\xff\\xd1\\x11\\xfa\\x4e\\xca\\xe7\\x2a\\x9c\\x70\\xba\\x14\\x5c\\xc1\\xd3\\xea\\xa2\\xe7\\x23\\x79\\x82\\x13\\x84\\x87\\x9a\\x6b\\xd5\\x8b\\x65\\xf5\\xbb\\xea\\xfd\\x19\\x00\\x00\\xff\\xff\\xdb\\xd1\\xe8\\xc5\\x5a\\x1a\\x00\\x00\")\n\nfunc uiTsModelsStore_statusTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsModelsStore_statusTs,\n    \"ui/ts/models/store_status.ts\",\n  )\n}\n\nfunc uiTsModelsStore_statusTs() (*asset, error) {\n  bytes, err := uiTsModelsStore_statusTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/models/store_status.ts\", size: 6746, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsModelsTimeseriesTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xc4\\x59\\xdf\\x6f\\xdc\\xb8\\x11\\x7e\\xf7\\x5f\\xc1\\xf3\\x93\\x94\\xdb\\x68\\x93\\x7b\\xe8\\x83\\x1c\\xa7\\x0d\\xee\\x82\\x1e\\x0e\\x75\\x93\\x3a\\x46\\x7b\\x40\\x10\\x18\\x5c\\x89\\xbb\\xab\\x46\\xa2\\x14\\x92\\xb2\\xb3\\xbd\\xdb\\xff\\xbd\\xdf\\x90\\xd4\\x6f\\x69\\xb3\\x06\\x0e\\x38\\x01\\x71\\x64\\x89\\x1c\\xce\\x7c\\xf3\\xf1\\x9b\\xa1\\xbc\\x5e\\x33\\x5d\\xd6\\x2a\\x11\\x31\\x2b\\xca\\x54\\xe4\\x7a\\x6d\\xb2\\x42\\x68\\xa1\\x32\\xa1\\x23\\xa3\\x2f\\xd6\\x18\\xf0\\x4a\\x89\\xad\\x50\\x42\\x26\\x82\\x55\\xdc\\xec\\xaf\\x2f\\xa3\\x68\\x6d\\x0e\\x55\\x26\\x77\\x7a\\x5d\\x64\\x66\\xaf\\xb2\\xfc\\xbf\\xed\\x5d\\x94\\x62\\xda\\x25\\x5b\\xbf\\xc6\\x54\\xf6\\xa6\\x36\\xfb\\x52\\xc5\\xec\\x86\\x1b\\xc3\\xee\\x14\\x4f\\x0e\\x2c\\x28\\x70\\xff\\xb7\\xa4\\x4c\\x3e\\xab\\x92\\x27\\xfb\\x9c\\x6f\\x74\\x94\\x94\\x45\\x78\\x71\\xb1\\x7e\\xf6\\xec\\x82\\x3d\\x63\\x37\\xd6\\x0d\\x96\\x94\\xd2\\xf0\\x4c\\x6a\\x96\\x72\\xc3\\xbd\\x6f\\xac\\xaa\\xf3\\x5c\\xa4\\x6c\\xab\\xca\\x82\\xb5\\x26\\x22\\xcc\\x5a\\x5f\\x60\\x44\\x9d\\x8b\\x66\\xf6\\x6f\\x17\\x0c\\x97\\xf8\\x5a\\x95\\xca\\xb0\\xe6\\x95\\x30\\x2a\\x4b\\x9a\\x77\\x74\\x65\\x85\\x7d\\x5f\\xc1\\x5c\\xa6\\x05\\xbb\\x66\\xf7\\x4d\\x10\\x37\\xee\\xff\\xf7\\xee\\xcd\\xd5\\x45\\x3b\\x05\\x4e\\xb2\\xf6\\x17\\x78\\xfb\\xaf\\x5a\\xa8\\xc3\\x9b\\xdd\\x4e\\x89\\x1d\\x37\\xa5\\x62\\x99\\x66\\x5c\\x32\\x21\\xeb\\x42\\x28\\x6e\\xb2\\x52\\xb2\\x72\\xcb\\xcc\\x5e\\x30\\xfe\\xc0\\x33\\x04\\x0b\\x3f\\x78\\x3b\\xba\\x6f\\x68\\x5b\\xcb\\x84\\xc6\\x6b\\xb6\\x85\\x19\\x4a\\x02\\x73\\x59\\x60\\x5f\\x6a\\x97\\x0d\\x76\\xb7\\x87\\x75\\x29\\x44\\xaa\\x99\\x29\\xd9\\x46\\xb0\\xcf\\xa2\\x32\\x2c\\x93\\x4c\\x1f\\x64\\xc2\\x1e\\xe1\\x72\\xdf\\x20\\x2d\\x7a\\x07\\x33\\x1f\\xec\\xec\\xb1\\x9f\\x03\\x0f\\xa5\\x1d\\x8c\\xe5\\x1e\\x84\\x8a\\xfa\\x36\\x82\\x35\\xb0\\x31\\xe5\\x80\\x14\\xf6\\x49\\xd8\\x1b\\xb5\\x6e\\xef\\x3d\\xde\\x64\\x7b\\x02\\x4c\\x87\\x3a\\x5d\\x6f\\xfe\\xfd\\x77\\xc0\\xfd\\x72\\x35\\x7e\\x78\\x7f\\xfb\\xe6\\xee\\x2d\\xde\\xfc\\xd0\\xbd\\x39\\x0e\\xc0\\xef\\x7b\\xf7\\x13\\x98\\x51\\x95\\x99\\x34\\x16\\x75\\xa6\\x41\\x48\\xc0\\x9b\\x76\\x4f\\x25\\x9e\\x12\\x7a\\x07\\xa6\\x84\\xae\\x80\\xad\\x98\\x82\\xd8\\x37\\x38\\xc1\\x73\\x04\\x62\\xb7\\xa0\\x05\\x61\\x53\\x6f\\xb1\\x2f\\x18\\x90\\xd1\\x7c\\x27\\x3c\\x8c\\x7d\\x7b\\x1e\\xd1\\x13\\x30\\x46\\xa7\\x70\\xc4\\x42\\x42\\x6d\\x39\\xb6\\x5d\\xb7\\xf0\\x10\\x46\\x6b\\xcf\\xf0\\xa2\\xba\\x97\\x5c\\x96\\x3a\\x66\\x40\\x7e\\x23\\xd4\\xd5\\x60\\xd0\\x03\\xcf\\x6b\\x31\\x7d\\xb5\\x8c\\xab\\x4d\\xdd\\xad\\xd0\\x75\\x3e\\x44\\xb6\\x85\\x12\\x2f\\xbe\\xc1\\xc6\\xbe\\xb9\\x19\\x20\\x7b\\x2b\\x44\\xf6\\xfe\\x04\\xa0\\x4f\\xe3\\xe5\\x99\\x80\\xf6\\x43\\x1c\\x42\\x2a\\x79\\x21\\x62\\x0d\\xa5\\x90\\xbb\\x21\\x8c\\x2d\\xaf\\x00\\x73\\x9b\\x8f\\x8f\\x9f\\x9e\\x86\\xe7\\x07\\x01\\x39\\xe2\\x26\\xd9\\x63\\x5f\\xdb\\xd8\\xea\\x24\\x41\\xb4\\xdb\\x3a\\x67\\x65\\x6d\\xaa\\xda\\x34\\x72\\xb1\\x36\\x7a\\x6d\\xf1\\xee\\x1b\\x12\\x32\\xb5\\xab\\x9e\\x23\\x05\\x63\\x2e\\xce\\x82\\xff\\x27\\xc2\\x4e\\x48\\x0c\\x91\\x77\\xc4\\x02\\xba\\xbd\\x51\\x1f\\x3f\\x9d\\x4d\\x58\\x47\\x55\\x94\\x92\\x02\\x01\\x74\\x4b\\x42\\xe3\\x73\\x51\\x08\\xfc\\x9e\\xb2\\xcd\\xc1\\x46\\xe6\\x78\\x8c\\x0a\\x86\\x24\\x00\\x32\\x92\\x4a\\xcc\\x75\\x55\\xe2\\x29\\x81\\x8c\\xfc\\xb7\\x66\\xe3\\x20\\xbc\\x7e\\xed\\x0b\\xca\\xab\\x61\\xb8\\xaf\\xcf\\x0f\\x25\\xcd\\x74\\xe5\\x59\\xd2\\xee\\xbe\\x71\\x49\\x38\\x50\\xe6\\xe7\\x13\\xd5\\x39\\xde\\x54\\x15\\x37\\x23\\x80\\x56\\x28\\x13\\x83\\xbd\\x62\\x45\\x64\\xf2\\x77\\x28\\x48\\xf1\\x48\\xae\\x57\\x7e\\x25\\xbf\\x13\\x3e\\x7e\\x0a\\xe3\\x85\\xa0\\x46\\x20\\x3c\\x70\\xc5\\x6a\\x95\\x43\\xc2\\x2f\\x5b\\x0a\\x5f\\x8e\\xf5\\x48\\xb9\\xa2\\x7e\\x3d\\x9a\\x4b\\x97\\xf5\\xb0\\x51\\x33\\xfb\\x4b\\xb4\\x13\\x86\\xc8\\x1b\\x84\\x80\\xe7\\x65\\xf4\\x42\\xfc\\x65\\x35\\x99\\x85\\x58\\x9a\\x39\\xb8\\x3d\\x67\\x86\\x2f\\xaa\\xb1\\x8f\\x33\\x2a\\x78\\x15\\x04\\x2a\\x64\\xd7\\x08\\x48\\x09\\x53\\x2b\\x39\\xe3\\x1c\\x5d\\x56\\x1f\\x98\\x9a\\x5a\\xa4\\xab\\x2b\\xed\\x31\\xdd\\x4f\\x07\\x1d\\xaf\\x8e\\xe1\\xf0\\xe9\\xb1\\xfd\\x6d\\xb4\\x19\\xac\\x0f\\x45\\xa4\\x04\\x5c\\xd5\\x26\\xf8\\x0d\\xa8\\xc6\\xf8\\xb7\\xc2\\x3e\\x45\\x53\\x95\\xc6\\x97\\xef\\xdf\\x7d\\xb8\\xbb\\x44\\x1e\\xbf\\x1a\\x34\\x56\\x26\\x96\\xa5\\xfc\\x45\\x97\\xf2\\xad\\x52\\xa5\\xd2\\x2b\\x8b\\x70\\x4c\\x3f\\x8e\\xe1\\xc4\\x8b\\x08\\xb4\\x91\\x41\\x90\\xc6\\xc3\\x5c\\xba\\xe8\\x67\\x03\\x43\\x2f\\xf7\\xbe\\x44\\xf7\\x05\\xbe\\x30\\xb0\\x80\\x28\\x89\\xad\\x86\\x66\\xcc\\xb1\\x6b\\x9b\\x89\\x1c\\x52\\x64\\x75\\x47\\x14\\x95\\x39\\x30\\xae\\x14\\x3f\\xe8\\x68\\xd6\\x58\\xb6\\x65\\xc1\\x77\\x69\\xe4\\xf7\\x7b\\xb8\\xb0\\x24\\x5d\\xed\\x20\\x70\\xa5\\x2f\\x05\\xf3\\x00\\xce\\xce\\x8c\\xd0\\x4e\\xbd\\x45\\x97\\xd8\\x66\\x77\\x71\\x31\\xeb\\x96\\x8a\\x3a\\x9d\\x3f\\xe5\\x19\\x5d\\xfd\\xb1\\xd6\\xc1\\xc5\\xd1\\xf3\\x3e\\x1e\\xc3\\xf9\\x88\\x7c\\xee\\xd3\\xe9\\xdb\\xfe\\x8c\\xe3\\x72\\x53\\x7a\\x2b\\x12\\x08\\x5e\\x4f\\x15\\x9d\\x5e\\x3c\\xee\\xb3\\x64\\x0f\\x9d\\x93\\x19\\x08\\x4a\\x8f\\xd3\\xba\\xeb\\x51\\xd1\\x6f\\x63\\xbb\\xa1\\xc3\\xd0\\xd9\\xff\\x06\\x85\\x03\\xfc\\xc2\\x9e\\xa2\\x84\\x6f\\x78\\xf2\\xf9\\x91\\x2b\\x24\\xda\\x36\\xe0\\xa4\\x3d\\x49\\xad\\x70\\x30\\x30\\x56\\x9c\\x22\\xf6\\x1f\\xd0\\x0a\\xde\\x6f\\x01\\xfd\\x5e\\xa4\\xab\\x4e\\x6c\\x87\\xed\\x40\\x9e\\x53\\xc5\\x52\\xe2\\x39\\x88\\x54\\x43\\x96\\xa1\\x63\\x6e\\x91\\x46\\xd1\\x06\\x56\\x4f\\x09\\x72\\x92\\x73\\xad\\x07\\xe1\\x0e\\x33\\x56\\xa9\\xec\\x81\\x28\\x7b\\x3f\\x52\\xb3\\x21\\xb2\\x36\\x74\\x55\\x27\\x40\\x25\\xa8\\xea\\x4d\\x9e\\x51\\x05\\x95\\x69\\xf9\\xf8\\x93\\xc7\\x27\\x76\\xbd\\xd3\\xaa\\xb3\\x37\\x2b\\x99\\x51\\x14\\x8d\\x55\\x73\\x86\\x41\\x54\\x6c\\x22\\xef\\x10\\x58\\xe3\\x6e\\xae\\x46\\x9a\\x30\\x2d\\x2c\\xc1\\xb9\\x0a\\x4c\\x17\\x49\\x2c\\xf0\\x24\\x11\\xc4\\x12\\x52\\x3c\\x52\\xc7\\x02\\x3d\\x9c\\x32\\x8a\\x46\\x5a\\x99\\x1d\\x8f\\xf5\\xd3\\x7b\\x5a\\xfa\\xdc\\xb9\\x3e\\x84\\x66\\xc6\\xa4\\xa7\\x6f\\xaf\\xe2\\x90\\x81\\x55\\xe3\\xd0\\xca\\x23\\x40\\xfa\\x38\\x00\\x23\\x1c\\x83\\x30\\x03\\xc7\\x5c\\xb5\\xbc\\xe1\\x12\\x6d\\x0b\\xc2\\xa8\\x2b\\x22\\x85\\x6f\\xac\\xf6\\x9c\\x52\\x40\\xcc\\xee\\xb7\\xad\\xae\\xf0\\x6c\\x84\\x79\\x14\\x42\\xf6\\x2d\\x15\\x78\\x99\\xa1\\x53\\xa0\\x06\\x02\\x27\\x05\\xf0\\x49\\x9f\\xc1\\xbc\\xc1\\xfa\\x0b\\xd4\\x73\\x0b\\x8f\\xa4\\x96\\x90\\xc6\\x59\\xf6\\x6a\\x7e\\x8a\\x20\\x0d\\x8f\\xad\\x92\\x9f\\x1e\\xe8\\x6c\\xbf\\xad\\xca\\x64\\xef\\x39\\x8a\\xf1\\x2f\\xae\\x86\\xf4\\x81\\x76\\xdb\\x76\\xd1\\x71\\xbc\\x56\\xa2\\xdd\\x82\\x28\\x19\\xcf\\xc9\\x3a\\x94\\x41\\x74\\x67\\xa5\\x8c\\xba\\xa2\\xe7\\xdb\\x3c\\xdb\\xed\\xcd\\x8a\\xc1\\x85\\x3d\\xd7\\x63\\x83\\x84\\x52\\x2e\\x6c\\x4f\\x85\\x9e\\x55\\x96\\x06\\xe6\\x60\\x02\\x0c\\xa5\\x76\\x56\\xa4\\x5e\\x0b\\xb8\\xec\\x4c\\x8d\\x95\\x60\\x68\\x08\\x15\\xab\\x94\\xf9\\x01\\x3f\\x84\\x6f\\x81\\x71\\x20\\x6f\\xcb\\x0a\\x5c\\xf4\\xdf\\x03\\xe0\\xa5\\x3d\\xcf\\x44\\xf3\\x80\\xa0\\x89\\x26\\x15\\x23\\xb9\\x8a\\xa7\\xdb\\xc2\\xa7\\xe2\\x9b\\xed\\x59\\x9b\\x6b\\x9b\\x87\\x99\\x8f\\x02\\x95\\x50\\xe6\\xf0\\xca\\x26\\x68\\x34\\xed\\xe8\\x13\\x36\\x4a\\x41\\x9f\\xb6\\x74\\x3d\\x63\\x3f\\x36\\xa2\\x83\\x88\\x68\\xd3\\x0d\\xa8\\xe4\\x94\\xba\\xdc\\xb8\\x2f\\x20\\x4d\\x0d\\x6c\\x54\\x77\\x6c\\x8a\\x88\\x9f\\x67\\xc8\\x85\\x45\\x78\\x54\\x73\\x7b\\xd4\\xa5\\x6b\\xa0\\x75\\x0d\\x6a\\xae\\x73\\xb5\\x1e\\x40\\xb1\\x46\\xea\\xd3\\x8c\\xf2\\xb9\\x7d\\xd7\\x21\\x1c\\x84\\x53\\x88\\xa9\\x88\\xba\\x4d\\xdd\\x4b\\xc5\\x52\\x21\\x25\\xf1\\xe9\\x98\\x74\\xcd\\x16\\xeb\\xe7\\xd4\\x64\\x64\\x73\\x03\\x55\\xfa\\xce\\xe1\\xcd\\x7e\\xff\\x9d\\x4d\\x07\\x39\\xe4\\xba\\x51\\xe1\\x68\\x6b\\xf4\\xbd\\x6e\\x1d\\x39\\x55\\xf6\\xdd\\x12\\x5e\\x4b\\xae\\x4f\\xac\\x38\\x5f\\xd9\\x3b\\x13\\xc2\\x6f\\xee\\xc5\\xc0\\xbe\\x65\\xa0\\x37\\xa5\\xa1\\xdc\\x39\\x4e\\x5b\\xad\\xf8\\xfe\\xfb\\x73\\x5b\\xa9\\xe3\\xa9\\xba\\x34\\xc3\\x6a\\x2d\\x7c\\x1d\\x4e\\xf6\\x5c\\xee\\xfc\\x21\\xd7\\xc9\\x4a\\x2d\\x53\\xa1\\xf2\\x03\\xf9\\xeb\\xce\\x5b\\x8e\\xeb\\xa7\\xe9\\xda\\xd8\\x0b\\xbe\\x78\\x7a\\x2e\\xd5\\x53\\xb7\\xc6\\x35\\xfb\\x72\\xb2\\x92\\xce\\x78\\xec\\x73\\xe9\\x8a\\x96\\xf3\\xb7\\x28\\x35\\x3d\\xa0\\xa6\\xa2\\x79\\xed\\x4f\\xe5\\x76\\x95\\x15\\xd1\\x85\\x4b\\x12\\xca\\xb1\\xb1\\x0a\\xc3\\x31\\xeb\\x74\\x4c\\x0d\\x45\\xc6\\x25\\x61\\x21\\xb4\\xb9\\x7d\\xb7\\x58\\x74\\xfb\\xa9\\x7e\\x2a\\x12\\x82\\xa8\\x31\\x00\\xc2\\x3d\\xf1\\xb1\\x37\\x4d\\x59\\xbf\\x9c\\x5e\\xb9\\x54\\x52\\x8f\\x39\\xb6\\x86\\x36\\xb3\\x34\\x68\\x35\\x13\\x9e\\x43\\xd6\\x33\\x99\\x28\\xc1\\xfd\\xb1\\xa1\\xa6\\x63\\xb4\\xd7\\x38\\x5b\\x6c\\xf0\\xce\\x9f\\xd0\\xdd\\x09\\x02\\xed\\xfa\\xd8\\x9c\\x5b\\x35\\x40\\xa1\\x82\\x2f\\x6a\\xf0\\xdd\\x44\\x51\\xfd\\x09\\xe9\\x9b\\x08\\x55\\x0c\\xa5\\x87\\x2e\\x52\\xf5\\x42\\xb6\\xe6\\x83\\x45\\x68\\x2f\\x4f\\x27\\xcb\\x8e\\x43\\xae\\x7c\\x75\\xfd\\xa3\\x73\\x64\\xb7\\xe3\\x93\\x13\\x65\\xb5\\x63\\x90\\x28\\xff\\x84\\x4c\\x12\\xc6\\x6d\\x7f\\xde\\xa7\\x32\\x65\\x02\\x1d\\xf6\\x74\\x03\\xd8\\x7e\\x3d\\x08\\x5b\\x5e\\x97\\x09\\x72\\x8d\\x1a\\x7e\\x1a\\x18\\x27\\x53\\xbe\\x4b\\xf9\\xe3\\x70\\xb1\\x76\\x4f\\x22\\xd2\\x3a\\xfc\\x84\\x86\\x18\\x9d\\xc6\\x8f\\xb9\\x40\\xb9\\xe9\\xcb\\xa6\\x3f\\x5a\\x53\\xd8\\x99\\xe7\\x49\\x0e\\x96\\xa6\\x07\\xef\\xd1\\x04\\x82\\x26\\xac\\x65\\x91\\xb7\\x67\\xc8\\xb3\\xeb\\xdf\\x9c\\x92\\x2f\\xd7\\x1e\\xdf\\xbd\\xf4\\xf4\\x2e\\xf2\\x27\\x83\\xf9\\x8f\\x11\\x74\\xb9\\x0e\\xa6\\xa0\\x44\\x54\\x81\\x6f\\x58\\x5c\\x25\\x5c\\xcd\\x57\\xdb\\xf9\\x93\\xea\\x52\\x9d\\x73\\x1f\\x12\\xc8\\xde\\x6a\\xa9\\x92\\xcd\\x80\\x34\\x5d\\x63\\xc0\\x80\\xe9\\x32\\x4f\\x3f\\x18\\x0c\\x3e\\x86\\xe0\\xe4\\xa1\\x41\\x68\\xda\\x2a\\xdc\\xf8\\xbd\\xe2\\x3f\\x76\\xea\\x36\\xd5\\xdd\\x9e\\x71\\xdf\\xd3\\xfa\\xd6\\xb8\\xa2\\xbf\\x7c\\x29\\x2d\\xdc\\xdf\\x6f\\x34\\xfb\\xe5\\xc3\\xbb\\x7f\\x32\\x77\\xc8\\x5b\\x38\\x26\\xb4\\x1f\\xde\\x06\\x9e\\x04\\x5f\\xf7\\x2a\\x66\\xbf\\xde\\xfc\\xe3\\x67\\x63\\xaa\\x5b\\x47\\x3f\\x34\\xbe\\x15\\x7d\\xf5\\x1c\\xb7\\x99\\xbf\\xfe\\x7c\\xfb\\xae\\xb2\\x7f\\x11\\x0a\\xfd\\x79\\x72\\xf2\\xbd\\xd4\\x82\\x06\\x93\\x11\\xf0\\x32\\xb5\\x66\\xaf\\xd9\\x0f\\x2f\\x5e\\xb0\\xbf\\x5a\\xf7\\x22\\x37\\x27\\xdb\\x1e\\x68\\xd1\\xa8\\xf9\\x03\\xc8\\x1d\\x4e\\xda\\x21\\x8b\\xd9\\xf8\\x59\\xff\\xbb\\x82\\xfb\\x79\\xbc\\xf8\\x7f\\x00\\x00\\x00\\xff\\xff\\x24\\x88\\x6a\\xd1\\x1c\\x1c\\x00\\x00\")\n\nfunc uiTsModelsTimeseriesTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsModelsTimeseriesTs,\n    \"ui/ts/models/timeseries.ts\",\n  )\n}\n\nfunc uiTsModelsTimeseriesTs() (*asset, error) {\n  bytes, err := uiTsModelsTimeseriesTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/models/timeseries.ts\", size: 7196, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsPagesGraphTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xb4\\x56\\x51\\x8f\\xe2\\x36\\x10\\x7e\\xe7\\x57\\x4c\\xf3\\x14\\x4e\\xc8\\x61\\x75\\x52\\x1f\\xb8\\x72\\x3a\\xba\\xad\\xb6\\x95\\x8a\\xd4\\x6e\\x57\\xf7\\x72\\x3a\\x9d\\x8c\\x19\\x12\\xf7\\x1c\\x9b\\xda\\x0e\\x1c\\xaa\\xf8\\xef\\x1d\\x3b\\x21\\x1b\\x42\\x58\\xaa\\x95\\x6a\\x21\\x48\\xf0\\xcc\\x37\\x9f\\xe7\\x1b\\x8f\\x9d\\x65\\xe0\\x4c\\x65\\x05\\xce\\x60\\xcb\\x73\\x74\\x59\\x6e\\xf9\\xb6\\x60\\xde\\x8d\\x32\\x9a\\xfa\\xc1\\xe2\\x06\\x2d\\x6a\\x81\\x34\\xeb\\x8b\\x79\\xc2\\x58\\xe6\\x0f\\x5b\\xa9\\x73\\x97\\x95\\xd2\\x17\\x56\\xaa\\xbf\\xda\\x27\\xb6\\x26\\xb7\\x04\\xb2\\xf7\\x37\\x5d\\xd7\\x6f\\xe9\\x73\\xdb\\xbc\\x34\\x6b\\x54\\x2e\\xf3\\xb2\\x44\\x87\\x56\\xa2\\xbb\\xe5\\x20\\x4c\\xb9\\x35\\x1a\\xb5\\x27\\x4e\\xe8\\xad\\x14\\xad\\x07\\xb9\\xc0\\xa2\\xf2\\x85\\xb1\\x33\\xf8\\xd1\\xf2\\x12\\x1e\\x6c\\xa5\\x51\\x5a\\x48\\x57\\xf4\\xc6\\xf2\\xfa\\xed\\x43\\x5e\\x72\\x5a\\x07\\xc1\\x8c\\xbb\\x0e\\x4b\\xee\\x3d\\x3c\\x59\\x2e\\x0e\\x90\\x96\\xf4\\xfc\\x41\\x18\\xf1\\xd5\\x1a\\x2e\\x0a\\xc5\\x57\\xae\\x36\\x1f\\x65\\x6f\\xde\\x8c\\xe0\\x0d\\x2c\\xd6\\xa5\\xd4\\x1f\\x25\\xee\\x1d\\x48\\x07\\xbe\\x20\\x76\\x56\\x96\\xdc\\x1e\\x80\\x56\\x53\\x29\\x84\\x8d\\xb1\\x70\\x7f\\xf2\\x47\\x07\\x3c\\x38\\x48\\xe7\\x2d\\xf7\\x72\\x87\\xb0\\xc7\\x55\\x80\\x91\\xda\\xa3\\xdd\\x70\\x81\\x8c\\xde\\xb2\\x51\\xe3\\xdb\\x01\\xff\\x67\\x04\\x10\\x43\\x02\\x59\\x3f\\x04\\xcd\\x42\\x3c\\x4e\\xd1\\x8c\\xd9\\x00\\x7d\\x84\\xa1\\xd4\\x6c\\x7d\\x8c\\x17\\x32\\x08\\x75\\x0a\\x21\\xea\\xeb\\x58\\x74\\xcc\\xe8\\x1b\\xbf\\x6d\\x8d\\xf5\\x27\\x76\\x35\\x52\\x00\\x0f\\xa3\\x09\\x00\\x31\\xc8\\x02\\x5c\\xc9\\x95\\x82\\x35\\x96\\x46\\xd7\\x7c\\x8d\\x0e\\x91\\x38\\x88\\x82\\x5b\\x3f\\x81\\x7d\\x21\\x45\\x01\\x6b\\xe9\\xb6\\x8a\\x1f\\x02\\x19\\xbf\\x37\\xf5\\x9c\\x7b\\x86\\x69\\xa6\\xa9\\x0e\\x62\\x76\\x1c\\x27\\x6a\\x6b\\xee\\x39\\xf1\\xf3\\xc0\\x1d\\xd8\\x20\\x1c\\xee\\x70\\x0d\\xab\\x03\\x41\\xfc\\x51\\xa1\\x3d\\x2c\\xb9\\xa6\\xda\\xb4\\xac\\x45\\xc9\\x9a\\xa7\\x73\\xf2\\xbf\\x93\\x51\\xcb\\x3d\\x0c\\xa1\\xb8\\x73\\x94\\x6d\\xed\\xad\\x51\\x0a\\x2d\\xc8\\x72\\xab\\xb0\\x0c\\x05\\x02\\x5f\\x4e\\x55\\xbb\\xac\\x7f\\x3b\\x56\\x5d\\x88\\x30\\xca\\x3a\\xfc\\x6c\\x19\\xeb\\x91\\x2d\\x9b\\xd2\\xea\\x52\\x7b\\xd7\\x73\\x71\\x85\\xd9\\x3f\\x72\\x8f\\x6e\\xb6\\x32\\x46\\x21\\xd7\\x7d\\x83\\x28\\xf0\\x8e\\xab\\x99\\xae\\xca\\x55\\xf0\\xef\\x03\\x54\\xe5\\xdf\\x01\\x1f\\xe6\\xa0\\x71\\x0f\\xbd\\xd0\\x8f\\x28\\x68\\x11\\x91\\x40\\x7a\\x37\\xa5\\xac\\x7e\\x1f\\xbe\\xee\\xa6\\xd3\\xe9\\x04\\x7a\\x40\\xf5\\x18\\xa2\\xbe\\xc8\\x73\\x8b\\x39\\xf7\\xc6\\xb2\\xc5\\xc7\\x87\\x09\\x24\\xc2\\x32\\x4d\\x76\\x4c\\x90\\xcc\\x8e\\xb9\\x4a\\x08\\x74\\x8e\\xdd\\x25\\xe3\\x3e\\x79\\xd2\\x1e\\x5f\\xc7\\x6e\\x80\\xdc\\x6d\\x6a\\x5f\\x1e\\x17\\x4f\\x3f\\xbf\\xcc\\xaf\\x87\\x2b\\x62\\x85\\x56\\x82\\x00\\xd2\\x71\\x5f\\xce\\x30\\x7c\\x21\\x1d\\x6b\\x74\\x1d\\x5e\\x44\\x57\\xdd\\x34\\x9a\\x9f\\x24\\xb9\\x48\\x47\\x1f\\x90\\x51\\x6b\\xb2\\xe8\\x8a\\xf4\\xba\\xe5\\x49\\x7e\\x8a\\x4d\\x75\\xff\\x6b\\xf3\\x96\\xa6\\x63\\x98\\xbf\\xbf\\x82\\x35\\x89\\x19\\x9c\\x5e\\x60\\x1e\\xfb\\x8b\\x37\\xba\\xd2\\xca\\xf0\\x35\\x81\\x0d\\x2d\\x5d\\x50\\x39\\xda\\x36\\xe2\\x19\\x9b\\xdb\\xd8\\xde\\xe4\\xb9\\xc2\\xba\\x4b\\xcc\\xa1\\xa6\\x7b\\x35\\xbf\\xed\\x26\\x20\\xd3\\xef\\xce\\xff\\x19\\x4a\\x8c\\xdc\\x40\\x7a\\x6e\\x35\\xbc\\x80\\x16\\xff\\x94\\x22\\xca\\x60\\x5d\\x6c\\xf1\\xdf\\xb6\\x38\\x07\\xb3\\x7f\\x04\\x12\\x19\\x5f\\x83\\xfb\\xa2\\xfc\\xc7\\x57\\x97\\x44\\xd7\\xf3\\x2c\\xdd\\x4d\\x6f\\xdb\\x54\\x5a\\xc4\\x4e\\x2b\\xda\\x06\\x95\\x8e\\x67\\x2f\\x74\\x2b\\x6a\\xa0\\x95\\xd5\\xb1\\xa4\\xef\\x3b\\x2e\\xef\\xfe\\x6b\\x9c\\x1d\\x9d\\x2f\\xa9\\xf0\\x56\\x75\\x82\\x5c\\x0a\\xb1\\xe3\\x16\\x56\\x95\\xf7\\x46\\x3f\\xe1\\x37\\x3f\\xa3\\xdd\\x46\\x1d\\xfd\\xa2\\xc9\\x91\\xa2\\x01\\xe9\\x96\\xa2\\xcf\\x40\\x54\\x29\\xc9\\x9f\\x64\\x0c\\x4f\\xc6\\x73\\xe5\\x92\\x8b\\x6c\\x5d\\x97\\x6f\\x00\\x24\\x86\\xbc\\xc4\\x18\\x4e\\x58\\x99\\x26\\x2c\\x1e\\x8e\\xe1\\x18\\x49\\x26\\xf0\\xe9\\x4a\\x89\\x90\\xdd\\x2f\\x6f\\x69\\x3e\\xa9\\x77\\xc1\\x4f\\x74\\x1c\\x26\\xe3\\xa1\\xc6\\x16\\xc6\\x7d\\x7b\\x23\\x69\\x1b\\xcb\\x6f\\x52\\xd7\\x1b\\x88\\x09\\x8b\\x44\\xb0\\xce\\x50\\x53\\x27\\xff\\x3f\\x10\\xd1\\x4f\\xae\\x1c\\x12\\xad\\x81\\xd4\\xdb\\xca\\x7f\\xa2\\xdb\\x1a\\xce\\xeb\\xac\\x7e\\x26\\x97\\x6b\\x5b\\xe6\\x34\\xa8\\x7f\\x54\\x74\\x8b\\x7c\\x96\\xe1\\x1a\\x83\\xd3\\xa0\\x0b\\x8a\\x92\\xe2\\xeb\\x0c\\x22\\xef\\x4e\\x67\\x79\\xc9\\xf1\\x38\\xbe\\x58\\xd9\\xe7\\x5e\\x6d\\x3f\\xff\\x1e\\x47\\xc7\\xd1\\xbf\\x01\\x00\\x00\\xff\\xff\\x47\\xd6\\x5d\\x9c\\xe1\\x0a\\x00\\x00\")\n\nfunc uiTsPagesGraphTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsPagesGraphTs,\n    \"ui/ts/pages/graph.ts\",\n  )\n}\n\nfunc uiTsPagesGraphTs() (*asset, error) {\n  bytes, err := uiTsPagesGraphTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/pages/graph.ts\", size: 2785, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsPagesMonitorTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x7c\\x91\\xbb\\xce\\xdb\\x30\\x0c\\x85\\x77\\x3d\\x05\\xe1\\xc9\\x09\\x0a\\x6b\\xe8\\x96\\x5e\\x90\\xb4\\x43\\xa7\\x00\\x19\\x8a\\xee\\x8a\\x4c\\xdb\\x6a\\x75\\x09\\x28\\x2a\\x69\\x10\\xe4\\xdd\\x4b\\x25\\x75\\xe0\\x7f\\xf9\\x35\\xd8\\x22\\xce\\xf9\\x0e\\x09\\x4a\\x6b\\xc8\\xa9\\x90\\xc5\\x0d\\x9c\\xcc\\x88\\x59\\x87\\x14\\x1d\\x27\\xea\\x38\\x2b\\x2d\\xe2\\x67\\xc2\\x01\\x09\\xa3\\x45\\xd1\\x79\\xfa\\xd2\\x74\\x9d\\xe6\\xeb\\xc9\\xc5\\x51\\xac\\x8e\\x27\\x72\\xfe\\xf7\\xeb\\xd6\\xf5\\x82\\x35\\xa0\\xbf\\x2a\\x61\\x61\\x57\\x78\\x4a\\xb4\\x81\\x6f\\x64\\x02\\xfc\\xa0\\x12\\xd1\\x11\\xb4\\x47\\xa9\\xba\\xf1\\x59\\x6d\\xc7\\x60\\x84\\xb2\\x29\\xac\\x96\\xc0\\xde\\x30\\xc3\\x4f\\x32\\xf6\\x0a\\x6d\\x90\\xfb\\xd6\\x26\\xfb\\x87\\x92\\xb1\\x93\\x37\\xc7\\xfc\\xb4\\x2b\\xbd\\x5e\\x2b\\x58\\xc3\\xae\\x0f\\x2e\\xfe\\x72\\x78\\xc9\\xe0\\x32\\xf0\\x24\\x63\\x92\\x0b\\x86\\xae\\x10\\x52\\x5f\\x3c\\xc2\\x90\\x08\\xbe\\xcf\\x3c\\x66\\x30\\x15\\x70\\x99\\xc9\\xb0\\x3b\\x23\\x5c\\xf0\\x58\\x63\\x5c\\x64\\xa4\\xc1\\x58\\xec\\xa4\\xd2\\xea\\x3f\\xbb\\x08\\xbf\\x29\\x80\\x47\\x4b\\x10\\xf7\\xfe\\xb9\\xa3\\xb9\\xe3\\x59\\x1c\\x8f\\x3e\\xf8\\xf7\\xe4\\x13\\xc9\\x6e\\xc0\\xfa\\x92\\x25\\x11\\x32\\x1b\\x2e\\xb9\\x7b\\x60\\x5a\\xbe\\xe2\\x48\\xc4\\xf3\\x6c\\x73\\x4e\\x0d\\xaf\\xe7\\xad\\x7a\\x90\\xf7\\x78\\x49\\x0b\\x79\\x28\\xd1\\xb2\\x4b\\x11\\x6c\\x8a\\x4c\\xc9\\x7b\\xa4\\x76\\x05\\xb7\\xfb\\x3b\\xce\\x3a\\x61\\xf5\\x2c\\x2c\\xf5\\x10\\x72\\xa1\\x08\\xa1\\x6d\\xa6\\x8f\\xcd\\x07\\x68\\xe6\\x79\\x0e\\x5e\\x36\\x31\\x25\\xdf\\x23\\x35\\xab\\x4f\\x0b\\x68\\xee\\x51\\xff\\x77\\x75\\x57\\xff\\x02\\x00\\x00\\xff\\xff\\xd6\\xb1\\x96\\xcc\\x3e\\x02\\x00\\x00\")\n\nfunc uiTsPagesMonitorTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsPagesMonitorTs,\n    \"ui/ts/pages/monitor.ts\",\n  )\n}\n\nfunc uiTsPagesMonitorTs() (*asset, error) {\n  bytes, err := uiTsPagesMonitorTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/pages/monitor.ts\", size: 574, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsPagesNodesTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xc4\\x55\\x5d\\x6f\\xa3\\x38\\x14\\x7d\\xcf\\xaf\\xb8\\xe2\\xa1\\x82\\x36\\x6b\\xf6\\xe3\\x8d\\x6c\\xaa\\xed\\x76\\x57\\xab\\x4a\\xdb\\xce\\x8c\\x2a\\xcd\\x4b\\x15\\x45\\x06\\x9c\\xe0\\xd6\\xd8\\x19\\xdb\\x90\\x89\\xaa\\xfc\\xf7\\xb9\\xc6\\x40\\x20\\x49\\x67\\xfa\\x36\\x48\\x0d\\xd8\\xd7\\xe7\\xdc\\xaf\\x73\\xdd\\x38\\x06\\xa3\\x2a\\x9d\\xb1\\x04\\x36\\x74\\xcd\\x4c\\x2c\\x55\\xce\\x0c\\xb1\\x66\\x12\\xa3\\xe9\\x4f\\xcd\\x56\\x4c\\x33\\x99\\x31\\xb4\\xda\\x62\\x1e\\x10\\x12\\xdb\\xdd\\x86\\xcb\\xb5\\x89\\x4b\\x6e\\x0b\\xcd\\xc5\\x73\\xff\\x45\\x72\\x84\\x05\\x10\\x5f\\xbf\\x09\\x2d\\x91\\x5b\\x78\\x17\\x4b\\x63\\xa9\\xad\\x4c\\x87\\x40\\x08\\xdc\\x54\\xb6\\x50\\x3a\\x81\\xbf\\x35\\x2d\\xe1\\x3f\\x5d\\x49\\xc6\\x35\\x84\\x29\\xae\\xc8\\xda\\xaf\\xfe\\x5a\\x97\\x14\\xfd\\x64\\xaa\\x8c\\x10\\x71\\x79\\x39\\x81\\x4b\\xb8\\xc9\\x4b\\x2e\\x3f\\x73\\xb6\\x35\\xc0\\x0d\\xd8\\x02\\xdd\\x69\\x5e\\x52\\xbd\\x03\\xf4\\x56\\x09\\x06\\x2b\\xa5\\xe1\\x56\\x65\\x2f\\x5a\\xd1\\xac\\x60\\x06\\xa8\\x03\\x70\\x63\\x35\\xb5\\xbc\\x66\\xb0\\x65\\xa9\\xa3\\xe1\\xd2\\x32\\xbd\\xa2\\x19\\x23\\xb8\\x8a\\x27\\x2d\\x76\\x40\\xfe\\x3a\\x01\\x68\\x5c\\x02\\x9e\\x7e\\x70\\x45\\xea\\xfc\\xd5\\x68\\x6f\\xbc\\xb0\\xaf\\x1b\\xa1\\x34\\x16\\xa7\\xd9\\xf6\\x09\\x82\\x5a\\x01\\x15\\x02\\x7c\\x59\\x1b\\x74\\x8c\\xbf\\x78\\x54\\x69\\xdb\\x85\\xe8\\xe9\\x9c\\x87\\xde\\x52\\x53\\xdd\\x60\\x1e\\x1b\\x16\\x66\\x12\\xb8\\x6f\\x8a\\x47\\x1e\\xfa\\x4d\\xe2\\x61\\x73\\x90\\xe8\\xff\\x0d\\x6b\\x18\\xcd\\x86\\xac\\x99\\xa0\\xc6\\x60\\x35\\xa4\\xd5\\x4a\\x08\\xa6\\x81\\x97\\x1b\\xc1\\x4a\\x26\\xad\\x81\\x65\\xd7\\xc6\\x7b\\xff\\x1e\\x9c\\xf2\\x91\\x81\\xab\\x6c\\x4d\\xad\\x4f\\x8d\\x67\\xb0\\xfc\\x52\\x31\\xbd\\xfb\\xb7\\xc6\\x9f\\xfb\\x47\\x8c\\xe3\\xb7\\x5f\\xf1\\x99\\x1d\\x9d\\x5d\\x36\\x95\\xad\\xa9\\x48\\x40\\x56\\x65\\xca\\xf4\\x6c\\xd2\\x9d\\xa8\\x52\\x81\\x2c\\x99\\x92\\xd8\\x8c\\x2a\\xb3\\x4a\\x87\\x51\\xef\\x0a\\x46\\xd9\\x93\\x4f\\xce\\x53\\x97\\x8c\\x7b\\x6c\\xc1\\x0d\\xe9\\xb9\\xd1\\xb9\\x61\\xf6\\xae\\x5d\\x85\\xc8\\x33\\xbf\\x3e\\x4b\\x30\\x1d\\x24\\x4f\\x46\\xf1\\xf7\\xdc\\xfb\\xa3\\xf8\\x94\\xac\\xa4\\x50\\x34\\x1f\\x05\\x97\\x09\\x46\\x75\\xef\\x6f\\x1c\\xcc\\x80\\x69\\xc0\\xd7\\x6a\\xa7\\x57\\xcf\\x47\\x9c\\x36\\x30\\x85\\xda\\x02\\x05\\x81\\x72\\xec\\x84\\xe2\\xa4\\x43\\x6b\\x94\\x39\\x4d\\x51\\x19\\x07\\xd9\\xb4\\xc2\\x39\\x2b\\x9d\\x86\\xab\\x0b\\xae\\xb5\\xaf\\x2a\\x99\\x59\\xae\\xa4\\xab\\x6f\\x9b\\xf0\\x28\\x03\\xcd\\x6c\\xa5\\x65\\xa3\\x9d\\xdb\\xc1\\x89\\x71\\xec\\xa7\\x6c\\x4e\\xec\\xe7\\x78\\xca\\x30\\xc8\\x79\\x1d\\x4c\\xe1\\xa9\\xb7\\x80\\xdb\\x2c\\x7e\\xc7\\xbd\\xc0\\x2b\\xf5\\x7f\\x4c\\x33\\x88\\xa6\\xe3\\x03\\x95\\x38\\x02\\x01\\x7c\\x48\\x9f\\x59\\x66\\xc9\\x0b\\xdb\\x99\\x70\\xd4\\x44\\x24\\xc9\\xc2\\x28\\x22\\x06\\x43\\x0a\\x23\\x52\\xd2\\x4d\\xd8\\x05\\xd6\\x1c\\xbc\\xcb\\x87\\x91\\xf9\\xc7\\x0d\\x92\\xc3\\xb9\\x39\\x39\\xe5\\x7a\\xf2\\xb0\\xc5\\xec\\x08\\x75\\xc8\\x4a\\x70\\x8c\\xef\\x15\\x30\\x98\\xa4\\xe1\\x21\\xcd\\xed\\xc5\\x73\\xd8\\x4f\\x8f\\x30\\x70\\xbe\\x08\\xbd\\x91\\xa0\\xca\\x8d\\x0d\\x83\\x0b\\x99\\x9a\\xcd\\xec\\x22\\xad\\x84\\x98\\xf9\\xef\\x71\\x51\\x06\\x6c\\xf4\\xa9\\xc0\\x6b\\x74\\xee\\x2f\\xe5\\x38\\x80\\xab\\x71\\x08\\x57\\x10\\x2c\\x9a\\xe8\\xb0\\xc7\\x2b\\xbe\\x4e\\xd0\\x87\\x56\\x15\\x0e\\xdd\\xbe\\xad\\x79\\x72\\x0c\\x39\\xeb\\x28\\x80\\x2d\\x8e\\x3c\\x5e\\x76\\xb9\\x66\\xc6\\x1c\\x30\\xd4\\x6f\\x10\\xc9\\xec\\x56\\xe9\\x17\\xe7\\xee\\x97\\x13\\x63\\xfb\\x3e\\xa1\\x5d\\x44\\xd1\\xb8\\xa8\\xfb\\x91\\xef\\xc5\\x60\\xb5\\x78\\xd7\\xc4\\x1c\\x06\\xc6\\x8d\\x48\\xce\\x2c\\xce\\x88\\xbf\\x5e\\xc1\\xe0\\x9d\\xdb\\x0e\\xcb\\x8f\\x66\\xe5\\x67\\x8e\\x4a\\x77\\xa7\\xdf\\xe5\\x28\\xc6\\xb6\\x55\\x64\\x43\\xf1\\x1f\\x5c\\x18\\xb4\\xfd\\x09\\x06\\x45\\x7b\\xf7\\x64\\x81\\x17\\xf5\\xc9\\x68\\x9d\\xd3\\xa2\\x03\\xfe\\xd1\\x01\\x13\\x70\\xed\\x6c\\x27\\x67\\xac\\x8c\\xd1\\xac\\xfc\\xe3\\x8b\\xdd\\xcd\\xd8\\xa8\\x8d\\xdf\\xe9\\xa2\\xfb\\xdb\\x4f\\xbe\\x05\\x00\\x00\\xff\\xff\\xec\\xae\\xf6\\xff\\x62\\x08\\x00\\x00\")\n\nfunc uiTsPagesNodesTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsPagesNodesTs,\n    \"ui/ts/pages/nodes.ts\",\n  )\n}\n\nfunc uiTsPagesNodesTs() (*asset, error) {\n  bytes, err := uiTsPagesNodesTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/pages/nodes.ts\", size: 2146, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsPagesRest_explorerTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xec\\x5a\\x5f\\x6f\\xdb\\x38\\x12\\x7f\\xcf\\xa7\\x98\\xd5\\xc3\\x46\\xea\\x26\\xf2\\x02\\xf7\\x72\\x70\\xea\\xec\\xf5\\xd2\\x74\\x7b\\xb7\\xed\\x35\\x48\\xbd\\xc5\\x02\\x41\\xb0\\xa0\\x25\\xda\\x52\\x23\\x8b\\x3a\\x92\\xb2\\xeb\\x2b\\xf2\\xdd\\x6f\\x86\\xa4\\x24\\x4a\\x76\\xfe\\x15\\x49\\x6f\\xb1\\xd7\\x87\\x36\\x92\\x38\\xff\\x38\\xfc\\xcd\\x6f\\x48\\x26\\xa3\\x11\\x28\\x51\\xcb\\x84\\x8f\\xa1\\x62\\x0b\\xae\\x46\\x92\\x2b\\xfd\\x3b\\xff\\x54\\x15\\x42\\x72\\x19\\x6b\\xb5\\x37\\x42\\x91\\xe7\\x92\\xcf\\xb9\\xe4\\x65\\xc2\\x51\\x4a\\x67\\x93\\x20\\x8e\\x47\\x7a\\x53\\xe5\\xe5\\x42\\x8d\\x96\\xb9\\xce\\x64\\x5e\\x7c\\x6c\\x9f\\xe2\\x14\\xd5\\x02\\x18\\x1d\\xef\\xa1\\x2e\\xbc\\xa8\\x75\\x26\\xe4\\x18\\xde\\x32\\xad\\x61\\x2a\\x59\\xb2\\x81\\x70\\x89\\xcf\\x7f\\x4b\\x44\\x72\\x25\\x05\\x4b\\xb2\\x82\\xcd\\x54\\x9c\\x88\\x65\\x84\\xf2\\xcf\\x9e\\xed\\xc1\\x33\\x78\\x91\\x2e\\xf3\\xf2\\x43\\xce\\xd7\\x0a\\x72\\x05\\x3a\\x43\\xaf\\x32\\x5f\\x32\\xb9\\x81\\xa5\\x48\\xeb\\x82\\xc3\\x5c\\x48\\x38\\x69\\xf4\\xb9\\x02\\x46\\x0a\\xb9\\xd2\\x92\\xe9\\x7c\\xc5\\x61\\xcd\\x67\\x64\\x26\\x2f\\x35\\x97\\x73\\x96\\xf0\\x18\\xdf\\x46\\x7b\\x4e\\xd7\\x33\\xfe\\x79\\x0f\\xc0\\xb8\\x04\\x94\\x3e\\xc7\\x89\\x9f\\xba\\x79\\x93\\x5b\\x06\\x2b\\x8e\\x1e\\x55\\xbe\\xac\\x50\\xab\\xb5\\x65\\x7c\\xdb\\xfc\\xe0\\xf4\\x81\\xd2\\x05\\x2b\\x56\\xd4\\x5c\\xc5\\x30\\xcd\\x72\\x8a\\xd8\\xda\\x63\\xa8\\x5a\\x2e\\x0a\\xae\\x45\\x09\\x67\\xac\\xe4\\x45\\x6c\\xbe\\x8f\\xf0\\x7f\\x54\\x17\\x52\\x37\\x93\\xe9\\x39\\xa6\\x90\\xda\\xa0\\xc8\\xcc\\x5b\\x91\\xf2\\x02\\x12\\x51\\x6a\\x96\\x97\\x36\\x19\\x4a\\xe3\\x34\\x13\\x52\\xc7\\x11\\x0a\\x87\\x3e\\xf6\\xac\\x54\\xad\\x3f\\xe7\\x11\\x1a\\x67\\xd6\\x9c\\xf5\\xe2\\xf9\\x21\\x4f\\x67\\x52\\x54\\x5c\\xea\\x1c\\xf3\\xd9\\x18\\x35\\x2e\\xe2\\x56\\x64\\xe4\\x9e\\x5c\\xfc\\x2b\\x26\\xdd\\x1c\\x7f\\xe1\\x1b\\x98\\xc0\\x32\\xae\\xd0\\x44\\x18\\x04\\xd1\\xd1\\x4d\\x82\\x1f\\x28\\x53\\xf7\\x13\\x3d\\x11\\x35\\xe5\\xbc\\x13\\xfe\\x71\\x97\\xac\\x64\\xe5\\x82\\xbf\\xd7\\x0c\\x5f\\xef\\xb0\\x6a\\x24\\x4f\\xcb\\xf4\\x4e\\x39\\xae\\x2a\\x51\\x2a\\xfe\\x46\\x2c\\x3a\\xd1\\x8b\\x4b\\x14\\xdd\\x95\\xb4\\x42\\x2c\\xce\\x9d\\x82\\x05\\x0d\\x86\\x8c\\x8f\\xf3\\xba\\x4c\\x74\\x8e\\x2b\\xbf\\xce\\xf2\\x24\\x83\\x94\\x27\\x98\\x49\\xbb\\x7a\\x8d\\x7d\\xd0\\x02\\x58\\xd9\\x59\\xfa\\xed\\xed\\x9b\\xd7\\x5a\\x57\\xe7\\xfc\\xdf\\x35\\x61\\x8a\\x61\\xa4\\x0b\\x5e\\x72\\x84\\x34\\x01\\x9c\\x1c\\xc1\\x92\\x2b\\x85\\x45\\x9a\\x6e\\xaf\\x48\\xeb\\xcf\\x8b\\x27\\xfc\\x94\\x61\\xdd\\xf5\\xcd\\x1e\\x80\\xa8\\xb4\\x1a\\xc3\\xef\\x4d\\xad\\xbe\\xb5\\x3f\\x7f\\x7b\\x7d\\xfe\\xae\\x22\\x03\\x2a\\x1a\\x63\\x19\\x11\\xb2\\x1b\\x8c\\x80\\xc9\\x4a\\xca\\x34\\x73\\x23\\x47\\xed\\x40\\x3e\\x07\\x72\\x12\\x37\\x53\\x9a\\x6e\\x2a\\x5c\\xdc\\xc9\\x04\\x82\\x8f\\x4a\\x94\\x41\\xe4\\xd9\\x00\\x63\\x01\\x13\\xfa\\xcf\\xf7\\xef\\xfe\\x15\\x5b\\x43\\xf9\\x7c\\xd3\\x53\\x8f\\x3a\\xcb\\xd7\\xc0\\x0b\\x4c\\xd1\\x0e\\xfd\\x9e\\x3f\\xfe\\x49\\x7b\\x3a\\x7b\\x03\\x51\\xfa\\x11\\x17\\xbc\\x5c\\xe8\\x0c\\x8e\\xe1\\x47\\xf8\\xc9\\x0e\\x8c\\x21\\x08\\x4b\\xd1\\xad\\xc3\\x4c\\xa4\\x9b\\x28\\x38\\x1a\\x6a\\x5f\\xec\\x5f\\xec\\xdb\\x74\\xc5\\x4b\\x8e\\x1c\\x96\\x1e\\xc0\\xfe\\x25\\xe0\\x27\\x8a\\x80\\x4a\\xb0\\x56\\xf8\\x05\\x1a\\x99\\x5a\\x16\\xf8\\x3a\\xa6\\x77\\x32\\x70\\x19\\x7f\\x14\\x79\\x19\\xee\\xef\\x7b\\x93\\xf2\\x90\\x15\\x46\\x71\\x55\\xab\\x2c\\x24\\xd1\\xc8\\x13\\xd0\\xb5\\x2c\\x87\\x29\\xf2\\x65\\xae\\x77\\x82\\x50\\x25\\xac\\x84\\x34\\x57\\xc8\\xcd\\x96\\x0e\\xed\\x17\\xe9\\xa0\\x84\\x40\\x33\\xb4\\xc1\\x25\\x32\\x1a\\xcc\\x98\\xe2\\x29\\x20\\x54\\xe8\\x5b\\x52\\x4b\\xa4\\x75\\xdd\\x99\\xb2\\x54\\x06\\x62\\xee\\x57\\x16\\x61\\xb1\\x29\\x1f\\x62\\x39\\xde\\x9a\\x5e\\xe7\\x45\\x01\\x35\\x81\\x99\\x1c\\xd4\\x55\\x55\\xe4\\x3c\\xed\\xac\\x65\\x88\\x3c\\xb0\\xd9\\x6b\\xf4\\x5c\\xd2\\x8d\\xe2\\x8c\\x13\\x5e\\x11\\xd0\\x4d\\x88\\xed\\x30\\x7e\\xbe\\x91\\x76\\x5a\\xac\\xd3\\x24\\x43\\x6b\\x7d\\x0c\\x36\\x5f\\xd1\\x78\\x88\\x6c\\x64\\xb5\\x65\\xae\\xf8\\x73\\x56\\x6e\\x8e\\x07\\x98\\xe6\\x65\\x5a\\xe1\\x22\\x11\\x73\\x04\\xa3\\xab\\x95\\x69\\x7d\\x23\\x33\\xcf\\x9f\\x14\\xcd\\x7b\\x12\\xc0\\x0f\\x28\\x44\\xa5\\xfb\\xeb\\xf9\\x3f\\x4e\\xc4\\x12\\x63\\xc3\\x64\\x85\\x5d\\x66\\xc2\\x28\\xea\\x57\\xc3\\x77\\xdf\\x35\\x79\\xc2\\xa1\\x1e\\x7c\\x5b\\x67\\x3f\\x4c\\x60\\xff\\x7b\\x7c\\x9b\\xec\\xdf\\x62\\xdd\\x1a\\xd8\\x85\\x6d\\x87\\x91\\x65\\xec\\x96\\x20\\xf4\\x9d\\x34\\xc9\\x70\\x80\\xf5\\x46\\x10\\x9e\\xe3\\x36\\x06\\x7f\\x00\\x4b\\x08\\x9b\\xb2\\x1e\\xfb\\xcc\\xd1\\x8d\\x5f\\xb7\\x31\\xec\\x46\\x1e\\x06\\x8c\\x3d\\xb2\\x07\\xbd\\x16\\x75\\x4c\\x2e\\xb8\\x26\\x26\\x69\\x3a\\xa1\\x93\\xee\\xc1\\xf1\\xc0\\xe2\\xb1\\xb3\\xd8\\x07\\xa6\\x87\\xc7\\xae\\xd3\\x10\\x1c\\xbd\\x76\\xb2\\x8d\\xc8\\xce\\xda\\x10\\x9a\\x0f\\x45\\x64\\x67\\xe9\\x61\\xd0\\x34\\x33\\x7d\\x74\\x6c\\x1a\\xab\\x23\\x42\\x65\\x9b\\x8c\\xd0\\x03\\x89\\xed\\x5e\\x26\\x0d\\x5b\\xae\\x3a\\x82\\x47\\x8b\\x4f\\x0a\\x19\\xa0\\x95\\xcd\\x59\\x91\\xff\\x07\\xf7\\x94\\x4d\\x42\\x2c\\x89\\xc1\\xe7\\x06\\xbe\\x86\\x63\\xaf\\x3d\\x9c\\xf5\\xcb\\xc8\\x06\\x63\\x5b\\xc9\\xd9\\xbb\\xf7\\xd3\\x41\\x2b\\x71\\x93\\xc4\\x4d\\x63\\x39\\xcf\\xa9\\x4b\\xb7\\x6e\\x90\\x9b\\x2d\\x1f\\xf7\\x15\\xc0\\x92\\x36\\xd7\\xae\\x0d\\xbe\\xe6\\x2c\\xe5\\x32\\x0c\\x4e\\x70\\x5b\\x85\\x49\\x3d\\xa4\\xc6\\x15\\x1c\\x40\\xa0\\x71\\x6a\\xa3\\xaa\\xc0\\x9d\\xd6\\x11\\x24\\x19\\xc3\\x4e\\xae\\x27\\xbf\\x4e\\x5f\\x1d\\xfe\\x15\\x03\\x38\\xea\\xd9\\x73\\xf3\\x40\\xb3\\xfe\\xf7\\xeb\\x1d\\x41\\xba\\x76\\xe2\\x01\\x36\\xec\\x15\\xf6\\xcd\\x95\\xed\\x7e\\xde\\x51\\x82\\x89\\xdb\\x27\\xfd\\xcf\\x8a\\xd0\\x6d\\xd4\\xfe\\x88\\x65\\xe8\\x72\\xf3\\xe8\\x85\\xe8\\xec\\x7e\\x2b\\xc5\\xa7\\x2b\\x45\\x46\\x48\\x49\\x18\\x99\\x1a\\x7d\\x3a\\x5c\\xaf\\xd7\\x87\\x78\\x28\\x59\\x1e\\x62\\x26\\x6c\\xcf\\x4c\\x9f\\xa8\\x42\\x1d\\x9a\\x1f\\xb9\\x46\\x0b\\xce\\x24\\x1d\\x28\\xcc\\x83\\xfa\\x82\\xbd\\x4e\\x63\\x21\\xf4\\xb3\\xe9\\x6f\\x28\\xcd\\x09\\xa5\\x5d\\xc1\\x3d\\x2f\\x16\\xef\\x30\\x39\\xab\\x35\\x1d\\x47\\xcd\\x41\\x25\\xe3\\x05\\x1e\\xf7\\x3a\\x0f\\x3a\\x63\\xba\\x77\\xe2\\x48\\x30\\xff\\x57\\x6c\\x86\\x94\\xe1\\xd4\\xdc\\xa9\\xb0\\x31\\x36\\x38\\x71\\x2e\\x78\\xff\\xc0\\xd9\\x1a\\xb6\\xda\\x21\\x71\\xab\\x3b\\x41\\x20\\x2e\\x4a\\x63\\x7d\\x1c\\x46\\x93\\x63\\x2c\\xba\\x03\\x62\\x2f\\x72\\x95\\x9a\\x2f\\x33\\x21\\x70\\xba\\x65\\x37\\xd5\\x26\\xed\\x61\\x90\\x97\\x55\\xad\\x2f\\x34\\x82\\x64\\x62\\xed\\x5e\\x22\\x58\\xfc\\x8a\\x45\\xa6\\x1a\\x03\\xf9\\xea\\x10\\xdd\\xda\\x6e\\x9f\\xc2\\xa8\\x1b\\x6d\\x42\\x69\\x1e\\x9a\\x91\\x66\\xeb\\xb3\\x9d\\x45\\x3b\\x89\\x57\\x39\\x2f\\xd2\\xfb\\xa5\\x12\\x33\\x4e\\x61\\xc3\\xdc\\xa8\\x7c\\x61\\x1a\\x8d\\xf2\\xf3\\xe9\\x71\\x3f\\x91\\x76\\xc2\\x94\\xb4\\xe9\\x17\\x25\\x91\\x8c\\xf5\\x53\\x88\\xed\\x2f\\xe1\\x99\\x28\\xb0\\x2a\\x1f\\x96\\x48\\x97\\xfb\\x95\\x6d\\x71\\xbd\\x04\\x67\\xb4\\xa7\\x45\\x62\\x8b\\xd7\\x48\\x81\\x2f\\xb4\\xc6\\x7a\\x37\\x62\\x81\\x9b\\x40\\x74\\x43\\xd2\\xdd\\xa5\\xc5\\x29\\xb5\\xac\\x76\\x87\\xdc\\xc6\\x9a\\x14\\x4c\\x29\\x20\\xe2\\x90\\xa2\\x28\\xda\\xcb\\x13\\xb3\\x5a\\x23\\xef\\x3a\\x23\\xde\\x2a\\x98\\x33\\xe4\\x52\\x6a\\x8a\\xed\\xf9\\x7e\\xce\\x8a\\xde\\xf9\\xf3\\xca\\x5c\\x68\\x98\\xcb\\x92\\xb8\\x25\\x78\\x9f\\xde\\x8b\\xc1\\xb0\\x69\\xec\\x47\\x7b\\x7e\\x00\\xaf\\xdc\\xca\\xf5\\xfc\\x5b\\xd6\\x70\\x4c\\xef\\xda\\x51\\x8f\\x1f\\x75\\x96\\xab\\x78\\x10\\x67\\xa8\\x65\\xed\\x47\\x07\\xce\\xb5\\xbf\\xcb\\x8c\\x62\\xc4\\x14\\x56\\x19\\xa9\\x27\\x82\\xee\\xac\\x34\\x3f\\x80\\xde\\xeb\\x6e\\x4a\\xc3\\x48\\xff\\x8e\\x9c\\x97\\xb6\\x48\\x53\\xee\\xd2\\x82\\x49\\x4e\\x8d\\x1b\\x31\\x8e\\xf4\\xc3\\x8a\\x62\\xc6\\x92\\x2b\\x6f\\x2e\\x95\\xcc\\x57\\x08\\x6f\\x68\\xac\\x63\\x42\\x90\\x9c\\x26\\xc7\\xbb\\x67\\x30\\x4c\\x30\\xee\\x4a\\x86\\x0a\\x36\\x35\\xc1\\xcf\\xa7\\xd3\\xc0\\x13\\xac\\x84\\xba\\x49\\xd2\\xb6\\xa3\\x4e\\x34\\xc3\\x56\\x72\\x83\\xe8\\xeb\\xd3\\x17\\x2f\\x7d\\x51\\xcc\\xde\\x8e\\x90\\x9d\\xf0\\xcb\\xd3\\x37\\xa7\\xd3\\xd3\\x60\\x9b\\xd3\\xb7\\xb7\\x17\\x0d\\xf4\\xc2\\x68\\xbc\\x13\\x87\\xae\\xe6\\x4a\\xbe\\xf6\\x70\\x1a\\xde\\x6d\\x79\\x95\\xf3\\x75\\x98\\x68\\x6c\\xfb\\x9d\\x5a\\xb4\\x6d\\x17\\x6b\\x59\\x71\\xa3\\x41\\x09\\x6f\\x69\\xc4\\xe9\\xa8\\x43\\x17\\x20\\x96\\xd9\\x45\\xaf\\x37\\xa2\\x5e\\xf6\\x17\\xea\\xb2\\xbf\\x8c\\x3e\\xc0\\x19\\xcb\\x65\\x10\\x1d\\x0c\\x05\\xa8\\xdd\\x6e\\x29\\x82\\xa5\\xa1\\x30\\xc0\\x72\\xc0\\x41\\x8a\\x30\\xc6\\x5a\\x71\\x4f\\x83\\x45\\x1f\\xd8\\x44\\xab\\x31\\x02\\x99\\x32\\xfc\\xbd\\x64\\x52\\x1e\\x0d\\x9d\\xb6\\xc6\\x3f\\x38\\x6e\\x30\\x46\\xb1\\xd6\\xee\\x69\\xde\\x35\\x9a\\xe0\\x67\\xae\\x1b\\x65\\x84\\xd9\\x03\\x95\\x69\\x3f\\xd2\\x68\\x13\\xa0\\x1e\\xa8\\x7e\\x56\\xb7\\xbe\\x09\\xb9\\x0f\\xd4\\x7e\\x69\\x60\\xd9\\x18\\xb0\\x20\\xbd\\x97\\x89\\xcb\\xee\\x12\\xc9\\xdb\\x07\\xec\\xa0\\xd2\\x73\\x62\\xe2\\xaf\\x4a\\xa5\\xbd\\x1b\\x5a\\xcb\\x5b\\xdd\\xa7\\x81\\x98\\xbd\\x9e\\xf5\\x84\\xf0\\xc3\\xd7\\x26\\x55\\xef\\x56\\xe9\\xcf\\xca\\xa9\\xdf\\xd8\\xcf\\xb2\\x9f\\x29\\x86\\x07\\x53\\x9f\\x01\\x6e\\x53\\xa3\\x1d\\x94\\x1f\\x99\\x03\\x11\\xf9\\x3d\\x1f\\xf8\\xfe\\x35\\x69\\xf0\\xe9\\x99\\xc8\\x1d\\xb4\\xfe\\xd8\\xdb\\x3a\\x17\\xe4\\x9d\\x1c\\xd4\\x14\\xee\\x23\\x73\\x51\\xff\\xfe\\xe2\\xcf\\x4a\\x47\\xdf\\xb6\\x78\\x4f\\x49\\x72\\x0e\\xc2\\xdf\\x76\\x78\\xff\\x27\\x3b\\xbc\\x37\\x62\\xb1\\xcd\\xa9\\xdd\\x9f\\x2f\\xec\\xc4\\x70\\x21\\x16\\xdb\\xbf\\x13\\x76\\x4c\\xbb\\x79\\x6e\\x59\\xec\\xe2\\xf2\\xb8\\x2b\\x2e\\x73\\x1d\\x35\\x06\\xba\\x67\\x58\\x89\\x3c\\x7d\\xbc\\x32\\xf2\\x99\\xd2\\x44\\xe5\\x36\\x83\\xdd\\x4d\\x97\\x9f\\x16\\x17\\x86\\x23\\x4b\\x77\\x45\\xe6\\x5d\\x65\\x3e\\x5e\\x0d\\xf6\\x8a\\x0f\\x9d\\xdc\\x56\\x6f\\xa5\\x12\\xc5\\xd6\\xb6\\xa2\\x01\\xc0\\x09\\x45\\xd9\\xac\\xbf\\x09\\xf9\\xc0\\x31\\x94\\xe5\\xcf\\xbe\\x96\\x91\\x2a\\xcc\\xef\\x8b\\x97\\x0c\\xfb\\x59\\x13\\x78\\x88\\x6b\\x32\\xbc\\x57\\xf5\\xc3\\x45\\x07\\x24\\xd1\\x1b\\xbf\\xf6\\x11\\xb4\\x0b\\x40\\xfd\\x3f\\x4b\\x39\\x63\\x8b\\xee\\x17\\xf0\\xb7\\xad\\x27\\x7c\\xbe\\xbe\\x2d\\xbd\\xf7\\xc8\\xe7\\xae\\x64\\xee\\x64\\xbb\\x1d\\x6c\\xd5\\xbf\\x1b\\x1a\\x96\\x5d\\xff\\xb8\\x33\\x1c\\x1d\\x6e\\x41\\x86\\x15\\xd7\\x7f\\xf7\\x0b\\xeb\\xe0\\x96\\x62\\xa4\\x7f\\xd7\\x7b\\xff\\x0d\\x00\\x00\\xff\\xff\\x29\\xf7\\x5b\\xb6\\x59\\x25\\x00\\x00\")\n\nfunc uiTsPagesRest_explorerTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsPagesRest_explorerTs,\n    \"ui/ts/pages/rest_explorer.ts\",\n  )\n}\n\nfunc uiTsPagesRest_explorerTs() (*asset, error) {\n  bytes, err := uiTsPagesRest_explorerTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/pages/rest_explorer.ts\", size: 9561, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsPagesStoresTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xc4\\x55\\x4b\\x6f\\xdb\\x38\\x10\\xbe\\xfb\\x57\\x0c\\x74\\x08\\xa4\\xac\\x97\\xda\\xc7\\x4d\\x5e\\x07\\x9b\\xa6\\x45\\x11\\xa0\\xe9\\x03\\x06\\x7a\\x09\\x0c\\x83\\x96\\x68\\x8b\\x09\\x45\\xba\\x24\\x65\\xd7\\x08\\xfc\\xdf\\x3b\\xa4\\x1e\\x96\\x1c\\x39\\xc9\\xad\\x02\\x2c\\x8b\\xe4\\x7c\\xdf\\x7c\\x33\\x9c\\x21\\xe3\\x18\\x8c\\x2a\\x75\\xca\\x12\\xd8\\xd0\\x35\\x33\\xb1\\xb1\\x4a\\x33\\x43\\xac\\x19\\xc5\\xb8\\xf6\\x9f\\x66\\x2b\\xa6\\x99\\x4c\\x19\\x2e\\xdb\\x7c\\x1a\\x10\\x12\\xdb\\xfd\\x86\\xcb\\xb5\\x89\\x0b\\x6e\\x73\\xcd\\xc5\\x43\\xfb\\x45\\x32\\x84\\x05\\x10\\x5f\\x9d\\x85\\x16\\x2a\\x63\\xa2\\xf6\\xb1\\x30\\x96\\xda\\xd2\\x34\\x10\\xc4\\xc0\\x75\\x69\\x73\\xa5\\x13\\x78\\xa7\\x69\\x01\\x1f\\x75\\x29\\x19\\xd7\\x10\\x2e\\x71\\x44\\xd6\\xd5\\xe8\\xff\\x75\\x41\\xd1\\x51\\xaa\\x8a\\x08\\x11\\x97\\x97\\x23\\xb8\\x84\\xeb\\xac\\xe0\\xf2\\x3b\\x67\\x3b\\x03\\xdc\\x80\\xcd\\xd1\\x9f\\xe6\\x05\\xd5\\x7b\\x40\\x77\\xa5\\x60\\xb0\\x52\\x1a\\x6e\\x54\\xfa\\xa8\\x15\\x4d\\x73\\x66\\x80\\x3a\\x00\\x37\\x56\\x53\\xcb\\xb7\\x0c\\x76\\x6c\\xe9\\x68\\xb8\\xb4\\x4c\\xaf\\x68\\xca\\x08\\x8e\\xe2\\x51\\x8d\\xed\\x90\\x3f\\x8d\\x00\\xbc\\x4b\\x40\\xeb\\x99\\x4f\\x53\\xe3\\x70\\x8b\\x06\\xde\\x0d\\xfb\\xb9\\x11\\x4a\\x63\\x7a\\xfc\\x74\\x15\\x21\\xa8\\x15\\x50\\x21\\x6a\\x08\\xf1\\xf8\\x18\\xdf\\x68\\xab\\xb4\\x6d\\x44\\xd6\\x84\\xce\\x49\\xbb\\xb4\\xa5\\x1a\\x7c\\xae\\x66\\x9e\\x88\\x99\\x04\\xee\\x7c\\x06\\xc9\\xec\\x38\\x4b\\x6a\\xe4\\x14\\x24\\x8a\\x38\\xbb\\x1e\\x46\\x93\\x2e\\x75\\x2a\\xa8\\x31\\x98\\x15\\x69\\xb5\\x12\\x82\\x69\\xe0\\xc5\\x46\\xb0\\x82\\x49\\x6b\\x60\\xd1\\xec\\xe7\\x5d\\xf5\\xdf\\xb1\\xaa\\xe4\\x81\\xcb\\xf0\\x96\\xda\\x2a\\x42\\x9e\\xc2\\xe2\\x47\\xc9\\xf4\\xfe\\xc3\\x16\\x5f\\x77\\x33\\x54\\xf2\\xf7\\x5f\\xf8\\x4c\\x4e\\x6c\\x17\\x3e\\xc3\\x5b\\x2a\\x12\\x90\\x65\\xb1\\x64\\x7a\\x32\\x6a\\x2c\\xca\\xa5\\x40\\x96\\x54\\x49\\xdc\\x94\\x32\\x45\\xbd\\x61\\xd4\\xba\\x82\\x7e\\x0a\\xc8\\x37\\xe7\\xaa\\x89\\xc6\\x3d\\x36\\xe7\\x86\\xb4\\xe4\\xe8\\xdd\\x30\\x7b\\x5b\\x8f\\x42\\x24\\x9a\\x5e\\x0d\\x33\\x8c\\x3b\\xe1\\x93\\x5e\\x04\\x2d\\xf9\\xe1\\x44\\xa1\\x92\\xa5\\x14\\x8a\\x66\\x3d\\x79\\xa9\\x60\\x54\\xb7\\x0e\\xfb\\x6a\\x3a\\x4c\\x1d\\xbe\\xba\\x8a\\x8e\\x75\\xf4\\x15\\x5b\\x0f\\x4c\\xae\\x76\\x40\\x41\\x60\\x65\\x36\\x25\\x43\\x53\\x5f\\xa1\\xe6\\x58\\x39\\x75\\xed\\x0c\\x57\\x8f\\xa7\\x69\\x84\\xd5\\x06\\xab\\x52\\x22\\x89\\x92\\x2e\\xbb\\x75\\xb0\\x3d\\xf5\\x9a\\xd9\\x52\\x4b\\x5f\\x3b\\x37\\x1d\\x8b\\xbe\\xee\\xe7\\x6c\\xae\\xe2\\x87\\x78\\x8a\\x30\\xc8\\xf8\\x36\\x18\\xc3\\x7d\\xbb\\x02\\x6e\\x32\\xff\\x07\\xe7\\x82\\xba\\x54\\x3f\\x61\\x88\\x41\\x34\\xee\\x5b\\x94\\xe2\\x04\\x05\\xf0\\x65\\xf9\\xc0\\x52\\x4b\\x1e\\xd9\\xde\\x84\\xfd\\x2d\\xcc\\x98\\x49\\xc3\\x28\\x22\\x06\\x45\\x85\\x11\\x29\\xe8\\x26\\x6c\\xa4\\x55\\x96\\xb7\\x59\\x57\\x5c\\xf5\\xb8\\x76\\x72\\x40\\x57\\x22\\x03\\x6c\\xf7\\x35\\x70\\x3e\\x39\\xc1\\x1d\\x43\\x13\\x1c\\x35\\x3e\\x01\\x0a\\x4a\\x3c\\x13\\xa9\\x4e\\x32\\x9e\\xc1\\x61\\x7c\\x02\\x82\\xe1\\x54\\xb4\\x8b\\x04\\x2b\\xdd\\xd8\\x30\\xb8\\x90\\x4b\\xb3\\x99\\x5c\\x2c\\x4b\\x21\\x26\\xd5\\x77\\x3f\\x33\\x1d\\x36\\x7a\\x9f\\xe3\\x99\\x3a\\xad\\x8f\\xe8\\x38\\x80\\x3f\\xa0\\x96\\x8c\\x5f\\xc1\\xdc\\x4b\\xc3\\x5d\\x5e\\xf1\\x75\\x82\\xfc\\x5a\\x95\\xd8\\x74\\x87\\x26\\xeb\\x49\\xc7\\x7c\\xd0\\x41\\x80\\xd5\\x0d\\xc1\\x2b\\xae\\x25\\x1e\\x2f\\x95\\x67\\x1f\\xbe\\x1b\\xfa\\x97\\x4b\\xc1\\x0b\\x1a\\x82\\xcf\\x68\\x93\\x0c\\xc2\\xce\\x68\\xd9\\xe1\\xd1\\x83\\x87\\x6f\\x86\\x81\\x9a\\x13\\x20\\xad\\x66\\x89\\x64\\x76\\xa7\\xf4\\xa3\\xf3\\xfb\\xe7\\xb0\\x45\\xfd\\xff\\xcc\\xc1\\x3c\\x8a\\xfa\\x7b\\x7c\\xe8\\xa9\\x98\\x77\\x46\\xf3\\xb7\\x75\\xf0\\xb1\\x81\\xdd\\xb9\\x9f\\x31\\x8b\\xb7\\x54\\x75\\xf0\\x83\\xc1\\xdb\\x00\\x3b\\xd4\\x0b\\x7b\\xad\\x83\\x7f\\x67\\x03\\xb7\\x97\\x0d\\x96\\xd3\\xb4\\xd9\\x3b\\xb2\\xa1\\x78\\xfb\\x86\\x41\\x53\\xe7\\x41\\x27\\x71\\x6f\\xef\\x78\\xa8\\x3a\\xed\\x59\\xcb\\x0f\\xb5\\x87\\x43\\xfe\\xdb\\x22\\x13\\x38\\x5f\\xb6\\xfd\\x1e\\x7e\\x5f\\xe5\\xbc\\xed\\xfe\\xde\\x7e\\xbe\\xb0\\x9d\\xee\\x77\\x18\\xfd\\x0a\\x00\\x00\\xff\\xff\\x2a\\xcc\\x4b\\x96\\x07\\x09\\x00\\x00\")\n\nfunc uiTsPagesStoresTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsPagesStoresTs,\n    \"ui/ts/pages/stores.ts\",\n  )\n}\n\nfunc uiTsPagesStoresTs() (*asset, error) {\n  bytes, err := uiTsPagesStoresTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/pages/stores.ts\", size: 2311, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsTsconfigJson = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x84\\x92\\x41\\x4b\\x3b\\x31\\x10\\xc5\\xef\\xfd\\x14\\x65\\xcf\\x7f\\x12\\x0a\\x7f\\x2f\\xde\\x44\\x7a\\x10\\x94\\x7e\\x00\\x91\\x12\\xb7\\xd3\\x36\\x25\\xc9\\x84\\x99\\x49\\x51\\xa4\\xdf\\xdd\\x49\\x5a\\xb1\\x75\\xbb\\xba\\x97\\x85\\xfc\\xde\\x7b\\x93\\x79\\xbb\\x1f\\x93\\xa9\\x3e\\xdd\\x1e\\x88\\x3d\\xa6\\xee\\x76\\xda\\xcd\\xcc\\x7f\\x33\\xeb\\xfe\\x1d\\xcf\\x7b\\x8c\\xd9\\x07\\xa0\\x45\\x16\\xc5\\xac\\xfc\\x68\\x68\\x50\\x1c\\x6d\\x40\\xaa\\x07\\xf8\\xe6\\xe4\\x68\\x20\\xe2\\xaa\\x04\\xa8\\x40\\xfd\\x11\\xd3\\x8e\\xcf\\xe9\\x0a\\xfa\\xe0\\xc8\\xc9\\x71\\xde\\xda\\x05\\x86\\x33\\x9a\\xf0\\x21\\xe6\\xe0\\x7b\\x2f\\x77\\xe9\\xfd\\x2a\\x9f\\x47\\x2f\\x8b\\x34\\x27\\x42\\x52\\x2e\\x54\\xce\\x31\\x41\\xc4\\x3d\\xdc\\xeb\\x58\\x48\\xc2\\x43\\x9e\\xf0\\xd1\\xbf\\x5e\\x89\\xc5\\xd2\\x16\\x31\\xb6\\x78\\xbb\\x63\\xeb\\x72\\x36\\x97\\xb7\\x66\\x2c\\xd4\\xc3\\x93\\xcb\\x5f\\xe6\\x86\\x0e\\xa7\\x9e\\xd6\\x5a\\x52\\x9d\\xf6\\xfc\\x6d\\x30\\x76\\x0b\\x6e\\x05\\x64\\xe4\\x22\\xc7\\xb4\\xec\\x9f\\x67\\xda\\x18\\x04\\xb6\\x49\\x5f\\x4b\\x16\\x27\\x85\\xc7\\x24\\x95\\xfe\\x02\\x91\\xfe\\x0a\\x10\\x1f\\x81\\x81\\x3c\\x0c\\x15\\xf5\\x6b\\x63\\xaa\\xc5\\xd9\\x08\\x42\\xbe\\x1f\\x4a\\xb2\\xdb\\x00\\xdb\\x0d\\xb9\\xbc\\x1d\\x61\\x75\\x87\\x31\\x5f\\xbb\\xdf\\x18\\xd4\\x1f\\xc5\\x2b\\x1f\\xa1\\xea\\x93\\x25\\xbc\\xe5\\xa0\\x09\\x4d\\xd3\\x24\\x2f\\x93\\xc3\\xe4\\x33\\x00\\x00\\xff\\xff\\x2f\\x17\\x33\\x4e\\xc3\\x02\\x00\\x00\")\n\nfunc uiTsTsconfigJsonBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsTsconfigJson,\n    \"ui/ts/tsconfig.json\",\n  )\n}\n\nfunc uiTsTsconfigJson() (*asset, error) {\n  bytes, err := uiTsTsconfigJsonBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/tsconfig.json\", size: 707, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsTypingsD3D3DTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xec\\xbd\\xeb\\x72\\xdc\\xb6\\xb2\\x28\\xfc\\x3f\\x4f\\xc1\\x4a\\x55\\x6a\\x8d\\x52\\xb2\\x9c\\x4b\\x7d\\x5f\\x9d\\x92\\xb3\\xa3\\xe3\\xf8\\x96\\xec\\x6d\\x27\\xde\\x1e\\x39\\x95\\xac\\xd4\\xaa\\x55\\x18\\x12\\x33\\xc3\\x98\\x43\\x4e\\x40\\x52\\xd2\\x24\\xdb\\x0f\\x74\\x9e\\xe3\\xbc\\xd8\\x41\\x37\\x00\\x12\\x04\\x01\\x10\\xe4\\x8c\\x2c\\x59\\x91\\xaa\\x6c\\xcd\\x08\\x40\\xdf\\x70\\xeb\\x6e\\x34\\x1a\\x0f\\x1f\\x46\\xe7\\xbb\\x2d\\x8d\\x12\\xba\\x4c\\xf3\\xb4\\x4a\\x8b\\xbc\\x8c\\x96\\x05\\x8b\\x92\\xaf\\xff\\x73\\xfe\\x09\\x2f\\x7c\\xcd\\x8a\\xdf\\x69\\x5c\\x9d\\x46\\xeb\\xaa\\xda\\x9e\\x3e\\x7c\\x98\\x7c\\xfd\\x7b\\x79\\x52\\xb0\\xd5\\x43\\x28\\x7c\\xaa\\x35\\x5a\\xec\\x4e\\xa3\\xef\\x0a\\x96\\x96\\xd1\\xaf\\x24\\x7f\\x57\\x5c\\x44\\xdf\\x40\\x8b\\x92\\x37\\x59\\xa5\\xd5\\xba\\x5e\\x9c\\xc4\\xc5\\xe6\\xe1\\x02\\x2a\\xec\\xb0\\xfc\\x5b\\x03\\x80\\xc0\\xe0\\xae\\xff\\x50\\xd6\\xa5\\xd9\\x0e\\x08\\x4e\\x3e\\xf9\\x24\\xa1\\x71\\x46\\x18\\x8d\\x36\\x45\\x52\\x67\\x34\\x7a\\xfa\\x75\\xf4\\xd7\\x27\\x11\\xff\\xa1\\x57\\xdb\\x82\\x55\\x51\\x9a\\x57\\x94\\x2d\\x49\\x4c\\xa3\\x39\\xcd\\x38\\x0b\\x05\\x2b\\x65\\x05\\xf8\\x79\\xf8\\xf9\\xe7\\xcd\\xe7\\xcf\\x65\\x8d\\x88\\xe4\\x11\\xff\\xb0\\xa1\\x79\\x15\\x2d\\x59\\xb1\\x89\\xaa\\x35\\x8d\\xe2\\x9a\\x31\\xf8\\x43\\x52\\xc4\\x35\\x94\\xb4\\xad\\x1e\\x36\\x1f\\x4b\\x6c\\x7e\\xaa\\x81\\x37\\x51\\x08\\x34\\x6f\\x68\\x55\\x33\\x2e\\x2b\\x80\\x4b\\x37\\xdb\\x6a\\x27\\x5b\\x72\\xfe\\xbb\\x35\\x1f\\x76\\xbe\\xce\\x8e\\x4e\\xa3\\x7f\\xcf\\x55\\xcd\\x6f\\x48\\xbe\\xfb\\xf6\\xd1\\x00\\x26\\x51\\x5b\\x60\\x5a\\xa6\\xac\\xac\\x1a\\xc6\\xaa\\x35\\xa9\\xa2\\x0d\\xa9\\xe2\\x35\\x15\\xc5\\xe5\\x96\\xc6\\xe9\\x32\\xa5\\x89\\x24\\x86\\x77\\x7e\\x59\\xb1\\x34\\x5f\\x75\\x41\\x1a\\x08\\xfe\\xf7\\x96\\x30\\xb2\\x69\\x9b\\x34\\xe4\\x45\\x73\\x6c\\x1c\\x55\\x85\\xc0\\xe2\\x65\\x4c\\x35\\x3f\\x95\\x28\\xf7\\x63\\xb4\\xe5\\x24\\x2f\\x12\\x1a\\x42\\xbe\\x12\\xca\\x8f\\xbc\\x7e\\x2b\\xa1\\x42\\xb2\\xe5\\x25\\x5d\\xd6\\x3e\\x8d\\x9e\\x5d\\xf0\\x5f\\xe7\\x84\\xad\\x68\\xe5\\x23\\xff\\xfd\\xa3\\x4f\\xfc\\x83\\x6f\\x53\\x67\\x55\\xba\\xcd\\x1a\\x3a\\xca\\x29\\x63\\xf0\\x71\\x96\\x0d\\x0f\\x43\\x25\\x33\\x92\\x65\\x2d\\xb2\\x76\\x5c\\x38\\x46\\xc5\\x47\\x3c\\x1c\\x08\\x63\\x64\\x17\\x15\\xcb\\x86\\xdb\\x11\\x63\\xa3\\x8c\\x1e\\xab\\xd6\\xb9\\x36\\x4a\\xca\\x71\\xc3\\xa4\\xec\\x8c\\x93\\xdf\\xfe\\x35\\x30\\x52\\xf0\\xd7\\x27\\xf6\\xd5\\xec\\xe9\\xd7\\x08\\x89\\x17\\x54\\x34\\x4f\\x4a\\x01\\x57\\xeb\\xf3\\xe4\\xea\\x34\\xca\\xeb\\xcd\\x82\\xb2\\x16\\x64\\xb2\\xeb\\xff\\x2d\\xce\\x52\\xde\\xf0\\x17\\x57\\xc1\\xaf\\xfd\\x82\\x8a\\x91\\xbc\\xcc\\x48\\x45\\x55\\xd1\\x6f\\xff\\x6a\\x0b\\xcb\\x98\\x64\\xb4\\xdf\\xa6\\x2c\\x6a\\x16\\x53\\xa4\\xf1\\x54\\x91\\xde\\x96\\x5a\\x48\\xb5\\x50\\xfa\\x8e\\xee\\x9e\\x70\\xd1\\xf7\\x0b\\x48\\x56\\xfd\\x17\\xdd\\x9d\\x9d\\x46\\x8b\\xa2\\xc8\\x28\\xc9\\x35\\x1e\\x2a\\x96\\x39\\x8a\\x36\\xb4\\x22\\x8e\\xa2\\x72\\x9d\\x2e\\x5d\\x10\\x2b\\xbe\\xe9\\xa8\\x71\\xe9\\xef\\xa0\\xef\\x48\\x49\\x9b\\xde\\x19\\xde\\x7b\\x9e\\x30\\xca\\x45\\x1a\\x91\\x68\\x41\\xd7\\xe4\\x22\\xd5\\x26\\x9a\\x36\\x96\\x54\\x19\\xdf\\x63\\xe5\\xa7\\x13\\xf5\\xe1\\x91\\x03\\xee\\xe3\\x38\\xa6\\x65\\xd9\\x59\\x3f\\xea\\x92\\xb2\\x88\\xe2\\x78\\x81\\x3d\\x1e\\x49\\x26\\xdd\\xed\\x47\\xc3\\x49\\x8d\\x4e\\x73\\xd1\\x5f\\x6c\\xb6\\xb0\\x0d\\x57\\x97\\x45\\x74\\x41\\xb2\\x9a\\x0a\\x05\\xa2\\xe4\\x42\\xe1\\xa2\\x3a\\xd1\\x6a\\xaa\\xed\\xef\\xc1\\x97\\x51\\xba\\xe4\\x0c\\x73\\x5d\\x21\\x13\\x24\\xf2\\x8d\\x77\\x71\\x1c\\xf1\\x56\\x6d\\xc9\\x0a\\xc5\\xc2\\xf4\\xc2\\x2f\\x5a\\x58\\x1a\\x54\\x39\\x5d\\x49\\xf4\\x1c\\xf7\\x39\\x24\\xa1\\x5f\\xbc\\xe0\\x3d\\x11\\x17\\x79\\x62\\x96\\xb7\\xec\\x92\\x32\\xe6\\x3d\\xc6\\x49\\xfe\\xe6\\xfc\\xdb\\x19\\x39\\x8d\\xce\\x8f\\xa3\\x05\\xff\\xff\\xa8\\x3f\\xec\\x0e\\xc8\\xbf\\x85\\x4b\\xb7\\x70\\xae\\x97\\xff\\x84\\x4e\\x14\\xc0\\xf3\\x94\\x83\\x85\\x61\\xb6\\xe1\\xfa\\xd9\\xa6\\xde\\x08\\x14\\x7c\\x74\\x81\\x3e\\x85\\x4b\\xaf\\x97\\x6e\\xc6\\xe4\\x0a\\x8b\\x0b\\x2a\\x61\\xda\\x1e\\xd1\\x54\\xda\\x90\\x2d\\x8c\\xe7\\x92\\x0b\\x84\\xcb\\x61\\x59\\xe7\\xce\\x41\\xcb\\x69\\xf8\\x86\\x13\\xfe\\x96\\x73\\xc0\\xf8\\x6c\\x39\\xff\\xed\\x5f\\xc7\\xd0\\xfa\\x34\\x9a\\x5d\\x9c\\x21\\x4b\\xe9\\x99\\xe2\\xe7\\x28\\xfa\\x8f\\x6f\\xa3\\xb7\\x9c\\xbd\\xb7\\x37\\xc0\\x99\\x41\\x71\\x4b\\x2e\\xa7\\xe7\\x7c\\x98\\x1e\\x72\\x75\\xf3\\x92\\x26\\x57\\xd7\\x21\\xe9\\x83\\x73\\x66\\x50\\x3c\\x56\\xd2\\xb2\\xe7\\x09\\xff\\x7e\\x1b\\xa4\\x8e\\xfb\\x4a\\xe5\\x12\\x3c\\x4c\\xd7\\x46\\xd6\\xfa\\xee\\x7c\\x23\\xdc\\xf5\\xa9\\xee\\x0a\\xdf\\x4d\\x20\\xac\\xa9\\x35\\xdf\\x14\\x51\\x8d\\xe3\\x34\\x71\\xe5\\x4b\\x51\\x83\\x8a\\x18\\x8e\\xaa\\xf2\\x03\\x8a\\x9d\\x13\\xa1\\x53\\xdf\\x13\\xb8\\x1c\\xe7\\x21\\x7b\\xc5\\x35\\xf2\\xd5\\xa1\\x57\\x10\\xab\\x14\\xb5\\x51\\xa4\\x11\\xc6\\x4d\\x70\\xae\\x27\\xa5\\x31\\xd7\\x96\\x38\\x81\\x37\\x2e\\x7e\\xa0\\xe2\\xd0\\xf2\\xbf\\x66\\x26\\xbb\\xc4\\xef\\xd1\\x19\\x1b\\x9a\\xa4\\x4e\\xf2\\xa2\\x19\\x54\\xf9\\xe2\\xe4\\xff\\x7b\\xf0\\x47\\x4d\\xf2\\x2a\\xcd\\xe8\\xd1\\xc9\\x07\\xed\\x17\\xa0\\xed\\xd0\\x3d\\xf3\\xe1\\x38\\x36\\x39\\x99\\xd8\\x4d\\x24\\x52\\xb4\\xa0\\xea\\x47\\x50\\xf9\\xd3\\xed\\x4e\\x49\\xfb\\xfe\\x5d\\xb3\\x8d\\xce\\x39\\xf7\\x0d\\x36\\x5e\\x93\\xa1\\x52\\x69\\x63\\x49\\xd5\\xe2\\xbd\\xd1\\x61\\xeb\\x38\\xda\\x76\\x36\\x66\\x3f\\x8f\\x2f\\x8b\\x98\\xc8\\x7e\\x49\\x73\\x6e\\x3f\\xa0\\x51\\xbf\\x2d\\x52\\x69\\x43\\x5c\\xe1\\x4e\\xa1\\xc8\\xde\\x10\\xfe\\x77\\xfe\\x4f\\x09\\xa0\\x60\\x09\\x65\\x7b\\x33\\x7d\\x15\\xfd\\x8c\\x7b\\x52\\x53\\x45\\x5a\\x2f\\x1d\\x6a\\xfa\\xcd\\xb2\\xe2\\x32\\x7a\\xd5\\x51\\xdc\\x60\\x44\\x21\\xb2\\xb2\\x5e\\x94\\xd4\\xd2\\x64\\x9d\\xae\\x57\\xd1\\xab\\xce\\x46\\xe8\\x6c\\xa3\\x19\\x67\\x69\\xc9\\x6d\\xbc\\xee\\x2c\\xb8\\x42\\x15\\x88\\x93\\xd0\\x28\\x41\\xc7\\x1c\\xfa\\x6a\\xdd\\xea\\x44\\x43\\x83\\xeb\\xb6\\x09\\xfe\\x7a\\xe5\\xbe\\x5a\\x4f\\x95\\xfb\\x4b\\xba\\xbc\\x97\\xfd\\x0d\\xc9\\xfe\\x0d\\x6f\\x7b\\x70\\xe1\\x7f\\x87\\xa0\\xa3\\xba\\x04\\xbf\\x21\\xec\\x00\\xe8\\xc8\\x28\\x98\\x7f\\xf5\\x94\\x95\\xa4\\xdb\\x63\\x60\\xdf\\x12\\xd4\\x17\\x6c\\xa6\\x9a\\xf1\\x35\\x32\\x21\\x15\\x37\\x7a\\x49\\xbe\\xe3\\x96\\x4b\\x9e\\xd0\\xab\\xce\\x1a\\xc9\\xff\\x7c\\x84\\x85\\x2e\\xa2\\xdf\\x70\\x15\\xba\\xd8\\xa4\\x7f\\x8a\\x41\\x83\\x43\\x40\\xdf\\xc0\\xc2\\x57\\x7e\\xa6\\x00\\x59\\xd5\\xba\\x75\\xbd\\x5c\\x66\\x34\\x5c\\x91\\x7e\\x43\\x05\\x29\\xfa\\x46\\xda\\x78\\x30\\x39\\xf3\\xbc\\x54\\x7a\\x67\\xf5\\x1a\\xc8\\x3f\\x0d\\xd7\\x7d\\x18\\x35\\xc6\\xbc\\xaa\\x25\\x01\\xc9\\x9a\\x71\\x81\\xf3\\x04\\x11\\x36\\x42\\xc2\\xb3\\x10\\x45\\x51\\xb9\\x2e\\xea\\x2c\\x89\\x16\\x54\\x6e\\x6b\\x7c\\x36\\xa5\\xd6\\x0e\\xdc\\x52\\xb6\\xe1\\x3b\\xaf\\x90\\x02\\xef\\x16\\x18\\x79\\x12\\x99\\xfc\\x7e\\x24\\x7f\\xbb\\x24\\x73\\x0e\\xce\\xcc\\x6d\\x51\\xc2\\xee\\x7d\\xc1\\x75\\x41\\xb2\\xe0\\xfb\\xa9\\xe8\\xf1\\x66\\xfc\\x0f\\x6e\\xd8\\x92\\x33\\x74\\x06\\x57\\x0a\\xa0\\x8d\\xde\\x3f\\xd3\\xed\\xec\\xe4\\xe4\\x04\\x9a\\x04\\xd2\\xf7\\x9a\\xb0\\x52\\x0c\\xa6\\x55\\x7a\\x41\\xf3\\xe8\\xab\\xa7\\x11\\x59\\x2e\\xd3\\x9c\\x0a\\x44\\x7c\\x35\\xd8\\x48\\x6f\\xe4\\x71\\x44\\x4a\\x71\\x7e\\xc7\\xc5\\xb5\\xd8\\x45\\xf3\\x9f\\x5f\\xfc\\xa3\\xd4\\x6a\\x91\\x8a\\x57\\x5b\\x70\\x69\\x79\\xb9\\x69\\x0f\\x00\\x3d\\xa8\\x6c\\xac\\x35\\x75\\x66\\x2d\\x08\\xcd\\x81\\xef\\x99\\x33\\x5a\\x17\\x68\\x83\\x2f\\x40\\xf2\\x1b\\xc2\\xa1\\x5f\\x45\\xe7\\x97\\x45\\x94\\xa4\\x7c\\xe4\\x94\\x1c\\x25\\xc9\\xda\\x15\\xd9\\xdb\\x15\\x4d\\xe1\\x4c\\x80\\x09\\xec\\x0f\\xe1\\xa6\\x2d\\x5b\\x52\\xf5\\xd1\\x5c\\x6f\\x33\\x5e\\x04\\xc4\\x27\\xbf\\x93\\x18\\xfc\\xab\\x5b\\x92\\x06\\x18\\x0f\\x16\\x58\\xbc\\x31\\x4b\\x29\\x8e\\x28\\x80\\xa1\\x37\\x64\\xd2\\x7f\\x88\\x74\\xfe\\xf6\\xaf\\xb6\\x39\\x47\\xfc\\xd5\\x83\\xe6\\xf8\\x4a\\x10\\x03\\xdb\\x05\\x25\\x7c\\xdf\\xe8\\x42\\xd1\\xa6\\x10\\x50\\xa8\\x4d\\x20\\x25\\x00\\xb7\\x08\\x5e\\xa6\\x65\\x85\\x23\\xf2\\x1d\\xdd\\x95\\x6a\\x75\\xe3\\xab\\x67\\x9c\\x92\\x8a\\x8f\\xd1\\x80\\x95\\x0e\\x2d\\x0b\\x45\\x72\\xb1\\xf8\\x5d\\x9c\\xd5\\x14\\xd1\\x8a\\x36\\x80\\x1b\\x1f\\x2a\\x2b\\x36\\x36\\xb2\\x01\\xf7\\x0c\\x6d\\x0c\\xb1\\x26\\x8b\\x81\\x16\\x40\\xb4\\x84\\x7b\\x1d\\x64\\x0f\\x90\\x2c\\x8a\\x75\\xa2\\xbd\\x23\\x4d\\x17\\xf3\\x03\\xb1\\x21\\xab\\x41\\x71\\x4d\\x32\\x97\\x58\\x70\\x44\\x38\\xb9\\x90\\x34\\x04\\xb3\\xb1\\xa1\\x6c\\x45\\xdb\\x53\\x4d\\x31\\xad\\xe1\\xcc\\xa1\\x88\\x8a\\x9c\\x0e\\xbb\\x96\\x1a\\xba\\x91\\x5a\\x84\\x66\\x37\\xdc\\x78\\x01\\xac\\xad\\x8a\\xae\\xe1\\xa9\\xfc\\x82\\xe6\\x94\\x89\\x33\\x17\\xbe\\x16\\xac\\xa8\\xb4\\xd0\\x28\\x4b\\x63\\xd9\\x57\\x27\\x36\\x4c\\x58\\x77\\xf8\\x74\\x75\\x18\\xba\\x38\\xd8\\xfd\\xe2\\xa4\\xdb\\xd0\\x00\\xa3\\x4e\\x54\\xab\\x62\\xdb\\x6a\\x82\\x2b\\x05\\x1b\\x3a\\x4e\\x40\\xaf\\x0a\\x57\\x43\\xba\\x8d\\xe6\\xf0\\xdf\\x82\\x56\\x97\\x94\\xef\\x20\\xb8\\x1a\\x74\\xdd\\xff\\x06\\x87\\xf0\\x33\\x03\\x8c\\xad\\xea\\x06\\x60\\xfa\\xaa\\x9b\\x2e\\xdb\\xa9\\x52\\x08\\x64\\x9f\\xb0\\x4a\\xd3\\x84\\xe1\\xeb\\xed\\x11\\x14\\x27\\x46\\x97\\x54\\xb1\\x3d\\x1b\\x23\\xb8\\xf7\\xfe\\xad\\x26\\xca\\xe9\\x25\\xff\\xc7\\xd7\\x82\\x62\\x0b\\xbc\\xd8\\x0f\\x06\\xa1\\x02\\xc4\\x87\\xfc\\xc8\\x7f\\xbb\\x95\\xc0\\x3f\\x6a\\x80\\xc3\\xbb\\x82\\x8a\\xf3\\x58\\xa9\\x5c\\xff\\xf2\\xea\\xe5\\xf7\\x55\\xb5\\x95\\xe5\\xd6\\x41\\x7f\\xb5\\x66\\xc3\\x43\\x5e\\xdf\\x1b\\xcb\\x5d\\x1e\\xaf\\x59\\x91\\x17\\x75\\xc9\\xd1\\x09\\xc4\\x78\\x1e\\xd6\\x9c\\xc6\\xd7\\x2c\\x0b\\xe9\\x7a\\x5e\\x2d\\x7a\\xcb\\xff\\xa1\\x7e\\x89\\x70\\xec\\xf5\\x62\\x92\\x65\\x0b\\x12\\xbf\\x8b\\x9e\\x4b\\x85\\x1f\\x5a\\xa4\\xf9\\x45\\xf1\\x8e\\x46\\x97\\x6b\\xde\\x9d\\x0d\\xd3\\x70\\xa4\\x56\\x90\\x04\\x4d\\x34\\x31\\x30\\x14\\x7d\\x24\\xcd\\x4a\\x6f\\x5f\\x73\\x62\\x4e\\x1b\\x75\\x4b\\x61\\xe4\\xdd\\x3b\\x43\\xf9\\x74\\xe5\\x88\\x06\\xc3\\x45\\x91\\x26\\xbc\\x5b\\x7e\\x59\\xb3\\xa1\\x99\\x72\\xa3\\xc2\\xdb\\x70\\xf5\\x29\\x7a\\xf5\\xc3\\xab\\x67\\x78\\xbe\\x7d\\x0b\\x65\\x0d\\x04\\xee\\x2f\\x79\\xe7\\x54\\x6b\\xa7\\x46\\x45\\xaf\\x38\\x71\\x69\\x66\\xd7\\x19\\x79\\x61\\x48\\x78\\x97\\x1b\\xd8\\x01\\xfa\\xea\\x66\\x07\\x3a\\x07\\xbe\\x2d\\xf2\\xb2\\xe9\\x8c\\x91\\xa3\\xfc\\x9a\\x65\\xf3\\x11\\x8f\\xe3\\x60\\xc1\\x06\\x0c\\xe2\\xff\\x9c\\xff\\xf4\\x63\\xb4\\xc8\\x8a\\x85\\x4f\\xb1\\xf2\\xc8\\xf4\\xfa\\x04\\xa4\\x09\\xe7\\xf7\\x12\\x0c\\x44\\xf7\\x48\\xa3\\x8c\\x15\\x4c\\x7a\\x62\\x1a\\xa7\\x4c\\x2b\\x15\\xf8\\xd0\\x91\\x8b\\x43\\x18\\x79\\xf4\\xfd\\xf9\\xab\\x97\\x4d\\xcc\\x1c\\x57\\xba\\xc8\\x0a\\x3e\\xd8\\xb7\\xb9\\x4d\\x40\\xdc\\xdc\\x08\\xd0\\x5d\\xd1\\x87\\x8a\\xff\\x7a\\xbb\\xc0\\x60\\x19\\x7e\\x42\\xa6\\xfb\\x53\\xc9\\xe5\\xd4\\x09\\xff\\x41\\x84\\x75\\x27\\xe6\\xff\\xa0\\xa4\\x87\\x57\\x80\\x1c\\x76\\x44\\xef\\x98\\xbf\\x7d\\xeb\\xc1\\xba\\x82\\xc9\\x37\\x66\\x28\\x3e\\x97\\x6c\\x8d\\x5f\\x14\\xa2\\xb8\\xd8\\x6c\\xc8\\x83\\x92\\x02\\x5b\\xe0\\xac\\x97\\x16\\xd9\\xec\\xc9\\xfc\\xe7\\x23\\xdc\\x95\\xac\\xcb\\x43\\x5c\\x5e\\x70\\xec\\xe5\\x85\\x33\\x08\\x4e\\xeb\\x00\\xc2\\x16\\x69\\xc5\\x08\\xdb\\x45\\xf1\\x9a\\xb0\\x3e\\x2a\\x40\\xc2\\x4d\\x6d\\x56\\x82\\x95\\x90\\xa5\\x5c\\x80\\x25\\xdd\\xa4\\x71\\x91\\x71\\xa1\\x72\\x91\\x5d\\x42\\x1c\\x2e\\xbd\\xa0\\x56\\x6d\\x3f\\x09\\xa6\\x23\\xaa\\xc8\\xc2\\xc2\\xe6\\xb9\\x62\\xd3\\xaa\\xe5\\x34\\xd0\\xed\\xc0\\xcf\\x61\\x92\\xa9\\x01\\x60\\xed\\xca\\x0a\\x47\\x39\\xd4\\x3b\\x81\\xff\\x5c\\x80\\xe6\\x10\\x2b\\x6a\\x05\\x20\\xa3\\x48\\xb1\\xc2\\x09\\xfe\\x0f\\xd1\\x94\\x3a\\x1c\\x0d\\xcc\\x0f\\x10\\xbf\\xb8\\x2d\\x32\\xb4\\xf3\\x9a\\xe8\\x3b\\x1b\\xd8\\xb4\\xad\\x79\\x2a\\xdc\\x8e\\xe8\\xa6\\x3c\\x01\\xe0\\x1a\\x94\\x40\\x3c\\xbd\\xd0\\x00\\x2b\\xa2\\x1f\\xb1\\xd6\\x01\\xd0\\x01\\xcc\\xd5\\x30\\xbe\\x37\\x45\\x9d\\x27\\x07\\x40\\x27\\xa6\\xe0\\x10\\x36\\x11\\xd6\\x7d\\x00\\x74\\x6f\\x5e\\x7c\\x17\\xc1\\xe0\\x1f\\xe6\\x6f\\xb5\\x38\\x00\\xba\\xef\\xe7\\x2f\\xc3\\xd0\\x7d\\x5f\\x66\\x87\\x40\\xf7\\x24\\x14\\x5d\\x7c\\x08\\x74\\x2f\\x3f\\x27\\x9f\\x2f\\x3e\\x0f\\xc3\\xf8\\x92\\x1c\\x42\\x9e\\xd2\\xad\\x57\\x2c\\xc3\\x66\\x1f\\x3a\\xf4\\x0e\\x82\\x96\\x2f\\xb2\\xb0\\xc6\\x4a\\x87\\xe6\\x00\\xda\\x9f\\x16\\xe2\\x12\\xd3\\xde\\x78\\xbf\\x7a\\xaa\\x0e\\x1f\\x9a\\x63\\x8f\\x21\\xdc\\xe7\\xaa\\xe2\\x04\\xf4\\xe7\\x6b\\xda\\xba\\xf8\\x17\\x75\\x9a\\x55\\x0f\\xd2\\x5c\\x03\\x0e\\xc7\\x9c\\x04\\x0e\\x32\\xd3\\x21\\xc9\\x17\\x70\\xf0\\xa4\\xe1\\xd7\\x70\\x3f\\x47\\x08\\x3e\\x87\\x34\\xd9\\x15\\xb5\\x5d\\xc6\\x19\\x16\\x9d\\xca\\x2a\\x27\\xe2\\x97\\x73\\xd9\\xbf\\x58\\xfd\\xc3\\xbe\\xea\\x5f\\xf0\\x95\\x84\\x97\\x9e\\xf0\\x7f\\xfe\\x03\\x56\\x75\\x42\\x27\\xfd\\x7b\\x8e\\x51\\x2e\\xce\\x50\\x4f\\x65\\x9b\\x01\\x37\\x1b\\x69\\x4e\\x8a\\x41\\xa7\\x81\\x8e\\x22\\xb0\\x7f\\x4a\\x44\\xa4\\x84\\x70\\x1e\\xe3\\xf0\\xab\\xaf\\x1f\\x29\\x07\\x0d\\xc3\\x2e\\x93\\x40\\xda\\x3f\\x72\\xc0\\xb5\\xfd\\x34\\x4a\\x54\\x9d\\x35\\x55\\xb5\\x93\\xb3\\x19\\xce\\xa8\\xce\\x31\\xb4\\x7e\\xfd\\xc0\\x22\\x22\\xed\\x7a\\xd9\\xfc\\x87\\x68\\xcb\\xe8\\x92\\x0f\\xd4\\xa5\\xd4\\xc3\\x5a\\x1f\\x92\\xf0\\xf6\\x93\\xca\\xf8\\x33\\xaf\\x1f\\xa7\\xa5\\xe3\\xc4\\x5c\\xd0\\xf9\\x1a\\x41\\x76\\x09\\x3b\\x6e\\x1b\\xea\\xfe\\xce\\x57\\x94\\xd3\\x1a\\x8b\\x06\\x4e\\x85\\x02\\xce\\x4e\\xf8\\xce\\x06\\xb2\\xe7\\x03\\x1c\\xc8\\x49\\xbe\\xe6\\x3a\\xd1\\x02\\xd4\\x27\\x1b\\x15\\xb2\\xf2\\xe9\\x08\\x41\\xb0\\xa2\\xa8\\x2c\\xd7\\xec\\x7a\\x37\\xa7\\x78\\xa1\\xf7\\x9e\\x1d\\xdc\\x50\\x1c\\x32\\x10\\xcf\\x31\\x80\\x79\\x0b\\xbc\\x30\\xba\\x4a\\x4b\\x3e\\xc5\\xe0\\x32\\x1a\\xd9\\x70\\x0d\\x16\\x6e\\x86\\x88\\x1e\\xa1\\x5e\\xb3\\x41\\xd4\\x31\\x71\\x21\\x9d\\x30\\x4b\\x4c\\xc6\\xd5\\xcf\\x95\\xd0\\xa2\\x9d\\xc5\\x59\\x9a\\xbf\\xf3\\x14\\x7b\\xdb\\x6e\\x32\\x60\\xde\\x56\\xfc\\x7e\\xc8\\x0a\\xfc\\xef\\x9a\\x64\\x30\\xba\\x7a\\x17\\xf4\\xb8\\x4c\\x7c\\x52\\xf8\\x03\\xdb\\xed\\x66\\x50\\x4f\\x9b\\x12\\x7f\\x45\\x28\\xc8\\x86\\x18\\x6e\\x6a\\x70\\x1d\\xb1\\xfd\\xfa\\x3e\\xc8\\x56\\x92\\xa7\\xa8\\xed\\x82\\x4a\\x09\\xba\\xc3\\x9b\\x75\\x40\\x8e\\xc5\\x96\\x5c\\x30\\x2a\\x6d\\x43\\x87\\x37\\x84\\xf0\\x3a\\xfd\\x6e\\xd0\\x71\\x64\\x9c\\xf3\\xc3\\xbc\\x7d\\xfa\\xf5\\x89\\xb6\\xf6\\xb6\\x1f\\xdd\\x81\\x85\\x39\\x87\\x56\\xe3\\x25\\x3d\\x3c\\x07\\x68\\xb4\\x24\\xfb\\xc9\\x14\\xa8\\x46\\x83\\x4e\\x7a\\x27\\xcc\\xe8\\x32\\xad\\xcc\\x5b\\x7f\\x7c\\x5a\\xaf\\x30\\x2c\\x7c\\x01\\x66\\x4c\\x9e\\xd3\\xcc\\xdc\\xe0\\x2d\\xbd\\x36\\x63\\xed\\xa2\\xb0\\x6a\\x3f\\x2e\\xb4\\x65\\x81\\x4b\\xe2\\x09\\xf2\\xc1\\xb1\\xe3\\x87\\x41\\xf7\\xb8\\x9b\\xec\\xc5\\x0e\\xed\\x28\\x15\\x4f\\xd2\\x12\\x2f\\x8a\\x6d\\xb7\\x58\\x0d\\x7a\\xb1\\xa2\\x36\\xbe\\x3c\\xd4\\xb9\\x4f\\x6b\\x4c\\x02\\x1b\\x9d\\xcf\\xda\\x57\\xeb\\x38\\xc0\\xd3\\x14\\x02\\xd3\\xc6\\xcf\\xba\\x15\\x7a\\xdc\\x7e\\xcc\\x34\\xf9\\x0b\\xf6\\x38\\xb8\\x69\\xc2\\x6f\\xe8\\xb8\\x06\\xe1\\xbb\\x48\\x1b\\x21\\xf9\\xb9\\x57\\xf2\\xe5\\x24\\xc9\\x2b\\x98\\xb6\\x59\\xb2\\xe6\\xfb\\xe8\\xfa\\x38\\x2a\\x09\\x5f\\x52\\x08\\x2e\\x1d\\x25\\x4e\\x9a\\x0c\\xe2\\xe2\\x72\\xb8\\xbe\\x95\\x85\\xf6\\x57\\xe9\\xed\\xaf\\xf9\\xd4\\xfe\\x9a\\x5f\\x7b\\x7f\\xf5\\x48\\x0b\\xef\\x2f\\xff\\xaa\\x96\\x91\\x29\\xab\\xda\\xcb\\xc7\\x3d\\x98\\x36\\x66\\xb2\\x56\\xdc\\xc4\\xbe\\x52\\x09\\xf6\\x38\\xb8\\x69\\x92\\x6f\\xe8\\xb8\\x36\\xc9\\xf7\\x49\\xd3\\x24\\xbf\\xa2\\xc5\\x69\\xf4\\x82\\x16\\x27\\xfc\\x5f\\xe7\\xaf\\x1b\\xfc\\xf3\\x06\\xfe\\xee\\xd4\\x8c\\x57\\x54\\x5e\\xa1\\xde\\x14\\x5c\\x6d\\x8d\\xb6\\x85\\xd8\\xad\\xb8\\x52\\x93\\x89\\xa8\\x13\\x88\\x17\\xec\\x30\\x82\\xe1\\x4b\\xd4\\xde\\x8f\\x08\\x64\\xd6\\xd4\\x51\\xc1\\x23\\xfd\\x03\\x71\\x07\\x11\\x55\\x51\\x43\\x18\\x93\\x24\\xa2\\x9c\\x48\\x05\\x42\\xa1\\xa5\\x9b\\x0e\\xa0\\xc4\\x41\\xca\\x0f\\xa6\\x3e\\x20\\xef\\x48\\x95\\x9a\\xf1\\x70\\x1c\\x31\\x4d\\xeb\\x34\\xaa\\xea\\xb7\\x40\\x7f\\xe2\\xe5\\xec\\x32\\x2d\\x69\\xdb\\x42\\x37\\x41\\xc0\\xfd\\x17\\x06\\x49\\x53\\xce\\xa1\\x75\\xc1\\xbe\\x79\\x73\\x1c\\x9d\\x7f\\xab\\xb4\\xf3\\xd9\\x96\\x1b\\x40\\xa8\\x7d\\xc0\\x15\\x4e\\xed\\xdb\\xa3\\x5e\\xbb\\xb6\\x91\\xaa\\xaa\\x4e\\x5c\\xce\\x35\\x99\\x60\\x80\\x4d\\x77\\x3e\\x82\\xc6\\xfc\\x8a\\x6c\\x2d\\x57\\xf3\\x01\\x66\\x21\\xad\\xee\\xbf\\xa2\\xdf\\xde\\xd1\\x9d\\x1a\\xbf\\xff\\x82\\x6b\\x77\\xd1\\x7b\\xd9\\xf2\\xdc\\xd2\\x0e\\x11\\x89\\x42\\x4f\\x2d\\x22\\x5d\\x09\\x18\\xef\\x33\\x5c\\xe9\\x18\\x02\\x9d\\x9e\\xc3\\xc1\\x93\\x22\\xeb\\x5c\\x86\\x8c\\x9e\\x59\\x4c\\x2c\\x0b\\x48\\x6d\\x72\\x95\\xb4\\x77\\x1a\\x0c\\x92\\x98\\xd3\\xca\\x21\\x89\\x0e\\xad\\x50\\xcd\\x01\\x38\\x49\\xb9\\x7e\\x5b\\xc5\\x6b\\x88\\x67\\x02\\xa5\\xb2\\x6c\\xe3\\xdb\\x40\\x3b\\x91\\xa5\\x6d\\x7d\\x46\\x17\\x9c\\x85\\x59\\x85\\x59\\x05\\xe4\\x91\\x99\\xf0\\xc3\\xcb\\x2f\\x1c\\x0e\\x9a\\x1f\\x9d\\xc8\\x28\\xbd\\xfd\\x1f\\x75\\x51\\xd1\\x19\\x47\\xa2\\x2d\\x2f\\xa6\\xa6\\x0f\\x5e\\xdd\\x5e\\x14\\xc8\\x0c\\x07\\x0f\\x17\\x27\\x4a\\x4d\\x5e\\x97\\x3f\\x8e\\x12\\x3e\\x39\\x77\\x5a\\x18\\xcc\\x86\\xb0\\x77\\xba\\x59\\x08\\xde\\xfa\\xae\\x7c\\x96\\x59\\x5d\\xae\\x67\\xbd\\xa2\\xf7\\x2d\\xfa\\x46\\x5d\\x86\\x5a\\x0e\\x3d\\xba\\x65\\x09\\xdc\\xa0\\xb3\\xab\\x96\\x82\\xdc\\x11\\x78\\xee\\xcc\\xaf\\x20\\xa5\\xac\\xf1\\xfb\\x9b\\xbc\\x0a\\xdf\\x0c\\xe0\\x8e\\x10\\xc1\\x1e\\x35\\x64\\xa3\\x1b\\x04\\xa6\\xcc\\x7b\\x15\\xe0\\x14\\x80\\x9b\\x8a\\xda\\x92\\xd4\\xa9\\xff\\xde\\x4b\\xad\\x6e\\x66\\x3b\\x53\\x0c\\xe0\\x3a\\x02\\xce\\x74\\x6d\\xb5\\x02\\xb7\\x00\\x5f\\x0b\\x2f\\x28\\x5e\\x53\\x6f\\x6e\\x57\\x41\\xf4\\x2c\\x38\\x9d\\xb6\\x5b\\x56\\x6c\\x59\\x0a\\x0e\\x12\\x69\\xb5\\x26\\x02\\x84\\x75\\x01\\x92\\x6e\\xfb\\x59\\x32\\xe2\\x62\\x11\\xa0\\x91\\x2e\\x8a\\x72\\xb7\\x59\\x14\\x99\\x15\\x30\\x96\\x84\\xe5\\x5d\\xf8\\x65\\xcd\\x9c\\x12\\x78\\x41\\x2b\\x38\\x5c\\xe1\\x13\\xb7\\x39\\x8f\\x5a\\x53\\x92\\xd8\\x4f\\x59\\x44\\x49\\x48\\xa4\\x9f\\x16\\xfe\\x09\\x46\\xa3\\x66\\x3e\\xd9\\x91\\x60\\x3b\\x03\\x8a\\xf4\\x20\\xc1\\x34\\x8d\\x7e\\x84\\xff\\x38\\x20\\xd1\\xac\\x17\\x62\\x0a\\x9d\\xe6\\x55\\x14\\x0c\\x73\\xd9\\x66\\xb2\\xdb\\x72\\xa6\\x5c\\x3f\\x1b\\xa5\\x9f\\x0d\\xd5\\x5a\\x14\\x6b\\x17\\x5f\\x44\\xab\\x06\\x4e\\x30\\xf3\\xc7\\x91\\xdc\\xd0\\x1a\\x59\\x84\\x1d\\xa4\\x6a\\xe3\\x04\\x4f\\x93\\xcf\\x1d\\x86\\x3f\\x1c\\xe7\\x9e\\xe3\\x1c\\x0e\\x1d\\x24\\x2a\\x07\\x47\\x1f\\xac\\x8d\\x97\\xd1\\x9d\\xd7\\x80\\x6d\\xfc\\x7d\\xd6\\x03\\x70\\xbb\\xd8\\xf1\\xcc\\xfc\\x7c\\xad\\x9f\\xa0\\x7b\\xa1\\x3c\\xf4\\xae\\x76\\x6e\\x49\\xf7\\x05\\xad\\xc8\\x6f\\xf4\\x1f\\xae\\x2a\\x26\\xe2\\x52\\xd5\\x56\\xe2\\x17\\x87\\xbf\\xcd\\xc2\\x24\\x63\\x9f\\x79\\x2d\\x88\\x0d\\x71\\xa7\\xb3\\x68\\x4f\\x8d\\x43\\x7a\\xe8\\x40\\xf8\\x6d\\xd2\\x39\\xf2\\xc4\\xaa\\xf5\\x36\\x06\\x7b\\x07\\x1f\\x92\\x3a\\xdf\\xc4\\x3b\\x0f\\xed\\x09\\x12\\xca\\xbc\\xd2\\x45\\x3d\\x02\\x08\\x9e\\x9b\\x3f\\x94\\x65\\x4d\\x3b\\x21\\x05\\x75\\x63\\x54\\xbd\\x78\\x76\\x0e\\x89\\x7d\\xd6\\x45\\xf2\\x49\\x9f\\xd3\\xa0\\x28\\x06\\xfe\\x25\\x2e\\x36\\xdb\\x8c\\x2a\\x0f\\x60\\x2f\\x16\\xe2\\xa1\\x66\\x46\\x55\\xb3\\xa9\\xa1\\x88\\xe1\\x3c\\xbd\\xfe\\x69\\xde\\x67\\x4a\\xbb\\xbf\\x51\\x94\\x01\\x31\\x89\\x63\\x11\\x78\\xc6\\xc8\\x5e\\xd2\\xb3\\x0d\\x8e\\xc3\\xc6\\xd1\\x1e\\x90\\x53\\x1c\\xdc\\x4f\\xe1\\x3f\\xb8\\x85\\xc3\\xe5\\x1c\\x21\\xdf\\x69\\xee\\x5e\\x12\\xaf\\x4d\\x48\\xda\\xb5\\xc4\\x83\\x47\\xbf\\xa2\\xc8\\xc0\\xcc\\x4c\\x4b\\x8b\\xd0\\x5a\\x35\\xc0\\x3d\\x08\\x4b\\x0a\\x31\\x07\\x41\\x83\\x70\\x3c\\x1e\\x4f\\x0f\\x89\\x9a\\xa0\\xfd\\xc2\\x2f\\x71\\xbc\\x26\\x16\\xab\\x77\\xf4\\x06\\x3a\\x49\\x90\\x73\\x5d\\x11\\xe2\\xb7\\x4d\\x7c\\xb7\\x69\\x7a\\x98\\x92\\xbf\\xce\\xe9\\xf2\\x78\\xc1\\x0d\\x8e\\x6e\\x3f\\x1c\\x43\\xb2\\xae\\xb4\\x02\\x57\\x90\\x54\\xf0\\xb2\\x1d\\xe7\\xe7\\xc1\\x12\\x3d\\xc0\\xb6\\x19\\x43\\x00\\xc8\\xcc\\xbf\\x2b\\xbc\\x91\\x87\\x87\\xe0\\x19\\x52\\xb6\\xa1\\x08\\xcf\\x8b\\x29\\x38\\xbe\\xd0\\x1c\\xf5\\xde\\x2e\\x44\\x1d\\xee\\x59\\x0e\\x0a\\x27\\x6a\\xe4\\xb0\\x67\\x57\\x15\\x91\\xc9\\x1d\\x35\\x98\\xfd\\xa6\\x4d\\xa1\\xde\\x45\\xaa\\x71\\x21\\x70\\xdb\\x18\\xc3\\xa0\\x5e\\x97\\x5d\\xdb\\xbb\\x5d\\x7d\\xd6\\xbb\\x5e\\xdd\\x09\\xe1\\x73\\x1a\\xe7\\xe5\\x85\\xd3\\xc6\\x6b\\x63\\xdf\\x12\\x9a\\xa5\\x9b\\xd4\\x88\\xb9\\xf3\\x89\\xeb\\xa6\\x43\\x20\\xc3\\x82\\xa1\\x5b\\x95\\xb6\\x3d\\x59\\x1c\\x56\\x31\\x1e\\x37\\xf1\\x88\\x4f\\xa5\\x58\\x58\\x79\\xaa\\x95\\xf7\\x3c\\xd7\\x22\\x36\\xb1\\xb1\\x00\\xc4\\xf5\\x63\\x25\\x52\\x26\\x72\\x45\\x41\\x24\\x20\\xf4\\xf5\\x49\\xf4\\x1c\\xee\\x99\\x5e\\x11\\x98\\xb7\\xc7\\xe2\\xd2\\x2a\\xdc\\x5b\\x96\\x72\\x6f\\x03\\x10\\x17\\xbb\\xe8\\xd3\\xff\\xf9\\xf4\\x58\\x18\\x81\\xe0\\x73\\xe0\\x4c\\xf2\\x65\\x83\\x61\\x90\\x24\\x89\\x2b\\xf0\\xd4\\xf0\\x45\\x48\\x27\\xec\\x82\\x97\\x26\\xbc\\xbf\\xff\\x23\\x4a\\xbe\\x3e\\xe1\\x1f\\x66\\x08\\xe0\\x53\\xb8\\x3f\\xf0\\x70\\x9b\\x91\\x34\\xff\\xf4\\xe8\\x91\\xb5\\x53\\x75\\xf7\\x69\\xcb\\x90\\xaf\\xff\\x25\\x9d\\x68\\xf9\\xc9\\xcb\\x56\\x2d\\x61\\x96\\xa1\\x50\\xe4\\x90\\xcf\\xca\\x65\\x1c\\xce\\x1a\\x70\\x5a\\x9f\\xb6\\x4d\\xf4\\x10\\x8f\\xfd\\xfa\\x7d\\x20\\xea\\x55\\x5c\\x21\\xd7\\xa7\\x83\\xc0\\x24\\x2f\\x61\\xca\\xab\\xa0\\xed\\x4e\\x22\\xcd\\x6c\\x56\\x5c\\x7a\\xe3\\x85\\x25\\x90\\x16\\xaa\\x88\\x0d\\xd1\\xe0\\xab\\x61\\xd0\\x6f\\xdb\\xa4\\x69\\x80\\xcd\\xa6\\x48\\xd2\\xe5\\x2e\\x02\\x47\\x13\\x0c\\x08\\x71\\xbd\\x15\\xef\\xde\\x71\\x0a\\xac\\x1a\\x2f\\xc0\\x9c\\x95\\x32\\xf2\\xb0\\xb9\\xfc\\x2e\\x41\\x62\\xa8\\x70\\x71\\xe9\\x5f\\x64\\x82\\x2e\\xdd\\xbb\\x24\\x26\\x6e\\x56\\x73\\xd8\\xab\\xbc\\x60\\x1f\\x40\\x68\\x06\\xe7\\x6f\\x8a\\xcb\\xd2\\xc9\\xbd\\xc6\\x7c\\x93\\x0b\\x61\\x5c\\x06\\x8b\\xe7\\x32\\xf2\\x49\\xbb\\x54\\x2e\\xaf\\x92\\x23\\xf3\\x7d\\xa1\\x78\\xf9\\xe5\\xc4\\x94\\x6d\\x82\\x08\\xe9\\x68\\x8c\\xac\\x70\\x6c\\x0c\\xcb\\xb0\\x28\\x80\\xd2\\xba\\xae\\x43\\x9c\\x80\\x5a\\xfc\\xce\\xf9\\xb7\\xfd\\x2c\\xac\\xc7\\x82\\x26\\x74\\xd3\\x6b\\x1b\\x09\\xa4\\x48\\xe8\\x39\\x71\\x03\\x9c\\x69\\x76\\x9f\\x93\\x10\\x75\\x87\\x92\\xe1\\x66\\x6a\\x57\\x69\\xf6\\xca\\x73\\x77\\x2f\\xfa\\x40\\x03\\x2b\\xe8\\x40\\x7b\\x05\\xa7\\x28\\x22\\xf0\\xd1\\xdd\\x44\\xcf\\x4a\\x1d\\x67\\xa4\\xe4\\x36\\xff\\x90\\x1c\\x7a\\x99\\x71\\x6f\\xa9\\x20\\x90\\x9d\\x69\\x92\\x28\\xab\\x5d\\xd6\\x73\\x1c\\xed\\x35\\x1e\\x20\\x48\\x2e\\xe5\\x8b\\x46\\x05\\x67\\x23\\xb6\\xe4\\xd6\\x07\\x95\\xcc\\x78\\x6c\\xc8\\xf1\\x34\\x61\\xc9\\xf5\\x7b\\x37\\x24\\xaf\\xfe\\xc9\\xcf\\x2d\\x1c\\x34\\x8a\\x99\\x69\\xa2\\xb0\\x5d\\x13\\x75\\xb9\\x72\\x67\\xc1\\xec\\x1e\\x8a\\x41\\x9d\\x52\\x11\\x2d\\xf8\\x31\\x50\\x4a\\xb6\\x5b\\x8b\\x8f\\xc1\\x1c\\x5c\\x3e\\xaa\\x64\\x62\\x94\\x43\\xd0\\xd5\\x92\\x25\\x32\\x71\\x79\\xc9\\x3a\\x8e\\x16\\x94\\xef\\x63\\xa1\\x64\\x0a\\x88\\xcf\\x46\\x12\\x3b\\x12\\x89\\x8d\\xbe\\xb1\\x28\\xaf\\x95\\x8f\\xc3\\x11\\xa3\\x75\\x16\\xa3\\x9b\\xe2\\x82\\xaa\\xb3\\x6a\\x47\\x7d\\x7c\\x90\\xc3\\x38\\xcf\\xd6\\xc6\\xa1\\x20\\xa3\\xdb\\xdd\\xdf\\xbc\\x95\\x81\\x13\\x65\\x8f\\x4e\\x23\\xf7\\xb1\\x8c\\x3f\\x38\\x6b\\xea\\xbd\\xf5\\xa8\\xa8\\xff\\x7e\\xbb\\x4d\\xe0\\x8a\\x4d\\x43\\xe6\\x5b\\x33\\xa4\\x40\\xc3\\x7b\\x60\\xd0\\x33\\x33\\x9f\\xd8\\xfb\\xae\\x0c\\xea\\xcd\\x90\\xbb\\x4f\\x9c\\x59\\x94\\x7a\\x62\\xaf\\x7f\\x94\\x5c\\xa0\\x75\\x2e\\x0f\\x25\\xe4\\x59\\x85\\xb0\\xd2\\xda\\x53\\xc7\\xae\\x2f\\xab\\x39\\x86\\xa0\\x50\\x01\\x4c\\x48\\x13\\x49\\x93\\xe0\\x48\\xc4\\x6f\\xf3\\x36\\x12\\xdb\\x89\\x59\\xf3\\x6d\\x8e\\xd7\\xec\\x00\\xc1\\xd3\\xaf\\x4f\\x1a\\xde\\x4f\\x90\\x1a\\xe1\\x40\\x3a\\x16\\x5e\\x1d\\xe9\\x17\\x4b\\x0a\\xae\\xf5\\xe6\\x45\\x85\\xfe\\x28\\x91\\xe0\\xf3\\xf7\\x22\\xcd\\xb9\\x72\\x85\\x79\\x93\\xeb\\xd2\\xc4\\xd0\\x6b\\x40\\x73\\x65\\x2a\\xd3\\xab\\x54\\x8b\\x3f\\x2f\\x8f\\x7a\\xd4\\xe9\\x27\\x30\\x65\\xf7\\x08\\x86\\x4b\\x6a\\x41\\x5b\\x09\\xb8\\x59\\x86\\xd9\\x03\\x36\\xc4\\x16\\x35\\x38\\xe0\\xd4\\xc4\\xb2\\x65\\xf4\\x22\\x85\\xb4\\x12\\xd8\\x87\\x51\\x12\\x11\\x99\\x02\\x5a\\x9d\\x4b\\xe2\\x90\\x89\\xd2\\xe3\\x36\\xcc\\x11\\x25\\x82\\x76\\xeb\\x55\\x05\\xf7\\x20\\xf4\\xda\\x4f\\x7f\\x7a\\x65\\x62\\x50\\xd2\\xef\\xb2\\x90\\x62\\xbb\\xf6\\x34\\x09\\x4e\\x56\\x91\\x85\\x76\\x68\\x40\\x37\\x9c\\x44\\x8f\\xf9\\x60\\xcd\\x64\\x90\\x31\\xa7\\x21\\xcb\\x7a\\x32\\xe6\\x2d\\x64\\x42\\x97\\x76\\x30\\x01\\x36\\x8e\\x42\\x65\\x48\\x89\\xd6\\x04\\xfa\\x21\\xa2\\xcb\\x25\\xa4\\x10\\x2c\\x72\\x99\\xc2\\x91\\xb3\\x66\\xca\\xfd\\xe1\\xd0\\x4c\\x7e\\xeb\\x59\\x71\\x86\\x66\\xd1\\xd4\\x39\\x61\\x46\\x98\\x71\\x06\\xe0\\x91\\x16\\xb3\\xbb\\xcb\\x8f\\x7e\\x88\\x97\\xe0\\x94\\x54\\x9c\\x2f\\x94\\x93\\x09\\xcc\\x43\\xed\\x4d\\x9a\\xf0\\x2e\\x7b\\x3b\\xb1\\x53\\xf4\\x8b\\x22\\x4d\\x6f\\xf0\\xe9\\xa1\\x7c\\x5f\\xe2\\xe9\\xa4\\xbc\\xc8\\x1f\\xe0\\xe0\\x54\\x29\\xd6\\xa4\\xa7\\xbb\\x61\\xb9\\xc7\\x30\\x0e\\x4a\\x78\\xde\\x01\\xaf\\x29\\x65\\xd9\\x0e\\xc6\\xff\\xb2\\xce\\x78\\x87\\x82\\x7f\\x78\\x19\\xed\\x8a\\x3a\\x7a\\x97\\x17\\x97\\x5d\\x38\\x2a\\x84\\xb1\\x04\\x8f\\x5a\\x0c\\xae\\x64\\xc8\\x94\\xe5\\x58\\xd6\\xfa\\xc7\\xcc\\xe7\\xf6\\x55\\x7b\\x99\\x66\\x95\\x2d\\x7e\\x4b\\xfe\\xd9\\xb7\\xc1\\x36\\x61\\x5d\\x30\\x74\\x1e\\xb3\\xd5\\xd9\\xa9\\x6b\\x06\\xf4\\xd4\\x00\\x05\\xbe\\x55\\x4b\\x7c\\x4d\\x3a\\x76\\x28\\x17\\x58\\x73\\x36\\x78\\xaa\\x5e\\x05\\x42\\x65\\xa0\\xb3\\x75\\xcb\\x9b\\x16\\xab\\xd2\\xf4\\x8b\\xf5\\x0a\\x9c\\x3a\\x02\\xac\\x44\\x33\\xf8\\xef\\x00\\xfa\\xc6\\x70\\x18\\xd8\\x60\\x8a\\xd1\\xc0\\x20\\xb1\\x41\\x38\\xe0\\x4a\\xdc\\xf2\\x91\\x4d\\xdb\\x87\\x6c\\xc2\\x94\\x6d\\xf7\\x35\\xaa\\xaa\\xa8\\x48\\xa6\\xe5\\xc7\\x6c\\x52\\x76\\xca\\xb9\\xa0\\x36\\x06\\xcb\\x9c\\xd0\\x8f\\x0b\\xd3\\x3f\\xe9\\x4c\\x8b\\xc3\\x73\\x20\\x9e\\x43\\x66\\x2d\\x70\\x47\\xb7\\xa1\\x7f\\xcd\\x94\\xec\\x23\\xd2\\x42\\x02\\x4b\\xf1\\x50\\x0e\\xa4\\x9d\\xe3\\x5b\\x8c\\xbc\\x5c\\xaf\\xd6\\xa5\\x63\\x0d\\x03\\xbd\\x8a\\xe9\\xb6\\xcd\\xac\\x05\\x51\\xfb\\xe9\\x06\\x82\\xdd\\xca\\x4d\\x51\\x54\\x6b\\x98\\x79\\x17\\x70\\x3e\\x02\\x7e\\x6e\\x5e\\x63\\xad\\x9e\\x68\\xe1\\xd6\\x48\\xb6\\x13\\x0e\\xc1\\xb2\\x22\\x7c\\xb2\\xe6\\x94\\x6f\\xaa\\xd9\\xce\\x1e\\x72\\x3c\\x2a\\x70\\xd1\\x10\\x81\\x3c\\x6a\\xa2\\xc3\\x92\\xee\\xe6\\x71\\x35\\x43\\xcc\\x37\\xd2\\x15\\xad\\xc1\\x56\\x9b\\xb3\\xd7\\x81\\xd7\\xb6\\x14\\x59\\x13\\xf8\\x97\\xb4\\x84\\x7e\\x68\\x22\\x08\\x2f\\xd7\\x29\\x17\\x32\\x6c\\xd5\\xb0\\x82\\x2b\\xd5\\x03\\x72\\x72\\xc2\\xba\\xde\\x66\\x99\\x15\\xd7\\x88\\x34\\x0c\\xe8\\x10\\xc4\\x47\\x73\\x8e\\xb1\\x4c\\x66\\x7d\\x95\\x0a\\x21\\x4d\\x51\\xdc\\x70\\x16\\xb1\\xc2\\x38\\xef\\x63\\x19\\xfb\\x0d\\x9f\\x38\\x35\\x7f\\x52\\x26\\xaf\\xfa\\x8b\\x03\\x98\\x24\\x85\\x5c\\xcd\\x3a\\xf8\\x35\\x4d\\x59\\x1b\\x25\\x8e\\x69\\x66\\xed\\xa3\\x11\\x4e\\xe2\\x5a\\x3e\\x41\\x83\\xd6\\x9e\\xbd\\xe9\\x24\\xaf\\x37\\xe6\\x8e\\x73\\xc2\\x3c\\x10\\xd6\\x4f\\xa9\\xf7\\x9a\\xec\\x94\\x26\\x29\\x47\\x59\\xe3\\x31\\x9c\\xbc\\x7f\\xd9\\xfc\\x59\\xa4\\xc3\\xed\\xbc\\xcc\\xd7\\xbf\\xb5\\x28\\xb9\\x69\\x36\\x18\\xfa\\x47\\x9d\\x72\\x59\\xc8\\x67\\xeb\\x60\\xd1\\x84\\x61\\x80\\x8c\\x1d\\xc1\\x3e\\x83\\x18\\xa0\\x3b\\x20\\x56\\x3d\\x63\\x94\\x24\\x3b\\x99\\xa6\\x9a\\x73\\x59\\x57\\x38\\x4f\\xf4\\x91\\x41\\xe0\\xd8\\xd1\\x2a\\x2c\\x44\\xec\\x30\\xa1\\x02\\xd6\\x0f\\xff\\x4e\\x6a\\x99\\xd4\\x2a\\xe6\\xbe\\x19\\xe5\\xc0\\x2d\\x98\\x68\\xfa\\x34\\x56\\x27\\x3d\\x00\\xd3\\x4a\\x75\\x8e\\xef\\x86\\x7d\\xf3\\xac\\x7d\\x2d\\x4d\\x20\\xfe\\x56\\xf0\\xf1\\xcc\\xef\\x4c\\x6e\\x5f\\xb1\\x53\\xcd\\x8d\\xeb\\xa1\\xd1\\x5f\\x6e\\x47\\xf4\\x33\\xf8\\xd8\\xf1\\x46\\xff\\x75\\x87\\x9c\\x1a\\xa1\\x8e\\xc5\\xfd\\xbc\\x01\\xd3\\x9c\\xa5\\x56\\x4f\\xc2\\xd9\\xad\\xf2\\x6b\\xec\\x43\\x8d\\xd6\\x61\\xea\\xe1\\xd1\\xfe\\xcb\\x89\\xa3\\x1d\\x1d\\xdd\\x19\\x23\\xa7\\x87\\x20\\xfa\\x51\\x47\\x35\\x3b\\x8d\\x5c\\xca\\x59\\x6f\\xc4\\x77\\x4f\\x2a\\xfb\\xe5\\x8f\\x3a\\x8a\\x81\\xc2\\x1a\\x12\\xa4\\xdf\\x05\\xd5\\x4e\\x4f\\x03\\xc5\\xd0\\x1c\\xed\\xab\\xa4\\xb6\\x99\\xde\\x99\\xba\\x68\\xf6\\x34\\xeb\\xa0\\x87\\xa5\\x1a\\x61\\x0f\\x39\\x9d\\xb8\\xe9\\xe4\\xa9\\xe2\\x22\\xdc\\xa0\\xbb\\x25\\xda\\x64\\x68\\x40\\x00\\x90\\x35\\xf4\\xbf\\xa8\\xf0\\x76\\x6b\\x3c\\x6a\\xb7\\x75\\x5a\\x52\\x95\\xad\\xd5\\xe8\\xa9\\x3e\\xa0\\x5d\\x60\\x33\\xb8\\x7a\\x63\\xce\\x18\\x87\\xfa\\xda\\xcc\\xf7\\x6e\\x46\\x53\\xd8\\xb4\\xfe\\x0b\\x52\\x3f\\xb7\\xfb\\x35\\x40\\xfa\\x52\\xe5\\x89\\xfb\\xaa\\xbd\\xb3\\xd4\\x6c\\xda\\x7d\\x08\\x3f\\x8b\\x4c\\xcc\\x93\\x61\\xb0\\x22\\xcb\\xea\\xed\\x4c\\xfc\\x0a\\xe5\\x48\\x4c\\xe6\\x2e\\xa0\\x0d\\xd9\\xce\\x34\\x81\\xca\\x77\\x73\\x20\\x3a\\xe0\\xcc\\x7a\\x09\\x44\\x25\\x5f\\xee\\xb4\\x91\\x50\\x55\\x07\\x2a\\xaf\\x9d\\xf3\\xaa\\x08\\xd9\\xaa\\xaa\\xdd\\x21\\xed\\xee\\xee\\xc6\\xa6\\xf4\\xc0\\xec\\xc2\\x5a\\x93\\x72\\xa6\\xc1\\xb3\\x9d\\x17\\x42\\xf4\\x6c\\xb7\\x8a\\x66\\xb8\\x96\\xdd\\xc2\\xe6\\x54\\xe8\\xbc\\x5b\\x4d\\x78\\x74\\x87\\x30\\x61\\xae\\x70\\x6b\\x8e\\x70\\x99\\x92\\xdb\\x74\\x76\\x2a\\x31\\x8b\\xeb\\x5f\\x9a\\xb4\\xf4\\x4a\\x7c\\x39\\x7f\\x06\\x76\\x23\\x68\\xc2\\xbc\\xef\\xed\\xd4\\x6a\\xb1\\x39\\xdd\\x83\\x2f\\x5c\\x7d\\x67\\x36\\x6a\\x4d\\xe3\\xc8\\x27\\x77\\x71\\x87\\xcc\\x90\\xbb\\x26\\xaa\\x1e\\x70\\x92\\x24\\x33\\xaf\\x28\\x7d\\x8d\\x5b\\x69\\xf5\\x25\\x69\\x48\\xa3\\x7b\\xed\\xe2\\x9a\\xa5\\x20\\x73\\xc2\\xb8\\x03\\xc2\\x7a\\xd7\\x2b\\xc1\\x8a\\x94\\xb9\\x63\\x40\\x51\\x66\\x7a\\x52\\x99\\x52\\xb8\\x3e\\xb9\\xe1\\x01\\xc1\\x07\\x19\\x5c\\xc6\\x13\\x0f\\x27\\x74\\x34\\xf0\\xbe\\xa5\\x84\\xaf\\x87\\x81\\x53\\x8b\\xd3\\x27\\xdc\\x74\\x1d\\x9f\\xb6\\x4a\\x45\\x9d\\x44\\xdb\\x92\\xd6\\x49\\xd1\\xc5\\xd9\\x07\\x97\\xd0\\x8b\\x54\\xdc\\x25\\x3f\\x6f\\xa2\\xaf\\xc0\\xd6\\x4c\\x08\\x4b\\xda\\x42\\xbb\\xb2\\x0b\\x74\\xcf\\x80\\x1e\\xed\\x06\\x5e\\xd3\\x44\\xbf\\x86\\xd7\\xdf\\x69\\x0f\\x27\\xbe\\xac\\x58\\x3d\\xf8\\x58\\x45\\xc8\\x69\\xff\\xf1\\x56\\x48\\x31\\x8f\\x7e\\x60\\x97\\x69\\xfe\\xe0\\x7b\\x70\\x88\\x86\\x8a\\x31\\x2e\\x6a\\x6e\\x44\\x01\\xcf\\xad\\xa3\\x06\\xf6\\x23\\x30\\x36\\xc0\\xbc\\x52\\xef\\x9c\\xd8\\x73\\x45\\x01\\xbe\\xef\\xd1\\xf7\\x06\\x60\\xbc\\x6c\\xca\\x09\\xf9\\xf0\\xa1\\xee\\x7b\\xd1\\xe7\\xa8\\x7c\\x93\\xbf\\x2d\\xd5\\x35\\x28\\x73\\x1a\\x5b\\x6b\\xc1\\x4f\\x22\\xb3\\x2a\\xd8\\xb2\\xe1\\xcc\\xda\\xc2\\x86\\x50\\x5b\\x62\\x15\\x4b\\xfd\\x90\\xed\\xda\\x05\\xca\\xc8\\x78\\x83\\xd7\\x5d\\xed\\xe4\\x89\\x92\\x40\\xda\\x44\\xe5\\x03\\x12\\x66\\x8b\\x68\\x42\\x54\\x01\\x51\\x2c\\xbd\\x7a\\x46\\x6c\\x86\\x97\\x95\\x90\\xe0\\x8c\\x49\\x0c\\x22\\xf4\\x6e\\x74\\xd3\\x28\\x89\\x58\\x83\\x7a\\x0e\\x22\\x12\\x7b\\xb8\\xcd\\x35\\x4a\\x69\\x1c\\x42\\x43\\x0e\\xa6\\x7b\\xbd\\xf5\\x52\\xea\\x20\\xc6\\x38\\xd7\\x5d\\x88\\x5d\\xcf\\xf3\\xc3\\xea\\xa6\\x1c\\x40\\xf8\\x14\\x86\\xee\\x02\\x52\\xfe\\xb0\\x6e\\xcb\\xee\\x61\\x87\\x32\\x7b\\xfb\\x7d\\xd9\\x3b\\xe3\\xd1\\xd0\\xea\\x8e\\xa8\\xe6\\xb1\\x1c\\x70\\xc3\\x75\\x7c\\x6e\\x8d\\xeb\\x54\\x99\\xd4\\xb6\\x04\\x1d\\x08\\xd6\\x82\\xa8\\x09\\x27\\x96\\x4d\\x5b\\x0b\\x6d\\xde\\x04\\x79\\x22\\xb6\\x7e\\xdb\\x87\\xfd\\x41\\xd2\\x33\\xea\\xfd\\x83\\x6a\\x98\\x77\\x2d\\xff\\x16\\xb7\\xf2\\xc7\\x70\\xa4\\xe4\\xf5\\x23\\x6f\\xd7\\x0a\\xaf\\x90\\x9c\\x06\\x71\\x23\\x5b\\x9d\\x46\\xf8\\x9c\\xfc\\x39\\xa6\\x2c\\xf0\\x8f\\xda\\xb0\\xc1\\xd4\\xbc\\x30\\xd3\\xb8\\x5c\\xf7\\x18\\x53\\x8f\\xb3\\x5e\\x58\\x94\\x0d\\xb9\\x4e\\x40\\xd9\\x39\\xb3\\xd4\\x46\\x94\\x63\\x3c\\xdd\\xad\\x81\\xd4\\x7b\\x55\\x6e\\xc2\\xa8\\x2a\\xdb\\xf7\\x89\\x72\\x6d\\x7c\\x95\\xd3\\x06\\x58\\xd9\\x19\\x61\\xde\\x05\\xea\\x7d\\xe7\\x1b\\x9c\\x03\\x86\\x76\\x3e\\xdc\\xca\\xda\\xe0\\x9b\\xb1\\x15\\xc5\\x1b\\x3f\\x70\\x0d\\xc4\\x94\\x4d\\x47\\xe1\\xd3\\x83\\x1e\\x0c\\xb7\\xb7\\x0d\\x7a\\xa5\\xad\\xc4\\x70\\xb4\\x22\\xce\\x9c\\xba\\xa3\\x1a\\x8f\\xaa\\xe1\\x00\\x05\\x37\\x09\\x47\\xe4\\x86\\x0d\\xb8\\x54\\xab\\xb5\\x60\\x8e\\x36\\x7a\\x63\\x9e\\x6e\\xd2\\x8c\\x60\\x80\\x7e\\x27\\x92\\x00\\xe8\\x3f\\xb1\\x00\\xb3\\xc1\\x57\\xdd\\xab\\x1d\\xac\\xda\\x02\\x5b\\x84\\xd4\\x12\\x97\\x78\\x6c\\x90\\x15\\xc9\\x7b\\x8b\\xc7\\x0a\\x5c\\xc6\\xba\\x78\\xc4\\x63\\x69\\x66\\x1b\\x89\\xb6\\x13\\xe5\\xc9\\x4a\\x8f\\x63\\xfc\\x3d\\x4e\\x92\\xce\\xfd\\x30\\x3c\\x20\\x6d\\x35\\x69\\x71\\x47\\xec\\x38\\x2a\\xeb\\x2d\\xa8\\xdb\\x20\\xa0\\x4f\\xf1\\xc5\\x22\\xb8\\x43\\xc3\\xed\\x81\\x4f\\x41\\x34\\x36\\xb8\\x9f\\xa2\\x62\\xce\\xea\\x6d\\xf5\\xa9\\x04\\x22\\x42\\x7a\\x1a\\x44\\xea\\xc4\\xaf\\xd7\\x7d\\x70\\x16\\x77\\x91\\x26\\x35\\xc9\\x6c\\x70\\x8d\\xb1\\xdf\\x92\\x3a\\x72\\x54\\x89\\x64\\x05\\xf0\\x1f\\xf4\\x93\\xc1\\x30\\x1f\\xbf\\x82\\xdf\\xf6\\xee\\x17\\x61\\xd4\\xe0\\xdc\\x06\\x1c\\xc6\\x89\\xc6\\xb9\\x8d\\xa6\\xde\\x05\\xb9\\xf3\\xee\\x55\\xba\\x01\\x99\\x68\\x02\\xb0\\x4e\\xf8\\x41\\x99\\x58\\x06\\xda\\xe4\\x08\\x81\\xe0\\x45\\x51\\xd7\\x0e\\x85\\x1d\\xe8\\x6a\\x27\\x73\\x61\\x76\\x1c\\x40\\xd6\\x64\\x98\\x2e\\x00\\xa0\\xdb\\x9f\\xc3\\x03\\x5c\\x86\\x76\\x8c\\x8f\\x72\\x89\\xe4\\x32\\x82\\xa1\\x4e\\xea\\x36\\xe5\\xb1\\x35\\x12\\x2a\\x7b\\x18\\x44\\x43\\xe0\\x60\\x88\\xc6\\xe9\\xe2\\xb6\\x08\\x71\\xd1\\x93\\x58\\x10\\x66\\x3c\\x88\\xba\\x7d\\x32\\xbb\\xfe\\xf3\\xc0\\xfe\\xb5\\xc8\\x41\\xa4\\x94\\xe6\\xf6\\x68\\x3f\\x49\\xb4\\x07\\xae\\x3d\\xcc\\x08\\x09\\x1e\\xa9\\x7f\\x68\\xf5\\xfd\\x03\\xb9\\x8d\\x6d\\x09\\xb4\\x7d\\xa4\\xaf\\xd3\\xd1\\x40\\x3b\\x58\\xeb\\xf9\\x28\\xfa\\xa2\\x30\\x4f\\x49\\xc9\\x99\\xa4\\x73\\xd1\\xb8\\xf0\\x9d\\x49\\xbe\\x7d\\x98\\x8c\\x46\\x3d\\x34\\x3d\\x2c\\x46\\xb6\\xa8\\x20\\x1e\\x7a\\x91\\x4a\\xc3\\xa9\\xa7\\x1e\\x3e\\x84\\x27\\x1d\\x6c\\x4e\\x1e\\x08\\x92\\xf1\\xb9\\x77\\xba\\xe5\\xf0\\x53\\x52\\xbe\\xd7\\x26\\x72\\x80\\xf1\\x15\\xa3\\xdb\\x4b\\x9b\\x34\\xaf\\xe1\\xe4\\xcc\\x5e\\xba\\x2e\\x6a\\xe6\\x2a\\x4b\\xc8\\xce\\x55\\xc4\\xc7\\xf9\\x3b\\x57\\x59\\x59\\xe7\\x9e\\x96\\x9b\\xc2\\x57\\x5a\\xf1\\x3d\\xc6\\x8b\\x36\\xc9\\xbd\\x15\\xaa\\x75\\xcd\\x7c\\xe5\\x4b\\x96\\x7a\\x4a\\x31\\xf3\\xa8\\x9f\\xf6\\x6a\\xed\\x2a\\xdc\\x51\\xd2\\x91\\xa4\\xa5\\x8b\\x4a\\x4c\\xa2\\xbe\\xa2\\xb6\\x0e\\xb2\\x97\\x41\\xf7\\xd8\\x4b\\x38\\x99\\xf6\\x02\\xe8\\x1a\\x07\\x22\\x20\\xdf\\x5e\\x04\\xc4\\xb7\\x25\\x96\\xee\\x74\\x42\\x74\\x96\\xc9\\xae\\x74\\x11\\x29\\x3b\\xd2\\xd1\\x56\\x76\\xa3\\xbd\\x54\\x74\\xa2\\xbd\\x4c\\x75\\xa1\\xa3\\x25\\x5e\\x84\\x1c\\x61\\x96\\xf4\\xae\\x73\\x63\\x8a\\x6c\\x11\\xc9\\xa6\\xee\\x9c\\x32\\xed\\xd2\\xaf\\xf4\\x8e\\xab\\xfc\\xf3\\x81\\x8a\\x87\\x2d\\x5f\\x3d\\xcc\\x73\\x71\\x89\\x34\\x58\\x87\\x6d\\x9d\\xe3\\x40\\x29\\x5a\\xf2\\x0f\\xe0\\x1a\\x7d\\x56\\x0b\\x33\\xa1\\x25\\x5a\\x45\\x08\\xdb\\x8d\\xcf\\x2d\\xa3\\x22\\x0c\\x4c\\xdd\\xab\\x35\\x63\\x87\\x1d\\x7c\\x20\\x46\\xbe\\xcb\\xc8\\x46\\xcd\\x0b\\xc8\\x42\\x4f\\xd1\\xf8\\xe9\\xb5\\xac\\xab\\xd8\\xd6\\x29\\x4e\\x5e\\x05\\xbf\\x87\\xef\\x1c\\x07\\x63\\xf0\\x33\\xba\\x93\\x06\\x88\\x1f\\xe8\\xac\\xb7\\xe7\\x4f\\x0e\\xdc\\x61\\x1e\\xde\\x82\\x3b\\xce\\x6c\\x68\\xba\\x95\\x9c\\x3c\\x7f\\x2e\\x2d\\x56\\x6e\\xeb\\xfc\\x30\\xff\\x29\\xfa\\x5f\\xff\\xff\\x17\\x5f\\x9a\\x2c\\x9e\\x46\\x9f\\x7e\\xf6\\xeb\\x83\\xcf\\x36\\x0f\\x3e\\x4b\\xce\\x3f\\xfb\\xfe\\xf4\\xb3\\x57\\xa7\\x9f\\xcd\\x4f\\x3e\\x7b\\xf9\\x4f\\xab\\xf5\\xd0\\xe7\\x23\\x2d\\x0b\\x77\\x7f\\x98\\x74\\xca\\x0c\\x8b\\xa1\\xae\\xa9\\xde\\x40\\x43\\xb2\\x45\\x0e\\xc8\\xc6\\x0e\\x4e\\xe8\\x92\\x70\\x39\\x46\\x49\\xb1\\x21\\xdc\\x2a\\x03\\x13\\x88\\xf5\\x57\\x20\\x01\\x10\\xcd\\x93\\x34\\x7e\\x27\\xf2\\x5b\\xc3\\xa7\\xe6\\xa9\\x0c\\x6e\\x5f\\xf1\\xad\\x62\\x99\\xae\\x6a\\x26\\x2d\\x9f\\x76\\x54\\xf7\\x25\\x61\\x5b\\x4d\\x8e\\xd4\\x8b\\x4f\\x20\\x0d\\xfc\\x14\\xea\\x94\\xba\\x59\\x3e\\xd5\\x78\\x08\\xe2\\x92\\xaf\\x18\\x83\\x8c\\xbe\\x0f\\x53\\xe4\\x70\\x9f\\x30\\x55\\x38\\xf9\\x1c\\xf1\\x53\\xb4\\x49\\x30\\xba\\x50\\x7c\\x34\\x1f\\x22\\x86\\xbf\\x76\\x2e\\x78\\x0d\\x69\\x8c\\x5c\\x37\\x30\\x71\\x89\\xc8\\xa6\\xa7\\xc2\\xce\\x7a\\xda\\x51\\x6d\\xe1\\x67\\x99\\x15\\x4a\\x79\\x57\\xd5\\xf0\\x15\\x84\\x5e\\x45\\x26\\xde\\xac\\x1a\\xae\\x18\\xd3\\x34\\x0b\\x02\\x28\\xde\\xe8\\xb6\\x6c\\xa4\\xc5\\x72\\x89\\x69\\x7b\\x35\\x18\\x42\\x36\\x1d\\x8b\\xa2\\x0f\\x91\\x77\\xdb\\x99\\x4d\\x81\\xf2\\x89\\xad\\x9d\\xd4\\x5e\\xc1\\xd9\\x0e\\x9a\\x30\\xd3\\x03\\xc4\\xd5\\x75\\xf2\\x3c\\x58\\x68\\x33\\x74\\x73\\xf9\\x02\\x8f\\x45\\x3d\\x17\\x05\\x3e\\x05\\xbd\\x57\\x03\\x41\\xba\\x1f\\x2a\\xc6\\x89\\x36\\xaf\\x20\\x17\\x4e\\xd6\\x62\\x6d\\x2a\\x1a\\x7e\\x75\\xa8\\x87\\x03\\x1f\\x3e\\x98\\x0f\\x04\\x85\\x60\\xda\\xa6\\x34\\x00\\x0f\\xaf\\x05\\x58\\x5e\\xa7\\x74\\x0a\\x0e\\x3e\\x9b\\xe3\\x10\\x2c\\x58\\x0f\\xf0\\x3c\\x87\\x0f\\x53\\x30\\x55\\x8c\\x86\\x20\\x82\\x6a\\xc2\\x4e\\xa5\\x56\\x34\\x0b\\x3e\\x71\\x32\\xac\\xf1\\x1d\\x7e\\xb2\\xd5\\x89\\xd7\\x05\\x4b\\xa0\\xca\\x13\\xf8\\x60\\xad\\x91\\xd5\\x10\\xf0\\x8d\\x75\\xc4\\x47\\x5b\\xad\\x35\\x57\\x21\\x08\\x8b\\xd7\\x18\\xb0\\xf3\\xbd\\xfa\\x62\\xaf\\x59\\x56\\xc5\\x8a\\x91\\x8d\\xa8\\x29\\xbf\\xd8\\x6a\\x6e\\xe5\\xa8\\x78\\xed\\x18\\x14\\x7c\\x1e\\x54\\xcd\\xd5\\x89\\xd7\\xea\\x8b\\xad\\x26\\x48\\x0a\\xc2\\xe9\\xa4\\xb0\\x5e\\x91\\xad\\x59\\xcb\\x37\\x55\\xb5\\x51\\x69\\x5e\\xee\\x3d\\xff\\x76\\xc6\\xfb\\x89\\xe2\\xc3\\x59\\x4d\\x4e\\x15\\x7d\\x25\\x3d\\x37\\x9f\\xc1\\x97\\x71\\x52\\x7a\\x46\\x9a\\xa4\\x75\\x1c\\x09\\x03\\xdb\\x39\\x0d\\xc4\\x02\\x35\\x53\\xeb\\x54\\xa3\\xb1\\x39\\x1b\\x5c\\xcd\\xb4\\xe4\\x2f\\x76\\x67\\xd0\\x00\\xca\\xdd\\xde\\x10\\xf8\\x1f\\x66\\x9c\\x5c\\x79\\x91\\x4c\\x42\\xd8\\x7d\\xd1\\x3a\\xce\\x76\\x1d\\x68\\x32\\x16\\xcc\\x0a\\xce\\xbb\\xa0\\x36\\xb3\\x20\\x24\\x9b\\x6b\\x29\\x53\\xf8\\xca\\xf3\\x18\\x00\\x25\\x2e\\x57\\x40\\x6e\\xe3\\x74\\x81\\x57\\x24\\xe0\\xa0\\xa9\\x6c\\x2e\\x15\\x89\\xf9\\x68\\x4d\\xaa\\xa7\\xdd\\x83\\x51\\xc7\\x17\\xde\\xe5\\xae\\xe8\\x07\\xd0\\xdb\\x08\\xd5\\x88\\x35\\x88\\xd4\\x5f\\x21\\xf2\\x51\\x1b\\xaa\\x59\\xf9\\x02\\x5c\\xc3\\xcf\\xfe\\x3e\\x8c\\x30\\x5d\\x6c\\x8c\\x08\\xd8\\x75\\x2d\\x98\\x83\\x4f\\x55\\xf5\\x07\\x4e\\x4b\\xf6\\x3a\\xcd\\x12\\x46\\xf3\\x36\\x7d\\x55\\xc8\\x50\\x50\\xad\\x26\\x0c\\x87\\x40\\x84\\x2e\\x71\\x1d\\xf5\\x16\\x9e\\xf1\\x1d\\x3d\\x96\\x79\\x17\\x2d\\xad\\x14\\xfa\\x6b\\xe1\\xe4\\xbe\\x7a\\x53\\xab\\x6b\\x89\\x61\\xbb\\x29\\x0e\\xd0\\x19\\x3c\\x05\\x77\\x1a\\xbd\\x60\\x64\\xbb\\x86\\x38\\x86\\x23\\xed\\xb3\\xb9\\x92\\x5b\\x86\\x87\\xcf\\x9c\\x45\\xf8\\xc7\\xe2\\x66\\x17\\xde\\x94\\x2f\\x4a\\x95\\xe0\\x40\\xe4\\xbe\\x93\\x15\\x9a\\x07\\x3f\\xb4\\x24\\x5b\\x2a\\x0f\\x1b\\xa3\\xdc\\x28\\x2e\\x69\\x5e\\xa9\\x69\\x03\\x4f\\xb6\\xc9\\x60\\x06\\xb8\\x2b\\x27\\xaf\\x78\\x81\\x38\\xdb\\xe3\\xa5\\x5e\\x1c\\x87\\xc1\\x38\\xc2\\x98\\x21\\xf6\\x0e\\xb7\\x8a\\xf7\\x97\\xbc\\x7c\\x98\\xf7\\x1f\\x96\\x2a\\x43\\x9e\\xbc\\x88\\xd5\\x88\\x00\\x93\\xf6\\x39\\xcf\\xbd\\xe5\\x45\\x3f\\xb8\\x2d\\xae\\xb5\\x5f\\x50\\x3c\\x74\\xe0\\xda\\x50\\xba\\x5a\\x2f\\x44\\x26\\x35\\xa4\\xf0\\xa4\\x8f\\x08\\x2e\\x9c\\x6b\\xc8\\xf4\\xcc\\x7e\\xed\\x9d\\xb1\\xa6\\x41\\xd0\\x02\\xdd\\x54\\x9f\\x32\\x2f\\x03\\x71\\x5a\\xf0\\xc2\\x0f\\x4e\\x4c\\xa2\\x75\\x04\\x5e\\x35\\x6c\\x07\\xe4\\x3e\\x0b\\xf3\\xde\\xd2\\x0f\\x62\\x40\\x97\\x5e\\x18\\x27\\x07\\x5d\\x92\\xc9\\x05\\x49\\x33\\x88\\x60\\x55\\x9b\\x0c\\x44\\x8b\\x7b\\x7b\\x1b\\xef\\x15\\x8d\\xee\\xe7\\x61\\x3c\\x2e\\x01\\x1d\\xd9\\x1e\\x36\\xf2\\x63\\x9d\\xef\\x8f\\x55\\xb0\\xa9\\x10\\x5f\\x93\\xc8\\x31\\x36\\x67\\x48\\xe0\\x50\\x69\\xbe\\xaf\\xd0\\xed\\x98\\x5c\\xcc\\x1f\\x46\\xe4\\xe3\\x70\\x4e\\x11\\xb8\\x4f\\xc1\\x6d\\xcc\\x56\\xd3\\x61\\x60\\x5c\\x12\\xea\\xd9\\x20\\x8f\\x59\\xfc\\x94\\x96\\x31\\x4b\\xb7\\x5c\\x39\\xb2\\xda\\x23\\xd6\\x13\\xd9\\x23\\x5d\\xe1\\xef\\x9d\\xab\\xba\\xd6\\x20\\xab\\xb9\\xe0\\x68\\xed\\xb6\\xc5\\xcd\\xb8\\x5c\\x87\\xc6\\x3c\\x5e\\x77\\x1d\\xa3\\x26\\x06\\xd2\\x06\\x3e\\xb5\\xc7\\xf9\\xca\\x11\\x38\\x6c\\x5c\\x53\\xe9\\x8a\\x4a\\xb4\\x1a\\x42\\xa8\\xd7\\x9d\\x05\\x91\\xd8\\x69\\x91\\x84\\xb3\\x66\\x69\\x67\\x1a\\x7b\\x23\\xa5\\x43\\xf3\\xe4\\xa3\\x95\\xcd\\x35\\x8b\\x66\\x4b\\xee\\x45\\x63\\x11\\x8d\\x6f\\x09\\xec\\xac\\x64\\x86\\xd8\\xda\\x58\\x7b\\xf3\\x48\\x59\\x46\\x87\\xb8\\xa7\\xad\\x4d\\xd2\\xed\\xc0\\xb5\\x95\\x76\\x56\\xb4\\x30\\xda\\x1b\\xc5\\xc7\\xa0\\x3b\\x4d\\xce\\x3c\\x38\\x1c\\x65\\x10\\x8c\\x73\\xe6\\xf0\\x0e\\xbb\\xda\\x6c\\x77\\x8e\\x02\\xd8\\xa8\\x1c\\x45\\x97\\xa0\\x01\\x56\\x8e\\x42\\x17\\x22\\x27\\x9e\\x7a\\xe1\\xe3\\xa9\\xed\\x11\\x47\\x05\\xd5\\x25\\x8e\\x62\\x1c\\x00\\x8e\\x32\\x7c\\x9c\\xec\\xcc\\x91\\x98\\x56\\x99\\x9f\\x67\\x1e\\x63\\xef\\xdf\\x21\\x95\\x84\\x09\\xa6\\xd7\\x30\\x86\\x22\\xdd\\x56\\x6b\\x0b\\x85\\x83\\xc3\\x06\\x4c\\x30\\x33\\x3c\\x46\\x3e\\xe1\\xe7\\x40\\xa5\\x9e\\xfb\\xb3\\x14\\x07\\x0d\\x52\\xf4\\x5d\\x9b\\x23\\xd5\\xd3\\x79\\x63\\xc7\\xc2\\xf8\\x51\\xea\\xed\\x42\\xe7\\x38\\x0d\\x12\\xad\\x8d\\xd9\\x9e\\x7c\\xb1\\xd2\\x80\\x90\\x8d\\x3a\\x3e\\xe4\\xda\\xe1\\x80\\x25\\xc7\\xaa\\xf3\\xe8\\xc0\\x65\\xac\\xf8\\x35\\xdc\\xd9\\x66\\xd7\\xd3\\x46\\x9d\\x28\\x8c\\x6d\\x0a\\xdc\\x03\\x4f\\x53\\xb8\\x1a\\x19\\x8f\\xdf\\xaa\\x44\\x81\\xb6\\x57\\x39\\xb1\\x62\\xf5\\x71\\xba\\xe3\\x18\\x0e\\xe6\\x15\\x9f\\x9a\\xab\\x6a\\x7d\\xda\\x29\\xf9\\x18\\xb9\\x59\\xb2\\x54\\x04\\x8d\\x7f\\xf4\\x9c\\x90\\x6c\\xbb\\xee\\xe5\\x4b\\xfd\\x38\\x48\\x87\\x87\\x1f\\x56\\x1f\\xe9\\x74\\xb0\\xe4\\x38\\xfc\\x61\\x89\\xf7\\x87\\x61\\x8a\\x1b\\xae\\xbb\\xc6\\xc6\\xdf\\x90\\xab\\x74\\x03\\x59\\x41\\x55\\x3d\\x4c\\x7e\\x86\\xf9\\xbd\\x4c\\x68\\x42\\x38\\xe2\\x1c\\x54\\xc4\\xd6\\x43\\x4a\\x34\\x0e\\xee\\xc4\\x44\\x64\\x77\\xdd\\x99\\xf0\\x74\\xaf\\x9a\\x22\\x43\\xe2\\x50\\xc0\\x54\\xa6\\x31\\x19\\xc6\\x51\\x8a\\xb4\\x5f\\xcb\\x34\\x4f\\xab\\x5d\\x2f\\xf3\\xe2\\x1c\\x31\\x62\\x8a\\x36\\x12\\x61\\x1d\\x6a\\xc2\\x8b\\xd2\\xcd\\x96\\x71\\x0e\\x05\\xef\\x5b\\xbe\\x66\\xc3\\x51\\x3d\\xb2\\xbd\\xb4\\x91\\xa7\\x9f\\x0d\\x63\\x54\\x08\\x6f\\x9d\\xd4\\xc8\\x7e\\xb4\\x29\\xb8\\x04\\x30\\xdc\\x85\\x2f\\xc1\\x89\\xac\\xf4\\xc8\\x84\\xa2\\x30\\x3f\\x50\\x0f\\x1f\\xf4\\xa5\\x48\\x51\\x54\\x7a\\xaa\\x48\\xf3\\x9a\\x00\\xde\\x4f\\xf9\\x5d\\x39\\xf7\\x30\\xb8\\x25\\xae\\xcb\\xaa\\xd8\\x44\\x2b\\x46\\x2e\\x2c\\xb2\\x30\\x4f\\x23\\x00\\xe5\\xe4\\xc5\\x3e\\x69\\x1a\\xde\\xe8\\xf8\\xe6\\xfd\\xd1\\x4f\\xc3\\x3c\\x48\\xfc\\x8d\\x4d\\xcd\\xce\\x77\\xd9\\x4d\\x1f\\x29\\xf5\\x78\\x92\\xe0\\xa2\\xbd\\xab\\x6d\\x59\\xb5\\x14\\xc2\\x5e\\x0a\\x08\\x66\\x5d\\x93\\x08\\x5f\\xf7\\x8b\\x83\\x8c\\x80\\xcd\\xb1\\xab\\xb5\\x39\\x08\\xfa\\xd1\\x38\\x16\\x99\\x40\\x10\\xda\\x35\\x5e\\xa5\\x8e\\xd1\\xb2\\xde\\xf8\\x43\\x46\\xf8\\x24\\xde\\x7a\\x2b\\x40\\x18\\x9a\\xb7\\x42\\x91\\xbb\\xaf\\x02\\xe9\\x07\\xef\\x4e\\x00\\x09\\x23\\x2b\\x27\\x06\\xef\\x6d\\x05\\x2d\\xfa\\xc4\\xd4\\x75\\x33\\xa3\\xc3\\xdb\\x63\\x27\\x61\\x60\\x85\\x46\\xa1\\x69\\xe1\\x2b\\x06\\x8a\\x0d\\xe1\\xfc\\x5e\\x0d\\xe9\\xcc\\x76\\xad\\x59\\x36\\x6d\\x2b\\xf9\\x02\\x65\\xde\\x1b\\xb6\\x60\\x92\\x60\\x74\\xd6\\xc8\\x99\\xdc\\xb4\\x6b\\xa6\\x5f\\x20\\x42\\xf0\\x91\\xbe\\x60\\x45\\xbd\\x75\\xce\\x40\\x38\\x8c\\x51\\x31\\x17\\x8b\\x30\\x67\\x6e\\xc7\\x5b\\x3a\\xd0\\x7c\\x1c\\xa9\\xf3\\x7a\\xb1\\xfa\\x78\\xa8\\xc5\\xaa\\xb7\\x9f\\x54\\x8c\\xe6\\x2a\\x67\\xbe\\x93\\x5b\\x21\\xf4\\x99\\xef\\x58\\xc0\\x3b\\xcf\\xf4\\x10\\xb0\\x9e\\xc9\\xec\\xf1\\xd2\\x4f\\x3c\\xd2\\xec\\x09\\x2a\\xe8\\x34\\xd1\\x13\\xa8\\x66\\x0a\\xcc\\x1d\\x7f\\xd1\\x3d\\x00\\xe9\\xbe\\x94\\xe0\\x74\\x01\\x09\\x9a\\xcd\\x78\\x06\\x5f\\xfb\\x31\\xe4\\x8e\\x8e\\x51\\x98\\x72\\xb6\\xef\\x3f\\xfd\\xde\\xab\\x33\\x27\\x1d\\x0d\\x07\\x4b\\x67\\xa2\\x6f\\xa4\\xe7\\x19\\x09\\x46\\xe8\\x3f\\x3b\\x13\\x59\\x32\\x03\\x25\\xa3\\x1e\\xc1\\x76\\x37\\x0a\\x25\\xcc\\x37\\x7b\\x8d\\xc0\\xcc\\x5b\\x3b\\x7f\\xbd\\x01\\xa4\\xb7\\x71\\x06\\x8f\\x20\\xf8\\x83\\xcc\\xe1\\x0f\\x3d\\x32\\x47\\xf0\\xcf\\xc4\\x1b\\x62\\x16\\x09\\x38\\x81\\x78\\x95\\xcb\\xb4\\x4d\\x6d\\x6a\\x7d\\xb7\\x0f\\x7e\\x2c\\x47\\x35\\xf0\\x93\\x38\\xfe\\xbe\\x1b\\xe7\\x47\\x36\\x82\\x98\\xc7\\x1e\\xcf\\x73\\x0e\\xc6\\x75\\x9f\\x96\\x68\\xcb\\x19\\xba\\xa7\\x9b\\x78\\xfd\\xfa\\xfd\\xc8\\x6b\\x5f\\x87\\x89\\xfb\\x12\\x83\\xc4\\xb8\\x6d\\x48\\xeb\\x14\\x93\\x60\\x03\\x01\\x0c\\xc5\\x8a\\xeb\\x20\\x43\\xdb\\x74\\xd9\\x5c\\xa4\\xb9\\x5b\\xc1\\x93\\x90\\x89\\xeb\\xe5\\x4c\\x0f\\x9f\\x02\\x6e\\x30\\x84\\x20\\x46\\x05\\x4c\\x6d\\xf6\\x8d\\x69\\x30\\x56\\x30\\x4b\\x7c\\x9a\\x38\\x8f\\x9d\\x5e\\x09\\xeb\\x89\\x0c\\x16\\x6a\\x4d\\xdb\\x7b\\xf8\\x81\\xa8\\xbd\\xa1\\x30\\xae\\x80\\xfc\\xdb\\xb3\\x85\\xb9\\x2e\\x2d\\xdc\\xc6\\xdd\\x2b\\x8c\\xd6\\x3b\\xb9\\x71\\x85\\xb1\\x7e\\x28\\xcd\\x32\\x0c\\xdb\\xe1\\x5c\\x07\\xc3\\xf8\\xfc\\xb3\\xac\\x73\\xa5\\xe6\\x7e\\xaa\\xdd\\x4f\\xb5\\xbb\\x34\\xd5\\x86\\x2e\\x13\\x35\\xb7\\xc4\\x6e\\xed\\xc0\\x77\\xdc\\x65\\xeb\\x0b\\xf5\\x76\\x8c\\xfd\\x60\\x72\\xef\\xe4\\xf0\\x0f\\xe6\\xfe\\x50\\x33\\x20\\x18\\xe1\\xe1\\xf6\\x9b\\x60\\x94\\xf2\\x52\\xf7\\x58\\x7d\\x52\\x36\\xd3\\x73\\x3a\\x85\\x0a\\x15\\xce\\x47\\x26\\x68\\xb0\\xaa\\xdd\\x04\\x94\\x1b\\x1c\\x0d\\x76\\x84\\xce\\xfc\\xc1\\xa2\\x91\\x96\\x02\\x2b\\x00\\x99\\x79\\xcd\\xfb\\x49\\x91\\xc9\\x14\\xa2\\xdd\\x5b\\xde\\xf8\\x77\\xdf\\x25\\x6f\\xb3\\x02\\xc2\\xeb\\x85\\xff\\xa7\\x79\\xcc\\x20\\x91\\x1b\\x9f\\x75\\xab\\x75\\x95\\x73\\x2b\\x13\\x6e\\x2f\\x95\\xc5\\x06\\x53\\xb3\\x17\\x39\\x5c\\x4f\\x22\\x99\\xcc\\x10\\x16\\xcd\\x56\\x64\\xb3\\x21\\x47\\x5d\\x18\\xdd\\x63\\xe7\\x05\\x03\\x40\\x94\\xcd\\xde\\xe9\\x66\\x31\\x12\\xf3\\x68\\x80\\x96\\x84\\x1e\\x98\\x96\\x84\\xb0\\x77\\x93\\x28\\x89\\x8b\\xfc\\x82\\x32\\xf1\\x5e\\x57\\x8c\\x72\\x84\\x97\\x2a\\x65\\x4f\\x9e\\xf8\\x50\\x56\\x85\\xc8\\xd7\\x6a\\x1b\\x17\\xde\\x0c\\x0f\\x2f\\xbe\\x13\\x1d\\xa6\\xdc\\x1f\\x61\\xdd\\x27\\xde\\xd5\\x4d\\x24\\x91\\xf1\\x9a\\xe4\\x39\\xcd\\xbc\\x04\\x32\\xfb\\x1a\\x60\\x07\\xbd\\x62\\x70\\x73\\x28\\x1c\\xf8\\x6a\\x0c\\xf0\\x05\\x24\\xfc\\x0f\\x87\\xbd\\x08\\x85\\xad\\x3a\\x0f\\x2f\\xd2\\x71\\xb9\\x42\\xdf\\x7d\\x3f\\x7f\\xe9\\x05\\xbe\\x2e\\x33\\xbc\\xc1\\x3e\\x7f\\x69\\x8c\\x0f\\xaf\\xab\\x48\\xd6\\x1e\\xd9\\x67\\xeb\\xda\\x7b\\xa1\\x66\\x1d\\xca\\x27\\xe6\\x91\\x22\\x83\\xd7\\xdf\\x42\\xc1\\x35\\x93\\xce\\x07\\x2d\\x9b\\xd4\\x09\\x5c\\x50\\xd0\\x09\\xbc\\x2f\\xfc\\x43\\x73\\xb5\\x80\\x4e\\x50\\x53\\x21\\xac\\x13\\x5e\\x3e\\x9e\\x34\\x71\\x0e\\xcb\\x2d\\x79\\x90\\xa4\\x1b\\x9a\\x97\\x03\\x7d\\x41\\x42\\xe1\\x2d\\xc2\\xe0\\x4d\\x9b\\x12\\x5c\\x62\\xd7\\xd6\\x1b\\xdf\\x3f\\xb9\\xd1\\x29\\x11\\xaf\\x39\\x83\\xc4\\x07\\x2a\\x0e\\x9e\\x0e\\xf5\\x26\\xcd\\x21\\x00\\xea\\x1a\\xa6\\xc3\\x93\\x7d\\xa7\\x83\\xf8\\x5f\\xa9\\x08\\xf3\\x9f\\x5f\\x58\\x14\\x84\\xf9\\xc5\\xca\\xa7\\x1e\\x74\\x8b\\xed\\x54\\x8b\\x44\\x26\\x32\\x8f\\x49\\xb9\\xdb\\x2c\\x8a\\x4c\\xbd\\x63\\x62\\xa4\\x35\\x37\\x17\\x1d\\xac\\x8b\\x49\\x60\\xf0\\xd3\\x90\\x78\\x3a\\x88\\xc8\\x55\\xf3\\x90\\xf2\\x00\\x1a\\xa8\\x89\\x87\\xdf\\xfc\\xf7\\x38\\x14\\x2c\\x0e\\xc4\\xc0\\x62\\x79\\xba\\x3e\\x0a\\x3e\\x37\\x61\\x68\\x18\\x02\\xa8\\xe9\\xd2\\x2b\\xb9\\xa1\\x63\\x49\\x59\\xc5\\x48\\xc2\\xb5\\x20\\x55\\xfe\\x06\\xbf\\xf9\\x34\\xd7\\x41\\x51\\x50\\x12\\x2a\\x0b\\xea\\x8c\\xc4\\x7b\\xcc\\xcb\\x7c\\xa4\\x42\\xf9\\xde\\xa4\\x2e\\x58\\x5d\\xae\\xc3\\x68\\xc5\\xaa\\x98\\x2c\\x07\\x3e\\x8c\\xea\\x3b\\x0c\\xbb\\x08\\xc3\\xd2\\xcd\\xb7\\x33\\x0a\\x0b\\x17\\xc5\\xaa\\xc8\\x49\\xe0\\x7c\\x52\\xb5\\x5d\\xe2\\x7f\\x2a\\xcb\\x7d\\x5d\\x60\\xaf\\x33\\xd4\\x01\\x90\\x13\\xaf\\xc9\\x5c\\x50\\x36\\xa9\\xb6\\xe5\\x62\\x00\\x31\\x68\\xa5\\x77\\x11\\x13\\x15\\x21\\x7b\\x77\\x69\\x7b\\x4c\\xcc\\x9b\\xa9\\x47\\xe0\\xe8\\x72\\x2c\\xa2\\xde\\x66\\x2d\\x58\\x05\\x35\\xfa\\x9f\\x68\\x36\\xc3\\x14\\xf0\\x43\\x2f\\x0d\\xe2\\x67\\xdb\\xba\\x24\\xdf\\xa4\\xd4\\x6d\\xef\\x00\\xa8\\xf2\\xa3\\x13\\xaa\\x68\\x7e\\xa6\\xb7\\xd7\\xed\\x91\\x31\\x46\\x02\\x0e\\xe6\\xc1\\x55\\xfb\\x29\\x23\\x97\\x78\\xa5\\x9b\\x1b\\x06\\xf8\\x11\\x5f\\x07\\x10\\x93\\xa7\\x79\\x9c\\xd8\\x7c\\xa6\\x42\\xe6\\x9f\\xb1\\x3e\\xea\\x60\\xbe\\x3c\\x6f\\x7f\\x9f\\x1d\\x4e\\x6a\\x8f\\xcc\\x67\\xdf\\xec\\x14\\xf6\\xee\\x9c\\x5f\\x3d\\x10\\x19\\xfc\\x48\\x59\\x16\\x71\\x8a\\x59\\x22\\x9b\\x64\\x7e\\x48\\xb8\\x8f\\x1e\\x6b\\x38\\xa0\\xe7\\xea\\xf9\\x04\\x8c\\x16\\xac\\x28\\x09\\x98\\x56\\x5f\\x9f\\x88\\x0c\\x7f\\xa3\\xd2\\x18\\xce\\xa7\\x71\\x8e\\x8d\\x2d\\xe0\\x64\\xa2\\xfa\\x26\\x61\\x0b\\xbe\\x08\\x06\\x39\\xdb\\x00\\x76\\x10\\x27\\x32\\xdd\\x64\\x97\\x1b\\xfb\\xfa\\x39\\x3e\\xa5\\xc0\\x5e\\xdd\\x6b\\xf5\\xf3\\xdc\\x77\\xef\\x2d\\xea\\x5e\\x75\\x9d\\x43\\x2c\\x31\\xa8\\xf9\\x7b\\x93\\xf3\\x88\\x1a\\x7b\\x64\\x63\\x71\\x22\\x72\\xb1\\x7f\\x24\\xcf\\xea\\x47\\xf7\\xdf\\x64\\x8c\\xe6\\xbb\\xad\\x53\\x04\\xfd\\x24\\x83\\x94\\xd7\\x48\\x87\\xc0\\x0c\\x6f\\xc6\\xbe\\x53\\xd9\\x82\\x74\\x92\\xc4\\xf3\\x9a\\xde\\x8d\\x38\\x06\\x60\\xc1\\x1a\\x51\\xf3\\x92\\x3b\\xab\\x29\\x3c\\x2b\\x0f\\xb7\\x60\\x8a\\x1c\\x1e\\xbe\\x59\\xf6\\x91\\xab\\x87\\xda\\xbd\\x7d\\xee\\x7c\\xff\\xd3\\x4e\\x40\\x6f\\x90\\x75\\x9f\\x3d\\xe9\\xec\\x60\\xf8\\x10\\x08\\x6a\\x06\\x3e\\x0a\\x26\\xe5\\xff\\x19\\x8f\\xd5\\x82\\x19\\x7e\\x3a\\xe1\\xfa\\x47\\x01\\x0f\\x76\\x8c\\x1e\\xaa\\xd7\\x43\\xea\\xa8\\x47\\x46\\x8e\\xa3\\x98\\x6c\\xf9\\xc0\\xa1\\x67\\xba\\x8f\\xdd\\x3f\\xf4\\xbd\\x19\\x02\\xc0\\x12\\xfc\\x6b\\x2f\\xe5\\xc3\\xf1\\xda\\xdd\\x49\\xfb\\xb1\\x69\\xd6\\xd5\\x05\\x5d\\xe9\\x97\\xe5\\x5a\\x62\\x3b\\x5d\\x10\\x4d\\x44\\x44\\x56\\xdf\\x24\\x35\\xef\\xd7\\x14\\x2c\\x75\\xac\\x82\\xde\\x33\\x05\\xd1\\x4c\\x86\\xdd\\x36\\xc3\\x69\\x18\\x1d\\xe6\\x38\\xf6\\x30\\x64\\x3d\\x86\\x12\\x2f\\xff\\xd5\\xf2\\x95\\x2d\\xb5\\x96\\x85\\x21\\x7b\\x7d\\xb0\\x83\\xa8\\x30\\x7c\\x3f\\xcb\\x15\\x77\\x1c\\x87\\xe6\\x3a\\x6d\\xc5\\x65\\xa2\\x9a\\xd7\\x0b\\x7c\\xe4\\x87\\xf6\\x5e\\x4e\\xed\\x37\\xc7\\xfa\\x83\\x87\\x80\\x16\\xca\\xd2\\x3c\\x6f\\x2f\\x81\\x1d\\x43\\xe2\\x4d\\xca\\xce\\xfc\\x52\\xe9\\x7c\\xc3\\xf6\\xe7\\x53\\xb1\\xcb\\x53\\xd0\\x60\\x6c\\x48\\xde\\x07\\xc3\\x06\\x42\\x15\\xf9\\x96\\x67\\x4d\\x16\\x7d\\x5b\\xf4\\xe1\\x99\\xcd\\xfe\\xb3\\x81\\xcf\\xd3\\x58\\x76\\xa6\\x5b\\xc4\\x03\\xb9\\x4c\\x06\\xed\\xb2\\x37\\x5a\\x2e\\xbb\\x2d\\xe1\\x4a\\x20\\x2c\\xa7\\xb6\\xc7\\x26\\xcd\\x86\\xea\\x91\\x63\\xa8\\xde\\x3c\\x9c\\x87\\xdf\\xec\\xe6\\x9a\\x6a\\x80\\x22\\x88\\x7e\\xda\\xc2\\x5a\\x41\\x32\\xf1\\xd5\\x6b\\xd8\\x99\\xeb\\xbb\\xcf\\x4e\\x85\\x1f\\x1c\\x62\\xe0\\xd6\\xa9\\xdd\\xc1\\x96\\x6e\\x98\\xde\\x53\\x78\\x26\\xa1\\xb6\\x7d\\x61\\xba\\xe0\\x3a\\xd5\\x8c\\x94\\x38\\x03\\x95\\x1b\\x9a\\xa6\\xb5\\xf2\\xde\\xaf\\xec\\x01\\x31\\xd6\\x0f\\x9c\\x28\\xf7\\x32\\x1b\\x25\\xb3\\xe1\\xac\\x5c\\x53\\x45\\x66\\x66\\x5f\\xb2\\xb3\\x63\\xcf\\xbb\\xe4\\xaf\\x3b\\x4a\\x5e\\xbd\\x46\\x7b\\x89\\x6b\\x28\\x4d\\xd7\\xbd\\xb0\\xb4\\x9f\\x98\\xaf\\x9f\\x8c\\xeb\\x7f\\xde\\xc5\\xaf\\x1f\\xa9\\xe3\\x3d\\x92\\x04\\xef\\xff\\x1d\\xda\\x0d\\xac\\x17\\x1d\\x6c\\xfb\\x81\\xd5\\x8c\\x93\\x56\\x9c\\x74\\x87\\xc4\\x45\\xc1\\xb8\\x7a\\x87\\x8e\\x70\\xe9\\xce\\xf0\\x9a\\xad\\xe3\\x9c\\x7b\\xa1\\x48\\x2c\\x88\\x90\\xe5\\xe9\\x93\\xc3\\x69\\x9c\\x8d\\x22\\xc9\\x02\\xc2\\xe5\\xfb\\x99\\x96\\x9c\\x59\\xcf\\x15\\x60\\x9f\\x73\\xf6\\x43\\x27\\x6b\\x43\\xef\\xbc\\xb3\\xc3\\xf1\\x8b\\xa9\\x2b\\x27\\x0c\\xb9\\x89\\xe1\\xbd\\x17\\x62\\x7b\\x88\\xd5\\x23\\xac\\x98\\xb7\\x69\\x04\\xa5\\x20\\x88\\x18\\xc1\\xb0\\x71\\x00\\x00\\x4e\\x7d\\xbc\\x84\\x38\\xc9\\xf4\\x81\\xbf\\x1b\\x3d\\xf0\\xc7\\xb9\\x3d\\x43\\x91\\xb8\\x18\\xbe\\xae\\x81\\x1f\\x4a\\xd2\\xdf\\x7d\\xe0\\xef\\xee\\xea\\xc0\\x4f\\x9b\\x27\\x28\\xe1\\x84\\x09\\x02\\x22\\xbd\\xa3\\xbe\\xad\\x3e\\x2e\\xa1\\xb0\\x05\\xd7\\xe8\\x09\\xa0\\x9d\\x23\\x6e\\x8b\\x14\\x3d\\x1e\\x6a\\xdf\\x97\\xef\\x8c\\x49\\x03\\x72\\x6c\\xef\\x06\\xd3\\xe5\\xee\\x58\\x4d\\x2e\\xd8\\xbf\\x7d\\xb1\\x06\\x71\\xd9\\x11\\x6f\\x30\\xbf\\x07\\x19\\x08\\x31\\xc1\\xe1\\x9d\\x45\\xe5\\x16\\xa3\\x23\\x2a\\x11\\xde\\xe4\\x0f\\xa6\\x14\\x75\\xc6\\x8f\\x04\\x13\\xd9\\xe8\\xb1\\x30\\x6d\\xb5\\x1b\\x81\\xd6\\xdd\\xd5\\x92\\x69\\xec\\xe6\\x27\\x06\\xc0\\x6e\\xb7\\x57\\x96\\x08\\x31\\x17\\x4f\\x8d\\x28\\xf7\\x99\\xdb\\x4f\\x0a\\xd0\\x95\\xb3\\xe8\\x72\\x4d\\x39\\xbb\\x4c\\x3d\\x5a\\x80\\xd9\\xbf\\x12\\xba\\x4c\\xe1\\xed\\x03\\x78\\x38\\x4d\\x3e\\x05\\x88\\xa3\\xca\\xdb\\xc1\\xb2\\xd1\\xf8\\x0e\\xee\\x6d\\x02\\xfc\\xaf\\x1c\\x73\\x2c\\x08\\x2c\\x81\\x42\\x46\\x6d\\xf4\\x1d\\x6a\\x3b\\x74\\x06\\x99\\xfb\\x47\\x48\\x38\\xdd\\x18\\x97\\xe3\\xa5\\xdb\\x3d\\x84\\x54\\x5f\\xec\\xb7\\x65\\x36\\x9d\\x13\\x26\\x8a\\xa1\\x21\\x35\\x64\\x31\\x89\\xf0\\xa0\\x7b\\xbb\\x29\\xba\\xb7\\x9b\\x3e\\x56\\xbb\\xc9\\x16\\xe1\\xe6\\x6c\\x3e\\xa8\\x44\\x2a\\x68\\x77\\xc8\\x88\\xb2\\x86\\x00\\xde\\x9b\\x52\\x5e\\x92\\x3e\\x52\\x53\\xea\\x7a\\xe6\\xc2\\x38\\x91\\xdd\\x66\\xb3\\xea\\x10\\x53\\xe1\\xa3\\x33\\xae\\xee\\x94\\xe5\\x74\\xc0\\x8e\\xbc\\x37\\x8e\\x3a\\x6d\\x6e\\x87\\x71\\x34\\xa9\\x63\\xff\\x9e\\x26\\xd2\\x84\\xa0\\xa5\\xbb\\x60\\x0e\\x69\\x19\\x98\\x02\\x07\\x0c\\x1b\\x38\\xf8\\xb5\\xdf\\xbc\\x0f\\x3f\\xf1\\xf5\\xee\\xbc\\xed\\xa9\\xec\\xd8\\x3d\\xdb\\x68\\xe9\\x7c\\x10\\x26\\xec\\x46\\x0a\\xf1\\x1f\\x4e\\x6a\\x32\\x18\\x7c\\x00\\xca\\x3c\\x92\\xf4\\x6b\\x1e\\x9e\\xc7\\x70\\x46\\x34\\x44\\xee\\x83\\x01\\x84\\xa5\\xa8\\x80\\xfb\\x31\\x01\\x2f\\xdd\\xe2\\x55\\x11\\xb8\\x42\\xb2\\x4d\\x69\\x4c\\x2f\\xd3\\x52\\x4c\\x5e\\xc2\\x70\\x7e\\x1c\\xc3\\x53\\x94\\xf8\\xde\\xbd\\x98\\x2e\\x90\\x01\\xdc\\xbf\\xb8\\xdc\\xdb\\xaa\\x7f\\x4b\\x5b\\xd5\\x7e\\x5b\\x6b\\xbc\\x66\\x6e\\x87\\xf3\\x71\\x9a\\xa7\\x7d\\x5e\\xc6\\x2a\\x71\\x57\\x5f\\xe8\\x9c\\xcd\\x16\\xa4\\xa4\\x30\\x39\\x8f\\x02\\x27\\xc1\\x17\\xe3\\x67\\xc1\\x58\\x94\\x2e\\x51\\x5c\\xd7\\x94\\x98\\x44\\xdf\\xdf\\x7e\\x7e\\xb8\\x64\\x76\\xa7\\xe6\\xca\\x97\\x1d\\x26\\xab\\x62\\x3b\\x66\\xaa\\x7c\\x39\\x65\\xaa\\x8c\\xc2\\xe8\\x12\\xc4\\xf5\\xcd\\x94\\xf1\\xe4\\xfd\\xed\\x27\\x8a\\x43\\x64\\x77\\x69\\x9e\\xdc\\x3b\\x3b\\xef\\x95\\xa9\\x50\\x31\\x1d\\x60\\xdc\\x77\\xc7\\xfc\\x0d\\x0d\\xf9\\xbd\\xd4\\xa8\\xdd\\x04\\x35\\x6a\\x24\\x46\\x97\\x24\\xae\\x6d\\x2e\\xdc\\x2b\\x51\\x07\\x13\\xd9\\x5d\\x99\\x23\\xfb\\xa8\\x4f\\xbb\\x09\\xea\\xd3\\x38\\x84\\x2e\\x39\\x5c\\xdb\\x0c\\xb9\\x57\\x9e\\xf6\\x93\\xd8\\x9d\\x9b\\x20\\x1f\\xdd\\xc9\\xd8\\x7d\\xd8\\xa1\\x2d\\xec\\x70\\xff\\x81\\x70\\x7f\\xb2\\xd6\\x69\\xe3\\xee\\xea\\x0f\\x75\\xb2\\x36\\xa1\\x4b\\x6d\\x67\\x6a\\xc6\\x79\\xd0\\xad\\x3b\\x53\\x1b\\x3e\\xaf\\x9a\\xb4\\x3f\\xfe\\xfd\\xce\\xd8\\x5c\\x62\\x18\\x1a\\x4a\\x43\\xa7\\x2d\\x81\\xe1\\x86\\xf7\\x67\\x2e\\xf7\\x67\\x2e\\x01\\x0c\\x86\\x69\\x7b\\x87\\x8b\\x89\\xf2\\x41\\xfb\\x78\\xcf\\x5f\\x0e\\x11\\x4a\\x73\\x7f\\x0a\\xa3\\xe8\\xbb\\x0b\\xa7\\x30\\xb7\\x63\\xc6\\x7c\\x71\\xc7\\xa7\\xcc\\xfd\\x61\\x4c\\x74\\x47\\x0e\\x63\\x6e\\xc7\\x7c\\xf9\\xf2\\x6e\\xcf\\x97\\xfb\\x43\\x99\\x7b\\x6d\\x6b\\x8a\\xc8\\xee\\xe0\\x4c\\xb8\\x3f\\xab\\x11\\xe4\\xdd\\x81\\xb3\\x9a\\xdb\\x30\\x5d\\x0c\\xf9\\xdd\\xc1\\x09\\x73\\x7f\\x70\\x73\\x37\\x0e\\x6e\\x6e\\xc7\\x6c\\xb9\\xe3\\x8a\\xd6\\x47\\x77\\x8a\\x73\\xa7\\x8e\\x68\\x0e\\xd8\\x91\\xf7\\xa7\\x30\\x9d\\x36\\xee\\xde\\xfc\\x90\\xa7\\x30\\x07\\xbb\\xdf\\x74\\xf7\\xcf\\x62\\xfe\\xa6\\x67\\x2f\\xc6\\x59\\xcb\\xde\\xf7\\x9b\\xc2\\xef\\x31\\x79\\xb7\\x58\\x67\\x02\\xcb\\x90\\x36\\x53\\xf6\\xf4\\xd1\\xe9\\x2c\\x83\\x64\\x15\\x90\\x3d\\xf5\\x5e\\x60\\xfa\\xd7\\x80\\xd4\\xa9\\xf7\\x02\\xd3\\xbf\\x7a\\x2f\\xda\\x05\\xdf\\xa9\\xf3\\xab\\xbb\\x8e\\x6c\\x9f\\x01\\x4d\\x26\\x69\\xd7\\x23\\x73\\x7f\\x06\\x89\\x69\\x38\\xbd\\xec\\xbd\\xac\\xd4\\xcf\\x50\\x6e\\xd9\\x7b\\x49\\xe1\\x47\\x4f\\xf0\\x01\\xbe\\x15\\x66\\xbe\\x6a\\xd0\\x7b\\x62\\x6a\\x28\\x24\\xe0\\x50\\x1b\\xad\\xe5\\xe5\\xb2\\x4e\\x45\\xa3\\x0b\\x2c\\xd5\\xaf\\x6f\\x32\\xb9\\x68\\xb3\\x8f\\x8e\\x61\\xd2\\x0e\\x36\\x76\\x0f\\x4d\\x58\\x59\\xd4\\x2c\\x1e\\xf9\\xda\\x84\\xc4\\x25\\xb4\\xb3\\x21\\x82\\x1c\\xf7\\xca\\x9d\\x8d\\xcd\\x37\\x0f\\x08\\x5b\\x51\\xe7\\x53\\x15\\x37\\x4b\\x9f\\x6f\\xaa\\xa9\\x27\\xef\\xf6\\x9e\\x6d\\x5b\\x56\\xfc\\xae\\x5e\\x1d\\xb1\\x0b\\xc1\\x07\\xb3\\x1d\\x0d\\xd6\\x27\\x28\\x00\\x78\\x07\\x40\\xa7\\xc1\\x91\\xef\\x75\\xbf\\x7e\\x5b\\xf7\\xca\\xe5\\x01\\x35\\x6a\\x38\\x0e\\x71\\xea\\x78\\x1c\\x85\\xc5\\x7d\\x1e\\x45\\xff\\x7a\\xd8\\x33\\x5b\\x39\\xde\\x9d\\x09\\x00\\xe2\\xab\\x35\\x6a\\xb4\\x4f\\x63\\x5f\\xc1\\xd4\\x73\\x0f\\x0c\\x12\\x6e\\x34\\x32\\xb3\\x2e\\x04\\xb7\\x0f\\xe4\\xbd\\xf7\\xac\\x2c\\xbc\\x67\\x23\\x92\\xe2\\x19\\x2f\\xcb\\xe2\\x93\\x66\\x7f\\xb9\\xe7\\x1d\\x56\\xf8\\x0e\\x5e\\x72\\xff\\x6b\\xd8\\x9d\\xc0\\xe7\\x5b\\x1d\\x83\\xc7\\x40\\x46\\xd5\\xfd\\x51\\x93\\xbc\\x4a\\xe1\\x85\\x9b\\x0b\\x2a\\x9e\\xe1\\xf1\\xfa\\x0f\\x44\\x2b\\xf5\\x1c\\x2a\\x61\\x96\\x77\\xda\\x1e\\x7a\\xb0\\xe6\\x51\\xa1\\xbc\\x2c\\x83\\xa8\\x64\\x4d\\xc0\\xf5\\x93\\xf8\\x68\\x45\\x36\\x89\\x47\\xf1\\x2c\\x1c\\x89\\x92\\xb4\\x8c\\x19\\xad\\x28\\x18\\x3b\\xdb\\xba\\xe2\\xfb\\x7c\\xbe\\xf2\\x53\\x25\\x60\\xfd\\x49\\x81\\xac\\xff\\x96\\x9f\\xf7\\x13\\x82\\x7c\\xa2\\x0e\\x5e\\x7e\\x27\\x15\\x5d\\x15\\x2c\\xe5\\x7f\\x15\\x2f\\xb5\\xfb\\x1f\\xfb\\x94\\xd5\\x77\\x5f\\x7e\\x31\\x24\\xa3\\xb1\\xb4\\x5c\\xd2\\xbc\\xda\\x59\\xc8\\x09\\xa1\\xe6\\xab\\x5b\\x46\\xcd\\xe2\\x76\\x91\\x13\\x4f\\x27\\x47\\x0d\\xe7\\x34\\xa1\\x30\\x9c\\x77\\x01\\x73\\x48\\x55\\x05\\xa4\\x3f\\xc8\\xcf\\x63\\xb1\\x3a\\x67\\x4f\\x1e\\x65\\xc5\\x8a\\x30\\xfe\\x79\\x93\\xc6\\x11\\xbe\\xfc\\x05\\xcf\\x03\\xf9\\xd7\\x8f\\x62\\x85\\x8b\\x47\\xb1\\x3a\\x20\\x19\\xb0\\x22\\xe6\\xc0\\x1c\\xef\\x8b\\x30\\x32\\xb6\\xc5\\x25\\x90\\xf1\\xba\\xb8\\x3c\\x00\\x19\\x1b\\xb2\\xdd\\xe2\\x33\\x81\\x85\\x2c\\xcd\\x06\\x5e\\xe9\\x55\\xb5\\xda\\x35\\x24\\x1b\\xbb\\x86\\x78\\xd6\\xb4\\x92\\x17\\x31\\x1a\\xb1\\xa2\\xa8\\x02\\xa5\\x51\\xfe\\xc1\\x2a\\x7c\\x3d\\x9c\\xff\\x1e\\x4b\\x47\\xb5\\x66\\xb4\\x5c\\x17\\x59\\xb2\\xef\\xc2\\xda\\x00\\x02\\x4a\\xce\\xd5\\x17\\x83\\x1c\\x9f\\xfa\\x89\\xb1\\xe3\\x69\\x8c\\x2d\\xbe\\x99\\x7f\\x6b\\x6a\\xa1\\xed\\x6b\\x55\\x36\\x25\\x3a\\x29\\x36\\x24\\xb5\\xab\\x9b\\xe6\\x9b\\x65\\x73\\xcb\\xde\\x7f\\x64\\x7d\\xf2\\xac\\xe7\\xad\\xe5\\x32\\xb8\\x5e\\x14\\x29\\xbe\\x7b\\xff\\x0c\\x1f\\x8a\\x3c\\x9b\\xed\\x34\\x76\\xcd\\x86\\x71\\xb1\\xc5\\x55\\x61\\x1e\\x26\\x5c\\xa1\\x84\\xe0\\x0b\\x94\\x49\\x69\\x88\\x1a\\xfe\\xe7\\xe2\\x0e\\xe9\\x9c\\xff\\xd6\\x46\\x6d\\xd3\\x51\\x76\\xa8\\x66\\x07\\xda\\x4f\\xbd\\xc0\\x99\\x8f\\x72\\x15\\xe7\\xa7\\x9c\\x2d\\xc6\\x47\\x0e\\x5f\\x0e\\x12\\x39\\x23\\xd5\\xd1\\x88\\xe8\\x60\\xdb\\x29\\xab\\x09\\x56\\xba\\xf9\\x05\\xbc\\xa7\\xa2\\xd9\\xcf\\xbd\\xbb\\x75\\xe6\\x35\\x03\\xf3\\x4d\\x35\\x9b\\x75\\xeb\\x66\\x41\\xa7\\xce\\xcd\\x83\\xc6\\xe8\\x08\\x16\\xde\\x60\\xab\\x41\\x0e\\xc4\\xd0\\x99\\xc8\\x87\\x3a\\x81\\xc1\\x35\\xe0\\x1f\\x65\\x67\\xd6\\x1f\\x47\\xf0\\x9c\\x29\\xcd\\xc9\\x22\\x83\\x55\\xa9\\x46\\xb6\\x46\\xd0\\x0f\\xe7\\x2c\\xc1\\xab\\x08\\xd6\\x78\\x03\\x48\\x4e\\xcd\\x69\\x85\\x2f\\x86\\x0f\\x31\\xb2\\xea\\x9e\\xa4\\x1a\\xfc\\xb4\\x67\\x82\\x03\\xb1\\x23\\x03\\x67\\xe3\\xf2\\xa9\\x63\\xed\\x81\\xcc\\x1f\\xda\\x06\\x96\\xb9\\xcf\\xa7\\x10\\xc7\\xb8\\xf3\\x34\\xea\\x2f\\x1a\\x83\\x67\\x8b\\xb2\\x47\\x38\\xb7\\x7c\\xb1\\xc6\\x8f\\x71\\x46\\x36\\xb8\\x93\\x15\\xe2\\xd9\\x59\\x8f\\xd4\\xed\\x1d\\x86\\x00\\xa2\\x67\\x26\\x60\\xaf\\x66\\x04\\x4d\\x5c\\x32\\x72\\xa6\\x7d\\x9f\\xc9\\x66\\x6d\\x32\\x74\\x93\\xfb\\x21\\xe6\\x71\\xcd\\x69\\xfb\\x58\\xcd\\x40\\x3e\\xdb\\xe0\\x71\\x42\\x31\\x4e\\xe5\\xe0\\x37\\x37\\x73\\x07\\xef\\xf0\\x9c\\x61\\x9b\\xb8\\x5c\\x34\\x45\\x49\\xc2\\x53\\xa0\\x00\\x98\\x5e\\xf1\\x6e\\xcc\\x76\\xd1\\x32\\xd5\\x27\\xbd\\x4f\\x38\\xf6\\x77\\x12\\x83\\x06\\x31\\xa3\\x5b\\xbe\\x88\\x88\\xb7\\x4b\\x2f\\xe4\\xa2\\x51\\x46\\x4b\\x56\\x6c\\x64\\x28\\x04\\xf4\\xac\\xa0\\x60\\x04\\x7b\\x8f\\xb7\\xac\\xb8\\x4a\\x37\\x10\\xfd\\x60\\x47\\xc0\\xd9\\x64\\x98\\x32\\xde\\xbf\\xd7\\x83\\x48\\x7a\\xaf\\x79\\x5a\\x76\\x29\\x3b\\x6f\\x24\\x6a\\x9e\\xa1\\xc4\\xe7\\x77\\xf9\\x30\\xdb\\x66\\x64\\x87\\xab\\x25\\x87\\x2c\\x69\\xb9\\x0e\\xae\\x86\\x98\\x92\\xaf\\x64\\x76\\x38\\x3b\\x96\\xd4\\x9e\\xe9\\xef\\x11\\xe7\\x1d\\xdf\\x82\\xe9\\x04\\xf3\\xed\\xa4\\xbd\\x2d\\xd4\\xdc\\x3f\\xfb\\x7b\\x6c\\xef\\x2f\\x43\\xbb\\xb5\\x66\\xdb\\x0f\\x43\\xd7\\x2a\\x0f\\xc1\\xed\\x98\\x20\\xf6\\x7d\\xbf\\x53\\xe5\\x5e\\x07\\xf8\\x88\\x74\\x80\\xfb\\x55\\xe7\\x36\\xad\\x3a\\xfb\\x2d\\x32\\x8d\\x25\\x38\\x3c\\xfd\\x9b\\xaa\\x43\\x93\\x5f\\x19\\xdb\\xc3\\x20\\x55\\xcd\\xc1\\x65\\x4a\\x7a\\x11\\x02\\xd6\\x28\\x59\\x73\\x08\\xa2\\xee\\x98\\xb1\\xaf\\x4f\\x7a\\x0d\\x73\\x79\\xc2\\xb9\\xf9\\x1a\\xb3\\x2c\\x88\\x08\\x3f\\xde\\x91\\xcd\\xd5\\x63\\xf9\\xd0\\xb6\\xbe\\x91\\xbb\\xdd\\x40\\x08\\xe9\\x3b\\xae\\x37\\x07\\x00\\x92\\x8f\\x55\\xbf\\x1e\\x0d\\x1f\\xd5\\xe4\\xeb\\x46\\x02\\xf0\\x5d\\xa7\\x7d\\x58\\x41\\x18\\xab\\x16\\xf3\\x76\\x78\\x13\\xfc\\xd3\\xbe\\x01\\xea\\x9b\\xde\\x9f\\x61\\x1b\\x5e\\xd7\\xdf\\x60\\x07\\xd8\\xad\\x33\\x04\\xb1\\xe3\\xd7\\xf1\\x51\\x98\\x51\\xeb\\x58\\x6a\\x3c\\x49\\x23\\x25\\x73\\x9e\\x6e\\x7c\\x38\\x9b\\x62\\x97\\x7f\\xe4\\xa9\\x30\\x26\\x6c\\xdd\\xe5\\xd8\\x1d\\x9e\\xf6\\x6c\\x96\\x01\\x23\\xac\\xa1\\xc1\\x04\\xff\\x81\\x6d\\xa6\\xe7\\xa2\\x06\\xb8\\x9b\\xec\\x14\\x99\\x6f\\xd7\\x82\\xcd\\xd1\\xb7\\x3c\\x1c\\x8d\\x71\\xb7\\xb1\\x32\\x12\\xb0\\x03\\x61\\x3d\\xe9\\x2f\\x02\\xfa\\x39\\x8a\\x93\\x37\\xc2\\x98\\x0e\\x68\\x6d\\x79\\x43\\x7f\\xda\\x16\\x01\\x3f\\x76\\x1b\\xc4\\xc2\\xb4\\x79\\xa0\\xf5\\x1d\\x5d\\x93\\x8b\\xb4\\xa8\\x19\\xfe\\xa1\\x7b\\xa6\\x25\\xcb\\x98\\xef\\x58\\xcb\\x52\\x07\\x21\\xbb\\x4f\\x7c\\x4a\\xbe\\x47\\x43\\x44\\x66\\xc2\\xc8\\x2a\\x5a\\x74\\xd0\\x37\\xb5\\x8d\\x70\\x58\\x5e\\x13\\x07\\x16\\xff\\x1d\\x7c\\xb0\\xa4\\xd0\\xfc\\x59\\x70\\xb5\\x26\\x08\\x0d\\xd4\\x04\\x34\\xff\\xe4\\xbf\\xc3\\xa6\\x31\\xd4\\x1c\\x64\\xfc\\xf1\\x76\\x9b\\xa5\\x54\\x3c\\xce\\xa5\\x13\\xc3\\x40\\x75\\x40\\xd3\\x76\\x4b\\xe3\\x74\\x99\\xd2\\x24\\x2a\\x69\\x26\\x4e\\xd4\\x8f\\x0d\\x18\\x8c\\xae\\xd2\\x92\\x63\\x45\\x35\\x06\\x23\\x5a\\x21\\x9a\\x95\\xb0\\x5d\\x44\\xb9\\xba\\x59\\x45\\x19\\x94\\xf2\\x05\\x04\\xd5\\x91\\xb2\\xde\\x02\\x9d\\x06\\x88\\x2d\\xc9\\x73\\x68\\x0e\\x6e\\x1e\\x20\\xa3\\xef\\xde\\x31\\xf4\\xe4\\x86\\x98\\xd3\\xe8\\xdf\\x73\\xf5\\xf9\\x1b\\x3e\\x90\\xbf\\xe5\\x32\\xba\\x28\\xd2\\xc4\\x78\\x85\\xc9\\xf6\\x2c\\x99\\xa0\\xba\\xc4\\x53\\x11\\x41\\xa1\\xd0\\x97\\x62\\x0a\\x1a\\x14\\xd2\\x1e\\xa4\\x8b\\x55\\xbb\\x2d\\x8d\\x9e\\xc1\\xe9\\x41\\x94\\x93\\x8d\\xb8\\xd6\\x51\\x55\\x24\\x5e\\xcb\\xb7\\x1a\\x1a\\xd8\\xf6\\xe6\\x4d\\x85\\xe7\\x4d\\xc8\\x71\\x0b\\xa0\\x10\\x74\\xf8\\x64\\x01\\x32\\x98\\x01\\x0d\\xca\\x38\\x3c\\x6e\\x40\\x06\\xa5\\x65\\x81\\xdf\\x62\\x54\\x0d\\x5b\\x19\\x65\\xe7\\x8e\\x40\\xcd\\x0d\\x0c\\xce\\x34\\x8e\\x1b\\x74\\x81\\xf8\\xc8\\xc4\\x0a\\x13\\xee\\x06\\x48\\x24\\x03\\xc8\\x2c\\x08\\xe1\\x67\\x8f\\xcb\\x01\\x23\\xf0\\x5a\\xc0\\xc8\\xbe\\x2d\\x58\\xba\\xe2\\x06\\xd9\\x3f\\xc7\\x11\\x2d\\x45\\xd5\\xac\\x94\\xdd\\x39\\x0f\\x3f\\xef\\xf7\\xeb\\x2c\\x3c\\xd3\\x91\\xd7\\x12\\x2e\\x28\\x6c\\x61\\x5e\\xfb\\x40\\xd6\\xde\\xa3\\xf7\\x42\\xb0\\xba\\xa4\\x71\\x74\\xea\\x89\\xc5\\x09\\xeb\\xc4\\x60\\xf4\\xee\\x9e\\x6c\\x84\\x10\\x81\\x26\\x30\\x9e\\x0b\\x4d\\x88\\x5a\\x74\\xcf\\x21\\x7a\\x96\\x64\\x59\\x71\\x49\\xd5\\xe1\\x19\\xee\\xf8\\x83\\xf3\\x50\\x68\\xcc\\xd3\\xfb\\x53\\xe1\\x44\\xc1\\xf6\\x51\\xba\\x84\\xb0\\x47\\x57\\x22\\x46\\x74\\x0a\\xfb\\x70\\xba\\xfb\\x0f\\x55\\x59\\x6e\\x31\\x4f\\x23\\x9c\\x4a\\x79\\x1d\\xb8\\xeb\\x7e\\x79\\x20\\xf4\\x6c\\xbc\\x63\\xc2\\x0d\\x83\\x3a\\x4b\\xf8\\x06\\x1c\\x91\\xe4\\xf7\\x9a\\x2f\\xe0\\x09\\xdc\\x36\\xc9\\xd5\\x7e\\xe8\\xeb\\xd3\\x09\\xb9\\xa1\\x24\\xea\\xd0\\x6e\\xe3\\x1a\\x24\\xd6\\x3f\\xb1\\xa8\\xa9\\x6e\\x64\\x73\\x93\\xcf\\x42\\x67\\x6f\\x4c\\xf7\\x5d\\xe1\\x19\\xce\\x2f\\x51\\x38\\xd1\\x57\\x26\\xd1\\x4d\\x9f\\xed\\xd9\\x69\\xbf\\x1e\\xa8\\xd3\\x26\\xa4\\x98\\xf8\\xf5\\x43\\x76\\xda\\xaf\\x7b\\x77\\xda\\x0e\\x3b\\xed\\xd7\\x11\\x9d\\xb6\\x73\\x76\\x9a\\x5e\\x2d\\x34\\x98\\x14\\x74\\xf8\\x21\\x05\\xf8\\xd9\\x15\\x8d\\x6b\\xbe\\xaa\\xa3\\xc2\\xbf\\xa1\\xd5\\xba\\x48\\xbc\\x8a\\xa7\\x3a\\xf9\\xbf\\xd7\\x2e\\xc3\\xb5\\x4b\\x61\\x1a\\x4d\\x54\\x58\\xa4\\x0a\\xe5\\xbf\\x22\\xd7\\x8b\\xfb\\x83\\x36\\xd3\\xb7\\xb7\\x20\\x9c\\x16\\xbc\\xf0\\xe3\\x0c\\xb0\\xf6\\xcf\\xb6\\x70\\x94\\x83\\xda\\xe6\\xe3\\x49\\x64\\x8b\\xc6\\x67\\x4d\\xf0\\x69\\xcf\\x9c\\xf5\\x04\\x9e\\xbe\\xa0\\xc5\\x8a\\x91\\xed\\x7a\\x87\\x7f\\xe8\\xda\\xe9\\xbc\\xcc\\x67\\xa2\\x77\\x8b\\x6d\\x72\\xfa\\x3c\\x8a\\x19\\x15\\x09\\x1d\\xc1\\x64\\x5e\\x49\\x5c\\x69\\x2c\\x5e\\x93\\x5e\\x89\\x7c\\x8f\\x7e\\x15\\x16\\x6a\\x62\\xb4\\x16\\xff\\x3d\\x64\\xa4\\x37\\xd8\\xe2\\x94\\xc5\\x9c\\x81\\x06\\x81\\x3f\\x92\\x12\\x2b\\x03\\x8e\\x27\\xf8\\x69\\x10\\x4b\\xb1\\xd9\\xc2\\xba\\x23\\x6c\\xec\\x35\\x15\\x61\\x80\\x78\\xa9\\xb4\\x58\\x36\\x47\\x35\\x4b\\x4e\\x4a\\xcd\\xfc\\xf1\\x0a\\xd0\\x66\\x26\\x2b\\xaa\\xde\\x0b\\x3b\\x6e\\xd1\\x69\\x00\\x8d\\xb6\\xaa\\x13\\xfa\\x20\\x2b\\xf2\\x15\\x7e\\x8a\\x16\\x32\\xd0\\x82\\x7f\\xb8\\xc2\\xe3\\x8a\\x31\\x54\\x61\\xe3\\xd2\\x4e\\x17\\xe4\\x0d\\x9e\\x26\\x9f\\x98\\xc2\\x3d\\xdc\\x34\\x19\\x2b\\x23\\xd5\\xce\\x45\\xcf\\x18\\x6a\\x56\\x30\\x3e\\x1e\\x10\\x16\\xc3\\xf1\\x4d\\x45\\x72\\x3e\\x88\\x17\\xb4\\xba\\xa4\\x9c\\x94\\xea\\xb2\\x10\\x17\\xa8\\xfd\\xc1\\x7b\\xaa\\xdd\\x8c\\xb4\\x14\\x1c\\x47\\x8b\\x8e\\x7a\\x19\\xd6\\x83\\x7a\\x2e\\x81\\x3e\\x11\\x5c\\x69\\x2e\\xc0\\xa9\\x22\\x48\\xe6\\x03\\x25\\x0e\\x8d\\x38\\xf1\\x51\\x36\\xab\\x02\\xee\\x49\\x0c\\x0c\\x36\\x9a\\xaf\\xf8\\xd4\\xc5\\x4e\\xc4\\x9b\\xf2\\x32\\xc5\\x74\\x21\\xae\\xa7\\xc3\\x5c\\xaa\\x37\\x4b\\xca\\xd7\\x62\\x2e\\x5c\\xac\\xc5\\xc9\\xda\\xad\\x06\\xf2\\x0f\\x08\\xa8\\x13\\xa7\\x82\\x9a\\xf4\\xd0\\x33\\x09\\x61\\x89\\x76\\x83\\x44\\x1c\\x3e\\x12\\x6e\\x2e\\x5c\\x6a\\x7f\\xf5\\x07\\x87\\x36\\xd5\\x66\\xbc\\xd5\\x69\\xf4\\x86\\x5c\\xbe\\x6e\\xfe\\x04\\xeb\\x50\\xf3\\xe5\\x10\\x84\\x6d\\xea\\x4a\\x44\\x46\\x4d\\x21\\xf0\\x15\\x6f\\xcc\\x17\\x37\\xa0\\xf3\\xb9\\xf2\\x77\\xbb\\xc9\\x95\\xb5\\x87\\xa8\\x86\\x5e\\x7c\\x9c\\x41\\xe0\\x4b\\x44\\xff\\xa8\\x49\\xf6\\x40\\xa4\\xda\\x2d\\x72\\x58\\xb5\\xc3\\x28\\x24\\xd8\\x7c\\x36\\x4a\\x58\\x04\\x47\\x59\\x51\\xa6\\x55\\x83\\x5e\\x97\\x96\\x1c\\x5e\\x6f\\xf3\\x14\\xf4\\xf4\\x39\\xe7\\x64\\x20\\xca\\x56\\xd0\\xf0\\xb6\\x24\\xe3\\xc8\\x40\\x7b\\xf5\\xcf\\x94\\x77\\xcb\\x9a\\xaf\\x59\\x9a\\x00\\x42\\x59\\x57\\x6d\\x9f\\x41\\x53\\xb8\\xbd\\xe8\\x3a\\xcd\\x70\\xd1\\x04\\x3f\\xfd\\x81\\x37\\x2e\\xbe\\xa9\\xc7\\x45\\x2a\\xd6\\xad\\x6a\\x0a\\x1b\\xaa\\xed\\x4d\\x31\\x22\\x86\\x1e\\xff\\x1f\\x0f\\xe0\\xb3\\x50\\x16\\xb0\\xd9\\x13\\xd5\\x6a\\x22\\xf1\\x33\\xae\\xac\\x7c\\xd9\\x9e\\x82\\xf2\\x6f\\x5f\\x69\\xce\\xbd\\x83\\x30\\x36\\xa1\\x77\\xb0\\xe1\\xfe\\x3d\\xf3\\x61\\x98\\x53\\x13\\x68\\x46\\x4e\\xde\\x9d\\x90\\x13\\x39\\xb9\\x8f\\xc6\\xf2\\xba\\xd7\\x64\\xba\\x56\\x4e\\xa1\\x03\\xb9\\x6d\\xc8\\x3b\\x62\\x55\\x67\\x84\\x45\\xb3\\x2d\\xee\\xe9\\x31\\xe1\\x06\\xc9\\xff\\xfd\\x3f\\xc1\\x8c\\x1a\\x60\\x6e\\x6a\\xb6\\xad\\xf2\\x62\\x33\\x66\\xad\\x57\\xf5\\x6f\\x8a\\xde\\x56\\xc1\\x7c\\x45\\x59\\x0c\\x1b\\x5c\\x28\\xe5\\x1b\\x59\\xff\\xe6\\x17\\x68\\x6e\\x56\\xad\\x5b\\xcb\\x28\\x8c\\x7a\\xbd\\xcd\\xcd\\x73\\x00\\xfe\\x12\\x3a\\x96\\x85\\x4e\\xa3\\x9b\\xe2\\x01\\x9d\\xfb\\x17\\x7c\\x45\\xa2\\xa3\\x07\\x50\\xdb\\xf4\\xd5\\x0d\\x0e\\x25\\xbe\\x40\\x42\\x60\\x06\\x57\\xa0\\xb8\\x3d\\xfe\\x9f\\xf3\\x9f\\x7e\\x8c\\x8a\\x05\\x00\\x92\\x61\\x83\\xb4\\xd8\\xd0\\x8a\\xed\\x40\\x4d\\xa7\\x64\\xe0\\x22\\x10\\x56\\x99\\x89\\xe6\\xa7\\x0a\\x9c\\xee\\x34\\x9a\\x63\\x8d\\xe6\\x98\\xd6\\x4b\\x98\\x77\\xd1\\xe0\\x46\\x79\\x1a\\xd7\\xc2\\xe8\\x7e\\xa1\\xbe\\xec\\x05\\x90\\xab\\xda\\x8f\\x59\\x2c\\xe0\\x89\\xcf\\x7b\\x80\\x63\\x45\\x45\\x84\\x05\\x20\\x3f\\x74\\xac\\xa8\\x37\\xf2\\x8f\\x61\\xae\\x4c\\xf0\\x5b\\x0c\\xba\\x49\\xde\\x60\\xa4\\x9f\\x38\\xcb\\x47\\xd7\\x08\\x78\\xe7\\x94\\x69\\xa5\\x94\\xdf\\x8e\\xcd\\xec\\x23\\xbf\\x63\\x47\\xb5\\xee\\x3d\\x61\\x54\\x85\\xbd\\x79\\x61\\xdc\\x84\\x58\\x8d\\x9e\\xdc\\xfe\\x5b\\xfc\\x76\\x87\\xda\\x2a\\x1c\\x9b\\x05\\x23\\x72\\x3e\\x30\\xd9\\xec\\x78\\x47\\x70\\xe9\\xc2\\xab\\xb3\\xdb\\xb5\\xbf\\x7a\\x6e\\xab\\xa1\\x09\\x6d\\x88\\x9e\\x5b\\xd2\\x09\\x65\\x98\\xc6\\x8c\\x5e\\xf9\\xd3\\xbb\\xc9\\x3a\\xe1\\x02\\x17\\x01\\xa6\\x70\\x89\\x72\\xfe\\xf3\\x0b\\x31\\xf0\\xe4\\x98\\x4b\\xf3\\x8b\\xe2\\x1d\\xb7\\xb4\\x30\\x8b\\x1a\\xf5\\xb9\\x6b\\x5c\\x12\\x71\\x0c\\x35\\x37\\x31\\x25\\x78\\x91\\xfb\\x1c\\x63\\x60\\x09\\x33\\xe7\\x87\\xdd\\x75\\xe8\\xa2\\xa5\\x11\\xcc\\x13\\xf1\\x61\\x52\\xbf\\x3c\\x11\\x5e\\x10\\x49\\x84\\xe8\\x63\\x48\\xc0\\xc7\\x97\\x1b\\xaf\\x29\\x65\\xf1\\xf1\\xf5\\x9c\\xcc\\xc1\\xd8\\x94\\x37\\xcc\\x3b\\x0c\\x1c\\x1e\\xb3\\xe9\\x58\\x75\\x77\\xa2\\x0f\\xb3\\xdd\\x73\\x18\\x80\\xd7\\x1c\\xf3\\x98\\x10\\x07\\x76\\x30\\x19\\x66\\x2d\\xbc\\x62\\x6a\\x00\\xfa\\x2d\\x7f\\xac\\xea\\xce\\x5c\\xe6\\x9b\\x09\\x65\\xe7\\x28\\x41\\x50\\x11\\x3a\\xd8\\xc7\\xc5\\xaa\\xb4\\x83\\x5d\\xb0\\x5a\\x97\\x5c\\xcc\\x1a\\xbf\\x18\\x47\\x8c\\x43\\xff\\x55\\x9d\\x55\\xe9\\xeb\\x0e\\xfb\\xfd\\x00\\x2f\\x81\\x3c\\x88\\xd4\\x5e\\x56\\xa2\\xfe\\x4c\\xb8\\xcd\\x64\\xdb\\xf6\\x36\\x7b\\xea\\x28\\xdf\\x0c\\xf7\\xe6\\x8c\\x92\\xeb\\x4e\\x77\\xe8\\x2c\\xe8\\x2a\\xcd\\x5f\\xcb\\xb3\\x88\\xde\\x88\\xde\\x14\\x17\\xf4\\xbc\\x98\\x5d\\xb5\\x36\\xe6\\xae\\x1b\\xa4\\xd9\\xad\\x0e\\x8e\\xd3\\x11\\xd5\\x09\\x57\\x6c\\x6c\\x75\\x8f\\xa3\\x6e\\x67\\x1e\\x77\\x12\\x42\\xa9\\xbf\\xb5\\x99\\x98\\xdc\\x18\\xe2\\xac\\x28\\xa9\\x95\\x3b\\xaf\\xa4\\xc4\\x29\\x8b\\x11\\x4a\\x7c\\x72\\x72\\x42\\xd8\\x4a\\xbb\\xcf\\x2c\\x15\\xc9\\x47\\x86\\xfd\\xe2\\x3a\\xe7\\xf3\\x87\\x9a\\xcc\\x54\\x43\\x4d\\x21\\xb3\\x1d\\xdb\\x74\\xea\\x9a\\x34\\x19\\x89\\x7a\\x6c\\xed\\xbb\\xbb\\xc1\\x61\\x92\\xfb\\x0d\\xe3\\xd9\\x32\\x3e\\x35\\x5c\\x99\\x78\\xbd\\xb8\\xb4\\x96\\x81\\xf8\\xbc\\x17\\xb6\\x95\\x4e\\x6e\\x76\\xae\\xab\\x3b\\x61\\x44\\x97\\x5a\\xa9\\xd9\\x75\\x45\\x5d\\x41\\x15\\x67\\x7b\\xea\\x8c\\x6a\\x9a\\x79\\xce\\x9e\\xb0\\xdc\\x0c\\xf0\\x11\\x63\\xce\\x6e\\x54\\x74\\xa5\\xbd\\x49\\xf3\\x82\\xb9\\xe3\\xa9\\xae\\x13\\x33\\xf9\\xfd\\x86\\x30\\x73\\x53\\xce\\x79\\xe1\\xf6\\x3a\\xc5\\x3c\\xbf\\x01\\xbc\\x20\\xe4\\x1b\\xc0\\x7b\\xd8\\x49\\x3c\\x88\\xd2\\x3f\\x8f\\x85\\x2d\\x1c\\x3a\\x8d\\x9b\\xe3\\x4d\\x07\\x95\\x53\\x92\\xe7\\xa9\\x36\\x42\\x19\\xb4\\x5b\\xe7\\x5d\\x01\\x4e\\x49\\x81\\xd7\\xcd\\xbf\\x15\\x82\\xe5\\xd0\\xdd\\xe4\\xc7\\xe8\\x4f\\x8f\\x21\\x1c\\x37\\x7f\\x19\\xd6\\x9c\\x7a\\x6d\\xa0\\x74\\x0f\\x55\\x3d\\xbc\\x27\\x6c\\xd3\\xee\\xb8\\x9a\\xcc\\x71\\x91\\x91\\xcd\\x22\\x21\\x1d\\x4f\\x79\\xef\\x26\\xa8\\x49\\x82\\xb8\\x18\\x74\\xe6\\xd2\\x66\\xfa\\x8d\\xbc\\xde\\x12\\x27\\x69\\x56\\x71\\x0c\\x12\\x85\\xc6\\x40\\x40\\x7d\\x74\\xf4\\x0c\\xec\\xf0\\xf6\\x6b\\x3a\\x36\\x0f\\x91\\xd3\\x97\\xf7\\xa8\\x67\\xa8\\x51\\xa7\\xd3\\xd0\\x83\\x34\\x2b\\xe2\\xc9\\x48\\x21\\xde\\x28\\xcb\\x68\\x36\\x90\\xcf\\xf4\\xe0\\x78\\xbd\\xa1\\xe8\\x03\\x78\\xfb\\xbd\\x18\\x88\\xd4\\x79\\x73\\xc1\\x3b\\xbf\\xcd\\x20\\xfe\\xd0\\xee\\xcc\\xd2\\xed\\x61\\x72\\x9e\\x8e\\x40\\x78\\x68\\x25\\x22\\x74\\x14\\x1d\\x74\\xf1\\x0c\\xed\\x4d\\xe1\\xa0\\x56\\xfe\\xe8\\x33\\xcd\\x21\\x2d\\x3e\\x84\\xad\\x31\\xa2\\xae\\x41\\x37\\x0e\\x31\\x87\\x95\\xf5\\xa7\\x7e\\xf7\\xad\\xef\\xfa\\x06\\xc5\\x76\\x0e\\x86\\xd7\\xcc\\x59\\xfc\\x4c\\x5c\\x83\\xed\\x17\\xca\\xe0\\x18\\x4f\\x73\\x59\\xc3\\x09\\x01\\x0f\\xc0\\x68\\xbf\\xcc\\xbb\\x07\\xc8\\x45\\xab\\xb9\\x25\\xfa\\x98\\x31\\xb2\\xc3\\x3b\\x58\\xbd\\x1d\\xc1\\x36\\xe5\\xfb\\x1e\\x70\\xf8\\x91\\x37\\x44\\x03\\x5b\\x84\\xed\\x02\\x32\\x68\\x65\\xdc\\x3e\\x65\\x1b\\x4e\\x96\\xb8\\x47\\x3c\\x18\\xf9\\x44\\x23\\xa0\\x0d\\x7b\\xdc\\x0c\\xc4\\x3d\\x9a\\xa3\\xe7\\xa2\\x60\\x45\\x5e\\xa4\\xdf\\x9c\\x7f\\x0b\\x1d\\xf1\\x73\\xf3\\x6d\\xc8\\xef\\xa5\\x47\\x56\\xc9\\x56\\x5c\\x07\\x23\\x2b\\x08\\x09\\x55\\x6e\\xff\\xd6\\x5d\\x12\\x10\\x9f\\x26\\x09\\x99\\x41\\x4f\\xa4\\x31\\x6c\\x95\\x3f\\x8b\\x4f\\x62\\x72\\x8b\\xb1\\x34\\x2e\\xe2\\xeb\\x29\\xcd\\x48\\x9d\\x93\\x1d\\x5f\\xc1\\x53\\x71\\x38\\xdd\\x09\\xc9\\x19\\x45\\x5e\\x22\\x61\\x35\\xf4\\x9d\\x4d\\x26\\x50\\xbb\\x8e\\xf9\\x47\\x4d\\x12\\x3e\\xa7\\xa9\\x88\\x74\\x84\\xc7\\xc1\\xf9\\x68\\x86\\xe0\\xb3\\x00\\x8a\\x54\\x5b\\x99\\x8d\\x0f\\x3f\\xcb\\x60\\xaa\\x61\\x67\\xa9\\x71\\x25\\xb4\\x43\\x47\\x57\\x36\\x93\\x48\\x12\\x75\\x4f\\x85\\x57\\x0d\\xa2\\xf9\\xae\\xb4\\x20\\x86\\x9d\\xf6\\xf9\\xea\\x2b\\xed\\xef\\x7a\\x68\\x83\\xe2\\xe8\\xf6\\xb1\\x72\\x99\\x26\\xd5\\xba\\xa5\\x7a\\x4d\\xd3\\xd5\\xba\\x9a\\x40\\xb9\\x7e\\x72\\x26\\x12\\x8c\\x34\\xf4\\xa9\\x31\\x26\\xb3\\x12\\x26\\x49\\x2a\\xb3\\x33\\x89\\xbb\\x02\\xa5\\x8c\\xa5\\xa7\\x5e\\x67\\xba\\x5c\\x7e\\xfd\\x13\\x6a\\x70\\xb4\\x62\\x24\\xa0\\x92\\xed\\xba\\xce\\xb2\\x28\\x23\\xbb\\x82\\x13\\x2b\\x92\\x8a\\x42\\xfe\\x17\\xba\\x24\\x75\\x56\\x81\\x87\\xb5\\xe2\\xba\\xbc\\x5f\\xac\\x00\\x01\\x06\\xec\\xf7\\xfc\\xb7\\x11\\x9d\\x8f\\x45\\x76\\x62\\x9b\\xcf\\x61\\x8b\\xb0\\xac\\x6e\\xec\\x11\\xa2\\x83\\x86\\x53\\xf3\\xe8\\xfd\\x82\\xea\\x8d\\x4a\\x2b\\x26\\x69\\xf3\\xb1\\x87\\xf5\\xcf\\xfa\\x3a\\x84\\x3f\\xbf\\x08\\xf6\\x84\\x41\\xad\\xe4\\x61\\x1c\\xb9\\x65\\xba\\xca\\xe5\\xc1\\x8e\\x20\\x3a\\x2d\\xd5\\x30\\xf0\\x52\\x0d\\x07\\x3d\\xc1\\x51\\xab\\x0a\\x21\\x81\\xa0\\xdf\\x07\\x34\\xa3\\x1b\\xbc\\x9c\\x87\\x63\\xb7\\x49\\x08\\xa3\\xae\\x65\\xeb\\xb1\\xd3\\x3a\\x39\\x61\\x81\\xd3\\x23\\x82\\xa5\\x9f\\x70\\x8d\\x52\\x0a\\xa1\\x16\\x51\\x04\\x12\\x53\\x44\\x56\\x24\\x85\\x97\\xeb\\x42\\xa5\\x01\\xba\\xe9\\x4c\\x02\\x69\\xe6\\x89\\x6d\\xc6\\x0c\\xa4\\xd1\\xd0\\x17\\xe4\\xf1\\xb9\\x00\\x0e\\xb4\\x8c\\xcd\\x6e\\xc1\\x52\\x7a\\x07\\x76\\x83\\x7d\\x76\\x81\\x0e\\x20\\xeb\\xa5\\x49\\x91\\x30\\x7e\\xe0\\x09\\x31\\xf1\\x64\\xa4\\x78\\x31\\xd2\\xcc\\x0e\\xdf\\xdb\\xfe\\xbb\\xb6\\x48\\xe7\\x9b\\xf5\\x06\\xe0\\x07\\xa5\\xa0\\x94\\x69\\xc8\\xed\\x53\\x1b\\x4b\\xe1\\xbf\\x8e\\x16\\xee\\x55\\x70\\x68\\x93\\x8a\\xc7\\x65\\x35\\xca\\x1a\\xaa\\x17\\x3b\\x76\\xa3\\x13\\x74\\xc8\\xfc\\x1e\\xce\\x75\\x91\\x24\\x6a\\x2c\\x8a\\x93\\x60\\x79\\x94\\xa8\\x06\\xa6\\x3f\\x98\\x39\\x49\\x94\\x07\\x01\\x07\\x9e\\xd5\\x8c\\xba\\xe0\\x36\\x69\\x35\\xe3\\x86\\x7f\\xb6\\x20\\xf1\\x3b\\xe5\\x47\\x0c\\x37\\xa9\\xc4\\x51\\xe7\\x5f\\xe6\\x30\\xb5\\x6d\\x06\\xbb\\x71\\x3b\\x5b\\x6b\\x4d\\x04\\xac\\x7f\\x63\\xcc\\x09\\x88\\x31\\xf2\\xcf\\x57\\x71\\x47\\xf0\\x7c\\x9c\\x6a\\xfe\\xa4\\x73\\xe1\\x86\\x6c\\xd7\\x60\\x01\\xbf\\x2b\\x1b\\x02\\x0e\\x40\\x18\\x02\\xec\\x50\\xf7\\x12\\xd5\\xa9\\x93\\x17\\x80\\xef\\x25\\x2f\\x1d\\x47\\xa6\\xb0\\x6c\\x32\\x7a\\x50\\x22\\x1b\\xa0\\x1d\\x42\\x5d\\x73\\x6b\\xc2\\x3d\\xf0\\xab\\x43\\xbc\\x5a\\x7f\\xee\\x7d\\x61\\x38\\x90\\xa2\\xf9\\x48\\x8a\\x2c\\x20\\xae\\xf9\\x5d\\xe1\\x73\\x6f\\xa8\\x80\\x6e\\xb0\\xef\\xc3\\xf2\\x1e\\xaf\\x02\\xab\\x87\\x80\\xf7\\x7a\\x19\\x58\\xb6\\x39\\xb5\\x73\\xa6\\xd7\\x0d\\xd8\\xcd\\x06\\xde\\xba\\xbe\\x75\\x83\\x2f\\x94\\xa2\\x3b\\x34\\xf8\\x76\\x77\\x61\\xf0\\xf9\\xbd\\xd8\\x03\\xb7\\xbe\\x79\\x5b\\xa9\\x96\\x8c\\x7c\\x71\\xd8\\xee\\x13\\x1f\\xc8\\x49\\xe3\\xc5\\xe6\\x96\\xaf\\x4c\\x60\\xd2\\x48\\x77\\x2c\\xd1\\x56\\x47\\x7d\\x98\\x70\\x85\\x0a\\x38\\x56\\xac\\xd0\\x6a\\xb4\\x3c\\xc7\\x4a\\x13\\x90\\x1c\\xe3\\xb5\\x17\\x3e\\xca\\x68\\x2e\\x03\\xd6\\x35\\xe1\\x88\\x68\\x26\\x8c\\x80\\x86\\xcb\\x92\\xb3\\x2f\\x8e\\xbf\\x38\\x1a\\x25\\x77\\xc0\\xd0\\x48\\x3d\\x9c\\xa7\\x9e\\xda\\x3c\\x2c\\x6a\\x9f\\xfe\\x06\\x4e\\x9a\\x5e\\xba\\xc5\\x50\\x07\\x0d\\xfc\\x5c\\x8f\\xb5\\xd3\\x6b\\xf0\\x21\\x0c\\x1c\\x0f\\x52\\xe5\\xa0\\xe7\\xa2\\x4c\\x68\\x9c\\xc1\\x23\\x26\\x17\\x84\\x45\\xc9\\xd7\\x98\\x57\\x04\\x1e\\xb8\\x7a\\xd4\\x96\\x48\\x4f\\xfd\\xa7\\xc9\\xd7\\x9f\\x4a\\x32\\xa5\\xd8\\xff\\x83\\x37\\x78\\xc4\\x61\\xfc\\xbf\\x00\\x00\\x00\\xff\\xff\\x4e\\xc4\\xb8\\x78\\x7a\\xc5\\x01\\x00\")\n\nfunc uiTsTypingsD3D3DTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsTypingsD3D3DTs,\n    \"ui/ts/typings/d3/d3.d.ts\",\n  )\n}\n\nfunc uiTsTypingsD3D3DTs() (*asset, error) {\n  bytes, err := uiTsTypingsD3D3DTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/typings/d3/d3.d.ts\", size: 116090, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsTypingsJqueryJqueryDTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xec\\xbd\\x6b\\x73\\xdc\\xc6\\xb1\\x30\\xfc\\x5d\\xbf\\x02\\xc5\\x4a\\x95\\x96\\x7e\\x96\\x54\\x7c\\xce\\x79\\xea\\xe4\\x50\\x8e\\xf5\\xd0\\x14\\x6d\\x33\\x91\\x44\\x1d\\x91\\x8a\\x9d\\x72\\xb9\\xde\\x02\\x17\\xb3\\x24\\x2c\\x2c\\xb0\\x01\\xb0\\xa4\\x18\\xdb\\xff\\xfd\\xed\\xdb\\xdc\\x70\\x5b\\xec\\x95\\x5c\\x59\\xf9\\x10\\x53\\x0b\\x60\\xa6\\x6f\\xd3\\xd3\\xdd\\xd3\\xd3\\xfd\\xec\\x59\\x70\\x79\\x3f\\x55\\x41\\xa4\\xc6\\x71\\x1a\\x97\\x71\\x96\\x16\\xc1\\x38\\xcb\\x83\\x5f\\xfe\\x77\\xa6\\xf2\\xfb\\xe0\\xcb\\xc3\\x2f\\xff\\x7c\\xf8\\x31\\x78\\x16\\xfc\\xc7\\x21\\xfc\\xf7\\x09\\xbc\\xfd\\x36\\xcf\\x7e\\x51\\xa3\\xf2\\x28\\xb8\\x29\\xcb\\xe9\\xd1\\xb3\\x67\\xbf\\xfc\\x0b\\x5f\\x3c\\x1c\\x65\\x93\\x67\\xf8\\xf8\\xa5\\x33\\xce\\xd5\\xfd\\x51\\xf0\\x4d\\x96\\xc7\\x45\\xf0\\xcf\\x30\\xfd\\x90\\xdd\\x06\\x5f\\xe1\\x37\\x05\\x7c\\x74\\x1d\\x97\\x37\\xb3\\x2b\\xfa\\xe8\\x0a\\x5f\\xb8\\xa7\\xe7\\xcf\\xbe\\x1e\\x06\\x27\\x37\\xf0\\xcf\\x32\\x0e\\xd3\\xe0\\xfb\\x6c\\x3c\\x9e\\x28\\xf8\\x87\\xca\\x1b\\x3f\\x1c\\xdd\\xd8\\x17\\xe0\\xc3\\x8b\\x52\\xdd\\xaa\\xe0\\x5b\\x95\\x96\\x59\\xda\\xf8\\x3e\\xbd\\x70\\xc0\\x2f\\xc0\\xfb\\x2f\\xe3\\x59\\x92\\xa8\\x38\\xf8\\x2e\\x9b\\xa8\\xa2\\xf1\\x03\\x79\\x03\\xde\\xbd\\x0c\\x8b\\x22\\x38\\x4b\\xe2\\x6c\\x9a\\xcd\\x92\\xac\\xf9\\xed\\x32\\x2c\\xb2\\x38\\xc1\\xb7\\xff\\x06\\x7f\\xa5\\xc1\\xc5\\x9d\\x0a\\xf3\\x38\\xbd\\x56\\xcd\\xd0\\xfc\\x82\\x2f\\x15\\x07\\x69\\x76\\x1b\\x26\\x2a\\x1c\\x23\\x02\\x0a\\x91\\x8e\\x93\\xa4\\xf1\\xfd\\x02\\x9e\\x16\\x1f\\x70\\xf8\\xef\\x66\\xb3\\x02\\xa0\\xce\\x8a\\x42\\xa5\\xcd\\xa0\\xc0\\x1b\\xff\\x86\\x17\\xff\\xae\\x92\\xe4\\x3e\\xb8\\x98\\x4d\\x26\\x2a\\x4f\\xe2\\x66\\x30\\x3e\\x14\\xfa\\x31\\x7c\\xf0\\x4d\\x58\\x84\\x79\\x58\\x06\\xc7\\x49\\x1c\\x5c\\xdc\\xab\\xa8\\x99\\x5f\\xfc\\x12\\xbc\\xfe\\x26\\x06\\x16\\x24\\x61\\x11\\xfc\\x90\\x25\\xb7\\x2a\\x2f\\x5a\\xe8\\x9e\\xde\\xe9\\xc7\\x48\\x75\\x95\\xab\\x0f\\xc1\\x49\\x3c\\x52\\x79\\x96\\xaa\\xc6\\xf7\\x23\\x7c\\x65\\x24\\x6f\\xc0\\x27\\xc7\\x69\\x94\\xab\\xbb\\xe0\\xbb\\xb0\\x98\\x86\\xcd\\x92\\xc0\\x6f\\xf0\\x0b\\x44\\x7f\\xe4\\xe8\\xf7\\x61\\x0e\\x92\\x04\\x30\\x7d\\x1b\\x17\\x37\\x2d\\x22\\xf4\\x0b\\xbe\\x79\\x33\\xa6\\x17\\x88\\x03\\xf1\\x07\\xc0\\x29\\x0e\\xfe\\x9e\\xa5\\x51\\xd6\\xc2\\x06\\x7e\\x05\\xa9\\xa5\\x52\\xf8\\x1e\\xe8\\xfa\\xb7\\x70\\xf4\\x61\\x12\\x36\\x23\\x7f\\x25\\x2f\\xfd\\xc2\\xef\\xc0\\x67\\x6f\\x41\\x84\\x82\\x8b\\x2c\\x07\\xe6\\xb5\\x88\\x46\\xf1\\xe7\\xff\\xf9\\xcf\\xff\\xf8\\x9f\\xff\\x42\\x4c\\xb2\\xe2\\x06\\x04\\x3b\\xcf\\xae\\x9a\\x85\\x02\\x9f\\xf3\\x63\\x7a\\xf9\\x26\\x0d\\xde\\xa9\\x18\\x99\\xde\\x88\\x2c\\x3c\\x4f\\xef\\x73\\x7a\\xe1\\x19\\x2d\\x80\\xd1\\x87\\xe0\\x16\\xe0\\x8e\\x00\\x8e\\x6f\\x40\\x54\\x3f\\xb4\\xac\\x82\\xd1\\x87\\xdb\\x88\\x9e\\x7f\\x5d\\x59\\xe0\\xac\\x03\\x3a\\xd6\\xb3\\xbc\\xab\\x92\\x7b\\xd4\\x31\\xd1\\x93\\x27\\xcf\\xbe\\x08\\xbe\\x58\\xe7\\xff\\x9e\\x9c\\x64\\xd3\\xfb\\x3c\\xbe\\xbe\\x29\\x83\\xc1\\x68\\x3f\\x78\\x1d\\x8f\\xf2\\xac\\xc8\\xc6\\x65\\x70\\x92\\xe5\\xd3\\x0c\\xc4\\x14\\xc0\\x3c\\x04\\x79\\x4e\\x02\\x7a\\xa9\\x08\\x72\\x55\\xa8\\xfc\\x56\\x45\\x87\\x4f\\x5e\\x81\\x84\\x01\\x0b\\xa2\\x60\\x96\\x82\\xc4\\x05\\xe5\\x8d\\x0a\\x8e\\xa7\\xe1\\x08\\xfe\\x23\\x4f\\x86\\xc1\\x3f\\x40\\x6a\\x61\\x00\\xd4\\x7d\\xc1\\x00\\x5f\\xd8\\x93\\x47\\x7b\\xfb\\xcf\\x83\\xfb\\x6c\\x16\\x4c\\xc2\\xfb\\x20\\xcd\\xca\\x60\\x56\\xa8\\x27\\xe5\\x0d\\xe8\\xb9\\x71\\x9c\\xa8\\x40\\x7d\\x1c\\xa9\\x69\\x19\\x80\\x64\\x00\\x3d\\xa6\\x09\\xe8\\xb2\\x91\\x0a\\xee\\x80\\x42\\x34\\x89\\x0c\\x71\\x18\\xfc\\x53\\x06\\xc8\\xae\\xca\\x10\\xde\\x0d\\xe1\\xed\\x29\\xfc\\x6b\\x8c\\x6f\\x69\\xe8\\x02\\x58\\x8d\\xa2\\x67\\xef\\xee\\xee\\x0e\\x43\\x02\\xf0\\x30\\xcb\\xaf\\x9f\\x25\\xfc\\x42\\xf1\\xec\\xd5\\xd9\\xc9\\xe9\\x9b\\x8b\\xd3\\x03\\x00\\xf2\\xc9\\x93\\xcb\\xef\\xcf\\x2e\\x82\\x93\\xf3\\x97\\xa7\\x01\\xfc\\xf7\\xed\\xbb\\xf3\\x7f\\x9c\\xbd\\x3c\\x7d\\x19\\x7c\\x71\\x7c\\x01\\xff\\xfe\\x22\\xf8\\xe6\\xf8\\xe2\\xec\\x62\\x18\\xfc\\x70\\x76\\xf9\\xfd\\xf9\\xfb\\xcb\\xe0\\x87\\xe3\\x77\\xef\\x8e\\xdf\\x5c\\x9e\\x9d\\x5e\\x04\\xe7\\xef\\xe0\\xab\\x37\\x2f\\xcf\\x2e\\xcf\\xce\\xdf\\xc0\\xbf\\xbe\\x0d\\x8e\\xdf\\xfc\\xf3\\xc9\\xdf\\xcf\\xde\\xbc\\x1c\\x06\\xa7\\xf0\\xf6\\xe9\\xbb\\xe0\\xf4\\xc7\\xb7\\xef\\x4e\\x2f\\xe8\\xcd\\xb3\\xd7\\x6f\\x5f\\x9d\\x9d\\xc2\\xa3\\xb3\\x37\\x27\\xaf\\xde\\xbf\\x3c\\x7b\\xf3\\x9d\\x19\\xf2\\xd5\\xd9\\xeb\\xb3\\xcb\\x63\\x1c\\x05\\x47\\xd0\\x6f\\x3e\\xe9\\x9a\\xe9\\xf2\\xec\\xf2\\xd5\\xe9\\x30\\xf8\\xf6\\xec\\xf2\\x0d\\x8e\\xff\\x2d\\xbc\\x70\\x1c\\xbc\\x3d\\x7e\\x77\\x79\\x76\\xf2\\xfe\\xd5\\xf1\\xbb\\xe0\\xed\\xfb\\x77\\x6f\\xcf\\x2f\\x4e\\x87\\x4f\\x5e\\x9f\\xbe\\x3b\\xf9\\x1e\\x46\\x39\\xfe\\xe6\\xd5\\xd9\\xe5\\x3f\\x71\\xa0\\x37\\xe7\\x6f\\x0e\\xce\\xde\\x7c\\xfb\\x0e\\x20\\x38\\x7d\\x7d\\xfa\\xe6\\xf2\\xf0\\xc9\\x93\\x0b\\xa5\\x5c\\x56\\xba\\x1c\\xd4\\x24\\xc5\\xdd\\xad\\x98\\xaa\\x51\\x3c\\x8e\\x47\\x41\\x12\\xa6\\xd7\\xb3\\xf0\\x5a\\x05\\xd7\\x19\\xe8\\xa8\\x14\\xf4\\x75\\x30\\x55\\xf9\\x24\\x2e\\xf0\\xb3\\xe2\\x49\\x98\\x46\\x41\\x12\\x4f\\xe2\\x32\\xe4\\x1d\\xcd\\xca\\x8a\\x66\\xe3\\x93\\xb5\\xca\\x73\\xf0\\xc5\\xb3\\x27\\xb8\\x4a\\xbe\\x78\\x12\\x7c\\x11\\x9c\\xa5\\xb0\\xb3\\x8d\\xc3\\x11\\x83\\x4c\\x58\\xfd\\xed\\xf8\\xc7\\xa0\\x50\\x65\\x89\\x70\\x96\\x37\\x20\\x1c\\x77\\xb8\\x5f\\x8c\\xb2\\x74\\x1c\\x5f\\xcf\\x72\\x65\\x5f\\xca\\x15\\x6c\\xcb\\x45\\xf9\\x04\\x07\\x8c\\xcd\\x38\\x7f\\xa3\\x4d\\xfd\\xf8\\x97\\xf0\\xe3\\x05\\x0f\\x52\\x04\\xbf\\x3e\\x09\\xe0\\x7f\\x34\\x23\\xfe\\xef\\x8b\\xe0\\x12\\x86\\x80\\x01\\x4b\\xd8\\x27\\x83\\x12\\x2d\\x83\\x02\\xff\\x02\\x01\\xc5\\xb1\\x65\\xd8\\xe0\\x46\\x85\\x4c\\x08\\x00\\x01\\x96\\x77\\x52\\xd0\\x53\\x5a\\x5a\\x79\\x70\\x87\\xbf\\x7e\\x88\\x81\\x74\\x20\\xcc\\xb0\\xe0\\xa6\\x19\\x92\\x3d\\x16\\x60\\xc3\\x91\\x5e\\x1d\\xb9\\x2a\\x67\\x39\\x2c\\xcf\\x33\\x12\\x79\\x79\\x50\\x18\\xfc\\x52\\xa5\\xa2\\x22\\x98\\x64\\x11\\x32\\x8a\\xe8\\x3f\\xc4\\x41\\x62\\x5c\\xc4\\xb0\\xb0\\x26\\x0a\\x78\\x11\\x05\\x65\\x16\\x80\\xaa\\x2e\\xb2\\x20\\xc3\\x55\\x26\\x60\\xfe\\xe9\\x30\\x64\\x1c\\x67\\xd3\\xc1\\x7e\\x30\\x51\\xe5\\x4d\\x06\\x2b\\x9e\\x11\\x7c\\x46\\xff\\x95\\xc9\\x5e\\x1c\\x05\\x61\\x7a\\xff\\xbc\\x4a\\x83\\x6f\\xee\\xd1\\x1e\\x0a\\x67\\x49\\x39\\x0c\\x42\\x54\\x1e\\x8c\\x76\\x11\\x84\\xb9\\xd0\\x23\\x2c\\xee\\xd3\\xd1\\x0d\\xec\\x50\\xd9\\xac\\x00\\x7d\\x3b\\x88\\x0f\\x61\\x45\\x93\\x0a\\x88\\x09\\x03\\x84\\xab\\xcc\\x67\\x0a\\x6c\\x20\\x3d\\xd4\\x3e\\x61\\x8a\\x6a\\x03\\x31\\x0b\\x9c\\x01\\xcc\\xf8\\x43\\xfe\\x14\\x87\\xc9\\xa6\\x88\\x31\\x0e\\x33\\x0e\\x13\\x54\\x17\\x27\\xa0\\xd9\\x8a\\x83\\x28\\x9b\\x84\\x44\\x3a\\x0d\\x10\\x50\\x39\\x0a\\xcb\\x10\\xf5\\xeb\\x51\\xb0\\xf7\\x0b\\x6c\\x78\\xd3\\x3d\\xfb\\x18\\x48\\x83\\xfa\\xa9\\x98\\x4d\\x41\\x1b\\x96\\xde\\x9c\\x19\\xc8\\xb9\\xe8\\xc7\\x37\\x59\\xa9\\x98\\x97\\x4d\\x40\\x91\\x92\\x2a\\xd5\\x04\\xf5\\x69\\x1e\\x03\\xb2\\x49\\x06\\x1b\\x07\\x92\\xf9\\x2a\\xcf\\xee\\x80\\xe7\\xc3\\x20\\x8a\\x8b\\xf0\\x2a\\x41\\xa6\\x01\\x35\\x81\\xb6\\xbc\\x58\\xee\\x6e\\x50\\x1b\\xba\\x62\\x03\\x78\\xe1\\xc3\\x5b\\x40\\xe7\\xb8\\x40\\xe9\\x30\\x56\\xe6\\x5f\\x86\\xf4\\x22\\x28\\x52\\xfc\\x99\\xa8\\x7b\\xc4\\x98\\xb3\\xe6\\xfc\\xe5\\x5f\\x3f\\x7e\\xff\\x2e\\x18\\xfc\\xe9\\x10\\xb6\\x14\\x95\\xe7\\x2a\\xda\\xc7\\xc1\\x22\\x35\\x05\\x59\\x08\\x4b\\x15\\x89\\x3e\\x9e\\x15\\xa4\\x8c\\x59\\x1a\\x67\\xc0\\xe3\\xa2\\x78\\x06\\xaf\\x67\\xf9\\x33\\x52\\xc5\\x0a\\xf0\\x1c\\x01\\x43\\xaf\\x60\\x37\\x16\\x0a\\x03\\xc3\\x52\\xb0\\x20\\xc3\\x48\\x34\\x2f\\xc8\\x7e\\xce\\x32\\x1b\\x21\\x3e\\x2c\\x3b\\x85\\x7e\\xc8\\x60\\x64\\x57\\x68\\x01\\xe3\\x04\\x37\\x00\\x2a\\xff\\x78\\x18\\x81\\xb5\\x02\\xc2\\x26\\x2b\\xd5\\x42\\x26\\x8f\\x05\\x9a\\xc1\\x7e\\x45\\x0e\\x11\\x53\\x90\\xc2\\xab\\x2c\\x03\\x33\\x30\\xad\\x49\\xe2\\x71\\x00\\xe3\\x1c\\x68\\xfa\\x19\\xd8\\xc7\\xb3\\x74\\xc4\\xf2\\x81\\x5c\\x1b\\xc1\\x26\\x7e\\x45\\xc4\\xa3\\xf5\\x40\\x4b\\xe6\\xde\\x81\\x77\\x00\\x12\\x63\\x28\\xfd\\x5f\\x87\\x1f\\x87\\xc1\\x8f\\xaf\\x5f\\x7d\\x7f\\x79\\xf9\\xf6\\x1d\\x8f\\xbb\\xaf\\x31\\xba\\x52\\xa0\\x69\\x94\\xac\\x32\\x94\\xf3\\xc3\\xe0\\x3d\\x51\\x13\\xfe\\x09\\x03\\xa3\\x70\\x8e\\x80\\xc4\\xd9\\x44\\x14\\x00\\x08\\xac\\x2a\\x47\\x87\\xa4\\x33\\x78\\x2a\\x94\\xc7\\x42\\xeb\\x16\\x1e\\x95\\x57\\xcd\\x14\\x4c\\x68\\x00\\x2f\\xc4\\x7f\\x5d\\xcf\\x60\\xf1\\x96\\x05\\x7e\\xc7\\x0b\\x06\\xe0\\x47\\xa5\\x14\\x9c\\xde\\xd2\\x9c\\xef\\x48\\x31\\x20\\xf9\\x59\\x02\\x64\\x55\\x33\\x74\\x17\\xb0\\xee\\x2d\\xfe\\xac\\xff\\x70\\x87\\x4d\\x5c\\x49\\xab\\xc9\\xd7\\xff\\x1d\\x56\\x87\\x90\\x05\\x46\\x03\\x5c\\xb1\\x58\\x00\\x7c\\xb9\\xba\\x0e\\xf3\\x28\\x01\\x4e\\x69\\x96\\x93\\x0e\\x24\\x45\\xc6\\x23\\x7b\\xec\\xb3\\xe3\\xbd\\x08\\x06\\x44\\x81\\x23\\x51\\xb2\\xf0\\xe7\\xd0\\x50\\xe2\\xa8\\x41\\xf3\\xee\\x37\\xab\\x1e\\x50\\x11\\xa2\\x3e\\x08\\xf7\\xa1\\xd1\\x9b\\x30\\xd1\\xc8\\xe0\\x07\\x90\\x4e\\x61\\xd7\\x2a\\x68\\x75\\xc3\\xbb\\x84\\x00\\x6c\\x78\\x11\\xea\\x1b\\x67\\x69\\xf2\\xda\\x3e\\x0a\\x64\\x52\\x7e\\xc9\\x0c\\xce\\x03\\x67\\x29\\xac\\xe9\\xbb\\x2c\\xff\\xc0\\xa2\\x3f\\x2a\\xf1\\x9f\\xb8\\xe6\\xbe\\x3f\\x3d\\x7e\\x49\\x0c\\xfd\\xee\\xf4\\xd2\\x68\\x03\\x50\\x62\\x25\\xbd\\x8d\\xee\\x5d\\x10\\x4e\\xa7\\x8a\\x17\\xca\\xde\\xff\\xf7\\xd7\\x5f\\xcb\\x18\\xcc\\xe9\\x32\\x9c\\x4c\\x7f\\xdf\\x23\\xfd\\x07\\x53\\xe1\\xa7\\x60\\x95\\x83\\x9d\\x0d\\x7b\\x50\\xc1\\x92\\x62\\xfe\\x8d\\xac\\x47\\x04\\x50\\x1f\\x02\\xe8\\xb8\\xcb\\x65\\x25\\xda\\xea\\x48\\xf3\\xc2\\x21\\x3a\\xca\\x99\\x31\\xaa\\xce\\x4e\\xff\\x02\\xaa\\x45\\xa1\\xc5\\x04\\x86\\xc1\\x25\\x0e\\x32\\x01\\x61\\xc4\\x19\\xc3\\xe0\\xfd\\xbb\\x57\\xbc\\x26\\x6e\\x50\\xd2\\x92\\x1c\\xc4\\xf4\\x1e\\xa8\\xa3\\x52\\x87\\x72\\x08\\x37\\x02\\xe6\\xb3\\x92\\x48\\xd3\\xb9\\x12\\xed\\xa2\\xcb\\x1c\\x89\\x21\\x50\\x5c\\x25\\x87\\x26\\x2f\\x38\\x14\\x45\\x30\\x08\\xc7\\x88\\xa4\\xac\\x7c\\xa2\\x24\\xe9\\x22\\xb3\\x8c\\x79\\x65\\xa8\\x8f\\x6a\\x34\\x03\\xb8\\xf6\\x99\\x3a\\x66\\x96\\x6b\\x05\\x4b\\x47\\x96\\x4d\\x79\\x97\\xd9\\x75\\x73\\xe4\\xac\\xb7\\xde\\x4b\\x1b\\x67\\x0f\\x83\\xa2\\xcc\\x59\\x0c\\x4a\\x75\\x0d\\x76\\xfa\\xbf\\xd9\\x8e\\x00\\x5d\\x09\\x06\\xce\\xcc\\x88\\xbc\\xc6\\x64\\xb0\\x27\\xb0\\xef\\x0d\\x83\\x3d\\x60\\x14\\xef\\xc5\\x2a\\xc2\\x7f\\x12\\x26\\xf8\\x07\\x32\\x3d\\x9b\\x95\\xf8\\x67\\x08\\xb6\\x3f\\xfe\\x01\\x28\\xee\\x01\\x93\\x41\\xfe\\xf8\\xad\\xfd\\xb6\\xe5\\x68\\x94\\x72\\x61\\xe4\\x33\\xd5\\x06\\x02\\xfe\\x95\\xe7\\x21\\x59\\xc4\\x9a\\x26\\x20\\x40\\xa7\\xc0\\xa6\\xca\\xf2\\xb7\\xbc\\x40\\x45\\x41\\x26\\x45\\xb3\\x62\\xf1\\xf9\\x2d\\x73\\x37\\x2e\\xdc\\x52\\x7d\\x2c\\x2f\\x88\\x26\\x47\\x42\\xb3\\x96\\xe5\\x7a\\x9c\\x6a\\x02\\x03\\x98\\xfc\\xe6\\x33\\xd0\\x21\\xb3\\x24\\xcc\\x0f\\xd4\\x47\\xd0\\xdd\\x64\\x48\\x02\\x1b\\xe3\\xbc\\x60\\xc1\\x8c\\x50\\xf2\\xc1\\x23\\x54\\xc1\\x4d\\x76\\xa7\\x29\\x42\\x78\\x10\\xc9\\x84\\x01\\x6c\\x34\\x0d\\x83\\x6b\\xd8\\x2c\\x53\\xd0\\x01\\x85\\x67\\x93\\x1d\\x06\\x83\\x5b\\xb1\\x6c\\xc3\\x08\\x96\\xce\\x11\\x92\\x74\\xbf\\x82\\x1e\\xbd\\x8e\\x16\\xce\\xaf\\xc1\\x4f\\x1f\\xd4\\xbd\\x46\\xe4\\x67\\x46\\x24\\xf8\\x5d\\x70\\x79\\x76\\x3c\\x82\\x75\\x4f\\x6b\\x18\\xe4\\x9a\\xe1\\x21\\xf3\\x09\\x8c\\xaa\\x19\\xaa\\x9c\\x51\\x16\\x01\\x20\\xf8\\xcb\\x53\\x63\\x96\\xc0\\x2e\\x3e\\x0b\\xd1\\xd1\\x84\\xff\\x03\\x45\\xa3\\x67\\xa3\\x48\\x92\\x6c\\x14\\xf0\\x9f\\x3d\\xd2\\x32\\x7b\\x32\\xcf\\x82\\xce\\xe2\\x33\\xb0\\xc1\\x41\\x0a\\x9f\\xfd\\xf7\\x7f\\xfd\\x47\\x95\\xe8\\x3f\\xe0\\x92\\x2b\\x44\\xf1\\xa0\\xf5\\xa3\\xb5\\x0d\\x1b\\xa0\\x43\\x31\\x01\\xe2\\x2a\\xd1\\x5e\\xb2\\x21\\x86\\x82\\xb1\\x07\\x9a\\x2b\\x11\\xb3\\xf2\\xd9\\xc7\\x03\\x70\\xae\\x0e\\x40\\xfd\\x4c\\x0e\\x66\\x79\\xa2\\x52\\xc4\\x18\\x2c\\x8a\\xd1\\x0d\\x32\\xa4\\xfc\\xeb\\xfb\\xcb\\x6f\\x0f\\xfe\\x02\\x62\\x0d\\xf6\\x0c\\xc8\\x1e\\x79\\x79\\x29\\xdb\\xe4\\x93\\x8c\\x36\\x65\\x70\\xc3\\x8c\\x6d\\x07\\x4c\\x87\\x71\\x63\\x54\\xa2\\xb8\\x76\\x03\\xf1\\xec\\x08\\x8c\\x83\\x52\\xe8\\xc3\\xf6\\xe9\\x60\\x9f\\x56\\x41\\x2a\\xfb\\x6d\\x98\\xdc\\x85\\xf7\\xbc\\xed\\xfa\\xf8\\x04\\x03\\x45\\x42\\x30\\x06\\x65\\xc9\\xe8\\xca\\xee\\x2c\\x1a\\xe3\\x87\\xff\\x3c\\xa1\\x55\\x0f\\xe4\\x95\\x55\\x6f\\xfc\\x1b\\xc2\\x0f\\xcc\\xb3\\x11\\xc8\\xb2\\x12\\x01\\xa4\\x85\\xc7\\xa8\\x39\\xd3\\x12\\x92\\xcf\\xe5\\xc3\\x7b\\x36\\xe5\\x58\\x19\\xeb\\x77\\x49\\x46\\x51\\x5d\\xf3\\x4e\\xe4\\xec\\x32\\x08\\x2e\\xbc\\x95\\x5e\\xf3\\xaf\\x44\\x40\\x18\\xa1\\xba\\xde\\x8c\\x88\\xb4\\x58\\xdd\\xb4\\x68\\x65\\x35\\xe9\\x85\\xcd\\x9a\\x5d\\xbb\\x24\\x1f\\x69\\x99\\xa1\\x45\\x8e\\xab\\x1a\\xcc\\xa2\\x84\\x2c\\x2c\\xa3\\x4f\\x0f\\x3d\\xcb\\xdd\\xfd\\x8c\\x75\\x81\\x0c\\x4e\\x64\\xc8\\xd1\\x42\\x43\\x2a\\xb2\\xef\\xc2\\x12\\xaf\\x2d\\x17\\x32\\xa5\\xc4\\xec\\xc0\\xd1\\xd1\\xf2\\x0c\\x5d\\xb7\\x69\\xa2\\xf2\\x6b\\x54\\xfe\\xda\\xab\\x37\\x5f\\x6a\\x85\\xad\\x99\\xbc\\xdf\\x40\\x85\\x8f\\x65\\x0b\\x05\\xac\\x36\\xc1\\xf7\\xc0\\xd0\\xd7\\x02\\x8e\\x54\\x3b\\x28\\xb3\\x03\\xfd\\x37\\x3e\\x07\\xc9\\xe0\\x3d\\x95\\x54\\xa2\\xf9\\x01\\x16\\xe9\\x6d\\x98\\x80\\xe7\\x81\\x28\\x57\\x0c\\x45\\xf6\\xb8\\x18\\xe1\\x32\\x0f\\xd3\\x02\\x65\\x1e\\xa0\\xe5\\x0f\\x8c\\xf6\\x67\\xe5\\xd3\\x4f\\xc9\\x08\\x14\\x73\\xd5\\x8c\\x67\\xe1\\xe0\\x42\\xb9\\x83\\x4d\\x92\\x2c\\x11\\x92\\x26\\x58\\x23\\xe8\\xdf\\xbc\\xf4\\xdc\\x9b\\x60\\xa0\\x4d\\xec\\xbf\\x5d\\x9c\\xbf\\x79\\x0b\\x7b\\x19\\x73\\xa4\\x00\\xf3\\x21\\x60\\x4f\\x48\\x7b\\x4c\\xca\\xe2\\xe0\\x0e\\x24\\x5e\\x98\\x6c\\x08\\xac\\xac\\x86\\xb4\\x74\\xd5\\xc7\\x10\\xf5\\xff\\x50\\xd6\\xd8\\x41\\x11\\x47\\x88\\x7a\\x14\\xa3\\x05\\x24\\x9b\\xbc\\x5e\\x01\\x3c\\x55\\x1f\\x7a\\xd8\\xa9\\x3b\\x2c\\x89\\x97\\xa2\\xb1\\xae\\x54\\xc3\\x62\\x27\\xfb\\x8a\\x35\\x17\\x91\\x36\\x62\\xbb\\x86\\x82\\xec\\x42\\xda\\x21\\xab\\x82\\xd2\\xd8\\x37\\x7a\\x5f\\xc7\\x6f\\x81\\xfd\\x6c\\x94\\xf1\\x97\\xe4\\x54\\xe5\\x64\\x3d\\xa2\\xc9\\x73\\x60\\xcd\\x38\\x8c\\x94\\x4c\\xf3\\x0c\\xb7\\x77\\x02\\xc8\\x3a\\x9c\\xb0\\x2e\\x6e\\x09\\x2e\\xa2\\xd9\\x0c\\xcc\\x7d\\x50\\x23\\x23\\xfd\\x32\\xcd\\x73\\xce\\x52\\x4a\\xfe\\x16\\xa0\\xf1\\x77\\x75\\xff\\xec\\x1f\\x44\\x7f\\xda\\xe8\\x48\\x19\\x5a\\x21\\x84\\x3d\\x18\\x37\\xf2\\xa1\\xde\\xec\\x00\\xd1\\x38\\x4c\\xe2\\x7f\\x83\\x42\\x9a\\xc0\\x42\\x8d\\x81\\x0d\\xfc\\x76\\xc1\\xeb\\x89\\xd8\\x0b\\xa2\\x14\\x5c\\x85\\xb8\\x94\\x84\\xe9\\x9e\\x8c\\x82\\xf0\\x46\\x14\\x83\\x0c\\x13\\x63\\x3b\\x0c\\x22\\x55\\x8c\\xf2\\xf8\\x0a\\x2d\\x3c\\x05\\x8c\\xae\\xac\\x3c\\x5c\\x3a\\x6d\\xcb\\xae\\x6a\\xda\\x69\\x4f\\x0a\\x74\\x5a\\xa4\\x5d\\xd8\\xf0\\xce\\xc6\\x32\\x48\\x09\\x03\\x28\\xbe\\xd6\\x3d\\x34\\x56\\x07\\x39\\x6d\\xe3\\x38\\x81\\x95\\x41\\x5e\\x8c\\x33\\x7a\\x11\\x62\\xf0\\xf4\\xdf\\xaa\\xb2\\xd4\\x30\\x18\\x58\\xdc\\x64\\xb3\\x24\\x92\\x45\\x2a\\x82\\xce\\x2f\\xb3\\x8f\\x5f\\xb1\\x0f\\x75\\xbc\\xa4\\xc1\\x36\\x44\\x60\\x09\\x46\\x1e\\x0b\\x6d\\xeb\\x1c\\x9c\\x36\\x67\\x4b\\x41\\x73\\x10\\xff\\xf9\\x54\\x6b\\x94\\xa7\\xd6\\x2c\\xaf\\xd3\\xed\\x5b\\x42\\x05\\x2c\\x25\\xfc\\x07\\xd1\\x10\\xb4\\xeb\\x3d\\xfd\\xd1\\x62\\x17\\x5d\\x3a\\x9e\\x13\\xef\\xd0\\xa8\\x7f\\x60\\xdd\\x3f\\x25\\x8b\\x77\\x8a\\x8b\\x0c\\x28\\xc3\\xce\\xac\\x0f\\x1b\\x49\\x4f\\x8a\\xa7\\x03\\xb8\\xcd\\xf1\\x46\\xa6\\xa2\\xa1\\x67\\x2a\\x95\\xf0\\x07\\x10\\x33\\x4e\\xc7\\xe8\\x45\\x94\\xbe\\xa4\\xbc\\x3e\\x7b\\x7d\\x6a\\x26\\x77\\xc9\\x0c\\x16\\x79\\x8a\\x3c\\x73\\xde\\xa0\\xd1\\xee\\x63\\x05\\x74\\x87\\x07\\x43\\xd4\\xf9\\x60\\x47\\x93\\xbe\\x71\\x9f\\x85\\xc1\\xdf\\xc2\\xdb\\xf0\\x02\\xc4\\x0b\\x2c\\x53\\x56\\xd1\\xe6\\xdd\\x82\\x7f\\xa5\\xb7\\xc5\\x96\\x67\\x6c\\xe8\\xf7\\x21\\x5b\\xde\\xe9\\x3d\\xac\\x26\\x40\\x58\\x19\\xb7\\xeb\\x4a\\x59\\xee\\xa0\\xaf\\xa2\\xed\\xcc\\xc3\\xa0\\x46\\x7e\\xd9\\x33\\xf9\\x85\\xde\\x8e\\x49\\xec\\x1b\\xf3\\xe3\\x30\\x4e\\x8a\\x8a\\x08\\x81\\xae\\x53\\x60\\x60\\xe2\\x86\\x90\\x83\\x3a\\x58\\xc0\\xc3\\xb0\\x52\\xbf\\x6f\\xe8\\x61\\xdc\\x0b\\x59\\x88\\xda\\xb9\\xd0\\xac\\x60\\xe7\\x87\\x04\\x21\\x1b\\x8d\\x66\\x18\\xc5\\x11\\xe2\\x88\\xf2\\x09\\x13\\x71\\xf3\\x10\\x36\\x43\\xe5\\x71\\x80\\xb2\\xa0\\xbf\\x38\\x0c\\xde\\x82\\x8e\\x8d\\xaf\\xac\\xce\\xd0\\xc1\\xd1\\x42\\x81\\xce\\x8c\\x0c\\x12\\xc1\\xe0\\x4a\\xa1\\x52\\x07\\x17\\x73\\x96\\x24\\xfb\\xe4\\x6a\\xb9\\xce\\x8a\\x71\\x60\\xb4\\xd7\\x82\\xa0\\x78\\x6e\\xcb\\x21\\x1b\\x9a\\x78\\x2a\\x07\\x0e\\x95\\x80\\x4f\\x70\\xa0\\x3f\\x8a\\xff\\xba\\xbc\\x01\\x03\\xc8\\x23\\xa3\\x22\\xd7\\x01\\x6c\\xe3\\x00\\x03\\x6e\\x84\\x07\\xb3\\x81\\x86\\x60\\x37\\x6b\\x68\\x22\\x47\\x7b\\xe0\\x9d\\x07\\xdf\\x66\\xb3\\x34\\xda\\x23\\xa7\\x89\\x22\\xbe\\x48\\x86\\x0b\\x5e\\xa5\\xa7\\x38\\xc9\\xe1\\x5e\\x8b\\xf7\\xc4\\x00\\xad\\xdb\\x75\\xe2\\x80\\x01\\xa9\\x32\\x56\\x7f\\xc6\\x4d\\x97\\x37\\x91\\xde\\x23\\x37\\x18\\x29\\x0b\\x00\\xe9\\xe7\\xfd\\x4e\\x9b\\xb6\\x13\\x38\\xe8\\xe1\\x94\\x11\\x4a\\x3d\\x3d\\x32\\x8f\\x07\\x73\\xdc\\x34\\x60\\x24\\x07\\x16\\xd0\\x1e\\x88\\xaf\\xaf\\xe1\\xcf\\xeb\\x24\\xbb\\x0a\\xd9\\x90\\x0c\\x78\\xbf\\x13\\x74\\xb5\\x44\\xc5\\x85\\x8d\\x26\\x5d\\x52\\x48\\xcf\\x78\\x0f\\x6c\\x53\\x5c\\x38\\x71\\x1a\\x7f\\xdf\\x54\\x7a\\x74\\x33\\x64\\x12\\x7f\\x60\\x1b\\x13\\x70\\xc8\\x4b\\x64\\x36\\xff\\x23\\x9b\\xb2\\xfa\\xbb\\x52\\xb4\\x5a\\x18\\x36\\x94\\x72\\x22\\x56\\x25\\xb0\\x87\\x46\\x61\\x9e\\x25\\x20\\xf8\\x79\\x8c\\x11\\x5a\\x4b\\xc5\\xc2\\x27\\x23\\xcf\\xde\\x15\\xcc\\x70\\xdd\\x56\\xb0\\x66\\xf4\\x5e\\x2a\\x71\\x7d\\xd8\\x7c\\x9f\\xdd\\xda\\xfd\\x9c\\x5d\\x3a\\x5c\\x5b\\x49\\x06\\x50\\xd2\\x26\\x6d\\xa2\\xc3\\xb3\\x42\\xaf\\xf3\\x8a\\x0f\\x42\\x06\\x26\\xae\\x02\\x26\\x9f\\x0c\\xfd\\xe3\\xc1\\x3b\\x1d\\x88\\x39\\xf8\\x01\\x06\\x3a\\xaa\\x7e\\x66\\x5d\\x12\\xb2\\xb2\\x86\\xc1\\xd5\\xac\\x24\\x07\\x58\\xd3\\xbf\\xf2\\x3e\\xc3\\x29\\x94\\x62\\x2f\\x24\\x82\\xc9\\x72\\x60\\xd0\\x3f\\x58\\x41\\x88\\x1d\\x2f\\x21\\x4b\\x7f\\xc1\\x24\\x05\\xa9\\x4c\\x3c\\xfc\\xb9\\xcb\\xe3\\x12\\x3c\\x14\\xe6\\x07\\xe2\\xd8\\x1e\\x76\\xec\\x61\\x0a\\xca\\x6c\\x0b\\xd8\\xc5\\xc7\\x68\\x9d\\x7a\\x2a\\x5b\\x6c\\x44\\x8e\\xc1\\x8c\\x67\\x12\\xaa\\x8b\\x2b\\x9b\\x1a\\x46\\xba\\x34\\xde\\xc0\\x0b\\x71\\xcd\\x92\\xb0\\x28\\x5d\\xf9\\xe5\\xa5\\x87\\x41\\x6a\\x8c\\x7f\\x8d\\x6e\\xd4\\xe8\\x83\\xe6\\xdb\\x2b\\x78\\xf5\\xe0\\xb5\\xc4\\x76\\x04\\x70\\xeb\\x2c\\x1b\\x3b\\x4e\\xc7\\x23\\xaf\\xd3\\x2c\\xd7\\x9f\\xea\\x97\\xcf\\xdc\\x3d\\x42\\xe2\\xc5\\x6a\\x74\\x93\\xc6\\x30\\x3f\\x13\\x99\\x66\\x64\\x0d\\xf9\\x54\\x95\\xe1\\xf5\\x53\\xbb\\xb5\\xeb\\x98\\xa5\\x98\\x26\\x28\\xe8\\x61\\x09\\xaa\\x6a\\x96\\xea\\x80\\x13\\x9b\\x3f\\x1e\\x7d\\xe3\\xb1\\x86\\xb8\\x4b\\xcc\\x0d\\x49\\x69\\xf3\\x80\\xb5\\xa9\\xd2\\xdb\\x38\\xcf\\xd2\\x89\\xd8\\xdd\\xb4\\x09\\x8f\\xb2\\xeb\\x94\\x8c\\x2c\\xd4\\xc8\\x49\\x06\\x6a\\x6e\\xb8\\x07\\x3e\\xf7\\xe1\\xf5\\x21\\x7d\\x8a\\x67\\xba\\xc5\\x3d\\x08\\xec\\x04\\xfc\\x75\\xed\\x89\\x0b\\xb6\\x51\\x26\\x31\\x58\\x33\\x0a\\x5a\\x23\\x30\\x0e\\x69\\x78\\x7b\\xf6\\x23\\xfb\\x6e\\x86\\xf0\\xd0\\x19\\x63\\x9e\\x95\\xd9\\x28\\x4b\\x38\\x02\\x28\\xc0\\x01\\x6f\\x7d\\x60\\x08\\x96\\x23\\x02\\x60\\x18\\x7c\\x71\\x00\\x1a\\x50\\xa5\\x05\\x9d\\x83\\xa1\\xae\\xbd\\x8b\\xa3\\x6b\\x55\\x9a\\xe3\\xb3\\xb8\\x78\\x85\\xaf\\x6f\\xec\\xf8\\xac\\x49\\xe4\\x0f\\xbf\\xf4\\x85\\x5e\\x60\\xe8\\xe0\\xc8\\x39\\x0c\\x92\\xc7\\xda\\xa7\\xaf\\x1d\\x67\\xa4\\x68\\xfa\\x53\\xc8\\x84\\x4e\\xb2\\x2a\\x02\\xcc\\xa2\\xa8\\x37\\x2e\\xf1\\xd1\\xcd\\xe1\\xcd\\x53\\x3d\\xdc\\x53\\x8d\\x87\\xf9\\xe5\\xaf\\x2f\\xc8\\xbc\\x2d\\xf5\\x66\\xec\\x7a\\x53\\xfa\\x65\\xf0\\x92\\x40\\xa5\\x67\\xc1\\xaf\\x34\\xf3\\xd1\\xd3\\x2c\\xa5\\xfd\\xeb\\x55\\x16\\x46\\x4f\\x7f\\x0f\\xee\\xc4\\x34\\x2f\\x68\\x07\\x48\\x03\\xf7\\x31\\x8f\\xae\\xdd\\x7e\\xd7\\x90\\xad\\xef\\xdb\\xf6\\xf0\\x56\\x09\\x8a\\x95\\x83\\x3e\\xbd\\x8b\\x14\\xfa\\x33\\x52\\x47\\xa8\\xa2\\xe5\\xab\\xbd\\x17\\x1a\\xab\\x3d\\x8d\\x81\\xcc\\x8a\\xb1\\x6f\\xdc\\x58\\x4a\\x3c\\xac\\x2b\\xe5\\x01\\x86\\xc2\\xf6\\xfe\\xfa\\x62\\x8f\\x37\\x35\\xed\\xf3\\xcb\\xc1\\xdf\\x59\\x2a\\x61\\xb2\\x10\\x57\\xf6\\xbd\\xf5\\x41\\x68\\xc9\\x3a\\xa1\\x2c\\xed\\x64\\x13\\xc8\\x27\\x9a\\x6d\\x82\\xcc\\x21\\x98\\x30\\x8e\\x43\\xfd\\x2b\\xbf\\x75\\xa4\\x15\\x86\\xf7\\xcd\\x51\\xb0\\xa7\\xc1\\x7f\\x03\\xbc\\xde\\x0b\\x7e\\xf7\\x04\\x88\\xde\\x6d\\xf1\\xd2\\x2e\\x38\\x34\\xd5\\x25\\x39\\x88\\x63\\xe8\\xdb\\x1d\\xbd\\x44\\x87\\x1d\\xbc\\x14\\xec\\x16\\x1e\\xc7\\x38\\xbd\\x14\\xe3\\xbc\\x56\\x29\\x1e\\x95\\xb2\\xa2\\x92\\x00\\xa9\\x78\\xe9\\xc0\\x2c\\xf0\\x40\\x42\\xb4\\x46\\x81\\xd6\\x09\\x50\\x49\\xb8\\xa6\\xbf\\x01\\x70\\x66\\xac\\x05\\x79\\x60\\xd0\\xc2\\xe5\\x53\\x00\\x62\\x12\\x7e\\x20\\x55\\xa1\\xc2\\x22\\x66\\x9d\\x37\\x09\\xd3\\xf0\\xda\\x3b\\x2e\\xe5\\x23\\x03\\x50\\x15\\xb7\\xb8\\x60\\x9c\\x43\\x03\\x73\\x90\\x40\\xe6\\x05\\x71\\x40\\x27\\x93\\xdc\\x85\\xac\\xd8\\x8a\\x26\\x62\\xd1\\x51\\x05\\xc5\\x5e\\xe4\\x2d\\x95\\x12\\xe8\\x57\\xc0\\x47\\x00\\x42\\x47\\xf3\\xf0\\x24\\x04\\xa5\\x07\\x08\\xe3\\x9f\\xfc\\xd4\\xc5\\x19\\x07\\x33\\xfb\\x28\\x8a\\x9a\\x13\\x71\\x32\\x56\\x94\\x88\\x09\\x39\\x4c\\x1c\\x43\\x45\\x79\\xf3\\x9d\\x7a\\x5f\\xb0\\x9c\\x33\\xf4\\x1b\\xed\\x26\\xb9\\x01\\x00\\xf0\\x20\\xcc\\x56\\x5c\\x97\\x1f\\x3d\\x4c\\xab\\xb7\\x3f\\x01\\x2f\\x20\\xd0\\xb1\\xd8\\xcc\\xd5\\x48\\xe8\\xf0\\x98\\xa7\\xbd\\x54\\x1e\\xbe\\x3d\\xcf\\x3f\\x43\\xe5\\x70\\x97\\xe5\\x91\\x1b\\x5d\\x20\\x23\\xaa\\x6a\\xfa\\xa4\\x76\\x57\\xa7\\xf0\\x13\\x7b\\x0d\\xa1\\x9c\\x1f\\xcd\\x30\\x58\\x5c\\xea\\xa0\\x6e\\xe3\\x79\\xa4\\x9e\\xa9\\x1d\\x1a\\x37\\x40\\x4a\\x8e\\xb9\\x68\\x2e\\x09\\x96\\xdd\\xe8\\xe0\\x86\\xc4\\xf9\\xdd\\xb0\\xe9\\x80\\xb7\\x74\\x5a\\x14\\x43\\xeb\\xd2\\xca\\x91\\xdd\\x0d\\x8a\\x81\\xb6\\xc2\\xcd\\x4a\\x93\\xa0\\x91\\x78\\x7a\\x6e\\xcc\\x31\\x4e\\x1b\\x02\\x5b\\xe3\\xb8\\x2c\\x1d\\x8d\\xa6\\x4d\\x3e\\x2f\\x7e\\x3e\\x3f\\x74\\xbf\\x67\\xa2\\xf1\\x66\\x39\\x90\\xf5\\x1a\\xbc\\x3c\\x7f\\xfd\\x32\\x1b\\x91\\x7b\\x48\\xa7\\x54\\x0c\\x7a\\x9a\\xa5\\x07\\x16\\x4e\\x44\\xbf\\x23\\x0f\\xc3\\x27\\xb7\\x8d\\x9f\\x75\\xed\\x79\\x68\\xb5\\x11\\xd0\\x18\\xe1\\xd2\\xc7\\x85\\x7b\\xec\\x36\\xed\\x59\\x3b\\x19\\xc5\\x9e\\x64\\x83\\x6c\\x8f\\xa1\\xef\\x4c\\x19\\x9d\\x40\\x82\\xa3\\x13\\x3d\\xd0\\x69\\xd4\\xe3\\x98\\xd8\\x30\\x39\\xb2\\xb0\\x72\\xf7\\x48\\x8a\\xf7\\xc9\\x51\\x29\\xbc\\xb0\\x3f\\x6c\\x11\\xe0\\x9f\\x63\\xa0\\x42\\x47\\x54\\xd9\\x85\\x03\\xbb\\xcc\\x0b\\x7d\\x1b\\x1d\\xfa\\xbe\\x70\\x4f\\x3a\\x71\\x98\\x70\\x44\\x67\\x9b\\x30\\x98\\x0c\\x41\\xc6\\x0a\\x9d\\x4a\\x6b\\x7f\\xd1\\x84\\x6a\\x43\\x9e\\x9d\\xdc\\x78\\x3d\\xf0\\x04\\x73\\x4e\\x78\\x5a\\x9f\\xa6\\xfc\\xdb\\x09\\x43\\xda\\xb1\\xaa\\x5c\\x0f\\x26\\x05\\x96\\xe6\\xf1\\x88\\x97\\x0b\\x8a\\x00\\x2b\\x49\\xe3\\xfb\\xb6\\x9e\\xd8\\x3a\\x26\\x74\\x3d\\xf7\\x03\\x07\\x3a\\x0c\\xc6\\xd5\\x0c\\x16\\x6b\\x8f\\x0f\\xdd\\xb3\\x53\\x7c\\xdb\\x9d\\x11\\x15\\xbc\\xa1\\x80\\x3d\\x02\\xd7\\xc4\\xd0\\xa7\\xc2\\x5a\\x39\\x3f\\x47\\xab\\x32\\x2e\\xc5\\xc4\\xe0\\x73\\xa3\\x54\\xd4\\xfc\\x00\\xac\\xfa\\x64\\x46\\x30\\xfd\\xe7\\xc7\\x8f\\x26\\x4a\\xcd\\xc7\\x47\\xf7\\x73\\xa7\\xf2\\x0f\\x9d\\x7b\\xf8\\x2e\\x8c\\xd1\\x09\\x20\\xb4\\x88\\xfb\\xd2\\x2f\\x0c\\x45\\x78\\x83\\x65\\xda\\x75\\xd8\\xdd\\x14\\x8c\\xea\\x0c\\x67\\x52\\x48\\x7f\\x82\\x86\\x4f\\x84\\xda\\xd2\\x1e\\x67\\x6a\\x7d\\x46\\xeb\\xc2\\x50\\xe6\\x79\\x6b\\xa8\\x8a\\x31\\x7f\\x6e\\xc2\\xa3\\x8b\\x85\\xc0\\xda\\x8e\\xb9\\x35\\xaf\\x1f\\xe0\\x94\\x5b\\xa6\\xae\\x84\\x6e\\x1b\\x62\\x29\\xd5\\x88\\x4b\\x4b\\x20\\x05\\x63\\x1e\\x61\\x20\\x61\\x34\\x22\\xcc\\x04\\x80\\x8b\\x39\\xf6\\x56\\xec\\x9b\\x60\\x9c\\x6f\\x7d\\x71\\x9e\\x89\\xde\\x68\\x31\\x47\\x4c\\xe2\\x23\\x7a\\x20\\x3e\\x5f\\x04\\xc5\\xe6\\xb9\\x1e\\x2c\\x23\\xfa\\x9d\\x29\\x2c\\xf1\\x2c\\x42\\x16\\xe5\\x68\\x1a\\xb1\\x7e\\x99\\x66\\xb1\\x44\\x5c\\xf8\\x4b\\x3e\\xad\\x93\\x94\\x10\\x5a\\x53\\x05\\x98\\xd3\\x39\\x4c\\xc5\\xba\\xde\\xcb\\xe4\\x03\\xe8\\x41\\x83\\x5f\\xe7\\x3a\\x3b\\xc3\\x3d\\xd2\\x44\\x95\\x90\\x52\\xc8\\x25\\x55\\xb2\\xa4\\xc3\\xdb\\x30\\x4e\\xd0\\x60\\xd2\\x8e\\xd4\\x54\\x47\\x22\\xd9\\xee\\x74\\xdc\\x76\\x84\\x39\\x40\\xa0\\x6d\\x46\\x95\\x44\\x28\\x38\\xab\\xea\\xcc\\x17\\x28\\x9a\\x9d\\x0e\\x2d\\x86\\x4d\\x91\\x94\\xca\\x99\\x28\\xab\\x86\\x38\\x05\\x83\\x28\\x26\\x7a\\x80\\x26\\xad\\xac\\x32\\xca\\xc4\\x41\\x00\\x9e\\x8b\\xf5\\xa0\\x73\\xf3\\x64\\xa8\\x89\\x9a\\x5c\\xa1\\x86\\xa0\\xd4\\x3e\\x0c\\xa0\\x91\\xb2\\xd1\\xb1\\x57\\x82\\xef\\x5b\\xd0\\x31\\xe3\\xec\\x63\\xf0\\x9f\\x87\\x7f\\xfe\\x3f\\x14\\x78\\x18\\xba\\x81\\x3e\\x3f\\xb6\\x87\\xc8\\xa1\\xc6\\x27\\x19\\xc5\\x5c\\xac\\x44\\xa7\\xd9\\x08\\xf3\\x9e\\xbb\\xbb\\x0c\\xe1\\x91\\xcf\\x52\\xe3\\x4c\\xa3\\xcb\\x0c\\xa2\\x81\\x11\\x54\\x4e\\x99\\x29\\x6b\\x6c\\xf7\\xa5\\x5a\\x9e\\x81\\x76\\x02\\xcd\\x0f\\x88\\x34\\x8a\\xa9\\xce\\x5a\\xa3\\x34\\xcc\\xd8\\x3f\\x74\\xd4\\x39\\x82\\xde\\x39\\x52\\x79\\x9f\\x90\\x7d\\x49\\x7a\\xc2\\x9c\\x52\\x85\\x75\\x2b\\xd3\\xf9\\xaa\\x63\\xdb\\xbf\\xac\\x27\\x8f\\xb1\\x9d\\x0f\\xda\\x7a\\xb0\\x87\\xa9\\x4b\\xbc\\x7f\\xe3\\x4e\\x0d\\xaa\\xdc\\x09\\x2f\\xd2\\x4f\\x3a\\x12\\x7b\\x4e\\x72\\x4b\\x3b\\x9b\\x1e\\x45\\x92\\x12\\x6d\\x1c\\xf9\\xed\\xfb\\x4b\\xe2\\xca\\xcb\\xd3\\x57\\xa7\\x97\\xa7\\x43\\x2f\\xb4\\x45\\xfb\\x39\\xc6\\xc3\\x38\\x92\\x46\\x3b\\x06\\x0a\\xbf\\x93\\x17\\x2a\\xcc\\x42\\xe9\\x62\\xe9\\xaf\\x84\\x13\\xcb\\x39\\xf6\\xad\\xce\\x2a\\xb2\\x67\\xd6\\xda\\x1d\\x05\\x7c\\xd9\\xe2\\xaf\\xee\\xa1\\x35\\x45\\x05\\xd6\\x5b\\xd7\\x14\\x80\\x45\\x4e\\x1e\\xd4\\xc6\\x4d\\x68\\x3d\\x53\\x3b\\x34\\xc6\\x4d\\xe1\\x48\\xb8\\x0a\\xcb\\x96\\x08\\xa8\\xde\\x15\\x24\\x94\\x56\\xe8\\x1d\\xe9\\x98\\x72\\x60\\x7f\\x94\\x43\\x54\\xce\\x65\\xd3\\xba\\x25\\x18\\x9c\\x9d\\xee\\x37\\x6b\\x01\\x14\\x04\\x10\\x60\\xb0\\x49\\x6c\\x14\\x25\\x33\\xfe\\x21\\x88\\x37\\x18\\xb4\\x77\\xb0\\xa0\\xd0\\x0d\\xc7\\x9d\\x33\\x34\\x6e\\x58\\x75\\x24\\xf0\\xd6\\xd3\\x1b\\x5c\\xa8\\x13\\xce\\x7f\\x60\\xb0\\xc6\\x60\\xd3\\x65\\xe0\\xdb\\x7a\\xe4\\xf8\\x78\\x93\\xcf\\x4d\\x56\\xc0\\xbd\\x0b\\x8f\\xc9\\xd0\\xa3\\x3f\\xa0\\xbf\\xfe\\x51\\x0d\\x1e\\x1b\\x33\\x31\\x0d\\x11\\xf7\\xc0\\xa6\\xd1\\x56\\xa2\\x07\\xda\\xa3\\x9c\\x71\\xca\\xb8\\x7c\\x8c\\xac\\x3e\\x01\\xbb\\x07\\x99\\x17\\x26\\x76\\x59\\xd7\\xce\\x22\\x8c\\x46\\xc2\\x23\\x72\\x4a\\x2b\\xf4\\x95\\xad\\xec\\xc8\\xd5\\xf1\\x80\\x88\\xa0\\x67\\x4a\\xf4\\x9f\\xd9\\x76\\xc5\\x1f\\xc2\\xeb\\xb0\\xb4\\x31\\x1d\\x07\\x70\\xde\\x2b\\xc0\\xe6\\x3b\\x39\\x7f\\x77\\x61\\xa7\\xc4\\x3f\\x62\\x0e\\x29\\x95\\x12\\x30\\xa2\\x60\\xa9\\xe4\\x22\\x8d\\x93\\x50\\x42\\x25\\x72\\xb6\\x80\\x37\\xc0\\x86\\xc1\\x9d\\xb2\\x01\\x39\\x09\\xa6\\x5b\\x68\\x0f\\xbf\\xfc\\x3f\\x3a\\x24\\x83\\x84\\xe1\\x19\\x58\\x75\\x49\\xaa\\x74\\x5c\\xf6\\x72\\x53\\x81\\x8d\\xdf\\x22\\x63\\x3a\\x03\\xd2\\xbf\\x77\\x5c\\x3d\\x70\\x33\\x9f\\x1b\\x6f\\x15\\xe0\\x63\\x8a\\x50\\x46\\x45\\x45\\xde\\x86\\xf2\\xc6\\x5b\\x30\\xda\\x40\\x7c\\xbf\\x82\\xe9\\xbe\\x6e\\xbe\\x77\\x70\\xa8\\x6d\\x84\\xd7\\xe2\\x55\\x9b\\xf0\\x23\\xed\\x54\\x36\\x72\\x53\\x09\\xcc\\xc3\\x6b\\xb5\\x88\\x50\\x25\\xcd\\xc3\\xcf\\x8b\\x36\\x3a\\xc2\\xf3\\x2c\\x75\\x34\\xbb\\x6a\\xc5\\x1d\\x7e\\x39\\xac\\xd1\\x40\\xa2\\xda\\xac\\xf2\\xc4\\xbf\\x69\\x05\\x7e\\x80\\x02\\x11\\x3a\\x16\\x44\\x50\\xb3\\x28\\xe1\\xe9\\x1d\\xec\\x9b\\xac\\xa4\\xf1\\x5d\\x37\\xe3\\x1e\\xdd\\xa5\\x5b\\x46\\xdc\\x42\\x55\\x3d\\x29\\xae\\x4d\\xaf\\x43\\x13\\x73\\xce\\xc6\\x4e\\x1a\\xb2\\xa7\\xe5\\x99\\x7e\\xe5\\xff\\xc9\\x96\\x48\\x36\\xe3\\x25\\xe6\\x53\\x19\\xa5\\x6f\\xf3\\xba\\xf5\\xe1\\x27\\x5b\\x96\\x4e\\x96\\xaf\\x16\\x21\\x3a\\x7c\\xb0\\x6e\\x88\\x77\\xc0\\x40\\x71\\x41\\x84\\x03\\xbc\\x77\\x0f\\x2b\\x3a\\x9d\\x1d\\xd8\\x99\\x5f\\x38\\xd8\\xdc\\x66\\x71\\x54\\x4f\\x2f\\x4a\\x47\\x72\\xf7\\x4b\\x0e\\x64\\xb5\\x40\\xc0\\x66\\x5e\\xea\\xfb\\x55\\x81\\x4e\\xd7\\xc7\\xa5\\x7c\\x88\\x47\\xe3\\x86\\x59\\xc5\\x90\\xf3\\x84\\x28\\xa5\\x24\\xac\\xdc\\x52\\xd8\\xe7\\xa5\\x87\\xb7\\x80\\x12\\x4a\\x92\\x13\\x99\\x96\\x6d\\x69\\x12\\xa6\\xf1\\x74\\x46\\x49\\x69\\x98\\xc5\\x3e\\xe6\\xc8\\x5e\\x24\\x57\\x16\\x0e\\x71\\xf3\\x19\\xb0\\x8d\\x5c\\x51\\xd2\\x91\\x2a\\xe9\\x78\\xde\\xdf\\x76\\xf1\\x75\\x84\\xd3\\x06\\x4f\\x17\\xb6\\xe2\\x83\\xbf\\x7e\\x4d\\x64\\x1a\\xd2\\xf9\\xbf\\x13\\x19\\x5b\\xe6\\x88\\x15\\xd3\\x3d\\xf4\\x80\\xfb\\x47\\x0d\\xab\\xba\\xc6\\x8c\\xb7\\x5a\\xaf\\x56\\x6c\\x03\\x3a\\x66\\x8f\\x9c\\xcb\\x41\\x95\\x33\\xad\\x13\\x59\\x96\\xe4\\xb7\\x81\\xb2\\xc4\\x70\\x87\\x47\\x1b\\xfd\\x26\\xda\\xa1\\x7a\\x7f\\xea\\x52\\x5f\\x0c\\xab\\x91\\xbe\\x46\\x0d\\x66\\xf6\\xf5\\x9a\\x6e\\x3a\\x8e\\x30\\x7a\\x64\\x6f\\x8e\\xe4\\x94\\xd3\\x09\\x56\\xee\\x48\\x1f\\xf1\\xdb\\xe8\\x2c\\x45\\xb5\\xcc\\xab\\xe0\\x1a\\x19\\xfb\\x22\\xa8\\x2c\\x27\\xfb\\xcd\\xb1\\xa3\\xb5\\x70\\xf0\\x9a\\x47\\x38\\xe4\\xa0\\x27\\xda\\x6d\\x2c\\x69\\xa4\\xe9\\xf5\\xd6\\xd4\\x38\\x9b\\x2c\\x9f\\x28\\x1a\\x98\\x79\\x8e\\x82\\x6f\\x65\\x40\\xc3\\x3d\\x8d\\x73\\x7d\\x77\\xff\\xd4\\x50\\xfe\\xe9\\xe7\\x06\\xa4\\x6b\\xa9\\x79\\x74\\x91\\x49\\x55\\xd1\\xe1\\x78\\x43\\x94\\x89\\x17\\xc5\\x71\\xcf\\x09\\x6c\\x3e\\x95\\x54\\x29\\xfe\\x7a\\xd0\\x67\\x22\\x93\\x05\\x2e\\xa2\\x6f\\x29\\x43\\x13\\xa2\\xfb\\x49\\xd7\\x16\\x64\\xcc\\xa8\\x71\\xa6\\x08\\xa7\\x32\\xfe\\x47\\x75\\x8e\\x77\\xb4\\x6b\\x90\\x5d\\x9f\\x55\\x27\\xe1\\x53\\xa5\\x06\\xea\\xe1\\xd1\\xd1\\x7d\\x1f\\x0c\\xf0\\x49\\xf3\\xd8\\x26\\x29\\x96\\x93\\xd7\\x4d\\x20\\xa7\\x45\\x26\\xcc\\x73\\x32\\x01\\x4c\\xfa\\x0e\\x08\\x05\\x51\\x02\\x13\\x14\\xcc\\x1b\\x68\\xef\\x62\\x56\\x35\\x71\\x66\\xbe\\x28\\x8c\\xc1\\x58\\x1a\\x1c\\x1e\\x1e\\x3a\\xb1\\x24\\x60\\x5f\\x3f\\x49\\x68\\x67\\xd0\\x4d\\x48\\x54\\x75\\xee\\x96\\x48\\x60\\x06\\xc4\\x15\\x38\\x81\\x30\\xc3\\x4e\\x56\\x87\\xa4\\x9b\\x5b\\x86\\x9e\\x76\\x22\\x3a\\x08\\x25\\x22\\x54\\x48\\xaa\\xb3\\x9a\\x43\\x27\\xdf\\xa9\\x68\\x5d\\x73\\xf2\\xf2\\x71\\x40\\x87\\x55\\x8a\\x32\\x04\\x84\\x74\\x3a\\x3b\\x3a\\x75\\xdc\\x34\\x6f\\x7e\\x8a\\xec\\x22\\x04\\x62\\x85\\x5e\\x29\\x46\\xe5\\xb0\\x95\\x89\\xc7\\x96\\xe3\\xfe\\xca\\x36\\xaf\\x0c\\x0d\\x1b\\x2b\\x1c\\xf4\\x66\\xac\\xd3\\x0f\\xd3\\x45\\x06\\x5e\\x02\\xf5\\x30\\x60\\xe6\\x2e\\xc5\\xd7\\x3b\\xc9\\x09\\x0a\\xc9\\x0d\\x4e\\x62\\x27\\x91\\x1c\\xb7\\x1c\\x43\\xfc\\x39\\xaa\\x8c\\x2f\\xcc\\xea\\x7f\\x90\\xbf\\x12\\xe6\\x18\\xbd\\xcb\\x2a\\x89\\x94\\xb0\\xa4\\x8d\\x5e\\xf2\\x34\\x71\\xab\\x48\\xbc\\xc2\\x8b\\x96\\x55\\x55\\x14\\xcb\\x75\\x10\\x49\\x68\\xa0\\xf0\\x8f\\x3f\\x11\\xde\\xcf\\x5c\\xab\\x0e\\xc2\\x01\\xab\\x1a\\x88\\x7f\\xeb\\xa5\\x7f\\x7a\\xee\\x22\\xa2\\x92\\x36\\xbe\\x8f\\x68\\x63\\xda\\xc4\\x90\\x3b\\x14\\x08\\xbf\\xbb\\xdc\\x0e\\xfa\\x49\\xa3\\xdf\\xb8\\xd6\\xac\\x01\\x76\\xcc\\xd7\\x82\\xc4\\x70\\x16\\x13\\xb1\\xe0\\x94\\x5d\\x10\\xba\\x6c\\xca\\x1a\\x0d\\x4f\\xde\\xe4\\x9d\\xa9\\xbc\\xd3\\x68\\x99\\x7d\\x87\\xa7\\xe9\\xf1\\x48\\x9b\\x9a\\x97\\x0d\\xee\\x23\\xda\\x2b\\x26\\xdb\\xae\\xf9\\xb8\\x47\\x5f\\x1d\\xd6\\x1e\\x1c\\x39\\xe1\\x05\\x16\\x27\\x01\\xf3\\x38\\x57\\xf8\\x1b\\xfe\\x85\\x39\\x95\\x25\\x86\\x28\\x9d\\xf0\\x70\\x1b\\x23\\xd0\\x3a\\xe7\\xe4\\x68\\xef\\xfc\\x03\\x29\\x1e\\x17\\xed\\x00\\x38\\x33\\x57\\x15\\x29\\x9a\\xe9\\x7a\\x44\\x27\\x2f\\x76\\xc1\\xb1\\x19\\x97\\xba\\x3b\\xf1\\xd5\\xfb\\xaf\\x07\\x16\\x66\\xf0\\x02\\xc8\\xf9\\x02\\x65\\x7a\\x49\\xaa\\x94\\x33\\x6a\\xb5\\x32\\x45\\x53\\xff\\xfd\\x6f\\xbe\\x95\\xff\\xfe\\xeb\\xa1\\x03\\x22\\xfa\\x11\\xf0\\x19\\x87\\x32\\xbc\\xef\\x48\\x39\\x6b\\xea\\x79\\x2f\\xeb\\x1f\\x01\\x99\\xca\\x07\\x35\\x97\\xe2\\xfd\\xd7\\x75\\xa5\\xf2\\x99\\xcf\\x7d\\xf8\\xbc\\x18\\x93\\xad\\x83\\xb8\\x15\\xb6\\xe2\\x74\\x5f\\xf7\\x72\\xd7\\x44\\x29\\x3c\\xd3\\x1e\\xb4\\x55\\x7c\\x8d\\x6a\\x42\\x26\\xd0\\x0a\\xc9\\xea\\x89\\x0a\\x05\\x7c\\x8b\\x81\\xa3\\x08\\x00\\x4d\\xcb\\x70\\xe7\\x54\\x28\\x21\\xcb\\xbf\\x82\\x8f\\xdf\\x9b\\x11\\x35\\x24\\x5f\\x1e\\xb5\\x4e\\xfe\\x5b\\xdb\\x83\\x9f\\x7e\\x26\\x30\\x0c\\x32\\x6f\\x8e\\xf8\\x86\\xcc\\x57\\xcd\\x1f\\xa0\\x67\\xdd\\x32\\x16\\x3e\\xfa\\xe9\\xe7\\xaf\\x1b\\x57\\x4e\\x7f\\xfa\\x0e\\x4d\\x72\\x5c\\x2f\\xfa\\x22\\x5d\\x75\\xa4\\xaf\\xb7\\x7e\\xb6\\xc6\\x86\\x9b\\x8e\\xc9\\x87\\x57\\x68\\x1c\\x56\\x57\\x6d\\xe5\\x18\\x13\\xdf\\x43\\x63\\xa3\\xed\\x80\\x60\\x29\\xad\\xa0\\x62\\x39\\x13\\xe4\\x25\\x8a\\x1a\\xa1\\xba\\xa4\\x6a\\xce\\x0a\\xa5\\x26\\x6b\\xfa\\x17\\x5f\\xf6\\xde\\x80\\x7b\\xaa\\x89\\x46\\x18\\x9a\\xe7\\xfe\\x8f\\xe0\\x5c\\x6b\\x0d\\x27\\x83\\xdb\\x99\\x57\\x83\\x53\\xb4\\x19\\x04\\xcb\\x02\\x24\\x7e\\x36\\x81\\x33\\xf0\\xa1\\xfa\\xf2\\x45\\xdb\\x7a\\x98\\x2b\\xc5\\xbc\\x34\\x7d\\x1c\\xd7\\xbf\\x32\\x2e\\xeb\\x41\\xaa\\xd5\\xb6\\x94\\xae\\x2d\\x63\\x09\\x39\\xe9\\xcb\\x97\\xaa\\x70\\x78\\xd3\\x6d\\x47\\x34\\x2a\\x21\\x09\\x0c\\xa8\\xba\\x50\\xb4\\x8b\\xc2\\x7c\\xd5\\xe8\\x8e\\x33\\x47\\x06\\x3a\\x07\\xdb\\x28\\xff\\xbb\\x35\\x85\\x1b\\x6f\\x5d\\x2b\\xff\\x9b\\x95\\x83\\x37\\xdd\\xa6\\xf9\\xdf\\xa4\\x0e\\x28\\x88\\xee\\x42\\xb1\\xaa\\x2a\\xf0\\x30\\x7a\\xac\\x8a\\x40\\xe7\\xf9\\x16\\x36\\x93\\x24\\xcd\\x4a\\x93\\x72\\xdf\\x6a\\x50\\xea\\xb7\\x4f\\x16\\xf2\\xe4\\xba\\x41\\xea\\x0b\\x8b\\xc9\\x5d\\xa4\\x77\\x06\\x55\\x50\\x56\\xe5\\x5b\\x75\\xbc\\xcd\\xb0\\x8e\\x79\\x87\\xe5\\x08\\x4d\\xa1\\xa5\\x03\\x89\\x8e\\xa5\\x19\\x66\\x2c\\xe0\\x6d\\x7c\\x46\\x34\\x9e\\x2a\\xc7\\x1e\\x46\\x7b\\xf5\\xa3\\x3d\\xcb\\x20\\x8b\\xd6\\x37\\x7d\\xab\\x4f\\xeb\\xf6\\xae\\xff\\x46\\xcb\\x51\\x48\\x0f\\xfb\\x4b\\xdb\\xb5\\x7d\\x0d\\x30\\xcd\\xea\\xcf\\x16\\xd8\\x67\\x0b\\x6c\\xe7\\x2c\\x30\\x47\\x78\\x3f\\x9b\\x60\\x7f\\x44\\x13\\x6c\\x13\\x02\\xf0\\xd9\\x06\\xdb\\x45\\x1b\\x6c\\xcd\\x92\\xf0\\xd9\\x08\\xdb\\xa2\\x11\\xe6\\xf1\\xae\\xf1\\x10\\x93\\x12\\x3c\\x6a\\xa4\\xc5\\xf4\\xb4\\x1a\\xe7\\xea\\x47\\xc5\\xad\\xcc\\xc2\\x67\\xce\\x92\\xb2\\x47\\xc2\\x7a\\xb9\\xf8\\x57\\x30\\x6b\\x00\\xf8\\x84\\x27\\x9e\\xdc\\x9b\\xb8\\x60\\xd7\\x59\\xe2\\x26\\x11\\xae\\x1c\\xe4\\xce\\x3d\\xc3\\x3d\\x91\\xff\\xce\\xc1\\xd5\\xa4\\x63\\xd9\\x8a\\x5a\\x0d\\x07\\xb6\\x6b\\x27\\xa7\\x7b\\x40\\x2b\\x34\\x5d\\x99\\xc0\\xef\\x14\\x67\\xdb\\xd5\\x28\\x49\\xe5\\x26\\x90\\xfa\\x98\\xd6\\xee\\xe9\\xa9\\x0d\\x4a\\x95\\x37\\x4f\\xf5\\xac\\x0c\\xc1\\x5a\\x5c\\xa2\\xd6\\x8f\\xef\\x7a\\x84\\xca\\x9f\\xa2\\xa7\\x40\\xb9\\x47\\x19\\xf5\\x83\\xff\\xa5\\xa9\\xba\\x19\\xc1\\x22\\x13\\x6a\\x1e\\xa5\\x3d\\xa3\\x6e\\x11\\xc9\\xe2\\xeb\\xaa\\xdf\\xc6\\x79\\x51\\xda\\xa4\\x16\\x8b\\xb7\\x37\\x6e\\xf7\\xe2\\x2c\\x66\\x57\\x05\\x26\\x66\\xa6\\xe5\\x7c\\x52\\x36\\x0e\\x6b\\x52\\xe6\\x10\\xe1\\xce\\xb3\\x90\\x2d\\xd1\\x6d\\x3d\\x12\\xea\\x4f\\xb1\\x51\\x09\\x9d\\x4f\\xd6\\x0e\\x11\\x5d\\x9a\\xd0\\x74\\xed\\xd9\\xd2\\xf9\\x69\\x61\\xd2\\x4d\\x2b\\x08\\x56\\x10\\x2d\\x61\\x2e\\x55\\xea\\x22\\x6d\\x59\\xea\\xdd\\xc2\\x90\\x33\\x1f\\x53\\xd9\\x9a\\xb2\\x99\\x24\\xc3\\xae\\x2c\\xa9\\x88\\x70\\xd5\\x44\\xc1\\xf7\\x07\\x3c\\xe8\\x8b\\xa3\\xc6\\x88\\xc7\\xee\\x46\\x64\\x24\\x7b\\x4d\\x02\\x32\\xa6\\xc4\\x86\\xfe\\x1d\\x6b\\x6b\\x72\\x55\\x9f\\xc6\\xd4\\xf7\\x6f\\xc2\\x42\\xf1\\xa7\\x74\\xf7\\x4e\\x28\\xae\\x43\\x33\\xf4\\x9b\\x04\\x62\\x4c\\xe2\\x2e\\x6b\\xfc\\x48\\x25\\x0a\\xaf\\x17\\x5c\\x12\\x55\\x8f\\x82\\x53\\xce\\x06\\xe6\\x87\\x71\\x21\\xb9\\xd1\\x6f\\xb9\\x16\\x44\\x25\\xcf\\x86\\x5f\\x39\\x9b\\x4c\\x54\\x14\\xc3\\x10\\x6f\\xe5\\xaa\\x02\\x40\\x8d\\xf5\\x84\\xa6\\x8d\\x6f\\xf7\\x78\\x09\\x2f\\xbd\\x14\\x53\\xc0\\xca\\x8f\\xf1\\x64\\x79\\x7c\\x1d\\xc3\\x6a\\x21\\x64\\x8e\\x18\\xa7\\xe7\\x22\\x19\\x04\\x9d\\xc0\\x3a\\x70\\xd3\\xcb\\xa5\\x32\\x67\\x23\\x76\\x7c\\xc3\\xd5\\x79\\xb9\\x00\\x80\\x9a\\xb0\\x19\\x78\\x29\\xde\\xf8\\x56\\xeb\\xc3\\xb2\\x69\\x22\\xbc\\x8b\\xfc\\xa3\\x7f\\x45\\x0c\\x7f\\xfa\\xa7\\xff\\x13\\xad\\x0c\\xff\\x27\\x58\\x1a\\xe1\\xdf\\xf1\\x86\\x84\\xa1\\x4f\\xc3\\xe9\\xf0\\x59\\x3a\\x9d\\x95\\x4d\\x5c\\x6f\\x96\\x89\\x5f\\x25\\x62\\x53\\xfa\\x03\\xe3\\x8f\\xa3\\x32\\x4f\\xea\\xbf\\xd6\\x81\\x20\\x2a\\xdc\\xc4\\xe3\\x72\\x2e\\x6c\\xaf\\xb3\\x59\\xa1\\x9a\\x60\\x6b\\x01\\x9d\\x81\\xbb\\x9a\\x95\\x25\\x9e\\xde\\xbb\\xa4\\x18\\x25\\x31\\xbc\\xf6\\x63\\xd3\\x8f\\x15\\x3a\\x66\\xe3\\x71\\xa1\\xaa\\x6f\\xf2\\x8f\\xff\\xac\\x33\\x61\\x3e\\x5f\\x8a\\x51\\xae\\x54\\xfa\\x63\\xd3\\x8f\\xce\\x9b\\x0d\\xc8\\x03\\x75\\x16\\x46\\x1d\\x6f\\xb4\\x3b\\x12\\x89\\xff\\xc4\\xeb\\xcf\\xfe\\xe4\\x74\\x69\\xc6\\xbc\\x03\\xff\\xf2\\x5f\\x69\\x00\\xa5\\xb7\\x78\\x0c\\x5b\\xc0\\x1b\\xb6\\x30\\x74\\xd8\\x88\\xeb\\xaf\\xac\\xe1\\x08\\xbc\\x13\\x2f\\xcd\\x4c\\xee\\x37\\xc5\\xca\\xd4\\xf8\\xd6\\xf1\\x5f\\xb9\\xf1\\xf7\\x04\\x1b\\x8f\\x54\\xc1\\xbf\\x90\\xb6\\x11\\x22\\xbb\\xbf\\x84\\x1f\\xab\\xd7\\x1d\\xaf\\xb2\\x8f\\xaf\\x81\\x08\\xb5\\x6b\\x90\\x5c\\x8f\\xea\\x9b\\xd9\\xd5\\x55\\xa2\\x8a\\xfa\\x43\\x35\\xfa\\x70\\x92\\x80\\xfe\\x6f\\x7c\\x72\\x5e\\xab\\x9d\\x3a\\xca\\xf2\\xfa\\x20\\xa0\\xfd\\x93\\x2c\\x2c\\xab\\xbf\\xdf\\xe4\\x6a\\xfc\\x06\\x2f\\x83\\x63\\x81\\xd1\\x5a\\x6d\\xa8\\x9b\\x72\\x92\\x5c\\xe8\\xf2\\xa3\\xd5\\x87\\xf0\\x17\\xde\\x1b\\xff\\xe1\\x26\\x2e\\x59\\x11\\x56\\x5f\\x48\\x33\\x82\\xfa\\x04\\xa1\\xac\\x8f\\x2d\\x4f\\x89\\x1f\\xd5\\x67\\xa0\\xb6\\x46\\x71\\x79\\x5f\\xff\\xb9\\x94\\x8c\\xf3\\xda\\x68\\xf0\\xe8\\x42\\x25\\x14\\xe3\\xa9\\x3e\\xe2\\x6b\\xb4\\xa7\\x60\\x5e\\xbc\\x08\\x6a\\x5a\\x9c\\x6e\\xb1\\xd6\\xbe\\x98\\x5d\\x4d\\xe2\\xb2\\x85\\x1d\\xe5\\x55\\x16\\x79\\x90\\x35\\xa5\\xc2\\x90\\x5d\\x51\\x3b\\x52\\x38\\xc1\\xcb\\x8f\\x68\\x0a\\x9a\\x92\\xae\\x91\\xad\\xab\\x1c\\x6a\\xe1\\xb3\\x77\\xdc\\x73\\x53\\xd5\\xb1\\x98\\xc5\\x65\\xa8\\xaf\\x4e\\xcf\\x0a\\x29\\xfa\\x84\\x57\\x46\\xff\\xe5\\xd6\\x66\\x82\\x87\\x74\\xb3\\xbd\\x72\\x53\\xb3\\x6a\\xf0\\xc0\\xa8\\x9c\\x77\\xec\\xcd\\xc2\\xc9\\xb8\\x02\\x98\\x6f\\xb4\\x0d\\xe0\\x0d\\x6d\\xc9\\xe8\\xcd\\xee\\x13\\x40\\xce\\x18\\x80\\xce\\xb5\\xe6\\xe3\\xe0\\x1b\\x66\\x2c\\x40\\x11\\x51\\x14\\x0a\\x4b\\xf8\\xd9\\x7a\\x88\\xa0\\x17\\xb0\\x78\\x02\\xde\\xd5\\x76\\xbe\\xda\\x2b\\x6e\\x42\\xcc\\xe1\\xdc\\xeb\\xba\\x07\\x6d\\xa8\\x38\\x74\\xbf\\x35\\x92\\xe4\\xd0\\xd6\\x5a\\x5e\\x98\\x2d\\x6d\\xa5\\xcb\\xa9\\x6c\\x08\\xaf\\xce\\x46\\xa6\\x7e\\x92\\xd4\\xc0\\x1a\\x48\\x51\\x00\\x5a\\x54\\xfb\\x52\\x75\\x09\\x87\\xa1\\x76\\x85\\x58\\xf0\\x4e\\x21\\xc6\\x58\\x34\\xde\\xad\\xe7\\x14\\xa7\\x09\\xa5\\x35\\xa7\\x5a\\x91\\x95\\x54\\xc1\\x18\\xef\\xa9\\x20\\x52\\x38\\x80\\xdc\\x96\\xd3\\x17\\x92\\x0c\\x00\\x74\\x65\\xd6\\x16\\x5e\\xc0\\x72\\xc4\\xba\\x57\\x14\\x23\\x43\\xd3\\xe7\\xa6\\x43\\x89\\x79\\xea\\x5a\\x89\\xe8\\x22\\x34\\x1c\\xdf\\x11\\x16\\x27\\x7a\\x26\\x60\\xa5\\xe4\\x92\\xa1\\xe5\\xe5\\x5c\\xb9\\xc2\\xb7\\xde\\x1a\\x85\\x5d\\xb1\\xb8\\x1d\\x75\\x2f\\x6a\\x47\\xdd\\xad\\x30\\xc2\\x3c\\xc6\\xe8\\x3a\\x52\\xa3\\x8c\\x8a\\x6a\\x60\\x60\\xb3\\x19\\xb7\\x13\\xfb\\x82\\xa0\\x95\\xa8\\x71\\xe9\\x6f\\xa0\\x60\\xc1\\x79\\xdb\\xa5\\xcc\\x2c\\x46\\x9b\\xc9\\xfe\\x67\\x49\\x37\\xb5\\x3e\\xae\\x9c\\x8a\\xd1\\x14\\xc3\\x1c\\xec\\x37\\x42\\x70\\xe1\\xbd\\x24\\x83\\x0a\\x2c\\x2e\\x7d\\x18\\x16\\xb9\\x75\\xe8\\x08\\x68\\xad\\x4d\\x56\\x1a\\x73\\x9d\\xb4\\x73\\x69\\x14\\xf4\\x6b\\x50\\x8b\\x55\\x3b\\x4b\\x99\\xf1\\x32\\xed\\x1d\\xf0\\x57\\x6c\\xf0\\x40\\x15\\x33\\x09\\x2b\\x3d\\x9c\\xa9\\x7f\\x50\\x39\\xbc\\x99\\x71\\x3b\\x26\\xb9\\xcd\\xd6\\x3e\\x97\\xb7\\x8c\\xd1\\xab\\xc3\\x1a\\x62\\x95\\x2a\\xd3\\xb3\\xc2\\x9e\\x35\\x53\\x7d\\xa1\\xb8\\xbe\\x7a\\xf9\\x33\\x7b\\xcd\\xbd\\x61\\x46\\x77\\x48\\xf2\\xec\\x33\\x5d\\x5e\\xd2\\x62\\x43\\xb5\\xca\\xb9\\x95\\x46\\x4b\\x83\\x0d\\x9b\\x35\\x3e\\x6f\\x0e\\x1b\\x58\\xa7\\xbb\\xbb\\x58\\x04\\x85\\x27\\x52\\x91\\xbd\\xa2\\x8d\\x95\\x84\\xbd\\x27\\x8a\\x59\\x2d\\xb5\\x46\\xcc\\x78\\x72\\x31\\x9e\\x2b\\x58\\x91\\x21\\x33\\x4b\\xf1\\x06\\xa8\\x7f\\x13\\xf8\\xf2\\x0e\\x6f\\x38\\x58\\x9d\\xea\\xf4\\x31\\xf0\\x2a\\x8e\\x9b\\xe9\\x2b\\x3d\\x92\\x6a\\xc7\\xe4\\x0a\\xeb\\xd7\\x0d\\xd2\\xec\\x4e\\x8b\\x3a\\x28\\x47\\x9c\\xc3\\x73\\x50\\xfb\\x13\\x82\\x0b\\x62\\x10\\xc2\\x38\\xb6\\x06\\xc7\\xd0\\x7f\\xc8\\x45\\x41\\x89\\x31\\x53\\x2a\\xec\\xed\\x53\\xa5\\xa1\\xa3\\x91\\x48\\x2a\\x6d\\x5e\\x3e\\x71\\x63\\x6c\\x64\\x51\\xbf\\x4d\\xfe\\x97\\xfd\\x6a\\x44\\x80\\xbc\\x6f\\xc4\\xd3\\xc0\\xd1\\xe4\\x71\\x5b\\x47\\xdd\\xd2\\x22\\x57\\x13\\xbe\\x07\\xfa\\xda\\xfc\\xd8\\x97\\x28\\x24\\x81\\xe6\\xc4\\xc5\\x4a\\xe0\\x95\\x02\\x07\\xb5\\x0f\\xe0\\x54\\x3a\\x66\\x2e\\xd4\\x8b\\xf3\\xa8\\x01\\x26\\x2d\\xfc\\x05\\xde\\xfd\\xae\\xc6\\x6d\\xdc\\x13\\xdc\\xfd\\x1e\\x70\\x47\\x6c\\x2a\\xcf\\x23\\xf6\\x2f\\xb3\\x09\\xf8\\xf5\\x97\\xd9\\x69\\x1a\\xd9\\x3d\\x78\\x1d\\xc8\\x50\\xe9\\x70\\xde\\xa6\\xa5\\x5f\\x4f\\x2b\\x52\\x7c\\x2a\\xd9\\x07\\x29\\x1c\\xf4\\x21\\x91\\xb2\\x1c\\xa2\\x8b\\x00\\xd9\\x94\\xa3\\x94\\x58\\x72\\x46\\x1e\\xd1\\x0d\\xf0\\x66\\x44\\x3b\\xf2\\x56\\xfa\\xe0\\xce\\x39\\x16\\x1b\\xc0\\x7e\\x8e\\xa9\\x97\\x84\\x75\\xf5\\xcd\\x74\\x51\\xe3\\x31\\xb5\\x6a\\x03\\x4b\\x14\\x4b\\x5b\\x9f\\x8d\\x75\\xf5\\xce\\x86\\xad\\x8b\\xd6\\x5b\\x10\\xeb\\x88\\x4d\\x72\\x5f\\xab\\x98\\xf0\\xdf\\xfc\\x1d\\x0d\\xa6\\x2b\\xe8\\x99\\x9a\\x34\\xba\\xf2\\x95\\xed\\x66\\x51\\x2b\\x0b\\xe9\\xed\\x2e\\xde\\xbd\\x5f\\x1e\\xd2\\x98\\xe1\\x4a\\x8a\\x07\\x63\\xeb\\x42\\x69\\x81\\xc1\\x35\\xdb\\x75\\x9f\\x3a\\x7e\\x9f\\xcb\\xca\\x4a\\x75\\x3d\\x7f\\x02\\x53\\xc1\\xd7\\xaf\\xf9\\x49\\xaa\\xc2\\x69\\x2a\\x48\\xba\\xe7\\x30\\x52\\x34\\xde\\x60\\x8f\\xfe\\x83\\xa3\\xee\\xed\\x93\\x95\\x44\\x45\\xbd\\xe3\\xca\\x5e\\x40\\x2f\\xb5\\x6f\\xe7\\x93\\x90\\xb4\\x39\\x55\\xc5\\xcb\\xe9\\x36\\xb1\\x56\\xd0\\x27\\x17\\x17\\xae\\xc7\\xae\\x6d\\x5d\\x29\\x93\\xec\\x3c\\x31\\xe7\\x0a\\x52\\xbd\\x2a\\xce\\x2b\\x25\\xec\\x2a\\xa6\\x41\\xa3\\x92\\xfc\\xaf\\x8a\\x92\\x44\\x8b\\x2f\\x4c\\x4e\\xb5\\x75\\x50\\xb7\\x14\\xc5\\x9a\\xd6\\x35\\xa4\\x2c\\xe3\\x07\\xb0\\x7c\\x0a\\xaa\\xf1\\xf7\\x27\\x82\\x48\\x7e\\x06\\xc0\\x26\\x85\\x82\\x75\\x52\\xb4\\x18\\x6e\\x3c\\xde\\xaf\\x35\\x0f\\xec\\xad\\x76\\x4d\\x52\\xaf\\xdf\\x26\\x97\\xf4\\x19\\xa0\\xef\\xb4\\x5f\\x75\\x9e\\x2a\\x8e\\x90\\x69\\xcb\\x73\\xcc\\x35\\x68\\xc6\\xf5\\xd2\\xe6\\xd4\\x40\\xd1\\x6f\\xa0\\xea\\x3a\\x65\\xd4\\x3c\\xd8\\x0c\\x83\\x27\\x03\\xfa\\xf8\\x00\\x1e\\xd9\\x02\\x95\\xba\\xb8\\x57\\xc9\\xb5\\xc0\\xb0\\xd2\\xd6\\xd4\\xba\\x10\\x7e\\x55\\x33\\x5f\\x15\\x60\\x23\\xa8\\x39\\x7d\\x02\\x4d\\x8d\\x86\\x7a\\x7d\\x85\\x95\\x29\\x84\\xcd\\x61\\x56\\xad\\xe0\\xb4\\x63\\xd4\\x06\\x94\\xad\\xaf\\xa4\\x27\\x7b\\x31\\x9f\\xf6\\x55\\xe2\\x7f\\xcf\\xdd\\x61\\x44\\xd3\\x10\\x1e\\xba\\xa7\\x28\\x2d\\x68\\xb2\\x31\\xd5\\x47\\x6c\\x67\\x8f\\x2e\\x82\\x3c\\x12\\xfb\\x91\\x2c\\xba\\x0a\\x3d\\xa5\\x0c\\xdc\\x98\\x4b\\x06\\x49\\x9d\\x2e\\x5b\\x99\\x14\\xd6\\xbf\\x6e\\x1c\\xd6\\xc2\\x4c\\x5d\\xea\\xd0\\x3f\\xe6\\xaa\\x33\\xd7\\xd5\\x39\\x14\\xe9\\x3a\\xd0\\x7e\\xb4\\xed\\x26\\x5b\\x54\\xc6\\xd6\\xcd\\x20\\x8e\\xcd\\x5f\\x52\\x9b\\x29\\x72\\xeb\\xb8\\x70\\xf3\\x84\\xf1\\xac\\x44\\xf6\\xba\\xac\\x2d\\xea\\x8c\\x78\\x9b\\x2b\\xee\\x91\\x33\\x30\\x73\\x5a\\xbe\\xc8\\x24\\xb0\\x45\\x02\\x1e\\x85\\x44\\x19\\xf4\\x59\\xc4\\x39\\xfd\\x54\\xe7\\x57\\x4b\\x01\\x14\\xf6\\x7e\\x1b\\xab\\xc5\\x3c\\x3e\\x1e\\x6e\\x92\\xce\\x9b\\x22\\xaa\\x99\\xea\\xa2\\x43\\x91\\xc9\\x6b\\x96\\xfa\\x01\\xd7\\xe9\\xeb\\x8b\\x57\\x70\\x46\\xdd\\x26\\x4c\\x79\\x59\\xa7\\x8c\\xfd\\xa1\\x1e\\xd0\\x0c\\xac\\x63\\x67\\xc2\\xb0\\x45\\x14\\x92\\x86\\xa7\\xae\\x98\\xf4\\x68\\x9e\\x5e\\xd2\\x53\\x3e\\x73\\x89\\x00\\x9a\\x47\\x5e\\x6e\\x51\\x2b\\x0e\\xdd\\xbc\\x0b\\xff\\x21\\x2f\\xc0\\x5a\\xbf\\x26\\x2e\\x0c\\x16\\xb2\\x62\\x77\\xaa\\x72\\x6f\\x43\\xab\\x4b\\xf5\\xd2\\xe3\\xb6\\xf6\\xc3\\x68\\x0f\\x4b\\x0f\\xd3\\xd6\\x6a\\xaf\\x2d\\x8a\\xaa\\xde\\x27\\x8a\\x7b\\x43\\xd5\\x4b\\xbc\\x9a\\x7a\\x51\\x47\\x74\\x78\\x9b\\x24\\xf1\\x35\\xae\\xb6\\xef\\x66\\x08\\xda\\xe0\\xe3\\x24\\xe1\\x42\\xf3\\x43\\xd3\\x76\\x09\\xcb\\xa3\\x97\\x93\\xa4\\xb2\\x01\\x5c\\xab\\xb2\\xa2\\xff\\xa5\\x40\\xea\\x92\\xb5\\x95\\xe8\\xed\\x5a\\x8f\\xa6\\xce\\x3d\\xfb\\x51\\x32\\x99\\xe0\\x39\\x46\\x0f\\x21\\xb6\\x65\\xfd\\x72\\xd3\\x60\\x40\\xd8\\xdc\\xd0\\x9b\\xd2\\x64\\x76\\x54\\xa3\\xd8\\x7f\\x08\\xe9\\x91\\xa6\\x72\\x6c\\x23\\xff\\xf6\\xc0\\x32\\x85\\xb5\\xb0\\x0e\\xa4\\x04\\x7a\\xb7\\x80\\xa1\\x6c\\xb9\\x15\\x45\\x77\\x4c\\x8b\\x18\\x66\\x20\\xc6\\xeb\\x5e\\xce\\x3b\\x4e\\xe7\\x9d\\x58\\xc8\\x1d\\x0c\\xdc\\xd4\\x8a\\x9a\\xcf\\x56\\xaf\\xc7\\x1f\\xf6\\xdc\\xe9\\xcd\\x56\\x69\\xe3\\xab\\x9b\\xff\\xc5\\x3b\\xbb\\x9e\\x18\\xf9\\xd6\\x15\\xc5\\xca\\xd1\\x3e\\x5a\\x9e\\xfe\\x55\\x06\\x3c\\xd4\\x59\\xab\\xee\\x9a\\x01\\x14\\x3d\\x72\\x8f\\xba\\x97\\x36\\xcd\\xa8\\x23\\xfd\\x8e\\x69\\xd5\\xe0\\x1d\\x97\\x95\\xa5\\x37\\xcc\\xde\\x4a\\xdd\\x6d\\xe8\\x04\\x45\\x7a\\xb0\\x89\\xd7\\x8d\\xdd\\x14\\x39\\x6a\\x18\\x72\\xef\\xeb\\x07\\xd8\\x9d\\x51\\xf0\\x86\\x4d\\x1b\\xf4\\x34\\x2b\\x76\\xc5\\xbe\\xdb\\xb2\\xa4\\x3c\\xee\\x7d\\xe1\\x93\\x16\\xc1\\x07\\x33\\x12\\x1b\\x62\\xce\\xd8\\x6f\\xf9\\x60\\x3a\\xcb\\xa7\\x18\\xa8\\x35\\x97\\x8d\\xa5\\xd2\\xa2\\xd3\\x1d\\xdd\\x1e\\x9e\\x02\\x42\\x77\\x2a\\xc7\\xee\\x83\\x77\\xe1\\xbd\\xd3\\xa8\\xca\\x70\\x1b\\xbf\\x2d\\x5a\\x24\\x18\\x6b\\x5e\\xfb\\xc1\\x28\\x5d\\xd3\\xb1\\x1a\\x76\\xe2\\x37\\x99\\xa3\\x7c\\x04\\x7b\\xa3\\x5b\\xf7\\xb9\\x13\\x01\\xfb\\x31\\x61\\xb9\\xb2\\x75\\x99\\xd4\\xec\\x01\\x0d\\x53\\x27\\x87\\x7e\\xa1\\x21\\x88\\x97\\x25\\x51\\xc1\\xe7\\x37\\x58\\xbb\\x51\\x6a\\x06\\xb3\\xc0\\xca\\xb6\\xc3\\x61\\xec\\xa7\\x54\\xb2\\x3b\\x92\\xd4\\x94\\xb6\\xe0\\x0d\\x8c\\x06\\x02\\x44\\x87\\x2f\\xdc\\xec\\x87\\xcf\\x5e\\x48\\xe6\\xf1\\x63\\x7a\\x21\\x2e\\xa4\\xdf\\x67\\xae\\x5b\\x61\\x3a\\x00\\xf8\\xd9\\xd7\\xf8\\xfe\\x3b\\xfc\\x72\\x80\\x7f\\xb9\\xa9\\x35\\xcd\\x11\\x84\\x63\\x69\\x0a\\x1d\\x36\\xa8\\x8d\\x90\\x0e\\x16\\x0a\\xca\\x2a\\x83\\xf9\\x58\\x75\\xc4\\x05\\x1b\\x2f\\x3a\\xe1\\x63\\x42\\xad\\x17\\x43\\x1d\\x2f\\x91\\x53\\xe4\\x36\\xfe\\x9a\\xc1\\x9a\\xd4\\x54\\x68\\x1f\\xc3\\xb2\\x93\\xe2\\x50\\x95\\x01\\x6c\\x71\\xca\\x97\\xe7\\xaf\\x75\\x26\\xc8\\x30\\xf0\\xba\\x34\\xe9\\x63\\x04\\xe9\\x30\\x56\\xe8\\x8f\\x3c\\x42\\x0d\\xf4\\x5c\\x76\\xdd\\xd8\\x52\\x91\\x32\\xae\\xdc\\x70\\x33\\x52\\xf1\\xe0\\xe4\\xd3\\x67\\xf4\\x8c\\xbd\\xfe\\x17\\xaa\\xf5\\x3c\\x9c\\x4a\\x1f\\x44\\x46\\xbe\\xe9\\x4a\\xfe\\x40\\x3e\\x30\\xf8\\x3d\\x3a\\xc4\\x28\\x13\\xc7\\x26\\xaf\\x55\\x64\\x83\\x06\\x72\\x10\\x2f\\x16\\xc6\\x9c\\xc6\\x37\\xe8\\x3b\\x17\\x2b\\xea\\x04\\xf8\\x26\\xc6\\xe4\\xdb\\xb0\\x7a\\x3e\\x6c\\x76\\x26\\x7b\\x93\\x13\\x00\\xc2\\xca\\x97\\x63\\x00\\xb4\\xb8\\x81\\x27\\x49\\x46\\x69\\xa1\\x2d\\x98\\x1a\\xed\\xe4\\x1f\\x3d\\x6b\\x5f\\xc0\\xf6\\x33\\xc1\\x71\\x63\\xd1\\x21\\x15\\x6c\\xf4\\x18\\x58\\x95\\x9b\\x83\\x85\\x49\\x1c\\xda\\x13\\x09\\x3e\\x1f\\xab\\x19\\xd2\\x0f\\xce\\x64\\xd9\\x2f\\x2a\\x46\\x45\\x6f\\x1e\\xf2\\x8f\\x47\\xc1\\xaf\\xbf\\x3f\\x3e\\x94\\x52\\x1b\\xf3\\xf7\\x50\\xa0\\x24\\x08\\xcc\\xf2\\x6d\\xc1\\x65\\xae\\x82\\xd1\\x4d\\x2c\\xc3\\x46\\x69\\xf1\\x84\\x90\\x72\\x99\\xf0\\x2c\\x1a\\x05\\xb0\\x7a\\xd3\\x7b\\xd0\\x31\\x07\\x3b\\x53\\x85\\xbf\\xb4\\xa4\\xfd\\xc6\\x38\\xb9\\xb7\\xa6\\x8f\\x36\\xae\\x8c\\x93\\x34\\x0e\\xf2\\xf0\\x0e\\xcc\\xd3\\xd7\\xaf\\xda\\xf6\\x37\\xb0\\x77\\x9c\\xac\\xb7\\x31\\xbd\\x4b\\x44\\x61\\x07\\xce\\xce\\xc2\\xed\\x6b\\x78\\x43\\xa7\\x3b\\x59\\x54\\xf2\\xbd\\xa0\\x0f\\x86\\x14\\xbf\\xff\\xd1\\xce\\x62\\xc8\\x7f\\x97\\xaa\\x5c\\xeb\\x7e\\x3c\\xf0\\xd3\\x7f\\x7a\\x05\\x8a\\x31\\xe3\\xd1\\xe0\\x65\\x7a\\x63\\x11\\x00\\x55\\x2a\\x21\\xbc\\x76\\x43\\xf0\\x86\\x87\\xe5\\xa5\\xff\\x7c\\x0c\\xb4\\xa4\\x43\\x7e\\xd1\\x8c\\xf0\\x1f\\x6c\\x59\\x51\\x94\\x61\\x1a\\x61\\xcb\\x6d\\xf8\\x9b\\xe8\\xac\\x37\\x08\\xee\\x4d\\xfc\\x55\\x14\\xdf\\x3e\\xfb\\x1a\\x37\\x48\\xfc\\xeb\\xeb\\xaf\\x9e\\xe1\\xff\\xef\\xd7\\x2e\\xbd\\xe9\\x56\\x7f\\x45\\xa5\\xe9\\xb7\\xf9\\x5d\\xf2\\x45\\x0b\\xee\\x2a\\xac\\xaf\\x85\\xd9\\x8c\\x3f\\x4d\\xf3\\xe4\\xfe\\x40\\x88\\x6c\\x32\\xee\\xba\\x88\\x6d\\x27\\xd0\\xa6\\x6f\\x07\\x99\\xdf\\xa9\\x24\\x4e\\xc1\\x03\\x28\\x6e\\xac\\xb5\\xa5\\xbb\\x9d\\x4b\\x52\\xc4\\x9f\\xa8\\xed\\x39\\xba\\xfa\\x2d\\xf4\\xe4\\x62\\xb5\\x78\\x4e\\x33\\x2f\\x0f\\x26\\xb7\\x85\\xd1\\x65\\x75\\xeb\\xa1\\x0b\\xcb\\x50\\xe9\\x50\\x56\\x8c\\xb2\\xa9\\x72\\x3b\\xf0\\xc9\\x17\\x71\\x09\\x8a\\x67\\xbc\\x5f\\xbd\\x06\\x7d\\x92\\xa5\\xe3\\x24\\x1e\\x95\\x03\\x03\\xcd\\x0b\\xd7\\x68\\xd3\\xc9\\x14\\x55\\xfc\\xdf\\x5a\\x73\\x5b\\xac\\x6c\\xad\\x12\\x6a\\x4e\\x15\\x16\\x3f\\x47\\xdd\\x86\\xb6\\xa9\\x9b\\x3a\\xc2\\x89\\xc7\\x43\\x50\\x7c\\x33\\xca\\x60\\xa9\\xdc\\xce\\x14\\xdb\\xda\\x04\\x55\\xfc\\x7c\\x01\\x75\\xdb\\xa1\\x14\\x75\\x95\\xa2\\x22\\x38\\x77\\x26\\xac\\x8e\\x4f\\xa6\\x1a\\xef\\x04\\x4e\\x1c\\xcd\\xe6\\x43\\x3b\\x64\\x42\\x35\\xf7\\xd5\\xe5\\xd7\\x58\\x36\\xd4\\x8c\\xad\\xeb\\x13\\x5c\\xfe\\x56\\xbd\\x59\\xf8\\xec\\x0b\\xb4\\xf9\\xea\\x05\\x90\\xbe\\x78\\xd6\\x55\\x19\\xca\\xb5\\xf0\\xb3\\x0f\\x01\\x77\\x4c\\xa4\\x2c\\x71\\x20\\xae\\xb5\\x28\\x4d\\x53\\x3a\\xf4\\x36\\xb0\\x08\\x53\\x3c\\x9a\\x25\\x61\\x5e\\x4d\\xc1\\xc1\\x13\\xbf\\x5c\\x81\\x40\\x2b\\xc9\\xf6\\x82\\xed\\x04\\xb5\\x98\\xdc\\x33\\x71\\x5f\\xbf\\xc7\\x6c\\x23\\x56\\x37\\xb9\\x56\\x8b\\x72\\xbc\\xec\\x64\\x59\\x7a\\xf4\\x18\\x15\\x05\\x02\\x59\\xcc\\x69\\xb6\\x08\\xaf\\xbd\\xa1\\x84\\x49\\xb9\\x85\\x54\\xdb\\x5b\\x4a\\xe4\\x4b\\x98\\x5f\\xc5\\x65\\x1e\\x62\\x75\\x29\\x74\\x78\\xc3\\xa2\\xc8\\x46\\x31\\xad\\x5a\\xe3\\xc9\\xdb\\xce\\xeb\\x26\\x75\\x96\\x2f\\x9b\\x16\\x4e\\xde\\x2b\\x89\\x0b\\x36\\xa2\\x71\\x72\\x5c\\x5b\\xcc\\xd7\\x4b\\xd9\\xb1\\x1c\\x03\\xd6\\x4c\\x6b\\x67\\x75\\x7b\\xb8\\xeb\\x11\\x00\\x59\\xab\\x02\\x99\\x6e\\xac\\x4d\\x63\\x35\\xb2\\x4e\\x3b\\x1f\\x80\\x57\\xbf\\x65\\x30\\x2f\\x65\\x43\\xa0\\x17\\xe9\\xa7\\x4a\\x5a\\x35\\xfc\\x8e\\xb2\\x56\\xb5\\x95\\x87\\x81\\x43\\xe8\\xa1\\x4e\\x07\\xbf\\x04\\x89\\xba\\x6c\\xb8\\x93\\xcf\\xc4\\xe1\\x19\\x81\\x2c\\x98\\xf9\\x25\\x31\\x9e\\x82\\x88\\xae\\x73\\xad\\x95\\x1e\\x9c\\xe9\\xe6\\x34\\x8c\\xc6\\x97\\x07\\xe6\\x31\\x0e\\x20\\x93\\xee\\x93\\xa0\\xd0\\x7e\\x82\\x61\\x8d\\xf6\\x41\\x1f\\x15\\x13\\x2c\\x71\\xbb\\x29\\xdb\\xd2\\x73\\xe8\\x13\\xa5\\x68\\x07\\x55\\xf6\\x5b\\x16\\xed\\xa9\\xe8\\x79\\xde\\x64\\x3f\\xda\\xc6\\xd6\\x7a\\xe7\\xe5\\x0c\\x46\\x0d\\x39\\x99\\xb3\\xf5\\x1d\\xb8\\x97\\x5f\\x49\\x5b\\x9b\\x98\\x51\\x76\\x13\\xc4\\x66\\xe2\\xda\\x59\\xe1\\xc9\\xa2\\x5a\\x73\\x6d\\x3d\\x2e\\x3d\\xc6\\x2e\\x6f\\xad\\x61\\x49\\xca\\xb4\\xb4\\x5d\\xf6\\x31\\x97\\xd4\\xed\\x7e\\x37\\xfe\\x68\\x7a\\xe6\\x82\\x69\\x93\\x47\\x95\\xbc\\x53\\x9f\\x8c\\x92\\x6c\\x59\\x97\\x2f\\x03\\x46\\xbd\\x19\\x54\\x95\\xbc\\x0d\\xed\\x1e\\x52\\x43\\x90\\x1b\\x6a\\x6f\\xad\\x05\\xaa\\x59\\x5f\\xb6\\x1e\\xe6\\xb4\\xfa\\xee\\x68\\x8c\\xf2\\x0d\\x41\\xe2\\x5a\\x5d\\x3e\\x60\\xda\\x97\\x2d\\x22\\xd2\\xda\\x4b\\xe1\\x42\\x47\\xc3\\x24\\xa7\\x76\\x5c\\x6b\\x6e\\x6c\\x3c\\x59\\x91\\x9b\\x55\\x24\\x85\\xea\\xf4\\xe3\\x2e\\xa1\\x13\\xec\\x4c\\x69\\x00\\x9f\\x51\\x0f\\x22\\x17\\x0b\\x49\\x05\\xd5\\x5b\\xa8\\xa9\\x9f\\xd7\\xa6\\x4f\\xd7\\xf6\\x68\\x7a\\x87\\x3d\\x38\\x39\\xf9\\x58\\x97\\x9d\\xa8\\xac\\x36\\xee\\xe5\\x2b\\x84\\x7e\\x20\\x12\\xeb\\xe9\\x60\\x4b\\xfd\\x5f\\xa2\\xca\\x71\\x53\\x83\\x62\\xd6\\x1f\\x36\\x9d\\x5c\\x5f\\x26\\x66\\x42\\x4a\\x4f\\xbd\\x62\\x41\\xb6\\xd9\\xcd\\x58\\x4f\\xde\\xd8\\x6e\\xe2\\x51\\x30\\x33\\x4b\\xad\\x22\\x0d\\xa9\\x53\\xd6\\xe3\\xd0\\x9c\\x8d\\xcd\\x69\\xd0\\x3c\\x72\\xa3\\x0d\\x08\\xb0\\x9b\\x4e\\xbf\\x34\\x9f\\x6c\\xdc\\xaa\\xd6\\x15\\xa5\\xa3\\x1b\\x0c\\x96\\x8d\\x88\\xc1\\xe9\\x00\\x7f\\x92\\x76\\xe5\\xc8\\x37\\x34\\x56\\xdf\\xd2\\x9a\\x6c\\x9c\\xd4\\x23\\x7d\\x97\\x91\\xc3\\x83\\x54\\x6b\\xbc\\xe0\\x6f\\x8d\\x4a\\x9b\\x2d\\x8f\\xfa\\x89\\x43\\xd3\\xe9\\xcb\\xc8\\xb9\\xfa\\xe9\\x9f\\x91\\xe5\\x62\\x0f\\x85\\x78\\xf8\\x11\\xa7\\x74\\xa0\\x3d\\x2b\\x63\\xee\\x58\\xe8\\x54\\x0e\\x73\\xbc\\xf3\\x5c\\x5d\\xc7\\x05\\x06\\x17\\xe9\\x4c\\x67\\x9a\\xf8\\x6d\\x94\\xc4\\x7d\\x27\\x19\\x20\\xce\\x15\\x78\\xcf\\xe2\\x36\\xfb\\xa0\\xea\\xbf\\xa3\\x09\\x80\\x05\\x3b\\xf8\\x7a\\x81\\x3e\\xcf\\x43\\x18\\xc3\\x38\\xc1\\xac\\x48\\x5b\\x23\\x16\\x36\\x4b\\xd7\\x6d\\xc4\\xbd\\xc1\\xfd\\x77\\x55\\xfa\\x2b\\x4c\\x90\\x86\\x9d\\x74\\x59\\xa2\\xbd\\x8d\\xc6\\x2f\\xb3\\xa2\\x74\\x32\\x68\\x3d\\xaa\\x09\\x9d\\x7c\\xee\\x38\\x4e\\xe1\\xc0\\x99\\x82\\x4e\\xd6\\xe4\\x51\\x43\\xc1\\x9d\\x5a\\x3c\\xb5\\xb3\\x18\\xcf\\x29\\xaf\\x36\\x6f\\xde\\xf1\\xc7\\x23\\xb9\\x5e\\x8a\\xff\\x03\\xcf\\x11\\x03\\xb8\\xa6\\xa1\\xc6\\x73\\xf3\\xc4\\x26\\xbc\\xd2\\x50\\xb8\\x24\\xf1\\xcc\\xab\\xa1\\x7b\\x3a\\x7a\\x5c\\x24\\xcc\\xe6\\x7e\\x4a\\x41\\x9d\\xaf\\x0e\\x9d\\xef\\x9f\\x99\\xbf\\xe9\\x1e\\xc5\\x2d\\x5e\\xb8\\x76\\x2f\\xd9\\xe2\\xff\\x0a\\xba\\x69\\xdb\\x04\\x0b\\x6c\\xea\\xe4\\x6c\\xff\\x1a\\x14\\x89\\xbd\\xa2\\xf8\\x1c\\x58\\x5d\\xd8\\xcb\\xba\\xda\\xe1\\x6c\\x00\\xfe\\x3b\\x8a\\x8a\\x80\\x1f\\x1d\\xe9\\x4e\\x79\\x54\\xef\\x49\\x43\\xdb\\x0c\\x68\\x36\\x1e\\x57\\x6a\\x0e\\x30\\x90\\x6a\\xea\\x78\\x07\\xbf\\xd7\\x89\\x7e\\x19\\x7e\\x50\\x5e\\xcc\\x9e\\x25\\x55\\x2f\\x15\\xd4\\x6b\\x59\\xaa\\x3d\\xd5\\x98\\xda\\xa7\\xe1\\xbd\\x2a\\x69\\xd0\\xe6\\xba\\xf3\\x72\\x14\\xd4\\x76\\x4a\\x29\\xc3\\x5f\\xde\\x28\\xe7\\xee\\x37\\xdd\\x65\\xd1\\xe7\\x53\\x26\\xcc\\x48\\x67\\x93\\xb5\\xdd\\x59\\xbf\\x86\\x23\\x38\\x71\\x70\\xdb\\x53\\x4d\\x9e\\x0f\\x30\\x14\\xba\\xaf\\xd5\\xbc\\x99\\xcb\\x36\\x57\\x6b\\xf0\\x73\\x6d\\xf5\\xd0\\x63\\xa7\\xc9\\xda\\xbd\\x7b\\x8d\\xd3\\xed\\x8f\\x77\\x55\\xab\\xae\\xa6\\x67\\x31\\xed\\xdf\\x4c\\x07\\x5d\\x4b\\x58\\x19\\xa1\\x72\\x94\\x9d\\x67\\x1f\\xef\\x07\\x42\\x1d\\x6e\\xf3\\xe2\\x56\\xb1\\x32\\xc7\\xd0\\xa6\\xec\\x95\\x2e\\x4e\\x82\\x2f\\xd6\\xa1\\xb6\\xd5\\xaf\\x9a\\x5c\\xc2\\x6d\\x31\\x7b\\x93\\xac\\xa2\\x5d\\xe6\\xb2\\xb2\\x99\\xf7\\x93\\xa8\\x60\\x60\\x47\\x0e\\xbd\\xcb\\xce\\x2e\\x50\\x0c\\x70\\x3d\\xc8\\xbb\\x2e\\x11\\x61\\x37\\x3c\\x4e\\xad\\x45\\xd2\\x25\\x19\\x35\\xbe\\xfb\\x65\\x08\\x7a\\x49\\x01\\x0d\\x27\\xb5\\xa5\\x9a\\xab\\x24\\xb4\\xeb\\x05\\xd9\\xcd\\xf9\\xf2\\x1b\\xd6\\xb1\\x21\\xe7\\xee\\x23\\x9e\\x18\\xf1\\x0d\\x4f\\x63\\x60\\xb5\\x7a\\x71\\x13\\xd8\\xea\\x30\\x9b\\x01\\x99\\xa6\\xff\\xa6\\x48\\x07\\x8c\\x99\\xcd\\xaa\\xbd\\x31\\xb1\\x19\\xee\\x40\\x5e\\x3b\\x6a\\x3a\\x8c\\xc3\\x73\\x6e\\x47\\xbc\\xc7\\xa9\\x44\\xf0\\x82\\x67\\xcf\\x2e\\xcf\\x5f\\x9e\\x1f\\xc1\\x5e\\x35\\xd2\\xd1\\xc6\\x3b\\xf0\\x49\\x43\\x49\\xb7\\xc1\\x14\\x15\\x94\\x37\\x1e\\x25\\x2e\\xe8\\xc8\\xbf\\xe6\\x0e\\x3e\\x0b\\x6c\\x51\\x07\\xfa\\x45\\xfa\\xf7\\x1f\\xf9\\xf5\\x7a\\x1a\\x4e\\x31\\xd0\\x1f\\x65\\xbc\\xa8\\xd9\\x5f\\xe8\\x19\\x51\\xe8\\x75\\x80\\xb7\\x5d\\x8c\\x00\\x69\\x04\\x88\\x36\\x7a\\xea\\x36\\xef\\xbe\\xd6\\x55\\xa3\\x0f\\xa8\\x0c\\x2f\\xd7\\xe2\\x25\\xb8\\x54\\x27\\xf6\\xdc\\x97\\x84\\x8a\\xc7\\xad\\x8e\\x59\\x19\\x2b\\x6a\\x1f\\xeb\\x4a\\x39\\x6f\\x5d\\xdd\\x07\\x83\\x0a\\xe8\\xfb\\xed\\xb3\\xe8\\xb2\\x04\\xdc\\xb2\\x7b\\x60\\x00\\x77\\x6c\\x39\\x33\\x74\\x2f\\xa7\\xfc\\x98\\xab\\xfd\\xc6\\x23\\x90\\x2f\\xee\\x11\\xe5\\x94\\x0f\\xd6\\x57\\x5a\\x53\\xd3\\xb6\\x9c\\x7b\\x43\\x4e\\xf0\\x2a\\x3e\\x06\\xa2\\xe9\\x13\\xee\\x1a\\x0e\\x53\\x80\\x71\\xa7\\x03\\xf5\\x5c\\x15\\x11\\x2b\\x43\\x1f\\x72\\x50\\xdc\\xf9\\xe9\\x20\\x89\\x3f\\x98\\x60\\x3f\\xdb\\x84\\x61\\x90\\xa8\\xf4\\x1a\\xfe\\x30\\x4a\\x63\\x00\\x36\\xdc\\x0d\\x06\\xcc\\xac\\x36\\x7d\\x5a\\x38\\x2a\\x40\\xb4\\x08\\x45\\xb5\\x05\\x0c\\xa2\\x25\\xa8\\x0b\\xc6\\x26\\x8d\\x14\\xb8\\x1b\\x64\\x5c\\xff\\x19\\xc1\\xe6\\x09\\x0e\\xbe\\x3c\\x0c\\xce\\x89\\xb0\\x06\\x52\\x77\\x80\\xdb\\x38\\x44\\xda\\xc7\\xb9\\x68\\x91\\x7a\\xb4\\xbb\\x2e\\x3a\\xa6\\x46\\x95\\xa3\\x8d\\x4d\\xdd\\x65\\x8c\\x42\\x38\\x44\\xea\\xf4\\x71\\x7c\\x63\\x52\\xeb\\x56\\xd7\\xe5\\x53\\xb7\\x6d\\x27\\xd1\\x78\\x8d\\x0b\\x6d\\x47\\x63\\x99\\x58\\xb8\\x8e\\x82\\xcb\\x9f\\x7e\\x1e\\xda\\x07\\xf6\\xa0\\x9e\\x68\\x74\\x96\\x4a\\x06\\x82\\xae\\x6e\\x40\\xf1\\xc7\\xf3\\xf1\\xa9\\x76\\x12\\x2e\\xf5\\x26\\x69\\x86\\x68\\x8b\\x03\\x7e\\x96\\xa5\\x4f\\x46\\x96\\x9a\\x05\\x09\\x2d\\xa5\\xf9\\x82\\x64\\x0b\\x87\\x3a\\x52\\xe4\\x14\\x0e\\x99\\x2b\\x47\\xaf\\x55\\x7e\\xad\\xac\\xcd\\x40\\x2c\\x02\\x1b\\xe2\\x2e\\xab\\x9e\\x14\\x02\\x49\\xae\\x39\\x22\\x4a\\xde\\x22\\x99\\x01\\x54\\xac\\xd6\\x47\\xab\\x42\\x28\\x29\\x2d\\x6a\\x8f\\x92\\x2d\\x8d\\x72\\x70\\xa4\\xe3\\x5b\\x65\\x8e\\xe8\\x9d\\xe3\\x33\\xdc\\x72\\x6c\\x0d\\x7c\\x97\\xe3\\x62\\x87\\x60\\xfa\\x48\\xee\\x8c\\xc5\\xc5\\xf2\\x68\\x28\\x09\\xce\\x9a\\xea\\x94\\x38\\x18\\x17\\x5f\\x21\\x6f\\x35\\x4b\\xea\\x36\\x8a\\x9f\\xcd\\xf1\\xa5\\x03\\xad\\x9b\\x3d\\x62\\x01\\x72\\x20\\xc5\\x8c\\x11\\xa2\\x60\\x5c\\x0b\\xe1\\xf0\\x10\\x6f\\xb0\\x40\\x7d\\x15\\x13\\x67\\xd8\\xee\\xb1\\x44\\x48\\x08\\xbb\\x81\\x2e\\x5a\\xc9\\xb7\\x30\\x19\\x56\\xa7\\xa2\\xb1\\xcc\\xd7\\x6d\\x35\\x6f\\x98\\xdd\\x91\\x52\\x53\\x2c\\x06\\x01\\xa6\\x98\\xd4\\x82\\x60\\x8c\\xae\\xf0\\xee\\xa5\\xc2\\x6c\\xa6\\xd1\\x2c\\x2f\\x90\\xeb\\x83\\xf0\\x43\\x78\\xc8\\xef\\x8f\\xb2\\xe9\\x7d\\xcd\\x44\\x15\\xc1\\xf1\\xad\\x6e\\x26\\x04\\x95\\xf5\\x9a\\x23\\x42\\x3b\\xc6\\x5a\\xa4\\x83\\x31\\x1c\\x86\\xc1\\x52\\x9c\\xae\\x85\\x20\\xe4\\x94\\xa6\\x00\\xca\\xbb\\x47\\xec\\x78\\x0f\\x49\\xb2\\x15\\x92\\xfb\\x56\\xa7\\x27\\x62\\x1b\\xb7\\xfa\\x9d\\xcd\\x34\\xa8\\x5c\\x06\\xa1\\xf1\\xb0\\xc6\\xe0\\x60\\x44\\x55\\x2e\\xfd\\xe3\\xbc\\x2a\\x6c\\xdf\\x52\\x76\\x9d\\x73\\xb4\\x56\\x78\\xf7\\x35\\x78\\xff\\x2a\\xc2\\x32\\x2e\\x38\\xf7\\x89\\x1b\\x9f\\x9a\\x70\\x11\\x8b\\x85\\xdc\\x43\\x96\\x6f\\xe4\\x96\\x6f\\x48\\x81\\x17\\xeb\\x71\\x57\\x3d\\x1f\\x7a\\xf7\\xd2\\x44\\xd5\\x6d\\xff\\x6d\\xf4\\x08\\x66\\xd7\\x37\\x55\\x56\\xe3\\x9c\\x15\\x2d\\x9f\\xe9\\xfb\\xd9\\x7c\\xa1\\x1b\\xf6\\x09\\x18\\xf7\\x1a\\x6d\\xc4\\x92\\x21\\x1b\\xfb\\x45\\xbc\\xab\\x4e\\x93\\xa8\\x22\\xfc\\x6e\\xa8\\x2b\\x71\\x04\\x1c\\xd3\\xb1\\x1f\\xe9\\x97\\x50\\xdb\\x1f\\xfa\\x00\\x88\\xe3\\x97\\xeb\\x7a\\xcf\\x3a\\x79\\x85\\x4f\\xb3\\x03\\x4e\\x9f\\xd2\\xdb\\x90\\x93\\x9a\\x72\\x07\\x83\\x81\\x1f\\xd1\\x5c\\xec\\x3a\\x4e\\x61\\x8f\\x2a\\x71\\xed\\xee\\xf1\\x9f\\x7b\\x94\\x50\\xc6\\x45\\x5d\\xb0\\x5c\\x59\\x56\\x3a\\xc9\\xf5\\xa5\\x4e\\x3c\\x73\\x82\\x05\\xe2\\x79\\x3b\\xc9\\x9b\\x85\\xbe\\x06\\x3f\\xa6\\xb0\\x8f\\x61\\xf5\\xd8\\x64\\xdf\\xed\\xe9\\x8d\\x6d\\xcf\\x0c\\x80\\xaa\\xe3\\xb0\\x0a\\x87\\xd1\\x27\\x9b\\x9a\\x95\\x10\\xad\\x88\\x74\\xae\\xa6\\x68\\xe6\\x85\\xbc\\xd3\\xa2\\x61\\x47\\x13\\x1f\\x99\\x74\\xd2\\xf3\\xb1\\xec\\xc2\\x97\\xc3\\xa0\\xc9\\xbe\\xa3\\x4d\\xd8\\x2c\\x6a\\x46\\xc7\\x4b\\xef\\xb9\\xc4\\xb3\\xa6\\xea\\xda\\xb8\\x30\\xfd\\xe0\\xd1\\x65\\x35\\xa9\\x17\\x7c\\xf4\\x8d\\x56\\x17\\x66\\x4a\\x6a\\x7c\\x6d\\xd0\\x83\\xba\\xbc\\x13\\x14\\xc1\\x00\\x3e\\x3d\\xf8\\x12\\x37\\x3e\\xe4\\xda\\x38\\x9b\\xa5\\x51\\x5b\\xf5\\x00\\x9b\\x14\\x21\\x59\\x1c\\x4d\\xfd\\xe8\\xfd\\xc5\\x63\\x4e\\x78\\x64\\xc5\\xd8\\x78\\x3a\\x7f\\x59\\x5b\\x41\\x60\\xca\\x9d\\x11\\x5c\\x5a\\x9e\\x4d\\x51\\x32\\x46\\xa1\\xb4\\x23\\x70\\xa9\\x20\\x5e\\x0f\\x34\\x16\\x81\\xa6\\x6f\\xd8\\x83\\x20\\xfc\\x59\\x1b\\xb7\\x24\\xdf\\x66\\xe9\\xe2\\x71\\x2d\\xef\\xec\\x30\\xa2\\xcf\\xc6\\x38\\x95\\x44\\xa1\\xaf\\x07\\x3a\\x69\\x63\\x18\\x78\\x3c\\xd5\\xf0\\xbd\\x30\\x7c\\xb3\\x11\\xd2\\x2a\\x73\\xea\\xe7\\xc3\\x8c\\x88\\x5d\\xb5\\x9a\\x35\\xed\\x19\\xa3\\xba\\xd0\\x3a\\xea\\x05\\xbc\\xd5\\xa2\\x47\\x92\\x55\\x16\\x37\\x0e\\x23\\xc8\\x14\\x5c\\xd1\\xd0\\x29\\x47\\xea\\xc5\\x49\\xbb\\x7c\\xf8\\xd4\\xad\\x47\\x35\\x99\\xa2\\xad\\xae\\x7d\\x5b\\x2c\\xb8\\xae\\xc8\\x02\\xa7\\x18\\xad\\xdd\\xb8\\xda\\xc4\\x06\\xb1\\x70\\xb7\\x66\\xd7\\xf0\\xd5\\x87\\xd9\\x76\\xea\\xb8\\x7c\\x2a\\x53\\x56\\xb1\\x39\\xc5\\x1f\\x99\\x1c\\x7d\\x70\\xb2\\xd4\\x8f\\xc7\\x3e\\xe1\\xb5\\x5d\\x58\\xc8\\xb5\\xcc\\x42\\xae\\x65\\x9a\\xe4\\x88\\x2e\\xab\\xa5\\x37\\x4f\\x6a\\x07\\x16\\x1a\\x0f\\x7d\\x9e\\xb5\\x10\\x12\\xf6\\xbe\\x47\\x5c\\x16\\xbe\\x0c\\x89\\xfc\\xcd\\xa1\\xbe\\x59\\xb2\\xa8\\xe7\\xe9\\x5e\\x48\\x15\\xae\\x37\\xec\\x55\\x69\\xc9\\x5f\\x41\\x62\\x42\\x3f\\x6b\\x7b\\xa0\\x53\\x3b\\xf9\\x8e\\xda\\xde\\xaf\\xbf\\xef\\x21\\xad\\xf6\\xd0\\x0a\\x63\\x52\\xee\\xad\\x51\\x76\\xfc\\xc9\\xab\\x48\\xbe\\xc5\\x67\\xcb\\x08\\x51\\xeb\\x12\\x96\\xad\\x72\\x65\\x71\\xf1\\x87\\xd1\\xf0\\xfe\\x40\\xbf\\x2e\\xb5\\x86\\x29\\xc6\\x95\\xa2\\x21\\x16\\x17\\xce\\x5e\\xf0\\xe3\\xeb\\x57\\x36\\xf7\\x19\\xb5\\x3f\\x2b\\x10\\xf7\\xe7\\x36\\x6e\\xd0\\x60\\x12\\x3c\\xa3\\xbf\\xfb\\xf0\\xa3\\x3e\\x6b\\x15\\x47\\x78\\xf6\\x32\\x1b\\x0d\\x52\\xb2\\x05\\xdf\\xc0\\xff\\x77\\xc5\\xc5\\x4e\\x32\\x36\\x3e\\xb4\\xce\\x73\\x03\\x0d\\xec\\x7e\\x84\\x64\\x01\\xb8\\xd6\\xa8\\xa7\\x1c\\x9b\\x4b\\x20\\xbb\\x49\\xf8\\xbc\\x43\\xf2\\x50\\x29\\xd8\\x95\\xe0\\x34\\x1c\\xd7\\xd5\\xeb\\x24\\xfc\\xa0\\x6a\\x0a\\x56\\x52\\x42\\x6a\\x41\\x65\\x2c\\x93\\x4a\\x59\\x04\\x68\\x65\\xa0\\x31\\xa7\\xe9\\xd2\\x50\\x79\\x19\\x97\\x85\\x49\\x8b\\xa0\\x77\\xdb\\x40\\xb7\\x06\\xea\\xb1\\x36\\x50\\x4b\\x3d\\x53\\xcf\\x28\\xc4\\x9a\\xec\\x53\\x31\\xab\\xc9\\x4a\\x9d\\x67\\xa1\\x12\\xe6\\x06\\x72\\x33\\x12\\x46\\xa0\\xb4\\x99\\x9a\\xde\\x6b\\x03\\xf5\\x07\\x96\\x5b\\x77\\xce\\x21\\x1b\\xad\\x74\\xe2\\x54\\x68\\x80\\xc4\\x6c\\x1d\\xf0\\x2a\\xda\\x6f\\x5c\\xfd\\x93\\x70\\xca\\x7d\\xf6\\x3d\\x33\\xcd\\x09\\x97\\x2c\\x62\\xaa\\xbd\\x07\\x6e\\xbf\\x6f\\x48\\xff\\xd9\\x24\\xab\\xcf\\x73\\x51\\x25\\x96\\xe5\\x30\\x9c\\xa3\\x5e\\x1e\\x86\\xf9\\xc4\\xaa\\xe7\\xf3\\xf9\\x0e\\xb0\\x62\\x3a\\xa8\\x67\\xd0\\x59\\x72\\xe8\\xa8\\xe0\\xe1\\x7c\\xb1\\xa8\\x24\\x9a\\xf0\\xf2\\x0e\\x8e\\x6d\\x59\\x67\\xf1\\x0c\\x45\\x31\\x8d\\x81\\x24\\xe0\\x39\\x53\\x28\\x48\\x3e\\xe1\\x3e\\x21\\xe4\\xcf\\xf3\\xc7\\x6b\\x96\\xb3\\x81\\xc7\\x2f\\xf1\\xc6\\x1d\\x49\\xb3\\x7b\\xac\\x88\\xd8\\x79\\xfe\\x77\\xe9\\x00\\xe1\\xe4\\x0e\\x2c\\x18\\x84\\x93\\x8e\\x8f\\x6d\\xc1\\x98\\x4e\\x2d\\xc8\\xaf\\x5c\\xfa\\x2f\\x9b\\x50\\xc4\\xb0\\xe6\\x7e\\x6b\\x46\\x47\\x51\\xfd\\xc0\\x5a\\x9e\\x5d\\xba\\xf2\\xe0\\x8e\\x56\\x01\\x6c\\x18\\xcc\\xc0\\x33\\x87\\x7d\\xb6\\x6a\\x92\\xd0\\xcb\\x68\\x8b\\xd3\\x6b\\xb2\\x5c\\x79\\x44\\xfa\\x47\\x9b\\x53\\x84\\x37\\xac\\xc8\\x66\\x6d\\xb6\\xc0\\xd2\\x2c\\x9b\\x0e\\xda\\xa8\\x6b\\x1a\\x23\\xc9\\xf1\\xa6\\xb9\\xd3\\xa0\\x73\\x7a\\x74\\x3a\\x5a\\x19\\x4f\\x54\\x75\\xdc\\xbb\\x41\\x87\\x37\\xa0\\x0f\\x16\\xef\\x54\\x92\\x1c\\x60\\x61\\x45\\xc5\\xd5\\x5e\\xdc\\x93\\xc6\\xdc\\xc9\\x94\\xb7\\x22\\x5a\\xbb\\xf2\\xd0\\xc6\\x44\\xbc\\x45\\xce\\x91\\x18\\x67\\x5c\\x5c\\xe5\\x78\\x3d\\xaa\\x72\\xc8\\x8a\\x3f\\x51\\x85\\x14\\xfc\\x68\\x5e\\x08\\xe6\\x2d\\xdf\\xaf\\x0a\\x6d\\x99\\x70\\x5c\\x81\\xcd\\xbb\\x7a\\x35\\xca\\x47\\x89\\xaf\\x1e\\xd6\\xf8\\x95\\x05\\x8e\\x0e\\x8c\\xf3\\xea\\xdd\\x64\\xfa\\x09\\x5e\\x94\\xfb\\xeb\\x06\\x3c\\xb6\\x15\\x66\\xdc\\x88\\xa7\\xce\\x3c\\xca\\xd1\\x62\\x17\\x4f\\x37\\xda\\xb0\\xb7\\x6e\\xc8\\x61\\x4c\\x35\\xad\\xe9\\x14\\x76\\x6c\\x70\\x6a\\xa3\\x29\\x3c\\x5d\\xcb\\xb8\\x8c\\x16\\xfc\\x34\\x19\\xc0\\x03\\x07\\xa3\\xb6\\x16\\x11\\x7e\\x4b\\x6d\\xca\\xc7\\xc1\\x00\\x96\\x23\\x0c\\x3f\\xfd\\x74\\x92\\x80\\x2b\\xf3\\xf3\\xcf\\x12\\x0f\\xeb\\x16\\x0e\\xdf\\x12\\xc5\\x78\\x69\\x9f\\x71\\x2b\\xe0\\xdf\\x4f\\x55\\x9f\\xf6\\x16\\x17\\x59\\x5e\\x3a\\x81\\x96\\xca\\x55\\x5c\\xaa\\xca\\x4b\\x09\\x9e\\x43\\x27\\xd5\\x7d\\x36\\x4d\\xe4\\x66\\x3b\\x67\\xc4\\x45\\xb5\\x5b\\x7e\\x54\\x8c\\xfc\\x2e\\xcb\\xa5\\xff\\xa5\\xe9\\x6f\\xeb\\x8f\\x8d\\x36\\xb5\\x74\\x53\\xb0\\xa5\\xf3\\x7b\\x9b\\x50\\x95\\xe1\\x7c\\xf4\\x67\\x69\\xfc\\xaf\\x99\\xd2\\xd6\\x83\\x7b\\x33\\xd8\\xfc\\xdd\\x7f\\xed\\x78\\xa4\\x41\\xdb\\xb7\\xf5\\x8a\\x14\\xae\\x20\\xba\\xa3\\xd7\\xbe\\x68\\xaa\\x09\\x28\\x95\\x84\\x6b\\xaa\\x43\\xa1\\xbb\\xd8\\xe9\\x77\\xbc\\x7b\\x8f\\x34\\xfe\\x38\\x0f\\xaf\\x39\\x9f\\xd8\\xbf\\xf8\\x58\\x99\\xe4\\x83\\x52\\x53\\x16\\x95\\x62\\xee\\x75\\x38\\xbe\\xdb\\xa6\\xa4\\xb4\\x45\\xe1\\x9c\\xc9\\x98\\x59\\x19\\xab\\xfa\\xea\\xc7\\x87\\xde\\xf2\\x77\\x6f\\xdd\\xe3\\x43\\xe7\\x4e\\x88\\x01\\xc8\\x0b\\x99\\xb5\\x58\\xe3\\x9f\\x39\\xb2\\x09\\x8e\\xd8\\xb2\\x0a\\x73\\xd8\\xe1\\xb7\\x05\\xd1\\x57\\x1e\\x53\\x4c\\x3e\\x1e\\x29\\x5d\\xf9\\xb9\\xb1\\x98\\x73\\xbd\\x49\\xd0\\x3b\\x9d\\xa8\\x1a\\xba\\x15\\x4d\\x2b\\xb5\\xd9\\xbd\\x52\\x9f\\xb6\\xa1\\x04\\xb7\\x74\\x60\\xef\\x17\\x5f\\x39\\xed\\xaa\\xbd\\x21\\x83\\x57\\xed\\xe7\\x2b\\x25\\x99\\xaf\\xd5\\xee\\xf9\\x30\\xde\\x89\\x4c\\xe4\\x54\\x46\\x55\\xb5\\x5c\\x24\\x9d\\xdd\\x04\\xfb\\xda\\xf7\\x65\\x39\\x7d\\xc7\\x50\\x1e\\x55\\xfe\\x3d\\xa4\\x01\\xcf\\x75\\xd5\\xcf\\xa6\\x6e\\x84\\x0d\\xd7\\xa0\\x96\\x26\\x8d\\x9c\\xd7\\xa7\\x9c\\x94\\x54\\x23\\x54\\xb0\\x6e\\x4a\\x9d\\x52\\xee\\x53\\x1f\\x32\\x55\\xcb\\xd5\\x0c\\xe7\\x56\\x86\\x1d\\x72\\xfa\\x56\\x4a\\x73\\xf4\\x24\\xdd\\x31\\xdd\\x93\\xe8\\x28\\xe8\\x20\\x19\\xc4\\xa1\\x4f\\x40\\x53\\x1e\\x69\\xe3\\x04\\xbb\\xc0\\x73\\xc0\\xe5\\xe9\\x75\\xde\\x51\\x3e\\x76\\x3d\\x72\\x65\\xbd\\x0e\\x8f\\x40\\xba\\x9b\\xc6\\xc6\\xe9\\x83\\x39\\xda\\x0e\\x81\\xd6\\x84\\x15\\x7a\\xf4\\xfe\\x8a\\xa1\\x04\\x51\\xbd\\x6c\\xa2\\x6d\\x20\\x06\\xbe\\xcb\\x22\\x78\\xcd\\x15\\x65\\x44\\x0c\\x53\\x4e\\x6a\\xc2\\x6c\\x7b\\x58\\x48\\xd6\\x3e\\x15\\x8c\\xd8\\x02\\x8a\\x3c\\xdb\\xfa\\xb5\\x66\\x2f\\x61\\xaf\\xd2\\xaf\\xbd\\xe0\\x1a\\xda\\xfa\\xf6\\x96\\x92\\x09\\x3d\\xd0\\x06\\x6a\\x1c\\xdc\\x7e\\xf7\\x80\\x76\\xa2\\x16\\x9b\\xd9\\x1c\\x7a\\x15\\x63\\x33\\x5a\\xa0\\x26\\x4e\\x3e\\xc7\\xb1\\xfe\\x48\\x63\\x45\\x33\\xfe\\xe7\\x6f\\x9a\\xd3\\x4e\\xc3\\xa7\\x01\\xf7\\xa0\\x28\\xd4\\x25\\xe5\\x07\\x77\\x15\\x8c\\xec\\x96\\x8f\\x1e\\xec\\x3f\\xa5\\x4a\\xac\\xb6\\xc4\\x0b\\x35\\x44\\x30\\x71\\x90\\xd0\\x31\\x22\\xf1\\x08\\x96\\x5a\\x21\\x52\\x25\\x2a\\x1f\\x49\\x53\\x78\\x72\\xb0\\xef\\x37\\x0a\\x5b\\x68\\x26\\xc7\\x40\\xa5\\x84\\x25\\x92\\x40\\x2e\\x6c\\xde\\x32\\x9d\\x74\\x34\\x3b\\xea\\x6a\\x62\\xd6\\x18\\x40\\x89\\x24\\xe1\\xc2\\x9e\\x28\\x8f\\xd0\\x23\\x1c\\xa8\\x82\\x5a\\x92\\x50\\xb4\\x50\\xc2\\x78\\x02\\x6e\\x45\\xd0\\xdb\\x2c\\x67\\x1a\\x86\\xae\\xaa\\x9d\\x77\\xb4\\x09\\xa0\\xb7\\x94\\x4e\\x27\\xf7\\x7a\\xb4\\xd0\\x23\\x5b\\xff\\xc3\\x34\\xec\\x6a\\x59\\x68\\xa2\\x56\\xa2\\x88\\x3c\\xda\\x81\\x99\\xbe\\xe1\\x4a\\xd5\\xd6\\x68\\x60\\x16\\xcd\\x71\\x35\\x37\\x21\\x9e\\xd3\\x3e\\x81\\x91\\x67\\xe6\\x37\\xd0\\xc6\\x94\\x15\\xb2\\xef\\x0d\\x8a\\x7d\\xac\\xbf\\x40\\x99\\x4f\\x6e\\x28\\x76\\x9a\\x71\\xd7\\x36\\x8d\\x81\\x49\\xd7\\x4e\\x0d\\x42\\x3a\\xd9\\xa4\\x79\\x54\\x92\\x48\\x9d\\xa8\\xd9\\x3f\\x7c\\xaa\\xa3\\x67\\xf5\\xf9\\x5a\\x38\\x26\\x49\\x14\\x04\\xb5\\x4d\\x85\\xad\\xf3\\x11\\x97\\xf2\\xfc\\x5b\\x72\\x11\\xa3\\xa4\\x6f\\x09\\x56\\x0b\\x37\\xe9\\xdb\\x9b\\xe0\\x8a\\xf0\\x51\\x9a\\x0b\\x32\\x55\\xe5\\xd0\\xa5\\x06\\xb1\\x3a\\x4f\\xcc\\x31\\x4b\\x4c\\x48\\xb5\\xd5\\xe8\\x6a\\x68\\x7c\\x03\\x43\\x99\\xfa\\x71\\x7d\\xae\\xf2\\x7d\\x27\\x91\\x19\\xd3\\x21\\x8e\\x6f\\x48\\x8b\\xbc\\xeb\\xbb\\xfa\\x6c\\x5c\\x35\\xb0\\xad\\xbf\\x1c\\x9a\\x41\\xdf\\x34\\xdd\\x2c\\xb1\\x53\\x72\\xb4\\xa8\\x82\\x18\\x3c\\x1d\\x78\\x03\\x34\\x44\\xb4\\x2a\\x88\\x61\\x3f\\x06\\x57\\xba\\x9d\\xea\\x41\\x1a\\xab\\x8d\\x21\\xd0\\x5a\\xe2\\xe3\\xd8\\xcd\\x65\\x29\\x0d\\x20\\xe6\\xe3\\xbe\\x68\\x0f\\xfd\\xa6\\x8f\\xbf\\x99\\xe4\\x90\\x16\\xf5\\xf2\\xc8\\x88\\x41\\x99\\x6b\\x8d\\xfa\\xa8\\xf4\\xd3\\x7d\\xc0\\xb9\\x29\\xc5\\x00\\x6c\\x58\\xcf\\xab\\xea\\x1a\\x2c\\x60\\x69\\x41\\x95\\x02\\x1e\\xae\\xa2\\xe9\\xcd\\x8d\\x66\\xbd\\x81\\x2f\\x37\\xa8\\x8c\\x07\\xe4\\x56\\x5b\\xe5\\xac\\x03\\xaf\\x91\\x48\\x43\\x79\\x14\\x1f\\xf9\\xa6\\x3a\\x58\\xf8\\x56\\x7b\\x50\\xd9\\x96\\xac\\x30\\x27\\x72\\x55\\xd8\\x29\\x89\\x1a\\x14\\x6d\\x7c\\x9d\\x4a\\x6b\\xb3\\x6b\\x60\\x6d\\xca\\xda\\x77\\xee\\x06\\x7f\\x69\\x76\\x6b\\x12\\xc4\\xc6\\x64\\x31\\x53\\xb3\\xa2\\x7d\\x7b\\x6e\\x4d\\x04\\xd0\\x7a\\x92\\x0c\\x6e\\xef\\x28\\x6c\\x49\\xf5\\x28\\xc0\\x94\\x93\\xa4\\xc3\\x4c\\xbb\\x68\\x9b\\x95\\xec\\x81\\x95\\xf4\\x31\\xf5\\x0f\\x67\\x63\\xb2\\xa9\\x0a\\x1e\\xad\\x93\\xc2\\x3d\\xf8\\xeb\\x67\\xfc\\x10\\x42\\x76\\xec\\xf9\\x96\\xcf\\x06\\x51\\xec\\x56\\x33\\xee\\x84\\x46\\xdb\\xac\\xae\\x50\\x68\\xd8\\x06\\x5d\\x62\\xda\\x41\\x4f\\xa6\\x9c\\x77\\xed\\x0c\\x25\\x01\\x1e\\x74\\x74\\x34\\x74\\x63\\xd3\\x67\\x76\\x26\\x9d\\x04\\x61\\x70\\xaa\\xb3\\xe7\\x9e\\x8f\\x9b\\x7b\\xb0\\xbe\\xa1\\x21\\x58\\xad\\xdf\\x50\\x22\\xee\\x36\\x2b\\x3b\\x01\\xaf\\xdb\\x44\\xfa\\xcc\\xfb\\xdd\\xe4\\xfd\\x7c\\xab\\xd1\\x5e\\xb3\\x5a\\xa3\\xcd\\xa8\\xc7\\x6c\\x34\\x32\\xcc\\x84\\x4d\\x16\\x23\\x3e\\x1c\\xb8\\x9f\\xcf\\xa9\\xe2\\x55\\xdd\\x72\\x9d\\x0b\\x12\\xcb\\x6d\\xb9\\xbd\\x41\\x5f\\xd4\\x56\\x34\\x89\\x2b\\xfd\\xf0\\x6d\\xb6\\x14\\x7f\\xb3\\xc7\\x24\\x3d\\x6d\\x90\\x75\\x11\\x24\\xae\\xda\\x20\\x1a\\xe8\\xb9\\x26\\x88\\x8b\\x62\\xdc\\x6a\\x82\\x3c\\x56\\x9e\\x2e\\x62\\xf2\\xae\\xae\\x88\\x0c\\x30\\x4d\\xca\\xa8\\x45\\x31\\x28\\x4c\\x97\\xba\\xcb\\xf2\\xa8\\x87\\x92\\xe8\\x2d\\x7c\\xad\\x7b\\x85\\x5c\\xff\\xbe\\xff\\x87\\x4d\\xff\\x9d\\x1f\\x1f\\xd3\\x85\\x77\\x3c\\x17\\x15\\x03\\xa5\\xab\\xef\\x17\\xbe\\x43\\x73\\x9c\\xfa\\x3e\\x0c\\xe7\\x08\\x3c\\x47\\x42\\xc2\\x90\\xba\\xef\\x2c\\x75\\x07\\x8e\\x4d\\x2f\\x87\\xb0\\x16\\x41\\xd1\\x1d\\x02\\xac\\xe1\\xec\\x13\\x4e\\x2a\\xab\\x76\\x79\\xb7\\x73\\x6b\\x10\\x71\\x89\\x5d\\xb6\\x7d\\x87\\x4e\\x05\\x1d\\x0e\\x6a\\xd1\\x05\\x19\\x3c\\x48\\xd0\\x41\\xae\\x35\\x91\\x6b\\x99\\xc8\\x9a\\x24\\x5a\\xd8\\xd0\\xf6\\x52\\xd1\\x35\\x1e\\xa5\\x62\\xc1\\x37\\x45\\x3a\\x1e\\x17\\xc1\\xd6\\x19\\x86\\x33\\x19\\x2b\\xab\\x2b\\x0a\\x1e\\x7c\\x9e\\xeb\\xeb\\xd2\\x7c\\xad\\x21\\x32\\xa7\\x92\\x56\\xc5\\x7a\\xd8\\x90\\x66\\x6e\\x2f\\x89\\xf5\\xb6\\xc3\\x62\\xe8\\x8a\\xf0\\x51\\x29\\x27\\xc2\\xc2\\x65\\xe2\\xb2\\xd2\\x33\\x0c\\x22\\x35\\x55\\xdc\\xf1\\x1a\\x6f\\x67\\x73\\x73\\x76\\xb3\\x58\\x9e\\x62\\x1b\\x19\\x4c\\x10\\x1c\\x29\\x5d\\x18\\xd4\\x98\\x60\\x34\\xea\\x5d\\x4c\\x35\\xe2\\x2b\\xb7\\x88\\x7b\\x2d\\x5e\\x57\\xce\\x06\\x56\\xfc\\xae\\xee\\x59\\x22\\x39\\x0e\\x8d\\xd7\\x39\\xb2\\xeb\\xeb\\x44\\x2a\\x42\\x36\\x61\\xa6\\x51\\x6a\\xd8\\x04\\x8b\\x3b\\x84\\xce\\xa6\\x8c\\x0c\\x30\\x7b\\x8a\\x8a\\x64\\x95\\xf9\\xac\\xbc\\xb9\\x7f\\x86\\x77\\xdd\\x60\\x23\\x30\\xdb\\x61\\xd4\\x78\\x21\\x82\\x21\\x75\\x8a\\xcc\\x50\\x58\\xda\\x30\\xa2\\x72\\xca\\xc7\\xf0\\xb6\\xb8\\xfc\\x43\\x86\\xc9\\x4b\\x1c\\x69\\x0f\\xd1\\xef\\x22\\xb3\\x35\\xcd\\xaf\\xdc\\xab\\x98\\x9b\\xa0\\xed\\xa7\\x4e\\xc8\\xaa\\x05\\xe7\\x55\\xbb\\xab\\x2b\\x69\\xbd\\x4c\\x04\\xf2\\xb6\\xbd\\xae\\x63\\xf1\\x2c\\xa7\\xde\\x87\\x4d\\xba\\xdd\\xb9\\xcc\\x2b\\xb8\\x36\\xe8\\xfa\\xad\\x4b\\x4c\\xcf\\xad\\x44\\xd6\\xa8\\x95\\x2c\\xbb\\xb5\\x74\\x2d\\xdf\\x36\\x9f\\x55\\x9b\\xb2\\x9e\\x08\\x2c\\x1f\\xc1\\xc3\\x7b\\xe5\\x1d\\x4e\\xa5\\x27\\x6c\\xab\\x9b\\x11\\xda\\x35\\xb4\\x01\\x3b\\x2e\\xa6\\x95\\x7b\\x07\\xb6\\x3a\\x21\\x75\\x94\\xe5\\x7c\\x7a\\x1d\\x49\\xda\\x60\\x1d\\x9a\\xca\\xbc\\x4e\\xe8\\x8f\\x4f\\x91\\x54\\xf4\\x4c\\x6e\\x5a\\xd5\\xd1\\xf6\\x3d\\x4b\\xfe\\x4f\\x57\\x79\\xd3\\x0d\\xd0\\xe3\\x11\\x9d\\x24\\xcc\\x33\\xa2\\x90\\x62\\xcd\\x12\\xef\\xd1\\xb1\\xc5\\x70\\x9a\\x1b\\x81\\x29\\xca\\xfb\\xa4\\xd1\\xc7\\x5d\\x77\\x1c\\xe6\\xd8\\x6b\\x11\\xe0\\xe3\\x38\\x82\\x55\\xdd\\x62\\x43\\xf5\\x3c\\xa6\\xab\\x74\\x2b\\x58\\x83\\x39\\x78\\x5c\\x6b\\x69\\x50\\xbb\\xb0\\xb4\\x44\\xc0\\xa5\\x0d\\xd3\\x55\\x4f\\xe6\\x1e\\x14\\xff\\x5d\\x58\\x46\\x73\\x09\\xdf\\x77\\x75\\x3d\\x28\\x6b\\x96\\x0f\\x83\\x39\\xf8\\x37\\x47\\xc1\\xe6\\xed\\x7b\\x98\\xdb\\x44\\x49\\x53\\x37\\x2a\\xbe\\xbe\\x29\\x57\\xd2\\x13\\x72\\x2a\\x40\\x03\\xb9\\xb7\\x91\\x5a\\x14\\x3f\\x52\\x50\\x66\\x45\\xed\\x4f\\xa5\\xa7\\xfa\\xe5\\xac\\x89\\x84\\xd2\\x45\\x59\\x75\\xdd\\x74\\x53\\xca\\x16\\x88\\x9c\\xc6\\x1f\\x55\\x22\\x8e\\xbc\\xfd\\x40\\x27\\x19\\x9b\\xf6\\x8d\\xb3\\x34\\x66\\xdc\\x54\\x58\\x60\\x69\\xe0\\x70\\x8a\\x26\\x24\\x96\\xaf\\x74\\x12\\xad\\xf6\\x1b\\x31\\x15\\x91\\x92\\x58\\x6a\\xdf\\x53\\x8e\\xe5\\xb1\\xef\\xde\\xe5\\x64\\xcc\\xf5\\x45\\x0f\\x65\\xc0\\xcd\\xe6\\xdc\\x08\\x29\\x9b\\x77\\x44\\x7e\\xe8\\xdd\\x80\\x6d\\x23\\xf6\\x36\\xc4\\x7d\\x18\\xd8\\xa6\\x49\\x53\\x2c\\xc9\\x04\\xff\\xc5\\x26\\xae\\xe8\\xbe\\x5e\\x65\\x79\\xa4\\xf2\\x6a\\x61\\x8f\\x54\\xe5\\xdf\\xd7\\x56\\x45\\x83\\x60\\x68\\x2e\\x61\\xd1\\x49\\x2d\\x1b\\xa9\\x3d\\x12\\x5f\\x17\\x58\\x6b\\x5f\\x4d\\xd8\\xcb\\xeb\\x7a\\x3d\\x6b\\xca\\x25\\x96\\xcf\\xf7\\xe6\\x95\\xd5\\x9b\\xe1\\x77\\x71\\x54\\xde\\x6c\\x8f\\xdf\\x3f\\xe0\\x74\\x0b\\xb0\\x9b\\xc1\\xfb\\x43\\x72\\x9b\\x49\\x45\\x04\\x58\\x95\\xd7\\x80\\x78\\x9c\\xd2\\x3d\\xbe\\x25\\x3c\\xb9\\x21\\x15\\x8b\\xa7\\x92\\x0b\\xa2\\xbd\\x9a\\x8b\\x46\\x64\\xe3\\x31\\x8c\\x60\\x53\\x5b\\x4f\\xec\\xb4\\xf5\\xe8\\x46\\x53\\x19\\x37\\xc7\\x8e\\xe4\\x9a\\x6b\\x53\\x52\\xb8\\x89\\x1a\\x97\\xba\\x6a\\x10\\x15\\x8d\\x64\\x7a\\x17\\xee\\x5d\\x2a\\xe2\\x8f\\xba\\xf3\\xbe\\xf1\\xf0\\xae\\x74\\x02\\x6a\\x8d\\xd8\\x3b\\x9f\\x3c\\x1a\\x18\\x3d\\xf2\\x3a\\x1f\\x34\\x10\\xba\\x23\\x9e\\xf4\\x58\\xb0\\x99\\x17\\x30\\xca\\x74\\x69\\x01\\x12\\x61\\x67\\xc0\\x8e\\xad\\xbb\\x79\\xc7\\x76\\x4a\\x84\\x4a\\x92\\x4e\\xa5\\x76\\x82\\xde\\xce\\x9b\\x16\\x8a\\x7c\\x51\\x29\\x9e\\xd0\\x5d\\xc9\\x2d\\xf5\\x7a\\x37\\x34\\x52\\xa8\\xad\\x25\\x9c\\x70\\xb7\\x25\\xd8\\x83\\x70\\x35\\xb2\\x1b\\xf7\\xfc\\x2e\\x21\\x78\\xa0\\x7d\\x7f\\x28\\xba\\x96\\x23\\x6a\\x4e\\x82\\xee\\x04\\x08\\x19\\xa7\\xb6\\xfd\\x9c\\xa3\\x3e\\x07\\x48\\xb4\\x0c\\x54\\xf5\\xde\\xf4\\xe3\\xde\\xbe\\x55\\xbf\\xa1\\x6b\\x93\\x89\\x23\\x9f\\x4b\\x4b\\xf8\\xb1\\xbe\\x0a\\x44\\xe5\\xe3\\xa5\\xc2\\x40\\xbf\\xce\\xaf\\x72\\xe5\\xf2\\x35\\x01\\xd4\\xfb\\x82\\xa6\\x23\\x65\\x4f\\x0b\\xc1\\xc6\\x88\\x5b\\x98\\x60\\x3d\\xfa\\x7a\\x71\\x03\\x40\\xca\\xec\\xdd\\xde\\xb4\\x5e\\x44\\x6e\\xee\\x86\\x48\\xc3\\xac\\xc7\\xfe\\x41\\xae\\xec\\xce\\x6e\\xe8\\xd2\\x6f\\x9e\\xed\\xf3\\x40\\x76\\xcf\\x5c\\x82\\x6e\\x5b\\xdc\\xd8\\x78\\x58\\x59\\xda\\xd6\\x61\\x7e\\xed\\xa0\\xb0\\xf5\\x32\\xbd\\xb6\\x6e\\x76\\xf1\\x1e\\x81\\xd7\\xbe\\xeb\\xc9\\x25\\xe2\\xbb\\xb6\\x58\\x5f\\xf3\\x40\\xbd\\xc9\\xf2\\xf8\\xdf\\x68\\x16\\x24\\x35\\x2f\\xb8\\x18\\xe5\\x19\\x5e\\x73\\x0f\\xf3\\xa5\\x16\\x8b\\xf4\\x4e\\x65\\x17\\xbc\\xf7\\x2c\\x9d\\x6e\\xbf\\x5c\\xa8\\xa2\\x2f\\x5e\\xc1\\x9e\\xda\\x23\\xa4\\xb2\\x38\\x9e\\xcb\\x5f\\x25\\xaa\\x49\\x73\\x83\\xd1\\x64\\x26\\x97\\x28\\x6a\\x05\\x80\\x32\\x6b\\xc5\\xd5\\x0b\\xaa\\x2c\\x72\\x8e\\x83\\x46\\xc7\\x68\\xb3\\xfc\\xed\\x3b\\x47\\x6f\\xee\\x5e\\x72\\x51\\xa0\\x9e\\xcc\\xed\\x3d\\xfd\\xe3\\x63\\x2d\\x22\\xba\\x2c\\x67\\xd7\\xb0\\xa3\\xf9\\x20\\xdd\\x55\\x5d\\xf4\\x16\\xba\\x63\\xa4\\x4e\\xf6\\x87\\x35\\x1e\\xda\\x3d\\x8e\\x5d\\x80\\x69\\xb0\\x7c\\x04\\x73\\x8d\\x74\\xe9\\x0e\\x6b\\xf2\\x44\\xeb\\x8b\\x6a\\xf2\\x78\\x9b\\x0d\\x6a\\x32\\x71\\x9b\\x5d\\x1d\\x6f\\xcf\\x5d\\x28\\xa4\\x29\\x59\\x52\\x26\\x6f\\x8e\\xfb\\x42\\xda\\x82\\x7f\\x94\\x89\\x40\\xb5\\x01\\x30\\x16\\x74\\x8f\\xad\\x85\\x95\\x02\\x72\\xce\\xda\\xba\\xd7\\x6d\\xb5\\xc9\\xe9\\x08\\xec\\xb2\\x9c\\x9a\\x60\\x0e\\x1a\\xfb\\x9a\\xb6\\x61\\xdd\\xbb\\x07\\x78\\x4f\\x69\\xdb\\x44\\x83\\xee\\xe7\\x6e\\xfa\\x67\\x7a\\xef\\xd6\\xf7\\xa5\\x46\\x48\\xd6\\x64\\xac\\xd4\\x4f\\xf4\\x49\\x44\\x6d\\x96\\x9b\\x9a\\x78\\x77\\x16\\x5b\\x58\\x37\\x81\\xb8\\x34\\xa9\\x73\\x26\\x05\\x10\\x79\\xc7\\x51\\x0e\\x8d\\x66\\xd3\\x28\\xac\\x5e\\x57\\x24\\x2c\\xa8\\x5c\\x57\\x4b\\xef\\xf7\\xae\\xe4\\x4c\\x13\\x17\\x31\\x7d\\xb4\\xb5\\x18\\x36\\xf6\\xd2\\x6e\\xdc\\x03\\xe4\\x96\\x85\\x0d\\x8e\\xb8\\xad\\xb6\\x09\\x3a\\xb7\\xb5\\x36\\x32\\x03\\x2f\\xd3\\xa6\\x74\\x6d\\xe3\\xff\\xd2\\x0b\\x07\\x5f\\xd4\\xef\\x62\\x36\\x88\\xd1\\x1b\\x67\\x75\\x58\\xe0\\xa2\\x6e\\xa6\\x76\\xf6\\x0f\\x7f\\x9c\\xa8\\x3b\\x88\\x6c\\xa6\\xe9\\x77\\x9b\\x28\\x6e\\x55\\x41\\xe9\\xee\\xdc\\x0b\\x69\\xa7\\x15\\x7b\\xc0\\xf6\\x6f\\xe2\\x1a\\x29\\x2a\\x83\\x81\\xc6\\x68\\x25\\x31\\xb8\\xe5\\xe3\\xa2\\xfe\\x75\\x53\\xbe\\xeb\\x4b\\x2d\\x14\\x0b\\xa4\\x4e\\x2f\\x87\\x2b\\x65\\xc1\\x1f\\x37\\xa4\\x27\\xad\\x02\\x39\\x0e\\xaa\\x21\\xf7\\x72\\x8e\\x5a\\xd6\\x57\\x88\\x0d\\xe7\\x26\\x71\\xe1\\xf6\\x6c\\xc9\\xae\\xb8\\x2e\\x9a\\xa9\\xb6\\x13\\x4a\\x97\\x65\\xba\\xd0\\x34\\x02\\xa3\\x9b\\x5a\\xbd\\xa1\\x22\\xbf\\xc2\\x4e\\x05\\xc6\\x1a\\x70\\x56\\x99\\x34\\x4b\\xe6\\xea\\xda\\x43\\xde\\x85\\xc7\\x20\\xa6\\xc5\\x4d\\x6b\\xa3\\x0f\\x1a\\x10\\xf7\\x12\\xfa\\x23\\x93\\xe6\\xd9\\xbc\\x8b\\xa7\\xd8\\xd3\\x54\\x32\\x08\\x05\\xbc\\xe8\\x90\\x9a\\xbf\\xa2\\x68\\x1f\\x81\\x5c\\xef\\x57\\x47\\xe3\\x6e\\x34\\x52\\x6b\\x31\\x4b\\xbd\\xea\\x2d\\x53\\xc1\\x59\\x37\\xdb\\x25\\xf0\\xa4\\x96\\x83\\x74\\xe7\\xf6\\x9d\\x6d\\x7e\\x7f\\x80\\x90\\xbd\\x70\\x8a\\x9d\\xd0\\x1c\\x2f\\x6a\\xc9\\x06\\x42\\xd2\\xaf\\x40\\x33\\x34\\x34\\x9a\\x7d\\xab\\x72\\x2a\\x2b\\x02\\xa4\\x9c\\x81\\xb8\\xc0\\x1f\\xba\\xb9\\x2a\\x13\\x58\\x8c\\x45\\x3f\\xad\\x62\\xc1\\xb4\\x89\\x4a\\x4e\\x86\\xad\\x51\\x12\\x48\\x21\\x47\\xe5\\xcc\\x4a\\x55\\xed\\xb8\\xb6\\x66\\x76\\x07\\x4a\\xa1\\x56\\xcc\\x66\\x96\\x87\\x92\\xa3\\xaf\\xf3\\xeb\\x74\\x45\\x47\\x93\\xfb\\x88\\xbf\\x62\\xcb\\x43\\x32\\xc8\\x1b\\x86\\x77\\x8c\\xae\\x86\\x52\\x36\\xee\\x59\\x00\\xc6\\x77\\x81\\x5f\\x72\\x7f\\xcf\\x0e\\x13\\x3b\\x45\\xe3\\x3c\\xe6\\xf0\\x2b\\xaa\\x21\\xfb\\x63\\x68\\x40\\x7f\\x51\\x49\\x3c\\xf2\\x4a\\xd9\\x34\\xb4\\xb6\\xfe\\xcc\\xb2\\x46\\x96\\x81\\x3f\\xe5\\x5d\\x8c\\xf6\\x62\\x99\\xb8\\xb8\\xe4\\x05\\x97\\x9f\\x78\\x57\\x53\\x6f\\x73\\x54\\x1a\\x3b\\xe6\\x86\\x40\\x76\\xf1\\x16\\x77\\xa8\\x66\\x1f\\x95\\x74\\x30\\x1e\\x2f\\xdc\\x0a\\x8b\\x9f\\xb2\\xb8\\xb0\\xe7\\x8c\\x55\\x2b\\x27\\xe1\\x94\\x60\\x74\\xda\\x64\\xc9\\x33\\xaa\\x60\\x5c\\x18\\xd7\\x8f\\x55\\x67\\x7f\\x5a\\x67\\x95\\x02\\x60\\x1a\\x36\\x29\\x0c\\xd6\\xe5\\xf0\\xa0\\xc3\\x4a\\x95\\x9e\\x73\\xd9\\x00\\x61\\xbb\\xe4\\x12\\x57\\x42\\xd1\\x62\\x06\\x5b\\x02\\xec\\x16\\x68\\xf7\\xe9\\x52\\xef\\xd6\\x00\\x6a\\xa6\\xab\\x5d\\x21\\xed\\xc1\\x1d\\x13\\x7d\\x70\\x7b\\x78\\xb7\\xc0\\x60\\x0c\\x3d\\xaa\\xdf\\xde\\x04\\xc0\\x03\\x19\\x71\\x00\\xe9\\x40\\x23\\x6b\\xbd\\xee\\x85\\x8c\\xba\\x97\\x71\\x31\\xd5\\xcd\\xe3\\x6b\\xe1\\x40\\x30\\x98\\xc7\\x61\\x24\\xa0\\x4f\\xc8\\x7e\\x98\\x86\\xff\\xea\\x41\\xf7\\x47\\xb9\\x99\\x00\\x2a\\xea\\x2c\\x1d\\x38\\x9a\\xc1\\x8b\\x46\\x2c\\xa8\\x08\\x76\\x80\\x70\\x6b\\x54\\xe9\\x0f\\xc5\\x92\\xd5\\x94\\xf5\\x3a\\x79\\xb4\\x26\\x3d\\x2a\\x18\\x2f\\xaf\\x32\\xbf\\x8f\\xe5\\x28\\xb1\\x07\\x42\\xc4\\x40\\xff\\x84\\x69\\xf7\\x96\\xec\\xf9\\xac\\x5c\\xd7\\x9a\\xdd\\x09\\xda\\xed\\xc6\\xaa\\xed\\xe6\\xca\\x6a\\xcb\\x76\\xbd\\x6c\\x5a\\xe3\\xc2\\x45\\xa4\\x97\\x5f\\xb9\\xc7\\x11\\xdf\\xfb\\xc4\\xe0\\xfc\\x34\\x1c\\xc5\\x65\\x6b\\x5d\\xa8\\xed\\x0a\\x9c\\x06\\xe6\\x58\\x8f\\x75\\xa5\\xca\\x3b\\x8c\\xa6\\xff\\x99\\x4c\\xcf\\x2f\\x61\\x6c\\x70\\xf4\\xb5\\x01\\x23\\xce\\xb7\\x7c\\xb4\\x49\\x11\\xbb\\xcc\\x1c\\xe3\\xa6\\x62\\xc4\\xcb\\xf4\\x6e\\x56\\xd5\\x02\\x02\\xf6\\x47\\xe0\\xc4\\x6e\\xa8\\x91\\x85\\x78\\xbc\\xa0\\x56\\x69\\xb3\\x06\\x00\\xc1\\x9b\\x2e\\x0d\\x23\\xa0\\x33\\x95\\xe3\\xbc\\x4a\\xe0\\xdd\\xdb\\x41\\x2f\\xe9\\x02\\xea\\xba\\x0d\\xdf\\x9d\\x20\\xe3\\xae\\xac\\x82\\x39\\x0c\\x5a\\x8f\\x19\\xbc\\x5e\\x8e\\xad\\x71\\x5f\\x15\\xfc\\x57\\x88\\x23\\x60\\x5a\\xae\\x73\\x6a\\x9d\\xdc\\x1f\\x80\\x30\\x48\\xc7\\x20\\x19\\x65\\xa8\\xaf\\xdf\\x23\\x87\\x24\\x86\\x6d\\x1e\\x16\\x9c\\xdc\\x6a\\x98\\x4a\\xa1\\x71\\xf3\\x70\\xa9\\xb3\\x9c\\x5a\\x51\\x0e\\xfe\\xd5\\xb6\\x20\\xc9\\xf0\\x94\\x6b\\xea\\x4c\\x53\\x21\\x0c\\x85\\xd4\\xf9\\x88\\xa6\\x8f\\x27\\xdf\\x6a\\x35\\xed\\xa6\\xe2\\x42\\x49\\xdd\\xb8\\xdd\\xff\\x59\\x19\\x2d\\x44\\xf4\\x0d\\x99\\xf5\\x9b\\x55\\x30\\x84\\xd3\\xf2\\xaa\\xa5\\x2b\\x86\\xb0\\x9b\\x2b\\xab\\x80\\x79\\xb7\\x11\\x05\\xfb\\xbc\\xb8\\x16\\xa2\\xfb\\xe6\\x42\\x5d\\x9b\\x5d\\x5f\\x84\\xd6\\x66\\xd6\\x97\\xa4\\xff\\x05\\x45\\x12\\x93\\xd3\\x3f\\xc9\\x5c\\xfe\\xec\\xd8\\xaa\\x03\\x1c\\xd4\\xcb\\xec\\x6e\\x3b\\x01\\xe8\\x47\\x40\\xb8\\x1d\\x58\\x90\\x3d\\x58\\xb2\\xc1\\x00\\xf4\\x22\\x3c\\x5a\\xd7\\x5a\\x35\\x18\\xaf\\xbe\\x60\\x3b\\xbd\\x89\\x47\\x20\\x7f\\x6b\\x95\\x92\\x07\\x70\\xa1\\x1f\\x01\\x09\\x77\\x64\\x09\\x3f\\x06\\xf7\\xf9\\xa1\\x16\\xf3\\xca\\xae\\x73\\x7b\\xb0\\xfd\\x11\\x08\\xe0\\x5a\\xc5\\xe4\\xfd\\x74\\xf3\\xe7\\x48\\x8f\\x80\\x66\\x3b\\xb2\\x68\\x3b\\xb9\\xb1\\xa9\\xf3\\xa3\\x87\\x5a\\xa5\\x80\\xec\\x66\\x83\\x5b\\x3a\\xf5\\xb8\\xa7\\xe9\\x6f\\x2f\\x28\\xcc\\xbd\\xbd\\x2a\\x41\\xb3\\x6a\\xc0\\x0c\\x73\\xad\\xb1\\xe5\\x78\\x25\\x7d\\x25\\x4c\\x8a\\x5a\\x52\\xcc\\x2f\\xb3\\xc9\\xf4\\x32\\x3b\\x4d\\xa3\\xb9\\x73\\x19\\x01\\x73\\xb0\\x75\\x05\\x6a\\x32\\x51\\x11\\x26\\xfa\\x63\\x97\\xc4\\xd6\\x69\\x85\\xec\\xd8\\xc7\\xd1\\xa2\\x69\\xaf\\xcb\\x0e\\x2d\\x3c\\x7d\\x2a\\x77\\x6e\\x80\\xf8\\x2b\\x46\\x07\\xff\\x60\\x3c\\xf4\\xe3\\x9f\\xc3\\x60\\x19\\x9e\\x2e\\xb3\\xa3\\xef\\xe6\\x46\\x57\\x6e\\xdd\\x4e\\xfd\\xbc\\xb9\\x2d\\xc8\\x81\\xcd\\x1b\\xa3\\x9b\\xdd\\xd0\\xca\\x45\\x2d\\xce\\xf5\\x61\\x80\\xa1\\xa6\\xf3\\x9c\\xb6\\xf7\\x79\\x6a\\x08\\x5f\\xf5\\xa6\\x68\\xbe\\x1e\\x2b\\xc8\\xd8\\x81\\xfb\\xa8\\x0f\\xd3\\xf2\\xd7\\x69\\x64\\x8c\\x05\\x4b\\xb0\\x71\\x6e\\x6b\\xa5\\x9c\\xa0\\x2a\\xc9\\xf8\\xf6\\x25\\x5e\\x87\\x68\\x4a\\x15\\x75\\x8b\\x30\\x52\\x63\\x7b\\x1a\\x1b\\xef\\x28\\x14\\x43\\x6c\\x17\\x4c\\xb7\\x3a\\xf7\\x46\\x49\\x3c\\xfa\\xb0\\x87\\x2f\\xee\\x51\\x67\\xd4\\x72\\x48\\xff\\x90\\xcc\\x64\\xfe\\x86\\x0a\\x34\\xd7\\x96\\x11\\x3e\\x7a\\x49\\x8d\\x6c\\x9b\\x2a\\x09\\xf1\\x85\\x14\\xcc\\x35\\xd6\\x5d\\xf1\\xa5\\x87\\xbd\\x88\\x05\\x8f\\x2c\\xd8\\x57\\xc7\\xd6\\x44\\xf1\\xd7\\x91\\xf4\\xad\\xe5\\x2b\\xb4\\x98\\xf0\\xeb\\x0c\\x84\\x95\\x35\\xf3\\xf8\\xfa\\x5a\\xd5\\x2e\\x94\\x5d\\x01\\x73\\x07\\x86\\x52\\x76\\xc9\\x18\\xf8\\xe9\\x8a\\xd6\\x30\\xa8\\xb4\\x32\\xe6\\xc4\\xe4\\x86\\x86\\xc6\\x0b\\xb4\\x73\\xde\\x59\\xde\\x6e\\x83\\xfe\\x9f\\xe9\\xbd\\x9d\\xb5\\x84\\xb7\\xcf\\xe0\\xf1\\x37\\xb3\\xab\\xab\\x44\\x61\\xb6\\xbc\\x4d\\xfe\\xb9\\x89\\xf3\\xc8\\x6b\\x8e\\x45\\x06\\x14\\x4f\\x12\\xd6\\x7b\\x92\\x23\\x00\\x32\\x1a\\x5f\\x28\\x97\\x2b\\x1a\\x72\\x01\\x8c\\x6f\\x5a\\x67\\x23\\x34\\xd8\\xd8\\xb6\\x8d\\xc8\\xfc\\x2a\\x1c\\x18\\xe9\\x95\\x2b\\x04\\x05\\xde\\xe0\\xda\\x59\\x7a\\x10\\x92\\xa0\\x6a\\x7e\\x7a\\xdf\\xc5\\xeb\\x21\\xd9\\xa7\\x98\\xfe\\xce\\x8b\\xcc\\x27\\xc9\\xd6\\x87\\x63\\x63\\x4b\\x75\\xbf\\x0e\\x26\\x12\\x21\\x34\\x15\\x0b\\x57\\x3f\\xca\\xc4\\x93\\x36\\x9c\\x8b\\xea\\x0d\\xf5\\x2a\\x5a\\x97\\xac\\x49\\x09\\xfa\\xbd\\xab\\x64\\x96\\xef\\xc9\\xc4\\x19\\x57\\x35\\x63\\x84\\xfc\\xd1\\xe1\\xad\\x41\\x3b\\xa1\\xbe\\x89\\xb1\\x66\\x5d\\xea\\x6b\\x0a\\xad\\x3e\\x64\\x0a\\xbc\\x85\\x7f\\xc1\\xb7\\xf0\\xe9\\xb5\\x66\\xfb\\x69\\xad\\x5b\\x03\\x02\\xbd\\xbe\\x7d\\x60\\x7d\\x48\\xee\\x8c\\x6d\\x83\\x04\\x34\\xc0\\xbe\\xf0\\x2d\\x99\\x17\\xcb\\x90\\xb4\\x53\\x14\\x47\\x30\\xf2\\xb5\\x6a\\x14\\x46\\x1f\\x2e\\x7e\\x71\\x69\\x79\\xd4\\xf3\\x6c\\x5f\\x22\\x05\\xf0\\x6d\\xc9\\xe4\\x62\\x88\\xee\\x8a\\x54\\x0a\\x11\\xb7\\x28\\x97\\xbc\\x89\\xce\\x17\\x4b\\x7c\\x6f\\x79\\xa9\\xe4\\x59\\x1e\\x8e\\x57\\x2e\\x12\\x5b\\x93\\xd0\\x87\\x46\\x7a\\x23\\x02\\x4a\\x24\\xdc\\x9e\\x7c\\x46\\x57\\x49\\x5f\\x11\\xd5\\xaf\\x2e\\x2d\\xa5\\x76\\xae\\xed\\x6b\\x4f\\x03\\xfc\\xb6\\xa4\\x73\\x51\\x64\\x77\\x45\\x40\\x0d\\x21\\xd7\\x2f\\xa3\\x58\\x20\\xe4\\x1a\\x6f\\x61\\x73\\xa3\\xa2\\x2c\\x97\\x81\\xd7\\xef\\xa1\\x2f\\x30\\xd3\\x1a\\x63\\x31\\x9d\\x0b\\x71\\x9c\\x81\\x63\\xd5\\x63\\x15\\xd2\\x7b\\x4b\\x2f\\x41\\x99\\x65\\xfb\\xeb\\x8f\\xc1\\xde\\xd6\\xe2\\x5b\\x08\\xcd\\x5d\\x59\\x79\\x4c\\xc2\\x8d\\x6e\\x0d\\x3d\\xa8\\x1a\\xa7\\x0f\\x26\\x3e\\x71\\xba\\x5d\\x01\\xea\\x8f\\xea\\x4e\\x89\\x10\\x90\\xd1\\x51\\x6a\\xba\\xca\\xc5\\x1a\\xf5\\x5a\\x0f\\xd2\\x66\\xb3\\xf2\\xc1\\xc4\\x08\\xe6\\xde\\xae\\x1c\\x2d\\x80\\xec\\x4e\\x09\\x12\\x12\\x72\\x0b\\x92\\x54\\xde\\x65\\x7a\\x4c\\x7b\\x72\\x57\\x2b\\x40\\xcd\\x35\\xb0\\x04\\x9b\\x88\\x2b\\x80\\xd1\\x9b\\x19\\x1e\\x90\\x4e\\x33\\xac\\x94\\x92\\x07\\x0a\\xff\\x9f\\xe3\\x63\\x89\\x0a\\x75\\xf5\\xd1\\x39\\xe7\\x72\\x32\\xf9\\x59\\xda\\x42\\xba\\xee\\xb9\\x9c\\x09\\x5a\\x38\\x72\\x3e\\x2b\\x17\\x1b\\xb9\\x0e\\x7a\\xe5\\x4e\\x48\\x76\\xab\\x4c\\xf4\\xea\\x2c\\xed\\xcd\\x89\\xa1\\x03\\xd1\\xda\\x96\\x86\\x6e\\xcf\\x5d\\x59\\x1a\\x2b\\x72\\x30\\x6b\\xa2\\xc2\\x5c\\x06\\x2e\\x4c\\xe9\\xae\\xd9\\x3a\\x69\\xbe\\x24\\x05\\x3b\\x4d\\xc4\\x0f\\xea\\x3e\\xca\\xee\\xd2\\x1e\\x46\\xa2\\xbc\\xb9\\xb4\\x99\\x68\\x66\\xda\\xbe\\x8a\\xd6\\xa0\\x77\\x6a\\x91\\xbf\\xab\\x75\\x2a\\xe9\\x05\\xb1\\xdd\\x15\\x1d\\xad\\x29\\xb9\\xa0\\xc5\\x38\\x97\\xb6\\xf3\\x64\\x14\\x2b\\x61\\xf7\\xf1\\x64\\xf4\\xab\\xab\\x48\\xa9\\xcc\\xf5\\x20\\x62\\xca\\xc0\\x6f\\x57\\x4e\\x17\\xc2\\x77\\x87\\x04\\x95\\x69\\xb9\\x6d\\x49\\x9d\\x4d\\xfb\\x89\\xe9\\x6c\\xba\\x8a\\x8c\\xe2\\x2c\\x0f\\x22\\xa0\\x00\\xf6\\x76\\xa5\\xb3\\x3f\\xa6\\x3b\\x24\\x9a\\x40\\xc5\\x4d\\xcb\\x65\\x37\\x61\\x93\\x2c\\x8c\\xea\\x74\\xed\\x36\\x75\\xe6\\x59\\x39\\xf3\\xf0\\xc6\\x39\\xb7\\xe6\\x24\\x2d\\x84\\xe0\\xc3\\x49\\xce\\x62\\xc4\\xdb\\x5e\\x08\\x9f\\x2c\\xd6\\x9e\\x86\\xa1\\x79\\x77\\x69\\x85\\xe6\\xcc\\xb6\\x5d\\x91\\xb4\\xa0\\x77\\xca\\xe5\\x6b\\x7c\\x6d\\x8d\\xc2\\xb9\\x38\\xbe\\x3b\\x20\\xa1\\x96\\x96\\x8b\\xfa\\xef\\x3d\\xc8\\x3b\\x5f\\x58\\xc9\\xab\\xea\\x2b\\xad\\xf4\\xf2\\x32\\xe2\\x7a\\x45\\x95\\xf5\\xeb\\x9e\\xa4\\x89\\x01\\xcc\\xe9\\xd1\\xbc\\x4e\\x5a\\x33\\x12\\xdb\\x12\\xdc\\x55\\x31\\xdf\\x15\\x09\\x66\\xaa\\x3e\\x88\\x08\\x53\\x38\\xa0\\xaf\\x08\\xd3\\xcb\\xeb\\x14\\x61\\x09\\x46\\x6c\\x55\\x84\\x19\\x89\\x87\\x16\\xe1\\xbe\\x98\\xef\\x8a\\x08\\x33\\x55\\x1f\\x44\\x84\\xf1\\xd2\\x54\\x5f\\x09\\xc6\\x77\\x57\\x33\\x19\\x78\\xb6\\x07\\x30\\x19\\x08\\xf4\\xed\\x9b\\x0c\\x0b\\xe1\\xbb\\x2b\\xd2\\x4a\\xb4\\x7c\\x10\\x61\\xa5\\x33\\x94\\x7e\\xb2\\x8a\\xc7\\x12\\x2b\\xb1\\xae\\xf1\\xbc\\x66\\x0b\\x92\\x3a\\xf7\\x60\\x6a\\x23\\x82\\xba\\x08\\xb6\\xbb\\x22\\xa7\\xcb\\x9c\\x4c\\xad\\x47\\x4c\\x6f\\xfb\\x1b\\xb6\\x74\\x60\\xb0\\x1a\\xeb\\x68\\xb6\\x87\\x90\\xd4\\xdb\\x2d\\x5a\\xb3\\x4b\\xe2\\xbb\\x33\\xb2\\x7a\\xfb\\x50\\x36\\x6c\\xaf\\xf0\\xa7\\xbc\\xb9\\x9a\\xa0\\x36\\x05\\x06\\xb7\\x20\\xa6\\xf3\\x02\\xa0\\x1b\\x11\\xd2\\x05\\x70\\xdd\\x15\\x11\\x75\\x43\\xa0\\x9b\\x13\\x50\\xdd\\x94\\x2c\\x6d\\x46\\x4c\\x5a\\x5e\\x8f\\xc7\\x1d\\xa2\\x38\\x67\\x88\\x26\\xf2\\x17\\xc1\\xb9\\x73\\x91\\xa6\\xda\\x91\\x8d\\x87\\xb1\\x97\\x6a\\x4c\\xa3\\x56\\xba\\xf8\\x84\\x2f\\x73\\x67\\x57\\x2a\\xb8\\xed\\xfe\\x56\\xb9\\x45\\x35\\x34\\xa7\\x8c\\x87\\x93\\xfb\\xb7\\xc9\\xec\\x3a\\x4e\\xf7\\xe8\\xc3\\x3d\\xfb\\xef\\x2a\\x07\\x75\\x6e\\x22\\x5e\\xe1\\xd2\\x7f\\xf2\\x2d\\xf0\\xe2\\x26\\x9b\\x25\\x11\\x1f\\xa1\\x13\\x17\\xf9\\x2e\\x50\\x0c\\xa3\\x84\\x49\\x72\\xef\\x88\\xc9\\x21\\xb6\\xd9\\x96\\x76\\x68\\x74\\x21\\x09\\xe5\\xca\\xa3\\x4d\\xc7\\x05\\x4b\\xfd\\x97\\x11\\x20\\xdb\\x2d\\xce\\x34\\x1b\\xb3\\x57\\x99\\x70\\xd0\\x41\\xb1\\x4f\\x58\\xe1\\x0f\\xc5\\x54\\x8d\\x62\\xa0\\x14\\xf7\\x40\\x6c\\xa8\\x7f\\x80\\xac\\x64\\x16\\xd8\\x6c\\x4b\\x8d\\xe8\\x8b\\x5a\\xaa\\xe7\\x52\\x71\\xd3\\x4f\\x59\\x3c\\x1e\\x94\\x4f\\xeb\\x3b\\x1a\\x58\\x8a\\x27\\x56\\x5d\\x82\\x68\\xe7\\x7c\\x94\\x23\\xd7\\x1c\\x81\\x8e\\x85\\x6d\\xc7\\xec\\xdd\\x92\\x5b\\x8a\\x7b\\xa1\\x34\\x1c\\x96\\x16\\x55\\x76\\xe4\\x2a\\xd5\\x8b\\x5e\\x64\\x7f\\xe0\\x45\\x5e\\xe7\\x68\\x4b\\x67\\xd7\\x86\\xa5\\xd8\\xa3\\x64\\x40\\x75\\x63\\x34\\x12\\x89\\x64\\x70\\x59\\x21\\x7c\\x94\\x8d\\x8c\\xa7\\x9a\\x5f\\x20\\x61\\x5d\\x2b\\xb2\\xe9\\x8a\\x6b\\x6d\\xfd\\xad\\x6f\\x43\\xa5\\x4b\\xa7\\xce\\xf2\\xc2\\xa7\\xf0\\xdf\\x0c\\xcb\\x70\\x67\\x77\\x58\\xb2\\x86\\x7a\\x7b\\xdf\\x64\\x79\\x89\\x93\\x10\\xb1\\xaa\\xb7\\x60\\x8b\\x78\\x32\\x05\\xa6\\x47\\x19\\xc9\\x20\\x35\\xc0\\xe4\\xa5\\x0a\\x0b\\x08\\x74\\x0b\\x81\\x88\\x75\\x47\\xf0\\x72\\x6d\\x81\\x13\\x10\\xc5\\x35\\xf2\\xe6\\x71\\xe1\\x88\\xcd\\x2f\\xc4\\xcc\\x43\\x81\\x73\\xb0\\x7f\\x18\\xbc\\xc9\\x4a\\xe9\\x5a\\x89\\x98\\x84\\xa3\\x72\\xe6\\x7f\\x9b\\xa5\\x75\\xbb\\xc3\\xc2\\x39\\x41\\x25\\x77\\x85\\x99\\x5d\\xf9\\x07\\x46\\xca\\xcc\\x3f\\x78\\x11\\x14\\xf7\\x60\\xd7\\x7c\\xac\\xb4\\x2e\\xcf\\xd2\\xa5\\x35\\xcb\\x30\\x38\\x3c\\x3c\\x44\\x64\\x49\\x62\\x7f\\xfa\\xb9\\xff\\x5d\\xfc\\x4f\\x59\\x48\\xc9\\x64\\x7c\\x29\\x0d\\x57\\x6b\\x06\\xa3\\xc6\\x38\\x16\\x12\\x1c\\xd2\\xeb\\xac\\x38\\xd2\\x0e\\x53\\xf0\\x91\\x2f\\x81\\x27\\xdd\\x12\\x45\\x48\\x2e\\x78\\x7b\\xe3\\xb3\\x74\\xf5\\xb5\\x48\\x65\\xdb\\xc5\\xab\\xfc\\x71\\x52\\x8a\\x7f\\x19\\xa9\\x62\\xa4\\xd2\\x28\\x44\\x50\\xa5\\x00\\x58\\x0d\\x41\\x51\\x34\\x8e\\x57\\xca\\x32\\x19\\x9c\\xb9\\x1f\\xc0\\x0c\\x20\\x2a\\xe9\\x0c\\xcb\\x14\\x01\\xfd\\x26\\x71\\x09\\x63\\x0c\\x7d\\x31\\x0b\\x93\\xbb\\xf0\\xde\\x91\\x36\\x96\\xc4\\xb8\\x04\\x29\\xc1\\x4d\\xb8\\x68\\x9c\\x7f\\x97\\x64\\xbb\\x43\\xb8\\xed\\x05\\xa6\\xa5\\x14\\xa8\\xe3\\xd6\\x7d\\x96\\xf3\\x3f\\x84\\x9c\\xff\\x71\\x77\\x88\\x85\\x56\\x51\\xb4\\xf8\\x8d\\xbf\\x9d\\x58\\x50\\xd6\\x73\\xb2\\xb5\\x18\\x1f\\xc0\\x79\\x0a\\xeb\\x68\\xb2\\x38\\x62\\x41\\xba\\x25\\xdd\\xa6\\x15\\x57\\x28\\xc5\\xd8\\xa8\\x1e\\x9e\\xb3\\x10\\xfa\\xaf\\x52\\xb3\\x72\\xcc\\x3a\\x15\\x54\\x1e\\x66\\x91\\x52\\x51\\x9c\\xaa\\xdb\\x97\\x2e\\xe1\\xf5\\xf1\\x52\\x78\\x51\\xad\\x0b\\xf3\\x59\\x88\\x57\\x17\\xe2\\x87\\xe3\\x72\\x23\\x4b\\xdb\\x78\\xea\\x86\\xb9\\xdb\\x2b\\x18\\x91\\xfe\\x76\\x16\\x81\\xb9\\xc7\\x03\\x4b\\x6b\\x92\\x15\\x25\\x57\\x99\\x9c\\xe2\\x9d\\x1a\\xfe\\x84\\xff\\x36\\x0c\\x98\\xc3\\xf1\\x39\\x55\\xac\\xaa\\x01\\xf7\\x6d\\xd5\\x9b\\x13\\x57\\xb9\\x77\\x3e\\x31\\xc0\\xbc\\xc1\\x58\\xda\\x67\\x8e\\x99\\x65\\xb5\\xed\\x03\\x95\\x75\\x08\\x42\\xb4\\xa9\\x6b\\x94\\x8f\\x49\\x2e\\x3e\\x5b\\xf4\\x7f\\x4c\\xcf\\xb5\\x2e\\xee\\xcb\\xbb\\xae\\xbb\\xa5\\x09\\x3f\\x4b\\xfc\\x67\\x1f\\xf6\\x61\\xd6\\xd3\\x12\\x4e\\xec\\x8e\\xed\\x26\\x9f\\x88\\x27\\xf0\\xd9\\x9d\\x5d\\xca\\xd1\\x51\\xeb\\xf3\\x67\\x3f\\x0b\\xf9\\xce\\xba\\xbb\\x3d\\xa4\\xa0\\x99\\xe5\\x55\\x9e\\x5f\\x60\\x26\\xc4\\xf8\\xde\\x53\\xc9\\x0d\\x8a\\x1f\\x8b\\xed\\xe2\\x01\\xeb\\x0c\\x4f\\xe1\\xf1\\xae\\x9f\\xdd\\x42\\x16\\x73\\x19\\xc6\\x7a\\x55\\xcb\\x88\\xb0\\xa4\\xa2\\x7b\\x1f\\x3b\\xfa\\xc9\\x49\\x62\\xe3\\x33\\xdb\\xe3\\x24\\x0e\\x8b\\x17\\x1a\\x93\\x8b\\x32\\x2c\\xe3\\xd1\\xa2\\x19\\x80\\xc0\\xd4\\xf8\\xdf\\x7d\\xf2\\xff\\xf9\\xc5\\xa5\\xf3\\xff\\xf4\\x3c\\x6b\\x49\\xff\\x5b\\xec\\xf2\\xae\\x40\\xbe\\xad\\x6b\\xac\\x0b\\x62\\x6a\\x22\\xc5\\x8f\\xfc\\x0a\\xb4\\x50\\xd1\\x09\\x6c\\x6f\\xc0\\x43\\xf5\\x44\\xb3\\x18\\xe5\\x59\\x92\\xf4\\x10\\x4d\\x7e\\x71\\x69\\xd1\\xd4\\xf3\\x3c\\x80\\x68\\x0a\\xe4\\xdb\\x12\\xcd\\x05\\x31\\xdd\\x15\\xd1\\x14\\x2a\\x6e\\x53\\x34\\xc9\\x9c\\xe8\\x23\\x9a\\xf4\\xe2\\xf2\\xa2\\x29\\xf3\\x3c\\x84\\x68\\x32\\xe4\\x5b\\x13\\xcd\\xc5\\x30\\xdd\\x19\\xd1\\x64\\x2a\\x6e\\x53\\x34\\x29\\x48\\xda\\x47\\x34\\xe9\\xc5\\xe5\\x45\\x53\\xe6\\xd9\\x7e\\x49\\x13\\x01\\x7c\\x6b\\x92\\xb9\\x10\\xa2\\x3b\\x23\\x98\\x4c\\x44\\x03\\xee\\x26\\xca\\x53\\x9c\\x6a\\x0b\\x17\\x30\\xd5\\x19\\xa8\\xe4\\x57\\x5c\\xa9\\x9b\\xf0\\x36\\xce\\xf0\\x5f\\x3a\\x41\\xb6\\xa5\\x1c\\x9c\\xf1\\x26\\xae\\x63\\x98\\xba\\xc1\\x55\\x5a\\xac\\xe3\\x49\\xd8\\x7c\\xde\\x60\\x63\\x6b\\x14\\x5a\\x43\\xc7\\x89\\xe9\\x53\\xe5\\x80\\xfa\\x58\\xe6\\xe1\\x5b\\x9b\\x09\\x79\\x6c\\x7b\\x8b\\x39\\xf9\\x91\\xa5\\xb4\\x17\\x0b\\xb9\\xe5\\xdb\\xdc\\x7a\\xe9\\x3a\\xf5\\xd2\\xc0\\xee\\x94\\x1d\\xf6\\x27\\x7c\\x21\\xe9\\x04\\xbf\\x09\\x0f\\x5a\\x45\\xfa\\xc1\\x48\\x0f\\x64\\x97\\x84\\xd2\\x53\\x56\\x40\\x04\\xe8\\x03\\xd0\\xb1\\x31\\x33\\xa3\\x37\\x39\\xfb\\xd1\\xd3\\xa1\\xa0\\xd5\\xb2\\x1c\\xce\\x4b\\xfd\\xed\\xeb\\x81\\xc5\\x14\\x76\\x81\\x3c\\xc7\\x6e\\x74\\x5e\\x3b\\xbc\\xd5\\x49\\xfd\\x3d\\x3f\\x6b\\x92\\x5c\\x4c\\x82\\xf1\\xc1\\xd0\\xa9\\x30\\x7a\\x0f\\x6c\\xbf\\xfa\\xe3\\xa4\\xd0\\x1f\\x18\\x22\\xfb\\xda\\x99\\xfa\\xf9\\x78\\xc1\\x97\\x07\\xa1\\xb4\\x06\\x07\\x03\\x3f\\x7e\\x00\\x37\\x2e\\x24\\xbe\\x91\\x66\\xd4\\xfa\\x11\\x03\\x3d\\x12\\x0e\\xf2\\x49\\x39\\x4b\\xfd\\x5e\\x43\\x9b\\xbd\\xf3\\xb2\\x3b\\xa4\\x1d\\x27\\x45\\xf0\\x9e\\x68\\xc3\\xd1\\xc5\\x51\\x96\\x83\\x0f\\x3a\\xcd\\x52\\x6a\\x6a\\xfc\\xd4\\x0d\\x8a\\x3f\\xad\\xd0\\xfe\\x0e\\x46\\xbf\\xca\\x66\\xa0\\xee\\x66\\xd4\\x27\\xf3\\x90\\x28\\x6c\\xe1\\x1d\\x4a\\x5c\\x7e\\xbf\\x9b\\x13\\x96\\x11\\x00\\x4b\\x8f\\x5e\\x4f\\x9b\\xa1\\x31\\xaa\\xd4\\x1a\\x25\\xc5\\xb2\\x08\\xdd\\x44\\xfe\\xee\\x1b\\x73\\x06\\xb9\\x72\\x5e\\xcc\\xd3\\xa0\\x51\\x07\\xd6\\x84\\x3d\\x51\\x0f\\x9a\\x8d\\x82\\x63\\x91\\xf6\\x86\\x8a\\xee\\x87\\xab\\x83\\xae\\xc3\\xe0\\x2a\\x44\\x18\\x67\\x53\\x34\\x47\\xf9\\xa6\\xd1\\x38\\x1e\\xc1\\xf3\\x12\\x35\\x52\\x9e\\x65\\x65\\x4b\\xe3\\x4a\\x60\\xa1\\x2e\\xd1\\xdf\\x83\\xec\\x0f\\x09\\x6f\\x95\\x6f\\xed\\x17\\x7a\\xb4\\xe1\\x37\\x13\\xb6\\x39\\x61\\x7d\\x86\\x17\\xa4\\x1c\\xdb\\x05\\xd7\\x94\\xfa\\x6a\\xab\\xad\\xe1\\xd4\\x70\\x6f\\xb1\\x38\\xe5\\x82\\xa9\\x0d\\x0e\\xef\\xea\\x47\\x52\\x0d\\x6b\\x6c\\x13\\xca\\xee\\x0f\\x20\\x11\\xee\\xb9\\x00\\x80\\x52\\x4b\\xae\\x73\\xe2\\xfc\\xce\\xc5\\x34\\xd6\\x8e\\x5e\\x6f\\x38\\x56\\x10\\x86\\x54\\x93\\x45\\xb9\\x59\\xe8\\x7d\\x7d\\xc7\\xf8\\x62\\x0e\\x3d\\x5a\\xd6\\x95\\x7d\\x6e\\x89\\x44\\x40\\x32\\xf5\\x11\\x85\\x56\\x52\\x99\\x6f\\x7b\\x5c\\x9e\\xeb\\xf6\\x42\\x67\\x69\\x4b\\x79\\xc4\\x60\\xf0\\xf2\\xf4\\xed\\xbb\\xd3\\x93\\xe3\\xcb\\xd3\\x97\\x4c\\xcf\\xdb\\x2f\\x0f\\xff\\xb2\\xdf\\x82\\xec\\x9a\\xae\\x83\\x33\\x34\\x5b\\x73\\xc1\\xd7\\x84\\xbc\\xe3\\x9b\\x07\\xd3\\x04\\x18\\xec\\xac\\x9b\\xc7\\x70\\xc9\\x5e\\xa8\\xba\\x51\\x9f\\xfc\\x52\\xce\\x99\\xd2\\x2c\\x52\\x24\\xe7\\x60\\xa4\\x37\\x5f\\x27\\x65\\x37\\x6e\\xb0\\xff\\x3c\\x88\\xc7\\xf0\\x3a\\xe8\\x95\\x3b\\xc7\\xdc\\x40\\x9c\\xf4\\xe7\\x44\\xb1\\x24\\xfe\\xa0\\x50\\xb1\\xf0\\xe6\\x10\\x65\\x23\\xea\\xed\\xd9\\xcc\\xa1\\x2f\\xff\\xbc\\xef\\x21\\x2e\\x03\\x1d\\x05\\xa7\\xbc\\x56\\x05\\xec\\x5f\\xfe\\x85\\x10\\xe8\\xa5\\xb3\\xe8\\x8a\\x51\\x79\\x9e\\x35\\x95\\x09\\x79\\x90\\x05\\x43\\xc0\\x6c\\x6d\\xbd\\xac\\x07\\xf5\\xc7\\xbe\\x5c\\x98\\xa6\\x4e\\x68\\x75\\xed\\x19\\x2e\\x11\\xf6\\x2d\\x18\\x65\\x09\\x6e\\x36\\x08\\x25\\x20\\x4e\\x2d\\x56\\xf5\\xf6\\x04\\x62\\xcb\\xe8\\xf2\\x5a\\x01\\x41\\x0d\\x47\\x1f\\x5a\\x2d\\x79\\xfd\\x95\\xeb\\x8d\\xdb\\x64\\x0d\\x70\\xc0\\x67\\xc5\\x8d\\x1d\\x92\\xc6\\xa2\\x6d\\x7b\\x12\\x7e\\x50\\x41\\x8c\\xbf\\xc3\\x66\\xa4\\xee\\xf4\\x64\\x7e\\x64\\x85\\x49\\x82\\x43\\x5c\\xe0\\x87\\x03\\x3d\\xb0\\x75\\xba\\xdb\\x52\\xe4\\x76\\x08\\x49\\x77\\xcb\\x26\\x4d\\x46\\x7f\\x60\\x50\\x43\\xbf\\xcf\\xad\\xfc\\x59\\x32\\xaf\\x55\\xaa\\x38\\xe1\\x01\\xa7\\xaa\\x41\\x53\\x1d\\x54\\xb7\\x23\\x2e\\x68\\x64\\xfb\\x2f\\x96\\x72\\x2c\\x2f\\x20\\x22\\x1e\\xa7\\x81\\x4f\\x11\\x99\\x74\\x80\\xe6\\x4b\\xa1\\xf2\\x38\\x4c\\xe2\\x7f\\x87\\x48\\xcb\\xfd\\x9e\\xdc\\x19\\x12\\x22\\xd6\\x9e\\x32\\x93\\xd7\\xb9\\x57\\x65\\xdf\\x59\\x0a\\x33\\x72\\x88\\x19\\x3e\\x18\\x6a\\x13\\x08\\xc0\\xbc\\xba\\x27\\x18\\x4d\\x90\\x67\\x28\\x99\\x06\\x14\\x27\\xd6\\xb1\\xaa\\x38\\x95\\xcc\\x1d\\x5a\\xd5\\xd5\\x10\\x60\\x8d\\xcb\\x4c\\x29\\x99\\xec\\xcb\\xe0\\xfb\\xcb\\xd7\\xaf\\x0c\\xd0\\x8e\\xd0\\x0c\\xeb\\xd4\\xe6\\xfa\\x17\\x2e\\x53\\x91\\x88\\x31\\x43\\xbf\\x3c\\x60\\x1e\\x40\\xff\\xe1\\xe5\\x58\\x3a\\x81\\x2e\\x57\\x9e\\x05\\xb6\\xc2\\x07\\xce\\xc1\\xa4\\x01\\xd4\\x62\\x1d\\xb0\\xb2\\x0c\\xd0\\xe7\\x03\\x4d\\x41\\xcd\\xd7\\xdf\\x38\\x0c\\x29\\xdb\\xdf\\x6f\\x97\\xb0\\x19\\xfe\\xe6\\x04\\xd2\\x34\\x7e\\x73\\x17\\xf3\\x43\\x48\\x03\\xea\\x70\\x4f\\x95\\xe3\\x7a\\xe1\\xe8\\x0c\\x15\\xe8\\x6c\\x13\\x12\\x5d\\x7c\\x64\\x7d\\x42\\x01\\xfe\\xc5\\x48\\xc5\\xba\\x3d\\x0b\\xec\\x90\\xea\\x63\\x30\\xcd\\x8a\\x58\\xab\\x35\\x27\\xde\\xe2\\x0e\\x15\\x12\\x98\\x7a\\xcd\\x1d\\x06\\x3f\\xc4\\xe5\\x8d\\x3c\\xd6\\x48\\x61\\x32\\x1c\\x65\\xe6\\x8c\\x9d\\xe6\\x43\\xda\\x19\\xa9\\x0f\\xd9\\xc4\\x72\\x1c\\x0a\\x36\\x25\\x82\\xea\\x28\\x48\\x67\\x93\\x2b\\x64\\xc2\\x4d\\x39\\x49\\x8c\\x6f\\x80\\x3b\\x12\\xff\\x69\\x24\\x81\\xf9\\xbc\\xa6\\xf5\\xaf\\xf7\\x66\\x4c\\xf9\\x1a\\xaf\\x53\\x0f\\xcc\\x5b\\xfa\\x9e\\x08\\x74\\xb1\\xbc\\x5c\\x15\\xc0\\x07\\xd0\\x07\\xab\\xc2\\x2c\\x42\\x32\\x9d\\xc2\\x10\\x8f\\x42\\x31\\xac\\x5b\\x4c\\x36\\xa6\\x20\\x96\\xa6\\xfc\\xb2\\x8a\\x42\\x52\\x22\\xb3\\x24\\x62\\xa0\\x39\\xc7\\xbb\\xf2\\x01\\xaa\\x13\\xbd\\x7f\\x6f\\x40\\x99\\xb0\\x9c\\x6c\\x56\\x9b\\x80\\xe5\\x0c\\x04\\xef\\x47\\xcc\\x8a\\xb8\\x50\\x88\\x10\\xf0\\x57\\xad\\x47\\x5f\\xfc\\xd4\\x89\\x82\\x0d\\xad\\xee\\xf0\\x44\\xa1\\x87\\x0d\\xf1\\xdc\\x3b\\xb9\\x14\\x08\\x6d\\xf4\\x48\\x5c\\x13\\x96\\x17\\x4e\\xc3\\xad\\x80\\x6a\\x45\\xad\\xba\\x24\\xe2\\xc2\\xae\\x89\\x26\\x16\\x5c\\x66\\x03\\xc6\\xa4\\x65\\xa9\\xce\\x8d\\xf7\\x2c\\xb2\\x24\\xaf\\xd4\\x98\\x02\\x7a\\x8f\\xcf\\x74\\x5b\\x01\\xb2\\xed\\xeb\\xea\\xe5\\x81\\x65\\xce\\xf3\\xf7\\x8f\\x42\\x49\\xaf\\x4d\\x22\\x36\\xa5\\x9d\\x97\\x00\\xf0\\x91\\xda\\x6f\\xc2\\xf5\\x0d\\xa9\\xdc\\x93\\x5c\\x85\\x78\\xba\\x12\\x44\\x4a\\x4d\\x81\\xf7\\xd3\\x7b\\x7b\\xa3\\x63\\x11\\x3e\\xde\\x01\\xd6\\x18\\x06\\x39\\x4e\\xa3\\x53\\x39\\x17\\x08\\xbe\\xe1\\x13\\x4b\\x24\\x65\\x3c\\x02\\x8f\\x34\\xbd\\xc6\\xe8\\x0a\\x8c\\x9d\\xfb\\x01\\x1a\\x3e\\x1e\\xa0\\x98\\x8e\\x94\\x9b\\xc3\\x74\\xfe\\x6c\\x8a\\xa2\\xc7\\x19\\x01\\x38\\xba\\x7f\\x5e\\x49\\x5e\\x72\\xa4\\xc6\\xe1\\x2c\\x29\\x65\\x23\\xc4\\x6c\\x78\\xf7\\x8e\\x92\\x40\\x86\\x88\\xfd\\xb0\\x1e\\xe8\\xf4\\x01\\xc1\\xe8\\x26\\x4e\\x22\\x60\\x9e\\x26\\xd5\\x08\\x80\\xb4\\x24\\xaa\\x21\\x71\\x18\\x7c\\x73\\x6f\\x60\\x8d\\x61\\x72\\x86\\x97\\x29\\xcb\\xd2\\x36\\x8e\\xf3\\xa2\\x34\\x42\\xf4\\x54\\xbf\\x32\\xe0\\x13\\x08\\xf9\\x96\\x44\\x87\\x50\\xac\\x78\\xf6\\x34\\xff\\xa0\\xc6\\x82\\x17\\xe6\\xd0\\x78\\xd8\\x4c\\x85\\x17\\x4d\\xa7\\xca\\x2d\\xa7\\x26\\x5d\\x7b\\xb0\\x39\\x47\\x81\\x05\\xda\\x22\\x1f\\x4d\\xc7\\x4f\\xea\\x23\\x35\\x5c\\x33\\xcb\\x9e\\x0f\\x9e\\x8a\\x79\\xdb\\x3d\\xd0\\x35\\x27\\x98\\xaa\\x3d\\xe1\\x15\\x9e\\x75\\x0f\\x16\\xa9\\x18\\xa8\\x4f\\x84\\x34\\x4f\\x29\\x2e\\x5d\\xcc\\x59\\x01\\x8d\\xe8\\x4a\\x4c\\x70\\x32\\x2d\\xef\\x07\\x6b\\xb6\\x70\\xec\\x0d\\x8d\\x16\\xcb\\x66\\xbe\\x61\\xb3\\xa8\\x53\\xb4\\xa8\\x61\\x63\\x20\\x5c\\xc6\\xa0\\xe1\\x61\\x8e\\xc9\\x4d\\xed\\xb4\\x69\\x9c\\x9d\\x6d\\xcd\\x24\\x96\\xdd\\xe2\\x31\\xd3\\xd8\\x01\\x71\\x79\\x22\\x7f\\xc3\\x7b\\xc9\\xfa\\xa8\\xbc\\x88\\x47\\x77\\xa5\\xae\\xe3\\x94\\x2b\\x30\\x3c\\x66\\xf7\\x7f\\x65\\x30\\x1f\\x2c\\x08\\xb0\\x2a\\xe4\\x12\\x26\\xce\\xd5\\x63\\x8b\\x05\\xac\\x59\\x72\\x36\\x1c\\x11\\x58\\x1a\\xda\\x1d\\x8e\\x0b\\x68\\xa1\\x79\\x7c\\x81\\x01\\x8f\\x1b\\xbb\\x10\\x1e\\xa8\\x01\\xbc\\x8c\\xba\\x17\\x7e\\xac\\x1c\\x25\\x58\\xd5\\xf8\\xeb\\x48\\x3e\\x5a\\xb3\\xf5\\xc7\\x3f\\x2e\\x68\\xfd\\x4d\\x13\\x4c\\xac\\xe1\\xab\\x0b\\xcc\\x78\\x2d\\x5c\\xc6\\xe3\\xe8\\xab\\x5a\\xda\\xe4\\xc7\\x08\\x8c\\x27\\x1a\\x95\\xa0\\x07\\xfa\\x15\\xb5\\xe3\\x4a\\xcf\\x31\\x89\\xad\\x1a\\x41\\x41\\x00\\x42\\xe4\\x0c\\x7d\\x95\\x0a\\xf4\\xe3\\x71\\x92\\xac\\xcc\\x78\\x87\\x36\\x3d\\x57\\x9c\\xa1\\xd9\\x34\\xcf\\x6e\\xe3\\x08\\x1e\\xe1\\x51\\xaa\\x28\\x7a\\x52\\x53\\x92\\x35\\xeb\\x0c\\x62\\x59\\xab\\x33\\x67\\x2b\\xdc\\xad\\xe8\\x6e\\x18\\xf1\\x44\\x06\\x44\\x0f\\x50\\x0f\\x6e\\x94\\xf0\\x61\\xf0\\x3a\\xa4\\x34\\x90\\x0e\\x3d\\xee\\x2c\\x5e\\x7f\\x17\\xae\\x2e\\xe0\\x46\\xda\\xa2\\xea\\x1c\\x58\\x30\\x16\\xb2\\xa2\\x76\\x84\\xc8\\x9d\\x1b\\xa4\\x9e\\x8a\\x00\\x91\\x3a\\x00\\x46\\x1a\\xfb\\x9b\\x19\\x2e\\x35\\x65\\xd7\\xa0\\xad\\xa1\\xf7\\x9e\\xf0\\x9d\\x62\\x7d\\x39\\xca\\x26\\x57\\x31\\xba\\xdf\\x94\\x0c\\x24\\xd0\\x15\\x0b\\xee\\xbd\\x43\\x78\\x3e\\x4a\\x66\\x94\\xdb\\x0d\\xaf\\xc5\\xb9\\x5b\\xe3\\xa2\\x72\\xf7\\x00\\xa6\\x41\\x17\\x4f\\xa7\\x05\\x55\\xc0\\xba\\x30\\x60\\x31\\x99\\x16\\x83\\xc3\\x94\\x22\\x34\\x8a\\x1e\\xa7\\x6b\\x55\\x36\\x88\\x31\\x2e\\x03\\xfa\\x03\\x3e\\x95\\x78\\x54\\xd3\\xfc\\x95\\x99\\xc0\\x04\\xc0\\x44\\x97\\x37\\xb4\\x43\\xa3\\xe0\\x9b\\x70\\x48\\x11\\x14\\xb3\\xe9\\x34\\x89\\xb1\\x06\\x47\\x6c\\x13\\x6c\\x60\\xbc\\x5b\\xde\\xa7\\x28\\x49\\xe2\\x82\\x53\\x15\\x4d\\x5d\\x06\\x4a\\x38\\x68\\x20\\x14\\x27\\x56\\xc9\\x7e\\xcf\\xf6\\xc0\\x6f\\x73\\x33\\xd9\\xb7\\x49\\xc3\\xaa\\xac\\xb3\\x98\\x8b\\x1c\\x78\\x32\\x25\\x04\\x5e\\x87\\x99\\x46\\xc3\\xb2\\x99\\xe6\\xd9\\x65\\x75\\xfa\\x35\\x1b\\x54\\x2e\\x55\\x1d\\x83\\xaa\\x53\\x9f\\xc3\\x1b\\x4a\\x62\\x1d\\x6e\\x24\\x4d\\x67\\x9b\\x4a\\x66\\x89\\x4d\\x2b\\x01\\x98\\x87\\x26\\xb8\\x09\\xea\\xb2\\x02\\x5c\\x76\\x8c\\x3f\\xe2\\x42\\x20\\xc5\\xd7\\x69\\x3a\\x00\\xa5\\x95\\x57\\x2b\\x66\\xbe\\x25\\x31\\xa4\\x1e\\x9b\\x9a\\x0d\\xb5\\x57\\x19\\x54\\x58\\xa6\\x0d\\x7b\\xe0\\x2c\\xbd\\xcb\\xc3\\x69\\x57\\x14\\xe6\\x07\\x78\\xee\\x6e\\x10\\xb3\\x11\\xf0\\x1c\\x93\\x6e\\x28\\x2d\\x79\\x15\\x07\\x43\\x84\\x0a\\x01\\x98\\x02\\xf0\\xa2\\xcc\\x7a\\x98\\x93\\x35\\xb7\\x82\\xa5\\xf7\\x5e\\x53\\xc0\\x42\\x09\\x52\\x78\\x47\\xf0\\x33\\xb4\\x4d\\xe4\\xf1\\xe9\\x41\\xd4\\xa8\\x40\\x64\\x76\\xad\\x56\\x83\\x60\\xdb\\x24\\x93\\x75\\x88\\x55\\x5c\\xae\\x30\\x2b\\xab\\x65\\x41\\xd2\\xfc\\x46\\x2f\\x34\\xf8\\x62\\x73\\x69\\xf3\\x48\\xc3\\xfc\\xc4\\xa5\\xa6\\xd5\\xee\\x3a\\x4c\\x73\\x37\\xc5\\x6e\\x36\\x79\\xc9\\xed\\x9f\\x88\\x64\\xa3\\xa9\\xbb\\x94\\x70\\xeb\\x8f\\xe7\\xd0\\x7c\\x69\\x62\\x2f\\xbf\\x81\\xf5\\xa6\\xbd\\x9e\\x3a\\x8d\\xa7\\x53\\xd4\\xd6\\x0d\\xbe\\x55\\xcd\\xef\\x80\\xa7\\x8e\\xd1\\xbb\\x10\\x33\\x1c\\x6c\\xfa\\xf1\\xe6\\x2c\\x4d\\x55\\xbe\\x61\\xd5\\xb3\\x7e\\x32\\xb7\\x6a\\x22\\x36\\x76\\x75\\x5e\\x27\\x15\\xd1\\x5b\\x85\\x5c\\x8f\\x58\\x11\\x31\\xe3\\x96\\x5f\\x19\\x67\\x25\\x91\\x28\\xc0\\xae\\x92\\x36\\x3b\\x36\\x33\\xd7\\xa0\\x31\\xd5\\x9a\\xaf\\xb7\\x78\\xa5\\xb9\\x1b\\x0d\\xd5\\x9e\\x76\\x9b\\x93\\xc2\\x3d\\x6f\\x28\\x39\\xab\\xc1\\xc3\\xa2\\x66\\xf3\\x0a\\xdf\\x37\\xb7\\x01\\x7a\\xf5\\x0c\\x14\\xe3\\x8a\\xae\\x3f\\x8d\\x7d\\xfb\\x4a\\x03\\x21\\xd1\\xcd\\xe6\\xcc\\xe2\\x0a\\x72\\x2c\\x0c\\xc7\\xc1\\xbf\\x55\\x9e\\x1d\\xf0\\x1d\\xa3\\x18\\x84\\xe9\\x9a\\x2a\\x93\\x35\\x47\\x05\\xd8\\x09\\x63\\x38\\x7c\\x44\\xaf\\x55\\x59\\xe1\\xe1\\x11\\xad\\x25\\xc1\\xaf\\xc1\\x2b\\x15\\x6c\\x16\\x46\\xc3\\xce\\xd7\\x6e\\x16\\x5e\\xa8\\x30\\x07\\xa8\\xb9\\xe8\\xa4\\xdc\\xed\\x17\\x0c\\xc8\\xfe\\x0b\\x27\\x59\\x8b\\xd1\\x57\\x3d\\xd0\\x00\\x8c\\x70\\x1e\\xc6\\xa9\\xc1\\x87\\x58\\x75\\x9e\\x3e\\x41\\x2c\\xe3\\xff\\xb0\\x34\\x0b\\x55\\x9c\\x74\\x76\\x5b\\x2b\\x0f\\xef\\x61\\x67\\x1f\\xcc\\xf5\\xfc\\x26\\x91\\x64\\x9c\\xaa\\x17\\xdc\\x7e\\xf3\\xf5\\xa5\\x83\\x72\\x15\\x67\\x74\\x05\\x53\\xf1\\xe8\\xc6\\xb5\\x9d\\xbe\\x83\\x65\\x89\\x4a\\xaf\\xcb\\x9b\\x56\\x5a\\xb6\\x21\\x6c\\x7e\\xad\\x5f\\xdb\\x19\\xe2\\xb5\\x1d\\xba\\x11\\x41\\x17\\x2a\\x46\\x98\\x66\\xa0\\x37\\x19\\x7d\\xdf\\xc7\\xd5\\x3d\\x01\\x68\\x0a\\x8a\\x05\\x46\\x38\\xc1\\x08\\xf3\\xe6\\x8f\\x82\\x2f\\x0f\\xff\\x7b\\xa8\\x43\\x15\\xf8\\xaf\\xff\\xf1\\x80\\xae\\xd2\\x89\\xc1\\xfe\\x49\\x44\\xdd\\xab\\xbe\\xe7\\x3d\\x61\\x24\\x7f\\xae\\x2c\\x82\\x1a\\xce\\x51\\x83\\x47\\xb9\\xd8\\x46\\xe2\\x0a\\x4c\\xc5\\x5d\\x66\\x71\\x69\\x8c\\x85\\xe2\\x05\\x4c\\xb4\\xd5\\xec\\x51\\x91\\x0b\\x06\\xfc\\xdc\\x17\\x9a\\xff\\xe7\\x1c\\x44\\x49\\x9c\\x60\\x9a\\xc5\\x56\\xf3\\xeb\\x4b\\x52\\x18\\x78\\x76\\xea\\x39\\x9a\\xb8\\xa5\\xce\\x62\\x00\\x5e\\xf1\\x24\\x48\\x63\\xac\\x0c\\x1b\\x27\\xa1\\xb9\\xec\\xa3\\x47\\xd7\\xfb\\x91\\x56\\x7f\\x7f\\x1a\\x58\\xbb\\x50\\xde\\xd9\\x97\\x9b\\x0a\\x95\\x74\\xb6\\x28\\x6a\\xb8\\xd2\\x29\\x9f\\xbc\\xb0\\x5a\\xb8\\xf3\\x06\\xc9\\x8a\\x8c\\x32\\x9f\\xbb\\x67\\x75\\xcb\\x51\\xdd\\x22\\x85\\x15\\x28\\xe4\\xa1\\xc1\\x62\\xde\\x4d\\x98\\x15\\xf1\\xc0\\x73\\x16\\x63\\x15\\x8e\\xf3\\xf0\\x5a\\x6f\\x0c\\xcb\\xc0\\xef\\x1d\\xda\\x6c\\x12\\x6a\\x50\\x48\\x08\\xb4\\xfa\\x18\\x17\\xb4\\x2e\\x6a\\x2e\\xdd\\x32\\xd0\\xc3\\xd7\\x1a\\xe6\\x3e\\x31\\x44\\x27\\xa1\\x67\\xa1\\xa8\\xa1\\xae\\x5d\\x9a\\xdc\\xcb\\xf9\\x05\\xef\\x90\\x76\\x69\\xf7\\xd7\\x0d\\xde\\xad\\xdf\\x16\\xcd\\xc0\\x57\\x91\\x0d\\xbd\\xc3\\x6b\\xf8\\xa0\\xa8\\xe8\\x72\\x8d\\xcb\\x42\\x47\\x21\\xdf\\x66\\xad\\x77\\x1d\\x86\\xb8\\xa1\\xb3\\x79\\x49\\x49\\x4a\\xc6\\xde\\xc0\\xa0\\xb0\\x9b\\xc3\\x64\\x60\\x46\\x13\\x41\\x15\\x46\\xdd\\x9b\\x21\\x4b\\x78\\x63\\xcc\\x71\\xb0\\x3c\\x24\\x7d\\x0f\\x6f\\xcc\\xa6\\xf0\\x12\\x18\\xcd\\xd7\\x37\\x94\\x1a\\x15\\xa6\\x23\\xf8\\x14\\x0b\\x04\\xc5\\xb6\\xce\\x69\\x99\\xab\\xd6\\xb2\\x3f\\x1b\\x24\\x64\\x92\\x15\\x00\\x4b\\x4d\\x3b\\xb5\\x2f\\x86\\xcf\\x54\\x74\\xa9\\x58\\xdd\\x80\\x8e\\x3d\\xc7\\xf3\\x8e\\xdd\\x16\\xde\\x78\\x42\\xb3\\xc1\\x98\\xe7\\x13\\x3e\\xc6\\x19\\xa3\\x3b\\x45\\x05\\xa3\\xd3\\xcc\\x8c\\x14\\x17\\xee\\x65\\x38\\x7d\\x61\\xd3\\x5c\\x27\\x1e\\x57\\xc2\\x98\\x7e\\x85\\x03\\x04\\x51\\x85\\x51\\x3f\\x5e\\x2f\\xb4\\x13\\xed\\x2e\\xfb\\x49\\x05\\xd7\\x15\\xef\\x22\\xab\\xa4\\x59\\xe1\\x7e\\x32\\x14\\x52\\x36\\xe6\\xe2\\x38\\x5c\\x8b\\x10\\x48\\xe9\\xf0\\x47\\x5d\\x8e\\x9a\\xb6\\xa5\\xd0\\x2d\\x9a\\x55\\x8d\\xd9\\x23\\x72\\x9a\\x0e\\xd6\\x35\\x93\\xe9\\x1b\\xbd\\x7d\\x07\\xff\\x45\\xf4\\x81\\x7b\\x93\\x36\\x5f\\x5d\\x35\\x04\\x83\\x11\\xe2\\x85\\xcd\\x08\\xf0\\x88\\xd6\\x97\\xb8\\x5a\\xa9\\xee\\x5d\\x54\\x1c\\x85\\xdc\\x03\\x6f\\x52\\x1b\\x2d\\x1e\\xf1\\xca\\x46\\x88\\x73\\x74\\x49\\xa6\\x38\\x08\\xc7\\x28\\x9b\\xd0\\xa7\\x94\\xcf\\x5a\\x81\\x58\\x4e\\x48\\xbb\\x0e\\x48\\x4e\\x75\\xf8\\x15\\xab\\xc6\\x83\\x3b\\x46\\x5e\\x33\\xd9\\x37\\x94\\x97\\x32\\xc5\\xe8\\x8e\\x78\\xb7\\xae\\xb0\\x8d\\x6e\\xf0\\x9a\\x7e\\xf3\\x19\\x74\\xd3\\x29\\x1d\\xae\\x44\\x5d\\x15\\x06\\x2f\\x63\\x97\\x95\\xc8\\x05\\x66\\x14\\x75\\x86\\x5d\\xa2\\x59\\xf7\\x91\\xb3\\x36\\x1b\\x31\\x2e\\x23\\xe9\\x35\\xf6\\x54\\x90\\xdc\\xc1\\x39\\x11\\x98\\xb4\\x29\\xee\\x82\\xc3\\xfc\\x59\\xc2\\x32\\x2d\\x01\\xbb\\xc3\\xe0\\xfc\\x5d\\xc7\\xd7\\x2d\\x5f\\xa1\\xd8\\xcc\\xd8\\x39\\xc4\\xc8\\xe3\\x5d\\x98\\x47\\xce\\xa9\\x58\\x12\\x16\\x5d\\xd1\\xbb\\x20\\xf0\\x69\\xf7\\xaf\\x5a\\xd0\\x67\\x55\\x3a\\x82\\xa4\\x3b\\xea\\xd8\\x57\\xc6\\x12\\x04\\xf0\\xc2\\x90\\x4f\\x0b\\x52\\xd0\\x9b\\xb0\\x39\\x5c\\xa9\\xab\\x26\\x39\\x34\\x6a\\x61\\x96\\xde\\x05\\x6c\\xb9\\x07\\x22\\x4a\\x35\\xac\\x49\\x9a\\x87\\x1a\\xb6\\xe0\\x57\\x36\\xb4\\xd9\\x20\\x07\\x1c\\xf4\\x8d\\x0b\\x8f\\x38\\x8e\\xe6\\x6c\\x24\\x48\\x7b\\x00\\xd4\\xdb\\xab\\x7a\\xd4\\xbc\\x7a\\x10\\x72\\x75\\x6d\\xcb\\xcb\\xca\\x48\\xc7\\x46\\xfd\\x38\\x90\\x9e\\xeb\\x30\\xaf\\x86\\xff\\x62\\xae\\x73\\xa5\\x17\\x4c\\x93\\x70\\x56\\x80\\xa8\\x6f\\x60\\xcd\\xae\\x73\\xd3\\xd1\\xd5\\x9c\\x43\\x81\\xcd\\x39\\x83\\x18\\x93\\x5b\\x40\\x7b\\x3c\\x4a\\xea\\x2c\\x6f\\xc3\\x12\\xf6\\xfd\\xd7\\xc5\\xa3\\xc4\\x7e\\x05\\x1f\\x87\\xd0\\xef\\xb7\\x2c\\xfa\\xdb\\x24\\xec\\xe6\\xb4\\x9d\\xc2\\xd1\\xd3\\x75\\x18\\x3f\\x46\\xf7\\xdc\\x84\\xb7\\x7c\\xcf\\x4f\\xf3\\xa4\\xc3\\xb5\\xf2\\x0f\\x89\\xb7\\xbf\\xda\\x6e\\xc2\\x62\\x93\\x5b\\xf5\\xfa\\x49\\x61\\x93\\xa8\\x7c\\x67\\x65\\x01\\x7c\\xcd\\x10\\x7d\\x3c\\xc4\\x93\\x1b\\x35\\xfa\\xe0\\x2d\\xa0\\xb6\\x34\\x73\\xed\\x79\\x85\\x4d\\x89\\x1a\\xb5\\xdc\\x0c\\xd7\\x76\\xcf\\xf1\\x4e\\xe5\\x18\\xed\\xe6\\x44\\x85\\x45\\xe9\\x1c\\x6e\\x16\\xb5\\x73\\x41\\x26\\x1a\\x1f\\xb3\\xd5\\xd2\\xd9\\xb6\\x27\\x37\\x71\\xa3\\xd8\\x48\\xbe\\x61\\x4d\\x6e\\x76\\x9a\\x88\\x3d\\x0c\\x45\\x67\\x41\\x98\\x40\\x79\\x70\\x06\\xf0\\x8d\\x46\\x6a\\x4a\\xa5\\xb5\\x6c\\xa1\\xa9\\x21\\x7b\\x3c\\x43\\xf1\\xab\\xc5\\x8a\\x94\\xcf\\x9e\\x16\\xe2\\x0f\\xf9\\x27\\x89\\xf6\\x98\\xf3\\x70\\xd1\\x24\\x84\\x56\\xb3\\x14\\x38\\xb8\\x80\\x49\\x6a\\x33\\x49\\x3f\\x49\\x1e\\x6f\\xca\\xd0\\x03\\x22\\xfb\\xbb\\xd9\\x27\\x49\\x3d\\x35\\xef\\x54\\x6f\\x79\\xea\\x29\\x73\\xb0\\xc7\\x4e\\x91\\xa1\\xdf\\x2a\\xe6\\x00\\x1e\\xf5\\x22\\xf2\\x6d\\x26\\x01\\xfa\\xff\\x5d\\x16\\xc1\\x5b\\x74\\x23\\xba\\x6c\\x2c\\x97\\x77\\x3a\\x18\\x18\\x3a\\xeb\\x75\\x9a\\x67\\x00\\x2d\\x2b\\xe1\\x5a\\x11\\x3c\\x57\\x47\\xe3\\xa0\\xc2\\x3e\\xee\\xcf\\xd7\\xba\\x2d\\xea\\x1c\\x2a\\x47\\x51\\x69\\xe9\\x75\\xab\\x37\\xc6\\xe9\\x6d\\xf6\\x41\\x45\\xad\\xee\\xad\\xc3\\x1f\\x9f\\x26\\x93\\x70\\x3a\\xd0\\x93\\xd4\\x75\\x46\\x94\\x4d\\x4e\\xe7\\x7b\\xb2\\x6d\\xd6\\x6b\\x3c\\x99\\xa8\\x28\\x0e\\x4b\\xac\\x2b\\x3a\\xce\\xb0\\x77\\x2a\\xe5\\x3c\\xc4\\x57\\xc9\\x32\\x77\\xfb\\xce\\xc6\\xee\\xd6\\x86\\x81\\x48\\xb9\\xbf\\x31\\xe4\\x3e\\x96\\x9c\\x73\\xc3\\x02\\x9e\\x62\\x18\\xcf\\x4c\\x94\\xc2\\xfc\\xb0\\x40\\x62\\xd7\\x40\\x09\\xcb\\x07\\x3c\\x61\\x44\\xf0\\x16\\x3a\\x5d\\xa4\\x78\\x36\\x70\\xba\\x46\\xc5\\xc5\\xaf\\x69\\x3c\\xc2\\x03\\x57\\x24\\x07\\x26\\x92\\x6e\\x88\\x22\\x18\\xb9\\xcf\\x82\\xab\\x19\\x06\\x73\\x4b\\xff\\x9a\\x8a\\x13\\xf3\\xf6\\x92\\xb3\\xac\\x0a\\xd6\\xb5\\x76\\x1b\\x74\\x30\\x07\\xc2\\xd7\\x4b\\x2e\\x09\\x73\\x52\\x15\\x55\\x4e\\x8a\\x2c\\xca\\x6c\\x6a\\x63\\xf4\\xf5\\x65\\xa4\\xaa\\xc9\\x01\\xda\\xbc\\xe1\\x22\\xe4\\x1b\\x61\\xd6\\xfb\\xb4\\x8c\\x1b\\xd8\\xa5\\x7d\\xcd\\x26\\xfe\\xed\\x1a\\xfb\\x8c\\xab\\x6f\\xab\\x2d\\xd7\\x46\\xf0\\x0b\\x9f\\x3c\\x76\\x76\\xc9\\x7b\\xf6\\x40\\xe5\\x53\\x62\\x17\\xc7\\x26\\x3e\\x15\\x56\\x01\\xd0\\xa6\\x2d\\x6c\\x17\\x97\\xea\\xc6\\x12\\xdd\\x18\\x32\\xd3\\x98\\x93\\x8f\\x95\\xf3\\xee\\xd6\\x86\\x63\\xb6\\x48\\x3a\\xc8\\xba\\xf0\\xd9\\xda\\x99\\x00\\xa2\\xb7\\x94\\xf7\\xb5\\x61\\x02\\x34\\x5a\\xf2\\x5e\\x95\\x68\\x4a\\x7e\\xa6\\xc9\\xcc\\x1c\\x8e\\xb5\\x5b\\xc7\\x72\\xd1\\xe4\\xbc\\x75\\x61\\xb2\\x29\\x8f\\x0e\\x71\\x5a\\x30\\xe5\\x8d\\x0f\\xae\\x4d\\x26\\x84\\x9f\\x70\\x81\\xf6\\xa9\\x9c\\x51\\x56\\x2f\\xda\\x67\\xe3\\x31\\x80\\xf4\\x96\\xae\\xf4\\x75\\xb9\\x23\\x7a\\x22\\xbe\\xfc\\xb7\\x74\\xfc\\xf7\\x11\\x1a\\x7c\\x8c\\xd1\\xc2\\xf6\\x1e\\xa2\\x6b\\xf3\\x4e\\x3e\\x39\\x7a\\x14\\x0f\\x44\\x90\\x0d\\xed\\xd8\\xdb\\x35\\x8c\\xab\\xab\\x70\\x6b\\xbb\\xb6\\xf0\\x6e\\x3d\\x26\\xf1\\x4e\\x32\\x74\\x3d\\xa6\\xf2\\xe3\\x60\\xe0\\xaa\\x46\\xf2\\x4e\\x32\\x70\\x75\\xe3\\xf9\\x71\\x30\\x6f\\x59\\xb3\\xb9\\x29\\x5e\\x85\\x77\\x68\\x54\\xb4\\x7c\\xbc\\xea\\x71\\xee\\x33\\xb9\\xba\\x5d\\x2a\\xca\\x52\\xa3\\xc6\\x27\\x11\\x77\\x42\\x72\\x2c\\x1b\\x77\\xea\\x41\\x91\\x4f\\x62\\x5f\\xad\\xaf\\x83\\xad\\x2f\\x71\\xe0\\xd2\\xfa\\x02\\x4e\\x8f\\x8f\\x6f\\xeb\\xd9\\x3e\\x1f\\x13\\x9f\\xd6\\x11\\x69\\x7a\\x7c\\x7c\\x5a\\x7d\\x97\\x7c\\x4c\\x3c\\x5a\\x75\\xaf\\xfc\\x94\\xf6\\x01\\x8d\\xcb\\x82\\xb5\\xef\\xfa\\x1c\\x4c\\x86\\xd8\\x1c\\x19\\x9f\\x7b\\x85\\x07\\xc3\\x20\\x0f\\xd3\\x6b\\x3a\\xa5\\x25\\xa9\\x69\\x3f\\xff\\x2b\\xca\\x30\\x2f\\x17\\xc9\\xa2\\xf6\\xae\\xa2\\x1a\\x48\\xf8\\x0e\\x2a\\x17\\xff\\x63\\x24\\x95\\xa4\\xf6\\x63\\x9f\\xcb\\xf8\\x56\\xd1\\x19\\x9a\\xde\\x0b\\xa8\\x3e\\x02\\x47\\x29\\x9c\\x0e\\x9f\\xb6\\xe9\\x82\\x9b\\x33\\xad\\x95\\x18\\x3c\\x5d\\x19\\x4a\\x5a\\x2d\\x57\\x8a\\x16\\xc8\\x5a\\x80\\xc4\\x8f\\xb3\\x49\\x5c\\x96\\x78\\x48\\x48\\x67\\xae\\x44\\x76\\x94\\x9b\\x38\\x9d\\xc1\\x10\\x98\\x2b\\x9e\\x74\\xa0\\x27\\xf2\\x91\\x00\\x8b\\x06\\xc4\\x0a\\x27\\xa0\\x97\\x46\\x2f\\x7a\\xa4\\x86\\x5f\\xdc\\x64\\x77\\x34\\xea\\xbf\\x66\\x8a\\x6b\\x8a\\x7a\\x4d\\x5b\\x81\\x1f\\xba\\xab\\x78\\x90\\xa5\\x5e\\xd8\\x6d\\x5e\\x24\\x8c\\x06\\x7c\\x83\\x0d\\xd4\\x9a\\x16\\x04\\x9d\\x82\\x4a\\x77\\x35\\x33\\xfd\\x61\\xf0\\xd2\\x2d\\x84\\xfe\\x91\\x89\\x02\\x88\\xa5\\x51\\x98\\xc3\\x8c\\xe3\\xb1\\xc2\\xba\\xb8\\xfc\\xae\\x47\\x02\\xfa\\x69\\x60\\xa6\\x74\\x17\\x88\\x5c\\xca\\xa8\\xe0\\xfd\\x3a\\x4c\\xe3\\xe9\\x2c\\x41\\xcb\\xa2\\x17\\xf6\\xa0\\x18\\xc0\\x87\\x58\\xb8\\x88\\x45\\xaa\\xee\\xfe\\x97\\x86\\x76\\xfb\\xd5\\x79\\x73\\xb8\\x75\\xf5\\xb4\\xe3\\xc5\\xd0\\xe8\\x7b\\x1c\\x4d\\x98\\xea\\x71\\x8f\\x82\\x6f\\x65\\xb0\\xae\\xe0\\xe6\\x96\\x90\\x35\\xc9\\x00\\x97\\x74\\xc4\\x7d\\xe7\\xd5\\xee\\x70\\xee\\xf8\\xd2\\xfc\\x43\\xae\\x2f\\x18\\x7a\\x2f\\x8d\\xf8\\x22\\x94\\x4e\\x1c\\x88\\x14\\x83\\x6a\\x8e\\xcc\\xe3\\xb2\\xda\\x37\\x98\\xc9\\x61\\x33\\x04\\x34\\x39\\x1e\\x9c\\x18\\x5b\\x12\\xff\\x4d\\x0b\\x9a\\x41\\xc3\\xda\\xb4\\x8f\\x52\\xf6\\xb6\\x4c\\xee\\x87\\x13\\xf5\\x06\\x86\\x74\\x4a\\xff\\xef\\x4f\\x22\\x35\\x4a\\xc2\\x1c\\xef\\x7a\\x45\\xb3\\x44\\x05\\x7b\\xdc\\xf6\\x76\\x2f\\xf8\\x95\\x46\\x05\\x73\\x24\\x83\\x2d\\xfc\\xaf\\xc1\\x9f\\xdc\\x77\\x6f\\x43\\x6d\\x3e\\xea\\x91\\x2e\\xb0\\x02\\xe4\\xe8\\xb9\\xf7\\xc6\\x9f\\xaa\\x0f\\xff\\xff\\x00\\x00\\x00\\xff\\xff\\xa3\\x3d\\x8d\\x7a\\x4a\\x45\\x02\\x00\")\n\nfunc uiTsTypingsJqueryJqueryDTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsTypingsJqueryJqueryDTs,\n    \"ui/ts/typings/jquery/jquery.d.ts\",\n  )\n}\n\nfunc uiTsTypingsJqueryJqueryDTs() (*asset, error) {\n  bytes, err := uiTsTypingsJqueryJqueryDTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/typings/jquery/jquery.d.ts\", size: 148810, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsTypingsMithriljsMithrilDTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xb4\\x58\\x5b\\x4f\\xdb\\xc8\\x17\\x7f\\x0e\\x9f\\x62\\xd4\\x27\\x47\\x8a\\x42\\xf5\\x7f\\x74\\xda\\x44\\x55\\xa1\\xe2\\xbf\\x2a\\xd0\\x25\\x09\\x5b\\x09\\xa1\\xd5\\xc4\\x3e\\x49\\xbc\\xd8\\x1e\\xef\\xcc\\x38\\x21\\x5b\\xf8\\xee\\x7b\\xe6\\xe6\\x4b\\x6c\\x07\\xc2\\x0a\\x04\\xd8\\x9e\\x99\\x73\\xbf\\xfd\\xec\\xd3\\xd3\\xcb\\x48\\xae\\x79\\x14\\x93\\x8f\\xc3\\xff\\x0d\\x3f\\x12\\xb9\\xcb\\x80\\x84\\xb0\\x8c\\xd2\\x48\\x46\\x2c\\x15\\x64\\xc9\\x38\\x99\\xe1\\xa2\\x08\\x78\\x94\\xc9\\x93\\x10\\x82\\x98\\x72\\x20\\x09\\x0b\\xf3\\x18\\xc8\\x9f\\x89\\xa5\\xfe\\x75\\xd2\\x8b\\x52\\x09\\x7c\\x49\\x03\\x20\\x96\\xe5\\x54\\x52\\x19\\x05\\xb8\\x75\\xd2\\xeb\\x7d\\x9a\\x11\\x78\\x94\\x90\\x86\\xc2\\xed\\x7e\\x65\\xa9\\xe4\\x2c\\x8e\\x81\\x8f\\x3d\\x01\\x31\\x04\\x92\\x71\\x9f\\x08\\xc9\\xa3\\x74\\x35\\x20\\x54\\xe2\\xcd\\x22\\x97\\x20\\x7c\\x47\\xf0\\xa5\\x58\\x1a\\x90\\xe1\\x70\\x18\\xac\\xa3\\x38\\xe4\\x90\\xfa\\xe4\\x0b\\xe7\\x74\\xf7\\xc9\\x50\\x3e\\xd9\\xc3\\xb7\\x11\\x97\\x39\\x8d\\xcf\\x63\\x48\\x20\\x95\\x4f\\x85\\xcc\\x24\\x63\\x29\\x2e\\x7c\\x9a\\x8d\\xc7\\xfd\\x82\\x73\\xfd\\xf0\\xe8\\x0d\\xea\\xbe\\xaf\\x3e\\xa8\\x50\\xc6\\x59\\x86\\x87\\x3c\\xbc\\x26\\x91\\x80\\xe2\\xe8\\x0f\\xf3\\x8c\\x5b\\x7d\\xb2\\xbf\\x88\\x97\\x0c\\xb8\\xdc\\xe1\\xe6\\xa8\\xc2\\x62\\x43\\xe3\\x1c\\x19\\xcc\\xfa\\xd5\\xf3\\xfb\\x07\\xbd\\x96\\xdd\\xeb\\xc5\\x5f\\x68\\xf6\\x78\\x44\\x4e\\x4f\\x49\\x12\\xad\\xd6\\x92\\x2c\\x80\\xc8\\x35\\x95\\xf8\\x2f\\x12\\x44\\xac\\x59\\x1e\\x87\\x6a\\xad\\xa0\\xa0\\xe9\\x6e\\xac\\xb4\\xdf\\x22\\x27\\x15\\x3e\\xa5\\xbe\\xde\\x29\\x3d\\x17\\xd0\\x38\\x5e\\xd0\\xe0\\xc1\\x27\\x4e\\x31\\x24\\xea\\x93\\xcf\\x63\\xb2\\x61\\x51\\x88\\x5a\\x78\\xa5\\xb1\\xe7\\x1b\\x74\\x87\\xde\\xc3\\x33\\xda\\x2d\\x26\\x0d\\x0f\\x47\\x8b\\x33\\x26\\xad\\x2b\\x7d\\x72\\xc5\\x42\\x40\\xa1\\xce\\xef\\x3e\\x69\\x89\\x04\\x0a\\x9d\\x8d\\xde\\xca\\xbc\\x24\\xce\\x15\\xb3\\x77\\x52\\xec\\x78\\xde\\x86\\x16\\x89\\x83\\x92\\x61\\x37\\x83\\x01\\x99\\x51\\xbe\\x1a\\x7b\\x15\\x7d\\x7e\\x50\\x4e\\x13\\xc0\\x12\\x8f\\xfe\\x81\\xb0\\xa9\\x9c\\xa5\\x18\\x90\\xc7\\x89\\xaf\\xee\\xfa\\xad\\x16\\xa0\\x7c\\xfc\\x95\\x3c\\x17\\xd2\\x5b\\xcb\\x24\\x76\\x79\\xd0\\x77\\x37\\x5a\\x45\\xac\\xa2\\x10\\x78\\xdd\\x06\\x57\\x39\\x17\\xb3\\xcb\\xef\\x67\\x2c\\xc8\\xd5\\x03\\x52\\xa9\\x24\\x19\\x1d\\x41\\x82\\x2e\\x2e\\xea\\xb4\\xb5\\xda\\x06\\xaa\\xe3\\x05\\x70\\x03\\x01\\x07\\xaa\\x5a\\xe0\\xc4\\x27\\x0b\\xc6\\x62\\xa0\\xe9\\x7b\\x88\\xbb\\xbb\\x7f\\x8d\\x40\\x2d\\x31\\xe4\\x74\\xeb\\xab\\x46\\xdb\\xeb\\x79\\x9a\\xa4\\x55\\xb3\\x1e\\xfa\\x91\\x4a\\x58\\xed\\x9a\\xf5\\x6b\\x3c\\xac\\x4b\\xfc\\x59\\xb3\\x64\\xd8\\x4c\\x2d\\xc7\\x23\\xb2\\xa9\\x6e\\x1f\\xce\\x0a\\x9a\\xc7\\xf2\\xc6\\xf0\\x72\\x55\\xad\\x59\\x97\\xad\\x5b\\xef\\x0a\\x93\\xc1\\x85\\xa2\\x47\\x88\\x2c\\x62\\xf3\\x46\\x69\\xda\\x67\\xd0\\xe0\\x16\\x89\\xff\\xab\\x31\\x47\\x63\\x95\\xd2\\x85\\x33\\x55\\x15\\xe2\\x28\\x7b\\xc4\\x93\\xa6\\xe3\\x0d\\xc8\\x26\\x64\\x89\\x7b\\xaa\\x9a\\xe0\\x65\\x54\\xae\\x4b\\x3d\\x32\\x55\\x22\\x62\\xa2\\x5b\\xd8\\xc0\\xf6\\xc3\\x1b\\xc8\\x62\\x9c\\x89\\x17\\x91\\xc0\\x81\\xb1\\x6b\\x0f\\x99\\x57\\x4f\\xff\\x9e\\xe6\\xe3\\x3d\\xc0\\xae\\xa5\\x3c\\x7a\\xba\\x2f\\x41\\x6d\\x61\\x91\\x63\\x8e\\xfd\\x9e\\x03\\xdf\\x4d\\xf5\\xa2\\x17\\x52\\x49\\x2b\\xfa\\x9a\\x55\\xcb\\x59\\x40\\xf3\\xe4\\xd4\\x49\\x31\\x24\\x45\\x82\\xc0\\xdf\\x39\\x08\\x55\\xb7\\x1e\\xcb\\x34\\x1c\\x28\\x7c\\xfc\\xf3\\xe2\\xe6\\xda\\x2c\\xf5\\x5b\\x66\\x91\\x36\\x03\\x63\\x05\\x9c\\x2b\\xc7\\xea\\x0c\\xc3\\x16\\xc0\\x39\\xe3\\xaa\\x9d\\x9f\\xab\\x9b\\x7a\\x2a\\x8c\\x2b\\x03\\xe7\\xcc\\x12\\xda\\x71\\xa4\\x55\\x11\\xbb\\x34\\xa8\\xcc\\x3f\\xd1\\x22\\xf4\\xee\\xbe\\x45\\x95\\xbb\\x7b\\xa3\\x8c\\x90\\x94\\x4b\\xd5\\x89\\x72\\xa9\\x8b\\xcc\\xab\\x88\\xc7\\x14\\x6c\\xdd\\xc1\\x2d\\x9c\\x74\\xdf\\x10\\x00\\x61\\x3a\\x49\\x22\\xf2\\x48\\x82\\xb6\\x2b\\x13\\xae\\x0e\\x13\\x16\\x3c\\xfc\\x11\\xa5\\x21\\xc3\\xca\\x34\\xd7\\xbe\\xbb\\xd1\\x86\\x21\\x1c\\x52\\x61\\x77\\x8e\\x75\\xe6\\xa8\\xbf\\x06\\x5c\\xaa\\x37\\x06\\x2d\\x00\\x53\\x00\\x33\\x26\\xcd\\x93\\x05\\x70\\x45\\x2b\\xe9\\x6a\\x52\\x8d\\xbc\\x42\\x49\\x2a\\xdf\\x1a\\x08\\x49\\x6d\\xba\\xce\\x63\\xf2\\xf1\\xee\\x7e\\x64\\xe4\\xa2\\x49\\x58\\x67\\xcb\\x68\\x95\\x73\\x6d\\x2f\\x59\\xe6\\x69\\x60\\x6e\\xd0\\x52\\x9a\\x12\\x5b\\x27\\x2d\\x1a\\x5a\\xd5\\x0c\\xb9\\x56\\xf0\\xf8\\xa2\\x72\\xd5\\xa1\\x4a\\x6a\\xd2\\xd1\\x14\\xcb\\xd8\\x58\\x85\\x4b\\xc3\\x08\\xea\\x49\\xc9\\xc6\\x1c\\x3f\\xa0\\x6a\\x85\\x42\\xe9\\x29\\x23\\x19\\x43\\xcd\\x75\\x08\\x63\\x85\\xb8\\xc2\\x89\\xd6\\x5c\\xad\\xaf\\x68\\x63\\x4b\\x4d\\x6b\\x3e\\x28\\x35\\x3c\\x53\\x90\\x19\\x85\\xc9\\x35\\x60\\xa2\\x2c\\x04\\x48\\xc2\\x96\\x44\\x03\\x16\\x03\\x91\\x1c\\xcc\\x4e\\x01\\x42\\xd1\\xe6\\xdb\\x8d\\x0b\\x7a\\x90\\x63\\xf2\\xa7\\x52\\x0d\\x51\\x28\\x1d\\x3b\\xea\\xc8\\x9a\\xb2\\x67\\x6a\\x62\\x96\\xe6\\x69\\xcc\\x68\\x38\\xf1\\x60\\xa3\\x88\\x37\\xc6\\x9d\\x1a\\x2f\\xbd\\xc4\\xe0\\x9b\\x4b\\x84\\xce\\xb6\\x6c\\x62\\x7e\\x98\\xdf\\x6d\\x04\\xdb\\x83\\xad\\xdd\\x30\\x09\\x24\\x8f\\x0d\\x08\\x3d\\x04\\x94\\xbb\\x95\\x7e\\x05\\x88\\x31\\x92\\x82\\xe2\\xd9\\xef\\x36\\xf9\\xe9\\x17\\x06\\x66\\xab\\x2c\\x9b\\x91\\x67\\x15\\xf6\\x0d\\x5a\\xe1\\xd7\\x4d\\x1a\\x37\\x94\\x79\\x01\\x12\\xbd\\x08\\xaf\\x50\\x3f\\x62\\x7f\\xaa\\x5a\\x7a\\x0e\\x42\\x7d\\x1e\\xcf\\x5e\\xab\\x4a\\x13\\xc9\\x17\\xb1\\xd2\\x90\\xb1\\x8a\\xfa\\xf5\\x82\\x64\\xbf\\x4d\\xaf\\xaf\\xdc\\x7e\\x17\\xb3\\xbd\\xd7\\x88\\x7d\\x8b\\xca\\xe6\\xfb\\xdf\\xa5\\xb9\\xa9\\xfd\\x52\\x3c\\xef\\x2a\\x73\\xf1\\xbe\\x15\\x64\\x1a\\x09\\x2d\\x22\\x2a\\x83\\x45\\xb3\\xe2\\x20\\x58\\xbc\\x01\\xa3\\xed\\xc4\\xa8\\x5b\\x22\\x3c\\xd5\\xb0\\x8b\\x2d\\xf5\\x52\\x52\\x6e\\x76\\xbf\\x85\\x75\\x59\\x37\\xcd\\x83\\x00\\x84\\xf8\\x6a\\xdf\\x76\\x14\\x5e\\x9e\\x5b\\xa7\\x55\\x7c\\x35\\xdf\\x77\\xde\\x1e\\xff\\x79\\x27\\x7f\\x3d\\x52\\x0b\\xee\\x7b\\xac\\xdd\\xbc\\xad\\xb1\\x2f\\x90\\xc5\\xfc\\x85\\xf8\\xbf\\x22\\xba\\x6b\\x48\\x51\\xa6\\x27\\x8c\\x91\\xe5\\xab\\xdc\\x4c\\xbf\\xac\\xcd\\x3b\\x0c\\x79\\x2f\\xba\\x06\\xcd\\x41\\x3e\\xb7\\x25\\x1f\\x15\\xde\\x01\\xd1\\x30\\xa5\\xe4\\x69\\x9c\\xa7\\xf8\\xde\\xb6\\x43\\x1d\\xa7\\xcf\\xe0\\xb6\\xdb\\x92\\xe3\\xb8\\xce\\x5f\\xc7\\xb5\\x41\\xf5\\x06\\x29\\xcf\\x2d\\x71\\x2f\\xb1\\x9d\\x8e\\x3b\\x76\\xb8\\x35\\x0b\\x6b\\x43\\x31\\xe7\\x71\\xed\\x51\\x00\\xaf\\xed\\x67\\x38\\x45\\xb7\\x8c\\xd7\\x89\\x14\\xd4\\x9c\\xb8\\xd1\\xd1\\x53\\x79\\xba\\x42\\xe0\\x9e\\x86\\x25\\x26\\xd6\\xbc\\xd2\\x2d\\xa7\\x99\\x2d\\x97\\x89\\xc5\\xa7\\xa6\\xfa\\x2c\\xa5\\x39\\xa1\\x4d\\x6b\\xdd\\x47\\x65\\x0c\\xfa\\x30\\xbb\\x33\\x36\\x75\\x0b\\xee\\x60\\x45\\x27\\x68\\x9c\\x3e\\x2b\\x97\\x2a\\x45\\x62\\x79\\x63\\x6f\\xe2\\x08\\xe9\\x26\\xde\\xe3\\x1a\\xdd\\xfc\\xf3\\xf2\\xfb\\x85\\x94\\xd9\\x8d\\x81\\xc9\\x03\\x72\\x10\\x24\\x97\\x42\\xd5\\x37\\xb6\\xc9\\x3e\\x46\\x77\\xad\\xc5\\xe2\\x8d\\x37\\x08\\xa8\\x1f\\x76\\x1e\\x57\\xdf\\xee\\xaa\\x61\\x78\\x3e\\xc1\\x5a\\x77\\x5f\\xf1\\x36\\x94\\x3b\\x56\\x7e\\xf1\\x2d\\x6f\\x58\\xfb\\x7c\\x37\\xaa\\x1d\\x4e\\xba\\x8f\\xed\\x7f\\x1a\\xfc\\x60\\xcf\\x7d\\xb0\\x53\\x0e\\x1e\\x33\\xc6\\x25\\xf9\\x4c\\x92\\x11\\xaa\\xf0\\x6f\\x00\\x00\\x00\\xff\\xff\\x3a\\xb5\\x30\\x94\\x78\\x14\\x00\\x00\")\n\nfunc uiTsTypingsMithriljsMithrilDTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsTypingsMithriljsMithrilDTs,\n    \"ui/ts/typings/mithriljs/mithril.d.ts\",\n  )\n}\n\nfunc uiTsTypingsMithriljsMithrilDTs() (*asset, error) {\n  bytes, err := uiTsTypingsMithriljsMithrilDTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/typings/mithriljs/mithril.d.ts\", size: 5240, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\n// Asset loads and returns the asset for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc Asset(name string) ([]byte, error) {\n  cannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n  if f, ok := _bindata[cannonicalName]; ok {\n    a, err := f()\n    if err != nil {\n      return nil, fmt.Errorf(\"Asset %s can't read by error: %v\", name, err)\n    }\n    return a.bytes, nil\n  }\n  return nil, fmt.Errorf(\"Asset %s not found\", name)\n}\n\n// MustAsset is like Asset but panics when Asset would return an error.\n// It simplifies safe initialization of global variables.\nfunc MustAsset(name string) []byte {\n  a, err := Asset(name)\n  if err != nil {\n    panic(\"asset: Asset(\" + name + \"): \" + err.Error())\n  }\n\n  return a\n}\n\n// AssetInfo loads and returns the asset info for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc AssetInfo(name string) (os.FileInfo, error) {\n  cannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n  if f, ok := _bindata[cannonicalName]; ok {\n    a, err := f()\n    if err != nil {\n      return nil, fmt.Errorf(\"AssetInfo %s can't read by error: %v\", name, err)\n    }\n    return a.info, nil\n  }\n  return nil, fmt.Errorf(\"AssetInfo %s not found\", name)\n}\n\n// AssetNames returns the names of the assets.\nfunc AssetNames() []string {\n  names := make([]string, 0, len(_bindata))\n  for name := range _bindata {\n    names = append(names, name)\n  }\n  return names\n}\n\n// _bindata is a table, holding each asset generator, mapped to its name.\nvar _bindata = map[string]func() (*asset, error){\n  \"ui/css/app.css\":                                uiCssAppCss,\n  \"ui/css/graph.css\":                              uiCssGraphCss,\n  \"ui/css/libs/nvd3/1.7.1/nv.d3.min.css\":          uiCssLibsNvd3171NvD3MinCss,\n  \"ui/css/rest_explorer.css\":                      uiCssRest_explorerCss,\n  \"ui/index.html\":                                 uiIndexHtml,\n  \"ui/js/app.js\":                                  uiJsAppJs,\n  \"ui/js/libs/d3/3.3.5/d3.min.js\":                 uiJsLibsD3335D3MinJs,\n  \"ui/js/libs/mithriljs/0.2.0/mithril.min.js\":     uiJsLibsMithriljs020MithrilMinJs,\n  \"ui/js/libs/mithriljs/0.2.0/mithril.min.js.map\": uiJsLibsMithriljs020MithrilMinJsMap,\n  \"ui/js/libs/nvd3/1.7.1/nv.d3.min.js\":            uiJsLibsNvd3171NvD3MinJs,\n  \"ui/ts/app.ts\":                                  uiTsAppTs,\n  \"ui/ts/components/metrics.ts\":                   uiTsComponentsMetricsTs,\n  \"ui/ts/header.ts\":                               uiTsHeaderTs,\n  \"ui/ts/models/node_status.ts\":                   uiTsModelsNode_statusTs,\n  \"ui/ts/models/stats.ts\":                         uiTsModelsStatsTs,\n  \"ui/ts/models/store_status.ts\":                  uiTsModelsStore_statusTs,\n  \"ui/ts/models/timeseries.ts\":                    uiTsModelsTimeseriesTs,\n  \"ui/ts/pages/graph.ts\":                          uiTsPagesGraphTs,\n  \"ui/ts/pages/monitor.ts\":                        uiTsPagesMonitorTs,\n  \"ui/ts/pages/nodes.ts\":                          uiTsPagesNodesTs,\n  \"ui/ts/pages/rest_explorer.ts\":                  uiTsPagesRest_explorerTs,\n  \"ui/ts/pages/stores.ts\":                         uiTsPagesStoresTs,\n  \"ui/ts/tsconfig.json\":                           uiTsTsconfigJson,\n  \"ui/ts/typings/d3/d3.d.ts\":                      uiTsTypingsD3D3DTs,\n  \"ui/ts/typings/jquery/jquery.d.ts\":              uiTsTypingsJqueryJqueryDTs,\n  \"ui/ts/typings/mithriljs/mithril.d.ts\":          uiTsTypingsMithriljsMithrilDTs,\n}\n\n// AssetDir returns the file names below a certain\n// directory embedded in the file by go-bindata.\n// For example if you run go-bindata on data/... and data contains the\n// following hierarchy:\n//     data/\n//       foo.txt\n//       img/\n//         a.png\n//         b.png\n// then AssetDir(\"data\") would return []string{\"foo.txt\", \"img\"}\n// AssetDir(\"data/img\") would return []string{\"a.png\", \"b.png\"}\n// AssetDir(\"foo.txt\") and AssetDir(\"notexist\") would return an error\n// AssetDir(\"\") will return []string{\"data\"}.\nfunc AssetDir(name string) ([]string, error) {\n  node := _bintree\n  if len(name) != 0 {\n    cannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n    pathList := strings.Split(cannonicalName, \"/\")\n    for _, p := range pathList {\n      node = node.Children[p]\n      if node == nil {\n        return nil, fmt.Errorf(\"Asset %s not found\", name)\n      }\n    }\n  }\n  if node.Func != nil {\n    return nil, fmt.Errorf(\"Asset %s not found\", name)\n  }\n  rv := make([]string, 0, len(node.Children))\n  for childName := range node.Children {\n    rv = append(rv, childName)\n  }\n  return rv, nil\n}\n\ntype bintree struct {\n  Func     func() (*asset, error)\n  Children map[string]*bintree\n}\n\nvar _bintree = &bintree{nil, map[string]*bintree{\n  \"ui\": {nil, map[string]*bintree{\n    \"css\": {nil, map[string]*bintree{\n      \"app.css\":   {uiCssAppCss, map[string]*bintree{}},\n      \"graph.css\": {uiCssGraphCss, map[string]*bintree{}},\n      \"libs\": {nil, map[string]*bintree{\n        \"nvd3\": {nil, map[string]*bintree{\n          \"1.7.1\": {nil, map[string]*bintree{\n            \"nv.d3.min.css\": {uiCssLibsNvd3171NvD3MinCss, map[string]*bintree{}},\n          }},\n        }},\n      }},\n      \"rest_explorer.css\": {uiCssRest_explorerCss, map[string]*bintree{}},\n    }},\n    \"index.html\": {uiIndexHtml, map[string]*bintree{}},\n    \"js\": {nil, map[string]*bintree{\n      \"app.js\": {uiJsAppJs, map[string]*bintree{}},\n      \"libs\": {nil, map[string]*bintree{\n        \"d3\": {nil, map[string]*bintree{\n          \"3.3.5\": {nil, map[string]*bintree{\n            \"d3.min.js\": {uiJsLibsD3335D3MinJs, map[string]*bintree{}},\n          }},\n        }},\n        \"mithriljs\": {nil, map[string]*bintree{\n          \"0.2.0\": {nil, map[string]*bintree{\n            \"mithril.min.js\":     {uiJsLibsMithriljs020MithrilMinJs, map[string]*bintree{}},\n            \"mithril.min.js.map\": {uiJsLibsMithriljs020MithrilMinJsMap, map[string]*bintree{}},\n          }},\n        }},\n        \"nvd3\": {nil, map[string]*bintree{\n          \"1.7.1\": {nil, map[string]*bintree{\n            \"nv.d3.min.js\": {uiJsLibsNvd3171NvD3MinJs, map[string]*bintree{}},\n          }},\n        }},\n      }},\n    }},\n    \"ts\": {nil, map[string]*bintree{\n      \"app.ts\": {uiTsAppTs, map[string]*bintree{}},\n      \"components\": {nil, map[string]*bintree{\n        \"metrics.ts\": {uiTsComponentsMetricsTs, map[string]*bintree{}},\n      }},\n      \"header.ts\": {uiTsHeaderTs, map[string]*bintree{}},\n      \"models\": {nil, map[string]*bintree{\n        \"node_status.ts\":  {uiTsModelsNode_statusTs, map[string]*bintree{}},\n        \"stats.ts\":        {uiTsModelsStatsTs, map[string]*bintree{}},\n        \"store_status.ts\": {uiTsModelsStore_statusTs, map[string]*bintree{}},\n        \"timeseries.ts\":   {uiTsModelsTimeseriesTs, map[string]*bintree{}},\n      }},\n      \"pages\": {nil, map[string]*bintree{\n        \"graph.ts\":         {uiTsPagesGraphTs, map[string]*bintree{}},\n        \"monitor.ts\":       {uiTsPagesMonitorTs, map[string]*bintree{}},\n        \"nodes.ts\":         {uiTsPagesNodesTs, map[string]*bintree{}},\n        \"rest_explorer.ts\": {uiTsPagesRest_explorerTs, map[string]*bintree{}},\n        \"stores.ts\":        {uiTsPagesStoresTs, map[string]*bintree{}},\n      }},\n      \"tsconfig.json\": {uiTsTsconfigJson, map[string]*bintree{}},\n      \"typings\": {nil, map[string]*bintree{\n        \"d3\": {nil, map[string]*bintree{\n          \"d3.d.ts\": {uiTsTypingsD3D3DTs, map[string]*bintree{}},\n        }},\n        \"jquery\": {nil, map[string]*bintree{\n          \"jquery.d.ts\": {uiTsTypingsJqueryJqueryDTs, map[string]*bintree{}},\n        }},\n        \"mithriljs\": {nil, map[string]*bintree{\n          \"mithril.d.ts\": {uiTsTypingsMithriljsMithrilDTs, map[string]*bintree{}},\n        }},\n      }},\n    }},\n  }},\n}}\n\n// RestoreAsset restores an asset under the given directory\nfunc RestoreAsset(dir, name string) error {\n  data, err := Asset(name)\n  if err != nil {\n    return err\n  }\n  info, err := AssetInfo(name)\n  if err != nil {\n    return err\n  }\n  err = os.MkdirAll(_filePath(dir, path.Dir(name)), os.FileMode(0755))\n  if err != nil {\n    return err\n  }\n  err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())\n  if err != nil {\n    return err\n  }\n  err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())\n  if err != nil {\n    return err\n  }\n  return nil\n}\n\n// RestoreAssets restores an asset under the given directory recursively\nfunc RestoreAssets(dir, name string) error {\n  children, err := AssetDir(name)\n  // File\n  if err != nil {\n    return RestoreAsset(dir, name)\n  }\n  // Dir\n  for _, child := range children {\n    err = RestoreAssets(dir, path.Join(name, child))\n    if err != nil {\n      return err\n    }\n  }\n  return nil\n}\n\nfunc _filePath(dir, name string) string {\n  cannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n  return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, \"/\")...)...)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Go/gen-go-linguist-thrift.go",
    "content": "// Autogenerated by Thrift Compiler (1.0.0-dev)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage linguist\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"git.apache.org/thrift.git/lib/go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nfunc init() {\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/adapters.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.Adapters\n\nlocal function list_sample = |fabric| {\n  println(\">>> list_sample()\")\n  let carbonCopy = list[]\n  let conf = map[\n    [\"extends\", \"java.util.ArrayList\"],\n    [\"overrides\", map[\n      [\"*\", |super, name, args| {\n        if name == \"add\" {\n          if args: length() == 2 {\n            carbonCopy: add(args: get(1))\n          } else {\n            carbonCopy: add(args: get(1), args: get(2))\n          }\n        }\n        return super: invokeWithArguments(args)\n      }\n    ]]\n  ]]\n  let list = fabric: maker(conf): newInstance()\n  list: add(\"bar\")\n  list: add(0, \"foo\")\n  list: add(\"baz\")\n  println(\"      list: \" + list + \" \" + list: getClass())\n  println(\"carbonCopy: \" + carbonCopy + \" \" + carbonCopy: getClass())\n}\n\nlocal function runnable_sample = |fabric| {\n  println(\">>> runnable_sample\")\n  let result = array[1, 2, 3]\n  let conf = map[\n    [\"interfaces\", [\"java.io.Serializable\", \"java.lang.Runnable\"]],\n    [\"implements\", map[\n      [\"run\", |this| {\n        for (var i = 0, i < result: length(), i = i + 1) {\n          result: set(i, result: get(i) + 10)\n        }\n      }]\n    ]]\n  ]\n  let runner = fabric: maker(conf): newInstance()\n  runner: run()\n  println(\"      result: \" + result: toString())\n  println(\"serializable? \" + (runner oftype java.io.Serializable.class))\n  println(\"    runnable? \" + (runner oftype java.lang.Runnable.class))\n}\n\nfunction main = |args| {\n  let fabric = AdapterFabric()\n  list_sample(fabric)\n  runnable_sample(fabric)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/async.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.AsyncHelpers\n\nimport gololang.Async\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.Executors\n\nlocal function fib = |n| {\n  if n <= 1 {\n    return n\n  } else {\n    return fib(n - 1) + fib(n - 2)\n  }\n}\n\nfunction main = |args| {\n\n  let executor = newCachedThreadPool()\n  println(\"Let's do some useless asynchronous operations...\")\n\n  var f = executor: enqueue({\n    Thread.sleep(1000_L)\n    return 666\n  })\n  f:\n    onSet(|v| -> println(\">>> #slow -> \" + v)): \n    onFail(|e| -> println(\">>> #fail -> \" + e))\n  f:\n    cancel(true)\n\n  f = executor: enqueue({\n    Thread.sleep(1000_L)\n    return 666\n  })\n  f:\n    onSet(|v| -> println(\">>> #ok -> \" + v)): \n    onFail(|e| -> println(\">>> #wtf? -> \" + e))\n\n  let fib_10 = promise()\n  let fib_20 = promise()\n  let fib_30 = promise()\n  let fib_40 = promise()\n\n  let futures = [\n    fib_10: future(), fib_20: future(), \n    fib_30: future(), fib_40: future()\n  ]\n\n  executor: submit(-> fib_10: set(fib(10)))\n  executor: submit(-> fib_20: set(fib(20)))\n  executor: submit(-> fib_30: set(fib(30)))\n  executor: submit(-> fib_40: set(fib(40)))\n\n  all(futures): onSet(|results| -> println(\">>> Fibs: \" + results))\n\n  let truth = promise()\n  truth: \n    future(): \n    map(|v| -> \"truth=\" + v): \n    onSet(|v| -> executor: submit(-> println(\">>> (another thread) \" + v))):\n    onSet(|v| -> println(\">>> (same thread) \" + v))\n  executor: submit({\n    Thread.sleep(500_L)\n    truth: set(42)\n  })\n  \n  Thread.sleep(1000_L)\n  executor: shutdown()\n  executor: awaitTermination(2_L, SECONDS())\n  println(\"Bye!\")\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/augmentations.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.Augmentations\n\nimport java.util.LinkedList\n\naugment java.util.List {\n  function with = |this, value| {\n    this: add(value)\n    return this\n  }\n}\n\naugment java.util.Collection {\n  function doToEach = |this, func| {\n    foreach (element in this) {\n      func(element)\n    }\n  }\n}\n\nfunction main = |args| {\n  let list = LinkedList(): with(\"foo\"): with(\"bar\"): with(\"baz\")\n  list: doToEach(|value| -> println(\">>> \" + value))\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/closures.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule Closures\n\nlocal function sayHello = |who| -> \"Hello \" + who + \"!\"\n\nfunction main = |args| {\n  let adder = |a, b| -> a + b\n  println(adder: invokeWithArguments(1, 2))\n  println(adder(1, 2))\n\n  let addToTen = adder: bindTo(10)\n  println(addToTen: invokeWithArguments(2))\n  println(addToTen(2))\n\n  let adding = |x| -> |y| -> adder(x, y)\n  let addingTen = adding(10)\n  println(addingTen(4))\n  println(adding(2)(4))\n\n  println(sayHello(\"Julien\"))\n\n  let list = java.util.LinkedList()\n  let pump_it = {\n    list: add(\"I heard you say\")\n    list: add(\"Hey!\")\n    list: add(\"Hey!\")\n  }\n  pump_it()\n  println(list)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/coin-change.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule CoinChange\n\nimport java.util.LinkedList\n\nfunction change = |money, coins| -> match {\n  when money == 0 then 1\n  when (money < 0) or (coins: isEmpty()) then 0\n  otherwise change(money - coins: head(), coins) + change(money, coins: tail())\n}\n\nfunction main = |args| {\n  let coins = LinkedList(): append(1, 2, 5, 10, 20)\n  println(\"Coins: \" + coins)\n  println(\"0: \" + change(0, coins))\n  println(\"1: \" + change(1, coins))\n  println(\"2: \" + change(2, coins))\n  println(\"10: \" + change(10, coins))\n  println(\"12: \" + change(12, coins))\n  println(\"6: \" + change(6, coins))\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/collection-literals.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.CollectionLiterals\n\nlocal function play_with_tuples = {\n  let hello = [\"Hello\", \"world\", \"!\"]\n  foreach str in hello {\n    print(str + \" \")\n  }\n  println(\"\")\n\n  println(hello: get(0) + \"-\" + hello: get(1) + \"-\" + hello: get(2))\n\n  println(hello: join(\"/\"))\n}\n\nlocal function play_with_literals = {\n  let data = [\n    [1, 2, 3],\n    tuple[1, 2, 3],\n    array[1, 2, 3],\n    set[1, 2, 3, 3, 1],\n    map[\n      [\"a\", 10],\n      [\"b\", 20]\n    ],\n    vector[1, 2, 3],\n    list[1, 2, 3]\n  ]\n\n  data: each(|element| {\n    println(element: toString())\n    println(\"  type: \" + element: getClass())\n  })\n}\n\nfunction main = |args| {\n  println(\">>> Literals\")\n  play_with_literals()\n  println(\"\\n>>> Tuples\")\n  play_with_tuples()\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/context-decorator.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.ContextDecorator\n\nimport gololang.Decorators\n\nlet myContext = defaultContext():\n  count(0):\n  define(\"entry\", |this, args| {\n    this: count(this: count() + 1)\n    println(\"hello:\" + this: count())\n    return args\n  }):\n  define(\"exit\", |this, result| {\n    require(result >= 3, \"wrong value\")\n    println(\"goobye\")\n    return result\n  }):\n  define(\"catcher\", |this, e| {\n    println(\"Caught \" + e)\n    throw e\n  }):\n  define(\"finallizer\", |this| {println(\"do some cleanup\")})\n\n\n@withContext(myContext)\nfunction foo = |a, b| {\n  println(\"Hard computation\")\n  return a + b\n}\n\nfunction main = |args| {\n  println(foo(1,2))\n  println(\"====\")\n  println(withContext(myContext)(|a| -> 2*a)(3))\n  println(\"====\")\n  try {\n    println(foo(1, 1))\n  } catch (e) { }\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/decorators.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.Decorators\n\nimport java.util.LinkedList\n\nfunction simple_decorator = |func| {\n  return |a,b| -> func(a+1,b+1)\n}\n\n@simple_decorator\nfunction simple_adder = |x,y| -> x + y\n\nfunction decorator_with_params = |param1, param2|{\n  return |func| {\n    return |a,b| -> func(a+param1,b+param2)\n  }\n}\n\n@decorator_with_params(10,2)\nfunction parametrized_adder = |x,y| -> x + y\n\nfunction generic_decorator = |func| {\n  return |args...| {\n    println(\"number of params : \"+args: length())\n    return func: invokeWithArguments(args)\n  }\n}\n\n@generic_decorator\nfunction generic_adder0 = -> 42\n\n@generic_decorator\nfunction generic_adder1 = |x| -> x\n\n@generic_decorator\nfunction generic_adder2 = |x,y| -> x + y\n\n@generic_decorator\nfunction generic_adder3 = |x,y,z| -> x + y + z\n\nfunction list_sum_decorator = |func| {\n    return |this| -> func(this) - 8\n}\n\naugment java.util.List {\n\n  @list_sum_decorator\n  function sum = |this| {\n    var acc = 0\n    foreach elem in this {\n        acc = acc + elem\n    }\n    return acc\n  }\n}\n\nfunction main = |args| {\n  println(simple_adder(10,30))\n  println(parametrized_adder(10,20))\n  println(generic_adder0())\n  println(generic_adder1(42))\n  println(generic_adder2(20,22))\n  println(generic_adder3(10,12,20))\n  let list = LinkedList()\n  list: add(5)\n  list: add(10)\n  list: add(15)\n  list: add(20)\n  println(list: sum())\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/dynamic-evaluation.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.DynamicEvaluation\n\nimport gololang.EvaluationEnvironment\n\nlocal function test_asModule = |env| {\n  let code =\n\"\"\"\nmodule foo\n\nfunction a = -> \"a!\"\nfunction b = -> \"b!\"\n\"\"\"\n  let mod = env: asModule(code)\n  let a = fun(\"a\", mod)\n  let b = fun(\"b\", mod)\n  println(\">>> asModule()\")\n  println(a())\n  println(b())\n}\n\nlocal function test_anonymousModule = |env| {\n  let code =\n\"\"\"\nfunction a = -> \"a.\"\nfunction b = -> \"b.\"\n\"\"\"\n  let mod = env: anonymousModule(code)\n  let a = fun(\"a\", mod)\n  let b = fun(\"b\", mod)\n  println(\">>> anonymousModule()\")\n  println(a())\n  println(b())\n}\n\nlocal function test_asFunction = |env| {\n  let code = \"return (a + b) * 2\"\n  let f = env: asFunction(code, \"a\", \"b\")\n  println(\">>> asFunction\")\n  println(f(10, 20))\n}\n\nlocal function test_def = |env| {\n  let code = \"|a, b| -> (a + b) * 2\"\n  let f = env: def(code)\n  println(\">>> def\")\n  println(f(10, 20))\n}\n\nlocal function test_run = |env| {\n  let code = \"\"\"println(\">>> run\")\n  foreach (i in range(0, 3)) {\n    println(\"w00t\")\n  }\"\"\"\n  env: run(code)\n}\n\nlocal function test_run_map = |env| {\n  let code = \"\"\"println(\">>> run_map\")\n  println(a)\n  println(b)\n  \"\"\"\n  let values = java.util.TreeMap(): add(\"a\", 1): add(\"b\", 2)\n  env: run(code, values)\n}\n\nfunction main = |args| {\n  let env = EvaluationEnvironment()\n  test_asModule(env)\n  test_anonymousModule(env)\n  test_asFunction(env)\n  test_def(env)\n  test_run(env)\n  test_run_map(env)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/dynamic-object-person.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.DynamicObjectPerson\n\nlocal function mrbean = -> DynamicObject():\n  name(\"Mr Bean\"):\n  email(\"mrbean@gmail.com\"):\n  define(\"toString\", |this| -> this: name() + \" <\" + this: email() + \">\")\n\nfunction main = |args| {\n\n  let bean = mrbean()\n  println(bean: toString())\n\n  bean: email(\"mrbean@outlook.com\")\n  println(bean: toString())\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/echo-args.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule EchoArgs\n\nfunction main = |args| {\n  \n  println(\"With a for loop and an index:\")\n  for (var i = 0, i < args: length(), i = i + 1) {\n    println(\"  #\" + i + \" -> \" + args: get(i))\n  }\n\n  println(\"With a foreach loop:\")\n  foreach arg in args {\n    println(\"  \" + arg)\n  }\n\n  println(\"With a foreach over a range:\")\n  foreach i in range(0, args: length()) {\n    println(\"  #\" + i + \" -> \" + args: get(i))\n  }\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/enums-thread-state.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule sample.EnumsThreadState\n\nimport java.lang.Thread$State\n\nfunction main = |args| {\n\n  # Call the enum entry like a function\n  let new = Thread$State.NEW()\n  println(\"name=\" + new: name() + \", ordinal=\" + new: ordinal())\n  println(\"-----------\")\n\n  # Walk through all enum entries\n  foreach element in Thread$State.values() {\n    println(\"name=\" + element: name() + \", ordinal=\" + element: ordinal())\n  }\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/fibonacci.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.Fibonacci\n\nimport java.lang.System\n\nfunction fib = |n| {\n  if n <= 1 {\n    return n\n  } else {\n    return fib(n - 1) + fib(n - 2)\n  }\n}\n\nlocal function run = {\n  let start = System.currentTimeMillis()\n  let result = fib(40)\n  let duration = System.currentTimeMillis() - start\n  println(\">>> \" + result + \" (took \" + duration + \"ms)\")\n}\n\nfunction main = |args| {\n  while true {\n    run()\n  }\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/helloworld.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule hello.World\n\nfunction main = |args| {\n  println(\"Hello world!\")\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/http-server.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.WebServer\n\nimport java.lang\nimport java.net.InetSocketAddress\nimport com.sun.net.httpserver\nimport com.sun.net.httpserver.HttpServer\n\nfunction main = |args| {\n\n  let server = HttpServer.create(InetSocketAddress(\"localhost\", 8081), 0)\n  \n  server: createContext(\"/\", |exchange| {\n    let headers = exchange: getResponseHeaders()\n    let response = StringBuilder():\n      append(\"Requested URI: \"):\n      append(exchange: getRequestURI()):\n      append(\"\\n\"):\n      append(\"Current time: \"):\n      append(java.util.Date()):\n      append(\"\\n\"):\n      toString()\n    headers: set(\"Content-Type\", \"text/plain\")\n    exchange: sendResponseHeaders(200, response: length())\n    exchange: getResponseBody(): write(response: getBytes())\n    exchange: close()\n  })\n\n  server: createContext(\"/shutdown\", |exchange| {\n    let response = \"Ok, thanks, bye!\"\n    exchange: getResponseHeaders(): set(\"Content-Type\", \"text/plain\")\n    exchange: sendResponseHeaders(200, response: length())\n    exchange: getResponseBody(): write(response: getBytes())\n    exchange: close()\n    server: stop(5)\n  })\n\n  server: start()\n  println(\">>> http://localhost:8081/\")\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/logdeco.golo",
    "content": "\nmodule samples.LogDeco\n\nfunction log1 = |msg| {\n    return |fun| {\n        return |args...| {\n            println(msg)\n            return fun: invokeWithArguments(args)\n        }\n    }\n}\n\n@log1(\"calling foo\")\nfunction foo = |a| {\n    println(\"foo got a \" + a)\n}\n\n@log1(\"I'am a bar\")\nfunction bar = |a| -> 2*a\n\nlet sayHello = log1(\"Hello\")\n\n@sayHello\nfunction baz = -> \"Goodbye\"\n\nfunction log2 = |msgBefore| -> |msgAfter| -> |func| -> |args...| {\n    println(msgBefore)\n    let res = func: invokeWithArguments(args)\n    println(msgAfter)\n    return res\n}\n\n@log2(\"enter foo\")(\"exit foo\")\nfunction spam = |a| {\n    println(\"foo: \" + a)\n}\n\nfunction logEnterExit = |name| -> log2(\"# enter \" + name)(\"# exit \" + name)\n\n@logEnterExit(\"bar\")\nfunction egg = { println(\"doing something...\") }\n\nfunction main = |args| {\n\n    foo(\"bar\")\n    \n    println(\"---\")\n    println(bar(21))\n    \n    println(\"---\")\n    println(baz())\n\n    println(\"---\")\n    spam(\"bar\")\n\n    println(\"---\")\n    egg()\n\n    println(\"---\")\n    let strange_use = log2(\"hello\")(\"goodbye\")({println(\":p\")})\n    strange_use()\n\n    println(\"---\")\n    log2(\"another\")(\"use\")(|a|{println(a)})(\"strange\")\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/matching-operator.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule Matching\n\nimport java.util.LinkedList\n\nlocal function data = {\n  let list = LinkedList()\n  list: add(\"foo@bar.com\")\n  list: add(\"+33.6.11.22.33\")\n  list: add(\"http://golo-lang.org/\")\n  list: add(\"def foo = bar(_._) with :> T\")\n  return list\n}\n\nlocal function what_it_could_be = |item| -> match {\n  when item: contains(\"@\") then \"an email?\"\n  when item: startsWith(\"+33\") then \"a French phone number?\"\n  when item: startsWith(\"http://\") then \"a website URL?\"\n  otherwise \"I have no clue, mate!\"\n}\n\nfunction main = |args| {\n  foreach item in data() {\n    println(item + \" => \" + what_it_could_be(item))\n  }\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/max-int.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.MaxInt\n\nlocal function max_int = {\n  return java.lang.Integer.MAX_VALUE()\n}\n\nfunction main = |args| {\n  println(max_int())\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/memoize.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.MemoizeDecorator\n\nimport gololang.Decorators\n\nimport java.lang.System\n\nlet memo = memoizer()\n\n@memo\nfunction fib = |n| {\n  if n <= 1 {\n    return n\n  } else {\n    return fib(n - 1) + fib(n - 2)\n  }\n}\n\n@memo\nfunction foo = |n| -> n\n\nlocal function run = {\n  let start = System.currentTimeMillis()\n  let result = fib(40)\n  let duration = System.currentTimeMillis() - start\n  println(\">>> fib(40) = \" + result + \" (took \" + duration + \"ms)\")\n}\n\nlocal function run2 = {\n  let start = System.currentTimeMillis()\n  let result = foo(40)\n  let duration = System.currentTimeMillis() - start\n  println(\">>> foo(40) = \" + result + \" (took \" + duration + \"ms)\")\n}\n\nfunction main = |args| {\n  foreach i in range(0, 5) {\n    println(\"run \" + i)\n    run()\n    run2()\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/null-safety.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule DealingWithNull\n\nimport java.util\n\nfunction main = |args| {\n\n  # Data model\n  let contacts = map[\n    [\"mrbean\", map[\n      [\"email\", \"bean@gmail.com\"],\n      [\"url\", \"http://mrbean.com\"]\n    ]],\n    [\"larry\", map[\n      [\"email\", \"larry@iamricherthanyou.com\"]\n    ]]\n  ]\n\n  # MrBean and Larry\n  let mrbean = contacts: get(\"mrbean\")\n  let larry = contacts: get(\"larry\")\n  \n  # Illustrates orIfNull\n  println(mrbean: get(\"url\") orIfNull \"n/a\")\n  println(larry: get(\"url\") orIfNull \"n/a\")\n\n  # Querying a non-existent data model because there is no 'address' entry\n  println(mrbean: get(\"address\")?: street()?: number() orIfNull \"n/a\")\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/prepost-decorators.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.PrepostDecorator\n\nimport gololang.Decorators\n\nlet isInteger = isOfType(Integer.class)\n\n@checkResult(isString(): andThen(lengthIs(2)))\n@checkArguments(isInteger: andThen(isPositive()), isString())\nfunction foo = |a, b| {\n    return b + a\n}\n\nlet myCheck = checkArguments(isInteger: andThen(isPositive()))\n\n@myCheck\nfunction inv = |v| -> 1.0 / v\n\nlet isPositiveInt = isInteger: andThen(isPositive())\n\n@checkArguments(isPositiveInt)\nfunction mul = |v| -> 10 * v\n\n@checkArguments(isNumber())\nfunction num = |v| -> \"ok\"\n\n@checkArguments(isNotNull())\nfunction notnull = |v| -> \"ok\"\n\nfunction main = |args| {\n    try { println(foo(1, \"b\")) } catch (e) { println(e) }\n    try { println(foo(-1, \"b\")) } catch (e) { println(e) }\n    try { println(foo(\"a\", 2)) } catch (e) { println(e) }\n    try { println(foo(1, 2)) } catch (e) { println(e) }\n    try { println(foo(10, \"ab\")) } catch (e) { println(e) }\n\n    try { println(inv(10)) } catch (e) { println(e) }\n    try { println(inv(0)) } catch (e) { println(e) }\n\n    try { println(mul(5)) } catch (e) { println(e) }\n    try { println(mul(0)) } catch (e) { println(e) }\n\n    try { println(num(1)) } catch (e) { println(e) }\n    try { println(num(1_L)) } catch (e) { println(e) }\n    try { println(num(1.5)) } catch (e) { println(e) }\n    try { println(num(1.5_F)) } catch (e) { println(e) }\n    try { println(num(\"a\")) } catch (e) { println(e) }\n    try { println(num('a')) } catch (e) { println(e) }\n\n    try { println(notnull('1')) } catch (e) { println(e) }\n    try { println(notnull(null)) } catch (e) { println(e) }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/structs.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule StructDemo\n\nstruct Point = { x, y }\n\naugment StructDemo.types.Point {\n\n  function move = |this, offsetX, offsetY| {\n    this: x(this: x() + offsetX)\n    this: y(this: y() + offsetY)\n    return this\n  }\n\n  function relative = |this, offsetX, offsetY| -> Point(this: x() + offsetX, this: y() + offsetY)\n}\n\nfunction main = |args| {\n  \n  let p1 = Point(1, 2)\n  let p2 = Point(): x(1): y(2)\n  let p3 = p1: frozenCopy()\n  let p4 = p1: frozenCopy()\n\n  println(p1)\n  println(\"x = \" + p1: x())\n  println(\"y = \" + p1: y())\n\n  println(\"p1 == p2 \" + (p1 == p2))\n  println(\"p1 == p3 \" + (p1 == p3))\n  println(\"p3 == p4 \" + (p3 == p4))\n\n  println(\"#p1 \" + p1: hashCode())\n  println(\"#p2 \" + p2: hashCode())\n  println(\"#p3 \" + p3: hashCode())\n  println(\"#p4 \" + p4: hashCode())\n\n  println(\"p1: members() \" + p1: members())\n  println(\"p1: values() \" + p1: values())\n  foreach item in p1 {\n    println(item: get(0) + \" -> \" + item: get(1))\n  }\n\n  println(\"p1: set(\\\"x\\\", 10) \" + p1: set(\"x\", 10))\n  println(\"p1: move(10, 5) \" + p1: move(10, 5))\n  println(\"p1: relative(11, 6) \" + p1: relative(11, 6))\n\n  let p5 = ImmutablePoint(10, 20)\n  println(\"p5: \" + p5)\n  try {\n    p5: x(100)\n  } catch (expected) {\n    println(\"p5 is immutable, so... \" + expected: getMessage())\n  }\n}\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/swing-actionlistener.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.SwingActionListener\n\nimport java.awt.event\nimport javax.swing\nimport javax.swing.WindowConstants\n\nlocal function listener = |handler| -> asInterfaceInstance(ActionListener.class, handler)\n\nfunction main = |args| {\n\n  let frame = JFrame(\"Action listeners\")\n  frame: setDefaultCloseOperation(EXIT_ON_CLOSE())\n\n  let button = JButton(\"Click me!\")\n  button: setFont(button: getFont(): deriveFont(96.0_F))\n\n  # Using a helper function\n  button: addActionListener(listener(|event| -> println(\"Clicked!\")))\n\n  # Using a standard augmentation: MethodHandle::to(Class)\n  button: addActionListener((|event| -> println(\"[click]\")): to(ActionListener.class))\n\n  # Straight closure passing\n  button: addActionListener(|event| -> println(\"( )\"))\n\n  frame: getContentPane(): add(button)\n  frame: pack()\n  frame: setVisible(true)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/swing-helloworld.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.SwingHelloWorld\n\nimport javax.swing\nimport javax.swing.WindowConstants\n\nfunction main = |args| {\n\n  let frame = JFrame(\"Hello world\")\n  frame: setDefaultCloseOperation(EXIT_ON_CLOSE())\n\n  let label = JLabel(\"Hello world\")\n  label: setFont(label: getFont(): deriveFont(128.0_F))\n\n  frame: getContentPane(): add(label)\n  frame: pack()\n  frame: setVisible(true)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/templates-chat-webapp.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.TemplatesChatWebapp\n\nimport java.lang\nimport java.io\nimport java.net.InetSocketAddress\nimport com.sun.net.httpserver\nimport com.sun.net.httpserver.HttpServer\n\nlocal function redirect = |exchange, to| {\n  exchange: getResponseHeaders(): set(\"Location\", to)\n  exchange: sendResponseHeaders(303, 0)\n  exchange: close()\n}\n\nlocal function respond = |exchange, body| {\n  exchange: getResponseHeaders(): set(\"Content-Type\", \"text/html\")\n  exchange: sendResponseHeaders(200, body: length())\n  exchange: getResponseBody(): write(body: getBytes())\n  exchange: close()\n}\n\n# This is leaky and works with just 1 POST parameter...\nlocal function extract_post = |exchange, posts| {\n  let reader = BufferedReader(InputStreamReader(exchange: getRequestBody()))\n  var line = reader: readLine()\n  while line isnt null {\n    if line: startsWith(\"msg=\") {\n      posts: add(java.net.URLDecoder.decode(line: substring(4), \"UTF-8\"))\n    }\n    line = reader: readLine()\n  }\n  reader: close()\n}\n\n\nlocal function index = |posts, template, exchange| {\n  if exchange: getRequestMethod() == \"POST\" {\n    extract_post(exchange, posts)\n    redirect(exchange, \"/\")\n  } else {\n    respond(exchange, template(posts))\n  }\n}\n\nlocal function index_template = -> \"\"\"\n<%@params posts %>\n<!DOCTYPE html>\n<html>\n  <head>\n    <title>Golo Chat</title>\n  </head>\n  <body>\n  <form action=\"/\" method=\"post\">\n    <input type=\"text\" name=\"msg\">\n    <input type=\"submit\" value=\"Send\">\n  </form>\n  <div>\n    <h3>Last posts</h3>\n    <% foreach post in posts { %>\n      <div>\n        <%= post %>\n      </div>\n    <% } %>\n  </div>\n  </body>\n</html>\n\"\"\"\n\nfunction main = |args| {\n  let index_tpl = gololang.TemplateEngine(): compile(index_template())\n  let posts = java.util.concurrent.ConcurrentLinkedDeque()\n  let server = HttpServer.create(InetSocketAddress(\"localhost\", 8081), 0)\n  server: createContext(\"/\", ^index: bindTo(posts): bindTo(index_tpl))\n  server: start()\n  println(\">>> http://localhost:8081/\")\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/util-containers.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule MoreCoolContainers\n\nfunction main = |args| {\n  \n  println(\">>> DynamicVariable\")\n\n  let dyn = DynamicVariable(\"Foo\")\n  println(dyn: value())\n  \n  let t1 = Thread({\n  dyn: withValue(666, {\n      println(dyn: value())\n    })\n  })\n  \n  let t2 = Thread({\n    dyn: withValue(69, {\n      println(dyn: value())\n    })\n  })\n\n  t1: start()\n  t2: start()\n  t1: join()\n  t2: join()\n  println(dyn: value())\n\n  println(\">>> Observable\")\n\n  let foo = Observable(\"Foo\")\n  foo: onChange(|v| -> println(\"foo = \" + v))\n\n  let mapped = foo: map(|v| -> v + \"!\")\n  mapped: onChange(|v| -> println(\"mapped = \" + v))\n  \n  foo: set(\"69\")\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Golo/workers.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule Workers\n\nimport java.lang.Thread\nimport java.util.concurrent\nimport gololang.concurrent.workers.WorkerEnvironment\n\nlocal function pusher = |queue, message| -> queue: offer(message)\n\nlocal function generator = |port, message| {\n  foreach i in range(0, 100) {\n    port: send(message)\n  }\n}\n\nfunction main = |args| {\n\n  let env = WorkerEnvironment.builder(): withFixedThreadPool()\n  let queue = ConcurrentLinkedQueue()\n\n  let pusherPort = env: spawn(^pusher: bindTo(queue))\n  let generatorPort = env: spawn(^generator: bindTo(pusherPort))\n\n  let finishPort = env: spawn(|any| -> env: shutdown())\n\n  foreach i in range(0, 10) {\n    generatorPort: send(\"[\" + i + \"]\")\n  }\n  Thread.sleep(2000_L)\n  finishPort: send(\"Die!\")\n\n  env: awaitTermination(2000)\n  println(queue: reduce(\"\", |acc, next| -> acc + \" \" + next))\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gosu/Hello.gst",
    "content": "<%!-- defined in Hello.gst --%>\n\n<%@ params( users : Collection <User> ) %>\n\n<%  for( user in users ) { %>\n\n${user.LastName}, ${user.FirstName}, ${user.Department}  <%  } %>"
  },
  {
    "path": "src/test/resources/samples/langs/Gosu/Hello.gsx",
    "content": "package example\n\nenhancement Hello : String {\n\n  function toPerson() : Person {\n     var vals = this.split(\",\")\n     return new Person( vals[0], vals[1] as int, Relationship.valueOf( vals[2] ) ) )\n  }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Gosu/Person.gs",
    "content": "package example\n\nuses java.util.*\n\nuses java.io.File\n\nclass Person extends Contact implements IEmailable {\n\n  var _name : String\n  var _age : Integer as Age \n  var _relationship : Relationship as readonly RelationshipOfPerson\n\n  delegate _emailHelper represents IEmailable\n\n  enum Relationship {\n    FRIEND,\n    FAMILY,\n    BUSINESS_CONTACT\n  }\n\n  // Map of names to people\n  static var ALL_PEOPLE = new HashMap<String, Person>()\n\n  /* Constructs a new Person */\n  construct( name : String, age : Integer, relationship : Relationship ) {\n    _name = name\n    _age = age\n    _relationship = relationship\n    _emailHelper = new EmailHelper( this )\n  }\n\n  property get Name():String{\n    return _name\n  }\n\n  property set Name(name : String){\n    _name = name\n  }\n\n  /* Implement IEmailable#getEmailName() */\n  override function getEmailName():String{\n    return Name\n  }\n\n  function incrementAge() {\n    _age++\n  }\n\n  @Deprecated\n  function printPersonInfo() {\n    print( \"Person { Name : ${Name}, Age : ${Age}, Relationship : ${RelationshipOfPerson} }\" )\n  }\n\n  static function addPerson(p : Person){\n    if(ALL_PEOPLE.containsKey(p?.Name)) {\n      throw new IllegalArgumentException( \"There is already someone named '${p.Name}'.\" )\n    }\n    ALL_PEOPLE[p.Name] = p\n  }\n\n  static function addAllPeople( contacts : List<Contact> ) {\n    for( contact in contacts ) {\n      if( contact typeis Person and not ALL_PEOPLE.containsKey( contact.Name )) {\n        addPerson( contact )\n      }\n    }\n  }\n\n  static function getAllPeopleOlderThanNOrderedByName( age : int ) {\n    var allPeople = ALL_PEOPLE.Values\n\n    return allPeople.where( \\ p -> p.Age > age ).orderBy( \\ p -> p.Name )\n  }\n\n  static function loadPersonFromDB( id : Integer ) {\n    using( var conn = DBConnectionManager.getConnection(),\n      var stmt = conn.prepareStatement( \"SELECT name, age, relationship FROM PEOPLE WHERE ID=?\") ){\n\n      stmt.setInt( 0, 0 )\n      var result = stmt.executeQuery()\n      if( result.next() ) {\n         addPerson( new Person( result.getString( \"name\" ),\n                    result.getInt( \"age\" ),\n                    Relationship.valueOf( result.getString( \"relationship\" ) ) ) )\n\n      }\n    }\n  }\n\n  /* Loads in people from a CSV */\n  static function loadFromFile( file : File ) {\n    file.eachLine( \\ line -> {\n      if( line.HasContent ) {\n        addPerson( line.toPerson() )\n      }\n    })\n  }\n\n  /* Save people to a CSV */\n  static function saveToFile( file : File ) {\n    using( var writer = new FileWriter( file ) ) {\n      print( PersonCSVTemplate.renderToString( ALL_PEOPLE.Values ) )\n      PersonCSVTemplate.render( writer, ALL_PEOPLE.Values )\n    }\n  }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Gosu/Ronin.gs",
    "content": "/**\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n */\n\npackage ronin\n\nuses gw.util.concurrent.LockingLazyVar\nuses gw.lang.reflect.*\nuses java.lang.*\nuses java.io.*\nuses ronin.config.*\nuses org.slf4j.*\n\n/**\n *  The central location for Ronin utility methods.  Controllers and templates should generally access the\n *  methods and properties they inherit from {@link ronin.IRoninUtils} instead of using the methods and\n *  properties here.\n */\nclass Ronin {\n\n  // One static field to rule the all...\n  static var _CONFIG : IRoninConfig as Config\n\n  // And one thread local to bind them\n  static var _CURRENT_REQUEST = new ThreadLocal<RoninRequest>();\n\n  // That's inconstructable\n  private construct() {}\n\n  internal static function init(servlet : RoninServlet, m : ApplicationMode, src : File) {\n    if(_CONFIG != null) {\n      throw \"Cannot initialize a Ronin application multiple times!\"\n    }\n    var cfg = TypeSystem.getByFullNameIfValid(\"config.RoninConfig\")\n    var defaultWarning = false\n    if(cfg != null) {\n      var ctor = cfg.TypeInfo.getConstructor({ronin.config.ApplicationMode, ronin.RoninServlet})\n      if(ctor == null) {\n        throw \"config.RoninConfig must have a constructor with the same signature as ronin.config.RoninConfig\"\n      }\n      _CONFIG = ctor.Constructor.newInstance({m, servlet}) as IRoninConfig\n    } else {\n      _CONFIG = new DefaultRoninConfig(m, servlet)\n      defaultWarning = true\n    }\n    var roninLogger = TypeSystem.getByFullNameIfValid(\"ronin.RoninLoggerFactory\")\n    if(roninLogger != null) {\n      roninLogger.TypeInfo.getMethod(\"init\", {ronin.config.LogLevel}).CallHandler.handleCall(null, {LogLevel})\n    }\n    if(defaultWarning) {\n      log(\"No configuration was found at config.RoninConfig, using the default configuration...\", :level=WARN)\n    }\n    Quartz.maybeStart()\n    ReloadManager.setSourceRoot(src)\n  }\n\n  internal static property set CurrentRequest(req : RoninRequest) {\n    _CURRENT_REQUEST.set(req)\n  }\n\n  //============================================\n  // Public API\n  //============================================\n\n  /**\n   *  The trace handler for the current request.\n   */\n  static property get CurrentTrace() : Trace {\n    return CurrentRequest?.Trace\n  }\n\n  /**\n   *  Ronin's representation of the current request.\n   */\n  static property get CurrentRequest() : RoninRequest {\n    return _CURRENT_REQUEST.get()\n  }\n\n  /**\n   *  The mode in which this application is running.\n   */\n  static property get Mode() : ApplicationMode {\n    return _CONFIG?.Mode ?: TESTING\n  }\n\n  /**\n   *  The log level at and above which log messages should be displayed.\n   */\n  static property get LogLevel() : LogLevel {\n    return _CONFIG?.LogLevel ?: DEBUG\n  }\n\n  /**\n   *  Whether or not to display detailed trace information on each request.\n   */\n  static property get TraceEnabled() : boolean {\n    return _CONFIG != null ? _CONFIG.TraceEnabled : true\n  }\n\n  /**\n   *  The default controller method to call when no method name is present in the request URL.\n   */\n  static property get DefaultAction() : String {\n    return _CONFIG?.DefaultAction\n  }\n\n  /**\n   *  The default controller to call when no controller name is present in the request URL.\n   */\n  static property get DefaultController() : Type {\n    return _CONFIG?.DefaultController\n  }\n\n  /**\n   *  The servlet responsible for handling Ronin requests.\n   */\n  static property get RoninServlet() : RoninServlet {\n    return _CONFIG?.RoninServlet\n  }\n\n  /**\n   *  The handler for request processing errors.\n   */\n  static property get ErrorHandler() : IErrorHandler {\n    return _CONFIG?.ErrorHandler\n  }\n\n  /**\n   *  The custom handler for logging messages.\n   */\n  static property get LogHandler() : ILogHandler {\n    return _CONFIG?.LogHandler\n  }\n\n  /**\n   *  Logs a message using the configured log handler.\n   *  @param msg The text of the message to log, or a block which returns said text.\n   *  @param level (Optional) The level at which to log the message.\n   *  @param component (Optional) The logical component from whence the message originated.\n   *  @param exception (Optional) An exception to associate with the message.\n   */\n  static function log(msg : Object, level : LogLevel = null, component : String = null, exception : java.lang.Throwable = null) {\n    if(level == null) {\n      level = INFO\n    }\n    if(LogLevel <= level) {\n      var msgStr : String\n      if(msg typeis block():String) {\n        msgStr = (msg as block():String)()\n      } else {\n        msgStr = msg as String\n      }\n      if(_CONFIG?.LogHandler != null) {\n        _CONFIG.LogHandler.log(msgStr, level, component, exception)\n      } else {\n        switch(level) {\n          case TRACE:\n            LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).trace(msgStr, exception)\n            break\n          case DEBUG:\n            LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).debug(msgStr, exception)\n            break\n          case INFO:\n            LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).info(msgStr, exception)\n            break\n          case WARN:\n            LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).warn(msgStr, exception)\n            break\n          case ERROR:\n          case FATAL:\n            LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).error(msgStr, exception)\n            break\n        }\n      }\n    }\n  }\n\n  /**\n   *  The caches known to Ronin.\n   */\n  static enum CacheStore {\n    REQUEST,\n    SESSION,\n    APPLICATION\n  }\n\n  /**\n   *  Retrieves a value from a cache, or computes and stores it if it is not in the cache.\n   *  @param value A block which will compute the desired value.\n   *  @param name (Optional) A unique identifier for the value.  Default is null, which means one will be\n   *  generated from the type of the value.\n   *  @param store (Optional) The cache store used to retrieve or store the value.  Default is the request cache.\n   *  @return The retrieved or computed value.\n   */\n  static function cache<T>(value : block():T, name : String = null, store : CacheStore = null) : T {\n    if(store == null or store == REQUEST) {\n      return _CONFIG.RequestCache.getValue(value, name)\n    } else if (store == SESSION) {\n      return _CONFIG.SessionCache.getValue(value, name)\n    } else if (store == APPLICATION) {\n      return _CONFIG.ApplicationCache.getValue(value, name)\n    } else {\n      throw \"Don't know about CacheStore ${store}\"\n    }\n  }\n\n  /**\n   *  Invalidates a cached value in a cache.\n   *  @param name The unique identifier for the value.\n   *  @param store The cache store in which to invalidate the value.\n   */\n  static function invalidate<T>(name : String, store : CacheStore) {\n    if(store == null or store == REQUEST) {\n      _CONFIG.RequestCache.invalidate(name)\n    } else if (store == SESSION) {\n      _CONFIG.SessionCache.invalidate(name)\n    } else if (store == APPLICATION) {\n      _CONFIG.ApplicationCache.invalidate(name)\n    } else {\n      throw \"Don't know about CacheStore ${store}\"\n    }\n  }\n\n\n  /**\n   *  Detects changes made to resources in the Ronin application and\n   *  reloads them.  This function should only be called when Ronin is\n   *  in development mode.\n   */\n  static function loadChanges() {\n    ReloadManager.detectAndReloadChangedResources() \n  }\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gosu/hello.vark",
    "content": "function hello() {\n  print(\"hello\")\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Grace/ackerman_function.grace",
    "content": "method ack (m : Number, n : Number) -> Number {\n  print \"ack {m} {n}\"\n  if (m < = 0) then {n + 1}\n   elseif {n <= 0} then {ack((m -1), 1)}\n   else {ack(m -1, ack(m, n-1))}\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Grace/grace_IDE.grace",
    "content": "import \"gtk\" as gtk\nimport \"io\" as io\nimport \"mgcollections\" as collections\nimport \"button_factory\" as button_factory\nimport \"dialog_factory\" as dialog_factory\nimport \"syntax_highlighter\" as highlighter\nimport \"auto_completer\" as aComp\n\n//TODO\n\n// Autocomplete typing\n\n// FileChooser\n// Themes\n\n// Details for the Top Level Window\ndef window = gtk.window(gtk.GTK_WINDOW_TOPLEVEL)\nwindow.title := \"Grace\"\nwindow.set_default_size(700, 700)\n// -------------\n\n// Placeholder for the console window that can be popped out\n// of the main window\nvar popped := gtk.window(gtk.GTK_WINDOW_TOPLEVEL)\n\n// Initialise the Boxes\ndef mBox = gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2)\ndef buttonBox = gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 2)\nvar consoleButtons := gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 3)\nvar consoleBox := gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2)\nvar editorBox := gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2)\nvar splitPane := gtk.paned(gtk.GTK_ORIENTATION_VERTICAL, 2)\ndef menuBox = gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 4)\n// -------------\n\n// Initialise the buttons\ndef runButton = button_factory.make(\"run\")\nvar clearButton := button_factory.make(\"clear\")\nvar outButton := button_factory.make(\"out\")\nvar errorButton := button_factory.make(\"error\")\nvar popButton := button_factory.make(\"pop\")\ndef newButton = button_factory.make(\"new\")\ndef openButton = button_factory.make(\"open\")\ndef saveButton = button_factory.make(\"save\")\ndef saveAsButton = button_factory.make(\"saveAs\")\ndef closeButton = button_factory.make(\"close\")\n// -------------\n\n// Details for the default text editor and scrolled window\nvar tEdit := gtk.text_view\ntEdit.set_size_request(700, 400)\n\nvar scrolled_main := gtk.scrolled_window\nscrolled_main.set_size_request(700, 400)\nscrolled_main.add(tEdit)\n// -------------\n\n// Widget that allows multiple files to be edited (tabs)\nvar notebook := gtk.notebook\nnotebook.scrollable := true\n// -------------\n\n// Maps for holding the text_views and scrolled_windows\nvar editor_map := collections.map.new\neditor_map.put(0, tEdit)\nvar scrolled_map := collections.map.new\nscrolled_map.put(0, scrolled_main)\n\n// -------------\n\n// Class that manages the syntax highlighting (This needs to be passed around otherwise\n// the text_tag table gets confused, ie there can only be one)\ndef lighter = highlighter.Syntax_Highlighter.new(notebook, editor_map)\ntEdit.buffer.on \"changed\" do {\n    lighter.highlightLine\n}\n\n// Class that manages any auto completion that is required\ndef completer =  aComp.Auto_Completer.new(window, notebook, editor_map)\n\n// Utility methods\n// -------------\n\nmethod deleteCompileFiles(page_num : Number) {\n    def cur_scrolled = scrolled_map.get(page_num)\n    var filename := notebook.get_tab_label_text(cur_scrolled)\n    filename := filename.substringFrom(0)to(filename.size - 7) //Removes .grace extension\n\n    io.system(\"rm -f files/\" ++ filename)\n    io.system(\"rm -f files/\" ++ filename ++ \".c\")\n    io.system(\"rm -f files/\" ++ filename ++ \".gcn\")\n    io.system(\"rm -f files/\" ++ filename ++ \".gct\")\n}\n\n// -------------\n\n\n\nvar currentConsole := \"output\"      // Which console is being shown\nvar out := false\n\n\nvar outText := \"\"\nvar errorText := \"\"\n\n\n\n// Give actions to the buttons\n// -------------\n\nrunButton.on \"clicked\" do {\n    clearConsoles()\n\n    // Get the details for the current page selected\n    def cur_page_num = notebook.current_page\n    def cur_page = editor_map.get(cur_page_num)\n    def cur_scrolled = scrolled_map.get(cur_page_num)\n    def cur_page_label = notebook.get_tab_label_text(cur_scrolled)\n\n    // Initialise text iterators\n    def sIter = gtk.text_iter\n    def eIter = gtk.text_iter\n\n    // Set one at the beggining and one at the end of the text\n    cur_page.buffer.get_iter_at_offset(sIter, 0)\n    cur_page.buffer.get_iter_at_offset(eIter, -1)\n\n    // Get the text between the text iterators\n    def text = cur_page.buffer.get_text(sIter, eIter, true)\n\n    // Save the text to the file (in case the user hasn't already saved it)\n    def file = io.open(\"files/\" ++ cur_page_label, \"w\")\n    file.write(text)\n    file.close\n\n    // Run the program and pipe the output and errors into files to be read\n    io.system(\"../minigrace/minigrace \" ++ \"files/\" ++ cur_page_label ++ \" > output.txt 2> error.txt\")\n    def outputFile = io.open(\"output.txt\", \"r\")\n    def errorFile = io.open(\"error.txt\", \"r\")\n    outText := outputFile.read\n    errorText := errorFile.read\n\n    io.system(\"rm -f output.txt error.txt\")\n\n    var switched := false\n\n    // Change the console to output if there is output text\n    if((outText.size > 0) && (currentConsole != \"output\")) then {\n        switch_to_output()\n        switched := true\n    }\n    // Change the console to errors if there were errors\n    if((errorText.size > 0) && (currentConsole != \"errors\")) then {\n        switch_to_errors()\n        switched := true\n    }\n\n    // Remember to populate the console if it wasn't switched\n    if(!switched) then {\n        populateConsoles\n    }\n}\n\nclearButton.on \"clicked\" do {\n    clearConsoles()\n}\n\noutButton.on \"clicked\" do {\n    switch_to_output()\n}\n\nerrorButton.on \"clicked\" do {\n    switch_to_errors()\n}\n\npopButton.on \"clicked\" do {\n    if(out) then {\n        popIn()\n    } else {\n        popOut()\n    }\n}\n\n// Gives a dialog to let the user create a new file to edit\nnewButton.on \"clicked\" do {\n    def new_window_class = dialog_factory.new.new(notebook, editor_map, scrolled_map, lighter)\n\n    def new_window = new_window_class.window()\n    new_window.show_all\n}\n\n// Gives a dialog that lets the user open a file to edit\nopenButton.on \"clicked\" do {\n    def open_window_class = dialog_factory.open.new(notebook, editor_map, scrolled_map, lighter)\n\n    def open_window = open_window_class.window()\n    open_window.show_all\n}\n\n// Saves the current file (if the name is Untitled.grace it will ask for a new name)\nsaveButton.on \"clicked\" do {\n    def cur_page_num = notebook.current_page\n    def cur_page = editor_map.get(cur_page_num)\n    def cur_scrolled = scrolled_map.get(cur_page_num)\n    def cur_page_label = notebook.get_tab_label_text(cur_scrolled)\n\n    if(cur_page_label == \"Untitled.grace\") then {\n        def saveAs_window_class = dialog_factory.save.new(notebook, editor_map, scrolled_map, true)\n\n        def saveAs_window = saveAs_window_class.window()\n        saveAs_window.show_all\n    } else {\n        // Initialise text iterators\n        def sIter = gtk.text_iter\n        def eIter = gtk.text_iter\n\n        // Set one at the beggining and one at the end of the text\n        cur_page.buffer.get_iter_at_offset(sIter, 0)\n        cur_page.buffer.get_iter_at_offset(eIter, -1)\n\n        // Get the text between the text iterators\n        def text = cur_page.buffer.get_text(sIter, eIter, true)\n\n        // Save the file\n        def file = io.open(\"files/\" ++ cur_page_label, \"w\")\n        file.write(text)\n        file.close\n    }\n\n}\n\n// Gives a dialog that lets the user save the file with a new name\nsaveAsButton.on \"clicked\" do {\n    def saveAs_window_class = dialog_factory.save.new(notebook, editor_map, scrolled_map, false)\n\n    def saveAs_window = saveAs_window_class.window()\n    saveAs_window.show_all\n}\n\n// This will close a tab on the notebook\n// It also \"removes\" the page from the map,\n// by creating a new temporary map and putting all but\n// the removed page in.\ncloseButton.on \"clicked\" do {\n    def page_num = notebook.current_page\n    def num_pages = notebook.n_pages\n\n    if(num_pages > 1) then {\n        deleteCompileFiles(page_num)\n\n        def e_map = collections.map.new\n        def s_map = collections.map.new\n\n        // Copy every page up to the current page into the new maps\n        var x := 0\n        while {x < page_num} do {\n            var eValue := editor_map.get(x)\n            var sValue := scrolled_map.get(x)\n            e_map.put(x, eValue)\n            s_map.put(x, sValue)\n\n            x := x + 1\n        }\n\n        // Copy every page after the current page into the new map (shifted one down)\n        x := page_num + 1\n        while {x < num_pages} do {\n            var eValue := editor_map.get(x)\n            var sValue := scrolled_map.get(x)\n            e_map.put((x - 1), eValue)\n            s_map.put((x - 1), sValue)\n\n            x := x + 1\n        }\n\n        editor_map := e_map\n        scrolled_map := s_map\n        notebook.remove_page(page_num)\n\n        notebook.show_all\n    }\n\n}\n// -------------\n\n\n\n\n\n\n// Consoles:\n// -------------\n\nvar outConsole := gtk.text_view\nvar outScroll := gtk.scrolled_window\nvar errorConsole := gtk.text_view\nvar errorScroll := gtk.scrolled_window\nvar errorTag := errorConsole.buffer.create_tag(\"fixed\", \"foreground\", \"red\")\n\n\n// Creates a new output console\nmethod createOut {\n    outConsole := gtk.text_view\n    outScroll := gtk.scrolled_window\n    outScroll.add(outConsole)\n    if(out) then {\n        outConsole.set_size_request(400, 400)\n        outScroll.set_size_request(400, 400)\n    } else {\n        outConsole.set_size_request(700, 200)\n        outScroll.set_size_request(700, 200)\n    }\n    outConsole.editable := false\n    outConsole.buffer.set_text(\"[Output]:\", -1)\n}\ncreateOut()\n\n// Creates a new error console\nmethod createError {\n    errorConsole := gtk.text_view\n    errorScroll := gtk.scrolled_window\n    errorScroll.add(errorConsole)\n    if(out) then {\n        errorConsole.set_size_request(400, 400)\n        errorScroll.set_size_request(400, 400)\n    } else {\n        errorConsole.set_size_request(700, 200)\n        errorScroll.set_size_request(700, 200)\n    }\n    errorConsole.editable := false\n    errorConsole.buffer.set_text(\"[Errors]:\", -1)\n    errorTag := errorConsole.buffer.create_tag(\"fixed\", \"foreground\", \"red\")\n}\ncreateError()\n\n// Switches the console being shown to be output. This requires\n// the output console to be remade as it would have been destroyed when\n// it was switched previously\nmethod switch_to_output {\n    if(currentConsole != \"output\") then {\n        currentConsole := \"output\"\n        consoleBox.remove(errorScroll)     // This destroys the errorConsole\n\n        createOut()\n\n        consoleBox.add(outScroll)\n\n        populateConsoles()\n        if(out) then {\n            popped.show_all\n        } else {\n            window.show_all\n        }\n    }\n}\n\n// Switches the console being shown to be errors. This requires\n// the error console to be remade as it would have been destroyed when\n// it was switched previously\nmethod switch_to_errors {\n    if(currentConsole != \"errors\") then {\n        currentConsole := \"errors\"\n        consoleBox.remove(outScroll)       // This destroys the outConsole\n\n        createError()\n\n        consoleBox.add(errorScroll)\n\n        populateConsoles()\n        if(out) then {\n            popped.show_all\n        } else {\n            window.show_all\n        }\n    }\n}\n\n// If there is text to be put into the consoles this will add it\nmethod populateConsoles {\n    if((outText.size > 0) && (currentConsole == \"output\")) then {\n        outConsole.buffer.set_text(outText, -1)\n    }\n    if((errorText.size > 0) && (currentConsole == \"errors\")) then {\n        def sIter = gtk.text_iter\n        def eIter = gtk.text_iter\n\n        errorConsole.buffer.set_text(errorText, -1)\n        errorConsole.buffer.get_iter_at_offset(sIter, 0)\n        errorConsole.buffer.get_iter_at_offset(eIter, -1)\n        errorConsole.buffer.apply_tag(errorTag, sIter, eIter)\n    }\n}\n\nmethod clearConsoles {\n    if(currentConsole == \"output\") then {\n        outConsole.buffer.set_text(\"[Output]:\", -1)\n        outText := \"\"\n    }\n    if(currentConsole == \"errors\") then {\n        errorConsole.buffer.set_text(\"[Errors]:\", -1)\n        errorText := \"\"\n    }\n}\n\n\n// Identical as the popIn method, but can be connected to the window's destroy button\ndef popInBlock = {\n    consoleBox.reparent(splitPane)\n    popButton.label := \"Pop Out\"\n\n    if(currentConsole == \"output\") then {\n        outConsole.set_size_request(700, 200)\n        outScroll.set_size_request(700, 200)\n    }\n    if(currentConsole == \"errors\") then {\n     errorConsole.set_size_request(700, 200)\n     errorScroll.set_size_request(700, 200)\n    }\n\n    def cur_page_num = notebook.current_page\n    def cur_scrolled = scrolled_map.get(cur_page_num)\n    def cur_page = editor_map.get(cur_page_num)\n\n    cur_page.set_size_request(700, 400)\n    cur_scrolled.set_size_request(700, 400)\n\n    out := false\n    popped.visible := false\n}\n\n\n// This pops the console out into a separate window\nmethod popOut {\n    popped := gtk.window(gtk.GTK_WINDOW_TOPLEVEL)\n\n    consoleBox.reparent(popped)\n    popButton.label := \"Pop In\"\n\n    if(currentConsole == \"output\") then {\n        outConsole.set_size_request(400, 400)\n        outScroll.set_size_request(400, 400)\n    }\n    if(currentConsole == \"errors\") then {\n        errorConsole.set_size_request(400, 400)\n        errorScroll.set_size_request(400, 400)\n    }\n\n    def cur_page_num = notebook.current_page\n    def cur_scrolled = scrolled_map.get(cur_page_num)\n    def cur_page = editor_map.get(cur_page_num)\n\n    cur_page.set_size_request(700, 580)\n    cur_scrolled.set_size_request(700, 580)\n\n    out := true\n    popped.visible := true\n    popped.connect(\"destroy\", popInBlock)\n    popped.show_all\n\n}\n\n// Puts the console back into the main window\nmethod popIn {\n    consoleBox.reparent(splitPane)\n    popButton.label := \"Pop Out\"\n\n    if(currentConsole == \"output\") then {\n        outConsole.set_size_request(700, 200)\n        outScroll.set_size_request(700, 200)\n    }\n    if(currentConsole == \"errors\") then {\n        errorConsole.set_size_request(700, 200)\n        errorScroll.set_size_request(700, 200)\n    }\n\n    def cur_page_num = notebook.current_page\n    def cur_scrolled = scrolled_map.get(cur_page_num)\n    def cur_page = editor_map.get(cur_page_num)\n\n    cur_page.set_size_request(700, 400)\n    cur_scrolled.set_size_request(700, 400)\n\n    out := false\n    popped.visible := false\n}\n\nclearConsoles()\n// -------------\n\n\n\n\n\n\n// Patch everything together\n\nvar hSeparator1 := gtk.separator(gtk.GTK_ORIENTATION_HORIZONTAL)\nvar hSeparator2 := gtk.separator(gtk.GTK_ORIENTATION_HORIZONTAL)\n\nmenuBox.add(newButton)\nmenuBox.add(openButton)\nmenuBox.add(saveButton)\nmenuBox.add(saveAsButton)\nbuttonBox.add(runButton)\nbuttonBox.add(closeButton)\n\nconsoleButtons.add(outButton)\nconsoleButtons.add(errorButton)\nconsoleButtons.add(clearButton)\nconsoleButtons.add(popButton)\n\nconsoleBox.add(hSeparator1)\nconsoleBox.add(consoleButtons)\nconsoleBox.add(outScroll)\n\neditorBox.add(hSeparator2)\nnotebook.add(scrolled_main)\nnotebook.set_tab_label_text(scrolled_main, \"Untitled.grace\")\neditorBox.add(notebook)\n\nsplitPane.add1(editorBox)\nsplitPane.add2(consoleBox)\n\nmBox.add(menuBox)\nmBox.add(buttonBox)\nmBox.add(splitPane)\n\nwindow.add(mBox)\n\ndef exit = {\n    var x := 0\n    while {x < notebook.n_pages} do {\n        deleteCompileFiles(x)\n\n        x := x + 1\n    }\n\n    // Delete the compile files of the IDE\n    io.system(\"rm -f Grace_IDE.gct Grace_IDE.c Grace_IDE.gcn\")\n    io.system(\"rm -f scanner.gct scanner.c scanner.gcn\")\n    io.system(\"rm -f syntax_highlighter.gct syntax_highlighter.c syntax_highlighter.gcn\")\n    io.system(\"rm -f syntax_colors.gct syntax_colors.c syntax_colors.gcn\")\n    io.system(\"rm -f button_factory.gct button_factory.c button_factory.gcn\")\n    io.system(\"rm -f dialog_factory.gct dialog_factory.c dialog_factory.gcn\")\n    io.system(\"rm -f auto_completer.gct auto_completer.c auto_completer.gcn\")\n\n    print \"Grace IDE Closed Successfully\"\n    gtk.main_quit\n}\n\nwindow.connect(\"destroy\", exit)\nwindow.show_all\n\ngtk.main"
  },
  {
    "path": "src/test/resources/samples/langs/Gradle/build.gradle",
    "content": "apply plugin: GreetingPlugin\n\ngreeting.message = 'Hi from Gradle'\n\nclass GreetingPlugin implements Plugin<Project> {\n    void apply(Project project) {\n        // Add the 'greeting' extension object\n        project.extensions.create(\"greeting\", GreetingPluginExtension)\n        // Add a task that uses the configuration\n        project.task('hello') << {\n            println project.greeting.message\n        }\n    }\n}\n\nclass GreetingPluginExtension {\n    def String message = 'Hello from GreetingPlugin'\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Gradle/builder.gradle",
    "content": "apply plugin: GreetingPlugin\n\ngreeting {\n    message = 'Hi'\n    greeter = 'Gradle'\n}\n\nclass GreetingPlugin implements Plugin<Project> {\n    void apply(Project project) {\n        project.extensions.create(\"greeting\", GreetingPluginExtension)\n        project.task('hello') << {\n            println \"${project.greeting.message} from ${project.greeting.greeter}\"\n        }\n    }\n}\n\nclass GreetingPluginExtension {\n    String message\n    String greeter\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/Foods.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\nabstract Foods = {\n  flags startcat = Comment ;\n  cat\n    Comment ; Item ; Kind ; Quality ;\n  fun\n    Pred : Item -> Quality -> Comment ;\n    This, That, These, Those : Kind -> Item ;\n    Mod : Quality -> Kind -> Kind ;\n    Wine, Cheese, Fish, Pizza : Kind ;\n    Very : Quality -> Quality ;\n    Fresh, Warm, Italian, \n      Expensive, Delicious, Boring : Quality ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsAfr.gf",
    "content": "-- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL\n\nconcrete FoodsAfr of Foods = open Prelude, Predef in{\n\n\tflags coding=utf8;\n\n\tlincat\n\t\tComment = {s: Str} ;\n\t\tKind = {s: Number => Str} ;\n\t\tItem = {s: Str ; n: Number} ;\n\t\tQuality = {s: AdjAP => Str} ;\n\n\tlin\n\t\tPred item quality = {s = item.s ++ \"is\" ++ (quality.s ! Predic)};\n\t\tThis kind = {s = \"hierdie\" ++ (kind.s ! Sg); n = Sg};\n\t\tThat kind = {s = \"daardie\" ++ (kind.s ! Sg); n = Sg};\n\t\tThese kind = {s = \"hierdie\" ++ (kind.s ! Pl); n = Pl};\n\t\tThose kind = {s = \"daardie\" ++ (kind.s ! Pl); n = Pl};\n\t\tMod quality kind = {s = table{n => (quality.s ! Attr) ++ (kind.s!n)}};\n\n\t\tWine = declNoun_e \"wyn\";\n\t\tCheese = declNoun_aa \"kaas\";\n\t\tFish = declNoun_ss \"vis\";\n\t\tPizza = declNoun_s \"pizza\";\n\n\t\tVery quality = veryAdj quality;\n\n\t\tFresh = regAdj \"vars\";\n\t\tWarm = regAdj \"warm\";\n\t\tItalian = smartAdj_e \"Italiaans\";\n\t\tExpensive = regAdj \"duur\";\n\t\tDelicious = smartAdj_e \"heerlik\";\n\t\tBoring = smartAdj_e \"vervelig\";\n\n\tparam\n\t\tAdjAP = Attr | Predic ;\n\t\tNumber = Sg | Pl ;\n\n\toper\n\t\t--Noun operations (wyn, kaas, vis, pizza)\n\n\t\tdeclNoun_aa: Str -> {s: Number => Str} = \\x ->\n\t\tlet v = tk 2 x\n\t\tin\n\t\t{s = table{Sg => x ; Pl => v + (last x) +\"e\"}};\n\n\t\tdeclNoun_e: Str -> {s: Number => Str} = \\x -> {s = table{Sg => x ; Pl => x + \"e\"}} ;\n\t\tdeclNoun_s: Str -> {s: Number => Str} = \\x -> {s = table{Sg => x ; Pl => x + \"s\"}} ;\n\n\t\tdeclNoun_ss: Str -> {s: Number => Str} = \\x -> {s = table{Sg => x ; Pl => x + (last x) + \"e\"}} ;\n\n\n\t\t--Adjective operations\n\n\t\tmkAdj : Str -> Str -> {s: AdjAP => Str} = \\x,y -> {s = table{Attr => x; Predic => y}};\n\n\t\tdeclAdj_e : Str -> {s : AdjAP=> Str} = \\x -> mkAdj (x + \"e\") x;\n\t\tdeclAdj_g : Str -> {s : AdjAP=> Str} = \\w ->\n\t\t\tlet v = init w\n\t\t\tin mkAdj (v + \"ë\") w ;\n\n\t\tdeclAdj_oog : Str -> {s : AdjAP=> Str} = \\w ->\n\t\t\tlet v = init w\n\t\t\tin\n\t\t\t\tlet i = init v\n\t\t\t\tin mkAdj (i + \"ë\") w ;\n\n\t\tregAdj : Str -> {s : AdjAP=> Str} = \\x -> mkAdj x x;\n\n\t\tveryAdj : {s: AdjAP => Str} -> {s : AdjAP=> Str} =  \\x -> {s = table{a => \"baie\" ++ (x.s!a)}};\n\n\n\t\tsmartAdj_e : Str -> {s : AdjAP=> Str} = \\a -> case a of\n\t\t{\n\t\t\t_ + \"oog\" \t\t\t   \t\t=> declAdj_oog a ;\n\t\t\t_ + (\"e\" | \"ie\" | \"o\" | \"oe\") + \"g\" \t=> declAdj_g a ;\n\t\t\t_\t\t\t\t\t   \t=> declAdj_e a\n\t\t};\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsAmh.gf",
    "content": "concrete FoodsAmh of Foods ={\n flags coding = utf8;\n lincat\n  Comment,Item,Kind,Quality = Str;\n lin\n  Pred item quality = item ++ quality++ \"ነው::\" ;\n  This kind = \"ይህ\" ++ kind;\n  That kind = \"ያ\" ++ kind;\n  Mod quality kind = quality ++ kind;\n  Wine = \"ወይን\";\n  Cheese = \"አይብ\";\n  Fish = \"ዓሳ\";\n  Very quality = \"በጣም\" ++ quality;\n  Fresh = \"አዲስ\";\n  Warm = \"ትኩስ\";\n  Italian = \"የጥልያን\";\n  Expensive = \"ውድ\";\n  Delicious = \"ጣፋጭ\";\n  Boring = \"አስቀያሚ\";\n  \n}   "
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsBul.gf",
    "content": "-- (c) 2009 Krasimir Angelov under LGPL\n\nconcrete FoodsBul of Foods = {\n  \n  flags\n    coding = utf8;\n\n  param\n    Gender = Masc | Fem | Neutr;\n    Number = Sg | Pl;\n    Agr    = ASg Gender | APl ;\n\n  lincat\n    Comment = Str ;\n    Quality = {s : Agr => Str} ;\n    Item = {s : Str; a : Agr} ;\n    Kind = {s : Number => Str; g : Gender} ;\n\n  lin\n    Pred item qual = item.s ++ case item.a of {ASg _ => \"е\"; APl => \"са\"} ++ qual.s ! item.a ;\n    \n    This  kind = {s=case kind.g of {Masc=>\"този\"; Fem=>\"тази\";  Neutr=>\"това\" } ++ kind.s ! Sg; a=ASg kind.g} ;\n    That  kind = {s=case kind.g of {Masc=>\"онзи\"; Fem=>\"онази\"; Neutr=>\"онова\"} ++ kind.s ! Sg; a=ASg kind.g} ;\n    These kind = {s=\"тези\"  ++ kind.s ! Pl; a=APl} ;\n    Those kind = {s=\"онези\" ++ kind.s ! Pl; a=APl} ;\n    \n    Mod qual kind = {s=\\\\n => qual.s ! (case n of {Sg => ASg kind.g; Pl => APl}) ++ kind.s ! n; g=kind.g} ;\n\n    Wine   = {s = table {Sg => \"вино\";   Pl => \"вина\"};   g = Neutr};\n    Cheese = {s = table {Sg => \"сирене\"; Pl => \"сирена\"}; g = Neutr};\n    Fish   = {s = table {Sg => \"риба\";   Pl => \"риби\"};   g = Fem};\n    Pizza  = {s = table {Sg => \"пица\";   Pl => \"пици\"};   g = Fem};\n\n    Very qual = {s = \\\\g => \"много\" ++ qual.s ! g};\n\n    Fresh     = {s = table {ASg Masc => \"свеж\";        ASg Fem => \"свежа\";       ASg Neutr => \"свежо\";       APl => \"свежи\"}};\n    Warm      = {s = table {ASg Masc => \"горещ\";       ASg Fem => \"гореща\";      ASg Neutr => \"горещо\";      APl => \"горещи\"}};\n    Italian   = {s = table {ASg Masc => \"италиански\";  ASg Fem => \"италианска\";  ASg Neutr => \"италианско\";  APl => \"италиански\"}}; \n    Expensive = {s = table {ASg Masc => \"скъп\";        ASg Fem => \"скъпа\";       ASg Neutr => \"скъпо\";       APl => \"скъпи\"}};\n    Delicious = {s = table {ASg Masc => \"превъзходен\"; ASg Fem => \"превъзходна\"; ASg Neutr => \"превъзходно\"; APl => \"превъзходни\"}};\n    Boring    = {s = table {ASg Masc => \"еднообразен\"; ASg Fem => \"еднообразна\"; ASg Neutr => \"еднообразно\"; APl => \"еднообразни\"}};\n    \n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsCat.gf",
    "content": "--# -path=.:present\n\n-- (c) 2009 Jordi Saludes under LGPL\n\nconcrete FoodsCat of Foods = FoodsI with \n  (Syntax = SyntaxCat),\n  (LexFoods = LexFoodsCat) ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsChi.gf",
    "content": "concrete FoodsChi of Foods = {\nflags coding = utf8 ;\nlincat\n    Comment, Item = Str ;\n    Kind = {s,c : Str} ; \n    Quality = {s,p : Str} ;\nlin\n    Pred item quality = item ++ \"是\" ++ quality.s ++ quality.p ;\n    This kind = \"这\" ++ kind.c ++ kind.s ;\n    That kind = \"那\" ++ kind.c ++ kind.s ;\n    These kind = \"这\" ++ \"些\" ++ kind.s ;\n    Those kind = \"那\" ++ \"些\" ++ kind.s ;\n    Mod quality kind = {\n      s = quality.s ++ quality.p ++ kind.s ;\n      c = kind.c\n      } ;\n    Wine  = geKind \"酒\" ;\n    Pizza = geKind \"比 萨 饼\" ;\n    Cheese  = geKind \"奶 酪\" ;\n    Fish  = geKind \"鱼\" ;\n    Very quality = longQuality (\"非 常\" ++ quality.s) ;\n    Fresh  = longQuality \"新 鲜\" ;\n    Warm  = longQuality \"温 热\" ;\n    Italian  = longQuality \"意 大 利 式\" ;\n    Expensive  = longQuality \"昂 贵\" ;\n    Delicious  = longQuality \"美 味\" ;\n    Boring  = longQuality \"难 吃\" ;\noper\n    mkKind : Str -> Str -> {s,c : Str} = \\s,c ->\n      {s = s ; c = c} ;\n    geKind : Str -> {s,c : Str} = \\s ->\n      mkKind s \"个\" ;\n    longQuality : Str -> {s,p : Str} = \\s ->\n      {s = s ; p = \"的\"} ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsCze.gf",
    "content": "-- (c) 2011 Katerina Bohmova under LGPL\n\nconcrete FoodsCze of Foods = open ResCze in {\n  flags \n    coding = utf8 ;\n  lincat\n    Comment = {s : Str} ; \n    Quality = Adjective ; \n    Kind = Noun ; \n    Item = NounPhrase ;\n  lin\n    Pred item quality = \n      {s = item.s ++ copula ! item.n ++ \n           quality.s ! item.g ! item.n} ;\n    This  = det Sg \"tento\" \"tato\" \"toto\" ;\n    That  = det Sg \"tamten\" \"tamta\" \"tamto\" ;\n    These = det Pl \"tyto\" \"tyto\" \"tato\" ;\n    Those = det Pl \"tamty\" \"tamty\" \"tamta\" ;\n    Mod quality kind = {\n      s = \\\\n => quality.s ! kind.g ! n ++ kind.s ! n ;\n      g = kind.g\n      } ;\n    Wine = noun \"víno\" \"vína\" Neutr ;\n    Cheese = noun \"sýr\" \"sýry\" Masc ;\n    Fish = noun \"ryba\" \"ryby\" Fem ;\n    Pizza = noun \"pizza\" \"pizzy\" Fem ;\n    Very qual = {s = \\\\g,n => \"velmi\" ++ qual.s ! g ! n} ;\n    Fresh = regAdj \"čerstv\" ;\n    Warm = regAdj \"tepl\" ;\n    Italian = regAdj \"italsk\" ;\n    Expensive = regAdj \"drah\" ;\n    Delicious = regnfAdj \"vynikající\" ;\n    Boring = regAdj \"nudn\" ;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsDut.gf",
    "content": "-- (c) 2009 Femke Johansson under LGPL\n\nconcrete FoodsDut of Foods = {\n\n\tlincat\n\t\tComment = {s : Str};\n\t\tQuality = {s : AForm => Str};\n\t\tKind = { s : Number => Str};\n\t\tItem = {s : Str ; n : Number};\n\t\n\tlin\n\t\tPred item quality = \n\t\t\t{s = item.s ++ copula ! item.n ++ quality.s ! APred};\n\t\tThis = det Sg \"deze\";\n\t\tThese = det Pl \"deze\";\n\t\tThat = det Sg \"die\";\n\t\tThose = det Pl \"die\";\n\t\t\n\t\tMod quality kind =\n\t\t\t{s = \\\\n => quality.s ! AAttr ++ kind.s ! n};\n\t\t\tWine = regNoun \"wijn\";\n\t\t\tCheese = noun \"kaas\" \"kazen\";\n\t\t\tFish = noun \"vis\" \"vissen\";\n\t\t\tPizza = noun \"pizza\" \"pizza's\";\n\t\t\t\n\t\t\tVery a = {s = \\\\f => \"erg\" ++ a.s ! f};\n\t\t\t\n\t\t\tFresh = regadj \"vers\";\n\t\t\tWarm = regadj \"warm\";\n\t\t\tItalian = regadj \"Italiaans\";\n\t\t\tExpensive = adj \"duur\" \"dure\";\n\t\t\tDelicious = regadj \"lekker\";\n\t\t\tBoring = regadj \"saai\";\n\t\t\n\t\tparam\n\t\t\tNumber = Sg | Pl;\n\t\t\tAForm = APred | AAttr;\n\t\t\n\t\toper\n\t\t\tdet : Number -> Str ->\n\t\t\t\t{s : Number => Str} -> {s : Str ; n: Number} =\n\t\t\t\t\\n,det,noun -> {s = det ++ noun.s ! n ; n=n};\n\t\t\t\t\n\t\t\tnoun : Str -> Str -> {s : Number => Str} = \n\t\t\t\t\\man,men -> {s = table {Sg => man; Pl => men}};\n\t\t\t\t\n\t\t\tregNoun : Str -> {s : Number => Str} =\n\t\t\t\t\\wijn -> noun wijn (wijn + \"en\");\n\t\t\t\t\n\t\t\tregadj : Str -> {s : AForm => Str} =\n\t\t\t\t\\koud -> adj koud (koud+\"e\");\n\t\t\t\n\t\t\tadj : Str -> Str -> {s : AForm => Str} =\n\t\t\t\t\\duur, dure -> {s = table {APred => duur; AAttr => dure}};\n\t\t\t\t\n\t\t\tcopula : Number => Str =\n\t\t\t\ttable {Sg => \"is\" ; Pl => \"zijn\"};\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsEng.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsEng of Foods = {\n  flags language = en_US;\n  lincat\n    Comment, Quality = {s : Str} ; \n    Kind = {s : Number => Str} ; \n    Item = {s : Str ; n : Number} ; \n  lin\n    Pred item quality = \n      {s = item.s ++ copula ! item.n ++ quality.s} ;\n    This  = det Sg \"this\" ;\n    That  = det Sg \"that\" ;\n    These = det Pl \"these\" ;\n    Those = det Pl \"those\" ;\n    Mod quality kind = \n      {s = \\\\n => quality.s ++ kind.s ! n} ;\n    Wine = regNoun \"wine\" ;\n    Cheese = regNoun \"cheese\" ;\n    Fish = noun \"fish\" \"fish\" ;\n    Pizza = regNoun \"pizza\" ;\n    Very a = {s = \"very\" ++ a.s} ;\n    Fresh = adj \"fresh\" ;\n    Warm = adj \"warm\" ;\n    Italian = adj \"Italian\" ;\n    Expensive = adj \"expensive\" ;\n    Delicious = adj \"delicious\" ;\n    Boring = adj \"boring\" ;\n  param\n    Number = Sg | Pl ;\n  oper\n    det : Number -> Str -> \n      {s : Number => Str} -> {s : Str ; n : Number} = \n        \\n,det,noun -> {s = det ++ noun.s ! n ; n = n} ;\n    noun : Str -> Str -> {s : Number => Str} = \n      \\man,men -> {s = table {Sg => man ; Pl => men}} ;\n    regNoun : Str -> {s : Number => Str} = \n      \\car -> noun car (car + \"s\") ;\n    adj : Str -> {s : Str} = \n      \\cold -> {s = cold} ;\n    copula : Number => Str = \n      table {Sg => \"is\" ; Pl => \"are\"} ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsEpo.gf",
    "content": "-- (c) 2009 Julia Hammar under LGPL\n\nconcrete FoodsEpo of Foods = open Prelude in {\n\n  flags coding =utf8 ;\n\n  lincat\n    Comment = SS ; \n    Kind, Quality = {s : Number => Str} ; \n    Item = {s : Str ; n : Number} ; \n\n  lin\n    Pred item quality = ss (item.s ++ copula ! item.n ++ quality.s ! item.n) ;\n    This = det Sg \"ĉi tiu\" ;\n    That  = det Sg \"tiu\" ;\n    These = det Pl \"ĉi tiuj\" ;\n    Those = det Pl \"tiuj\" ;\n    Mod quality kind = {s = \\\\n => quality.s ! n ++ kind.s ! n} ;\n    Wine = regNoun \"vino\" ;\n    Cheese = regNoun \"fromaĝo\" ;\n    Fish = regNoun \"fiŝo\" ;\n    Pizza = regNoun \"pico\" ;\n    Very quality = {s = \\\\n => \"tre\" ++ quality.s ! n} ;\n    Fresh = regAdj \"freŝa\" ;\n    Warm = regAdj \"varma\" ;\n    Italian = regAdj \"itala\" ;\n    Expensive = regAdj \"altekosta\" ;\n    Delicious = regAdj \"bongusta\" ;\n    Boring = regAdj \"enuiga\" ;\n\n  param\n    Number = Sg | Pl ;\n\n  oper\n    det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n      \\n,d,cn -> {\n        s = d ++ cn.s ! n ;\n        n = n\n      } ;\n    regNoun : Str -> {s : Number => Str} = \n      \\vino -> {s = table {Sg => vino ; Pl => vino + \"j\"}\n\t} ;\n    regAdj : Str -> {s : Number => Str} =\n      \\nova -> {s = table {Sg => nova ; Pl => nova + \"j\"}\n      } ;\n    copula : Number => Str = \\\\_ => \"estas\" ;\n}\n    \n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsFin.gf",
    "content": "--# -path=.:present\n\n-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsFin of Foods = FoodsI with \n  (Syntax = SyntaxFin),\n  (LexFoods = LexFoodsFin) ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsFre.gf",
    "content": "--# -path=.:../foods:present\n\nconcrete FoodsFre of Foods = open SyntaxFre, ParadigmsFre in {\n\n\tflags coding = utf8 ;\n\t\n\tlincat\n\t\tComment = Utt ;\n\t\tItem = NP ;\n\t\tKind = CN ;\n\t\tQuality = AP ;\n\t\n\tlin\n\t\tPred item quality = mkUtt (mkCl item quality) ;\n\t\tThis kind = mkNP this_QuantSg kind ;\n\t\tThat kind = mkNP that_QuantSg kind ;\n\t\tThese kind = mkNP these_QuantPl kind ;\n\t\tThose kind = mkNP those_QuantPl kind ;\n\t\tMod quality kind = mkCN quality kind ;\n\t\tVery quality = mkAP very_AdA quality ;\n\t\t\n\t\tWine = mkCN (mkN \"vin\" masculine) ;\n\t\tPizza = mkCN (mkN \"pizza\" feminine) ;\n\t\tCheese = mkCN (mkN \"fromage\" masculine) ;\n\t\tFish = mkCN (mkN \"poisson\" masculine) ;\n\t\tFresh = mkAP (mkA \"frais\" \"fraîche\" \"frais\" \"fraîchement\") ;\n\t\tWarm = mkAP (mkA \"chaud\") ;\n\t\tItalian = mkAP (mkA \"italien\") ;\n\t\tExpensive = mkAP (mkA \"cher\") ;\n\t\tDelicious = mkAP (mkA \"délicieux\") ;\n\t\tBoring = mkAP (mkA \"ennuyeux\") ;\n\t}"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsGer.gf",
    "content": "--# -path=.:present\n\n-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsGer of Foods = FoodsI with \n  (Syntax = SyntaxGer),\n  (LexFoods = LexFoodsGer) ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsHeb.gf",
    "content": "--# -path=alltenses\n\n--(c) 2009 Dana Dannells\n-- Licensed under LGPL\n\nconcrete FoodsHeb of Foods = open Prelude in {\n  \n  flags coding=utf8 ;\n\n    lincat\n      Comment = SS ;\n      Quality = {s: Number => Species => Gender =>  Str} ;  \n      Kind = {s : Number => Species => Str ; g : Gender ; mod : Modified} ; \n      Item = {s : Str ; g : Gender ; n : Number ; sp : Species ; mod : Modified} ; \n  \n \n    lin\n      Pred item quality = ss (item.s ++ quality.s ! item.n ! Indef ! item.g ) ; \n      This  = det Sg Def \"הזה\" \"הזאת\"; \n      That  = det Sg Def \"ההוא\" \"ההיא\" ; \n      These = det Pl Def \"האלה\" \"האלה\" ; \n      Those = det Pl Def \"ההם\" \"ההן\" ; \n      Mod quality kind = {\n\ts = \\\\n,sp => kind.s ! n ! sp ++ quality.s ! n ! sp ! kind.g;\n\tg = kind.g ;\n\tmod = T\n\t} ;     \n      Wine = regNoun \"יין\" \"יינות\" Masc ; \n      Cheese = regNoun \"גבינה\" \"גבינות\" Fem ;  \n      Fish = regNoun \"דג\" \"דגים\" Masc ; \n      Pizza = regNoun \"פיצה\" \"פיצות\" Fem ; \n      Very qual = {s = \\\\g,n,sp => \"מאוד\" ++  qual.s ! g ! n ! sp} ;\n      Fresh = regAdj \"טרי\" ; \n      Warm = regAdj \"חם\" ;\n      Italian = regAdj2 \"איטלקי\" ;\n      Expensive = regAdj \"יקר\" ; \n      Delicious = regAdj \"טעים\" ; \n      Boring = regAdj2 \"משעמם\"; \n\n    param \n      Number = Sg | Pl ;\n      Gender = Masc | Fem ;\n      Species = Def | Indef ;  \n      Modified = T | F ;\n\n    oper\n\tNoun : Type = {s : Number => Species => Str ; g : Gender ; mod : Modified } ;\n  \tAdj : Type = {s : Number => Species => Gender => Str} ;\n\n      det : Number -> Species -> Str -> Str -> Noun -> \n\t{s : Str ; g :Gender ; n : Number ; sp : Species ; mod : Modified} = \n        \\n,sp,m,f,cn -> {\n\t  s = case cn.mod of { _ => cn.s ! n ! sp ++ case cn.g of {Masc => m ; Fem  => f} };\n\t  g = cn.g ; \n          n = n ;\n\t  sp = sp ;\n\t  mod = cn.mod\n        } ;\n      \n\tnoun : (gvina,hagvina,gvinot,hagvinot : Str) ->  Gender -> Noun =  \n      \t\t\\gvina,hagvina,gvinot,hagvinot,g -> {\n        \ts = table {\n          \t\tSg  => table {\n             \t\t\tIndef => gvina ;\n             \t\t\tDef =>  hagvina \n            \t\t} ;\n          \t\tPl => table {\n             \t\t\tIndef => gvinot ;\n             \t\t\tDef => hagvinot  \n            \t\t} \n       \t  \t} ;\n        \tg = g ;\n\t\tmod = F \n      } ;\n\n\tregNoun : Str -> Str -> Gender -> Noun = \n\t        \\gvina,gvinot, g -> \n\t\tnoun gvina (defH gvina) gvinot (defH gvinot) g ; \n\n      defH : Str -> Str = \\cn ->\n\tcase cn of {_ => \"ה\" + cn};\t\n\n      replaceLastLetter : Str -> Str = \\c ->\n\t case c of {\"ף\" => \"פ\" ; \"ם\" => \"מ\" ; \"ן\" => \"נ\" ; \"ץ\" => \"צ\" ; \"ך\" => \"כ\"; _ => c} ;\n\t      \n      adjective : (_,_,_,_ : Str) -> Adj = \n       \\tov,tova,tovim,tovot -> {\n        s = table {\n          Sg => table { \n\t\t\tIndef => table { Masc => tov ; Fem => tova } ; \n\t\t\tDef => table { Masc => defH tov ; Fem => defH tova }  \n            \t\t} ; \n          Pl => table { \n\t\t\tIndef => table {Masc => tovim ; Fem  => tovot } ; \n\t\t\tDef => table { Masc => defH tovim ; Fem  => defH tovot }  \n            \t\t}\n\t}\n      } ;\n    \n      regAdj : Str -> Adj = \\tov ->\n\tcase tov of { to + c@? =>\n\tadjective tov (to + replaceLastLetter (c) + \"ה\" ) (to + replaceLastLetter (c) +\"ים\" ) (to + replaceLastLetter (c) + \"ות\" )};\t \n     \n     regAdj2 : Str -> Adj = \\italki ->\n \tcase italki of { italk+ c@? => \n    adjective italki (italk + replaceLastLetter (c)  +\"ת\" )  (italk + replaceLastLetter (c)+ \"ים\" ) (italk + replaceLastLetter (c)  + \"ות\" )};\n\n}  -- FoodsHeb  \n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsHin.gf",
    "content": "-- (c) 2010 Vikash Rauniyar under LGPL\n\nconcrete FoodsHin of Foods = {\n\n  flags coding=utf8 ;\n\n  param\n    Gender = Masc | Fem ;\n    Number = Sg | Pl ;\n  lincat\n    Comment = {s : Str} ;\n    Item    = {s : Str ; g : Gender ; n : Number} ;\n    Kind    = {s : Number => Str ; g : Gender} ;\n    Quality = {s : Gender => Number => Str} ;\n  lin\n    Pred item quality = {\n      s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n\n      } ;\n    This kind = {s = \"यह\" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;\n    That kind = {s = \"वह\" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;\n    These kind = {s = \"ये\" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;\n    Those kind = {s = \"वे\" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;\n    Mod quality kind = {\n      s = \\\\n => quality.s ! kind.g ! n ++ kind.s ! n ; \n      g = kind.g\n      } ;\n    Wine = regN \"मदिरा\" ;\n    Cheese = regN \"पनीर\" ;\n    Fish = regN \"मछली\" ;\n    Pizza = regN \"पिज़्ज़ा\" ;\n    Very quality = {s = \\\\g,n => \"अति\" ++ quality.s ! g ! n} ;\n    Fresh = regAdj \"ताज़ा\" ;\n    Warm = regAdj \"गरम\" ;\n    Italian = regAdj \"इटली\" ; \n    Expensive = regAdj \"बहुमूल्य\" ;\n    Delicious = regAdj \"स्वादिष्ट\" ;\n    Boring = regAdj \"अरुचिकर\" ;\n\n  oper\n    mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \n      \\s,p,g -> {\n        s = table {\n          Sg => s ;\n          Pl => p\n          } ;\n        g = g\n      } ;\n\n    regN : Str -> {s : Number => Str ; g : Gender} = \\s -> case s of {\n      lark + \"ा\" => mkN s (lark + \"े\") Masc ;\n      lark + \"ी\" => mkN s (lark + \"ीयँा\") Fem ;\n      _           => mkN s s Masc \n      } ;\n\n    mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \\ms,mp,f -> {\n      s = table {\n        Masc => table {\n          Sg => ms ;\n          Pl => mp\n          } ;\n        Fem  => \\\\_ => f\n        }\n      } ;\n\n    regAdj : Str -> {s : Gender => Number => Str} = \\a -> case a of {\n      acch + \"ा\" => mkAdj a (acch + \"े\") (acch + \"ी\") ;\n      _          => mkAdj a a a\n      } ;\n\n    copula : Number -> Str = \\n -> case n of {\n      Sg => \"है\" ;\n      Pl => \"हैं\"\n      } ;\n\n  }\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsI.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\nincomplete concrete FoodsI of Foods = \n    open Syntax, LexFoods in {\n  lincat\n    Comment = Utt ; \n    Item = NP ;\n    Kind = CN ;\n    Quality = AP ;\n  lin\n    Pred item quality = mkUtt (mkCl item quality) ;\n    This kind = mkNP this_Det kind ;\n    That kind = mkNP that_Det kind ;\n    These kind = mkNP these_Det kind ;\n    Those kind = mkNP those_Det kind ;\n    Mod quality kind = mkCN quality kind ;\n    Very quality = mkAP very_AdA quality ;\n\n    Wine = mkCN wine_N ;\n    Pizza = mkCN pizza_N ;\n    Cheese = mkCN cheese_N ;\n    Fish = mkCN fish_N ;\n    Fresh = mkAP fresh_A ;\n    Warm = mkAP warm_A ;\n    Italian = mkAP italian_A ;\n    Expensive = mkAP expensive_A ;\n    Delicious = mkAP delicious_A ;\n    Boring = mkAP boring_A ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsIce.gf",
    "content": "--# -path=.:prelude\n\n-- (c) 2009 Martha Dis Brandt under LGPL\n\nconcrete FoodsIce of Foods = open Prelude in {\n\n  flags coding=utf8;\n\n  lincat\n    Comment = SS ;\n    Quality = {s : Gender => Number => Defin => Str} ;\n    Kind = {s : Number => Str ; g : Gender} ;\n    Item = {s : Str ; g : Gender ; n : Number} ;\n\n  lin\n    Pred item quality =  ss (item.s ++ copula item.n ++ quality.s ! item.g ! item.n ! Ind) ;\n         This, That  = det Sg \"þessi\"   \"þessi\"  \"þetta\" ;\n         These, Those = det Pl \"þessir\" \"þessar\" \"þessi\" ;\n    Mod quality kind = { s = \\\\n => quality.s ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ;\n         Wine = noun \"vín\" \"vín\" Neutr ;\n         Cheese = noun \"ostur\" \"ostar\" Masc ;\n         Fish = noun \"fiskur\" \"fiskar\" Masc ;\n         -- the word \"pizza\" is more commonly used in Iceland, but \"flatbaka\" is the Icelandic word for it\n         Pizza = noun \"flatbaka\" \"flatbökur\" Fem ;\n    Very qual = {s = \\\\g,n,defOrInd => \"mjög\" ++ qual.s ! g ! n ! defOrInd } ;\n         Fresh = regAdj \"ferskur\" ;\n         Warm = regAdj \"heitur\" ;\n         Boring = regAdj \"leiðinlegur\" ;\n         -- the order of the given adj forms is: mSg fSg nSg mPl fPl nPl mSgDef f/nSgDef _PlDef\n         Italian = adjective \"ítalskur\" \"ítölsk\" \"ítalskt\" \"ítalskir\" \"ítalskar\" \"ítölsk\" \"ítalski\" \"ítalska\" \"ítalsku\" ;\n         Expensive = adjective \"dýr\" \"dýr\" \"dýrt\" \"dýrir\" \"dýrar\" \"dýr\" \"dýri\" \"dýra\" \"dýru\" ;\n         Delicious = adjective \"ljúffengur\" \"ljúffeng\" \"ljúffengt\" \"ljúffengir\" \"ljúffengar\" \"ljúffeng\" \"ljúffengi\" \"ljúffenga\" \"ljúffengu\" ;\n\n  param\n    Number = Sg | Pl ;\n    Gender = Masc | Fem | Neutr ;\n    Defin = Ind | Def ;\n\n  oper\n    det : Number -> Str -> Str -> Str -> {s : Number => Str ; g : Gender} ->\n        {s : Str ; g : Gender ; n : Number} =\n      \\n,masc,fem,neutr,cn -> {\n        s = case cn.g of {Masc => masc ; Fem => fem; Neutr => neutr } ++ cn.s ! n ;\n        g = cn.g ;\n        n = n\n      } ;\n\n    noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =\n      \\man,men,g -> {\n        s = table {\n          Sg => man ;\n          Pl => men\n          } ;\n        g = g\n      } ;\n\n    adjective : (x1,_,_,_,_,_,_,_,x9 : Str) -> {s : Gender => Number => Defin => Str} =\n      \\ferskur,fersk,ferskt,ferskir,ferskar,fersk_pl,ferski,ferska,fersku -> {\n         s = \\\\g,n,t => case <g,n,t> of {\n            < Masc, Sg, Ind > => ferskur ;\n            < Masc, Pl, Ind > => ferskir ;\n            < Fem, Sg, Ind > => fersk ;\n            < Fem, Pl, Ind > => ferskar ;\n            < Neutr, Sg, Ind > => ferskt ;\n            < Neutr, Pl, Ind > => fersk_pl;\n            < Masc, Sg, Def > => ferski ;\n            < Fem, Sg, Def > | < Neutr, Sg, Def > => ferska ;\n            < _ , Pl, Def > => fersku\n            }\n          } ;\n\n    regAdj : Str -> {s : Gender => Number => Defin => Str} = \\ferskur ->\n      let fersk = Predef.tk 2 ferskur\n      in adjective\n        ferskur fersk (fersk + \"t\")\n        (fersk + \"ir\") (fersk + \"ar\") fersk\n        (fersk + \"i\") (fersk + \"a\") (fersk + \"u\") ;\n\n    copula : Number -> Str =\n      \\n -> case n of {\n        Sg => \"er\" ;\n        Pl => \"eru\"\n        } ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsIta.gf",
    "content": "--# -path=.:present\n\n-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsIta of Foods = FoodsI with \n  (Syntax = SyntaxIta),\n  (LexFoods = LexFoodsIta) ;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsJpn.gf",
    "content": "--# -path=.:../lib/src/prelude\n\n-- (c) 2009 Zofia Stankiewicz under LGPL\n\nconcrete FoodsJpn of Foods = open Prelude in {\n\nflags coding=utf8 ;\n\n  lincat\n    Comment = {s: Style => Str};\n    Quality = {s: AdjUse => Str ; t: AdjType} ;\n    Kind = {s : Number => Str} ; \n    Item = {s : Str ; n : Number} ; \n\n  lin\n    Pred item quality = {s = case quality.t of {\n      IAdj => table {Plain => item.s ++ quality.s ! APred ; Polite => item.s ++ quality.s ! APred ++ copula ! Polite ! item.n } ;\n      NaAdj => \\\\p => item.s ++ quality.s ! APred ++ copula ! p ! item.n } \n      } ;\n    This  = det Sg \"この\" ;\n    That  = det Sg \"その\" ;\n    These = det Pl \"この\" ;\n    Those = det Pl \"その\" ;\n    Mod quality kind = {s = \\\\n => quality.s ! Attr ++ kind.s ! n} ;\n    Wine = regNoun \"ワインは\" ;\n    Cheese = regNoun \"チーズは\" ;\n    Fish = regNoun \"魚は\" ;\n    Pizza = regNoun \"ピザは\" ;\n    Very quality =  {s = \\\\a => \"とても\" ++ quality.s ! a ; t = quality.t } ;\n    Fresh = adj \"新鮮な\" \"新鮮\";\n    Warm = regAdj \"あたたかい\" ;\n    Italian = adj \"イタリアの\" \"イタリアのもの\";\n    Expensive = regAdj \"たかい\" ;\n    Delicious = regAdj \"おいしい\" ;\n    Boring = regAdj \"つまらない\" ;\n\n  param\n    Number = Sg | Pl ;\n    AdjUse = Attr | APred ;        -- na-adjectives have different forms as noun attributes and predicates\n    Style = Plain | Polite ;      -- for phrase types\n    AdjType = IAdj | NaAdj ;      -- IAdj can form predicates without the copula, NaAdj cannot\n\n  oper\n    det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n      \\n,d,cn -> {\n        s = d ++ cn.s ! n ;\n        n = n\n      } ;\n   noun : Str -> Str -> {s : Number => Str} = \n      \\sakana,sakana -> {s = \\\\_ => sakana } ;\n\n   regNoun : Str -> {s : Number => Str} = \n      \\sakana -> noun sakana sakana ;\n\n   adj : Str -> Str -> {s : AdjUse => Str ; t : AdjType} =\n      \\chosenna, chosen -> {\n       s = table { \n         Attr => chosenna ;\n         APred => chosen\n       } ;\n       t = NaAdj \n      } ;\n   \n   regAdj : Str -> {s: AdjUse => Str ; t : AdjType} =\\akai -> {\n     s = \\\\_ => akai ; t = IAdj} ;\n\n    copula : Style => Number => Str = \n      table { \n        Plain => \\\\_ => \"だ\" ;\n        Polite => \\\\_ => \"です\" } ;\n\n}   \n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsLav.gf",
    "content": "--# -path=.:prelude\n\n-- (c) 2009 Inese Bernsone under LGPL\n\nconcrete FoodsLav of Foods = open Prelude in {\n\n  flags\n    coding=utf8 ;\n    \n  lincat\n    Comment = SS ; \n    Quality = {s : Q => Gender => Number => Defin => Str } ; \n    Kind = {s : Number => Str ; g : Gender} ; \n    Item = {s : Str ; g : Gender ; n : Number } ; \n\n  lin\n    Pred item quality = ss (item.s ++ {- copula item.n -} \"ir\" ++ quality.s ! Q1 ! item.g ! item.n ! Ind ) ;\n      This  = det Sg \"šis\" \"šī\" ;\n      That  = det Sg \"tas\" \"tā\" ;\n      These = det Pl \"šie\" \"šīs\" ;\n      Those = det Pl \"tie\" \"tās\" ;\n    Mod quality kind = {s = \\\\n => quality.s ! Q1 ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ;\n      Wine = noun \"vīns\" \"vīni\" Masc ;\n      Cheese = noun \"siers\" \"sieri\" Masc ;\n      Fish = noun \"zivs\" \"zivis\" Fem ;\n      Pizza = noun \"pica\" \"picas\" Fem ;\n    Very qual = {s = \\\\q,g,n,spec => \"ļoti\" ++ qual.s ! Q2 ! g ! n ! spec }; \n \n      Fresh = adjective \"svaigs\" \"svaiga\" \"svaigi\" \"svaigas\" \"svaigais\" \"svaigā\" \"svaigie\" \"svaigās\" ;\n      Warm = regAdj \"silts\" ;\n      Italian = specAdj \"itāļu\" (regAdj \"itālisks\") ;\n      Expensive = regAdj \"dārgs\" ;\n      Delicious = regAdj \"garšīgs\" ;\n      Boring = regAdj \"garlaicīgs\" ;\n\n  param\n    Number = Sg | Pl ;\n    Gender = Masc | Fem ;\n    Defin = Ind | Def ;\n    Q = Q1 | Q2 ;\n\n  oper\n   det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> \n        {s : Str ; g : Gender ; n : Number} = \n      \\n,m,f,cn -> {\n        s = case cn.g of {Masc => m ; Fem => f} ++ cn.s ! n ;\n        g = cn.g ;\n        n = n\n      } ;\n    noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \n      \\man,men,g -> {\n        s = table {\n          Sg => man ;\n          Pl => men \n          } ;\n        g = g\n      } ;\n    adjective : (_,_,_,_,_,_,_,_ : Str) -> {s : Q => Gender => Number => Defin => Str} = \n      \\skaists,skaista,skaisti,skaistas,skaistais,skaistaa,skaistie,skaistaas -> {\n        s = table {\n\t\t  _ => table {\n            Masc => table {\n              Sg => table {Ind => skaists ; Def => skaistais} ;\n              Pl => table {Ind => skaisti ; Def => skaistie}\n              } ; \n            Fem => table {\n              Sg => table {Ind => skaista ; Def => skaistaa} ;\n              Pl => table {Ind => skaistas ; Def => skaistaas} \n              }\n            } \n\t\t  }\n        } ;\n      \n {-   irregAdj : Str -> {s : Gender => Number => Defin => Str} = \\itaalju ->\n     let itaalju = itaalju\n     in adjective itaalju (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) ; -}\n     \n    regAdj : Str -> {s : Q => Gender => Number => Defin => Str} = \\skaists ->\n      let skaist = init skaists \n      in adjective skaists (skaist + \"a\") (skaist + \"i\") (skaist + \"as\") (skaist + \"ais\") (skaist + \"ā\") (skaist + \"ie\") (skaist + \"ās\");\n\n    Adjective : Type = {s : Q => Gender => Number => Defin => Str} ;\n\n\tspecAdj : Str -> Adjective -> Adjective = \\s,a -> {\n      s = table {\n        Q2 => a.s ! Q1 ;\n        Q1 => \\\\_,_,_ => s\n        }\t\t\n\t  } ;\n\t\n\t}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsMlt.gf",
    "content": "-- (c) 2013 John J. Camilleri under LGPL\n\nconcrete FoodsMlt of Foods = open Prelude in {\n  flags coding=utf8 ;\n\n  lincat\n    Comment = SS ;\n    Quality = {s : Gender => Number => Str} ;\n    Kind = {s : Number => Str ; g : Gender} ;\n    Item = {s : Str ; g : Gender ; n : Number} ;\n\n  lin\n    -- Pred item quality = ss (item.s ++ copula item.n item.g ++ quality.s ! item.g ! item.n) ;\n    Pred item quality = ss (item.s ++ quality.s ! item.g ! item.n) ;\n\n    This kind = det Sg \"dan\" \"din\" kind ;\n    That kind = det Sg \"dak\" \"dik\" kind ;\n    These kind = det Pl \"dawn\" \"\" kind ;\n    Those kind = det Pl \"dawk\" \"\" kind ;\n\n    Mod quality kind = {\n      s = \\\\n => kind.s ! n ++ quality.s ! kind.g ! n ;\n      g = kind.g\n      } ;\n\n    Wine = noun \"inbid\" \"inbejjed\" Masc ;\n    Cheese = noun \"ġobon\" \"ġobniet\" Masc ;\n    Fish = noun \"ħuta\" \"ħut\" Fem ;\n    Pizza = noun \"pizza\" \"pizzez\" Fem ;\n\n    Very qual = {s = \\\\g,n => qual.s ! g ! n ++ \"ħafna\"} ;\n\n    Warm = adjective \"sħun\" \"sħuna\" \"sħan\" ;\n    Expensive = adjective \"għali\" \"għalja\" \"għaljin\" ;\n    Delicious = adjective \"tajjeb\" \"tajba\" \"tajbin\" ;\n    Boring = uniAdj \"tad-dwejjaq\" ;\n    Fresh = regAdj \"frisk\" ;\n    Italian = regAdj \"Taljan\" ;\n\n  param\n    Number = Sg | Pl ;\n    Gender = Masc | Fem ;\n\n  oper\n    --Create an adjective (full function)\n    --Params: Sing Masc, Sing Fem, Plural\n    adjective : (_,_,_ : Str) -> {s : Gender => Number => Str} = \\iswed,sewda,suwed -> {\n      s = table {\n\tMasc => table {\n\t  Sg => iswed ;\n\t  Pl => suwed\n\t  } ;\n\tFem => table {\n\t  Sg => sewda ;\n\t  Pl => suwed\n\t  }\n\t}\n      } ;\n\n    --Create a regular adjective\n    --Param: Sing Masc\n    regAdj : Str -> {s : Gender => Number => Str} = \\frisk ->\n      adjective frisk (frisk + \"a\") (frisk + \"i\") ;\n\n    --Create a \"uni-adjective\" eg tal-buzz\n    --Param: Sing Masc\n    uniAdj : Str -> {s : Gender => Number => Str} = \\uni ->\n      adjective uni uni uni ;\n\n    --Create a noun\n    --Params: Singular, Plural, Gender (inherent)\n    noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \\ktieb,kotba,g -> {\n      s = table {\n\tSg => ktieb ;\n\tPl => kotba\n\t} ;\n      g = g\n      } ;\n\n    --Copula is a linking verb\n    --Params: Number, Gender\n    -- copula : Number -> Gender -> Str = \\n,g -> case n of {\n    --   Sg => case g of { Masc => \"huwa\" ; Fem => \"hija\" } ;\n    --   Pl => \"huma\"\n    --   } ;\n\n    --Create an article, taking into account first letter of next word\n    article = pre {\n      \"a\"|\"e\"|\"i\"|\"o\"|\"u\" => \"l-\" ;\n      --cons@(\"ċ\"|\"d\"|\"n\"|\"r\"|\"s\"|\"t\"|\"x\"|\"ż\") => \"i\" + cons + \"-\" ;\n      _ => \"il-\"\n      } ;\n\n    --Create a determinant\n    --Params: Sg/Pl, Masc, Fem\n    det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> {s : Str ; g : Gender ; n : Number} = \\n,m,f,cn -> {\n      s = case n of {\n\tSg => case cn.g of {Masc => m ; Fem => f}; --string\n\tPl => m --default to masc\n\t} ++ article ++ cn.s ! n ;\n      g = cn.g ; --gender\n      n = n --number\n      } ;\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsMon.gf",
    "content": "--# -path=.:/GF/lib/src/prelude\n\n-- (c) 2009 Nyamsuren Erdenebadrakh under LGPL\n\nconcrete FoodsMon of Foods = open Prelude in {\n  flags coding=utf8;\n\n  lincat\n    Comment, Quality = SS ; \n\tKind = {s : Number => Str} ; \n    Item = {s : Str ; n : Number} ; \n\n  lin\n\tPred item quality = ss (item.s ++ \"бол\" ++ quality.s) ;\n\tThis  = det Sg \"энэ\" ;\n\tThat  = det Sg \"тэр\" ;\n\tThese = det Pl \"эдгээр\" ;\n\tThose = det Pl \"тэдгээр\" ;\n\tMod quality kind = {s = \\\\n => quality.s ++ kind.s ! n} ;\n\tWine = regNoun \"дарс\" ;\n\tCheese = regNoun \"бяслаг\" ;\n\tFish = regNoun \"загас\" ;\n\tPizza = regNoun \"пицца\" ;\n\tVery = prefixSS \"маш\" ;\n\tFresh = ss \"шинэ\" ;\n\tWarm = ss \"халуун\" ;\n\tItalian = ss \"итали\" ;\n\tExpensive = ss \"үнэтэй\" ;\n\tDelicious = ss \"амттай\" ;\n\tBoring = ss \"амтгүй\" ;\n\n  param\n    Number = Sg | Pl ;\n\n  oper\n\tdet : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n\t\\n,d,cn -> {\n\t\ts = d ++ cn.s ! n ;\n\t\tn = n\n\t} ;\n  \t\n\tregNoun : Str -> {s : Number => Str} = \n\t\\x -> {s = table {\n\t\tSg => x ; \n\t\tPl => x + \"нууд\"}\n\t\t} ;\n\t}\n\t \n    \n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsNep.gf",
    "content": "-- (c) 2011 Dinesh Simkhada under LGPL\n\nconcrete FoodsNep of Foods = {\n\n  flags coding = utf8 ;\n\n  lincat\n    Comment, Quality = {s : Str} ; \n    Kind = {s : Number => Str} ; \n    Item = {s : Str ; n : Number} ; \n    \n  lin\n    Pred item quality = \n      {s = item.s ++ quality.s ++ copula ! item.n} ;\n      \n    This  = det Sg \"यो\" ;\n    That  = det Sg \"त्यो\" ;\n    These = det Pl \"यी\" ;\n    Those = det Pl \"ती\" ;\n    Mod quality kind = \n      {s = \\\\n => quality.s ++ kind.s ! n} ;\n      \n    Wine = regNoun \"रक्सी\" ;\n    Cheese = regNoun \"चिज\" ;\n    Fish = regNoun \"माछा\" ;\n    Pizza = regNoun \"पिज्जा\" ;\n    Very a = {s = \"धेरै\" ++ a.s} ;\n    Fresh = adj \"ताजा\" ;\n    Warm = adj \"तातो\" ;\n    Italian = adj \"इटालियन\" ;\n    Expensive = adj \"महँगो\" | adj \"बहुमूल्य\" ;\n    Delicious = adj \"स्वादिष्ट\" | adj \"मीठो\" ;\n    Boring = adjPl \"नमिठो\" ;\n  \n  param\n    Number = Sg | Pl ;\n    \n  oper\n    det : Number -> Str -> \n      {s : Number => Str} -> {s : Str ; n : Number} = \n        \\n,det,noun -> {s = det ++ noun.s ! n ; n = n} ;\n    \n    noun : Str -> Str -> {s : Number => Str} = \n      \\man,men -> {s = table {Sg => man ; Pl => men}} ;\n    \n    regNoun : Str -> {s : Number => Str} = \n      \\car -> noun car (car + \"हरु\") ;\n    \n    adjPl : Str -> {s : Str} = \\a -> case a of {\n      bor + \"ठो\" => adj (bor + \"ठा\") ;\n      _ => adj a\n      } ;\n      \n    adj : Str -> {s : Str} = \n      \\cold -> {s = cold} ;\n    \n    copula : Number => Str = \n      table {Sg => \"छ\" ; Pl => \"छन्\"} ;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsOri.gf",
    "content": "concrete FoodsOri of Foods = {\r\n\r\nflags coding = utf8 ;\r\n\r\nlincat\r\n    Comment = Str;\r\n    Item = Str;\r\n    Kind = Str;\r\n    Quality = Str;\r\n\r\nlin\r\n    Pred item quality = item ++ quality ++ \"ଅଟେ\";\r\n    This kind = \"ଏଇ\" ++ kind;\r\n    That kind = \"ସେଇ\" ++ kind;\r\n    These kind = \"ଏଇ\" ++ kind ++ \"ଗୁଡିକ\" ;\r\n    Those kind = \"ସେଇ\" ++ kind ++ \"ଗୁଡିକ\" ;\r\n    Mod quality kind = quality ++ kind;\r\n    Wine  = \"ମଦ\";\r\n    Cheese  = \"ଛେନା\";\r\n    Fish  = \"ମାଛ\";\r\n    Pizza = \"ପିଜଜ଼ା\" ;\r\n    Very quality = \"ଅତି\" ++ quality;\r\n    Fresh  = \"ତାଜା\";\r\n    Warm  = \"ଗରମ\";\r\n    Italian  = \"ଇଟାଲି\";\r\n    Expensive  = \"ମୁଲ୍ୟବାନ୍\";\r\n    Delicious  = \"ସ୍ଵାଦିସ୍ଟ \";\r\n    Boring  = \"ଅରୁଚିକର\";\r\n\r\n}\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsPes.gf",
    "content": "concrete FoodsPes of Foods = {\r\n\r\n      flags optimize=noexpand ; coding=utf8 ;\r\n\t  \r\n      lincat\r\n        Comment = {s : Str} ;\r\n\t\tQuality = {s : Add => Str; prep : Str} ;\r\n        Kind = {s : Add => Number => Str ; prep : Str};\r\n        Item = {s : Str ; n : Number};\r\n      lin\r\n        Pred item quality = {s = item.s ++ quality.s ! Indep ++ copula ! item.n} ;\r\n        This = det Sg \"این\" ;\r\n        That = det Sg \"آن\" ;\r\n        These = det Pl \"این\" ;\r\n        Those = det Pl \"آن\" ;\r\n        \r\n        Mod quality kind = {s = \\\\a,n =>  kind.s ! Attr ! n ++ kind.prep ++ quality.s ! a ;                                  \r\n                            prep = quality.prep             \r\n                            };\r\n        Wine = regN \"شراب\" ; \r\n        Cheese = regN \"پنیر\" ;\r\n        Fish = regN \"ماهى\" ;\r\n        Pizza = regN \"پیتزا\" ;\r\n        Very a = {s = \\\\at => \"خیلی\" ++ a.s ! at ; prep = a.prep} ;\r\n        Fresh = adj \"تازه\" ;\r\n        Warm = adj \"گرم\" ;\r\n        Italian = adj \"ایتالیایی\" ;\r\n        Expensive = adj \"گران\" ;\r\n        Delicious = adj \"لذىذ\" ;\r\n        Boring = adj \"ملال آور\" ;  -- it must be written as ملال آور. \r\n     \r\n     param\r\n        Number = Sg | Pl ;\r\n\t\tAdd = Indep | Attr ;\r\n     oper\r\n        det : Number -> Str -> {s: Add => Number => Str ; prep : Str} -> {s : Str ; n: Number} =\r\n           \\n,det,noun -> {s = det ++ noun.s ! Indep ! n ; n = n };\r\n           \r\n        noun : (x1,_,_,x4 : Str) -> {s : Add => Number => Str ; prep : Str} = \\pytzA, pytzAy, pytzAhA,pr -> \r\n         {s = \\\\a,n => case <a,n> of\r\n\t\t        {<Indep,Sg> => pytzA ; <Indep,Pl> => pytzAhA ;\r\n  \t\t\t\t <Attr,Sg>  =>pytzA ; <Attr,Pl>  => pytzAhA + \"ى\" };\r\n\t\t prep = pr\r\n\t\t };\t\t \r\n         \r\n        regN : Str -> {s: Add => Number => Str ; prep : Str} = \\mrd -> \r\n\t\tcase mrd of \r\n\t\t{ _ + (\"ا\"|\"ه\"|\"ى\"|\"و\"|\"\") => noun mrd (mrd+\"ى\") (mrd + \"ها\") \"\";\r\n\t\t  _                        => noun mrd mrd (mrd + \"ها\") \"e\"\r\n\t\t};\r\n        \r\n        adj : Str -> {s : Add => Str; prep : Str} = \\tAzh -> \r\n\t\tcase tAzh of \r\n\t\t{ _ + (\"ا\"|\"ه\"|\"ى\"|\"و\"|\"\") => mkAdj tAzh (tAzh ++ \"ى\") \"\" ;\r\n\t\t  _                        => mkAdj tAzh tAzh \"ه\"\r\n        };\r\n\t\t\r\n\t\tmkAdj : Str -> Str -> Str -> {s : Add => Str; prep : Str} = \\tAzh, tAzhy, pr  ->\r\n\t\t{s = table {Indep => tAzh;\r\n\t\t            Attr => tAzhy};\r\n\t\t prep = pr \t\t\t\r\n\t\t};\r\n        copula : Number => Str = table {Sg => \"است\"; Pl => \"هستند\"};\r\n      \r\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsPor.gf",
    "content": "-- (c) 2009 Rami Shashati under LGPL\n\nconcrete FoodsPor of Foods = open Prelude in {\n  flags coding=utf8;\n\n\tlincat\n\t  Comment = {s : Str} ;\n\t  Quality = {s : Gender => Number => Str} ;\n\t  Kind = {s : Number => Str ; g : Gender} ;\n\t  Item = {s : Str ; n : Number ; g : Gender } ;\n\n\tlin\n\t  Pred item quality =\n\t    {s = item.s ++ copula ! item.n ++ quality.s ! item.g ! item.n } ;\n\t  This = det Sg (table {Masc => \"este\" ; Fem => \"esta\"}) ;\n\t  That = det Sg (table {Masc => \"esse\" ; Fem => \"essa\"}) ;\n\t  These = det Pl (table {Masc => \"estes\" ; Fem => \"estas\"}) ;\n\t  Those = det Pl (table {Masc => \"esses\" ; Fem => \"essas\"}) ;\n\n\t  Mod quality kind = { s = \\\\n => kind.s ! n ++ quality.s ! kind.g ! n ; g = kind.g } ;\n\n\t  Wine = regNoun \"vinho\" Masc ;\n\t  Cheese = regNoun \"queijo\" Masc ;\n\t  Fish = regNoun \"peixe\" Masc ;\n\t  Pizza = regNoun \"pizza\" Fem ;\n\n      Very a = { s = \\\\g,n => \"muito\" ++ a.s ! g ! n } ;\n\n      Fresh = mkAdjReg \"fresco\" ;\n      Warm = mkAdjReg \"quente\" ;\n      Italian = mkAdjReg \"Italiano\" ;\n      Expensive = mkAdjReg \"caro\" ;\n      Delicious = mkAdjReg \"delicioso\" ;\n      Boring = mkAdjReg \"chato\" ;\n\n\tparam\n\t  Number = Sg | Pl ;\n\t  Gender = Masc | Fem ;\n\n\toper\n\t  QualityT : Type = {s : Gender => Number => Str} ;\n\n\t  mkAdj : (_,_,_,_ : Str) -> QualityT = \\bonito,bonita,bonitos,bonitas -> {\n\t  \ts = table {\n\t  \t\tMasc => table { Sg => bonito ; Pl => bonitos } ;\n\t  \t\tFem => table { Sg => bonita ; Pl => bonitas }\n\t    } ;\n\t  } ;\n\n\t  -- regular pattern\n\t  adjSozinho : Str -> QualityT = \\sozinho ->\n        let sozinh = Predef.tk 1 sozinho\n        in mkAdj sozinho (sozinh + \"a\") (sozinh + \"os\") (sozinh + \"as\") ;\n\n      -- for gender-independent adjectives\n      adjUtil : Str -> Str -> QualityT = \\util,uteis ->\n        mkAdj util util uteis uteis ;\n\n      -- smart paradigm for adjcetives\n      mkAdjReg : Str -> QualityT = \\a -> case last a of {\n      \t\"o\" => adjSozinho a ;\n        \"e\" => adjUtil a (a + \"s\")\n      } ;\n\n      ItemT : Type = {s : Str ; n : Number ; g : Gender } ;\n\n      det : Number -> (Gender => Str) -> KindT -> ItemT =\n        \\num,det,noun -> {s = det ! noun.g ++ noun.s ! num ; n = num ; g = noun.g } ;\n\n\t  KindT : Type = {s : Number => Str ; g : Gender} ;\n\n\t  noun : Str -> Str -> Gender -> KindT =\n\t    \\animal,animais,gen -> {s = table {Sg => animal ; Pl => animais} ; g = gen } ;\n\n\t  regNoun : Str -> Gender -> KindT =\n\t    \\carro,gen -> noun carro (carro + \"s\") gen ;\n\n\t  copula : Number => Str = table {Sg => \"é\" ; Pl => \"são\"} ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsRon.gf",
    "content": "-- (c) 2009 Ramona Enache under LGPL\r\n\r\nconcrete FoodsRon of Foods = \r\n{\r\nflags coding=utf8 ;\r\n\r\nparam Number = Sg | Pl ;\r\n      Gender = Masc | Fem ;\r\n      NGender = NMasc | NFem | NNeut ;\r\nlincat \r\nComment = {s : Str};\r\nQuality = {s : Number => Gender => Str};\r\nKind = {s : Number => Str; g : NGender};\r\nItem = {s : Str ; n : Number; g : Gender};\r\n\r\nlin\r\n\r\nThis = det Sg (mkTab \"acest\" \"această\");\r\nThat = det Sg (mkTab \"acel\" \"acea\");\r\nThese = det Pl (mkTab \"acești\" \"aceste\");\r\nThose = det Pl (mkTab \"acei\" \"acele\");\r\n\r\nWine = mkNoun \"vin\" \"vinuri\" NNeut ;\r\nCheese = mkNoun \"brânză\" \"brânzeturi\" NFem ;\r\nFish = mkNoun \"peşte\" \"peşti\" NMasc ;\r\nPizza = mkNoun \"pizza\" \"pizze\" NFem;\r\n\r\nVery a = {s = \\\\n,g => \"foarte\" ++ a.s ! n ! g};\r\n\r\nFresh = mkAdj \"proaspăt\" \"proaspătă\" \"proaspeţi\" \"proaspete\" ;\r\nWarm = mkAdj \"cald\" \"caldă\" \"calzi\" \"calde\" ;\r\nItalian = mkAdj \"italian\" \"italiană\" \"italieni\" \"italiene\" ;\r\nExpensive = mkAdj \"scump\" \"scumpă\" \"scumpi\" \"scumpe\" ;\r\nDelicious = mkAdj \"delicios\" \"delcioasă\" \"delicioşi\" \"delicioase\" ;\r\nBoring = mkAdj \"plictisitor\" \"plictisitoare\" \"plictisitori\" \"plictisitoare\" ;\r\n\r\nPred item quality = {s = item.s ++ copula ! item.n ++ quality.s ! item.n ! item.g} ;\r\n\r\nMod quality kind = {s = \\\\n => kind.s ! n ++ quality.s ! n ! (getAgrGender kind.g n) ; g = kind.g};\r\n\r\noper \r\n\r\nmkTab : Str -> Str -> {s : Gender => Str} = \\acesta, aceasta ->\r\n{s = table{Masc => acesta;\r\n      Fem  => aceasta}};\r\n\r\ndet : Number -> {s : Gender => Str} -> {s : Number => Str ; g : NGender} -> {s : Str; n : Number; g : Gender} =\r\n\\n,det,noun -> let gg = getAgrGender noun.g n \r\n  in\r\n   {s =  det.s ! gg  ++ noun.s ! n  ; n = n ; g = gg};\r\n\r\nmkNoun : Str -> Str -> NGender -> {s : Number => Str; g : NGender} = \\peste, pesti,g ->\r\n{s = table {Sg => peste;\r\n            Pl => pesti};\r\n g = g\r\n};\r\n\r\noper mkAdj : (x1,_,_,x4 : Str) -> {s : Number => Gender => Str} = \\scump, scumpa, scumpi, scumpe ->\r\n{s = \\\\n,g => case <n,g> of\r\n{<Sg,Masc> => scump ; <Sg,Fem> => scumpa;\r\n<Pl,Masc> => scumpi ; <Pl,Fem> => scumpe\r\n}};\r\n\r\ncopula : Number => Str = table {Sg => \"este\" ; Pl => \"sunt\"};\r\n\r\ngetAgrGender : NGender -> Number -> Gender = \\ng,n ->\r\ncase <ng,n> of\r\n{<NMasc,_> => Masc ; <NFem,_> => Fem;\r\n<NNeut,Sg> => Masc ; <NNeut,Pl> => Fem\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsSpa.gf",
    "content": "--# -path=.:present\r\n\r\nconcrete FoodsSpa of Foods = open SyntaxSpa, StructuralSpa, ParadigmsSpa in {\r\n\r\n\tlincat\r\n\t\tComment = Utt ;\r\n\t\tItem = NP ;\r\n\t\tKind = CN ;\r\n\t\tQuality = AP ;\r\n\r\n\tlin\r\n\t\tPred item quality = mkUtt (mkCl item quality) ;\r\n\t\tThis kind = mkNP this_QuantSg kind ;\r\n\t\tThat kind = mkNP that_QuantSg kind ;\r\n\t\tThese kind = mkNP these_QuantPl kind ;\r\n\t\tThose kind = mkNP those_QuantPl kind ;\r\n\t\tMod quality kind = mkCN quality kind ;\r\n\t\tVery quality = mkAP very_AdA quality ;\r\n\t\tWine = mkCN (mkN \"vino\") ;\r\n                Pizza = mkCN (mkN \"pizza\") ;\r\n                Cheese = mkCN (mkN \"queso\") ;\r\n                Fish = mkCN (mkN \"pescado\") ;\r\n                Fresh = mkAP (mkA \"fresco\") ;\r\n                Warm = mkAP (mkA \"caliente\") ;\r\n                Italian = mkAP (mkA \"italiano\") ;\r\n                Expensive = mkAP (mkA \"caro\") ;\r\n                Delicious = mkAP (mkA \"delicioso\") ;\r\n                Boring = mkAP (mkA \"aburrido\") ;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsSwe.gf",
    "content": "--# -path=.:present\n\n-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsSwe of Foods = FoodsI with \n  (Syntax = SyntaxSwe),\n  (LexFoods = LexFoodsSwe) ** {flags language = sv_SE;} ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsTha.gf",
    "content": "--# -path=.:alltenses\r\n\r\nconcrete FoodsTha of Foods = open SyntaxTha, LexiconTha,\r\n  ParadigmsTha, (R=ResTha) in {\r\n\r\n        flags coding = utf8 ;\r\n\r\n\tlincat\r\n\t\tComment = Utt ;\r\n\t\tItem = NP ;\r\n\t\tKind = CN ;\r\n\t\tQuality = AP ;\r\n\r\n\tlin\r\n\t\tPred item quality = mkUtt (mkCl item quality) ;\r\n\t\tThis kind = mkNP this_Det kind ;\r\n\t\tThat kind = mkNP that_Det kind ;\r\n\t\tThese kind = mkNP these_Det kind ;\r\n\t\tThose kind = mkNP those_Det kind ;\r\n\t\tMod quality kind = mkCN quality kind ;\r\n\t\tVery quality = mkAP very_AdA quality ;\r\n\t\tWine = mkCN (mkN (R.thword \"เหล้าอ\" \"งุ่น\") \"ขวด\") ;\r\n                Pizza = mkCN (mkN (R.thword \"พิซ\" \"ซา\") \"ถาด\") ;\r\n                Cheese = mkCN (mkN (R.thword \"เนย\" \"แข็ง\") \"ก้อน\") ;\r\n                Fish = mkCN fish_N ;\r\n                Fresh = mkAP (mkA \"สด\") ;\r\n                Warm = mkAP warm_A ;\r\n                Italian = mkAP (mkA \" อิตาลี\") ;\r\n                Expensive = mkAP (mkA \"แพง\") ;\r\n                Delicious = mkAP (mkA \"อร่อย\") ;\r\n                Boring = mkAP (mkA (R.thword \"น่า\" \"เบิ่อ\")) ;\r\n\r\n}\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsTsn.gf",
    "content": "--# -path=alltenses\n\n-- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL\n\nconcrete FoodsTsn of Foods = open Prelude, Predef in {\n\tflags coding = utf8;\n\tlincat\n\t\tComment = {s:Str};\n\t\tItem = {s:Str; c:NounClass; n:Number};\n\t\tKind = {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool};\n\t\tQuality = {s: NounClass => Number => Str; p_form: Str; t: TType};\n\tlin\t\n\t\tPred item quality = {s = item.s ++ ((mkPredDescrCop quality.t) ! item.c ! item.n) ++ quality.p_form};\n\n\t\tThis kind = {s = (kind.w ! Sg) ++ (mkDemPron1 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg};\n\t\tThat kind = {s = (kind.w ! Sg) ++ (mkDemPron2 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg};\n\t\tThese kind = {s = (kind.w ! Pl) ++ (mkDemPron1 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl};\n\t\tThose kind = {s = (kind.w ! Pl) ++ (mkDemPron2 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl};\t\n\t\t\n\t\tMod quality kind = mkMod quality kind;\n\n\t-- Lexicon\n\t\tWine = mkNounNC14_6 \"jalwa\";\n\t\tCheese = mkNounNC9_10 \"kase\";\n\t\tFish = mkNounNC9_10 \"thlapi\";\n\t\tPizza = mkNounNC9_10 \"pizza\";\n\t\tVery quality = smartVery quality; \n\t\tFresh = mkVarAdj \"ntsha\";\n\t\tWarm = mkOrdAdj \"bothitho\";\n\t\tItalian = mkPerAdj \"Itali\";\n\t\tExpensive = mkVerbRel \"tura\"; \n\t\tDelicious = mkOrdAdj \"monate\";\n\t\tBoring = mkOrdAdj \"bosula\";\n\t\t\n\tparam\n\t\tNounClass = NC9_10 | NC14_6;\n\t\tNumber = Sg | Pl;\n\t\tTType = P | V | ModV | R ;\t\t\t\t\n\toper\n\t\tmkMod : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; \n\t\tb: Bool} = \\x,y -> case y.b of\n\t\t{\n\t\t\tTrue => {w = y.w; r = y.r; c = y.c; \n\t\t\t\tq = table {\n\t\t\t\tSg => ((y.q ! Sg) ++ \"le\" ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! \t\t\t\t\ty.c ! Sg) ++ (x.s ! y.c ! Sg)); \n\t\t\t\tPl => ((y.q ! Pl) ++ \"le\" ++ ((smartQualRelPart (x.t))! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! \t\t\t\t\ty.c ! Pl) ++(x.s ! y.c ! Pl))\n\t\t\t\t  }; b = True\n\t\t\t\t};\n\t\t\tFalse => {w = y.w; r = y.r; c = y.c; \n\t\t\t\tq = table {\n\t\t\t\tSg => ((y.q ! Sg) ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) \t\t\t\t\t++ (x.s ! y.c ! Sg)); \n\t\t\t\tPl => ((y.q ! Pl) ++ ((smartQualRelPart (x.t)) ! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) \t\t\t\t\t++(x.s ! y.c ! Pl))\n\t\t\t\t  }; b = True\n\t\t\t\t}\n\t\t};\n\n\t\tmkNounNC14_6 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \\x -> {w = table {Sg => \"bo\" + x; Pl => \"ma\" + x}; r = x; c = NC14_6; \n\t\tq = table {Sg => \"\"; Pl => \"\"}; b = False};\n\t\t\n\t\tmkNounNC9_10 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \\x -> {w = table {Sg => \"\" + x; Pl => \"di\" + x}; r = x; c = NC9_10; \n\t\tq = table {Sg => \"\"; Pl => \"\"}; b = False};\n\n\t\tmkVarAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x -> \n\t\t{\n\t\t\ts = table {\n\t\t\t\tNC9_10 => table {Sg => \"\" + x; Pl => \"di\" + x};\n\t\t\t\tNC14_6 => table {Sg => \"bo\" + x; Pl => \"ma\" + x}\n\t\t\t\t};\n\t\t\tp_form = x;\n\t\t\tt = R;\n\t\t};\n\n\t\tmkOrdAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x -> \n\t\t{\n\t\t\ts = table {\n\t\t\t\tNC9_10 => table {Sg => \"\" + x; Pl => \"\" + x};\n\t\t\t\tNC14_6 => table {Sg => \"\" + x; Pl => \"\" + x}\n\t\t\t\t};\n\t\t\tp_form = x;\n\t\t\tt = R;\n\t\t};\n\n\t\tmkVerbRel : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x -> \n\t\t{\n\t\t\ts = table {\n\t\t\t\tNC9_10 => table {Sg => x + \"ng\"; Pl => x + \"ng\"};\n\t\t\t\tNC14_6 => table {Sg => x + \"ng\"; Pl => x + \"ng\"}\n\t\t\t\t};\n\t\t\tp_form = x;\n\t\t\tt = V;\n\t\t};\n\n\t\tmkPerAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x -> \n\t\t{\n\t\t\ts = table {\n\t\t\t\tNC9_10 => table {Sg => \"\" + x; Pl => \"\" + x};\n\t\t\t\tNC14_6 => table {Sg => \"\" + x; Pl => \"\" + x}\n\t\t\t\t};\n\t\t\tp_form = \"mo\" ++ x;\n\t\t\tt = P;\n\t\t};\n\n\t\tmkVeryAdj : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x ->\n\t\t{\n\t\t\ts = table{c => table{n => (x.s!c!n) ++ \"thata\"}}; p_form = x.p_form ++ \"thata\"; t = x.t\n\t\t};\n\n\t\tmkVeryVerb : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x ->\n\t\t{\n\t\t\ts = table{c => table{n => (x.s!c!n) ++ \"thata\"}}; p_form = x.p_form ++ \"thata\"; t = ModV\n\t\t};\n\n\t\tsmartVery : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \n\\x -> case x.t of --(x.s!c!n)\n\t\t{\n\t\t\t(V | ModV)\t=>\tmkVeryVerb x;\n\t\t\t--ModV\t=>\tmkVeryVerb x;\n\t\t\t_\t=>\tmkVeryAdj x\n\t\t};\n\n\t\tmkDemPron1 : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"e\"; Pl => \"tse\"};\n\t\t\t\tNC14_6 => table {Sg => \"bo\"; Pl => \"a\"}\n\t\t\t};\n\t\t\n\t\tmkDemPron2 : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"eo\"; Pl => \"tseo\"};\n\t\t\t\tNC14_6 => table {Sg => \"boo\"; Pl => \"ao\"}\n\t\t\t};\n\n\t\tsmartQualRelPart : TType -> (NounClass => Number => Str) = \\x -> case x of \n\t\t{\n\t\t\tP\t=> mkQualRelPart_PName;\n\t\t\t_\t=> mkQualRelPart\n\t\t};\n\n\t\tmkQualRelPart : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"e\"; Pl => \"tse\"};\n\t\t\t\tNC14_6 => table {Sg => \"bo\"; Pl => \"a\"}\n\t\t\t};\n\n\t\tmkQualRelPart_PName : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"ya\"; Pl => \"tsa\"};\n\t\t\t\tNC14_6 => table {Sg => \"ba\"; Pl => \"a\"}\n\t\t\t};\n\n\t\tsmartDescrCop : TType -> (NounClass => Number => Str) = \\x -> case x of\n\t\t{\n\t\t\tP\t=> mkDescrCop_PName;\n\t\t\t_\t=> mkDescrCop\n\t\t};\n\n\t\tmkDescrCop : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"e\"; Pl => \"di\"};\n\t\t\t\tNC14_6 => table {Sg => \"bo\"; Pl => \"a\"}\n\t\t\t};\n\n\t\tmkDescrCop_PName : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"ga\"; Pl => \"ga\"};\n\t\t\t\tNC14_6 => table {Sg => \"ga\"; Pl => \"ga\"}\n\t\t\t};\n\n\t\tmkPredDescrCop : TType -> (NounClass => Number => Str) = \\x -> case x of\n\t\t\t{\n\t\t\t\tV => table \t{NC9_10 => table {Sg => \"e\" ++ \"a\"; Pl => \"di\" ++ \"a\"};\n\t\t\t\t\t\tNC14_6 => table {Sg => \"bo\" ++ \"a\"; Pl => \"a\" ++ \"a\"}};\n\n\t\t\t\t_ => table\t{NC9_10 => table {Sg => \"e\"; Pl => \"di\"};\n\t\t\t\t\t\tNC14_6 => table {Sg => \"bo\"; Pl => \"a\"}}\n\t\t\t};\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsTur.gf",
    "content": "{-\n  File      : FoodsTur.gf\n  Author    : Server Çimen\n  Version   : 1.0\n  Created on: August 26, 2009\n\n  This file contains concrete grammar of Foods abstract grammar for Turkish Language.\n  This grammar is to be used for Fridge demo and developed in the scope of GF Resource\n  Grammar Summer School.\n\n-}\n\nconcrete FoodsTur of Foods = open Predef in {\n  flags\n    coding=utf8 ;\n  lincat\n    Comment = {s : Str} ;\n    Quality = {s : Str ; c : Case; softness : Softness; h : Harmony} ;\n    Kind = {s : Case => Number => Str} ;\n    Item = {s : Str; n : Number} ;\n  lin\n    This = det Sg \"bu\" ;\n    That = det Sg \"şu\" ;\n    These = det Pl \"bu\" ;\n    Those = det Pl \"şu\" ;\n    -- Reason for excluding plural form of copula: In Turkish if subject is not a human being,\n    -- then singular form of copula is used regardless of the number of subject. Since all\n    -- possible subjects are non human, copula do not need to have plural form.\n    Pred item quality = {s = item.s ++ quality.s ++ \"&+\" ++ copula ! quality.softness ! quality.h} ;--! item.n} ;\n    Mod quality kind = {s = case quality.c of {\n                              Nom => \\\\t,n => quality.s ++ kind.s ! t ! n ;\n                              Gen => \\\\t,n => quality.s ++ kind.s ! Gen ! n\n                            }\n                       } ;\n    Wine = mkN \"şarap\" \"şaraplar\" \"şarabı\" \"şarapları\" ;\n    Cheese = mkN \"peynir\" \"peynirler\" \"peyniri\" \"peynirleri\" ;\n    Fish = mkN \"balık\" \"balıklar\" \"balığı\" \"balıkları\" ;\n    Pizza = mkN \"pizza\" \"pizzalar\" \"pizzası\" \"pizzaları\" ;\n    Very a = {s = \"çok\" ++ a.s ; c = a.c; softness = a.softness; h = a.h} ;\n    Fresh = adj \"taze\" Nom;\n    Warm = adj \"ılık\" Nom;\n    Italian = adj \"İtalyan\" Gen ;\n    Expensive = adj \"pahalı\" Nom;\n    Delicious = adj \"lezzetli\" Nom;\n    Boring = adj \"sıkıcı\" Nom;\n  param\n    Number = Sg | Pl ;\n    Case = Nom | Gen ;\n    Harmony = I_Har | Ih_Har | U_Har | Uh_Har ; --Ih = İ; Uh = Ü\n    Softness = Soft | Hard ;\n  oper\n    det : Number -> Str -> {s : Case => Number => Str} -> {s : Str; n : Number} =\n      \\num,det,noun -> {s = det ++ noun.s ! Nom ! num; n = num} ;\n    mkN = overload {\n      mkN : Str -> Str -> {s : Case => Number => Str} = regNoun ;\n      mkn : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = noun ;\n    } ;\n    regNoun : Str -> Str -> {s : Case => Number => Str} =\n      \\peynir,peynirler -> noun peynir peynirler [] [] ;\n    noun : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = \n      \\sarap,saraplar,sarabi,saraplari -> {\n        s = table {\n\t      Nom =>  table {\n\t\t\tSg => sarap ;\n\t\t\tPl => saraplar\n\t              } ;\n              Gen =>  table {\n                        Sg => sarabi ;\n\t\t\tPl => saraplari\n\t              }\n              }\n      };\n  {-\n    Since there is a bug in overloading, this overload is useless.\n\n    mkA = overload {\n      mkA : Str -> {s : Str; c : Case; softness : Softness; h : Harmony} = \\base -> adj base Nom ;\n      mkA : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} = adj ;\n    } ;\n  -}\n    adj : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} =\n      \\italyan,ca -> {s = italyan ; c = ca; softness = (getSoftness italyan); h = (getHarmony italyan)} ;\n    -- See the comment at lines 26 and 27 for excluded plural form of copula.\n    copula : Softness => Harmony {-=> Number-} => Str =\n      table {\n        Soft => table {\n                  I_Har => \"dır\" ;--table {\n\t\t\t   -- Sg => \"dır\" ;\n\t\t\t   -- Pl => \"dırlar\"\n\t\t  --} ;\n\t\t  Ih_Har => \"dir\" ;--table {\n\t\t\t    --Sg => \"dir\" ;\n\t\t\t    --Pl => \"dirler\"\n\t\t  --} ;\n\t\t  U_Har => \"dur\" ;--table {\n\t\t\t   -- Sg => \"dur\" ;\n\t\t\t   -- Pl => \"durlar\"\n\t\t  --} ;\n\t\t  Uh_Har => \"dür\" --table {\n\t\t\t    --Sg => \"dür\" ;\n\t\t\t    --Pl => \"dürler\"\n\t\t  --}\n        } ;\n        Hard => table {\n                  I_Har => \"tır\" ;--table {\n\t\t\t    --Sg => \"tır\" ;\n\t\t\t    --Pl => \"tırlar\"\n\t\t  --} ;\n\t\t  Ih_Har => \"tir\" ;--table {\n\t\t\t    --Sg => \"tir\" ;\n\t\t\t    --Pl => \"tirler\"\n\t\t  --} ;\n\t\t  U_Har => \"tur\" ;--table {\n\t\t\t   -- Sg => \"tur\" ;\n\t\t\t   -- Pl => \"turlar\"\n\t\t  --} ;\n\t\t  Uh_Har => \"tür\"--table {\n\t\t\t    --Sg => \"tür\" ;\n\t\t\t    --Pl => \"türler\"\n\t\t  --}\n        }\n      } ;\n\n    getHarmony : Str -> Harmony\n      = \\base -> case base of {\n                 _+c@(\"ı\"|\"a\"|\"i\"|\"e\"|\"u\"|\"o\"|\"ü\"|\"ö\")+\n                 (\"b\"|\"v\"|\"d\"|\"z\"|\"j\"|\"c\"|\"g\"|\"ğ\"|\"l\"|\"r\"|\"m\"|\"n\"|\"y\"|\"p\"|\"f\"|\"t\"|\"s\"|\"ş\"|\"ç\"|\"k\"|\"h\")* =>\n                    case c of {\n                      (\"ı\"|\"a\") => I_Har ;\n                      (\"i\"|\"e\") => Ih_Har ;\n                      (\"u\"|\"o\") => U_Har  ;\n                      (\"ü\"|\"ö\") => Uh_Har\n                    }\n        } ;\n    getSoftness : Str -> Softness\n      = \\base -> case base of {\n\t\t   _+(\"f\"|\"s\"|\"t\"|\"k\"|\"ç\"|\"ş\"|\"h\"|\"p\") => Hard ;\n\t\t   _ => Soft\n\t\t } ;\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/FoodsUrd.gf",
    "content": "-- (c) 2009 Shafqat Virk under LGPL\r\n\r\nconcrete FoodsUrd of Foods = {\r\n\r\n  flags coding=utf8 ;\r\n\r\n  \r\n\t  param Number = Sg | Pl ;\r\n        param Gender = Masc | Fem;\r\n\t  \r\n\t oper coupla : Number -> Str =\\n -> case n of {Sg => \"ہے\" ; Pl => \"ہیں\"};\r\n\t  \r\n\t \t  \r\n      lincat\r\n        Comment = {s : Str} ; \r\n\t  Item = {s: Str ; n: Number ; g:Gender};\r\n\t  Kind = {s: Number => Str ; g:Gender};\r\n        Quality = {s: Gender => Number => Str};\r\n  \r\n   lin\r\n    Pred item quality = {s = item.s ++ quality.s ! item.g ! item.n ++  coupla item.n} ;\r\n\tThis kind = {s = \"یھ\" ++ kind.s ! Sg; n= Sg ; g = kind.g } ;\r\n\tThese kind = {s = \"یھ\" ++ kind.s ! Pl; n = Pl ; g = kind.g} ;\r\n    That kind = {s = \"وہ\"  ++ kind.s ! Sg; n= Sg ; g = kind.g} ;\r\n\tThose kind = {s = \"وہ\" ++ kind.s ! Pl; n=Pl ; g = kind.g} ;\r\n    Mod quality kind = {s = \\\\n => quality.s ! kind.g ! n  ++ kind.s ! n ;  g = kind.g};\r\n\tWine = {s = table { Sg => \"شراب\" ; Pl => \"شرابیں\"} ; g = Fem};\r\n    Cheese = {s = table { Sg => \"پنیر\" ; Pl => \"پنیریں\"} ; g = Fem};\r\n    Fish = {s = table { Sg => \"مچھلی\" ; Pl => \"مچھلیاں\"} ; g = Fem};\r\n    Pizza = {s = table { Sg => \"پیزہ\" ; Pl => \"پیزے\"} ; g = Masc};\r\n\tVery quality = {s = \\\\g,n => \"بہت\" ++ quality.s ! g ! n} ;\r\n    Fresh = regAdj \"تازہ\" ;\r\n    Warm = regAdj \"گرم\" ;\r\n    Italian = regAdj \"اٹا لوی\" ;\r\n    Expensive = regAdj \"مہنگا\" ;\r\n    Delicious = regAdj \"مزیدار\" ;\r\n    Boring = regAdj \"فضول\" ;\r\n   \r\n   oper\r\n    regAdj : Str -> {s: Gender => Number => Str} = \\a -> case a of {\r\n        x + \"ا\" => mkAdj a (x+\"ے\") (x+\"ی\");\r\n        _      => mkAdj a a a\r\n       };\r\n    mkAdj : Str -> Str -> Str -> {s: Gender => Number => Str} = \\s,p,f -> {\r\n      s = table {\r\n           Masc => table {\r\n              Sg => s;\r\n              Pl => p\r\n              };\r\n           Fem => \\\\_ => f\r\n         }\r\n       };\r\n\t}  "
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/LexFoods.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\ninterface LexFoods = open Syntax in {\n  oper\n    wine_N : N ;\n    pizza_N : N ;\n    cheese_N : N ;\n    fish_N : N ;\n    fresh_A : A ;\n    warm_A : A ;\n    italian_A : A ;\n    expensive_A : A ;\n    delicious_A : A ;\n    boring_A : A ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/LexFoodsCat.gf",
    "content": "-- (c) 2009 Jordi Saludes under LGPL\n\ninstance LexFoodsCat of LexFoods = \n    open SyntaxCat, ParadigmsCat, (M = MorphoCat) in {\n  flags\n\tcoding = utf8 ;\n  oper\n    wine_N = mkN \"vi\" \"vins\" M.Masc ;\n    pizza_N = mkN \"pizza\" ;\n    cheese_N = mkN \"formatge\" ;\n    fish_N = mkN \"peix\" \"peixos\" M.Masc;\n    fresh_A = mkA \"fresc\" \"fresca\" \"frescos\" \"fresques\" \"frescament\";\n    warm_A = mkA \"calent\" ;\n    italian_A = mkA \"italià\" \"italiana\" \"italians\" \"italianes\" \"italianament\" ;\n    expensive_A = mkA \"car\" ;\n    delicious_A = mkA \"deliciós\" \"deliciosa\" \"deliciosos\" \"delicioses\" \"deliciosament\";\n    boring_A = mkA \"aburrit\" \"aburrida\" \"aburrits\" \"aburrides\" \"aburridament\" ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/LexFoodsFin.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\ninstance LexFoodsFin of LexFoods =\n    open SyntaxFin, ParadigmsFin in {\n  flags coding=utf8;\n  oper\n    wine_N = mkN \"viini\" ;\n    pizza_N = mkN \"pizza\" ;\n    cheese_N = mkN \"juusto\" ;\n    fish_N = mkN \"kala\" ;\n    fresh_A = mkA \"tuore\" ;\n    warm_A = mkA\n    (mkN \"lämmin\" \"lämpimän\" \"lämmintä\" \"lämpimänä\" \"lämpimään\"\n         \"lämpiminä\" \"lämpimiä\" \"lämpimien\" \"lämpimissä\" \"lämpimiin\"\n\t )\n    \"lämpimämpi\" \"lämpimin\" ;\n    italian_A = mkA \"italialainen\" ;\n    expensive_A = mkA \"kallis\" ;\n    delicious_A = mkA \"herkullinen\" ;\n    boring_A = mkA \"tylsä\" ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/LexFoodsGer.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\ninstance LexFoodsGer of LexFoods =\n    open SyntaxGer, ParadigmsGer in {\n  flags coding=utf8;\n  oper\n    wine_N = mkN \"Wein\" ;\n    pizza_N = mkN \"Pizza\" \"Pizzen\" feminine ;\n    cheese_N = mkN \"Käse\" \"Käse\" masculine ;\n    fish_N = mkN \"Fisch\" ;\n    fresh_A = mkA \"frisch\" ;\n    warm_A = mkA \"warm\" \"wärmer\" \"wärmste\" ;\n    italian_A = mkA \"italienisch\" ;\n    expensive_A = mkA \"teuer\" ;\n    delicious_A = mkA \"köstlich\" ;\n    boring_A = mkA \"langweilig\" ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/LexFoodsIta.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\ninstance LexFoodsIta of LexFoods = \n    open SyntaxIta, ParadigmsIta in {\n  oper\n    wine_N = mkN \"vino\" ;\n    pizza_N = mkN \"pizza\" ;\n    cheese_N = mkN \"formaggio\" ;\n    fish_N = mkN \"pesce\" ;\n    fresh_A = mkA \"fresco\" ;\n    warm_A = mkA \"caldo\" ;\n    italian_A = mkA \"italiano\" ;\n    expensive_A = mkA \"caro\" ;\n    delicious_A = mkA \"delizioso\" ;\n    boring_A = mkA \"noioso\" ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/LexFoodsSwe.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\ninstance LexFoodsSwe of LexFoods =\n    open SyntaxSwe, ParadigmsSwe in {\n  flags coding=utf8;\n  oper\n    wine_N = mkN \"vin\" \"vinet\" \"viner\" \"vinerna\" ;\n    pizza_N = mkN \"pizza\" ;\n    cheese_N = mkN \"ost\" ;\n    fish_N = mkN \"fisk\" ;\n    fresh_A = mkA \"färsk\" ;\n    warm_A = mkA \"varm\" ;\n    italian_A = mkA \"italiensk\" ;\n    expensive_A = mkA \"dyr\" ;\n    delicious_A = mkA \"läcker\" ;\n    boring_A = mkA \"tråkig\" ;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/ResCze.gf",
    "content": "-- (c) 2011 Katerina Bohmova under LGPL\n\nresource ResCze = open Prelude in {\n  flags \n    coding = utf8 ;\n  param\n    Number = Sg | Pl ;\n    Gender = Masc | Fem | Neutr;\n  oper\n    NounPhrase : Type = \n      {s : Str ; g : Gender ; n : Number} ; \n    Noun : Type = {s : Number => Str ; g : Gender} ;\n    Adjective : Type = {s : Gender => Number => Str} ;\n\n    det : Number -> Str -> Str -> Str -> Noun -> NounPhrase =\n      \\n,m,f,ne,cn -> {\n        s = table {Masc => m ; Fem => f; Neutr => ne} ! cn.g ++ \n            cn.s ! n ;\n        g = cn.g ;\n        n = n\n      } ;\n    noun : Str -> Str -> Gender -> Noun =\n      \\muz,muzi,g -> {\n        s = table {Sg => muz ; Pl => muzi} ;\n        g = g\n      } ;\n    adjective : (msg,fsg,nsg,mpl,fpl,npl : Str) -> Adjective =\n      \\msg,fsg,nsg,mpl,fpl,npl -> {\n        s = table {\n          Masc => table {Sg => msg ; Pl => mpl} ; \n          Fem => table {Sg => fsg ; Pl => fpl}  ;\n          Neutr => table {Sg => nsg ; Pl => npl}\n          }\n        } ;\n    regAdj : Str -> Adjective = \n      \\mlad ->\n      adjective (mlad+\"ý\") (mlad+\"á\") (mlad+\"é\")\n\t\t (mlad+\"é\") (mlad+\"é\") (mlad+\"á\") ;\n    regnfAdj : Str -> Adjective = \n      \\vynikajici ->\n      adjective vynikajici vynikajici vynikajici \n\t\tvynikajici vynikajici vynikajici;\n    copula : Number => Str = \n      table {Sg => \"je\" ; Pl => \"jsou\"} ;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Grammatical Framework/transFoodsHin.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsHin of Foods = {\n\n  flags coding=utf8 ;\n\n  param\n    Gender = Masc | Fem ;\n    Number = Sg | Pl ;\n  lincat\n    Comment = {s : Str} ;\n    Item    = {s : Str ; g : Gender ; n : Number} ;\n    Kind    = {s : Number => Str ; g : Gender} ;\n    Quality = {s : Gender => Number => Str} ;\n  lin\n    Pred item quality = {\n      s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n\n      } ;\n    This kind = {s = \"yah\" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;\n    That kind = {s = \"vah\" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;\n    These kind = {s = \"ye\" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;\n    Those kind = {s = \"ve\" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;\n    Mod quality kind = {\n      s = \\\\n => quality.s ! kind.g ! n ++ kind.s ! n ; \n      g = kind.g\n      } ;\n    Wine = regN \"madirA\" ;\n    Cheese = regN \"panIr\" ;\n    Fish = regN \"maClI\" ;\n    Pizza = regN \"pijjA\" ;\n    Very quality = {s = \\\\g,n => \"bahut\" ++ quality.s ! g ! n} ;\n    Fresh = regAdj \"tAzA\" ;\n    Warm = regAdj \"garam\" ;\n    Italian = regAdj \"i-t.alI\" ; \n    Expensive = regAdj \"mahaNgA\" ;\n    Delicious = regAdj \"rucikar\" ;\n    Boring = regAdj \"pEriyA\" ;\n\n  oper\n    mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \n      \\s,p,g -> {\n        s = table {\n          Sg => s ;\n          Pl => p\n          } ;\n        g = g\n      } ;\n\n    regN : Str -> {s : Number => Str ; g : Gender} = \\s -> case s of {\n      lark + \"A\" => mkN s (lark + \"e\") Masc ;\n      lark + \"I\" => mkN s (lark + \"iyaM\") Fem ;\n      _           => mkN s s Masc \n      } ;\n\n    mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \\ms,mp,f -> {\n      s = table {\n        Masc => table {\n          Sg => ms ;\n          Pl => mp\n          } ;\n        Fem  => \\\\_ => f\n        }\n      } ;\n\n    regAdj : Str -> {s : Gender => Number => Str} = \\a -> case a of {\n      acch + \"A\" => mkAdj a (acch + \"e\") (acch + \"I\") ;\n      _          => mkAdj a a a\n      } ;\n\n    copula : Number -> Str = \\n -> case n of {\n      Sg => \"hE\" ;\n      Pl => \"hEN\"\n      } ;\n\n  }\n"
  },
  {
    "path": "src/test/resources/samples/langs/Graph Modeling Language/sample.gml",
    "content": "graph\n[\n  directed 0\n  node\n  [\n    id 0\n    label \"Node 1\"\n    value 100\n  ]\n  node\n  [\n    id 1\n    label \"Node 2\"\n    value 200\n  ]\n  edge\n  [\n    source 1\n    target 0\n  ]\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/GraphQL/kitchen-sink.graphql",
    "content": "# Copyright (c) 2015, Facebook, Inc.\n# All rights reserved.\n#\n# This source code is licensed under the BSD-style license found in the\n# LICENSE file in the root directory of this source tree. An additional grant\n# of patent rights can be found in the PATENTS file in the same directory.\n\nquery queryName($foo: ComplexType, $site: Site = MOBILE) {\n  whoever123is: node(id: [123, 456]) {\n    id ,\n    ... on User @defer {\n      field2 {\n        id ,\n        alias: field1(first:10, after:$foo,) @include(if: $foo) {\n          id,\n          ...frag\n        }\n      }\n    }\n    ... @skip(unless: $foo) {\n      id\n    }\n    ... {\n      id\n    }\n  }\n}\n\nmutation likeStory {\n  like(story: 123) @defer {\n    story {\n      id\n    }\n  }\n}\n\nsubscription StoryLikeSubscription($input: StoryLikeSubscribeInput) {\n  storyLikeSubscribe(input: $input) {\n    story {\n      likers {\n        count\n      }\n      likeSentence {\n        text\n      }\n    }\n  }\n}\n\nfragment frag on Friend {\n  foo(size: $size, bar: $b, obj: {key: \"value\"})\n}\n\n{\n  unnamed(truthy: true, falsey: false),\n  query\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/GraphQL/schema-kitchen-sink.graphql",
    "content": "# Copyright (c) 2015, Facebook, Inc.\n# All rights reserved.\n#\n# This source code is licensed under the BSD-style license found in the\n# LICENSE file in the root directory of this source tree. An additional grant\n# of patent rights can be found in the PATENTS file in the same directory.\n\nschema {\n  query: QueryType\n  mutation: MutationType\n}\n\ntype Foo implements Bar {\n  one: Type\n  two(argument: InputType!): Type\n  three(argument: InputType, other: String): Int\n  four(argument: String = \"string\"): String\n  five(argument: [String] = [\"string\", \"string\"]): String\n  six(argument: InputType = {key: \"value\"}): Type\n}\n\ninterface Bar {\n  one: Type\n  four(argument: String = \"string\"): String\n}\n\nunion Feed = Story | Article | Advert\n\nscalar CustomScalar\n\nenum Site {\n  DESKTOP\n  MOBILE\n}\n\ninput InputType {\n  key: String!\n  answer: Int = 42\n}\n\nextend type Foo {\n  seven(argument: [String]): Type\n}\n\ndirective @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT\n\ndirective @include(if: Boolean!)\n  on FIELD\n   | FRAGMENT_SPREAD\n   | INLINE_FRAGMENT\n"
  },
  {
    "path": "src/test/resources/samples/langs/Graphviz (DOT)/annoying.DOT",
    "content": "/* \n  Huffman Tree DOT graph.\n\n  DOT Reference :  http://www.graphviz.org/doc/info/lang.html\n                   http://en.wikipedia.org/wiki/DOT_language\n  Timestamp     :  1415989074 \n  Phrase        :  'OH GOD WHY IS LINGUIST SO ANAL ABOUT THIS STUFF'\n\n  Generated on http://huffman.ooz.ie/\n*/\n\ndigraph G {\n    edge [label=0];\n    graph [ranksep=0];\n    T [shape=record, label=\"{{T|4}|000}\"];\n    S [shape=record, label=\"{{S|5}|001}\"];\n    SPACE [shape=record, label=\"{{SPACE|9}|01}\"];\n    A [shape=record, label=\"{{A|3}|1000}\"];\n    H [shape=record, label=\"{{H|3}|1001}\"];\n    U [shape=record, label=\"{{U|3}|1010}\"];\n    L [shape=record, label=\"{{L|2}|10110}\"];\n    N [shape=record, label=\"{{N|2}|10111}\"];\n    I [shape=record, label=\"{{I|4}|1100}\"];\n    O [shape=record, label=\"{{O|4}|1101}\"];\n    G [shape=record, label=\"{{G|2}|11100}\"];\n    F [shape=record, label=\"{{F|2}|11101}\"];\n    GF [label=4];\n    W [shape=record, label=\"{{W|1}|111100}\"];\n    Y [shape=record, label=\"{{Y|1}|111101}\"];\n    B [shape=record, label=\"{{B|1}|111110}\"];\n    D [shape=record, label=\"{{D|1}|111111}\"];\n    BD [label=2];\n    WYBD [label=4];\n    GFWYBD [label=8];\n    47 -> 18 -> 9 -> T;\n    29 -> 13 -> 6 -> A;\n    7 -> U;\n    4 -> L;\n    16 -> 8 -> I;\n    GFWYBD -> GF -> G;\n    WYBD -> 2 -> W;\n    BD -> B;9 -> S [label=1];\n    18 -> SPACE [label=1];\n    6 -> H [label=1];\n    13 -> 7 -> 4 -> N [label=1];\n    8 -> O [label=1];\n    GF -> F [label=1];\n    2 -> Y [label=1];\n    47 -> 29 -> 16 -> GFWYBD -> WYBD -> BD -> D [label=1];\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Graphviz (DOT)/sample.dot",
    "content": "/* \n  Huffman Tree DOT graph.\n\n  DOT Reference :  http://www.graphviz.org/doc/info/lang.html\n                   http://en.wikipedia.org/wiki/DOT_language\n  Timestamp     :  1415988139 \n  Phrase        :  'SERIAL KILLER AND SEX OFFENDER ANGUS SINCLAIR IS JAILED FOR A MINIMUM OF 37 YEARS FOR THE 1977 WORLDS END MURDERS OF HELEN SCOTT AND CHRISTINE EADIE.'\n\n  Generated on http://huffman.ooz.ie/\n*/\n\ndigraph G {\n    edge [label=0];\n    graph [ranksep=0];\n    node [shape=record];\n    U [label=\"{{U|3}|00000}\"];\n    G [label=\"{{G|1}|0000100}\"];\n    K [label=\"{{K|1}|0000101}\"];\n    _3 [label=\"{{3|1}|0000110}\"];\n    _9 [label=\"{{9|1}|0000111}\"];\n    _39 [label=2];\n    L [label=\"{{L|7}|0001}\"];\n    O [label=\"{{O|7}|0010}\"];\n    Y [label=\"{{Y|1}|0011000}\"];\n    X [label=\"{{X|1}|0011001}\"];\n    YX [label=2];\n    J [label=\"{{J|1}|0011010}\"];\n    W [label=\"{{W|1}|0011011}\"];\n    JW [label=2];\n    YXJW [label=4];\n    M [label=\"{{M|4}|00111}\"];\n    E [label=\"{{E|15}|010}\"];\n    D [label=\"{{D|8}|0110}\"];\n    T [label=\"{{T|4}|01110}\"];\n    DOT [label=\"{{DOT|1}|0111100}\"];\n    _1 [label=\"{{1|1}|0111101}\"];\n    DOT1 [label=2];\n    _7 [label=\"{{7|3}|011111}\"];\n    A [label=\"{{A|9}|1000}\"];\n    N [label=\"{{N|9}|1001}\"];\n    S [label=\"{{S|10}|1010}\"];\n    I [label=\"{{I|11}|1011}\"];\n    R [label=\"{{R|11}|1100}\"];\n    C [label=\"{{C|3}|110100}\"];\n    H [label=\"{{H|3}|110101}\"];\n    F [label=\"{{F|6}|11011}\"];\n    SPACE [label=\"{{SPACE|26}|111}\"];\n    149 -> 61 -> 29 -> 14 -> 7 -> U;\n    4 -> 2 -> G;\n    _39 -> _3;\n    15 -> O;\n    8 -> YXJW -> YX -> Y;\n    JW -> J;\n    32 -> E;\n    17 -> D;\n    9 -> T;\n    5 -> DOT1 -> DOT;\n    88 -> 39 -> 18 -> A;\n    21 -> S;\n    49 -> 23 -> R;\n    12 -> 6 -> C;2 -> K [label=1];\n    7 -> 4 -> _39 -> _9 [label=1];\n    14 -> L [label=1];\n    YX -> X [label=1];\n    YXJW -> JW -> W [label=1];\n    29 -> 15 -> 8 -> M [label=1];\n    DOT1 -> _1 [label=1];\n    61 -> 32 -> 17 -> 9 -> 5 -> _7 [label=1];\n    18 -> N [label=1];\n    39 -> 21 -> I [label=1];\n    6 -> H [label=1];\n    23 -> 12 -> F [label=1];\n    149 -> 88 -> 49 -> SPACE [label=1];\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Groovy/build.gvy",
    "content": "task echoDirListViaAntBuilder() {\n    description = 'Uses the built-in AntBuilder instance to echo and list files'\n    //Docs: http://ant.apache.org/manual/Types/fileset.html\n    \n    //Echo the Gradle project name via the ant echo plugin\n    ant.echo(message: project.name)\n    ant.echo(path)\n    ant.echo(\"${projectDir}/samples\")\n    \n    //Gather list of files in a subdirectory\n    ant.fileScanner{\n        fileset(dir:\"samples\")\n    }.each{\n        //Print each file to screen with the CWD (projectDir) path removed.\n        println it.toString() - \"${projectDir}\"\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Groovy/filenames/Jenkinsfile",
    "content": "jettyUrl = 'http://localhost:8081/'\n\ndef servers\n\nstage 'Dev'\nnode {\n    checkout scm\n    servers = load 'servers.groovy'\n    mvn '-o clean package'\n    dir('target') {stash name: 'war', includes: 'x.war'}\n}\n\nstage 'QA'\nparallel(longerTests: {\n    runTests(servers, 30)\n}, quickerTests: {\n    runTests(servers, 20)\n})\n\nstage name: 'Staging', concurrency: 1\nnode {\n    servers.deploy 'staging'\n}\n\ninput message: \"Does ${jettyUrl}staging/ look good?\"\n\nstage name: 'Production', concurrency: 1\nnode {\n    sh \"wget -O - -S ${jettyUrl}staging/\"\n    echo 'Production server looks to be alive'\n    servers.deploy 'production'\n    echo \"Deployed to ${jettyUrl}production/\"\n}\n\ndef mvn(args) {\n    sh \"${tool 'Maven 3.x'}/bin/mvn ${args}\"\n}\n\ndef runTests(servers, duration) {\n    node {\n        checkout scm\n        servers.runWithServer {id ->\n            mvn \"-o -f sometests test -Durl=${jettyUrl}${id}/ -Dduration=${duration}\"\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Groovy/groovy",
    "content": "#!/usr/bin/env groovy\nprintln \"Groovy!\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Groovy/script.gvy",
    "content": "#!/usr/bin/env groovy\nprintln \"Hello World\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Groovy/template.grt",
    "content": "html {\n  head {\n    component \"bootstrap\"\n    title \"Bootstrap Template\"\n  }\n  \n  html {\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Groovy/template.gtpl",
    "content": "html {\n  head {\n    title \"Example Template\"\n  }\n  \n  body {\n    p \"This is a quick template example\"\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Groovy Server Pages/bar.gsp",
    "content": "<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <title>Testing with SiteMesh and Resources</title>\n    <meta name=\"layout\" content=\"blankMain\"/>\n    <r:require module=\"style\"/>\n</head>\n<body>\n</body>\n</html>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Groovy Server Pages/hello-pagedirective.gsp",
    "content": "<%@ page contentType=\"text/html;charset=UTF-8\" %>\n\n<html>\n  <head>\n    <title>Using page directive tag</title>\n  </head>\n  <body>\n        <div class=\"center\">\n            <a href=\"#\" alt=\"Download\" id=\"downloadButton\">Download</a>\n        </div>\n        <div class=\"center\">\n            <a href=\"#\" alt=\"Print\" id=\"printButton\">Print</a>\n        </div>\n  </body>\n</html>\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Groovy Server Pages/hello-resources.gsp",
    "content": "<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <title>Testing with Resources</title>\n    <r:require module=\"style\"/>\n</head>\n<body>\n</body>\n</html>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Groovy Server Pages/hello-var.gsp",
    "content": "<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <title>Testing with SiteMesh and ${example}</title>\n\n</head>\n<body>\n</body>\n</html>\n"
  },
  {
    "path": "src/test/resources/samples/langs/HCL/example.hcl",
    "content": "consul = \"1.2.3.4\"\n\n// This is a comment\ntemplate \"foo\" {\n  bar = \"zip\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/HCL/example.tf",
    "content": "resource \"aws_instance\" \"web\" {\n  // Copies the myapp.conf file to /etc/myapp.conf\n  provisioner \"file\" {\n    source = \"conf/myapp.conf\"\n    destination = \"/etc/myapp.conf\"\n  }\n\n  // Copies the configs.d folder to /etc/configs.d\n  provisioner \"file\" {\n    source = \"conf/configs.d\"\n    destination = \"/etc\"\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/HCL/main.tf",
    "content": "resource \"aws_security_group\" \"elb_sec_group\" {\n  description = \"Allow traffic from the internet to ELB port 80\"\n  vpc_id = \"${var.vpc_id}\"\n\n  ingress {\n      from_port = 80\n      to_port = 80\n      protocol = \"tcp\"\n      cidr_blocks = [\"${split(\",\", var.allowed_cidr_blocks)}\"]\n  }\n\n  egress {\n      from_port = 0\n      to_port = 0\n      protocol = \"-1\"\n      cidr_blocks = [\"0.0.0.0/0\"]\n  }\n}\n\nresource \"aws_security_group\" \"dokku_allow_ssh_from_internal\" {\n  description = \"Allow git access over ssh from the private subnet\"\n  vpc_id = \"${var.vpc_id}\"\n\n  ingress {\n      from_port = 22\n      to_port = 22\n      protocol = \"tcp\"\n      cidr_blocks = [\"${var.private_subnet_cidr}\"]\n  }\n\n  egress {\n      from_port = 0\n      to_port = 0\n      protocol = \"-1\"\n      cidr_blocks = [\"0.0.0.0/0\"]\n  }\n}\n\nresource \"aws_security_group\" \"allow_from_elb_to_instance\" {\n  description = \"Allow traffic from the ELB to the private instance\"\n  vpc_id = \"${var.vpc_id}\"\n\n  ingress {\n      security_groups = [\"${aws_security_group.elb_sec_group.id}\"]\n      from_port = 80\n      to_port = 80\n      protocol = \"tcp\"\n  }\n\n  egress {\n      from_port = 0\n      to_port = 0\n      protocol = \"-1\"\n      cidr_blocks = [\"0.0.0.0/0\"]\n  }\n}\n\nresource \"aws_instance\" \"dokku\" {\n  ami = \"ami-47a23a30\"\n  instance_type = \"${var.instance_type}\"\n  associate_public_ip_address = false\n  key_name = \"${var.key_name}\"\n  subnet_id = \"${var.private_subnet_id}\"\n  vpc_security_group_ids = [\n    \"${var.bastion_sec_group_id}\",\n    \"${aws_security_group.allow_from_elb_to_instance.id}\",\n    \"${aws_security_group.dokku_allow_ssh_from_internal.id}\"\n  ]\n  tags {\n    Name = \"${var.name}\"\n  }\n  connection {\n    user = \"ubuntu\"\n    private_key = \"${var.private_key}\"\n    bastion_host = \"${var.bastion_host}\"\n    bastion_port = \"${var.bastion_port}\"\n    bastion_user = \"${var.bastion_user}\"\n    bastion_private_key = \"${var.bastion_private_key}\"\n  }\n  provisioner \"file\" {\n    source = \"${path.module}/../scripts/install-dokku.sh\"\n    destination = \"/home/ubuntu/install-dokku.sh\"\n  }\n  provisioner \"remote-exec\" {\n    inline = [\n      \"chmod +x /home/ubuntu/install-dokku.sh\",\n      \"HOSTNAME=${var.hostname} /home/ubuntu/install-dokku.sh\"\n    ]\n  }\n}\n\nresource \"aws_elb\" \"elb_dokku\" {\n  name = \"elb-dokku-${var.name}\"\n  subnets = [\"${var.public_subnet_id}\"]\n  security_groups = [\"${aws_security_group.elb_sec_group.id}\"]\n\n  listener {\n    instance_port = 80\n    instance_protocol = \"http\"\n    lb_port = 80\n    lb_protocol = \"http\"\n  }\n\n  health_check {\n    healthy_threshold = 2\n    unhealthy_threshold = 2\n    timeout = 3\n    target = \"HTTP:80/\"\n    interval = 30\n  }\n\n  instances = [\"${aws_instance.dokku.id}\"]\n  cross_zone_load_balancing = false\n  idle_timeout = 400\n\n  tags {\n    Name = \"elb-dokku-${var.name}\"\n  }\n}\n\nresource \"aws_route53_record\" \"dokku-deploy\" {\n   zone_id = \"${var.zone_id}\"\n   name = \"deploy.${var.hostname}\"\n   type = \"A\"\n   ttl = \"300\"\n   records = [\"${aws_instance.dokku.private_ip}\"]\n}\n\nresource \"aws_route53_record\" \"dokku-wildcard\" {\n   zone_id = \"${var.zone_id}\"\n   name = \"*.${var.hostname}\"\n   type = \"CNAME\"\n   ttl = \"300\"\n   records = [\"${aws_elb.elb_dokku.dns_name}\"]\n}"
  },
  {
    "path": "src/test/resources/samples/langs/HCL/terraform.tfvars",
    "content": "# Terragrunt is a thin wrapper for Terraform that provides extra tools for working with multiple Terraform modules,\n# remote state, and locking: https://github.com/gruntwork-io/terragrunt\nterragrunt = {\n  # Configure Terragrunt to automatically store tfstate files in an S3 bucket\n  remote_state {\n    backend = \"s3\"\n    config {\n      encrypt        = true\n      bucket         = \"acme-main-terraform-state\"\n      key            = \"${path_relative_to_include()}/terraform.tfstate\"\n      region         = \"us-east-1\"\n      dynamodb_table = \"terraform-locks\"\n    }\n  }\n\n  # Configure Terragrunt to use common var files to help you keep often-repeated variables (e.g., account ID) DRY.\n  # Note that even though Terraform automatically pulls in terraform.tfvars, we include it explicitly at the end of the\n  # list to make sure its variables override anything in the common var files.\n  terraform {\n    extra_arguments \"common_vars\" {\n      commands = [\"${get_terraform_commands_that_need_vars()}\"]\n\n      optional_var_files = [\n        \"${get_tfvars_dir()}/${find_in_parent_folders(\"account.tfvars\", \"skip-account-if-does-not-exist\")}\",\n        \"${get_tfvars_dir()}/${find_in_parent_folders(\"region.tfvars\", \"skip-region-if-does-not-exist\")}\",\n        \"${get_tfvars_dir()}/${find_in_parent_folders(\"env.tfvars\", \"skip-env-if-does-not-exist\")}\",\n        \"${get_tfvars_dir()}/terraform.tfvars\"\n      ]\n    }\n  }\n}\n\nkey1 = \"val1\"\nkey2 = 0\nkey3 = 1\nkey4 = true\n\n# Sample comments\nkey5 = false\n\nkey6 = [\"hello\", \"from\", \"gruntwork.io\"]\n\nkey7 = {\n  key1 = \"hello\"\n  key2 = \"from\"\n  key3 = \"gruntwork.io\"\n}\n\nkey8 = [\n  {\n    keyA = \"hello\"\n    keyB = \"there\"\n  },\n  {\n    keyA = \"hello\"\n    keyB = \"there\"\n  }\n]"
  },
  {
    "path": "src/test/resources/samples/langs/HLSL/accelerated_surface_win.hlsl",
    "content": "// Copyright (c) 2012 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// To compile these two shaders:\n// fxc /E pixelMain /T ps_2_0 accelerated_surface_win.hlsl\n// fxc /E vertexMain /T vs_2_0 accelerated_surface_win.hlsl\n//\n// fxc is in the DirectX SDK.\n\nstruct Vertex {\n  float4 position : POSITION;\n  float2 texCoord : TEXCOORD0;\n};\n\ntexture t;\nsampler s;\n\n// Passes a position and texture coordinate to the pixel shader.\nVertex vertexMain(Vertex input) {\n  return input;\n};\n\n// Samples a texture at the given texture coordinate and returns the result.\nfloat4 pixelMain(float2 texCoord : TEXCOORD0) : COLOR0 {\n  return tex2D(s, texCoord);\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/HLSL/bloom.cginc",
    "content": "// From https://github.com/Unity-Technologies/PostProcessing/blob/master/PostProcessing/Resources/Shaders/Bloom.cginc\n// Licensed under the MIT license\n\n#ifndef __BLOOM__\n#define __BLOOM__\n\n#include \"Common.cginc\"\n\n// Brightness function\nhalf Brightness(half3 c)\n{\n    return Max3(c);\n}\n\n// 3-tap median filter\nhalf3 Median(half3 a, half3 b, half3 c)\n{\n    return a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\n\n// Downsample with a 4x4 box filter\nhalf3 DownsampleFilter(sampler2D tex, float2 uv, float2 texelSize)\n{\n    float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0);\n\n    half3 s;\n    s = DecodeHDR(tex2D(tex, uv + d.xy));\n    s += DecodeHDR(tex2D(tex, uv + d.zy));\n    s += DecodeHDR(tex2D(tex, uv + d.xw));\n    s += DecodeHDR(tex2D(tex, uv + d.zw));\n\n    return s * (1.0 / 4.0);\n}\n\n// Downsample with a 4x4 box filter + anti-flicker filter\nhalf3 DownsampleAntiFlickerFilter(sampler2D tex, float2 uv, float2 texelSize)\n{\n    float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0);\n\n    half3 s1 = DecodeHDR(tex2D(tex, uv + d.xy));\n    half3 s2 = DecodeHDR(tex2D(tex, uv + d.zy));\n    half3 s3 = DecodeHDR(tex2D(tex, uv + d.xw));\n    half3 s4 = DecodeHDR(tex2D(tex, uv + d.zw));\n\n    // Karis's luma weighted average (using brightness instead of luma)\n    half s1w = 1.0 / (Brightness(s1) + 1.0);\n    half s2w = 1.0 / (Brightness(s2) + 1.0);\n    half s3w = 1.0 / (Brightness(s3) + 1.0);\n    half s4w = 1.0 / (Brightness(s4) + 1.0);\n    half one_div_wsum = 1.0 / (s1w + s2w + s3w + s4w);\n\n    return (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * one_div_wsum;\n}\n\nhalf3 UpsampleFilter(sampler2D tex, float2 uv, float2 texelSize, float sampleScale)\n{\n#if MOBILE_OR_CONSOLE\n    // 4-tap bilinear upsampler\n    float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0) * (sampleScale * 0.5);\n\n    half3 s;\n    s =  DecodeHDR(tex2D(tex, uv + d.xy));\n    s += DecodeHDR(tex2D(tex, uv + d.zy));\n    s += DecodeHDR(tex2D(tex, uv + d.xw));\n    s += DecodeHDR(tex2D(tex, uv + d.zw));\n\n    return s * (1.0 / 4.0);\n#else\n    // 9-tap bilinear upsampler (tent filter)\n    float4 d = texelSize.xyxy * float4(1.0, 1.0, -1.0, 0.0) * sampleScale;\n\n    half3 s;\n    s =  DecodeHDR(tex2D(tex, uv - d.xy));\n    s += DecodeHDR(tex2D(tex, uv - d.wy)) * 2.0;\n    s += DecodeHDR(tex2D(tex, uv - d.zy));\n\n    s += DecodeHDR(tex2D(tex, uv + d.zw)) * 2.0;\n    s += DecodeHDR(tex2D(tex, uv))        * 4.0;\n    s += DecodeHDR(tex2D(tex, uv + d.xw)) * 2.0;\n\n    s += DecodeHDR(tex2D(tex, uv + d.zy));\n    s += DecodeHDR(tex2D(tex, uv + d.wy)) * 2.0;\n    s += DecodeHDR(tex2D(tex, uv + d.xy));\n\n    return s * (1.0 / 16.0);\n#endif\n}\n\n#endif // __BLOOM__"
  },
  {
    "path": "src/test/resources/samples/langs/HLSL/corridor.fx",
    "content": "float4x4 matWorldView : WORLDVIEW;\nfloat4x4 matWorldViewProjection : WORLDVIEWPROJECTION;\n\nstruct VS_INPUT {\n\tfloat4 Position : POSITION0;\n\tfloat3 Normal : NORMAL;\n\tfloat3 Tangent : TANGENT;\n\tfloat3 Binormal : BINORMAL;\n\tfloat2 TexCoord0 : TEXCOORD0;\n\tfloat2 TexCoord1 : TEXCOORD1;\n};\n\nstruct VS_OUTPUT {\n\tfloat4 Position : POSITION0;\n\tfloat2 TexCoord0 : TEXCOORD0;\n\tfloat2 TexCoord1 : TEXCOORD1;\n\tfloat3x3 TangentToView : TEXCOORD2;\n};\n\nVS_OUTPUT vs_main(VS_INPUT input)\n{\n\tVS_OUTPUT output;\n\toutput.Position = mul(input.Position, matWorldViewProjection);\n\toutput.TexCoord0 = input.TexCoord0 * 5;\n\toutput.TexCoord1 = input.TexCoord1;\n\toutput.TangentToView[0] = mul(float4(input.Tangent, 0), matWorldView).xyz;\n\toutput.TangentToView[1] = mul(float4(input.Binormal, 0), matWorldView).xyz;\n\toutput.TangentToView[2] = mul(float4(input.Normal, 0), matWorldView).xyz;\n\treturn output;\n}\n\nstruct PS_OUTPUT {\n\tfloat4 gbuffer0 : COLOR0;\n\tfloat4 gbuffer1 : COLOR1;\n};\n\ntexture albedo_tex;\nsampler albedo_samp = sampler_state {\n\tTexture = (albedo_tex);\n\tMipFilter = Linear;\n\tMinFilter = Linear;\n\tMagFilter = Linear;\n\tAddressU = Wrap;\n\tAddressV = Wrap;\n\tsRGBTexture = True;\n};\n\ntexture normal_tex;\nsampler normal_samp = sampler_state {\n\tTexture = (normal_tex);\n\tMipFilter = Linear;\n\tMinFilter = Linear;\n\tMagFilter = Linear;\n\tAddressU = Wrap;\n\tAddressV = Wrap;\n\tsRGBTexture = False;\n};\n\ntexture specular_tex;\nsampler specular_samp = sampler_state {\n\tTexture = (specular_tex);\n\tMipFilter = Linear;\n\tMinFilter = Linear;\n\tMagFilter = Linear;\n\tAddressU = Wrap;\n\tAddressV = Wrap;\n\tsRGBTexture = True;\n};\n\ntexture ao_tex;\nsampler ao_samp = sampler_state {\n\tTexture = (ao_tex);\n\tMipFilter = Linear;\n\tMinFilter = Linear;\n\tMagFilter = Linear;\n\tAddressU = Wrap;\n\tAddressV = Wrap;\n\tsRGBTexture = True;\n};\n\nPS_OUTPUT ps_main(VS_OUTPUT Input)\n{\n\tPS_OUTPUT o;\n\n\tfloat3 tangentNormal = normalize(tex2D(normal_samp, Input.TexCoord0).xyz * 2 - 1);\n\tfloat3 eyeNormal = normalize(mul(tangentNormal, Input.TangentToView));\n\n\tfloat3 albedo = tex2D(albedo_samp, Input.TexCoord0).rgb;\n\tfloat ao = tex2D(ao_samp, Input.TexCoord1).r * 0.75;\n\tfloat spec = tex2D(specular_samp, Input.TexCoord0).r;\n\n\to.gbuffer0 = float4(eyeNormal, spec * ao);\n\to.gbuffer1 = float4(albedo, 1 - ao);\n\treturn o;\n}\n\ntechnique mesh {\n\tpass Geometry {\n\t\tVertexShader = compile vs_3_0 vs_main();\n\t\tPixelShader  = compile ps_3_0 ps_main();\n\n\t\tAlphaBlendEnable = False;\n\t\tZWriteEnable = True;\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/HLSL/jellyfish.fx",
    "content": "float4x4 matWorldViewProjection : WORLDVIEWPROJECTION;\nfloat4x4 matWorldView : WORLDVIEW;\nfloat4x4 matWorld : WORLD;\nfloat4x4 matView : VIEW;\n\nuniform float4 vViewPosition;\n\nstruct VS_INPUT \n{\n\tfloat3 Pos:      POSITION;\n\tfloat3 Normal:   NORMAL;\n\tfloat3 Tangent:  TANGENT;\n\tfloat3 Binormal: BINORMAL;\n};\n\nstruct VS_OUTPUT \n{\n\tfloat4 Pos        : POSITION;\n\tfloat3 reflection : TEXCOORD1; \n\tfloat3 refraction : TEXCOORD2; \n\tfloat  fresnel    : TEXCOORD3;\n};\n\nuniform float3 amt;\nuniform float3 scale;\nuniform float3 phase;\n\nfloat3 deform(float3 p)\n{\n\tfloat s = 3;\n\tfloat3 p2 = p * scale + phase;\n\ts += sin(p2.x) * amt.x;\n\ts += sin(p2.y) * amt.y;\n\ts += sin(p2.z) * amt.z;\n\treturn p * s / 3;\n}\n\nVS_OUTPUT vs_main( VS_INPUT In )\n{\n\tVS_OUTPUT Out;\n\n\tfloat3 pos = In.Pos;\n\tfloat3 norm = In.Normal;\n\n\tfloat3 p1 = pos + In.Tangent * 0.05;\n\tfloat3 p2 = pos + In.Binormal * 0.05;\n\tpos = deform(pos);\n\tp1  = deform(p1);\n\tp2  = deform(p2);\n\n\tp1 -= pos;\n\tp2 -= pos;\n\tnorm = normalize(cross(p1, p2));\n\n\tfloat3 view = normalize(pos - vViewPosition.xyz);\n\n\tOut.Pos           = mul(float4(pos,  1.0), matWorldViewProjection);\n\tOut.reflection    = reflect(view, norm);\n\tOut.refraction    = reflect(view, norm * 0.4f); /* fake, but who cares? */\n\tOut.fresnel       = dot(view, norm);\n\tnorm = mul(float4(norm, 0.0), matWorldViewProjection);\n\n\treturn Out;\n}\n\n#define PS_INPUT VS_OUTPUT\n\n#if 0\ntextureCUBE reflectionMap;\nsamplerCUBE reflectionMapSampler = sampler_state\n{\n\tTexture = (reflectionMap);\n\tMipFilter = LINEAR;\n\tMinFilter = LINEAR;\n\tMagFilter = LINEAR;\n};\n#else\n// textures\ntexture reflectionMap \n< \n    string type = \"CUBE\";\n    string name = \"test_cube.dds\";\n>;\n\nsamplerCUBE reflectionMapSampler = sampler_state\n{\n\tTexture = (reflectionMap);\n\tMipFilter = LINEAR;\n\tMinFilter = LINEAR;\n\tMagFilter = LINEAR;\n};\n#endif\n\nstruct PS_OUTPUT \n{\n   float4 color    : COLOR0;\n};\n\nPS_OUTPUT ps_main( PS_INPUT In )\n{\n\tPS_OUTPUT Out;\n\t\n\tfloat4 reflection = texCUBE(reflectionMapSampler, normalize(In.reflection)) * 1.5;\n\tfloat4 refraction = texCUBE(reflectionMapSampler, normalize(In.refraction));\n\tfloat fresnel = In.fresnel;\n//\tfloat fresnel = abs(normalize(In.normal).z);\n\tOut.color = lerp(reflection, refraction, fresnel) *  pow(1.0 - fresnel * 0.75, 1.0);\n\n\treturn Out;\n}\n\ntechnique blur_ps_vs_2_0\n{\n\tpass P0\n\t{\n\t\tVertexShader = compile vs_2_0 vs_main();\n\t\tPixelShader  = compile ps_2_0 ps_main();\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/HLSL/noise.fx",
    "content": "float alpha = 1.f;\n\ntexture tex;\nsampler tex_sampler = sampler_state\n{\n\tTexture = (tex);\n\tMipFilter = LINEAR;\n\tMinFilter = LINEAR;\n\tMagFilter = LINEAR;\n\t\n\tAddressU = WRAP;\n\tAddressV = WRAP;\n};\n\nstruct VS_OUTPUT\n{\n\tfloat4 pos  : POSITION;\n\tfloat2 tex  : TEXCOORD1;\n};\n\nVS_OUTPUT vertex(float4 ipos : POSITION, float2 tex  : TEXCOORD0)\n{\n\tVS_OUTPUT Out;\n\tOut.pos = ipos;\n\tOut.tex = tex * 2;\n\treturn Out;\n}\n\nfloat4 pixel(VS_OUTPUT In) : COLOR\n{\n\treturn tex2D(tex_sampler, In.tex) * alpha;\n}\n\ntechnique blur_ps_vs_2_0\n{\n\tpass P0\n\t{\n\t\tVertexShader = compile vs_2_0 vertex();\n\t\tPixelShader  = compile ps_2_0 pixel();\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML/ApiOverviewPage.st",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Frameset//EN\"\"http://www.w3.org/TR/REC-html40/frameset.dtd\">\n<html>\n<head>\n$Common_meta()$\n<title>\nAndroid API Differences Report\n</title>\n<body>\n<div class=\"body\">\n\n$Header()$\n\n\n<div class=\"content\">\n<h2>Android API Differences Report</h2>\n<p>This document details the changes in the Android framework API. It shows \nadditions, modifications, and removals for packages, classes, methods, and \nfields. Each reference to an API change includes a brief description of the \nAPI and an explanation of the change and suggested workaround, where available.</p>\n\n<p>The differences described in this report are based a comparison of the APIs \nwhose versions are specified in the upper-right corner of this page. It compares a \nnewer \"to\" API to an older \"from\" version, noting any changes relative to the \nolder API. So, for example, indicated API removals are no longer present in the \"to\" \nAPI.</p>\n<p>For more information about the Android framework API and SDK, \nsee the <a href=\"http://code.google.com/android/index.html\" target=\"_top\">Android product site</a>.</p>\n\n$if(no_delta)$\n<h3>Congratulation!</h3>\nNo differences were detected between the two provided APIs.\n$endif$\n\n\n$if(removed_packages)$\n$Table(name=\"Removed Packages\", rows=removed_packages:{$it.from:ModelElementRow()$})$\n<br/>\n$endif$\n\n\n$if(added_packages)$\n$Table(name=\"Added Packages\", rows=added_packages:{$it.to:PackageAddedLink()$}:SimpleTableRow())$\n<br/>\n$endif$\n\n$if(changed_packages)$\n$Table(name=\"Changed Packages\", rows=changed_packages:{$it.to:PackageChangedLink()$}:SimpleTableRow())$\n<br/>\n$endif$\n</div>\n\n\n</div>\n</body>\n</html>\n\n\n\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML/example.xht",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n    <head>\n        <title>This is a XHTML sample file</title>\n        <style type=\"text/css\"><![CDATA[\n            #example {\n                background-color: yellow;\n            }\n        ]]></style>\n    </head>\n    <body>\n        <div id=\"example\">\n            Just a simple <strong>XHTML</strong> test page.\n        </div>\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML/index.html.hl",
    "content": "<script type=\"text/hoplon\">\n(page \"index.html\")\n\n(defn mouse-loc->vec\n  \"Given a Google Closure normalized DOM mouse event return the\n  mouse x and y position as a two element vector.\"\n  [e]\n  [(.-clientX e) (.-clientY e)])\n\n;; =============================================================================\n;; Example 1\n\n(defc ex1-content         [\"Waiting for a click ....\"])\n(defc ex1-click-count     0)\n(defn ex1 []\n  (when (< @ex1-click-count 1)\n    (swap! ex1-click-count inc)\n    (swap! ex1-content conj \"Got a click!\")))\n\n;; =============================================================================\n;; Example 2\n\n(defc ex2-content         [\"Waiting for a click ....\"])\n(defc ex2-click-count     0)\n(defn ex2 []\n  (when (= @ex2-click-count 1)\n    (swap! ex2-click-count inc)\n    (swap! ex2-content conj \"Done\"))\n  (when (= @ex2-click-count 0)\n    (swap! ex2-click-count inc)\n    (swap! ex2-content conj \"Got a Click!\" \"Waiting for another click ....\")))  \n\n;; =============================================================================\n;; Example 3\n\n(defc ex3-content           [\"Waiting for a click from Button A .....\"])\n(defc ex3-click-count-a     0)\n(defc ex3-click-count-b     0)\n(defn ex3a []\n  (when (= @ex3-click-count-a 0)\n    (swap! ex3-click-count-a inc)\n    (swap! ex3-content conj \"Got a click!\" \"Waiting for a click from Button B ....\")) )\n(defn ex3b []\n  (when (and (= @ex3-click-count-a 1) (= @ex3-click-count-b 0))\n    (swap! ex3-click-count-b inc)\n    (swap! ex3-content conj \"Done!\")))\n\n;; =============================================================================\n;; Example 6\n\n(defc ex6-content           [\"Click the button to start tracking the mouse.\"])\n(defc ex6-button-name       \"GO!\")\n(defn ex6-toggle []\n  (let [new-name    (if (= @ex6-button-name \"GO!\") \"STOP!\" \"GO!\")]\n    (reset! ex6-button-name new-name)))\n(defn ex6 [e]\n  (when (= @ex6-button-name \"STOP!\")\n    (swap! ex6-content conj (str (mouse-loc->vec e)))))\n\n;; =============================================================================\n;; Example 7\n\n(defc ex7-content         [\"Click the button to start tracking the mouse.\"])\n(defc ex7-button-name     \"GO!\")\n(defn ex7-toggle []\n  (let [new-name    (if (= @ex7-button-name \"GO!\") \"STOP!\" \"GO!\")]\n    (reset! ex7-button-name new-name)))\n(defn ex7 [e]\n  (when (= @ex7-button-name \"STOP!\")\n    (let [[x y :as  m]   (mouse-loc->vec e)]\n      (when (zero? (mod y 5))\n        (swap! ex7-content conj (str m))))))\n\n;; =============================================================================\n;; Example 8\n\n(defc ex8-content       [\"Click the button ten times.\"])\n(defc ex8-click-count   0)\n(defn ex8 []\n  (when (< @ex8-click-count 10)\n    (swap! ex8-click-count inc)\n    (when (= @ex8-click-count 1)\n      (swap! ex8-content conj \"1 Click!\"))\n    (when (> @ex8-click-count 1)\n      (swap! ex8-content conj (str @ex8-click-count \" clicks!\")))\n    (when (= @ex8-click-count 10)\n      (swap! ex8-content conj \"Done.\"))))\n\n;; =============================================================================\n;; Example 9\n\n(defc ex9-index       0)\n(defc ex9-animals     [:aardvark :beetle :cat :dog :elk :ferret\n                     :goose :hippo :ibis :jellyfish :kangaroo])\n(defc= ex9-card           (nth ex9-animals ex9-index))\n(defn ex9-prev []\n  (when (> @ex9-index 0)\n    (swap! ex9-index dec)))\n(defn ex9-next []\n  (when (< @ex9-index (dec (count @ex9-animals)))\n    (swap! ex9-index inc)))\n\n;; =============================================================================\n;; Example 10\n\n(defc ex10-button-name  \"START!\")\n(defc ex10-index       0)\n(defn ex10 []\n  (let [the-name    @ex10-button-name]\n  (when (= the-name\"START!\")\n    (reset! ex10-button-name \"STOP!\"))\n  (when (= the-name\"STOP!\")\n    (reset! ex10-button-name \"DONE!\"))))\n(defc ex10-animals     [:aardvark :beetle :cat :dog :elk :ferret\n                     :goose :hippo :ibis :jellyfish :kangaroo])\n(defc= ex10-max        (dec (count ex10-animals)))\n(defc= ex10-card           (nth ex10-animals ex10-index))\n(defn ex10-prev []\n  (if (> @ex10-index 0)\n    (swap! ex10-index dec)\n    (reset! ex10-index @ex10-max)))\n(defn ex10-next []\n  (if (< @ex10-index @ex10-max)\n    (swap! ex10-index inc)\n    (reset! ex10-index 0)))\n(defn ex10-nav [k]\n  (when (= @ex10-button-name \"STOP!\")\n    (when (= k :next)\n      (ex10-next))\n    (when (= k :prev)\n      (ex10-prev))))\n\n(defn ex10-keys [e]\n  (when (= @ex10-button-name \"STOP!\")\n    (if (= (.-keyCode e) 39) (ex10-nav :next))\n    (if (= (.-keyCode e) 37) (ex10-nav :prev))\n    )\n  )\n</script>\n\n<html>\n    <head>\n        <link rel=\"stylesheet\" type=\"text/css\" href=\"css/main.css\" />\n    </head>\n    <body>\n        <!-- Example 1 -->\n        <div id=\"ex1\" class=\"example\">\n            <h2>Example 1</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex1-button\" on-click='{{ #(ex1) }}'>Click me</button>\n                    </td>\n                    <td id=\"ex1-display\" class=\"display\">\n                        <div id=\"ex1-messages\">\n                        <loop-tpl bindings='{{ [x ex1-content] }}'>\n                          <p><text>~{x}</text></p>\n                        </loop-tpl>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 2 -->\n        <div id=\"ex2\" class=\"example\">\n            <h2>Example 2</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex2-button\" on-click='{{ #(ex2) }}'>Click me</button>\n                    </td>\n                    <td id=\"ex2-display\" class=\"display\">\n                        <div id=\"ex2-messages\">\n                        <loop-tpl bindings='{{ [x ex2-content] }}'>\n                          <p><text>~{x}</text></p>\n                        </loop-tpl>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n        \n        <!-- Example 3 -->\n        <div id=\"ex3\" class=\"example\">\n            <h2>Example 3</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex3-button-a\" on-click='{{ #(ex3a) }}'>Button A</button>\n                        <button id=\"ex3-button-b\" on-click='{{ #(ex3b) }}'>Button B</button>\n                    </td>\n                    <td id=\"ex3-display\" class=\"display\">\n                        <div id=\"ex3-messages\">\n                        <loop-tpl bindings='{{ [x ex3-content] }}'>\n                          <p><text>~{x}</text></p>\n                        </loop-tpl>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 4 -->\n        <div id=\"ex4\" class=\"example\">\n            <h2>Example 4</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex4-button-a\">Go!</button>\n                    </td>\n                    <td id=\"ex4-display\" class=\"display\">\n                        <div id=\"ex4-messages\"></div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 5 -->\n        <div id=\"ex5\" class=\"example\">\n            <h2>Example 5</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex5-button\">Go!</button>\n                    </td>\n                    <td id=\"ex5-display\" class=\"display\">\n                        <div id=\"ex5-messages\"></div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 6 -->\n        <div id=\"ex6\" class=\"example\" on-mousemove='{{ #(ex6 %) }}' >\n            <h2>Example 6</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex6-button\" do-text='{{ ex6-button-name }}' on-click='{{ #(ex6-toggle)}}' ></button>\n                    </td>\n                    <td id=\"ex6-display\" class=\"display\">\n                        <div class=\"scrolling\">\n                            <div id=\"ex6-messages\">\n                            <loop-tpl bindings='{{ [x ex6-content] }}'>\n                              <p><text>~{x}</text></p>\n                            </loop-tpl>\n                            </div>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 7 -->\n        <div id=\"ex7\" class=\"example\" on-mousemove='{{ #(ex7 %) }}'>\n            <h2>Example 7</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex7-button\" do-text='{{ ex7-button-name }}' on-click='{{ #(ex7-toggle)}}'></button>\n                    </td>\n                    <td id=\"ex7-display\" class=\"display\">\n                        <div class=\"scrolling\">\n                            <div id=\"ex7-messages\">\n                            <loop-tpl bindings='{{ [x ex7-content] }}'>\n                              <p><text>~{x}</text></p>\n                            </loop-tpl>\n                            </div>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 8 -->\n        <div id=\"ex8\" class=\"example\">\n            <h2>Example 8</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex8-button\" on-click='{{ #(ex8) }}'>Click me!</button>\n                    </td>\n                    <td id=\"ex8-display\" class=\"display card\">\n                        <div class=\"scrolling\">\n                            <div id=\"ex8-messages\">\n                            <loop-tpl bindings='{{ [x ex8-content] }}'>\n                              <p><text>~{x}</text></p>\n                            </loop-tpl>\n                            </div>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 9 -->\n        <div id=\"ex9\" class=\"example\">\n            <h2>Example 9</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex9-button-prev\" on-click='{{ #(ex9-prev) }}' do-class='{{ (cell= {:disabled (= ex9-index 0)})}}'>Previous</button>\n                        <button id=\"ex9-button-next\" on-click='{{ #(ex9-next) }}' do-class='{{ (cell= {:disabled (= ex9-index (dec (count ex9-animals)))}) }}'>Next</button>\n                    </td>\n                    <td id=\"ex9-card\" class=\"display card\" do-text='{{ ex9-card }}'></td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 10 -->\n        <div id=\"ex10\" class=\"example\" on-keydown='{{ #(ex10-keys %) }}'>\n            <h2>Example 10</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex10-button-start-stop\" do-text='{{ ex10-button-name}}' on-click='{{ #(ex10) }}'></button>\n                        <button id=\"ex10-button-prev\" on-click='{{ #(ex10-nav :prev) }}' \n                          do-class='{{ (cell= {:disabled (not= ex10-button-name \"STOP!\")}) }}'>Previous\n                        </button>\n                        <button id=\"ex10-button-next\" on-click='{{ #(ex10-nav :next) }}' do-class='{{ (cell= {:disabled (not= ex10-button-name \"STOP!\")}) }}'>Next</button>\n                    </td>\n                    <td id=\"ex10-card\" class=\"display card\" do-text='{{ ex10-card }}'></td>\n                </tr>\n            </table>\n        </div>\n    </body>\n</html>\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML/pages.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<title>Related Pages</title>\n<link href=\"qt.css\" rel=\"stylesheet\" type=\"text/css\"/>\n</head>\n<body>\n<div class=header>\n<a class=headerLink  href=\"index.html\">Main Page</a> &middot;\n<a class=headerLink  href=\"classoverview.html\">Class Overview</a> &middot;\n<a class=headerLink  href=\"hierarchy.html\">Hierarchy</a> &middot;\n<a class=headerLink  href=\"annotated.html\">All Classes</a>\n</div>\n<!-- Generated by Doxygen 1.8.1.2 -->\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">Related Pages</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<div class=\"textblock\">Here is a list of all related documentation pages:</div><div class=\"directory\">\n<table class=\"directory\">\n<tr id=\"row_0_\" class=\"even\"><td class=\"entry\"><img src=\"ftv2node.png\" alt=\"o\" width=\"16\" height=\"22\" /><a class=\"el\" href=\"classoverview.html\" target=\"_self\">Class Overview</a></td><td class=\"desc\"></td></tr>\n<tr id=\"row_1_\"><td class=\"entry\"><img src=\"ftv2lastnode.png\" alt=\"\\\" width=\"16\" height=\"22\" /><a class=\"el\" href=\"thelayoutsystem.html\" target=\"_self\">The Layout System</a></td><td class=\"desc\"></td></tr>\n</table>\n</div><!-- directory -->\n</div><!-- contents -->\n<div class=\"footer\" />Generated with <a href=\"http://www.doxygen.org/index.html\">Doxygen</a> 1.8.1.2</div>\n</body>\n</html>\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML/rpanel.inc",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<link rel=\"stylesheet\" charset=\"UTF-8\" type=\"text/css\" href=\"main.css\">\n<meta charset=\"UTF-8\">\n</head>\n<body>\n    <div id=\"panel_header_main_form\">\n        <p id=\"panel_header_main_form_title\">Поддержка:</p>\n    </div>\n    <table>\n        <tbody>\n            <tr>\n                <td>    \n                    <p>Москва:</p>\n                </td>\n                <td>    \n                    <p>+7-902-7-800-807</p>\n                </td>\n            </tr>\n            <tr>\n                <td>    \n                    <p>Регионы:</p>\n                </td>\n                <td>    \n                    <p>+7-902-7-800-807</p>\n                </td>\n            </tr>\n        </tbody>\n    </table>\n</body>\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML/tailDel.inc",
    "content": "</UL>\n<P><A HREF=\"devices.html\">Supported Targets</A></P>\n</BODY>\n</HEAD>\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML+Django/_worker.jinja2",
    "content": "<h1>Workers</h1>\n\n<table class=\"workers\">\n  <tr>\n    <th>Job server</th>\n    <th>IP</th>\n    <th>File descriptor</th>\n    <th>Client ID</th>\n    <th>Functions</th>\n  </tr>\n\n{% for server_info in server_infos %}\n  <tr {% if server_info['failed'] %} class=\"failure\" {% endif %} >\n    \n    <th>{{ server_info['hostport'][0] }}:{{ server_info['hostport'][1] }}</th>\n    <th>\n      {%- if server_info['failed'] -%} Not responding! {%- endif -%}\n    </th>\n    <th></th>\n    <th></th>\n    <th></th>\n  </tr>\n  \n  {% if not server_info['failed'] %}\n    {% for worker in server_info['workers'] %}\n    <tr>\n      <td class=\"server\"></td>\n      <td class=\"ip\">{{ worker['ip'] }}</td>\n      <td class=\"file_descriptor\">{{ worker['file_descriptor'] }}</td>\n      <td class=\"client_id\">{{ worker['client_id'] }}</td>\n      <td class=\"functions\">\n        {{ worker['tasks']|join(', ') }}\n      </td>\n    </tr>\n    {% endfor %}\n  {% endif %}\n{% endfor %}\n</table>\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML+Django/nunjucks.njk",
    "content": "{% from \"forms.html\" import label as description %}\n\n\n{% macro field(name, value='', type='text') %}\n    <div class=\"field\">\n        <input type=\"{{ type }}\" name=\"{{ name }}\"\n                value=\"{{ value | escape }}\" />\n    </div>\n{% endmacro %}\n\n<html>\n<head>\n    {% extends \"head.html\" %}\n</head>\n<body>\n{% if horse %}\n    Chuck Norris once kicked a horse in the chin. Its descendants are known today as Giraffes.\n{% elif optimus %}\n    Chuck Norris once urinated in a semi truck's gas tank as a joke....that truck is now known as Optimus Prime.\n{% else %}\n    Chuck Norris threw a grenade and killed 50 people, then the grenade exploded.\n{% endif %}\n\n{% block left %}\n    This is the left side!\n{% endblock %}\n\n{% block right %}\n    This is the right side!\n{% endblock %}\n\n{{ description('Username') }}\n{{ field('user') }}\n{{ field('pass', type='password') }}\n\n<h1>Posts</h1>\n<ul>\n    {% for item in items %}\n        <li>{{ item.title }}</li>\n    {% else %}\n        <li>This would display if the 'item' collection were empty</li>\n    {% endfor %}\n</ul>\n\n{# Don't escape foo #}\n{{ foo | safe }}\n</body>\n</html>\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML+ECR/greeting.ecr",
    "content": "<% if @name %>\n  Greeting, <%= @name %>!\n<% else %>\n  Greeting!\n<% end %>\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML+EEX/index.html.eex",
    "content": "<h1>Listing Books</h1>\n \n<table>\n  <tr>\n    <th>Title</th>\n    <th>Summary</th>\n    <th></th>\n    <th></th>\n    <th></th>\n  </tr>\n\n<%= for book <- @books do %>\n  <tr>\n    <%# comment %>\n    <td><%= book.title %></td>\n    <td><%= book.content %></td>\n    <td><%= link \"Show\", to: book_path(@conn, :show, book) %></td>\n    <td><%= link \"Edit\", to: book_path(@conn, :edit, book) %></td>\n    <td><%= link \"Delete\", to: book_path(@conn, :delete, book), method: :delete, data: [confirm: \"Are you sure?\"] %></td>\n  </tr>\n<% end %>\n</table>\n \n<br />\n \n<%= link \"New book\", to: book_path(@conn, :new) %>\n"
  },
  {
    "path": "src/test/resources/samples/langs/HTML+ERB/fishbowl.html.erb.deface",
    "content": "<!-- insert_before '[data-hook=\"buttons\"]' -->\n<% if Spree::Config[:enable_fishbowl] %>\n<div class=\"row\">\n  <div class=\"twelve columns\" id=\"fishbowl_preferences\">\n    <fieldset class=\"no-border-bottom\">\n      <legend align=\"center\"><%= t(:fishbowl_settings)%></legend>\n      <% @fishbowl_options.each do |key| %>\n          <div class=\"field\">\n            <%= label_tag(key, t(key.to_s.gsub('fishbowl_', '').to_sym) + ': ') + tag(:br) %>\n            <%= text_field_tag('preferences[' + key.to_s + ']', Spree::Config[key], { :size => 10, :class => 'fullwidth' }) %>\n          </div>\n      <% end %>\n      <div class=\"field\">\n        <%= hidden_field_tag 'preferences[fishbowl_always_fetch_current_inventory]', '0' %>\n        <%= check_box_tag('preferences[fishbowl_always_fetch_current_inventory]', \"1\", Spree::Config[:fishbowl_always_fetch_current_inventory]) %>\n        <%= t(:always_fetch_current_inventory) %>\n      </div>\n      <% if !@location_groups.empty? %>\n        <div class=\"field\">\n          <%= label_tag(:fishbowl_location_group, t(:location_group) + ': ') + tag(:br) %>\n          <%= select('preferences', 'fishbowl_location_group', @location_groups, { :selected => Spree::Config[:fishbowl_location_group]}, { :class => ['select2', 'fullwidth'] }) %>\n        </div>\n      <% end %>\n    </fieldset>\n  </div>\n</div>\n\n<script type=\"text/javascript\">\n  $('.select2').select2();\n</script>\n<% end %>"
  },
  {
    "path": "src/test/resources/samples/langs/HTML+ERB/index.html.erb",
    "content": "<% provide(:title, @header) %>\n<% present @users do |user_presenter| %>\n\t<div class=\"row key-header\">\n\t\t<h1><%= @header %></h1>\n\t</div>\n\n\t<div class='row'>\n\t\t<div class='small-12 columns'>\n\t\t\t<%= will_paginate %>\n\t\t</div>\n\t</div>\n\t<div class=\"row key-table\">\n\t\t<div class=\"small-12 columns\">\n\t\t\t<div class=\"row key-table-row\">\n\t\t\t\t<div class=\"small-2 columns\">Name</div>\n\t\t\t\t<div class=\"small-3 columns\">Email</div>\n\t\t\t\t<div class=\"small-1 columns\">Chords</div>\n\t\t\t\t<div class=\"small-1 columns\">Keys</div>\n\t\t\t\t<div class=\"small-1 columns\">Tunings</div>\n\t\t\t\t<div class=\"small-1 columns\">Credits</div>\n\t\t\t\t<div class=\"small-1 columns\">Prem?</div>\n\t\t\t\t<div class=\"small-2 columns\">Since?</div>\n\t\t\t</div>\n\n\t\t\t<% if @users == [] %>\n\t\t\t\t<div class=\"row key-table-row\">\n\t\t\t\t\t<div class=\"small-4 small-centered columns\">No Users</div>\n\t\t\t\t</div>\n\t\t\t<% else %>\n\t\t\t\t<%= render @users %>\n\t\t\t<% end %>\n\t\t</div>\n\t</div>\n\t<div class='row'>\n\t\t<div class='small-12 columns'>\n\t\t\t<%= will_paginate %>\n\t\t</div>\n\t</div>\n<% end %>"
  },
  {
    "path": "src/test/resources/samples/langs/HXML/checkstyle.hxml",
    "content": "buildGlobal.hxml\n-lib mcover:2.1.1\n-D unittest\n-x TestMain\n--macro mcover.MCover.coverage(['checkstyle'], ['src'], ['checkstyle.reporter', 'checkstyle.Main'])\n\n--next\n-cmd neko run -s src -s test -p resources/static-analysis.txt\n-cmd neko run --default-config resources/default-config.json\n-cmd neko run -c resources/default-config.json\n"
  },
  {
    "path": "src/test/resources/samples/langs/HXML/vshaxe.hxml",
    "content": "# This file is generated with vshaxe-build - DO NOT EDIT MANUALLY!\n-cp vscode-extern/src\n-cp src-api\n-cp src\n-cp server/src\n-cp server/protocol/src\n-cp server/formatter/src\n-cp server/test\n-cp server/formatter/test\n-cp syntaxes/src\n-D analyzer-optimize\n-D js_unflatten\n-D hxnodejs-no-version-warning\n-D JSTACK_MAIN=vshaxe.Main.main\n-D JSTACK_ASYNC_ENTRY\n-D JSTACK_FORMAT=vscode\n-lib hxnodejs\n-lib jstack\n-lib haxe-hxparser\n-lib compiletime\n-lib mockatoo\n-lib mconsole\n-lib hx3compat\n-lib hxargs\n-lib json2object\n-lib yaml\n-lib plist\n-debug\n-js bin/build.js\n--no-inline\n-main Build\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/Assert.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfinal class AssertException extends Exception {}\n\nfinal class Assert {\n  public static function isNum(mixed $x): num {\n    if (is_float($x)) {\n      return $x;\n    } else if (is_int($x)) {\n      return $x;\n    }\n    throw new AssertException('Expected an int or float value');\n  }\n\n  public static function isInt(mixed $x): int {\n    if (is_int($x)) {\n      return $x;\n    }\n    throw new AssertException('Expected an int');\n  }\n\n  public static function isFloat(mixed $x): float {\n    if (is_float($x)) {\n      return $x;\n    }\n    throw new AssertException('Expected a float');\n  }\n\n  public static function isString(mixed $x): string {\n    if (is_string($x)) {\n      return $x;\n    }\n    throw new AssertException('Expected a string');\n  }\n\n  // For arrays you need to check every element\n  public static function isArrayOf<T>(\n    (function(mixed): T) $fn,\n    mixed $x,\n  ): array<T> {\n    if (is_array($x)) {\n      return array_map($fn, $x);\n    }\n    throw new AssertException('Expected an array');\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/AssertRecipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';\nrequire_once \"demo.php\";\n\nclass AssertRecipe extends Recipe implements RecipeWithDemo {\n\n  protected function getName(): string {\n    return 'Assert';\n  }\n\n  <<Override>>\n  protected function getDescription(): ?string {\n    return 'When you have values with unknown types, it is useful to make '.\n      'some runtime assertions and have the type checker understand. This '.\n      'recipe demonstrates one approach.';\n  }\n\n  protected function getFilenames(): Vector<string> {\n    return Vector {\n      'Assert.php',\n    };\n  }\n\n  protected function getDocs(): Vector<(string, string)> {\n    return Vector{\n      tuple ('Mixed Types', 'hack.annotations.mixedtypes'),\n      tuple ('Type Inference', 'hack.otherrulesandfeatures.typeinference'),\n    };\n  }\n\n  public function getDemoFilename(): string {\n    return 'demo.php';\n  }\n\n  public function getDemoResult(): string {\n    return assert_main();\n  }\n\n  public function getDemoXHP(): ?:xhp {\n    return null;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/Controller.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/startup/init.php';\n\nabstract class Controller {\n  protected function __construct() {\n    startup();\n  }\n\n  abstract protected function getCSS(): Set<string>;\n  abstract protected function getJS(): Set<string>;\n  abstract protected function getTitle(): string;\n  abstract protected function render(): :xhp;\n\n  final protected function getHead(): :xhp {\n    $css = $this->getCSS()->toVector()->map(\n      ($css) ==> <link rel=\"stylesheet\" type=\"text/css\" href={$css} />\n    );\n    $js = $this->getJS()->toVector()->map(\n      ($js) ==> <script src={$js} />\n    );\n    return\n      <head>\n      <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"/>\n        <title>{$this->getTitle()}</title>\n        {$css->toArray()}\n        {$js->toArray()}\n      </head>;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/DBResultRecipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';\nrequire_once \"demo.php\";\n\nclass DBResultRecipe extends Recipe implements RecipeWithDemo {\n\n  protected function getName(): string {\n    return 'DB Result';\n  }\n\n  <<Override>>\n  protected function getDescription(): ?string {\n    return 'Fetching data from a DB introduces a few typing challenges. '.\n      'First, the data comes back untyped. Second, a row in a DB generally '.\n      'contains columns of different types.';\n  }\n\n  protected function getFilenames(): Vector<string> {\n    return Vector {\n      'FakeDB.php',\n    };\n  }\n\n  protected function getDocs(): Vector<(string, string)> {\n    return Vector{\n      tuple ('Hack Shapes', 'hack.shapes'),\n      tuple ('Mixed Types', 'hack.annotations.mixedtypes'),\n    };\n  }\n\n  public function getDemoFilename(): string {\n    return 'demo.php';\n  }\n\n  public function getDemoResult(): string {\n    return db_result_main();\n  }\n\n  public function getDemoXHP(): ?:xhp {\n    return null;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/Documentation.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';\n\nfinal class :documentation extends :x:element {\n  attribute string name;\n\n  protected function render(): :xhp {\n    $name = implode('.', explode(' ', $this->getAttribute('name'))).\".php\";\n    $href = \"http://hhvm.com/manual/en/$name\";\n    return <a class=\"docs button\" href={$href} target=\"_blank\">docs &rarr;</a>;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/FakeDB.hh",
    "content": "<?hh // strict\n\ntype DBResultExtra = shape('age' => int);\ntype DBResult = shape(\n  'id' => int,\n  'name' => string,\n  'extra' => DBResultExtra,\n);\n\nfinal class FakeDB {\n  public function getRawRows(): array<array<string, mixed>> {\n    $good_extra = json_encode(array('age' => 40));\n    $bad_extra = 'corrupt data';\n    // Real code would query a DB, but for now let's hardcode it\n    return array(\n      array(\n        'id' => 123,\n        'name' => 'Alice',\n        'extra' => $good_extra,\n      ),\n      array(\n        'id' => 456,\n        'name' => 'Bob',\n        'extra' => $bad_extra,\n      ),\n    );\n  }\n\n  /**\n   * When processing untyped data you need to check each piece of data and\n   * figure out whether to give up or recover when the data is bad\n   */\n  public function processRow(array<string, mixed> $row): ?DBResult {\n    $row = Map::fromArray($row);\n    $id = $row->contains('id') ? $row['id'] : null;\n    $name = $row->contains('name') ? $row['name'] : null;\n    $extra = $row->contains('extra') ? json_decode($row['extra'], true) : null;\n\n    // Ignore rows with invalid IDs or names\n    if (!is_int($id) || !is_string($name)) {\n      return null;\n    }\n\n    // Try to recover from a bad extra column\n    if (!is_array($extra)) {\n      $extra = shape('age' => 0);\n    } else {\n      $extra = Map::fromArray($extra);\n      $extra = shape('age' => $extra->contains('age') ? $extra['age'] : 0);\n    }\n\n    return shape('id' => $id, 'name' => $name, 'extra' => $extra);\n  }\n\n  public function getDBResults(): Vector<DBResult> {\n    $ret = Vector {};\n    foreach ($this->getRawRows() as $raw_row) {\n      $row = $this->processRow($raw_row);\n      if ($row !== null) {\n        $ret->add($row);\n      }\n    }\n    return $ret;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/GetAndPostRecipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';\nrequire_once \"demo.php\";\n\nclass GetAndPostRecipe extends Recipe implements RecipeWithDemo {\n\n  protected function getName(): string {\n    return '$_GET and $_POST';\n  }\n\n  <<Override>>\n  protected function getDescription(): ?string {\n    return 'A small example of how to interact with superglobals and the '.\n      'untyped data they can contain.';\n  }\n\n  protected function getFilenames(): Vector<string> {\n    return Vector {\n      'NonStrictFile.php',\n      'StrictFile.php',\n    };\n  }\n\n  protected function getDocs(): Vector<(string, string)> {\n    return Vector {\n      tuple('invariant()', 'hack.otherrulesandfeatures.invariant'),\n    };\n  }\n\n  public function getDemoFilename(): string {\n    return 'demo.php';\n  }\n\n  public function getDemoResult(): string {\n    return get_and_post_main();\n  }\n\n  public function getDemoXHP(): :xhp {\n    $url = '/recipes/get-and-post/';\n    return\n      <x:frag>\n        <div>\n          <a href={\"$url?myIntParam=8675309#demo\"} class=\"button\">GET myIntParam=8675309</a>\n        </div>\n        <div>\n        <a href={\"$url?myIntParam=boom#demo\"} class=\"button\">GET myIntParam=boom</a>\n        </div>\n        <div>\n        <form action={\"$url#demo\"} method=\"post\">\n          <input type=\"hidden\" name=\"myIntParam\" value=\"5551234\"/>\n          <input type=\"submit\" class=\"button\" value=\"POST myIntParam=5551234\"/>\n        </form>\n        </div>\n        <div>\n        <form action={\"$url#demo\"} method=\"post\">\n          <input type=\"hidden\" name=\"myIntParam\" value=\"boom\"/>\n          <input type=\"submit\" class=\"button\" value=\"POST myIntParam=boom\"/>\n        </form>\n        </div>\n      </x:frag>;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/GetController.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nabstract class GetController extends Controller {\n  final protected function __construct(private Request $request) {\n    parent::__construct();\n  }\n\n  final protected function getRequest(): Request {\n    return $this->request;\n  }\n\n  final public function go(array<mixed, mixed> $get): void {\n    $request = new Request(Map::fromArray($get));\n    $controller = new static($request);\n    echo \"<!DOCTYPE html>\";\n    $head = $controller->getHead();\n    $body = $controller->render();\n    echo (string)$head;\n    echo (string)$body;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/HomeController.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/init.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/standard-page/init.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';\n\nclass HomeController extends GetController {\n  use StandardPage;\n\n  protected function getTitle(): string {\n    return 'Hack Cookbook';\n  }\n\n  protected function renderMainColumn(): :xhp {\n    return <div>\n      <h1>Cookbook</h1>\n      <p>\n        The Hack Cookbook helps you write Hack code by giving you examples of\n        Hack code. It is written in Hack and is open source. If you\n        <a href=\"http://github.com/facebook/hack-example-site\">\n          head over to GitHub,\n        </a>\n        you can read the code, check out the repository, and run it\n        yourself. The recipes in this cookbook are small examples that\n        illustrate how to use Hack to solve common and interesting problems.\n      </p>\n    </div>;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/MySecureRequest.hh",
    "content": "<?hh // strict\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/funs/init.php';\n\nfinal class MySecureRequest {\n  public function __construct(private Map<string, mixed> $GETParams) {}\n  public function stringParam(string $name): UNESCAPED_STRING {\n    invariant($this->GETParams->contains($name), 'Unknown GET param: '.$name);\n    $raw_string = $this->GETParams[$name];\n    invariant(is_string($raw_string), $name.' is not a string');\n    return unescaped_string($raw_string);\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/Nav.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';\n\ntype NavItem = shape(\n  'name' => string,\n  'location' => string,\n);\n\ntype NavSection = shape(\n  'name' => string,\n  'location' => ?string,\n  'items' => Vector<NavItem>,\n);\n\nfinal class :hack:nav extends :x:element {\n  private function getNavSections(): Vector<NavSection> {\n    return Vector{\n      shape(\n        'name' => 'Home',\n        'location' => '/',\n        'items' => Vector {},\n      ),\n      shape(\n        'name' => 'GitHub',\n        'location' => 'http://github.com/facebook/hack-example-site',\n        'items' => Vector {},\n      ),\n      shape(\n        'name' => 'Recipes',\n        'location' => null,\n        'items' => Vector {\n          shape(\n            'name' => '$_GET and $_POST',\n            'location' => '/recipes/get-and-post/',\n          ),\n          shape(\n            'name' => 'Assert',\n            'location' => '/recipes/assert/',\n          ),\n          shape(\n            'name' => 'DB Result',\n            'location' => '/recipes/db-result/',\n          ),\n          shape(\n            'name' => 'Unescaped String',\n            'location' => '/recipes/unescaped-string/',\n          ),\n          shape(\n            'name' => 'User ID',\n            'location' => '/recipes/user-id/',\n          ),\n        },\n      ),\n    };\n  }\n\n  private function renderNavItems(Vector<NavItem> $items): :xhp {\n    $render_item = $item ==>\n      <li>\n        <a class=\"navItem\" href={$item['location']}>\n          {$item['name']}\n        </a>\n      </li>;\n    return\n      <x:frag>\n        {$items->map($render_item)->toArray()}\n      </x:frag>;\n  }\n\n  private function renderNavSection(NavSection $section): :xhp {\n    $section_item = <h3 class=\"navItem\">{$section['name']}</h3>;\n    if ($section['location'] !== null) {\n      $section_item = <a href={$section['location']}>{$section_item}</a>;\n    }\n    return\n      <li class=\"navSectionItem\">\n        {$section_item}\n        <ul class=\"navItems\">\n          {$this->renderNavItems($section['items'])}\n        </ul>\n      </li>;\n  }\n\n  public function render(): :xhp {\n    $sections = $this->getNavSections()\n      ->map($section ==> $this->renderNavSection($section));\n    return\n      <div class=\"nav\">\n        <ul class=\"navSections\">\n          {$sections->toArray()}\n        </ul>\n      </div>;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/NonStrictFile.hh",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfunction getGETParams(): Map<string, mixed> {\n  // $_GET is not defined in code so Hack doesn't know about it and you can't\n  // use it in strict mode. You can interact with it outside of strict mode,\n  // though.\n  return Map::fromArray($_GET);\n}\n\nfunction getPOSTParams(): Map<string, mixed> {\n  // Same deal with $_POST and other magically defined globals\n  return Map::fromArray($_POST);\n}\n\n// Same deal with $_SERVER\nfunction isGET(): bool {\n  return $_SERVER['REQUEST_METHOD'] === 'GET';\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/Recipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/init.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/standard-page/init.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/myxhp/init.php';\n\nabstract class Recipe extends GetController {\n  use StandardPage;\n\n  abstract protected function getName(): string;\n  abstract protected function getFilenames(): Vector<string>;\n  abstract protected function getDocs(): Vector<(string, string)>;\n\n  protected function getDescription(): ?string {\n    return null;\n  }\n\n  final protected function getTitle(): string {\n    return $this->getName().' - Hack Cookbook';\n  }\n\n  final protected function renderMainColumn(): :xhp {\n    $main_column =\n      <x:frag>\n        <h1>{$this->getName()}</h1>\n      </x:frag>;\n    $description = $this->getDescription();\n    if ($description !== null) {\n      $main_column->appendChild(<p>{$description}</p>);\n    }\n    foreach ($this->getFilenames() as $filename) {\n      $file =\n        <div class=\"file\">\n          <div class=\"filename\">{$filename}</div>\n          <phpfile filename={$filename}/>\n        </div>;\n      $main_column->appendChild($file);\n    }\n    $recipe = $this;\n    if ($recipe instanceof RecipeWithDemo) {\n      try {\n        $result = $recipe->getDemoResult();\n      } catch (Exception $e) {\n        $result = sprintf(\n          \"Demo threw an %s:\\n%s\",\n          get_class($e),\n          $e->getMessage(),\n        );\n      }\n      $result = explode(\"\\n\", trim($result));\n      $result = array_map($x ==> <x:frag>{$x}<br/></x:frag>, $result);\n      $demo =\n        <x:frag>\n          <div class=\"demo\" id=\"demo\">\n            <h3>Demo</h3>\n            {$recipe->getDemoXHP()}\n            <div class=\"filename\">{$recipe->getDemoFilename()}</div>\n            <phpfile filename={$recipe->getDemoFilename()}/>\n            <div class=\"filename\">Output</div>\n            <div class=\"demoResult\">\n              {$result}\n            </div>\n          </div>\n        </x:frag>;\n      $main_column->appendChild($demo);\n    }\n    if (!$this->getDocs()->isEmpty()) {\n      $render_doc_link = function($doc) {\n        list($name, $link) = $doc;\n        $link = \"http://hhvm.com/manual/en/$link.php\";\n        return <li><a href={$link}>{$name}</a></li>;\n      };\n      $main_column->appendChild(\n        <div class=\"docs\">\n          <h3>Relevant Official Documentation</h3>\n          <ul>\n            {$this->getDocs()->map($render_doc_link)->toArray()}\n          </ul>\n        </div>\n      );\n    }\n    return $main_column;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/RecipeWithDemo.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\ninterface RecipeWithDemo {\n  public function getDemoFilename(): string;\n  public function getDemoResult(): string;\n  public function getDemoXHP(): ?:xhp;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/Request.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfinal class Request {\n  public function __construct(private Map<string, mixed> $params) {}\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/StandardPage.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\ntrait StandardPage {\n  require extends Controller;\n\n  abstract protected function renderMainColumn(): :xhp;\n\n  protected function getExtraCSS(): Set<string> {\n    return Set {};\n  }\n\n  protected function getExtraJS(): Set<string> {\n    return Set {};\n  }\n\n  final protected function getCSS(): Set<string> {\n    return (Set {\n      '/css/base.css',\n    })->addAll($this->getExtraCSS());\n  }\n\n  final protected function getJS(): Set<string> {\n    return (Set {\n    })->addAll($this->getExtraJS());\n  }\n\n  final private function renderHeader(): :xhp {\n    return\n      <div class=\"hackHeader\">\n        <div class=\"width\">\n          <a href=\"http://hacklang.org/\">\n            <div class=\"logo\">Hack</div>\n          </a>\n          <div class=\"headerNav\">\n          <ul>\n            <li>\n              <a href=\"http://hacklang.org/install/\">Install</a>\n            </li>\n            <li>\n              <a href=\"http://hacklang.org/tutorial/\">Tutorial</a>\n            </li>\n            <li>\n              <a href=\"/\">Cookbook</a>\n            </li>\n            <li>\n              <a href=\"http://hhvm.com/manual\">Docs</a>\n            </li>\n            <li>\n              <a href=\"http://github.com/facebook/hhvm\">GitHub</a>\n            </li>\n            <li>\n              <a href=\"http://hhvm.com/\">HHVM</a>\n            </li>\n          </ul>\n          </div>\n        </div>\n      </div>;\n  }\n\n  final protected function render(): :xhp {\n    return\n      <div>\n        {$this->renderHeader()}\n        <div class=\"width\">\n          <div class=\"mainContainer\">\n            <div class=\"mainColumn\">{$this->renderMainColumn()}</div>\n            <hack:nav/>\n          </div>\n        </div>\n    </div>;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/StrictFile.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/funs/init.php';\n\nabstract class MyRequest {\n  abstract public function getParams(): Map<string, mixed>;\n\n  // Throws when things go wrong\n  public function intParamX(string $name): int {\n    $params = $this->getParams();\n    invariant($params->contains($name), sprintf('Unknown param: %s', $name));\n    $param = $params[$name];\n    invariant(is_numeric($param), sprintf('Param %s is not an int', $name));\n    return (int)$param;\n  }\n\n  // A lenient version\n  public function intParam(string $name): ?int {\n    $params = $this->getParams();\n    if (!$params->contains($name)) { return null; }\n    $param = $params[$name];\n    if (!is_numeric($param)) { return null; }\n    return (int)$param;\n  }\n}\n\nfinal class MyGETRequest extends MyRequest {\n  public function getParams(): Map<string, mixed> {\n    return getGETParams();\n  }\n}\n\nfinal class MyPOSTRequest extends MyRequest {\n  public function getParams(): Map<string, mixed> {\n    return getPOSTParams();\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/UnescapedString.hh",
    "content": "<?hh // strict\n\n// Outside of this file, no one knows that UNESCAPED_STRING is a string\nnewtype UNESCAPED_STRING = string;\n\n// This is how we initially taint a string.\nfunction unescaped_string(string $s): UNESCAPED_STRING {\n  return $s;\n}\n\n// This is the only thing you can do with an UNESCAPED_STRING (other than pass\n// it around)\nfunction escape_unescaped_string(UNESCAPED_STRING $s): string {\n  // Your use case will decide how you want to escape your strings\n  return sprintf('Escaped ---> \"%s\" <--- Escaped', $s);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/UnescapedStringRecipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';\nrequire_once \"demo.php\";\n\nclass UnescapedStringRecipe extends Recipe implements RecipeWithDemo {\n\n  protected function getName(): string {\n    return 'Unescaped string';\n  }\n\n  <<Override>>\n  protected function getDescription(): ?string {\n    return 'Forgetting to properly escape the strings you get from your users '.\n      'can lead to serious security holes. Hack can help by forcing you to '.\n      'escape these strings before using them as strings.';\n  }\n\n  protected function getFilenames(): Vector<string> {\n    return Vector {\n      'UnescapedString.php',\n      'MySecureRequest.php',\n    };\n  }\n\n  protected function getDocs(): Vector<(string, string)> {\n    return Vector{\n      tuple('Opaque Type Aliasing',  'hack.typealiasing.opaquetypealiasing'),\n    };\n  }\n\n  public function getDemoFilename(): string {\n    return 'demo.php';\n  }\n\n  public function getDemoResult(): string {\n    return unescaped_string_main();\n  }\n\n  public function getDemoXHP(): ?:xhp {\n    $url = '/recipes/unescaped-string/';\n    return\n      <x:frag>\n        Try setting the myStrParam GET param to something nice and innocent with this button...\n        <div>\n          <a href={\"$url?myStrParam='); DROP TABLE important_stuff; --#demo\"} class=\"button\">GET myStrParam=Hello world</a>\n        </div>\n      </x:frag>;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/UserID.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/funs/init.php';\n\n// Outside of this file, no one knows that these types are ints. They do know\n// that USER_ID is an ID and COW_ID is an ID\nnewtype ID = int;\nnewtype USER_ID as ID = ID;\nnewtype COW_ID as ID = ID;\n\nfunction assert_user_id(int $x): USER_ID {\n  // Everyone knows all user ids are odd\n  invariant($x % 2, sprintf('Invalid user ID: %d', $x));\n  return $x;\n}\n\nfunction assert_cow_id(int $x): COW_ID {\n  // Everyone knows all cow ids are even\n  invariant($x % 2 === 0, sprintf('Invalid cow ID: %d', $x));\n  return $x;\n}\n\nfunction id_to_int(ID $id): int {\n  return $id;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/UserIDRecipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';\nrequire_once \"demo.php\";\n\nclass UserIDRecipe extends Recipe implements RecipeWithDemo {\n\n  protected function getName(): string {\n    return 'User ID';\n  }\n\n  <<Override>>\n  protected function getDescription(): ?string {\n    return 'Protect your user IDs from being confused with normal ints';\n  }\n\n  protected function getFilenames(): Vector<string> {\n    return Vector {\n      'UserID.php',\n      'UsingUserID.php',\n    };\n  }\n\n  protected function getDocs(): Vector<(string, string)> {\n    return Vector {\n      tuple('Opaque Type Aliasing',  'hack.typealiasing.opaquetypealiasing'),\n      tuple(\n        'Opaque Type Aliasing with Constraints',\n        'hack.typealiasing.opaquewithconstraints',\n      ),\n    };\n  }\n\n  public function getDemoFilename(): string {\n    return 'demo.php';\n  }\n\n  public function getDemoResult(): string {\n    return user_id_main();\n  }\n\n  public function getDemoXHP(): ?:xhp {\n    return null;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/UsingUserID.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfunction get_something_string(ID $id, string $something): string {\n  return sprintf(\"Awesome %s #%d\\n\", $something, id_to_int($id));\n}\n\nfunction get_user_string(USER_ID $id): string {\n  return get_something_string($id, 'user');\n}\n\nfunction get_cow_string(COW_ID $id): string {\n  return get_something_string($id, 'cow');\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/error.hh",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfinal class TypehintViolationException extends Exception {\n}\n\nfunction setup_errors(): void {\n  set_error_handler('handle_error', E_ALL);\n}\n\n/**\n * I want to turn failed typehints into exceptions so that I can handle them in\n * my example code\n */\nfunction handle_error(\n  $errno,\n  $errstr,\n  $errfile,\n  $errline,\n  $errcontext = array(),\n  $errtrace = array(),\n): bool {\n  if (E_RECOVERABLE_ERROR == $errno) {\n    // Transform typehint failures into an exception.\n    if (strpos($errstr, 'must be an instance of ') !== false) {\n      throw new TypehintViolationException($errstr);\n    }\n    // Transform nullable type violations to exceptions.\n    if ((strpos($errstr, 'must be of type ?') !== false) &&\n        (strpos($errstr, 'Value returned from') === false)) {\n      throw new TypehintViolationException($errstr);\n    }\n  }\n  return false;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/funs.hh",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n/**\n * This file contains a bunch of php stubs for functions that have been added\n * to hhvm (though aren't in a release yet). These are important because the\n * Hack typechecker can understand them\n */\n\nclass InvariantViolationException extends Exception {}\n\nfunction invariant(mixed $test, string $message): void {\n  if (!$test) {\n    invariant_violation($message);\n  }\n}\n\nfunction invariant_violation(string $message): void {\n  throw new InvariantViolationException($message);\n}\n\nfunction class_meth(string $class, string $method) {\n  return array($class, $method);\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/funs.php",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n/**\n * This file contains a bunch of php stubs for functions that have been added\n * to hhvm (though aren't in a release yet). These are important because the\n * Hack typechecker can understand them\n */\n\nclass InvariantViolationException extends Exception {}\n\nfunction invariant(mixed $test, string $message): void {\n  if (!$test) {\n    invariant_violation($message);\n  }\n}\n\nfunction invariant_violation(string $message): void {\n  throw new InvariantViolationException($message);\n}\n\nfunction class_meth(string $class, string $method) {\n  return array($class, $method);\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/index.hh",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once 'HomeController.php';\n\nHomeController::go($_GET);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/phpfile.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';\n\nfinal class :phpfile extends :x:primitive {\n  category %flow;\n\n  attribute string filename;\n\n  /**\n   * Ok, I'll admit this is kind of gross. I don't really want to implement\n   * syntax highlighting, so I'm relying on the built-in PHP support. XHP\n   * makes html strings sort of difficult to use (which is good cause they're\n   * dangerous). Anyway, this is one way around it :)\n   */\n  protected function stringify(): string {\n    return\n      '<div class=\"code\">'.\n      (string)highlight_file($this->getAttribute('filename'), /*ret*/ true).\n      '</div>';\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hack/startup.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfunction startup(): void {\n  setup_errors();\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Haml/buttons.html.haml.deface",
    "content": "/\n  replace '.actions'\n\n.pull-right\n  .btn-group\n    = link_to page.url, target: \"_blank\", title: t('.view_live_html'), class: \"tip btn btn-xs btn-default\" do\n      %i.icon-picture.row-black\n      \n    = link_to refinery.edit_admin_page_path(page.nested_url,\n        switch_locale: (page.translations.first.locale unless page.translated_to_default_locale?)),\n        title: t('edit', :scope => 'refinery.admin.pages'),\n        class: \"tip btn btn-xs btn-default\" do\n      %i.icon-edit.row-blue\n      \n    \n    - if page.deletable?\n      = link_to refinery.admin_page_path(page.nested_url), \n          methode: :delete,\n          title: t('delete', :scope => 'refinery.admin.pages'), \n          class: \"tip cancel confirm-delete btn btn-xs btn-default\", \n          data: { confirm: t('message', scope: 'refinery.admin.delete', title: page_title_with_translations(page)) } do\n        %i.icon-trash.row-red\n    - else\n      %button.btn.btn-xs.btn-default.disabled\n        %i.icon-trash\n      \n  .btn-group\n    = link_to refinery.new_admin_page_path(:parent_id => page.id), title: t('new', :scope => 'refinery.admin.pages'), class: \"tip btn btn-xs btn-default\" do\n      %i.icon-plus.row-green\n"
  },
  {
    "path": "src/test/resources/samples/langs/Haml/hello.haml",
    "content": "%p\n  Hello,\n  World!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Handlebars/basic.handlebars",
    "content": "<div class=\"entry\">\n  <h1>{{title}}</h1>\n  <div class=\"body\">\n    {{body}}\n  </div>\n</div>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Handlebars/each.hbs",
    "content": "<div class=\"post\">\n  <h1>By {{fullName author}}</h1>\n  <div class=\"body\">{{body}}</div>\n\n  <h1>Comments</h1>\n\n  {{#each comments}}\n  <h2>By {{fullName author}}</h2>\n  <div class=\"body\">{{body}}</div>\n  {{/each}}\n</div>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Haskell/Hello.hs",
    "content": "import Data.Char\n\nmain :: IO ()\nmain = do\n\tlet hello = \"hello world\"\n\tputStrLn $ map toUpper hello"
  },
  {
    "path": "src/test/resources/samples/langs/Haskell/HsColour.hs",
    "content": "-- | This is a library which colourises Haskell code.\n--   It currently has six output formats:\n--\n-- * ANSI terminal codes\n--\n-- * LaTeX macros\n--\n-- * HTML 3.2 with font tags\n--\n-- * HTML 4.01 with external CSS.\n--\n-- * XHTML 1.0 with internal CSS.\n--\n-- * mIRC chat client colour codes.\n--\nmodule Language.Haskell.HsColour (Output(..), ColourPrefs(..),\n                                  hscolour) where\n\nimport Language.Haskell.HsColour.Colourise  (ColourPrefs(..))\nimport qualified Language.Haskell.HsColour.TTY        as TTY\nimport qualified Language.Haskell.HsColour.HTML       as HTML\nimport qualified Language.Haskell.HsColour.CSS        as CSS\nimport qualified Language.Haskell.HsColour.ACSS       as ACSS \nimport qualified Language.Haskell.HsColour.InlineCSS  as ICSS\nimport qualified Language.Haskell.HsColour.LaTeX      as LaTeX\nimport qualified Language.Haskell.HsColour.MIRC       as MIRC\nimport Data.List(mapAccumL, isPrefixOf)\nimport Data.Maybe\nimport Language.Haskell.HsColour.Output\n--import Debug.Trace\n\n-- | Colourise Haskell source code with the given output format.\nhscolour :: Output      -- ^ Output format.\n         -> ColourPrefs -- ^ Colour preferences (for formats that support them).\n         -> Bool        -- ^ Whether to include anchors.\n         -> Bool        -- ^ Whether output document is partial or complete.\n         -> String\t-- ^ Title for output.\n         -> Bool        -- ^ Whether input document is literate haskell or not\n         -> String      -- ^ Haskell source code.\n         -> String      -- ^ Coloured Haskell source code.\nhscolour output pref anchor partial title False =\n        (if partial then id else top'n'tail output title) .\n        hscolour' output pref anchor\nhscolour output pref anchor partial title True  =\n        (if partial then id else top'n'tail output title) .\n        concatMap chunk . joinL . classify . inlines\n  where\n    chunk (Code c) = hscolour' output pref anchor c\n    chunk (Lit c)  = c\n\n-- | The actual colourising worker, despatched on the chosen output format.\nhscolour' :: Output      -- ^ Output format.\n          -> ColourPrefs -- ^ Colour preferences (for formats that support them)\n          -> Bool        -- ^ Whether to include anchors.\n          -> String      -- ^ Haskell source code.\n          -> String      -- ^ Coloured Haskell source code.\nhscolour' TTY       pref _      = TTY.hscolour     pref\nhscolour' (TTYg tt) pref _      = TTY.hscolourG tt pref\nhscolour' MIRC      pref _      = MIRC.hscolour    pref\nhscolour' LaTeX     pref _      = LaTeX.hscolour   pref\nhscolour' HTML      pref anchor = HTML.hscolour    pref anchor\nhscolour' CSS       _    anchor = CSS.hscolour          anchor\nhscolour' ICSS      pref anchor = ICSS.hscolour    pref anchor\nhscolour' ACSS      _    anchor = ACSS.hscolour         anchor\n\n-- | Choose the right headers\\/footers, depending on the output format.\ntop'n'tail :: Output           -- ^ Output format\n           -> String           -- ^ Title for output\n           -> (String->String) -- ^ Output transformer\ntop'n'tail TTY   _     = id\ntop'n'tail (TTYg _) _  = id\ntop'n'tail MIRC  _     = id\ntop'n'tail LaTeX title = LaTeX.top'n'tail title\ntop'n'tail HTML  title = HTML.top'n'tail title\ntop'n'tail CSS   title = CSS.top'n'tail  title\ntop'n'tail ICSS  title = ICSS.top'n'tail title\ntop'n'tail ACSS  title = CSS.top'n'tail  title\n\n-- | Separating literate files into code\\/comment chunks.\ndata Lit = Code {unL :: String} | Lit {unL :: String} deriving (Show)\n\n-- Re-implementation of 'lines', for better efficiency (but decreased laziness).\n-- Also, importantly, accepts non-standard DOS and Mac line ending characters.\n-- And retains the trailing '\\n' character in each resultant string.\ninlines :: String -> [String]\ninlines s = lines' s id\n  where\n  lines' []             acc = [acc []]\n  lines' ('\\^M':'\\n':s) acc = acc ['\\n'] : lines' s id\t-- DOS\n--lines' ('\\^M':s)      acc = acc ['\\n'] : lines' s id\t-- MacOS\n  lines' ('\\n':s)       acc = acc ['\\n'] : lines' s id\t-- Unix\n  lines' (c:s)          acc = lines' s (acc . (c:))\n\n\n-- | The code for classify is largely stolen from Language.Preprocessor.Unlit.\nclassify ::  [String] -> [Lit]\nclassify []             = []\nclassify (x:xs) | \"\\\\begin{code}\"`isPrefixOf`x\n                        = Lit x: allProg xs\n   where allProg []     = []  -- Should give an error message,\n                              -- but I have no good position information.\n         allProg (x:xs) | \"\\\\end{code}\"`isPrefixOf`x\n                        = Lit x: classify xs\n         allProg (x:xs) = Code x: allProg xs\nclassify (('>':x):xs)   = Code ('>':x) : classify xs\nclassify (x:xs)         = Lit x: classify xs\n\n-- | Join up chunks of code\\/comment that are next to each other.\njoinL :: [Lit] -> [Lit]\njoinL []                  = []\njoinL (Code c:Code c2:xs) = joinL (Code (c++c2):xs)\njoinL (Lit c :Lit c2 :xs) = joinL (Lit  (c++c2):xs)\njoinL (any:xs)            = any: joinL xs\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Haskell/Main.hs",
    "content": "module Main where\n\nimport Sudoku\nimport Data.Maybe\n\n\nsudoku :: Sudoku\nsudoku = [8, 0, 1, 3, 4, 0, 0, 0, 0,\n          4, 3, 0, 8, 0, 0, 1, 0, 7,\n          0, 0, 0, 0, 6, 0, 0, 0, 3,\n          2, 0, 8, 0, 5, 0, 0, 0, 9,\n          0, 0, 9, 0, 0, 0, 7, 0, 0,\n          6, 0, 0, 0, 7, 0, 8, 0, 4,\n          3, 0, 0, 0, 1, 0, 0, 0, 0,\n          1, 0, 5, 0, 0, 6, 0, 4, 2,\n          0, 0, 0, 0, 2, 4, 3, 0, 8]\n\n{-\nsudoku :: Sudoku\nsudoku = [8, 6, 1, 3, 4, 7, 2, 9, 5,\n\t\t  4, 3, 2, 8, 9, 5, 1, 6, 7,\n\t\t  9, 5, 7, 1, 6, 2, 4, 8, 3,\n\t\t  2, 7, 8, 4, 5, 1, 6, 3, 9,\n\t\t  5, 4, 9, 6, 8, 3, 7, 2, 1,\n\t\t  6, 1, 3, 2, 7, 9, 8, 5, 4,\n\t\t  3, 2, 4, 9, 1, 8, 5, 7, 6,\n\t\t  1, 8, 5, 7, 3, 6, 9, 4, 2,\n\t\t  7, 9, 6, 5, 2, 4, 3, 1, 8]\n-}\nmain :: IO ()\nmain = do\n\tputStrLn $ pPrint sudoku ++ \"\\n\\n\"\n\tputStrLn $ pPrint $ fromMaybe [] $ solve sudoku"
  },
  {
    "path": "src/test/resources/samples/langs/Haskell/Sudoku.hs",
    "content": "module Sudoku\n(\n  Sudoku,\n  solve,\n  isSolved,\n  pPrint\n) where\n\nimport Data.Maybe\nimport Data.List\nimport Data.List.Split\n\ntype Sudoku = [Int]\n\nsolve :: Sudoku -> Maybe Sudoku\nsolve sudoku\n  | isSolved sudoku = Just sudoku\n  | otherwise = do\n    index <- elemIndex 0 sudoku\n    let sudokus = [nextTest sudoku index i | i <- [1..9],\n                                  checkRow (nextTest sudoku index i) index,\n                                  checkColumn (nextTest sudoku index i) index,\n                                  checkBox (nextTest sudoku index i) index]\n    listToMaybe $ mapMaybe solve sudokus\n  where nextTest sudoku index i = take index sudoku ++ [i] ++ drop (index+1) sudoku\n        checkRow sudoku index = (length $ getRow sudoku index) == (length $ nub $ getRow sudoku index)\n        checkColumn sudoku index = (length $ getColumn sudoku index) == (length $ nub $ getColumn sudoku index)\n        checkBox sudoku index = (length $ getBox sudoku index) == (length $ nub $ getBox sudoku index)\n        getRow sudoku index = filter (/=0) $ (chunksOf 9 sudoku) !! (quot index 9)\n        getColumn sudoku index = filter (/=0) $ (transpose $ chunksOf 9 sudoku) !! (mod index 9)\n        getBox sudoku index = filter (/=0) $ (map concat $ concatMap transpose $ chunksOf 3 $ map (chunksOf 3) $ chunksOf 9 sudoku)\n                                                                                !! (3 * (quot index 27) + (quot (mod index 9) 3))\n\nisSolved :: Sudoku -> Bool\nisSolved sudoku\n  | product sudoku == 0 = False\n  | map (length . nub) sudokuRows /= map length sudokuRows = False\n  | map (length . nub) sudokuColumns /= map length sudokuColumns = False\n  | map (length . nub) sudokuBoxes /= map length sudokuBoxes = False\n  | otherwise = True\n  where sudokuRows = chunksOf 9 sudoku\n        sudokuColumns = transpose sudokuRows\n        sudokuBoxes = map concat $ concatMap transpose $ chunksOf 3 $ map (chunksOf 3) $ chunksOf 9 sudoku\n\npPrint :: Sudoku -> String\npPrint sudoku = intercalate \"\\n\" $ map (intercalate \" \" . map show) $ chunksOf 9 sudoku"
  },
  {
    "path": "src/test/resources/samples/langs/Haskell/maze-solving.hs",
    "content": "#!/usr/bin/runhaskell\n\nimport Data.Maybe\n\n-- given two points, returns the average of them\naverage :: (Int, Int) -> (Int, Int) -> (Int, Int)\naverage (x, y) (x', y') = ((x + x') `div` 2, (y + y') `div` 2)\n\n-- given a maze and a tuple of position and wall position, returns\n-- true if the wall position is not blocked (first position is unused)\nnotBlocked :: [String] -> ((Int, Int), (Int, Int)) -> Bool\nnotBlocked maze (_, (x, y)) = ' ' == (maze !! y) !! x\n\n-- given a list, a position, and an element, returns a new list\n-- with the new element substituted at the position\n-- (it seems such a function should exist in the standard library;\n-- I must be missing it)\nsubstitute :: [a] -> Int -> a -> [a]\nsubstitute orig pos el =\n  let (before, after) = splitAt pos orig\n  in before ++ [el] ++ tail after\n\n-- given a maze and a position, draw a '*' at that position in the maze\ndraw :: [String] -> (Int, Int) -> [String]\ndraw maze (x,y) = substitute maze y $ substitute row x '*'\n  where row = maze !! y\n\n-- given a maze, a previous position, and a list of tuples of potential\n-- new positions and their wall positions, returns the solved maze, or\n-- None if it cannot be solved\ntryMoves :: [String] -> (Int, Int) -> [((Int, Int), (Int, Int))] -> Maybe [String]\ntryMoves _ _ [] = Nothing\ntryMoves maze prevPos ((newPos,wallPos):more) =\n  case solve' maze newPos prevPos\n       of Nothing -> tryMoves maze prevPos more\n          Just maze' -> Just $ foldl draw maze' [newPos, wallPos]\n\n-- given a maze, a new position, and a previous position, returns\n-- the solved maze, or None if it cannot be solved\n-- (assumes goal is upper-left corner of maze)\nsolve' :: [String] -> (Int, Int) -> (Int, Int) -> Maybe [String]\nsolve' maze (2, 1) _ = Just maze\nsolve' maze pos@(x, y) prevPos =\n  let newPositions = [(x, y - 2), (x + 4, y), (x, y + 2), (x - 4, y)]\n      notPrev pos' = pos' /= prevPos\n      newPositions' = filter notPrev newPositions\n      wallPositions = map (average pos) newPositions'\n      zipped = zip newPositions' wallPositions\n      legalMoves = filter (notBlocked maze) zipped\n  in tryMoves maze pos legalMoves\n\n-- given a maze, returns a solved maze, or None if it cannot be solved\n-- (starts at lower right corner and goes to upper left corner)\nsolve :: [String] -> Maybe [String]\nsolve maze = solve' (draw maze start) start (-1, -1)\n  where startx = length (head maze) - 3\n        starty = length maze - 2\n        start = (startx, starty)\n\n-- takes unsolved maze on standard input, prints solved maze on standard output\nmain = interact main'\n  where main' x = unlines $ fromMaybe [\"can't solve\"] $ solve $ lines x\n"
  },
  {
    "path": "src/test/resources/samples/langs/Haxe/HaxeExamples.hx",
    "content": "using StringTools;\n\n/***** INHERITANCE *****/\nclass Parent {\n  public var seen = [];\n  public function new() {\n    seen.push(\"parent\");\n  }\n}\nclass Child extends Parent {\n  override public function new(){\n    super(); // mandatory, and only works from new, for some reason :/\n    seen.push(\"child\");\n  }\n}\n\nclass HaxeExamples {\n  /***** ATTRIBUTES *****/\n  // instance vs class attributes\n  var instanceAttribute:String;\n  static var classAttribute:String;\n\n  // public vs private attributes\n  public var publicAttribute:String;\n  private var privateAttribute:String;\n  public static var publicClassAttribute:String;\n\n  // default value\n  var varWithDefault = 'somestring';\n\n  // disambiguating local var from attribute\n  var someValue = 1;\n  function disambiguateLocalFromAttribute():Int {\n    var someValue = 2;\n    return this.someValue + someValue; // 3\n  }\n\n  /***** METHODS *****/\n  // public vs private function\n  public function publicMethod() { }\n  private function privateMethod() { }\n\n  // instance function vs class function\n  function instanceMethod() { }\n  static function classMethod() { }\n  private static function privateClassMethod() {}\n\n  // with typed arg\n  function withTypedArg(arg:String) { }\n\n  // with return type\n  function withReturnType():String { return \"zomg\"; }\n\n  // with no return type (aka side-effect city)\n  function withNoReturnType():Void { }\n\n  // with generic type\n  function withGenericType<T>(something:T) { }\n\n  // rebind methods with dynamic\n  public dynamic function toRebind() { return \"Original\"; }\n\n  // since brackets group expressions, a single expression does not need a group\n  function noBrackets() return this;\n\n  /***** MORE EXAMPLES!! *****/\n  public static function main() {\n    var haxeExamples = new HaxeExamples();\n\n    // trace is a puts statement that tells you where it came from\n    // it's documented at haxe.Log.trace\n    trace(\"Hello World!\");\n\n    // real stdout\n    Sys.stdout().writeString(\"\\033[32mnormal print statement \\033[0m(with ansi escape codes embedded)\\n\");\n\n    // argv\n    Sys.args();\n\n    // overridden methods\n    trace(new Child().seen);\n\n    // disambiguating\n    trace(haxeExamples.disambiguateLocalFromAttribute());\n\n    // rebinding methods\n    var originalAndRebound = haxeExamples.toRebind() + \" -> \";\n    haxeExamples.toRebind = function() { return \"Rebound\"; }\n    originalAndRebound += haxeExamples.toRebind();\n    trace(originalAndRebound);\n\n    // methods whose bodies have no brackets\n    trace(haxeExamples.noBrackets());\n\n    // local var with explicitly typed arg\n    var someNum:Int = 123;\n\n    // reading a file\n    var body = sys.io.File.getContent('to_be_read.txt');\n\n    // adding methods to a class\n    // this comes from StringTools, but b/c first arg is a String (ie `this`)\n    // and we declared we were `using` it, it will match type sigs until it finds the correct one\n    trace(body.rtrim());\n\n    // parsing json\n    var json = haxe.Json.parse('{\"whereDidYouComeFrom\":\"I came from the jsons\"}');\n    trace(json.whereDidYouComeFrom);\n\n    /***** BOOLS / LOGIC *****/\n    trace(true == true);\n    trace(true != true);\n    if(true)               trace(\"if with no else\");     // if\n    if(!true)              trace(\"first conditional\");   // if with else\n    else if(true && false) trace(\"second conditional\");  // conjunction\n    else if(true || false) trace(\"third conditional\");   // disjunction\n    if(false && {trace(\"short-circuited\"); true;}) null; // conditionals short-circuit\n\n    /***** REFLECTION *****/\n    // http://api.haxe.org/haxe/PosInfos.html\n    // http://haxe.org/manual/std-reflection.html\n    // http://api.haxe.org//Reflect.html\n    // http://api.haxe.org//Type.html\n    // there's some metaprogramming in here, too, but Imma ignore it for now, b/c eff that amirite?\n\n    // compiler macros\n    var infos = function(?infos:haxe.PosInfos) { return infos; }(); // idk how else to get it to set the var other than to receive it as the last function arg\n    trace(infos.fileName);   // \"HaxeExamples.hx\"\n    trace(infos.lineNumber); // 77, b/c that's where it got set\n    trace(infos.methodName); // \"main\"\n    trace(infos.className);  // HaxeExamples\n\n    // what type?\n    trace(Type.typeof(haxeExamples.toRebind));\n\n    // classes\n    trace(Type.resolveClass('Parent'));    // Object.const_get :Parent\n    trace(Type.resolveClass('NotAThing')); // Object.const_get :NotAThing if Object.constants.include?(:NotAThing)\n\n    trace(Type.getSuperClass(Child));  // Child.superclass\n    trace(Type.getSuperClass(Parent)); // BasicObject.superclass\n\n    trace(Type.getClass(haxeExamples)); // haxe_examples.class\n    trace(Type.getClassName(Child));    // Child.name\n\n    // attributes\n    trace(Reflect.fields({a:1, b:2}));           // {a:1, b:2}.keys\n    trace(Type.getInstanceFields(HaxeExamples)); // HaxeExamples.instance_methods\n\n    trace(Reflect.hasField({a: 1}, \"a\"));  // {a: 1}.key? :a\n    trace(Reflect.hasField({a: 1}, \"b\"));  // {a: 1}.key? :b\n\n    trace(Reflect.field({a:1, b:2}, \"a\")); // {a:1}[:a]\n\n    // enums\n    // Type.resolveEnum('SomeEnum')\n    // Type.getEnumName(SomeEnum)\n    // Type.getEnumConstructs(SomeEnum)\n    // Type.getEnum(someEnum)\n    // Type.enumParameters(someEnum)\n    // Type.enumIndex(someEnum)\n    // Type.enumEq(someEnum, someOtherEnum)\n    // Type.enumConstructor(someEnum, someOtherEnum)\n    // Type.allEnums(someEnum)\n\n\n\n    /***** TYPES *****/\n    // Basic types. And here's a list of operators http://haxe.org/manual/types-numeric-operators.html\n    var b:Bool  = true;\n    var f:Float = 1.2;\n    var i:Int   = 3;\n\n    var nonNullableInt         = function(arg  : Int = 0 ) return arg;\n    var nullableInt            = function(?arg : Int     ) return arg;\n    var nullableIntWithDefault = function(?arg : Int = -1) return arg;\n\n    trace('nonNullableInt(123)  ->', nonNullableInt(123));\n    trace('nonNullableInt()     ->', nonNullableInt());\n    trace('nonNullableInt(null) ->', nonNullableInt(null));\n\n    trace('nullableInt(123)  ->', nullableInt(123));\n    trace('nullableInt()     ->', nullableInt());\n    trace('nullableInt(null) ->', nullableInt(null));\n\n    trace('nullableIntWithDefault(123)  ->', nullableIntWithDefault(123));\n    trace('nullableIntWithDefault()     ->', nullableIntWithDefault());\n    trace('nullableIntWithDefault(null) ->', nullableIntWithDefault(null));\n\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hy/fibonacci.hy",
    "content": ";; Fibonacci example in Hy.\n\n(defn fib [n]\n  (if (<= n 2) n\n      (+ (fib (- n 1)) (fib (- n 2)))))\n\n(if (= __name__ \"__main__\")\n  (for [x [1 2 3 4 5 6 7 8]]\n    (print (fib x))))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Hy/hello-world.hy",
    "content": ";; The concurrent.futures example in Hy.\n\n(import [concurrent.futures [ThreadPoolExecutor as-completed]]\n        [random [randint]]\n        [sh [sleep]])\n\n(defn task-to-do []\n  (sleep (randint 1 5)))\n\n(with-as (ThreadPoolExecutor 10) executor\n  (setv jobs (list-comp (.submit executor task-to-do) (x (range 0 10))))\n  (for (future (as-completed jobs))\n    (.result future)))\n"
  },
  {
    "path": "src/test/resources/samples/langs/HyPhy/AAModelComparison.bf",
    "content": "if (Rows (modelMatrixList) == 0)\n{\n\tmodelMatrixList = \n\t{\n\t{\"Equal Input\", \"EIAA.mdl\", \"19\"}\n\t{\"Dayhoff\",\"Dayhoff.mdl\",\"0\"}\n\t{\"Dayhoff+F\",\"Dayhoff_F.mdl\",\"19\"}\n\t{\"JTT\", \"Jones.mdl\", \"0\"}\n\t{\"JTT+F\", \"Jones_F.mdl\", \"19\"}\n\t{\"WAG\", \"WAG.mdl\", \"0\"}\n\t{\"WAG+F\", \"WAG_F.mdl\", \"19\"}\n\t{\"rtREV\", \"rtREV.mdl\", \"0\"}\n\t{\"rtREV+F\", \"rtREV_F.mdl\", \"19\"}\n\t{\"mtMAM\", \t\t  \"mtMAM.mdl\", \"0\"}\n\t{\"mtMAM+F\", \t  \"mtMAM_F.mdl\", \"19\"}\n\t{\"mtREV 24\",      \"mtREV_24.mdl\", \"0\"}\n\t{\"mtREV 24+F\",    \"mtREV_24_F.mdl\", \"19\"}\n\t{\"HIV within\",    \"HIVwithin.mdl\", \"0\"}\n\t{\"HIV within+F\",  \"HIVwithin+F.mdl\", \"19\"}\n\t{\"HIV between\",   \"HIVbetween.mdl\", \"0\"}\n\t{\"HIV between+F\", \"HIVbetween+F.mdl\", \"19\"}\n\t{\"REV-1 step\", \"reducedREV.mdl\", \"19\"}\n\t{\"REV\",   \"mtREV.mdl\",    \"19\"}\n\t};\n}\n\n/*___________________________________________________________________________________________________________*/\n\nfunction runAModel (modelID, fileName, xtraP, midx)\n{\n\tExecuteCommands (\"#include \\\"TemplateModels/\"+fileName+\"\\\";\"); \n\tTree \t\t\t\t\tgivenTree \t\t\t= treeString;\n\tLikelihoodFunction \t\tlf \t\t\t\t\t= (filteredData,givenTree);\n\t\n\tGetString (lf_info, lf, -1);\n\tlocals = lf_info[\"Local Independent\"];\n\n\tif (Columns (branchLengthStash))\n\t{\n\t\tUSE_LAST_RESULTS = 1;\n\t\tfor (_iv = 0; _iv < Columns (locals); _iv = _iv+1)\n\t\t{\n\t\t\tExecuteCommands (locals[_iv] + \"=1;\\n\");\n\t\t}\n\t\tcurrentBL = BranchLength (givenTree,0);\n\t\tcurrentBN = BranchName\t (givenTree,-1);\n\t\tfor (_iv = 0; _iv < Columns (currentBN); _iv = _iv+1)\n\t\t{\n\t\t\tExecuteCommands (\"givenTree.\"+currentBN[_iv]+\".t=\"+branchLengthStash[_iv]/currentBL+\";\");\n\t\t\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (_iv = 0; _iv < Columns (locals); _iv = _iv+1)\n\t\t{\n\t\t\tExecuteCommands (locals[_iv] + \"=0.1;\\n\");\n\t\t}\n\t\tUSE_LAST_RESULTS = 1;\n\t}\n\n\tOptimize (res,lf);\n\t\n\tfprintf (stdout, \"| \", modelID);\n\tfor (k=0; k<maxModelWidth-Abs(modelID)-1; k=k+1)\n\t{\n\t\tfprintf (stdout, \" \");\n\t}\n\n\tparams = res[1][1]+xtraP;\n\tAIC    =  2(-res[1][0]+params);\n\t\n\tif (filteredData.sites-params>1)\n\t{\n\t\tcAIC   = 2(-res[1][0]+params*(filteredData.sites/(filteredData.sites-params-1)));\n\t}\n\telse\n\t{\n\t\tcAIC = 0;\n\t}\n\t\n\tbranchLengths = BranchLength (givenTree,-1);\n\tTL = 0;\n\tfor (k=Rows(branchLengths)*Columns(branchLengths)-1; k>=0; k=k-1)\t\t\t\t  \n\t{\n\t\tTL = TL + branchLengths[k];\n\t}\n\n\tfprintf (stdout, \"| \", Format (res[1][0],14,3), \" | \", Format (params,5,0), \" | \",\n\t\t\t\t\t\t   Format (AIC, 9,3), \" | \",);\n\t\t\t\t\t\n\tif (cAIC > 0)\n\t{\n\t\t fprintf (stdout, Format (cAIC,11,3), \" | \");\n\t}\n\telse\n\t{\n\t\t fprintf (stdout, \"    N/A     | \");\n\t}\n\t\t   \n\tfprintf (stdout, Format (TL,11,3), \" |\\n\", sepString);\n\t\n\tresultMatrix[midx][0] = res[1][0];\n\tresultMatrix[midx][1] = params;\n\tresultMatrix[midx][2] = AIC;\n\tresultMatrix[midx][3] = cAIC;\n\tresultMatrix[midx][4] = TL;\n\t\n\tif (AIC < bestAIC)\n\t{\n\t\tbestAIC \t= AIC;\n\t\tbestAICidx  = midx;\n\t\tbranchLengthStash = BranchLength (givenTree,-1);\n\t}\n\t\n\tif (cAIC > 0)\n\t{\n\t\tif (bestCAIC > cAIC)\n\t\t{\n\t\t\tbestCAIC = cAIC;\n\t\t\tbestCAICidx = midx;\n\t\t\t\n\t\t}\n\t}\n\t\n\treturn 0;\n}\n\n\n/*___________________________________________________________________________________________________________*/\n\n\n\nmaxModelWidth = 7;\nskipCodeSelectionStep = 0;\n\nChoiceList (doREV, \"Include REV?\", 1, SKIP_NONE, \"Yes\", \"Include REV and reduced REV models. CAUTION: these models take a long time to fit.\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"No\", \"Only use empirical models\");\n\t\t\t\t\t\t\t\t\t\t\t\t \nif (doREV < 0)\n{\n\treturn 0;\n}\n\nif (doREV == 0)\n{\n\t#include \"TemplateModels/chooseGeneticCode.def\";\n\tskipCodeSelectionStep = 1;\n}\n\nmodelCount    = Rows (modelMatrixList) - 2*doREV;\n\nfor (k=0; k<modelCount; k=k+1)\n{\n\tmaxModelWidth = Max(maxModelWidth,Abs (modelMatrixList[k][0])+2);\n}\n\nsepString = \"\";\ncapString = \"\";\nsepString * 256;\nsepString * \"+\";\n\ncapString * 256;\ncapString * \"| Model\";\n\nfor (k=0; k<maxModelWidth; k=k+1)\n{\n\tsepString * \"-\";\n}\n\nfor (k=0; k<maxModelWidth-6; k=k+1)\n{\n\tcapString * \" \";\n}\n\ncapString * \"| Log Likelihood | #prms | AIC Score | c-AIC Score | Tree Length |\\n\";\nsepString * \"+----------------+-------+-----------+-------------+-------------+\\n\";\nsepString * 0;\ncapString * 0;\n\nbranchLengthStash = 0;\n\nSKIP_MODEL_PARAMETER_LIST = 0;\n\n#include \"TemplateModels/modelParameters2.mdl\";\nif (modelType == 1)\n{\n\t#include \"TemplateModels/defineGamma.mdl\";\n}\n\nif (modelType == 2)\n{\n\t#include \"TemplateModels/defineHM.mdl\";\n}\nSKIP_MODEL_PARAMETER_LIST = 1;\n\nSetDialogPrompt (\"Please load an amino-acid data file:\");\n\nDataSet ds = ReadDataFile (PROMPT_FOR_FILE);\nDataSetFilter filteredData = CreateFilter (ds,1);\n\nfprintf (stdout,\"\\nRunning aminoacid model comparisons on \", LAST_FILE_PATH, \"\\n\\nThe alignment has \",ds.species, \" sequences and \", ds.sites, \" sites\\n\");\n\n_DO_TREE_REBALANCE_ = 1;\n\n#include \"queryTree.bf\";\n\nresultMatrix = {modelCount, 5};\n\nfprintf (stdout, \"\\n\",sepString,capString,sepString);\n\nbestAIC \t= 1e100;\nbestCAIC\t= 1e100;\nbestAICidx\t= 0;\nbestCAICidx = -1;\n\nfor (mid=0; mid<modelCount; mid=mid+1)\n{\n\trunAModel (modelMatrixList[mid][0], modelMatrixList[mid][1], 0+modelMatrixList[mid][2], mid);\n}\t\n\nfprintf (stdout, \"\\n\\nBest AIC model:\\n\\t\", modelMatrixList[bestAICidx][0], \" with the score of \", bestAIC);\n\nif (bestCAICidx>=0)\n{\n\tfprintf (stdout, \"\\n\\nBest c-AIC model:\\n\\t\", modelMatrixList[bestCAICidx][0], \" with the score of \", bestCAIC);\n}\n\nlabelMatrix  = {{\"Log-likelihood\",\"Parameters\",\"AIC\",\"c-AIC\",\"Total tree length\",\"\"}};\n\naaString = \"Model\";\n\nfor (fC = 0; fC < modelCount; fC = fC+1)\n{\n\taaString = aaString + \";\" + modelMatrixList[fC][0];\n}\n\nUSE_LAST_RESULTS = 0;\n\nlabelMatrix[5] = aaString;\nskipCodeSelectionStep = 0;\nOpenWindow (CHARTWINDOW,{{\"Model Fits\"}\n\t\t\t\t\t\t   {\"labelMatrix\"},\n\t\t\t\t\t\t   {\"resultMatrix\"},\n\t\t\t\t\t\t   {\"Bar Chart\"},\n\t\t\t\t\t\t   {\"Index\"},\n\t\t\t\t\t\t   {\"c-AIC\"},\n\t\t\t\t\t\t   {\"Model Index\"},\n\t\t\t\t\t\t   {\"\"},\n\t\t\t\t\t\t   {\"AIC\"}\n\t\t\t\t\t\t   },\n\t\t\t\t\t\t   \"SCREEN_WIDTH-60;SCREEN_HEIGHT-60;30;30\");\n"
  },
  {
    "path": "src/test/resources/samples/langs/HyPhy/CodonModelCompare.bf",
    "content": "/* \n\tThis file takes a nucleotide data set and a tree (either from the data file or from a separate \tfile) and computes maximum likelihood estimates for every possible 4x4 reversible model on that data and tree.\n\n\t\tWe use the string (v1,v2,v3,v4,v5,v6), where and v1..6 = 0..5\n   to encode a 4x4 symmetric transition matrix with entries\n   [*  v1  v2  v3]\n   [-  *   v4  v5]\n   [-  -   *   v6]\n   [-  -   -   * ]\n   \n   \t\tFor instance: (010010) encodes HKY85.\n   \t\t\n   \t\tFor each model the following information is reported:\n   \t\t- Model string. (e.g. (012345) for the GRM)\n   \t\t- Number of model parameters\n   \t\t- Max ln-likelihood for the model\n   \t\t- Likelihood ratio statistic (as a sub-model of the GRM)\n   \t\t- AIC\n   \t\t- P-Value for the Likelihood Ratio Test.\n   \t\t\n   \n   Sergei L. Kosakovsky Pond, Summer 2002.\n   \n*/ \n\nfunction ReceiveJobs (sendOrNot)\n{\n\tif (MPI_NODE_COUNT>1)\n\t{\n\t\tMPIReceive (-1, fromNode, result_String);\n\t\tjobModelNum = MPINodeState[fromNode-1][1];\n\t\tvv1 = MPINodeState[fromNode-1][2];\n\t\tvv2 = MPINodeState[fromNode-1][3];\n\t\tvv3 = MPINodeState[fromNode-1][4];\n\t\tvv4 = MPINodeState[fromNode-1][5];\n\t\tvv5 = MPINodeState[fromNode-1][6];\n\t\tvv6 = MPINodeState[fromNode-1][7];\n\t\tif (sendOrNot)\n\t\t{\n\t\t\tMPISend (fromNode,lf);\n\t\t\tMPINodeState[fromNode-1][1] = modelNum;\t\t\n\t\t\tMPINodeState[fromNode-1][2] = v1;\n\t\t\tMPINodeState[fromNode-1][3] = v2;\n\t\t\tMPINodeState[fromNode-1][4] = v3;\n\t\t\tMPINodeState[fromNode-1][5] = v4;\n\t\t\tMPINodeState[fromNode-1][6] = v5;\n\t\t\tMPINodeState[fromNode-1][7] = v6;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMPINodeState[fromNode-1][0] = 0;\n\t\t\tMPINodeState[fromNode-1][1] = -1;\t\t\n\t\t}\n\t\t\n\t\tExecuteCommands (result_String);\n\t}\n\telse\n\t{\n\t\tjobModelNum = modelNum;\n\t}\n\t\n\tif (jobModelNum == 0)\n\t{\n\t\tstdl = lf_MLES[1][0];\n\t\tfullnp = lf_MLES[1][1]+addOn;\n\t\tfprintf(stdout,\"\\n(012345) Full Model ln-lik =  \",stdl,\". Parameter Count=\",Format(fullnp,0,0),\" AIC = \", 2*(fullnp-stdl),\"\\n\\n\");\n\n\n\t\tresultCache [0][0] = 1;\n\t\tresultCache [0][1] = 2;\n\t\tresultCache [0][2] = 3;\n\t\tresultCache [0][3] = 4;\n\t\tresultCache [0][4] = 5;\n\t\tresultCache [0][5] = lf_MLES[1][0];\n\t\tresultCache [0][6] = lf_MLES[1][1]+addOn;\n\t\tresultCache [0][7] = 0;\n\t\tresultCache [0][8] = 0;\n\t\t\n\t\tfprintf (stdout,\"\\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |\");   \n\t\tfprintf (stdout,\"\\n----|----------|-------|-----------|----------------|------------|------------------|\");   \n\n\t\tif (MPI_NODE_COUNT>1)\n\t\t{\n\t\t\tfor (h=1; h<203; h=h+1)\n\t\t\t{\n\t\t\t\tlnL = resultCache[h][5];\n\t\t\t\t\n\t\t\t\tif (lnL<0)\n\t\t\t\t{\n\t\t\t\t\tnp = resultCache[h][6];\n\t\t\t\t\tLRT = -2*(lnL-stdl);\n\t\t\t\t\tif (LRT<0)\n\t\t\t\t\t{\n\t\t\t\t\t\tLRT = 0;\n\t\t\t\t\t}\n\t\t\t\t\tAIC = -2*lnL+2*np;\n\t\t\t\t\tPRINT_DIGITS = 3;\n\t\t\t\t\tfprintf (stdout,\"\\n\",h);\n\t\t\t\t\tPRINT_DIGITS = 1;\n\t\t\t\t\tfprintf (stdout,\" | (\",0, resultCache[h][0], resultCache[h][1], resultCache[h][2], resultCache[h][3], resultCache[h][4],\") | \");\n\t\t\t\t\tfprintf (stdout,Format (np,5,0));\n\t\t\t\t\tPRINT_DIGITS = 8;\n\t\t\t\t\tfprintf (stdout, \" |  \",lnL,\" | \",Format(LRT,14,3), \" |  \", AIC, \"  |  \", );\n\t\t\t\t\t\n\t\t\t\t\tPRINT_DIGITS = 15;\n\t\t\t\t\tif (LRT==0)\n\t\t\t\t\t{\n\t\t\t\t\t\tpValue = 1;\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpValue = 1-CChi2(LRT,fullnp-np);\n\t\t\t\t\t}\n\t\t\t\t\tfprintf (stdout,pValue,\" |\");\n\t\t\t\t\tresultCache [jobModelNum][7] = pValue;\n\t\t\t\t\tif (pValue<rejectAt)\n\t\t\t\t\t{\n\t\t\t\t\t\trejectCount = rejectCount+1;\n\t\t\t\t\t\tresultCache [jobModelNum][8] = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tresultCache [jobModelNum][8] = 1;\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (pValue<rejectAt)\n\t\t\t\t\t{\n\t\t\t\t\t\tfprintf (stdout,\"(*)\");\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn fromNode-1;\n\t}\n\telse\n\t{\n\t\tif ((MPI_NODE_COUNT>1)&&(resultCache[0][5]>=0))\n\t\t{\n\t\t\tresultCache [jobModelNum][0] = vv2;\n\t\t\tresultCache [jobModelNum][1] = vv3;\n\t\t\tresultCache [jobModelNum][2] = vv4;\n\t\t\tresultCache [jobModelNum][3] = vv5;\n\t\t\tresultCache [jobModelNum][4] = vv6;\n\t\t\tresultCache [jobModelNum][5] = lf_MLES[1][0];\n\t\t\tresultCache [jobModelNum][6] = lf_MLES[1][1]+addOn;\n\t\t\treturn fromNode - 1;\n\t\t}\n\t}\n\n\tnp = lf_MLES[1][1]+addOn;\n\tlnL = lf_MLES[1][0];\n\tLRT = -2*(lnL-stdl);\n\tif (LRT<0)\n\t{\n\t\tLRT = 0;\n\t}\n\tAIC = -2*lnL+2*np;\n\tPRINT_DIGITS = 3;\n\tfprintf (stdout,\"\\n\",jobModelNum);\n\tPRINT_DIGITS = 1;\n\tfprintf (stdout,\" | (\",vv1,vv2,vv3,vv4,vv5,vv6,\") | \");\n\tfprintf (stdout,Format (np,5,0));\n\tPRINT_DIGITS = 8;\n\tfprintf (stdout, \" |  \",lnL,\" | \",Format(LRT,14,3), \" |  \", AIC, \"  |  \", );\n\t\n\t\n\tPRINT_DIGITS = 15;\n\tif (LRT==0)\n\t{\n\t\tpValue = 1;\t\t\t\t\t\n\t}\n\telse\n\t{\n\t\tpValue = 1-CChi2(LRT,fullnp-np);\n\t}\n\tfprintf (stdout,pValue,\" |\");\n\t\n\tresultCache [jobModelNum][0] = vv2;\n\tresultCache [jobModelNum][1] = vv3;\n\tresultCache [jobModelNum][2] = vv4;\n\tresultCache [jobModelNum][3] = vv5;\n\tresultCache [jobModelNum][4] = vv6;\n\tresultCache [jobModelNum][5] = lf_MLES[1][0];\n\tresultCache [jobModelNum][6] = lf_MLES[1][1]+addOn;\n\tresultCache [jobModelNum][7] = pValue;\n\tif (pValue<rejectAt)\n\t{\n\t\trejectCount = rejectCount+1;\n\t\tresultCache [jobModelNum][8] = 0;\n\t}\n\telse\n\t{\n\t\tresultCache [jobModelNum][8] = 1;\t\t\t\t\t\n\t}\n\t\n\tif (pValue<rejectAt)\n\t{\n\t\tfprintf (stdout,\"(*)\");\n\t}\n\t\t\t\n\treturn fromNode-1;\n}\n\nfunction PopulateModelMatrix (ModelMatrixName&, EFV)\n{\n\tif (!ModelMatrixDimension)\n\t{\n\t\tModelMatrixDimension = 64;\n\t\tfor (h = 0 ;h<64; h=h+1)\n\t\t{\n\t\t\tif (_Genetic_Code[h]==10)\n\t\t\t{\n\t\t\t\tModelMatrixDimension = ModelMatrixDimension-1;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; \n\n\thshift = 0;\n\n\tif (modelType == 0)\n\t{\n\t\tfor (h=0; h<64; h=h+1)\n\t\t{\n\t\t\tif (_Genetic_Code[h]==10) \n\t\t\t{\n\t\t\t\thshift = hshift+1;\n\t\t\t\tcontinue; \n\t\t\t}\n\t\t\tvshift = hshift;\n\t\t\tfor (v = h+1; v<64; v=v+1)\n\t\t\t{\n\t\t\t\tdiff = v-h;\n\t\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t\t{\n\t\t\t\t\tvshift = vshift+1;\n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\t\t\t\tnucPosInCodon = 2;\n\t\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t\t  \t{\n\t\t\t  \t\tif (h$4==v$4)\n\t\t\t  \t\t{\n\t\t\t  \t\t\ttransition = v%4;\n\t\t\t  \t\t\ttransition2= h%4;\n\t\t\t  \t\t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t  \t\t\tif(diff%16==0)\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v$16;\n\t\t\t  \t\t\t\ttransition2= h$16;\n\t\t\t\t\t\t\tnucPosInCodon = 0;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t\telse\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v%16$4;\n\t\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t\t\t\t\t\tnucPosInCodon = 1;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t}\n\t\t\t  \t\t\n\t\t\t  \t\trateType = mSpecMatrix[transition][transition2];\n\t\t\t  \t\t\n\t\t\t  \t\tif (rateType == 1)\n\t\t\t  \t\t{\n\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := AC*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := AC*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t  \t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := AC*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := AC*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t  \t\t\t}\n\t\t\t  \t\t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t\t  \t\tif (rateType == 2)\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t  \t}\n\t\t\t\t\t  \t\telse\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tif (rateType == 3)\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := AT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := AT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := AT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := AT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t  \t\t}\n\t\t\t\t\t  \t\telse\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tif (rateType == 4)\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := CG*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := CG*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := CG*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := CG*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tif (rateType == 5)\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := CT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := CT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := CT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := CT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := GT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := GT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := GT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := GT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t  \t}\n\t\t\t\t\t  \t}\n\t\t\t\t  \t}\n\t\t\t  \t}\n\t\t\t}\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tfor (h=0; h<64; h=h+1)\n\t\t{\n\t\t\tif (_Genetic_Code[h]==10) \n\t\t\t{\n\t\t\t\thshift = hshift+1;\n\t\t\t\tcontinue; \n\t\t\t}\n\t\t\tvshift = hshift;\n\t\t\tfor (v = h+1; v<64; v=v+1)\n\t\t\t{\n\t\t\t\tdiff = v-h;\n\t\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t\t{\n\t\t\t\t\tvshift = vshift+1;\n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\t\t\t\tnucPosInCodon = 2;\n\t\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t\t  \t{\n\t\t\t  \t\tif (h$4==v$4)\n\t\t\t  \t\t{\n\t\t\t  \t\t\ttransition = v%4;\n\t\t\t  \t\t\ttransition2= h%4;\n\t\t\t  \t\t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t  \t\t\tif(diff%16==0)\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v$16;\n\t\t\t  \t\t\t\ttransition2= h$16;\n\t\t\t\t\t\t\tnucPosInCodon = 0;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t\telse\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v%16$4;\n\t\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t\t\t\t\t\tnucPosInCodon = 1;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t}\n\t\t\t  \t\t\n\t\t\t  \t\trateType = mSpecMatrix[transition][transition2];\n\t\t\t  \t\t\n\t\t\t\t\tif (rateType == 1)\n\t\t\t  \t\t{\n\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*AC*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*AC*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t  \t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*AC*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*AC*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t  \t\t\t}\n\t\t\t  \t\t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t\t  \t\tif (rateType == 2)\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t  \t}\n\t\t\t\t\t  \t\telse\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tif (rateType == 3)\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*AT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*AT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*AT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*AT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t  \t\t}\n\t\t\t\t\t  \t\telse\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tif (rateType == 4)\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*CG*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*CG*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*CG*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*CG*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tif (rateType == 5)\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*CT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*CT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*CT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*CT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*GT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*GT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*GT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*GT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t  \t}\n\t\t\t\t\t  \t}\n\t\t\t\t  \t}\t\t\t\t  \t\n\t\t\t\t  }\n\t\t\t}\n\t\t}\t\n\t}\t\n\treturn 0;\n}\n\n\nfunction BuildCodonFrequencies (obsF)\n{\n\tPIStop = 1.0;\n\tresult = {ModelMatrixDimension,1};\n\thshift = 0;\n\n\tfor (h=0; h<64; h=h+1)\n\t{\n\t\tfirst = h$16;\n\t\tsecond = h%16$4;\n\t\tthird = h%4;\n\t\tif (_Genetic_Code[h]==10) \n\t\t{\n\t\t\thshift = hshift+1;\n\t\t\tPIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t\t\tcontinue; \n\t\t}\n\t\tresult[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t}\n\treturn result*(1.0/PIStop);\n}\n\nfunction  setElement (h,v,cc)\n{\t\n\tmSpecMatrix[h][v]=cc+1;\n\tmSpecMatrix[v][h]=cc+1;\n\treturn 1;\n}\n\n\nfunction printModelMatrix (modelString)\n{\n\t\n\tmstrConv = \"1\";\n\tfor (v2 = 1; v2 < 6; v2 = v2+1)\n\t{\n\t\tif (modelString[v2]==\"0\")\n\t\t{\n\t\t\tmstrConv = mstrConv+\"1\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (modelString[v2]==\"1\")\n\t\t\t{\n\t\t\t\tmstrConv = mstrConv+\"B\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (modelString[v2]==\"2\")\n\t\t\t\t{\n\t\t\t\t\tmstrConv = mstrConv+\"C\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (modelString[v2]==\"3\")\n\t\t\t\t\t{\n\t\t\t\t\t\tmstrConv = mstrConv+\"D\";\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modelString[v2]==\"4\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmstrConv = mstrConv+\"E\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmstrConv = mstrConv+\"F\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tsep = \"+---+-----+-----+-----+-----+\\n\";\n\tfprintf (stdout, sep,\n\t\t\t\t\t \"|   |  A  |  C  |  G  |  T  |\\n\",\n\t\t\t\t\t sep,\n\t\t\t\t\t \"| A |  *  | \", mstrConv[0], \"*t | \", mstrConv[1], \"*t | \", mstrConv[2], \"*t |\\n\",\n\t\t\t\t\t sep,\n\t\t\t\t\t \"| C | \", mstrConv[0], \"*t |  *  | \", mstrConv[3], \"*t | \", mstrConv[4], \"*t |\\n\",\n\t\t\t\t\t sep,\n\t\t\t\t\t \"| G | \", mstrConv[1], \"*t | \" , mstrConv[3], \"*t |  *  | \", mstrConv[5], \"*t |\\n\",\n\t\t\t\t\t sep,\n\t\t\t\t\t \"| T | \", mstrConv[2], \"*t | \" , mstrConv[4], \"*t | \", mstrConv[5], \"*t |  *  |\\n\",\n\t\t\t\t\t sep, \"\\nt = synRate for synonymous substitutions, and t=R*synRate for non-synonumous ones.\\n\");\n\t\t\t\t\t\t \n\treturn 1;\n}\n\n#include \t\t\t\t   \"TemplateModels/chooseGeneticCode.def\";\nSetDialogPrompt \t\t   (\"Please specify a codon data file:\");\n\nDataSet \t\t\t\t   ds \t\t\t= ReadDataFile (PROMPT_FOR_FILE);\nDataSetFilter \t\t\t   filteredData = CreateFilter (ds,3,\"\",\"\",GeneticCodeExclusions);\n\nfprintf \t\t\t\t   (stdout,\"\\n______________READ THE FOLLOWING DATA______________\\n\",ds);\n\n\nHarvestFrequencies         (observedFreq,filteredData,3,1,1);\n\nmSpecMatrix \t\t\t   = {{*,1,1,1}{1,*,1,1}{1,1,*,1}{1,1,1,*}};\nModelMatrixDimension       = 0;\n\n_DO_TREE_REBALANCE_ = 1;\n\n#include \"queryTree.bf\";\n#include \"TemplateModels/modelParameters5.mdl\";\n\nif (modelType > 0)\n{\n\t#include \"TemplateModels/defineGamma.mdl\";\n}\n\nChoiceList (branchLengths,\"Estimate Branch Lengths\",1,SKIP_NONE,\n\t\t\t\"Every Time\",\"Branch lengths are reestimated for every model.\",\n\t\t\t\"Once\",\"Branch lenghts obtained from the nucleotide GTR model and reused for subsequent models.\"\n\t       );\n\nif (branchLengths<0)\n{\n\treturn;\n}\n\nrejectAt = 0;\n\nwhile ((rejectAt<=0)||(rejectAt>=1))\n{\n\tfprintf (stdout, \"\\nModel rejection level (e.g. 0.05):\");\n\tfscanf  (stdin,\"Number\", rejectAt);\n}\n\nSetDialogPrompt (\"Save results to:\"); \n \nfprintf (PROMPT_FOR_FILE, CLEAR_FILE); \nBASE_PATH = LAST_FILE_PATH; \n\nKEEP_OPTIMAL_ORDER = 1;\nMESSAGE_LOGGING = 0;\n\nglobal AC=1;\nglobal AT=1;\nglobal CG=1;\nglobal CT=1;\nglobal GT=1;\nglobal R=1;\n\n\nr = setElement (0,2,1);\nr = setElement (0,3,2);\nr = setElement (1,2,3);\nr = setElement (1,3,4);\nr = setElement (2,3,5);\n\nMG94custom = 0;\nMULTIPLY_BY_FREQS     = PopulateModelMatrix (\"MG94custom\", observedFreq);\nvectorOfFrequencies   = BuildCodonFrequencies (observedFreq);\nModel MG94customModel = (MG94custom,vectorOfFrequencies,0);\n\nUSE_POSITION_SPECIFIC_FREQS = 1;\nTree tr = treeString;\n\naddOn = 0;\n\nif (branchLengths)\n{\n\tglobal TreeScaler = 1;\n\tGTRMatrix = {{*,AC*nt,nt,AT*nt}{AC*nt,*,CG*nt,CT*nt}{nt,CG*nt,*,GT*nt}{AT*nt,CT*nt,GT*nt,*}};\n\tDataSetFilter \tnucFilter = CreateFilter (filteredData,1);\n\tHarvestFrequencies         (nucFreq,nucFilter,1,1,1);\n\tModel GTRModel = (GTRMatrix,nucFreq,1);\n\tgivenTreeString = Format (tr,0,0);\n\tTree nucTree = givenTreeString;\n\tLikelihoodFunction lfn = (nucFilter, nucTree);\n\tOptimize (nres,lfn);\n\tReplicateConstraint (\"this1.?.synRate:=this2.?.nt__/TreeScaler\",tr,nucTree);\n\taddOn = nres[1][1]-nres[1][2]-1;\n}\n\nLikelihoodFunction lf = (filteredData, tr);\n\nresultCache = {203,9};\n\nmodelNum\t= 0;\nrejectCount = 0;\n\nif (MPI_NODE_COUNT>1)\n{\n\tMPINodeState = {MPI_NODE_COUNT-1,8};\n\tOPTIMIZE_SUMMATION_ORDER = 0;\n\tMPISend (1,lf);\n\tMPINodeState[0][0] = 1;\n\tMPINodeState[0][1] = modelNum;\n}\nelse\n{\n\tOptimize (lf_MLES,lf);\n\tvv1 = 0;\n\tvv2 = 0;\n\tvv3 = 0;\n\tvv4 = 0;\n\tvv5 = 0;\n\tvv6 = 0;\n\tdummy = ReceiveJobs (0);\n}\n\nrateBiasTerms = {{\"AC\",\"1\",\"AT\",\"CG\",\"CT\",\"GT\"}};\n\nfor (v2=0; v2<=1; v2=v2+1)\n{\n\tfor (v3=0; v3<=v2+1; v3=v3+1)\n\t{\n\t\tif (v3>v2)\n\t\t{\n\t\t\tub4 = v3;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tub4 = v2;\n\t\t}\n\t\tfor (v4=0; v4<=ub4+1; v4=v4+1)\n\t\t{\n\t\t\tif (v4>=ub4)\n\t\t\t{\n\t\t\t\tub5 = v4;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tub5 = ub4;\n\t\t\t}\n\t\t\tfor (v5=0; v5<=ub5+1; v5=v5+1)\n\t\t\t{\n\t\t\t\tif (v5>ub5)\n\t\t\t\t{\n\t\t\t\t\tub6 = v5;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tub6 = ub5;\n\t\t\t\t}\n\t\t\t\tfor (v6=0; v6<=ub6+1; v6=v6+1)\n\t\t\t\t{\n\t\t\t\t\tif (v6==5)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tR = 1;\n\n\t\t\t\t\tparamCount\t  = 0;\n\n\t\t\t\t\tmodelDesc = \"0\"+Format(v2,1,0);\n\t\t\t\t\tmodelDesc = modelDesc+Format(v3,1,0);\n\t\t\t\t\tmodelDesc = modelDesc+Format(v4,1,0);\n\t\t\t\t\tmodelDesc = modelDesc+Format(v5,1,0);\n\t\t\t\t\tmodelDesc = modelDesc+Format(v6,1,0);\n\t\t\t\t\t\n\t\t\t\t\tmodelConstraintString = \"\";\n\t\t\t\t\t\n\t\t\t\t\tAC = 1;\n\t\t\t\t\tAT = 1;\n\t\t\t\t\tCG = 1;\n\t\t\t\t\tCT = 1;\n\t\t\t\t\tGT = 1;\n\n\t\t\t\t\tfor (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (rateBiasTerms[customLoopCounter2] == \"1\")\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tmodelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+\":=\"+rateBiasTerms[customLoopCounter2]+\";\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tmodelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+\":=\"+rateBiasTerms[customLoopCounter]+\";\";\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\n\n\t\t\t\t\tif (Abs(modelConstraintString))\n\t\t\t\t\t{\n\t\t\t\t\t\tExecuteCommands (modelConstraintString);\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\tmodelNum = modelNum+1;\n\t\t\t\t\tif (MPI_NODE_COUNT>1)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (MPINodeState[mpiNode][0]==0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbreak;\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (mpiNode==MPI_NODE_COUNT-1)\n\t\t\t\t\t\t/* all nodes busy */\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmpiNode = ReceiveJobs (1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tMPISend (mpiNode+1,lf);\n\t\t\t\t\t\t\tMPINodeState[mpiNode][0] = 1;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][1] = modelNum;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][2] = v1;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][3] = v2;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][4] = v3;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][5] = v4;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][6] = v5;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][7] = v6;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOptimize (lf_MLES,lf);\n\t\t\t\t\t\tvv1 = v1;\n\t\t\t\t\t\tvv2 = v2;\n\t\t\t\t\t\tvv3 = v3;\n\t\t\t\t\t\tvv4 = v4;\n\t\t\t\t\t\tvv5 = v5;\n\t\t\t\t\t\tvv6 = v6;\n\t\t\t\t\t\tdummy = ReceiveJobs (0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nif (MPI_NODE_COUNT>1)\n{\n\twhile (1)\n\t{\n\t\tfor (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)\n\t\t{\n\t\t\tif (MPINodeState[nodeCounter][0]==1)\n\t\t\t{\n\t\t\t\tfromNode = ReceiveJobs (0);\n\t\t\t\tbreak;\t\n\t\t\t}\n\t\t}\n\t\tif (nodeCounter == MPI_NODE_COUNT-1)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\t\n\tOPTIMIZE_SUMMATION_ORDER = 1;\n}\n\nfunction checkEmbedding (_m1, _m2)\n{\n\tfor (r=0; r<6; r=r+1)\n\t{\n\t\tif (_m2[r]<_m1[r])\n\t\t{\n\t\t\t/*fprintf (stdout,_m1,\" \", _m2, \" Reject 1 at position \",r,\"\\n\");*/\n\t\t\treturn 0;\n\t\t}\n\t\tif (_m2[r]>_m1[r])\n\t\t{\n\t\t\tfor (r2 = 0; r2 < 6; r2 = r2+1)\n\t\t\t{\n\t\t\t\tif ((_m2[r2]==_m2[r])&&(_m1[r2]!=_m1[r]))\n\t\t\t\t{\n\t\t\t\t\t/*fprintf (stdout,_m1,\" \", _m2, \" Reject 2 at positions \",r,r2,\"\\n\");*/\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn 1;\n}\n\nPRINT_DIGITS = 0;\n\nfprintf (stdout, \"\\n\\n--------------------------\\n   (*) => p-Value < \", rejectAt, \"\\nRejected \", rejectCount, \" models.\\n\");\n\n\nif (rejectCount<202)\n{\n\n\tfprintf (stdout, \"\\nPerforming nested tests on the remaining models...\\n\");\n\n\tdone = 0;\n\twhile (!done)\n\t{\n\t\tdone = 1;\n\t\tfor (v2=1; v2<203; v2=v2+1)\n\t\t{\n\t\t\tif (resultCache[v2][8])\n\t\t\t{\n\t\t\t\tmodelString = \"0\";\n\t\t\t\tfor (v3 = 0; v3<5; v3=v3+1)\n\t\t\t\t{\n\t\t\t\t\tmodelString = modelString + resultCache [v2][v3];\n\t\t\t\t}\n\t\t\t\tfor (v3 = v2+1; v3<203; v3 = v3+1)\n\t\t\t\t{\n\t\t\t\t\tif (resultCache[v3][8])\n\t\t\t\t\t{\n\t\t\t\t\t\tmodelString2 = \"0\";\n\t\t\t\t\t\tfor (v4 = 0; v4<5; v4=v4+1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmodelString2 = modelString2 + resultCache [v3][v4];\n\t\t\t\t\t\t}\t\n\t\t\t\t\t\tif (checkEmbedding (modelString, modelString2))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfprintf (stdout,\"H: (\", modelString,\") A: (\", modelString2, \"). \");\n\t\t\t\t\t\t\tdone = 0;\n\t\t\t\t\t\t\tLRT = 2*(resultCache[v3][5]-resultCache[v2][5]);\n\t\t\t\t\t\t\tnpd = resultCache[v3][6]-resultCache[v2][6];\n\t\t\t\t\t\t\tif (LRT<0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpValue = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpValue = 1-CChi2(LRT,npd);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfprintf (stdout,\" P-Value=\", Format (pValue,10,3));\n\t\t\t\t\t\t\tif (pValue<rejectAt)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfprintf (stdout,\". Rejected H.\\n\");\n\t\t\t\t\t\t\t\tresultCache[v2][8] = 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfprintf (stdout,\". Failed to reject H. Discarding A.\\n\");\n\t\t\t\t\t\t\t\tresultCache[v3][8] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfprintf (stdout,\"\\n\\nRemaining models:\\n\\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |\");   \n\tfprintf (stdout,\"\\n----|----------|-------|-----------|----------------|------------|------------------|\"); \n\tfprintf (BASE_PATH,\"\\n\\nRemaining models:\\n\\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |\");   \n\tfprintf (BASE_PATH,\"\\n----|----------|-------|-----------|----------------|------------|------------------|\"); \n\t\n\tmodelNum = 0;  \n\tv5 = 1e10;\n\tv4 = 0;\n\n\tfor (v2=1; v2<203; v2=v2+1)\n\t{\n\t\tif (resultCache[v2][8])\n\t\t{\n\t\t\tmodelNum = 0;\n\t\t\tmodelString = \"0\";\n\t\t\tfor (v3 = 0; v3<5; v3=v3+1)\n\t\t\t{\n\t\t\t\tmodelString = modelString + resultCache [v2][v3];\n\t\t\t}\n\t\t\tnp  = resultCache[v2][6];\n\t\t\tlnL = resultCache[v2][5];\n\t\t\tLRT = -2*(lnL-stdl);\n\t\t\tif (LRT<0)\n\t\t\t{\n\t\t\t\tLRT = 0;\n\t\t\t}\n\t\t\tAIC = -2*lnL+2*np;\n\t\t\tmodelNum = modelNum + 1;\n\t\t\tPRINT_DIGITS = 3;\n\t\t\tfprintf (stdout,\"\\n\",v2);\n\t\t\tfprintf (BASE_PATH,\"\\n\",v2);\n\t\t\tPRINT_DIGITS = 1;\n\t\t\tfprintf (stdout,\" | (\",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],\") | \");\n\t\t\tfprintf (stdout,Format (np,5,0));\n\t\t\tfprintf (BASE_PATH,\" | (\",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],\") | \");\n\t\t\tfprintf (BASE_PATH,Format (np,5,0));\n\t\t\tPRINT_DIGITS = 8;\n\t\t\tfprintf (stdout, \" |  \",lnL,\" | \",Format(LRT,14,3), \" |  \", AIC, \"  |  \", );\n\t\t\tfprintf (BASE_PATH, \" |  \",lnL,\" | \",Format(LRT,14,3), \" |  \", AIC, \"  |  \", );\n\t\t\tPRINT_DIGITS = 15;\n\t\t\tif (LRT==0)\n\t\t\t{\n\t\t\t\tpValue = 1;\t\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpValue = 1-CChi2(LRT,fullnp-np);\n\t\t\t}\n\t\t\tif (AIC<v5)\n\t\t\t{\n\t\t\t\tv5 = AIC;\n\t\t\t\tv4 = v2;\n\t\t\t}\n\t\t\tfprintf (stdout,pValue,\" |\");\n\t\t\tfprintf (BASE_PATH,pValue,\" |\");\n\t\t\t\n\t\t}\n\t}\n\t\n\tPRINT_DIGITS = 0;\n\tmodelString = \"0\";\n\tfor (v3 = 0; v3<5; v3=v3+1)\n\t{\n\t\tmodelString = modelString + Format(resultCache [v4][v3],0,0);\n\t}\n\t\n\tfprintf (stdout, \"\\n\\nAIC based winner: (\", modelString, \") with AIC = \", v5, \"\\n\\n\");\n\tfprintf (BASE_PATH, \"\\n\\nAIC based winner: (\", modelString, \") with AIC = \", v5, \"\\n\\n\");\n\t\n\tdummy = printModelMatrix (modelString);\n\t\n\tmodelString2 = \"\";\n\tif (modelString == \"000000\")\n\t{\n\t\tmodelString2 = \"F81\";\n\t}\n\tif (modelString == \"010010\")\n\t{\n\t\tmodelString2 = \"HKY85\";\n\t}\n\tif (modelString == \"010020\")\n\t{\n\t\tmodelString2 = \"TrN\";\n\t}\n\tif (Abs(modelString2))\n\t{\n\t\tfprintf (stdout, \"\\nThis model is better known as:\", modelString2, \"\\n\");\n\t\tfprintf (BASE_PATH, \"\\nThis model is better known as:\", modelString2, \"\\n\");\n\t}\n\n}\nelse\n{\n\tfprintf (stdout, \"\\nGeneral Reversible Model is the winner!\\n\");\n\tfprintf (BASE_PATH, \"\\nGeneral Reversible Model is the winner!\\n\");\n}\n\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/HyPhy/MFPositiveSelection.bf",
    "content": "ModelNames = {{\"Neutral\",\n\t  \t\t  \"Selection\",\n\t\t\t  \"Discrete\",\n\t\t\t  \"Freqs\",\n\t\t\t  \"Gamma\",\n\t\t\t  \"2 Gamma\",\n\t\t\t  \"Beta\",\n\t\t\t  \"Beta & w\",\n\t\t\t  \"Beta & Gamma\",\n\t\t\t  \"Beta & (Gamma+1)\",\n\t\t\t  \"Beta & (Normal>1)\",\n\t\t\t  \"0 & 2 (Normal>1)\",\n\t\t\t  \"3 Normal\",\n\t\t\t  \"RE: Lognormal\",\n\t\t\t  \"RE: Gamma\",\n\t\t\t  \"RE: Discrete\"}};\n\t\t\t  \nParameterCount = {{0,\n\t  \t\t  \t   1,\n\t\t\t  \t   3,\n\t\t\t  \t   4,\n\t\t\t  \t   2,\n\t\t\t  \t   4,\n\t\t\t       2,\n\t\t\t  \t   4,\n\t\t\t  \t   5,\n\t\t\t       5,\n\t\t\t  \t   5,\n\t\t\t       5,\n\t\t\t       6,\n\t\t\t       1,\n\t\t\t       2,\n\t\t\t       4\n\t\t\t       }};\n\t\t\t       \nMAXIMUM_ITERATIONS_PER_VARIABLE = 2000;\nOPTIMIZATION_PRECISION = 0.001;\n\t\t\t  \nfunction SetWDistribution (resp)\n{\n\tif (rateType == 0)\n\t{\n\t\tglobal P = .5;\n\t\tP:<1;\n\t\tcategFreqMatrix = {{P,1-P}};\n\t\tcategRateMatrix = {{0,1}};\n\t\tcategory c = (2, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\n\t}\n\telse\n\t{\n\t\tif (rateType == 1)\n\t\t{\n\t\t\tglobal P1 = 1/3;\n\t\t\tglobal P2 = 0;\n\t\t\t\n\t\t\tP1:<1;\n\t\t\tP2:<1;\n\t\t\t\n\t\t\tglobal W = 1;\n\t\t\tcategFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;\n\t\t\tcategRateMatrix = {{0,1,W}};\n\t\t\tcategory c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\n\t\t}\t\t\n\t\telse\n\t\t{\n\t\t\tif (rateType == 2)\n\t\t\t{\n\t\t\t\tglobal P1 = 1/3;\n\t\t\t\tglobal P2 = .5;\n\t\t\t\tP1:<1;\n\t\t\t\tP2:<1;\n\t\t\t\tglobal W1 = .25;\n\t\t\t\tglobal R1 = 4;\n\t\t\t\tglobal R2 = 3;\n\t\t\t\tR1:>1;\n\t\t\t\tR2:>1;\n\t\t\t\tcategFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;\n\t\t\t\tcategRateMatrix = {{W1,W1*R1,W1*R1*R2}};\n\t\t\t\tcategory c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (rateType == 3)\n\t\t\t\t{\n\t\t\t\t\tglobal P1 = 1/5;\n\t\t\t\t\tglobal P2 = 1/4;\n\t\t\t\t\tglobal P3 = 1/3;\n\t\t\t\t\tglobal P4 = 1/2;\n\t\t\t\t\t\n\t\t\t\t\tP1:<1;\n\t\t\t\t\tP2:<1;\n\t\t\t\t\tP3:<1;\n\t\t\t\t\tP4:<1;\n\t\t\t\t\t\n\t\t\t\t\tcategFreqMatrix = {{P1,\n\t\t\t\t\t\t\t\t\t\t(1-P1)P2,\n\t\t\t\t\t\t\t\t\t\t(1-P1)(1-P2)*P3,\n\t\t\t\t\t\t\t\t\t\t(1-P1)(1-P2)(1-P3)P4,\n\t\t\t\t\t\t\t\t\t\t(1-P1)(1-P2)(1-P3)(1-P4)}} ;\n\t\t\t\t\tcategRateMatrix = {{0,1/3,2/3,1,3}};\n\t\t\t\t\tcategory c = (5, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (rateType == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\tglobal alpha = .5;\n\t\t\t\t\t\tglobal beta = 1;\n\t\t\t\t\t\talpha:>0.01;alpha:<100;\n\t\t\t\t\t\tbeta:>0.01;\n\t\t\t\t\t\tbeta:<200;\n\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, GammaDist(_x_,alpha,beta), CGammaDist(_x_,alpha,beta), 0 , \n\t\t\t\t \t\t\t \t\t  1e25,CGammaDist(_x_,alpha+1,beta)*alpha/beta);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (rateType == 5)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tglobal alpha = .5;\n\t\t\t\t\t\t\tglobal beta  =  1;\n\t\t\t\t\t\t\tglobal alpha2=  .75;\n\t\t\t\t\t\t\tglobal P\t = .5; \n\t\t\t\t\t\t\talpha:>0.01;alpha:<100;\n\t\t\t\t\t\t\tbeta:>0.01;\n\t\t\t\t\t\t\tbeta:<200;\n\t\t\t\t\t\t\tP:<1;\n\t\t\t\t\t\t\talpha2:>0.01;alpha2:<100;\n\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, P*GammaDist(_x_,alpha,beta) + (1-P)*GammaDist(_x_,alpha2,alpha2)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   , P*CGammaDist(_x_,alpha,beta) + (1-P)*CGammaDist(_x_,alpha2,alpha2), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   0 , 1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   P*CGammaDist(_x_,alpha+1,beta)*alpha/beta + (1-P)*CGammaDist(_x_,alpha2+1,alpha2));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (rateType == 6)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tglobal betaP = 1;\n\t\t\t\t\t\t\t\tglobal betaQ = 1;\n\t\t\t\t\t\t\t\tbetaP:>0.05;betaP:<85;\n\t\t\t\t\t\t\t\tbetaQ:>0.05;betaQ:<85;\n\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, _x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), IBeta(_x_,betaP,betaQ), 0 , \n\t\t\t\t\t\t \t\t\t \t\t  1,IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (rateType == 7)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tglobal W = 2;\n\t\t\t\t\t\t\t\t\t/*W:>1;*/\n\t\t\t\t\t\t\t\t\tglobal P\t = 1-1/(resp+1);\n\t\t\t\t\t\t\t\t\tglobal betaP = 1;\n\t\t\t\t\t\t\t\t\tglobal betaQ = 2;\n\t\t\t\t\t\t\t\t\tbetaP:>0.05;\n\t\t\t\t\t\t\t\t\tbetaQ:>0.05;\n\t\t\t\t\t\t\t\t\tbetaP:<85;\n\t\t\t\t\t\t\t\t\tbetaQ:<85;\n\t\t\t\t\t\t\t\t\tP:>0.0000001;\n\t\t\t\t\t\t\t\t\tP:<0.9999999;\n\t\t\t\t\t\t\t\t\tcategFreqMatrix = {resp+1,1};\n\t\t\t\t\t\t\t\t\tfor (k=0; k<resp; k=k+1)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tcategFreqMatrix[k]:=P/resp__;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcategFreqMatrix[resp]:=(1-P);\n\t\t\t\t\t\t\t\t\tcategory c = (resp+1, categFreqMatrix, MEAN, \n\t\t\t\t\t\t\t\t\t\t\t\t\tP*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+W-W, \n\t\t\t\t\t\t\t\t\t\t\t\t\tP*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=W), \n\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\tP*IBeta(Min(_x_,1),betaP+1,betaQ)*betaP/(betaP+betaQ)+(1-P)*W*(_x_>=W));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (rateType == 8)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tglobal P\t = .5;\n\t\t\t\t\t\t\t\t\t\tglobal betaP = 1;\n\t\t\t\t\t\t\t\t\t\tglobal betaQ = 2;\n\t\t\t\t\t\t\t\t\t\tbetaP:>0.05;betaP:<85;\n\t\t\t\t\t\t\t\t\t\tbetaQ:>0.05;betaQ:<85;\n\t\t\t\t\t\t\t\t\t\tglobal alpha = .5;\n\t\t\t\t\t\t\t\t\t\tglobal beta  = 1;\n\t\t\t\t\t\t\t\t\t\talpha:>0.01;alpha:<100;\n\t\t\t\t\t\t\t\t\t\tbeta:>0.01;\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tbeta:<200;\n\t\t\t\t\t\t\t\t\t\tP:<1;\n\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+(1-P)*GammaDist(_x_,alpha,beta), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*CGammaDist(_x_,alpha,beta), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+(1-P)*alpha/beta*CGammaDist(_x_,alpha+1,beta));\n\t\t\t\t\t\t\t\t\t}\t\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tif (rateType == 9)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tglobal P\t = .5;\n\t\t\t\t\t\t\t\t\t\t\tP:<1;\n\t\t\t\t\t\t\t\t\t\t\tglobal betaP = 1;\n\t\t\t\t\t\t\t\t\t\t\tbetaP:>0.05;betaP:<85;\n\t\t\t\t\t\t\t\t\t\t\tglobal betaQ = 2;\n\t\t\t\t\t\t\t\t\t\t\tbetaQ:>0.05;betaQ:<85;\n\t\t\t\t\t\t\t\t\t\t\tglobal alpha = .5;\n\t\t\t\t\t\t\t\t\t\t\talpha:>0.01;alpha:<100;\n\t\t\t\t\t\t\t\t\t\t\tglobal beta  = 1;\n\t\t\t\t\t\t\t\t\t\t\tbeta:>0.01;beta:<500;\n\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+(1-P)*(_x_>1)*GammaDist(Max(1e-20,_x_-1),alpha,beta), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*CGammaDist(Max(_x_-1,0),alpha,beta), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)*(alpha/beta*CGammaDist(Max(0,_x_-1),alpha+1,beta)+CGammaDist(Max(0,_x_-1),alpha,beta)));\n\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tif (rateType == 10)\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tglobal P\t = .5;\n\t\t\t\t\t\t\t\t\t\t\t\tglobal betaP = 1;\n\t\t\t\t\t\t\t\t\t\t\t\tglobal betaQ = 2;\n\t\t\t\t\t\t\t\t\t\t\t\tbetaP:>0.05;\n\t\t\t\t\t\t\t\t\t\t\t\tbetaQ:>0.05;\n\t\t\t\t\t\t\t\t\t\t\t\tbetaP:<85;\n\t\t\t\t\t\t\t\t\t\t\t\tbetaQ:<85;\n\t\t\t\t\t\t\t\t\t\t\t\tglobal mu = 3;\n\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma  = .01;\n\t\t\t\t\t\t\t\t\t\t\t\tsigma:>0.0001;\n\t\t\t\t\t\t\t\t\t\t\t\tsqrt2pi = Sqrt(8*Arctan(1));\n\t\t\t\t\t\t\t\t\t\t\t\tP:<1;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)*(_x_>=1)*Exp(-(_x_-mu)(_x_-mu)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF((mu-1)/sigma), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=1)*(1-ZCDF((mu-_x_)/sigma)/ZCDF((mu-1)/sigma)), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)*(_x_>=1)*(mu*(1-ZCDF((1-mu)/sigma)-ZCDF((mu-_x_)/sigma))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma*(Exp((mu-1)(1-mu)/(2*sigma*sigma))-Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF((mu-1)/sigma));\n\t\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tif (rateType == 11)\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P\t = 1/3;\n\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P1    = .5;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tglobal mu = 3;\n\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma  = .5;\n\t\t\t\t\t\t\t\t\t\t\t\t\tsigma:>0.0001;\n\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma1  = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\tsigma1:>0.0001;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsqrt2pi = Sqrt(8*Arctan(1));\n\t\t\t\t\t\t\t\t\t\t\t\t\tP:<1;\n\t\t\t\t\t\t\t\t\t\t\t\t\tP1:<1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tcategFreqMatrix = {resp+1,1};\n\t\t\t\t\t\t\t\t\t\t\t\t\tfor (k=1; k<=resp; k=k+1)\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategFreqMatrix[k]:=(1-P)/resp__;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tcategFreqMatrix[0]:=P;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp+1, categFreqMatrix, MEAN,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)((1-P1)*Exp(-(_x_-mu)(_x_-mu)/(2*sigma1*sigma1))/(sqrt2pi__*sigma1)/ZCDF(mu/sigma1)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  P1*Exp(-(_x_-1)(_x_-1)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(1/sigma)), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP+(1-P)(_x_>1e-20)((1-P1)(1-ZCDF((mu-_x_)/sigma1)/ZCDF(mu/sigma1))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP1*(1-ZCDF((1-_x_)/sigma)/ZCDF(1/sigma))), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)((1-P1)(mu*(1-ZCDF(-mu/sigma1)-ZCDF((mu-_x_)/sigma1))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma1*(Exp(-mu*mu/(2*sigma1*sigma1))-Exp((_x_-mu)(mu-_x_)/(2*sigma1*sigma1)))/sqrt2pi__)/ZCDF(mu/sigma1)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP(1-ZCDF(-1/sigma)-ZCDF((1-_x_)/sigma)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma*(Exp(-1/(2*sigma*sigma))-Exp((_x_-1)(1-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(1/sigma))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t );\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (rateType == 12)\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P\t = 1/3;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P1    = .5;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal mu = 3;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma  = .25;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma1 = .5;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma2 = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma:>0.0001;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma1:>0.0001;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma2:>0.0001;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsqrt2pi = Sqrt(8*Arctan(1));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tP:<1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tP1:<1;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL , MEAN,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t2*P*Exp(-_x_^2/(2*sigma*sigma))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)((1-P1)*Exp((_x_-mu)(mu-_x_)/(2*sigma2*sigma2))/(sqrt2pi__*sigma2)/ZCDF(mu/sigma2)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  P1*Exp((1-_x_)(_x_-1)/(2*sigma1*sigma1))/(sqrt2pi__*sigma1)/ZCDF(1/sigma1)), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*(1-2*ZCDF(-_x_/sigma))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)((1-P1)(1-ZCDF((mu-_x_)/sigma2)/ZCDF(mu/sigma2))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   P1*(1-ZCDF((1-_x_)/sigma1)/ZCDF(1/sigma1))), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t2*P*sigma*(1-Exp(-_x_*_x_/(2*sigma*sigma)))/sqrt2pi__+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)((1-P1)(mu*(1-ZCDF(-mu/sigma2)-ZCDF((mu-_x_)/sigma2))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma2*(Exp(-mu*mu/(2*sigma2*sigma2))-Exp((_x_-mu)(mu-_x_)/(2*sigma2*sigma2)))/sqrt2pi__)/ZCDF(mu/sigma2)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP1(1-ZCDF(-1/sigma1)-ZCDF((1-_x_)/sigma1)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma1*(Exp(-1/(2*sigma1*sigma1))-Exp((_x_-1)(1-_x_)/(2*sigma1*sigma1)))/sqrt2pi__)/ZCDF(mu/sigma1))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\t\n\t\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (rateType == 13)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma = .1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma:>0.0001;sigma:<10;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsqrt2pi = Sqrt(8*Arctan(1));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal _x_:<1e200;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tExp (-Log(_x_)*Log(_x_) / (2*sigma*sigma)) / (_x_*sigma*sqrt2pi__), /*density*/\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tZCDF (Log(_x_)/sigma), /*CDF*/\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t1e-200, \t\t\t   /*left bound*/\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t1e200, \t\t\t       /*right bound*/\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \t    Exp (.5*sigma^2)*ZCDF (Log(_x_)/sigma-sigma),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \t    CONSTANT_ON_PARTITION\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \t );\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (rateType == 14)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal alpha = .5;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal beta = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\talpha:>0.01;alpha:<100;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbeta:>0.01;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbeta:<200;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, GammaDist(_x_,alpha,beta), CGammaDist(_x_,alpha,beta), 0 , \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t \t\t  1e25,CGammaDist(_x_,alpha+1,beta)*alpha/beta,CONSTANT_ON_PARTITION);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P1 = 1/3;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P2 = .5;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP1:<1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP2:<1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal W1 = .25;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal R1 = 4;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal R2 = 3;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tR1:>1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tR2:>1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategRateMatrix = {{W1,W1*R1,W1*R1*R2}};\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25, ,CONSTANT_ON_PARTITION);\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t}\t\n\t\t\t}\t\n\t\t}\t\n\t}\t\t\n\treturn 0;\n}\n\n/* ____________________________________________________________________________________________________________________*/\n\nfunction FrameText (frameChar,vertChar,parOff,theText)\n{\n\th = Abs (theText)+4;\n\tfprintf (stdout,\"\\n\");\t\n\tfor (k=0; k<parOff; k=k+1)\n\t{\n\t\tfprintf (stdout,\" \");\n\t}\n\tfor (k=0; k<h;k=k+1)\n\t{\n\t\tfprintf (stdout,frameChar);\n\t}\n\tfprintf (stdout,\"\\n\");\t\n\tfor (k=0; k<parOff; k=k+1)\n\t{\n\t\tfprintf (stdout,\" \");\n\t}\n\tfprintf (stdout,vertChar,\" \",theText,\" \",vertChar,\"\\n\");\n\tfor (k=0; k<parOff; k=k+1)\n\t{\n\t\tfprintf (stdout,\" \");\n\t}\n\tfor (k=0; k<h;k=k+1)\n\t{\n\t\tfprintf (stdout,frameChar);\n\t}\n\tfprintf (stdout,\"\\n\");\t\n\treturn 0;\n}\n\n/* ____________________________________________________________________________________________________________________*/\n\nfunction BuildCodonFrequencies4 (obsF)\n{\n\tPIStop = 1.0;\n\tresult = {ModelMatrixDimension,1};\n\thshift = 0;\n\n\tfor (h=0; h<64; h=h+1)\n\t{\n\t\tfirst = h$16;\n\t\tsecond = h%16$4;\n\t\tthird = h%4;\n\t\tif (_Genetic_Code[h]==10) \n\t\t{\n\t\t\thshift = hshift+1;\n\t\t\tPIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];\n\t\t\tcontinue; \n\t\t}\n\t\tresult[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];\n\t}\n\treturn result*(1.0/PIStop);\n}\n\n/* ____________________________________________________________________________________________________________________*/\n\nfunction BuildCodonFrequencies12 (obsF)\n{\n\tPIStop = 1.0;\n\tresult = {ModelMatrixDimension,1};\n\thshift = 0;\n\n\tfor (h=0; h<64; h=h+1)\n\t{\n\t\tfirst = h$16;\n\t\tsecond = h%16$4;\n\t\tthird = h%4;\n\t\tif (_Genetic_Code[h]==10) \n\t\t{\n\t\t\thshift = hshift+1;\n\t\t\tPIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t\t\tcontinue; \n\t\t}\n\t\tresult[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t}\n\treturn result*(1.0/PIStop);\n}\n/* ____________________________________________________________________________________________________________________*/\n\n\nfunction GetDistributionParameters (sigLevel)\n{\n\tGetInformation (distrInfo,c);\n\tD = Columns(distrInfo);\n\tE = 0.0;\n\tT = 0.0;\n\tsampleVar = 0.0;\n\tfor (k=0; k<D; k=k+1)\n\t{\n\t\tT = distrInfo[0][k]*distrInfo[1][k];\n\t\tE = E+T;\n\t\tsampleVar = T*distrInfo[0][k]+sampleVar;\n\t}\n\tsampleVar = sampleVar-E*E;\n\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\ndN/dS = \",E, \" (sample variance = \",sampleVar,\")\\n\");\n\tfor (k=0; k<D; k=k+1)\n\t{\n\t\tfprintf (LAST_FILE_PATH,\"\\nRate[\",Format(k+1,0,0),\"]=\",\n\t\t\t\t Format(distrInfo[0][k],12,8), \" (weight=\", Format(distrInfo[1][k],9,7),\")\");\n\t}\n\t\n\tfor (k=0; k<D; k=k+1)\n\t{\n\t\tif (distrInfo[0][k]>1) break;\n\t}\n\tif (k<D)\n\t/* have rates > 1 */\n\t{\n\t\tConstructCategoryMatrix(marginals,lf,COMPLETE);\n\t\t\n\t\tCC = Columns (marginals);\n\t\tif (rateType>=13)\n\t\t/* subset rate variation */\n\t\t{\n\t\t\tCC  = CC/numberOfSubsets;\n\t\t\t\n\t\t\tsubsetMarginals = {D,numberOfSubsets};\n\t\t\tfor (v=0; v<numberOfSubsets; v=v+1)\n\t\t\t{\n\t\t\t\tfor (l=0; l<D; l=l+1)\n\t\t\t\t{\n\t\t\t\t\tfor (h=0; h<CC; h=h+1)\n\t\t\t\t\t{\n\t\t\t\t\t\tsubsetMarginals[l][v] = subsetMarginals[l][v] + marginals[l][v*CC+h];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmarginals = subsetMarginals;\n\t\t\tsubsetMarginals = 0;\n\t\t\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n Subsets with dN/dS>1 (Posterior cutoff = \",sigLevel,\")\\n\\n\");\n\t\t\tfor (v=0; v<numberOfSubsets; v=v+1)\n\t\t\t{\n\t\t\t\tsampleVar = 0;\n\t\t\t\tfor (h=0; h<D; h=h+1)\n\t\t\t\t{\n\t\t\t\t\tsampleVar = sampleVar+distrInfo[1][h]*marginals[h][v];\n\t\t\t\t}\n\t\t\t\tpositiveProb = 0;\n\t\t\t\tfor (l=k; l<D; l=l+1)\n\t\t\t\t{\n\t\t\t\t\tpositiveProb = positiveProb+distrInfo[1][l]*marginals[l][v];\n\t\t\t\t}\n\t\t\t\tpositiveProb = positiveProb/sampleVar;\n\t\t\t\tmarginals[0][v] = positiveProb;\n\t\t\t\tif (positiveProb>=sigLevel)\n\t\t\t\t{\n\t\t\t\t\tfprintf (LAST_FILE_PATH,Format (v+1,0,0),\" (\",positiveProb,\")\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n Subsets with dN/dS<=1 (Posterior cutoff = \",sigLevel,\")\\n\\n\");\n\t\t\tfor (v=0; v<numberOfSubsets; v=v+1)\n\t\t\t{\n\t\t\t\tif (marginals[0][v]<sigLevel)\n\t\t\t\t{\n\t\t\t\t\tfprintf (LAST_FILE_PATH,Format (v+1,0,0),\" (\",marginals[0][v],\")\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n Sites with dN/dS>1 (Posterior cutoff = \",sigLevel,\")\\n\\n\");\n\t\t\tfor (v=0; v<CC; v=v+1)\n\t\t\t{\n\t\t\t\tsampleVar = 0;\n\t\t\t\tfor (h=0; h<D; h=h+1)\n\t\t\t\t{\n\t\t\t\t\tsampleVar = sampleVar+distrInfo[1][h]*marginals[h][v];\n\t\t\t\t}\n\t\t\t\tpositiveProb = 0;\n\t\t\t\tfor (l=k; l<D; l=l+1)\n\t\t\t\t{\n\t\t\t\t\tpositiveProb = positiveProb+distrInfo[1][l]*marginals[l][v];\n\t\t\t\t}\n\t\t\t\tpositiveProb = positiveProb/sampleVar;\n\t\t\t\tmarginals[0][v] = positiveProb;\n\t\t\t\tif (positiveProb>=sigLevel)\n\t\t\t\t{\n\t\t\t\t\tfprintf (LAST_FILE_PATH,Format (v+1,0,0),\" (\",positiveProb,\")\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n Sites with dN/dS<=1 (Posterior cutoff = \",sigLevel,\")\\n\\n\");\n\t\t\tfor (v=0; v<CC; v=v+1)\n\t\t\t{\n\t\t\t\tif (marginals[0][v]<sigLevel)\n\t\t\t\t{\n\t\t\t\t\tfprintf (LAST_FILE_PATH,Format (v+1,0,0),\" (\",marginals[0][v],\")\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tmarginals = 0;\n\t}\n\telse\n\t{\n\t\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n No rate classes with dN/dS>1.\");\n\t}\n\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n\");\n\treturn E;\n}\n\n/* ____________________________________________________________________________________________________________________*/\n\nfunction PopulateModelMatrix (ModelMatrixName&, EFV)\n{\n\tModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; \n\n\thshift = 0;\n\t\n\tif (modelType==0)\n\t{\n\t\tfor (h=0; h<64; h=h+1)\n\t\t{\n\t\t\tif (_Genetic_Code[h]==10) \n\t\t\t{\n\t\t\t\thshift = hshift+1;\n\t\t\t\tcontinue; \n\t\t\t}\n\t\t\tvshift = hshift;\n\t\t\tfor (v = h+1; v<64; v=v+1)\n\t\t\t{\n\t\t\t\tdiff = v-h;\n\t\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t\t{\n\t\t\t\t\tvshift = vshift+1;\n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\t\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t\t  \t{\n\t\t\t  \t\tif (h$4==v$4)\n\t\t\t  \t\t{\n\t\t\t  \t\t\ttransition = v%4;\n\t\t\t  \t\t\ttransition2= h%4;\n\t\t\t  \t\t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t  \t\t\tif(diff%16==0)\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v$16;\n\t\t\t  \t\t\t\ttransition2= h$16;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t\telse\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v%16$4;\n\t\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t}\n\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t  \t\t{\n\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__];\n\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__];\n\t\t\t\t  \t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*t*EFV__[transition__];\n\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*t*EFV__[transition2__];\n\t\t  \t\t\t}\n\t\t\t  \t}\n\t\t\t  }\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (modelType==1)\n\t\t{\n\t\t\tfor (h=0; h<64; h=h+1)\n\t\t\t{\n\t\t\t\tif (_Genetic_Code[h]==10) \n\t\t\t\t{\n\t\t\t\t\thshift = hshift+1;\n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\t\t\t\tvshift = hshift;\n\t\t\t\tfor (v = h+1; v<64; v=v+1)\n\t\t\t\t{\n\t\t\t\t\tdiff = v-h;\n\t\t\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t\t\t{\n\t\t\t\t\t\tvshift = vshift+1;\n\t\t\t\t\t\tcontinue; \n\t\t\t\t\t}\n\t\t\t\t\tnucPosInCodon = 2;\n\t\t\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t\t\t  \t{\n\t\t\t\t  \t\tif (h$4==v$4)\n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\ttransition = v%4;\n\t\t\t\t  \t\t\ttransition2= h%4;\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tif(diff%16==0)\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\ttransition = v$16;\n\t\t\t\t  \t\t\t\ttransition2= h$16;\n\t\t\t\t\t\t\t\tnucPosInCodon = 0;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t\telse\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\ttransition = v%16$4;\n\t\t\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t\t\t\t\t\t\tnucPosInCodon = 1;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t  \t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*t*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*t*EFV__[transition2__][nucPosInCodon__];\n\t\t\t  \t\t\t}\n\t\t\t\t  \t}\n\t\t\t\t  }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (h=0; h<64; h=h+1)\n\t\t\t{\n\t\t\t\tif (_Genetic_Code[h]==10) \n\t\t\t\t{\n\t\t\t\t\thshift = hshift+1;\n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\t\t\t\tvshift = hshift;\n\t\t\t\tfor (v = h+1; v<64; v=v+1)\n\t\t\t\t{\n\t\t\t\t\tdiff = v-h;\n\t\t\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t\t\t{\n\t\t\t\t\t\tvshift = vshift+1;\n\t\t\t\t\t\tcontinue; \n\t\t\t\t\t}\n\t\t\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t\t\t  \t{\n\t\t\t\t  \t\tif (h$4==v$4)\n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\ttransition = v%4;\n\t\t\t\t  \t\t\ttransition2= h%4;\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tif(diff%16==0)\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\ttransition = v$16;\n\t\t\t\t  \t\t\t\ttransition2= h$16;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t\telse\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\ttransition = v%16$4;\n\t\t\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tif (Abs(transition-transition2)%2)\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := kappa*t;\n\t\t\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := kappa*t;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t\telse\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := t;\n\t\t\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := t;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t\t\n\t\t\t\t\t  \t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tif (Abs(transition-transition2)%2)\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := kappa*c*t;\n\t\t\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := kappa*c*t;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t\telse\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := c*t;\n\t\t\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := c*t;\n\t\t\t\t  \t\t\t}\n\t\t\t\t\t  \t}\n\t\t\t\t  \t}\t\n\t\t\t\t }\n\t\t\t}\t\n\t\t}\n\t }\n\t return (modelType>1);\n}\n\n/* ____________________________________________________________________________________________________________________*/\n\nfunction PopulateModelMatrix2 (ModelMatrixName&, EFV)\n{\n\tModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; \n\n\thshift = 0;\n\t\n\tfor (h=0; h<64; h=h+1)\n\t{\n\t\tif (_Genetic_Code[h]==10) \n\t\t{\n\t\t\thshift = hshift+1;\n\t\t\tcontinue; \n\t\t}\n\t\tvshift = hshift;\n\t\tfor (v = h+1; v<64; v=v+1)\n\t\t{\n\t\t\tdiff = v-h;\n\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t{\n\t\t\t\tvshift = vshift+1;\n\t\t\t\tcontinue; \n\t\t\t}\n\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t  \t{\n\t\t  \t\tif (h$4==v$4)\n\t\t  \t\t{\n\t\t  \t\t\ttransition = v%4;\n\t\t  \t\t\ttransition2= h%4;\n\t\t  \t\t}\n\t\t  \t\telse\n\t\t  \t\t{\n\t\t  \t\t\tif(diff%16==0)\n\t\t  \t\t\t{\n\t\t  \t\t\t\ttransition = v$16;\n\t\t  \t\t\t\ttransition2= h$16;\n\t\t  \t\t\t}\n\t\t  \t\t\telse\n\t\t  \t\t\t{\n\t\t  \t\t\t\ttransition = v%16$4;\n\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t  \t\t\t}\n\t\t  \t\t}\n\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t  \t\t{\n\t\t  \t\t\tif (Abs(transition-transition2)%2)\n\t\t  \t\t\t{\n\t\t  \t\t\t\tExecuteCommands (\"ModelMatrixName[h-hshift][v-vshift] := kappa\"+l+\"*t;ModelMatrixName[v-vshift][h-hshift] := kappa\"+l+\"*t;\");\n\t\t  \t\t\t}\n\t\t  \t\t\telse\n\t\t  \t\t\t{\n\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := t;\n\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := t;\n\t\t  \t\t\t}\n\t\t  \t\t\t\n\t\t\t  \t}\n\t\t  \t\telse\n\t\t  \t\t{\n\t\t  \t\t\tif (Abs(transition-transition2)%2)\n\t\t  \t\t\t{\n\t\t  \t\t\t\tExecuteCommands (\"ModelMatrixName[h-hshift][v-vshift] := c*kappa\"+l+\"*t;ModelMatrixName[v-vshift][h-hshift] := c*kappa\"+l+\"*t;\");\n\t\t  \t\t\t}\n\t\t  \t\t\telse\n\t\t  \t\t\t{\n\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := c*t;\n\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := c*t;\n\t\t  \t\t\t}\n\t\t\t  \t}\n\t\t  \t}\t\n\t\t }\n\t}\t\n\treturn 1;\n}\n/* ____________________________________________________________________________________________________________________*/\n\nfunction spawnLikelihood (kappaSharedOrNot)\n{\n\tif (kappaSharedOrNot)\n\t{\n\t\tfor (l=0; l<numberOfSubsets;l=l+1)\n\t\t{\n\t\t\tif (modelType<=1)\n\t\t\t{\n\t\t\t\tExecuteCommands (\"modelMatrix\"+l+\" = 0;MULTIPLY_BY_FREQS = PopulateModelMatrix (\\\"modelMatrix\"+l+\"\\\", observedFreq\"+l+\");\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tExecuteCommands (\"modelMatrix\"+l+\" = 0;MULTIPLY_BY_FREQS = PopulateModelMatrix2 (\\\"modelMatrix\"+l+\"\\\", observedFreq\"+l+\");\");\n\t\t\t}\t\t\t\n\t\t\tExecuteCommands (\"Model theModel\"+l+\" = (modelMatrix\"+l+\",vectorOfFrequencies\"+l+\",MULTIPLY_BY_FREQS);\");\n\t\t\tpartitionTreeString=partitionTrees[l];\n\t\t\tExecuteCommands (\"Tree subsetTree\"+l+\"=partitionTreeString;\");\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tMULTIPLY_BY_FREQS = PopulateModelMatrix (\"modelMatrix\", observedFreq);\n\t\tModel theModel = (modelMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);\n\t\tfor (v=0; v<numberOfSubsets;v=v+1)\n\t\t{\n\t\t\tpartitionTreeString=partitionTrees[v];\n\t\t\tExecuteCommands (\"Tree subsetTree\"+v+\"=partitionTreeString;\");\n\t\t}\n\t}\n\tlfSpawnString = \"LikelihoodFunction lf = (\";\n\tfor (v=0; v<numberOfSubsets;v=v+1)\n\t{\n\t\tif (v)\n\t\t{\n\t\t\tlfSpawnString = lfSpawnString+\",\";\n\t\t}\n\t\tlfSpawnString = lfSpawnString+\"subsetFilter\"+v+\",subsetTree\"+v;\n\t}\n\tlfSpawnString = lfSpawnString+\");\";\n\tExecuteCommands (lfSpawnString);\n\treturn 0;\n}\n\n\n/* ____________________________________________________________________________________________________________________*/\n\nNICETY_LEVEL = 3;\n\n#include \"TemplateModels/chooseGeneticCode.def\";\n\nModelMatrixDimension = 64;\nfor (h = 0 ;h<64; h=h+1)\n{\n\tif (_Genetic_Code[h]==10)\n\t{\n\t\tModelMatrixDimension = ModelMatrixDimension-1;\n\t}\n}\n\n#include \"MFPSreader.def\";\n\n/* now spawn the dataset filters */\n\n\nlowerSeqBound = 0;\nfor (modelType=0; modelType<numberOfSubsets; modelType = modelType+1)\n{\n\tExecuteCommands (\"DataSetFilter   subsetFilter\"+modelType+\"= CreateFilter (ds,3,\\\"\\\",(speciesIndex>=lowerSeqBound)&&(speciesIndex<lowerSeqBound+partitionLengths[modelType]),GeneticCodeExclusions);\");\n\tlowerSeqBound = lowerSeqBound+partitionLengths[modelType];\n}\n\nchosenModelList = {17,1};\n\nChoiceList (modelType,\"Distributions\",1,SKIP_NONE,\n\t\t\t\"Run All\",\"Run all available dN/dS distributions\",\n\t\t\t\"Run Custom\",\"Choose from available dN/dS distributions.\");\n\t\t\t\nif (modelType<0)\n{\n\treturn;\n}\n\nif (modelType==0)\n{\n\tfor (rateType = 0; rateType<17; rateType=rateType+1)\n\t{\n\t\tchosenModelList[rateType][0] = 1;\n\t}\n}\nelse\n{\n\tChoiceList (modelTypes,\"Distributions\",0,SKIP_NONE,\n\t\t\t\t\"Single Rate\",\"Single Rate\",\n\t\t\t\t\"Neutral\",\"Neutral\",\n\t  \t\t\t\"Selection\",\"Selection\",\n\t\t\t    \"Discrete\",\"Discrete\",\n\t\t\t    \"Freqs\",\"Freqs\",\n\t\t\t    \"Gamma\",\"Gamma\",\n\t\t\t    \"2 Gamma\",\"2 Gamma\",\n\t\t\t    \"Beta\",\"Beta\",\n\t\t\t    \"Beta & w\",\"Beta & w\",\n\t\t\t    \"Beta & Gamma\",\"Beta & Gamma\",\n\t\t\t    \"Beta & (Gamma+1)\",\"Beta & (Gamma+1)\",\n\t\t\t    \"Beta & (Normal>1)\",\"Beta & (Normal>1)\",\n\t\t\t    \"0 & 2 (Normal>1)\",\"0 & 2 (Normal>1)\",\n\t\t\t    \"3 Normal\",\"3 Normal\",\n\t\t\t    \"RE:Log normal\",\"Random Effects: Log normal\",\n\t\t\t    \"RE:Gamma\",\"Random Effects: Gamma\",\n\t\t\t    \"RE:Discrete\",\"Random Effects: 3 bin Discrete\");\n\t\t\t    \n\tif (modelTypes[0]<0)\n\t{\n\t\treturn;\n\t}\n\tfor (rateType = 0; rateType < Rows(modelTypes)*Columns(modelTypes); rateType = rateType + 1)\n\t{\n\t\tmodelType = modelTypes[rateType];\n\t\tchosenModelList[modelType] = 1;\n\t}\n}\n\nChoiceList (shareType,\"Choose parameter sharing mode\",1,SKIP_NONE,\n\t\t\t\"All\",\"Share dN/dS, transversion/transition ratio (if applicable) and base frequencies for all subsets.\",\n\t\t\t\"dN/dS Only\",\"Share only dN/dS. Transversion/transition ratio (if applicable) and base frequencies are separate for each subset.\"\n);\n\nif (shareType<0)\n{\n\treturn;\n}\n\nChoiceList (modelType,\"Choose a model\",1,SKIP_NONE,\n\t\t\t\"MG94 1x4\",\"Muse-Gaut 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).\",\n\t\t\t\"MG94 3x4\",\"Muse-Gaut 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific).\",\n\t\t\t\"GY94 1x4\",\"Goldman-Yang 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).\",\n\t\t\t\"GY94 3x4\",\"Goldman-Yang 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific).\"\n);\n\nif (modelType<0)\n{\n\treturn;\n}\n\nif ((modelType==0)||(modelType==2))\n{\n\tif (shareType==0)\n\t{\n\t\tHarvestFrequencies (observedFreq,filteredData,1,1,0);\n\t\tvectorOfFrequencies = BuildCodonFrequencies4 (observedFreq);\n\t}\n\telse\n\t{\n\t\tfor (v=0; v<numberOfSubsets;v=v+1)\n\t\t{\n\t\t\tExecuteCommands (\"global kappa\"+v+\"=2.;HarvestFrequencies (observedFreq\"+v+\",subsetFilter\"+v+\",1,1,0);vectorOfFrequencies\"+v+\"= BuildCodonFrequencies4 (observedFreq\"+v+\");\");\n\t\t}\t\t\n\t}\n}\nelse\n{\n\tif (shareType==0)\n\t{\n\t\tHarvestFrequencies (observedFreq,filteredData,3,1,1);\n\t\tvectorOfFrequencies = BuildCodonFrequencies12 (observedFreq);\n\t}\n\telse\n\t{\n\t\tfor (v=0; v<numberOfSubsets;v=v+1)\n\t\t{\n\t\t\tExecuteCommands (\"global kappa\"+v+\"=2.;HarvestFrequencies (observedFreq\"+v+\",subsetFilter\"+v+\",3,1,1);vectorOfFrequencies\"+v+\"= BuildCodonFrequencies12 (observedFreq\"+v+\");\");\n\t\t}\t\t\n\t}\n}\n\nif (modelType>1)\n{\t\n\tglobal kappa = 2.;\n}\n\nfprintf (stdout, \"\\n\\n\\nChoose the cutoff (0 to 1) for posterior of dN/dS>1 for a site to be considered under selective pressure:\");\nfscanf  (stdin, \"Number\",psigLevel);\nif ((psigLevel <= 0)||(psigLevel>1))\n{\n\tpsigLevel = .95;\n}\nfprintf (stdout, \"\\n>Using \", psigLevel , \" cutoff\\n\");\n\nfprintf (stdout, \"\\nChoose the number of categories in discretized distributions:\");\nfscanf  (stdin, \"Number\",categCount);\ncategCount = categCount$1;\nif (categCount<=0)\n{\n\tcategCount = 8;\n}\n\nfprintf (stdout, \"\\n>Using \", Format (categCount,0,0), \" categories.\\n\");\n\nSetDialogPrompt (\"Write detailed results to:\");\n\nfprintf (PROMPT_FOR_FILE,CLEAR_FILE);\n\nglobal c = 1.;\n\ndummyVar = FrameText (\"-\",\"|\",2,\"SUMMARY TABLE\");\ntableSeparator =  \"+-------------------------+----------------+---------------+-----+\\n\";\nfprintf (stdout, \"\\n\\\"p\\\" is the number of parameters in addition to the branch lengths.\\nDetailed results including sites with dN/dS>1 will be written to\\n\",LAST_FILE_PATH,\"\\n\\n\");\nfprintf (stdout, tableSeparator,\n\t\t\t\t \"| MODEL (Number & Desc)   | Log likelihood | \t   dN/dS     |  p  |\\n\",\n\t\t\t\t tableSeparator);\n\t\t\t\t \ncachedBranchLengths = {{-1,-1}};\n\t\t\t\t \nif (chosenModelList[0]>0)\n{\n\ttimer = Time(1);\n\tfprintf (LAST_FILE_PATH,\"\\n*** RUNNING SINGLE RATE MODEL ***\\n#################################\\n\");\n\tdummy = spawnLikelihood (shareType);\n\tOptimize (res,lf);\n\tfprintf (LAST_FILE_PATH,\"\\n>Done in \", Time(1)-timer, \" seconds \\n\\n\");\n\tfprintf (LAST_FILE_PATH,lf,\"\\n\\n-----------------------------------\\n\\ndN/dS = \",c,\"\\n\\n\");\n\n\tfprintf (stdout, \"|  0. Single Rate Model   | \",Format (res[1][0],14,6),\" | \",Format (c,13,8),\" |  0  |\\n\",\n\t\t\t\t\t tableSeparator);\n\t\t\t\t\t \n\ttimer = res[1][1]-res[1][2];\n\tcachedBranchLengths = {timer,1};\n\t\n\tfor (rateType = timer; rateType < Columns(cachedBranchLengths); rateType = rateType+1)\n\t{\n\t\tcachedBranchLengths[rateType-timer][0] = res [0][rateType];\n\t}\n}\n\nfor (rateType = 0; rateType < 16; rateType = rateType + 1)\n{\n\tif (chosenModelList[rateType+1]==0)\n\t{\n\t\tcontinue;\n\t}\n\ttimer = Time(1);\n\tdummy = SetWDistribution (categCount);\n\tdummy = spawnLikelihood (shareType);\n\t\n\tfprintf (LAST_FILE_PATH,\"\\n*** RUNNING MODEL \", Format(rateType+1,0,0), \" (\",ModelNames[rateType],\") ***\\n######################################\\n\");\n\t/*if (cachedBranchLengths[0][0]>=0.0)\n\t{\n\t\tv = ParameterCount[rateType];\n\t\tif (modelType>1)\n\t\t{\n\t\t\tv=v+1;\n\t\t}\n\t\tfor (h=0; h<Rows(cachedBranchLengths); h=h+1)\n\t\t{\n\t\t\tSetParameter (lf,h+v,cachedBranchLengths[h][0]);\n\t\t}\n\t}*/\n\tOptimize (res,lf);\n\tfprintf (LAST_FILE_PATH,\"\\n>Done in \",Time(1)-timer, \" seconds \\n\\n\", lf);\n\tfprintf (stdout, \"| \");\n\tif (rateType<9)\n\t{\n\t\tfprintf (stdout,\" \");\n\t}\n\tfprintf (stdout, Format (rateType+1,0,0), \". \", ModelNames[rateType]);\n\tfor (dummy = Abs(ModelNames[rateType])+5; dummy<25; dummy = dummy+1)\n\t{\n\t\tfprintf (stdout,\" \");\n\t}\n\tdummy = GetDistributionParameters(psigLevel);\n\tfprintf (stdout,\"| \",Format (res[1][0],14,6),\" | \",Format (dummy,13,8),\" |  \",\n\t\t\t\t\t\t Format(ParameterCount[rateType],0,0),\"  |\\n\",tableSeparator);\n\n\tif (modelType>1)\n\t{\t\n\t\tkappa = 2.;\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/HyPhy/MatrixIndexing.bf",
    "content": "fprintf (stdout, \"\\n1). Spawning a zero-populated 5x6 matrix and setting it's values to random numbers in [0,1].\\n\");\raMatrix = {5,6};\raMatrix = aMatrix [\"Random(0,1)\"];\rfprintf (stdout, aMatrix, \"\\n\");\r\rfprintf (stdout, \"\\n2). Accessing a second-row third-column element and a random element.\\n\\n\");\rr = Random (0, Rows(aMatrix))$1;\rc = Random (0, Columns(aMatrix))$1;\rfprintf (stdout, \"matrix[1][2]=\", aMatrix[1][2], \"\\nmatrix[\", r , \"][\" , c, \"]=\", aMatrix[r][c], \"\\n\");\r\rfprintf (stdout, \"\\n3). Accessing the fourth row.\\n\\n\");\rfprintf (stdout, \"matrix[3][-1]=\\n\", aMatrix[3][-1],\"\\n\");\r\rfprintf (stdout, \"\\n4). Accessing the first column.\\n\\n\");\rfprintf (stdout, \"matrix[-1][0]=\\n\", aMatrix[-1][0],\"\\n\");\r\rfprintf (stdout, \"\\n5). Populating a matrix template (below the diagonal).\\n\\n\");\rtemplate={5,6};\rtemplate=template[\"_MATRIX_ELEMENT_ROW_>_MATRIX_ELEMENT_COLUMN_\"];\rfprintf (stdout, template ,\"\\n\");\r\rfprintf (stdout, \"\\n6). Extracting (by row) matrix elements using the template.\\n\\n\");\rfprintf (stdout, aMatrix[template] ,\"\\n\");\r\rfprintf (stdout, \"\\n7). Extracting a submatrix: top left corner at (1,1) - bottom right corner at (3,2).\\n\\n\");\rfprintf (stdout, \"matrix[{{1,1}}][{{3,2}}]=\\n\", aMatrix[{{1,1}}][{{3,2}}],\"\\n\");\r\rfprintf (stdout, \"\\n8). Returning a matrix in which all elements are squared and above diagonal elements are further increased by 1.\\n\\n\");\rfprintf (stdout, \"\\n\", aMatrix[\"_MATRIX_ELEMENT_VALUE_^2+(_MATRIX_ELEMENT_ROW_<_MATRIX_ELEMENT_COLUMN_)\"],\"\\n\");\r\r"
  },
  {
    "path": "src/test/resources/samples/langs/HyPhy/MolecularClock.bf",
    "content": "#include \"molclockBootstrap.bf\";\n\nRESTORE_GLOBALS \t= 1;\n_DO_TREE_REBALANCE_ = 0;\nVERBOSITY_LEVEL     = -1;\n\nfunction RestoreGlobalValues (lfIndex)\n{\n\tif (lfIndex==0)\n\t{\n\t\tfor (i=0;i<SAVE_GLOBALS;i=i+1)\n\t\t{\n\t\t\tSetParameter (lf,i,globalSpoolMatrix[i]);\n\t\t}\n\t}\n\tif (lfIndex==1)\n\t{\n\t\tfor (i=0;i<SAVE_GLOBALS2;i=i+1)\n\t\t{\n\t\t\tSetParameter (lfConstrained,i,globalSpoolMatrix2[i]);\n\t\t}\n\t}\n\treturn 0;\n}\n\n\n\nfprintf(stdout,\"\\n ---- RUNNING MOLECULAR CLOCK ANALYSIS ---- \\n\");\n\nChoiceList (dataType,\"Data type\",1,SKIP_NONE,\"Nucleotide/Protein\",\"Nucleotide or amino-acid (protein).\",\n\t\t\t\t     \"Codon\",\"Codon (several available genetic codes).\");\n\nif (dataType<0) \n{\n\treturn;\n}\nif (dataType)\n{\n\tNICETY_LEVEL = 3;\n\t#include \"TemplateModels/chooseGeneticCode.def\";\n}\n\nSetDialogPrompt (\"Choose the data file:\");\n\nDataSet ds = ReadDataFile (PROMPT_FOR_FILE);\n\nfprintf (stdout,\"The following data was read:\\n\",ds,\"\\n\");\n\nif (dataType)\n{\n\tDataSetFilter filteredData = CreateFilter (ds,3,\"\",\"\",GeneticCodeExclusions);\n}\nelse\n{\n\tDataSetFilter filteredData = CreateFilter (ds,1);\n}\n\nSelectTemplateModel(filteredData);\n\n#include \"queryTree.bf\";\n\nglobal RelRatio;\n\nRelRatio = 1.0;\n\nrelationString = \":=RelRatio*\";\n\nparameter2Constrain = 0;\n\nif (Rows(\"LAST_MODEL_PARAMETER_LIST\")>1)\n{\n\tChoiceList (parameter2Constrain, \"Parameter(s) to constrain:\",1,SKIP_NONE,LAST_MODEL_PARAMETER_LIST);\n\n\tif (parameter2Constrain<0)\n\t{\n\t\treturn;\n\t}\n\tif (parameter2Constrain==0)\n\t{\n\t\tparameter2ConstrainString = \"\";\n\t\tfor (parameter2Constrain=Rows(\"LAST_MODEL_PARAMETER_LIST\")-1; parameter2Constrain; parameter2Constrain = parameter2Constrain-1)\n\t\t{\n\t\t\tGetString (funnyString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain);\n\t\t\tparameter2ConstrainString = parameter2ConstrainString + funnyString + \",\";\n\t\t}\n\t\tGetString (funnyString,LAST_MODEL_PARAMETER_LIST,0);\n\t\tparameter2ConstrainString = parameter2ConstrainString + funnyString;\n\t}\n\telse\n\t{\n\t\tGetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain-1);\n\t}\n}\nelse\n{\n\tGetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,0);\n}\n\ntimer = Time(0);\n\nLikelihoodFunction lf = (filteredData,givenTree);\n\nOptimize (res,lf);\n\nseparator = \"*-----------------------------------------------------------*\";\n\nfprintf (stdout, \"\\n\", separator, \"\\nRESULTS WITHOUT THE CLOCK:\\n\",lf);\n\nfullModelLik = res[1][0];\n\nfullVars = res[1][1];\n\n/* now specify the constraint */\n\nTree clockTree = treeString;\n\nExecuteCommands (\"MolecularClock (clockTree,\"+parameter2ConstrainString+\");\");\n\nLikelihoodFunction lfConstrained = (filteredData, clockTree);\n\nUSE_LAST_RESULTS = 1;\nOptimize (res1,lfConstrained);\nUSE_LAST_RESULTS = 0;\n\nSAVE_GLOBALS = res1[1][2];\n\nif (SAVE_GLOBALS)\n{\n\tglobalSpoolMatrix = {1,SAVE_GLOBALS};\n\n\tfor (i=0;i<SAVE_GLOBALS;i=i+1)\n\t{\n\t\tglobalSpoolMatrix[i]=res1[0][i];\n\t}\n}\n\nfprintf (stdout, \"\\n\", separator,\"\\n\\nRESULTS WITH THE CLOCK:\\n\",lfConstrained);\n\nlnLikDiff = 2(fullModelLik-res1[1][0]);\n\ndegFDiff = fullVars - res1[1][1];\n\nfprintf (stdout, \"\\n\", separator,\"\\n\\n-2(Ln Likelihood Ratio)=\",lnLikDiff,\"\\n\",\"Constrained parameters:\",Format(degFDiff,0,0));\n\nfprintf (stdout, \"\\nP-Value:\",1-CChi2(lnLikDiff,degFDiff));\n\nfprintf (stdout, \"\\nCPU time taken: \", Time(0)-timer, \" seconds.\\n\");\n"
  },
  {
    "path": "src/test/resources/samples/langs/HyPhy/dNdSDistributionComparison.bf",
    "content": "/* Written by SL Kosakovsky Pond (sergeilkp@mac.com) October 2006 */\n/* This analysis uses a 4 bin general bivariate discrete distributions, \n   with 2 negatively selected classes, a positively selected class and a neutral class,\n   to compare the distributions of dS and dN in two data sets.\n   \n   The tests done:\n   \n   - Are the distributions the same?\n   - Are there the same proportions of sites with dN>dS in the data sets?\n   - Do the sites under positive selection share the same dN/dS?\n   - Two previous tests combined\n*/\n\nRequireVersion (\"0.9920061001\");\n\n/*---------------------------------------------------------------------------------------------------------------------------------------------------*/\n\nfunction BuildCodonFrequencies (obsF)\n{\n\tPIStop = 1.0;\n\tresult = {ModelMatrixDimension,1};\n\thshift = 0;\n\n\tfor (h=0; h<64; h=h+1)\n\t{\n\t\tfirst = h$16;\n\t\tsecond = h%16$4;\n\t\tthird = h%4;\n\t\tif (_Genetic_Code[h]==10) \n\t\t{\n\t\t\thshift = hshift+1;\n\t\t\tPIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t\t\tcontinue; \n\t\t}\n\t\tresult[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t}\n\treturn result*(1.0/PIStop);\n}\n\n/*---------------------------------------------------------------------------------------------------------------------------------------------------*/\n\nfunction ReportDistributionString (rc,freqStrMx,infix, skip0)\n{\n\tdistroString = \"\";\n\tdistroString * 1024;\n\t\n\treportMx = {rc,4};\n\t\n\tdistroString * (\"   dN/dS      dS      dN      Prob\\n\");\n\tfor (mi=0; mi<rc; mi=mi+1)\n\t{\n\t\tExecuteCommands (\"reportMx[mi][0]=S_\"+infix+mi+\"/c_\"+infix+\"scale;\");\n\t\tExecuteCommands (\"reportMx[mi][1]=NS_\"+infix+mi+\"/c_\"+infix+\"scale;\");\n\t\treportMx[mi][2] = reportMx[mi][1]/reportMx[mi][0];\n\t\tExecuteCommands (\"reportMx[mi][3]=\"+freqStrMx[mi]+\";\");\n\t\tif (skip0 == 0 || reportMx[mi][3] > 0)\n\t\t{\n\t\t\tdistroString * (Format(reportMx[mi][2],8,3)+Format(reportMx[mi][0],8,3)+Format(reportMx[mi][1],8,3)+Format(reportMx[mi][3],10,3)+\"\\n\");\n\t\t}\n\t}\t\t\t\t\t\t\t\t   \n\t\n\tdistroString * 0;\n\treturn distroString;\n}\n\n/*---------------------------------------------------------------------------------------------------------------------------------------------------*/\n\nfunction DefineNucleotideBiases (dummy)\n{\n\tModelTitle \t\t\t\t= \"MG94x\"+modelDesc[0];\n\tmodelConstraintString = \"\";\n\n\tfor (customLoopCounter2=0; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)\n\t{\n\t\tif (rateBiasTerms[customLoopCounter2] != \"1\")\n\t\t{\n\t\t\tExecuteCommands (\"global \" + rateBiasTerms[customLoopCounter2] + \"=1;\");\n\t\t}\n\t}\n\n\tfor (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)\n\t{\n\t\tfor (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)\n\t\t{\n\t\t\tif (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])\n\t\t\t{\n\t\t\t\tModelTitle  = ModelTitle+modelDesc[customLoopCounter2];\t\n\t\t\t\tif (rateBiasTerms[customLoopCounter2] == \"1\")\n\t\t\t\t{\n\t\t\t\t\tmodelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+\":=\"+rateBiasTerms[customLoopCounter2]+\";\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmodelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+\":=\"+rateBiasTerms[customLoopCounter]+\";\";\t\t\t\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (customLoopCounter==customLoopCounter2)\n\t\t{\n\t\t\tModelTitle = ModelTitle+modelDesc[customLoopCounter2];\t\n\t\t}\n\t}\t\n\n\n\tif (Abs(modelConstraintString))\n\t{\n\t\tExecuteCommands (modelConstraintString);\n\t}\n\treturn 0;\n}\n\n/*---------------------------------------------------------------------------------------------------------------------------------------------------*/\n\nfunction \t\tdefineRateDistribution (infix)\n{\n\tExecuteCommands (\"global S_\"+infix+\"0  = 0.5;S_\"+infix+\"0:>0.0000001;global NS_\"+infix+\"0 = 0.1;\");\n\n\tfor (mi=1; mi<resp; mi=mi+1)\n\t{\n\t\tcategDef1 * (\"global S_\"+infix+mi+\"=0.5;S_\"+infix+mi+\":>0.0000001;\\nglobal NS_\"+infix+mi+\";\\n\");\n\t\tif (randomizeInitValues)\n\t\t{\n\t\t\tcategDef1*(\"global P_\"+infix+mi+\" = Random(0.05,0.95);\\nP_\"+infix+mi+\":<1;\\n\");\t\n\t\t\tcategDef1*(\"global S_\"+infix+mi+\" = Random(0.05,1);\");\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcategDef1*(\"global P_\"+infix+mi+\" = 1/\"+(resp+1-mi)+\";\\nP_\"+infix+mi+\":<1;\\n\");\n\t\t}\n\t}\n\n\tfreqStrMx    = {resp,1};\n\tif (resp>1)\n\t{\n\t\tfreqStrMx[0] = \"P_\"+infix+\"1\";\n\n\t\tfor (mi=1; mi<resp-1; mi=mi+1)\n\t\t{\n\t\t\tfreqStrMx[mi] = \"\";\n\t\t\tfor (mi2=1;mi2<=mi;mi2=mi2+1)\n\t\t\t{\n\t\t\t\tfreqStrMx[mi] = freqStrMx[mi]+\"(1-P_\"+infix+mi2+\")\";\t\t\n\t\t\t}\n\t\t\tfreqStrMx[mi] = freqStrMx[mi]+\"P_\"+infix+(mi+1);\t\n\t\t}\t\n\t\tfreqStrMx[mi] = \"\";\n\n\t\tfor (mi2=1;mi2<mi;mi2=mi2+1)\n\t\t{\n\t\t\tfreqStrMx[mi] = freqStrMx[mi]+\"(1-P_\"+infix+mi2+\")\";\t\t\n\t\t}\n\t\tfreqStrMx[mi] = freqStrMx[mi]+\"(1-P_\"+infix+mi+\")\";\t\n\t}\n\telse\n\t{\n\t\tfreqStrMx[0] = \"1\";\n\t}\n\n\tcategDef1*( \"\\n\\nglobal c_\"+infix+\"scale:=S_\"+infix+\"0*\" + freqStrMx[0]);\n\n\tfor (mi=1; mi<resp; mi=mi+1)\n\t{\n\t\tcategDef1*( \"+S_\"+infix+mi+\"*\" + freqStrMx[mi]);\n\t}\n\n\tcategDef1 * \";\";\n\n\tfor (mi=0; mi<resp; mi=mi+1)\n\t{\n\t\tcategDef1 * (\"\\nglobal R_\"+infix+mi+\"=1;NS_\"+infix+mi+\":=R_\"+infix+mi+\"*S_\"+infix+mi+\";\\n\");\n\t}\n\n\tif (stratDNDS)\n\t{\n\t\tfor (mi=respP; mi<respN+respP; mi=mi+1)\n\t\t{\n\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\":=1;\");\n\t\t}\n\n\t\tif (randomizeInitValues)\n\t\t{\n\t\t\tfor (mi=respP+respN; mi<resp; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\":<1;R_\"+infix+mi+\"=\"+Random(0.05,0.95)+\";\");\n\t\t\t}\n\n\t\t\tfor (mi=0; mi<respP; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\":>1;R_\"+infix+mi+\"=\"+Random(1.05,10)+\";\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (mi=respN+respP; mi<resp; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\":<1;R_\"+infix+mi+\"=1/\"+(2+mi-respN-respP)+\";\");\n\t\t\t}\n\n\t\t\tfor (mi=0; mi<respP; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\":>1;R_\"+infix+mi+\"=2+\"+mi+\";\");\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (randomizeInitValues)\n\t\t{\n\t\t\tfor (mi=0; mi<resp; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\"=\"+Random(0.05,1.75)+\";\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (mi=0; mi<resp; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\"=\"+(0.1+0.3*mi)+\";\");\n\t\t\t}\t\n\t\t}\n\n\t}\n\n\tcategDef1 * 0;\n\treturn 0;\n}\n/*---------------------------------------------------------------------------------------------------------------------------------------------------*/\n\nChoiceList (branchLengths,\"Branch Lengths\",1,SKIP_NONE,\n\t\t\t\"Codon Model\",\"Jointly optimize rate parameters and branch lengths (slow and thorough)\",\n\t\t\t\"Nucleotide Model\",\"Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty).\"\n\t\t    );\n\nif (branchLengths<0)\n{\n\treturn;\n}\n\nfileCount\t= 2;\n#include \"TemplateModels/chooseGeneticCode.def\";\n\nExecuteAFile \t\t    (\"2RatesAnalyses/MG94xREVxBivariate.mdl\");\nfprintf \t\t\t\t(stdout, \"\\nReading input file 1/2\\n\");\nSetDialogPrompt \t\t(\"Please specify codon data #1:\");\nDataSet\t\t\t\t\tds_1 \t\t\t= ReadDataFile (PROMPT_FOR_FILE);\nfprintf\t\t\t\t\t(stdout, \"\\nData file 1: \", LAST_FILE_PATH, \"\\n\\t\", ds_1.species, \" sequences and \", ds_1.sites, \" nucleotides\\n\");\nDataSetFilter \t\t\tfilteredData_1 \t= CreateFilter (ds_1,3,\"\",\"\",GeneticCodeExclusions);\nHarvestFrequencies\t\t(observedFreq_1,filteredData_1,3,1,1);\nHarvestFrequencies\t\t(observedFreqSingle_1,filteredData_1,1,1,1);\ndone = 0;\nwhile (!done)\n{\n\tfprintf (stdout,\"\\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):\");\n\tfscanf  (stdin,\"String\", modelDesc);\n\tif (Abs(modelDesc)==6)\n\t{\t\n\t\tdone = 1;\n\t}\n}\t\t\nModelTitle \t\t\t\t= \"MG94x\"+modelDesc[0];\nrateBiasTerms\t \t\t= {{\"AC_1\",\"1\",\"AT_1\",\"CG_1\",\"CT_1\",\"GT_1\"}};\nDefineNucleotideBiases (0);\nmodelConstraintString_1 = modelConstraintString;\nModelTitle_1\t\t\t= ModelTitle;\t\nfprintf\t\t\t\t\t(stdout, \"Using model \", ModelTitle_1, \" on alignment 1\\n\\n\");\n#include\t\t\t\t\"queryTree.bf\";\ntreeString_1\t\t\t= treeString;\t\t\t\n\n\nfprintf \t\t\t\t(stdout, \"\\nReading input file 2/2\\n\");\nSetDialogPrompt \t\t(\"Please specify codon data #2:\");\nDataSet\t\t\t\t\tds_2 \t\t\t= ReadDataFile (PROMPT_FOR_FILE);\nfprintf\t\t\t\t\t(stdout, \"\\nData file 2: \", LAST_FILE_PATH, \"\\n\\t\", ds_2.species, \" sequences and \", ds_2.sites, \" nucleotides\\n\");\nDataSetFilter \t\t\tfilteredData_2 \t= CreateFilter (ds_2,3,\"\",\"\",GeneticCodeExclusions);\nHarvestFrequencies\t\t(observedFreq_2,filteredData_2,3,1,1);\nHarvestFrequencies\t\t(observedFreqSingle_2,filteredData_2,1,1,1);\ndone = 0;\nwhile (!done)\n{\n\tfprintf (stdout,\"\\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):\");\n\tfscanf  (stdin,\"String\", modelDesc);\n\tif (Abs(modelDesc)==6)\n\t{\t\n\t\tdone = 1;\n\t}\n}\t\t\nModelTitle \t\t\t\t= \"MG94x\"+modelDesc[0];\nrateBiasTerms\t \t\t= {{\"AC_2\",\"1\",\"AT_2\",\"CG_2\",\"CT_2\",\"GT_2\"}};\nDefineNucleotideBiases (0);\nmodelConstraintString_2 = modelConstraintString;\nModelTitle_2\t\t\t= ModelTitle;\t\nfprintf\t\t\t\t\t(stdout, \"Using model \", ModelTitle_2, \" on alignment 2\\n\\n\");\n#include\t\t\t\t\"queryTree.bf\";\ntreeString_2\t\t\t= treeString;\t\t\t\n\t\t\t\t\t\t  \ntotalCodonCount\t\t\t= filteredData_1.sites + filteredData_2.sites;\n\nChoiceList (randomizeInitValues, \"Initial Value Options\",1,SKIP_NONE,\n\t\t\t\"Default\",\t \"Use default inital values for rate distribution parameters.\",\n\t\t\t\"Randomized\",\t \"Select initial values for rate distribution parameters at random.\");\n\n\nif (randomizeInitValues < 0)\n{\n\treturn;\n}\n\nstratDNDS = 1;\nresp  \t  = 4;\nrespM \t  = 2;\nrespN \t  = 1;\nrespP \t  = 1;\n\nfprintf (stdout, \"\\nUsing\\n\\t\", respM, \" negatively selected classes\\n\\t\", respN, \" neutrally evolving classes\\n\\t\", \n\t\t\t\t\trespP, \" positively selected classes\\n\\n\");\n\ncategDef1 = \"\";\ncategDef1 * 1024;\n\nlfDef\t  = {};\n\nfor (fileID = 0; fileID < fileCount; fileID = fileID + 1)\n{\n\tlfDef[fileID] = \"\";\n\tlfDef[fileID] * 1024;\n\tlfDef[fileID] * \"Log(\";\n}\n\ndefineRateDistribution (\"1_\");\ncategDef_1  = categDef1;\nfreqStrMx_1 = freqStrMx;\n\nfor (mi=0; mi<resp; mi=mi+1)\n{\n\tfileID = 0;\n\tif (mi)\n\t{\n\t\tlfDef[fileID] * \"+\";\n\t}\n\tlfDef[fileID]*(freqStrMx_1[mi]+\"*SITE_LIKELIHOOD[\"+(fileID*resp+mi)+\"]\");\t\t\n}\n\ndefineRateDistribution (\"2_\");\ncategDef_2  = categDef1;\nfreqStrMx_2 = freqStrMx;\n\nfor (mi=0; mi<resp; mi=mi+1)\n{\n\tfileID = 1;\n\tif (mi)\n\t{\n\t\tlfDef[fileID] * \"+\";\n\t}\n\tlfDef[fileID]*(freqStrMx_2[mi]+\"*SITE_LIKELIHOOD[\"+(fileID*resp+mi)+\"]\");\t\t\n}\n\nlfDef1 = \"\";\nlfDef1 * 128;\nlfDef1 * \"\\\"\";\n\nfor (fileID = 0; fileID < fileCount; fileID = fileID + 1)\n{\n\tlfDef[fileID] * \")\";\n\tlfDef[fileID] * 0;\n\tlfDef1 * lfDef[fileID];\n\tif (fileID < fileCount - 1)\n\t{\n\t\tlfDef1 * \"+\";\n\t}\n}\n\nlfDef1 \t  * \"\\\"\";\nlfDef1\t  * 0;\n\nExecuteCommands (categDef_1);\nExecuteCommands (categDef_2);\n\nModelMatrixDimension = 64;\nfor (h = 0 ;h<64; h=h+1)\n{\n\tif (_Genetic_Code[h]==10)\n\t{\n\t\tModelMatrixDimension = ModelMatrixDimension-1;\n\t}\n}\n\nSetDialogPrompt (\"Save resulting fits to:\");\nfprintf \t\t(PROMPT_FOR_FILE, CLEAR_FILE);\nresToPath \t\t= LAST_FILE_PATH;\n\nvectorOfFrequencies_1 = BuildCodonFrequencies (observedFreq_1);\nvectorOfFrequencies_2 = BuildCodonFrequencies (observedFreq_2);\n\nfprintf\t\t\t(stdout, \"Fitting a nucleotide model to approximate branch lengths and get starting nucleotide bias estimates...\\n\");\n\nnucModelMatrix_1 \t\t\t= {{*,AC_1*t,t,AT_1*t}{AC_1*t,*,CG_1*t,CT_1*t}{t,CG_1*t,*,GT_1*t}{AT_1*t,CT_1*t,GT_1*t,*}};\nModel nucModel_1 \t\t\t= (nucModelMatrix_1,observedFreqSingle_1);\nDataSetFilter \tnucFilter_1 = CreateFilter (filteredData_1,1);\nTree  \t\t\tnucTree_1 \t= treeString_1;\n\nnucModelMatrix_2 = {{*,AC_2*t,t,AT_2*t}{AC_2*t,*,CG_2*t,CT_2*t}{t,CG_2*t,*,GT_2*t}{AT_2*t,CT_2*t,GT_2*t,*}};\nModel nucModel_2 = (nucModelMatrix_2,observedFreqSingle_2);\nDataSetFilter \tnucFilter_2 = CreateFilter (filteredData_2,1);\nTree  \t\t\tnucTree_2 \t= treeString_2;\n\nLikelihoodFunction nuc_lf = (nucFilter_1, nucTree_1, nucFilter_2, nucTree_2);\nOptimize (nuc_res, nuc_lf);\n\nglobal \t codonFactor_1 = 0.33;\nglobal \t codonFactor_2 = 0.33;\n\nlfParts\t= \"\";\nlfParts * 128;\nlfParts * \"LikelihoodFunction lf = (filteredData_1,tree_1_0\";\n\nfor (fileID = 1; fileID <= fileCount; fileID = fileID + 1)\n{\n\trateMultipliers \t= {{\"\"   ,\"AC_\"+fileID+\"*\",\"\"   ,\"AT_\"+fileID+\"*\"}\n\t\t\t\t\t\t   {\"AC_\"+fileID+\"*\",\"\"   ,\"CG_\"+fileID+\"*\",\"CT_\"+fileID+\"*\"}\n\t\t\t\t\t\t   {\"\"   ,\"CG_\"+fileID+\"*\",\"\"   ,\"GT_\"+fileID+\"*\"}\n\t\t\t\t\t\t   {\"AT_\"+fileID+\"*\",\"CT_\"+fileID+\"*\",\"GT_\"+fileID+\"*\",\"\" }\n\t\t\t\t\t\t  };\n\n\tfor (part = 0; part < resp; part = part + 1)\n\t{\n\t\tExecuteCommands (\"PopulateModelMatrix(\\\"rate_matrix_\"+fileID+\"_\"+part+\"\\\",observedFreq_\"+fileID+\",\\\"S_\"+fileID+\"_\"+part+\"/c_\"+fileID+\"_scale\\\",\\\"NS_\"+fileID+\"_\"+part+\"/c_\"+fileID+\"_scale\\\");\");\n\t\tExecuteCommands (\"Model MG94model_\"+fileID+\"_\"+part+\"= (rate_matrix_\"+fileID+\"_\"+part+\",vectorOfFrequencies_\"+fileID+\",0);\");\n\t\t\n\t\ttreeID = \"tree_\"+fileID+\"_\"+part;\n\t\tExecuteCommands (\"Tree \"+treeID+\"=treeString_\" + fileID +\";\");\n\t\tif (branchLengths)\n\t\t{\n\t\t\tExecuteCommands (\"ReplicateConstraint (\\\"this1.?.synRate:=this2.?.t__/codonFactor_\"+fileID+\"\\\",\"+treeID+\",nucTree_\"+fileID+\");\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (part == 0)\n\t\t\t{\t\n\t\t\t\tExecuteCommands (\"bnames = BranchName(nucTree_\" + fileID + \",-1);\");\n\t\t\t\tnlfDef = \"\";\n\t\t\t\tnlfDef * 128;\n\t\t\t\tfor (lc = 0; lc < Columns (bnames); lc=lc+1)\n\t\t\t\t{\n\t\t\t\t\tnlfDef * (treeID + \".\" + bnames[lc] + \".synRate = nucTree_\" + fileID + \".\" + bnames[lc] + \".t/codonFactor_\"+fileID+\";\");\n\t\t\t\t}\n\t\t\t\tnlfDef * 0;\n\t\t\t\tExecuteCommands (nlfDef);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tExecuteCommands (\"ReplicateConstraint (\\\"this1.?.synRate:=this2.?.synRate\\\",\"+treeID+\",tree_\"+fileID+\"_0);\");\n\t\t\t}\n\t\t}\n\t\tif (part || fileID > 1)\n\t\t{\n\t\t\tlfParts = lfParts + \",filteredData_\" + fileID + \",\" + treeID;\n\t\t}\n\t}\n}\n\nlfParts * 0;\nExecuteCommands (lfParts + \",\" + lfDef1 + \");\");\n\nsumPath = resToPath + \".summary\";\n\ntreeBranchParameters = 0;\nfor (fileID = 1; fileID <= fileCount; fileID = fileID + 1)\n{\n\tExecuteCommands (\"treeBranchParameters = treeBranchParameters + BranchCount(tree_\" + fileID + \"_0) + TipCount(tree_\" + fileID + \"_0);\");\n}\t\n\n/*-------------- INDEPENDENT DISTRIBUTIONS  ------------------*/\n\nsop = Max(OPTIMIZATION_PRECISION,0.001);\n\nfprintf (stdout, \"Running simpler distribution approximations to ensure good convergence...\\n\");\n\nOPTIMIZATION_PRECISION = 0.1;\n\nP_1_1 := 0;P_1_2 := 0;P_1_3 := 0;\nP_2_1 := 0;P_2_2 := 0;P_2_3 := 0;\n\nS_1_0 := 1;S_1_1 := 1;S_1_2 := 1;S_1_3 := 1;\nS_2_0 := 1;S_2_1 := 1;S_2_2 := 1;S_2_3 := 1;\nR_1_0 := 1;R_1_1 := 1;R_1_2 := 1;\nR_2_0 := 1;R_2_1 := 1;R_2_2 := 1;\n\nOptimize (res,lf);\nUSE_LAST_RESULTS \t\t= 1;\nSKIP_CONJUGATE_GRADIENT = 1;\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",1);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",1);\n\nfprintf (stdout,  \"\\n*** Done with pass 1. Log(L) = \", Format(res[1][0],10,3), \" *** \\n\");\nfprintf (stdout,  \"Approximate rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Approximate rates for data set 2:\\n\", d2);\n\ncodonFactor_1 := codonFactor_1__;\ncodonFactor_2 := codonFactor_2__;\n\nAC_1  := AC_1__; AT_1  := AT_1__; CG_1  := CG_1__; CT_1  := CT_1__; GT_1  := GT_1__;\nAC_2  := AC_2__; AT_2  := AT_2__; CG_2  := CG_2__; CT_2  := CT_2__; GT_2  := GT_2__;\n\n\n\nfprintf (stdout, \"\\nGateaux sampling positively selected directions\\n\");\n\nP_1_1 = 2/filteredData_1.sites;\nS_1_3 = 1;\n\nbaseLineLL  = res[1][0];\nLFCompute \t(lf,LF_START_COMPUTE);\nbestDiff \t= -1e100;\nbestAlpha \t= 1;\nbestBeta  \t= 1;\nbestLL\t\t= -1e100;\n\nstep  \t\t= 0.1;\nstep2 \t\t= 0.25;\nv1 \t\t\t= 0.05;\n\nfor (v1c = 0; v1c < 10; v1c = v1c + 1)\n{\n\tv2 = v1+step; \n\tfor (v2c = 0; v2c < 20; v2c = v2c+1)\n\t{\n\t\tcheckASample (\"1_0\");\t\n\t\tv2 = v2 + step2;\n\t}\n\tv1 = v1+step;\n} \n\nS_1_0 = bestAlpha;\nR_1_0 = bestBeta;\nbestAlpha \t= 1;\nbestBeta  \t= 1;\n\nif (bestDiff <= 0)\n{\n\tP_1_1 = 0;\n}\nsaveBD = bestDiff;\n\nP_2_1 = 1/filteredData_2.sites;\nS_2_3 = 1;\n\nv1 \t\t\t= 0.05;\nfor (v1c = 0; v1c < 10; v1c = v1c + 1)\n{\n\tv2 = v1+step; \n\tfor (v2c = 0; v2c < 20; v2c = v2c+1)\n\t{\n\t\tcheckASample (\"2_0\");\t\n\t\tv2 = v2 + step2;\n\t}\n\tv1 = v1+step;\n} \n\nLFCompute (lf,LF_DONE_COMPUTE);\n\nS_2_0 = bestAlpha;\nR_2_0 = bestBeta;\n\nif (bestDiff <= saveBD)\n{\n\tP_2_1 = 0;\n}\n\nif (bestDiff > 0)\n{\n\tfprintf (stdout, \"\\nFound a likelihood improvement in the direction (\", S_1_0, \",\", S_1_0*R_1_0, \"), (\", S_2_0, \",\", S_2_0*R_2_0, \"), \",bestDiff,\" likelihood points\\n\");\n}\n\n\nOptimize (res,lf);\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",1);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",1);\n\nfprintf (stdout,  \"\\n*** Done with pass 2. Log(L) = \", Format(res[1][0],10,3), \" *** \\n\");\nfprintf (stdout,  \"Approximate rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Approximate rates for data set 2:\\n\", d2);\n\n\nfprintf (stdout, \"\\nGateaux sampling neutral directions\\n\");\n\nbaseLineLL  = res[1][0];\nLFCompute \t(lf,LF_START_COMPUTE);\n\nP_1_2 = 1/(filteredData_1.sites*(1-P_1_1));\nbestDiff \t= -1e100;\nbestAlpha \t= 1;\nstep = 0.02;\nv1 = 0;\nfor (v1c = 0; v1c < 50; v1c = v1c + 1)\n{\n\tv1 = v1 + step;\n\tv2 = v1;\n\t\n\tcheckASample (\"1_1\");\n}\t\n\n\nS_1_1 = bestAlpha;\nbestAlpha \t= 1;\n\nif (bestDiff <= 0)\n{\n\tP_1_2 = 0;\n}\nsaveBD = bestDiff;\nR_1_1 := 1;\n\nP_2_2 = 1/(filteredData_2.sites*(1-P_2_1));\n\nv1 = 0;\nfor (v1c = 0; v1c < 50; v1c = v1c + 1)\n{\n\tv1 = v1 + step;\n\tv2 = v1;\n\t\n\tcheckASample (\"2_1\");\n}\t\n\n\nLFCompute (lf,LF_DONE_COMPUTE);\n\nS_2_1 = bestAlpha;\nR_2_1 := 1;\n\nif (bestDiff <= saveBD)\n{\n\tP_2_2 = 0;\n}\n\nif (bestDiff > 0)\n{\n\tfprintf (stdout, \"\\nFound a likelihood improvement in the direction (\", S_1_1, \",\", S_1_1, \"), (\", S_2_1, \",\", S_2_1, \"), \",bestDiff,\" likelihood points\\n\");\n}\n\nOptimize (res,lf);\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",1);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",1);\n\nfprintf (stdout,  \"\\n*** Done with pass 3. Log(L) = \", Format(res[1][0],10,3), \" *** \\n\");\nfprintf (stdout,  \"Approximate rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Approximate rates for data set 2:\\n\", d2);\n\nfprintf (stdout, \"\\nGateaux sampling negative selected directions\\n\");\n\n\nbaseLineLL  = res[1][0];\nLFCompute \t(lf,LF_START_COMPUTE);\nbestDiff \t= -1e100;\nbestAlpha \t= 1;\nbestBeta  \t= 1;\n\n\nstep = 1/16;\nv1 = 0;\nP_1_3 = 2/(filteredData_1.sites*(1-P_1_1)*(1-P_1_2));\nS_1_2 = 1;\nfor (v1c = 0; v1c < 15; v1c = v1c + 1)\n{\n\tv1 = v1+step;\n\tv2 = step/2; \n\tfor (v2c = 0; v2c < v1c; v2c = v2c+1)\n\t{\n\t\tcheckASample (\"1_2\");\t\n\t\tv2 = v2 + step;\n\t}\n} \n\n\nS_1_2 = bestAlpha;\nR_1_2 = bestBeta;\nbestAlpha \t= 1;\nbestBeta  \t= 1;\n\nif (bestDiff <= 0)\n{\n\tP_1_3 = 0;\n}\nsaveBD = bestDiff;\n\n\nv1 = 0;\nP_2_3 = 2/(filteredData_2.sites*(1-P_2_1)*(1-P_2_2));\nS_2_2 = 1;\nfor (v1c = 0; v1c < 15; v1c = v1c + 1)\n{\n\tv1 = v1+step;\n\tv2 = step/2; \n\tfor (v2c = 0; v2c < v1c; v2c = v2c+1)\n\t{\n\t\tcheckASample (\"2_2\");\t\n\t\tv2 = v2 + step;\n\t}\n} \n\nLFCompute (lf,LF_DONE_COMPUTE);\n\nS_2_2 = bestAlpha;\nR_2_2 = bestBeta;\n\nif (bestDiff <= saveBD)\n{\n\tP_2_2 = 0;\n}\n\nif (bestDiff > 0)\n{\n\tfprintf (stdout, \"\\nFound a likelihood improvement in the direction (\", S_1_2, \",\", S_1_2*R_1_2, \"), (\", S_2_2, \",\", S_2_2*R_2_2, \"), \",bestDiff,\" likelihood points\\n\");\n}\n\nAC_1  = AC_1; AT_1  = AT_1; CG_1  = CG_1; CT_1  = CT_1; GT_1  = GT_1;\nAC_2  = AC_2; AT_2  = AT_2; CG_2  = CG_2; CT_2  = CT_2; GT_2  = GT_2;\n\nif (Abs(modelConstraintString_1))\n{\n\tExecuteCommands (modelConstraintString_1);\n}\nif (Abs(modelConstraintString_2))\n{\n\tExecuteCommands (modelConstraintString_2);\n}\n\ncodonFactor_1 = codonFactor_1;\ncodonFactor_2 = codonFactor_2;\n\n\nGetString (paramList, lf, -1);\ndegF = Columns(paramList[\"Global Independent\"]) + 14 - 2*branchLengths + treeBranchParameters; \n\nOPTIMIZATION_PRECISION = sop;\nfprintf (stdout, \"Running an independent distributions model fit (\", degF, \" parameters)...\\n\");\nOptimize (res,lf);\nLogL = res[1][0];\n\nAIC\t = 2*(degF-LogL);\nAICc = 2*(degF*totalCodonCount/(totalCodonCount-degF-1) - LogL);\n\nfprintf (stdout, \"\\n\\nIndependent distributions model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogL, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degF, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AIC,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICc,  15, 5),\"\\n\"\n);\n\nfprintf (sumPath,CLEAR_FILE,\"Independent distributions model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogL, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degF, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AIC,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICc,  15, 5),\"\\n\");\n\t\t\t\t \nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",0);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",0);\n\nfprintf (stdout,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (sumPath, \"Inferred rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Inferred rates for data set 2:\\n\", d2);\nfprintf (sumPath, \"Inferred rates for data set 2:\\n\", d2);\n\nLIKELIHOOD_FUNCTION_OUTPUT = 6;\nfprintf (resToPath,CLEAR_FILE,lf);\n\n\n/*-------------- SHARED POSITIVE SELECTION STRENGTHS  ------------------*/\n\nfor (k=0; k<respP; k=k+1)\n{\n\tExecuteCommands (\"R_1_\"+k+\"=0.5(R_1_\"+k+\"+R_2_\"+k+\");\");\n\tExecuteCommands (\"R_2_\"+k+\":=R_1_\"+k+\";\");\n}\n\nGetString (paramList, lf, -1);\ndegFPSS = Columns(paramList[\"Global Independent\"]) + 14 - 2*branchLengths + treeBranchParameters; \n\t\nfprintf (stdout, \"\\nRunning a shared positive selection strengths model (\",degFPSS,\" parameters)...\\n\");\nOptimize (res_PSS,lf);\nLogLPSS = res_PSS[1][0];\n\nAICPSS\t = 2*(degFPSS-LogLPSS);\nAICcPSS    = 2*(degFPSS*totalCodonCount/(totalCodonCount-degFPSS-1) - LogLPSS);\n\nfprintf (stdout, \"\\n\\nShared positive selection strengths model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSS, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSS, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSS,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSS,  15, 5),\"\\n\"\n);\n\nfprintf (sumPath, \"\\n\\nShared positive strengths regime model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSS, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSS, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSS,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSS,  15, 5),\"\\n\"\n);\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",0);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",0);\n\nfprintf (stdout,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (sumPath, \"Inferred rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Inferred rates for data set 2:\\n\", d2);\nfprintf (sumPath, \"Inferred rates for data set 2:\\n\", d2);\nfpath = resToPath + \".SharedStrength\";\nLIKELIHOOD_FUNCTION_OUTPUT = 6;\nfprintf (fpath,CLEAR_FILE,lf);\n\n/*-------------- SHARED POSITIVE SELECTION PROPORTIONS  ------------------*/\n\n/* RELOAD INDEPENDENT FIT */\nDeleteObject (lf);\nExecuteAFile (resToPath);\n\nfor (k=1; k<=respP; k=k+1)\n{\n\tExecuteCommands (\"P_1_\"+k+\"=0.5(P_1_\"+k+\"+P_2_\"+k+\");\");\n\tExecuteCommands (\"P_2_\"+k+\":=P_1_\"+k+\";\");\n}\n\nGetString (paramList, lf, -1);\ndegFPSP = Columns(paramList[\"Global Independent\"]) + 14 - 2*branchLengths + treeBranchParameters; \nfprintf (stdout, \"\\nRunning a shared positive selection proportions model (\",degFPSP,\" parameters) ...\\n\");\nOptimize (res_PSP,lf);\nLogLPSP = res_PSP[1][0];\n\n\nAICPSP\t = 2*(degFPSP-LogLPSP);\nAICcPSP    = 2*(degFPSP*totalCodonCount/(totalCodonCount-degFPSP-1) - LogLPSP);\n\nfprintf (stdout, \"\\n\\nShared positive selection proportions model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSP, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSP, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSP,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSP,  15, 5),\"\\n\"\n);\n\nfprintf (sumPath, \"\\n\\nShared positive proportions regime model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSP, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSP, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSP,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSP,  15, 5),\"\\n\"\n);\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",0);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",0);\n\nfprintf (stdout,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (sumPath,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Inferred rates for data set 2:\\n\", d2);\nfprintf (sumPath,  \"Inferred rates for data set 2:\\n\", d2);\nfpath = resToPath + \".SharedProportion\";\nLIKELIHOOD_FUNCTION_OUTPUT = 6;\nfprintf (fpath,CLEAR_FILE,lf);\n\n\n/*-------------- SHARED POSITIVE SELECTION REGIME  ------------------*/\n\n/* RELOAD INDEPENDENT FIT */\nDeleteObject (lf);\nExecuteAFile (resToPath);\n\nfor (k=0; k<respP; k=k+1)\n{\n\tExecuteCommands (\"R_1_\"+k+\"=0.5(R_1_\"+k+\"+R_2_\"+k+\");\");\n\tExecuteCommands (\"R_2_\"+k+\":=R_1_\"+k+\";\");\n}\nfor (k=1; k<=respP; k=k+1)\n{\n\tExecuteCommands (\"P_1_\"+k+\"=0.5(P_1_\"+k+\"+P_2_\"+k+\");\");\n\tExecuteCommands (\"P_2_\"+k+\":=P_1_\"+k+\";\");\n}\n\nGetString (paramList, lf, -1);\ndegFPSH = Columns(paramList[\"Global Independent\"]) + 14 - 2*branchLengths + treeBranchParameters; \n\nfprintf (stdout, \"\\nRunning a shared positive selection regime model (\", degFPSH, \" parameters)...\\n\");\nOptimize (res_PSH,lf);\nLogLPSH = res_PSH[1][0];\n\nAICPSH\t = 2*(degFPSH-LogLPSH);\nAICcPSH    = 2*(degFPSH*totalCodonCount/(totalCodonCount-degFPSH-1) - LogLPSH);\n\nfprintf (stdout, \"\\n\\nShared positive selection regime model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSH, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSH, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSH,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSH,  15, 5),\"\\n\"\n);\n\nfprintf (sumPath, \"\\n\\nShared positive selection regime model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSH, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSH, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSH,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSH,  15, 5),\"\\n\"\n);\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",0);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",0);\n\nfprintf (stdout,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (sumPath,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Inferred rates for data set 2:\\n\", d2);\nfprintf (sumPath,  \"Inferred rates for data set 2:\\n\", d2);\nfpath = resToPath + \".SharedPositiveSelection\";\nLIKELIHOOD_FUNCTION_OUTPUT = 6;\nfprintf (fpath,CLEAR_FILE,lf);\n\n/*-------------- SHARED MODEL ------------------*/\n\nDeleteObject (lf);\nExecuteAFile (resToPath);\n\nfor (k=0; k<resp; k=k+1)\n{\n\tExecuteCommands (\"S_1_\"+k+\"=0.5(S_1_\"+k+\"+S_2_\"+k+\");\");\n\tif (k<respP || k>=respP+respN)\n\t{\n\t\tExecuteCommands (\"R_1_\"+k+\"=0.5(R_1_\"+k+\"+R_2_\"+k+\");\");\n\t}\n\tExecuteCommands (\"S_2_\"+k+\":=S_1_\"+k+\";R_2_\"+k+\":=R_1_\"+k+\";\");\n}\nfor (k=1; k<=resp; k=k+1)\n{\n\tExecuteCommands (\"P_1_\"+k+\"=0.5(P_1_\"+k+\"+P_2_\"+k+\");\");\n\tExecuteCommands (\"P_2_\"+k+\":=P_1_\"+k+\";\");\n}\n\nGetString (paramList, lf, -1);\ndegFJ = Columns(paramList[\"Global Independent\"]) + 14 - 2*branchLengths + treeBranchParameters; \nfprintf (stdout, \"\\nRunning a shared distributions model fit (\", degFJ, \" parameters)...\\n\");\n\nOptimize (res_J,lf);\nLogLJ = res_J[1][0];\n\nAICJ\t = 2*(degFJ-LogLJ);\nAICcJ    = 2*(degFJ*totalCodonCount/(totalCodonCount-degFJ-1) - LogLJ);\n\nfprintf (stdout, \"\\n\\nShared distributions model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLJ, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFJ, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICJ,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcJ,  15, 5),\"\\n\"\n);\n\nfprintf (sumPath, \"\\n\\nShared distributions model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLJ, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFJ, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICJ,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcJ,  15, 5),\"\\n\"\n);\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",0);\n\nfprintf (stdout,  \"Inferred joint rates:\\n\", d1);\nfprintf (sumPath, \"Inferred joint rates:\\n\", d1);\n\nfpath = resToPath + \".JointAll\";\nLIKELIHOOD_FUNCTION_OUTPUT = 6;\nfprintf (fpath,CLEAR_FILE,lf);\n\nUSE_LAST_RESULTS \t\t\t= 0;\nSKIP_CONJUGATE_GRADIENT \t= 0;\nLIKELIHOOD_FUNCTION_OUTPUT\t= 2;\n\nfprintf (stdout, \"\\nDistribution comparison tests\\n\",\n\t\t\t\t \"\\n\\tAre the distributions different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLJ),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFJ, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLJ), degF-degFJ),8,3), \"\\n\");\n\nfprintf (stdout, \"\\n\\tAre selective regimes (dN/dS and proportions) different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSH),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSH, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSH), degF-degFPSH),8,3), \"\\n\");\n\nfprintf (stdout, \"\\n\\tAre selection strengths (dN/dS) different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSS),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSS, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSS), degF-degFPSH),8,3), \"\\n\");\n\nfprintf (stdout, \"\\n\\tAre the proportions of codons under selection different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSP),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSP, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSP), degF-degFPSP),8,3), \"\\n\");\n\nfprintf (sumPath, \"\\n\\nDistribution comparison tests\\n\",\n\t\t\t\t \"\\n\\tAre the distributions different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLJ),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFJ, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLJ), degF-degFJ),8,3), \"\\n\");\n\nfprintf (sumPath, \"\\n\\tAre selective regimes (dN/dS and proportions) different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSH),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSH, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSH), degF-degFPSH),8,3), \"\\n\");\n\nfprintf (sumPath, \"\\n\\tAre selection strengths (dN/dS) different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSS),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSS, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSS), degF-degFPSH),8,3), \"\\n\");\n\nfprintf (sumPath, \"\\n\\tAre the proportions of codons under selection different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSP),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSP, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSP), degF-degFPSP),8,3), \"\\n\");\n/*------------------------------------------------------------------------------------------------------------*/\n\nfunction checkASample (whichRate)\n{\n\tExecuteCommands (\"S_\"+whichRate+\"=v1;R_\"+whichRate+\"=v2/v1;\");\n\tLFCompute (lf,res_n);\n\tlocalDiff = res_n-baseLineLL;\n\tif (localDiff > bestDiff)\n\t{\n\t\tbestDiff \t= localDiff;\n\t\tbestAlpha \t= v1;\n\t\tbestBeta  \t= v2/v1;\n\t}\n\treturn 0;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/HyPhy/hyphy_cmds.bf",
    "content": "INTEGRATION_PRECISION_FACTOR = 5.0e-6;\nEND_OF_FILE = 0;\nLIKELIHOOD_FUNCTION_OUTPUT = 5;\nACCEPT_BRANCH_LENGTHS = 1;\n#include \"/home/oashenbe/.local/lib/python2.7/site-packages/phyloExpCM/data//NTsCodonsAAs.ibf\";\nfprintf(stdout, \"Running HYPHY script hyphy_cmds.bf...\\n\");\nDataSet data = ReadDataFile(\"_codenames_Aligned_NPs_Swine.fasta\");\nassert(data.sites % 3 == 0, \"Sequence lengths not multiples of 3\");\ntotalcodons = data.sites $ 3;\nfprintf(stdout, \"Read from _codenames_Aligned_NPs_Swine.fasta a set of \", data.species, \" sequences consisting of \", data.sites, \" nucleotides corresponding to \", totalcodons, \" codons each.\\n\");\nfprintf(stdout, \"The analysis will include the following 498 codon positions (sequential numbering starting with 1):\\n1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498\\n\");\nassert(totalcodons >= 498, \"Largest included site exceeds sequence length\");\nDataSetFilter codonfilter = CreateFilter(data, 3, \"0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493\", \"\", \"TAA,TAG,TGA\");\nassert(data.species == codonfilter.species, \"species number mismatch\");\nassert(codonfilter.sites == 498, \"Codon filtered data does not contain the right number of sites\");\nfprintf(stdout, \"Created a codon filter of \", codonfilter.sites, \" sites.\\n\");\nassert(totalcodons - (totalcodons - 498) - 0 == codonfilter.sites, \"Codon filtered data is not the expected length. Do sequences contain stop codons?\");\nCheckCodonFilter(\"codonfilter\");\nfprintf(stdout, \"Reading tree string from _codenames_codonphyml_Swine_tree.newick.\\n\");\nfscanf(\"_codenames_codonphyml_Swine_tree.newick\", String, treestring);\nfprintf(stdout, \"Using the Goldman Yang 1994 (GY94) codon model...\\n\");\n#include \"/home/oashenbe/.local/lib/python2.7/site-packages/phyloExpCM/data//CF3x4.ibf\";\n#include \"/home/oashenbe/.local/lib/python2.7/site-packages/phyloExpCM/data//GY94.ibf\";\nCreateGY94Model(\"CF3x4\", \"global\", \"global\", 4, 4, 1);\nUseModel(model);\nExecuteCommands(\"Tree tree = treestring;\")\nassert(codonfilter.species == TipCount(tree), \"Number of species and number of tips differ\");\nLikelihoodFunction likelihood = (codonfilter, tree);\nfprintf(stdout, \"\\nNow optimizing the likelihood function...\\n\");\nOptimize(mlestimates, likelihood)\nfprintf(stdout, \"Completed likelihood optimization. Optimized \", mlestimates[1][1], \" indpendent parameters and \", mlestimates[1][2], \" shared parameters to obtain a log likelihood of \", mlestimates[1][0], \".\\n\");\nfprintf(stdout, \"Writing the results to hyphy_output.txt.\\n\");\nfprintf(\"hyphy_output.txt\", \"Log likelihood: \", mlestimates[1][0], \"\\nindependent parameters (includes branch lengths): \", mlestimates[1][1], \"\\nshared parameters: \", mlestimates[1][2], \"\\nnumber of branch lengths: \", TipCount(tree) + BranchCount(tree), \"\\nnumber of tip nodes: \", TipCount(tree), \"\\nnumber of internal branches: \", BranchCount(tree), \"\\n\",likelihood);\nfprintf(stdout, \"\\nNow computing per-site likelihoods.\\n\");\nfprintf(stdout, \"\\nFirst fixing all global variables to the maximum-likelihood values estimated on the entire tree.\\n\");\nGetString(associativearray, likelihood, -1);\nglobalindependentvariables = associativearray[\"Global Independent\"];\nfor (ivariable=0; ivariable<Columns(globalindependentvariables); ivariable=ivariable+1) {\n  variable = globalindependentvariables[ivariable];\n  cmdstring = variable + \" := \" + Format(variable, 0, 30) + \";\";\n  fprintf(stdout, \"\\nFixing variable as follows: \", cmdstring, \"\\n\");\n  ExecuteCommands(cmdstring);\n}\npersitelikelihoods = \"sitelikelihoods.txt\";\nfprintf(stdout, \"\\nNow computing per-site likelihoods and writing to \", persitelikelihoods, \"...\\n\");\nfprintf(persitelikelihoods, \"#SITE\\tSITE_LOG_LIKELIHOODS\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 1...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"0,1,2\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 1\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"1\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 2...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"3,4,5\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 2\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"2\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 3...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"6,7,8\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 3\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"3\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 4...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"9,10,11\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 4\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"4\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 5...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"12,13,14\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 5\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"5\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 6...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"15,16,17\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 6\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"6\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 7...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"18,19,20\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 7\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"7\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 8...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"21,22,23\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 8\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"8\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 9...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"24,25,26\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 9\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"9\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 10...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"27,28,29\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 10\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"10\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 11...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"30,31,32\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 11\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"11\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 12...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"33,34,35\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 12\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"12\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 13...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"36,37,38\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 13\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"13\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 14...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"39,40,41\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 14\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"14\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 15...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"42,43,44\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 15\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"15\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 16...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"45,46,47\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 16\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"16\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 17...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"48,49,50\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 17\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"17\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 18...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"51,52,53\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 18\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"18\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 19...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"54,55,56\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 19\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"19\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 20...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"57,58,59\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 20\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"20\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 21...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"60,61,62\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 21\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"21\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 22...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"63,64,65\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 22\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"22\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 23...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"66,67,68\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 23\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"23\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 24...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"69,70,71\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 24\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"24\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 25...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"72,73,74\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 25\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"25\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 26...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"75,76,77\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 26\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"26\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 27...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"78,79,80\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 27\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"27\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 28...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"81,82,83\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 28\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"28\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 29...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"84,85,86\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 29\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"29\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 30...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"87,88,89\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 30\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"30\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 31...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"90,91,92\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 31\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"31\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 32...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"93,94,95\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 32\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"32\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 33...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"96,97,98\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 33\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"33\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 34...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"99,100,101\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 34\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"34\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 35...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"102,103,104\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 35\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"35\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 36...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"105,106,107\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 36\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"36\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 37...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"108,109,110\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 37\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"37\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 38...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"111,112,113\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 38\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"38\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 39...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"114,115,116\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 39\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"39\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 40...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"117,118,119\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 40\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"40\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 41...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"120,121,122\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 41\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"41\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 42...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"123,124,125\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 42\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"42\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 43...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"126,127,128\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 43\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"43\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 44...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"129,130,131\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 44\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"44\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 45...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"132,133,134\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 45\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"45\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 46...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"135,136,137\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 46\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"46\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 47...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"138,139,140\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 47\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"47\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 48...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"141,142,143\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 48\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"48\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 49...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"144,145,146\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 49\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"49\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 50...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"147,148,149\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 50\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"50\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 51...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"150,151,152\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 51\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"51\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 52...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"153,154,155\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 52\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"52\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 53...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"156,157,158\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 53\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"53\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 54...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"159,160,161\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 54\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"54\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 55...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"162,163,164\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 55\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"55\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 56...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"165,166,167\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 56\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"56\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 57...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"168,169,170\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 57\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"57\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 58...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"171,172,173\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 58\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"58\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 59...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"174,175,176\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 59\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"59\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 60...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"177,178,179\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 60\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"60\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 61...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"180,181,182\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 61\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"61\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 62...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"183,184,185\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 62\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"62\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 63...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"186,187,188\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 63\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"63\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 64...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"189,190,191\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 64\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"64\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 65...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"192,193,194\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 65\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"65\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 66...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"195,196,197\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 66\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"66\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 67...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"198,199,200\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 67\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"67\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 68...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"201,202,203\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 68\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"68\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 69...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"204,205,206\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 69\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"69\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 70...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"207,208,209\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 70\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"70\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 71...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"210,211,212\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 71\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"71\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 72...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"213,214,215\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 72\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"72\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 73...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"216,217,218\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 73\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"73\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 74...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"219,220,221\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 74\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"74\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 75...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"222,223,224\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 75\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"75\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 76...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"225,226,227\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 76\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"76\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 77...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"228,229,230\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 77\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"77\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 78...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"231,232,233\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 78\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"78\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 79...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"234,235,236\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 79\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"79\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 80...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"237,238,239\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 80\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"80\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 81...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"240,241,242\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 81\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"81\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 82...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"243,244,245\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 82\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"82\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 83...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"246,247,248\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 83\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"83\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 84...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"249,250,251\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 84\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"84\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 85...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"252,253,254\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 85\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"85\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 86...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"255,256,257\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 86\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"86\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 87...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"258,259,260\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 87\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"87\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 88...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"261,262,263\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 88\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"88\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 89...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"264,265,266\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 89\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"89\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 90...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"267,268,269\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 90\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"90\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 91...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"270,271,272\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 91\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"91\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 92...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"273,274,275\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 92\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"92\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 93...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"276,277,278\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 93\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"93\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 94...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"279,280,281\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 94\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"94\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 95...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"282,283,284\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 95\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"95\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 96...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"285,286,287\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 96\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"96\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 97...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"288,289,290\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 97\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"97\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 98...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"291,292,293\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 98\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"98\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 99...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"294,295,296\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 99\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"99\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 100...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"297,298,299\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 100\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"100\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 101...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"300,301,302\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 101\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"101\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 102...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"303,304,305\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 102\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"102\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 103...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"306,307,308\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 103\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"103\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 104...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"309,310,311\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 104\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"104\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 105...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"312,313,314\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 105\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"105\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 106...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"315,316,317\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 106\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"106\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 107...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"318,319,320\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 107\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"107\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 108...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"321,322,323\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 108\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"108\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 109...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"324,325,326\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 109\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"109\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 110...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"327,328,329\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 110\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"110\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 111...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"330,331,332\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 111\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"111\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 112...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"333,334,335\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 112\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"112\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 113...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"336,337,338\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 113\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"113\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 114...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"339,340,341\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 114\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"114\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 115...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"342,343,344\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 115\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"115\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 116...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"345,346,347\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 116\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"116\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 117...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"348,349,350\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 117\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"117\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 118...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"351,352,353\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 118\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"118\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 119...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"354,355,356\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 119\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"119\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 120...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"357,358,359\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 120\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"120\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 121...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"360,361,362\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 121\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"121\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 122...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"363,364,365\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 122\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"122\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 123...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"366,367,368\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 123\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"123\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 124...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"369,370,371\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 124\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"124\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 125...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"372,373,374\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 125\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"125\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 126...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"375,376,377\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 126\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"126\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 127...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"378,379,380\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 127\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"127\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 128...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"381,382,383\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 128\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"128\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 129...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"384,385,386\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 129\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"129\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 130...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"387,388,389\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 130\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"130\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 131...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"390,391,392\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 131\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"131\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 132...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"393,394,395\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 132\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"132\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 133...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"396,397,398\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 133\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"133\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 134...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"399,400,401\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 134\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"134\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 135...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"402,403,404\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 135\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"135\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 136...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"405,406,407\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 136\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"136\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 137...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"408,409,410\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 137\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"137\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 138...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"411,412,413\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 138\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"138\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 139...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"414,415,416\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 139\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"139\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 140...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"417,418,419\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 140\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"140\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 141...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"420,421,422\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 141\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"141\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 142...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"423,424,425\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 142\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"142\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 143...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"426,427,428\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 143\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"143\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 144...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"429,430,431\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 144\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"144\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 145...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"432,433,434\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 145\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"145\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 146...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"435,436,437\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 146\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"146\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 147...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"438,439,440\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 147\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"147\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 148...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"441,442,443\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 148\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"148\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 149...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"444,445,446\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 149\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"149\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 150...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"447,448,449\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 150\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"150\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 151...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"450,451,452\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 151\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"151\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 152...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"453,454,455\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 152\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"152\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 153...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"456,457,458\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 153\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"153\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 154...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"459,460,461\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 154\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"154\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 155...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"462,463,464\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 155\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"155\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 156...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"465,466,467\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 156\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"156\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 157...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"468,469,470\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 157\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"157\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 158...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"471,472,473\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 158\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"158\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 159...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"474,475,476\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 159\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"159\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 160...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"477,478,479\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 160\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"160\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 161...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"480,481,482\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 161\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"161\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 162...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"483,484,485\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 162\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"162\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 163...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"486,487,488\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 163\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"163\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 164...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"489,490,491\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 164\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"164\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 165...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"492,493,494\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 165\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"165\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 166...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"495,496,497\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 166\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"166\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 167...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"498,499,500\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 167\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"167\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 168...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"501,502,503\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 168\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"168\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 169...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"504,505,506\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 169\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"169\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 170...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"507,508,509\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 170\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"170\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 171...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"510,511,512\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 171\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"171\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 172...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"513,514,515\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 172\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"172\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 173...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"516,517,518\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 173\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"173\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 174...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"519,520,521\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 174\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"174\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 175...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"522,523,524\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 175\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"175\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 176...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"525,526,527\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 176\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"176\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 177...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"528,529,530\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 177\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"177\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 178...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"531,532,533\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 178\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"178\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 179...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"534,535,536\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 179\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"179\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 180...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"537,538,539\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 180\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"180\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 181...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"540,541,542\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 181\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"181\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 182...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"543,544,545\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 182\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"182\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 183...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"546,547,548\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 183\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"183\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 184...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"549,550,551\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 184\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"184\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 185...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"552,553,554\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 185\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"185\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 186...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"555,556,557\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 186\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"186\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 187...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"558,559,560\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 187\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"187\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 188...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"561,562,563\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 188\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"188\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 189...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"564,565,566\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 189\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"189\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 190...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"567,568,569\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 190\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"190\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 191...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"570,571,572\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 191\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"191\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 192...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"573,574,575\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 192\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"192\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 193...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"576,577,578\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 193\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"193\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 194...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"579,580,581\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 194\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"194\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 195...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"582,583,584\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 195\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"195\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 196...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"585,586,587\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 196\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"196\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 197...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"588,589,590\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 197\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"197\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 198...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"591,592,593\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 198\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"198\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 199...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"594,595,596\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 199\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"199\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 200...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"597,598,599\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 200\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"200\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 201...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"600,601,602\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 201\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"201\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 202...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"603,604,605\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 202\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"202\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 203...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"606,607,608\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 203\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"203\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 204...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"609,610,611\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 204\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"204\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 205...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"612,613,614\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 205\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"205\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 206...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"615,616,617\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 206\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"206\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 207...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"618,619,620\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 207\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"207\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 208...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"621,622,623\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 208\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"208\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 209...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"624,625,626\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 209\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"209\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 210...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"627,628,629\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 210\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"210\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 211...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"630,631,632\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 211\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"211\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 212...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"633,634,635\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 212\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"212\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 213...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"636,637,638\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 213\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"213\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 214...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"639,640,641\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 214\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"214\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 215...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"642,643,644\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 215\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"215\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 216...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"645,646,647\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 216\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"216\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 217...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"648,649,650\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 217\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"217\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 218...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"651,652,653\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 218\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"218\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 219...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"654,655,656\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 219\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"219\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 220...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"657,658,659\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 220\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"220\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 221...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"660,661,662\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 221\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"221\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 222...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"663,664,665\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 222\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"222\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 223...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"666,667,668\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 223\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"223\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 224...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"669,670,671\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 224\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"224\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 225...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"672,673,674\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 225\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"225\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 226...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"675,676,677\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 226\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"226\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 227...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"678,679,680\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 227\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"227\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 228...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"681,682,683\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 228\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"228\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 229...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"684,685,686\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 229\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"229\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 230...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"687,688,689\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 230\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"230\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 231...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"690,691,692\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 231\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"231\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 232...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"693,694,695\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 232\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"232\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 233...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"696,697,698\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 233\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"233\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 234...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"699,700,701\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 234\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"234\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 235...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"702,703,704\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 235\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"235\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 236...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"705,706,707\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 236\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"236\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 237...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"708,709,710\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 237\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"237\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 238...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"711,712,713\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 238\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"238\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 239...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"714,715,716\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 239\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"239\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 240...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"717,718,719\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 240\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"240\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 241...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"720,721,722\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 241\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"241\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 242...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"723,724,725\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 242\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"242\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 243...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"726,727,728\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 243\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"243\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 244...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"729,730,731\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 244\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"244\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 245...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"732,733,734\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 245\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"245\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 246...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"735,736,737\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 246\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"246\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 247...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"738,739,740\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 247\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"247\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 248...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"741,742,743\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 248\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"248\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 249...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"744,745,746\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 249\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"249\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 250...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"747,748,749\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 250\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"250\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 251...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"750,751,752\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 251\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"251\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 252...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"753,754,755\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 252\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"252\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 253...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"756,757,758\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 253\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"253\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 254...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"759,760,761\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 254\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"254\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 255...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"762,763,764\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 255\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"255\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 256...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"765,766,767\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 256\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"256\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 257...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"768,769,770\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 257\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"257\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 258...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"771,772,773\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 258\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"258\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 259...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"774,775,776\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 259\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"259\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 260...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"777,778,779\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 260\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"260\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 261...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"780,781,782\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 261\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"261\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 262...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"783,784,785\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 262\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"262\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 263...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"786,787,788\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 263\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"263\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 264...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"789,790,791\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 264\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"264\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 265...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"792,793,794\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 265\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"265\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 266...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"795,796,797\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 266\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"266\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 267...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"798,799,800\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 267\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"267\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 268...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"801,802,803\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 268\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"268\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 269...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"804,805,806\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 269\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"269\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 270...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"807,808,809\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 270\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"270\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 271...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"810,811,812\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 271\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"271\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 272...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"813,814,815\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 272\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"272\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 273...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"816,817,818\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 273\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"273\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 274...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"819,820,821\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 274\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"274\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 275...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"822,823,824\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 275\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"275\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 276...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"825,826,827\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 276\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"276\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 277...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"828,829,830\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 277\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"277\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 278...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"831,832,833\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 278\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"278\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 279...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"834,835,836\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 279\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"279\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 280...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"837,838,839\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 280\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"280\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 281...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"840,841,842\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 281\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"281\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 282...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"843,844,845\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 282\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"282\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 283...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"846,847,848\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 283\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"283\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 284...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"849,850,851\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 284\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"284\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 285...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"852,853,854\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 285\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"285\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 286...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"855,856,857\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 286\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"286\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 287...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"858,859,860\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 287\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"287\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 288...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"861,862,863\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 288\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"288\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 289...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"864,865,866\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 289\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"289\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 290...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"867,868,869\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 290\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"290\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 291...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"870,871,872\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 291\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"291\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 292...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"873,874,875\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 292\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"292\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 293...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"876,877,878\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 293\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"293\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 294...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"879,880,881\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 294\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"294\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 295...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"882,883,884\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 295\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"295\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 296...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"885,886,887\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 296\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"296\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 297...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"888,889,890\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 297\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"297\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 298...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"891,892,893\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 298\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"298\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 299...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"894,895,896\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 299\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"299\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 300...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"897,898,899\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 300\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"300\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 301...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"900,901,902\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 301\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"301\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 302...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"903,904,905\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 302\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"302\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 303...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"906,907,908\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 303\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"303\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 304...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"909,910,911\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 304\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"304\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 305...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"912,913,914\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 305\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"305\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 306...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"915,916,917\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 306\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"306\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 307...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"918,919,920\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 307\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"307\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 308...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"921,922,923\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 308\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"308\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 309...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"924,925,926\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 309\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"309\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 310...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"927,928,929\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 310\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"310\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 311...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"930,931,932\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 311\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"311\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 312...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"933,934,935\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 312\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"312\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 313...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"936,937,938\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 313\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"313\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 314...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"939,940,941\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 314\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"314\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 315...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"942,943,944\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 315\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"315\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 316...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"945,946,947\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 316\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"316\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 317...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"948,949,950\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 317\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"317\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 318...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"951,952,953\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 318\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"318\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 319...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"954,955,956\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 319\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"319\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 320...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"957,958,959\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 320\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"320\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 321...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"960,961,962\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 321\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"321\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 322...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"963,964,965\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 322\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"322\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 323...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"966,967,968\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 323\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"323\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 324...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"969,970,971\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 324\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"324\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 325...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"972,973,974\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 325\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"325\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 326...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"975,976,977\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 326\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"326\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 327...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"978,979,980\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 327\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"327\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 328...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"981,982,983\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 328\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"328\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 329...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"984,985,986\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 329\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"329\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 330...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"987,988,989\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 330\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"330\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 331...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"990,991,992\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 331\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"331\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 332...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"993,994,995\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 332\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"332\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 333...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"996,997,998\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 333\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"333\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 334...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"999,1000,1001\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 334\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"334\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 335...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1002,1003,1004\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 335\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"335\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 336...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1005,1006,1007\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 336\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"336\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 337...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1008,1009,1010\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 337\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"337\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 338...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1011,1012,1013\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 338\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"338\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 339...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1014,1015,1016\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 339\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"339\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 340...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1017,1018,1019\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 340\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"340\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 341...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1020,1021,1022\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 341\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"341\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 342...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1023,1024,1025\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 342\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"342\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 343...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1026,1027,1028\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 343\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"343\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 344...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1029,1030,1031\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 344\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"344\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 345...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1032,1033,1034\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 345\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"345\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 346...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1035,1036,1037\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 346\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"346\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 347...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1038,1039,1040\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 347\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"347\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 348...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1041,1042,1043\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 348\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"348\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 349...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1044,1045,1046\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 349\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"349\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 350...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1047,1048,1049\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 350\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"350\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 351...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1050,1051,1052\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 351\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"351\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 352...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1053,1054,1055\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 352\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"352\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 353...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1056,1057,1058\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 353\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"353\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 354...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1059,1060,1061\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 354\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"354\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 355...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1062,1063,1064\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 355\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"355\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 356...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1065,1066,1067\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 356\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"356\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 357...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1068,1069,1070\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 357\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"357\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 358...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1071,1072,1073\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 358\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"358\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 359...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1074,1075,1076\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 359\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"359\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 360...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1077,1078,1079\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 360\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"360\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 361...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1080,1081,1082\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 361\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"361\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 362...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1083,1084,1085\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 362\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"362\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 363...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1086,1087,1088\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 363\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"363\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 364...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1089,1090,1091\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 364\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"364\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 365...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1092,1093,1094\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 365\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"365\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 366...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1095,1096,1097\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 366\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"366\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 367...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1098,1099,1100\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 367\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"367\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 368...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1101,1102,1103\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 368\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"368\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 369...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1104,1105,1106\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 369\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"369\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 370...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1107,1108,1109\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 370\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"370\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 371...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1110,1111,1112\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 371\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"371\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 372...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1113,1114,1115\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 372\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"372\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 373...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1116,1117,1118\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 373\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"373\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 374...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1119,1120,1121\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 374\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"374\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 375...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1122,1123,1124\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 375\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"375\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 376...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1125,1126,1127\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 376\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"376\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 377...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1128,1129,1130\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 377\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"377\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 378...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1131,1132,1133\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 378\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"378\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 379...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1134,1135,1136\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 379\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"379\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 380...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1137,1138,1139\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 380\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"380\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 381...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1140,1141,1142\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 381\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"381\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 382...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1143,1144,1145\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 382\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"382\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 383...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1146,1147,1148\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 383\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"383\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 384...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1149,1150,1151\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 384\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"384\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 385...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1152,1153,1154\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 385\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"385\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 386...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1155,1156,1157\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 386\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"386\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 387...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1158,1159,1160\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 387\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"387\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 388...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1161,1162,1163\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 388\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"388\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 389...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1164,1165,1166\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 389\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"389\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 390...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1167,1168,1169\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 390\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"390\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 391...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1170,1171,1172\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 391\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"391\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 392...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1173,1174,1175\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 392\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"392\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 393...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1176,1177,1178\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 393\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"393\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 394...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1179,1180,1181\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 394\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"394\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 395...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1182,1183,1184\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 395\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"395\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 396...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1185,1186,1187\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 396\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"396\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 397...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1188,1189,1190\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 397\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"397\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 398...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1191,1192,1193\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 398\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"398\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 399...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1194,1195,1196\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 399\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"399\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 400...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1197,1198,1199\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 400\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"400\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 401...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1200,1201,1202\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 401\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"401\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 402...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1203,1204,1205\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 402\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"402\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 403...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1206,1207,1208\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 403\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"403\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 404...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1209,1210,1211\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 404\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"404\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 405...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1212,1213,1214\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 405\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"405\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 406...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1215,1216,1217\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 406\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"406\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 407...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1218,1219,1220\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 407\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"407\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 408...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1221,1222,1223\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 408\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"408\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 409...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1224,1225,1226\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 409\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"409\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 410...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1227,1228,1229\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 410\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"410\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 411...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1230,1231,1232\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 411\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"411\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 412...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1233,1234,1235\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 412\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"412\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 413...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1236,1237,1238\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 413\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"413\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 414...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1239,1240,1241\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 414\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"414\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 415...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1242,1243,1244\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 415\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"415\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 416...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1245,1246,1247\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 416\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"416\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 417...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1248,1249,1250\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 417\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"417\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 418...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1251,1252,1253\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 418\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"418\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 419...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1254,1255,1256\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 419\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"419\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 420...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1257,1258,1259\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 420\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"420\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 421...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1260,1261,1262\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 421\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"421\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 422...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1263,1264,1265\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 422\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"422\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 423...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1266,1267,1268\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 423\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"423\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 424...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1269,1270,1271\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 424\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"424\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 425...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1272,1273,1274\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 425\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"425\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 426...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1275,1276,1277\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 426\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"426\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 427...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1278,1279,1280\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 427\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"427\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 428...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1281,1282,1283\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 428\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"428\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 429...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1284,1285,1286\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 429\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"429\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 430...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1287,1288,1289\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 430\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"430\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 431...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1290,1291,1292\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 431\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"431\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 432...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1293,1294,1295\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 432\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"432\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 433...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1296,1297,1298\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 433\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"433\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 434...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1299,1300,1301\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 434\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"434\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 435...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1302,1303,1304\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 435\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"435\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 436...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1305,1306,1307\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 436\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"436\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 437...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1308,1309,1310\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 437\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"437\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 438...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1311,1312,1313\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 438\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"438\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 439...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1314,1315,1316\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 439\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"439\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 440...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1317,1318,1319\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 440\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"440\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 441...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1320,1321,1322\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 441\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"441\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 442...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1323,1324,1325\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 442\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"442\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 443...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1326,1327,1328\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 443\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"443\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 444...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1329,1330,1331\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 444\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"444\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 445...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1332,1333,1334\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 445\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"445\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 446...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1335,1336,1337\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 446\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"446\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 447...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1338,1339,1340\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 447\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"447\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 448...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1341,1342,1343\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 448\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"448\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 449...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1344,1345,1346\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 449\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"449\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 450...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1347,1348,1349\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 450\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"450\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 451...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1350,1351,1352\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 451\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"451\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 452...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1353,1354,1355\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 452\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"452\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 453...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1356,1357,1358\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 453\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"453\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 454...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1359,1360,1361\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 454\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"454\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 455...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1362,1363,1364\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 455\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"455\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 456...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1365,1366,1367\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 456\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"456\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 457...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1368,1369,1370\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 457\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"457\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 458...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1371,1372,1373\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 458\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"458\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 459...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1374,1375,1376\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 459\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"459\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 460...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1377,1378,1379\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 460\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"460\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 461...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1380,1381,1382\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 461\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"461\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 462...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1383,1384,1385\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 462\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"462\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 463...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1386,1387,1388\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 463\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"463\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 464...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1389,1390,1391\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 464\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"464\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 465...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1392,1393,1394\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 465\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"465\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 466...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1395,1396,1397\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 466\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"466\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 467...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1398,1399,1400\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 467\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"467\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 468...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1401,1402,1403\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 468\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"468\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 469...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1404,1405,1406\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 469\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"469\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 470...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1407,1408,1409\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 470\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"470\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 471...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1410,1411,1412\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 471\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"471\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 472...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1413,1414,1415\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 472\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"472\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 473...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1416,1417,1418\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 473\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"473\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 474...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1419,1420,1421\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 474\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"474\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 475...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1422,1423,1424\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 475\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"475\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 476...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1425,1426,1427\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 476\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"476\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 477...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1428,1429,1430\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 477\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"477\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 478...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1431,1432,1433\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 478\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"478\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 479...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1434,1435,1436\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 479\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"479\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 480...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1437,1438,1439\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 480\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"480\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 481...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1440,1441,1442\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 481\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"481\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 482...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1443,1444,1445\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 482\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"482\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 483...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1446,1447,1448\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 483\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"483\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 484...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1449,1450,1451\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 484\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"484\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 485...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1452,1453,1454\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 485\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"485\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 486...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1455,1456,1457\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 486\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"486\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 487...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1458,1459,1460\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 487\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"487\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 488...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1461,1462,1463\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 488\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"488\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 489...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1464,1465,1466\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 489\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"489\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 490...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1467,1468,1469\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 490\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"490\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 491...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1470,1471,1472\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 491\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"491\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 492...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1473,1474,1475\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 492\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"492\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 493...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1476,1477,1478\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 493\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"493\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 494...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1479,1480,1481\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 494\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"494\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 495...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1482,1483,1484\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 495\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"495\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 496...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1485,1486,1487\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 496\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"496\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 497...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1488,1489,1490\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 497\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"497\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 498...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1491,1492,1493\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 498\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"498\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"Completed HYPHY script hyphy_cmds.bf.\\n\");"
  },
  {
    "path": "src/test/resources/samples/langs/HyPhy/profile_test.bf",
    "content": "#profile START;\r\rs = 0;\rm = {5,1};\r\rfor (k=0; k<250000; k=k+1)\r{\r\ts = s + k;\r\tt = Random (0,5);\r\tm [t] = m [t] + 1;\r}\r\r#profile PAUSE;\r\rs2 = 0;\rfor (k=1; k<10000; k=k+1)\r{\r\ts2 = s2+1/k;\r}\r\r#profile _hyphy_profile_dump;\r\rstats  \t\t\t= _hyphy_profile_dump[\"STATS\"];\r_profile_summer\t= {1,Rows(stats)};\r_profile_summer = _profile_summer[\"1\"] * stats;\r_instructions   = _hyphy_profile_dump[\"INSTRUCTION\"];\r_indices\t    = _hyphy_profile_dump[\"INSTRUCTION INDEX\"];\r\rfprintf (stdout, \"\\nTotal run time (seconds)      : \", Format(_profile_summer[1]/1000000,15,6),\r\t\t\t\t \"\\nTotal number of steps         : \", Format(_profile_summer[0],15,0), \"\\n\\n\");\r\t\t\t\t \rfor (k=0; k<Columns(_instructions); k=k+1)\r{\r\tfprintf (stdout, Format (_indices[k],6,0), \" : \", _instructions[k], \"\\n\\tCall count: \", stats[k][0], \r\t\t\t\t\t\t\t\t\t\t\t\t   \"\\n\\tTime (seconds): \", stats[k][1]/1000000, \"\\n\");\r}"
  },
  {
    "path": "src/test/resources/samples/langs/IDL/mg_acosh.pro",
    "content": "; docformat = 'rst'\n\n;+\n; Inverse hyperbolic cosine. Uses the formula:\n; \n; $$\\text{acosh}(z) = \\ln(z + \\sqrt{z + 1} \\sqrt{z - 1})$$\n;\n; :Examples:\n;    The arc hyperbolic sine function looks like::\n;\n;       IDL> x = 2.5 * findgen(1000) / 999. + 1.\n;       IDL> plot, x, mg_acosh(x), xstyle=1\n;\n;    This should look like:\n;\n;    .. image:: acosh.png\n;\n; :Returns:\n;    float, double, complex, or double complex depending on the input\n;\n; :Params:\n;    z : in, required, type=numeric\n;       input\n;-\nfunction mg_acosh, z\n  compile_opt strictarr\n  \n  return, alog(z + sqrt(z + 1) * sqrt(z - 1))\nend"
  },
  {
    "path": "src/test/resources/samples/langs/IDL/mg_analysis.dlm",
    "content": "MODULE mg_analysis\nDESCRIPTION Tools for analysis\nVERSION 1.0\nSOURCE mgalloy\nBUILD_DATE January 18, 2011\n\nFUNCTION MG_ARRAY_EQUAL      2 2 KEYWORDS\nFUNCTION MG_TOTAL            1 1\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/IDL/mg_gcd.pro",
    "content": "; docformat = 'rst'\n\n;+\n; Find the greatest common denominator (GCD) for two positive integers.\n; \n; :Returns:\n;    integer\n;\n; :Params:\n;    a : in, required, type=integer\n;       first integer\n;    b : in, required, type=integer\n;       second integer\n;-\nfunction mg_gcd, a, b\n  compile_opt strictarr\n  on_error, 2\n  \n  if (n_params() ne 2) then message, 'incorrect number of arguments'\n  if (~mg_isinteger(a) || ~mg_isinteger(b)) then begin\n    message, 'integer arguments required'\n  endif\n  \n  _a = abs(a)\n  _b = abs(b)\n  minArg = _a < _b\n  maxArg = _a > _b\n  \n  if (minArg eq 0) then return, maxArg\n  \n  remainder = maxArg mod minArg\n  if (remainder eq 0) then return, minArg\n  \n  return, mg_gcd(minArg, remainder)\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/IDL/mg_trunc.pro",
    "content": "; docformat = 'rst'\n\n;+\n; Truncate argument towards 0.0, i.e., takes the `FLOOR` of positive values\n; and the `CEIL` of negative values.\n;\n; :Examples:\n;   Try the main-level program at the end of this file. It does::\n;\n;      IDL> print, mg_trunc([1.2, -1.2, 0.0])\n;                 1          -1           0\n;      IDL> print, floor([1.2, -1.2, 0.0])\n;                 1          -2           0\n;      IDL> print, ceil([1.2, -1.2, 0.0])\n;                 2          -1           0\n;\n; :Returns:\n;    array of same type as argument\n;\n; :Params:\n;    x : in, required, type=float/double\n;       array containing values to truncate\n;-\nfunction mg_trunc, x\n  compile_opt strictarr\n  \n  result = ceil(x)\n  posInd = where(x gt 0, nposInd)\n  \n  if (nposInd gt 0L) then begin\n    result[posInd] = floor(x[posInd])\n  endif\n  \n  return, result\nend\n\n\n; main-level example program\n\nprint, mg_trunc([1.2, -1.2, 0.0])\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/IGOR Pro/functions.ipf",
    "content": "#pragma rtGlobals=3\n\nFunction FooBar()\n\treturn 0\nEnd\n\nFunction FooBarSubType() : ButtonControl\n\treturn 0\nEnd\n\nFunction/D FooBarVar()\n\treturn 0\nEnd\n\nstatic Function FooBarStatic()\n\treturn 0\nEnd\n\nthreadsafe static Function FooBarStaticThreadsafe()\n\treturn 0\nEnd\n\nthreadsafe Function FooBarThread()\n\treturn 0\nEnd\n\nFunction CallOperationsAndBuiltInFuncs(string var)\n\n\tstring someDQString = \"abcd\"\n\n\tMake/N=(1,2,3,4) myWave\n\tRedimension/N=(-1,-1,-1,5) myWave\n\n\tprint strlen(someDQString)\n\n\treturn 0\nEnd\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/IGOR Pro/generic.ipf",
    "content": "#pragma rtGlobals=3\n\nStrConstant myConstString=\"abcd\"\n// some comment\nconstant myConst=123\n\nStructure struct1\n\tstring str\n\tvariable var\nEndStructure\n\nstatic Structure struct2\n\tstring str\n\tvariable var\nEndStructure\n\n#include \"someFile\"\n\n#ifdef NOT_DEFINED\n\t// conditional compilation\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/INI/MouseKeyboard.pro",
    "content": "update=Sun 15 Feb 2015 01:10:10 PM EST\nlast_client=eeschema\n[pcbnew]\nversion=1\nPageLayoutDescrFile=\nLastNetListRead=\nUseCmpFile=1\nPadDrill=0.6\nPadDrillOvalY=0.6\nPadSizeH=1.5\nPadSizeV=1.5\nPcbTextSizeV=1.5\nPcbTextSizeH=1.5\nPcbTextThickness=0.3\nModuleTextSizeV=1\nModuleTextSizeH=1\nModuleTextSizeThickness=0.15\nSolderMaskClearance=0\nSolderMaskMinWidth=0\nDrawSegmentWidth=0.2\nBoardOutlineThickness=0.09999999999999999\nModuleOutlineThickness=0.15\n[pcbnew/libraries]\nLibDir=\n[general]\nversion=1\n[eeschema]\nversion=1\nPageLayoutDescrFile=\nSubpartIdSeparator=0\nSubpartFirstId=65\nLibDir=/home/hschmale/KiCad/LibMods-3rdParty\nNetFmtName=\nRptD_X=0\nRptD_Y=100\nRptLab=1\nLabSize=60\n[eeschema/libraries]\nLibName1=power\nLibName2=device\nLibName3=transistors\nLibName4=conn\nLibName5=linear\nLibName6=regul\nLibName7=74xx\nLibName8=cmos4000\nLibName9=adc-dac\nLibName10=memory\nLibName11=xilinx\nLibName12=special\nLibName13=microcontrollers\nLibName14=dsp\nLibName15=microchip\nLibName16=analog_switches\nLibName17=motorola\nLibName18=texas\nLibName19=intel\nLibName20=audio\nLibName21=interface\nLibName22=digital-audio\nLibName23=philips\nLibName24=display\nLibName25=cypress\nLibName26=siliconi\nLibName27=opto\nLibName28=atmel\nLibName29=contrib\nLibName30=valves\nLibName31=arduino_shieldsNCL\nLibName32=con-usb-2\nLibName33=2axispotwselect\n"
  },
  {
    "path": "src/test/resources/samples/langs/INI/filenames/.editorconfig",
    "content": "; editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 4\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n"
  },
  {
    "path": "src/test/resources/samples/langs/INI/filenames/.gitconfig",
    "content": "[user]\n  name = Josh Peek\n  email = josh@github.com\n"
  },
  {
    "path": "src/test/resources/samples/langs/INI/filenames/buildozer.spec",
    "content": "[app]\n\n# (str) Title of your application\ntitle = Kivy Kazam\n\n# (str) Package name\npackage.name = kivykazam\n\n# (str) Package domain (needed for android/ios packaging)\npackage.domain = org.test\n\n# (str) Source code where the main.py live\nsource.dir = .\n\n# (list) Source files to include (let empty to include all the files)\nsource.include_exts = py,png,jpg,kv,atlas\n\n# (list) List of inclusions using pattern matching\n#source.include_patterns = assets/*,images/*.png\n\n# (list) Source files to exclude (let empty to not exclude anything)\n#source.exclude_exts = spec\n\n# (list) List of directory to exclude (let empty to not exclude anything)\n#source.exclude_dirs = tests, bin\n\n# (list) List of exclusions using pattern matching\n#source.exclude_patterns = license,images/*/*.jpg\n\n# (str) Application versioning (method 1)\nversion = 0.1\n\n# (str) Application versioning (method 2)\n# version.regex = __version__ = ['\"](.*)['\"]\n# version.filename = %(source.dir)s/main.py\n\n# (list) Application requirements\n# comma seperated e.g. requirements = sqlite3,kivy\nrequirements = kivy\n\n# (str) Custom source folders for requirements\n# Sets custom source for any requirements with recipes\n# requirements.source.kivy = ../../kivy\n\n# (list) Garden requirements\n#garden_requirements =\n\n# (str) Presplash of the application\n#presplash.filename = %(source.dir)s/data/presplash.png\n\n# (str) Icon of the application\n#icon.filename = %(source.dir)s/data/icon.png\n\n# (str) Supported orientation (one of landscape, portrait or all)\norientation = all\n\n# (list) List of service to declare\n#services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY\n\n#\n# OSX Specific\n#\n\n#\n# author = © Copyright Info\n\n#\n# Android specific\n#\n\n# (bool) Indicate if the application should be fullscreen or not\nfullscreen = 1\n\n# (list) Permissions\n#android.permissions = INTERNET\n\n# (int) Android API to use\n#android.api = 19\n\n# (int) Minimum API required\nandroid.minapi = 13\n\n# (int) Android SDK version to use\n#android.sdk = 20\n\n# (str) Android NDK version to use\n#android.ndk = 9c\n\n# (bool) Use --private data storage (True) or --dir public storage (False)\n#android.private_storage = True\n\n# (str) Android NDK directory (if empty, it will be automatically downloaded.)\n#android.ndk_path =\n\n# (str) Android SDK directory (if empty, it will be automatically downloaded.)\n#android.sdk_path =\n\n# (str) ANT directory (if empty, it will be automatically downloaded.)\n#android.ant_path =\n\n# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github)\n#android.p4a_dir =\n\n# (list) python-for-android whitelist\n#android.p4a_whitelist =\n\n# (bool) If True, then skip trying to update the Android sdk\n# This can be useful to avoid excess Internet downloads or save time\n# when an update is due and you just want to test/build your package\n# android.skip_update = False\n\n# (str) Android entry point, default is ok for Kivy-based app\n#android.entrypoint = org.renpy.android.PythonActivity\n\n# (list) List of Java .jar files to add to the libs so that pyjnius can access\n# their classes. Don't add jars that you do not need, since extra jars can slow\n# down the build process. Allows wildcards matching, for example:\n# OUYA-ODK/libs/*.jar\n#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar\n\n# (list) List of Java files to add to the android project (can be java or a\n# directory containing the files)\n#android.add_src =\n\n# (str) python-for-android branch to use, if not master, useful to try\n# not yet merged features.\n#android.branch = master\n\n# (str) OUYA Console category. Should be one of GAME or APP\n# If you leave this blank, OUYA support will not be enabled\n#android.ouya.category = GAME\n\n# (str) Filename of OUYA Console icon. It must be a 732x412 png image.\n#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png\n\n# (str) XML file to include as an intent filters in <activity> tag\n#android.manifest.intent_filters =\n\n# (list) Android additionnal libraries to copy into libs/armeabi\n#android.add_libs_armeabi = libs/android/*.so\n#android.add_libs_armeabi_v7a = libs/android-v7/*.so\n#android.add_libs_x86 = libs/android-x86/*.so\n#android.add_libs_mips = libs/android-mips/*.so\n\n# (bool) Indicate whether the screen should stay on\n# Don't forget to add the WAKE_LOCK permission if you set this to True\n#android.wakelock = False\n\n# (list) Android application meta-data to set (key=value format)\n#android.meta_data =\n\n# (list) Android library project to add (will be added in the\n# project.properties automatically.)\n#android.library_references =\n\n# (str) Android logcat filters to use\n#android.logcat_filters = *:S python:D\n\n# (bool) Copy library instead of making a libpymodules.so\n#android.copy_libs = 1\n\n#\n# iOS specific\n#\n\n# (str) Path to a custom kivy-ios folder\n#ios.kivy_ios_dir = ../kivy-ios\n\n# (str) Name of the certificate to use for signing the debug version\n# Get a list of available identities: buildozer ios list_identities\n#ios.codesign.debug = \"iPhone Developer: <lastname> <firstname> (<hexstring>)\"\n\n# (str) Name of the certificate to use for signing the release version\n#ios.codesign.release = %(ios.codesign.debug)s\n\n\n[buildozer]\n\n# (int) Log level (0 = error only, 1 = info, 2 = debug (with command output))\nlog_level = 1\n\n# (int) Display warning if buildozer is run as root (0 = False, 1 = True)\nwarn_on_root = 1\n\n# (str) Path to build artifact storage, absolute or relative to spec file\n# build_dir = ./.buildozer\n\n# (str) Path to build output (i.e. .apk, .ipa) storage\n# bin_dir = ./bin\n\n#    -----------------------------------------------------------------------------\n#    List as sections\n#\n#    You can define all the \"list\" as [section:key].\n#    Each line will be considered as a option to the list.\n#    Let's take [app] / source.exclude_patterns.\n#    Instead of doing:\n#\n#[app]\n#source.exclude_patterns = license,data/audio/*.wav,data/images/original/*\n#\n#    This can be translated into:\n#\n#[app:source.exclude_patterns]\n#license\n#data/audio/*.wav\n#data/images/original/*\n#\n\n\n#    -----------------------------------------------------------------------------\n#    Profiles\n#\n#    You can extend section / key with a profile\n#    For example, you want to deploy a demo version of your application without\n#    HD content. You could first change the title to add \"(demo)\" in the name\n#    and extend the excluded directories to remove the HD content.\n#\n#[app@demo]\n#title = My Application (demo)\n#\n#[app:source.exclude_patterns@demo]\n#images/hd/*\n#\n#    Then, invoke the command line with the \"demo\" profile:\n#\n#buildozer --profile demo android debug\n"
  },
  {
    "path": "src/test/resources/samples/langs/INI/ultimate-temp-controller.pro",
    "content": "update=22/05/2015 07:44:53\nversion=1\nlast_client=kicad\n[general]\nversion=1\nRootSch=\nBoardNm=\n[pcbnew]\nversion=1\nLastNetListRead=\nUseCmpFile=1\nPadDrill=0.600000000000\nPadDrillOvalY=0.600000000000\nPadSizeH=1.500000000000\nPadSizeV=1.500000000000\nPcbTextSizeV=1.500000000000\nPcbTextSizeH=1.500000000000\nPcbTextThickness=0.300000000000\nModuleTextSizeV=1.000000000000\nModuleTextSizeH=1.000000000000\nModuleTextSizeThickness=0.150000000000\nSolderMaskClearance=0.000000000000\nSolderMaskMinWidth=0.000000000000\nDrawSegmentWidth=0.200000000000\nBoardOutlineThickness=0.100000000000\nModuleOutlineThickness=0.150000000000\n[cvpcb]\nversion=1\nNetIExt=net\n[eeschema]\nversion=1\nLibDir=\n[eeschema/libraries]\nLibName1=power\nLibName2=device\nLibName3=transistors\nLibName4=conn\nLibName5=linear\nLibName6=regul\nLibName7=74xx\nLibName8=cmos4000\nLibName9=adc-dac\nLibName10=memory\nLibName11=xilinx\nLibName12=microcontrollers\nLibName13=dsp\nLibName14=microchip\nLibName15=analog_switches\nLibName16=motorola\nLibName17=texas\nLibName18=intel\nLibName19=audio\nLibName20=interface\nLibName21=digital-audio\nLibName22=philips\nLibName23=display\nLibName24=cypress\nLibName25=siliconi\nLibName26=opto\nLibName27=atmel\nLibName28=contrib\nLibName29=valves\n"
  },
  {
    "path": "src/test/resources/samples/langs/Idris/Chars.idr",
    "content": "module Prelude.Char\n\nimport Builtins\n\nisUpper : Char -> Bool\nisUpper x = x >= 'A' && x <= 'Z'\n\nisLower : Char -> Bool\nisLower x = x >= 'a' && x <= 'z'\n\nisAlpha : Char -> Bool\nisAlpha x = isUpper x || isLower x\n\nisDigit : Char -> Bool\nisDigit x = (x >= '0' && x <= '9')\n\nisAlphaNum : Char -> Bool\nisAlphaNum x = isDigit x || isAlpha x\n\nisSpace : Char -> Bool\nisSpace x = x == ' '  || x == '\\t' || x == '\\r' ||\n            x == '\\n' || x == '\\f' || x == '\\v' ||\n            x == '\\xa0'\n\nisNL : Char -> Bool\nisNL x = x == '\\r' || x == '\\n'\n\ntoUpper : Char -> Char\ntoUpper x = if (isLower x)\n               then (prim__intToChar (prim__charToInt x - 32))\n               else x\n\ntoLower : Char -> Char\ntoLower x = if (isUpper x)\n               then (prim__intToChar (prim__charToInt x + 32))\n               else x\n\nisHexDigit : Char -> Bool\nisHexDigit x = elem (toUpper x) hexChars where\n  hexChars : List Char\n  hexChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n              'A', 'B', 'C', 'D', 'E', 'F']\n"
  },
  {
    "path": "src/test/resources/samples/langs/Inform 7/Trivial Extension.i7x",
    "content": "Version 2 of Trivial Extension by Andrew Plotkin begins here.\n\n\"This is the rubric of the extension.\"\n\n\"provided for the Linguist package by Andrew Plotkin\"\n\n[Note the two special quoted lines above.]\n\nA cow is a kind of animal. A cow can be purple.\n\nUnderstand \"cow\" as a cow.\nUnderstand \"purple\" as a purple cow.\n\nCheck pushing a cow:\n\tinstead say \"Cow-tipping, at your age?[paragraph break]Inconceivable.\"\n\n[Here are the possible levels of heading:]\n\nVolume One\n\nText-line is always \"A line of text.\"\n\nBook 2\n\n\tPart the third - indented headings still count\n\nChapter IV - not for release\n\n[Heading labels are case-insensitive.]\n\nsection foobar\n\n[A line beginning \"Volume\" that does not have blank lines before and after it is *not* a header line. So the following should all be part of section foobar. Sadly, the \"Volume is...\" line gets colored as a header, because Atom's regexp model can't recognize \"thing with blank lines before and after\"!]\n\nMeasure is a kind of value.\nVolume is a measure. Length is a measure.\nArea is a measure.\n\n[And now some Inform 6 inclusions.]\n\nTo say em -- running on:\n\t(- style underline; -).\nTo say /em -- running on:\n\t(- style roman; -).\n\nInclude (-\n\n! Inform 6 comments start with a ! mark and run to the end of the line.\nGlobal cowcount;\n\n[ inform6func arg;\n\tprint \"Here is some text; \", (address) 'dictword', \".^\";\n\tcowcount++;  ! increment this variable\n];\n\nObject i6cow\n\twith name 'cow' 'animal',\n\twith description \"It looks like a cow.\",\n\thas animate scenery;\n\n-) after \"Global Variables\" in \"Output.i6t\".\n\nTrivial Extension ends here.\n\n---- DOCUMENTATION ----\n\nEverything after the \"---- DOCUMENTATION ----\" line is documentation, so it should have the comment style.\n\nHowever, tab-indented lines are sample Inform code within the documentation:\n\n\tHorns are a kind of thing. Every cow has horns.\n\tsay \"Moo[if the noun is purple] indigo[end if].\"\n\nSo we need to allow for that.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Inform 7/story.ni",
    "content": "\"Test Case\" by Andrew Plotkin.\n\nInclude Trivial Extension by Andrew Plotkin.\n\nVolume 1 - overview\n\nChapter - setting the scene\n\nThe Kitchen is a room.\n\n[Comment: this kitchen is modelled after the one in Zork, although it lacks the detail to establish this to the player.]\n\nSection - the kitchen table\n\nThe spicerack is a container in the Kitchen.\n\nTable of Spices\nName\tFlavor\n\"cinnamon\"\t5\n\"nutmeg\"\t4\n\"szechuan pepper\"\t8\n\nThe description of the spicerack is \"It's mostly empty.\"\n\nChapter - a character\n\nA purple cow called Gelett is in the Kitchen.\n\n[This comment spans multiple lines..\n\n...and this line contains [nested square[] brackets]...\n\n...which is legal in Inform 7.]\n\nInstead of examining Gelett:\n\tsay \"You'd rather see than be one.\"\n\nInstead of examining Gelett:\n\tsay \"You'd rather see than be one.\"\n\nCheck smelling Gelett:\n\tsay \"This text contains several lines.\n\nA blank line is displayed as a paragraph break,\nbut a simple line break is not.\";\n\tstop the action.\n\nSection - cow catching\n\nGelett has a number called the mooness.\n\nInstead of taking Gelett:\n\tincrement the mooness of Gelett;\n\tif the mooness of Gelett is one:\n\t\tsay \"Gelett moos once.\";\n\telse:\n\t\tsay \"Gelett moos [mooness of Gelett in words] times.\";\n\nVolume 2 - the turn cycle\n\nEvery turn:\n\tsay \"A turn passes[one of][or] placidly[or] idly[or] tediously[at random].\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Inno Setup/expat.iss",
    "content": "; Basic setup script for the Inno Setup installer builder.  For more\n; information on the free installer builder, see www.jrsoftware.org.\n;\n; This script was contributed by Tim Peters.\n; It was designed for Inno Setup 2.0.19 but works with later versions as well.\n\n[Setup]\nAppName=Expat\nAppId=expat\nAppVersion=2.1.0\nAppVerName=Expat 2.1.0\nAppCopyright=Copyright 1998-2012 Thai Open Source Software Center, Clark Cooper, and the Expat maintainers\nAppPublisher=The Expat Developers\nAppPublisherURL=http://www.libexpat.org/\nAppSupportURL=http://www.libexpat.org/\nAppUpdatesURL=http://www.libexpat.org/\nUninstallDisplayName=Expat XML Parser 2.1.0\nVersionInfoVersion=2.1.0\n\nDefaultDirName={pf}\\Expat 2.1.0\nUninstallFilesDir={app}\\Uninstall\n\nCompression=lzma\nSolidCompression=yes\nSourceDir=..\nOutputDir=win32\nDisableStartupPrompt=yes\nAllowNoIcons=yes\nDisableProgramGroupPage=yes\nDisableReadyPage=yes\n\n[Files]\nFlags: ignoreversion; Source: win32\\bin\\Release\\xmlwf.exe;  DestDir: \"{app}\\Bin\"\nFlags: ignoreversion; Source: win32\\MANIFEST.txt;           DestDir: \"{app}\"\nFlags: ignoreversion; Source: Changes;                      DestDir: \"{app}\"; DestName: Changes.txt\nFlags: ignoreversion; Source: COPYING;                      DestDir: \"{app}\"; DestName: COPYING.txt\nFlags: ignoreversion; Source: README;                       DestDir: \"{app}\"; DestName: README.txt\nFlags: ignoreversion; Source: doc\\*.html;                   DestDir: \"{app}\\Doc\"\nFlags: ignoreversion; Source: doc\\*.css;                    DestDir: \"{app}\\Doc\"\nFlags: ignoreversion; Source: doc\\*.png;                    DestDir: \"{app}\\Doc\"\nFlags: ignoreversion; Source: win32\\bin\\Release\\*.dll;      DestDir: \"{app}\\Bin\"\nFlags: ignoreversion; Source: win32\\bin\\Release\\*.lib;      DestDir: \"{app}\\Bin\"\nFlags: ignoreversion; Source: expat.dsw;                    DestDir: \"{app}\\Source\"\nFlags: ignoreversion; Source: win32\\README.txt;             DestDir: \"{app}\\Source\"\nFlags: ignoreversion; Source: bcb5\\*.bp*;                   DestDir: \"{app}\\Source\\bcb5\"\nFlags: ignoreversion; Source: bcb5\\*.mak;                   DestDir: \"{app}\\Source\\bcb5\"\nFlags: ignoreversion; Source: bcb5\\*.def;                   DestDir: \"{app}\\Source\\bcb5\"\nFlags: ignoreversion; Source: bcb5\\*.txt;                   DestDir: \"{app}\\Source\\bcb5\"\nFlags: ignoreversion; Source: bcb5\\*.bat;                   DestDir: \"{app}\\Source\\bcb5\"\nFlags: ignoreversion; Source: lib\\*.c;                      DestDir: \"{app}\\Source\\lib\"\nFlags: ignoreversion; Source: lib\\*.h;                      DestDir: \"{app}\\Source\\lib\"\nFlags: ignoreversion; Source: lib\\*.def;                    DestDir: \"{app}\\Source\\lib\"\nFlags: ignoreversion; Source: lib\\*.dsp;                    DestDir: \"{app}\\Source\\lib\"\nFlags: ignoreversion; Source: examples\\*.c;                 DestDir: \"{app}\\Source\\examples\"\nFlags: ignoreversion; Source: examples\\*.dsp;               DestDir: \"{app}\\Source\\examples\"\nFlags: ignoreversion; Source: tests\\*.c;                    DestDir: \"{app}\\Source\\tests\"\nFlags: ignoreversion; Source: tests\\*.cpp;                  DestDir: \"{app}\\Source\\tests\"\nFlags: ignoreversion; Source: tests\\*.h;                    DestDir: \"{app}\\Source\\tests\"\nFlags: ignoreversion; Source: tests\\README.txt;             DestDir: \"{app}\\Source\\tests\"\nFlags: ignoreversion; Source: tests\\benchmark\\*.c;          DestDir: \"{app}\\Source\\tests\\benchmark\"\nFlags: ignoreversion; Source: tests\\benchmark\\*.ds*;        DestDir: \"{app}\\Source\\tests\\benchmark\"\nFlags: ignoreversion; Source: tests\\benchmark\\README.txt;   DestDir: \"{app}\\Source\\tests\\benchmark\"\nFlags: ignoreversion; Source: xmlwf\\*.c*;                   DestDir: \"{app}\\Source\\xmlwf\"\nFlags: ignoreversion; Source: xmlwf\\*.h;                    DestDir: \"{app}\\Source\\xmlwf\"\nFlags: ignoreversion; Source: xmlwf\\*.dsp;                  DestDir: \"{app}\\Source\\xmlwf\"\n\n[Messages]\nWelcomeLabel1=Welcome to the Expat XML Parser Setup Wizard\nWelcomeLabel2=This will install [name/ver] on your computer.%n%nExpat is an XML parser with a C-language API, and is primarily made available to allow developers to build applications which use XML using a portable API and fast implementation.%n%nIt is strongly recommended that you close all other applications you have running before continuing. This will help prevent any conflicts during the installation process.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ioke/hello.ik",
    "content": "#!/usr/bin/env ioke\n\n\"Hello world.\" println\n"
  },
  {
    "path": "src/test/resources/samples/langs/Isabelle/HelloWorld.thy",
    "content": "theory HelloWorld\nimports Main\nbegin\n\nsection{*Playing around with Isabelle*}\n\ntext{* creating a lemma with the name hello_world*}\nlemma hello_world: \"True\" by simp\n\n(*inspecting it*)\nthm hello_world\n\ntext{* defining a string constant HelloWorld *}\n\ndefinition HelloWorld :: \"string\" where\n  \"HelloWorld \\<equiv> ''Hello World!''\"\n\n(*reversing HelloWorld twice yilds HelloWorld again*)\ntheorem \"rev (rev HelloWorld) = HelloWorld\"\n  by (fact List.rev_rev_ident)\n\ntext{*now we delete the already proven List.rev_rev_ident lema and show it by hand*}\ndeclare List.rev_rev_ident[simp del]\nhide_fact List.rev_rev_ident\n\n(*It's trivial since we can just 'execute' it*)\ncorollary \"rev (rev HelloWorld) = HelloWorld\"\n  apply(simp add: HelloWorld_def)\n  done\n\ntext{*does it hold in general?*}\ntheorem rev_rev_ident:\"rev (rev l) = l\"\n  proof(induction l)\n  case Nil thus ?case by simp\n  next\n  case (Cons l ls)\n    assume IH: \"rev (rev ls) = ls\"\n    have \"rev (l#ls) = (rev ls) @ [l]\" by simp\n    hence \"rev (rev (l#ls)) = rev ((rev ls) @ [l])\" by simp\n    also have \"\\<dots> = [l] @ rev (rev ls)\" by simp\n    finally show \"rev (rev (l#ls)) = l#ls\" using IH by simp\n  qed\n\ncorollary \"\\<forall>(l::string). rev (rev l) = l\" by(fastforce intro: rev_rev_ident)\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Isabelle ROOT/filenames/ROOT",
    "content": "chapter HOL\n\nsession HOL (main) = Pure +\n  description {*\n    Classical Higher-order Logic.\n  *}\n  options [document_graph]\n  global_theories\n    Main\n    Complex_Main\n  files\n    \"Tools/Quickcheck/Narrowing_Engine.hs\"\n    \"Tools/Quickcheck/PNF_Narrowing_Engine.hs\"\n  document_files\n    \"root.bib\"\n    \"root.tex\"\n\nsession \"HOL-Proofs\" = Pure +\n  description {*\n    HOL-Main with explicit proof terms.\n  *}\n  options [document = false, quick_and_dirty = false]\n  theories Proofs (*sequential change of global flag!*)\n  theories \"~~/src/HOL/Library/Old_Datatype\"\n  files\n    \"Tools/Quickcheck/Narrowing_Engine.hs\"\n    \"Tools/Quickcheck/PNF_Narrowing_Engine.hs\"\n\nsession \"HOL-Library\" (main) in Library = HOL +\n  description {*\n    Classical Higher-order Logic -- batteries included.\n  *}\n  theories\n    Library\n    (*conflicting type class instantiations*)\n    List_lexord\n    Sublist_Order\n    Product_Lexorder\n    Product_Order\n    Finite_Lattice\n    (*data refinements and dependent applications*)\n    AList_Mapping\n    Code_Binary_Nat\n    Code_Char\n    Code_Prolog\n    Code_Real_Approx_By_Float\n    Code_Target_Numeral\n    DAList\n    DAList_Multiset\n    RBT_Mapping\n    RBT_Set\n    (*legacy tools*)\n    Refute\n    Old_Datatype\n    Old_Recdef\n    Old_SMT\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Hahn_Banach\" in Hahn_Banach = HOL +\n  description {*\n    Author:     Gertrud Bauer, TU Munich\n\n    The Hahn-Banach theorem for real vector spaces.\n\n    This is the proof of the Hahn-Banach theorem for real vectorspaces,\n    following H. Heuser, Funktionalanalysis, p. 228 -232. The Hahn-Banach\n    theorem is one of the fundamental theorems of functional analysis. It is a\n    conclusion of Zorn's lemma.\n\n    Two different formaulations of the theorem are presented, one for general\n    real vectorspaces and its application to normed vectorspaces.\n\n    The theorem says, that every continous linearform, defined on arbitrary\n    subspaces (not only one-dimensional subspaces), can be extended to a\n    continous linearform on the whole vectorspace.\n  *}\n  options [document_graph]\n  theories Hahn_Banach\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Induct\" in Induct = HOL +\n  description {*\n    Examples of (Co)Inductive Definitions.\n\n    Comb proves the Church-Rosser theorem for combinators (see\n    http://www.cl.cam.ac.uk/ftp/papers/reports/TR396-lcp-generic-automatic-proof-tools.ps.gz).\n\n    Mutil is the famous Mutilated Chess Board problem (see\n    http://www.cl.cam.ac.uk/ftp/papers/reports/TR394-lcp-mutilated-chess-board.dvi.gz).\n\n    PropLog proves the completeness of a formalization of propositional logic\n    (see\n    http://www.cl.cam.ac.uk/Research/Reports/TR312-lcp-set-II.ps.gz).\n\n    Exp demonstrates the use of iterated inductive definitions to reason about\n    mutually recursive relations.\n  *}\n  theories [document = false]\n    \"~~/src/HOL/Library/Old_Datatype\"\n  theories [quick_and_dirty]\n    Common_Patterns\n  theories\n    QuoDataType\n    QuoNestedDataType\n    Term\n    SList\n    ABexp\n    Tree\n    Ordinals\n    Sigma_Algebra\n    Comb\n    PropLog\n    Com\n  document_files \"root.tex\"\n\nsession \"HOL-IMP\" in IMP = HOL +\n  options [document_graph, document_variants=document]\n  theories [document = false]\n    \"~~/src/Tools/Permanent_Interpretation\"\n    \"~~/src/HOL/Library/While_Combinator\"\n    \"~~/src/HOL/Library/Char_ord\"\n    \"~~/src/HOL/Library/List_lexord\"\n    \"~~/src/HOL/Library/Quotient_List\"\n    \"~~/src/HOL/Library/Extended\"\n  theories\n    BExp\n    ASM\n    Finite_Reachable\n    Denotational\n    Compiler2\n    Poly_Types\n    Sec_Typing\n    Sec_TypingT\n    Def_Init_Big\n    Def_Init_Small\n    Fold\n    Live\n    Live_True\n    Hoare_Examples\n    VCG\n    Hoare_Total\n    Collecting1\n    Collecting_Examples\n    Abs_Int_Tests\n    Abs_Int1_parity\n    Abs_Int1_const\n    Abs_Int3\n    \"Abs_Int_ITP/Abs_Int1_parity_ITP\"\n    \"Abs_Int_ITP/Abs_Int1_const_ITP\"\n    \"Abs_Int_ITP/Abs_Int3_ITP\"\n    \"Abs_Int_Den/Abs_Int_den2\"\n    Procs_Dyn_Vars_Dyn\n    Procs_Stat_Vars_Dyn\n    Procs_Stat_Vars_Stat\n    C_like\n    OO\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-IMPP\" in IMPP = HOL +\n  description {*\n    Author:     David von Oheimb\n    Copyright   1999 TUM\n\n    IMPP -- An imperative language with procedures.\n\n    This is an extension of IMP with local variables and mutually recursive\n    procedures. For documentation see \"Hoare Logic for Mutual Recursion and\n    Local Variables\" (http://isabelle.in.tum.de/Bali/papers/FSTTCS99.html).\n  *}\n  options [document = false]\n  theories EvenOdd\n\nsession \"HOL-Import\" in Import = HOL +\n  options [document_graph]\n  theories HOL_Light_Maps\n  theories [condition = HOL_LIGHT_BUNDLE] HOL_Light_Import\n\nsession \"HOL-Number_Theory\" in Number_Theory = HOL +\n  description {*\n    Fundamental Theorem of Arithmetic, Chinese Remainder Theorem, Fermat/Euler\n    Theorem, Wilson's Theorem, some lemmas for Quadratic Reciprocity.\n  *}\n  options [document_graph]\n  theories [document = false]\n    \"~~/src/HOL/Library/FuncSet\"\n    \"~~/src/HOL/Library/Multiset\"\n    \"~~/src/HOL/Algebra/Ring\"\n    \"~~/src/HOL/Algebra/FiniteProduct\"\n  theories\n    Pocklington\n    Gauss\n    Number_Theory\n    Euclidean_Algorithm\n  document_files\n    \"root.tex\"\n\nsession \"HOL-Old_Number_Theory\" in Old_Number_Theory = HOL +\n  description {*\n    Fundamental Theorem of Arithmetic, Chinese Remainder Theorem, Fermat/Euler\n    Theorem, Wilson's Theorem, Quadratic Reciprocity.\n  *}\n  options [document_graph]\n  theories [document = false]\n    \"~~/src/HOL/Library/Infinite_Set\"\n    \"~~/src/HOL/Library/Permutation\"\n  theories\n    Fib\n    Factorization\n    Chinese\n    WilsonRuss\n    WilsonBij\n    Quadratic_Reciprocity\n    Primes\n    Pocklington\n  document_files\n    \"root.bib\"\n    \"root.tex\"\n\nsession \"HOL-Hoare\" in Hoare = HOL +\n  description {*\n    Verification of imperative programs (verification conditions are generated\n    automatically from pre/post conditions and loop invariants).\n  *}\n  theories Hoare\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Hoare_Parallel\" in Hoare_Parallel = HOL +\n  description {*\n    Verification of shared-variable imperative programs a la Owicki-Gries.\n    (verification conditions are generated automatically).\n  *}\n  options [document_graph]\n  theories Hoare_Parallel\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Codegenerator_Test\" in Codegenerator_Test = \"HOL-Library\" +\n  options [document = false, document_graph = false, browser_info = false]\n  theories\n    Generate\n    Generate_Binary_Nat\n    Generate_Target_Nat\n    Generate_Efficient_Datastructures\n    Generate_Pretty_Char\n  theories [condition = ISABELLE_GHC]\n    Code_Test_GHC\n  theories [condition = ISABELLE_MLTON]\n    Code_Test_MLton\n  theories [condition = ISABELLE_OCAMLC]\n    Code_Test_OCaml\n  theories [condition = ISABELLE_POLYML]\n    Code_Test_PolyML\n  theories [condition = ISABELLE_SCALA]\n    Code_Test_Scala\n  theories [condition = ISABELLE_SMLNJ]\n    Code_Test_SMLNJ\n\nsession \"HOL-Metis_Examples\" in Metis_Examples = HOL +\n  description {*\n    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory\n    Author:     Jasmin Blanchette, TU Muenchen\n\n    Testing Metis and Sledgehammer.\n  *}\n  options [document = false]\n  theories\n    Abstraction\n    Big_O\n    Binary_Tree\n    Clausification\n    Message\n    Proxies\n    Tarski\n    Trans_Closure\n    Sets\n\nsession \"HOL-Nitpick_Examples\" in Nitpick_Examples = HOL +\n  description {*\n    Author:     Jasmin Blanchette, TU Muenchen\n    Copyright   2009\n  *}\n  options [document = false]\n  theories [quick_and_dirty] Nitpick_Examples\n\nsession \"HOL-Algebra\" (main) in Algebra = HOL +\n  description {*\n    Author: Clemens Ballarin, started 24 September 1999\n\n    The Isabelle Algebraic Library.\n  *}\n  options [document_graph]\n  theories [document = false]\n    (* Preliminaries from set and number theory *)\n    \"~~/src/HOL/Library/FuncSet\"\n    \"~~/src/HOL/Number_Theory/Primes\"\n    \"~~/src/HOL/Number_Theory/Binomial\"\n    \"~~/src/HOL/Library/Permutation\"\n  theories\n    (*** New development, based on explicit structures ***)\n    (* Groups *)\n    FiniteProduct        (* Product operator for commutative groups *)\n    Sylow                (* Sylow's theorem *)\n    Bij                  (* Automorphism Groups *)\n\n    (* Rings *)\n    Divisibility         (* Rings *)\n    IntRing              (* Ideals and residue classes *)\n    UnivPoly             (* Polynomials *)\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Auth\" in Auth = HOL +\n  description {*\n    A new approach to verifying authentication protocols.\n  *}\n  options [document_graph]\n  theories\n    Auth_Shared\n    Auth_Public\n    \"Smartcard/Auth_Smartcard\"\n    \"Guard/Auth_Guard_Shared\"\n    \"Guard/Auth_Guard_Public\"\n  document_files \"root.tex\"\n\nsession \"HOL-UNITY\" in UNITY = \"HOL-Auth\" +\n  description {*\n    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory\n    Copyright   1998  University of Cambridge\n\n    Verifying security protocols using Chandy and Misra's UNITY formalism.\n  *}\n  options [document_graph]\n  theories\n    (*Basic meta-theory*)\n    \"UNITY_Main\"\n\n    (*Simple examples: no composition*)\n    \"Simple/Deadlock\"\n    \"Simple/Common\"\n    \"Simple/Network\"\n    \"Simple/Token\"\n    \"Simple/Channel\"\n    \"Simple/Lift\"\n    \"Simple/Mutex\"\n    \"Simple/Reach\"\n    \"Simple/Reachability\"\n\n    (*Verifying security protocols using UNITY*)\n    \"Simple/NSP_Bad\"\n\n    (*Example of composition*)\n    \"Comp/Handshake\"\n\n    (*Universal properties examples*)\n    \"Comp/Counter\"\n    \"Comp/Counterc\"\n    \"Comp/Priority\"\n\n    \"Comp/TimerArray\"\n    \"Comp/Progress\"\n\n    \"Comp/Alloc\"\n    \"Comp/AllocImpl\"\n    \"Comp/Client\"\n\n    (*obsolete*)\n    \"ELT\"\n  document_files \"root.tex\"\n\nsession \"HOL-Unix\" in Unix = HOL +\n  options [print_mode = \"no_brackets,no_type_brackets\"]\n  theories Unix\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-ZF\" in ZF = HOL +\n  theories MainZF Games\n  document_files \"root.tex\"\n\nsession \"HOL-Imperative_HOL\" in Imperative_HOL = HOL +\n  options [document_graph, print_mode = \"iff,no_brackets\"]\n  theories [document = false]\n    \"~~/src/HOL/Library/Countable\"\n    \"~~/src/HOL/Library/Monad_Syntax\"\n    \"~~/src/HOL/Library/LaTeXsugar\"\n  theories Imperative_HOL_ex\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Decision_Procs\" in Decision_Procs = HOL +\n  description {*\n    Various decision procedures, typically involving reflection.\n  *}\n  options [condition = ML_SYSTEM_POLYML, document = false]\n  theories Decision_Procs\n\nsession \"HOL-Proofs-ex\" in \"Proofs/ex\" = \"HOL-Proofs\" +\n  options [document = false, parallel_proofs = 0]\n  theories\n    Hilbert_Classical\n    XML_Data\n\nsession \"HOL-Proofs-Extraction\" in \"Proofs/Extraction\" = \"HOL-Proofs\" +\n  description {*\n    Examples for program extraction in Higher-Order Logic.\n  *}\n  options [condition = ML_SYSTEM_POLYML, parallel_proofs = 0, quick_and_dirty = false]\n  theories [document = false]\n    \"~~/src/HOL/Library/Code_Target_Numeral\"\n    \"~~/src/HOL/Library/Monad_Syntax\"\n    \"~~/src/HOL/Number_Theory/Primes\"\n    \"~~/src/HOL/Number_Theory/UniqueFactorization\"\n    \"~~/src/HOL/Library/State_Monad\"\n  theories\n    Greatest_Common_Divisor\n    Warshall\n    Higman_Extraction\n    Pigeonhole\n    Euclid\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Proofs-Lambda\" in \"Proofs/Lambda\" = \"HOL-Proofs\" +\n  description {*\n    Lambda Calculus in de Bruijn's Notation.\n\n    This session defines lambda-calculus terms with de Bruijn indixes and\n    proves confluence of beta, eta and beta+eta.\n\n    The paper \"More Church-Rosser Proofs (in Isabelle/HOL)\" describes the whole\n    theory (see http://www.in.tum.de/~nipkow/pubs/jar2001.html).\n  *}\n  options [document_graph, print_mode = \"no_brackets\", parallel_proofs = 0,\n    quick_and_dirty = false]\n  theories [document = false]\n    \"~~/src/HOL/Library/Code_Target_Int\"\n  theories\n    Eta\n    StrongNorm\n    Standardization\n    WeakNorm\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Prolog\" in Prolog = HOL +\n  description {*\n    Author:   David von Oheimb (based on a lecture on Lambda Prolog by Nadathur)\n\n    A bare-bones implementation of Lambda-Prolog.\n\n    This is a simple exploratory implementation of Lambda-Prolog in HOL,\n    including some minimal examples (in Test.thy) and a more typical example of\n    a little functional language and its type system.\n  *}\n  options [document = false]\n  theories Test Type\n\nsession \"HOL-MicroJava\" in MicroJava = HOL +\n  description {*\n    Formalization of a fragment of Java, together with a corresponding virtual\n    machine and a specification of its bytecode verifier and a lightweight\n    bytecode verifier, including proofs of type-safety.\n  *}\n  options [document_graph]\n  theories [document = false] \"~~/src/HOL/Library/While_Combinator\"\n  theories MicroJava\n  document_files\n    \"introduction.tex\"\n    \"root.bib\"\n    \"root.tex\"\n\nsession \"HOL-NanoJava\" in NanoJava = HOL +\n  description {*\n    Hoare Logic for a tiny fragment of Java.\n  *}\n  options [document_graph]\n  theories Example\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Bali\" in Bali = HOL +\n  options [document_graph]\n  theories\n    AxExample\n    AxSound\n    AxCompl\n    Trans\n  document_files \"root.tex\"\n\nsession \"HOL-IOA\" in IOA = HOL +\n  description {*\n    Author:     Tobias Nipkow and Konrad Slind and Olaf Müller\n    Copyright   1994--1996  TU Muenchen\n\n    The meta-theory of I/O-Automata in HOL. This formalization has been\n    significantly changed and extended, see HOLCF/IOA. There are also the\n    proofs of two communication protocols which formerly have been here.\n\n    @inproceedings{Nipkow-Slind-IOA,\n    author={Tobias Nipkow and Konrad Slind},\n    title={{I/O} Automata in {Isabelle/HOL}},\n    booktitle={Proc.\\ TYPES Workshop 1994},\n    publisher=Springer,\n    series=LNCS,\n    note={To appear}}\n    ftp://ftp.informatik.tu-muenchen.de/local/lehrstuhl/nipkow/ioa.ps.gz\n\n    and\n\n    @inproceedings{Mueller-Nipkow,\n    author={Olaf M\\\"uller and Tobias Nipkow},\n    title={Combining Model Checking and Deduction for {I/O}-Automata},\n    booktitle={Proc.\\ TACAS Workshop},\n    organization={Aarhus University, BRICS report},\n    year=1995}\n    ftp://ftp.informatik.tu-muenchen.de/local/lehrstuhl/nipkow/tacas.dvi.gz\n  *}\n  options [document = false]\n  theories Solve\n\nsession \"HOL-Lattice\" in Lattice = HOL +\n  description {*\n    Author:     Markus Wenzel, TU Muenchen\n\n    Basic theory of lattices and orders.\n  *}\n  theories CompleteLattice\n  document_files \"root.tex\"\n\nsession \"HOL-ex\" in ex = HOL +\n  description {*\n    Miscellaneous examples for Higher-Order Logic.\n  *}\n  options [condition = ML_SYSTEM_POLYML]\n  theories [document = false]\n    \"~~/src/HOL/Library/State_Monad\"\n    Code_Binary_Nat_examples\n    \"~~/src/HOL/Library/FuncSet\"\n    Eval_Examples\n    Normalization_by_Evaluation\n    Hebrew\n    Chinese\n    Serbian\n    \"~~/src/HOL/Library/FinFun_Syntax\"\n    \"~~/src/HOL/Library/Refute\"\n    \"~~/src/HOL/Library/Transitive_Closure_Table\"\n    Cartouche_Examples\n  theories\n    Adhoc_Overloading_Examples\n    Iff_Oracle\n    Coercion_Examples\n    Higher_Order_Logic\n    Abstract_NAT\n    Guess\n    Fundefs\n    Induction_Schema\n    LocaleTest2\n    Records\n    While_Combinator_Example\n    MonoidGroup\n    BinEx\n    Hex_Bin_Examples\n    Antiquote\n    Multiquote\n    PER\n    NatSum\n    ThreeDivides\n    Intuitionistic\n    CTL\n    Arith_Examples\n    BT\n    Tree23\n    Bubblesort\n    MergeSort\n    Lagrange\n    Groebner_Examples\n    MT\n    Unification\n    Primrec\n    Tarski\n    Classical\n    Set_Theory\n    Termination\n    Coherent\n    PresburgerEx\n    Reflection_Examples\n    Sqrt\n    Sqrt_Script\n    Transfer_Ex\n    Transfer_Int_Nat\n    Transitive_Closure_Table_Ex\n    HarmonicSeries\n    Refute_Examples\n    Execute_Choice\n    Gauge_Integration\n    Dedekind_Real\n    Quicksort\n    Birthday_Paradox\n    List_to_Set_Comprehension_Examples\n    Seq\n    Simproc_Tests\n    Executable_Relation\n    FinFunPred\n    Set_Comprehension_Pointfree_Examples\n    Parallel_Example\n    IArray_Examples\n    SVC_Oracle\n    Simps_Case_Conv_Examples\n    ML\n    SAT_Examples\n    SOS\n    SOS_Cert\n  theories [skip_proofs = false]\n    Meson_Test\n  theories [condition = SVC_HOME]\n    svc_test\n  theories [condition = ISABELLE_FULL_TEST]\n    Sudoku\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Isar_Examples\" in Isar_Examples = HOL +\n  description {*\n    Miscellaneous Isabelle/Isar examples for Higher-Order Logic.\n  *}\n  theories [document = false]\n    \"~~/src/HOL/Library/Lattice_Syntax\"\n    \"../Number_Theory/Primes\"\n  theories\n    Basic_Logic\n    Cantor\n    Drinker\n    Expr_Compiler\n    Fibonacci\n    Group\n    Group_Context\n    Group_Notepad\n    Hoare_Ex\n    Knaster_Tarski\n    Mutilated_Checkerboard\n    Nested_Datatype\n    Peirce\n    Puzzle\n    Summation\n  document_files\n    \"root.bib\"\n    \"root.tex\"\n    \"style.tex\"\n\nsession \"HOL-SET_Protocol\" in SET_Protocol = HOL +\n  description {*\n    Verification of the SET Protocol.\n  *}\n  options [document_graph]\n  theories [document = false] \"~~/src/HOL/Library/Nat_Bijection\"\n  theories SET_Protocol\n  document_files \"root.tex\"\n\nsession \"HOL-Matrix_LP\" in Matrix_LP = HOL +\n  description {*\n    Two-dimensional matrices and linear programming.\n  *}\n  options [document_graph]\n  theories Cplex\n  document_files \"root.tex\"\n\nsession \"HOL-TLA\" in TLA = HOL +\n  description {*\n    Lamport's Temporal Logic of Actions.\n  *}\n  options [document = false]\n  theories TLA\n\nsession \"HOL-TLA-Inc\" in \"TLA/Inc\" = \"HOL-TLA\" +\n  options [document = false]\n  theories Inc\n\nsession \"HOL-TLA-Buffer\" in \"TLA/Buffer\" = \"HOL-TLA\" +\n  options [document = false]\n  theories DBuffer\n\nsession \"HOL-TLA-Memory\" in \"TLA/Memory\" = \"HOL-TLA\" +\n  options [document = false]\n  theories MemoryImplementation\n\nsession \"HOL-TPTP\" in TPTP = HOL +\n  description {*\n    Author:     Jasmin Blanchette, TU Muenchen\n    Author:     Nik Sultana, University of Cambridge\n    Copyright   2011\n\n    TPTP-related extensions.\n  *}\n  options [document = false]\n  theories\n    ATP_Theory_Export\n    MaSh_Eval\n    TPTP_Interpret\n    THF_Arith\n    TPTP_Proof_Reconstruction\n  theories\n    ATP_Problem_Import\n\nsession \"HOL-Multivariate_Analysis\" (main) in Multivariate_Analysis = HOL +\n  options [document_graph]\n  theories\n    Multivariate_Analysis\n    Determinants\n    PolyRoots\n    Complex_Analysis_Basics\n  document_files\n    \"root.tex\"\n\nsession \"HOL-Probability\" in \"Probability\" = \"HOL-Multivariate_Analysis\" +\n  options [document_graph]\n  theories [document = false]\n    \"~~/src/HOL/Library/Countable\"\n    \"~~/src/HOL/Library/Permutation\"\n    \"~~/src/HOL/Library/Order_Continuity\"\n    \"~~/src/HOL/Library/Diagonal_Subsequence\"\n  theories\n    Probability\n    \"ex/Dining_Cryptographers\"\n    \"ex/Koepf_Duermuth_Countermeasure\"\n  document_files \"root.tex\"\n\nsession \"HOL-Nominal\" (main) in Nominal = HOL +\n  options [document = false]\n  theories Nominal\n\nsession \"HOL-Nominal-Examples\" in \"Nominal/Examples\" = \"HOL-Nominal\" +\n  options [condition = ML_SYSTEM_POLYML, document = false]\n  theories\n    Nominal_Examples_Base\n  theories [condition = ISABELLE_FULL_TEST]\n    Nominal_Examples\n  theories [quick_and_dirty]\n    VC_Condition\n\nsession \"HOL-Cardinals\" in Cardinals = HOL +\n  description {*\n    Ordinals and Cardinals, Full Theories.\n  *}\n  options [document = false]\n  theories Cardinals\n  document_files\n    \"intro.tex\"\n    \"root.tex\"\n    \"root.bib\"\n\nsession \"HOL-Datatype_Examples\" in Datatype_Examples = HOL +\n  description {*\n    (Co)datatype Examples, including large ones from John Harrison.\n  *}\n  options [document = false]\n  theories\n    \"~~/src/HOL/Library/Old_Datatype\"\n    Compat\n    Lambda_Term\n    Process\n    TreeFsetI\n    \"Derivation_Trees/Gram_Lang\"\n    \"Derivation_Trees/Parallel\"\n    Koenig\n    Stream_Processor\n    Misc_Codatatype\n    Misc_Datatype\n    Misc_Primcorec\n    Misc_Primrec\n  theories [condition = ISABELLE_FULL_TEST]\n    Brackin\n    IsaFoR\n    Misc_N2M\n\nsession \"HOL-Word\" (main) in Word = HOL +\n  options [document_graph]\n  theories Word\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Word-Examples\" in \"Word/Examples\" = \"HOL-Word\" +\n  options [document = false]\n  theories WordExamples\n\nsession \"HOL-Statespace\" in Statespace = HOL +\n  theories [skip_proofs = false]\n    StateSpaceEx\n  document_files \"root.tex\"\n\nsession \"HOL-NSA\" in NSA = HOL +\n  description {*\n    Nonstandard analysis.\n  *}\n  options [document_graph]\n  theories Hypercomplex\n  document_files \"root.tex\"\n\nsession \"HOL-NSA-Examples\" in \"NSA/Examples\" = \"HOL-NSA\" +\n  options [document = false]\n  theories NSPrimes\n\nsession \"HOL-Mirabelle\" in Mirabelle = HOL +\n  options [document = false]\n  theories Mirabelle_Test\n\nsession \"HOL-Mirabelle-ex\" in \"Mirabelle/ex\" = \"HOL-Mirabelle\" +\n  options [document = false, timeout = 60]\n  theories Ex\n\nsession \"HOL-Word-SMT_Examples\" in SMT_Examples = \"HOL-Word\" +\n  options [document = false, quick_and_dirty]\n  theories\n    Boogie\n    SMT_Examples\n    SMT_Word_Examples\n  theories [condition = ISABELLE_FULL_TEST]\n    SMT_Tests\n  files\n    \"Boogie_Dijkstra.certs\"\n    \"Boogie_Max.certs\"\n    \"SMT_Examples.certs\"\n    \"SMT_Word_Examples.certs\"\n    \"VCC_Max.certs\"\n\nsession \"HOL-SPARK\" (main) in \"SPARK\" = \"HOL-Word\" +\n  options [document = false]\n  theories SPARK\n\nsession \"HOL-SPARK-Examples\" in \"SPARK/Examples\" = \"HOL-SPARK\" +\n  options [document = false]\n  theories\n    \"Gcd/Greatest_Common_Divisor\"\n\n    \"Liseq/Longest_Increasing_Subsequence\"\n\n    \"RIPEMD-160/F\"\n    \"RIPEMD-160/Hash\"\n    \"RIPEMD-160/K_L\"\n    \"RIPEMD-160/K_R\"\n    \"RIPEMD-160/R_L\"\n    \"RIPEMD-160/Round\"\n    \"RIPEMD-160/R_R\"\n    \"RIPEMD-160/S_L\"\n    \"RIPEMD-160/S_R\"\n\n    \"Sqrt/Sqrt\"\n  files\n    \"Gcd/greatest_common_divisor/g_c_d.fdl\"\n    \"Gcd/greatest_common_divisor/g_c_d.rls\"\n    \"Gcd/greatest_common_divisor/g_c_d.siv\"\n    \"Liseq/liseq/liseq_length.fdl\"\n    \"Liseq/liseq/liseq_length.rls\"\n    \"Liseq/liseq/liseq_length.siv\"\n    \"RIPEMD-160/rmd/f.fdl\"\n    \"RIPEMD-160/rmd/f.rls\"\n    \"RIPEMD-160/rmd/f.siv\"\n    \"RIPEMD-160/rmd/hash.fdl\"\n    \"RIPEMD-160/rmd/hash.rls\"\n    \"RIPEMD-160/rmd/hash.siv\"\n    \"RIPEMD-160/rmd/k_l.fdl\"\n    \"RIPEMD-160/rmd/k_l.rls\"\n    \"RIPEMD-160/rmd/k_l.siv\"\n    \"RIPEMD-160/rmd/k_r.fdl\"\n    \"RIPEMD-160/rmd/k_r.rls\"\n    \"RIPEMD-160/rmd/k_r.siv\"\n    \"RIPEMD-160/rmd/r_l.fdl\"\n    \"RIPEMD-160/rmd/r_l.rls\"\n    \"RIPEMD-160/rmd/r_l.siv\"\n    \"RIPEMD-160/rmd/round.fdl\"\n    \"RIPEMD-160/rmd/round.rls\"\n    \"RIPEMD-160/rmd/round.siv\"\n    \"RIPEMD-160/rmd/r_r.fdl\"\n    \"RIPEMD-160/rmd/r_r.rls\"\n    \"RIPEMD-160/rmd/r_r.siv\"\n    \"RIPEMD-160/rmd/s_l.fdl\"\n    \"RIPEMD-160/rmd/s_l.rls\"\n    \"RIPEMD-160/rmd/s_l.siv\"\n    \"RIPEMD-160/rmd/s_r.fdl\"\n    \"RIPEMD-160/rmd/s_r.rls\"\n    \"RIPEMD-160/rmd/s_r.siv\"\n\nsession \"HOL-SPARK-Manual\" in \"SPARK/Manual\" = \"HOL-SPARK\" +\n  options [show_question_marks = false]\n  theories\n    Example_Verification\n    VC_Principles\n    Reference\n    Complex_Types\n  files\n    \"complex_types_app/initialize.fdl\"\n    \"complex_types_app/initialize.rls\"\n    \"complex_types_app/initialize.siv\"\n    \"loop_invariant/proc1.fdl\"\n    \"loop_invariant/proc1.rls\"\n    \"loop_invariant/proc1.siv\"\n    \"loop_invariant/proc2.fdl\"\n    \"loop_invariant/proc2.rls\"\n    \"loop_invariant/proc2.siv\"\n    \"simple_greatest_common_divisor/g_c_d.fdl\"\n    \"simple_greatest_common_divisor/g_c_d.rls\"\n    \"simple_greatest_common_divisor/g_c_d.siv\"\n  document_files\n    \"complex_types.ads\"\n    \"complex_types_app.adb\"\n    \"complex_types_app.ads\"\n    \"Gcd.adb\"\n    \"Gcd.ads\"\n    \"intro.tex\"\n    \"loop_invariant.adb\"\n    \"loop_invariant.ads\"\n    \"root.bib\"\n    \"root.tex\"\n    \"Simple_Gcd.adb\"\n    \"Simple_Gcd.ads\"\n\nsession \"HOL-Mutabelle\" in Mutabelle = HOL +\n  options [document = false]\n  theories MutabelleExtra\n\nsession \"HOL-Quickcheck_Examples\" in Quickcheck_Examples = HOL +\n  options [document = false]\n  theories\n    Quickcheck_Examples\n    Quickcheck_Lattice_Examples\n    Completeness\n    Quickcheck_Interfaces\n  theories [condition = ISABELLE_GHC]\n    Hotel_Example\n    Quickcheck_Narrowing_Examples\n\nsession \"HOL-Quickcheck_Benchmark\" in Quickcheck_Benchmark = HOL +\n  theories [condition = ISABELLE_FULL_TEST, quick_and_dirty]\n    Find_Unused_Assms_Examples\n    Needham_Schroeder_No_Attacker_Example\n    Needham_Schroeder_Guided_Attacker_Example\n    Needham_Schroeder_Unguided_Attacker_Example\n\nsession \"HOL-Quotient_Examples\" in Quotient_Examples = HOL +\n  description {*\n    Author:     Cezary Kaliszyk and Christian Urban\n  *}\n  options [document = false]\n  theories\n    DList\n    FSet\n    Quotient_Int\n    Quotient_Message\n    Lift_FSet\n    Lift_Set\n    Lift_Fun\n    Quotient_Rat\n    Lift_DList\n    Int_Pow\n\nsession \"HOL-Predicate_Compile_Examples\" in Predicate_Compile_Examples = HOL +\n  options [document = false]\n  theories\n    Examples\n    Predicate_Compile_Tests\n    (* FIXME\n    Predicate_Compile_Quickcheck_Examples  -- should be added again soon (since 21-Oct-2010) *)\n    Specialisation_Examples\n    IMP_1\n    IMP_2\n    (* FIXME since 21-Jul-2011\n    Hotel_Example_Small_Generator\n    IMP_3\n    IMP_4 *)\n  theories [condition = \"ISABELLE_SWIPL\"]\n    Code_Prolog_Examples\n    Context_Free_Grammar_Example\n    Hotel_Example_Prolog\n    Lambda_Example\n    List_Examples\n  theories [condition = \"ISABELLE_SWIPL\", quick_and_dirty]\n    Reg_Exp_Example\n\nsession HOLCF (main) in HOLCF = HOL +\n  description {*\n    Author:     Franz Regensburger\n    Author:     Brian Huffman\n\n    HOLCF -- a semantic extension of HOL by the LCF logic.\n  *}\n  options [document_graph]\n  theories [document = false]\n    \"~~/src/HOL/Library/Nat_Bijection\"\n    \"~~/src/HOL/Library/Countable\"\n  theories\n    Plain_HOLCF\n    Fixrec\n    HOLCF\n  document_files \"root.tex\"\n\nsession \"HOLCF-Tutorial\" in \"HOLCF/Tutorial\" = HOLCF +\n  theories\n    Domain_ex\n    Fixrec_ex\n    New_Domain\n  document_files \"root.tex\"\n\nsession \"HOLCF-Library\" in \"HOLCF/Library\" = HOLCF +\n  options [document = false]\n  theories HOLCF_Library\n\nsession \"HOLCF-IMP\" in \"HOLCF/IMP\" = HOLCF +\n  description {*\n    IMP -- A WHILE-language and its Semantics.\n\n    This is the HOLCF-based denotational semantics of a simple WHILE-language.\n  *}\n  options [document = false]\n  theories HoareEx\n  document_files \"root.tex\"\n\nsession \"HOLCF-ex\" in \"HOLCF/ex\" = HOLCF +\n  description {*\n    Miscellaneous examples for HOLCF.\n  *}\n  options [document = false]\n  theories\n    Dnat\n    Dagstuhl\n    Focus_ex\n    Fix2\n    Hoare\n    Concurrency_Monad\n    Loop\n    Powerdomain_ex\n    Domain_Proofs\n    Letrec\n    Pattern_Match\n\nsession \"HOLCF-FOCUS\" in \"HOLCF/FOCUS\" = HOLCF +\n  description {*\n    FOCUS: a theory of stream-processing functions Isabelle/HOLCF.\n\n    For introductions to FOCUS, see\n\n    \"The Design of Distributed Systems - An Introduction to FOCUS\"\n    http://www4.in.tum.de/publ/html.php?e=2\n\n    \"Specification and Refinement of a Buffer of Length One\"\n    http://www4.in.tum.de/publ/html.php?e=15\n\n    \"Specification and Development of Interactive Systems: Focus on Streams,\n    Interfaces, and Refinement\" http://www4.in.tum.de/publ/html.php?e=321\n  *}\n  options [document = false]\n  theories\n    Fstreams\n    FOCUS\n    Buffer_adm\n\nsession IOA in \"HOLCF/IOA\" = HOLCF +\n  description {*\n    Author:     Olaf Mueller\n    Copyright   1997 TU München\n\n    A formalization of I/O automata in HOLCF.\n\n    The distribution contains simulation relations, temporal logic, and an\n    abstraction theory. Everything is based upon a domain-theoretic model of\n    finite and infinite sequences.\n  *}\n  options [document = false]\n  theories \"meta_theory/Abstraction\"\n\nsession \"IOA-ABP\" in \"HOLCF/IOA/ABP\" = IOA +\n  description {*\n    Author:     Olaf Mueller\n\n    The Alternating Bit Protocol performed in I/O-Automata.\n  *}\n  options [document = false]\n  theories Correctness\n\nsession \"IOA-NTP\" in \"HOLCF/IOA/NTP\" = IOA +\n  description {*\n    Author:     Tobias Nipkow & Konrad Slind\n\n    A network transmission protocol, performed in the\n    I/O automata formalization by Olaf Mueller.\n  *}\n  options [document = false]\n  theories Correctness\n\nsession \"IOA-Storage\" in \"HOLCF/IOA/Storage\" = IOA +\n  description {*\n    Author:     Olaf Mueller\n\n    Memory storage case study.\n  *}\n  options [document = false]\n  theories Correctness\n\nsession \"IOA-ex\" in \"HOLCF/IOA/ex\" = IOA +\n  description {*\n    Author:     Olaf Mueller\n  *}\n  options [document = false]\n  theories\n    TrivEx\n    TrivEx2\n\nsession \"HOL-Record_Benchmark\" in Record_Benchmark = HOL +\n  description {*\n    Some benchmark on large record.\n  *}\n  options [document = false]\n  theories [condition = ISABELLE_FULL_TEST]\n    Record_Benchmark\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/J/hashbang",
    "content": "#!/bin/jconsole\necho 'Hello, GitHub!'\nexit ''\n"
  },
  {
    "path": "src/test/resources/samples/langs/J/stwij.ijs",
    "content": "NB. From \"Continuing to write in J\".\nNB. See http://www.jsoftware.com/help/jforc/continuing_to_write_in_j.htm\n\nempno=: 316 317 319 320\npayrate=: 60 42 44 54\nbillrate=: 120 90 90 108\nclientlist=: 10011 10012 10025\nemp_client=: 10012 10025 10012 10025\nhoursworked=: 4 31 $ 8 0 3 10 9 8 8 9 4 0 8 7 10 10 12 9 0 6 8 9 9 9 0 0 10 11 9 7 10 2 0 8 0 0 9 9 8 9 10 0 0 8 8 10 7 10 0 0 7 8 9 8 9 0 4 9 8 9 8 9 0 0 5 0 0 8 9 9 9 9 0 0 8 7 0 0 9 0 2 10 10 9 11 8 0 0 8 9 10 8 9 0 0 9 0 0 9 10 8 6 6 8 0 9 8 10 6 9 7 0 6 8 8 8 9 0 5 8 9 8 8 12 0 0\n\nNB. Finds the number of hours each employee worked in the given month.\nemphours=: 3 : '+/\"1 hoursworked'\n\nNB. Determines the wages earned by each employee in the given month.\nempearnings=: 3 : 'payrate * +/\"1 hoursworked'\n\nNB. Determines the profit brought in by each employee.\nempprofit=: 3 : 0\n(billrate - payrate) * +/\"1 hoursworked\n)\n\nNB. Returns the amount to bill a given client.\nbillclient=: 3 : 0\nmask=. emp_client = y\n+/ (mask # billrate) * +/\"1 mask # hoursworked\n)\n\nNB. Finds for each day of the month the employee who billed the most hours.\ndailydrudge=: 3 : 0\n((|: hoursworked) i.\"1 0 >./ hoursworked) { empno\n)\n\nNB. Returns the employees, in descending order of the profit brought in by each.\nproducers=: 3 : 'empno \\: empprofit 0'\n\nNB. Returns the clients, in descending order of the profit generated by each.\ncustbyprofit=: 3 : 0\nclientlist \\: +/ (clientlist =\"1 0 emp_client) * empprofit 0\n)\n\nNB. Calculates withholding tax on each employee's earnings.\nrenderuntocaesar=: 3 : 0\nbktmin=. 0 6000 10000 20000     NB. Four brackets, 0..6000..10000..20000.._\nbktrate=. 0.05 0.10 0.20 0.30\nbktearns=. 0 >. ((1 |.!._ bktmin) <.\"1 0 empearnings'') -\"1 bktmin\n+/\"1 bktrate *\"1 bktearns\n)\n\nNB. Main\n\necho 'Problem 1'\necho emphours''\n\necho 'Problem 2'\necho empearnings''\n\necho 'Problem 3'\necho empprofit''\n\necho 'Problem 4'\necho billclient 10025\n\necho 'Problem 5'\necho dailydrudge''\n\necho 'Problem 6'\necho producers''\n\necho 'Problem 7'\necho custbyprofit''\n\necho 'Problem 8'\necho 0j2 \": renderuntocaesar''\n"
  },
  {
    "path": "src/test/resources/samples/langs/JFlex/LexScan.flex",
    "content": "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * JFlex 1.7.0-SNAPSHOT                                                    *\n * Copyright (C) 1998-2015  Gerwin Klein <lsf@jflex.de>                    *\n * All rights reserved.                                                    *\n *                                                                         *\n * License: BSD                                                            *\n *                                                                         *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\npackage jflex;\n\nimport java_cup.runtime.Symbol;\nimport java.io.*;\nimport java.util.Stack;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.HashMap;\nimport jflex.unicode.UnicodeProperties;\n\n%%\n\n%final\n%public\n%class LexScan\n%implements sym, java_cup.runtime.Scanner\n%function next_token\n\n%type Symbol\n%unicode\n\n%column\n%line\n\n%eofclose\n\n%state COMMENT, STATELIST, MACROS, REGEXPSTART\n%state REGEXP, JAVA_CODE, STATES, STRING_CONTENT\n%state CHARCLASS, COPY, REPEATEXP, EATWSPNL\n%state CTOR_ARG, REGEXP_CODEPOINT_SEQUENCE\n%state STRING_CODEPOINT_SEQUENCE, CHARCLASS_CODEPOINT\n\n%inputstreamctor false\n\n%cupdebug\n\n%{\n  int balance = 0;\n  int commentbalance = 0;\n  int action_line = 0;\n  int bufferSize = 16384;\n\n  File file;\n  Stack<File> files = new Stack<File>();\n\n  StringBuilder userCode   = new StringBuilder();\n\n  String classCode;\n  String initCode;\n  String initThrow;\n  String eofCode;\n  String eofThrow;\n  String lexThrow;\n  String eofVal;\n  String scanErrorException;\n  String cupSymbol = \"sym\";\n\n  StringBuilder actionText = new StringBuilder();\n  StringBuilder string     = new StringBuilder();\n\n  private UnicodeProperties unicodeProperties;\n\n  boolean charCount;\n  boolean lineCount;\n  boolean columnCount;\n  boolean cupCompatible;\n  boolean cup2Compatible;\n  boolean cupDebug;\n  boolean isInteger;\n  boolean isIntWrap;\n  boolean isYYEOF;\n  boolean notUnix;\n  boolean isPublic;\n  boolean isFinal;\n  boolean isAbstract;\n  boolean bolUsed;\n  boolean standalone;\n  boolean debugOption;\n  boolean caseless;\n  boolean inclusive_states;\n  boolean eofclose;\n  boolean isASCII;\n  // TODO: In the version of JFlex after 1.6, the InputStream ctor \n  // TODO: will never be emitted, and this option will cease to exist.\n  boolean emitInputStreamCtor = Options.emitInputStreamCtor;\n\n  String isImplementing;\n  String isExtending;\n  String className = \"Yylex\";\n  String functionName;\n  String tokenType;\n  String visibility = \"public\";\n    \n  List<String> ctorArgs = new ArrayList<String>();\n  List<String> ctorTypes = new ArrayList<String>();\n    \n  LexicalStates states = new LexicalStates();\n\n  List<Action> actions = new ArrayList<Action>();\n\n  private int nextState;\n\n  boolean macroDefinition;\n\n  Timer t = new Timer();\n\n  // CharClasses.init() is delayed until UnicodeProperties.init() has been called,\n  // since the max char code won't be known until then.\n  private CharClasses charClasses = new CharClasses();\n  \n  public CharClasses getCharClasses() {\n    return charClasses;\n  }\n\n  public int currentLine() {\n    return yyline;\n  }\n\n  public void setFile(File file) {\n    this.file = file;\n  }\n\n  private Symbol symbol(int type, Object value) {\n    return new Symbol(type, yyline, yycolumn, value);\n  }\n\n  private Symbol symbol(int type) {\n    return new Symbol(type, yyline, yycolumn);\n  }\n\n  // updates line and column count to the beginning of the first\n  // non whitespace character in yytext, but leaves yyline+yycolumn\n  // untouched\n  private Symbol symbol_countUpdate(int type, Object value) {\n     int lc = yyline;\n     int cc = yycolumn;\n     String text = yytext();\n\n     for (int i=0; i < text.length(); i++) {\n      char c = text.charAt(i);\n\n      if (c != '\\n' && c != '\\r' && c != ' ' && c != '\\t' )\n        return new Symbol(type, lc, cc, value);\n\n      if (c == '\\n') {\n        lc++;\n        cc = 0;\n      }\n      else\n        cc++;\n    }\n\n    return new Symbol(type, yyline, yycolumn, value);\n  }\n\n  private String makeMacroIdent() {\n    String matched = yytext().trim();\n    return matched.substring(1, matched.length()-1).trim();\n  }\n\n  public static String conc(Object a, Object b) {\n    if (a == null && b == null) return null;\n    if (a == null) return b.toString();\n    if (b == null) return a.toString();\n\n    return a.toString()+b.toString();\n  }\n\n  public static String concExc(Object a, Object b) {\n    if (a == null && b == null) return null;\n    if (a == null) return b.toString();\n    if (b == null) return a.toString();\n\n    return a.toString()+\", \"+b.toString();\n  }\n  \n  public UnicodeProperties getUnicodeProperties() {\n    return unicodeProperties;\n  }\n  \n  private void populateDefaultVersionUnicodeProperties() {\n    try {\n      unicodeProperties = new UnicodeProperties();\n    } catch (UnicodeProperties.UnsupportedUnicodeVersionException e) {\n      throw new ScannerException\n        (file, ErrorMessages.UNSUPPORTED_UNICODE_VERSION, yyline);\n    }\n    charClasses.init\n      (Options.jlex ? 127 : unicodeProperties.getMaximumCodePoint(), this);\n  }\n  \n  private void includeFile(String filePath) {\n    File f = new File(file.getParentFile(), filePath);\n    if ( !f.canRead() )\n      throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline);\n    // check for cycle\n    if (files.search(f) > 0)\n      throw new ScannerException(file,ErrorMessages.FILE_CYCLE, yyline);\n    try {\n      yypushStream( new FileReader(f) );\n      files.push(file);\n      file = f;\n      Out.println(\"Including \\\"\"+file+\"\\\"\");\n    }\n    catch (FileNotFoundException e) {\n      throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline);\n    }\n  }\n%}\n\n%init{\n  states.insert(\"YYINITIAL\", true);\n%init}\n\n\nDigit      = [0-9]\nHexDigit   = [0-9a-fA-F]\nOctDigit   = [0-7]\n\nNumber     = {Digit}+\nHexNumber  = \\\\ x {HexDigit} {2}\nOctNumber  = \\\\ [0-3]? {OctDigit} {1, 2}\n\n// Unicode4 can encode chars only in the BMP with the 16 bits provided by its\n// 4 hex digits.\nUnicode4  = \\\\ u {HexDigit} {4}\n\n// Unicode6 can encode all Unicode chars, both in the BMP and in the\n// supplementary planes -- only 21 bits are required as of Unicode 5.0,\n// but its six hex digits provide 24 bits.\nUnicode6  = \\\\ U {HexDigit} {6}\n\n// see http://www.unicode.org/unicode/reports/tr18/\nWSP        = [ \\t\\b]\nWSPNL      = [\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085\\t\\b\\ ]\nNWSPNL     = [^\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085\\t\\b\\ ]\nNL         = [\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085] | \\u000D\\u000A\nNNL        = [^\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085]\n\nIdent      = {IdentStart} {IdentPart}*\nQualIdent  = {Ident} ( {WSP}* \".\" {WSP}* {Ident} )*\nQUIL       = {QualIdent} ( {WSP}* \",\" {WSP}* {QualIdent} )*\nArray      = \"[\" {WSP}* \"]\"\nParamPart  = {IdentStart}|{IdentPart}|\"<\"|\">\"|\",\"|{WSP}|\"&\"|\"?\"|\".\"\nGenParam   = \"<\" {ParamPart}+ \">\"\nClassT     = {Ident} ({WSP}* {GenParam})?\nQClassT    = {QualIdent} ({WSP}* {GenParam})?\nArrType    = ({GenParam} {WSP}*)? {QClassT} ({WSP}* {Array})*\n\nIdentStart = [:jletter:]\nIdentPart  = [:jletterdigit:]\n\nJFlexCommentChar = [^*/]|\"/\"+[^*/]|\"*\"+[^*/]\nJFlexComment = {JFlexCommentChar}+\n\n/* Java comments */\nJavaComment = {TraditionalComment}|{EndOfLineComment}\nTraditionalComment = \"/*\"{CommentContent}\\*+\"/\"\nEndOfLineComment = \"//\".*{NL}\n\nCommentContent = ([^*]|\\*+[^*/])*\n\nStringCharacter = [^\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085\\\"\\\\]\n\nCharLiteral = \\'([^\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085\\'\\\\]|{EscapeSequence})\\'\nStringLiteral = \\\"({StringCharacter}|{EscapeSequence})*\\\"\n\nEscapeSequence = \\\\[^\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085]|\\\\+u{HexDigit}{4}|\\\\[0-3]?{OctDigit}{1,2}\n\n/* \\\\(b|t|n|f|r|\\\"|\\'|\\\\|[0-3]?{OctDigit}{1,2}|u{HexDigit}{4}) */\n\nJavaRest = [^\\{\\}\\\"\\'/]|\"/\"[^*/]\nJavaCode = ({JavaRest}|{StringLiteral}|{CharLiteral}|{JavaComment})+\n\nDottedVersion =  [1-9][0-9]*(\\.[0-9]+){0,2}\n\n%%\n\n<YYINITIAL> {\n  \"%%\".*{NL}?              {\n                             t.start();\n                             yybegin(MACROS);\n                             macroDefinition = true;\n                             return symbol(USERCODE,userCode);\n                           }\n  .*{NL} | .+              { userCode.append(yytext()); }\n  <<EOF>>                  { return symbol(EOF); }\n}\n\n<MACROS>   (\"%{\"|\"%init{\"|\"%initthrow{\"|\"%eof{\"|\"%eofthrow{\"|\"%yylexthrow{\"|\"%eofval{\").*{NL}\n                                     { string.setLength(0); yybegin(COPY); }\n<COPY> {\n  \"%}\".*{NL}                    { classCode = conc(classCode,string);  yybegin(MACROS);  }\n  \"%init}\".*{NL}                { initCode = conc(initCode,string);    yybegin(MACROS);  }\n  \"%initthrow}\".*{NL}           { initThrow = concExc(initThrow,string);  yybegin(MACROS); }\n  \"%eof}\".*{NL}                 { eofCode = conc(eofCode,string); yybegin(MACROS); }\n  \"%eofthrow}\".*{NL}            { eofThrow = concExc(eofThrow,string); yybegin(MACROS); }\n  \"%yylexthrow}\".*{NL}          { lexThrow = concExc(lexThrow,string); yybegin(MACROS); }\n  \"%eofval}\".*{NL}              { eofVal = string.toString(); yybegin(MACROS); }\n\n  .*{NL}                        { string.append(yytext()); }\n\n  <<EOF>>                       { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); }\n}\n\n\n<MACROS> ^\"%s\" (\"tate\" \"s\"?)? {WSP}+   { inclusive_states = true; yybegin(STATELIST); }\n<MACROS> ^\"%x\" (\"state\" \"s\"?)? {WSP}+  { inclusive_states = false; yybegin(STATELIST); }\n<STATELIST> {\n  {Ident}                             { states.insert(yytext(),inclusive_states); }\n  ([\\ \\t]*\",\"[\\ \\t]*)|([\\ \\t]+)       { }\n  {NL}                                { yybegin(MACROS);  }\n  <<EOF>>                       { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); }\n}\n\n<MACROS> {\n  \"%char\"                     { charCount = true;  }\n  \"%line\"                     { lineCount = true;  }\n  \"%column\"                   { columnCount = true; }\n  \"%byaccj\"                   { isInteger = true;\n                                if (eofVal == null)\n                                  eofVal = \"return 0;\";\n                                eofclose = true;\n                              }\n  \"%cup2\"                     { cup2Compatible = true;\n                                isImplementing = concExc(isImplementing, \"Scanner\");\n                                lineCount = true;\n                                columnCount = true;\n                                if (functionName == null)\n                                  functionName = \"readNextTerminal\";\n                                if (tokenType == null)\n                                  tokenType = \"ScannerToken<? extends Object>\";\n                                if (eofVal == null)\n                                  eofVal = \"return token(SpecialTerminals.EndOfInputStream);\";\n                                if (!Options.jlex) eofclose = true;\n                                return symbol(UNICODE); // %unicode\n                              }\n  \"%cup\"                      { cupCompatible = true;\n                                isImplementing = concExc(isImplementing, \"java_cup.runtime.Scanner\");\n                                if (functionName == null)\n                                  functionName = \"next_token\";\n                                if (tokenType == null)\n                                  tokenType = \"java_cup.runtime.Symbol\";\n                                if (eofVal == null)\n                                  eofVal = \"return new java_cup.runtime.Symbol(\"+cupSymbol+\".EOF);\";\n                                if (!Options.jlex) eofclose = true;\n                              }\n  \"%cupsym\"{WSP}+{QualIdent} {WSP}*  { cupSymbol = yytext().substring(8).trim();\n                                if (cupCompatible) Out.warning(ErrorMessages.CUPSYM_AFTER_CUP, yyline); }\n  \"%cupsym\"{WSP}+{NNL}*       { throw new ScannerException(file,ErrorMessages.QUIL_CUPSYM, yyline); }\n  \"%cupdebug\"                 { cupDebug = true; }\n  \"%eofclose\"({WSP}+\"true\")?  { eofclose = true; }\n  \"%eofclose\"({WSP}+\"false\")  { eofclose = false; }\n  \"%class\"{WSP}+{ClassT} {WSP}*     { className = yytext().substring(7).trim();  }\n  \"%ctorarg\"{WSP}+{ArrType}{WSP}+   { yybegin(CTOR_ARG); ctorTypes.add(yytext().substring(8).trim()); }\n  \"%function\"{WSP}+{Ident} {WSP}*   { functionName = yytext().substring(10).trim(); }\n  \"%type\"{WSP}+{ArrType} {WSP}*     { tokenType = yytext().substring(6).trim(); }\n  \"%integer\"|\"%int\"           { isInteger = true;  }\n  \"%intwrap\"                  { isIntWrap = true;  }\n  \"%yyeof\"                    { isYYEOF = true;  }\n  \"%notunix\"                  { notUnix = true;  }\n  \"%7bit\"                     { isASCII = true; return symbol(ASCII); }\n  \"%full\"|\"%8bit\"             { return symbol(FULL); }\n  \"%16bit\"                    { populateDefaultVersionUnicodeProperties();\n                                return symbol(UNICODE);\n                              }\n  \"%unicode\"({WSP}+{DottedVersion})? { String v = yytext().substring(8).trim();\n                                       if (v.length() == 0) {\n                                         populateDefaultVersionUnicodeProperties();\n                                       } else {\n                                         try {\n                                           unicodeProperties = new UnicodeProperties(v);\n                                         } catch (UnicodeProperties.UnsupportedUnicodeVersionException e) {\n                                           throw new ScannerException\n                                             (file, ErrorMessages.UNSUPPORTED_UNICODE_VERSION, yyline);\n                                         }\n                                         charClasses.init\n                                           (Options.jlex ? 127 : unicodeProperties.getMaximumCodePoint(), this);\n                                       }\n                                       return symbol(UNICODE);\n                                     }\n\n  \"%caseless\"|\"%ignorecase\"   { caseless = true; }\n  \"%implements\"{WSP}+.*       { isImplementing = concExc(isImplementing, yytext().substring(12).trim());  }\n  \"%extends\"{WSP}+{QClassT}{WSP}* { isExtending = yytext().substring(9).trim(); }\n  \"%public\"                   { isPublic = true; }\n  \"%apiprivate\"               { visibility = \"private\"; Skeleton.makePrivate(); }\n  \"%final\"                    { isFinal = true; }\n  \"%abstract\"                 { isAbstract = true; }\n  \"%debug\"                    { debugOption = true; }\n  \"%standalone\"               { standalone = true; isInteger = true; }\n  \"%pack\"                     { /* no-op - this is the only generation method */ }\n  \"%include\" {WSP}+ .*        { includeFile(yytext().substring(9).trim()); }\n  \"%buffer\" {WSP}+ {Number} {WSP}*   { bufferSize = Integer.parseInt(yytext().substring(8).trim()); }\n  \"%buffer\" {WSP}+ {NNL}*     { throw new ScannerException(file,ErrorMessages.NO_BUFFER_SIZE, yyline); }\n  \"%initthrow\" {WSP}+ {QUIL} {WSP}* { initThrow = concExc(initThrow,yytext().substring(11).trim()); }\n  \"%initthrow\" {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_INITTHROW, yyline); }\n  \"%eofthrow\"  {WSP}+ {QUIL} {WSP}*  { eofThrow = concExc(eofThrow,yytext().substring(10).trim()); }\n  \"%eofthrow\"  {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_EOFTHROW, yyline); }\n  \"%yylexthrow\"{WSP}+ {QUIL} {WSP}*  { lexThrow = concExc(lexThrow,yytext().substring(12).trim()); }\n  \"%throws\"    {WSP}+ {QUIL} {WSP}*  { lexThrow = concExc(lexThrow,yytext().substring(8).trim()); }\n  \"%yylexthrow\"{WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_YYLEXTHROW, yyline); }\n  \"%throws\"    {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_THROW, yyline); }\n  \"%scanerror\" {WSP}+ {QualIdent} {WSP}* { scanErrorException = yytext().substring(11).trim(); }\n  \"%scanerror\" {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_SCANERROR, yyline); }\n// TODO: In the version of JFlex after 1.6, the %inputstreamctor directive will become a no-op: the InputStream ctor will never be emitted.  \n  \"%inputstreamctor\"({WSP}+\"true\")? { emitInputStreamCtor = true; }  \n  \"%inputstreamctor\"{WSP}+\"false\"   { emitInputStreamCtor = false; }\n\n  {Ident}                     { return symbol(IDENT, yytext()); }\n  \"=\"{WSP}*                   { if (null == unicodeProperties && ! isASCII) {\n                                  populateDefaultVersionUnicodeProperties();\n                                }\n                                yybegin(REGEXP); \n                                return symbol(EQUALS); \n                              }\n\n  \"/*\"                        { nextState = MACROS; yybegin(COMMENT); }\n\n  {EndOfLineComment}          { }\n\n  ^\"%%\" {NNL}*                { if (null == unicodeProperties && ! isASCII) {\n                                  populateDefaultVersionUnicodeProperties();\n                                }\n                                macroDefinition = false; \n                                yybegin(REGEXPSTART);\n                                return symbol(DELIMITER); \n                              }\n  \"%\"{Ident}                  { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); }\n  \"%\"                         { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); }\n  ^{WSP}+\"%\"                  { Out.warning(ErrorMessages.NOT_AT_BOL, yyline); yypushback(1); }\n\n  {WSP}+                      { }\n  {NL}+                       { }\n  <<EOF>>                     { if ( yymoreStreams() ) {\n                                  file = (File) files.pop();\n                                  yypopStream();\n                                }\n                                else\n                                  throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS);\n                              }\n}\n\n<CTOR_ARG> {\n  {Ident} {WSP}*   { yybegin(MACROS); ctorArgs.add(yytext().trim()); }\n  [^]              { throw new ScannerException(file,ErrorMessages.CTOR_ARG,yyline,yycolumn); }\n}\n\n<REGEXPSTART> {\n  ^ {WSP}* \"%include\" {WSP}+ .*  { includeFile(yytext().trim().substring(9).trim()); }\n  {WSP}* \"/*\"                    { nextState = REGEXPSTART; yybegin(COMMENT); }\n  {WSP}* \"<\"                     { yybegin(STATES); return symbol_countUpdate(LESSTHAN, null); }\n  {WSP}* \"}\"                     { return symbol_countUpdate(RBRACE, null); }\n  {WSP}* \"//\" {NNL}*             { }\n  {WSP}* \"<<EOF>>\" {WSPNL}* \"{\"  { actionText.setLength(0); yybegin(JAVA_CODE);\n                                   Symbol s = symbol_countUpdate(EOFRULE, null);\n                                   action_line = s.left+1;\n                                   return s;\n                                 }\n  ^ {WSP}* {NWSPNL}              { yypushback(yylength()); yybegin(REGEXP); }\n  {WSP} | {NL}                   { }\n}\n\n<STATES> {\n  {Ident}                     { return symbol(IDENT, yytext()); }\n  \",\"                         { return symbol(COMMA); }\n  {WSPNL}+                    { }\n\n  // \"{\" will be caught in REGEXP\n  \">\"{WSPNL}*                 { yybegin(REGEXP); return symbol(MORETHAN); }\n\n  <<EOF>>                     { throw new ScannerException(file,ErrorMessages.EOF_IN_STATES); }\n}\n\n\n<REGEXP> {\n  \"<<EOF>>\" {WSPNL}+ \"{\"  { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(EOFRULE); }\n  \"<<EOF>>\"               { throw new ScannerException(file,ErrorMessages.EOF_WO_ACTION); }\n\n  {WSPNL}*\"|\"{WSP}*$      { if (macroDefinition) {\n                              yybegin(EATWSPNL);\n                              return symbol(BAR);\n                            }\n                            else {\n                              yybegin(REGEXPSTART);\n                              return symbol(NOACTION);\n                            }\n                          }\n\n  // stategroup\n  \"{\"            { yybegin(REGEXPSTART); return symbol(LBRACE); }\n\n  {WSPNL}*\"|\"    { return symbol(BAR); }\n\n  {WSPNL}*\\\"     { string.setLength(0); nextState = REGEXP; yybegin(STRING_CONTENT); }\n  {WSPNL}*\"\\\\u{\" { string.setLength(0); yybegin(REGEXP_CODEPOINT_SEQUENCE); }\n  {WSPNL}*\"!\"    { return symbol(BANG); }\n  {WSPNL}*\"~\"    { return symbol(TILDE); }\n  {WSPNL}*\"(\"    { return symbol(OPENBRACKET); }\n  {WSPNL}*\")\"    { return symbol(CLOSEBRACKET); }\n  {WSPNL}*\"*\"    { return symbol(STAR); }\n  {WSPNL}*\"+\"    { return symbol(PLUS); }\n  {WSPNL}*\"?\"    { return symbol(QUESTION); }\n  {WSPNL}*\"$\"    { return symbol(DOLLAR); }\n  {WSPNL}*\"^\"    { bolUsed = true; return symbol(HAT); }\n  {WSPNL}*\".\"    { return symbol(POINT); }\n  {WSPNL}*\"\\\\R\"  { return symbol(NEWLINE); }\n  {WSPNL}*\"[\"    { yybegin(CHARCLASS); return symbol(OPENCLASS); }\n  {WSPNL}*\"/\"    { return symbol(LOOKAHEAD); }\n  \n  {WSPNL}* \"{\" {WSP}* {Ident} {WSP}* \"}\" { return symbol_countUpdate(MACROUSE, makeMacroIdent()); }\n  {WSPNL}* \"{\" {WSP}* {Number}   { yybegin(REPEATEXP); \n                                   return symbol(REPEAT, \n                                                 new Integer(yytext().trim().substring(1).trim())); \n                                 }\n\n  {WSPNL}+ \"{\"    { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(REGEXPEND); }\n  {NL}            { if (macroDefinition) { yybegin(MACROS); } return symbol(REGEXPEND); }\n\n  {WSPNL}*\"/*\"    { nextState = REGEXP; yybegin(COMMENT); }\n\n  {WSPNL}*\"//\"{NNL}*  { }\n\n  {WSP}+          { }\n\n  <CHARCLASS> {\n    {WSPNL}*\"[:jletter:]\"      { return symbol(JLETTERCLASS); }\n    {WSPNL}*\"[:jletterdigit:]\" { return symbol(JLETTERDIGITCLASS); }\n    {WSPNL}*\"[:letter:]\"       { return symbol(LETTERCLASS); }\n    {WSPNL}*\"[:uppercase:]\"    { return symbol(UPPERCLASS); }\n    {WSPNL}*\"[:lowercase:]\"    { return symbol(LOWERCLASS); }\n    {WSPNL}*\"[:digit:]\"        { return symbol(DIGITCLASS); }\n    {WSPNL}*\"\\\\d\"              { return symbol(DIGITCLASS); }\n    {WSPNL}*\"\\\\D\"              { return symbol(DIGITCLASSNOT); }\n    {WSPNL}*\"\\\\s\"              { return symbol(WHITESPACECLASS); }\n    {WSPNL}*\"\\\\S\"              { return symbol(WHITESPACECLASSNOT); }\n    {WSPNL}*\"\\\\w\"              { return symbol(WORDCLASS); }\n    {WSPNL}*\"\\\\W\"              { return symbol(WORDCLASSNOT); }\n    {WSPNL}*\"\\\\p{\"[^}]*\"}\"     { String trimmedText = yytext().trim();\n                                 String propertyValue = trimmedText.substring(3,trimmedText.length()-1);\n                                 IntCharSet set = unicodeProperties.getIntCharSet(propertyValue);\n                                 if (null == set) {\n                                   throw new ScannerException(file,ErrorMessages.INVALID_UNICODE_PROPERTY, yyline, yycolumn + 3);\n                                 }\n                                 return symbol(UNIPROPCCLASS, set);\n                               }\n    {WSPNL}*\"\\\\P{\"[^}]*\"}\"     { String trimmedText = yytext().trim();\n                                 String propertyValue = trimmedText.substring(3,trimmedText.length()-1);\n                                 IntCharSet set = unicodeProperties.getIntCharSet(propertyValue);\n                                 if (null == set) {\n                                   throw new ScannerException(file,ErrorMessages.INVALID_UNICODE_PROPERTY, yyline, yycolumn + 3);\n                                 }\n                                 return symbol(UNIPROPCCLASSNOT, set);\n                               }\n  }\n\n  . { return symbol(CHAR, yytext().codePointAt(0)); }\n}\n\n<EATWSPNL> {WSPNL}+  { yybegin(REGEXP); }\n\n\n<REPEATEXP> {\n  \"}\"          { yybegin(REGEXP); return symbol(RBRACE); }\n  \",\" {WSP}* {Number}  { return symbol(REPEAT, new Integer(yytext().substring(1).trim())); }\n  {WSP}+       { }\n\n  <<EOF>>                 { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); }\n}\n\n<CHARCLASS> {\n  \"{\"{Ident}\"}\" { return symbol(MACROUSE, yytext().substring(1,yylength()-1)); }\n  \"[\"     { balance++; return symbol(OPENCLASS); }\n  \"]\"     { if (balance > 0) balance--; else yybegin(REGEXP); return symbol(CLOSECLASS); }\n  \"^\"     { return symbol(HAT); }\n  \"-\"     { return symbol(DASH); }\n  \"--\"    { return symbol(DIFFERENCE); }\n  \"&&\"    { return symbol(INTERSECTION); }\n  \"||\"    { /* union is the default operation - '||' can be ignored */ }\n  \"~~\"    { return symbol(SYMMETRICDIFFERENCE); }\n  \"\\\\u{\"  { yybegin(CHARCLASS_CODEPOINT); }\n\n  // this is a hack to keep JLex compatibilty with char class\n  // expressions like [+-]\n  \"-]\"    { yypushback(1); yycolumn--; return symbol(CHAR, (int)'-'); }\n\n  \\\"      { string.setLength(0); nextState = CHARCLASS; yybegin(STRING_CONTENT); }\n\n  .       { return symbol(CHAR, yytext().codePointAt(0)); }\n\n  \\n      { throw new ScannerException(file,ErrorMessages.EOL_IN_CHARCLASS,yyline,yycolumn); }\n\n  <<EOF>> { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); }\n}\n\n<STRING_CONTENT> {\n  \\\"       { yybegin(nextState); return symbol(STRING, string.toString()); }\n  \\\\\\\"     { string.append('\\\"'); }\n  [^\\\"\\\\\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085]+ { string.append(yytext()); }\n\n  {NL}     { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn); }\n\n  {HexNumber} { string.append( (char) Integer.parseInt(yytext().substring(2,yylength()), 16)); }\n  {OctNumber} { string.append( (char) Integer.parseInt(yytext().substring(1,yylength()), 8)); }\n  {Unicode4}  { string.append( (char) Integer.parseInt(yytext().substring(2,yylength()), 16)); }\n  {Unicode6}  { int codePoint = Integer.parseInt(yytext().substring(2,yylength()), 16);\n                if (codePoint <= unicodeProperties.getMaximumCodePoint()) {\n                  string.append(Character.toChars(codePoint));\n                } else {\n                  throw new ScannerException(file,ErrorMessages.CODEPOINT_OUT_OF_RANGE, yyline, yycolumn+2);\n                }\n              }\n  \n  \"\\\\u{\"      { yybegin(STRING_CODEPOINT_SEQUENCE); }\n\n  \\\\b { string.append('\\b'); }\n  \\\\n { string.append('\\n'); }\n  \\\\t { string.append('\\t'); }\n  \\\\f { string.append('\\f'); }\n  \\\\r { string.append('\\r'); }\n\n  \\\\. { string.append(yytext().substring(1, yytext().offsetByCodePoints(1, 1))); }\n\n  <<EOF>>     { throw new ScannerException(file,ErrorMessages.EOF_IN_STRING); }\n}\n\n\n<REGEXP, CHARCLASS> {\n  {HexNumber} { return symbol(CHAR, Integer.parseInt(yytext().substring(2,yylength()), 16)); }\n  {OctNumber} { return symbol(CHAR, Integer.parseInt(yytext().substring(1,yylength()), 8)); }\n  {Unicode4}  { return symbol(CHAR, Integer.parseInt(yytext().substring(2,yylength()), 16)); }\n  {Unicode6}  { int codePoint = Integer.parseInt(yytext().substring(2,yylength()), 16);\n                if (codePoint <= unicodeProperties.getMaximumCodePoint()) {\n                  return symbol(CHAR, codePoint);\n                } else {\n                  throw new ScannerException(file,ErrorMessages.CODEPOINT_OUT_OF_RANGE, yyline, yycolumn+2);\n                }\n              }\n\n  \\\\b { return symbol(CHAR, (int)'\\b'); }\n  \\\\n { return symbol(CHAR, (int)'\\n'); }\n  \\\\t { return symbol(CHAR, (int)'\\t'); }\n  \\\\f { return symbol(CHAR, (int)'\\f'); }\n  \\\\r { return symbol(CHAR, (int)'\\r'); }\n\n  \\\\. { return symbol(CHAR, yytext().codePointAt(1)); }\n}\n\n\n<JAVA_CODE> {\n  \"{\"        { balance++; actionText.append('{'); }\n  \"}\"        { if (balance > 0) {\n                 balance--;\n                 actionText.append('}');\n               }\n               else {\n                 yybegin(REGEXPSTART);\n                 Action a = new Action(actionText.toString(), action_line);\n                 actions.add(a);\n                 return symbol(ACTION, a);\n               }\n             }\n\n  {JavaCode}     { actionText.append(yytext()); }\n\n  <<EOF>>     { throw new ScannerException(file,ErrorMessages.EOF_IN_ACTION, action_line-1); }\n}\n\n<COMMENT> {\n\n  \"/\"+ \"*\"  { commentbalance++; }\n  \"*\"+ \"/\"  { if (commentbalance > 0)\n                commentbalance--;\n              else\n                yybegin(nextState);\n            }\n\n  {JFlexComment} { /* ignore */ }\n\n  <<EOF>>     { throw new ScannerException(file,ErrorMessages.EOF_IN_COMMENT); }\n}\n\n<REGEXP_CODEPOINT_SEQUENCE> {\n  \"}\"             { yybegin(REGEXP); return symbol(STRING, string.toString()); }\n  {HexDigit}{1,6} { int codePoint = Integer.parseInt(yytext(), 16);\n                    if (codePoint <= unicodeProperties.getMaximumCodePoint()) {\n                      string.append(Character.toChars(codePoint));\n                    } else {\n                      throw new ScannerException(file,ErrorMessages.CODEPOINT_OUT_OF_RANGE, yyline, yycolumn);\n                    }\n                  }\n  {WSPNL}+        { }\n  <<EOF>>         { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); }\n}\n\n<STRING_CODEPOINT_SEQUENCE> { // Specialized form: newlines disallowed, and doesn't return a symbol\n  \"}\"             { yybegin(STRING_CONTENT); }\n  {HexDigit}{1,6} { int codePoint = Integer.parseInt(yytext(), 16);\n                    if (codePoint <= unicodeProperties.getMaximumCodePoint()) {\n                      string.append(Character.toChars(codePoint));\n                    } else {\n                      throw new ScannerException(file, ErrorMessages.CODEPOINT_OUT_OF_RANGE, yyline, yycolumn);\n                    }\n                  }\n  {NL}            { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn); }\n  {WSP}+          { }\n  <<EOF>>         { throw new ScannerException(file,ErrorMessages.EOF_IN_STRING); }\n}\n\n<CHARCLASS_CODEPOINT> { // Specialized form: only one codepoint allowed, no whitespace allowed\n  {HexDigit}{1,6} \"}\" { int codePoint = Integer.parseInt(yytext().substring(0, yylength() - 1), 16);\n                        if (codePoint <= unicodeProperties.getMaximumCodePoint()) {\n                          yybegin(CHARCLASS);\n                          return symbol(CHAR, codePoint);\n                        } else {\n                          throw new ScannerException(file, ErrorMessages.CODEPOINT_OUT_OF_RANGE, yyline, yycolumn);\n                        }\n                      }\n  <<EOF>>             { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); }\n}\n\n.  { throw new ScannerException(file,ErrorMessages.UNEXPECTED_CHAR, yyline, yycolumn); }\n\\R { throw new ScannerException(file,ErrorMessages.UNEXPECTED_NL, yyline, yycolumn); }\n\n<<EOF>>  { if ( yymoreStreams() ) {\n             file = (File) files.pop();\n             yypopStream();\n           }\n           else {\n             return symbol(EOF);\n           }\n         }\n"
  },
  {
    "path": "src/test/resources/samples/langs/JFlex/java.jflex",
    "content": "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Copyright (C) 1998-2015  Gerwin Klein <lsf@jflex.de>                    *\n * All rights reserved.                                                    *\n *                                                                         *\n * License: BSD                                                            *\n *                                                                         *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* Java 1.2 language lexer specification */\n\n/* Use together with unicode.flex for Unicode preprocesssing */\n/* and java12.cup for a Java 1.2 parser                      */\n\n/* Note that this lexer specification is not tuned for speed.\n   It is in fact quite slow on integer and floating point literals, \n   because the input is read twice and the methods used to parse\n   the numbers are not very fast. \n   For a production quality application (e.g. a Java compiler) \n   this could be optimized */\n\n\nimport java_cup.runtime.*;\n\n%%\n\n%public\n%class Scanner\n%implements sym\n\n%unicode\n\n%line\n%column\n\n%cup\n%cupdebug\n\n%{\n  StringBuilder string = new StringBuilder();\n  \n  private Symbol symbol(int type) {\n    return new JavaSymbol(type, yyline+1, yycolumn+1);\n  }\n\n  private Symbol symbol(int type, Object value) {\n    return new JavaSymbol(type, yyline+1, yycolumn+1, value);\n  }\n\n  /** \n   * assumes correct representation of a long value for \n   * specified radix in scanner buffer from <code>start</code> \n   * to <code>end</code> \n   */\n  private long parseLong(int start, int end, int radix) {\n    long result = 0;\n    long digit;\n\n    for (int i = start; i < end; i++) {\n      digit  = Character.digit(yycharat(i),radix);\n      result*= radix;\n      result+= digit;\n    }\n\n    return result;\n  }\n%}\n\n/* main character classes */\nLineTerminator = \\r|\\n|\\r\\n\nInputCharacter = [^\\r\\n]\n\nWhiteSpace = {LineTerminator} | [ \\t\\f]\n\n/* comments */\nComment = {TraditionalComment} | {EndOfLineComment} | \n          {DocumentationComment}\n\nTraditionalComment = \"/*\" [^*] ~\"*/\" | \"/*\" \"*\"+ \"/\"\nEndOfLineComment = \"//\" {InputCharacter}* {LineTerminator}?\nDocumentationComment = \"/*\" \"*\"+ [^/*] ~\"*/\"\n\n/* identifiers */\nIdentifier = [:jletter:][:jletterdigit:]*\n\n/* integer literals */\nDecIntegerLiteral = 0 | [1-9][0-9]*\nDecLongLiteral    = {DecIntegerLiteral} [lL]\n\nHexIntegerLiteral = 0 [xX] 0* {HexDigit} {1,8}\nHexLongLiteral    = 0 [xX] 0* {HexDigit} {1,16} [lL]\nHexDigit          = [0-9a-fA-F]\n\nOctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15}\nOctLongLiteral    = 0+ 1? {OctDigit} {1,21} [lL]\nOctDigit          = [0-7]\n    \n/* floating point literals */        \nFloatLiteral  = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? [fF]\nDoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}?\n\nFLit1    = [0-9]+ \\. [0-9]* \nFLit2    = \\. [0-9]+ \nFLit3    = [0-9]+ \nExponent = [eE] [+-]? [0-9]+\n\n/* string and character literals */\nStringCharacter = [^\\r\\n\\\"\\\\]\nSingleCharacter = [^\\r\\n\\'\\\\]\n\n%state STRING, CHARLITERAL\n\n%%\n\n<YYINITIAL> {\n\n  /* keywords */\n  \"abstract\"                     { return symbol(ABSTRACT); }\n  \"boolean\"                      { return symbol(BOOLEAN); }\n  \"break\"                        { return symbol(BREAK); }\n  \"byte\"                         { return symbol(BYTE); }\n  \"case\"                         { return symbol(CASE); }\n  \"catch\"                        { return symbol(CATCH); }\n  \"char\"                         { return symbol(CHAR); }\n  \"class\"                        { return symbol(CLASS); }\n  \"const\"                        { return symbol(CONST); }\n  \"continue\"                     { return symbol(CONTINUE); }\n  \"do\"                           { return symbol(DO); }\n  \"double\"                       { return symbol(DOUBLE); }\n  \"else\"                         { return symbol(ELSE); }\n  \"extends\"                      { return symbol(EXTENDS); }\n  \"final\"                        { return symbol(FINAL); }\n  \"finally\"                      { return symbol(FINALLY); }\n  \"float\"                        { return symbol(FLOAT); }\n  \"for\"                          { return symbol(FOR); }\n  \"default\"                      { return symbol(DEFAULT); }\n  \"implements\"                   { return symbol(IMPLEMENTS); }\n  \"import\"                       { return symbol(IMPORT); }\n  \"instanceof\"                   { return symbol(INSTANCEOF); }\n  \"int\"                          { return symbol(INT); }\n  \"interface\"                    { return symbol(INTERFACE); }\n  \"long\"                         { return symbol(LONG); }\n  \"native\"                       { return symbol(NATIVE); }\n  \"new\"                          { return symbol(NEW); }\n  \"goto\"                         { return symbol(GOTO); }\n  \"if\"                           { return symbol(IF); }\n  \"public\"                       { return symbol(PUBLIC); }\n  \"short\"                        { return symbol(SHORT); }\n  \"super\"                        { return symbol(SUPER); }\n  \"switch\"                       { return symbol(SWITCH); }\n  \"synchronized\"                 { return symbol(SYNCHRONIZED); }\n  \"package\"                      { return symbol(PACKAGE); }\n  \"private\"                      { return symbol(PRIVATE); }\n  \"protected\"                    { return symbol(PROTECTED); }\n  \"transient\"                    { return symbol(TRANSIENT); }\n  \"return\"                       { return symbol(RETURN); }\n  \"void\"                         { return symbol(VOID); }\n  \"static\"                       { return symbol(STATIC); }\n  \"while\"                        { return symbol(WHILE); }\n  \"this\"                         { return symbol(THIS); }\n  \"throw\"                        { return symbol(THROW); }\n  \"throws\"                       { return symbol(THROWS); }\n  \"try\"                          { return symbol(TRY); }\n  \"volatile\"                     { return symbol(VOLATILE); }\n  \"strictfp\"                     { return symbol(STRICTFP); }\n  \n  /* boolean literals */\n  \"true\"                         { return symbol(BOOLEAN_LITERAL, true); }\n  \"false\"                        { return symbol(BOOLEAN_LITERAL, false); }\n  \n  /* null literal */\n  \"null\"                         { return symbol(NULL_LITERAL); }\n  \n  \n  /* separators */\n  \"(\"                            { return symbol(LPAREN); }\n  \")\"                            { return symbol(RPAREN); }\n  \"{\"                            { return symbol(LBRACE); }\n  \"}\"                            { return symbol(RBRACE); }\n  \"[\"                            { return symbol(LBRACK); }\n  \"]\"                            { return symbol(RBRACK); }\n  \";\"                            { return symbol(SEMICOLON); }\n  \",\"                            { return symbol(COMMA); }\n  \".\"                            { return symbol(DOT); }\n  \n  /* operators */\n  \"=\"                            { return symbol(EQ); }\n  \">\"                            { return symbol(GT); }\n  \"<\"                            { return symbol(LT); }\n  \"!\"                            { return symbol(NOT); }\n  \"~\"                            { return symbol(COMP); }\n  \"?\"                            { return symbol(QUESTION); }\n  \":\"                            { return symbol(COLON); }\n  \"==\"                           { return symbol(EQEQ); }\n  \"<=\"                           { return symbol(LTEQ); }\n  \">=\"                           { return symbol(GTEQ); }\n  \"!=\"                           { return symbol(NOTEQ); }\n  \"&&\"                           { return symbol(ANDAND); }\n  \"||\"                           { return symbol(OROR); }\n  \"++\"                           { return symbol(PLUSPLUS); }\n  \"--\"                           { return symbol(MINUSMINUS); }\n  \"+\"                            { return symbol(PLUS); }\n  \"-\"                            { return symbol(MINUS); }\n  \"*\"                            { return symbol(MULT); }\n  \"/\"                            { return symbol(DIV); }\n  \"&\"                            { return symbol(AND); }\n  \"|\"                            { return symbol(OR); }\n  \"^\"                            { return symbol(XOR); }\n  \"%\"                            { return symbol(MOD); }\n  \"<<\"                           { return symbol(LSHIFT); }\n  \">>\"                           { return symbol(RSHIFT); }\n  \">>>\"                          { return symbol(URSHIFT); }\n  \"+=\"                           { return symbol(PLUSEQ); }\n  \"-=\"                           { return symbol(MINUSEQ); }\n  \"*=\"                           { return symbol(MULTEQ); }\n  \"/=\"                           { return symbol(DIVEQ); }\n  \"&=\"                           { return symbol(ANDEQ); }\n  \"|=\"                           { return symbol(OREQ); }\n  \"^=\"                           { return symbol(XOREQ); }\n  \"%=\"                           { return symbol(MODEQ); }\n  \"<<=\"                          { return symbol(LSHIFTEQ); }\n  \">>=\"                          { return symbol(RSHIFTEQ); }\n  \">>>=\"                         { return symbol(URSHIFTEQ); }\n  \n  /* string literal */\n  \\\"                             { yybegin(STRING); string.setLength(0); }\n\n  /* character literal */\n  \\'                             { yybegin(CHARLITERAL); }\n\n  /* numeric literals */\n\n  /* This is matched together with the minus, because the number is too big to \n     be represented by a positive integer. */\n  \"-2147483648\"                  { return symbol(INTEGER_LITERAL, new Integer(Integer.MIN_VALUE)); }\n  \n  {DecIntegerLiteral}            { return symbol(INTEGER_LITERAL, new Integer(yytext())); }\n  {DecLongLiteral}               { return symbol(INTEGER_LITERAL, new Long(yytext().substring(0,yylength()-1))); }\n  \n  {HexIntegerLiteral}            { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(2, yylength(), 16))); }\n  {HexLongLiteral}               { return symbol(INTEGER_LITERAL, new Long(parseLong(2, yylength()-1, 16))); }\n \n  {OctIntegerLiteral}            { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(0, yylength(), 8))); }  \n  {OctLongLiteral}               { return symbol(INTEGER_LITERAL, new Long(parseLong(0, yylength()-1, 8))); }\n  \n  {FloatLiteral}                 { return symbol(FLOATING_POINT_LITERAL, new Float(yytext().substring(0,yylength()-1))); }\n  {DoubleLiteral}                { return symbol(FLOATING_POINT_LITERAL, new Double(yytext())); }\n  {DoubleLiteral}[dD]            { return symbol(FLOATING_POINT_LITERAL, new Double(yytext().substring(0,yylength()-1))); }\n  \n  /* comments */\n  {Comment}                      { /* ignore */ }\n\n  /* whitespace */\n  {WhiteSpace}                   { /* ignore */ }\n\n  /* identifiers */ \n  {Identifier}                   { return symbol(IDENTIFIER, yytext()); }  \n}\n\n<STRING> {\n  \\\"                             { yybegin(YYINITIAL); return symbol(STRING_LITERAL, string.toString()); }\n  \n  {StringCharacter}+             { string.append( yytext() ); }\n  \n  /* escape sequences */\n  \"\\\\b\"                          { string.append( '\\b' ); }\n  \"\\\\t\"                          { string.append( '\\t' ); }\n  \"\\\\n\"                          { string.append( '\\n' ); }\n  \"\\\\f\"                          { string.append( '\\f' ); }\n  \"\\\\r\"                          { string.append( '\\r' ); }\n  \"\\\\\\\"\"                         { string.append( '\\\"' ); }\n  \"\\\\'\"                          { string.append( '\\'' ); }\n  \"\\\\\\\\\"                         { string.append( '\\\\' ); }\n  \\\\[0-3]?{OctDigit}?{OctDigit}  { char val = (char) Integer.parseInt(yytext().substring(1),8);\n                        \t\t\t\t   string.append( val ); }\n  \n  /* error cases */\n  \\\\.                            { throw new RuntimeException(\"Illegal escape sequence \\\"\"+yytext()+\"\\\"\"); }\n  {LineTerminator}               { throw new RuntimeException(\"Unterminated string at end of line\"); }\n}\n\n<CHARLITERAL> {\n  {SingleCharacter}\\'            { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, yytext().charAt(0)); }\n  \n  /* escape sequences */\n  \"\\\\b\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\b');}\n  \"\\\\t\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\t');}\n  \"\\\\n\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\n');}\n  \"\\\\f\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\f');}\n  \"\\\\r\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\r');}\n  \"\\\\\\\"\"\\'                       { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\\"');}\n  \"\\\\'\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\'');}\n  \"\\\\\\\\\"\\'                       { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\\\'); }\n  \\\\[0-3]?{OctDigit}?{OctDigit}\\' { yybegin(YYINITIAL); \n\t\t\t                              int val = Integer.parseInt(yytext().substring(1,yylength()-1),8);\n\t\t\t                            return symbol(CHARACTER_LITERAL, (char)val); }\n  \n  /* error cases */\n  \\\\.                            { throw new RuntimeException(\"Illegal escape sequence \\\"\"+yytext()+\"\\\"\"); }\n  {LineTerminator}               { throw new RuntimeException(\"Unterminated character literal at end of line\"); }\n}\n\n/* error fallback */\n[^]                              { throw new RuntimeException(\"Illegal character \\\"\"+yytext()+\n                                                              \"\\\" at line \"+yyline+\", column \"+yycolumn); }\n<<EOF>>                          { return symbol(EOF); }"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/Git Commit.JSON-tmLanguage",
    "content": "{\n\t\"name\": \"Git Commit Message\",\n\t\"scopeName\": \"text.git-commit\",\n\t\"fileTypes\": [\n\t\t\"COMMIT_EDITMSG\"\n\t],\n\t\"patterns\": [\n\t\t{\n\t\t\t\"name\": \"comment.line.number-sign.git-commit-message\",\n\t\t\t\"begin\": \"^#\",\n\t\t\t\"beginCaptures\": {\n\t\t\t\t\"0\": {\n\t\t\t\t\t\"name\": \"punctuation.definition.comment.git-commit-message\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"end\": \"$\",\n\t\t\t\"patterns\": [\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"comment.line.on-branch.git-commit-message\",\n\t\t\t\t\t\"match\": \"(?:On branch )([^ ]+)\",\n\t\t\t\t\t\"captures\": {\n\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\t\"name\": \"support.function.branch.git-commit-message\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"comment.line.on-branch.git-commit-message\",\n\t\t\t\t\t\"match\": \"Your branch .* '([^ ']+)'\",\n\t\t\t\t\t\"captures\": {\n\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\t\"name\": \"support.function.branch.git-commit-message\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"comment.line.untracked.git-commit-message\",\n\t\t\t\t\t\"begin\": \" Untracked files:\",\n\t\t\t\t\t\"beginCaptures\": {\n\t\t\t\t\t\t\"0\": {\n\t\t\t\t\t\t\t\"name\": \"entity.definition.untracked.git-commit-message\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"end\": \"^#$\",\n\t\t\t\t\t\"patterns\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"name\": \"comment.line.untracked-file.git-commit-message\",\n\t\t\t\t\t\t\t\"match\": \"\\t(.*)$\",\n\t\t\t\t\t\t\t\"captures\": {\n\t\t\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"support.function.file-status.git-commit-message\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"2\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"constant.character.branch.git-commit-message\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"comment.line.discarded.git-commit-message\",\n\t\t\t\t\t\"begin\": \" Change(?:s not staged for commit|d but not updated):\",\n\t\t\t\t\t\"beginCaptures\": {\n\t\t\t\t\t\t\"0\": {\n\t\t\t\t\t\t\t\"name\": \"entity.definition.discarded.git-commit-message\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"end\": \"^#$\",\n\t\t\t\t\t\"patterns\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"name\": \"comment.line.discarded.git-commit-message\",\n\t\t\t\t\t\t\t\"match\": \"\\t([^:]+):(.*)$\",\n\t\t\t\t\t\t\t\"captures\": {\n\t\t\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"support.function.file-status.git-commit-message\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"2\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"constant.character.branch.git-commit-message\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"comment.line.selected.git-commit-message\",\n\t\t\t\t\t\"begin\": \" Changes to be committed:\",\n\t\t\t\t\t\"beginCaptures\": {\n\t\t\t\t\t\t\"0\": {\n\t\t\t\t\t\t\t\"name\": \"entity.definition.selected.git-commit-message\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"end\": \"^#$\",\n\t\t\t\t\t\"patterns\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"name\": \"comment.line.selected.git-commit-message\",\n\t\t\t\t\t\t\t\"match\": \"\\t([^:]+):(.*)$\",\n\t\t\t\t\t\t\t\"captures\": {\n\t\t\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"support.function.file-status.git-commit-message\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"2\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"constant.character.branch.git-commit-message\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"meta.diff.git-commit\",\n\t\t\t\"comment\": \"diff at the end of the commit message when using commit -v, or viewing a log. End pattern is just something to be never matched so that the meta continues untill the end of the file.\",\n\t\t\t\"begin\": \"diff\\\\ \\\\-\\\\-git\",\n\t\t\t\"end\": \"(?=xxxxxx)123457\",\n\t\t\t\"patterns\": [\n\t\t\t\t{\n\t\t\t\t\t\"include\": \"source.diff\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t],\n\t\"uuid\": \"de3fb2fc-e564-4a31-9813-5ee26967c5c8\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/Material_Alpha_01.gltf",
    "content": "{\r\n\t\"accessors\": [\r\n\t\t{\r\n\t\t\t\"bufferView\": 0,\r\n\t\t\t\"componentType\": 5126,\r\n\t\t\t\"count\": 4,\r\n\t\t\t\"type\": \"VEC3\",\r\n\t\t\t\"max\": [\r\n\t\t\t\t0.5,\r\n\t\t\t\t0.5,\r\n\t\t\t\t0.0\r\n\t\t\t],\r\n\t\t\t\"min\": [\r\n\t\t\t\t-0.5,\r\n\t\t\t\t-0.5,\r\n\t\t\t\t0.0\r\n\t\t\t],\r\n\t\t\t\"name\": \"Positions Accessor\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"bufferView\": 1,\r\n\t\t\t\"componentType\": 5126,\r\n\t\t\t\"count\": 4,\r\n\t\t\t\"type\": \"VEC4\",\r\n\t\t\t\"name\": \"Colors Accessor\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"bufferView\": 2,\r\n\t\t\t\"componentType\": 5126,\r\n\t\t\t\"count\": 4,\r\n\t\t\t\"type\": \"VEC2\",\r\n\t\t\t\"name\": \"UV Accessor 0\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"bufferView\": 3,\r\n\t\t\t\"componentType\": 5125,\r\n\t\t\t\"count\": 6,\r\n\t\t\t\"type\": \"SCALAR\",\r\n\t\t\t\"name\": \"Indices Accessor\"\r\n\t\t}\r\n\t],\r\n\t\"asset\": {\r\n\t\t\"generator\": \"glTF Asset Generator\",\r\n\t\t\"version\": \"2.0\",\r\n\t\t\"extras\": {\r\n\t\t\t\"Attributes\": \"VertexColor_Vector4_Float - AlphaMode_Mask - AlphaCutoff - DoubleSided - BaseColorFactor - BaseColorTexture\"\r\n\t\t}\r\n\t},\r\n\t\"buffers\": [\r\n\t\t{\r\n\t\t\t\"uri\": \"Material_Alpha_01.bin\",\r\n\t\t\t\"byteLength\": 168\r\n\t\t}\r\n\t],\r\n\t\"bufferViews\": [\r\n\t\t{\r\n\t\t\t\"buffer\": 0,\r\n\t\t\t\"byteLength\": 48,\r\n\t\t\t\"name\": \"Positions\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"buffer\": 0,\r\n\t\t\t\"byteOffset\": 48,\r\n\t\t\t\"byteLength\": 64,\r\n\t\t\t\"name\": \"Colors\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"buffer\": 0,\r\n\t\t\t\"byteOffset\": 112,\r\n\t\t\t\"byteLength\": 32,\r\n\t\t\t\"name\": \"Texture Coords 0\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"buffer\": 0,\r\n\t\t\t\"byteOffset\": 144,\r\n\t\t\t\"byteLength\": 24,\r\n\t\t\t\"name\": \"Indices\"\r\n\t\t}\r\n\t],\r\n\t\"images\": [\r\n\t\t{\r\n\t\t\t\"uri\": \"Texture_baseColor.png\"\r\n\t\t}\r\n\t],\r\n\t\"materials\": [\r\n\t\t{\r\n\t\t\t\"pbrMetallicRoughness\": {\r\n\t\t\t\t\"baseColorFactor\": [\r\n\t\t\t\t\t1.0,\r\n\t\t\t\t\t1.0,\r\n\t\t\t\t\t1.0,\r\n\t\t\t\t\t0.6\r\n\t\t\t\t],\r\n\t\t\t\t\"baseColorTexture\": {\r\n\t\t\t\t\t\"index\": 0\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\"alphaMode\": \"MASK\",\r\n\t\t\t\"alphaCutoff\": 0.7,\r\n\t\t\t\"doubleSided\": true\r\n\t\t}\r\n\t],\r\n\t\"meshes\": [\r\n\t\t{\r\n\t\t\t\"primitives\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"attributes\": {\r\n\t\t\t\t\t\t\"POSITION\": 0,\r\n\t\t\t\t\t\t\"COLOR_0\": 1,\r\n\t\t\t\t\t\t\"TEXCOORD_0\": 2\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"indices\": 3,\r\n\t\t\t\t\t\"material\": 0\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t}\r\n\t],\r\n\t\"nodes\": [\r\n\t\t{\r\n\t\t\t\"mesh\": 0\r\n\t\t}\r\n\t],\r\n\t\"scene\": 0,\r\n\t\"scenes\": [\r\n\t\t{\r\n\t\t\t\"nodes\": [\r\n\t\t\t\t0\r\n\t\t\t]\r\n\t\t}\r\n\t],\r\n\t\"textures\": [\r\n\t\t{\r\n\t\t\t\"source\": 0\r\n\t\t}\r\n\t]\r\n}"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/filenames/.arcconfig",
    "content": "{\n\t\"project_id\": \"example\",\n\t\"conduit_uri\": \"https://ex.am.pl/\",\n\t\"copyright_holder\": \"Apache Software Foundation\",\n\t\"arcanist_configuration\": \"ArcJIRAConfiguration\",\n\t\"phabricator.uri\": \"https://phabricator.example.com/\",\n\t\"load\": [\"libs/src\"]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/filenames/.htmlhintrc",
    "content": "{\n\t\"alt-require\": true,\n\t\"attr-lowercase\": true,\n\t\"attr-no-duplication\": true,\n\t\"attr-unsafe-chars\": true,\n\t\"attr-value-double-quotes\": true,\n\t\"attr-value-not-empty\": false,\n\t\"doctype-first\": true,\n\t\"doctype-html5\": true,\n\t\"head-script-disabled\": false,\n\t\"href-abs-or-rel\": false,\n\t\"id-class-ad-disabled\": true,\n\t\"id-class-value\": false,\n\t\"id-unique\": true,\n\t\"inline-script-disabled\": true,\n\t\"inline-style-disabled\": true,\n\t\"space-tab-mixed-disabled\": \"space\",\n\t\"spec-char-escape\": true,\n\t\"src-not-empty\": true,\n\t\"style-disabled\": false,\n\t\"tag-pair\": true,\n\t\"tag-self-close\": false,\n\t\"tagname-lowercase\": true,\n\t\"title-require\": true\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/filenames/.jscsrc",
    "content": "{\n\t\"requireCurlyBraces\": [\n\t\t\"if\",\n\t\t\"else\",\n\t\t\"for\",\n\t\t\"while\",\n\t\t\"do\",\n\t\t\"try\",\n\t\t\"catch\"\n\t],\n\t\"requireSpaceAfterKeywords\": [\n\t\t\"if\",\n\t\t\"else\",\n\t\t\"for\",\n\t\t\"while\",\n\t\t\"do\",\n\t\t\"switch\",\n\t\t\"case\",\n\t\t\"return\",\n\t\t\"try\",\n\t\t\"catch\",\n\t\t\"typeof\"\n\t],\n\t\"requireSpaceBeforeBlockStatements\": true,\n\t\"requireParenthesesAroundIIFE\": true,\n\t\"requireSpacesInConditionalExpression\": true,\n\t\"disallowSpacesInNamedFunctionExpression\": {\n\t\t\"beforeOpeningRoundBrace\": true\n\t},\n\t\"disallowSpacesInFunctionDeclaration\": {\n\t\t\"beforeOpeningRoundBrace\": true\n\t},\n\t\"requireSpaceBetweenArguments\": true,\n\t\"requireBlocksOnNewline\": true,\n\t\"disallowEmptyBlocks\": true,\n\t\"disallowSpacesInsideArrayBrackets\": true,\n\t\"disallowSpacesInsideParentheses\": true,\n\t\"disallowDanglingUnderscores\": true,\n\t\"requireCommaBeforeLineBreak\": true,\n\t\"disallowSpacesInCallExpression\": true,\n\t\"disallowSpaceAfterPrefixUnaryOperators\": true,\n\t\"disallowSpaceBeforePostfixUnaryOperators\": true,\n\t\"disallowSpaceBeforeBinaryOperators\": [\n\t\t\",\"\n\t],\n\t\"requireSpacesInForStatement\": true,\n\t\"requireSpaceBeforeBinaryOperators\": true,\n\t\"requireSpaceAfterBinaryOperators\": true,\n\t\"disallowKeywords\": [\n\t\t\"with\"\n\t],\n\t\"disallowMixedSpacesAndTabs\": true,\n\t\"disallowTrailingWhitespace\": true,\n\t\"disallowKeywordsOnNewLine\": [\n\t\t\"else\"\n\t],\n\t\"requireLineFeedAtFileEnd\": true,\n\t\"requireCapitalizedConstructors\": true,\n\t\"requireDotNotation\": true,\n\t\"disallowNewlineBeforeBlockStatements\": true,\n\t\"disallowMultipleLineStrings\": true,\n\t\"requireSpaceBeforeObjectValues\": true,\n\t\"validateQuoteMarks\": \"'\",\n\t\"requireSpaceAfterLineComment\": true,\n\t\"validateIndentation\": 2,\n\t\"validateLineBreaks\": \"LF\",\n\t\"disallowSpacesInFunction\": {\n\t\t\"beforeOpeningRoundBrace\": true\n\t},\n\t\"requireSpacesInFunction\": {\n\t\t\"beforeOpeningCurlyBrace\": true\n\t},\n\t\"disallowMultipleLineBreaks\": true,\n\t\"disallowYodaConditions\": true,\n\t\"disallowFunctionDeclarations\": true,\n\t\"disallowMultipleVarDecl\": \"exceptUndefined\",\n\t\"requirePaddingNewlinesBeforeKeywords\": [\n\t\t\"do\",\n\t\t\"for\",\n\t\t\"if\",\n\t\t\"switch\",\n\t\t\"try\",\n\t\t\"void\",\n\t\t\"while\",\n\t\t\"return\"\n\t],\n\t\"excludeFiles\": [\"**/node_modules/**\", \"**/min/**\", \"**/*.min.js\"]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/filenames/.tern-config",
    "content": "{\n\t\"ecmaVersion\": 6,\n\t\"libs\": [\n\t\t\"browser\",\n\t\t\"jquery\"\n\t],\n\t\"dontLoad\": [\n\t\t\"node_modules/**\"\n\t],\n\t\"plugins\": {\n\t\t\"es_modules\": {},\n\t\t\"node\": {},\n\t\t\"angular\": {},\n\t\t\"doc_comment\": {\n\t\t\t\"fullDocs\": true,\n\t\t\t\"strong\": true\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/filenames/.tern-project",
    "content": "{\n\t\"ecmaVersion\": 6,\n\t\"libs\": [],\n\t\"loadEagerly\": [\n\t\t\"src/app/**/*.js\"\n\t],\n\t\"dontLoad\": [\n\t\t\"node_modules\"\n\t],\n\t\"plugins\": {\n\t\t\"requirejs\": {\n\t\t\t\"baseURL\": \"src\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/filenames/mcmod.info",
    "content": "[\n{\n  \"modid\": \"examplemod\",\n  \"name\": \"Example Mod\",\n  \"description\": \"Example placeholder mod.\",\n  \"version\": \"${version}\",\n  \"mcversion\": \"${mcversion}\",\n  \"url\": \"\",\n  \"updateUrl\": \"\",\n  \"authorList\": [\"ExampleDude\"],\n  \"credits\": \"The Forge and FML guys, for making this example\",\n  \"logoFile\": \"\",\n  \"screenshots\": [],\n  \"dependencies\": []\n}\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/geo.geojson",
    "content": "{\n\t\"type\": \"FeatureCollection\",\n\t\"features\": [\n\t\t{\n\t\t\t\"type\": \"Feature\",\n\t\t\t\"properties\": {\n\t\t\t\t\"name\": \"Australia Post - North Ryde BC\",\n\t\t\t\t\"geo\": [-33.787792, 151.13288],\n\t\t\t\t\"streetAddress\": \"11 Waterloo Road\",\n\t\t\t\t\"addressLocality\": \"Macquarie Park\",\n\t\t\t\t\"addressRegion\": \"New South Wales\",\n\t\t\t\t\"addressCountry\": \"Australia\",\n\t\t\t\t\"postalCode\": \"2113\"\n\t\t\t},\n\t\t\t\"geometry\": {\n\t\t\t\t\"type\": \"Point\",\n\t\t\t\t\"coordinates\": [151.13288, -33.787792, 0]\n\t\t\t}\n\t\t},\n\n\n\t\t{\n\t\t\t\"type\": \"Feature\",\n\t\t\t\"properties\": {\n\t\t\t\t\"name\": \"George Weston Foods Limited\",\n\t\t\t\t\"geo\": [-37.8263884, 144.9105381],\n\t\t\t\t\"streetAddress\": \"Level 3, 187 Todd Road\",\n\t\t\t\t\"addressLocality\": \"Port Melbourne\",\n\t\t\t\t\"addressRegion\": \"Victoria\",\n\t\t\t\t\"addressCountry\": \"Australia\",\n\t\t\t\t\"postalCode\": \"3207\"\n\t\t\t},\n\t\t\t\"geometry\": {\n\t\t\t\t\"type\": \"Polygon\",\n\t\t\t\t\"coordinates\": [\n\t\t\t\t\t[\n\t\t\t\t\t\t[144.9097088901841, -37.82622654171794, 0],\n\t\t\t\t\t\t[144.9099724266943, -37.82679388891783, 0],\n\t\t\t\t\t\t[144.9110127325916, -37.82651526396403, 0],\n\t\t\t\t\t\t[144.9112227645738, -37.82655667152123, 0],\n\t\t\t\t\t\t[144.9113739439796, -37.82618552508767, 0],\n\t\t\t\t\t\t[144.9112740633105, -37.82615750100924, 0],\n\t\t\t\t\t\t[144.9111355846674, -37.82584493693527, 0],\n\t\t\t\t\t\t[144.9097088901841, -37.82622654171794, 0]\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\n\n\t\t{\n\t\t\t\"type\": \"Feature\",\n\t\t\t\"properties\": {\n\t\t\t\t\"name\": \"George Weston Foods Limited\",\n\t\t\t\t\"geo\": [-37.05202791502396, 144.2085614999388],\n\t\t\t\t\"streetAddress\": \"67 Richards Road\",\n\t\t\t\t\"addressLocality\": \"Castlemaine\",\n\t\t\t\t\"addressRegion\": \"Victoria\",\n\t\t\t\t\"addressCountry\": \"Australia\",\n\t\t\t\t\"postalCode\": \"3450\"\n\t\t\t},\n\t\t\t\"geometry\": {\n\t\t\t\t\"type\": \"Polygon\",\n\t\t\t\t\"coordinates\": [\n\t\t\t\t\t[\n\t\t\t\t\t\t[144.2052428913937, -37.04906391287216, 0],\n\t\t\t\t\t\t[144.205540392692,  -37.05049727485623, 0],\n\t\t\t\t\t\t[144.2059800881858, -37.05066835966983, 0],\n\t\t\t\t\t\t[144.206490656024,  -37.05279538900776, 0],\n\t\t\t\t\t\t[144.2064525845008, -37.05366195881602, 0],\n\t\t\t\t\t\t[144.2084322301922, -37.0538920493147,  0],\n\t\t\t\t\t\t[144.2084811895712, -37.05266519735124, 0],\n\t\t\t\t\t\t[144.2079784002005, -37.05041270555773, 0],\n\t\t\t\t\t\t[144.2074017905817, -37.04817406993293, 0],\n\t\t\t\t\t\t[144.2061363939852, -37.04834972871226, 0],\n\t\t\t\t\t\t[144.2052428913937, -37.04906391287216, 0]\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/http_response.avsc",
    "content": "{\n    \"type\": \"record\",\n    \"name\": \"Response\",\n    \"namespace\": \"org.rflow.message.data.http\",\n    \"aliases\": [],\n    \"fields\": [\n        {\"name\": \"client_ip\",    \"type\": [\"string\", \"null\"]},\n        {\"name\": \"client_port\",  \"type\": [\"int\", \"null\"]},\n        {\"name\": \"server_ip\",    \"type\": [\"string\", \"null\"]},\n        {\"name\": \"server_port\",  \"type\": [\"int\", \"null\"]},\n\n        {\"name\": \"protocol\",             \"type\": \"string\"},\n        {\"name\": \"status_code\",          \"type\": \"int\"},\n        {\"name\": \"status_reason_phrase\", \"type\": \"string\"},\n        {\"name\": \"headers\",              \"type\": {\"type\": \"map\", \"values\": \"string\"}},\n        {\"name\": \"content\",              \"type\": \"bytes\"}\n    ]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/manifest.webapp",
    "content": "{\n\t\"version\": \"1.0\",\n\t\"name\": \"demo\",\n\t\"description\": \"demo\",\n\t\"launch_path\": \"/index.html\",\n\t\"icons\": {\n\t\t\"128\": \"/res/icon.png\"\n\t},\n\t\"developer\": {\n\t\t\"name\": \"Cocos2d-html5\",\n\t\t\"url\": \"http://cocos2d-x.org/\"\n\t},\n\t\"default_locale\": \"en\",\n\t\"installs_allowed_from\": [\n\t\t\"*\"\n\t],\n\t\"orientation\": \"portrait-primary\",\n\t\"fullscreen\": \"true\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/manifest.webmanifest",
    "content": "{\n\t\"short_name\": \"CC Splitter\",\n\t\"name\": \"Credit Card Splitter\",\n\t\"start_url\": \"./index.html\",\n\t\"display\": \"standalone\",\n\t\"theme_color\": \"#000000\",\n\t\"background_color\": \"#ffffff\",\n\t\"lang\": \"en-GB\",\n\t\"icons\": [\n\t\t{\n\t\t\t\"src\": \"logo-16.png\",\n\t\t\t\"sizes\": \"16x16\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-36.png\",\n\t\t\t\"sizes\": \"36x36\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-48.png\",\n\t\t\t\"sizes\": \"48x48\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-72.png\",\n\t\t\t\"sizes\": \"72x72\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-96.png\",\n\t\t\t\"sizes\": \"96x96\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-144.png\",\n\t\t\t\"sizes\": \"144x144\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-192.png\",\n\t\t\t\"sizes\": \"192x192\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-250.png\",\n\t\t\t\"sizes\": \"250x250\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-512.png\",\n\t\t\t\"sizes\": \"512x512\",\n\t\t\t\"type\": \"image/png\"\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/person.json",
    "content": "{\n     \"firstName\": \"John\",\n     \"lastName\" : \"Smith\",\n     \"age\"      : 25,\n     \"address\"  :\n     {\n         \"streetAddress\": \"21 2nd Street\",\n         \"city\"         : \"New York\",\n         \"state\"        : \"NY\",\n         \"postalCode\"   : \"10021\"\n     },\n     \"phoneNumber\":\n     [\n         {\n           \"type\"  : \"home\",\n           \"number\": \"212 555-1234\"\n         },\n         {\n           \"type\"  : \"fax\",\n           \"number\": \"646 555-4567\"\n         }\n     ]\n }"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/product.json",
    "content": "{\n        \"id\": 1,\n        \"name\": \"Foo\",\n        \"price\": 123,\n        \"tags\": [\"Bar\",\"Eek\"],\n        \"stock\": { \"warehouse\":300, \"retail\":20 }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/schema.json",
    "content": "{\n        \"name\":\"Product\",\n        \"properties\":\n        {\n                \"id\":\n                {\n                        \"type\":\"number\",\n                        \"description\":\"Product identifier\",\n                        \"required\":true\n                },\n                \"name\":\n                {\n                        \"type\":\"string\",\n                        \"description\":\"Name of the product\",\n                        \"required\":true\n                },\n                \"price\":\n                {\n                        \"type\":\"number\",\n                        \"minimum\":0,\n                        \"required\":true\n                },\n                \"tags\":\n                {\n                        \"type\":\"array\",\n                        \"items\":\n                        {\n                                \"type\":\"string\"\n                        }\n                },\n                \"stock\":\n                {\n                        \"type\":\"object\",\n                        \"properties\":\n                        {\n                                \"warehouse\":\n                                {\n                                        \"type\":\"number\"\n                                },\n                                \"retail\":\n                                {\n                                        \"type\":\"number\"\n                                }\n                        }\n                }\n        }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/small.tfstate",
    "content": "{\n\t\t\"version\": 1,\n\t\t\"serial\": 12,\n\t\t\"modules\": [\n\t\t\t\t{\n\t\t\t\t\t\t\"path\": [\n\t\t\t\t\t\t\t\t\"root\"\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"outputs\": {\n\t\t\t\t\t\t\t\t\"public_az1_subnet_id\": \"subnet-d658bba0\",\n\t\t\t\t\t\t\t\t\"region\": \"us-west-2\",\n\t\t\t\t\t\t\t\t\"vpc_cidr\": \"10.201.0.0/16\",\n\t\t\t\t\t\t\t\t\"vpc_id\": \"vpc-65814701\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"resources\": {\n\t\t\t\t\t\t\t\t\"aws_key_pair.onprem\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_key_pair\",\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"onprem\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"onprem\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"key_name\": \"onprem\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"public_key\": \"foo\"\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\"meta\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"schema_version\": \"1\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\t\"path\": [\n\t\t\t\t\t\t\t\t\"root\",\n\t\t\t\t\t\t\t\t\"bootstrap\"\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"outputs\": {\n\t\t\t\t\t\t\t\t\"consul_bootstrap_dns\": \"consul.bootstrap\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"resources\": {\n\t\t\t\t\t\t\t\t\"aws_route53_record.oasis-consul-bootstrap-a\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_route53_record\",\n\t\t\t\t\t\t\t\t\t\t\"depends_on\": [\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\"\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN_consul.bootstrap_A\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"failover\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"fqdn\": \"consul.bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"health_check_id\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN_consul.bootstrap_A\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"consul.bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.#\": \"6\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1148461392\": \"10.201.3.8\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1169574759\": \"10.201.2.8\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1206973758\": \"10.201.1.8\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1275070284\": \"10.201.2.4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1304587643\": \"10.201.3.4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1313257749\": \"10.201.1.4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"set_identifier\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"ttl\": \"300\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"A\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"weight\": \"-1\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"zone_id\": \"Z68734P5178QN\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aws_route53_record.oasis-consul-bootstrap-ns\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_route53_record\",\n\t\t\t\t\t\t\t\t\t\t\"depends_on\": [\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\"\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN_consul.bootstrap_NS\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"failover\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"fqdn\": \"consul.bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"health_check_id\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN_consul.bootstrap_NS\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"consul.bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.#\": \"4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1796532126\": \"ns-512.awsdns-00.net.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.2728059479\": \"ns-1536.awsdns-00.co.uk.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.4092160370\": \"ns-1024.awsdns-00.org.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.456007465\": \"ns-0.awsdns-00.com.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"set_identifier\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"ttl\": \"30\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"NS\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"weight\": \"-1\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"zone_id\": \"Z68734P5178QN\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_route53_zone\",\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"comment\": \"Used to bootstrap consul dns\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"consul.bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name_servers.#\": \"4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name_servers.0\": \"ns-0.awsdns-00.com.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name_servers.1\": \"ns-1024.awsdns-00.org.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name_servers.2\": \"ns-1536.awsdns-00.co.uk.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name_servers.3\": \"ns-512.awsdns-00.net.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"tags.#\": \"0\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"vpc_id\": \"vpc-65814701\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"vpc_region\": \"us-west-2\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"zone_id\": \"Z68734P5178QN\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/switzerland.topojson",
    "content": "{\"type\":\"Topology\",\"transform\":{\"scale\":[0.00045364536453645373,0.00019901990199019923],\"translate\":[5.956,45.818]},\"objects\":{\"cantons\":{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"Polygon\",\"arcs\":[[0,1,2,3,4,5,6,7,8,9]],\"id\":\"ZH\",\"properties\":{\"name\":\"Zürich\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[10,11,12,13,14,15,16,17,18,19,20,21,22],[23],[24]],[[25,26]],[[27]],[[28,29]]],\"id\":\"BE\",\"properties\":{\"name\":\"Bern/Berne\"}},{\"type\":\"Polygon\",\"arcs\":[[-12,30,31,32,33,34]],\"id\":\"LU\",\"properties\":{\"name\":\"Luzern\"}},{\"type\":\"Polygon\",\"arcs\":[[35,36,37,38,-16,39,40,41]],\"id\":\"UR\",\"properties\":{\"name\":\"Uri\"}},{\"type\":\"Polygon\",\"arcs\":[[42,-33,43,-1,44,45,46,-42]],\"id\":\"SZ\",\"properties\":{\"name\":\"Schwyz\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-13,-35,47]],[[-15,48,-40]]],\"id\":\"OW\",\"properties\":{\"name\":\"Obwalden\"}},{\"type\":\"Polygon\",\"arcs\":[[-34,-43,-41,-49,-14,-48]],\"id\":\"NW\",\"properties\":{\"name\":\"Nidwalden\"}},{\"type\":\"Polygon\",\"arcs\":[[49,-36,-47,50,51]],\"id\":\"GL\",\"properties\":{\"name\":\"Glarus\"}},{\"type\":\"Polygon\",\"arcs\":[[-32,52,-2,-44]],\"id\":\"ZG\",\"properties\":{\"name\":\"Zug\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[53,54,55,-27,56,-19],[57]],[[58]],[[59,60]],[[61]],[[62]]],\"id\":\"FR\",\"properties\":{\"name\":\"Fribourg\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-30,63,64,65,-23]],[[66]],[[67,68,69]],[[70,71]]],\"id\":\"SO\",\"properties\":{\"name\":\"Solothurn\"}},{\"type\":\"Polygon\",\"arcs\":[[72,73]],\"id\":\"BS\",\"properties\":{\"name\":\"Basel-Stadt\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[74,-70,75,-71,76,-73,77,78,-65]],[[79,80,-68]]],\"id\":\"BL\",\"properties\":{\"name\":\"Basel-Landschaft\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-7,81,82,83]],[[84,85]],[[-5,86]]],\"id\":\"SH\",\"properties\":{\"name\":\"Schaffhausen\"}},{\"type\":\"Polygon\",\"arcs\":[[87,88,89,90,91,92]],\"id\":\"AR\",\"properties\":{\"name\":\"Appenzell Ausserrhoden\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[93,-92]],[[94,-90]],[[-88,95]]],\"id\":\"AI\",\"properties\":{\"name\":\"Appenzell Innerrhoden\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-51,-45,-10,96,97,98,-52],[99],[-94,-91,-95,-89,-96,-93]],[[100]]],\"id\":\"SG\",\"properties\":{\"name\":\"St. Gallen\"}},{\"type\":\"Polygon\",\"arcs\":[[101,-37,-50,-99,102]],\"id\":\"GR\",\"properties\":{\"name\":\"Graubünden/Grigioni\"}},{\"type\":\"Polygon\",\"arcs\":[[-53,-31,-11,-66,-79,103,-3]],\"id\":\"AG\",\"properties\":{\"name\":\"Aargau\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-9,104,-83,105,-85,106,-97],[-101]],[[107]]],\"id\":\"TG\",\"properties\":{\"name\":\"Thurgau\"}},{\"type\":\"Polygon\",\"arcs\":[[108,-38,-102,109],[110]],\"id\":\"TI\",\"properties\":{\"name\":\"Ticino\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[111,112,113,114,115,-61,116,-54,-18,117,118],[-62],[119],[120]],[[-26,-56,121,-20,-57]]],\"id\":\"VD\",\"properties\":{\"name\":\"Vaud\"}},{\"type\":\"Polygon\",\"arcs\":[[-118,-17,-39,-109,122]],\"id\":\"VS\",\"properties\":{\"name\":\"Valais/Wallis\"}},{\"type\":\"Polygon\",\"arcs\":[[-122,-55,-117,-60,-116,123,124,-21]],\"id\":\"NE\",\"properties\":{\"name\":\"Neuchâtel\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-114,125]],[[126]],[[127]]],\"id\":\"GE\",\"properties\":{\"name\":\"Genève\"}},{\"type\":\"Polygon\",\"arcs\":[[-64,-29,-22,-125,128,-80,-75]],\"id\":\"JU\",\"properties\":{\"name\":\"Jura\"}}]}},\"arcs\":[[[6286,7049],[-33,10],[-114,-55],[-60,-45],[-9,-15],[-13,10],[-2,-5],[0,-5],[0,-5],[0,-6],[-2,0],[-5,-5],[-4,0],[-5,0],[-2,0],[-2,0],[0,-5],[-20,-45],[-6,-10],[-3,-5],[-2,-25],[2,-10],[3,-15],[8,-10],[9,-10],[5,-15],[0,-15]],[[6031,6763],[-9,-5],[-9,0],[-13,-10],[-7,-10],[-20,5],[-8,5],[-3,25],[0,25],[-2,0],[-2,0],[-2,0],[-5,-5],[-2,0],[-2,0],[-2,5],[-3,0],[-4,-5],[-9,0],[-2,0],[-2,-5],[-2,0],[-5,0],[-2,5],[0,5],[-2,5],[-7,0],[-2,0],[-4,0],[-3,0],[-4,0],[-2,0],[-2,0],[-5,0],[-2,5],[-2,0],[0,10],[2,5],[0,5],[2,0],[2,5],[3,5],[0,5],[-5,5],[0,5],[-2,10],[-4,10],[-5,5],[0,5],[0,5],[0,5],[0,5],[-4,5],[-2,0],[0,5],[0,5],[0,5],[-3,5],[0,5],[-2,11],[-2,5],[-2,5],[-3,5],[-2,0],[-2,5],[-2,0],[0,5],[-5,5],[-4,0],[-2,0],[-2,-5],[-3,-5],[-2,0],[-2,-5],[-2,0],[-2,0],[-3,5],[-2,5],[0,5],[2,5],[-2,5],[2,5],[0,5],[-4,5],[0,5],[-2,5],[-2,0],[-3,0],[-2,0],[-2,0],[-4,5],[-3,0],[-2,-5],[-2,-5],[-2,0],[-2,0],[-3,0],[-2,10],[0,5],[0,5],[2,10],[0,5],[-2,0],[-2,0],[-2,0],[-5,0],[0,5],[-2,0],[0,-5],[-6,-5],[-3,5],[-26,10],[-7,5],[-9,10],[-2,-5],[-15,-5],[-7,5],[-9,5],[-6,-10],[-9,5],[-2,-20],[-2,0],[-7,5],[-7,0],[-2,0],[-2,5],[-2,0],[-3,-5],[-15,0],[-2,-20],[-5,5],[-4,-10],[-7,5],[3,-5],[-9,-10],[-9,0],[-2,0],[-16,-5],[-13,-15],[-9,5],[-8,5],[-7,-5],[2,10],[-7,5],[0,5],[-6,0],[-2,5],[-14,0],[-8,25],[-9,-5],[-2,10],[-5,0],[-4,0],[0,5],[-2,5],[-3,5],[-4,0],[-7,10],[-8,-5],[-18,5],[-16,-10],[0,5],[0,5],[-2,5],[-2,0],[-2,0],[0,5],[0,5],[-2,10],[0,15],[0,5],[-3,10],[0,5],[0,5],[-2,0],[-2,5],[0,6],[4,0],[0,5],[-2,5],[-2,5],[-2,5],[-2,15],[-3,5],[-2,0]],[[5411,7185],[-2,5],[-4,10],[-11,15],[0,5],[0,5],[0,5],[0,5],[2,0],[0,5],[2,0],[0,5],[-2,5],[0,5],[-2,5],[-3,0],[-2,5],[0,5],[-2,0],[2,5],[0,5],[0,5],[2,5],[3,10],[0,5],[-3,5],[0,5],[-11,10],[-2,5],[-2,5],[0,5],[-2,0],[0,5],[-2,21],[-3,10],[-4,10],[-2,10],[6,5],[11,-15],[16,15],[0,5],[24,5],[9,10],[6,15],[16,15],[-2,0],[6,25],[-2,0],[-2,5],[7,5],[0,20],[8,10],[0,5],[11,5],[0,10],[11,10],[7,16],[2,15],[-2,0],[9,15],[-2,0],[6,25],[-2,5],[-2,-10],[-5,5],[-2,-20],[-13,-5],[-4,-10],[-11,0],[-5,-10],[-4,5],[-9,5],[-29,-15],[-2,10],[-4,5],[0,10],[8,25],[-2,10],[0,5],[-2,0],[-2,5],[-5,5],[-4,5],[-7,10],[0,10],[-6,15],[6,25],[5,15],[-5,5],[3,20],[-7,21],[7,15],[-3,15],[-15,5],[2,15],[-2,5],[-7,5],[0,5],[-2,0],[2,5],[0,5],[0,5],[-2,0],[-4,5],[0,5],[2,10],[0,15],[0,15],[0,5],[2,5],[2,0],[0,10],[-2,0],[-2,-5],[0,5],[-7,10],[-4,-5],[-2,0],[-11,0],[-3,-5],[-6,30],[-5,0],[-8,-5],[-18,0],[-7,10],[-2,6],[9,0],[2,-6],[5,11],[15,10],[2,-5],[2,-5],[3,-5],[6,10],[7,10],[-7,10],[-2,15],[9,15],[-7,10],[5,10],[6,-10],[11,20],[0,10],[-2,10],[-2,5],[-4,10],[0,5],[-7,0],[-2,0],[-5,5],[-6,0],[-5,0],[-4,5],[0,5],[0,5],[4,10],[5,-5],[2,0],[6,0],[3,10],[2,10],[-2,15],[-5,5],[-2,31],[2,0],[0,5],[5,5],[6,0],[-9,35],[-6,0],[-2,15],[-14,0],[-8,30],[-7,5],[0,5],[4,5],[0,5],[-4,5],[4,0],[9,0],[7,5],[-2,20],[-3,30],[-19,0],[-5,26],[2,25],[-4,25],[-7,5],[9,10],[2,10],[-8,0],[-3,5],[3,10],[0,10],[6,10],[-2,10],[4,5],[5,0],[2,0],[2,5],[2,-5],[0,5],[-2,0],[5,0],[4,-5],[2,5],[5,-5],[2,5],[4,0],[7,15],[-2,5],[2,0],[2,46],[7,15],[6,5],[7,-10],[-2,-5],[6,-5],[3,5],[6,10],[-2,15],[2,5],[16,5],[2,10],[-7,25],[7,-10],[4,10],[-2,10],[4,0],[3,10],[6,10],[16,0],[-7,10],[4,10],[-4,10],[-2,10],[9,20],[0,15],[-3,0],[3,15],[17,21]],[[5444,8793],[2,-5],[3,0],[2,0],[2,0],[5,0],[2,0],[6,0],[3,0],[2,0],[2,0],[2,5],[2,0],[5,5],[4,0],[2,5],[3,0],[8,5],[5,5],[2,0],[2,0],[2,0],[3,0],[4,0],[4,0],[3,0],[2,0],[2,0],[2,0],[2,5],[3,0],[2,0],[2,5],[2,0],[2,5],[3,0],[0,5],[4,0],[0,5],[2,0],[3,0],[0,5],[2,0],[2,0],[2,0],[2,0],[3,0],[2,-5],[2,0],[2,0],[2,0],[3,0],[2,5],[2,0],[2,5],[2,5],[5,0],[0,5],[2,0],[4,0],[-2,10],[-11,25],[-4,-5],[-9,0],[-2,0],[0,-5],[-2,-5],[-3,0],[-2,0],[-2,0],[-2,0],[-5,0],[-2,0],[-2,-5],[-2,5],[-3,0],[-2,0],[0,-5],[-2,0],[-2,0],[-2,0],[-5,20],[-4,0],[-7,0],[2,15],[0,10],[-4,15],[-4,5],[-3,15],[3,10],[6,0],[7,0],[6,5],[5,5],[0,6],[4,0],[2,10],[-2,5],[9,0],[2,0],[7,15],[0,5],[2,5],[-2,5],[2,5],[2,0],[3,-5],[4,0],[2,0],[2,5],[3,0],[0,-5],[2,0],[2,5],[2,0],[2,0],[5,0],[2,0],[0,-5],[2,0],[0,5],[2,0],[3,0],[2,0],[2,5],[2,0],[7,5],[2,0],[2,0],[5,0],[4,5],[-2,0],[2,0],[0,20],[-2,10],[9,-5],[4,0],[4,0],[0,10],[-4,0],[0,5],[0,5],[2,-5],[2,5],[0,5],[3,0],[-3,5],[0,10],[3,5],[0,10],[2,0],[9,0],[11,-10],[9,0],[4,0],[4,-5],[5,0],[4,0],[2,0],[0,-15],[0,-10],[9,5],[2,-10],[7,5],[4,-5],[5,0],[4,0],[9,0],[2,-5],[2,-5],[0,-5],[5,-5],[0,-5],[2,-5],[0,-5],[2,-5],[11,0],[3,0],[2,-5],[0,-5],[0,-5],[2,0],[0,-5],[0,-5],[7,0],[-3,-5],[-6,0],[-9,-5],[0,-15],[0,-10],[-5,-11],[-6,-10],[4,-5],[0,-5]],[[5746,8948],[-13,-10],[-2,-5],[0,-10],[-13,-10],[-5,5],[-6,-5],[-16,-20],[-6,-5],[4,-20],[-7,0],[0,-10],[5,0],[0,-10],[9,-5],[-5,0],[-6,-15],[11,-5],[11,5],[2,-5],[0,-15],[-9,-5],[2,-5],[5,-5],[6,-15],[2,-6],[3,-10],[0,-10],[2,-5],[0,-5],[0,-5],[4,-10],[5,-10],[2,-5],[4,0],[2,5],[3,0],[2,5],[2,10],[4,10],[0,5],[3,5],[2,5],[2,5],[2,5],[0,5],[3,6],[0,5],[2,5],[0,5],[0,15],[0,5],[4,10],[0,5],[2,0],[3,5],[4,0],[2,0],[5,0],[2,0],[0,5],[2,5],[-2,0],[0,5],[-2,10],[-5,15],[0,5],[0,10],[2,5],[0,5],[3,5],[4,5],[2,5],[2,5],[5,5],[4,0],[5,5],[4,0],[4,5],[3,0],[2,5],[0,5],[-2,10],[0,10],[2,0],[0,10],[2,11]],[[5819,8984],[0,5],[2,0],[2,0],[3,5],[2,0],[0,5],[2,0],[2,5],[2,5],[3,5],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[-2,0],[0,5],[-3,5],[-2,5],[0,5],[-2,0],[0,5],[-2,5],[0,5],[-2,5],[0,5],[-3,5],[-2,10],[0,5],[0,5],[0,5],[0,5],[0,15],[-2,5],[0,5],[0,5],[-2,0],[0,5],[0,5],[0,5],[0,5],[2,0],[0,5],[2,0],[7,5],[2,0],[0,6],[2,0],[0,5],[2,0],[0,5],[0,5],[0,5],[3,5],[2,5],[2,0],[2,5],[0,-5],[2,0],[3,0],[2,-5],[2,0],[2,-5],[2,-5],[0,-5],[3,0],[0,-5],[0,-5],[0,-6],[0,-5],[-3,-5],[-2,0],[0,-5],[-2,0],[-2,0],[-2,0],[-3,0],[-2,0],[-2,0],[-2,0],[-2,0],[0,-5],[-3,0],[0,-5],[0,-5],[3,-5],[2,0],[0,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,5],[2,0],[2,0],[2,0],[3,0],[2,5],[2,0],[2,0],[2,5],[3,5],[2,0],[0,5],[2,5],[0,5],[2,0],[0,5],[2,6],[0,5],[3,5],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[-2,0],[-3,5],[-4,10],[-2,0],[-2,5],[-3,5],[-2,5],[-4,0],[-2,5],[-3,0],[-2,5],[-4,5],[-3,-5],[-4,5],[-2,5],[-2,0],[0,5],[-3,0],[0,5],[-2,5],[0,5],[-2,10]],[[5841,9300],[2,0],[2,15],[5,0],[0,5],[2,10],[0,5],[4,5],[3,0],[0,5],[2,0],[4,-5],[0,-5],[3,0],[0,-5],[2,0],[4,0],[7,5],[2,0],[2,5],[2,5],[0,5],[0,5],[0,10],[-2,15],[-2,11],[-2,5],[0,15],[2,0],[0,5],[2,0],[5,0],[4,5],[2,0],[2,0],[5,0],[6,0],[3,0],[4,5],[7,5],[2,0],[2,-5],[2,0],[2,-5],[5,-5],[4,0],[2,-5],[9,-15],[5,-5],[6,-6],[5,0]],[[5967,9385],[2,0],[2,-5],[2,5],[3,-5],[2,0],[2,0],[2,0]],[[5982,9380],[-4,-35],[0,-10],[4,-5],[16,-15],[2,-15],[2,-10],[-2,-5],[0,-10],[4,-20],[2,-15],[9,-10],[5,-15],[4,-15],[11,-5],[13,-5],[7,-11],[13,-15],[5,10],[6,0],[2,-5],[3,0],[2,-5],[6,-5],[5,0],[9,10],[13,-5],[4,0],[9,0],[11,5],[2,-15],[7,-5],[4,10],[20,10],[5,16],[4,0],[7,15],[8,5],[9,0],[5,-5],[2,0],[4,10],[9,5],[9,15],[0,15],[2,15],[4,20],[9,0],[14,0],[8,0],[5,0],[-2,-5],[0,-15],[2,-5],[-2,-25],[2,-15],[11,0],[11,-10],[15,-5],[9,-10],[0,-16],[2,-10],[2,-10],[-6,-15],[-2,-15],[2,0],[-7,-10],[-4,-15],[-5,5],[0,-10],[-4,5],[-2,-5],[-5,-5],[3,-10],[-5,-10],[7,-10],[-7,-10],[5,-10],[-11,-10],[0,-5],[-9,0],[-2,-30],[-5,-26],[2,-5],[0,-5],[-4,5],[-7,0],[-6,0],[-14,5],[0,21],[3,5],[-5,10],[-20,15],[-6,0],[-2,10],[-11,0],[-18,15],[-9,0],[-2,-5],[-13,15],[-5,5],[-2,10],[-4,-5],[0,-45],[-5,0],[-4,-5],[-5,0],[-2,-20],[7,-5],[4,-21],[5,-15],[6,0],[-6,-15],[2,-5],[2,-20],[2,0],[5,5],[6,0],[3,0],[4,0],[9,0],[2,0],[4,0],[9,-5],[2,0],[3,0],[6,-5],[7,-5],[4,0],[0,-5],[2,0],[3,0],[2,0],[4,-5],[5,0],[19,-10],[9,-5],[18,-10],[0,-5],[-9,5],[-2,-10],[11,-5],[-2,-25],[6,-5],[-2,-10],[7,-5],[15,-5],[2,10],[5,-5],[0,5],[4,0],[0,5],[18,-10],[0,10],[2,5],[18,-15],[-3,-10],[3,0],[0,-20],[13,5],[-2,-16],[15,5],[0,-15],[-13,0],[-7,-5],[-6,-15],[-22,5],[2,-10],[-5,0],[5,-15],[2,-5],[-2,0],[2,-10],[2,-5],[0,-5],[5,-25],[4,0],[11,-30],[0,-20],[18,-10],[11,5],[4,-5],[13,0],[14,-5],[6,0],[7,-5],[6,-5],[7,-5],[0,5],[7,5],[6,-5],[5,0],[4,-5],[13,-5],[7,-10],[-4,-16],[-5,-10],[5,-5],[-3,-25],[5,-10],[-2,-30],[-5,-10],[-4,-10],[0,-30],[0,-5],[0,-5],[0,-5],[0,-20],[9,0],[0,-15],[-14,-11],[-13,-5],[0,-25],[-9,-10],[7,-5],[0,-20],[15,-5],[0,-5],[3,-10],[2,-5],[-2,0],[0,-5],[2,0],[6,-5],[0,-10],[0,-5],[0,-5],[5,-5],[4,-20],[9,-5],[11,-25],[-13,-20],[9,-26],[8,-10],[16,-5],[9,-5],[8,0],[3,0],[13,5],[0,-10],[-5,-10],[-8,-5],[-11,10],[-7,0],[-2,-5],[-2,5],[-9,-5],[-2,10],[-3,0],[-6,-15],[0,-5],[2,0],[9,-10],[0,-5],[-2,-5],[0,-5],[-3,-10],[9,-20],[-4,-10],[-2,-10],[2,-10],[-18,-40],[-2,-15],[2,0],[2,-6],[5,0],[4,6],[2,0],[3,-6],[2,0],[2,0],[4,-5],[5,0],[4,0],[5,-5],[4,-5],[2,-5],[2,0],[3,-5],[2,-5],[2,-5],[4,-10],[3,-5],[4,0],[5,-5],[4,-5],[9,-10],[2,-5],[2,-5],[0,-5],[-2,-5],[-4,-10],[-3,-5],[3,-5],[2,-5],[4,-10]],[[6586,7828],[2,-5],[5,0],[2,0],[0,-5],[2,-5],[2,0],[3,-5],[2,-5],[0,-15],[2,-5],[4,-10],[0,-10],[5,-11],[2,-10],[2,-5],[2,-5],[3,-5],[-3,-5],[0,-5],[3,0],[2,0],[2,0],[2,0],[5,0],[2,0],[6,-10],[5,0],[4,-20],[-2,-40],[13,-10],[-4,-30],[0,-25],[18,-41],[-23,-60],[-11,-5],[-6,0],[-7,0],[-15,-5],[-9,-30],[-2,-5],[0,-5],[-7,-15],[0,-10],[-4,0],[-2,-5],[-3,0],[-2,0],[-2,5],[-2,-5],[-2,0],[0,-5],[-5,0],[-2,-5],[-2,5],[-2,-5],[-3,0],[-2,0],[0,-5],[16,-20],[2,-10],[-2,-11],[6,0],[5,11],[4,0],[0,-16],[0,-5],[0,-10],[-2,-5],[-5,-5],[-2,-5],[-2,0],[-2,0],[-2,-5],[6,-15],[-2,-10],[-7,0],[3,-5],[-7,-10],[-4,-15],[-5,-5],[-2,-5],[-9,5],[-2,-5],[-35,-20],[-9,-5],[0,15],[-7,-10],[-13,0],[-4,-5],[-27,-5],[-26,-5],[2,-20],[-9,-5],[0,-10],[-7,-5],[-2,5],[-11,-10],[-2,5],[-2,0],[-2,0],[-3,5],[-2,0],[0,-5],[-2,5],[-2,0],[0,5],[-2,5],[0,5],[0,5],[-3,0],[0,10],[-15,-10],[0,-10],[-16,0],[-4,10],[-7,5],[-6,0],[-2,0],[-3,0],[-4,5],[-37,-15],[-14,-5],[-2,-10],[-6,-10],[0,-5],[-5,0],[-2,-16],[26,-90]],[[4119,7275],[0,-5],[7,-5],[-2,-5],[2,0],[-2,-5],[0,-5],[4,0],[2,-5],[-4,-5],[2,-15],[-2,-5],[2,0],[-2,-5],[-4,-5],[-3,-5],[5,-5],[2,0],[-2,-5],[-2,-5],[0,-5],[0,-5],[0,-5],[2,-5],[2,0],[0,-5],[0,-5],[4,0],[0,-5],[3,-5],[2,-5],[2,0],[2,-11],[5,-5],[6,-15]],[[4150,7114],[-4,-5],[0,-5],[0,-10],[-2,0],[2,-5],[0,-10],[0,-5],[0,-10],[7,-5],[2,-5],[4,-10],[2,-10],[3,0],[2,-5],[2,0],[0,-5],[0,-5],[0,-5],[2,-5],[2,-10],[0,-5],[3,-5],[2,-5],[2,-5],[2,-5],[2,-5],[-2,-5],[2,-5],[3,-5],[2,-5],[2,-5],[7,-5],[-3,-6],[3,-15],[0,-5],[-3,-5],[3,-5],[4,0],[2,0],[0,-10],[5,0],[0,-5],[0,-5],[4,0],[4,-10],[14,-10],[2,-5],[0,-5],[4,-10],[2,-5],[3,-5],[-3,-5],[3,-5],[0,-5],[4,-5],[2,-5],[-2,-5],[-4,-10],[-3,0],[-2,-10],[-2,-5],[-2,-5],[-2,-20],[2,-10],[0,-16],[2,-10],[0,-10],[2,-10],[5,-10],[2,-10],[4,0],[9,-15],[7,-15],[0,-10],[0,-20],[-5,-5],[5,-10],[-9,0],[0,-15],[0,-5],[-7,0],[-22,-15],[2,-10],[-6,-5],[-5,-5],[-2,-5],[0,-10],[0,-6],[7,0],[-5,-25],[14,-10],[-5,-25],[0,-10],[5,5],[2,-10],[-5,-20],[11,-10],[3,-10],[-5,-5],[5,-10],[2,-5],[2,-5],[-2,-15],[-5,-20],[5,0],[-5,-10],[-4,0],[4,-5],[-2,-26],[-4,-5],[2,-10],[-9,-25],[-4,-10],[0,-5],[2,0],[2,0],[2,-5],[-2,-5],[-2,-5],[-7,-10],[-2,-10],[-4,-15],[4,-5],[-2,-10],[2,-5],[0,-5],[2,-5],[-2,0],[7,-5],[2,-5],[7,-20],[4,0],[7,-5],[4,5],[5,-20],[-3,-11],[5,-10],[15,-15],[5,-10],[-3,-15],[5,-15],[11,-20],[0,-5],[-5,-15],[-2,-5],[5,-20],[6,-15],[7,5],[6,0],[5,5],[9,5],[4,0],[9,10],[6,0],[5,-5],[7,-20],[4,-5],[7,-5],[15,5],[2,0],[9,0],[7,5],[8,0],[9,-15],[-4,-5],[-5,-25],[-8,-16],[4,-35],[4,-30],[-17,-20],[2,-35],[2,-5],[-13,-20],[-9,-5],[-9,-10],[0,-56],[-6,-15],[-7,0],[-9,-5],[-2,-25],[-13,-35],[-7,-10],[-9,0],[-22,10],[-6,-5],[-5,-5],[-4,-5],[-2,0],[-5,-5],[-4,-5],[-11,-5],[0,-5],[-7,0],[-4,-5],[-2,-5],[-3,0],[-2,-5],[0,-5],[-2,0],[-2,-10],[-2,-10],[0,-5],[0,-5],[-3,0],[-2,-5],[0,-5],[-2,0],[0,-5],[0,-6],[2,0],[11,-5],[2,-5],[0,-5],[3,0],[2,0],[4,0],[2,0],[3,0],[4,-15],[2,0],[0,-5],[0,-15],[-6,-15],[0,-5],[4,0],[-9,-5],[-6,-15],[-5,-20],[0,-10],[-6,-5],[-5,-10],[-20,-10],[-6,-20],[4,-30],[0,-11],[-2,-10],[15,-10],[3,-15],[11,-10],[-7,-25],[2,-20],[-2,-20],[7,-20],[0,-15],[15,-35],[42,-31],[57,-55],[55,-75],[9,-25],[2,-10],[5,-10],[0,-5],[-2,-5],[2,-11],[4,-5],[2,-5],[3,0],[4,-5],[2,0],[2,-5],[3,-5],[2,0],[2,0],[2,-5],[2,0],[3,-5],[2,0],[0,-5],[0,-5],[2,-5],[2,-5],[7,-15],[13,-5],[9,-10],[20,20],[11,15],[15,10],[36,25],[22,5],[17,-10],[18,-5],[4,5]],[[4613,4873],[5,0],[8,0],[5,0],[6,-10],[20,15],[14,-10],[8,0],[7,0],[18,5],[2,-20],[13,-25],[7,-5],[4,-20],[7,-5],[20,0],[11,-10],[6,-5],[53,-75],[29,20],[20,35],[8,-10],[40,30],[13,-10],[27,5],[9,-15],[15,-15],[7,-10],[26,5],[11,40],[44,-30],[11,-20],[11,-30],[16,5],[15,-10],[18,25],[11,5],[4,15],[9,0],[31,40],[13,20],[24,35],[60,10],[9,5],[0,10],[11,10]],[[5319,4873],[4,0],[13,-10],[7,-15],[15,-25],[11,0],[7,-30]],[[5376,4793],[2,-35],[11,10],[16,15],[13,20],[9,0],[6,-5],[5,-10],[8,0],[0,5],[12,0],[11,0],[13,-10],[9,0],[0,-5],[-3,-10],[5,-10],[2,0]],[[5495,4758],[-7,-40],[-4,-15],[-7,5],[-4,-10],[7,-16],[2,-15],[-5,-20],[0,-30],[20,-35],[-6,-15],[2,-45],[-2,-15],[4,-15],[11,-6],[0,-15],[-4,-20],[6,-25],[0,-5],[-4,-20],[-2,-25],[-14,-10],[-11,-5],[-17,5],[-11,-5],[-18,5],[-4,0],[-7,0],[0,10],[-7,10],[-8,-5],[-18,15],[-2,-15],[2,-10],[-7,-20],[5,-20],[-2,-25],[0,-5],[6,-5],[2,-21],[14,-10],[4,-70]],[[5409,4195],[-24,5],[-9,-40],[-9,-10],[-24,-50],[-13,-5],[-3,0],[-8,-21],[-3,-20],[0,-25],[7,-5],[0,-25],[-7,-25],[-6,-25],[-7,-15],[-2,-15],[7,-30],[-7,-31],[9,-15],[-9,-25],[-20,-30],[-4,-15],[-16,-25],[-13,-15],[-44,-10],[-9,-25],[0,-10],[-22,-31],[-20,-5],[-15,-10],[-9,-25],[-9,-5],[-11,-5],[-11,-5],[-11,-10],[-13,-20],[-13,0],[-25,-10],[-8,0],[-14,0],[-11,0],[-15,-5],[-18,-5],[-13,-5],[-11,0],[-18,-5],[-15,-10],[-9,0],[-4,10],[-9,5],[-4,15],[4,15],[-2,5],[-11,0],[-13,5],[-9,-5],[-9,0],[-11,5],[-35,20],[-18,5],[-9,20],[-9,10],[-8,20],[-20,5],[-9,0],[-11,5],[-5,11],[-19,5],[-14,10],[-6,10],[-11,-10],[-18,-5],[-4,-10],[-16,25],[-24,5],[-18,15],[-2,10],[-9,0],[-11,0],[-20,5],[-33,-25],[-8,0],[-9,-10],[0,-10],[-16,-31],[-11,0],[-2,0],[-4,-5],[-5,0],[-13,-10],[-4,-20],[-11,-10],[0,-10],[4,-10],[4,-15],[-2,-5],[7,-10],[0,-10],[9,-15],[-7,-15],[2,-20],[-6,-20],[-7,0],[-24,-26],[-7,6],[-20,-6],[-15,-25],[-4,-25],[-11,-5],[-9,-10],[2,-10],[-5,-5],[-17,-5],[-9,-20],[-11,0],[-2,-5],[-9,-5],[-7,-10],[-6,-5],[-9,5],[-9,-10],[-22,-10],[-18,-5],[-13,0],[-28,0],[-7,5],[-9,-5],[-35,-40],[-7,-16],[-26,-20],[-7,-5],[-6,-5],[-18,-15],[-11,-20],[-11,-10],[-7,-15],[-11,-10],[-4,-20],[-13,-5],[-9,-10],[-5,0],[-11,-20],[-11,-5],[-2,-10],[-24,-25],[-5,-11],[-13,-10],[-9,-10],[-17,-5],[-9,-5],[-9,-25],[-9,-5],[-6,0],[-9,10],[-4,10],[-11,10],[-12,25],[-6,0],[-27,21],[-33,20],[-50,35],[-31,25],[-5,-10],[-2,-15],[-4,-10],[-9,0],[-15,-5],[-3,-10],[0,-15],[3,-15],[-9,-26],[-7,-5],[-7,0],[-4,-10],[4,-20],[0,-10],[-6,-5],[-7,-15],[-17,15],[-7,15],[-13,0],[-11,-10],[-13,-5],[-7,-5],[-2,-5],[-5,10],[-11,0],[-13,-10],[-20,0],[-13,-10],[-2,-15],[-9,-35],[26,-25],[14,-5],[17,-25],[-31,-26],[-6,-35],[-27,-15],[-42,10],[-11,-30],[-6,0],[-11,10],[-9,-10],[-7,5],[-4,5],[2,15],[-4,35],[-11,15],[-11,-5],[-2,-15],[-7,-15],[-13,0],[-5,-10],[-6,15],[0,5],[-5,10],[-31,5],[-11,15],[-8,-5],[-14,-20],[-24,-5],[-4,-5],[-25,-15],[-4,-10],[-4,15],[-16,-20],[-11,-20],[-4,0],[-9,-20],[-2,-5],[-7,5],[-9,-20],[-13,-15],[-11,-5],[-9,-20],[-11,-15],[-13,5],[-24,-20],[-29,-16],[-20,0],[-9,21],[-6,20],[0,10],[4,10],[-4,10],[2,5],[2,5],[5,15],[2,35],[-7,25],[-24,-40],[-9,-5],[-9,5],[-15,-10],[-49,-35],[0,-15],[0,-35],[-4,-21],[4,-30],[-4,-5],[-9,-20],[-6,-10],[-7,-5],[-7,-5],[-6,-5],[-22,-5],[-29,10]],[[2788,2567],[4,101],[-8,40],[2,0],[2,5],[4,5],[3,0],[2,0],[2,0],[2,0],[0,5],[2,5],[5,5],[-5,0],[-4,15],[-15,-15],[-7,0],[-13,40],[0,5],[-2,5],[-5,10],[0,5],[0,10],[0,5],[2,0],[0,5],[-4,0],[-9,0],[-17,0],[2,25],[6,26],[3,10],[4,10],[4,20],[5,15],[6,15],[-2,25],[7,40],[-7,25],[-9,10],[-6,10],[-2,21],[-14,25],[5,35],[15,0],[7,-10],[17,5],[22,10],[5,10],[2,10],[0,20],[0,10],[13,10],[-11,15],[7,15],[-2,5],[4,25],[-9,31],[0,10],[-4,15],[-2,50],[6,-5],[2,0],[5,5],[13,5],[0,25],[-7,10],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[2,0],[2,5],[0,5],[2,5],[3,5],[2,0],[0,5],[0,5],[0,5],[0,5],[0,5],[2,0],[2,5],[2,5],[-2,0],[0,5],[0,6],[2,0],[0,5],[3,5],[0,5],[-3,5],[0,5],[0,5],[3,5],[2,10],[0,20],[-2,0],[0,5],[0,5],[0,10],[0,5],[-3,5],[0,5],[0,5],[0,5],[-2,0],[0,5],[-2,0],[0,5],[0,5],[2,10],[0,5],[0,5],[-2,5],[-2,5],[-2,5],[-3,5],[-6,15],[-5,5],[0,41]],[[2823,3698],[7,0],[13,10],[11,15],[9,5],[11,15],[18,55],[11,20],[8,15],[3,5],[6,5],[2,10],[9,-15],[9,-5],[5,0],[4,-5],[2,0],[2,0],[0,-5],[3,0],[4,0],[20,10],[11,40],[17,16],[-13,40],[7,80],[0,15],[-13,15],[2,76],[20,0],[8,10],[9,15],[-4,20],[-16,45],[3,0],[50,0],[11,-20],[-2,-10],[7,-10],[6,0],[3,-10],[-3,-15],[3,-15],[2,0],[4,25],[9,15],[7,10],[22,35],[-18,-5],[4,15],[3,20],[0,10],[2,15],[0,10],[9,31],[0,5],[-7,20],[11,20],[-4,20],[9,10],[-7,15],[-18,0],[-9,10],[-4,20],[-7,-5],[-33,5],[0,5],[0,5],[3,5],[2,5],[2,0],[0,10],[2,0],[0,5],[0,5],[2,5],[0,5],[-2,10],[0,6],[-2,5],[-4,0],[-3,0],[-2,0],[-4,5],[-7,0],[-2,0],[-4,0],[-7,5],[-2,0],[-2,0],[-3,5],[-4,0],[-2,5],[-3,0],[-2,0],[-4,0],[-2,0],[-5,0],[-2,0],[-2,0],[-9,0],[-7,5],[-2,0],[-2,0],[0,-5],[-2,0],[-5,5],[-2,0],[0,5],[-2,0],[0,5],[-4,5],[-3,5],[-2,0],[-4,5],[0,5],[0,5],[-2,10],[-3,10],[0,5],[0,5],[0,10],[0,20],[16,50],[2,15],[-2,5],[0,11],[0,5],[0,25],[0,5],[-5,5],[0,15],[-2,0],[-2,0],[-2,0],[2,5],[-2,5],[-7,0],[0,5],[-2,0],[0,5],[-2,5],[0,5],[0,5],[-2,5],[-3,0],[-2,0],[0,5],[5,5],[4,5],[2,5],[2,0],[0,5],[3,5],[2,0],[2,5],[4,5],[-2,0],[0,5],[2,5],[3,0],[2,5],[2,0],[0,5],[0,5],[-2,0],[-2,0],[0,5],[0,5],[0,5],[2,5],[0,5],[-2,5],[0,5],[0,6],[0,5],[2,5],[4,5],[2,0],[0,5],[0,5],[3,0],[0,5],[0,5],[2,5],[0,5],[2,5],[0,5],[0,5],[0,5],[2,5],[2,0],[0,10],[0,5],[3,0],[2,0],[2,5],[4,5],[0,5],[3,0],[2,5],[2,0],[2,5],[2,0],[0,5],[-4,5],[0,5],[4,5],[0,5],[0,10],[0,5],[-2,5],[0,5],[0,5],[2,0],[0,5],[5,5],[11,5],[2,0],[0,5],[5,10],[0,11],[-3,0],[0,5],[-15,30],[-33,30],[-5,15],[-8,10],[22,20],[0,15],[4,0],[-2,10],[2,0],[4,10],[5,-5],[-2,-5],[6,0],[9,0],[16,-15],[-7,-10],[-5,5],[-6,-10],[6,-15],[12,-5],[6,5],[2,-10],[5,5],[0,-5],[2,0],[0,5],[2,0],[2,0],[3,0],[2,5],[2,0],[2,0],[2,5],[3,0],[2,5],[2,0],[4,0],[3,0],[2,0],[0,5],[0,5],[2,5],[2,0],[0,5],[0,5],[2,5],[3,0],[4,5],[2,5],[0,5],[0,5],[-2,10],[0,5],[0,10],[0,5],[-2,0],[-2,5],[-3,0],[-2,5],[-2,5],[0,6],[-2,10],[0,5],[2,5],[0,10],[0,5],[0,5],[0,15],[2,5],[-2,5],[-2,5],[-7,5],[-17,10],[-7,0],[-7,5],[-2,0],[-2,0],[-2,5],[-5,0],[-4,5],[-2,0],[-3,0],[-2,0],[-4,0],[-2,0],[-3,0],[-4,-5],[-9,0],[-2,0],[-11,0],[-4,0],[-3,0],[-11,0],[-4,0],[-2,5],[-5,0],[-2,0],[-11,0],[-2,0],[-2,-5],[-2,0],[-3,0],[-4,-10],[-2,-5],[-5,0],[-2,0],[-4,0],[-3,5],[-4,0],[-2,5],[-5,5],[-2,0],[-2,0],[-2,0],[-2,0],[-3,5],[-2,0],[-6,10],[-3,5],[-2,0],[-2,5],[-4,0],[-3,0],[-2,0],[-4,5],[-2,0],[-3,0],[-2,0],[-4,0],[-2,0],[-5,5],[-2,0],[-2,0],[-2,-10],[-14,0],[-4,5],[-5,0],[-6,25],[-11,-5],[-5,0],[-4,-10],[-9,-15],[-11,20],[-9,5],[-17,-5],[-11,-15],[-16,5],[9,10],[2,5],[14,5],[19,25],[-4,20],[0,11],[2,5],[0,5],[0,10],[-2,5],[0,5],[-2,5],[2,0],[0,15],[11,0],[0,10],[4,5],[-2,15],[-4,0],[-2,10],[-14,20],[3,5],[-3,10],[16,15],[0,10],[0,5],[0,15],[-5,0],[0,10],[3,10],[0,5],[2,5],[2,6],[0,5],[-4,5],[-5,15],[-15,-5],[-7,5],[-4,5],[0,10],[4,0],[5,0],[17,0],[2,20],[14,-5],[2,20],[4,0],[0,10],[13,10],[-4,5],[13,15],[7,10],[4,10],[5,5],[4,5],[-2,10],[-13,15],[0,5],[-9,10],[-5,0],[3,5],[6,16],[-2,10],[-7,-5],[-2,20],[-11,25],[-4,-10],[-5,10],[-6,-15],[-11,10],[-11,-20],[-9,0],[2,-10],[-22,-15],[-18,-16],[-17,-15],[-22,-15],[-16,-10],[-15,-5],[-20,-10],[-97,-35],[-4,5],[-5,0],[-70,0],[-14,0]],[[2415,5823],[-26,15]],[[2389,5838],[-33,131],[2,0],[2,10],[5,10],[2,0],[4,15],[0,5],[5,15],[0,5],[0,10],[-2,20],[0,25],[0,10],[2,5],[6,15],[5,11],[26,30],[7,0],[2,5],[18,0],[6,5],[7,10],[2,5],[2,0],[3,5],[2,0],[2,5],[2,0],[5,5],[22,30],[4,10],[-4,10],[0,5],[-5,5],[-2,5],[-4,5],[0,5],[0,5],[-3,0],[-2,0],[0,10],[2,5],[0,10],[0,5],[-2,5],[-2,0],[-2,5],[-2,5],[22,31],[0,20],[-7,10],[-18,40],[-28,20],[-13,0],[-18,25],[-18,20],[-26,-25],[-13,40],[19,41],[18,20],[-4,15],[-18,0],[-9,-15],[-33,-5],[-7,5],[-24,-25],[-28,-11],[-27,-10],[-44,-10],[-9,-5],[-17,-15],[-3,5],[-6,-5],[-13,20],[-7,-20],[-20,-20],[-35,-35],[-35,-30],[-42,-35],[8,85],[23,30],[11,81],[6,35],[-62,176]],[[1994,6773],[5,10],[20,30],[11,-65],[4,-10],[2,-11],[-2,-5],[2,-10],[5,-5],[4,-15],[20,20],[29,15],[6,11],[16,20],[37,40],[11,20],[5,25],[2,25],[9,0],[15,10],[9,-15],[-7,-5],[7,-10],[11,5],[20,-5],[15,-30],[7,-5],[9,10],[6,10],[7,30],[11,15],[0,10],[2,20],[44,10],[16,5],[6,10],[9,21],[9,30],[2,10],[4,15],[16,45],[0,5],[6,20],[11,5],[16,15],[-7,30],[3,21],[2,5],[13,10],[9,0],[24,20],[2,-25],[11,10],[5,-5],[4,-10],[-7,-10],[5,-16],[17,0],[5,16],[9,15],[4,0],[5,0],[6,-5],[5,0],[4,0],[13,10],[22,5],[24,-10],[3,10],[11,0],[11,5],[4,5],[7,5],[-7,15],[-9,15],[7,5],[0,5],[-9,0],[-11,0],[0,20],[7,0],[2,5],[4,5],[0,5],[-4,0],[-2,10],[6,20],[5,5],[22,10],[17,15],[-2,31],[0,10],[5,0],[-3,15],[-8,0],[0,10],[8,15],[-13,10],[2,5],[11,5],[11,-5],[45,10],[26,0],[7,-5],[-7,-15],[9,-15],[6,5],[5,0],[20,-10],[17,0],[25,-15],[33,5],[0,5],[8,0],[7,0],[7,-5],[13,-10],[13,0],[13,5],[0,5],[14,0],[22,10],[11,0],[22,10],[13,30],[20,20],[11,25],[24,0],[4,0],[11,5],[22,15],[22,25],[7,5],[5,-5],[22,-5],[4,0],[31,0],[13,0],[2,-15],[16,-5],[2,-10],[11,5],[9,-5],[22,5],[4,5],[40,-10],[31,0],[4,0],[5,-10],[17,-15],[9,0],[15,5],[7,0],[2,5],[20,15],[27,35],[17,10],[42,20],[20,11]],[[3531,7557],[-22,-31],[0,-10],[-2,-40],[-18,-20],[2,-15],[-4,-10],[-13,-15],[-25,0],[-13,-5],[-44,-25],[0,-5],[-18,-15],[-4,0],[-15,-31],[-14,-40],[-9,-25],[-4,0],[-4,0],[-14,-5],[-13,-5],[-13,0],[-13,0],[-11,-15],[-18,-20],[-18,-5],[-6,-15],[2,-15],[2,-20],[7,-10],[-13,-15],[-7,5],[-7,-5],[-15,-26],[-9,-5],[-35,-25],[-11,-10],[-31,-35],[-4,0],[-5,0],[-2,0],[-2,5],[-5,0],[-33,-15],[11,-55],[5,0],[15,-76],[27,10],[4,-15],[15,-10],[7,-10],[7,-15],[24,-90],[-4,0],[-11,0],[-7,-5],[0,-5],[2,-15],[0,-5],[5,0],[4,0],[2,0],[2,0],[0,5],[3,0],[4,0],[2,-5],[2,5],[3,0],[8,10],[3,0],[2,0],[4,0],[5,0],[11,-5],[2,0],[4,5],[5,5],[2,5],[0,10],[2,10],[2,10],[2,0],[3,5],[2,0],[2,0],[5,5],[4,0],[4,5],[5,5],[4,5],[0,5],[0,5],[-2,15],[0,10],[2,5],[5,5],[4,0],[2,0],[2,0],[5,-15],[4,-5],[2,0],[7,0],[4,10],[5,5],[0,5],[-2,5],[-3,15],[3,0],[0,5],[2,0],[2,-5],[2,0],[5,0],[6,0],[5,0],[11,5],[13,5],[11,0],[4,-15],[-8,-10],[4,-15],[-9,-10],[7,-10],[2,0],[4,-10],[5,0],[4,-25],[11,10],[18,-15],[4,5],[2,-10],[-15,-20],[7,-15],[-11,-10],[-7,-5],[-7,-11],[-4,-15],[-2,-5],[-5,0],[-4,0],[-7,-10],[-9,-5],[-11,15],[-6,-5],[-2,10],[-9,5],[-11,0],[-22,-30],[2,-20],[-2,-10],[-7,0],[-6,0],[-7,-5],[-9,-10],[-2,-10],[-9,-15],[9,-25],[9,5],[2,-15],[9,10],[2,-10],[-2,-10],[-5,5],[0,-10],[16,-5],[0,-5],[-7,-5],[-4,5],[-11,0],[-2,0],[-3,0],[-13,-10],[-11,0],[-15,-10],[-9,-10],[-5,0],[-19,20],[-11,-10],[-3,10],[0,5],[-4,15],[-9,-15],[-4,0],[-5,5],[-9,-5],[-2,-5],[-6,5],[-3,-10],[5,-21],[-7,-5],[11,-20],[5,-20],[6,-10],[0,-5],[7,-30],[0,-15],[9,0],[6,-5],[3,-10],[13,0],[11,5],[9,5],[8,5],[7,5],[4,5],[14,10],[6,-10],[5,0],[17,10],[9,-30],[-4,0],[2,-10],[-4,-5],[0,-10],[-3,0],[5,-40],[4,-15],[7,-11],[2,-10],[4,0],[25,10],[0,-5],[4,0],[2,11],[2,0],[0,5],[3,0],[2,0],[4,5],[2,0],[5,0],[2,0],[4,0],[0,5],[5,10],[0,5],[2,5],[5,5],[2,5],[2,5],[0,5],[-2,5],[-2,0],[-5,10],[-9,25],[-11,35],[2,5],[-4,20],[31,20],[11,5],[26,20],[3,6],[11,15],[2,5],[2,0],[7,5],[2,0],[4,5],[5,5],[2,0],[2,5],[2,5],[2,5],[3,10],[2,5],[0,10],[0,5],[2,5],[2,5],[0,5],[3,5],[0,5],[2,0],[0,5],[4,5],[7,5],[0,5],[0,5],[0,5],[2,5],[0,5],[2,0],[2,5],[5,5],[2,0],[0,10],[-7,15],[-2,0],[-2,0],[-4,26],[-5,0],[0,5],[7,5],[9,0],[0,5],[11,5],[4,5],[2,-10],[9,5],[4,5],[9,-20],[9,10],[7,15],[15,15],[13,0],[-2,-10],[2,0],[0,-10],[3,0],[6,-5],[13,5],[11,-20],[3,0],[2,-5],[-2,-6],[2,0],[-2,-10],[4,0],[4,-35],[3,-5],[4,15],[2,0],[9,10],[11,-5],[15,5],[23,10],[2,5],[6,-10],[7,-5],[15,0],[5,5],[2,-5],[7,0],[2,-5],[2,5],[7,5],[2,-10],[9,-15],[2,5],[2,0],[7,0],[2,0],[0,5],[2,0],[2,5],[-2,20],[-2,0],[0,5],[4,21],[-2,5],[2,0],[16,30],[2,0],[9,5],[2,-5],[15,0],[0,20],[0,10],[7,10],[4,35],[-4,0],[0,5],[-7,0],[-2,0],[-2,5],[4,15],[3,5],[2,10],[-9,10],[2,10],[-6,-5],[0,10],[-7,0],[0,10],[-4,0],[-3,6],[-2,10],[-33,5],[9,25],[-5,15],[-2,5],[-4,20],[2,15],[2,5],[-17,15],[-3,10],[11,10],[-8,20],[-11,-15],[-3,10],[-6,-10],[-5,5],[-6,-10],[-7,20],[-4,-5],[-5,0],[-6,25],[-2,0],[-9,20],[-5,0],[0,11],[-6,-6],[-3,11],[-2,10],[-4,-5],[-7,15],[-4,0],[-2,5],[2,25],[2,15],[-9,50],[0,10],[-9,10],[-2,5],[-11,15],[-9,20],[60,20],[13,6],[31,5],[48,0],[7,5],[9,10],[9,10],[15,5],[5,5],[4,-5],[13,5],[18,25],[9,-20],[22,-20],[4,5],[11,-36],[2,6],[5,-11],[-2,-5],[6,-5],[-4,-5],[6,-10],[7,15],[22,-35],[0,-20],[18,-35],[11,5],[13,-15],[13,10],[16,-5],[11,25],[6,20],[20,0],[4,-30],[20,-25],[2,5],[12,15],[4,5],[11,25],[4,5],[3,5],[2,0],[2,0],[2,0],[2,0],[0,-5],[0,-5],[0,-5],[3,-5],[6,-5],[5,-5],[2,0],[2,0],[2,0],[5,0],[2,0],[2,0],[7,10],[4,5],[2,0],[0,5],[2,0]],[[3800,6758],[-5,-5],[0,-10],[-8,-26],[4,-5],[13,5],[18,-10],[9,31],[4,-6],[5,11],[4,5],[0,5],[-11,0],[-7,10],[-2,5],[-7,0],[3,10],[-9,-5],[0,-5],[-5,-5],[-4,-10],[-2,5]],[[2779,5577],[5,-20],[11,15],[2,-5],[9,10],[4,10],[9,-5],[0,20],[0,25],[-11,10],[-5,-5],[3,-10],[-27,-20],[5,-5],[-3,-5],[-2,5],[-2,-5],[2,-15]],[[2484,5416],[9,5],[0,10],[4,5],[-4,10],[8,5]],[[2501,5451],[5,-5],[4,5],[5,-15],[13,5],[2,-5],[-20,-20],[-9,-20],[-15,5],[-2,5],[0,10]],[[2601,5522],[0,-26],[6,-20],[-2,0],[-7,0],[-2,-5],[-13,-10],[-4,-10],[-5,-5],[-2,-10],[-7,5],[-2,5],[-2,15],[2,5],[-13,25],[2,10],[2,16],[22,15],[5,0],[-2,-5],[2,-5],[6,10],[11,0],[3,-10]],[[3531,7557],[-9,5],[-13,-5],[-35,-5],[-9,10],[13,50],[0,5],[35,35],[0,10],[5,10]],[[3518,7672],[11,-5],[0,-10],[6,0],[5,-5],[24,-60],[-4,-15],[-5,-10],[-15,-15],[-9,5]],[[4150,7114],[3,10],[4,0],[2,-10],[24,-10],[31,25],[58,26],[2,5],[33,5],[15,-20],[11,-11],[25,-10],[15,26],[13,10],[13,30],[5,5],[6,10],[9,10],[-4,10],[0,5],[0,5],[-2,0],[0,5],[-3,5],[-2,0],[-2,0],[0,5],[0,5],[0,5],[-2,5],[-2,5],[-3,5],[0,10],[-4,5],[0,5],[0,5],[-2,10],[4,0],[0,10],[11,10],[33,-5],[2,0],[3,-10],[4,5],[27,5],[17,31],[7,-11],[13,-25],[0,-10],[2,-10],[0,-10],[7,-10],[4,-10],[9,-15],[4,-10],[0,-5],[0,-5],[3,-5],[0,-5],[-3,-5],[0,-10],[0,-5],[0,-10],[0,-10],[-2,-15],[0,-5],[11,0],[5,-10],[9,0],[6,-5],[2,5],[44,15],[3,-5],[26,15],[-11,20],[-2,5],[0,10],[-2,10],[6,0],[0,5],[9,0],[7,-10],[2,0],[4,0],[9,0],[2,10],[7,5],[4,5],[-2,5],[9,5],[13,10],[24,-15],[16,-40],[0,-15],[6,-20],[25,-5],[11,-15],[11,10],[4,15],[9,5],[15,0],[16,5],[13,5],[5,0],[0,5],[4,-5],[33,20],[0,-5],[7,0],[4,-5],[2,-20],[-2,-5],[-4,-5],[-7,-25],[-9,0],[-2,10],[-4,-5],[-27,-11],[0,-5],[7,0],[6,-10],[0,-5],[-4,-5],[0,-5],[13,-20],[2,0],[5,-5],[6,0],[0,-5],[5,5],[-2,-15],[2,0],[4,-15],[22,5],[18,10],[-2,5],[4,0],[20,0],[2,0],[-2,20],[-2,0],[0,30],[4,0],[2,10],[-4,26],[9,25],[22,20],[2,0],[2,5],[18,100],[11,5],[4,-5],[16,-5],[-3,20],[5,0],[-2,15],[6,5],[0,6],[9,0],[0,15],[5,5],[0,5],[17,5],[7,-20],[20,0],[4,-10],[13,5],[0,-5],[18,-11],[15,-30],[9,-5],[5,-5],[0,-5],[-3,-5],[-2,0],[-2,0],[-2,-10],[-2,0],[0,-5],[0,-5],[0,-5],[2,-10],[0,-5],[0,-10],[2,0],[0,-5],[2,-5],[0,-5],[2,-5],[5,-15],[4,0],[2,0],[5,-5],[11,-30],[9,-25],[-3,-21],[3,-25],[8,-40],[5,-10],[-5,-25],[16,-5],[0,-5],[2,-15],[2,-25],[5,-10],[0,-10],[2,-26],[4,-15],[11,-25],[3,-20],[-3,-5],[0,-25],[7,-20],[0,-5],[7,-5],[4,-15],[0,-10],[7,-10],[-3,-5],[7,-10],[15,-31],[0,-20],[7,-5],[2,-30],[29,-15],[2,-20],[13,5],[2,0],[16,0],[7,-10],[6,5],[5,-5],[8,5],[7,-5],[7,5],[8,10]],[[5413,6647],[7,-25],[2,-15],[0,-10],[2,0],[-4,-20],[-2,-5],[2,-10],[7,-10],[0,5],[2,0],[2,0],[7,5],[2,-5],[2,5],[9,0],[2,-5],[9,10],[9,10],[9,10],[8,0],[5,5],[9,-81],[8,0],[7,5],[7,5],[4,0],[2,5],[2,0],[3,6],[0,5],[31,35],[28,-61],[-2,-70]],[[5592,6441],[-33,30],[-4,10],[0,5],[-3,10],[-2,5],[-7,0],[0,5],[-15,-10],[-9,5],[0,5],[-22,5],[-2,-15],[-4,0],[-3,0],[-4,5],[-4,-5],[-5,-5],[-2,0],[-2,0],[-2,-5],[0,-5],[0,-5],[0,-5],[-5,5],[-2,-5],[-4,0],[-9,-5],[-5,-5],[-4,0],[-2,-5],[-3,0],[-2,-5],[-17,-35],[-7,-5],[-2,-10],[2,-5],[0,-10],[4,-15],[-4,-15],[-9,-15],[-22,-36],[-15,-10],[0,-15],[4,-35],[20,-5],[7,5],[59,20],[2,0],[9,-5],[13,-5],[11,-15],[-4,-5],[4,-5],[14,-10],[22,-30],[4,-10],[15,-5],[9,-20],[5,-10],[13,-15],[13,-21],[7,-20],[11,-5],[9,-25],[13,5],[15,-15],[-2,-50],[-9,-40],[-9,0],[-8,-15],[-14,0],[-26,-20],[-20,-5],[-13,5]],[[5537,5924],[2,60],[-90,40],[-5,-70],[2,-20],[-2,-5],[-26,0],[-9,5],[-24,10],[-7,0],[-24,-15],[-5,15],[5,10],[-2,75],[-33,5],[-75,-151],[-36,56],[-11,-5],[-6,-5],[-13,0],[-7,5],[-4,-5],[-3,0],[-2,0],[-2,0],[-2,0],[-2,0],[-3,-10],[-6,0],[-5,-6],[-15,0],[-9,16],[-29,0],[-11,-10],[-11,-11],[-15,-35],[-9,-5],[-13,30],[-7,-5],[-13,5],[-2,-5],[-2,-5],[-5,-10],[-2,-10],[-2,0],[-2,-5],[-3,-10],[-4,-10],[-2,0],[11,-25],[13,-15]],[[5010,5803],[0,-15],[-7,-5],[-19,0],[-31,-10],[-36,25],[-11,-15],[-11,0],[-24,-15],[-9,-10],[-6,-15],[-9,-5],[0,-5],[-11,-5],[2,-26],[31,-70],[-18,-30],[-6,0],[-25,-30],[-11,-20],[-6,-5],[-20,-41],[-7,-25],[-13,-40],[-13,-40],[-7,10],[-4,15],[6,50],[-2,0],[-15,5],[-13,15],[-5,-10],[-9,-5],[-6,-15],[0,-10],[-7,-20],[-11,-15],[-11,0],[-6,-5],[0,-25],[-7,-15],[4,-30],[5,0],[0,-20],[2,-20],[-7,-16],[0,-10],[-6,-10],[2,-10],[0,-10],[-2,-15],[-9,-10],[-5,5],[-6,-5],[2,0],[0,-5],[-2,-5],[2,-5],[0,-5],[2,-5],[-6,-15],[-14,-25],[-8,-5],[-9,-35],[13,-26],[-2,-15],[9,-20],[28,-85],[0,-25],[-6,0],[0,-5],[-14,-15],[5,-15],[-2,-15],[-16,-26]],[[6566,5537],[18,-51],[2,-20],[11,-25],[9,0],[0,-15],[9,-50],[2,-35],[0,-5],[-4,-25],[-20,-11],[-11,-10],[-9,-15],[-11,-10],[-16,-10],[-8,-5],[-9,-10],[-9,0],[-11,5],[-9,-20],[-11,-15],[-6,-20],[-9,-10],[-9,-5],[-18,-10],[-6,-5],[-7,-5],[-9,-10],[7,-10],[0,-25],[15,-21],[2,-10],[-4,-45],[-9,-20],[0,-5],[2,-10]],[[6438,4999],[-6,-20],[-11,-10],[-20,-5],[-15,-30],[-11,-10],[0,-10],[0,-10],[-18,0],[-2,10],[-11,-5],[-5,-10],[-9,-6],[-2,-10],[0,-20],[5,-20],[-3,-15],[7,-25],[0,-15],[7,-20],[-7,-10],[-11,5],[-9,-10],[-9,-10],[0,-15],[-4,-10],[-2,-10],[-2,-10],[2,-11],[-5,-10],[-6,-25],[6,-35],[-19,-15],[-9,-15],[-9,5],[-5,0],[-13,-5],[-13,-15],[-2,15],[-9,5],[-9,40],[-6,5],[0,10],[0,5],[-9,5],[-20,-20],[-20,-25],[-9,-35],[11,-40],[-2,-15],[-11,-10],[-18,-10],[-13,-26],[-6,-5],[-18,-10],[-2,-15],[-18,-20],[-13,20],[-7,5],[-4,-5],[-7,0],[-4,-5],[-5,-5],[-4,-20],[-7,-15],[-4,5],[-4,0],[-9,0],[-5,-5],[-4,-10],[0,-20],[2,-15],[-4,-10],[-2,-5],[2,-5],[2,-5],[0,-15],[0,-30],[7,-16],[4,-20],[-29,-40],[-11,0],[-13,-30],[7,-15],[-5,-15],[5,-10],[-11,-15],[-5,-15],[13,-25],[3,-26],[13,-15],[4,-5],[5,-10],[6,0],[14,-5],[4,-15],[-2,-30],[4,-20],[-4,-10],[0,-30],[6,-15],[-2,-20],[5,-11],[-7,-30],[0,-20]],[[6002,3823],[-13,-5],[-13,-5],[-9,-15],[-7,-5],[-4,-10],[-9,-15],[-13,-10],[-11,-5],[-18,-5],[-9,10],[-4,25],[2,15],[-4,0],[-5,10],[-13,10],[-7,0],[-4,0],[-9,-15],[-22,-5],[-24,-5],[-13,20],[-7,0],[-9,25],[-9,10],[-17,-15],[-16,5],[-6,-5],[-16,5],[-20,25],[-6,-10],[-11,0],[-11,-20],[-2,-15],[-9,-5],[2,-10],[-5,-10],[3,-30],[-9,-15],[-5,-15],[-4,-10],[7,-20],[-5,-20],[9,-21],[4,-40],[-19,-10],[-9,-5],[-2,-5],[-9,0],[-7,-5],[-9,5],[-8,-10],[-18,-5],[-2,-10],[-9,-10]],[[5559,3567],[-11,5],[-18,35],[-15,-15],[-29,20],[-11,20],[-6,-5],[-5,0],[-4,15],[-9,0],[-5,20],[-4,21],[-4,20],[2,25],[-5,0],[-2,5],[-2,10],[0,15],[-7,25],[-15,30],[0,20],[-4,5],[0,10],[-5,10],[9,56],[-4,10],[0,10],[13,20],[6,30],[0,10],[7,15],[0,45],[4,10],[-2,5],[-4,41],[2,5],[2,45],[2,10],[-8,20],[-18,5]],[[5495,4758],[20,15],[11,5],[9,5],[6,-5],[7,-5],[22,10],[18,15],[-7,45],[-4,10],[-5,10],[-13,15],[9,26],[0,5],[-2,20],[-23,-15],[-6,10],[-7,0],[2,5],[-4,5],[18,-5],[22,20],[2,30],[-11,25],[4,5],[7,10],[2,15],[0,30],[7,25],[6,26],[31,25],[5,10],[-3,10],[5,0],[-11,15],[-9,30],[-9,-5],[-13,5],[-15,15],[-7,0],[-2,-10],[-11,0]],[[5546,5210],[-9,30],[6,35],[-2,15],[-6,21],[2,10],[9,5],[6,10],[9,15],[-4,25],[-9,15],[2,10],[-7,10],[-11,15],[-8,-5],[-7,10],[13,25],[7,5],[29,20],[6,15],[5,31],[11,5],[8,-5],[7,5],[11,-26],[29,21],[6,10],[2,15],[27,5],[26,20],[0,10],[7,10],[2,15],[-9,20],[11,0],[16,5],[0,-5],[6,5],[-6,5],[2,20],[-2,5],[2,10],[-2,15],[0,46],[-2,15],[11,15],[6,20],[-2,15],[13,10],[14,35],[0,10],[-11,30]],[[5760,5888],[28,15],[33,-15],[13,-15],[3,-25],[-7,-35],[7,-30],[0,-86],[33,0],[11,5],[9,-15],[6,0],[13,0],[7,0],[4,0],[0,-5],[7,0],[7,-5],[4,0],[9,-5],[2,0],[4,-5],[3,0],[2,0],[2,0],[7,0],[2,0],[4,-5],[3,0],[2,0],[2,-5],[2,0],[5,5],[2,0],[6,0],[3,5],[4,0],[4,0],[5,0],[4,0],[5,0],[6,5],[7,0],[9,-20],[6,-50],[-6,-20],[2,-15],[4,-15],[11,-10],[7,-20],[4,5],[7,5],[9,0],[4,5],[5,10],[4,10],[2,10],[11,10],[0,5],[5,0],[2,5],[6,-5],[5,20],[17,0],[-2,15],[2,0],[11,-10],[42,30],[5,5],[6,-5],[0,-10],[11,-25],[20,-15],[9,5],[13,30],[16,10],[13,10],[7,-10],[13,-10],[2,-5],[13,0],[0,-15],[7,-10],[-5,-30],[5,-5],[-5,-10],[0,-15],[18,-56],[13,5],[0,5],[3,5],[2,5],[4,0],[0,5],[2,0],[0,5],[3,0],[0,-5],[2,-5],[2,-10],[0,-5],[-2,-5],[0,-5],[-2,-5],[0,-10],[0,-10],[2,-5],[0,-25],[-2,-25],[11,-30],[2,5],[2,10],[4,5],[7,5],[2,10],[2,20],[7,-5],[15,0],[5,0],[17,15],[5,15],[6,5],[9,5],[9,0],[2,10],[5,0],[4,5],[2,10],[5,0],[4,0],[5,5],[6,0],[2,10],[11,0],[5,15],[6,0],[3,6],[6,0],[5,10],[8,5],[5,10],[4,0]],[[5760,5888],[-58,-50],[-53,0],[-48,-20],[-71,40],[7,66]],[[5592,6441],[62,-50],[4,0],[2,5],[3,0],[2,5],[4,0],[2,0],[3,0],[2,0],[4,0],[2,0],[5,0],[2,0],[2,0],[5,0],[4,10],[2,0],[2,0],[3,0],[4,0],[2,0],[5,0],[2,0],[2,0],[24,0],[0,-5],[5,-30],[-7,-20],[4,-5],[7,-5],[16,5],[8,15],[7,-5],[13,10],[7,0],[2,15],[9,10],[11,0],[6,0],[11,5],[3,15],[6,0],[49,-5],[6,-5],[18,15],[0,20],[9,15],[9,20],[15,20],[2,5],[-2,15],[24,5],[3,0],[0,5],[-3,6],[0,5],[3,0],[0,5],[2,5],[2,0],[2,0],[2,5],[3,0],[2,5],[-2,5],[2,0],[0,5],[2,0],[4,0],[3,0],[0,5],[0,10],[2,5],[4,5],[2,5],[-2,5],[-2,5],[4,10],[3,0],[0,5],[0,5],[-3,0],[-2,5],[-2,10],[0,5],[2,5],[2,5],[3,5],[2,5],[0,5],[4,5],[2,5],[3,0],[2,0],[2,5],[4,5],[3,0],[4,0],[2,5],[2,0],[-4,10],[0,10],[-2,10],[0,11],[-2,5],[-3,15],[-8,5]],[[6286,7049],[3,-10],[26,-35],[18,-15],[26,-5],[221,50],[11,0],[6,-5],[5,0],[4,0],[7,0],[6,0],[5,0],[6,5],[5,0],[2,0],[6,0],[3,-5],[2,0],[4,-20],[-11,-10],[-9,-66],[-15,6],[7,-61],[2,-15],[0,-10],[0,-10],[17,-5],[3,5],[4,0],[2,10],[9,0],[9,5],[11,-5],[11,-10],[7,-5],[6,-5],[-4,-5],[13,-15],[0,5],[4,-10]],[[6718,6808],[3,0],[-3,0]],[[6718,6808],[-26,-55],[-9,-21],[-26,-70],[-3,-5],[-2,-15],[-15,-15],[4,-15],[-2,0],[2,-20],[-9,-40],[5,-15],[11,-5],[4,-16],[-6,-15],[0,-10],[-5,-10],[5,-20],[-25,-20],[-8,-20],[-5,-10],[0,-15],[11,-5],[29,-15],[6,-5],[-4,-10],[-15,-10],[2,-10],[-5,-15],[-8,-6],[2,-5],[-2,-15],[-5,-10],[-2,-10],[-9,-10],[-6,-25],[-5,-30],[-2,-30],[-11,0],[-7,-10],[-2,-10],[-40,-35],[-11,5],[-4,5],[-26,-10],[-3,-11],[0,-20],[7,-25],[-20,-10],[0,-5],[-4,0],[0,-5],[2,-5],[2,-5],[2,0],[3,0],[2,0],[2,0],[4,0],[5,-5],[15,-15],[2,-25],[0,-15],[11,-10],[5,-25],[6,-10],[3,5],[15,-20],[7,-31],[6,-10],[3,0],[4,-10],[7,5],[0,-15],[-20,-15],[31,-75],[6,10],[16,-30],[26,-15],[7,-5],[-5,-5],[-4,0],[-7,-10],[-2,-6],[-2,-35],[-5,-5],[-11,-40],[3,-15],[4,-10],[2,-10],[5,0],[6,-15],[-2,-10],[-20,-5],[-2,-5],[-11,0],[-11,-15],[-7,0],[-11,-10]],[[5010,5803],[13,10],[13,-5],[9,0],[11,20],[7,10],[9,0],[9,0],[4,-10],[22,5],[20,-15],[17,5],[25,5],[13,-10],[0,-10],[7,-25],[-9,-65],[9,-21],[-25,-30],[-15,-30],[-9,-30],[16,-10],[13,-10],[2,-5],[7,-15],[2,0],[2,0],[2,0],[5,-5],[0,-5],[6,5],[5,-5],[4,5],[13,0],[33,20],[7,-15],[0,-25],[-7,-15],[9,-5],[2,-10],[-4,-31],[-9,-20],[-2,-10],[7,-30],[-3,-35],[-11,-20],[0,-25],[-11,-15],[5,-20],[-3,-11],[11,-20],[0,-15],[3,-20],[-9,-20],[0,-30],[-7,-25],[2,-20],[7,-10],[0,-30],[9,-6],[-2,-25],[-5,-10],[-15,-10],[-9,-20],[9,-25],[11,-10],[18,-35],[8,-10],[0,-10],[5,-10],[20,-25],[11,0],[6,-10],[16,-26]],[[5376,4793],[48,30],[20,-15],[0,10],[-2,25],[-11,25],[-2,10],[-20,5],[-9,10],[-9,16],[-11,0],[-17,35],[-9,10],[9,25],[-2,20],[-9,0],[-9,5],[-7,10],[-6,0],[2,5],[0,5],[2,0],[0,10],[2,10],[2,5],[0,5],[-2,5],[0,5],[0,5],[0,5],[-4,10],[0,5],[-2,0],[-3,10],[-2,6],[0,5],[-2,0],[0,5],[2,10],[0,5],[-4,15],[0,20],[-2,5],[0,10],[0,5],[0,5],[2,5],[2,0],[0,10],[0,5],[0,10],[-2,10],[-13,5],[-7,10],[7,25],[13,5],[0,15],[0,5],[6,16],[16,-5],[4,-11],[-4,-10],[11,-20],[-16,-20],[-6,-20],[0,-25],[-2,-15],[2,-10],[13,45],[7,-15],[9,15],[8,10],[16,30],[6,-5],[9,5],[7,20],[4,-5],[5,10],[4,-15],[7,-10],[4,-40],[-2,-10],[0,-10],[2,-5],[9,-5],[13,-5],[20,15],[11,5],[13,0],[11,0],[18,5],[6,5],[14,-5]],[[7258,5517],[-8,-11],[-5,-5],[-6,-25],[-11,0],[-18,-10],[-4,-20],[-16,-35],[-11,-15],[-4,-15],[-11,-10],[-5,-20],[-9,-10],[-19,-10],[-7,-15],[-11,10],[-13,5],[-53,5],[9,-30],[-9,-6],[-5,0],[-6,-5],[-2,-5],[-16,-45],[-13,-10],[-11,-5],[-4,-10],[-9,-10],[-7,0],[-13,-15],[-7,-10],[-13,15],[-2,35],[-20,40],[0,15],[-22,5],[-24,16],[-18,0],[-2,0],[-9,-5],[-7,-16],[-8,-20],[-14,0],[-4,0],[-2,-10],[-2,-45],[4,-30],[-13,-15],[-5,-10],[-8,-30],[0,-20],[-9,-11],[-7,-15],[-4,-20],[-9,-20],[-2,-25],[-9,-10],[-16,-20],[-13,-5],[-13,0],[-33,-10],[-11,0],[-24,-5],[-18,-15],[-7,5],[-4,0],[-4,-10],[-7,-5],[-11,0],[-4,-5],[-3,-10],[-13,-5],[-13,-10],[-7,10],[-15,0],[-7,5],[0,10],[0,15],[2,5],[-2,20],[0,10],[-17,-5],[-11,10],[-5,10],[-4,0],[-13,0],[-7,5],[-27,-10]],[[6718,6808],[3,0]],[[6721,6808],[0,5],[2,0],[6,-10],[51,-86],[40,-65],[9,-20],[28,-35],[5,-5],[6,0],[33,5],[16,5],[11,5],[6,0],[14,-10],[17,10],[44,-5],[27,-15],[92,-25],[-2,-36],[0,-25],[0,-10],[0,-5],[0,-5],[0,-5],[0,-5],[0,-5],[-2,-5],[0,-5],[-2,0],[0,-5],[0,-5],[-2,-5],[2,-10],[-2,0],[6,-30],[5,-5],[-5,-30],[7,-61],[-2,-5],[-14,-40],[-6,-30],[-16,-25],[-8,0],[-5,-15],[-18,-5],[-15,-10],[-15,-15],[-20,-25],[39,-46],[9,0],[9,-15],[9,0],[15,10],[3,-5],[11,-10],[46,45],[6,0],[7,5],[16,-15],[11,0],[4,0],[7,-15],[6,-10],[5,-10],[13,-10],[0,-10],[11,-25],[4,-10],[0,-40],[11,-35],[5,-26],[-7,0],[-4,-15],[4,-25],[-7,-25],[7,-15],[-2,-20],[0,-15],[-7,-30],[5,-15],[2,-25],[-2,-10],[-18,-6],[0,-40],[-2,-10],[6,-15],[3,-15],[17,-10],[5,-5],[6,-45],[-6,-15],[4,-10],[-7,-30]],[[5413,6647],[3,0],[2,5],[0,5],[2,15],[0,10],[-2,10],[-5,15],[0,5],[3,5],[2,10],[2,5],[0,6],[0,15],[0,5],[0,10],[0,5],[-2,10],[-2,10],[-3,15],[-2,5],[-2,5],[-2,5],[-7,0],[-4,0],[-2,5],[-3,0],[-2,15],[-2,10],[0,10],[0,15],[0,5],[2,0],[0,5],[2,10],[3,5],[2,0],[0,5],[2,0],[0,5],[2,5],[0,5],[-2,10],[-4,11],[-3,10],[0,15],[-2,5],[0,10],[-2,5],[0,5],[0,5],[2,5],[0,15],[0,5],[-2,5],[-2,5],[-2,5],[-5,5],[0,5],[0,5],[-2,5],[0,10],[0,5],[2,10],[2,10],[0,5],[3,0],[4,10],[4,5],[9,15],[2,5],[0,5],[0,11],[0,5],[3,5],[6,10],[0,10],[0,5]],[[2823,3698],[-17,-20],[-14,-11],[-4,-15],[-24,-55],[-7,-5],[-13,35],[0,10],[-20,25],[-20,-40],[-26,-30],[-27,-30],[-11,5],[-13,0],[-7,-5],[-2,-25],[-6,-10],[-3,-10],[-2,-10],[-4,-15],[-2,-26],[-7,-5],[-2,-10],[-7,-5],[-6,-5],[-3,-10],[-2,-10],[-13,-5],[-9,-10],[-9,-5],[-6,-15],[-5,-15],[-11,-10],[-4,10],[-20,-10],[-4,5],[-11,0],[-9,5],[-13,-15],[-14,15],[-11,-10],[-15,-20],[-7,-5],[-9,-20],[-15,-15],[-26,-41],[-3,-15],[-15,-25],[2,-5],[-6,-55],[-3,5],[-31,-25],[-22,-20],[-8,-5],[-11,0],[0,5],[2,5],[6,20],[9,25],[-4,20],[-18,30],[-4,0],[-2,25],[0,31],[-3,15],[5,10],[-7,10],[-2,5],[-2,5],[-2,5],[0,5],[-3,10],[0,5],[-2,0],[0,10],[2,0],[0,5],[-2,5],[0,5],[2,0],[0,5],[-2,0],[0,5],[-4,0],[-2,5],[-3,0],[-2,5],[-2,0],[-2,5],[-3,5],[-2,5],[-2,5],[-4,5],[-5,0],[-4,5],[0,5],[-5,5],[0,5],[-2,0],[-2,0],[-4,0],[-3,0],[-2,0],[-2,-5],[-4,0],[-3,0],[-2,5],[-2,0],[-4,-5],[-7,0],[-4,0],[-3,5],[-2,0],[0,5],[-4,5],[-2,0],[0,5],[-3,0],[-2,-5],[-2,5],[-2,0],[0,5],[0,5],[-2,0],[0,5],[-7,0],[-2,0],[-2,6],[-7,5],[-2,0],[-3,0],[-2,5],[-2,0],[0,5],[0,5],[-2,0],[-2,0],[-3,0],[0,-5],[-2,0],[-2,0],[-4,5],[-3,0],[-4,0],[-4,0],[0,-5],[-3,0],[0,-5],[-2,-5],[-2,-5],[-2,0],[0,-6],[-2,0],[0,-5],[-3,5],[0,6],[0,5],[3,5],[0,5],[0,5],[2,5],[0,5],[0,15],[0,5],[2,5],[-33,-35],[-2,0],[-20,-46],[-16,-15],[-6,-35],[-11,-5],[-22,5],[-7,15],[-6,0],[-11,15],[-3,10],[-6,15],[-2,15],[-5,21],[-13,0],[-13,25],[-7,25],[-9,15],[2,5],[3,5],[6,15],[2,5],[0,5],[3,5],[0,5],[0,5],[0,5],[2,5],[2,0],[2,5],[0,5],[5,10],[2,0],[2,5],[0,5],[5,0],[2,0],[-7,-20],[0,-5],[9,0],[2,0],[5,-5],[19,5],[22,15],[3,0],[2,0],[2,0],[2,0],[0,-5],[2,-5],[0,-5],[0,-5],[3,0],[2,-5],[2,0],[0,-5],[0,-5],[-2,-15],[2,0],[2,0],[2,0],[3,15],[0,5],[4,0],[0,10],[2,5],[-2,0],[2,10],[2,-5],[3,5],[2,5],[0,5],[2,5],[2,5],[5,5],[2,0],[2,5],[2,0],[0,10],[3,0],[2,0],[2,0],[2,11],[2,5],[5,10],[6,15],[3,0],[2,5],[2,5],[2,0],[2,-5],[3,0],[2,5],[0,5],[2,0],[2,5],[0,-5],[2,0],[3,5],[2,0],[2,0],[2,0],[2,0],[5,5],[-5,10],[-2,10],[2,5],[-2,5],[7,15],[-9,5],[-13,-15],[-9,0],[-4,-25],[-3,-5],[-13,25],[-11,-10],[-4,25],[-9,25],[-7,5],[2,5],[-4,5],[-15,10],[-9,10],[-5,-5],[-4,5],[0,5],[-2,0],[-2,0],[-3,0],[-2,0],[-2,-5],[-2,0],[-2,0],[-3,-10],[-2,0],[0,-5],[-2,0],[0,-5],[-2,0],[-2,0],[0,-5],[0,-5],[-3,0],[-2,-5],[-13,5],[0,5],[-7,5],[-4,-5],[-7,35],[-15,10],[0,-10],[-2,-5],[0,-5],[-3,-5],[0,-5],[3,-5],[0,-5],[-9,5],[-2,-5],[-7,0],[-2,-5],[-2,0],[0,-10],[-9,-5],[-9,5],[2,5],[0,5],[0,5],[0,5],[2,5],[3,0],[0,5],[2,5],[0,10],[0,5],[0,5],[2,10],[0,11],[0,5],[2,5],[-6,40],[8,5],[5,40],[-5,35],[3,0],[-3,15],[3,15],[-5,15],[2,15],[-2,0],[0,10],[-6,0],[-3,16],[5,35],[6,20],[3,0],[0,5],[2,5],[-11,10],[0,5],[6,0],[11,5],[9,0],[2,-5],[5,5],[2,-15],[7,5],[-3,5],[9,15],[16,40],[6,0],[5,10],[6,0],[5,5],[13,-10],[-4,-10],[13,-10],[13,-5],[7,5],[4,15],[9,-10],[4,0],[7,15],[0,10],[-9,10],[9,25],[9,16],[-9,10],[-7,5],[-4,25],[4,0],[0,10],[5,10],[4,5],[9,-15],[13,25],[5,10],[6,0],[9,20],[4,0],[7,30],[2,5],[-4,10],[13,25],[13,31],[2,0],[14,20],[8,5],[3,5],[2,-10],[7,20],[4,10],[26,40],[5,5],[0,25],[11,35],[-2,5],[-7,15],[-4,5],[-7,10],[0,6],[-2,0],[0,5],[-2,0],[-3,0],[-4,-5],[-7,-6],[-4,0],[0,-5],[-2,0],[-2,0],[-3,5],[-2,6],[-2,5],[-2,0],[-3,0],[0,-5],[-6,10],[-2,-10],[-5,10],[2,5],[-4,10],[13,25],[7,0],[0,-10],[7,-5],[19,35],[14,20],[-3,10],[-6,0],[4,10],[-2,0],[11,20],[4,15],[0,-5],[7,15],[9,5],[0,-5],[2,0],[0,-5],[2,0],[5,0],[4,10],[11,10],[0,15],[4,0],[-6,0],[0,16],[15,30],[9,20],[-9,10],[5,0],[-16,30],[2,5],[-4,15],[4,10],[7,5],[-9,10],[2,0],[5,15],[4,15],[7,10],[4,-5],[3,0],[2,-10],[2,0],[2,-5],[2,5],[3,-5],[2,0],[0,-5],[2,0],[2,0],[2,0],[16,-5],[4,15],[11,30],[0,10],[-13,11],[2,10],[-9,15],[3,5],[4,-5],[4,10],[-2,5],[5,5],[-3,0],[-4,5],[-4,10],[-3,-5],[-2,0],[-2,0],[-4,5],[2,5],[-7,10],[0,5],[2,5],[3,5],[-3,10],[7,15],[-9,15],[7,25],[4,10],[11,15],[-2,0],[7,10],[-7,16],[-7,20],[-11,20],[-4,5],[-4,10],[-9,0],[2,-10],[-11,-10],[-7,0],[-2,5],[-9,-15],[5,-15],[4,-5],[7,-15],[11,-36],[-11,-10],[-11,30],[-7,0],[-7,21],[-4,0],[-2,5],[2,0],[-2,10],[-2,5],[-3,0],[-6,20],[-9,5],[0,5],[0,5],[-2,0],[-2,5],[-3,0],[3,5],[-3,10],[-2,0],[-4,-5],[-7,15],[-9,5],[-6,0],[-5,5],[0,5],[3,5],[4,5],[2,5],[2,0],[0,5],[3,0],[0,5],[-3,0],[-2,5],[-2,0],[-2,5],[-7,10],[-2,5],[-57,101]],[[2072,5562],[72,140]],[[2144,5702],[71,-125],[9,-20],[9,-5],[6,-10],[2,5],[3,-5],[8,10],[5,-5],[13,-10],[4,-10],[-13,-21],[7,-10],[-9,-15],[4,0],[3,-5],[2,-5],[6,-15],[18,-30],[22,-35],[7,-10],[2,0],[-9,-15],[-2,0],[-11,-20],[-2,0],[-11,-15],[2,-5],[4,-5],[7,-15],[2,0],[2,0],[2,0],[3,0],[6,-6],[2,0],[3,6],[0,5],[2,0],[2,5],[0,-5],[2,5],[0,5],[3,0],[2,5],[2,-5],[2,0],[0,10],[0,5],[0,5],[13,-25],[7,10],[2,-5],[5,-5],[6,0],[5,0],[4,-10],[0,-6],[-4,-10],[0,-5],[-3,-5],[-2,-10],[0,-5],[-2,0],[22,-25],[-2,-10],[-13,-10],[2,-10],[-9,-10],[-2,-10],[6,-15],[3,5],[4,-10],[4,-5],[7,10],[7,-5],[8,25],[5,15],[2,0],[2,0],[2,5],[3,0],[2,0],[0,5],[2,0],[2,10],[0,5],[5,15],[4,5],[2,0],[3,10],[2,5],[2,0],[2,5],[5,5],[0,5],[2,5],[2,0],[4,16],[-4,10],[-4,10],[-3,-5],[-2,5],[5,5],[-3,10],[-8,-5],[0,20],[8,15],[11,5],[5,10],[-2,0],[17,20],[-2,5],[-7,-5],[-2,0],[0,10],[9,0],[9,0]],[[2501,5451],[5,20],[-7,5],[-13,25],[-53,121],[-4,10],[6,15],[0,35],[-2,15],[-9,15],[9,6],[-6,20],[4,0],[-2,10],[4,5],[-4,10],[6,5],[-2,15],[7,10],[0,5],[-2,0],[-3,5],[-2,0],[0,5],[-4,0],[-2,5],[-3,0],[-2,5],[-2,0],[-2,5],[-3,0]],[[2554,5517],[-2,-16],[-2,-10],[13,-25],[-2,-5],[2,-15],[2,-5],[7,-5],[2,10],[5,5],[4,10],[13,10],[2,5],[7,0],[2,0],[-6,20],[0,26],[-3,10],[-11,0],[-6,-10],[-2,5],[2,5],[-5,0],[-22,-15]],[[1897,4597],[-13,-25],[-4,-5],[-7,0],[-4,0],[-5,-5],[-4,5],[-9,-5],[-6,0],[-11,10],[0,5],[6,10],[0,10],[5,5],[2,10],[2,-5],[4,5],[3,-10],[13,15],[4,-10],[2,5],[3,0],[4,5],[2,0],[2,0],[5,0],[4,5],[2,5],[-4,10],[13,15],[2,15],[16,31],[2,5],[-4,0],[2,10],[18,25],[8,10],[7,10],[11,30],[-7,0],[7,20],[7,-5],[-3,-10],[7,0],[4,-10],[3,-10],[6,-10],[0,-10],[-4,-5],[2,-10],[2,0],[0,5],[2,0],[3,0],[4,5],[2,0],[7,-15],[9,-10],[11,-10],[-2,-10],[8,-11],[5,-10],[-9,-20],[-4,-10],[-23,-55],[0,-5],[3,-5],[-3,-10],[5,-5],[-7,-15],[-4,5],[-2,-5],[-7,5],[-4,0],[-11,0],[-14,10],[-17,25],[-11,10],[-7,0],[-4,0],[-25,-10]],[[1816,5200],[189,281]],[[2005,5481],[58,-110],[9,-20],[2,5],[2,-5],[2,0],[11,-20],[2,5],[5,-5],[9,10],[22,-51],[-22,-20],[-5,10],[-17,-15],[-7,5],[-13,-10],[9,-20],[17,15],[0,-5],[20,15],[7,-15],[4,0],[5,-15],[2,5],[2,-10],[4,0],[7,-20],[4,0],[3,-5],[2,-5],[-27,-30],[-17,-40],[-7,-20],[-11,-36],[4,-20],[7,-20],[2,-5],[-2,-5],[4,0],[-4,-10],[7,-15],[-14,-35],[5,-5],[9,-10],[11,20],[-3,5],[12,10],[4,-5],[2,0],[11,0],[0,-5],[2,-5],[3,0],[2,-5],[0,-5],[0,-5],[-2,-5],[-3,0],[-2,-5],[-2,-5],[0,-5],[-2,-5],[-2,0],[0,-5],[-3,0],[-4,-5],[-2,0],[0,-5],[0,-5],[-5,-10],[-2,-11],[0,-5],[-2,0],[0,-10],[-2,0],[2,-5],[0,-5],[0,-5],[-2,-5],[0,-5],[-3,0],[0,-5],[-4,0],[-2,-5],[-2,-5],[-7,10],[4,5],[-6,5],[-2,-5],[-3,-5],[-13,0],[2,-10],[-11,-5],[-2,-10],[-13,5],[-11,-5],[-7,-10],[-2,5],[-4,0],[-9,15],[-2,-5],[-5,5],[-4,0],[-9,10],[-4,10],[4,5],[-2,10],[-9,10],[-13,-15],[-2,5],[-7,-10],[4,-5],[-4,-10],[-4,0],[-9,-10],[-7,10],[-6,-25],[-9,-5],[-13,10],[-5,-20],[-13,25],[-2,0],[-3,0],[-4,0],[-2,5],[-2,-5],[0,5],[0,5],[-9,20],[-9,10],[-15,-15],[-14,20],[-19,31],[-5,0],[-9,-21],[-2,5],[2,10],[5,11],[17,30],[-6,15],[-11,-10],[-5,10],[-22,30],[-55,90],[84,131]],[[1829,4672],[0,-5],[-2,-5],[0,-40],[-4,-10],[2,-5],[-5,-15],[-11,-10],[-2,-15],[2,-5],[-13,-25],[-20,-20],[-6,25],[2,5],[-2,10],[-16,15],[-6,20],[4,10],[2,10],[2,5],[3,0],[11,0],[2,10],[17,25],[11,35],[7,-10],[4,5],[3,5],[15,-15]],[[2819,5602],[0,-20],[-9,5],[-4,-10],[-9,-10],[-2,5],[-11,-15],[-5,20],[-2,15],[2,5],[2,-5],[3,5],[-5,5],[27,20],[-3,10],[5,5],[11,-10],[0,-25]],[[3518,7672],[-18,15],[-9,-5],[-6,15],[8,30],[-2,20],[-13,0],[-4,16],[-11,0],[-11,10],[4,25],[2,5],[-2,5],[-11,0],[-42,0],[-13,-5],[-7,-5],[-9,0],[-17,5],[-7,0],[-15,-5],[-25,5],[-8,10],[-31,35],[-9,-10],[2,10]],[[3264,7848],[5,30],[11,15],[-3,30],[0,5],[-4,10],[2,10],[-2,5],[4,6],[3,0],[2,-6],[2,-5],[7,0],[2,5],[0,6],[0,5],[2,0],[4,5],[5,-5],[4,-5],[2,-6],[5,-5],[2,5],[2,0],[2,6],[3,0],[0,5],[2,0],[4,-5],[5,-6],[2,0],[4,-5],[5,5],[4,0],[2,0],[3,-5],[0,-20],[0,-10],[0,-5],[0,-5],[0,-5],[0,-5],[2,0],[2,-5],[9,0],[2,0],[0,-10],[13,-5],[2,-5],[9,0],[13,0],[9,10],[5,5],[2,5],[4,5],[14,-5],[4,-5],[22,65],[4,16],[0,5],[-11,20],[5,5],[-7,10],[2,0],[40,10],[24,0],[25,-5],[30,10],[-2,5],[0,5],[-2,5],[-2,0],[-5,5],[-2,0],[-2,0],[-2,0],[-2,0],[-5,10],[0,5],[-2,5],[0,5],[0,5],[0,10],[0,10],[2,5],[0,5],[0,20],[0,5],[16,5],[4,-10],[0,-15],[7,0],[-5,-10],[7,-5],[6,0],[16,20],[22,-10],[13,10],[9,0],[9,0],[0,10],[-2,15],[0,10],[4,10],[-2,16],[9,25],[0,15],[6,20],[-2,25],[4,0],[5,5],[-13,20],[-9,10],[-11,5],[-14,5],[7,20],[-4,5],[0,5],[0,5],[0,10],[4,10],[0,5],[0,6],[0,5],[-2,5],[0,5],[0,5],[-2,5],[13,-5],[4,5],[7,0],[26,-25],[14,0],[13,-6],[9,11],[6,-5],[16,15],[0,5],[-9,0],[9,10],[-9,5],[-5,5],[0,5],[5,10],[2,5],[2,0],[14,-5],[15,10],[0,-10],[-2,-15],[6,-25],[5,-10],[4,0],[5,0],[6,0],[16,-11],[13,-5],[13,0],[9,-5],[11,-25],[11,-35],[-4,0],[-3,-5],[-2,0],[-6,-20],[-3,-5],[-2,0],[-2,-5],[-2,-5],[0,-10],[0,-5],[0,-5],[0,-5],[-5,-5],[-6,0],[-3,0],[-2,-5],[-2,-5],[-2,-5],[-5,-5],[-4,-10],[-2,-5],[0,-5],[-2,-15],[-3,-11],[3,-5],[-3,-10],[7,-15],[0,-10],[-2,-15],[0,-15],[-9,-45],[-4,-5],[2,-5],[-9,-5],[-2,-5],[-27,-25],[-13,-5],[-53,5],[5,-46],[2,-45],[2,-30],[-9,-5],[0,-5],[0,-5],[7,-10],[13,0],[0,-15],[2,-10],[0,-15],[2,-30],[97,20],[27,5],[62,-15],[2,-10],[11,-46],[20,-40],[17,-30],[7,-5],[26,0],[7,-5],[0,-15],[29,5],[6,-5],[0,-10],[7,5],[13,5],[-2,5],[4,25],[0,5],[0,5],[0,15],[7,30],[9,25],[9,6],[35,5],[20,10],[6,10],[7,30],[7,5],[22,20],[19,10],[9,10],[11,-5],[18,20],[6,-5],[0,20],[-4,10],[-7,0],[-4,5],[-7,20],[14,15],[6,15],[5,6],[4,-6],[2,0],[0,26],[11,5],[29,-31],[7,6],[13,-21],[24,21],[7,0],[20,15],[8,15],[-4,20],[13,10],[9,5],[2,5],[5,0],[15,0],[2,5],[-4,0],[6,10],[11,15],[-4,10],[-22,40],[4,5],[-11,51],[3,10],[4,5],[7,15],[11,10],[-3,5],[3,10],[-3,5]],[[4410,8225],[5,0],[2,5],[0,5],[2,5],[2,10],[3,0],[2,0],[4,5],[0,5],[5,5],[13,-15],[7,-30],[-5,-10],[13,-15],[3,-15],[4,-15],[0,-16],[0,-15],[4,-20],[-2,-5],[5,-20],[-3,-25],[-4,0],[0,25],[-2,0],[-44,-30],[19,-15],[5,0],[7,-10],[11,-15],[6,0],[7,0],[4,0],[0,-5],[2,-10],[7,0],[11,-5],[9,-10],[4,0],[5,-5],[2,-15],[2,-10],[2,-11],[0,-20],[0,-5],[7,-5],[4,5],[5,0],[6,-5],[0,10],[16,0],[0,-15],[6,-30],[3,-15],[0,-5],[-3,0],[0,-10],[-2,-10],[2,-5],[-2,-5],[0,-5],[-2,-10],[0,-5],[-2,-10],[0,-10],[-2,-5],[0,5],[-5,-5],[2,0],[-2,-5],[0,-5],[-2,-5],[-7,-5],[-2,0],[-4,-10],[0,-6],[-3,0],[-4,-5],[-2,-5],[-2,-5],[-5,-5],[7,-15],[-2,-20],[-18,-25],[0,-5],[7,-25],[-5,-10],[-9,-10],[-13,-10],[-6,0],[-16,-25],[-2,10],[-20,-20],[2,-15],[-26,-10],[-16,-6],[-19,-10],[0,16],[-3,20],[5,25],[-2,15],[-20,-5],[-18,5],[-26,5],[-3,5],[-4,10],[-13,15],[2,5],[-2,5],[-7,0],[0,-10],[0,-5],[-2,0],[-2,-5],[-7,-15],[-2,-5],[-4,-15],[-3,-10],[-2,-5],[0,-5],[-2,-10],[0,-10],[2,-5],[0,-5],[5,-6],[-5,0],[-2,-5],[-2,-5],[-7,-10],[-2,0],[-2,-5],[-2,0],[-3,-10],[-2,-5],[-4,-5],[-2,0],[-7,0],[-9,5],[-7,0],[-6,-5],[-7,-10],[-6,-5],[-5,-5],[-2,0],[-4,-10],[-3,-15],[-4,-10],[-4,-15],[-9,-35],[-5,-5],[-2,-5],[-4,-15],[-5,-15],[0,-21],[-2,-5],[-4,-15],[-13,-20],[-5,-10],[-11,-5],[-7,-5]],[[3826,6763],[7,-10],[11,0],[0,-5],[-4,-5],[-5,-11],[-4,6],[-9,-31],[-18,10],[-13,-5],[-4,5],[8,26],[0,10],[5,5],[2,-5],[4,10],[5,5],[0,5],[9,5],[-3,-10],[7,0],[2,-5]],[[3130,8019],[6,35],[3,35],[6,10],[0,5],[-4,5]],[[3141,8109],[4,5],[7,-5],[15,15],[16,0],[6,5],[0,10],[9,10],[15,10],[14,16],[2,5]],[[3229,8180],[7,-10],[6,0],[24,10],[5,-15],[6,-11],[11,-15],[5,-15],[4,-20],[7,-10],[0,-5],[0,-10],[-7,-15],[-2,-15],[-2,-10],[-7,-15],[-20,-10],[-24,5],[-15,-15],[-14,0],[-57,15],[-13,-5],[-9,5],[-4,0]],[[3427,8466],[2,0],[0,-20],[5,0],[2,-5],[9,-5],[29,0],[0,-10],[2,-20],[6,0],[3,-30],[-9,-36],[-9,0],[-4,-20],[8,-65],[-30,0],[-7,0],[-5,-10],[-6,0],[-7,0],[-13,5],[-11,0],[-24,-15],[-9,-5],[-11,-5],[-16,-5],[-11,-15],[-17,-5],[-18,35],[-4,25]],[[3282,8260],[11,25],[11,15],[2,10],[0,5],[-2,0],[-11,10],[-5,-5],[-4,15],[-4,5],[-3,5],[-2,-5],[-11,10],[-11,5],[-6,5],[-7,-5],[-11,-5],[2,21],[9,20],[13,40],[7,10],[15,-15],[11,-10],[9,-15],[9,-5],[4,0],[11,0],[20,-46],[11,0],[27,10],[6,11],[7,20],[6,5],[11,5],[0,20],[20,15],[-4,25],[4,5]],[[3698,8757],[-2,0],[-9,5],[-4,-5],[-4,0],[-5,-5],[-2,0],[-7,-5],[-2,0],[0,-15],[0,-5],[0,-5],[7,-10],[2,-5],[0,-5],[0,-30],[-2,-10],[-2,-15],[-7,5],[-2,-5],[-5,0],[-2,-10],[0,-5],[-9,-5],[-6,-20],[0,-5],[-5,-5],[-4,-10],[-9,-15],[-11,-21],[-2,0],[-7,0],[0,5],[-2,16],[0,20],[0,5],[-4,0],[0,10],[-5,0],[-2,10],[7,25],[-3,10],[5,10],[-16,10],[-13,0],[-11,5],[-9,0],[-22,-5],[0,5],[7,40],[4,-5],[7,30],[-18,36]],[[3524,8778],[5,0],[4,20],[-7,10],[3,10],[17,15],[3,5],[19,-5],[9,5],[13,-5],[0,30],[9,40],[22,-15],[13,-10],[-2,-20],[2,-5],[0,-10],[3,0],[9,0],[6,0],[5,0],[6,0],[2,-5],[3,0],[2,5],[2,0],[7,5],[0,5],[2,0],[4,5],[13,25],[7,10],[7,10],[6,5],[-2,10],[0,5],[9,15],[6,-5],[5,0],[2,0],[9,-5],[4,0],[9,-5],[11,-10],[18,0],[2,5],[2,10],[9,10],[4,5],[5,5],[6,0],[9,5],[2,5],[3,0],[-9,-20],[-11,0],[-2,-5],[-9,-20],[-7,-5],[-11,-20],[0,-10],[20,-10],[0,-10],[2,-15],[5,-5],[0,-15],[4,-5],[7,-5],[2,-5],[-2,-5],[-3,-5],[-2,0],[0,-5],[-2,-5],[0,-5],[-7,10],[0,15],[-4,0],[-7,-10],[0,-5],[-6,-15],[4,0],[0,-6],[-2,-5],[-9,5],[0,11],[-4,0],[-11,-5],[-2,0],[-11,-6],[-5,-5],[-2,-5],[-2,0],[-16,-10],[-9,5],[-6,0],[-5,10],[-6,5],[-5,-15]],[[3264,7848],[-9,-5],[-42,5],[-4,5],[9,20],[-5,20],[3,25],[-5,0],[-9,5],[-2,0],[-4,0],[-9,10],[-2,0],[-5,0],[-6,31],[-16,0],[-11,45],[-11,5],[-6,5]],[[3229,8180],[7,15],[-3,10],[11,15],[0,15],[5,10],[9,0],[24,15]],[[3427,8466],[-4,35],[-13,20],[-9,10],[-2,25],[4,-5],[9,-25],[4,-5],[13,15],[12,0],[4,-10],[4,5],[3,-10],[2,0],[2,5],[0,20],[7,10],[2,5],[6,26],[0,5],[0,5],[-6,15],[-9,0],[-11,15],[-7,-10],[-13,-20],[-18,-5],[-2,10],[2,10],[-6,15],[-2,10],[2,15],[13,15],[7,10],[4,0],[0,-5],[20,10],[15,25],[-2,5],[16,10],[11,5],[4,10],[4,0],[14,25],[11,5],[6,11]],[[3698,8757],[5,-5],[2,0],[2,0],[0,-5],[2,0],[3,-5],[2,0],[0,-5],[2,0],[0,-5],[2,0],[5,-15],[2,-5],[2,-5],[2,-5],[0,-5],[2,0],[0,-5],[3,0],[2,-5],[2,0],[2,0],[0,-5],[3,0],[2,0],[6,0],[3,0],[2,0],[2,-5],[2,0],[0,-5],[2,-5],[0,-5],[0,-5],[3,0],[0,-5],[0,-5],[2,0],[0,-5],[2,-5],[2,0],[0,-5],[2,0],[3,0],[0,-5],[2,0],[2,0],[2,0],[5,-5],[2,0],[2,-5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[5,0],[2,-5],[2,0],[5,0],[2,0],[2,0],[2,0],[2,0],[5,5],[2,0],[2,0],[3,0],[2,0],[0,5],[2,0],[2,5],[5,5],[2,0],[4,0],[0,5],[2,0],[3,0],[6,10],[2,0],[3,0],[2,0]],[[3875,8647],[2,-15],[7,0],[4,0],[0,5],[0,-5],[2,0],[2,0],[0,-5],[5,5],[2,0],[0,-5],[2,-5],[2,-5],[3,0],[2,0],[2,0],[4,0],[3,-5],[2,-10],[6,-15],[7,0],[13,-10],[3,5],[6,-5],[2,0],[3,0],[0,5],[4,-5],[2,0],[5,0],[2,5],[2,-5],[4,0],[5,0],[4,-5],[2,0],[5,0],[13,-11],[2,0],[2,0],[7,-5],[2,0],[5,-5],[2,0],[2,0],[4,0],[3,0],[4,-5],[2,0],[0,-5],[0,-5],[0,-5],[-4,-5],[0,-5],[0,-5],[0,-5],[2,-5],[-2,-10],[2,-15],[2,-5],[7,-5],[-2,-5],[-2,-10],[4,0],[-7,-20],[-6,-15],[4,-5],[2,0],[11,15],[5,-5],[4,5],[-2,0],[-2,5],[0,5],[2,5],[2,0],[7,-10],[11,0],[17,40],[16,20],[4,0],[11,25],[7,5],[2,51],[0,25],[5,0],[2,10],[-5,0],[-2,10],[13,0],[14,-10],[4,5],[11,10],[11,-10],[13,-30],[0,-15],[2,-6],[0,-20],[11,0],[7,15],[7,5],[4,0],[-4,-25],[2,-25],[4,5],[14,-25],[17,-10],[5,-5],[2,-20],[6,-5],[5,-25],[11,-20],[-2,-25],[2,-5],[2,-5],[13,0],[13,-11],[11,-5],[9,5],[3,-5],[8,0],[3,-5],[19,16],[7,10],[4,-5],[3,-5],[-7,-6],[-2,-15],[2,-15],[-4,-40],[-7,-35],[20,10],[20,-25],[-3,-20]],[[3130,8019],[-29,5],[-13,0],[2,15],[-9,5],[-9,10],[-13,20],[0,5],[-6,5],[0,10],[-3,5],[-17,0],[-14,10],[0,5],[-2,5],[0,5],[2,5],[3,5],[0,5],[-3,10]],[[3019,8149],[9,5],[20,0],[11,-15],[2,-10],[5,-5],[20,-5],[28,0],[27,-10]],[[5841,9300],[0,5],[2,10],[-11,5],[-9,0],[-4,-20],[-2,0],[-2,-10],[-3,0],[-4,5],[-9,-10],[-2,0],[-2,-5],[-2,0],[-7,-10],[-2,0],[0,-5],[-2,0],[-3,0],[-2,0],[-2,0],[0,5],[-2,0],[-2,0],[-3,0],[-2,5],[-2,0],[0,5],[-4,-5],[-7,10],[-2,-5],[-5,15],[2,10],[-6,0],[-2,0],[-7,-5],[-4,0],[-7,0],[-7,-10],[-2,0],[-2,0],[0,5],[-11,-15],[-4,0],[0,-5],[-3,-5],[3,-10],[2,-10],[0,-5],[0,-5],[-2,5],[-11,5],[-3,5],[0,10],[-2,5],[-6,-10],[-7,-5],[2,-10],[2,0],[3,-5],[-3,-5],[0,-5],[3,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,0],[0,-5],[2,0],[0,-5],[-2,-5],[0,-5],[-2,-5],[-2,0],[-2,0],[-3,0],[-2,0],[-2,-6],[-7,0],[-2,0],[-2,0],[-2,0],[-3,0],[0,6],[-2,0],[-2,0],[-2,0],[0,5],[-5,0],[-2,0],[-2,0],[-4,0],[-5,0],[-6,0],[-7,0],[-7,0],[-2,-5],[-9,5],[-4,0],[2,-11],[-2,-10],[2,-5],[-4,0],[0,5],[-5,-5],[-2,10],[-4,5],[-5,-5],[-4,0],[-4,11],[2,5],[-2,5],[0,5],[-11,5],[-5,0],[-2,-5],[0,-5],[2,-5],[5,0],[2,-5],[2,-6],[-9,-10],[-7,-5],[3,-5],[2,0],[4,0],[7,-5],[-9,-5],[0,-5],[-9,5],[-6,10],[-3,10],[-2,16],[-2,15],[4,20],[3,15],[-3,5],[-4,-5],[-4,-5],[-5,-5],[-6,-5],[-7,10],[-4,0],[-5,0],[-2,0],[-9,-5],[-9,10],[-4,5],[-4,0],[-5,15],[-4,5],[-14,20],[-4,5],[-2,5],[-13,-5],[-5,0],[-4,0],[-5,0],[-4,15],[-4,15],[-5,5],[0,10],[2,10],[5,10],[6,0],[9,5],[5,5],[0,10],[6,5],[-4,10],[-2,11],[-14,30],[-6,5],[-7,0],[-2,15],[-2,0],[2,5],[2,5],[5,10],[2,0],[0,5],[2,0],[2,5],[2,5],[7,10],[0,5],[2,0],[0,5],[2,5],[3,0],[2,0],[2,-5],[11,15],[2,-5],[11,15],[5,10],[4,5],[5,5],[2,0],[9,0],[-3,5],[-2,5],[7,10],[4,5],[5,0],[8,0],[9,-5],[0,5],[-2,5],[2,5],[0,11],[5,10],[0,5],[-3,0],[-6,0],[-5,15],[-2,25],[2,10],[3,5],[2,5],[6,5],[-2,5],[2,5],[0,5],[0,5],[0,5],[0,5],[3,0],[0,5],[2,0],[2,5],[2,0],[2,0],[3,0],[0,5],[2,0],[2,0],[2,5],[2,0],[0,5],[3,0],[0,5],[2,5],[0,5],[0,5],[2,5],[2,5],[0,5],[2,5],[3,5],[0,5],[2,0],[2,0],[0,5],[2,0],[3,5],[11,11],[2,0],[0,5],[2,0],[0,5],[2,0],[2,5],[3,5],[2,0],[4,5],[2,-5],[14,-5],[4,5],[9,10],[2,-5],[4,5],[9,0],[2,10],[14,-15],[6,-10],[2,-5],[0,5],[0,5],[3,0],[0,5],[2,0],[2,10],[0,5],[2,0],[3,5],[2,5],[2,0],[2,0],[2,0],[3,0],[2,0],[4,0],[7,10],[11,5],[6,0],[5,10],[6,0],[9,10],[9,-5],[4,-10],[7,-10],[2,0],[0,-10],[5,0],[2,0],[7,5],[6,5],[7,5],[4,5],[-2,5],[0,10],[-4,10],[2,15],[-7,0],[-9,5],[-9,5],[-2,0],[-2,5],[0,10],[0,10],[0,20],[4,20],[5,10],[4,6],[5,-11],[4,0],[2,0],[0,-5],[5,-5],[0,-10],[0,-10],[13,0],[15,15],[5,-10],[4,-10],[5,5],[8,10],[7,5],[13,-5],[9,0],[7,-5],[4,-10],[7,-5],[0,-5],[-2,-5],[4,-5],[4,0],[-4,-20],[0,-10],[-4,-10],[-5,0],[-2,-5],[0,-5],[0,-5],[0,-5],[2,0],[0,-5],[2,-5],[3,-5],[0,-5],[2,-5],[9,-5],[-5,-25],[-4,-10],[0,-16],[13,-15],[2,-10],[5,-15],[8,-5],[3,10],[8,10],[7,10],[2,0],[2,5],[7,-5],[0,5],[7,10],[-5,11],[7,5],[9,15],[-3,5],[-2,0],[-6,0],[0,10],[2,10],[2,15],[-2,15],[-2,5],[-7,10],[2,15],[2,15],[0,10],[5,0],[0,10],[0,5],[13,10],[4,0],[3,-10],[4,-10],[0,-10],[-2,-5],[-5,-5],[7,0],[5,0],[6,-10],[5,-10],[6,-5],[2,5],[7,-10],[4,0],[3,0],[2,5],[6,0],[-2,-10],[5,-5],[0,-5],[2,-15],[-2,-5],[2,-10],[4,-10],[2,0],[5,-5],[0,-5],[-5,-5],[-6,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,-6],[0,-5],[3,-5],[0,-5],[0,-5],[0,-5],[2,0],[0,-5],[0,-5],[0,-5],[2,0],[2,-5],[2,-5],[5,-5],[4,0],[2,5],[5,0],[2,5],[0,10],[4,5],[3,-5],[11,20],[4,-5],[7,10],[4,0],[7,-5],[4,5],[5,-10],[2,5],[4,0],[-2,-5],[7,0],[4,-10],[7,-5],[-5,-10],[13,-15],[3,-5],[8,-5],[3,-5],[-3,-10],[3,-10],[-5,-10],[-11,5],[-6,-5],[-7,0],[-2,-5],[-7,5],[-4,-10],[-5,-15],[-13,-10],[2,-10],[-4,-10],[-2,-20],[-2,-5],[2,-5],[4,-5],[5,-16],[4,-15],[0,-5],[7,5],[4,-5],[4,0],[-2,-5],[11,-5],[2,0],[7,-5],[4,-5],[3,-5],[-3,-5],[-6,-20],[0,-5],[-5,-10],[3,0],[-5,-25],[-6,-30],[2,-10],[2,-10]],[[6110,9421],[-7,0],[-8,-5],[-7,-5]],[[6088,9411],[-2,5],[0,5],[0,10],[-5,0],[-8,5],[2,25],[-9,15],[0,20],[-2,10],[-2,-5],[-3,5],[3,0],[-3,10],[0,5],[-6,10],[-3,0],[-4,0],[-2,0],[-2,-5],[-16,-10],[0,-5],[0,-5],[0,-5],[-4,0],[-5,0],[-4,0],[-7,5],[-2,0],[0,5],[5,5],[-11,5],[-7,0],[-4,-10],[-3,0],[-4,0],[-4,10],[-7,0],[4,-25],[18,-15],[7,-35],[-3,-5],[-4,5],[0,-10],[-2,-5],[-2,0],[-5,-5],[-4,-5],[0,-5],[-7,0],[-15,-5],[4,0],[0,-10],[5,-5],[4,0],[0,-5],[-2,-6]],[[6434,9230],[-7,-5],[-11,10],[-4,0],[-4,-5],[-5,-5],[-6,-25],[-16,5],[-9,10],[-4,5],[11,20],[9,20],[-2,0],[-3,5],[-2,0],[-6,5],[-5,0],[-6,5],[-3,0],[-2,5],[-2,5],[0,5],[0,5],[-2,10],[-3,0],[-2,5],[-2,5],[-2,0],[-5,10],[-6,5],[-5,0],[-2,0],[-2,0],[-4,5],[-3,0],[-6,5],[-7,5],[-2,0],[-2,0],[-2,0],[-3,0],[-4,-5],[-2,0],[-2,0],[-3,0],[-4,5],[-2,0],[-2,0],[-5,0],[-6,-10],[-7,0]],[[6260,9335],[-7,15],[0,5],[5,20],[2,10],[2,11],[2,10],[5,10],[6,0],[7,0],[9,5],[-9,15],[-2,0],[-5,0],[-11,5],[3,10],[-3,15],[-2,5],[-7,5],[-2,0],[-2,5],[-2,0],[-2,0],[-7,0],[-9,0],[-6,5],[-11,0],[-7,5],[-7,0],[3,10],[2,5],[0,10],[4,5],[-4,10],[0,5],[-2,5],[0,5],[0,5],[4,-5],[7,5],[4,10],[-2,10],[11,-5],[2,5],[0,5],[2,0],[2,5],[0,5],[3,6],[2,-6],[4,11],[7,-5],[2,10],[16,-10],[0,10],[-7,30],[7,0],[0,5],[11,5],[2,5],[2,0],[2,-5],[0,-10],[2,-20],[9,-5],[-2,0],[2,-5],[-2,-5],[-7,-5],[-6,-6],[0,-10],[6,5],[7,-5],[4,0],[3,-5],[11,-25],[13,5],[2,-5],[-2,-5],[-5,-5],[-8,-10],[0,-5],[8,-5],[0,-5],[3,0],[6,5],[7,0],[2,5],[4,10],[3,-5],[2,0],[13,-5],[0,-5],[5,0],[6,-5],[0,-20],[7,-20],[9,10],[6,0],[5,-5],[6,0],[11,5],[5,0],[2,-5],[4,5],[5,-5],[-3,-5],[-4,-5],[2,-10],[7,-5],[4,-10],[-2,-15],[-7,0],[-11,0],[-4,-5],[-4,-5],[-3,5],[7,10],[2,5],[-6,15],[-3,-10],[-4,-5],[0,10],[-4,5],[-9,-10],[-7,5],[-2,-20],[4,0],[7,5],[4,-10],[-2,-20],[-6,-5],[0,-11],[-5,0],[-2,-5],[2,-10],[-2,-10],[2,0],[2,0],[3,0],[2,0],[2,0],[0,-5],[2,0],[2,0],[3,0],[4,5],[9,-10],[6,-15],[9,-20],[5,-10],[4,-35],[2,-10],[-2,-5],[0,-20],[0,-5]],[[5746,8948],[2,-5],[5,-5],[4,5],[3,0],[4,0],[9,-10],[4,5],[11,-5],[2,5],[5,10],[6,15],[5,-5],[2,5],[4,21],[7,0]],[[8072,8134],[-11,0],[-18,0],[-26,-15],[0,10],[-29,-5],[-2,-5],[-7,0],[-9,0],[-4,15],[-2,5],[0,5],[-2,0],[-3,-5],[-2,5],[-4,0],[2,-10],[-7,-5],[0,-5],[-6,-5],[0,-10],[2,-5],[2,0],[5,-10],[4,5],[9,-10],[4,5],[0,-10],[9,-5],[-4,-5],[2,-5],[-16,-10],[3,-5],[8,0],[3,0],[2,5],[2,0],[5,-5],[2,0],[4,-5],[2,0],[5,0],[-2,-25],[6,0],[2,-10],[-13,-10],[7,-5]],[[7995,7999],[0,-5],[-13,-10],[-7,-5],[4,-10],[-6,0],[-11,-10],[0,-6],[-3,0],[-2,0],[0,-5],[-2,-5],[-7,0],[-2,0],[-4,-5],[-2,-5],[-3,0],[-2,0],[-2,0]],[[7933,7933],[-2,5],[-5,5],[-2,0],[-2,5],[-2,5],[-2,11],[-3,5],[0,5],[-2,0],[-9,15],[14,10],[6,0],[5,-10],[8,0],[5,5],[6,0],[5,-5],[0,-5],[0,-5],[2,-5],[11,5],[9,5],[0,25],[-5,5],[12,10],[-16,10],[-9,-5],[-4,5],[-2,10],[-3,-5],[-2,0],[-4,0],[0,5],[-7,5],[0,15],[-4,0],[2,20],[-4,-5],[0,5],[-11,5],[-3,10],[-8,5],[-9,5],[0,-20],[-5,-10],[-4,-5],[-7,-5],[-4,0],[-9,-5],[-7,-10],[9,-30],[-4,0],[-5,-5],[11,-10],[-2,-10],[7,5],[7,0],[-16,-15],[-7,-10],[-15,0],[-11,-20],[2,-26],[-9,-5],[3,-5]],[[7832,7923],[-3,-10],[-4,-15],[-4,-10],[2,-5],[-2,-15],[-5,0],[5,-5],[-3,-20],[0,-20],[5,-5],[-13,-25],[4,-5],[-4,-20],[2,-10],[-2,0],[4,-6],[-2,-5],[0,-10],[4,-20],[2,-35]],[[7818,7682],[-15,10],[-20,5],[-18,-15],[-28,0],[-16,15],[-22,25],[-2,0],[-4,5],[-2,5],[-5,-5],[-6,5],[-5,-5],[-4,20],[-5,11],[-2,5],[-2,5],[-2,10],[-3,0],[0,5],[0,5],[0,5],[3,5],[0,5],[-20,-15],[-7,10],[-15,-5],[-13,20],[-3,0],[-2,0],[-4,5],[-2,5],[2,0],[0,5],[2,0],[-2,0],[0,5],[-2,0],[0,5],[-3,0],[-2,-5],[-2,5],[0,5],[-2,0],[-2,0],[-3,5],[-2,0],[-2,0],[-2,0],[-3,-5],[-2,-5],[-2,0],[-2,0],[-2,0],[-3,-5],[-2,0],[0,5],[0,5],[-4,5],[-5,0],[-4,0],[-2,5],[0,5],[0,5],[2,0],[0,5],[0,5],[0,5],[-2,0],[-2,0],[-3,5],[-2,0],[-2,-5],[-2,0],[0,-5],[-2,-5],[-3,0],[-4,5],[-2,0],[-2,0],[-5,0],[-2,-5],[-2,0],[-7,5],[-4,0],[-2,-5],[-3,0],[-4,0],[-9,-5],[2,-5],[5,0],[0,-5],[2,-5],[2,0],[7,-10],[0,-5],[2,0],[0,-5],[0,-10],[0,-5],[-4,-5],[0,-5],[2,0],[0,-5],[0,-5],[2,-5],[0,-5],[2,0],[2,0],[0,-5],[-2,-5],[0,-5],[2,-5],[3,0],[0,-11],[4,-5],[2,-5],[0,-5],[-2,0],[-18,-10],[-11,-5],[-15,-15],[-2,-10],[6,-25],[-6,0],[-9,-5],[-7,-10],[-4,-5],[-7,-25],[-4,-25],[-31,-20],[-9,-10],[-2,-10],[0,-10],[2,0],[7,0],[0,-6],[6,-20],[-4,-5],[2,-10],[5,-20],[-7,-15],[4,-20],[-2,0],[0,-5],[-2,-5],[-2,-10],[-2,-10],[0,-10],[0,-5],[0,-5],[2,-5],[2,-5],[2,-5],[2,0],[3,-5],[0,-5],[2,-5],[2,-5],[7,-10],[22,-66],[2,-35],[20,-70]],[[7466,7190],[-25,0],[-15,-10],[-4,0],[-11,5],[-9,20],[-11,10],[-5,10],[3,5],[2,5],[0,5],[-2,5],[-3,0],[-4,0],[-18,-15],[-11,20],[-4,-5],[-5,5],[0,5],[-2,5],[-6,15],[-3,-5],[-8,0],[-7,0],[-2,5],[11,5],[-9,5],[-4,10],[-7,-5],[-9,0],[-6,-10],[-3,-10],[-15,-10],[0,5],[-2,5],[-3,0],[-8,5],[-3,0],[-2,0],[-2,0],[-7,-5],[-6,0],[-9,0],[-4,5],[-5,0],[-2,0],[-2,5],[-5,0],[-2,0],[-2,5],[-9,5],[-6,5],[-3,5],[-4,0],[-2,0],[0,5],[-2,0],[-3,5],[-2,5],[-6,5],[-5,5],[-2,0],[-2,5],[4,15],[20,21],[11,30],[0,10],[7,5],[-3,0],[-2,5],[-2,5],[0,5],[-2,5],[-2,5],[-3,5],[-4,5],[0,5],[-2,5],[4,30],[-9,25],[3,10],[-5,15],[0,10],[-6,6],[2,5],[2,5],[4,0],[3,0],[0,5],[2,5],[2,0],[2,0],[2,5],[5,0],[6,5],[3,0],[2,5],[4,5],[2,0],[3,0],[4,5],[2,5],[0,5],[-17,50],[-7,5],[-7,-5],[-4,0],[-4,0],[-3,-5],[-2,0],[-2,0],[-2,0],[-5,-5],[-6,-5],[0,15],[-16,30],[18,40],[-5,10],[-2,-10],[-6,-5],[-11,-10],[-3,30],[-6,16],[15,-6],[20,6],[2,5],[9,10],[0,15],[9,10],[4,15],[5,0],[0,5],[0,5],[-2,0],[-3,5],[3,5],[2,5],[0,5],[0,5],[-2,0],[-3,10],[0,5],[0,5],[0,5],[3,0],[0,5],[4,5],[0,5],[2,-5],[2,0],[7,0],[2,0],[2,0],[3,0],[2,0],[0,5],[2,0],[0,10],[2,0],[0,5],[-2,5],[0,5],[0,5],[0,5],[0,5],[-4,5],[2,0],[2,5],[2,0],[0,-10],[2,0],[0,5],[3,0],[2,-5],[2,0],[2,0],[5,10],[4,0],[2,5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,5],[5,5],[2,0],[4,0],[3,0],[2,0],[2,-5],[0,-5],[2,0],[16,10],[6,-10],[5,0],[4,10],[16,-5],[0,-10],[8,5],[25,-10],[2,-5],[6,0],[14,-5],[9,5],[13,5],[13,5],[7,5],[4,10],[2,-5],[0,5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[0,-5],[2,0],[5,5],[4,0],[4,0],[12,5],[6,6],[5,0],[4,10],[2,-5],[2,-5],[5,0],[6,10],[3,5],[4,0],[2,5],[2,0],[3,5],[6,0],[2,5],[5,-5],[2,0],[2,5],[2,-5],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,5],[2,-5],[4,0],[5,-5],[2,0],[2,-5],[0,-5],[0,-5],[2,0],[0,-6],[5,0],[4,0],[3,0],[2,0],[2,0],[9,0],[15,11],[9,10],[7,0],[22,10],[8,15],[-4,0],[2,15],[5,-10],[4,15],[-7,20],[7,5],[4,10],[0,25],[-6,20],[2,0],[2,10],[2,5],[0,5],[3,5],[4,0],[0,-5],[5,0],[0,-5],[2,0],[4,5],[2,0],[3,0],[2,0],[2,-5],[4,-5],[3,-5],[4,0],[2,5],[-2,0],[2,5],[2,0],[7,5],[4,0],[5,0],[4,5],[2,5],[5,5],[2,5],[2,0],[5,5],[2,0],[9,0],[6,5],[2,-5],[3,0],[2,0],[4,5],[2,0],[5,5],[13,5],[0,6],[13,5],[9,10],[11,10],[2,5],[7,5],[4,0],[3,0],[2,0],[4,5],[2,5],[3,0],[4,0],[2,0],[0,-5],[5,0],[2,5],[0,5],[2,5],[2,0],[2,0],[3,0],[2,0],[2,0],[-9,15],[-2,15],[0,10],[4,5],[5,10],[7,15],[22,5],[2,-10],[6,0],[0,-10],[-2,-5],[0,-5],[9,5],[7,5],[0,-5],[11,5],[8,-5],[0,-5],[11,0],[11,0],[12,0],[15,-5],[11,-15],[0,-5],[15,5],[3,-15],[15,-15],[11,-5],[4,-10],[22,-10],[3,-5],[17,-15],[3,-11],[-3,-10],[-8,-5],[-18,-10]],[[7818,7682],[0,-15],[0,-35],[-2,-35],[-4,-5],[2,0],[0,-5],[-2,-5],[-5,-41],[-11,-30],[7,-35],[-9,-10],[-6,-10],[2,-15],[-5,-20],[-2,-20],[2,-15],[-6,-20],[-9,-10],[-5,-11],[-6,-15],[-2,-10],[-5,-10],[-13,-20],[-4,-10],[-9,-15],[-7,-5],[-13,-15],[-13,-20],[-13,-15],[-5,-10],[-11,-5],[-15,-15],[-3,0],[-13,5],[-9,-10],[-28,-41],[-11,-5],[-11,0],[-22,-15],[-27,31],[-13,20],[-31,5],[-13,15],[-2,5]],[[7933,7933],[-4,-10],[0,-5],[-11,-5],[-7,10],[-4,0],[4,15],[-4,5],[0,5],[-20,-5],[-9,-5],[-22,-10],[-24,-5]],[[8072,8134],[-11,-15],[-9,0],[-4,-10],[-16,-15],[-26,-20],[2,-5],[2,-5],[-2,-10],[11,-5],[0,-5],[7,-5],[-3,-5],[9,0],[5,-5],[6,-10],[-11,-5],[-9,-10],[-13,5],[-15,-10]],[[6586,7828],[5,10],[8,10],[5,5],[2,0],[2,0],[2,5],[5,20],[9,-5],[6,5],[2,-5],[7,30],[9,0],[-2,10],[4,10],[0,10],[2,10],[2,0],[0,5],[-2,5],[2,6],[-4,10],[-2,0],[2,10],[2,0],[7,25],[11,5],[2,-5],[13,0],[5,15],[0,20],[2,10],[0,15],[-4,10],[2,5],[-2,15],[-5,5],[5,0],[8,0],[9,10],[0,10],[2,5],[9,-5],[16,5],[4,-10],[4,10],[11,10],[3,15],[4,10],[13,-25],[7,5],[7,10],[6,-10],[-6,-15],[8,10],[3,5],[-3,0],[-2,5],[0,5],[2,0],[0,5],[11,-5],[5,10],[0,-5],[2,5],[-2,6],[4,0],[0,5],[13,-5],[-2,5],[7,-5],[9,0],[-5,15],[5,0],[4,-5],[4,5],[-17,15],[-2,0],[0,5],[-5,5],[-6,5],[0,5],[-11,5],[-3,0],[-8,5],[-7,5],[-2,-5],[-11,10],[-7,5],[-2,10],[7,5],[2,5],[-2,15],[-3,5],[5,5],[-11,10],[-11,5],[-9,5],[-11,5],[-5,5],[7,10],[-7,5],[0,20],[-4,-5],[-2,10],[-5,0],[5,5],[2,5],[0,11],[2,-5],[7,5],[0,10],[-2,5],[4,5],[11,5],[7,-10],[13,10],[4,-5],[7,10],[9,5],[2,-5],[11,20],[-2,5],[4,0],[2,0],[0,-5],[11,-15],[5,0],[0,-10],[9,0],[4,-15],[9,10],[-2,5],[8,15],[5,-10],[4,0],[9,10],[7,0],[2,-5],[4,5],[7,10],[4,0],[7,-15],[-2,-5],[2,-5],[-2,-5],[4,-5],[9,-31],[18,11],[2,10],[2,-5],[9,-5],[20,0],[-3,-6],[5,0],[4,-15],[5,0],[9,0],[6,5],[-2,16],[4,0],[7,0],[18,10],[11,-10],[11,15],[13,0],[2,0],[4,5],[7,10],[9,35],[-5,15],[12,20],[2,0],[0,-10],[2,-5],[2,15],[7,-5],[-2,-5],[-5,-20],[9,-10],[2,-5],[2,0],[5,0],[4,5],[-2,5],[7,0],[4,-30],[13,10],[9,-10],[0,-10],[9,5],[4,-5],[25,0],[-7,-10],[2,-21],[-2,0],[7,-5],[-3,-10],[9,-5],[5,15],[6,11],[5,-6],[11,6],[6,-6],[2,6],[9,-6],[-2,-10],[11,0],[4,0],[5,-5],[9,0],[4,-20],[11,-5],[0,5],[13,-5],[11,0],[9,10],[11,5],[13,5],[3,10],[4,10],[4,0],[9,-5],[2,-10],[3,0],[0,-5],[17,0],[5,-10],[0,5],[9,5],[2,0],[2,5],[2,5],[2,0],[3,5],[0,5],[2,6],[13,10],[9,25],[4,0],[-2,5],[0,5],[-2,5],[0,5],[2,5],[0,5],[-2,5],[-2,5],[0,5],[-3,0],[-2,5],[-2,0],[-2,0],[0,-5],[-5,-5],[-2,-5],[-2,0],[-2,0],[-2,0],[0,5],[2,10],[-2,5],[-3,0],[5,20],[11,5],[2,-5],[4,15],[0,5],[-13,0],[-17,30],[-3,-10],[3,0],[0,-10],[-9,0],[-3,-15],[-6,5],[-7,-10],[0,-5],[-13,5],[0,-5],[-4,-5],[-3,0],[-2,0],[-2,0],[-11,10],[-9,0],[-6,20],[2,0],[4,0],[7,5],[6,-5],[0,-10],[5,0],[0,20],[6,0],[5,20],[-7,15],[2,0],[3,0],[2,0],[2,0],[4,5],[11,5],[3,0],[2,0],[2,6],[11,0],[5,10],[8,0],[11,-21],[3,0],[2,5],[0,11],[-5,15],[5,5],[6,0],[-4,5],[4,5],[5,0],[9,0],[2,-10],[11,-5],[2,10],[15,-5],[3,0],[4,15],[0,-25],[-4,-15],[4,0],[7,-21],[2,0],[2,0],[2,0],[3,0],[2,0],[4,0],[2,0],[3,0],[2,0],[4,0],[2,0],[0,-20],[-2,0],[-2,0],[-2,-5],[-2,0],[-3,0],[-2,-5],[-2,0],[-2,0],[-5,-10],[5,-5],[-11,-20],[-9,0],[-2,0],[-3,-20],[0,-10],[3,0],[2,10],[4,5],[11,-10],[14,-5],[8,-5],[0,10],[5,10],[13,-10],[9,-10],[2,5],[9,0],[2,-5],[0,-20],[-2,-10],[-9,0],[-2,-5],[-2,-5],[13,-10],[-5,-5],[-2,0],[-2,-10],[-4,-10],[13,5],[6,5],[7,0],[4,-5],[3,-5],[6,-16],[2,0],[5,0],[2,-5],[4,-10],[0,-15],[14,-5],[2,10],[2,5],[5,10],[2,10],[-5,5],[5,11],[-2,5],[6,5],[0,10],[5,10],[0,15],[8,0],[7,5],[0,10],[7,5],[11,-5],[2,5],[2,5],[4,15],[9,5],[2,5],[3,5],[2,5],[2,0],[2,0],[5,5],[147,201]],[[7818,8687],[27,-50],[37,-5],[42,5],[24,-161],[0,-5],[-2,-20],[0,-5],[5,-15],[2,-5],[4,-15],[11,-15],[11,-15],[7,-5],[2,-5],[16,-41],[6,-20],[0,-5],[2,-5],[5,-20],[2,-5],[2,-5],[0,-5],[7,0],[4,-5],[5,0],[2,0],[0,5],[4,0],[0,10],[2,5],[3,10],[0,10],[4,0],[2,0],[2,-5],[5,-10],[2,0],[4,-25],[3,-5],[4,-5],[2,-5],[5,-5],[6,-5],[9,0],[13,0],[9,-5],[11,0],[13,-5],[9,-5],[2,0],[3,-5],[2,0],[2,-5],[2,-5],[0,-5],[0,-5],[-4,-10],[-13,-20],[-11,-21],[-3,-5],[0,-5],[-2,-5],[0,-5],[2,-10],[0,-5],[3,-5],[6,-30],[2,-15],[0,-5],[0,-25],[3,-35],[0,-5],[0,-15],[6,-5],[5,-10],[2,-6],[0,-5],[2,0],[0,-5],[7,-10],[13,-10],[4,-5],[3,0],[4,-5],[4,-10],[0,-10],[0,-20],[0,-10],[-2,-10],[-6,-15],[-7,-15],[-9,-15],[-2,-5],[-9,-10],[-15,-5],[-3,0],[-6,0],[-7,0],[-2,0],[-4,0],[-16,-5],[-9,-5],[-4,0],[-2,0],[-2,-5],[-5,5],[-11,-15],[-13,-31],[-16,-25],[-8,-15],[-5,-15],[-2,-5],[-4,-25],[-3,-10],[-2,-20],[-6,-35],[-5,-25],[-4,-16],[0,-5],[-5,-15],[-6,-15],[-9,-10],[0,-5],[-18,-20],[-9,-5],[-2,-5],[-17,-25],[-3,0],[-2,-5],[-2,-5],[0,-5],[-2,-5],[0,-5],[-2,-20],[-3,-5],[-4,-25],[-2,-5],[-2,-5],[-3,-6],[-8,-10],[-9,-10],[-11,-10],[-7,-10],[-2,-5],[0,-10],[0,-25],[-2,-5],[-3,-15],[-17,-80],[-2,-10],[-20,-51],[-13,-35],[-3,-10],[-4,-15],[-2,-20],[0,-15],[-2,-10],[-7,-20],[-13,-46],[-2,-10],[-3,-30],[-4,-30],[0,-15],[0,-15],[9,-60],[4,-20],[7,-26],[9,-25],[11,-25],[6,-15],[5,-20],[8,-40],[5,-50],[4,-36],[7,-60],[0,-15],[-2,-15],[-7,-45],[-4,-5],[-5,-10],[-22,-25],[-24,-36],[-24,-20],[-11,-15],[-5,-10],[-2,-5],[0,-10],[9,-45]],[[7759,6200],[4,-15],[9,-25],[7,-20],[4,-10],[11,-21],[33,-80],[2,-5],[5,-30],[2,-5],[2,-10],[2,-5],[5,-10],[2,-5],[2,-10],[2,-5],[3,-5],[11,-20],[2,-6],[4,-10],[42,-80],[-11,-15],[-13,5],[-20,-10],[-4,0],[-9,-10],[-7,-15],[5,-15],[-3,-5],[0,-40],[-28,-11],[-5,-25],[-6,5],[-5,-25],[-4,-15],[0,-10],[-7,-5],[3,-5],[-16,-10],[-2,-30],[-13,-20],[-5,-25],[2,-25],[20,-21],[-13,-20],[-15,-10],[-9,-25],[-9,-5],[2,-15],[5,-30],[-7,-25],[-24,0],[-5,0],[0,-10],[5,-15],[-5,-20],[-2,-10],[-9,-11],[-17,31],[-7,5],[-11,25],[-11,5],[-7,10],[-8,5],[-5,0],[-2,5],[-4,0],[-11,10],[-9,0],[-7,0],[-9,0],[-2,5],[-2,0],[-4,0],[-9,10],[-11,10],[-11,5],[-31,0],[-16,-5],[-30,15],[-9,-10],[-9,20],[-20,0],[-18,-5],[-8,0],[-11,20],[-7,5],[-13,0],[-7,-5],[-18,10],[-4,0],[-11,-10],[-13,10],[-11,0],[-18,-15],[-24,20],[-5,25],[-11,16]],[[7699,8456],[-2,-15],[5,-5],[-5,-15],[5,-5],[0,-5],[8,0],[-2,-10],[7,0],[9,-5],[13,-5],[-5,-20],[0,5],[7,5],[4,5],[9,5],[2,5],[3,0],[2,0],[0,5],[-2,5],[-5,5],[-4,5],[-2,5],[-3,5],[-2,5],[-4,0],[-5,5],[-13,5],[-9,5],[-2,0],[-6,10],[-3,0]],[[7499,8491],[-7,5],[-2,5],[-2,5],[2,5],[7,0],[4,-5],[-2,-15]],[[7060,1768],[-13,0],[-31,45],[-7,5],[-8,21],[-3,20],[-26,60],[-18,25],[-48,35],[-2,5],[-9,40],[0,21],[-7,30],[-2,10],[-9,0],[-4,-5],[-7,20],[11,10],[5,110],[-14,41],[-17,25],[-3,15],[-11,30],[-8,50],[2,15],[11,10],[9,30],[8,21],[5,5],[4,5],[7,30],[-7,20],[-13,25],[-4,15],[4,10],[9,15],[-9,20],[9,25],[-2,15],[4,0],[24,21],[14,10],[2,15],[9,25],[2,30],[-2,20],[0,15],[4,10],[-4,20],[-5,35],[-9,26],[9,35],[11,20],[-9,15],[-4,20],[26,20],[-2,35],[-26,71],[-2,25],[2,0],[0,10],[-5,25],[9,20],[2,15],[3,20],[4,25],[-2,15],[-20,41],[0,20],[-13,15],[-11,10],[-29,-20],[-15,5],[-7,10],[-13,10],[6,15],[-4,15],[-2,5],[-11,10],[-2,10],[2,10],[-16,40],[-11,10],[-9,20],[-4,26],[2,30],[-4,25],[-2,20],[-7,5],[0,15],[11,10],[2,20],[-4,10],[-5,40],[14,36],[-5,15],[9,20],[0,20],[7,25],[6,15],[5,5],[0,15],[4,20],[16,5],[-5,10],[5,10],[-3,10],[-13,16],[-6,10],[0,30],[-14,-5],[-6,10],[-9,10],[-11,0],[-11,25],[-11,15],[-22,5],[-27,-15],[-24,-30],[-15,5],[-9,-5],[-5,40],[7,35],[-13,60],[-11,11],[-2,-11],[0,-30],[-20,-25],[-2,0],[-18,10],[-13,0],[-5,10],[-4,0],[-9,-15],[-15,-5],[-5,-10],[-6,-5],[-5,-20],[5,-30],[22,-45],[-5,-5],[2,-20],[-17,-26],[-11,-10],[-20,-15],[-13,-15],[-22,-10],[-5,-10],[-28,-10],[-9,-10],[-11,-5],[-24,-35],[-25,5],[-4,20],[0,15],[-64,-40],[-35,25],[-51,30],[-7,-5],[-8,5],[-9,10],[-11,-15],[-16,-5],[-24,25],[-7,-10],[-6,-10],[-7,0],[-2,-10],[-29,15],[-2,15],[-2,10],[-5,0],[-6,10],[-11,-5],[-16,0],[-11,-5],[-4,0]],[[7759,6200],[0,15],[13,5],[0,-15],[4,-15],[5,0],[2,10],[11,25],[7,-5],[6,-5],[3,0],[2,15],[9,-5],[17,0],[5,5],[6,15],[31,10],[20,10],[9,-5],[4,-10],[7,-5],[6,-10],[3,-10],[2,-30],[6,-10],[7,0],[11,10],[9,10],[9,0],[11,5],[6,-5],[16,10],[9,10],[4,0],[4,10],[5,0],[4,0],[7,15],[9,-5],[4,-5],[18,-30],[13,-5],[4,-5],[3,0],[0,-5],[2,0],[9,0],[13,5],[4,5],[5,5],[2,5],[4,20],[2,5],[3,0],[15,-5],[9,0],[2,-5],[2,0],[7,5],[4,5],[2,0],[12,-5],[4,0],[2,5],[7,5],[4,5],[2,0],[7,0],[0,-5],[0,-5],[0,-5],[13,-15],[0,-5],[2,0],[5,0],[4,-5],[2,-5],[9,-5],[5,0],[4,0],[4,5],[9,5],[0,-5],[2,-5],[-6,-10],[2,-10],[13,-10],[9,-5],[5,-5],[13,0],[2,0],[26,-10],[7,0],[0,5],[0,-5],[2,-5],[7,0],[0,-10],[4,-5],[7,-5],[4,0],[13,5],[9,0],[3,0],[13,5],[11,0],[13,0],[7,-5],[4,0],[0,-5],[4,-6],[3,0],[4,-5],[0,-5],[4,-10],[3,0],[4,-5],[4,-5],[11,-5],[9,-15],[0,-5],[3,0],[11,-15],[11,0],[15,-10],[2,-5],[13,-20],[5,0],[6,-10],[7,0],[2,5],[0,5],[2,0],[5,0],[6,5],[14,0],[4,5],[5,5],[2,5],[2,10],[2,10],[2,0],[3,0],[4,-5],[2,0],[9,0],[18,-5],[2,0],[2,0],[4,-15],[3,0],[-3,-5],[-6,-5],[-2,-5],[-3,-5],[-8,-5],[-3,0],[3,-5],[2,-10],[2,-10],[0,-10],[4,0],[14,-10],[2,-5],[15,-10],[0,-5],[0,-20],[0,-6],[2,-5],[3,-10],[0,-5],[2,-5],[-2,-10],[-7,-5],[-7,-10],[-4,-10],[4,-10],[-4,-5],[-9,-20],[-6,-10],[-3,-10],[3,-5],[0,-5],[0,-10],[-9,-15],[-2,-10],[13,-25],[4,-5],[-2,-21],[-2,-5],[-5,-10],[3,-10],[2,-35],[9,-5],[-5,-10],[-2,0],[0,-5],[-4,-10],[2,0],[6,0],[11,-10],[22,-5],[7,-10],[5,-10],[0,-5],[2,0],[2,0],[2,-5],[2,0],[9,0],[2,0],[7,0],[7,-5],[0,-5],[2,-10],[2,0],[15,-20],[29,-21],[7,0],[15,-5],[5,11],[4,0],[4,0],[14,5],[6,-11],[2,-10],[9,5],[11,5],[2,11],[9,-5],[5,0],[4,-21],[0,-25],[7,0],[6,0],[7,-15],[15,-5],[7,-5],[4,-5],[9,-5],[9,10],[11,0],[7,5],[0,-5],[2,-5],[4,-10],[2,-5],[5,0],[2,-5],[4,-5],[11,-35],[7,-5],[7,0],[4,-10],[2,-5],[5,-15],[4,-5],[5,0],[6,-10],[7,-10],[-5,-21],[-2,-5],[2,-5],[3,-30],[8,-10],[5,0],[0,-5],[4,0],[31,5],[22,-10],[7,5],[13,-10],[-2,-5],[0,-10],[0,-10],[0,-5],[0,-5],[13,-15],[9,-20],[6,-20],[14,5],[15,15],[2,5],[2,5],[5,5],[6,5],[12,-10],[11,0],[13,5],[2,5],[2,0],[5,15],[4,-5],[11,0],[4,0],[5,-10],[2,-5],[11,15],[13,0],[2,0],[7,15],[2,0],[5,0],[4,0],[7,10],[4,5],[2,10],[16,15],[9,20],[11,5],[11,-10],[33,10],[9,-5],[22,0],[-5,15],[2,15],[-2,21],[2,0],[0,5],[5,15],[0,25],[-2,5],[-5,10],[-2,5],[-7,5],[0,15],[-2,5],[0,15],[7,5],[2,5],[7,15],[6,55],[2,11],[0,5],[3,0],[4,10],[2,10],[0,10],[0,25],[0,5],[0,20],[38,-10],[8,0],[3,0],[9,-5],[24,-15],[26,-15],[7,-5],[2,0],[7,-10],[6,25],[5,0],[2,0],[13,5],[16,0],[2,20],[0,5],[-2,5],[-11,15],[-3,5],[-4,10],[-5,10],[0,10],[3,10],[2,15],[0,5],[0,5],[2,5],[2,0],[7,5],[7,5],[15,0],[9,10],[4,21],[0,25],[0,5],[2,5],[3,10],[4,10],[4,20],[11,25],[0,5],[0,15],[9,5],[7,30],[0,5],[4,5],[14,5],[11,0],[24,-5],[22,36],[2,5],[4,5],[5,5],[2,0],[4,0],[5,-5],[17,-15],[3,-11],[0,-10],[2,-5],[2,-10],[7,-10],[4,0],[2,-5],[5,-15],[2,-5],[7,-10],[6,0],[5,-5],[4,-5],[9,-10],[0,-5],[4,-5],[2,-5],[-2,-15],[0,-5],[0,-5],[-4,-10],[-2,-10],[0,-5],[-3,-10],[0,-5],[0,-5],[0,-5],[3,0],[4,-10],[2,0],[2,-5],[3,0],[2,0],[6,0],[3,-6],[2,0],[4,0],[2,0],[5,-5],[4,-5],[5,0],[4,0],[7,-5],[2,0],[7,0],[6,0],[2,-5],[3,-5],[2,0],[6,-5],[7,-5],[4,-5],[3,0],[4,-5],[2,-5],[2,-5],[3,-10],[11,-10],[2,-5],[4,0],[7,0],[9,-5],[-3,-10],[-2,0],[0,-5],[5,-5],[-5,-10],[0,-10],[2,-5],[3,-10],[0,-5],[0,-5],[0,-5],[-3,-10],[0,-5],[0,-5],[0,-5],[-2,-5],[0,-5],[0,-5],[0,-11],[-2,0],[-2,-10],[-2,0],[-3,0],[-2,-5],[-2,0],[-2,-5],[0,-5],[0,-5],[-2,-15],[0,-5],[0,-5],[-3,-5],[-2,-5],[0,-5],[0,-5],[0,-5],[0,-10],[0,-10],[-2,0],[0,-5],[-4,-10],[-3,-5],[-2,-5],[-2,-5],[-4,-5],[-5,-10],[-2,-5],[7,-10],[4,-10],[-2,-15],[4,-15],[0,-6],[0,-15],[-2,-15],[0,-5],[-2,-5],[-2,-15],[0,-5],[0,-5],[4,-25],[4,-30],[-6,-5],[-11,-35],[4,-10],[0,-15],[-6,-10],[-7,5],[-2,-16],[-5,-10],[7,-25],[-9,-15],[0,-20],[5,-5],[-7,-25],[-11,-40],[-4,-5],[0,-10],[-20,-15],[-9,-5],[-11,0],[-2,-10],[-5,-5],[2,-5],[-4,-21],[-7,0],[0,-5],[14,-10],[2,-10],[9,-10],[0,-10],[2,-5],[9,-20],[6,-15],[0,-25],[5,-25],[-3,-40],[-2,-11],[-15,6],[-29,-41],[-24,-20],[0,-10],[-24,-25],[6,-15],[11,-10],[5,-25],[9,-15],[8,-10],[-2,-20],[-2,-15],[-2,-16],[-16,-15],[-11,0],[-22,-80],[-11,-10],[-9,-5],[-4,-5],[2,-5],[5,-15],[8,-25],[5,-25],[-2,-21],[6,-35],[-4,-10],[2,-20],[4,0],[5,-10],[0,-20],[9,-15],[4,-25],[-4,-10],[4,-10],[16,-10],[24,15],[50,5],[7,10],[35,-40],[3,0],[46,-81],[11,-10],[7,0],[-3,-20],[-13,-30],[4,-35],[-6,-30],[2,-10],[7,-6],[-11,-40],[4,-20],[-9,-10],[-9,-20],[0,-15],[-4,-5],[-2,-20],[9,-30],[-16,-46],[0,-10],[2,-10],[-13,-10],[-15,-5],[0,-20],[-7,-10],[-9,-20],[-33,30],[-6,20],[-25,30],[-11,21],[-8,0],[-31,-31],[-7,-5],[-9,5],[-11,10],[-11,16],[-9,0],[-8,10],[-5,5],[-6,5],[-16,10],[-24,0],[-2,-15],[-3,-21],[-17,-25],[-9,-5],[-18,30],[-11,16],[-13,-21],[-6,0],[-11,-5],[-7,10],[-16,0],[-11,6],[-4,10],[2,15],[2,15],[-6,15],[-7,20],[-6,25],[-22,15],[-9,5],[-7,20],[-13,-5],[-22,-30],[-18,20],[-4,15],[-7,55],[0,11],[2,10],[7,20],[7,20],[8,10],[9,25],[7,10],[-5,10],[-26,50],[-11,25],[-2,26],[2,15],[-2,5],[-5,-5],[-4,-5],[0,-5],[-7,0],[-6,-5],[-5,-11],[-4,0],[-4,-5],[-3,-5],[-2,-5],[0,-5],[-4,-5],[0,-10],[0,-5],[-5,-15],[-4,-10],[-20,20],[-29,10],[-2,5],[0,5],[2,5],[-22,-10],[-42,-40],[-8,0],[-5,0],[-13,-5],[-18,-20],[-15,0],[-2,-15],[-5,0],[-13,-15],[-33,10],[-13,20],[-11,0],[-7,-30],[0,-10],[5,-10],[-7,-15],[-2,-20],[9,-26],[4,-15],[-11,-25],[-4,-20],[-38,-10],[2,-20],[11,-20],[-6,-20],[-9,-10],[-13,-10],[-5,-20],[-4,-25],[-9,-6],[-4,-15],[-33,-10],[-5,-20],[0,-5],[5,-15],[15,-20],[-7,-15],[7,-30],[-7,-50],[-8,-10],[-11,-5],[4,-31],[11,-20],[-7,-20],[-2,-10],[0,-20],[7,-10],[-11,-30],[0,-20],[4,-5],[13,-25],[3,-31],[4,-5],[-4,-25],[-11,-15],[0,-5],[-7,-5],[-4,-15],[0,-15],[-7,-10],[7,-20],[19,-10],[3,-5],[8,5],[5,-15],[0,-30],[4,-20],[9,-11],[15,11],[7,5],[7,-5],[6,-16],[-2,-10],[5,-10],[24,10],[11,-10],[9,0],[4,20],[7,0],[6,16],[18,-11],[4,16],[18,10],[4,5],[5,-5],[4,-10],[22,-5],[0,-6],[9,-20],[2,-35],[0,-10],[5,-5],[11,10],[4,5],[7,0],[15,-45],[-9,-10],[-2,-10],[4,-60],[-4,-20],[-13,-11],[-16,5],[-4,0],[-9,0],[-17,-20],[-16,-20],[0,-15],[-4,-25],[6,-30],[3,-15],[-14,-5],[-11,-15],[-11,-20],[-11,0],[0,-5],[0,-36],[-6,-15],[-3,-25],[0,-20],[18,-50],[9,-45],[15,-10],[20,-30],[13,-6],[-2,-20],[18,-30],[15,-5],[2,-5],[7,-20],[-7,-20],[18,-15],[-2,-25],[2,-10],[2,0],[0,-20],[11,-5],[9,-15],[9,-46],[-2,-15],[-53,-75],[-11,-50],[-31,-25],[-7,5],[-13,-11],[-9,6],[-22,5],[-13,10],[-9,0],[-9,5],[-13,-5],[-9,-10],[-8,-5],[-23,-41],[-6,5],[-5,10],[-6,0],[-9,26],[-7,0],[-8,15],[-7,-5],[0,5],[-11,10],[2,5],[9,10],[11,15],[0,30],[7,10],[0,15],[8,5],[-4,40],[-7,5],[5,5],[-9,46],[-22,15],[-11,15],[-7,5],[-17,20],[-42,15],[-29,20],[-9,55],[3,5],[6,0],[5,20],[6,0],[0,15],[-2,5],[-4,0],[-5,11],[9,15],[0,15],[-11,5],[-11,20],[-11,15],[-11,10],[6,25],[7,30],[9,20],[2,10],[11,10],[-2,15],[2,6],[-4,0],[4,25],[-4,5],[-20,0],[-2,5],[-14,20],[-8,5],[-7,15],[-15,15],[-18,50],[7,20],[-14,5],[-42,-20],[-4,-5],[-4,-10],[2,-15],[0,-5],[-13,-10],[-5,25],[-6,5],[-7,-10],[-20,55],[-17,-15],[-9,-5],[-20,-20],[-7,0],[0,-10],[-9,-15],[-26,-25],[-7,10],[-4,-5],[-2,0],[-11,0],[-7,-5],[-11,10],[-7,-15],[-8,0],[-5,0],[-4,-5],[-11,0],[-2,0],[-3,-15],[-8,-15],[-20,-25],[-7,0],[-13,-10],[-16,-21],[-19,-5],[-11,-10],[-7,0],[-15,-30],[-18,5],[-18,15],[-15,36],[-18,10],[-9,20],[-8,-10],[-5,5],[-31,-51],[11,-40],[-11,-10],[0,-10],[-8,-10],[-5,-15],[2,-10],[11,-5],[7,-5],[0,-35],[-2,-10],[-16,-25],[-6,-41],[0,-15],[-2,-10],[-27,-10],[-18,15],[-11,-5],[-15,20],[-2,15],[-11,15],[-11,-15],[-5,-20],[-11,5],[-9,-5],[-6,-5],[-5,-10],[-8,0],[-3,-5],[0,-10],[-11,-5],[-6,-10],[-13,-5],[-27,10],[-4,0],[-7,-5],[-20,40],[-6,-5],[-18,10],[-13,-10],[-7,5],[-15,-5],[-2,5],[-11,5],[-9,15],[-5,0],[-9,10],[-6,0],[-5,15],[-4,11],[-7,0],[-4,0],[-11,-21],[-26,36],[-5,10],[-4,5],[-7,15],[-2,5],[-5,10],[-4,5],[-4,15],[-14,25],[0,5],[0,5],[0,10],[-4,5],[-4,0],[-3,5],[0,10],[0,5],[-4,5],[-2,20],[0,15],[-2,5],[0,6],[-3,10],[0,10],[0,5],[-2,5],[-4,5],[-5,10],[-4,5],[-7,30],[-8,15],[-25,10],[-9,20],[-6,0],[-7,5],[-22,10],[-4,10],[4,20],[-4,15],[9,10],[6,26],[-4,10],[0,30],[-5,40],[-6,20],[-2,15],[-9,15],[-5,25],[9,56],[-2,25],[9,25],[-5,20],[3,25],[-3,30],[0,30],[11,15],[5,16],[-5,50],[-4,5],[-26,0],[-3,20],[27,5],[4,65],[-4,35],[4,15],[0,6],[-9,-6],[-8,-15],[-47,-35],[-11,-25],[-9,-20],[3,-15],[-5,-20],[0,-30],[-13,-15],[-11,-31],[-9,0],[-24,16],[-4,10],[-14,5],[-4,30],[-7,5],[0,10],[-6,0],[-5,10],[-4,0],[-9,25],[-7,0],[-4,35],[2,10],[7,5],[0,25],[-11,5],[-9,21],[-4,5],[-16,-31],[-9,5],[-26,-5],[-5,10],[-57,-10],[-13,-15],[-9,0],[-22,-20],[-18,0],[-8,-25],[0,-20],[-11,-20],[2,-10],[4,-15],[-2,-40],[-4,-5],[-3,-21],[5,-15],[6,-10],[-4,-10],[-9,-20],[-15,-20],[-7,-5],[-11,-5],[-13,0],[-5,-10],[-4,0],[4,-45],[-2,-25],[5,-10],[8,-15],[16,-21],[7,-15],[8,-5],[5,-10],[6,10],[5,0],[4,-25],[7,0],[2,-15],[0,-15],[4,-20],[-8,-10],[6,-5],[-4,-20],[-9,-15],[7,-30],[4,-10],[7,-6],[0,-10],[-7,-10],[-2,-15],[-5,0],[3,-10],[-3,-10],[-6,-5],[4,-10],[-2,-20],[4,-5],[11,-45],[16,-5],[13,-5],[4,-15],[-2,-15],[7,-31],[-16,-30],[-2,-10],[2,-20],[9,-20],[5,0],[-7,-20],[-2,-30],[-2,-5],[-20,-15],[-7,-25],[5,-15],[0,-41],[-27,-40],[-9,-40],[-19,-20],[0,-25],[-5,-20],[-15,-15],[4,0],[2,-21],[-9,-30],[5,-25],[-7,-20],[5,-15],[0,-25],[-5,-25],[-4,-10],[-16,0],[-8,5],[-22,-15],[-9,-5],[4,-26],[-6,-15],[-3,-35],[-11,-15],[-15,-5],[-11,-10],[-9,-45],[0,-15],[-7,-10],[0,-25],[7,-10],[-7,-15],[0,-26],[-17,-20],[-11,-25],[-20,5],[-11,5],[-16,-5],[-4,-5]],[[3875,8647],[0,5],[2,0],[2,0],[2,5],[3,0],[2,5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[5,0],[4,5],[2,0],[5,0],[22,5],[6,0],[3,0],[2,0],[4,0],[2,0],[0,5],[3,0],[2,0],[2,0],[0,5],[2,0],[2,5],[3,5],[2,0],[2,5],[4,0],[3,0],[4,5],[2,0],[2,0],[5,5],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,0],[2,0],[7,5],[4,0],[3,0],[2,0],[2,0],[0,5],[2,0],[2,0],[3,0],[2,5],[2,0],[2,0],[3,5],[2,0],[4,5],[2,0],[3,0],[0,5],[2,0],[0,5],[0,5],[2,5],[2,0],[0,5],[0,5],[2,0],[3,0],[0,5],[2,0],[0,6],[2,0],[2,0],[0,5],[2,0],[3,5],[2,0],[2,0],[0,5],[2,0],[2,0],[0,5],[3,0],[0,5],[2,5],[2,5],[0,10],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[2,5],[0,5],[3,5],[2,10],[0,5],[2,5],[0,5],[2,0],[2,0],[3,5],[2,0],[2,0],[2,0],[2,0],[3,0],[4,-5],[4,0],[3,0],[2,0],[2,0],[0,-5],[2,0],[3,-5],[2,-5],[2,-5],[2,0],[0,-5],[2,0],[3,0],[2,0],[2,0],[4,0],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[2,0],[2,0],[2,5],[5,5],[2,0],[2,0],[0,5],[2,0],[2,5],[3,0],[2,5],[2,0],[2,0],[2,0],[5,0],[4,0],[2,5],[3,0],[2,0],[2,0],[4,0],[3,0],[2,-5],[2,0],[2,0],[2,0],[5,5],[4,0],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[2,0],[0,-5],[2,0],[3,0],[0,-5],[2,0],[4,-5],[2,-5],[3,-5],[2,-5],[2,0],[2,-5],[2,0],[0,-5],[3,0],[2,-5],[2,-10],[2,0],[2,-5],[3,-15],[2,-5],[2,-5],[0,-5],[0,-5],[2,0],[0,-5],[-2,-5],[0,-5],[0,-5],[-2,0],[-2,-11],[-3,-5],[0,-5],[-2,0],[0,-5],[0,-5],[2,0],[0,-5],[0,-5],[0,-5],[3,-5],[0,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,0],[2,-5],[3,0],[0,-5],[2,0],[2,-5],[2,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[4,0],[5,0],[2,0],[2,0],[5,0],[2,0],[2,0],[2,0],[3,0],[2,0],[0,-5],[4,0],[5,-5],[4,0],[0,-5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[0,5],[3,0],[2,5],[2,5],[0,5],[2,0],[0,5],[0,5],[2,5],[0,5],[0,5],[0,5],[0,5],[3,0],[0,5],[2,0],[2,5],[2,0],[0,5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[4,-5],[4,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[4,0],[5,0],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[6,0],[2,0],[5,0],[2,0],[2,0],[2,0],[3,0],[2,0],[6,-5],[3,0],[2,0],[2,-5],[4,-5],[3,0],[0,-5],[2,0],[2,0],[0,-5],[2,0],[2,0],[5,0],[2,-5],[2,0],[3,0],[2,5],[2,0],[2,0],[2,0],[0,5],[3,0],[2,0],[4,0],[2,0],[5,0],[2,0],[2,5],[2,0],[5,0],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[7,5],[2,0],[0,5],[2,0],[2,5],[2,5],[3,0],[2,0],[2,5],[2,5],[2,0],[5,5],[0,5],[2,0],[0,5],[2,0],[2,5],[3,-5],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,6],[2,0],[3,-6],[2,0],[2,0],[2,-5],[2,-5],[3,-5],[2,0],[2,-5],[2,0],[0,-5],[2,0],[3,0],[0,-5],[4,0],[2,0],[0,-5],[2,0],[3,0],[2,0],[2,0],[0,5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,5],[2,0],[3,5],[2,0],[2,5],[2,5],[2,0],[0,5],[3,0],[0,5],[2,6],[0,5],[2,5],[0,10],[0,5],[0,5],[0,5],[0,5],[0,5],[2,5],[0,5],[0,5],[2,0],[0,5],[3,5],[2,5],[2,0],[0,5],[4,5],[3,0],[0,5],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,0],[5,0],[8,-5],[3,0],[2,0],[2,0],[2,0],[2,5],[5,0],[4,0],[2,0],[3,0],[2,0],[2,0],[2,0],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[0,5],[0,5],[3,0],[2,5],[2,0],[2,0],[2,0],[0,5],[3,0],[2,5],[2,0],[2,5],[2,0],[3,0],[2,0],[2,5],[2,0],[2,0],[3,0],[2,-5],[2,0],[2,0],[5,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[0,5],[2,0],[3,5],[2,0],[2,5],[0,5],[2,0],[0,5],[2,5],[3,0],[0,5],[2,5],[2,0],[2,0],[2,5],[3,0],[2,0],[6,5],[3,0],[2,0],[0,6],[2,0],[2,5],[2,5],[0,5],[3,5],[2,5],[2,5],[2,10],[0,5],[2,0],[0,5],[3,5],[2,0],[0,5],[2,0],[2,5],[2,5],[3,0],[2,0],[0,5],[2,0],[5,0],[0,5],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,-5],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,-5],[2,0],[2,0],[0,-5],[2,0],[0,-5],[0,-5],[3,0],[0,-5],[0,-5],[2,-5],[0,-5],[0,-5],[0,-5],[2,-5],[0,-5],[0,-5],[2,0],[0,-5],[2,0],[3,0],[2,0],[2,0],[2,5],[2,5],[3,0],[0,5],[2,0],[2,10],[2,0],[0,5],[2,0],[0,5],[3,0],[2,5],[2,0],[2,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[2,0],[4,5],[5,0],[2,5],[2,0],[2,0],[5,0],[2,0],[2,0],[2,0],[3,-5],[0,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,0],[2,-5],[3,0],[2,0],[2,5],[2,0],[2,0],[3,0],[2,0],[2,0],[4,5],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[0,-5],[4,0],[2,0],[2,0],[3,0],[2,0],[2,-5],[2,0],[2,0],[3,-5],[2,0],[4,-5],[3,0],[2,-5],[2,-5],[2,0],[0,-5],[-2,-6],[0,-5],[0,-5],[-2,-10],[0,-5],[-2,-10],[0,-5],[0,-5],[0,-5],[0,-5],[2,-5],[2,-5],[0,-5],[2,-5],[2,-5],[3,-5],[2,0],[0,-5],[2,0],[2,0],[2,-5],[3,0],[4,0],[2,-5],[2,0],[3,0],[2,-5],[2,-5],[2,0],[2,-5],[3,0],[0,-5],[2,-5],[2,0],[2,-5],[0,-5],[2,-5],[3,0],[2,-5],[2,-5],[2,-5],[2,0],[3,-5],[2,0],[2,0],[2,-5],[2,0],[3,0],[2,0],[2,0],[4,0],[3,-5],[2,0],[2,0],[7,0],[2,0],[2,5],[2,0],[3,0],[2,0],[4,0],[5,0],[4,0],[7,-5],[2,0],[4,0],[2,0],[3,0],[2,0],[2,0],[2,-5],[2,0],[3,0],[2,0],[2,0],[2,0],[5,-5],[2,0],[2,0],[2,0],[5,0],[4,0],[2,-5],[2,0],[3,0],[2,0],[2,-5],[4,0],[0,-5],[3,0],[0,5],[2,0],[2,5],[0,5],[2,0],[0,5],[0,5],[3,5],[0,5],[2,0],[0,5],[2,0],[0,5],[2,0],[0,5],[2,0],[3,5],[2,0],[2,5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[0,-5],[2,0],[2,0],[5,-5],[4,-5],[2,-5],[3,0],[2,0],[2,-5],[2,0],[5,-5],[2,0],[6,-5],[5,-5],[2,0],[2,0]],[[5982,9380],[2,0],[3,0],[0,5],[2,0],[2,0],[2,6],[2,0],[3,0],[2,0],[0,5],[2,0],[2,5],[2,0],[0,5],[5,5],[2,0],[4,5],[0,5],[3,0],[0,5],[2,0],[0,5],[2,0],[2,0],[2,0],[3,0],[2,0],[4,-5],[5,0],[2,-5],[2,0],[2,-5],[5,0],[0,-5],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[0,5],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,5]],[[6110,9421],[4,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,-5],[2,0],[4,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[5,0],[2,-5],[2,0],[2,0],[3,0],[2,0],[2,0],[0,-5],[2,0],[2,0],[3,-5],[4,0],[2,0],[0,-5],[2,0],[3,0],[2,-6],[2,0],[2,0],[0,-5],[2,0],[3,0],[0,-5],[2,0],[0,-5],[2,-5],[2,0],[0,-5],[2,0],[3,0],[2,-5],[4,0],[2,-5],[3,0],[2,-5],[4,-5],[2,0],[3,0],[2,-5],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,5]],[[6434,9230],[4,0],[3,0],[2,0],[4,0],[2,0],[3,0],[0,-5],[2,0],[2,-5],[2,-5],[2,0],[5,-5],[2,-5],[5,-5],[2,0],[0,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[4,0],[5,5],[2,0],[2,0],[2,5],[5,0],[2,5],[2,0],[2,0],[5,0],[0,5],[4,0],[2,0],[3,0],[2,0],[4,5],[9,5],[11,5],[2,0],[2,5],[3,0],[11,0],[4,0],[2,0],[3,0],[0,5],[2,0],[2,0],[7,5],[2,5],[4,0],[7,10],[4,0],[2,5],[7,5],[4,0],[5,5],[2,5],[2,0],[2,0],[3,5],[2,0],[2,5],[4,5],[3,5],[2,0],[2,5],[4,5],[5,5],[2,5],[2,0],[2,5],[3,0],[2,5],[2,0],[5,5],[4,0],[11,10],[4,5],[3,5],[4,0],[2,0],[5,5],[2,0],[2,5],[4,0],[7,5],[7,5],[4,5],[4,0],[5,5],[2,0],[2,0],[5,0],[0,6],[2,0],[2,0],[2,0],[5,0],[2,0],[0,-6],[2,0],[2,0],[5,0],[11,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[7,0],[4,0],[2,0],[5,0],[2,0],[2,0],[4,0],[3,0],[2,0],[2,-5],[2,0],[2,0],[3,0],[2,0],[2,-5],[2,0],[2,0],[3,0],[2,-5],[2,0],[2,-5],[2,0],[3,0],[2,-5],[2,-5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[4,0],[7,0],[2,0],[2,0],[3,0],[2,0],[6,0],[5,0],[2,0],[2,0],[7,-5],[4,-5],[2,0],[3,0],[2,-5],[2,0],[2,-5],[2,0],[3,-5],[2,0],[2,-5],[2,-5],[2,-5],[3,0],[2,-5],[2,0],[0,-5],[7,-5],[4,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[0,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,-5],[2,0],[3,0],[2,-5],[2,0],[2,0],[2,0],[3,0],[0,5],[2,0],[2,0],[0,5],[4,5],[3,0],[0,5],[2,0],[2,0],[2,0],[2,0],[0,-5],[3,0],[6,0],[5,-5],[2,0],[0,-5],[2,0],[0,-5],[2,0],[0,-5],[0,-5],[2,0],[3,-5],[2,-5],[4,-5],[3,-5],[4,-5],[2,-5],[2,-5],[5,0],[6,5],[3,-10],[13,10],[2,0],[9,5],[17,-5],[16,-5],[2,0],[68,10],[31,10],[18,0],[26,-15],[391,-307],[17,-25],[110,-216]],[[7759,8396],[-2,0],[-3,0],[-2,-5],[-9,-5],[-4,-5],[-7,-5],[0,-5],[5,20],[-13,5],[-9,5],[-7,0],[2,10],[-8,0],[0,5],[-5,5],[5,15],[-5,5],[2,15],[3,0],[6,-10],[2,0],[9,-5],[13,-5],[5,-5],[4,0],[2,-5],[3,-5],[2,-5],[4,-5],[5,-5],[2,-5],[0,-5]],[[5354,3185],[-7,40],[9,10],[-2,20],[15,11],[0,5],[-4,5],[-2,15],[-7,15],[2,10],[18,35],[-7,35],[0,15],[7,-5],[9,0],[4,-10],[22,5],[7,10],[13,-10],[27,20],[24,-10],[4,10],[16,55],[8,0],[9,16],[13,35],[9,10],[7,15],[11,10],[0,15]],[[7060,1768],[-4,-40],[-16,-5],[-13,-15],[-7,-15],[-13,-10],[-4,-15],[-13,-25],[-14,-51],[-9,0],[-8,0],[-18,-15],[-9,-15],[-2,-10],[-7,0],[-17,-10],[-9,-10],[-13,-10],[-16,-15],[5,-15],[13,-50],[20,-76],[0,-15],[-11,-40],[-5,-10],[-8,-10],[0,-35],[0,-15],[-9,-15],[-31,-6],[-11,6],[-11,0],[-11,-16],[-11,0],[-24,-30],[-16,0],[-4,-5],[-7,-10],[-2,-15],[4,-10],[-2,-10],[-18,-30],[-4,-35],[4,-15],[18,-31],[13,-25],[5,-75],[6,-35],[-11,-5],[-2,-15],[-7,-10],[-2,0],[-11,5],[-4,-5],[0,-25],[-5,-5],[-2,-5],[-9,-6],[-19,0],[2,-30],[-2,-10],[-7,5],[-2,-5],[-2,-5],[-3,10],[0,-15],[11,-20],[44,-25],[3,-50],[4,-10],[-11,-25],[7,-15],[11,-5],[4,-11],[-7,-50],[18,5],[7,-15],[15,0],[13,10],[7,-15],[7,-10],[2,-5],[-2,-5],[4,0],[7,0],[4,0],[7,0],[2,0],[-2,-20],[19,-20],[0,-10],[5,-5],[0,10],[7,5],[8,-10],[0,-10],[-4,-15],[4,-36],[22,16],[5,-5],[-5,-11],[5,-10],[-9,-5],[-7,-20],[-8,0],[-3,-5],[7,-10],[-7,-10],[3,-10],[-14,-15],[-13,-35],[-2,5],[-18,-5],[-4,-5],[0,-10],[-5,-10],[3,-10],[-5,-5],[-6,-20],[0,-20],[4,-16],[2,-10],[-9,-5],[7,-5],[-13,-10],[-2,-15],[-7,0],[-4,-15],[0,-5],[-7,-5],[0,-10],[4,-25],[-8,-15],[2,-5],[-5,-30],[-4,0],[9,-10],[-7,-10],[-6,0],[-16,5],[-7,-15],[-2,-5],[-31,10],[-13,15],[-9,-5],[-2,5],[5,10],[2,35],[4,0],[-2,15],[-7,-5],[-8,5],[2,5],[-9,15],[-11,-15],[-13,5],[-3,-5],[3,-5],[-7,-15],[-2,5],[-5,-5],[-6,15],[-13,5],[2,15],[-13,15],[0,5],[-7,0],[-9,5],[-4,-5],[-18,-10],[-11,-10],[-4,-10],[0,-5],[-7,-5],[0,-10],[-18,5],[-19,-15],[4,55],[40,96],[15,15],[13,15],[-4,10],[-2,5],[-11,-10],[-7,15],[2,5],[-6,65],[-11,35],[-7,0],[-2,20],[-2,0],[-3,5],[5,5],[4,16],[0,10],[-11,30],[-9,25],[-4,20],[-13,0],[-27,45],[-6,25],[0,25],[9,26],[0,65],[-7,20],[-27,-10],[-13,10],[-15,10],[-9,20],[-11,5],[-13,20],[-11,15],[-5,15],[-6,10],[0,10],[-2,6],[-3,5],[-2,0],[-2,5],[-11,10],[-7,15],[-17,0],[-9,0],[-5,0],[-8,15],[-5,-5],[-2,0],[-9,5],[-15,0],[-7,5],[-7,0],[-2,0],[0,-5],[-2,-5],[-4,-5],[-9,0],[15,95],[9,20],[20,51],[31,15],[17,45],[5,40],[6,-5],[5,15],[-16,15],[16,20],[20,-15],[24,71],[-7,70],[-11,0],[-11,20],[-20,15],[-15,35],[-2,-5],[-5,10],[-2,5],[0,5],[-2,5],[-7,0],[0,5],[-6,10],[-5,5],[-15,15],[-9,-20],[-4,-10],[-38,-5],[-13,15],[-7,10],[-13,10],[-2,0],[-7,0],[-6,0],[-5,5],[-6,16],[-31,85],[-40,-60],[-20,-66],[-37,20],[-9,5],[-7,0],[-4,0],[-2,0],[-5,0],[-2,11],[-2,5],[-2,0],[-2,5],[0,10],[-5,0],[2,5],[0,5],[-4,5],[-4,-5],[-5,0],[-4,0],[-5,-5],[-4,0],[-24,20],[-5,15],[-17,35],[-60,-5],[-20,0],[0,5],[-4,20],[0,30],[-11,10],[-5,15],[-15,26],[-7,0],[3,5],[-3,5],[3,10],[6,5],[7,5],[0,5],[0,15],[2,0],[7,5],[-3,10],[-6,0],[-11,0],[-7,5],[-4,0],[-2,0],[-3,0],[3,10],[-5,5],[2,5],[-4,10],[-4,0],[-5,0],[-6,-5],[-3,0],[-2,5],[-4,5],[-5,5],[-6,60],[-14,36],[-11,10],[-11,0],[3,5],[-5,25],[-26,30],[-11,30],[-7,70],[-24,20],[-11,-10],[-7,0],[-9,10],[-17,21],[-20,15],[-13,5],[-20,0],[-22,15],[-5,15],[-2,25],[-2,20],[-7,0],[-13,10],[-17,5],[-7,5],[-2,15],[-2,10],[4,5],[4,15],[5,0],[0,15],[17,15],[-13,51],[-35,70],[0,20],[-13,30],[4,15],[5,5],[19,10],[-4,16],[7,15],[-3,30],[7,15],[22,10],[4,30],[9,10],[11,25],[-2,15],[0,40],[-4,46],[4,10],[2,10],[11,20],[-6,30],[-3,60],[-11,36],[22,45],[-15,35],[-2,15],[11,30],[-11,30],[-11,10],[-2,15],[0,10],[6,31],[-4,5],[0,15],[2,10],[11,10],[4,20],[-2,10],[-9,5],[3,25],[-11,10],[-9,10],[-2,20],[-5,15],[-9,10],[-15,-5],[-2,5],[-16,-5],[-22,-10],[-9,-10],[-6,0],[-16,-5],[-11,-15],[-13,0],[-6,-15],[-9,5],[-9,-5]],[[6637,728],[4,-5],[16,0],[6,45],[-4,5],[-2,20],[4,36],[-2,0],[-22,5],[-20,-96],[20,-10]],[[628,2642],[-62,46],[-13,10],[-11,0],[-5,5],[-4,20],[-7,5],[-11,-5],[-4,0],[-2,5],[-7,10],[-9,10],[-13,-15],[4,-10],[-11,-10],[5,-15],[4,-5],[13,-5],[12,-20],[6,5],[2,-5],[5,-5],[2,5],[4,0],[-4,-26],[24,-25],[0,5],[7,-10],[55,-35]],[[608,2577],[-27,-95]],[[581,2482],[-46,-141],[-62,50],[-24,20],[-15,5],[-5,10],[-22,20],[-13,21],[-2,10],[-13,15],[2,5],[-7,5],[2,5],[-2,0]],[[374,2507],[-2,10],[4,10],[9,10],[0,10],[7,15],[2,0],[2,20],[5,5],[2,0],[0,10],[-5,5],[3,5],[2,5],[-2,0],[2,5],[2,0],[2,5],[7,5],[4,0],[0,5],[7,5],[7,16],[0,5],[4,5],[7,10],[2,5],[0,15],[2,20],[2,0],[2,10],[20,30],[0,5],[-11,25],[-6,10],[-5,25],[-2,5],[-4,-10],[-3,0],[-4,-5],[-9,0],[-31,56],[-48,60],[-2,-5],[4,-10],[-2,0],[-11,10],[-7,5],[-13,25],[-4,20],[-69,30],[-6,5],[13,45],[9,16],[2,20],[20,40],[2,5],[2,10],[-4,20],[-20,30],[4,20],[-9,15],[3,15],[-3,15],[9,11],[44,70],[36,141],[17,35],[38,70],[11,-15],[2,0],[20,45],[-9,10],[15,30],[-39,66],[-60,95],[24,35],[9,25],[29,41],[7,5],[15,20],[11,10],[15,30],[11,0],[20,20],[9,10],[2,20],[20,25],[5,0],[11,15],[0,10],[11,21],[-3,0],[9,10],[5,-5],[4,5],[11,25],[9,5],[0,5],[4,10],[2,0],[18,15],[13,35],[51,75],[24,31],[0,10],[5,5],[2,0],[-5,5],[0,15],[3,0],[17,20],[11,15],[29,20],[4,0],[20,25],[38,35],[9,0],[30,20],[16,21],[6,5],[5,15],[6,10],[7,15],[11,-5],[4,5],[12,5],[-3,25],[-6,0],[4,5],[11,5],[9,0],[11,0],[2,5],[9,15],[7,15],[-3,15],[-6,10],[15,25],[13,15],[7,-5],[4,0],[25,16],[15,5],[13,15],[3,0],[17,30],[-2,5],[2,10],[0,5],[22,30],[7,5],[0,25],[13,45],[-35,51],[-16,15],[0,5],[-8,50],[22,20],[-3,40],[7,40],[37,101]],[[1110,5195],[12,-5],[2,-15],[35,-5],[64,35],[9,5],[17,10],[11,10],[22,40],[18,10],[13,20],[16,6],[9,10],[15,15],[11,5],[26,20],[14,0],[11,0],[17,15],[7,0],[13,10],[13,0],[14,0],[6,15],[36,70],[2,25],[33,36],[13,10],[37,30],[80,50],[-2,-10],[2,-10],[4,-5],[-13,-75],[0,-51],[9,-5],[42,-50],[0,-15],[-5,-35],[0,-5],[3,0],[2,5],[0,-5],[-2,-25],[-14,-56],[16,20],[31,-5],[6,-10],[51,-80]],[[2005,5481],[67,81]],[[2788,2567],[-44,-80],[-27,-46],[0,-45],[18,-30],[-6,-5],[2,-10],[-11,-5],[-9,-10],[6,-50],[0,-10],[-11,-10],[-6,-5],[-2,5],[-5,-5],[-13,-26],[0,-10],[-7,-5],[-15,-30],[-15,-5],[-7,-20],[-2,-25],[-2,-5],[-12,-10],[-4,-5],[-7,-10],[-11,-5],[-11,0],[-8,0],[-3,0],[-2,-20],[-4,-20],[-2,-20],[4,-6],[-7,-5],[-8,-20],[-3,-10],[-15,-25],[-9,-10],[-18,-15],[-17,-25],[-18,-10],[-4,-5],[-5,5],[-11,5],[-15,-10],[-11,-15],[-13,-10],[-3,-5],[-6,-5],[-9,-5],[-9,-5],[-2,-5],[-13,-5],[-2,-5],[-3,5],[0,5],[0,5],[-2,0],[-2,5],[-2,10],[-7,10],[-2,10],[-4,15],[-5,0],[-2,10],[-2,0],[-5,5],[-2,5],[-2,0],[-4,5],[0,10],[0,5],[-5,10],[0,10],[0,10],[0,10],[-2,10],[0,5],[0,10],[-2,0],[-3,5],[-4,0],[-2,0],[-2,5],[-3,5],[0,11],[0,5],[0,5],[0,5],[-2,5],[0,5],[-2,5],[-9,15],[-2,0],[0,5],[-2,10],[-2,5],[-3,10],[-2,5],[0,5],[-4,5],[-2,0],[0,5],[0,5],[-3,20],[0,5],[-2,5],[-9,15],[-8,10],[-14,25],[-4,5],[-2,5],[-7,16],[-4,5],[-3,5],[0,10],[-2,30],[0,5],[-2,10],[-2,10],[-2,10],[-3,0],[-6,15],[-5,10],[-11,10],[-2,5],[-6,5],[-5,5],[-6,5],[-5,10],[-4,10],[0,5],[0,5],[0,10],[0,5],[-2,11],[-3,5],[0,10],[0,10],[-2,5],[0,5],[-2,10],[0,5],[0,15],[0,10],[0,5],[0,10],[0,5],[0,5],[-2,10],[-2,10],[-5,10],[-6,10],[-5,10],[-4,5],[-2,5],[-3,5],[-2,0],[-2,0],[0,5],[-5,0],[-4,-5],[-2,0],[-2,0],[-5,0],[-6,0],[-5,0],[-6,0],[-3,0],[-2,0],[-2,0],[-2,5],[-2,0],[-3,5],[-2,5],[-6,26],[-5,10],[-2,5],[-4,5],[-3,0],[-2,5],[-2,5],[-2,5],[0,5],[0,5],[0,5],[9,30],[0,5],[2,5],[0,15],[-2,10],[0,5],[0,10],[-3,10],[-2,5],[-2,10],[-2,0],[-2,5],[-5,5],[-4,5],[-2,0],[-3,0],[-2,5],[-4,5],[-5,10],[-2,5],[-4,11],[-9,15],[-2,0],[-3,10],[-4,5],[-84,165]],[[1906,3059],[-306,136],[-359,10],[-205,-201],[-201,-60],[-181,-221],[-26,-81]],[[1847,4612],[-2,-10],[-5,-5],[0,-10],[-6,-10],[0,-5],[11,-10],[6,0],[9,5],[4,-5],[5,5],[4,0],[7,0],[4,5],[13,25],[25,10],[4,0],[7,0],[11,-10],[17,-25],[14,-10],[11,0],[4,0],[7,-5],[2,5],[4,-5],[7,15],[-5,5],[3,10],[-3,5],[0,5],[23,55],[4,10],[9,20],[-5,10],[-8,11],[2,10],[-11,10],[-9,10],[-7,15],[-2,0],[-4,-5],[-3,0],[-2,0],[0,-5],[-2,0],[-2,10],[4,5],[0,10],[-6,10],[-3,10],[-4,10],[-7,0],[3,10],[-7,5],[-7,-20],[7,0],[-11,-30],[-7,-10],[-8,-10],[-18,-25],[-2,-10],[4,0],[-2,-5],[-16,-31],[-2,-15],[-13,-15],[4,-10],[-2,-5],[-4,-5],[-5,0],[-2,0],[-2,0],[-4,-5],[-3,0],[-2,-5],[-4,10],[-13,-15],[-3,10],[-4,-5],[-2,5]],[[471,2653],[-6,-16],[11,-10],[2,0],[0,5],[-2,5],[0,5],[2,5],[2,6],[2,5],[16,-16],[4,11],[-18,25],[-4,-10],[-2,0],[-7,-15]],[[2144,5702],[161,171],[84,-35]],[[5354,3185],[-9,-5],[-4,0],[-9,10],[-9,0],[-9,-5],[-22,-20],[-6,-10],[-7,-25],[-18,-20],[-4,-15],[-7,-10],[-11,-10],[-11,-16],[-4,-10],[-9,0],[-7,0],[-8,-10],[-9,0],[-7,15],[-9,-15],[-4,-10],[-4,-20],[-5,-15],[-11,-20],[-9,-5],[5,-10],[4,0],[5,-10],[8,0],[11,-10],[5,-5],[9,10],[2,-10],[11,-15],[2,-10],[0,-10],[-7,-15],[0,-15],[11,-16],[-8,-10],[-3,-20],[-2,-15],[-13,-10],[-11,5],[-13,-25],[-18,-20],[-11,-15],[-20,15],[-22,-15],[-6,-15],[8,-20],[-2,-5],[5,-20],[-14,-15],[7,-15],[-7,-6],[-15,6],[-9,-6],[0,-20],[-18,-5],[-4,0],[-7,5],[-8,-15],[-18,-20],[2,-5],[-6,-15],[2,-5],[0,-10],[4,-5],[-6,-15],[-16,-15],[0,-20],[-9,-15],[3,-15],[-16,-20],[-13,-21],[-11,5],[-16,-10],[-17,-15],[-9,0],[-31,-10],[-9,5],[-20,20],[-15,5],[-7,0],[-24,-35],[-4,-5],[-11,-10],[-5,-25],[-6,-15],[-5,-15],[-15,-5],[-20,-45],[-24,-20],[0,-26],[-5,-5],[-6,0],[2,-15],[13,-20],[27,-5],[4,-15],[18,0],[6,-55],[7,-15],[9,0],[9,-30],[19,-20],[14,0],[8,-71],[18,-45],[2,-30],[-2,-5],[4,-25],[9,-5],[18,-41],[0,-25],[-15,-15],[-3,-25],[-13,-20],[-2,-20],[0,-20],[6,-15],[0,-30],[5,0],[-11,-36],[-13,-20],[-11,-10],[-7,10],[-22,-10],[-26,-25],[2,-15],[-2,-15],[2,-10],[-2,-25],[-9,-10],[-3,-10],[-4,-10],[-18,0],[-4,-10],[-4,0],[-14,-10],[-8,0],[-11,-5],[-7,0],[-15,5],[-20,-15],[-7,-5],[-20,0],[-11,-11],[-22,0],[-2,-10],[2,-20],[-9,-25],[0,-15],[-2,-30],[-15,-30],[2,-15],[-2,-10],[4,-15],[0,-20],[9,-36],[9,-45],[4,-5],[2,-10],[-6,-10],[-16,-5],[-6,-10],[-22,-40],[4,-5],[9,-25],[-16,-31],[5,-15],[-2,-20],[-11,-5],[-14,5],[-2,-20],[-13,-30],[0,-10],[-11,-20],[-26,15],[-7,0],[-13,-5],[-11,0],[-7,-5],[-4,-5],[-20,10],[-18,-5],[-17,-5],[-7,5],[-7,0],[-17,-5],[-22,5],[-7,-10],[0,-10],[-4,-20],[-7,-5],[-13,-30],[-2,-16],[-36,-30],[0,-5],[5,-10],[2,-30],[-7,-10],[0,-10],[-6,-10],[6,-20],[-2,-25],[-13,-5],[-7,-56],[7,-15],[13,-35],[-9,-30],[-4,-5],[-11,0],[-5,-15],[-13,20],[-17,-5],[-20,10],[-9,0],[-11,15],[-22,10],[-7,0],[-11,-15],[-9,-5],[-13,-20],[-9,-10],[-13,15],[-4,20],[-11,15],[-22,15],[-18,35],[-40,16],[-6,5],[-11,-46],[-16,-20],[-2,-20],[-33,0],[-15,25],[-3,20],[-8,10],[4,66],[-7,15],[-11,10],[-11,10],[-17,0],[-16,10],[-9,20],[-2,20],[-6,10],[-14,35],[-8,10],[-11,5],[-7,0],[-4,-10],[-9,0],[-14,-15],[-15,-10],[-37,10],[-14,0],[-8,-15],[-36,10],[-15,0],[-13,20],[0,25],[-5,26],[-9,10],[-17,0],[-11,-5],[-27,0],[-4,-5],[-5,-5],[-4,-21],[-4,-20],[2,-25],[6,-45],[-6,-25],[-11,-10],[-7,10],[-15,0],[-11,5],[-11,25],[-5,-5],[-9,-15],[-8,0],[-9,5],[-11,15],[-7,-10],[0,-15],[-9,-10],[-8,0],[-22,-15],[-7,-10],[-7,-15],[5,-40],[2,-16],[-7,-15],[-6,0],[-9,5],[-13,5],[-7,-15],[-22,-5],[-9,-15],[-2,-5],[-15,-40],[-16,-25],[-11,0],[-2,-15],[-13,-5],[-9,-10],[-11,0],[-9,10],[-9,-15],[0,-15],[-15,-31],[-18,-10],[-15,21],[-5,5],[-17,10],[-11,-5],[-11,20],[0,20],[-11,5],[-16,15],[-26,-20],[-18,-5],[-13,10],[-5,25],[-22,5],[-8,-5],[-9,15],[-7,10],[-9,-10],[-4,-10],[-9,-15],[0,-10],[-9,-25],[-9,-35],[-13,-5],[-31,-61],[-8,0],[-3,20],[-6,5],[-20,-15],[-16,5],[-8,5],[-7,-10],[-7,0],[-11,-5],[-4,-10],[0,-15],[-11,-10],[-2,-5],[-9,-5],[-4,-15],[-9,-5],[-5,-30],[0,-15],[7,-20],[-9,-15],[-13,-5],[-16,5],[-11,15],[-8,0],[-29,40],[0,10],[7,5],[-3,10],[-6,10],[-7,5],[-9,0],[-15,-10],[-13,-10],[-3,-5],[-6,0],[-7,-10],[-2,-20],[-7,-5],[-6,-10],[-9,-5],[-11,-20],[-9,0],[-2,-5],[-11,0],[-11,5],[-5,0],[-6,10],[-5,30],[-2,10],[-6,10],[4,10],[0,10],[-20,35],[-11,10],[-9,25],[3,25],[-9,0],[-7,15],[-13,11],[0,10],[0,35],[-7,20],[-17,10],[-5,15],[-4,5],[-2,5],[-3,5],[-2,0],[-2,5],[-7,45],[-6,10],[-7,25],[2,16],[0,15],[5,5],[0,10],[-5,30],[3,5],[-3,5],[-4,5],[-26,10],[-11,10],[-3,5],[-17,40],[2,20],[2,0],[9,10],[13,5],[5,10],[0,5],[0,5],[-3,6],[-4,5],[0,10],[-9,15],[-9,0],[0,10],[0,15],[-4,15],[2,10],[-11,20],[-2,0],[-9,-10],[-2,0],[-9,5],[-11,15],[-2,0],[-9,5],[-2,5],[0,5],[0,10],[-9,50],[0,10],[-22,31],[-9,25],[-9,0],[-17,55],[-11,50],[-16,-5],[-9,10],[-4,10],[-2,0],[-2,5],[0,10],[4,10],[-2,11],[4,5],[0,5],[-2,5],[-9,10],[-2,-10],[-9,-5],[-9,5],[-13,-31],[-7,-10],[-2,-10],[-4,-5],[-2,0],[0,-10],[-5,-5],[-4,-5],[-27,-10],[-6,-15],[-2,-15],[-9,15],[-9,-5],[-15,20],[0,5],[-7,15],[0,20],[18,66],[6,10],[9,10],[7,5],[-7,25],[7,15],[2,15],[-7,10],[-2,10],[-11,25],[0,5],[7,10],[2,5],[2,10],[7,16],[6,20],[2,5],[-4,25],[7,25],[2,15],[6,10],[-2,5],[-2,0],[-7,0],[-11,5],[-17,-10],[-5,0],[-8,15],[-16,-5],[-20,5],[-20,5],[-17,10],[-2,15],[-7,5],[-44,-10],[-9,-10],[-4,15],[-5,0],[-2,5],[-4,15],[-3,5],[-13,-10],[-6,10],[-7,56],[-11,30],[7,30],[-3,15],[31,50],[2,25],[11,15],[0,5],[-11,71],[-6,35],[9,40],[4,5],[0,10],[7,5],[8,25],[7,5],[4,10],[-2,36],[0,10],[14,10],[8,0],[14,35],[2,20],[4,15],[9,5],[7,5],[11,10],[6,15],[0,20],[11,36],[-2,40],[13,30],[0,5],[-2,10],[0,5],[-9,15],[-2,5],[0,10],[0,5],[-2,0],[-9,5],[-4,0],[-3,-10],[-8,0],[-5,5],[-2,15],[-9,5],[-9,10],[-4,15],[-7,0],[-4,5],[-2,10],[4,16],[-11,30],[-9,5],[-4,10],[-7,5],[-9,10],[-8,10],[-3,5],[-8,-5],[-3,0],[-2,0],[-2,5],[-4,25],[-3,5],[5,10],[-5,10],[-2,10],[-17,-5],[-7,5],[-2,0],[0,15],[-7,25],[-4,15],[-9,16],[-7,15],[-4,25],[4,30],[9,15],[11,10],[24,5],[20,40],[7,10],[4,15],[0,15],[-4,5],[-5,16],[3,25],[4,10],[35,165]],[[1110,5195],[3,50],[4,71],[2,70],[-13,55],[-24,50],[-13,36],[-11,20],[-7,30],[26,25],[31,50],[7,20],[18,35],[4,11],[2,5],[18,35],[11,15],[11,20],[13,15],[18,-40],[2,0],[29,25],[41,15],[34,20],[22,5],[11,10],[11,5],[24,30],[17,15],[9,10],[29,-10],[18,5],[2,0],[35,31],[13,25],[9,20],[20,70],[11,25],[44,45],[20,11],[22,0],[4,10],[7,5],[9,20],[6,5],[7,15],[13,15],[2,0],[3,5],[-16,5],[-4,5],[-5,20],[-2,0],[-6,5],[-9,0],[-5,15],[-4,5],[-4,0],[-7,15],[4,15],[14,5],[6,15],[7,5],[0,5],[-2,5],[6,16],[-11,10],[2,5],[7,5],[15,15],[0,5],[5,5],[13,5],[9,15],[11,-10],[18,0],[8,10],[7,20],[0,15],[-11,25],[-2,25],[4,5],[5,0],[8,0],[9,25],[29,26],[11,5],[11,0],[9,10],[24,15],[4,5],[14,10],[4,0],[11,5],[4,5],[5,20],[13,0],[4,15],[7,10],[11,10],[2,10],[7,10],[4,0],[20,20],[0,15],[2,5],[3,0],[15,10],[2,0],[5,16],[15,30]],[[1990,6768],[4,5]],[[581,2482],[47,-36],[4,-5],[2,0],[11,-10],[-4,-10],[4,-10],[-2,-10],[5,0],[-5,-10],[7,-5],[0,-5],[2,0],[2,-10],[-4,-10],[-5,-5],[-6,-10],[-5,0],[-4,0],[-4,-15],[-5,0],[2,-10],[-2,-15],[0,-5],[11,-15],[13,-51],[3,-5],[24,-35],[-2,-15],[8,-5],[7,-15],[27,15],[0,10],[13,10],[-2,5],[4,5],[13,30],[7,11],[4,-6],[-6,-30],[2,-10],[2,0],[11,-5],[4,0],[9,5],[7,0],[-2,-5],[-7,-20],[7,-5],[0,-15],[2,-15],[-35,-95],[-5,-11],[-35,-40],[-16,-10],[-6,0],[-27,-20],[-11,-20],[-6,10],[-2,0],[0,-10],[-5,0],[-6,0],[-7,5],[-7,0],[-9,-10],[-4,-5],[-2,-5],[-5,0],[-2,-5],[-4,0],[0,-10],[-9,-5],[-9,-20],[-2,0],[-2,-5],[-11,-5],[-11,-25],[-7,-10],[-2,-5],[-4,0],[-11,-16],[-5,0],[-6,-15],[6,-60],[-31,-40],[-15,-5],[-35,-25],[-9,-15],[-2,-15],[-5,-5],[-6,10],[-3,-10],[-9,-10],[-2,-11],[-20,-5],[-13,16],[-26,0],[-11,5],[-11,0],[-16,40],[-35,-15],[-2,0],[-7,5],[-44,5],[-6,-20],[-5,-20],[5,-11],[-3,0],[-4,-5],[-7,5],[-15,-20],[0,-10],[-2,10],[-3,-5],[0,10],[-2,5],[-2,-5],[0,5],[-7,0],[-2,5],[-6,0],[-3,5],[-2,5],[-17,6],[-5,-6],[-2,0],[-7,6],[-11,-6],[-22,11],[-2,0],[-2,0],[-11,-5],[-5,0],[-4,-6],[-2,-25],[-5,-5],[-8,-15],[-7,-5],[-7,0],[-11,-10],[-8,0],[-9,-10],[-2,20],[22,25],[2,10],[-5,15],[0,16],[9,35],[9,20],[7,20],[11,35],[2,30],[4,5],[2,0],[5,-15],[2,0],[4,20],[5,10],[0,10],[6,20],[-8,21],[-14,10],[-6,10],[-40,30],[0,5],[5,5],[4,5],[11,15],[-9,20],[11,40],[9,10],[15,0],[18,-10],[2,15],[-6,20],[11,0],[8,-5],[0,-5],[5,5],[11,10],[0,21],[7,5],[0,5],[8,0],[-2,10],[5,0],[4,5],[4,0],[14,5],[19,25],[18,-25],[9,-10],[11,20],[4,20],[16,30],[2,0],[4,5],[11,-20],[5,-5],[4,5],[2,-5],[3,10],[13,15],[6,-5],[3,10],[4,-5],[4,5],[0,-5],[31,-40],[9,15],[2,0],[5,-5],[2,0],[31,55],[0,10],[-7,5],[5,10],[-3,15],[-4,10],[-4,15],[4,6],[-7,5],[-2,0],[-13,20],[7,10],[-20,30],[2,30],[-7,5],[20,30],[5,15],[2,5],[6,-5],[5,0],[2,5],[-2,0],[0,5],[4,5],[-2,5],[4,10],[-6,10],[4,26],[-4,5],[2,20],[9,20],[0,5],[4,0]],[[502,2653],[-4,-11],[-16,16],[-2,-5],[-2,-6],[-2,-5],[0,-5],[2,-5],[0,-5],[-2,0],[-11,10],[6,16],[7,15],[2,0],[4,10],[18,-25]],[[628,2642],[-20,-65],[-55,35],[-7,10],[0,-5],[-24,25],[4,26],[-4,0],[-2,-5],[-5,5],[-2,5],[-6,-5],[-12,20],[-13,5],[-4,5],[-5,15],[11,10],[-4,10],[13,15],[9,-10],[7,-10],[2,-5],[4,0],[11,5],[7,-5],[4,-20],[5,-5],[11,0],[13,-10],[62,-46]],[[1990,6768],[0,5],[-11,5],[-11,-5],[-9,0],[-6,10],[-3,15],[9,10],[18,15],[2,5],[2,0],[5,0],[17,15],[5,20],[2,5],[15,0],[-2,25],[2,5],[0,10],[5,5],[4,10],[5,21],[13,20],[4,0],[2,5],[9,10],[29,35],[9,20],[2,0],[6,5],[20,15],[5,10],[2,5],[2,15],[11,10],[16,5],[6,15],[0,5],[2,15],[9,5],[9,16],[7,5],[2,5],[-7,15],[-11,15],[-2,15],[0,5],[7,10],[4,20],[0,10],[-4,20],[4,15],[-13,50],[-2,11],[-9,25],[9,15],[4,10],[13,5],[20,-5],[13,5],[11,-5],[5,0],[2,10],[2,15],[16,-5],[11,10],[17,-5],[16,25],[6,0],[2,0],[5,10],[2,25],[7,10],[4,20],[-4,30],[-9,6],[0,15],[35,10],[18,10],[20,-10],[6,5],[25,35],[-3,5],[-6,0],[0,10],[4,5],[9,10],[7,20],[-14,10],[-13,5],[2,15],[5,10],[-7,45],[-2,6],[-13,10],[-20,0],[0,20],[-2,10],[-11,-5],[-14,5],[-4,0],[-4,5],[0,10],[-7,0],[-4,-10],[-3,10],[-2,0],[-11,-25],[-22,-25],[-13,0],[-16,0],[-19,-16],[-3,0],[-4,5],[-7,-10],[-6,0],[-3,5],[-6,-5],[-18,0],[-4,5],[-20,-10],[-15,0],[-5,0],[-17,-10],[-9,-5],[-5,5],[-6,5],[-22,10],[-9,0],[-2,0],[-5,-5],[-6,5],[-5,-15],[-20,-15],[-11,-5],[-2,25],[9,26],[4,25],[-2,30],[27,35],[-3,10],[20,0],[2,5],[16,15],[4,15],[-4,5],[-5,30],[11,5],[7,31],[-9,10],[7,0],[4,5],[5,-5],[9,5],[28,0],[2,0],[5,30],[2,20],[-2,70],[-5,20],[36,5],[6,-5],[13,10],[5,10],[9,46],[6,0],[18,10],[9,-5],[9,0],[2,0],[9,5],[2,0],[15,25],[-2,10],[-7,5],[0,15],[7,10],[-2,10],[0,15],[-18,-5],[-2,10],[4,15],[-8,10],[-5,15],[5,25],[-3,31],[-4,25],[-7,5],[0,5],[7,0],[7,5],[24,20],[2,5],[35,20],[16,0],[6,-15],[20,-10],[2,-10],[18,5],[13,-15],[20,0],[24,-15],[3,-10],[6,-10],[11,5],[27,30],[11,0],[6,-5],[27,5],[9,10],[26,35],[4,-5],[18,-5],[27,-25],[6,-5],[9,-20],[4,-5],[3,-5],[4,0],[15,-5],[5,0],[33,10],[22,15],[11,0],[2,-10],[-24,-20],[0,-10],[-9,-16],[-4,-25],[-16,-50],[2,-20],[0,-5],[0,-10],[-2,-5],[0,-10],[-11,-60],[-6,-15],[22,-6],[26,-15],[9,-20],[22,0],[44,25],[13,-5],[9,-10],[7,-15],[-3,-20],[3,-5],[0,-5],[9,0],[4,-5],[0,-5],[2,-15],[0,-15],[18,20],[35,15],[29,40],[6,0],[14,-10],[8,10],[9,5],[7,15],[20,-5],[28,5],[2,5]]]}"
  },
  {
    "path": "src/test/resources/samples/langs/JSON/terraform.tfstate.backup",
    "content": "{\n\t\t\"version\": 3,\n\t\t\"terraform_version\": \"0.11.2\",\n\t\t\"serial\": 5,\n\t\t\"lineage\": \"5ffde9fb-4814-4609-a8a6-f1054f1779c1\",\n\t\t\"modules\": [\n\t\t\t\t{\n\t\t\t\t\t\t\"path\": [\n\t\t\t\t\t\t\t\t\"root\"\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"outputs\": {},\n\t\t\t\t\t\t\"resources\": {\n\t\t\t\t\t\t\t\t\"aws_iam_role.iam_for_lambda\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_iam_role\",\n\t\t\t\t\t\t\t\t\t\t\"depends_on\": [],\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"iam_for_lambda\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"arn\": \"arn:aws:iam::387412527620:role/iam_for_lambda\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"assume_role_policy\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"Service\\\":\\\"lambda.amazonaws.com\\\"},\\\"Action\\\":\\\"sts:AssumeRole\\\"}]}\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"create_date\": \"2018-01-27T04:05:27Z\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"force_detach_policies\": \"false\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"iam_for_lambda\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"iam_for_lambda\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"path\": \"/\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"unique_id\": \"AROAINXWJF2AIJOZMQXOE\"\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\"meta\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"tainted\": false\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\"deposed\": [],\n\t\t\t\t\t\t\t\t\t\t\"provider\": \"provider.aws\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aws_lambda_function.query-fitbit\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_lambda_function\",\n\t\t\t\t\t\t\t\t\t\t\"depends_on\": [\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_iam_role.iam_for_lambda\"\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"query-fitbit\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"arn\": \"arn:aws:lambda:us-east-1:387412527620:function:query-fitbit\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"dead_letter_config.#\": \"0\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"description\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"environment.#\": \"0\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"filename\": \"../lambda/query-fitbit.zip\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"function_name\": \"query-fitbit\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"handler\": \"exports.handler\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"query-fitbit\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"invoke_arn\": \"arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:387412527620:function:query-fitbit/invocations\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"kms_key_arn\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"last_modified\": \"2018-01-27T04:11:31.185+0000\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"memory_size\": \"128\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"publish\": \"false\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"qualified_arn\": \"arn:aws:lambda:us-east-1:387412527620:function:query-fitbit:$LATEST\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"reserved_concurrent_executions\": \"0\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"role\": \"arn:aws:iam::387412527620:role/iam_for_lambda\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"runtime\": \"nodejs6.10\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"source_code_hash\": \"mNFY3lZD4jFsVq/f353zMD9MLSBvoaEbObIB1KBnxq4=\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"tags.%\": \"0\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"timeout\": \"3\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"tracing_config.#\": \"1\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"tracing_config.0.mode\": \"PassThrough\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"version\": \"$LATEST\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"vpc_config.#\": \"0\"\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\"meta\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"tainted\": false\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\"deposed\": [],\n\t\t\t\t\t\t\t\t\t\t\"provider\": \"provider.aws\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"depends_on\": []\n\t\t\t\t}\n\t\t]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON5/example.json5",
    "content": "/*\n * The following is a contrived example, but it illustrates most of the features:\n */\n\n{\n    foo: 'bar',\n    while: true,\n\n    this: 'is a \\\nmulti-line string',\n\n    // this is an inline comment\n    here: 'is another', // inline comment\n\n    /* this is a block comment\n       that continues on another line */\n\n    hex: 0xDEADbeef,\n    half: .5,\n    delta: +10,\n    to: Infinity,   // and beyond!\n\n    finally: 'a trailing comma',\n    oh: [\n        \"we shouldn't forget\",\n        'arrays can have',\n        'trailing commas too',\n    ],\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON5/filenames/.babelrc",
    "content": "{\n  \"presets\": [\n    \"es2015\",\n    \"es2016\"\n  ]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON5/filenames/.jslintrc",
    "content": "{\n\t\"indent\": 4,\n\t\"maxlen\": 120,\n\t\"browser\": false,\n\t\"couch\": false,\n\t\"devel\": false,\n\t\"node\": false,\n\t\"rhino\": false,\n\t\"white\": true,\n\t\"plusplus\":true,\n\t\"stupid\":true,\n\n\t\"predef\": [\n\t\t\"setTimeout\",\n\t\t\"module\",\n\t\t\"exports\",\n\t\t\"define\",\n\t\t\"require\",\n\t\t\"window\",\n\t\t\"buster\",\n\t\t\"sinon\"\n\t]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSON5/package.json5",
    "content": "// This file is written in JSON5 syntax, naturally, but npm needs a regular\n// JSON file, so compile via `npm run build`. Be sure to keep both in sync!\n\n{\n    name: 'json5',\n    version: '0.2.0',\n    description: 'JSON for the ES5 era.',\n    keywords: ['json', 'es5'],\n    author: 'Aseem Kishore <aseem.kishore@gmail.com>',\n    contributors: [\n        'Max Nanasy <max.nanasy@gmail.com>',\n    ],\n    main: 'lib/json5.js',\n    bin: 'lib/cli.js',\n    dependencies: {},\n    devDependencies: {\n        mocha: '~1.0.3',\n    },\n    scripts: {\n        build: './lib/cli.js -c package.json5',\n        test: 'mocha --ui exports --reporter spec',\n    },\n    homepage: 'http://json5.org/',\n    repository: {\n        type: 'git',\n        url: 'https://github.com/aseemk/json5.git',\n    },\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSONLD/sample.jsonld",
    "content": "{\n  \"@context\": {\n    \"property\": \"http://example.com/vocab#property\"\n  },\n  \"@id\": \"../document-relative\",\n  \"@type\": \"#document-relative\",\n  \"property\": {\n    \"@context\": {\n      \"@base\": \"http://example.org/test/\"\n    },\n    \"@id\": \"../document-base-overwritten\",\n    \"@type\": \"#document-base-overwritten\",\n    \"property\": [\n      {\n        \"@context\": null,\n        \"@id\": \"../document-relative\",\n        \"@type\": \"#document-relative\",\n        \"property\": \"context completely reset, drops property\"\n      },\n      {\n        \"@context\": {\n          \"@base\": null\n        },\n        \"@id\": \"../document-relative\",\n        \"@type\": \"#document-relative\",\n        \"property\": \"only @base is cleared\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSONiq/detail.jq",
    "content": "(: Query for returning one database entry :) \n\nimport module namespace req = \"http://www.28msec.com/modules/http-request\";\nimport module namespace catalog = \"http://guide.com/catalog\";\n\nvariable $id := (req:param-values(\"id\"), \"London\")[1];\nvariable $part := (req:param-values(\"part\"), \"main\")[1];\n\ncatalog:get-data-by-key($id, $part)\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSONiq/query.jq",
    "content": "(: Query for searching the database for keywords :)\n\nimport module namespace index = \"http://guide.com/index\";\nimport module namespace catalog = \"http://guide.com/catalog\";\n\nimport module namespace req = \"http://www.28msec.com/modules/http-request\";\n\nvariable $phrase := (req:param-values(\"q\"), \"London\")[1];\nvariable $limit := integer((req:param-values(\"limit\"), 5)[1]);\n\n[\nfor $result at $idx in index:index-search($phrase)\nwhere $idx le $limit\nlet $data := catalog:get-data-by-id($result.s, $result.p)\nreturn \n    {| { score : $result.r } , $data |}  \n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/JSX/sample.jsx",
    "content": "'use strict';\n\nconst React = require('react')\n\nmodule.exports = React.createClass({\n  render: function() {\n    let {feeds, log} = this.props;\n\n    log.info(feeds);\n    return <div className=\"feed-list\">\n      <h3>News Feed's</h3>\n      <ul>\n        {feeds.map(function(feed) {\n          return <li key={feed.name} className={feed.fetched ? 'loaded' : 'loading'}>\n            {feed.data && feed.data.length > 0 ?\n              <span>{feed.name} <span className='light'>({feed.data.length})</span></span>\n              : 'feed.name' }\n          </li>\n        })}\n      </ul>\n    </div>;\n  }\n});\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jasmin/if1.j",
    "content": ".class public if1\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpeq\t\tIf556261059\n\t\tgoto\t\tIfElse556261059\n\tIf556261059:\n\t.line 3\n\t\t.line 3\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tgoto\t\tIfDone556261059\n\tIfElse556261059:\n\t.line 5\n\t\t.line 5\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x2\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\tIfDone556261059:\n\n\t.line 6\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\tldc\t\t0x3\n\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\n\t.line 7\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpne\t\tIfNot-920218690\n\t.line 8\n\t\t.line 8\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x4\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\tIfNot-920218690:\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jasmin/if2.j",
    "content": ".class public if2\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\t\tldc\t\t0x1\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpeq\tCmp1893841232\n\t\t\tldc\t\t0x0\n\t\t\tgoto\t\tCmpDone1893841232\n\t\tCmp1893841232:\n\t\t\tldc\t\t0x1\n\t\tCmpDone1893841232:\n\t\tldc\t\t0x1\n\t\tif_icmpeq\t\tIf-1736765035\n\t\tgoto\t\tIfElse-1736765035\n\tIf-1736765035:\n\t.line 2\n\t\t.line 3\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tgoto\t\tIfDone-1736765035\n\tIfElse-1736765035:\n\t.line 4\n\t\t.line 4\n\t\t\t\tldc\t\t0x2\n\t\t\t\tldc\t\t0x1\n\t\t\t\tif_icmpeq\tCmp-1460884369\n\t\t\t\tldc\t\t0x0\n\t\t\t\tgoto\t\tCmpDone-1460884369\n\t\t\tCmp-1460884369:\n\t\t\t\tldc\t\t0x1\n\t\t\tCmpDone-1460884369:\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpeq\t\tIf-247349760\n\t\t\tgoto\t\tIfElse-247349760\n\t\tIf-247349760:\n\t\t.line 4\n\t\t\t.line 5\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x2\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\t\tgoto\t\tIfDone-247349760\n\t\tIfElse-247349760:\n\t\t.line 6\n\t\t\t.line 7\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x3\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tIfDone-247349760:\n\tIfDone-1736765035:\n\n\t.line 10\n\t\t\tldc\t\t0x1\n\t\t\tldc\t\t0x2\n\t\t\tif_icmpeq\tCmp933554851\n\t\t\tldc\t\t0x0\n\t\t\tgoto\t\tCmpDone933554851\n\t\tCmp933554851:\n\t\t\tldc\t\t0x1\n\t\tCmpDone933554851:\n\t\tldc\t\t0x1\n\t\tif_icmpeq\t\tIf1623625546\n\t\tgoto\t\tIfElse1623625546\n\tIf1623625546:\n\t.line 10\n\t\t.line 11\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tgoto\t\tIfDone1623625546\n\tIfElse1623625546:\n\t.line 12\n\t\t.line 12\n\t\t\t\tldc\t\t0x2\n\t\t\t\tldc\t\t0x2\n\t\t\t\tif_icmpeq\tCmp1572138409\n\t\t\t\tldc\t\t0x0\n\t\t\t\tgoto\t\tCmpDone1572138409\n\t\t\tCmp1572138409:\n\t\t\t\tldc\t\t0x1\n\t\t\tCmpDone1572138409:\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpeq\t\tIf126354425\n\t\t\tgoto\t\tIfElse126354425\n\t\tIf126354425:\n\t\t.line 12\n\t\t\t.line 13\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x2\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\t\tgoto\t\tIfDone126354425\n\t\tIfElse126354425:\n\t\t.line 14\n\t\t\t.line 15\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x3\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tIfDone126354425:\n\tIfDone1623625546:\n\n\t.line 18\n\t\t\tldc\t\t0x1\n\t\t\tldc\t\t0x2\n\t\t\tif_icmpeq\tCmp126493150\n\t\t\tldc\t\t0x0\n\t\t\tgoto\t\tCmpDone126493150\n\t\tCmp126493150:\n\t\t\tldc\t\t0x1\n\t\tCmpDone126493150:\n\t\tldc\t\t0x1\n\t\tif_icmpeq\t\tIf1522284422\n\t\tgoto\t\tIfElse1522284422\n\tIf1522284422:\n\t.line 18\n\t\t.line 19\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tgoto\t\tIfDone1522284422\n\tIfElse1522284422:\n\t.line 20\n\t\t.line 20\n\t\t\t\tldc\t\t0x2\n\t\t\t\tldc\t\t0x1\n\t\t\t\tif_icmpeq\tCmp-906666545\n\t\t\t\tldc\t\t0x0\n\t\t\t\tgoto\t\tCmpDone-906666545\n\t\t\tCmp-906666545:\n\t\t\t\tldc\t\t0x1\n\t\t\tCmpDone-906666545:\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpeq\t\tIf1083939031\n\t\t\tgoto\t\tIfElse1083939031\n\t\tIf1083939031:\n\t\t.line 20\n\t\t\t.line 21\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x2\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\t\tgoto\t\tIfDone1083939031\n\t\tIfElse1083939031:\n\t\t.line 22\n\t\t\t.line 23\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x3\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tIfDone1083939031:\n\tIfDone1522284422:\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jasmin/if3.j",
    "content": ".class public if3\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpeq\t\tIf-811796083\n\t\tgoto\t\tIfElse-811796083\n\tIf-811796083:\n\t.line 3\n\t\t.line 3\n\t\t\tldc\t\t0x0\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpeq\t\tIf-1001319390\n\t\t\tgoto\t\tIfElse-1001319390\n\t\tIf-1001319390:\n\t\t.line 4\n\t\t\t.line 4\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x1\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\t\tgoto\t\tIfDone-1001319390\n\t\tIfElse-1001319390:\n\t\t.line 6\n\t\t\t.line 6\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x2\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tIfDone-1001319390:\n\t\tgoto\t\tIfDone-811796083\n\tIfElse-811796083:\n\t.line 8\n\t\t.line 8\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x3\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\tIfDone-811796083:\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jasmin/if4.j",
    "content": ".class public if4\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpne\t\tIfNot1919266740\n\t.line 2\n\t\t.line 2\n\t\t\tldc\t\t0x1\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpne\t\tIfNot613368541\n\t\t.line 2\n\t\t\t.line 2\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x1\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tIfNot613368541:\n\tIfNot1919266740:\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jasmin/op1.j",
    "content": ".class public op1\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n    .line 2\n        getstatic java/lang/System/out Ljava/io/PrintStream;\n        ldc 0x1\n        ldc 0x1\n        iadd\n        invokevirtual java/io/PrintStream/println(I)V\n\n    .line 3\n        getstatic java/lang/System/out Ljava/io/PrintStream;\n        ldc 0xa\n        ldc 0x5\n        isub\n        invokevirtual java/io/PrintStream/println(I)V\n\n    .line 4\n        getstatic java/lang/System/out Ljava/io/PrintStream;\n        ldc 0x15\n        ldc 0x3\n        idiv\n        invokevirtual java/io/PrintStream/println(I)V\n\n    .line 5\n        getstatic java/lang/System/out Ljava/io/PrintStream;\n        ldc 0x159\n        ldc 0x38\n        imul\n        invokevirtual java/io/PrintStream/println(I)V\n\n    .line 6\n        getstatic java/lang/System/out Ljava/io/PrintStream;\n        ldc 0x52\n        ldc 0x9\n        irem\n        invokevirtual java/io/PrintStream/println(I)V\n\nEndGlobal:\nreturn\n.end method"
  },
  {
    "path": "src/test/resources/samples/langs/Jasmin/op2.j",
    "content": ".class public op2\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x0\n\t\tiand\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 3\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x0\n\t\tior\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jasmin/op3.j",
    "content": ".class public op3\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x0\n\t\tldc\t\t0x1\n\t\tif_icmpeq\tCmp-1307183590\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-1307183590\n\tCmp-1307183590:\n\t\tldc\t\t0x1\n\tCmpDone-1307183590:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 3\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x0\n\t\tldc\t\t0x0\n\t\tif_icmpeq\tCmp-1443270821\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-1443270821\n\tCmp-1443270821:\n\t\tldc\t\t0x1\n\tCmpDone-1443270821:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 4\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpeq\tCmp1759327329\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone1759327329\n\tCmp1759327329:\n\t\tldc\t\t0x1\n\tCmpDone1759327329:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 5\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x0\n\t\tif_icmpeq\tCmp-678570146\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-678570146\n\tCmp-678570146:\n\t\tldc\t\t0x1\n\tCmpDone-678570146:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jasmin/op4.j",
    "content": ".class public op4\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x0\n\t\tldc\t\t0x1\n\t\tif_icmpne\tCmp-191731100\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-191731100\n\tCmp-191731100:\n\t\tldc\t\t0x1\n\tCmpDone-191731100:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 3\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x0\n\t\tldc\t\t0x0\n\t\tif_icmpne\tCmp-901585603\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-901585603\n\tCmp-901585603:\n\t\tldc\t\t0x1\n\tCmpDone-901585603:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 4\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpne\tCmp1522577937\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone1522577937\n\tCmp1522577937:\n\t\tldc\t\t0x1\n\tCmpDone1522577937:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 5\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x0\n\t\tif_icmpne\tCmp-1653028684\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-1653028684\n\tCmp-1653028684:\n\t\tldc\t\t0x1\n\tCmpDone-1653028684:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Java/GrammarKit.java",
    "content": "// This is a generated file. Not intended for manual editing.\npackage org.intellij.grammar.parser;\n\nimport com.intellij.lang.PsiBuilder;\nimport com.intellij.lang.PsiBuilder.Marker;\nimport static org.intellij.grammar.psi.BnfTypes.*;\nimport static org.intellij.grammar.parser.GeneratedParserUtilBase.*;\nimport com.intellij.psi.tree.IElementType;\nimport com.intellij.lang.ASTNode;\nimport com.intellij.psi.tree.TokenSet;\nimport com.intellij.lang.PsiParser;\nimport com.intellij.lang.LightPsiParser;\n\n@SuppressWarnings({\"SimplifiableIfStatement\", \"UnusedAssignment\"})\npublic class GrammarParser implements PsiParser, LightPsiParser {\n\n  public ASTNode parse(IElementType t, PsiBuilder b) {\n    parseLight(t, b);\n    return b.getTreeBuilt();\n  }\n\n  public void parseLight(IElementType t, PsiBuilder b) {\n    boolean r;\n    b = adapt_builder_(t, b, this, EXTENDS_SETS_);\n    Marker m = enter_section_(b, 0, _COLLAPSE_, null);\n    if (t == BNF_ATTR) {\n      r = attr(b, 0);\n    }\n    else if (t == BNF_ATTR_PATTERN) {\n      r = attr_pattern(b, 0);\n    }\n    else if (t == BNF_ATTR_VALUE) {\n      r = attr_value(b, 0);\n    }\n    else if (t == BNF_ATTRS) {\n      r = attrs(b, 0);\n    }\n    else if (t == BNF_CHOICE) {\n      r = choice(b, 0);\n    }\n    else if (t == BNF_EXPRESSION) {\n      r = expression(b, 0);\n    }\n    else if (t == BNF_LITERAL_EXPRESSION) {\n      r = literal_expression(b, 0);\n    }\n    else if (t == BNF_MODIFIER) {\n      r = modifier(b, 0);\n    }\n    else if (t == BNF_PAREN_EXPRESSION) {\n      r = paren_expression(b, 0);\n    }\n    else if (t == BNF_PREDICATE) {\n      r = predicate(b, 0);\n    }\n    else if (t == BNF_PREDICATE_SIGN) {\n      r = predicate_sign(b, 0);\n    }\n    else if (t == BNF_QUANTIFIED) {\n      r = quantified(b, 0);\n    }\n    else if (t == BNF_QUANTIFIER) {\n      r = quantifier(b, 0);\n    }\n    else if (t == BNF_REFERENCE_OR_TOKEN) {\n      r = reference_or_token(b, 0);\n    }\n    else if (t == BNF_RULE) {\n      r = rule(b, 0);\n    }\n    else if (t == BNF_SEQUENCE) {\n      r = sequence(b, 0);\n    }\n    else if (t == BNF_STRING_LITERAL_EXPRESSION) {\n      r = string_literal_expression(b, 0);\n    }\n    else {\n      r = parse_root_(t, b, 0);\n    }\n    exit_section_(b, 0, m, t, r, true, TRUE_CONDITION);\n  }\n\n  protected boolean parse_root_(IElementType t, PsiBuilder b, int l) {\n    return grammar(b, l + 1);\n  }\n\n  public static final TokenSet[] EXTENDS_SETS_ = new TokenSet[] {\n    create_token_set_(BNF_LITERAL_EXPRESSION, BNF_STRING_LITERAL_EXPRESSION),\n    create_token_set_(BNF_CHOICE, BNF_EXPRESSION, BNF_LITERAL_EXPRESSION, BNF_PAREN_EXPRESSION,\n      BNF_PREDICATE, BNF_QUANTIFIED, BNF_REFERENCE_OR_TOKEN, BNF_SEQUENCE,\n      BNF_STRING_LITERAL_EXPRESSION),\n  };\n\n  /* ********************************************************** */\n  // id attr_pattern? '=' attr_value ';'?\n  public static boolean attr(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr\")) return false;\n    boolean r, p;\n    Marker m = enter_section_(b, l, _NONE_, \"<attr>\");\n    r = consumeToken(b, BNF_ID);\n    p = r; // pin = 1\n    r = r && report_error_(b, attr_1(b, l + 1));\n    r = p && report_error_(b, consumeToken(b, BNF_OP_EQ)) && r;\n    r = p && report_error_(b, attr_value(b, l + 1)) && r;\n    r = p && attr_4(b, l + 1) && r;\n    exit_section_(b, l, m, BNF_ATTR, r, p, attr_recover_until_parser_);\n    return r || p;\n  }\n\n  // attr_pattern?\n  private static boolean attr_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_1\")) return false;\n    attr_pattern(b, l + 1);\n    return true;\n  }\n\n  // ';'?\n  private static boolean attr_4(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_4\")) return false;\n    consumeToken(b, BNF_SEMICOLON);\n    return true;\n  }\n\n  /* ********************************************************** */\n  // '(' string ')'\n  public static boolean attr_pattern(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_pattern\")) return false;\n    if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_LEFT_PAREN);\n    r = r && consumeToken(b, BNF_STRING);\n    r = r && consumeToken(b, BNF_RIGHT_PAREN);\n    exit_section_(b, m, BNF_ATTR_PATTERN, r);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // !'}'\n  static boolean attr_recover_until(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_recover_until\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NOT_, null);\n    r = !consumeToken(b, BNF_RIGHT_BRACE);\n    exit_section_(b, l, m, null, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // (reference_or_token | literal_expression) !'='\n  public static boolean attr_value(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_value\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NONE_, \"<attr value>\");\n    r = attr_value_0(b, l + 1);\n    r = r && attr_value_1(b, l + 1);\n    exit_section_(b, l, m, BNF_ATTR_VALUE, r, false, null);\n    return r;\n  }\n\n  // reference_or_token | literal_expression\n  private static boolean attr_value_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_value_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = reference_or_token(b, l + 1);\n    if (!r) r = literal_expression(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // !'='\n  private static boolean attr_value_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_value_1\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NOT_, null);\n    r = !consumeToken(b, BNF_OP_EQ);\n    exit_section_(b, l, m, null, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // '{' attr* '}'\n  public static boolean attrs(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attrs\")) return false;\n    if (!nextTokenIs(b, BNF_LEFT_BRACE)) return false;\n    boolean r, p;\n    Marker m = enter_section_(b, l, _NONE_, null);\n    r = consumeToken(b, BNF_LEFT_BRACE);\n    p = r; // pin = 1\n    r = r && report_error_(b, attrs_1(b, l + 1));\n    r = p && consumeToken(b, BNF_RIGHT_BRACE) && r;\n    exit_section_(b, l, m, BNF_ATTRS, r, p, null);\n    return r || p;\n  }\n\n  // attr*\n  private static boolean attrs_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attrs_1\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!attr(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"attrs_1\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  /* ********************************************************** */\n  // '{' sequence ('|' sequence)* '}' | sequence choice_tail*\n  public static boolean choice(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _COLLAPSE_, \"<choice>\");\n    r = choice_0(b, l + 1);\n    if (!r) r = choice_1(b, l + 1);\n    exit_section_(b, l, m, BNF_CHOICE, r, false, null);\n    return r;\n  }\n\n  // '{' sequence ('|' sequence)* '}'\n  private static boolean choice_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_LEFT_BRACE);\n    r = r && sequence(b, l + 1);\n    r = r && choice_0_2(b, l + 1);\n    r = r && consumeToken(b, BNF_RIGHT_BRACE);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // ('|' sequence)*\n  private static boolean choice_0_2(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_0_2\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!choice_0_2_0(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"choice_0_2\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  // '|' sequence\n  private static boolean choice_0_2_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_0_2_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_OP_OR);\n    r = r && sequence(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // sequence choice_tail*\n  private static boolean choice_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_1\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = sequence(b, l + 1);\n    r = r && choice_1_1(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // choice_tail*\n  private static boolean choice_1_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_1_1\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!choice_tail(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"choice_1_1\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  /* ********************************************************** */\n  // '|' sequence\n  static boolean choice_tail(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_tail\")) return false;\n    if (!nextTokenIs(b, BNF_OP_OR)) return false;\n    boolean r, p;\n    Marker m = enter_section_(b, l, _NONE_, null);\n    r = consumeToken(b, BNF_OP_OR);\n    p = r; // pin = 1\n    r = r && sequence(b, l + 1);\n    exit_section_(b, l, m, null, r, p, null);\n    return r || p;\n  }\n\n  /* ********************************************************** */\n  // choice?\n  public static boolean expression(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"expression\")) return false;\n    Marker m = enter_section_(b, l, _COLLAPSE_, \"<expression>\");\n    choice(b, l + 1);\n    exit_section_(b, l, m, BNF_EXPRESSION, true, false, null);\n    return true;\n  }\n\n  /* ********************************************************** */\n  // (attrs | rule) *\n  static boolean grammar(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"grammar\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!grammar_0(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"grammar\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  // attrs | rule\n  private static boolean grammar_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"grammar_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = attrs(b, l + 1);\n    if (!r) r = rule(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // string_literal_expression | number\n  public static boolean literal_expression(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"literal_expression\")) return false;\n    if (!nextTokenIs(b, \"<literal expression>\", BNF_NUMBER, BNF_STRING)) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _COLLAPSE_, \"<literal expression>\");\n    r = string_literal_expression(b, l + 1);\n    if (!r) r = consumeToken(b, BNF_NUMBER);\n    exit_section_(b, l, m, BNF_LITERAL_EXPRESSION, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // 'private' | 'external' | 'wrapped'\n  public static boolean modifier(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"modifier\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NONE_, \"<modifier>\");\n    r = consumeToken(b, \"private\");\n    if (!r) r = consumeToken(b, \"external\");\n    if (!r) r = consumeToken(b, \"wrapped\");\n    exit_section_(b, l, m, BNF_MODIFIER, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // quantified | predicate\n  static boolean option(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"option\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = quantified(b, l + 1);\n    if (!r) r = predicate(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // '(' expression ')'\n  public static boolean paren_expression(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"paren_expression\")) return false;\n    if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false;\n    boolean r, p;\n    Marker m = enter_section_(b, l, _NONE_, null);\n    r = consumeToken(b, BNF_LEFT_PAREN);\n    p = r; // pin = 1\n    r = r && report_error_(b, expression(b, l + 1));\n    r = p && consumeToken(b, BNF_RIGHT_PAREN) && r;\n    exit_section_(b, l, m, BNF_PAREN_EXPRESSION, r, p, null);\n    return r || p;\n  }\n\n  /* ********************************************************** */\n  // predicate_sign  simple\n  public static boolean predicate(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"predicate\")) return false;\n    if (!nextTokenIs(b, \"<predicate>\", BNF_OP_NOT, BNF_OP_AND)) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NONE_, \"<predicate>\");\n    r = predicate_sign(b, l + 1);\n    r = r && simple(b, l + 1);\n    exit_section_(b, l, m, BNF_PREDICATE, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // '&' | '!'\n  public static boolean predicate_sign(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"predicate_sign\")) return false;\n    if (!nextTokenIs(b, \"<predicate sign>\", BNF_OP_NOT, BNF_OP_AND)) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NONE_, \"<predicate sign>\");\n    r = consumeToken(b, BNF_OP_AND);\n    if (!r) r = consumeToken(b, BNF_OP_NOT);\n    exit_section_(b, l, m, BNF_PREDICATE_SIGN, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // '[' expression ']' | simple quantifier?\n  public static boolean quantified(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"quantified\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _COLLAPSE_, \"<quantified>\");\n    r = quantified_0(b, l + 1);\n    if (!r) r = quantified_1(b, l + 1);\n    exit_section_(b, l, m, BNF_QUANTIFIED, r, false, null);\n    return r;\n  }\n\n  // '[' expression ']'\n  private static boolean quantified_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"quantified_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_LEFT_BRACKET);\n    r = r && expression(b, l + 1);\n    r = r && consumeToken(b, BNF_RIGHT_BRACKET);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // simple quantifier?\n  private static boolean quantified_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"quantified_1\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = simple(b, l + 1);\n    r = r && quantified_1_1(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // quantifier?\n  private static boolean quantified_1_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"quantified_1_1\")) return false;\n    quantifier(b, l + 1);\n    return true;\n  }\n\n  /* ********************************************************** */\n  // '?' | '+' | '*'\n  public static boolean quantifier(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"quantifier\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NONE_, \"<quantifier>\");\n    r = consumeToken(b, BNF_OP_OPT);\n    if (!r) r = consumeToken(b, BNF_OP_ONEMORE);\n    if (!r) r = consumeToken(b, BNF_OP_ZEROMORE);\n    exit_section_(b, l, m, BNF_QUANTIFIER, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // id\n  public static boolean reference_or_token(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"reference_or_token\")) return false;\n    if (!nextTokenIs(b, BNF_ID)) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_ID);\n    exit_section_(b, m, BNF_REFERENCE_OR_TOKEN, r);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // modifier* id '::=' expression attrs? ';'?\n  public static boolean rule(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"rule\")) return false;\n    boolean r, p;\n    Marker m = enter_section_(b, l, _NONE_, \"<rule>\");\n    r = rule_0(b, l + 1);\n    r = r && consumeToken(b, BNF_ID);\n    r = r && consumeToken(b, BNF_OP_IS);\n    p = r; // pin = 3\n    r = r && report_error_(b, expression(b, l + 1));\n    r = p && report_error_(b, rule_4(b, l + 1)) && r;\n    r = p && rule_5(b, l + 1) && r;\n    exit_section_(b, l, m, BNF_RULE, r, p, rule_recover_until_parser_);\n    return r || p;\n  }\n\n  // modifier*\n  private static boolean rule_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"rule_0\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!modifier(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"rule_0\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  // attrs?\n  private static boolean rule_4(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"rule_4\")) return false;\n    attrs(b, l + 1);\n    return true;\n  }\n\n  // ';'?\n  private static boolean rule_5(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"rule_5\")) return false;\n    consumeToken(b, BNF_SEMICOLON);\n    return true;\n  }\n\n  /* ********************************************************** */\n  // !'{'\n  static boolean rule_recover_until(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"rule_recover_until\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NOT_, null);\n    r = !consumeToken(b, BNF_LEFT_BRACE);\n    exit_section_(b, l, m, null, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // option +\n  public static boolean sequence(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"sequence\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _COLLAPSE_, \"<sequence>\");\n    r = option(b, l + 1);\n    int c = current_position_(b);\n    while (r) {\n      if (!option(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"sequence\", c)) break;\n      c = current_position_(b);\n    }\n    exit_section_(b, l, m, BNF_SEQUENCE, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // !(modifier* id '::=' ) reference_or_token | literal_expression | paren_expression\n  static boolean simple(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"simple\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = simple_0(b, l + 1);\n    if (!r) r = literal_expression(b, l + 1);\n    if (!r) r = paren_expression(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // !(modifier* id '::=' ) reference_or_token\n  private static boolean simple_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"simple_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = simple_0_0(b, l + 1);\n    r = r && reference_or_token(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // !(modifier* id '::=' )\n  private static boolean simple_0_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"simple_0_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NOT_, null);\n    r = !simple_0_0_0(b, l + 1);\n    exit_section_(b, l, m, null, r, false, null);\n    return r;\n  }\n\n  // modifier* id '::='\n  private static boolean simple_0_0_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"simple_0_0_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = simple_0_0_0_0(b, l + 1);\n    r = r && consumeToken(b, BNF_ID);\n    r = r && consumeToken(b, BNF_OP_IS);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // modifier*\n  private static boolean simple_0_0_0_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"simple_0_0_0_0\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!modifier(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"simple_0_0_0_0\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  /* ********************************************************** */\n  // string\n  public static boolean string_literal_expression(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"string_literal_expression\")) return false;\n    if (!nextTokenIs(b, BNF_STRING)) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_STRING);\n    exit_section_(b, m, BNF_STRING_LITERAL_EXPRESSION, r);\n    return r;\n  }\n\n  final static Parser attr_recover_until_parser_ = new Parser() {\n    public boolean parse(PsiBuilder b, int l) {\n      return attr_recover_until(b, l + 1);\n    }\n  };\n  final static Parser rule_recover_until_parser_ = new Parser() {\n    public boolean parse(PsiBuilder b, int l) {\n      return rule_recover_until(b, l + 1);\n    }\n  };\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Java/HtmlDomParserContext.java",
    "content": "/**\n * (The MIT License)\n *\n * Copyright (c) 2008 - 2012:\n *\n * * {Aaron Patterson}[http://tenderlovemaking.com]\n * * {Mike Dalessio}[http://mike.daless.io]\n * * {Charles Nutter}[http://blog.headius.com]\n * * {Sergio Arbeo}[http://www.serabe.com]\n * * {Patrick Mahoney}[http://polycrystal.org]\n * * {Yoko Harada}[http://yokolet.blogspot.com]\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\npackage nokogiri.internals;\n\nimport static nokogiri.internals.NokogiriHelpers.getNokogiriClass;\nimport static nokogiri.internals.NokogiriHelpers.isNamespace;\nimport static nokogiri.internals.NokogiriHelpers.stringOrNil;\nimport nokogiri.HtmlDocument;\nimport nokogiri.NokogiriService;\nimport nokogiri.XmlDocument;\n\nimport org.apache.xerces.parsers.DOMParser;\nimport org.apache.xerces.xni.Augmentations;\nimport org.apache.xerces.xni.QName;\nimport org.apache.xerces.xni.XMLAttributes;\nimport org.apache.xerces.xni.XNIException;\nimport org.apache.xerces.xni.parser.XMLDocumentFilter;\nimport org.apache.xerces.xni.parser.XMLParserConfiguration;\nimport org.cyberneko.html.HTMLConfiguration;\nimport org.cyberneko.html.filters.DefaultFilter;\nimport org.jruby.Ruby;\nimport org.jruby.RubyClass;\nimport org.jruby.runtime.ThreadContext;\nimport org.jruby.runtime.builtin.IRubyObject;\nimport org.w3c.dom.Document;\nimport org.w3c.dom.NamedNodeMap;\nimport org.w3c.dom.NodeList;\n\n/**\n * Parser for HtmlDocument. This class actually parses HtmlDocument using NekoHtml.\n * \n * @author sergio\n * @author Patrick Mahoney <pat@polycrystal.org>\n * @author Yoko Harada <yokolet@gmail.com>\n */\npublic class HtmlDomParserContext extends XmlDomParserContext {\n\n    public HtmlDomParserContext(Ruby runtime, IRubyObject options) {\n        super(runtime, options);\n    }\n    \n    public HtmlDomParserContext(Ruby runtime, IRubyObject encoding, IRubyObject options) {\n        super(runtime, encoding, options);\n    }\n\n    @Override\n    protected void initErrorHandler() {\n        if (options.strict) {\n            errorHandler = new NokogiriStrictErrorHandler(options.noError, options.noWarning);\n        } else {\n            errorHandler = new NokogiriNonStrictErrorHandler4NekoHtml(options.noError, options.noWarning);\n        }\n    }\n\n    @Override\n    protected void initParser(Ruby runtime) {\n        XMLParserConfiguration config = new HTMLConfiguration();\n        XMLDocumentFilter removeNSAttrsFilter = new RemoveNSAttrsFilter();\n        XMLDocumentFilter elementValidityCheckFilter = new ElementValidityCheckFilter(errorHandler);\n        //XMLDocumentFilter[] filters = { removeNSAttrsFilter,  elementValidityCheckFilter};\n        XMLDocumentFilter[] filters = { elementValidityCheckFilter};\n\n        config.setErrorHandler(this.errorHandler);\n        parser = new DOMParser(config);\n\n        // see http://nekohtml.sourceforge.net/settings.html for details\n        setProperty(\"http://cyberneko.org/html/properties/default-encoding\", java_encoding);\n        setProperty(\"http://cyberneko.org/html/properties/names/elems\", \"lower\");\n        setProperty(\"http://cyberneko.org/html/properties/names/attrs\", \"lower\");\n        setProperty(\"http://cyberneko.org/html/properties/filters\", filters);\n        setFeature(\"http://cyberneko.org/html/features/report-errors\", true);\n        setFeature(\"http://xml.org/sax/features/namespaces\", false);\n        setFeature(\"http://cyberneko.org/html/features/insert-doctype\", true);\n    }\n\n    /**\n     * Enable NekoHTML feature for balancing tags in a document fragment.\n     * \n     * This method is used in XmlNode#in_context method.\n     */\n    public void enableDocumentFragment() {\n        setFeature(\"http://cyberneko.org/html/features/balance-tags/document-fragment\", true);\n    }\n\n    @Override\n    protected XmlDocument getNewEmptyDocument(ThreadContext context) {\n        IRubyObject[] args = new IRubyObject[0];\n        return (XmlDocument) XmlDocument.rbNew(context, getNokogiriClass(context.getRuntime(), \"Nokogiri::HTML::Document\"), args);\n    }\n\n    @Override\n    protected XmlDocument wrapDocument(ThreadContext context,\n                                       RubyClass klazz,\n                                       Document document) {\n        HtmlDocument htmlDocument = (HtmlDocument) NokogiriService.HTML_DOCUMENT_ALLOCATOR.allocate(context.getRuntime(), klazz);\n        htmlDocument.setDocumentNode(context, document);\n        if (ruby_encoding.isNil()) {\n            // ruby_encoding might have detected by HtmlDocument::EncodingReader\n            if (detected_encoding != null && !detected_encoding.isNil()) {\n                ruby_encoding = detected_encoding;\n            } else {\n                // no encoding given & no encoding detected, then try to get it\n                String charset = tryGetCharsetFromHtml5MetaTag(document);\n                ruby_encoding = stringOrNil(context.getRuntime(), charset);\n            }\n        }\n        htmlDocument.setEncoding(ruby_encoding);\n        htmlDocument.setParsedEncoding(java_encoding);\n        return htmlDocument;\n    }\n    \n    // NekoHtml doesn't understand HTML5 meta tag format. This fails to detect charset\n    // from an HTML5 style meta tag. Luckily, the meta tag and charset exists in DOM tree\n    // so, this method attempts to find the charset.\n    private String tryGetCharsetFromHtml5MetaTag(Document document) {\n        if (!\"html\".equalsIgnoreCase(document.getDocumentElement().getNodeName())) return null;\n        NodeList list = document.getDocumentElement().getChildNodes();\n        for (int i = 0; i < list.getLength(); i++) {\n            if (\"head\".equalsIgnoreCase(list.item(i).getNodeName())) {\n                NodeList headers = list.item(i).getChildNodes();\n                for (int j = 0; j < headers.getLength(); j++) {\n                    if (\"meta\".equalsIgnoreCase(headers.item(j).getNodeName())) {\n                        NamedNodeMap nodeMap = headers.item(j).getAttributes();\n                        for (int k = 0; k < nodeMap.getLength(); k++) {\n                            if (\"charset\".equalsIgnoreCase(nodeMap.item(k).getNodeName())) {\n                                return nodeMap.item(k).getNodeValue();\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        return null;\n    }\n\n    /**\n     * Filter to strip out attributes that pertain to XML namespaces.\n     */\n    public static class RemoveNSAttrsFilter extends DefaultFilter {\n        @Override\n        public void startElement(QName element, XMLAttributes attrs,\n                                 Augmentations augs) throws XNIException {\n            int i;\n            for (i = 0; i < attrs.getLength(); ++i) {\n                if (isNamespace(attrs.getQName(i))) {\n                    attrs.removeAttributeAt(i);\n                    --i;\n                }\n            }\n\n            element.uri = null;\n            super.startElement(element, attrs, augs);\n        }\n    }\n    \n    public static class ElementValidityCheckFilter extends DefaultFilter {\n        private NokogiriErrorHandler errorHandler;\n        \n        private ElementValidityCheckFilter(NokogiriErrorHandler errorHandler) {\n            this.errorHandler = errorHandler;\n        }\n        \n        // element names from xhtml1-strict.dtd\n        private static String[][] element_names = {\n                {\"a\", \"abbr\", \"acronym\", \"address\", \"area\"},\n                {\"b\", \"base\", \"basefont\", \"bdo\", \"big\", \"blockquote\", \"body\", \"br\", \"button\"},\n                {\"caption\", \"cite\", \"code\", \"col\", \"colgroup\"},\n                {\"dd\", \"del\", \"dfn\", \"div\", \"dl\", \"dt\"},\n                {\"em\"},\n                {\"fieldset\", \"font\", \"form\", \"frame\", \"frameset\"},\n                {}, // g\n                {\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"hr\", \"html\"},\n                {\"i\", \"iframe\", \"img\", \"input\", \"ins\"},\n                {}, // j\n                {\"kbd\"},\n                {\"label\", \"legend\", \"li\", \"link\"},\n                {\"map\", \"meta\"},\n                {\"noframes\", \"noscript\"},\n                {\"object\", \"ol\", \"optgroup\", \"option\"},\n                {\"p\", \"param\", \"pre\"},\n                {\"q\"},\n                {}, // r\n                {\"s\", \"samp\", \"script\", \"select\", \"small\", \"span\", \"strike\", \"strong\", \"style\", \"sub\", \"sup\"},\n                {\"table\", \"tbody\", \"td\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"title\", \"tr\", \"tt\"},\n                {\"u\", \"ul\"},\n                {\"var\"},\n                {}, // w\n                {}, // x\n                {}, // y\n                {}  // z\n        };\n        \n        private boolean isValid(String testee) {\n            char[] c = testee.toCharArray();\n            int index = new Integer(c[0]) - 97;\n            if (index > 25) return false;\n            for (int i=0; i<element_names[index].length; i++) {\n                if (testee.equals(element_names[index][i])) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        \n        @Override\n        public void startElement(QName name, XMLAttributes attrs, Augmentations augs) throws XNIException {\n            if (!isValid(name.rawname)) {\n                errorHandler.getErrors().add(new Exception(\"Tag \" + name.rawname + \" invalid\"));\n            }\n            super.startElement(name, attrs, augs);\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Java/Hudson.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi,\n * Erik Ramfelt, Koichi Fujikawa, Red Hat, Inc., Seiji Sogabe,\n * Stephen Connolly, Tom Huybrechts, Yahoo! Inc., Alan Harder, CloudBees, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage hudson.model;\n\nimport hudson.ExtensionListView;\nimport hudson.Functions;\nimport hudson.Platform;\nimport hudson.PluginManager;\nimport hudson.cli.declarative.CLIResolver;\nimport hudson.model.listeners.ItemListener;\nimport hudson.slaves.ComputerListener;\nimport hudson.util.CopyOnWriteList;\nimport hudson.util.FormValidation;\nimport jenkins.model.Jenkins;\nimport org.jvnet.hudson.reactor.ReactorException;\nimport org.kohsuke.stapler.QueryParameter;\nimport org.kohsuke.stapler.Stapler;\nimport org.kohsuke.stapler.StaplerRequest;\nimport org.kohsuke.stapler.StaplerResponse;\n\nimport javax.servlet.ServletContext;\nimport javax.servlet.ServletException;\nimport java.io.File;\nimport java.io.IOException;\nimport java.text.NumberFormat;\nimport java.text.ParseException;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\n\nimport static hudson.Util.fixEmpty;\n\npublic class Hudson extends Jenkins {\n\n    /**\n     * List of registered {@link hudson.model.listeners.ItemListener}s.\n     * @deprecated as of 1.286\n     */\n    private transient final CopyOnWriteList<ItemListener> itemListeners = ExtensionListView.createCopyOnWriteList(ItemListener.class);\n\n    /**\n    * List of registered {@link hudson.slaves.ComputerListener}s.\n     * @deprecated as of 1.286\n     */\n    private transient final CopyOnWriteList<ComputerListener> computerListeners = ExtensionListView.createCopyOnWriteList(ComputerListener.class);\n\n\n    @CLIResolver\n    public static Hudson getInstance() {\n        return (Hudson)Jenkins.getInstance();\n    }\n\n    public Hudson(File root, ServletContext context) throws IOException, InterruptedException, ReactorException {\n        this(root,context,null);\n    }\n\n    public Hudson(File root, ServletContext context, PluginManager pluginManager) throws IOException, InterruptedException, ReactorException {\n        super(root, context, pluginManager);\n    }\n\n    /**\n     * Gets all the installed {@link ItemListener}s.\n     *\n     * @deprecated as of 1.286.\n     *      Use {@link ItemListener#all()}.\n     */\n    public CopyOnWriteList<ItemListener> getJobListeners() {\n        return itemListeners;\n    }\n\n    /**\n     * Gets all the installed {@link ComputerListener}s.\n     *\n     * @deprecated as of 1.286.\n     *      Use {@link ComputerListener#all()}.\n     */\n    public CopyOnWriteList<ComputerListener> getComputerListeners() {\n        return computerListeners;\n    }\n\n    /**\n     * Gets the slave node of the give name, hooked under this Hudson.\n     *\n     * @deprecated\n     *      Use {@link #getNode(String)}. Since 1.252.\n     */\n    public Slave getSlave(String name) {\n        Node n = getNode(name);\n        if (n instanceof Slave)\n            return (Slave)n;\n        return null;\n    }\n\n    /**\n     * @deprecated\n     *      Use {@link #getNodes()}. Since 1.252.\n     */\n    public List<Slave> getSlaves() {\n        return (List)slaves;\n    }\n\n    /**\n     * Updates the slave list.\n     *\n     * @deprecated\n     *      Use {@link #setNodes(List)}. Since 1.252.\n     */\n    public void setSlaves(List<Slave> slaves) throws IOException {\n        setNodes(slaves);\n    }\n\n    /**\n     * @deprecated\n     *      Left only for the compatibility of URLs.\n     *      Should not be invoked for any other purpose.\n     */\n    public TopLevelItem getJob(String name) {\n        return getItem(name);\n    }\n\n    /**\n     * @deprecated\n     *      Used only for mapping jobs to URL in a case-insensitive fashion.\n     */\n    public TopLevelItem getJobCaseInsensitive(String name) {\n        String match = Functions.toEmailSafeString(name);\n        for(TopLevelItem item : getItems()) {\n            if(Functions.toEmailSafeString(item.getName()).equalsIgnoreCase(match)) {\n        return item;\n    }\n                }\n        return null;\n    }\n\n    /**\n     * @deprecated as of 1.317\n     *      Use {@link #doQuietDown()} instead.\n     */\n    public synchronized void doQuietDown(StaplerResponse rsp) throws IOException, ServletException {\n        doQuietDown().generateResponse(null, rsp, this);\n    }\n\n    /**\n     * RSS feed for log entries.\n     *\n     * @deprecated\n     *   As on 1.267, moved to \"/log/rss...\"\n     */\n    public void doLogRss( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException {\n        String qs = req.getQueryString();\n        rsp.sendRedirect2(\"./log/rss\"+(qs==null?\"\":'?'+qs));\n    }\n\n    /**\n     * @deprecated as of 1.294\n     *      Define your own check method, instead of relying on this generic one.\n     */\n    public void doFieldCheck(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {\n        doFieldCheck(\n                fixEmpty(req.getParameter(\"value\")),\n                fixEmpty(req.getParameter(\"type\")),\n                fixEmpty(req.getParameter(\"errorText\")),\n                fixEmpty(req.getParameter(\"warningText\"))).generateResponse(req,rsp,this);\n    }\n\n    /**\n     * Checks if the value for a field is set; if not an error or warning text is displayed.\n     * If the parameter \"value\" is not set then the parameter \"errorText\" is displayed\n     * as an error text. If the parameter \"errorText\" is not set, then the parameter \"warningText\"\n     * is displayed as a warning text.\n     * <p>\n     * If the text is set and the parameter \"type\" is set, it will validate that the value is of the\n     * correct type. Supported types are \"number, \"number-positive\" and \"number-negative\".\n     *\n     * @deprecated as of 1.324\n     *      Either use client-side validation (e.g. class=\"required number\")\n     *      or define your own check method, instead of relying on this generic one.\n     */\n    public FormValidation doFieldCheck(@QueryParameter(fixEmpty=true) String value,\n                                       @QueryParameter(fixEmpty=true) String type,\n                                       @QueryParameter(fixEmpty=true) String errorText,\n                                       @QueryParameter(fixEmpty=true) String warningText) {\n        if (value == null) {\n            if (errorText != null)\n                return FormValidation.error(errorText);\n            if (warningText != null)\n                return FormValidation.warning(warningText);\n            return FormValidation.error(\"No error or warning text was set for fieldCheck().\");\n        }\n\n        if (type != null) {\n            try {\n                if (type.equalsIgnoreCase(\"number\")) {\n                    NumberFormat.getInstance().parse(value);\n                } else if (type.equalsIgnoreCase(\"number-positive\")) {\n                    if (NumberFormat.getInstance().parse(value).floatValue() <= 0)\n                        return FormValidation.error(Messages.Hudson_NotAPositiveNumber());\n                } else if (type.equalsIgnoreCase(\"number-negative\")) {\n                    if (NumberFormat.getInstance().parse(value).floatValue() >= 0)\n                        return FormValidation.error(Messages.Hudson_NotANegativeNumber());\n                }\n            } catch (ParseException e) {\n                return FormValidation.error(Messages.Hudson_NotANumber());\n            }\n        }\n\n        return FormValidation.ok();\n    }\n\n    /**\n     * @deprecated\n     *      Use {@link Functions#isWindows()}.\n     */\n    public static boolean isWindows() {\n        return File.pathSeparatorChar==';';\n    }\n\n    /**\n     * @deprecated\n     *      Use {@link hudson.Platform#isDarwin()}\n     */\n    public static boolean isDarwin() {\n        return Platform.isDarwin();\n    }\n\n    /**\n     * @deprecated since 2007-12-18.\n     *      Use {@link #checkPermission(hudson.security.Permission)}\n     */\n    public static boolean adminCheck() throws IOException {\n        return adminCheck(Stapler.getCurrentRequest(), Stapler.getCurrentResponse());\n    }\n\n    /**\n     * @deprecated since 2007-12-18.\n     *      Use {@link #checkPermission(hudson.security.Permission)}\n     */\n    public static boolean adminCheck(StaplerRequest req,StaplerResponse rsp) throws IOException {\n        if (isAdmin(req)) return true;\n\n        rsp.sendError(StaplerResponse.SC_FORBIDDEN);\n        return false;\n    }\n\n    /**\n     * Checks if the current user (for which we are processing the current request)\n     * has the admin access.\n     *\n     * @deprecated since 2007-12-18.\n     *      This method is deprecated when Hudson moved from simple Unix root-like model\n     *      of \"admin gets to do everything, and others don't have any privilege\" to more\n     *      complex {@link hudson.security.ACL} and {@link hudson.security.Permission} based scheme.\n     *\n     *      <p>\n     *      For a quick migration, use {@code Hudson.getInstance().getACL().hasPermission(Hudson.ADMINISTER)}\n     *      To check if the user has the 'administer' role in Hudson.\n     *\n     *      <p>\n     *      But ideally, your plugin should first identify a suitable {@link hudson.security.Permission} (or create one,\n     *      if appropriate), then identify a suitable {@link hudson.security.AccessControlled} object to check its permission\n     *      against.\n     */\n    public static boolean isAdmin() {\n        return Jenkins.getInstance().getACL().hasPermission(ADMINISTER);\n    }\n\n    /**\n     * @deprecated since 2007-12-18.\n     *      Define a custom {@link hudson.security.Permission} and check against ACL.\n     *      See {@link #isAdmin()} for more instructions.\n     */\n    public static boolean isAdmin(StaplerRequest req) {\n        return isAdmin();\n    }\n\n    static {\n        XSTREAM.alias(\"hudson\",Hudson.class);\n    }\n\n    /**\n     * @deprecated  only here for backward comp\n     */\n    public static final class MasterComputer extends Jenkins.MasterComputer {\n        // no op\n    }\n\n    /**\n     * @deprecated  only here for backward comp\n     */\n    public static class CloudList extends Jenkins.CloudList {\n        public CloudList(Jenkins h) {\n            super(h);\n        }\n\n        public CloudList() {// needed for XStream deserialization\n            super();\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Java/JFlexLexer.java",
    "content": "/* The following code was generated by JFlex 1.4.3 on 28/01/16 11:27 */\n\npackage test;\nimport com.intellij.lexer.*;\nimport com.intellij.psi.tree.IElementType;\nimport static org.intellij.grammar.psi.BnfTypes.*;\n\n\n/**\n * This class is a scanner generated by \n * <a href=\"http://www.jflex.de/\">JFlex</a> 1.4.3\n * on 28/01/16 11:27 from the specification file\n * <tt>/home/abigail/code/intellij-grammar-kit-test/src/test/_GrammarLexer.flex</tt>\n */\npublic class _GrammarLexer implements FlexLexer {\n  /** initial size of the lookahead buffer */\n  private static final int ZZ_BUFFERSIZE = 16384;\n\n  /** lexical states */\n  public static final int YYINITIAL = 0;\n\n  /**\n   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l\n   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l\n   *                  at the beginning of a line\n   * l is of the form l = 2*k, k a non negative integer\n   */\n  private static final int ZZ_LEXSTATE[] = { \n     0, 0\n  };\n\n  /** \n   * Translates characters to character classes\n   */\n  private static final String ZZ_CMAP_PACKED = \n    \"\\11\\0\\1\\1\\1\\1\\1\\0\\1\\1\\1\\1\\22\\0\\1\\1\\101\\0\\1\\13\"+\n    \"\\1\\0\\1\\3\\1\\14\\1\\0\\1\\10\\1\\0\\1\\2\\3\\0\\1\\12\\1\\7\"+\n    \"\\3\\0\\1\\6\\1\\4\\1\\5\\1\\11\\uff8a\\0\";\n\n  /** \n   * Translates characters to character classes\n   */\n  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);\n\n  /** \n   * Translates DFA states to action switch labels.\n   */\n  private static final int [] ZZ_ACTION = zzUnpackAction();\n\n  private static final String ZZ_ACTION_PACKED_0 =\n    \"\\1\\0\\1\\1\\1\\2\\3\\1\\1\\3\\10\\0\\1\\4\\1\\5\";\n\n  private static int [] zzUnpackAction() {\n    int [] result = new int[17];\n    int offset = 0;\n    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);\n    return result;\n  }\n\n  private static int zzUnpackAction(String packed, int offset, int [] result) {\n    int i = 0;       /* index in packed string  */\n    int j = offset;  /* index in unpacked array */\n    int l = packed.length();\n    while (i < l) {\n      int count = packed.charAt(i++);\n      int value = packed.charAt(i++);\n      do result[j++] = value; while (--count > 0);\n    }\n    return j;\n  }\n\n\n  /** \n   * Translates a state to a row index in the transition table\n   */\n  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();\n\n  private static final String ZZ_ROWMAP_PACKED_0 =\n    \"\\0\\0\\0\\15\\0\\32\\0\\47\\0\\64\\0\\101\\0\\15\\0\\116\"+\n    \"\\0\\133\\0\\150\\0\\165\\0\\202\\0\\217\\0\\234\\0\\251\\0\\15\"+\n    \"\\0\\15\";\n\n  private static int [] zzUnpackRowMap() {\n    int [] result = new int[17];\n    int offset = 0;\n    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);\n    return result;\n  }\n\n  private static int zzUnpackRowMap(String packed, int offset, int [] result) {\n    int i = 0;  /* index in packed string  */\n    int j = offset;  /* index in unpacked array */\n    int l = packed.length();\n    while (i < l) {\n      int high = packed.charAt(i++) << 16;\n      result[j++] = high | packed.charAt(i++);\n    }\n    return j;\n  }\n\n  /** \n   * The transition table of the DFA\n   */\n  private static final int [] ZZ_TRANS = zzUnpackTrans();\n\n  private static final String ZZ_TRANS_PACKED_0 =\n    \"\\1\\2\\1\\3\\1\\4\\1\\2\\1\\5\\2\\2\\1\\6\\5\\2\"+\n    \"\\16\\0\\1\\3\\16\\0\\1\\7\\16\\0\\1\\10\\20\\0\\1\\11\"+\n    \"\\11\\0\\1\\12\\20\\0\\1\\13\\4\\0\\1\\14\\25\\0\\1\\15\"+\n    \"\\10\\0\\1\\16\\21\\0\\1\\17\\10\\0\\1\\20\\12\\0\\1\\21\"+\n    \"\\6\\0\";\n\n  private static int [] zzUnpackTrans() {\n    int [] result = new int[182];\n    int offset = 0;\n    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);\n    return result;\n  }\n\n  private static int zzUnpackTrans(String packed, int offset, int [] result) {\n    int i = 0;       /* index in packed string  */\n    int j = offset;  /* index in unpacked array */\n    int l = packed.length();\n    while (i < l) {\n      int count = packed.charAt(i++);\n      int value = packed.charAt(i++);\n      value--;\n      do result[j++] = value; while (--count > 0);\n    }\n    return j;\n  }\n\n\n  /* error codes */\n  private static final int ZZ_UNKNOWN_ERROR = 0;\n  private static final int ZZ_NO_MATCH = 1;\n  private static final int ZZ_PUSHBACK_2BIG = 2;\n  private static final char[] EMPTY_BUFFER = new char[0];\n  private static final int YYEOF = -1;\n  private static java.io.Reader zzReader = null; // Fake\n\n  /* error messages for the codes above */\n  private static final String ZZ_ERROR_MSG[] = {\n    \"Unkown internal scanner error\",\n    \"Error: could not match input\",\n    \"Error: pushback value was too large\"\n  };\n\n  /**\n   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>\n   */\n  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();\n\n  private static final String ZZ_ATTRIBUTE_PACKED_0 =\n    \"\\1\\0\\1\\11\\4\\1\\1\\11\\10\\0\\2\\11\";\n\n  private static int [] zzUnpackAttribute() {\n    int [] result = new int[17];\n    int offset = 0;\n    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);\n    return result;\n  }\n\n  private static int zzUnpackAttribute(String packed, int offset, int [] result) {\n    int i = 0;       /* index in packed string  */\n    int j = offset;  /* index in unpacked array */\n    int l = packed.length();\n    while (i < l) {\n      int count = packed.charAt(i++);\n      int value = packed.charAt(i++);\n      do result[j++] = value; while (--count > 0);\n    }\n    return j;\n  }\n\n  /** the current state of the DFA */\n  private int zzState;\n\n  /** the current lexical state */\n  private int zzLexicalState = YYINITIAL;\n\n  /** this buffer contains the current text to be matched and is\n      the source of the yytext() string */\n  private CharSequence zzBuffer = \"\";\n\n  /** this buffer may contains the current text array to be matched when it is cheap to acquire it */\n  private char[] zzBufferArray;\n\n  /** the textposition at the last accepting state */\n  private int zzMarkedPos;\n\n  /** the textposition at the last state to be included in yytext */\n  private int zzPushbackPos;\n\n  /** the current text position in the buffer */\n  private int zzCurrentPos;\n\n  /** startRead marks the beginning of the yytext() string in the buffer */\n  private int zzStartRead;\n\n  /** endRead marks the last character in the buffer, that has been read\n      from input */\n  private int zzEndRead;\n\n  /**\n   * zzAtBOL == true <=> the scanner is currently at the beginning of a line\n   */\n  private boolean zzAtBOL = true;\n\n  /** zzAtEOF == true <=> the scanner is at the EOF */\n  private boolean zzAtEOF;\n\n  /* user code: */\n  public _GrammarLexer() {\n    this((java.io.Reader)null);\n  }\n\n\n  /**\n   * Creates a new scanner\n   *\n   * @param   in  the java.io.Reader to read input from.\n   */\n  public _GrammarLexer(java.io.Reader in) {\n    this.zzReader = in;\n  }\n\n\n  /** \n   * Unpacks the compressed character translation table.\n   *\n   * @param packed   the packed character translation table\n   * @return         the unpacked character translation table\n   */\n  private static char [] zzUnpackCMap(String packed) {\n    char [] map = new char[0x10000];\n    int i = 0;  /* index in packed string  */\n    int j = 0;  /* index in unpacked array */\n    while (i < 52) {\n      int  count = packed.charAt(i++);\n      char value = packed.charAt(i++);\n      do map[j++] = value; while (--count > 0);\n    }\n    return map;\n  }\n\n  public final int getTokenStart(){\n    return zzStartRead;\n  }\n\n  public final int getTokenEnd(){\n    return getTokenStart() + yylength();\n  }\n\n  public void reset(CharSequence buffer, int start, int end,int initialState){\n    zzBuffer = buffer;\n    zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer);\n    zzCurrentPos = zzMarkedPos = zzStartRead = start;\n    zzPushbackPos = 0;\n    zzAtEOF  = false;\n    zzAtBOL = true;\n    zzEndRead = end;\n    yybegin(initialState);\n  }\n\n  /**\n   * Refills the input buffer.\n   *\n   * @return      <code>false</code>, iff there was new input.\n   *\n   * @exception   java.io.IOException  if any I/O-Error occurs\n   */\n  private boolean zzRefill() throws java.io.IOException {\n    return true;\n  }\n\n\n  /**\n   * Returns the current lexical state.\n   */\n  public final int yystate() {\n    return zzLexicalState;\n  }\n\n\n  /**\n   * Enters a new lexical state\n   *\n   * @param newState the new lexical state\n   */\n  public final void yybegin(int newState) {\n    zzLexicalState = newState;\n  }\n\n\n  /**\n   * Returns the text matched by the current regular expression.\n   */\n  public final CharSequence yytext() {\n    return zzBuffer.subSequence(zzStartRead, zzMarkedPos);\n  }\n\n\n  /**\n   * Returns the character at position <tt>pos</tt> from the\n   * matched text.\n   *\n   * It is equivalent to yytext().charAt(pos), but faster\n   *\n   * @param pos the position of the character to fetch.\n   *            A value from 0 to yylength()-1.\n   *\n   * @return the character at position pos\n   */\n  public final char yycharat(int pos) {\n    return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos);\n  }\n\n\n  /**\n   * Returns the length of the matched text region.\n   */\n  public final int yylength() {\n    return zzMarkedPos-zzStartRead;\n  }\n\n\n  /**\n   * Reports an error that occured while scanning.\n   *\n   * In a wellformed scanner (no or only correct usage of\n   * yypushback(int) and a match-all fallback rule) this method\n   * will only be called with things that \"Can't Possibly Happen\".\n   * If this method is called, something is seriously wrong\n   * (e.g. a JFlex bug producing a faulty scanner etc.).\n   *\n   * Usual syntax/scanner level error handling should be done\n   * in error fallback rules.\n   *\n   * @param   errorCode  the code of the errormessage to display\n   */\n  private void zzScanError(int errorCode) {\n    String message;\n    try {\n      message = ZZ_ERROR_MSG[errorCode];\n    }\n    catch (ArrayIndexOutOfBoundsException e) {\n      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];\n    }\n\n    throw new Error(message);\n  }\n\n\n  /**\n   * Pushes the specified amount of characters back into the input stream.\n   *\n   * They will be read again by then next call of the scanning method\n   *\n   * @param number  the number of characters to be read again.\n   *                This number must not be greater than yylength()!\n   */\n  public void yypushback(int number)  {\n    if ( number > yylength() )\n      zzScanError(ZZ_PUSHBACK_2BIG);\n\n    zzMarkedPos -= number;\n  }\n\n\n  /**\n   * Resumes scanning until the next regular expression is matched,\n   * the end of input is encountered or an I/O-Error occurs.\n   *\n   * @return      the next token\n   * @exception   java.io.IOException  if any I/O-Error occurs\n   */\n  public IElementType advance() throws java.io.IOException {\n    int zzInput;\n    int zzAction;\n\n    // cached fields:\n    int zzCurrentPosL;\n    int zzMarkedPosL;\n    int zzEndReadL = zzEndRead;\n    CharSequence zzBufferL = zzBuffer;\n    char[] zzBufferArrayL = zzBufferArray;\n    char [] zzCMapL = ZZ_CMAP;\n\n    int [] zzTransL = ZZ_TRANS;\n    int [] zzRowMapL = ZZ_ROWMAP;\n    int [] zzAttrL = ZZ_ATTRIBUTE;\n\n    while (true) {\n      zzMarkedPosL = zzMarkedPos;\n\n      zzAction = -1;\n\n      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;\n\n      zzState = ZZ_LEXSTATE[zzLexicalState];\n\n\n      zzForAction: {\n        while (true) {\n\n          if (zzCurrentPosL < zzEndReadL)\n            zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++));\n          else if (zzAtEOF) {\n            zzInput = YYEOF;\n            break zzForAction;\n          }\n          else {\n            // store back cached positions\n            zzCurrentPos  = zzCurrentPosL;\n            zzMarkedPos   = zzMarkedPosL;\n            boolean eof = zzRefill();\n            // get translated positions and possibly new buffer\n            zzCurrentPosL  = zzCurrentPos;\n            zzMarkedPosL   = zzMarkedPos;\n            zzBufferL      = zzBuffer;\n            zzEndReadL     = zzEndRead;\n            if (eof) {\n              zzInput = YYEOF;\n              break zzForAction;\n            }\n            else {\n              zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++));\n            }\n          }\n          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];\n          if (zzNext == -1) break zzForAction;\n          zzState = zzNext;\n\n          int zzAttributes = zzAttrL[zzState];\n          if ( (zzAttributes & 1) == 1 ) {\n            zzAction = zzState;\n            zzMarkedPosL = zzCurrentPosL;\n            if ( (zzAttributes & 8) == 8 ) break zzForAction;\n          }\n\n        }\n      }\n\n      // store back cached position\n      zzMarkedPos = zzMarkedPosL;\n\n      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {\n        case 1: \n          { return com.intellij.psi.TokenType.BAD_CHARACTER;\n          }\n        case 6: break;\n        case 4: \n          { return BNF_STRING;\n          }\n        case 7: break;\n        case 5: \n          { return BNF_NUMBER;\n          }\n        case 8: break;\n        case 3: \n          { return BNF_ID;\n          }\n        case 9: break;\n        case 2: \n          { return com.intellij.psi.TokenType.WHITE_SPACE;\n          }\n        case 10: break;\n        default:\n          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {\n            zzAtEOF = true;\n            return null;\n          }\n          else {\n            zzScanError(ZZ_NO_MATCH);\n          }\n      }\n    }\n  }\n\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Java/NokogiriService.java",
    "content": "/**\n * (The MIT License)\n *\n * Copyright (c) 2008 - 2011:\n *\n * * {Aaron Patterson}[http://tenderlovemaking.com]\n * * {Mike Dalessio}[http://mike.daless.io]\n * * {Charles Nutter}[http://blog.headius.com]\n * * {Sergio Arbeo}[http://www.serabe.com]\n * * {Patrick Mahoney}[http://polycrystal.org]\n * * {Yoko Harada}[http://yokolet.blogspot.com]\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\npackage nokogiri;\n\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.jruby.Ruby;\nimport org.jruby.RubyArray;\nimport org.jruby.RubyClass;\nimport org.jruby.RubyFixnum;\nimport org.jruby.RubyModule;\nimport org.jruby.runtime.ObjectAllocator;\nimport org.jruby.runtime.builtin.IRubyObject;\nimport org.jruby.runtime.load.BasicLibraryService;\n\n/**\n * Class to provide Nokogiri. This class is used to make \"require 'nokogiri'\" work\n * in JRuby. Also, this class holds a Ruby type cache and allocators of Ruby types.\n * \n * @author headius\n * @author Yoko Harada <yokolet@gmail.com>\n */\npublic class NokogiriService implements BasicLibraryService {\n    public static final String nokogiriClassCacheGvarName = \"$NOKOGIRI_CLASS_CACHE\";\n    public static Map<String, RubyClass> nokogiriClassCache;\n\n    public boolean basicLoad(Ruby ruby) {\n        init(ruby);\n        createNokogiriClassCahce(ruby);\n        return true;\n    }\n    \n    private static void createNokogiriClassCahce(Ruby ruby) {\n        nokogiriClassCache = Collections.synchronizedMap(new HashMap<String, RubyClass>());\n        nokogiriClassCache.put(\"Nokogiri::EncodingHandler\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::EncodingHandler\"));\n        nokogiriClassCache.put(\"Nokogiri::HTML::Document\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::HTML::Document\"));\n        nokogiriClassCache.put(\"Nokogiri::HTML::ElementDescription\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::HTML::ElementDescription\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Attr\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Attr\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Document\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Document\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::DocumentFragment\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::DocumentFragment\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::DTD\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::DTD\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Text\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Text\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Comment\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Comment\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Element\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Element\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::ElementContent\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::ElementContent\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::ElementDecl\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::ElementDecl\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::EntityDecl\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::EntityDecl\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::EntityReference\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::EntityReference\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::ProcessingInstruction\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::ProcessingInstruction\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::CDATA\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::CDATA\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Node\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Node\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::NodeSet\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::NodeSet\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Namespace\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Namespace\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::SyntaxError\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::SyntaxError\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Reader\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Reader\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::RelaxNG\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::RelaxNG\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Schema\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Schema\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::XPathContext\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::XPathContext\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::AttributeDecl\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::AttributeDecl\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::SAX::ParserContext\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::SAX::ParserContext\"));\n    }\n\n    private void init(Ruby ruby) {\n        RubyModule nokogiri = ruby.defineModule(\"Nokogiri\");\n        RubyModule xmlModule = nokogiri.defineModuleUnder(\"XML\");\n        RubyModule xmlSaxModule = xmlModule.defineModuleUnder(\"SAX\");\n        RubyModule htmlModule = nokogiri.defineModuleUnder(\"HTML\");\n        RubyModule htmlSaxModule = htmlModule.defineModuleUnder(\"SAX\");\n        RubyModule xsltModule = nokogiri.defineModuleUnder(\"XSLT\");\n\n        createNokogiriModule(ruby, nokogiri);\n        createSyntaxErrors(ruby, nokogiri, xmlModule);\n        RubyClass xmlNode = createXmlModule(ruby, xmlModule);\n        createHtmlModule(ruby, htmlModule);\n        createDocuments(ruby, xmlModule, htmlModule, xmlNode);\n        createSaxModule(ruby, xmlSaxModule, htmlSaxModule);\n        createXsltModule(ruby, xsltModule);\n    }\n    \n    private void createNokogiriModule(Ruby ruby, RubyModule nokogiri) {;\n        RubyClass encHandler = nokogiri.defineClassUnder(\"EncodingHandler\", ruby.getObject(), ENCODING_HANDLER_ALLOCATOR);\n        encHandler.defineAnnotatedMethods(EncodingHandler.class);\n    }\n    \n    private void createSyntaxErrors(Ruby ruby, RubyModule nokogiri, RubyModule xmlModule) {\n        RubyClass syntaxError = nokogiri.defineClassUnder(\"SyntaxError\", ruby.getStandardError(), ruby.getStandardError().getAllocator());\n        RubyClass xmlSyntaxError = xmlModule.defineClassUnder(\"SyntaxError\", syntaxError, XML_SYNTAXERROR_ALLOCATOR);\n        xmlSyntaxError.defineAnnotatedMethods(XmlSyntaxError.class);\n    }\n    \n    private RubyClass createXmlModule(Ruby ruby, RubyModule xmlModule) {\n        RubyClass node = xmlModule.defineClassUnder(\"Node\", ruby.getObject(), XML_NODE_ALLOCATOR);\n        node.defineAnnotatedMethods(XmlNode.class);\n        \n        RubyClass attr = xmlModule.defineClassUnder(\"Attr\", node, XML_ATTR_ALLOCATOR);\n        attr.defineAnnotatedMethods(XmlAttr.class);\n        \n        RubyClass attrDecl = xmlModule.defineClassUnder(\"AttributeDecl\", node, XML_ATTRIBUTE_DECL_ALLOCATOR);\n        attrDecl.defineAnnotatedMethods(XmlAttributeDecl.class);\n        \n        RubyClass characterData = xmlModule.defineClassUnder(\"CharacterData\", node, null);\n        \n        RubyClass comment = xmlModule.defineClassUnder(\"Comment\", characterData, XML_COMMENT_ALLOCATOR);\n        comment.defineAnnotatedMethods(XmlComment.class);\n        \n        RubyClass text = xmlModule.defineClassUnder(\"Text\", characterData, XML_TEXT_ALLOCATOR);\n        text.defineAnnotatedMethods(XmlText.class);\n        \n        RubyModule cdata = xmlModule.defineClassUnder(\"CDATA\", text, XML_CDATA_ALLOCATOR);\n        cdata.defineAnnotatedMethods(XmlCdata.class);\n        \n        RubyClass dtd = xmlModule.defineClassUnder(\"DTD\", node, XML_DTD_ALLOCATOR);\n        dtd.defineAnnotatedMethods(XmlDtd.class);\n\n        RubyClass documentFragment = xmlModule.defineClassUnder(\"DocumentFragment\", node, XML_DOCUMENT_FRAGMENT_ALLOCATOR);\n        documentFragment.defineAnnotatedMethods(XmlDocumentFragment.class);\n        \n        RubyClass element = xmlModule.defineClassUnder(\"Element\", node, XML_ELEMENT_ALLOCATOR);\n        element.defineAnnotatedMethods(XmlElement.class);\n        \n        RubyClass elementContent = xmlModule.defineClassUnder(\"ElementContent\", ruby.getObject(), XML_ELEMENT_CONTENT_ALLOCATOR);\n        elementContent.defineAnnotatedMethods(XmlElementContent.class);\n        \n        RubyClass elementDecl = xmlModule.defineClassUnder(\"ElementDecl\", node, XML_ELEMENT_DECL_ALLOCATOR);\n        elementDecl.defineAnnotatedMethods(XmlElementDecl.class);\n        \n        RubyClass entityDecl = xmlModule.defineClassUnder(\"EntityDecl\", node, XML_ENTITY_DECL_ALLOCATOR);\n        entityDecl.defineAnnotatedMethods(XmlEntityDecl.class);\n        \n        entityDecl.defineConstant(\"INTERNAL_GENERAL\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.INTERNAL_GENERAL));\n        entityDecl.defineConstant(\"EXTERNAL_GENERAL_PARSED\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.EXTERNAL_GENERAL_PARSED));\n        entityDecl.defineConstant(\"EXTERNAL_GENERAL_UNPARSED\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.EXTERNAL_GENERAL_UNPARSED));\n        entityDecl.defineConstant(\"INTERNAL_PARAMETER\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.INTERNAL_PARAMETER));\n        entityDecl.defineConstant(\"EXTERNAL_PARAMETER\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.EXTERNAL_PARAMETER));\n        entityDecl.defineConstant(\"INTERNAL_PREDEFINED\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.INTERNAL_PREDEFINED));\n        \n        RubyClass entref = xmlModule.defineClassUnder(\"EntityReference\", node, XML_ENTITY_REFERENCE_ALLOCATOR);\n        entref.defineAnnotatedMethods(XmlEntityReference.class);\n        \n        RubyClass namespace = xmlModule.defineClassUnder(\"Namespace\", ruby.getObject(), XML_NAMESPACE_ALLOCATOR);\n        namespace.defineAnnotatedMethods(XmlNamespace.class);\n        \n        RubyClass nodeSet = xmlModule.defineClassUnder(\"NodeSet\", ruby.getObject(), XML_NODESET_ALLOCATOR);\n        nodeSet.defineAnnotatedMethods(XmlNodeSet.class);\n        \n        RubyClass pi = xmlModule.defineClassUnder(\"ProcessingInstruction\", node, XML_PROCESSING_INSTRUCTION_ALLOCATOR);\n        pi.defineAnnotatedMethods(XmlProcessingInstruction.class);\n        \n        RubyClass reader = xmlModule.defineClassUnder(\"Reader\", ruby.getObject(), XML_READER_ALLOCATOR);\n        reader.defineAnnotatedMethods(XmlReader.class);\n        \n        RubyClass schema = xmlModule.defineClassUnder(\"Schema\", ruby.getObject(), XML_SCHEMA_ALLOCATOR);\n        schema.defineAnnotatedMethods(XmlSchema.class);\n\n        RubyClass relaxng = xmlModule.defineClassUnder(\"RelaxNG\", schema, XML_RELAXNG_ALLOCATOR);\n        relaxng.defineAnnotatedMethods(XmlRelaxng.class);\n        \n        RubyClass xpathContext = xmlModule.defineClassUnder(\"XPathContext\", ruby.getObject(), XML_XPATHCONTEXT_ALLOCATOR);\n        xpathContext.defineAnnotatedMethods(XmlXpathContext.class);\n        \n        return node;\n    }\n\n    private void createHtmlModule(Ruby ruby, RubyModule htmlModule) {\n        RubyClass htmlElemDesc = htmlModule.defineClassUnder(\"ElementDescription\", ruby.getObject(), HTML_ELEMENT_DESCRIPTION_ALLOCATOR);\n        htmlElemDesc.defineAnnotatedMethods(HtmlElementDescription.class);\n        \n        RubyClass htmlEntityLookup = htmlModule.defineClassUnder(\"EntityLookup\", ruby.getObject(), HTML_ENTITY_LOOKUP_ALLOCATOR);\n        htmlEntityLookup.defineAnnotatedMethods(HtmlEntityLookup.class);\n    }\n    \n    private void createDocuments(Ruby ruby, RubyModule xmlModule, RubyModule htmlModule, RubyClass node) {\n        RubyClass xmlDocument = xmlModule.defineClassUnder(\"Document\", node, XML_DOCUMENT_ALLOCATOR);\n        xmlDocument.defineAnnotatedMethods(XmlDocument.class);\n        \n        //RubyModule htmlDoc = html.defineOrGetClassUnder(\"Document\", document);\n        RubyModule htmlDocument = htmlModule.defineClassUnder(\"Document\", xmlDocument, HTML_DOCUMENT_ALLOCATOR);\n        htmlDocument.defineAnnotatedMethods(HtmlDocument.class);\n    }\n    \n    private void createSaxModule(Ruby ruby, RubyModule xmlSaxModule, RubyModule htmlSaxModule) {\n        RubyClass xmlSaxParserContext = xmlSaxModule.defineClassUnder(\"ParserContext\", ruby.getObject(), XML_SAXPARSER_CONTEXT_ALLOCATOR);\n        xmlSaxParserContext.defineAnnotatedMethods(XmlSaxParserContext.class);\n        \n        RubyClass xmlSaxPushParser = xmlSaxModule.defineClassUnder(\"PushParser\", ruby.getObject(), XML_SAXPUSHPARSER_ALLOCATOR);\n        xmlSaxPushParser.defineAnnotatedMethods(XmlSaxPushParser.class);\n        \n        RubyClass htmlSaxParserContext = htmlSaxModule.defineClassUnder(\"ParserContext\", xmlSaxParserContext, HTML_SAXPARSER_CONTEXT_ALLOCATOR);\n        htmlSaxParserContext.defineAnnotatedMethods(HtmlSaxParserContext.class);\n    }\n    \n    private void createXsltModule(Ruby ruby, RubyModule xsltModule) {\n        RubyClass stylesheet = xsltModule.defineClassUnder(\"Stylesheet\", ruby.getObject(), XSLT_STYLESHEET_ALLOCATOR);\n        stylesheet.defineAnnotatedMethods(XsltStylesheet.class);\n        xsltModule.defineAnnotatedMethod(XsltStylesheet.class, \"register\");\n    }\n\n    private static ObjectAllocator ENCODING_HANDLER_ALLOCATOR = new ObjectAllocator() {\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            return new EncodingHandler(runtime, klazz, \"\");\n        }\n    };\n\n    public static final ObjectAllocator HTML_DOCUMENT_ALLOCATOR = new ObjectAllocator() {\n        private HtmlDocument htmlDocument = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (htmlDocument == null) htmlDocument = new HtmlDocument(runtime, klazz);\n            try {\n                HtmlDocument clone = (HtmlDocument) htmlDocument.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new HtmlDocument(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator HTML_SAXPARSER_CONTEXT_ALLOCATOR = new ObjectAllocator() {\n        private HtmlSaxParserContext htmlSaxParserContext = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (htmlSaxParserContext == null) htmlSaxParserContext = new HtmlSaxParserContext(runtime, klazz);\n            try {\n                HtmlSaxParserContext clone = (HtmlSaxParserContext) htmlSaxParserContext.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new HtmlSaxParserContext(runtime, klazz);\n            }\n        }\n    };\n\n    private static ObjectAllocator HTML_ELEMENT_DESCRIPTION_ALLOCATOR =\n        new ObjectAllocator() {\n            public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n                return new HtmlElementDescription(runtime, klazz);\n            }\n        };\n\n    private static ObjectAllocator HTML_ENTITY_LOOKUP_ALLOCATOR =\n        new ObjectAllocator() {\n            public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n                return new HtmlEntityLookup(runtime, klazz);\n            }\n        };\n\n    public static final ObjectAllocator XML_ATTR_ALLOCATOR = new ObjectAllocator() {\n        private XmlAttr xmlAttr = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlAttr == null) xmlAttr = new XmlAttr(runtime, klazz);\n            try {\n                XmlAttr clone = (XmlAttr) xmlAttr.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlAttr(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_CDATA_ALLOCATOR = new ObjectAllocator() {\n        private XmlCdata xmlCdata = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlCdata == null) xmlCdata = new XmlCdata(runtime, klazz);\n            try {\n                XmlCdata clone = (XmlCdata) xmlCdata.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlCdata(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_COMMENT_ALLOCATOR = new ObjectAllocator() {\n        private XmlComment xmlComment = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlComment == null) xmlComment = new XmlComment(runtime, klazz);\n            try {\n                XmlComment clone = (XmlComment) xmlComment.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlComment(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_DOCUMENT_ALLOCATOR = new ObjectAllocator() {\n        private XmlDocument xmlDocument = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlDocument == null) xmlDocument = new XmlDocument(runtime, klazz);\n            try {\n                XmlDocument clone = (XmlDocument) xmlDocument.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlDocument(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_DOCUMENT_FRAGMENT_ALLOCATOR = new ObjectAllocator() {\n        private XmlDocumentFragment xmlDocumentFragment = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlDocumentFragment == null) xmlDocumentFragment = new XmlDocumentFragment(runtime, klazz);\n            try {\n                XmlDocumentFragment clone = (XmlDocumentFragment)xmlDocumentFragment.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlDocumentFragment(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_DTD_ALLOCATOR = new ObjectAllocator() {\n        private XmlDtd xmlDtd = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlDtd == null) xmlDtd = new XmlDtd(runtime, klazz);\n            try {\n                XmlDtd clone = (XmlDtd)xmlDtd.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlDtd(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_ELEMENT_ALLOCATOR = new ObjectAllocator() {\n        private XmlElement xmlElement = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlElement == null) xmlElement = new XmlElement(runtime, klazz);\n            try {\n                XmlElement clone = (XmlElement)xmlElement.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlElement(runtime, klazz);\n            }\n        }\n    };\n    \n    public static ObjectAllocator XML_ELEMENT_DECL_ALLOCATOR = new ObjectAllocator() {\n        private XmlElementDecl xmlElementDecl = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlElementDecl == null) xmlElementDecl = new XmlElementDecl(runtime, klazz);\n            try {\n                XmlElementDecl clone = (XmlElementDecl)xmlElementDecl.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlElementDecl(runtime, klazz);\n            }\n        }\n    };\n\n    public static ObjectAllocator XML_ENTITY_REFERENCE_ALLOCATOR = new ObjectAllocator() {\n        private XmlEntityReference xmlEntityRef = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlEntityRef == null) xmlEntityRef = new XmlEntityReference(runtime, klazz);\n            try {\n                XmlEntityReference clone = (XmlEntityReference)xmlEntityRef.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlEntityReference(runtime, klazz);\n            }\n        }\n    };\n    \n    public static final ObjectAllocator XML_NAMESPACE_ALLOCATOR = new ObjectAllocator() {\n        private XmlNamespace xmlNamespace = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlNamespace == null) xmlNamespace = new XmlNamespace(runtime, klazz);\n            try {\n                XmlNamespace clone = (XmlNamespace) xmlNamespace.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlNamespace(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_NODE_ALLOCATOR = new ObjectAllocator() {\n        private XmlNode xmlNode = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlNode == null) xmlNode = new XmlNode(runtime, klazz);\n            try {\n                XmlNode clone  = (XmlNode) xmlNode.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlNode(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_NODESET_ALLOCATOR = new ObjectAllocator() {\n        private XmlNodeSet xmlNodeSet = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlNodeSet == null) xmlNodeSet = new XmlNodeSet(runtime, klazz);\n            try {\n                XmlNodeSet clone  = (XmlNodeSet) xmlNodeSet.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                xmlNodeSet = new XmlNodeSet(runtime, klazz);\n                xmlNodeSet.setNodes(RubyArray.newEmptyArray(runtime));\n                return xmlNodeSet;\n            }\n        }\n    };\n    \n    public static ObjectAllocator XML_PROCESSING_INSTRUCTION_ALLOCATOR = new ObjectAllocator() {\n        private XmlProcessingInstruction xmlProcessingInstruction = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlProcessingInstruction == null) xmlProcessingInstruction = new XmlProcessingInstruction(runtime, klazz);\n            try {\n                XmlProcessingInstruction clone = (XmlProcessingInstruction)xmlProcessingInstruction.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlProcessingInstruction(runtime, klazz);\n            }\n        }\n    };\n\n    public static ObjectAllocator XML_READER_ALLOCATOR = new ObjectAllocator() {\n        private XmlReader xmlReader = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlReader == null) xmlReader = new XmlReader(runtime, klazz);\n            try {\n                XmlReader clone  = (XmlReader) xmlReader.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                xmlReader = new XmlReader(runtime, klazz);\n                return xmlReader;\n            }\n        }\n    };\n\n    private static ObjectAllocator XML_ATTRIBUTE_DECL_ALLOCATOR = new ObjectAllocator() {\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            return new XmlAttributeDecl(runtime, klazz);\n        }\n    };\n\n    private static ObjectAllocator XML_ENTITY_DECL_ALLOCATOR = new ObjectAllocator() {\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            return new XmlEntityDecl(runtime, klazz);\n        }\n    };\n\n    private static ObjectAllocator XML_ELEMENT_CONTENT_ALLOCATOR = new ObjectAllocator() {\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            throw runtime.newNotImplementedError(\"not implemented\");\n        }\n    };\n\n    public static final ObjectAllocator XML_RELAXNG_ALLOCATOR = new ObjectAllocator() {\n        private XmlRelaxng xmlRelaxng = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlRelaxng == null) xmlRelaxng = new XmlRelaxng(runtime, klazz);\n            try {\n                XmlRelaxng clone  = (XmlRelaxng) xmlRelaxng.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlRelaxng(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_SAXPARSER_CONTEXT_ALLOCATOR = new ObjectAllocator() {\n        private XmlSaxParserContext xmlSaxParserContext = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlSaxParserContext == null) xmlSaxParserContext = new XmlSaxParserContext(runtime, klazz);\n            try {\n                XmlSaxParserContext clone = (XmlSaxParserContext) xmlSaxParserContext.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlSaxParserContext(runtime, klazz);\n            }\n        }\n    };\n\n    private static ObjectAllocator XML_SAXPUSHPARSER_ALLOCATOR = new ObjectAllocator() {\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            return new XmlSaxPushParser(runtime, klazz);\n        }\n    };\n\n    public static final ObjectAllocator XML_SCHEMA_ALLOCATOR = new ObjectAllocator() {\n        private XmlSchema xmlSchema = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlSchema == null) xmlSchema = new XmlSchema(runtime, klazz);\n            try {\n                XmlSchema clone  = (XmlSchema) xmlSchema.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlSchema(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_SYNTAXERROR_ALLOCATOR = new ObjectAllocator() {\n        private XmlSyntaxError xmlSyntaxError = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlSyntaxError == null) xmlSyntaxError = new XmlSyntaxError(runtime, klazz);\n            try {\n                XmlSyntaxError clone  = (XmlSyntaxError) xmlSyntaxError.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlSyntaxError(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_TEXT_ALLOCATOR = new ObjectAllocator() {\n        private XmlText xmlText = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlText == null) xmlText = new XmlText(runtime, klazz);\n            try {\n                XmlText clone  = (XmlText) xmlText.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlText(runtime, klazz);\n            }\n        }\n    };\n\n    public static ObjectAllocator XML_XPATHCONTEXT_ALLOCATOR = new ObjectAllocator() {\n        private XmlXpathContext xmlXpathContext = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlXpathContext == null) xmlXpathContext = new XmlXpathContext(runtime, klazz);\n            try {\n                XmlXpathContext clone  = (XmlXpathContext) xmlXpathContext.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlXpathContext(runtime, klazz);\n            }\n        }\n    };\n\n    public static ObjectAllocator XSLT_STYLESHEET_ALLOCATOR = new ObjectAllocator() {\n        private XsltStylesheet xsltStylesheet = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xsltStylesheet == null) xsltStylesheet = new XsltStylesheet(runtime, klazz);\n            try {\n                XsltStylesheet clone  = (XsltStylesheet) xsltStylesheet.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlText(runtime, klazz);\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Java/ProtocolBuffer.java",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: protocol-buffer.proto\n\npackage persons;\n\npublic final class ProtocolBuffer {\n  private ProtocolBuffer() {}\n  public static void registerAllExtensions(\n      com.google.protobuf.ExtensionRegistry registry) {\n  }\n  public interface PersonOrBuilder\n      extends com.google.protobuf.MessageOrBuilder {\n\n    // required string name = 1;\n    /**\n     * <code>required string name = 1;</code>\n     */\n    boolean hasName();\n    /**\n     * <code>required string name = 1;</code>\n     */\n    java.lang.String getName();\n    /**\n     * <code>required string name = 1;</code>\n     */\n    com.google.protobuf.ByteString\n        getNameBytes();\n  }\n  /**\n   * Protobuf type {@code persons.Person}\n   */\n  public static final class Person extends\n      com.google.protobuf.GeneratedMessage\n      implements PersonOrBuilder {\n    // Use Person.newBuilder() to construct.\n    private Person(com.google.protobuf.GeneratedMessage.Builder<?> builder) {\n      super(builder);\n      this.unknownFields = builder.getUnknownFields();\n    }\n    private Person(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }\n\n    private static final Person defaultInstance;\n    public static Person getDefaultInstance() {\n      return defaultInstance;\n    }\n\n    public Person getDefaultInstanceForType() {\n      return defaultInstance;\n    }\n\n    private final com.google.protobuf.UnknownFieldSet unknownFields;\n    @java.lang.Override\n    public final com.google.protobuf.UnknownFieldSet\n        getUnknownFields() {\n      return this.unknownFields;\n    }\n    private Person(\n        com.google.protobuf.CodedInputStream input,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws com.google.protobuf.InvalidProtocolBufferException {\n      initFields();\n      int mutable_bitField0_ = 0;\n      com.google.protobuf.UnknownFieldSet.Builder unknownFields =\n          com.google.protobuf.UnknownFieldSet.newBuilder();\n      try {\n        boolean done = false;\n        while (!done) {\n          int tag = input.readTag();\n          switch (tag) {\n            case 0:\n              done = true;\n              break;\n            default: {\n              if (!parseUnknownField(input, unknownFields,\n                                     extensionRegistry, tag)) {\n                done = true;\n              }\n              break;\n            }\n            case 10: {\n              bitField0_ |= 0x00000001;\n              name_ = input.readBytes();\n              break;\n            }\n          }\n        }\n      } catch (com.google.protobuf.InvalidProtocolBufferException e) {\n        throw e.setUnfinishedMessage(this);\n      } catch (java.io.IOException e) {\n        throw new com.google.protobuf.InvalidProtocolBufferException(\n            e.getMessage()).setUnfinishedMessage(this);\n      } finally {\n        this.unknownFields = unknownFields.build();\n        makeExtensionsImmutable();\n      }\n    }\n    public static final com.google.protobuf.Descriptors.Descriptor\n        getDescriptor() {\n      return persons.ProtocolBuffer.internal_static_persons_Person_descriptor;\n    }\n\n    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n        internalGetFieldAccessorTable() {\n      return persons.ProtocolBuffer.internal_static_persons_Person_fieldAccessorTable\n          .ensureFieldAccessorsInitialized(\n              persons.ProtocolBuffer.Person.class, persons.ProtocolBuffer.Person.Builder.class);\n    }\n\n    public static com.google.protobuf.Parser<Person> PARSER =\n        new com.google.protobuf.AbstractParser<Person>() {\n      public Person parsePartialFrom(\n          com.google.protobuf.CodedInputStream input,\n          com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n          throws com.google.protobuf.InvalidProtocolBufferException {\n        return new Person(input, extensionRegistry);\n      }\n    };\n\n    @java.lang.Override\n    public com.google.protobuf.Parser<Person> getParserForType() {\n      return PARSER;\n    }\n\n    private int bitField0_;\n    // required string name = 1;\n    public static final int NAME_FIELD_NUMBER = 1;\n    private java.lang.Object name_;\n    /**\n     * <code>required string name = 1;</code>\n     */\n    public boolean hasName() {\n      return ((bitField0_ & 0x00000001) == 0x00000001);\n    }\n    /**\n     * <code>required string name = 1;</code>\n     */\n    public java.lang.String getName() {\n      java.lang.Object ref = name_;\n      if (ref instanceof java.lang.String) {\n        return (java.lang.String) ref;\n      } else {\n        com.google.protobuf.ByteString bs = \n            (com.google.protobuf.ByteString) ref;\n        java.lang.String s = bs.toStringUtf8();\n        if (bs.isValidUtf8()) {\n          name_ = s;\n        }\n        return s;\n      }\n    }\n    /**\n     * <code>required string name = 1;</code>\n     */\n    public com.google.protobuf.ByteString\n        getNameBytes() {\n      java.lang.Object ref = name_;\n      if (ref instanceof java.lang.String) {\n        com.google.protobuf.ByteString b = \n            com.google.protobuf.ByteString.copyFromUtf8(\n                (java.lang.String) ref);\n        name_ = b;\n        return b;\n      } else {\n        return (com.google.protobuf.ByteString) ref;\n      }\n    }\n\n    private void initFields() {\n      name_ = \"\";\n    }\n    private byte memoizedIsInitialized = -1;\n    public final boolean isInitialized() {\n      byte isInitialized = memoizedIsInitialized;\n      if (isInitialized != -1) return isInitialized == 1;\n\n      if (!hasName()) {\n        memoizedIsInitialized = 0;\n        return false;\n      }\n      memoizedIsInitialized = 1;\n      return true;\n    }\n\n    public void writeTo(com.google.protobuf.CodedOutputStream output)\n                        throws java.io.IOException {\n      getSerializedSize();\n      if (((bitField0_ & 0x00000001) == 0x00000001)) {\n        output.writeBytes(1, getNameBytes());\n      }\n      getUnknownFields().writeTo(output);\n    }\n\n    private int memoizedSerializedSize = -1;\n    public int getSerializedSize() {\n      int size = memoizedSerializedSize;\n      if (size != -1) return size;\n\n      size = 0;\n      if (((bitField0_ & 0x00000001) == 0x00000001)) {\n        size += com.google.protobuf.CodedOutputStream\n          .computeBytesSize(1, getNameBytes());\n      }\n      size += getUnknownFields().getSerializedSize();\n      memoizedSerializedSize = size;\n      return size;\n    }\n\n    private static final long serialVersionUID = 0L;\n    @java.lang.Override\n    protected java.lang.Object writeReplace()\n        throws java.io.ObjectStreamException {\n      return super.writeReplace();\n    }\n\n    public static persons.ProtocolBuffer.Person parseFrom(\n        com.google.protobuf.ByteString data)\n        throws com.google.protobuf.InvalidProtocolBufferException {\n      return PARSER.parseFrom(data);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(\n        com.google.protobuf.ByteString data,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws com.google.protobuf.InvalidProtocolBufferException {\n      return PARSER.parseFrom(data, extensionRegistry);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(byte[] data)\n        throws com.google.protobuf.InvalidProtocolBufferException {\n      return PARSER.parseFrom(data);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(\n        byte[] data,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws com.google.protobuf.InvalidProtocolBufferException {\n      return PARSER.parseFrom(data, extensionRegistry);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(java.io.InputStream input)\n        throws java.io.IOException {\n      return PARSER.parseFrom(input);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(\n        java.io.InputStream input,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws java.io.IOException {\n      return PARSER.parseFrom(input, extensionRegistry);\n    }\n    public static persons.ProtocolBuffer.Person parseDelimitedFrom(java.io.InputStream input)\n        throws java.io.IOException {\n      return PARSER.parseDelimitedFrom(input);\n    }\n    public static persons.ProtocolBuffer.Person parseDelimitedFrom(\n        java.io.InputStream input,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws java.io.IOException {\n      return PARSER.parseDelimitedFrom(input, extensionRegistry);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(\n        com.google.protobuf.CodedInputStream input)\n        throws java.io.IOException {\n      return PARSER.parseFrom(input);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(\n        com.google.protobuf.CodedInputStream input,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws java.io.IOException {\n      return PARSER.parseFrom(input, extensionRegistry);\n    }\n\n    public static Builder newBuilder() { return Builder.create(); }\n    public Builder newBuilderForType() { return newBuilder(); }\n    public static Builder newBuilder(persons.ProtocolBuffer.Person prototype) {\n      return newBuilder().mergeFrom(prototype);\n    }\n    public Builder toBuilder() { return newBuilder(this); }\n\n    @java.lang.Override\n    protected Builder newBuilderForType(\n        com.google.protobuf.GeneratedMessage.BuilderParent parent) {\n      Builder builder = new Builder(parent);\n      return builder;\n    }\n    /**\n     * Protobuf type {@code persons.Person}\n     */\n    public static final class Builder extends\n        com.google.protobuf.GeneratedMessage.Builder<Builder>\n       implements persons.ProtocolBuffer.PersonOrBuilder {\n      public static final com.google.protobuf.Descriptors.Descriptor\n          getDescriptor() {\n        return persons.ProtocolBuffer.internal_static_persons_Person_descriptor;\n      }\n\n      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n          internalGetFieldAccessorTable() {\n        return persons.ProtocolBuffer.internal_static_persons_Person_fieldAccessorTable\n            .ensureFieldAccessorsInitialized(\n                persons.ProtocolBuffer.Person.class, persons.ProtocolBuffer.Person.Builder.class);\n      }\n\n      // Construct using persons.ProtocolBuffer.Person.newBuilder()\n      private Builder() {\n        maybeForceBuilderInitialization();\n      }\n\n      private Builder(\n          com.google.protobuf.GeneratedMessage.BuilderParent parent) {\n        super(parent);\n        maybeForceBuilderInitialization();\n      }\n      private void maybeForceBuilderInitialization() {\n        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {\n        }\n      }\n      private static Builder create() {\n        return new Builder();\n      }\n\n      public Builder clear() {\n        super.clear();\n        name_ = \"\";\n        bitField0_ = (bitField0_ & ~0x00000001);\n        return this;\n      }\n\n      public Builder clone() {\n        return create().mergeFrom(buildPartial());\n      }\n\n      public com.google.protobuf.Descriptors.Descriptor\n          getDescriptorForType() {\n        return persons.ProtocolBuffer.internal_static_persons_Person_descriptor;\n      }\n\n      public persons.ProtocolBuffer.Person getDefaultInstanceForType() {\n        return persons.ProtocolBuffer.Person.getDefaultInstance();\n      }\n\n      public persons.ProtocolBuffer.Person build() {\n        persons.ProtocolBuffer.Person result = buildPartial();\n        if (!result.isInitialized()) {\n          throw newUninitializedMessageException(result);\n        }\n        return result;\n      }\n\n      public persons.ProtocolBuffer.Person buildPartial() {\n        persons.ProtocolBuffer.Person result = new persons.ProtocolBuffer.Person(this);\n        int from_bitField0_ = bitField0_;\n        int to_bitField0_ = 0;\n        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {\n          to_bitField0_ |= 0x00000001;\n        }\n        result.name_ = name_;\n        result.bitField0_ = to_bitField0_;\n        onBuilt();\n        return result;\n      }\n\n      public Builder mergeFrom(com.google.protobuf.Message other) {\n        if (other instanceof persons.ProtocolBuffer.Person) {\n          return mergeFrom((persons.ProtocolBuffer.Person)other);\n        } else {\n          super.mergeFrom(other);\n          return this;\n        }\n      }\n\n      public Builder mergeFrom(persons.ProtocolBuffer.Person other) {\n        if (other == persons.ProtocolBuffer.Person.getDefaultInstance()) return this;\n        if (other.hasName()) {\n          bitField0_ |= 0x00000001;\n          name_ = other.name_;\n          onChanged();\n        }\n        this.mergeUnknownFields(other.getUnknownFields());\n        return this;\n      }\n\n      public final boolean isInitialized() {\n        if (!hasName()) {\n          \n          return false;\n        }\n        return true;\n      }\n\n      public Builder mergeFrom(\n          com.google.protobuf.CodedInputStream input,\n          com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n          throws java.io.IOException {\n        persons.ProtocolBuffer.Person parsedMessage = null;\n        try {\n          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);\n        } catch (com.google.protobuf.InvalidProtocolBufferException e) {\n          parsedMessage = (persons.ProtocolBuffer.Person) e.getUnfinishedMessage();\n          throw e;\n        } finally {\n          if (parsedMessage != null) {\n            mergeFrom(parsedMessage);\n          }\n        }\n        return this;\n      }\n      private int bitField0_;\n\n      // required string name = 1;\n      private java.lang.Object name_ = \"\";\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public boolean hasName() {\n        return ((bitField0_ & 0x00000001) == 0x00000001);\n      }\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public java.lang.String getName() {\n        java.lang.Object ref = name_;\n        if (!(ref instanceof java.lang.String)) {\n          java.lang.String s = ((com.google.protobuf.ByteString) ref)\n              .toStringUtf8();\n          name_ = s;\n          return s;\n        } else {\n          return (java.lang.String) ref;\n        }\n      }\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public com.google.protobuf.ByteString\n          getNameBytes() {\n        java.lang.Object ref = name_;\n        if (ref instanceof String) {\n          com.google.protobuf.ByteString b = \n              com.google.protobuf.ByteString.copyFromUtf8(\n                  (java.lang.String) ref);\n          name_ = b;\n          return b;\n        } else {\n          return (com.google.protobuf.ByteString) ref;\n        }\n      }\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public Builder setName(\n          java.lang.String value) {\n        if (value == null) {\n    throw new NullPointerException();\n  }\n  bitField0_ |= 0x00000001;\n        name_ = value;\n        onChanged();\n        return this;\n      }\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public Builder clearName() {\n        bitField0_ = (bitField0_ & ~0x00000001);\n        name_ = getDefaultInstance().getName();\n        onChanged();\n        return this;\n      }\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public Builder setNameBytes(\n          com.google.protobuf.ByteString value) {\n        if (value == null) {\n    throw new NullPointerException();\n  }\n  bitField0_ |= 0x00000001;\n        name_ = value;\n        onChanged();\n        return this;\n      }\n\n      // @@protoc_insertion_point(builder_scope:persons.Person)\n    }\n\n    static {\n      defaultInstance = new Person(true);\n      defaultInstance.initFields();\n    }\n\n    // @@protoc_insertion_point(class_scope:persons.Person)\n  }\n\n  private static com.google.protobuf.Descriptors.Descriptor\n    internal_static_persons_Person_descriptor;\n  private static\n    com.google.protobuf.GeneratedMessage.FieldAccessorTable\n      internal_static_persons_Person_fieldAccessorTable;\n\n  public static com.google.protobuf.Descriptors.FileDescriptor\n      getDescriptor() {\n    return descriptor;\n  }\n  private static com.google.protobuf.Descriptors.FileDescriptor\n      descriptor;\n  static {\n    java.lang.String[] descriptorData = {\n      \"\\n\\025protocol-buffer.proto\\022\\007persons\\\"\\026\\n\\006Pers\" +\n      \"on\\022\\014\\n\\004name\\030\\001 \\002(\\t\"\n    };\n    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =\n      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {\n        public com.google.protobuf.ExtensionRegistry assignDescriptors(\n            com.google.protobuf.Descriptors.FileDescriptor root) {\n          descriptor = root;\n          internal_static_persons_Person_descriptor =\n            getDescriptor().getMessageTypes().get(0);\n          internal_static_persons_Person_fieldAccessorTable = new\n            com.google.protobuf.GeneratedMessage.FieldAccessorTable(\n              internal_static_persons_Person_descriptor,\n              new java.lang.String[] { \"Name\", });\n          return null;\n        }\n      };\n    com.google.protobuf.Descriptors.FileDescriptor\n      .internalBuildGeneratedFileFrom(descriptorData,\n        new com.google.protobuf.Descriptors.FileDescriptor[] {\n        }, assigner);\n  }\n\n  // @@protoc_insertion_point(outer_class_scope)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Java/clojure-type.java",
    "content": "/***\r\n * ASM: a very small and fast Java bytecode manipulation framework\r\n * Copyright (c) 2000-2005 INRIA, France Telecom\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions\r\n * are met:\r\n * 1. Redistributions of source code must retain the above copyright\r\n *    notice, this list of conditions and the following disclaimer.\r\n * 2. Redistributions in binary form must reproduce the above copyright\r\n *    notice, this list of conditions and the following disclaimer in the\r\n *    documentation and/or other materials provided with the distribution.\r\n * 3. Neither the name of the copyright holders nor the names of its\r\n *    contributors may be used to endorse or promote products derived from\r\n *    this software without specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n * THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\npackage clojure.asm;\r\n\r\nimport java.lang.reflect.Constructor;\r\nimport java.lang.reflect.Method;\r\n\r\n/**\r\n * A Java type. This class can be used to make it easier to manipulate type and\r\n * method descriptors.\r\n *\r\n * @author Eric Bruneton\r\n * @author Chris Nokleberg\r\n */\r\npublic class Type{\r\n\r\n/**\r\n * The sort of the <tt>void</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int VOID = 0;\r\n\r\n/**\r\n * The sort of the <tt>boolean</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int BOOLEAN = 1;\r\n\r\n/**\r\n * The sort of the <tt>char</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int CHAR = 2;\r\n\r\n/**\r\n * The sort of the <tt>byte</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int BYTE = 3;\r\n\r\n/**\r\n * The sort of the <tt>short</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int SHORT = 4;\r\n\r\n/**\r\n * The sort of the <tt>int</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int INT = 5;\r\n\r\n/**\r\n * The sort of the <tt>float</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int FLOAT = 6;\r\n\r\n/**\r\n * The sort of the <tt>long</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int LONG = 7;\r\n\r\n/**\r\n * The sort of the <tt>double</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int DOUBLE = 8;\r\n\r\n/**\r\n * The sort of array reference types. See {@link #getSort getSort}.\r\n */\r\npublic final static int ARRAY = 9;\r\n\r\n/**\r\n * The sort of object reference type. See {@link #getSort getSort}.\r\n */\r\npublic final static int OBJECT = 10;\r\n\r\n/**\r\n * The <tt>void</tt> type.\r\n */\r\npublic final static Type VOID_TYPE = new Type(VOID);\r\n\r\n/**\r\n * The <tt>boolean</tt> type.\r\n */\r\npublic final static Type BOOLEAN_TYPE = new Type(BOOLEAN);\r\n\r\n/**\r\n * The <tt>char</tt> type.\r\n */\r\npublic final static Type CHAR_TYPE = new Type(CHAR);\r\n\r\n/**\r\n * The <tt>byte</tt> type.\r\n */\r\npublic final static Type BYTE_TYPE = new Type(BYTE);\r\n\r\n/**\r\n * The <tt>short</tt> type.\r\n */\r\npublic final static Type SHORT_TYPE = new Type(SHORT);\r\n\r\n/**\r\n * The <tt>int</tt> type.\r\n */\r\npublic final static Type INT_TYPE = new Type(INT);\r\n\r\n/**\r\n * The <tt>float</tt> type.\r\n */\r\npublic final static Type FLOAT_TYPE = new Type(FLOAT);\r\n\r\n/**\r\n * The <tt>long</tt> type.\r\n */\r\npublic final static Type LONG_TYPE = new Type(LONG);\r\n\r\n/**\r\n * The <tt>double</tt> type.\r\n */\r\npublic final static Type DOUBLE_TYPE = new Type(DOUBLE);\r\n\r\n// ------------------------------------------------------------------------\r\n// Fields\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * The sort of this Java type.\r\n */\r\nprivate final int sort;\r\n\r\n/**\r\n * A buffer containing the descriptor of this Java type. This field is only\r\n * used for reference types.\r\n */\r\nprivate char[] buf;\r\n\r\n/**\r\n * The offset of the descriptor of this Java type in {@link #buf buf}. This\r\n * field is only used for reference types.\r\n */\r\nprivate int off;\r\n\r\n/**\r\n * The length of the descriptor of this Java type.\r\n */\r\nprivate int len;\r\n\r\n// ------------------------------------------------------------------------\r\n// Constructors\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Constructs a primitive type.\r\n *\r\n * @param sort the sort of the primitive type to be constructed.\r\n */\r\nprivate Type(final int sort){\r\n\tthis.sort = sort;\r\n\tthis.len = 1;\r\n}\r\n\r\n/**\r\n * Constructs a reference type.\r\n *\r\n * @param sort the sort of the reference type to be constructed.\r\n * @param buf  a buffer containing the descriptor of the previous type.\r\n * @param off  the offset of this descriptor in the previous buffer.\r\n * @param len  the length of this descriptor.\r\n */\r\nprivate Type(final int sort, final char[] buf, final int off, final int len){\r\n\tthis.sort = sort;\r\n\tthis.buf = buf;\r\n\tthis.off = off;\r\n\tthis.len = len;\r\n}\r\n\r\n/**\r\n * Returns the Java type corresponding to the given type descriptor.\r\n *\r\n * @param typeDescriptor a type descriptor.\r\n * @return the Java type corresponding to the given type descriptor.\r\n */\r\npublic static Type getType(final String typeDescriptor){\r\n\treturn getType(typeDescriptor.toCharArray(), 0);\r\n}\r\n\r\n/**\r\n * Returns the Java type corresponding to the given class.\r\n *\r\n * @param c a class.\r\n * @return the Java type corresponding to the given class.\r\n */\r\npublic static Type getType(final Class c){\r\n\tif(c.isPrimitive())\r\n\t\t{\r\n\t\tif(c == Integer.TYPE)\r\n\t\t\t{\r\n\t\t\treturn INT_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Void.TYPE)\r\n\t\t\t{\r\n\t\t\treturn VOID_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Boolean.TYPE)\r\n\t\t\t{\r\n\t\t\treturn BOOLEAN_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Byte.TYPE)\r\n\t\t\t{\r\n\t\t\treturn BYTE_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Character.TYPE)\r\n\t\t\t{\r\n\t\t\treturn CHAR_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Short.TYPE)\r\n\t\t\t{\r\n\t\t\treturn SHORT_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Double.TYPE)\r\n\t\t\t{\r\n\t\t\treturn DOUBLE_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Float.TYPE)\r\n\t\t\t{\r\n\t\t\treturn FLOAT_TYPE;\r\n\t\t\t}\r\n\t\telse /* if (c == Long.TYPE) */\r\n\t\t\t{\r\n\t\t\treturn LONG_TYPE;\r\n\t\t\t}\r\n\t\t}\r\n\telse\r\n\t\t{\r\n\t\treturn getType(getDescriptor(c));\r\n\t\t}\r\n}\r\n\r\n/**\r\n * Returns the {@link Type#OBJECT} type for the given internal class name.\r\n * This is a shortcut method for <code>Type.getType(\"L\"+name+\";\")</code>.\r\n * <i>Note that opposed to {@link Type#getType(String)}, this method takes\r\n * internal class names and not class descriptor.</i>\r\n *\r\n * @param name an internal class name.\r\n * @return the the {@link Type#OBJECT} type for the given class name.\r\n */\r\npublic static Type getObjectType(String name){\r\n\tint l = name.length();\r\n\tchar[] buf = new char[l + 2];\r\n\tbuf[0] = 'L';\r\n\tbuf[l + 1] = ';';\r\n\tname.getChars(0, l, buf, 1);\r\n\treturn new Type(OBJECT, buf, 0, l + 2);\r\n}\r\n\r\n/**\r\n * Returns the Java types corresponding to the argument types of the given\r\n * method descriptor.\r\n *\r\n * @param methodDescriptor a method descriptor.\r\n * @return the Java types corresponding to the argument types of the given\r\n *         method descriptor.\r\n */\r\npublic static Type[] getArgumentTypes(final String methodDescriptor){\r\n\tchar[] buf = methodDescriptor.toCharArray();\r\n\tint off = 1;\r\n\tint size = 0;\r\n\twhile(true)\r\n\t\t{\r\n\t\tchar car = buf[off++];\r\n\t\tif(car == ')')\r\n\t\t\t{\r\n\t\t\tbreak;\r\n\t\t\t}\r\n\t\telse if(car == 'L')\r\n\t\t\t{\r\n\t\t\twhile(buf[off++] != ';')\r\n\t\t\t\t{\r\n\t\t\t\t}\r\n\t\t\t++size;\r\n\t\t\t}\r\n\t\telse if(car != '[')\r\n\t\t\t{\r\n\t\t\t++size;\r\n\t\t\t}\r\n\t\t}\r\n\tType[] args = new Type[size];\r\n\toff = 1;\r\n\tsize = 0;\r\n\twhile(buf[off] != ')')\r\n\t\t{\r\n\t\targs[size] = getType(buf, off);\r\n\t\toff += args[size].len;\r\n\t\tsize += 1;\r\n\t\t}\r\n\treturn args;\r\n}\r\n\r\n/**\r\n * Returns the Java types corresponding to the argument types of the given\r\n * method.\r\n *\r\n * @param method a method.\r\n * @return the Java types corresponding to the argument types of the given\r\n *         method.\r\n */\r\npublic static Type[] getArgumentTypes(final Method method){\r\n\tClass[] classes = method.getParameterTypes();\r\n\tType[] types = new Type[classes.length];\r\n\tfor(int i = classes.length - 1; i >= 0; --i)\r\n\t\t{\r\n\t\ttypes[i] = getType(classes[i]);\r\n\t\t}\r\n\treturn types;\r\n}\r\n\r\n/**\r\n * Returns the Java type corresponding to the return type of the given\r\n * method descriptor.\r\n *\r\n * @param methodDescriptor a method descriptor.\r\n * @return the Java type corresponding to the return type of the given\r\n *         method descriptor.\r\n */\r\npublic static Type getReturnType(final String methodDescriptor){\r\n\tchar[] buf = methodDescriptor.toCharArray();\r\n\treturn getType(buf, methodDescriptor.indexOf(')') + 1);\r\n}\r\n\r\n/**\r\n * Returns the Java type corresponding to the return type of the given\r\n * method.\r\n *\r\n * @param method a method.\r\n * @return the Java type corresponding to the return type of the given\r\n *         method.\r\n */\r\npublic static Type getReturnType(final Method method){\r\n\treturn getType(method.getReturnType());\r\n}\r\n\r\n/**\r\n * Returns the Java type corresponding to the given type descriptor.\r\n *\r\n * @param buf a buffer containing a type descriptor.\r\n * @param off the offset of this descriptor in the previous buffer.\r\n * @return the Java type corresponding to the given type descriptor.\r\n */\r\nprivate static Type getType(final char[] buf, final int off){\r\n\tint len;\r\n\tswitch(buf[off])\r\n\t\t{\r\n\t\tcase'V':\r\n\t\t\treturn VOID_TYPE;\r\n\t\tcase'Z':\r\n\t\t\treturn BOOLEAN_TYPE;\r\n\t\tcase'C':\r\n\t\t\treturn CHAR_TYPE;\r\n\t\tcase'B':\r\n\t\t\treturn BYTE_TYPE;\r\n\t\tcase'S':\r\n\t\t\treturn SHORT_TYPE;\r\n\t\tcase'I':\r\n\t\t\treturn INT_TYPE;\r\n\t\tcase'F':\r\n\t\t\treturn FLOAT_TYPE;\r\n\t\tcase'J':\r\n\t\t\treturn LONG_TYPE;\r\n\t\tcase'D':\r\n\t\t\treturn DOUBLE_TYPE;\r\n\t\tcase'[':\r\n\t\t\tlen = 1;\r\n\t\t\twhile(buf[off + len] == '[')\r\n\t\t\t\t{\r\n\t\t\t\t++len;\r\n\t\t\t\t}\r\n\t\t\tif(buf[off + len] == 'L')\r\n\t\t\t\t{\r\n\t\t\t\t++len;\r\n\t\t\t\twhile(buf[off + len] != ';')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t++len;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\treturn new Type(ARRAY, buf, off, len + 1);\r\n\t\t\t// case 'L':\r\n\t\tdefault:\r\n\t\t\tlen = 1;\r\n\t\t\twhile(buf[off + len] != ';')\r\n\t\t\t\t{\r\n\t\t\t\t++len;\r\n\t\t\t\t}\r\n\t\t\treturn new Type(OBJECT, buf, off, len + 1);\r\n\t\t}\r\n}\r\n\r\n// ------------------------------------------------------------------------\r\n// Accessors\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Returns the sort of this Java type.\r\n *\r\n * @return {@link #VOID VOID}, {@link #BOOLEAN BOOLEAN},\r\n *         {@link #CHAR CHAR}, {@link #BYTE BYTE}, {@link #SHORT SHORT},\r\n *         {@link #INT INT}, {@link #FLOAT FLOAT}, {@link #LONG LONG},\r\n *         {@link #DOUBLE DOUBLE}, {@link #ARRAY ARRAY} or\r\n *         {@link #OBJECT OBJECT}.\r\n */\r\npublic int getSort(){\r\n\treturn sort;\r\n}\r\n\r\n/**\r\n * Returns the number of dimensions of this array type. This method should\r\n * only be used for an array type.\r\n *\r\n * @return the number of dimensions of this array type.\r\n */\r\npublic int getDimensions(){\r\n\tint i = 1;\r\n\twhile(buf[off + i] == '[')\r\n\t\t{\r\n\t\t++i;\r\n\t\t}\r\n\treturn i;\r\n}\r\n\r\n/**\r\n * Returns the type of the elements of this array type. This method should\r\n * only be used for an array type.\r\n *\r\n * @return Returns the type of the elements of this array type.\r\n */\r\npublic Type getElementType(){\r\n\treturn getType(buf, off + getDimensions());\r\n}\r\n\r\n/**\r\n * Returns the name of the class corresponding to this type.\r\n *\r\n * @return the fully qualified name of the class corresponding to this type.\r\n */\r\npublic String getClassName(){\r\n\tswitch(sort)\r\n\t\t{\r\n\t\tcase VOID:\r\n\t\t\treturn \"void\";\r\n\t\tcase BOOLEAN:\r\n\t\t\treturn \"boolean\";\r\n\t\tcase CHAR:\r\n\t\t\treturn \"char\";\r\n\t\tcase BYTE:\r\n\t\t\treturn \"byte\";\r\n\t\tcase SHORT:\r\n\t\t\treturn \"short\";\r\n\t\tcase INT:\r\n\t\t\treturn \"int\";\r\n\t\tcase FLOAT:\r\n\t\t\treturn \"float\";\r\n\t\tcase LONG:\r\n\t\t\treturn \"long\";\r\n\t\tcase DOUBLE:\r\n\t\t\treturn \"double\";\r\n\t\tcase ARRAY:\r\n\t\t\tStringBuffer b = new StringBuffer(getElementType().getClassName());\r\n\t\t\tfor(int i = getDimensions(); i > 0; --i)\r\n\t\t\t\t{\r\n\t\t\t\tb.append(\"[]\");\r\n\t\t\t\t}\r\n\t\t\treturn b.toString();\r\n\t\t\t// case OBJECT:\r\n\t\tdefault:\r\n\t\t\treturn new String(buf, off + 1, len - 2).replace('/', '.');\r\n\t\t}\r\n}\r\n\r\n/**\r\n * Returns the internal name of the class corresponding to this object type.\r\n * The internal name of a class is its fully qualified name, where '.' are\r\n * replaced by '/'. This method should only be used for an object type.\r\n *\r\n * @return the internal name of the class corresponding to this object type.\r\n */\r\npublic String getInternalName(){\r\n\treturn new String(buf, off + 1, len - 2);\r\n}\r\n\r\n// ------------------------------------------------------------------------\r\n// Conversion to type descriptors\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Returns the descriptor corresponding to this Java type.\r\n *\r\n * @return the descriptor corresponding to this Java type.\r\n */\r\npublic String getDescriptor(){\r\n\tStringBuffer buf = new StringBuffer();\r\n\tgetDescriptor(buf);\r\n\treturn buf.toString();\r\n}\r\n\r\n/**\r\n * Returns the descriptor corresponding to the given argument and return\r\n * types.\r\n *\r\n * @param returnType    the return type of the method.\r\n * @param argumentTypes the argument types of the method.\r\n * @return the descriptor corresponding to the given argument and return\r\n *         types.\r\n */\r\npublic static String getMethodDescriptor(\r\n\t\tfinal Type returnType,\r\n\t\tfinal Type[] argumentTypes){\r\n\tStringBuffer buf = new StringBuffer();\r\n\tbuf.append('(');\r\n\tfor(int i = 0; i < argumentTypes.length; ++i)\r\n\t\t{\r\n\t\targumentTypes[i].getDescriptor(buf);\r\n\t\t}\r\n\tbuf.append(')');\r\n\treturnType.getDescriptor(buf);\r\n\treturn buf.toString();\r\n}\r\n\r\n/**\r\n * Appends the descriptor corresponding to this Java type to the given\r\n * string buffer.\r\n *\r\n * @param buf the string buffer to which the descriptor must be appended.\r\n */\r\nprivate void getDescriptor(final StringBuffer buf){\r\n\tswitch(sort)\r\n\t\t{\r\n\t\tcase VOID:\r\n\t\t\tbuf.append('V');\r\n\t\t\treturn;\r\n\t\tcase BOOLEAN:\r\n\t\t\tbuf.append('Z');\r\n\t\t\treturn;\r\n\t\tcase CHAR:\r\n\t\t\tbuf.append('C');\r\n\t\t\treturn;\r\n\t\tcase BYTE:\r\n\t\t\tbuf.append('B');\r\n\t\t\treturn;\r\n\t\tcase SHORT:\r\n\t\t\tbuf.append('S');\r\n\t\t\treturn;\r\n\t\tcase INT:\r\n\t\t\tbuf.append('I');\r\n\t\t\treturn;\r\n\t\tcase FLOAT:\r\n\t\t\tbuf.append('F');\r\n\t\t\treturn;\r\n\t\tcase LONG:\r\n\t\t\tbuf.append('J');\r\n\t\t\treturn;\r\n\t\tcase DOUBLE:\r\n\t\t\tbuf.append('D');\r\n\t\t\treturn;\r\n\t\t\t// case ARRAY:\r\n\t\t\t// case OBJECT:\r\n\t\tdefault:\r\n\t\t\tbuf.append(this.buf, off, len);\r\n\t\t}\r\n}\r\n\r\n// ------------------------------------------------------------------------\r\n// Direct conversion from classes to type descriptors,\r\n// without intermediate Type objects\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Returns the internal name of the given class. The internal name of a\r\n * class is its fully qualified name, where '.' are replaced by '/'.\r\n *\r\n * @param c an object class.\r\n * @return the internal name of the given class.\r\n */\r\npublic static String getInternalName(final Class c){\r\n\treturn c.getName().replace('.', '/');\r\n}\r\n\r\n/**\r\n * Returns the descriptor corresponding to the given Java type.\r\n *\r\n * @param c an object class, a primitive class or an array class.\r\n * @return the descriptor corresponding to the given class.\r\n */\r\npublic static String getDescriptor(final Class c){\r\n\tStringBuffer buf = new StringBuffer();\r\n\tgetDescriptor(buf, c);\r\n\treturn buf.toString();\r\n}\r\n\r\n/**\r\n * Returns the descriptor corresponding to the given constructor.\r\n *\r\n * @param c a {@link Constructor Constructor} object.\r\n * @return the descriptor of the given constructor.\r\n */\r\npublic static String getConstructorDescriptor(final Constructor c){\r\n\tClass[] parameters = c.getParameterTypes();\r\n\tStringBuffer buf = new StringBuffer();\r\n\tbuf.append('(');\r\n\tfor(int i = 0; i < parameters.length; ++i)\r\n\t\t{\r\n\t\tgetDescriptor(buf, parameters[i]);\r\n\t\t}\r\n\treturn buf.append(\")V\").toString();\r\n}\r\n\r\n/**\r\n * Returns the descriptor corresponding to the given method.\r\n *\r\n * @param m a {@link Method Method} object.\r\n * @return the descriptor of the given method.\r\n */\r\npublic static String getMethodDescriptor(final Method m){\r\n\tClass[] parameters = m.getParameterTypes();\r\n\tStringBuffer buf = new StringBuffer();\r\n\tbuf.append('(');\r\n\tfor(int i = 0; i < parameters.length; ++i)\r\n\t\t{\r\n\t\tgetDescriptor(buf, parameters[i]);\r\n\t\t}\r\n\tbuf.append(')');\r\n\tgetDescriptor(buf, m.getReturnType());\r\n\treturn buf.toString();\r\n}\r\n\r\n/**\r\n * Appends the descriptor of the given class to the given string buffer.\r\n *\r\n * @param buf the string buffer to which the descriptor must be appended.\r\n * @param c   the class whose descriptor must be computed.\r\n */\r\nprivate static void getDescriptor(final StringBuffer buf, final Class c){\r\n\tClass d = c;\r\n\twhile(true)\r\n\t\t{\r\n\t\tif(d.isPrimitive())\r\n\t\t\t{\r\n\t\t\tchar car;\r\n\t\t\tif(d == Integer.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'I';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Void.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'V';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Boolean.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'Z';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Byte.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'B';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Character.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'C';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Short.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'S';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Double.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'D';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Float.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'F';\r\n\t\t\t\t}\r\n\t\t\telse /* if (d == Long.TYPE) */\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'J';\r\n\t\t\t\t}\r\n\t\t\tbuf.append(car);\r\n\t\t\treturn;\r\n\t\t\t}\r\n\t\telse if(d.isArray())\r\n\t\t\t{\r\n\t\t\tbuf.append('[');\r\n\t\t\td = d.getComponentType();\r\n\t\t\t}\r\n\t\telse\r\n\t\t\t{\r\n\t\t\tbuf.append('L');\r\n\t\t\tString name = d.getName();\r\n\t\t\tint len = name.length();\r\n\t\t\tfor(int i = 0; i < len; ++i)\r\n\t\t\t\t{\r\n\t\t\t\tchar car = name.charAt(i);\r\n\t\t\t\tbuf.append(car == '.' ? '/' : car);\r\n\t\t\t\t}\r\n\t\t\tbuf.append(';');\r\n\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n}\r\n\r\n// ------------------------------------------------------------------------\r\n// Corresponding size and opcodes\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Returns the size of values of this type.\r\n *\r\n * @return the size of values of this type, i.e., 2 for <tt>long</tt> and\r\n *         <tt>double</tt>, and 1 otherwise.\r\n */\r\npublic int getSize(){\r\n\treturn sort == LONG || sort == DOUBLE ? 2 : 1;\r\n}\r\n\r\n/**\r\n * Returns a JVM instruction opcode adapted to this Java type.\r\n *\r\n * @param opcode a JVM instruction opcode. This opcode must be one of ILOAD,\r\n *               ISTORE, IALOAD, IASTORE, IADD, ISUB, IMUL, IDIV, IREM, INEG, ISHL,\r\n *               ISHR, IUSHR, IAND, IOR, IXOR and IRETURN.\r\n * @return an opcode that is similar to the given opcode, but adapted to\r\n *         this Java type. For example, if this type is <tt>float</tt> and\r\n *         <tt>opcode</tt> is IRETURN, this method returns FRETURN.\r\n */\r\npublic int getOpcode(final int opcode){\r\n\tif(opcode == Opcodes.IALOAD || opcode == Opcodes.IASTORE)\r\n\t\t{\r\n\t\tswitch(sort)\r\n\t\t\t{\r\n\t\t\tcase BOOLEAN:\r\n\t\t\tcase BYTE:\r\n\t\t\t\treturn opcode + 5;\r\n\t\t\tcase CHAR:\r\n\t\t\t\treturn opcode + 6;\r\n\t\t\tcase SHORT:\r\n\t\t\t\treturn opcode + 7;\r\n\t\t\tcase INT:\r\n\t\t\t\treturn opcode;\r\n\t\t\tcase FLOAT:\r\n\t\t\t\treturn opcode + 2;\r\n\t\t\tcase LONG:\r\n\t\t\t\treturn opcode + 1;\r\n\t\t\tcase DOUBLE:\r\n\t\t\t\treturn opcode + 3;\r\n\t\t\t\t// case ARRAY:\r\n\t\t\t\t// case OBJECT:\r\n\t\t\tdefault:\r\n\t\t\t\treturn opcode + 4;\r\n\t\t\t}\r\n\t\t}\r\n\telse\r\n\t\t{\r\n\t\tswitch(sort)\r\n\t\t\t{\r\n\t\t\tcase VOID:\r\n\t\t\t\treturn opcode + 5;\r\n\t\t\tcase BOOLEAN:\r\n\t\t\tcase CHAR:\r\n\t\t\tcase BYTE:\r\n\t\t\tcase SHORT:\r\n\t\t\tcase INT:\r\n\t\t\t\treturn opcode;\r\n\t\t\tcase FLOAT:\r\n\t\t\t\treturn opcode + 2;\r\n\t\t\tcase LONG:\r\n\t\t\t\treturn opcode + 1;\r\n\t\t\tcase DOUBLE:\r\n\t\t\t\treturn opcode + 3;\r\n\t\t\t\t// case ARRAY:\r\n\t\t\t\t// case OBJECT:\r\n\t\t\tdefault:\r\n\t\t\t\treturn opcode + 4;\r\n\t\t\t}\r\n\t\t}\r\n}\r\n\r\n// ------------------------------------------------------------------------\r\n// Equals, hashCode and toString\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Tests if the given object is equal to this type.\r\n *\r\n * @param o the object to be compared to this type.\r\n * @return <tt>true</tt> if the given object is equal to this type.\r\n */\r\npublic boolean equals(final Object o){\r\n\tif(this == o)\r\n\t\t{\r\n\t\treturn true;\r\n\t\t}\r\n\tif(!(o instanceof Type))\r\n\t\t{\r\n\t\treturn false;\r\n\t\t}\r\n\tType t = (Type) o;\r\n\tif(sort != t.sort)\r\n\t\t{\r\n\t\treturn false;\r\n\t\t}\r\n\tif(sort == Type.OBJECT || sort == Type.ARRAY)\r\n\t\t{\r\n\t\tif(len != t.len)\r\n\t\t\t{\r\n\t\t\treturn false;\r\n\t\t\t}\r\n\t\tfor(int i = off, j = t.off, end = i + len; i < end; i++, j++)\r\n\t\t\t{\r\n\t\t\tif(buf[i] != t.buf[j])\r\n\t\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\treturn true;\r\n}\r\n\r\n/**\r\n * Returns a hash code value for this type.\r\n *\r\n * @return a hash code value for this type.\r\n */\r\npublic int hashCode(){\r\n\tint hc = 13 * sort;\r\n\tif(sort == Type.OBJECT || sort == Type.ARRAY)\r\n\t\t{\r\n\t\tfor(int i = off, end = i + len; i < end; i++)\r\n\t\t\t{\r\n\t\t\thc = 17 * (hc + buf[i]);\r\n\t\t\t}\r\n\t\t}\r\n\treturn hc;\r\n}\r\n\r\n/**\r\n * Returns a string representation of this type.\r\n *\r\n * @return the descriptor of this type.\r\n */\r\npublic String toString(){\r\n\treturn getDescriptor();\r\n}\r\n}\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Java/clojure-util.java",
    "content": "/**\n *   Copyright (c) Rich Hickey. All rights reserved.\n *   The use and distribution terms for this software are covered by the\n *   Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)\n *   which can be found in the file epl-v10.html at the root of this distribution.\n *   By using this software in any fashion, you are agreeing to be bound by\n * \t the terms of this license.\n *   You must not remove this notice, or any other, from this software.\n **/\n\n/* rich Apr 19, 2008 */\n\npackage clojure.lang;\n\nimport java.lang.ref.Reference;\nimport java.math.BigInteger;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.lang.ref.SoftReference;\nimport java.lang.ref.ReferenceQueue;\n\npublic class Util{\nstatic public boolean equiv(Object k1, Object k2){\n\tif(k1 == k2)\n\t\treturn true;\n\tif(k1 != null)\n\t\t{\n\t\tif(k1 instanceof Number && k2 instanceof Number)\n\t\t\treturn Numbers.equal((Number)k1, (Number)k2);\n\t\telse if(k1 instanceof IPersistentCollection || k2 instanceof IPersistentCollection)\n\t\t\treturn pcequiv(k1,k2);\n\t\treturn k1.equals(k2);\n\t\t}\n\treturn false;\n}\n\nstatic public boolean equiv(long k1, long k2){\n\treturn k1 == k2;\n}\n\nstatic public boolean equiv(Object k1, long k2){\n\treturn equiv(k1, (Object)k2);\n}\n\nstatic public boolean equiv(long k1, Object k2){\n\treturn equiv((Object)k1, k2);\n}\n\nstatic public boolean equiv(double k1, double k2){\n\treturn k1 == k2;\n}\n\nstatic public boolean equiv(Object k1, double k2){\n\treturn equiv(k1, (Object)k2);\n}\n\nstatic public boolean equiv(double k1, Object k2){\n\treturn equiv((Object)k1, k2);\n}\n\nstatic public boolean equiv(boolean k1, boolean k2){\n\treturn k1 == k2;\n}\n\nstatic public boolean equiv(Object k1, boolean k2){\n\treturn equiv(k1, (Object)k2);\n}\n\nstatic public boolean equiv(boolean k1, Object k2){\n\treturn equiv((Object)k1, k2);\n}\n\nstatic public boolean equiv(char c1, char c2) {\n    return c1 == c2;\n}\n\nstatic public boolean pcequiv(Object k1, Object k2){\n\tif(k1 instanceof IPersistentCollection)\n\t\treturn ((IPersistentCollection)k1).equiv(k2);\n\treturn ((IPersistentCollection)k2).equiv(k1);\n}\n\nstatic public boolean equals(Object k1, Object k2){\n\tif(k1 == k2)\n\t\treturn true;\n\treturn k1 != null && k1.equals(k2);\n}\n\nstatic public boolean identical(Object k1, Object k2){\n\treturn k1 == k2;\n}\n\nstatic public Class classOf(Object x){\n\tif(x != null)\n\t\treturn x.getClass();\n\treturn null;\n}\n\nstatic public int compare(Object k1, Object k2){\n\tif(k1 == k2)\n\t\treturn 0;\n\tif(k1 != null)\n\t\t{\n\t\tif(k2 == null)\n\t\t\treturn 1;\n\t\tif(k1 instanceof Number)\n\t\t\treturn Numbers.compare((Number) k1, (Number) k2);\n\t\treturn ((Comparable) k1).compareTo(k2);\n\t\t}\n\treturn -1;\n}\n\nstatic public int hash(Object o){\n\tif(o == null)\n\t\treturn 0;\n\treturn o.hashCode();\n}\n\nstatic public int hasheq(Object o){\n\tif(o == null)\n\t\treturn 0;\n\tif(o instanceof Number)\n\t\treturn Numbers.hasheq((Number)o);\n\telse if(o instanceof IHashEq)\n\t\treturn ((IHashEq)o).hasheq();\n\treturn o.hashCode();\n}\n\nstatic public int hashCombine(int seed, int hash){\n\t//a la boost\n\tseed ^= hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);\n\treturn seed;\n}\n\nstatic public boolean isPrimitive(Class c){\n\treturn c != null && c.isPrimitive() && !(c == Void.TYPE);\n}\n\nstatic public boolean isInteger(Object x){\n\treturn x instanceof Integer\n\t\t\t|| x instanceof Long\n\t        || x instanceof BigInt\n\t\t\t|| x instanceof BigInteger;\n}\n\nstatic public Object ret1(Object ret, Object nil){\n\t\treturn ret;\n}\n\nstatic public ISeq ret1(ISeq ret, Object nil){\n\t\treturn ret;\n}\n\nstatic public <K,V> void clearCache(ReferenceQueue rq, ConcurrentHashMap<K, Reference<V>> cache){\n\t\t//cleanup any dead entries\n\tif(rq.poll() != null)\n\t\t{\n\t\twhile(rq.poll() != null)\n\t\t\t;\n\t\tfor(Map.Entry<K, Reference<V>> e : cache.entrySet())\n\t\t\t{\n            Reference<V> val = e.getValue();\n\t\t\tif(val != null && val.get() == null)\n\t\t\t\tcache.remove(e.getKey(), val);\n\t\t\t}\n\t\t}\n}\n\nstatic public RuntimeException runtimeException(String s){\n\treturn new RuntimeException(s);\n}\n\nstatic public RuntimeException runtimeException(String s, Throwable e){\n\treturn new RuntimeException(s, e);\n}\n\n/**\n * Throw even checked exceptions without being required\n * to declare them or catch them. Suggested idiom:\n * <p>\n * <code>throw sneakyThrow( some exception );</code>\n */\nstatic public RuntimeException sneakyThrow(Throwable t) {\n    // http://www.mail-archive.com/javaposse@googlegroups.com/msg05984.html\n\tif (t == null)\n\t\tthrow new NullPointerException();\n\tUtil.<RuntimeException>sneakyThrow0(t);\n\treturn null;\n}\n\n@SuppressWarnings(\"unchecked\")\nstatic private <T extends Throwable> void sneakyThrow0(Throwable t) throws T {\n\tthrow (T) t;\n}\n\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Java/gen-java-linguist-thrift.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (1.0.0-dev)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\nimport org.apache.thrift.scheme.IScheme;\nimport org.apache.thrift.scheme.SchemeFactory;\nimport org.apache.thrift.scheme.StandardScheme;\n\nimport org.apache.thrift.scheme.TupleScheme;\nimport org.apache.thrift.protocol.TTupleProtocol;\nimport org.apache.thrift.protocol.TProtocolException;\nimport org.apache.thrift.EncodingUtils;\nimport org.apache.thrift.TException;\nimport org.apache.thrift.async.AsyncMethodCallback;\nimport org.apache.thrift.server.AbstractNonblockingServer.*;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.util.HashMap;\nimport java.util.EnumMap;\nimport java.util.Set;\nimport java.util.HashSet;\nimport java.util.EnumSet;\nimport java.util.Collections;\nimport java.util.BitSet;\nimport java.nio.ByteBuffer;\nimport java.util.Arrays;\nimport javax.annotation.Generated;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\"})\n@Generated(value = \"Autogenerated by Thrift Compiler (1.0.0-dev)\", date = \"2015-5-12\")\npublic class PullRequest implements org.apache.thrift.TBase<PullRequest, PullRequest._Fields>, java.io.Serializable, Cloneable, Comparable<PullRequest> {\n  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"PullRequest\");\n\n  private static final org.apache.thrift.protocol.TField TITLE_FIELD_DESC = new org.apache.thrift.protocol.TField(\"title\", org.apache.thrift.protocol.TType.STRING, (short)1);\n\n  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();\n  static {\n    schemes.put(StandardScheme.class, new PullRequestStandardSchemeFactory());\n    schemes.put(TupleScheme.class, new PullRequestTupleSchemeFactory());\n  }\n\n  public String title; // required\n\n  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n  public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n    TITLE((short)1, \"title\");\n\n    private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();\n\n    static {\n      for (_Fields field : EnumSet.allOf(_Fields.class)) {\n        byName.put(field.getFieldName(), field);\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, or null if its not found.\n     */\n    public static _Fields findByThriftId(int fieldId) {\n      switch(fieldId) {\n        case 1: // TITLE\n          return TITLE;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, throwing an exception\n     * if it is not found.\n     */\n    public static _Fields findByThriftIdOrThrow(int fieldId) {\n      _Fields fields = findByThriftId(fieldId);\n      if (fields == null) throw new IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n      return fields;\n    }\n\n    /**\n     * Find the _Fields constant that matches name, or null if its not found.\n     */\n    public static _Fields findByName(String name) {\n      return byName.get(name);\n    }\n\n    private final short _thriftId;\n    private final String _fieldName;\n\n    _Fields(short thriftId, String fieldName) {\n      _thriftId = thriftId;\n      _fieldName = fieldName;\n    }\n\n    public short getThriftFieldId() {\n      return _thriftId;\n    }\n\n    public String getFieldName() {\n      return _fieldName;\n    }\n  }\n\n  // isset id assignments\n  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n  static {\n    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n    tmpMap.put(_Fields.TITLE, new org.apache.thrift.meta_data.FieldMetaData(\"title\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    metaDataMap = Collections.unmodifiableMap(tmpMap);\n    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(PullRequest.class, metaDataMap);\n  }\n\n  public PullRequest() {\n  }\n\n  public PullRequest(\n    String title)\n  {\n    this();\n    this.title = title;\n  }\n\n  /**\n   * Performs a deep copy on <i>other</i>.\n   */\n  public PullRequest(PullRequest other) {\n    if (other.isSetTitle()) {\n      this.title = other.title;\n    }\n  }\n\n  public PullRequest deepCopy() {\n    return new PullRequest(this);\n  }\n\n  @Override\n  public void clear() {\n    this.title = null;\n  }\n\n  public String getTitle() {\n    return this.title;\n  }\n\n  public PullRequest setTitle(String title) {\n    this.title = title;\n    return this;\n  }\n\n  public void unsetTitle() {\n    this.title = null;\n  }\n\n  /** Returns true if field title is set (has been assigned a value) and false otherwise */\n  public boolean isSetTitle() {\n    return this.title != null;\n  }\n\n  public void setTitleIsSet(boolean value) {\n    if (!value) {\n      this.title = null;\n    }\n  }\n\n  public void setFieldValue(_Fields field, Object value) {\n    switch (field) {\n    case TITLE:\n      if (value == null) {\n        unsetTitle();\n      } else {\n        setTitle((String)value);\n      }\n      break;\n\n    }\n  }\n\n  public Object getFieldValue(_Fields field) {\n    switch (field) {\n    case TITLE:\n      return getTitle();\n\n    }\n    throw new IllegalStateException();\n  }\n\n  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n  public boolean isSet(_Fields field) {\n    if (field == null) {\n      throw new IllegalArgumentException();\n    }\n\n    switch (field) {\n    case TITLE:\n      return isSetTitle();\n    }\n    throw new IllegalStateException();\n  }\n\n  @Override\n  public boolean equals(Object that) {\n    if (that == null)\n      return false;\n    if (that instanceof PullRequest)\n      return this.equals((PullRequest)that);\n    return false;\n  }\n\n  public boolean equals(PullRequest that) {\n    if (that == null)\n      return false;\n\n    boolean this_present_title = true && this.isSetTitle();\n    boolean that_present_title = true && that.isSetTitle();\n    if (this_present_title || that_present_title) {\n      if (!(this_present_title && that_present_title))\n        return false;\n      if (!this.title.equals(that.title))\n        return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  public int hashCode() {\n    List<Object> list = new ArrayList<Object>();\n\n    boolean present_title = true && (isSetTitle());\n    list.add(present_title);\n    if (present_title)\n      list.add(title);\n\n    return list.hashCode();\n  }\n\n  @Override\n  public int compareTo(PullRequest other) {\n    if (!getClass().equals(other.getClass())) {\n      return getClass().getName().compareTo(other.getClass().getName());\n    }\n\n    int lastComparison = 0;\n\n    lastComparison = Boolean.valueOf(isSetTitle()).compareTo(other.isSetTitle());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetTitle()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.title, other.title);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    return 0;\n  }\n\n  public _Fields fieldForId(int fieldId) {\n    return _Fields.findByThriftId(fieldId);\n  }\n\n  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);\n  }\n\n  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);\n  }\n\n  @Override\n  public String toString() {\n    StringBuilder sb = new StringBuilder(\"PullRequest(\");\n    boolean first = true;\n\n    sb.append(\"title:\");\n    if (this.title == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.title);\n    }\n    first = false;\n    sb.append(\")\");\n    return sb.toString();\n  }\n\n  public void validate() throws org.apache.thrift.TException {\n    // check for required fields\n    // check for sub-struct validity\n  }\n\n  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n    try {\n      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {\n    try {\n      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private static class PullRequestStandardSchemeFactory implements SchemeFactory {\n    public PullRequestStandardScheme getScheme() {\n      return new PullRequestStandardScheme();\n    }\n  }\n\n  private static class PullRequestStandardScheme extends StandardScheme<PullRequest> {\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot, PullRequest struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TField schemeField;\n      iprot.readStructBegin();\n      while (true)\n      {\n        schemeField = iprot.readFieldBegin();\n        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n          break;\n        }\n        switch (schemeField.id) {\n          case 1: // TITLE\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.title = iprot.readString();\n              struct.setTitleIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          default:\n            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n        }\n        iprot.readFieldEnd();\n      }\n      iprot.readStructEnd();\n\n      // check for required fields of primitive type, which can't be checked in the validate method\n      struct.validate();\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot, PullRequest struct) throws org.apache.thrift.TException {\n      struct.validate();\n\n      oprot.writeStructBegin(STRUCT_DESC);\n      if (struct.title != null) {\n        oprot.writeFieldBegin(TITLE_FIELD_DESC);\n        oprot.writeString(struct.title);\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldStop();\n      oprot.writeStructEnd();\n    }\n\n  }\n\n  private static class PullRequestTupleSchemeFactory implements SchemeFactory {\n    public PullRequestTupleScheme getScheme() {\n      return new PullRequestTupleScheme();\n    }\n  }\n\n  private static class PullRequestTupleScheme extends TupleScheme<PullRequest> {\n\n    @Override\n    public void write(org.apache.thrift.protocol.TProtocol prot, PullRequest struct) throws org.apache.thrift.TException {\n      TTupleProtocol oprot = (TTupleProtocol) prot;\n      BitSet optionals = new BitSet();\n      if (struct.isSetTitle()) {\n        optionals.set(0);\n      }\n      oprot.writeBitSet(optionals, 1);\n      if (struct.isSetTitle()) {\n        oprot.writeString(struct.title);\n      }\n    }\n\n    @Override\n    public void read(org.apache.thrift.protocol.TProtocol prot, PullRequest struct) throws org.apache.thrift.TException {\n      TTupleProtocol iprot = (TTupleProtocol) prot;\n      BitSet incoming = iprot.readBitSet(1);\n      if (incoming.get(0)) {\n        struct.title = iprot.readString();\n        struct.setTitleIsSet(true);\n      }\n    }\n  }\n\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/axios.es",
    "content": "import axios from \"axios\";\n\nexport default {\n\tasync getIndex(prefix) {\n\t\tconst {data} = await axios.get((prefix || \"\") + \"/index.json\");\n\t\treturn data;\n\t},\n\t\n\tasync getContent(path, prefix) {\n\t\tconst {data} = await axios.get((prefix || \"\") + \"/\" + path + \".json\");\n\t\treturn data;\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/basic.svelte",
    "content": "<script>\n  import { onMount } from 'svelte';\n  export let param;\n  onMount(() => console.log('App ready ' + param));\n</script>\n\n<style>\n  .my_div {\n    background-color: red;\n  }\n</style>\n\n<div class='my_div'>\n</div>"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/basic.vue",
    "content": "<style>\n.red {\n  color: #f00;\n}\n</style>\n\n<template>\n<div>\n  <h2 v-class=\"red\">{{msg}}</h2>\n</div>\n</template>\n\n<script>\nmodule.exports = {\n  data: function () {\n    return {\n      msg: 'Hello from Vue!'\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/bootstrap-modal.js",
    "content": "/* =========================================================\n * bootstrap-modal.js v2.0.4\n * http://twitter.github.com/bootstrap/javascript.html#modals\n * =========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* MODAL CLASS DEFINITION\n  * ====================== */\n\n  var Modal = function (content, options) {\n    this.options = options\n    this.$element = $(content)\n      .delegate('[data-dismiss=\"modal\"]', 'click.dismiss.modal', $.proxy(this.hide, this))\n  }\n\n  Modal.prototype = {\n\n      constructor: Modal\n\n    , toggle: function () {\n        return this[!this.isShown ? 'show' : 'hide']()\n      }\n\n    , show: function () {\n        var that = this\n          , e = $.Event('show')\n\n        this.$element.trigger(e)\n\n        if (this.isShown || e.isDefaultPrevented()) return\n\n        $('body').addClass('modal-open')\n\n        this.isShown = true\n\n        escape.call(this)\n        backdrop.call(this, function () {\n          var transition = $.support.transition && that.$element.hasClass('fade')\n\n          if (!that.$element.parent().length) {\n            that.$element.appendTo(document.body) //don't move modals dom position\n          }\n\n          that.$element\n            .show()\n\n          if (transition) {\n            that.$element[0].offsetWidth // force reflow\n          }\n\n          that.$element.addClass('in')\n\n          transition ?\n            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :\n            that.$element.trigger('shown')\n\n        })\n      }\n\n    , hide: function (e) {\n        e && e.preventDefault()\n\n        var that = this\n\n        e = $.Event('hide')\n\n        this.$element.trigger(e)\n\n        if (!this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = false\n\n        $('body').removeClass('modal-open')\n\n        escape.call(this)\n\n        this.$element.removeClass('in')\n\n        $.support.transition && this.$element.hasClass('fade') ?\n          hideWithTransition.call(this) :\n          hideModal.call(this)\n      }\n\n  }\n\n\n /* MODAL PRIVATE METHODS\n  * ===================== */\n\n  function hideWithTransition() {\n    var that = this\n      , timeout = setTimeout(function () {\n          that.$element.off($.support.transition.end)\n          hideModal.call(that)\n        }, 500)\n\n    this.$element.one($.support.transition.end, function () {\n      clearTimeout(timeout)\n      hideModal.call(that)\n    })\n  }\n\n  function hideModal(that) {\n    this.$element\n      .hide()\n      .trigger('hidden')\n\n    backdrop.call(this)\n  }\n\n  function backdrop(callback) {\n    var that = this\n      , animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      if (this.options.backdrop != 'static') {\n        this.$backdrop.click($.proxy(this.hide, this))\n      }\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      doAnimate ?\n        this.$backdrop.one($.support.transition.end, callback) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :\n        removeBackdrop.call(this)\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  function removeBackdrop() {\n    this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  function escape() {\n    var that = this\n    if (this.isShown && this.options.keyboard) {\n      $(document).on('keyup.dismiss.modal', function ( e ) {\n        e.which == 27 && that.hide()\n      })\n    } else if (!this.isShown) {\n      $(document).off('keyup.dismiss.modal')\n    }\n  }\n\n\n /* MODAL PLUGIN DEFINITION\n  * ======================= */\n\n  $.fn.modal = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('modal')\n        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option]()\n      else if (options.show) data.show()\n    })\n  }\n\n  $.fn.modal.defaults = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n /* MODAL DATA-API\n  * ============== */\n\n  $(function () {\n    $('body').on('click.modal.data-api', '[data-toggle=\"modal\"]', function ( e ) {\n      var $this = $(this), href\n        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n        , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())\n\n      e.preventDefault()\n      $target.modal(option)\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/ccalc-lex.js",
    "content": "/* generated by jison-lex 0.3.4-159 */\nvar ccalcLex = (function () {\n// See also:\n// http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508\n// but we keep the prototype.constructor and prototype.name assignment lines too for compatibility\n// with userland code which might access the derived class in a 'classic' way.\nfunction JisonLexerError(msg, hash) {\n    Object.defineProperty(this, 'name', {\n        enumerable: false,\n        writable: false,\n        value: 'JisonLexerError'\n    });\n\n    if (msg == null) msg = '???';\n\n    Object.defineProperty(this, 'message', {\n        enumerable: false,\n        writable: true,\n        value: msg\n    });\n\n    this.hash = hash;\n\n    var stacktrace;\n    if (hash && hash.exception instanceof Error) {\n        var ex2 = hash.exception;\n        this.message = ex2.message || msg;\n        stacktrace = ex2.stack;\n    }\n    if (!stacktrace) {\n        if (Error.hasOwnProperty('captureStackTrace')) { // V8\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            stacktrace = (new Error(msg)).stack;\n        }\n    }\n    if (stacktrace) {\n        Object.defineProperty(this, 'stack', {\n            enumerable: false,\n            writable: false,\n            value: stacktrace\n        });\n    }\n}\n\nif (typeof Object.setPrototypeOf === 'function') {\n    Object.setPrototypeOf(JisonLexerError.prototype, Error.prototype);\n} else {\n    JisonLexerError.prototype = Object.create(Error.prototype);\n}\nJisonLexerError.prototype.constructor = JisonLexerError;\nJisonLexerError.prototype.name = 'JisonLexerError';\n\n\nvar lexer = {\n    EOF: 1,\n    ERROR: 2,\n\n    // JisonLexerError: JisonLexerError,        // <-- injected by the code generator\n\n    // options: {},                             // <-- injected by the code generator\n\n    // yy: ...,                                 // <-- injected by setInput()\n\n    __currentRuleSet__: null,                   // <-- internal rule set cache for the current lexer state\n\n    __error_infos: [],                          // INTERNAL USE ONLY: the set of lexErrorInfo objects created since the last cleanup\n\n    __decompressed: false,                      // INTERNAL USE ONLY: mark whether the lexer instance has been 'unfolded' completely and is now ready for use\n\n    done: false,                                // INTERNAL USE ONLY\n    _backtrack: false,                          // INTERNAL USE ONLY\n    _input: '',                                 // INTERNAL USE ONLY\n    _more: false,                               // INTERNAL USE ONLY\n    _signaled_error_token: false,               // INTERNAL USE ONLY\n\n    conditionStack: [],                         // INTERNAL USE ONLY; managed via `pushState()`, `popState()`, `topState()` and `stateStackSize()`\n\n    match: '',                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction. `match` is identical to `yytext` except that this one still contains the matched input string after `lexer.performAction()` has been invoked, where userland code MAY have changed/replaced the `yytext` value entirely!\n    matched: '',                                // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks entire input which has been matched so far\n    matches: false,                             // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks RE match result for last (successful) match attempt\n    yytext: '',                                 // ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction; this value is transferred to the parser as the 'token value' when the parser consumes the lexer token produced through a call to the `lex()` API.\n    offset: 0,                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks the 'cursor position' in the input string, i.e. the number of characters matched so far\n    yyleng: 0,                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: length of matched input for the token under construction (`yytext`)\n    yylineno: 0,                                // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: 'line number' at which the token under construction is located\n    yylloc: null,                               // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks location info (lines + columns) for the token under construction\n\n    // INTERNAL USE: construct a suitable error info hash object instance for `parseError`.\n    constructLexErrorInfo: function lexer_constructLexErrorInfo(msg, recoverable) {\n        var pei = {\n            errStr: msg,\n            recoverable: !!recoverable,\n            text: this.match,           // This one MAY be empty; userland code should use the `upcomingInput` API to obtain more text which follows the 'lexer cursor position'...\n            token: null,\n            line: this.yylineno,\n            loc: this.yylloc,\n            yy: this.yy,\n            lexer: this,\n\n            // and make sure the error info doesn't stay due to potential\n            // ref cycle via userland code manipulations.\n            // These would otherwise all be memory leak opportunities!\n            //\n            // Note that only array and object references are nuked as those\n            // constitute the set of elements which can produce a cyclic ref.\n            // The rest of the members is kept intact as they are harmless.\n            destroy: function destructLexErrorInfo() {\n                // remove cyclic references added to error info:\n                // info.yy = null;\n                // info.lexer = null;\n                // ...\n                var rec = !!this.recoverable;\n                for (var key in this) {\n                    if (this.hasOwnProperty(key) && typeof key === 'object') {\n                        this[key] = undefined;\n                    }\n                }\n                this.recoverable = rec;\n            }\n        };\n        // track this instance so we can `destroy()` it once we deem it superfluous and ready for garbage collection!\n        this.__error_infos.push(pei);\n        return pei;\n    },\n\n    parseError: function lexer_parseError(str, hash) {\n        if (this.yy.parser && typeof this.yy.parser.parseError === 'function') {\n            return this.yy.parser.parseError(str, hash) || this.ERROR;\n        } else if (typeof this.yy.parseError === 'function') {\n            return this.yy.parseError.call(this, str, hash) || this.ERROR;\n        } else {\n            throw new this.JisonLexerError(str);\n        }\n    },\n\n    // final cleanup function for when we have completed lexing the input; \n    // make it an API so that external code can use this one once userland\n    // code has decided it's time to destroy any lingering lexer error\n    // hash object instances and the like: this function helps to clean\n    // up these constructs, which *may* carry cyclic references which would\n    // otherwise prevent the instances from being properly and timely\n    // garbage-collected, i.e. this function helps prevent memory leaks!\n    cleanupAfterLex: function lexer_cleanupAfterLex(do_not_nuke_errorinfos) {\n        var rv;\n\n        // prevent lingering circular references from causing memory leaks:\n        this.setInput('', {});\n\n        // nuke the error hash info instances created during this run.\n        // Userland code must COPY any data/references\n        // in the error hash instance(s) it is more permanently interested in.\n        if (!do_not_nuke_errorinfos) {\n            for (var i = this.__error_infos.length - 1; i >= 0; i--) {\n                var el = this.__error_infos[i];\n                if (el && typeof el.destroy === 'function') {\n                    el.destroy();\n                }\n            }\n            this.__error_infos.length = 0;\n        }\n\n        return this;\n    },\n\n    // clear the lexer token context; intended for internal use only\n    clear: function lexer_clear() {\n        this.yytext = '';\n        this.yyleng = 0;\n        this.match = '';\n        this.matches = false;\n        this._more = false;\n        this._backtrack = false;\n    },\n\n    // resets the lexer, sets new input\n    setInput: function lexer_setInput(input, yy) {\n        this.yy = yy || this.yy || {};\n\n        // also check if we've fully initialized the lexer instance,\n        // including expansion work to be done to go from a loaded\n        // lexer to a usable lexer:\n        if (!this.__decompressed) {\n          // step 1: decompress the regex list:\n          var rules = this.rules;\n          for (var i = 0, len = rules.length; i < len; i++) {\n            var rule_re = rules[i];\n\n            // compression: is the RE an xref to another RE slot in the rules[] table?\n            if (typeof rule_re === 'number') {\n              rules[i] = rules[rule_re];\n            }\n          }\n\n          // step 2: unfold the conditions[] set to make these ready for use:\n          var conditions = this.conditions;\n          for (var k in conditions) {\n            var spec = conditions[k];\n\n            var rule_ids = spec.rules;\n\n            var len = rule_ids.length;\n            var rule_regexes = new Array(len + 1);            // slot 0 is unused; we use a 1-based index approach here to keep the hottest code in `lexer_next()` fast and simple!\n            var rule_new_ids = new Array(len + 1);\n\n            if (this.rules_prefix1) {\n                var rule_prefixes = new Array(65536);\n                var first_catch_all_index = 0;\n\n                for (var i = 0; i < len; i++) {\n                  var idx = rule_ids[i];\n                  var rule_re = rules[idx];\n                  rule_regexes[i + 1] = rule_re;\n                  rule_new_ids[i + 1] = idx;\n\n                  var prefix = this.rules_prefix1[idx];\n                  // compression: is the PREFIX-STRING an xref to another PREFIX-STRING slot in the rules_prefix1[] table?\n                  if (typeof prefix === 'number') {\n                    prefix = this.rules_prefix1[prefix];\n                  }\n                  // init the prefix lookup table: first come, first serve...\n                  if (!prefix) {\n                    if (!first_catch_all_index) {\n                      first_catch_all_index = i + 1;\n                    }\n                  } else {\n                    for (var j = 0, pfxlen = prefix.length; j < pfxlen; j++) {\n                      var pfxch = prefix.charCodeAt(j);\n                      // first come, first serve:\n                      if (!rule_prefixes[pfxch]) {\n                        rule_prefixes[pfxch] = i + 1;\n                      }  \n                    }\n                  }\n                }\n\n                // if no catch-all prefix has been encountered yet, it means all\n                // rules have limited prefix sets and it MAY be that particular\n                // input characters won't be recognized by any rule in this \n                // condition state.\n                // \n                // To speed up their discovery at run-time while keeping the\n                // remainder of the lexer kernel code very simple (and fast),\n                // we point these to an 'illegal' rule set index *beyond*\n                // the end of the rule set.\n                if (!first_catch_all_index) {\n                  first_catch_all_index = len + 1;\n                }\n\n                for (var i = 0; i < 65536; i++) {\n                  if (!rule_prefixes[i]) {\n                    rule_prefixes[i] = first_catch_all_index; \n                  }\n                }\n\n                spec.__dispatch_lut = rule_prefixes;\n            } else {\n                for (var i = 0; i < len; i++) {\n                  var idx = rule_ids[i];\n                  var rule_re = rules[idx];\n                  rule_regexes[i + 1] = rule_re;\n                  rule_new_ids[i + 1] = idx;\n                }\n            }\n\n            spec.rules = rule_new_ids;\n            spec.__rule_regexes = rule_regexes;\n            spec.__rule_count = len;\n          }\n\n          this.__decompressed = true;\n        }\n\n        this._input = input || '';\n        this.clear();\n        this._signaled_error_token = false;\n        this.done = false;\n        this.yylineno = 0;\n        this.matched = '';\n        this.conditionStack = ['INITIAL'];\n        this.__currentRuleSet__ = null;\n        this.yylloc = {\n            first_line: 1,\n            first_column: 0,\n            last_line: 1,\n            last_column: 0\n        };\n        if (this.options.ranges) {\n            this.yylloc.range = [0, 0];\n        }\n        this.offset = 0;\n        return this;\n    },\n\n    // consumes and returns one char from the input\n    input: function lexer_input() {\n        if (!this._input) {\n            this.done = true;\n            return null;\n        }\n        var ch = this._input[0];\n        this.yytext += ch;\n        this.yyleng++;\n        this.offset++;\n        this.match += ch;\n        this.matched += ch;\n        // Count the linenumber up when we hit the LF (or a stand-alone CR).\n        // On CRLF, the linenumber is incremented when you fetch the CR or the CRLF combo\n        // and we advance immediately past the LF as well, returning both together as if\n        // it was all a single 'character' only.\n        var slice_len = 1;\n        var lines = false;\n        if (ch === '\\n') {\n            lines = true;\n        } else if (ch === '\\r') {\n            lines = true;\n            var ch2 = this._input[1];\n            if (ch2 === '\\n') {\n                slice_len++;\n                ch += ch2;\n                this.yytext += ch2;\n                this.yyleng++;\n                this.offset++;\n                this.match += ch2;\n                this.matched += ch2;\n                if (this.options.ranges) {\n                    this.yylloc.range[1]++;\n                }\n            }\n        }\n        if (lines) {\n            this.yylineno++;\n            this.yylloc.last_line++;\n        } else {\n            this.yylloc.last_column++;\n        }\n        if (this.options.ranges) {\n            this.yylloc.range[1]++;\n        }\n\n        this._input = this._input.slice(slice_len);\n        return ch;\n    },\n\n    // unshifts one char (or a string) into the input\n    unput: function lexer_unput(ch) {\n        var len = ch.length;\n        var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n        this._input = ch + this._input;\n        this.yytext = this.yytext.substr(0, this.yytext.length - len);\n        //this.yyleng -= len;\n        this.offset -= len;\n        var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n        this.match = this.match.substr(0, this.match.length - len);\n        this.matched = this.matched.substr(0, this.matched.length - len);\n\n        if (lines.length - 1) {\n            this.yylineno -= lines.length - 1;\n        }\n\n        this.yylloc.last_line = this.yylineno + 1;\n        this.yylloc.last_column = (lines ?\n                (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n                + oldLines[oldLines.length - lines.length].length - lines[0].length :\n                this.yylloc.first_column - len);\n\n        if (this.options.ranges) {\n            this.yylloc.range[1] = this.yylloc.range[0] + this.yyleng - len;\n        }\n        this.yyleng = this.yytext.length;\n        this.done = false;\n        return this;\n    },\n\n    // When called from action, caches matched text and appends it on next action\n    more: function lexer_more() {\n        this._more = true;\n        return this;\n    },\n\n    // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\n    reject: function lexer_reject() {\n        if (this.options.backtrack_lexer) {\n            this._backtrack = true;\n        } else {\n            // when the parseError() call returns, we MUST ensure that the error is registered.\n            // We accomplish this by signaling an 'error' token to be produced for the current\n            // .lex() run.\n            var p = this.constructLexErrorInfo('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), false);\n            this._signaled_error_token = (this.parseError(p.errStr, p) || this.ERROR);\n        }\n        return this;\n    },\n\n    // retain first n characters of the match\n    less: function lexer_less(n) {\n        return this.unput(this.match.slice(n));\n    },\n\n    // return (part of the) already matched input, i.e. for error messages.\n    // Limit the returned string length to `maxSize` (default: 20).\n    // Limit the returned string to the `maxLines` number of lines of input (default: 1).\n    // Negative limit values equal *unlimited*.\n    pastInput: function lexer_pastInput(maxSize, maxLines) {\n        var past = this.matched.substring(0, this.matched.length - this.match.length);\n        if (maxSize < 0)\n            maxSize = past.length;\n        else if (!maxSize)\n            maxSize = 20;\n        if (maxLines < 0)\n            maxLines = past.length;         // can't ever have more input lines than this!\n        else if (!maxLines)\n            maxLines = 1;\n        // `substr` anticipation: treat \\r\\n as a single character and take a little\n        // more than necessary so that we can still properly check against maxSize\n        // after we've transformed and limited the newLines in here:\n        past = past.substr(-maxSize * 2 - 2);\n        // now that we have a significantly reduced string to process, transform the newlines\n        // and chop them, then limit them:\n        var a = past.replace(/\\r\\n|\\r/g, '\\n').split('\\n');\n        a = a.slice(-maxLines);\n        past = a.join('\\n');\n        // When, after limiting to maxLines, we still have too much to return, \n        // do add an ellipsis prefix...\n        if (past.length > maxSize) {\n            past = '...' + past.substr(-maxSize);\n        }\n        return past;\n    },\n\n    // return (part of the) upcoming input, i.e. for error messages.\n    // Limit the returned string length to `maxSize` (default: 20).\n    // Limit the returned string to the `maxLines` number of lines of input (default: 1).\n    // Negative limit values equal *unlimited*.\n    upcomingInput: function lexer_upcomingInput(maxSize, maxLines) {\n        var next = this.match;\n        if (maxSize < 0)\n            maxSize = next.length + this._input.length;\n        else if (!maxSize)\n            maxSize = 20;\n        if (maxLines < 0)\n            maxLines = maxSize;         // can't ever have more input lines than this!\n        else if (!maxLines)\n            maxLines = 1;\n        // `substring` anticipation: treat \\r\\n as a single character and take a little\n        // more than necessary so that we can still properly check against maxSize\n        // after we've transformed and limited the newLines in here:\n        if (next.length < maxSize * 2 + 2) {\n            next += this._input.substring(0, maxSize * 2 + 2);  // substring is faster on Chrome/V8\n        }\n        // now that we have a significantly reduced string to process, transform the newlines\n        // and chop them, then limit them:\n        var a = next.replace(/\\r\\n|\\r/g, '\\n').split('\\n');\n        a = a.slice(0, maxLines);\n        next = a.join('\\n');\n        // When, after limiting to maxLines, we still have too much to return, \n        // do add an ellipsis postfix...\n        if (next.length > maxSize) {\n            next = next.substring(0, maxSize) + '...';\n        }\n        return next;\n    },\n\n    // return a string which displays the character position where the lexing error occurred, i.e. for error messages\n    showPosition: function lexer_showPosition(maxPrefix, maxPostfix) {\n        var pre = this.pastInput(maxPrefix).replace(/\\s/g, ' ');\n        var c = new Array(pre.length + 1).join('-');\n        return pre + this.upcomingInput(maxPostfix).replace(/\\s/g, ' ') + '\\n' + c + '^';\n    },\n\n    // helper function, used to produce a human readable description as a string, given\n    // the input `yylloc` location object. \n    // Set `display_range_too` to TRUE to include the string character index position(s)\n    // in the description if the `yylloc.range` is available. \n    describeYYLLOC: function lexer_describe_yylloc(yylloc, display_range_too) {\n        var l1 = yylloc.first_line;\n        var l2 = yylloc.last_line;\n        var o1 = yylloc.first_column;\n        var o2 = yylloc.last_column - 1;\n        var dl = l2 - l1;\n        var d_o = (dl === 0 ? o2 - o1 : 1000);\n        var rv;\n        if (dl === 0) {\n            rv = 'line ' + l1 + ', ';\n            if (d_o === 0) {\n                rv += 'column ' + o1;\n            } else {\n                rv += 'columns ' + o1 + ' .. ' + o2;\n            }\n        } else {\n            rv = 'lines ' + l1 + '(column ' + o1 + ') .. ' + l2 + '(column ' + o2 + ')';\n        }\n        if (yylloc.range && display_range_too) {\n            var r1 = yylloc.range[0];\n            var r2 = yylloc.range[1] - 1;\n            if (r2 === r1) {\n                rv += ' {String Offset: ' + r1 + '}';\n            } else {\n                rv += ' {String Offset range: ' + r1 + ' .. ' + r2 + '}';\n            }\n        }\n        return rv;\n        // return JSON.stringify(yylloc);\n    },\n\n    // test the lexed token: return FALSE when not a match, otherwise return token.\n    //\n    // `match` is supposed to be an array coming out of a regex match, i.e. `match[0]`\n    // contains the actually matched text string.\n    //\n    // Also move the input cursor forward and update the match collectors:\n    // - yytext\n    // - yyleng\n    // - match\n    // - matches\n    // - yylloc\n    // - offset\n    test_match: function lexer_test_match(match, indexed_rule) {\n        var token,\n            lines,\n            backup,\n            match_str;\n\n        if (this.options.backtrack_lexer) {\n            // save context\n            backup = {\n                yylineno: this.yylineno,\n                yylloc: {\n                    first_line: this.yylloc.first_line,\n                    last_line: this.last_line,\n                    first_column: this.yylloc.first_column,\n                    last_column: this.yylloc.last_column\n                },\n                yytext: this.yytext,\n                match: this.match,\n                matches: this.matches,\n                matched: this.matched,\n                yyleng: this.yyleng,\n                offset: this.offset,\n                _more: this._more,\n                _input: this._input,\n                yy: this.yy,\n                conditionStack: this.conditionStack.slice(0),\n                done: this.done\n            };\n            if (this.options.ranges) {\n                backup.yylloc.range = this.yylloc.range.slice(0);\n            }\n        }\n\n        match_str = match[0];\n        lines = match_str.match(/(?:\\r\\n?|\\n).*/g);\n        if (lines) {\n            this.yylineno += lines.length;\n        }\n        this.yylloc = {\n            first_line: this.yylloc.last_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.last_column,\n            last_column: lines ?\n                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n                         this.yylloc.last_column + match_str.length\n        };\n        this.yytext += match_str;\n        this.match += match_str;\n        this.matches = match;\n        this.yyleng = this.yytext.length;\n        if (this.options.ranges) {\n            this.yylloc.range = [this.offset, this.offset + this.yyleng];\n        }\n        // previous lex rules MAY have invoked the `more()` API rather than producing a token:\n        // those rules will already have moved this `offset` forward matching their match lengths,\n        // hence we must only add our own match length now:\n        this.offset += match_str.length;\n        this._more = false;\n        this._backtrack = false;\n        this._input = this._input.slice(match_str.length);\n        this.matched += match_str;\n\n        // calling this method: \n        //\n        //   function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {...}\n        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1] /* = YY_START */);\n        // otherwise, when the action codes are all simple return token statements:\n        //token = this.simpleCaseActionClusters[indexed_rule];\n\n        if (this.done && this._input) {\n            this.done = false;\n        }\n        if (token) {\n            return token;\n        } else if (this._backtrack) {\n            // recover context\n            for (var k in backup) {\n                this[k] = backup[k];\n            }\n            this.__currentRuleSet__ = null;\n            return false; // rule action called reject() implying the next rule should be tested instead.\n        } else if (this._signaled_error_token) {\n            // produce one 'error' token as .parseError() in reject() did not guarantee a failure signal by throwing an exception!\n            token = this._signaled_error_token;\n            this._signaled_error_token = false;\n            return token;\n        }\n        return false;\n    },\n\n    // return next match in input\n    next: function lexer_next() {\n        if (this.done) {\n            this.clear();\n            return this.EOF;\n        }\n        if (!this._input) {\n            this.done = true;\n        }\n\n        var token,\n            match,\n            tempMatch,\n            index;\n        if (!this._more) {\n            this.clear();\n        }\n        var spec = this.__currentRuleSet__;\n        if (!spec) {\n            // Update the ruleset cache as we apparently encountered a state change or just started lexing.\n            // The cache is set up for fast lookup -- we assume a lexer will switch states much less often than it will\n            // invoke the `lex()` token-producing API and related APIs, hence caching the set for direct access helps\n            // speed up those activities a tiny bit.\n            spec = this.__currentRuleSet__ = this._currentRules();\n        }\n\n        var rule_ids = spec.rules;\n//        var dispatch = spec.__dispatch_lut;\n        var regexes = spec.__rule_regexes;\n        var len = spec.__rule_count;\n\n//        var c0 = this._input[0];\n\n        // Note: the arrays are 1-based, while `len` itself is a valid index, \n        // hence the non-standard less-or-equal check in the next loop condition!\n        // \n        // `dispatch` is a lookup table which lists the *first* rule which matches the 1-char *prefix* of the rule-to-match.\n        // By using that array as a jumpstart, we can cut down on the otherwise O(n*m) behaviour of this lexer, down to\n        // O(n) ideally, where:\n        // \n        // - N is the number of input particles -- which is not precisely characters \n        //   as we progress on a per-regex-match basis rather than on a per-character basis\n        //   \n        // - M is the number of rules (regexes) to test in the active condition state.\n        //  \n        for (var i = 1 /* (dispatch[c0] || 1) */ ; i <= len; i++) {\n            tempMatch = this._input.match(regexes[i]);\n            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n                match = tempMatch;\n                index = i;\n                if (this.options.backtrack_lexer) {\n                    token = this.test_match(tempMatch, rule_ids[i]);\n                    if (token !== false) {\n                        return token;\n                    } else if (this._backtrack) {\n                        match = undefined;\n                        continue; // rule action called reject() implying a rule MISmatch.\n                    } else {\n                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n                        return false;\n                    }\n                } else if (!this.options.flex) {\n                    break;\n                }\n            }\n        }\n        if (match) {\n            token = this.test_match(match, rule_ids[index]);\n            if (token !== false) {\n                return token;\n            }\n            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n            return false;\n        }\n        if (this._input === '') {\n            this.done = true;\n            return this.EOF;\n        } else {\n            var p = this.constructLexErrorInfo('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), this.options.lexer_errors_are_recoverable);\n            token = (this.parseError(p.errStr, p) || this.ERROR);\n            if (token === this.ERROR) {\n                // we can try to recover from a lexer error that parseError() did not 'recover' for us, by moving forward at least one character at a time:\n                if (!this.match.length) {\n                    this.input();\n                }\n            }\n            return token;\n        }\n    },\n\n    // return next match that has a token\n    lex: function lexer_lex() {\n        var r;\n        // allow the PRE/POST handlers set/modify the return token for maximum flexibility of the generated lexer:\n        if (typeof this.options.pre_lex === 'function') {\n            r = this.options.pre_lex.call(this);\n        }\n        while (!r) {\n            r = this.next();\n        }\n        if (typeof this.options.post_lex === 'function') {\n            // (also account for a userdef function which does not return any value: keep the token as is)\n            r = this.options.post_lex.call(this, r) || r;\n        }\n        return r;\n    },\n\n    // backwards compatible alias for `pushState()`;\n    // the latter is symmetrical with `popState()` and we advise to use\n    // those APIs in any modern lexer code, rather than `begin()`.\n    begin: function lexer_begin(condition) {\n        return this.pushState(condition);\n    },\n\n    // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n    pushState: function lexer_pushState(condition) {\n        this.conditionStack.push(condition);\n        this.__currentRuleSet__ = null;\n        return this;\n    },\n\n    // pop the previously active lexer condition state off the condition stack\n    popState: function lexer_popState() {\n        var n = this.conditionStack.length - 1;\n        if (n > 0) {\n            this.__currentRuleSet__ = null;\n            return this.conditionStack.pop();\n        } else {\n            return this.conditionStack[0];\n        }\n    },\n\n    // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n    topState: function lexer_topState(n) {\n        n = this.conditionStack.length - 1 - Math.abs(n || 0);\n        if (n >= 0) {\n            return this.conditionStack[n];\n        } else {\n            return 'INITIAL';\n        }\n    },\n\n    // (internal) determine the lexer rule set which is active for the currently active lexer condition state\n    _currentRules: function lexer__currentRules() {\n        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n            return this.conditions[this.conditionStack[this.conditionStack.length - 1]];\n        } else {\n            return this.conditions['INITIAL'];\n        }\n    },\n\n    // return the number of states currently on the stack\n    stateStackSize: function lexer_stateStackSize() {\n        return this.conditionStack.length;\n    },\noptions: {},\nJisonLexerError: JisonLexerError,\nperformAction: function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {\n\nvar YYSTATE = YY_START;\nswitch($avoiding_name_collisions) {\ncase 0 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       [ \\t\\r\\n]+ */ \n \n    /* eat up whitespace */\n    BeginToken(yy_.yytext); \n     \nbreak;\ncase 1 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+ */ \n \n    BeginToken(yy_.yytext); \n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 2 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+\\.{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 3 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+[eE][\"+\"\"-\"]?{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 4 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+\\.{DIGIT}*[eE][\"+\"\"-\"]?{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 5 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {ID} */ \n \n    BeginToken(yy_.yytext);\n    yylval.string = malloc(strlen(yy_.yytext)+1);\n    strcpy(yylval.string, yy_.yytext);\n    return IDENTIFIER;\n     \nbreak;\ncase 6 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\+ */ \n  BeginToken(yy_.yytext); return ADD;  \nbreak;\ncase 7 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       - */ \n  BeginToken(yy_.yytext); return SUB;  \nbreak;\ncase 8 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\* */ \n  BeginToken(yy_.yytext); return MULT;  \nbreak;\ncase 9 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\/ */ \n  BeginToken(yy_.yytext); return DIV;  \nbreak;\ncase 10 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\( */ \n  BeginToken(yy_.yytext); return LBRACE;  \nbreak;\ncase 11 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\) */ \n  BeginToken(yy_.yytext); return RBRACE;  \nbreak;\ncase 12 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       ; */ \n  BeginToken(yy_.yytext); return SEMICOLON;  \nbreak;\ncase 13 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       = */ \n  BeginToken(yy_.yytext); return ASSIGN;  \nbreak;\ncase 14 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       . */ \n \n    BeginToken(yy_.yytext);\n    return yy_.yytext[0];\n     \nbreak;\ndefault:\n  return this.simpleCaseActionClusters[$avoiding_name_collisions];\n}\n},\nsimpleCaseActionClusters: {\n\n},\nrules: [\n/^(?:[ \\t\\r\\n]+)/,\n/^(?:(\\d)+)/,\n/^(?:(\\d)+\\.(\\d)*)/,\n/^(?:(\\d)+[Ee][\"+]?(\\d)*)/,\n/^(?:(\\d)+\\.(\\d)*[Ee][\"+]?(\\d)*)/,\n/^(?:([^\\W\\d]\\w*))/,\n/^(?:\\+)/,\n/^(?:-)/,\n/^(?:\\*)/,\n/^(?:\\/)/,\n/^(?:\\()/,\n/^(?:\\))/,\n/^(?:;)/,\n/^(?:=)/,\n/^(?:.)/\n],\nconditions: {\n  \"INITIAL\": {\n    rules: [\n      0,\n      1,\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9,\n      10,\n      11,\n      12,\n      13,\n      14\n    ],\n    inclusive: true\n  }\n}\n};\n\n/*--------------------------------------------------------------------\n * lex.l\n *------------------------------------------------------------------*/;\nreturn lexer;\n})();"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/ccalc-parse.js",
    "content": "/* parser generated by jison 0.4.17-144 */\n/*\n * Returns a Parser object of the following structure:\n *\n *  Parser: {\n *    yy: {}     The so-called \"shared state\" or rather the *source* of it;\n *               the real \"shared state\" `yy` passed around to\n *               the rule actions, etc. is a derivative/copy of this one,\n *               not a direct reference!\n *  }\n *\n *  Parser.prototype: {\n *    yy: {},\n *    EOF: 1,\n *    TERROR: 2,\n *\n *    trace: function(errorMessage, ...),\n *\n *    JisonParserError: function(msg, hash),\n *\n *    quoteName: function(name),\n *               Helper function which can be overridden by user code later on: put suitable\n *               quotes around literal IDs in a description string.\n *\n *    originalQuoteName: function(name),\n *               The basic quoteName handler provided by JISON.\n *               `cleanupAfterParse()` will clean up and reset `quoteName()` to reference this function\n *               at the end of the `parse()`.\n *\n *    describeSymbol: function(symbol),\n *               Return a more-or-less human-readable description of the given symbol, when\n *               available, or the symbol itself, serving as its own 'description' for lack\n *               of something better to serve up.\n *\n *               Return NULL when the symbol is unknown to the parser.\n *\n *    symbols_: {associative list: name ==> number},\n *    terminals_: {associative list: number ==> name},\n *    nonterminals: {associative list: rule-name ==> {associative list: number ==> rule-alt}},\n *    terminal_descriptions_: (if there are any) {associative list: number ==> description},\n *    productions_: [...],\n *\n *    performAction: function parser__performAction(yytext, yyleng, yylineno, yyloc, yy, yystate, $0, $$, _$, yystack, yysstack, ...),\n *               where `...` denotes the (optional) additional arguments the user passed to\n *               `parser.parse(str, ...)`\n *\n *    table: [...],\n *               State transition table\n *               ----------------------\n *\n *               index levels are:\n *               - `state`  --> hash table\n *               - `symbol` --> action (number or array)\n *\n *                 If the `action` is an array, these are the elements' meaning:\n *                 - index [0]: 1 = shift, 2 = reduce, 3 = accept\n *                 - index [1]: GOTO `state`\n *\n *                 If the `action` is a number, it is the GOTO `state`\n *\n *    defaultActions: {...},\n *\n *    parseError: function(str, hash),\n *    yyErrOk: function(),\n *    yyClearIn: function(),\n *\n *    constructParseErrorInfo: function(error_message, exception_object, expected_token_set, is_recoverable),\n *               Helper function **which will be set up during the first invocation of the `parse()` method**.\n *               Produces a new errorInfo 'hash object' which can be passed into `parseError()`.\n *               See it's use in this parser kernel in many places; example usage:\n *\n *                   var infoObj = parser.constructParseErrorInfo('fail!', null,\n *                                     parser.collect_expected_token_set(state), true);\n *                   var retVal = parser.parseError(infoObj.errStr, infoObj);\n *\n *    originalParseError: function(str, hash),\n *               The basic parseError handler provided by JISON.\n *               `cleanupAfterParse()` will clean up and reset `parseError()` to reference this function\n *               at the end of the `parse()`.\n *\n *    options: { ... parser %options ... },\n *\n *    parse: function(input[, args...]),\n *               Parse the given `input` and return the parsed value (or `true` when none was provided by\n *               the root action, in which case the parser is acting as a *matcher*).\n *               You MAY use the additional `args...` parameters as per `%parse-param` spec of this grammar:\n *               these extra `args...` are passed verbatim to the grammar rules' action code.\n *\n *    cleanupAfterParse: function(resultValue, invoke_post_methods),\n *               Helper function **which will be set up during the first invocation of the `parse()` method**.\n *               This helper API is invoked at the end of the `parse()` call, unless an exception was thrown\n *               and `%options no-try-catch` has been defined for this grammar: in that case this helper MAY\n *               be invoked by calling user code to ensure the `post_parse` callbacks are invoked and\n *               the internal parser gets properly garbage collected under these particular circumstances.\n *\n *    lexer: {\n *        yy: {...},           A reference to the so-called \"shared state\" `yy` once\n *                             received via a call to the `.setInput(input, yy)` lexer API.\n *        EOF: 1,\n *        ERROR: 2,\n *        JisonLexerError: function(msg, hash),\n *        parseError: function(str, hash),\n *        setInput: function(input, [yy]),\n *        input: function(),\n *        unput: function(str),\n *        more: function(),\n *        reject: function(),\n *        less: function(n),\n *        pastInput: function(n),\n *        upcomingInput: function(n),\n *        showPosition: function(),\n *        test_match: function(regex_match_array, rule_index),\n *        next: function(),\n *        lex: function(),\n *        begin: function(condition),\n *        pushState: function(condition),\n *        popState: function(),\n *        topState: function(),\n *        _currentRules: function(),\n *        stateStackSize: function(),\n *\n *        options: { ... lexer %options ... },\n *\n *        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n *        rules: [...],\n *        conditions: {associative list: name ==> set},\n *    }\n *  }\n *\n *\n *  token location info (@$, _$, etc.): {\n *    first_line: n,\n *    last_line: n,\n *    first_column: n,\n *    last_column: n,\n *    range: [start_number, end_number]\n *               (where the numbers are indexes into the input string, zero-based)\n *  }\n *\n * ---\n *\n * The parseError function receives a 'hash' object with these members for lexer and\n * parser errors:\n *\n *  {\n *    text:        (matched text)\n *    token:       (the produced terminal token, if any)\n *    token_id:    (the produced terminal token numeric ID, if any)\n *    line:        (yylineno)\n *    loc:         (yylloc)\n *  }\n *\n * parser (grammar) errors will also provide these additional members:\n *\n *  {\n *    expected:    (array describing the set of expected tokens;\n *                  may be UNDEFINED when we cannot easily produce such a set)\n *    state:       (integer (or array when the table includes grammar collisions);\n *                  represents the current internal state of the parser kernel.\n *                  can, for example, be used to pass to the `collect_expected_token_set()`\n *                  API to obtain the expected token set)\n *    action:      (integer; represents the current internal action which will be executed)\n *    new_state:   (integer; represents the next/planned internal state, once the current\n *                  action has executed)\n *    recoverable: (boolean: TRUE when the parser MAY have an error recovery rule\n *                  available for this particular error)\n *    state_stack: (array: the current parser LALR/LR internal state stack; this can be used,\n *                  for instance, for advanced error analysis and reporting)\n *    value_stack: (array: the current parser LALR/LR internal `$$` value stack; this can be used,\n *                  for instance, for advanced error analysis and reporting)\n *    location_stack: (array: the current parser LALR/LR internal location stack; this can be used,\n *                  for instance, for advanced error analysis and reporting)\n *    yy:          (object: the current parser internal \"shared state\" `yy`\n *                  as is also available in the rule actions; this can be used,\n *                  for instance, for advanced error analysis and reporting)\n *    lexer:       (reference to the current lexer instance used by the parser)\n *  }\n *\n * while `this` will reference the current parser instance.\n *\n *  When `parseError` is invoked by the lexer, `this` will still reference the related *parser*\n *  instance, while these additional `hash` fields will also be provided:\n *\n *  {\n *    lexer:       (reference to the current lexer instance which reported the error)\n *  }\n *\n *  When `parseError` is invoked by the parser due to a **JavaScript exception** being fired\n *  from either the parser or lexer, `this` will still reference the related *parser*\n *  instance, while these additional `hash` fields will also be provided:\n *\n *  {\n *    exception:   (reference to the exception thrown)\n *  }\n *\n *  Please do note that in the latter situation, the `expected` field will be omitted as\n *  type of failure is assumed not to be due to *parse errors* but rather due to user\n *  action code in either parser or lexer failing unexpectedly.\n *\n * ---\n *\n * You can specify parser options by setting / modifying the `.yy` object of your Parser instance.\n * These options are available:\n *\n * ### options which are global for all parser instances\n *\n *  Parser.pre_parse: function(yy [, optional parse() args])\n *                 optional: you can specify a pre_parse() function in the chunk following\n *                 the grammar, i.e. after the last `%%`.\n *  Parser.post_parse: function(yy, retval [, optional parse() args]) { return retval; }\n *                 optional: you can specify a post_parse() function in the chunk following\n *                 the grammar, i.e. after the last `%%`. When it does not return any value,\n *                 the parser will return the original `retval`.\n *\n * ### options which can be set up per parser instance\n *  \n *  yy: {\n *      pre_parse:  function(yy [, optional parse() args])\n *                 optional: is invoked before the parse cycle starts (and before the first\n *                 invocation of `lex()`) but immediately after the invocation of\n *                 `parser.pre_parse()`).\n *      post_parse: function(yy, retval [, optional parse() args]) { return retval; }\n *                 optional: is invoked when the parse terminates due to success ('accept')\n *                 or failure (even when exceptions are thrown).\n *                 `retval` contains the return value to be produced by `Parser.parse()`;\n *                 this function can override the return value by returning another. \n *                 When it does not return any value, the parser will return the original\n *                 `retval`. \n *                 This function is invoked immediately before `Parser.post_parse()`.\n *\n *      parseError: function(str, hash)\n *                 optional: overrides the default `parseError` function.\n *      quoteName: function(name),\n *                 optional: overrides the default `quoteName` function.\n *  }\n *\n *  parser.lexer.options: {\n *      pre_lex:  function()\n *                 optional: is invoked before the lexer is invoked to produce another token.\n *                 `this` refers to the Lexer object.\n *      post_lex: function(token) { return token; }\n *                 optional: is invoked when the lexer has produced a token `token`;\n *                 this function can override the returned token value by returning another.\n *                 When it does not return any (truthy) value, the lexer will return\n *                 the original `token`.\n *                 `this` refers to the Lexer object.\n *\n *      ranges: boolean\n *                 optional: `true` ==> token location info will include a .range[] member.\n *      flex: boolean\n *                 optional: `true` ==> flex-like lexing behaviour where the rules are tested\n *                 exhaustively to find the longest match.\n *      backtrack_lexer: boolean\n *                 optional: `true` ==> lexer regexes are tested in order and for invoked;\n *                 the lexer terminates the scan when a token is returned by the action code.\n *      xregexp: boolean\n *                 optional: `true` ==> lexer rule regexes are \"extended regex format\" requiring the\n *                 `XRegExp` library. When this %option has not been specified at compile time, all lexer\n *                 rule regexes have been written as standard JavaScript RegExp expressions.\n *  }\n */\nvar ccalcParse = (function () {\n\n// See also:\n// http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508\n// but we keep the prototype.constructor and prototype.name assignment lines too for compatibility\n// with userland code which might access the derived class in a 'classic' way.\nfunction JisonParserError(msg, hash) {\n    Object.defineProperty(this, 'name', {\n        enumerable: false,\n        writable: false,\n        value: 'JisonParserError'\n    });\n\n    if (msg == null) msg = '???';\n\n    Object.defineProperty(this, 'message', {\n        enumerable: false,\n        writable: true,\n        value: msg\n    });\n\n    this.hash = hash;\n\n    var stacktrace;\n    if (hash && hash.exception instanceof Error) {\n        var ex2 = hash.exception;\n        this.message = ex2.message || msg;\n        stacktrace = ex2.stack;\n    }\n    if (!stacktrace) {\n        if (Error.hasOwnProperty('captureStackTrace')) { // V8\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            stacktrace = (new Error(msg)).stack;\n        }\n    }\n    if (stacktrace) {\n        Object.defineProperty(this, 'stack', {\n            enumerable: false,\n            writable: false,\n            value: stacktrace\n        });\n    }\n}\n\nif (typeof Object.setPrototypeOf === 'function') {\n    Object.setPrototypeOf(JisonParserError.prototype, Error.prototype);\n} else {\n    JisonParserError.prototype = Object.create(Error.prototype);\n}\nJisonParserError.prototype.constructor = JisonParserError;\nJisonParserError.prototype.name = 'JisonParserError';\n\n\n\n// helper: reconstruct the productions[] table\nfunction bp(s) {\n    var rv = [];\n    var p = s.pop;\n    var r = s.rule;\n    for (var i = 0, l = p.length; i < l; i++) {\n        rv.push([\n            p[i],\n            r[i]\n        ]);\n    }\n    return rv;\n}\n\n\n\n// helper: reconstruct the 'goto' table\nfunction bt(s) {\n    var rv = [];\n    var d = s.len;\n    var y = s.symbol;\n    var t = s.type;\n    var a = s.state;\n    var m = s.mode;\n    var g = s.goto;\n    for (var i = 0, l = d.length; i < l; i++) {\n        var n = d[i];\n        var q = {};\n        for (var j = 0; j < n; j++) {\n            var z = y.shift();\n            switch (t.shift()) {\n            case 2:\n                q[z] = [\n                    m.shift(),\n                    g.shift()\n                ];\n                break;\n\n            case 0:\n                q[z] = a.shift();\n                break;\n\n            default:\n                // type === 1: accept\n                q[z] = [\n                    3\n                ];\n            }\n        }\n        rv.push(q);\n    }\n    return rv;\n}\n\n// helper: runlength encoding with increment step: code, length: step (default step = 0)\n// `this` references an array\nfunction s(c, l, a) {\n    a = a || 0;\n    for (var i = 0; i < l; i++) {\n        this.push(c);\n        c += a;\n    }\n}\n\n// helper: duplicate sequence from *relative* offset and length.\n// `this` references an array\nfunction c(i, l) {\n    i = this.length - i;\n    for (l += i; i < l; i++) {\n        this.push(this[i]);\n    }\n}\n\n// helper: unpack an array using helpers and data, all passed in an array argument 'a'.\nfunction u(a) {\n    var rv = [];\n    for (var i = 0, l = a.length; i < l; i++) {\n        var e = a[i];\n        // Is this entry a helper function?\n        if (typeof e === 'function') {\n            i++;\n            e.apply(rv, a[i]);\n        } else {\n            rv.push(e);\n        }\n    }\n    return rv;\n}\n\nvar parser = {\ntrace: function no_op_trace() { },\nJisonParserError: JisonParserError,\nyy: {},\noptions: {\n  type: \"lalr\",\n  errorRecoveryTokenDiscardCount: 3\n},\nsymbols_: {\n  \"$accept\": 0,\n  \"$end\": 1,\n  \"ADD\": 12,\n  \"ASSIGN\": 7,\n  \"DIV\": 14,\n  \"EOF\": 1,\n  \"IDENTIFIER\": 6,\n  \"LBRACE\": 9,\n  \"MULT\": 13,\n  \"RBRACE\": 10,\n  \"SEMICOLON\": 5,\n  \"SUB\": 11,\n  \"VALUE\": 15,\n  \"error\": 2,\n  \"expression\": 8,\n  \"program\": 3,\n  \"statement\": 4\n},\nterminals_: {\n  1: \"EOF\",\n  2: \"error\",\n  5: \"SEMICOLON\",\n  6: \"IDENTIFIER\",\n  7: \"ASSIGN\",\n  9: \"LBRACE\",\n  10: \"RBRACE\",\n  11: \"SUB\",\n  12: \"ADD\",\n  13: \"MULT\",\n  14: \"DIV\",\n  15: \"VALUE\"\n},\nTERROR: 2,\nEOF: 1,\n\n// internals: defined here so the object *structure* doesn't get modified by parse() et al,\n// thus helping JIT compilers like Chrome V8.\noriginalQuoteName: null,\noriginalParseError: null,\ncleanupAfterParse: null,\nconstructParseErrorInfo: null,\n\n__reentrant_call_depth: 0,       // INTERNAL USE ONLY\n\n// APIs which will be set up depending on user action code analysis:\n//yyErrOk: 0,\n//yyClearIn: 0,\n\n// Helper APIs\n// -----------\n\n// Helper function which can be overridden by user code later on: put suitable quotes around\n// literal IDs in a description string.\nquoteName: function parser_quoteName(id_str) {\n    return '\"' + id_str + '\"';\n},\n\n// Return a more-or-less human-readable description of the given symbol, when available,\n// or the symbol itself, serving as its own 'description' for lack of something better to serve up.\n//\n// Return NULL when the symbol is unknown to the parser.\ndescribeSymbol: function parser_describeSymbol(symbol) {\n    if (symbol !== this.EOF && this.terminal_descriptions_ && this.terminal_descriptions_[symbol]) {\n        return this.terminal_descriptions_[symbol];\n    }\n    else if (symbol === this.EOF) {\n        return 'end of input';\n    }\n    else if (this.terminals_[symbol]) {\n        return this.quoteName(this.terminals_[symbol]);\n    }\n    // Otherwise... this might refer to a RULE token i.e. a non-terminal: see if we can dig that one up.\n    //\n    // An example of this may be where a rule's action code contains a call like this:\n    //\n    //      parser.describeSymbol(#$)\n    //\n    // to obtain a human-readable description or name of the current grammar rule. This comes handy in\n    // error handling action code blocks, for example.\n    var s = this.symbols_;\n    for (var key in s) {\n        if (s[key] === symbol) {\n            return key;\n        }\n    }\n    return null;\n},\n\n// Produce a (more or less) human-readable list of expected tokens at the point of failure.\n//\n// The produced list may contain token or token set descriptions instead of the tokens\n// themselves to help turning this output into something that easier to read by humans\n// unless `do_not_describe` parameter is set, in which case a list of the raw, *numeric*,\n// expected terminals and nonterminals is produced.\n//\n// The returned list (array) will not contain any duplicate entries.\ncollect_expected_token_set: function parser_collect_expected_token_set(state, do_not_describe) {\n    var TERROR = this.TERROR;\n    var tokenset = [];\n    var check = {};\n    // Has this (error?) state been outfitted with a custom expectations description text for human consumption?\n    // If so, use that one instead of the less palatable token set.\n    if (!do_not_describe && this.state_descriptions_ && this.state_descriptions_[state]) {\n        return [\n            this.state_descriptions_[state]\n        ];\n    }\n    for (var p in this.table[state]) {\n        p = +p;\n        if (p !== TERROR) {\n            var d = do_not_describe ? p : this.describeSymbol(p);\n            if (d && !check[d]) {\n                tokenset.push(d);\n                check[d] = true;        // Mark this token description as already mentioned to prevent outputting duplicate entries.\n            }\n        }\n    }\n    return tokenset;\n},\nproductions_: bp({\n  pop: u([\n  s,\n  [3, 3],\n  4,\n  4,\n  s,\n  [8, 8]\n]),\n  rule: u([\n  3,\n  2,\n  4,\n  3,\n  1,\n  3,\n  2,\n  s,\n  [3, 4],\n  1,\n  1\n])\n}),\nperformAction: function parser__PerformAction(yytext, yyloc, yy, yystate /* action[1] */, $0, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nswitch (yystate) {\ncase 3:\n    /*! Production::    program : statement error SEMICOLON program */\n    yy.parser.yyErrOk();\n    break;\n\ncase 4:\n    /*! Production::    statement : IDENTIFIER ASSIGN expression */\n    VarSetValue(var, $$[$0]);\n    break;\n\ncase 6:\n    /*! Production::    expression : LBRACE expression RBRACE */\n    this.$ = $$[$0 - 1];\n    break;\n\ncase 7:\n    /*! Production::    expression : SUB expression */\n    this.$ = - $$[$0];\n    break;\n\ncase 8:\n    /*! Production::    expression : expression ADD expression */\n    this.$ = ReduceAdd($$[$0 - 2], $$[$0], &_$[$0]);\n    if (  debug  )\n      printf(\"reduce %lf + %lf => %lf\\n\", $$[$0 - 2], $$[$0], this.$);\n    break;\n\ncase 9:\n    /*! Production::    expression : expression SUB expression */\n    this.$ = ReduceSub($$[$0 - 2], $$[$0], &_$[$0]);\n    if (  debug  )\n      printf(\"reduce %lf - %lf => %lf\\n\", $$[$0 - 2], $$[$0], this.$);\n    break;\n\ncase 10:\n    /*! Production::    expression : expression MULT expression */\n    this.$ = ReduceMult($$[$0 - 2], $$[$0], &_$[$0]);\n    if (  debug  )\n      printf(\"reduce %lf * %lf => %lf\\n\", $$[$0 - 2], $$[$0], this.$);\n    break;\n\ncase 11:\n    /*! Production::    expression : expression DIV expression */\n    this.$ = ReduceDiv($$[$0 - 2], $$[$0], &_$[$0]);\n    if (  debug  )\n      printf(\"reduce %lf / %lf => %lf\\n\", $$[$0 - 2], $$[$0], this.$);\n    break;\n\ncase 12:\n    /*! Production::    expression : VALUE */\n    this.$ = $$[$0];\n    break;\n\ncase 13:\n    /*! Production::    expression : IDENTIFIER */\n    this.$ = VarGetValue($$[$0], &_$[$0]);\n    if (  debug  )\n      printf(\"identifier %s => %lf\\n\", $$[$0], this.$);\n    break;\n\n}\n},\ntable: bt({\n  len: u([\n  7,\n  1,\n  2,\n  7,\n  6,\n  5,\n  5,\n  7,\n  8,\n  1,\n  s,\n  [5, 6],\n  7,\n  7,\n  1,\n  7,\n  6,\n  s,\n  [7, 5],\n  1\n]),\n  symbol: u([\n  3,\n  4,\n  6,\n  8,\n  9,\n  11,\n  15,\n  1,\n  2,\n  5,\n  2,\n  5,\n  7,\n  s,\n  [11, 4, 1],\n  2,\n  5,\n  c,\n  [6, 4],\n  c,\n  [21, 5],\n  c,\n  [5, 5],\n  2,\n  5,\n  s,\n  [10, 5, 1],\n  1,\n  c,\n  [41, 7],\n  5,\n  c,\n  [26, 10],\n  c,\n  [5, 15],\n  c,\n  [39, 5],\n  c,\n  [46, 7],\n  c,\n  [53, 15],\n  c,\n  [84, 6],\n  c,\n  [28, 14],\n  c,\n  [7, 21],\n  1\n]),\n  type: u([\n  0,\n  0,\n  2,\n  0,\n  s,\n  [2, 3],\n  1,\n  s,\n  [2, 16],\n  c,\n  [21, 4],\n  c,\n  [5, 6],\n  c,\n  [17, 8],\n  c,\n  [41, 6],\n  c,\n  [26, 12],\n  c,\n  [5, 15],\n  s,\n  [2, 19],\n  c,\n  [53, 9],\n  s,\n  [2, 40]\n]),\n  state: u([\n  1,\n  2,\n  4,\n  15,\n  17,\n  18,\n  2,\n  4,\n  s,\n  [20, 5, 1],\n  26,\n  2,\n  4\n]),\n  mode: u([\n  s,\n  [1, 6],\n  2,\n  2,\n  c,\n  [3, 3],\n  s,\n  [2, 4],\n  s,\n  [1, 12],\n  s,\n  [2, 8],\n  s,\n  [1, 30],\n  s,\n  [2, 15],\n  c,\n  [78, 7],\n  c,\n  [25, 8],\n  c,\n  [7, 14],\n  s,\n  [2, 17]\n]),\n  goto: u([\n  3,\n  5,\n  6,\n  7,\n  9,\n  8,\n  13,\n  13,\n  10,\n  s,\n  [13, 4],\n  5,\n  5,\n  12,\n  11,\n  13,\n  14,\n  16,\n  c,\n  [19, 3],\n  c,\n  [4, 4],\n  s,\n  [12, 7],\n  2,\n  c,\n  [35, 4],\n  19,\n  c,\n  [21, 8],\n  c,\n  [4, 12],\n  25,\n  c,\n  [46, 4],\n  s,\n  [13, 7],\n  s,\n  [7, 7],\n  1,\n  c,\n  [45, 4],\n  4,\n  4,\n  c,\n  [25, 4],\n  s,\n  [8, 5],\n  13,\n  14,\n  s,\n  [9, 5],\n  13,\n  14,\n  s,\n  [10, 7],\n  s,\n  [11, 7],\n  s,\n  [6, 7],\n  3\n])\n}),\ndefaultActions: {\n  18: 1,\n  26: 3\n},\nparseError: function parseError(str, hash) {\n    if (hash.recoverable) {\n        this.trace(str);\n        hash.destroy();             // destroy... well, *almost*!\n        // assert('recoverable' in hash);\n    } else {\n        throw new this.JisonParserError(str, hash);\n    }\n},\nparse: function parse(input) {\n    var self = this,\n        stack = new Array(128),         // token stack: stores token which leads to state at the same index (column storage)\n        sstack = new Array(128),        // state stack: stores states\n\n        vstack = new Array(128),        // semantic value stack\n        lstack = new Array(128),        // location stack\n        table = this.table,\n        sp = 0;                         // 'stack pointer': index into the stacks\n\n    var recovering = 0;                 // (only used when the grammar contains error recovery rules)\n    var TERROR = this.TERROR,\n        EOF = this.EOF,\n        ERROR_RECOVERY_TOKEN_DISCARD_COUNT = (this.options.errorRecoveryTokenDiscardCount | 0) || 3;\n    var NO_ACTION = [0, table.length /* ensures that anyone using this new state will fail dramatically! */];\n\n    //this.reductionCount = this.shiftCount = 0;\n\n    var lexer;\n    if (this.__lexer__) {\n        lexer = this.__lexer__;\n    } else {\n        lexer = this.__lexer__ = Object.create(this.lexer);\n    }\n\n    var sharedState = {\n      yy: {\n        parseError: null,\n        quoteName: null,\n        lexer: null,\n        parser: null,\n        pre_parse: null,\n        post_parse: null\n      }\n    };\n    // copy state\n    for (var k in this.yy) {\n      if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n        sharedState.yy[k] = this.yy[k];\n      }\n    }\n\n    sharedState.yy.lexer = lexer;\n    sharedState.yy.parser = this;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    if (this.yyErrOk === 1) {\n        this.yyErrOk = function yyErrOk() {\n            recovering = 0;\n        };\n    }\n\n\n\n\n\n\n    lexer.setInput(input, sharedState.yy);\n\n    if (typeof lexer.yylloc === 'undefined') {\n        lexer.yylloc = {};\n    }\n    var yyloc = lexer.yylloc;\n    lstack[sp] = yyloc;\n    vstack[sp] = null;\n    sstack[sp] = 0;\n    stack[sp] = 0;\n    ++sp;\n\n    if (typeof lexer.yytext === 'undefined') {\n        lexer.yytext = '';\n    }\n    var yytext = lexer.yytext;\n    if (typeof lexer.yylineno === 'undefined') {\n        lexer.yylineno = 0;\n    }\n\n\n\n\n    var ranges = lexer.options && lexer.options.ranges;\n\n    // Does the shared state override the default `parseError` that already comes with this instance?\n    if (typeof sharedState.yy.parseError === 'function') {\n        this.parseError = sharedState.yy.parseError;\n    } else {\n        this.parseError = this.originalParseError;\n    }\n\n    // Does the shared state override the default `quoteName` that already comes with this instance?\n    if (typeof sharedState.yy.quoteName === 'function') {\n        this.quoteName = sharedState.yy.quoteName;\n    } else {\n        this.quoteName = this.originalQuoteName;\n    }\n\n    // set up the cleanup function; make it an API so that external code can re-use this one in case of\n    // calamities or when the `%options no-try-catch` option has been specified for the grammar, in which\n    // case this parse() API method doesn't come with a `finally { ... }` block any more!\n    //\n    // NOTE: as this API uses parse() as a closure, it MUST be set again on every parse() invocation,\n    //       or else your `sharedState`, etc. references will be *wrong*!\n    //\n    //       The function resets itself to the previous set up one to support reentrant parsers.\n    this.cleanupAfterParse = function parser_cleanupAfterParse(resultValue, invoke_post_methods) {\n        var rv;\n\n        if (invoke_post_methods) {\n            if (sharedState.yy.post_parse) {\n                rv = sharedState.yy.post_parse.call(this, sharedState.yy, resultValue);\n                if (typeof rv !== 'undefined') resultValue = rv;\n            }\n            if (this.post_parse) {\n                rv = this.post_parse.call(this, sharedState.yy, resultValue);\n                if (typeof rv !== 'undefined') resultValue = rv;\n            }\n        }\n\n        if (this.__reentrant_call_depth > 1) return resultValue;        // do not (yet) kill the sharedState when this is a reentrant run.\n\n        // prevent lingering circular references from causing memory leaks:\n        if (sharedState.yy) {\n            sharedState.yy.parseError = undefined;\n            sharedState.yy.quoteName = undefined;\n            sharedState.yy.lexer = undefined;\n            sharedState.yy.parser = undefined;\n            if (lexer.yy === sharedState.yy) {\n                lexer.yy = undefined;\n            }\n        }\n        sharedState.yy = undefined;\n        this.parseError = this.originalParseError;\n        this.quoteName = this.originalQuoteName;\n\n        // nuke the vstack[] array at least as that one will still reference obsoleted user values.\n        // To be safe, we nuke the other internal stack columns as well...\n        stack.length = 0;               // fastest way to nuke an array without overly bothering the GC\n        sstack.length = 0;\n        lstack.length = 0;\n        vstack.length = 0;\n        stack_pointer = 0;\n\n        return resultValue;\n    };\n\n    // NOTE: as this API uses parse() as a closure, it MUST be set again on every parse() invocation,\n    //       or else your `lexer`, `sharedState`, etc. references will be *wrong*!\n    this.constructParseErrorInfo = function parser_constructParseErrorInfo(msg, ex, expected, recoverable) {\n        return {\n            errStr: msg,\n            exception: ex,\n            text: lexer.match,\n            value: lexer.yytext,\n            token: this.describeSymbol(symbol) || symbol,\n            token_id: symbol,\n            line: lexer.yylineno,\n            loc: lexer.yylloc,\n            expected: expected,\n            recoverable: recoverable,\n            state: state,\n            action: action,\n            new_state: newState,\n            symbol_stack: stack,\n            state_stack: sstack,\n            value_stack: vstack,\n            location_stack: lstack,\n            stack_pointer: sp,\n            yy: sharedState.yy,\n            lexer: lexer,\n\n            // and make sure the error info doesn't stay due to potential ref cycle via userland code manipulations (memory leak opportunity!):\n            destroy: function destructParseErrorInfo() {\n                // remove cyclic references added to error info:\n                // info.yy = null;\n                // info.lexer = null;\n                // info.value = null;\n                // info.value_stack = null;\n                // ...\n                var rec = !!this.recoverable;\n                for (var key in this) {\n                    if (this.hasOwnProperty(key) && typeof key !== 'function') {\n                        this[key] = undefined;\n                    }\n                }\n                this.recoverable = rec;\n            }\n        };\n    };\n\n\n    function lex() {\n        var token = lexer.lex();\n        // if token isn't its numeric value, convert\n        if (typeof token !== 'number') {\n            token = self.symbols_[token] || token;\n        }\n        return token || EOF;\n    }\n\n\n    var symbol = 0;\n    var preErrorSymbol = 0;\n    var state, action, r, t;\n    var yyval = {};\n    var p, len, this_production;\n    var lstack_begin, lstack_end;\n    var newState;\n    var retval = false;\n\n\n    // Return the rule stack depth where the nearest error rule can be found.\n    // Return -1 when no error recovery rule was found.\n    function locateNearestErrorRecoveryRule(state) {\n        var stack_probe = sp - 1;\n        var depth = 0;\n\n        // try to recover from error\n        for (;;) {\n            // check for error recovery rule in this state\n            var t = table[state][TERROR] || NO_ACTION;\n            if (t[0]) {\n                return depth;\n            }\n            if (state === 0 /* $accept rule */ || stack_probe < 1) {\n                return -1; // No suitable error recovery rule available.\n            }\n            --stack_probe; // popStack(1): [symbol, action]\n            state = sstack[stack_probe];\n            ++depth;\n        }\n    }\n\n    try {\n        this.__reentrant_call_depth++;\n\n        if (this.pre_parse) {\n            this.pre_parse.call(this, sharedState.yy);\n        }\n        if (sharedState.yy.pre_parse) {\n            sharedState.yy.pre_parse.call(this, sharedState.yy);\n        }\n\n        newState = sstack[sp - 1];\n        for (;;) {\n            // retrieve state number from top of stack\n            state = newState;               // sstack[sp - 1];\n\n            // use default actions if available\n            if (this.defaultActions[state]) {\n                action = 2;\n                newState = this.defaultActions[state];\n            } else {\n                // The single `==` condition below covers both these `===` comparisons in a single\n                // operation:\n                //\n                //     if (symbol === null || typeof symbol === 'undefined') ...\n                if (!symbol) {\n                    symbol = lex();\n                }\n                // read action for current state and first input\n                t = (table[state] && table[state][symbol]) || NO_ACTION;\n                newState = t[1];\n                action = t[0];\n\n\n\n\n                // handle parse error\n                if (!action) {\n                    // first see if there's any chance at hitting an error recovery rule:\n                    var error_rule_depth = locateNearestErrorRecoveryRule(state);\n                    var errStr = null;\n                    var errSymbolDescr = (this.describeSymbol(symbol) || symbol);\n                    var expected = this.collect_expected_token_set(state);\n\n                    if (!recovering) {\n                        // Report error\n                        if (lexer.showPosition) {\n                            errStr = 'Parse error on line ' + (lexer.yylineno + 1) + ':\\n' + lexer.showPosition(79 - 10, 10) + '\\n';\n                        } else {\n                            errStr = 'Parse error on line ' + (lexer.yylineno + 1) + ': ';\n                        }\n                        if (expected.length) {\n                            errStr += 'Expecting ' + expected.join(', ') + ', got unexpected ' + errSymbolDescr;\n                        } else {\n                            errStr += 'Unexpected ' + errSymbolDescr;\n                        }\n                        p = this.constructParseErrorInfo(errStr, null, expected, (error_rule_depth >= 0));\n                        r = this.parseError(p.errStr, p);\n\n\n                        if (!p.recoverable) {\n                            retval = r;\n                            break;\n                        } else {\n                            // TODO: allow parseError callback to edit symbol and or state tat the start of the error recovery process...\n                        }\n                    }\n\n\n\n                    // just recovered from another error\n                    if (recovering === ERROR_RECOVERY_TOKEN_DISCARD_COUNT && error_rule_depth >= 0) {\n                        // only barf a fatal hairball when we're out of look-ahead symbols and none hit a match;\n                        // this DOES discard look-ahead while recovering from an error when said look-ahead doesn't\n                        // suit the error recovery rules... The error HAS been reported already so we're fine with\n                        // throwing away a few items if that is what it takes to match the nearest recovery rule!\n                        if (symbol === EOF || preErrorSymbol === EOF) {\n                            p = this.constructParseErrorInfo((errStr || 'Parsing halted while starting to recover from another error.'), null, expected, false);\n                            retval = this.parseError(p.errStr, p);\n                            break;\n                        }\n\n                        // discard current lookahead and grab another\n\n                        yytext = lexer.yytext;\n\n                        yyloc = lexer.yylloc;\n\n                        symbol = lex();\n\n\n                    }\n\n                    // try to recover from error\n                    if (error_rule_depth < 0) {\n                        p = this.constructParseErrorInfo((errStr || 'Parsing halted. No suitable error recovery rule available.'), null, expected, false);\n                        retval = this.parseError(p.errStr, p);\n                        break;\n                    }\n                    sp -= error_rule_depth;\n\n                    preErrorSymbol = (symbol === TERROR ? 0 : symbol); // save the lookahead token\n                    symbol = TERROR;            // insert generic error symbol as new lookahead\n                    // allow N (default: 3) real symbols to be shifted before reporting a new error\n                    recovering = ERROR_RECOVERY_TOKEN_DISCARD_COUNT;\n\n                    newState = sstack[sp - 1];\n\n\n\n                    continue;\n                }\n            }\n\n\n            switch (action) {\n            // catch misc. parse failures:\n            default:\n                // this shouldn't happen, unless resolve defaults are off\n                if (action instanceof Array) {\n                    p = this.constructParseErrorInfo(('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol), null, null, false);\n                    retval = this.parseError(p.errStr, p);\n                    break;\n                }\n                // Another case of better safe than sorry: in case state transitions come out of another error recovery process\n                // or a buggy LUT (LookUp Table):\n                p = this.constructParseErrorInfo('Parsing halted. No viable error recovery approach available due to internal system failure.', null, null, false);\n                retval = this.parseError(p.errStr, p);\n                break;\n\n            // shift:\n            case 1:\n                //this.shiftCount++;\n                stack[sp] = symbol;\n                vstack[sp] = lexer.yytext;\n                lstack[sp] = lexer.yylloc;\n                sstack[sp] = newState; // push state\n                ++sp;\n                symbol = 0;\n                if (!preErrorSymbol) { // normal execution / no error\n                    // Pick up the lexer details for the current symbol as that one is not 'look-ahead' any more:\n\n                    yytext = lexer.yytext;\n\n                    yyloc = lexer.yylloc;\n\n                    if (recovering > 0) {\n                        recovering--;\n\n                    }\n                } else {\n                    // error just occurred, resume old lookahead f/ before error, *unless* that drops us straight back into error mode:\n                    symbol = preErrorSymbol;\n                    preErrorSymbol = 0;\n\n                    // read action for current state and first input\n                    t = (table[newState] && table[newState][symbol]) || NO_ACTION;\n                    if (!t[0]) {\n                        // forget about that symbol and move forward: this wasn't an 'forgot to insert' error type where\n                        // (simple) stuff might have been missing before the token which caused the error we're\n                        // recovering from now...\n\n                        symbol = 0;\n                    }\n                }\n\n                continue;\n\n            // reduce:\n            case 2:\n                //this.reductionCount++;\n                this_production = this.productions_[newState - 1];  // `this.productions_[]` is zero-based indexed while states start from 1 upwards...\n                len = this_production[1];\n                lstack_end = sp;\n                lstack_begin = lstack_end - (len || 1);\n                lstack_end--;\n\n\n\n                // Make sure subsequent `$$ = $1` default action doesn't fail\n                // for rules where len==0 as then there's no $1 (you're reducing an epsilon rule then!)\n                //\n                // Also do this to prevent nasty action block codes to *read* `$0` or `$$`\n                // and *not* get `undefined` as a result for their efforts!\n                vstack[sp] = undefined;\n\n                // perform semantic action\n                yyval.$ = vstack[sp - len]; // default to $$ = $1; result must produce `undefined` when len == 0, as then there's no $1\n\n                // default location, uses first token for firsts, last for lasts\n                yyval._$ = {\n                    first_line: lstack[lstack_begin].first_line,\n                    last_line: lstack[lstack_end].last_line,\n                    first_column: lstack[lstack_begin].first_column,\n                    last_column: lstack[lstack_end].last_column\n                };\n                if (ranges) {\n                  yyval._$.range = [lstack[lstack_begin].range[0], lstack[lstack_end].range[1]];\n                }\n\n                r = this.performAction.call(yyval, yytext, yyloc, sharedState.yy, newState, sp - 1, vstack, lstack);\n\n                if (typeof r !== 'undefined') {\n                    retval = r;\n                    break;\n                }\n\n                // pop off stack\n                sp -= len;\n\n                // don't overwrite the `symbol` variable: use a local var to speed things up:\n                var ntsymbol = this_production[0];    // push nonterminal (reduce)\n                stack[sp] = ntsymbol;\n                vstack[sp] = yyval.$;\n                lstack[sp] = yyval._$;\n                // goto new state = table[STATE][NONTERMINAL]\n                newState = table[sstack[sp - 1]][ntsymbol];\n                sstack[sp] = newState;\n                ++sp;\n\n                continue;\n\n            // accept:\n            case 3:\n                retval = true;\n                // Return the `$accept` rule's `$$` result, if available.\n                //\n                // Also note that JISON always adds this top-most `$accept` rule (with implicit,\n                // default, action):\n                //\n                //     $accept: <startSymbol> $end\n                //                  %{ $$ = $1; @$ = @1; %}\n                //\n                // which, combined with the parse kernel's `$accept` state behaviour coded below,\n                // will produce the `$$` value output of the <startSymbol> rule as the parse result,\n                // IFF that result is *not* `undefined`. (See also the parser kernel code.)\n                //\n                // In code:\n                //\n                //                  %{\n                //                      @$ = @1;            // if location tracking support is included\n                //                      if (typeof $1 !== 'undefined')\n                //                          return $1;\n                //                      else\n                //                          return true;           // the default parse result if the rule actions don't produce anything\n                //                  %}\n                if (typeof yyval.$ !== 'undefined') {\n                    retval = yyval.$;\n                }\n                break;\n            }\n\n            // break out of loop: we accept or fail with error\n            break;\n        }\n    } catch (ex) {\n        // report exceptions through the parseError callback too:\n        p = this.constructParseErrorInfo('Parsing aborted due to exception.', ex, null, false);\n        retval = this.parseError(p.errStr, p);\n    } finally {\n        retval = this.cleanupAfterParse(retval, true);\n        this.__reentrant_call_depth--;\n    }\n\n    return retval;\n},\nyyErrOk: 1\n};\nparser.originalParseError = parser.parseError;\nparser.originalQuoteName = parser.quoteName;\n/*! @file lex.l\n * @brief Lexical Analysis\n *********************************************************************\n * a simple calculator with variables\n *\n * sample-files for a artikel in developerworks.ibm.com\n * Author: Christian Hagen, chagen@de.ibm.com\n * \n * @par parse.l & parse.c\n * grammar for the parser-generator bison\n * \n *********************************************************************\n */\n\n// #define YYERROR_VERBOSE 1\n// #define YYDEBUG 1\n// int yydebug=0;\n\n/*--------------------------------------------------------------------\n * \n * global variables\n * \n *------------------------------------------------------------------*/\nstatic Variable *var;\n\n\n/*------------------------------------------------------------------------------\n * \n * functions\n * \n *----------------------------------------------------------------------------*/\n//extern\n//void yyerror(char *s) {\n// // simple error-message\n// //  printf(\"Error '%s'\\n\", s);\n// //  a more sophisticated error-function\n//  PrintError(s);\n//}\n\n/*--------------------------------------------------------------------\n * parse.y\n *------------------------------------------------------------------*/\n/* generated by jison-lex 0.3.4-144 */\nvar lexer = (function () {\n// See also:\n// http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508\n// but we keep the prototype.constructor and prototype.name assignment lines too for compatibility\n// with userland code which might access the derived class in a 'classic' way.\nfunction JisonLexerError(msg, hash) {\n    Object.defineProperty(this, 'name', {\n        enumerable: false,\n        writable: false,\n        value: 'JisonLexerError'\n    });\n\n    if (msg == null) msg = '???';\n\n    Object.defineProperty(this, 'message', {\n        enumerable: false,\n        writable: true,\n        value: msg\n    });\n\n    this.hash = hash;\n\n    var stacktrace;\n    if (hash && hash.exception instanceof Error) {\n        var ex2 = hash.exception;\n        this.message = ex2.message || msg;\n        stacktrace = ex2.stack;\n    }\n    if (!stacktrace) {\n        if (Error.hasOwnProperty('captureStackTrace')) { // V8\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            stacktrace = (new Error(msg)).stack;\n        }\n    }\n    if (stacktrace) {\n        Object.defineProperty(this, 'stack', {\n            enumerable: false,\n            writable: false,\n            value: stacktrace\n        });\n    }\n}\n\n    if (typeof Object.setPrototypeOf === 'function') {\n        Object.setPrototypeOf(JisonLexerError.prototype, Error.prototype);\n    } else {\n        JisonLexerError.prototype = Object.create(Error.prototype);\n    }\n    JisonLexerError.prototype.constructor = JisonLexerError;\n    JisonLexerError.prototype.name = 'JisonLexerError';\n\n\nvar lexer = {\n    EOF: 1,\n    ERROR: 2,\n\n    // JisonLexerError: JisonLexerError,        // <-- injected by the code generator\n\n    // options: {},                             // <-- injected by the code generator\n\n    // yy: ...,                                 // <-- injected by setInput()\n\n    __currentRuleSet__: null,                   // <-- internal rule set cache for the current lexer state\n\n    parseError: function lexer_parseError(str, hash) {\n        if (this.yy.parser && typeof this.yy.parser.parseError === 'function') {\n            return this.yy.parser.parseError(str, hash) || this.ERROR;\n        } else {\n            throw new this.JisonLexerError(str);\n        }\n    },\n\n    // clear the lexer token context; intended for internal use only\n    clear: function lexer_clear() {\n        this.yytext = '';\n        this.yyleng = 0;\n        this.match = '';\n        this.matches = false;\n        this._more = false;\n        this._backtrack = false;\n    },\n\n    // resets the lexer, sets new input\n    setInput: function lexer_setInput(input, yy) {\n        this.yy = yy || this.yy || {};\n        this._input = input;\n        this.clear();\n        this._signaled_error_token = this.done = false;\n        this.yylineno = 0;\n        this.matched = '';\n        this.conditionStack = ['INITIAL'];\n        this.__currentRuleSet__ = null;\n        this.yylloc = {\n            first_line: 1,\n            first_column: 0,\n            last_line: 1,\n            last_column: 0\n        };\n        if (this.options.ranges) {\n            this.yylloc.range = [0, 0];\n        }\n        this.offset = 0;\n        return this;\n    },\n\n    // consumes and returns one char from the input\n    input: function lexer_input() {\n        if (!this._input) {\n            this.done = true;\n            return null;\n        }\n        var ch = this._input[0];\n        this.yytext += ch;\n        this.yyleng++;\n        this.offset++;\n        this.match += ch;\n        this.matched += ch;\n        // Count the linenumber up when we hit the LF (or a stand-alone CR).\n        // On CRLF, the linenumber is incremented when you fetch the CR or the CRLF combo\n        // and we advance immediately past the LF as well, returning both together as if\n        // it was all a single 'character' only.\n        var slice_len = 1;\n        var lines = false;\n        if (ch === '\\n') {\n            lines = true;\n        } else if (ch === '\\r') {\n            lines = true;\n            var ch2 = this._input[1];\n            if (ch2 === '\\n') {\n                slice_len++;\n                ch += ch2;\n                this.yytext += ch2;\n                this.yyleng++;\n                this.offset++;\n                this.match += ch2;\n                this.matched += ch2;\n                if (this.options.ranges) {\n                    this.yylloc.range[1]++;\n                }\n            }\n        }\n        if (lines) {\n            this.yylineno++;\n            this.yylloc.last_line++;\n        } else {\n            this.yylloc.last_column++;\n        }\n        if (this.options.ranges) {\n            this.yylloc.range[1]++;\n        }\n\n        this._input = this._input.slice(slice_len);\n        return ch;\n    },\n\n    // unshifts one char (or a string) into the input\n    unput: function lexer_unput(ch) {\n        var len = ch.length;\n        var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n        this._input = ch + this._input;\n        this.yytext = this.yytext.substr(0, this.yytext.length - len);\n        //this.yyleng -= len;\n        this.offset -= len;\n        var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n        this.match = this.match.substr(0, this.match.length - len);\n        this.matched = this.matched.substr(0, this.matched.length - len);\n\n        if (lines.length - 1) {\n            this.yylineno -= lines.length - 1;\n        }\n\n        this.yylloc.last_line = this.yylineno + 1;\n        this.yylloc.last_column = (lines ?\n                (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n                + oldLines[oldLines.length - lines.length].length - lines[0].length :\n                this.yylloc.first_column - len);\n\n        if (this.options.ranges) {\n            this.yylloc.range[1] = this.yylloc.range[0] + this.yyleng - len;\n        }\n        this.yyleng = this.yytext.length;\n        this.done = false;\n        return this;\n    },\n\n    // When called from action, caches matched text and appends it on next action\n    more: function lexer_more() {\n        this._more = true;\n        return this;\n    },\n\n    // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\n    reject: function lexer_reject() {\n        if (this.options.backtrack_lexer) {\n            this._backtrack = true;\n        } else {\n            // when the parseError() call returns, we MUST ensure that the error is registered.\n            // We accomplish this by signaling an 'error' token to be produced for the current\n            // .lex() run.\n            this._signaled_error_token = (this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n                text: this.match,\n                token: null,\n                line: this.yylineno,\n                loc: this.yylloc,\n                lexer: this\n            }) || this.ERROR);\n        }\n        return this;\n    },\n\n    // retain first n characters of the match\n    less: function lexer_less(n) {\n        return this.unput(this.match.slice(n));\n    },\n\n    // return (part of the) already matched input, i.e. for error messages.\n    // Limit the returned string length to `maxSize` (default: 20).\n    // Limit the returned string to the `maxLines` number of lines of input (default: 1).\n    // Negative limit values equal *unlimited*.\n    pastInput: function lexer_pastInput(maxSize, maxLines) {\n        var past = this.matched.substring(0, this.matched.length - this.match.length);\n        if (maxSize < 0)\n            maxSize = past.length;\n        else if (!maxSize)\n            maxSize = 20;\n        if (maxLines < 0)\n            maxLines = past.length;         // can't ever have more input lines than this!\n        else if (!maxLines)\n            maxLines = 1;\n        // `substr` anticipation: treat \\r\\n as a single character and take a little\n        // more than necessary so that we can still properly check against maxSize\n        // after we've transformed and limited the newLines in here:\n        past = past.substr(-maxSize * 2 - 2);\n        // now that we have a significantly reduced string to process, transform the newlines\n        // and chop them, then limit them:\n        var a = past.replace(/\\r\\n|\\r/g, '\\n').split('\\n');\n        a = a.slice(-maxLines);\n        past = a.join('\\n');\n        // When, after limiting to maxLines, we still have to much to return, \n        // do add an ellipsis prefix...\n        if (past.length > maxSize) {\n            past = '...' + past.substr(-maxSize);\n        }\n        return past;\n    },\n\n    // return (part of the) upcoming input, i.e. for error messages.\n    // Limit the returned string length to `maxSize` (default: 20).\n    // Limit the returned string to the `maxLines` number of lines of input (default: 1).\n    // Negative limit values equal *unlimited*.\n    upcomingInput: function lexer_upcomingInput(maxSize, maxLines) {\n        var next = this.match;\n        if (maxSize < 0)\n            maxSize = next.length + this._input.length;\n        else if (!maxSize)\n            maxSize = 20;\n        if (maxLines < 0)\n            maxLines = maxSize;         // can't ever have more input lines than this!\n        else if (!maxLines)\n            maxLines = 1;\n        // `substring` anticipation: treat \\r\\n as a single character and take a little\n        // more than necessary so that we can still properly check against maxSize\n        // after we've transformed and limited the newLines in here:\n        if (next.length < maxSize * 2 + 2) {\n            next += this._input.substring(0, maxSize * 2 + 2);  // substring is faster on Chrome/V8\n        }\n        // now that we have a significantly reduced string to process, transform the newlines\n        // and chop them, then limit them:\n        var a = next.replace(/\\r\\n|\\r/g, '\\n').split('\\n');\n        a = a.slice(0, maxLines);\n        next = a.join('\\n');\n        // When, after limiting to maxLines, we still have to much to return, \n        // do add an ellipsis postfix...\n        if (next.length > maxSize) {\n            next = next.substring(0, maxSize) + '...';\n        }\n        return next;\n    },\n\n    // return a string which displays the character position where the lexing error occurred, i.e. for error messages\n    showPosition: function lexer_showPosition(maxPrefix, maxPostfix) {\n        var pre = this.pastInput(maxPrefix).replace(/\\s/g, ' ');\n        var c = new Array(pre.length + 1).join('-');\n        return pre + this.upcomingInput(maxPostfix).replace(/\\s/g, ' ') + '\\n' + c + '^';\n    },\n\n    // helper function, used to produce a human readable description as a string, given\n    // the input `yylloc` location object. \n    // Set `display_range_too` to TRUE to include the string character inex position(s)\n    // in the description if the `yylloc.range` is available. \n    describeYYLLOC: function lexer_describe_yylloc(yylloc, display_range_too) {\n        var l1 = yylloc.first_line;\n        var l2 = yylloc.last_line;\n        var o1 = yylloc.first_column;\n        var o2 = yylloc.last_column - 1;\n        var dl = l2 - l1;\n        var d_o = (dl === 0 ? o2 - o1 : 1000);\n        var rv;\n        if (dl === 0) {\n            rv = 'line ' + l1 + ', ';\n            if (d_o === 0) {\n                rv += 'column ' + o1;\n            } else {\n                rv += 'columns ' + o1 + ' .. ' + o2;\n            }\n        } else {\n            rv = 'lines ' + l1 + '(column ' + o1 + ') .. ' + l2 + '(column ' + o2 + ')';\n        }\n        if (yylloc.range && display_range_too) {\n            var r1 = yylloc.range[0];\n            var r2 = yylloc.range[1] - 1;\n            if (r2 === r1) {\n                rv += ' {String Offset: ' + r1 + '}';\n            } else {\n                rv += ' {String Offset range: ' + r1 + ' .. ' + r2 + '}';\n            }\n        }\n        return rv;\n        // return JSON.stringify(yylloc);\n    },\n\n    // test the lexed token: return FALSE when not a match, otherwise return token.\n    //\n    // `match` is supposed to be an array coming out of a regex match, i.e. `match[0]`\n    // contains the actually matched text string.\n    //\n    // Also move the input cursor forward and update the match collectors:\n    // - yytext\n    // - yyleng\n    // - match\n    // - matches\n    // - yylloc\n    // - offset\n    test_match: function lexer_test_match(match, indexed_rule) {\n        var token,\n            lines,\n            backup,\n            match_str;\n\n        if (this.options.backtrack_lexer) {\n            // save context\n            backup = {\n                yylineno: this.yylineno,\n                yylloc: {\n                    first_line: this.yylloc.first_line,\n                    last_line: this.last_line,\n                    first_column: this.yylloc.first_column,\n                    last_column: this.yylloc.last_column\n                },\n                yytext: this.yytext,\n                match: this.match,\n                matches: this.matches,\n                matched: this.matched,\n                yyleng: this.yyleng,\n                offset: this.offset,\n                _more: this._more,\n                _input: this._input,\n                yy: this.yy,\n                conditionStack: this.conditionStack.slice(0),\n                done: this.done\n            };\n            if (this.options.ranges) {\n                backup.yylloc.range = this.yylloc.range.slice(0);\n            }\n        }\n\n        match_str = match[0];\n        lines = match_str.match(/(?:\\r\\n?|\\n).*/g);\n        if (lines) {\n            this.yylineno += lines.length;\n        }\n        this.yylloc = {\n            first_line: this.yylloc.last_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.last_column,\n            last_column: lines ?\n                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n                         this.yylloc.last_column + match_str.length\n        };\n        this.yytext += match_str;\n        this.match += match_str;\n        this.matches = match;\n        this.yyleng = this.yytext.length;\n        if (this.options.ranges) {\n            this.yylloc.range = [this.offset, this.offset + this.yyleng];\n        }\n        // previous lex rules MAY have invoked the `more()` API rather than producing a token:\n        // those rules will already have moved this `offset` forward matching their match lengths,\n        // hence we must only add our own match length now:\n        this.offset += match_str.length;\n        this._more = false;\n        this._backtrack = false;\n        this._input = this._input.slice(match_str.length);\n        this.matched += match_str;\n        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n        if (this.done && this._input) {\n            this.done = false;\n        }\n        if (token) {\n            return token;\n        } else if (this._backtrack) {\n            // recover context\n            for (var k in backup) {\n                this[k] = backup[k];\n            }\n            this.__currentRuleSet__ = null;\n            return false; // rule action called reject() implying the next rule should be tested instead.\n        } else if (this._signaled_error_token) {\n            // produce one 'error' token as .parseError() in reject() did not guarantee a failure signal by throwing an exception!\n            token = this._signaled_error_token;\n            this._signaled_error_token = false;\n            return token;\n        }\n        return false;\n    },\n\n    // return next match in input\n    next: function lexer_next() {\n        if (this.done) {\n            this.clear();\n            return this.EOF;\n        }\n        if (!this._input) {\n            this.done = true;\n        }\n\n        var token,\n            match,\n            tempMatch,\n            index;\n        if (!this._more) {\n            this.clear();\n        }\n        var rules = this.__currentRuleSet__;\n        if (!rules) {\n            // Update the ruleset cache as we apparently encountered a state change or just started lexing.\n            // The cache is set up for fast lookup -- we assume a lexer will switch states much less often than it will\n            // invoke the `lex()` token-producing API and related APIs, hence caching the set for direct access helps\n            // speed up those activities a tiny bit.\n            rules = this.__currentRuleSet__ = this._currentRules();\n        }\n        for (var i = 0, len = rules.length; i < len; i++) {\n            tempMatch = this._input.match(this.rules[rules[i]]);\n            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n                match = tempMatch;\n                index = i;\n                if (this.options.backtrack_lexer) {\n                    token = this.test_match(tempMatch, rules[i]);\n                    if (token !== false) {\n                        return token;\n                    } else if (this._backtrack) {\n                        match = undefined;\n                        continue; // rule action called reject() implying a rule MISmatch.\n                    } else {\n                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n                        return false;\n                    }\n                } else if (!this.options.flex) {\n                    break;\n                }\n            }\n        }\n        if (match) {\n            token = this.test_match(match, rules[index]);\n            if (token !== false) {\n                return token;\n            }\n            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n            return false;\n        }\n        if (this._input === '') {\n            this.clear();\n            this.done = true;\n            return this.EOF;\n        } else {\n            token = this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n                text: this.match + this._input,\n                token: null,\n                line: this.yylineno,\n                loc: this.yylloc,\n                lexer: this\n            }) || this.ERROR;\n            if (token === this.ERROR) {\n                // we can try to recover from a lexer error that parseError() did not 'recover' for us, by moving forward at least one character at a time:\n                if (!this.match.length) {\n                    this.input();\n                }\n            }\n            return token;\n        }\n    },\n\n    // return next match that has a token\n    lex: function lexer_lex() {\n        var r;\n        // allow the PRE/POST handlers set/modify the return token for maximum flexibility of the generated lexer:\n        if (typeof this.options.pre_lex === 'function') {\n            r = this.options.pre_lex.call(this);\n        }\n        while (!r) {\n            r = this.next();\n        }\n        if (typeof this.options.post_lex === 'function') {\n            // (also account for a userdef function which does not return any value: keep the token as is)\n            r = this.options.post_lex.call(this, r) || r;\n        }\n        return r;\n    },\n\n    // backwards compatible alias for `pushState()`;\n    // the latter is symmetrical with `popState()` and we advise to use\n    // those APIs in any modern lexer code, rather than `begin()`.\n    begin: function lexer_begin(condition) {\n        return this.pushState(condition);\n    },\n\n    // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n    pushState: function lexer_pushState(condition) {\n        this.conditionStack.push(condition);\n        this.__currentRuleSet__ = null;\n        return this;\n    },\n\n    // pop the previously active lexer condition state off the condition stack\n    popState: function lexer_popState() {\n        var n = this.conditionStack.length - 1;\n        if (n > 0) {\n            this.__currentRuleSet__ = null;\n            return this.conditionStack.pop();\n        } else {\n            return this.conditionStack[0];\n        }\n    },\n\n    // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n    topState: function lexer_topState(n) {\n        n = this.conditionStack.length - 1 - Math.abs(n || 0);\n        if (n >= 0) {\n            return this.conditionStack[n];\n        } else {\n            return 'INITIAL';\n        }\n    },\n\n    // (internal) determine the lexer rule set which is active for the currently active lexer condition state\n    _currentRules: function lexer__currentRules() {\n        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n        } else {\n            return this.conditions['INITIAL'].rules;\n        }\n    },\n\n    // return the number of states currently on the stack\n    stateStackSize: function lexer_stateStackSize() {\n        return this.conditionStack.length;\n    },\noptions: {},\nJisonLexerError: JisonLexerError,\nperformAction: function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {\n\nvar YYSTATE = YY_START;\nswitch($avoiding_name_collisions) {\ncase 0 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       [ \\t\\r\\n]+ */ \n \n    /* eat up whitespace */\n    BeginToken(yy_.yytext); \n     \nbreak;\ncase 1 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+ */ \n \n    BeginToken(yy_.yytext); \n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 2 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+\\.{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 3 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+[eE][\"+\"\"-\"]?{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 4 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+\\.{DIGIT}*[eE][\"+\"\"-\"]?{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 5 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {ID} */ \n \n    BeginToken(yy_.yytext);\n    yylval.string = malloc(strlen(yy_.yytext)+1);\n    strcpy(yylval.string, yy_.yytext);\n    return IDENTIFIER;\n     \nbreak;\ncase 6 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\+ */ \n  BeginToken(yy_.yytext); return ADD;  \nbreak;\ncase 7 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       - */ \n  BeginToken(yy_.yytext); return SUB;  \nbreak;\ncase 8 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\* */ \n  BeginToken(yy_.yytext); return MULT;  \nbreak;\ncase 9 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\/ */ \n  BeginToken(yy_.yytext); return DIV;  \nbreak;\ncase 10 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\( */ \n  BeginToken(yy_.yytext); return LBRACE;  \nbreak;\ncase 11 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\) */ \n  BeginToken(yy_.yytext); return RBRACE;  \nbreak;\ncase 12 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       ; */ \n  BeginToken(yy_.yytext); return SEMICOLON;  \nbreak;\ncase 13 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       = */ \n  BeginToken(yy_.yytext); return ASSIGN;  \nbreak;\ncase 14 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       . */ \n \n    BeginToken(yy_.yytext);\n    return yy_.yytext[0];\n     \nbreak;\ndefault:\n  return this.simpleCaseActionClusters[$avoiding_name_collisions];\n}\n},\nsimpleCaseActionClusters: {\n\n},\nrules: [\n/^(?:[ \\t\\r\\n]+)/,\n/^(?:([0-9])+)/,\n/^(?:([0-9])+\\.([0-9])*)/,\n/^(?:([0-9])+[Ee][\"+]?([0-9])*)/,\n/^(?:([0-9])+\\.([0-9])*[Ee][\"+]?([0-9])*)/,\n/^(?:([A-Z_a-z][0-9A-Z_a-z]*))/,\n/^(?:\\+)/,\n/^(?:-)/,\n/^(?:\\*)/,\n/^(?:\\/)/,\n/^(?:\\()/,\n/^(?:\\))/,\n/^(?:;)/,\n/^(?:=)/,\n/^(?:.)/\n],\nconditions: {\n  \"INITIAL\": {\n    rules: [\n      0,\n      1,\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9,\n      10,\n      11,\n      12,\n      13,\n      14\n    ],\n    inclusive: true\n  }\n}\n};\n\n/*--------------------------------------------------------------------\n * lex.l\n *------------------------------------------------------------------*/;\nreturn lexer;\n})();\nparser.lexer = lexer;\n\nfunction Parser() {\n  this.yy = {};\n}\nParser.prototype = parser;\nparser.Parser = Parser;\n\nreturn new Parser();\n})();\n\n\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\n  exports.parser = ccalcParse;\n  exports.Parser = ccalcParse.Parser;\n  exports.parse = function () {\n    return ccalcParse.parse.apply(ccalcParse, arguments);\n  };\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/chart_composers.gs",
    "content": "/*\nLicense\nCopyright [2013] [Farruco Sanjurjo Arcay]\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n*/\n\nvar TagsTotalPerMonth;\n\nTagsTotalPerMonth = (function(){\n  function TagsTotalPerMonth(){};\n  \n  TagsTotalPerMonth.getDatasource = function (category, months, values){\n    return new CategoryMonthlyExpenseBarChartDataSource(category, months, values);\n  };\n  \n  TagsTotalPerMonth.getType = function (){ return Charts.ChartType.COLUMN};\n  \n  return TagsTotalPerMonth;\n})();\n\n\nvar TagsTotalPerMonthWithMean;\n\nTagsTotalPerMonthWithMean = (function(){\n  function TagsTotalPerMonthWithMean(){};\n  \n  TagsTotalPerMonthWithMean.getDatasource = function (category, months, values){\n    return new CategoryMonthlyWithMeanExpenseDataSource(category, months, values);\n  };\n  \n  TagsTotalPerMonthWithMean.getType = function (){ return Charts.ChartType.LINE};\n  \n  return TagsTotalPerMonthWithMean;\n})();\n\n\nvar TagsAccumulatedPerMonth;\n\nTagsAccumulatedPerMonth = (function(){\n  function TagsAccumulatedPerMonth(){};\n  \n  TagsAccumulatedPerMonth.getDatasource = function (category, months, values){\n    return new CategoryMonthlyAccumulated(category, months, values);\n  };\n  \n  TagsAccumulatedPerMonth.getType = function (){ return Charts.ChartType.AREA};\n  \n  return TagsAccumulatedPerMonth;\n})();\n\nvar MonthTotalsPerTags;\n\nMonthTotalsPerTags = (function(){\n  function MonthTotalsPerTags(){};\n\n  MonthTotalsPerTags.getDatasource = function (month, tags, values){\n    return new CategoryExpenseDataSource(tags, month, values); \n  };\n  \n  MonthTotalsPerTags.getType = function (){ return Charts.ChartType.PIE; };\n  \n  return MonthTotalsPerTags;\n})();\n\nvar SavingsFlowChartComposer = (function(){\n  function SavingsFlowChartComposer(){};\n  \n  SavingsFlowChartComposer.getDatasource = function(months, values){\n    return new SavingsFlowDataSource(months, values);\n  };\n  \n  SavingsFlowChartComposer.getType = function(){ return Charts.ChartType.COLUMN; };\n  \n  return SavingsFlowChartComposer;\n})();\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/classes-old.js",
    "content": "(function() {\n  var Animal, Horse, Snake, sam, tom;\n  var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {\n    for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }\n    function ctor() { this.constructor = child; }\n    ctor.prototype = parent.prototype;\n    child.prototype = new ctor;\n    child.__super__ = parent.prototype;\n    return child;\n  };\n  Animal = (function() {\n    function Animal(name) {\n      this.name = name;\n    }\n    Animal.prototype.move = function(meters) {\n      return alert(this.name + \" moved \" + meters + \"m.\");\n    };\n    return Animal;\n  })();\n  Snake = (function() {\n    __extends(Snake, Animal);\n    function Snake() {\n      Snake.__super__.constructor.apply(this, arguments);\n    }\n    Snake.prototype.move = function() {\n      alert(\"Slithering...\");\n      return Snake.__super__.move.call(this, 5);\n    };\n    return Snake;\n  })();\n  Horse = (function() {\n    __extends(Horse, Animal);\n    function Horse() {\n      Horse.__super__.constructor.apply(this, arguments);\n    }\n    Horse.prototype.move = function() {\n      alert(\"Galloping...\");\n      return Horse.__super__.move.call(this, 45);\n    };\n    return Horse;\n  })();\n  sam = new Snake(\"Sammy the Python\");\n  tom = new Horse(\"Tommy the Palomino\");\n  sam.move();\n  tom.move();\n}).call(this);\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/classes.js",
    "content": "// Generated by CoffeeScript 1.2.1\n(function() {\n  var Animal, Horse, Snake, sam, tom,\n    __hasProp = {}.hasOwnProperty,\n    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };\n\n  Animal = (function() {\n\n    Animal.name = 'Animal';\n\n    function Animal(name) {\n      this.name = name;\n    }\n\n    Animal.prototype.move = function(meters) {\n      return alert(this.name + \" moved \" + meters + \"m.\");\n    };\n\n    return Animal;\n\n  })();\n\n  Snake = (function(_super) {\n\n    __extends(Snake, _super);\n\n    Snake.name = 'Snake';\n\n    function Snake() {\n      return Snake.__super__.constructor.apply(this, arguments);\n    }\n\n    Snake.prototype.move = function() {\n      alert(\"Slithering...\");\n      return Snake.__super__.move.call(this, 5);\n    };\n\n    return Snake;\n\n  })(Animal);\n\n  Horse = (function(_super) {\n\n    __extends(Horse, _super);\n\n    Horse.name = 'Horse';\n\n    function Horse() {\n      return Horse.__super__.constructor.apply(this, arguments);\n    }\n\n    Horse.prototype.move = function() {\n      alert(\"Galloping...\");\n      return Horse.__super__.move.call(this, 45);\n    };\n\n    return Horse;\n\n  })(Animal);\n\n  sam = new Snake(\"Sammy the Python\");\n\n  tom = new Horse(\"Tommy the Palomino\");\n\n  sam.move();\n\n  tom.move();\n\n}).call(this);\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/constant_fold.mjs",
    "content": "// consumes <stdin> and performs constant folding\n// echo '\"use strict\";\"_\"[0],1+2;' | node constant_fold.js\nimport _NodePath from '../NodePath';\nconst {NodePath} = _NodePath;\nimport _WalkCombinator from '../WalkCombinator';\nconst {WalkCombinator} = _WalkCombinator;\n\nconst $CONSTEXPR = Symbol.for('$CONSTEXTR');\nconst $CONSTVALUE = Symbol.for('$CONSTVALUE');\nconst IS_EMPTY = path => {\n  return (path.node.type === 'BlockStatement' && path.node.body.length === 0) ||\n    path.node.type === 'EmptyStatement';\n};\nconst IN_PRAGMA_POS = path => {\n  if (path.parent && Array.isArray(path.parent.node)) {\n    const siblings = path.parent.node;\n    for (let i = 0; i < path.key; i++) {\n      // preceded by non-pragma\n      if (\n        siblings[i].type !== 'ExpressionStatement' ||\n        !IS_CONSTEXPR(siblings[i].expression) ||\n        typeof CONSTVALUE(siblings[i].expression) !== 'string'\n      ) {\n        return false;\n      }\n    }\n  }\n  return true;\n};\nconst IS_PRAGMA = path => {\n  if (path.parent && Array.isArray(path.parent.node)) {\n    const siblings = path.parent.node;\n    for (let i = 0; i < path.key + 1; i++) {\n      // preceded by non-pragma\n      if (\n        siblings[i].type !== 'ExpressionStatement' ||\n        !IS_CONSTEXPR(siblings[i].expression) ||\n        typeof CONSTVALUE(siblings[i].expression) !== 'string'\n      ) {\n        return false;\n      }\n    }\n  }\n  return true;\n};\n// worst case is the completion value\nconst IS_NOT_COMPLETION = path => {\n  while (true) {\n    if (!path.parent) {\n      return true;\n    }\n    if (\n      Array.isArray(path.parent.node) &&\n      path.key !== path.parent.node.length - 1\n    ) {\n      return true;\n    }\n    path = path.parent;\n    while (Array.isArray(path.node)) {\n      path = path.parent;\n    }\n    if (/Function/.test(path.node.type)) {\n      return true;\n    } else if (path.node.type === 'Program') {\n      return false;\n    }\n  }\n};\nconst REMOVE_IF_EMPTY = path => {\n  if (IS_EMPTY(path)) REMOVE(path);\n  return null;\n};\nconst REPLACE_IF_EMPTY = (path, folded) => {\n  if (IS_EMPTY(path)) return REPLACE(path, folded);\n  return path;\n};\nconst REMOVE = path => {\n  if (Array.isArray(path.parent.node)) {\n    path.parent.node.splice(path.key, 1);\n  } else {\n    path.parent.node[path.key] = null;\n  }\n  return null;\n};\nconst REPLACE = (path, folded) => {\n  const replacement = new NodePath(path.parent, folded, path.key);\n  path.parent.node[path.key] = folded;\n  return replacement;\n};\n// no mutation, this is an atomic value\nconst NEG_ZERO = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'UnaryExpression',\n  operator: '-',\n  argument: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 0,\n  }),\n});\nconst INFINITY = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'BinaryExpression',\n  operator: '/',\n  left: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 1,\n  }),\n  right: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 0,\n  }),\n});\nconst NEG_INFINITY = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'BinaryExpression',\n  operator: '/',\n  left: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 1,\n  }),\n  right: NEG_ZERO,\n});\nconst EMPTY = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'EmptyStatement',\n});\nconst NULL = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'Literal',\n  value: null,\n});\nconst NAN = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'BinaryExpression',\n  operator: '/',\n  left: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 0,\n  }),\n  right: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 0,\n  }),\n});\nconst UNDEFINED = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'UnaryExpression',\n  operator: 'void',\n  argument: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 0,\n  }),\n});\n// ESTree doesn't like negative numeric literals\n// this also preserves -0\nconst IS_UNARY_NEGATIVE = node => {\n  if (\n    node.type === 'UnaryExpression' &&\n    node.operator === '-' &&\n    typeof node.argument.value === 'number' &&\n    node.argument.value === node.argument.value &&\n    node.argument.type === 'Literal'\n  ) {\n    return true;\n  }\n  return false;\n};\nconst IS_CONSTEXPR = node => {\n  if (typeof node !== 'object' || node === null) {\n    return false;\n  }\n  // DONT CALCULATE THINGS MULTIPLE TIMES!!@!@#\n  if (node[$CONSTEXPR]) return true;\n  if (node.type === 'ArrayExpression') {\n    for (let i = 0; i < node.elements.length; i++) {\n      const element = node.elements[i];\n      // hole == null\n      if (element !== null && !IS_CONSTEXPR(element)) {\n        return false;\n      }\n    }\n    return true;\n  }\n  if (node.type === 'ObjectExpression') {\n    for (let i = 0; i < node.properties.length; i++) {\n      const element = node.properties[i];\n      if (element.kind !== 'init') return false;\n      if (element.method) return false;\n      let key;\n      if (element.computed) {\n        // be sure {[\"y\"]:1} works\n        if (!IS_CONSTEXPR(element.key)) {\n          return false;\n        }\n      }\n      if (!IS_CONSTEXPR(element.value)) return false;\n    }\n    return true;\n  }\n  if (node.type === 'Literal' || IS_UNDEFINED(node) || IS_NAN(node)) {\n    return true;\n  }\n  if (IS_UNARY_NEGATIVE(node)) {\n    return true;\n  }\n  return false;\n};\nconst IS_NAN = node => {\n  return node === NAN;\n};\nconst IS_UNDEFINED = node => {\n  return node === UNDEFINED;\n};\nconst CONSTVALUE = node => {\n  if (node[$CONSTVALUE]) {\n    return node[$CONSTVALUE];\n  }\n  if (IS_UNDEFINED(node)) return void 0;\n  if (IS_NAN(node)) return +'_';\n  if (!IS_CONSTEXPR(node)) throw new Error('Not a CONSTEXPR');\n  if (node.type === 'ArrayExpression') {\n    let ret = [];\n    ret.length = node.elements.length;\n    for (let i = 0; i < node.elements.length; i++) {\n      if (node.elements[i] !== null) {\n        ret[i] = CONSTVALUE(node.elements[i]);\n      }\n    }\n    return ret;\n  }\n  if (node.type === 'ObjectExpression') {\n    let ret = Object.create(null);\n    for (let i = 0; i < node.properties.length; i++) {\n      const element = node.properties[i];\n      let key;\n      if (element.computed) {\n        key = `${CONSTVALUE(element.key)}`;\n      }\n      else {\n        key = element.key.name;\n      }\n      Object.defineProperty(ret, key, {\n        // duplicate keys...\n        configurable: true,\n        writable: true,\n        value: CONSTVALUE(element.value),\n        enumerable: true\n      });\n    }\n    Object.freeze(ret);\n    return ret;\n  }\n  if (IS_UNARY_NEGATIVE(node)) {\n    return -node.argument.value;\n  }\n  if (node.regex !== void 0) {\n    return new RegExp(node.regex.pattern, node.regex.flags);\n  }\n  return node.value;\n};\nconst CONSTEXPRS = new Map();\nCONSTEXPRS.set(void 0, UNDEFINED);\nCONSTEXPRS.set(+'_', NAN);\nCONSTEXPRS.set(null, NULL);\nconst TO_CONSTEXPR = value => {\n  if (value === -Infinity) {\n    return NEG_INFINITY;\n  }\n  if (value === Infinity) {\n    return INFINITY;\n  }\n  let is_neg_zero = 1 / value === -Infinity;\n  if (is_neg_zero) return NEG_ZERO;\n  if (CONSTEXPRS.has(value)) {\n    return CONSTEXPRS.get(value);\n  }\n  if (typeof value === 'number') {\n    if (value < 0) {\n      const CONSTEXPR = Object.freeze({\n        [$CONSTEXPR]: true,\n        [$CONSTVALUE]: value,\n        type: 'UnaryExpression',\n        operator: '-',\n        argument: Object.freeze({ type: 'Literal', value: -value }),\n      });\n      CONSTEXPRS.set(value, CONSTEXPR);\n      return CONSTEXPR;\n    }\n  }\n  if (\n    value === null ||\n    typeof value === 'number' ||\n    typeof value === 'boolean' ||\n    typeof value === 'string'\n  ) {\n    const CONSTEXPR = Object.freeze({\n      [$CONSTEXPR]: true,\n      [$CONSTVALUE]: value,\n      type: 'Literal',\n      value,\n    });\n    CONSTEXPRS.set(value, CONSTEXPR);\n    return CONSTEXPR;\n  }\n  // have to generate new one every time :-/\n  if (Array.isArray(value)) {\n    return Object.freeze({\n      [$CONSTEXPR]: true,\n      type: 'ArrayExpression',\n      elements: Object.freeze(value.map(TO_CONSTEXPR)),\n    });\n  }\n  if (typeof value === 'object' && Object.getPrototypeOf(value) === Object.getPrototypeOf({}) && [...Object.getOwnPropertySymbols(value)].length === 0) {\n    return Object.freeze({\n      [$CONSTEXPR]: true,\n      type: 'ObjectExpression',\n      properties: Object.freeze(\n        [...Object.getOwnPropertyKeys(value)].map(key => {\n          if (!('value' in Object.getOwnProperty(value, key))) {\n            throw Error('Not a CONSTVALUE (found a setter or getter?)');\n          }\n          return {\n            type: 'Property',\n            kind: 'init',\n            method: false,\n            shorthand: false,\n            computed: true,\n            key: {\n              type: 'Literal',\n              value: key\n            },\n            value: TO_CONSTEXPR(value[key])\n          }\n        })),\n      });\n  }\n  throw Error('Not a CONSTVALUE (did you pass a RegExp?)');\n};\n\n// THIS DOES NOT HANDLE NODE SPECIFIC CASES LIKE IfStatement\nconst FOLD_EMPTY = function*(path) {\n  if (\n    path &&\n    path.node &&\n    path.parent &&\n    Array.isArray(path.parent.node) &&\n    IS_EMPTY(path)\n  ) {\n    REMOVE(path);\n    return yield;\n  }\n  return yield path;\n};\n\n// THIS DOES NOT HANDLE NODE SPECIFIC CASES LIKE IfStatement\nconst FOLD_TEMPLATE = function*(path) {\n  if (\n    path &&\n    path.node &&\n    path.type === 'TemplateLiteral'\n  ) {\n    let updated = false;\n    for (let i = 0; i < path.node.exressions.length; i++) {\n      if (IS_CONSTEXPR(path.node.expressions[i])) {\n        //let \n      }\n    }\n  }\n  return yield path;\n};\nconst FOLD_EXPR_STMT = function*(path) {\n  // TODO: enforce completion value checking\n  if (path && path.node && path.node.type === 'ExpressionStatement') {\n    // merge all the adjacent expression statements into sequences\n    if (Array.isArray(path.parent.node)) {\n      // could have nodes after it\n      const siblings = path.parent.node;\n      if (!IS_PRAGMA(path)) {\n        if (path.key < siblings.length - 1) {\n          const mergeable = [path.node];\n          for (let needle = path.key + 1; needle < siblings.length; needle++) {\n            if (siblings[needle].type !== 'ExpressionStatement') {\n              break;\n            }\n            mergeable.push(siblings[needle]);\n          }\n          if (mergeable.length > 1) {\n            siblings.splice(path.key, mergeable.length, {\n              type: 'ExpressionStatement',\n              expression: {\n                type: 'SequenceExpression',\n                expressions: mergeable.reduce(\n                  (acc, es) => {\n                    if (es.expression.type == 'SequenceExpression') {\n                      return [...acc, ...es.expression.expressions];\n                    } else {\n                      return [...acc, es.expression];\n                    }\n                  },\n                  []\n                ),\n              },\n            });\n            return path;\n          }\n        }\n      }\n    }\n    if (IS_NOT_COMPLETION(path) && IS_CONSTEXPR(path.node.expression)) {\n      return REPLACE(path, EMPTY);\n    }\n  }\n  return yield path;\n};\nconst FOLD_WHILE = function*(path) {\n  if (path && path.node) {\n    if (path.node.type === 'DoWhileStatement') {\n      console.error('FOLD_DOWHILE');\n      REPLACE_IF_EMPTY(path.get(['body']), EMPTY);\n    }\n    if (path.node.type === 'WhileStatement') {\n      console.error('FOLD_WHILE');\n      let { test, consequent, alternate } = path.node;\n      if (IS_CONSTEXPR(test)) {\n        test = CONSTVALUE(test);\n        if (!test) {\n          return REPLACE(path, EMPTY);\n        }\n      }\n      REPLACE_IF_EMPTY(path.get(['body']), EMPTY);\n    }\n    if (path.node.type === 'ForStatement') {\n      console.error('FOLD_FOR');\n      REPLACE_IF_EMPTY(path.get(['body']), EMPTY);\n      let { init, test, update } = path.node;\n      let updated = false;\n      if (init && IS_CONSTEXPR(init)) {\n        updated = true;\n        REPLACE(path.get(['init']), null);\n      }\n      if (test && IS_CONSTEXPR(test)) {\n        let current = CONSTVALUE(test);\n        let coerced = Boolean(current);\n        // remove the test if it is always true\n        if (coerced === true) {\n          updated = true;\n          REPLACE(path.get(['test']), null);\n        } else if (coerced !== current) {\n          updated = true;\n          REPLACE(path.get(['test']), TO_CONSTEXPR(coerced));\n        }\n      }\n      if (update && IS_CONSTEXPR(update)) {\n        updated = true;\n        REPLACE(path.get(['update']), null);\n      }\n      if (updated) {\n        return path;\n      }\n    }\n  }\n  return yield path;\n};\nconst FOLD_IF = function*(path) {\n  if (path && path.node && path.node.type === 'IfStatement') {\n    let { test, consequent, alternate } = path.node;\n    const is_not_completion = IS_NOT_COMPLETION(path);\n    if (is_not_completion && !alternate) {\n      if (IS_EMPTY(path.get(['consequent']))) {\n        console.error('FOLD_IF_EMPTY_CONSEQUENT');\n        REPLACE(path, {\n          type: 'ExpressionStatement',\n          expression: test,\n        });\n        return path.parent;\n      }\n    }\n    if (alternate) {\n      if (alternate.type === consequent.type) {\n        if (consequent.type === 'ExpressionStatement') {\n          console.error('FOLD_IF_BOTH_EXPRSTMT');\n          REPLACE(path, {\n          type: 'ExpressionStatement', expression:\n          {\n            type: 'ConditionalExpression',\n            test: test,\n            consequent: consequent.expression,\n            alternate: alternate.expression,\n          }});\n          return path.parent;\n        }\n        else if (consequent.type === 'ReturnStatement' ||\n          consequent.type === 'ThrowStatement') {\n          console.error('FOLD_IF_BOTH_COMPLETIONS');\n          REPLACE(path, {\n          type: 'ExpressionStatement', expression:{\n            type: consequent.type,\n            argument: {\n              type: 'ConditionalExpression',\n              test: test,\n              consequent: consequent.argument,\n              alternate: alternate.argument,\n            }}\n          });\n          return path.parent;\n        }\n      }\n    }\n    else if (is_not_completion && consequent.type === 'ExpressionStatement') {\n      console.error('FOLD_IF_NON_COMPLETION_TO_&&');\n      REPLACE(path, {\n        type: 'ExpressionStatement',\n        expression: {\n          type: 'BinaryExpression',\n          operator: '&&',\n          left: test,\n          right: consequent.expression,\n        }\n      });\n      return path.parent;\n    }\n    if (IS_CONSTEXPR(test)) {\n      test = CONSTVALUE(test);\n      if (test) {\n        return REPLACE(path, consequent);\n      }\n      if (alternate) {\n        return REPLACE(path, alternate);\n      }\n      return REPLACE(path, EMPTY);\n    }\n    consequent = path.get(['consequent']);\n    let updated;\n    if (consequent.node !== EMPTY) {\n      REPLACE_IF_EMPTY(consequent, EMPTY);\n      if (consequent.parent.node[consequent.key] === EMPTY) {\n        updated = true;\n      }\n    }\n    if (alternate) {\n      alternate = path.get(['alternate']);\n      REMOVE_IF_EMPTY(alternate);\n      if (path.node.alternate === null) {\n        updated = true;\n      }\n    }\n    if (updated) {\n      return path;\n    }\n  }\n  return yield path;\n};\nconst FOLD_SEQUENCE = function*(path) {\n  if (path && path.node && path.node.type === 'SequenceExpression') {\n    console.error('FOLD_SEQUENCE');\n    // never delete the last value\n    for (let i = 0; i < path.node.expressions.length - 1; i++) {\n      if (IS_CONSTEXPR(path.node.expressions[i])) {\n        path.node.expressions.splice(i, 1);\n        i--;\n      }\n    }\n    if (path.node.expressions.length === 1) {\n      return REPLACE(path, path.node.expressions[0]);\n    }\n  }\n  return yield path;\n};\nconst FOLD_LOGICAL = function*(path) {\n  if (path && path.node && path.node.type === 'LogicalExpression') {\n    console.error('FOLD_LOGICAL');\n    let { left, right, operator } = path.node;\n    if (IS_CONSTEXPR(left)) {\n      left = CONSTVALUE(left);\n      if (operator === '||') {\n        if (left) {\n          return REPLACE(path, TO_CONSTEXPR(left));\n        }\n        return REPLACE(path, right);\n      } else if (operator === '&&') {\n        if (!left) {\n          return REPLACE(path, TO_CONSTEXPR(left));\n        }\n        return REPLACE(path, right);\n      }\n    }\n  }\n  return yield path;\n};\nconst FOLD_SWITCH = function*(path) {\n  if (path && path.node && path.node.type === 'SwitchStatement') {\n    let { discriminant, cases } = path.node;\n    // if there are no cases, just become an expression\n    if (cases.length === 0 && IS_NOT_COMPLETION(path)) {\n      return REPLACE(path, {\n        type: 'ExpressionStatement',\n        expression: discriminant\n      });\n    }\n    // if the discriminant is static\n    //   remove any preceding non-matching static cases\n    //   fold any trailing cases into the matching case\n    if (cases.length > 1 && IS_CONSTEXPR(discriminant)) {\n      const discriminant_value = CONSTVALUE(discriminant);\n      for (var i = 0; i < cases.length; i++) {\n        const test = cases[i].test;\n        if (IS_CONSTEXPR(test)) {\n          let test_value = CONSTVALUE(test);\n          if (discriminant_value === test_value) {\n            let new_consequent = cases[i].consequent;\n            if (i < cases.length - 1) {\n              for (let fallthrough of cases.slice(i+1)) {\n                new_consequent.push(...fallthrough.consequent);\n              }\n            }\n            cases[i].consequent = new_consequent;\n            REPLACE(path.get(['cases']), [cases[i]]);\n            return path;\n          }\n        }\n        else {\n          // we had a dynamic case need to bail\n          break;\n        }\n      }\n    }\n  }\n  return yield path;\n};\nconst FOLD_UNREACHABLE = function*(path) {\n  if (path && path.node && path.parent && Array.isArray(path.parent.node)) {\n    if (path.node.type === 'ReturnStatement' ||\n    path.node.type === 'ContinueStatement' ||\n    path.node.type === 'BreakStatement' ||\n    path.node.type === 'ThrowStatement') {\n      const next_key = path.key + 1;\n      path.parent.node.splice(next_key, path.parent.node.length - next_key);\n    }\n  }\n  return yield path;\n}\nconst FOLD_CONDITIONAL = function*(path) {\n  if (path && path.node && path.node.type === 'ConditionalExpression') {\n    console.error('FOLD_CONDITIONAL');\n    let { test, consequent, alternate } = path.node;\n    if (IS_CONSTEXPR(test)) {\n      test = CONSTVALUE(test);\n      if (test) {\n        return REPLACE(path, consequent);\n      }\n      return REPLACE(path, alternate);\n    }\n  }\n  return yield path;\n};\nconst FOLD_BINARY = function*(path) {\n  if (\n    path &&\n    path.node &&\n    path.node.type === 'BinaryExpression' &&\n    !IS_NAN(path.node)\n  ) {\n    console.error('FOLD_BINARY');\n    let { left, right, operator } = path.node;\n    if (operator === '==' || operator === '!=') {\n      let updated = false;\n      if (IS_UNDEFINED(left)) {\n        updated = true;\n        REPLACE(path.get(['left']), NULL);\n      }\n      if (IS_UNDEFINED(right)) {\n        updated = true;\n        REPLACE(path.get(['right']), NULL);\n      }\n      if (updated) {\n        return path;\n      }\n    }\n    if (path.node !== INFINITY && path.node !== NEG_INFINITY && IS_CONSTEXPR(left) && IS_CONSTEXPR(right)) {\n      left = CONSTVALUE(left);\n      right = CONSTVALUE(right);\n      let value;\n      if ((!left || typeof left !== 'object') && (!right || typeof right !== 'object')) {\n        if (operator === '+') {\n          value = left + right;\n        } else if (operator === '-') {\n          value = left - right;\n        } else if (operator === '*') {\n          value = left * right;\n        } else if (operator === '/') {\n          value = left / right;\n        } else if (operator === '%') {\n          value = left % right;\n        } else if (operator === '==') {\n          value = left == right;\n        } else if (operator === '!=') {\n          value = left != right;\n        } else if (operator === '===') {\n          value = left === right;\n        } else if (operator === '!==') {\n          value = left !== right;\n        } else if (operator === '<') {\n          value = left < right;\n        } else if (operator === '<=') {\n          value = left <= right;\n        } else if (operator === '>') {\n          value = left > right;\n        } else if (operator === '>=') {\n          value = left >= right;\n        } else if (operator === '<<') {\n          value = left << right;\n        } else if (operator === '>>') {\n          value = left >> right;\n        } else if (operator === '>>>') {\n          value = left >>> right;\n        } else if (operator === '|') {\n          value = left | right;\n        } else if (operator === '&') {\n          value = left & right;\n        } else if (operator === '^') {\n          value = left ^ right;\n        }\n      }\n      else {\n        if (operator === '==') value = false;\n        if (operator === '===') value = false;\n        if (operator === '!=') value = true;\n        if (operator === '!==') value = true;\n        if (operator === 'in' && typeof right === 'object' && right) {\n          value = Boolean(Object.getOwnPropertyDescriptor(right, left));\n        }\n      }\n      if (value !== void 0) {\n        if (typeof value === 'string' || typeof value === 'boolean' || value === null) {\n          return REPLACE(path, TO_CONSTEXPR(value));\n        }\n        if (typeof value === 'number') {\n          return REPLACE(path, TO_CONSTEXPR(value));\n        }\n      }\n    }\n  }\n  return yield path;\n};\nconst FOLD_UNARY = function*(path) {\n  if (path && path.node && path.node.type === 'UnaryExpression') {\n    console.error('FOLD_UNARY');\n    if (IS_CONSTEXPR(path.node)) {\n      return yield path;\n    }\n    let { argument, operator } = path.node;\n    if (IS_CONSTEXPR(argument)) {\n      if (operator === 'void') {\n        return REPLACE(path, UNDEFINED);\n      }\n      let value = CONSTVALUE(argument);\n      if (operator === '-') {\n        value = -value;\n      } else if (operator === '+') {\n        value = +value;\n      } else if (operator === '~') {\n        value = ~value;\n      } else if (operator === '!') {\n        value = !value;\n      } else if (operator === 'typeof') {\n        value = typeof value;\n      } else if (operator === 'delete') {\n        value = true;\n      }\n      return REPLACE(path, TO_CONSTEXPR(value));\n    }\n  }\n  return yield path;\n};\nconst FOLD_EVAL = function*(path) {\n  if (path && path.node && path.node.type === 'CallExpression' &&\n    path.node.callee.type === 'Identifier' && path.node.callee.name === 'eval') {\n    console.error('FOLD_EVAL');\n    if (path.node.arguments.length === 1 && path.node.arguments[0].type === 'Literal') {\n      let result = esprima.parse(`${\n        CONSTVALUE(path.node.arguments[0])\n      }`);\n      if (result.body.length === 1 && result.body[0].type === 'ExpressionStatement') {\n        return REPLACE(path, result.body[0].expression);\n      }\n    }\n  }\n  return yield path;\n}\nconst FOLD_MEMBER = function*(path) {\n  if (path && path.node && path.node.type === 'MemberExpression') {\n    console.error('FOLD_MEMBER');\n    if (path.node.computed && path.node.property.type === 'Literal') {\n      const current = `${CONSTVALUE(path.node.property)}`;\n      if (typeof current === 'string' && /^[$_a-z][$_a-z\\d]*$/i.test(current)) {\n        path.node.computed = false;\n        path.node.property = {\n          type: 'Identifier',\n          name: current,\n        };\n        return path;\n      }\n    }\n    if (IS_CONSTEXPR(path.node.object)) {\n      const value = CONSTVALUE(path.node.object);\n      if (typeof value === 'string' || Array.isArray(value) || (value && typeof value === 'object')) {\n        let key;\n        if (IS_CONSTEXPR(path.node.property)) {\n          key = `${CONSTVALUE(path.node.property)}`;\n        }\n        else if (!path.node.computed) {\n          key = path.node.property.name;\n        }\n        if (key !== void 0) {\n          const desc = Object.getOwnPropertyDescriptor(value, key);\n          if (desc) {\n            const folded = value[key];\n            console.error('FOLDING', JSON.stringify(folded));\n            if (IN_PRAGMA_POS(path) && typeof folded === 'string') {\n              if (value.length > 1) {\n                REPLACE(\n                  path.get(['object']),\n                  TO_CONSTEXPR(value.slice(key, key + 1))\n                );\n                REPLACE(path.get(['property']), TO_CONSTEXPR(0));\n                return path;\n              }\n            } else {\n              return REPLACE(path, TO_CONSTEXPR(value[key]));\n            }\n          }\n        }\n      }\n    }\n  }\n  return yield path;\n};\n\nconst $MIN = Symbol();\nconst MIN_TRUE = Object.freeze({\n  [$MIN]: true,\n  type: 'UnaryExpression',\n  operator: '!',\n  argument: Object.freeze({\n    [$MIN]: true,\n    type: 'Literal',\n    value: 0\n  })\n});\nconst MIN_FALSE = Object.freeze({\n  [$MIN]: true,\n  type: 'UnaryExpression',\n  operator: '!',\n  argument: Object.freeze({\n    [$MIN]: true,\n    type: 'Literal',\n    value: 1\n  })\n});\nconst MIN_REPLACEMENTS = new Map;\nMIN_REPLACEMENTS.set(true, MIN_TRUE);\nMIN_REPLACEMENTS.set(false, MIN_FALSE);\nconst MIN_VALUES = function*(path) {\n  if (path && path.node && !path.node[$MIN] && IS_CONSTEXPR(path.node)) {\n    let value = CONSTVALUE(path.node);\n    if (MIN_REPLACEMENTS.has(value)) {\n      console.error('MIN_VALUE', value)\n      return REPLACE(path, MIN_REPLACEMENTS.get(value));\n    }\n  }\n  return yield path;\n}\n\nimport esprima from 'esprima';\nimport util from 'util';\nimport escodegen from 'escodegen';\nconst optimize = (src) => {\n    const ROOT = new NodePath(\n      null,\n      esprima.parse(\n        src,\n        {\n          // loc: true,\n          // source: '<stdin>',\n        }\n      ),\n      null\n    );\n    // all of these are things that could affect completion value positions\n    const walk_expressions = WalkCombinator.pipe(\n      ...[\n        WalkCombinator.DEPTH_FIRST,\n        {\n          // We never work on Arrays\n          *inputs(path) {\n            if (Array.isArray(path)) return;\n            return yield path;\n          },\n        },\n        { inputs: FOLD_UNREACHABLE },\n        { inputs: FOLD_IF },\n        { inputs: FOLD_SWITCH },\n        { inputs: FOLD_EXPR_STMT },\n        { inputs: FOLD_CONDITIONAL },\n        { inputs: FOLD_LOGICAL },\n        { inputs: FOLD_BINARY },\n        { inputs: FOLD_UNARY },\n        { inputs: FOLD_SEQUENCE },\n        { inputs: FOLD_MEMBER },\n        { inputs: FOLD_EMPTY },\n        { inputs: FOLD_WHILE },\n        { inputs: FOLD_EVAL },\n      ]\n    ).walk(ROOT);\n    for (const _ of walk_expressions) {\n    }\n    const minify = WalkCombinator.pipe(\n      ...[\n        WalkCombinator.DEPTH_FIRST,\n        {\n          // We never work on Arrays\n          *inputs(path) {\n            if (Array.isArray(path)) return;\n            return yield path;\n          },\n        },\n        { inputs: MIN_VALUES },\n      ]\n    ).walk(ROOT);\n    for (const _ of minify) {\n    }\n    return ROOT;\n}\nimport mississippi from 'mississippi';\nprocess.stdin.pipe(\n  mississippi.concat(buff => {\n    const ROOT = optimize(`${buff}`)\n    console.error(\n      '%s',\n      util.inspect(ROOT.node, {\n        depth: null,\n        colors: true,\n      })\n    );\n    const out = escodegen.generate(ROOT.node);\n    console.log(out);\n  })\n);\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/dude.js",
    "content": "alert(\"dude!\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/entry.mjs",
    "content": "import bar from './module.mjs';\nfunction foo() {\n  return \"I am foo\";\n}\nexport {foo};\nconsole.log(bar);\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/gen-js-linguist-thrift.js",
    "content": "//\n// Autogenerated by Thrift Compiler (1.0.0-dev)\n//\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n//\n\n\nPullRequest = function(args) {\n  this.title = null;\n  if (args) {\n    if (args.title !== undefined) {\n      this.title = args.title;\n    }\n  }\n};\nPullRequest.prototype = {};\nPullRequest.prototype.read = function(input) {\n  input.readStructBegin();\n  while (true)\n  {\n    var ret = input.readFieldBegin();\n    var fname = ret.fname;\n    var ftype = ret.ftype;\n    var fid = ret.fid;\n    if (ftype == Thrift.Type.STOP) {\n      break;\n    }\n    switch (fid)\n    {\n      case 1:\n      if (ftype == Thrift.Type.STRING) {\n        this.title = input.readString().value;\n      } else {\n        input.skip(ftype);\n      }\n      break;\n      case 0:\n        input.skip(ftype);\n        break;\n      default:\n        input.skip(ftype);\n    }\n    input.readFieldEnd();\n  }\n  input.readStructEnd();\n  return;\n};\n\nPullRequest.prototype.write = function(output) {\n  output.writeStructBegin('PullRequest');\n  if (this.title !== null && this.title !== undefined) {\n    output.writeFieldBegin('title', Thrift.Type.STRING, 1);\n    output.writeString(this.title);\n    output.writeFieldEnd();\n  }\n  output.writeFieldStop();\n  output.writeStructEnd();\n  return;\n};\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/hello.js",
    "content": "(function() {\n  console.log(\"Hello, World!\");\n}).call(this);\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/helloHanaEndpoint.xsjs",
    "content": "/*\n invoke endpoint by calling in a browser:\n http://<hanaserveradress>:<xsengineport(usually 8000)>/<path>/<to>/<endpoint>/helloHanaMath.xsjslib?x=4&y=2\n e.g.:\n http://192.168.178.20:8000/geekflyer/linguist/helloHanaEndpoint.xsjs?x=4&y=2\n */\n\nvar hanaMath = $.import(\"./helloHanaMath.xsjslib\");\n\nvar x = parseFloat($.request.parameters.get(\"x\"));\nvar y = parseFloat($.request.parameters.get(\"y\"));\n\n\nvar result = hanaMath.multiply(x, y);\n\nvar output = {\n    title: \"Hello HANA XS - do some simple math\",\n    input: {x: x, y: y},\n    result: result\n};\n\n$.response.contentType = \"application/json\";\n$.response.statusCode = $.net.http.OK;\n$.response.setBody(JSON.stringify(output));"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/helloHanaMath.xsjslib",
    "content": "/* simple hana xs demo library, which can be used by multiple endpoints */\n\nfunction multiply(x, y) {\n    return x * y;\n}\n\nfunction add(x, y) {\n    return x + y;\n}"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/http.js",
    "content": "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar util = require('util');\nvar net = require('net');\nvar stream = require('stream');\nvar url = require('url');\nvar EventEmitter = require('events').EventEmitter;\nvar FreeList = require('freelist').FreeList;\nvar HTTPParser = process.binding('http_parser').HTTPParser;\nvar assert = require('assert').ok;\nvar END_OF_FILE = {};\n\n\nvar debug;\nif (process.env.NODE_DEBUG && /http/.test(process.env.NODE_DEBUG)) {\n  debug = function(x) { console.error('HTTP: %s', x); };\n} else {\n  debug = function() { };\n}\n\n// Only called in the slow case where slow means\n// that the request headers were either fragmented\n// across multiple TCP packets or too large to be\n// processed in a single run. This method is also\n// called to process trailing HTTP headers.\nfunction parserOnHeaders(headers, url) {\n  // Once we exceeded headers limit - stop collecting them\n  if (this.maxHeaderPairs <= 0 ||\n      this._headers.length < this.maxHeaderPairs) {\n    this._headers = this._headers.concat(headers);\n  }\n  this._url += url;\n}\n\n// info.headers and info.url are set only if .onHeaders()\n// has not been called for this request.\n//\n// info.url is not set for response parsers but that's not\n// applicable here since all our parsers are request parsers.\nfunction parserOnHeadersComplete(info) {\n  var parser = this;\n  var headers = info.headers;\n  var url = info.url;\n\n  if (!headers) {\n    headers = parser._headers;\n    parser._headers = [];\n  }\n\n  if (!url) {\n    url = parser._url;\n    parser._url = '';\n  }\n\n  parser.incoming = new IncomingMessage(parser.socket);\n  parser.incoming.httpVersionMajor = info.versionMajor;\n  parser.incoming.httpVersionMinor = info.versionMinor;\n  parser.incoming.httpVersion = info.versionMajor + '.' + info.versionMinor;\n  parser.incoming.url = url;\n\n  var n = headers.length;\n\n  // If parser.maxHeaderPairs <= 0 - assume that there're no limit\n  if (parser.maxHeaderPairs > 0) {\n    n = Math.min(n, parser.maxHeaderPairs);\n  }\n\n  for (var i = 0; i < n; i += 2) {\n    var k = headers[i];\n    var v = headers[i + 1];\n    parser.incoming._addHeaderLine(k, v);\n  }\n\n\n  if (info.method) {\n    // server only\n    parser.incoming.method = info.method;\n  } else {\n    // client only\n    parser.incoming.statusCode = info.statusCode;\n    // CHECKME dead code? we're always a request parser\n  }\n\n  parser.incoming.upgrade = info.upgrade;\n\n  var skipBody = false; // response to HEAD or CONNECT\n\n  if (!info.upgrade) {\n    // For upgraded connections and CONNECT method request,\n    // we'll emit this after parser.execute\n    // so that we can capture the first part of the new protocol\n    skipBody = parser.onIncoming(parser.incoming, info.shouldKeepAlive);\n  }\n\n  return skipBody;\n}\n\nfunction parserOnBody(b, start, len) {\n  var parser = this;\n  var slice = b.slice(start, start + len);\n  if (parser.incoming._paused || parser.incoming._pendings.length) {\n    parser.incoming._pendings.push(slice);\n  } else {\n    parser.incoming._emitData(slice);\n  }\n}\n\nfunction parserOnMessageComplete() {\n  var parser = this;\n  parser.incoming.complete = true;\n\n  // Emit any trailing headers.\n  var headers = parser._headers;\n  if (headers) {\n    for (var i = 0, n = headers.length; i < n; i += 2) {\n      var k = headers[i];\n      var v = headers[i + 1];\n      parser.incoming._addHeaderLine(k, v);\n    }\n    parser._headers = [];\n    parser._url = '';\n  }\n\n  if (!parser.incoming.upgrade) {\n    // For upgraded connections, also emit this after parser.execute\n    if (parser.incoming._paused || parser.incoming._pendings.length) {\n      parser.incoming._pendings.push(END_OF_FILE);\n    } else {\n      parser.incoming.readable = false;\n      parser.incoming._emitEnd();\n    }\n  }\n\n  if (parser.socket.readable) {\n    // force to read the next incoming message\n    parser.socket.resume();\n  }\n}\n\n\nvar parsers = new FreeList('parsers', 1000, function() {\n  var parser = new HTTPParser(HTTPParser.REQUEST);\n\n  parser._headers = [];\n  parser._url = '';\n\n  // Only called in the slow case where slow means\n  // that the request headers were either fragmented\n  // across multiple TCP packets or too large to be\n  // processed in a single run. This method is also\n  // called to process trailing HTTP headers.\n  parser.onHeaders = parserOnHeaders;\n  parser.onHeadersComplete = parserOnHeadersComplete;\n  parser.onBody = parserOnBody;\n  parser.onMessageComplete = parserOnMessageComplete;\n\n  return parser;\n});\nexports.parsers = parsers;\n\n\nvar CRLF = '\\r\\n';\nvar STATUS_CODES = exports.STATUS_CODES = {\n  100 : 'Continue',\n  101 : 'Switching Protocols',\n  102 : 'Processing',                 // RFC 2518, obsoleted by RFC 4918\n  200 : 'OK',\n  201 : 'Created',\n  202 : 'Accepted',\n  203 : 'Non-Authoritative Information',\n  204 : 'No Content',\n  205 : 'Reset Content',\n  206 : 'Partial Content',\n  207 : 'Multi-Status',               // RFC 4918\n  300 : 'Multiple Choices',\n  301 : 'Moved Permanently',\n  302 : 'Moved Temporarily',\n  303 : 'See Other',\n  304 : 'Not Modified',\n  305 : 'Use Proxy',\n  307 : 'Temporary Redirect',\n  400 : 'Bad Request',\n  401 : 'Unauthorized',\n  402 : 'Payment Required',\n  403 : 'Forbidden',\n  404 : 'Not Found',\n  405 : 'Method Not Allowed',\n  406 : 'Not Acceptable',\n  407 : 'Proxy Authentication Required',\n  408 : 'Request Time-out',\n  409 : 'Conflict',\n  410 : 'Gone',\n  411 : 'Length Required',\n  412 : 'Precondition Failed',\n  413 : 'Request Entity Too Large',\n  414 : 'Request-URI Too Large',\n  415 : 'Unsupported Media Type',\n  416 : 'Requested Range Not Satisfiable',\n  417 : 'Expectation Failed',\n  418 : 'I\\'m a teapot',              // RFC 2324\n  422 : 'Unprocessable Entity',       // RFC 4918\n  423 : 'Locked',                     // RFC 4918\n  424 : 'Failed Dependency',          // RFC 4918\n  425 : 'Unordered Collection',       // RFC 4918\n  426 : 'Upgrade Required',           // RFC 2817\n  428 : 'Precondition Required',      // RFC 6585\n  429 : 'Too Many Requests',          // RFC 6585\n  431 : 'Request Header Fields Too Large',// RFC 6585\n  500 : 'Internal Server Error',\n  501 : 'Not Implemented',\n  502 : 'Bad Gateway',\n  503 : 'Service Unavailable',\n  504 : 'Gateway Time-out',\n  505 : 'HTTP Version not supported',\n  506 : 'Variant Also Negotiates',    // RFC 2295\n  507 : 'Insufficient Storage',       // RFC 4918\n  509 : 'Bandwidth Limit Exceeded',\n  510 : 'Not Extended',               // RFC 2774\n  511 : 'Network Authentication Required' // RFC 6585\n};\n\n\nvar connectionExpression = /Connection/i;\nvar transferEncodingExpression = /Transfer-Encoding/i;\nvar closeExpression = /close/i;\nvar chunkExpression = /chunk/i;\nvar contentLengthExpression = /Content-Length/i;\nvar dateExpression = /Date/i;\nvar expectExpression = /Expect/i;\nvar continueExpression = /100-continue/i;\n\nvar dateCache;\nfunction utcDate() {\n  if (!dateCache) {\n    var d = new Date();\n    dateCache = d.toUTCString();\n    setTimeout(function() {\n      dateCache = undefined;\n    }, 1000 - d.getMilliseconds());\n  }\n  return dateCache;\n}\n\n\n/* Abstract base class for ServerRequest and ClientResponse. */\nfunction IncomingMessage(socket) {\n  stream.Stream.call(this);\n\n  // TODO Remove one of these eventually.\n  this.socket = socket;\n  this.connection = socket;\n\n  this.httpVersion = null;\n  this.complete = false;\n  this.headers = {};\n  this.trailers = {};\n\n  this.readable = true;\n\n  this._paused = false;\n  this._pendings = [];\n\n  this._endEmitted = false;\n\n  // request (server) only\n  this.url = '';\n\n  this.method = null;\n\n  // response (client) only\n  this.statusCode = null;\n  this.client = this.socket;\n}\nutil.inherits(IncomingMessage, stream.Stream);\n\n\nexports.IncomingMessage = IncomingMessage;\n\n\nIncomingMessage.prototype.destroy = function(error) {\n  this.socket.destroy(error);\n};\n\n\nIncomingMessage.prototype.setEncoding = function(encoding) {\n  var StringDecoder = require('string_decoder').StringDecoder; // lazy load\n  this._decoder = new StringDecoder(encoding);\n};\n\n\nIncomingMessage.prototype.pause = function() {\n  this._paused = true;\n  this.socket.pause();\n};\n\n\nIncomingMessage.prototype.resume = function() {\n  this._paused = false;\n  if (this.socket) {\n    this.socket.resume();\n  }\n\n  this._emitPending();\n};\n\n\nIncomingMessage.prototype._emitPending = function(callback) {\n  if (this._pendings.length) {\n    var self = this;\n    process.nextTick(function() {\n      while (!self._paused && self._pendings.length) {\n        var chunk = self._pendings.shift();\n        if (chunk !== END_OF_FILE) {\n          assert(Buffer.isBuffer(chunk));\n          self._emitData(chunk);\n        } else {\n          assert(self._pendings.length === 0);\n          self.readable = false;\n          self._emitEnd();\n        }\n      }\n\n      if (callback) {\n        callback();\n      }\n    });\n  } else if (callback) {\n    callback();\n  }\n};\n\n\nIncomingMessage.prototype._emitData = function(d) {\n  if (this._decoder) {\n    var string = this._decoder.write(d);\n    if (string.length) {\n      this.emit('data', string);\n    }\n  } else {\n    this.emit('data', d);\n  }\n};\n\n\nIncomingMessage.prototype._emitEnd = function() {\n  if (!this._endEmitted) {\n    this.emit('end');\n  }\n\n  this._endEmitted = true;\n};\n\n\n// Add the given (field, value) pair to the message\n//\n// Per RFC2616, section 4.2 it is acceptable to join multiple instances of the\n// same header with a ', ' if the header in question supports specification of\n// multiple values this way. If not, we declare the first instance the winner\n// and drop the second. Extended header fields (those beginning with 'x-') are\n// always joined.\nIncomingMessage.prototype._addHeaderLine = function(field, value) {\n  var dest = this.complete ? this.trailers : this.headers;\n\n  field = field.toLowerCase();\n  switch (field) {\n    // Array headers:\n    case 'set-cookie':\n      if (field in dest) {\n        dest[field].push(value);\n      } else {\n        dest[field] = [value];\n      }\n      break;\n\n    // Comma separate. Maybe make these arrays?\n    case 'accept':\n    case 'accept-charset':\n    case 'accept-encoding':\n    case 'accept-language':\n    case 'connection':\n    case 'cookie':\n    case 'pragma':\n    case 'link':\n    case 'www-authenticate':\n    case 'sec-websocket-extensions':\n    case 'sec-websocket-protocol':\n      if (field in dest) {\n        dest[field] += ', ' + value;\n      } else {\n        dest[field] = value;\n      }\n      break;\n\n\n    default:\n      if (field.slice(0, 2) == 'x-') {\n        // except for x-\n        if (field in dest) {\n          dest[field] += ', ' + value;\n        } else {\n          dest[field] = value;\n        }\n      } else {\n        // drop duplicates\n        if (!(field in dest)) dest[field] = value;\n      }\n      break;\n  }\n};\n\n\nfunction OutgoingMessage() {\n  stream.Stream.call(this);\n\n  this.output = [];\n  this.outputEncodings = [];\n\n  this.writable = true;\n\n  this._last = false;\n  this.chunkedEncoding = false;\n  this.shouldKeepAlive = true;\n  this.useChunkedEncodingByDefault = true;\n  this.sendDate = false;\n\n  this._hasBody = true;\n  this._trailer = '';\n\n  this.finished = false;\n}\nutil.inherits(OutgoingMessage, stream.Stream);\n\n\nexports.OutgoingMessage = OutgoingMessage;\n\n\nOutgoingMessage.prototype.destroy = function(error) {\n  this.socket.destroy(error);\n};\n\n\n// This abstract either writing directly to the socket or buffering it.\nOutgoingMessage.prototype._send = function(data, encoding) {\n  // This is a shameful hack to get the headers and first body chunk onto\n  // the same packet. Future versions of Node are going to take care of\n  // this at a lower level and in a more general way.\n  if (!this._headerSent) {\n    if (typeof data === 'string') {\n      data = this._header + data;\n    } else {\n      this.output.unshift(this._header);\n      this.outputEncodings.unshift('ascii');\n    }\n    this._headerSent = true;\n  }\n  return this._writeRaw(data, encoding);\n};\n\n\nOutgoingMessage.prototype._writeRaw = function(data, encoding) {\n  if (data.length === 0) {\n    return true;\n  }\n\n  if (this.connection &&\n      this.connection._httpMessage === this &&\n      this.connection.writable) {\n    // There might be pending data in the this.output buffer.\n    while (this.output.length) {\n      if (!this.connection.writable) {\n        this._buffer(data, encoding);\n        return false;\n      }\n      var c = this.output.shift();\n      var e = this.outputEncodings.shift();\n      this.connection.write(c, e);\n    }\n\n    // Directly write to socket.\n    return this.connection.write(data, encoding);\n  } else {\n    this._buffer(data, encoding);\n    return false;\n  }\n};\n\n\nOutgoingMessage.prototype._buffer = function(data, encoding) {\n  if (data.length === 0) return;\n\n  var length = this.output.length;\n\n  if (length === 0 || typeof data != 'string') {\n    this.output.push(data);\n    this.outputEncodings.push(encoding);\n    return false;\n  }\n\n  var lastEncoding = this.outputEncodings[length - 1];\n  var lastData = this.output[length - 1];\n\n  if ((encoding && lastEncoding === encoding) ||\n      (!encoding && data.constructor === lastData.constructor)) {\n    this.output[length - 1] = lastData + data;\n    return false;\n  }\n\n  this.output.push(data);\n  this.outputEncodings.push(encoding);\n\n  return false;\n};\n\n\nOutgoingMessage.prototype._storeHeader = function(firstLine, headers) {\n  var sentConnectionHeader = false;\n  var sentContentLengthHeader = false;\n  var sentTransferEncodingHeader = false;\n  var sentDateHeader = false;\n  var sentExpect = false;\n\n  // firstLine in the case of request is: 'GET /index.html HTTP/1.1\\r\\n'\n  // in the case of response it is: 'HTTP/1.1 200 OK\\r\\n'\n  var messageHeader = firstLine;\n  var field, value;\n  var self = this;\n\n  function store(field, value) {\n    messageHeader += field + ': ' + value + CRLF;\n\n    if (connectionExpression.test(field)) {\n      sentConnectionHeader = true;\n      if (closeExpression.test(value)) {\n        self._last = true;\n      } else {\n        self.shouldKeepAlive = true;\n      }\n\n    } else if (transferEncodingExpression.test(field)) {\n      sentTransferEncodingHeader = true;\n      if (chunkExpression.test(value)) self.chunkedEncoding = true;\n\n    } else if (contentLengthExpression.test(field)) {\n      sentContentLengthHeader = true;\n    } else if (dateExpression.test(field)) {\n      sentDateHeader = true;\n    } else if (expectExpression.test(field)) {\n      sentExpect = true;\n    }\n  }\n\n  if (headers) {\n    var keys = Object.keys(headers);\n    var isArray = (Array.isArray(headers));\n    var field, value;\n\n    for (var i = 0, l = keys.length; i < l; i++) {\n      var key = keys[i];\n      if (isArray) {\n        field = headers[key][0];\n        value = headers[key][1];\n      } else {\n        field = key;\n        value = headers[key];\n      }\n\n      if (Array.isArray(value)) {\n        for (var j = 0; j < value.length; j++) {\n          store(field, value[j]);\n        }\n      } else {\n        store(field, value);\n      }\n    }\n  }\n\n  // Date header\n  if (this.sendDate == true && sentDateHeader == false) {\n    messageHeader += 'Date: ' + utcDate() + CRLF;\n  }\n\n  // keep-alive logic\n  if (sentConnectionHeader === false) {\n    var shouldSendKeepAlive = this.shouldKeepAlive &&\n        (sentContentLengthHeader ||\n         this.useChunkedEncodingByDefault ||\n         this.agent);\n    if (shouldSendKeepAlive) {\n      messageHeader += 'Connection: keep-alive\\r\\n';\n    } else {\n      this._last = true;\n      messageHeader += 'Connection: close\\r\\n';\n    }\n  }\n\n  if (sentContentLengthHeader == false && sentTransferEncodingHeader == false) {\n    if (this._hasBody) {\n      if (this.useChunkedEncodingByDefault) {\n        messageHeader += 'Transfer-Encoding: chunked\\r\\n';\n        this.chunkedEncoding = true;\n      } else {\n        this._last = true;\n      }\n    } else {\n      // Make sure we don't end the 0\\r\\n\\r\\n at the end of the message.\n      this.chunkedEncoding = false;\n    }\n  }\n\n  this._header = messageHeader + CRLF;\n  this._headerSent = false;\n\n  // wait until the first body chunk, or close(), is sent to flush,\n  // UNLESS we're sending Expect: 100-continue.\n  if (sentExpect) this._send('');\n};\n\n\nOutgoingMessage.prototype.setHeader = function(name, value) {\n  if (arguments.length < 2) {\n    throw new Error('`name` and `value` are required for setHeader().');\n  }\n\n  if (this._header) {\n    throw new Error('Can\\'t set headers after they are sent.');\n  }\n\n  var key = name.toLowerCase();\n  this._headers = this._headers || {};\n  this._headerNames = this._headerNames || {};\n  this._headers[key] = value;\n  this._headerNames[key] = name;\n};\n\n\nOutgoingMessage.prototype.getHeader = function(name) {\n  if (arguments.length < 1) {\n    throw new Error('`name` is required for getHeader().');\n  }\n\n  if (!this._headers) return;\n\n  var key = name.toLowerCase();\n  return this._headers[key];\n};\n\n\nOutgoingMessage.prototype.removeHeader = function(name) {\n  if (arguments.length < 1) {\n    throw new Error('`name` is required for removeHeader().');\n  }\n\n  if (this._header) {\n    throw new Error('Can\\'t remove headers after they are sent.');\n  }\n\n  if (!this._headers) return;\n\n  var key = name.toLowerCase();\n  delete this._headers[key];\n  delete this._headerNames[key];\n};\n\n\nOutgoingMessage.prototype._renderHeaders = function() {\n  if (this._header) {\n    throw new Error('Can\\'t render headers after they are sent to the client.');\n  }\n\n  if (!this._headers) return {};\n\n  var headers = {};\n  var keys = Object.keys(this._headers);\n  for (var i = 0, l = keys.length; i < l; i++) {\n    var key = keys[i];\n    headers[this._headerNames[key]] = this._headers[key];\n  }\n  return headers;\n};\n\n\n\nOutgoingMessage.prototype.write = function(chunk, encoding) {\n  if (!this._header) {\n    this._implicitHeader();\n  }\n\n  if (!this._hasBody) {\n    console.error('This type of response MUST NOT have a body. ' +\n                  'Ignoring write() calls.');\n    return true;\n  }\n\n  if (typeof chunk !== 'string' && !Buffer.isBuffer(chunk)) {\n    throw new TypeError('first argument must be a string or Buffer');\n  }\n\n  if (chunk.length === 0) return false;\n\n  var len, ret;\n  if (this.chunkedEncoding) {\n    if (typeof(chunk) === 'string') {\n      len = Buffer.byteLength(chunk, encoding);\n      chunk = len.toString(16) + CRLF + chunk + CRLF;\n      ret = this._send(chunk, encoding);\n    } else {\n      // buffer\n      len = chunk.length;\n      this._send(len.toString(16) + CRLF);\n      this._send(chunk);\n      ret = this._send(CRLF);\n    }\n  } else {\n    ret = this._send(chunk, encoding);\n  }\n\n  debug('write ret = ' + ret);\n  return ret;\n};\n\n\nOutgoingMessage.prototype.addTrailers = function(headers) {\n  this._trailer = '';\n  var keys = Object.keys(headers);\n  var isArray = (Array.isArray(headers));\n  var field, value;\n  for (var i = 0, l = keys.length; i < l; i++) {\n    var key = keys[i];\n    if (isArray) {\n      field = headers[key][0];\n      value = headers[key][1];\n    } else {\n      field = key;\n      value = headers[key];\n    }\n\n    this._trailer += field + ': ' + value + CRLF;\n  }\n};\n\n\nOutgoingMessage.prototype.end = function(data, encoding) {\n  if (this.finished) {\n    return false;\n  }\n  if (!this._header) {\n    this._implicitHeader();\n  }\n\n  if (data && !this._hasBody) {\n    console.error('This type of response MUST NOT have a body. ' +\n                  'Ignoring data passed to end().');\n    data = false;\n  }\n\n  var ret;\n\n  var hot = this._headerSent === false &&\n            typeof(data) === 'string' &&\n            data.length > 0 &&\n            this.output.length === 0 &&\n            this.connection &&\n            this.connection.writable &&\n            this.connection._httpMessage === this;\n\n  if (hot) {\n    // Hot path. They're doing\n    //   res.writeHead();\n    //   res.end(blah);\n    // HACKY.\n\n    if (this.chunkedEncoding) {\n      var l = Buffer.byteLength(data, encoding).toString(16);\n      ret = this.connection.write(this._header + l + CRLF +\n                                  data + '\\r\\n0\\r\\n' +\n                                  this._trailer + '\\r\\n', encoding);\n    } else {\n      ret = this.connection.write(this._header + data, encoding);\n    }\n    this._headerSent = true;\n\n  } else if (data) {\n    // Normal body write.\n    ret = this.write(data, encoding);\n  }\n\n  if (!hot) {\n    if (this.chunkedEncoding) {\n      ret = this._send('0\\r\\n' + this._trailer + '\\r\\n'); // Last chunk.\n    } else {\n      // Force a flush, HACK.\n      ret = this._send('');\n    }\n  }\n\n  this.finished = true;\n\n  // There is the first message on the outgoing queue, and we've sent\n  // everything to the socket.\n  debug('outgoing message end.');\n  if (this.output.length === 0 && this.connection._httpMessage === this) {\n    this._finish();\n  }\n\n  return ret;\n};\n\n\nOutgoingMessage.prototype._finish = function() {\n  assert(this.connection);\n  if (this instanceof ServerResponse) {\n    DTRACE_HTTP_SERVER_RESPONSE(this.connection);\n  } else {\n    assert(this instanceof ClientRequest);\n    DTRACE_HTTP_CLIENT_REQUEST(this, this.connection);\n  }\n  this.emit('finish');\n};\n\n\nOutgoingMessage.prototype._flush = function() {\n  // This logic is probably a bit confusing. Let me explain a bit:\n  //\n  // In both HTTP servers and clients it is possible to queue up several\n  // outgoing messages. This is easiest to imagine in the case of a client.\n  // Take the following situation:\n  //\n  //    req1 = client.request('GET', '/');\n  //    req2 = client.request('POST', '/');\n  //\n  // When the user does\n  //\n  //   req2.write('hello world\\n');\n  //\n  // it's possible that the first request has not been completely flushed to\n  // the socket yet. Thus the outgoing messages need to be prepared to queue\n  // up data internally before sending it on further to the socket's queue.\n  //\n  // This function, outgoingFlush(), is called by both the Server and Client\n  // to attempt to flush any pending messages out to the socket.\n\n  if (!this.socket) return;\n\n  var ret;\n  while (this.output.length) {\n\n    if (!this.socket.writable) return; // XXX Necessary?\n\n    var data = this.output.shift();\n    var encoding = this.outputEncodings.shift();\n\n    ret = this.socket.write(data, encoding);\n  }\n\n  if (this.finished) {\n    // This is a queue to the server or client to bring in the next this.\n    this._finish();\n  } else if (ret) {\n    // This is necessary to prevent https from breaking\n    this.emit('drain');\n  }\n};\n\n\n\n\nfunction ServerResponse(req) {\n  OutgoingMessage.call(this);\n\n  if (req.method === 'HEAD') this._hasBody = false;\n\n  this.sendDate = true;\n\n  if (req.httpVersionMajor < 1 || req.httpVersionMinor < 1) {\n    this.useChunkedEncodingByDefault = false;\n    this.shouldKeepAlive = false;\n  }\n}\nutil.inherits(ServerResponse, OutgoingMessage);\n\n\nexports.ServerResponse = ServerResponse;\n\nServerResponse.prototype.statusCode = 200;\n\nfunction onServerResponseClose() {\n  this._httpMessage.emit('close');\n}\n\nServerResponse.prototype.assignSocket = function(socket) {\n  assert(!socket._httpMessage);\n  socket._httpMessage = this;\n  socket.on('close', onServerResponseClose);\n  this.socket = socket;\n  this.connection = socket;\n  this._flush();\n};\n\nServerResponse.prototype.detachSocket = function(socket) {\n  assert(socket._httpMessage == this);\n  socket.removeListener('close', onServerResponseClose);\n  socket._httpMessage = null;\n  this.socket = this.connection = null;\n};\n\nServerResponse.prototype.writeContinue = function() {\n  this._writeRaw('HTTP/1.1 100 Continue' + CRLF + CRLF, 'ascii');\n  this._sent100 = true;\n};\n\nServerResponse.prototype._implicitHeader = function() {\n  this.writeHead(this.statusCode);\n};\n\nServerResponse.prototype.writeHead = function(statusCode) {\n  var reasonPhrase, headers, headerIndex;\n\n  if (typeof arguments[1] == 'string') {\n    reasonPhrase = arguments[1];\n    headerIndex = 2;\n  } else {\n    reasonPhrase = STATUS_CODES[statusCode] || 'unknown';\n    headerIndex = 1;\n  }\n  this.statusCode = statusCode;\n\n  var obj = arguments[headerIndex];\n\n  if (obj && this._headers) {\n    // Slow-case: when progressive API and header fields are passed.\n    headers = this._renderHeaders();\n\n    if (Array.isArray(obj)) {\n      // handle array case\n      // TODO: remove when array is no longer accepted\n      var field;\n      for (var i = 0, len = obj.length; i < len; ++i) {\n        field = obj[i][0];\n        if (field in headers) {\n          obj.push([field, headers[field]]);\n        }\n      }\n      headers = obj;\n\n    } else {\n      // handle object case\n      var keys = Object.keys(obj);\n      for (var i = 0; i < keys.length; i++) {\n        var k = keys[i];\n        if (k) headers[k] = obj[k];\n      }\n    }\n  } else if (this._headers) {\n    // only progressive api is used\n    headers = this._renderHeaders();\n  } else {\n    // only writeHead() called\n    headers = obj;\n  }\n\n  var statusLine = 'HTTP/1.1 ' + statusCode.toString() + ' ' +\n                   reasonPhrase + CRLF;\n\n  if (statusCode === 204 || statusCode === 304 ||\n      (100 <= statusCode && statusCode <= 199)) {\n    // RFC 2616, 10.2.5:\n    // The 204 response MUST NOT include a message-body, and thus is always\n    // terminated by the first empty line after the header fields.\n    // RFC 2616, 10.3.5:\n    // The 304 response MUST NOT contain a message-body, and thus is always\n    // terminated by the first empty line after the header fields.\n    // RFC 2616, 10.1 Informational 1xx:\n    // This class of status code indicates a provisional response,\n    // consisting only of the Status-Line and optional headers, and is\n    // terminated by an empty line.\n    this._hasBody = false;\n  }\n\n  // don't keep alive connections where the client expects 100 Continue\n  // but we sent a final status; they may put extra bytes on the wire.\n  if (this._expect_continue && ! this._sent100) {\n    this.shouldKeepAlive = false;\n  }\n\n  this._storeHeader(statusLine, headers);\n};\n\nServerResponse.prototype.writeHeader = function() {\n  this.writeHead.apply(this, arguments);\n};\n\n\n// New Agent code.\n\n// The largest departure from the previous implementation is that\n// an Agent instance holds connections for a variable number of host:ports.\n// Surprisingly, this is still API compatible as far as third parties are\n// concerned. The only code that really notices the difference is the\n// request object.\n\n// Another departure is that all code related to HTTP parsing is in\n// ClientRequest.onSocket(). The Agent is now *strictly*\n// concerned with managing a connection pool.\n\nfunction Agent(options) {\n  var self = this;\n  self.options = options || {};\n  self.requests = {};\n  self.sockets = {};\n  self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets;\n  self.on('free', function(socket, host, port, localAddress) {\n    var name = host + ':' + port;\n    if (localAddress) {\n      name += ':' + localAddress;\n    }\n\n    if (self.requests[name] && self.requests[name].length) {\n      self.requests[name].shift().onSocket(socket);\n      if (self.requests[name].length === 0) {\n        // don't leak\n        delete self.requests[name];\n      }\n    } else {\n      // If there are no pending requests just destroy the\n      // socket and it will get removed from the pool. This\n      // gets us out of timeout issues and allows us to\n      // default to Connection:keep-alive.\n      socket.destroy();\n    }\n  });\n  self.createConnection = net.createConnection;\n}\nutil.inherits(Agent, EventEmitter);\nexports.Agent = Agent;\n\nAgent.defaultMaxSockets = 5;\n\nAgent.prototype.defaultPort = 80;\nAgent.prototype.addRequest = function(req, host, port, localAddress) {\n  var name = host + ':' + port;\n  if (localAddress) {\n    name += ':' + localAddress;\n  }\n  if (!this.sockets[name]) {\n    this.sockets[name] = [];\n  }\n  if (this.sockets[name].length < this.maxSockets) {\n    // If we are under maxSockets create a new one.\n    req.onSocket(this.createSocket(name, host, port, localAddress));\n  } else {\n    // We are over limit so we'll add it to the queue.\n    if (!this.requests[name]) {\n      this.requests[name] = [];\n    }\n    this.requests[name].push(req);\n  }\n};\nAgent.prototype.createSocket = function(name, host, port, localAddress) {\n  var self = this;\n  var options = util._extend({}, self.options);\n  options.port = port;\n  options.host = host;\n  options.localAddress = localAddress;\n  var s = self.createConnection(options);\n  if (!self.sockets[name]) {\n    self.sockets[name] = [];\n  }\n  this.sockets[name].push(s);\n  var onFree = function() {\n    self.emit('free', s, host, port, localAddress);\n  }\n  s.on('free', onFree);\n  var onClose = function(err) {\n    // This is the only place where sockets get removed from the Agent.\n    // If you want to remove a socket from the pool, just close it.\n    // All socket errors end in a close event anyway.\n    self.removeSocket(s, name, host, port, localAddress);\n  }\n  s.on('close', onClose);\n  var onRemove = function() {\n    // We need this function for cases like HTTP 'upgrade'\n    // (defined by WebSockets) where we need to remove a socket from the pool\n    //  because it'll be locked up indefinitely\n    self.removeSocket(s, name, host, port, localAddress);\n    s.removeListener('close', onClose);\n    s.removeListener('free', onFree);\n    s.removeListener('agentRemove', onRemove);\n  }\n  s.on('agentRemove', onRemove);\n  return s;\n};\nAgent.prototype.removeSocket = function(s, name, host, port, localAddress) {\n  if (this.sockets[name]) {\n    var index = this.sockets[name].indexOf(s);\n    if (index !== -1) {\n      this.sockets[name].splice(index, 1);\n      if (this.sockets[name].length === 0) {\n        // don't leak\n        delete this.sockets[name];\n      }\n    }\n  }\n  if (this.requests[name] && this.requests[name].length) {\n    // If we have pending requests and a socket gets closed a new one\n    this.createSocket(name, host, port, localAddress).emit('free');\n  }\n};\n\nvar globalAgent = new Agent();\nexports.globalAgent = globalAgent;\n\n\nfunction ClientRequest(options, cb) {\n  var self = this;\n  OutgoingMessage.call(self);\n\n  self.agent = options.agent === undefined ? globalAgent : options.agent;\n\n  var defaultPort = options.defaultPort || 80;\n\n  var port = options.port || defaultPort;\n  var host = options.hostname || options.host || 'localhost';\n\n  if (options.setHost === undefined) {\n    var setHost = true;\n  }\n\n  self.socketPath = options.socketPath;\n\n  var method = self.method = (options.method || 'GET').toUpperCase();\n  self.path = options.path || '/';\n  if (cb) {\n    self.once('response', cb);\n  }\n\n  if (!Array.isArray(options.headers)) {\n    if (options.headers) {\n      var keys = Object.keys(options.headers);\n      for (var i = 0, l = keys.length; i < l; i++) {\n        var key = keys[i];\n        self.setHeader(key, options.headers[key]);\n      }\n    }\n    if (host && !this.getHeader('host') && setHost) {\n      var hostHeader = host;\n      if (port && +port !== defaultPort) {\n        hostHeader += ':' + port;\n      }\n      this.setHeader('Host', hostHeader);\n    }\n  }\n\n  if (options.auth && !this.getHeader('Authorization')) {\n    //basic auth\n    this.setHeader('Authorization', 'Basic ' +\n                   new Buffer(options.auth).toString('base64'));\n  }\n\n  if (method === 'GET' || method === 'HEAD' || method === 'CONNECT') {\n    self.useChunkedEncodingByDefault = false;\n  } else {\n    self.useChunkedEncodingByDefault = true;\n  }\n\n  if (Array.isArray(options.headers)) {\n    self._storeHeader(self.method + ' ' + self.path + ' HTTP/1.1\\r\\n',\n                      options.headers);\n  } else if (self.getHeader('expect')) {\n    self._storeHeader(self.method + ' ' + self.path + ' HTTP/1.1\\r\\n',\n                      self._renderHeaders());\n  }\n  if (self.socketPath) {\n    self._last = true;\n    self.shouldKeepAlive = false;\n    if (options.createConnection) {\n      self.onSocket(options.createConnection(self.socketPath));\n    } else {\n      self.onSocket(net.createConnection(self.socketPath));\n    }\n  } else if (self.agent) {\n    // If there is an agent we should default to Connection:keep-alive.\n    self._last = false;\n    self.shouldKeepAlive = true;\n    self.agent.addRequest(self, host, port, options.localAddress);\n  } else {\n    // No agent, default to Connection:close.\n    self._last = true;\n    self.shouldKeepAlive = false;\n    if (options.createConnection) {\n      options.port = port;\n      options.host = host;\n      var conn = options.createConnection(options);\n    } else {\n      var conn = net.createConnection({\n        port: port,\n        host: host,\n        localAddress: options.localAddress\n      });\n    }\n    self.onSocket(conn);\n  }\n\n  self._deferToConnect(null, null, function() {\n    self._flush();\n    self = null;\n  });\n\n}\nutil.inherits(ClientRequest, OutgoingMessage);\n\nexports.ClientRequest = ClientRequest;\n\nClientRequest.prototype._implicitHeader = function() {\n  this._storeHeader(this.method + ' ' + this.path + ' HTTP/1.1\\r\\n',\n                    this._renderHeaders());\n};\n\nClientRequest.prototype.abort = function() {\n  if (this.socket) {\n    // in-progress\n    this.socket.destroy();\n  } else {\n    // haven't been assigned a socket yet.\n    // this could be more efficient, it could\n    // remove itself from the pending requests\n    this._deferToConnect('destroy', []);\n  }\n};\n\n\nfunction createHangUpError() {\n  var error = new Error('socket hang up');\n  error.code = 'ECONNRESET';\n  return error;\n}\n\n// Free the parser and also break any links that it\n// might have to any other things.\n// TODO: All parser data should be attached to a\n// single object, so that it can be easily cleaned\n// up by doing `parser.data = {}`, which should\n// be done in FreeList.free.  `parsers.free(parser)`\n// should be all that is needed.\nfunction freeParser(parser, req) {\n  if (parser) {\n    parser._headers = [];\n    parser.onIncoming = null;\n    if (parser.socket) {\n      parser.socket.onend = null;\n      parser.socket.ondata = null;\n      parser.socket.parser = null;\n    }\n    parser.socket = null;\n    parser.incoming = null;\n    parsers.free(parser);\n    parser = null;\n  }\n  if (req) {\n    req.parser = null;\n  }\n}\n\n\nfunction socketCloseListener() {\n  var socket = this;\n  var parser = socket.parser;\n  var req = socket._httpMessage;\n  debug('HTTP socket close');\n  req.emit('close');\n  if (req.res && req.res.readable) {\n    // Socket closed before we emitted 'end' below.\n    req.res.emit('aborted');\n    var res = req.res;\n    req.res._emitPending(function() {\n      res._emitEnd();\n      res.emit('close');\n      res = null;\n    });\n  } else if (!req.res && !req._hadError) {\n    // This socket error fired before we started to\n    // receive a response. The error needs to\n    // fire on the request.\n    req.emit('error', createHangUpError());\n  }\n\n  if (parser) {\n    parser.finish();\n    freeParser(parser, req);\n  }\n}\n\nfunction socketErrorListener(err) {\n  var socket = this;\n  var parser = socket.parser;\n  var req = socket._httpMessage;\n  debug('HTTP SOCKET ERROR: ' + err.message + '\\n' + err.stack);\n\n  if (req) {\n    req.emit('error', err);\n    // For Safety. Some additional errors might fire later on\n    // and we need to make sure we don't double-fire the error event.\n    req._hadError = true;\n  }\n\n  if (parser) {\n    parser.finish();\n    freeParser(parser, req);\n  }\n  socket.destroy();\n}\n\nfunction socketOnEnd() {\n  var socket = this;\n  var req = this._httpMessage;\n  var parser = this.parser;\n\n  if (!req.res) {\n    // If we don't have a response then we know that the socket\n    // ended prematurely and we need to emit an error on the request.\n    req.emit('error', createHangUpError());\n    req._hadError = true;\n  }\n  if (parser) {\n    parser.finish();\n    freeParser(parser, req);\n  }\n  socket.destroy();\n}\n\nfunction socketOnData(d, start, end) {\n  var socket = this;\n  var req = this._httpMessage;\n  var parser = this.parser;\n\n  var ret = parser.execute(d, start, end - start);\n  if (ret instanceof Error) {\n    debug('parse error');\n    freeParser(parser, req);\n    socket.destroy(ret);\n  } else if (parser.incoming && parser.incoming.upgrade) {\n    // Upgrade or CONNECT\n    var bytesParsed = ret;\n    var res = parser.incoming;\n    req.res = res;\n\n    socket.ondata = null;\n    socket.onend = null;\n    parser.finish();\n\n    // This is start + byteParsed\n    var bodyHead = d.slice(start + bytesParsed, end);\n\n    var eventName = req.method === 'CONNECT' ? 'connect' : 'upgrade';\n    if (req.listeners(eventName).length) {\n      req.upgradeOrConnect = true;\n\n      // detach the socket\n      socket.emit('agentRemove');\n      socket.removeListener('close', socketCloseListener);\n      socket.removeListener('error', socketErrorListener);\n\n      req.emit(eventName, res, socket, bodyHead);\n      req.emit('close');\n    } else {\n      // Got Upgrade header or CONNECT method, but have no handler.\n      socket.destroy();\n    }\n    freeParser(parser, req);\n  } else if (parser.incoming && parser.incoming.complete &&\n             // When the status code is 100 (Continue), the server will\n             // send a final response after this client sends a request\n             // body. So, we must not free the parser.\n             parser.incoming.statusCode !== 100) {\n    freeParser(parser, req);\n  }\n}\n\n\nfunction parserOnIncomingClient(res, shouldKeepAlive) {\n  var parser = this;\n  var socket = this.socket;\n  var req = socket._httpMessage;\n\n  debug('AGENT incoming response!');\n\n  if (req.res) {\n    // We already have a response object, this means the server\n    // sent a double response.\n    socket.destroy();\n    return;\n  }\n  req.res = res;\n\n  // Responses to CONNECT request is handled as Upgrade.\n  if (req.method === 'CONNECT') {\n    res.upgrade = true;\n    return true; // skip body\n  }\n\n  // Responses to HEAD requests are crazy.\n  // HEAD responses aren't allowed to have an entity-body\n  // but *can* have a content-length which actually corresponds\n  // to the content-length of the entity-body had the request\n  // been a GET.\n  var isHeadResponse = req.method == 'HEAD';\n  debug('AGENT isHeadResponse ' + isHeadResponse);\n\n  if (res.statusCode == 100) {\n    // restart the parser, as this is a continue message.\n    delete req.res; // Clear res so that we don't hit double-responses.\n    req.emit('continue');\n    return true;\n  }\n\n  if (req.shouldKeepAlive && !shouldKeepAlive && !req.upgradeOrConnect) {\n    // Server MUST respond with Connection:keep-alive for us to enable it.\n    // If we've been upgraded (via WebSockets) we also shouldn't try to\n    // keep the connection open.\n    req.shouldKeepAlive = false;\n  }\n\n\n  DTRACE_HTTP_CLIENT_RESPONSE(socket, req);\n  req.emit('response', res);\n  req.res = res;\n  res.req = req;\n\n  res.on('end', responseOnEnd);\n\n  return isHeadResponse;\n}\n\nfunction responseOnEnd() {\n  var res = this;\n  var req = res.req;\n  var socket = req.socket;\n\n  if (!req.shouldKeepAlive) {\n    if (socket.writable) {\n      debug('AGENT socket.destroySoon()');\n      socket.destroySoon();\n    }\n    assert(!socket.writable);\n  } else {\n    debug('AGENT socket keep-alive');\n    socket.removeListener('close', socketCloseListener);\n    socket.removeListener('error', socketErrorListener);\n    socket.emit('free');\n  }\n}\n\nClientRequest.prototype.onSocket = function(socket) {\n  var req = this;\n\n  process.nextTick(function() {\n    var parser = parsers.alloc();\n    req.socket = socket;\n    req.connection = socket;\n    parser.reinitialize(HTTPParser.RESPONSE);\n    parser.socket = socket;\n    parser.incoming = null;\n    req.parser = parser;\n\n    parser.socket = socket;\n    socket.parser = parser;\n    parser.incoming = null;\n    socket._httpMessage = req;\n\n    // Setup \"drain\" propogation.\n    httpSocketSetup(socket);\n\n    // Propagate headers limit from request object to parser\n    if (typeof req.maxHeadersCount === 'number') {\n      parser.maxHeaderPairs = req.maxHeadersCount << 1;\n    } else {\n      // Set default value because parser may be reused from FreeList\n      parser.maxHeaderPairs = 2000;\n    }\n\n    socket.on('error', socketErrorListener);\n    socket.ondata = socketOnData;\n    socket.onend = socketOnEnd;\n    socket.on('close', socketCloseListener);\n    parser.onIncoming = parserOnIncomingClient;\n    req.emit('socket', socket);\n  });\n\n};\n\nClientRequest.prototype._deferToConnect = function(method, arguments_, cb) {\n  // This function is for calls that need to happen once the socket is\n  // connected and writable. It's an important promisy thing for all the socket\n  // calls that happen either now (when a socket is assigned) or\n  // in the future (when a socket gets assigned out of the pool and is\n  // eventually writable).\n  var self = this;\n  var onSocket = function() {\n    if (self.socket.writable) {\n      if (method) {\n        self.socket[method].apply(self.socket, arguments_);\n      }\n      if (cb) { cb(); }\n    } else {\n      self.socket.once('connect', function() {\n        if (method) {\n          self.socket[method].apply(self.socket, arguments_);\n        }\n        if (cb) { cb(); }\n      });\n    }\n  }\n  if (!self.socket) {\n    self.once('socket', onSocket);\n  } else {\n    onSocket();\n  }\n};\n\nClientRequest.prototype.setTimeout = function(msecs, callback) {\n  if (callback) this.once('timeout', callback);\n\n  var self = this;\n  function emitTimeout() {\n    self.emit('timeout');\n  }\n\n  if (this.socket && this.socket.writable) {\n    this.socket.setTimeout(msecs, emitTimeout);\n    return;\n  }\n\n  if (this.socket) {\n    this.socket.once('connect', function() {\n      this.setTimeout(msecs, emitTimeout);\n    });\n    return;\n  }\n\n  this.once('socket', function(sock) {\n    this.setTimeout(msecs, emitTimeout);\n  });\n};\n\nClientRequest.prototype.setNoDelay = function() {\n  this._deferToConnect('setNoDelay', arguments);\n};\nClientRequest.prototype.setSocketKeepAlive = function() {\n  this._deferToConnect('setKeepAlive', arguments);\n};\n\nClientRequest.prototype.clearTimeout = function(cb) {\n  this.setTimeout(0, cb);\n};\n\nexports.request = function(options, cb) {\n  if (typeof options === 'string') {\n    options = url.parse(options);\n  }\n\n  if (options.protocol && options.protocol !== 'http:') {\n    throw new Error('Protocol:' + options.protocol + ' not supported.');\n  }\n\n  return new ClientRequest(options, cb);\n};\n\nexports.get = function(options, cb) {\n  var req = exports.request(options, cb);\n  req.end();\n  return req;\n};\n\n\nfunction ondrain() {\n  if (this._httpMessage) this._httpMessage.emit('drain');\n}\n\n\nfunction httpSocketSetup(socket) {\n  socket.removeListener('drain', ondrain);\n  socket.on('drain', ondrain);\n}\n\n\nfunction Server(requestListener) {\n  if (!(this instanceof Server)) return new Server(requestListener);\n  net.Server.call(this, { allowHalfOpen: true });\n\n  if (requestListener) {\n    this.addListener('request', requestListener);\n  }\n\n  // Similar option to this. Too lazy to write my own docs.\n  // http://www.squid-cache.org/Doc/config/half_closed_clients/\n  // http://wiki.squid-cache.org/SquidFaq/InnerWorkings#What_is_a_half-closed_filedescriptor.3F\n  this.httpAllowHalfOpen = false;\n\n  this.addListener('connection', connectionListener);\n}\nutil.inherits(Server, net.Server);\n\n\nexports.Server = Server;\n\n\nexports.createServer = function(requestListener) {\n  return new Server(requestListener);\n};\n\n\nfunction connectionListener(socket) {\n  var self = this;\n  var outgoing = [];\n  var incoming = [];\n\n  function abortIncoming() {\n    while (incoming.length) {\n      var req = incoming.shift();\n      req.emit('aborted');\n      req.emit('close');\n    }\n    // abort socket._httpMessage ?\n  }\n\n  function serverSocketCloseListener() {\n    debug('server socket close');\n    // mark this parser as reusable\n    freeParser(parser);\n\n    abortIncoming();\n  }\n\n  debug('SERVER new http connection');\n\n  httpSocketSetup(socket);\n\n  socket.setTimeout(2 * 60 * 1000); // 2 minute timeout\n  socket.once('timeout', function() {\n    socket.destroy();\n  });\n\n  var parser = parsers.alloc();\n  parser.reinitialize(HTTPParser.REQUEST);\n  parser.socket = socket;\n  socket.parser = parser;\n  parser.incoming = null;\n\n  // Propagate headers limit from server instance to parser\n  if (typeof this.maxHeadersCount === 'number') {\n    parser.maxHeaderPairs = this.maxHeadersCount << 1;\n  } else {\n    // Set default value because parser may be reused from FreeList\n    parser.maxHeaderPairs = 2000;\n  }\n\n  socket.addListener('error', function(e) {\n    self.emit('clientError', e);\n  });\n\n  socket.ondata = function(d, start, end) {\n    var ret = parser.execute(d, start, end - start);\n    if (ret instanceof Error) {\n      debug('parse error');\n      socket.destroy(ret);\n    } else if (parser.incoming && parser.incoming.upgrade) {\n      // Upgrade or CONNECT\n      var bytesParsed = ret;\n      var req = parser.incoming;\n\n      socket.ondata = null;\n      socket.onend = null;\n      socket.removeListener('close', serverSocketCloseListener);\n      parser.finish();\n      freeParser(parser, req);\n\n      // This is start + byteParsed\n      var bodyHead = d.slice(start + bytesParsed, end);\n\n      var eventName = req.method === 'CONNECT' ? 'connect' : 'upgrade';\n      if (self.listeners(eventName).length) {\n        self.emit(eventName, req, req.socket, bodyHead);\n      } else {\n        // Got upgrade header or CONNECT method, but have no handler.\n        socket.destroy();\n      }\n    }\n  };\n\n  socket.onend = function() {\n    var ret = parser.finish();\n\n    if (ret instanceof Error) {\n      debug('parse error');\n      socket.destroy(ret);\n      return;\n    }\n\n    if (!self.httpAllowHalfOpen) {\n      abortIncoming();\n      if (socket.writable) socket.end();\n    } else if (outgoing.length) {\n      outgoing[outgoing.length - 1]._last = true;\n    } else if (socket._httpMessage) {\n      socket._httpMessage._last = true;\n    } else {\n      if (socket.writable) socket.end();\n    }\n  };\n\n  socket.addListener('close', serverSocketCloseListener);\n\n  // The following callback is issued after the headers have been read on a\n  // new message. In this callback we setup the response object and pass it\n  // to the user.\n  parser.onIncoming = function(req, shouldKeepAlive) {\n    incoming.push(req);\n\n    var res = new ServerResponse(req);\n    debug('server response shouldKeepAlive: ' + shouldKeepAlive);\n    res.shouldKeepAlive = shouldKeepAlive;\n    DTRACE_HTTP_SERVER_REQUEST(req, socket);\n\n    if (socket._httpMessage) {\n      // There are already pending outgoing res, append.\n      outgoing.push(res);\n    } else {\n      res.assignSocket(socket);\n    }\n\n    // When we're finished writing the response, check if this is the last\n    // respose, if so destroy the socket.\n    res.on('finish', function() {\n      // Usually the first incoming element should be our request.  it may\n      // be that in the case abortIncoming() was called that the incoming\n      // array will be empty.\n      assert(incoming.length == 0 || incoming[0] === req);\n\n      incoming.shift();\n\n      res.detachSocket(socket);\n\n      if (res._last) {\n        socket.destroySoon();\n      } else {\n        // start sending the next message\n        var m = outgoing.shift();\n        if (m) {\n          m.assignSocket(socket);\n        }\n      }\n    });\n\n    if ('expect' in req.headers &&\n        (req.httpVersionMajor == 1 && req.httpVersionMinor == 1) &&\n        continueExpression.test(req.headers['expect'])) {\n      res._expect_continue = true;\n      if (self.listeners('checkContinue').length) {\n        self.emit('checkContinue', req, res);\n      } else {\n        res.writeContinue();\n        self.emit('request', req, res);\n      }\n    } else {\n      self.emit('request', req, res);\n    }\n    return false; // Not a HEAD response. (Not even a response!)\n  };\n}\nexports._connectionListener = connectionListener;\n\n// Legacy Interface\n\nfunction Client(port, host) {\n  if (!(this instanceof Client)) return new Client(port, host);\n  host = host || 'localhost';\n  port = port || 80;\n  this.host = host;\n  this.port = port;\n  this.agent = new Agent({ host: host, port: port, maxSockets: 1 });\n}\nutil.inherits(Client, EventEmitter);\nClient.prototype.request = function(method, path, headers) {\n  var self = this;\n  var options = {};\n  options.host = self.host;\n  options.port = self.port;\n  if (method[0] === '/') {\n    headers = path;\n    path = method;\n    method = 'GET';\n  }\n  options.method = method;\n  options.path = path;\n  options.headers = headers;\n  options.agent = self.agent;\n  var c = new ClientRequest(options);\n  c.on('error', function(e) {\n    self.emit('error', e);\n  });\n  // The old Client interface emitted 'end' on socket end.\n  // This doesn't map to how we want things to operate in the future\n  // but it will get removed when we remove this legacy interface.\n  c.on('socket', function(s) {\n    s.on('end', function() {\n      self.emit('end');\n    });\n  });\n  return c;\n};\n\nexports.Client = Client;\n\n// TODO http.Client can be removed in v0.9. Until then leave this message.\nmodule.deprecate('Client', 'It will be removed soon. Do not use it.');\n\nexports.createClient = function(port, host) {\n  return new Client(port, host);\n};\nmodule.deprecate('createClient', 'Use `http.request` instead.');\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/index.es",
    "content": "import config from \"../webpack.config\";\nimport webpackDevMiddleware from \"webpack-dev-middleware\";\nimport webpackHot from \"webpack-hot-middleware\";\nimport webpack from \"webpack\";\nimport express from \"express\";\n\napp.use(webpackDevMiddleware(compiler, {\n\tnoInfo: false,\n\tquiet: false,\n\tpublicPath: config.output.publicPath,\n\thot: true,\n\thistoryApiFallback: true\n}));\n\t\napp.get(\"/(:root).json\", (req, resp) => {\n\tresp.send(indexer.index(req.params.root));\n});\n\nexport default function(){\n\tconst server = http.createServer(app);\n\t\n\tserver.listen(3000);\n\t\n\tconst wss = new WebSocketServer({server});\n\t\n\tlet id = 1;\n\twss.on(\"connection\", (ws) => {\n\t\tconsole.log(\"Hello\", \" world\");\n\t\tlet wsId = id++;\n\t\tsessions[wsId] = ws;\n\t\tws.on(\"close\", () => {\n\t\t\tdelete sessions[wsId]\n\t\t});\n\t});\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/intro-old.js",
    "content": "(function() {\n  var cubes, list, math, num, number, opposite, race, square;\n  var __slice = Array.prototype.slice;\n  number = 42;\n  opposite = true;\n  if (opposite) {\n    number = -42;\n  }\n  square = function(x) {\n    return x * x;\n  };\n  list = [1, 2, 3, 4, 5];\n  math = {\n    root: Math.sqrt,\n    square: square,\n    cube: function(x) {\n      return x * square(x);\n    }\n  };\n  race = function() {\n    var runners, winner;\n    winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n    return print(winner, runners);\n  };\n  if (typeof elvis !== \"undefined\" && elvis !== null) {\n    alert(\"I knew it!\");\n  }\n  cubes = (function() {\n    var _i, _len, _results;\n    _results = [];\n    for (_i = 0, _len = list.length; _i < _len; _i++) {\n      num = list[_i];\n      _results.push(math.cube(num));\n    }\n    return _results;\n  })();\n}).call(this);\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/intro.js",
    "content": "// Generated by CoffeeScript 1.2.1\n(function() {\n  var cubes, list, math, num, number, opposite, race, square,\n    __slice = [].slice;\n\n  number = 42;\n\n  opposite = true;\n\n  if (opposite) number = -42;\n\n  square = function(x) {\n    return x * x;\n  };\n\n  list = [1, 2, 3, 4, 5];\n\n  math = {\n    root: Math.sqrt,\n    square: square,\n    cube: function(x) {\n      return x * square(x);\n    }\n  };\n\n  race = function() {\n    var runners, winner;\n    winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n    return print(winner, runners);\n  };\n\n  if (typeof elvis !== \"undefined\" && elvis !== null) alert(\"I knew it!\");\n\n  cubes = (function() {\n    var _i, _len, _results;\n    _results = [];\n    for (_i = 0, _len = list.length; _i < _len; _i++) {\n      num = list[_i];\n      _results.push(math.cube(num));\n    }\n    return _results;\n  })();\n\n}).call(this);\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/intro.js.frag",
    "content": "(function(window, angular) {\n\nArray.prototype.last = function() {\n    return this[this.length-1];\n};\n\nvar app = angular.module('ConwayGameOfLife', []);\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/itau.gs",
    "content": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2014 Thiago Brandão Damasceno\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n// based on http://ctrlq.org/code/19053-send-to-google-drive\nfunction sendToGoogleDrive() {\n\n  var gmailLabels           = 'inbox';\n  var driveFolder           = 'Itaú Notifications';\n  var spreadsheetName       = 'itau';\n  var archiveLabel          = 'itau.processed';\n  var itauNotificationEmail = 'comunicacaodigital@itau-unibanco.com.br';\n  var filter                = \"from: \" +\n                              itauNotificationEmail +\n                              \" -label:\" +\n                              archiveLabel +\n                              \" label:\" +\n                              gmailLabels;\n\n  // Create label for 'itau.processed' if it doesn't exist\n  var moveToLabel =  GmailApp.getUserLabelByName(archiveLabel);\n\n  if (!moveToLabel) {\n    moveToLabel = GmailApp.createLabel(archiveLabel);\n  }\n\n  // Create folder 'Itaú Notifications' if it doesn't exist\n  var folders = DriveApp.getFoldersByName(driveFolder);\n  var folder;\n\n  if (folders.hasNext()) {\n    folder = folders.next();\n  } else {\n    folder = DriveApp.createFolder(driveFolder);\n  }\n\n  // Create spreadsheet file 'itau' if it doesn't exist\n  var files = folder.getFilesByName(spreadsheetName);\n\n  // File is in DriveApp\n  // Doc is in SpreadsheetApp\n  // They are not interchangeable\n  var file, doc;\n\n  // Confusing :\\\n  // As per: https://code.google.com/p/google-apps-script-issues/issues/detail?id=3578\n  if (files.hasNext()){\n    file = files.next();\n    doc = SpreadsheetApp.openById(file.getId());\n  } else {\n    doc = SpreadsheetApp.create(spreadsheetName);\n    file = DriveApp.getFileById(doc.getId());\n    folder.addFile(file);\n    DriveApp.removeFile(file);\n  }\n\n  var sheet = doc.getSheets()[0];\n\n  // Append header if first line\n  if(sheet.getLastRow() == 0){\n    sheet.appendRow(['Conta', 'Operação', 'Valor', 'Data', 'Hora', 'Email ID']);\n  }\n\n  var message, messages, account, operation, value, date, hour, emailID, plainBody;\n  var accountRegex = /Conta: (XXX[0-9\\-]+)/;\n  var operationRegex = /Tipo de operação: ([A-Z]+)/;\n  var paymentRegex = /Pagamento de ([0-9A-Za-z\\-]+)\\ ?([0-9]+)?/;\n  var valueRegex = /Valor: R\\$ ([0-9\\,\\.]+)/;\n  var dateRegex = /Data: ([0-9\\/]+)/;\n  var hourRegex = /Hora: ([0-9\\:]+)/;\n  var emailIDRegex = /E-mail nº ([0-9]+)/;\n\n  var threads = GmailApp.search(filter, 0, 100);\n\n  for (var x = 0; x < threads.length; x++) {\n    messages = threads[x].getMessages();\n\n    for (var i = 0; i < messages.length; i++) {\n      account, operation, value, date, hour, emailID = [];\n\n      message = messages[i];\n\n      plainBody = message.getPlainBody();\n\n      if(accountRegex.test(plainBody)) {\n        account = RegExp.$1;\n      }\n\n      if(operationRegex.test(plainBody)) {\n        operation = RegExp.$1;\n      }\n\n      if(valueRegex.test(plainBody)) {\n        value = RegExp.$1;\n      }\n\n      if(dateRegex.test(plainBody)) {\n        date = RegExp.$1;\n      }\n\n      if(hourRegex.test(plainBody)) {\n        hour = RegExp.$1;\n      }\n\n      if(emailIDRegex.test(plainBody)){\n        emailID = RegExp.$1;\n      }\n\n      if(paymentRegex.test(plainBody)){\n        operation = RegExp.$1;\n        if(RegExp.$2){\n          operation += ' ' + RegExp.$2\n        }\n        date = hour = ' - ';\n      }\n\n      if(account && operation && value && date && hour){\n        sheet.appendRow([account, operation, value, date, hour, emailID]);\n      }\n\n      // Logger.log(account);\n      // Logger.log(operation);\n      // Logger.log(value);\n      // Logger.log(date);\n      // Logger.log(hour);\n    }\n\n    threads[x].addLabel(moveToLabel);\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/jquery-1.6.1.js",
    "content": "/*!\n * jQuery JavaScript Library v1.6.1\n * http://jquery.com/\n *\n * Copyright 2011, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2011, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Thu May 12 15:04:36 2011 -0400\n */\n(function( window, undefined ) {\n\n// Use the correct document accordingly with window argument (sandbox)\nvar document = window.document,\n\tnavigator = window.navigator,\n\tlocation = window.location;\nvar jQuery = (function() {\n\n// Define a local copy of jQuery\nvar jQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// A simple way to check for HTML strings or ID strings\n\t// (both of which we optimize for)\n\tquickExpr = /^(?:[^<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\n\n\t// Check if a string has a non-whitespace character in it\n\trnotwhite = /\\S/,\n\n\t// Used for trimming whitespace\n\ttrimLeft = /^\\s+/,\n\ttrimRight = /\\s+$/,\n\n\t// Check for digits\n\trdigit = /\\d/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\n\t// Useragent RegExp\n\trwebkit = /(webkit)[ \\/]([\\w.]+)/,\n\tropera = /(opera)(?:.*version)?[ \\/]([\\w.]+)/,\n\trmsie = /(msie) ([\\w.]+)/,\n\trmozilla = /(mozilla)(?:.*? rv:([\\w.]+))?/,\n\n\t// Keep a UserAgent string for use with jQuery.browser\n\tuserAgent = navigator.userAgent,\n\n\t// For matching the engine and version of the browser\n\tbrowserMatch,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// The ready event handler\n\tDOMContentLoaded,\n\n\t// Save a reference to some core methods\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty,\n\tpush = Array.prototype.push,\n\tslice = Array.prototype.slice,\n\ttrim = String.prototype.trim,\n\tindexOf = Array.prototype.indexOf,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {};\n\njQuery.fn = jQuery.prototype = {\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem, ret, doc;\n\n\t\t// Handle $(\"\"), $(null), or $(undefined)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle $(DOMElement)\n\t\tif ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// The body element only exists once, optimize finding it\n\t\tif ( selector === \"body\" && !context && document.body ) {\n\t\t\tthis.context = document;\n\t\t\tthis[0] = document.body;\n\t\t\tthis.selector = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\t// Are we dealing with HTML string or an ID?\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = quickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Verify a match, and that no context was specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\t\t\t\t\tdoc = (context ? context.ownerDocument || context : document);\n\n\t\t\t\t\t// If a single string is passed in and it's a single tag\n\t\t\t\t\t// just do a createElement and skip the rest\n\t\t\t\t\tret = rsingleTag.exec( selector );\n\n\t\t\t\t\tif ( ret ) {\n\t\t\t\t\t\tif ( jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\t\tselector = [ document.createElement( ret[1] ) ];\n\t\t\t\t\t\t\tjQuery.fn.attr.call( selector, context, true );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tselector = [ doc.createElement( ret[1] ) ];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = jQuery.buildFragment( [ match[1] ], [ doc ] );\n\t\t\t\t\t\tselector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.merge( this, selector );\n\n\t\t\t\t// HANDLE: $(\"#id\")\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn (context || rootjQuery).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif (selector.selector !== undefined) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The current version of jQuery being used\n\tjquery: \"1.6.1\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn slice.call( this, 0 );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems, name, selector ) {\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = this.constructor();\n\n\t\tif ( jQuery.isArray( elems ) ) {\n\t\t\tpush.apply( ret, elems );\n\n\t\t} else {\n\t\t\tjQuery.merge( ret, elems );\n\t\t}\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\tret.context = this.context;\n\n\t\tif ( name === \"find\" ) {\n\t\t\tret.selector = this.selector + (this.selector ? \" \" : \"\") + selector;\n\t\t} else if ( name ) {\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\n\t\t}\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Attach the listeners\n\t\tjQuery.bindReady();\n\n\t\t// Add the callback\n\t\treadyList.done( fn );\n\n\t\treturn this;\n\t},\n\n\teq: function( i ) {\n\t\treturn i === -1 ?\n\t\t\tthis.slice( i ) :\n\t\t\tthis.slice( i, +i + 1 );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ),\n\t\t\t\"slice\", slice.call(arguments).join(\",\") );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\t\t// Either a released hold or an DOMready/load event and not yet ready\n\t\tif ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {\n\t\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\t\tif ( !document.body ) {\n\t\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t\t}\n\n\t\t\t// Remember that the DOM is ready\n\t\t\tjQuery.isReady = true;\n\n\t\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there are functions bound, to execute\n\t\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t\t// Trigger any bound ready events\n\t\t\tif ( jQuery.fn.trigger ) {\n\t\t\t\tjQuery( document ).trigger( \"ready\" ).unbind( \"ready\" );\n\t\t\t}\n\t\t}\n\t},\n\n\tbindReady: function() {\n\t\tif ( readyList ) {\n\t\t\treturn;\n\t\t}\n\n\t\treadyList = jQuery._Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the\n\t\t// browser event has already occurred.\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t}\n\n\t\t// Mozilla, Opera and webkit nightlies currently support this event\n\t\tif ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\n\n\t\t// If IE event model is used\n\t\t} else if ( document.attachEvent ) {\n\t\t\t// ensure firing before onload,\n\t\t\t// maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar toplevel = false;\n\n\t\t\ttry {\n\t\t\t\ttoplevel = window.frameElement == null;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( document.documentElement.doScroll && toplevel ) {\n\t\t\t\tdoScrollCheck();\n\t\t\t}\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\t// A crude way of determining if an object is a window\n\tisWindow: function( obj ) {\n\t\treturn obj && typeof obj === \"object\" && \"setInterval\" in obj;\n\t},\n\n\tisNaN: function( obj ) {\n\t\treturn obj == null || !rdigit.test( obj ) || isNaN( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\treturn obj == null ?\n\t\t\tString( obj ) :\n\t\t\tclass2type[ toString.call(obj) ] || \"object\";\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Not own constructor property must be Object\n\t\tif ( obj.constructor &&\n\t\t\t!hasOwn.call(obj, \"constructor\") &&\n\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tfor ( var name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow msg;\n\t},\n\n\tparseJSON: function( data ) {\n\t\tif ( typeof data !== \"string\" || !data ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\tdata = jQuery.trim( data );\n\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\t// Make sure the incoming data is actual JSON\n\t\t// Logic borrowed from http://json.org/json2.js\n\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\treturn (new Function( \"return \" + data ))();\n\n\t\t}\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\t// (xml & tmp used internally)\n\tparseXML: function( data , xml , tmp ) {\n\n\t\tif ( window.DOMParser ) { // Standard\n\t\t\ttmp = new DOMParser();\n\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t} else { // IE\n\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\txml.async = \"false\";\n\t\t\txml.loadXML( data );\n\t\t}\n\n\t\ttmp = xml.documentElement;\n\n\t\tif ( ! tmp || ! tmp.nodeName || tmp.nodeName === \"parsererror\" ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && rnotwhite.test( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( object, callback, args ) {\n\t\tvar name, i = 0,\n\t\t\tlength = object.length,\n\t\t\tisObj = length === undefined || jQuery.isFunction( object );\n\n\t\tif ( args ) {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.apply( object[ name ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.apply( object[ i++ ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.call( object[ name ], name, object[ name ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn object;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: trim ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttrim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttext.toString().replace( trimLeft, \"\" ).replace( trimRight, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( array, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( array != null ) {\n\t\t\t// The window, strings (and functions) also have 'length'\n\t\t\t// The extra typeof function check is to prevent crashes\n\t\t\t// in Safari 2 (See: #3039)\n\t\t\t// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\n\t\t\tvar type = jQuery.type( array );\n\n\t\t\tif ( array.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( array ) ) {\n\t\t\t\tpush.call( ret, array );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( ret, array );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, array ) {\n\n\t\tif ( indexOf ) {\n\t\t\treturn indexOf.call( array, elem );\n\t\t}\n\n\t\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\t\tif ( array[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar i = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof second.length === \"number\" ) {\n\t\t\tfor ( var l = second.length; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar ret = [], retVal;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( var i = 0, length = elems.length; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value, key, ret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\t// jquery objects are treated as arrays\n\t\t\tisArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( key in elems ) {\n\t\t\t\tvalue = callback( elems[ key ], key, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn ret.concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tif ( typeof context === \"string\" ) {\n\t\t\tvar tmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\tvar args = slice.call( arguments, 2 ),\n\t\t\tproxy = function() {\n\t\t\t\treturn fn.apply( context, args.concat( slice.call( arguments ) ) );\n\t\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Mutifunctional method to get and set values to a collection\n\t// The value/s can be optionally by executed if its a function\n\taccess: function( elems, key, value, exec, fn, pass ) {\n\t\tvar length = elems.length;\n\n\t\t// Setting many attributes\n\t\tif ( typeof key === \"object\" ) {\n\t\t\tfor ( var k in key ) {\n\t\t\t\tjQuery.access( elems, k, key[k], exec, fn, value );\n\t\t\t}\n\t\t\treturn elems;\n\t\t}\n\n\t\t// Setting one attribute\n\t\tif ( value !== undefined ) {\n\t\t\t// Optionally, function values get executed if exec is true\n\t\t\texec = !pass && exec && jQuery.isFunction(value);\n\n\t\t\tfor ( var i = 0; i < length; i++ ) {\n\t\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\n\t\t\t}\n\n\t\t\treturn elems;\n\t\t}\n\n\t\t// Getting an attribute\n\t\treturn length ? fn( elems[0], key ) : undefined;\n\t},\n\n\tnow: function() {\n\t\treturn (new Date()).getTime();\n\t},\n\n\t// Use of jQuery.browser is frowned upon.\n\t// More details: http://docs.jquery.com/Utilities/jQuery.browser\n\tuaMatch: function( ua ) {\n\t\tua = ua.toLowerCase();\n\n\t\tvar match = rwebkit.exec( ua ) ||\n\t\t\tropera.exec( ua ) ||\n\t\t\trmsie.exec( ua ) ||\n\t\t\tua.indexOf(\"compatible\") < 0 && rmozilla.exec( ua ) ||\n\t\t\t[];\n\n\t\treturn { browser: match[1] || \"\", version: match[2] || \"0\" };\n\t},\n\n\tsub: function() {\n\t\tfunction jQuerySub( selector, context ) {\n\t\t\treturn new jQuerySub.fn.init( selector, context );\n\t\t}\n\t\tjQuery.extend( true, jQuerySub, this );\n\t\tjQuerySub.superclass = this;\n\t\tjQuerySub.fn = jQuerySub.prototype = this();\n\t\tjQuerySub.fn.constructor = jQuerySub;\n\t\tjQuerySub.sub = this.sub;\n\t\tjQuerySub.fn.init = function init( selector, context ) {\n\t\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\n\t\t\t\tcontext = jQuerySub( context );\n\t\t\t}\n\n\t\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\n\t\t};\n\t\tjQuerySub.fn.init.prototype = jQuerySub.fn;\n\t\tvar rootjQuerySub = jQuerySub(document);\n\t\treturn jQuerySub;\n\t},\n\n\tbrowser: {}\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nbrowserMatch = jQuery.uaMatch( userAgent );\nif ( browserMatch.browser ) {\n\tjQuery.browser[ browserMatch.browser ] = true;\n\tjQuery.browser.version = browserMatch.version;\n}\n\n// Deprecated, use jQuery.browser.webkit instead\nif ( jQuery.browser.webkit ) {\n\tjQuery.browser.safari = true;\n}\n\n// IE doesn't match non-breaking spaces with \\s\nif ( rnotwhite.test( \"\\xA0\" ) ) {\n\ttrimLeft = /^[\\s\\xA0]+/;\n\ttrimRight = /[\\s\\xA0]+$/;\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n\n// Cleanup functions for the document ready method\nif ( document.addEventListener ) {\n\tDOMContentLoaded = function() {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\tjQuery.ready();\n\t};\n\n} else if ( document.attachEvent ) {\n\tDOMContentLoaded = function() {\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n\t\t\tjQuery.ready();\n\t\t}\n\t};\n}\n\n// The DOM ready check for Internet Explorer\nfunction doScrollCheck() {\n\tif ( jQuery.isReady ) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\t// If IE is used, use the trick by Diego Perini\n\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\tdocument.documentElement.doScroll(\"left\");\n\t} catch(e) {\n\t\tsetTimeout( doScrollCheck, 1 );\n\t\treturn;\n\t}\n\n\t// and execute any waiting functions\n\tjQuery.ready();\n}\n\n// Expose jQuery to the global object\nreturn jQuery;\n\n})();\n\n\nvar // Promise methods\n\tpromiseMethods = \"done fail isResolved isRejected promise then always pipe\".split( \" \" ),\n\t// Static reference to slice\n\tsliceDeferred = [].slice;\n\njQuery.extend({\n\t// Create a simple deferred (one callbacks list)\n\t_Deferred: function() {\n\t\tvar // callbacks list\n\t\t\tcallbacks = [],\n\t\t\t// stored [ context , args ]\n\t\t\tfired,\n\t\t\t// to avoid firing when already doing so\n\t\t\tfiring,\n\t\t\t// flag to know if the deferred has been cancelled\n\t\t\tcancelled,\n\t\t\t// the deferred itself\n\t\t\tdeferred  = {\n\n\t\t\t\t// done( f1, f2, ...)\n\t\t\t\tdone: function() {\n\t\t\t\t\tif ( !cancelled ) {\n\t\t\t\t\t\tvar args = arguments,\n\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t\telem,\n\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t_fired;\n\t\t\t\t\t\tif ( fired ) {\n\t\t\t\t\t\t\t_fired = fired;\n\t\t\t\t\t\t\tfired = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor ( i = 0, length = args.length; i < length; i++ ) {\n\t\t\t\t\t\t\telem = args[ i ];\n\t\t\t\t\t\t\ttype = jQuery.type( elem );\n\t\t\t\t\t\t\tif ( type === \"array\" ) {\n\t\t\t\t\t\t\t\tdeferred.done.apply( deferred, elem );\n\t\t\t\t\t\t\t} else if ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tcallbacks.push( elem );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( _fired ) {\n\t\t\t\t\t\t\tdeferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// resolve with given context and args\n\t\t\t\tresolveWith: function( context, args ) {\n\t\t\t\t\tif ( !cancelled && !fired && !firing ) {\n\t\t\t\t\t\t// make sure args are available (#8421)\n\t\t\t\t\t\targs = args || [];\n\t\t\t\t\t\tfiring = 1;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\twhile( callbacks[ 0 ] ) {\n\t\t\t\t\t\t\t\tcallbacks.shift().apply( context, args );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfinally {\n\t\t\t\t\t\t\tfired = [ context, args ];\n\t\t\t\t\t\t\tfiring = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// resolve with this as context and given arguments\n\t\t\t\tresolve: function() {\n\t\t\t\t\tdeferred.resolveWith( this, arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Has this deferred been resolved?\n\t\t\t\tisResolved: function() {\n\t\t\t\t\treturn !!( firing || fired );\n\t\t\t\t},\n\n\t\t\t\t// Cancel\n\t\t\t\tcancel: function() {\n\t\t\t\t\tcancelled = 1;\n\t\t\t\t\tcallbacks = [];\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\treturn deferred;\n\t},\n\n\t// Full fledged deferred (two callbacks list)\n\tDeferred: function( func ) {\n\t\tvar deferred = jQuery._Deferred(),\n\t\t\tfailDeferred = jQuery._Deferred(),\n\t\t\tpromise;\n\t\t// Add errorDeferred methods, then and promise\n\t\tjQuery.extend( deferred, {\n\t\t\tthen: function( doneCallbacks, failCallbacks ) {\n\t\t\t\tdeferred.done( doneCallbacks ).fail( failCallbacks );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\talways: function() {\n\t\t\t\treturn deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );\n\t\t\t},\n\t\t\tfail: failDeferred.done,\n\t\t\trejectWith: failDeferred.resolveWith,\n\t\t\treject: failDeferred.resolve,\n\t\t\tisRejected: failDeferred.isResolved,\n\t\t\tpipe: function( fnDone, fnFail ) {\n\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\tjQuery.each( {\n\t\t\t\t\t\tdone: [ fnDone, \"resolve\" ],\n\t\t\t\t\t\tfail: [ fnFail, \"reject\" ]\n\t\t\t\t\t}, function( handler, data ) {\n\t\t\t\t\t\tvar fn = data[ 0 ],\n\t\t\t\t\t\t\taction = data[ 1 ],\n\t\t\t\t\t\t\treturned;\n\t\t\t\t\t\tif ( jQuery.isFunction( fn ) ) {\n\t\t\t\t\t\t\tdeferred[ handler ](function() {\n\t\t\t\t\t\t\t\treturned = fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise().then( newDefer.resolve, newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action ]( returned );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdeferred[ handler ]( newDefer[ action ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}).promise();\n\t\t\t},\n\t\t\t// Get a promise for this deferred\n\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\tpromise: function( obj ) {\n\t\t\t\tif ( obj == null ) {\n\t\t\t\t\tif ( promise ) {\n\t\t\t\t\t\treturn promise;\n\t\t\t\t\t}\n\t\t\t\t\tpromise = obj = {};\n\t\t\t\t}\n\t\t\t\tvar i = promiseMethods.length;\n\t\t\t\twhile( i-- ) {\n\t\t\t\t\tobj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];\n\t\t\t\t}\n\t\t\t\treturn obj;\n\t\t\t}\n\t\t});\n\t\t// Make sure only one callback list will be used\n\t\tdeferred.done( failDeferred.cancel ).fail( deferred.cancel );\n\t\t// Unexpose cancel\n\t\tdelete deferred.cancel;\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( firstParam ) {\n\t\tvar args = arguments,\n\t\t\ti = 0,\n\t\t\tlength = args.length,\n\t\t\tcount = length,\n\t\t\tdeferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?\n\t\t\t\tfirstParam :\n\t\t\t\tjQuery.Deferred();\n\t\tfunction resolveFunc( i ) {\n\t\t\treturn function( value ) {\n\t\t\t\targs[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\t// Strange bug in FF4:\n\t\t\t\t\t// Values changed onto the arguments object sometimes end up as undefined values\n\t\t\t\t\t// outside the $.when method. Cloning the object into a fresh array solves the issue\n\t\t\t\t\tdeferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tif ( length > 1 ) {\n\t\t\tfor( ; i < length; i++ ) {\n\t\t\t\tif ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {\n\t\t\t\t\targs[ i ].promise().then( resolveFunc(i), deferred.reject );\n\t\t\t\t} else {\n\t\t\t\t\t--count;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !count ) {\n\t\t\t\tdeferred.resolveWith( deferred, args );\n\t\t\t}\n\t\t} else if ( deferred !== firstParam ) {\n\t\t\tdeferred.resolveWith( deferred, length ? [ firstParam ] : [] );\n\t\t}\n\t\treturn deferred.promise();\n\t}\n});\n\n\n\njQuery.support = (function() {\n\n\tvar div = document.createElement( \"div\" ),\n\t\tdocumentElement = document.documentElement,\n\t\tall,\n\t\ta,\n\t\tselect,\n\t\topt,\n\t\tinput,\n\t\tmarginDiv,\n\t\tsupport,\n\t\tfragment,\n\t\tbody,\n\t\tbodyStyle,\n\t\ttds,\n\t\tevents,\n\t\teventName,\n\t\ti,\n\t\tisSupported;\n\n\t// Preliminary tests\n\tdiv.setAttribute(\"className\", \"t\");\n\tdiv.innerHTML = \"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";\n\n\tall = div.getElementsByTagName( \"*\" );\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\n\t// Can't get basic test support\n\tif ( !all || !all.length || !a ) {\n\t\treturn {};\n\t}\n\n\t// First batch of supports tests\n\tselect = document.createElement( \"select\" );\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName( \"input\" )[ 0 ];\n\n\tsupport = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: ( div.firstChild.nodeType === 3 ),\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName( \"tbody\" ).length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName( \"link\" ).length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: ( a.getAttribute( \"href\" ) === \"/a\" ),\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.55$/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: ( input.value === \"on\" ),\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// Will be defined later\n\t\tsubmitBubbles: true,\n\t\tchangeBubbles: true,\n\t\tfocusinBubbles: false,\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true\n\t};\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\tif ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function click() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tsupport.noCloneEvent = false;\n\t\t\tdiv.detachEvent( \"onclick\", click );\n\t\t});\n\t\tdiv.cloneNode( true ).fireEvent( \"onclick\" );\n\t}\n\n\t// Check if a radio maintains it's value\n\t// after being appended to the DOM\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.setAttribute(\"type\", \"radio\");\n\tsupport.radioValue = input.value === \"t\";\n\n\tinput.setAttribute(\"checked\", \"checked\");\n\tdiv.appendChild( input );\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( div.firstChild );\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\tdiv.innerHTML = \"\";\n\n\t// Figure out if the W3C box model works as expected\n\tdiv.style.width = div.style.paddingLeft = \"1px\";\n\n\t// We use our own, invisible, body\n\tbody = document.createElement( \"body\" );\n\tbodyStyle = {\n\t\tvisibility: \"hidden\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborder: 0,\n\t\tmargin: 0,\n\t\t// Set background to avoid IE crashes when removing (#9028)\n\t\tbackground: \"none\"\n\t};\n\tfor ( i in bodyStyle ) {\n\t\tbody.style[ i ] = bodyStyle[ i ];\n\t}\n\tbody.appendChild( div );\n\tdocumentElement.insertBefore( body, documentElement.firstChild );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\tsupport.boxModel = div.offsetWidth === 2;\n\n\tif ( \"zoom\" in div.style ) {\n\t\t// Check if natively block-level elements act like inline-block\n\t\t// elements when setting their display to 'inline' and giving\n\t\t// them layout\n\t\t// (IE < 8 does this)\n\t\tdiv.style.display = \"inline\";\n\t\tdiv.style.zoom = 1;\n\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );\n\n\t\t// Check if elements with layout shrink-wrap their children\n\t\t// (IE 6 does this)\n\t\tdiv.style.display = \"\";\n\t\tdiv.innerHTML = \"<div style='width:4px;'></div>\";\n\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 2 );\n\t}\n\n\tdiv.innerHTML = \"<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>\";\n\ttds = div.getElementsByTagName( \"td\" );\n\n\t// Check if table cells still have offsetWidth/Height when they are set\n\t// to display:none and there are still other visible table cells in a\n\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t// determining if an element has been hidden directly using\n\t// display:none (it is still safe to use offsets if a parent element is\n\t// hidden; don safety goggles and see bug #4512 for more information).\n\t// (only IE 8 fails this test)\n\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\ttds[ 0 ].style.display = \"\";\n\ttds[ 1 ].style.display = \"none\";\n\n\t// Check if empty table cells still have offsetWidth/Height\n\t// (IE < 8 fail this test)\n\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\tdiv.innerHTML = \"\";\n\n\t// Check if div with explicit width and no margin-right incorrectly\n\t// gets computed margin-right based on width of container. For more\n\t// info see bug #3333\n\t// Fails in WebKit before Feb 2011 nightlies\n\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\tif ( document.defaultView && document.defaultView.getComputedStyle ) {\n\t\tmarginDiv = document.createElement( \"div\" );\n\t\tmarginDiv.style.width = \"0\";\n\t\tmarginDiv.style.marginRight = \"0\";\n\t\tdiv.appendChild( marginDiv );\n\t\tsupport.reliableMarginRight =\n\t\t\t( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;\n\t}\n\n\t// Remove the body element we added\n\tbody.innerHTML = \"\";\n\tdocumentElement.removeChild( body );\n\n\t// Technique from Juriy Zaytsev\n\t// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/\n\t// We only care about the case where non-standard event systems\n\t// are used, namely in IE. Short-circuiting here helps us to\n\t// avoid an eval call (in setAttribute) which can cause CSP\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n\tif ( div.attachEvent ) {\n\t\tfor( i in {\n\t\t\tsubmit: 1,\n\t\t\tchange: 1,\n\t\t\tfocusin: 1\n\t\t} ) {\n\t\t\teventName = \"on\" + i;\n\t\t\tisSupported = ( eventName in div );\n\t\t\tif ( !isSupported ) {\n\t\t\t\tdiv.setAttribute( eventName, \"return;\" );\n\t\t\t\tisSupported = ( typeof div[ eventName ] === \"function\" );\n\t\t\t}\n\t\t\tsupport[ i + \"Bubbles\" ] = isSupported;\n\t\t}\n\t}\n\n\treturn support;\n})();\n\n// Keep track of boxModel\njQuery.boxModel = jQuery.support.boxModel;\n\n\n\n\nvar rbrace = /^(?:\\{.*\\}|\\[.*\\])$/,\n\trmultiDash = /([a-z])([A-Z])/g;\n\njQuery.extend({\n\tcache: {},\n\n\t// Please use with caution\n\tuuid: 0,\n\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\t\t\"applet\": true\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar internalKey = jQuery.expando, getByName = typeof name === \"string\", thisCache,\n\n\t\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t\t// can't GC object references properly across the DOM-JS boundary\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t\t// attached directly to the object so GC can occur automatically\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\t\tid = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;\n\n\t\t// Avoid doing any more work than we need to when trying to get data on an\n\t\t// object that has no data at all\n\t\tif ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !id ) {\n\t\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t\t// ends up in the global cache\n\t\t\tif ( isNode ) {\n\t\t\t\telem[ jQuery.expando ] = id = ++jQuery.uuid;\n\t\t\t} else {\n\t\t\t\tid = jQuery.expando;\n\t\t\t}\n\t\t}\n\n\t\tif ( !cache[ id ] ) {\n\t\t\tcache[ id ] = {};\n\n\t\t\t// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery\n\t\t\t// metadata on plain JS objects when the object is serialized using\n\t\t\t// JSON.stringify\n\t\t\tif ( !isNode ) {\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t\t}\n\t\t}\n\n\t\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t\t// shallow copied over onto the existing cache\n\t\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\t\tif ( pvt ) {\n\t\t\t\tcache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);\n\t\t\t} else {\n\t\t\t\tcache[ id ] = jQuery.extend(cache[ id ], name);\n\t\t\t}\n\t\t}\n\n\t\tthisCache = cache[ id ];\n\n\t\t// Internal jQuery data is stored in a separate object inside the object's data\n\t\t// cache in order to avoid key collisions between internal data and user-defined\n\t\t// data\n\t\tif ( pvt ) {\n\t\t\tif ( !thisCache[ internalKey ] ) {\n\t\t\t\tthisCache[ internalKey ] = {};\n\t\t\t}\n\n\t\t\tthisCache = thisCache[ internalKey ];\n\t\t}\n\n\t\tif ( data !== undefined ) {\n\t\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t\t}\n\n\t\t// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should\n\t\t// not attempt to inspect the internal events object using jQuery.data, as this\n\t\t// internal data object is undocumented and subject to change.\n\t\tif ( name === \"events\" && !thisCache[name] ) {\n\t\t\treturn thisCache[ internalKey ] && thisCache[ internalKey ].events;\n\t\t}\n\n\t\treturn getByName ? thisCache[ jQuery.camelCase( name ) ] : thisCache;\n\t},\n\n\tremoveData: function( elem, name, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar internalKey = jQuery.expando, isNode = elem.nodeType,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t\t// If there is already no cache entry for this object, there is no\n\t\t// purpose in continuing\n\t\tif ( !cache[ id ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( name ) {\n\t\t\tvar thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];\n\n\t\t\tif ( thisCache ) {\n\t\t\t\tdelete thisCache[ name ];\n\n\t\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t\t// and let the cache object itself get destroyed\n\t\t\t\tif ( !isEmptyDataObject(thisCache) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// See jQuery.data for more information\n\t\tif ( pvt ) {\n\t\t\tdelete cache[ id ][ internalKey ];\n\n\t\t\t// Don't destroy the parent cache unless the internal data object\n\t\t\t// had been the only thing left in it\n\t\t\tif ( !isEmptyDataObject(cache[ id ]) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tvar internalCache = cache[ id ][ internalKey ];\n\n\t\t// Browsers that fail expando deletion also refuse to delete expandos on\n\t\t// the window, but it will allow it on all other JS objects; other browsers\n\t\t// don't care\n\t\tif ( jQuery.support.deleteExpando || cache != window ) {\n\t\t\tdelete cache[ id ];\n\t\t} else {\n\t\t\tcache[ id ] = null;\n\t\t}\n\n\t\t// We destroyed the entire user cache at once because it's faster than\n\t\t// iterating through each key, but we need to continue to persist internal\n\t\t// data if it existed\n\t\tif ( internalCache ) {\n\t\t\tcache[ id ] = {};\n\t\t\t// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery\n\t\t\t// metadata on plain JS objects when the object is serialized using\n\t\t\t// JSON.stringify\n\t\t\tif ( !isNode ) {\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t\t}\n\n\t\t\tcache[ id ][ internalKey ] = internalCache;\n\n\t\t// Otherwise, we need to eliminate the expando on the node to avoid\n\t\t// false lookups in the cache for entries that no longer exist\n\t\t} else if ( isNode ) {\n\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t// we must handle all of these cases\n\t\t\tif ( jQuery.support.deleteExpando ) {\n\t\t\t\tdelete elem[ jQuery.expando ];\n\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\telem.removeAttribute( jQuery.expando );\n\t\t\t} else {\n\t\t\t\telem[ jQuery.expando ] = null;\n\t\t\t}\n\t\t}\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn jQuery.data( elem, name, data, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\tif ( elem.nodeName ) {\n\t\t\tvar match = jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t\tif ( match ) {\n\t\t\t\treturn !(match === true || elem.getAttribute(\"classid\") !== match);\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar data = null;\n\n\t\tif ( typeof key === \"undefined\" ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( this[0] );\n\n\t\t\t\tif ( this[0].nodeType === 1 ) {\n\t\t\t    var attr = this[0].attributes, name;\n\t\t\t\t\tfor ( var i = 0, l = attr.length; i < l; i++ ) {\n\t\t\t\t\t\tname = attr[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\n\n\t\t\t\t\t\t\tdataAttr( this[0], name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t} else if ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\tvar parts = key.split(\".\");\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\n\n\t\tif ( value === undefined ) {\n\t\t\tdata = this.triggerHandler(\"getData\" + parts[1] + \"!\", [parts[0]]);\n\n\t\t\t// Try to fetch any internally stored data first\n\t\t\tif ( data === undefined && this.length ) {\n\t\t\t\tdata = jQuery.data( this[0], key );\n\t\t\t\tdata = dataAttr( this[0], key, data );\n\t\t\t}\n\n\t\t\treturn data === undefined && parts[1] ?\n\t\t\t\tthis.data( parts[0] ) :\n\t\t\t\tdata;\n\n\t\t} else {\n\t\t\treturn this.each(function() {\n\t\t\t\tvar $this = jQuery( this ),\n\t\t\t\t\targs = [ parts[0], value ];\n\n\t\t\t\t$this.triggerHandler( \"setData\" + parts[1] + \"!\", args );\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t\t$this.triggerHandler( \"changeData\" + parts[1] + \"!\", args );\n\t\t\t});\n\t\t}\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"$1-$2\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\tdata === \"false\" ? false :\n\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t!jQuery.isNaN( data ) ? parseFloat( data ) :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON\n// property to be considered empty objects; this property always exists in\n// order to make sure JSON.stringify does not expose internal metadata\nfunction isEmptyDataObject( obj ) {\n\tfor ( var name in obj ) {\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\nfunction handleQueueMarkDefer( elem, type, src ) {\n\tvar deferDataKey = type + \"defer\",\n\t\tqueueDataKey = type + \"queue\",\n\t\tmarkDataKey = type + \"mark\",\n\t\tdefer = jQuery.data( elem, deferDataKey, undefined, true );\n\tif ( defer &&\n\t\t( src === \"queue\" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&\n\t\t( src === \"mark\" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {\n\t\t// Give room for hard-coded callbacks to fire first\n\t\t// and eventually mark/queue something else on the element\n\t\tsetTimeout( function() {\n\t\t\tif ( !jQuery.data( elem, queueDataKey, undefined, true ) &&\n\t\t\t\t!jQuery.data( elem, markDataKey, undefined, true ) ) {\n\t\t\t\tjQuery.removeData( elem, deferDataKey, true );\n\t\t\t\tdefer.resolve();\n\t\t\t}\n\t\t}, 0 );\n\t}\n}\n\njQuery.extend({\n\n\t_mark: function( elem, type ) {\n\t\tif ( elem ) {\n\t\t\ttype = (type || \"fx\") + \"mark\";\n\t\t\tjQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );\n\t\t}\n\t},\n\n\t_unmark: function( force, elem, type ) {\n\t\tif ( force !== true ) {\n\t\t\ttype = elem;\n\t\t\telem = force;\n\t\t\tforce = false;\n\t\t}\n\t\tif ( elem ) {\n\t\t\ttype = type || \"fx\";\n\t\t\tvar key = type + \"mark\",\n\t\t\t\tcount = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );\n\t\t\tif ( count ) {\n\t\t\t\tjQuery.data( elem, key, count, true );\n\t\t\t} else {\n\t\t\t\tjQuery.removeData( elem, key, true );\n\t\t\t\thandleQueueMarkDefer( elem, type, \"mark\" );\n\t\t\t}\n\t\t}\n\t},\n\n\tqueue: function( elem, type, data ) {\n\t\tif ( elem ) {\n\t\t\ttype = (type || \"fx\") + \"queue\";\n\t\t\tvar q = jQuery.data( elem, type, undefined, true );\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !q || jQuery.isArray(data) ) {\n\t\t\t\t\tq = jQuery.data( elem, type, jQuery.makeArray(data), true );\n\t\t\t\t} else {\n\t\t\t\t\tq.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn q || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tfn = queue.shift(),\n\t\t\tdefer;\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift(\"inprogress\");\n\t\t\t}\n\n\t\t\tfn.call(elem, function() {\n\t\t\t\tjQuery.dequeue(elem, type);\n\t\t\t});\n\t\t}\n\n\t\tif ( !queue.length ) {\n\t\t\tjQuery.removeData( elem, type + \"queue\", true );\n\t\t\thandleQueueMarkDefer( elem, type, \"queue\" );\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t}\n\n\t\tif ( data === undefined ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[time] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function() {\n\t\t\tvar elem = this;\n\t\t\tsetTimeout(function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t}, time );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, object ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobject = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\t\tvar defer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = elements.length,\n\t\t\tcount = 1,\n\t\t\tdeferDataKey = type + \"defer\",\n\t\t\tqueueDataKey = type + \"queue\",\n\t\t\tmarkDataKey = type + \"mark\",\n\t\t\ttmp;\n\t\tfunction resolve() {\n\t\t\tif ( !( --count ) ) {\n\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t}\n\t\t}\n\t\twhile( i-- ) {\n\t\t\tif (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||\n\t\t\t\t\t( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||\n\t\t\t\t\t\tjQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&\n\t\t\t\t\tjQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.done( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise();\n\t}\n});\n\n\n\n\nvar rclass = /[\\n\\t\\r]/g,\n\trspace = /\\s+/,\n\trreturn = /\\r/g,\n\trtype = /^(?:button|input)$/i,\n\trfocusable = /^(?:button|input|object|select|textarea)$/i,\n\trclickable = /^a(?:rea)?$/i,\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n\trinvalidChar = /\\:/,\n\tformHook, boolHook;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, name, value, true, jQuery.attr );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\t\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, name, value, true, jQuery.prop );\n\t},\n\t\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\tself.addClass( value.call(this, i, self.attr(\"class\") || \"\") );\n\t\t\t});\n\t\t}\n\n\t\tif ( value && typeof value === \"string\" ) {\n\t\t\tvar classNames = (value || \"\").split( rspace );\n\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tvar elem = this[i];\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !elem.className ) {\n\t\t\t\t\t\telem.className = value;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar className = \" \" + elem.className + \" \",\n\t\t\t\t\t\t\tsetClass = elem.className;\n\n\t\t\t\t\t\tfor ( var c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tif ( className.indexOf( \" \" + classNames[c] + \" \" ) < 0 ) {\n\t\t\t\t\t\t\t\tsetClass += \" \" + classNames[c];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\tself.removeClass( value.call(this, i, self.attr(\"class\")) );\n\t\t\t});\n\t\t}\n\n\t\tif ( (value && typeof value === \"string\") || value === undefined ) {\n\t\t\tvar classNames = (value || \"\").split( rspace );\n\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tvar elem = this[i];\n\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\n\t\t\t\t\tif ( value ) {\n\t\t\t\t\t\tvar className = (\" \" + elem.className + \" \").replace(rclass, \" \");\n\t\t\t\t\t\tfor ( var c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tclassName = className.replace(\" \" + classNames[c] + \" \", \" \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( className );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.className = \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisBool = typeof stateVal === \"boolean\";\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\tself.toggleClass( value.call(this, i, self.attr(\"class\"), stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tstate = stateVal,\n\t\t\t\t\tclassNames = value.split( rspace );\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space seperated list\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// toggle whole className\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \";\n\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\tif ( (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar hooks, ret,\n\t\t\telem = this[0];\n\t\t\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\treturn (elem.value || \"\").replace(rreturn, \"\");\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar isFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar self = jQuery(this), val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, self.val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tvalues = [],\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tone = elem.type === \"select-one\";\n\n\t\t\t\t// Nothing was selected\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {\n\t\t\t\t\tvar option = options[ i ];\n\n\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\tif ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null) &&\n\t\t\t\t\t\t\t(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" )) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fixes Bug #2551 -- select.val() broken in IE after form.reset()\n\t\t\t\tif ( one && !values.length && options.length ) {\n\t\t\t\t\treturn jQuery( options[ index ] ).val();\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar values = jQuery.makeArray( value );\n\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattrFn: {\n\t\tval: true,\n\t\tcss: true,\n\t\thtml: true,\n\t\ttext: true,\n\t\tdata: true,\n\t\twidth: true,\n\t\theight: true,\n\t\toffset: true\n\t},\n\t\n\tattrFix: {\n\t\t// Always normalize to ensure hook usage\n\t\ttabindex: \"tabIndex\"\n\t},\n\t\n\tattr: function( elem, name, value, pass ) {\n\t\tvar nType = elem.nodeType;\n\t\t\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( pass && name in jQuery.attrFn ) {\n\t\t\treturn jQuery( elem )[ name ]( value );\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( !(\"getAttribute\" in elem) ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\tvar ret, hooks,\n\t\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// Normalize the name if needed\n\t\tname = notxml && jQuery.attrFix[ name ] || name;\n\n\t\thooks = jQuery.attrHooks[ name ];\n\n\t\tif ( !hooks ) {\n\t\t\t// Use boolHook for boolean attributes\n\t\t\tif ( rboolean.test( name ) &&\n\t\t\t\t(typeof value === \"boolean\" || value === undefined || value.toLowerCase() === name.toLowerCase()) ) {\n\n\t\t\t\thooks = boolHook;\n\n\t\t\t// Use formHook for forms and if the name contains certain characters\n\t\t\t} else if ( formHook && (jQuery.nodeName( elem, \"form\" ) || rinvalidChar.test( name )) ) {\n\t\t\t\thooks = formHook;\n\t\t\t}\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn undefined;\n\n\t\t\t} else if ( hooks && \"set\" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, \"\" + value );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && notxml ) {\n\t\t\treturn hooks.get( elem, name );\n\n\t\t} else {\n\n\t\t\tret = elem.getAttribute( name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret === null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, name ) {\n\t\tvar propName;\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tname = jQuery.attrFix[ name ] || name;\n\t\t\n\t\t\tif ( jQuery.support.getSetAttribute ) {\n\t\t\t\t// Use removeAttribute in browsers that support it\n\t\t\t\telem.removeAttribute( name );\n\t\t\t} else {\n\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\telem.removeAttributeNode( elem.getAttributeNode( name ) );\n\t\t\t}\n\n\t\t\t// Set corresponding property to false for boolean attributes\n\t\t\tif ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {\n\t\t\t\telem[ propName ] = false;\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\t// We can't allow the type property to be changed (since it causes problems in IE)\n\t\t\t\tif ( rtype.test( elem.nodeName ) && elem.parentNode ) {\n\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\n\t\t\t\t} else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to it's default in case type is set after value\n\t\t\t\t\t// This is for element creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabIndex\");\n\n\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tundefined;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\",\n\t\tmaxlength: \"maxLength\",\n\t\tcellspacing: \"cellSpacing\",\n\t\tcellpadding: \"cellPadding\",\n\t\trowspan: \"rowSpan\",\n\t\tcolspan: \"colSpan\",\n\t\tusemap: \"useMap\",\n\t\tframeborder: \"frameBorder\",\n\t\tcontenteditable: \"contentEditable\"\n\t},\n\t\n\tprop: function( elem, name, value ) {\n\t\tvar nType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar ret, hooks,\n\t\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// Try to normalize/fix the name\n\t\tname = notxml && jQuery.propFix[ name ] || name;\n\t\t\n\t\thooks = jQuery.propHooks[ name ];\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn (elem[ name ] = value);\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\t\t}\n\t},\n\t\n\tpropHooks: {}\n});\n\n// Hook for boolean attributes\nboolHook = {\n\tget: function( elem, name ) {\n\t\t// Align boolean attributes with corresponding properties\n\t\treturn elem[ jQuery.propFix[ name ] || name ] ?\n\t\t\tname.toLowerCase() :\n\t\t\tundefined;\n\t},\n\tset: function( elem, value, name ) {\n\t\tvar propName;\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\t// value is true since we know at this point it's type boolean and not false\n\t\t\t// Set boolean attributes to the same name and set the DOM property\n\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\tif ( propName in elem ) {\n\t\t\t\t// Only set the IDL specifically if it already exists on the element\n\t\t\t\telem[ propName ] = value;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, name.toLowerCase() );\n\t\t}\n\t\treturn name;\n\t}\n};\n\n// Use the value property for back compat\n// Use the formHook for button elements in IE6/7 (#1954)\njQuery.attrHooks.value = {\n\tget: function( elem, name ) {\n\t\tif ( formHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\treturn formHook.get( elem, name );\n\t\t}\n\t\treturn elem.value;\n\t},\n\tset: function( elem, value, name ) {\n\t\tif ( formHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\treturn formHook.set( elem, value, name );\n\t\t}\n\t\t// Does not return so that setAttribute is also used\n\t\telem.value = value;\n\t}\n};\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !jQuery.support.getSetAttribute ) {\n\n\t// propFix is more comprehensive and contains all fixes\n\tjQuery.attrFix = jQuery.propFix;\n\t\n\t// Use this for any attribute on a form in IE6/7\n\tformHook = jQuery.attrHooks.name = jQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret;\n\t\t\tret = elem.getAttributeNode( name );\n\t\t\t// Return undefined if nodeValue is empty string\n\t\t\treturn ret && ret.nodeValue !== \"\" ?\n\t\t\t\tret.nodeValue :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\t// Check form objects in IE (multiple bugs related)\n\t\t\t// Only use nodeValue if the attribute node exists on the form\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( ret ) {\n\t\t\t\tret.nodeValue = value;\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n\n// Some attributes require a special call on IE\nif ( !jQuery.support.hrefNormalized ) {\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\t\t\t\treturn ret === null ? undefined : ret;\n\t\t\t}\n\t\t});\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Normalize to lowercase since IE uppercases css property names\n\t\t\treturn elem.style.cssText.toLowerCase() || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn (elem.style.cssText = \"\" + value);\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\t\tjQuery.valHooks[ this ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t}\n\t\t};\n\t});\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);\n\t\t\t}\n\t\t}\n\t});\n});\n\n\n\n\nvar hasOwn = Object.prototype.hasOwnProperty,\n\trnamespaces = /\\.(.*)$/,\n\trformElems = /^(?:textarea|input|select)$/i,\n\trperiod = /\\./g,\n\trspaces = / /g,\n\trescape = /[^\\w\\s.|`]/g,\n\tfcleanup = function( nm ) {\n\t\treturn nm.replace(rescape, \"\\\\$&\");\n\t};\n\n/*\n * A number of helper functions used for managing events.\n * Many of the ideas behind this code originated from\n * Dean Edwards' addEvent library.\n */\njQuery.event = {\n\n\t// Bind an event to an element\n\t// Original by Dean Edwards\n\tadd: function( elem, types, handler, data ) {\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( handler === false ) {\n\t\t\thandler = returnFalse;\n\t\t} else if ( !handler ) {\n\t\t\t// Fixes bug #7229. Fix recommended by jdalton\n\t\t\treturn;\n\t\t}\n\n\t\tvar handleObjIn, handleObj;\n\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t}\n\n\t\t// Make sure that the function being executed has a unique ID\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure\n\t\tvar elemData = jQuery._data( elem );\n\n\t\t// If no elemData is found then we must be trying to bind to one of the\n\t\t// banned noData elements\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar events = elemData.events,\n\t\t\teventHandle = elemData.handle;\n\n\t\tif ( !events ) {\n\t\t\telemData.events = events = {};\n\t\t}\n\n\t\tif ( !eventHandle ) {\n\t\t\telemData.handle = eventHandle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.handle.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t}\n\n\t\t// Add elem as a property of the handle function\n\t\t// This is to prevent a memory leak with non-native events in IE.\n\t\teventHandle.elem = elem;\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = types.split(\" \");\n\n\t\tvar type, i = 0, namespaces;\n\n\t\twhile ( (type = types[ i++ ]) ) {\n\t\t\thandleObj = handleObjIn ?\n\t\t\t\tjQuery.extend({}, handleObjIn) :\n\t\t\t\t{ handler: handler, data: data };\n\n\t\t\t// Namespaced event handlers\n\t\t\tif ( type.indexOf(\".\") > -1 ) {\n\t\t\t\tnamespaces = type.split(\".\");\n\t\t\t\ttype = namespaces.shift();\n\t\t\t\thandleObj.namespace = namespaces.slice(0).sort().join(\".\");\n\n\t\t\t} else {\n\t\t\t\tnamespaces = [];\n\t\t\t\thandleObj.namespace = \"\";\n\t\t\t}\n\n\t\t\thandleObj.type = type;\n\t\t\tif ( !handleObj.guid ) {\n\t\t\t\thandleObj.guid = handler.guid;\n\t\t\t}\n\n\t\t\t// Get the current list of functions bound to this event\n\t\t\tvar handlers = events[ type ],\n\t\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// Init the event handler queue\n\t\t\tif ( !handlers ) {\n\t\t\t\thandlers = events[ type ] = [];\n\n\t\t\t\t// Check for a special event handler\n\t\t\t\t// Only use addEventListener/attachEvent if the special\n\t\t\t\t// events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the function to the element's handler list\n\t\t\thandlers.push( handleObj );\n\n\t\t\t// Keep track of which events have been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\tglobal: {},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, pos ) {\n\t\t// don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( handler === false ) {\n\t\t\thandler = returnFalse;\n\t\t}\n\n\t\tvar ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem ),\n\t\t\tevents = elemData && elemData.events;\n\n\t\tif ( !elemData || !events ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// types is actually an event object here\n\t\tif ( types && types.type ) {\n\t\t\thandler = types.handler;\n\t\t\ttypes = types.type;\n\t\t}\n\n\t\t// Unbind all events for the element\n\t\tif ( !types || typeof types === \"string\" && types.charAt(0) === \".\" ) {\n\t\t\ttypes = types || \"\";\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tjQuery.event.remove( elem, type + types );\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).unbind(\"mouseover mouseout\", fn);\n\t\ttypes = types.split(\" \");\n\n\t\twhile ( (type = types[ i++ ]) ) {\n\t\t\torigType = type;\n\t\t\thandleObj = null;\n\t\t\tall = type.indexOf(\".\") < 0;\n\t\t\tnamespaces = [];\n\n\t\t\tif ( !all ) {\n\t\t\t\t// Namespaced event handlers\n\t\t\t\tnamespaces = type.split(\".\");\n\t\t\t\ttype = namespaces.shift();\n\n\t\t\t\tnamespace = new RegExp(\"(^|\\\\.)\" +\n\t\t\t\t\tjQuery.map( namespaces.slice(0).sort(), fcleanup ).join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\");\n\t\t\t}\n\n\t\t\teventType = events[ type ];\n\n\t\t\tif ( !eventType ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !handler ) {\n\t\t\t\tfor ( j = 0; j < eventType.length; j++ ) {\n\t\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\t\tif ( all || namespace.test( handleObj.namespace ) ) {\n\t\t\t\t\t\tjQuery.event.remove( elem, origType, handleObj.handler, j );\n\t\t\t\t\t\teventType.splice( j--, 1 );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\tfor ( j = pos || 0; j < eventType.length; j++ ) {\n\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\tif ( handler.guid === handleObj.guid ) {\n\t\t\t\t\t// remove the given handler for the given type\n\t\t\t\t\tif ( all || namespace.test( handleObj.namespace ) ) {\n\t\t\t\t\t\tif ( pos == null ) {\n\t\t\t\t\t\t\teventType.splice( j--, 1 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( pos != null ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// remove generic event handler if no more handlers exist\n\t\t\tif ( eventType.length === 0 || pos != null && eventType.length === 1 ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tret = null;\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tvar handle = elemData.handle;\n\t\t\tif ( handle ) {\n\t\t\t\thandle.elem = null;\n\t\t\t}\n\n\t\t\tdelete elemData.events;\n\t\t\tdelete elemData.handle;\n\n\t\t\tif ( jQuery.isEmptyObject( elemData ) ) {\n\t\t\t\tjQuery.removeData( elem, undefined, true );\n\t\t\t}\n\t\t}\n\t},\n\t\n\t// Events that are safe to short-circuit if no handlers are attached.\n\t// Native DOM events should not be added, they may have inline handlers.\n\tcustomEvent: {\n\t\t\"getData\": true,\n\t\t\"setData\": true,\n\t\t\"changeData\": true\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\t// Event object or event type\n\t\tvar type = event.type || event,\n\t\t\tnamespaces = [],\n\t\t\texclusive;\n\n\t\tif ( type.indexOf(\"!\") >= 0 ) {\n\t\t\t// Exclusive events trigger only for the exact event (no namespaces)\n\t\t\ttype = type.slice(0, -1);\n\t\t\texclusive = true;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\n\t\tif ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\n\t\t\t// No jQuery handlers for this event type, and it can't have inline handlers\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an Event, Object, or just an event type string\n\t\tevent = typeof event === \"object\" ?\n\t\t\t// jQuery.Event object\n\t\t\tevent[ jQuery.expando ] ? event :\n\t\t\t// Object literal\n\t\t\tnew jQuery.Event( type, event ) :\n\t\t\t// Just the event type (string)\n\t\t\tnew jQuery.Event( type );\n\n\t\tevent.type = type;\n\t\tevent.exclusive = exclusive;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\");\n\t\t\n\t\t// triggerHandler() and global events don't bubble or run the default action\n\t\tif ( onlyHandlers || !elem ) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\n\t\t// Handle a global trigger\n\t\tif ( !elem ) {\n\t\t\t// TODO: Stop taunting the data cache; remove global events and always attach to document\n\t\t\tjQuery.each( jQuery.cache, function() {\n\t\t\t\t// internalKey variable is just used to make it easier to find\n\t\t\t\t// and potentially change this stuff later; currently it just\n\t\t\t\t// points to jQuery.expando\n\t\t\t\tvar internalKey = jQuery.expando,\n\t\t\t\t\tinternalCache = this[ internalKey ];\n\t\t\t\tif ( internalCache && internalCache.events && internalCache.events[ type ] ) {\n\t\t\t\t\tjQuery.event.trigger( event, data, internalCache.handle.elem );\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tevent.target = elem;\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data ? jQuery.makeArray( data ) : [];\n\t\tdata.unshift( event );\n\n\t\tvar cur = elem,\n\t\t\t// IE doesn't like method names with a colon (#3533, #8272)\n\t\t\tontype = type.indexOf(\":\") < 0 ? \"on\" + type : \"\";\n\n\t\t// Fire event on the current element, then bubble up the DOM tree\n\t\tdo {\n\t\t\tvar handle = jQuery._data( cur, \"handle\" );\n\n\t\t\tevent.currentTarget = cur;\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Trigger an inline bound script\n\t\t\tif ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {\n\t\t\t\tevent.result = false;\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\t// Bubble up to document, then to window\n\t\t\tcur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;\n\t\t} while ( cur && !event.isPropagationStopped() );\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !event.isDefaultPrevented() ) {\n\t\t\tvar old,\n\t\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\tif ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction)() check here because IE6/7 fails that test.\n\t\t\t\t// IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.\n\t\t\t\ttry {\n\t\t\t\t\tif ( ontype && elem[ type ] ) {\n\t\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\t\told = elem[ ontype ];\n\n\t\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t}\n\t\t\t\t} catch ( ieError ) {}\n\n\t\t\t\tif ( old ) {\n\t\t\t\t\telem[ ontype ] = old;\n\t\t\t\t}\n\n\t\t\t\tjQuery.event.triggered = undefined;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn event.result;\n\t},\n\n\thandle: function( event ) {\n\t\tevent = jQuery.event.fix( event || window.event );\n\t\t// Snapshot the handlers list since a called handler may add/remove events.\n\t\tvar handlers = ((jQuery._data( this, \"events\" ) || {})[ event.type ] || []).slice(0),\n\t\t\trun_all = !event.exclusive && !event.namespace,\n\t\t\targs = Array.prototype.slice.call( arguments, 0 );\n\n\t\t// Use the fix-ed Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.currentTarget = this;\n\n\t\tfor ( var j = 0, l = handlers.length; j < l; j++ ) {\n\t\t\tvar handleObj = handlers[ j ];\n\n\t\t\t// Triggered event must 1) be non-exclusive and have no namespace, or\n\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event.\n\t\t\tif ( run_all || event.namespace_re.test( handleObj.namespace ) ) {\n\t\t\t\t// Pass in a reference to the handler function itself\n\t\t\t\t// So that we can later remove it\n\t\t\t\tevent.handler = handleObj.handler;\n\t\t\t\tevent.data = handleObj.data;\n\t\t\t\tevent.handleObj = handleObj;\n\n\t\t\t\tvar ret = handleObj.handler.apply( this, args );\n\n\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\tevent.result = ret;\n\t\t\t\t\tif ( ret === false ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( event.isImmediatePropagationStopped() ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn event.result;\n\t},\n\n\tprops: \"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which\".split(\" \"),\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// store a copy of the original event object\n\t\t// and \"clone\" to set read-only properties\n\t\tvar originalEvent = event;\n\t\tevent = jQuery.Event( originalEvent );\n\n\t\tfor ( var i = this.props.length, prop; i; ) {\n\t\t\tprop = this.props[ --i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Fix target property, if necessary\n\t\tif ( !event.target ) {\n\t\t\t// Fixes #1925 where srcElement might not be defined either\n\t\t\tevent.target = event.srcElement || document;\n\t\t}\n\n\t\t// check if target is a textnode (safari)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Add relatedTarget, if necessary\n\t\tif ( !event.relatedTarget && event.fromElement ) {\n\t\t\tevent.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;\n\t\t}\n\n\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\tif ( event.pageX == null && event.clientX != null ) {\n\t\t\tvar eventDocument = event.target.ownerDocument || document,\n\t\t\t\tdoc = eventDocument.documentElement,\n\t\t\t\tbody = eventDocument.body;\n\n\t\t\tevent.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n\t\t\tevent.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);\n\t\t}\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && (event.charCode != null || event.keyCode != null) ) {\n\t\t\tevent.which = event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)\n\t\tif ( !event.metaKey && event.ctrlKey ) {\n\t\t\tevent.metaKey = event.ctrlKey;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t// Note: button is not normalized, so don't use it\n\t\tif ( !event.which && event.button !== undefined ) {\n\t\t\tevent.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));\n\t\t}\n\n\t\treturn event;\n\t},\n\n\t// Deprecated, use jQuery.guid instead\n\tguid: 1E8,\n\n\t// Deprecated, use jQuery.proxy instead\n\tproxy: jQuery.proxy,\n\n\tspecial: {\n\t\tready: {\n\t\t\t// Make sure the ready event is setup\n\t\t\tsetup: jQuery.bindReady,\n\t\t\tteardown: jQuery.noop\n\t\t},\n\n\t\tlive: {\n\t\t\tadd: function( handleObj ) {\n\t\t\t\tjQuery.event.add( this,\n\t\t\t\t\tliveConvert( handleObj.origType, handleObj.selector ),\n\t\t\t\t\tjQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );\n\t\t\t},\n\n\t\t\tremove: function( handleObj ) {\n\t\t\t\tjQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\n\t\t\t\t// We only want to do this special case on windows\n\t\t\t\tif ( jQuery.isWindow( this ) ) {\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tteardown: function( namespaces, eventHandle ) {\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\n\t\t\t\t\tthis.onbeforeunload = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.detachEvent ) {\n\t\t\telem.detachEvent( \"on\" + type, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !this.preventDefault ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// timeStamp is buggy for some events on Firefox(#3843)\n\t// So we won't rely on the native value\n\tthis.timeStamp = jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\nfunction returnFalse() {\n\treturn false;\n}\nfunction returnTrue() {\n\treturn true;\n}\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tpreventDefault: function() {\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// if preventDefault exists run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// otherwise set the returnValue property of the original event to false (IE)\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// if stopPropagation exists run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t},\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse\n};\n\n// Checks if an event happened on an element within another element\n// Used in jQuery.event.special.mouseenter and mouseleave handlers\nvar withinElement = function( event ) {\n\t// Check if mouse(over|out) are still within the same parent element\n\tvar parent = event.relatedTarget;\n\n\t// set the correct event type\n\tevent.type = event.data;\n\n\t// Firefox sometimes assigns relatedTarget a XUL element\n\t// which we cannot access the parentNode property of\n\ttry {\n\n\t\t// Chrome does something similar, the parentNode property\n\t\t// can be accessed but is null.\n\t\tif ( parent && parent !== document && !parent.parentNode ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Traverse up the tree\n\t\twhile ( parent && parent !== this ) {\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\tif ( parent !== this ) {\n\t\t\t// handle event if we actually just moused on to a non sub-element\n\t\t\tjQuery.event.handle.apply( this, arguments );\n\t\t}\n\n\t// assuming we've left the element since we most likely mousedover a xul element\n\t} catch(e) { }\n},\n\n// In case of event delegation, we only need to rename the event.type,\n// liveHandler will take care of the rest.\ndelegate = function( event ) {\n\tevent.type = event.data;\n\tjQuery.event.handle.apply( this, arguments );\n};\n\n// Create mouseenter and mouseleave events\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tsetup: function( data ) {\n\t\t\tjQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );\n\t\t},\n\t\tteardown: function( data ) {\n\t\t\tjQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );\n\t\t}\n\t};\n});\n\n// submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function( data, namespaces ) {\n\t\t\tif ( !jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\tjQuery.event.add(this, \"click.specialSubmit\", function( e ) {\n\t\t\t\t\tvar elem = e.target,\n\t\t\t\t\t\ttype = elem.type;\n\n\t\t\t\t\tif ( (type === \"submit\" || type === \"image\") && jQuery( elem ).closest(\"form\").length ) {\n\t\t\t\t\t\ttrigger( \"submit\", this, arguments );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tjQuery.event.add(this, \"keypress.specialSubmit\", function( e ) {\n\t\t\t\t\tvar elem = e.target,\n\t\t\t\t\t\ttype = elem.type;\n\n\t\t\t\t\tif ( (type === \"text\" || type === \"password\") && jQuery( elem ).closest(\"form\").length && e.keyCode === 13 ) {\n\t\t\t\t\t\ttrigger( \"submit\", this, arguments );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\tteardown: function( namespaces ) {\n\t\t\tjQuery.event.remove( this, \".specialSubmit\" );\n\t\t}\n\t};\n\n}\n\n// change delegation, happens here so we have bind.\nif ( !jQuery.support.changeBubbles ) {\n\n\tvar changeFilters,\n\n\tgetVal = function( elem ) {\n\t\tvar type = elem.type, val = elem.value;\n\n\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\tval = elem.checked;\n\n\t\t} else if ( type === \"select-multiple\" ) {\n\t\t\tval = elem.selectedIndex > -1 ?\n\t\t\t\tjQuery.map( elem.options, function( elem ) {\n\t\t\t\t\treturn elem.selected;\n\t\t\t\t}).join(\"-\") :\n\t\t\t\t\"\";\n\n\t\t} else if ( jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\tval = elem.selectedIndex;\n\t\t}\n\n\t\treturn val;\n\t},\n\n\ttestChange = function testChange( e ) {\n\t\tvar elem = e.target, data, val;\n\n\t\tif ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdata = jQuery._data( elem, \"_change_data\" );\n\t\tval = getVal(elem);\n\n\t\t// the current data will be also retrieved by beforeactivate\n\t\tif ( e.type !== \"focusout\" || elem.type !== \"radio\" ) {\n\t\t\tjQuery._data( elem, \"_change_data\", val );\n\t\t}\n\n\t\tif ( data === undefined || val === data ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( data != null || val ) {\n\t\t\te.type = \"change\";\n\t\t\te.liveFired = undefined;\n\t\t\tjQuery.event.trigger( e, arguments[1], elem );\n\t\t}\n\t};\n\n\tjQuery.event.special.change = {\n\t\tfilters: {\n\t\t\tfocusout: testChange,\n\n\t\t\tbeforedeactivate: testChange,\n\n\t\t\tclick: function( e ) {\n\t\t\t\tvar elem = e.target, type = jQuery.nodeName( elem, \"input\" ) ? elem.type : \"\";\n\n\t\t\t\tif ( type === \"radio\" || type === \"checkbox\" || jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\t\ttestChange.call( this, e );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Change has to be called before submit\n\t\t\t// Keydown will be called before keypress, which is used in submit-event delegation\n\t\t\tkeydown: function( e ) {\n\t\t\t\tvar elem = e.target, type = jQuery.nodeName( elem, \"input\" ) ? elem.type : \"\";\n\n\t\t\t\tif ( (e.keyCode === 13 && !jQuery.nodeName( elem, \"textarea\" ) ) ||\n\t\t\t\t\t(e.keyCode === 32 && (type === \"checkbox\" || type === \"radio\")) ||\n\t\t\t\t\ttype === \"select-multiple\" ) {\n\t\t\t\t\ttestChange.call( this, e );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Beforeactivate happens also before the previous element is blurred\n\t\t\t// with this event you can't trigger a change event, but you can store\n\t\t\t// information\n\t\t\tbeforeactivate: function( e ) {\n\t\t\t\tvar elem = e.target;\n\t\t\t\tjQuery._data( elem, \"_change_data\", getVal(elem) );\n\t\t\t}\n\t\t},\n\n\t\tsetup: function( data, namespaces ) {\n\t\t\tif ( this.type === \"file\" ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor ( var type in changeFilters ) {\n\t\t\t\tjQuery.event.add( this, type + \".specialChange\", changeFilters[type] );\n\t\t\t}\n\n\t\t\treturn rformElems.test( this.nodeName );\n\t\t},\n\n\t\tteardown: function( namespaces ) {\n\t\t\tjQuery.event.remove( this, \".specialChange\" );\n\n\t\t\treturn rformElems.test( this.nodeName );\n\t\t}\n\t};\n\n\tchangeFilters = jQuery.event.special.change.filters;\n\n\t// Handle when the input is .focus()'d\n\tchangeFilters.focus = changeFilters.beforeactivate;\n}\n\nfunction trigger( type, elem, args ) {\n\t// Piggyback on a donor event to simulate a different one.\n\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t// simulated event prevents default then we do the same on the donor.\n\t// Don't pass args or remember liveFired; they apply to the donor event.\n\tvar event = jQuery.extend( {}, args[ 0 ] );\n\tevent.type = type;\n\tevent.originalEvent = {};\n\tevent.liveFired = undefined;\n\tjQuery.event.handle.call( elem, event );\n\tif ( event.isDefaultPrevented() ) {\n\t\targs[ 0 ].preventDefault();\n\t}\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0;\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfunction handler( donor ) {\n\t\t\t// Donor event is always a native one; fix it and switch its type.\n\t\t\t// Let focusin/out handler cancel the donor focus/blur event.\n\t\t\tvar e = jQuery.event.fix( donor );\n\t\t\te.type = fix;\n\t\t\te.originalEvent = {};\n\t\t\tjQuery.event.trigger( e, null, e.target );\n\t\t\tif ( e.isDefaultPrevented() ) {\n\t\t\t\tdonor.preventDefault();\n\t\t\t}\n\t\t}\n\t});\n}\n\njQuery.each([\"bind\", \"one\"], function( i, name ) {\n\tjQuery.fn[ name ] = function( type, data, fn ) {\n\t\tvar handler;\n\n\t\t// Handle object literals\n\t\tif ( typeof type === \"object\" ) {\n\t\t\tfor ( var key in type ) {\n\t\t\t\tthis[ name ](key, data, type[key], fn);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( arguments.length === 2 || data === false ) {\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\tif ( name === \"one\" ) {\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery( this ).unbind( event, handler );\n\t\t\t\treturn fn.apply( this, arguments );\n\t\t\t};\n\t\t\thandler.guid = fn.guid || jQuery.guid++;\n\t\t} else {\n\t\t\thandler = fn;\n\t\t}\n\n\t\tif ( type === \"unload\" && name !== \"one\" ) {\n\t\t\tthis.one( type, data, fn );\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( this[i], type, handler, data );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n});\n\njQuery.fn.extend({\n\tunbind: function( type, fn ) {\n\t\t// Handle object literals\n\t\tif ( typeof type === \"object\" && !type.preventDefault ) {\n\t\t\tfor ( var key in type ) {\n\t\t\t\tthis.unbind(key, type[key]);\n\t\t\t}\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tjQuery.event.remove( this[i], type, fn );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.live( types, data, fn, selector );\n\t},\n\n\tundelegate: function( selector, types, fn ) {\n\t\tif ( arguments.length === 0 ) {\n\t\t\treturn this.unbind( \"live\" );\n\n\t\t} else {\n\t\t\treturn this.die( types, null, fn, selector );\n\t\t}\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\n\ttriggerHandler: function( type, data ) {\n\t\tif ( this[0] ) {\n\t\t\treturn jQuery.event.trigger( type, data, this[0], true );\n\t\t}\n\t},\n\n\ttoggle: function( fn ) {\n\t\t// Save reference to arguments for access in closure\n\t\tvar args = arguments,\n\t\t\tguid = fn.guid || jQuery.guid++,\n\t\t\ti = 0,\n\t\t\ttoggler = function( event ) {\n\t\t\t\t// Figure out which function to execute\n\t\t\t\tvar lastToggle = ( jQuery.data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n\t\t\t\tjQuery.data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n\t\t\t\t// Make sure that clicks stop\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// and execute the function\n\t\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\n\t\t\t};\n\n\t\t// link all the functions, so any of them can unbind this click handler\n\t\ttoggler.guid = guid;\n\t\twhile ( i < args.length ) {\n\t\t\targs[ i++ ].guid = guid;\n\t\t}\n\n\t\treturn this.click( toggler );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n});\n\nvar liveMap = {\n\tfocus: \"focusin\",\n\tblur: \"focusout\",\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n};\n\njQuery.each([\"live\", \"die\"], function( i, name ) {\n\tjQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {\n\t\tvar type, i = 0, match, namespaces, preType,\n\t\t\tselector = origSelector || this.selector,\n\t\t\tcontext = origSelector ? this : jQuery( this.context );\n\n\t\tif ( typeof types === \"object\" && !types.preventDefault ) {\n\t\t\tfor ( var key in types ) {\n\t\t\t\tcontext[ name ]( key, data, types[key], selector );\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( name === \"die\" && !types &&\n\t\t\t\t\torigSelector && origSelector.charAt(0) === \".\" ) {\n\n\t\t\tcontext.unbind( origSelector );\n\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data === false || jQuery.isFunction( data ) ) {\n\t\t\tfn = data || returnFalse;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\ttypes = (types || \"\").split(\" \");\n\n\t\twhile ( (type = types[ i++ ]) != null ) {\n\t\t\tmatch = rnamespaces.exec( type );\n\t\t\tnamespaces = \"\";\n\n\t\t\tif ( match )  {\n\t\t\t\tnamespaces = match[0];\n\t\t\t\ttype = type.replace( rnamespaces, \"\" );\n\t\t\t}\n\n\t\t\tif ( type === \"hover\" ) {\n\t\t\t\ttypes.push( \"mouseenter\" + namespaces, \"mouseleave\" + namespaces );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpreType = type;\n\n\t\t\tif ( liveMap[ type ] ) {\n\t\t\t\ttypes.push( liveMap[ type ] + namespaces );\n\t\t\t\ttype = type + namespaces;\n\n\t\t\t} else {\n\t\t\t\ttype = (liveMap[ type ] || type) + namespaces;\n\t\t\t}\n\n\t\t\tif ( name === \"live\" ) {\n\t\t\t\t// bind live handler\n\t\t\t\tfor ( var j = 0, l = context.length; j < l; j++ ) {\n\t\t\t\t\tjQuery.event.add( context[j], \"live.\" + liveConvert( type, selector ),\n\t\t\t\t\t\t{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\t// unbind live handler\n\t\t\t\tcontext.unbind( \"live.\" + liveConvert( type, selector ), fn );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n});\n\nfunction liveHandler( event ) {\n\tvar stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,\n\t\telems = [],\n\t\tselectors = [],\n\t\tevents = jQuery._data( this, \"events\" );\n\n\t// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)\n\tif ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === \"click\" ) {\n\t\treturn;\n\t}\n\n\tif ( event.namespace ) {\n\t\tnamespace = new RegExp(\"(^|\\\\.)\" + event.namespace.split(\".\").join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\");\n\t}\n\n\tevent.liveFired = this;\n\n\tvar live = events.live.slice(0);\n\n\tfor ( j = 0; j < live.length; j++ ) {\n\t\thandleObj = live[j];\n\n\t\tif ( handleObj.origType.replace( rnamespaces, \"\" ) === event.type ) {\n\t\t\tselectors.push( handleObj.selector );\n\n\t\t} else {\n\t\t\tlive.splice( j--, 1 );\n\t\t}\n\t}\n\n\tmatch = jQuery( event.target ).closest( selectors, event.currentTarget );\n\n\tfor ( i = 0, l = match.length; i < l; i++ ) {\n\t\tclose = match[i];\n\n\t\tfor ( j = 0; j < live.length; j++ ) {\n\t\t\thandleObj = live[j];\n\n\t\t\tif ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {\n\t\t\t\telem = close.elem;\n\t\t\t\trelated = null;\n\n\t\t\t\t// Those two events require additional checking\n\t\t\t\tif ( handleObj.preType === \"mouseenter\" || handleObj.preType === \"mouseleave\" ) {\n\t\t\t\t\tevent.type = handleObj.preType;\n\t\t\t\t\trelated = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];\n\n\t\t\t\t\t// Make sure not to accidentally match a child element with the same selector\n\t\t\t\t\tif ( related && jQuery.contains( elem, related ) ) {\n\t\t\t\t\t\trelated = elem;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( !related || related !== elem ) {\n\t\t\t\t\telems.push({ elem: elem, handleObj: handleObj, level: close.level });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfor ( i = 0, l = elems.length; i < l; i++ ) {\n\t\tmatch = elems[i];\n\n\t\tif ( maxLevel && match.level > maxLevel ) {\n\t\t\tbreak;\n\t\t}\n\n\t\tevent.currentTarget = match.elem;\n\t\tevent.data = match.handleObj.data;\n\t\tevent.handleObj = match.handleObj;\n\n\t\tret = match.handleObj.origHandler.apply( match.elem, arguments );\n\n\t\tif ( ret === false || event.isPropagationStopped() ) {\n\t\t\tmaxLevel = match.level;\n\n\t\t\tif ( ret === false ) {\n\t\t\t\tstop = false;\n\t\t\t}\n\t\t\tif ( event.isImmediatePropagationStopped() ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn stop;\n}\n\nfunction liveConvert( type, selector ) {\n\treturn (type && type !== \"*\" ? type + \".\" : \"\") + selector.replace(rperiod, \"`\").replace(rspaces, \"&\");\n}\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\tif ( fn == null ) {\n\t\t\tfn = data;\n\t\t\tdata = null;\n\t\t}\n\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.bind( name, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n\n\tif ( jQuery.attrFn ) {\n\t\tjQuery.attrFn[ name ] = true;\n\t}\n});\n\n\n\n/*!\n * Sizzle CSS Selector Engine\n *  Copyright 2011, The Dojo Foundation\n *  Released under the MIT, BSD, and GPL Licenses.\n *  More information: http://sizzlejs.com/\n */\n(function(){\n\nvar chunker = /((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,\n\tdone = 0,\n\ttoString = Object.prototype.toString,\n\thasDuplicate = false,\n\tbaseHasDuplicate = true,\n\trBackslash = /\\\\/g,\n\trNonWord = /\\W/;\n\n// Here we check if the JavaScript engine is using some sort of\n// optimization where it does not always call our comparision\n// function. If that is the case, discard the hasDuplicate value.\n//   Thus far that includes Google Chrome.\n[0, 0].sort(function() {\n\tbaseHasDuplicate = false;\n\treturn 0;\n});\n\nvar Sizzle = function( selector, context, results, seed ) {\n\tresults = results || [];\n\tcontext = context || document;\n\n\tvar origContext = context;\n\n\tif ( context.nodeType !== 1 && context.nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\t\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tvar m, set, checkSet, extra, ret, cur, pop, i,\n\t\tprune = true,\n\t\tcontextXML = Sizzle.isXML( context ),\n\t\tparts = [],\n\t\tsoFar = selector;\n\t\n\t// Reset the position of the chunker regexp (start from head)\n\tdo {\n\t\tchunker.exec( \"\" );\n\t\tm = chunker.exec( soFar );\n\n\t\tif ( m ) {\n\t\t\tsoFar = m[3];\n\t\t\n\t\t\tparts.push( m[1] );\n\t\t\n\t\t\tif ( m[2] ) {\n\t\t\t\textra = m[3];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} while ( m );\n\n\tif ( parts.length > 1 && origPOS.exec( selector ) ) {\n\n\t\tif ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\n\t\t\tset = posProcess( parts[0] + parts[1], context );\n\n\t\t} else {\n\t\t\tset = Expr.relative[ parts[0] ] ?\n\t\t\t\t[ context ] :\n\t\t\t\tSizzle( parts.shift(), context );\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tselector = parts.shift();\n\n\t\t\t\tif ( Expr.relative[ selector ] ) {\n\t\t\t\t\tselector += parts.shift();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tset = posProcess( selector, set );\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t// (but not if it'll be faster if the inner selector is an ID)\n\t\tif ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\n\t\t\t\tExpr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\n\n\t\t\tret = Sizzle.find( parts.shift(), context, contextXML );\n\t\t\tcontext = ret.expr ?\n\t\t\t\tSizzle.filter( ret.expr, ret.set )[0] :\n\t\t\t\tret.set[0];\n\t\t}\n\n\t\tif ( context ) {\n\t\t\tret = seed ?\n\t\t\t\t{ expr: parts.pop(), set: makeArray(seed) } :\n\t\t\t\tSizzle.find( parts.pop(), parts.length === 1 && (parts[0] === \"~\" || parts[0] === \"+\") && context.parentNode ? context.parentNode : context, contextXML );\n\n\t\t\tset = ret.expr ?\n\t\t\t\tSizzle.filter( ret.expr, ret.set ) :\n\t\t\t\tret.set;\n\n\t\t\tif ( parts.length > 0 ) {\n\t\t\t\tcheckSet = makeArray( set );\n\n\t\t\t} else {\n\t\t\t\tprune = false;\n\t\t\t}\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tcur = parts.pop();\n\t\t\t\tpop = cur;\n\n\t\t\t\tif ( !Expr.relative[ cur ] ) {\n\t\t\t\t\tcur = \"\";\n\t\t\t\t} else {\n\t\t\t\t\tpop = parts.pop();\n\t\t\t\t}\n\n\t\t\t\tif ( pop == null ) {\n\t\t\t\t\tpop = context;\n\t\t\t\t}\n\n\t\t\t\tExpr.relative[ cur ]( checkSet, pop, contextXML );\n\t\t\t}\n\n\t\t} else {\n\t\t\tcheckSet = parts = [];\n\t\t}\n\t}\n\n\tif ( !checkSet ) {\n\t\tcheckSet = set;\n\t}\n\n\tif ( !checkSet ) {\n\t\tSizzle.error( cur || selector );\n\t}\n\n\tif ( toString.call(checkSet) === \"[object Array]\" ) {\n\t\tif ( !prune ) {\n\t\t\tresults.push.apply( results, checkSet );\n\n\t\t} else if ( context && context.nodeType === 1 ) {\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && checkSet[i].nodeType === 1 ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\tmakeArray( checkSet, results );\n\t}\n\n\tif ( extra ) {\n\t\tSizzle( extra, origContext, results, seed );\n\t\tSizzle.uniqueSort( results );\n\t}\n\n\treturn results;\n};\n\nSizzle.uniqueSort = function( results ) {\n\tif ( sortOrder ) {\n\t\thasDuplicate = baseHasDuplicate;\n\t\tresults.sort( sortOrder );\n\n\t\tif ( hasDuplicate ) {\n\t\t\tfor ( var i = 1; i < results.length; i++ ) {\n\t\t\t\tif ( results[i] === results[ i - 1 ] ) {\n\t\t\t\t\tresults.splice( i--, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n};\n\nSizzle.matches = function( expr, set ) {\n\treturn Sizzle( expr, null, null, set );\n};\n\nSizzle.matchesSelector = function( node, expr ) {\n\treturn Sizzle( expr, null, null, [node] ).length > 0;\n};\n\nSizzle.find = function( expr, context, isXML ) {\n\tvar set;\n\n\tif ( !expr ) {\n\t\treturn [];\n\t}\n\n\tfor ( var i = 0, l = Expr.order.length; i < l; i++ ) {\n\t\tvar match,\n\t\t\ttype = Expr.order[i];\n\t\t\n\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\n\t\t\tvar left = match[1];\n\t\t\tmatch.splice( 1, 1 );\n\n\t\t\tif ( left.substr( left.length - 1 ) !== \"\\\\\" ) {\n\t\t\t\tmatch[1] = (match[1] || \"\").replace( rBackslash, \"\" );\n\t\t\t\tset = Expr.find[ type ]( match, context, isXML );\n\n\t\t\t\tif ( set != null ) {\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !set ) {\n\t\tset = typeof context.getElementsByTagName !== \"undefined\" ?\n\t\t\tcontext.getElementsByTagName( \"*\" ) :\n\t\t\t[];\n\t}\n\n\treturn { set: set, expr: expr };\n};\n\nSizzle.filter = function( expr, set, inplace, not ) {\n\tvar match, anyFound,\n\t\told = expr,\n\t\tresult = [],\n\t\tcurLoop = set,\n\t\tisXMLFilter = set && set[0] && Sizzle.isXML( set[0] );\n\n\twhile ( expr && set.length ) {\n\t\tfor ( var type in Expr.filter ) {\n\t\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\n\t\t\t\tvar found, item,\n\t\t\t\t\tfilter = Expr.filter[ type ],\n\t\t\t\t\tleft = match[1];\n\n\t\t\t\tanyFound = false;\n\n\t\t\t\tmatch.splice(1,1);\n\n\t\t\t\tif ( left.substr( left.length - 1 ) === \"\\\\\" ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( curLoop === result ) {\n\t\t\t\t\tresult = [];\n\t\t\t\t}\n\n\t\t\t\tif ( Expr.preFilter[ type ] ) {\n\t\t\t\t\tmatch = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );\n\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\tanyFound = found = true;\n\n\t\t\t\t\t} else if ( match === true ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\tfor ( var i = 0; (item = curLoop[i]) != null; i++ ) {\n\t\t\t\t\t\tif ( item ) {\n\t\t\t\t\t\t\tfound = filter( item, match, i, curLoop );\n\t\t\t\t\t\t\tvar pass = not ^ !!found;\n\n\t\t\t\t\t\t\tif ( inplace && found != null ) {\n\t\t\t\t\t\t\t\tif ( pass ) {\n\t\t\t\t\t\t\t\t\tanyFound = true;\n\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else if ( pass ) {\n\t\t\t\t\t\t\t\tresult.push( item );\n\t\t\t\t\t\t\t\tanyFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( found !== undefined ) {\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tcurLoop = result;\n\t\t\t\t\t}\n\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\n\t\t\t\t\tif ( !anyFound ) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Improper expression\n\t\tif ( expr === old ) {\n\t\t\tif ( anyFound == null ) {\n\t\t\t\tSizzle.error( expr );\n\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\told = expr;\n\t}\n\n\treturn curLoop;\n};\n\nSizzle.error = function( msg ) {\n\tthrow \"Syntax error, unrecognized expression: \" + msg;\n};\n\nvar Expr = Sizzle.selectors = {\n\torder: [ \"ID\", \"NAME\", \"TAG\" ],\n\n\tmatch: {\n\t\tID: /#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n\t\tCLASS: /\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n\t\tNAME: /\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,\n\t\tATTR: /\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,\n\t\tTAG: /^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,\n\t\tCHILD: /:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,\n\t\tPOS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,\n\t\tPSEUDO: /:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/\n\t},\n\n\tleftMatch: {},\n\n\tattrMap: {\n\t\t\"class\": \"className\",\n\t\t\"for\": \"htmlFor\"\n\t},\n\n\tattrHandle: {\n\t\thref: function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\" );\n\t\t},\n\t\ttype: function( elem ) {\n\t\t\treturn elem.getAttribute( \"type\" );\n\t\t}\n\t},\n\n\trelative: {\n\t\t\"+\": function(checkSet, part){\n\t\t\tvar isPartStr = typeof part === \"string\",\n\t\t\t\tisTag = isPartStr && !rNonWord.test( part ),\n\t\t\t\tisPartStrNotTag = isPartStr && !isTag;\n\n\t\t\tif ( isTag ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\n\t\t\t\tif ( (elem = checkSet[i]) ) {\n\t\t\t\t\twhile ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\n\n\t\t\t\t\tcheckSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\n\t\t\t\t\t\telem || false :\n\t\t\t\t\t\telem === part;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( isPartStrNotTag ) {\n\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t}\n\t\t},\n\n\t\t\">\": function( checkSet, part ) {\n\t\t\tvar elem,\n\t\t\t\tisPartStr = typeof part === \"string\",\n\t\t\t\ti = 0,\n\t\t\t\tl = checkSet.length;\n\n\t\t\tif ( isPartStr && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\telem = checkSet[i];\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tvar parent = elem.parentNode;\n\t\t\t\t\t\tcheckSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\telem = checkSet[i];\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tcheckSet[i] = isPartStr ?\n\t\t\t\t\t\t\telem.parentNode :\n\t\t\t\t\t\t\telem.parentNode === part;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( isPartStr ) {\n\t\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t\"\": function(checkSet, part, isXML){\n\t\t\tvar nodeCheck,\n\t\t\t\tdoneName = done++,\n\t\t\t\tcheckFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t\tnodeCheck = part;\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn( \"parentNode\", part, doneName, checkSet, nodeCheck, isXML );\n\t\t},\n\n\t\t\"~\": function( checkSet, part, isXML ) {\n\t\t\tvar nodeCheck,\n\t\t\t\tdoneName = done++,\n\t\t\t\tcheckFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t\tnodeCheck = part;\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn( \"previousSibling\", part, doneName, checkSet, nodeCheck, isXML );\n\t\t}\n\t},\n\n\tfind: {\n\t\tID: function( match, context, isXML ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t},\n\n\t\tNAME: function( match, context ) {\n\t\t\tif ( typeof context.getElementsByName !== \"undefined\" ) {\n\t\t\t\tvar ret = [],\n\t\t\t\t\tresults = context.getElementsByName( match[1] );\n\n\t\t\t\tfor ( var i = 0, l = results.length; i < l; i++ ) {\n\t\t\t\t\tif ( results[i].getAttribute(\"name\") === match[1] ) {\n\t\t\t\t\t\tret.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn ret.length === 0 ? null : ret;\n\t\t\t}\n\t\t},\n\n\t\tTAG: function( match, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( match[1] );\n\t\t\t}\n\t\t}\n\t},\n\tpreFilter: {\n\t\tCLASS: function( match, curLoop, inplace, result, not, isXML ) {\n\t\t\tmatch = \" \" + match[1].replace( rBackslash, \"\" ) + \" \";\n\n\t\t\tif ( isXML ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\tfor ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\n\t\t\t\tif ( elem ) {\n\t\t\t\t\tif ( not ^ (elem.className && (\" \" + elem.className + \" \").replace(/[\\t\\n\\r]/g, \" \").indexOf(match) >= 0) ) {\n\t\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\t\tresult.push( elem );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( inplace ) {\n\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\tID: function( match ) {\n\t\t\treturn match[1].replace( rBackslash, \"\" );\n\t\t},\n\n\t\tTAG: function( match, curLoop ) {\n\t\t\treturn match[1].replace( rBackslash, \"\" ).toLowerCase();\n\t\t},\n\n\t\tCHILD: function( match ) {\n\t\t\tif ( match[1] === \"nth\" ) {\n\t\t\t\tif ( !match[2] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\tmatch[2] = match[2].replace(/^\\+|\\s*/g, '');\n\n\t\t\t\t// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\n\t\t\t\tvar test = /(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(\n\t\t\t\t\tmatch[2] === \"even\" && \"2n\" || match[2] === \"odd\" && \"2n+1\" ||\n\t\t\t\t\t!/\\D/.test( match[2] ) && \"0n+\" + match[2] || match[2]);\n\n\t\t\t\t// calculate the numbers (first)n+(last) including if they are negative\n\t\t\t\tmatch[2] = (test[1] + (test[2] || 1)) - 0;\n\t\t\t\tmatch[3] = test[3] - 0;\n\t\t\t}\n\t\t\telse if ( match[2] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\t// TODO: Move to normal caching system\n\t\t\tmatch[0] = done++;\n\n\t\t\treturn match;\n\t\t},\n\n\t\tATTR: function( match, curLoop, inplace, result, not, isXML ) {\n\t\t\tvar name = match[1] = match[1].replace( rBackslash, \"\" );\n\t\t\t\n\t\t\tif ( !isXML && Expr.attrMap[name] ) {\n\t\t\t\tmatch[1] = Expr.attrMap[name];\n\t\t\t}\n\n\t\t\t// Handle if an un-quoted value was used\n\t\t\tmatch[4] = ( match[4] || match[5] || \"\" ).replace( rBackslash, \"\" );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[4] = \" \" + match[4] + \" \";\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match, curLoop, inplace, result, not ) {\n\t\t\tif ( match[1] === \"not\" ) {\n\t\t\t\t// If we're dealing with a complex expression, or a simple one\n\t\t\t\tif ( ( chunker.exec(match[3]) || \"\" ).length > 1 || /^\\w/.test(match[3]) ) {\n\t\t\t\t\tmatch[3] = Sizzle(match[3], null, null, curLoop);\n\n\t\t\t\t} else {\n\t\t\t\t\tvar ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\n\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tresult.push.apply( result, ret );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\treturn match;\n\t\t},\n\n\t\tPOS: function( match ) {\n\t\t\tmatch.unshift( true );\n\n\t\t\treturn match;\n\t\t}\n\t},\n\t\n\tfilters: {\n\t\tenabled: function( elem ) {\n\t\t\treturn elem.disabled === false && elem.type !== \"hidden\";\n\t\t},\n\n\t\tdisabled: function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\tchecked: function( elem ) {\n\t\t\treturn elem.checked === true;\n\t\t},\n\t\t\n\t\tselected: function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\t\t\t\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !!elem.firstChild;\n\t\t},\n\n\t\tempty: function( elem ) {\n\t\t\treturn !elem.firstChild;\n\t\t},\n\n\t\thas: function( elem, i, match ) {\n\t\t\treturn !!Sizzle( match[3], elem ).length;\n\t\t},\n\n\t\theader: function( elem ) {\n\t\t\treturn (/h\\d/i).test( elem.nodeName );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr = elem.getAttribute( \"type\" ), type = elem.type;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) \n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"text\" === type && ( attr === type || attr === null );\n\t\t},\n\n\t\tradio: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"radio\" === elem.type;\n\t\t},\n\n\t\tcheckbox: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"checkbox\" === elem.type;\n\t\t},\n\n\t\tfile: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"file\" === elem.type;\n\t\t},\n\n\t\tpassword: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"password\" === elem.type;\n\t\t},\n\n\t\tsubmit: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && \"submit\" === elem.type;\n\t\t},\n\n\t\timage: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"image\" === elem.type;\n\t\t},\n\n\t\treset: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && \"reset\" === elem.type;\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && \"button\" === elem.type || name === \"button\";\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn (/input|select|textarea|button/i).test( elem.nodeName );\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === elem.ownerDocument.activeElement;\n\t\t}\n\t},\n\tsetFilters: {\n\t\tfirst: function( elem, i ) {\n\t\t\treturn i === 0;\n\t\t},\n\n\t\tlast: function( elem, i, match, array ) {\n\t\t\treturn i === array.length - 1;\n\t\t},\n\n\t\teven: function( elem, i ) {\n\t\t\treturn i % 2 === 0;\n\t\t},\n\n\t\todd: function( elem, i ) {\n\t\t\treturn i % 2 === 1;\n\t\t},\n\n\t\tlt: function( elem, i, match ) {\n\t\t\treturn i < match[3] - 0;\n\t\t},\n\n\t\tgt: function( elem, i, match ) {\n\t\t\treturn i > match[3] - 0;\n\t\t},\n\n\t\tnth: function( elem, i, match ) {\n\t\t\treturn match[3] - 0 === i;\n\t\t},\n\n\t\teq: function( elem, i, match ) {\n\t\t\treturn match[3] - 0 === i;\n\t\t}\n\t},\n\tfilter: {\n\t\tPSEUDO: function( elem, match, i, array ) {\n\t\t\tvar name = match[1],\n\t\t\t\tfilter = Expr.filters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\n\t\t\t} else if ( name === \"contains\" ) {\n\t\t\t\treturn (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || \"\").indexOf(match[3]) >= 0;\n\n\t\t\t} else if ( name === \"not\" ) {\n\t\t\t\tvar not = match[3];\n\n\t\t\t\tfor ( var j = 0, l = not.length; j < l; j++ ) {\n\t\t\t\t\tif ( not[j] === elem ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\t\t\t\tSizzle.error( name );\n\t\t\t}\n\t\t},\n\n\t\tCHILD: function( elem, match ) {\n\t\t\tvar type = match[1],\n\t\t\t\tnode = elem;\n\n\t\t\tswitch ( type ) {\n\t\t\t\tcase \"only\":\n\t\t\t\tcase \"first\":\n\t\t\t\t\twhile ( (node = node.previousSibling) )\t {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) { \n\t\t\t\t\t\t\treturn false; \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( type === \"first\" ) { \n\t\t\t\t\t\treturn true; \n\t\t\t\t\t}\n\n\t\t\t\t\tnode = elem;\n\n\t\t\t\tcase \"last\":\n\t\t\t\t\twhile ( (node = node.nextSibling) )\t {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) { \n\t\t\t\t\t\t\treturn false; \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\tcase \"nth\":\n\t\t\t\t\tvar first = match[2],\n\t\t\t\t\t\tlast = match[3];\n\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar doneName = match[0],\n\t\t\t\t\t\tparent = elem.parentNode;\n\t\n\t\t\t\t\tif ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {\n\t\t\t\t\t\tvar count = 0;\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\tnode.nodeIndex = ++count;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} \n\n\t\t\t\t\t\tparent.sizcache = doneName;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar diff = elem.nodeIndex - last;\n\n\t\t\t\t\tif ( first === 0 ) {\n\t\t\t\t\t\treturn diff === 0;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tID: function( elem, match ) {\n\t\t\treturn elem.nodeType === 1 && elem.getAttribute(\"id\") === match;\n\t\t},\n\n\t\tTAG: function( elem, match ) {\n\t\t\treturn (match === \"*\" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;\n\t\t},\n\t\t\n\t\tCLASS: function( elem, match ) {\n\t\t\treturn (\" \" + (elem.className || elem.getAttribute(\"class\")) + \" \")\n\t\t\t\t.indexOf( match ) > -1;\n\t\t},\n\n\t\tATTR: function( elem, match ) {\n\t\t\tvar name = match[1],\n\t\t\t\tresult = Expr.attrHandle[ name ] ?\n\t\t\t\t\tExpr.attrHandle[ name ]( elem ) :\n\t\t\t\t\telem[ name ] != null ?\n\t\t\t\t\t\telem[ name ] :\n\t\t\t\t\t\telem.getAttribute( name ),\n\t\t\t\tvalue = result + \"\",\n\t\t\t\ttype = match[2],\n\t\t\t\tcheck = match[4];\n\n\t\t\treturn result == null ?\n\t\t\t\ttype === \"!=\" :\n\t\t\t\ttype === \"=\" ?\n\t\t\t\tvalue === check :\n\t\t\t\ttype === \"*=\" ?\n\t\t\t\tvalue.indexOf(check) >= 0 :\n\t\t\t\ttype === \"~=\" ?\n\t\t\t\t(\" \" + value + \" \").indexOf(check) >= 0 :\n\t\t\t\t!check ?\n\t\t\t\tvalue && result !== false :\n\t\t\t\ttype === \"!=\" ?\n\t\t\t\tvalue !== check :\n\t\t\t\ttype === \"^=\" ?\n\t\t\t\tvalue.indexOf(check) === 0 :\n\t\t\t\ttype === \"$=\" ?\n\t\t\t\tvalue.substr(value.length - check.length) === check :\n\t\t\t\ttype === \"|=\" ?\n\t\t\t\tvalue === check || value.substr(0, check.length + 1) === check + \"-\" :\n\t\t\t\tfalse;\n\t\t},\n\n\t\tPOS: function( elem, match, i, array ) {\n\t\t\tvar name = match[2],\n\t\t\t\tfilter = Expr.setFilters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar origPOS = Expr.match.POS,\n\tfescape = function(all, num){\n\t\treturn \"\\\\\" + (num - 0 + 1);\n\t};\n\nfor ( var type in Expr.match ) {\n\tExpr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\\[]*\\])(?![^\\(]*\\))/.source) );\n\tExpr.leftMatch[ type ] = new RegExp( /(^(?:.|\\r|\\n)*?)/.source + Expr.match[ type ].source.replace(/\\\\(\\d+)/g, fescape) );\n}\n\nvar makeArray = function( array, results ) {\n\tarray = Array.prototype.slice.call( array, 0 );\n\n\tif ( results ) {\n\t\tresults.push.apply( results, array );\n\t\treturn results;\n\t}\n\t\n\treturn array;\n};\n\n// Perform a simple check to determine if the browser is capable of\n// converting a NodeList to an array using builtin methods.\n// Also verifies that the returned array holds DOM nodes\n// (which is not the case in the Blackberry browser)\ntry {\n\tArray.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\n\n// Provide a fallback method if it does not work\n} catch( e ) {\n\tmakeArray = function( array, results ) {\n\t\tvar i = 0,\n\t\t\tret = results || [];\n\n\t\tif ( toString.call(array) === \"[object Array]\" ) {\n\t\t\tArray.prototype.push.apply( ret, array );\n\n\t\t} else {\n\t\t\tif ( typeof array.length === \"number\" ) {\n\t\t\t\tfor ( var l = array.length; i < l; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tfor ( ; array[i]; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nvar sortOrder, siblingCheck;\n\nif ( document.documentElement.compareDocumentPosition ) {\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\n\t\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t\t}\n\n\t\treturn a.compareDocumentPosition(b) & 4 ? -1 : 1;\n\t};\n\n} else {\n\tsortOrder = function( a, b ) {\n\t\t// The nodes are identical, we can exit early\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\n\t\t\treturn a.sourceIndex - b.sourceIndex;\n\t\t}\n\n\t\tvar al, bl,\n\t\t\tap = [],\n\t\t\tbp = [],\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tcur = aup;\n\n\t\t// If the nodes are siblings (or identical) we can do a quick check\n\t\tif ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\n\t\t// If no parents were found then the nodes are disconnected\n\t\t} else if ( !aup ) {\n\t\t\treturn -1;\n\n\t\t} else if ( !bup ) {\n\t\t\treturn 1;\n\t\t}\n\n\t\t// Otherwise they're somewhere else in the tree so we need\n\t\t// to build up a full list of the parentNodes for comparison\n\t\twhile ( cur ) {\n\t\t\tap.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tcur = bup;\n\n\t\twhile ( cur ) {\n\t\t\tbp.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tal = ap.length;\n\t\tbl = bp.length;\n\n\t\t// Start walking down the tree looking for a discrepancy\n\t\tfor ( var i = 0; i < al && i < bl; i++ ) {\n\t\t\tif ( ap[i] !== bp[i] ) {\n\t\t\t\treturn siblingCheck( ap[i], bp[i] );\n\t\t\t}\n\t\t}\n\n\t\t// We ended someplace up the tree so do a sibling check\n\t\treturn i === al ?\n\t\t\tsiblingCheck( a, bp[i], -1 ) :\n\t\t\tsiblingCheck( ap[i], b, 1 );\n\t};\n\n\tsiblingCheck = function( a, b, ret ) {\n\t\tif ( a === b ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tvar cur = a.nextSibling;\n\n\t\twhile ( cur ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tcur = cur.nextSibling;\n\t\t}\n\n\t\treturn 1;\n\t};\n}\n\n// Utility function for retreiving the text value of an array of DOM nodes\nSizzle.getText = function( elems ) {\n\tvar ret = \"\", elem;\n\n\tfor ( var i = 0; elems[i]; i++ ) {\n\t\telem = elems[i];\n\n\t\t// Get the text from text nodes and CDATA nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\tret += elem.nodeValue;\n\n\t\t// Traverse everything else, except comment nodes\n\t\t} else if ( elem.nodeType !== 8 ) {\n\t\t\tret += Sizzle.getText( elem.childNodes );\n\t\t}\n\t}\n\n\treturn ret;\n};\n\n// Check to see if the browser returns elements by name when\n// querying by getElementById (and provide a workaround)\n(function(){\n\t// We're going to inject a fake input element with a specified name\n\tvar form = document.createElement(\"div\"),\n\t\tid = \"script\" + (new Date()).getTime(),\n\t\troot = document.documentElement;\n\n\tform.innerHTML = \"<a name='\" + id + \"'/>\";\n\n\t// Inject it into the root element, check its status, and remove it quickly\n\troot.insertBefore( form, root.firstChild );\n\n\t// The workaround has to do additional checks after a getElementById\n\t// Which slows things down for other browsers (hence the branching)\n\tif ( document.getElementById( id ) ) {\n\t\tExpr.find.ID = function( match, context, isXML ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === match[1] || typeof m.getAttributeNode !== \"undefined\" && m.getAttributeNode(\"id\").nodeValue === match[1] ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\n\t\tExpr.filter.ID = function( elem, match ) {\n\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\n\t\t\treturn elem.nodeType === 1 && node && node.nodeValue === match;\n\t\t};\n\t}\n\n\troot.removeChild( form );\n\n\t// release memory in IE\n\troot = form = null;\n})();\n\n(function(){\n\t// Check to see if the browser returns only elements\n\t// when doing getElementsByTagName(\"*\")\n\n\t// Create a fake element\n\tvar div = document.createElement(\"div\");\n\tdiv.appendChild( document.createComment(\"\") );\n\n\t// Make sure no comments are found\n\tif ( div.getElementsByTagName(\"*\").length > 0 ) {\n\t\tExpr.find.TAG = function( match, context ) {\n\t\t\tvar results = context.getElementsByTagName( match[1] );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( match[1] === \"*\" ) {\n\t\t\t\tvar tmp = [];\n\n\t\t\t\tfor ( var i = 0; results[i]; i++ ) {\n\t\t\t\t\tif ( results[i].nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresults = tmp;\n\t\t\t}\n\n\t\t\treturn results;\n\t\t};\n\t}\n\n\t// Check to see if an attribute returns normalized href attributes\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\n\tif ( div.firstChild && typeof div.firstChild.getAttribute !== \"undefined\" &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") !== \"#\" ) {\n\n\t\tExpr.attrHandle.href = function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t};\n\t}\n\n\t// release memory in IE\n\tdiv = null;\n})();\n\nif ( document.querySelectorAll ) {\n\t(function(){\n\t\tvar oldSizzle = Sizzle,\n\t\t\tdiv = document.createElement(\"div\"),\n\t\t\tid = \"__sizzle__\";\n\n\t\tdiv.innerHTML = \"<p class='TEST'></p>\";\n\n\t\t// Safari can't handle uppercase or unicode characters when\n\t\t// in quirks mode.\n\t\tif ( div.querySelectorAll && div.querySelectorAll(\".TEST\").length === 0 ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tSizzle = function( query, context, extra, seed ) {\n\t\t\tcontext = context || document;\n\n\t\t\t// Only use querySelectorAll on non-XML documents\n\t\t\t// (ID selectors don't work in non-HTML documents)\n\t\t\tif ( !seed && !Sizzle.isXML(context) ) {\n\t\t\t\t// See if we find a selector to speed up\n\t\t\t\tvar match = /^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec( query );\n\t\t\t\t\n\t\t\t\tif ( match && (context.nodeType === 1 || context.nodeType === 9) ) {\n\t\t\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t\t\tif ( match[1] ) {\n\t\t\t\t\t\treturn makeArray( context.getElementsByTagName( query ), extra );\n\t\t\t\t\t\n\t\t\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t\t\t} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {\n\t\t\t\t\t\treturn makeArray( context.getElementsByClassName( match[2] ), extra );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( context.nodeType === 9 ) {\n\t\t\t\t\t// Speed-up: Sizzle(\"body\")\n\t\t\t\t\t// The body element only exists once, optimize finding it\n\t\t\t\t\tif ( query === \"body\" && context.body ) {\n\t\t\t\t\t\treturn makeArray( [ context.body ], extra );\n\t\t\t\t\t\t\n\t\t\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\t\t\t} else if ( match && match[3] ) {\n\t\t\t\t\t\tvar elem = context.getElementById( match[3] );\n\n\t\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === match[3] ) {\n\t\t\t\t\t\t\t\treturn makeArray( [ elem ], extra );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn makeArray( [], extra );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn makeArray( context.querySelectorAll(query), extra );\n\t\t\t\t\t} catch(qsaError) {}\n\n\t\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t\t// IE 8 doesn't work on object elements\n\t\t\t\t} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\t\tvar oldContext = context,\n\t\t\t\t\t\told = context.getAttribute( \"id\" ),\n\t\t\t\t\t\tnid = old || id,\n\t\t\t\t\t\thasParent = context.parentNode,\n\t\t\t\t\t\trelativeHierarchySelector = /^\\s*[+~]/.test( query );\n\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnid = nid.replace( /'/g, \"\\\\$&\" );\n\t\t\t\t\t}\n\t\t\t\t\tif ( relativeHierarchySelector && hasParent ) {\n\t\t\t\t\t\tcontext = context.parentNode;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif ( !relativeHierarchySelector || hasParent ) {\n\t\t\t\t\t\t\treturn makeArray( context.querySelectorAll( \"[id='\" + nid + \"'] \" + query ), extra );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} catch(pseudoError) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\t\toldContext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\treturn oldSizzle(query, context, extra, seed);\n\t\t};\n\n\t\tfor ( var prop in oldSizzle ) {\n\t\t\tSizzle[ prop ] = oldSizzle[ prop ];\n\t\t}\n\n\t\t// release memory in IE\n\t\tdiv = null;\n\t})();\n}\n\n(function(){\n\tvar html = document.documentElement,\n\t\tmatches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;\n\n\tif ( matches ) {\n\t\t// Check to see if it's possible to do matchesSelector\n\t\t// on a disconnected node (IE 9 fails this)\n\t\tvar disconnectedMatch = !matches.call( document.createElement( \"div\" ), \"div\" ),\n\t\t\tpseudoWorks = false;\n\n\t\ttry {\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( document.documentElement, \"[test!='']:sizzle\" );\n\t\n\t\t} catch( pseudoError ) {\n\t\t\tpseudoWorks = true;\n\t\t}\n\n\t\tSizzle.matchesSelector = function( node, expr ) {\n\t\t\t// Make sure that attribute selectors are quoted\n\t\t\texpr = expr.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g, \"='$1']\");\n\n\t\t\tif ( !Sizzle.isXML( node ) ) {\n\t\t\t\ttry { \n\t\t\t\t\tif ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {\n\t\t\t\t\t\tvar ret = matches.call( node, expr );\n\n\t\t\t\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\t\t\t\tif ( ret || !disconnectedMatch ||\n\t\t\t\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t\t\t\t// fragment in IE 9, so check for that\n\t\t\t\t\t\t\t\tnode.document && node.document.nodeType !== 11 ) {\n\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\treturn Sizzle(expr, null, null, [node]).length > 0;\n\t\t};\n\t}\n})();\n\n(function(){\n\tvar div = document.createElement(\"div\");\n\n\tdiv.innerHTML = \"<div class='test e'></div><div class='test'></div>\";\n\n\t// Opera can't find a second classname (in 9.6)\n\t// Also, make sure that getElementsByClassName actually exists\n\tif ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\n\t\treturn;\n\t}\n\n\t// Safari caches class attributes, doesn't catch changes (in 3.2)\n\tdiv.lastChild.className = \"e\";\n\n\tif ( div.getElementsByClassName(\"e\").length === 1 ) {\n\t\treturn;\n\t}\n\t\n\tExpr.order.splice(1, 0, \"CLASS\");\n\tExpr.find.CLASS = function( match, context, isXML ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && !isXML ) {\n\t\t\treturn context.getElementsByClassName(match[1]);\n\t\t}\n\t};\n\n\t// release memory in IE\n\tdiv = null;\n})();\n\nfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\n\t\tif ( elem ) {\n\t\t\tvar match = false;\n\n\t\t\telem = elem[dir];\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem.sizcache === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 && !isXML ){\n\t\t\t\t\telem.sizcache = doneName;\n\t\t\t\t\telem.sizset = i;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeName.toLowerCase() === cur ) {\n\t\t\t\t\tmatch = elem;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\n\t\tif ( elem ) {\n\t\t\tvar match = false;\n\t\t\t\n\t\t\telem = elem[dir];\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem.sizcache === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !isXML ) {\n\t\t\t\t\t\telem.sizcache = doneName;\n\t\t\t\t\t\telem.sizset = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof cur !== \"string\" ) {\n\t\t\t\t\t\tif ( elem === cur ) {\n\t\t\t\t\t\t\tmatch = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {\n\t\t\t\t\t\tmatch = elem;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nif ( document.documentElement.contains ) {\n\tSizzle.contains = function( a, b ) {\n\t\treturn a !== b && (a.contains ? a.contains(b) : true);\n\t};\n\n} else if ( document.documentElement.compareDocumentPosition ) {\n\tSizzle.contains = function( a, b ) {\n\t\treturn !!(a.compareDocumentPosition(b) & 16);\n\t};\n\n} else {\n\tSizzle.contains = function() {\n\t\treturn false;\n\t};\n}\n\nSizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833) \n\tvar documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\n\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\nvar posProcess = function( selector, context ) {\n\tvar match,\n\t\ttmpSet = [],\n\t\tlater = \"\",\n\t\troot = context.nodeType ? [context] : context;\n\n\t// Position selectors must be done after the filter\n\t// And so must :not(positional) so we move all PSEUDOs to the end\n\twhile ( (match = Expr.match.PSEUDO.exec( selector )) ) {\n\t\tlater += match[0];\n\t\tselector = selector.replace( Expr.match.PSEUDO, \"\" );\n\t}\n\n\tselector = Expr.relative[selector] ? selector + \"*\" : selector;\n\n\tfor ( var i = 0, l = root.length; i < l; i++ ) {\n\t\tSizzle( selector, root[i], tmpSet );\n\t}\n\n\treturn Sizzle.filter( later, tmpSet );\n};\n\n// EXPOSE\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.filters;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})();\n\n\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prevUntil|prevAll)/,\n\t// Note: This RegExp should be improved, or likely pulled from Sizzle\n\trmultiselector = /,/,\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\tslice = Array.prototype.slice,\n\tPOS = jQuery.expr.match.POS,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar self = this,\n\t\t\ti, l;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0, l = self.length; i < l; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tvar ret = this.pushStack( \"\", \"find\", selector ),\n\t\t\tlength, n, r;\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tlength = ret.length;\n\t\t\tjQuery.find( selector, this[i], ret );\n\n\t\t\tif ( i > 0 ) {\n\t\t\t\t// Make sure that the results are unique\n\t\t\t\tfor ( n = length; n < ret.length; n++ ) {\n\t\t\t\t\tfor ( r = 0; r < length; r++ ) {\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\n\t\t\t\t\t\t\tret.splice(n--, 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar targets = jQuery( target );\n\t\treturn this.filter(function() {\n\t\t\tfor ( var i = 0, l = targets.length; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!selector && ( typeof selector === \"string\" ?\n\t\t\tjQuery.filter( selector, this ).length > 0 :\n\t\t\tthis.filter( selector ).length > 0 );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar ret = [], i, l, cur = this[0];\n\t\t\n\t\t// Array\n\t\tif ( jQuery.isArray( selectors ) ) {\n\t\t\tvar match, selector,\n\t\t\t\tmatches = {},\n\t\t\t\tlevel = 1;\n\n\t\t\tif ( cur && selectors.length ) {\n\t\t\t\tfor ( i = 0, l = selectors.length; i < l; i++ ) {\n\t\t\t\t\tselector = selectors[i];\n\n\t\t\t\t\tif ( !matches[ selector ] ) {\n\t\t\t\t\t\tmatches[ selector ] = POS.test( selector ) ?\n\t\t\t\t\t\t\tjQuery( selector, context || this.context ) :\n\t\t\t\t\t\t\tselector;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\twhile ( cur && cur.ownerDocument && cur !== context ) {\n\t\t\t\t\tfor ( selector in matches ) {\n\t\t\t\t\t\tmatch = matches[ selector ];\n\n\t\t\t\t\t\tif ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {\n\t\t\t\t\t\t\tret.push({ selector: selector, elem: cur, level: level });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcur = cur.parentNode;\n\t\t\t\t\tlevel++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\t// String\n\t\tvar pos = POS.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tcur = this[i];\n\n\t\t\twhile ( cur ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\t\t\t\t\tret.push( cur );\n\t\t\t\t\tbreak;\n\n\t\t\t\t} else {\n\t\t\t\t\tcur = cur.parentNode;\n\t\t\t\t\tif ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tret = ret.length > 1 ? jQuery.unique( ret ) : ret;\n\n\t\treturn this.pushStack( ret, \"closest\", selectors );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\t\tif ( !elem || typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0],\n\t\t\t\t// If it receives a string, the selector is used\n\t\t\t\t// If it receives nothing, the siblings are used\n\t\t\t\telem ? jQuery( elem ) : this.parent().children() );\n\t\t}\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\n\t\t\tall :\n\t\t\tjQuery.unique( all ) );\n\t},\n\n\tandSelf: function() {\n\t\treturn this.add( this.prevObject );\n\t}\n});\n\n// A painfully simple check to see if an element is disconnected\n// from a document (should be improved, where feasible).\nfunction isDisconnected( node ) {\n\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( elem.parentNode.firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.makeArray( elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until ),\n\t\t\t// The variable 'args' was introduced in\n\t\t\t// https://github.com/jquery/jquery/commit/52a0238\n\t\t\t// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.\n\t\t\t// http://code.google.com/p/v8/issues/detail?id=1050\n\t\t\targs = slice.call(arguments);\n\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n\t\tif ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret, name, args.join(\",\") );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 ?\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\t\t\tjQuery.find.matches(expr, elems);\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tnth: function( cur, result, dir, elem ) {\n\t\tresult = result || 1;\n\t\tvar num = 0;\n\n\t\tfor ( ; cur; cur = cur[dir] ) {\n\t\t\tif ( cur.nodeType === 1 && ++num === result ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cur;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n\t// Can't pass null or undefined to indexOf in Firefox 4\n\t// Set to 0 to skip string check\n\tqualifier = qualifier || 0;\n\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\t\t\treturn retVal === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\treturn (elem === qualifier) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem, i ) {\n\t\treturn (jQuery.inArray( elem, qualifier ) >= 0) === keep;\n\t});\n}\n\n\n\n\nvar rinlinejQuery = / jQuery\\d+=\"(?:\\d+|null)\"/g,\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnocache = /<(?:script|object|embed|option|style)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /\\/(java|ecma)script/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// IE can't serialize <link> and <script> tags normally\nif ( !jQuery.support.htmlSerialize ) {\n\twrapMap._default = [ 1, \"div<div>\", \"</div>\" ];\n}\n\njQuery.fn.extend({\n\ttext: function( text ) {\n\t\tif ( jQuery.isFunction(text) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.text( text.call(this, i, self.text()) );\n\t\t\t});\n\t\t}\n\n\t\tif ( typeof text !== \"object\" && text !== undefined ) {\n\t\t\treturn this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );\n\t\t}\n\n\t\treturn jQuery.text( this );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery( this ).wrapAll( html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = jQuery(arguments[0]);\n\t\t\tset.push.apply( set, this.toArray() );\n\t\t\treturn this.pushStack( set, \"before\", arguments );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = this.pushStack( this, \"after\", arguments );\n\t\t\tset.push.apply( set, jQuery(arguments[0]).toArray() );\n\t\t\treturn set;\n\t\t}\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\tif ( value === undefined ) {\n\t\t\treturn this[0] && this[0].nodeType === 1 ?\n\t\t\t\tthis[0].innerHTML.replace(rinlinejQuery, \"\") :\n\t\t\t\tnull;\n\n\t\t// See if we can take a shortcut and just use innerHTML\n\t\t} else if ( typeof value === \"string\" && !rnocache.test( value ) &&\n\t\t\t(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&\n\t\t\t!wrapMap[ (rtagName.exec( value ) || [\"\", \"\"])[1].toLowerCase() ] ) {\n\n\t\t\tvalue = value.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\ttry {\n\t\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\tif ( this[i].nodeType === 1 ) {\n\t\t\t\t\t\tjQuery.cleanData( this[i].getElementsByTagName(\"*\") );\n\t\t\t\t\t\tthis[i].innerHTML = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t} catch(e) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\n\t\t} else if ( jQuery.isFunction( value ) ) {\n\t\t\tthis.each(function(i){\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.html( value.call(this, i, self.html()) );\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.empty().append( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\treplaceWith: function( value ) {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t\t// this can help fix replacing a parent with child elements\n\t\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\t\treturn this.each(function(i) {\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( typeof value !== \"string\" ) {\n\t\t\t\tvalue = jQuery( value ).detach();\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\tvar next = this.nextSibling,\n\t\t\t\t\tparent = this.parentNode;\n\n\t\t\t\tjQuery( this ).remove();\n\n\t\t\t\tif ( next ) {\n\t\t\t\t\tjQuery(next).before( value );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(parent).append( value );\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn this.length ?\n\t\t\t\tthis.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\n\t\t\t\tthis;\n\t\t}\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\t\tvar results, first, fragment, parent,\n\t\t\tvalue = args[0],\n\t\t\tscripts = [];\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === \"string\" && rchecked.test( value ) ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery(this).domManip( args, table, callback, true );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\targs[0] = value.call(this, i, table ? self.html() : undefined);\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\tparent = value && value.parentNode;\n\n\t\t\t// If we're in a fragment, just use that instead of building a new one\n\t\t\tif ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {\n\t\t\t\tresults = { fragment: parent };\n\n\t\t\t} else {\n\t\t\t\tresults = jQuery.buildFragment( args, this, scripts );\n\t\t\t}\n\n\t\t\tfragment = results.fragment;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfirst = fragment = fragment.firstChild;\n\t\t\t} else {\n\t\t\t\tfirst = fragment.firstChild;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\n\t\t\t\tfor ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable ?\n\t\t\t\t\t\t\troot(this[i], first) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\t// Make sure that we do not leak memory by inadvertently discarding\n\t\t\t\t\t\t// the original fragment (which might have attached data) instead of\n\t\t\t\t\t\t// using it; in addition, use the original fragment object for the last\n\t\t\t\t\t\t// item instead of first because it can end up being emptied incorrectly\n\t\t\t\t\t\t// in certain situations (Bug #8070).\n\t\t\t\t\t\t// Fragments from the fragment cache must always be cloned and never used\n\t\t\t\t\t\t// in place.\n\t\t\t\t\t\tresults.cacheable || (l > 1 && i < lastIndex) ?\n\t\t\t\t\t\t\tjQuery.clone( fragment, true, true ) :\n\t\t\t\t\t\t\tfragment\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( scripts.length ) {\n\t\t\t\tjQuery.each( scripts, evalScript );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nfunction root( elem, cur ) {\n\treturn jQuery.nodeName(elem, \"table\") ?\n\t\t(elem.getElementsByTagName(\"tbody\")[0] ||\n\t\telem.appendChild(elem.ownerDocument.createElement(\"tbody\"))) :\n\t\telem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar internalKey = jQuery.expando,\n\t\toldData = jQuery.data( src ),\n\t\tcurData = jQuery.data( dest, oldData );\n\n\t// Switch to use the internal data object, if it exists, for the next\n\t// stage of data copying\n\tif ( (oldData = oldData[ internalKey ]) ) {\n\t\tvar events = oldData.events;\n\t\t\t\tcurData = curData[ internalKey ] = jQuery.extend({}, oldData);\n\n\t\tif ( events ) {\n\t\t\tdelete curData.handle;\n\t\t\tcurData.events = {};\n\n\t\t\tfor ( var type in events ) {\n\t\t\t\tfor ( var i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? \".\" : \"\" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction cloneFixAttributes( src, dest ) {\n\tvar nodeName;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// clearAttributes removes the attributes, which we don't want,\n\t// but also removes the attachEvent events, which we *do* want\n\tif ( dest.clearAttributes ) {\n\t\tdest.clearAttributes();\n\t}\n\n\t// mergeAttributes, in contrast, only merges back on the\n\t// original attributes, not the events\n\tif ( dest.mergeAttributes ) {\n\t\tdest.mergeAttributes( src );\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 fail to clone children inside object elements that use\n\t// the proprietary classid attribute value (rather than the type\n\t// attribute) to identify the type of content to display\n\tif ( nodeName === \"object\" ) {\n\t\tdest.outerHTML = src.outerHTML;\n\n\t} else if ( nodeName === \"input\" && (src.type === \"checkbox\" || src.type === \"radio\") ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\t\tif ( src.checked ) {\n\t\t\tdest.defaultChecked = dest.checked = src.checked;\n\t\t}\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n\n\t// Event data gets referenced instead of copied if the expando\n\t// gets copied too\n\tdest.removeAttribute( jQuery.expando );\n}\n\njQuery.buildFragment = function( args, nodes, scripts ) {\n\tvar fragment, cacheable, cacheresults,\n\t\tdoc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);\n\n\t// Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\n\t// Cloning options loses the selected state, so don't cache them\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\n\tif ( args.length === 1 && typeof args[0] === \"string\" && args[0].length < 512 && doc === document &&\n\t\targs[0].charAt(0) === \"<\" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {\n\n\t\tcacheable = true;\n\n\t\tcacheresults = jQuery.fragments[ args[0] ];\n\t\tif ( cacheresults && cacheresults !== 1 ) {\n\t\t\tfragment = cacheresults;\n\t\t}\n\t}\n\n\tif ( !fragment ) {\n\t\tfragment = doc.createDocumentFragment();\n\t\tjQuery.clean( args, doc, fragment, scripts );\n\t}\n\n\tif ( cacheable ) {\n\t\tjQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;\n\t}\n\n\treturn { fragment: fragment, cacheable: cacheable };\n};\n\njQuery.fragments = {};\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar ret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tparent = this.length === 1 && this[0].parentNode;\n\n\t\tif ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {\n\t\t\tinsert[ original ]( this[0] );\n\t\t\treturn this;\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = insert.length; i < l; i++ ) {\n\t\t\t\tvar elems = (i > 0 ? this.clone(true) : this).get();\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\n\t\t\t\tret = ret.concat( elems );\n\t\t\t}\n\n\t\t\treturn this.pushStack( ret, name, insert.selector );\n\t\t}\n\t};\n});\n\nfunction getAll( elem ) {\n\tif ( \"getElementsByTagName\" in elem ) {\n\t\treturn elem.getElementsByTagName( \"*\" );\n\n\t} else if ( \"querySelectorAll\" in elem ) {\n\t\treturn elem.querySelectorAll( \"*\" );\n\n\t} else {\n\t\treturn [];\n\t}\n}\n\n// Used in clean, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( elem.type === \"checkbox\" || elem.type === \"radio\" ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n// Finds all inputs and passes them to fixDefaultChecked\nfunction findInputs( elem ) {\n\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\tfixDefaultChecked( elem );\n\t} else if ( elem.getElementsByTagName ) {\n\t\tjQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar clone = elem.cloneNode(true),\n\t\t\t\tsrcElements,\n\t\t\t\tdestElements,\n\t\t\t\ti;\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\t\t\t// IE copies events bound via attachEvent when using cloneNode.\n\t\t\t// Calling detachEvent on the clone will also remove the events\n\t\t\t// from the original. In order to get around this, we use some\n\t\t\t// proprietary methods to clear the events. Thanks to MooTools\n\t\t\t// guys for this hotness.\n\n\t\t\tcloneFixAttributes( elem, clone );\n\n\t\t\t// Using Sizzle here is crazy slow, so we use getElementsByTagName\n\t\t\t// instead\n\t\t\tsrcElements = getAll( elem );\n\t\t\tdestElements = getAll( clone );\n\n\t\t\t// Weird iteration because IE will replace the length property\n\t\t\t// with an element if you are cloning the body and one of the\n\t\t\t// elements on the page has a name or id of \"length\"\n\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\tcloneFixAttributes( srcElements[i], destElements[i] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tcloneCopyEvent( elem, clone );\n\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = getAll( elem );\n\t\t\t\tdestElements = getAll( clone );\n\n\t\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tclean: function( elems, context, fragment, scripts ) {\n\t\tvar checkScriptType;\n\n\t\tcontext = context || document;\n\n\t\t// !context.createElement fails in IE with an error but returns typeof 'object'\n\t\tif ( typeof context.createElement === \"undefined\" ) {\n\t\t\tcontext = context.ownerDocument || context[0] && context[0].ownerDocument || document;\n\t\t}\n\n\t\tvar ret = [], j;\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( typeof elem === \"number\" ) {\n\t\t\t\telem += \"\";\n\t\t\t}\n\n\t\t\tif ( !elem ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert html string into DOM nodes\n\t\t\tif ( typeof elem === \"string\" ) {\n\t\t\t\tif ( !rhtml.test( elem ) ) {\n\t\t\t\t\telem = context.createTextNode( elem );\n\t\t\t\t} else {\n\t\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\n\t\t\t\t\telem = elem.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\t\t\t// Trim whitespace, otherwise indexOf won't work as expected\n\t\t\t\t\tvar tag = (rtagName.exec( elem ) || [\"\", \"\"])[1].toLowerCase(),\n\t\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default,\n\t\t\t\t\t\tdepth = wrap[0],\n\t\t\t\t\t\tdiv = context.createElement(\"div\");\n\n\t\t\t\t\t// Go to html and back, then peel off extra wrappers\n\t\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\n\n\t\t\t\t\t// Move to the right depth\n\t\t\t\t\twhile ( depth-- ) {\n\t\t\t\t\t\tdiv = div.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\tvar hasBody = rtbody.test(elem),\n\t\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\n\t\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\n\n\t\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\n\t\t\t\t\t\t\t\t\tdiv.childNodes :\n\t\t\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tfor ( j = tbody.length - 1; j >= 0 ; --j ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\n\t\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// IE completely kills leading whitespace when innerHTML is used\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\telem = div.childNodes;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resets defaultChecked for any radios and checkboxes\n\t\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\t\tvar len;\n\t\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\t\tif ( elem[0] && typeof (len = elem.length) === \"number\" ) {\n\t\t\t\t\tfor ( j = 0; j < len; j++ ) {\n\t\t\t\t\t\tfindInputs( elem[j] );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfindInputs( elem );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( elem.nodeType ) {\n\t\t\t\tret.push( elem );\n\t\t\t} else {\n\t\t\t\tret = jQuery.merge( ret, elem );\n\t\t\t}\n\t\t}\n\n\t\tif ( fragment ) {\n\t\t\tcheckScriptType = function( elem ) {\n\t\t\t\treturn !elem.type || rscriptType.test( elem.type );\n\t\t\t};\n\t\t\tfor ( i = 0; ret[i]; i++ ) {\n\t\t\t\tif ( scripts && jQuery.nodeName( ret[i], \"script\" ) && (!ret[i].type || ret[i].type.toLowerCase() === \"text/javascript\") ) {\n\t\t\t\t\tscripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );\n\n\t\t\t\t} else {\n\t\t\t\t\tif ( ret[i].nodeType === 1 ) {\n\t\t\t\t\t\tvar jsTags = jQuery.grep( ret[i].getElementsByTagName( \"script\" ), checkScriptType );\n\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\n\t\t\t\t\t}\n\t\t\t\t\tfragment.appendChild( ret[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando;\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tid = elem[ jQuery.expando ];\n\n\t\t\tif ( id ) {\n\t\t\t\tdata = cache[ id ] && cache[ id ][ internalKey ];\n\n\t\t\t\tif ( data && data.events ) {\n\t\t\t\t\tfor ( var type in data.events ) {\n\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Null the DOM reference to avoid IE6/7/8 leak (#7054)\n\t\t\t\t\tif ( data.handle ) {\n\t\t\t\t\t\tdata.handle.elem = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\tdelete elem[ jQuery.expando ];\n\n\t\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\t\telem.removeAttribute( jQuery.expando );\n\t\t\t\t}\n\n\t\t\t\tdelete cache[ id ];\n\t\t\t}\n\t\t}\n\t}\n});\n\nfunction evalScript( i, elem ) {\n\tif ( elem.src ) {\n\t\tjQuery.ajax({\n\t\t\turl: elem.src,\n\t\t\tasync: false,\n\t\t\tdataType: \"script\"\n\t\t});\n\t} else {\n\t\tjQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"/*$0*/\" ) );\n\t}\n\n\tif ( elem.parentNode ) {\n\t\telem.parentNode.removeChild( elem );\n\t}\n}\n\n\n\n\nvar ralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity=([^)]*)/,\n\trdashAlpha = /-([a-z])/ig,\n\t// fixed for IE9, see #8346\n\trupper = /([A-Z]|^ms)/g,\n\trnumpx = /^-?\\d+(?:px)?$/i,\n\trnum = /^-?\\d/,\n\trrelNum = /^[+\\-]=/,\n\trrelNumFilter = /[^+\\-\\.\\de]+/g,\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssWidth = [ \"Left\", \"Right\" ],\n\tcssHeight = [ \"Top\", \"Bottom\" ],\n\tcurCSS,\n\n\tgetComputedStyle,\n\tcurrentStyle,\n\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn.css = function( name, value ) {\n\t// Setting 'undefined' is a no-op\n\tif ( arguments.length === 2 && value === undefined ) {\n\t\treturn this;\n\t}\n\n\treturn jQuery.access( this, name, value, true, function( elem, name, value ) {\n\t\treturn value !== undefined ?\n\t\t\tjQuery.style( elem, name, value ) :\n\t\t\tjQuery.css( elem, name );\n\t});\n};\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\", \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\n\t\t\t\t} else {\n\t\t\t\t\treturn elem.style.opacity;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Exclude the following css properties to add px\n\tcssNumber: {\n\t\t\"zIndex\": true,\n\t\t\"fontWeight\": true,\n\t\t\"opacity\": true,\n\t\t\"zoom\": true,\n\t\t\"lineHeight\": true,\n\t\t\"widows\": true,\n\t\t\"orphans\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, origName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style, hooks = jQuery.cssHooks[ origName ];\n\n\t\tname = jQuery.cssProps[ origName ] || origName;\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( type === \"number\" && isNaN( value ) || value == null ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && rrelNum.test( value ) ) {\n\t\t\t\tvalue = +value.replace( rrelNumFilter, \"\" ) + parseFloat( jQuery.css( elem, name ) );\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra ) {\n\t\tvar ret, hooks;\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.camelCase( name );\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tname = jQuery.cssProps[ name ] || name;\n\n\t\t// cssFloat needs a special treatment\n\t\tif ( name === \"cssFloat\" ) {\n\t\t\tname = \"float\";\n\t\t}\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {\n\t\t\treturn ret;\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\t} else if ( curCSS ) {\n\t\t\treturn curCSS( elem, name );\n\t\t}\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback ) {\n\t\tvar old = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( var name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tcallback.call( elem );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\t},\n\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rdashAlpha, fcamelCase );\n\t}\n});\n\n// DEPRECATED, Use jQuery.css() instead\njQuery.curCSS = jQuery.css;\n\njQuery.each([\"height\", \"width\"], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tvar val;\n\n\t\t\tif ( computed ) {\n\t\t\t\tif ( elem.offsetWidth !== 0 ) {\n\t\t\t\t\tval = getWH( elem, name, extra );\n\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\tval = getWH( elem, name, extra );\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif ( val <= 0 ) {\n\t\t\t\t\tval = curCSS( elem, name, name );\n\n\t\t\t\t\tif ( val === \"0px\" && currentStyle ) {\n\t\t\t\t\t\tval = currentStyle( elem, name, name );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( val != null ) {\n\t\t\t\t\t\t// Should return \"auto\" instead of 0, use 0 for\n\t\t\t\t\t\t// temporary backwards-compat\n\t\t\t\t\t\treturn val === \"\" || val === \"auto\" ? \"0px\" : val;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( val < 0 || val == null ) {\n\t\t\t\t\tval = elem.style[ name ];\n\n\t\t\t\t\t// Should return \"auto\" instead of 0, use 0 for\n\t\t\t\t\t// temporary backwards-compat\n\t\t\t\t\treturn val === \"\" || val === \"auto\" ? \"0px\" : val;\n\t\t\t\t}\n\n\t\t\t\treturn typeof val === \"string\" ? val : val + \"px\";\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tif ( rnumpx.test( value ) ) {\n\t\t\t\t// ignore negative width and height values #1599\n\t\t\t\tvalue = parseFloat(value);\n\n\t\t\t\tif ( value >= 0 ) {\n\t\t\t\t\treturn value + \"px\";\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( parseFloat( RegExp.$1 ) / 100 ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle;\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// Set the alpha filter to set the opacity\n\t\t\tvar opacity = jQuery.isNaN( value ) ?\n\t\t\t\t\"\" :\n\t\t\t\t\"alpha(opacity=\" + value * 100 + \")\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\njQuery(function() {\n\t// This hook cannot be added until DOM ready because the support test\n\t// for it is not run until after DOM ready\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\tvar ret;\n\t\t\t\tjQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tret = curCSS( elem, \"margin-right\", \"marginRight\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = elem.style.marginRight;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t};\n\t}\n});\n\nif ( document.defaultView && document.defaultView.getComputedStyle ) {\n\tgetComputedStyle = function( elem, name ) {\n\t\tvar ret, defaultView, computedStyle;\n\n\t\tname = name.replace( rupper, \"-$1\" ).toLowerCase();\n\n\t\tif ( !(defaultView = elem.ownerDocument.defaultView) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {\n\t\t\tret = computedStyle.getPropertyValue( name );\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nif ( document.documentElement.currentStyle ) {\n\tcurrentStyle = function( elem, name ) {\n\t\tvar left,\n\t\t\tret = elem.currentStyle && elem.currentStyle[ name ],\n\t\t\trsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],\n\t\t\tstyle = elem.style;\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\tif ( !rnumpx.test( ret ) && rnum.test( ret ) ) {\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : (ret || 0);\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\ncurCSS = getComputedStyle || currentStyle;\n\nfunction getWH( elem, name, extra ) {\n\tvar which = name === \"width\" ? cssWidth : cssHeight,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight;\n\n\tif ( extra === \"border\" ) {\n\t\treturn val;\n\t}\n\n\tjQuery.each( which, function() {\n\t\tif ( !extra ) {\n\t\t\tval -= parseFloat(jQuery.css( elem, \"padding\" + this )) || 0;\n\t\t}\n\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += parseFloat(jQuery.css( elem, \"margin\" + this )) || 0;\n\n\t\t} else {\n\t\t\tval -= parseFloat(jQuery.css( elem, \"border\" + this + \"Width\" )) || 0;\n\t\t}\n\t});\n\n\treturn val;\n}\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\tvar width = elem.offsetWidth,\n\t\t\theight = elem.offsetHeight;\n\n\t\treturn (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trhash = /#.*$/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\trinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app\\-storage|.+\\-extension|file|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trquery = /\\?/,\n\trscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\trselectTextarea = /^(?:select|textarea)/i,\n\trspacesAjax = /\\s+/,\n\trts = /([?&])_=[^&]*/,\n\trurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Document location\n\tajaxLocation,\n\n\t// Document location segments\n\tajaxLocParts;\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\tvar dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),\n\t\t\t\ti = 0,\n\t\t\t\tlength = dataTypes.length,\n\t\t\t\tdataType,\n\t\t\t\tlist,\n\t\t\t\tplaceBefore;\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\tfor(; i < length; i++ ) {\n\t\t\t\tdataType = dataTypes[ i ];\n\t\t\t\t// We control if we're asked to add before\n\t\t\t\t// any existing element\n\t\t\t\tplaceBefore = /^\\+/.test( dataType );\n\t\t\t\tif ( placeBefore ) {\n\t\t\t\t\tdataType = dataType.substr( 1 ) || \"*\";\n\t\t\t\t}\n\t\t\t\tlist = structure[ dataType ] = structure[ dataType ] || [];\n\t\t\t\t// then we add to the structure accordingly\n\t\t\t\tlist[ placeBefore ? \"unshift\" : \"push\" ]( func );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,\n\t\tdataType /* internal */, inspected /* internal */ ) {\n\n\tdataType = dataType || options.dataTypes[ 0 ];\n\tinspected = inspected || {};\n\n\tinspected[ dataType ] = true;\n\n\tvar list = structure[ dataType ],\n\t\ti = 0,\n\t\tlength = list ? list.length : 0,\n\t\texecuteOnly = ( structure === prefilters ),\n\t\tselection;\n\n\tfor(; i < length && ( executeOnly || !selection ); i++ ) {\n\t\tselection = list[ i ]( options, originalOptions, jqXHR );\n\t\t// If we got redirected to another dataType\n\t\t// we try there if executing only and not done already\n\t\tif ( typeof selection === \"string\" ) {\n\t\t\tif ( !executeOnly || inspected[ selection ] ) {\n\t\t\t\tselection = undefined;\n\t\t\t} else {\n\t\t\t\toptions.dataTypes.unshift( selection );\n\t\t\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\t\t\tstructure, options, originalOptions, jqXHR, selection, inspected );\n\t\t\t}\n\t\t}\n\t}\n\t// If we're only executing or nothing was selected\n\t// we try the catchall dataType if not done already\n\tif ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\n\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\tstructure, options, originalOptions, jqXHR, \"*\", inspected );\n\t}\n\t// unnecessary when only executing (prefilters)\n\t// but it'll be ignored by the caller in that case\n\treturn selection;\n}\n\njQuery.fn.extend({\n\tload: function( url, params, callback ) {\n\t\tif ( typeof url !== \"string\" && _load ) {\n\t\t\treturn _load.apply( this, arguments );\n\n\t\t// Don't do a request if no elements are being requested\n\t\t} else if ( !this.length ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar off = url.indexOf( \" \" );\n\t\tif ( off >= 0 ) {\n\t\t\tvar selector = url.slice( off, url.length );\n\t\t\turl = url.slice( 0, off );\n\t\t}\n\n\t\t// Default to a GET request\n\t\tvar type = \"GET\";\n\n\t\t// If the second parameter was provided\n\t\tif ( params ) {\n\t\t\t// If it's a function\n\t\t\tif ( jQuery.isFunction( params ) ) {\n\t\t\t\t// We assume that it's the callback\n\t\t\t\tcallback = params;\n\t\t\t\tparams = undefined;\n\n\t\t\t// Otherwise, build a param string\n\t\t\t} else if ( typeof params === \"object\" ) {\n\t\t\t\tparams = jQuery.param( params, jQuery.ajaxSettings.traditional );\n\t\t\t\ttype = \"POST\";\n\t\t\t}\n\t\t}\n\n\t\tvar self = this;\n\n\t\t// Request the remote document\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params,\n\t\t\t// Complete callback (responseText is used internally)\n\t\t\tcomplete: function( jqXHR, status, responseText ) {\n\t\t\t\t// Store the response as specified by the jqXHR object\n\t\t\t\tresponseText = jqXHR.responseText;\n\t\t\t\t// If successful, inject the HTML into all the matched elements\n\t\t\t\tif ( jqXHR.isResolved() ) {\n\t\t\t\t\t// #4825: Get the actual response in case\n\t\t\t\t\t// a dataFilter is present in ajaxSettings\n\t\t\t\t\tjqXHR.done(function( r ) {\n\t\t\t\t\t\tresponseText = r;\n\t\t\t\t\t});\n\t\t\t\t\t// See if a selector was specified\n\t\t\t\t\tself.html( selector ?\n\t\t\t\t\t\t// Create a dummy div to hold the results\n\t\t\t\t\t\tjQuery(\"<div>\")\n\t\t\t\t\t\t\t// inject the contents of the document in, removing the scripts\n\t\t\t\t\t\t\t// to avoid any 'Permission Denied' errors in IE\n\t\t\t\t\t\t\t.append(responseText.replace(rscript, \"\"))\n\n\t\t\t\t\t\t\t// Locate the specified elements\n\t\t\t\t\t\t\t.find(selector) :\n\n\t\t\t\t\t\t// If not, just inject the full result\n\t\t\t\t\t\tresponseText );\n\t\t\t\t}\n\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tself.each( callback, [ responseText, status, jqXHR ] );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn this;\n\t},\n\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\treturn this.elements ? jQuery.makeArray( this.elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\treturn this.name && !this.disabled &&\n\t\t\t\t( this.checked || rselectTextarea.test( this.nodeName ) ||\n\t\t\t\t\trinput.test( this.type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val, i ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\n\tjQuery.fn[ o ] = function( f ){\n\t\treturn this.bind( o, f );\n\t};\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\ttype: method,\n\t\t\turl: url,\n\t\t\tdata: data,\n\t\t\tsuccess: callback,\n\t\t\tdataType: type\n\t\t});\n\t};\n});\n\njQuery.extend({\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function ( target, settings ) {\n\t\tif ( !settings ) {\n\t\t\t// Only one parameter, we extend ajaxSettings\n\t\t\tsettings = target;\n\t\t\ttarget = jQuery.extend( true, jQuery.ajaxSettings, settings );\n\t\t} else {\n\t\t\t// target was provided, we extend into it\n\t\t\tjQuery.extend( true, target, jQuery.ajaxSettings, settings );\n\t\t}\n\t\t// Flatten fields we don't want deep extended\n\t\tfor( var field in { context: 1, url: 1 } ) {\n\t\t\tif ( field in settings ) {\n\t\t\t\ttarget[ field ] = settings[ field ];\n\t\t\t} else if( field in jQuery.ajaxSettings ) {\n\t\t\t\ttarget[ field ] = jQuery.ajaxSettings[ field ];\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\ttype: \"GET\",\n\t\tcontentType: \"application/x-www-form-urlencoded\",\n\t\tprocessData: true,\n\t\tasync: true,\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\thtml: \"text/html\",\n\t\t\ttext: \"text/plain\",\n\t\t\tjson: \"application/json, text/javascript\",\n\t\t\t\"*\": \"*/*\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\"\n\t\t},\n\n\t\t// List of data converters\n\t\t// 1) key format is \"source_type destination_type\" (a single space in-between)\n\t\t// 2) the catchall symbol \"*\" can be used for source_type\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": window.String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t}\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events\n\t\t\t// It's the callbackContext if one was provided in the options\n\t\t\t// and if it's a DOM node or a jQuery collection\n\t\t\tglobalEventContext = callbackContext !== s &&\n\t\t\t\t( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\n\t\t\t\t\t\tjQuery( callbackContext ) : jQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery._Deferred(),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// ifModified key\n\t\t\tifModifiedKey,\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// transport\n\t\t\ttransport,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match === undefined ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tstatusText = statusText || \"abort\";\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( statusText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, statusText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Callback for when everything is done\n\t\t// It is defined here because jslint complains if it is declared\n\t\t// at the end of the function (which would be more logical and readable)\n\t\tfunction done( status, statusText, responses, headers ) {\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status ? 4 : 0;\n\n\t\t\tvar isSuccess,\n\t\t\t\tsuccess,\n\t\t\t\terror,\n\t\t\t\tresponse = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,\n\t\t\t\tlastModified,\n\t\t\t\tetag;\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\n\t\t\t\t\tif ( ( lastModified = jqXHR.getResponseHeader( \"Last-Modified\" ) ) ) {\n\t\t\t\t\t\tjQuery.lastModified[ ifModifiedKey ] = lastModified;\n\t\t\t\t\t}\n\t\t\t\t\tif ( ( etag = jqXHR.getResponseHeader( \"Etag\" ) ) ) {\n\t\t\t\t\t\tjQuery.etag[ ifModifiedKey ] = etag;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If not modified\n\t\t\t\tif ( status === 304 ) {\n\n\t\t\t\t\tstatusText = \"notmodified\";\n\t\t\t\t\tisSuccess = true;\n\n\t\t\t\t// If we have data\n\t\t\t\t} else {\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsuccess = ajaxConvert( s, response );\n\t\t\t\t\t\tstatusText = \"success\";\n\t\t\t\t\t\tisSuccess = true;\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t// We have a parsererror\n\t\t\t\t\t\tstatusText = \"parsererror\";\n\t\t\t\t\t\terror = e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif( !statusText || status ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = statusText;\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\n\t\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\t\tjqXHR.complete = completeDeferred.done;\n\n\t\t// Status-dependent callbacks\n\t\tjqXHR.statusCode = function( map ) {\n\t\t\tif ( map ) {\n\t\t\t\tvar tmp;\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tfor( tmp in map ) {\n\t\t\t\t\t\tstatusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttmp = map[ jqXHR.status ];\n\t\t\t\t\tjqXHR.then( tmp, tmp );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( rspacesAjax );\n\n\t\t// Determine if a cross-domain request is in order\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefiler, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.data;\n\t\t\t}\n\n\t\t\t// Get ifModifiedKey before adding the anti-cache parameter\n\t\t\tifModifiedKey = s.url;\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\n\t\t\t\tvar ts = jQuery.now(),\n\t\t\t\t\t// try replacing _= if it is there\n\t\t\t\t\tret = s.url.replace( rts, \"$1_=\" + ts );\n\n\t\t\t\t// if nothing was replaced, add timestamp to the end\n\t\t\t\ts.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tifModifiedKey = ifModifiedKey || s.url;\n\t\t\tif ( jQuery.lastModified[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", */*; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t\t// Abort if not done already\n\t\t\t\tjqXHR.abort();\n\t\t\t\treturn false;\n\n\t\t}\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout( function(){\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch (e) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( status < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.error( e );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\t// Serialize an array of form elements or a set of\n\t// key/values into a query string\n\tparam: function( a, traditional ) {\n\t\tvar s = [],\n\t\t\tadd = function( key, value ) {\n\t\t\t\t// If value is a function, invoke it and return its value\n\t\t\t\tvalue = jQuery.isFunction( value ) ? value() : value;\n\t\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t\t};\n\n\t\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\t\tif ( traditional === undefined ) {\n\t\t\ttraditional = jQuery.ajaxSettings.traditional;\n\t\t}\n\n\t\t// If an array was passed in, assume that it is an array of form elements.\n\t\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t\t// Serialize the form elements\n\t\t\tjQuery.each( a, function() {\n\t\t\t\tadd( this.name, this.value );\n\t\t\t});\n\n\t\t} else {\n\t\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t\t// did it), otherwise encode params recursively.\n\t\t\tfor ( var prefix in a ) {\n\t\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t\t}\n\t\t}\n\n\t\t// Return the resulting serialization\n\t\treturn s.join( \"&\" ).replace( r20, \"+\" );\n\t}\n});\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// If array item is non-scalar (array or object), encode its\n\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\n\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\n\t\t\t\t// nested arrays properly, and attempting to do so may cause\n\t\t\t\t// a server error. Possible fixes are to modify rack's\n\t\t\t\t// deserialization algorithm or to provide an option or flag\n\t\t\t\t// to force array serialization to be shallow.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" || jQuery.isArray(v) ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && obj != null && typeof obj === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( var name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// This is still on the jQuery object... for now\n// Want to move this to jQuery.ajax some day\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {}\n\n});\n\n/* Handles responses to an ajax request:\n * - sets all responseXXX fields accordingly\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar contents = s.contents,\n\t\tdataTypes = s.dataTypes,\n\t\tresponseFields = s.responseFields,\n\t\tct,\n\t\ttype,\n\t\tfinalDataType,\n\t\tfirstDataType;\n\n\t// Fill responseXXX fields\n\tfor( type in responseFields ) {\n\t\tif ( type in responses ) {\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\t\t}\n\t}\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"content-type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n// Chain conversions given the request and the original response\nfunction ajaxConvert( s, response ) {\n\n\t// Apply the dataFilter if provided\n\tif ( s.dataFilter ) {\n\t\tresponse = s.dataFilter( response, s.dataType );\n\t}\n\n\tvar dataTypes = s.dataTypes,\n\t\tconverters = {},\n\t\ti,\n\t\tkey,\n\t\tlength = dataTypes.length,\n\t\ttmp,\n\t\t// Current and previous dataTypes\n\t\tcurrent = dataTypes[ 0 ],\n\t\tprev,\n\t\t// Conversion expression\n\t\tconversion,\n\t\t// Conversion function\n\t\tconv,\n\t\t// Conversion functions (transitive conversion)\n\t\tconv1,\n\t\tconv2;\n\n\t// For each dataType in the chain\n\tfor( i = 1; i < length; i++ ) {\n\n\t\t// Create converters map\n\t\t// with lowercased keys\n\t\tif ( i === 1 ) {\n\t\t\tfor( key in s.converters ) {\n\t\t\t\tif( typeof key === \"string\" ) {\n\t\t\t\t\tconverters[ key.toLowerCase() ] = s.converters[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Get the dataTypes\n\t\tprev = current;\n\t\tcurrent = dataTypes[ i ];\n\n\t\t// If current is auto dataType, update it to prev\n\t\tif( current === \"*\" ) {\n\t\t\tcurrent = prev;\n\t\t// If no auto and dataTypes are actually different\n\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t// Get the converter\n\t\t\tconversion = prev + \" \" + current;\n\t\t\tconv = converters[ conversion ] || converters[ \"* \" + current ];\n\n\t\t\t// If there is no direct converter, search transitively\n\t\t\tif ( !conv ) {\n\t\t\t\tconv2 = undefined;\n\t\t\t\tfor( conv1 in converters ) {\n\t\t\t\t\ttmp = conv1.split( \" \" );\n\t\t\t\t\tif ( tmp[ 0 ] === prev || tmp[ 0 ] === \"*\" ) {\n\t\t\t\t\t\tconv2 = converters[ tmp[1] + \" \" + current ];\n\t\t\t\t\t\tif ( conv2 ) {\n\t\t\t\t\t\t\tconv1 = converters[ conv1 ];\n\t\t\t\t\t\t\tif ( conv1 === true ) {\n\t\t\t\t\t\t\t\tconv = conv2;\n\t\t\t\t\t\t\t} else if ( conv2 === true ) {\n\t\t\t\t\t\t\t\tconv = conv1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If we found no converter, dispatch an error\n\t\t\tif ( !( conv || conv2 ) ) {\n\t\t\t\tjQuery.error( \"No conversion from \" + conversion.replace(\" \",\" to \") );\n\t\t\t}\n\t\t\t// If found converter is not an equivalence\n\t\t\tif ( conv !== true ) {\n\t\t\t\t// Convert with 1 or 2 converters accordingly\n\t\t\t\tresponse = conv ? conv( response ) : conv2( conv1(response) );\n\t\t\t}\n\t\t}\n\t}\n\treturn response;\n}\n\n\n\n\nvar jsc = jQuery.now(),\n\tjsre = /(\\=)\\?(&|$)|\\?\\?/i;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\treturn jQuery.expando + \"_\" + ( jsc++ );\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar inspectData = s.contentType === \"application/x-www-form-urlencoded\" &&\n\t\t( typeof s.data === \"string\" );\n\n\tif ( s.dataTypes[ 0 ] === \"jsonp\" ||\n\t\ts.jsonp !== false && ( jsre.test( s.url ) ||\n\t\t\t\tinspectData && jsre.test( s.data ) ) ) {\n\n\t\tvar responseContainer,\n\t\t\tjsonpCallback = s.jsonpCallback =\n\t\t\t\tjQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,\n\t\t\tprevious = window[ jsonpCallback ],\n\t\t\turl = s.url,\n\t\t\tdata = s.data,\n\t\t\treplace = \"$1\" + jsonpCallback + \"$2\";\n\n\t\tif ( s.jsonp !== false ) {\n\t\t\turl = url.replace( jsre, replace );\n\t\t\tif ( s.url === url ) {\n\t\t\t\tif ( inspectData ) {\n\t\t\t\t\tdata = data.replace( jsre, replace );\n\t\t\t\t}\n\t\t\t\tif ( s.data === data ) {\n\t\t\t\t\t// Add callback manually\n\t\t\t\t\turl += (/\\?/.test( url ) ? \"&\" : \"?\") + s.jsonp + \"=\" + jsonpCallback;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ts.url = url;\n\t\ts.data = data;\n\n\t\t// Install callback\n\t\twindow[ jsonpCallback ] = function( response ) {\n\t\t\tresponseContainer = [ response ];\n\t\t};\n\n\t\t// Clean-up function\n\t\tjqXHR.always(function() {\n\t\t\t// Set callback back to previous value\n\t\t\twindow[ jsonpCallback ] = previous;\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( previous ) ) {\n\t\t\t\twindow[ jsonpCallback ]( responseContainer[ 0 ] );\n\t\t\t}\n\t\t});\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( jsonpCallback + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /javascript|ecmascript/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement( \"script\" );\n\n\t\t\t\tscript.async = \"async\";\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( head && script.parentNode ) {\n\t\t\t\t\t\t\thead.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = undefined;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n\t\t\t\t// This arises when a base node is used (#2709 and #4378).\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( 0, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject ? function() {\n\t\t// Abort all pending requests\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( 0, 1 );\n\t\t}\n\t} : false,\n\txhrId = 0,\n\txhrCallbacks;\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\n(function( xhr ) {\n\tjQuery.extend( jQuery.support, {\n\t\tajax: !!xhr,\n\t\tcors: !!xhr && ( \"withCredentials\" in xhr )\n\t});\n})( jQuery.ajaxSettings.xhr() );\n\n// Create transport if the browser can provide an xhr\nif ( jQuery.support.ajax ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar xhr = s.xhr(),\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\ti;\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( _ ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\n\t\t\t\t\t\tvar status,\n\t\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\tresponses,\n\t\t\t\t\t\t\txml;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occured\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\n\n\t\t\t\t\t\t\t\t\t// Construct response list\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// if we're in sync mode or it's in cache\n\t\t\t\t\t// and has been retrieved directly (IE6 & IE7)\n\t\t\t\t\t// we need to manually fire the callback\n\t\t\t\t\tif ( !s.async || xhr.readyState === 4 ) {\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback(0,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\n\n\n\n\nvar elemdisplay = {},\n\tiframe, iframeDoc,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = /^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,\n\ttimerId,\n\tfxAttrs = [\n\t\t// height animations\n\t\t[ \"height\", \"marginTop\", \"marginBottom\", \"paddingTop\", \"paddingBottom\" ],\n\t\t// width animations\n\t\t[ \"width\", \"marginLeft\", \"marginRight\", \"paddingLeft\", \"paddingRight\" ],\n\t\t// opacity animations\n\t\t[ \"opacity\" ]\n\t],\n\tfxNow,\n\trequestAnimationFrame = window.webkitRequestAnimationFrame ||\n\t    window.mozRequestAnimationFrame ||\n\t    window.oRequestAnimationFrame;\n\njQuery.fn.extend({\n\tshow: function( speed, easing, callback ) {\n\t\tvar elem, display;\n\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"show\", 3), speed, easing, callback);\n\n\t\t} else {\n\t\t\tfor ( var i = 0, j = this.length; i < j; i++ ) {\n\t\t\t\telem = this[i];\n\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = elem.style.display;\n\n\t\t\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t\t\t// being hidden by cascaded rules or not\n\t\t\t\t\tif ( !jQuery._data(elem, \"olddisplay\") && display === \"none\" ) {\n\t\t\t\t\t\tdisplay = elem.style.display = \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set elements which have been overridden with display: none\n\t\t\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t\t\t// for such an element\n\t\t\t\t\tif ( display === \"\" && jQuery.css( elem, \"display\" ) === \"none\" ) {\n\t\t\t\t\t\tjQuery._data(elem, \"olddisplay\", defaultDisplay(elem.nodeName));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of most of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( i = 0; i < j; i++ ) {\n\t\t\t\telem = this[i];\n\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = elem.style.display;\n\n\t\t\t\t\tif ( display === \"\" || display === \"none\" ) {\n\t\t\t\t\t\telem.style.display = jQuery._data(elem, \"olddisplay\") || \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\thide: function( speed, easing, callback ) {\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"hide\", 3), speed, easing, callback);\n\n\t\t} else {\n\t\t\tfor ( var i = 0, j = this.length; i < j; i++ ) {\n\t\t\t\tif ( this[i].style ) {\n\t\t\t\t\tvar display = jQuery.css( this[i], \"display\" );\n\n\t\t\t\t\tif ( display !== \"none\" && !jQuery._data( this[i], \"olddisplay\" ) ) {\n\t\t\t\t\t\tjQuery._data( this[i], \"olddisplay\", display );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( i = 0; i < j; i++ ) {\n\t\t\t\tif ( this[i].style ) {\n\t\t\t\t\tthis[i].style.display = \"none\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\t// Save the old toggle function\n\t_toggle: jQuery.fn.toggle,\n\n\ttoggle: function( fn, fn2, callback ) {\n\t\tvar bool = typeof fn === \"boolean\";\n\n\t\tif ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {\n\t\t\tthis._toggle.apply( this, arguments );\n\n\t\t} else if ( fn == null || bool ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar state = bool ? fn : jQuery(this).is(\":hidden\");\n\t\t\t\tjQuery(this)[ state ? \"show\" : \"hide\" ]();\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.animate(genFx(\"toggle\", 3), fn, fn2, callback);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tfadeTo: function( speed, to, easing, callback ) {\n\t\treturn this.filter(\":hidden\").css(\"opacity\", 0).show().end()\n\t\t\t\t\t.animate({opacity: to}, speed, easing, callback);\n\t},\n\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar optall = jQuery.speed(speed, easing, callback);\n\n\t\tif ( jQuery.isEmptyObject( prop ) ) {\n\t\t\treturn this.each( optall.complete, [ false ] );\n\t\t}\n\n\t\t// Do not change referenced properties as per-property easing will be lost\n\t\tprop = jQuery.extend( {}, prop );\n\n\t\treturn this[ optall.queue === false ? \"each\" : \"queue\" ](function() {\n\t\t\t// XXX 'this' does not always have a nodeName when running the\n\t\t\t// test suite\n\n\t\t\tif ( optall.queue === false ) {\n\t\t\t\tjQuery._mark( this );\n\t\t\t}\n\n\t\t\tvar opt = jQuery.extend( {}, optall ),\n\t\t\t\tisElement = this.nodeType === 1,\n\t\t\t\thidden = isElement && jQuery(this).is(\":hidden\"),\n\t\t\t\tname, val, p,\n\t\t\t\tdisplay, e,\n\t\t\t\tparts, start, end, unit;\n\n\t\t\t// will store per property easing and be used to determine when an animation is complete\n\t\t\topt.animatedProperties = {};\n\n\t\t\tfor ( p in prop ) {\n\n\t\t\t\t// property name normalization\n\t\t\t\tname = jQuery.camelCase( p );\n\t\t\t\tif ( p !== name ) {\n\t\t\t\t\tprop[ name ] = prop[ p ];\n\t\t\t\t\tdelete prop[ p ];\n\t\t\t\t}\n\n\t\t\t\tval = prop[ name ];\n\n\t\t\t\t// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)\n\t\t\t\tif ( jQuery.isArray( val ) ) {\n\t\t\t\t\topt.animatedProperties[ name ] = val[ 1 ];\n\t\t\t\t\tval = prop[ name ] = val[ 0 ];\n\t\t\t\t} else {\n\t\t\t\t\topt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';\n\t\t\t\t}\n\n\t\t\t\tif ( val === \"hide\" && hidden || val === \"show\" && !hidden ) {\n\t\t\t\t\treturn opt.complete.call( this );\n\t\t\t\t}\n\n\t\t\t\tif ( isElement && ( name === \"height\" || name === \"width\" ) ) {\n\t\t\t\t\t// Make sure that nothing sneaks out\n\t\t\t\t\t// Record all 3 overflow attributes because IE does not\n\t\t\t\t\t// change the overflow attribute when overflowX and\n\t\t\t\t\t// overflowY are set to the same value\n\t\t\t\t\topt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];\n\n\t\t\t\t\t// Set display property to inline-block for height/width\n\t\t\t\t\t// animations on inline elements that are having width/height\n\t\t\t\t\t// animated\n\t\t\t\t\tif ( jQuery.css( this, \"display\" ) === \"inline\" &&\n\t\t\t\t\t\t\tjQuery.css( this, \"float\" ) === \"none\" ) {\n\t\t\t\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout ) {\n\t\t\t\t\t\t\tthis.style.display = \"inline-block\";\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdisplay = defaultDisplay( this.nodeName );\n\n\t\t\t\t\t\t\t// inline-level elements accept inline-block;\n\t\t\t\t\t\t\t// block-level elements need to be inline with layout\n\t\t\t\t\t\t\tif ( display === \"inline\" ) {\n\t\t\t\t\t\t\t\tthis.style.display = \"inline-block\";\n\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.style.display = \"inline\";\n\t\t\t\t\t\t\t\tthis.style.zoom = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( opt.overflow != null ) {\n\t\t\t\tthis.style.overflow = \"hidden\";\n\t\t\t}\n\n\t\t\tfor ( p in prop ) {\n\t\t\t\te = new jQuery.fx( this, opt, p );\n\t\t\t\tval = prop[ p ];\n\n\t\t\t\tif ( rfxtypes.test(val) ) {\n\t\t\t\t\te[ val === \"toggle\" ? hidden ? \"show\" : \"hide\" : val ]();\n\n\t\t\t\t} else {\n\t\t\t\t\tparts = rfxnum.exec( val );\n\t\t\t\t\tstart = e.cur();\n\n\t\t\t\t\tif ( parts ) {\n\t\t\t\t\t\tend = parseFloat( parts[2] );\n\t\t\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ p ] ? \"\" : \"px\" );\n\n\t\t\t\t\t\t// We need to compute starting value\n\t\t\t\t\t\tif ( unit !== \"px\" ) {\n\t\t\t\t\t\t\tjQuery.style( this, p, (end || 1) + unit);\n\t\t\t\t\t\t\tstart = ((end || 1) / e.cur()) * start;\n\t\t\t\t\t\t\tjQuery.style( this, p, start + unit);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\t\t\tif ( parts[1] ) {\n\t\t\t\t\t\t\tend = ( (parts[ 1 ] === \"-=\" ? -1 : 1) * end ) + start;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\te.custom( start, end, unit );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.custom( start, val, \"\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// For JS strict compliance\n\t\t\treturn true;\n\t\t});\n\t},\n\n\tstop: function( clearQueue, gotoEnd ) {\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue([]);\n\t\t}\n\n\t\tthis.each(function() {\n\t\t\tvar timers = jQuery.timers,\n\t\t\t\ti = timers.length;\n\t\t\t// clear marker counters if we know they won't be\n\t\t\tif ( !gotoEnd ) {\n\t\t\t\tjQuery._unmark( true, this );\n\t\t\t}\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( timers[i].elem === this ) {\n\t\t\t\t\tif (gotoEnd) {\n\t\t\t\t\t\t// force the next step to be the last\n\t\t\t\t\t\ttimers[i](true);\n\t\t\t\t\t}\n\n\t\t\t\t\ttimers.splice(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// start the next in the queue if the last step wasn't forced\n\t\tif ( !gotoEnd ) {\n\t\t\tthis.dequeue();\n\t\t}\n\n\t\treturn this;\n\t}\n\n});\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout( clearFxNow, 0 );\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction clearFxNow() {\n\tfxNow = undefined;\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, num ) {\n\tvar obj = {};\n\n\tjQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {\n\t\tobj[ this ] = type;\n\t});\n\n\treturn obj;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\", 1),\n\tslideUp: genFx(\"hide\", 1),\n\tslideToggle: genFx(\"toggle\", 1),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.extend({\n\tspeed: function( speed, easing, fn ) {\n\t\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend({}, speed) : {\n\t\t\tcomplete: fn || !fn && easing ||\n\t\t\t\tjQuery.isFunction( speed ) && speed,\n\t\t\tduration: speed,\n\t\t\teasing: fn && easing || easing && !jQuery.isFunction(easing) && easing\n\t\t};\n\n\t\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;\n\n\t\t// Queueing\n\t\topt.old = opt.complete;\n\t\topt.complete = function( noUnmark ) {\n\t\t\tif ( opt.queue !== false ) {\n\t\t\t\tjQuery.dequeue( this );\n\t\t\t} else if ( noUnmark !== false ) {\n\t\t\t\tjQuery._unmark( this );\n\t\t\t}\n\n\t\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\t\topt.old.call( this );\n\t\t\t}\n\t\t};\n\n\t\treturn opt;\n\t},\n\n\teasing: {\n\t\tlinear: function( p, n, firstNum, diff ) {\n\t\t\treturn firstNum + diff * p;\n\t\t},\n\t\tswing: function( p, n, firstNum, diff ) {\n\t\t\treturn ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;\n\t\t}\n\t},\n\n\ttimers: [],\n\n\tfx: function( elem, options, prop ) {\n\t\tthis.options = options;\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\n\t\toptions.orig = options.orig || {};\n\t}\n\n});\n\njQuery.fx.prototype = {\n\t// Simple function for setting a style value\n\tupdate: function() {\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\t(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );\n\t},\n\n\t// Get the current size\n\tcur: function() {\n\t\tif ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {\n\t\t\treturn this.elem[ this.prop ];\n\t\t}\n\n\t\tvar parsed,\n\t\t\tr = jQuery.css( this.elem, this.prop );\n\t\t// Empty strings, null, undefined and \"auto\" are converted to 0,\n\t\t// complex values such as \"rotate(1rad)\" are returned as is,\n\t\t// simple values such as \"10px\" are parsed to Float.\n\t\treturn isNaN( parsed = parseFloat( r ) ) ? !r || r === \"auto\" ? 0 : r : parsed;\n\t},\n\n\t// Start an animation from one number to another\n\tcustom: function( from, to, unit ) {\n\t\tvar self = this,\n\t\t\tfx = jQuery.fx,\n\t\t\traf;\n\n\t\tthis.startTime = fxNow || createFxNow();\n\t\tthis.start = from;\n\t\tthis.end = to;\n\t\tthis.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? \"\" : \"px\" );\n\t\tthis.now = this.start;\n\t\tthis.pos = this.state = 0;\n\n\t\tfunction t( gotoEnd ) {\n\t\t\treturn self.step(gotoEnd);\n\t\t}\n\n\t\tt.elem = this.elem;\n\n\t\tif ( t() && jQuery.timers.push(t) && !timerId ) {\n\t\t\t// Use requestAnimationFrame instead of setInterval if available\n\t\t\tif ( requestAnimationFrame ) {\n\t\t\t\ttimerId = 1;\n\t\t\t\traf = function() {\n\t\t\t\t\t// When timerId gets set to null at any point, this stops\n\t\t\t\t\tif ( timerId ) {\n\t\t\t\t\t\trequestAnimationFrame( raf );\n\t\t\t\t\t\tfx.tick();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\trequestAnimationFrame( raf );\n\t\t\t} else {\n\t\t\t\ttimerId = setInterval( fx.tick, fx.interval );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Simple 'show' function\n\tshow: function() {\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[this.prop] = jQuery.style( this.elem, this.prop );\n\t\tthis.options.show = true;\n\n\t\t// Begin the animation\n\t\t// Make sure that we start at a small width/height to avoid any\n\t\t// flash of content\n\t\tthis.custom(this.prop === \"width\" || this.prop === \"height\" ? 1 : 0, this.cur());\n\n\t\t// Start by showing the element\n\t\tjQuery( this.elem ).show();\n\t},\n\n\t// Simple 'hide' function\n\thide: function() {\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[this.prop] = jQuery.style( this.elem, this.prop );\n\t\tthis.options.hide = true;\n\n\t\t// Begin the animation\n\t\tthis.custom(this.cur(), 0);\n\t},\n\n\t// Each step of an animation\n\tstep: function( gotoEnd ) {\n\t\tvar t = fxNow || createFxNow(),\n\t\t\tdone = true,\n\t\t\telem = this.elem,\n\t\t\toptions = this.options,\n\t\t\ti, n;\n\n\t\tif ( gotoEnd || t >= options.duration + this.startTime ) {\n\t\t\tthis.now = this.end;\n\t\t\tthis.pos = this.state = 1;\n\t\t\tthis.update();\n\n\t\t\toptions.animatedProperties[ this.prop ] = true;\n\n\t\t\tfor ( i in options.animatedProperties ) {\n\t\t\t\tif ( options.animatedProperties[i] !== true ) {\n\t\t\t\t\tdone = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( done ) {\n\t\t\t\t// Reset the overflow\n\t\t\t\tif ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {\n\n\t\t\t\t\tjQuery.each( [ \"\", \"X\", \"Y\" ], function (index, value) {\n\t\t\t\t\t\telem.style[ \"overflow\" + value ] = options.overflow[index];\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Hide the element if the \"hide\" operation was done\n\t\t\t\tif ( options.hide ) {\n\t\t\t\t\tjQuery(elem).hide();\n\t\t\t\t}\n\n\t\t\t\t// Reset the properties, if the item has been hidden or shown\n\t\t\t\tif ( options.hide || options.show ) {\n\t\t\t\t\tfor ( var p in options.animatedProperties ) {\n\t\t\t\t\t\tjQuery.style( elem, p, options.orig[p] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Execute the complete function\n\t\t\t\toptions.complete.call( elem );\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t} else {\n\t\t\t// classical easing cannot be used with an Infinity duration\n\t\t\tif ( options.duration == Infinity ) {\n\t\t\t\tthis.now = t;\n\t\t\t} else {\n\t\t\t\tn = t - this.startTime;\n\t\t\t\tthis.state = n / options.duration;\n\n\t\t\t\t// Perform the easing function, defaults to swing\n\t\t\t\tthis.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );\n\t\t\t\tthis.now = this.start + ((this.end - this.start) * this.pos);\n\t\t\t}\n\t\t\t// Perform the next step of the animation\n\t\t\tthis.update();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n\njQuery.extend( jQuery.fx, {\n\ttick: function() {\n\t\tfor ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {\n\t\t\tif ( !timers[i]() ) {\n\t\t\t\ttimers.splice(i--, 1);\n\t\t\t}\n\t\t}\n\n\t\tif ( !timers.length ) {\n\t\t\tjQuery.fx.stop();\n\t\t}\n\t},\n\n\tinterval: 13,\n\n\tstop: function() {\n\t\tclearInterval( timerId );\n\t\ttimerId = null;\n\t},\n\n\tspeeds: {\n\t\tslow: 600,\n\t\tfast: 200,\n\t\t// Default speed\n\t\t_default: 400\n\t},\n\n\tstep: {\n\t\topacity: function( fx ) {\n\t\t\tjQuery.style( fx.elem, \"opacity\", fx.now );\n\t\t},\n\n\t\t_default: function( fx ) {\n\t\t\tif ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {\n\t\t\t\tfx.elem.style[ fx.prop ] = (fx.prop === \"width\" || fx.prop === \"height\" ? Math.max(0, fx.now) : fx.now) + fx.unit;\n\t\t\t} else {\n\t\t\t\tfx.elem[ fx.prop ] = fx.now;\n\t\t\t}\n\t\t}\n\t}\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\n\n// Try to restore the default display value of an element\nfunction defaultDisplay( nodeName ) {\n\n\tif ( !elemdisplay[ nodeName ] ) {\n\n\t\tvar elem = jQuery( \"<\" + nodeName + \">\" ).appendTo( \"body\" ),\n\t\t\tdisplay = elem.css( \"display\" );\n\n\t\telem.remove();\n\n\t\t// If the simple way fails,\n\t\t// get element's real default display by attaching it to a temp iframe\n\t\tif ( display === \"none\" || display === \"\" ) {\n\t\t\t// No iframe to use yet, so create it\n\t\t\tif ( !iframe ) {\n\t\t\t\tiframe = document.createElement( \"iframe\" );\n\t\t\t\tiframe.frameBorder = iframe.width = iframe.height = 0;\n\t\t\t}\n\n\t\t\tdocument.body.appendChild( iframe );\n\n\t\t\t// Create a cacheable copy of the iframe document on first call.\n\t\t\t// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake html\n\t\t\t// document to it, Webkit & Firefox won't allow reusing the iframe document\n\t\t\tif ( !iframeDoc || !iframe.createElement ) {\n\t\t\t\tiframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\n\t\t\t\tiframeDoc.write( \"<!doctype><html><body></body></html>\" );\n\t\t\t}\n\n\t\t\telem = iframeDoc.createElement( nodeName );\n\n\t\t\tiframeDoc.body.appendChild( elem );\n\n\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t\tdocument.body.removeChild( iframe );\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn elemdisplay[ nodeName ];\n}\n\n\n\n\nvar rtable = /^t(?:able|d|h)$/i,\n\trroot = /^(?:body|html)$/i;\n\nif ( \"getBoundingClientRect\" in document.documentElement ) {\n\tjQuery.fn.offset = function( options ) {\n\t\tvar elem = this[0], box;\n\n\t\tif ( options ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t\t}\n\n\t\tif ( !elem || !elem.ownerDocument ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( elem === elem.ownerDocument.body ) {\n\t\t\treturn jQuery.offset.bodyOffset( elem );\n\t\t}\n\n\t\ttry {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t} catch(e) {}\n\n\t\tvar doc = elem.ownerDocument,\n\t\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure we're not dealing with a disconnected DOM node\n\t\tif ( !box || !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box ? { top: box.top, left: box.left } : { top: 0, left: 0 };\n\t\t}\n\n\t\tvar body = doc.body,\n\t\t\twin = getWindow(doc),\n\t\t\tclientTop  = docElem.clientTop  || body.clientTop  || 0,\n\t\t\tclientLeft = docElem.clientLeft || body.clientLeft || 0,\n\t\t\tscrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,\n\t\t\tscrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,\n\t\t\ttop  = box.top  + scrollTop  - clientTop,\n\t\t\tleft = box.left + scrollLeft - clientLeft;\n\n\t\treturn { top: top, left: left };\n\t};\n\n} else {\n\tjQuery.fn.offset = function( options ) {\n\t\tvar elem = this[0];\n\n\t\tif ( options ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t\t}\n\n\t\tif ( !elem || !elem.ownerDocument ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( elem === elem.ownerDocument.body ) {\n\t\t\treturn jQuery.offset.bodyOffset( elem );\n\t\t}\n\n\t\tjQuery.offset.initialize();\n\n\t\tvar computedStyle,\n\t\t\toffsetParent = elem.offsetParent,\n\t\t\tprevOffsetParent = elem,\n\t\t\tdoc = elem.ownerDocument,\n\t\t\tdocElem = doc.documentElement,\n\t\t\tbody = doc.body,\n\t\t\tdefaultView = doc.defaultView,\n\t\t\tprevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,\n\t\t\ttop = elem.offsetTop,\n\t\t\tleft = elem.offsetLeft;\n\n\t\twhile ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {\n\t\t\tif ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcomputedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;\n\t\t\ttop  -= elem.scrollTop;\n\t\t\tleft -= elem.scrollLeft;\n\n\t\t\tif ( elem === offsetParent ) {\n\t\t\t\ttop  += elem.offsetTop;\n\t\t\t\tleft += elem.offsetLeft;\n\n\t\t\t\tif ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {\n\t\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t\t}\n\n\t\t\t\tprevOffsetParent = offsetParent;\n\t\t\t\toffsetParent = elem.offsetParent;\n\t\t\t}\n\n\t\t\tif ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== \"visible\" ) {\n\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t}\n\n\t\t\tprevComputedStyle = computedStyle;\n\t\t}\n\n\t\tif ( prevComputedStyle.position === \"relative\" || prevComputedStyle.position === \"static\" ) {\n\t\t\ttop  += body.offsetTop;\n\t\t\tleft += body.offsetLeft;\n\t\t}\n\n\t\tif ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\ttop  += Math.max( docElem.scrollTop, body.scrollTop );\n\t\t\tleft += Math.max( docElem.scrollLeft, body.scrollLeft );\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t};\n}\n\njQuery.offset = {\n\tinitialize: function() {\n\t\tvar body = document.body, container = document.createElement(\"div\"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, \"marginTop\") ) || 0,\n\t\t\thtml = \"<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>\";\n\n\t\tjQuery.extend( container.style, { position: \"absolute\", top: 0, left: 0, margin: 0, border: 0, width: \"1px\", height: \"1px\", visibility: \"hidden\" } );\n\n\t\tcontainer.innerHTML = html;\n\t\tbody.insertBefore( container, body.firstChild );\n\t\tinnerDiv = container.firstChild;\n\t\tcheckDiv = innerDiv.firstChild;\n\t\ttd = innerDiv.nextSibling.firstChild.firstChild;\n\n\t\tthis.doesNotAddBorder = (checkDiv.offsetTop !== 5);\n\t\tthis.doesAddBorderForTableAndCells = (td.offsetTop === 5);\n\n\t\tcheckDiv.style.position = \"fixed\";\n\t\tcheckDiv.style.top = \"20px\";\n\n\t\t// safari subtracts parent border width here which is 5px\n\t\tthis.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);\n\t\tcheckDiv.style.position = checkDiv.style.top = \"\";\n\n\t\tinnerDiv.style.overflow = \"hidden\";\n\t\tinnerDiv.style.position = \"relative\";\n\n\t\tthis.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);\n\n\t\tthis.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);\n\n\t\tbody.removeChild( container );\n\t\tjQuery.offset.initialize = jQuery.noop;\n\t},\n\n\tbodyOffset: function( body ) {\n\t\tvar top = body.offsetTop,\n\t\t\tleft = body.offsetLeft;\n\n\t\tjQuery.offset.initialize();\n\n\t\tif ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {\n\t\t\ttop  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\n\t\t\tleft += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t},\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = (position === \"absolute\" || position === \"fixed\") && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif (options.top != null) {\n\t\t\tprops.top = (options.top - curOffset.top) + curTop;\n\t\t}\n\t\tif (options.left != null) {\n\t\t\tprops.left = (options.left - curOffset.left) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\tposition: function() {\n\t\tif ( !this[0] ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar elem = this[0],\n\n\t\t// Get *real* offsetParent\n\t\toffsetParent = this.offsetParent(),\n\n\t\t// Get correct offsets\n\t\toffset       = this.offset(),\n\t\tparentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\n\n\t\t// Subtract element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\toffset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\n\t\toffset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\n\n\t\t// Add offsetParent borders\n\t\tparentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\n\t\tparentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\n\n\t\t// Subtract the two offsets\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top,\n\t\t\tleft: offset.left - parentOffset.left\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.body;\n\t\t\twhile ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( [\"Left\", \"Top\"], function( i, name ) {\n\tvar method = \"scroll\" + name;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\tvar elem, win;\n\n\t\tif ( val === undefined ) {\n\t\t\telem = this[ 0 ];\n\n\t\t\tif ( !elem ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\twin = getWindow( elem );\n\n\t\t\t// Return the scroll offset\n\t\t\treturn win ? (\"pageXOffset\" in win) ? win[ i ? \"pageYOffset\" : \"pageXOffset\" ] :\n\t\t\t\tjQuery.support.boxModel && win.document.documentElement[ method ] ||\n\t\t\t\t\twin.document.body[ method ] :\n\t\t\t\telem[ method ];\n\t\t}\n\n\t\t// Set the scroll offset\n\t\treturn this.each(function() {\n\t\t\twin = getWindow( this );\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!i ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\t i ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\tthis[ method ] = val;\n\t\t\t}\n\t\t});\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n\n\n\n\n// Create innerHeight, innerWidth, outerHeight and outerWidth methods\njQuery.each([ \"Height\", \"Width\" ], function( i, name ) {\n\n\tvar type = name.toLowerCase();\n\n\t// innerHeight and innerWidth\n\tjQuery.fn[\"inner\" + name] = function() {\n\t\treturn this[0] ?\n\t\t\tparseFloat( jQuery.css( this[0], type, \"padding\" ) ) :\n\t\t\tnull;\n\t};\n\n\t// outerHeight and outerWidth\n\tjQuery.fn[\"outer\" + name] = function( margin ) {\n\t\treturn this[0] ?\n\t\t\tparseFloat( jQuery.css( this[0], type, margin ? \"margin\" : \"border\" ) ) :\n\t\t\tnull;\n\t};\n\n\tjQuery.fn[ type ] = function( size ) {\n\t\t// Get window width or height\n\t\tvar elem = this[0];\n\t\tif ( !elem ) {\n\t\t\treturn size == null ? null : this;\n\t\t}\n\n\t\tif ( jQuery.isFunction( size ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tvar self = jQuery( this );\n\t\t\t\tself[ type ]( size.call( this, i, self[ type ]() ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode\n\t\t\t// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat\n\t\t\tvar docElemProp = elem.document.documentElement[ \"client\" + name ];\n\t\t\treturn elem.document.compatMode === \"CSS1Compat\" && docElemProp ||\n\t\t\t\telem.document.body[ \"client\" + name ] || docElemProp;\n\n\t\t// Get document width or height\n\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t// Either scroll[Width/Height] or offset[Width/Height], whichever is greater\n\t\t\treturn Math.max(\n\t\t\t\telem.documentElement[\"client\" + name],\n\t\t\t\telem.body[\"scroll\" + name], elem.documentElement[\"scroll\" + name],\n\t\t\t\telem.body[\"offset\" + name], elem.documentElement[\"offset\" + name]\n\t\t\t);\n\n\t\t// Get or set width or height on the element\n\t\t} else if ( size === undefined ) {\n\t\t\tvar orig = jQuery.css( elem, type ),\n\t\t\t\tret = parseFloat( orig );\n\n\t\t\treturn jQuery.isNaN( ret ) ? orig : ret;\n\n\t\t// Set the width or height on the element (default to pixels if value is unitless)\n\t\t} else {\n\t\t\treturn this.css( type, typeof size === \"string\" ? size : size + \"px\" );\n\t\t}\n\t};\n\n});\n\n\nwindow.jQuery = window.$ = jQuery;\n})(window);\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/jquery-1.7.2.js",
    "content": "/*!\n * jQuery JavaScript Library v1.7.2\n * http://jquery.com/\n *\n * Copyright 2011, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2011, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Wed Mar 21 12:46:34 2012 -0700\n */\n(function( window, undefined ) {\n\n// Use the correct document accordingly with window argument (sandbox)\nvar document = window.document,\n\tnavigator = window.navigator,\n\tlocation = window.location;\nvar jQuery = (function() {\n\n// Define a local copy of jQuery\nvar jQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// A simple way to check for HTML strings or ID strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\tquickExpr = /^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\n\n\t// Check if a string has a non-whitespace character in it\n\trnotwhite = /\\S/,\n\n\t// Used for trimming whitespace\n\ttrimLeft = /^\\s+/,\n\ttrimRight = /\\s+$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\n\t// Useragent RegExp\n\trwebkit = /(webkit)[ \\/]([\\w.]+)/,\n\tropera = /(opera)(?:.*version)?[ \\/]([\\w.]+)/,\n\trmsie = /(msie) ([\\w.]+)/,\n\trmozilla = /(mozilla)(?:.*? rv:([\\w.]+))?/,\n\n\t// Matches dashed string for camelizing\n\trdashAlpha = /-([a-z]|[0-9])/ig,\n\trmsPrefix = /^-ms-/,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn ( letter + \"\" ).toUpperCase();\n\t},\n\n\t// Keep a UserAgent string for use with jQuery.browser\n\tuserAgent = navigator.userAgent,\n\n\t// For matching the engine and version of the browser\n\tbrowserMatch,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// The ready event handler\n\tDOMContentLoaded,\n\n\t// Save a reference to some core methods\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty,\n\tpush = Array.prototype.push,\n\tslice = Array.prototype.slice,\n\ttrim = String.prototype.trim,\n\tindexOf = Array.prototype.indexOf,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {};\n\njQuery.fn = jQuery.prototype = {\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem, ret, doc;\n\n\t\t// Handle $(\"\"), $(null), or $(undefined)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle $(DOMElement)\n\t\tif ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// The body element only exists once, optimize finding it\n\t\tif ( selector === \"body\" && !context && document.body ) {\n\t\t\tthis.context = document;\n\t\t\tthis[0] = document.body;\n\t\t\tthis.selector = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\t// Are we dealing with HTML string or an ID?\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = quickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Verify a match, and that no context was specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\t\t\t\t\tdoc = ( context ? context.ownerDocument || context : document );\n\n\t\t\t\t\t// If a single string is passed in and it's a single tag\n\t\t\t\t\t// just do a createElement and skip the rest\n\t\t\t\t\tret = rsingleTag.exec( selector );\n\n\t\t\t\t\tif ( ret ) {\n\t\t\t\t\t\tif ( jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\t\tselector = [ document.createElement( ret[1] ) ];\n\t\t\t\t\t\t\tjQuery.fn.attr.call( selector, context, true );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tselector = [ doc.createElement( ret[1] ) ];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = jQuery.buildFragment( [ match[1] ], [ doc ] );\n\t\t\t\t\t\tselector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.merge( this, selector );\n\n\t\t\t\t// HANDLE: $(\"#id\")\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The current version of jQuery being used\n\tjquery: \"1.7.2\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn slice.call( this, 0 );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems, name, selector ) {\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = this.constructor();\n\n\t\tif ( jQuery.isArray( elems ) ) {\n\t\t\tpush.apply( ret, elems );\n\n\t\t} else {\n\t\t\tjQuery.merge( ret, elems );\n\t\t}\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\tret.context = this.context;\n\n\t\tif ( name === \"find\" ) {\n\t\t\tret.selector = this.selector + ( this.selector ? \" \" : \"\" ) + selector;\n\t\t} else if ( name ) {\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\n\t\t}\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Attach the listeners\n\t\tjQuery.bindReady();\n\n\t\t// Add the callback\n\t\treadyList.add( fn );\n\n\t\treturn this;\n\t},\n\n\teq: function( i ) {\n\t\ti = +i;\n\t\treturn i === -1 ?\n\t\t\tthis.slice( i ) :\n\t\t\tthis.slice( i, i + 1 );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ),\n\t\t\t\"slice\", slice.call(arguments).join(\",\") );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\t\t// Either a released hold or an DOMready/load event and not yet ready\n\t\tif ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {\n\t\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\t\tif ( !document.body ) {\n\t\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t\t}\n\n\t\t\t// Remember that the DOM is ready\n\t\t\tjQuery.isReady = true;\n\n\t\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there are functions bound, to execute\n\t\t\treadyList.fireWith( document, [ jQuery ] );\n\n\t\t\t// Trigger any bound ready events\n\t\t\tif ( jQuery.fn.trigger ) {\n\t\t\t\tjQuery( document ).trigger( \"ready\" ).off( \"ready\" );\n\t\t\t}\n\t\t}\n\t},\n\n\tbindReady: function() {\n\t\tif ( readyList ) {\n\t\t\treturn;\n\t\t}\n\n\t\treadyList = jQuery.Callbacks( \"once memory\" );\n\n\t\t// Catch cases where $(document).ready() is called after the\n\t\t// browser event has already occurred.\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t}\n\n\t\t// Mozilla, Opera and webkit nightlies currently support this event\n\t\tif ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\n\n\t\t// If IE event model is used\n\t\t} else if ( document.attachEvent ) {\n\t\t\t// ensure firing before onload,\n\t\t\t// maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar toplevel = false;\n\n\t\t\ttry {\n\t\t\t\ttoplevel = window.frameElement == null;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( document.documentElement.doScroll && toplevel ) {\n\t\t\t\tdoScrollCheck();\n\t\t\t}\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\treturn obj == null ?\n\t\t\tString( obj ) :\n\t\t\tclass2type[ toString.call(obj) ] || \"object\";\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tfor ( var name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tparseJSON: function( data ) {\n\t\tif ( typeof data !== \"string\" || !data ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\tdata = jQuery.trim( data );\n\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\t// Make sure the incoming data is actual JSON\n\t\t// Logic borrowed from http://json.org/json2.js\n\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\treturn ( new Function( \"return \" + data ) )();\n\n\t\t}\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tif ( typeof data !== \"string\" || !data ) {\n\t\t\treturn null;\n\t\t}\n\t\tvar xml, tmp;\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && rnotwhite.test( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( object, callback, args ) {\n\t\tvar name, i = 0,\n\t\t\tlength = object.length,\n\t\t\tisObj = length === undefined || jQuery.isFunction( object );\n\n\t\tif ( args ) {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.apply( object[ name ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.apply( object[ i++ ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.call( object[ name ], name, object[ name ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn object;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: trim ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttrim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttext.toString().replace( trimLeft, \"\" ).replace( trimRight, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( array, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( array != null ) {\n\t\t\t// The window, strings (and functions) also have 'length'\n\t\t\t// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\n\t\t\tvar type = jQuery.type( array );\n\n\t\t\tif ( array.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( array ) ) {\n\t\t\t\tpush.call( ret, array );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( ret, array );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, array, i ) {\n\t\tvar len;\n\n\t\tif ( array ) {\n\t\t\tif ( indexOf ) {\n\t\t\t\treturn indexOf.call( array, elem, i );\n\t\t\t}\n\n\t\t\tlen = array.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in array && array[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar i = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof second.length === \"number\" ) {\n\t\t\tfor ( var l = second.length; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar ret = [], retVal;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( var i = 0, length = elems.length; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value, key, ret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\t// jquery objects are treated as arrays\n\t\t\tisArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( key in elems ) {\n\t\t\t\tvalue = callback( elems[ key ], key, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn ret.concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tif ( typeof context === \"string\" ) {\n\t\t\tvar tmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\tvar args = slice.call( arguments, 2 ),\n\t\t\tproxy = function() {\n\t\t\t\treturn fn.apply( context, args.concat( slice.call( arguments ) ) );\n\t\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Mutifunctional method to get and set values to a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, pass ) {\n\t\tvar exec,\n\t\t\tbulk = key == null,\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\n\t\t// Sets many values\n\t\tif ( key && typeof key === \"object\" ) {\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], 1, emptyGet, value );\n\t\t\t}\n\t\t\tchainable = 1;\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\t// Optionally, function values get executed if exec is true\n\t\t\texec = pass === undefined && jQuery.isFunction( value );\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations only iterate when executing function values\n\t\t\t\tif ( exec ) {\n\t\t\t\t\texec = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn exec.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\n\t\t\t\t// Otherwise they run against the entire set\n\t\t\t\t} else {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor (; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchainable = 1;\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t},\n\n\t// Use of jQuery.browser is frowned upon.\n\t// More details: http://docs.jquery.com/Utilities/jQuery.browser\n\tuaMatch: function( ua ) {\n\t\tua = ua.toLowerCase();\n\n\t\tvar match = rwebkit.exec( ua ) ||\n\t\t\tropera.exec( ua ) ||\n\t\t\trmsie.exec( ua ) ||\n\t\t\tua.indexOf(\"compatible\") < 0 && rmozilla.exec( ua ) ||\n\t\t\t[];\n\n\t\treturn { browser: match[1] || \"\", version: match[2] || \"0\" };\n\t},\n\n\tsub: function() {\n\t\tfunction jQuerySub( selector, context ) {\n\t\t\treturn new jQuerySub.fn.init( selector, context );\n\t\t}\n\t\tjQuery.extend( true, jQuerySub, this );\n\t\tjQuerySub.superclass = this;\n\t\tjQuerySub.fn = jQuerySub.prototype = this();\n\t\tjQuerySub.fn.constructor = jQuerySub;\n\t\tjQuerySub.sub = this.sub;\n\t\tjQuerySub.fn.init = function init( selector, context ) {\n\t\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\n\t\t\t\tcontext = jQuerySub( context );\n\t\t\t}\n\n\t\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\n\t\t};\n\t\tjQuerySub.fn.init.prototype = jQuerySub.fn;\n\t\tvar rootjQuerySub = jQuerySub(document);\n\t\treturn jQuerySub;\n\t},\n\n\tbrowser: {}\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nbrowserMatch = jQuery.uaMatch( userAgent );\nif ( browserMatch.browser ) {\n\tjQuery.browser[ browserMatch.browser ] = true;\n\tjQuery.browser.version = browserMatch.version;\n}\n\n// Deprecated, use jQuery.browser.webkit instead\nif ( jQuery.browser.webkit ) {\n\tjQuery.browser.safari = true;\n}\n\n// IE doesn't match non-breaking spaces with \\s\nif ( rnotwhite.test( \"\\xA0\" ) ) {\n\ttrimLeft = /^[\\s\\xA0]+/;\n\ttrimRight = /[\\s\\xA0]+$/;\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n\n// Cleanup functions for the document ready method\nif ( document.addEventListener ) {\n\tDOMContentLoaded = function() {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\tjQuery.ready();\n\t};\n\n} else if ( document.attachEvent ) {\n\tDOMContentLoaded = function() {\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n\t\t\tjQuery.ready();\n\t\t}\n\t};\n}\n\n// The DOM ready check for Internet Explorer\nfunction doScrollCheck() {\n\tif ( jQuery.isReady ) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\t// If IE is used, use the trick by Diego Perini\n\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\tdocument.documentElement.doScroll(\"left\");\n\t} catch(e) {\n\t\tsetTimeout( doScrollCheck, 1 );\n\t\treturn;\n\t}\n\n\t// and execute any waiting functions\n\tjQuery.ready();\n}\n\nreturn jQuery;\n\n})();\n\n\n// String to Object flags format cache\nvar flagsCache = {};\n\n// Convert String-formatted flags into Object-formatted ones and store in cache\nfunction createFlags( flags ) {\n\tvar object = flagsCache[ flags ] = {},\n\t\ti, length;\n\tflags = flags.split( /\\s+/ );\n\tfor ( i = 0, length = flags.length; i < length; i++ ) {\n\t\tobject[ flags[i] ] = true;\n\t}\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\tflags:\tan optional list of space-separated flags that will change how\n *\t\t\tthe callback list behaves\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible flags:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( flags ) {\n\n\t// Convert flags from String-formatted to Object-formatted\n\t// (we check in cache first)\n\tflags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};\n\n\tvar // Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = [],\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Add one or several callbacks to the list\n\t\tadd = function( args ) {\n\t\t\tvar i,\n\t\t\t\tlength,\n\t\t\t\telem,\n\t\t\t\ttype,\n\t\t\t\tactual;\n\t\t\tfor ( i = 0, length = args.length; i < length; i++ ) {\n\t\t\t\telem = args[ i ];\n\t\t\t\ttype = jQuery.type( elem );\n\t\t\t\tif ( type === \"array\" ) {\n\t\t\t\t\t// Inspect recursively\n\t\t\t\t\tadd( elem );\n\t\t\t\t} else if ( type === \"function\" ) {\n\t\t\t\t\t// Add if not in unique mode and callback is not in\n\t\t\t\t\tif ( !flags.unique || !self.has( elem ) ) {\n\t\t\t\t\t\tlist.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Fire callbacks\n\t\tfire = function( context, args ) {\n\t\t\targs = args || [];\n\t\t\tmemory = !flags.memory || [ context, args ];\n\t\t\tfired = true;\n\t\t\tfiring = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {\n\t\t\t\t\tmemory = true; // Mark as halted\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( !flags.once ) {\n\t\t\t\t\tif ( stack && stack.length ) {\n\t\t\t\t\t\tmemory = stack.shift();\n\t\t\t\t\t\tself.fireWith( memory[ 0 ], memory[ 1 ] );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory === true ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t} else {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tvar length = list.length;\n\t\t\t\t\tadd( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away, unless previous\n\t\t\t\t\t// firing was halted (stopOnFalse)\n\t\t\t\t\t} else if ( memory && memory !== true ) {\n\t\t\t\t\t\tfiringStart = length;\n\t\t\t\t\t\tfire( memory[ 0 ], memory[ 1 ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tvar args = arguments,\n\t\t\t\t\t\targIndex = 0,\n\t\t\t\t\t\targLength = args.length;\n\t\t\t\t\tfor ( ; argIndex < argLength ; argIndex++ ) {\n\t\t\t\t\t\tfor ( var i = 0; i < list.length; i++ ) {\n\t\t\t\t\t\t\tif ( args[ argIndex ] === list[ i ] ) {\n\t\t\t\t\t\t\t\t// Handle firingIndex and firingLength\n\t\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\t\tif ( i <= firingLength ) {\n\t\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t\t\tif ( i <= firingIndex ) {\n\t\t\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Remove the element\n\t\t\t\t\t\t\t\tlist.splice( i--, 1 );\n\t\t\t\t\t\t\t\t// If we have some unicity property then\n\t\t\t\t\t\t\t\t// we only need to do this once\n\t\t\t\t\t\t\t\tif ( flags.unique ) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Control if a given callback is in the list\n\t\t\thas: function( fn ) {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tvar i = 0,\n\t\t\t\t\t\tlength = list.length;\n\t\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\t\tif ( fn === list[ i ] ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory || memory === true ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tif ( !flags.once ) {\n\t\t\t\t\t\t\tstack.push( [ context, args ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( !( flags.once && memory ) ) {\n\t\t\t\t\t\tfire( context, args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\n\n\nvar // Static reference to slice\n\tsliceDeferred = [].slice;\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar doneList = jQuery.Callbacks( \"once memory\" ),\n\t\t\tfailList = jQuery.Callbacks( \"once memory\" ),\n\t\t\tprogressList = jQuery.Callbacks( \"memory\" ),\n\t\t\tstate = \"pending\",\n\t\t\tlists = {\n\t\t\t\tresolve: doneList,\n\t\t\t\treject: failList,\n\t\t\t\tnotify: progressList\n\t\t\t},\n\t\t\tpromise = {\n\t\t\t\tdone: doneList.add,\n\t\t\t\tfail: failList.add,\n\t\t\t\tprogress: progressList.add,\n\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\n\t\t\t\t// Deprecated\n\t\t\t\tisResolved: doneList.fired,\n\t\t\t\tisRejected: failList.fired,\n\n\t\t\t\tthen: function( doneCallbacks, failCallbacks, progressCallbacks ) {\n\t\t\t\t\tdeferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tpipe: function( fnDone, fnFail, fnProgress ) {\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( {\n\t\t\t\t\t\t\tdone: [ fnDone, \"resolve\" ],\n\t\t\t\t\t\t\tfail: [ fnFail, \"reject\" ],\n\t\t\t\t\t\t\tprogress: [ fnProgress, \"notify\" ]\n\t\t\t\t\t\t}, function( handler, data ) {\n\t\t\t\t\t\t\tvar fn = data[ 0 ],\n\t\t\t\t\t\t\t\taction = data[ 1 ],\n\t\t\t\t\t\t\t\treturned;\n\t\t\t\t\t\t\tif ( jQuery.isFunction( fn ) ) {\n\t\t\t\t\t\t\t\tdeferred[ handler ](function() {\n\t\t\t\t\t\t\t\t\treturned = fn.apply( this, arguments );\n\t\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\t\treturned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === deferred ? newDefer : this, [ returned ] );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdeferred[ handler ]( newDefer[ action ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\tif ( obj == null ) {\n\t\t\t\t\t\tobj = promise;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor ( var key in promise ) {\n\t\t\t\t\t\t\tobj[ key ] = promise[ key ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn obj;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = promise.promise({}),\n\t\t\tkey;\n\n\t\tfor ( key in lists ) {\n\t\t\tdeferred[ key ] = lists[ key ].fire;\n\t\t\tdeferred[ key + \"With\" ] = lists[ key ].fireWith;\n\t\t}\n\n\t\t// Handle state\n\t\tdeferred.done( function() {\n\t\t\tstate = \"resolved\";\n\t\t}, failList.disable, progressList.lock ).fail( function() {\n\t\t\tstate = \"rejected\";\n\t\t}, doneList.disable, progressList.lock );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( firstParam ) {\n\t\tvar args = sliceDeferred.call( arguments, 0 ),\n\t\t\ti = 0,\n\t\t\tlength = args.length,\n\t\t\tpValues = new Array( length ),\n\t\t\tcount = length,\n\t\t\tpCount = length,\n\t\t\tdeferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?\n\t\t\t\tfirstParam :\n\t\t\t\tjQuery.Deferred(),\n\t\t\tpromise = deferred.promise();\n\t\tfunction resolveFunc( i ) {\n\t\t\treturn function( value ) {\n\t\t\t\targs[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdeferred.resolveWith( deferred, args );\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tfunction progressFunc( i ) {\n\t\t\treturn function( value ) {\n\t\t\t\tpValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\n\t\t\t\tdeferred.notifyWith( promise, pValues );\n\t\t\t};\n\t\t}\n\t\tif ( length > 1 ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {\n\t\t\t\t\targs[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );\n\t\t\t\t} else {\n\t\t\t\t\t--count;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !count ) {\n\t\t\t\tdeferred.resolveWith( deferred, args );\n\t\t\t}\n\t\t} else if ( deferred !== firstParam ) {\n\t\t\tdeferred.resolveWith( deferred, length ? [ firstParam ] : [] );\n\t\t}\n\t\treturn promise;\n\t}\n});\n\n\n\n\njQuery.support = (function() {\n\n\tvar support,\n\t\tall,\n\t\ta,\n\t\tselect,\n\t\topt,\n\t\tinput,\n\t\tfragment,\n\t\ttds,\n\t\tevents,\n\t\teventName,\n\t\ti,\n\t\tisSupported,\n\t\tdiv = document.createElement( \"div\" ),\n\t\tdocumentElement = document.documentElement;\n\n\t// Preliminary tests\n\tdiv.setAttribute(\"className\", \"t\");\n\tdiv.innerHTML = \"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";\n\n\tall = div.getElementsByTagName( \"*\" );\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\n\t// Can't get basic test support\n\tif ( !all || !all.length || !a ) {\n\t\treturn {};\n\t}\n\n\t// First batch of supports tests\n\tselect = document.createElement( \"select\" );\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName( \"input\" )[ 0 ];\n\n\tsupport = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: ( div.firstChild.nodeType === 3 ),\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: ( a.getAttribute(\"href\") === \"/a\" ),\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.55/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: ( input.value === \"on\" ),\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// Tests for enctype support on a form(#6743)\n\t\tenctype: !!document.createElement(\"form\").enctype,\n\n\t\t// Makes sure cloning an html5 element does not cause problems\n\t\t// Where outerHTML is undefined, this still works\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\n\n\t\t// Will be defined later\n\t\tsubmitBubbles: true,\n\t\tchangeBubbles: true,\n\t\tfocusinBubbles: false,\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true,\n\t\tpixelMargin: true\n\t};\n\n\t// jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead\n\tjQuery.boxModel = support.boxModel = (document.compatMode === \"CSS1Compat\");\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\tif ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\t\tdiv.cloneNode( true ).fireEvent( \"onclick\" );\n\t}\n\n\t// Check if a radio maintains its value\n\t// after being appended to the DOM\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.setAttribute(\"type\", \"radio\");\n\tsupport.radioValue = input.value === \"t\";\n\n\tinput.setAttribute(\"checked\", \"checked\");\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( div.lastChild );\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\tfragment.removeChild( input );\n\tfragment.appendChild( div );\n\n\t// Technique from Juriy Zaytsev\n\t// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\n\t// We only care about the case where non-standard event systems\n\t// are used, namely in IE. Short-circuiting here helps us to\n\t// avoid an eval call (in setAttribute) which can cause CSP\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n\tif ( div.attachEvent ) {\n\t\tfor ( i in {\n\t\t\tsubmit: 1,\n\t\t\tchange: 1,\n\t\t\tfocusin: 1\n\t\t}) {\n\t\t\teventName = \"on\" + i;\n\t\t\tisSupported = ( eventName in div );\n\t\t\tif ( !isSupported ) {\n\t\t\t\tdiv.setAttribute( eventName, \"return;\" );\n\t\t\t\tisSupported = ( typeof div[ eventName ] === \"function\" );\n\t\t\t}\n\t\t\tsupport[ i + \"Bubbles\" ] = isSupported;\n\t\t}\n\t}\n\n\tfragment.removeChild( div );\n\n\t// Null elements to avoid leaks in IE\n\tfragment = select = opt = div = input = null;\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, outer, inner, table, td, offsetSupport,\n\t\t\tmarginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,\n\t\t\tpaddingMarginBorderVisibility, paddingMarginBorder,\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tconMarginTop = 1;\n\t\tpaddingMarginBorder = \"padding:0;margin:0;border:\";\n\t\tpositionTopLeftWidthHeight = \"position:absolute;top:0;left:0;width:1px;height:1px;\";\n\t\tpaddingMarginBorderVisibility = paddingMarginBorder + \"0;visibility:hidden;\";\n\t\tstyle = \"style='\" + positionTopLeftWidthHeight + paddingMarginBorder + \"5px solid #000;\";\n\t\thtml = \"<div \" + style + \"display:block;'><div style='\" + paddingMarginBorder + \"0;display:block;overflow:hidden;'></div></div>\" +\n\t\t\t\"<table \" + style + \"' cellpadding='0' cellspacing='0'>\" +\n\t\t\t\"<tr><td></td></tr></table>\";\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = paddingMarginBorderVisibility + \"width:0;height:0;position:static;top:0;margin-top:\" + conMarginTop + \"px\";\n\t\tbody.insertBefore( container, body.firstChild );\n\n\t\t// Construct the test element\n\t\tdiv = document.createElement(\"div\");\n\t\tcontainer.appendChild( div );\n\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\t// (only IE 8 fails this test)\n\t\tdiv.innerHTML = \"<table><tr><td style='\" + paddingMarginBorder + \"0;display:none'></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName( \"td\" );\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\t// (IE <= 8 fail this test)\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t// gets computed margin-right based on width of container. For more\n\t\t// info see bug #3333\n\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\tif ( window.getComputedStyle ) {\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tmarginDiv = document.createElement( \"div\" );\n\t\t\tmarginDiv.style.width = \"0\";\n\t\t\tmarginDiv.style.marginRight = \"0\";\n\t\t\tdiv.style.width = \"2px\";\n\t\t\tdiv.appendChild( marginDiv );\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== \"undefined\" ) {\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\t// (IE < 8 does this)\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.width = div.style.padding = \"1px\";\n\t\t\tdiv.style.border = 0;\n\t\t\tdiv.style.overflow = \"hidden\";\n\t\t\tdiv.style.display = \"inline\";\n\t\t\tdiv.style.zoom = 1;\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\t// (IE 6 does this)\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.style.overflow = \"visible\";\n\t\t\tdiv.innerHTML = \"<div style='width:5px;'></div>\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\t\t}\n\n\t\tdiv.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;\n\t\tdiv.innerHTML = html;\n\n\t\touter = div.firstChild;\n\t\tinner = outer.firstChild;\n\t\ttd = outer.nextSibling.firstChild.firstChild;\n\n\t\toffsetSupport = {\n\t\t\tdoesNotAddBorder: ( inner.offsetTop !== 5 ),\n\t\t\tdoesAddBorderForTableAndCells: ( td.offsetTop === 5 )\n\t\t};\n\n\t\tinner.style.position = \"fixed\";\n\t\tinner.style.top = \"20px\";\n\n\t\t// safari subtracts parent border width here which is 5px\n\t\toffsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );\n\t\tinner.style.position = inner.style.top = \"\";\n\n\t\touter.style.overflow = \"hidden\";\n\t\touter.style.position = \"relative\";\n\n\t\toffsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );\n\t\toffsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );\n\n\t\tif ( window.getComputedStyle ) {\n\t\t\tdiv.style.marginTop = \"1%\";\n\t\t\tsupport.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== \"1%\";\n\t\t}\n\n\t\tif ( typeof container.style.zoom !== \"undefined\" ) {\n\t\t\tcontainer.style.zoom = 1;\n\t\t}\n\n\t\tbody.removeChild( container );\n\t\tmarginDiv = div = container = null;\n\n\t\tjQuery.extend( support, offsetSupport );\n\t});\n\n\treturn support;\n})();\n\n\n\n\nvar rbrace = /^(?:\\{.*\\}|\\[.*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\njQuery.extend({\n\tcache: {},\n\n\t// Please use with caution\n\tuuid: 0,\n\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\t\t\"applet\": true\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar privateCache, thisCache, ret,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tgetByName = typeof name === \"string\",\n\n\t\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t\t// can't GC object references properly across the DOM-JS boundary\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t\t// attached directly to the object so GC can occur automatically\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,\n\t\t\tisEvents = name === \"events\";\n\n\t\t// Avoid doing any more work than we need to when trying to get data on an\n\t\t// object that has no data at all\n\t\tif ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !id ) {\n\t\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t\t// ends up in the global cache\n\t\t\tif ( isNode ) {\n\t\t\t\telem[ internalKey ] = id = ++jQuery.uuid;\n\t\t\t} else {\n\t\t\t\tid = internalKey;\n\t\t\t}\n\t\t}\n\n\t\tif ( !cache[ id ] ) {\n\t\t\tcache[ id ] = {};\n\n\t\t\t// Avoids exposing jQuery metadata on plain JS objects when the object\n\t\t\t// is serialized using JSON.stringify\n\t\t\tif ( !isNode ) {\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t\t}\n\t\t}\n\n\t\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t\t// shallow copied over onto the existing cache\n\t\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\t\tif ( pvt ) {\n\t\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t\t} else {\n\t\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t\t}\n\t\t}\n\n\t\tprivateCache = thisCache = cache[ id ];\n\n\t\t// jQuery data() is stored in a separate object inside the object's internal data\n\t\t// cache in order to avoid key collisions between internal data and user-defined\n\t\t// data.\n\t\tif ( !pvt ) {\n\t\t\tif ( !thisCache.data ) {\n\t\t\t\tthisCache.data = {};\n\t\t\t}\n\n\t\t\tthisCache = thisCache.data;\n\t\t}\n\n\t\tif ( data !== undefined ) {\n\t\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t\t}\n\n\t\t// Users should not attempt to inspect the internal events object using jQuery.data,\n\t\t// it is undocumented and subject to change. But does anyone listen? No.\n\t\tif ( isEvents && !thisCache[ name ] ) {\n\t\t\treturn privateCache.events;\n\t\t}\n\n\t\t// Check for both converted-to-camel and non-converted data property names\n\t\t// If a data property was specified\n\t\tif ( getByName ) {\n\n\t\t\t// First Try to find as-is property data\n\t\t\tret = thisCache[ name ];\n\n\t\t\t// Test for null|undefined property data\n\t\t\tif ( ret == null ) {\n\n\t\t\t\t// Try to find the camelCased property\n\t\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t\t}\n\t\t} else {\n\t\t\tret = thisCache;\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tremoveData: function( elem, name, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar thisCache, i, l,\n\n\t\t\t// Reference to internal data cache key\n\t\t\tinternalKey = jQuery.expando,\n\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tid = isNode ? elem[ internalKey ] : internalKey;\n\n\t\t// If there is already no cache entry for this object, there is no\n\t\t// purpose in continuing\n\t\tif ( !cache[ id ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( name ) {\n\n\t\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\t\tif ( thisCache ) {\n\n\t\t\t\t// Support array or space separated string names for data keys\n\t\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tname = name.split( \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\n\t\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t\t}\n\n\t\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t\t// and let the cache object itself get destroyed\n\t\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// See jQuery.data for more information\n\t\tif ( !pvt ) {\n\t\t\tdelete cache[ id ].data;\n\n\t\t\t// Don't destroy the parent cache unless the internal data object\n\t\t\t// had been the only thing left in it\n\t\t\tif ( !isEmptyDataObject(cache[ id ]) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Browsers that fail expando deletion also refuse to delete expandos on\n\t\t// the window, but it will allow it on all other JS objects; other browsers\n\t\t// don't care\n\t\t// Ensure that `cache` is not a window object #10080\n\t\tif ( jQuery.support.deleteExpando || !cache.setInterval ) {\n\t\t\tdelete cache[ id ];\n\t\t} else {\n\t\t\tcache[ id ] = null;\n\t\t}\n\n\t\t// We destroyed the cache and need to eliminate the expando on the node to avoid\n\t\t// false lookups in the cache for entries that no longer exist\n\t\tif ( isNode ) {\n\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t// we must handle all of these cases\n\t\t\tif ( jQuery.support.deleteExpando ) {\n\t\t\t\tdelete elem[ internalKey ];\n\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\telem.removeAttribute( internalKey );\n\t\t\t} else {\n\t\t\t\telem[ internalKey ] = null;\n\t\t\t}\n\t\t}\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn jQuery.data( elem, name, data, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\tif ( elem.nodeName ) {\n\t\t\tvar match = jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t\tif ( match ) {\n\t\t\t\treturn !(match === true || elem.getAttribute(\"classid\") !== match);\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar parts, part, attr, name, l,\n\t\t\telem = this[0],\n\t\t\ti = 0,\n\t\t\tdata = null;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattr = elem.attributes;\n\t\t\t\t\tfor ( l = attr.length; i < l; i++ ) {\n\t\t\t\t\t\tname = attr[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\tparts = key.split( \".\", 2 );\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\n\t\tpart = parts[1] + \"!\";\n\n\t\treturn jQuery.access( this, function( value ) {\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\tdata = this.triggerHandler( \"getData\" + part, [ parts[0] ] );\n\n\t\t\t\t// Try to fetch any internally stored data first\n\t\t\t\tif ( data === undefined && elem ) {\n\t\t\t\t\tdata = jQuery.data( elem, key );\n\t\t\t\t\tdata = dataAttr( elem, key, data );\n\t\t\t\t}\n\n\t\t\t\treturn data === undefined && parts[1] ?\n\t\t\t\t\tthis.data( parts[0] ) :\n\t\t\t\t\tdata;\n\t\t\t}\n\n\t\t\tparts[1] = value;\n\t\t\tthis.each(function() {\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.triggerHandler( \"setData\" + part, parts );\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t\tself.triggerHandler( \"changeData\" + part, parts );\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, false );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\tdata === \"false\" ? false :\n\t\t\t\tdata === \"null\" ? null :\n\t\t\t\tjQuery.isNumeric( data ) ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tfor ( var name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\nfunction handleQueueMarkDefer( elem, type, src ) {\n\tvar deferDataKey = type + \"defer\",\n\t\tqueueDataKey = type + \"queue\",\n\t\tmarkDataKey = type + \"mark\",\n\t\tdefer = jQuery._data( elem, deferDataKey );\n\tif ( defer &&\n\t\t( src === \"queue\" || !jQuery._data(elem, queueDataKey) ) &&\n\t\t( src === \"mark\" || !jQuery._data(elem, markDataKey) ) ) {\n\t\t// Give room for hard-coded callbacks to fire first\n\t\t// and eventually mark/queue something else on the element\n\t\tsetTimeout( function() {\n\t\t\tif ( !jQuery._data( elem, queueDataKey ) &&\n\t\t\t\t!jQuery._data( elem, markDataKey ) ) {\n\t\t\t\tjQuery.removeData( elem, deferDataKey, true );\n\t\t\t\tdefer.fire();\n\t\t\t}\n\t\t}, 0 );\n\t}\n}\n\njQuery.extend({\n\n\t_mark: function( elem, type ) {\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"mark\";\n\t\t\tjQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );\n\t\t}\n\t},\n\n\t_unmark: function( force, elem, type ) {\n\t\tif ( force !== true ) {\n\t\t\ttype = elem;\n\t\t\telem = force;\n\t\t\tforce = false;\n\t\t}\n\t\tif ( elem ) {\n\t\t\ttype = type || \"fx\";\n\t\t\tvar key = type + \"mark\",\n\t\t\t\tcount = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );\n\t\t\tif ( count ) {\n\t\t\t\tjQuery._data( elem, key, count );\n\t\t\t} else {\n\t\t\t\tjQuery.removeData( elem, key, true );\n\t\t\t\thandleQueueMarkDefer( elem, type, \"mark\" );\n\t\t\t}\n\t\t}\n\t},\n\n\tqueue: function( elem, type, data ) {\n\t\tvar q;\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tq = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !q || jQuery.isArray(data) ) {\n\t\t\t\t\tq = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tq.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn q || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tfn = queue.shift(),\n\t\t\thooks = {};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\tjQuery._data( elem, type + \".run\", hooks );\n\t\t\tfn.call( elem, function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t}, hooks );\n\t\t}\n\n\t\tif ( !queue.length ) {\n\t\t\tjQuery.removeData( elem, type + \"queue \" + type + \".run\", true );\n\t\t\thandleQueueMarkDefer( elem, type, \"queue\" );\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, object ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobject = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\t\tvar defer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = elements.length,\n\t\t\tcount = 1,\n\t\t\tdeferDataKey = type + \"defer\",\n\t\t\tqueueDataKey = type + \"queue\",\n\t\t\tmarkDataKey = type + \"mark\",\n\t\t\ttmp;\n\t\tfunction resolve() {\n\t\t\tif ( !( --count ) ) {\n\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t}\n\t\t}\n\t\twhile( i-- ) {\n\t\t\tif (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||\n\t\t\t\t\t( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||\n\t\t\t\t\t\tjQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&\n\t\t\t\t\tjQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( \"once memory\" ), true ) )) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( object );\n\t}\n});\n\n\n\n\nvar rclass = /[\\n\\t\\r]/g,\n\trspace = /\\s+/,\n\trreturn = /\\r/g,\n\trtype = /^(?:button|input)$/i,\n\trfocusable = /^(?:button|input|object|select|textarea)$/i,\n\trclickable = /^a(?:rea)?$/i,\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tnodeHook, boolHook, fixSpecified;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classNames, i, l, elem,\n\t\t\tsetClass, c, cl;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call(this, j, this.className) );\n\t\t\t});\n\t\t}\n\n\t\tif ( value && typeof value === \"string\" ) {\n\t\t\tclassNames = value.split( rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !elem.className && classNames.length === 1 ) {\n\t\t\t\t\t\telem.className = value;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetClass = \" \" + elem.className + \" \";\n\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tif ( !~setClass.indexOf( \" \" + classNames[ c ] + \" \" ) ) {\n\t\t\t\t\t\t\t\tsetClass += classNames[ c ] + \" \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, i, l, elem, className, c, cl;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call(this, j, this.className) );\n\t\t\t});\n\t\t}\n\n\t\tif ( (value && typeof value === \"string\") || value === undefined ) {\n\t\t\tclassNames = ( value || \"\" ).split( rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\n\t\t\t\t\tif ( value ) {\n\t\t\t\t\t\tclassName = (\" \" + elem.className + \" \").replace( rclass, \" \" );\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tclassName = className.replace(\" \" + classNames[ c ] + \" \", \" \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( className );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.className = \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisBool = typeof stateVal === \"boolean\";\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tstate = stateVal,\n\t\t\t\t\tclassNames = value.split( rspace );\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space seperated list\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// toggle whole className\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar self = jQuery(this), val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, self.val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, i, max, option,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tvalues = [],\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tone = elem.type === \"select-one\";\n\n\t\t\t\t// Nothing was selected\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\ti = one ? index : 0;\n\t\t\t\tmax = one ? index + 1 : options.length;\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\tif ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null) &&\n\t\t\t\t\t\t\t(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" )) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fixes Bug #2551 -- select.val() broken in IE after form.reset()\n\t\t\t\tif ( one && !values.length && options.length ) {\n\t\t\t\t\treturn jQuery( options[ index ] ).val();\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar values = jQuery.makeArray( value );\n\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattrFn: {\n\t\tval: true,\n\t\tcss: true,\n\t\thtml: true,\n\t\ttext: true,\n\t\tdata: true,\n\t\twidth: true,\n\t\theight: true,\n\t\toffset: true\n\t},\n\n\tattr: function( elem, name, value, pass ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( pass && name in jQuery.attrFn ) {\n\t\t\treturn jQuery( elem )[ name ]( value );\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( notxml ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\n\t\t\t} else if ( hooks && \"set\" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, \"\" + value );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\n\t\t\tret = elem.getAttribute( name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret === null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar propName, attrNames, name, l, isBool,\n\t\t\ti = 0;\n\n\t\tif ( value && elem.nodeType === 1 ) {\n\t\t\tattrNames = value.toLowerCase().split( rspace );\n\t\t\tl = attrNames.length;\n\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tname = attrNames[ i ];\n\n\t\t\t\tif ( name ) {\n\t\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\t\t\tisBool = rboolean.test( name );\n\n\t\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t\t// Do not do this for boolean attributes (see #10870)\n\t\t\t\t\tif ( !isBool ) {\n\t\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t\t}\n\t\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\n\t\t\t\t\t// Set corresponding property to false for boolean attributes\n\t\t\t\t\tif ( isBool && propName in elem ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\t// We can't allow the type property to be changed (since it causes problems in IE)\n\t\t\t\tif ( rtype.test( elem.nodeName ) && elem.parentNode ) {\n\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\n\t\t\t\t} else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to it's default in case type is set after value\n\t\t\t\t\t// This is for element creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Use the value property for back compat\n\t\t// Use the nodeHook for button elements in IE6/7 (#1954)\n\t\tvalue: {\n\t\t\tget: function( elem, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.get( elem, name );\n\t\t\t\t}\n\t\t\t\treturn name in elem ?\n\t\t\t\t\telem.value :\n\t\t\t\t\tnull;\n\t\t\t},\n\t\t\tset: function( elem, value, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.set( elem, value, name );\n\t\t\t\t}\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.value = value;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\",\n\t\tmaxlength: \"maxLength\",\n\t\tcellspacing: \"cellSpacing\",\n\t\tcellpadding: \"cellPadding\",\n\t\trowspan: \"rowSpan\",\n\t\tcolspan: \"colSpan\",\n\t\tusemap: \"useMap\",\n\t\tframeborder: \"frameBorder\",\n\t\tcontenteditable: \"contentEditable\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn ( elem[ name ] = value );\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\n\n\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tundefined;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)\njQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;\n\n// Hook for boolean attributes\nboolHook = {\n\tget: function( elem, name ) {\n\t\t// Align boolean attributes with corresponding properties\n\t\t// Fall back to attribute presence where some booleans are not supported\n\t\tvar attrNode,\n\t\t\tproperty = jQuery.prop( elem, name );\n\t\treturn property === true || typeof property !== \"boolean\" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\n\t\t\tname.toLowerCase() :\n\t\t\tundefined;\n\t},\n\tset: function( elem, value, name ) {\n\t\tvar propName;\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\t// value is true since we know at this point it's type boolean and not false\n\t\t\t// Set boolean attributes to the same name and set the DOM property\n\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\tif ( propName in elem ) {\n\t\t\t\t// Only set the IDL specifically if it already exists on the element\n\t\t\t\telem[ propName ] = true;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, name.toLowerCase() );\n\t\t}\n\t\treturn name;\n\t}\n};\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\tfixSpecified = {\n\t\tname: true,\n\t\tid: true,\n\t\tcoords: true\n\t};\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = jQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret;\n\t\t\tret = elem.getAttributeNode( name );\n\t\t\treturn ret && ( fixSpecified[ name ] ? ret.nodeValue !== \"\" : ret.specified ) ?\n\t\t\t\tret.nodeValue :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\tret = document.createAttribute( name );\n\t\t\t\telem.setAttributeNode( ret );\n\t\t\t}\n\t\t\treturn ( ret.nodeValue = value + \"\" );\n\t\t}\n\t};\n\n\t// Apply the nodeHook to tabindex\n\tjQuery.attrHooks.tabindex.set = nodeHook.set;\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tget: nodeHook.get,\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = \"false\";\n\t\t\t}\n\t\t\tnodeHook.set( elem, value, name );\n\t\t}\n\t};\n}\n\n\n// Some attributes require a special call on IE\nif ( !jQuery.support.hrefNormalized ) {\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\t\t\t\treturn ret === null ? undefined : ret;\n\t\t\t}\n\t\t});\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Normalize to lowercase since IE uppercases css property names\n\t\t\treturn elem.style.cssText.toLowerCase() || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = \"\" + value );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t});\n}\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\t\tjQuery.valHooks[ this ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t}\n\t\t};\n\t});\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t});\n});\n\n\n\n\nvar rformElems = /^(?:textarea|input|select)$/i,\n\trtypenamespace = /^([^\\.]*)?(?:\\.(.+))?$/,\n\trhoverHack = /(?:^|\\s)hover(\\.\\S+)?\\b/,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trquickIs = /^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,\n\tquickParse = function( selector ) {\n\t\tvar quick = rquickIs.exec( selector );\n\t\tif ( quick ) {\n\t\t\t//   0  1    2   3\n\t\t\t// [ _, tag, id, class ]\n\t\t\tquick[1] = ( quick[1] || \"\" ).toLowerCase();\n\t\t\tquick[3] = quick[3] && new RegExp( \"(?:^|\\\\s)\" + quick[3] + \"(?:\\\\s|$)\" );\n\t\t}\n\t\treturn quick;\n\t},\n\tquickIs = function( elem, m ) {\n\t\tvar attrs = elem.attributes || {};\n\t\treturn (\n\t\t\t(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&\n\t\t\t(!m[2] || (attrs.id || {}).value === m[2]) &&\n\t\t\t(!m[3] || m[3].test( (attrs[ \"class\" ] || {}).value ))\n\t\t);\n\t},\n\thoverHack = function( events ) {\n\t\treturn jQuery.event.special.hover ? events : events.replace( rhoverHack, \"mouseenter$1 mouseleave$1\" );\n\t};\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar elemData, eventHandle, events,\n\t\t\tt, tns, type, namespaces, handleObj,\n\t\t\thandleObjIn, quick, handlers, special;\n\n\t\t// Don't attach events to noData or text/comment nodes (allow plain objects tho)\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tevents = elemData.events;\n\t\tif ( !events ) {\n\t\t\telemData.events = events = {};\n\t\t}\n\t\teventHandle = elemData.handle;\n\t\tif ( !eventHandle ) {\n\t\t\telemData.handle = eventHandle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = jQuery.trim( hoverHack(types) ).split( \" \" );\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = tns[1];\n\t\t\tnamespaces = ( tns[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: tns[1],\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tquick: selector && quickParse( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\thandlers = events[ type ];\n\t\t\tif ( !handlers ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\tglobal: {},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar elemData = jQuery.hasData( elem ) && jQuery._data( elem ),\n\t\t\tt, tns, type, origType, namespaces, origCount,\n\t\t\tj, events, special, handle, eventType, handleObj;\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = jQuery.trim( hoverHack( types || \"\" ) ).split(\" \");\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tns[1];\n\t\t\tnamespaces = tns[2];\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector? special.delegateType : special.bindType ) || type;\n\t\t\teventType = events[ type ] || [];\n\t\t\torigCount = eventType.length;\n\t\t\tnamespaces = namespaces ? new RegExp(\"(^|\\\\.)\" + namespaces.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\n\n\t\t\t// Remove matching events\n\t\t\tfor ( j = 0; j < eventType.length; j++ ) {\n\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t ( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t ( !namespaces || namespaces.test( handleObj.namespace ) ) &&\n\t\t\t\t\t ( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\teventType.splice( j--, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\teventType.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( eventType.length === 0 && origCount !== eventType.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\thandle = elemData.handle;\n\t\t\tif ( handle ) {\n\t\t\t\thandle.elem = null;\n\t\t\t}\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery.removeData( elem, [ \"events\", \"handle\" ], true );\n\t\t}\n\t},\n\n\t// Events that are safe to short-circuit if no handlers are attached.\n\t// Native DOM events should not be added, they may have inline handlers.\n\tcustomEvent: {\n\t\t\"getData\": true,\n\t\t\"setData\": true,\n\t\t\"changeData\": true\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Event object or event type\n\t\tvar type = event.type || event,\n\t\t\tnamespaces = [],\n\t\t\tcache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \"!\" ) >= 0 ) {\n\t\t\t// Exclusive events trigger only for the exact event (no namespaces)\n\t\t\ttype = type.slice(0, -1);\n\t\t\texclusive = true;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\n\t\tif ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\n\t\t\t// No jQuery handlers for this event type, and it can't have inline handlers\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an Event, Object, or just an event type string\n\t\tevent = typeof event === \"object\" ?\n\t\t\t// jQuery.Event object\n\t\t\tevent[ jQuery.expando ] ? event :\n\t\t\t// Object literal\n\t\t\tnew jQuery.Event( type, event ) :\n\t\t\t// Just the event type (string)\n\t\t\tnew jQuery.Event( type );\n\n\t\tevent.type = type;\n\t\tevent.isTrigger = true;\n\t\tevent.exclusive = exclusive;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.namespace_re = event.namespace? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\n\t\tontype = type.indexOf( \":\" ) < 0 ? \"on\" + type : \"\";\n\n\t\t// Handle a global trigger\n\t\tif ( !elem ) {\n\n\t\t\t// TODO: Stop taunting the data cache; remove global events and always attach to document\n\t\t\tcache = jQuery.cache;\n\t\t\tfor ( i in cache ) {\n\t\t\t\tif ( cache[ i ].events && cache[ i ].events[ type ] ) {\n\t\t\t\t\tjQuery.event.trigger( event, data, cache[ i ].handle.elem, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data != null ? jQuery.makeArray( data ) : [];\n\t\tdata.unshift( event );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\teventPath = [[ elem, special.bindType || type ]];\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tcur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;\n\t\t\told = null;\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push([ cur, bubbleType ]);\n\t\t\t\told = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( old && old === elem.ownerDocument ) {\n\t\t\t\teventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\tfor ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {\n\n\t\t\tcur = eventPath[i][0];\n\t\t\tevent.type = eventPath[i][1];\n\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\t\t\t// Note that this is a bare JS function and not a jQuery handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486)\n\t\t\t\tif ( ontype && elem[ type ] && ((type !== \"focus\" && type !== \"blur\") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\told = elem[ ontype ];\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\telem[ ontype ] = old;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event || window.event );\n\n\t\tvar handlers = ( (jQuery._data( this, \"events\" ) || {} )[ event.type ] || []),\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\targs = [].slice.call( arguments, 0 ),\n\t\t\trun_all = !event.exclusive && !event.namespace,\n\t\t\tspecial = jQuery.event.special[ event.type ] || {},\n\t\t\thandlerQueue = [],\n\t\t\ti, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers that should run if there are delegated events\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && !(event.button && event.type === \"click\") ) {\n\n\t\t\t// Pregenerate a single jQuery object for reuse with .is()\n\t\t\tjqcur = jQuery(this);\n\t\t\tjqcur.context = this.ownerDocument || this;\n\n\t\t\tfor ( cur = event.target; cur != this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process events on disabled elements (#6911, #8165)\n\t\t\t\tif ( cur.disabled !== true ) {\n\t\t\t\t\tselMatch = {};\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tjqcur[0] = cur;\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\t\t\t\t\t\tsel = handleObj.selector;\n\n\t\t\t\t\t\tif ( selMatch[ sel ] === undefined ) {\n\t\t\t\t\t\t\tselMatch[ sel ] = (\n\t\t\t\t\t\t\t\thandleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( selMatch[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, matches: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( handlers.length > delegateCount ) {\n\t\t\thandlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\tfor ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {\n\t\t\tmatched = handlerQueue[ i ];\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tfor ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {\n\t\t\t\thandleObj = matched.matches[ j ];\n\n\t\t\t\t// Triggered event must either 1) be non-exclusive and have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.data = handleObj.data;\n\t\t\t\t\tevent.handleObj = handleObj;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tevent.result = ret;\n\t\t\t\t\t\tif ( ret === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\t// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***\n\tprops: \"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = jQuery.event.fixHooks[ event.type ] || {},\n\t\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = jQuery.Event( originalEvent );\n\n\t\tfor ( i = copy.length; i; ) {\n\t\t\tprop = copy[ --i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Target should not be a text node (#504, Safari)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)\n\t\tif ( event.metaKey === undefined ) {\n\t\t\tevent.metaKey = event.ctrlKey;\n\t\t}\n\n\t\treturn fixHook.filter? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tready: {\n\t\t\t// Make sure the ready event is setup\n\t\t\tsetup: jQuery.bindReady\n\t\t},\n\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\n\t\tfocus: {\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\n\t\t\t\t// We only want to do this special case on windows\n\t\t\t\tif ( jQuery.isWindow( this ) ) {\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tteardown: function( namespaces, eventHandle ) {\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\n\t\t\t\t\tthis.onbeforeunload = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{ type: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\n// Some plugins are using, but it's undocumented/deprecated and will be removed.\n// The 1.7 special event interface should provide all the hooks needed now.\njQuery.event.handle = jQuery.event.dispatch;\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.detachEvent ) {\n\t\t\telem.detachEvent( \"on\" + type, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\nfunction returnFalse() {\n\treturn false;\n}\nfunction returnTrue() {\n\treturn true;\n}\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tpreventDefault: function() {\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// if preventDefault exists run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// otherwise set the returnValue property of the original event to false (IE)\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// if stopPropagation exists run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t},\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar target = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj,\n\t\t\t\tselector = handleObj.selector,\n\t\t\t\tret;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !form._submit_attached ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tform._submit_attached = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\t\t\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\telem._change_attached = true;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) { // && selector != null\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\tvar handleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( var type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tlive: function( types, data, fn ) {\n\t\tjQuery( this.context ).on( types, this.selector, data, fn );\n\t\treturn this;\n\t},\n\tdie: function( types, fn ) {\n\t\tjQuery( this.context ).off( types, this.selector || \"**\", fn );\n\t\treturn this;\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length == 1? this.off( selector, \"**\" ) : this.off( types, selector, fn );\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tif ( this[0] ) {\n\t\t\treturn jQuery.event.trigger( type, data, this[0], true );\n\t\t}\n\t},\n\n\ttoggle: function( fn ) {\n\t\t// Save reference to arguments for access in closure\n\t\tvar args = arguments,\n\t\t\tguid = fn.guid || jQuery.guid++,\n\t\t\ti = 0,\n\t\t\ttoggler = function( event ) {\n\t\t\t\t// Figure out which function to execute\n\t\t\t\tvar lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n\t\t\t\tjQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n\t\t\t\t// Make sure that clicks stop\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// and execute the function\n\t\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\n\t\t\t};\n\n\t\t// link all the functions, so any of them can unbind this click handler\n\t\ttoggler.guid = guid;\n\t\twhile ( i < args.length ) {\n\t\t\targs[ i++ ].guid = guid;\n\t\t}\n\n\t\treturn this.click( toggler );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n});\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\tif ( fn == null ) {\n\t\t\tfn = data;\n\t\t\tdata = null;\n\t\t}\n\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n\n\tif ( jQuery.attrFn ) {\n\t\tjQuery.attrFn[ name ] = true;\n\t}\n\n\tif ( rkeyEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;\n\t}\n\n\tif ( rmouseEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;\n\t}\n});\n\n\n\n/*!\n * Sizzle CSS Selector Engine\n *  Copyright 2011, The Dojo Foundation\n *  Released under the MIT, BSD, and GPL Licenses.\n *  More information: http://sizzlejs.com/\n */\n(function(){\n\nvar chunker = /((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,\n\texpando = \"sizcache\" + (Math.random() + '').replace('.', ''),\n\tdone = 0,\n\ttoString = Object.prototype.toString,\n\thasDuplicate = false,\n\tbaseHasDuplicate = true,\n\trBackslash = /\\\\/g,\n\trReturn = /\\r\\n/g,\n\trNonWord = /\\W/;\n\n// Here we check if the JavaScript engine is using some sort of\n// optimization where it does not always call our comparision\n// function. If that is the case, discard the hasDuplicate value.\n//   Thus far that includes Google Chrome.\n[0, 0].sort(function() {\n\tbaseHasDuplicate = false;\n\treturn 0;\n});\n\nvar Sizzle = function( selector, context, results, seed ) {\n\tresults = results || [];\n\tcontext = context || document;\n\n\tvar origContext = context;\n\n\tif ( context.nodeType !== 1 && context.nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tvar m, set, checkSet, extra, ret, cur, pop, i,\n\t\tprune = true,\n\t\tcontextXML = Sizzle.isXML( context ),\n\t\tparts = [],\n\t\tsoFar = selector;\n\n\t// Reset the position of the chunker regexp (start from head)\n\tdo {\n\t\tchunker.exec( \"\" );\n\t\tm = chunker.exec( soFar );\n\n\t\tif ( m ) {\n\t\t\tsoFar = m[3];\n\n\t\t\tparts.push( m[1] );\n\n\t\t\tif ( m[2] ) {\n\t\t\t\textra = m[3];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} while ( m );\n\n\tif ( parts.length > 1 && origPOS.exec( selector ) ) {\n\n\t\tif ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\n\t\t\tset = posProcess( parts[0] + parts[1], context, seed );\n\n\t\t} else {\n\t\t\tset = Expr.relative[ parts[0] ] ?\n\t\t\t\t[ context ] :\n\t\t\t\tSizzle( parts.shift(), context );\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tselector = parts.shift();\n\n\t\t\t\tif ( Expr.relative[ selector ] ) {\n\t\t\t\t\tselector += parts.shift();\n\t\t\t\t}\n\n\t\t\t\tset = posProcess( selector, set, seed );\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t// (but not if it'll be faster if the inner selector is an ID)\n\t\tif ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\n\t\t\t\tExpr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\n\n\t\t\tret = Sizzle.find( parts.shift(), context, contextXML );\n\t\t\tcontext = ret.expr ?\n\t\t\t\tSizzle.filter( ret.expr, ret.set )[0] :\n\t\t\t\tret.set[0];\n\t\t}\n\n\t\tif ( context ) {\n\t\t\tret = seed ?\n\t\t\t\t{ expr: parts.pop(), set: makeArray(seed) } :\n\t\t\t\tSizzle.find( parts.pop(), parts.length === 1 && (parts[0] === \"~\" || parts[0] === \"+\") && context.parentNode ? context.parentNode : context, contextXML );\n\n\t\t\tset = ret.expr ?\n\t\t\t\tSizzle.filter( ret.expr, ret.set ) :\n\t\t\t\tret.set;\n\n\t\t\tif ( parts.length > 0 ) {\n\t\t\t\tcheckSet = makeArray( set );\n\n\t\t\t} else {\n\t\t\t\tprune = false;\n\t\t\t}\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tcur = parts.pop();\n\t\t\t\tpop = cur;\n\n\t\t\t\tif ( !Expr.relative[ cur ] ) {\n\t\t\t\t\tcur = \"\";\n\t\t\t\t} else {\n\t\t\t\t\tpop = parts.pop();\n\t\t\t\t}\n\n\t\t\t\tif ( pop == null ) {\n\t\t\t\t\tpop = context;\n\t\t\t\t}\n\n\t\t\t\tExpr.relative[ cur ]( checkSet, pop, contextXML );\n\t\t\t}\n\n\t\t} else {\n\t\t\tcheckSet = parts = [];\n\t\t}\n\t}\n\n\tif ( !checkSet ) {\n\t\tcheckSet = set;\n\t}\n\n\tif ( !checkSet ) {\n\t\tSizzle.error( cur || selector );\n\t}\n\n\tif ( toString.call(checkSet) === \"[object Array]\" ) {\n\t\tif ( !prune ) {\n\t\t\tresults.push.apply( results, checkSet );\n\n\t\t} else if ( context && context.nodeType === 1 ) {\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && checkSet[i].nodeType === 1 ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\tmakeArray( checkSet, results );\n\t}\n\n\tif ( extra ) {\n\t\tSizzle( extra, origContext, results, seed );\n\t\tSizzle.uniqueSort( results );\n\t}\n\n\treturn results;\n};\n\nSizzle.uniqueSort = function( results ) {\n\tif ( sortOrder ) {\n\t\thasDuplicate = baseHasDuplicate;\n\t\tresults.sort( sortOrder );\n\n\t\tif ( hasDuplicate ) {\n\t\t\tfor ( var i = 1; i < results.length; i++ ) {\n\t\t\t\tif ( results[i] === results[ i - 1 ] ) {\n\t\t\t\t\tresults.splice( i--, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n};\n\nSizzle.matches = function( expr, set ) {\n\treturn Sizzle( expr, null, null, set );\n};\n\nSizzle.matchesSelector = function( node, expr ) {\n\treturn Sizzle( expr, null, null, [node] ).length > 0;\n};\n\nSizzle.find = function( expr, context, isXML ) {\n\tvar set, i, len, match, type, left;\n\n\tif ( !expr ) {\n\t\treturn [];\n\t}\n\n\tfor ( i = 0, len = Expr.order.length; i < len; i++ ) {\n\t\ttype = Expr.order[i];\n\n\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\n\t\t\tleft = match[1];\n\t\t\tmatch.splice( 1, 1 );\n\n\t\t\tif ( left.substr( left.length - 1 ) !== \"\\\\\" ) {\n\t\t\t\tmatch[1] = (match[1] || \"\").replace( rBackslash, \"\" );\n\t\t\t\tset = Expr.find[ type ]( match, context, isXML );\n\n\t\t\t\tif ( set != null ) {\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !set ) {\n\t\tset = typeof context.getElementsByTagName !== \"undefined\" ?\n\t\t\tcontext.getElementsByTagName( \"*\" ) :\n\t\t\t[];\n\t}\n\n\treturn { set: set, expr: expr };\n};\n\nSizzle.filter = function( expr, set, inplace, not ) {\n\tvar match, anyFound,\n\t\ttype, found, item, filter, left,\n\t\ti, pass,\n\t\told = expr,\n\t\tresult = [],\n\t\tcurLoop = set,\n\t\tisXMLFilter = set && set[0] && Sizzle.isXML( set[0] );\n\n\twhile ( expr && set.length ) {\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\n\t\t\t\tfilter = Expr.filter[ type ];\n\t\t\t\tleft = match[1];\n\n\t\t\t\tanyFound = false;\n\n\t\t\t\tmatch.splice(1,1);\n\n\t\t\t\tif ( left.substr( left.length - 1 ) === \"\\\\\" ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( curLoop === result ) {\n\t\t\t\t\tresult = [];\n\t\t\t\t}\n\n\t\t\t\tif ( Expr.preFilter[ type ] ) {\n\t\t\t\t\tmatch = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );\n\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\tanyFound = found = true;\n\n\t\t\t\t\t} else if ( match === true ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\tfor ( i = 0; (item = curLoop[i]) != null; i++ ) {\n\t\t\t\t\t\tif ( item ) {\n\t\t\t\t\t\t\tfound = filter( item, match, i, curLoop );\n\t\t\t\t\t\t\tpass = not ^ found;\n\n\t\t\t\t\t\t\tif ( inplace && found != null ) {\n\t\t\t\t\t\t\t\tif ( pass ) {\n\t\t\t\t\t\t\t\t\tanyFound = true;\n\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else if ( pass ) {\n\t\t\t\t\t\t\t\tresult.push( item );\n\t\t\t\t\t\t\t\tanyFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( found !== undefined ) {\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tcurLoop = result;\n\t\t\t\t\t}\n\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\n\t\t\t\t\tif ( !anyFound ) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Improper expression\n\t\tif ( expr === old ) {\n\t\t\tif ( anyFound == null ) {\n\t\t\t\tSizzle.error( expr );\n\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\told = expr;\n\t}\n\n\treturn curLoop;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Utility function for retreiving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\nvar getText = Sizzle.getText = function( elem ) {\n    var i, node,\n\t\tnodeType = elem.nodeType,\n\t\tret = \"\";\n\n\tif ( nodeType ) {\n\t\tif ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t\t// Use textContent || innerText for elements\n\t\t\tif ( typeof elem.textContent === 'string' ) {\n\t\t\t\treturn elem.textContent;\n\t\t\t} else if ( typeof elem.innerText === 'string' ) {\n\t\t\t\t// Replace IE's carriage returns\n\t\t\t\treturn elem.innerText.replace( rReturn, '' );\n\t\t\t} else {\n\t\t\t\t// Traverse it's children\n\t\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling) {\n\t\t\t\t\tret += getText( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\t} else {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( i = 0; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tif ( node.nodeType !== 8 ) {\n\t\t\t\tret += getText( node );\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n};\n\nvar Expr = Sizzle.selectors = {\n\torder: [ \"ID\", \"NAME\", \"TAG\" ],\n\n\tmatch: {\n\t\tID: /#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n\t\tCLASS: /\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n\t\tNAME: /\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,\n\t\tATTR: /\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,\n\t\tTAG: /^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,\n\t\tCHILD: /:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,\n\t\tPOS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,\n\t\tPSEUDO: /:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/\n\t},\n\n\tleftMatch: {},\n\n\tattrMap: {\n\t\t\"class\": \"className\",\n\t\t\"for\": \"htmlFor\"\n\t},\n\n\tattrHandle: {\n\t\thref: function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\" );\n\t\t},\n\t\ttype: function( elem ) {\n\t\t\treturn elem.getAttribute( \"type\" );\n\t\t}\n\t},\n\n\trelative: {\n\t\t\"+\": function(checkSet, part){\n\t\t\tvar isPartStr = typeof part === \"string\",\n\t\t\t\tisTag = isPartStr && !rNonWord.test( part ),\n\t\t\t\tisPartStrNotTag = isPartStr && !isTag;\n\n\t\t\tif ( isTag ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\n\t\t\t\tif ( (elem = checkSet[i]) ) {\n\t\t\t\t\twhile ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\n\n\t\t\t\t\tcheckSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\n\t\t\t\t\t\telem || false :\n\t\t\t\t\t\telem === part;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( isPartStrNotTag ) {\n\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t}\n\t\t},\n\n\t\t\">\": function( checkSet, part ) {\n\t\t\tvar elem,\n\t\t\t\tisPartStr = typeof part === \"string\",\n\t\t\t\ti = 0,\n\t\t\t\tl = checkSet.length;\n\n\t\t\tif ( isPartStr && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\telem = checkSet[i];\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tvar parent = elem.parentNode;\n\t\t\t\t\t\tcheckSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\telem = checkSet[i];\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tcheckSet[i] = isPartStr ?\n\t\t\t\t\t\t\telem.parentNode :\n\t\t\t\t\t\t\telem.parentNode === part;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( isPartStr ) {\n\t\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t\"\": function(checkSet, part, isXML){\n\t\t\tvar nodeCheck,\n\t\t\t\tdoneName = done++,\n\t\t\t\tcheckFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t\tnodeCheck = part;\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn( \"parentNode\", part, doneName, checkSet, nodeCheck, isXML );\n\t\t},\n\n\t\t\"~\": function( checkSet, part, isXML ) {\n\t\t\tvar nodeCheck,\n\t\t\t\tdoneName = done++,\n\t\t\t\tcheckFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t\tnodeCheck = part;\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn( \"previousSibling\", part, doneName, checkSet, nodeCheck, isXML );\n\t\t}\n\t},\n\n\tfind: {\n\t\tID: function( match, context, isXML ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t},\n\n\t\tNAME: function( match, context ) {\n\t\t\tif ( typeof context.getElementsByName !== \"undefined\" ) {\n\t\t\t\tvar ret = [],\n\t\t\t\t\tresults = context.getElementsByName( match[1] );\n\n\t\t\t\tfor ( var i = 0, l = results.length; i < l; i++ ) {\n\t\t\t\t\tif ( results[i].getAttribute(\"name\") === match[1] ) {\n\t\t\t\t\t\tret.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn ret.length === 0 ? null : ret;\n\t\t\t}\n\t\t},\n\n\t\tTAG: function( match, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( match[1] );\n\t\t\t}\n\t\t}\n\t},\n\tpreFilter: {\n\t\tCLASS: function( match, curLoop, inplace, result, not, isXML ) {\n\t\t\tmatch = \" \" + match[1].replace( rBackslash, \"\" ) + \" \";\n\n\t\t\tif ( isXML ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\tfor ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\n\t\t\t\tif ( elem ) {\n\t\t\t\t\tif ( not ^ (elem.className && (\" \" + elem.className + \" \").replace(/[\\t\\n\\r]/g, \" \").indexOf(match) >= 0) ) {\n\t\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\t\tresult.push( elem );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( inplace ) {\n\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\tID: function( match ) {\n\t\t\treturn match[1].replace( rBackslash, \"\" );\n\t\t},\n\n\t\tTAG: function( match, curLoop ) {\n\t\t\treturn match[1].replace( rBackslash, \"\" ).toLowerCase();\n\t\t},\n\n\t\tCHILD: function( match ) {\n\t\t\tif ( match[1] === \"nth\" ) {\n\t\t\t\tif ( !match[2] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\tmatch[2] = match[2].replace(/^\\+|\\s*/g, '');\n\n\t\t\t\t// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\n\t\t\t\tvar test = /(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(\n\t\t\t\t\tmatch[2] === \"even\" && \"2n\" || match[2] === \"odd\" && \"2n+1\" ||\n\t\t\t\t\t!/\\D/.test( match[2] ) && \"0n+\" + match[2] || match[2]);\n\n\t\t\t\t// calculate the numbers (first)n+(last) including if they are negative\n\t\t\t\tmatch[2] = (test[1] + (test[2] || 1)) - 0;\n\t\t\t\tmatch[3] = test[3] - 0;\n\t\t\t}\n\t\t\telse if ( match[2] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\t// TODO: Move to normal caching system\n\t\t\tmatch[0] = done++;\n\n\t\t\treturn match;\n\t\t},\n\n\t\tATTR: function( match, curLoop, inplace, result, not, isXML ) {\n\t\t\tvar name = match[1] = match[1].replace( rBackslash, \"\" );\n\n\t\t\tif ( !isXML && Expr.attrMap[name] ) {\n\t\t\t\tmatch[1] = Expr.attrMap[name];\n\t\t\t}\n\n\t\t\t// Handle if an un-quoted value was used\n\t\t\tmatch[4] = ( match[4] || match[5] || \"\" ).replace( rBackslash, \"\" );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[4] = \" \" + match[4] + \" \";\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match, curLoop, inplace, result, not ) {\n\t\t\tif ( match[1] === \"not\" ) {\n\t\t\t\t// If we're dealing with a complex expression, or a simple one\n\t\t\t\tif ( ( chunker.exec(match[3]) || \"\" ).length > 1 || /^\\w/.test(match[3]) ) {\n\t\t\t\t\tmatch[3] = Sizzle(match[3], null, null, curLoop);\n\n\t\t\t\t} else {\n\t\t\t\t\tvar ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\n\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tresult.push.apply( result, ret );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPOS: function( match ) {\n\t\t\tmatch.unshift( true );\n\n\t\t\treturn match;\n\t\t}\n\t},\n\n\tfilters: {\n\t\tenabled: function( elem ) {\n\t\t\treturn elem.disabled === false && elem.type !== \"hidden\";\n\t\t},\n\n\t\tdisabled: function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\tchecked: function( elem ) {\n\t\t\treturn elem.checked === true;\n\t\t},\n\n\t\tselected: function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !!elem.firstChild;\n\t\t},\n\n\t\tempty: function( elem ) {\n\t\t\treturn !elem.firstChild;\n\t\t},\n\n\t\thas: function( elem, i, match ) {\n\t\t\treturn !!Sizzle( match[3], elem ).length;\n\t\t},\n\n\t\theader: function( elem ) {\n\t\t\treturn (/h\\d/i).test( elem.nodeName );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr = elem.getAttribute( \"type\" ), type = elem.type;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"text\" === type && ( attr === type || attr === null );\n\t\t},\n\n\t\tradio: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"radio\" === elem.type;\n\t\t},\n\n\t\tcheckbox: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"checkbox\" === elem.type;\n\t\t},\n\n\t\tfile: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"file\" === elem.type;\n\t\t},\n\n\t\tpassword: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"password\" === elem.type;\n\t\t},\n\n\t\tsubmit: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && \"submit\" === elem.type;\n\t\t},\n\n\t\timage: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"image\" === elem.type;\n\t\t},\n\n\t\treset: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && \"reset\" === elem.type;\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && \"button\" === elem.type || name === \"button\";\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn (/input|select|textarea|button/i).test( elem.nodeName );\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === elem.ownerDocument.activeElement;\n\t\t}\n\t},\n\tsetFilters: {\n\t\tfirst: function( elem, i ) {\n\t\t\treturn i === 0;\n\t\t},\n\n\t\tlast: function( elem, i, match, array ) {\n\t\t\treturn i === array.length - 1;\n\t\t},\n\n\t\teven: function( elem, i ) {\n\t\t\treturn i % 2 === 0;\n\t\t},\n\n\t\todd: function( elem, i ) {\n\t\t\treturn i % 2 === 1;\n\t\t},\n\n\t\tlt: function( elem, i, match ) {\n\t\t\treturn i < match[3] - 0;\n\t\t},\n\n\t\tgt: function( elem, i, match ) {\n\t\t\treturn i > match[3] - 0;\n\t\t},\n\n\t\tnth: function( elem, i, match ) {\n\t\t\treturn match[3] - 0 === i;\n\t\t},\n\n\t\teq: function( elem, i, match ) {\n\t\t\treturn match[3] - 0 === i;\n\t\t}\n\t},\n\tfilter: {\n\t\tPSEUDO: function( elem, match, i, array ) {\n\t\t\tvar name = match[1],\n\t\t\t\tfilter = Expr.filters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\n\t\t\t} else if ( name === \"contains\" ) {\n\t\t\t\treturn (elem.textContent || elem.innerText || getText([ elem ]) || \"\").indexOf(match[3]) >= 0;\n\n\t\t\t} else if ( name === \"not\" ) {\n\t\t\t\tvar not = match[3];\n\n\t\t\t\tfor ( var j = 0, l = not.length; j < l; j++ ) {\n\t\t\t\t\tif ( not[j] === elem ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\t\t\t\tSizzle.error( name );\n\t\t\t}\n\t\t},\n\n\t\tCHILD: function( elem, match ) {\n\t\t\tvar first, last,\n\t\t\t\tdoneName, parent, cache,\n\t\t\t\tcount, diff,\n\t\t\t\ttype = match[1],\n\t\t\t\tnode = elem;\n\n\t\t\tswitch ( type ) {\n\t\t\t\tcase \"only\":\n\t\t\t\tcase \"first\":\n\t\t\t\t\twhile ( (node = node.previousSibling) ) {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( type === \"first\" ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tnode = elem;\n\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase \"last\":\n\t\t\t\t\twhile ( (node = node.nextSibling) ) {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\tcase \"nth\":\n\t\t\t\t\tfirst = match[2];\n\t\t\t\t\tlast = match[3];\n\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tdoneName = match[0];\n\t\t\t\t\tparent = elem.parentNode;\n\n\t\t\t\t\tif ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {\n\t\t\t\t\t\tcount = 0;\n\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\tnode.nodeIndex = ++count;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent[ expando ] = doneName;\n\t\t\t\t\t}\n\n\t\t\t\t\tdiff = elem.nodeIndex - last;\n\n\t\t\t\t\tif ( first === 0 ) {\n\t\t\t\t\t\treturn diff === 0;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tID: function( elem, match ) {\n\t\t\treturn elem.nodeType === 1 && elem.getAttribute(\"id\") === match;\n\t\t},\n\n\t\tTAG: function( elem, match ) {\n\t\t\treturn (match === \"*\" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;\n\t\t},\n\n\t\tCLASS: function( elem, match ) {\n\t\t\treturn (\" \" + (elem.className || elem.getAttribute(\"class\")) + \" \")\n\t\t\t\t.indexOf( match ) > -1;\n\t\t},\n\n\t\tATTR: function( elem, match ) {\n\t\t\tvar name = match[1],\n\t\t\t\tresult = Sizzle.attr ?\n\t\t\t\t\tSizzle.attr( elem, name ) :\n\t\t\t\t\tExpr.attrHandle[ name ] ?\n\t\t\t\t\tExpr.attrHandle[ name ]( elem ) :\n\t\t\t\t\telem[ name ] != null ?\n\t\t\t\t\t\telem[ name ] :\n\t\t\t\t\t\telem.getAttribute( name ),\n\t\t\t\tvalue = result + \"\",\n\t\t\t\ttype = match[2],\n\t\t\t\tcheck = match[4];\n\n\t\t\treturn result == null ?\n\t\t\t\ttype === \"!=\" :\n\t\t\t\t!type && Sizzle.attr ?\n\t\t\t\tresult != null :\n\t\t\t\ttype === \"=\" ?\n\t\t\t\tvalue === check :\n\t\t\t\ttype === \"*=\" ?\n\t\t\t\tvalue.indexOf(check) >= 0 :\n\t\t\t\ttype === \"~=\" ?\n\t\t\t\t(\" \" + value + \" \").indexOf(check) >= 0 :\n\t\t\t\t!check ?\n\t\t\t\tvalue && result !== false :\n\t\t\t\ttype === \"!=\" ?\n\t\t\t\tvalue !== check :\n\t\t\t\ttype === \"^=\" ?\n\t\t\t\tvalue.indexOf(check) === 0 :\n\t\t\t\ttype === \"$=\" ?\n\t\t\t\tvalue.substr(value.length - check.length) === check :\n\t\t\t\ttype === \"|=\" ?\n\t\t\t\tvalue === check || value.substr(0, check.length + 1) === check + \"-\" :\n\t\t\t\tfalse;\n\t\t},\n\n\t\tPOS: function( elem, match, i, array ) {\n\t\t\tvar name = match[2],\n\t\t\t\tfilter = Expr.setFilters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar origPOS = Expr.match.POS,\n\tfescape = function(all, num){\n\t\treturn \"\\\\\" + (num - 0 + 1);\n\t};\n\nfor ( var type in Expr.match ) {\n\tExpr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\\[]*\\])(?![^\\(]*\\))/.source) );\n\tExpr.leftMatch[ type ] = new RegExp( /(^(?:.|\\r|\\n)*?)/.source + Expr.match[ type ].source.replace(/\\\\(\\d+)/g, fescape) );\n}\n// Expose origPOS\n// \"global\" as in regardless of relation to brackets/parens\nExpr.match.globalPOS = origPOS;\n\nvar makeArray = function( array, results ) {\n\tarray = Array.prototype.slice.call( array, 0 );\n\n\tif ( results ) {\n\t\tresults.push.apply( results, array );\n\t\treturn results;\n\t}\n\n\treturn array;\n};\n\n// Perform a simple check to determine if the browser is capable of\n// converting a NodeList to an array using builtin methods.\n// Also verifies that the returned array holds DOM nodes\n// (which is not the case in the Blackberry browser)\ntry {\n\tArray.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\n\n// Provide a fallback method if it does not work\n} catch( e ) {\n\tmakeArray = function( array, results ) {\n\t\tvar i = 0,\n\t\t\tret = results || [];\n\n\t\tif ( toString.call(array) === \"[object Array]\" ) {\n\t\t\tArray.prototype.push.apply( ret, array );\n\n\t\t} else {\n\t\t\tif ( typeof array.length === \"number\" ) {\n\t\t\t\tfor ( var l = array.length; i < l; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tfor ( ; array[i]; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nvar sortOrder, siblingCheck;\n\nif ( document.documentElement.compareDocumentPosition ) {\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\n\t\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t\t}\n\n\t\treturn a.compareDocumentPosition(b) & 4 ? -1 : 1;\n\t};\n\n} else {\n\tsortOrder = function( a, b ) {\n\t\t// The nodes are identical, we can exit early\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\n\t\t\treturn a.sourceIndex - b.sourceIndex;\n\t\t}\n\n\t\tvar al, bl,\n\t\t\tap = [],\n\t\t\tbp = [],\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tcur = aup;\n\n\t\t// If the nodes are siblings (or identical) we can do a quick check\n\t\tif ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\n\t\t// If no parents were found then the nodes are disconnected\n\t\t} else if ( !aup ) {\n\t\t\treturn -1;\n\n\t\t} else if ( !bup ) {\n\t\t\treturn 1;\n\t\t}\n\n\t\t// Otherwise they're somewhere else in the tree so we need\n\t\t// to build up a full list of the parentNodes for comparison\n\t\twhile ( cur ) {\n\t\t\tap.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tcur = bup;\n\n\t\twhile ( cur ) {\n\t\t\tbp.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tal = ap.length;\n\t\tbl = bp.length;\n\n\t\t// Start walking down the tree looking for a discrepancy\n\t\tfor ( var i = 0; i < al && i < bl; i++ ) {\n\t\t\tif ( ap[i] !== bp[i] ) {\n\t\t\t\treturn siblingCheck( ap[i], bp[i] );\n\t\t\t}\n\t\t}\n\n\t\t// We ended someplace up the tree so do a sibling check\n\t\treturn i === al ?\n\t\t\tsiblingCheck( a, bp[i], -1 ) :\n\t\t\tsiblingCheck( ap[i], b, 1 );\n\t};\n\n\tsiblingCheck = function( a, b, ret ) {\n\t\tif ( a === b ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tvar cur = a.nextSibling;\n\n\t\twhile ( cur ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tcur = cur.nextSibling;\n\t\t}\n\n\t\treturn 1;\n\t};\n}\n\n// Check to see if the browser returns elements by name when\n// querying by getElementById (and provide a workaround)\n(function(){\n\t// We're going to inject a fake input element with a specified name\n\tvar form = document.createElement(\"div\"),\n\t\tid = \"script\" + (new Date()).getTime(),\n\t\troot = document.documentElement;\n\n\tform.innerHTML = \"<a name='\" + id + \"'/>\";\n\n\t// Inject it into the root element, check its status, and remove it quickly\n\troot.insertBefore( form, root.firstChild );\n\n\t// The workaround has to do additional checks after a getElementById\n\t// Which slows things down for other browsers (hence the branching)\n\tif ( document.getElementById( id ) ) {\n\t\tExpr.find.ID = function( match, context, isXML ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === match[1] || typeof m.getAttributeNode !== \"undefined\" && m.getAttributeNode(\"id\").nodeValue === match[1] ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\n\t\tExpr.filter.ID = function( elem, match ) {\n\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\n\t\t\treturn elem.nodeType === 1 && node && node.nodeValue === match;\n\t\t};\n\t}\n\n\troot.removeChild( form );\n\n\t// release memory in IE\n\troot = form = null;\n})();\n\n(function(){\n\t// Check to see if the browser returns only elements\n\t// when doing getElementsByTagName(\"*\")\n\n\t// Create a fake element\n\tvar div = document.createElement(\"div\");\n\tdiv.appendChild( document.createComment(\"\") );\n\n\t// Make sure no comments are found\n\tif ( div.getElementsByTagName(\"*\").length > 0 ) {\n\t\tExpr.find.TAG = function( match, context ) {\n\t\t\tvar results = context.getElementsByTagName( match[1] );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( match[1] === \"*\" ) {\n\t\t\t\tvar tmp = [];\n\n\t\t\t\tfor ( var i = 0; results[i]; i++ ) {\n\t\t\t\t\tif ( results[i].nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresults = tmp;\n\t\t\t}\n\n\t\t\treturn results;\n\t\t};\n\t}\n\n\t// Check to see if an attribute returns normalized href attributes\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\n\tif ( div.firstChild && typeof div.firstChild.getAttribute !== \"undefined\" &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") !== \"#\" ) {\n\n\t\tExpr.attrHandle.href = function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t};\n\t}\n\n\t// release memory in IE\n\tdiv = null;\n})();\n\nif ( document.querySelectorAll ) {\n\t(function(){\n\t\tvar oldSizzle = Sizzle,\n\t\t\tdiv = document.createElement(\"div\"),\n\t\t\tid = \"__sizzle__\";\n\n\t\tdiv.innerHTML = \"<p class='TEST'></p>\";\n\n\t\t// Safari can't handle uppercase or unicode characters when\n\t\t// in quirks mode.\n\t\tif ( div.querySelectorAll && div.querySelectorAll(\".TEST\").length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tSizzle = function( query, context, extra, seed ) {\n\t\t\tcontext = context || document;\n\n\t\t\t// Only use querySelectorAll on non-XML documents\n\t\t\t// (ID selectors don't work in non-HTML documents)\n\t\t\tif ( !seed && !Sizzle.isXML(context) ) {\n\t\t\t\t// See if we find a selector to speed up\n\t\t\t\tvar match = /^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec( query );\n\n\t\t\t\tif ( match && (context.nodeType === 1 || context.nodeType === 9) ) {\n\t\t\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t\t\tif ( match[1] ) {\n\t\t\t\t\t\treturn makeArray( context.getElementsByTagName( query ), extra );\n\n\t\t\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t\t\t} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {\n\t\t\t\t\t\treturn makeArray( context.getElementsByClassName( match[2] ), extra );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( context.nodeType === 9 ) {\n\t\t\t\t\t// Speed-up: Sizzle(\"body\")\n\t\t\t\t\t// The body element only exists once, optimize finding it\n\t\t\t\t\tif ( query === \"body\" && context.body ) {\n\t\t\t\t\t\treturn makeArray( [ context.body ], extra );\n\n\t\t\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\t\t\t} else if ( match && match[3] ) {\n\t\t\t\t\t\tvar elem = context.getElementById( match[3] );\n\n\t\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === match[3] ) {\n\t\t\t\t\t\t\t\treturn makeArray( [ elem ], extra );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn makeArray( [], extra );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn makeArray( context.querySelectorAll(query), extra );\n\t\t\t\t\t} catch(qsaError) {}\n\n\t\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t\t// IE 8 doesn't work on object elements\n\t\t\t\t} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\t\tvar oldContext = context,\n\t\t\t\t\t\told = context.getAttribute( \"id\" ),\n\t\t\t\t\t\tnid = old || id,\n\t\t\t\t\t\thasParent = context.parentNode,\n\t\t\t\t\t\trelativeHierarchySelector = /^\\s*[+~]/.test( query );\n\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnid = nid.replace( /'/g, \"\\\\$&\" );\n\t\t\t\t\t}\n\t\t\t\t\tif ( relativeHierarchySelector && hasParent ) {\n\t\t\t\t\t\tcontext = context.parentNode;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif ( !relativeHierarchySelector || hasParent ) {\n\t\t\t\t\t\t\treturn makeArray( context.querySelectorAll( \"[id='\" + nid + \"'] \" + query ), extra );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} catch(pseudoError) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\t\toldContext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn oldSizzle(query, context, extra, seed);\n\t\t};\n\n\t\tfor ( var prop in oldSizzle ) {\n\t\t\tSizzle[ prop ] = oldSizzle[ prop ];\n\t\t}\n\n\t\t// release memory in IE\n\t\tdiv = null;\n\t})();\n}\n\n(function(){\n\tvar html = document.documentElement,\n\t\tmatches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;\n\n\tif ( matches ) {\n\t\t// Check to see if it's possible to do matchesSelector\n\t\t// on a disconnected node (IE 9 fails this)\n\t\tvar disconnectedMatch = !matches.call( document.createElement( \"div\" ), \"div\" ),\n\t\t\tpseudoWorks = false;\n\n\t\ttry {\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( document.documentElement, \"[test!='']:sizzle\" );\n\n\t\t} catch( pseudoError ) {\n\t\t\tpseudoWorks = true;\n\t\t}\n\n\t\tSizzle.matchesSelector = function( node, expr ) {\n\t\t\t// Make sure that attribute selectors are quoted\n\t\t\texpr = expr.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g, \"='$1']\");\n\n\t\t\tif ( !Sizzle.isXML( node ) ) {\n\t\t\t\ttry {\n\t\t\t\t\tif ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {\n\t\t\t\t\t\tvar ret = matches.call( node, expr );\n\n\t\t\t\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\t\t\t\tif ( ret || !disconnectedMatch ||\n\t\t\t\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t\t\t\t// fragment in IE 9, so check for that\n\t\t\t\t\t\t\t\tnode.document && node.document.nodeType !== 11 ) {\n\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\treturn Sizzle(expr, null, null, [node]).length > 0;\n\t\t};\n\t}\n})();\n\n(function(){\n\tvar div = document.createElement(\"div\");\n\n\tdiv.innerHTML = \"<div class='test e'></div><div class='test'></div>\";\n\n\t// Opera can't find a second classname (in 9.6)\n\t// Also, make sure that getElementsByClassName actually exists\n\tif ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\n\t\treturn;\n\t}\n\n\t// Safari caches class attributes, doesn't catch changes (in 3.2)\n\tdiv.lastChild.className = \"e\";\n\n\tif ( div.getElementsByClassName(\"e\").length === 1 ) {\n\t\treturn;\n\t}\n\n\tExpr.order.splice(1, 0, \"CLASS\");\n\tExpr.find.CLASS = function( match, context, isXML ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && !isXML ) {\n\t\t\treturn context.getElementsByClassName(match[1]);\n\t\t}\n\t};\n\n\t// release memory in IE\n\tdiv = null;\n})();\n\nfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\n\t\tif ( elem ) {\n\t\t\tvar match = false;\n\n\t\t\telem = elem[dir];\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem[ expando ] === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 && !isXML ){\n\t\t\t\t\telem[ expando ] = doneName;\n\t\t\t\t\telem.sizset = i;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeName.toLowerCase() === cur ) {\n\t\t\t\t\tmatch = elem;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\n\t\tif ( elem ) {\n\t\t\tvar match = false;\n\n\t\t\telem = elem[dir];\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem[ expando ] === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !isXML ) {\n\t\t\t\t\t\telem[ expando ] = doneName;\n\t\t\t\t\t\telem.sizset = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof cur !== \"string\" ) {\n\t\t\t\t\t\tif ( elem === cur ) {\n\t\t\t\t\t\t\tmatch = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {\n\t\t\t\t\t\tmatch = elem;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nif ( document.documentElement.contains ) {\n\tSizzle.contains = function( a, b ) {\n\t\treturn a !== b && (a.contains ? a.contains(b) : true);\n\t};\n\n} else if ( document.documentElement.compareDocumentPosition ) {\n\tSizzle.contains = function( a, b ) {\n\t\treturn !!(a.compareDocumentPosition(b) & 16);\n\t};\n\n} else {\n\tSizzle.contains = function() {\n\t\treturn false;\n\t};\n}\n\nSizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\n\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\nvar posProcess = function( selector, context, seed ) {\n\tvar match,\n\t\ttmpSet = [],\n\t\tlater = \"\",\n\t\troot = context.nodeType ? [context] : context;\n\n\t// Position selectors must be done after the filter\n\t// And so must :not(positional) so we move all PSEUDOs to the end\n\twhile ( (match = Expr.match.PSEUDO.exec( selector )) ) {\n\t\tlater += match[0];\n\t\tselector = selector.replace( Expr.match.PSEUDO, \"\" );\n\t}\n\n\tselector = Expr.relative[selector] ? selector + \"*\" : selector;\n\n\tfor ( var i = 0, l = root.length; i < l; i++ ) {\n\t\tSizzle( selector, root[i], tmpSet, seed );\n\t}\n\n\treturn Sizzle.filter( later, tmpSet );\n};\n\n// EXPOSE\n// Override sizzle attribute retrieval\nSizzle.attr = jQuery.attr;\nSizzle.selectors.attrMap = {};\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.filters;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})();\n\n\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prevUntil|prevAll)/,\n\t// Note: This RegExp should be improved, or likely pulled from Sizzle\n\trmultiselector = /,/,\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\tslice = Array.prototype.slice,\n\tPOS = jQuery.expr.match.globalPOS,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar self = this,\n\t\t\ti, l;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0, l = self.length; i < l; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tvar ret = this.pushStack( \"\", \"find\", selector ),\n\t\t\tlength, n, r;\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tlength = ret.length;\n\t\t\tjQuery.find( selector, this[i], ret );\n\n\t\t\tif ( i > 0 ) {\n\t\t\t\t// Make sure that the results are unique\n\t\t\t\tfor ( n = length; n < ret.length; n++ ) {\n\t\t\t\t\tfor ( r = 0; r < length; r++ ) {\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\n\t\t\t\t\t\t\tret.splice(n--, 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar targets = jQuery( target );\n\t\treturn this.filter(function() {\n\t\t\tfor ( var i = 0, l = targets.length; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!selector && (\n\t\t\ttypeof selector === \"string\" ?\n\t\t\t\t// If this is a positional selector, check membership in the returned set\n\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\t\tPOS.test( selector ) ?\n\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\n\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\n\t\t\t\tthis.filter( selector ).length > 0 );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar ret = [], i, l, cur = this[0];\n\n\t\t// Array (deprecated as of jQuery 1.7)\n\t\tif ( jQuery.isArray( selectors ) ) {\n\t\t\tvar level = 1;\n\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context ) {\n\t\t\t\tfor ( i = 0; i < selectors.length; i++ ) {\n\n\t\t\t\t\tif ( jQuery( cur ).is( selectors[ i ] ) ) {\n\t\t\t\t\t\tret.push({ selector: selectors[ i ], elem: cur, level: level });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcur = cur.parentNode;\n\t\t\t\tlevel++;\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\t// String\n\t\tvar pos = POS.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tcur = this[i];\n\n\t\t\twhile ( cur ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\t\t\t\t\tret.push( cur );\n\t\t\t\t\tbreak;\n\n\t\t\t\t} else {\n\t\t\t\t\tcur = cur.parentNode;\n\t\t\t\t\tif ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tret = ret.length > 1 ? jQuery.unique( ret ) : ret;\n\n\t\treturn this.pushStack( ret, \"closest\", selectors );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\n\t\t\tall :\n\t\t\tjQuery.unique( all ) );\n\t},\n\n\tandSelf: function() {\n\t\treturn this.add( this.prevObject );\n\t}\n});\n\n// A painfully simple check to see if an element is disconnected\n// from a document (should be improved, where feasible).\nfunction isDisconnected( node ) {\n\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.makeArray( elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n\t\tif ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret, name, slice.call( arguments ).join(\",\") );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 ?\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\t\t\tjQuery.find.matches(expr, elems);\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tnth: function( cur, result, dir, elem ) {\n\t\tresult = result || 1;\n\t\tvar num = 0;\n\n\t\tfor ( ; cur; cur = cur[dir] ) {\n\t\t\tif ( cur.nodeType === 1 && ++num === result ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cur;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n\t// Can't pass null or undefined to indexOf in Firefox 4\n\t// Set to 0 to skip string check\n\tqualifier = qualifier || 0;\n\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\t\t\treturn retVal === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\treturn ( elem === qualifier ) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem, i ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\n\t});\n}\n\n\n\n\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:\\d+|null)\"/g,\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style)/i,\n\trnocache = /<(?:script|object|embed|option|style)/i,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /\\/(java|ecma)script/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\t_default: [ 0, \"\", \"\" ]\n\t},\n\tsafeFragment = createSafeFragment( document );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// IE can't serialize <link> and <script> tags normally\nif ( !jQuery.support.htmlSerialize ) {\n\twrapMap._default = [ 1, \"div<div>\", \"</div>\" ];\n}\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = jQuery.clean( arguments );\n\t\t\tset.push.apply( set, this.toArray() );\n\t\t\treturn this.pushStack( set, \"before\", arguments );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = this.pushStack( this, \"after\", arguments );\n\t\t\tset.push.apply( set, jQuery.clean(arguments) );\n\t\t\treturn set;\n\t\t}\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tnull;\n\t\t\t}\n\n\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName( \"*\" ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function( value ) {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t\t// this can help fix replacing a parent with child elements\n\t\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\t\treturn this.each(function(i) {\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( typeof value !== \"string\" ) {\n\t\t\t\tvalue = jQuery( value ).detach();\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\tvar next = this.nextSibling,\n\t\t\t\t\tparent = this.parentNode;\n\n\t\t\t\tjQuery( this ).remove();\n\n\t\t\t\tif ( next ) {\n\t\t\t\t\tjQuery(next).before( value );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(parent).append( value );\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn this.length ?\n\t\t\t\tthis.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\n\t\t\t\tthis;\n\t\t}\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\t\tvar results, first, fragment, parent,\n\t\t\tvalue = args[0],\n\t\t\tscripts = [];\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === \"string\" && rchecked.test( value ) ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery(this).domManip( args, table, callback, true );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\targs[0] = value.call(this, i, table ? self.html() : undefined);\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\tparent = value && value.parentNode;\n\n\t\t\t// If we're in a fragment, just use that instead of building a new one\n\t\t\tif ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {\n\t\t\t\tresults = { fragment: parent };\n\n\t\t\t} else {\n\t\t\t\tresults = jQuery.buildFragment( args, this, scripts );\n\t\t\t}\n\n\t\t\tfragment = results.fragment;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfirst = fragment = fragment.firstChild;\n\t\t\t} else {\n\t\t\t\tfirst = fragment.firstChild;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\n\t\t\t\tfor ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable ?\n\t\t\t\t\t\t\troot(this[i], first) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\t// Make sure that we do not leak memory by inadvertently discarding\n\t\t\t\t\t\t// the original fragment (which might have attached data) instead of\n\t\t\t\t\t\t// using it; in addition, use the original fragment object for the last\n\t\t\t\t\t\t// item instead of first because it can end up being emptied incorrectly\n\t\t\t\t\t\t// in certain situations (Bug #8070).\n\t\t\t\t\t\t// Fragments from the fragment cache must always be cloned and never used\n\t\t\t\t\t\t// in place.\n\t\t\t\t\t\tresults.cacheable || ( l > 1 && i < lastIndex ) ?\n\t\t\t\t\t\t\tjQuery.clone( fragment, true, true ) :\n\t\t\t\t\t\t\tfragment\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( scripts.length ) {\n\t\t\t\tjQuery.each( scripts, function( i, elem ) {\n\t\t\t\t\tif ( elem.src ) {\n\t\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\t\ttype: \"GET\",\n\t\t\t\t\t\t\tglobal: false,\n\t\t\t\t\t\t\turl: elem.src,\n\t\t\t\t\t\t\tasync: false,\n\t\t\t\t\t\t\tdataType: \"script\"\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tjQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"/*$0*/\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nfunction root( elem, cur ) {\n\treturn jQuery.nodeName(elem, \"table\") ?\n\t\t(elem.getElementsByTagName(\"tbody\")[0] ||\n\t\telem.appendChild(elem.ownerDocument.createElement(\"tbody\"))) :\n\t\telem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction cloneFixAttributes( src, dest ) {\n\tvar nodeName;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// clearAttributes removes the attributes, which we don't want,\n\t// but also removes the attachEvent events, which we *do* want\n\tif ( dest.clearAttributes ) {\n\t\tdest.clearAttributes();\n\t}\n\n\t// mergeAttributes, in contrast, only merges back on the\n\t// original attributes, not the events\n\tif ( dest.mergeAttributes ) {\n\t\tdest.mergeAttributes( src );\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 fail to clone children inside object elements that use\n\t// the proprietary classid attribute value (rather than the type\n\t// attribute) to identify the type of content to display\n\tif ( nodeName === \"object\" ) {\n\t\tdest.outerHTML = src.outerHTML;\n\n\t} else if ( nodeName === \"input\" && (src.type === \"checkbox\" || src.type === \"radio\") ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\t\tif ( src.checked ) {\n\t\t\tdest.defaultChecked = dest.checked = src.checked;\n\t\t}\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\n\t// IE blanks contents when cloning scripts\n\t} else if ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdest.text = src.text;\n\t}\n\n\t// Event data gets referenced instead of copied if the expando\n\t// gets copied too\n\tdest.removeAttribute( jQuery.expando );\n\n\t// Clear flags for bubbling special change/submit events, they must\n\t// be reattached when the newly cloned events are first activated\n\tdest.removeAttribute( \"_submit_attached\" );\n\tdest.removeAttribute( \"_change_attached\" );\n}\n\njQuery.buildFragment = function( args, nodes, scripts ) {\n\tvar fragment, cacheable, cacheresults, doc,\n\tfirst = args[ 0 ];\n\n\t// nodes may contain either an explicit document object,\n\t// a jQuery collection or context object.\n\t// If nodes[0] contains a valid object to assign to doc\n\tif ( nodes && nodes[0] ) {\n\t\tdoc = nodes[0].ownerDocument || nodes[0];\n\t}\n\n\t// Ensure that an attr object doesn't incorrectly stand in as a document object\n\t// Chrome and Firefox seem to allow this to occur and will throw exception\n\t// Fixes #8950\n\tif ( !doc.createDocumentFragment ) {\n\t\tdoc = document;\n\t}\n\n\t// Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\n\t// Cloning options loses the selected state, so don't cache them\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\n\t// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501\n\tif ( args.length === 1 && typeof first === \"string\" && first.length < 512 && doc === document &&\n\t\tfirst.charAt(0) === \"<\" && !rnocache.test( first ) &&\n\t\t(jQuery.support.checkClone || !rchecked.test( first )) &&\n\t\t(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {\n\n\t\tcacheable = true;\n\n\t\tcacheresults = jQuery.fragments[ first ];\n\t\tif ( cacheresults && cacheresults !== 1 ) {\n\t\t\tfragment = cacheresults;\n\t\t}\n\t}\n\n\tif ( !fragment ) {\n\t\tfragment = doc.createDocumentFragment();\n\t\tjQuery.clean( args, doc, fragment, scripts );\n\t}\n\n\tif ( cacheable ) {\n\t\tjQuery.fragments[ first ] = cacheresults ? fragment : 1;\n\t}\n\n\treturn { fragment: fragment, cacheable: cacheable };\n};\n\njQuery.fragments = {};\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar ret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tparent = this.length === 1 && this[0].parentNode;\n\n\t\tif ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {\n\t\t\tinsert[ original ]( this[0] );\n\t\t\treturn this;\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = insert.length; i < l; i++ ) {\n\t\t\t\tvar elems = ( i > 0 ? this.clone(true) : this ).get();\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\n\t\t\t\tret = ret.concat( elems );\n\t\t\t}\n\n\t\t\treturn this.pushStack( ret, name, insert.selector );\n\t\t}\n\t};\n});\n\nfunction getAll( elem ) {\n\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\treturn elem.getElementsByTagName( \"*\" );\n\n\t} else if ( typeof elem.querySelectorAll !== \"undefined\" ) {\n\t\treturn elem.querySelectorAll( \"*\" );\n\n\t} else {\n\t\treturn [];\n\t}\n}\n\n// Used in clean, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( elem.type === \"checkbox\" || elem.type === \"radio\" ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n// Finds all inputs and passes them to fixDefaultChecked\nfunction findInputs( elem ) {\n\tvar nodeName = ( elem.nodeName || \"\" ).toLowerCase();\n\tif ( nodeName === \"input\" ) {\n\t\tfixDefaultChecked( elem );\n\t// Skip scripts, get other children\n\t} else if ( nodeName !== \"script\" && typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\tjQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\n\t}\n}\n\n// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js\nfunction shimCloneNode( elem ) {\n\tvar div = document.createElement( \"div\" );\n\tsafeFragment.appendChild( div );\n\n\tdiv.innerHTML = elem.outerHTML;\n\treturn div.firstChild;\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar srcElements,\n\t\t\tdestElements,\n\t\t\ti,\n\t\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t\tclone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ?\n\t\t\t\telem.cloneNode( true ) :\n\t\t\t\tshimCloneNode( elem );\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\t\t\t// IE copies events bound via attachEvent when using cloneNode.\n\t\t\t// Calling detachEvent on the clone will also remove the events\n\t\t\t// from the original. In order to get around this, we use some\n\t\t\t// proprietary methods to clear the events. Thanks to MooTools\n\t\t\t// guys for this hotness.\n\n\t\t\tcloneFixAttributes( elem, clone );\n\n\t\t\t// Using Sizzle here is crazy slow, so we use getElementsByTagName instead\n\t\t\tsrcElements = getAll( elem );\n\t\t\tdestElements = getAll( clone );\n\n\t\t\t// Weird iteration because IE will replace the length property\n\t\t\t// with an element if you are cloning the body and one of the\n\t\t\t// elements on the page has a name or id of \"length\"\n\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tcloneFixAttributes( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tcloneCopyEvent( elem, clone );\n\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = getAll( elem );\n\t\t\t\tdestElements = getAll( clone );\n\n\t\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsrcElements = destElements = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tclean: function( elems, context, fragment, scripts ) {\n\t\tvar checkScriptType, script, j,\n\t\t\t\tret = [];\n\n\t\tcontext = context || document;\n\n\t\t// !context.createElement fails in IE with an error but returns typeof 'object'\n\t\tif ( typeof context.createElement === \"undefined\" ) {\n\t\t\tcontext = context.ownerDocument || context[0] && context[0].ownerDocument || document;\n\t\t}\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( typeof elem === \"number\" ) {\n\t\t\t\telem += \"\";\n\t\t\t}\n\n\t\t\tif ( !elem ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert html string into DOM nodes\n\t\t\tif ( typeof elem === \"string\" ) {\n\t\t\t\tif ( !rhtml.test( elem ) ) {\n\t\t\t\t\telem = context.createTextNode( elem );\n\t\t\t\t} else {\n\t\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\n\t\t\t\t\telem = elem.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\t\t\t// Trim whitespace, otherwise indexOf won't work as expected\n\t\t\t\t\tvar tag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase(),\n\t\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default,\n\t\t\t\t\t\tdepth = wrap[0],\n\t\t\t\t\t\tdiv = context.createElement(\"div\"),\n\t\t\t\t\t\tsafeChildNodes = safeFragment.childNodes,\n\t\t\t\t\t\tremove;\n\n\t\t\t\t\t// Append wrapper element to unknown element safe doc fragment\n\t\t\t\t\tif ( context === document ) {\n\t\t\t\t\t\t// Use the fragment we've already created for this document\n\t\t\t\t\t\tsafeFragment.appendChild( div );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Use a fragment created with the owner document\n\t\t\t\t\t\tcreateSafeFragment( context ).appendChild( div );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Go to html and back, then peel off extra wrappers\n\t\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\n\n\t\t\t\t\t// Move to the right depth\n\t\t\t\t\twhile ( depth-- ) {\n\t\t\t\t\t\tdiv = div.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\tvar hasBody = rtbody.test(elem),\n\t\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\n\t\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\n\n\t\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\n\t\t\t\t\t\t\t\t\tdiv.childNodes :\n\t\t\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tfor ( j = tbody.length - 1; j >= 0 ; --j ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\n\t\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// IE completely kills leading whitespace when innerHTML is used\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\telem = div.childNodes;\n\n\t\t\t\t\t// Clear elements from DocumentFragment (safeFragment or otherwise)\n\t\t\t\t\t// to avoid hoarding elements. Fixes #11356\n\t\t\t\t\tif ( div ) {\n\t\t\t\t\t\tdiv.parentNode.removeChild( div );\n\n\t\t\t\t\t\t// Guard against -1 index exceptions in FF3.6\n\t\t\t\t\t\tif ( safeChildNodes.length > 0 ) {\n\t\t\t\t\t\t\tremove = safeChildNodes[ safeChildNodes.length - 1 ];\n\n\t\t\t\t\t\t\tif ( remove && remove.parentNode ) {\n\t\t\t\t\t\t\t\tremove.parentNode.removeChild( remove );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resets defaultChecked for any radios and checkboxes\n\t\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\t\tvar len;\n\t\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\t\tif ( elem[0] && typeof (len = elem.length) === \"number\" ) {\n\t\t\t\t\tfor ( j = 0; j < len; j++ ) {\n\t\t\t\t\t\tfindInputs( elem[j] );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfindInputs( elem );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( elem.nodeType ) {\n\t\t\t\tret.push( elem );\n\t\t\t} else {\n\t\t\t\tret = jQuery.merge( ret, elem );\n\t\t\t}\n\t\t}\n\n\t\tif ( fragment ) {\n\t\t\tcheckScriptType = function( elem ) {\n\t\t\t\treturn !elem.type || rscriptType.test( elem.type );\n\t\t\t};\n\t\t\tfor ( i = 0; ret[i]; i++ ) {\n\t\t\t\tscript = ret[i];\n\t\t\t\tif ( scripts && jQuery.nodeName( script, \"script\" ) && (!script.type || rscriptType.test( script.type )) ) {\n\t\t\t\t\tscripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );\n\n\t\t\t\t} else {\n\t\t\t\t\tif ( script.nodeType === 1 ) {\n\t\t\t\t\t\tvar jsTags = jQuery.grep( script.getElementsByTagName( \"script\" ), checkScriptType );\n\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\n\t\t\t\t\t}\n\t\t\t\t\tfragment.appendChild( script );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, id,\n\t\t\tcache = jQuery.cache,\n\t\t\tspecial = jQuery.event.special,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando;\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tid = elem[ jQuery.expando ];\n\n\t\t\tif ( id ) {\n\t\t\t\tdata = cache[ id ];\n\n\t\t\t\tif ( data && data.events ) {\n\t\t\t\t\tfor ( var type in data.events ) {\n\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Null the DOM reference to avoid IE6/7/8 leak (#7054)\n\t\t\t\t\tif ( data.handle ) {\n\t\t\t\t\t\tdata.handle.elem = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\tdelete elem[ jQuery.expando ];\n\n\t\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\t\telem.removeAttribute( jQuery.expando );\n\t\t\t\t}\n\n\t\t\t\tdelete cache[ id ];\n\t\t\t}\n\t\t}\n\t}\n});\n\n\n\n\nvar ralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity=([^)]*)/,\n\t// fixed for IE9, see #8346\n\trupper = /([A-Z]|^ms)/g,\n\trnum = /^[\\-+]?(?:\\d*\\.)?\\d+$/i,\n\trnumnonpx = /^-?(?:\\d*\\.)?\\d+(?!px)[^\\d\\s]+$/i,\n\trrelNum = /^([\\-+])=([\\-+.\\de]+)/,\n\trmargin = /^margin/,\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\n\t// order is important!\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\n\tcurCSS,\n\n\tgetComputedStyle,\n\tcurrentStyle;\n\njQuery.fn.css = function( name, value ) {\n\treturn jQuery.access( this, function( elem, name, value ) {\n\t\treturn value !== undefined ?\n\t\t\tjQuery.style( elem, name, value ) :\n\t\t\tjQuery.css( elem, name );\n\t}, name, value, arguments.length > 1 );\n};\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\n\t\t\t\t} else {\n\t\t\t\t\treturn elem.style.opacity;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Exclude the following css properties to add px\n\tcssNumber: {\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, origName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style, hooks = jQuery.cssHooks[ origName ];\n\n\t\tname = jQuery.cssProps[ origName ] || origName;\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra ) {\n\t\tvar ret, hooks;\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.camelCase( name );\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tname = jQuery.cssProps[ name ] || name;\n\n\t\t// cssFloat needs a special treatment\n\t\tif ( name === \"cssFloat\" ) {\n\t\t\tname = \"float\";\n\t\t}\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {\n\t\t\treturn ret;\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\t} else if ( curCSS ) {\n\t\t\treturn curCSS( elem, name );\n\t\t}\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback ) {\n\t\tvar old = {},\n\t\t\tret, name;\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.call( elem );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\n// DEPRECATED in 1.3, Use jQuery.css() instead\njQuery.curCSS = jQuery.css;\n\nif ( document.defaultView && document.defaultView.getComputedStyle ) {\n\tgetComputedStyle = function( elem, name ) {\n\t\tvar ret, defaultView, computedStyle, width,\n\t\t\tstyle = elem.style;\n\n\t\tname = name.replace( rupper, \"-$1\" ).toLowerCase();\n\n\t\tif ( (defaultView = elem.ownerDocument.defaultView) &&\n\t\t\t\t(computedStyle = defaultView.getComputedStyle( elem, null )) ) {\n\n\t\t\tret = computedStyle.getPropertyValue( name );\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// WebKit uses \"computed value (percentage if specified)\" instead of \"used value\" for margins\n\t\t// which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {\n\t\t\twidth = style.width;\n\t\t\tstyle.width = ret;\n\t\t\tret = computedStyle.width;\n\t\t\tstyle.width = width;\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nif ( document.documentElement.currentStyle ) {\n\tcurrentStyle = function( elem, name ) {\n\t\tvar left, rsLeft, uncomputed,\n\t\t\tret = elem.currentStyle && elem.currentStyle[ name ],\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && (uncomputed = style[ name ]) ) {\n\t\t\tret = uncomputed;\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\tif ( rnumnonpx.test( ret ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trsLeft = elem.runtimeStyle && elem.runtimeStyle.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\ncurCSS = getComputedStyle || currentStyle;\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property\n\tvar val = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\ti = name === \"width\" ? 1 : 0,\n\t\tlen = 4;\n\n\tif ( val > 0 ) {\n\t\tif ( extra !== \"border\" ) {\n\t\t\tfor ( ; i < len; i += 2 ) {\n\t\t\t\tif ( !extra ) {\n\t\t\t\t\tval -= parseFloat( jQuery.css( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( extra === \"margin\" ) {\n\t\t\t\t\tval += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;\n\t\t\t\t} else {\n\t\t\t\t\tval -= parseFloat( jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn val + \"px\";\n\t}\n\n\t// Fall back to computed then uncomputed css if necessary\n\tval = curCSS( elem, name );\n\tif ( val < 0 || val == null ) {\n\t\tval = elem.style[ name ];\n\t}\n\n\t// Computed unit is not pixels. Stop here and return.\n\tif ( rnumnonpx.test(val) ) {\n\t\treturn val;\n\t}\n\n\t// Normalize \"\", auto, and prepare for extra\n\tval = parseFloat( val ) || 0;\n\n\t// Add padding, border, margin\n\tif ( extra ) {\n\t\tfor ( ; i < len; i += 2 ) {\n\t\t\tval += parseFloat( jQuery.css( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += parseFloat( jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\n\t\t\t}\n\t\t\tif ( extra === \"margin\" ) {\n\t\t\t\tval += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val + \"px\";\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\tif ( elem.offsetWidth !== 0 ) {\n\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t} else {\n\t\t\t\t\treturn jQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\treturn rnum.test( value ) ?\n\t\t\t\tvalue + \"px\" :\n\t\t\t\tvalue;\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( parseFloat( RegExp.$1 ) / 100 ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\tif ( value >= 1 && jQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there there is no filter style applied in a css rule, we are done\n\t\t\t\tif ( currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\njQuery(function() {\n\t// This hook cannot be added until DOM ready because the support test\n\t// for it is not run until after DOM ready\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\treturn curCSS( elem, \"margin-right\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.style.marginRight;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\tvar width = elem.offsetWidth,\n\t\t\theight = elem.offsetHeight;\n\n\t\treturn ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i,\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ],\n\t\t\t\texpanded = {};\n\n\t\t\tfor ( i = 0; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n});\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trhash = /#.*$/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\trinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trquery = /\\?/,\n\trscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\trselectTextarea = /^(?:select|textarea)/i,\n\trspacesAjax = /\\s+/,\n\trts = /([?&])_=[^&]*/,\n\trurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Document location\n\tajaxLocation,\n\n\t// Document location segments\n\tajaxLocParts,\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = [\"*/\"] + [\"*\"];\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\tvar dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),\n\t\t\t\ti = 0,\n\t\t\t\tlength = dataTypes.length,\n\t\t\t\tdataType,\n\t\t\t\tlist,\n\t\t\t\tplaceBefore;\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tdataType = dataTypes[ i ];\n\t\t\t\t// We control if we're asked to add before\n\t\t\t\t// any existing element\n\t\t\t\tplaceBefore = /^\\+/.test( dataType );\n\t\t\t\tif ( placeBefore ) {\n\t\t\t\t\tdataType = dataType.substr( 1 ) || \"*\";\n\t\t\t\t}\n\t\t\t\tlist = structure[ dataType ] = structure[ dataType ] || [];\n\t\t\t\t// then we add to the structure accordingly\n\t\t\t\tlist[ placeBefore ? \"unshift\" : \"push\" ]( func );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,\n\t\tdataType /* internal */, inspected /* internal */ ) {\n\n\tdataType = dataType || options.dataTypes[ 0 ];\n\tinspected = inspected || {};\n\n\tinspected[ dataType ] = true;\n\n\tvar list = structure[ dataType ],\n\t\ti = 0,\n\t\tlength = list ? list.length : 0,\n\t\texecuteOnly = ( structure === prefilters ),\n\t\tselection;\n\n\tfor ( ; i < length && ( executeOnly || !selection ); i++ ) {\n\t\tselection = list[ i ]( options, originalOptions, jqXHR );\n\t\t// If we got redirected to another dataType\n\t\t// we try there if executing only and not done already\n\t\tif ( typeof selection === \"string\" ) {\n\t\t\tif ( !executeOnly || inspected[ selection ] ) {\n\t\t\t\tselection = undefined;\n\t\t\t} else {\n\t\t\t\toptions.dataTypes.unshift( selection );\n\t\t\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\t\t\tstructure, options, originalOptions, jqXHR, selection, inspected );\n\t\t\t}\n\t\t}\n\t}\n\t// If we're only executing or nothing was selected\n\t// we try the catchall dataType if not done already\n\tif ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\n\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\tstructure, options, originalOptions, jqXHR, \"*\", inspected );\n\t}\n\t// unnecessary when only executing (prefilters)\n\t// but it'll be ignored by the caller in that case\n\treturn selection;\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n}\n\njQuery.fn.extend({\n\tload: function( url, params, callback ) {\n\t\tif ( typeof url !== \"string\" && _load ) {\n\t\t\treturn _load.apply( this, arguments );\n\n\t\t// Don't do a request if no elements are being requested\n\t\t} else if ( !this.length ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar off = url.indexOf( \" \" );\n\t\tif ( off >= 0 ) {\n\t\t\tvar selector = url.slice( off, url.length );\n\t\t\turl = url.slice( 0, off );\n\t\t}\n\n\t\t// Default to a GET request\n\t\tvar type = \"GET\";\n\n\t\t// If the second parameter was provided\n\t\tif ( params ) {\n\t\t\t// If it's a function\n\t\t\tif ( jQuery.isFunction( params ) ) {\n\t\t\t\t// We assume that it's the callback\n\t\t\t\tcallback = params;\n\t\t\t\tparams = undefined;\n\n\t\t\t// Otherwise, build a param string\n\t\t\t} else if ( typeof params === \"object\" ) {\n\t\t\t\tparams = jQuery.param( params, jQuery.ajaxSettings.traditional );\n\t\t\t\ttype = \"POST\";\n\t\t\t}\n\t\t}\n\n\t\tvar self = this;\n\n\t\t// Request the remote document\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params,\n\t\t\t// Complete callback (responseText is used internally)\n\t\t\tcomplete: function( jqXHR, status, responseText ) {\n\t\t\t\t// Store the response as specified by the jqXHR object\n\t\t\t\tresponseText = jqXHR.responseText;\n\t\t\t\t// If successful, inject the HTML into all the matched elements\n\t\t\t\tif ( jqXHR.isResolved() ) {\n\t\t\t\t\t// #4825: Get the actual response in case\n\t\t\t\t\t// a dataFilter is present in ajaxSettings\n\t\t\t\t\tjqXHR.done(function( r ) {\n\t\t\t\t\t\tresponseText = r;\n\t\t\t\t\t});\n\t\t\t\t\t// See if a selector was specified\n\t\t\t\t\tself.html( selector ?\n\t\t\t\t\t\t// Create a dummy div to hold the results\n\t\t\t\t\t\tjQuery(\"<div>\")\n\t\t\t\t\t\t\t// inject the contents of the document in, removing the scripts\n\t\t\t\t\t\t\t// to avoid any 'Permission Denied' errors in IE\n\t\t\t\t\t\t\t.append(responseText.replace(rscript, \"\"))\n\n\t\t\t\t\t\t\t// Locate the specified elements\n\t\t\t\t\t\t\t.find(selector) :\n\n\t\t\t\t\t\t// If not, just inject the full result\n\t\t\t\t\t\tresponseText );\n\t\t\t\t}\n\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tself.each( callback, [ responseText, status, jqXHR ] );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn this;\n\t},\n\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\treturn this.elements ? jQuery.makeArray( this.elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\treturn this.name && !this.disabled &&\n\t\t\t\t( this.checked || rselectTextarea.test( this.nodeName ) ||\n\t\t\t\t\trinput.test( this.type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val, i ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\n\tjQuery.fn[ o ] = function( f ){\n\t\treturn this.on( o, f );\n\t};\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\ttype: method,\n\t\t\turl: url,\n\t\t\tdata: data,\n\t\t\tsuccess: callback,\n\t\t\tdataType: type\n\t\t});\n\t};\n});\n\njQuery.extend({\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\tif ( settings ) {\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( target, jQuery.ajaxSettings );\n\t\t} else {\n\t\t\t// Extending ajaxSettings\n\t\t\tsettings = target;\n\t\t\ttarget = jQuery.ajaxSettings;\n\t\t}\n\t\tajaxExtend( target, settings );\n\t\treturn target;\n\t},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\ttype: \"GET\",\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\tprocessData: true,\n\t\tasync: true,\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\thtml: \"text/html\",\n\t\t\ttext: \"text/plain\",\n\t\t\tjson: \"application/json, text/javascript\",\n\t\t\t\"*\": allTypes\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\"\n\t\t},\n\n\t\t// List of data converters\n\t\t// 1) key format is \"source_type destination_type\" (a single space in-between)\n\t\t// 2) the catchall symbol \"*\" can be used for source_type\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": window.String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\tcontext: true,\n\t\t\turl: true\n\t\t}\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events\n\t\t\t// It's the callbackContext if one was provided in the options\n\t\t\t// and if it's a DOM node or a jQuery collection\n\t\t\tglobalEventContext = callbackContext !== s &&\n\t\t\t\t( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\n\t\t\t\t\t\tjQuery( callbackContext ) : jQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// ifModified key\n\t\t\tifModifiedKey,\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// transport\n\t\t\ttransport,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match === undefined ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tstatusText = statusText || \"abort\";\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( statusText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, statusText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Callback for when everything is done\n\t\t// It is defined here because jslint complains if it is declared\n\t\t// at the end of the function (which would be more logical and readable)\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\tvar isSuccess,\n\t\t\t\tsuccess,\n\t\t\t\terror,\n\t\t\t\tstatusText = nativeStatusText,\n\t\t\t\tresponse = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,\n\t\t\t\tlastModified,\n\t\t\t\tetag;\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\n\t\t\t\t\tif ( ( lastModified = jqXHR.getResponseHeader( \"Last-Modified\" ) ) ) {\n\t\t\t\t\t\tjQuery.lastModified[ ifModifiedKey ] = lastModified;\n\t\t\t\t\t}\n\t\t\t\t\tif ( ( etag = jqXHR.getResponseHeader( \"Etag\" ) ) ) {\n\t\t\t\t\t\tjQuery.etag[ ifModifiedKey ] = etag;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If not modified\n\t\t\t\tif ( status === 304 ) {\n\n\t\t\t\t\tstatusText = \"notmodified\";\n\t\t\t\t\tisSuccess = true;\n\n\t\t\t\t// If we have data\n\t\t\t\t} else {\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsuccess = ajaxConvert( s, response );\n\t\t\t\t\t\tstatusText = \"success\";\n\t\t\t\t\t\tisSuccess = true;\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t// We have a parsererror\n\t\t\t\t\t\tstatusText = \"parsererror\";\n\t\t\t\t\t\terror = e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( !statusText || status ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = \"\" + ( nativeStatusText || statusText );\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\n\t\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\t\tjqXHR.complete = completeDeferred.add;\n\n\t\t// Status-dependent callbacks\n\t\tjqXHR.statusCode = function( map ) {\n\t\t\tif ( map ) {\n\t\t\t\tvar tmp;\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tfor ( tmp in map ) {\n\t\t\t\t\t\tstatusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttmp = map[ jqXHR.status ];\n\t\t\t\t\tjqXHR.then( tmp, tmp );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( rspacesAjax );\n\n\t\t// Determine if a cross-domain request is in order\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.data;\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Get ifModifiedKey before adding the anti-cache parameter\n\t\t\tifModifiedKey = s.url;\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\n\t\t\t\tvar ts = jQuery.now(),\n\t\t\t\t\t// try replacing _= if it is there\n\t\t\t\t\tret = s.url.replace( rts, \"$1_=\" + ts );\n\n\t\t\t\t// if nothing was replaced, add timestamp to the end\n\t\t\t\ts.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tifModifiedKey = ifModifiedKey || s.url;\n\t\t\tif ( jQuery.lastModified[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t\t// Abort if not done already\n\t\t\t\tjqXHR.abort();\n\t\t\t\treturn false;\n\n\t\t}\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout( function(){\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch (e) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\t// Serialize an array of form elements or a set of\n\t// key/values into a query string\n\tparam: function( a, traditional ) {\n\t\tvar s = [],\n\t\t\tadd = function( key, value ) {\n\t\t\t\t// If value is a function, invoke it and return its value\n\t\t\t\tvalue = jQuery.isFunction( value ) ? value() : value;\n\t\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t\t};\n\n\t\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\t\tif ( traditional === undefined ) {\n\t\t\ttraditional = jQuery.ajaxSettings.traditional;\n\t\t}\n\n\t\t// If an array was passed in, assume that it is an array of form elements.\n\t\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t\t// Serialize the form elements\n\t\t\tjQuery.each( a, function() {\n\t\t\t\tadd( this.name, this.value );\n\t\t\t});\n\n\t\t} else {\n\t\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t\t// did it), otherwise encode params recursively.\n\t\t\tfor ( var prefix in a ) {\n\t\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t\t}\n\t\t}\n\n\t\t// Return the resulting serialization\n\t\treturn s.join( \"&\" ).replace( r20, \"+\" );\n\t}\n});\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// If array item is non-scalar (array or object), encode its\n\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\n\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\n\t\t\t\t// nested arrays properly, and attempting to do so may cause\n\t\t\t\t// a server error. Possible fixes are to modify rack's\n\t\t\t\t// deserialization algorithm or to provide an option or flag\n\t\t\t\t// to force array serialization to be shallow.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( var name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// This is still on the jQuery object... for now\n// Want to move this to jQuery.ajax some day\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {}\n\n});\n\n/* Handles responses to an ajax request:\n * - sets all responseXXX fields accordingly\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar contents = s.contents,\n\t\tdataTypes = s.dataTypes,\n\t\tresponseFields = s.responseFields,\n\t\tct,\n\t\ttype,\n\t\tfinalDataType,\n\t\tfirstDataType;\n\n\t// Fill responseXXX fields\n\tfor ( type in responseFields ) {\n\t\tif ( type in responses ) {\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\t\t}\n\t}\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"content-type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n// Chain conversions given the request and the original response\nfunction ajaxConvert( s, response ) {\n\n\t// Apply the dataFilter if provided\n\tif ( s.dataFilter ) {\n\t\tresponse = s.dataFilter( response, s.dataType );\n\t}\n\n\tvar dataTypes = s.dataTypes,\n\t\tconverters = {},\n\t\ti,\n\t\tkey,\n\t\tlength = dataTypes.length,\n\t\ttmp,\n\t\t// Current and previous dataTypes\n\t\tcurrent = dataTypes[ 0 ],\n\t\tprev,\n\t\t// Conversion expression\n\t\tconversion,\n\t\t// Conversion function\n\t\tconv,\n\t\t// Conversion functions (transitive conversion)\n\t\tconv1,\n\t\tconv2;\n\n\t// For each dataType in the chain\n\tfor ( i = 1; i < length; i++ ) {\n\n\t\t// Create converters map\n\t\t// with lowercased keys\n\t\tif ( i === 1 ) {\n\t\t\tfor ( key in s.converters ) {\n\t\t\t\tif ( typeof key === \"string\" ) {\n\t\t\t\t\tconverters[ key.toLowerCase() ] = s.converters[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Get the dataTypes\n\t\tprev = current;\n\t\tcurrent = dataTypes[ i ];\n\n\t\t// If current is auto dataType, update it to prev\n\t\tif ( current === \"*\" ) {\n\t\t\tcurrent = prev;\n\t\t// If no auto and dataTypes are actually different\n\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t// Get the converter\n\t\t\tconversion = prev + \" \" + current;\n\t\t\tconv = converters[ conversion ] || converters[ \"* \" + current ];\n\n\t\t\t// If there is no direct converter, search transitively\n\t\t\tif ( !conv ) {\n\t\t\t\tconv2 = undefined;\n\t\t\t\tfor ( conv1 in converters ) {\n\t\t\t\t\ttmp = conv1.split( \" \" );\n\t\t\t\t\tif ( tmp[ 0 ] === prev || tmp[ 0 ] === \"*\" ) {\n\t\t\t\t\t\tconv2 = converters[ tmp[1] + \" \" + current ];\n\t\t\t\t\t\tif ( conv2 ) {\n\t\t\t\t\t\t\tconv1 = converters[ conv1 ];\n\t\t\t\t\t\t\tif ( conv1 === true ) {\n\t\t\t\t\t\t\t\tconv = conv2;\n\t\t\t\t\t\t\t} else if ( conv2 === true ) {\n\t\t\t\t\t\t\t\tconv = conv1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If we found no converter, dispatch an error\n\t\t\tif ( !( conv || conv2 ) ) {\n\t\t\t\tjQuery.error( \"No conversion from \" + conversion.replace(\" \",\" to \") );\n\t\t\t}\n\t\t\t// If found converter is not an equivalence\n\t\t\tif ( conv !== true ) {\n\t\t\t\t// Convert with 1 or 2 converters accordingly\n\t\t\t\tresponse = conv ? conv( response ) : conv2( conv1(response) );\n\t\t\t}\n\t\t}\n\t}\n\treturn response;\n}\n\n\n\n\nvar jsc = jQuery.now(),\n\tjsre = /(\\=)\\?(&|$)|\\?\\?/i;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\treturn jQuery.expando + \"_\" + ( jsc++ );\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar inspectData = ( typeof s.data === \"string\" ) && /^application\\/x\\-www\\-form\\-urlencoded/.test( s.contentType );\n\n\tif ( s.dataTypes[ 0 ] === \"jsonp\" ||\n\t\ts.jsonp !== false && ( jsre.test( s.url ) ||\n\t\t\t\tinspectData && jsre.test( s.data ) ) ) {\n\n\t\tvar responseContainer,\n\t\t\tjsonpCallback = s.jsonpCallback =\n\t\t\t\tjQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,\n\t\t\tprevious = window[ jsonpCallback ],\n\t\t\turl = s.url,\n\t\t\tdata = s.data,\n\t\t\treplace = \"$1\" + jsonpCallback + \"$2\";\n\n\t\tif ( s.jsonp !== false ) {\n\t\t\turl = url.replace( jsre, replace );\n\t\t\tif ( s.url === url ) {\n\t\t\t\tif ( inspectData ) {\n\t\t\t\t\tdata = data.replace( jsre, replace );\n\t\t\t\t}\n\t\t\t\tif ( s.data === data ) {\n\t\t\t\t\t// Add callback manually\n\t\t\t\t\turl += (/\\?/.test( url ) ? \"&\" : \"?\") + s.jsonp + \"=\" + jsonpCallback;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ts.url = url;\n\t\ts.data = data;\n\n\t\t// Install callback\n\t\twindow[ jsonpCallback ] = function( response ) {\n\t\t\tresponseContainer = [ response ];\n\t\t};\n\n\t\t// Clean-up function\n\t\tjqXHR.always(function() {\n\t\t\t// Set callback back to previous value\n\t\t\twindow[ jsonpCallback ] = previous;\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( previous ) ) {\n\t\t\t\twindow[ jsonpCallback ]( responseContainer[ 0 ] );\n\t\t\t}\n\t\t});\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( jsonpCallback + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /javascript|ecmascript/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement( \"script\" );\n\n\t\t\t\tscript.async = \"async\";\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( head && script.parentNode ) {\n\t\t\t\t\t\t\thead.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = undefined;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n\t\t\t\t// This arises when a base node is used (#2709 and #4378).\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( 0, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject ? function() {\n\t\t// Abort all pending requests\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( 0, 1 );\n\t\t}\n\t} : false,\n\txhrId = 0,\n\txhrCallbacks;\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\n(function( xhr ) {\n\tjQuery.extend( jQuery.support, {\n\t\tajax: !!xhr,\n\t\tcors: !!xhr && ( \"withCredentials\" in xhr )\n\t});\n})( jQuery.ajaxSettings.xhr() );\n\n// Create transport if the browser can provide an xhr\nif ( jQuery.support.ajax ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar xhr = s.xhr(),\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\ti;\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( _ ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\n\t\t\t\t\t\tvar status,\n\t\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\tresponses,\n\t\t\t\t\t\t\txml;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occured\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\n\n\t\t\t\t\t\t\t\t\t// Construct response list\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t} catch( _ ) {\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// if we're in sync mode or it's in cache\n\t\t\t\t\t// and has been retrieved directly (IE6 & IE7)\n\t\t\t\t\t// we need to manually fire the callback\n\t\t\t\t\tif ( !s.async || xhr.readyState === 4 ) {\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback(0,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\n\n\n\n\nvar elemdisplay = {},\n\tiframe, iframeDoc,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = /^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,\n\ttimerId,\n\tfxAttrs = [\n\t\t// height animations\n\t\t[ \"height\", \"marginTop\", \"marginBottom\", \"paddingTop\", \"paddingBottom\" ],\n\t\t// width animations\n\t\t[ \"width\", \"marginLeft\", \"marginRight\", \"paddingLeft\", \"paddingRight\" ],\n\t\t// opacity animations\n\t\t[ \"opacity\" ]\n\t],\n\tfxNow;\n\njQuery.fn.extend({\n\tshow: function( speed, easing, callback ) {\n\t\tvar elem, display;\n\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"show\", 3), speed, easing, callback );\n\n\t\t} else {\n\t\t\tfor ( var i = 0, j = this.length; i < j; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = elem.style.display;\n\n\t\t\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t\t\t// being hidden by cascaded rules or not\n\t\t\t\t\tif ( !jQuery._data(elem, \"olddisplay\") && display === \"none\" ) {\n\t\t\t\t\t\tdisplay = elem.style.display = \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set elements which have been overridden with display: none\n\t\t\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t\t\t// for such an element\n\t\t\t\t\tif ( (display === \"\" && jQuery.css(elem, \"display\") === \"none\") ||\n\t\t\t\t\t\t!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\n\t\t\t\t\t\tjQuery._data( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of most of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( i = 0; i < j; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = elem.style.display;\n\n\t\t\t\t\tif ( display === \"\" || display === \"none\" ) {\n\t\t\t\t\t\telem.style.display = jQuery._data( elem, \"olddisplay\" ) || \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\thide: function( speed, easing, callback ) {\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"hide\", 3), speed, easing, callback);\n\n\t\t} else {\n\t\t\tvar elem, display,\n\t\t\t\ti = 0,\n\t\t\t\tj = this.length;\n\n\t\t\tfor ( ; i < j; i++ ) {\n\t\t\t\telem = this[i];\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t\t\t\tif ( display !== \"none\" && !jQuery._data( elem, \"olddisplay\" ) ) {\n\t\t\t\t\t\tjQuery._data( elem, \"olddisplay\", display );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( i = 0; i < j; i++ ) {\n\t\t\t\tif ( this[i].style ) {\n\t\t\t\t\tthis[i].style.display = \"none\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\t// Save the old toggle function\n\t_toggle: jQuery.fn.toggle,\n\n\ttoggle: function( fn, fn2, callback ) {\n\t\tvar bool = typeof fn === \"boolean\";\n\n\t\tif ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {\n\t\t\tthis._toggle.apply( this, arguments );\n\n\t\t} else if ( fn == null || bool ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar state = bool ? fn : jQuery(this).is(\":hidden\");\n\t\t\t\tjQuery(this)[ state ? \"show\" : \"hide\" ]();\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.animate(genFx(\"toggle\", 3), fn, fn2, callback);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tfadeTo: function( speed, to, easing, callback ) {\n\t\treturn this.filter(\":hidden\").css(\"opacity\", 0).show().end()\n\t\t\t\t\t.animate({opacity: to}, speed, easing, callback);\n\t},\n\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar optall = jQuery.speed( speed, easing, callback );\n\n\t\tif ( jQuery.isEmptyObject( prop ) ) {\n\t\t\treturn this.each( optall.complete, [ false ] );\n\t\t}\n\n\t\t// Do not change referenced properties as per-property easing will be lost\n\t\tprop = jQuery.extend( {}, prop );\n\n\t\tfunction doAnimation() {\n\t\t\t// XXX 'this' does not always have a nodeName when running the\n\t\t\t// test suite\n\n\t\t\tif ( optall.queue === false ) {\n\t\t\t\tjQuery._mark( this );\n\t\t\t}\n\n\t\t\tvar opt = jQuery.extend( {}, optall ),\n\t\t\t\tisElement = this.nodeType === 1,\n\t\t\t\thidden = isElement && jQuery(this).is(\":hidden\"),\n\t\t\t\tname, val, p, e, hooks, replace,\n\t\t\t\tparts, start, end, unit,\n\t\t\t\tmethod;\n\n\t\t\t// will store per property easing and be used to determine when an animation is complete\n\t\t\topt.animatedProperties = {};\n\n\t\t\t// first pass over propertys to expand / normalize\n\t\t\tfor ( p in prop ) {\n\t\t\t\tname = jQuery.camelCase( p );\n\t\t\t\tif ( p !== name ) {\n\t\t\t\t\tprop[ name ] = prop[ p ];\n\t\t\t\t\tdelete prop[ p ];\n\t\t\t\t}\n\n\t\t\t\tif ( ( hooks = jQuery.cssHooks[ name ] ) && \"expand\" in hooks ) {\n\t\t\t\t\treplace = hooks.expand( prop[ name ] );\n\t\t\t\t\tdelete prop[ name ];\n\n\t\t\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t\t\t// also - reusing 'p' from above because we have the correct \"name\"\n\t\t\t\t\tfor ( p in replace ) {\n\t\t\t\t\t\tif ( ! ( p in prop ) ) {\n\t\t\t\t\t\t\tprop[ p ] = replace[ p ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( name in prop ) {\n\t\t\t\tval = prop[ name ];\n\t\t\t\t// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)\n\t\t\t\tif ( jQuery.isArray( val ) ) {\n\t\t\t\t\topt.animatedProperties[ name ] = val[ 1 ];\n\t\t\t\t\tval = prop[ name ] = val[ 0 ];\n\t\t\t\t} else {\n\t\t\t\t\topt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';\n\t\t\t\t}\n\n\t\t\t\tif ( val === \"hide\" && hidden || val === \"show\" && !hidden ) {\n\t\t\t\t\treturn opt.complete.call( this );\n\t\t\t\t}\n\n\t\t\t\tif ( isElement && ( name === \"height\" || name === \"width\" ) ) {\n\t\t\t\t\t// Make sure that nothing sneaks out\n\t\t\t\t\t// Record all 3 overflow attributes because IE does not\n\t\t\t\t\t// change the overflow attribute when overflowX and\n\t\t\t\t\t// overflowY are set to the same value\n\t\t\t\t\topt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];\n\n\t\t\t\t\t// Set display property to inline-block for height/width\n\t\t\t\t\t// animations on inline elements that are having width/height animated\n\t\t\t\t\tif ( jQuery.css( this, \"display\" ) === \"inline\" &&\n\t\t\t\t\t\t\tjQuery.css( this, \"float\" ) === \"none\" ) {\n\n\t\t\t\t\t\t// inline-level elements accept inline-block;\n\t\t\t\t\t\t// block-level elements need to be inline with layout\n\t\t\t\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === \"inline\" ) {\n\t\t\t\t\t\t\tthis.style.display = \"inline-block\";\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.style.zoom = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( opt.overflow != null ) {\n\t\t\t\tthis.style.overflow = \"hidden\";\n\t\t\t}\n\n\t\t\tfor ( p in prop ) {\n\t\t\t\te = new jQuery.fx( this, opt, p );\n\t\t\t\tval = prop[ p ];\n\n\t\t\t\tif ( rfxtypes.test( val ) ) {\n\n\t\t\t\t\t// Tracks whether to show or hide based on private\n\t\t\t\t\t// data attached to the element\n\t\t\t\t\tmethod = jQuery._data( this, \"toggle\" + p ) || ( val === \"toggle\" ? hidden ? \"show\" : \"hide\" : 0 );\n\t\t\t\t\tif ( method ) {\n\t\t\t\t\t\tjQuery._data( this, \"toggle\" + p, method === \"show\" ? \"hide\" : \"show\" );\n\t\t\t\t\t\te[ method ]();\n\t\t\t\t\t} else {\n\t\t\t\t\t\te[ val ]();\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tparts = rfxnum.exec( val );\n\t\t\t\t\tstart = e.cur();\n\n\t\t\t\t\tif ( parts ) {\n\t\t\t\t\t\tend = parseFloat( parts[2] );\n\t\t\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ p ] ? \"\" : \"px\" );\n\n\t\t\t\t\t\t// We need to compute starting value\n\t\t\t\t\t\tif ( unit !== \"px\" ) {\n\t\t\t\t\t\t\tjQuery.style( this, p, (end || 1) + unit);\n\t\t\t\t\t\t\tstart = ( (end || 1) / e.cur() ) * start;\n\t\t\t\t\t\t\tjQuery.style( this, p, start + unit);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\t\t\tif ( parts[1] ) {\n\t\t\t\t\t\t\tend = ( (parts[ 1 ] === \"-=\" ? -1 : 1) * end ) + start;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\te.custom( start, end, unit );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.custom( start, val, \"\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// For JS strict compliance\n\t\t\treturn true;\n\t\t}\n\n\t\treturn optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\thadTimers = false,\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\t// clear marker counters if we know they won't be\n\t\t\tif ( !gotoEnd ) {\n\t\t\t\tjQuery._unmark( true, this );\n\t\t\t}\n\n\t\t\tfunction stopQueue( elem, data, index ) {\n\t\t\t\tvar hooks = data[ index ];\n\t\t\t\tjQuery.removeData( elem, index, true );\n\t\t\t\thooks.stop( gotoEnd );\n\t\t\t}\n\n\t\t\tif ( type == null ) {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && index.indexOf(\".run\") === index.length - 4 ) {\n\t\t\t\t\t\tstopQueue( this, data, index );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if ( data[ index = type + \".run\" ] && data[ index ].stop ){\n\t\t\t\tstopQueue( this, data, index );\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\tif ( gotoEnd ) {\n\n\t\t\t\t\t\t// force the next step to be the last\n\t\t\t\t\t\ttimers[ index ]( true );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttimers[ index ].saveState();\n\t\t\t\t\t}\n\t\t\t\t\thadTimers = true;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( !( gotoEnd && hadTimers ) ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t}\n\n});\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout( clearFxNow, 0 );\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction clearFxNow() {\n\tfxNow = undefined;\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, num ) {\n\tvar obj = {};\n\n\tjQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {\n\t\tobj[ this ] = type;\n\t});\n\n\treturn obj;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx( \"show\", 1 ),\n\tslideUp: genFx( \"hide\", 1 ),\n\tslideToggle: genFx( \"toggle\", 1 ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.extend({\n\tspeed: function( speed, easing, fn ) {\n\t\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\t\tcomplete: fn || !fn && easing ||\n\t\t\t\tjQuery.isFunction( speed ) && speed,\n\t\t\tduration: speed,\n\t\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t\t};\n\n\t\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\t\tif ( opt.queue == null || opt.queue === true ) {\n\t\t\topt.queue = \"fx\";\n\t\t}\n\n\t\t// Queueing\n\t\topt.old = opt.complete;\n\n\t\topt.complete = function( noUnmark ) {\n\t\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\t\topt.old.call( this );\n\t\t\t}\n\n\t\t\tif ( opt.queue ) {\n\t\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t\t} else if ( noUnmark !== false ) {\n\t\t\t\tjQuery._unmark( this );\n\t\t\t}\n\t\t};\n\n\t\treturn opt;\n\t},\n\n\teasing: {\n\t\tlinear: function( p ) {\n\t\t\treturn p;\n\t\t},\n\t\tswing: function( p ) {\n\t\t\treturn ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;\n\t\t}\n\t},\n\n\ttimers: [],\n\n\tfx: function( elem, options, prop ) {\n\t\tthis.options = options;\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\n\t\toptions.orig = options.orig || {};\n\t}\n\n});\n\njQuery.fx.prototype = {\n\t// Simple function for setting a style value\n\tupdate: function() {\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\t( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );\n\t},\n\n\t// Get the current size\n\tcur: function() {\n\t\tif ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {\n\t\t\treturn this.elem[ this.prop ];\n\t\t}\n\n\t\tvar parsed,\n\t\t\tr = jQuery.css( this.elem, this.prop );\n\t\t// Empty strings, null, undefined and \"auto\" are converted to 0,\n\t\t// complex values such as \"rotate(1rad)\" are returned as is,\n\t\t// simple values such as \"10px\" are parsed to Float.\n\t\treturn isNaN( parsed = parseFloat( r ) ) ? !r || r === \"auto\" ? 0 : r : parsed;\n\t},\n\n\t// Start an animation from one number to another\n\tcustom: function( from, to, unit ) {\n\t\tvar self = this,\n\t\t\tfx = jQuery.fx;\n\n\t\tthis.startTime = fxNow || createFxNow();\n\t\tthis.end = to;\n\t\tthis.now = this.start = from;\n\t\tthis.pos = this.state = 0;\n\t\tthis.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? \"\" : \"px\" );\n\n\t\tfunction t( gotoEnd ) {\n\t\t\treturn self.step( gotoEnd );\n\t\t}\n\n\t\tt.queue = this.options.queue;\n\t\tt.elem = this.elem;\n\t\tt.saveState = function() {\n\t\t\tif ( jQuery._data( self.elem, \"fxshow\" + self.prop ) === undefined ) {\n\t\t\t\tif ( self.options.hide ) {\n\t\t\t\t\tjQuery._data( self.elem, \"fxshow\" + self.prop, self.start );\n\t\t\t\t} else if ( self.options.show ) {\n\t\t\t\t\tjQuery._data( self.elem, \"fxshow\" + self.prop, self.end );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif ( t() && jQuery.timers.push(t) && !timerId ) {\n\t\t\ttimerId = setInterval( fx.tick, fx.interval );\n\t\t}\n\t},\n\n\t// Simple 'show' function\n\tshow: function() {\n\t\tvar dataShow = jQuery._data( this.elem, \"fxshow\" + this.prop );\n\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );\n\t\tthis.options.show = true;\n\n\t\t// Begin the animation\n\t\t// Make sure that we start at a small width/height to avoid any flash of content\n\t\tif ( dataShow !== undefined ) {\n\t\t\t// This show is picking up where a previous hide or show left off\n\t\t\tthis.custom( this.cur(), dataShow );\n\t\t} else {\n\t\t\tthis.custom( this.prop === \"width\" || this.prop === \"height\" ? 1 : 0, this.cur() );\n\t\t}\n\n\t\t// Start by showing the element\n\t\tjQuery( this.elem ).show();\n\t},\n\n\t// Simple 'hide' function\n\thide: function() {\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[ this.prop ] = jQuery._data( this.elem, \"fxshow\" + this.prop ) || jQuery.style( this.elem, this.prop );\n\t\tthis.options.hide = true;\n\n\t\t// Begin the animation\n\t\tthis.custom( this.cur(), 0 );\n\t},\n\n\t// Each step of an animation\n\tstep: function( gotoEnd ) {\n\t\tvar p, n, complete,\n\t\t\tt = fxNow || createFxNow(),\n\t\t\tdone = true,\n\t\t\telem = this.elem,\n\t\t\toptions = this.options;\n\n\t\tif ( gotoEnd || t >= options.duration + this.startTime ) {\n\t\t\tthis.now = this.end;\n\t\t\tthis.pos = this.state = 1;\n\t\t\tthis.update();\n\n\t\t\toptions.animatedProperties[ this.prop ] = true;\n\n\t\t\tfor ( p in options.animatedProperties ) {\n\t\t\t\tif ( options.animatedProperties[ p ] !== true ) {\n\t\t\t\t\tdone = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( done ) {\n\t\t\t\t// Reset the overflow\n\t\t\t\tif ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {\n\n\t\t\t\t\tjQuery.each( [ \"\", \"X\", \"Y\" ], function( index, value ) {\n\t\t\t\t\t\telem.style[ \"overflow\" + value ] = options.overflow[ index ];\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Hide the element if the \"hide\" operation was done\n\t\t\t\tif ( options.hide ) {\n\t\t\t\t\tjQuery( elem ).hide();\n\t\t\t\t}\n\n\t\t\t\t// Reset the properties, if the item has been hidden or shown\n\t\t\t\tif ( options.hide || options.show ) {\n\t\t\t\t\tfor ( p in options.animatedProperties ) {\n\t\t\t\t\t\tjQuery.style( elem, p, options.orig[ p ] );\n\t\t\t\t\t\tjQuery.removeData( elem, \"fxshow\" + p, true );\n\t\t\t\t\t\t// Toggle data is no longer needed\n\t\t\t\t\t\tjQuery.removeData( elem, \"toggle\" + p, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Execute the complete function\n\t\t\t\t// in the event that the complete function throws an exception\n\t\t\t\t// we must ensure it won't be called twice. #5684\n\n\t\t\t\tcomplete = options.complete;\n\t\t\t\tif ( complete ) {\n\n\t\t\t\t\toptions.complete = false;\n\t\t\t\t\tcomplete.call( elem );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t} else {\n\t\t\t// classical easing cannot be used with an Infinity duration\n\t\t\tif ( options.duration == Infinity ) {\n\t\t\t\tthis.now = t;\n\t\t\t} else {\n\t\t\t\tn = t - this.startTime;\n\t\t\t\tthis.state = n / options.duration;\n\n\t\t\t\t// Perform the easing function, defaults to swing\n\t\t\t\tthis.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );\n\t\t\t\tthis.now = this.start + ( (this.end - this.start) * this.pos );\n\t\t\t}\n\t\t\t// Perform the next step of the animation\n\t\t\tthis.update();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n\njQuery.extend( jQuery.fx, {\n\ttick: function() {\n\t\tvar timer,\n\t\t\ttimers = jQuery.timers,\n\t\t\ti = 0;\n\n\t\tfor ( ; i < timers.length; i++ ) {\n\t\t\ttimer = timers[ i ];\n\t\t\t// Checks the timer has not already been removed\n\t\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\t\ttimers.splice( i--, 1 );\n\t\t\t}\n\t\t}\n\n\t\tif ( !timers.length ) {\n\t\t\tjQuery.fx.stop();\n\t\t}\n\t},\n\n\tinterval: 13,\n\n\tstop: function() {\n\t\tclearInterval( timerId );\n\t\ttimerId = null;\n\t},\n\n\tspeeds: {\n\t\tslow: 600,\n\t\tfast: 200,\n\t\t// Default speed\n\t\t_default: 400\n\t},\n\n\tstep: {\n\t\topacity: function( fx ) {\n\t\t\tjQuery.style( fx.elem, \"opacity\", fx.now );\n\t\t},\n\n\t\t_default: function( fx ) {\n\t\t\tif ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {\n\t\t\t\tfx.elem.style[ fx.prop ] = fx.now + fx.unit;\n\t\t\t} else {\n\t\t\t\tfx.elem[ fx.prop ] = fx.now;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Ensure props that can't be negative don't go there on undershoot easing\njQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {\n\t// exclude marginTop, marginLeft, marginBottom and marginRight from this list\n\tif ( prop.indexOf( \"margin\" ) ) {\n\t\tjQuery.fx.step[ prop ] = function( fx ) {\n\t\t\tjQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );\n\t\t};\n\t}\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\n\n// Try to restore the default display value of an element\nfunction defaultDisplay( nodeName ) {\n\n\tif ( !elemdisplay[ nodeName ] ) {\n\n\t\tvar body = document.body,\n\t\t\telem = jQuery( \"<\" + nodeName + \">\" ).appendTo( body ),\n\t\t\tdisplay = elem.css( \"display\" );\n\t\telem.remove();\n\n\t\t// If the simple way fails,\n\t\t// get element's real default display by attaching it to a temp iframe\n\t\tif ( display === \"none\" || display === \"\" ) {\n\t\t\t// No iframe to use yet, so create it\n\t\t\tif ( !iframe ) {\n\t\t\t\tiframe = document.createElement( \"iframe\" );\n\t\t\t\tiframe.frameBorder = iframe.width = iframe.height = 0;\n\t\t\t}\n\n\t\t\tbody.appendChild( iframe );\n\n\t\t\t// Create a cacheable copy of the iframe document on first call.\n\t\t\t// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML\n\t\t\t// document to it; WebKit & Firefox won't allow reusing the iframe document.\n\t\t\tif ( !iframeDoc || !iframe.createElement ) {\n\t\t\t\tiframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\n\t\t\t\tiframeDoc.write( ( jQuery.support.boxModel ? \"<!doctype html>\" : \"\" ) + \"<html><body>\" );\n\t\t\t\tiframeDoc.close();\n\t\t\t}\n\n\t\t\telem = iframeDoc.createElement( nodeName );\n\n\t\t\tiframeDoc.body.appendChild( elem );\n\n\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\tbody.removeChild( iframe );\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn elemdisplay[ nodeName ];\n}\n\n\n\n\nvar getOffset,\n\trtable = /^t(?:able|d|h)$/i,\n\trroot = /^(?:body|html)$/i;\n\nif ( \"getBoundingClientRect\" in document.documentElement ) {\n\tgetOffset = function( elem, doc, docElem, box ) {\n\t\ttry {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t} catch(e) {}\n\n\t\t// Make sure we're not dealing with a disconnected DOM node\n\t\tif ( !box || !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box ? { top: box.top, left: box.left } : { top: 0, left: 0 };\n\t\t}\n\n\t\tvar body = doc.body,\n\t\t\twin = getWindow( doc ),\n\t\t\tclientTop  = docElem.clientTop  || body.clientTop  || 0,\n\t\t\tclientLeft = docElem.clientLeft || body.clientLeft || 0,\n\t\t\tscrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,\n\t\t\tscrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,\n\t\t\ttop  = box.top  + scrollTop  - clientTop,\n\t\t\tleft = box.left + scrollLeft - clientLeft;\n\n\t\treturn { top: top, left: left };\n\t};\n\n} else {\n\tgetOffset = function( elem, doc, docElem ) {\n\t\tvar computedStyle,\n\t\t\toffsetParent = elem.offsetParent,\n\t\t\tprevOffsetParent = elem,\n\t\t\tbody = doc.body,\n\t\t\tdefaultView = doc.defaultView,\n\t\t\tprevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,\n\t\t\ttop = elem.offsetTop,\n\t\t\tleft = elem.offsetLeft;\n\n\t\twhile ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {\n\t\t\tif ( jQuery.support.fixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcomputedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;\n\t\t\ttop  -= elem.scrollTop;\n\t\t\tleft -= elem.scrollLeft;\n\n\t\t\tif ( elem === offsetParent ) {\n\t\t\t\ttop  += elem.offsetTop;\n\t\t\t\tleft += elem.offsetLeft;\n\n\t\t\t\tif ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {\n\t\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t\t}\n\n\t\t\t\tprevOffsetParent = offsetParent;\n\t\t\t\toffsetParent = elem.offsetParent;\n\t\t\t}\n\n\t\t\tif ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== \"visible\" ) {\n\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t}\n\n\t\t\tprevComputedStyle = computedStyle;\n\t\t}\n\n\t\tif ( prevComputedStyle.position === \"relative\" || prevComputedStyle.position === \"static\" ) {\n\t\t\ttop  += body.offsetTop;\n\t\t\tleft += body.offsetLeft;\n\t\t}\n\n\t\tif ( jQuery.support.fixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\ttop  += Math.max( docElem.scrollTop, body.scrollTop );\n\t\t\tleft += Math.max( docElem.scrollLeft, body.scrollLeft );\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t};\n}\n\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar elem = this[0],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn null;\n\t}\n\n\tif ( elem === doc.body ) {\n\t\treturn jQuery.offset.bodyOffset( elem );\n\t}\n\n\treturn getOffset( elem, doc, doc.documentElement );\n};\n\njQuery.offset = {\n\n\tbodyOffset: function( body ) {\n\t\tvar top = body.offsetTop,\n\t\t\tleft = body.offsetLeft;\n\n\t\tif ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {\n\t\t\ttop  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\n\t\t\tleft += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t},\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[0] ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar elem = this[0],\n\n\t\t// Get *real* offsetParent\n\t\toffsetParent = this.offsetParent(),\n\n\t\t// Get correct offsets\n\t\toffset       = this.offset(),\n\t\tparentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\n\n\t\t// Subtract element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\toffset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\n\t\toffset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\n\n\t\t// Add offsetParent borders\n\t\tparentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\n\t\tparentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\n\n\t\t// Subtract the two offsets\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top,\n\t\t\tleft: offset.left - parentOffset.left\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.body;\n\t\t\twhile ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\tjQuery.support.boxModel && win.document.documentElement[ method ] ||\n\t\t\t\t\t\twin.document.body[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\t top ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n\n\n\n\n// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tvar clientProp = \"client\" + name,\n\t\tscrollProp = \"scroll\" + name,\n\t\toffsetProp = \"offset\" + name;\n\n\t// innerHeight and innerWidth\n\tjQuery.fn[ \"inner\" + name ] = function() {\n\t\tvar elem = this[0];\n\t\treturn elem ?\n\t\t\telem.style ?\n\t\t\tparseFloat( jQuery.css( elem, type, \"padding\" ) ) :\n\t\t\tthis[ type ]() :\n\t\t\tnull;\n\t};\n\n\t// outerHeight and outerWidth\n\tjQuery.fn[ \"outer\" + name ] = function( margin ) {\n\t\tvar elem = this[0];\n\t\treturn elem ?\n\t\t\telem.style ?\n\t\t\tparseFloat( jQuery.css( elem, type, margin ? \"margin\" : \"border\" ) ) :\n\t\t\tthis[ type ]() :\n\t\t\tnull;\n\t};\n\n\tjQuery.fn[ type ] = function( value ) {\n\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\tvar doc, docElemProp, orig, ret;\n\n\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat\n\t\t\t\tdoc = elem.document;\n\t\t\t\tdocElemProp = doc.documentElement[ clientProp ];\n\t\t\t\treturn jQuery.support.boxModel && docElemProp ||\n\t\t\t\t\tdoc.body && doc.body[ clientProp ] || docElemProp;\n\t\t\t}\n\n\t\t\t// Get document width or height\n\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height], whichever is greater\n\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t// when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]\n\t\t\t\t// so we can't use max, as it'll choose the incorrect offset[Width/Height]\n\t\t\t\t// instead we use the correct client[Width/Height]\n\t\t\t\t// support:IE6\n\t\t\t\tif ( doc[ clientProp ] >= doc[ scrollProp ] ) {\n\t\t\t\t\treturn doc[ clientProp ];\n\t\t\t\t}\n\n\t\t\t\treturn Math.max(\n\t\t\t\t\telem.body[ scrollProp ], doc[ scrollProp ],\n\t\t\t\t\telem.body[ offsetProp ], doc[ offsetProp ]\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Get width or height on the element\n\t\t\tif ( value === undefined ) {\n\t\t\t\torig = jQuery.css( elem, type );\n\t\t\t\tret = parseFloat( orig );\n\t\t\t\treturn jQuery.isNumeric( ret ) ? ret : orig;\n\t\t\t}\n\n\t\t\t// Set the width or height on the element\n\t\t\tjQuery( elem ).css( type, value );\n\t\t}, type, value, arguments.length, null );\n\t};\n});\n\n\n\n\n// Expose jQuery to the global object\nwindow.jQuery = window.$ = jQuery;\n\n// Expose jQuery as an AMD module, but only for AMD loaders that\n// understand the issues with loading multiple versions of jQuery\n// in a page that all might call define(). The loader will indicate\n// they have special allowances for multiple jQuery versions by\n// specifying define.amd.jQuery = true. Register as a named module,\n// since jQuery can be concatenated with other files that may use define,\n// but not use a proper concatenation script that understands anonymous\n// AMD modules. A named AMD is safest and most robust way to register.\n// Lowercase jquery is used because AMD module names are derived from\n// file names, and jQuery is normally delivered in a lowercase file name.\n// Do this after creating the global so that if an AMD module wants to call\n// noConflict to hide this version of jQuery, it will work.\nif ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\n\tdefine( \"jquery\", [], function () { return jQuery; } );\n}\n\n\n\n})( window );\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/js",
    "content": "#!/usr/bin/env node\nconsole.log(\"Node\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/js2",
    "content": "#!/usr/bin/env node\nvar http = require('http');\nhttp.createServer(function (req, res) {\n  res.writeHead(200, {'Content-Type': 'text/plain'});\n  res.end('Hello World\\n');\n}).listen(1337, '127.0.0.1');\nconsole.log('Server running at http://127.0.0.1:1337/');\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/jsbuild.jsb",
    "content": "jsb.library('mylibrary', jsb.STATIC_LIBRARY, function(libObject) {\n    libObject.outputName = 'mylibrary';\n    libObject.cflags = [ '-Wall' ];\n    libObject.ldflags = [ '-pthread' ];\n    libObject.includePaths = [ 'src/include' ];\n    libObject.sources = [ \n        'src/main.cpp',\n        'src/app.cpp'\n    ];\n});\n\njsb.build();\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/json2_backbone.js",
    "content": "// Inline json2\nvar JSON;if(!JSON){JSON={}}(function(){function f(n){return n<10?\"0\"+n:n}if(typeof Date.prototype.toJSON!==\"function\"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+\"-\"+f(this.getUTCMonth()+1)+\"-\"+f(this.getUTCDate())+\"T\"+f(this.getUTCHours())+\":\"+f(this.getUTCMinutes())+\":\"+f(this.getUTCSeconds())+\"Z\":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,escapable=/[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,gap,indent,meta={\"\\b\":\"\\\\b\",\"\\t\":\"\\\\t\",\"\\n\":\"\\\\n\",\"\\f\":\"\\\\f\",\"\\r\":\"\\\\r\",'\"':'\\\\\"',\"\\\\\":\"\\\\\\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'\"'+string.replace(escapable,function(a){var c=meta[a];return typeof c===\"string\"?c:\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})+'\"':'\"'+string+'\"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value===\"object\"&&typeof value.toJSON===\"function\"){value=value.toJSON(key)}if(typeof rep===\"function\"){value=rep.call(holder,key,value)}switch(typeof value){case\"string\":return quote(value);case\"number\":return isFinite(value)?String(value):\"null\";case\"boolean\":case\"null\":return String(value);case\"object\":if(!value){return\"null\"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)===\"[object Array]\"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||\"null\"}v=partial.length===0?\"[]\":gap?\"[\\n\"+gap+partial.join(\",\\n\"+gap)+\"\\n\"+mind+\"]\":\"[\"+partial.join(\",\")+\"]\";gap=mind;return v}if(rep&&typeof rep===\"object\"){length=rep.length;for(i=0;i<length;i+=1){if(typeof rep[i]===\"string\"){k=rep[i];v=str(k,value);if(v){partial.push(quote(k)+(gap?\": \":\":\")+v)}}}}else{for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?\": \":\":\")+v)}}}}v=partial.length===0?\"{}\":gap?\"{\\n\"+gap+partial.join(\",\\n\"+gap)+\"\\n\"+mind+\"}\":\"{\"+partial.join(\",\")+\"}\";gap=mind;return v}}if(typeof JSON.stringify!==\"function\"){JSON.stringify=function(value,replacer,space){var i;gap=\"\";indent=\"\";if(typeof space===\"number\"){for(i=0;i<space;i+=1){indent+=\" \"}}else{if(typeof space===\"string\"){indent=space}}rep=replacer;if(replacer&&typeof replacer!==\"function\"&&(typeof replacer!==\"object\"||typeof replacer.length!==\"number\")){throw new Error(\"JSON.stringify\")}return str(\"\",{\"\":value})}}if(typeof JSON.parse!==\"function\"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value===\"object\"){for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\\],:{}\\s]*$/.test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\"@\").replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\"]\").replace(/(?:^|:|,)(?:\\s*\\[)+/g,\"\"))){j=eval(\"(\"+text+\")\");return typeof reviver===\"function\"?walk({\"\":j},\"\"):j}throw new SyntaxError(\"JSON.parse\")}}}());\n\n//     Backbone.js 0.5.0\n//     (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.\n//     Backbone may be freely distributed under the MIT license.\n//     For all details and documentation:\n//     http://documentcloud.github.com/backbone\n\n(function(){\n\n  // Initial Setup\n  // -------------\n\n  // Save a reference to the global object.\n  var root = this;\n\n  // Save the previous value of the `Backbone` variable.\n  var previousBackbone = root.Backbone;\n\n  // The top-level namespace. All public Backbone classes and modules will\n  // be attached to this. Exported for both CommonJS and the browser.\n  var Backbone;\n  if (typeof exports !== 'undefined') {\n    Backbone = exports;\n  } else {\n    Backbone = root.Backbone = {};\n  }\n\n  // Current version of the library. Keep in sync with `package.json`.\n  Backbone.VERSION = '0.5.0';\n\n  // Require Underscore, if we're on the server, and it's not already present.\n  var _ = root._;\n  if (!_ && (typeof require !== 'undefined')) _ = require('underscore')._;\n\n  // For Backbone's purposes, jQuery or Zepto owns the `$` variable.\n  var $ = root.jQuery || root.Zepto;\n\n  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable\n  // to its previous owner. Returns a reference to this Backbone object.\n  Backbone.noConflict = function() {\n    root.Backbone = previousBackbone;\n    return this;\n  };\n\n  // Turn on `emulateHTTP` to use support legacy HTTP servers. Setting this option will\n  // fake `\"PUT\"` and `\"DELETE\"` requests via the `_method` parameter and set a\n  // `X-Http-Method-Override` header.\n  Backbone.emulateHTTP = false;\n\n  // Turn on `emulateJSON` to support legacy servers that can't deal with direct\n  // `application/json` requests ... will encode the body as\n  // `application/x-www-form-urlencoded` instead and will send the model in a\n  // form param named `model`.\n  Backbone.emulateJSON = false;\n\n  // Backbone.Events\n  // -----------------\n\n  // A module that can be mixed in to *any object* in order to provide it with\n  // custom events. You may `bind` or `unbind` a callback function to an event;\n  // `trigger`-ing an event fires all callbacks in succession.\n  //\n  //     var object = {};\n  //     _.extend(object, Backbone.Events);\n  //     object.bind('expand', function(){ alert('expanded'); });\n  //     object.trigger('expand');\n  //\n  Backbone.Events = {\n\n    // Bind an event, specified by a string name, `ev`, to a `callback` function.\n    // Passing `\"all\"` will bind the callback to all events fired.\n    bind : function(ev, callback) {\n      var calls = this._callbacks || (this._callbacks = {});\n      var list  = calls[ev] || (calls[ev] = []);\n      list.push(callback);\n      return this;\n    },\n\n    // Remove one or many callbacks. If `callback` is null, removes all\n    // callbacks for the event. If `ev` is null, removes all bound callbacks\n    // for all events.\n    unbind : function(ev, callback) {\n      var calls;\n      if (!ev) {\n        this._callbacks = {};\n      } else if (calls = this._callbacks) {\n        if (!callback) {\n          calls[ev] = [];\n        } else {\n          var list = calls[ev];\n          if (!list) return this;\n          for (var i = 0, l = list.length; i < l; i++) {\n            if (callback === list[i]) {\n              list[i] = null;\n              break;\n            }\n          }\n        }\n      }\n      return this;\n    },\n\n    // Trigger an event, firing all bound callbacks. Callbacks are passed the\n    // same arguments as `trigger` is, apart from the event name.\n    // Listening for `\"all\"` passes the true event name as the first argument.\n    trigger : function(eventName) {\n      var list, calls, ev, callback, args;\n      var both = 2;\n      if (!(calls = this._callbacks)) return this;\n      while (both--) {\n        ev = both ? eventName : 'all';\n        if (list = calls[ev]) {\n          for (var i = 0, l = list.length; i < l; i++) {\n            if (!(callback = list[i])) {\n              list.splice(i, 1); i--; l--;\n            } else {\n              args = both ? Array.prototype.slice.call(arguments, 1) : arguments;\n              callback.apply(this, args);\n            }\n          }\n        }\n      }\n      return this;\n    }\n\n  };\n\n  // Backbone.Model\n  // --------------\n\n  // Create a new model, with defined attributes. A client id (`cid`)\n  // is automatically generated and assigned for you.\n  Backbone.Model = function(attributes, options) {\n    var defaults;\n    attributes || (attributes = {});\n    if (defaults = this.defaults) {\n      if (_.isFunction(defaults)) defaults = defaults();\n      attributes = _.extend({}, defaults, attributes);\n    }\n    this.attributes = {};\n    this._escapedAttributes = {};\n    this.cid = _.uniqueId('c');\n    this.set(attributes, {silent : true});\n    this._changed = false;\n    this._previousAttributes = _.clone(this.attributes);\n    if (options && options.collection) this.collection = options.collection;\n    this.initialize.apply(this, arguments);\n  };\n\n  // Attach all inheritable methods to the Model prototype.\n  _.extend(Backbone.Model.prototype, Backbone.Events, {\n\n    // A snapshot of the model's previous attributes, taken immediately\n    // after the last `\"change\"` event was fired.\n    _previousAttributes : null,\n\n    // Has the item been changed since the last `\"change\"` event?\n    _changed : false,\n\n    // The default name for the JSON `id` attribute is `\"id\"`. MongoDB and\n    // CouchDB users may want to set this to `\"_id\"`.\n    idAttribute : 'id',\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize : function(){},\n\n    // Return a copy of the model's `attributes` object.\n    toJSON : function() {\n      return _.clone(this.attributes);\n    },\n\n    // Get the value of an attribute.\n    get : function(attr) {\n      return this.attributes[attr];\n    },\n\n    // Get the HTML-escaped value of an attribute.\n    escape : function(attr) {\n      var html;\n      if (html = this._escapedAttributes[attr]) return html;\n      var val = this.attributes[attr];\n      return this._escapedAttributes[attr] = escapeHTML(val == null ? '' : '' + val);\n    },\n\n    // Returns `true` if the attribute contains a value that is not null\n    // or undefined.\n    has : function(attr) {\n      return this.attributes[attr] != null;\n    },\n\n    // Set a hash of model attributes on the object, firing `\"change\"` unless you\n    // choose to silence it.\n    set : function(attrs, options) {\n\n      // Extract attributes and options.\n      options || (options = {});\n      if (!attrs) return this;\n      if (attrs.attributes) attrs = attrs.attributes;\n      var now = this.attributes, escaped = this._escapedAttributes;\n\n      // Run validation.\n      if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false;\n\n      // Check for changes of `id`.\n      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];\n\n      // We're about to start triggering change events.\n      var alreadyChanging = this._changing;\n      this._changing = true;\n\n      // Update attributes.\n      for (var attr in attrs) {\n        var val = attrs[attr];\n        if (!_.isEqual(now[attr], val)) {\n          now[attr] = val;\n          delete escaped[attr];\n          this._changed = true;\n          if (!options.silent) this.trigger('change:' + attr, this, val, options);\n        }\n      }\n\n      // Fire the `\"change\"` event, if the model has been changed.\n      if (!alreadyChanging && !options.silent && this._changed) this.change(options);\n      this._changing = false;\n      return this;\n    },\n\n    // Remove an attribute from the model, firing `\"change\"` unless you choose\n    // to silence it. `unset` is a noop if the attribute doesn't exist.\n    unset : function(attr, options) {\n      if (!(attr in this.attributes)) return this;\n      options || (options = {});\n      var value = this.attributes[attr];\n\n      // Run validation.\n      var validObj = {};\n      validObj[attr] = void 0;\n      if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;\n\n      // Remove the attribute.\n      delete this.attributes[attr];\n      delete this._escapedAttributes[attr];\n      if (attr == this.idAttribute) delete this.id;\n      this._changed = true;\n      if (!options.silent) {\n        this.trigger('change:' + attr, this, void 0, options);\n        this.change(options);\n      }\n      return this;\n    },\n\n    // Clear all attributes on the model, firing `\"change\"` unless you choose\n    // to silence it.\n    clear : function(options) {\n      options || (options = {});\n      var attr;\n      var old = this.attributes;\n\n      // Run validation.\n      var validObj = {};\n      for (attr in old) validObj[attr] = void 0;\n      if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;\n\n      this.attributes = {};\n      this._escapedAttributes = {};\n      this._changed = true;\n      if (!options.silent) {\n        for (attr in old) {\n          this.trigger('change:' + attr, this, void 0, options);\n        }\n        this.change(options);\n      }\n      return this;\n    },\n\n    // Fetch the model from the server. If the server's representation of the\n    // model differs from its current attributes, they will be overriden,\n    // triggering a `\"change\"` event.\n    fetch : function(options) {\n      options || (options = {});\n      var model = this;\n      var success = options.success;\n      options.success = function(resp, status, xhr) {\n        if (!model.set(model.parse(resp, xhr), options)) return false;\n        if (success) success(model, resp);\n      };\n      options.error = wrapError(options.error, model, options);\n      return (this.sync || Backbone.sync).call(this, 'read', this, options);\n    },\n\n    // Set a hash of model attributes, and sync the model to the server.\n    // If the server returns an attributes hash that differs, the model's\n    // state will be `set` again.\n    save : function(attrs, options) {\n      options || (options = {});\n      if (attrs && !this.set(attrs, options)) return false;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp, status, xhr) {\n        if (!model.set(model.parse(resp, xhr), options)) return false;\n        if (success) success(model, resp, xhr);\n      };\n      options.error = wrapError(options.error, model, options);\n      var method = this.isNew() ? 'create' : 'update';\n      return (this.sync || Backbone.sync).call(this, method, this, options);\n    },\n\n    // Destroy this model on the server if it was already persisted. Upon success, the model is removed\n    // from its collection, if it has one.\n    destroy : function(options) {\n      options || (options = {});\n      if (this.isNew()) return this.trigger('destroy', this, this.collection, options);\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        model.trigger('destroy', model, model.collection, options);\n        if (success) success(model, resp);\n      };\n      options.error = wrapError(options.error, model, options);\n      return (this.sync || Backbone.sync).call(this, 'delete', this, options);\n    },\n\n    // Default URL for the model's representation on the server -- if you're\n    // using Backbone's restful methods, override this to change the endpoint\n    // that will be called.\n    url : function() {\n      var base = getUrl(this.collection) || this.urlRoot || urlError();\n      if (this.isNew()) return base;\n      return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id);\n    },\n\n    // **parse** converts a response into the hash of attributes to be `set` on\n    // the model. The default implementation is just to pass the response along.\n    parse : function(resp, xhr) {\n      return resp;\n    },\n\n    // Create a new model with identical attributes to this one.\n    clone : function() {\n      return new this.constructor(this);\n    },\n\n    // A model is new if it has never been saved to the server, and lacks an id.\n    isNew : function() {\n      return this.id == null;\n    },\n\n    // Call this method to manually fire a `change` event for this model.\n    // Calling this will cause all objects observing the model to update.\n    change : function(options) {\n      this.trigger('change', this, options);\n      this._previousAttributes = _.clone(this.attributes);\n      this._changed = false;\n    },\n\n    // Determine if the model has changed since the last `\"change\"` event.\n    // If you specify an attribute name, determine if that attribute has changed.\n    hasChanged : function(attr) {\n      if (attr) return this._previousAttributes[attr] != this.attributes[attr];\n      return this._changed;\n    },\n\n    // Return an object containing all the attributes that have changed, or false\n    // if there are no changed attributes. Useful for determining what parts of a\n    // view need to be updated and/or what attributes need to be persisted to\n    // the server.\n    changedAttributes : function(now) {\n      now || (now = this.attributes);\n      var old = this._previousAttributes;\n      var changed = false;\n      for (var attr in now) {\n        if (!_.isEqual(old[attr], now[attr])) {\n          changed = changed || {};\n          changed[attr] = now[attr];\n        }\n      }\n      return changed;\n    },\n\n    // Get the previous value of an attribute, recorded at the time the last\n    // `\"change\"` event was fired.\n    previous : function(attr) {\n      if (!attr || !this._previousAttributes) return null;\n      return this._previousAttributes[attr];\n    },\n\n    // Get all of the attributes of the model at the time of the previous\n    // `\"change\"` event.\n    previousAttributes : function() {\n      return _.clone(this._previousAttributes);\n    },\n\n    // Run validation against a set of incoming attributes, returning `true`\n    // if all is well. If a specific `error` callback has been passed,\n    // call that instead of firing the general `\"error\"` event.\n    _performValidation : function(attrs, options) {\n      var error = this.validate(attrs);\n      if (error) {\n        if (options.error) {\n          options.error(this, error, options);\n        } else {\n          this.trigger('error', this, error, options);\n        }\n        return false;\n      }\n      return true;\n    }\n\n  });\n\n  // Backbone.Collection\n  // -------------------\n\n  // Provides a standard collection class for our sets of models, ordered\n  // or unordered. If a `comparator` is specified, the Collection will maintain\n  // its models in sort order, as they're added and removed.\n  Backbone.Collection = function(models, options) {\n    options || (options = {});\n    if (options.comparator) this.comparator = options.comparator;\n    _.bindAll(this, '_onModelEvent', '_removeReference');\n    this._reset();\n    if (models) this.reset(models, {silent: true});\n    this.initialize.apply(this, arguments);\n  };\n\n  // Define the Collection's inheritable methods.\n  _.extend(Backbone.Collection.prototype, Backbone.Events, {\n\n    // The default model for a collection is just a **Backbone.Model**.\n    // This should be overridden in most cases.\n    model : Backbone.Model,\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize : function(){},\n\n    // The JSON representation of a Collection is an array of the\n    // models' attributes.\n    toJSON : function() {\n      return this.map(function(model){ return model.toJSON(); });\n    },\n\n    // Add a model, or list of models to the set. Pass **silent** to avoid\n    // firing the `added` event for every new model.\n    add : function(models, options) {\n      if (_.isArray(models)) {\n        for (var i = 0, l = models.length; i < l; i++) {\n          this._add(models[i], options);\n        }\n      } else {\n        this._add(models, options);\n      }\n      return this;\n    },\n\n    // Remove a model, or a list of models from the set. Pass silent to avoid\n    // firing the `removed` event for every model removed.\n    remove : function(models, options) {\n      if (_.isArray(models)) {\n        for (var i = 0, l = models.length; i < l; i++) {\n          this._remove(models[i], options);\n        }\n      } else {\n        this._remove(models, options);\n      }\n      return this;\n    },\n\n    // Get a model from the set by id.\n    get : function(id) {\n      if (id == null) return null;\n      return this._byId[id.id != null ? id.id : id];\n    },\n\n    // Get a model from the set by client id.\n    getByCid : function(cid) {\n      return cid && this._byCid[cid.cid || cid];\n    },\n\n    // Get the model at the given index.\n    at: function(index) {\n      return this.models[index];\n    },\n\n    // Force the collection to re-sort itself. You don't need to call this under normal\n    // circumstances, as the set will maintain sort order as each item is added.\n    sort : function(options) {\n      options || (options = {});\n      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');\n      this.models = this.sortBy(this.comparator);\n      if (!options.silent) this.trigger('reset', this, options);\n      return this;\n    },\n\n    // Pluck an attribute from each model in the collection.\n    pluck : function(attr) {\n      return _.map(this.models, function(model){ return model.get(attr); });\n    },\n\n    // When you have more items than you want to add or remove individually,\n    // you can reset the entire set with a new list of models, without firing\n    // any `added` or `removed` events. Fires `reset` when finished.\n    reset : function(models, options) {\n      models  || (models = []);\n      options || (options = {});\n      this.each(this._removeReference);\n      this._reset();\n      this.add(models, {silent: true});\n      if (!options.silent) this.trigger('reset', this, options);\n      return this;\n    },\n\n    // Fetch the default set of models for this collection, resetting the\n    // collection when they arrive. If `add: true` is passed, appends the\n    // models to the collection instead of resetting.\n    fetch : function(options) {\n      options || (options = {});\n      var collection = this;\n      var success = options.success;\n      options.success = function(resp, status, xhr) {\n        collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);\n        if (success) success(collection, resp);\n      };\n      options.error = wrapError(options.error, collection, options);\n      return (this.sync || Backbone.sync).call(this, 'read', this, options);\n    },\n\n    // Create a new instance of a model in this collection. After the model\n    // has been created on the server, it will be added to the collection.\n    // Returns the model, or 'false' if validation on a new model fails.\n    create : function(model, options) {\n      var coll = this;\n      options || (options = {});\n      model = this._prepareModel(model, options);\n      if (!model) return false;\n      var success = options.success;\n      options.success = function(nextModel, resp, xhr) {\n        coll.add(nextModel, options);\n        if (success) success(nextModel, resp, xhr);\n      };\n      model.save(null, options);\n      return model;\n    },\n\n    // **parse** converts a response into a list of models to be added to the\n    // collection. The default implementation is just to pass it through.\n    parse : function(resp, xhr) {\n      return resp;\n    },\n\n    // Proxy to _'s chain. Can't be proxied the same way the rest of the\n    // underscore methods are proxied because it relies on the underscore\n    // constructor.\n    chain: function () {\n      return _(this.models).chain();\n    },\n\n    // Reset all internal state. Called when the collection is reset.\n    _reset : function(options) {\n      this.length = 0;\n      this.models = [];\n      this._byId  = {};\n      this._byCid = {};\n    },\n\n    // Prepare a model to be added to this collection\n    _prepareModel: function(model, options) {\n      if (!(model instanceof Backbone.Model)) {\n        var attrs = model;\n        model = new this.model(attrs, {collection: this});\n        if (model.validate && !model._performValidation(attrs, options)) model = false;\n      } else if (!model.collection) {\n        model.collection = this;\n      }\n      return model;\n    },\n\n    // Internal implementation of adding a single model to the set, updating\n    // hash indexes for `id` and `cid` lookups.\n    // Returns the model, or 'false' if validation on a new model fails.\n    _add : function(model, options) {\n      options || (options = {});\n      model = this._prepareModel(model, options);\n      if (!model) return false;\n      var already = this.getByCid(model) || this.get(model);\n      if (already) throw new Error([\"Can't add the same model to a set twice\", already.id]);\n      this._byId[model.id] = model;\n      this._byCid[model.cid] = model;\n      var index = options.at != null ? options.at :\n                  this.comparator ? this.sortedIndex(model, this.comparator) :\n                  this.length;\n      this.models.splice(index, 0, model);\n      model.bind('all', this._onModelEvent);\n      this.length++;\n      if (!options.silent) model.trigger('add', model, this, options);\n      return model;\n    },\n\n    // Internal implementation of removing a single model from the set, updating\n    // hash indexes for `id` and `cid` lookups.\n    _remove : function(model, options) {\n      options || (options = {});\n      model = this.getByCid(model) || this.get(model);\n      if (!model) return null;\n      delete this._byId[model.id];\n      delete this._byCid[model.cid];\n      this.models.splice(this.indexOf(model), 1);\n      this.length--;\n      if (!options.silent) model.trigger('remove', model, this, options);\n      this._removeReference(model);\n      return model;\n    },\n\n    // Internal method to remove a model's ties to a collection.\n    _removeReference : function(model) {\n      if (this == model.collection) {\n        delete model.collection;\n      }\n      model.unbind('all', this._onModelEvent);\n    },\n\n    // Internal method called every time a model in the set fires an event.\n    // Sets need to update their indexes when models change ids. All other\n    // events simply proxy through. \"add\" and \"remove\" events that originate\n    // in other collections are ignored.\n    _onModelEvent : function(ev, model, collection, options) {\n      if ((ev == 'add' || ev == 'remove') && collection != this) return;\n      if (ev == 'destroy') {\n        this._remove(model, options);\n      }\n      if (model && ev === 'change:' + model.idAttribute) {\n        delete this._byId[model.previous(model.idAttribute)];\n        this._byId[model.id] = model;\n      }\n      this.trigger.apply(this, arguments);\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Collection.\n  var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', 'detect',\n    'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include',\n    'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size',\n    'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty'];\n\n  // Mix in each Underscore method as a proxy to `Collection#models`.\n  _.each(methods, function(method) {\n    Backbone.Collection.prototype[method] = function() {\n      return _[method].apply(_, [this.models].concat(_.toArray(arguments)));\n    };\n  });\n\n  // Backbone.Router\n  // -------------------\n\n  // Routers map faux-URLs to actions, and fire events when routes are\n  // matched. Creating a new one sets its `routes` hash, if not set statically.\n  Backbone.Router = function(options) {\n    options || (options = {});\n    if (options.routes) this.routes = options.routes;\n    this._bindRoutes();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regular expressions for matching named param parts and splatted\n  // parts of route strings.\n  var namedParam    = /:([\\w\\d]+)/g;\n  var splatParam    = /\\*([\\w\\d]+)/g;\n  var escapeRegExp  = /[-[\\]{}()+?.,\\\\^$|#\\s]/g;\n\n  // Set up all inheritable **Backbone.Router** properties and methods.\n  _.extend(Backbone.Router.prototype, Backbone.Events, {\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize : function(){},\n\n    // Manually bind a single named route to a callback. For example:\n    //\n    //     this.route('search/:query/p:num', 'search', function(query, num) {\n    //       ...\n    //     });\n    //\n    route : function(route, name, callback) {\n      Backbone.history || (Backbone.history = new Backbone.History);\n      if (!_.isRegExp(route)) route = this._routeToRegExp(route);\n      Backbone.history.route(route, _.bind(function(fragment) {\n        var args = this._extractParameters(route, fragment);\n        callback.apply(this, args);\n        this.trigger.apply(this, ['route:' + name].concat(args));\n      }, this));\n    },\n\n    // Simple proxy to `Backbone.history` to save a fragment into the history.\n    navigate : function(fragment, triggerRoute) {\n      Backbone.history.navigate(fragment, triggerRoute);\n    },\n\n    // Bind all defined routes to `Backbone.history`. We have to reverse the\n    // order of the routes here to support behavior where the most general\n    // routes can be defined at the bottom of the route map.\n    _bindRoutes : function() {\n      if (!this.routes) return;\n      var routes = [];\n      for (var route in this.routes) {\n        routes.unshift([route, this.routes[route]]);\n      }\n      for (var i = 0, l = routes.length; i < l; i++) {\n        this.route(routes[i][0], routes[i][1], this[routes[i][1]]);\n      }\n    },\n\n    // Convert a route string into a regular expression, suitable for matching\n    // against the current location hash.\n    _routeToRegExp : function(route) {\n      route = route.replace(escapeRegExp, \"\\\\$&\")\n                   .replace(namedParam, \"([^\\/]*)\")\n                   .replace(splatParam, \"(.*?)\");\n      return new RegExp('^' + route + '$');\n    },\n\n    // Given a route, and a URL fragment that it matches, return the array of\n    // extracted parameters.\n    _extractParameters : function(route, fragment) {\n      return route.exec(fragment).slice(1);\n    }\n\n  });\n\n  // Backbone.History\n  // ----------------\n\n  // Handles cross-browser history management, based on URL fragments. If the\n  // browser does not support `onhashchange`, falls back to polling.\n  Backbone.History = function() {\n    this.handlers = [];\n    _.bindAll(this, 'checkUrl');\n  };\n\n  // Cached regex for cleaning hashes.\n  var hashStrip = /^#*!?/;\n\n  // Cached regex for detecting MSIE.\n  var isExplorer = /msie [\\w.]+/;\n\n  // Has the history handling already been started?\n  var historyStarted = false;\n\n  // Set up all inheritable **Backbone.History** properties and methods.\n  _.extend(Backbone.History.prototype, {\n\n    // The default interval to poll for hash changes, if necessary, is\n    // twenty times a second.\n    interval: 50,\n\n    // Get the cross-browser normalized URL fragment, either from the URL,\n    // the hash, or the override.\n    getFragment : function(fragment, forcePushState) {\n      if (fragment == null) {\n        if (this._hasPushState || forcePushState) {\n          fragment = window.location.pathname;\n          var search = window.location.search;\n          if (search) fragment += search;\n          if (fragment.indexOf(this.options.root) == 0) fragment = fragment.substr(this.options.root.length);\n        } else {\n          fragment = window.location.hash;\n        }\n      }\n      return fragment.replace(hashStrip, '');\n    },\n\n    // Start the hash change handling, returning `true` if the current URL matches\n    // an existing route, and `false` otherwise.\n    start : function(options) {\n\n      // Figure out the initial configuration. Do we need an iframe?\n      // Is pushState desired ... is it available?\n      if (historyStarted) throw new Error(\"Backbone.history has already been started\");\n      this.options          = _.extend({}, {root: '/'}, this.options, options);\n      this._wantsPushState  = !!this.options.pushState;\n      this._hasPushState    = !!(this.options.pushState && window.history && window.history.pushState);\n      var fragment          = this.getFragment();\n      var docMode           = document.documentMode;\n      var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));\n      if (oldIE) {\n        this.iframe = $('<iframe src=\"javascript:0\" tabindex=\"-1\" />').hide().appendTo('body')[0].contentWindow;\n        this.navigate(fragment);\n      }\n\n      // Depending on whether we're using pushState or hashes, and whether\n      // 'onhashchange' is supported, determine how we check the URL state.\n      if (this._hasPushState) {\n        $(window).bind('popstate', this.checkUrl);\n      } else if ('onhashchange' in window && !oldIE) {\n        $(window).bind('hashchange', this.checkUrl);\n      } else {\n        setInterval(this.checkUrl, this.interval);\n      }\n\n      // Determine if we need to change the base url, for a pushState link\n      // opened by a non-pushState browser.\n      this.fragment = fragment;\n      historyStarted = true;\n      var loc = window.location;\n      var atRoot  = loc.pathname == this.options.root;\n      if (this._wantsPushState && !this._hasPushState && !atRoot) {\n        this.fragment = this.getFragment(null, true);\n        window.location = this.options.root + '#' + this.fragment;\n      } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) {\n        this.fragment = loc.hash.replace(hashStrip, '');\n        window.history.replaceState({}, document.title, loc.protocol + '//' + loc.host + this.options.root + this.fragment);\n      }\n      return this.loadUrl();\n    },\n\n    // Add a route to be tested when the fragment changes. Routes added later may\n    // override previous routes.\n    route : function(route, callback) {\n      this.handlers.unshift({route : route, callback : callback});\n    },\n\n    // Checks the current URL to see if it has changed, and if it has,\n    // calls `loadUrl`, normalizing across the hidden iframe.\n    checkUrl : function(e) {\n      var current = this.getFragment();\n      if (current == this.fragment && this.iframe) current = this.getFragment(this.iframe.location.hash);\n      if (current == this.fragment || current == decodeURIComponent(this.fragment)) return false;\n      if (this.iframe) this.navigate(current);\n      this.loadUrl() || this.loadUrl(window.location.hash);\n    },\n\n    // Attempt to load the current URL fragment. If a route succeeds with a\n    // match, returns `true`. If no defined routes matches the fragment,\n    // returns `false`.\n    loadUrl : function(fragmentOverride) {\n      var fragment = this.fragment = this.getFragment(fragmentOverride);\n      var matched = _.any(this.handlers, function(handler) {\n        if (handler.route.test(fragment)) {\n          handler.callback(fragment);\n          return true;\n        }\n      });\n      return matched;\n    },\n\n    // Save a fragment into the hash history. You are responsible for properly\n    // URL-encoding the fragment in advance. This does not trigger\n    // a `hashchange` event.\n    navigate : function(fragment, triggerRoute) {\n      var frag = (fragment || '').replace(hashStrip, '');\n      if (this.fragment == frag || this.fragment == decodeURIComponent(frag)) return;\n      if (this._hasPushState) {\n        var loc = window.location;\n        if (frag.indexOf(this.options.root) != 0) frag = this.options.root + frag;\n        this.fragment = frag;\n        window.history.pushState({}, document.title, loc.protocol + '//' + loc.host + frag);\n      } else {\n        window.location.hash = this.fragment = frag;\n        if (this.iframe && (frag != this.getFragment(this.iframe.location.hash))) {\n          this.iframe.document.open().close();\n          this.iframe.location.hash = frag;\n        }\n      }\n      if (triggerRoute) this.loadUrl(fragment);\n    }\n\n  });\n\n  // Backbone.View\n  // -------------\n\n  // Creating a Backbone.View creates its initial element outside of the DOM,\n  // if an existing element is not provided...\n  Backbone.View = function(options) {\n    this.cid = _.uniqueId('view');\n    this._configure(options || {});\n    this._ensureElement();\n    this.delegateEvents();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Element lookup, scoped to DOM elements within the current view.\n  // This should be prefered to global lookups, if you're dealing with\n  // a specific view.\n  var selectorDelegate = function(selector) {\n    return $(selector, this.el);\n  };\n\n  // Cached regex to split keys for `delegate`.\n  var eventSplitter = /^(\\S+)\\s*(.*)$/;\n\n  // List of view options to be merged as properties.\n  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName'];\n\n  // Set up all inheritable **Backbone.View** properties and methods.\n  _.extend(Backbone.View.prototype, Backbone.Events, {\n\n    // The default `tagName` of a View's element is `\"div\"`.\n    tagName : 'div',\n\n    // Attach the `selectorDelegate` function as the `$` property.\n    $       : selectorDelegate,\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize : function(){},\n\n    // **render** is the core function that your view should override, in order\n    // to populate its element (`this.el`), with the appropriate HTML. The\n    // convention is for **render** to always return `this`.\n    render : function() {\n      return this;\n    },\n\n    // Remove this view from the DOM. Note that the view isn't present in the\n    // DOM by default, so calling this method may be a no-op.\n    remove : function() {\n      $(this.el).remove();\n      return this;\n    },\n\n    // For small amounts of DOM Elements, where a full-blown template isn't\n    // needed, use **make** to manufacture elements, one at a time.\n    //\n    //     var el = this.make('li', {'class': 'row'}, this.model.escape('title'));\n    //\n    make : function(tagName, attributes, content) {\n      var el = document.createElement(tagName);\n      if (attributes) $(el).attr(attributes);\n      if (content) $(el).html(content);\n      return el;\n    },\n\n    // Set callbacks, where `this.callbacks` is a hash of\n    //\n    // *{\"event selector\": \"callback\"}*\n    //\n    //     {\n    //       'mousedown .title':  'edit',\n    //       'click .button':     'save'\n    //     }\n    //\n    // pairs. Callbacks will be bound to the view, with `this` set properly.\n    // Uses event delegation for efficiency.\n    // Omitting the selector binds the event to `this.el`.\n    // This only works for delegate-able events: not `focus`, `blur`, and\n    // not `change`, `submit`, and `reset` in Internet Explorer.\n    delegateEvents : function(events) {\n      if (!(events || (events = this.events))) return;\n      $(this.el).unbind('.delegateEvents' + this.cid);\n      for (var key in events) {\n        var method = this[events[key]];\n        if (!method) throw new Error('Event \"' + events[key] + '\" does not exist');\n        var match = key.match(eventSplitter);\n        var eventName = match[1], selector = match[2];\n        method = _.bind(method, this);\n        eventName += '.delegateEvents' + this.cid;\n        if (selector === '') {\n          $(this.el).bind(eventName, method);\n        } else {\n          $(this.el).delegate(selector, eventName, method);\n        }\n      }\n    },\n\n    // Performs the initial configuration of a View with a set of options.\n    // Keys with special meaning *(model, collection, id, className)*, are\n    // attached directly to the view.\n    _configure : function(options) {\n      if (this.options) options = _.extend({}, this.options, options);\n      for (var i = 0, l = viewOptions.length; i < l; i++) {\n        var attr = viewOptions[i];\n        if (options[attr]) this[attr] = options[attr];\n      }\n      this.options = options;\n    },\n\n    // Ensure that the View has a DOM element to render into.\n    // If `this.el` is a string, pass it through `$()`, take the first\n    // matching element, and re-assign it to `el`. Otherwise, create\n    // an element from the `id`, `className` and `tagName` proeprties.\n    _ensureElement : function() {\n      if (!this.el) {\n        var attrs = this.attributes || {};\n        if (this.id) attrs.id = this.id;\n        if (this.className) attrs['class'] = this.className;\n        this.el = this.make(this.tagName, attrs);\n      } else if (_.isString(this.el)) {\n        this.el = $(this.el).get(0);\n      }\n    }\n\n  });\n\n  // The self-propagating extend function that Backbone classes use.\n  var extend = function (protoProps, classProps) {\n    var child = inherits(this, protoProps, classProps);\n    child.extend = this.extend;\n    return child;\n  };\n\n  // Set up inheritance for the model, collection, and view.\n  Backbone.Model.extend = Backbone.Collection.extend =\n    Backbone.Router.extend = Backbone.View.extend = extend;\n\n  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.\n  var methodMap = {\n    'create': 'POST',\n    'update': 'PUT',\n    'delete': 'DELETE',\n    'read'  : 'GET'\n  };\n\n  // Backbone.sync\n  // -------------\n\n  // Override this function to change the manner in which Backbone persists\n  // models to the server. You will be passed the type of request, and the\n  // model in question. By default, uses makes a RESTful Ajax request\n  // to the model's `url()`. Some possible customizations could be:\n  //\n  // * Use `setTimeout` to batch rapid-fire updates into a single request.\n  // * Send up the models as XML instead of JSON.\n  // * Persist models via WebSockets instead of Ajax.\n  //\n  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests\n  // as `POST`, with a `_method` parameter containing the true HTTP method,\n  // as well as all requests with the body as `application/x-www-form-urlencoded` instead of\n  // `application/json` with the model in a param named `model`.\n  // Useful when interfacing with server-side languages like **PHP** that make\n  // it difficult to read the body of `PUT` requests.\n  Backbone.sync = function(method, model, options) {\n    var type = methodMap[method];\n\n    // Default JSON-request options.\n    var params = _.extend({\n      type:         type,\n      dataType:     'json',\n      processData:  false\n    }, options);\n\n    // Ensure that we have a URL.\n    if (!params.url) {\n      params.url = getUrl(model) || urlError();\n    }\n\n    // Ensure that we have the appropriate request data.\n    if (!params.data && model && (method == 'create' || method == 'update')) {\n      params.contentType = 'application/json';\n      params.data = JSON.stringify(model.toJSON());\n    }\n\n    // For older servers, emulate JSON by encoding the request into an HTML-form.\n    if (Backbone.emulateJSON) {\n      params.contentType = 'application/x-www-form-urlencoded';\n      params.processData = true;\n      params.data        = params.data ? {model : params.data} : {};\n    }\n\n    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`\n    // And an `X-HTTP-Method-Override` header.\n    if (Backbone.emulateHTTP) {\n      if (type === 'PUT' || type === 'DELETE') {\n        if (Backbone.emulateJSON) params.data._method = type;\n        params.type = 'POST';\n        params.beforeSend = function(xhr) {\n          xhr.setRequestHeader('X-HTTP-Method-Override', type);\n        };\n      }\n    }\n\n    // Make the request.\n    return $.ajax(params);\n  };\n\n  // Helpers\n  // -------\n\n  // Shared empty constructor function to aid in prototype-chain creation.\n  var ctor = function(){};\n\n  // Helper function to correctly set up the prototype chain, for subclasses.\n  // Similar to `goog.inherits`, but uses a hash of prototype properties and\n  // class properties to be extended.\n  var inherits = function(parent, protoProps, staticProps) {\n    var child;\n\n    // The constructor function for the new subclass is either defined by you\n    // (the \"constructor\" property in your `extend` definition), or defaulted\n    // by us to simply call `super()`.\n    if (protoProps && protoProps.hasOwnProperty('constructor')) {\n      child = protoProps.constructor;\n    } else {\n      child = function(){ return parent.apply(this, arguments); };\n    }\n\n    // Inherit class (static) properties from parent.\n    _.extend(child, parent);\n\n    // Set the prototype chain to inherit from `parent`, without calling\n    // `parent`'s constructor function.\n    ctor.prototype = parent.prototype;\n    child.prototype = new ctor();\n\n    // Add prototype properties (instance properties) to the subclass,\n    // if supplied.\n    if (protoProps) _.extend(child.prototype, protoProps);\n\n    // Add static properties to the constructor function, if supplied.\n    if (staticProps) _.extend(child, staticProps);\n\n    // Correctly set child's `prototype.constructor`.\n    child.prototype.constructor = child;\n\n    // Set a convenience property in case the parent's prototype is needed later.\n    child.__super__ = parent.prototype;\n\n    return child;\n  };\n\n  // Helper function to get a URL from a Model or Collection as a property\n  // or as a function.\n  var getUrl = function(object) {\n    if (!(object && object.url)) return null;\n    return _.isFunction(object.url) ? object.url() : object.url;\n  };\n\n  // Throw an error when a URL is needed, and none is supplied.\n  var urlError = function() {\n    throw new Error('A \"url\" property or function must be specified');\n  };\n\n  // Wrap an optional error callback with a fallback error event.\n  var wrapError = function(onError, model, options) {\n    return function(resp) {\n      if (onError) {\n        onError(model, resp, options);\n      } else {\n        model.trigger('error', model, resp, options);\n      }\n    };\n  };\n\n  // Helper function to escape a string for HTML rendering.\n  var escapeHTML = function(string) {\n    return string.replace(/&(?!\\w+;|#\\d+;|#x[\\da-f]+;)/gi, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#x27').replace(/\\//g,'&#x2F;');\n  };\n\n}).call(this);"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/logo.jscad",
    "content": "// title      : OpenJSCAD.org Logo\n// author     : Rene K. Mueller\n// license    : MIT License\n// revision   : 0.003\n// tags       : Logo,Intersection,Sphere,Cube\n// file       : logo.jscad\n\nfunction main() {\n   return union(\n      difference(\n         cube({size: 3, center: true}),\n         sphere({r:2, center: true})\n      ),\n      intersection(\n          sphere({r: 1.3, center: true}),\n          cube({size: 2.1, center: true})\n      )\n   ).translate([0,0,1.5]).scale(10);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/modernizr.js",
    "content": "/*!\n * Modernizr v2.6pre\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in\n * the current UA and makes the results available to you in two ways:\n * as properties on a global Modernizr object, and as classes on the\n * <html> element. This information allows you to progressively enhance\n * your pages with a granular level of control over the experience.\n *\n * Modernizr has an optional (not included) conditional resource loader\n * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).\n * To get a build that includes Modernizr.load(), as well as choosing\n * which tests to include, go to www.modernizr.com/download/\n *\n * Authors        Faruk Ates, Paul Irish, Alex Sexton\n * Contributors   Ryan Seddon, Ben Alman\n */\n\nwindow.Modernizr = (function( window, document, undefined ) {\n\n    var version = '2.5.3',\n\n    Modernizr = {},\n\n    /*>>cssclasses*/\n    // option for enabling the HTML classes to be added\n    enableClasses = true,\n    /*>>cssclasses*/\n\n    docElement = document.documentElement,\n\n    /**\n     * Create our \"modernizr\" element that we do most feature tests on.\n     */\n    mod = 'modernizr',\n    modElem = document.createElement(mod),\n    mStyle = modElem.style,\n\n    /**\n     * Create the input element for various Web Forms feature tests.\n     */\n    inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,\n\n    /*>>smile*/\n    smile = ':)',\n    /*>>smile*/\n\n    toString = {}.toString,\n\n    // TODO :: make the prefixes more granular\n    /*>>prefixes*/\n    // List of property values to set for css tests. See ticket #21\n    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),\n    /*>>prefixes*/\n\n    /*>>domprefixes*/\n    // Following spec is to expose vendor-specific style properties as:\n    //   elem.style.WebkitBorderRadius\n    // and the following would be incorrect:\n    //   elem.style.webkitBorderRadius\n\n    // Webkit ghosts their properties in lowercase but Opera & Moz do not.\n    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n    //   erik.eae.net/archives/2008/03/10/21.48.10/\n\n    // More here: github.com/Modernizr/Modernizr/issues/issue/21\n    omPrefixes = 'Webkit Moz O ms',\n\n    cssomPrefixes = omPrefixes.split(' '),\n\n    domPrefixes = omPrefixes.toLowerCase().split(' '),\n    /*>>domprefixes*/\n\n    /*>>ns*/\n    ns = {'svg': 'http://www.w3.org/2000/svg'},\n    /*>>ns*/\n\n    tests = {},\n    inputs = {},\n    attrs = {},\n\n    classes = [],\n\n    slice = classes.slice,\n\n    featureName, // used in testing loop\n\n\n    /*>>teststyles*/\n    // Inject element with style element and some CSS rules\n    injectElementWithStyles = function( rule, callback, nodes, testnames ) {\n\n      var style, ret, node,\n          div = document.createElement('div'),\n          // After page load injecting a fake body doesn't work so check if body exists\n          body = document.body,\n          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.\n          fakeBody = body ? body : document.createElement('body');\n\n      if ( parseInt(nodes, 10) ) {\n          // In order not to give false positives we create a node for each test\n          // This also allows the method to scale for unspecified uses\n          while ( nodes-- ) {\n              node = document.createElement('div');\n              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n              div.appendChild(node);\n          }\n      }\n\n      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed\n      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element\n      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.\n      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx\n      // Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277\n      style = ['&#173;','<style>', rule, '</style>'].join('');\n      div.id = mod;\n      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n      (body ? div : fakeBody).innerHTML += style;\n      fakeBody.appendChild(div);\n      if ( !body ) {\n          //avoid crashing IE8, if background image is used\n          fakeBody.style.background = \"\";\n          docElement.appendChild(fakeBody);\n      }\n\n      ret = callback(div, rule);\n      // If this is done after page load we don't want to remove the body so check if body exists\n      !body ? fakeBody.parentNode.removeChild(fakeBody) : div.parentNode.removeChild(div);\n\n      return !!ret;\n\n    },\n    /*>>teststyles*/\n\n    /*>>mq*/\n    // adapted from matchMedia polyfill\n    // by Scott Jehl and Paul Irish\n    // gist.github.com/786768\n    testMediaQuery = function( mq ) {\n\n      var matchMedia = window.matchMedia || window.msMatchMedia;\n      if ( matchMedia ) {\n        return matchMedia(mq).matches;\n      }\n\n      var bool;\n\n      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {\n        bool = (window.getComputedStyle ?\n                  getComputedStyle(node, null) :\n                  node.currentStyle)['position'] == 'absolute';\n      });\n\n      return bool;\n\n     },\n     /*>>mq*/\n\n\n    /*>>hasevent*/\n    //\n    // isEventSupported determines if a given element supports the given event\n    // kangax.github.com/iseventsupported/\n    //\n    // The following results are known incorrects:\n    //   Modernizr.hasEvent(\"webkitTransitionEnd\", elem) // false negative\n    //   Modernizr.hasEvent(\"textInput\") // in Webkit. github.com/Modernizr/Modernizr/issues/333\n    //   ...\n    isEventSupported = (function() {\n\n      var TAGNAMES = {\n        'select': 'input', 'change': 'input',\n        'submit': 'form', 'reset': 'form',\n        'error': 'img', 'load': 'img', 'abort': 'img'\n      };\n\n      function isEventSupported( eventName, element ) {\n\n        element = element || document.createElement(TAGNAMES[eventName] || 'div');\n        eventName = 'on' + eventName;\n\n        // When using `setAttribute`, IE skips \"unload\", WebKit skips \"unload\" and \"resize\", whereas `in` \"catches\" those\n        var isSupported = eventName in element;\n\n        if ( !isSupported ) {\n          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element\n          if ( !element.setAttribute ) {\n            element = document.createElement('div');\n          }\n          if ( element.setAttribute && element.removeAttribute ) {\n            element.setAttribute(eventName, '');\n            isSupported = is(element[eventName], 'function');\n\n            // If property was created, \"remove it\" (by setting value to `undefined`)\n            if ( !is(element[eventName], 'undefined') ) {\n              element[eventName] = undefined;\n            }\n            element.removeAttribute(eventName);\n          }\n        }\n\n        element = null;\n        return isSupported;\n      }\n      return isEventSupported;\n    })(),\n    /*>>hasevent*/\n\n    // TODO :: Add flag for hasownprop ? didn't last time\n\n    // hasOwnProperty shim by kangax needed for Safari 2.0 support\n    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProperty;\n\n    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {\n      hasOwnProperty = function (object, property) {\n        return _hasOwnProperty.call(object, property);\n      };\n    }\n    else {\n      hasOwnProperty = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n      };\n    }\n\n    // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js\n    // es5.github.com/#x15.3.4.5\n\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function bind(that) {\n\n        var target = this;\n        if (typeof target != \"function\") throw new TypeError();\n\n        var\n        args = slice.call(arguments, 1),\n        bound = function () {\n\n          if (this instanceof bound) {\n\n            var F = function(){};\n            F.prototype = target.prototype;\n            var self = new F();\n            var result = target.apply(self, args.concat(slice.call(arguments)));\n\n            if (Object(result) === result) return result;\n            return self;\n\n          } else {\n            return target.apply( that, args.concat(slice.call(arguments)));\n          }\n        };\n        return bound;\n      };\n    }\n\n    /**\n     * setCss applies given styles to the Modernizr DOM node.\n     */\n    function setCss( str ) {\n        mStyle.cssText = str;\n    }\n\n    /**\n     * setCssAll extrapolates all vendor-specific css strings.\n     */\n    function setCssAll( str1, str2 ) {\n        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));\n    }\n\n    /**\n     * is returns a boolean for if typeof obj is exactly type.\n     */\n    function is( obj, type ) {\n        return typeof obj === type;\n    }\n\n    /**\n     * contains returns a boolean for if substr is found within str.\n     */\n    function contains( str, substr ) {\n        return !!~('' + str).indexOf(substr);\n    }\n\n    /*>>testprop*/\n\n    // testProps is a generic CSS / DOM property test.\n\n    // In testing support for a given CSS property, it's legit to test:\n    //    `elem.style[styleName] !== undefined`\n    // If the property is supported it will return an empty string,\n    // if unsupported it will return undefined.\n\n    // We'll take advantage of this quick test and skip setting a style\n    // on our modernizr element, but instead just testing undefined vs\n    // empty string.\n\n    function testProps( props, prefixed ) {\n        for ( var i in props ) {\n            if ( mStyle[ props[i] ] !== undefined ) {\n                return prefixed == 'pfx' ? props[i] : true;\n            }\n        }\n        return false;\n    }\n    /*>>testprop*/\n\n    // TODO :: add testDOMProps\n    /**\n     * testDOMProps is a generic DOM property test; if a browser supports\n     *   a certain property, it won't return undefined for it.\n     */\n    function testDOMProps( props, obj, elem ) {\n        for ( var i in props ) {\n            var item = obj[props[i]];\n            if ( item !== undefined) {\n\n                // return the property name as a string\n                if (elem === false) return props[i];\n\n                // let's bind a function\n                if (is(item, 'function')){\n                  // default to autobind unless override\n                  return item.bind(elem || obj);\n                }\n\n                // return the unbound function or obj or value\n                return item;\n            }\n        }\n        return false;\n    }\n\n    /*>>testallprops*/\n    /**\n     * testPropsAll tests a list of DOM properties we want to check against.\n     *   We specify literally ALL possible (known and/or likely) properties on\n     *   the element including the non-vendor prefixed one, for forward-\n     *   compatibility.\n     */\n    function testPropsAll( prop, prefixed, elem ) {\n\n        var ucProp  = prop.charAt(0).toUpperCase() + prop.substr(1),\n            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n\n        // did they call .prefixed('boxSizing') or are we just testing a prop?\n        if(is(prefixed, \"string\") || is(prefixed, \"undefined\")) {\n          return testProps(props, prefixed);\n\n        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n        } else {\n          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');\n          return testDOMProps(props, prefixed, elem);\n        }\n    }\n    /*>>testallprops*/\n\n\n    /**\n     * Tests\n     * -----\n     */\n\n    // The *new* flexbox\n    // dev.w3.org/csswg/css3-flexbox\n\n    tests['flexbox'] = function() {\n      return testPropsAll('flexOrder');\n    };\n\n    // The *old* flexbox\n    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n\n    tests['flexboxlegacy'] = function() {\n        return testPropsAll('boxDirection');\n    };\n\n    // On the S60 and BB Storm, getContext exists, but always returns undefined\n    // so we actually have to call getContext() to verify\n    // github.com/Modernizr/Modernizr/issues/issue/97/\n\n    tests['canvas'] = function() {\n        var elem = document.createElement('canvas');\n        return !!(elem.getContext && elem.getContext('2d'));\n    };\n\n    tests['canvastext'] = function() {\n        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));\n    };\n\n    // webk.it/70117 is tracking a legit WebGL feature detect proposal\n\n    // We do a soft detect which may false positive in order to avoid\n    // an expensive context creation: bugzil.la/732441\n\n    tests['webgl'] = function() {\n        return !!window.WebGLRenderingContext;\n    };\n\n    /*\n     * The Modernizr.touch test only indicates if the browser supports\n     *    touch events, which does not necessarily reflect a touchscreen\n     *    device, as evidenced by tablets running Windows 7 or, alas,\n     *    the Palm Pre / WebOS (touch) phones.\n     *\n     * Additionally, Chrome (desktop) used to lie about its support on this,\n     *    but that has since been rectified: crbug.com/36415\n     *\n     * We also test for Firefox 4 Multitouch Support.\n     *\n     * For more info, see: modernizr.github.com/Modernizr/touch.html\n     */\n\n    tests['touch'] = function() {\n        var bool;\n\n        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {\n          bool = true;\n        } else {\n          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {\n            bool = node.offsetTop === 9;\n          });\n        }\n\n        return bool;\n    };\n\n\n    // geolocation is often considered a trivial feature detect...\n    // Turns out, it's quite tricky to get right:\n    //\n    // Using !!navigator.geolocation does two things we don't want. It:\n    //   1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513\n    //   2. Disables page caching in WebKit: webk.it/43956\n    //\n    // Meanwhile, in Firefox < 8, an about:config setting could expose\n    // a false positive that would throw an exception: bugzil.la/688158\n\n    tests['geolocation'] = function() {\n        return 'geolocation' in navigator;\n    };\n\n\n    tests['postmessage'] = function() {\n      return !!window.postMessage;\n    };\n\n\n    // Chrome incognito mode used to throw an exception when using openDatabase\n    // It doesn't anymore.\n    tests['websqldatabase'] = function() {\n      return !!window.openDatabase;\n    };\n\n    // Vendors had inconsistent prefixing with the experimental Indexed DB:\n    // - Webkit's implementation is accessible through webkitIndexedDB\n    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB\n    // For speed, we don't test the legacy (and beta-only) indexedDB\n    tests['indexedDB'] = function() {\n      return !!testPropsAll(\"indexedDB\", window);\n    };\n\n    // documentMode logic from YUI to filter out IE8 Compat Mode\n    //   which false positives.\n    tests['hashchange'] = function() {\n      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);\n    };\n\n    // Per 1.6:\n    // This used to be Modernizr.historymanagement but the longer\n    // name has been deprecated in favor of a shorter and property-matching one.\n    // The old API is still available in 1.6, but as of 2.0 will throw a warning,\n    // and in the first release thereafter disappear entirely.\n    tests['history'] = function() {\n      return !!(window.history && history.pushState);\n    };\n\n    tests['draganddrop'] = function() {\n        var div = document.createElement('div');\n        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);\n    };\n\n    // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10\n    // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.\n    // FF10 still uses prefixes, so check for it until then.\n    // for more ESR info, see: http://www.mozilla.org/en-US/firefox/organizations/faq/\n    tests['websockets'] = function() {\n        return 'WebSocket' in window || 'MozWebSocket' in window;\n    };\n\n\n    // css-tricks.com/rgba-browser-support/\n    tests['rgba'] = function() {\n        // Set an rgba() color and check the returned value\n\n        setCss('background-color:rgba(150,255,150,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba');\n    };\n\n    tests['hsla'] = function() {\n        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,\n        //   except IE9 who retains it as hsla\n\n        setCss('background-color:hsla(120,40%,100%,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');\n    };\n\n    tests['multiplebgs'] = function() {\n        // Setting multiple images AND a color on the background shorthand property\n        //  and then querying the style.background property value for the number of\n        //  occurrences of \"url(\" is a reliable method for detecting ACTUAL support for this!\n\n        setCss('background:url(https://),url(https://),red url(https://)');\n\n        // If the UA supports multiple backgrounds, there should be three occurrences\n        //   of the string \"url(\" in the return value for elemStyle.background\n\n        return /(url\\s*\\(.*?){3}/.test(mStyle.background);\n    };\n\n\n\n    // this will false positive in Opera Mini\n    //   github.com/Modernizr/Modernizr/issues/396\n\n    tests['backgroundsize'] = function() {\n        return testPropsAll('backgroundSize');\n    };\n\n    tests['borderimage'] = function() {\n        return testPropsAll('borderImage');\n    };\n\n\n    // Super comprehensive table about all the unique implementations of\n    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance\n\n    tests['borderradius'] = function() {\n        return testPropsAll('borderRadius');\n    };\n\n    // WebOS unfortunately false positives on this test.\n    tests['boxshadow'] = function() {\n        return testPropsAll('boxShadow');\n    };\n\n    // FF3.0 will false positive on this test\n    tests['textshadow'] = function() {\n        return document.createElement('div').style.textShadow === '';\n    };\n\n\n    tests['opacity'] = function() {\n        // Browsers that actually have CSS Opacity implemented have done so\n        //  according to spec, which means their return values are within the\n        //  range of [0.0,1.0] - including the leading zero.\n\n        setCssAll('opacity:.55');\n\n        // The non-literal . in this regex is intentional:\n        //   German Chrome returns this value as 0,55\n        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632\n        return /^0.55$/.test(mStyle.opacity);\n    };\n\n\n    // Note, Android < 4 will pass this test, but can only animate\n    //   a single property at a time\n    //   daneden.me/2011/12/putting-up-with-androids-bullshit/\n    tests['cssanimations'] = function() {\n        return testPropsAll('animationName');\n    };\n\n\n    tests['csscolumns'] = function() {\n        return testPropsAll('columnCount');\n    };\n\n\n    tests['cssgradients'] = function() {\n        /**\n         * For CSS Gradients syntax, please see:\n         * webkit.org/blog/175/introducing-css-gradients/\n         * developer.mozilla.org/en/CSS/-moz-linear-gradient\n         * developer.mozilla.org/en/CSS/-moz-radial-gradient\n         * dev.w3.org/csswg/css3-images/#gradients-\n         */\n\n        var str1 = 'background-image:',\n            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',\n            str3 = 'linear-gradient(left top,#9f9, white);';\n\n        setCss(\n             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)\n              (str1 + '-webkit- '.split(' ').join(str2 + str1)\n             // standard syntax             // trailing 'background-image:'\n              + prefixes.join(str3 + str1)).slice(0, -str1.length)\n        );\n\n        return contains(mStyle.backgroundImage, 'gradient');\n    };\n\n\n    tests['cssreflections'] = function() {\n        return testPropsAll('boxReflect');\n    };\n\n\n    tests['csstransforms'] = function() {\n        return !!testPropsAll('transform');\n    };\n\n\n    tests['csstransforms3d'] = function() {\n\n        var ret = !!testPropsAll('perspective');\n\n        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.\n        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in\n        //   some conditions. As a result, Webkit typically recognizes the syntax but\n        //   will sometimes throw a false positive, thus we must do a more thorough check:\n        if ( ret && 'webkitPerspective' in docElement.style ) {\n\n          // Webkit allows this media query to succeed only if the feature is enabled.\n          // `@media (transform-3d),(-webkit-transform-3d){ ... }`\n          injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {\n            ret = node.offsetLeft === 9 && node.offsetHeight === 3;\n          });\n        }\n        return ret;\n    };\n\n\n    tests['csstransitions'] = function() {\n        return testPropsAll('transition');\n    };\n\n\n    /*>>fontface*/\n    // @font-face detection routine by Diego Perini\n    // javascript.nwbox.com/CSSSupport/\n\n    // false positives:\n    //   WebOS github.com/Modernizr/Modernizr/issues/342\n    //   WP7   github.com/Modernizr/Modernizr/issues/538\n    tests['fontface'] = function() {\n        var bool;\n\n        injectElementWithStyles('@font-face {font-family:\"font\";src:url(\"https://\")}', function( node, rule ) {\n          var style = document.styleSheets[document.styleSheets.length - 1],\n              cssText = style ? (style.cssRules && style.cssRules[0] ? style.cssRules[0].cssText : style.cssText || '') : '';\n\n          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;\n        });\n\n        return bool;\n    };\n    /*>>fontface*/\n\n    // CSS generated content detection\n    tests['generatedcontent'] = function() {\n        var bool;\n\n        injectElementWithStyles(['#modernizr:after{content:\"',smile,'\";visibility:hidden}'].join(''), function( node ) {\n          bool = node.offsetHeight >= 1;\n        });\n\n        return bool;\n    };\n\n\n\n    // These tests evaluate support of the video/audio elements, as well as\n    // testing what types of content they support.\n    //\n    // We're using the Boolean constructor here, so that we can extend the value\n    // e.g.  Modernizr.video     // true\n    //       Modernizr.video.ogg // 'probably'\n    //\n    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845\n    //                     thx to NielsLeenheer and zcorpan\n\n    // Note: in some older browsers, \"no\" was a return value instead of empty string.\n    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2\n    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5\n\n    tests['video'] = function() {\n        var elem = document.createElement('video'),\n            bool = false;\n\n        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('video/ogg; codecs=\"theora\"')      .replace(/^no$/,'');\n\n                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546\n                bool.h264 = elem.canPlayType('video/mp4; codecs=\"avc1.42E01E\"') .replace(/^no$/,'');\n\n                bool.webm = elem.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,'');\n            }\n\n        } catch(e) { }\n\n        return bool;\n    };\n\n    tests['audio'] = function() {\n        var elem = document.createElement('audio'),\n            bool = false;\n\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,'');\n                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');\n\n                // Mimetypes accepted:\n                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements\n                //   bit.ly/iphoneoscodecs\n                bool.wav  = elem.canPlayType('audio/wav; codecs=\"1\"')     .replace(/^no$/,'');\n                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            ||\n                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');\n            }\n        } catch(e) { }\n\n        return bool;\n    };\n\n\n    // In FF4, if disabled, window.localStorage should === null.\n\n    // Normally, we could not test that directly and need to do a\n    //   `('localStorage' in window) && ` test first because otherwise Firefox will\n    //   throw bugzil.la/365772 if cookies are disabled\n\n    // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem\n    // will throw the exception:\n    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.\n    // Peculiarly, getItem and removeItem calls do not throw.\n\n    // Because we are forced to try/catch this, we'll go aggressive.\n\n    // Just FWIW: IE8 Compat mode supports these features completely:\n    //   www.quirksmode.org/dom/html5.html\n    // But IE8 doesn't support either with local files\n\n    tests['localstorage'] = function() {\n        try {\n            localStorage.setItem(mod, mod);\n            localStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n    tests['sessionstorage'] = function() {\n        try {\n            sessionStorage.setItem(mod, mod);\n            sessionStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n\n    tests['webworkers'] = function() {\n        return !!window.Worker;\n    };\n\n\n    tests['applicationcache'] = function() {\n        return !!window.applicationCache;\n    };\n\n\n    // Thanks to Erik Dahlstrom\n    tests['svg'] = function() {\n        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;\n    };\n\n    // specifically for SVG inline in HTML, not within XHTML\n    // test page: paulirish.com/demo/inline-svg\n    tests['inlinesvg'] = function() {\n      var div = document.createElement('div');\n      div.innerHTML = '<svg/>';\n      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;\n    };\n\n    // SVG SMIL animation\n    tests['smil'] = function() {\n        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));\n    };\n\n    // This test is only for clip paths in SVG proper, not clip paths on HTML content\n    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg\n\n    // However read the comments to dig into applying SVG clippaths to HTML content here:\n    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491\n    tests['svgclippaths'] = function() {\n        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));\n    };\n\n    /*>>webforms*/\n    // input features and input types go directly onto the ret object, bypassing the tests loop.\n    // Hold this guy to execute in a moment.\n    function webforms() {\n        /*>>input*/\n        // Run through HTML5's new input attributes to see if the UA understands any.\n        // We're using f which is the <input> element created early on\n        // Mike Taylr has created a comprehensive resource for testing these attributes\n        //   when applied to all input types:\n        //   miketaylr.com/code/input-type-attr.html\n        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n\n        // Only input placeholder is tested while textarea's placeholder is not.\n        // Currently Safari 4 and Opera 11 have support only for the input placeholder\n        // Both tests are available in feature-detects/forms-placeholder.js\n        Modernizr['input'] = (function( props ) {\n            for ( var i = 0, len = props.length; i < len; i++ ) {\n                attrs[ props[i] ] = !!(props[i] in inputElem);\n            }\n            if (attrs.list){\n              // safari false positive's on datalist: webk.it/74252\n              // see also github.com/Modernizr/Modernizr/issues/146\n              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);\n            }\n            return attrs;\n        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));\n        /*>>input*/\n\n        /*>>inputtypes*/\n        // Run through HTML5's new input types to see if the UA understands any.\n        //   This is put behind the tests runloop because it doesn't return a\n        //   true/false like all the other tests; instead, it returns an object\n        //   containing each input type with its corresponding true/false value\n\n        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/\n        Modernizr['inputtypes'] = (function(props) {\n\n            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {\n\n                inputElem.setAttribute('type', inputElemType = props[i]);\n                bool = inputElem.type !== 'text';\n\n                // We first check to see if the type we give it sticks..\n                // If the type does, we feed it a textual value, which shouldn't be valid.\n                // If the value doesn't stick, we know there's input sanitization which infers a custom UI\n                if ( bool ) {\n\n                    inputElem.value         = smile;\n                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';\n\n                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {\n\n                      docElement.appendChild(inputElem);\n                      defaultView = document.defaultView;\n\n                      // Safari 2-4 allows the smiley as a value, despite making a slider\n                      bool =  defaultView.getComputedStyle &&\n                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&\n                              // Mobile android web browser has false positive, so must\n                              // check the height to see if the widget is actually there.\n                              (inputElem.offsetHeight !== 0);\n\n                      docElement.removeChild(inputElem);\n\n                    } else if ( /^(search|tel)$/.test(inputElemType) ){\n                      // Spec doesn't define any special parsing or detectable UI\n                      //   behaviors so we pass these through as true\n\n                      // Interestingly, opera fails the earlier test, so it doesn't\n                      //  even make it here.\n\n                    } else if ( /^(url|email)$/.test(inputElemType) ) {\n                      // Real url and email support comes with prebaked validation.\n                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;\n\n                    } else {\n                      // If the upgraded input compontent rejects the :) text, we got a winner\n                      bool = inputElem.value != smile;\n                    }\n                }\n\n                inputs[ props[i] ] = !!bool;\n            }\n            return inputs;\n        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));\n        /*>>inputtypes*/\n    }\n    /*>>webforms*/\n\n\n    // End of test definitions\n    // -----------------------\n\n\n\n    // Run through all tests and detect their support in the current UA.\n    // todo: hypothetically we could be doing an array of tests and use a basic loop here.\n    for ( var feature in tests ) {\n        if ( hasOwnProperty(tests, feature) ) {\n            // run the test, throw the return value into the Modernizr,\n            //   then based on that boolean, define an appropriate className\n            //   and push it into an array of classes we'll join later.\n            featureName  = feature.toLowerCase();\n            Modernizr[featureName] = tests[feature]();\n\n            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);\n        }\n    }\n\n    /*>>webforms*/\n    // input tests need to run.\n    Modernizr.input || webforms();\n    /*>>webforms*/\n\n\n    /*>>addtest*/\n    /**\n     * addTest allows the user to define their own feature tests\n     * the result will be added onto the Modernizr object,\n     * as well as an appropriate className set on the html element\n     *\n     * @param feature - String naming the feature\n     * @param test - Function returning true if feature is supported, false if not\n     */\n     Modernizr.addTest = function ( feature, test ) {\n       if ( typeof feature == 'object' ) {\n         for ( var key in feature ) {\n           if ( hasOwnProperty( feature, key ) ) {\n             Modernizr.addTest( key, feature[ key ] );\n           }\n         }\n       } else {\n\n         feature = feature.toLowerCase();\n\n         if ( Modernizr[feature] !== undefined ) {\n           // we're going to quit if you're trying to overwrite an existing test\n           // if we were to allow it, we'd do this:\n           //   var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n           //   docElement.className = docElement.className.replace( re, '' );\n           // but, no rly, stuff 'em.\n           return Modernizr;\n         }\n\n         test = typeof test == 'function' ? test() : test;\n\n         if (enableClasses) {\n           docElement.className += ' ' + (test ? '' : 'no-') + feature;\n         }\n         Modernizr[feature] = test;\n\n       }\n\n       return Modernizr; // allow chaining.\n     };\n     /*>>addtest*/\n\n\n    // Reset modElem.cssText to nothing to reduce memory footprint.\n    setCss('');\n    modElem = inputElem = null;\n\n    /*>>shiv*/\n    /*! HTML5 Shiv v3.5 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */\n    ;(function(window, document) {\n\n      /** Preset options */\n      var options = window.html5 || {};\n\n      /** Used to skip problem elements */\n      var reSkip = /^<|^(?:button|form|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n      /** Not all elements can be cloned in IE (this list can be shortend) **/\n      var saveClones = /^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i;\n\n      /** Detect whether the browser supports default html5 styles */\n      var supportsHtml5Styles;\n\n      /** Detect whether the browser supports unknown elements */\n      var supportsUnknownElements;\n\n      (function() {\n        var a = document.createElement('a');\n\n        a.innerHTML = '<xyz></xyz>';\n\n        //if the hidden property is implemented we can assume, that the browser supports HTML5 Styles | this fails in Chrome 8\n        supportsHtml5Styles = ('hidden' in a);\n        //if we are part of Modernizr, we do an additional test to solve the Chrome 8 fail\n        if(supportsHtml5Styles && typeof injectElementWithStyles == 'function'){\n            injectElementWithStyles('#modernizr{}', function(node){\n                node.hidden = true;\n                supportsHtml5Styles = (window.getComputedStyle ?\n                      getComputedStyle(node, null) :\n                      node.currentStyle).display == 'none';\n            });\n        }\n\n        supportsUnknownElements = a.childNodes.length == 1 || (function() {\n          // assign a false positive if unable to shiv\n          try {\n            (document.createElement)('a');\n          } catch(e) {\n            return true;\n          }\n          var frag = document.createDocumentFragment();\n          return (\n            typeof frag.cloneNode == 'undefined' ||\n            typeof frag.createDocumentFragment == 'undefined' ||\n            typeof frag.createElement == 'undefined'\n          );\n        }());\n\n      }());\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Creates a style sheet with the given CSS text and adds it to the document.\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @param {String} cssText The CSS text.\n       * @returns {StyleSheet} The style element.\n       */\n      function addStyleSheet(ownerDocument, cssText) {\n        var p = ownerDocument.createElement('p'),\n            parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n        p.innerHTML = 'x<style>' + cssText + '</style>';\n        return parent.insertBefore(p.lastChild, parent.firstChild);\n      }\n\n      /**\n       * Returns the value of `html5.elements` as an array.\n       * @private\n       * @returns {Array} An array of shived element node names.\n       */\n      function getElements() {\n        var elements = html5.elements;\n        return typeof elements == 'string' ? elements.split(' ') : elements;\n      }\n\n      /**\n       * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n       * @private\n       * @param {Document|DocumentFragment} ownerDocument The document.\n       */\n      function shivMethods(ownerDocument) {\n        var cache = {},\n            docCreateElement = ownerDocument.createElement,\n            docCreateFragment = ownerDocument.createDocumentFragment,\n            frag = docCreateFragment();\n\n        ownerDocument.createElement = function(nodeName) {\n          //abort shiv\n          if(!html5.shivMethods){\n              return docCreateElement(nodeName);\n          }\n\n          var node;\n\n          if(cache[nodeName]){\n              node = cache[nodeName].cloneNode();\n          } else if(saveClones.test(nodeName)){\n               node = (cache[nodeName] = docCreateElement(nodeName)).cloneNode();\n          } else {\n              node = docCreateElement(nodeName);\n          }\n\n          // Avoid adding some elements to fragments in IE < 9 because\n          // * Attributes like `name` or `type` cannot be set/changed once an element\n          //   is inserted into a document/fragment\n          // * Link elements with `src` attributes that are inaccessible, as with\n          //   a 403 response, will cause the tab/window to crash\n          // * Script elements appended to fragments will execute when their `src`\n          //   or `text` property is set\n          return node.canHaveChildren && !reSkip.test(nodeName) ? frag.appendChild(node) : node;\n        };\n\n        ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n          'var n=f.cloneNode(),c=n.createElement;' +\n          'h.shivMethods&&(' +\n            // unroll the `createElement` calls\n            getElements().join().replace(/\\w+/g, function(nodeName) {\n              docCreateElement(nodeName);\n              frag.createElement(nodeName);\n              return 'c(\"' + nodeName + '\")';\n            }) +\n          ');return n}'\n        )(html5, frag);\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Shivs the given document.\n       * @memberOf html5\n       * @param {Document} ownerDocument The document to shiv.\n       * @returns {Document} The shived document.\n       */\n      function shivDocument(ownerDocument) {\n        var shived;\n        if (ownerDocument.documentShived) {\n          return ownerDocument;\n        }\n        if (html5.shivCSS && !supportsHtml5Styles) {\n          shived = !!addStyleSheet(ownerDocument,\n            // corrects block display not defined in IE6/7/8/9\n            'article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +\n            // corrects audio display not defined in IE6/7/8/9\n            'audio{display:none}' +\n            // corrects canvas and video display not defined in IE6/7/8/9\n            'canvas,video{display:inline-block;*display:inline;*zoom:1}' +\n            // corrects 'hidden' attribute and audio[controls] display not present in IE7/8/9\n            '[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}' +\n            // adds styling not present in IE6/7/8/9\n            'mark{background:#FF0;color:#000}'\n          );\n        }\n        if (!supportsUnknownElements) {\n          shived = !shivMethods(ownerDocument);\n        }\n        if (shived) {\n          ownerDocument.documentShived = shived;\n        }\n        return ownerDocument;\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * The `html5` object is exposed so that more elements can be shived and\n       * existing shiving can be detected on iframes.\n       * @type Object\n       * @example\n       *\n       * // options can be changed before the script is included\n       * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n       */\n      var html5 = {\n\n        /**\n         * An array or space separated string of node names of the elements to shiv.\n         * @memberOf html5\n         * @type Array|String\n         */\n        'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',\n\n        /**\n         * A flag to indicate that the HTML5 style sheet should be inserted.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivCSS': !(options.shivCSS === false),\n\n        /**\n         * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n         * methods should be overwritten.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivMethods': !(options.shivMethods === false),\n\n        /**\n         * A string to describe the type of `html5` object (\"default\" or \"default print\").\n         * @memberOf html5\n         * @type String\n         */\n        'type': 'default',\n\n        // shivs the document according to the specified `html5` object options\n        'shivDocument': shivDocument\n      };\n\n      /*--------------------------------------------------------------------------*/\n\n      // expose html5\n      window.html5 = html5;\n\n      // shiv the document\n      shivDocument(document);\n\n    }(this, document));\n    /*>>shiv*/\n\n    // Assign private properties to the return object with prefix\n    Modernizr._version      = version;\n\n    // expose these for the plugin API. Look in the source for how to join() them against your input\n    /*>>prefixes*/\n    Modernizr._prefixes     = prefixes;\n    /*>>prefixes*/\n    /*>>domprefixes*/\n    Modernizr._domPrefixes  = domPrefixes;\n    Modernizr._cssomPrefixes  = cssomPrefixes;\n    /*>>domprefixes*/\n\n    /*>>mq*/\n    // Modernizr.mq tests a given media query, live against the current state of the window\n    // A few important notes:\n    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false\n    //   * A max-width or orientation query will be evaluated against the current state, which may change later.\n    //   * You must specify values. Eg. If you are testing support for the min-width media query use:\n    //       Modernizr.mq('(min-width:0)')\n    // usage:\n    // Modernizr.mq('only screen and (max-width:768)')\n    Modernizr.mq            = testMediaQuery;\n    /*>>mq*/\n\n    /*>>hasevent*/\n    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on\n    // Modernizr.hasEvent('gesturestart', elem)\n    Modernizr.hasEvent      = isEventSupported;\n    /*>>hasevent*/\n\n    /*>>testprop*/\n    // Modernizr.testProp() investigates whether a given style property is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testProp('pointerEvents')\n    Modernizr.testProp      = function(prop){\n        return testProps([prop]);\n    };\n    /*>>testprop*/\n\n    /*>>testallprops*/\n    // Modernizr.testAllProps() investigates whether a given style property,\n    //   or any of its vendor-prefixed variants, is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testAllProps('boxSizing')\n    Modernizr.testAllProps  = testPropsAll;\n    /*>>testallprops*/\n\n\n    /*>>teststyles*/\n    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards\n    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })\n    Modernizr.testStyles    = injectElementWithStyles;\n    /*>>teststyles*/\n\n\n    /*>>prefixed*/\n    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input\n    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'\n\n    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.\n    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:\n    //\n    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');\n\n    // If you're trying to ascertain which transition end event to bind to, you might do something like...\n    //\n    //     var transEndEventNames = {\n    //       'WebkitTransition' : 'webkitTransitionEnd',\n    //       'MozTransition'    : 'transitionend',\n    //       'OTransition'      : 'oTransitionEnd',\n    //       'msTransition'     : 'MSTransitionEnd',\n    //       'transition'       : 'transitionend'\n    //     },\n    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];\n\n    Modernizr.prefixed      = function(prop, obj, elem){\n      if(!obj) {\n        return testPropsAll(prop, 'pfx');\n      } else {\n        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'\n        return testPropsAll(prop, obj, elem);\n      }\n    };\n    /*>>prefixed*/\n\n\n    /*>>cssclasses*/\n    // Remove \"no-js\" class from <html> element, if it exists:\n    docElement.className = docElement.className.replace(/(^|\\s)no-js(\\s|$)/, '$1$2') +\n\n                            // Add the new classes to the <html> element.\n                            (enableClasses ? ' js ' + classes.join(' ') : '');\n    /*>>cssclasses*/\n\n    return Modernizr;\n\n})(this, this.document);\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/module.mjs",
    "content": "import {foo} from './entry.mjs';\nconsole.log(foo());\n\nconst bar = \"I am bar.\";\nexport {bar as default};\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/namespace.js",
    "content": "(function(root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    define(['lodash'], factory);\n  } else if (typeof exports !== 'undefined') {\n    module.exports = factory(require('lodash'));\n  } else {\n    root.Namespace = factory(root._);\n  }\n})(this, function(_) {\n  'use strict';\n\n  /**\n   * @module namespace\n   * @class namespace\n   */\n  function Namespace() {}\n  \n  /**\n   * Regex for splitting keypaths into arrays.\n   *\n   * @private\n   * @const {RegExp}\n   * @type\n   */\n  var KEYPATH_SPLITTER = /\\./g;\n  \n  /**\n   * An internal cache to avoid calculating a keypath more than once.\n   *\n   * @private\n   * @type {Object}\n   */\n  var _keypaths = {};\n  \n  _.extend(Namespace.prototype, {\n  \n    /**\n     * Adds a definition to the namespace object.\n     *\n     * @public\n     * @instance\n     * @method add\n     * @param {String} keypath - The keypath for the definition to be added at.\n     * @param {Function|Object} definition - The definition to be added.\n     * @return {Function|Object} - The definition.\n     */\n    add: function(keypath, definition) {\n      return this._walk(keypath, function(memo, name, index, keypath) {\n        if (index + 1 === keypath.length) {\n          memo[name] = _.extend(definition, memo[name]);\n        }\n        return memo[name] || (memo[name] = {});\n      });\n    },\n  \n    /**\n     * Retrieves a definition from the namespace safely.\n     *\n     * @public\n     * @instance\n     * @method get\n     * @param {String} keypath - The keypath to lookup a definition for.\n     * @returns {Function|Object|undefined} - The definition if it exists, otherwise `undefined`.\n     */\n    get: function(keypath) {\n      return this._walk(keypath);\n    },\n  \n    /**\n     * An internal function for walking a keypath.\n     *\n     * @private\n     * @instance\n     * @method _walk\n     * @param {String} keypath - The keypath to walk through.\n     * @param {Function} [callback] - An optional callback to be called at each item in the path.\n     * @returns {function|Object|undefined} - The reduced keypath.\n     */\n    _walk: function(keypath, callback) {\n      return _.reduce(\n        _keypaths[keypath] || (_keypaths[keypath] = keypath.split(KEYPATH_SPLITTER)),\n        callback || function(memo, name) {\n          return memo && memo[name];\n        },\n        this\n      );\n    }\n  });\n  \n  return Namespace;\n});\n\n//# sourceMappingURL=namespace.js.map"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/outro.js.frag",
    "content": "\n})(window, window.angular);\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/parser.js",
    "content": "PEG.parser = (function(){\n  /*\n   * Generated by PEG.js 0.7.0.\n   *\n   * http://pegjs.majda.cz/\n   */\n\n  function quote(s) {\n    /*\n     * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a\n     * string literal except for the closing quote character, backslash,\n     * carriage return, line separator, paragraph separator, and line feed.\n     * Any character may appear in the form of an escape sequence.\n     *\n     * For portability, we also escape escape all control and non-ASCII\n     * characters. Note that \"\\0\" and \"\\v\" escape sequences are not used\n     * because JSHint does not like the first and IE the second.\n     */\n     return '\"' + s\n      .replace(/\\\\/g, '\\\\\\\\')  // backslash\n      .replace(/\"/g, '\\\\\"')    // closing quote character\n      .replace(/\\x08/g, '\\\\b') // backspace\n      .replace(/\\t/g, '\\\\t')   // horizontal tab\n      .replace(/\\n/g, '\\\\n')   // line feed\n      .replace(/\\f/g, '\\\\f')   // form feed\n      .replace(/\\r/g, '\\\\r')   // carriage return\n      .replace(/[\\x00-\\x07\\x0B\\x0E-\\x1F\\x80-\\uFFFF]/g, escape)\n      + '\"';\n  }\n\n  var result = {\n    /*\n     * Parses the input with a generated parser. If the parsing is successfull,\n     * returns a value explicitly or implicitly specified by the grammar from\n     * which the parser was generated (see |PEG.buildParser|). If the parsing is\n     * unsuccessful, throws |PEG.parser.SyntaxError| describing the error.\n     */\n    parse: function(input, startRule) {\n      var parseFunctions = {\n        \"grammar\": parse_grammar,\n        \"initializer\": parse_initializer,\n        \"rule\": parse_rule,\n        \"choice\": parse_choice,\n        \"sequence\": parse_sequence,\n        \"labeled\": parse_labeled,\n        \"prefixed\": parse_prefixed,\n        \"suffixed\": parse_suffixed,\n        \"primary\": parse_primary,\n        \"action\": parse_action,\n        \"braced\": parse_braced,\n        \"nonBraceCharacters\": parse_nonBraceCharacters,\n        \"nonBraceCharacter\": parse_nonBraceCharacter,\n        \"equals\": parse_equals,\n        \"colon\": parse_colon,\n        \"semicolon\": parse_semicolon,\n        \"slash\": parse_slash,\n        \"and\": parse_and,\n        \"not\": parse_not,\n        \"question\": parse_question,\n        \"star\": parse_star,\n        \"plus\": parse_plus,\n        \"lparen\": parse_lparen,\n        \"rparen\": parse_rparen,\n        \"dot\": parse_dot,\n        \"identifier\": parse_identifier,\n        \"literal\": parse_literal,\n        \"string\": parse_string,\n        \"doubleQuotedString\": parse_doubleQuotedString,\n        \"doubleQuotedCharacter\": parse_doubleQuotedCharacter,\n        \"simpleDoubleQuotedCharacter\": parse_simpleDoubleQuotedCharacter,\n        \"singleQuotedString\": parse_singleQuotedString,\n        \"singleQuotedCharacter\": parse_singleQuotedCharacter,\n        \"simpleSingleQuotedCharacter\": parse_simpleSingleQuotedCharacter,\n        \"class\": parse_class,\n        \"classCharacterRange\": parse_classCharacterRange,\n        \"classCharacter\": parse_classCharacter,\n        \"bracketDelimitedCharacter\": parse_bracketDelimitedCharacter,\n        \"simpleBracketDelimitedCharacter\": parse_simpleBracketDelimitedCharacter,\n        \"simpleEscapeSequence\": parse_simpleEscapeSequence,\n        \"zeroEscapeSequence\": parse_zeroEscapeSequence,\n        \"hexEscapeSequence\": parse_hexEscapeSequence,\n        \"unicodeEscapeSequence\": parse_unicodeEscapeSequence,\n        \"eolEscapeSequence\": parse_eolEscapeSequence,\n        \"digit\": parse_digit,\n        \"hexDigit\": parse_hexDigit,\n        \"letter\": parse_letter,\n        \"lowerCaseLetter\": parse_lowerCaseLetter,\n        \"upperCaseLetter\": parse_upperCaseLetter,\n        \"__\": parse___,\n        \"comment\": parse_comment,\n        \"singleLineComment\": parse_singleLineComment,\n        \"multiLineComment\": parse_multiLineComment,\n        \"eol\": parse_eol,\n        \"eolChar\": parse_eolChar,\n        \"whitespace\": parse_whitespace\n      };\n\n      if (startRule !== undefined) {\n        if (parseFunctions[startRule] === undefined) {\n          throw new Error(\"Invalid rule name: \" + quote(startRule) + \".\");\n        }\n      } else {\n        startRule = \"grammar\";\n      }\n\n      var pos = 0;\n      var reportFailures = 0;\n      var rightmostFailuresPos = 0;\n      var rightmostFailuresExpected = [];\n\n      function padLeft(input, padding, length) {\n        var result = input;\n\n        var padLength = length - input.length;\n        for (var i = 0; i < padLength; i++) {\n          result = padding + result;\n        }\n\n        return result;\n      }\n\n      function escape(ch) {\n        var charCode = ch.charCodeAt(0);\n        var escapeChar;\n        var length;\n\n        if (charCode <= 0xFF) {\n          escapeChar = 'x';\n          length = 2;\n        } else {\n          escapeChar = 'u';\n          length = 4;\n        }\n\n        return '\\\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);\n      }\n\n      function matchFailed(failure) {\n        if (pos < rightmostFailuresPos) {\n          return;\n        }\n\n        if (pos > rightmostFailuresPos) {\n          rightmostFailuresPos = pos;\n          rightmostFailuresExpected = [];\n        }\n\n        rightmostFailuresExpected.push(failure);\n      }\n\n      function parse_grammar() {\n        var result0, result1, result2, result3;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse___();\n        if (result0 !== null) {\n          result1 = parse_initializer();\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result3 = parse_rule();\n            if (result3 !== null) {\n              result2 = [];\n              while (result3 !== null) {\n                result2.push(result3);\n                result3 = parse_rule();\n              }\n            } else {\n              result2 = null;\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, initializer, rules) {\n              return {\n                type:        \"grammar\",\n                initializer: initializer !== \"\" ? initializer : null,\n                rules:       rules,\n                startRule:   rules[0].name\n              };\n            })(pos0, result0[1], result0[2]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_initializer() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_action();\n        if (result0 !== null) {\n          result1 = parse_semicolon();\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, code) {\n              return {\n                type: \"initializer\",\n                code: code\n              };\n            })(pos0, result0[0]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_rule() {\n        var result0, result1, result2, result3, result4;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_identifier();\n        if (result0 !== null) {\n          result1 = parse_string();\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result2 = parse_equals();\n            if (result2 !== null) {\n              result3 = parse_choice();\n              if (result3 !== null) {\n                result4 = parse_semicolon();\n                result4 = result4 !== null ? result4 : \"\";\n                if (result4 !== null) {\n                  result0 = [result0, result1, result2, result3, result4];\n                } else {\n                  result0 = null;\n                  pos = pos1;\n                }\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, name, displayName, expression) {\n              return {\n                type:        \"rule\",\n                name:        name,\n                displayName: displayName !== \"\" ? displayName : null,\n                expression:  expression\n              };\n            })(pos0, result0[0], result0[1], result0[3]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_choice() {\n        var result0, result1, result2, result3;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_sequence();\n        if (result0 !== null) {\n          result1 = [];\n          pos2 = pos;\n          result2 = parse_slash();\n          if (result2 !== null) {\n            result3 = parse_sequence();\n            if (result3 !== null) {\n              result2 = [result2, result3];\n            } else {\n              result2 = null;\n              pos = pos2;\n            }\n          } else {\n            result2 = null;\n            pos = pos2;\n          }\n          while (result2 !== null) {\n            result1.push(result2);\n            pos2 = pos;\n            result2 = parse_slash();\n            if (result2 !== null) {\n              result3 = parse_sequence();\n              if (result3 !== null) {\n                result2 = [result2, result3];\n              } else {\n                result2 = null;\n                pos = pos2;\n              }\n            } else {\n              result2 = null;\n              pos = pos2;\n            }\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, head, tail) {\n              if (tail.length > 0) {\n                var alternatives = [head].concat(map(\n                    tail,\n                    function(element) { return element[1]; }\n                ));\n                return {\n                  type:         \"choice\",\n                  alternatives: alternatives\n                };\n              } else {\n                return head;\n              }\n            })(pos0, result0[0], result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_sequence() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = [];\n        result1 = parse_labeled();\n        while (result1 !== null) {\n          result0.push(result1);\n          result1 = parse_labeled();\n        }\n        if (result0 !== null) {\n          result1 = parse_action();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, elements, code) {\n              var expression = elements.length !== 1\n                ? {\n                    type:     \"sequence\",\n                    elements: elements\n                  }\n                : elements[0];\n              return {\n                type:       \"action\",\n                expression: expression,\n                code:       code\n              };\n            })(pos0, result0[0], result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        if (result0 === null) {\n          pos0 = pos;\n          result0 = [];\n          result1 = parse_labeled();\n          while (result1 !== null) {\n            result0.push(result1);\n            result1 = parse_labeled();\n          }\n          if (result0 !== null) {\n            result0 = (function(offset, elements) {\n                return elements.length !== 1\n                  ? {\n                      type:     \"sequence\",\n                      elements: elements\n                    }\n                  : elements[0];\n              })(pos0, result0);\n          }\n          if (result0 === null) {\n            pos = pos0;\n          }\n        }\n        return result0;\n      }\n\n      function parse_labeled() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_identifier();\n        if (result0 !== null) {\n          result1 = parse_colon();\n          if (result1 !== null) {\n            result2 = parse_prefixed();\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, label, expression) {\n              return {\n                type:       \"labeled\",\n                label:      label,\n                expression: expression\n              };\n            })(pos0, result0[0], result0[2]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        if (result0 === null) {\n          result0 = parse_prefixed();\n        }\n        return result0;\n      }\n\n      function parse_prefixed() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_and();\n        if (result0 !== null) {\n          result1 = parse_action();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, code) {\n              return {\n                type: \"semantic_and\",\n                code: code\n              };\n            })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        if (result0 === null) {\n          pos0 = pos;\n          pos1 = pos;\n          result0 = parse_and();\n          if (result0 !== null) {\n            result1 = parse_suffixed();\n            if (result1 !== null) {\n              result0 = [result0, result1];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n          if (result0 !== null) {\n            result0 = (function(offset, expression) {\n                return {\n                  type:       \"simple_and\",\n                  expression: expression\n                };\n              })(pos0, result0[1]);\n          }\n          if (result0 === null) {\n            pos = pos0;\n          }\n          if (result0 === null) {\n            pos0 = pos;\n            pos1 = pos;\n            result0 = parse_not();\n            if (result0 !== null) {\n              result1 = parse_action();\n              if (result1 !== null) {\n                result0 = [result0, result1];\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n            if (result0 !== null) {\n              result0 = (function(offset, code) {\n                  return {\n                    type: \"semantic_not\",\n                    code: code\n                  };\n                })(pos0, result0[1]);\n            }\n            if (result0 === null) {\n              pos = pos0;\n            }\n            if (result0 === null) {\n              pos0 = pos;\n              pos1 = pos;\n              result0 = parse_not();\n              if (result0 !== null) {\n                result1 = parse_suffixed();\n                if (result1 !== null) {\n                  result0 = [result0, result1];\n                } else {\n                  result0 = null;\n                  pos = pos1;\n                }\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n              if (result0 !== null) {\n                result0 = (function(offset, expression) {\n                    return {\n                      type:       \"simple_not\",\n                      expression: expression\n                    };\n                  })(pos0, result0[1]);\n              }\n              if (result0 === null) {\n                pos = pos0;\n              }\n              if (result0 === null) {\n                result0 = parse_suffixed();\n              }\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_suffixed() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_primary();\n        if (result0 !== null) {\n          result1 = parse_question();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, expression) {\n              return {\n                type:       \"optional\",\n                expression: expression\n              };\n            })(pos0, result0[0]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        if (result0 === null) {\n          pos0 = pos;\n          pos1 = pos;\n          result0 = parse_primary();\n          if (result0 !== null) {\n            result1 = parse_star();\n            if (result1 !== null) {\n              result0 = [result0, result1];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n          if (result0 !== null) {\n            result0 = (function(offset, expression) {\n                return {\n                  type:       \"zero_or_more\",\n                  expression: expression\n                };\n              })(pos0, result0[0]);\n          }\n          if (result0 === null) {\n            pos = pos0;\n          }\n          if (result0 === null) {\n            pos0 = pos;\n            pos1 = pos;\n            result0 = parse_primary();\n            if (result0 !== null) {\n              result1 = parse_plus();\n              if (result1 !== null) {\n                result0 = [result0, result1];\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n            if (result0 !== null) {\n              result0 = (function(offset, expression) {\n                  return {\n                    type:       \"one_or_more\",\n                    expression: expression\n                  };\n                })(pos0, result0[0]);\n            }\n            if (result0 === null) {\n              pos = pos0;\n            }\n            if (result0 === null) {\n              result0 = parse_primary();\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_primary() {\n        var result0, result1, result2;\n        var pos0, pos1, pos2, pos3;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_identifier();\n        if (result0 !== null) {\n          pos2 = pos;\n          reportFailures++;\n          pos3 = pos;\n          result1 = parse_string();\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result2 = parse_equals();\n            if (result2 !== null) {\n              result1 = [result1, result2];\n            } else {\n              result1 = null;\n              pos = pos3;\n            }\n          } else {\n            result1 = null;\n            pos = pos3;\n          }\n          reportFailures--;\n          if (result1 === null) {\n            result1 = \"\";\n          } else {\n            result1 = null;\n            pos = pos2;\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, name) {\n              return {\n                type: \"rule_ref\",\n                name: name\n              };\n            })(pos0, result0[0]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        if (result0 === null) {\n          result0 = parse_literal();\n          if (result0 === null) {\n            pos0 = pos;\n            result0 = parse_dot();\n            if (result0 !== null) {\n              result0 = (function(offset) { return { type: \"any\" }; })(pos0);\n            }\n            if (result0 === null) {\n              pos = pos0;\n            }\n            if (result0 === null) {\n              result0 = parse_class();\n              if (result0 === null) {\n                pos0 = pos;\n                pos1 = pos;\n                result0 = parse_lparen();\n                if (result0 !== null) {\n                  result1 = parse_choice();\n                  if (result1 !== null) {\n                    result2 = parse_rparen();\n                    if (result2 !== null) {\n                      result0 = [result0, result1, result2];\n                    } else {\n                      result0 = null;\n                      pos = pos1;\n                    }\n                  } else {\n                    result0 = null;\n                    pos = pos1;\n                  }\n                } else {\n                  result0 = null;\n                  pos = pos1;\n                }\n                if (result0 !== null) {\n                  result0 = (function(offset, expression) { return expression; })(pos0, result0[1]);\n                }\n                if (result0 === null) {\n                  pos = pos0;\n                }\n              }\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_action() {\n        var result0, result1;\n        var pos0, pos1;\n\n        reportFailures++;\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_braced();\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, braced) { return braced.substr(1, braced.length - 2); })(pos0, result0[0]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"action\");\n        }\n        return result0;\n      }\n\n      function parse_braced() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 123) {\n          result0 = \"{\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"{\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          result2 = parse_braced();\n          if (result2 === null) {\n            result2 = parse_nonBraceCharacters();\n          }\n          while (result2 !== null) {\n            result1.push(result2);\n            result2 = parse_braced();\n            if (result2 === null) {\n              result2 = parse_nonBraceCharacters();\n            }\n          }\n          if (result1 !== null) {\n            if (input.charCodeAt(pos) === 125) {\n              result2 = \"}\";\n              pos++;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"}\\\"\");\n              }\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, parts) {\n              return \"{\" + parts.join(\"\") + \"}\";\n            })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_nonBraceCharacters() {\n        var result0, result1;\n        var pos0;\n\n        pos0 = pos;\n        result1 = parse_nonBraceCharacter();\n        if (result1 !== null) {\n          result0 = [];\n          while (result1 !== null) {\n            result0.push(result1);\n            result1 = parse_nonBraceCharacter();\n          }\n        } else {\n          result0 = null;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, chars) { return chars.join(\"\"); })(pos0, result0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_nonBraceCharacter() {\n        var result0;\n\n        if (/^[^{}]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[^{}]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse_equals() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 61) {\n          result0 = \"=\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"=\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"=\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_colon() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 58) {\n          result0 = \":\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\":\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \":\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_semicolon() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 59) {\n          result0 = \";\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\";\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \";\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_slash() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 47) {\n          result0 = \"/\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"/\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"/\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_and() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 38) {\n          result0 = \"&\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"&\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"&\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_not() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 33) {\n          result0 = \"!\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"!\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"!\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_question() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 63) {\n          result0 = \"?\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"?\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"?\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_star() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 42) {\n          result0 = \"*\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"*\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"*\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_plus() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 43) {\n          result0 = \"+\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"+\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"+\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_lparen() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 40) {\n          result0 = \"(\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"(\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"(\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_rparen() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 41) {\n          result0 = \")\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\")\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \")\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_dot() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 46) {\n          result0 = \".\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\".\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \".\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_identifier() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        reportFailures++;\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_letter();\n        if (result0 === null) {\n          if (input.charCodeAt(pos) === 95) {\n            result0 = \"_\";\n            pos++;\n          } else {\n            result0 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"_\\\"\");\n            }\n          }\n          if (result0 === null) {\n            if (input.charCodeAt(pos) === 36) {\n              result0 = \"$\";\n              pos++;\n            } else {\n              result0 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"$\\\"\");\n              }\n            }\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          result2 = parse_letter();\n          if (result2 === null) {\n            result2 = parse_digit();\n            if (result2 === null) {\n              if (input.charCodeAt(pos) === 95) {\n                result2 = \"_\";\n                pos++;\n              } else {\n                result2 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"\\\"_\\\"\");\n                }\n              }\n              if (result2 === null) {\n                if (input.charCodeAt(pos) === 36) {\n                  result2 = \"$\";\n                  pos++;\n                } else {\n                  result2 = null;\n                  if (reportFailures === 0) {\n                    matchFailed(\"\\\"$\\\"\");\n                  }\n                }\n              }\n            }\n          }\n          while (result2 !== null) {\n            result1.push(result2);\n            result2 = parse_letter();\n            if (result2 === null) {\n              result2 = parse_digit();\n              if (result2 === null) {\n                if (input.charCodeAt(pos) === 95) {\n                  result2 = \"_\";\n                  pos++;\n                } else {\n                  result2 = null;\n                  if (reportFailures === 0) {\n                    matchFailed(\"\\\"_\\\"\");\n                  }\n                }\n                if (result2 === null) {\n                  if (input.charCodeAt(pos) === 36) {\n                    result2 = \"$\";\n                    pos++;\n                  } else {\n                    result2 = null;\n                    if (reportFailures === 0) {\n                      matchFailed(\"\\\"$\\\"\");\n                    }\n                  }\n                }\n              }\n            }\n          }\n          if (result1 !== null) {\n            result2 = parse___();\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, head, tail) {\n              return head + tail.join(\"\");\n            })(pos0, result0[0], result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"identifier\");\n        }\n        return result0;\n      }\n\n      function parse_literal() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        reportFailures++;\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_doubleQuotedString();\n        if (result0 === null) {\n          result0 = parse_singleQuotedString();\n        }\n        if (result0 !== null) {\n          if (input.charCodeAt(pos) === 105) {\n            result1 = \"i\";\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"i\\\"\");\n            }\n          }\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result2 = parse___();\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, value, flags) {\n              return {\n                type:       \"literal\",\n                value:      value,\n                ignoreCase: flags === \"i\"\n              };\n            })(pos0, result0[0], result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"literal\");\n        }\n        return result0;\n      }\n\n      function parse_string() {\n        var result0, result1;\n        var pos0, pos1;\n\n        reportFailures++;\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_doubleQuotedString();\n        if (result0 === null) {\n          result0 = parse_singleQuotedString();\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, string) { return string; })(pos0, result0[0]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"string\");\n        }\n        return result0;\n      }\n\n      function parse_doubleQuotedString() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 34) {\n          result0 = \"\\\"\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\"\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          result2 = parse_doubleQuotedCharacter();\n          while (result2 !== null) {\n            result1.push(result2);\n            result2 = parse_doubleQuotedCharacter();\n          }\n          if (result1 !== null) {\n            if (input.charCodeAt(pos) === 34) {\n              result2 = \"\\\"\";\n              pos++;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"\\\\\\\"\\\"\");\n              }\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, chars) { return chars.join(\"\"); })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_doubleQuotedCharacter() {\n        var result0;\n\n        result0 = parse_simpleDoubleQuotedCharacter();\n        if (result0 === null) {\n          result0 = parse_simpleEscapeSequence();\n          if (result0 === null) {\n            result0 = parse_zeroEscapeSequence();\n            if (result0 === null) {\n              result0 = parse_hexEscapeSequence();\n              if (result0 === null) {\n                result0 = parse_unicodeEscapeSequence();\n                if (result0 === null) {\n                  result0 = parse_eolEscapeSequence();\n                }\n              }\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_simpleDoubleQuotedCharacter() {\n        var result0, result1;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        pos2 = pos;\n        reportFailures++;\n        if (input.charCodeAt(pos) === 34) {\n          result0 = \"\\\"\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\"\\\"\");\n          }\n        }\n        if (result0 === null) {\n          if (input.charCodeAt(pos) === 92) {\n            result0 = \"\\\\\";\n            pos++;\n          } else {\n            result0 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"\\\\\\\\\\\"\");\n            }\n          }\n          if (result0 === null) {\n            result0 = parse_eolChar();\n          }\n        }\n        reportFailures--;\n        if (result0 === null) {\n          result0 = \"\";\n        } else {\n          result0 = null;\n          pos = pos2;\n        }\n        if (result0 !== null) {\n          if (input.length > pos) {\n            result1 = input.charAt(pos);\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"any character\");\n            }\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, char_) { return char_; })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_singleQuotedString() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 39) {\n          result0 = \"'\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"'\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          result2 = parse_singleQuotedCharacter();\n          while (result2 !== null) {\n            result1.push(result2);\n            result2 = parse_singleQuotedCharacter();\n          }\n          if (result1 !== null) {\n            if (input.charCodeAt(pos) === 39) {\n              result2 = \"'\";\n              pos++;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"'\\\"\");\n              }\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, chars) { return chars.join(\"\"); })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_singleQuotedCharacter() {\n        var result0;\n\n        result0 = parse_simpleSingleQuotedCharacter();\n        if (result0 === null) {\n          result0 = parse_simpleEscapeSequence();\n          if (result0 === null) {\n            result0 = parse_zeroEscapeSequence();\n            if (result0 === null) {\n              result0 = parse_hexEscapeSequence();\n              if (result0 === null) {\n                result0 = parse_unicodeEscapeSequence();\n                if (result0 === null) {\n                  result0 = parse_eolEscapeSequence();\n                }\n              }\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_simpleSingleQuotedCharacter() {\n        var result0, result1;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        pos2 = pos;\n        reportFailures++;\n        if (input.charCodeAt(pos) === 39) {\n          result0 = \"'\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"'\\\"\");\n          }\n        }\n        if (result0 === null) {\n          if (input.charCodeAt(pos) === 92) {\n            result0 = \"\\\\\";\n            pos++;\n          } else {\n            result0 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"\\\\\\\\\\\"\");\n            }\n          }\n          if (result0 === null) {\n            result0 = parse_eolChar();\n          }\n        }\n        reportFailures--;\n        if (result0 === null) {\n          result0 = \"\";\n        } else {\n          result0 = null;\n          pos = pos2;\n        }\n        if (result0 !== null) {\n          if (input.length > pos) {\n            result1 = input.charAt(pos);\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"any character\");\n            }\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, char_) { return char_; })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_class() {\n        var result0, result1, result2, result3, result4, result5;\n        var pos0, pos1;\n\n        reportFailures++;\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 91) {\n          result0 = \"[\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"[\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          if (input.charCodeAt(pos) === 94) {\n            result1 = \"^\";\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"^\\\"\");\n            }\n          }\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result2 = [];\n            result3 = parse_classCharacterRange();\n            if (result3 === null) {\n              result3 = parse_classCharacter();\n            }\n            while (result3 !== null) {\n              result2.push(result3);\n              result3 = parse_classCharacterRange();\n              if (result3 === null) {\n                result3 = parse_classCharacter();\n              }\n            }\n            if (result2 !== null) {\n              if (input.charCodeAt(pos) === 93) {\n                result3 = \"]\";\n                pos++;\n              } else {\n                result3 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"\\\"]\\\"\");\n                }\n              }\n              if (result3 !== null) {\n                if (input.charCodeAt(pos) === 105) {\n                  result4 = \"i\";\n                  pos++;\n                } else {\n                  result4 = null;\n                  if (reportFailures === 0) {\n                    matchFailed(\"\\\"i\\\"\");\n                  }\n                }\n                result4 = result4 !== null ? result4 : \"\";\n                if (result4 !== null) {\n                  result5 = parse___();\n                  if (result5 !== null) {\n                    result0 = [result0, result1, result2, result3, result4, result5];\n                  } else {\n                    result0 = null;\n                    pos = pos1;\n                  }\n                } else {\n                  result0 = null;\n                  pos = pos1;\n                }\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, inverted, parts, flags) {\n              var partsConverted = map(parts, function(part) { return part.data; });\n              var rawText = \"[\"\n                + inverted\n                + map(parts, function(part) { return part.rawText; }).join(\"\")\n                + \"]\"\n                + flags;\n\n              return {\n                type:       \"class\",\n                parts:      partsConverted,\n                // FIXME: Get the raw text from the input directly.\n                rawText:    rawText,\n                inverted:   inverted === \"^\",\n                ignoreCase: flags === \"i\"\n              };\n            })(pos0, result0[1], result0[2], result0[4]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"character class\");\n        }\n        return result0;\n      }\n\n      function parse_classCharacterRange() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_classCharacter();\n        if (result0 !== null) {\n          if (input.charCodeAt(pos) === 45) {\n            result1 = \"-\";\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"-\\\"\");\n            }\n          }\n          if (result1 !== null) {\n            result2 = parse_classCharacter();\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, begin, end) {\n              if (begin.data.charCodeAt(0) > end.data.charCodeAt(0)) {\n                throw new this.SyntaxError(\n                  \"Invalid character range: \" + begin.rawText + \"-\" + end.rawText + \".\"\n                );\n              }\n\n              return {\n                data:    [begin.data, end.data],\n                // FIXME: Get the raw text from the input directly.\n                rawText: begin.rawText + \"-\" + end.rawText\n              };\n            })(pos0, result0[0], result0[2]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_classCharacter() {\n        var result0;\n        var pos0;\n\n        pos0 = pos;\n        result0 = parse_bracketDelimitedCharacter();\n        if (result0 !== null) {\n          result0 = (function(offset, char_) {\n              return {\n                data:    char_,\n                // FIXME: Get the raw text from the input directly.\n                rawText: quoteForRegexpClass(char_)\n              };\n            })(pos0, result0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_bracketDelimitedCharacter() {\n        var result0;\n\n        result0 = parse_simpleBracketDelimitedCharacter();\n        if (result0 === null) {\n          result0 = parse_simpleEscapeSequence();\n          if (result0 === null) {\n            result0 = parse_zeroEscapeSequence();\n            if (result0 === null) {\n              result0 = parse_hexEscapeSequence();\n              if (result0 === null) {\n                result0 = parse_unicodeEscapeSequence();\n                if (result0 === null) {\n                  result0 = parse_eolEscapeSequence();\n                }\n              }\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_simpleBracketDelimitedCharacter() {\n        var result0, result1;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        pos2 = pos;\n        reportFailures++;\n        if (input.charCodeAt(pos) === 93) {\n          result0 = \"]\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"]\\\"\");\n          }\n        }\n        if (result0 === null) {\n          if (input.charCodeAt(pos) === 92) {\n            result0 = \"\\\\\";\n            pos++;\n          } else {\n            result0 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"\\\\\\\\\\\"\");\n            }\n          }\n          if (result0 === null) {\n            result0 = parse_eolChar();\n          }\n        }\n        reportFailures--;\n        if (result0 === null) {\n          result0 = \"\";\n        } else {\n          result0 = null;\n          pos = pos2;\n        }\n        if (result0 !== null) {\n          if (input.length > pos) {\n            result1 = input.charAt(pos);\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"any character\");\n            }\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, char_) { return char_; })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_simpleEscapeSequence() {\n        var result0, result1, result2;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 92) {\n          result0 = \"\\\\\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\\\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          pos2 = pos;\n          reportFailures++;\n          result1 = parse_digit();\n          if (result1 === null) {\n            if (input.charCodeAt(pos) === 120) {\n              result1 = \"x\";\n              pos++;\n            } else {\n              result1 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"x\\\"\");\n              }\n            }\n            if (result1 === null) {\n              if (input.charCodeAt(pos) === 117) {\n                result1 = \"u\";\n                pos++;\n              } else {\n                result1 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"\\\"u\\\"\");\n                }\n              }\n              if (result1 === null) {\n                result1 = parse_eolChar();\n              }\n            }\n          }\n          reportFailures--;\n          if (result1 === null) {\n            result1 = \"\";\n          } else {\n            result1 = null;\n            pos = pos2;\n          }\n          if (result1 !== null) {\n            if (input.length > pos) {\n              result2 = input.charAt(pos);\n              pos++;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"any character\");\n              }\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, char_) {\n              return char_\n                .replace(\"b\", \"\\b\")\n                .replace(\"f\", \"\\f\")\n                .replace(\"n\", \"\\n\")\n                .replace(\"r\", \"\\r\")\n                .replace(\"t\", \"\\t\")\n                .replace(\"v\", \"\\x0B\"); // IE does not recognize \"\\v\".\n            })(pos0, result0[2]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_zeroEscapeSequence() {\n        var result0, result1;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.substr(pos, 2) === \"\\\\0\") {\n          result0 = \"\\\\0\";\n          pos += 2;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\\0\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          pos2 = pos;\n          reportFailures++;\n          result1 = parse_digit();\n          reportFailures--;\n          if (result1 === null) {\n            result1 = \"\";\n          } else {\n            result1 = null;\n            pos = pos2;\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"\\x00\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_hexEscapeSequence() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.substr(pos, 2) === \"\\\\x\") {\n          result0 = \"\\\\x\";\n          pos += 2;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\\x\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse_hexDigit();\n          if (result1 !== null) {\n            result2 = parse_hexDigit();\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, h1, h2) {\n              return String.fromCharCode(parseInt(h1 + h2, 16));\n            })(pos0, result0[1], result0[2]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_unicodeEscapeSequence() {\n        var result0, result1, result2, result3, result4;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.substr(pos, 2) === \"\\\\u\") {\n          result0 = \"\\\\u\";\n          pos += 2;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\\u\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse_hexDigit();\n          if (result1 !== null) {\n            result2 = parse_hexDigit();\n            if (result2 !== null) {\n              result3 = parse_hexDigit();\n              if (result3 !== null) {\n                result4 = parse_hexDigit();\n                if (result4 !== null) {\n                  result0 = [result0, result1, result2, result3, result4];\n                } else {\n                  result0 = null;\n                  pos = pos1;\n                }\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, h1, h2, h3, h4) {\n              return String.fromCharCode(parseInt(h1 + h2 + h3 + h4, 16));\n            })(pos0, result0[1], result0[2], result0[3], result0[4]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_eolEscapeSequence() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 92) {\n          result0 = \"\\\\\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\\\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse_eol();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, eol) { return eol; })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_digit() {\n        var result0;\n\n        if (/^[0-9]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[0-9]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse_hexDigit() {\n        var result0;\n\n        if (/^[0-9a-fA-F]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[0-9a-fA-F]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse_letter() {\n        var result0;\n\n        result0 = parse_lowerCaseLetter();\n        if (result0 === null) {\n          result0 = parse_upperCaseLetter();\n        }\n        return result0;\n      }\n\n      function parse_lowerCaseLetter() {\n        var result0;\n\n        if (/^[a-z]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[a-z]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse_upperCaseLetter() {\n        var result0;\n\n        if (/^[A-Z]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[A-Z]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse___() {\n        var result0, result1;\n\n        result0 = [];\n        result1 = parse_whitespace();\n        if (result1 === null) {\n          result1 = parse_eol();\n          if (result1 === null) {\n            result1 = parse_comment();\n          }\n        }\n        while (result1 !== null) {\n          result0.push(result1);\n          result1 = parse_whitespace();\n          if (result1 === null) {\n            result1 = parse_eol();\n            if (result1 === null) {\n              result1 = parse_comment();\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_comment() {\n        var result0;\n\n        reportFailures++;\n        result0 = parse_singleLineComment();\n        if (result0 === null) {\n          result0 = parse_multiLineComment();\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"comment\");\n        }\n        return result0;\n      }\n\n      function parse_singleLineComment() {\n        var result0, result1, result2, result3;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        if (input.substr(pos, 2) === \"//\") {\n          result0 = \"//\";\n          pos += 2;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"//\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          pos1 = pos;\n          pos2 = pos;\n          reportFailures++;\n          result2 = parse_eolChar();\n          reportFailures--;\n          if (result2 === null) {\n            result2 = \"\";\n          } else {\n            result2 = null;\n            pos = pos2;\n          }\n          if (result2 !== null) {\n            if (input.length > pos) {\n              result3 = input.charAt(pos);\n              pos++;\n            } else {\n              result3 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"any character\");\n              }\n            }\n            if (result3 !== null) {\n              result2 = [result2, result3];\n            } else {\n              result2 = null;\n              pos = pos1;\n            }\n          } else {\n            result2 = null;\n            pos = pos1;\n          }\n          while (result2 !== null) {\n            result1.push(result2);\n            pos1 = pos;\n            pos2 = pos;\n            reportFailures++;\n            result2 = parse_eolChar();\n            reportFailures--;\n            if (result2 === null) {\n              result2 = \"\";\n            } else {\n              result2 = null;\n              pos = pos2;\n            }\n            if (result2 !== null) {\n              if (input.length > pos) {\n                result3 = input.charAt(pos);\n                pos++;\n              } else {\n                result3 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"any character\");\n                }\n              }\n              if (result3 !== null) {\n                result2 = [result2, result3];\n              } else {\n                result2 = null;\n                pos = pos1;\n              }\n            } else {\n              result2 = null;\n              pos = pos1;\n            }\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos0;\n          }\n        } else {\n          result0 = null;\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_multiLineComment() {\n        var result0, result1, result2, result3;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        if (input.substr(pos, 2) === \"/*\") {\n          result0 = \"/*\";\n          pos += 2;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"/*\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          pos1 = pos;\n          pos2 = pos;\n          reportFailures++;\n          if (input.substr(pos, 2) === \"*/\") {\n            result2 = \"*/\";\n            pos += 2;\n          } else {\n            result2 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"*/\\\"\");\n            }\n          }\n          reportFailures--;\n          if (result2 === null) {\n            result2 = \"\";\n          } else {\n            result2 = null;\n            pos = pos2;\n          }\n          if (result2 !== null) {\n            if (input.length > pos) {\n              result3 = input.charAt(pos);\n              pos++;\n            } else {\n              result3 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"any character\");\n              }\n            }\n            if (result3 !== null) {\n              result2 = [result2, result3];\n            } else {\n              result2 = null;\n              pos = pos1;\n            }\n          } else {\n            result2 = null;\n            pos = pos1;\n          }\n          while (result2 !== null) {\n            result1.push(result2);\n            pos1 = pos;\n            pos2 = pos;\n            reportFailures++;\n            if (input.substr(pos, 2) === \"*/\") {\n              result2 = \"*/\";\n              pos += 2;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"*/\\\"\");\n              }\n            }\n            reportFailures--;\n            if (result2 === null) {\n              result2 = \"\";\n            } else {\n              result2 = null;\n              pos = pos2;\n            }\n            if (result2 !== null) {\n              if (input.length > pos) {\n                result3 = input.charAt(pos);\n                pos++;\n              } else {\n                result3 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"any character\");\n                }\n              }\n              if (result3 !== null) {\n                result2 = [result2, result3];\n              } else {\n                result2 = null;\n                pos = pos1;\n              }\n            } else {\n              result2 = null;\n              pos = pos1;\n            }\n          }\n          if (result1 !== null) {\n            if (input.substr(pos, 2) === \"*/\") {\n              result2 = \"*/\";\n              pos += 2;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"*/\\\"\");\n              }\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos0;\n            }\n          } else {\n            result0 = null;\n            pos = pos0;\n          }\n        } else {\n          result0 = null;\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_eol() {\n        var result0;\n\n        reportFailures++;\n        if (input.charCodeAt(pos) === 10) {\n          result0 = \"\\n\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\n\\\"\");\n          }\n        }\n        if (result0 === null) {\n          if (input.substr(pos, 2) === \"\\r\\n\") {\n            result0 = \"\\r\\n\";\n            pos += 2;\n          } else {\n            result0 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"\\\\r\\\\n\\\"\");\n            }\n          }\n          if (result0 === null) {\n            if (input.charCodeAt(pos) === 13) {\n              result0 = \"\\r\";\n              pos++;\n            } else {\n              result0 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"\\\\r\\\"\");\n              }\n            }\n            if (result0 === null) {\n              if (input.charCodeAt(pos) === 8232) {\n                result0 = \"\\u2028\";\n                pos++;\n              } else {\n                result0 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"\\\"\\\\u2028\\\"\");\n                }\n              }\n              if (result0 === null) {\n                if (input.charCodeAt(pos) === 8233) {\n                  result0 = \"\\u2029\";\n                  pos++;\n                } else {\n                  result0 = null;\n                  if (reportFailures === 0) {\n                    matchFailed(\"\\\"\\\\u2029\\\"\");\n                  }\n                }\n              }\n            }\n          }\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"end of line\");\n        }\n        return result0;\n      }\n\n      function parse_eolChar() {\n        var result0;\n\n        if (/^[\\n\\r\\u2028\\u2029]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[\\\\n\\\\r\\\\u2028\\\\u2029]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse_whitespace() {\n        var result0;\n\n        reportFailures++;\n        if (/^[ \\t\\x0B\\f\\xA0\\uFEFF\\u1680\\u180E\\u2000-\\u200A\\u202F\\u205F\\u3000]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[ \\\\t\\\\x0B\\\\f\\\\xA0\\\\uFEFF\\\\u1680\\\\u180E\\\\u2000-\\\\u200A\\\\u202F\\\\u205F\\\\u3000]\");\n          }\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"whitespace\");\n        }\n        return result0;\n      }\n\n\n      function cleanupExpected(expected) {\n        expected.sort();\n\n        var lastExpected = null;\n        var cleanExpected = [];\n        for (var i = 0; i < expected.length; i++) {\n          if (expected[i] !== lastExpected) {\n            cleanExpected.push(expected[i]);\n            lastExpected = expected[i];\n          }\n        }\n        return cleanExpected;\n      }\n\n      function computeErrorPosition() {\n        /*\n         * The first idea was to use |String.split| to break the input up to the\n         * error position along newlines and derive the line and column from\n         * there. However IE's |split| implementation is so broken that it was\n         * enough to prevent it.\n         */\n\n        var line = 1;\n        var column = 1;\n        var seenCR = false;\n\n        for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) {\n          var ch = input.charAt(i);\n          if (ch === \"\\n\") {\n            if (!seenCR) { line++; }\n            column = 1;\n            seenCR = false;\n          } else if (ch === \"\\r\" || ch === \"\\u2028\" || ch === \"\\u2029\") {\n            line++;\n            column = 1;\n            seenCR = true;\n          } else {\n            column++;\n            seenCR = false;\n          }\n        }\n\n        return { line: line, column: column };\n      }\n\n\n      var result = parseFunctions[startRule]();\n\n      /*\n       * The parser is now in one of the following three states:\n       *\n       * 1. The parser successfully parsed the whole input.\n       *\n       *    - |result !== null|\n       *    - |pos === input.length|\n       *    - |rightmostFailuresExpected| may or may not contain something\n       *\n       * 2. The parser successfully parsed only a part of the input.\n       *\n       *    - |result !== null|\n       *    - |pos < input.length|\n       *    - |rightmostFailuresExpected| may or may not contain something\n       *\n       * 3. The parser did not successfully parse any part of the input.\n       *\n       *   - |result === null|\n       *   - |pos === 0|\n       *   - |rightmostFailuresExpected| contains at least one failure\n       *\n       * All code following this comment (including called functions) must\n       * handle these states.\n       */\n      if (result === null || pos !== input.length) {\n        var offset = Math.max(pos, rightmostFailuresPos);\n        var found = offset < input.length ? input.charAt(offset) : null;\n        var errorPosition = computeErrorPosition();\n\n        throw new this.SyntaxError(\n          cleanupExpected(rightmostFailuresExpected),\n          found,\n          offset,\n          errorPosition.line,\n          errorPosition.column\n        );\n      }\n\n      return result;\n    },\n\n    /* Returns the parser source code. */\n    toSource: function() { return this._source; }\n  };\n\n  /* Thrown when a parser encounters a syntax error. */\n\n  result.SyntaxError = function(expected, found, offset, line, column) {\n    function buildMessage(expected, found) {\n      var expectedHumanized, foundHumanized;\n\n      switch (expected.length) {\n        case 0:\n          expectedHumanized = \"end of input\";\n          break;\n        case 1:\n          expectedHumanized = expected[0];\n          break;\n        default:\n          expectedHumanized = expected.slice(0, expected.length - 1).join(\", \")\n            + \" or \"\n            + expected[expected.length - 1];\n      }\n\n      foundHumanized = found ? quote(found) : \"end of input\";\n\n      return \"Expected \" + expectedHumanized + \" but \" + foundHumanized + \" found.\";\n    }\n\n    this.name = \"SyntaxError\";\n    this.expected = expected;\n    this.found = found;\n    this.message = buildMessage(expected, found);\n    this.offset = offset;\n    this.line = line;\n    this.column = column;\n  };\n\n  result.SyntaxError.prototype = Error.prototype;\n\n  return result;\n})();\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/pre-processors.vue",
    "content": "<style lang=\"stylus\">\nfont-stack = Helvetica, sans-serif\nprimary-color = #999\nbody\n  font 100% font-stack\n  color primary-color\n</style>\n\n<template lang=\"jade\">\ndiv\n  h1 {{msg}}\n  comp-a\n  comp-b\n</template>\n\n<script lang=\"babel\">\nimport compA from './components/a.vue'\nimport compB from './components/b.vue'\n\nexport default {\n  data () {\n    return {\n      msg: 'Hello from Babel!'\n    }\n  },\n  components: {\n    'comp-a': compA,\n    'comp-b': compB\n  }\n}\n</script>\n"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/proto.js",
    "content": "/**\n * @fileoverview\n * @enhanceable\n * @public\n */\n// GENERATED CODE -- DO NOT EDIT!\n\ngoog.provide('proto.google.protobuf.Timestamp');\n\ngoog.require('jspb.Message');\n\n/**\n * Generated by JsPbCodeGenerator.\n * @param {Array=} opt_data Optional initial data array, typically from a\n * server response, or constructed directly in Javascript. The array is used\n * in place and becomes part of the constructed object. It is not cloned.\n * If no data is provided, the constructed object will be empty, but still\n * valid.\n * @extends {jspb.Message}\n * @constructor\n */\nproto.google.protobuf.Timestamp = function(opt_data) {\n  jspb.Message.initialize(this, opt_data, 0, -1, null, null);\n};\ngoog.inherits(proto.google.protobuf.Timestamp, jspb.Message);\nif (goog.DEBUG && !COMPILED) {\n  proto.google.protobuf.Timestamp.displayName = 'proto.google.protobuf.Timestamp';\n}\n\n\n// Remainder elided"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/steelseries-min.js",
    "content": "/*!\n * Name          : steelseries.js\n * Authors       : Gerrit Grunwald, Mark Crossley\n * Last modified : 09.05.2012\n * Revision      : 0.11.3\n *\n * Copyright (c) 2011, Gerrit Grunwald, Mark Crossley\n * All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without modification, are permitted\n *  provided that the following conditions are met:\n *\n *  # Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n *  # Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided with the distribution.\n *\n *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,\n *   BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n *   SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n *   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nvar steelseries=function(){function f(n,t){var i=\"#\"===n.charAt(0)?n.substring(1,7):n,f=parseInt(i.substring(0,2),16),u=parseInt(i.substring(2,4),16),r=parseInt(i.substring(4,6),16);return this.color=\"rgba(\"+f+\",\"+u+\",\"+r+\",\"+t+\")\",this}function ui(t,i,r,u){var f=1/255,y=t.getRed(),v=t.getGreen(),a=t.getBlue(),b=t.getAlpha(),w=i.getRed()-t.getRed(),p=i.getGreen()-t.getGreen(),s=i.getBlue()-t.getBlue(),o=i.getAlpha()*f-t.getAlpha()*f,e=w/r,l=p/r,c=s/r,h=o/r;return new n((y+e*u).toFixed(0),(v+l*u).toFixed(0),(a+c*u).toFixed(0),b+h*u)}function vr(n,t,i){return{start:n,stop:t,color:i}}function c(n,t){var u=Math.floor(Math.log10(n)),r=n/Math.pow(10,u),i;return i=t?1.5>r?1:3>r?2:7>r?5:10:1<r?2<r?5<r?10:5:2:1,i*Math.pow(10,u)}function s(n,t,i,r,u,f){var e=t+r,o=i+u;n.beginPath(),n.moveTo(t+f,i),n.lineTo(e-f,i),n.quadraticCurveTo(e,i,e,i+f),n.lineTo(e,i+u-f),n.quadraticCurveTo(e,o,e-f,o),n.lineTo(t+f,o),n.quadraticCurveTo(t,o,t,o-f),n.lineTo(t,i+f),n.quadraticCurveTo(t,i,t+f,i),n.closePath(),n.stroke()}function t(n,t){var i=r.createElement(\"canvas\");return i.width=n,i.height=t,i}function ii(n,t,i){var u=r.createElement(\"canvas\");return u.width=n,u.height=t,i(u.getContext(\"2d\")),u}function ft(n){var t,i=ii(1,1,function(t){t.fillStyle=n,t.beginPath(),t.rect(0,0,1,1),t.fill()});return t=i.getContext(\"2d\").getImageData(0,0,2,2).data,[t[0],t[1],t[2],t[3]]}function wt(t){var o,e,f,s,u,r=ft(t),i=new n(r[0],r[1],r[2],r[3]);return o=si(i,.32),e=si(i,.62),f=ti(i,.84),s=ti(i,.94),u=ti(i,1),new b(o,e,i,f,s,u)}function ar(n,t,i){var e,r,f,o,s,u;n/=255,t/=255,i/=255,r=Math.max(n,t,i),e=Math.min(n,t,i),s=(r+e)/2;if(r===e)f=o=0;else{u=r-e,o=s>.5?u/(2-r-e):u/(r+e);switch(r){case n:f=(t-i)/u+(t<i?6:0);break;case t:f=(i-n)/u+2;break;case i:f=(n-t)/u+4}f/=6}return[f,o,s]}function vt(n,t,i){var f,u,r,c=Math.floor(n*6),h=n*6-c,e=i*(1-t),o=i*(1-h*t),s=i*(1-(1-h)*t);switch(c%6){case 0:f=i,u=s,r=e;break;case 1:f=o,u=i,r=e;break;case 2:f=e,u=i,r=s;break;case 3:f=e,u=o,r=i;break;case 4:f=s,u=e,r=i;break;case 5:f=i,u=e,r=o}return[Math.floor(f*255),Math.floor(u*255),Math.floor(r*255)]}function st(n,t,i){var e,r,u,o,s,f;n=n/255,t=t/255,i=i/255,r=Math.max(n,t,i),e=Math.min(n,t,i),s=r,f=r-e,o=r===0?0:f/r;if(r===e)u=0;else{switch(r){case n:u=(t-i)/f+(t<i?6:0);break;case t:u=(i-n)/f+2;break;case i:u=(n-t)/f+4}u/=6}return[u,o,s]}function k(n,t){return n<0?0:n>t?t:n}function si(t,i){var f=Math.floor(t.getRed()*(1-i)),u=Math.floor(t.getGreen()*(1-i)),r=Math.floor(t.getBlue()*(1-i));return f=k(f,255),u=k(u,255),r=k(r,255),new n(f,u,r,t.getAlpha())}function ti(t,i){var f=Math.round(t.getRed()*(1+i)),u=Math.round(t.getGreen()*(1+i)),r=Math.round(t.getBlue()*(1+i));return f=k(f,255),u=k(u,255),r=k(r,255),new n(f,u,r,t.getAlpha())}function or(n,t,i){var r,u;if(i<=t)throw\"Rotary bounds are of negative or zero size\";return r=i-t,u=Math.floor((n-t)/r),n-u*r}function ni(n,t){return or(t-n,-180,180)}var r=document,tt=\"LCDMono2Ultra,sans-serif\",ei=function(n,i){i=i||{};var ot=undefined===i.gaugeType?steelseries.GaugeType.TYPE4:i.gaugeType,f=undefined===i.size?200:i.size,h=undefined===i.minValue?0:i.minValue,b=undefined===i.maxValue?h+100:i.maxValue,bf=undefined===i.niceScale?!0:i.niceScale,ti=undefined===i.threshold?(b-h)/2:i.threshold,ii=undefined===i.section?null:i.section,ui=undefined===i.area?null:i.area,lu=undefined===i.titleString?\"\":i.titleString,au=undefined===i.unitString?\"\":i.unitString,hu=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,wu=undefined===i.frameVisible?!0:i.frameVisible,bt=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,bu=undefined===i.backgroundVisible?!0:i.backgroundVisible,pt=undefined===i.pointerType?steelseries.PointerType.TYPE1:i.pointerType,ar=undefined===i.pointerColor?steelseries.ColorDef.RED:i.pointerColor,ee=undefined===i.knobType?steelseries.KnobType.STANDARD_KNOB:i.knobType,fi=undefined===i.knobStyle?steelseries.KnobStyle.SILVER:i.knobStyle,ei=undefined===i.lcdColor?steelseries.LcdColor.STANDARD:i.lcdColor,vr=undefined===i.lcdVisible?!0:i.lcdVisible,eu=undefined===i.lcdDecimals?2:i.lcdDecimals,ye=undefined===i.digitalFont?!1:i.digitalFont,pe=undefined===i.fractionalScaleDecimals?1:i.fractionalScaleDecimals,br=undefined===i.ledColor?steelseries.LedColor.RED_LED:i.ledColor,ru=undefined===i.ledVisible?!0:i.ledVisible,vf=undefined===i.thresholdVisible?!0:i.thresholdVisible,kr=undefined===i.minMeasuredValueVisible?!1:i.minMeasuredValueVisible,dr=undefined===i.maxMeasuredValueVisible?!1:i.maxMeasuredValueVisible,cf=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,af=undefined===i.foregroundVisible?!0:i.foregroundVisible,oe=undefined===i.labelNumberFormat?steelseries.LabelNumberFormat.STANDARD:i.labelNumberFormat,yr=undefined===i.playAlarm?!1:i.playAlarm,uf=undefined===i.alarmSound?!1:i.alarmSound,fe=undefined===i.customLayer?null:i.customLayer,le=undefined===i.tickLabelOrientation?ot===steelseries.GaugeType.TYPE1?steelseries.TickLabelOrientation.TANGENT:steelseries.TickLabelOrientation.NORMAL:i.tickLabelOrientation,wr=undefined===i.trendVisible?!1:i.trendVisible,hr=undefined===i.trendColors?[steelseries.LedColor.RED_LED,steelseries.LedColor.GREEN_LED,steelseries.LedColor.CYAN_LED]:i.trendColors,sr=undefined===i.useOdometer?!1:i.useOdometer,wt=undefined===i.odometerParams?{}:i.odometerParams,wf=undefined===i.odometerUseValue?!1:i.odometerUseValue,ki;yr&&uf!==!1&&(ki=r.createElement(\"audio\"),ki.setAttribute(\"src\",uf),ki.setAttribute(\"preload\",\"auto\"));var l=h,or=h,yf=this,ri=b,ni=h,ht=!1,ef=0,we,of=steelseries.TrendState.OFF,lr=f*.06,cr=f*.29,er=f*.36,ci,et,gi,at,lt,rr=et+(l-h)*lt,u=r.getElementById(n).getContext(\"2d\");u.save(),u.clearRect(0,0,u.canvas.width,u.canvas.height),u.canvas.width=f,u.canvas.height=f;var s=f,k=f,g=s/2,it=k/2,pf=.6*s,ne=.4*k,pr=Math.floor(s/10),ce=pr+\"px sans-serif\",ae=pr+\"px \"+tt,hf=k*.13,bi=s*.4,sf=(s-bi)/2,rf=k*.57,tf,ve=k*.61,st=Math.PI/2,ue=Math.PI/180,ff=!1,ir=h,nr=b,ai=b-h,yt=nr-ir,fr=0,vt=0,oi=10,lf=10,re=function(){bf?(ai=c(b-h,!1),vt=c(ai/(lf-1),!0),ir=Math.floor(h/vt)*vt,nr=Math.ceil(b/vt)*vt,fr=c(vt/(oi-1),!0),h=ir,b=nr,yt=b-h):(ai=b-h,ir=h,nr=b,yt=ai,vt=c(ai/(lf-1),!0),fr=c(vt/(oi-1),!0));switch(ot.type){case\"type1\":ci=0,et=Math.PI,gi=st,at=st,lt=at/yt;break;case\"type2\":ci=0,et=Math.PI,gi=st,at=Math.PI,lt=at/yt;break;case\"type3\":ci=0,et=st,gi=0,at=1.5*Math.PI,lt=at/yt;break;case\"type4\":default:ci=60*ue,et=st+ci/2,gi=0,at=2*Math.PI-ci,lt=at/yt}rr=et+(l-h)*lt},wi=t(f,f),nf=wi.getContext(\"2d\"),di=t(f,f),ut=di.getContext(\"2d\"),fu,hi=t(f*.093457,f*.093457),uu=hi.getContext(\"2d\"),gt=t(f*.093457,f*.093457),nu=gt.getContext(\"2d\"),si=gt,iu=t(Math.ceil(f*.028037),Math.ceil(f*.028037)),se=iu.getContext(\"2d\"),gr=t(Math.ceil(f*.028037),Math.ceil(f*.028037)),he=gr.getContext(\"2d\"),vi=t(f,f),tu=vi.getContext(\"2d\"),yi=t(f,f),ou=yi.getContext(\"2d\"),pi=t(f,f),kt=pi.getContext(\"2d\"),li=t(f,f),pu=li.getContext(\"2d\"),gu,du,ku,yu,cu,tr,su;sr&&vr&&(tr=t(10,10),su=tr.getContext(\"2d\"));var kf=function(n){u.save(),u.textAlign=\"right\",u.strokeStyle=ei.textColor,u.fillStyle=ei.textColor,(ei===steelseries.LcdColor.STANDARD||ei===steelseries.LcdColor.STANDARD_GREEN)&&(u.shadowColor=\"gray\",u.shadowOffsetX=s*.007,u.shadowOffsetY=s*.007,u.shadowBlur=s*.007),u.font=ye?ae:ce,u.fillText(n.toFixed(eu),sf+bi-bi*.05,rf+hf*.5+pr*.38,bi*.9),u.restore()},te=function(n){n.save(),\"type1\"===ot.type&&n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.523364,k*.130841),(\"type1\"===ot.type||\"type2\"===ot.type)&&n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.130841,k*.514018),(\"type2\"===ot.type||\"type3\"===ot.type)&&n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.831775,k*.514018),\"type3\"===ot.type&&n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.523364,k*.831775),\"type4\"===ot.type&&(n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.336448,k*.803738),n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.626168,k*.803738)),n.restore()},ie=function(){var t=r.createElement(\"canvas\"),n,i;return t.width=Math.ceil(f*.046728),t.height=Math.ceil(t.width*.9),n=t.getContext(\"2d\"),n.save(),i=n.createLinearGradient(0,.1,0,t.height*.9),i.addColorStop(0,\"#520000\"),i.addColorStop(.3,\"#fc1d00\"),i.addColorStop(.59,\"#fc1d00\"),i.addColorStop(1,\"#520000\"),n.fillStyle=i,n.beginPath(),n.moveTo(t.width*.5,.1),n.lineTo(t.width*.9,t.height*.9),n.lineTo(t.width*.1,t.height*.9),n.lineTo(t.width*.5,.1),n.closePath(),n.fill(),n.strokeStyle=\"#FFFFFF\",n.stroke(),n.restore(),t},vu=function(n,t,i,r,u){t<h?t=h:t>b&&(t=b),i<h?i=h:i>b&&(i=b);if(t>=i)return;n.save(),n.strokeStyle=r,n.fillStyle=r,n.lineWidth=s*.035;var f=at/yt*t-at/yt*h,e=f+(i-t)/(yt/at);n.translate(g,it),n.rotate(et),n.beginPath(),u?(n.moveTo(0,0),n.arc(0,0,s*.365-n.lineWidth/2,f,e,!1)):n.arc(0,0,s*.365,f,e,!1),u?(n.moveTo(0,0),n.fill()):n.stroke(),n.translate(-g,-it),n.restore()},df=function(n,t){var y,v,a,c;bt.labelColor.setAlpha(1),n.save(),n.textAlign=\"center\",n.textBaseline=\"middle\",y=Math.ceil(s*.04),n.font=y+\"px sans-serif\",n.strokeStyle=bt.labelColor.getRgbaColor(),n.fillStyle=bt.labelColor.getRgbaColor(),n.translate(g,it),n.rotate(et);var o=et,i=lt*fr,r,e=h,u=oi-1,l=s*.38,w=s*.35,d=s*.355,k=s*.36,p=s*.3,f=s*.1;for((ot.type===\"type1\"||ot.type===\"type2\")&&(f=s*.035),v=oi/2,a=parseFloat(b.toFixed(2)),c=h;parseFloat(c.toFixed(2))<=a;c+=fr){r=i+st,u++;if(u===oi){n.lineWidth=1.5,n.beginPath(),n.moveTo(l,0),n.lineTo(w,0),n.closePath(),n.stroke(),n.save(),n.translate(p,0);switch(le.type){case\"horizontal\":r=-o;break;case\"tangent\":r=o<=st+Math.PI?Math.PI:0;break;case\"normal\":default:r=st}n.rotate(r);switch(t.format){case\"fractional\":n.fillText(e.toFixed(pe),0,0,f);break;case\"scientific\":n.fillText(e.toPrecision(2),0,0,f);break;case\"standard\":default:n.fillText(e.toFixed(0),0,0,f)}n.translate(-p,0),n.restore(),e+=vt,u=0,n.rotate(i),o+=i;continue}0==oi%2&&u===v?(n.lineWidth=1,n.beginPath(),n.moveTo(l,0),n.lineTo(d,0),n.closePath(),n.stroke()):(n.lineWidth=.5,n.beginPath(),n.moveTo(l,0),n.lineTo(k,0),n.closePath(),n.stroke()),n.rotate(i),o+=i}n.translate(-g,-it),n.restore()},ft=function(n){var t,i,u;n=n||{};var c=undefined===n.frame?!1:n.frame,r=undefined===n.background?!1:n.background,e=undefined===n.led?!1:n.led,tt=undefined===n.pointer?!1:n.pointer,b=undefined===n.foreground?!1:n.foreground,ft=undefined===n.trend?!1:n.trend,ht=undefined===n.odo?!1:n.odo;ff=!0,re(),c&&wu&&v(nf,hu,g,it,s,k),r&&bu&&(w(ut,bt,g,it,s,k),rt(ut,fe,g,it,s,k)),e&&(uu.drawImage(o(Math.ceil(f*.093457),1,br),0,0),nu.drawImage(o(Math.ceil(f*.093457),0,br),0,0)),kr&&se.drawImage(a(Math.ceil(f*.028037),steelseries.ColorDef.BLUE.dark.getRgbaColor(),!0,!0),0,0),dr&&he.drawImage(a(Math.ceil(f*.028037),steelseries.ColorDef.RED.medium.getRgbaColor(),!0),0,0);if(r&&bu){te(ut);if(null!==ii&&0<ii.length){t=ii.length;do t--,vu(ut,ii[t].start,ii[t].stop,ii[t].color,!1);while(0<t)}if(null!==ui&&0<ui.length){i=ui.length;do i--,vu(ut,ui[i].start,ui[i].stop,ui[i].color,!0);while(0<i)}df(ut,oe),ct(ut,s,k,lu,au,bt,!0,!0)}r&&vf&&(ut.save(),ut.translate(g,it),ut.rotate(et+(ti-h)*lt+st),ut.translate(-g,-it),ut.drawImage(ie(),s*.475,k*.13),ut.translate(g,it),ut.restore()),r&&vr&&(sr&&ht?(cu=new steelseries.Odometer(\"\",{_context:su,height:f*.075,decimals:wt.decimals,digits:wt.digits===undefined?5:wt.digits,valueForeColor:wt.valueForeColor,valueBackColor:wt.valueBackColor,decimalForeColor:wt.decimalForeColor,decimalBackColor:wt.decimalBackColor,font:wt.font,value:l}),tf=(s-tr.width)/2):sr||(fu=p(bi,hf,ei),ut.drawImage(fu,sf,rf))),tt&&(nt(tu,s,pt,ar,bt.labelColor,!1),nt(ou,s,pt,ar,bt.labelColor,!0)),b&&af&&(u=pt.type===\"type15\"||pt.type===\"type16\"?!1:!0,y(pu,cf,s,k,u,ee,fi,ot)),ft&&wr&&(gu=d(lr,steelseries.TrendState.UP,hr),du=d(lr,steelseries.TrendState.STEADY,hr),ku=d(lr,steelseries.TrendState.DOWN,hr),yu=d(lr,steelseries.TrendState.OFF,hr))},dt=function(n){n=n||{};var u=undefined===n.frame?!1:n.frame,e=undefined===n.background?!1:n.background,r=undefined===n.led?!1:n.led,t=undefined===n.pointer?!1:n.pointer,i=undefined===n.foreground?!1:n.foreground;u&&(wi.width=f,wi.height=f,nf=wi.getContext(\"2d\")),e&&(di.width=f,di.height=f,ut=di.getContext(\"2d\")),r&&(hi.width=Math.ceil(f*.093457),hi.height=Math.ceil(f*.093457),uu=hi.getContext(\"2d\"),gt.width=Math.ceil(f*.093457),gt.height=Math.ceil(f*.093457),nu=gt.getContext(\"2d\"),si=gt),t&&(vi.width=f,vi.height=f,tu=vi.getContext(\"2d\"),yi.width=f,yi.height=f,ou=yi.getContext(\"2d\"),pi.width=f,pi.height=f,kt=pi.getContext(\"2d\")),i&&(li.width=f,li.height=f,pu=li.getContext(\"2d\"))},gf=function(){ru&&(si=si===hi?gt:hi,yf.repaint())},ur=function(n){n?ef=setInterval(gf,1e3):clearInterval(ef)};return this.setValue=function(n){var t=n<h?h:n>b?b:n;l!==t&&(l=t,l>ni&&(ni=l),l<ri&&(ri=l),l<ti||ht?l<ti&&(ht=!1,ur(ht),yr&&ki.pause()):(ht=!0,ur(ht),yr&&ki.play()),this.repaint())},this.getValue=function(){return l},this.setOdoValue=function(n){var t=n<0?0:n;or!==t&&(or=t,this.repaint())},this.getOdoValue=function(){return or},this.setValueAnimated=function(n){var r=n<h?h:n>b?b:n,t,i;l!==r&&(undefined!==t&&t.playing&&t.stop(),t=new Tween({},\"\",Tween.regularEaseInOut,l,r,1),i=this,t.onMotionChanged=function(n){l=n.target._pos,l<ti||ht?l<ti&&(ht=!1,ur(ht)):(ht=!0,ur(ht)),l>ni&&(ni=l),l<ri&&(ri=l),i.repaint()},t.start())},this.resetMinMeasuredValue=function(){ri=l,this.repaint()},this.resetMaxMeasuredValue=function(){ni=l,this.repaint()},this.setMinMeasuredValueVisible=function(n){kr=n,this.repaint()},this.setMaxMeasuredValueVisible=function(n){dr=n,this.repaint()},this.setMaxMeasuredValue=function(n){var t=n<h?h:n>b?b:n;ni=t,this.repaint()},this.setMinMeasuredValue=function(n){var t=n<h?h:n>b?b:n;ri=t,this.repaint()},this.setTitleString=function(n){lu=n,ft({background:!0}),this.repaint()},this.setUnitString=function(n){au=n,ft({background:!0}),this.repaint()},this.setMinValue=function(n){h=n,ft({frame:!0,background:!0}),this.repaint()},this.getMinValue=function(){return h},this.setMaxValue=function(n){b=n,ft({frame:!0,background:!0}),this.repaint()},this.getMaxValue=function(){return b},this.setThreshold=function(n){var t=n<h?h:n>b?b:n;ti=t,ft({background:!0}),this.repaint()},this.setArea=function(n){ui=n,dt({foreground:!0}),ft({background:!0,foreground:!0}),this.repaint()},this.setSection=function(n){ii=n,dt({foreground:!0}),ft({background:!0,foreground:!0}),this.repaint()},this.setThresholdVisible=function(n){vf=n,this.repaint()},this.setLcdDecimals=function(n){eu=n,this.repaint()},this.setFrameDesign=function(n){dt({frame:!0}),hu=n,ft({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){dt({background:!0,pointer:pt.type===\"type2\"||pt.type===\"type13\"?!0:!1}),bt=n,ft({background:!0,pointer:pt.type===\"type2\"||pt.type===\"type13\"?!0:!1}),this.repaint()},this.setForegroundType=function(n){dt({foreground:!0}),cf=n,ft({foreground:!0}),this.repaint()},this.setPointerType=function(n){dt({pointer:!0,foreground:!0}),pt=n,ft({pointer:!0,foreground:!0}),this.repaint()},this.setPointerColor=function(n){dt({pointer:!0}),ar=n,ft({pointer:!0}),this.repaint()},this.setLedColor=function(n){dt({led:!0}),br=n,ft({led:!0}),this.repaint()},this.setLcdColor=function(n){ei=n,ft({background:!0}),this.repaint()},this.setTrend=function(n){of=n,this.repaint()},this.setTrendVisible=function(n){wr=n,this.repaint()},this.repaint=function(){ff||ft({frame:!0,background:!0,led:!0,pointer:!0,trend:!0,foreground:!0,odo:!0}),u.clearRect(0,0,u.canvas.width,u.canvas.height),wu&&u.drawImage(wi,0,0),u.drawImage(di,0,0),vr&&(sr?(cu.setValue(wf?l:or),u.drawImage(tr,tf,ve)):kf(l)),ru&&(l<ti&&(ht=!1,si=gt),u.drawImage(si,pf,ne));if(wr)switch(of.state){case\"up\":u.drawImage(gu,cr,er);break;case\"steady\":u.drawImage(du,cr,er);break;case\"down\":u.drawImage(ku,cr,er);break;case\"off\":u.drawImage(yu,cr,er)}kr&&(u.save(),u.translate(g,it),u.rotate(et+st+(ri-h)*lt),u.translate(-g,-it),u.drawImage(iu,u.canvas.width*.4865,u.canvas.height*.105),u.restore()),dr&&(u.save(),u.translate(g,it),u.rotate(et+st+(ni-h)*lt),u.translate(-g,-it),u.drawImage(gr,u.canvas.width*.4865,u.canvas.height*.105),u.restore()),rr=et+st+(l-h)*lt;var n=s*.006;kt.clearRect(0,0,s,k),kt.save(),kt.translate(g,it),kt.rotate(rr),kt.translate(-g,-it),kt.drawImage(yi,0,0),kt.restore(),u.drawImage(pi,0,0,s,k,n,n,s+n,k+n),u.save(),u.translate(g,it),u.rotate(rr),u.translate(-g,-it),u.drawImage(vi,0,0),u.restore(),af&&u.drawImage(li,0,0)},this.repaint(),this},wi=function(n,i){var yi;i=i||{};var dt=undefined===i.gaugeType?steelseries.GaugeType.TYPE4:i.gaugeType,s=undefined===i.size?200:i.size,f=undefined===i.minValue?0:i.minValue,h=undefined===i.maxValue?f+100:i.maxValue,cf=undefined===i.niceScale?!0:i.niceScale,fi=undefined===i.threshold?(h-f)/2:i.threshold,bt=undefined===i.section?null:i.section,uu=undefined===i.useSectionColors?!1:i.useSectionColors,su=undefined===i.titleString?\"\":i.titleString,lu=undefined===i.unitString?\"\":i.unitString,bu=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,yu=undefined===i.frameVisible?!0:i.frameVisible,ei=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,ou=undefined===i.backgroundVisible?!0:i.backgroundVisible,ur=undefined===i.valueColor?steelseries.ColorDef.RED:i.valueColor,ni=undefined===i.lcdColor?steelseries.LcdColor.STANDARD:i.lcdColor,au=undefined===i.lcdVisible?!0:i.lcdVisible,of=undefined===i.lcdDecimals?2:i.lcdDecimals,nf=undefined===i.digitalFont?!1:i.digitalFont,tf=undefined===i.fractionalScaleDecimals?1:i.fractionalScaleDecimals,wf=undefined===i.customLayer?null:i.customLayer,sr=undefined===i.ledColor?steelseries.LedColor.RED_LED:i.ledColor,ku=undefined===i.ledVisible?!0:i.ledVisible,pf=undefined===i.labelNumberFormat?steelseries.LabelNumberFormat.STANDARD:i.labelNumberFormat,fu=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,cu=undefined===i.foregroundVisible?!0:i.foregroundVisible,er=undefined===i.playAlarm?!1:i.playAlarm,eu=undefined===i.alarmSound?!1:i.alarmSound,vi=undefined===i.valueGradient?null:i.valueGradient,bf=undefined===i.useValueGradient?!1:i.useValueGradient,df=undefined===i.tickLabelOrientation?dt===steelseries.GaugeType.TYPE1?steelseries.TickLabelOrientation.TANGENT:steelseries.TickLabelOrientation.NORMAL:i.tickLabelOrientation,ar=undefined===i.trendVisible?!1:i.trendVisible,gi=undefined===i.trendColors?[steelseries.LedColor.RED_LED,steelseries.LedColor.GREEN_LED,steelseries.LedColor.CYAN_LED]:i.trendColors;er&&eu!==!1&&(yi=r.createElement(\"audio\"),yi.setAttribute(\"src\",eu),yi.setAttribute(\"preload\",\"auto\"));var it=f,et=h-f,ot=!1,hu=0,ti,kf=this,ft,b,ui,vt,l,lt,st,ii=[],wi=!1,lr=!1,u=r.getElementById(n).getContext(\"2d\");u.clearRect(0,0,u.canvas.width,u.canvas.height),u.canvas.width=s,u.canvas.height=s;var e=s,ut=s,k=e/2,g=ut/2,cr=Math.floor(e/10),hf=cr+\"px sans-serif\",lf=cr+\"px \"+tt,or=ut*.13,oi=e*.4,du=(e-oi)/2,gu=ut/2-or/2,nt=Math.PI/2,vf=e*.116822,af=e*.485981,pt=Math.ceil(s*.093457),vu=e*.53,wu=ut*.61,kt=Math.PI/180,pu=steelseries.TrendState.OFF,bi=s*.06,ki=s*.38,rr=s*.57;switch(dt.type){case\"type1\":ft=0,b=Math.PI,ui=0,vt=nt,l=nt,lt=l/Math.PI*180,st=l/et;break;case\"type2\":ft=0,b=Math.PI,ui=0,vt=nt,l=Math.PI,lt=l/Math.PI*180,st=l/et;break;case\"type3\":ft=0,b=nt,ui=-nt,vt=0,l=1.5*Math.PI,lt=l/Math.PI*180,st=l/et;break;case\"type4\":default:ft=Math.PI/3,b=nt+ft/2,ui=Math.PI/-3,vt=0,l=2*Math.PI-ft,lt=l/Math.PI*180,st=l/et}var hi=t(s,s),pr=hi.getContext(\"2d\"),ai=t(s,s),at=ai.getContext(\"2d\"),ru,li=t(Math.ceil(s*.060747),Math.ceil(s*.023364)),hr=li.getContext(\"2d\"),ri=t(pt,pt),tu=ri.getContext(\"2d\"),yt=t(pt,pt),gr=yt.getContext(\"2d\"),gt=yt,yf,si=t(s,s),wr=si.getContext(\"2d\"),br,kr,iu,dr,nu=!1,nr=f,tr=h,ci=h-f;et=tr-nr;var di=0,ht=0,fr=10,vr=10,ef=function(){cf?(ci=c(h-f,!1),ht=c(ci/(vr-1),!0),nr=Math.floor(f/ht)*ht,tr=Math.ceil(h/ht)*ht,di=c(ht/(fr-1),!0),f=nr,h=tr,et=h-f):(ci=h-f,nr=f,tr=h,et=ci,ht=c(ci/(vr-1),!0),di=c(ht/(fr-1),!0));switch(dt.type){case\"type1\":ft=0,b=Math.PI,vt=nt,l=nt,st=l/et;break;case\"type2\":ft=0,b=Math.PI,vt=nt,l=Math.PI,st=l/et;break;case\"type3\":ft=0,b=nt,vt=0,l=1.5*Math.PI,st=l/et;break;case\"type4\":default:ft=60*kt,b=nt+ft/2,vt=0,l=2*Math.PI-ft,st=l/et}angle=b+(it-f)*st},a=function(n){var t;n=n||{};var c=undefined===n.frame?!1:n.frame,i=undefined===n.background?!1:n.background,u=undefined===n.led?!1:n.led,l=undefined===n.value?!1:n.value,s=undefined===n.foreground?!1:n.foreground,r=undefined===n.trend?!1:n.trend;nu=!0,ef(),c&&yu&&v(pr,bu,k,g,e,ut),i&&ou&&(w(at,ei,k,g,e,ut),rt(at,wf,k,g,e,ut)),u&&(tu.drawImage(o(pt,1,sr),0,0),gr.drawImage(o(pt,0,sr),0,0),yf=at.getImageData(vu,wu,pt,pt)),i&&sf(at),i&&ou&&(uf(at,pf),ct(at,e,ut,su,lu,ei,!0,!0)),i&&au&&(ru=p(oi,or,ni),at.drawImage(ru,du,gu)),wi=!1;if(uu&&null!==bt&&0<bt.length){wi=!0,t=bt.length,ii=[];do t--,ii.push({start:(bt[t].start+Math.abs(f))/(h-f)*lt,stop:(bt[t].stop+Math.abs(f))/(h-f)*lt,color:wt(bt[t].color)});while(0<t)}lr=!1,bf&&vi!==null&&(wi=!1,lr=!0),l&&yr(hr,ur),s&&cu&&y(wr,fu,e,ut,!1,dt),r&&ar&&(br=d(bi,steelseries.TrendState.UP,gi),kr=d(bi,steelseries.TrendState.STEADY,gi),iu=d(bi,steelseries.TrendState.DOWN,gi),dr=d(bi,steelseries.TrendState.OFF,gi))},pi=function(n){n=n||{};var u=undefined===n.frame?!1:n.frame,f=undefined===n.background?!1:n.background,r=undefined===n.led?!1:n.led,t=undefined===n.value?!1:n.value,i=undefined===n.foreground?!1:n.foreground;u&&(hi.width=s,hi.height=s,pr=hi.getContext(\"2d\")),f&&(ai.width=s,ai.height=s,at=ai.getContext(\"2d\")),t&&(li.width=Math.ceil(s*.060747),li.height=Math.ceil(s*.023364),hr=li.getContext(\"2d\")),r&&(ri.width=Math.ceil(s*.093457),ri.height=Math.ceil(s*.093457),tu=ri.getContext(\"2d\"),yt.width=Math.ceil(s*.093457),yt.height=Math.ceil(s*.093457),gr=yt.getContext(\"2d\"),gt=yt),i&&(si.width=s,si.height=s,wr=si.getContext(\"2d\"))},sf=function(n){var t,r,i;n.save(),n.save(),n.lineWidth=s*.085,n.beginPath(),n.translate(k,g),n.rotate(b-4*kt),n.translate(-k,-g),n.arc(k,g,e*.35514,0,l+8*kt,!1),n.rotate(-b),t=n.createLinearGradient(0,.107476*ut,0,.897195*ut),t.addColorStop(0,\"#000000\"),t.addColorStop(.22,\"#333333\"),t.addColorStop(.76,\"#333333\"),t.addColorStop(1,\"#cccccc\"),n.strokeStyle=t,n.stroke(),n.restore(),n.save(),n.lineWidth=s*.075,n.beginPath(),n.translate(k,g),n.rotate(b-4*kt),n.translate(-k,-g),n.arc(k,g,e*.35514,0,l+8*kt,!1),n.rotate(-b),r=n.createLinearGradient(0,.112149*ut,0,.892523*ut),r.addColorStop(0,\"#111111\"),r.addColorStop(1,\"#333333\"),n.strokeStyle=r,n.stroke(),n.restore();var f=(e*.116822+e*.060747)/2,o=(e*.485981+e*.023364)/2,u=n.createRadialGradient(f,o,0,f,o,.030373*e);for(u.addColorStop(0,\"#3c3c3c\"),u.addColorStop(1,\"#323232\"),i=0,i=0;i<=lt;i+=5)n.save(),n.translate(k,g),n.rotate(i*kt+ui),n.translate(-k,-g),n.beginPath(),n.rect(e*.116822,e*.485981,e*.060747,e*.023364),n.closePath(),n.fillStyle=u,n.fill(),n.restore();n.restore()},yr=function(n,t){n.save(),n.beginPath(),n.rect(0,0,n.canvas.width,n.canvas.height),n.closePath();var r=n.canvas.width/2,f=n.canvas.height/2,i=u.createRadialGradient(r,f,0,r,f,n.canvas.width/2);i.addColorStop(0,t.light.getRgbaColor()),i.addColorStop(1,t.dark.getRgbaColor()),n.fillStyle=i,n.fill(),n.restore()},rf=function(n){u.save(),u.textAlign=\"right\",u.strokeStyle=ni.textColor,u.fillStyle=ni.textColor,(ni===steelseries.LcdColor.STANDARD||ni===steelseries.LcdColor.STANDARD_GREEN)&&(u.shadowColor=\"gray\",u.shadowOffsetX=e*.007,u.shadowOffsetY=e*.007,u.shadowBlur=e*.007),u.font=nf?lf:hf,u.fillText(n.toFixed(of),du+oi-oi*.05,gu+or*.5+cr*.38,oi*.9),u.restore()},uf=function(n,t){var a,v,c;ei.labelColor.setAlpha(1),n.save(),n.textAlign=\"center\",n.textBaseline=\"middle\",a=Math.ceil(e*.04),n.font=a+\"px sans-serif\",n.strokeStyle=ei.labelColor.getRgbaColor(),n.fillStyle=ei.labelColor.getRgbaColor(),n.translate(k,g),n.rotate(b);var s=b,i=st*di,r,u=f,l=fr-1,y=e*.28,o=e*.1;for((dt.type===\"type1\"||dt.type===\"type2\")&&(o=e*.0375),v=parseFloat(h.toFixed(2)),c=f;parseFloat(c.toFixed(2))<=v;c+=di){r=+i+nt,l++;if(l===fr){n.save(),n.translate(y,0);switch(df.type){case\"horizontal\":r=-s;break;case\"tangent\":r=s<=nt+Math.PI?Math.PI:0;break;case\"normal\":default:r=nt}n.rotate(r);switch(t.format){case\"fractional\":n.fillText(u.toFixed(tf),0,0,o);break;case\"scientific\":n.fillText(u.toPrecision(2),0,0,o);break;case\"standard\":default:n.fillText(u.toFixed(0),0,0,o)}n.translate(-y,0),n.restore(),u+=ht,l=0,n.rotate(i),s+=i;continue}n.rotate(i),s+=i}n.translate(-k,-g),n.restore()},ir=function(n){n?hu=setInterval(ff,1e3):clearInterval(hu)},ff=function(){ku&&(gt=gt===ri?yt:ri,kf.repaint())};return this.setValue=function(n){var t=n<f?f:n>h?h:n;it!==t&&(it=t,it<fi||ot?it<fi&&(ot=!1,ir(ot),er&&yi.pause()):(ot=!0,ir(ot),er&&yi.play()),this.repaint())},this.getValue=function(){return it},this.setValueAnimated=function(n){var i=n<f?f:n>h?h:n,t;it!==i&&(undefined!==ti&&ti.playing&&ti.stop(),ti=new Tween({},\"\",Tween.regularEaseInOut,it,i,1),t=this,ti.onMotionChanged=function(n){it=n.target._pos,it<fi||ot?it<fi&&(ot=!1,ir(ot)):(ot=!0,ir(ot)),t.repaint()},ti.start())},this.setFrameDesign=function(n){pi({frame:!0}),bu=n,a({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){pi({background:!0,led:!0}),ei=n,a({background:!0,led:!0}),this.repaint()},this.setForegroundType=function(n){pi({foreground:!0}),fu=n,a({foreground:!0}),this.repaint()},this.setValueColor=function(n){pi({value:!0}),ur=n,a({value:!0}),this.repaint()},this.setLedColor=function(n){pi({led:!0}),sr=n,a({led:!0}),this.repaint()},this.setLcdColor=function(n){ni=n,a({background:!0}),this.repaint()},this.setSection=function(n){bt=n,a(),this.repaint()},this.setSectionActive=function(n){uu=n,a(),this.repaint()},this.setGradient=function(n){vi=n,a(),this.repaint()},this.setGradientActive=function(n){useGradient=n,a(),this.repaint()},this.setMinValue=function(n){f=n,a({background:!0}),this.repaint()},this.getMinValue=function(){return f},this.setMaxValue=function(n){h=n,a({background:!0}),this.repaint()},this.getMaxValue=function(){return h},this.setThreshold=function(n){var t=n<f?f:n>h?h:n;fi=t,a({background:!0}),this.repaint()},this.setTitleString=function(n){su=n,a({background:!0}),this.repaint()},this.setUnitString=function(n){lu=n,a({background:!0}),this.repaint()},this.setTrend=function(n){pu=n,this.repaint()},this.setTrendVisible=function(n){ar=n,this.repaint()},this.repaint=function(){var o,i,e,n,t;for(nu||a({frame:!0,background:!0,led:!0,value:!0,trend:!0,foreground:!0}),u.clearRect(0,0,u.canvas.width,u.canvas.height),yu&&u.drawImage(hi,0,0),u.drawImage(ai,0,0),o=(it+Math.abs(f))/(h-f)*lt,e=ur,n=0;n<=o;n+=5){i=ur;if(lr){var s=f+n/lt*(h-f),c=vi.getEnd()-vi.getStart(),r=s/c;r=Math.max(Math.min(r,1),0),i=wt(vi.getColorAt(r).getRgbaColor())}else if(wi)for(t=0;t<ii.length;t++)if(n>=ii[t].start&&n<ii[t].stop){i=ii[t].color;break}e.medium.getHexColor()!==i.medium.getHexColor()&&(yr(hr,i),e=i),u.save(),u.translate(k,g),u.rotate(n*kt+ui),u.translate(-k,-g),u.drawImage(li,vf,af),u.restore()}au&&rf(it),ku&&(it<fi&&(ot=!1,gt=yt),u.drawImage(gt,vu,wu));if(ar)switch(pu.state){case\"up\":u.drawImage(br,ki,rr);break;case\"steady\":u.drawImage(kr,ki,rr);break;case\"down\":u.drawImage(iu,ki,rr);break;case\"off\":u.drawImage(dr,ki,rr)}cu&&u.drawImage(si,0,0)},this.repaint(),this},bi=function(n,i){var hi;i=i||{};var ft=undefined===i.orientation?steelseries.Orientation.NORTH:i.orientation,u=undefined===i.size?200:i.size,l=undefined===i.minValue?0:i.minValue,d=undefined===i.maxValue?l+100:i.maxValue,bu=undefined===i.niceScale?!0:i.niceScale,pt=undefined===i.threshold?(d-l)/2:i.threshold,gt=undefined===i.section?null:i.section,ni=undefined===i.area?null:i.area,gr=undefined===i.titleString?\"\":i.titleString,uu=undefined===i.unitString?\"\":i.unitString,iu=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,ru=undefined===i.frameVisible?!0:i.frameVisible,it=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,yr=undefined===i.backgroundVisible?!0:i.backgroundVisible,ut=undefined===i.pointerType?steelseries.PointerType.TYPE1:i.pointerType,tr=undefined===i.pointerColor?steelseries.ColorDef.RED:i.pointerColor,du=undefined===i.knobType?steelseries.KnobType.STANDARD_KNOB:i.knobType,ci=undefined===i.knobStyle?steelseries.KnobStyle.SILVER:i.knobStyle,ki=undefined===i.ledColor?steelseries.LedColor.RED_LED:i.ledColor,tu=undefined===i.ledVisible?!0:i.ledVisible,vr=undefined===i.thresholdVisible?!0:i.thresholdVisible,gi=undefined===i.minMeasuredValueVisible?!1:i.minMeasuredValueVisible,di=undefined===i.maxMeasuredValueVisible?!1:i.maxMeasuredValueVisible,wr=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,dr=undefined===i.foregroundVisible?!0:i.foregroundVisible,eu=undefined===i.labelNumberFormat?steelseries.LabelNumberFormat.STANDARD:i.labelNumberFormat,nr=undefined===i.playAlarm?!1:i.playAlarm,br=undefined===i.alarmSound?!1:i.alarmSound;nr&&br!==!1&&(hi=r.createElement(\"audio\"),hi.setAttribute(\"src\",br),hi.setAttribute(\"preload\",\"auto\"));var kr=steelseries.GaugeType.TYPE5,wu=this,b=l,vt=d,wt=l,tt=!1,nu=0,dt,ct=Math.PI/2,gu=Math.PI/180,pi=l,wi=d,bi=d-l,at=wi-pi,yi=0,ot=0,oi=10,au=10,lu=0,rt=1.25*Math.PI,vu=1.25*Math.PI,kt=ct,ht=kt/at,pr=!1,ai=rt+(b-l)*ht,f=r.getElementById(n).getContext(\"2d\");f.clearRect(0,0,f.canvas.width,f.canvas.height),f.canvas.width=u,f.canvas.height=u;var h=u,k=u,s=h/2,g=k*.733644,pu=.455*h,yu=.51*k,ku=function(){bu?(bi=c(d-l,!1),ot=c(bi/(au-1),!0),pi=Math.floor(l/ot)*ot,wi=Math.ceil(d/ot)*ot,yi=c(ot/(oi-1),!0),l=pi,d=wi,at=d-l):(bi=d-l,pi=l,wi=d,at=bi,yi=1,ot=10),lu=0,rt=1.25*Math.PI,vu=1.25*Math.PI,kt=ct,ht=kt/at,ai=rt+(b-l)*ht},ui=t(u,u),fr=ui.getContext(\"2d\"),ri=t(u,u),p=ri.getContext(\"2d\"),ii=t(u*.093457,u*.093457),cr=ii.getContext(\"2d\"),st=t(u*.093457,u*.093457),ar=st.getContext(\"2d\"),bt=st,hr=t(Math.ceil(u*.028037),Math.ceil(u*.028037)),or=hr.getContext(\"2d\"),er=t(Math.ceil(u*.028037),Math.ceil(u*.028037)),rr=er.getContext(\"2d\"),fi=t(u,u),sr=fi.getContext(\"2d\"),li=t(u,u),lr=li.getContext(\"2d\"),yt=t(u,u),et=yt.getContext(\"2d\"),si=t(u,u),ir=si.getContext(\"2d\"),cu=function(n){\"type5\"===kr.type&&(n.save(),ft.type===\"west\"?(n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,ci),h*.44,k*.8),n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,ci),h*.44,k*.16)):(n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,ci),h*.2-k*.037383,k*.446666),n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,ci),h*.8,k*.446666)),n.restore())},hu=function(){var t=r.createElement(\"canvas\"),n,i;return t.width=Math.ceil(u*.046728),t.height=Math.ceil(t.width*.9),n=t.getContext(\"2d\"),n.save(),i=n.createLinearGradient(0,.1,0,t.height*.9),i.addColorStop(0,\"#520000\"),i.addColorStop(.3,\"#fc1d00\"),i.addColorStop(.59,\"#fc1d00\"),i.addColorStop(1,\"#520000\"),n.fillStyle=i,n.beginPath(),n.moveTo(t.width*.5,.1),n.lineTo(t.width*.9,t.height*.9),n.lineTo(t.width*.1,t.height*.9),n.lineTo(t.width*.5,.1),n.closePath(),n.fill(),n.strokeStyle=\"#FFFFFF\",n.stroke(),n.restore(),t},ur=function(n,t,i,r,u){n.save(),n.strokeStyle=r,n.fillStyle=r,n.lineWidth=h*.035;var f=kt/at*t-kt/at*l,e=f+(i-t)/(at/kt);n.translate(s,g),n.rotate(rt),n.beginPath(),u?(n.moveTo(0,0),n.arc(0,0,h*.365-n.lineWidth/2,f,e,!1)):n.arc(0,0,h*.365,f,e,!1),u?(n.moveTo(0,0),n.fill()):n.stroke(),n.translate(-s,-g),n.restore()},ou=function(n){var r,i,t;n.save(),n.textAlign=\"left\",n.textBaseline=\"middle\",n.strokeStyle=it.labelColor.getRgbaColor(),n.fillStyle=it.labelColor.getRgbaColor(),r=h,ei||vertical||(r=k),n.font=.046728*h+\"px sans-serif\",i=n.measureText(gr).width,n.fillText(gr,(h-i)/2,k*.4,h*.3),t=n.measureText(uu).width,n.fillText(uu,(h-t)/2,k*.47,h*.2),n.restore()},su=function(n,t){var a;it.labelColor.setAlpha(1),n.save(),steelseries.Orientation.WEST===ft&&(n.translate(s,s),n.rotate(-Math.PI/2),n.translate(-s,-s)),n.textAlign=\"center\",n.textBaseline=\"middle\",a=Math.ceil(h*.04),n.font=a+\"px sans-serif\",n.strokeStyle=it.labelColor.getRgbaColor(),n.fillStyle=it.labelColor.getRgbaColor(),n.translate(s,g),n.rotate(rt);for(var o=ht*yi,v,i=l,r=oi-1,e=h*.44,k=h*.41,b=h*.415,p=h*.42,c=h*.48,u=h*.0375,w=oi/2,y=parseFloat(d.toFixed(2)),f=l;parseFloat(f.toFixed(2))<=y;f+=yi){v=+o+ct,r++;if(r===oi){n.lineWidth=1.5,n.beginPath(),n.moveTo(e,0),n.lineTo(k,0),n.closePath(),n.stroke(),n.save(),n.translate(c,0),n.rotate(v);switch(t.format){case\"fractional\":n.fillText(i.toFixed(2),0,0,u);break;case\"scientific\":n.fillText(i.toPrecision(2),0,0,u);break;case\"standard\":default:n.fillText(i.toFixed(0),0,0,u)}n.translate(-c,0),n.restore(),i+=ot,r=0,n.rotate(o);continue}0==oi%2&&r===w?(n.lineWidth=1,n.beginPath(),n.moveTo(e,0),n.lineTo(b,0),n.closePath(),n.stroke()):(n.lineWidth=.5,n.beginPath(),n.moveTo(e,0),n.lineTo(p,0),n.closePath(),n.stroke()),n.rotate(o)}n.translate(-s,-g),n.restore()},lt=function(n){var t,i,r;n=n||{};var e=undefined===n.frame?!1:n.frame,f=undefined===n.background?!1:n.background,d=undefined===n.led?!1:n.led,c=undefined===n.pointer?!1:n.pointer,b=undefined===n.foreground?!1:n.foreground;pr=!0,ku(),e&&ru&&v(fr,iu,s,u/2,h,k),f&&yr&&w(p,it,s,u/2,h,k),d&&(cr.drawImage(o(Math.ceil(u*.093457),1,ki),0,0),ar.drawImage(o(Math.ceil(u*.093457),0,ki),0,0)),gi&&(or.drawImage(a(Math.ceil(u*.028037),steelseries.ColorDef.BLUE.dark.getRgbaColor(),!0,!0),0,0),or.restore()),di&&(rr.drawImage(a(Math.ceil(u*.028037),steelseries.ColorDef.RED.medium.getRgbaColor(),!0),0,0),rr.restore());if(f&&yr){cu(p);if(null!==gt&&0<gt.length){p.save(),steelseries.Orientation.WEST===ft&&(p.translate(s,s),p.rotate(-Math.PI/2),p.translate(-s,-s)),t=gt.length;do t--,ur(p,gt[t].start,gt[t].stop,gt[t].color,!1);while(0<t);p.restore()}if(null!==ni&&0<ni.length){steelseries.Orientation.WEST===ft&&(p.translate(s,s),p.rotate(-Math.PI/2),p.translate(-s,-s)),i=ni.length;do i--,ur(p,ni[i].start,ni[i].stop,ni[i].color,!0);while(0<i);p.restore()}su(p,eu),ou(p)}vr&&(p.save(),steelseries.Orientation.WEST===ft&&(p.translate(s,s),p.rotate(-Math.PI/2),p.translate(-s,-s)),p.translate(s,g),p.rotate(rt+(pt-l)*ht+ct),p.translate(-s,-g),p.drawImage(hu(),h*.475,k*.32),p.restore()),c&&(nt(sr,h*1.17,ut,tr,it.labelColor,!1),nt(lr,h*1.17,ut,tr,it.labelColor,!0)),b&&dr&&(r=ut.type===\"type15\"||ut.type===\"type16\"?!1:!0,y(ir,wr,h,k,r,du,ci,kr,ft))},ti=function(n){n=n||{};var f=undefined===n.frame?!1:n.frame,e=undefined===n.background?!1:n.background,r=undefined===n.led?!1:n.led,t=undefined===n.pointer?!1:n.pointer,i=undefined===n.foreground?!1:n.foreground;f&&(ui.width=u,ui.height=u,fr=ui.getContext(\"2d\")),e&&(ri.width=u,ri.height=u,p=ri.getContext(\"2d\")),r&&(ii.width=Math.ceil(u*.093457),ii.height=Math.ceil(u*.093457),cr=ii.getContext(\"2d\"),st.width=Math.ceil(u*.093457),st.height=Math.ceil(u*.093457),ar=st.getContext(\"2d\"),bt=st),t&&(fi.width=u,fi.height=u,sr=fi.getContext(\"2d\"),li.width=u,li.height=u,lr=li.getContext(\"2d\"),yt.width=u,yt.height=u,et=yt.getContext(\"2d\")),i&&(si.width=u,si.height=u,ir=si.getContext(\"2d\"))},vi=function(n){n?nu=setInterval(fu,1e3):clearInterval(nu)},fu=function(){tu&&(bt=bt===ii?st:ii,wu.repaint())};return this.setValue=function(n){var t=n<l?l:n>d?d:n;b!==t&&(b=t,b>wt&&(wt=b),b<vt&&(vt=b),b<pt||tt?b<pt&&(tt=!1,vi(tt),nr&&hi.pause()):(tt=!0,vi(tt),nr&&hi.play()),this.repaint())},this.getValue=function(){return b},this.setValueAnimated=function(n){var i=n<l?l:n>d?d:n,t;b!==i&&(undefined!==dt&&dt.playing&&dt.stop(),dt=new Tween({},\"\",Tween.regularEaseInOut,b,i,1),t=this,dt.onMotionChanged=function(n){b=n.target._pos,b<pt||tt?b<pt&&(tt=!1,vi(tt)):(tt=!0,vi(tt)),b>wt&&(wt=b),b<vt&&(vt=b),t.repaint()},dt.start())},this.resetMinMeasuredValue=function(){vt=b,this.repaint()},this.resetMaxMeasuredValue=function(){wt=b,this.repaint()},this.setMinMeasuredValueVisible=function(n){gi=n,this.repaint()},this.setMaxMeasuredValueVisible=function(n){di=n,this.repaint()},this.setThresholdVisible=function(n){vr=n,this.repaint()},this.setFrameDesign=function(n){ti({frame:!0}),iu=n,lt({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){ti({background:!0,pointer:ut.type===\"type2\"||ut.type===\"type13\"?!0:!1}),it=n,lt({background:!0,pointer:ut.type===\"type2\"||ut.type===\"type13\"?!0:!1}),this.repaint()},this.setForegroundType=function(n){ti({foreground:!0}),wr=n,lt({foreground:!0}),this.repaint()},this.setPointerType=function(n){ti({pointer:!0,foreground:!0}),ut=n,lt({pointer:!0,foreground:!0}),this.repaint()},this.setPointerColor=function(n){ti({pointer:!0}),tr=n,lt({pointer:!0}),this.repaint()},this.setLedColor=function(n){ti({led:!0}),ki=n,lt({led:!0}),this.repaint()},this.repaint=function(){pr||lt({frame:!0,background:!0,led:!0,pointer:!0,foreground:!0}),f.clearRect(0,0,f.canvas.width,f.canvas.height),f.save(),ru&&f.drawImage(ui,0,0),f.drawImage(ri,0,0),tu&&(b<pt&&(tt=!1,bt=st),f.drawImage(bt,pu,yu)),steelseries.Orientation.WEST===ft&&(f.translate(s,s),f.rotate(-Math.PI/2),f.translate(-s,-s)),gi&&(f.save(),f.translate(s,g),f.rotate(rt+ct+(vt-l)*ht),f.translate(-s,-g),f.drawImage(hr,f.canvas.width*.4865,f.canvas.height*.27),f.restore()),di&&(f.save(),f.translate(s,g),f.rotate(rt+ct+(wt-l)*ht),f.translate(-s,-g),f.drawImage(er,f.canvas.width*.4865,f.canvas.height*.27),f.restore()),ai=rt+ct+(b-l)*ht;var n=h*.006,t=h*1.17/2;et.clearRect(0,0,h,k),et.save(),et.translate(s,g),et.rotate(ai),et.translate(-t,-t),et.drawImage(li,0,0),et.restore(),steelseries.Orientation.NORTH===ft?f.drawImage(yt,0,0,h,k,n,n,h+n,k+n):f.drawImage(yt,0,0,h,k,-n,n,h-n,k+n),f.save(),f.translate(s,g),f.rotate(ai),f.translate(-t,-t),f.drawImage(fi,0,0),f.restore(),dr&&(f.save(),steelseries.Orientation.WEST===ft&&(f.translate(s,s),f.rotate(Math.PI/2),f.translate(-s,-s)),f.drawImage(si,0,0),f.restore()),f.restore()},this.repaint(),this},yi=function(n,i){var fi;i=i||{};var l=undefined===i.gaugeType?steelseries.GaugeType.TYPE1:i.gaugeType,b=undefined===i.width?140:i.width,d=undefined===i.height?320:i.height,e=undefined===i.minValue?0:i.minValue,s=undefined===i.maxValue?e+100:i.maxValue,gr=undefined===i.niceScale?!0:i.niceScale,bt=undefined===i.threshold?(s-e)/2:i.threshold,gi=undefined===i.titleString?\"\":i.titleString,wi=undefined===i.unitString?\"\":i.unitString,sr=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,or=undefined===i.frameVisible?!0:i.frameVisible,w=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,lr=undefined===i.backgroundVisible?!0:i.backgroundVisible,wt=undefined===i.valueColor?steelseries.ColorDef.RED:i.valueColor,lt=undefined===i.lcdColor?steelseries.LcdColor.STANDARD:i.lcdColor,hi=undefined===i.lcdVisible?!0:i.lcdVisible,fr=undefined===i.lcdDecimals?2:i.lcdDecimals,eu=undefined===i.digitalFont?!1:i.digitalFont,ti=undefined===i.ledColor?steelseries.LedColor.RED_LED:i.ledColor,er=undefined===i.ledVisible?!0:i.ledVisible,ar=undefined===i.thresholdVisible?!0:i.thresholdVisible,tr=undefined===i.minMeasuredValueVisible?!1:i.minMeasuredValueVisible,di=undefined===i.maxMeasuredValueVisible?!1:i.maxMeasuredValueVisible,fu=undefined===i.labelNumberFormat?steelseries.LabelNumberFormat.STANDARD:i.labelNumberFormat,kr=undefined===i.foregroundVisible?!0:i.foregroundVisible,ki=undefined===i.playAlarm?!1:i.playAlarm,vr=undefined===i.alarmSound?!1:i.alarmSound;ki&&vr!==!1&&(fi=r.createElement(\"audio\"),fi.setAttribute(\"src\",vr),fi.setAttribute(\"preload\",\"auto\"));var hu=this,v=e,at=s,ft=e;l.type!==\"type1\"&&l.type!==\"type2\"&&(l=steelseries.GaugeType.TYPE1);var yt,vt=!1,br=0,y=r.getElementById(n).getContext(\"2d\");y.clearRect(0,0,y.canvas.width,y.canvas.height),y.canvas.width=b,y.canvas.height=d;var f=b,u=d,h=b<=d,bi,rr,it=Math.round((h?d:b)*.05),nt=Math.round((h?b:d)*.05),ir,nr;h?(bi=f/2-it/2,rr=(l.type===\"type1\"?.053:.038)*u,ir=Math.floor(u/22)+\"px sans-serif\",nr=Math.floor(u/22)+\"px \"+tt):(bi=.89*f,rr=u/2-it/2,ir=Math.floor(u/10)+\"px sans-serif\",nr=Math.floor(u/10)+\"px \"+tt);var pr=!1,ci=e,si=s,ei=s-e,yr=si-ci,oi=0,ut=0,ui=10,uu=10,ru=function(){gr?(ei=c(s-e,!1),ut=c(ei/(uu-1),!0),ci=Math.floor(e/ut)*ut,si=Math.ceil(s/ut)*ut,oi=c(ut/(ui-1),!0),e=ci,s=si,yr=s-e):(ei=s-e,ci=e,si=s,yr=ei,oi=1,ut=10)},ii=t(b,d),wr=ii.getContext(\"2d\"),ri=t(b,d),k=ri.getContext(\"2d\"),li,kt=t(it,it),vi=kt.getContext(\"2d\"),rt=t(it,it),yi=rt.getContext(\"2d\"),pt=rt,gt=t(nt,nt),cr=gt.getContext(\"2d\"),dt=t(nt,nt),hr=dt.getContext(\"2d\"),ni=t(b,d),pi=ni.getContext(\"2d\"),cu=function(n,t,i){n.save(),n.textAlign=\"right\",n.textBaseline=\"middle\",n.strokeStyle=lt.textColor,n.fillStyle=lt.textColor,(lt===steelseries.LcdColor.STANDARD||lt===steelseries.LcdColor.STANDARD_GREEN)&&(n.shadowColor=\"gray\",i?(n.shadowOffsetX=u*.003,n.shadowOffsetY=u*.003,n.shadowBlur=u*.004):(n.shadowOffsetX=u*.007,n.shadowOffsetY=u*.007,n.shadowBlur=u*.009));var o,e,r;n.font=eu?nr:ir,i?(o=(f-f*.571428)/2+f*.571428-2,e=u*.88+1+(u*.055-2)/2,r=f*.7-2):(o=f*.695+f*.18-2,e=u*.22+1+(u*.15-2)/2,r=u*.22-2),n.fillText(t.toFixed(fr),o,e,r),n.restore()},ou=function(n){var i=r.createElement(\"canvas\"),t,u;return i.height=i.width=nt,t=i.getContext(\"2d\"),t.save(),u=t.createLinearGradient(0,.1,0,i.height*.9),u.addColorStop(0,\"#520000\"),u.addColorStop(.3,\"#fc1d00\"),u.addColorStop(.59,\"#fc1d00\"),u.addColorStop(1,\"#520000\"),t.fillStyle=u,n?(t.beginPath(),t.moveTo(.1,i.height*.5),t.lineTo(i.width*.9,.1),t.lineTo(i.width*.9,i.height*.9),t.closePath()):(t.beginPath(),t.moveTo(.1,.1),t.lineTo(i.width*.9,.1),t.lineTo(i.width*.5,i.height*.9),t.closePath()),t.fill(),t.strokeStyle=\"#FFFFFF\",t.stroke(),t.restore(),i},su=function(n,t,i){var o,k;w.labelColor.setAlpha(1),n.save(),n.textBaseline=\"middle\",o=f*.1,n.strokeStyle=w.labelColor.getRgbaColor(),n.fillStyle=w.labelColor.getRgbaColor();var r=e,y=ui-1,h,nt,v,c,a=1,g,it,tt,b,p,d;for(i?(g=.34*f,it=.36*f,tt=.33*f,b=.36*f,p=.32*f,d=.36*f,n.textAlign=\"right\",h=0,nt=u*.12864,v=0,c=l.type===\"type1\"?u*.856796-u*.12864:u*.7475-u*.12864,a=c/(s-e)):(g=.65*u,it=.63*u,tt=.66*u,b=.63*u,p=.67*u,d=.63*u,n.textAlign=\"center\",nt=0,l.type===\"type1\"?(h=f*.142857,v=f*.871012-h):(h=f*.19857,v=f*.82-h),c=0,a=v/(s-e)),k=e,tickCounter=0;k<=s;k+=oi,tickCounter+=oi){currentPos=i?nt+c-tickCounter*a:h+tickCounter*a,y++;if(y===ui){n.lineWidth=1.5,ai(n,p,d,currentPos,i);if(i)switch(t.format){case\"fractional\":n.fillText(r.toFixed(2),f*.28,currentPos,o);break;case\"scientific\":n.fillText(r.toPrecision(2),f*.28,currentPos,o);break;case\"standard\":default:n.fillText(r.toFixed(0),f*.28,currentPos,o)}else switch(t.format){case\"fractional\":n.fillText(r.toFixed(2),currentPos,u*.73,o);break;case\"scientific\":n.fillText(r.toPrecision(2),currentPos,u*.73,o);break;case\"standard\":default:n.fillText(r.toFixed(0),currentPos,u*.73,o)}r+=ut,y=0;continue}0==ui%2&&y===ui/2?(n.lineWidth=1,ai(n,tt,b,currentPos,i)):(n.lineWidth=.5,ai(n,g,it,currentPos,i))}n.restore()},ai=function(n,t,i,r,u){u?(n.beginPath(),n.moveTo(t,r),n.lineTo(i,r),n.closePath(),n.stroke()):(n.beginPath(),n.moveTo(r,t),n.lineTo(r,i),n.closePath(),n.stroke())},g=function(n){n=n||{};var b=undefined===n.frame?!1:n.frame,t=undefined===n.background?!1:n.background,y=undefined===n.led?!1:n.led,v=undefined===n.foreground?!1:n.foreground,i,r,c;pr=!0,ru(),b&&or&&ht(wr,sr,f,u,h),t&&lr&&ot(k,w,f,u,h),t&&l.type===\"type2\"&&dr(k),y&&(h?(vi.drawImage(o(it,1,ti),0,0),yi.drawImage(o(it,0,ti),0,0)):(vi.drawImage(o(it,1,ti),0,0),yi.drawImage(o(it,0,ti),0,0))),tr&&(h?cr.drawImage(a(nt,steelseries.ColorDef.BLUE.dark.getRgbaColor(),!1,h),0,0):cr.drawImage(a(nt,steelseries.ColorDef.BLUE.dark.getRgbaColor(),!1,h),0,0)),di&&(h?hr.drawImage(a(nt,steelseries.ColorDef.RED.medium.getRgbaColor(),!1,h),0,0):hr.drawImage(a(nt,steelseries.ColorDef.RED.medium.getRgbaColor(),!1,h),0,0)),t&&lr&&(su(k,fu,h),h?ct(k,f,u,gi,wi,w,h,null,hi,l):ct(k,f,u,gi,wi,w,h,null,hi,l)),t&&ar&&(k.save(),h?(i=l.type===\"type1\"?.856796:.7475,r=i-.12864,c=u*i-u*r*(bt/(s-e)),k.translate(f*.365,c-nt/2)):(i=l.type===\"type1\"?.871012:.82,r=i-(l.type===\"type1\"?.142857:.19857),c=f*r*bt/(s-e),k.translate(f*(l.type===\"type1\"?.142857:.19857)-nt/2+c,u*.58)),k.drawImage(ou(h),0,0),k.restore()),t&&hi&&(h?(li=p(f*.571428,u*.055,lt),k.drawImage(li,(f-f*.571428)/2,u*.88)):(li=p(f*.18,u*.15,lt),k.drawImage(li,f*.695,u*.22))),v&&l.type===\"type2\"&&nu(pi),v&&kr&&et(pi,f,u,h,!1)},st=function(n){n=n||{};var r=undefined===n.frame?!1:n.frame,u=undefined===n.background?!1:n.background,t=undefined===n.led?!1:n.led,i=undefined===n.foreground?!1:n.foreground;r&&(ii.width=b,ii.height=d,wr=ii.getContext(\"2d\")),u&&(ri.width=b,ri.height=d,k=ri.getContext(\"2d\")),t&&(kt.width=Math.ceil(b*.093457),kt.height=Math.ceil(d*.093457),vi=kt.getContext(\"2d\"),rt.width=Math.ceil(b*.093457),rt.height=Math.ceil(d*.093457),yi=rt.getContext(\"2d\"),pt=rt),i&&(ni.width=b,ni.height=d,pi=ni.getContext(\"2d\"))},ur=function(n){n?br=setInterval(iu,1e3):clearInterval(br)},iu=function(){er&&(pt=pt===kt?rt:kt,hu.repaint())},tu=function(n,t,i){var u,o,r=w.labelColor,f,y,nt,c,a,tt,g,ct,ht,st,lt,yt,pt,at,vt,it,k,et,ft,d,p,b,ut,rt,ot;h?(u=i*.12864,o=l.type===\"type1\"?i*.856796:i*.7475,f=o-u,y=f*(v-e)/(s-e),nt=o-y,ct=0,ht=u,st=0,lt=o):(l.type===\"type1\"?(u=t*.871012,o=t*.142857):(u=t*.82,o=t*.19857),f=u-o,y=f*(v-e)/(s-e),nt=o,ct=u,ht=0,st=o,lt=0),l.type===\"type1\"&&(d=w===steelseries.BackgroundColor.CARBON||w===steelseries.BackgroundColor.PUNCHED_SHEET||w===steelseries.BackgroundColor.STAINLESS||w===steelseries.BackgroundColor.BRUSHED_STAINLESS||w===steelseries.BackgroundColor.TURNED?.3:0,p=n.createLinearGradient(ct,ht,st,lt),r.setAlpha(.05+d),p.addColorStop(0,r.getRgbaColor()),r.setAlpha(.15+d),p.addColorStop(.48,r.getRgbaColor()),r.setAlpha(.15+d),p.addColorStop(.49,r.getRgbaColor()),r.setAlpha(.05+d),p.addColorStop(1,r.getRgbaColor()),n.fillStyle=p,h?n.fillRect(t*.435714,u,t*.142857,f):n.fillRect(t*.142857,i*.435714,f,i*.142857),h?(yt=0,pt=u,at=0,vt=u+f):(yt=t*.142857+f,pt=0,at=t*.142857,vt=0),b=n.createLinearGradient(yt,pt,at,vt),r.setAlpha(.3+d),b.addColorStop(0,r.getRgbaColor()),r.setAlpha(.69),b.addColorStop(.48,r.getRgbaColor()),r.setAlpha(.7),b.addColorStop(.49,r.getRgbaColor()),r.setAlpha(.4),b.addColorStop(1,r.getRgbaColor()),n.fillStyle=b,h?(n.fillRect(t*.435714,u,t*.007142,f),n.fillRect(t*.571428,u,t*.007142,f)):(n.fillRect(t*.142857,i*.435714,f,i*.007142),n.fillRect(t*.142857,i*.571428,f,i*.007142))),h?l.type===\"type1\"?(c=t*.45,a=0,tt=t*.45+t*.114285,g=0):(c=t/2-i*.0486/2,a=0,tt=c+i*.053,g=0):l.type===\"type1\"?(c=0,a=i*.45,tt=0,g=i*.45+i*.114285):(c=0,a=i/2-t*.025,tt=0,g=a+t*.053),ut=n.createLinearGradient(c,a,tt,g),ut.addColorStop(0,wt.medium.getRgbaColor()),ut.addColorStop(1,wt.light.getRgbaColor()),n.fillStyle=ut,rt=l.type===\"type1\"?0:h?i*.05:t*.05,h?n.fillRect(c,nt,tt-c,y+rt):n.fillRect(nt-rt,a,y+rt,g-a),l.type===\"type1\"&&(h?(it=t*.45,k=0,et=it+t*.05,ft=0):(it=0,k=i*.45,et=0,ft=k+i*.05),ot=n.createLinearGradient(it,k,et,ft),ot.addColorStop(0,\"rgba(255, 255, 255, 0.7)\"),ot.addColorStop(.98,\"rgba(255, 255, 255, 0.0)\"),n.fillStyle=ot,h?n.fillRect(it,nt,et,y):n.fillRect(nt,k,y,ft-k))},nu=function(n){var t=h?u:f,i;n.save(),h?n.translate(f/2,0):(n.translate(f/2,u/2),n.rotate(Math.PI*.5),n.translate(0,-f/2+f*.05)),n.beginPath(),n.moveTo(-.049*t,.825*t),n.bezierCurveTo(-.049*t,.7975*t,-.0264*t,.775*t,.0013*t,.775*t),n.bezierCurveTo(.0264*t,.775*t,.049*t,.7975*t,.049*t,.825*t),n.bezierCurveTo(.049*t,.85*t,.0264*t,.8725*t,.0013*t,.8725*t),n.bezierCurveTo(-.0264*t,.8725*t,-.049*t,.85*t,-.049*t,.825*t),n.closePath(),i=n.createRadialGradient(0*t,.825*t,0,0*t,.825*t,.049*t),i.addColorStop(0,wt.medium.getRgbaColor()),i.addColorStop(.3,wt.medium.getRgbaColor()),i.addColorStop(1,wt.light.getRgbaColor()),n.fillStyle=i,n.fill(),n.beginPath(),h?(n.moveTo(-.0365*t,.8075*t),n.bezierCurveTo(-.0365*t,.7925*t,-.0214*t,.7875*t,-.0214*t,.7825*t),n.bezierCurveTo(.0189*t,.785*t,.0365*t,.7925*t,.0365*t,.8075*t),n.bezierCurveTo(.0365*t,.8175*t,.0214*t,.815*t,.0013*t,.8125*t),n.bezierCurveTo(-.0189*t,.8125*t,-.0365*t,.8175*t,-.0365*t,.8075*t),i=n.createRadialGradient(0,.8*t,0,0,.8*t,.0377*t)):(n.beginPath(),n.moveTo(-.0214*t,.86*t),n.bezierCurveTo(-.0365*t,.86*t,-.0415*t,.845*t,-.0465*t,.825*t),n.bezierCurveTo(-.0465*t,.805*t,-.0365*t,.7875*t,-.0214*t,.7875*t),n.bezierCurveTo(-.0113*t,.7875*t,-.0163*t,.8025*t,-.0163*t,.8225*t),n.bezierCurveTo(-.0163*t,.8425*t,-.0113*t,.86*t,-.0214*t,.86*t),i=n.createRadialGradient(-.03*t,.8225*t,0,-.03*t,.8225*t,.0377*t)),i.addColorStop(0,\"rgba(255, 255, 255, 0.55)\"),i.addColorStop(1,\"rgba(255, 255, 255, 0.05)\"),n.fillStyle=i,n.closePath(),n.fill(),n.beginPath(),n.moveTo(-.0214*t,.115*t),n.bezierCurveTo(-.0214*t,.1075*t,-.0163*t,.1025*t,-.0113*t,.1025*t),n.bezierCurveTo(-.0113*t,.1025*t,-.0113*t,.1025*t,-.0113*t,.1025*t),n.bezierCurveTo(-.0038*t,.1025*t,.0013*t,.1075*t,.0013*t,.115*t),n.bezierCurveTo(.0013*t,.115*t,.0013*t,.76*t,.0013*t,.76*t),n.bezierCurveTo(.0013*t,.7675*t,-.0038*t,.7725*t,-.0113*t,.7725*t),n.bezierCurveTo(-.0113*t,.7725*t,-.0113*t,.7725*t,-.0113*t,.7725*t),n.bezierCurveTo(-.0163*t,.7725*t,-.0214*t,.7675*t,-.0214*t,.76*t),n.bezierCurveTo(-.0214*t,.76*t,-.0214*t,.115*t,-.0214*t,.115*t),n.closePath(),i=n.createLinearGradient(-.0189*t,0,.0013*t,0),i.addColorStop(0,\"rgba(255, 255, 255, 0.1)\"),i.addColorStop(.34,\"rgba(255, 255, 255, 0.5)\"),i.addColorStop(1,\"rgba(255, 255, 255, 0.1)\"),n.fillStyle=i,n.fill(),n.restore()},dr=function(n){var t=h?u:f,i;n.save(),h?n.translate(f/2,0):(n.translate(f/2,u/2),n.rotate(Math.PI*.5),n.translate(0,-f/2+f*.05)),n.beginPath(),n.moveTo(-.0516*t,.825*t),n.bezierCurveTo(-.0516*t,.8525*t,-.0289*t,.875*t,.0013*t,.875*t),n.bezierCurveTo(.0289*t,.875*t,.0516*t,.8525*t,.0516*t,.825*t),n.bezierCurveTo(.0516*t,.8075*t,.044*t,.7925*t,.0314*t,.7825*t),n.bezierCurveTo(.0314*t,.7825*t,.0314*t,.12*t,.0314*t,.12*t),n.bezierCurveTo(.0314*t,.1025*t,.0189*t,.0875*t,.0013*t,.0875*t),n.bezierCurveTo(-.0163*t,.0875*t,-.0289*t,.1025*t,-.0289*t,.12*t),n.bezierCurveTo(-.0289*t,.12*t,-.0289*t,.7825*t,-.0289*t,.7825*t),n.bezierCurveTo(-.0415*t,.79*t,-.0516*t,.805*t,-.0516*t,.825*t),n.closePath(),i=n.createLinearGradient(-.0163*t,0,.0289*t,0),i.addColorStop(0,\"rgba(226, 226, 226, 0.5)\"),i.addColorStop(.5,\"rgba(226, 226, 226, 0.2)\"),i.addColorStop(1,\"rgba(226, 226, 226, 0.5)\"),n.fillStyle=i,n.fill(),n.lineWidth=1,n.strokeStyle=\"rgba(153, 153, 153, 0.5)\",n.stroke(),n.restore()};return this.setValue=function(n){var t=n<e?e:n>s?s:n;v!==t&&(v=t,v>ft&&(ft=v),v<at&&(at=v),v<bt||vt?v<bt&&(vt=!1,ur(vt),ki&&fi.pause()):(vt=!0,ur(vt),ki&&fi.play()),this.repaint())},this.getValue=function(){return v},this.setValueAnimated=function(n){var i=n<e?e:n>s?s:n,t;v!==i&&(undefined!==yt&&yt.playing&&yt.stop(),yt=new Tween({},\"\",Tween.regularEaseInOut,v,i,1),t=this,yt.onMotionChanged=function(n){t.setValue(n.target._pos)},yt.start())},this.resetMinMeasuredValue=function(){at=v,this.repaint()},this.resetMaxMeasuredValue=function(){ft=v,this.repaint()},this.setMinMeasuredValueVisible=function(n){tr=n,this.repaint()},this.setMaxMeasuredValueVisible=function(n){di=n,this.repaint()},this.setThresholdVisible=function(n){ar=n,this.repaint()},this.setLcdDecimals=function(n){fr=n,this.repaint()},this.setFrameDesign=function(n){st({frame:!0}),sr=n,g({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){st({background:!0}),w=n,g({background:!0}),this.repaint()},this.setValueColor=function(n){st({foreground:!0}),wt=n,g({foreground:!0}),this.repaint()},this.setLedColor=function(n){st({led:!0}),ti=n,g({led:!0}),this.repaint()},this.setLcdColor=function(n){st({background:!0}),lt=n,g({background:!0}),this.repaint()},this.setMaxMeasuredValue=function(n){var t=n<e?e:n>s?s:n;ft=t,this.repaint()},this.setMinMeasuredValue=function(n){var t=n<e?e:n>s?s:n;at=t,this.repaint()},this.setTitleString=function(n){gi=n,g({background:!0}),this.repaint()},this.setUnitString=function(n){wi=n,g({background:!0}),this.repaint()},this.setMinValue=function(n){st({background:!0}),e=n,mminMeasuredValue<e&&(at=e),v<e&&(v=e),g({background:!0}),this.repaint()},this.getMinValue=function(){return e},this.setMaxValue=function(n){st({background:!0}),s=n,ft>s&&(ft=s),v>s&&(v=s),g({background:!0}),this.repaint()},this.getMaxValue=function(){return s},this.setThreshold=function(n){var t=n<e?e:n>s?s:n;bt=t,g({background:!0}),this.repaint()},this.repaint=function(){pr||g({frame:!0,background:!0,led:!0,foreground:!0}),y.clearRect(0,0,y.canvas.width,y.canvas.height),or&&y.drawImage(ii,0,0),y.drawImage(ri,0,0),hi&&cu(y,v,h),er&&(v<bt&&(vt=!1,pt=rt),y.drawImage(pt,bi,rr));var t,n,i,o,r;tr&&(h?(n=l.type===\"type1\"?.856796:.7475,i=n-.12864,t=u*n-u*i*(at/(s-e)),o=f*.34-gt.width,r=t-gt.height/2):(n=l.type===\"type1\"?.871012:.82,i=n-(l.type===\"type1\"?.142857:.19857),t=f*i*at/(s-e),o=f*(l.type===\"type1\"?.142857:.19857)-gt.height/2+t,r=u*.65),y.drawImage(gt,o,r)),di&&(h?(t=u*n-u*i*(ft/(s-e)),o=f*.34-dt.width,r=t-dt.height/2):(n=l.type===\"type1\"?.871012:.8,i=n-(l.type===\"type1\"?.14857:.19857),t=f*i*ft/(s-e),o=f*(l.type===\"type1\"?.142857:.19857)-dt.height/2+t,r=u*.65),y.drawImage(dt,o,r)),y.save(),tu(y,f,u),y.restore(),(kr||l.type===\"type2\")&&y.drawImage(ni,0,0)},this.repaint(),this},kr=function(n,i){var oi,li,d;i=i||{};var y=undefined===i.width?140:i.width,w=undefined===i.height?320:i.height,u=undefined===i.minValue?0:i.minValue,s=undefined===i.maxValue?u+100:i.maxValue,bt=undefined===i.section?null:i.section,lu=undefined===i.useSectionColors?!1:i.useSectionColors,su=undefined===i.niceScale?!0:i.niceScale,st=undefined===i.threshold?(s-u)/2:i.threshold,ar=undefined===i.titleString?\"\":i.titleString,rr=undefined===i.unitString?\"\":i.unitString,dr=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,kr=undefined===i.frameVisible?!0:i.frameVisible,k=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,or=undefined===i.backgroundVisible?!0:i.backgroundVisible,ei=undefined===i.valueColor?steelseries.ColorDef.RED:i.valueColor,kt=undefined===i.lcdColor?steelseries.LcdColor.STANDARD:i.lcdColor,gi=undefined===i.lcdVisible?!0:i.lcdVisible,pr=undefined===i.lcdDecimals?2:i.lcdDecimals,wu=undefined===i.digitalFont?!1:i.digitalFont,si=undefined===i.ledColor?steelseries.LedColor.RED_LED:i.ledColor,br=undefined===i.ledVisible?!0:i.ledVisible,wr=undefined===i.thresholdVisible?!0:i.thresholdVisible,lr=undefined===i.minMeasuredValueVisible?!1:i.minMeasuredValueVisible,fr=undefined===i.maxMeasuredValueVisible?!1:i.maxMeasuredValueVisible,bu=undefined===i.labelNumberFormat?steelseries.LabelNumberFormat.STANDARD:i.labelNumberFormat,fu=undefined===i.foregroundVisible?!0:i.foregroundVisible,er=undefined===i.playAlarm?!1:i.playAlarm,iu=undefined===i.alarmSound?!1:i.alarmSound,yt=undefined===i.valueGradient?null:i.valueGradient,pu=undefined===i.useValueGradient?!1:i.useValueGradient;er&&iu!==!1&&(oi=r.createElement(\"audio\"),oi.setAttribute(\"src\",iu),oi.setAttribute(\"preload\",\"auto\"));var ku=this,l=u,at=s,lt=u,dt,it=!1,ri=!1,ki=!1,ft=[],ru=0,v=r.getElementById(n).getContext(\"2d\");v.clearRect(0,0,v.canvas.width,v.canvas.height),v.canvas.width=y,v.canvas.height=w;var f=v.canvas.width,e=v.canvas.height,h=y<=w,ur,sr,ut=Math.round((h?w:y)*.05),rt=Math.round((h?y:w)*.05),hr,cr;h?(ur=f/2-ut/2,sr=.053*e,hr=Math.floor(e/22)+\"px sans-serif\",cr=Math.floor(e/22)+\"px \"+tt):(ur=.89*f,sr=e/1.95-ut/2,hr=Math.floor(e/10)+\"px sans-serif\",cr=Math.floor(e/10)+\"px \"+tt);var tu=!1,pi=u,wi=s,bi=s-u,ou=wi-pi,ai=0,vt=0,ti=10,hu=10,yu=function(){su?(bi=c(s-u,!1),vt=c(bi/(hu-1),!0),pi=Math.floor(u/vt)*vt,wi=Math.ceil(s/vt)*vt,ai=c(vt/(ti-1),!0),u=pi,s=wi,ou=s-u):(bi=s-u,pi=u,wi=s,ou=bi,ai=1,vt=10)},fi=t(y,w),uu=fi.getContext(\"2d\"),hi=t(y,w),nt=hi.getContext(\"2d\"),di,g=r.createElement(\"canvas\");h?(g.width=f*.121428,g.height=e*.012135):(g.width=f*.012135,g.height=e*.121428),li=g.getContext(\"2d\"),d=r.createElement(\"canvas\"),h?(d.width=f*.121428,d.height=e*.012135):(d.width=f*.012135,d.height=e*.121428);var eu=d.getContext(\"2d\"),ni=t(ut,ut),nr=ni.getContext(\"2d\"),pt=t(ut,ut),tr=pt.getContext(\"2d\"),gt=pt,ci=t(rt,rt),gr=ci.getContext(\"2d\"),ii=t(rt,rt),nu=ii.getContext(\"2d\"),ui=t(y,w),yr=ui.getContext(\"2d\"),nf=function(n,t,i){n.save(),n.textAlign=\"right\",n.textBaseline=\"middle\",n.strokeStyle=kt.textColor,n.fillStyle=kt.textColor,(kt===steelseries.LcdColor.STANDARD||kt===steelseries.LcdColor.STANDARD_GREEN)&&(n.shadowColor=\"gray\",i?(n.shadowOffsetX=f*.007,n.shadowOffsetY=f*.007,n.shadowBlur=f*.009):(n.shadowOffsetX=e*.007,n.shadowOffsetY=e*.007,n.shadowBlur=e*.009));var o,u,r;n.font=wu?cr:hr,i?(o=(f-f*.571428)/2+1+f*.571428-2,u=e*.88+1+(e*.055-2)/2,r=f*.7-2):(o=f*.695+f*.18-2,u=e*.22+1+(e*.15-2)/2,r=e*.22-2),n.fillText(t.toFixed(pr),o,u,r),n.restore()},gu=function(n){var i=r.createElement(\"canvas\"),t,u;return i.height=i.width=rt,t=i.getContext(\"2d\"),t.save(),u=t.createLinearGradient(0,.1,0,i.height*.9),u.addColorStop(0,\"#520000\"),u.addColorStop(.3,\"#fc1d00\"),u.addColorStop(.59,\"#fc1d00\"),u.addColorStop(1,\"#520000\"),t.fillStyle=u,n?(t.beginPath(),t.moveTo(.1,i.height*.5),t.lineTo(i.width*.9,.1),t.lineTo(i.width*.9,i.height*.9),t.closePath()):(t.beginPath(),t.moveTo(.1,.1),t.lineTo(i.width*.9,.1),t.lineTo(i.width*.5,i.height*.9),t.closePath()),t.fill(),t.strokeStyle=\"#FFFFFF\",t.stroke(),t.restore(),i},du=function(n,t,i){var o,y;k.labelColor.setAlpha(1),n.save(),n.textBaseline=\"middle\",o=f*.1,n.strokeStyle=k.labelColor.getRgbaColor(),n.fillStyle=k.labelColor.getRgbaColor();var r=u,l=ti-1,d,b,g,c,h=1,tt,nt,a,v,w,p;for(i?(tt=.34*f,nt=.36*f,a=.33*f,v=.36*f,w=.32*f,p=.36*f,n.textAlign=\"right\",d=0,b=e*.12864,g=0,c=e*.856796-e*.12864,h=c/(s-u)):(tt=.65*e,nt=.63*e,a=.66*e,v=.63*e,w=.67*e,p=.63*e,n.textAlign=\"center\",d=f*.142857,b=0,g=f*.871012-f*.142857,c=0,h=g/(s-u)),y=u,tickCounter=0;y<=s;y+=ai,tickCounter+=ai){currentPos=i?b+c-tickCounter*h:d+tickCounter*h,l++;if(l===ti){n.lineWidth=1.5,ir(n,w,p,currentPos,i);if(i)switch(t.format){case\"fractional\":n.fillText(r.toFixed(2),f*.28,currentPos,o);break;case\"scientific\":n.fillText(r.toPrecision(2),f*.28,currentPos,o);break;case\"standard\":default:n.fillText(r.toFixed(0),f*.28,currentPos,o)}else switch(t.format){case\"fractional\":n.fillText(r.toFixed(2),currentPos,e*.73,o);break;case\"scientific\":n.fillText(r.toPrecision(2),currentPos,e*.73,o);break;case\"standard\":default:n.fillText(r.toFixed(0),currentPos,e*.73,o)}r+=vt,l=0;continue}0==ti%2&&l===ti/2?(n.lineWidth=1,ir(n,a,v,currentPos,i)):(n.lineWidth=.5,ir(n,tt,nt,currentPos,i))}n.restore()},ir=function(n,t,i,r,u){u?(n.beginPath(),n.moveTo(t,r),n.lineTo(i,r),n.closePath(),n.stroke()):(n.beginPath(),n.moveTo(r,t),n.lineTo(r,i),n.closePath(),n.stroke())},b=function(n){var i,t,r,l,c,v;n=n||{};var b=undefined===n.frame?!1:n.frame,y=undefined===n.background?!1:n.background,g=undefined===n.led?!1:n.led,d=undefined===n.foreground?!1:n.foreground,w=undefined===n.bargraphled?!1:n.bargraphled;tu=!0,yu(),b&&kr&&ht(uu,dr,f,e,h),y&&or&&ot(nt,k,f,e,h),g&&(h?(nr.drawImage(o(ut,1,si),0,0),tr.drawImage(o(ut,0,si),0,0)):(nr.drawImage(o(ut,1,si),0,0),tr.drawImage(o(ut,0,si),0,0))),lr&&(h?gr.drawImage(a(rt,steelseries.ColorDef.BLUE.dark.getRgbaColor(),!1,h),0,0):gr.drawImage(a(rt,steelseries.ColorDef.BLUE.dark.getRgbaColor(),!1,h),0,0)),fr&&(h?nu.drawImage(a(rt,steelseries.ColorDef.RED.medium.getRgbaColor(),!1,h),0,0):nu.drawImage(a(rt,steelseries.ColorDef.RED.medium.getRgbaColor(),!1,h),0,0)),y&&or&&(du(nt,bu,h),wr&&(nt.save(),h?(i=e*.856796-e*.728155*(st/(s-u)),nt.translate(f*.365,i-rt/2)):(i=(f*.856796-f*.12864)*st/(s-u),nt.translate(f*.142857-rt/2+i,e*.58)),nt.drawImage(gu(h),0,0),nt.restore()),h?ct(nt,f,e,ar,rr,k,h,null,gi):ct(nt,f,e,ar,rr,k,h,null,gi)),y&&gi&&(h?(di=p(f*.571428,e*.055,kt),nt.drawImage(di,(f-f*.571428)/2,e*.88)):(di=p(f*.18,e*.15,kt),nt.drawImage(di,f*.695,e*.22))),w&&(cu(eu),vr(li,ei)),ri=!1;if(null!==bt&&0<bt.length){ri=!0,t=bt.length,h?(r=e*.12864,l=e*.856796,c=l-r,v=0):(r=f*.856796,l=f*.12864,c=r-l,v=f*.012135/2),ft=[];do t--,ft.push({start:(bt[t].start+Math.abs(u))/(s-u)*c-v,stop:(bt[t].stop+Math.abs(u))/(s-u)*c-v,color:wt(bt[t].color)});while(0<t)}ki=!1,pu&&yt!==null&&(ri=!1,ki=!0),d&&fu&&et(yr,f,e,h,!1)},yi=function(n){n=n||{};var u=undefined===n.frame?!1:n.frame,f=undefined===n.background?!1:n.background,r=undefined===n.led?!1:n.led,t=undefined===n.bargraphled?!1:n.bargraphled,i=undefined===n.foreground?!1:n.foreground;u&&(fi.width=y,fi.height=w,uu=fi.getContext(\"2d\")),f&&(hi.width=y,hi.height=w,nt=hi.getContext(\"2d\")),t&&(h?(g.width=y*.121428,g.height=w*.012135):(g.width=y*.012135,g.height=w*.121428),li=g.getContext(\"2d\"),h?(d.width=y*.121428,d.height=w*.012135):(d.width=y*.012135,d.height=w*.121428),eu=d.getContext(\"2d\")),r&&(ni.width=Math.ceil(y*.093457),ni.height=Math.ceil(w*.093457),nr=ni.getContext(\"2d\"),pt.width=Math.ceil(y*.093457),pt.height=Math.ceil(w*.093457),tr=pt.getContext(\"2d\"),gt=pt),i&&(ui.width=y,ui.height=w,yr=ui.getContext(\"2d\"))},vi=function(n){n?ru=setInterval(au,1e3):clearInterval(ru)},au=function(){br&&(gt=gt===ni?pt:ni,ku.repaint())},vu=function(n,t,i){var v,ot,f=k.labelColor,r,bt,ti,ut,et,vt,gt,ni,pt,dt,kt,lt,ct,w,y,rt,it,p,nt,b,tt,ii,ui,ht,at,e,o,a,st,c;h?(v=i*.12864,ot=i*.856796,r=ot-v,bt=r*(l-u)/(s-u),ti=v+r-bt,ut=0,et=v,vt=0,gt=v+r*1.014):(v=t*.856796,ot=t*.12864,r=v-ot,bt=r*(l-u)/(s-u),ti=ot,ut=t*.13,et=i*.435714,vt=ut+r*1.035,gt=et),y=k===steelseries.BackgroundColor.CARBON||k===steelseries.BackgroundColor.PUNCHED_SHEET||k===steelseries.BackgroundColor.STAINLESS||k===steelseries.BackgroundColor.BRUSHED_STAINLESS||k===steelseries.BackgroundColor.TURNED?.3:0,rt=n.createLinearGradient(ut,et,vt,gt),f.setAlpha(.047058+y),rt.addColorStop(0,f.getRgbaColor()),f.setAlpha(.145098+y),rt.addColorStop(.48,f.getRgbaColor()),f.setAlpha(.149019+y),rt.addColorStop(.49,f.getRgbaColor()),f.setAlpha(.047058+y),rt.addColorStop(1,f.getRgbaColor()),n.fillStyle=rt,h?n.fillRect(t*.435714,v,t*.15,r*1.014):n.fillRect(ut,et,r*1.035,i*.152857),h?(ni=0,pt=v,dt=0,kt=v+r*1.014):(ni=ut,pt=0,dt=vt,kt=0),it=n.createLinearGradient(ni,pt,dt,kt),f.setAlpha(.298039+y),it.addColorStop(0,f.getRgbaColor()),f.setAlpha(.686274+y),it.addColorStop(.48,f.getRgbaColor()),f.setAlpha(.698039+y),it.addColorStop(.49,f.getRgbaColor()),f.setAlpha(.4+y),it.addColorStop(1,f.getRgbaColor()),n.fillStyle=it,h?(n.fillRect(t*.435714,v,t*.007142,r*1.014),n.fillRect(t*.571428,v,t*.007142,r*1.014)):(n.fillRect(t*.13,i*.435714,r*1.035,i*.007142),n.fillRect(t*.13,i*.571428,r*1.035,i*.007142)),h?(p=t*.45,nt=i*.851941,b=t*.121428,tt=i*.012135,ii=(p+b)/2,ui=(nt+tt)/2):(p=t*.142857,nt=i*.45,b=t*.012135,tt=i*.121428,ii=(p+b)/2,ui=(nt+tt)/2),st=ei;if(h){for(at=(s+Math.abs(u))/(s-u)*r,o=0;o<=at;o+=tt+1)n.translate(0,-o),n.drawImage(d,p,nt),n.translate(0,o);for(ht=(l+Math.abs(u))/(s-u)*r,o=0;o<=ht;o+=tt+1){a=ei;if(ki)lt=u+o/r*(s-u),ct=yt.getEnd()-yt.getStart(),w=lt/ct,w=Math.max(Math.min(w,1),0),a=wt(yt.getColorAt(w).getRgbaColor());else if(ri)for(c=0;c<ft.length;c++)if(o>=ft[c].start&&o<ft[c].stop){a=ft[c].color;break}st.medium.getHexColor()!==a.medium.getHexColor()&&(vr(li,a),st=a),n.translate(0,-o),n.drawImage(g,p,nt),n.translate(0,o)}}else{for(at=(s+Math.abs(u))/(s-u)*r,e=-(b/2);e<=at;e+=b+1)n.translate(e,0),n.drawImage(d,p,nt),n.translate(-e,0);for(ht=(l+Math.abs(u))/(s-u)*r,e=-(b/2);e<=ht;e+=b+1){a=ei;if(ki)lt=u+e/r*(s-u),ct=yt.getEnd()-yt.getStart(),w=lt/ct,w=Math.max(Math.min(w,1),0),a=wt(yt.getColorAt(w).getRgbaColor());else if(ri)for(c=0;c<ft.length;c++)if(e>=ft[c].start&&e<ft[c].stop){a=ft[c].color;break}st.medium.getHexColor()!==a.medium.getHexColor()&&(vr(li,a),st=a),n.translate(e,0),n.drawImage(g,p,nt),n.translate(-e,0)}}},cu=function(n){n.save(),n.beginPath(),n.rect(0,0,n.canvas.width,n.canvas.height),n.closePath();var i=n.canvas.width/2,r=n.canvas.height/2,t=v.createRadialGradient(i,r,0,i,r,n.canvas.width/2);t.addColorStop(0,\"#3c3c3c\"),t.addColorStop(1,\"#323232\"),n.fillStyle=t,n.fill(),n.restore()},vr=function(n,t){var r,f,u,i;n.save(),n.beginPath(),n.rect(0,0,n.canvas.width,n.canvas.height),n.closePath(),r=n.canvas.width/2,f=n.canvas.height/2,u=h?n.canvas.width/2:n.canvas.height/2,i=v.createRadialGradient(r,f,0,r,f,u),i.addColorStop(0,t.light.getRgbaColor()),i.addColorStop(1,t.dark.getRgbaColor()),n.fillStyle=i,n.fill(),n.restore()};return this.setValue=function(n){var t=n<u?u:n>s?s:n;l!==t&&(l=t,l>lt&&(lt=l),l<at&&(at=l),l<st||it?l<st&&(it=!1,vi(it),er&&oi.pause()):(it=!0,vi(it),er&&oi.play()),this.repaint())},this.getValue=function(){return l},this.setValueAnimated=function(n){var i=n<u?u:n>s?s:n,t;l!==i&&(undefined!==dt&&dt.playing&&dt.stop(),dt=new Tween({},\"\",Tween.regularEaseInOut,l,i,1),t=this,dt.onMotionChanged=function(n){l=n.target._pos,l<st||it?l<st&&(it=!1,vi(it)):(it=!0,vi(it)),l>lt&&(lt=l),l<at&&(at=l),t.repaint()},dt.start())},this.resetMinMeasuredValue=function(){at=l,this.repaint()},this.resetMaxMeasuredValue=function(){lt=l,this.repaint()},this.setMinMeasuredValueVisible=function(n){lr=n,this.repaint()},this.setMaxMeasuredValueVisible=function(n){fr=n,this.repaint()},this.setThresholdVisible=function(n){wr=n,this.repaint()},this.setLcdDecimals=function(n){pr=n,this.repaint()},this.setFrameDesign=function(n){yi({frame:!0}),dr=n,b({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){yi({background:!0}),k=n,b({background:!0}),this.repaint()},this.setValueColor=function(n){yi({bargraphled:!0}),ei=n,b({bargraphled:!0}),this.repaint()},this.setLedColor=function(n){yi({led:!0}),si=n,b({led:!0}),this.repaint()},this.setLcdColor=function(n){kt=n,b({background:!0}),this.repaint()},this.setSection=function(n){bt=n,b(),this.repaint()},this.setSectionActive=function(n){lu=n,b(),this.repaint()},this.setGradient=function(n){yt=n,b(),this.repaint()},this.setGradientActive=function(n){useGradient=n,b(),this.repaint()},this.setMaxMeasuredValue=function(n){var t=n<u?u:n>s?s:n;lt!==t&&(lt=t,this.repaint())},this.setMinMeasuredValue=function(n){var t=n<u?u:n>s?s:n;at!==t&&(at=t,this.repaint())},this.setTitleString=function(n){ar=n,b({background:!0}),this.repaint()},this.setUnitString=function(n){rr=n,b({background:!0}),this.repaint()},this.setMinValue=function(n){u=n,b({background:!0,foreground:!0,pointer:!0}),this.repaint()},this.getMinValue=function(){return u},this.setMaxValue=function(n){s!==n&&(s=n,b({background:!0,foreground:!0,pointer:!0}),this.repaint())},this.getMaxValue=function(){return s},this.setThreshold=function(n){var t=n<u?u:n>s?s:n;st!==t&&(st=t,b({background:!0}),this.repaint())},this.repaint=function(){tu||b({frame:!0,background:!0,led:!0,pointer:!0,foreground:!0,bargraphled:!0}),v.clearRect(0,0,v.canvas.width,v.canvas.height),kr&&v.drawImage(fi,0,0),or&&v.drawImage(hi,0,0),gi&&nf(v,l,h),br&&(l<st&&(it=!1,gt=pt),v.drawImage(gt,ur,sr));var n,i,t;lr&&(h?(n=e*.856796-e*.728155*(at/(s-u)),i=f*.34-ci.width,t=n-ci.height/2):(n=(f*.856796-f*.12864)*at/(s-u),i=f*.142857-ci.height/2+n,t=e*.65),v.drawImage(ci,i,t)),fr&&(h?(n=e*.856796-e*.728155*(lt/(s-u)),i=f*.34-ii.width,t=n-ii.height/2):(n=(f*.856796-f*.12864)*lt/(s-u),i=f*.142857-ii.height/2+n,t=e*.65),v.drawImage(ii,i,t)),v.save(),vu(v,f,e),v.restore(),fu&&v.drawImage(ui,0,0)},this.repaint(),this},dr=function(n,i){i=i||{};var b=undefined===i.width?128:i.width,y=undefined===i.height?48:i.height,w=undefined===i.lcdColor?steelseries.LcdColor.STANDARD:i.lcdColor,pt=undefined===i.lcdDecimals?2:i.lcdDecimals,lt=undefined===i.unitString?\"\":i.unitString,at=undefined===i.unitStringVisible?!1:i.unitStringVisible,ht=undefined===i.digitalFont?!1:i.digitalFont,bt=undefined===i.valuesNumeric?!0:i.valuesNumeric,a=undefined===i.value?0:i.value,ct=undefined===i.autoScroll?!1:i.autoScroll,f=undefined===i.section?null:i.section,c=!1,e=0,g,wt=this,u=r.getElementById(n).getContext(\"2d\");u.save(),u.clearRect(0,0,u.canvas.width,u.canvas.height),u.canvas.width=b,u.canvas.height=y;var o=b,h=y,l=0,v=Math.floor(h/1.5),ot=v+\"px sans-serif\",it=v+\"px \"+tt,nt=!1,rt,et=[],ut=[],kt=function(n,t){var r,i;u.save(),u.textAlign=\"right\",u.strokeStyle=t,u.fillStyle=t,u.beginPath(),u.rect(2,0,o-4,h),u.closePath(),u.clip(),u.font=ht?it:ot,bt?(r=0,l=0,at&&(u.font=Math.floor(h/2.5)+\"px sans-serif\",r=u.measureText(lt).width),u.font=ht?it:ot,i=n.toFixed(pt),l=u.measureText(i).width,u.fillText(i,o-r-4-e,h*.5+v*.38),at&&(u.font=Math.floor(h/2.5)+\"px sans-serif\",u.fillText(lt,o-2-e,h*.5+v*.38))):(l=u.measureText(n).width,ct&&l>o-4?c||(e=o-l-o*.2,c=!0,clearTimeout(g),g=setTimeout(d,200)):ct&&l<=o-4&&(e=0,c=!1),u.fillText(n,o-2-e,h*.5+v*.38)),u.restore()},dt=function(n,i,r,u){var it=t(n,i),f=it.getContext(\"2d\");f.save();var pt=0,d=0,kt=n,et=i,rt=Math.min(n,i)*.095,h=f.createLinearGradient(0,d,0,d+et);h.addColorStop(0,\"#4c4c4c\"),h.addColorStop(.08,\"#666666\"),h.addColorStop(.92,\"#666666\"),h.addColorStop(1,\"#e6e6e6\"),f.fillStyle=h,s(f,pt,d,kt,et,rt),f.fill(),f.restore(),f.save();var nt=ft(r),e=st(nt[0],nt[1],nt[2]),g=ft(u.gradientStartColor),ht=st(g[0],g[1],g[2]),tt=ft(u.gradientFraction1Color),lt=st(tt[0],tt[1],tt[2]),a=ft(u.gradientFraction2Color),ct=st(a[0],a[1],a[2]),v=ft(u.gradientFraction3Color),wt=st(v[0],v[1],v[2]),c=ft(u.gradientStopColor),yt=st(c[0],c[1],c[2]),l=vt(e[0],e[1],ht[2]-.31),y=vt(e[0],e[1],lt[2]-.31),k=vt(e[0],e[1],ct[2]-.31),p=vt(e[0],e[1],wt[2]-.31),w=vt(e[0],e[1],yt[2]-.31),bt=1,b=1,ot=n-2,ut=i-2,at=rt-1,o=f.createLinearGradient(0,b,0,b+ut);return o.addColorStop(0,\"rgb(\"+l[0]+\", \"+l[1]+\", \"+l[2]+\")\"),o.addColorStop(.03,\"rgb(\"+y[0]+\",\"+y[1]+\",\"+y[2]+\")\"),o.addColorStop(.49,\"rgb(\"+k[0]+\",\"+k[1]+\",\"+k[2]+\")\"),o.addColorStop(.5,\"rgb(\"+p[0]+\",\"+p[1]+\",\"+p[2]+\")\"),o.addColorStop(1,\"rgb(\"+w[0]+\",\"+w[1]+\",\"+w[2]+\")\"),f.fillStyle=o,s(f,bt,b,ot,ut,at),f.fill(),f.restore(),it},yt=function(n){var i=ft(n),r=st(i[0],i[1],i[2]),t=vt(r[0],.57,.83);return\"rgb(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\")\"},d=function(){c?(e>o&&(e=-l),e+=2,g=setTimeout(d,60)):e=0,wt.repaint()},k=function(){var n;nt=!0,rt=p(b,y,w);if(null!==f&&0<f.length)for(n=0;n<f.length;n++)et[n]=dt(b,y,f[n].color,w),ut[n]=yt(f[n].color)};return this.setValue=function(n){a!==n&&(a=n,this.repaint())},this.setLcdColor=function(n){w=n,k(),this.repaint()},this.setSection=function(n){f=n,resetBuffers({foreground:!0}),k({background:!0,foreground:!0}),this.repaint()},this.setScrolling=function(n){if(n){if(c)return;c=n,d()}else c=n},this.repaint=function(){nt||k(),u.clearRect(0,0,u.canvas.width,u.canvas.height);var t=rt,i=w.textColor,n;if(null!==f&&0<f.length)for(n=0;n<f.length;n++)if(a>=f[n].start&&a<=f[n].stop){t=et[n],i=ut[n];break}u.drawImage(t,0,0),kt(a,i)},this.repaint(),this},wr=function(n,t){t=t||{};var h=undefined===t.width?128:t.width,c=undefined===t.height?64:t.height,f=undefined===t.lcdColor?steelseries.LcdColor.STANDARD:t.lcdColor,k=undefined===t.lcdDecimals?2:t.lcdDecimals,d=undefined===t.unitString?\"\":t.unitString,b=undefined===t.unitStringVisible?!1:t.unitStringVisible,w=undefined===t.digitalFont?!1:t.digitalFont,ut=undefined===t.valuesNumeric?!0:t.valuesNumeric,o=undefined===t.value?0:t.value,s=0,i=r.getElementById(n).getContext(\"2d\");i.save(),i.clearRect(0,0,i.canvas.width,i.canvas.height),i.canvas.width=h,i.canvas.height=c;var e=h,u=c,g=Math.floor(u/1.875)+\"px sans-serif\",it=Math.floor(u/1.875)+\"px \"+tt,y=Math.floor(u/3.5)+\"px sans-serif\",rt=Math.floor(u/3.5)+\"px \"+tt,v=!1,l,nt=function(n){var t,o,r;i.save(),i.textAlign=\"right\",i.textBaseline=\"middle\",i.strokeStyle=f.textColor,i.fillStyle=f.textColor,(f===steelseries.LcdColor.STANDARD||f===steelseries.LcdColor.STANDARD_GREEN)&&(i.shadowColor=\"gray\",i.shadowOffsetX=u*.05,i.shadowOffsetY=u*.05,i.shadowBlur=u*.06),ut?(i.font=Math.floor(u/2.5)+\"px sans-serif\",t=0,b&&(i.font=Math.floor(u/2.5)+\"px sans-serif\",t=i.measureText(d).width),i.font=w?it:g,o=n.toFixed(k),i.fillText(o,e-t-4,u*.38),b&&(i.font=Math.floor(u/3)+\"px sans-serif\",i.fillText(d,e-2,u*.46)),r=s.toFixed(k),i.font=w?rt:y,i.textAlign=\"center\",i.fillText(r,e/2,u*.8)):(i.font=Math.floor(u/2.5)+\"px sans-serif\",i.fillText(n,e-2,u*.38),i.font=y,i.textAlign=\"center\",i.fillText(s,e/2,u*.8)),i.restore()},a=function(){v=!0,l=p(h,c,f)};return this.setValue=function(n){(o!==n||s!==n)&&(s=o,o=n,this.repaint())},this.setLcdColor=function(n){f=n,a(),this.repaint()},this.repaint=function(){v||a(),i.clearRect(0,0,i.canvas.width,i.canvas.height),i.drawImage(l,0,0),nt(o)},this.repaint(),this},br=function(n,u){u=u||{};var c=undefined===u.size?200:u.size,st=undefined===u.decimalsVisible?!1:u.decimalsVisible,gt=undefined===u.textOrientationFixed?!1:u.textOrientationFixed,bt=undefined===u.frameDesign?steelseries.FrameDesign.METAL:u.frameDesign,at=undefined===u.frameVisible?!0:u.frameVisible,p=undefined===u.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:u.backgroundColor,vt=undefined===u.backgroundVisible?!0:u.backgroundVisible,b=undefined===u.pointerColor?steelseries.ColorDef.RED:u.pointerColor,lt=undefined===u.foregroundType?steelseries.ForegroundType.TYPE1:u.foregroundType,yt=undefined===u.foregroundVisible?!0:u.foregroundVisible,d,e=0,k=0,h=0,kt=Math.PI/180,ot=this.value,wt=st?1:0,s=r.getElementById(n).getContext(\"2d\");s.save(),s.clearRect(0,0,s.canvas.width,s.canvas.height),s.canvas.width=c,s.canvas.height=c;var f=c,o=c,l=f/2,a=o/2,pt=!1,g=t(c,c),ut=g.getContext(\"2d\"),nt=t(c,c),et=nt.getContext(\"2d\"),rt=t(c,c),ht=rt.getContext(\"2d\"),tt=t(c,c),ct=tt.getContext(\"2d\"),ni=function(n){n.textAlign=\"center\",n.textBaseline=\"middle\",n.save(),n.strokeStyle=p.labelColor.getRgbaColor(),n.fillStyle=p.labelColor.getRgbaColor(),n.translate(l,a);var r,t;for(i=0;360>i;i++){n.strokeStyle=p.labelColor.getRgbaColor(),n.lineWidth=.5,n.beginPath(),n.moveTo(f*.38,0),n.lineTo(f*.37,0),n.closePath(),n.stroke(),0==i%5&&(n.strokeStyle=p.labelColor.getRgbaColor(),n.lineWidth=1,n.beginPath(),n.moveTo(f*.38,0),n.lineTo(f*.36,0),n.closePath(),n.stroke()),0==i%45&&(n.strokeStyle=p.labelColor.getRgbaColor(),n.lineWidth=1,n.beginPath(),n.moveTo(f*.38,0),n.lineTo(f*.34,0),n.closePath(),n.stroke()),300<f&&(r=\"14px sans-serif\",t=\"12px sans-serif\"),300<f||(r=\"12px sans-serif\",t=\"10px sans-serif\"),200<f||(r=\"10px sans-serif\",t=\"8px sans-serif\"),100<f||(r=\"8px sans-serif\",t=\"6px sans-serif\"),n.save();switch(i){case 0:n.translate(f*.31,0),n.rotate(i*Math.PI/180+Math.PI/2),n.font=r,n.fillText(\"0\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)+Math.PI/2),n.translate(-f*.31,0),n.translate(f*.41,0),n.rotate(i*Math.PI/180-Math.PI/2),n.font=t,n.fillText(\"0%\",0,0,f);break;case 45:n.translate(f*.31,0),n.rotate(i*Math.PI/180+.25*Math.PI),n.font=r,n.fillText(\"45\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)+.25*Math.PI),n.translate(-f*.31,0),n.translate(f*.31,f*.085),n.rotate(i*Math.PI/180-.25*Math.PI),n.font=t,n.fillText(\"100%\",0,0,f);break;case 90:n.translate(f*.31,0),n.rotate(i*Math.PI/180),n.font=r,n.fillText(\"90\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)),n.translate(-f*.31,0),n.translate(f*.21,0),n.rotate(i*Math.PI/180),n.font=t,n.fillText(\"\\u221e\",0,0,f);break;case 135:n.translate(f*.31,0),n.rotate(i*Math.PI/180-.25*Math.PI),n.font=r,n.fillText(\"45\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)-.25*Math.PI),n.translate(-f*.31,0),n.translate(f*.31,-f*.085),n.rotate(i*Math.PI/180+.25*Math.PI),n.font=t,n.fillText(\"100%\",0,0,f);break;case 180:n.translate(f*.31,0),n.rotate(i*Math.PI/180-Math.PI/2),n.font=r,n.fillText(\"0\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)-Math.PI/2),n.translate(-f*.31,0),n.translate(f*.41,0),n.rotate(i*Math.PI/180+Math.PI/2),n.font=t,n.fillText(\"0%\",0,0,f),n.translate(-f*.41,0);break;case 225:n.translate(f*.31,0),n.rotate(i*Math.PI/180-.75*Math.PI),n.font=r,n.fillText(\"45\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)-.75*Math.PI),n.translate(-f*.31,0),n.translate(f*.31,f*.085),n.rotate(i*Math.PI/180+.75*Math.PI),n.font=t,n.fillText(\"100%\",0,0,f);break;case 270:n.translate(f*.31,0),n.rotate(i*Math.PI/180-Math.PI),n.font=r,n.fillText(\"90\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)-Math.PI),n.translate(-f*.31,0),n.translate(f*.21,0),n.rotate(i*Math.PI/180-Math.PI),n.font=t,n.fillText(\"\\u221e\",0,0,f);break;case 315:n.translate(f*.31,0),n.rotate(i*Math.PI/180-1.25*Math.PI),n.font=r,n.fillText(\"45\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)-1.25*Math.PI),n.translate(-f*.31,0),n.translate(f*.31,-f*.085),n.rotate(i*Math.PI/180+1.25*Math.PI),n.font=t,n.fillText(\"100%\",0,0,f)}n.restore(),n.rotate(kt)}n.translate(-l,-a),n.restore()},ti=function(n){n.save(),n.strokeStyle=p.labelColor.getRgbaColor(),n.fillStyle=p.labelColor.getRgbaColor(),n.save(),n.beginPath(),n.moveTo(f*.200934,o*.434579),n.lineTo(f*.163551,o*.434579),n.lineTo(f*.163551,o*.560747),n.lineTo(f*.200934,o*.560747),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.stroke(),n.save(),n.beginPath(),n.moveTo(f*.163551,o*.471962),n.lineTo(f*.205607,o*.5),n.lineTo(f*.163551,o*.523364),n.lineTo(f*.163551,o*.471962),n.closePath(),n.fill(),n.save(),n.beginPath(),n.moveTo(f*.799065,o*.434579),n.lineTo(f*.836448,o*.434579),n.lineTo(f*.836448,o*.560747),n.lineTo(f*.799065,o*.560747),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.stroke(),n.save(),n.beginPath(),n.moveTo(f*.836448,o*.471962),n.lineTo(f*.794392,o*.5),n.lineTo(f*.836448,o*.523364),n.lineTo(f*.836448,o*.471962),n.closePath(),n.fill(),n.restore()},ii=function(n){var u;n.save(),n.save(),n.beginPath(),n.moveTo(f*.523364,o*.350467),n.lineTo(f*.5,o*.130841),n.lineTo(f*.476635,o*.350467),n.bezierCurveTo(f*.476635,o*.350467,f*.490654,o*.345794,f*.5,o*.345794),n.bezierCurveTo(f*.509345,o*.345794,f*.523364,o*.350467,f*.523364,o*.350467),n.closePath();var t=n.createLinearGradient(0,.154205*o,0,.350466*o),r=b.dark,i=b.light;r.setAlpha(.70588),i.setAlpha(.70588),t.addColorStop(0,r.getRgbaColor()),t.addColorStop(.3,i.getRgbaColor()),t.addColorStop(.59,i.getRgbaColor()),t.addColorStop(1,r.getRgbaColor()),n.fillStyle=t,u=b.light.getRgbaColor(),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.strokeStyle=u,n.fill(),n.stroke(),r.setAlpha(1),i.setAlpha(1),n.restore()},dt=function(n){var i,t,u,s,r,e;n.save(),i=b.dark,t=b.light,i.setAlpha(.70588),t.setAlpha(.70588),n.save(),n.beginPath(),n.moveTo(f*.285046,o*.514018),n.lineTo(f*.21028,o*.5),n.lineTo(f*.285046,o*.481308),n.bezierCurveTo(f*.285046,o*.481308,f*.280373,o*.490654,f*.280373,o*.495327),n.bezierCurveTo(f*.280373,o*.504672,f*.285046,o*.514018,f*.285046,o*.514018),n.closePath(),u=n.createLinearGradient(.224299*f,0,.289719*f,0),u.addColorStop(0,i.getRgbaColor()),u.addColorStop(.3,t.getRgbaColor()),u.addColorStop(.59,t.getRgbaColor()),u.addColorStop(1,i.getRgbaColor()),n.fillStyle=u,s=b.light.getRgbaColor(),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.strokeStyle=s,n.fill(),n.stroke(),n.save(),n.beginPath(),n.moveTo(f*.714953,o*.514018),n.lineTo(f*.789719,o*.5),n.lineTo(f*.714953,o*.481308),n.bezierCurveTo(f*.714953,o*.481308,f*.719626,o*.490654,f*.719626,o*.495327),n.bezierCurveTo(f*.719626,o*.504672,f*.714953,o*.514018,f*.714953,o*.514018),n.closePath(),r=n.createLinearGradient(.7757*f,0,.71028*f,0),r.addColorStop(0,i.getRgbaColor()),r.addColorStop(.3,t.getRgbaColor()),r.addColorStop(.59,t.getRgbaColor()),r.addColorStop(1,i.getRgbaColor()),n.fillStyle=r,e=b.light.getRgbaColor(),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.strokeStyle=e,n.fill(),n.stroke(),i.setAlpha(1),t.setAlpha(1),n.restore()},it=function(){pt=!0,at&&v(ut,bt,l,a,f,o),vt&&(w(ut,p,l,a,f,o),ni(ut)),ti(et),ii(et),dt(ht),yt&&y(ct,lt,f,o,!1)},ft=function(){g.width=c,g.height=c,ut=g.getContext(\"2d\"),nt.width=c,nt.height=c,et=nt.getContext(\"2d\"),rt.width=c,rt.height=c,ht=rt.getContext(\"2d\"),tt.width=c,tt.height=c,ct=tt.getContext(\"2d\")};return this.setValue=function(n){var t;t=0>n?360+n:n,t=359.9<n?n-360:n,e!==t&&(e=t,k=2*(Math.abs(e)*10%10),10<k&&(k-=20),0===e&&(h=90),0<e&&90>=e&&(h=90-e),90<e&&180>=e&&(h=e-90),180<e&&270>=e&&(h=270-e),270<e&&360>=e&&(h=e-270),0>e&&e>=-90&&(h=90-Math.abs(e)),e<-90&&e>=-180&&(h=Math.abs(e)-90),e<-180&&e>=-270&&(h=270-Math.abs(e)),e<-270&&e>=-360&&(h=Math.abs(e)-270),this.repaint())},this.getValue=function(){return e},this.setValueAnimated=function(n){360-n+e<n-e&&(n=360-n);if(e!==n){undefined!==d&&d.playing&&d.stop(),d=new Tween({},\"\",Tween.regularEaseInOut,e,n,1);var t=this;d.onMotionChanged=function(n){e=n.target._pos,k=2*(Math.abs(e)*10%10),10<k&&(k-=20),0===e&&(h=90),0<e&&90>=e&&(h=90-e),90<e&&180>=e&&(h=e-90),180<e&&270>=e&&(h=270-e),270<e&&360>=e&&(h=e-270),0>e&&e>=-90&&(h=90-Math.abs(e)),e<-90&&e>=-180&&(h=Math.abs(e)-90),e<-180&&e>=-270&&(h=270-Math.abs(e)),e<-270&&e>=-360&&(h=Math.abs(e)-270),t.repaint()},d.start()}},this.setFrameDesign=function(n){ft(),bt=n,it(),this.repaint()},this.setBackgroundColor=function(n){ft(),p=n,it(),this.repaint()},this.setForegroundType=function(n){ft(),lt=n,it(),this.repaint()},this.setPointerColor=function(n){ft(),b=n,it(),this.repaint()},this.repaint=function(){pt||it(),s.save(),s.clearRect(0,0,s.canvas.width,s.canvas.height),(at||vt)&&s.drawImage(g,0,0),ot=Math.PI/2+e*kt-Math.PI/2,s.save(),s.translate(l,a),s.rotate(ot),s.translate(-l,-a),s.drawImage(nt,0,0),s.fillStyle=p.labelColor.getRgbaColor(),s.textAlign=\"center\",s.textBaseline=\"middle\",gt?(s.restore(),s.font=st?f*.1+\"px sans-serif\":f*.15+\"px sans-serif\",s.fillText(h.toFixed(wt)+\"\\u00b0\",l,a,f*.35)):(s.font=st?f*.15+\"px sans-serif\":f*.2+\"px sans-serif\",s.fillText(h.toFixed(wt)+\"\\u00b0\",l,a,f*.35),s.restore()),s.translate(l,a),s.rotate(ot+k*Math.PI/180),s.translate(-l,-a),s.drawImage(rt,0,0),s.restore(),yt&&s.drawImage(tt,0,0),s.restore()},this.repaint(),this},gr=function(n,u){u=u||{};var o=undefined===u.size?200:u.size,pt=undefined===u.frameDesign?steelseries.FrameDesign.METAL:u.frameDesign,ct=undefined===u.frameVisible?!0:u.frameVisible,tt=undefined===u.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:u.backgroundColor,dt=undefined===u.backgroundVisible?!0:u.backgroundVisible,bt=undefined===u.pointerType?steelseries.PointerType.TYPE2:u.pointerType,h=undefined===u.pointerColor?steelseries.ColorDef.RED:u.pointerColor,ei=undefined===u.knobType?steelseries.KnobType.STANDARD_KNOB:u.knobType,ui=undefined===u.knobStyle?steelseries.KnobStyle.SILVER:u.knobStyle,gt=undefined===u.foregroundType?steelseries.ForegroundType.TYPE1:u.foregroundType,at=undefined===u.foregroundVisible?!0:u.foregroundVisible,c=undefined===u.pointSymbols?[\"N\",\"NE\",\"E\",\"SE\",\"S\",\"SW\",\"W\",\"NW\"]:u.pointSymbols,fi=undefined===u.customLayer?null:u.customLayer,ii=undefined===u.degreeScale?!1:u.degreeScale,yt=undefined===u.roseVisible?!0:u.roseVisible,d,p=0,st=Math.PI/180,ht=this.value,s=r.getElementById(n).getContext(\"2d\");s.save(),s.clearRect(0,0,s.canvas.width,s.canvas.height),s.canvas.width=o,s.canvas.height=o;var f=o,e=o,a=f/2,l=e/2,kt=!1,ft=t(o,o),g=ft.getContext(\"2d\"),ut=t(o,o),ti=ut.getContext(\"2d\"),it=t(o,o),lt=it.getContext(\"2d\"),ot=t(o,o),b=ot.getContext(\"2d\"),et=t(o,o),vt=et.getContext(\"2d\"),ri=function(n){var t,r,u;n.textAlign=\"center\",n.textBaseline=\"middle\",n.save(),n.strokeStyle=tt.labelColor.getRgbaColor(),n.fillStyle=tt.labelColor.getRgbaColor(),n.translate(a,l);if(ii)for(t=.08*f+\"px serif\",r=f*.033+\"px serif\",n.rotate(st*10),i=10;360>=i;i+=10){n.save();switch(i){case 360:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[2],0,0,f),n.translate(-f*.35,0);break;case 90:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[4],0,0,f),n.translate(-f*.35,0);break;case 180:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[6],0,0,f),n.translate(-f*.35,0);break;case 270:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[0],0,0,f),n.translate(-f*.35,0);break;default:u=(i+90)%360,n.translate(f*.37,0),n.rotate(Math.PI/2),n.font=r,n.fillText(\"0\".substring(u>=100)+u,0,0,f),n.translate(-f*.37,0)}n.restore(),n.rotate(st*10)}else for(t=.12*f+\"px serif\",r=.06*f+\"px serif\",i=0;360>i;i+=2.5){0==i%5&&(n.lineWidth=1,n.beginPath(),n.moveTo(f*.38,0),n.lineTo(f*.36,0),n.closePath(),n.stroke()),n.save();switch(i){case 0:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[2],0,0,f),n.translate(-f*.35,0);break;case 45:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=r,n.fillText(c[3],0,0,f),n.translate(-f*.29,0);break;case 90:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[4],0,0,f),n.translate(-f*.35,0);break;case 135:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=r,n.fillText(c[5],0,0,f),n.translate(-f*.29,0);break;case 180:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[6],0,0,f),n.translate(-f*.35,0);break;case 225:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=r,n.fillText(c[7],0,0,f),n.translate(-f*.29,0);break;case 270:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[0],0,0,f),n.translate(-f*.35,0);break;case 315:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=r,n.fillText(c[1],0,0,f),n.translate(-f*.29,0)}n.restore(),yt&&(0===i||22.5===i||45===i||67.5===i||90===i||112.5===i||135===i||157.5===i||180===i||202.5===i||225===i||247.5===i||270===i||292.5===i||315===i||337.5===i||360===i)&&(n.save(),n.beginPath(),i%45?n.moveTo(f*.29,0):n.moveTo(f*.38,0),n.lineTo(f*.1,0),n.closePath(),n.restore(),n.lineWidth=1,n.strokeStyle=tt.symbolColor.getRgbaColor(),n.stroke()),n.rotate(st*2.5)}n.translate(-a,-l),n.restore()},wt=function(n,t){var o,s,l,i,r,u,c;n.save(),t&&(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\");switch(bt.type){case\"type2\":n.beginPath(),n.moveTo(f*.53271,e*.453271),n.bezierCurveTo(f*.53271,e*.453271,f*.5,e*.149532,f*.5,e*.149532),n.bezierCurveTo(f*.5,e*.149532,f*.467289,e*.453271,f*.467289,e*.453271),n.bezierCurveTo(f*.453271,e*.462616,f*.443925,e*.481308,f*.443925,e*.5),n.bezierCurveTo(f*.443925,e*.5,f*.556074,e*.5,f*.556074,e*.5),n.bezierCurveTo(f*.556074,e*.481308,f*.546728,e*.462616,f*.53271,e*.453271),n.closePath(),t||(o=n.createLinearGradient(.471962*f,0,.528036*f,0),o.addColorStop(0,h.light.getRgbaColor()),o.addColorStop(.46,h.light.getRgbaColor()),o.addColorStop(.47,h.medium.getRgbaColor()),o.addColorStop(1,h.medium.getRgbaColor()),n.fillStyle=o,n.strokeStyle=h.dark.getRgbaColor()),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.fill(),n.stroke(),n.beginPath(),n.moveTo(f*.467289,e*.546728),n.bezierCurveTo(f*.467289,e*.546728,f*.5,e*.850467,f*.5,e*.850467),n.bezierCurveTo(f*.5,e*.850467,f*.53271,e*.546728,f*.53271,e*.546728),n.bezierCurveTo(f*.546728,e*.537383,f*.556074,e*.518691,f*.556074,e*.5),n.bezierCurveTo(f*.556074,e*.5,f*.443925,e*.5,f*.443925,e*.5),n.bezierCurveTo(f*.443925,e*.518691,f*.453271,e*.537383,f*.467289,e*.546728),n.closePath(),t||(s=n.createLinearGradient(.471962*f,0,.528036*f,0),s.addColorStop(0,\"#e3e5e8\"),s.addColorStop(.48,\"#e3e5e8\"),s.addColorStop(.48,\"#abb1b8\"),s.addColorStop(1,\"#abb1b8\"),n.fillStyle=s,l=\"#abb1b8\",n.strokeStyle=l),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.fill(),n.stroke();break;case\"type3\":n.beginPath(),n.moveTo(f*.5,e*.149532),n.bezierCurveTo(f*.5,e*.149532,f*.443925,e*.490654,f*.443925,e*.5),n.bezierCurveTo(f*.443925,e*.53271,f*.467289,e*.556074,f*.5,e*.556074),n.bezierCurveTo(f*.53271,e*.556074,f*.556074,e*.53271,f*.556074,e*.5),n.bezierCurveTo(f*.556074,e*.490654,f*.5,e*.149532,f*.5,e*.149532),n.closePath(),t||(i=n.createLinearGradient(.471962*f,0,.528036*f,0),i.addColorStop(0,h.light.getRgbaColor()),i.addColorStop(.46,h.light.getRgbaColor()),i.addColorStop(.47,h.medium.getRgbaColor()),i.addColorStop(1,h.medium.getRgbaColor()),n.fillStyle=i,n.strokeStyle=h.dark.getRgbaColor()),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.fill(),n.stroke();break;case\"type1:\":default:n.beginPath(),n.moveTo(f*.5,e*.495327),n.lineTo(f*.528037,e*.495327),n.lineTo(f*.5,e*.149532),n.lineTo(f*.471962,e*.495327),n.lineTo(f*.5,e*.495327),n.closePath(),t||(r=n.createLinearGradient(.471962*f,0,.528036*f,0),r.addColorStop(0,h.light.getRgbaColor()),r.addColorStop(.46,h.light.getRgbaColor()),r.addColorStop(.47,h.medium.getRgbaColor()),r.addColorStop(1,h.medium.getRgbaColor()),n.fillStyle=r,n.strokeStyle=h.dark.getRgbaColor()),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.fill(),n.stroke(),n.beginPath(),n.moveTo(f*.5,e*.504672),n.lineTo(f*.471962,e*.504672),n.lineTo(f*.5,e*.850467),n.lineTo(f*.528037,e*.504672),n.lineTo(f*.5,e*.504672),n.closePath(),t||(u=n.createLinearGradient(.471962*f,0,.528036*f,0),u.addColorStop(0,\"#e3e5e8\"),u.addColorStop(.48,\"#e3e5e8\"),u.addColorStop(.480099,\"#abb1b8\"),u.addColorStop(1,\"#abb1b8\"),n.fillStyle=u,c=\"#abb1b8\",n.strokeStyle=c),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.fill(),n.stroke()}t&&blur(n,f,e,Math.floor(f*.006)),n.restore()},k=function(){kt=!0,ct&&v(g,pt,a,l,f,e),dt&&(w(g,tt,a,l,f,e),rt(g,fi,a,l,f,e),yt&&hi(g,a,l,f,e,tt),ri(g)),wt(ti,!1),wt(lt,!0),at&&y(vt,gt,f,e,!0,ei,ui)},nt=function(){ft.width=o,ft.height=o,g=ft.getContext(\"2d\"),ut.width=o,ut.height=o,ti=ut.getContext(\"2d\"),it.width=o,it.height=o,lt=it.getContext(\"2d\"),ot.width=o,ot.height=o,b=ot.getContext(\"2d\"),et.width=o,et.height=o,vt=et.getContext(\"2d\")};return this.setValue=function(n){n=n%360,p!==n&&(p=n,this.repaint())},this.getValue=function(){return p},this.setValueAnimated=function(n){var i=n%360,r=this,t;p!==i&&(undefined!==d&&d.playing&&d.stop(),t=ni(p,i),d=new Tween({},\"\",Tween.elasticEaseOut,p,p+t,2),d.onMotionChanged=function(n){p=n.target._pos%360,r.repaint()},d.start())},this.setFrameDesign=function(n){nt(),pt=n,k(),this.repaint()},this.setBackgroundColor=function(n){nt(),tt=n,k(),this.repaint()},this.setForegroundType=function(n){nt(),gt=n,k(),this.repaint()},this.setPointerColor=function(n){nt(),h=n,k(),this.repaint()},this.setPointerType=function(n){nt(),bt=n,k(),this.repaint()},this.setPointSymbols=function(n){nt(),c=n,k(),this.repaint()},this.repaint=function(){kt||k(),s.clearRect(0,0,s.canvas.width,s.canvas.height),(ct||dt)&&s.drawImage(ft,0,0),ht=Math.PI/2+p*st-Math.PI/2;var n=f*.006;b.clearRect(0,0,f,e),b.save(),b.translate(a,l),b.rotate(ht),b.translate(-a,-l),b.drawImage(it,0,0),b.restore(),s.drawImage(ot,0,0,f,e,n,n,f+n,e+n),s.save(),s.translate(a,l),s.rotate(ht),s.translate(-a,-l),s.drawImage(ut,0,0),s.restore(),at&&s.drawImage(et,0,0),s.restore()},this.repaint(),this},iu=function(n,u){u=u||{};var o=undefined===u.size?200:u.size,pi=undefined===u.frameDesign?steelseries.FrameDesign.METAL:u.frameDesign,di=undefined===u.frameVisible?!0:u.frameVisible,k=undefined===u.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:u.backgroundColor,gi=undefined===u.backgroundVisible?!0:u.backgroundVisible,dt=undefined===u.pointerTypeLatest?steelseries.PointerType.TYPE1:u.pointerTypeLatest,ri=undefined===u.pointerTypeAverage?steelseries.PointerType.TYPE8:u.pointerTypeAverage,kt=undefined===u.pointerColor?steelseries.ColorDef.RED:u.pointerColor,ii=undefined===u.pointerColorAverage?steelseries.ColorDef.BLUE:u.pointerColorAverage,kr=undefined===u.knobType?steelseries.KnobType.STANDARD_KNOB:u.knobType,dr=undefined===u.knobStyle?steelseries.KnobStyle.SILVER:u.knobStyle,si=undefined===u.foregroundType?steelseries.ForegroundType.TYPE1:u.foregroundType,ir=undefined===u.foregroundVisible?!0:u.foregroundVisible,a=undefined===u.pointSymbols?[\"N\",\"NE\",\"E\",\"SE\",\"S\",\"SW\",\"W\",\"NW\"]:u.pointSymbols,vr=undefined===u.customLayer?null:u.customLayer,wr=undefined===u.degreeScale?!0:u.degreeScale,nr=undefined===u.roseVisible?!1:u.roseVisible,ht=undefined===u.lcdColor?steelseries.LcdColor.STANDARD:u.lcdColor,fr=undefined===u.lcdVisible?!0:u.lcdVisible,pr=undefined===u.digitalFont?!1:u.digitalFont,et=undefined===u.section?null:u.section,ft=undefined===u.area?null:u.area,ti=undefined===u.lcdTitleStrings?[\"Latest\",\"Average\"]:u.lcdTitleStrings,rr=undefined===u.titleString?\"\":u.titleString,tr=undefined===u.useColorLabels?!1:u.useColorLabels,ut,st,it=0,g=0,ct=Math.PI/180,ei=this.valueLatest,fi=this.valueAverage,ar=-Math.PI/2,bi=Math.PI*2,ur=360,e=r.getElementById(n).getContext(\"2d\");e.save(),e.clearRect(0,0,e.canvas.width,e.canvas.height),e.canvas.width=o,e.canvas.height=o;var f=o,s=o,c=f/2,h=s/2,ui=Math.floor(f/10),br=ui+\"px sans-serif\",gr=ui+\"px \"+tt,gt=f*.3,er=s*.12,hr=(f-gt)/2,or=s*.32,cr=s*.565,sr=!1,bt=t(o,o),d=bt.getContext(\"2d\"),oi,at=t(o,o),ci=at.getContext(\"2d\"),vt=t(o,o),li=vt.getContext(\"2d\"),yt=t(o,o),ai=yt.getContext(\"2d\"),lt=t(o,o),ki=lt.getContext(\"2d\"),ot=t(o,o),l=ot.getContext(\"2d\"),wt=t(o,o),yi=wt.getContext(\"2d\"),vi=function(n,t){e.save(),e.textAlign=\"center\",e.strokeStyle=ht.textColor,e.fillStyle=ht.textColor,n<0&&(n+=360),n=\"00\"+Math.round(n),n=n.substring(n.length,n.length-3),(ht===steelseries.LcdColor.STANDARD||ht===steelseries.LcdColor.STANDARD_GREEN)&&(e.shadowColor=\"gray\",e.shadowOffsetX=f*.007,e.shadowOffsetY=f*.007,e.shadowBlur=f*.007),e.font=pr?gr:br,e.fillText(n+\"\\u00b0\",f/2+gt*.05,(t?or:cr)+er*.5+ui*.38,gt*.9),e.restore()},wi=function(n,t,i,r,u){n.save(),n.strokeStyle=r,n.fillStyle=r,n.lineWidth=f*.035;var e=bi/ur*t,o=e+(i-t)/(ur/bi);n.translate(c,h),n.rotate(ar),n.beginPath(),u?(n.moveTo(0,0),n.arc(0,0,f*.365-n.lineWidth/2,e,o,!1)):n.arc(0,0,f*.365,e,o,!1),u?(n.moveTo(0,0),n.fill()):n.stroke(),n.translate(-c,-h),n.restore()},lr=function(n){var l,o;n.textAlign=\"center\",n.textBaseline=\"middle\";var s=f*.38,v=f*.35,w=f*.355,p=f*.36,e=f*.1,y=f*.31,r=f*.36,t,u;n.save(),n.strokeStyle=k.labelColor.getRgbaColor(),n.fillStyle=k.labelColor.getRgbaColor(),n.translate(c,h);if(wr)for(t=Math.floor(.1*f)+\"px serif bold\",u=Math.floor(f*.04)+\"px sans-serif\",n.rotate(ct*5),i=5;360>=i;i+=5){n.save();switch(i){case 360:n.translate(r,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[2],0,0,e),n.translate(-r,0);break;case 90:n.translate(r,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[4],0,0,e),n.translate(-r,0);break;case 180:n.translate(r,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[6],0,0,e),n.translate(-r,0);break;case 270:n.translate(r,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[0],0,0,e),n.translate(-r,0);break;case 5:case 85:case 95:case 175:case 185:case 265:case 275:case 355:break;default:(i+90)%20?(n.lineWidth=(i+90)%5?1.5:1,n.beginPath(),n.moveTo(s,0),l=(i+90)%10?p:v,n.lineTo(l,0),n.closePath(),n.stroke()):(n.lineWidth=1.5,n.beginPath(),n.moveTo(s,0),n.lineTo(v,0),n.closePath(),n.stroke(),o=(i+90)%360,n.translate(y,0),n.rotate(Math.PI/2),n.font=u,n.fillText(\"0\".substring(o>=100)+o,0,0,e),n.translate(-y,0))}n.restore(),n.rotate(ct*5)}else for(t=.12*f+\"px serif\",u=.06*f+\"px serif\",n.lineWidth=1,n.strokeStyle=k.symbolColor.getRgbaColor(),i=0;360>i;i+=2.5){0==i%5&&(n.beginPath(),n.moveTo(f*.38,0),n.lineTo(f*.36,0),n.closePath(),n.stroke()),n.save();switch(i){case 0:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[2],0,0),n.translate(-f*.35,0);break;case 45:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=u,n.fillText(a[3],0,0),n.translate(-f*.29,0);break;case 90:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[4],0,0),n.translate(-f*.35,0);break;case 135:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=u,n.fillText(a[5],0,0),n.translate(-f*.29,0);break;case 180:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[6],0,0),n.translate(-f*.35,0);break;case 225:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=u,n.fillText(a[7],0,0),n.translate(-f*.29,0);break;case 270:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[0],0,0),n.translate(-f*.35,0);break;case 315:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=u,n.fillText(a[1],0,0),n.translate(-f*.29,0)}n.restore(),nr&&(0===i||22.5===i||45===i||67.5===i||90===i||112.5===i||135===i||157.5===i||180===i||202.5===i||225===i||247.5===i||270===i||292.5===i||315===i||337.5===i||360===i)&&(n.save(),n.beginPath(),i%45?n.moveTo(f*.29,0):n.moveTo(f*.38,0),n.lineTo(f*.1,0),n.closePath(),n.restore(),n.stroke()),n.rotate(ct*2.5)}n.translate(-c,-h),n.restore()},yr=function(n){ti.length>0&&(n.save(),n.textAlign=\"center\",n.textBaseline=\"middle\",n.fillStyle=tr?kt.medium.getRgbaColor():k.labelColor.getRgbaColor(),n.font=.04*f+\"px sans-serif\",n.fillText(ti[0],f/2,s*.29,f*.3),n.fillStyle=tr?ii.medium.getRgbaColor():k.labelColor.getRgbaColor(),n.fillText(ti[1],f/2,s*.71,f*.3),rr.length>0&&(n.fillStyle=k.labelColor.getRgbaColor(),n.font=.0467*f+\"px sans-serif\",n.fillText(rr,f/2,s*.5,f*.3)))},b=function(n){var t,i,u;n=n||{};var o=undefined===n.frame?!1:n.frame,r=undefined===n.background?!1:n.background,e=undefined===n.pointer?!1:n.pointer,l=undefined===n.foreground?!1:n.foreground;sr=!0,o&&di&&v(d,pi,c,h,f,s);if(r&&gi){w(d,k,c,h,f,s),rt(d,vr,c,h,f,s);if(null!==et&&0<et.length){t=et.length;do t--,wi(d,et[t].start,et[t].stop,et[t].color,!1);while(0<t)}if(null!==ft&&0<ft.length){i=ft.length;do i--,wi(d,ft[i].start,ft[i].stop,ft[i].color,!0);while(0<i)}lr(d)}r&&nr&&hi(d,c,h,f,s,k),r&&fr&&(oi=p(gt,er,ht),d.drawImage(oi,hr,or),d.drawImage(oi,hr,cr),yr(d)),e&&(nt(ai,f,ri,ii,k.labelColor),nt(ki,f,ri,kt,k.labelColor,!0),nt(ci,f,dt,kt,k.labelColor),nt(li,f,dt,kt,k.labelColor,!0)),l&&ir&&(u=dt.type===\"type15\"||dt.type===\"type16\"?!1:!0,y(yi,si,f,s,u,kr,dr))},pt=function(n){n=n||{};var r=undefined===n.background?!1:n.background,i=undefined===n.pointer?!1:n.pointer,t=undefined===n.foreground?!1:n.foreground;r&&(bt.width=o,bt.height=o,d=bt.getContext(\"2d\")),i&&(at.width=o,at.height=o,ci=at.getContext(\"2d\"),vt.width=o,vt.height=o,li=vt.getContext(\"2d\"),yt.width=o,yt.height=o,ai=yt.getContext(\"2d\"),lt.width=o,lt.height=o,ki=lt.getContext(\"2d\"),ot.width=o,ot.height=o,l=ot.getContext(\"2d\")),t&&(wt.width=o,wt.height=o,yi=wt.getContext(\"2d\"))};return this.setValueLatest=function(n){n=n===360?360:n%360,it!==n&&(it=n,this.repaint())},this.getValueLatest=function(){return it},this.setValueAverage=function(n){n=n%360,g!==n&&(g=n,this.repaint())},this.getValueAverage=function(){return g},this.setValueAnimatedLatest=function(n){var t=n===360?360:n%360,i,r;it!==t&&(i=this,undefined!==ut&&ut.playing&&ut.stop(),r=ni(it,t),ut=new Tween({},\"\",Tween.regularEaseInOut,it,it+r,2.5),ut.onMotionChanged=function(n){it=n.target._pos%360,i.repaint()},t===360&&(ut.onMotionFinished=function(){it=t,i.repaint()}),ut.start())},this.setValueAnimatedAverage=function(n){var i=n===360?360:n%360,t,r;g!==n&&(t=this,undefined!==st&&st.playing&&st.stop(),r=ni(g,i),st=new Tween({},\"\",Tween.regularEaseInOut,g,g+r,2.5),st.onMotionChanged=function(n){g=n.target._pos%360,t.repaint()},i===360&&(ut.onMotionFinished=function(){g=i,t.repaint()}),st.start())},this.setArea=function(n){ft=n,b({background:!0}),this.repaint()},this.setSection=function(n){et=n,b({background:!0}),this.repaint()},this.setFrameDesign=function(n){pi=n,b({frame:!0,background:!0}),this.repaint()},this.setBackgroundColor=function(n){k=n,b({frame:!0,background:!0}),this.repaint()},this.setForegroundType=function(n){pt({foreground:!0}),si=n,b({foreground:!0}),this.repaint()},this.setPointerColor=function(n){pt({pointer:!0}),kt=n,b({pointer:!0}),this.repaint()},this.setPointerColorAverage=function(n){pt({pointer:!0}),ii=n,b({pointer:!0}),this.repaint()},this.setPointerType=function(n){pt({pointer:!0}),dt=n,b({pointer:!0}),this.repaint()},this.setPointerTypeAverage=function(n){pt({pointer:!0}),ri=n,b({pointer:!0}),this.repaint()},this.setPointSymbols=function(n){a=n,b({frame:!0,background:!0}),this.repaint()},this.setLcdColor=function(n){ht=n,b({background:!0}),this.repaint()},this.setLcdTitleStrings=function(n){ti=n,b({background:!0}),this.repaint()},this.repaint=function(){sr||b({frame:!0,background:!0,led:!0,pointer:!0,foreground:!0}),e.clearRect(0,0,e.canvas.width,e.canvas.height),(di||gi)&&e.drawImage(bt,0,0),fr&&(vi(it,!0),vi(g,!1)),fi=Math.PI/2+g*ct-Math.PI/2;var n=f*.006;l.clearRect(0,0,f,s),l.save(),l.translate(c,h),l.rotate(fi),l.translate(-c,-h),l.drawImage(lt,0,0),l.restore(),e.drawImage(ot,0,0,f,s,n,n,f+n,s+n),e.save(),e.translate(c,h),e.rotate(fi),e.translate(-c,-h),e.drawImage(yt,0,0),e.restore(),ei=Math.PI/2+it*ct-Math.PI/2,l.clearRect(0,0,f,s),l.save(),l.translate(c,h),l.rotate(ei),l.translate(-c,-h),l.drawImage(vt,0,0),l.restore(),e.drawImage(ot,0,0,f,s,n,n,f+n,s+n),e.save(),e.translate(c,h),e.rotate(ei),e.translate(-c,-h),e.drawImage(at,0,0),e.restore(),ir&&e.drawImage(wt,0,0)},this.repaint(),this},ru=function(n,i){i=i||{};var o=undefined===i.size?200:i.size,lt=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,vt=undefined===i.frameVisible?!0:i.frameVisible,st=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,yt=undefined===i.foregroundVisible?!0:i.foregroundVisible,nt=undefined===i.pointerColor?steelseries.ColorDef.WHITE:i.pointerColor,w,b,h=0,s=0,ot=Math.PI*o/360,et=0,g=!1,e=r.getElementById(n).getContext(\"2d\");e.save(),e.clearRect(0,0,e.canvas.width,e.canvas.height),e.canvas.width=o,e.canvas.height=o;var u=o,f=o,l=u/2,c=f/2,ct=!1,k=t(o,o),ht=k.getContext(\"2d\"),p=t(o,o*Math.PI),ft=p.getContext(\"2d\"),a=t(o*.037383,o*.056074),ut=a.getContext(\"2d\"),d=t(o,o),tt=d.getContext(\"2d\"),pt=function(n){var t,u,i,f,h;n.save(),t=o,u=o*Math.PI,n.beginPath(),n.rect(0,0,t,u),n.closePath(),f=n.createLinearGradient(0,0,0,u),f.addColorStop(0,\"#7fd5f0\"),f.addColorStop(.5,\"#7fd5f0\"),f.addColorStop(.5,\"#3c4439\"),f.addColorStop(1,\"#3c4439\"),n.fillStyle=f,n.fill(),n.lineWidth=1;var s=u/72,e=!1,r=10;for(n.textAlign=\"center\",n.textBaseline=\"middle\",h=t*.04,n.font=h+\"px sans-serif\",n.fillStyle=\"#37596e\",i=u/2-s;i>0;i-=s)r>90||(e?(n.fillText(r,(t-t*.2)/2-8,i,t*.375),n.fillText(r,t-(t-t*.2)/2+8,i,t*.375),n.beginPath(),n.moveTo((t-t*.2)/2,i),n.lineTo(t-(t-t*.2)/2,i),n.closePath(),r+=10):(n.beginPath(),n.moveTo((t-t*.1)/2,i),n.lineTo(t-(t-t*.1)/2,i),n.closePath()),n.stroke()),e^=!0;for(e=!1,r=10,n.strokeStyle=\"#FFFFFF\",n.lineWidth=1.5,n.beginPath(),n.moveTo(0,u/2),n.lineTo(t,u/2),n.closePath(),n.stroke(),n.fillStyle=\"#FFFFFF\",n.lineWidth=1,i=u/2+s;i<=u;i+=s)r>90||(e?(n.fillText(-r,(t-t*.2)/2-8,i,t*.375),n.fillText(-r,t-(t-t*.2)/2+8,i,t*.375),n.beginPath(),n.moveTo((t-t*.2)/2,i),n.lineTo(t-(t-t*.2)/2,i),n.closePath(),r+=10):(n.beginPath(),n.moveTo((t-t*.1)/2,i),n.lineTo(t-(t-t*.1)/2,i),n.closePath()),n.stroke()),e^=!0;n.restore()},wt=function(n){var i,r,t;for(n.save(),n.fillStyle=nt.light.getRgbaColor(),n.beginPath(),n.moveTo(u*.476635,f*.5),n.bezierCurveTo(u*.476635,f*.514018,u*.485981,f*.523364,u*.5,f*.523364),n.bezierCurveTo(u*.514018,f*.523364,u*.523364,f*.514018,u*.523364,f*.5),n.bezierCurveTo(u*.523364,f*.485981,u*.514018,f*.476635,u*.5,f*.476635),n.bezierCurveTo(u*.485981,f*.476635,u*.476635,f*.485981,u*.476635,f*.5),n.closePath(),n.moveTo(u*.415887,f*.504672),n.lineTo(u*.415887,f*.495327),n.bezierCurveTo(u*.415887,f*.495327,u*.467289,f*.495327,u*.467289,f*.495327),n.bezierCurveTo(u*.471962,f*.481308,u*.481308,f*.471962,u*.495327,f*.467289),n.bezierCurveTo(u*.495327,f*.467289,u*.495327,f*.415887,u*.495327,f*.415887),n.lineTo(u*.504672,f*.415887),n.bezierCurveTo(u*.504672,f*.415887,u*.504672,f*.467289,u*.504672,f*.467289),n.bezierCurveTo(u*.518691,f*.471962,u*.528037,f*.481308,u*.53271,f*.495327),n.bezierCurveTo(u*.53271,f*.495327,u*.584112,f*.495327,u*.584112,f*.495327),n.lineTo(u*.584112,f*.504672),n.bezierCurveTo(u*.584112,f*.504672,u*.53271,f*.504672,u*.53271,f*.504672),n.bezierCurveTo(u*.528037,f*.518691,u*.518691,f*.53271,u*.5,f*.53271),n.bezierCurveTo(u*.481308,f*.53271,u*.471962,f*.518691,u*.467289,f*.504672),n.bezierCurveTo(u*.467289,f*.504672,u*.415887,f*.504672,u*.415887,f*.504672),n.closePath(),n.fill(),i=5,r=Math.PI/36,n.translate(l,c),n.rotate(-Math.PI/2),n.translate(-l,-c),t=-90;t<=90;t+=i)t%45==0||t===0?(n.strokeStyle=nt.medium.getRgbaColor(),n.lineWidth=2,n.beginPath(),n.moveTo(u*.5,f*.088785),n.lineTo(u*.5,f*.113),n.closePath(),n.stroke()):t%15==0?(n.strokeStyle=\"#FFFFFF\",n.lineWidth=1,n.beginPath(),n.moveTo(u*.5,f*.088785),n.lineTo(u*.5,f*.103785),n.closePath(),n.stroke()):(n.strokeStyle=\"#FFFFFF\",n.lineWidth=.5,n.beginPath(),n.moveTo(u*.5,f*.088785),n.lineTo(u*.5,f*.093785),n.closePath(),n.stroke()),n.translate(l,c),n.rotate(r,l,c),n.translate(-l,-c);n.restore()},at=function(n){n.save();var i=u*.037383,t=f*.056074;n.beginPath(),n.moveTo(i*.5,0),n.lineTo(0,t),n.lineTo(i,t),n.closePath(),n.fillStyle=nt.light.getRgbaColor(),n.fill(),n.strokeStyle=nt.medium.getRgbaColor(),n.stroke(),n.restore()},it=function(){ct=!0,vt&&v(ht,lt,l,c,u,f),pt(ft),at(ut),wt(tt),yt&&y(tt,st,u,f,!0,fi,oi,ai)},rt=function(){k.width=o,k.height=o,ht=k.getContext(\"2d\"),p.width=o,p.height=o*Math.PI,ft=p.getContext(\"2d\"),a.width=o*.037383,a.height=o*.056074,ut=a.getContext(\"2d\"),d.width=o,d.height=o,tt=d.getContext(\"2d\")};return this.setRoll=function(n){n=n%360,h!==n&&(h=n,this.repaint())},this.getRoll=function(){return h},this.setRollAnimated=function(n){n=n%360;if(h!==n){var t=this;undefined!==w&&w.playing&&w.stop(),w=new Tween({},\"\",Tween.regularEaseInOut,h,n,1),w.onMotionChanged=function(n){h=n.target._pos,t.repaint()},w.start()}},this.setPitch=function(n){n=(n+180-et)%360-180,s!==n&&(s=n,s>90?(s=180-s,g||this.setRoll(h-180),g=!0):s<-90?(s=-180-s,g||this.setRoll(h+180),g=!0):g=!1,this.repaint())},this.getPitch=function(){return s},this.setPitchAnimated=function(n){if(s!==n){undefined!==b&&b.playing&&b.stop();var t=this;b=new Tween({},\"\",Tween.regularEaseInOut,s,n,1),b.onMotionChanged=function(n){t.setPitch(n.target._pos)},b.start()}},this.setPitchOffset=function(n){et=n,this.repaint()},this.setFrameDesign=function(n){rt(),lt=n,it(),this.repaint()},this.setForegroundType=function(n){rt(),st=n,it(),this.repaint()},this.repaint=function(){ct||it(),e.save(),e.clearRect(0,0,e.canvas.width,e.canvas.height),e.drawImage(k,0,0),e.save(),e.beginPath(),e.arc(l,c,u*.831775/2,0,Math.PI*2,!0),e.closePath(),e.clip(),e.translate(l,c),e.rotate(-(h*Math.PI/180)),e.translate(-l,0),e.translate(0,s*ot),e.drawImage(p,0,-p.height/2),e.translate(0,-(s*ot)-c),e.drawImage(a,u*.5-a.width/2,u*.107476),e.restore(),e.drawImage(d,0,0),e.restore()},this.repaint(),this},nu=function(n,t){var a,e,h,f,c;t=t||{};var u=undefined===t.size?32:t.size,y=undefined===t.ledColor?steelseries.LedColor.RED_LED:t.ledColor,v=!1,p=0,i=r.getElementById(n).getContext(\"2d\");i.save(),i.clearRect(0,0,i.canvas.width,i.canvas.height),i.canvas.width=u,i.canvas.height=u,a=!1,e=r.createElement(\"canvas\"),e.width=u,e.height=u,h=e.getContext(\"2d\"),f=r.createElement(\"canvas\"),f.width=u,f.height=u;var l=f.getContext(\"2d\"),s=f,w=function(){a=!0,h.clearRect(0,0,h.canvas.width,h.canvas.height),h.drawImage(o(u,1,y),0,0),l.clearRect(0,0,l.canvas.width,l.canvas.height),l.drawImage(o(u,0,y),0,0)};return this.toggleLed=function(){s=s===e?f:e,c()},this.setLedColor=function(n){y=n,a=!1,c()},this.setLedOnOff=function(n){s=!0===n?e:f,c()},this.blink=function(n){n?v||(p=setInterval(this.toggleLed,1e3),v=!0):v&&(clearInterval(p),v=!1)},c=function(){a||w(),i.save(),i.clearRect(0,0,i.canvas.width,i.canvas.height),i.drawImage(s,0,0),i.restore()},c(),this},tu=function(n,i){i=i||{};var f=undefined===i.size?200:i.size,di=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,ki=undefined===i.frameVisible?!0:i.frameVisible,p=undefined===i.pointerType?steelseries.PointerType.TYPE1:i.pointerType,b=undefined===i.pointerColor?p===steelseries.PointerType.TYPE1?steelseries.ColorDef.GRAY:steelseries.ColorDef.BLACK:i.pointerColor,ut=undefined===i.backgroundColor?p===steelseries.PointerType.TYPE1?steelseries.BackgroundColor.ANTHRACITE:steelseries.BackgroundColor.LIGHT_GRAY:i.backgroundColor,yi=undefined===i.backgroundVisible?!0:i.backgroundVisible,bi=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,si=undefined===i.foregroundVisible?!0:i.foregroundVisible,or=undefined===i.customLayer?null:i.customLayer,nt=undefined===i.isAutomatic?!0:i.isAutomatic,l=undefined===i.hour?11:i.hour,a=undefined===i.minute?5:i.minute,d=undefined===i.second?0:i.second,kt=undefined===i.secondMovesContinuous?!1:i.secondMovesContinuous,dt=undefined===i.timeZoneOffsetHour?0:i.timeZoneOffsetHour,wt=undefined===i.timeZoneOffsetMinute?0:i.timeZoneOffsetMinute,bt=undefined===i.secondPointerVisible?!0:i.secondPointerVisible,k=new Date,ui,ri,ii,nr,it=kt?100:1e3;it=bt?it:100;var sr=this,hr=Math.PI/2,gt=Math.PI*2,tt=Math.PI/180,fi=6,o=r.getElementById(n).getContext(\"2d\");o.save(),o.clearRect(0,0,o.canvas.width,o.canvas.height),o.canvas.width=f,o.canvas.height=f;var u=f,e=f,s=u/2,h=e/2,pi=!1,st=t(f,f),wi=st.getContext(\"2d\"),et=t(f,f),ti=et.getContext(\"2d\"),ot=t(f,f),gi=ot.getContext(\"2d\"),pt=t(f,f),tr=pt.getContext(\"2d\"),vt=t(f,f),rr=vt.getContext(\"2d\"),lt=t(f,f),ir=lt.getContext(\"2d\"),ht=t(f,f),hi=ht.getContext(\"2d\"),yt=t(f,f),ai=yt.getContext(\"2d\"),g=t(f,f),c=g.getContext(\"2d\"),at=t(f,f),oi=at.getContext(\"2d\"),fr=function(n,t){var i,e,o,r,f;r=u*.405,n.save(),n.translate(s,h);switch(t.type){case\"type1\":for(e=u*.074766,f=r-e,n.strokeStyle=ut.labelColor.getRgbaColor(),n.lineWidth=u*.014018,i=0;i<360;i+=30)n.beginPath(),n.moveTo(r,0),n.lineTo(f,0),n.closePath(),n.stroke(),n.rotate(30*tt);for(o=u*.126168,f=r-o,n.lineWidth=u*.03271,i=0;i<360;i+=90)n.beginPath(),n.moveTo(r,0),n.lineTo(f,0),n.closePath(),n.stroke(),n.rotate(90*tt);break;case\"type2\":default:for(e=u*.037383,f=r-e,n.strokeStyle=ut.labelColor.getRgbaColor(),n.lineWidth=u*.009345,i=0;i<360;i+=6)n.beginPath(),n.moveTo(r,0),n.lineTo(f,0),n.closePath(),n.stroke(),n.rotate(6*tt);for(o=u*.084112,f=r-o,n.lineWidth=u*.028037,i=0;i<360;i+=30)n.beginPath(),n.moveTo(r,0),n.lineTo(f,0),n.closePath(),n.stroke(),n.rotate(30*tt)}n.translate(-s,-h),n.restore()},vi=function(n,t,i){n.save();var r;i&&(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\");switch(t.type){case\"type2\":n.beginPath(),n.lineWidth=u*.046728,n.moveTo(s,u*.289719),n.lineTo(s,u*.289719+u*.224299),i||(n.strokeStyle=b.medium.getRgbaColor()),n.closePath(),n.stroke();break;case\"type1\":default:n.beginPath(),n.moveTo(u*.471962,e*.560747),n.lineTo(u*.471962,e*.214953),n.lineTo(u*.5,e*.182242),n.lineTo(u*.528037,e*.214953),n.lineTo(u*.528037,e*.560747),n.lineTo(u*.471962,e*.560747),n.closePath(),i||(r=n.createLinearGradient(u*.471962,e*.560747,u*.528037,e*.214953),r.addColorStop(1,b.veryLight.getRgbaColor()),r.addColorStop(0,b.light.getRgbaColor()),n.fillStyle=r,n.strokeStyle=b.light.getRgbaColor()),n.fill(),n.stroke()}i&&blur(n,u,e,Math.floor(u*.006)),n.restore()},li=function(n,t,i){n.save();var r;i&&(n.fillStyle=\"rgba(0, 0, 0, 0.4)\",n.strokeStyle=\"rgba(0, 0, 0, 0.4)\");switch(t.type){case\"type2\":n.beginPath(),n.lineWidth=u*.03271,n.moveTo(s,u*.116822),n.lineTo(s,u*.116822+u*.38785),i||(n.strokeStyle=b.medium.getRgbaColor()),n.closePath(),n.stroke();break;case\"type1\":default:n.beginPath(),n.moveTo(u*.518691,e*.574766),n.lineTo(u*.523364,e*.135514),n.lineTo(u*.5,e*.107476),n.lineTo(u*.476635,e*.140186),n.lineTo(u*.476635,e*.574766),n.lineTo(u*.518691,e*.574766),n.closePath(),i||(r=n.createLinearGradient(u*.518691,e*.574766,u*.476635,e*.140186),r.addColorStop(1,b.veryLight.getRgbaColor()),r.addColorStop(0,b.light.getRgbaColor()),n.fillStyle=r,n.strokeStyle=b.light.getRgbaColor()),n.fill(),n.stroke()}i&&blur(n,u,e,Math.floor(u*.006)),n.restore()},ci=function(n,t,i){n.save();var r;i?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\"):(n.fillStyle=steelseries.ColorDef.RED.medium.getRgbaColor(),n.strokeStyle=steelseries.ColorDef.RED.medium.getRgbaColor());switch(t.type){case\"type2\":n.lineWidth=u*.009345,n.beginPath(),n.moveTo(s,u*.09813),n.lineTo(s,u*.09813+u*.126168),n.closePath(),n.stroke(),n.lineWidth=u*.018691,n.beginPath(),n.moveTo(s,u*.308411),n.lineTo(s,u*.308411+u*.191588),n.closePath(),n.stroke(),n.lineWidth=u*.016,n.beginPath(),n.arc(s,u*.26,u*.085/2,0,gt),n.closePath(),n.stroke();break;case\"type1\":default:n.beginPath(),n.moveTo(u*.509345,e*.116822),n.lineTo(u*.509345,e*.574766),n.lineTo(u*.490654,e*.574766),n.lineTo(u*.490654,e*.116822),n.lineTo(u*.509345,e*.116822),n.closePath(),i||(r=n.createLinearGradient(u*.509345,e*.116822,u*.490654,e*.574766),r.addColorStop(0,steelseries.ColorDef.RED.light.getRgbaColor()),r.addColorStop(.47,steelseries.ColorDef.RED.medium.getRgbaColor()),r.addColorStop(1,steelseries.ColorDef.RED.dark.getRgbaColor()),n.fillStyle=r,n.strokeStyle=steelseries.ColorDef.RED.dark.getRgbaColor()),n.fill(),n.stroke()}i&&blur(n,u,e,Math.floor(u*.006)),n.restore()},er=function(n){var i=u*.006,t;n.beginPath(),n.arc(s,h,u*.045,0,gt),n.closePath(),t=n.createLinearGradient(s-u*.045/2,h-u*.045/2,s+u*.045/2,h+u*.045/2),t.addColorStop(0,\"#eef0f2\"),t.addColorStop(1,\"#65696d\"),n.fillStyle=t,n.fill()},ur=function(n,t){var r=u*.006,i;n.save();switch(t.type){case\"type2\":n.fillStyle=\"#000000\",n.beginPath(),n.arc(s,h,u*.088785/2,0,gt),n.closePath(),n.fill();break;case\"type1\":default:i=n.createLinearGradient(s-u*.027/2,h-u*.027/2,s+u*.027/2,h+u*.027/2),i.addColorStop(0,\"#f3f4f7\"),i.addColorStop(.11,\"#f3f5f7\"),i.addColorStop(.12,\"#f1f3f5\"),i.addColorStop(.2,\"#c0c5cb\"),i.addColorStop(.2,\"#bec3c9\"),i.addColorStop(1,\"#bec3c9\"),n.fillStyle=i,n.beginPath(),n.arc(s,h,u*.027,0,gt),n.closePath(),n.fill()}n.restore()},ni=function(n,t,i){ii=i*fi*tt,ui=t*fi*tt,ri=(n+t/60)*fi*5*tt},ei=function(){nt?k=new Date:(k.setHours(l),k.setMinutes(a),k.setSeconds(d)),d=k.getSeconds()+(kt?k.getMilliseconds()/1e3:0),l=dt!==0&&wt!==0?k.getUTCHours()+dt:k.getHours(),l=l%12,a=dt!==0&&wt!==0?k.getUTCMinutes()+wt:k.getMinutes(),a>60&&(a-=60,l++),a<0&&(a+=60,l--),l=l%12,ni(l,a,d),nt&&(nr=setTimeout(ei,it)),sr.repaint()},ft=function(n){n=n||{};var r=undefined===n.frame?!1:n.frame,f=undefined===n.background?!1:n.background,t=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground;pi=!0,r&&ki&&v(wi,di,s,h,u,e),f&&yi&&(w(ti,ut,s,h,u,e),rt(ti,or,s,h,u,e),fr(ti,p)),t&&(vi(gi,p,!1),vi(tr,p,!0),li(rr,p,!1),li(ir,p,!0),ci(hi,p,!1),ci(ai,p,!0)),i&&si&&(ur(oi,p),y(oi,bi,u,e,!1))},ct=function(n){n=n||{};var r=undefined===n.frame?!1:n.frame,u=undefined===n.background?!1:n.background,t=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground;r&&(st.width=f,st.height=f,wi=st.getContext(\"2d\")),u&&(et.width=f,et.height=f,ti=et.getContext(\"2d\")),t&&(ot.width=f,ot.height=f,gi=ot.getContext(\"2d\"),pt.width=f,pt.height=f,tr=pt.getContext(\"2d\"),vt.width=f,vt.height=f,rr=vt.getContext(\"2d\"),lt.width=f,lt.height=f,ir=lt.getContext(\"2d\"),ht.width=f,ht.height=f,hi=ht.getContext(\"2d\"),yt.width=f,yt.height=f,ai=yt.getContext(\"2d\"),g.width=f,g.height=f,c=g.getContext(\"2d\")),i&&(at.width=f,at.height=f,oi=at.getContext(\"2d\"))};return this.getAutomatic=function(){return nt},this.setAutomatic=function(n){nt&&!n?(clearTimer(nr),nt=n):!nt&&n&&(nt=n,ei())},this.getHour=function(){return l},this.setHour=function(n){n=n%12,l!==n&&(l=n,ni(l,a,d),this.repaint())},this.getMinute=function(){return a},this.setMinute=function(n){n=n%60,a!==n&&(a=n,ni(l,a,d),this.repaint())},this.getSecond=function(){return d},this.setSecond=function(n){d=n%60,d!==n&&(d=n,ni(l,a,d),this.repaint())},this.getTimeZoneOffsetHour=function(){return dt},this.setTimeZoneOffsetHour=function(n){dt=n,this.repaint()},this.getTimeZoneOffsetMinute=function(){return wt},this.setTimeZoneOffsetMinute=function(n){wt=n,this.repaint()},this.getSecondPointerVisible=function(){return bt},this.setSecondPointerVisible=function(n){bt=n,this.repaint()},this.getSecondMovesContinuous=function(){return kt},this.setSecondMovesContinuous=function(n){kt=n,it=kt?100:1e3,it=bt?it:100},this.setFrameDesign=function(n){ct({frame:!0}),di=n,ft({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){ct({frame:!0,background:!0}),ut=n,ft({frame:!0,background:!0}),this.repaint()},this.setForegroundType=function(n){ct({foreground:!0}),bi=n,ft({foreground:!0}),this.repaint()},this.setPointerType=function(n){ct({foreground:!0,pointers:!0}),p=n,p.type===\"type1\"?(b=steelseries.ColorDef.GRAY,ut=steelseries.BackgroundColor.ANTHRACITE):(b=steelseries.ColorDef.BLACK,ut=steelseries.BackgroundColor.LIGHT_GRAY),ft({background:!0,foreground:!0,pointers:!0}),this.repaint()},this.setPointerColor=function(n){ct({pointers:!0}),b=n,ft({pointers:!0}),this.repaint()},this.repaint=function(){pi||ft({frame:!0,background:!0,pointers:!0,foreground:!0}),o.clearRect(0,0,o.canvas.width,o.canvas.height),ki&&o.drawImage(st,0,0),yi&&o.drawImage(et,0,0);var n=u*.006;c.clearRect(0,0,u,e),c.save(),c.translate(s,h),c.rotate(ri),c.translate(-s,-h),c.drawImage(pt,0,0),c.restore(),o.drawImage(g,0,0,u,e,n,n,u+n,e+n),o.save(),o.translate(s,h),o.rotate(ri),o.translate(-s,-h),o.drawImage(ot,0,0),o.restore(),c.clearRect(0,0,u,e),c.save(),c.translate(s,h),c.rotate(ui),c.translate(-s,-h),c.drawImage(lt,0,0),c.restore(),o.drawImage(g,0,0,u,e,n,n,u+n,e+n),o.save(),o.translate(s,h),o.rotate(ui),o.translate(-s,-h),o.drawImage(vt,0,0),o.restore(),p.type===\"type1\"&&er(o),bt&&(c.clearRect(0,0,u,e),c.save(),c.translate(s,h),c.rotate(ii),c.translate(-s,-h),c.drawImage(yt,0,0),c.restore(),o.drawImage(g,0,0,u,e,n,n,u+n,e+n),o.save(),o.translate(s,h),o.rotate(ii),o.translate(-s,-h),o.drawImage(ht,0,0),o.restore()),si&&o.drawImage(at,0,0)},ei(),this},hr=function(t,i){var s;i=i||{};var o=undefined===i.size?50:i.size,f=undefined===i.value?50:i.value,e=o,h=Math.ceil(o*.45),u=r.getElementById(t).getContext(\"2d\");return u.save(),u.clearRect(0,0,u.canvas.width,u.canvas.height),u.canvas.width=e,u.canvas.height=e,s=function(t,i,r,u){var f,e;t.beginPath(),t.moveTo(i*.025,r*.055555),t.lineTo(i*.9,r*.055555),t.lineTo(i*.9,r*.944444),t.lineTo(i*.025,r*.944444),t.lineTo(i*.025,r*.055555),t.closePath(),t.beginPath(),t.moveTo(i*.925,0),t.lineTo(0,0),t.lineTo(0,r),t.lineTo(i*.925,r),t.lineTo(i*.925,r*.722222),t.bezierCurveTo(i*.925,r*.722222,i*.975,r*.722222,i*.975,r*.722222),t.bezierCurveTo(i,r*.722222,i,r*.666666,i,r*.666666),t.bezierCurveTo(i,r*.666666,i,r*.333333,i,r*.333333),t.bezierCurveTo(i,r*.333333,i,r*.277777,i*.975,r*.277777),t.bezierCurveTo(i*.975,r*.277777,i*.925,r*.277777,i*.925,r*.277777),t.lineTo(i*.925,0),t.closePath(),f=t.createLinearGradient(0,0,0,r),f.addColorStop(0,\"#ffffff\"),f.addColorStop(1,\"#7e7e7e\"),t.fillStyle=f,t.fill(),t.beginPath(),e=Math.max(i*.875*(u/100),Math.ceil(i*.01)),t.rect(i*.025,i*.025,e,r*.888888),t.closePath();var a=[0,.4,1],l=[new n(177,25,2,1),new n(219,167,21,1),new n(121,162,75,1)],y=new kt(0,100,a,l);t.fillStyle=y.getColorAt(u/100).getRgbColor(),t.fill(),t.beginPath(),e=Math.max(e-i*.05,0),t.rect(i*.05,i*.05,e,r*.777777),t.closePath();var v=[new n(198,39,5,1),new n(228,189,32,1),new n(163,216,102,1)],h=[new n(246,121,48,1),new n(246,244,157,1),new n(223,233,86,1)],o=[0,.4,1],s=new kt(0,100,o,v),c=new kt(0,100,o,h);f=t.createLinearGradient(i*.05,0,i*.875,0),f.addColorStop(0,s.getColorAt(u/100).getRgbColor()),f.addColorStop(.5,c.getColorAt(u/100).getRgbColor()),f.addColorStop(1,s.getColorAt(u/100).getRgbColor()),t.fillStyle=f,t.fill(),t.beginPath(),t.rect(i*.025,i*.025,i*.875,r*.444444),t.closePath(),f=t.createLinearGradient(i*.025,i*.025,i*.875,r*.444444),f.addColorStop(0,\"rgba(255, 255, 255, 0)\"),f.addColorStop(1,\"rgba(255, 255, 255, 0.8)\"),t.fillStyle=f,t.fill()},this.setValue=function(n){n=n<0?0:n>100?100:n,f!==n&&(f=n,this.repaint())},this.getValue=function(){return f},this.repaint=function(){u.clearRect(0,0,u.canvas.width,u.canvas.height),s(u,e,h,f)},this.repaint(),this},cr=function(n,i){i=i||{};var f=undefined===i.size?200:i.size,li=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,oi=undefined===i.frameVisible?!0:i.frameVisible,h=undefined===i.pointerColor?steelseries.ColorDef.BLACK:i.pointerColor,lt=undefined===i.backgroundColor?steelseries.BackgroundColor.LIGHT_GRAY:i.backgroundColor,gt=undefined===i.backgroundVisible?!0:i.backgroundVisible,fi=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,vi=undefined===i.foregroundVisible?!0:i.foregroundVisible,gi=undefined===i.customLayer?null:i.customLayer,bt=0,at=0,kt,di=6,ct=Math.PI*2,pt=Math.PI/180,ki=this,yt=0,d=0,yi=0,pi=0,si=0,a=!1,k=!1,e=r.getElementById(n).getContext(\"2d\"),u=f,c=f,o=u/2,l=c/2,p=.285*u,bi=o-p/2,b=.17*u,ci=!1,ht=t(f,f),hi=ht.getContext(\"2d\"),nt=t(f,f),it=nt.getContext(\"2d\"),tt=t(f,f),wi=tt.getContext(\"2d\"),ut=t(f,f),ai=ut.getContext(\"2d\"),st=t(f,f),ni=st.getContext(\"2d\"),ft=t(f,f),ti=ft.getContext(\"2d\"),g=t(f,f),s=g.getContext(\"2d\"),et=t(f,f),ei=et.getContext(\"2d\"),ui=function(n,t,i,r,u,f,e){var vt,ut=r*t,rt=ut+\"px sans-serif\",ot=t*.15,at=.5,g=1,ht=1.5,tt=u*t,d=Math.round(.025*t),nt=Math.round(.035*t),it=Math.round(.045*t),st=lt.labelColor.getRgbaColor(),k=lt.labelColor.getRgbaColor(),s=t/2,o=t*.4,h,a,w,y=0,b=0,ct=0,v,c=0,l=0,p,et=-Math.PI,ft=2*Math.PI/i;for(n.width=n.height=t,n.save(),n.textAlign=\"center\",n.textBaseline=\"middle\",n.font=rt,p=et,v=0;v<=i+1;p-=ft*.1,v+=.1)n.lineWidth=at,c=Math.sin(p),l=Math.cos(p),y%2==0&&(h=[s+(o-d)*c+f,s+(o-d)*l+e],a=[s+o*c+f,s+o*l+e],n.strokeStyle=k,n.beginPath(),n.moveTo(h[0],h[1]),n.lineTo(a[0],a[1]),n.closePath(),n.stroke()),(y===10||y===0)&&(n.fillStyle=st,n.lineWidth=g,a=[s+o*c+f,s+o*l+e],w=[s+(o-tt)*c+f,s+(o-tt)*l+e],b===5?(v!==i&&Math.round(v)!==60&&n.fillText(Math.round(v),w[0],w[1],ot),n.lineWidth=ht,h=[s+(o-it)*c+f,s+(o-it)*l+e],b=0):(n.lineWidth=g,h=[s+(o-nt)*c+f,s+(o-nt)*l+e]),n.strokeStyle=k,n.beginPath(),n.moveTo(h[0],h[1]),n.lineTo(a[0],a[1]),n.closePath(),n.stroke(),y=0,ct++,b++),y++;n.restore()},ii=function(n,t){var i,r;n.save(),n.beginPath(),n.moveTo(u*.509345,u*.457943),n.lineTo(u*.5,u*.102803),n.lineTo(u*.490654,u*.457943),n.bezierCurveTo(u*.490654,u*.457943,u*.490654,u*.457943,u*.490654,u*.457943),n.bezierCurveTo(u*.471962,u*.462616,u*.457943,u*.481308,u*.457943,u*.5),n.bezierCurveTo(u*.457943,u*.518691,u*.471962,u*.537383,u*.490654,u*.542056),n.bezierCurveTo(u*.490654,u*.542056,u*.490654,u*.542056,u*.490654,u*.542056),n.lineTo(u*.490654,u*.621495),n.lineTo(u*.509345,u*.621495),n.lineTo(u*.509345,u*.542056),n.bezierCurveTo(u*.509345,u*.542056,u*.509345,u*.542056,u*.509345,u*.542056),n.bezierCurveTo(u*.528037,u*.537383,u*.542056,u*.518691,u*.542056,u*.5),n.bezierCurveTo(u*.542056,u*.481308,u*.528037,u*.462616,u*.509345,u*.457943),n.bezierCurveTo(u*.509345,u*.457943,u*.509345,u*.457943,u*.509345,u*.457943),n.closePath(),t?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\",n.fill()):(i=n.createLinearGradient(0,0,0,u*.621495),i.addColorStop(0,h.medium.getRgbaColor()),i.addColorStop(.388888,h.medium.getRgbaColor()),i.addColorStop(.5,h.light.getRgbaColor()),i.addColorStop(.611111,h.medium.getRgbaColor()),i.addColorStop(1,h.medium.getRgbaColor()),n.fillStyle=i,n.strokeStyle=h.dark.getRgbaColor(),n.fill(),n.stroke()),t?blur(n,u,c,Math.floor(u*.006)):(n.beginPath(),r=u*.06542/2,n.arc(o,l,r,0,ct),i=n.createLinearGradient(o-r,o+r,0,o+r),i.addColorStop(0,\"#e6b35c\"),i.addColorStop(.01,\"#e6b35c\"),i.addColorStop(.99,\"#c48200\"),i.addColorStop(1,\"#c48200\"),n.fillStyle=i,n.closePath(),n.fill(),n.beginPath(),r=u*.046728/2,n.arc(o,l,r,0,ct),i=n.createRadialGradient(o,o,0,o,o,r),i.addColorStop(0,\"#c5c5c5\"),i.addColorStop(.19,\"#c5c5c5\"),i.addColorStop(.22,\"#000000\"),i.addColorStop(.8,\"#000000\"),i.addColorStop(.99,\"#707070\"),i.addColorStop(1,\"#707070\"),n.fillStyle=i,n.closePath(),n.fill()),n.restore()},ri=function(n,t){var i,r;n.save(),n.beginPath(),n.moveTo(u*.476635,u*.313084),n.bezierCurveTo(u*.476635,u*.322429,u*.485981,u*.331775,u*.495327,u*.336448),n.bezierCurveTo(u*.495327,u*.336448,u*.495327,u*.350467,u*.495327,u*.350467),n.lineTo(u*.504672,u*.350467),n.bezierCurveTo(u*.504672,u*.350467,u*.504672,u*.336448,u*.504672,u*.336448),n.bezierCurveTo(u*.514018,u*.331775,u*.523364,u*.322429,u*.523364,u*.313084),n.bezierCurveTo(u*.523364,u*.303738,u*.514018,u*.294392,u*.504672,u*.289719),n.bezierCurveTo(u*.504672,u*.289719,u*.5,u*.200934,u*.5,u*.200934),n.bezierCurveTo(u*.5,u*.200934,u*.495327,u*.289719,u*.495327,u*.289719),n.bezierCurveTo(u*.485981,u*.294392,u*.476635,u*.303738,u*.476635,u*.313084),n.closePath(),t?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\",n.fill()):(i=n.createLinearGradient(0,0,u,0),i.addColorStop(0,h.medium.getRgbaColor()),i.addColorStop(.388888,h.medium.getRgbaColor()),i.addColorStop(.5,h.light.getRgbaColor()),i.addColorStop(.611111,h.medium.getRgbaColor()),i.addColorStop(1,h.medium.getRgbaColor()),n.fillStyle=i,n.strokeStyle=h.dark.getRgbaColor(),n.fill(),n.stroke()),t?blur(n,u,c,Math.floor(u*.006)):(n.beginPath(),r=u*.037383/2,n.arc(o,b+p/2,r,0,ct),n.fillStyle=\"#C48200\",n.closePath(),n.fill(),n.beginPath(),r=u*.028037/2,n.arc(o,b+p/2,r,0,ct),n.fillStyle=\"#999999\",n.closePath(),n.fill(),n.beginPath(),r=u*.018691/2,n.arc(o,b+p/2,r,0,ct),n.fillStyle=\"#000000\",n.closePath(),n.fill()),n.restore()},wt=function(){d=+new Date-yt,at=d*di/1e3,bt=at%10800/30,yi=d/6e4%30,pi=d/1e3%60,si=d%1e3},ot=function(n){n=n||{};var r=undefined===n.frame?!1:n.frame,f=undefined===n.background?!1:n.background,t=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground;ci=!0,r&&oi&&v(hi,li,o,l,u,c),f&&gt&&(w(it,lt,o,l,u,c),rt(it,gi,o,l,u,c),ui(it,u,60,.075,.1,0,0),ui(it,p,30,.095,.13,bi,b)),t&&(ii(ni,!1),ii(ti,!0),ri(wi,!1),ri(ai,!0)),i&&vi&&y(ei,fi,u,c,!1)},vt=function(n){n=n||{};var r=undefined===n.frame?!1:n.frame,u=undefined===n.background?!1:n.background,t=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground;r&&(ht.width=f,ht.height=f,hi=ht.getContext(\"2d\")),u&&(nt.width=f,nt.height=f,it=nt.getContext(\"2d\")),t&&(tt.width=f,tt.height=f,wi=tt.getContext(\"2d\"),ut.width=f,ut.height=f,ai=ut.getContext(\"2d\"),st.width=f,st.height=f,ni=st.getContext(\"2d\"),ft.width=f,ft.height=f,ti=ft.getContext(\"2d\"),g.width=f,g.height=f,s=g.getContext(\"2d\")),i&&(et.width=f,et.height=f,ei=et.getContext(\"2d\"))},dt=function(){k||(wt(),ki.repaint()),a&&(kt=setTimeout(dt,200))};return this.isRunning=function(){return a},this.start=function(){a||(a=!0,yt=+new Date-d,dt())},this.stop=function(){a&&(a=!1,clearTimeout(kt)),k&&(k=!1,wt(),this.repaint())},this.reset=function(){a&&(a=!1,k=!1,clearTimeout(kt)),yt=+new Date,wt(),this.repaint()},this.lap=function(){a&&!k?k=!0:k&&(k=!1)},this.getMeasuredTime=function(){return yi+\":\"+pi+\":\"+si},this.setFrameDesign=function(n){vt({frame:!0}),li=n,ot({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){vt({background:!0}),lt=n,ot({background:!0}),this.repaint()},this.setForegroundType=function(n){vt({foreground:!0}),fi=n,ot({foreground:!0}),this.repaint()},this.setPointerColor=function(n){vt({pointers:!0}),h=n,ot({pointers:!0}),this.repaint()},this.repaint=function(){ci||ot({frame:!0,background:!0,pointers:!0,foreground:!0}),e.clearRect(0,0,e.canvas.width,e.canvas.height),oi&&e.drawImage(ht,0,0),gt&&e.drawImage(nt,0,0);var n=u*.006,t=(bt+2*Math.sin(bt*pt))*pt;s.clearRect(0,0,u,c),s.save(),s.translate(o,b+p/2),s.rotate(t),s.translate(-o,-(b+p/2)),s.drawImage(ut,0,0),s.restore(),e.drawImage(g,0,0,u,c,n/2,n/2,u+n/2,c+n/2),e.save(),e.translate(o,b+p/2),e.rotate(t),e.translate(-o,-(b+p/2)),e.drawImage(tt,0,0),e.restore(),t=(at+2*Math.sin(at*pt))*pt,s.clearRect(0,0,u,c),s.save(),s.translate(o,l),s.rotate(t),s.translate(-o,-l),s.drawImage(ft,0,0),s.restore(),e.drawImage(g,0,0,u,c,n,n,u+n,c+n),e.save(),e.translate(o,l),e.rotate(t),e.translate(-o,-l),e.drawImage(st,0,0),e.restore(),vi&&e.drawImage(et,0,0)},e.save(),e.clearRect(0,0,e.canvas.width,e.canvas.height),e.canvas.width=f,e.canvas.height=f,yt=+new Date,dt(),this},sr=function(n,i){function gi(){nt=2*Math.PI/(li-a),ht=nt/10,pt=ht/10}function nr(){yt=l%1e3/100,kt=l%1e4/100,wt=l%1e5/100}var o,bt,at,ut,ui,ri,fi,k,vt,vi,ct,lt,ai,a=0,li=10,l=a,yt=0,kt=0,wt=0,nt,ht,pt,rr=1,g,u,f,c,h,hi,e=r.getElementById(n).getContext(\"2d\"),hr=Math.PI/2,cr=Math.PI/180,ur=Math.PI,ci=!1,ot=t(o,o),bi=ot.getContext(\"2d\"),et=t(o,o),it=et.getContext(\"2d\"),yi,pi=t(o,o),tr=pi.getContext(\"2d\"),ti=t(o,o),ir=ti.getContext(\"2d\"),ni=t(o,o),or=ni.getContext(\"2d\"),ii=t(o,o),sr=ii.getContext(\"2d\"),ei=t(o,o),fr=ei.getContext(\"2d\"),oi=t(o,o),er=oi.getContext(\"2d\"),b=t(o,o),s=b.getContext(\"2d\"),ft=t(o,o),si=ft.getContext(\"2d\"),d,st;i=i||{},o=undefined===i.size?200:i.size,bt=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,at=undefined===i.frameVisible?!0:i.frameVisible,ut=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,ui=undefined===i.backgroundVisible?!0:i.backgroundVisible,ri=undefined===i.knobType?steelseries.KnobType.METAL_KNOB:i.knobType,fi=undefined===i.knobStyle?steelseries.KnobStyle.BLACK:i.knobStyle,k=undefined===i.lcdColor?steelseries.LcdColor.BLACK:i.lcdColor,vt=undefined===i.lcdVisible?!0:i.lcdVisible,vi=undefined===i.digitalFont?!1:i.digitalFont,ct=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,lt=undefined===i.foregroundVisible?!0:i.foregroundVisible,ai=undefined===i.customLayer?null:i.customLayer,e.save(),e.clearRect(0,0,e.canvas.width,e.canvas.height),e.canvas.width=o,e.canvas.height=o,u=o,f=o,c=u/2,h=f/2,hi=Math.floor(u*.09)+\"px sans-serif\";var di=function(n){e.save(),e.textAlign=\"right\",e.textBaseline=\"middle\",e.strokeStyle=k.textColor,e.fillStyle=k.textColor,(k===steelseries.LcdColor.STANDARD||k===steelseries.LcdColor.STANDARD_GREEN)&&(e.shadowColor=\"gray\",e.shadowOffsetX=u*.007,e.shadowOffsetY=u*.007,e.shadowBlur=u*.009),e.font=vi?Math.floor(u*.075)+\"px \"+tt:Math.floor(u*.075)+\"px sans-serif\",e.fillText(Math.round(n),(u+u*.4)/2-4,u*.607,u*.4),e.restore()},ki=function(n,t,i,r,f,e){var it=Math.max(u*.012,2),rt=Math.max(u*.007,1.5),d=u*.13,g=u*.05,nt=u*.07,v=u*.4,b=0,ft=0,p=0,y=0,k,w,tt=-i-t/2;for(n.save(),n.textAlign=\"center\",n.textBaseline=\"middle\",n.font=hi,n.strokeStyle=ut.labelColor.getRgbaColor(),n.fillStyle=ut.labelColor.getRgbaColor(),k=tt,w=0;w<=10;k-=e*.1,w+=.1)p=Math.sin(k),y=Math.cos(k),b%2==0&&(n.lineWidth=rt,n.beginPath(),n.moveTo(c+(v-g)*p,h+(v-g)*y),n.lineTo(c+v*p,h+v*y),n.closePath(),n.stroke()),(b===10||b===0)&&(n.lineWidth=it,t===0&&Math.round(w)!==li&&n.fillText(Math.round(w).toString(),c+(v-d)*p,h+(v-d)*y),b=0,ft++,n.beginPath(),n.moveTo(c+(v-nt)*p,h+(v-nt)*y),n.lineTo(c+v*p,h+v*y),n.closePath(),n.stroke()),b++;n.restore()},dt=function(n,t){var i;t?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\"):(i=n.createLinearGradient(0,f*.168224,0,f*.626168),i.addColorStop(0,\"#ffffff\"),i.addColorStop(.31,\"#ffffff\"),i.addColorStop(.3101,\"#ffffff\"),i.addColorStop(.32,\"#202020\"),i.addColorStop(1,\"#202020\"),n.fillStyle=i),n.save(),n.beginPath(),n.moveTo(u*.518691,f*.471962),n.bezierCurveTo(u*.514018,f*.471962,u*.509345,f*.467289,u*.509345,f*.467289),n.lineTo(u*.509345,f*.200934),n.lineTo(u*.5,f*.168224),n.lineTo(u*.490654,f*.200934),n.lineTo(u*.490654,f*.467289),n.bezierCurveTo(u*.490654,f*.467289,u*.481308,f*.471962,u*.481308,f*.471962),n.bezierCurveTo(u*.471962,f*.481308,u*.467289,f*.490654,u*.467289,f*.5),n.bezierCurveTo(u*.467289,f*.514018,u*.476635,f*.528037,u*.490654,f*.53271),n.bezierCurveTo(u*.490654,f*.53271,u*.490654,f*.579439,u*.490654,f*.588785),n.bezierCurveTo(u*.485981,f*.593457,u*.481308,f*.59813,u*.481308,f*.607476),n.bezierCurveTo(u*.481308,f*.616822,u*.490654,f*.626168,u*.5,f*.626168),n.bezierCurveTo(u*.509345,f*.626168,u*.518691,f*.616822,u*.518691,f*.607476),n.bezierCurveTo(u*.518691,f*.59813,u*.514018,f*.593457,u*.504672,f*.588785),n.bezierCurveTo(u*.504672,f*.579439,u*.504672,f*.53271,u*.509345,f*.53271),n.bezierCurveTo(u*.523364,f*.528037,u*.53271,f*.514018,u*.53271,f*.5),n.bezierCurveTo(u*.53271,f*.490654,u*.528037,f*.481308,u*.518691,f*.471962),n.closePath(),n.fill(),t&&blur(n,u,f,Math.floor(u*.006)),n.restore()},gt=function(n,t){var i;t?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\"):(i=n.createLinearGradient(0,f*.401869,0,f*.616822),i.addColorStop(0,\"#ffffff\"),i.addColorStop(.51,\"#ffffff\"),i.addColorStop(.52,\"#ffffff\"),i.addColorStop(.5201,\"#202020\"),i.addColorStop(.53,\"#202020\"),i.addColorStop(1,\"#202020\"),n.fillStyle=i),n.beginPath(),n.moveTo(u*.518691,f*.471962),n.bezierCurveTo(u*.514018,f*.462616,u*.528037,f*.401869,u*.528037,f*.401869),n.lineTo(u*.5,f*.331775),n.lineTo(u*.471962,f*.401869),n.bezierCurveTo(u*.471962,f*.401869,u*.485981,f*.462616,u*.481308,f*.471962),n.bezierCurveTo(u*.471962,f*.481308,u*.467289,f*.490654,u*.467289,f*.5),n.bezierCurveTo(u*.467289,f*.514018,u*.476635,f*.528037,u*.490654,f*.53271),n.bezierCurveTo(u*.490654,f*.53271,u*.462616,f*.574766,u*.462616,f*.593457),n.bezierCurveTo(u*.467289,f*.616822,u*.5,f*.612149,u*.5,f*.612149),n.bezierCurveTo(u*.5,f*.612149,u*.53271,f*.616822,u*.537383,f*.593457),n.bezierCurveTo(u*.537383,f*.574766,u*.509345,f*.53271,u*.509345,f*.53271),n.bezierCurveTo(u*.523364,f*.528037,u*.53271,f*.514018,u*.53271,f*.5),n.bezierCurveTo(u*.53271,f*.490654,u*.528037,f*.481308,u*.518691,f*.471962),n.closePath(),n.fill(),t&&blur(n,u,f,Math.floor(u*.006)),n.restore()},wi=function(n,t){t?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\"):n.fillStyle=\"#ffffff\",n.beginPath(),n.moveTo(u*.518691,f*.471962),n.bezierCurveTo(u*.514018,f*.471962,u*.514018,f*.467289,u*.514018,f*.467289),n.lineTo(u*.514018,f*.317757),n.lineTo(u*.504672,f*.303738),n.lineTo(u*.504672,f*.182242),n.lineTo(u*.53271,f*.116822),n.lineTo(u*.462616,f*.116822),n.lineTo(u*.495327,f*.182242),n.lineTo(u*.495327,f*.299065),n.lineTo(u*.485981,f*.317757),n.lineTo(u*.485981,f*.467289),n.bezierCurveTo(u*.485981,f*.467289,u*.485981,f*.471962,u*.481308,f*.471962),n.bezierCurveTo(u*.471962,f*.481308,u*.467289,f*.490654,u*.467289,f*.5),n.bezierCurveTo(u*.467289,f*.518691,u*.481308,f*.53271,u*.5,f*.53271),n.bezierCurveTo(u*.518691,f*.53271,u*.53271,f*.518691,u*.53271,f*.5),n.bezierCurveTo(u*.53271,f*.490654,u*.528037,f*.481308,u*.518691,f*.471962),n.closePath(),n.fill(),t&&blur(n,u,f,Math.floor(u*.006))};return d=function(n){var e,t,r,i;n=n||{},e=undefined===n.frame?!1:n.frame,t=undefined===n.background?!1:n.background,r=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground,ci=!0,gi(),e&&at&&v(bi,bt,c,h,u,f),t&&ui&&(w(it,ut,c,h,u,f),rt(it,ai,c,h,u,f),ki(it,0,ur,0,10,nt,rr,0,!0,!0,null)),t&&vt&&(yi=p(u*.4,f*.09,k),it.drawImage(yi,(u-u*.4)/2,f*.56)),r&&(dt(fr,!1),dt(er,!0),gt(or,!1),gt(sr,!0),wi(tr,!1),wi(ir,!0)),i&&lt&&y(si,ct,u,f,!0,ri,fi)},st=function(n){var r,u,t,i;n=n||{},r=undefined===n.frame?!1:n.frame,u=undefined===n.background?!1:n.background,t=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground,r&&(ot.width=o,ot.height=o,bi=ot.getContext(\"2d\")),u&&(et.width=o,et.height=o,it=et.getContext(\"2d\")),t&&(pointer100ftBuffer.width=o,pointer100ftBuffer.height=o,pointer100ftContext=pointer100ftBuffer.getContext(\"2d\"),pointer100ftShadowBuffer.width=o,pointer100ftShadowBuffer.height=o,pointer100ftShadowContext=pointer100ftShadowBuffer.getContext(\"2d\"),pointer1000ftBuffer.width=o,pointer1000ftBuffer.height=o,pointer1000ftContext=pointer1000ftBuffer.getContext(\"2d\"),pointer1000ftShadowBuffer.width=o,pointer1000ftShadowBuffer.height=o,pointer1000ftShadowContext=pointer1000ftShadowBuffer.getContext(\"2d\"),pointer10000ftBuffer.width=o,pointer10000ftBuffer.height=o,pointer10000ftContext=pointer10000ftBuffer.getContext(\"2d\"),pointer10000ftShadowBuffer.width=o,pointer10000ftShadowBuffer.height=o,pointer10000ftShadowContext=pointer10000ftShadowBuffer.getContext(\"2d\"),b.width=o,b.height=o,s=b.getContext(\"2d\")),i&&(ft.width=o,ft.height=o,si=ft.getContext(\"2d\"))},this.setValue=function(n){l=n,this.repaint()},this.getValue=function(){return l},this.setValueAnimated=function(n){var t=n<a?a:n,r=this,i;l!==t&&(undefined!==g&&g.playing&&g.stop(),i=Math.max(Math.abs(l-t)/2e3,1),g=new Tween({},\"\",Tween.regularEaseInOut,l,t,i),g.onMotionChanged=function(n){l=n.target._pos,r.repaint()},g.start())},this.setFrameDesign=function(n){st({frame:!0}),bt=n,d({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){st({background:!0,pointer:!0}),ut=n,d({background:!0,pointer:!0}),this.repaint()},this.setForegroundType=function(n){st({foreground:!0}),ct=n,d({foreground:!0}),this.repaint()},this.setLcdColor=function(n){k=n,d({background:!0}),this.repaint()},this.repaint=function(){ci||d({frame:!0,background:!0,led:!0,pointers:!0,foreground:!0}),e.clearRect(0,0,e.canvas.width,e.canvas.height),at&&e.drawImage(ot,0,0),e.drawImage(et,0,0),vt&&di(l),nr();var n=u*.006*.5;s.clearRect(0,0,u,f),s.save(),s.translate(c,h),s.rotate((wt-a)*pt),s.translate(-c,-h),s.drawImage(ti,0,0),s.restore(),e.drawImage(b,0,0,u,f,n,n,u+n,f+n),e.save(),e.translate(c,h),e.rotate((wt-a)*pt),e.translate(-c,-h),e.drawImage(pi,0,0),e.restore(),s.clearRect(0,0,u,f),s.save(),s.translate(c,h),s.rotate((kt-a)*ht),s.translate(-c,-h),s.drawImage(ii,0,0),s.restore(),e.drawImage(b,0,0,u,f,n,n,u+n,f+n),n=u*.006*.75,e.save(),e.translate(c,h),e.rotate((kt-a)*ht),e.translate(-c,-h),e.drawImage(ni,0,0),e.restore(),n=u*.006,s.clearRect(0,0,u,f),s.save(),s.translate(c,h),s.rotate((yt-a)*nt),s.translate(-c,-h),s.drawImage(oi,0,0),s.restore(),e.drawImage(b,0,0,u,f,n,n,u+n,f+n),e.save(),e.translate(c,h),e.rotate((yt-a)*nt),e.translate(-c,-h),e.drawImage(ei,0,0),e.restore(),lt&&e.drawImage(ft,0,0)},this.repaint(),this},lr=function(n,t){function at(n,t,i){var u=r.createElement(\"canvas\");return u.width=n,u.height=t,i(u.getContext(\"2d\")),u}var w,b,f,tt,i,u,d=!1,nt=!1,g=!1,rt=!1,k=r.createElement(\"canvas\"),bt=k.getContext(\"2d\"),p=r.createElement(\"canvas\"),ft=p.getContext(\"2d\"),s=r.createElement(\"canvas\"),kt=s.getContext(\"2d\"),h=r.createElement(\"canvas\"),wt=h.getContext(\"2d\"),o=r.createElement(\"canvas\"),yt=o.getContext(\"2d\"),e=r.createElement(\"canvas\"),pt=e.getContext(\"2d\"),c=r.createElement(\"canvas\"),dt=c.getContext(\"2d\"),v=r.createElement(\"canvas\"),ii=v.getContext(\"2d\"),l=r.createElement(\"canvas\"),ri=l.getContext(\"2d\"),a=r.createElement(\"canvas\"),ti=a.getContext(\"2d\"),y,it;t=t||{},w=undefined===t.width?98:t.width,b=undefined===t.height?278:t.height,f=r.getElementById(n).getContext(\"2d\"),f.save(),f.clearRect(0,0,f.canvas.width,f.canvas.height),f.canvas.width=w,f.canvas.height=b,tt=w<b*.352517?w*2.836734:b,i=tt*.352517,u=tt,k.width=i,k.height=u,p.width=i,p.height=u,s.width=i,s.height=u,h.width=i,h.height=u,o.width=i,o.height=u,e.width=i,e.height=u,c.width=i,c.height=u,v.width=i,v.height=u,l.width=i,l.height=u,a.width=i,a.height=u;var gt=function(n){var r,t;n.save(),n.save(),n.beginPath(),n.moveTo(.107142*i,0),n.lineTo(i-.107142*i,0),n.quadraticCurveTo(i,0,i,.107142*i),n.lineTo(i,u-.107142*i),n.quadraticCurveTo(i,u,i-.107142*i,u),n.lineTo(.107142*i,u),n.quadraticCurveTo(0,u,0,u-.107142*i),n.lineTo(0,.107142*i),n.quadraticCurveTo(0,0,.107142*i,u),n.closePath(),r=n.createLinearGradient(.040816*i,.007194*u,.952101*i,.995882*u),r.addColorStop(0,\"rgb(152, 152, 154)\"),r.addColorStop(.01,\"rgb(152, 152, 154)\"),r.addColorStop(.09,\"#333333\"),r.addColorStop(.24,\"rgb(152, 152, 154)\"),r.addColorStop(.55,\"rgb(31, 31, 31)\"),r.addColorStop(.78,\"#363636\"),r.addColorStop(.98,\"#000000\"),r.addColorStop(1,\"#000000\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(.030612*i+.084183*i,.010791*u),n.lineTo(.030612*i+.938775*i-.084183*i,.010791*u),n.quadraticCurveTo(.030612*i+.938775*i,.010791*u,.030612*i+.938775*i,.010791*u+.084183*i),n.lineTo(.030612*i+.938775*i,.010791*u+.978417*u-.084183*i),n.quadraticCurveTo(.030612*i+.938775*i,.010791*u+.978417*u,.030612*i+.938775*i-.084183*i,.010791*u+.978417*u),n.lineTo(.030612*i+.084183*i,.010791*u+.978417*u),n.quadraticCurveTo(.030612*i,.010791*u+.978417*u,.030612*i,.010791*u+.978417*u-.084183*i),n.lineTo(.030612*i,.010791*u+.084183*i),n.quadraticCurveTo(.030612*i,.010791*u,.030612*i+.084183*i,.010791*u),n.closePath(),t=n.createLinearGradient(-.132653*i,-.053956*u,2.061408*i,.667293*u),t.addColorStop(0,\"#000000\"),t.addColorStop(.01,\"#000000\"),t.addColorStop(.16,\"#373735\"),t.addColorStop(.31,\"#000000\"),t.addColorStop(.44,\"#303030\"),t.addColorStop(.65,\"#000000\"),t.addColorStop(.87,\"#363636\"),t.addColorStop(.98,\"#000000\"),t.addColorStop(1,\"#000000\"),n.fillStyle=t,n.fill(),n.restore(),n.restore()},ni=function(n){var t,f,r,e;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.805755*u,.397959*i,0,2*Math.PI,!1),t=n.createLinearGradient(0,.665467*u,0,.946043*u),t.addColorStop(0,\"#ffffff\"),t.addColorStop(.05,\"rgb(204, 204, 204)\"),t.addColorStop(.1,\"rgb(153, 153, 153)\"),t.addColorStop(.17,\"#666666\"),t.addColorStop(.27,\"#333333\"),t.addColorStop(1,\"#010101\"),n.fillStyle=t,n.fill(),n.restore(),n.save(),n.scale(1.083333,1),n.beginPath(),n.arc(.461538*i,.816546*u,.367346*i,0,2*Math.PI,!1),f=n.createLinearGradient(0,.68705*u,0,.946043*u),f.addColorStop(0,\"#000000\"),f.addColorStop(.35,\"#040404\"),f.addColorStop(.66,\"#000000\"),f.addColorStop(1,\"#010101\"),n.fillStyle=f,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.809352*u,.357142*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.809352*u,0,.5*i,.809352*u,.362244*i),r.addColorStop(0,\"#000000\"),r.addColorStop(.88,\"#000000\"),r.addColorStop(.95,\"rgb(94, 94, 94)\"),r.addColorStop(1,\"#010101\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.809352*u,.357142*i,0,2*Math.PI,!1),e=n.createLinearGradient(0,.68705*u,0,.917266*u),e.addColorStop(0,\"#000000\"),e.addColorStop(1,\"rgba(1, 1, 1, 0)\"),n.fillStyle=e,n.fill(),n.restore(),n.restore()},et=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.809352*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.809352*u,0,.5*i,.809352*u,.32653*i),r.addColorStop(0,\"rgb(85, 185, 123)\"),r.addColorStop(1,\"rgb(0, 31, 0)\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(0,.812949*u),n.bezierCurveTo(0,.910071*u,.224489*i,.989208*u,.5*i,.989208*u),n.bezierCurveTo(.77551*i,.989208*u,i,.910071*u,i,.809352*u),n.bezierCurveTo(.908163*i,.751798*u,.704081*i,.68705*u,.5*i,.68705*u),n.bezierCurveTo(.285714*i,.68705*u,.081632*i,.751798*u,0,.812949*u),n.closePath(),t=n.createRadialGradient(.5*i,.809352*u,0,.5*i,.809352*u,.515306*i),t.addColorStop(0,\"rgb(65, 187, 126)\"),t.addColorStop(1,\"rgba(4, 37, 8, 0)\"),n.fillStyle=t,n.fill(),n.restore(),n.restore()},ot=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.809352*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.809352*u,0,.5*i,.809352*u,.32653*i),r.addColorStop(0,\"rgba(0, 255, 0, 0.25)\"),r.addColorStop(1,\"rgba(0, 255, 0, 0.05)\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.809352*u,.32653*i,0,2*Math.PI,!1),t=n.createRadialGradient(.5*i,.809352*u,0,.5*i,.809352*u,.32653*i),t.addColorStop(0,\"rgba(1, 1, 1, 0)\"),t.addColorStop(.55,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.5501,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.78,\"rgba(0, 0, 0, 0.12)\"),t.addColorStop(.79,\"rgba(0, 0, 0, 0.12)\"),t.addColorStop(1,\"rgba(0, 0, 0, 0.5)\"),n.fillStyle=t,n.fill(),n.restore(),n.fillStyle=n.createPattern(y,\"repeat\"),n.fill(),n.restore()},st=function(n){var t,f,r,e;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.496402*u,.397959*i,0,2*Math.PI,!1),t=n.createLinearGradient(0,.356115*u,0,.63669*u),t.addColorStop(0,\"#ffffff\"),t.addColorStop(.05,\"rgb(204, 204, 204)\"),t.addColorStop(.1,\"rgb(153, 153, 153)\"),t.addColorStop(.17,\"#666666\"),t.addColorStop(.27,\"#333333\"),t.addColorStop(1,\"#010101\"),n.fillStyle=t,n.fill(),n.restore(),n.save(),n.scale(1.083333,1),n.beginPath(),n.arc(.461538*i,.507194*u,.367346*i,0,2*Math.PI,!1),f=n.createLinearGradient(0,.377697*u,0,.63669*u),f.addColorStop(0,\"#000000\"),f.addColorStop(.35,\"#040404\"),f.addColorStop(.66,\"#000000\"),f.addColorStop(1,\"#010101\"),n.fillStyle=f,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.5*u,.357142*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.5*u,0,.5*i,.5*u,.362244*i),r.addColorStop(0,\"#000000\"),r.addColorStop(.88,\"#000000\"),r.addColorStop(.95,\"#5e5e5e\"),r.addColorStop(1,\"#010101\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.5*u,.357142*i,0,2*Math.PI,!1),e=n.createLinearGradient(0,.377697*u,0,.607913*u),e.addColorStop(0,\"#000000\"),e.addColorStop(1,\"rgba(1, 1, 1, 0)\"),n.fillStyle=e,n.fill(),n.restore(),n.restore()},ut=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.5*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.5*u,0,.5*i,.5*u,.32653*i),r.addColorStop(0,\"#fed434\"),r.addColorStop(1,\"#82330c\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(0,.503597*u),n.bezierCurveTo(0,.600719*u,.224489*i,.679856*u,.5*i,.679856*u),n.bezierCurveTo(.77551*i,.679856*u,i,.600719*u,i,.5*u),n.bezierCurveTo(.908163*i,.442446*u,.704081*i,.377697*u,.5*i,.377697*u),n.bezierCurveTo(.285714*i,.377697*u,.081632*i,.442446*u,0,.503597*u),n.closePath(),t=n.createRadialGradient(.5*i,.5*u,0,.5*i,.5*u,.515306*i),t.addColorStop(0,\"#fed434\"),t.addColorStop(1,\"rgba(130, 51, 12, 0)\"),n.fillStyle=t,n.fill(),n.restore(),n.restore()},vt=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.5*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.5*u,0,.5*i,.5*u,.32653*i),r.addColorStop(0,\"rgba(255, 255, 0, 0.25)\"),r.addColorStop(1,\"rgba(255, 255, 0, 0.05)\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.5*u,.32653*i,0,2*Math.PI,!1),t=n.createRadialGradient(.5*i,.5*u,0,.5*i,.5*u,.32653*i),t.addColorStop(0,\"rgba(1, 1, 1, 0)\"),t.addColorStop(.55,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.5501,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.78,\"rgba(0, 0, 0, 0.12)\"),t.addColorStop(.79,\"rgba(0, 0, 0, 0.13)\"),t.addColorStop(1,\"rgba(0, 0, 0, 0.5)\"),n.fillStyle=t,n.fill(),n.restore(),n.fillStyle=n.createPattern(y,\"repeat\"),n.fill(),n.restore()},lt=function(n){var t,f,r,e;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.18705*u,.397959*i,0,2*Math.PI,!1),t=n.createLinearGradient(.5*i,.046762*u,.5*i,.327338*u),t.addColorStop(0,\"#ffffff\"),t.addColorStop(.05,\"#cccccc\"),t.addColorStop(.1,\"#999999\"),t.addColorStop(.17,\"#666666\"),t.addColorStop(.27,\"#333333\"),t.addColorStop(1,\"#010101\"),n.fillStyle=t,n.fill(),n.restore(),n.save(),n.scale(1.083333,1),n.beginPath(),n.arc(.461538*i,.197841*u,.367346*i,0,2*Math.PI,!1),f=n.createLinearGradient(.5*i,.068345*u,.5*i,.327338*u),f.addColorStop(0,\"#000000\"),f.addColorStop(.35,\"#040404\"),f.addColorStop(.66,\"#000000\"),f.addColorStop(1,\"#010101\"),n.fillStyle=f,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.190647*u,.357142*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.190647*u,0,.5*i,.190647*u,.362244*i),r.addColorStop(0,\"#000000\"),r.addColorStop(.88,\"#000000\"),r.addColorStop(.95,\"#5e5e5e\"),r.addColorStop(1,\"#010101\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.190647*u,.357142*i,0,2*Math.PI,!1),e=n.createLinearGradient(.5*i,.068345*u,.5*i,.298561*u),e.addColorStop(0,\"#000000\"),e.addColorStop(1,\"rgba(1, 1, 1, 0)\"),n.fillStyle=e,n.fill(),n.restore(),n.restore()},ct=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.190647*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.190647*u,0,.5*i,.190647*u,.32653*i),r.addColorStop(0,\"#ff0000\"),r.addColorStop(1,\"#410004\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(0,.194244*u),n.bezierCurveTo(0,.291366*u,.224489*i,.370503*u,.5*i,.370503*u),n.bezierCurveTo(.77551*i,.370503*u,i,.291366*u,i,.190647*u),n.bezierCurveTo(.908163*i,.133093*u,.704081*i,.068345*u,.5*i,.068345*u),n.bezierCurveTo(.285714*i,.068345*u,.081632*i,.133093*u,0,.194244*u),n.closePath(),t=n.createRadialGradient(.5*i,.190647*u,0,.5*i,.190647*u,.515306*i),t.addColorStop(0,\"#ff0000\"),t.addColorStop(1,\"rgba(118, 5, 1, 0)\"),n.fillStyle=t,n.fill(),n.restore(),n.restore()},ht=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.190647*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.190647*u,0,.5*i,.190647*u,.32653*i),r.addColorStop(0,\"rgba(255, 0, 0, 0.25)\"),r.addColorStop(1,\"rgba(255, 0, 0, 0.05)\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.190647*u,.32653*i,0,2*Math.PI,!1),t=n.createRadialGradient(.5*i,.190647*u,0,.5*i,.190647*u,.32653*i),t.addColorStop(0,\"rgba(1, 1, 1, 0)\"),t.addColorStop(.55,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.5501,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.78,\"rgba(0, 0, 0, 0.12)\"),t.addColorStop(.79,\"rgba(0, 0, 0, 0.13)\"),t.addColorStop(1,\"rgba(0, 0, 0, 0.5)\"),n.fillStyle=t,n.fill(),n.restore(),n.fillStyle=n.createPattern(y,\"repeat\"),n.fill(),n.restore()};return y=at(2,2,function(n){n.save(),n.strokeStyle=\"rgba(0, 0, 0, 0.1)\",n.beginPath(),n.lineTo(0,0,1,0),n.lineTo(0,1,0,1),n.stroke(),n.restore()}),it=function(){rt=!0,gt(bt),ni(ft),et(kt),ot(wt),st(yt),ut(pt),vt(dt),lt(ii),ct(ri),ht(ti)},this.setRedOn=function(n){d=n,this.repaint()},this.isRedOn=function(){return d},this.setYellowOn=function(n){nt=n,this.repaint()},this.isYellowOn=function(){return nt},this.setGreenOn=function(n){g=n,this.repaint()},this.isGreenOn=function(){return g},this.repaint=function(){rt||it(),f.save(),f.clearRect(0,0,f.canvas.width,f.canvas.height),f.drawImage(k,0,0),f.drawImage(p,0,0),g&&f.drawImage(s,0,0),f.drawImage(h,0,0),f.drawImage(o,0,0),nt&&f.drawImage(e,0,0),f.drawImage(c,0,0),f.drawImage(v,0,0),d&&f.drawImage(l,0,0),f.drawImage(a,0,0),f.restore()},this.repaint(),this},yr=function(n,t){function tt(n,t,i){var u=r.createElement(\"canvas\");return u.width=n,u.height=t,i(u.getContext(\"2d\")),u}var f,l,c,e,a,u,i,b=!1,v=!1,y=1,h=r.createElement(\"canvas\"),g=h.getContext(\"2d\"),o=r.createElement(\"canvas\"),ut=o.getContext(\"2d\"),s=r.createElement(\"canvas\"),it=s.getContext(\"2d\"),p;t=t||{},l=undefined===t.width?100:t.width,c=undefined===t.height?100:t.height,e=undefined===t.glowColor?\"#ffff00\":t.glowColor,f=document.getElementById(n).getContext(\"2d\"),f.save(),f.clearRect(0,0,f.canvas.width,f.canvas.height),f.canvas.width=l,f.canvas.height=c,a=l<c?l:c,u=a,i=a,p=function(n){var t,i=tt(1,1,function(t){t.fillStyle=n,t.beginPath(),t.rect(0,0,1,1),t.fill()});return t=i.getContext(\"2d\").getImageData(0,0,2,2).data,[t[0],t[1],t[2]]},h.width=u,h.height=i,o.width=u,o.height=i,s.width=u,s.height=i;var rt=function(n){var t;n.save(),n.clearRect(0,0,n.canvas.width,n.canvas.height),n.save(),n.beginPath(),n.moveTo(.289473*u,.438596*i),n.bezierCurveTo(.289473*u,.561403*i,.385964*u,.605263*i,.385964*u,.745614*i),n.bezierCurveTo(.385964*u,.745614*i,.587719*u,.745614*i,.587719*u,.745614*i),n.bezierCurveTo(.587719*u,.605263*i,.692982*u,.561403*i,.692982*u,.438596*i),n.bezierCurveTo(.692982*u,.324561*i,.605263*u,.22807*i,.5*u,.22807*i),n.bezierCurveTo(.385964*u,.22807*i,.289473*u,.324561*i,.289473*u,.438596*i),n.closePath(),t=n.createLinearGradient(0,.289473*i,0,.701754*i),t.addColorStop(0,\"#eeeeee\"),t.addColorStop(.99,\"#999999\"),t.addColorStop(1,\"#999999\"),n.fillStyle=t,n.fill(),n.lineCap=\"butt\",n.lineJoin=\"round\",n.lineWidth=.008771*u,n.strokeStyle=\"#cccccc\",n.stroke(),n.restore(),n.restore()},d=function(n){var t,h=p(e),o=h[0],r=h[1],s=h[2],f=ar(o,r,s);n.save(),n.clearRect(0,0,n.canvas.width,n.canvas.height),n.save(),n.beginPath(),n.moveTo(.289473*u,.438596*i),n.bezierCurveTo(.289473*u,.561403*i,.385964*u,.605263*i,.385964*u,.745614*i),n.bezierCurveTo(.385964*u,.745614*i,.587719*u,.745614*i,.587719*u,.745614*i),n.bezierCurveTo(.587719*u,.605263*i,.692982*u,.561403*i,.692982*u,.438596*i),n.bezierCurveTo(.692982*u,.324561*i,.605263*u,.22807*i,.5*u,.22807*i),n.bezierCurveTo(.385964*u,.22807*i,.289473*u,.324561*i,.289473*u,.438596*i),n.closePath(),t=n.createLinearGradient(0,.289473*i,0,.701754*i),o===r&&r===s?(t.addColorStop(0,\"hsl(0, 60%, 0%)\"),t.addColorStop(1,\"hsl(0, 40%, 0%)\")):(t.addColorStop(0,\"hsl(\"+f[0]*255+\", \"+f[1]*100+\"%, 70%)\"),t.addColorStop(1,\"hsl(\"+f[0]*255+\", \"+f[1]*100+\"%, 80%)\")),n.fillStyle=t,n.shadowOffsetX=0,n.shadowOffsetY=0,n.shadowBlur=30,n.shadowColor=e,n.fill(),n.lineCap=\"butt\",n.lineJoin=\"round\",n.lineWidth=.008771*u,n.strokeStyle=\"rgba(\"+o+\", \"+r+\", \"+s+\", 0.4)\",n.stroke(),n.restore(),n.restore()},k=function(n){var e,t,f,r;n.save(),n.clearRect(0,0,n.canvas.width,n.canvas.height),n.save(),n.beginPath(),n.moveTo(.350877*u,.333333*i),n.bezierCurveTo(.350877*u,.280701*i,.41228*u,.236842*i,.5*u,.236842*i),n.bezierCurveTo(.578947*u,.236842*i,.64035*u,.280701*i,.64035*u,.333333*i),n.bezierCurveTo(.64035*u,.385964*i,.578947*u,.429824*i,.5*u,.429824*i),n.bezierCurveTo(.41228*u,.429824*i,.350877*u,.385964*i,.350877*u,.333333*i),n.closePath(),e=n.createLinearGradient(0,.245614*i,0,.429824*i),e.addColorStop(0,\"#ffffff\"),e.addColorStop(.99,\"rgba(255, 255, 255, 0)\"),e.addColorStop(1,\"rgba(255, 255, 255, 0)\"),n.fillStyle=e,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(.377192*u,.745614*i),n.bezierCurveTo(.377192*u,.745614*i,.429824*u,.72807*i,.491228*u,.72807*i),n.bezierCurveTo(.561403*u,.72807*i,.605263*u,.736842*i,.605263*u,.736842*i),n.lineTo(.605263*u,.763157*i),n.lineTo(.596491*u,.780701*i),n.lineTo(.605263*u,.798245*i),n.lineTo(.596491*u,.815789*i),n.lineTo(.605263*u,.833333*i),n.lineTo(.596491*u,.850877*i),n.lineTo(.605263*u,.868421*i),n.lineTo(.596491*u,.885964*i),n.lineTo(.605263*u,.894736*i),n.bezierCurveTo(.605263*u,.894736*i,.570175*u,.95614*i,.535087*u,.991228*i),n.bezierCurveTo(.526315*u,.991228*i,.517543*u,i,.5*u,i),n.bezierCurveTo(.482456*u,i,.473684*u,i,.464912*u,.991228*i),n.bezierCurveTo(.421052*u,.947368*i,.394736*u,.903508*i,.394736*u,.903508*i),n.lineTo(.394736*u,.894736*i),n.lineTo(.385964*u,.885964*i),n.lineTo(.394736*u,.868421*i),n.lineTo(.385964*u,.850877*i),n.lineTo(.394736*u,.833333*i),n.lineTo(.385964*u,.815789*i),n.lineTo(.394736*u,.798245*i),n.lineTo(.377192*u,.789473*i),n.lineTo(.394736*u,.771929*i),n.lineTo(.377192*u,.763157*i),n.lineTo(.377192*u,.745614*i),n.closePath(),t=n.createLinearGradient(.473684*u,.72807*i,.484702*u,.938307*i),t.addColorStop(0,\"#333333\"),t.addColorStop(.04,\"#d9dad6\"),t.addColorStop(.19,\"#e4e5e0\"),t.addColorStop(.24,\"#979996\"),t.addColorStop(.31,\"#fbffff\"),t.addColorStop(.4,\"#818584\"),t.addColorStop(.48,\"#f5f7f4\"),t.addColorStop(.56,\"#959794\"),t.addColorStop(.64,\"#f2f2f0\"),t.addColorStop(.7,\"#828783\"),t.addColorStop(.78,\"#fcfcfc\"),t.addColorStop(1,\"#666666\"),n.fillStyle=t,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(.377192*u,.745614*i),n.bezierCurveTo(.377192*u,.745614*i,.429824*u,.72807*i,.491228*u,.72807*i),n.bezierCurveTo(.561403*u,.72807*i,.605263*u,.736842*i,.605263*u,.736842*i),n.lineTo(.605263*u,.763157*i),n.lineTo(.596491*u,.780701*i),n.lineTo(.605263*u,.798245*i),n.lineTo(.596491*u,.815789*i),n.lineTo(.605263*u,.833333*i),n.lineTo(.596491*u,.850877*i),n.lineTo(.605263*u,.868421*i),n.lineTo(.596491*u,.885964*i),n.lineTo(.605263*u,.894736*i),n.bezierCurveTo(.605263*u,.894736*i,.570175*u,.95614*i,.535087*u,.991228*i),n.bezierCurveTo(.526315*u,.991228*i,.517543*u,i,.5*u,i),n.bezierCurveTo(.482456*u,i,.473684*u,i,.464912*u,.991228*i),n.bezierCurveTo(.421052*u,.947368*i,.394736*u,.903508*i,.394736*u,.903508*i),n.lineTo(.394736*u,.894736*i),n.lineTo(.385964*u,.885964*i),n.lineTo(.394736*u,.868421*i),n.lineTo(.385964*u,.850877*i),n.lineTo(.394736*u,.833333*i),n.lineTo(.385964*u,.815789*i),n.lineTo(.394736*u,.798245*i),n.lineTo(.377192*u,.789473*i),n.lineTo(.394736*u,.771929*i),n.lineTo(.377192*u,.763157*i),n.lineTo(.377192*u,.745614*i),n.closePath(),f=n.createLinearGradient(.377192*u,.789473*i,.605263*u,.789473*i),f.addColorStop(0,\"rgba(0, 0, 0, 0.4)\"),f.addColorStop(.15,\"rgba(0, 0, 0, 0.32)\"),f.addColorStop(.85,\"rgba(0, 0, 0, 0.33)\"),f.addColorStop(1,\"rgba(0, 0, 0, 0.4)\"),n.fillStyle=f,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(.421052*u,.947368*i),n.bezierCurveTo(.438596*u,.95614*i,.447368*u,.973684*i,.464912*u,.991228*i),n.bezierCurveTo(.473684*u,i,.482456*u,i,.5*u,i),n.bezierCurveTo(.517543*u,i,.526315*u,.991228*i,.535087*u,.991228*i),n.bezierCurveTo(.543859*u,.982456*i,.561403*u,.95614*i,.578947*u,.947368*i),n.bezierCurveTo(.552631*u,.938596*i,.526315*u,.938596*i,.5*u,.938596*i),n.bezierCurveTo(.473684*u,.938596*i,.447368*u,.938596*i,.421052*u,.947368*i),n.closePath(),r=n.createLinearGradient(0,.938596*i,0,i),r.addColorStop(0,\"#050a06\"),r.addColorStop(.61,\"#070602\"),r.addColorStop(.71,\"#999288\"),r.addColorStop(.83,\"#010101\"),r.addColorStop(1,\"#000000\"),n.fillStyle=r,n.fill(),n.restore(),n.restore()},nt=function(n){n.save(),n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,n.canvas.width,n.canvas.height),n.restore()},w=function(){b=!0,rt(g),d(ut),k(it)};return this.setOn=function(n){v=n,this.repaint()},this.isOn=function(){return v},this.setAlpha=function(n){y=n,this.repaint()},this.getAlpha=function(){return y},this.setGlowColor=function(n){e=n,w(),this.repaint()},this.getGlowColor=function(){return e},this.repaint=function(){b||w(),nt(f),f.save(),f.drawImage(h,0,0),f.globalAlpha=y,v&&f.drawImage(o,0,0),f.globalAlpha=1,f.drawImage(s,0,0),f.restore()},this.repaint(),this},pr=function(n,i){function vt(){var t,n;for(ht=!0,v.rect(0,0,c,o),t=v.createLinearGradient(0,0,0,o),t.addColorStop(0,\"rgba(0, 0, 0, 1)\"),t.addColorStop(.1,\"rgba(0, 0, 0, 0.4)\"),t.addColorStop(.33,\"rgba(255, 255, 255, 0.45)\"),t.addColorStop(.46,\"rgba(255, 255, 255, 0)\"),t.addColorStop(.9,\"rgba(0, 0, 0, 0.4)\"),t.addColorStop(1,\"rgba(0, 0, 0, 1)\"),v.fillStyle=t,v.fill(),r.rect(0,0,f,s*1.1),r.fillStyle=lt,r.fill(),r.strokeStyle=\"#f0f0f0\",r.lineWidth=\"1px\",r.moveTo(0,0),r.lineTo(0,s*1.1),r.stroke(),r.strokeStyle=\"#202020\",r.moveTo(f,0),r.lineTo(f,s*1.1),r.stroke(),r.textAlign=\"center\",r.textBaseline=\"middle\",r.font=ut,r.fillStyle=ct,n=9;n<21;n++)r.fillText(n%10,f*.5,h*(n-9)+h/2);if(l>0)for(u.rect(0,0,f,s*1.1),u.fillStyle=ot,u.fill(),u.strokeStyle=\"#f0f0f0\",u.lineWidth=\"1px\",u.moveTo(0,0),u.lineTo(0,s*1.1),u.stroke(),u.strokeStyle=\"#202020\",u.moveTo(f,0),u.lineTo(f,s*1.1),u.stroke(),u.textAlign=\"center\",u.textBaseline=\"middle\",u.font=ut,u.fillStyle=et,n=9;n<21;n++)u.fillText(n%10,f*.5,h*(n-9)+h/2);for(n=0;n<p+l;n++)g[n]=Math.random()*rt*o-rt*o/2}function at(){for(var s=1,u,t,i,o,r=e,n=0;n<l;n++)r*=10;for(t=Math.floor(r),i=r-t,t=String(t),o=9,n=0;n<l+p;n++)u=+t.substring(t.length-n-1,t.length-n)||0,o!==9&&(i=0),n<l?w.drawImage(d,c-f*s,-(h*(u+i)+tt+g[n])):w.drawImage(b,c-f*s,-(h*(u+i)+tt+g[n])),s++,o=u}var yt=document,it,o,p,l,ot,et,st,e,lt,ct,rt,ht=!1,a,y,ft,f,ut,c,s,h,tt,g=[],k,w,nt,v,b,r,d,u;i=i||{},it=undefined===i.height?null:i._context,o=undefined===i.height?40:i.height,p=undefined===i.digits?6:i.digits,l=undefined===i.decimals?1:i.decimals,ot=undefined===i.decimalBackColor?\"#F0F0F0\":i.decimalBackColor,et=undefined===i.decimalForeColor?\"#F01010\":i.decimalForeColor,st=undefined===i.font?\"sans-serif\":i.font,e=undefined===i.value?0:i.value,lt=undefined===i.valueBackColor?\"#050505\":i.valueBackColor,ct=undefined===i.valueForeColor?\"#F8F8F8\":i.valueForeColor,rt=undefined===i.wobbleFactor?.07:i.wobbleFactor,y=it?it:yt.getElementById(n).getContext(\"2d\"),e<0&&(e=0),ft=Math.floor(o*.85),ut=\"600 \"+ft+\"px \"+st,f=Math.floor(o*.68),c=f*(p+l),s=ft*11,h=s/12,tt=h*.81,y.canvas.width=c,y.canvas.height=o,k=t(c,o),w=k.getContext(\"2d\"),nt=t(c,o),v=nt.getContext(\"2d\"),b=t(f,s*1.1),r=b.getContext(\"2d\"),d=t(f,s*1.1),u=d.getContext(\"2d\"),this.setValueAnimated=function(n){var t=this;n<0&&(n=0),e!==n&&(undefined!==a&&a.playing&&a.stop(),a=new Tween({},\"\",Tween.strongEaseOut,e,n,2),a.onMotionChanged=function(n){e=n.target._pos,t.repaint()},a.start()),this.repaint()},this.setValue=function(n){e=n,e<0&&(e=0),this.repaint()},this.getValue=function(){return e},this.repaint=function(){ht||vt(),at(),w.drawImage(nt,0,0),y.drawImage(k,0,0)},this.repaint()},hi=function(n,t,i,r,u,f){var c=!0,e,o,h=Math.PI/180,s=f.symbolColor.getRgbaColor();for(n.save(),n.lineWidth=1,n.fillStyle=s,n.strokeStyle=s,n.translate(t,i),e=0;e<360;e+=15)c=!c,n.beginPath(),n.arc(0,0,r*.26,e*h,(e+15)*h,!1),n.arc(0,0,r*.23,(e+15)*h,e*h,!0),n.closePath(),c&&n.fill(),n.stroke();for(n.translate(-t,-i),e=0;360>=e;e+=90)n.beginPath(),n.moveTo(r*.560747,u*.584112),n.lineTo(r*.640186,u*.644859),n.lineTo(r*.584112,u*.560747),n.lineTo(r*.560747,u*.584112),n.closePath(),n.fillStyle=s,n.fill(),n.stroke(),n.beginPath(),n.moveTo(r*.523364,u*.397196),n.lineTo(r*.5,u*.196261),n.lineTo(r*.471962,u*.397196),n.lineTo(r*.523364,u*.397196),n.closePath(),o=n.createLinearGradient(.476635*r,0,.518691*r,0),o.addColorStop(0,\"rgb(222, 223, 218)\"),o.addColorStop(.48,\"rgb(222, 223, 218)\"),o.addColorStop(.49,s),o.addColorStop(1,s),n.fillStyle=o,n.fill(),n.stroke(),n.translate(t,i),n.rotate(e*Math.PI/180),n.translate(-t,-i);n.beginPath(),n.translate(t,i),n.arc(0,0,r*.1,0,Math.PI*2,!1),n.lineWidth=r*.022,n.stroke(),n.translate(-t,-i),n.restore()},nt=function(n,i,r,u,f,e){var l,o,s,h,c=i.toString()+r.type+u.light.getHexColor()+u.medium.getHexColor()+e;if(!nt.cache[c]){l=t(i,i),o=l.getContext(\"2d\"),e&&(o.fillStyle=\"rgba(0, 0, 0, 1)\",o.strokeStyle=\"rgba(0, 0, 0, 1)\",o.shadowBlur=3,o.globalAlpha=.5);switch(r.type){case\"type2\":e||(s=o.createLinearGradient(0,i*.471962,0,i*.130841),s.addColorStop(0,f.getRgbaColor()),s.addColorStop(.36,f.getRgbaColor()),s.addColorStop(.361,u.light.getRgbaColor()),s.addColorStop(1,u.light.getRgbaColor()),o.fillStyle=s),o.beginPath(),o.moveTo(i*.518691,i*.471962),o.lineTo(i*.509345,i*.462616),o.lineTo(i*.509345,i*.341121),o.lineTo(i*.504672,i*.130841),o.lineTo(i*.495327,i*.130841),o.lineTo(i*.490654,i*.341121),o.lineTo(i*.490654,i*.462616),o.lineTo(i*.481308,i*.471962),o.closePath(),o.fill();break;case\"type3\":o.beginPath(),o.rect(i*.495327,i*.130841,i*.009345,i*.373831),o.closePath(),e||(o.fillStyle=u.light.getRgbaColor()),o.fill();break;case\"type4\":e||(s=o.createLinearGradient(.467289*i,0,.528036*i,0),s.addColorStop(0,u.dark.getRgbaColor()),s.addColorStop(.51,u.dark.getRgbaColor()),s.addColorStop(.52,u.light.getRgbaColor()),s.addColorStop(1,u.light.getRgbaColor()),o.fillStyle=s),o.beginPath(),o.moveTo(i*.5,i*.126168),o.lineTo(i*.514018,i*.135514),o.lineTo(i*.53271,i*.5),o.lineTo(i*.523364,i*.602803),o.lineTo(i*.476635,i*.602803),o.lineTo(i*.467289,i*.5),o.lineTo(i*.485981,i*.135514),o.lineTo(i*.5,i*.126168),o.closePath(),o.fill();break;case\"type5\":e||(s=o.createLinearGradient(.471962*i,0,.528036*i,0),s.addColorStop(0,u.light.getRgbaColor()),s.addColorStop(.5,u.light.getRgbaColor()),s.addColorStop(.5,u.medium.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s),o.beginPath(),o.moveTo(i*.5,i*.495327),o.lineTo(i*.528037,i*.495327),o.lineTo(i*.5,i*.149532),o.lineTo(i*.471962,i*.495327),o.lineTo(i*.5,i*.495327),o.closePath(),o.fill(),o.lineWidth=1,o.lineCap=\"square\",o.lineJoin=\"miter\",e||(o.strokeStyle=u.dark.getRgbaColor()),o.stroke();break;case\"type6\":e||(o.fillStyle=u.medium.getRgbaColor()),o.beginPath(),o.moveTo(i*.481308,i*.485981),o.lineTo(i*.481308,i*.392523),o.lineTo(i*.485981,i*.317757),o.lineTo(i*.495327,i*.130841),o.lineTo(i*.504672,i*.130841),o.lineTo(i*.514018,i*.317757),o.lineTo(i*.518691,i*.38785),o.lineTo(i*.518691,i*.485981),o.lineTo(i*.504672,i*.485981),o.lineTo(i*.504672,i*.38785),o.lineTo(i*.5,i*.317757),o.lineTo(i*.495327,i*.392523),o.lineTo(i*.495327,i*.485981),o.lineTo(i*.481308,i*.485981),o.closePath(),o.fill();break;case\"type7\":e||(s=o.createLinearGradient(.481308*i,0,.518691*i,0),s.addColorStop(0,u.dark.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s),o.beginPath(),o.moveTo(i*.490654,i*.130841),o.lineTo(i*.481308,i*.5),o.lineTo(i*.518691,i*.5),o.lineTo(i*.504672,i*.130841),o.lineTo(i*.490654,i*.130841),o.closePath(),o.fill();break;case\"type8\":e||(s=o.createLinearGradient(.471962*i,0,.528036*i,0),s.addColorStop(0,u.light.getRgbaColor()),s.addColorStop(.5,u.light.getRgbaColor()),s.addColorStop(.5,u.medium.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s,o.strokeStyle=u.dark.getRgbaColor()),o.beginPath(),o.moveTo(i*.5,i*.53271),o.lineTo(i*.53271,i*.5),o.bezierCurveTo(i*.53271,i*.5,i*.509345,i*.457943,i*.5,i*.149532),o.bezierCurveTo(i*.490654,i*.457943,i*.467289,i*.5,i*.467289,i*.5),o.lineTo(i*.5,i*.53271),o.closePath(),o.fill(),o.stroke();break;case\"type9\":e||(s=o.createLinearGradient(.471962*i,0,.528036*i,0),s.addColorStop(0,\"rgb(50, 50, 50)\"),s.addColorStop(.5,\"#666666\"),s.addColorStop(1,\"rgb(50, 50, 50)\"),o.fillStyle=s,o.strokeStyle=\"#2E2E2E\"),o.beginPath(),o.moveTo(i*.495327,i*.233644),o.lineTo(i*.504672,i*.233644),o.lineTo(i*.514018,i*.439252),o.lineTo(i*.485981,i*.439252),o.lineTo(i*.495327,i*.233644),o.closePath(),o.moveTo(i*.490654,i*.130841),o.lineTo(i*.471962,i*.471962),o.lineTo(i*.471962,i*.528037),o.bezierCurveTo(i*.471962,i*.528037,i*.476635,i*.602803,i*.476635,i*.602803),o.bezierCurveTo(i*.476635,i*.607476,i*.481308,i*.607476,i*.5,i*.607476),o.bezierCurveTo(i*.518691,i*.607476,i*.523364,i*.607476,i*.523364,i*.602803),o.bezierCurveTo(i*.523364,i*.602803,i*.528037,i*.528037,i*.528037,i*.528037),o.lineTo(i*.528037,i*.471962),o.lineTo(i*.509345,i*.130841),o.lineTo(i*.490654,i*.130841),o.closePath(),o.fill(),o.beginPath(),o.moveTo(i*.495327,i*.219626),o.lineTo(i*.504672,i*.219626),o.lineTo(i*.504672,i*.135514),o.lineTo(i*.495327,i*.135514),o.lineTo(i*.495327,i*.219626),o.closePath(),e||(o.fillStyle=u.medium.getRgbaColor()),o.fill();break;case\"type10\":o.beginPath(),o.moveTo(i*.5,i*.149532),o.bezierCurveTo(i*.5,i*.149532,i*.443925,i*.490654,i*.443925,i*.5),o.bezierCurveTo(i*.443925,i*.53271,i*.467289,i*.556074,i*.5,i*.556074),o.bezierCurveTo(i*.53271,i*.556074,i*.556074,i*.53271,i*.556074,i*.5),o.bezierCurveTo(i*.556074,i*.490654,i*.5,i*.149532,i*.5,i*.149532),o.closePath(),e||(s=o.createLinearGradient(.471962*i,0,.528036*i,0),s.addColorStop(0,u.light.getRgbaColor()),s.addColorStop(.5,u.light.getRgbaColor()),s.addColorStop(.5,u.medium.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s,o.strokeStyle=u.medium.getRgbaColor()),o.lineWidth=1,o.lineCap=\"square\",o.lineJoin=\"miter\",o.fill(),o.stroke();break;case\"type11\":o.beginPath(),o.moveTo(.5*i,.168224*i),o.lineTo(.485981*i,.5*i),o.bezierCurveTo(.485981*i,.5*i,.481308*i,.584112*i,.5*i,.584112*i),o.bezierCurveTo(.514018*i,.584112*i,.509345*i,.5*i,.509345*i,.5*i),o.lineTo(.5*i,.168224*i),o.closePath(),e||(s=o.createLinearGradient(0,.168224*i,0,.584112*i),s.addColorStop(0,u.medium.getRgbaColor()),s.addColorStop(1,u.dark.getRgbaColor()),o.fillStyle=s,o.strokeStyle=u.dark.getRgbaColor()),o.fill(),o.stroke();break;case\"type12\":o.beginPath(),o.moveTo(.5*i,.168224*i),o.lineTo(.485981*i,.5*i),o.lineTo(.5*i,.504672*i),o.lineTo(.509345*i,.5*i),o.lineTo(.5*i,.168224*i),o.closePath(),e||(s=o.createLinearGradient(0,.168224*i,0,.504672*i),s.addColorStop(0,u.medium.getRgbaColor()),s.addColorStop(1,u.dark.getRgbaColor()),o.fillStyle=s,o.strokeStyle=u.dark.getRgbaColor()),o.fill(),o.stroke();break;case\"type13\":case\"type14\":o.beginPath(),o.moveTo(.485981*i,.168224*i),o.lineTo(.5*i,.130841*i),o.lineTo(.509345*i,.168224*i),o.lineTo(.509345*i,.509345*i),o.lineTo(.485981*i,.509345*i),o.lineTo(.485981*i,.168224*i),o.closePath(),e||(r.type===\"type13\"?(s=o.createLinearGradient(0,.5*i,0,.130841*i),s.addColorStop(0,f.getRgbaColor()),s.addColorStop(.85,f.getRgbaColor()),s.addColorStop(.85,u.medium.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s):(s=o.createLinearGradient(.485981*i,0,.509345*i,0),s.addColorStop(0,u.veryDark.getRgbaColor()),s.addColorStop(.5,u.light.getRgbaColor()),s.addColorStop(1,u.veryDark.getRgbaColor()),o.fillStyle=s)),o.fill();break;case\"type15\":case\"type16\":o.beginPath(),o.moveTo(i*.509345,i*.457943),o.lineTo(i*.5015,i*.13),o.lineTo(i*.4985,i*.13),o.lineTo(i*.490654,i*.457943),o.bezierCurveTo(i*.490654,i*.457943,i*.490654,i*.457943,i*.490654,i*.457943),o.bezierCurveTo(i*.471962,i*.462616,i*.457943,i*.481308,i*.457943,i*.5),o.bezierCurveTo(i*.457943,i*.518691,i*.471962,i*.537383,i*.490654,i*.542056),o.bezierCurveTo(i*.490654,i*.542056,i*.490654,i*.542056,i*.490654,i*.542056),r.type===\"type15\"?(o.lineTo(i*.490654,i*.57),o.bezierCurveTo(i*.46,i*.58,i*.46,i*.62,i*.490654,i*.63),o.bezierCurveTo(i*.47,i*.62,i*.48,i*.59,i*.5,i*.59),o.bezierCurveTo(i*.53,i*.59,i*.52,i*.62,i*.509345,i*.63),o.bezierCurveTo(i*.54,i*.62,i*.54,i*.58,i*.509345,i*.57),o.lineTo(i*.509345,i*.57)):(o.lineTo(i*.490654,i*.621495),o.lineTo(i*.509345,i*.621495)),o.lineTo(i*.509345,i*.542056),o.bezierCurveTo(i*.509345,i*.542056,i*.509345,i*.542056,i*.509345,i*.542056),o.bezierCurveTo(i*.528037,i*.537383,i*.542056,i*.518691,i*.542056,i*.5),o.bezierCurveTo(i*.542056,i*.481308,i*.528037,i*.462616,i*.509345,i*.457943),o.bezierCurveTo(i*.509345,i*.457943,i*.509345,i*.457943,i*.509345,i*.457943),o.closePath(),e?o.fill():(s=r.type===\"type15\"?o.createLinearGradient(0,0,0,i*.63):o.createLinearGradient(0,0,0,i*.621495),s.addColorStop(0,u.medium.getRgbaColor()),s.addColorStop(.388888,u.medium.getRgbaColor()),s.addColorStop(.5,u.light.getRgbaColor()),s.addColorStop(.611111,u.medium.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s,o.strokeStyle=u.dark.getRgbaColor(),o.fill(),o.stroke()),e||(o.beginPath(),h=i*.06542/2,o.arc(i*.5,i*.5,h,0,Math.PI*2),s=o.createLinearGradient(i*.5-h,i*.5+h,0,i*.5+h),s.addColorStop(0,\"#e6b35c\"),s.addColorStop(.01,\"#e6b35c\"),s.addColorStop(.99,\"#c48200\"),s.addColorStop(1,\"#c48200\"),o.fillStyle=s,o.closePath(),o.fill(),o.beginPath(),h=i*.046728/2,o.arc(i*.5,i*.5,h,0,Math.PI*2),s=o.createRadialGradient(i*.5,i*.5,0,i*.5,i*.5,h),s.addColorStop(0,\"#c5c5c5\"),s.addColorStop(.19,\"#c5c5c5\"),s.addColorStop(.22,\"#000000\"),s.addColorStop(.8,\"#000000\"),s.addColorStop(.99,\"#707070\"),s.addColorStop(1,\"#707070\"),o.fillStyle=s,o.closePath(),o.fill());break;case\"type1\":default:e||(s=o.createLinearGradient(0,i*.471962,0,i*.130841),s.addColorStop(0,u.veryDark.getRgbaColor()),s.addColorStop(.3,u.medium.getRgbaColor()),s.addColorStop(.59,u.medium.getRgbaColor()),s.addColorStop(1,u.veryDark.getRgbaColor()),o.fillStyle=s),o.beginPath(),o.moveTo(i*.518691,i*.471962),o.bezierCurveTo(i*.514018,i*.457943,i*.509345,i*.415887,i*.509345,i*.401869),o.bezierCurveTo(i*.504672,i*.383177,i*.5,i*.130841,i*.5,i*.130841),o.bezierCurveTo(i*.5,i*.130841,i*.490654,i*.383177,i*.490654,i*.397196),o.bezierCurveTo(i*.490654,i*.415887,i*.485981,i*.457943,i*.481308,i*.471962),o.bezierCurveTo(i*.471962,i*.481308,i*.467289,i*.490654,i*.467289,i*.5),o.bezierCurveTo(i*.467289,i*.518691,i*.481308,i*.53271,i*.5,i*.53271),o.bezierCurveTo(i*.518691,i*.53271,i*.53271,i*.518691,i*.53271,i*.5),o.bezierCurveTo(i*.53271,i*.490654,i*.528037,i*.481308,i*.518691,i*.471962),o.closePath(),o.fill()}nt.cache[c]=l}return n.drawImage(nt.cache[c],0,0),this},v,ht,w,rt,ot,y,et,e,o,p,a,d,h,u,b,ut,at,pt,ri,dt,g,l,lt,gt,bt,yt;nt.cache={},v=function(i,r,u,f,e,o){var w,s,h,y,c,l,a,p=e.toString()+o+r.design;if(!v.cache[p]){w=t(e,o),s=w.getContext(\"2d\"),s.fillStyle=\"#848484\",s.strokeStyle=\"rgba(132, 132, 132, 0.5)\",s.beginPath(),s.arc(u,f,e/2,0,Math.PI*2,!0),s.closePath(),s.fill(),s.stroke(),s.beginPath(),s.arc(u,f,e*.990654/2,0,Math.PI*2,!0),s.closePath();switch(r.design){case\"metal\":h=s.createLinearGradient(0,e*.004672,0,o*.990654),h.addColorStop(0,\"#fefefe\"),h.addColorStop(.07,\"rgb(210, 210, 210)\"),h.addColorStop(.12,\"rgb(179, 179, 179)\"),h.addColorStop(1,\"rgb(213, 213, 213)\"),s.fillStyle=h,s.fill();break;case\"brass\":h=s.createLinearGradient(0,e*.004672,0,o*.990654),h.addColorStop(0,\"rgb(249, 243, 155)\"),h.addColorStop(.05,\"rgb(246, 226, 101)\"),h.addColorStop(.1,\"rgb(240, 225, 132)\"),h.addColorStop(.5,\"rgb(90, 57, 22)\"),h.addColorStop(.9,\"rgb(249, 237, 139)\"),h.addColorStop(.95,\"rgb(243, 226, 108)\"),h.addColorStop(1,\"rgb(202, 182, 113)\"),s.fillStyle=h,s.fill();break;case\"steel\":h=s.createLinearGradient(0,e*.004672,0,o*.990654),h.addColorStop(0,\"rgb(231, 237, 237)\"),h.addColorStop(.05,\"rgb(189, 199, 198)\"),h.addColorStop(.1,\"rgb(192, 201, 200)\"),h.addColorStop(.5,\"rgb(23, 31, 33)\"),h.addColorStop(.9,\"rgb(196, 205, 204)\"),h.addColorStop(.95,\"rgb(194, 204, 203)\"),h.addColorStop(1,\"rgb(189, 201, 199)\"),s.fillStyle=h,s.fill();break;case\"gold\":h=s.createLinearGradient(0,e*.004672,0,o*.990654),h.addColorStop(0,\"rgb(255, 255, 207)\"),h.addColorStop(.15,\"rgb(255, 237, 96)\"),h.addColorStop(.22,\"rgb(254, 199, 57)\"),h.addColorStop(.3,\"rgb(255, 249, 203)\"),h.addColorStop(.38,\"rgb(255, 199, 64)\"),h.addColorStop(.44,\"rgb(252, 194, 60)\"),h.addColorStop(.51,\"rgb(255, 204, 59)\"),h.addColorStop(.6,\"rgb(213, 134, 29)\"),h.addColorStop(.68,\"rgb(255, 201, 56)\"),h.addColorStop(.75,\"rgb(212, 135, 29)\"),h.addColorStop(1,\"rgb(247, 238, 101)\"),s.fillStyle=h,s.fill();break;case\"anthracite\":h=s.createLinearGradient(0,.004672*o,0,.995326*o),h.addColorStop(0,\"rgb(118, 117, 135)\"),h.addColorStop(.06,\"rgb(74, 74, 82)\"),h.addColorStop(.12,\"rgb(50, 50, 54)\"),h.addColorStop(1,\"rgb(79, 79, 87)\"),s.fillStyle=h,s.fill();break;case\"tiltedGray\":h=s.createLinearGradient(.233644*e,.084112*o,.81258*e,.910919*o),h.addColorStop(0,\"#ffffff\"),h.addColorStop(.07,\"rgb(210, 210, 210)\"),h.addColorStop(.16,\"rgb(179, 179, 179)\"),h.addColorStop(.33,\"#ffffff\"),h.addColorStop(.55,\"#c5c5c5\"),h.addColorStop(.79,\"#ffffff\"),h.addColorStop(1,\"#666666\"),s.fillStyle=h,s.fill();break;case\"tiltedBlack\":h=s.createLinearGradient(.228971*e,.079439*o,.802547*e,.898591*o),h.addColorStop(0,\"#666666\"),h.addColorStop(.21,\"#000000\"),h.addColorStop(.47,\"#666666\"),h.addColorStop(.99,\"#000000\"),h.addColorStop(1,\"#000000\"),s.fillStyle=h,s.fill();break;case\"glossyMetal\":h=s.createRadialGradient(.5*e,.5*o,0,.5*e,.5*e,.5*e),h.addColorStop(0,\"rgb(207, 207, 207)\"),h.addColorStop(.96,\"rgb(205, 204, 205)\"),h.addColorStop(1,\"rgb(244, 244, 244)\"),s.fillStyle=h,s.fill(),s.beginPath(),s.arc(.5*e,.5*o,.973962*e/2,0,Math.PI*2),s.closePath(),h=s.createLinearGradient(0,o-.971962*o,0,.971962*o),h.addColorStop(0,\"rgb(249, 249, 249)\"),h.addColorStop(.23,\"rgb(200, 195, 191)\"),h.addColorStop(.36,\"#ffffff\"),h.addColorStop(.59,\"rgb(29, 29, 29)\"),h.addColorStop(.76,\"rgb(200, 194, 192)\"),h.addColorStop(1,\"rgb(209, 209, 209)\"),s.fillStyle=h,s.fill(),s.beginPath(),s.arc(.5*e,.5*o,.869158*e/2,0,Math.PI*2),s.closePath(),s.fillStyle=\"#f6f6f6\",s.fill(),s.beginPath(),s.arc(.5*e,.5*o,.85*e/2,0,Math.PI*2),s.closePath(),s.fillStyle=\"#333333\",s.fill();break;case\"blackMetal\":l=[0,.125,.347222,.5,.680555,.875,1],a=[new n(254,254,254,1),new n(0,0,0,1),new n(153,153,153,1),new n(0,0,0,1),new n(153,153,153,1),new n(0,0,0,1),new n(254,254,254,1)],s.save(),s.clip(s.arc(u,f,e*.990654/2,0,Math.PI*2,!0)),y=e*.495327,c=e*.42056,h=new it(l,a,-Math.PI/2),h.fill(s,u,f,c,y),s.strokeStyle=\"#848484\",s.strokeStyle=\"rgba(132, 132, 132, 0.8)\",s.beginPath(),s.lineWidth=e/90,s.arc(u,f,e/2,0,Math.PI*2,!0),s.closePath(),s.stroke(),s.restore();break;case\"shinyMetal\":l=[0,.125,.25,.347222,.5,.652777,.75,.875,1],a=[new n(254,254,254,1),new n(210,210,210,1),new n(179,179,179,1),new n(238,238,238,1),new n(160,160,160,1),new n(238,238,238,1),new n(179,179,179,1),new n(210,210,210,1),new n(254,254,254,1)],s.save(),s.clip(s.arc(u,f,e*.990654/2,0,Math.PI*2,!0)),y=e*.495327,c=e*.42056,h=new it(l,a,-Math.PI/2),h.fill(s,u,f,c,y),s.strokeStyle=\"#848484\",s.strokeStyle=\"rgba(132, 132, 132, 0.8)\",s.beginPath(),s.lineWidth=e/90,s.arc(u,f,e/2,0,Math.PI*2,!0),s.closePath(),s.stroke(),s.restore();break;case\"chrome\":l=[0,.09,.12,.16,.25,.29,.33,.38,.48,.52,.63,.68,.8,.83,.87,.97,1],a=[new n(255,255,255,1),new n(255,255,255,1),new n(136,136,138,1),new n(164,185,190,1),new n(158,179,182,1),new n(112,112,112,1),new n(221,227,227,1),new n(155,176,179,1),new n(156,176,177,1),new n(254,255,255,1),new n(255,255,255,1),new n(156,180,180,1),new n(198,209,211,1),new n(246,248,247,1),new n(204,216,216,1),new n(164,188,190,1),new n(255,255,255,1)],s.save(),s.clip(s.arc(u,f,e*.990654/2,0,Math.PI*2,!0)),y=e*.495327,c=e*.42056,h=new it(l,a,-Math.PI/2),h.fill(s,u,f,c,y),s.strokeStyle=\"#848484\",s.strokeStyle=\"rgba(132, 132, 132, 0.8)\",s.beginPath(),s.lineWidth=e/90,s.arc(u,f,e/2,0,Math.PI*2,!0),s.closePath(),s.stroke(),s.restore()}s.fillStyle=\"rgb(191, 191, 191)\",s.beginPath(),s.arc(u,f,e*.841121/2,0,Math.PI*2,!0),s.closePath(),s.fill(),s.globalCompositeOperation=\"destination-out\",s.beginPath(),s.arc(u,f,e*.831775/2,0,Math.PI*2,!0),s.closePath(),s.fill(),v.cache[p]=w}return i.drawImage(v.cache[p],0,0),this},v.cache={},ht=function(i,r,u,f,e){var c,k,h,l,d,w,o,p=[],v=[],y,a,b=u.toString()+f+r.design+e;if(!ht.cache[b]){c=Math.sqrt(u*u+f*f)*.04,c=Math.min(c,(e?u:f)*.1),k=t(u,f),h=k.getContext(\"2d\"),e?(l=u*.05,d=l-1,w=u*.028571):(l=f*.05,d=l-1,w=f*.028571),s(h,0,0,u,f,l),h.fillStyle=\"#838383\",h.fill(),s(h,1,1,u-2,f-2,d);switch(r.design){case\"metal\":o=h.createLinearGradient(0,u*.004672,0,f*.990654),o.addColorStop(0,\"#fefefe\"),o.addColorStop(.07,\"rgb(210, 210, 210)\"),o.addColorStop(.12,\"rgb(179, 179, 179)\"),o.addColorStop(1,\"rgb(213, 213, 213)\"),h.fillStyle=o,h.fill();break;case\"brass\":o=h.createLinearGradient(0,u*.004672,0,f*.990654),o.addColorStop(0,\"rgb(249, 243, 155)\"),o.addColorStop(.05,\"rgb(246, 226, 101)\"),o.addColorStop(.1,\"rgb(240, 225, 132)\"),o.addColorStop(.5,\"rgb(90, 57, 22)\"),o.addColorStop(.9,\"rgb(249, 237, 139)\"),o.addColorStop(.95,\"rgb(243, 226, 108)\"),o.addColorStop(1,\"rgb(202, 182, 113)\"),h.fillStyle=o,h.fill();break;case\"steel\":o=h.createLinearGradient(0,u*.004672,0,f*.990654),o.addColorStop(0,\"rgb(231, 237, 237)\"),o.addColorStop(.05,\"rgb(189, 199, 198)\"),o.addColorStop(.1,\"rgb(192, 201, 200)\"),o.addColorStop(.5,\"rgb(23, 31, 33)\"),o.addColorStop(.9,\"rgb(196, 205, 204)\"),o.addColorStop(.95,\"rgb(194, 204, 203)\"),o.addColorStop(1,\"rgb(189, 201, 199)\"),h.fillStyle=o,h.fill();break;case\"gold\":o=h.createLinearGradient(0,u*.004672,0,f*.990654),o.addColorStop(0,\"rgb(255, 255, 207)\"),o.addColorStop(.15,\"rgb(255, 237, 96)\"),o.addColorStop(.22,\"rgb(254, 199, 57)\"),o.addColorStop(.3,\"rgb(255, 249, 203)\"),o.addColorStop(.38,\"rgb(255, 199, 64)\"),o.addColorStop(.44,\"rgb(252, 194, 60)\"),o.addColorStop(.51,\"rgb(255, 204, 59)\"),o.addColorStop(.6,\"rgb(213, 134, 29)\"),o.addColorStop(.68,\"rgb(255, 201, 56)\"),o.addColorStop(.75,\"rgb(212, 135, 29)\"),o.addColorStop(1,\"rgb(247, 238, 101)\"),h.fillStyle=o,h.fill();break;case\"anthracite\":o=h.createLinearGradient(0,.004672*f,0,.995326*f),o.addColorStop(0,\"rgb(118, 117, 135)\"),o.addColorStop(.06,\"rgb(74, 74, 82)\"),o.addColorStop(.12,\"rgb(50, 50, 54)\"),o.addColorStop(1,\"rgb(79, 79, 87)\"),h.fillStyle=o,h.fill();break;case\"tiltedGray\":o=h.createLinearGradient(.233644*u,.084112*f,.81258*u,.910919*f),o.addColorStop(0,\"#ffffff\"),o.addColorStop(.07,\"rgb(210, 210, 210)\"),o.addColorStop(.16,\"rgb(179, 179, 179)\"),o.addColorStop(.33,\"#ffffff\"),o.addColorStop(.55,\"#c5c5c5\"),o.addColorStop(.79,\"#ffffff\"),o.addColorStop(1,\"#666666\"),h.fillStyle=o,h.fill();break;case\"tiltedBlack\":o=h.createLinearGradient(.228971*u,.079439*f,.802547*u,.898591*f),o.addColorStop(0,\"#666666\"),o.addColorStop(.21,\"#000000\"),o.addColorStop(.47,\"#666666\"),o.addColorStop(.99,\"#000000\"),o.addColorStop(1,\"#000000\"),h.fillStyle=o,h.fill();break;case\"glossyMetal\":h.clip(s(h,1,1,u-2,f-2,l)),o=h.createLinearGradient(0,1,0,f-2),o.addColorStop(0,\"rgb(249, 249, 249)\"),o.addColorStop(.2,\"rgb(200, 195, 191)\"),o.addColorStop(.3,\"#ffffff\"),o.addColorStop(.6,\"rgb(29, 29, 29)\"),o.addColorStop(.8,\"rgb(200, 194, 192)\"),o.addColorStop(1,\"rgb(209, 209, 209)\"),h.fillStyle=o,h.fill(),h.clip(s(h,c-2,c-2,u-(c-2)*2,f-(c-2)*2,w)),h.fillStyle=\"#f6f6f6\",h.fill(),h.clip(s(h,c-1,c-1,u-(c-1)*2,f-(c-1)*2,w)),h.fillStyle=\"#333333\",h.fill();break;case\"blackMetal\":p=[0,.125,.347222,.5,.680555,.875,1],v=[new n(254,254,254,1),new n(0,0,0,1),new n(153,153,153,1),new n(0,0,0,1),new n(153,153,153,1),new n(0,0,0,1),new n(254,254,254,1)],y=0,a=Math.sqrt(f*f+u*u)/2,h.clip(s(h,1,1,u-2,f-2,l)),o=new it(p,v,-Math.PI/2),o.fill(h,u/2,f/2,y,a);break;case\"shinyMetal\":p=[0,.125,.25,.347222,.5,.652777,.75,.875,1],v=[new n(254,254,254,1),new n(210,210,210,1),new n(179,179,179,1),new n(238,238,238,1),new n(160,160,160,1),new n(238,238,238,1),new n(179,179,179,1),new n(210,210,210,1),new n(254,254,254,1)],y=0,a=Math.sqrt(f*f+u*u)/2,h.clip(s(h,1,1,u-2,f-2,l)),o=new it(p,v,-Math.PI/2),o.fill(h,u/2,f/2,y,a);break;case\"chrome\":p=[0,.09,.12,.16,.25,.29,.33,.38,.48,.52,.63,.68,.8,.83,.87,.97,1],v=[new n(255,255,255,1),new n(255,255,255,1),new n(136,136,138,1),new n(164,185,190,1),new n(158,179,182,1),new n(112,112,112,1),new n(221,227,227,1),new n(155,176,179,1),new n(156,176,177,1),new n(254,255,255,1),new n(255,255,255,1),new n(156,180,180,1),new n(198,209,211,1),new n(246,248,247,1),new n(204,216,216,1),new n(164,188,190,1),new n(255,255,255,1)],y=0,a=Math.sqrt(f*f+u*u)/2,h.clip(s(h,1,1,u-2,f-2,l)),o=new it(p,v,-Math.PI/2),o.fill(h,u/2,f/2,y,a)}s(h,c-1,c-1,u-(c-1)*2,f-(c-1)*2,w-1),h.fillStyle=\"rgb(192, 192, 192)\",h.globalCompositeOperation=\"destination-out\",s(h,c,c,u-c*2,f-c*2,4),h.fill(),ht.cache[b]=k}return i.drawImage(ht.cache[b],0,0),this},ht.cache={},w=function(i,r,u,f,e,o){var p,s,h,k,d,g=e*.831775/2,et,ft,rt,tt,ut,c,v,a,l,nt,y,b=e.toString()+o+r.name;if(!w.cache[b]){p=t(e,o),s=p.getContext(\"2d\"),s.beginPath(),s.arc(u,f,e*.831775/2,0,Math.PI*2,!0),s.closePath();if(r.name===\"CARBON\"||r.name===\"PUNCHED_SHEET\"||r.name===\"BRUSHED_METAL\"||r.name===\"BRUSHED_STAINLESS\")r.name===\"CARBON\"&&(s.fillStyle=s.createPattern(vi,\"repeat\"),s.fill()),r.name===\"PUNCHED_SHEET\"&&(s.fillStyle=s.createPattern(ci,\"repeat\"),s.fill()),h=s.createLinearGradient(g,0,e-g,0),h.addColorStop(0,\"rgba(0, 0, 0, 0.25)\"),h.addColorStop(.5,\"rgba(0, 0, 0, 0)\"),h.addColorStop(1,\"rgba(0, 0, 0, 0.25)\"),s.fillStyle=h,s.beginPath(),s.arc(u,f,e*.831775/2,0,Math.PI*2,!0),s.closePath(),s.fill(),(r.name===\"BRUSHED_METAL\"||r.name===\"BRUSHED_STAINLESS\")&&(et=r.name===\"BRUSHED_METAL\"?!0:!1,ft=parseInt(r.gradientStop.getHexColor().substr(-6),16),rt=li(ft,5,.1,et,.5),s.fillStyle=s.createPattern(rt.fill(0,0,e,o),\"no-repeat\"),s.fill());else if(r.name===\"STAINLESS\"||r.name===\"TURNED\"){k=[0,.03,.1,.14,.24,.33,.38,.5,.62,.67,.76,.81,.85,.97,1],d=[new n(\"#FDFDFD\"),new n(\"#FDFDFD\"),new n(\"#B2B2B4\"),new n(\"#ACACAE\"),new n(\"#FDFDFD\"),new n(\"#6E6E70\"),new n(\"#6E6E70\"),new n(\"#FDFDFD\"),new n(\"#6E6E70\"),new n(\"#6E6E70\"),new n(\"#FDFDFD\"),new n(\"#ACACAE\"),new n(\"#B2B2B4\"),new n(\"#FDFDFD\"),new n(\"#FDFDFD\")],tt=e*.831775/2,ut=0,h=new it(k,d,Math.PI/1.75),h.fill(s,u,f,ut,tt),s.closePath();if(r.name===\"TURNED\"){for(c=Math.PI*2,v=e*.831775/2,a=v*.55,l=c/360*(500/v),s.save(),s.clip(s.arc(u,f,v,0,c)),s.lineWidth=.5,nt=c-l*.3,y=0;y<nt;y+=l)s.strokeStyle=\"rgba(240, 240, 255, 0.25)\",s.beginPath(),s.arc(u+a,f,a,0,c),s.stroke(),s.translate(u,f),s.rotate(l*.3),s.translate(-u,-f),s.strokeStyle=\"rgba(25, 10, 10, 0.1)\",s.beginPath(),s.arc(u+a,f,a,0,c),s.stroke(),s.translate(u,f),s.rotate(-l*.3),s.translate(-u,-f),s.translate(u,f),s.rotate(l),s.translate(-u,-f);s.restore()}}else h=s.createLinearGradient(0,e*.084112,0,o*.831775),h.addColorStop(0,r.gradientStart.getRgbaColor()),h.addColorStop(.4,r.gradientFraction.getRgbaColor()),h.addColorStop(1,r.gradientStop.getRgbaColor()),s.fillStyle=h,s.fill();h=s.createRadialGradient(u,f,0,u,f,e*.831775/2),h.addColorStop(0,\"rgba(0, 0, 0, 0)\"),h.addColorStop(.7,\"rgba(0, 0, 0, 0)\"),h.addColorStop(.71,\"rgba(0, 0, 0, 0)\"),h.addColorStop(.86,\"rgba(0, 0, 0, 0.03)\"),h.addColorStop(.92,\"rgba(0, 0, 0, 0.07)\"),h.addColorStop(.97,\"rgba(0, 0, 0, 0.15)\"),h.addColorStop(1,\"rgba(0, 0, 0, 0.3)\"),s.fillStyle=h,s.beginPath(),s.arc(u,f,e*.831775/2,0,c,!0),s.closePath(),s.fill(),w.cache[b]=p}return i.drawImage(w.cache[b],0,0),this},w.cache={},rt=function(n,t,i,r,u,f){var o=u*.831775,e=f*.831775,h=(u-o)/2,s=(f-e)/2;return t!==null&&t.height>0&&t.width>0&&(n.save(),n.beginPath(),n.arc(i,r,u*.831775/2,0,Math.PI*2,!0),n.clip(),n.drawImage(t,h,s,o,e),n.restore()),this},ot=function(i,r,u,f,e){var l,tt,c,ut,b,h,g,o,k,w,p,v,a,y,ft,rt,nt,d=u.toString()+f+e+r.name;if(!ot.cache[d]){h=Math.sqrt(u*u+f*f)*.04,h=Math.min(h,(e?u:f)*.1),g=t(u,f),o=g.getContext(\"2d\"),linBColor=r,s(o,h,h,u-h*2,f-h*2,4);if(r.name===\"CARBON\"||r.name===\"PUNCHED_SHEET\"||r.name===\"STAINLESS\"||r.name===\"BRUSHED_METAL\"||r.name===\"BRUSHED_STAINLESS\"||r.name===\"TURNED\"){r.name===\"CARBON\"&&(o.fillStyle=o.createPattern(vi,\"repeat\"),o.fill()),r.name===\"PUNCHED_SHEET\"&&(o.fillStyle=o.createPattern(ci,\"repeat\"),o.fill());if(r.name===\"STAINLESS\"||r.name===\"TURNED\"){ut=[0,.03,.1,.14,.24,.33,.38,.5,.62,.67,.76,.81,.85,.97,1],b=[new n(\"#FDFDFD\"),new n(\"#FDFDFD\"),new n(\"#B2B2B4\"),new n(\"#ACACAE\"),new n(\"#FDFDFD\"),new n(\"#6E6E70\"),new n(\"#6E6E70\"),new n(\"#FDFDFD\"),new n(\"#6E6E70\"),new n(\"#6E6E70\"),new n(\"#FDFDFD\"),new n(\"#ACACAE\"),new n(\"#B2B2B4\"),new n(\"#FDFDFD\"),new n(\"#FDFDFD\")],c=new it(ut,b,Math.PI/1.75),o.clip(s(o,h,h,u-h*2,f-h*2,4)),k=Math.sqrt((u-h*2)*(u-h*2)+(f-h*2)*(f-h*2))/2,c.fill(o,u/2,f/2,0,k),c=o.createLinearGradient(0,h,0,f-h*2),c.addColorStop(0,\"rgba(0, 0, 0, 0.25)\"),c.addColorStop(.1,\"rgba(0, 0, 0, 0.05)\"),c.addColorStop(1,\"rgba(0, 0, 0, 0)\"),o.fillStyle=c,s(o,h,h,u-h*2,f-h*2,4),o.fill(),o.restore();if(r.name===\"TURNED\"){for(w=Math.PI*2,p=k*.55,v=u/2,a=f/2,y=w/360*(400/k),o.save(),o.lineWidth=.5,tt=w-y*.3,l=0;l<tt;l+=y)o.strokeStyle=\"rgba(240, 240, 255, 0.25)\",o.beginPath(),o.arc(v+p,a,p,0,w),o.stroke(),o.translate(v,a),o.rotate(y*.3),o.translate(-v,-a),o.strokeStyle=\"rgba(25, 10, 10, 0.1)\",o.beginPath(),o.arc(v+p,a,p,0,w),o.stroke(),o.translate(v,a),o.rotate(-y*.3),o.translate(-v,-a),o.translate(v,a),o.rotate(y),o.translate(-v,-a);o.restore()}}c=o.createLinearGradient(h,h,u-h*2,f-h*2),c.addColorStop(0,\"rgba(0, 0, 0, 0.25)\"),c.addColorStop(.5,\"rgba(0, 0, 0, 0)\"),c.addColorStop(1,\"rgba(0, 0, 0, 0.25)\"),o.fillStyle=c,s(o,h,h,u-h*2,f-h*2,4),o.fill(),(r.name===\"BRUSHED_METAL\"||r.name===\"BRUSHED_STAINLESS\")&&(ft=r.name===\"BRUSHED_METAL\"?!0:!1,rt=parseInt(r.gradientStop.getHexColor().substr(-6),16),nt=li(rt,5,.1,ft,.5),o.fillStyle=o.createPattern(nt.fill(0,0,u,f),\"no-repeat\"),o.fill())}else c=o.createLinearGradient(0,h,0,f-h*2),c.addColorStop(0,r.gradientStart.getRgbaColor()),c.addColorStop(.4,r.gradientFraction.getRgbaColor()),c.addColorStop(1,r.gradientStop.getRgbaColor()),o.fillStyle=c,o.fill();for(b=[\"rgba(0, 0, 0, 0.3)\",\"rgba(0, 0, 0, 0.15)\",\"rgba(0, 0, 0, 0.07)\",\"rgba(0, 0, 0, 0.03)\",\"rgba(0, 0, 0, 0)\",\"rgba(0, 0, 0, 0)\",\"rgba(0, 0, 0, 0)\"],l=0;l<7;l++)s(o,h+l,h+l,u-h*2-2*l,f-h*2-2*l,4),o.strokeStyle=b[l],o.stroke();ot.cache[d]=g}return i.drawImage(ot.cache[d],0,0),this},ot.cache={},y=function(n,i,r,u,f,o,s,h,c){var g,l,v=Math.ceil(u*.084112),p=r*.5-v/2,b=u*.5-v/2,w=r*.008,a,k,d=i.type+r+u+f+(o!==undefined?o.type:\"-\")+(s!==undefined?s.style:\"-\")+(h!==undefined?h.type:\"-\")+(c!==undefined?c.type:\"-\");if(!y.cache[d]){g=t(r,u),l=g.getContext(\"2d\"),f&&(h===steelseries.GaugeType.TYPE5?steelseries.Orientation.WEST===c?(p=r*.733644-v/2,l.drawImage(e(v,o,s,!0),p+w,b+w),l.drawImage(e(v,o,s,!1),p,b)):(b=u*.733644-v/2,l.drawImage(e(v,o,s,!0),p+w,u*.6857+w),l.drawImage(e(v,o,s,!1),p,u*.6857)):(l.drawImage(e(v,o,s,!0),p+w,b+w),l.drawImage(e(v,o,s,!1),p,b)));switch(i.type){case\"type2\":l.beginPath(),l.moveTo(r*.135514,u*.696261),l.bezierCurveTo(r*.214953,u*.588785,r*.317757,u*.5,r*.462616,u*.425233),l.bezierCurveTo(r*.612149,u*.345794,r*.733644,u*.317757,r*.873831,u*.322429),l.bezierCurveTo(r*.766355,u*.112149,r*.528037,u*.023364,r*.313084,u*.130841),l.bezierCurveTo(r*.09813,u*.238317,r*.028037,u*.485981,r*.135514,u*.696261),l.closePath(),a=l.createLinearGradient(.313084*r,.135514*u,.495528*r,.493582*u),a.addColorStop(0,\"rgba(255, 255, 255, 0.275)\"),a.addColorStop(1,\"rgba(255, 255, 255, 0.015)\");break;case\"type3\":l.beginPath(),l.moveTo(r*.084112,u*.509345),l.bezierCurveTo(r*.21028,u*.556074,r*.462616,u*.560747,r*.5,u*.560747),l.bezierCurveTo(r*.537383,u*.560747,r*.794392,u*.560747,r*.915887,u*.509345),l.bezierCurveTo(r*.915887,u*.2757,r*.738317,u*.084112,r*.5,u*.084112),l.bezierCurveTo(r*.261682,u*.084112,r*.084112,u*.2757,r*.084112,u*.509345),l.closePath(),a=l.createLinearGradient(0,.093457*u,0,.556073*u),a.addColorStop(0,\"rgba(255, 255, 255, 0.275)\"),a.addColorStop(1,\"rgba(255, 255, 255, 0.015)\");break;case\"type4\":l.beginPath(),l.moveTo(r*.67757,u*.24299),l.bezierCurveTo(r*.771028,u*.308411,r*.822429,u*.411214,r*.813084,u*.528037),l.bezierCurveTo(r*.799065,u*.654205,r*.719626,u*.757009,r*.593457,u*.799065),l.bezierCurveTo(r*.485981,u*.831775,r*.369158,u*.808411,r*.285046,u*.728971),l.bezierCurveTo(r*.2757,u*.719626,r*.252336,u*.714953,r*.233644,u*.728971),l.bezierCurveTo(r*.214953,u*.747663,r*.219626,u*.771028,r*.228971,u*.7757),l.bezierCurveTo(r*.331775,u*.878504,r*.476635,u*.915887,r*.616822,u*.869158),l.bezierCurveTo(r*.771028,u*.822429,r*.873831,u*.691588,r*.88785,u*.53271),l.bezierCurveTo(r*.897196,u*.38785,r*.836448,u*.257009,r*.719626,u*.182242),l.bezierCurveTo(r*.705607,u*.172897,r*.682242,u*.163551,r*.663551,u*.186915),l.bezierCurveTo(r*.654205,u*.205607,r*.668224,u*.238317,r*.67757,u*.24299),l.closePath(),a=l.createRadialGradient(.5*r,.5*u,0,.5*r,.5*u,.38785*r),a.addColorStop(0,\"rgba(255, 255, 255, 0)\"),a.addColorStop(.82,\"rgba(255, 255, 255, 0)\"),a.addColorStop(.83,\"rgba(255, 255, 255, 0)\"),a.addColorStop(1,\"rgba(255, 255, 255, 0.15)\"),l.beginPath(),l.moveTo(r*.261682,u*.224299),l.bezierCurveTo(r*.285046,u*.238317,r*.252336,u*.285046,r*.24299,u*.317757),l.bezierCurveTo(r*.24299,u*.350467,r*.271028,u*.383177,r*.271028,u*.397196),l.bezierCurveTo(r*.2757,u*.415887,r*.261682,u*.457943,r*.238317,u*.509345),l.bezierCurveTo(r*.224299,u*.542056,r*.17757,u*.612149,r*.158878,u*.612149),l.bezierCurveTo(r*.144859,u*.612149,r*.088785,u*.546728,r*.130841,u*.369158),l.bezierCurveTo(r*.140186,u*.336448,r*.214953,u*.200934,r*.261682,u*.224299),l.closePath(),k=l.createLinearGradient(.130841*r,.369158*u,.273839*r,.412877*u),k.addColorStop(0,\"rgba(255, 255, 255, 0.275)\"),k.addColorStop(1,\"rgba(255, 255, 255, 0.015)\"),l.fillStyle=k,l.fill();break;case\"type5\":l.beginPath(),l.moveTo(r*.084112,u*.5),l.bezierCurveTo(r*.084112,u*.271028,r*.271028,u*.084112,r*.5,u*.084112),l.bezierCurveTo(r*.700934,u*.084112,r*.864485,u*.224299,r*.906542,u*.411214),l.bezierCurveTo(r*.911214,u*.439252,r*.911214,u*.518691,r*.845794,u*.537383),l.bezierCurveTo(r*.794392,u*.546728,r*.551401,u*.411214,r*.392523,u*.457943),l.bezierCurveTo(r*.168224,u*.509345,r*.135514,u*.7757,r*.093457,u*.593457),l.bezierCurveTo(r*.088785,u*.560747,r*.084112,u*.53271,r*.084112,u*.5),l.closePath(),a=l.createLinearGradient(0,.084112*u,0,.644859*u),a.addColorStop(0,\"rgba(255, 255, 255, 0.275)\"),a.addColorStop(1,\"rgba(255, 255, 255, 0.015)\");break;case\"type1\":default:l.beginPath(),l.moveTo(r*.084112,u*.509345),l.bezierCurveTo(r*.205607,u*.448598,r*.336448,u*.415887,r*.5,u*.415887),l.bezierCurveTo(r*.672897,u*.415887,r*.789719,u*.443925,r*.915887,u*.509345),l.bezierCurveTo(r*.915887,u*.2757,r*.738317,u*.084112,r*.5,u*.084112),l.bezierCurveTo(r*.261682,u*.084112,r*.084112,u*.2757,r*.084112,u*.509345),l.closePath(),a=l.createLinearGradient(0,.088785*u,0,.490654*u),a.addColorStop(0,\"rgba(255, 255, 255, 0.275)\"),a.addColorStop(1,\"rgba(255, 255, 255, 0.015)\")}l.fillStyle=a,l.fill(),y.cache[d]=g}return n.drawImage(y.cache[d],0,0),this},y.cache={},et=function(n,i,r,u){var l,o,e,h,f,s,c=i.toString()+r+u;return et.cache[c]||(l=t(i,r),o=l.getContext(\"2d\"),h=Math.sqrt(i*i+r*r)*.04,h=Math.min(h,(u?i:r)*.1),f=h*1.3,s=f*1.33,o.beginPath(),o.moveTo(f,r-f),o.lineTo(i-f,r-f),o.bezierCurveTo(i-f,r-f,i-s,r*.7,i-s,r*.5),o.bezierCurveTo(i-s,s,i-f,f,i-h,f),o.lineTo(f,f),o.bezierCurveTo(f,f,s,r*.285714,s,r*.5),o.bezierCurveTo(s,r*.7,f,r-f,h,r-f),o.closePath(),e=o.createLinearGradient(0,r-h,0,h),e.addColorStop(0,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.06,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.07,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.12,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.17,\"rgba(255, 255, 255, 0.013546)\"),e.addColorStop(.1701,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.79,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.8,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.84,\"rgba(255, 255, 255, 0.082217)\"),e.addColorStop(.93,\"rgba(255, 255, 255, 0.288702)\"),e.addColorStop(.94,\"rgba(255, 255, 255, 0.298039)\"),e.addColorStop(.96,\"rgba(255, 255, 255, 0.119213)\"),e.addColorStop(.97,\"rgba(255, 255, 255, 0)\"),e.addColorStop(1,\"rgba(255, 255, 255, 0)\"),o.fillStyle=e,o.fill(),et.cache[c]=l),n.drawImage(et.cache[c],0,0),this},et.cache={},e=function(n,i,r,u){var l,f,h=n/2,s=n/2,o,c=n.toString()+i.type+r.style+u;if(!e.cache[c]){l=t(n*1.18889,n*1.18889),f=l.getContext(\"2d\"),u&&(f.fillStyle=\"rgba(0, 0, 0, 1)\",f.strokeStyle=\"rgba(0, 0, 0, 1)\",f.shadowBlur=3,f.globalAlpha=.5);switch(i.type){case\"metalKnob\":f.beginPath(),f.moveTo(0,n*.5),f.bezierCurveTo(0,n*.222222,n*.222222,0,n*.5,0),f.bezierCurveTo(n*.777777,0,n,n*.222222,n,n*.5),f.bezierCurveTo(n,n*.777777,n*.777777,n,n*.5,n),f.bezierCurveTo(n*.222222,n,0,n*.777777,0,n*.5),f.closePath(),u||(o=f.createLinearGradient(0,0,0,n),o.addColorStop(0,\"rgb(92, 95, 101)\"),o.addColorStop(.47,\"rgb(46, 49, 53)\"),o.addColorStop(1,\"rgb(22, 23, 26)\"),f.fillStyle=o),f.fill(),f.beginPath(),f.moveTo(n*.055555,n*.5),f.bezierCurveTo(n*.055555,n*.277777,n*.277777,n*.055555,n*.5,n*.055555),f.bezierCurveTo(n*.722222,n*.055555,n*.944444,n*.277777,n*.944444,n*.5),f.bezierCurveTo(n*.944444,n*.722222,n*.722222,n*.944444,n*.5,n*.944444),f.bezierCurveTo(n*.277777,n*.944444,n*.055555,n*.722222,n*.055555,n*.5),f.closePath();if(u)f.fill();else{o=f.createLinearGradient(0,.055555*n,0,.944443*n);switch(r.style){case\"black\":o.addColorStop(0,\"rgb(43, 42, 47)\"),o.addColorStop(1,\"rgb(26, 27, 32)\");break;case\"brass\":o.addColorStop(0,\"rgb(150, 110, 54)\"),o.addColorStop(1,\"rgb(124, 95, 61)\");break;case\"silver\":default:o.addColorStop(0,\"rgb(204, 204, 204)\"),o.addColorStop(1,\"rgb(87, 92, 98)\")}f.fillStyle=o,f.fill()}f.beginPath(),f.moveTo(n*.777777,n*.833333),f.bezierCurveTo(n*.722222,n*.722222,n*.611111,n*.666666,n*.5,n*.666666),f.bezierCurveTo(n*.388888,n*.666666,n*.277777,n*.722222,n*.222222,n*.833333),f.bezierCurveTo(n*.277777,n*.888888,n*.388888,n*.944444,n*.5,n*.944444),f.bezierCurveTo(n*.611111,n*.944444,n*.722222,n*.888888,n*.777777,n*.833333),f.closePath(),u||(o=f.createRadialGradient(.555555*n,.944444*n,0,.555555*n,.944444*n,.388888*n),o.addColorStop(0,\"rgba(255, 255, 255, 0.6)\"),o.addColorStop(1,\"rgba(255, 255, 255, 0)\"),f.fillStyle=o),f.fill(),f.beginPath(),f.moveTo(n*.944444,n*.277777),f.bezierCurveTo(n*.833333,n*.111111,n*.666666,0,n*.5,0),f.bezierCurveTo(n*.333333,0,n*.166666,n*.111111,n*.055555,n*.277777),f.bezierCurveTo(n*.166666,n*.333333,n*.333333,n*.388888,n*.5,n*.388888),f.bezierCurveTo(n*.666666,n*.388888,n*.833333,n*.333333,n*.944444,n*.277777),f.closePath(),u||(o=f.createRadialGradient(.5*n,0,0,.5*n,0,.583333*n),o.addColorStop(0,\"rgba(255, 255, 255, 0.749019)\"),o.addColorStop(1,\"rgba(255, 255, 255, 0)\"),f.fillStyle=o),f.fill(),f.beginPath(),f.moveTo(n*.277777,n*.555555),f.bezierCurveTo(n*.277777,n*.388888,n*.388888,n*.277777,n*.5,n*.277777),f.bezierCurveTo(n*.611111,n*.277777,n*.777777,n*.388888,n*.777777,n*.555555),f.bezierCurveTo(n*.777777,n*.666666,n*.611111,n*.777777,n*.5,n*.777777),f.bezierCurveTo(n*.388888,n*.777777,n*.277777,n*.666666,n*.277777,n*.555555),f.closePath(),u||(o=f.createLinearGradient(0,.277777*n,0,.722221*n),o.addColorStop(0,\"#000000\"),o.addColorStop(1,\"rgb(204, 204, 204)\"),f.fillStyle=o),f.fill(),f.beginPath(),f.moveTo(n*.333333,n*.555555),f.bezierCurveTo(n*.333333,n*.444444,n*.388888,n*.333333,n*.5,n*.333333),f.bezierCurveTo(n*.611111,n*.333333,n*.722222,n*.444444,n*.722222,n*.555555),f.bezierCurveTo(n*.722222,n*.611111,n*.611111,n*.722222,n*.5,n*.722222),f.bezierCurveTo(n*.388888,n*.722222,n*.333333,n*.611111,n*.333333,n*.555555),f.closePath(),u||(o=f.createLinearGradient(0,.333333*n,0,.666666*n),o.addColorStop(0,\"rgb(10, 9, 1)\"),o.addColorStop(1,\"rgb(42, 41, 37)\"),f.fillStyle=o),f.fill();break;case\"standardKnob\":u||(o=f.createLinearGradient(0,0,0,n),o.addColorStop(0,\"rgb(180, 180, 180)\"),o.addColorStop(.46,\"rgb(63, 63, 63)\"),o.addColorStop(1,\"rgb(40, 40, 40)\"),f.fillStyle=o),f.beginPath(),f.arc(h,s,n/2,0,Math.PI*2,!0),f.closePath(),f.fill();if(!u){o=f.createLinearGradient(0,n-n*.77,0,n-n*.77+n*.77);switch(r.style){case\"black\":o.addColorStop(0,\"rgb(191, 191, 191)\"),o.addColorStop(.5,\"rgb(45, 44, 49)\"),o.addColorStop(1,\"rgb(125, 126, 128)\");break;case\"brass\":o.addColorStop(0,\"rgb(223, 208, 174)\"),o.addColorStop(.5,\"rgb(123, 95, 63)\"),o.addColorStop(1,\"rgb(207, 190, 157)\");break;case\"silver\":default:o.addColorStop(0,\"rgb(215, 215, 215)\"),o.addColorStop(.5,\"rgb(116, 116, 116)\"),o.addColorStop(1,\"rgb(215, 215, 215)\")}f.fillStyle=o}f.beginPath(),f.arc(h,s,n*.77/2,0,Math.PI*2,!0),f.closePath(),f.fill(),u||(o=f.createRadialGradient(h,s,0,h,s,n*.77/2),o.addColorStop(0,\"rgba(0, 0, 0, 0)\"),o.addColorStop(.75,\"rgba(0, 0, 0, 0)\"),o.addColorStop(.76,\"rgba(0, 0, 0, 0.01)\"),o.addColorStop(1,\"rgba(0, 0, 0, 0.2)\"),f.fillStyle=o),f.beginPath(),f.arc(h,s,n*.77/2,0,Math.PI*2,!0),f.closePath(),f.fill()}e.cache[c]=l}return e.cache[c]},e.cache={},o=function(n,i,r){var l,u,s=n/2,h=n/2,e,c=n.toString()+i+r.outerColor_ON;if(!o.cache[c]){l=t(n,n),u=l.getContext(\"2d\");switch(i){case 0:e=u.createRadialGradient(s,h,0,s,h,n*.5/2),e.addColorStop(0,r.innerColor1_OFF),e.addColorStop(.2,r.innerColor2_OFF),e.addColorStop(1,r.outerColor_OFF),u.fillStyle=e,u.beginPath(),u.arc(s,h,n*.5/2,0,Math.PI*2,!0),u.closePath(),u.fill(),e=u.createRadialGradient(s,h,0,s,h,n*.5/2),e.addColorStop(0,\"rgba(0, 0, 0, 0)\"),e.addColorStop(.8,\"rgba(0, 0, 0, 0)\"),e.addColorStop(1,\"rgba(0, 0, 0, 0.4)\"),u.fillStyle=e,u.beginPath(),u.arc(s,h,n*.5/2,0,Math.PI*2,!0),u.closePath(),u.fill(),e=u.createLinearGradient(0,.35*n,0,.35*n+.15*n),e.addColorStop(0,\"rgba(255, 255, 255, 0.4)\"),e.addColorStop(1,\"rgba(255, 255, 255, 0)\"),u.fillStyle=e,u.beginPath(),u.arc(s,.35*n+.2*n/2,n*.2,0,Math.PI*2,!0),u.closePath(),u.fill();break;case 1:e=u.createRadialGradient(s,h,0,s,h,n*.5/2),e.addColorStop(0,r.innerColor1_ON),e.addColorStop(.2,r.innerColor2_ON),e.addColorStop(1,r.outerColor_ON),u.fillStyle=e,u.beginPath(),u.arc(s,h,n*.5/2,0,Math.PI*2,!0),u.closePath(),u.fill(),e=u.createRadialGradient(s,h,0,s,h,n*.5/2),e.addColorStop(0,\"rgba(0, 0, 0, 0)\"),e.addColorStop(.8,\"rgba(0, 0, 0, 0)\"),e.addColorStop(1,\"rgba(0, 0, 0, 0.4)\"),u.fillStyle=e,u.beginPath(),u.arc(s,h,n*.5/2,0,Math.PI*2,!0),u.closePath(),u.fill(),e=u.createLinearGradient(0,.35*n,0,.35*n+.15*n),e.addColorStop(0,\"rgba(255, 255, 255, 0.4)\"),e.addColorStop(1,\"rgba(255, 255, 255, 0)\"),u.fillStyle=e,u.beginPath(),u.arc(s,.35*n+.2*n/2,n*.2,0,Math.PI*2,!0),u.closePath(),u.fill(),e=u.createRadialGradient(s,h,0,s,h,n/2),e.addColorStop(0,f(r.coronaColor,0).color),e.addColorStop(.6,f(r.coronaColor,.4).color),e.addColorStop(.7,f(r.coronaColor,.25).color),e.addColorStop(.8,f(r.coronaColor,.15).color),e.addColorStop(.85,f(r.coronaColor,.05).color),e.addColorStop(1,f(r.coronaColor,0).color),u.fillStyle=e,u.beginPath(),u.arc(s,h,n/2,0,Math.PI*2,!0),u.closePath(),u.fill()}o.cache[c]=l}return o.cache[c]},o.cache={},p=function(n,i,r){var c,f,b=0,h=0,y=n,a=i,v=Math.min(n,i)*.095,u,k=1,o=1,d=n-2,l=i-2,w=v-1,e=n.toString()+i+JSON.stringify(r);return p.cache[e]||(c=t(n,i),f=c.getContext(\"2d\"),u=f.createLinearGradient(0,h,0,h+a),u.addColorStop(0,\"#4c4c4c\"),u.addColorStop(.08,\"#666666\"),u.addColorStop(.92,\"#666666\"),u.addColorStop(1,\"#e6e6e6\"),f.fillStyle=u,s(f,b,h,y,a,v),f.fill(),u=f.createLinearGradient(0,o,0,o+l),u.addColorStop(0,r.gradientStartColor),u.addColorStop(.03,r.gradientFraction1Color),u.addColorStop(.49,r.gradientFraction2Color),u.addColorStop(.5,r.gradientFraction3Color),u.addColorStop(1,r.gradientStopColor),f.fillStyle=u,s(f,k,o,d,l,w),f.fill(),p.cache[e]=c),p.cache[e]},p.cache={},a=function(n,t,i,u){var e,f,o=n.toString()+t+i+u;return a.cache[o]||(e=r.createElement(\"canvas\"),f=e.getContext(\"2d\"),e.width=n,e.height=n,f.fillStyle=t,i?(f.beginPath(),f.moveTo(n*.5,n),f.lineTo(0,0),f.lineTo(n,0),f.closePath(),f.fill()):u?(f.beginPath(),f.moveTo(n,n*.5),f.lineTo(0,0),f.lineTo(0,n),f.closePath(),f.fill()):(f.beginPath(),f.moveTo(n*.5,0),f.lineTo(n,n),f.lineTo(0,n),f.closePath(),f.fill()),a.cache[o]=e),a.cache[o]},a.cache={},d=function(n,i,r){var e=n*2,l,u,o,v,c=i.state+n+JSON.stringify(r),s=function(){var t=r[0];i.state===\"up\"?(o=u.createRadialGradient(.5*n,.2*e,0,.5*n,.2*e,.5*n),o.addColorStop(0,t.innerColor1_ON),o.addColorStop(.2,t.innerColor2_ON),o.addColorStop(1,t.outerColor_ON)):(o=u.createLinearGradient(0,0,0,.5*e),o.addColorStop(0,\"#323232\"),o.addColorStop(1,\"#5c5c5c\")),u.fillStyle=o,u.beginPath(),u.moveTo(.5*n,0),u.lineTo(n,.2*e),u.lineTo(.752*n,.2*e),u.lineTo(.752*n,.37*e),u.lineTo(.252*n,.37*e),u.lineTo(.252*n,.2*e),u.lineTo(0,.2*e),u.closePath(),u.fill(),i.state!==\"up\"?(u.strokeStyle=\"rgba(0, 0, 0, 0.4)\",u.beginPath(),u.moveTo(0,.2*e),u.lineTo(.5*n,0),u.lineTo(n,.2*e),u.moveTo(.252*n,.2*e),u.lineTo(.252*n,.37*e),u.stroke(),u.strokeStyle=\"rgba(255, 255, 255, 0.3)\",u.beginPath(),u.moveTo(.252*n,.37*e),u.lineTo(.752*n,.37*e),u.lineTo(.752*n,.2*e),u.lineTo(n,.2*e),u.stroke()):(o=u.createRadialGradient(.5*n,.2*e,0,.5*n,.2*e,.7*n),o.addColorStop(0,f(t.coronaColor,0).color),o.addColorStop(.5,f(t.coronaColor,.3).color),o.addColorStop(.7,f(t.coronaColor,.2).color),o.addColorStop(.8,f(t.coronaColor,.1).color),o.addColorStop(.85,f(t.coronaColor,.05).color),o.addColorStop(1,f(t.coronaColor,0).color),u.fillStyle=o,u.beginPath(),u.arc(.5*n,.2*e,.7*n,0,Math.PI*2,!0),u.closePath(),u.fill())},h=function(){var t=r[1];u.beginPath(),i.state===\"steady\"?(o=t.outerColor_ON,u.fillStyle=o,u.rect(.128*n,.41*e,.744*n,.074*e),u.rect(.128*n,.516*e,.744*n,.074*e),u.closePath(),u.fill()):(o=u.createLinearGradient(0,.41*e,0,.41*e+.074*e),o.addColorStop(0,\"#323232\"),o.addColorStop(1,\"#5c5c5c\"),u.fillStyle=o,u.rect(.128*n,.41*e,.744*n,.074*e),u.closePath(),u.fill(),o=u.createLinearGradient(0,.516*e,0,.516*e+.074*e),o.addColorStop(0,\"#323232\"),o.addColorStop(1,\"#5c5c5c\"),u.fillStyle=o,u.rect(.128*n,.516*e,.744*n,.074*e),u.closePath(),u.fill()),i.state!==\"steady\"?(u.strokeStyle=\"rgba(0, 0, 0, 0.4)\",u.beginPath(),u.moveTo(.128*n,.41*e+.074*e),u.lineTo(.128*n,.41*e),u.lineTo(.128*n+.744*n,.41*e),u.stroke(),u.beginPath(),u.moveTo(.128*n,.516*e+.074*e),u.lineTo(.128*n,.516*e),u.lineTo(.128*n+.744*n,.516*e),u.stroke(),u.strokeStyle=\"rgba(255, 255, 255, 0.3)\",u.beginPath(),u.moveTo(.128*n+.744*n,.41*e),u.lineTo(.128*n+.744*n,.41*e+.074*e),u.lineTo(.128*n,.41*e+.074*e),u.stroke(),u.beginPath(),u.moveTo(.128*n+.744*n,.516*e),u.lineTo(.128*n+.744*n,.516*e+.074*e),u.lineTo(.128*n,.516*e+.074*e),u.stroke()):(o=u.createRadialGradient(.5*n,.5*e,0,.5*n,.5*e,.7*n),o.addColorStop(0,f(t.coronaColor,0).color),o.addColorStop(.5,f(t.coronaColor,.3).color),o.addColorStop(.7,f(t.coronaColor,.2).color),o.addColorStop(.8,f(t.coronaColor,.1).color),o.addColorStop(.85,f(t.coronaColor,.05).color),o.addColorStop(1,f(t.coronaColor,0).color),u.fillStyle=o,u.beginPath(),u.arc(.5*n,.5*e,.7*n,0,Math.PI*2,!0),u.closePath(),u.fill())},a=function(){var t=r[2];i.state===\"down\"?(o=u.createRadialGradient(.5*n,.8*e,0,.5*n,.8*e,.5*n),o.addColorStop(0,t.innerColor1_ON),o.addColorStop(.2,t.innerColor2_ON),o.addColorStop(1,t.outerColor_ON)):(o=u.createLinearGradient(0,.63*e,0,e),o.addColorStop(0,\"#323232\"),o.addColorStop(1,\"#5c5c5c\")),u.beginPath(),u.fillStyle=o,u.moveTo(.5*n,e),u.lineTo(n,.8*e),u.lineTo(.725*n,.8*e),u.lineTo(.725*n,.63*e),u.lineTo(.252*n,.63*e),u.lineTo(.252*n,.8*e),u.lineTo(0,.8*e),u.closePath(),u.fill(),i.state!==\"down\"?(u.strokeStyle=\"rgba(0, 0, 0, 0.4)\",u.beginPath(),u.moveTo(0,.8*e),u.lineTo(.252*n,.8*e),u.moveTo(.252*n,.63*e),u.lineTo(.752*n,.63*e),u.stroke(),u.beginPath(),u.moveTo(.752*n,.8*e),u.lineTo(n,.8*e),u.stroke(),u.strokeStyle=\"rgba(255, 255, 255, 0.3)\",u.beginPath(),u.moveTo(0,.8*e),u.lineTo(.5*n,e),u.lineTo(n,.8*e),u.stroke(),u.beginPath(),u.moveTo(.752*n,.8*e),u.lineTo(.752*n,.63*e),u.stroke()):(o=u.createRadialGradient(.5*n,.8*e,0,.5*n,.8*e,.7*n),o.addColorStop(0,f(t.coronaColor,0).color),o.addColorStop(.5,f(t.coronaColor,.3).color),o.addColorStop(.7,f(t.coronaColor,.2).color),o.addColorStop(.8,f(t.coronaColor,.1).color),o.addColorStop(.85,f(t.coronaColor,.05).color),o.addColorStop(1,f(t.coronaColor,0).color),u.fillStyle=o,u.beginPath(),u.arc(.5*n,.8*e,.7*n,0,Math.PI*2,!0),u.closePath(),u.fill())};if(!d.cache[c]){l=t(n*2,n*4),u=l.getContext(\"2d\"),u.translate(n*.5,n*.5);switch(i.state){case\"up\":a(),h(),s();break;case\"steady\":a(),s(),h();break;case\"down\":default:s(),h(),a()}d.cache[c]=l}return d.cache[c]},d.cache={};var ct=function(n,t,i,r,u,f,e,o,s,h){h=undefined===h?h=steelseries.GaugeType.TYPE1:h,n.save(),n.textAlign=o?\"center\":\"left\",n.textBaseline=\"middle\",n.strokeStyle=f.labelColor.getRgbaColor(),n.fillStyle=f.labelColor.getRgbaColor(),o?(n.font=.046728*t+\"px sans-serif\",n.fillText(r,t/2,i*.3,t*.3),n.fillText(u,t/2,i*.38,t*.3)):e?(n.font=.1*t+\"px sans-serif\",n.save(),n.translate(.671428*t,.1375*i),n.rotate(1.570796),n.fillText(r,0,0),n.translate(-.671428*t,-.1375*i),n.restore(),n.font=.071428*t+\"px sans-serif\",s?h.type===\"type2\"?(n.textAlign=\"right\",n.fillText(u,.36*t,i*.79,t*.25)):n.fillText(u,.63*t,i*.85,t*.2):(n.textAlign=\"center\",h.type===\"type2\"?n.fillText(u,t/2,i*.92,t*.2):n.fillText(u,t/2,i*.89,t*.2))):(n.font=.035*t+\"px sans-serif\",n.fillText(r,t*.15,i*.25,t*.3),n.font=.025*t+\"px sans-serif\",n.fillText(u,t*.0625,i*.7,t*.07)),n.restore()},vi=ii(12,12,function(n){var u=n.canvas.width,t=n.canvas.height,f=0,r=0,i;n.save(),n.save(),n.beginPath(),n.rect(0,0,u*.5,t*.5),n.closePath(),n.restore(),i=n.createLinearGradient(0,r*t,0,.5*t+r*t),i.addColorStop(0,\"rgb(35, 35, 35)\"),i.addColorStop(1,\"rgb(23, 23, 23)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.083333,0,u*.333333,t*.416666),n.closePath(),n.restore(),f=.083333,r=0,i=n.createLinearGradient(0,r*t,0,.416666*t+r*t),i.addColorStop(0,\"rgb(38, 38, 38)\"),i.addColorStop(1,\"rgb(30, 30, 30)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.5,t*.5,u*.5,t*.5),n.closePath(),n.restore(),f=.5,r=.5,i=n.createLinearGradient(0,r*t,0,.5*t+r*t),i.addColorStop(0,\"rgb(35, 35, 35)\"),i.addColorStop(1,\"rgb(23, 23, 23)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.583333,t*.5,u*.333333,t*.416666),n.closePath(),n.restore(),f=.583333,r=.5,i=n.createLinearGradient(0,r*t,0,.416666*t+r*t),i.addColorStop(0,\"rgb(38, 38, 38)\"),i.addColorStop(1,\"rgb(30, 30, 30)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.5,0,u*.5,t*.5),n.closePath(),n.restore(),f=.5,r=0,i=n.createLinearGradient(0,r*t,0,.5*t+r*t),i.addColorStop(0,\"#303030\"),i.addColorStop(1,\"rgb(40, 40, 40)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.583333,t*.083333,u*.333333,t*.416666),n.closePath(),n.restore(),f=.583333,r=.083333,i=n.createLinearGradient(0,r*t,0,.416666*t+r*t),i.addColorStop(0,\"rgb(53, 53, 53)\"),i.addColorStop(1,\"rgb(45, 45, 45)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(0,t*.5,u*.5,t*.5),n.closePath(),n.restore(),f=0,r=.5,i=n.createLinearGradient(0,r*t,0,.5*t+r*t),i.addColorStop(0,\"#303030\"),i.addColorStop(1,\"#282828\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.083333,t*.583333,u*.333333,t*.416666),n.closePath(),n.restore(),f=.083333,r=.583333,i=n.createLinearGradient(0,r*t,0,.416666*t+r*t),i.addColorStop(0,\"#353535\"),i.addColorStop(1,\"#2d2d2d\"),n.fillStyle=i,n.fill(),n.restore()}),ci=ii(15,15,function(n){var i=n.canvas.width,t=n.canvas.height,r;n.save(),n.save(),n.beginPath(),n.rect(0,0,i,t),n.closePath(),n.restore(),n.fillStyle=\"#1D2123\",n.fill(),n.save(),n.beginPath(),n.moveTo(0,t*.266666),n.bezierCurveTo(0,t*.4,i*.066666,t*.466666,i*.2,t*.466666),n.bezierCurveTo(i*.333333,t*.466666,i*.4,t*.4,i*.4,t*.266666),n.bezierCurveTo(i*.4,t*.133333,i*.333333,t*.066666,i*.2,t*.066666),n.bezierCurveTo(i*.066666,t*.066666,0,t*.133333,0,t*.266666),n.closePath(),r=n.createLinearGradient(0,.066666*t,0,.466666*t),r.addColorStop(0,\"#000000\"),r.addColorStop(1,\"#444444\"),n.fillStyle=r,n.fill(),n.save(),n.beginPath(),n.moveTo(0,t*.2),n.bezierCurveTo(0,t*.333333,i*.066666,t*.4,i*.2,t*.4),n.bezierCurveTo(i*.333333,t*.4,i*.4,t*.333333,i*.4,t*.2),n.bezierCurveTo(i*.4,t*.066666,i*.333333,0,i*.2,0),n.bezierCurveTo(i*.066666,0,0,t*.066666,0,t*.2),n.closePath(),n.fillStyle=\"#050506\",n.fill(),n.save(),n.beginPath(),n.moveTo(i*.466666,t*.733333),n.bezierCurveTo(i*.466666,t*.866666,i*.533333,t*.933333,i*.666666,t*.933333),n.bezierCurveTo(i*.8,t*.933333,i*.866666,t*.866666,i*.866666,t*.733333),n.bezierCurveTo(i*.866666,t*.6,i*.8,t*.533333,i*.666666,t*.533333),n.bezierCurveTo(i*.533333,t*.533333,i*.466666,t*.6,i*.466666,t*.733333),n.closePath(),r=n.createLinearGradient(0,.533333*t,0,.933333*t),r.addColorStop(0,\"#000000\"),r.addColorStop(1,\"#444444\"),n.fillStyle=r,n.fill(),n.save(),n.beginPath(),n.moveTo(i*.466666,t*.666666),n.bezierCurveTo(i*.466666,t*.8,i*.533333,t*.866666,i*.666666,t*.866666),n.bezierCurveTo(i*.8,t*.866666,i*.866666,t*.8,i*.866666,t*.666666),n.bezierCurveTo(i*.866666,t*.533333,i*.8,t*.466666,i*.666666,t*.466666),n.bezierCurveTo(i*.533333,t*.466666,i*.466666,t*.533333,i*.466666,t*.666666),n.closePath(),n.fillStyle=\"#050506\",n.fill(),n.restore()}),li=function(n,i,r,u,f){function o(n,t){return n+=(2*Math.random()-1)*t|0,n<0?0:n>255?255:n}function e(n){return n<0?0:n>255?255:n}function s(n,t,i,r,u,f){var o,v,e,a,s,h,c,l;for(u<i||(u=i-1),a=1/(u*2+1),s=0,v=0;v<r;v++){for(h=c=l=0,o=0;o<u;o++)e=(s+o)*4,h+=n.data[e],c+=n.data[e+1],l+=n.data[e+2];for(o=0;o<i;o++)o>u&&(e=(s-u-1)*4,h-=n.data[e],c-=n.data[e+1],l-=n.data[e+2]),o+u<i&&(e=(s+u)*4,h+=n.data[e],c+=n.data[e+1],l+=n.data[e+2]),e=s*4,t.data[e]=h*a|0,t.data[e+1]=c*a|0,t.data[e+2]=l*a|0,t.data[e+3]=f,s++}}return this.fill=function(h,c,l,a){var k,d,ut,st,p,w,et,b,v,ot,ht=255,lt=n>>16&255,ct=n>>8&255,at=n&255,g=0,nt=255*r,vt,pt,yt,y,rt,it,tt,ft;h=Math.floor(h),c=Math.floor(c),l=Math.ceil(l),a=Math.ceil(a),p=l-h,w=a-c,et=t(p,w),b=et.getContext(\"2d\"),v=b.createImageData(p,w),ot=b.createImageData(p,w);if(f!==0)for(st=[],k=0;k<p;k++)st[k]=255*f*Math.sin(k/p*Math.PI)|0;for(ut=0;ut<w;ut++)for(i!==0&&(vt=pt=yt=0),d=0;d<p;d++)y=ut*p*4+d*4,rt=lt,it=ct,tt=at,f!==0&&(ft=st[d],rt+=ft,it+=ft,tt+=ft),u?(g=(2*Math.random()-1)*nt|0,v.data[y]=e(rt+g),v.data[y+1]=e(it+g),v.data[y+2]=e(tt+g),v.data[y+3]=ht):(v.data[y]=o(rt,nt),v.data[y+1]=o(it,nt),v.data[y+2]=o(tt,nt),v.data[y+3]=ht);return i>0?(s(v,ot,p,w,i,ht),b.putImageData(ot,h,c)):b.putImageData(v,h,c),et},this},n=function(n,t,i,r){function s(){e=k(n,255),f=k(t,255),u=k(i,255),o=k(r,1)}var e,f,u,o;arguments.length===1?(i=parseInt(n.substr(5,2),16),t=parseInt(n.substr(3,2),16),n=parseInt(n.substr(1,2),16),r=1):arguments.length===3&&(r=1),s(),this.getRed=function(){return e},this.setRed=function(n){e=k(n,255)},this.getGreen=function(){return f},this.setGreen=function(n){f=k(n,255)},this.getBlue=function(){return u},this.setBlue=function(n){u=k(n,255)},this.getAlpha=function(){return o},this.setAlpha=function(n){o=k(n,1)},this.getRgbaColor=function(){return\"rgba(\"+e+\", \"+f+\", \"+u+\", \"+o+\")\"},this.getRgbColor=function(){return\"rgb(\"+e+\", \"+f+\", \"+u+\")\"},this.getHexColor=function(){return\"#\"+e.toString(16)+f.toString(16)+u.toString(16)}},it=function(n,t,i){i=i===undefined?-Math.PI/2:i,this.fill=function(r,u,f,e,o){var h,s,p,v=2*Math.PI,c,a,w,b,y,k=180/Math.PI,d=e+(o-e)*.5,l=v/Math.max(360,o*2.2);for(r.save(),r.lineWidth=1.5,r.translate(u,f),r.rotate(i),r.translate(-u,-f),h=0,p=n.length-1;h<p;h++)for(c=v*n[h],a=v*n[h+1],w=a-c,b=t[h],y=t[h+1],s=c;s<a;s+=l)r.beginPath(),r.fillStyle=ui(b,y,w,s-c).getRgbaColor(),r.strokeStyle=r.fillStyle,e>0?r.arc(u,f,e,s+l,s,!0):r.moveTo(u,f),r.arc(u,f,o,s,s+l),r.fill(),r.stroke();r.restore()}},kt=function(n,t,i,r){this.getColorAt=function(n){var u=0,e=0,f=1,s=1,h=0,t,o;for(n=n<0?0:n>1?1:n,t=0;t<i.length;t++){i[t]<n&&u<i[t]&&(u=i[t],e=t);if(i[t]===n)return r[t];i[t]>n&&f>=i[t]&&(f=i[t],s=t)}return o=(n-u)/(f-u),ui(r[e],r[s],1,o)},this.getStart=function(){return n},this.getEnd=function(){return t}};Math.log10=function(n){return Math.log(n)/Math.LN10},function(){h=function(n,t,i,r,u,f){this.gradientStart=n,this.gradientFraction=t,this.gradientStop=i,this.labelColor=r,this.symbolColor=u,this.name=f}}(),function(){u=function(n,t,i,r,u,f){this.gradientStartColor=n,this.gradientFraction1Color=t,this.gradientFraction2Color=i,this.gradientFraction3Color=r,this.gradientStopColor=u,this.textColor=f}}(),function(){b=function(n,t,i,r,u,f){this.veryDark=n,this.dark=t,this.medium=i,this.light=r,this.lighter=u,this.veryLight=f}}(),function(){ut=function(n,t,i,r,u,f,e){this.innerColor1_ON=n,this.innerColor2_ON=t,this.outerColor_ON=i,this.coronaColor=r,this.innerColor1_OFF=u,this.innerColor2_OFF=f,this.outerColor_OFF=e}}(),function(){at=function(n){this.type=n}}(),function(){pt=function(n){this.type=n}}(),function(){ri=function(n){this.type=n}}(),function(){dt=function(n){this.style=n}}(),function(){g=function(n){this.design=n}}(),function(){l=function(n){this.type=n}}(),function(){lt=function(n){this.type=n}}(),function(){gt=function(n){this.format=n}}(),function(){bt=function(n){this.type=n}}(),function(){yt=function(n){this.state=n}}();var di={DARK_GRAY:new h(new n(0,0,0,1),new n(51,51,51,1),new n(153,153,153,1),new n(255,255,255,1),new n(180,180,180,1),\"DARK_GRAY\"),SATIN_GRAY:new h(new n(45,57,57,1),new n(45,57,57,1),new n(45,57,57,1),new n(167,184,180,1),new n(137,154,150,1),\"SATIN_GRAY\"),LIGHT_GRAY:new h(new n(130,130,130,1),new n(181,181,181,1),new n(253,253,253,1),new n(0,0,0,1),new n(80,80,80,1),\"LIGHT_GRAY\"),WHITE:new h(new n(255,255,255,1),new n(255,255,255,1),new n(255,255,255,1),new n(0,0,0,1),new n(80,80,80,1),\"WHITE\"),BLACK:new h(new n(0,0,0,1),new n(0,0,0,1),new n(0,0,0,1),new n(255,255,255,1),new n(150,150,150,1),\"BLACK\"),BEIGE:new h(new n(178,172,150,1),new n(204,205,184,1),new n(231,231,214,1),new n(0,0,0,1),new n(80,80,80,1),\"BEIGE\"),BROWN:new h(new n(245,225,193,1),new n(245,225,193,1),new n(255,250,240,1),new n(109,73,47,1),new n(89,53,27,1),\"BROWN\"),RED:new h(new n(198,93,95,1),new n(212,132,134,1),new n(242,218,218,1),new n(0,0,0,1),new n(90,0,0,1),\"RED\"),GREEN:new h(new n(65,120,40,1),new n(129,171,95,1),new n(218,237,202,1),new n(0,0,0,1),new n(0,90,0,1),\"GREEN\"),BLUE:new h(new n(45,83,122,1),new n(115,144,170,1),new n(227,234,238,1),new n(0,0,0,1),new n(0,0,90,1),\"BLUE\"),ANTHRACITE:new h(new n(50,50,54,1),new n(47,47,51,1),new n(69,69,74,1),new n(250,250,250,1),new n(180,180,180,1),\"ANTHRACITE\"),MUD:new h(new n(80,86,82,1),new n(70,76,72,1),new n(57,62,58,1),new n(255,255,240,1),new n(225,225,210,1),\"MUD\"),PUNCHED_SHEET:new h(new n(50,50,54,1),new n(47,47,51,1),new n(69,69,74,1),new n(255,255,255,1),new n(180,180,180,1),\"PUNCHED_SHEET\"),CARBON:new h(new n(50,50,54,1),new n(47,47,51,1),new n(69,69,74,1),new n(255,255,255,1),new n(180,180,180,1),\"CARBON\"),STAINLESS:new h(new n(130,130,130,1),new n(181,181,181,1),new n(253,253,253,1),new n(0,0,0,1),new n(80,80,80,1),\"STAINLESS\"),BRUSHED_METAL:new h(new n(50,50,54,1),new n(47,47,51,1),new n(69,69,74,1),new n(0,0,0,1),new n(80,80,80,1),\"BRUSHED_METAL\"),BRUSHED_STAINLESS:new h(new n(50,50,54,1),new n(47,47,51,1),new n(110,110,112,1),new n(0,0,0,1),new n(80,80,80,1),\"BRUSHED_STAINLESS\"),TURNED:new h(new n(130,130,130,1),new n(181,181,181,1),new n(253,253,253,1),new n(0,0,0,1),new n(80,80,80,1),\"TURNED\")},ki={BEIGE:new u(\"#c8c8b1\",\"rgb(241, 237, 207)\",\"rgb(234, 230, 194)\",\"rgb(225, 220, 183)\",\"rgb(237, 232, 191)\",\"#000000\"),BLUE:new u(\"#ffffff\",\"rgb(231, 246, 255)\",\"rgb(170, 224, 255)\",\"rgb(136, 212, 255)\",\"rgb(192, 232, 255)\",\"#124564\"),ORANGE:new u(\"#ffffff\",\"rgb(255, 245, 225)\",\"rgb(255, 217, 147)\",\"rgb(255, 201, 104)\",\"rgb(255, 227, 173)\",\"#503700\"),RED:new u(\"#ffffff\",\"rgb(255, 225, 225)\",\"rgb(253, 152, 152)\",\"rgb(252, 114, 115)\",\"rgb(254, 178, 178)\",\"#4f0c0e\"),YELLOW:new u(\"#ffffff\",\"rgb(245, 255, 186)\",\"rgb(210, 255, 0)\",\"rgb(158, 205, 0)\",\"rgb(210, 255, 0)\",\"#405300\"),WHITE:new u(\"#ffffff\",\"#ffffff\",\"rgb(241, 246, 242)\",\"rgb(229, 239, 244)\",\"#ffffff\",\"#000000\"),GRAY:new u(\"#414141\",\"rgb(117, 117, 117)\",\"rgb(87, 87, 87)\",\"#414141\",\"rgb(81, 81, 81)\",\"#ffffff\"),BLACK:new u(\"#414141\",\"#666666\",\"#333333\",\"#000000\",\"#333333\",\"#cccccc\"),GREEN:new u(\"rgb(33, 67, 67)\",\"rgb(33, 67, 67)\",\"rgb(29, 58, 58)\",\"rgb(28, 57, 57)\",\"rgb(23, 46, 46)\",\"rgba(0, 185, 165, 255)\"),BLUE2:new u(\"rgb(0, 68, 103)\",\"rgb(8, 109, 165)\",\"rgb(0, 72, 117)\",\"rgb(0, 72, 117)\",\"rgb(0, 68, 103)\",\"rgb(111, 182, 228)\"),BLUE_BLACK:new u(\"rgb(22, 125, 212)\",\"rgb(3, 162, 254)\",\"rgb(3, 162, 254)\",\"rgb(3, 162, 254)\",\"rgb(11, 172, 244)\",\"#000000\"),BLUE_DARKBLUE:new u(\"rgb(18, 33, 88)\",\"rgb(18, 33, 88)\",\"rgb(19, 30, 90)\",\"rgb(17, 31, 94)\",\"rgb(21, 25, 90)\",\"rgb(23, 99, 221)\"),BLUE_GRAY:new u(\"rgb(135, 174, 255)\",\"rgb(101, 159, 255)\",\"rgb(44, 93, 255)\",\"rgb(27, 65, 254)\",\"rgb(12, 50, 255)\",\"#b2b4ed\"),STANDARD:new u(\"rgb(131, 133, 119)\",\"rgb(176, 183, 167)\",\"rgb(165, 174, 153)\",\"rgb(166, 175, 156)\",\"rgb(175, 184, 165)\",\"rgb(35, 42, 52)\"),STANDARD_GREEN:new u(\"#ffffff\",\"rgb(219, 230, 220)\",\"rgb(179, 194, 178)\",\"rgb(153, 176, 151)\",\"rgb(114, 138, 109)\",\"#080C06\"),BLUE_BLUE:new u(\"rgb(100, 168, 253)\",\"rgb(100, 168, 253)\",\"rgb(95, 160, 250)\",\"rgb(80, 144, 252)\",\"rgb(74, 134, 255)\",\"#002cbb\"),RED_DARKRED:new u(\"rgb(72, 36, 50)\",\"rgb(185, 111, 110)\",\"rgb(148, 66, 72)\",\"rgb(83, 19, 20)\",\"rgb(7, 6, 14)\",\"#FE8B92\"),DARKBLUE:new u(\"rgb(14, 24, 31)\",\"rgb(46, 105, 144)\",\"rgb(19, 64, 96)\",\"rgb(6, 20, 29)\",\"rgb(8, 9, 10)\",\"#3DB3FF\"),LILA:new u(\"rgb(175, 164, 255)\",\"rgb(188, 168, 253)\",\"rgb(176, 159, 255)\",\"rgb(174, 147, 252)\",\"rgb(168, 136, 233)\",\"#076148\"),BLACKRED:new u(\"rgb(8, 12, 11)\",\"rgb(10, 11, 13)\",\"rgb(11, 10, 15)\",\"rgb(7, 13, 9)\",\"rgb(9, 13, 14)\",\"#B50026\"),DARKGREEN:new u(\"rgb(25, 85, 0)\",\"rgb(47, 154, 0)\",\"rgb(30, 101, 0)\",\"rgb(30, 101, 0)\",\"rgb(25, 85, 0)\",\"#233123\"),AMBER:new u(\"rgb(182, 71, 0)\",\"rgb(236, 155, 25)\",\"rgb(212, 93, 5)\",\"rgb(212, 93, 5)\",\"rgb(182, 71, 0)\",\"#593A0A\"),LIGHTBLUE:new u(\"rgb(125, 146, 184)\",\"rgb(197, 212, 231)\",\"rgb(138, 155, 194)\",\"rgb(138, 155, 194)\",\"rgb(125, 146, 184)\",\"#090051\"),SECTIONS:new u(\"#b2b2b2\",\"#ffffff\",\"#c4c4c4\",\"#c4c4c4\",\"#b2b2b2\",\"#000000\")},pi={RED:new b(new n(82,0,0,1),new n(158,0,19,1),new n(213,0,25,1),new n(240,82,88,1),new n(255,171,173,1),new n(255,217,218,1)),GREEN:new b(new n(8,54,4,1),new n(0,107,14,1),new n(15,148,0,1),new n(121,186,37,1),new n(190,231,141,1),new n(234,247,218,1)),BLUE:new b(new n(0,11,68,1),new n(0,73,135,1),new n(0,108,201,1),new n(0,141,242,1),new n(122,200,255,1),new n(204,236,255,1)),ORANGE:new b(new n(118,83,30,1),new n(215,67,0,1),new n(240,117,0,1),new n(255,166,0,1),new n(255,255,128,1),new n(255,247,194,1)),YELLOW:new b(new n(41,41,0,1),new n(102,102,0,1),new n(177,165,0,1),new n(255,242,0,1),new n(255,250,153,1),new n(255,252,204,1)),CYAN:new b(new n(15,109,109,1),new n(0,109,144,1),new n(0,144,191,1),new n(0,174,239,1),new n(153,223,249,1),new n(204,239,252,1)),MAGENTA:new b(new n(98,0,114,1),new n(128,24,72,1),new n(191,36,107,1),new n(255,48,143,1),new n(255,172,210,1),new n(255,214,23,1)),WHITE:new b(new n(210,210,210,1),new n(220,220,220,1),new n(235,235,235,1),new n(255,255,255,1),new n(255,255,255,1),new n(255,255,255,1)),GRAY:new b(new n(25,25,25,1),new n(51,51,51,1),new n(76,76,76,1),new n(128,128,128,1),new n(204,204,204,1),new n(243,243,243,1)),BLACK:new b(new n(0,0,0,1),new n(5,5,5,1),new n(10,10,10,1),new n(15,15,15,1),new n(20,20,20,1),new n(25,25,25,1)),RAITH:new b(new n(0,32,65,1),new n(0,65,125,1),new n(0,106,172,1),new n(130,180,214,1),new n(148,203,242,1),new n(191,229,255,1)),GREEN_LCD:new b(new n(0,55,45,1),new n(15,109,93,1),new n(0,185,165,1),new n(48,255,204,1),new n(153,255,227,1),new n(204,255,241,1)),JUG_GREEN:new b(new n(0,56,0,1),new n(32,69,36,1),new n(50,161,0,1),new n(129,206,0,1),new n(190,231,141,1),new n(234,247,218,1))},gi={RED_LED:new ut(\"#FF9A89\",\"#FF9A89\",\"#FF3300\",\"#FF8D70\",\"#7E1C00\",\"#7E1C00\",\"#641B00\"),GREEN_LED:new ut(\"#9AFF89\",\"#9AFF89\",\"#59FF2A\",\"#A5FF00\",\"#1C7E00\",\"#1C7E00\",\"#1B6400\"),BLUE_LED:new ut(\"#899AFF\",\"#899AFF\",\"#0033FF\",\"#708DFF\",\"#001C7E\",\"#001C7E\",\"#001B64\"),ORANGE_LED:new ut(\"#FEA23F\",\"#FEA23F\",\"#FD6C00\",\"#FD6C00\",\"#592800\",\"#592800\",\"#421F00\"),YELLOW_LED:new ut(\"#FFFF62\",\"#FFFF62\",\"#FFFF00\",\"#FFFF00\",\"#6B6D00\",\"#6B6D00\",\"#515300\"),CYAN_LED:new ut(\"#00FFFF\",\"#00FFFF\",\"#1BC3C3\",\"#00FFFF\",\"#083B3B\",\"#083B3B\",\"#052727\"),MAGENTA_LED:new ut(\"#D300FF\",\"#D300FF\",\"#8600CB\",\"#C300FF\",\"#38004B\",\"#38004B\",\"#280035\")},ai={TYPE1:new at(\"type1\"),TYPE2:new at(\"type2\"),TYPE3:new at(\"type3\"),TYPE4:new at(\"type4\"),TYPE5:new at(\"type5\")},ur={NORTH:new pt(\"north\"),SOUTH:new pt(\"south\"),EAST:new pt(\"east\"),WEST:new pt(\"west\")},fi={STANDARD_KNOB:new ri(\"standardKnob\"),METAL_KNOB:new ri(\"metalKnob\")},oi={BLACK:new dt(\"black\"),BRASS:new dt(\"brass\"),SILVER:new dt(\"silver\")},fr={BLACK_METAL:new g(\"blackMetal\"),METAL:new g(\"metal\"),SHINY_METAL:new g(\"shinyMetal\"),BRASS:new g(\"brass\"),STEEL:new g(\"steel\"),CHROME:new g(\"chrome\"),GOLD:new g(\"gold\"),ANTHRACITE:new g(\"anthracite\"),TILTED_GRAY:new g(\"tiltedGray\"),TILTED_BLACK:new g(\"tiltedBlack\"),GLOSSY_METAL:new g(\"glossyMetal\")},er={TYPE1:new l(\"type1\"),TYPE2:new l(\"type2\"),TYPE3:new l(\"type3\"),TYPE4:new l(\"type4\"),TYPE5:new l(\"type5\"),TYPE6:new l(\"type6\"),TYPE7:new l(\"type7\"),TYPE8:new l(\"type8\"),TYPE9:new l(\"type9\"),TYPE10:new l(\"type10\"),TYPE11:new l(\"type11\"),TYPE12:new l(\"type12\"),TYPE13:new l(\"type13\"),TYPE14:new l(\"type14\"),TYPE15:new l(\"type15\"),TYPE16:new l(\"type16\")},rr={TYPE1:new lt(\"type1\"),TYPE2:new lt(\"type2\"),TYPE3:new lt(\"type3\"),TYPE4:new lt(\"type4\"),TYPE5:new lt(\"type5\")},nr={STANDARD:new gt(\"standard\"),FRACTIONAL:new gt(\"fractional\"),SCIENTIFIC:new gt(\"scientific\")},tr={NORMAL:new bt(\"normal\"),HORIZONTAL:new bt(\"horizontal\"),TANGENT:new bt(\"tangent\")},ir={UP:new yt(\"up\"),STEADY:new yt(\"steady\"),DOWN:new yt(\"down\"),OFF:new yt(\"off\")};return{Radial:ei,RadialBargraph:wi,RadialVertical:bi,Linear:yi,LinearBargraph:kr,DisplaySingle:dr,DisplayMulti:wr,Level:br,Compass:gr,WindDirection:iu,Horizon:ru,Led:nu,Clock:tu,Battery:hr,StopWatch:cr,Altimeter:sr,TrafficLight:lr,LightBulb:yr,Odometer:pr,drawFrame:v,drawBackground:w,drawForeground:y,rgbaColor:n,ConicalGradient:it,setAlpha:f,getColorFromFraction:ui,gradientWrapper:kt,BackgroundColor:di,LcdColor:ki,ColorDef:pi,LedColor:gi,GaugeType:ai,Orientation:ur,FrameDesign:fr,PointerType:er,ForegroundType:rr,KnobType:fi,KnobStyle:oi,LabelNumberFormat:nr,TickLabelOrientation:tr,TrendState:ir,Section:vr}}()"
  },
  {
    "path": "src/test/resources/samples/langs/JavaScript/uglify.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n\n  This version is suitable for Node.js.  With minimal changes (the\n  exports stuff) it should work on any JS platform.\n\n  This file contains the tokenizer/parser.  It is a port to JavaScript\n  of parse-js [1], a JavaScript parser library written in Common Lisp\n  by Marijn Haverbeke.  Thank you Marijn!\n\n  [1] http://marijn.haverbeke.nl/parse-js/\n\n  Exported functions:\n\n    - tokenizer(code) -- returns a function.  Call the returned\n      function to fetch the next token.\n\n    - parse(code) -- returns an AST of the given JavaScript code.\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2010 (c) Mihai Bazon <mihai.bazon@gmail.com>\n    Based on parse-js (http://marijn.haverbeke.nl/parse-js/).\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\n/* -----[ Tokenizer (constants) ]----- */\n\nvar KEYWORDS = array_to_hash([\n        \"break\",\n        \"case\",\n        \"catch\",\n        \"const\",\n        \"continue\",\n        \"default\",\n        \"delete\",\n        \"do\",\n        \"else\",\n        \"finally\",\n        \"for\",\n        \"function\",\n        \"if\",\n        \"in\",\n        \"instanceof\",\n        \"new\",\n        \"return\",\n        \"switch\",\n        \"throw\",\n        \"try\",\n        \"typeof\",\n        \"var\",\n        \"void\",\n        \"while\",\n        \"with\"\n]);\n\nvar RESERVED_WORDS = array_to_hash([\n        \"abstract\",\n        \"boolean\",\n        \"byte\",\n        \"char\",\n        \"class\",\n        \"debugger\",\n        \"double\",\n        \"enum\",\n        \"export\",\n        \"extends\",\n        \"final\",\n        \"float\",\n        \"goto\",\n        \"implements\",\n        \"import\",\n        \"int\",\n        \"interface\",\n        \"long\",\n        \"native\",\n        \"package\",\n        \"private\",\n        \"protected\",\n        \"public\",\n        \"short\",\n        \"static\",\n        \"super\",\n        \"synchronized\",\n        \"throws\",\n        \"transient\",\n        \"volatile\"\n]);\n\nvar KEYWORDS_BEFORE_EXPRESSION = array_to_hash([\n        \"return\",\n        \"new\",\n        \"delete\",\n        \"throw\",\n        \"else\",\n        \"case\"\n]);\n\nvar KEYWORDS_ATOM = array_to_hash([\n        \"false\",\n        \"null\",\n        \"true\",\n        \"undefined\"\n]);\n\nvar OPERATOR_CHARS = array_to_hash(characters(\"+-*&%=<>!?|~^\"));\n\nvar RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;\nvar RE_OCT_NUMBER = /^0[0-7]+$/;\nvar RE_DEC_NUMBER = /^\\d*\\.?\\d*(?:e[+-]?\\d*(?:\\d\\.?|\\.?\\d)\\d*)?$/i;\n\nvar OPERATORS = array_to_hash([\n        \"in\",\n        \"instanceof\",\n        \"typeof\",\n        \"new\",\n        \"void\",\n        \"delete\",\n        \"++\",\n        \"--\",\n        \"+\",\n        \"-\",\n        \"!\",\n        \"~\",\n        \"&\",\n        \"|\",\n        \"^\",\n        \"*\",\n        \"/\",\n        \"%\",\n        \">>\",\n        \"<<\",\n        \">>>\",\n        \"<\",\n        \">\",\n        \"<=\",\n        \">=\",\n        \"==\",\n        \"===\",\n        \"!=\",\n        \"!==\",\n        \"?\",\n        \"=\",\n        \"+=\",\n        \"-=\",\n        \"/=\",\n        \"*=\",\n        \"%=\",\n        \">>=\",\n        \"<<=\",\n        \">>>=\",\n        \"|=\",\n        \"^=\",\n        \"&=\",\n        \"&&\",\n        \"||\"\n]);\n\nvar WHITESPACE_CHARS = array_to_hash(characters(\" \\u00a0\\n\\r\\t\\f\\v\\u200b\"));\n\nvar PUNC_BEFORE_EXPRESSION = array_to_hash(characters(\"[{}(,.;:\"));\n\nvar PUNC_CHARS = array_to_hash(characters(\"[]{}(),;:\"));\n\nvar REGEXP_MODIFIERS = array_to_hash(characters(\"gmsiy\"));\n\n/* -----[ Tokenizer ]----- */\n\n// regexps adapted from http://xregexp.com/plugins/#unicode\nvar UNICODE = {\n        letter: new RegExp(\"[\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u0523\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0621-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971\\\\u0972\\\\u097B-\\\\u097F\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C33\\\\u0C35-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D28\\\\u0D2A-\\\\u0D39\\\\u0D3D\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC\\\\u0EDD\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8B\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10D0-\\\\u10FA\\\\u10FC\\\\u1100-\\\\u1159\\\\u115F-\\\\u11A2\\\\u11A8-\\\\u11F9\\\\u1200-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u1676\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u1900-\\\\u191C\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19A9\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u2094\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2183\\\\u2184\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2C6F\\\\u2C71-\\\\u2C7D\\\\u2C80-\\\\u2CE4\\\\u2D00-\\\\u2D25\\\\u2D30-\\\\u2D65\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005\\\\u3006\\\\u3031-\\\\u3035\\\\u303B\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31B7\\\\u31F0-\\\\u31FF\\\\u3400\\\\u4DB5\\\\u4E00\\\\u9FC3\\\\uA000-\\\\uA48C\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA65F\\\\uA662-\\\\uA66E\\\\uA67F-\\\\uA697\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B\\\\uA78C\\\\uA7FB-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAC00\\\\uD7A3\\\\uF900-\\\\uFA2D\\\\uFA30-\\\\uFA6A\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"),\n        non_spacing_mark: new RegExp(\"[\\\\u0300-\\\\u036F\\\\u0483-\\\\u0487\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u0610-\\\\u061A\\\\u064B-\\\\u065E\\\\u0670\\\\u06D6-\\\\u06DC\\\\u06DF-\\\\u06E4\\\\u06E7\\\\u06E8\\\\u06EA-\\\\u06ED\\\\u0711\\\\u0730-\\\\u074A\\\\u07A6-\\\\u07B0\\\\u07EB-\\\\u07F3\\\\u0816-\\\\u0819\\\\u081B-\\\\u0823\\\\u0825-\\\\u0827\\\\u0829-\\\\u082D\\\\u0900-\\\\u0902\\\\u093C\\\\u0941-\\\\u0948\\\\u094D\\\\u0951-\\\\u0955\\\\u0962\\\\u0963\\\\u0981\\\\u09BC\\\\u09C1-\\\\u09C4\\\\u09CD\\\\u09E2\\\\u09E3\\\\u0A01\\\\u0A02\\\\u0A3C\\\\u0A41\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A70\\\\u0A71\\\\u0A75\\\\u0A81\\\\u0A82\\\\u0ABC\\\\u0AC1-\\\\u0AC5\\\\u0AC7\\\\u0AC8\\\\u0ACD\\\\u0AE2\\\\u0AE3\\\\u0B01\\\\u0B3C\\\\u0B3F\\\\u0B41-\\\\u0B44\\\\u0B4D\\\\u0B56\\\\u0B62\\\\u0B63\\\\u0B82\\\\u0BC0\\\\u0BCD\\\\u0C3E-\\\\u0C40\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C62\\\\u0C63\\\\u0CBC\\\\u0CBF\\\\u0CC6\\\\u0CCC\\\\u0CCD\\\\u0CE2\\\\u0CE3\\\\u0D41-\\\\u0D44\\\\u0D4D\\\\u0D62\\\\u0D63\\\\u0DCA\\\\u0DD2-\\\\u0DD4\\\\u0DD6\\\\u0E31\\\\u0E34-\\\\u0E3A\\\\u0E47-\\\\u0E4E\\\\u0EB1\\\\u0EB4-\\\\u0EB9\\\\u0EBB\\\\u0EBC\\\\u0EC8-\\\\u0ECD\\\\u0F18\\\\u0F19\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F71-\\\\u0F7E\\\\u0F80-\\\\u0F84\\\\u0F86\\\\u0F87\\\\u0F90-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u102D-\\\\u1030\\\\u1032-\\\\u1037\\\\u1039\\\\u103A\\\\u103D\\\\u103E\\\\u1058\\\\u1059\\\\u105E-\\\\u1060\\\\u1071-\\\\u1074\\\\u1082\\\\u1085\\\\u1086\\\\u108D\\\\u109D\\\\u135F\\\\u1712-\\\\u1714\\\\u1732-\\\\u1734\\\\u1752\\\\u1753\\\\u1772\\\\u1773\\\\u17B7-\\\\u17BD\\\\u17C6\\\\u17C9-\\\\u17D3\\\\u17DD\\\\u180B-\\\\u180D\\\\u18A9\\\\u1920-\\\\u1922\\\\u1927\\\\u1928\\\\u1932\\\\u1939-\\\\u193B\\\\u1A17\\\\u1A18\\\\u1A56\\\\u1A58-\\\\u1A5E\\\\u1A60\\\\u1A62\\\\u1A65-\\\\u1A6C\\\\u1A73-\\\\u1A7C\\\\u1A7F\\\\u1B00-\\\\u1B03\\\\u1B34\\\\u1B36-\\\\u1B3A\\\\u1B3C\\\\u1B42\\\\u1B6B-\\\\u1B73\\\\u1B80\\\\u1B81\\\\u1BA2-\\\\u1BA5\\\\u1BA8\\\\u1BA9\\\\u1C2C-\\\\u1C33\\\\u1C36\\\\u1C37\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CE0\\\\u1CE2-\\\\u1CE8\\\\u1CED\\\\u1DC0-\\\\u1DE6\\\\u1DFD-\\\\u1DFF\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2CEF-\\\\u2CF1\\\\u2DE0-\\\\u2DFF\\\\u302A-\\\\u302F\\\\u3099\\\\u309A\\\\uA66F\\\\uA67C\\\\uA67D\\\\uA6F0\\\\uA6F1\\\\uA802\\\\uA806\\\\uA80B\\\\uA825\\\\uA826\\\\uA8C4\\\\uA8E0-\\\\uA8F1\\\\uA926-\\\\uA92D\\\\uA947-\\\\uA951\\\\uA980-\\\\uA982\\\\uA9B3\\\\uA9B6-\\\\uA9B9\\\\uA9BC\\\\uAA29-\\\\uAA2E\\\\uAA31\\\\uAA32\\\\uAA35\\\\uAA36\\\\uAA43\\\\uAA4C\\\\uAAB0\\\\uAAB2-\\\\uAAB4\\\\uAAB7\\\\uAAB8\\\\uAABE\\\\uAABF\\\\uAAC1\\\\uABE5\\\\uABE8\\\\uABED\\\\uFB1E\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE26]\"),\n        space_combining_mark: new RegExp(\"[\\\\u0903\\\\u093E-\\\\u0940\\\\u0949-\\\\u094C\\\\u094E\\\\u0982\\\\u0983\\\\u09BE-\\\\u09C0\\\\u09C7\\\\u09C8\\\\u09CB\\\\u09CC\\\\u09D7\\\\u0A03\\\\u0A3E-\\\\u0A40\\\\u0A83\\\\u0ABE-\\\\u0AC0\\\\u0AC9\\\\u0ACB\\\\u0ACC\\\\u0B02\\\\u0B03\\\\u0B3E\\\\u0B40\\\\u0B47\\\\u0B48\\\\u0B4B\\\\u0B4C\\\\u0B57\\\\u0BBE\\\\u0BBF\\\\u0BC1\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCC\\\\u0BD7\\\\u0C01-\\\\u0C03\\\\u0C41-\\\\u0C44\\\\u0C82\\\\u0C83\\\\u0CBE\\\\u0CC0-\\\\u0CC4\\\\u0CC7\\\\u0CC8\\\\u0CCA\\\\u0CCB\\\\u0CD5\\\\u0CD6\\\\u0D02\\\\u0D03\\\\u0D3E-\\\\u0D40\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4C\\\\u0D57\\\\u0D82\\\\u0D83\\\\u0DCF-\\\\u0DD1\\\\u0DD8-\\\\u0DDF\\\\u0DF2\\\\u0DF3\\\\u0F3E\\\\u0F3F\\\\u0F7F\\\\u102B\\\\u102C\\\\u1031\\\\u1038\\\\u103B\\\\u103C\\\\u1056\\\\u1057\\\\u1062-\\\\u1064\\\\u1067-\\\\u106D\\\\u1083\\\\u1084\\\\u1087-\\\\u108C\\\\u108F\\\\u109A-\\\\u109C\\\\u17B6\\\\u17BE-\\\\u17C5\\\\u17C7\\\\u17C8\\\\u1923-\\\\u1926\\\\u1929-\\\\u192B\\\\u1930\\\\u1931\\\\u1933-\\\\u1938\\\\u19B0-\\\\u19C0\\\\u19C8\\\\u19C9\\\\u1A19-\\\\u1A1B\\\\u1A55\\\\u1A57\\\\u1A61\\\\u1A63\\\\u1A64\\\\u1A6D-\\\\u1A72\\\\u1B04\\\\u1B35\\\\u1B3B\\\\u1B3D-\\\\u1B41\\\\u1B43\\\\u1B44\\\\u1B82\\\\u1BA1\\\\u1BA6\\\\u1BA7\\\\u1BAA\\\\u1C24-\\\\u1C2B\\\\u1C34\\\\u1C35\\\\u1CE1\\\\u1CF2\\\\uA823\\\\uA824\\\\uA827\\\\uA880\\\\uA881\\\\uA8B4-\\\\uA8C3\\\\uA952\\\\uA953\\\\uA983\\\\uA9B4\\\\uA9B5\\\\uA9BA\\\\uA9BB\\\\uA9BD-\\\\uA9C0\\\\uAA2F\\\\uAA30\\\\uAA33\\\\uAA34\\\\uAA4D\\\\uAA7B\\\\uABE3\\\\uABE4\\\\uABE6\\\\uABE7\\\\uABE9\\\\uABEA\\\\uABEC]\"),\n        connector_punctuation: new RegExp(\"[\\\\u005F\\\\u203F\\\\u2040\\\\u2054\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFF3F]\")\n};\n\nfunction is_letter(ch) {\n        return UNICODE.letter.test(ch);\n};\n\nfunction is_digit(ch) {\n        ch = ch.charCodeAt(0);\n        return ch >= 48 && ch <= 57; //XXX: find out if \"UnicodeDigit\" means something else than 0..9\n};\n\nfunction is_alphanumeric_char(ch) {\n        return is_digit(ch) || is_letter(ch);\n};\n\nfunction is_unicode_combining_mark(ch) {\n        return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);\n};\n\nfunction is_unicode_connector_punctuation(ch) {\n        return UNICODE.connector_punctuation.test(ch);\n};\n\nfunction is_identifier_start(ch) {\n        return ch == \"$\" || ch == \"_\" || is_letter(ch);\n};\n\nfunction is_identifier_char(ch) {\n        return is_identifier_start(ch)\n                || is_unicode_combining_mark(ch)\n                || is_digit(ch)\n                || is_unicode_connector_punctuation(ch)\n                || ch == \"\\u200c\" // zero-width non-joiner <ZWNJ>\n                || ch == \"\\u200d\" // zero-width joiner <ZWJ> (in my ECMA-262 PDF, this is also 200c)\n        ;\n};\n\nfunction parse_js_number(num) {\n        if (RE_HEX_NUMBER.test(num)) {\n                return parseInt(num.substr(2), 16);\n        } else if (RE_OCT_NUMBER.test(num)) {\n                return parseInt(num.substr(1), 8);\n        } else if (RE_DEC_NUMBER.test(num)) {\n                return parseFloat(num);\n        }\n};\n\nfunction JS_Parse_Error(message, line, col, pos) {\n        this.message = message;\n        this.line = line;\n        this.col = col;\n        this.pos = pos;\n        try {\n                var ex = new Error(message);\n                ex.name = 'JS_Parse_Error'\n                throw ex\n        } catch(ex) {\n                this.stack = ex.stack;\n        };\n};\n\nJS_Parse_Error.prototype.toString = function() {\n        return this.message + \" (line: \" + this.line + \", col: \" + this.col + \", pos: \" + this.pos + \")\" + \"\\n\\n\" + this.stack;\n};\n\nfunction js_error(message, line, col, pos) {\n        throw new JS_Parse_Error(message, line, col, pos);\n};\n\nfunction is_token(token, type, val) {\n        return token.type == type && (val == null || token.value == val);\n};\n\nvar EX_EOF = {};\n\nfunction tokenizer($TEXT) {\n\n        var S = {\n                text            : $TEXT.replace(/\\r\\n?|[\\n\\u2028\\u2029]/g, \"\\n\").replace(/^\\uFEFF/, ''),\n                pos             : 0,\n                tokpos          : 0,\n                line            : 0,\n                tokline         : 0,\n                col             : 0,\n                tokcol          : 0,\n                newline_before  : false,\n                regex_allowed   : false,\n                comments_before : []\n        };\n\n        function peek() { return S.text.charAt(S.pos); };\n\n        function next(signal_eof) {\n                var ch = S.text.charAt(S.pos++);\n                if (signal_eof && !ch)\n                        throw EX_EOF;\n                if (ch == \"\\n\") {\n                        S.newline_before = true;\n                        ++S.line;\n                        S.col = 0;\n                } else {\n                        ++S.col;\n                }\n                return ch;\n        };\n\n        function eof() {\n                return !S.peek();\n        };\n\n        function find(what, signal_eof) {\n                var pos = S.text.indexOf(what, S.pos);\n                if (signal_eof && pos == -1) throw EX_EOF;\n                return pos;\n        };\n\n        function start_token() {\n                S.tokline = S.line;\n                S.tokcol = S.col;\n                S.tokpos = S.pos;\n        };\n\n        function token(type, value, is_comment) {\n                S.regex_allowed = ((type == \"operator\" && !HOP(UNARY_POSTFIX, value)) ||\n                                   (type == \"keyword\" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) ||\n                                   (type == \"punc\" && HOP(PUNC_BEFORE_EXPRESSION, value)));\n                var ret = {\n                        type  : type,\n                        value : value,\n                        line  : S.tokline,\n                        col   : S.tokcol,\n                        pos   : S.tokpos,\n                        nlb   : S.newline_before\n                };\n                if (!is_comment) {\n                        ret.comments_before = S.comments_before;\n                        S.comments_before = [];\n                }\n                S.newline_before = false;\n                return ret;\n        };\n\n        function skip_whitespace() {\n                while (HOP(WHITESPACE_CHARS, peek()))\n                        next();\n        };\n\n        function read_while(pred) {\n                var ret = \"\", ch = peek(), i = 0;\n                while (ch && pred(ch, i++)) {\n                        ret += next();\n                        ch = peek();\n                }\n                return ret;\n        };\n\n        function parse_error(err) {\n                js_error(err, S.tokline, S.tokcol, S.tokpos);\n        };\n\n        function read_num(prefix) {\n                var has_e = false, after_e = false, has_x = false, has_dot = prefix == \".\";\n                var num = read_while(function(ch, i){\n                        if (ch == \"x\" || ch == \"X\") {\n                                if (has_x) return false;\n                                return has_x = true;\n                        }\n                        if (!has_x && (ch == \"E\" || ch == \"e\")) {\n                                if (has_e) return false;\n                                return has_e = after_e = true;\n                        }\n                        if (ch == \"-\") {\n                                if (after_e || (i == 0 && !prefix)) return true;\n                                return false;\n                        }\n                        if (ch == \"+\") return after_e;\n                        after_e = false;\n                        if (ch == \".\") {\n                                if (!has_dot && !has_x)\n                                        return has_dot = true;\n                                return false;\n                        }\n                        return is_alphanumeric_char(ch);\n                });\n                if (prefix)\n                        num = prefix + num;\n                var valid = parse_js_number(num);\n                if (!isNaN(valid)) {\n                        return token(\"num\", valid);\n                } else {\n                        parse_error(\"Invalid syntax: \" + num);\n                }\n        };\n\n        function read_escaped_char() {\n                var ch = next(true);\n                switch (ch) {\n                    case \"n\" : return \"\\n\";\n                    case \"r\" : return \"\\r\";\n                    case \"t\" : return \"\\t\";\n                    case \"b\" : return \"\\b\";\n                    case \"v\" : return \"\\v\";\n                    case \"f\" : return \"\\f\";\n                    case \"0\" : return \"\\0\";\n                    case \"x\" : return String.fromCharCode(hex_bytes(2));\n                    case \"u\" : return String.fromCharCode(hex_bytes(4));\n                    default  : return ch;\n                }\n        };\n\n        function hex_bytes(n) {\n                var num = 0;\n                for (; n > 0; --n) {\n                        var digit = parseInt(next(true), 16);\n                        if (isNaN(digit))\n                                parse_error(\"Invalid hex-character pattern in string\");\n                        num = (num << 4) | digit;\n                }\n                return num;\n        };\n\n        function read_string() {\n                return with_eof_error(\"Unterminated string constant\", function(){\n                        var quote = next(), ret = \"\";\n                        for (;;) {\n                                var ch = next(true);\n                                if (ch == \"\\\\\") ch = read_escaped_char();\n                                else if (ch == quote) break;\n                                ret += ch;\n                        }\n                        return token(\"string\", ret);\n                });\n        };\n\n        function read_line_comment() {\n                next();\n                var i = find(\"\\n\"), ret;\n                if (i == -1) {\n                        ret = S.text.substr(S.pos);\n                        S.pos = S.text.length;\n                } else {\n                        ret = S.text.substring(S.pos, i);\n                        S.pos = i;\n                }\n                return token(\"comment1\", ret, true);\n        };\n\n        function read_multiline_comment() {\n                next();\n                return with_eof_error(\"Unterminated multiline comment\", function(){\n                        var i = find(\"*/\", true),\n                            text = S.text.substring(S.pos, i),\n                            tok = token(\"comment2\", text, true);\n                        S.pos = i + 2;\n                        S.line += text.split(\"\\n\").length - 1;\n                        S.newline_before = text.indexOf(\"\\n\") >= 0;\n\n                        // https://github.com/mishoo/UglifyJS/issues/#issue/100\n                        if (/^@cc_on/i.test(text)) {\n                                warn(\"WARNING: at line \" + S.line);\n                                warn(\"*** Found \\\"conditional comment\\\": \" + text);\n                                warn(\"*** UglifyJS DISCARDS ALL COMMENTS.  This means your code might no longer work properly in Internet Explorer.\");\n                        }\n\n                        return tok;\n                });\n        };\n\n        function read_name() {\n                var backslash = false, name = \"\", ch;\n                while ((ch = peek()) != null) {\n                        if (!backslash) {\n                                if (ch == \"\\\\\") backslash = true, next();\n                                else if (is_identifier_char(ch)) name += next();\n                                else break;\n                        }\n                        else {\n                                if (ch != \"u\") parse_error(\"Expecting UnicodeEscapeSequence -- uXXXX\");\n                                ch = read_escaped_char();\n                                if (!is_identifier_char(ch)) parse_error(\"Unicode char: \" + ch.charCodeAt(0) + \" is not valid in identifier\");\n                                name += ch;\n                                backslash = false;\n                        }\n                }\n                return name;\n        };\n\n        function read_regexp() {\n                return with_eof_error(\"Unterminated regular expression\", function(){\n                        var prev_backslash = false, regexp = \"\", ch, in_class = false;\n                        while ((ch = next(true))) if (prev_backslash) {\n                                regexp += \"\\\\\" + ch;\n                                prev_backslash = false;\n                        } else if (ch == \"[\") {\n                                in_class = true;\n                                regexp += ch;\n                        } else if (ch == \"]\" && in_class) {\n                                in_class = false;\n                                regexp += ch;\n                        } else if (ch == \"/\" && !in_class) {\n                                break;\n                        } else if (ch == \"\\\\\") {\n                                prev_backslash = true;\n                        } else {\n                                regexp += ch;\n                        }\n                        var mods = read_name();\n                        return token(\"regexp\", [ regexp, mods ]);\n                });\n        };\n\n        function read_operator(prefix) {\n                function grow(op) {\n                        if (!peek()) return op;\n                        var bigger = op + peek();\n                        if (HOP(OPERATORS, bigger)) {\n                                next();\n                                return grow(bigger);\n                        } else {\n                                return op;\n                        }\n                };\n                return token(\"operator\", grow(prefix || next()));\n        };\n\n        function handle_slash() {\n                next();\n                var regex_allowed = S.regex_allowed;\n                switch (peek()) {\n                    case \"/\":\n                        S.comments_before.push(read_line_comment());\n                        S.regex_allowed = regex_allowed;\n                        return next_token();\n                    case \"*\":\n                        S.comments_before.push(read_multiline_comment());\n                        S.regex_allowed = regex_allowed;\n                        return next_token();\n                }\n                return S.regex_allowed ? read_regexp() : read_operator(\"/\");\n        };\n\n        function handle_dot() {\n                next();\n                return is_digit(peek())\n                        ? read_num(\".\")\n                        : token(\"punc\", \".\");\n        };\n\n        function read_word() {\n                var word = read_name();\n                return !HOP(KEYWORDS, word)\n                        ? token(\"name\", word)\n                        : HOP(OPERATORS, word)\n                        ? token(\"operator\", word)\n                        : HOP(KEYWORDS_ATOM, word)\n                        ? token(\"atom\", word)\n                        : token(\"keyword\", word);\n        };\n\n        function with_eof_error(eof_error, cont) {\n                try {\n                        return cont();\n                } catch(ex) {\n                        if (ex === EX_EOF) parse_error(eof_error);\n                        else throw ex;\n                }\n        };\n\n        function next_token(force_regexp) {\n                if (force_regexp)\n                        return read_regexp();\n                skip_whitespace();\n                start_token();\n                var ch = peek();\n                if (!ch) return token(\"eof\");\n                if (is_digit(ch)) return read_num();\n                if (ch == '\"' || ch == \"'\") return read_string();\n                if (HOP(PUNC_CHARS, ch)) return token(\"punc\", next());\n                if (ch == \".\") return handle_dot();\n                if (ch == \"/\") return handle_slash();\n                if (HOP(OPERATOR_CHARS, ch)) return read_operator();\n                if (ch == \"\\\\\" || is_identifier_start(ch)) return read_word();\n                parse_error(\"Unexpected character '\" + ch + \"'\");\n        };\n\n        next_token.context = function(nc) {\n                if (nc) S = nc;\n                return S;\n        };\n\n        return next_token;\n\n};\n\n/* -----[ Parser (constants) ]----- */\n\nvar UNARY_PREFIX = array_to_hash([\n        \"typeof\",\n        \"void\",\n        \"delete\",\n        \"--\",\n        \"++\",\n        \"!\",\n        \"~\",\n        \"-\",\n        \"+\"\n]);\n\nvar UNARY_POSTFIX = array_to_hash([ \"--\", \"++\" ]);\n\nvar ASSIGNMENT = (function(a, ret, i){\n        while (i < a.length) {\n                ret[a[i]] = a[i].substr(0, a[i].length - 1);\n                i++;\n        }\n        return ret;\n})(\n        [\"+=\", \"-=\", \"/=\", \"*=\", \"%=\", \">>=\", \"<<=\", \">>>=\", \"|=\", \"^=\", \"&=\"],\n        { \"=\": true },\n        0\n);\n\nvar PRECEDENCE = (function(a, ret){\n        for (var i = 0, n = 1; i < a.length; ++i, ++n) {\n                var b = a[i];\n                for (var j = 0; j < b.length; ++j) {\n                        ret[b[j]] = n;\n                }\n        }\n        return ret;\n})(\n        [\n                [\"||\"],\n                [\"&&\"],\n                [\"|\"],\n                [\"^\"],\n                [\"&\"],\n                [\"==\", \"===\", \"!=\", \"!==\"],\n                [\"<\", \">\", \"<=\", \">=\", \"in\", \"instanceof\"],\n                [\">>\", \"<<\", \">>>\"],\n                [\"+\", \"-\"],\n                [\"*\", \"/\", \"%\"]\n        ],\n        {}\n);\n\nvar STATEMENTS_WITH_LABELS = array_to_hash([ \"for\", \"do\", \"while\", \"switch\" ]);\n\nvar ATOMIC_START_TOKEN = array_to_hash([ \"atom\", \"num\", \"string\", \"regexp\", \"name\" ]);\n\n/* -----[ Parser ]----- */\n\nfunction NodeWithToken(str, start, end) {\n        this.name = str;\n        this.start = start;\n        this.end = end;\n};\n\nNodeWithToken.prototype.toString = function() { return this.name; };\n\nfunction parse($TEXT, exigent_mode, embed_tokens) {\n\n        var S = {\n                input       : typeof $TEXT == \"string\" ? tokenizer($TEXT, true) : $TEXT,\n                token       : null,\n                prev        : null,\n                peeked      : null,\n                in_function : 0,\n                in_loop     : 0,\n                labels      : []\n        };\n\n        S.token = next();\n\n        function is(type, value) {\n                return is_token(S.token, type, value);\n        };\n\n        function peek() { return S.peeked || (S.peeked = S.input()); };\n\n        function next() {\n                S.prev = S.token;\n                if (S.peeked) {\n                        S.token = S.peeked;\n                        S.peeked = null;\n                } else {\n                        S.token = S.input();\n                }\n                return S.token;\n        };\n\n        function prev() {\n                return S.prev;\n        };\n\n        function croak(msg, line, col, pos) {\n                var ctx = S.input.context();\n                js_error(msg,\n                         line != null ? line : ctx.tokline,\n                         col != null ? col : ctx.tokcol,\n                         pos != null ? pos : ctx.tokpos);\n        };\n\n        function token_error(token, msg) {\n                croak(msg, token.line, token.col);\n        };\n\n        function unexpected(token) {\n                if (token == null)\n                        token = S.token;\n                token_error(token, \"Unexpected token: \" + token.type + \" (\" + token.value + \")\");\n        };\n\n        function expect_token(type, val) {\n                if (is(type, val)) {\n                        return next();\n                }\n                token_error(S.token, \"Unexpected token \" + S.token.type + \", expected \" + type);\n        };\n\n        function expect(punc) { return expect_token(\"punc\", punc); };\n\n        function can_insert_semicolon() {\n                return !exigent_mode && (\n                        S.token.nlb || is(\"eof\") || is(\"punc\", \"}\")\n                );\n        };\n\n        function semicolon() {\n                if (is(\"punc\", \";\")) next();\n                else if (!can_insert_semicolon()) unexpected();\n        };\n\n        function as() {\n                return slice(arguments);\n        };\n\n        function parenthesised() {\n                expect(\"(\");\n                var ex = expression();\n                expect(\")\");\n                return ex;\n        };\n\n        function add_tokens(str, start, end) {\n                return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end);\n        };\n\n        function maybe_embed_tokens(parser) {\n                if (embed_tokens) return function() {\n                        var start = S.token;\n                        var ast = parser.apply(this, arguments);\n                        ast[0] = add_tokens(ast[0], start, prev());\n                        return ast;\n                };\n                else return parser;\n        };\n\n        var statement = maybe_embed_tokens(function() {\n                if (is(\"operator\", \"/\")) {\n                        S.peeked = null;\n                        S.token = S.input(true); // force regexp\n                }\n                switch (S.token.type) {\n                    case \"num\":\n                    case \"string\":\n                    case \"regexp\":\n                    case \"operator\":\n                    case \"atom\":\n                        return simple_statement();\n\n                    case \"name\":\n                        return is_token(peek(), \"punc\", \":\")\n                                ? labeled_statement(prog1(S.token.value, next, next))\n                                : simple_statement();\n\n                    case \"punc\":\n                        switch (S.token.value) {\n                            case \"{\":\n                                return as(\"block\", block_());\n                            case \"[\":\n                            case \"(\":\n                                return simple_statement();\n                            case \";\":\n                                next();\n                                return as(\"block\");\n                            default:\n                                unexpected();\n                        }\n\n                    case \"keyword\":\n                        switch (prog1(S.token.value, next)) {\n                            case \"break\":\n                                return break_cont(\"break\");\n\n                            case \"continue\":\n                                return break_cont(\"continue\");\n\n                            case \"debugger\":\n                                semicolon();\n                                return as(\"debugger\");\n\n                            case \"do\":\n                                return (function(body){\n                                        expect_token(\"keyword\", \"while\");\n                                        return as(\"do\", prog1(parenthesised, semicolon), body);\n                                })(in_loop(statement));\n\n                            case \"for\":\n                                return for_();\n\n                            case \"function\":\n                                return function_(true);\n\n                            case \"if\":\n                                return if_();\n\n                            case \"return\":\n                                if (S.in_function == 0)\n                                        croak(\"'return' outside of function\");\n                                return as(\"return\",\n                                          is(\"punc\", \";\")\n                                          ? (next(), null)\n                                          : can_insert_semicolon()\n                                          ? null\n                                          : prog1(expression, semicolon));\n\n                            case \"switch\":\n                                return as(\"switch\", parenthesised(), switch_block_());\n\n                            case \"throw\":\n                                return as(\"throw\", prog1(expression, semicolon));\n\n                            case \"try\":\n                                return try_();\n\n                            case \"var\":\n                                return prog1(var_, semicolon);\n\n                            case \"const\":\n                                return prog1(const_, semicolon);\n\n                            case \"while\":\n                                return as(\"while\", parenthesised(), in_loop(statement));\n\n                            case \"with\":\n                                return as(\"with\", parenthesised(), statement());\n\n                            default:\n                                unexpected();\n                        }\n                }\n        });\n\n        function labeled_statement(label) {\n                S.labels.push(label);\n                var start = S.token, stat = statement();\n                if (exigent_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0]))\n                        unexpected(start);\n                S.labels.pop();\n                return as(\"label\", label, stat);\n        };\n\n        function simple_statement() {\n                return as(\"stat\", prog1(expression, semicolon));\n        };\n\n        function break_cont(type) {\n                var name;\n                if (!can_insert_semicolon()) {\n                        name = is(\"name\") ? S.token.value : null;\n                }\n                if (name != null) {\n                        next();\n                        if (!member(name, S.labels))\n                                croak(\"Label \" + name + \" without matching loop or statement\");\n                }\n                else if (S.in_loop == 0)\n                        croak(type + \" not inside a loop or switch\");\n                semicolon();\n                return as(type, name);\n        };\n\n        function for_() {\n                expect(\"(\");\n                var init = null;\n                if (!is(\"punc\", \";\")) {\n                        init = is(\"keyword\", \"var\")\n                                ? (next(), var_(true))\n                                : expression(true, true);\n                        if (is(\"operator\", \"in\"))\n                                return for_in(init);\n                }\n                return regular_for(init);\n        };\n\n        function regular_for(init) {\n                expect(\";\");\n                var test = is(\"punc\", \";\") ? null : expression();\n                expect(\";\");\n                var step = is(\"punc\", \")\") ? null : expression();\n                expect(\")\");\n                return as(\"for\", init, test, step, in_loop(statement));\n        };\n\n        function for_in(init) {\n                var lhs = init[0] == \"var\" ? as(\"name\", init[1][0]) : init;\n                next();\n                var obj = expression();\n                expect(\")\");\n                return as(\"for-in\", init, lhs, obj, in_loop(statement));\n        };\n\n        var function_ = maybe_embed_tokens(function(in_statement) {\n                var name = is(\"name\") ? prog1(S.token.value, next) : null;\n                if (in_statement && !name)\n                        unexpected();\n                expect(\"(\");\n                return as(in_statement ? \"defun\" : \"function\",\n                          name,\n                          // arguments\n                          (function(first, a){\n                                  while (!is(\"punc\", \")\")) {\n                                          if (first) first = false; else expect(\",\");\n                                          if (!is(\"name\")) unexpected();\n                                          a.push(S.token.value);\n                                          next();\n                                  }\n                                  next();\n                                  return a;\n                          })(true, []),\n                          // body\n                          (function(){\n                                  ++S.in_function;\n                                  var loop = S.in_loop;\n                                  S.in_loop = 0;\n                                  var a = block_();\n                                  --S.in_function;\n                                  S.in_loop = loop;\n                                  return a;\n                          })());\n        });\n\n        function if_() {\n                var cond = parenthesised(), body = statement(), belse;\n                if (is(\"keyword\", \"else\")) {\n                        next();\n                        belse = statement();\n                }\n                return as(\"if\", cond, body, belse);\n        };\n\n        function block_() {\n                expect(\"{\");\n                var a = [];\n                while (!is(\"punc\", \"}\")) {\n                        if (is(\"eof\")) unexpected();\n                        a.push(statement());\n                }\n                next();\n                return a;\n        };\n\n        var switch_block_ = curry(in_loop, function(){\n                expect(\"{\");\n                var a = [], cur = null;\n                while (!is(\"punc\", \"}\")) {\n                        if (is(\"eof\")) unexpected();\n                        if (is(\"keyword\", \"case\")) {\n                                next();\n                                cur = [];\n                                a.push([ expression(), cur ]);\n                                expect(\":\");\n                        }\n                        else if (is(\"keyword\", \"default\")) {\n                                next();\n                                expect(\":\");\n                                cur = [];\n                                a.push([ null, cur ]);\n                        }\n                        else {\n                                if (!cur) unexpected();\n                                cur.push(statement());\n                        }\n                }\n                next();\n                return a;\n        });\n\n        function try_() {\n                var body = block_(), bcatch, bfinally;\n                if (is(\"keyword\", \"catch\")) {\n                        next();\n                        expect(\"(\");\n                        if (!is(\"name\"))\n                                croak(\"Name expected\");\n                        var name = S.token.value;\n                        next();\n                        expect(\")\");\n                        bcatch = [ name, block_() ];\n                }\n                if (is(\"keyword\", \"finally\")) {\n                        next();\n                        bfinally = block_();\n                }\n                if (!bcatch && !bfinally)\n                        croak(\"Missing catch/finally blocks\");\n                return as(\"try\", body, bcatch, bfinally);\n        };\n\n        function vardefs(no_in) {\n                var a = [];\n                for (;;) {\n                        if (!is(\"name\"))\n                                unexpected();\n                        var name = S.token.value;\n                        next();\n                        if (is(\"operator\", \"=\")) {\n                                next();\n                                a.push([ name, expression(false, no_in) ]);\n                        } else {\n                                a.push([ name ]);\n                        }\n                        if (!is(\"punc\", \",\"))\n                                break;\n                        next();\n                }\n                return a;\n        };\n\n        function var_(no_in) {\n                return as(\"var\", vardefs(no_in));\n        };\n\n        function const_() {\n                return as(\"const\", vardefs());\n        };\n\n        function new_() {\n                var newexp = expr_atom(false), args;\n                if (is(\"punc\", \"(\")) {\n                        next();\n                        args = expr_list(\")\");\n                } else {\n                        args = [];\n                }\n                return subscripts(as(\"new\", newexp, args), true);\n        };\n\n        var expr_atom = maybe_embed_tokens(function(allow_calls) {\n                if (is(\"operator\", \"new\")) {\n                        next();\n                        return new_();\n                }\n                if (is(\"operator\") && HOP(UNARY_PREFIX, S.token.value)) {\n                        return make_unary(\"unary-prefix\",\n                                          prog1(S.token.value, next),\n                                          expr_atom(allow_calls));\n                }\n                if (is(\"punc\")) {\n                        switch (S.token.value) {\n                            case \"(\":\n                                next();\n                                return subscripts(prog1(expression, curry(expect, \")\")), allow_calls);\n                            case \"[\":\n                                next();\n                                return subscripts(array_(), allow_calls);\n                            case \"{\":\n                                next();\n                                return subscripts(object_(), allow_calls);\n                        }\n                        unexpected();\n                }\n                if (is(\"keyword\", \"function\")) {\n                        next();\n                        return subscripts(function_(false), allow_calls);\n                }\n                if (HOP(ATOMIC_START_TOKEN, S.token.type)) {\n                        var atom = S.token.type == \"regexp\"\n                                ? as(\"regexp\", S.token.value[0], S.token.value[1])\n                                : as(S.token.type, S.token.value);\n                        return subscripts(prog1(atom, next), allow_calls);\n                }\n                unexpected();\n        });\n\n        function expr_list(closing, allow_trailing_comma, allow_empty) {\n                var first = true, a = [];\n                while (!is(\"punc\", closing)) {\n                        if (first) first = false; else expect(\",\");\n                        if (allow_trailing_comma && is(\"punc\", closing)) break;\n                        if (is(\"punc\", \",\") && allow_empty) {\n                                a.push([ \"atom\", \"undefined\" ]);\n                        } else {\n                                a.push(expression(false));\n                        }\n                }\n                next();\n                return a;\n        };\n\n        function array_() {\n                return as(\"array\", expr_list(\"]\", !exigent_mode, true));\n        };\n\n        function object_() {\n                var first = true, a = [];\n                while (!is(\"punc\", \"}\")) {\n                        if (first) first = false; else expect(\",\");\n                        if (!exigent_mode && is(\"punc\", \"}\"))\n                                // allow trailing comma\n                                break;\n                        var type = S.token.type;\n                        var name = as_property_name();\n                        if (type == \"name\" && (name == \"get\" || name == \"set\") && !is(\"punc\", \":\")) {\n                                a.push([ as_name(), function_(false), name ]);\n                        } else {\n                                expect(\":\");\n                                a.push([ name, expression(false) ]);\n                        }\n                }\n                next();\n                return as(\"object\", a);\n        };\n\n        function as_property_name() {\n                switch (S.token.type) {\n                    case \"num\":\n                    case \"string\":\n                        return prog1(S.token.value, next);\n                }\n                return as_name();\n        };\n\n        function as_name() {\n                switch (S.token.type) {\n                    case \"name\":\n                    case \"operator\":\n                    case \"keyword\":\n                    case \"atom\":\n                        return prog1(S.token.value, next);\n                    default:\n                        unexpected();\n                }\n        };\n\n        function subscripts(expr, allow_calls) {\n                if (is(\"punc\", \".\")) {\n                        next();\n                        return subscripts(as(\"dot\", expr, as_name()), allow_calls);\n                }\n                if (is(\"punc\", \"[\")) {\n                        next();\n                        return subscripts(as(\"sub\", expr, prog1(expression, curry(expect, \"]\"))), allow_calls);\n                }\n                if (allow_calls && is(\"punc\", \"(\")) {\n                        next();\n                        return subscripts(as(\"call\", expr, expr_list(\")\")), true);\n                }\n                if (allow_calls && is(\"operator\") && HOP(UNARY_POSTFIX, S.token.value)) {\n                        return prog1(curry(make_unary, \"unary-postfix\", S.token.value, expr),\n                                     next);\n                }\n                return expr;\n        };\n\n        function make_unary(tag, op, expr) {\n                if ((op == \"++\" || op == \"--\") && !is_assignable(expr))\n                        croak(\"Invalid use of \" + op + \" operator\");\n                return as(tag, op, expr);\n        };\n\n        function expr_op(left, min_prec, no_in) {\n                var op = is(\"operator\") ? S.token.value : null;\n                if (op && op == \"in\" && no_in) op = null;\n                var prec = op != null ? PRECEDENCE[op] : null;\n                if (prec != null && prec > min_prec) {\n                        next();\n                        var right = expr_op(expr_atom(true), prec, no_in);\n                        return expr_op(as(\"binary\", op, left, right), min_prec, no_in);\n                }\n                return left;\n        };\n\n        function expr_ops(no_in) {\n                return expr_op(expr_atom(true), 0, no_in);\n        };\n\n        function maybe_conditional(no_in) {\n                var expr = expr_ops(no_in);\n                if (is(\"operator\", \"?\")) {\n                        next();\n                        var yes = expression(false);\n                        expect(\":\");\n                        return as(\"conditional\", expr, yes, expression(false, no_in));\n                }\n                return expr;\n        };\n\n        function is_assignable(expr) {\n                if (!exigent_mode) return true;\n                switch (expr[0]) {\n                    case \"dot\":\n                    case \"sub\":\n                    case \"new\":\n                    case \"call\":\n                        return true;\n                    case \"name\":\n                        return expr[1] != \"this\";\n                }\n        };\n\n        function maybe_assign(no_in) {\n                var left = maybe_conditional(no_in), val = S.token.value;\n                if (is(\"operator\") && HOP(ASSIGNMENT, val)) {\n                        if (is_assignable(left)) {\n                                next();\n                                return as(\"assign\", ASSIGNMENT[val], left, maybe_assign(no_in));\n                        }\n                        croak(\"Invalid assignment\");\n                }\n                return left;\n        };\n\n        var expression = maybe_embed_tokens(function(commas, no_in) {\n                if (arguments.length == 0)\n                        commas = true;\n                var expr = maybe_assign(no_in);\n                if (commas && is(\"punc\", \",\")) {\n                        next();\n                        return as(\"seq\", expr, expression(true, no_in));\n                }\n                return expr;\n        });\n\n        function in_loop(cont) {\n                try {\n                        ++S.in_loop;\n                        return cont();\n                } finally {\n                        --S.in_loop;\n                }\n        };\n\n        return as(\"toplevel\", (function(a){\n                while (!is(\"eof\"))\n                        a.push(statement());\n                return a;\n        })([]));\n\n};\n\n/* -----[ Utilities ]----- */\n\nfunction curry(f) {\n        var args = slice(arguments, 1);\n        return function() { return f.apply(this, args.concat(slice(arguments))); };\n};\n\nfunction prog1(ret) {\n        if (ret instanceof Function)\n                ret = ret();\n        for (var i = 1, n = arguments.length; --n > 0; ++i)\n                arguments[i]();\n        return ret;\n};\n\nfunction array_to_hash(a) {\n        var ret = {};\n        for (var i = 0; i < a.length; ++i)\n                ret[a[i]] = true;\n        return ret;\n};\n\nfunction slice(a, start) {\n        return Array.prototype.slice.call(a, start == null ? 0 : start);\n};\n\nfunction characters(str) {\n        return str.split(\"\");\n};\n\nfunction member(name, array) {\n        for (var i = array.length; --i >= 0;)\n                if (array[i] === name)\n                        return true;\n        return false;\n};\n\nfunction HOP(obj, prop) {\n        return Object.prototype.hasOwnProperty.call(obj, prop);\n};\n\nvar warn = function() {};\n\n/* -----[ Exports ]----- */\n\nexports.tokenizer = tokenizer;\nexports.parse = parse;\nexports.slice = slice;\nexports.curry = curry;\nexports.member = member;\nexports.array_to_hash = array_to_hash;\nexports.PRECEDENCE = PRECEDENCE;\nexports.KEYWORDS_ATOM = KEYWORDS_ATOM;\nexports.RESERVED_WORDS = RESERVED_WORDS;\nexports.KEYWORDS = KEYWORDS;\nexports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN;\nexports.OPERATORS = OPERATORS;\nexports.is_alphanumeric_char = is_alphanumeric_char;\nexports.set_logger = function(logger) {\n        warn = logger;\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jison/ansic.jison",
    "content": "%token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF\n%token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP\n%token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN\n%token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN\n%token XOR_ASSIGN OR_ASSIGN TYPE_NAME\n\n%token TYPEDEF EXTERN STATIC AUTO REGISTER\n%token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID\n%token STRUCT UNION ENUM ELLIPSIS\n\n%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN\n\n%nonassoc IF_WITHOUT_ELSE\n%nonassoc ELSE\n\n%start translation_unit\n%%\n\nprimary_expression\n    : IDENTIFIER\n    | CONSTANT\n    | STRING_LITERAL\n    | '(' expression ')'\n    ;\n\npostfix_expression\n    : primary_expression\n    | postfix_expression '[' expression ']'\n    | postfix_expression '(' ')'\n    | postfix_expression '(' argument_expression_list ')'\n    | postfix_expression '.' IDENTIFIER\n    | postfix_expression PTR_OP IDENTIFIER\n    | postfix_expression INC_OP\n    | postfix_expression DEC_OP\n    ;\n\nargument_expression_list\n    : assignment_expression\n    | argument_expression_list ',' assignment_expression\n    ;\n\nunary_expression\n    : postfix_expression\n    | INC_OP unary_expression\n    | DEC_OP unary_expression\n    | unary_operator cast_expression\n    | SIZEOF unary_expression\n    | SIZEOF '(' type_name ')'\n    ;\n\nunary_operator\n    : '&'\n    | '*'\n    | '+'\n    | '-'\n    | '~'\n    | '!'\n    ;\n\ncast_expression\n    : unary_expression\n    | '(' type_name ')' cast_expression\n    ;\n\nmultiplicative_expression\n    : cast_expression\n    | multiplicative_expression '*' cast_expression\n    | multiplicative_expression '/' cast_expression\n    | multiplicative_expression '%' cast_expression\n    ;\n\nadditive_expression\n    : multiplicative_expression\n    | additive_expression '+' multiplicative_expression\n    | additive_expression '-' multiplicative_expression\n    ;\n\nshift_expression\n    : additive_expression\n    | shift_expression LEFT_OP additive_expression\n    | shift_expression RIGHT_OP additive_expression\n    ;\n\nrelational_expression\n    : shift_expression\n    | relational_expression '<' shift_expression\n    | relational_expression '>' shift_expression\n    | relational_expression LE_OP shift_expression\n    | relational_expression GE_OP shift_expression\n    ;\n\nequality_expression\n    : relational_expression\n    | equality_expression EQ_OP relational_expression\n    | equality_expression NE_OP relational_expression\n    ;\n\nand_expression\n    : equality_expression\n    | and_expression '&' equality_expression\n    ;\n\nexclusive_or_expression\n    : and_expression\n    | exclusive_or_expression '^' and_expression\n    ;\n\ninclusive_or_expression\n    : exclusive_or_expression\n    | inclusive_or_expression '|' exclusive_or_expression\n    ;\n\nlogical_and_expression\n    : inclusive_or_expression\n    | logical_and_expression AND_OP inclusive_or_expression\n    ;\n\nlogical_or_expression\n    : logical_and_expression\n    | logical_or_expression OR_OP logical_and_expression\n    ;\n\nconditional_expression\n    : logical_or_expression\n    | logical_or_expression '?' expression ':' conditional_expression\n    ;\n\nassignment_expression\n    : conditional_expression\n    | unary_expression assignment_operator assignment_expression\n    ;\n\nassignment_operator\n    : '='\n    | MUL_ASSIGN\n    | DIV_ASSIGN\n    | MOD_ASSIGN\n    | ADD_ASSIGN\n    | SUB_ASSIGN\n    | LEFT_ASSIGN\n    | RIGHT_ASSIGN\n    | AND_ASSIGN\n    | XOR_ASSIGN\n    | OR_ASSIGN\n    ;\n\nexpression\n    : assignment_expression\n    | expression ',' assignment_expression\n    ;\n\nconstant_expression\n    : conditional_expression\n    ;\n\ndeclaration\n    : declaration_specifiers ';'\n    | declaration_specifiers init_declarator_list ';'\n    ;\n\ndeclaration_specifiers\n    : storage_class_specifier\n    | storage_class_specifier declaration_specifiers\n    | type_specifier\n    | type_specifier declaration_specifiers\n    | type_qualifier\n    | type_qualifier declaration_specifiers\n    ;\n\ninit_declarator_list\n    : init_declarator\n    | init_declarator_list ',' init_declarator\n    ;\n\ninit_declarator\n    : declarator\n    | declarator '=' initializer\n    ;\n\nstorage_class_specifier\n    : TYPEDEF\n    | EXTERN\n    | STATIC\n    | AUTO\n    | REGISTER\n    ;\n\ntype_specifier\n    : VOID\n    | CHAR\n    | SHORT\n    | INT\n    | LONG\n    | FLOAT\n    | DOUBLE\n    | SIGNED\n    | UNSIGNED\n    | struct_or_union_specifier\n    | enum_specifier\n    | TYPE_NAME\n    ;\n\nstruct_or_union_specifier\n    : struct_or_union IDENTIFIER '{' struct_declaration_list '}'\n    | struct_or_union '{' struct_declaration_list '}'\n    | struct_or_union IDENTIFIER\n    ;\n\nstruct_or_union\n    : STRUCT\n    | UNION\n    ;\n\nstruct_declaration_list\n    : struct_declaration\n    | struct_declaration_list struct_declaration\n    ;\n\nstruct_declaration\n    : specifier_qualifier_list struct_declarator_list ';'\n    ;\n\nspecifier_qualifier_list\n    : type_specifier specifier_qualifier_list\n    | type_specifier\n    | type_qualifier specifier_qualifier_list\n    | type_qualifier\n    ;\n\nstruct_declarator_list\n    : struct_declarator\n    | struct_declarator_list ',' struct_declarator\n    ;\n\nstruct_declarator\n    : declarator\n    | ':' constant_expression\n    | declarator ':' constant_expression\n    ;\n\nenum_specifier\n    : ENUM '{' enumerator_list '}'\n    | ENUM IDENTIFIER '{' enumerator_list '}'\n    | ENUM IDENTIFIER\n    ;\n\nenumerator_list\n    : enumerator\n    | enumerator_list ',' enumerator\n    ;\n\nenumerator\n    : IDENTIFIER\n    | IDENTIFIER '=' constant_expression\n    ;\n\ntype_qualifier\n    : CONST\n    | VOLATILE\n    ;\n\ndeclarator\n    : pointer direct_declarator\n    | direct_declarator\n    ;\n\ndirect_declarator\n    : IDENTIFIER\n    | '(' declarator ')'\n    | direct_declarator '[' constant_expression ']'\n    | direct_declarator '[' ']'\n    | direct_declarator '(' parameter_type_list ')'\n    | direct_declarator '(' identifier_list ')'\n    | direct_declarator '(' ')'\n    ;\n\npointer\n    : '*'\n    | '*' type_qualifier_list\n    | '*' pointer\n    | '*' type_qualifier_list pointer\n    ;\n\ntype_qualifier_list\n    : type_qualifier\n    | type_qualifier_list type_qualifier\n    ;\n\n\nparameter_type_list\n    : parameter_list\n    | parameter_list ',' ELLIPSIS\n    ;\n\nparameter_list\n    : parameter_declaration\n    | parameter_list ',' parameter_declaration\n    ;\n\nparameter_declaration\n    : declaration_specifiers declarator\n    | declaration_specifiers abstract_declarator\n    | declaration_specifiers\n    ;\n\nidentifier_list\n    : IDENTIFIER\n    | identifier_list ',' IDENTIFIER\n    ;\n\ntype_name\n    : specifier_qualifier_list\n    | specifier_qualifier_list abstract_declarator\n    ;\n\nabstract_declarator\n    : pointer\n    | direct_abstract_declarator\n    | pointer direct_abstract_declarator\n    ;\n\ndirect_abstract_declarator\n    : '(' abstract_declarator ')'\n    | '[' ']'\n    | '[' constant_expression ']'\n    | direct_abstract_declarator '[' ']'\n    | direct_abstract_declarator '[' constant_expression ']'\n    | '(' ')'\n    | '(' parameter_type_list ')'\n    | direct_abstract_declarator '(' ')'\n    | direct_abstract_declarator '(' parameter_type_list ')'\n    ;\n\ninitializer\n    : assignment_expression\n    | '{' initializer_list '}'\n    | '{' initializer_list ',' '}'\n    ;\n\ninitializer_list\n    : initializer\n    | initializer_list ',' initializer\n    ;\n\nstatement\n    : labeled_statement\n    | compound_statement\n    | expression_statement\n    | selection_statement\n    | iteration_statement\n    | jump_statement\n    ;\n\nlabeled_statement\n    : IDENTIFIER ':' statement\n    | CASE constant_expression ':' statement\n    | DEFAULT ':' statement\n    ;\n\ncompound_statement\n    : '{' '}'\n    | '{' statement_list '}'\n    | '{' declaration_list '}'\n    | '{' declaration_list statement_list '}'\n    ;\n\ndeclaration_list\n    : declaration\n    | declaration_list declaration\n    ;\n\nstatement_list\n    : statement\n    | statement_list statement\n    ;\n\nexpression_statement\n    : ';'\n    | expression ';'\n    ;\n\nselection_statement\n    : IF '(' expression ')' statement %prec IF_WITHOUT_ELSE\n    | IF '(' expression ')' statement ELSE statement\n    | SWITCH '(' expression ')' statement\n    ;\n\niteration_statement\n    : WHILE '(' expression ')' statement\n    | DO statement WHILE '(' expression ')' ';'\n    | FOR '(' expression_statement expression_statement ')' statement\n    | FOR '(' expression_statement expression_statement expression ')' statement\n    ;\n\njump_statement\n    : GOTO IDENTIFIER ';'\n    | CONTINUE ';'\n    | BREAK ';'\n    | RETURN ';'\n    | RETURN expression ';'\n    ;\n\ntranslation_unit\n    : external_declaration\n    | translation_unit external_declaration\n    ;\n\nexternal_declaration\n    : function_definition\n    | declaration\n    ;\n\nfunction_definition\n    : declaration_specifiers declarator declaration_list compound_statement\n    | declaration_specifiers declarator compound_statement\n    | declarator declaration_list compound_statement\n    | declarator compound_statement\n    ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jison/classy.jison",
    "content": "\n/* description: ClassyLang grammar. Very classy. */\n/*\n  To build parser:\n\n    $ ./bin/jison examples/classy.jison examples/classy.jisonlex\n\n*/\n\n\n/* author: Zach Carter */\n\n%right ASSIGN\n%left OR\n%nonassoc EQUALITY GREATER\n%left PLUS MINUS\n%left TIMES\n%right NOT\n%left DOT\n\n%%\n\npgm\n    : cdl MAIN LBRACE vdl el RBRACE ENDOFFILE\n    ;\n\ncdl\n    : c cdl\n    |\n    ;\n\nc\n    : CLASS id EXTENDS id LBRACE vdl mdl RBRACE\n    ;\n\nvdl\n    : VAR t id SEMICOLON vdl\n    |\n    ;\n\nmdl\n    : t id LPAREN t id RPAREN LBRACE vdl el RBRACE mdl\n    |\n    ;\n\nt\n    : NATTYPE\n    | id\n    ;\n\nid\n    : ID\n    ;\n\nel\n    : e SEMICOLON el\n    | e SEMICOLON\n    ;\n\ne\n    : NATLITERAL\n    | NUL\n    | id\n    | NEW id\n    | THIS\n    | IF LPAREN e RPAREN LBRACE el RBRACE ELSE LBRACE el RBRACE\n    | FOR LPAREN e SEMICOLON e SEMICOLON e RPAREN LBRACE el RBRACE\n    | READNAT LPAREN RPAREN\n    | PRINTNAT LPAREN e RPAREN\n    | e PLUS e\n    | e MINUS e\n    | e TIMES e\n    | e EQUALITY e\n    | e GREATER e\n    | NOT e\n    | e OR e\n    | e DOT id\n    | id ASSIGN e\n    | e DOT id ASSIGN e\n    | id LPAREN e RPAREN\n    | e DOT id LPAREN e RPAREN\n    | LPAREN e RPAREN\n    ;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jison/lex.jison",
    "content": "\n// `%nonassoc` tells the parser compiler (JISON) that these tokens cannot occur more than once,\n// i.e. input like '//a' (tokens '/', '/' and 'a') is not a legal input while '/a' (tokens '/' and 'a')\n// *is* legal input for this grammar.\n \n%nonassoc '/' '/!'\n\n// Likewise for `%left`: this informs the LALR(1) grammar compiler (JISON) that these tokens\n// *can* occur repeatedly, e.g. 'a?*' and even 'a**' are considered legal inputs given this\n// grammar!\n//\n// Token `RANGE_REGEX` may seem the odd one out here but really isn't: given the `regex_base`\n// choice/rule `regex_base range_regex`, which is recursive, this grammar tells JISON that \n// any input matching a sequence like `regex_base range_regex range_regex` *is* legal.\n// If you do not want that to be legal, you MUST adjust the grammar rule set you match your\n// actual intent.\n\n%left '*' '+' '?' RANGE_REGEX\n\n\n%% \n\nlex \n    : definitions include '%%' rules '%%' EOF\n        {{ $$ = {macros: $1, rules: $4};\n          if ($2) $$.actionInclude = $2;\n          return $$; }}\n    | definitions include '%%' rules EOF\n        {{ $$ = {macros: $1, rules: $4};\n          if ($2) $$.actionInclude = $2;\n          return $$; }}\n    ;\n\ninclude\n    : action\n    |\n    ;\n\ndefinitions\n    : definitions definition\n        { $$ = $1; $$.concat($2); }\n    | definition\n        { $$ = [$1]; }\n    ;\n\ndefinition\n    : name regex\n        { $$ = [$1, $2]; }\n    ;\n\nname\n    : NAME\n        { $$ = yytext; }\n    ;\n\nrules\n    : rules rule\n        { $$ = $1; $$.push($2); }\n    | rule\n        { $$ = [$1]; }\n    ;\n\nrule\n    : regex action\n        { $$ = [$1, $2]; }\n    ;\n\naction\n    : ACTION \n        { $$ = yytext; }\n    ;\n\nregex\n    : start_caret regex_list end_dollar\n        { $$ = $1+$2+$3; }\n    ;\n\nstart_caret\n    : '^'\n        { $$ = '^'; }\n    |\n        { $$ = ''; }\n    ;\n\nend_dollar\n    : '$'\n        { $$ = '$'; }\n    |\n        { $$ = ''; }\n    ;\n\nregex_list\n    : regex_list '|' regex_chain\n        { $$ = $1+'|'+$3; }\n    | regex_chain\n    ;\n\nregex_chain\n    : regex_chain regex_base\n        { $$ = $1+$2;}\n    | regex_base\n        { $$ = $1;}\n    ;\n\nregex_base\n    : '(' regex_list ')'\n        { $$ = '('+$2+')'; }\n    | regex_base '+'\n        { $$ = $1+'+'; }\n    | regex_base '*'\n        { $$ = $1+'*'; }\n    | regex_base '?'\n        { $$ = $1+'?'; }\n    | '/' regex_base\n        { $$ = '(?=' + $regex_base + ')'; }\n    | '/!' regex_base\n        { $$ = '(?!' + $regex_base + ')'; }\n    | name_expansion\n    | regex_base range_regex\n        { $$ = $1+$2; }\n    | any_group_regex\n    | '.'\n        { $$ = '.'; }\n    | string\n    ;\n\nname_expansion\n    : '{' name '}'\n        {{ $$ = '{'+$2+'}'; }}\n    ;\n\nany_group_regex\n    : ANY_GROUP_REGEX\n        { $$ = yytext; }\n    ;\n\nrange_regex\n    : RANGE_REGEX\n        { $$ = yytext; }\n    ;\n\nstring\n    : STRING_LIT\n        { $$ = yy.prepareString(yytext.substr(1, yyleng-2)); }\n    ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jison Lex/classy.jisonlex",
    "content": "digit                       [0-9]\nid                          [a-zA-Z][a-zA-Z0-9]*\n\n%%\n\"//\".*                      /* ignore comment */\n\"main\"                      return 'MAIN';\n\"class\"                     return 'CLASS';\n\"extends\"                   return 'EXTENDS';\n\"nat\"                       return 'NATTYPE';\n\"if\"                        return 'IF';\n\"else\"                      return 'ELSE';\n\"for\"                       return 'FOR';\n\"printNat\"                  return 'PRINTNAT';\n\"readNat\"                   return 'READNAT';\n\"this\"                      return 'THIS';\n\"new\"                       return 'NEW';\n\"var\"                       return 'VAR';\n\"null\"                      return 'NUL';\n{digit}+                    return 'NATLITERAL';\n{id}                        return 'ID';\n\"==\"                        return 'EQUALITY';\n\"=\"                         return 'ASSIGN';\n\"+\"                         return 'PLUS';\n\"-\"                         return 'MINUS';\n\"*\"                         return 'TIMES';\n\">\"                         return 'GREATER';\n\"||\"                        return 'OR';\n\"!\"                         return 'NOT';\n\".\"                         return 'DOT';\n\"{\"                         return 'LBRACE';\n\"}\"                         return 'RBRACE';\n\"(\"                         return 'LPAREN';\n\")\"                         return 'RPAREN';\n\";\"                         return 'SEMICOLON';\n\\s+                         /* skip whitespace */\n\".\"                         throw 'Illegal character';\n<<EOF>>                     return 'ENDOFFILE';\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jison Lex/lex_grammar.jisonlex",
    "content": "\n%%\n\\n+                         {yy.freshLine = true;}\n\\s+                         {yy.freshLine = false;}\n\"y{\"[^}]*\"}\"                {yytext = yytext.substr(2, yyleng - 3); return 'ACTION';}\n[a-zA-Z_][a-zA-Z0-9_-]*     {return 'NAME';}\n'\"'([^\"]|'\\\"')*'\"'          {return 'STRING_LIT';}\n\"'\"([^']|\"\\'\")*\"'\"          {return 'STRING_LIT';}\n\"|\"                         {return '|';}\n\"[\"(\"\\]\"|[^\\]])*\"]\"         {return 'ANY_GROUP_REGEX';}\n\"(\"                         {return '(';}\n\")\"                         {return ')';}\n\"+\"                         {return '+';}\n\"*\"                         {return '*';}\n\"?\"                         {return '?';}\n\"^\"                         {return '^';}\n\"/\"                         {return '/';}\n\"\\\\\"[a-zA-Z0]               {return 'ESCAPE_CHAR';}\n\"$\"                         {return '$';}\n\"<<EOF>>\"                   {return '$';}\n\".\"                         {return '.';}\n\"%%\"                        {return '%%';}\n\"{\"\\d+(\",\"\\s?\\d+|\",\")?\"}\"   {return 'RANGE_REGEX';}\n/\"{\"                        %{if (yy.freshLine) { this.input('{'); return '{'; } else { this.unput('y'); }%}\n\"}\"                         %{return '}';%}\n\"%{\"(.|\\n)*?\"}%\"            {yytext = yytext.substr(2, yyleng - 4); return 'ACTION';}\n.                           {/* ignore bad characters */}\n<<EOF>>                     {return 'EOF';}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jolie/common.iol",
    "content": "include \"types/Binding.iol\"\n\nconstants {\n\tLocation_Exam = \"socket://localhost:8000\"\n}\n\ntype StartExamRequest:void {\n\t.examName:string\n\t.studentName:string\n\t.student:Binding\n}\n\ntype MakeQuestionRequest:void {\n\t.question:string\n\t.examName:string\n\t.studentName:string\n}\n\ntype DecisionMessage:void {\n\t.studentName:string\n\t.examName:string\n}\n\ninterface ExamInterface {\nOneWay:\n\tstartExam(StartExamRequest),\n\tpass(DecisionMessage), fail(DecisionMessage)\nRequestResponse:\n\tmakeQuestion(MakeQuestionRequest)(int)\n}\n\ninterface StudentInterface {\nOneWay:\n\tsendMessage(string)\nRequestResponse:\n\tmakeQuestion(MakeQuestionRequest)(int)\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Jolie/exam.ol",
    "content": "include \"common.iol\"\n\ncset {\nstudentName:\n\tStartExamRequest.studentName\n\tDecisionMessage.studentName\n\tMakeQuestionRequest.studentName,\nexamName:\n\tStartExamRequest.examName\n\tDecisionMessage.examName\n\tMakeQuestionRequest.examName\n}\n\nexecution { concurrent }\n\noutputPort Student {\nInterfaces: StudentInterface\n}\n\ninputPort ExamInput {\nLocation: Location_Exam\nProtocol: sodep\nInterfaces: ExamInterface\n}\n\nmain\n{\n\tstartExam( examRequest );\n\tStudent << examRequest.student;\n\tmakeQuestion( question )( answer ) {\n\t\tmakeQuestion@Student( question )( answer )\n\t};\n\t[ pass( message ) ] {\n\t\tsendMessage@Student( \"You passed!\" )\n\t}\n\t[ fail( message ) ] {\n\t\tsendMessage@Student( \"You failed!\" )\n\t}\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Jolie/examiner.ol",
    "content": "include \"common.iol\"\ninclude \"ui/swing_ui.iol\"\ninclude \"console.iol\"\n\noutputPort Exam {\nLocation: Location_Exam\nProtocol: sodep\nInterfaces: ExamInterface\n}\n\nmain\n{\n\tquestion.studentName = \"John\";\n\tquestion.examName = \"SPLG\";\n\tquestion.question = \"Random question\";\n\tmakeQuestion@Exam( question )( answer );\n\tshowYesNoQuestionDialog@SwingUI( \"Do you want to accept answer \" + answer + \" ?\" )( decision );\n\n\tmessage.studentName = \"John\";\n\tmessage.examName = \"SPLG\";\n\tif ( decision == 0 ) {\n\t\tpass@Exam( message )\n\t} else {\n\t\tfail@Exam( message )\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Jolie/hanoi.ol",
    "content": "// https://github.com/jolie/website/blob/master/docs/documentation/locations/code/local.ol\n\ninclude \"runtime.iol\"\ninclude \"string_utils.iol\"\n\ntype HanoiRequest: void{\n  .src: string\n  .aux: string\n  .dst: string\n  .n: int\n  .sid?: string\n}\n\ntype HanoiReponse: void {\n  .move?: string\n}\n\ninterface LocalOperations{\n  RequestResponse:\n    hanoiSolver( HanoiRequest )( HanoiReponse )\n}\n\ninterface ExternalOperations{\n  RequestResponse:\n    hanoi( HanoiRequest )( string )\n}\n\noutputPort Self{\n  Interfaces: LocalOperations\n}\n\ninputPort Self {\n  Location: \"local\"\n  Interfaces: LocalOperations\n}\n\ninputPort PowerService {\n  Location: \"socket://localhost:8000\"\n  Protocol: http{\n    .format = \"html\"\n  }\n  Interfaces: ExternalOperations\n}\n\nexecution { concurrent }\n\ninit\n{\n  getLocalLocation@Runtime()( Self.location )\n}\n\nmain\n{\n  [ hanoi( request )( response ){\n    getRandomUUID@StringUtils()(request.sid);\n    hanoiSolver@Self( request )( subRes );\n    response = subRes.move\n  }]{ nullProcess }\n\n  [ hanoiSolver( request )( response ){\n    if ( request.n > 0 ){\n      subReq.n = request.n;\n      subReq.n--;\n      with( request ){\n        subReq.aux = .dst;\n        subReq.dst = .aux;\n        subReq.src = .src;\n        subReq.sid = .sid\n      };\n      hanoiSolver@Self( subReq )( response );\n      response.move +=  \"<br>\" + \n                ++global.counters.(request.sid) + \n                \") Move from \" + request.src +\n                \" to \" + request.dst + \";\";\n      with ( request ){\n        subReq.src = .aux;\n        subReq.aux = .src;\n        subReq.dst = .dst\n      };\n      hanoiSolver@Self( subReq )( subRes );\n      response.move += subRes.move\n    }\n  }]{ nullProcess }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Jolie/student.ol",
    "content": "include \"common.iol\"\ninclude \"ui/swing_ui.iol\"\ninclude \"console.iol\"\n\noutputPort Exam {\nLocation: Location_Exam\nProtocol: sodep\nInterfaces: ExamInterface\n}\n\ninputPort StudentInput {\nLocation: \"socket://localhost:8001/\"\nProtocol: sodep\nInterfaces: StudentInterface\n}\n\nmain\n{\n\trequest.studentName = \"John\";\n\trequest.examName = \"SPLG\";\n\trequest.student.location = \"socket://localhost:8001/\";\n\trequest.student.protocol = \"sodep\";\n\tstartExam@Exam( request );\n\tmakeQuestion( question )( answer ) {\n\t\tshowYesNoQuestionDialog@SwingUI( question.question )( answer )\n\t};\n\tsendMessage( message );\n\tprintln@Console( message )()\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Julia/julia",
    "content": "#!/usr/bin/env julia\n\n# From https://github.com/JoshCheek/language-sampler-for-fullpath/blob/b766dcdbd249ec63516f491390a75315e78cba95/julia/fullpath\nhelp_screen = \"\"\"\nusage: fullpath *[relative-paths] [-c]\n\n  Prints the fullpath of the paths\n  If no paths are given as args, it will read them from stdin\n\n  If there is only one path, the trailing newline is omitted\n\n  The -c flag will copy the results into your pasteboard\n\"\"\"\n\nhelp  = false\ncopy  = false\ndir   = pwd()\npaths = []\n\nfor arg = ARGS\n  if arg == \"-h\" || arg == \"--help\"\n    help = true\n  elseif arg == \"-c\" || arg == \"--copy\"\n    copy = true\n  elseif arg != \"\"\n    push!(paths, arg)\n  end\nend\n\nif help\n  print(help_screen)\n  exit()\nend\n\nfunction notempty(string)\n  return !isempty(string)\nend\n\nif length(paths) == 0\n  paths = filter(notempty, map(chomp, readlines()))\nend\n\nfunction print_paths(stream, paths)\n  if length(paths) == 1\n    path = paths[1]\n    print(stream, \"$dir/$path\")\n  else\n    for path = paths\n      println(stream, \"$dir/$path\")\n    end\n  end\nend\n\nif copy\n  read, write, process = readandwrite(`pbcopy`)\n  print_paths(write, paths)\n  close(write)\nend\n\nprint_paths(STDOUT, paths)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Julia/stockcorr.jl",
    "content": "## Test case from Issue #445\n\n#STOCKCORR - The original, unoptimised code that simulates two correlated assets\nfunction stockcorr()\n\n    ## Correlated asset information\n    CurrentPrice = [78. 102.]     # Initial Prices of the two stocks\n    Corr = [1. 0.4; 0.4 1.]       # Correlation Matrix\n    T = 500                       # Number of days to simulate = 2years = 500days\n    n = 100000                    # Number of simulations\n    dt = 1/250                    # Time step (1year = 250days)\n    Div=[0.01 0.01]               # Dividend\n    Vol=[0.2 0.3]                 # Volatility\n\n    ## Market Information\n    r = 0.03                      # Risk-free rate\n\n    ## Define storages\n    SimulPriceA = zeros(T,n)      # Simulated Price of Asset A\n    SimulPriceA[1,:] = CurrentPrice[1]\n    SimulPriceB = zeros(T,n)      # Simulated Price of Asset B\n    SimulPriceB[1,:] = CurrentPrice[2]\n\n    ## Generating the paths of stock prices by Geometric Brownian Motion\n    UpperTriangle=chol(Corr)      # UpperTriangle Matrix by Cholesky decomposition\n\n    for i = 1:n\n       Wiener = randn(T-1,2)\n       CorrWiener = Wiener*UpperTriangle\n       for j = 2:T\n          SimulPriceA[j,i] = SimulPriceA[j-1,i]*exp((r-Div[1]-Vol[1]^2/2)*dt+Vol[1]*sqrt(dt)*CorrWiener[j-1,1])\n          SimulPriceB[j,i] = SimulPriceB[j-1,i]*exp((r-Div[2]-Vol[2]^2/2)*dt+Vol[2]*sqrt(dt)*CorrWiener[j-1,2])\n       end\n    end\n\n    return (SimulPriceA, SimulPriceB)\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/KRL/helloworld.krl",
    "content": "ruleset sample {\n  meta {\n    name \"Hello World\"\n    description <<\nHello world\n>>\n    author \"Phil Windley\"\n  }\n\n  // just one rule\n  rule hello {\n    select when web pageview\n    notify(\"Hello world!\", \"Just a note to say hello\");\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/C_Disc_D3_P2.5.kicad_mod",
    "content": "(module footprints:C_Disc_D3_P2.5 (layer F.Cu) (tedit 0)\n  (descr \"Capacitor 3mm Disc, Pitch 2.5mm\")\n  (tags Capacitor)\n  (fp_text reference C1 (at 1.25 -2.5) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value C_100nF (at 1.25 2.5) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -0.9 -1.5) (end 3.4 -1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 3.4 -1.5) (end 3.4 1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 3.4 1.5) (end -0.9 1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -0.9 1.5) (end -0.9 -1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -0.25 -1.25) (end 2.75 -1.25) (layer F.SilkS) (width 0.15))\n  (fp_line (start 2.75 1.25) (end -0.25 1.25) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole rect (at 0 0) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole circle (at 2.5 0) (size 1.3 1.3) (drill 0.8001) (layers *.Cu *.Mask F.SilkS))\n  (model Capacitors_ThroughHole.3dshapes/C_Disc_D3_P2.5.wrl\n    (at (xyz 0.0492126 0 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 0))\n  )\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/Conn_Poncho_SinBorde.kicad_mod",
    "content": "(module Conn_Poncho_SinBorde (layer F.Cu) (tedit 560F0DC0)\n  (tags \"CONN Poncho\")\n  (fp_text reference XA? (at -0.254 -3.175) (layer F.SilkS)\n    (effects (font (size 0.8 0.8) (thickness 0.12)))\n  )\n  (fp_text value Conn_Poncho_SinBorde (at -1.905 51.181) (layer F.SilkS) hide\n    (effects (font (size 1.016 1.016) (thickness 0.2032)))\n  )\n  (fp_text user GPIO8 (at -64.516 48.26) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GPIO7 (at -64.516 45.72) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GPIO5 (at -64.516 43.18) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GPIO3 (at -64.516 40.64) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GPIO1 (at -64.516 38.1) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD1 (at -65.024 35.56) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD2 (at -65.024 33.02) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD3 (at -65.024 30.48) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD_RS (at -64.008 27.94) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD4 (at -65.024 25.4) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user SPI_SCK (at -63.754 22.86) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user SPI_MISO (at -63.5 20.32) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user TXD1 (at -65.024 17.78) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user TXD0 (at -65.024 15.24) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user MDIO (at -65.024 12.7) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CRS_DV (at -64.008 10.16) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user MDC (at -65.278 7.62) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user TX_EN (at -64.77 5.08) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user RXD1 (at -65.024 2.54) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user +5V (at -65.532 0) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 48.006) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 45.72) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GPIO6 (at -74.93 43.18) (layer F.SilkS)\n    (effects (font (size 1 0.9) (thickness 0.2)))\n  )\n  (fp_text user GPIO4 (at -74.93 40.64) (layer F.SilkS)\n    (effects (font (size 1 0.9) (thickness 0.2)))\n  )\n  (fp_text user GPIO2 (at -74.93 38.1) (layer F.SilkS)\n    (effects (font (size 1 0.9) (thickness 0.2)))\n  )\n  (fp_text user GPIO0 (at -74.93 35.56) (layer F.SilkS)\n    (effects (font (size 1 0.9) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 33.02) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 30.48) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD_EN (at -74.676 27.686) (layer F.SilkS)\n    (effects (font (size 1 0.7) (thickness 0.17)))\n  )\n  (fp_text user SPI_MOSI (at -74.93 25.146) (layer F.SilkS)\n    (effects (font (size 1 0.7) (thickness 0.17)))\n  )\n  (fp_text user GND (at -74.168 22.86) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 20.32) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user REF_CLK (at -74.93 17.78) (layer F.SilkS)\n    (effects (font (size 0.9 0.7) (thickness 0.175)))\n  )\n  (fp_text user GND (at -74.168 15.24) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 12.7) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 7.62) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user RXD0 (at -74.676 10.16) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 5.08) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 2.54) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user +3.3V (at -74.93 0) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 48.26) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 45.72) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_F1 (at 5.588 43.18) (layer F.SilkS)\n    (effects (font (size 0.9 0.9) (thickness 0.18)))\n  )\n  (fp_text user T_C2 (at 5.588 40.64) (layer F.SilkS)\n    (effects (font (size 0.9 0.9) (thickness 0.18)))\n  )\n  (fp_text user GND (at 5.588 38.1) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.334 35.56) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 33.02) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 30.48) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 27.94) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 25.4) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 22.86) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GNDA (at 5.588 20.32) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user GNDA (at 5.588 17.78) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user GNDA (at 5.588 15.24) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user GNDA (at 5.588 12.7) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user GNDA (at 5.588 10.16) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user GNDA (at 5.588 7.62) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user WAKEUP (at 5.588 5.334) (layer F.SilkS)\n    (effects (font (size 1 0.5) (thickness 0.125)))\n  )\n  (fp_text user GND (at 5.588 3.048) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user +5V (at 5.588 0) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_COL0 (at -4.064 48.26) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_FIL2 (at -3.81 45.72) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_FIL3 (at -3.81 43.18) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_FIL0 (at -3.81 40.64) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_COL1 (at -4.064 38.1) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CAN_TD (at -4.318 35.56) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CAN_RD (at -4.318 33.02) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user 232_TX (at -4.318 30.48) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user 232_RX (at -4.318 27.94) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user I2C_SCL (at -4.572 25.4) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user I2C_SDA (at -4.572 22.86) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user VDDA (at -3.302 20.32) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user DAC (at -3.048 17.78) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CH1 (at -3.048 15.24) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CH2 (at -3.048 12.7) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CH3 (at -3.048 10.16) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GNDA (at -3.556 7.62) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user ISP (at -2.794 5.08) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user RESET (at -3.81 2.54) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CIAA-P2 (at -69.85 -2.032) (layer F.SilkS)\n    (effects (font (size 0.8 0.8) (thickness 0.12)))\n  )\n  (fp_text user CIAA-P1 (at 1.27 -2.032) (layer F.SilkS)\n    (effects (font (size 0.8 0.8) (thickness 0.12)))\n  )\n  (fp_text user +3.3V (at -3.81 0) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_line (start -72.39 0) (end -72.39 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start -72.39 -1.27) (end -67.31 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start -67.31 -1.27) (end -67.31 49.53) (layer F.SilkS) (width 0.15))\n  (fp_line (start -67.31 49.53) (end -72.39 49.53) (layer F.SilkS) (width 0.15))\n  (fp_line (start -72.39 49.53) (end -72.39 0) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.27 49.53) (end -1.27 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 49.53) (end 3.81 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 49.53) (end -1.27 49.53) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 -1.27) (end -1.27 -1.27) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole rect (at 0 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole oval (at 2.54 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 11 thru_hole oval (at 0 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 4 thru_hole oval (at 2.54 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 13 thru_hole oval (at 0 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 6 thru_hole oval (at 2.54 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 15 thru_hole oval (at 0 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 8 thru_hole oval (at 2.54 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 17 thru_hole oval (at 0 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 10 thru_hole oval (at 2.54 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 19 thru_hole oval (at 0 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 12 thru_hole oval (at 2.54 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 21 thru_hole oval (at 0 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 14 thru_hole oval (at 2.54 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 23 thru_hole oval (at 0 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 16 thru_hole oval (at 2.54 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 25 thru_hole oval (at 0 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 18 thru_hole oval (at 2.54 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 27 thru_hole oval (at 0 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 20 thru_hole oval (at 2.54 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 29 thru_hole oval (at 0 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 22 thru_hole oval (at 2.54 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 31 thru_hole oval (at 0 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 24 thru_hole oval (at 2.54 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 26 thru_hole oval (at 2.54 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 33 thru_hole oval (at 0 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 28 thru_hole oval (at 2.54 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 32 thru_hole oval (at 2.54 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 34 thru_hole oval (at 2.54 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 36 thru_hole oval (at 2.54 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 38 thru_hole oval (at 2.54 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 35 thru_hole oval (at 0 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 37 thru_hole oval (at 0 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 3 thru_hole oval (at 0 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 5 thru_hole oval (at 0 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 7 thru_hole oval (at 0 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 9 thru_hole oval (at 0 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 39 thru_hole oval (at 0 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 40 thru_hole oval (at 2.54 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 30 thru_hole oval (at 2.54 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 41 thru_hole rect (at -71.12 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 42 thru_hole oval (at -68.58 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 43 thru_hole oval (at -71.12 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 44 thru_hole oval (at -68.58 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 45 thru_hole oval (at -71.12 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 46 thru_hole oval (at -68.58 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 47 thru_hole oval (at -71.12 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 48 thru_hole oval (at -68.58 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 49 thru_hole oval (at -71.12 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 50 thru_hole oval (at -68.58 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 51 thru_hole oval (at -71.12 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 52 thru_hole oval (at -68.58 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 53 thru_hole oval (at -71.12 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 54 thru_hole oval (at -68.58 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 55 thru_hole oval (at -71.12 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 56 thru_hole oval (at -68.58 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 57 thru_hole oval (at -71.12 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 58 thru_hole oval (at -68.58 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 59 thru_hole oval (at -71.12 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 60 thru_hole oval (at -68.58 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 61 thru_hole oval (at -71.12 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 62 thru_hole oval (at -68.58 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 63 thru_hole oval (at -71.12 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 64 thru_hole oval (at -68.58 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 65 thru_hole oval (at -71.12 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 66 thru_hole oval (at -68.58 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 67 thru_hole oval (at -71.12 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 68 thru_hole oval (at -68.58 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 69 thru_hole oval (at -71.12 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 70 thru_hole oval (at -68.58 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 71 thru_hole oval (at -71.12 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 72 thru_hole oval (at -68.58 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 73 thru_hole oval (at -71.12 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 74 thru_hole oval (at -68.58 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 75 thru_hole oval (at -71.12 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 76 thru_hole oval (at -68.58 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 77 thru_hole oval (at -71.12 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 78 thru_hole oval (at -68.58 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 79 thru_hole oval (at -71.12 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 80 thru_hole oval (at -68.58 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/Fiducial_1mm.kicad_mod",
    "content": "(module footprints:Fiducial_1mm (layer F.Cu) (tedit 573E1507)\n  (clearance 1.524)\n  (fp_text reference F3 (at 0.02 -0.9) (layer F.SilkS) hide\n    (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n  )\n  (fp_text value FIDUCIAL (at 0 0.99) (layer F.SilkS) hide\n    (effects (font (size 0.254 0.254) (thickness 0.00254)))\n  )\n  (pad 1 smd circle (at 0 0) (size 1 1) (layers F.Cu F.Mask)\n    (solder_mask_margin 1.5))\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/LED-5MM.kicad_mod",
    "content": "(module footprints:LED-5MM (layer F.Cu) (tedit 5570F7EA)\n  (descr \"LED 5mm round vertical\")\n  (tags \"LED 5mm round vertical\")\n  (fp_text reference D4 (at 1.524 4.064) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value LED (at 1.524 -3.937) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -1.5 -1.55) (end -1.5 1.55) (layer F.CrtYd) (width 0.05))\n  (fp_arc (start 1.3 0) (end -1.5 1.55) (angle -302) (layer F.CrtYd) (width 0.05))\n  (fp_arc (start 1.27 0) (end -1.23 -1.5) (angle 297.5) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.23 1.5) (end -1.23 -1.5) (layer F.SilkS) (width 0.15))\n  (fp_circle (center 1.27 0) (end 0.97 -2.5) (layer F.SilkS) (width 0.15))\n  (fp_text user K (at -1.905 1.905) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (pad 1 thru_hole rect (at 0 0 90) (size 2 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole circle (at 2.54 0) (size 1.9 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS))\n  (model LEDs.3dshapes/LED-5MM.wrl\n    (at (xyz 0.05 0 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 90))\n  )\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/Logo_OSHWA.kicad_mod",
    "content": "(module footprints:Logo_OSHWA (layer F.Cu) (tedit 560D8B85)\n  (fp_text reference G101 (at 0 4.2418) (layer F.SilkS) hide\n    (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n  )\n  (fp_text value Logo_OSHWA (at 0 -4.2418) (layer F.SilkS) hide\n    (effects (font (size 0.36322 0.36322) (thickness 0.07112)))\n  )\n  (fp_poly (pts (xy -2.42316 3.59156) (xy -2.38252 3.57124) (xy -2.28854 3.51282) (xy -2.15392 3.42392)\n    (xy -1.99644 3.31978) (xy -1.83896 3.21056) (xy -1.70942 3.1242) (xy -1.61798 3.06578)\n    (xy -1.57988 3.04546) (xy -1.55956 3.05054) (xy -1.48336 3.08864) (xy -1.37414 3.14452)\n    (xy -1.31064 3.17754) (xy -1.21158 3.22072) (xy -1.16078 3.23088) (xy -1.15316 3.21564)\n    (xy -1.11506 3.13944) (xy -1.05918 3.00736) (xy -0.98298 2.83464) (xy -0.89662 2.63144)\n    (xy -0.80264 2.413) (xy -0.7112 2.18948) (xy -0.6223 1.97612) (xy -0.54356 1.78562)\n    (xy -0.48006 1.63068) (xy -0.43942 1.52146) (xy -0.42418 1.47574) (xy -0.42926 1.46558)\n    (xy -0.48006 1.41732) (xy -0.56642 1.35128) (xy -0.75692 1.19634) (xy -0.94234 0.96266)\n    (xy -1.05664 0.6985) (xy -1.09474 0.40386) (xy -1.06172 0.13208) (xy -0.95504 -0.12954)\n    (xy -0.77216 -0.36576) (xy -0.55118 -0.54102) (xy -0.2921 -0.65278) (xy 0 -0.68834)\n    (xy 0.2794 -0.65786) (xy 0.5461 -0.55118) (xy 0.78232 -0.37084) (xy 0.88138 -0.25654)\n    (xy 1.01854 -0.01778) (xy 1.09728 0.23876) (xy 1.1049 0.30226) (xy 1.09474 0.5842)\n    (xy 1.01092 0.85344) (xy 0.8636 1.09474) (xy 0.65786 1.29032) (xy 0.62992 1.31064)\n    (xy 0.53594 1.38176) (xy 0.47244 1.43002) (xy 0.42164 1.47066) (xy 0.77978 2.33172)\n    (xy 0.83566 2.46888) (xy 0.93472 2.7051) (xy 1.02108 2.9083) (xy 1.08966 3.06832)\n    (xy 1.13792 3.17754) (xy 1.15824 3.22072) (xy 1.16078 3.22326) (xy 1.19126 3.22834)\n    (xy 1.2573 3.20294) (xy 1.37668 3.14452) (xy 1.45796 3.10388) (xy 1.5494 3.0607)\n    (xy 1.59004 3.04546) (xy 1.6256 3.06324) (xy 1.71196 3.12166) (xy 1.8415 3.20548)\n    (xy 1.9939 3.30962) (xy 2.14122 3.41122) (xy 2.27584 3.50012) (xy 2.3749 3.56108)\n    (xy 2.42316 3.58902) (xy 2.43078 3.58902) (xy 2.47142 3.56362) (xy 2.55016 3.50012)\n    (xy 2.667 3.38836) (xy 2.8321 3.2258) (xy 2.8575 3.2004) (xy 2.99466 3.0607)\n    (xy 3.10642 2.94386) (xy 3.18008 2.86258) (xy 3.20548 2.82448) (xy 3.20548 2.82448)\n    (xy 3.18262 2.77622) (xy 3.11912 2.6797) (xy 3.03022 2.54254) (xy 2.921 2.38252)\n    (xy 2.63652 1.9685) (xy 2.794 1.57734) (xy 2.84226 1.45796) (xy 2.90322 1.31318)\n    (xy 2.9464 1.20904) (xy 2.9718 1.16332) (xy 3.01244 1.14808) (xy 3.12166 1.12268)\n    (xy 3.2766 1.08966) (xy 3.45948 1.05664) (xy 3.63728 1.02362) (xy 3.7973 0.99314)\n    (xy 3.9116 0.97028) (xy 3.9624 0.96012) (xy 3.9751 0.9525) (xy 3.98526 0.9271)\n    (xy 3.99288 0.87376) (xy 3.99542 0.77724) (xy 3.99796 0.62484) (xy 3.99796 0.40386)\n    (xy 3.99796 0.381) (xy 3.99542 0.17018) (xy 3.99288 0.00254) (xy 3.9878 -0.10668)\n    (xy 3.98018 -0.14986) (xy 3.98018 -0.14986) (xy 3.92938 -0.16256) (xy 3.81762 -0.18542)\n    (xy 3.6576 -0.21844) (xy 3.4671 -0.254) (xy 3.45694 -0.25654) (xy 3.26644 -0.2921)\n    (xy 3.10896 -0.32512) (xy 2.9972 -0.35052) (xy 2.95148 -0.36576) (xy 2.94132 -0.37846)\n    (xy 2.90322 -0.45212) (xy 2.84734 -0.56896) (xy 2.78638 -0.71374) (xy 2.72288 -0.86106)\n    (xy 2.66954 -0.99568) (xy 2.63398 -1.09474) (xy 2.62382 -1.14046) (xy 2.62382 -1.14046)\n    (xy 2.65176 -1.18618) (xy 2.7178 -1.28524) (xy 2.80924 -1.41986) (xy 2.921 -1.58242)\n    (xy 2.92862 -1.59512) (xy 3.03784 -1.75514) (xy 3.12674 -1.88976) (xy 3.18516 -1.98628)\n    (xy 3.20548 -2.02946) (xy 3.20548 -2.032) (xy 3.16992 -2.08026) (xy 3.08864 -2.16916)\n    (xy 2.9718 -2.29108) (xy 2.8321 -2.43332) (xy 2.78638 -2.4765) (xy 2.63144 -2.6289)\n    (xy 2.52476 -2.72796) (xy 2.45618 -2.7813) (xy 2.42316 -2.794) (xy 2.42316 -2.79146)\n    (xy 2.3749 -2.76352) (xy 2.2733 -2.69748) (xy 2.13614 -2.6035) (xy 1.97358 -2.49428)\n    (xy 1.96342 -2.48666) (xy 1.8034 -2.37744) (xy 1.67132 -2.28854) (xy 1.5748 -2.22504)\n    (xy 1.53416 -2.19964) (xy 1.52654 -2.19964) (xy 1.46304 -2.21996) (xy 1.34874 -2.25806)\n    (xy 1.20904 -2.31394) (xy 1.06172 -2.37236) (xy 0.9271 -2.42824) (xy 0.8255 -2.4765)\n    (xy 0.77724 -2.5019) (xy 0.77724 -2.50444) (xy 0.75946 -2.56286) (xy 0.73152 -2.68224)\n    (xy 0.6985 -2.84734) (xy 0.6604 -3.04292) (xy 0.65532 -3.0734) (xy 0.61976 -3.2639)\n    (xy 0.58928 -3.42138) (xy 0.56642 -3.5306) (xy 0.55372 -3.57632) (xy 0.52832 -3.5814)\n    (xy 0.43434 -3.58902) (xy 0.2921 -3.59156) (xy 0.11938 -3.5941) (xy -0.06096 -3.59156)\n    (xy -0.23622 -3.58902) (xy -0.38862 -3.58394) (xy -0.4953 -3.57632) (xy -0.54102 -3.56616)\n    (xy -0.54356 -3.56362) (xy -0.5588 -3.5052) (xy -0.5842 -3.38582) (xy -0.61976 -3.22072)\n    (xy -0.65786 -3.0226) (xy -0.66294 -2.98958) (xy -0.6985 -2.79908) (xy -0.73152 -2.64414)\n    (xy -0.75438 -2.53492) (xy -0.76708 -2.49428) (xy -0.78232 -2.48412) (xy -0.86106 -2.4511)\n    (xy -0.98806 -2.39776) (xy -1.14808 -2.33426) (xy -1.51384 -2.1844) (xy -1.96088 -2.49428)\n    (xy -2.00406 -2.52222) (xy -2.16408 -2.63144) (xy -2.2987 -2.72034) (xy -2.39014 -2.77876)\n    (xy -2.42824 -2.80162) (xy -2.43078 -2.79908) (xy -2.4765 -2.76098) (xy -2.5654 -2.67716)\n    (xy -2.68732 -2.55778) (xy -2.82702 -2.41808) (xy -2.93116 -2.31394) (xy -3.05562 -2.18694)\n    (xy -3.13436 -2.10312) (xy -3.17754 -2.04724) (xy -3.19278 -2.01422) (xy -3.1877 -1.9939)\n    (xy -3.15976 -1.94818) (xy -3.09372 -1.84912) (xy -3.00228 -1.71196) (xy -2.89306 -1.55448)\n    (xy -2.80162 -1.41986) (xy -2.7051 -1.27) (xy -2.6416 -1.16332) (xy -2.61874 -1.10998)\n    (xy -2.62382 -1.08712) (xy -2.65684 -1.00076) (xy -2.71018 -0.86614) (xy -2.77622 -0.70866)\n    (xy -2.9337 -0.35306) (xy -3.16738 -0.30988) (xy -3.30708 -0.28194) (xy -3.5052 -0.24384)\n    (xy -3.69316 -0.20828) (xy -3.9878 -0.14986) (xy -3.99796 0.93218) (xy -3.95224 0.9525)\n    (xy -3.90906 0.9652) (xy -3.79984 0.98806) (xy -3.6449 1.01854) (xy -3.45948 1.0541)\n    (xy -3.30454 1.08458) (xy -3.14452 1.11252) (xy -3.03276 1.13538) (xy -2.98196 1.14554)\n    (xy -2.96926 1.16332) (xy -2.92862 1.23952) (xy -2.87274 1.36144) (xy -2.81178 1.50876)\n    (xy -2.74828 1.65862) (xy -2.6924 1.79832) (xy -2.65176 1.905) (xy -2.63906 1.96088)\n    (xy -2.65938 2.00406) (xy -2.72034 2.0955) (xy -2.8067 2.22758) (xy -2.91338 2.38506)\n    (xy -3.0226 2.54254) (xy -3.1115 2.67716) (xy -3.175 2.77368) (xy -3.2004 2.81686)\n    (xy -3.1877 2.84734) (xy -3.12674 2.92354) (xy -3.00736 3.04546) (xy -2.8321 3.22072)\n    (xy -2.80162 3.24866) (xy -2.66192 3.38328) (xy -2.54254 3.4925) (xy -2.46126 3.56616)\n    (xy -2.42316 3.59156)) (layer F.SilkS) (width 0.00254))\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/Logo_Poncho.kicad_mod",
    "content": "(module footprints:Logo_Poncho (layer F.Cu) (tedit 560DAFF4)\n  (fp_text reference G*** (at 0.127 5.588) (layer F.SilkS) hide\n    (effects (font (thickness 0.3)))\n  )\n  (fp_text value LOGO (at 0.762 7.493) (layer F.SilkS) hide\n    (effects (font (thickness 0.3)))\n  )\n  (fp_poly (pts (xy 4.535714 -0.627021) (xy 4.498746 -0.420109) (xy 4.405012 -0.1352) (xy 4.280272 0.162897)\n    (xy 4.150281 0.409374) (xy 4.123376 0.447413) (xy 4.123376 -0.123701) (xy 4.058326 -0.436938)\n    (xy 3.869112 -0.644378) (xy 3.564639 -0.737671) (xy 3.463636 -0.742208) (xy 3.129516 -0.681223)\n    (xy 2.908248 -0.503835) (xy 2.808734 -0.218392) (xy 2.803896 -0.123701) (xy 2.868946 0.189536)\n    (xy 3.058159 0.396975) (xy 3.362633 0.490269) (xy 3.463636 0.494805) (xy 3.797606 0.436492)\n    (xy 3.958441 0.32987) (xy 4.092315 0.09203) (xy 4.123376 -0.123701) (xy 4.123376 0.447413)\n    (xy 4.089856 0.494805) (xy 4.013749 0.621925) (xy 3.89522 0.861365) (xy 3.753792 1.172585)\n    (xy 3.672876 1.360714) (xy 3.421635 1.929272) (xy 3.149718 2.496808) (xy 2.869494 3.041693)\n    (xy 2.593334 3.542296) (xy 2.556493 3.603955) (xy 2.556493 -0.123701) (xy 2.552598 -0.439936)\n    (xy 2.534834 -0.625484) (xy 2.494089 -0.714524) (xy 2.421247 -0.741238) (xy 2.391558 -0.742208)\n    (xy 2.270831 -0.703329) (xy 2.228325 -0.558669) (xy 2.226623 -0.494805) (xy 2.206189 -0.31957)\n    (xy 2.109798 -0.254982) (xy 1.97922 -0.247402) (xy 1.803985 -0.267837) (xy 1.739397 -0.364227)\n    (xy 1.731818 -0.494805) (xy 1.705898 -0.675896) (xy 1.609459 -0.739655) (xy 1.566883 -0.742208)\n    (xy 1.482553 -0.727599) (xy 1.433074 -0.660988) (xy 1.40933 -0.508193) (xy 1.402206 -0.235036)\n    (xy 1.401948 -0.123701) (xy 1.405843 0.192533) (xy 1.423606 0.378081) (xy 1.464351 0.467122)\n    (xy 1.537193 0.493835) (xy 1.566883 0.494805) (xy 1.680559 0.462518) (xy 1.726426 0.336472)\n    (xy 1.731818 0.206169) (xy 1.745609 0.012245) (xy 1.815564 -0.067294) (xy 1.97922 -0.082467)\n    (xy 2.145441 -0.066377) (xy 2.213617 0.015237) (xy 2.226623 0.206169) (xy 2.245073 0.405103)\n    (xy 2.317099 0.48537) (xy 2.391558 0.494805) (xy 2.475887 0.480197) (xy 2.525367 0.413586)\n    (xy 2.549111 0.260791) (xy 2.556234 -0.012366) (xy 2.556493 -0.123701) (xy 2.556493 3.603955)\n    (xy 2.33361 3.976986) (xy 2.102692 4.324132) (xy 1.912952 4.562103) (xy 1.781691 4.667512)\n    (xy 1.660102 4.654002) (xy 1.438445 4.580892) (xy 1.163465 4.463746) (xy 1.154545 4.459546)\n    (xy 1.154545 0.36149) (xy 1.110706 0.268405) (xy 0.956623 0.266159) (xy 0.938776 0.269422)\n    (xy 0.717011 0.243945) (xy 0.523128 0.11531) (xy 0.417755 -0.07121) (xy 0.412337 -0.123701)\n    (xy 0.484303 -0.318602) (xy 0.658393 -0.472009) (xy 0.871896 -0.536691) (xy 0.949632 -0.528355)\n    (xy 1.105982 -0.515384) (xy 1.154279 -0.597467) (xy 1.154545 -0.609566) (xy 1.114247 -0.69528)\n    (xy 0.970303 -0.735064) (xy 0.783441 -0.742208) (xy 0.429195 -0.687347) (xy 0.198088 -0.523118)\n    (xy 0.090717 -0.250044) (xy 0.082467 -0.123701) (xy 0.144642 0.188869) (xy 0.330769 0.392787)\n    (xy 0.640252 0.487526) (xy 0.783441 0.494805) (xy 1.022962 0.480515) (xy 1.134243 0.429291)\n    (xy 1.154545 0.36149) (xy 1.154545 4.459546) (xy 1.148315 4.456614) (xy 0.592041 4.256938)\n    (xy 0.061238 4.207886) (xy -0.164935 4.249843) (xy -0.164935 -0.123701) (xy -0.168831 -0.439936)\n    (xy -0.186594 -0.625484) (xy -0.227339 -0.714524) (xy -0.300181 -0.741238) (xy -0.329871 -0.742208)\n    (xy -0.435349 -0.716231) (xy -0.483875 -0.609894) (xy -0.495586 -0.391721) (xy -0.496366 -0.041234)\n    (xy -0.706429 -0.391721) (xy -0.874005 -0.625569) (xy -1.029731 -0.729733) (xy -1.117986 -0.742208)\n    (xy -1.220495 -0.733937) (xy -1.280586 -0.685976) (xy -1.309571 -0.563603) (xy -1.318762 -0.332094)\n    (xy -1.319481 -0.123701) (xy -1.315585 0.192533) (xy -1.297822 0.378081) (xy -1.257077 0.467122)\n    (xy -1.184235 0.493835) (xy -1.154546 0.494805) (xy -1.049068 0.468829) (xy -1.000541 0.362492)\n    (xy -0.988831 0.144318) (xy -0.98805 -0.206169) (xy -0.777988 0.144318) (xy -0.610412 0.378167)\n    (xy -0.454685 0.48233) (xy -0.36643 0.494805) (xy -0.263922 0.486535) (xy -0.203831 0.438574)\n    (xy -0.174846 0.3162) (xy -0.165655 0.084692) (xy -0.164935 -0.123701) (xy -0.164935 4.249843)\n    (xy -0.48241 4.308738) (xy -0.783442 4.420415) (xy -1.059466 4.535832) (xy -1.285963 4.626797)\n    (xy -1.401948 4.669513) (xy -1.518876 4.625399) (xy -1.566884 4.584033) (xy -1.566884 -0.123701)\n    (xy -1.631934 -0.436938) (xy -1.821147 -0.644378) (xy -2.12562 -0.737671) (xy -2.226624 -0.742208)\n    (xy -2.560743 -0.681223) (xy -2.782012 -0.503835) (xy -2.881525 -0.218392) (xy -2.886364 -0.123701)\n    (xy -2.821314 0.189536) (xy -2.6321 0.396975) (xy -2.327627 0.490269) (xy -2.226624 0.494805)\n    (xy -1.892653 0.436492) (xy -1.731819 0.32987) (xy -1.597945 0.09203) (xy -1.566884 -0.123701)\n    (xy -1.566884 4.584033) (xy -1.717176 4.454536) (xy -1.98582 4.166799) (xy -2.061689 4.078924)\n    (xy -2.369861 3.70727) (xy -2.632201 3.363429) (xy -2.870341 3.013116) (xy -2.968832 2.849614)\n    (xy -2.968832 -0.32987) (xy -3.007485 -0.54598) (xy -3.140146 -0.67528) (xy -3.391869 -0.734039)\n    (xy -3.603832 -0.742208) (xy -4.04091 -0.742208) (xy -4.04091 -0.123701) (xy -4.037014 0.192533)\n    (xy -4.019251 0.378081) (xy -3.978506 0.467122) (xy -3.905664 0.493835) (xy -3.875974 0.494805)\n    (xy -3.746639 0.446485) (xy -3.711039 0.288637) (xy -3.687673 0.146227) (xy -3.584731 0.090232)\n    (xy -3.438897 0.082468) (xy -3.16065 0.034793) (xy -3.008068 -0.114765) (xy -2.968832 -0.32987)\n    (xy -2.968832 2.849614) (xy -3.105916 2.622046) (xy -3.360558 2.155935) (xy -3.6559 1.580499)\n    (xy -3.724805 1.443182) (xy -3.927446 1.040996) (xy -4.107468 0.68891) (xy -4.250627 0.414385)\n    (xy -4.342678 0.24488) (xy -4.366512 0.206169) (xy -4.479713 -0.061738) (xy -4.470402 -0.368299)\n    (xy -4.39208 -0.562072) (xy -4.211754 -0.794239) (xy -3.970771 -1.027175) (xy -3.729883 -1.205582)\n    (xy -3.628572 -1.257014) (xy -3.515586 -1.328258) (xy -3.31072 -1.481511) (xy -3.047204 -1.691308)\n    (xy -2.861153 -1.845142) (xy -2.478394 -2.151727) (xy -2.09396 -2.434151) (xy -1.735885 -2.674156)\n    (xy -1.432202 -2.853482) (xy -1.210945 -2.953871) (xy -1.135923 -2.968831) (xy -0.992755 -2.911987)\n    (xy -0.868796 -2.807085) (xy -0.798823 -2.718089) (xy -0.768465 -2.621372) (xy -0.779148 -2.476306)\n    (xy -0.832302 -2.242261) (xy -0.897248 -1.997411) (xy -1.002077 -1.614541) (xy -1.0637 -1.342913)\n    (xy -1.062894 -1.163551) (xy -0.980436 -1.05748) (xy -0.797105 -1.005726) (xy -0.493678 -0.989314)\n    (xy -0.050932 -0.989267) (xy 0.123701 -0.98961) (xy 0.616616 -0.993152) (xy 0.963601 -1.004879)\n    (xy 1.183529 -1.026446) (xy 1.295275 -1.059505) (xy 1.31948 -1.094352) (xy 1.298521 -1.22034)\n    (xy 1.243133 -1.457326) (xy 1.164548 -1.757819) (xy 1.150407 -1.809213) (xy 1.043088 -2.255847)\n    (xy 1.008894 -2.569631) (xy 1.048676 -2.765972) (xy 1.163285 -2.860279) (xy 1.208992 -2.870512)\n    (xy 1.420553 -2.83991) (xy 1.739874 -2.711189) (xy 2.149801 -2.493929) (xy 2.633175 -2.197713)\n    (xy 3.172841 -1.832122) (xy 3.525487 -1.576813) (xy 3.929546 -1.272303) (xy 4.214754 -1.04349)\n    (xy 4.398878 -0.873667) (xy 4.499689 -0.746128) (xy 4.534955 -0.644167) (xy 4.535714 -0.627021)\n    (xy 4.535714 -0.627021)) (layer F.SilkS) (width 0.1))\n  (fp_poly (pts (xy 1.023542 -3.736319) (xy 0.895402 -3.389445) (xy 0.679417 -3.11223) (xy 0.563302 -2.982356)\n    (xy 0.508034 -2.869698) (xy 0.506066 -2.720981) (xy 0.549854 -2.48293) (xy 0.574294 -2.370022)\n    (xy 0.658312 -1.973188) (xy 0.69611 -1.709422) (xy 0.675383 -1.550382) (xy 0.583822 -1.467723)\n    (xy 0.409122 -1.433104) (xy 0.16144 -1.419187) (xy -0.12355 -1.415195) (xy -0.339882 -1.428263)\n    (xy -0.43645 -1.453549) (xy -0.490308 -1.618268) (xy -0.466441 -1.923684) (xy -0.365224 -2.365222)\n    (xy -0.360015 -2.384058) (xy -0.225225 -2.868872) (xy -0.488808 -3.104404) (xy -0.714353 -3.402585)\n    (xy -0.808424 -3.746824) (xy -0.77552 -4.096523) (xy -0.620138 -4.411085) (xy -0.346777 -4.649915)\n    (xy -0.31571 -4.666738) (xy 0.033719 -4.763905) (xy 0.380075 -4.71573) (xy 0.68714 -4.538441)\n    (xy 0.918691 -4.248265) (xy 0.989692 -4.081895) (xy 1.023542 -3.736319) (xy 1.023542 -3.736319)) (layer F.SilkS) (width 0.1))\n  (fp_poly (pts (xy -3.320079 -0.321578) (xy -3.381169 -0.206169) (xy -3.537606 -0.087441) (xy -3.656944 -0.12265)\n    (xy -3.710414 -0.301007) (xy -3.711039 -0.32987) (xy -3.666881 -0.523821) (xy -3.553583 -0.57585)\n    (xy -3.399915 -0.47517) (xy -3.381169 -0.453571) (xy -3.320079 -0.321578) (xy -3.320079 -0.321578)) (layer F.SilkS) (width 0.1))\n  (fp_poly (pts (xy -1.911824 -0.1467) (xy -1.935194 -0.006732) (xy -2.006645 0.114199) (xy -2.128505 0.265484)\n    (xy -2.225472 0.329848) (xy -2.226624 0.32987) (xy -2.322643 0.267542) (xy -2.444552 0.117317)\n    (xy -2.446603 0.114199) (xy -2.537406 -0.05684) (xy -2.52656 -0.197017) (xy -2.465958 -0.318756)\n    (xy -2.343482 -0.473895) (xy -2.226624 -0.536039) (xy -2.106037 -0.47051) (xy -1.987289 -0.318756)\n    (xy -1.911824 -0.1467) (xy -1.911824 -0.1467)) (layer F.SilkS) (width 0.1))\n  (fp_poly (pts (xy 3.778435 -0.1467) (xy 3.755065 -0.006732) (xy 3.683615 0.114199) (xy 3.561755 0.265484)\n    (xy 3.464788 0.329848) (xy 3.463636 0.32987) (xy 3.367616 0.267542) (xy 3.245708 0.117317)\n    (xy 3.243657 0.114199) (xy 3.152854 -0.05684) (xy 3.163699 -0.197017) (xy 3.224301 -0.318756)\n    (xy 3.346778 -0.473895) (xy 3.463636 -0.536039) (xy 3.584223 -0.47051) (xy 3.702971 -0.318756)\n    (xy 3.778435 -0.1467) (xy 3.778435 -0.1467)) (layer F.SilkS) (width 0.1))\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/MagneticBuzzer_ProSignal_ABT-410-RC.kicad_mod",
    "content": "(module footprints:MagneticBuzzer_ProSignal_ABT-410-RC (layer F.Cu) (tedit 544E5504)\n  (descr \"Buzzer, Elektromagnetic Beeper, Summer, 1,5V-DC,\")\n  (tags \"Pro Signal, ABT-410-RC,\")\n  (fp_text reference U1 (at 3.175 -8.001) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value BUZZER (at 2.17424 8.001) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start 8.17626 -0.50038) (end 8.17626 0.50038) (layer F.SilkS) (width 0.15))\n  (fp_line (start 7.67588 0) (end 8.6741 0) (layer F.SilkS) (width 0.15))\n  (fp_circle (center 3.175 0) (end 4.17576 0) (layer F.SilkS) (width 0.15))\n  (fp_text user + (at 10.67562 0) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_circle (center 3.175 0) (end 9.37514 0) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole circle (at 0 0) (size 1.6002 1.6002) (drill 1.00076) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole circle (at 6.35 0) (size 1.6002 1.6002) (drill 1.00076) (layers *.Cu *.Mask F.SilkS))\n  (model Buzzers_Beepers.3dshapes/MagneticBuzzer_ProSignal_ABT-410-RC.wrl\n    (at (xyz 0 0 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 0))\n  )\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/Pin_Header_Straight_2x02.kicad_mod",
    "content": "(module footprints:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 0)\n  (descr \"Through hole pin header\")\n  (tags \"pin header\")\n  (fp_text reference P1 (at 0 -5.1) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value PWR_JUMPER (at 0 -3.1) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15))\n  (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole rect (at 0 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole oval (at 2.54 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 3 thru_hole oval (at 0 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 4 thru_hole oval (at 2.54 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl\n    (at (xyz 0.05 -0.05 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 90))\n  )\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/Pin_Header_Straight_2x20.kicad_mod",
    "content": "(module footprints:Pin_Header_Straight_2x20 (layer F.Cu) (tedit 0)\n  (descr \"Through hole pin header\")\n  (tags \"pin header\")\n  (fp_text reference XA2 (at 0 -5.1) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value Conn_Poncho2P_2x_20x2 (at 0 -3.1) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -1.75 -1.75) (end -1.75 50.05) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 4.3 -1.75) (end 4.3 50.05) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.75 50.05) (end 4.3 50.05) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 3.81 49.53) (end 3.81 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.27 1.27) (end -1.27 49.53) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 49.53) (end -1.27 49.53) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 -1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15))\n  (fp_line (start 1.27 -1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.55 -1.55) (end -1.55 0) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole rect (at 0 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole oval (at 2.54 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 3 thru_hole oval (at 0 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 4 thru_hole oval (at 2.54 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 5 thru_hole oval (at 0 5.08) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 6 thru_hole oval (at 2.54 5.08) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 7 thru_hole oval (at 0 7.62) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 8 thru_hole oval (at 2.54 7.62) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 9 thru_hole oval (at 0 10.16) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 10 thru_hole oval (at 2.54 10.16) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 11 thru_hole oval (at 0 12.7) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 12 thru_hole oval (at 2.54 12.7) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 13 thru_hole oval (at 0 15.24) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 14 thru_hole oval (at 2.54 15.24) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 15 thru_hole oval (at 0 17.78) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 16 thru_hole oval (at 2.54 17.78) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 17 thru_hole oval (at 0 20.32) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 18 thru_hole oval (at 2.54 20.32) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 19 thru_hole oval (at 0 22.86) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 20 thru_hole oval (at 2.54 22.86) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 21 thru_hole oval (at 0 25.4) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 22 thru_hole oval (at 2.54 25.4) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 23 thru_hole oval (at 0 27.94) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 24 thru_hole oval (at 2.54 27.94) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 25 thru_hole oval (at 0 30.48) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 26 thru_hole oval (at 2.54 30.48) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 27 thru_hole oval (at 0 33.02) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 28 thru_hole oval (at 2.54 33.02) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 29 thru_hole oval (at 0 35.56) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 30 thru_hole oval (at 2.54 35.56) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 31 thru_hole oval (at 0 38.1) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 32 thru_hole oval (at 2.54 38.1) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 33 thru_hole oval (at 0 40.64) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 34 thru_hole oval (at 2.54 40.64) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 35 thru_hole oval (at 0 43.18) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 36 thru_hole oval (at 2.54 43.18) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 37 thru_hole oval (at 0 45.72) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 38 thru_hole oval (at 2.54 45.72) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 39 thru_hole oval (at 0 48.26) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 40 thru_hole oval (at 2.54 48.26) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (model Pin_Headers.3dshapes/Pin_Header_Straight_2x20.wrl\n    (at (xyz 0.05 -0.95 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 90))\n  )\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/Resistor_Horizontal_RM7mm.kicad_mod",
    "content": "(module footprints:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 569FCF07)\n  (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n  (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n  (fp_text reference R18 (at 4.05892 -3.50012) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value 680 (at 3.81 3.81) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole circle (at 0 0) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask))\n  (pad 2 thru_hole circle (at 7.62 0) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask))\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/SW_PUSH_SMALL.kicad_mod",
    "content": "(module footprints:SW_PUSH_SMALL (layer F.Cu) (tedit 0)\n  (fp_text reference SW7 (at 0 -0.762) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value SW_PUSH (at 0 1.016) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n  (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n  (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole circle (at 3.81 -2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole circle (at 3.81 2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))\n  (pad 1 thru_hole circle (at -3.81 -2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole circle (at -3.81 2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/TO-92_Molded_Narrow.kicad_mod",
    "content": "(module footprints:TO-92_Molded_Narrow (layer F.Cu) (tedit 54F242E1)\n  (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n  (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n  (fp_text reference Q5 (at 0 -4) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value BC547 (at 0 3) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n  (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n  (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n  (pad 2 thru_hole circle (at 1.27 -1.27 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS))\n  (pad 3 thru_hole circle (at 2.54 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS))\n  (pad 1 thru_hole circle (at 0 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS))\n  (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n    (at (xyz 0.05 0 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 -90))\n  )\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/filenames/fp-lib-table",
    "content": "(fp_lib_table\n  (lib (name Air_Coils_SML_NEOSID)(type Github)(uri ${KIGITHUB}/Air_Coils_SML_NEOSID.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Buttons_Switches_SMD)(type Github)(uri ${KIGITHUB}/Buttons_Switches_SMD.pretty)(options \"\")(descr \"Buttons and switches, surface mount\"))\n  (lib (name Buttons_Switches_THT)(type Github)(uri ${KIGITHUB}/Buttons_Switches_THT.pretty)(options \"\")(descr \"Buttons and switches, through hole\"))\n  (lib (name Buzzers_Beepers)(type Github)(uri ${KIGITHUB}/Buzzers_Beepers.pretty)(options \"\")(descr \"Audio signalling devices\"))\n  (lib (name Capacitors_SMD)(type Github)(uri ${KIGITHUB}/Capacitors_SMD.pretty)(options \"\")(descr \"Capacitors, surface mount\"))\n  (lib (name Capacitors_Tantalum_SMD)(type Github)(uri ${KIGITHUB}/Capacitors_Tantalum_SMD.pretty)(options \"\")(descr \"Tantalum capacitors, surface mount\"))\n  (lib (name Capacitors_THT)(type Github)(uri ${KIGITHUB}/Capacitors_THT.pretty)(options \"\")(descr \"Capacitors, through hole\"))\n  (lib (name Choke_Axial_ThroughHole)(type Github)(uri ${KIGITHUB}/Choke_Axial_ThroughHole.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Choke_Common-Mode_Wurth)(type Github)(uri ${KIGITHUB}/Choke_Common-Mode_Wurth.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Choke_Radial_ThroughHole)(type Github)(uri ${KIGITHUB}/Choke_Radial_ThroughHole.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Choke_SMD)(type Github)(uri ${KIGITHUB}/Choke_SMD.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Choke_Toroid_ThroughHole)(type Github)(uri ${KIGITHUB}/Choke_Toroid_ThroughHole.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Connectors_Harwin)(type Github)(uri ${KIGITHUB}/Connectors_Harwin.pretty)(options \"\")(descr \"Harwin connector footprints www.harwin.com\"))\n  (lib (name Connectors_Hirose)(type Github)(uri ${KIGITHUB}/Connectors_Hirose.pretty)(options \"\")(descr \"Hirose connector footprints www.hirose.com\"))\n  (lib (name Connectors_JAE)(type Github)(uri ${KIGITHUB}/Connectors_JAE.pretty)(options \"\")(descr \"JAE connector footprints http://www.jae.com/jccom/en/connectors\"))\n  (lib (name Connectors_JST)(type Github)(uri ${KIGITHUB}/Connectors_JST.pretty)(options \"\")(descr \"JST connector footprints www.jst.com\"))\n  (lib (name Connectors_Mini-Universal)(type Github)(uri ${KIGITHUB}/Connectors_Mini-Universal.pretty)(options \"\")(descr Mate-N-Lok))\n  (lib (name Connectors_Molex)(type Github)(uri ${KIGITHUB}/Connectors_Molex.pretty)(options \"\")(descr \"Molex connector foottprints www.molex.com\"))\n  (lib (name Connectors_Multicomp)(type Github)(uri ${KIGITHUB}/Connectors_Multicomp.pretty)(options \"\")(descr \"Multicomp connector footprints\"))\n  (lib (name Connectors_Phoenix)(type Github)(uri ${KIGITHUB}/Connectors_Phoenix.pretty)(options \"\")(descr \"Phoenix connector footprints\"))\n  (lib (name Connectors_Samtec)(type Github)(uri ${KIGITHUB}/Connectors_Samtec.pretty)(options \"\")(descr \"Samtec connector footprints\"))\n  (lib (name Connectors_TE-Connectivity)(type Github)(uri ${KIGITHUB}/Connectors_TE-Connectivity.pretty)(options \"\")(descr \"TE Connectivity connector footprints www.te.com\"))\n  (lib (name Connectors_Terminal_Blocks)(type Github)(uri ${KIGITHUB}/Connectors_Terminal_Blocks.pretty)(options \"\")(descr \"Terminal block connectors\"))\n  (lib (name Connectors_WAGO)(type Github)(uri ${KIGITHUB}/Connectors_WAGO.pretty)(options \"\")(descr \"WAGO connector footprints www.wago.com\"))\n  (lib (name Connectors)(type Github)(uri ${KIGITHUB}/Connectors.pretty)(options \"\")(descr \"Assorted connector footprints\"))\n  (lib (name Converters_DCDC_ACDC)(type Github)(uri ${KIGITHUB}/Converters_DCDC_ACDC.pretty)(options \"\")(descr \"DC-DC and AC-DC convertor modules\"))\n  (lib (name Crystals)(type Github)(uri ${KIGITHUB}/Crystals.pretty)(options \"\")(descr \"Crystals and oscillators\"))\n  (lib (name Diodes_SMD)(type Github)(uri ${KIGITHUB}/Diodes_SMD.pretty)(options \"\")(descr \"Diodes, surface mount\"))\n  (lib (name Diodes_THT)(type Github)(uri ${KIGITHUB}/Diodes_THT.pretty)(options \"\")(descr \"Diodes, through hole\"))\n  (lib (name Discret)(type Github)(uri ${KIGITHUB}/Discret.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Displays_7-Segment)(type Github)(uri ${KIGITHUB}/Displays_7-Segment.pretty)(options \"\")(descr \"Seven segment displays\"))\n  (lib (name Displays)(type Github)(uri ${KIGITHUB}/Displays.pretty)(options \"\")(descr \"Display modules\"))\n  (lib (name Divers)(type Github)(uri ${KIGITHUB}/Divers.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Enclosures)(type Github)(uri ${KIGITHUB}/Enclosures.pretty)(options \"\")(descr \"Electronics enclosures and housings\"))\n  (lib (name EuroBoard_Outline)(type Github)(uri ${KIGITHUB}/EuroBoard_Outline.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Fiducials)(type Github)(uri ${KIGITHUB}/Fiducials.pretty)(options \"\")(descr \"Fiducial markings\"))\n  (lib (name Filters_HF_Coils_NEOSID)(type Github)(uri ${KIGITHUB}/Filters_HF_Coils_NEOSID.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Fuse_Holders_and_Fuses)(type Github)(uri ${KIGITHUB}/Fuse_Holders_and_Fuses.pretty)(options \"\")(descr \"Fuses and fuse holders\"))\n  (lib (name Hall-Effect_Transducers_LEM)(type Github)(uri ${KIGITHUB}/Hall-Effect_Transducers_LEM.pretty)(options \"\")(descr \"LEM hall effect transducers\"))\n  (lib (name Heatsinks)(type Github)(uri ${KIGITHUB}/Heatsinks.pretty)(options \"\")(descr \"Heatsinks and thermal products\"))\n  (lib (name Housings_BGA)(type Github)(uri ${KIGITHUB}/Housings_BGA.pretty)(options \"\")(descr \"Ball Grid Array (BGA)\"))\n  (lib (name Housings_DFN_QFN)(type Github)(uri ${KIGITHUB}/Housings_DFN_QFN.pretty)(options \"\")(descr \"Surface mount IC packages, DFN / LGA / QFN\"))\n  (lib (name Housings_DIP)(type Github)(uri ${KIGITHUB}/Housings_DIP.pretty)(options \"\")(descr \"Through hole IC packages, DIP\"))\n  (lib (name Housings_LCC)(type Github)(uri ${KIGITHUB}/Housings_LCC.pretty)(options \"\")(descr \"Leaded Chip Carriers (LCC)\"))\n  (lib (name Housings_LGA)(type Github)(uri ${KIGITHUB}/Housings_LGA.pretty)(options \"\")(descr \"Land Grid Array (LGA)\"))\n  (lib (name Housings_PGA)(type Github)(uri ${KIGITHUB}/Housings_PGA.pretty)(options \"\")(descr \"Pin Grid Array (PGA)\"))\n  (lib (name Housings_QFP)(type Github)(uri ${KIGITHUB}/Housings_QFP.pretty)(options \"\")(descr \"Quad Flat Package (QFP)\"))\n  (lib (name Housings_SIP)(type Github)(uri ${KIGITHUB}/Housings_SIP.pretty)(options \"\")(descr \"Single Inline Package (SIP)\"))\n  (lib (name Housings_SOIC)(type Github)(uri ${KIGITHUB}/Housings_SOIC.pretty)(options \"\")(descr \"Small Outline Integrated Circuits (SOIC)\"))\n  (lib (name Housings_SSOP)(type Github)(uri ${KIGITHUB}/Housings_SSOP.pretty)(options \"\")(descr \"SSOP, TSSOP, MSOP, QSOP, VSO packages\"))\n  (lib (name Inductors_NEOSID)(type Github)(uri ${KIGITHUB}/Inductors_NEOSID.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Inductors)(type Github)(uri ${KIGITHUB}/Inductors.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Inductors_SMD)(type Github)(uri ${KIGITHUB}/Inductors_SMD.pretty)(options \"\")(descr \"Inductors, surface mount\"))\n  (lib (name Inductors_THT)(type Github)(uri ${KIGITHUB}/Inductors_THT.pretty)(options \"\")(descr \"Inductors, through hole\"))\n  (lib (name IR-DirectFETs)(type Github)(uri ${KIGITHUB}/IR-DirectFETs.pretty)(options \"\")(descr \"DirectFet packets from International Rectifier\"))\n  (lib (name Labels)(type Github)(uri ${KIGITHUB}/Labels.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name LEDs)(type Github)(uri ${KIGITHUB}/LEDs.pretty)(options \"\")(descr \"Light emitting diodes (LEDs)\"))\n  (lib (name Measurement_Points)(type Github)(uri ${KIGITHUB}/Measurement_Points.pretty)(options \"\")(descr \"Terminals for test equipment\"))\n  (lib (name Measurement_Scales)(type Github)(uri ${KIGITHUB}/Measurement_Scales.pretty)(options \"\")(descr \"Measurement scales and gauges\"))\n  (lib (name Mechanical_Sockets)(type Github)(uri ${KIGITHUB}/Mechanical_Sockets.pretty)(options \"\")(descr \"Sockets for board to board connection\"))\n  (lib (name Microwave)(type Github)(uri ${KIGITHUB}/Microwave.pretty)(options \"\")(descr \"Microwave\"))\n  (lib (name Modules)(type Github)(uri ${KIGITHUB}/Modules.pretty)(options \"\")(descr \"Board-level devices integrating system functionality into a single module\"))\n  (lib (name Mounting_Holes)(type Github)(uri ${KIGITHUB}/Mounting_Holes.pretty)(options \"\")(descr \"Mechanical fasteners\"))\n  (lib (name NF-Transformers_ETAL)(type Github)(uri ${KIGITHUB}/NF-Transformers_ETAL.pretty)(options \"\")(descr \"Deprecated - will be deleted\"))\n  (lib (name Oddities)(type Github)(uri ${KIGITHUB}/Oddities.pretty)(options \"\")(descr \"Assorted footprints. Deprecated - will be removed\"))\n  (lib (name Opto-Devices)(type Github)(uri ${KIGITHUB}/Opto-Devices.pretty)(options \"\")(descr \"Optocouplers, light sensors, and other optical devices\"))\n  (lib (name Oscillators)(type Github)(uri ${KIGITHUB}/Oscillators.pretty)(options \"\")(descr \"Precicision oscillator modules\"))\n  (lib (name PFF_PSF_PSS_Leadforms)(type Github)(uri ${KIGITHUB}/PFF_PSF_PSS_Leadforms.pretty)(options \"\")(descr \"Allegro leadform packages\"))\n  (lib (name Pin_Headers)(type Github)(uri ${KIGITHUB}/Pin_Headers.pretty)(options \"\")(descr \"Male pin headers\"))\n  (lib (name Potentiometers)(type Github)(uri ${KIGITHUB}/Potentiometers.pretty)(options \"\")(descr \"Potentiometers / variable resistors\"))\n  (lib (name Power_Integrations)(type Github)(uri ${KIGITHUB}/Power_Integrations.pretty)(options \"\")(descr \"Power Integrations footprints\"))\n  (lib (name Relays_THT)(type Github)(uri ${KIGITHUB}/Relays_THT.pretty)(options \"\")(descr \"Through hole relay packages\"))\n  (lib (name Resistors_SMD)(type Github)(uri ${KIGITHUB}/Resistors_SMD.pretty)(options \"\")(descr \"Resistors, surface mount\"))\n  (lib (name Resistors_THT)(type Github)(uri ${KIGITHUB}/Resistors_THT.pretty)(options \"\")(descr \"Resistors, through hole\"))\n  (lib (name Resistors_Universal)(type Github)(uri ${KIGITHUB}/Resistors_Universal.pretty)(options \"\")(descr Experimental))\n  (lib (name RF_Modules)(type Github)(uri ${KIGITHUB}/RF_Modules.pretty)(options \"\")(descr \"Radio-frequency / wireless modules\"))\n  (lib (name Shielding_Cabinets)(type Github)(uri ${KIGITHUB}/Shielding_Cabinets.pretty)(options \"\")(descr \"RF / EMI shields\"))\n  (lib (name SMD_Packages)(type Github)(uri ${KIGITHUB}/SMD_Packages.pretty)(options \"\")(descr \"Various SMD packages. Read only - footprints will be moved to other libraries\"))\n  (lib (name Sockets_MOLEX_KK-System)(type Github)(uri ${KIGITHUB}/Sockets_MOLEX_KK-System.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Socket_Strips)(type Github)(uri ${KIGITHUB}/Socket_Strips.pretty)(options \"\")(descr \"Female socket strips\"))\n  (lib (name Sockets)(type Github)(uri ${KIGITHUB}/Sockets.pretty)(options \"\")(descr \"IC sockets\"))\n  (lib (name Symbols)(type Github)(uri ${KIGITHUB}/Symbols.pretty)(options \"\")(descr \"PCB symbols\"))\n  (lib (name TO_SOT_Packages_SMD)(type Github)(uri ${KIGITHUB}/TO_SOT_Packages_SMD.pretty)(options \"\")(descr \"Surface mount transistor packages\"))\n  (lib (name TO_SOT_Packages_THT)(type Github)(uri ${KIGITHUB}/TO_SOT_Packages_THT.pretty)(options \"\")(descr \"Through hole transistor packages\"))\n  (lib (name Transformers_CHK)(type Github)(uri ${KIGITHUB}/Transformers_CHK.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Transformers_SMD)(type Github)(uri ${KIGITHUB}/Transformers_SMD.pretty)(options \"\")(descr \"Surface mount transformers\"))\n  (lib (name Transformers_SMPS_ThroughHole)(type Github)(uri ${KIGITHUB}/Transformers_SMPS_ThroughHole.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Transformers_THT)(type Github)(uri ${KIGITHUB}/Transformers_THT.pretty)(options \"\")(descr \"Through hole transformers\"))\n  (lib (name Transistors_OldSowjetAera)(type Github)(uri ${KIGITHUB}/Transistors_OldSowjetAera.pretty)(options \"\")(descr \"Sowjet transistors\"))\n  (lib (name Valves)(type Github)(uri ${KIGITHUB}/Valves.pretty)(options \"\")(descr \"Valves\"))\n  (lib (name Varistors)(type Github)(uri ${KIGITHUB}/Varistors.pretty)(options \"\")(descr \"Varistors\"))\n  (lib (name Wire_Connections_Bridges)(type Github)(uri ${KIGITHUB}/Wire_Connections_Bridges.pretty)(options \"\")(descr \"PCB bridging points\"))\n  (lib (name Wire_Pads)(type Github)(uri ${KIGITHUB}/Wire_Pads.pretty)(options \"\")(descr \"Direct wire-to-board connection points\"))\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/kivicad.kicad_wks",
    "content": "( page_layout\n    ( setup (textsize 1.5 1.5) (linewidth 0.15) (textlinewidth 0.15) )\n    ( rect (comment \"rect around the title block\") (linewidth 0.15) (start 110 34) (end 2 2) )\n    ( rect (start 0 0 ltcorner) (end 0 0 rbcorner) (repeat 2) (incrx 2) (incry 2) )\n    ( line (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50) )\n    ( tbtext \"1\" (pos 25 1 ltcorner) (font (size 1.3 1.3))(repeat 100) (incrx 50) )\n    ( line (start 50 2 lbcorner) (end 50 0 lbcorner) (repeat 30) (incrx 50) )\n    ( tbtext \"1\" (pos 25 1 lbcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50) )\n    ( line (start 0 50 ltcorner) (end 2 50 ltcorner) (repeat 30) (incry 50) )\n    ( tbtext \"A\" (pos 1 25 ltcorner) (font (size 1.3 1.3))\n        (justify center)(repeat 100) (incry 50) )\n    ( line (start 0 50 rtcorner) (end 2 50 rtcorner) (repeat 30) (incry 50) )\n    ( tbtext \"A\" (pos 1 25 rtcorner) (font (size 1.3 1.3))\n        (justify center) (repeat 100) (incry 50) )\n    ( tbtext \"Date: %D\" (pos 87 6.9) )\n    ( line (start 110 5.5) (end 2 5.5) )\n    ( tbtext \"%K\" (pos 109 4.1) (comment \"Kicad version\" ) )\n    ( line (start 110 8.5) (end 2 8.5) )\n    ( tbtext \"Rev: %R\" (pos 24 6.9)(font bold)(justify left) )\n    ( tbtext \"Size: %Z\" (comment \"Paper format name\")(pos 109 6.9) )\n    ( tbtext \"Id: %S/%N\" (comment \"Sheet id\")(pos 24 4.1) )\n    ( line (start 110 12.5) (end 2 12.5) )\n    ( tbtext \"Title: %T\" (pos 109 10.7)(font bold (size 2 2)) )\n    ( tbtext \"File: %F\" (pos 109 14.3) )\n    ( line (start 110 18.5) (end 2 18.5) )\n    ( tbtext \"Sheet: %P\" (pos 109 17) )\n    ( tbtext \"%Y\" (comment \"Company name\") (pos 109 20)(font bold) )\n    ( tbtext \"%C0\" (comment \"Comment 0\") (pos 109 23) )\n    ( tbtext \"%C1\" (comment \"Comment 1\") (pos 109 26) )\n    ( tbtext \"%C2\" (comment \"Comment 2\") (pos 109 29) )\n    ( tbtext \"%C3\" (comment \"Comment 3\") (pos 109 32) )\n    ( line (start 90 8.5) (end 90 5.5) )\n    ( line (start 26 8.5) (end 26 2) )\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/nrf-bga.kicad_pcb",
    "content": "(kicad_pcb (version 4) (host pcbnew \"(2014-08-05 BZR 5054)-product\")\n\n  (general\n    (links 36)\n    (no_connects 0)\n    (area 146.9984 92.8984 164.465656 112.3572)\n    (thickness 1.6)\n    (drawings 0)\n    (tracks 108)\n    (zones 0)\n    (modules 12)\n    (nets 54)\n  )\n\n  (page A4)\n  (layers\n    (0 F.Cu signal)\n    (31 B.Cu signal)\n    (32 B.Adhes user)\n    (33 F.Adhes user)\n    (34 B.Paste user)\n    (35 F.Paste user)\n    (36 B.SilkS user)\n    (37 F.SilkS user)\n    (38 B.Mask user)\n    (39 F.Mask user)\n    (40 Dwgs.User user)\n    (41 Cmts.User user)\n    (42 Eco1.User user)\n    (43 Eco2.User user)\n    (44 Edge.Cuts user)\n    (45 Margin user)\n    (46 B.CrtYd user)\n    (47 F.CrtYd user)\n    (48 B.Fab user)\n    (49 F.Fab user)\n  )\n\n  (setup\n    (last_trace_width 0.1016)\n    (trace_clearance 0.1016)\n    (zone_clearance 0.2032)\n    (zone_45_only no)\n    (trace_min 0.1016)\n    (segment_width 0.2)\n    (edge_width 0.1)\n    (via_size 0.889)\n    (via_drill 0.635)\n    (via_min_size 0.889)\n    (via_min_drill 0.508)\n    (uvia_size 0.508)\n    (uvia_drill 0.127)\n    (uvias_allowed no)\n    (uvia_min_size 0.508)\n    (uvia_min_drill 0.127)\n    (pcb_text_width 0.3)\n    (pcb_text_size 1.5 1.5)\n    (mod_edge_width 0.15)\n    (mod_text_size 1 1)\n    (mod_text_width 0.15)\n    (pad_size 0.2 0.2)\n    (pad_drill 0)\n    (pad_to_mask_clearance 0)\n    (aux_axis_origin 0 0)\n    (visible_elements FFFCFF7F)\n    (pcbplotparams\n      (layerselection 0x00000_00000001)\n      (usegerberextensions false)\n      (excludeedgelayer true)\n      (linewidth 0.100000)\n      (plotframeref false)\n      (viasonmask false)\n      (mode 1)\n      (useauxorigin false)\n      (hpglpennumber 1)\n      (hpglpenspeed 20)\n      (hpglpendiameter 15)\n      (hpglpenoverlay 2)\n      (psnegative false)\n      (psa4output false)\n      (plotreference true)\n      (plotvalue true)\n      (plotinvisibletext false)\n      (padsonsilk false)\n      (subtractmaskfromsilk false)\n      (outputformat 5)\n      (mirror true)\n      (drillshape 0)\n      (scaleselection 1)\n      (outputdirectory pdfs/))\n  )\n\n  (net 0 \"\")\n  (net 1 \"Net-(C1-Pad1)\")\n  (net 2 GND)\n  (net 3 \"Net-(C2-Pad1)\")\n  (net 4 \"Net-(C3-Pad1)\")\n  (net 5 \"Net-(C4-Pad2)\")\n  (net 6 \"Net-(D1-Pad1)\")\n  (net 7 +BATT)\n  (net 8 SWDIO)\n  (net 9 SWCLK)\n  (net 10 LED)\n  (net 11 \"Net-(U1-PadC1)\")\n  (net 12 \"Net-(U1-PadD1)\")\n  (net 13 \"Net-(U1-PadG1)\")\n  (net 14 \"Net-(U1-PadE2)\")\n  (net 15 \"Net-(U1-PadF2)\")\n  (net 16 \"Net-(U1-PadG2)\")\n  (net 17 \"Net-(U1-PadE3)\")\n  (net 18 \"Net-(U1-PadF3)\")\n  (net 19 \"Net-(U1-PadG3)\")\n  (net 20 \"Net-(U1-PadH4)\")\n  (net 21 \"Net-(U1-PadA5)\")\n  (net 22 \"Net-(U1-PadB5)\")\n  (net 23 \"Net-(U1-PadC5)\")\n  (net 24 \"Net-(U1-PadH5)\")\n  (net 25 \"Net-(U1-PadA6)\")\n  (net 26 \"Net-(U1-PadB6)\")\n  (net 27 \"Net-(U1-PadC6)\")\n  (net 28 \"Net-(U1-PadH6)\")\n  (net 29 \"Net-(U1-PadA7)\")\n  (net 30 \"Net-(U1-PadB7)\")\n  (net 31 \"Net-(U1-PadC7)\")\n  (net 32 \"Net-(U1-PadE7)\")\n  (net 33 \"Net-(U1-PadF7)\")\n  (net 34 \"Net-(U1-PadG7)\")\n  (net 35 \"Net-(U1-PadH7)\")\n  (net 36 \"Net-(U1-PadA8)\")\n  (net 37 \"Net-(U1-PadD8)\")\n  (net 38 \"Net-(U1-PadE8)\")\n  (net 39 \"Net-(U1-PadF8)\")\n  (net 40 \"Net-(U1-PadG8)\")\n  (net 41 \"Net-(U1-PadH8)\")\n  (net 42 \"Net-(U1-PadE9)\")\n  (net 43 \"Net-(U1-PadF9)\")\n  (net 44 \"Net-(U1-PadH1)\")\n  (net 45 \"Net-(U1-PadJ3)\")\n  (net 46 \"Net-(U1-PadJ4)\")\n  (net 47 \"Net-(U1-PadJ5)\")\n  (net 48 \"Net-(U1-PadJ6)\")\n  (net 49 \"Net-(U1-PadJ7)\")\n  (net 50 \"Net-(U1-PadJ8)\")\n  (net 51 \"Net-(U1-PadH9)\")\n  (net 52 \"Net-(C5-Pad1)\")\n  (net 53 \"Net-(ANT1-Pad2)\")\n\n  (net_class Default \"This is the default net class.\"\n    (clearance 0.1016)\n    (trace_width 0.1016)\n    (via_dia 0.889)\n    (via_drill 0.635)\n    (uvia_dia 0.508)\n    (uvia_drill 0.127)\n    (add_net +BATT)\n    (add_net LED)\n    (add_net \"Net-(C1-Pad1)\")\n    (add_net \"Net-(C2-Pad1)\")\n    (add_net \"Net-(C3-Pad1)\")\n    (add_net \"Net-(C4-Pad2)\")\n    (add_net \"Net-(C5-Pad1)\")\n    (add_net \"Net-(D1-Pad1)\")\n    (add_net \"Net-(U1-PadA5)\")\n    (add_net \"Net-(U1-PadA6)\")\n    (add_net \"Net-(U1-PadA7)\")\n    (add_net \"Net-(U1-PadA8)\")\n    (add_net \"Net-(U1-PadB5)\")\n    (add_net \"Net-(U1-PadB6)\")\n    (add_net \"Net-(U1-PadB7)\")\n    (add_net \"Net-(U1-PadC1)\")\n    (add_net \"Net-(U1-PadC5)\")\n    (add_net \"Net-(U1-PadC6)\")\n    (add_net \"Net-(U1-PadC7)\")\n    (add_net \"Net-(U1-PadD1)\")\n    (add_net \"Net-(U1-PadD8)\")\n    (add_net \"Net-(U1-PadE2)\")\n    (add_net \"Net-(U1-PadE3)\")\n    (add_net \"Net-(U1-PadE7)\")\n    (add_net \"Net-(U1-PadE8)\")\n    (add_net \"Net-(U1-PadE9)\")\n    (add_net \"Net-(U1-PadF2)\")\n    (add_net \"Net-(U1-PadF3)\")\n    (add_net \"Net-(U1-PadF7)\")\n    (add_net \"Net-(U1-PadF8)\")\n    (add_net \"Net-(U1-PadF9)\")\n    (add_net \"Net-(U1-PadG1)\")\n    (add_net \"Net-(U1-PadG2)\")\n    (add_net \"Net-(U1-PadG3)\")\n    (add_net \"Net-(U1-PadG7)\")\n    (add_net \"Net-(U1-PadG8)\")\n    (add_net \"Net-(U1-PadH1)\")\n    (add_net \"Net-(U1-PadH4)\")\n    (add_net \"Net-(U1-PadH5)\")\n    (add_net \"Net-(U1-PadH6)\")\n    (add_net \"Net-(U1-PadH7)\")\n    (add_net \"Net-(U1-PadH8)\")\n    (add_net \"Net-(U1-PadH9)\")\n    (add_net \"Net-(U1-PadJ3)\")\n    (add_net \"Net-(U1-PadJ4)\")\n    (add_net \"Net-(U1-PadJ5)\")\n    (add_net \"Net-(U1-PadJ6)\")\n    (add_net \"Net-(U1-PadJ7)\")\n    (add_net \"Net-(U1-PadJ8)\")\n    (add_net SWCLK)\n    (add_net SWDIO)\n  )\n\n  (net_class ANT \"\"\n    (clearance 0.1016)\n    (trace_width 0.254)\n    (via_dia 0.889)\n    (via_drill 0.635)\n    (uvia_dia 0.508)\n    (uvia_drill 0.127)\n    (add_net GND)\n    (add_net \"Net-(ANT1-Pad2)\")\n  )\n\n  (module Capacitors_SMD:C_0402 (layer F.Cu) (tedit 5415D599) (tstamp 54B59067)\n    (at 153.75 102.5 270)\n    (descr \"Capacitor SMD 0402, reflow soldering, AVX (see smccp.pdf)\")\n    (tags \"capacitor 0402\")\n    (path /54B59137)\n    (attr smd)\n    (fp_text reference C1 (at 0 -1.7 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 12p (at 0 1.7 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.15 -0.6) (end 1.15 -0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 -0.6) (end -1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.15 -0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.25 -0.475) (end -0.25 -0.475) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.25 0.475) (end 0.25 0.475) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.55 0 270) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 1 \"Net-(C1-Pad1)\"))\n    (pad 2 smd rect (at 0.55 0 270) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (model Capacitors_SMD/C_0402.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Capacitors_SMD:C_0402 (layer F.Cu) (tedit 5415D599) (tstamp 54B58E0D)\n    (at 159.004 100.711)\n    (descr \"Capacitor SMD 0402, reflow soldering, AVX (see smccp.pdf)\")\n    (tags \"capacitor 0402\")\n    (path /54B591B6)\n    (attr smd)\n    (fp_text reference C2 (at 0 -1.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 12p (at 0 1.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.15 -0.6) (end 1.15 -0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 -0.6) (end -1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.15 -0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.25 -0.475) (end -0.25 -0.475) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.25 0.475) (end 0.25 0.475) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.55 0) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 3 \"Net-(C2-Pad1)\"))\n    (pad 2 smd rect (at 0.55 0) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (model Capacitors_SMD/C_0402.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Capacitors_SMD:C_0402 (layer F.Cu) (tedit 5415D599) (tstamp 54B59E9D)\n    (at 159.004 102.1588)\n    (descr \"Capacitor SMD 0402, reflow soldering, AVX (see smccp.pdf)\")\n    (tags \"capacitor 0402\")\n    (path /54B58D67)\n    (attr smd)\n    (fp_text reference C3 (at 0 -1.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 100n (at 0 1.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.15 -0.6) (end 1.15 -0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 -0.6) (end -1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.15 -0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.25 -0.475) (end -0.25 -0.475) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.25 0.475) (end 0.25 0.475) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.55 0) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 4 \"Net-(C3-Pad1)\"))\n    (pad 2 smd rect (at 0.55 0) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (model Capacitors_SMD/C_0402.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Capacitors_SMD:C_0402 (layer F.Cu) (tedit 5415D599) (tstamp 54B58E25)\n    (at 154.15 106.55 90)\n    (descr \"Capacitor SMD 0402, reflow soldering, AVX (see smccp.pdf)\")\n    (tags \"capacitor 0402\")\n    (path /54B58DD5)\n    (attr smd)\n    (fp_text reference C4 (at 0 -1.7 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 100n (at 0 1.7 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.15 -0.6) (end 1.15 -0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 -0.6) (end -1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.15 -0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.25 -0.475) (end -0.25 -0.475) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.25 0.475) (end 0.25 0.475) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.55 0 90) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad 2 smd rect (at 0.55 0 90) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 5 \"Net-(C4-Pad2)\"))\n    (model Capacitors_SMD/C_0402.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module SMD_Packages:SMD-0805 (layer F.Cu) (tedit 54B58D88) (tstamp 54B58E32)\n    (at 162.0266 104.9782 90)\n    (path /54B599BA)\n    (attr smd)\n    (fp_text reference D1 (at 0 -0.3175 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value LED (at 0 0.381 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center -1.651 0.762) (end -1.651 0.635) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.508 0.762) (end -1.524 0.762) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.524 0.762) (end -1.524 -0.762) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.524 -0.762) (end -0.508 -0.762) (layer F.SilkS) (width 0.15))\n    (fp_line (start 0.508 -0.762) (end 1.524 -0.762) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.524 -0.762) (end 1.524 0.762) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.524 0.762) (end 0.508 0.762) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.9525 0 90) (size 0.889 1.397) (layers F.Cu F.Paste F.Mask)\n      (net 6 \"Net-(D1-Pad1)\"))\n    (pad 2 smd rect (at 0.9525 0 90) (size 0.889 1.397) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (model SMD_Packages/SMD-0805.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 0.1000000014901161 0.1000000014901161 0.1000000014901161))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 54B58D8A) (tstamp 54B58E41)\n    (at 156.7942 109.1946 180)\n    (descr \"Through hole pin header\")\n    (tags \"pin header\")\n    (path /54B593BB)\n    (fp_text reference P1 (at 0 -2.286 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value CONN_01X04 (at 0 0 180) (layer F.SilkS) hide\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -2.54 1.27) (end 5.08 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -2.54 -1.27) (end 5.08 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -5.08 -1.27) (end -2.54 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 5.08 1.27) (end 5.08 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -2.54 -1.27) (end -2.54 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -5.08 -1.27) (end -5.08 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -5.08 1.27) (end -2.54 1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole rect (at -3.81 0 180) (size 1.7272 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 2 GND))\n    (pad 2 thru_hole oval (at -1.27 0 180) (size 1.7272 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 7 +BATT))\n    (pad 3 thru_hole oval (at 1.27 0 180) (size 1.7272 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 8 SWDIO))\n    (pad 4 thru_hole oval (at 3.81 0 180) (size 1.7272 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 9 SWCLK))\n    (model Pin_Headers/Pin_Header_Straight_1x04.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 54B59E20)\n    (at 160.0454 105.0544 270)\n    (descr \"Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)\")\n    (tags \"resistor 0603\")\n    (path /54B59A45)\n    (attr smd)\n    (fp_text reference R1 (at 0 -1.9 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value R (at 0 1.9 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask)\n      (net 10 LED))\n    (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask)\n      (net 6 \"Net-(D1-Pad1)\"))\n    (model Resistors_SMD/R_0603.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Crystals_Oscillators_SMD:CX2520DB (layer F.Cu) (tedit 544FEDED) (tstamp 54B58E9A)\n    (at 156.1084 101.3714)\n    (path /54B5903E)\n    (fp_text reference X1 (at 0 -2.25) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value CRYSTAL (at 0 2.5) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 1) (end 1.25 1) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.25 1) (end 1.25 -1) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.25 -1) (end -1.25 -1) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.25 -1) (end -1.25 1) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.9 0.65) (size 1.2 1) (layers F.Cu F.Paste F.Mask)\n      (net 1 \"Net-(C1-Pad1)\"))\n    (pad 2 smd rect (at 0.9 -0.65) (size 1.2 1) (layers F.Cu F.Paste F.Mask)\n      (net 3 \"Net-(C2-Pad1)\"))\n    (pad 3 smd rect (at 0.9 0.65) (size 1.2 1) (layers F.Cu F.Paste F.Mask))\n    (pad 4 smd rect (at -0.9 -0.65) (size 1.2 1) (layers F.Cu F.Paste F.Mask))\n  )\n\n  (module NRF51:WLCSP62 (layer F.Cu) (tedit 54B59368) (tstamp 54B59DAD)\n    (at 156.9212 105.1306)\n    (path /54B58C30)\n    (fp_text reference U1 (at 0 3.2) (layer F.SilkS)\n      (effects (font (size 1.2 1.2) (thickness 0.2)))\n    )\n    (fp_text value nRF51x22-CEAA (at 0 -3.2) (layer F.SilkS)\n      (effects (font (size 1.2 1.2) (thickness 0.2)))\n    )\n    (fp_line (start -1.6 -2) (end -2 -1.6) (layer F.SilkS) (width 0.2))\n    (fp_line (start -2 -1.6) (end -2 2) (layer F.SilkS) (width 0.2))\n    (fp_line (start -2 2) (end 2 2) (layer F.SilkS) (width 0.2))\n    (fp_line (start 2 2) (end 2 -2) (layer F.SilkS) (width 0.2))\n    (fp_line (start 2 -2) (end -1.6 -2) (layer F.SilkS) (width 0.2))\n    (pad A1 smd circle (at -1.6 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 7 +BATT))\n    (pad B1 smd circle (at -1.6 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad C1 smd circle (at -1.6 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 11 \"Net-(U1-PadC1)\"))\n    (pad D1 smd circle (at -1.6 -0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 12 \"Net-(U1-PadD1)\"))\n    (pad E1 smd circle (at -1.6 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 52 \"Net-(C5-Pad1)\"))\n    (pad F1 smd circle (at -1.6 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 5 \"Net-(C4-Pad2)\"))\n    (pad G1 smd circle (at -1.6 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 13 \"Net-(U1-PadG1)\"))\n    (pad H1 smd circle (at -1.6 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 44 \"Net-(U1-PadH1)\"))\n    (pad A2 smd circle (at -1.2 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 1 \"Net-(C1-Pad1)\"))\n    (pad E2 smd circle (at -1.2 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 14 \"Net-(U1-PadE2)\"))\n    (pad F2 smd circle (at -1.2 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 15 \"Net-(U1-PadF2)\"))\n    (pad G2 smd circle (at -1.2 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 16 \"Net-(U1-PadG2)\"))\n    (pad H2 smd circle (at -1.2 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 9 SWCLK))\n    (pad J2 smd circle (at -1.2 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 8 SWDIO))\n    (pad A3 smd circle (at -0.8 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 3 \"Net-(C2-Pad1)\"))\n    (pad E3 smd circle (at -0.8 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 17 \"Net-(U1-PadE3)\"))\n    (pad F3 smd circle (at -0.8 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 18 \"Net-(U1-PadF3)\"))\n    (pad G3 smd circle (at -0.8 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 19 \"Net-(U1-PadG3)\"))\n    (pad H3 smd circle (at -0.8 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad J3 smd circle (at -0.8 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 45 \"Net-(U1-PadJ3)\"))\n    (pad A4 smd circle (at -0.4 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 4 \"Net-(C3-Pad1)\"))\n    (pad B4 smd circle (at -0.4 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad G4 smd circle (at -0.4 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad H4 smd circle (at -0.4 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 20 \"Net-(U1-PadH4)\"))\n    (pad J4 smd circle (at -0.4 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 46 \"Net-(U1-PadJ4)\"))\n    (pad A5 smd circle (at 0 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 21 \"Net-(U1-PadA5)\"))\n    (pad B5 smd circle (at 0 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 22 \"Net-(U1-PadB5)\"))\n    (pad C5 smd circle (at 0 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 23 \"Net-(U1-PadC5)\"))\n    (pad G5 smd circle (at 0 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad H5 smd circle (at 0 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 24 \"Net-(U1-PadH5)\"))\n    (pad J5 smd circle (at 0 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 47 \"Net-(U1-PadJ5)\"))\n    (pad A6 smd circle (at 0.4 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 25 \"Net-(U1-PadA6)\"))\n    (pad B6 smd circle (at 0.4 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 26 \"Net-(U1-PadB6)\"))\n    (pad C6 smd circle (at 0.4 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 27 \"Net-(U1-PadC6)\"))\n    (pad G6 smd circle (at 0.4 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad H6 smd circle (at 0.4 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 28 \"Net-(U1-PadH6)\"))\n    (pad J6 smd circle (at 0.4 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 48 \"Net-(U1-PadJ6)\"))\n    (pad A7 smd circle (at 0.8 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 29 \"Net-(U1-PadA7)\"))\n    (pad B7 smd circle (at 0.8 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 30 \"Net-(U1-PadB7)\"))\n    (pad C7 smd circle (at 0.8 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 31 \"Net-(U1-PadC7)\"))\n    (pad D7 smd circle (at 0.8 -0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad E7 smd circle (at 0.8 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 32 \"Net-(U1-PadE7)\"))\n    (pad F7 smd circle (at 0.8 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 33 \"Net-(U1-PadF7)\"))\n    (pad G7 smd circle (at 0.8 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 34 \"Net-(U1-PadG7)\"))\n    (pad H7 smd circle (at 0.8 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 35 \"Net-(U1-PadH7)\"))\n    (pad J7 smd circle (at 0.8 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 49 \"Net-(U1-PadJ7)\"))\n    (pad A8 smd circle (at 1.2 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 36 \"Net-(U1-PadA8)\"))\n    (pad B8 smd circle (at 1.2 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 7 +BATT))\n    (pad C8 smd circle (at 1.2 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad D8 smd circle (at 1.2 -0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 37 \"Net-(U1-PadD8)\"))\n    (pad E8 smd circle (at 1.2 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 38 \"Net-(U1-PadE8)\"))\n    (pad F8 smd circle (at 1.2 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 39 \"Net-(U1-PadF8)\"))\n    (pad G8 smd circle (at 1.2 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 40 \"Net-(U1-PadG8)\"))\n    (pad H8 smd circle (at 1.2 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 41 \"Net-(U1-PadH8)\"))\n    (pad J8 smd circle (at 1.2 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 50 \"Net-(U1-PadJ8)\"))\n    (pad A9 smd circle (at 1.6 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask))\n    (pad B9 smd circle (at 1.6 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 7 +BATT))\n    (pad C9 smd circle (at 1.6 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad D9 smd circle (at 1.6 -0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 10 LED))\n    (pad E9 smd circle (at 1.6 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 42 \"Net-(U1-PadE9)\"))\n    (pad F9 smd circle (at 1.6 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 43 \"Net-(U1-PadF9)\"))\n    (pad G9 smd circle (at 1.6 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad H9 smd circle (at 1.6 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 51 \"Net-(U1-PadH9)\"))\n  )\n\n  (module Capacitors_SMD:C_0402 (layer F.Cu) (tedit 5415D599) (tstamp 55048D3E)\n    (at 153 106.55 270)\n    (descr \"Capacitor SMD 0402, reflow soldering, AVX (see smccp.pdf)\")\n    (tags \"capacitor 0402\")\n    (path /550483E1)\n    (attr smd)\n    (fp_text reference C5 (at 0 -1.7 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 2n2 (at 0 1.7 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.15 -0.6) (end 1.15 -0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 -0.6) (end -1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.15 -0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.25 -0.475) (end -0.25 -0.475) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.25 0.475) (end 0.25 0.475) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.55 0 270) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 52 \"Net-(C5-Pad1)\"))\n    (pad 2 smd rect (at 0.55 0 270) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (model Capacitors_SMD.3dshapes/C_0402.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module ANT:ANT-2.4GHz (layer F.Cu) (tedit 54517711) (tstamp 55049531)\n    (at 149.35 106.95 90)\n    (path /55047C3D)\n    (fp_text reference ANT1 (at -2.5 1.5 90) (layer F.SilkS)\n      (effects (font (size 0.4 0.4) (thickness 0.04)))\n    )\n    (fp_text value ANT-2.4GHz (at -2 2 90) (layer F.SilkS)\n      (effects (font (size 0.4 0.4) (thickness 0.04)))\n    )\n    (pad 1 smd rect (at 0 0 90) (size 0.9 4.9) (layers F.Cu)\n      (net 2 GND))\n    (pad 3 smd rect (at 2.05 -2.7 90) (size 5 0.5) (layers F.Cu))\n    (pad 2 smd rect (at 2.1 0 90) (size 0.5 4.9) (layers F.Cu)\n      (net 53 \"Net-(ANT1-Pad2)\"))\n    (pad 3 smd rect (at 4.3 -1.13 90) (size 0.5 2.64) (layers F.Cu))\n    (pad 3 smd rect (at 6.8 -1.13 90) (size 0.5 2.64) (layers F.Cu))\n    (pad 3 smd rect (at 5.55 -0.06 90) (size 2 0.5) (layers F.Cu))\n    (pad 3 smd rect (at 7.9 -2.7 90) (size 2.7 0.5) (layers F.Cu))\n    (pad 3 smd rect (at 12.6 -2.7 90) (size 2.7 0.5) (layers F.Cu))\n    (pad 3 smd rect (at 9 -1.13 90) (size 0.5 2.64) (layers F.Cu))\n    (pad 3 smd rect (at 11.5 -1.13 90) (size 0.5 2.64) (layers F.Cu))\n    (pad 3 smd rect (at 10.25 -0.06 90) (size 2 0.5) (layers F.Cu))\n    (pad 3 smd rect (at 13.7 -0.48 90) (size 0.5 3.94) (layers F.Cu))\n  )\n\n  (module NRF51:BAL-NRF02D3 (layer F.Cu) (tedit 550C7CF1) (tstamp 55048D47)\n    (at 153.65 104.55 180)\n    (path /550480A2)\n    (fp_text reference U2 (at 0 1.95 180) (layer F.SilkS)\n      (effects (font (size 1.2 1.2) (thickness 0.2)))\n    )\n    (fp_text value BAL-NRF02D3 (at 0 -1.95 180) (layer F.SilkS)\n      (effects (font (size 1.2 1.2) (thickness 0.2)))\n    )\n    (fp_circle (center 0.75 -1.25) (end 1 -1.25) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1 -0.75) (end -1 0.75) (layer F.SilkS) (width 0.2))\n    (fp_line (start -1 0.75) (end 1 0.75) (layer F.SilkS) (width 0.2))\n    (fp_line (start 1 0.75) (end 1 -0.75) (layer F.SilkS) (width 0.2))\n    (fp_line (start 1 -0.75) (end -1 -0.75) (layer F.SilkS) (width 0.2))\n    (pad A3 smd circle (at -0.5 -0.25 180) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 12 \"Net-(U1-PadD1)\"))\n    (pad B3 smd circle (at -0.5 0.25 180) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 11 \"Net-(U1-PadC1)\"))\n    (pad A2 smd circle (at 0 -0.25 180) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 52 \"Net-(C5-Pad1)\"))\n    (pad A1 smd circle (at 0.5 -0.25 180) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 53 \"Net-(ANT1-Pad2)\"))\n    (pad B1 smd circle (at 0.5 0.25 180) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n  )\n\n  (segment (start 155.7212 102.5342) (end 155.2084 102.0214) (width 0.1016) (layer F.Cu) (net 1))\n  (segment (start 155.7212 103.5306) (end 155.7212 102.5342) (width 0.1016) (layer F.Cu) (net 1))\n  (segment (start 155.137 101.95) (end 155.2084 102.0214) (width 0.1016) (layer F.Cu) (net 1) (tstamp 55048FFD))\n  (segment (start 153.75 101.95) (end 155.137 101.95) (width 0.1016) (layer F.Cu) (net 1))\n  (segment (start 156.947646 104.7306) (end 156.7306 104.7306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.7306 104.7306) (end 156.5212 104.5212) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.5212 104.5212) (end 156.5212 104.072021) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.5212 104.072021) (end 156.5212 103.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.1212 106.3306) (end 156.5212 105.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.5212 105.9306) (end 156.9212 105.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 157.3212 105.9306) (end 156.9212 105.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 157.7212 104.7306) (end 156.947646 104.7306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.5212 103.9306) (end 155.3212 103.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.9212 104.757046) (end 156.9212 105.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.947646 104.7306) (end 156.9212 104.757046) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 157.7212 104.7306) (end 158.1212 104.3306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 158.1212 104.3306) (end 158.5212 104.3306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 161.2265 103.4796) (end 161.7726 104.0257) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.3722 103.4796) (end 161.2265 103.4796) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 161.7726 104.0257) (end 162.0266 104.0257) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.554 101.0626) (end 159.554 102.1588) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.554 100.711) (end 159.554 101.0626) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.3722 102.6922) (end 159.3722 103.4796) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.554 102.5104) (end 159.3722 102.6922) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.554 102.1588) (end 159.554 102.5104) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.3722 103.621021) (end 159.3722 103.4796) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 158.5212 104.3306) (end 158.662621 104.3306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 158.662621 104.3306) (end 159.3722 103.621021) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 155.0306 103.9306) (end 154.15 103.05) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55048FDD))\n  (segment (start 154.15 103.05) (end 153.75 103.05) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55048FEF))\n  (segment (start 155.3212 103.9306) (end 155.0306 103.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 154.15 107.1) (end 153 107.1) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 160.6042 108.3542) (end 160.6042 109.1946) (width 0.1016) (layer F.Cu) (net 2) (tstamp 5504935E))\n  (segment (start 158.5212 105.9306) (end 159.05 105.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 160.85 105.05) (end 159.4 105.05) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55049373))\n  (segment (start 159.4 105.05) (end 159.05 105.4) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55049377))\n  (segment (start 159.05 105.4) (end 159.05 105.9306) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55049378))\n  (segment (start 161.8743 104.0257) (end 160.85 105.05) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55049366))\n  (segment (start 162.0266 104.0257) (end 161.8743 104.0257) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 149.5 107.1) (end 149.35 106.95) (width 0.1016) (layer F.Cu) (net 2) (tstamp 5504964A) (status 30))\n  (segment (start 149.5 107.1) (end 149.35 106.95) (width 0.254) (layer F.Cu) (net 2) (tstamp 5504967F) (status 30))\n  (segment (start 153 107.1) (end 149.5 107.1) (width 0.254) (layer F.Cu) (net 2) (status 20))\n  (segment (start 158.4436 100.7214) (end 158.454 100.711) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 157.0084 100.7214) (end 158.4436 100.7214) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 156.6786 100.7214) (end 157.0084 100.7214) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 156.1084 101.2916) (end 156.6786 100.7214) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 156.1084 103.5178) (end 156.1084 101.2916) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 156.1212 103.5306) (end 156.1084 103.5178) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 156.5212 103.389179) (end 157.014979 102.8954) (width 0.1016) (layer F.Cu) (net 4))\n  (segment (start 156.5212 103.5306) (end 156.5212 103.389179) (width 0.1016) (layer F.Cu) (net 4))\n  (segment (start 157.6674 102.8954) (end 158.404 102.1588) (width 0.1016) (layer F.Cu) (net 4))\n  (segment (start 158.404 102.1588) (end 158.454 102.1588) (width 0.1016) (layer F.Cu) (net 4))\n  (segment (start 157.014979 102.8954) (end 157.6674 102.8954) (width 0.1016) (layer F.Cu) (net 4))\n  (segment (start 154.45 106) (end 154.9194 105.5306) (width 0.1016) (layer F.Cu) (net 5) (tstamp 5504901F))\n  (segment (start 154.9194 105.5306) (end 155.3212 105.5306) (width 0.1016) (layer F.Cu) (net 5) (tstamp 55049021))\n  (segment (start 154.15 106) (end 154.45 106) (width 0.1016) (layer F.Cu) (net 5))\n  (segment (start 160.1717 105.9307) (end 160.0454 105.8044) (width 0.1016) (layer F.Cu) (net 6))\n  (segment (start 162.0266 105.9307) (end 160.1717 105.9307) (width 0.1016) (layer F.Cu) (net 6))\n  (segment (start 159 99.9) (end 159.05 99.9) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 159.35 99.6) (end 161.2 99.6) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.25 111.15) (end 158.0642 110.9642) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 159.05 99.9) (end 159.35 99.6) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 161.2 99.6) (end 163.35 101.75) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 163.35 101.75) (end 163.35 110.35) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 163.35 110.35) (end 162.55 111.15) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.0642 110.9642) (end 158.0642 109.1946) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 162.55 111.15) (end 158.25 111.15) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.5212 103.9306) (end 158.1212 103.9306) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.0642 109.347) (end 158.0642 109.1946) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 159 99.9) (end 159 103.593221) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.662621 103.9306) (end 158.5212 103.9306) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 154.1 99.6) (end 158.7 99.6) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 153 102.3) (end 153 100.7) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 153.2 102.5) (end 153 102.3) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.7 99.6) (end 159 99.9) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 154.2906 102.5) (end 153.2 102.5) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 159 103.593221) (end 158.662621 103.9306) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 153 100.7) (end 154.1 99.6) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 155.3212 103.5306) (end 154.2906 102.5) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 155.7212 108.9976) (end 155.5242 109.1946) (width 0.1016) (layer F.Cu) (net 8))\n  (segment (start 155.7212 106.7306) (end 155.7212 108.9976) (width 0.1016) (layer F.Cu) (net 8))\n  (segment (start 152.9842 109.0676) (end 152.9842 109.1946) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 152.9842 109.1946) (end 152.9842 109.0422) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 155.2018 106.85) (end 155.7212 106.3306) (width 0.1016) (layer F.Cu) (net 9) (tstamp 55049280))\n  (segment (start 155.1 106.95) (end 155.2 106.85) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 155.1 107.35) (end 155.1 106.95) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 154.55 107.9) (end 155.1 107.35) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 154.1264 107.9) (end 154.55 107.9) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 152.9842 109.0422) (end 154.1264 107.9) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 155.2 106.85) (end 155.2018 106.85) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 160.0454 104.3044) (end 159.4938 104.3044) (width 0.1016) (layer F.Cu) (net 10))\n  (segment (start 158.662621 104.7306) (end 158.5212 104.7306) (width 0.1016) (layer F.Cu) (net 10))\n  (segment (start 159.0676 104.7306) (end 158.662621 104.7306) (width 0.1016) (layer F.Cu) (net 10))\n  (segment (start 159.4938 104.3044) (end 159.0676 104.7306) (width 0.1016) (layer F.Cu) (net 10))\n  (segment (start 154.1806 104.3306) (end 154.15 104.3) (width 0.1016) (layer F.Cu) (net 11) (tstamp 5504938B))\n  (segment (start 155.3212 104.3306) (end 154.1806 104.3306) (width 0.1016) (layer F.Cu) (net 11))\n  (segment (start 154.2194 104.7306) (end 154.15 104.8) (width 0.1016) (layer F.Cu) (net 12) (tstamp 55049388))\n  (segment (start 155.3212 104.7306) (end 154.2194 104.7306) (width 0.1016) (layer F.Cu) (net 12))\n  (segment (start 155.3212 105.1306) (end 154.7194 105.1306) (width 0.1016) (layer F.Cu) (net 52))\n  (segment (start 154.7194 105.1306) (end 154.6 105.25) (width 0.1016) (layer F.Cu) (net 52))\n  (segment (start 154.6 105.25) (end 153.65 105.25) (width 0.1016) (layer F.Cu) (net 52))\n  (segment (start 153.65 105.25) (end 153.65 104.8) (width 0.1016) (layer F.Cu) (net 52) (tstamp 5504901A))\n  (segment (start 153.6 105.3) (end 153.65 105.25) (width 0.1016) (layer F.Cu) (net 52) (tstamp 55049386))\n  (segment (start 153 105.9) (end 153.6 105.3) (width 0.1016) (layer F.Cu) (net 52) (tstamp 55049018))\n  (segment (start 153 106) (end 153 105.9) (width 0.1016) (layer F.Cu) (net 52))\n  (segment (start 149.4 104.8) (end 149.35 104.85) (width 0.1016) (layer F.Cu) (net 53) (tstamp 55049543) (status 30))\n  (segment (start 153.1 104.85) (end 153.15 104.8) (width 0.254) (layer F.Cu) (net 53) (tstamp 550495A4))\n  (segment (start 149.35 104.85) (end 153.1 104.85) (width 0.254) (layer F.Cu) (net 53) (status 10))\n\n  (zone (net 2) (net_name GND) (layer F.Cu) (tstamp 550C7F83) (hatch edge 0.508)\n    (connect_pads (clearance 0.2032))\n    (min_thickness 0.1524)\n    (fill yes (arc_segments 16) (thermal_gap 0.2032) (thermal_bridge_width 0.15494) (smoothing chamfer) (radius 0.5))\n    (polygon\n      (pts\n        (xy 164 111.85) (xy 151.5 111.85) (xy 151.5 97.15) (xy 164 97.15)\n      )\n    )\n    (filled_polygon\n      (pts\n        (xy 163.9238 111.318437) (xy 163.468437 111.7738) (xy 152.031563 111.7738) (xy 151.5762 111.318437) (xy 151.5762 107.6794)\n        (xy 151.744424 107.6794) (xy 151.855576 107.6794) (xy 151.958267 107.636864) (xy 152.036864 107.558267) (xy 152.0794 107.455576)\n        (xy 152.0794 107.02112) (xy 152.00955 106.95127) (xy 151.5762 106.95127) (xy 151.5762 106.94873) (xy 152.00955 106.94873)\n        (xy 152.0794 106.87888) (xy 152.0794 106.444424) (xy 152.036864 106.341733) (xy 151.958267 106.263136) (xy 151.855576 106.2206)\n        (xy 151.744424 106.2206) (xy 151.5762 106.2206) (xy 151.5762 105.3794) (xy 151.855576 105.3794) (xy 151.958267 105.336864)\n        (xy 152.036864 105.258267) (xy 152.037637 105.2564) (xy 153.1 105.2564) (xy 153.195652 105.237373) (xy 153.012426 105.4206)\n        (xy 152.694424 105.4206) (xy 152.591733 105.463136) (xy 152.513136 105.541733) (xy 152.4706 105.644424) (xy 152.4706 105.755576)\n        (xy 152.4706 106.355576) (xy 152.513136 106.458267) (xy 152.591733 106.536864) (xy 152.623446 106.55) (xy 152.591733 106.563136)\n        (xy 152.513136 106.641733) (xy 152.4706 106.744424) (xy 152.4706 107.02888) (xy 152.54045 107.09873) (xy 152.99873 107.09873)\n        (xy 152.99873 107.07873) (xy 153.00127 107.07873) (xy 153.00127 107.09873) (xy 153.45955 107.09873) (xy 153.5294 107.02888)\n        (xy 153.5294 106.744424) (xy 153.486864 106.641733) (xy 153.408267 106.563136) (xy 153.376553 106.55) (xy 153.408267 106.536864)\n        (xy 153.486864 106.458267) (xy 153.5294 106.355576) (xy 153.5294 106.244424) (xy 153.5294 105.837574) (xy 153.6206 105.746374)\n        (xy 153.6206 105.755576) (xy 153.6206 106.355576) (xy 153.663136 106.458267) (xy 153.741733 106.536864) (xy 153.773446 106.55)\n        (xy 153.741733 106.563136) (xy 153.663136 106.641733) (xy 153.6206 106.744424) (xy 153.6206 107.02888) (xy 153.69045 107.09873)\n        (xy 154.14873 107.09873) (xy 154.14873 107.07873) (xy 154.15127 107.07873) (xy 154.15127 107.09873) (xy 154.60955 107.09873)\n        (xy 154.6794 107.02888) (xy 154.6794 106.744424) (xy 154.636864 106.641733) (xy 154.558267 106.563136) (xy 154.526553 106.55)\n        (xy 154.558267 106.536864) (xy 154.636864 106.458267) (xy 154.6794 106.355576) (xy 154.6794 106.244424) (xy 154.6794 106.236217)\n        (xy 154.683487 106.233487) (xy 154.7968 106.120174) (xy 154.7968 106.634168) (xy 154.872829 106.710197) (xy 154.866513 106.716513)\n        (xy 154.794935 106.823638) (xy 154.7698 106.95) (xy 154.7698 107.213226) (xy 154.6794 107.303626) (xy 154.6794 107.17112)\n        (xy 154.60955 107.10127) (xy 154.15127 107.10127) (xy 154.15127 107.12127) (xy 154.14873 107.12127) (xy 154.14873 107.10127)\n        (xy 153.69045 107.10127) (xy 153.6206 107.17112) (xy 153.6206 107.455576) (xy 153.663136 107.558267) (xy 153.741733 107.636864)\n        (xy 153.844424 107.6794) (xy 153.880026 107.6794) (xy 153.5294 108.030025) (xy 153.5294 107.455576) (xy 153.5294 107.17112)\n        (xy 153.45955 107.10127) (xy 153.00127 107.10127) (xy 153.00127 107.60955) (xy 153.07112 107.6794) (xy 153.194424 107.6794)\n        (xy 153.305576 107.6794) (xy 153.408267 107.636864) (xy 153.486864 107.558267) (xy 153.5294 107.455576) (xy 153.5294 108.030025)\n        (xy 153.527705 108.03172) (xy 153.421607 107.960828) (xy 152.99873 107.876712) (xy 152.99873 107.60955) (xy 152.99873 107.10127)\n        (xy 152.54045 107.10127) (xy 152.4706 107.17112) (xy 152.4706 107.455576) (xy 152.513136 107.558267) (xy 152.591733 107.636864)\n        (xy 152.694424 107.6794) (xy 152.805576 107.6794) (xy 152.92888 107.6794) (xy 152.99873 107.60955) (xy 152.99873 107.876712)\n        (xy 152.9842 107.873822) (xy 152.546793 107.960828) (xy 152.175977 108.208599) (xy 151.928206 108.579415) (xy 151.8412 109.016822)\n        (xy 151.8412 109.372378) (xy 151.928206 109.809785) (xy 152.175977 110.180601) (xy 152.546793 110.428372) (xy 152.9842 110.515378)\n        (xy 153.421607 110.428372) (xy 153.792423 110.180601) (xy 154.040194 109.809785) (xy 154.1272 109.372378) (xy 154.1272 109.016822)\n        (xy 154.040194 108.579415) (xy 153.989631 108.503742) (xy 154.263173 108.2302) (xy 154.55 108.2302) (xy 154.676362 108.205065)\n        (xy 154.783487 108.133487) (xy 155.333483 107.583489) (xy 155.333486 107.583487) (xy 155.333487 107.583487) (xy 155.391 107.497411)\n        (xy 155.391 107.900317) (xy 155.086793 107.960828) (xy 154.715977 108.208599) (xy 154.468206 108.579415) (xy 154.3812 109.016822)\n        (xy 154.3812 109.372378) (xy 154.468206 109.809785) (xy 154.715977 110.180601) (xy 155.086793 110.428372) (xy 155.5242 110.515378)\n        (xy 155.961607 110.428372) (xy 156.332423 110.180601) (xy 156.580194 109.809785) (xy 156.6672 109.372378) (xy 156.6672 109.016822)\n        (xy 156.580194 108.579415) (xy 156.332423 108.208599) (xy 156.0514 108.020825) (xy 156.0514 107.2532) (xy 158.434168 107.2532)\n        (xy 159.0532 106.634168) (xy 159.0532 105.0608) (xy 159.0676 105.0608) (xy 159.193962 105.035665) (xy 159.301087 104.964087)\n        (xy 159.463138 104.802035) (xy 159.539824 104.8338) (xy 159.650976 104.8338) (xy 160.550976 104.8338) (xy 160.653667 104.791264)\n        (xy 160.732264 104.712667) (xy 160.7748 104.609976) (xy 160.7748 104.498824) (xy 160.7748 103.998824) (xy 160.732264 103.896133)\n        (xy 160.653667 103.817536) (xy 160.550976 103.775) (xy 160.439824 103.775) (xy 160.1334 103.775) (xy 160.1334 102.464376)\n        (xy 160.1334 102.353224) (xy 160.1334 102.22992) (xy 160.1334 102.08768) (xy 160.1334 101.964376) (xy 160.1334 101.853224)\n        (xy 160.1334 101.016576) (xy 160.1334 100.905424) (xy 160.1334 100.78212) (xy 160.1334 100.63988) (xy 160.1334 100.516576)\n        (xy 160.1334 100.405424) (xy 160.090864 100.302733) (xy 160.012267 100.224136) (xy 159.909576 100.1816) (xy 159.62512 100.1816)\n        (xy 159.55527 100.25145) (xy 159.55527 100.70973) (xy 160.06355 100.70973) (xy 160.1334 100.63988) (xy 160.1334 100.78212)\n        (xy 160.06355 100.71227) (xy 159.55527 100.71227) (xy 159.55527 101.17055) (xy 159.62512 101.2404) (xy 159.909576 101.2404)\n        (xy 160.012267 101.197864) (xy 160.090864 101.119267) (xy 160.1334 101.016576) (xy 160.1334 101.853224) (xy 160.090864 101.750533)\n        (xy 160.012267 101.671936) (xy 159.909576 101.6294) (xy 159.62512 101.6294) (xy 159.55527 101.69925) (xy 159.55527 102.15753)\n        (xy 160.06355 102.15753) (xy 160.1334 102.08768) (xy 160.1334 102.22992) (xy 160.06355 102.16007) (xy 159.55527 102.16007)\n        (xy 159.55527 102.61835) (xy 159.62512 102.6882) (xy 159.909576 102.6882) (xy 160.012267 102.645664) (xy 160.090864 102.567067)\n        (xy 160.1334 102.464376) (xy 160.1334 103.775) (xy 159.539824 103.775) (xy 159.437133 103.817536) (xy 159.358536 103.896133)\n        (xy 159.316 103.998824) (xy 159.316 104.033704) (xy 159.260313 104.070913) (xy 159.0532 104.278026) (xy 159.0532 104.006995)\n        (xy 159.233487 103.826708) (xy 159.305065 103.719583) (xy 159.3302 103.593221) (xy 159.330201 103.593221) (xy 159.3302 103.593215)\n        (xy 159.3302 102.6882) (xy 159.48288 102.6882) (xy 159.55273 102.61835) (xy 159.55273 102.16007) (xy 159.53273 102.16007)\n        (xy 159.53273 102.15753) (xy 159.55273 102.15753) (xy 159.55273 101.69925) (xy 159.48288 101.6294) (xy 159.3302 101.6294)\n        (xy 159.3302 101.2404) (xy 159.48288 101.2404) (xy 159.55273 101.17055) (xy 159.55273 100.71227) (xy 159.53273 100.71227)\n        (xy 159.53273 100.70973) (xy 159.55273 100.70973) (xy 159.55273 100.25145) (xy 159.48288 100.1816) (xy 159.3302 100.1816)\n        (xy 159.3302 100.086774) (xy 159.486774 99.9302) (xy 161.063226 99.9302) (xy 163.0198 101.886774) (xy 163.0198 110.213226)\n        (xy 163.0045 110.228526) (xy 163.0045 106.430776) (xy 163.0045 106.319624) (xy 163.0045 105.430624) (xy 163.0045 104.525776)\n        (xy 163.0045 104.09682) (xy 163.0045 103.95458) (xy 163.0045 103.525624) (xy 162.961964 103.422933) (xy 162.883367 103.344336)\n        (xy 162.780676 103.3018) (xy 162.669524 103.3018) (xy 162.09772 103.3018) (xy 162.02787 103.37165) (xy 162.02787 104.02443)\n        (xy 162.93465 104.02443) (xy 163.0045 103.95458) (xy 163.0045 104.09682) (xy 162.93465 104.02697) (xy 162.02787 104.02697)\n        (xy 162.02787 104.67975) (xy 162.09772 104.7496) (xy 162.669524 104.7496) (xy 162.780676 104.7496) (xy 162.883367 104.707064)\n        (xy 162.961964 104.628467) (xy 163.0045 104.525776) (xy 163.0045 105.430624) (xy 162.961964 105.327933) (xy 162.883367 105.249336)\n        (xy 162.780676 105.2068) (xy 162.669524 105.2068) (xy 162.02533 105.2068) (xy 162.02533 104.67975) (xy 162.02533 104.02697)\n        (xy 162.02533 104.02443) (xy 162.02533 103.37165) (xy 161.95548 103.3018) (xy 161.383676 103.3018) (xy 161.272524 103.3018)\n        (xy 161.169833 103.344336) (xy 161.091236 103.422933) (xy 161.0487 103.525624) (xy 161.0487 103.95458) (xy 161.11855 104.02443)\n        (xy 162.02533 104.02443) (xy 162.02533 104.02697) (xy 161.11855 104.02697) (xy 161.0487 104.09682) (xy 161.0487 104.525776)\n        (xy 161.091236 104.628467) (xy 161.169833 104.707064) (xy 161.272524 104.7496) (xy 161.383676 104.7496) (xy 161.95548 104.7496)\n        (xy 162.02533 104.67975) (xy 162.02533 105.2068) (xy 161.272524 105.2068) (xy 161.169833 105.249336) (xy 161.091236 105.327933)\n        (xy 161.0487 105.430624) (xy 161.0487 105.541776) (xy 161.0487 105.6005) (xy 160.7748 105.6005) (xy 160.7748 105.498824)\n        (xy 160.732264 105.396133) (xy 160.653667 105.317536) (xy 160.550976 105.275) (xy 160.439824 105.275) (xy 159.539824 105.275)\n        (xy 159.437133 105.317536) (xy 159.358536 105.396133) (xy 159.316 105.498824) (xy 159.316 105.609976) (xy 159.316 106.109976)\n        (xy 159.358536 106.212667) (xy 159.437133 106.291264) (xy 159.539824 106.3338) (xy 159.650976 106.3338) (xy 160.550976 106.3338)\n        (xy 160.653667 106.291264) (xy 160.684031 106.2609) (xy 161.0487 106.2609) (xy 161.0487 106.430776) (xy 161.091236 106.533467)\n        (xy 161.169833 106.612064) (xy 161.272524 106.6546) (xy 161.383676 106.6546) (xy 162.780676 106.6546) (xy 162.883367 106.612064)\n        (xy 162.961964 106.533467) (xy 163.0045 106.430776) (xy 163.0045 110.228526) (xy 162.413226 110.8198) (xy 161.7472 110.8198)\n        (xy 161.7472 110.266176) (xy 161.7472 110.155024) (xy 161.7472 109.26572) (xy 161.7472 109.12348) (xy 161.7472 108.234176)\n        (xy 161.7472 108.123024) (xy 161.704664 108.020333) (xy 161.626067 107.941736) (xy 161.523376 107.8992) (xy 160.67532 107.8992)\n        (xy 160.60547 107.96905) (xy 160.60547 109.19333) (xy 161.67735 109.19333) (xy 161.7472 109.12348) (xy 161.7472 109.26572)\n        (xy 161.67735 109.19587) (xy 160.60547 109.19587) (xy 160.60547 110.42015) (xy 160.67532 110.49) (xy 161.523376 110.49)\n        (xy 161.626067 110.447464) (xy 161.704664 110.368867) (xy 161.7472 110.266176) (xy 161.7472 110.8198) (xy 160.60293 110.8198)\n        (xy 160.60293 110.42015) (xy 160.60293 109.19587) (xy 160.60293 109.19333) (xy 160.60293 107.96905) (xy 160.53308 107.8992)\n        (xy 159.685024 107.8992) (xy 159.582333 107.941736) (xy 159.503736 108.020333) (xy 159.4612 108.123024) (xy 159.4612 108.234176)\n        (xy 159.4612 109.12348) (xy 159.53105 109.19333) (xy 160.60293 109.19333) (xy 160.60293 109.19587) (xy 159.53105 109.19587)\n        (xy 159.4612 109.26572) (xy 159.4612 110.155024) (xy 159.4612 110.266176) (xy 159.503736 110.368867) (xy 159.582333 110.447464)\n        (xy 159.685024 110.49) (xy 160.53308 110.49) (xy 160.60293 110.42015) (xy 160.60293 110.8198) (xy 158.3944 110.8198)\n        (xy 158.3944 110.449696) (xy 158.501607 110.428372) (xy 158.872423 110.180601) (xy 159.120194 109.809785) (xy 159.2072 109.372378)\n        (xy 159.2072 109.016822) (xy 159.120194 108.579415) (xy 158.872423 108.208599) (xy 158.501607 107.960828) (xy 158.0642 107.873822)\n        (xy 157.626793 107.960828) (xy 157.255977 108.208599) (xy 157.008206 108.579415) (xy 156.9212 109.016822) (xy 156.9212 109.372378)\n        (xy 157.008206 109.809785) (xy 157.255977 110.180601) (xy 157.626793 110.428372) (xy 157.734 110.449696) (xy 157.734 110.9642)\n        (xy 157.759135 111.090562) (xy 157.830713 111.197687) (xy 158.016513 111.383487) (xy 158.123638 111.455065) (xy 158.25 111.480201)\n        (xy 158.25 111.4802) (xy 158.250005 111.4802) (xy 162.55 111.4802) (xy 162.676362 111.455065) (xy 162.783487 111.383487)\n        (xy 163.583487 110.583487) (xy 163.655065 110.476362) (xy 163.6802 110.35) (xy 163.680201 110.35) (xy 163.6802 110.349994)\n        (xy 163.6802 101.75) (xy 163.655065 101.623638) (xy 163.583487 101.516513) (xy 161.433487 99.366513) (xy 161.326362 99.294935)\n        (xy 161.2 99.2698) (xy 159.35 99.2698) (xy 159.223638 99.294935) (xy 159.116513 99.366513) (xy 159.025 99.458026)\n        (xy 158.933487 99.366513) (xy 158.826362 99.294935) (xy 158.7 99.2698) (xy 154.100005 99.2698) (xy 154.1 99.269799)\n        (xy 153.973638 99.294935) (xy 153.866513 99.366513) (xy 152.766513 100.466513) (xy 152.694935 100.573638) (xy 152.6698 100.7)\n        (xy 152.6698 102.3) (xy 152.694935 102.426362) (xy 152.766513 102.533487) (xy 152.96651 102.733483) (xy 152.966513 102.733487)\n        (xy 152.966514 102.733487) (xy 153.073638 102.805065) (xy 153.2 102.830201) (xy 153.2 102.8302) (xy 153.200005 102.8302)\n        (xy 153.2206 102.8302) (xy 153.2206 102.97888) (xy 153.29045 103.04873) (xy 153.74873 103.04873) (xy 153.74873 103.02873)\n        (xy 153.75127 103.02873) (xy 153.75127 103.04873) (xy 154.20955 103.04873) (xy 154.2794 102.97888) (xy 154.2794 102.955773)\n        (xy 154.868129 103.544502) (xy 154.7968 103.615832) (xy 154.7968 104.0004) (xy 154.387007 104.0004) (xy 154.365194 103.978548)\n        (xy 154.2794 103.942923) (xy 154.2794 103.405576) (xy 154.2794 103.12112) (xy 154.20955 103.05127) (xy 153.75127 103.05127)\n        (xy 153.75127 103.55955) (xy 153.82112 103.6294) (xy 153.944424 103.6294) (xy 154.055576 103.6294) (xy 154.158267 103.586864)\n        (xy 154.236864 103.508267) (xy 154.2794 103.405576) (xy 154.2794 103.942923) (xy 154.225798 103.920666) (xy 154.074864 103.920534)\n        (xy 153.935368 103.978173) (xy 153.887912 104.025544) (xy 153.74873 103.886362) (xy 153.74873 103.55955) (xy 153.74873 103.05127)\n        (xy 153.29045 103.05127) (xy 153.2206 103.12112) (xy 153.2206 103.405576) (xy 153.263136 103.508267) (xy 153.341733 103.586864)\n        (xy 153.444424 103.6294) (xy 153.555576 103.6294) (xy 153.67888 103.6294) (xy 153.74873 103.55955) (xy 153.74873 103.886362)\n        (xy 153.675 103.812632) (xy 153.412173 104.075458) (xy 153.376346 104.076713) (xy 153.376346 103.986301) (xy 153.239069 103.92356)\n        (xy 153.088231 103.91813) (xy 152.946798 103.970835) (xy 152.923654 103.986301) (xy 152.926759 104.074963) (xy 153.15 104.298204)\n        (xy 153.373241 104.074963) (xy 153.376346 103.986301) (xy 153.376346 104.076713) (xy 153.375037 104.076759) (xy 153.151796 104.3)\n        (xy 153.165938 104.314142) (xy 153.164142 104.315938) (xy 153.15 104.301796) (xy 153.135857 104.315938) (xy 153.134061 104.314142)\n        (xy 153.148204 104.3) (xy 152.924963 104.076759) (xy 152.836301 104.073654) (xy 152.77356 104.210931) (xy 152.76813 104.361769)\n        (xy 152.798624 104.4436) (xy 152.037637 104.4436) (xy 152.036864 104.441733) (xy 151.958267 104.363136) (xy 151.855576 104.3206)\n        (xy 151.744424 104.3206) (xy 151.5762 104.3206) (xy 151.5762 97.681563) (xy 152.031563 97.2262) (xy 163.468437 97.2262)\n        (xy 163.9238 97.681563) (xy 163.9238 111.318437)\n      )\n    )\n  )\n  (zone (net 0) (net_name \"\") (layer F.Cu) (tstamp 550C7E3B) (hatch edge 0.508)\n    (connect_pads (clearance 0.2032))\n    (min_thickness 0.1524)\n    (keepout (tracks allowed) (vias allowed) (copperpour not_allowed))\n    (fill yes (arc_segments 16) (thermal_gap 0.2032) (thermal_bridge_width 0.15494) (smoothing chamfer) (radius 0.5))\n    (polygon\n      (pts\n        (xy 153.9 104.55) (xy 153.45 104.55) (xy 153.45 104.1) (xy 153.9 104.1)\n      )\n    )\n  )\n  (zone (net 0) (net_name \"\") (layer F.Cu) (tstamp 550C7E43) (hatch edge 0.508)\n    (connect_pads (clearance 0.2032))\n    (min_thickness 0.1524)\n    (keepout (tracks allowed) (vias allowed) (copperpour not_allowed))\n    (fill yes (arc_segments 16) (thermal_gap 0.2032) (thermal_bridge_width 0.15494) (smoothing chamfer) (radius 0.5))\n    (polygon\n      (pts\n        (xy 158.85 107.05) (xy 155 107.05) (xy 155 103.2) (xy 158.85 103.2)\n      )\n    )\n  )\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Layout/simonShield.kicad_pcb",
    "content": "(kicad_pcb (version 4) (host pcbnew 4.0.6-e0-6349~53~ubuntu16.04.1)\n\n  (general\n    (links 89)\n    (no_connects 5)\n    (area 66.924999 42.174999 151.204428 107.575001)\n    (thickness 1.6)\n    (drawings 25)\n    (tracks 443)\n    (zones 0)\n    (modules 46)\n    (nets 98)\n  )\n\n  (page A4 portrait)\n  (title_block\n    (title \"Poncho Juego Simon EDU-CIAA NXP\")\n    (date 2016-07-14)\n    (rev 1.0)\n    (company \"Proyecto CIAA\")\n    (comment 1 \"Juan Agustin Bassi\")\n    (comment 2 \"Diseño PCB - CESE\")\n    (comment 3 \"Licencia BSD\")\n  )\n\n  (layers\n    (0 F.Cu signal)\n    (31 B.Cu signal)\n    (32 B.Adhes user hide)\n    (33 F.Adhes user hide)\n    (34 B.Paste user hide)\n    (35 F.Paste user hide)\n    (36 B.SilkS user hide)\n    (37 F.SilkS user)\n    (38 B.Mask user hide)\n    (39 F.Mask user hide)\n    (40 Dwgs.User user hide)\n    (41 Cmts.User user hide)\n    (42 Eco1.User user hide)\n    (43 Eco2.User user hide)\n    (44 Edge.Cuts user)\n    (45 Margin user hide)\n    (46 B.CrtYd user)\n    (47 F.CrtYd user)\n    (48 B.Fab user)\n    (49 F.Fab user)\n  )\n\n  (setup\n    (last_trace_width 1.2)\n    (user_trace_width 0.3)\n    (user_trace_width 0.45)\n    (user_trace_width 0.6)\n    (user_trace_width 0.9)\n    (user_trace_width 1.2)\n    (user_trace_width 1.5)\n    (trace_clearance 0.3)\n    (zone_clearance 0.5)\n    (zone_45_only yes)\n    (trace_min 0.3)\n    (segment_width 0.2)\n    (edge_width 0.15)\n    (via_size 1.27)\n    (via_drill 0.7112)\n    (via_min_size 1.27)\n    (via_min_drill 0.7112)\n    (user_via 1.27 0.7112)\n    (uvia_size 0.508)\n    (uvia_drill 0.254)\n    (uvias_allowed no)\n    (uvia_min_size 0.508)\n    (uvia_min_drill 0.254)\n    (pcb_text_width 0.3)\n    (pcb_text_size 1.5 1.5)\n    (mod_edge_width 0.15)\n    (mod_text_size 1 1)\n    (mod_text_width 0.15)\n    (pad_size 1.524 1.524)\n    (pad_drill 0.762)\n    (pad_to_mask_clearance 0.2)\n    (aux_axis_origin 0 0)\n    (visible_elements 7FFDD7EF)\n    (pcbplotparams\n      (layerselection 0x00020_80000000)\n      (usegerberextensions false)\n      (excludeedgelayer false)\n      (linewidth 0.100000)\n      (plotframeref false)\n      (viasonmask false)\n      (mode 1)\n      (useauxorigin false)\n      (hpglpennumber 1)\n      (hpglpenspeed 20)\n      (hpglpendiameter 15)\n      (hpglpenoverlay 2)\n      (psnegative false)\n      (psa4output false)\n      (plotreference false)\n      (plotvalue false)\n      (plotinvisibletext false)\n      (padsonsilk true)\n      (subtractmaskfromsilk false)\n      (outputformat 4)\n      (mirror false)\n      (drillshape 1)\n      (scaleselection 1)\n      (outputdirectory \"\"))\n  )\n\n  (net 0 \"\")\n  (net 1 GND)\n  (net 2 \"Net-(D1-Pad2)\")\n  (net 3 \"Net-(D2-Pad2)\")\n  (net 4 \"Net-(D4-Pad2)\")\n  (net 5 \"Net-(Q1-Pad2)\")\n  (net 6 \"Net-(Q1-Pad3)\")\n  (net 7 \"Net-(Q2-Pad2)\")\n  (net 8 \"Net-(Q2-Pad1)\")\n  (net 9 \"Net-(Q3-Pad2)\")\n  (net 10 \"Net-(Q3-Pad1)\")\n  (net 11 \"Net-(Q5-Pad2)\")\n  (net 12 \"Net-(Q5-Pad1)\")\n  (net 13 /buttons/BTN_LED_1)\n  (net 14 /buttons/BTN_CFG_1)\n  (net 15 /buttons/BTN_LED_2)\n  (net 16 /buttons/BTN_CFG_2)\n  (net 17 /buttons/BTN_CFG_3)\n  (net 18 /buttons/BTN_LED_4)\n  (net 19 \"Net-(Q1-Pad1)\")\n  (net 20 \"Net-(D3-Pad2)\")\n  (net 21 \"Net-(Q4-Pad2)\")\n  (net 22 \"Net-(Q4-Pad1)\")\n  (net 23 /buttons/BTN_LED_3)\n  (net 24 /buttons/BTN_CFG_4)\n  (net 25 \"Net-(P1-Pad1)\")\n  (net 26 \"Net-(P1-Pad3)\")\n  (net 27 /ciaaConector/LED_1)\n  (net 28 /ciaaConector/LED_2)\n  (net 29 /ciaaConector/LED_3)\n  (net 30 /ciaaConector/LED_4)\n  (net 31 /ciaaConector/PWM)\n  (net 32 VCC)\n  (net 33 \"Net-(F1-Pad1)\")\n  (net 34 \"Net-(F2-Pad1)\")\n  (net 35 \"Net-(F3-Pad1)\")\n  (net 36 \"Net-(XA1-Pad1)\")\n  (net 37 \"Net-(XA1-Pad2)\")\n  (net 38 \"Net-(XA1-Pad11)\")\n  (net 39 \"Net-(XA1-Pad4)\")\n  (net 40 \"Net-(XA1-Pad13)\")\n  (net 41 \"Net-(XA1-Pad6)\")\n  (net 42 \"Net-(XA1-Pad15)\")\n  (net 43 \"Net-(XA1-Pad8)\")\n  (net 44 \"Net-(XA1-Pad17)\")\n  (net 45 \"Net-(XA1-Pad10)\")\n  (net 46 \"Net-(XA1-Pad19)\")\n  (net 47 \"Net-(XA1-Pad12)\")\n  (net 48 \"Net-(XA1-Pad21)\")\n  (net 49 \"Net-(XA1-Pad14)\")\n  (net 50 \"Net-(XA1-Pad23)\")\n  (net 51 \"Net-(XA1-Pad16)\")\n  (net 52 \"Net-(XA1-Pad25)\")\n  (net 53 \"Net-(XA1-Pad18)\")\n  (net 54 \"Net-(XA1-Pad27)\")\n  (net 55 \"Net-(XA1-Pad20)\")\n  (net 56 \"Net-(XA1-Pad29)\")\n  (net 57 \"Net-(XA1-Pad22)\")\n  (net 58 \"Net-(XA1-Pad31)\")\n  (net 59 \"Net-(XA1-Pad24)\")\n  (net 60 \"Net-(XA1-Pad26)\")\n  (net 61 \"Net-(XA1-Pad33)\")\n  (net 62 \"Net-(XA1-Pad28)\")\n  (net 63 \"Net-(XA1-Pad32)\")\n  (net 64 \"Net-(XA1-Pad34)\")\n  (net 65 \"Net-(XA1-Pad36)\")\n  (net 66 \"Net-(XA1-Pad38)\")\n  (net 67 \"Net-(XA1-Pad35)\")\n  (net 68 \"Net-(XA1-Pad37)\")\n  (net 69 \"Net-(XA1-Pad3)\")\n  (net 70 \"Net-(XA1-Pad5)\")\n  (net 71 \"Net-(XA1-Pad7)\")\n  (net 72 \"Net-(XA1-Pad9)\")\n  (net 73 \"Net-(XA1-Pad39)\")\n  (net 74 \"Net-(XA1-Pad40)\")\n  (net 75 \"Net-(XA1-Pad30)\")\n  (net 76 \"Net-(XA1-Pad44)\")\n  (net 77 \"Net-(XA1-Pad45)\")\n  (net 78 \"Net-(XA1-Pad46)\")\n  (net 79 \"Net-(XA1-Pad47)\")\n  (net 80 \"Net-(XA1-Pad48)\")\n  (net 81 \"Net-(XA1-Pad50)\")\n  (net 82 \"Net-(XA1-Pad51)\")\n  (net 83 \"Net-(XA1-Pad52)\")\n  (net 84 \"Net-(XA1-Pad53)\")\n  (net 85 \"Net-(XA1-Pad54)\")\n  (net 86 \"Net-(XA1-Pad55)\")\n  (net 87 \"Net-(XA1-Pad56)\")\n  (net 88 \"Net-(XA1-Pad57)\")\n  (net 89 \"Net-(XA1-Pad59)\")\n  (net 90 \"Net-(XA1-Pad61)\")\n  (net 91 \"Net-(XA1-Pad63)\")\n  (net 92 \"Net-(XA1-Pad65)\")\n  (net 93 \"Net-(XA1-Pad67)\")\n  (net 94 \"Net-(XA1-Pad69)\")\n  (net 95 \"Net-(XA1-Pad70)\")\n  (net 96 \"Net-(XA1-Pad71)\")\n  (net 97 \"Net-(XA1-Pad72)\")\n\n  (net_class Default \"This is the default net class.\"\n    (clearance 0.3)\n    (trace_width 0.3)\n    (via_dia 1.27)\n    (via_drill 0.7112)\n    (uvia_dia 0.508)\n    (uvia_drill 0.254)\n    (add_net /buttons/BTN_CFG_1)\n    (add_net /buttons/BTN_CFG_2)\n    (add_net /buttons/BTN_CFG_3)\n    (add_net /buttons/BTN_CFG_4)\n    (add_net /buttons/BTN_LED_1)\n    (add_net /buttons/BTN_LED_2)\n    (add_net /buttons/BTN_LED_3)\n    (add_net /buttons/BTN_LED_4)\n    (add_net /ciaaConector/LED_1)\n    (add_net /ciaaConector/LED_2)\n    (add_net /ciaaConector/LED_3)\n    (add_net /ciaaConector/LED_4)\n    (add_net /ciaaConector/PWM)\n    (add_net GND)\n    (add_net \"Net-(D1-Pad2)\")\n    (add_net \"Net-(D2-Pad2)\")\n    (add_net \"Net-(D3-Pad2)\")\n    (add_net \"Net-(D4-Pad2)\")\n    (add_net \"Net-(F1-Pad1)\")\n    (add_net \"Net-(F2-Pad1)\")\n    (add_net \"Net-(F3-Pad1)\")\n    (add_net \"Net-(P1-Pad1)\")\n    (add_net \"Net-(P1-Pad3)\")\n    (add_net \"Net-(Q1-Pad1)\")\n    (add_net \"Net-(Q1-Pad2)\")\n    (add_net \"Net-(Q1-Pad3)\")\n    (add_net \"Net-(Q2-Pad1)\")\n    (add_net \"Net-(Q2-Pad2)\")\n    (add_net \"Net-(Q3-Pad1)\")\n    (add_net \"Net-(Q3-Pad2)\")\n    (add_net \"Net-(Q4-Pad1)\")\n    (add_net \"Net-(Q4-Pad2)\")\n    (add_net \"Net-(Q5-Pad1)\")\n    (add_net \"Net-(Q5-Pad2)\")\n    (add_net \"Net-(XA1-Pad1)\")\n    (add_net \"Net-(XA1-Pad10)\")\n    (add_net \"Net-(XA1-Pad11)\")\n    (add_net \"Net-(XA1-Pad12)\")\n    (add_net \"Net-(XA1-Pad13)\")\n    (add_net \"Net-(XA1-Pad14)\")\n    (add_net \"Net-(XA1-Pad15)\")\n    (add_net \"Net-(XA1-Pad16)\")\n    (add_net \"Net-(XA1-Pad17)\")\n    (add_net \"Net-(XA1-Pad18)\")\n    (add_net \"Net-(XA1-Pad19)\")\n    (add_net \"Net-(XA1-Pad2)\")\n    (add_net \"Net-(XA1-Pad20)\")\n    (add_net \"Net-(XA1-Pad21)\")\n    (add_net \"Net-(XA1-Pad22)\")\n    (add_net \"Net-(XA1-Pad23)\")\n    (add_net \"Net-(XA1-Pad24)\")\n    (add_net \"Net-(XA1-Pad25)\")\n    (add_net \"Net-(XA1-Pad26)\")\n    (add_net \"Net-(XA1-Pad27)\")\n    (add_net \"Net-(XA1-Pad28)\")\n    (add_net \"Net-(XA1-Pad29)\")\n    (add_net \"Net-(XA1-Pad3)\")\n    (add_net \"Net-(XA1-Pad30)\")\n    (add_net \"Net-(XA1-Pad31)\")\n    (add_net \"Net-(XA1-Pad32)\")\n    (add_net \"Net-(XA1-Pad33)\")\n    (add_net \"Net-(XA1-Pad34)\")\n    (add_net \"Net-(XA1-Pad35)\")\n    (add_net \"Net-(XA1-Pad36)\")\n    (add_net \"Net-(XA1-Pad37)\")\n    (add_net \"Net-(XA1-Pad38)\")\n    (add_net \"Net-(XA1-Pad39)\")\n    (add_net \"Net-(XA1-Pad4)\")\n    (add_net \"Net-(XA1-Pad40)\")\n    (add_net \"Net-(XA1-Pad44)\")\n    (add_net \"Net-(XA1-Pad45)\")\n    (add_net \"Net-(XA1-Pad46)\")\n    (add_net \"Net-(XA1-Pad47)\")\n    (add_net \"Net-(XA1-Pad48)\")\n    (add_net \"Net-(XA1-Pad5)\")\n    (add_net \"Net-(XA1-Pad50)\")\n    (add_net \"Net-(XA1-Pad51)\")\n    (add_net \"Net-(XA1-Pad52)\")\n    (add_net \"Net-(XA1-Pad53)\")\n    (add_net \"Net-(XA1-Pad54)\")\n    (add_net \"Net-(XA1-Pad55)\")\n    (add_net \"Net-(XA1-Pad56)\")\n    (add_net \"Net-(XA1-Pad57)\")\n    (add_net \"Net-(XA1-Pad59)\")\n    (add_net \"Net-(XA1-Pad6)\")\n    (add_net \"Net-(XA1-Pad61)\")\n    (add_net \"Net-(XA1-Pad63)\")\n    (add_net \"Net-(XA1-Pad65)\")\n    (add_net \"Net-(XA1-Pad67)\")\n    (add_net \"Net-(XA1-Pad69)\")\n    (add_net \"Net-(XA1-Pad7)\")\n    (add_net \"Net-(XA1-Pad70)\")\n    (add_net \"Net-(XA1-Pad71)\")\n    (add_net \"Net-(XA1-Pad72)\")\n    (add_net \"Net-(XA1-Pad8)\")\n    (add_net \"Net-(XA1-Pad9)\")\n    (add_net VCC)\n  )\n\n  (module simonShield:MagneticBuzzer_ProSignal_ABT-410-RC (layer F.Cu) (tedit 544E5504) (tstamp 5957451D)\n    (at 111.178971 53.624429 180)\n    (descr \"Buzzer, Elektromagnetic Beeper, Summer, 1,5V-DC,\")\n    (tags \"Pro Signal, ABT-410-RC,\")\n    (path /5797F3F6)\n    (fp_text reference U1 (at 3.175 -8.001 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BUZZER (at 2.17424 8.001 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start 8.17626 -0.50038) (end 8.17626 0.50038) (layer F.SilkS) (width 0.15))\n    (fp_line (start 7.67588 0) (end 8.6741 0) (layer F.SilkS) (width 0.15))\n    (fp_circle (center 3.175 0) (end 4.17576 0) (layer F.SilkS) (width 0.15))\n    (fp_text user + (at 10.67562 0 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 3.175 0) (end 9.37514 0) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 180) (size 1.6002 1.6002) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 6 \"Net-(Q1-Pad3)\"))\n    (pad 2 thru_hole circle (at 6.35 0 180) (size 1.6002 1.6002) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (model Buzzers_Beepers.3dshapes/MagneticBuzzer_ProSignal_ABT-410-RC.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 59574511)\n    (at 112.877 94.402 270)\n    (path /5777D5BA/5777DCA9)\n    (fp_text reference SW8 (at 0 -0.762 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 24 /buttons/BTN_CFG_4))\n    (pad 2 thru_hole circle (at 3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 24 /buttons/BTN_CFG_4))\n    (pad 2 thru_hole circle (at -3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 59574505)\n    (at 124.053 94.402 270)\n    (path /5777D5BA/5777DC21)\n    (fp_text reference SW7 (at 0 -0.762 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 18 /buttons/BTN_LED_4))\n    (pad 2 thru_hole circle (at 3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 18 /buttons/BTN_LED_4))\n    (pad 2 thru_hole circle (at -3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744F9)\n    (at 93.827 94.529 90)\n    (path /5777D5BA/5777DC87)\n    (fp_text reference SW6 (at 0 -0.762 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 17 /buttons/BTN_CFG_3))\n    (pad 2 thru_hole circle (at 3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 17 /buttons/BTN_CFG_3))\n    (pad 2 thru_hole circle (at -3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744ED)\n    (at 105.003 94.529 90)\n    (path /5777D5BA/5777DBFF)\n    (fp_text reference SW5 (at 0 -0.762 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 23 /buttons/BTN_LED_3))\n    (pad 2 thru_hole circle (at 3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 23 /buttons/BTN_LED_3))\n    (pad 2 thru_hole circle (at -3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744E1)\n    (at 112.877 71.034 270)\n    (path /5777D5BA/5777DC65)\n    (fp_text reference SW4 (at 0 -0.762 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 16 /buttons/BTN_CFG_2))\n    (pad 2 thru_hole circle (at 3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 16 /buttons/BTN_CFG_2))\n    (pad 2 thru_hole circle (at -3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744D5)\n    (at 124.053 71.034 270)\n    (path /5777D5BA/5777DBDD)\n    (fp_text reference SW3 (at 0 -0.762 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 15 /buttons/BTN_LED_2))\n    (pad 2 thru_hole circle (at 3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 15 /buttons/BTN_LED_2))\n    (pad 2 thru_hole circle (at -3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744C9)\n    (at 105.003 71.034 90)\n    (path /5777D5BA/5777DC43)\n    (fp_text reference SW2 (at 0 -0.762 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 14 /buttons/BTN_CFG_1))\n    (pad 2 thru_hole circle (at 3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 14 /buttons/BTN_CFG_1))\n    (pad 2 thru_hole circle (at -3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744BD)\n    (at 93.827 71.034 90)\n    (path /5777D5BA/5777DBBB)\n    (fp_text reference SW1 (at 0 -0.762 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 13 /buttons/BTN_LED_1))\n    (pad 2 thru_hole circle (at 3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 13 /buttons/BTN_LED_1))\n    (pad 2 thru_hole circle (at -3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module Resistors_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal (layer F.Cu) (tedit 59573715) (tstamp 595744A8)\n    (at 109 88.5 90)\n    (descr \"Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf\")\n    (tags \"Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm\")\n    (path /59572DE1)\n    (fp_text reference \"R 0 Ohm\" (at 5.25 3.25 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value R (at 5.08 2.31 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start 1.93 -1.25) (end 1.93 1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 1.93 1.25) (end 8.23 1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 8.23 1.25) (end 8.23 -1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 8.23 -1.25) (end 1.93 -1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 0 0) (end 1.93 0) (layer F.Fab) (width 0.1))\n    (fp_line (start 10.16 0) (end 8.23 0) (layer F.Fab) (width 0.1))\n    (fp_line (start 1.87 -1.31) (end 1.87 1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 1.87 1.31) (end 8.29 1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 8.29 1.31) (end 8.29 -1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 8.29 -1.31) (end 1.87 -1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 0.98 0) (end 1.87 0) (layer F.SilkS) (width 0.12))\n    (fp_line (start 9.18 0) (end 8.29 0) (layer F.SilkS) (width 0.12))\n    (fp_line (start -1.05 -1.6) (end -1.05 1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.05 1.6) (end 11.25 1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 11.25 1.6) (end 11.25 -1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 11.25 -1.6) (end -1.05 -1.6) (layer F.CrtYd) (width 0.05))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)\n      (net 1 GND))\n    (pad 2 thru_hole oval (at 10.16 0 90) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)\n      (net 1 GND))\n    (model Resistors_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 0.393701 0.393701 0.393701))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957367C) (tstamp 5957449B)\n    (at 137.515 98.085 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/57797248)\n    (fp_text reference R18 (at 3.585 -0.015 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 680 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 12 \"Net-(Q5-Pad1)\"))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573680) (tstamp 5957448E)\n    (at 133.959 98.085 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/577970B7)\n    (fp_text reference R17 (at 3.585 0.041 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 10K (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 30 /ciaaConector/LED_4))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 11 \"Net-(Q5-Pad2)\"))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957362E) (tstamp 59574481)\n    (at 80.365 97.958 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/577971BC)\n    (fp_text reference R16 (at 3.958 -0.115 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 680 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 22 \"Net-(Q4-Pad1)\"))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573629) (tstamp 59574474)\n    (at 83.921 97.958 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/5779705E)\n    (fp_text reference R15 (at 3.458 -0.171 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 10K (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 29 /ciaaConector/LED_3))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 21 \"Net-(Q4-Pad2)\"))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573694) (tstamp 59574467)\n    (at 137.515 74.717 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/57797169)\n    (fp_text reference R14 (at 3.967 -0.015 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 680 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 10 \"Net-(Q3-Pad1)\"))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573698) (tstamp 5957445A)\n    (at 134.086 74.717 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/57796FE6)\n    (fp_text reference R13 (at 3.967 0.164 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 10K (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 28 /ciaaConector/LED_2))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 9 \"Net-(Q3-Pad2)\"))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957364F) (tstamp 5957444D)\n    (at 80.365 74.717 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/57780BC7)\n    (fp_text reference R12 (at 3.967 -0.115 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 680 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 8 \"Net-(Q2-Pad1)\"))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957364C) (tstamp 59574440)\n    (at 83.921 74.717 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/57780BCE)\n    (fp_text reference R11 (at 3.967 -0.171 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 10K (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 27 /ciaaConector/LED_1))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 7 \"Net-(Q2-Pad2)\"))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 595735F8) (tstamp 59574433)\n    (at 123.164 49.063 180)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5797F41B)\n    (fp_text reference R10 (at 3.914 0.063 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 1K (at 3.81 3.81 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n    (pad 2 thru_hole circle (at 7.62 0 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 19 \"Net-(Q1-Pad1)\"))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 595735FE) (tstamp 59574426)\n    (at 123.164 52.111 180)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5797F406)\n    (fp_text reference R9 (at 3.914 0.111 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 5 \"Net-(Q1-Pad2)\"))\n    (pad 2 thru_hole circle (at 7.62 0 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 31 /ciaaConector/PWM))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957363D) (tstamp 59574419)\n    (at 118.465 98.339 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/57796AEC)\n    (fp_text reference R8 (at 3.839 0.035 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 24 /buttons/BTN_CFG_4))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573684) (tstamp 5957440C)\n    (at 129.641 98.085 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/577968BC)\n    (fp_text reference R7 (at 3.835 0.109 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 18 /buttons/BTN_LED_4))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573623) (tstamp 595743FF)\n    (at 88.239 97.958 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/57796A6F)\n    (fp_text reference R6 (at 4.208 0.011 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 17 /buttons/BTN_CFG_3))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573637) (tstamp 595743F2)\n    (at 99.415 98.466 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/57796847)\n    (fp_text reference R5 (at 3.966 0.085 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 23 /buttons/BTN_LED_3))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957369C) (tstamp 595743E5)\n    (at 129.641 74.717 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/577967E7)\n    (fp_text reference R3 (at 3.717 0.109 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 15 /buttons/BTN_LED_2))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573654) (tstamp 595743D8)\n    (at 99.415 74.844 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/5779693E)\n    (fp_text reference R2 (at 3.844 0.085 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 14 /buttons/BTN_CFG_1))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573648) (tstamp 595743CB)\n    (at 88.239 74.844 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/5777DBC2)\n    (fp_text reference R1 (at 4.094 0.261 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 13 /buttons/BTN_LED_1))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:TO-92_Molded_Narrow (layer F.Cu) (tedit 5957368B) (tstamp 595743BE)\n    (at 137.007 85.512 180)\n    (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n    (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n    (path /57780685/57780C35)\n    (fp_text reference Q5 (at 3.257 3.262 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BC547 (at 0 3 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (pad 2 thru_hole circle (at 1.27 -1.27 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 11 \"Net-(Q5-Pad2)\"))\n    (pad 3 thru_hole circle (at 2.54 0 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 4 \"Net-(D4-Pad2)\"))\n    (pad 1 thru_hole circle (at 0 0 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 12 \"Net-(Q5-Pad1)\"))\n    (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 -90))\n    )\n  )\n\n  (module simonShield:TO-92_Molded_Narrow (layer F.Cu) (tedit 5957365A) (tstamp 595743B1)\n    (at 80.873 85.512)\n    (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n    (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n    (path /57780685/57780C0C)\n    (fp_text reference Q4 (at 2.377 -4.012) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BC547 (at 0 3) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (pad 2 thru_hole circle (at 1.27 -1.27 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 21 \"Net-(Q4-Pad2)\"))\n    (pad 3 thru_hole circle (at 2.54 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 20 \"Net-(D3-Pad2)\"))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 22 \"Net-(Q4-Pad1)\"))\n    (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 -90))\n    )\n  )\n\n  (module simonShield:TO-92_Molded_Narrow (layer F.Cu) (tedit 5957360A) (tstamp 595743A4)\n    (at 137.007 62.144 180)\n    (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n    (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n    (path /57780685/57780BE3)\n    (fp_text reference Q3 (at 1.507 3.644 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BC547 (at 0 3 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (pad 2 thru_hole circle (at 1.27 -1.27 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 9 \"Net-(Q3-Pad2)\"))\n    (pad 3 thru_hole circle (at 2.54 0 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 3 \"Net-(D2-Pad2)\"))\n    (pad 1 thru_hole circle (at 0 0 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 10 \"Net-(Q3-Pad1)\"))\n    (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 -90))\n    )\n  )\n\n  (module simonShield:TO-92_Molded_Narrow (layer F.Cu) (tedit 54F242E1) (tstamp 59574397)\n    (at 80.873 62.144)\n    (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n    (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n    (path /57780685/57780BC0)\n    (fp_text reference Q2 (at 0 -4) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BC547 (at 0 3) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (pad 2 thru_hole circle (at 1.27 -1.27 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 7 \"Net-(Q2-Pad2)\"))\n    (pad 3 thru_hole circle (at 2.54 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 2 \"Net-(D1-Pad2)\"))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 8 \"Net-(Q2-Pad1)\"))\n    (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 -90))\n    )\n  )\n\n  (module simonShield:TO-92_Molded_Narrow (layer F.Cu) (tedit 54F242E1) (tstamp 5957438A)\n    (at 118.973 55.286 270)\n    (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n    (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n    (path /5797F3FE)\n    (fp_text reference Q1 (at 0 -4 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BC547 (at 0 3 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (pad 2 thru_hole circle (at 1.27 -1.27) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 5 \"Net-(Q1-Pad2)\"))\n    (pad 3 thru_hole circle (at 2.54 0) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 6 \"Net-(Q1-Pad3)\"))\n    (pad 1 thru_hole circle (at 0 0) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 19 \"Net-(Q1-Pad1)\"))\n    (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 -90))\n    )\n  )\n\n  (module simonShield:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 0) (tstamp 59574377)\n    (at 81.0078 51.0427)\n    (descr \"Through hole pin header\")\n    (tags \"pin header\")\n    (path /57781B52/57781CF6)\n    (fp_text reference P1 (at 0 -5.1) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value PWR_JUMPER (at 0 -3.1) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15))\n    (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole rect (at 0 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 25 \"Net-(P1-Pad1)\"))\n    (pad 2 thru_hole oval (at 2.54 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 32 VCC))\n    (pad 3 thru_hole oval (at 0 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 26 \"Net-(P1-Pad3)\"))\n    (pad 4 thru_hole oval (at 2.54 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 32 VCC))\n    (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl\n      (at (xyz 0.05 -0.05 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 90))\n    )\n  )\n\n  (module simonShield:Fiducial_1mm (layer F.Cu) (tedit 573E1507) (tstamp 59574373)\n    (at 121.25 81.75)\n    (path /577D5FF6)\n    (clearance 1.524)\n    (fp_text reference F3 (at 0.02 -0.9) (layer F.SilkS) hide\n      (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n    )\n    (fp_text value FIDUCIAL (at 0 0.99) (layer F.SilkS) hide\n      (effects (font (size 0.254 0.254) (thickness 0.00254)))\n    )\n    (pad 1 smd circle (at 0 0) (size 1 1) (layers F.Cu F.Mask)\n      (net 35 \"Net-(F3-Pad1)\") (solder_mask_margin 1.5))\n  )\n\n  (module simonShield:Fiducial_1mm (layer F.Cu) (tedit 573E1507) (tstamp 5957436F)\n    (at 114.5 60)\n    (path /577D5F36)\n    (clearance 1.524)\n    (fp_text reference F2 (at 0.02 -0.9) (layer F.SilkS) hide\n      (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n    )\n    (fp_text value FIDUCIAL (at 0 0.99) (layer F.SilkS) hide\n      (effects (font (size 0.254 0.254) (thickness 0.00254)))\n    )\n    (pad 1 smd circle (at 0 0) (size 1 1) (layers F.Cu F.Mask)\n      (net 34 \"Net-(F2-Pad1)\") (solder_mask_margin 1.5))\n  )\n\n  (module simonShield:Fiducial_1mm (layer F.Cu) (tedit 573E1507) (tstamp 5957436B)\n    (at 79.25 101.75)\n    (path /577D561F)\n    (clearance 1.524)\n    (fp_text reference F1 (at 0.02 -0.9) (layer F.SilkS) hide\n      (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n    )\n    (fp_text value FIDUCIAL (at 0 0.99) (layer F.SilkS) hide\n      (effects (font (size 0.254 0.254) (thickness 0.00254)))\n    )\n    (pad 1 smd circle (at 0 0) (size 1 1) (layers F.Cu F.Mask)\n      (net 33 \"Net-(F1-Pad1)\") (solder_mask_margin 1.5))\n  )\n\n  (module simonShield:LED-5MM (layer F.Cu) (tedit 59573672) (tstamp 59574360)\n    (at 127.863 85.512)\n    (descr \"LED 5mm round vertical\")\n    (tags \"LED 5mm round vertical\")\n    (path /57780685/577975B8)\n    (fp_text reference D4 (at -3.113 -0.512) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value VERDE (at 1.524 -3.937) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.5 -1.55) (end -1.5 1.55) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.3 0) (end -1.5 1.55) (angle -302) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.27 0) (end -1.23 -1.5) (angle 297.5) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.23 1.5) (end -1.23 -1.5) (layer F.SilkS) (width 0.15))\n    (fp_circle (center 1.27 0) (end 0.97 -2.5) (layer F.SilkS) (width 0.15))\n    (fp_text user K (at -3.113 1.238) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (pad 1 thru_hole rect (at 0 0 90) (size 2 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 2 thru_hole circle (at 2.54 0) (size 1.9 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 4 \"Net-(D4-Pad2)\"))\n    (model LEDs.3dshapes/LED-5MM.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 90))\n    )\n  )\n\n  (module simonShield:LED-5MM (layer F.Cu) (tedit 59573664) (tstamp 59574355)\n    (at 90.017 85.639 180)\n    (descr \"LED 5mm round vertical\")\n    (tags \"LED 5mm round vertical\")\n    (path /57780685/5779752F)\n    (fp_text reference D3 (at -2.983 -0.111 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value ROJO (at 1.524 -3.937 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.5 -1.55) (end -1.5 1.55) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.3 0) (end -1.5 1.55) (angle -302) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.27 0) (end -1.23 -1.5) (angle 297.5) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.23 1.5) (end -1.23 -1.5) (layer F.SilkS) (width 0.15))\n    (fp_circle (center 1.27 0) (end 0.97 -2.5) (layer F.SilkS) (width 0.15))\n    (fp_text user K (at -1.905 1.905 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (pad 1 thru_hole rect (at 0 0 270) (size 2 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 2 thru_hole circle (at 2.54 0 180) (size 1.9 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 20 \"Net-(D3-Pad2)\"))\n    (model LEDs.3dshapes/LED-5MM.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 90))\n    )\n  )\n\n  (module simonShield:LED-5MM (layer F.Cu) (tedit 595736A9) (tstamp 5957434A)\n    (at 127.863 62.144)\n    (descr \"LED 5mm round vertical\")\n    (tags \"LED 5mm round vertical\")\n    (path /57780685/5779749F)\n    (fp_text reference D2 (at -2.863 -1.894) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value AZUL (at 1.524 -3.937) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.5 -1.55) (end -1.5 1.55) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.3 0) (end -1.5 1.55) (angle -302) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.27 0) (end -1.23 -1.5) (angle 297.5) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.23 1.5) (end -1.23 -1.5) (layer F.SilkS) (width 0.15))\n    (fp_circle (center 1.27 0) (end 0.97 -2.5) (layer F.SilkS) (width 0.15))\n    (fp_text user K (at -3.113 -0.144) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (pad 1 thru_hole rect (at 0 0 90) (size 2 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 2 thru_hole circle (at 2.54 0) (size 1.9 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 3 \"Net-(D2-Pad2)\"))\n    (model LEDs.3dshapes/LED-5MM.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 90))\n    )\n  )\n\n  (module simonShield:LED-5MM (layer F.Cu) (tedit 59573791) (tstamp 5957433F)\n    (at 90.017 62.144 180)\n    (descr \"LED 5mm round vertical\")\n    (tags \"LED 5mm round vertical\")\n    (path /57780685/57780BD5)\n    (fp_text reference D1 (at -2.733 -0.106 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value AMARILLO (at 1.524 -3.937 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.5 -1.55) (end -1.5 1.55) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.3 0) (end -1.5 1.55) (angle -302) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.27 0) (end -1.23 -1.5) (angle 297.5) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.23 1.5) (end -1.23 -1.5) (layer F.SilkS) (width 0.15))\n    (fp_circle (center 1.27 0) (end 0.97 -2.5) (layer F.SilkS) (width 0.15))\n    (fp_text user K (at -1.905 1.905 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (pad 1 thru_hole rect (at 0 0 270) (size 2 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 2 thru_hole circle (at 2.54 0 180) (size 1.9 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 2 \"Net-(D1-Pad2)\"))\n    (model LEDs.3dshapes/LED-5MM.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 90))\n    )\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 595736A0) (tstamp 59574332)\n    (at 118.465 74.971 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/577969F3)\n    (fp_text reference R4 (at 4.221 0.035 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 16 /buttons/BTN_CFG_2))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Logo_Poncho (layer F.Cu) (tedit 59573768) (tstamp 5957432A)\n    (at 131 49.5)\n    (fp_text reference G*** (at 0.127 5.588 90) (layer F.SilkS) hide\n      (effects (font (thickness 0.3)))\n    )\n    (fp_text value LOGO (at 0.762 7.493) (layer F.SilkS) hide\n      (effects (font (thickness 0.3)))\n    )\n    (fp_poly (pts (xy 4.535714 -0.627021) (xy 4.498746 -0.420109) (xy 4.405012 -0.1352) (xy 4.280272 0.162897)\n      (xy 4.150281 0.409374) (xy 4.123376 0.447413) (xy 4.123376 -0.123701) (xy 4.058326 -0.436938)\n      (xy 3.869112 -0.644378) (xy 3.564639 -0.737671) (xy 3.463636 -0.742208) (xy 3.129516 -0.681223)\n      (xy 2.908248 -0.503835) (xy 2.808734 -0.218392) (xy 2.803896 -0.123701) (xy 2.868946 0.189536)\n      (xy 3.058159 0.396975) (xy 3.362633 0.490269) (xy 3.463636 0.494805) (xy 3.797606 0.436492)\n      (xy 3.958441 0.32987) (xy 4.092315 0.09203) (xy 4.123376 -0.123701) (xy 4.123376 0.447413)\n      (xy 4.089856 0.494805) (xy 4.013749 0.621925) (xy 3.89522 0.861365) (xy 3.753792 1.172585)\n      (xy 3.672876 1.360714) (xy 3.421635 1.929272) (xy 3.149718 2.496808) (xy 2.869494 3.041693)\n      (xy 2.593334 3.542296) (xy 2.556493 3.603955) (xy 2.556493 -0.123701) (xy 2.552598 -0.439936)\n      (xy 2.534834 -0.625484) (xy 2.494089 -0.714524) (xy 2.421247 -0.741238) (xy 2.391558 -0.742208)\n      (xy 2.270831 -0.703329) (xy 2.228325 -0.558669) (xy 2.226623 -0.494805) (xy 2.206189 -0.31957)\n      (xy 2.109798 -0.254982) (xy 1.97922 -0.247402) (xy 1.803985 -0.267837) (xy 1.739397 -0.364227)\n      (xy 1.731818 -0.494805) (xy 1.705898 -0.675896) (xy 1.609459 -0.739655) (xy 1.566883 -0.742208)\n      (xy 1.482553 -0.727599) (xy 1.433074 -0.660988) (xy 1.40933 -0.508193) (xy 1.402206 -0.235036)\n      (xy 1.401948 -0.123701) (xy 1.405843 0.192533) (xy 1.423606 0.378081) (xy 1.464351 0.467122)\n      (xy 1.537193 0.493835) (xy 1.566883 0.494805) (xy 1.680559 0.462518) (xy 1.726426 0.336472)\n      (xy 1.731818 0.206169) (xy 1.745609 0.012245) (xy 1.815564 -0.067294) (xy 1.97922 -0.082467)\n      (xy 2.145441 -0.066377) (xy 2.213617 0.015237) (xy 2.226623 0.206169) (xy 2.245073 0.405103)\n      (xy 2.317099 0.48537) (xy 2.391558 0.494805) (xy 2.475887 0.480197) (xy 2.525367 0.413586)\n      (xy 2.549111 0.260791) (xy 2.556234 -0.012366) (xy 2.556493 -0.123701) (xy 2.556493 3.603955)\n      (xy 2.33361 3.976986) (xy 2.102692 4.324132) (xy 1.912952 4.562103) (xy 1.781691 4.667512)\n      (xy 1.660102 4.654002) (xy 1.438445 4.580892) (xy 1.163465 4.463746) (xy 1.154545 4.459546)\n      (xy 1.154545 0.36149) (xy 1.110706 0.268405) (xy 0.956623 0.266159) (xy 0.938776 0.269422)\n      (xy 0.717011 0.243945) (xy 0.523128 0.11531) (xy 0.417755 -0.07121) (xy 0.412337 -0.123701)\n      (xy 0.484303 -0.318602) (xy 0.658393 -0.472009) (xy 0.871896 -0.536691) (xy 0.949632 -0.528355)\n      (xy 1.105982 -0.515384) (xy 1.154279 -0.597467) (xy 1.154545 -0.609566) (xy 1.114247 -0.69528)\n      (xy 0.970303 -0.735064) (xy 0.783441 -0.742208) (xy 0.429195 -0.687347) (xy 0.198088 -0.523118)\n      (xy 0.090717 -0.250044) (xy 0.082467 -0.123701) (xy 0.144642 0.188869) (xy 0.330769 0.392787)\n      (xy 0.640252 0.487526) (xy 0.783441 0.494805) (xy 1.022962 0.480515) (xy 1.134243 0.429291)\n      (xy 1.154545 0.36149) (xy 1.154545 4.459546) (xy 1.148315 4.456614) (xy 0.592041 4.256938)\n      (xy 0.061238 4.207886) (xy -0.164935 4.249843) (xy -0.164935 -0.123701) (xy -0.168831 -0.439936)\n      (xy -0.186594 -0.625484) (xy -0.227339 -0.714524) (xy -0.300181 -0.741238) (xy -0.329871 -0.742208)\n      (xy -0.435349 -0.716231) (xy -0.483875 -0.609894) (xy -0.495586 -0.391721) (xy -0.496366 -0.041234)\n      (xy -0.706429 -0.391721) (xy -0.874005 -0.625569) (xy -1.029731 -0.729733) (xy -1.117986 -0.742208)\n      (xy -1.220495 -0.733937) (xy -1.280586 -0.685976) (xy -1.309571 -0.563603) (xy -1.318762 -0.332094)\n      (xy -1.319481 -0.123701) (xy -1.315585 0.192533) (xy -1.297822 0.378081) (xy -1.257077 0.467122)\n      (xy -1.184235 0.493835) (xy -1.154546 0.494805) (xy -1.049068 0.468829) (xy -1.000541 0.362492)\n      (xy -0.988831 0.144318) (xy -0.98805 -0.206169) (xy -0.777988 0.144318) (xy -0.610412 0.378167)\n      (xy -0.454685 0.48233) (xy -0.36643 0.494805) (xy -0.263922 0.486535) (xy -0.203831 0.438574)\n      (xy -0.174846 0.3162) (xy -0.165655 0.084692) (xy -0.164935 -0.123701) (xy -0.164935 4.249843)\n      (xy -0.48241 4.308738) (xy -0.783442 4.420415) (xy -1.059466 4.535832) (xy -1.285963 4.626797)\n      (xy -1.401948 4.669513) (xy -1.518876 4.625399) (xy -1.566884 4.584033) (xy -1.566884 -0.123701)\n      (xy -1.631934 -0.436938) (xy -1.821147 -0.644378) (xy -2.12562 -0.737671) (xy -2.226624 -0.742208)\n      (xy -2.560743 -0.681223) (xy -2.782012 -0.503835) (xy -2.881525 -0.218392) (xy -2.886364 -0.123701)\n      (xy -2.821314 0.189536) (xy -2.6321 0.396975) (xy -2.327627 0.490269) (xy -2.226624 0.494805)\n      (xy -1.892653 0.436492) (xy -1.731819 0.32987) (xy -1.597945 0.09203) (xy -1.566884 -0.123701)\n      (xy -1.566884 4.584033) (xy -1.717176 4.454536) (xy -1.98582 4.166799) (xy -2.061689 4.078924)\n      (xy -2.369861 3.70727) (xy -2.632201 3.363429) (xy -2.870341 3.013116) (xy -2.968832 2.849614)\n      (xy -2.968832 -0.32987) (xy -3.007485 -0.54598) (xy -3.140146 -0.67528) (xy -3.391869 -0.734039)\n      (xy -3.603832 -0.742208) (xy -4.04091 -0.742208) (xy -4.04091 -0.123701) (xy -4.037014 0.192533)\n      (xy -4.019251 0.378081) (xy -3.978506 0.467122) (xy -3.905664 0.493835) (xy -3.875974 0.494805)\n      (xy -3.746639 0.446485) (xy -3.711039 0.288637) (xy -3.687673 0.146227) (xy -3.584731 0.090232)\n      (xy -3.438897 0.082468) (xy -3.16065 0.034793) (xy -3.008068 -0.114765) (xy -2.968832 -0.32987)\n      (xy -2.968832 2.849614) (xy -3.105916 2.622046) (xy -3.360558 2.155935) (xy -3.6559 1.580499)\n      (xy -3.724805 1.443182) (xy -3.927446 1.040996) (xy -4.107468 0.68891) (xy -4.250627 0.414385)\n      (xy -4.342678 0.24488) (xy -4.366512 0.206169) (xy -4.479713 -0.061738) (xy -4.470402 -0.368299)\n      (xy -4.39208 -0.562072) (xy -4.211754 -0.794239) (xy -3.970771 -1.027175) (xy -3.729883 -1.205582)\n      (xy -3.628572 -1.257014) (xy -3.515586 -1.328258) (xy -3.31072 -1.481511) (xy -3.047204 -1.691308)\n      (xy -2.861153 -1.845142) (xy -2.478394 -2.151727) (xy -2.09396 -2.434151) (xy -1.735885 -2.674156)\n      (xy -1.432202 -2.853482) (xy -1.210945 -2.953871) (xy -1.135923 -2.968831) (xy -0.992755 -2.911987)\n      (xy -0.868796 -2.807085) (xy -0.798823 -2.718089) (xy -0.768465 -2.621372) (xy -0.779148 -2.476306)\n      (xy -0.832302 -2.242261) (xy -0.897248 -1.997411) (xy -1.002077 -1.614541) (xy -1.0637 -1.342913)\n      (xy -1.062894 -1.163551) (xy -0.980436 -1.05748) (xy -0.797105 -1.005726) (xy -0.493678 -0.989314)\n      (xy -0.050932 -0.989267) (xy 0.123701 -0.98961) (xy 0.616616 -0.993152) (xy 0.963601 -1.004879)\n      (xy 1.183529 -1.026446) (xy 1.295275 -1.059505) (xy 1.31948 -1.094352) (xy 1.298521 -1.22034)\n      (xy 1.243133 -1.457326) (xy 1.164548 -1.757819) (xy 1.150407 -1.809213) (xy 1.043088 -2.255847)\n      (xy 1.008894 -2.569631) (xy 1.048676 -2.765972) (xy 1.163285 -2.860279) (xy 1.208992 -2.870512)\n      (xy 1.420553 -2.83991) (xy 1.739874 -2.711189) (xy 2.149801 -2.493929) (xy 2.633175 -2.197713)\n      (xy 3.172841 -1.832122) (xy 3.525487 -1.576813) (xy 3.929546 -1.272303) (xy 4.214754 -1.04349)\n      (xy 4.398878 -0.873667) (xy 4.499689 -0.746128) (xy 4.534955 -0.644167) (xy 4.535714 -0.627021)\n      (xy 4.535714 -0.627021)) (layer F.SilkS) (width 0.1))\n    (fp_poly (pts (xy 1.023542 -3.736319) (xy 0.895402 -3.389445) (xy 0.679417 -3.11223) (xy 0.563302 -2.982356)\n      (xy 0.508034 -2.869698) (xy 0.506066 -2.720981) (xy 0.549854 -2.48293) (xy 0.574294 -2.370022)\n      (xy 0.658312 -1.973188) (xy 0.69611 -1.709422) (xy 0.675383 -1.550382) (xy 0.583822 -1.467723)\n      (xy 0.409122 -1.433104) (xy 0.16144 -1.419187) (xy -0.12355 -1.415195) (xy -0.339882 -1.428263)\n      (xy -0.43645 -1.453549) (xy -0.490308 -1.618268) (xy -0.466441 -1.923684) (xy -0.365224 -2.365222)\n      (xy -0.360015 -2.384058) (xy -0.225225 -2.868872) (xy -0.488808 -3.104404) (xy -0.714353 -3.402585)\n      (xy -0.808424 -3.746824) (xy -0.77552 -4.096523) (xy -0.620138 -4.411085) (xy -0.346777 -4.649915)\n      (xy -0.31571 -4.666738) (xy 0.033719 -4.763905) (xy 0.380075 -4.71573) (xy 0.68714 -4.538441)\n      (xy 0.918691 -4.248265) (xy 0.989692 -4.081895) (xy 1.023542 -3.736319) (xy 1.023542 -3.736319)) (layer F.SilkS) (width 0.1))\n    (fp_poly (pts (xy -3.320079 -0.321578) (xy -3.381169 -0.206169) (xy -3.537606 -0.087441) (xy -3.656944 -0.12265)\n      (xy -3.710414 -0.301007) (xy -3.711039 -0.32987) (xy -3.666881 -0.523821) (xy -3.553583 -0.57585)\n      (xy -3.399915 -0.47517) (xy -3.381169 -0.453571) (xy -3.320079 -0.321578) (xy -3.320079 -0.321578)) (layer F.SilkS) (width 0.1))\n    (fp_poly (pts (xy -1.911824 -0.1467) (xy -1.935194 -0.006732) (xy -2.006645 0.114199) (xy -2.128505 0.265484)\n      (xy -2.225472 0.329848) (xy -2.226624 0.32987) (xy -2.322643 0.267542) (xy -2.444552 0.117317)\n      (xy -2.446603 0.114199) (xy -2.537406 -0.05684) (xy -2.52656 -0.197017) (xy -2.465958 -0.318756)\n      (xy -2.343482 -0.473895) (xy -2.226624 -0.536039) (xy -2.106037 -0.47051) (xy -1.987289 -0.318756)\n      (xy -1.911824 -0.1467) (xy -1.911824 -0.1467)) (layer F.SilkS) (width 0.1))\n    (fp_poly (pts (xy 3.778435 -0.1467) (xy 3.755065 -0.006732) (xy 3.683615 0.114199) (xy 3.561755 0.265484)\n      (xy 3.464788 0.329848) (xy 3.463636 0.32987) (xy 3.367616 0.267542) (xy 3.245708 0.117317)\n      (xy 3.243657 0.114199) (xy 3.152854 -0.05684) (xy 3.163699 -0.197017) (xy 3.224301 -0.318756)\n      (xy 3.346778 -0.473895) (xy 3.463636 -0.536039) (xy 3.584223 -0.47051) (xy 3.702971 -0.318756)\n      (xy 3.778435 -0.1467) (xy 3.778435 -0.1467)) (layer F.SilkS) (width 0.1))\n  )\n\n  (module simonShield:Logo_OSHWA (layer F.Cu) (tedit 560D8B85) (tstamp 59574326)\n    (at 101.5 82.5)\n    (fp_text reference G101 (at 0 4.2418) (layer F.SilkS) hide\n      (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n    )\n    (fp_text value Logo_OSHWA (at 0 -4.2418) (layer F.SilkS) hide\n      (effects (font (size 0.36322 0.36322) (thickness 0.07112)))\n    )\n    (fp_poly (pts (xy -2.42316 3.59156) (xy -2.38252 3.57124) (xy -2.28854 3.51282) (xy -2.15392 3.42392)\n      (xy -1.99644 3.31978) (xy -1.83896 3.21056) (xy -1.70942 3.1242) (xy -1.61798 3.06578)\n      (xy -1.57988 3.04546) (xy -1.55956 3.05054) (xy -1.48336 3.08864) (xy -1.37414 3.14452)\n      (xy -1.31064 3.17754) (xy -1.21158 3.22072) (xy -1.16078 3.23088) (xy -1.15316 3.21564)\n      (xy -1.11506 3.13944) (xy -1.05918 3.00736) (xy -0.98298 2.83464) (xy -0.89662 2.63144)\n      (xy -0.80264 2.413) (xy -0.7112 2.18948) (xy -0.6223 1.97612) (xy -0.54356 1.78562)\n      (xy -0.48006 1.63068) (xy -0.43942 1.52146) (xy -0.42418 1.47574) (xy -0.42926 1.46558)\n      (xy -0.48006 1.41732) (xy -0.56642 1.35128) (xy -0.75692 1.19634) (xy -0.94234 0.96266)\n      (xy -1.05664 0.6985) (xy -1.09474 0.40386) (xy -1.06172 0.13208) (xy -0.95504 -0.12954)\n      (xy -0.77216 -0.36576) (xy -0.55118 -0.54102) (xy -0.2921 -0.65278) (xy 0 -0.68834)\n      (xy 0.2794 -0.65786) (xy 0.5461 -0.55118) (xy 0.78232 -0.37084) (xy 0.88138 -0.25654)\n      (xy 1.01854 -0.01778) (xy 1.09728 0.23876) (xy 1.1049 0.30226) (xy 1.09474 0.5842)\n      (xy 1.01092 0.85344) (xy 0.8636 1.09474) (xy 0.65786 1.29032) (xy 0.62992 1.31064)\n      (xy 0.53594 1.38176) (xy 0.47244 1.43002) (xy 0.42164 1.47066) (xy 0.77978 2.33172)\n      (xy 0.83566 2.46888) (xy 0.93472 2.7051) (xy 1.02108 2.9083) (xy 1.08966 3.06832)\n      (xy 1.13792 3.17754) (xy 1.15824 3.22072) (xy 1.16078 3.22326) (xy 1.19126 3.22834)\n      (xy 1.2573 3.20294) (xy 1.37668 3.14452) (xy 1.45796 3.10388) (xy 1.5494 3.0607)\n      (xy 1.59004 3.04546) (xy 1.6256 3.06324) (xy 1.71196 3.12166) (xy 1.8415 3.20548)\n      (xy 1.9939 3.30962) (xy 2.14122 3.41122) (xy 2.27584 3.50012) (xy 2.3749 3.56108)\n      (xy 2.42316 3.58902) (xy 2.43078 3.58902) (xy 2.47142 3.56362) (xy 2.55016 3.50012)\n      (xy 2.667 3.38836) (xy 2.8321 3.2258) (xy 2.8575 3.2004) (xy 2.99466 3.0607)\n      (xy 3.10642 2.94386) (xy 3.18008 2.86258) (xy 3.20548 2.82448) (xy 3.20548 2.82448)\n      (xy 3.18262 2.77622) (xy 3.11912 2.6797) (xy 3.03022 2.54254) (xy 2.921 2.38252)\n      (xy 2.63652 1.9685) (xy 2.794 1.57734) (xy 2.84226 1.45796) (xy 2.90322 1.31318)\n      (xy 2.9464 1.20904) (xy 2.9718 1.16332) (xy 3.01244 1.14808) (xy 3.12166 1.12268)\n      (xy 3.2766 1.08966) (xy 3.45948 1.05664) (xy 3.63728 1.02362) (xy 3.7973 0.99314)\n      (xy 3.9116 0.97028) (xy 3.9624 0.96012) (xy 3.9751 0.9525) (xy 3.98526 0.9271)\n      (xy 3.99288 0.87376) (xy 3.99542 0.77724) (xy 3.99796 0.62484) (xy 3.99796 0.40386)\n      (xy 3.99796 0.381) (xy 3.99542 0.17018) (xy 3.99288 0.00254) (xy 3.9878 -0.10668)\n      (xy 3.98018 -0.14986) (xy 3.98018 -0.14986) (xy 3.92938 -0.16256) (xy 3.81762 -0.18542)\n      (xy 3.6576 -0.21844) (xy 3.4671 -0.254) (xy 3.45694 -0.25654) (xy 3.26644 -0.2921)\n      (xy 3.10896 -0.32512) (xy 2.9972 -0.35052) (xy 2.95148 -0.36576) (xy 2.94132 -0.37846)\n      (xy 2.90322 -0.45212) (xy 2.84734 -0.56896) (xy 2.78638 -0.71374) (xy 2.72288 -0.86106)\n      (xy 2.66954 -0.99568) (xy 2.63398 -1.09474) (xy 2.62382 -1.14046) (xy 2.62382 -1.14046)\n      (xy 2.65176 -1.18618) (xy 2.7178 -1.28524) (xy 2.80924 -1.41986) (xy 2.921 -1.58242)\n      (xy 2.92862 -1.59512) (xy 3.03784 -1.75514) (xy 3.12674 -1.88976) (xy 3.18516 -1.98628)\n      (xy 3.20548 -2.02946) (xy 3.20548 -2.032) (xy 3.16992 -2.08026) (xy 3.08864 -2.16916)\n      (xy 2.9718 -2.29108) (xy 2.8321 -2.43332) (xy 2.78638 -2.4765) (xy 2.63144 -2.6289)\n      (xy 2.52476 -2.72796) (xy 2.45618 -2.7813) (xy 2.42316 -2.794) (xy 2.42316 -2.79146)\n      (xy 2.3749 -2.76352) (xy 2.2733 -2.69748) (xy 2.13614 -2.6035) (xy 1.97358 -2.49428)\n      (xy 1.96342 -2.48666) (xy 1.8034 -2.37744) (xy 1.67132 -2.28854) (xy 1.5748 -2.22504)\n      (xy 1.53416 -2.19964) (xy 1.52654 -2.19964) (xy 1.46304 -2.21996) (xy 1.34874 -2.25806)\n      (xy 1.20904 -2.31394) (xy 1.06172 -2.37236) (xy 0.9271 -2.42824) (xy 0.8255 -2.4765)\n      (xy 0.77724 -2.5019) (xy 0.77724 -2.50444) (xy 0.75946 -2.56286) (xy 0.73152 -2.68224)\n      (xy 0.6985 -2.84734) (xy 0.6604 -3.04292) (xy 0.65532 -3.0734) (xy 0.61976 -3.2639)\n      (xy 0.58928 -3.42138) (xy 0.56642 -3.5306) (xy 0.55372 -3.57632) (xy 0.52832 -3.5814)\n      (xy 0.43434 -3.58902) (xy 0.2921 -3.59156) (xy 0.11938 -3.5941) (xy -0.06096 -3.59156)\n      (xy -0.23622 -3.58902) (xy -0.38862 -3.58394) (xy -0.4953 -3.57632) (xy -0.54102 -3.56616)\n      (xy -0.54356 -3.56362) (xy -0.5588 -3.5052) (xy -0.5842 -3.38582) (xy -0.61976 -3.22072)\n      (xy -0.65786 -3.0226) (xy -0.66294 -2.98958) (xy -0.6985 -2.79908) (xy -0.73152 -2.64414)\n      (xy -0.75438 -2.53492) (xy -0.76708 -2.49428) (xy -0.78232 -2.48412) (xy -0.86106 -2.4511)\n      (xy -0.98806 -2.39776) (xy -1.14808 -2.33426) (xy -1.51384 -2.1844) (xy -1.96088 -2.49428)\n      (xy -2.00406 -2.52222) (xy -2.16408 -2.63144) (xy -2.2987 -2.72034) (xy -2.39014 -2.77876)\n      (xy -2.42824 -2.80162) (xy -2.43078 -2.79908) (xy -2.4765 -2.76098) (xy -2.5654 -2.67716)\n      (xy -2.68732 -2.55778) (xy -2.82702 -2.41808) (xy -2.93116 -2.31394) (xy -3.05562 -2.18694)\n      (xy -3.13436 -2.10312) (xy -3.17754 -2.04724) (xy -3.19278 -2.01422) (xy -3.1877 -1.9939)\n      (xy -3.15976 -1.94818) (xy -3.09372 -1.84912) (xy -3.00228 -1.71196) (xy -2.89306 -1.55448)\n      (xy -2.80162 -1.41986) (xy -2.7051 -1.27) (xy -2.6416 -1.16332) (xy -2.61874 -1.10998)\n      (xy -2.62382 -1.08712) (xy -2.65684 -1.00076) (xy -2.71018 -0.86614) (xy -2.77622 -0.70866)\n      (xy -2.9337 -0.35306) (xy -3.16738 -0.30988) (xy -3.30708 -0.28194) (xy -3.5052 -0.24384)\n      (xy -3.69316 -0.20828) (xy -3.9878 -0.14986) (xy -3.99796 0.93218) (xy -3.95224 0.9525)\n      (xy -3.90906 0.9652) (xy -3.79984 0.98806) (xy -3.6449 1.01854) (xy -3.45948 1.0541)\n      (xy -3.30454 1.08458) (xy -3.14452 1.11252) (xy -3.03276 1.13538) (xy -2.98196 1.14554)\n      (xy -2.96926 1.16332) (xy -2.92862 1.23952) (xy -2.87274 1.36144) (xy -2.81178 1.50876)\n      (xy -2.74828 1.65862) (xy -2.6924 1.79832) (xy -2.65176 1.905) (xy -2.63906 1.96088)\n      (xy -2.65938 2.00406) (xy -2.72034 2.0955) (xy -2.8067 2.22758) (xy -2.91338 2.38506)\n      (xy -3.0226 2.54254) (xy -3.1115 2.67716) (xy -3.175 2.77368) (xy -3.2004 2.81686)\n      (xy -3.1877 2.84734) (xy -3.12674 2.92354) (xy -3.00736 3.04546) (xy -2.8321 3.22072)\n      (xy -2.80162 3.24866) (xy -2.66192 3.38328) (xy -2.54254 3.4925) (xy -2.46126 3.56616)\n      (xy -2.42316 3.59156)) (layer F.SilkS) (width 0.00254))\n  )\n\n  (module simonShield:C_Disc_D3_P2.5 (layer F.Cu) (tedit 578F6ADD) (tstamp 5957431B)\n    (at 89.255 53.508 90)\n    (descr \"Capacitor 3mm Disc, Pitch 2.5mm\")\n    (tags Capacitor)\n    (path /57781B52/57781D10)\n    (fp_text reference C1 (at 1.27 2.794 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value C_100nF (at 1.25 2.5 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -0.9 -1.5) (end 3.4 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.4 -1.5) (end 3.4 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.4 1.5) (end -0.9 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.9 1.5) (end -0.9 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.25 -1.25) (end 2.75 -1.25) (layer F.SilkS) (width 0.15))\n    (fp_line (start 2.75 1.25) (end -0.25 1.25) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole rect (at 0 0 90) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS)\n      (net 32 VCC))\n    (pad 2 thru_hole circle (at 2.5 0 90) (size 1.3 1.3) (drill 0.8001) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (model ${KIPRJMOD}/simonShield.3dshapes/C_Disc_D3_P2.5.wrl\n      (at (xyz 0.049213 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module simonShield:Conn_Poncho_SinBorde (layer F.Cu) (tedit 5797F70F) (tstamp 5957426D)\n    (at 143.23 50.968)\n    (tags \"CONN Poncho\")\n    (path /57781B52/57781CEF)\n    (fp_text reference XA1 (at 1.27 -3.175) (layer F.SilkS)\n      (effects (font (size 0.8 0.8) (thickness 0.12)))\n    )\n    (fp_text value Conn_Poncho2P_2x_20x2 (at -1.905 51.181) (layer F.SilkS) hide\n      (effects (font (size 1.016 1.016) (thickness 0.2032)))\n    )\n    (fp_text user GPIO8 (at -65.913 48.26) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO7 (at -65.913 45.847) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO5 (at -65.913 43.18) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO3 (at -65.913 40.767) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO1 (at -65.913 38.1) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user LCD1 (at -65.913 35.56) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user LCD2 (at -65.913 33.02) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user LCD3 (at -65.024 30.48) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user LCD_RS (at -64.008 27.94) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user LCD4 (at -65.278 25.654) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user SCK (at -66.04 22.733) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user MISO (at -65.913 20.32) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user TXD1 (at -65.786 17.907) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user TXD0 (at -65.786 15.24) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user MDIO (at -65.786 12.7) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user CRS (at -65.532 10.287) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user MDC (at -66.04 7.62) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user TX_EN (at -64.77 5.207) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user RXD1 (at -65.913 2.667) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user +5V (at -65.532 0) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 48.006) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 45.72) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GPIO6 (at -74.295 43.18) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO4 (at -74.295 40.64) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO2 (at -74.295 38.1) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO0 (at -74.295 35.56) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GND (at -74.168 33.02) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 30.48) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user LCD_EN (at -74.168 27.94) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user MOSI (at -74.168 25.273) (layer F.SilkS)\n      (effects (font (size 1 0.7) (thickness 0.17)))\n    )\n    (fp_text user GND (at -74.168 22.86) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 20.32) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user R_CLK (at -74.168 17.78) (layer F.SilkS)\n      (effects (font (size 0.9 0.7) (thickness 0.175)))\n    )\n    (fp_text user GND (at -74.168 15.24) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 12.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 7.62) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user RXD0 (at -74.041 10.16) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GND (at -74.168 5.08) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 2.54) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user +3.3V (at -74.041 0) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GND (at 5.461 48.26) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 45.72) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user T_F1 (at 5.461 43.18) (layer F.SilkS)\n      (effects (font (size 0.9 0.9) (thickness 0.18)))\n    )\n    (fp_text user T_C2 (at 5.461 40.64) (layer F.SilkS)\n      (effects (font (size 0.9 0.9) (thickness 0.18)))\n    )\n    (fp_text user GND (at 5.461 38.1) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.334 35.56) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 33.02) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 30.48) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 27.94) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 25.4) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 22.86) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GNDA (at 5.461 20.32) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user GNDA (at 5.461 17.78) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user GNDA (at 5.461 15.24) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user GNDA (at 5.461 12.7) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user GNDA (at 5.461 10.16) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user GNDA (at 5.461 7.62) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user WAKEUP (at 5.461 5.334) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GND (at 5.461 3.048) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user +5V (at 5.334 0) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user T_C0 (at -2.286 48.133) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user T_F2 (at -2.413 45.72) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user T_F3 (at -2.413 43.18) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user T_F0 (at -2.413 40.64) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user T_C1 (at -2.286 38.1) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user CAN_TD (at -2.921 35.687) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user CAN_RD (at -2.921 33.02) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user 232_TX (at -4.318 30.48) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user 232_RX (at -4.318 27.94) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user SCL (at -2.794 25.4) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user SDA (at -2.794 22.86) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user VDDA (at -2.794 20.32) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user DAC (at -2.794 17.78) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user CH1 (at -2.794 15.24) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user CH2 (at -3.048 12.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user CH3 (at -3.048 10.16) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GNDA (at -2.54 7.62) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user ISP (at -2.794 5.08) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user RESET (at -3.81 2.54) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user CIAA-P2 (at -69.85 -2.032) (layer F.SilkS)\n      (effects (font (size 0.8 0.8) (thickness 0.12)))\n    )\n    (fp_text user CIAA-P1 (at 1.27 -2.032) (layer F.SilkS)\n      (effects (font (size 0.8 0.8) (thickness 0.12)))\n    )\n    (fp_text user +3.3V (at -3.81 0) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_line (start -72.39 0) (end -72.39 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -72.39 -1.27) (end -67.31 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -67.31 -1.27) (end -67.31 49.53) (layer F.SilkS) (width 0.15))\n    (fp_line (start -67.31 49.53) (end -72.39 49.53) (layer F.SilkS) (width 0.15))\n    (fp_line (start -72.39 49.53) (end -72.39 0) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.27 49.53) (end -1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 49.53) (end 3.81 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 49.53) (end -1.27 49.53) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -1.27) (end -1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole rect (at 0 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 36 \"Net-(XA1-Pad1)\"))\n    (pad 2 thru_hole oval (at 2.54 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 37 \"Net-(XA1-Pad2)\"))\n    (pad 11 thru_hole oval (at 0 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 38 \"Net-(XA1-Pad11)\"))\n    (pad 4 thru_hole oval (at 2.54 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 39 \"Net-(XA1-Pad4)\"))\n    (pad 13 thru_hole oval (at 0 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 40 \"Net-(XA1-Pad13)\"))\n    (pad 6 thru_hole oval (at 2.54 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 41 \"Net-(XA1-Pad6)\"))\n    (pad 15 thru_hole oval (at 0 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 42 \"Net-(XA1-Pad15)\"))\n    (pad 8 thru_hole oval (at 2.54 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 43 \"Net-(XA1-Pad8)\"))\n    (pad 17 thru_hole oval (at 0 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 44 \"Net-(XA1-Pad17)\"))\n    (pad 10 thru_hole oval (at 2.54 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 45 \"Net-(XA1-Pad10)\"))\n    (pad 19 thru_hole oval (at 0 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 46 \"Net-(XA1-Pad19)\"))\n    (pad 12 thru_hole oval (at 2.54 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 47 \"Net-(XA1-Pad12)\"))\n    (pad 21 thru_hole oval (at 0 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 48 \"Net-(XA1-Pad21)\"))\n    (pad 14 thru_hole oval (at 2.54 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 49 \"Net-(XA1-Pad14)\"))\n    (pad 23 thru_hole oval (at 0 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 50 \"Net-(XA1-Pad23)\"))\n    (pad 16 thru_hole oval (at 2.54 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 51 \"Net-(XA1-Pad16)\"))\n    (pad 25 thru_hole oval (at 0 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 52 \"Net-(XA1-Pad25)\"))\n    (pad 18 thru_hole oval (at 2.54 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 53 \"Net-(XA1-Pad18)\"))\n    (pad 27 thru_hole oval (at 0 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 54 \"Net-(XA1-Pad27)\"))\n    (pad 20 thru_hole oval (at 2.54 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 55 \"Net-(XA1-Pad20)\"))\n    (pad 29 thru_hole oval (at 0 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 56 \"Net-(XA1-Pad29)\"))\n    (pad 22 thru_hole oval (at 2.54 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 57 \"Net-(XA1-Pad22)\"))\n    (pad 31 thru_hole oval (at 0 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 58 \"Net-(XA1-Pad31)\"))\n    (pad 24 thru_hole oval (at 2.54 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 59 \"Net-(XA1-Pad24)\"))\n    (pad 26 thru_hole oval (at 2.54 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 60 \"Net-(XA1-Pad26)\"))\n    (pad 33 thru_hole oval (at 0 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 61 \"Net-(XA1-Pad33)\"))\n    (pad 28 thru_hole oval (at 2.54 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 62 \"Net-(XA1-Pad28)\"))\n    (pad 32 thru_hole oval (at 2.54 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 63 \"Net-(XA1-Pad32)\"))\n    (pad 34 thru_hole oval (at 2.54 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 64 \"Net-(XA1-Pad34)\"))\n    (pad 36 thru_hole oval (at 2.54 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 65 \"Net-(XA1-Pad36)\"))\n    (pad 38 thru_hole oval (at 2.54 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 66 \"Net-(XA1-Pad38)\"))\n    (pad 35 thru_hole oval (at 0 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 67 \"Net-(XA1-Pad35)\"))\n    (pad 37 thru_hole oval (at 0 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 68 \"Net-(XA1-Pad37)\"))\n    (pad 3 thru_hole oval (at 0 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 69 \"Net-(XA1-Pad3)\"))\n    (pad 5 thru_hole oval (at 0 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 70 \"Net-(XA1-Pad5)\"))\n    (pad 7 thru_hole oval (at 0 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 71 \"Net-(XA1-Pad7)\"))\n    (pad 9 thru_hole oval (at 0 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 72 \"Net-(XA1-Pad9)\"))\n    (pad 39 thru_hole oval (at 0 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 73 \"Net-(XA1-Pad39)\"))\n    (pad 40 thru_hole oval (at 2.54 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 74 \"Net-(XA1-Pad40)\"))\n    (pad 30 thru_hole oval (at 2.54 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 75 \"Net-(XA1-Pad30)\"))\n    (pad 41 thru_hole rect (at -71.12 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 25 \"Net-(P1-Pad1)\"))\n    (pad 42 thru_hole oval (at -68.58 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 26 \"Net-(P1-Pad3)\"))\n    (pad 43 thru_hole oval (at -71.12 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 44 thru_hole oval (at -68.58 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 76 \"Net-(XA1-Pad44)\"))\n    (pad 45 thru_hole oval (at -71.12 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 77 \"Net-(XA1-Pad45)\"))\n    (pad 46 thru_hole oval (at -68.58 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 78 \"Net-(XA1-Pad46)\"))\n    (pad 47 thru_hole oval (at -71.12 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 79 \"Net-(XA1-Pad47)\"))\n    (pad 48 thru_hole oval (at -68.58 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 80 \"Net-(XA1-Pad48)\"))\n    (pad 49 thru_hole oval (at -71.12 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 31 /ciaaConector/PWM))\n    (pad 50 thru_hole oval (at -68.58 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 81 \"Net-(XA1-Pad50)\"))\n    (pad 51 thru_hole oval (at -71.12 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 82 \"Net-(XA1-Pad51)\"))\n    (pad 52 thru_hole oval (at -68.58 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 83 \"Net-(XA1-Pad52)\"))\n    (pad 53 thru_hole oval (at -71.12 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 84 \"Net-(XA1-Pad53)\"))\n    (pad 54 thru_hole oval (at -68.58 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 85 \"Net-(XA1-Pad54)\"))\n    (pad 55 thru_hole oval (at -71.12 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 86 \"Net-(XA1-Pad55)\"))\n    (pad 56 thru_hole oval (at -68.58 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 87 \"Net-(XA1-Pad56)\"))\n    (pad 57 thru_hole oval (at -71.12 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 88 \"Net-(XA1-Pad57)\"))\n    (pad 58 thru_hole oval (at -68.58 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 27 /ciaaConector/LED_1))\n    (pad 59 thru_hole oval (at -71.12 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 89 \"Net-(XA1-Pad59)\"))\n    (pad 60 thru_hole oval (at -68.58 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 13 /buttons/BTN_LED_1))\n    (pad 61 thru_hole oval (at -71.12 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 90 \"Net-(XA1-Pad61)\"))\n    (pad 62 thru_hole oval (at -68.58 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 14 /buttons/BTN_CFG_1))\n    (pad 63 thru_hole oval (at -71.12 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 91 \"Net-(XA1-Pad63)\"))\n    (pad 64 thru_hole oval (at -68.58 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 16 /buttons/BTN_CFG_2))\n    (pad 65 thru_hole oval (at -71.12 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 92 \"Net-(XA1-Pad65)\"))\n    (pad 66 thru_hole oval (at -68.58 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 15 /buttons/BTN_LED_2))\n    (pad 67 thru_hole oval (at -71.12 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 93 \"Net-(XA1-Pad67)\"))\n    (pad 68 thru_hole oval (at -68.58 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 28 /ciaaConector/LED_2))\n    (pad 69 thru_hole oval (at -71.12 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 94 \"Net-(XA1-Pad69)\"))\n    (pad 70 thru_hole oval (at -68.58 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 95 \"Net-(XA1-Pad70)\"))\n    (pad 71 thru_hole oval (at -71.12 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 96 \"Net-(XA1-Pad71)\"))\n    (pad 72 thru_hole oval (at -68.58 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 97 \"Net-(XA1-Pad72)\"))\n    (pad 73 thru_hole oval (at -71.12 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 30 /ciaaConector/LED_4))\n    (pad 74 thru_hole oval (at -68.58 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 29 /ciaaConector/LED_3))\n    (pad 75 thru_hole oval (at -71.12 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 18 /buttons/BTN_LED_4))\n    (pad 76 thru_hole oval (at -68.58 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 17 /buttons/BTN_CFG_3))\n    (pad 77 thru_hole oval (at -71.12 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 78 thru_hole oval (at -68.58 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 23 /buttons/BTN_LED_3))\n    (pad 79 thru_hole oval (at -71.12 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 80 thru_hole oval (at -68.58 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 24 /buttons/BTN_CFG_4))\n  )\n\n  (module Resistors_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal (layer F.Cu) (tedit 59573707) (tstamp 59574258)\n    (at 99.4 58.3 90)\n    (descr \"Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf\")\n    (tags \"Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm\")\n    (path /59572EFC)\n    (fp_text reference \"R 0 Ohm\" (at 5.08 -2.31 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value R (at 5.08 2.31 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start 1.93 -1.25) (end 1.93 1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 1.93 1.25) (end 8.23 1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 8.23 1.25) (end 8.23 -1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 8.23 -1.25) (end 1.93 -1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 0 0) (end 1.93 0) (layer F.Fab) (width 0.1))\n    (fp_line (start 10.16 0) (end 8.23 0) (layer F.Fab) (width 0.1))\n    (fp_line (start 1.87 -1.31) (end 1.87 1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 1.87 1.31) (end 8.29 1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 8.29 1.31) (end 8.29 -1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 8.29 -1.31) (end 1.87 -1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 0.98 0) (end 1.87 0) (layer F.SilkS) (width 0.12))\n    (fp_line (start 9.18 0) (end 8.29 0) (layer F.SilkS) (width 0.12))\n    (fp_line (start -1.05 -1.6) (end -1.05 1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.05 1.6) (end 11.25 1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 11.25 1.6) (end 11.25 -1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 11.25 -1.6) (end -1.05 -1.6) (layer F.CrtYd) (width 0.05))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)\n      (net 1 GND))\n    (pad 2 thru_hole oval (at 10.16 0 90) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)\n      (net 1 GND))\n    (model Resistors_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 0.393701 0.393701 0.393701))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (gr_text \"Poncho juego Simon EDU-CIAA NXP\" (at 109 44.5) (layer F.SilkS) (tstamp 595746E3)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text \"Autor: Juan Agustin Bassi git@gitlab.com:abassi/ponchoSimon.git\\n\" (at 108.25 105.25) (layer F.SilkS) (tstamp 595746E2)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text START (at 105 64.5) (layer F.SilkS) (tstamp 595746E1)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text GAME (at 113 64.5) (layer F.SilkS) (tstamp 595746E0)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text SKILL (at 105 101) (layer F.SilkS) (tstamp 595746DF)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text BEST (at 113 101) (layer F.SilkS) (tstamp 595746DE)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text \"TEC 1\" (at 95.5 64.5) (layer F.SilkS) (tstamp 595746DD)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text \"TEC 2\" (at 122.5 64.5) (layer F.SilkS) (tstamp 595746DC)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text \"TEC 4\" (at 124 101) (layer F.SilkS) (tstamp 595746DB)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text \"TEC 3\\n\" (at 94 101) (layer F.SilkS) (tstamp 595746DA)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text JMP_VDD (at 82.524 46.269) (layer F.SilkS) (tstamp 595746D8)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text 3V3 (at 86.207 50.968) (layer F.SilkS) (tstamp 595746D7)\n    (effects (font (size 1 0.5) (thickness 0.125)))\n  )\n  (gr_text 5V (at 85.953 53.762) (layer F.SilkS) (tstamp 595746D6)\n    (effects (font (size 1 0.5) (thickness 0.125)))\n  )\n  (gr_text \"INDUSTRIA\\nARGENTINA\" (at 143.357 44.872) (layer F.SilkS) (tstamp 595746D5)\n    (effects (font (size 1.5 1.5) (thickness 0.1875)))\n  )\n  (gr_text AMARILLO (at 89 57.75) (layer F.SilkS) (tstamp 595746D4)\n    (effects (font (size 2 1.5) (thickness 0.1875)))\n  )\n  (gr_text ROJO (at 88.62 79.924) (layer F.SilkS) (tstamp 595746D3)\n    (effects (font (size 2 2) (thickness 0.1875)))\n  )\n  (gr_text VERDE (at 129.26 79.924) (layer F.SilkS) (tstamp 595746D2)\n    (effects (font (size 2 2) (thickness 0.1875)))\n  )\n  (gr_text AZUL (at 129.25 57.25) (layer F.SilkS) (tstamp 595746D1)\n    (effects (font (size 2 2) (thickness 0.1875)))\n  )\n  (gr_line (start 67 107.5) (end 67 42.25) (angle 90) (layer Edge.Cuts) (width 0.15) (tstamp 595746D0))\n  (gr_line (start 67 42.25) (end 150.25 42.25) (angle 90) (layer Edge.Cuts) (width 0.15) (tstamp 595746CF))\n  (gr_line (start 150.25 42.25) (end 150.25 107.5) (angle 90) (layer Edge.Cuts) (width 0.15) (tstamp 595746CE))\n  (gr_line (start 150.25 107.5) (end 67 107.5) (angle 90) (layer Edge.Cuts) (width 0.15) (tstamp 595746CD))\n  (gr_text \"Autor\\nAgustin Bassi\" (at 140.7 103.3) (layer B.Cu)\n    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify mirror))\n  )\n  (gr_text \"EDU-CIAA NXP\" (at 139.25 47.75) (layer B.Cu)\n    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify mirror))\n  )\n  (gr_text \"PONCHO JUEGO SIMON\" (at 134.75 44.75) (layer B.Cu)\n    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify mirror))\n  )\n\n  (segment (start 104.828971 53.624429) (end 102.212542 51.008) (width 1.2) (layer B.Cu) (net 1))\n  (segment (start 102.212542 51.008) (end 99.4 51.008) (width 1.2) (layer B.Cu) (net 1) (tstamp 595730B7))\n  (segment (start 72.11 99.228) (end 72.11 100.11) (width 0.6) (layer F.Cu) (net 1))\n  (segment (start 86 94.5) (end 85.9608 94.5) (width 0.6) (layer B.Cu) (net 1) (tstamp 595A38D3))\n  (segment (start 85.9608 94.5392) (end 86 94.5) (width 0.6) (layer B.Cu) (net 1) (tstamp 595A38D2))\n  (segment (start 85.9608 96.4608) (end 85.9608 94.5392) (width 0.6) (layer B.Cu) (net 1) (tstamp 595A38D0))\n  (segment (start 86 96.5) (end 85.9608 96.4608) (width 0.6) (layer B.Cu) (net 1) (tstamp 595A38CF))\n  (via (at 86 96.5) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 1))\n  (segment (start 86 102.5) (end 86 96.5) (width 0.6) (layer F.Cu) (net 1) (tstamp 595A38C9))\n  (segment (start 84 104.5) (end 86 102.5) (width 0.6) (layer F.Cu) (net 1) (tstamp 595A38C5))\n  (segment (start 76.5 104.5) (end 84 104.5) (width 0.6) (layer F.Cu) (net 1) (tstamp 595A38BA))\n  (segment (start 72.11 100.11) (end 76.5 104.5) (width 0.6) (layer F.Cu) (net 1) (tstamp 595A38B7))\n  (segment (start 72.11 99.228) (end 72.11 96.688) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 109 88.5) (end 109 90.659) (width 1.5) (layer B.Cu) (net 1))\n  (segment (start 109 90.659) (end 108.94 90.719) (width 1.5) (layer B.Cu) (net 1) (tstamp 595956B2))\n  (segment (start 109 78.34) (end 109 75.1502) (width 1.5) (layer B.Cu) (net 1))\n  (segment (start 109 75.1502) (end 108.9478 75.098) (width 1.5) (layer B.Cu) (net 1) (tstamp 595956A4))\n  (segment (start 99.4 51.008) (end 99.4 48.14) (width 1.5) (layer B.Cu) (net 1))\n  (segment (start 89.255 51.008) (end 96.6 51.008) (width 1.2) (layer B.Cu) (net 1))\n  (segment (start 96.6 51.008) (end 99.4 51.008) (width 1.2) (layer B.Cu) (net 1) (tstamp 59570DD3))\n  (segment (start 72.11 53.508) (end 70.908002 53.508) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 85.147 46.9) (end 89.255 51.008) (width 1.5) (layer B.Cu) (net 1) (tstamp 59570D7E))\n  (segment (start 72.1 46.9) (end 85.147 46.9) (width 1.2) (layer B.Cu) (net 1) (tstamp 59570D78))\n  (segment (start 70.100002 48.899998) (end 72.1 46.9) (width 0.9) (layer B.Cu) (net 1) (tstamp 59570D73))\n  (segment (start 70.100002 52.7) (end 70.100002 48.899998) (width 0.9) (layer B.Cu) (net 1) (tstamp 59570D6D))\n  (segment (start 70.908002 53.508) (end 70.100002 52.7) (width 0.9) (layer B.Cu) (net 1) (tstamp 59570D6A))\n  (segment (start 121.513 90.592) (end 121.513 98.212) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 127.8708 63.4887) (end 127.8708 62.2187) (width 0.6) (layer B.Cu) (net 1) (tstamp 57797282))\n  (segment (start 128.6328 64.2507) (end 127.8708 63.4887) (width 0.9) (layer B.Cu) (net 1) (tstamp 57797281))\n  (segment (start 131.1728 64.2507) (end 128.6328 64.2507) (width 0.9) (layer B.Cu) (net 1) (tstamp 57797280))\n  (segment (start 131.9348 65.0127) (end 131.1728 64.2507) (width 0.9) (layer B.Cu) (net 1) (tstamp 5779727F))\n  (segment (start 131.9348 70.6007) (end 131.9348 65.0127) (width 0.9) (layer B.Cu) (net 1) (tstamp 5779727E))\n  (segment (start 131.4268 71.1087) (end 131.9348 70.6007) (width 0.6) (layer B.Cu) (net 1) (tstamp 5779727D))\n  (segment (start 99.4 58.3) (end 99.4 60.3) (width 1.5) (layer B.Cu) (net 1))\n  (segment (start 102.8 63.7) (end 107.2 63.7) (width 1.5) (layer B.Cu) (net 1) (tstamp 59570DE6))\n  (segment (start 107.2 63.7) (end 108.9478 65.4478) (width 1.5) (layer B.Cu) (net 1) (tstamp 59570DF0))\n  (segment (start 108.9478 65.4478) (end 108.9478 67.3588) (width 1.5) (layer B.Cu) (net 1) (tstamp 59570DF1))\n  (segment (start 99.4 60.3) (end 102.8 63.7) (width 1.5) (layer B.Cu) (net 1) (tstamp 595730BB))\n  (segment (start 96.367 74.844) (end 96.367 71.161) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 96.367 71.161) (end 96.367 71.1087) (width 0.3048) (layer B.Cu) (net 1) (tstamp 578F6457))\n  (segment (start 108.9478 75.098) (end 108.9478 67.3588) (width 1.5) (layer B.Cu) (net 1))\n  (segment (start 108.9478 74.9187) (end 108.9478 75.098) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 108.9478 67.3588) (end 108.94 67.351) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F644D))\n  (segment (start 108.94 67.351) (end 108.94 67.2987) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F6451))\n  (segment (start 121.513 74.844) (end 121.513 71.034) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 121.513 71.034) (end 121.5208 71.034) (width 0.3048) (layer B.Cu) (net 1) (tstamp 578F6446))\n  (segment (start 107.5508 74.9187) (end 108.9478 74.9187) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 108.9478 74.9187) (end 110.3448 74.9187) (width 0.9) (layer B.Cu) (net 1) (tstamp 5779933B))\n  (segment (start 85.9608 70.6007) (end 86.0243 70.6642) (width 0.3048) (layer B.Cu) (net 1))\n  (segment (start 86.0243 70.6642) (end 86.4688 71.1087) (width 0.635) (layer B.Cu) (net 1) (tstamp 577991A3))\n  (segment (start 85.9608 65.0127) (end 85.9608 70.6007) (width 0.635) (layer B.Cu) (net 1) (tstamp 577861DB))\n  (segment (start 86.7228 64.2507) (end 85.9608 65.0127) (width 0.635) (layer B.Cu) (net 1) (tstamp 577861DA))\n  (segment (start 89.2628 64.2507) (end 86.7228 64.2507) (width 0.635) (layer B.Cu) (net 1) (tstamp 577861D9))\n  (segment (start 90.0248 63.4887) (end 89.2628 64.2507) (width 0.635) (layer B.Cu) (net 1) (tstamp 577861D8))\n  (segment (start 90.0248 62.2187) (end 90.0248 63.4887) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 86.4688 71.1087) (end 96.367 71.1087) (width 0.635) (layer B.Cu) (net 1) (tstamp 577861F6))\n  (segment (start 96.367 71.1087) (end 96.3748 71.1087) (width 0.3048) (layer B.Cu) (net 1) (tstamp 578F6458))\n  (segment (start 121.5208 71.1087) (end 121.5208 71.034) (width 0.3048) (layer B.Cu) (net 1))\n  (segment (start 111.1068 71.1087) (end 121.5208 71.1087) (width 0.6) (layer B.Cu) (net 1) (tstamp 5779727C))\n  (segment (start 121.5208 71.1087) (end 131.4268 71.1087) (width 0.6) (layer B.Cu) (net 1) (tstamp 57797285))\n  (segment (start 107.5508 67.2987) (end 108.94 67.2987) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 108.94 67.2987) (end 110.3448 67.2987) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F6452))\n  (segment (start 96.3748 71.1087) (end 106.7888 71.1087) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 106.7888 71.1087) (end 107.5508 70.3467) (width 0.9) (layer B.Cu) (net 1) (tstamp 577861F7))\n  (segment (start 107.5508 70.3467) (end 107.5508 67.2987) (width 0.9) (layer B.Cu) (net 1) (tstamp 577861F8))\n  (segment (start 110.3448 67.2987) (end 110.3448 70.3467) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 110.3448 70.3467) (end 111.1068 71.1087) (width 0.9) (layer B.Cu) (net 1) (tstamp 5779727B))\n  (segment (start 96.3748 67.2987) (end 96.3748 71.1087) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 121.5208 71.034) (end 121.5208 67.2987) (width 0.9) (layer B.Cu) (net 1) (tstamp 578F6447))\n  (segment (start 110.337 90.592) (end 110.337 93.537) (width 0.6) (layer B.Cu) (net 1))\n  (segment (start 131.1035 94.8) (end 131.9983 93.9052) (width 0.6) (layer B.Cu) (net 1) (tstamp 5957041D))\n  (segment (start 111.6 94.8) (end 131.1035 94.8) (width 0.6) (layer B.Cu) (net 1) (tstamp 5957041A))\n  (segment (start 110.337 93.537) (end 111.6 94.8) (width 0.6) (layer B.Cu) (net 1) (tstamp 59570418))\n  (segment (start 108.94 98.2867) (end 108.94 90.719) (width 1.2) (layer B.Cu) (net 1))\n  (segment (start 108.94 90.719) (end 108.94 90.6667) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F6430))\n  (segment (start 96.367 98.339) (end 96.367 94.529) (width 1.2) (layer B.Cu) (net 1))\n  (segment (start 96.367 94.529) (end 96.367 94.4767) (width 0.3048) (layer B.Cu) (net 1) (tstamp 578F641A))\n  (segment (start 107.5508 98.2867) (end 108.94 98.2867) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 108.94 98.2867) (end 110.3448 98.2867) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F642A))\n  (segment (start 107.5508 90.6667) (end 108.94 90.6667) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 108.94 90.6667) (end 109.0748 90.6667) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F6431))\n  (segment (start 109.0748 90.6667) (end 110.3448 90.6667) (width 0.635) (layer B.Cu) (net 1) (tstamp 57799351))\n  (segment (start 128.6328 87.6187) (end 127.8708 86.8567) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972DB))\n  (segment (start 127.8708 86.8567) (end 127.8708 85.5867) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972DA))\n  (segment (start 86.4688 94.4767) (end 96.367 94.4767) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972ED))\n  (segment (start 85.9608 93.9687) (end 86.4688 94.4767) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972E7))\n  (segment (start 85.9608 94.5) (end 85.9608 93.9687) (width 1.2) (layer B.Cu) (net 1) (tstamp 595A38D4))\n  (segment (start 96.367 94.4767) (end 96.3748 94.4767) (width 0.3048) (layer B.Cu) (net 1) (tstamp 578F641B))\n  (segment (start 90.0248 85.5867) (end 90.0248 86.3567) (width 0.3048) (layer B.Cu) (net 1) (tstamp 577972EC))\n  (segment (start 85.9608 88.3807) (end 85.9608 94.5) (width 1.2) (layer B.Cu) (net 1) (tstamp 577972EB))\n  (segment (start 90.0248 86.3567) (end 88.4628 87.9187) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972E8))\n  (segment (start 88.4628 87.9187) (end 86.4228 87.9187) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972E9))\n  (segment (start 86.4228 87.9187) (end 85.9608 88.3807) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972EA))\n  (segment (start 96.3748 90.6667) (end 96.3748 94.4767) (width 1.2) (layer B.Cu) (net 1) (tstamp 577972E6))\n  (segment (start 107.5508 93.7147) (end 107.5508 90.6667) (width 0.9) (layer B.Cu) (net 1) (tstamp 577972E5))\n  (segment (start 106.7888 94.4767) (end 107.5508 93.7147) (width 0.9) (layer B.Cu) (net 1) (tstamp 577972E4))\n  (segment (start 96.3748 94.4767) (end 106.7888 94.4767) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972E3))\n  (segment (start 131.4268 94.4767) (end 131.9983 93.9052) (width 0.3048) (layer B.Cu) (net 1) (tstamp 577972DF))\n  (segment (start 131.9983 93.9052) (end 131.9348 93.9687) (width 0.3048) (layer B.Cu) (net 1) (tstamp 57799A41))\n  (segment (start 131.9348 93.9687) (end 131.9348 88.3807) (width 0.9) (layer B.Cu) (net 1) (tstamp 577972DE))\n  (segment (start 131.9348 88.3807) (end 131.1728 87.6187) (width 0.9) (layer B.Cu) (net 1) (tstamp 577972DD))\n  (segment (start 131.1728 87.6187) (end 128.6328 87.6187) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972DC))\n  (segment (start 87.4848 62.2187) (end 87.7388 61.9647) (width 0.3048) (layer B.Cu) (net 2) (tstamp 577861A8))\n  (segment (start 87.7388 61.9647) (end 87.4848 62.2187) (width 0.3048) (layer B.Cu) (net 2) (tstamp 577861AA))\n  (segment (start 83.4208 62.2187) (end 87.4848 62.2187) (width 1.2) (layer B.Cu) (net 2))\n  (segment (start 134.4748 62.2187) (end 130.4108 62.2187) (width 0.9) (layer B.Cu) (net 3))\n  (segment (start 134.4748 85.5867) (end 130.4108 85.5867) (width 0.9) (layer B.Cu) (net 4) (tstamp 577972EE))\n  (segment (start 120.410164 56.516464) (end 120.936536 56.516464) (width 0.3048) (layer B.Cu) (net 5))\n  (segment (start 123.2353 54.2177) (end 123.2353 52.0587) (width 0.9) (layer B.Cu) (net 5) (tstamp 57799117))\n  (segment (start 120.936536 56.516464) (end 123.2353 54.2177) (width 0.9) (layer B.Cu) (net 5) (tstamp 57799116))\n  (segment (start 119.140164 57.786464) (end 117.616164 57.786465) (width 0.9) (layer B.Cu) (net 6))\n  (segment (start 113.552164 53.722465) (end 111.266164 53.722465) (width 0.9) (layer B.Cu) (net 6) (tstamp 57796343))\n  (segment (start 117.616164 57.786465) (end 113.552164 53.722465) (width 0.9) (layer B.Cu) (net 6) (tstamp 57796341))\n  (segment (start 111.266164 53.722465) (end 111.178971 53.624429) (width 0.3048) (layer B.Cu) (net 6) (tstamp 57796346))\n  (segment (start 111.262972 53.694429) (end 111.178971 53.624429) (width 0.3048) (layer B.Cu) (net 6) (tstamp 5778582A))\n  (segment (start 82.1508 64.5047) (end 82.1508 60.9487) (width 0.45) (layer B.Cu) (net 7) (tstamp 577861A5))\n  (segment (start 82.6588 65.0127) (end 82.1508 64.5047) (width 0.635) (layer B.Cu) (net 7) (tstamp 577861A4))\n  (segment (start 83.4208 65.0127) (end 82.6588 65.0127) (width 0.635) (layer B.Cu) (net 7) (tstamp 577861A3))\n  (segment (start 83.9288 65.5207) (end 83.4208 65.0127) (width 0.635) (layer B.Cu) (net 7) (tstamp 577861A2))\n  (segment (start 83.9288 67.0447) (end 83.9288 65.5207) (width 0.635) (layer B.Cu) (net 7))\n  (segment (start 81.08405 65.21595) (end 81.08405 65.08405) (width 0.6) (layer B.Cu) (net 8))\n  (segment (start 80.873 64.873) (end 80.873 62.144) (width 0.6) (layer B.Cu) (net 8) (tstamp 595730D1))\n  (segment (start 81.08405 65.08405) (end 80.873 64.873) (width 0.6) (layer B.Cu) (net 8) (tstamp 595730D0))\n  (segment (start 82.1508 66.2827) (end 81.08405 65.21595) (width 0.45) (layer B.Cu) (net 8) (tstamp 5778619C))\n  (segment (start 81.08405 65.21595) (end 80.8808 65.0127) (width 0.45) (layer B.Cu) (net 8) (tstamp 595730CE))\n  (segment (start 82.1508 69.0767) (end 82.1508 66.2827) (width 0.45) (layer B.Cu) (net 8) (tstamp 5778619A))\n  (segment (start 80.3728 70.8547) (end 82.1508 69.0767) (width 0.9) (layer B.Cu) (net 8) (tstamp 57786198))\n  (segment (start 80.3728 74.6647) (end 80.3728 70.8547) (width 0.9) (layer B.Cu) (net 8))\n  (segment (start 135.7448 63.4887) (end 135.7448 64.5047) (width 0.9) (layer B.Cu) (net 9))\n  (segment (start 133.9668 65.5207) (end 133.9668 66.7907) (width 0.9) (layer B.Cu) (net 9) (tstamp 577972C7))\n  (segment (start 134.4748 65.0127) (end 133.9668 65.5207) (width 0.9) (layer B.Cu) (net 9) (tstamp 577972C6))\n  (segment (start 135.2368 65.0127) (end 134.4748 65.0127) (width 0.9) (layer B.Cu) (net 9) (tstamp 577972C5))\n  (segment (start 135.7448 64.5047) (end 135.2368 65.0127) (width 0.9) (layer B.Cu) (net 9) (tstamp 577972C4))\n  (segment (start 133.9668 66.7907) (end 134.2208 67.0447) (width 0.3048) (layer B.Cu) (net 9) (tstamp 577972C8))\n  (segment (start 137.5228 74.6647) (end 137.5228 70.8547) (width 0.9) (layer B.Cu) (net 10))\n  (segment (start 137.0148 65.0127) (end 137.0148 62.2187) (width 0.45) (layer B.Cu) (net 10) (tstamp 577972D0))\n  (segment (start 135.7448 66.2827) (end 137.0148 65.0127) (width 0.45) (layer B.Cu) (net 10) (tstamp 577972CF))\n  (segment (start 135.7448 69.0767) (end 135.7448 66.2827) (width 0.45) (layer B.Cu) (net 10) (tstamp 577972CE))\n  (segment (start 137.5228 70.8547) (end 135.7448 69.0767) (width 0.9) (layer B.Cu) (net 10) (tstamp 577972CD))\n  (segment (start 133.9668 90.1587) (end 134.2208 90.4127) (width 0.3048) (layer B.Cu) (net 11) (tstamp 577972F7))\n  (segment (start 133.9668 88.8887) (end 133.9668 90.1587) (width 0.6) (layer B.Cu) (net 11) (tstamp 577972F3))\n  (segment (start 134.4748 88.3807) (end 133.9668 88.8887) (width 0.6) (layer B.Cu) (net 11) (tstamp 577972F4))\n  (segment (start 135.2368 88.3807) (end 134.4748 88.3807) (width 0.6) (layer B.Cu) (net 11) (tstamp 577972F5))\n  (segment (start 135.7448 87.8727) (end 135.2368 88.3807) (width 0.6) (layer B.Cu) (net 11) (tstamp 577972F6))\n  (segment (start 135.7448 86.8567) (end 135.7448 87.8727) (width 0.6) (layer B.Cu) (net 11) (tstamp 577972F2))\n  (segment (start 137.6 86.105) (end 137.007 85.512) (width 0.6) (layer B.Cu) (net 12) (tstamp 595710AD))\n  (segment (start 137.6 87.6) (end 137.6 86.105) (width 0.6) (layer B.Cu) (net 12) (tstamp 595710A8))\n  (segment (start 135.7 89.5) (end 137.6 87.6) (width 0.6) (layer B.Cu) (net 12) (tstamp 595710A4))\n  (segment (start 135.7 93.8) (end 135.7 89.5) (width 0.6) (layer B.Cu) (net 12) (tstamp 5957109D))\n  (segment (start 137.515 98.085) (end 137.515 95.615) (width 0.6) (layer B.Cu) (net 12))\n  (segment (start 137.515 95.615) (end 135.7 93.8) (width 0.6) (layer B.Cu) (net 12) (tstamp 5957109B))\n  (segment (start 74.65 73.828) (end 76.828 73.828) (width 0.9) (layer B.Cu) (net 13))\n  (segment (start 81 77.6) (end 85.483 77.6) (width 0.45) (layer B.Cu) (net 13) (tstamp 595715AB))\n  (segment (start 85.483 77.6) (end 88.239 74.844) (width 0.45) (layer B.Cu) (net 13) (tstamp 59570BCA))\n  (segment (start 79.1 77.6) (end 77.2 75.7) (width 0.45) (layer B.Cu) (net 13) (tstamp 595715AD))\n  (segment (start 77.2 75.7) (end 77.2 74.2) (width 0.45) (layer B.Cu) (net 13) (tstamp 595715AF))\n  (segment (start 77.2 74.2) (end 76.9 73.9) (width 0.45) (layer B.Cu) (net 13) (tstamp 595715B1))\n  (segment (start 81 77.6) (end 79.1 77.6) (width 0.45) (layer B.Cu) (net 13))\n  (segment (start 76.828 73.828) (end 76.9 73.9) (width 0.9) (layer B.Cu) (net 13) (tstamp 59572D3C))\n  (segment (start 91.287 74.844) (end 91.287 72.939) (width 1.2) (layer B.Cu) (net 13))\n  (segment (start 91.287 69.637) (end 91.287 67.224) (width 1.2) (layer B.Cu) (net 13) (tstamp 57980540))\n  (via (at 91.287 69.637) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 13))\n  (segment (start 91.287 72.939) (end 91.287 69.637) (width 0.3048) (layer F.Cu) (net 13) (tstamp 5798053D))\n  (via (at 91.287 72.939) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 13))\n  (segment (start 91.0408 74.6647) (end 91.2948 74.9187) (width 0.3048) (layer B.Cu) (net 13) (tstamp 577861FD))\n  (segment (start 88.2468 74.6647) (end 91.0408 74.6647) (width 1.2) (layer B.Cu) (net 13))\n  (segment (start 74.65 76.368) (end 75.668 76.368) (width 0.9) (layer B.Cu) (net 14))\n  (segment (start 77.9 78.6) (end 76.8 77.5) (width 0.45) (layer B.Cu) (net 14) (tstamp 59571D85))\n  (segment (start 95.659 78.6) (end 99.415 74.844) (width 0.45) (layer B.Cu) (net 14) (tstamp 59570BB3))\n  (segment (start 95.659 78.6) (end 77.9 78.6) (width 0.45) (layer B.Cu) (net 14))\n  (segment (start 75.668 76.368) (end 76.8 77.5) (width 0.9) (layer B.Cu) (net 14) (tstamp 59572D3F))\n  (segment (start 102.463 74.844) (end 102.463 72.685) (width 0.9) (layer B.Cu) (net 14))\n  (segment (start 102.463 69.002) (end 102.463 67.224) (width 0.9) (layer B.Cu) (net 14) (tstamp 57980538))\n  (segment (start 102.336 69.129) (end 102.463 69.002) (width 0.3048) (layer B.Cu) (net 14) (tstamp 57980537))\n  (via (at 102.336 69.129) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 14))\n  (segment (start 102.336 72.558) (end 102.336 69.129) (width 0.3048) (layer F.Cu) (net 14) (tstamp 57980535))\n  (segment (start 102.463 72.685) (end 102.336 72.558) (width 0.3048) (layer F.Cu) (net 14) (tstamp 57980534))\n  (via (at 102.463 72.685) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 14))\n  (segment (start 102.4708 74.9187) (end 99.4228 74.9187) (width 0.9) (layer B.Cu) (net 14))\n  (segment (start 74.65 81.448) (end 77.152 81.448) (width 0.9) (layer B.Cu) (net 15))\n  (segment (start 95.1 80.8) (end 77.8 80.8) (width 0.45) (layer B.Cu) (net 15) (tstamp 59571DCD))\n  (segment (start 77.8 80.8) (end 77.3 81.3) (width 0.45) (layer B.Cu) (net 15) (tstamp 59571DD0))\n  (segment (start 119.237 82.2) (end 126.593 74.844) (width 0.9) (layer B.Cu) (net 15) (tstamp 59570AF5))\n  (segment (start 96.5 82.2) (end 119.237 82.2) (width 0.9) (layer B.Cu) (net 15) (tstamp 59570AF1))\n  (segment (start 96.05 81.75) (end 96.5 82.2) (width 0.45) (layer B.Cu) (net 15) (tstamp 59570AE9))\n  (segment (start 96.05 81.75) (end 95.1 80.8) (width 0.45) (layer B.Cu) (net 15))\n  (segment (start 77.152 81.448) (end 77.3 81.3) (width 0.9) (layer B.Cu) (net 15) (tstamp 59572D4C))\n  (segment (start 129.641 74.717) (end 126.72 74.717) (width 0.9) (layer B.Cu) (net 15))\n  (segment (start 126.72 74.717) (end 126.593 74.844) (width 0.9) (layer B.Cu) (net 15) (tstamp 595705D4))\n  (segment (start 126.593 74.844) (end 126.593 72.812) (width 0.9) (layer B.Cu) (net 15))\n  (segment (start 126.593 69.637) (end 126.593 67.224) (width 0.9) (layer B.Cu) (net 15) (tstamp 57980517))\n  (via (at 126.593 69.637) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 15))\n  (segment (start 126.593 72.812) (end 126.593 69.637) (width 0.3048) (layer F.Cu) (net 15) (tstamp 57980514))\n  (via (at 126.593 72.812) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 15))\n  (segment (start 126.6008 74.9187) (end 126.8548 74.6647) (width 0.3048) (layer B.Cu) (net 15))\n  (segment (start 74.65 78.908) (end 76.108 78.908) (width 0.9) (layer B.Cu) (net 16))\n  (segment (start 76.108 78.908) (end 76.8 79.6) (width 0.9) (layer B.Cu) (net 16) (tstamp 59572D42))\n  (segment (start 96.1 79.6) (end 76.8 79.6) (width 0.45) (layer B.Cu) (net 16))\n  (segment (start 96.1 79.6) (end 97 80.5) (width 0.45) (layer B.Cu) (net 16) (tstamp 59570B75))\n  (segment (start 97 80.5) (end 112.936 80.5) (width 0.9) (layer B.Cu) (net 16) (tstamp 59570B79))\n  (segment (start 118.465 74.971) (end 112.936 80.5) (width 0.9) (layer B.Cu) (net 16) (tstamp 59570B82))\n  (segment (start 76.8 79.6) (end 76.9 79.7) (width 0.45) (layer B.Cu) (net 16) (tstamp 59571DBF))\n  (segment (start 115.417 74.844) (end 115.417 72.939) (width 0.9) (layer B.Cu) (net 16))\n  (segment (start 115.417 69.51) (end 115.417 67.224) (width 0.9) (layer B.Cu) (net 16) (tstamp 57980526))\n  (via (at 115.417 69.51) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 16))\n  (segment (start 115.417 72.939) (end 115.417 69.51) (width 0.3048) (layer F.Cu) (net 16) (tstamp 57980523))\n  (via (at 115.417 72.939) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 16))\n  (segment (start 115.4248 74.9187) (end 119.2348 74.9187) (width 0.9) (layer B.Cu) (net 16))\n  (segment (start 74.65 94.148) (end 76.548 94.148) (width 0.9) (layer B.Cu) (net 17))\n  (segment (start 77.5 95.1) (end 76.75 94.35) (width 0.45) (layer B.Cu) (net 17) (tstamp 59571755))\n  (segment (start 77.5 99.6) (end 77.5 95.1) (width 0.45) (layer B.Cu) (net 17) (tstamp 59571753))\n  (segment (start 78.9 101) (end 77.5 99.6) (width 0.45) (layer B.Cu) (net 17) (tstamp 5957174D))\n  (segment (start 85.1 101) (end 78.9 101) (width 0.6) (layer B.Cu) (net 17) (tstamp 59571744))\n  (segment (start 85.1 101) (end 88.142 97.958) (width 0.6) (layer B.Cu) (net 17) (tstamp 59571741))\n  (segment (start 76.548 94.148) (end 76.75 94.35) (width 0.9) (layer B.Cu) (net 17) (tstamp 59572D5E))\n  (segment (start 88.239 97.958) (end 88.142 97.958) (width 0.45) (layer B.Cu) (net 17))\n  (segment (start 91.287 98.339) (end 91.287 96.18) (width 0.9) (layer B.Cu) (net 17))\n  (segment (start 91.287 93.005) (end 91.287 90.719) (width 0.9) (layer B.Cu) (net 17) (tstamp 579804D1))\n  (via (at 91.287 93.005) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 17))\n  (segment (start 91.287 96.18) (end 91.287 93.005) (width 0.3048) (layer F.Cu) (net 17) (tstamp 579804CE))\n  (via (at 91.287 96.18) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 17))\n  (segment (start 91.0408 98.0327) (end 91.2948 98.2867) (width 0.3048) (layer B.Cu) (net 17) (tstamp 57797331))\n  (segment (start 88.2468 98.0327) (end 91.0408 98.0327) (width 0.9) (layer B.Cu) (net 17) (tstamp 57797330))\n  (segment (start 74.6534 94.1514) (end 74.65 94.148) (width 0.3048) (layer B.Cu) (net 17) (tstamp 578EDAAD))\n  (segment (start 70.1 95.2) (end 70.1 94.9) (width 0.9) (layer B.Cu) (net 18))\n  (segment (start 129.641 100.059) (end 125.1 104.6) (width 0.6) (layer B.Cu) (net 18) (tstamp 59571839))\n  (segment (start 125.1 104.6) (end 73.9 104.6) (width 0.6) (layer B.Cu) (net 18) (tstamp 5957183F))\n  (segment (start 73.9 104.6) (end 70.1 100.8) (width 0.6) (layer B.Cu) (net 18) (tstamp 59571844))\n  (segment (start 70.1 100.8) (end 70.1 95.2) (width 0.6) (layer B.Cu) (net 18) (tstamp 5957184D))\n  (segment (start 129.641 98.085) (end 129.641 100.059) (width 0.6) (layer B.Cu) (net 18))\n  (segment (start 70.852 94.148) (end 72.11 94.148) (width 0.9) (layer B.Cu) (net 18) (tstamp 59572D74))\n  (segment (start 70.1 94.9) (end 70.852 94.148) (width 0.9) (layer B.Cu) (net 18) (tstamp 59572D71))\n  (segment (start 126.593 98.212) (end 126.593 96.434) (width 0.9) (layer B.Cu) (net 18))\n  (segment (start 126.593 92.878) (end 126.593 90.592) (width 0.9) (layer B.Cu) (net 18) (tstamp 579804B8))\n  (via (at 126.593 92.878) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 18))\n  (segment (start 126.593 96.434) (end 126.593 92.878) (width 0.3048) (layer F.Cu) (net 18) (tstamp 579804B1))\n  (via (at 126.593 96.434) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 18))\n  (segment (start 129.641 98.085) (end 126.72 98.085) (width 0.9) (layer B.Cu) (net 18))\n  (segment (start 126.72 98.085) (end 126.593 98.212) (width 0.3048) (layer B.Cu) (net 18) (tstamp 578F69ED))\n  (segment (start 118.973 55.286) (end 118.973 51.015307) (width 1.5) (layer B.Cu) (net 19))\n  (segment (start 118.7 50.742307) (end 117.108164 49.150464) (width 1.5) (layer B.Cu) (net 19) (tstamp 5779633D))\n  (segment (start 117.108164 49.150464) (end 115.584164 49.150465) (width 1.5) (layer B.Cu) (net 19) (tstamp 5779633E))\n  (segment (start 118.973 51.015307) (end 118.7 50.742307) (width 1.5) (layer B.Cu) (net 19) (tstamp 59570D1F))\n  (segment (start 83.4208 85.5867) (end 87.4848 85.5867) (width 0.9) (layer B.Cu) (net 20) (tstamp 577972EF))\n  (segment (start 87.7388 85.3327) (end 87.4848 85.5867) (width 0.3048) (layer B.Cu) (net 20) (tstamp 577972F1))\n  (segment (start 87.4848 85.5867) (end 87.7388 85.3327) (width 0.3048) (layer B.Cu) (net 20) (tstamp 577972F0))\n  (segment (start 83.9288 88.8887) (end 83.4208 88.3807) (width 0.6) (layer B.Cu) (net 21) (tstamp 577972FC))\n  (segment (start 83.4208 88.3807) (end 82.6588 88.3807) (width 0.6) (layer B.Cu) (net 21) (tstamp 577972FB))\n  (segment (start 82.6588 88.3807) (end 82.1508 87.8727) (width 0.6) (layer B.Cu) (net 21) (tstamp 577972FA))\n  (segment (start 83.9288 90.4127) (end 83.9288 88.8887) (width 0.6) (layer B.Cu) (net 21) (tstamp 577972F8))\n  (segment (start 82.1508 87.8727) (end 82.1508 84.3167) (width 0.45) (layer B.Cu) (net 21) (tstamp 577972F9))\n  (segment (start 80.3728 94.2227) (end 82.1508 92.4447) (width 1.5) (layer B.Cu) (net 22) (tstamp 57797306))\n  (segment (start 82.1508 92.4447) (end 82.1508 89.6507) (width 0.45) (layer B.Cu) (net 22) (tstamp 57797305))\n  (segment (start 82.1508 89.6507) (end 80.8808 88.3807) (width 0.45) (layer B.Cu) (net 22) (tstamp 57797304))\n  (segment (start 80.3728 98.0327) (end 80.3728 94.2227) (width 1.5) (layer B.Cu) (net 22) (tstamp 57797302))\n  (segment (start 80.8808 88.3807) (end 80.8808 85.5867) (width 0.6) (layer B.Cu) (net 22) (tstamp 57797303))\n  (segment (start 74.65 96.688) (end 76.488 96.688) (width 0.45) (layer B.Cu) (net 23))\n  (segment (start 95.8 102.2) (end 99.415 98.585) (width 0.6) (layer B.Cu) (net 23) (tstamp 5957175E))\n  (segment (start 95.8 102.2) (end 78.1 102.2) (width 0.6) (layer B.Cu) (net 23) (tstamp 5957176C))\n  (segment (start 78.1 102.2) (end 76.6 100.7) (width 0.45) (layer B.Cu) (net 23) (tstamp 59571774))\n  (segment (start 76.6 96.8) (end 76.6 100.7) (width 0.45) (layer B.Cu) (net 23))\n  (segment (start 76.488 96.688) (end 76.6 96.8) (width 0.45) (layer B.Cu) (net 23) (tstamp 59572D61))\n  (segment (start 99.415 98.466) (end 99.415 98.585) (width 0.9) (layer B.Cu) (net 23))\n  (segment (start 102.463 98.339) (end 102.463 96.434) (width 0.9) (layer B.Cu) (net 23))\n  (segment (start 102.463 93.005) (end 102.463 90.719) (width 0.9) (layer B.Cu) (net 23) (tstamp 579804C9))\n  (via (at 102.463 93.005) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 23))\n  (segment (start 102.463 96.434) (end 102.463 93.005) (width 0.3048) (layer F.Cu) (net 23) (tstamp 579804C6))\n  (via (at 102.463 96.434) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 23))\n  (segment (start 102.4708 98.2867) (end 99.4228 98.2867) (width 0.9) (layer B.Cu) (net 23) (tstamp 5779733C))\n  (segment (start 99.4228 98.2867) (end 98.6608 98.2867) (width 0.3048) (layer B.Cu) (net 23) (tstamp 57797337))\n  (segment (start 74.65 99.228) (end 74.65 100.85) (width 0.9) (layer B.Cu) (net 24))\n  (segment (start 114.3 103.4) (end 77.2 103.4) (width 0.6) (layer B.Cu) (net 24) (tstamp 59571822))\n  (segment (start 77.2 103.4) (end 74.9 101.1) (width 0.6) (layer B.Cu) (net 24) (tstamp 5957182E))\n  (segment (start 114.3 103.4) (end 118.465 99.235) (width 0.6) (layer B.Cu) (net 24) (tstamp 5957181E))\n  (segment (start 74.65 100.85) (end 74.9 101.1) (width 0.9) (layer B.Cu) (net 24) (tstamp 59572D6C))\n  (segment (start 118.465 98.339) (end 118.465 99.235) (width 0.45) (layer B.Cu) (net 24))\n  (segment (start 115.417 98.212) (end 115.417 96.434) (width 0.9) (layer B.Cu) (net 24))\n  (segment (start 115.417 93.259) (end 115.417 90.592) (width 0.9) (layer B.Cu) (net 24) (tstamp 579804A6))\n  (via (at 115.417 93.259) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 24))\n  (segment (start 115.417 96.434) (end 115.417 93.259) (width 0.3048) (layer F.Cu) (net 24) (tstamp 579804A3))\n  (via (at 115.417 96.434) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 24))\n  (segment (start 118.465 98.339) (end 115.544 98.339) (width 0.9) (layer B.Cu) (net 24))\n  (segment (start 115.544 98.339) (end 115.417 98.212) (width 0.3048) (layer B.Cu) (net 24) (tstamp 578F69DE))\n  (segment (start 72.11 50.968) (end 72.11 49.69) (width 1.2) (layer B.Cu) (net 25))\n  (segment (start 78.6651 48.7) (end 81.0078 51.0427) (width 1.2) (layer B.Cu) (net 25) (tstamp 59570FF7))\n  (segment (start 73.1 48.7) (end 78.6651 48.7) (width 1.2) (layer B.Cu) (net 25) (tstamp 59570FEF))\n  (segment (start 72.11 49.69) (end 73.1 48.7) (width 1.2) (layer B.Cu) (net 25) (tstamp 59570FE6))\n  (segment (start 74.65 50.968) (end 76.968 50.968) (width 1.2) (layer B.Cu) (net 26))\n  (segment (start 78.8827 53.5827) (end 81.0078 53.5827) (width 1.2) (layer B.Cu) (net 26) (tstamp 5957100A))\n  (segment (start 78 52.7) (end 78.8827 53.5827) (width 1.2) (layer B.Cu) (net 26) (tstamp 59571009))\n  (segment (start 78 52) (end 78 52.7) (width 1.2) (layer B.Cu) (net 26) (tstamp 59571007))\n  (segment (start 76.968 50.968) (end 78 52) (width 1.2) (layer B.Cu) (net 26) (tstamp 59571004))\n  (segment (start 74.65 71.288) (end 76.488 71.288) (width 0.9) (layer B.Cu) (net 27))\n  (segment (start 76.488 71.288) (end 76.6 71.4) (width 0.9) (layer B.Cu) (net 27) (tstamp 59572D38))\n  (segment (start 81.4 76.6) (end 79.5 76.6) (width 0.45) (layer B.Cu) (net 27))\n  (segment (start 76.6 71.4) (end 76.5 71.4) (width 0.45) (layer B.Cu) (net 27) (tstamp 5957157A))\n  (segment (start 78.3 73.1) (end 76.6 71.4) (width 0.45) (layer B.Cu) (net 27) (tstamp 59571577))\n  (segment (start 78.3 75.4) (end 78.3 73.1) (width 0.45) (layer B.Cu) (net 27) (tstamp 59571571))\n  (segment (start 79.5 76.6) (end 78.3 75.4) (width 0.45) (layer B.Cu) (net 27) (tstamp 5957156D))\n  (segment (start 83.921 76.079) (end 83.921 74.717) (width 0.6) (layer B.Cu) (net 27) (tstamp 59570BE3))\n  (segment (start 83.4 76.6) (end 83.921 76.079) (width 0.6) (layer B.Cu) (net 27) (tstamp 59570BDE))\n  (segment (start 81.4 76.6) (end 83.4 76.6) (width 0.45) (layer B.Cu) (net 27) (tstamp 5957156B))\n  (segment (start 134.086 76.714) (end 134.086 74.717) (width 0.9) (layer B.Cu) (net 28))\n  (segment (start 133.9668 74.6647) (end 134.2208 74.6647) (width 0.3048) (layer B.Cu) (net 28) (tstamp 577972AC))\n  (segment (start 131 79.8) (end 125.1 79.8) (width 0.9) (layer B.Cu) (net 28) (tstamp 59570A95))\n  (segment (start 134.086 76.714) (end 131 79.8) (width 0.9) (layer B.Cu) (net 28) (tstamp 59570A93))\n  (segment (start 74.65 83.988) (end 77.012 83.988) (width 0.9) (layer B.Cu) (net 28))\n  (segment (start 94.5 82.9) (end 93.4 81.8) (width 0.45) (layer B.Cu) (net 28) (tstamp 59571DE6))\n  (segment (start 93.4 81.8) (end 79.2 81.8) (width 0.45) (layer B.Cu) (net 28) (tstamp 59571DE8))\n  (segment (start 79.2 81.8) (end 77.2 83.8) (width 0.45) (layer B.Cu) (net 28) (tstamp 59571DEB))\n  (segment (start 96.7 84.4) (end 95.2 82.9) (width 0.45) (layer B.Cu) (net 28) (tstamp 59570A9E))\n  (segment (start 120.5 84.4) (end 96.7 84.4) (width 0.9) (layer B.Cu) (net 28) (tstamp 59570A9C))\n  (segment (start 125.1 79.8) (end 120.5 84.4) (width 0.9) (layer B.Cu) (net 28) (tstamp 59570A99))\n  (segment (start 95.2 82.9) (end 94.5 82.9) (width 0.45) (layer B.Cu) (net 28))\n  (segment (start 77.012 83.988) (end 77.2 83.8) (width 0.9) (layer B.Cu) (net 28) (tstamp 59572D51))\n  (segment (start 74.65 91.608) (end 77.408 91.608) (width 0.9) (layer B.Cu) (net 29))\n  (segment (start 78.5 92.7) (end 77.25 91.45) (width 0.45) (layer B.Cu) (net 29) (tstamp 59571733))\n  (segment (start 78.5 98.8) (end 78.5 92.7) (width 0.45) (layer B.Cu) (net 29) (tstamp 59571730))\n  (segment (start 79.6 99.9) (end 78.5 98.8) (width 0.45) (layer B.Cu) (net 29) (tstamp 5957172F))\n  (segment (start 81.9 99.9) (end 79.6 99.9) (width 0.45) (layer B.Cu) (net 29) (tstamp 59571729))\n  (segment (start 81.9 99.9) (end 83.842 97.958) (width 0.6) (layer B.Cu) (net 29) (tstamp 59571721))\n  (segment (start 77.408 91.608) (end 77.25 91.45) (width 0.9) (layer B.Cu) (net 29) (tstamp 59572D5A))\n  (segment (start 83.921 97.958) (end 83.842 97.958) (width 0.45) (layer B.Cu) (net 29))\n  (segment (start 69.8 92.1) (end 70.3 91.6) (width 0.9) (layer B.Cu) (net 30))\n  (segment (start 133.959 100.341) (end 128.4 105.9) (width 0.6) (layer B.Cu) (net 30) (tstamp 59571885))\n  (segment (start 128.4 105.9) (end 72.5 105.9) (width 0.6) (layer B.Cu) (net 30) (tstamp 59571887))\n  (segment (start 72.5 105.9) (end 68.8 102.2) (width 0.6) (layer B.Cu) (net 30) (tstamp 595718AC))\n  (segment (start 68.8 102.2) (end 68.8 93.1) (width 0.6) (layer B.Cu) (net 30) (tstamp 595718B9))\n  (segment (start 68.8 93.1) (end 69.8 92.1) (width 0.6) (layer B.Cu) (net 30) (tstamp 595718C4))\n  (segment (start 133.959 98.085) (end 133.959 100.341) (width 0.6) (layer B.Cu) (net 30))\n  (segment (start 70.3 91.6) (end 72.102 91.6) (width 0.9) (layer B.Cu) (net 30) (tstamp 59572D77))\n  (segment (start 72.102 91.6) (end 72.11 91.608) (width 0.9) (layer B.Cu) (net 30) (tstamp 59572D7A))\n  (segment (start 72.11 61.128) (end 69.4 61.128) (width 0.9) (layer B.Cu) (net 31))\n  (segment (start 68.6 54.2) (end 69.4 55) (width 0.9) (layer B.Cu) (net 31) (tstamp 595718F7))\n  (segment (start 69.4 55) (end 69.4 61.3) (width 0.9) (layer B.Cu) (net 31) (tstamp 595718FC))\n  (segment (start 113.811 52.111) (end 115.544 52.111) (width 1.5) (layer B.Cu) (net 31) (tstamp 59570D0C))\n  (segment (start 111.6 49.9) (end 113.811 52.111) (width 1.5) (layer B.Cu) (net 31) (tstamp 59570D0A))\n  (segment (start 111.6 48.167) (end 111.6 49.9) (width 1.5) (layer B.Cu) (net 31) (tstamp 59570CFD))\n  (segment (start 107.733 44.3) (end 111.6 48.167) (width 1.5) (layer B.Cu) (net 31) (tstamp 59570CEB))\n  (segment (start 71.4 44.3) (end 107.733 44.3) (width 1.5) (layer B.Cu) (net 31) (tstamp 59570CE9))\n  (segment (start 68.6 47.1) (end 71.4 44.3) (width 0.9) (layer B.Cu) (net 31) (tstamp 59570CE0))\n  (segment (start 68.6 47.1) (end 68.6 54.2) (width 0.9) (layer B.Cu) (net 31))\n  (segment (start 69.4 61.128) (end 69.4 61.3) (width 0.9) (layer B.Cu) (net 31) (tstamp 59572D25))\n  (segment (start 137.515 67.097) (end 140.3168 67.097) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 140 67) (end 140.3168 67) (width 1.5) (layer B.Cu) (net 32) (tstamp 595A370F))\n  (segment (start 140.2198 67) (end 140 67) (width 1.5) (layer B.Cu) (net 32) (tstamp 595A370E))\n  (segment (start 140.3168 67.097) (end 140.2198 67) (width 1.5) (layer B.Cu) (net 32) (tstamp 595A370B))\n  (segment (start 99.415 86.8) (end 105.2 86.8) (width 1.2) (layer B.Cu) (net 32))\n  (segment (start 112.6 86.7) (end 123.2 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 595730A7))\n  (segment (start 112.2 86.3) (end 112.6 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 595730A6))\n  (segment (start 105.7 86.3) (end 112.2 86.3) (width 0.9) (layer B.Cu) (net 32) (tstamp 595730A5))\n  (segment (start 105.2 86.8) (end 105.7 86.3) (width 0.9) (layer B.Cu) (net 32) (tstamp 595730A4))\n  (segment (start 124.9 88.4) (end 123.2 86.7) (width 0.9) (layer B.Cu) (net 32) (tstamp 59570944))\n  (segment (start 127.5 88.4) (end 124.9 88.4) (width 0.9) (layer B.Cu) (net 32) (tstamp 59570942))\n  (segment (start 129.565 90.465) (end 127.5 88.4) (width 0.9) (layer B.Cu) (net 32) (tstamp 59570940))\n  (segment (start 99.415 90.846) (end 99.415 86.8) (width 1.2) (layer B.Cu) (net 32))\n  (segment (start 99.415 86.8) (end 99.415 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 595730A2))\n  (segment (start 129.641 90.465) (end 129.565 90.465) (width 0.9) (layer B.Cu) (net 32))\n  (segment (start 92.4 88.4) (end 92.7 88.4) (width 1.2) (layer B.Cu) (net 32))\n  (segment (start 90.2 88.4) (end 92.4 88.4) (width 0.9) (layer B.Cu) (net 32) (tstamp 595703A9))\n  (segment (start 88.262 90.338) (end 90.2 88.4) (width 0.9) (layer B.Cu) (net 32) (tstamp 595703A3))\n  (segment (start 92.7 88.4) (end 94.4 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570925))\n  (segment (start 99.5 87) (end 99.5 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570922))\n  (segment (start 99.5 86.785) (end 99.5 87) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570921))\n  (segment (start 99.415 86.7) (end 99.5 86.785) (width 1.2) (layer B.Cu) (net 32) (tstamp 5957091E))\n  (segment (start 93.4 84.2) (end 93.4 85.7) (width 1.2) (layer B.Cu) (net 32))\n  (segment (start 93.4 85.7) (end 94.4 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 595708F3))\n  (segment (start 125.7 82.7) (end 137.3 82.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570911))\n  (segment (start 123.2 86.7) (end 125.1 84.8) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570907))\n  (segment (start 125.1 84.8) (end 125.1 83.3) (width 1.2) (layer B.Cu) (net 32) (tstamp 5957090B))\n  (segment (start 125.1 83.3) (end 125.7 82.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 5957090C))\n  (segment (start 94.4 86.7) (end 99.5 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 595708FC))\n  (segment (start 137.25 82.65) (end 137.3 82.7) (width 0.9) (layer B.Cu) (net 32) (tstamp 595706E0))\n  (segment (start 137.3 82.7) (end 139.9 85.3) (width 1.5) (layer B.Cu) (net 32) (tstamp 59570915))\n  (segment (start 137.515 90.465) (end 139.9 88.08) (width 1.5) (layer B.Cu) (net 32) (tstamp 595706F9))\n  (segment (start 139.9 85.3) (end 139.9 88.08) (width 1.5) (layer B.Cu) (net 32) (tstamp 595706F4))\n  (segment (start 137.7 82.4) (end 140.3168 79.7832) (width 1.5) (layer B.Cu) (net 32) (tstamp 59570701))\n  (segment (start 140.3168 79.7832) (end 140.3168 67) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570702))\n  (segment (start 140.3168 67) (end 140.3168 64.5047) (width 1.2) (layer B.Cu) (net 32) (tstamp 595A3710))\n  (segment (start 139.6183 57.7737) (end 134.0938 57.7737) (width 1.5) (layer B.Cu) (net 32) (tstamp 57798EE3))\n  (segment (start 140.3168 58.4722) (end 139.9358 58.0912) (width 1.2) (layer B.Cu) (net 32) (tstamp 57798ED3))\n  (segment (start 139.9358 58.0912) (end 139.6183 57.7737) (width 0.635) (layer B.Cu) (net 32) (tstamp 57798F33))\n  (segment (start 140.3168 64.5047) (end 140.3168 58.4722) (width 1.2) (layer B.Cu) (net 32) (tstamp 57798EC9))\n  (segment (start 88.239 90.338) (end 88.262 90.338) (width 0.6) (layer B.Cu) (net 32))\n  (segment (start 80.365 90.338) (end 80.338 90.338) (width 0.6) (layer B.Cu) (net 32))\n  (segment (start 80.338 90.338) (end 79 89) (width 0.6) (layer B.Cu) (net 32) (tstamp 59570376))\n  (segment (start 79 89) (end 79 84.7) (width 0.6) (layer B.Cu) (net 32) (tstamp 59570379))\n  (segment (start 79 84.7) (end 80.7 83) (width 0.6) (layer B.Cu) (net 32) (tstamp 5957037C))\n  (segment (start 80.7 83) (end 92.2 83) (width 0.6) (layer B.Cu) (net 32) (tstamp 5957037E))\n  (segment (start 92.2 83) (end 93.4 84.2) (width 0.6) (layer B.Cu) (net 32) (tstamp 59570381))\n  (segment (start 93.4 84.2) (end 93.2 84) (width 0.9) (layer B.Cu) (net 32) (tstamp 595708F1))\n  (segment (start 134.0938 57.7737) (end 125.4578 57.7737) (width 1.5) (layer B.Cu) (net 32) (tstamp 577991FF))\n  (segment (start 125.5213 49.1377) (end 125.5213 49.150464) (width 1.5) (layer B.Cu) (net 32) (tstamp 5779937C))\n  (segment (start 123.204164 49.150464) (end 125.5213 49.150464) (width 1.2) (layer B.Cu) (net 32))\n  (segment (start 125.5213 49.150464) (end 125.534064 49.150464) (width 0.635) (layer B.Cu) (net 32) (tstamp 5779937D))\n  (segment (start 125.534064 49.150464) (end 134.0938 57.7102) (width 1.5) (layer B.Cu) (net 32) (tstamp 577991F0))\n  (segment (start 134.0938 57.7102) (end 134.0938 57.7737) (width 0.635) (layer B.Cu) (net 32) (tstamp 577991FE))\n  (segment (start 99.4228 90.6667) (end 99.4228 90.1587) (width 0.3048) (layer B.Cu) (net 32) (tstamp 5779731D))\n  (segment (start 125.4578 57.7737) (end 124.01 57.7737) (width 0.635) (layer B.Cu) (net 32))\n  (segment (start 124.5 57.7737) (end 124.01 57.7737) (width 1.2) (layer B.Cu) (net 32) (tstamp 595701ED))\n  (segment (start 99.415 67.224) (end 99.415 65.165) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 98 63.75) (end 94.5 63.75) (width 1.5) (layer B.Cu) (net 32) (tstamp 595700F7))\n  (segment (start 99.415 65.165) (end 98 63.75) (width 1.5) (layer B.Cu) (net 32) (tstamp 595700F3))\n  (segment (start 88.239 67.224) (end 88.239 67.011) (width 0.6) (layer B.Cu) (net 32))\n  (segment (start 88.239 67.011) (end 90.5 64.75) (width 0.6) (layer B.Cu) (net 32) (tstamp 595700D8))\n  (segment (start 90.5 64.75) (end 93.5 64.75) (width 1.2) (layer B.Cu) (net 32) (tstamp 595700DB))\n  (segment (start 93.5 64.75) (end 94.5 63.75) (width 1.2) (layer B.Cu) (net 32) (tstamp 595700E0))\n  (segment (start 94.5 63.75) (end 94.5 60.75) (width 1.5) (layer B.Cu) (net 32) (tstamp 595700E4))\n  (segment (start 94.5 60.75) (end 91.75 58) (width 1.5) (layer B.Cu) (net 32) (tstamp 595700E8))\n  (segment (start 91.75 58) (end 83.25 58) (width 1.5) (layer B.Cu) (net 32) (tstamp 595700E9))\n  (segment (start 83.25 58) (end 83.25 58.25) (width 0.9) (layer B.Cu) (net 32) (tstamp 595700ED))\n  (segment (start 80.365 67.097) (end 80.347 67.097) (width 0.6) (layer B.Cu) (net 32))\n  (segment (start 80.347 67.097) (end 77.2 63.95) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570055))\n  (segment (start 77.2 63.95) (end 77.2 62.55) (width 1.2) (layer B.Cu) (net 32) (tstamp 5957005A))\n  (segment (start 77.2 62.55) (end 81.5 58.25) (width 1.5) (layer B.Cu) (net 32) (tstamp 5957005D))\n  (segment (start 81.5 58.25) (end 83.25 58.25) (width 1.5) (layer B.Cu) (net 32) (tstamp 59570064))\n  (segment (start 83.25 58.25) (end 83 58.25) (width 0.9) (layer B.Cu) (net 32) (tstamp 595700EE))\n  (segment (start 83 58.25) (end 83.5478 57.7022) (width 0.9) (layer B.Cu) (net 32) (tstamp 59570068))\n  (segment (start 83.5478 57.7022) (end 83.5478 53.5827) (width 1.5) (layer B.Cu) (net 32) (tstamp 5957006C))\n  (segment (start 83.5478 51.0427) (end 83.5478 53.5827) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 85 53.5827) (end 83.5478 53.5827) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 113.974 57.25) (end 104.322 57.25) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 104.322 57.25) (end 100.642 53.57) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D59DA))\n  (segment (start 100.642 53.57) (end 96.07 53.57) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D59DB))\n  (segment (start 96.07 53.57) (end 96.07 53.5827) (width 0.635) (layer B.Cu) (net 32) (tstamp 577D59DD))\n  (segment (start 124.01 57.7737) (end 122.7263 57.7737) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 117.224 60.5) (end 113.974 57.25) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D56C0))\n  (segment (start 120 60.5) (end 117.224 60.5) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D56BF))\n  (segment (start 122.7263 57.7737) (end 120 60.5) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D56BE))\n  (segment (start 124.01 57.7737) (end 123.8068 57.7737) (width 0.635) (layer B.Cu) (net 32) (tstamp 577D56BC))\n  (segment (start 96.4383 53.5827) (end 96.07 53.5827) (width 0.635) (layer B.Cu) (net 32) (tstamp 57799B81))\n  (segment (start 96.07 53.5827) (end 85 53.5827) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D59DE))\n  (segment (start 85 53.5827) (end 84.8178 53.5827) (width 0.635) (layer B.Cu) (net 32) (tstamp 5786CBA8))\n  (segment (start 86.7228 53.5827) (end 84.8178 53.5827) (width 0.635) (layer B.Cu) (net 32) (tstamp 57798F0E))\n  (segment (start 124.5 65) (end 124.5 57.7737) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 119.25 65) (end 124.5 65) (width 1.5) (layer B.Cu) (net 32) (tstamp 595701BD))\n  (segment (start 124.5 65) (end 125.25 65) (width 0.9) (layer B.Cu) (net 32) (tstamp 595701EB))\n  (segment (start 118.465 65.785) (end 119.25 65) (width 1.5) (layer B.Cu) (net 32) (tstamp 595701BA))\n  (segment (start 127.544 65) (end 129.641 67.097) (width 0.9) (layer B.Cu) (net 32) (tstamp 595701B7))\n  (segment (start 125.25 65) (end 127.544 65) (width 0.9) (layer B.Cu) (net 32) (tstamp 595701B4))\n  (segment (start 118.465 67.351) (end 118.465 65.785) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 118.465 87.465) (end 118.4 87.4) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570929))\n  (segment (start 118.465 90.719) (end 118.465 87.465) (width 1.2) (layer B.Cu) (net 32))\n\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Legacy Layout/tc14badge.brd",
    "content": "PCBNEW-BOARD Version 1 date Fri Oct 19 11:53:05 2012\n\n# Created by Pcbnew(2012-05-21 BZR 3261)-stable\n\n$GENERAL\nencoding utf-8\nLayerCount 2\nLy 1FFF8001\nEnabledLayers 1FFF8001\nLinks 135\nNoConn 11\nDi 41844 16849 73060 58324\nNdraw 54\nNtrack 512\nNzone 0\nBoardThickness 630\nNmodule 51\nNnets 44\n$EndGENERAL\n\n$SHEETDESCR\nSheet A4 11700 8267\nTitle \"\"\nDate \"19 oct 2012\"\nRev \"\"\nComp \"\"\nComment1 \"\"\nComment2 \"\"\nComment3 \"\"\nComment4 \"\"\n$EndSHEETDESCR\n\n$SETUP\nInternalUnit 0.000100 INCH\nLayers 2\nLayer[0] Back signal\nLayer[15] Front signal\nTrackWidth 80\nTrackWidthList 200\nTrackWidthList 500\nTrackWidthList 1000\nTrackClearence 80\nZoneClearence 200\nTrackMinWidth 80\nDrawSegmWidth 80\nEdgeSegmWidth 150\nViaSize 270\nViaDrill 130\nViaMinSize 270\nViaMinDrill 130\nViaSizeList 310 160\nViaSizeList 370 200\nViaSizeList 420 250\nMicroViaSize 200\nMicroViaDrill 50\nMicroViasAllowed 0\nMicroViaMinSize 200\nMicroViaMinDrill 50\nTextPcbWidth 75\nTextPcbSize 300 400\nEdgeModWidth 80\nTextModSize 600 600\nTextModWidth 120\nPadSize 551 551\nPadDrill 150\nPad2MaskClearance 80\nPad2PasteClearanceRatio -0.12\nAuxiliaryAxisOrg 0 0\nPcbPlotParams (pcbplotparams (layerselection 284721153) (usegerberextensions true) (excludeedgelayer false) (linewidth 60) (plotframeref false) (viasonmask false) (mode 1) (useauxorigin false) (hpglpennumber 1) (hpglpenspeed 20) (hpglpendiameter 15) (hpglpenoverlay 0) (pscolor true) (psnegative false) (psa4output false) (plotreference false) (plotvalue false) (plotothertext true) (plotinvisibletext false) (padsonsilk false) (subtractmaskfromsilk false) (outputformat 1) (mirror false) (drillshape 1) (scaleselection 1) (outputdirectory \"\"))\n$EndSETUP\n\n$EQUIPOT\nNa 0 \"\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 1 \"/DC\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 2 \"/DD\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 3 \"/P0_0\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 4 \"/P0_1\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 5 \"/P0_2\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 6 \"/P0_3\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 7 \"/P0_4\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 8 \"/P0_5\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 9 \"/P1_2\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 10 \"/P1_3\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 11 \"/P1_4\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 12 \"/P1_5\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 13 \"/P1_6\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 14 \"/P1_7\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 15 \"/P2_0\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 16 \"/P2_3\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 17 \"/P2_4\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 18 \"/RESET_N\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 19 \"/VBUS\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 20 \"3V3\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 21 \"GND\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 22 \"N-000023\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 23 \"N-000024\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 24 \"N-000026\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 25 \"N-000027\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 26 \"N-000028\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 27 \"N-000029\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 28 \"N-000030\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 29 \"N-000031\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 30 \"N-000032\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 31 \"N-000033\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 32 \"N-000034\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 33 \"N-000035\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 34 \"N-000037\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 35 \"N-000039\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 36 \"N-000041\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 37 \"N-000042\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 38 \"N-000043\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 39 \"N-000044\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 40 \"N-000045\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 41 \"N-000046\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 42 \"N-000047\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 43 \"N-000051\"\nSt ~\n$EndEQUIPOT\n$NCLASS\nName \"Default\"\nDesc \"This is the default net class.\"\nClearance 80\nTrackWidth 80\nViaDia 270\nViaDrill 130\nuViaDia 200\nuViaDrill 50\nAddNet \"\"\nAddNet \"/DC\"\nAddNet \"/DD\"\nAddNet \"/P0_0\"\nAddNet \"/P0_1\"\nAddNet \"/P0_2\"\nAddNet \"/P0_3\"\nAddNet \"/P0_4\"\nAddNet \"/P0_5\"\nAddNet \"/P1_2\"\nAddNet \"/P1_3\"\nAddNet \"/P1_4\"\nAddNet \"/P1_5\"\nAddNet \"/P1_6\"\nAddNet \"/P1_7\"\nAddNet \"/P2_0\"\nAddNet \"/P2_3\"\nAddNet \"/P2_4\"\nAddNet \"/RESET_N\"\nAddNet \"/VBUS\"\nAddNet \"3V3\"\nAddNet \"GND\"\nAddNet \"N-000023\"\nAddNet \"N-000024\"\nAddNet \"N-000026\"\nAddNet \"N-000027\"\nAddNet \"N-000028\"\nAddNet \"N-000029\"\nAddNet \"N-000030\"\nAddNet \"N-000031\"\nAddNet \"N-000032\"\nAddNet \"N-000033\"\nAddNet \"N-000034\"\nAddNet \"N-000035\"\nAddNet \"N-000037\"\nAddNet \"N-000039\"\nAddNet \"N-000041\"\nAddNet \"N-000042\"\nAddNet \"N-000043\"\nAddNet \"N-000044\"\nAddNet \"N-000045\"\nAddNet \"N-000046\"\nAddNet \"N-000047\"\nAddNet \"N-000051\"\n$EndNCLASS\n$MODULE GSG-XTAL-TXC-7A\nPo 61500 45500 1800 15 504D2D98 504D3AA5 ~P\nLi GSG-XTAL-TXC-7A\nSc 504D3AA5\nAR /504D0F4F\nOp 0 0 0\nT0 0 0 600 600 1800 120 N V 21 N \"X1\"\nT1 0 0 600 600 1800 120 N I 21 N \"CRYSTAL\"\nDS 984 -630 984 -551 150 21\nDS -984 -630 -984 -551 150 21\nDS -1024 630 -1024 551 150 21\nDS 984 630 984 551 150 21\nDS -1024 630 984 630 150 21\nDS -984 -630 984 -630 150 21\n$PAD\nSh \"1\" R 669 945 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 41 \"N-000046\"\nPo 728 0\n$EndPAD\n$PAD\nSh \"2\" R 669 945 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 39 \"N-000044\"\nPo -728 0\n$EndPAD\n$EndMODULE  GSG-XTAL-TXC-7A\n$MODULE GSG-USB-MICROB-FCI-10103594\nPo 46000 40000 0 15 4E482E27 504D3AA6 ~P\nLi GSG-USB-MICROB-FCI-10103594\nSc 504D3AA6\nAR /504CAE21\nOp 0 0 0\nT0 984 0 600 600 0 120 N V 21 N \"J2\"\nT1 984 0 600 600 0 120 N I 21 N \"GSG-USB-MICRO-B\"\n$PAD\nSh \"1\" R 689 157 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 19 \"/VBUS\"\nPo 1781 -512\nLe 45683504\n.SolderMask 40\n.LocalClearance 80\n$EndPAD\n$PAD\nSh \"2\" R 689 157 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 36 \"N-000041\"\nPo 1781 -256\nLe 113\n.SolderMask 40\n.LocalClearance 80\n$EndPAD\n$PAD\nSh \"3\" R 689 157 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 38 \"N-000043\"\nPo 1781 0\nLe 30424768\n.SolderMask 40\n.LocalClearance 80\n$EndPAD\n$PAD\nSh \"4\" R 689 157 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 1781 256\nLe 32\n.SolderMask 40\n.LocalClearance 80\n$EndPAD\n$PAD\nSh \"5\" R 689 157 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 1781 512\nLe 16\n.SolderMask 40\n.LocalClearance 80\n$EndPAD\n$PAD\nSh \"\" R 814 561 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 656 -379\nLe 45683504\n$EndPAD\n$PAD\nSh \"\" R 814 561 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 656 379\nLe 305\n$EndPAD\n$PAD\nSh \"\" R 571 843 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 1840 -1114\nLe 45683504\n$EndPAD\n$PAD\nSh \"\" R 571 843 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 1840 1114\nLe 45447072\n$EndPAD\n$PAD\nSh \"\" R 250 719 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 1327 -1176\nLe 1341\n$EndPAD\n$PAD\nSh \"\" R 250 719 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 1327 1176\nLe 45683504\n$EndPAD\n$PAD\nSh \"\" R 1116 630 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 894 -1083\nLe 40068352\n$EndPAD\n$PAD\nSh \"\" R 1116 630 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 894 1083\nLe 43410648\n$EndPAD\n$PAD\nSh \"\" C 630 630 0 0 0\nDr 472 0 0\nAt STD N 00C8FFFF\nNe 0 \"\"\nPo 669 -1083\nLe 45683504\n$EndPAD\n$PAD\nSh \"\" C 630 630 0 0 0\nDr 472 0 0\nAt STD N 00C8FFFF\nNe 0 \"\"\nPo 669 1083\nLe 43410648\n$EndPAD\n$PAD\nSh \"\" C 571 571 0 0 0\nDr 413 0 0\nAt STD N 00C8FFFF\nNe 0 \"\"\nPo 1839 -979\nLe 46673664\n$EndPAD\n$PAD\nSh \"\" C 571 571 0 0 0\nDr 413 0 0\nAt STD N 00C8FFFF\nNe 0 \"\"\nPo 1839 979\nLe 113\n$EndPAD\n$EndMODULE  GSG-USB-MICROB-FCI-10103594\n$MODULE GSG-TESTPOINT-100MIL\nPo 55154 31500 0 15 4FA2EFE0 504E11D5 ~P\nLi GSG-TESTPOINT-100MIL\nKw CONN\nSc 504E11D5\nAR /504D0B60\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P4\"\nT1 0 0 400 400 0 80 N I 21 N \"DD\"\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 2 \"/DD\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-TESTPOINT-100MIL\n$MODULE GSG-TESTPOINT-100MIL\nPo 65193 31500 0 15 4FA2EFE0 504E11D2 ~P\nLi GSG-TESTPOINT-100MIL\nKw CONN\nSc 504E11D2\nAR /504D0B65\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P7\"\nT1 0 0 400 400 0 80 N I 21 N \"GND\"\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 21 \"GND\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-TESTPOINT-100MIL\n$MODULE GSG-TESTPOINT-100MIL\nPo 61846 31500 0 15 4FA2EFE0 504E11CF ~P\nLi GSG-TESTPOINT-100MIL\nKw CONN\nSc 504E11CF\nAR /504D0B63\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P6\"\nT1 0 0 400 400 0 80 N I 21 N \"3V3\"\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 22 \"N-000023\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-TESTPOINT-100MIL\n$MODULE GSG-TESTPOINT-100MIL\nPo 58500 31500 0 15 4FA2EFE0 504D3AAD ~P\nLi GSG-TESTPOINT-100MIL\nKw CONN\nSc 504D3AAD\nAR /504D0B62\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P5\"\nT1 0 0 400 400 0 80 N I 21 N \"DC\"\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 1 \"/DC\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-TESTPOINT-100MIL\n$MODULE GSG-TESTPOINT-100MIL\nPo 51807 31500 0 15 4FA2EFE0 504E11D8 ~P\nLi GSG-TESTPOINT-100MIL\nKw CONN\nSc 504E11D8\nAR /504D0B57\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P3\"\nT1 0 0 400 400 0 80 N I 21 N \"RESET_N\"\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 18 \"/RESET_N\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-TESTPOINT-100MIL\n$MODULE GSG-SPST-FSM4JSMATR\nPo 67500 36500 2700 15 4E488E6F 504D3AB0 ~P\nLi GSG-SPST-FSM4JSMATR\nSc 504D3AB0\nAR /504CFDB1\nOp 0 0 0\nT0 0 0 394 394 2700 80 N V 21 N \"SW1\"\nT1 0 0 394 394 2700 80 N I 21 N \"SW_PUSH\"\nDC 0 0 689 0 80 21\nDS -1181 -1181 1181 -1181 80 21\nDS 1181 -1181 1181 1181 80 21\nDS 1181 1181 -1181 1181 80 21\nDS -1181 1181 -1181 -1181 80 21\n$PAD\nSh \"1\" R 551 827 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 9 \"/P1_2\"\nPo 886 -1791\n$EndPAD\n$PAD\nSh \"1\" R 551 827 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 9 \"/P1_2\"\nPo 886 1791\n$EndPAD\n$PAD\nSh \"2\" R 551 827 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -886 -1791\nLe 83\n$EndPAD\n$PAD\nSh \"2\" R 551 827 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -886 1791\nLe -1429971160\n$EndPAD\n$EndMODULE  GSG-SPST-FSM4JSMATR\n$MODULE GSG-SOT23-3\nPo 54000 38000 900 15 50516083 504D3AB1 ~P\nLi GSG-SOT23-3\nKw CMS SOT\nSc 504D3AB1\nAR /504CAD4C\nOp 0 0 0\nAt SMD \nT0 0 -410 300 300 900 75 N V 21 N \"U2\"\nT1 0 0 300 300 900 75 N I 21 N \"AP7313\"\nDS -600 -150 600 -150 50 21\nDS 600 -150 600 150 50 21\nDS 600 150 -600 150 50 21\nDS -600 150 -600 -150 50 21\n$PAD\nSh \"2\" R 360 360 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -350 -400\nLe 3\n$EndPAD\n$PAD\nSh \"1\" R 360 360 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 19 \"/VBUS\"\nPo 350 -400\n$EndPAD\n$PAD\nSh \"3\" R 360 360 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 0 400\nLe 111\n$EndPAD\n$SHAPE3D\nNa \"smd/cms_sot23.wrl\"\nSc 0.130000 0.150000 0.150000\nOf 0.000000 0.000000 0.000000\nRo 0.000000 0.000000 0.000000\n$EndSHAPE3D\n$EndMODULE  GSG-SOT23-3\n$MODULE GSG-SMA-VERTICAL\nPo 67250 46200 0 15 5047A6AD 504D3AB2 ~P\nLi GSG-SMA-VERTICAL\nSc 504D3AB2\nAR /504CFCB0\nOp 0 0 0\nT0 0 0 600 600 0 120 N V 21 N \"P2\"\nT1 0 0 600 600 0 120 N I 21 N \"ANTENNA\"\nDS -1600 -1600 -1600 1600 150 21\nDS -1600 1600 1600 1600 150 21\nDS 1600 1600 1600 -1600 150 21\nDS 1600 -1600 -1600 -1600 150 21\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 600 0 0\nAt STD N 00E0FFFF\nNe 23 \"N-000024\"\nPo 0 0\n$EndPAD\n$PAD\nSh \"2\" C 1000 1000 0 0 0\nDr 670 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo -1000 -1000\n$EndPAD\n$PAD\nSh \"3\" C 1000 1000 0 0 0\nDr 670 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo -1000 1000\n$EndPAD\n$PAD\nSh \"4\" C 1000 1000 0 0 0\nDr 670 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo 1000 1000\n$EndPAD\n$PAD\nSh \"5\" C 1000 1000 0 0 0\nDr 670 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo 1000 -1000\n$EndPAD\n$EndMODULE  GSG-SMA-VERTICAL\n$MODULE GSG-HEADER-2x8\nPo 59500 34500 1800 15 4F8A6071 504D3AB4 ~P\nLi GSG-HEADER-2x8\nKw CONN\nSc 504D3AB4\nAR /504CF706\nOp 0 0 0\nT0 0 0 400 400 1800 80 N V 21 N \"P1\"\nT1 0 0 400 400 1800 80 N I 21 N \"EXPANSION\"\nDS -4000 -1000 4000 -1000 150 21\nDS 4000 -1000 4000 1000 150 21\nDS 4000 1000 -4000 1000 150 21\nDS -3000 0 -4250 0 150 21\nDS -4250 0 -4250 1250 150 21\nDS -4250 1250 -3000 1250 150 21\nDS -3000 1250 -3000 0 150 21\nDS -4000 1000 -4000 -1000 150 21\n$PAD\nSh \"1\" R 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo -3500 500\nLe 33\n$EndPAD\n$PAD\nSh \"2\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 3 \"/P0_0\"\nPo -3500 -500\nLe 34735648\n$EndPAD\n$PAD\nSh \"3\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 4 \"/P0_1\"\nPo -2500 500\nLe 24\n$EndPAD\n$PAD\nSh \"4\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 5 \"/P0_2\"\nPo -2500 -500\nLe -1563238664\n$EndPAD\n$PAD\nSh \"5\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 6 \"/P0_3\"\nPo -1500 500\nLe 48\n$EndPAD\n$PAD\nSh \"6\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 7 \"/P0_4\"\nPo -1500 -500\nLe 48\n$EndPAD\n$PAD\nSh \"7\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 8 \"/P0_5\"\nPo -500 500\nLe 48\n$EndPAD\n$PAD\nSh \"8\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 9 \"/P1_2\"\nPo -500 -500\nLe 33\n$EndPAD\n$PAD\nSh \"9\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 10 \"/P1_3\"\nPo 500 500\nLe 30841616\n$EndPAD\n$PAD\nSh \"10\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 11 \"/P1_4\"\nPo 500 -500\nLe 97\n$EndPAD\n$PAD\nSh \"11\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 12 \"/P1_5\"\nPo 1500 500\nLe 34831136\n$EndPAD\n$PAD\nSh \"12\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 13 \"/P1_6\"\nPo 1500 -500\nLe 35604240\n$EndPAD\n$PAD\nSh \"13\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 14 \"/P1_7\"\nPo 2500 500\nLe 42\n$EndPAD\n$PAD\nSh \"14\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 15 \"/P2_0\"\nPo 2500 -500\nLe 17\n$EndPAD\n$PAD\nSh \"15\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 16 \"/P2_3\"\nPo 3500 500\nLe 9\n$EndPAD\n$PAD\nSh \"16\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 17 \"/P2_4\"\nPo 3500 -500\nLe 99\n$EndPAD\n$EndMODULE  GSG-HEADER-2x8\n$MODULE GSG-HEADER-2x7\nPo 52000 43500 0 15 4F8A6053 504D3AB5 ~P\nLi GSG-HEADER-2x7\nKw CONN\nSc 504D3AB5\nAR /504CF491\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P8\"\nT1 0 0 400 400 0 80 N I 21 N \"GOODFET\"\nDS -2500 0 -3750 0 150 21\nDS -3750 0 -3750 1250 150 21\nDS -3750 1250 -2500 1250 150 21\nDS -2500 1250 -2500 0 150 21\nDS -3500 1000 3500 1000 150 21\nDS 3500 1000 3500 -1000 150 21\nDS 3500 -1000 -3500 -1000 150 21\nDS -3500 1000 -3500 -1000 150 21\n$PAD\nSh \"1\" R 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 2 \"/DD\"\nPo -3000 500\nLe 33\n$EndPAD\n$PAD\nSh \"2\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 35 \"N-000039\"\nPo -3000 -500\nLe 34735648\n$EndPAD\n$PAD\nSh \"3\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo -2000 500\nLe 24\n$EndPAD\n$PAD\nSh \"4\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo -2000 -500\nLe -1563238664\n$EndPAD\n$PAD\nSh \"5\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 18 \"/RESET_N\"\nPo -1000 500\nLe 48\n$EndPAD\n$PAD\nSh \"6\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo -1000 -500\nLe 48\n$EndPAD\n$PAD\nSh \"7\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 1 \"/DC\"\nPo 0 500\nLe 48\n$EndPAD\n$PAD\nSh \"8\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 0 -500\nLe 33\n$EndPAD\n$PAD\nSh \"9\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo 1000 500\nLe 30841616\n$EndPAD\n$PAD\nSh \"10\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 1000 -500\nLe 97\n$EndPAD\n$PAD\nSh \"11\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 2000 500\nLe 34831136\n$EndPAD\n$PAD\nSh \"12\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 2000 -500\nLe 35604240\n$EndPAD\n$PAD\nSh \"13\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 3000 500\nLe 42\n$EndPAD\n$PAD\nSh \"14\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 3000 -500\nLe 17\n$EndPAD\n$EndMODULE  GSG-HEADER-2x7\n$MODULE GSG-HEADER-2x3\nPo 50000 34500 0 15 4F8A5FD1 504D3AB6 ~P\nLi GSG-HEADER-2x3\nKw CONN\nSc 504D3AB6\nAR /504D258A\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P9\"\nT1 0 0 400 400 0 80 N I 21 N \"PWR\"\nDS -500 0 -1750 0 150 21\nDS -1750 0 -1750 1250 150 21\nDS -1750 1250 -500 1250 150 21\nDS -500 1250 -500 0 150 21\nDS -1500 -1000 1500 -1000 150 21\nDS 1500 -1000 1500 1000 150 21\nDS 1500 1000 -1500 1000 150 21\nDS -1500 1000 -1500 -1000 150 21\n$PAD\nSh \"1\" R 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo -1000 500\nLe 33\n$EndPAD\n$PAD\nSh \"2\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 20 \"3V3\"\nPo -1000 -500\nLe 34735648\n$EndPAD\n$PAD\nSh \"3\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo 0 500\nLe 24\n$EndPAD\n$PAD\nSh \"4\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 20 \"3V3\"\nPo 0 -500\nLe -1563238664\n$EndPAD\n$PAD\nSh \"5\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo 1000 500\nLe 48\n$EndPAD\n$PAD\nSh \"6\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 20 \"3V3\"\nPo 1000 -500\nLe 48\n$EndPAD\n$EndMODULE  GSG-HEADER-2x3\n$MODULE GSG-B0310J50100AHF\nPo 63800 46000 2700 15 50516047 504D6841 ~P\nLi GSG-B0310J50100AHF\nSc 504D6841\nAR /504C9FEC\nOp 0 0 0\nT0 0 0 250 250 2700 63 N V 21 N \"T1\"\nT1 0 0 250 250 2700 63 N I 21 N \"BALUN\"\nDS -413 256 413 256 80 21\nDS 413 -256 -413 -256 80 21\nDC 256 0 276 20 80 21\nDS -413 -256 -413 256 80 21\nDS 413 -256 413 256 80 21\n$PAD\nSh \"1\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 30 \"N-000032\"\nPo 260 -195\nLe 33054512\n$EndPAD\n$PAD\nSh \"2\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 28 \"N-000030\"\nPo 0 -195\nLe 755437432\n$EndPAD\n$PAD\nSh \"3\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 27 \"N-000029\"\nPo -260 -195\nLe 32750520\n$EndPAD\n$PAD\nSh \"4\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 26 \"N-000028\"\nPo -260 195\nLe 6\n$EndPAD\n$PAD\nSh \"5\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 0 195\n$EndPAD\n$PAD\nSh \"6\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 260 195\nLe 32\n$EndPAD\n$EndMODULE  GSG-B0310J50100AHF\n$MODULE GSG-900MHZ-INVERTED-F\nPo 64000 48000 1800 15 50516053 504D3AB8 ~P\nLi GSG-900MHZ-INVERTED-F\nSc 504D3AB8\nAR /504C9FF3\nOp 0 0 0\nT0 7087 -2165 600 600 1800 120 N I 21 N \"J1\"\nT1 7087 -984 600 600 1800 120 N I 21 N \"GSG-900MHZ-F-ANTENNA\"\n$PAD\nSh \"1\" R 787 7874 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 29 \"N-000031\"\nPo 0 -3937\n$EndPAD\n$PAD\nSh \"2\" R 394 7874 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 21 \"GND\"\nPo -2559 -3937\nLe 72\n$EndPAD\n$PAD\nSh \"\" R 5118 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 0 -7677\nLe 32929184\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 2362 -5512\nLe 33355568\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 3346 -3346\nLe 31206400\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 5315 -7677\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 7283 -3346\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 9252 -7677\nLe -1642768744\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 11220 -3346\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 13189 -7677\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 4331 -5512\nLe 33355568\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 6299 -5512\nLe 33355568\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 8268 -5512\nLe 33355568\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 10236 -5512\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 12205 -5512\nLe 32929184\n$EndPAD\n$EndMODULE  GSG-900MHZ-INVERTED-F\n$MODULE GSG-0603D\nPo 65000 39000 2700 15 50516070 504D3AB9 ~P\nLi GSG-0603D\nSc 504D3AB9\nAR /504CF0C2\nOp 0 0 0\n.SolderMask 40\nT0 830 0 240 240 2700 60 N V 21 N \"D2\"\nT1 0 0 240 240 2700 60 N I 21 N \"LED1\"\nDS -20 30 -20 -30 80 21\nDS 80 0 -80 -130 80 21\nDS -80 -130 -80 130 80 21\nDS -80 130 80 0 80 21\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 300 0\nLe 18\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 34 \"N-000037\"\nPo -300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603D\n$MODULE GSG-0603D\nPo 56500 45000 1800 15 50516069 504D3ABB ~P\nLi GSG-0603D\nSc 504D3ABB\nAR /504CFE38\nOp 0 0 0\n.SolderMask 40\nT0 830 0 240 240 1800 60 N V 21 N \"D3\"\nT1 0 0 240 240 1800 60 N I 21 N \"LED2\"\nDS -20 30 -20 -30 80 21\nDS 80 0 -80 -130 80 21\nDS -80 -130 -80 130 80 21\nDS -80 130 80 0 80 21\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 300 0\nLe 18\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 24 \"N-000026\"\nPo -300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603D\n$MODULE GSG-0603D\nPo 56500 46000 1800 15 50516063 504D3ABD ~P\nLi GSG-0603D\nSc 504D3ABD\nAR /504CFE70\nOp 0 0 0\n.SolderMask 40\nT0 850 10 240 240 1800 60 N V 21 N \"D4\"\nT1 0 0 240 240 1800 60 N I 21 N \"LED3\"\nDS -20 30 -20 -30 80 21\nDS 80 0 -80 -130 80 21\nDS -80 -130 -80 130 80 21\nDS -80 130 80 0 80 21\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 300 0\nLe 18\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 25 \"N-000027\"\nPo -300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603D\n$MODULE GSG-0603-SHORT-10MIL\nPo 65000 34000 1800 15 504D2AC6 504D3ABF ~P\nLi GSG-0603-SHORT-10MIL\nSc 504D3ABF\nAR /504D0B94\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 1800 60 N V 21 N \"R13\"\nT1 0 0 240 240 1800 60 N I 21 N \"0\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00808000\nNe 22 \"N-000023\"\nPo 300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00808000\nNe 20 \"3V3\"\nPo -300 0\nLe 1380141389\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"\" R 280 100 0 0 1800\nDr 0 0 0\nAt SMD N 00808000\nNe 0 \"\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-0603-SHORT-10MIL\n$MODULE GSG-0603-SHORT-10MIL\nPo 60850 39800 0 15 504D2AC6 504D3AC1 ~P\nLi GSG-0603-SHORT-10MIL\nSc 504D3AC1\nAR /504CB0EB\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R7\"\nT1 0 0 240 240 0 60 N I 21 N \"0\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 32 \"N-000034\"\nPo 300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 33 \"N-000035\"\nPo -300 0\nLe 1380141389\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"\" R 280 100 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 0 \"\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-0603-SHORT-10MIL\n$MODULE GSG-0603-SHORT-10MIL\nPo 50500 41500 0 15 504D2AC6 504D3AC5 ~P\nLi GSG-0603-SHORT-10MIL\nSc 504D3AC5\nAR /504CF505\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R15\"\nT1 0 0 240 240 0 60 N I 21 N \"0\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 20 \"3V3\"\nPo 300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 35 \"N-000039\"\nPo -300 0\nLe 1380141389\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"\" R 280 100 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 0 \"\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-0603-SHORT-10MIL\n$MODULE GSG-0603\nPo 58000 46000 0 15 4CFF2E39 504D3AC6 ~P\nLi GSG-0603\nSc 504D3AC6\nAR /504CFE6F\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R12\"\nT1 0 0 240 240 0 60 N I 21 N \"330\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 17 \"/P2_4\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 25 \"N-000027\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 58000 45000 0 15 4CFF2E39 504D3AC8 ~P\nLi GSG-0603\nSc 504D3AC8\nAR /504CFE39\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R11\"\nT1 0 0 240 240 0 60 N I 21 N \"330\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 16 \"/P2_3\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 24 \"N-000026\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 52000 45500 900 15 4CFF2E39 504D3ACA ~P\nLi GSG-0603\nSc 504D3ACA\nAR /504CF38E\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 900 60 N V 21 N \"R14\"\nT1 0 0 240 240 900 60 N I 21 N \"10k\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 1 \"/DC\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 57950 42300 0 15 4CFF2E39 504D3ACC ~P\nLi GSG-0603\nSc 504D3ACC\nAR /504CAEA4\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R10\"\nT1 0 0 240 240 0 60 N I 21 N \"33\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 43 \"N-000051\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 36 \"N-000041\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 57650 41700 0 15 4CFF2E39 504D3ACE ~P\nLi GSG-0603\nSc 504D3ACE\nAR /504CAE9B\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R9\"\nT1 0 0 240 240 0 60 N I 21 N \"33\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 37 \"N-000042\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 38 \"N-000043\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 57650 41100 0 15 4CFF2E39 504D3AD0 ~P\nLi GSG-0603\nSc 504D3AD0\nAR /504CAF08\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R8\"\nT1 0 0 240 240 0 60 N I 21 N \"1k5\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 33 \"N-000035\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 38 \"N-000043\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 64000 39000 2700 15 4CFF2E39 504D3AD4 ~P\nLi GSG-0603\nSc 504D3AD4\nAR /504CF0D3\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 2700 60 N V 21 N \"R5\"\nT1 0 0 240 240 2700 60 N I 21 N \"330\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 42 \"N-000047\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 34 \"N-000037\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 52750 37100 1800 15 4CFF2E39 504D3AE6 ~P\nLi GSG-0603\nSc 504D3AE6\nAR /504CAD71\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 1800 60 N V 21 N \"C15\"\nT1 0 0 240 240 1800 60 N I 21 N \"1uF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 19 \"/VBUS\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 52750 38900 1800 15 4CFF2E39 504D3AE8 ~P\nLi GSG-0603\nSc 504D3AE8\nAR /504CAD75\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 1800 60 N V 21 N \"C16\"\nT1 0 0 240 240 1800 60 N I 21 N \"4u7\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 64000 47100 2700 15 505160A6 504D64FA ~P\nLi GSG-0603\nSc 504D64FA\nAR /504CA04A\nOp 0 0 0\n.SolderMask 40\nT0 230 -20 240 240 2700 60 N V 21 N \"C6\"\nT1 0 0 240 240 2700 60 N I 21 N \"10nF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 29 \"N-000031\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 30 \"N-000032\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 66250 43750 1800 15 4CFF2E39 504D3AEE ~P\nLi GSG-0603\nSc 504D3AEE\nAR /504CA3D1\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 1800 60 N V 21 N \"C1\"\nT1 0 0 240 240 1800 60 N I 21 N \"1uF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 31 \"N-000033\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 51000 45500 2700 15 4CFF2E39 504D3AF6 ~P\nLi GSG-0603\nSc 504D3AF6\nAR /504CEFF7\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 2700 60 N V 21 N \"R2\"\nT1 0 0 240 240 2700 60 N I 21 N \"10k\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 18 \"/RESET_N\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0402\nPo 65100 47100 900 15 4FB6CFE4 504D3AF7 ~P\nLi GSG-0402\nSc 504D3AF7\nAR /504CFCBE\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 900 40 N V 21 N \"D1\"\nT1 0 20 160 160 900 40 N I 21 N \"TVS_DIODE\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 23 \"N-000024\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 66050 44250 0 15 4FB6CFE4 504D3AD2 ~~\nLi GSG-0402\nSc 504D3AD2\nAR /504CA8D9\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 0 40 N V 21 N \"C2\"\nT1 0 20 160 160 0 40 N I 21 N \"100nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 64800 45400 900 15 4FB6CFE4 504D65ED ~~\nLi GSG-0402\nSc 504D65ED\nAR /504CAA44\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 900 40 N V 21 N \"C3\"\nT1 0 20 160 160 900 40 N I 21 N \"220pF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 64350 40850 2700 15 50515FE5 504D3AF2 ~~\nLi GSG-0402\nSc 504D3AF2\nAR /504CA908\nOp 0 0 0\n.SolderMask 40\nT0 0 -20 160 160 2700 40 N V 21 N \"C4\"\nT1 0 20 160 160 2700 40 N I 21 N \"100nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 64400 45400 900 15 4FB6CFE4 504D683B ~~\nLi GSG-0402\nSc 504D683B\nAR /504CAA22\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 900 40 N V 21 N \"C5\"\nT1 0 20 160 160 900 40 N I 21 N \"10nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 64700 46300 0 15 4FB6CFE4 504D683E ~~\nLi GSG-0402\nSc 504D683E\nAR /504CA01F\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 0 40 N V 21 N \"C7\"\nT1 0 20 160 160 0 40 N I 21 N \"10nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 28 \"N-000030\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 61550 44350 0 15 4FB6CFE4 504D3AF4 ~~\nLi GSG-0402\nSc 504D3AF4\nAR /504CA977\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 0 40 N V 21 N \"C8\"\nT1 0 20 160 160 0 40 N I 21 N \"10nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 63250 45450 900 15 4FB6CFE4 504D3ADA ~~\nLi GSG-0402\nSc 504D3ADA\nAR /504CA9AD\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 900 40 N V 21 N \"C9\"\nT1 0 20 160 160 900 40 N I 21 N \"2p2\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 60150 45500 900 15 4FB6CFE4 504D3ADC ~~\nLi GSG-0402\nSc 504D3ADC\nAR /504CA2F0\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 900 40 N V 21 N \"C10\"\nT1 0 20 160 160 900 40 N I 21 N \"22pF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 41 \"N-000046\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 62850 45450 2700 15 50515FB0 504D3ADE ~~\nLi GSG-0402\nSc 504D3ADE\nAR /504CA2F3\nOp 0 0 0\n.SolderMask 40\nT0 0 -20 160 160 2700 40 N V 21 N \"C11\"\nT1 0 20 160 160 2700 40 N I 21 N \"22pF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 39 \"N-000044\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 61350 42700 0 15 4FB6CFE4 504D3AE4 ~~\nLi GSG-0402\nSc 504D3AE4\nAR /504CA934\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 0 40 N V 21 N \"C14\"\nT1 0 20 160 160 0 40 N I 21 N \"100nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0603\nPo 64300 46800 1800 15 50515FC0 504D4803 ~~\nLi GSG-0603\nSc 504D4803\nAR /504D4718\nOp 0 0 0\n.SolderMask 40\nT0 -140 0 240 240 1800 60 N V 21 N \"C17\"\nT1 0 0 240 240 1800 60 N I 21 N \"10nF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 30 \"N-000032\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 23 \"N-000024\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0402\nPo 65200 45400 2700 15 50515FB8 504D3AD8 ~~\nLi GSG-0402\nSc 504D3AD8\nAR /504CA84D\nOp 0 0 0\n.SolderMask 40\nT0 0 -20 160 160 2700 40 N V 21 N \"R4\"\nT1 0 20 160 160 2700 40 N I 21 N \"56k\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 40 \"N-000045\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0603\nPo 59200 41400 2700 15 4CFF2E39 504D3AE0 ~~\nLi GSG-0603\nSc 504D3AE0\nAR /504CAEAF\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 2700 60 N V 21 N \"C12\"\nT1 0 0 240 240 2700 60 N I 21 N \"47pF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 37 \"N-000042\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 59200 42600 900 15 4CFF2E39 504D3AE2 ~~\nLi GSG-0603\nSc 504D3AE2\nAR /504CAECB\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 900 60 N V 21 N \"C13\"\nT1 0 0 240 240 900 60 N I 21 N \"47pF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 43 \"N-000051\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 59800 39450 900 15 4CFF2E39 504D3AC3 ~~\nLi GSG-0603\nSc 504D3AC3\nAR /504CAF13\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 900 60 N V 21 N \"R6\"\nT1 0 0 240 240 900 60 N I 21 N \"0\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 33 \"N-000035\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-HOLE260MIL\nPo 58500 19000 0 15 5051616D 504D7CF3 ~~\nLi GSG-HOLE260MIL\nSc 504D7CF3\nAR GSG-HOLE260MIL\nOp 0 0 0\nT0 0 0 394 394 0 80 N I 21 N \"HOLE260MIL\"\nT1 0 0 394 394 0 80 N I 21 N \"VAL**\"\n$PAD\nSh \"\" C 2600 2600 0 0 0\nDr 2600 0 0\nAt STD N 00C0FFFF\nNe 0 \"\"\nPo 0 0\nLe 235021312\n$EndPAD\n$EndMODULE  GSG-HOLE260MIL\n$MODULE GSG-QFN36\nPo 63700 43100 2700 15 504E2458 504D65EA ~~\nLi GSG-QFN36\nSc 504D65EA\nAR /504D0F40\nOp 0 0 0\nT0 0 0 600 600 2700 120 N V 21 N \"U1\"\nT1 0 0 600 600 2700 120 N I 21 N \"CC1111\"\nDS 1181 -906 1181 -1181 80 21\nDS 1181 -1181 906 -1181 80 21\nDS 906 1181 1181 1181 80 21\nDS 1181 1181 1181 906 80 21\nDS -1181 906 -1181 1181 80 21\nDS -1181 1181 -906 1181 80 21\nDS -1181 -906 -1181 -984 80 21\nDS -1181 -984 -984 -1181 80 21\nDS -984 -1181 -906 -1181 80 21\n$PAD\nSh \"1\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 9 \"/P1_2\"\nPo -1142 -787\n$EndPAD\n$PAD\nSh \"2\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -1142 -591\n$EndPAD\n$PAD\nSh \"3\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 42 \"N-000047\"\nPo -1142 -394\n$EndPAD\n$PAD\nSh \"4\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 32 \"N-000034\"\nPo -1142 -197\n$EndPAD\n$PAD\nSh \"5\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 3 \"/P0_0\"\nPo -1142 0\n$EndPAD\n$PAD\nSh \"6\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 4 \"/P0_1\"\nPo -1142 197\n$EndPAD\n$PAD\nSh \"7\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 5 \"/P0_2\"\nPo -1142 394\n$EndPAD\n$PAD\nSh \"8\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 6 \"/P0_3\"\nPo -1142 591\n$EndPAD\n$PAD\nSh \"9\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 7 \"/P0_4\"\nPo -1142 787\n$EndPAD\n$PAD\nSh \"10\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 37 \"N-000042\"\nPo -787 1142\n$EndPAD\n$PAD\nSh \"11\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 43 \"N-000051\"\nPo -591 1142\n$EndPAD\n$PAD\nSh \"12\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -394 1142\n$EndPAD\n$PAD\nSh \"13\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 8 \"/P0_5\"\nPo -197 1142\n$EndPAD\n$PAD\nSh \"14\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 15 \"/P2_0\"\nPo 0 1142\n$EndPAD\n$PAD\nSh \"15\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 2 \"/DD\"\nPo 197 1142\n$EndPAD\n$PAD\nSh \"16\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 1 \"/DC\"\nPo 394 1142\n$EndPAD\n$PAD\nSh \"17\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 16 \"/P2_3\"\nPo 591 1142\n$EndPAD\n$PAD\nSh \"18\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 17 \"/P2_4\"\nPo 787 1142\n$EndPAD\n$PAD\nSh \"19\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 1142 787\n$EndPAD\n$PAD\nSh \"20\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 41 \"N-000046\"\nPo 1142 591\n$EndPAD\n$PAD\nSh \"21\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 39 \"N-000044\"\nPo 1142 394\n$EndPAD\n$PAD\nSh \"22\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 1142 197\n$EndPAD\n$PAD\nSh \"23\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 26 \"N-000028\"\nPo 1142 0\n$EndPAD\n$PAD\nSh \"24\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 27 \"N-000029\"\nPo 1142 -197\n$EndPAD\n$PAD\nSh \"25\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 1142 -394\n$EndPAD\n$PAD\nSh \"26\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 1142 -591\n$EndPAD\n$PAD\nSh \"27\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 40 \"N-000045\"\nPo 1142 -787\n$EndPAD\n$PAD\nSh \"28\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 787 -1142\n$EndPAD\n$PAD\nSh \"29\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 591 -1142\n$EndPAD\n$PAD\nSh \"30\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 31 \"N-000033\"\nPo 394 -1142\n$EndPAD\n$PAD\nSh \"31\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 18 \"/RESET_N\"\nPo 197 -1142\n$EndPAD\n$PAD\nSh \"32\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 14 \"/P1_7\"\nPo 0 -1142\n$EndPAD\n$PAD\nSh \"33\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 13 \"/P1_6\"\nPo -197 -1142\n$EndPAD\n$PAD\nSh \"34\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 12 \"/P1_5\"\nPo -394 -1142\n$EndPAD\n$PAD\nSh \"35\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 11 \"/P1_4\"\nPo -591 -1142\n$EndPAD\n$PAD\nSh \"36\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 10 \"/P1_3\"\nPo -787 -1142\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 0 0\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 575 0\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -575 0\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 0 -575\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 0 575\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 575 -575\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -575 -575\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -575 575\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 575 575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 575 -575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 0 -575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo -575 -575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo -575 0\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 0 0\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 575 0\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo -575 575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 0 575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 575 575\n$EndPAD\n$EndMODULE  GSG-QFN36\n$TEXTPCB\nTe \"P2_2\"\nPo 58500 33000 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"P2_1\"\nPo 55150 33000 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"1\"\nPo 50800 31500 400 500 100 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$DRAWSEGMENT\nPo 0 56350 45500 56100 45500 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 56600 45500 56850 45500 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 65550 39150 65550 39400 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 65550 38900 65550 38650 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 63400 46450 64200 46450 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 64200 46500 64200 46200 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 63400 46500 64200 46500 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 63400 46200 63400 46500 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 3 65050 41750 65150 41850 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$TEXTPCB\nTe \"14\"\nPo 58500 49500 3500 5000 875 0\nDe 20 0 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"D1\"\nPo 65100 47850 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"C6/C17\"\nPo 61500 47050 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"R6\"\nPo 59150 39500 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"R7\"\nPo 60850 39250 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"R13\"\nPo 65000 33450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"R15\"\nPo 50500 42100 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"GND\"\nPo 65200 32450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"3V3\"\nPo 61850 32450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"DC\"\nPo 58500 32450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"DD\"\nPo 55150 32450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"RESET_N\"\nPo 51800 32450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"GND\"\nPo 52200 35000 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"3V3\"\nPo 52200 34000 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"SW1\"\nPo 67500 34500 600 800 120 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"P1  EXPANSION\"\nPo 59500 36500 600 800 120 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"P9\"\nPo 50000 36500 600 800 120 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$DRAWSEGMENT\nPo 0 65400 39150 65700 39150 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 65700 38900 65550 39100 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 65400 38900 65700 38900 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 65550 39100 65400 38900 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 56600 45650 56400 45500 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 56600 45350 56600 45650 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 56400 45500 56600 45350 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 56350 45650 56350 45350 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$TEXTPCB\nTe \"LED1\"\nPo 64500 38000 400 500 100 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"LED3\"\nPo 56500 46750 400 500 100 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"LED2\"\nPo 56500 44250 400 500 100 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$DRAWSEGMENT\nPo 0 63500 47000 62500 47000 150\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 63500 47000 63250 47250 150\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 63500 47000 63250 46750 150\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$TEXTPCB\nTe \"P2  ANTENNA\"\nPo 70000 45000 600 800 120 900\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"P8  GoodFET\"\nPo 52000 47000 600 800 120 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"http://greatscottgadgets.com/tc14badge/\"\nPo 58500 54000 700 1000 150 0\nDe 20 0 0 Normal C\n$EndTEXTPCB\n$DRAWSEGMENT\nPo 0 67000 17000 50000 17000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 46000 21000 46000 53000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 71000 53000 71000 21000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 50000 57000 67000 57000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 2 67000 21000 67000 17000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 2 50000 21000 46000 21000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 2 50000 53000 50000 57000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 2 67000 53000 71000 53000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$TRACK\nPo 0 62219 43494 62150 43563 80 -1\nDe 15 0 1 0 0\nPo 0 52000 44000 52000 45200 80 -1\nDe 15 0 1 0 C00000\nPo 0 56218 43782 60448 43782 80 -1\nDe 15 0 1 0 0\nPo 0 56990 31500 56128 30638 80 -1\nDe 15 0 1 0 0\nPo 0 54800 45200 52000 45200 80 -1\nDe 15 0 1 0 800000\nPo 0 60667 43563 60448 43782 80 -1\nDe 15 0 1 0 0\nPo 0 48800 44700 51300 44700 80 -1\nDe 0 0 1 0 0\nPo 0 48500 42500 48500 44400 80 -1\nDe 0 0 1 0 0\nPo 0 62558 43494 62219 43494 80 -1\nDe 15 0 1 0 400000\nPo 0 48500 44400 48800 44700 80 -1\nDe 0 0 1 0 0\nPo 0 52000 44000 51300 44700 80 -1\nDe 0 0 1 0 400000\nPo 0 49338 38838 49338 41662 80 -1\nDe 0 0 1 0 0\nPo 0 48080 37580 49338 38838 80 -1\nDe 0 0 1 0 0\nPo 3 48080 37580 48080 37580 310 160\nDe 15 1 1 0 0\nPo 0 48232 30638 47538 31332 80 -1\nDe 15 0 1 0 0\nPo 0 47538 31332 47538 37038 80 -1\nDe 15 0 1 0 0\nPo 0 56128 30638 48232 30638 80 -1\nDe 15 0 1 0 0\nPo 0 54800 45200 56218 43782 80 -1\nDe 15 0 1 0 0\nPo 0 56990 31500 58500 31500 80 -1\nDe 15 0 1 0 800000\nPo 0 49338 41662 48500 42500 80 -1\nDe 0 0 1 0 0\nPo 0 62150 43563 60667 43563 80 -1\nDe 15 0 1 0 0\nPo 0 47538 37038 48080 37580 80 -1\nDe 15 0 1 0 0\nPo 0 49000 44000 49500 43500 80 -1\nDe 15 0 2 0 400000\nPo 0 49500 38770 49500 43500 80 -1\nDe 0 0 2 0 0\nPo 0 62184 43297 62080 43401 80 -1\nDe 15 0 2 0 0\nPo 0 56200 43500 56320 43620 80 -1\nDe 15 0 2 0 0\nPo 0 49000 44000 49500 43500 80 -1\nDe 0 0 2 0 400000\nPo 0 56320 43620 60380 43620 80 -1\nDe 15 0 2 0 0\nPo 0 62184 43297 62558 43297 80 -1\nDe 15 0 2 0 800000\nPo 0 54454 30800 55154 31500 80 -1\nDe 15 0 2 0 800000\nPo 0 49500 43500 56200 43500 80 -1\nDe 15 0 2 0 0\nPo 0 62080 43401 60599 43401 80 -1\nDe 15 0 2 0 0\nPo 0 48380 37650 49500 38770 80 -1\nDe 0 0 2 0 0\nPo 0 48300 30800 54454 30800 80 -1\nDe 15 0 2 0 0\nPo 0 47700 31400 48300 30800 80 -1\nDe 15 0 2 0 0\nPo 0 47700 36800 48080 37180 80 -1\nDe 15 0 2 0 0\nPo 0 60380 43620 60599 43401 80 -1\nDe 15 0 2 0 0\nPo 3 48080 37180 48080 37180 310 160\nDe 15 1 2 0 0\nPo 0 47700 31400 47700 36800 80 -1\nDe 15 0 2 0 0\nPo 0 48380 37480 48380 37650 80 -1\nDe 0 0 2 0 0\nPo 0 48080 37180 48380 37480 80 -1\nDe 0 0 2 0 0\nPo 0 63700 41958 63700 41690 80 -1\nDe 15 0 3 0 400000\nPo 0 63676 41056 63000 40380 80 -1\nDe 15 0 3 0 0\nPo 0 63700 41690 63676 41666 80 -1\nDe 15 0 3 0 0\nPo 0 63000 40380 63000 35000 80 -1\nDe 15 0 3 0 800000\nPo 0 63676 41666 63676 41056 80 -1\nDe 15 0 3 0 0\nPo 0 62838 40448 62838 35818 80 -1\nDe 15 0 4 0 0\nPo 0 63503 41113 62838 40448 80 -1\nDe 15 0 4 0 0\nPo 0 62838 35818 62510 35490 80 -1\nDe 15 0 4 0 0\nPo 0 62510 35490 62510 34510 80 -1\nDe 15 0 4 0 0\nPo 0 63503 41958 63503 41113 80 -1\nDe 15 0 4 0 400000\nPo 0 62510 34510 62000 34000 80 -1\nDe 15 0 4 0 800000\nPo 0 62000 35210 62000 35000 80 -1\nDe 15 0 5 0 800000\nPo 0 62676 35886 62000 35210 80 -1\nDe 15 0 5 0 0\nPo 0 63306 41146 62676 40516 80 -1\nDe 15 0 5 0 0\nPo 0 63306 41958 63306 41146 80 -1\nDe 15 0 5 0 400000\nPo 0 62676 40516 62676 35886 80 -1\nDe 15 0 5 0 0\nPo 0 63109 41958 63109 41179 80 -1\nDe 15 0 6 0 400000\nPo 0 61500 34500 61000 34000 80 -1\nDe 15 0 6 0 800000\nPo 0 61500 35500 61500 34500 80 -1\nDe 15 0 6 0 0\nPo 0 63109 41179 62514 40584 80 -1\nDe 15 0 6 0 0\nPo 0 62514 40584 62514 36514 80 -1\nDe 15 0 6 0 0\nPo 0 62514 36514 61500 35500 80 -1\nDe 15 0 6 0 0\nPo 0 62352 40652 62352 36582 80 -1\nDe 15 0 7 0 0\nPo 0 62913 41958 62913 41213 80 -1\nDe 15 0 7 0 400000\nPo 0 61000 35230 61000 35000 80 -1\nDe 15 0 7 0 800000\nPo 0 62352 36582 61000 35230 80 -1\nDe 15 0 7 0 0\nPo 0 62913 41213 62352 40652 80 -1\nDe 15 0 7 0 0\nPo 0 56000 40920 56172 40748 80 -1\nDe 0 0 8 0 0\nPo 0 61943 43077 60461 43077 80 -1\nDe 15 0 8 0 0\nPo 3 56000 40920 56000 40920 310 160\nDe 15 1 8 0 0\nPo 0 62117 42903 61943 43077 80 -1\nDe 15 0 8 0 0\nPo 0 62558 42903 62117 42903 80 -1\nDe 15 0 8 0 400000\nPo 0 59500 34500 60000 34000 80 -1\nDe 15 0 8 0 800000\nPo 0 55841 42299 55832 42290 80 -1\nDe 15 0 8 0 0\nPo 0 55841 42299 55841 41079 80 -1\nDe 15 0 8 0 0\nPo 0 56350 38600 56680 38600 80 -1\nDe 0 0 8 0 0\nPo 0 56172 40748 56172 38778 80 -1\nDe 0 0 8 0 0\nPo 0 60242 43296 56838 43296 80 -1\nDe 15 0 8 0 0\nPo 0 60461 43077 60242 43296 80 -1\nDe 15 0 8 0 0\nPo 0 56838 43296 55841 42299 80 -1\nDe 15 0 8 0 0\nPo 0 56172 38778 56350 38600 80 -1\nDe 0 0 8 0 0\nPo 0 55841 41079 56000 40920 80 -1\nDe 15 0 8 0 0\nPo 3 56680 38600 56680 38600 310 160\nDe 15 1 8 0 0\nPo 0 56680 38600 59500 35780 80 -1\nDe 15 0 8 0 0\nPo 0 59500 35780 59500 34500 80 -1\nDe 15 0 8 0 0\nPo 0 64487 41958 64487 41683 80 -1\nDe 15 0 9 0 400000\nPo 0 60850 33500 60500 33850 80 -1\nDe 15 0 9 0 0\nPo 0 60500 34500 60000 35000 80 -1\nDe 15 0 9 0 800000\nPo 0 63650 33500 60850 33500 80 -1\nDe 15 0 9 0 0\nPo 0 64487 41683 65709 40461 80 -1\nDe 15 0 9 0 0\nPo 0 64100 33950 63650 33500 80 -1\nDe 15 0 9 0 0\nPo 0 64646 37386 64100 36840 80 -1\nDe 15 0 9 0 0\nPo 0 65709 37386 64646 37386 80 -1\nDe 15 0 9 0 400000\nPo 0 60500 33850 60500 34500 80 -1\nDe 15 0 9 0 0\nPo 0 65709 40461 65709 37386 80 -1\nDe 15 0 9 0 800000\nPo 0 64100 36840 64100 33950 80 -1\nDe 15 0 9 0 0\nPo 0 65709 37386 69291 37386 80 -1\nDe 15 0 9 0 C00000\nPo 0 67150 41200 67150 38280 80 -1\nDe 15 0 10 0 0\nPo 0 64370 34270 63600 33500 80 -1\nDe 0 0 10 0 0\nPo 0 63600 33500 59500 33500 80 -1\nDe 0 0 10 0 0\nPo 0 67150 38280 64370 35500 80 -1\nDe 0 0 10 0 0\nPo 0 66037 42313 67150 41200 80 -1\nDe 15 0 10 0 0\nPo 3 67150 38280 67150 38280 310 160\nDe 15 1 10 0 0\nPo 0 64842 42313 66037 42313 80 -1\nDe 15 0 10 0 400000\nPo 0 64370 35500 64370 34270 80 -1\nDe 0 0 10 0 0\nPo 0 59500 33500 59000 34000 80 -1\nDe 0 0 10 0 800000\nPo 0 67312 38688 67440 38560 80 -1\nDe 15 0 11 0 0\nPo 0 67440 38560 67440 38080 80 -1\nDe 0 0 11 0 0\nPo 0 65146 42509 65180 42475 80 -1\nDe 15 0 11 0 0\nPo 0 63668 33338 58902 33338 80 -1\nDe 0 0 11 0 0\nPo 0 67360 38000 67100 38000 80 -1\nDe 0 0 11 0 0\nPo 0 64842 42509 65146 42509 80 -1\nDe 15 0 11 0 400000\nPo 0 67440 38080 67360 38000 80 -1\nDe 0 0 11 0 0\nPo 0 58500 33740 58500 34500 80 -1\nDe 0 0 11 0 0\nPo 0 65180 42475 66105 42475 80 -1\nDe 15 0 11 0 0\nPo 0 67312 41268 67312 38688 80 -1\nDe 15 0 11 0 0\nPo 0 66105 42475 67312 41268 80 -1\nDe 15 0 11 0 0\nPo 0 67100 38000 64532 35432 80 -1\nDe 0 0 11 0 0\nPo 0 64532 34202 63668 33338 80 -1\nDe 0 0 11 0 0\nPo 0 58500 34500 59000 35000 80 -1\nDe 0 0 11 0 800000\nPo 0 58902 33338 58500 33740 80 -1\nDe 0 0 11 0 0\nPo 3 67440 38560 67440 38560 310 160\nDe 15 1 11 0 0\nPo 0 64532 35432 64532 34202 80 -1\nDe 0 0 11 0 0\nPo 0 58824 33176 58000 34000 80 -1\nDe 0 0 12 0 800000\nPo 0 64694 34134 63736 33176 80 -1\nDe 0 0 12 0 0\nPo 0 63736 33176 58824 33176 80 -1\nDe 0 0 12 0 0\nPo 0 67740 38150 67428 37838 80 -1\nDe 0 0 12 0 0\nPo 0 65174 42706 65243 42637 80 -1\nDe 15 0 12 0 0\nPo 3 67600 38920 67600 38920 310 160\nDe 15 1 12 0 0\nPo 0 67474 39046 67600 38920 80 -1\nDe 15 0 12 0 0\nPo 0 67740 38780 67740 38150 80 -1\nDe 0 0 12 0 0\nPo 0 64694 35364 64694 34134 80 -1\nDe 0 0 12 0 0\nPo 0 65243 42637 66173 42637 80 -1\nDe 15 0 12 0 0\nPo 0 67474 41336 67474 39046 80 -1\nDe 15 0 12 0 0\nPo 0 67600 38920 67740 38780 80 -1\nDe 0 0 12 0 0\nPo 0 66173 42637 67474 41336 80 -1\nDe 15 0 12 0 0\nPo 0 64842 42706 65174 42706 80 -1\nDe 15 0 12 0 400000\nPo 0 67168 37838 64694 35364 80 -1\nDe 0 0 12 0 0\nPo 0 67428 37838 67168 37838 80 -1\nDe 0 0 12 0 0\nPo 0 57500 34500 58000 35000 80 -1\nDe 0 0 13 0 800000\nPo 3 67760 39280 67760 39280 310 160\nDe 15 1 13 0 0\nPo 0 67236 37676 64856 35296 80 -1\nDe 0 0 13 0 0\nPo 0 67902 39138 67902 38082 80 -1\nDe 0 0 13 0 0\nPo 0 67636 39404 67760 39280 80 -1\nDe 15 0 13 0 0\nPo 0 64856 35296 64856 34066 80 -1\nDe 0 0 13 0 0\nPo 0 66241 42799 67636 41404 80 -1\nDe 15 0 13 0 0\nPo 0 63804 33014 58156 33014 80 -1\nDe 0 0 13 0 0\nPo 0 65207 42903 65311 42799 80 -1\nDe 15 0 13 0 0\nPo 0 67636 41404 67636 39404 80 -1\nDe 15 0 13 0 0\nPo 0 64842 42903 65207 42903 80 -1\nDe 15 0 13 0 400000\nPo 0 67902 38082 67496 37676 80 -1\nDe 0 0 13 0 0\nPo 0 58156 33014 57500 33670 80 -1\nDe 0 0 13 0 0\nPo 0 67496 37676 67236 37676 80 -1\nDe 0 0 13 0 0\nPo 0 67760 39280 67902 39138 80 -1\nDe 0 0 13 0 0\nPo 0 65311 42799 66241 42799 80 -1\nDe 15 0 13 0 0\nPo 0 57500 33670 57500 34500 80 -1\nDe 0 0 13 0 0\nPo 0 64856 34066 63804 33014 80 -1\nDe 0 0 13 0 0\nPo 0 66309 42961 67798 41472 80 -1\nDe 15 0 14 0 0\nPo 0 65240 43100 65379 42961 80 -1\nDe 15 0 14 0 0\nPo 0 65018 35228 65018 33998 80 -1\nDe 0 0 14 0 0\nPo 0 67798 39762 67920 39640 80 -1\nDe 15 0 14 0 0\nPo 0 68064 39496 68064 38014 80 -1\nDe 0 0 14 0 0\nPo 0 57000 33940 57000 34000 80 -1\nDe 0 0 14 0 800000\nPo 0 67564 37514 67304 37514 80 -1\nDe 0 0 14 0 0\nPo 0 65379 42961 66309 42961 80 -1\nDe 15 0 14 0 0\nPo 0 65018 33998 63872 32852 80 -1\nDe 0 0 14 0 0\nPo 3 67920 39640 67920 39640 310 160\nDe 15 1 14 0 0\nPo 0 63872 32852 58088 32852 80 -1\nDe 0 0 14 0 0\nPo 0 67920 39640 68064 39496 80 -1\nDe 0 0 14 0 0\nPo 0 68064 38014 67564 37514 80 -1\nDe 0 0 14 0 0\nPo 0 58088 32852 57000 33940 80 -1\nDe 0 0 14 0 0\nPo 0 67304 37514 65018 35228 80 -1\nDe 0 0 14 0 0\nPo 0 64842 43100 65240 43100 80 -1\nDe 15 0 14 0 400000\nPo 0 67798 41472 67798 39762 80 -1\nDe 15 0 14 0 0\nPo 0 55670 40650 55700 40620 80 -1\nDe 15 0 15 0 0\nPo 0 60310 43458 60529 43239 80 -1\nDe 15 0 15 0 0\nPo 0 57000 37720 57000 35000 80 -1\nDe 15 0 15 0 800000\nPo 0 55670 42358 55670 40650 80 -1\nDe 15 0 15 0 0\nPo 3 56440 38280 56440 38280 310 160\nDe 15 1 15 0 0\nPo 0 62010 43239 60529 43239 80 -1\nDe 15 0 15 0 0\nPo 0 56010 38710 56440 38280 80 -1\nDe 0 0 15 0 0\nPo 0 55700 40620 56010 40310 80 -1\nDe 0 0 15 0 0\nPo 0 56440 38280 57000 37720 80 -1\nDe 15 0 15 0 0\nPo 3 55700 40620 55700 40620 310 160\nDe 15 1 15 0 0\nPo 0 62558 43100 62149 43100 80 -1\nDe 15 0 15 0 400000\nPo 0 62149 43100 62010 43239 80 -1\nDe 15 0 15 0 0\nPo 0 56770 43458 60310 43458 80 -1\nDe 15 0 15 0 0\nPo 0 56010 40310 56010 38710 80 -1\nDe 0 0 15 0 0\nPo 0 55670 42358 56770 43458 80 -1\nDe 15 0 15 0 0\nPo 0 60735 43725 62225 43725 80 -1\nDe 15 0 16 0 0\nPo 0 58926 43944 58300 44570 80 -1\nDe 15 0 16 0 0\nPo 0 55410 40740 55410 40500 80 -1\nDe 0 0 16 0 0\nPo 0 55808 38382 55808 35488 80 -1\nDe 15 0 16 0 0\nPo 0 55848 38598 55720 38470 80 -1\nDe 0 0 16 0 0\nPo 0 58300 44570 58300 45000 80 -1\nDe 15 0 16 0 800000\nPo 0 58926 43944 60516 43944 80 -1\nDe 15 0 16 0 0\nPo 0 55720 38470 55808 38382 80 -1\nDe 15 0 16 0 0\nPo 0 55500 35180 55500 34500 80 -1\nDe 15 0 16 0 0\nPo 0 56000 34000 55500 34500 80 -1\nDe 15 0 16 0 400000\nPo 0 58140 44410 58140 43470 80 -1\nDe 0 0 16 0 0\nPo 0 62259 43691 62558 43691 80 -1\nDe 15 0 16 0 800000\nPo 0 55410 40500 55848 40062 80 -1\nDe 0 0 16 0 0\nPo 0 62225 43725 62259 43691 80 -1\nDe 15 0 16 0 0\nPo 0 58140 43470 55410 40740 80 -1\nDe 0 0 16 0 0\nPo 0 55808 35488 55500 35180 80 -1\nDe 15 0 16 0 0\nPo 0 60516 43944 60735 43725 80 -1\nDe 15 0 16 0 0\nPo 0 58140 44410 58300 44570 80 -1\nDe 0 0 16 0 0\nPo 0 55848 40062 55848 38598 80 -1\nDe 0 0 16 0 0\nPo 3 55720 38470 55720 38470 310 160\nDe 15 1 16 0 0\nPo 3 58300 44570 58300 44570 310 160\nDe 15 1 16 0 0\nPo 0 56334 41434 56334 39066 80 -1\nDe 0 0 17 0 0\nPo 0 56460 38940 56000 38480 80 -1\nDe 15 0 17 0 0\nPo 0 58810 44720 58810 45490 80 -1\nDe 15 0 17 0 0\nPo 0 58302 44152 58302 43402 80 -1\nDe 0 0 17 0 0\nPo 0 60803 43887 60584 44106 80 -1\nDe 15 0 17 0 0\nPo 0 58810 44660 58302 44152 80 -1\nDe 0 0 17 0 0\nPo 0 59424 44106 59215 44315 80 -1\nDe 15 0 17 0 0\nPo 0 60584 44106 59424 44106 80 -1\nDe 15 0 17 0 0\nPo 0 58810 45490 58300 46000 80 -1\nDe 15 0 17 0 800000\nPo 0 56000 38480 56000 35000 80 -1\nDe 15 0 17 0 800000\nPo 0 58810 44720 58810 44660 80 -1\nDe 0 0 17 0 0\nPo 3 58810 44720 58810 44720 310 160\nDe 15 1 17 0 0\nPo 0 59215 44315 58810 44720 80 -1\nDe 15 0 17 0 0\nPo 3 56460 38940 56460 38940 310 160\nDe 15 1 17 0 0\nPo 0 62558 43887 60803 43887 80 -1\nDe 15 0 17 0 400000\nPo 0 56334 39066 56460 38940 80 -1\nDe 0 0 17 0 0\nPo 0 58302 43402 56334 41434 80 -1\nDe 0 0 17 0 0\nPo 0 50500 42800 49662 41962 80 -1\nDe 0 0 18 0 0\nPo 3 57640 32880 57640 32880 310 160\nDe 15 1 18 0 0\nPo 0 51000 44000 50500 43500 80 -1\nDe 0 0 18 0 400000\nPo 0 48542 37582 49662 38702 80 -1\nDe 0 0 18 0 0\nPo 0 50500 43500 50500 42800 80 -1\nDe 0 0 18 0 0\nPo 0 51807 31499 51270 30962 80 -1\nDe 15 0 18 0 0\nPo 0 51807 31499 51807 31500 80 -1\nDe 15 0 18 0 800000\nPo 0 67632 37352 67372 37352 80 -1\nDe 0 0 18 0 0\nPo 0 49662 38702 49662 41962 80 -1\nDe 0 0 18 0 0\nPo 0 65105 43297 64842 43297 80 -1\nDe 15 0 18 0 800000\nPo 0 51000 44000 51000 45200 80 -1\nDe 15 0 18 0 C00000\nPo 0 67960 40120 68080 40000 80 -1\nDe 15 0 18 0 0\nPo 0 66377 43123 67960 41540 80 -1\nDe 15 0 18 0 0\nPo 0 63940 32690 57830 32690 80 -1\nDe 0 0 18 0 0\nPo 0 65308 43262 65447 43123 80 -1\nDe 15 0 18 0 0\nPo 0 65140 43262 65308 43262 80 -1\nDe 15 0 18 0 0\nPo 0 65105 43297 65140 43262 80 -1\nDe 15 0 18 0 0\nPo 0 67960 41540 67960 40120 80 -1\nDe 15 0 18 0 0\nPo 0 57830 32690 57640 32880 80 -1\nDe 0 0 18 0 0\nPo 0 47900 31430 47900 36560 80 -1\nDe 15 0 18 0 0\nPo 0 51270 30962 48368 30962 80 -1\nDe 15 0 18 0 0\nPo 0 48480 37140 48542 37202 80 -1\nDe 0 0 18 0 0\nPo 0 68226 39854 68226 37946 80 -1\nDe 0 0 18 0 0\nPo 3 48480 37140 48480 37140 310 160\nDe 15 1 18 0 0\nPo 0 47900 36560 48480 37140 80 -1\nDe 15 0 18 0 0\nPo 0 67372 37352 65180 35160 80 -1\nDe 0 0 18 0 0\nPo 3 68080 40000 68080 40000 310 160\nDe 15 1 18 0 0\nPo 0 68226 37946 67632 37352 80 -1\nDe 0 0 18 0 0\nPo 0 48368 30962 47900 31430 80 -1\nDe 15 0 18 0 0\nPo 0 48542 37202 48542 37582 80 -1\nDe 0 0 18 0 0\nPo 0 68080 40000 68226 39854 80 -1\nDe 0 0 18 0 0\nPo 0 65180 33930 63940 32690 80 -1\nDe 0 0 18 0 0\nPo 0 65447 43123 66377 43123 80 -1\nDe 15 0 18 0 0\nPo 0 51807 31500 53367 33060 80 -1\nDe 15 0 18 0 400000\nPo 0 65180 35160 65180 33930 80 -1\nDe 0 0 18 0 0\nPo 0 57460 33060 53367 33060 80 -1\nDe 15 0 18 0 0\nPo 0 57640 32880 57460 33060 80 -1\nDe 15 0 18 0 0\nPo 0 53050 37210 52610 37650 200 -1\nDe 15 0 19 0 0\nPo 0 53050 37100 53600 37650 200 -1\nDe 15 0 19 0 C00000\nPo 0 53050 37210 53050 37100 200 -1\nDe 15 0 19 0 800000\nPo 0 50210 37650 48500 39360 500 -1\nDe 15 0 19 0 0\nPo 0 48372 39488 48500 39360 80 -1\nDe 15 0 19 0 0\nPo 0 48500 39360 48490 39360 200 -1\nDe 15 0 19 0 0\nPo 0 47781 39488 48372 39488 80 -1\nDe 15 0 19 0 400000\nPo 0 52610 37650 50210 37650 500 -1\nDe 15 0 19 0 0\nPo 0 60200 40550 60200 40300 200 -1\nDe 15 0 20 0 0\nPo 3 64340 41430 64340 41430 310 160\nDe 15 1 20 0 0\nPo 3 53050 38350 53050 38350 420 250\nDe 15 1 20 0 0\nPo 0 61690 44350 61260 44780 200 -1\nDe 0 0 20 0 0\nPo 0 65300 34000 65750 34000 200 -1\nDe 15 0 20 0 400000\nPo 0 65500 44250 65330 44080 200 -1\nDe 15 0 20 0 0\nPo 0 62690 44350 62850 44350 80 -1\nDe 15 0 20 0 0\nPo 0 61926 42706 61920 42700 80 -1\nDe 15 0 20 0 0\nPo 0 64291 44242 64291 44451 80 -1\nDe 15 0 20 0 400000\nPo 0 66000 43000 67500 43000 200 -1\nDe 0 0 20 0 0\nPo 0 53050 38900 53050 38350 200 -1\nDe 15 0 20 0 400000\nPo 0 62558 42706 61926 42706 80 -1\nDe 15 0 20 0 400000\nPo 0 60200 40300 59800 39900 200 -1\nDe 0 0 20 0 0\nPo 3 65500 41600 65500 41600 420 250\nDe 15 1 20 0 0\nPo 0 64291 44451 64460 44620 80 -1\nDe 15 0 20 0 0\nPo 0 61450 42230 61920 42700 200 -1\nDe 0 0 20 0 0\nPo 0 64460 44620 64660 44620 80 -1\nDe 15 0 20 0 0\nPo 0 64800 44760 64660 44620 200 -1\nDe 15 0 20 0 0\nPo 0 60350 44590 59730 44590 200 -1\nDe 0 0 20 0 0\nPo 0 65840 44250 65500 44250 200 -1\nDe 15 0 20 0 400000\nPo 0 64660 44620 64790 44620 200 -1\nDe 0 0 20 0 0\nPo 0 53100 38400 53100 40500 200 -1\nDe 0 0 20 0 0\nPo 0 62280 44350 62690 44350 200 -1\nDe 15 0 20 0 0\nPo 0 65170 43920 65170 43800 200 -1\nDe 15 0 20 0 0\nPo 3 59800 38550 59800 38550 420 250\nDe 15 1 20 0 0\nPo 3 64660 44620 64660 44620 310 160\nDe 15 1 20 0 0\nPo 3 59730 44590 59730 44590 420 250\nDe 15 1 20 0 0\nPo 0 64291 41479 64340 41430 80 -1\nDe 15 0 20 0 0\nPo 0 64340 41430 65330 41430 200 -1\nDe 0 0 20 0 0\nPo 0 62913 44242 62913 44287 80 -1\nDe 15 0 20 0 400000\nPo 0 64400 44880 64660 44620 200 -1\nDe 0 0 20 0 0\nPo 0 63250 44940 62870 44940 200 -1\nDe 0 0 20 0 0\nPo 0 61920 42700 61560 42700 200 -1\nDe 15 0 20 0 800000\nPo 3 61450 41800 61450 41800 420 250\nDe 15 1 20 0 0\nPo 0 63250 44940 63250 44854 200 -1\nDe 15 0 20 0 0\nPo 0 63503 44601 63347 44757 80 -1\nDe 15 0 20 0 0\nPo 0 65330 41430 65500 41600 200 -1\nDe 0 0 20 0 0\nPo 0 62850 44350 62913 44287 80 -1\nDe 15 0 20 0 0\nPo 0 59800 38550 59800 39900 200 -1\nDe 0 0 20 0 0\nPo 0 65083 43887 65170 43800 80 -1\nDe 15 0 20 0 0\nPo 0 61450 41800 61450 42230 200 -1\nDe 0 0 20 0 0\nPo 3 65750 34000 65750 34000 420 250\nDe 15 1 20 0 0\nPo 0 63250 44854 63347 44757 200 -1\nDe 15 0 20 0 0\nPo 0 65170 43920 65330 44080 200 -1\nDe 15 0 20 0 0\nPo 0 62280 44350 61760 44350 200 -1\nDe 15 0 20 0 800000\nPo 3 63250 44940 63250 44940 310 160\nDe 15 1 20 0 0\nPo 0 53050 38900 53600 38350 200 -1\nDe 15 0 20 0 C00000\nPo 3 65330 44080 65330 44080 310 160\nDe 15 1 20 0 0\nPo 0 50800 41500 51250 41500 200 -1\nDe 15 0 20 0 400000\nPo 0 63250 44940 63250 45240 200 -1\nDe 15 0 20 0 800000\nPo 3 60200 40300 60200 40300 420 250\nDe 15 1 20 0 0\nPo 0 64400 44900 64400 44880 200 -1\nDe 0 0 20 0 0\nPo 0 64842 43691 65061 43691 80 -1\nDe 15 0 20 0 400000\nPo 3 53100 40500 53100 40500 420 250\nDe 15 1 20 0 0\nPo 3 64400 44900 64400 44900 310 160\nDe 15 1 20 0 0\nPo 3 51250 41500 51250 41500 420 250\nDe 15 1 20 0 0\nPo 0 61260 44780 60540 44780 200 -1\nDe 0 0 20 0 0\nPo 0 65330 44080 65330 43670 200 -1\nDe 0 0 20 0 0\nPo 0 64350 41420 64340 41430 200 -1\nDe 15 0 20 0 0\nPo 0 65330 43670 66000 43000 200 -1\nDe 0 0 20 0 0\nPo 0 64842 43887 65083 43887 80 -1\nDe 15 0 20 0 400000\nPo 0 65061 43691 65170 43800 80 -1\nDe 15 0 20 0 0\nPo 0 63503 44242 63503 44601 80 -1\nDe 15 0 20 0 400000\nPo 0 62280 44350 61690 44350 200 -1\nDe 0 0 20 0 0\nPo 0 62870 44940 62280 44350 200 -1\nDe 0 0 20 0 0\nPo 0 60540 44780 60350 44590 200 -1\nDe 0 0 20 0 0\nPo 0 64094 44614 64160 44680 80 -1\nDe 15 0 20 0 0\nPo 3 67500 43000 67500 43000 420 250\nDe 15 1 20 0 0\nPo 0 64400 44900 64380 44900 200 -1\nDe 15 0 20 0 0\nPo 0 64291 41479 64291 41958 80 -1\nDe 15 0 20 0 800000\nPo 0 64380 44900 64160 44680 200 -1\nDe 15 0 20 0 0\nPo 0 64400 44900 64400 45190 200 -1\nDe 15 0 20 0 800000\nPo 0 53050 38350 53100 38400 200 -1\nDe 0 0 20 0 0\nPo 0 61450 41800 60200 40550 200 -1\nDe 15 0 20 0 0\nPo 0 64790 44620 65330 44080 200 -1\nDe 0 0 20 0 0\nPo 0 64094 44242 64094 44614 80 -1\nDe 15 0 20 0 400000\nPo 3 62280 44350 62280 44350 310 160\nDe 15 1 20 0 0\nPo 0 64800 44760 64800 45190 200 -1\nDe 15 0 20 0 800000\nPo 3 61920 42700 61920 42700 310 160\nDe 15 1 20 0 0\nPo 0 64350 41060 64350 41420 200 -1\nDe 15 0 20 0 400000\nPo 0 63125 42525 64275 42525 1000 -1\nDe 0 0 21 0 C00000\nPo 0 64400 45610 64400 45780 200 -1\nDe 15 0 21 0 400000\nPo 3 65280 45860 65280 45860 310 160\nDe 15 1 21 0 0\nPo 0 55760 45000 55750 44990 200 -1\nDe 15 0 21 0 0\nPo 0 65200 45780 65280 45860 200 -1\nDe 15 0 21 0 0\nPo 0 65200 45610 65200 45780 200 -1\nDe 15 0 21 0 400000\nPo 3 64480 45860 64480 45860 310 160\nDe 15 1 21 0 0\nPo 0 64800 45780 64880 45860 200 -1\nDe 15 0 21 0 0\nPo 0 59200 42900 59650 42900 200 -1\nDe 15 0 21 0 400000\nPo 0 64800 45610 64800 45780 200 -1\nDe 15 0 21 0 400000\nPo 3 64880 45860 64880 45860 310 160\nDe 15 1 21 0 0\nPo 0 65709 35614 65709 35041 200 -1\nDe 15 0 21 0 400000\nPo 0 63125 42525 64275 43675 500 -1\nDe 0 0 21 0 C00000\nPo 0 64275 42525 64275 43675 1000 -1\nDe 0 0 21 0 C00000\nPo 3 64350 40190 64350 40190 420 250\nDe 15 1 21 0 0\nPo 0 65100 47310 64900 47310 200 -1\nDe 15 0 21 0 400000\nPo 0 56200 46000 55750 46000 200 -1\nDe 15 0 21 0 400000\nPo 0 54400 38000 54850 38000 200 -1\nDe 15 0 21 0 400000\nPo 3 66560 44250 66560 44250 310 160\nDe 15 1 21 0 0\nPo 3 65000 39750 65000 39750 420 250\nDe 15 1 21 0 0\nPo 3 60150 44990 60150 44990 310 160\nDe 15 1 21 0 0\nPo 0 48420 40510 50290 40510 500 -1\nDe 15 0 21 0 0\nPo 0 61340 44350 60940 44350 200 -1\nDe 15 0 21 0 400000\nPo 0 69291 35614 69291 35049 200 -1\nDe 15 0 21 0 400000\nPo 0 66559 51937 66559 47509 200 -1\nDe 15 0 21 0 400000\nPo 3 59650 41100 59650 41100 420 250\nDe 15 1 21 0 0\nPo 0 56200 45000 55760 45000 200 -1\nDe 15 0 21 0 400000\nPo 0 48418 40512 48420 40510 80 -1\nDe 15 0 21 0 0\nPo 3 65210 46300 65210 46300 310 160\nDe 15 1 21 0 0\nPo 0 64910 46300 65210 46300 200 -1\nDe 15 0 21 0 400000\nPo 0 65193 31500 65200 31500 200 -1\nDe 15 0 21 0 400000\nPo 3 62850 45960 62850 45960 310 160\nDe 15 1 21 0 0\nPo 0 63250 45660 63250 45960 200 -1\nDe 15 0 21 0 400000\nPo 0 64275 43675 63125 43675 1000 -1\nDe 0 0 21 0 C00000\nPo 0 65200 31500 65900 32200 200 -1\nDe 15 0 21 0 0\nPo 0 69291 35049 69300 35040 200 -1\nDe 15 0 21 0 0\nPo 3 50300 40500 50300 40500 420 250\nDe 15 1 21 0 0\nPo 3 54850 38000 54850 38000 420 250\nDe 15 1 21 0 0\nPo 3 60690 42710 60690 42710 420 250\nDe 15 1 21 0 0\nPo 3 65900 32200 65900 32200 420 250\nDe 15 1 21 0 0\nPo 3 60940 44350 60940 44350 420 250\nDe 15 1 21 0 0\nPo 0 64400 45780 64480 45860 200 -1\nDe 15 0 21 0 0\nPo 3 64800 47410 64800 47410 310 160\nDe 15 1 21 0 0\nPo 0 65000 39300 65000 39750 200 -1\nDe 15 0 21 0 400000\nPo 0 66260 44250 66560 44250 80 -1\nDe 15 0 21 0 400000\nPo 0 60150 45290 60150 44990 200 -1\nDe 15 0 21 0 400000\nPo 0 60700 42700 60690 42710 200 -1\nDe 15 0 21 0 0\nPo 3 69300 35040 69300 35040 420 250\nDe 15 1 21 0 0\nPo 0 63125 43675 64275 42525 500 -1\nDe 0 0 21 0 C00000\nPo 3 55750 46000 55750 46000 420 250\nDe 15 1 21 0 0\nPo 3 65710 35040 65710 35040 420 250\nDe 15 1 21 0 0\nPo 0 50290 40510 50300 40500 500 -1\nDe 15 0 21 0 0\nPo 3 55750 44990 55750 44990 420 250\nDe 15 1 21 0 0\nPo 0 63125 43675 63125 42525 1000 -1\nDe 0 0 21 0 C00000\nPo 0 65709 35041 65710 35040 200 -1\nDe 15 0 21 0 0\nPo 3 59650 42900 59650 42900 420 250\nDe 15 1 21 0 0\nPo 3 52000 38900 52000 38900 420 250\nDe 15 1 21 0 0\nPo 0 66550 43750 67000 43750 200 -1\nDe 15 0 21 0 400000\nPo 0 52450 38900 52000 38900 200 -1\nDe 15 0 21 0 400000\nPo 3 67000 43750 67000 43750 420 250\nDe 15 1 21 0 0\nPo 0 47781 40512 48418 40512 80 -1\nDe 15 0 21 0 400000\nPo 0 61140 42700 60700 42700 200 -1\nDe 15 0 21 0 400000\nPo 0 64900 47310 64800 47410 200 -1\nDe 15 0 21 0 0\nPo 3 52450 36650 52450 36650 420 250\nDe 15 1 21 0 0\nPo 3 48420 40510 48420 40510 420 250\nDe 15 1 21 0 0\nPo 0 52450 37100 52450 36650 200 -1\nDe 15 0 21 0 400000\nPo 0 59200 41100 59650 41100 200 -1\nDe 15 0 21 0 400000\nPo 0 62850 45660 62850 45960 200 -1\nDe 15 0 21 0 400000\nPo 0 66559 47509 66250 47200 200 -1\nDe 15 0 21 0 800000\nPo 3 63250 45960 63250 45960 310 160\nDe 15 1 21 0 0\nPo 0 64350 40640 64350 40190 200 -1\nDe 15 0 21 0 400000\nPo 0 61846 31500 62200 31500 80 -1\nDe 15 0 22 0 400000\nPo 0 62200 31500 64700 34000 80 -1\nDe 15 0 22 0 800000\nPo 0 64600 46800 65450 46800 500 -1\nDe 15 0 23 0 400000\nPo 0 66050 46200 67250 46200 500 -1\nDe 15 0 23 0 800000\nPo 0 65450 46800 66050 46200 500 -1\nDe 15 0 23 0 0\nPo 0 64690 46890 64600 46800 80 -1\nDe 15 0 23 0 800000\nPo 0 65100 46890 64690 46890 80 -1\nDe 15 0 23 0 400000\nPo 0 57700 45000 56800 45000 80 -1\nDe 15 0 24 0 C00000\nPo 0 56800 46000 57700 46000 80 -1\nDe 15 0 25 0 C00000\nPo 0 63605 45575 63605 44915 200 -1\nDe 15 0 26 0 0\nPo 0 63605 45740 63605 45575 80 -1\nDe 15 0 26 0 400000\nPo 0 63700 44820 63605 44915 80 -1\nDe 15 0 26 0 0\nPo 0 63700 44242 63700 44820 80 -1\nDe 15 0 26 0 400000\nPo 0 63995 45575 63995 44925 200 -1\nDe 15 0 27 0 0\nPo 0 63897 44242 63897 44827 80 -1\nDe 15 0 27 0 400000\nPo 0 63897 44827 63995 44925 80 -1\nDe 15 0 27 0 0\nPo 0 63995 45740 63995 45575 80 -1\nDe 15 0 27 0 400000\nPo 0 64140 46000 64160 46020 80 -1\nDe 15 0 28 0 0\nPo 0 64440 46300 64490 46300 200 -1\nDe 15 0 28 0 800000\nPo 0 63995 46000 64140 46000 80 -1\nDe 15 0 28 0 400000\nPo 0 64440 46300 64160 46020 200 -1\nDe 15 0 28 0 0\nPo 0 64000 47400 64000 51937 500 -1\nDe 15 0 29 0 C00000\nPo 0 64000 46265 63995 46260 80 -1\nDe 15 0 30 0 800000\nPo 0 64000 46800 64000 46550 500 -1\nDe 15 0 30 0 400000\nPo 0 64000 46550 64000 46265 80 -1\nDe 15 0 30 0 0\nPo 0 64842 43494 65204 43494 80 -1\nDe 15 0 31 0 400000\nPo 0 65280 43500 65210 43500 200 -1\nDe 15 0 31 0 0\nPo 0 65530 43750 65280 43500 200 -1\nDe 15 0 31 0 0\nPo 0 65530 43750 65950 43750 200 -1\nDe 15 0 31 0 800000\nPo 0 65204 43494 65210 43500 80 -1\nDe 15 0 31 0 0\nPo 0 63897 41958 63897 41639 80 -1\nDe 15 0 32 0 400000\nPo 0 61620 39800 61150 39800 80 -1\nDe 15 0 32 0 800000\nPo 0 62060 40240 61620 39800 80 -1\nDe 15 0 32 0 0\nPo 3 62060 40240 62060 40240 310 160\nDe 15 1 32 0 0\nPo 0 63260 40240 62060 40240 80 -1\nDe 0 0 32 0 0\nPo 0 63280 40260 63260 40240 80 -1\nDe 0 0 32 0 0\nPo 3 63280 40260 63280 40260 310 160\nDe 15 1 32 0 0\nPo 0 63280 40430 63280 40260 80 -1\nDe 15 0 32 0 0\nPo 0 63838 40988 63280 40430 80 -1\nDe 15 0 32 0 0\nPo 0 63838 41580 63838 40988 80 -1\nDe 15 0 32 0 0\nPo 0 63897 41639 63838 41580 80 -1\nDe 15 0 32 0 0\nPo 0 57950 41100 57950 40700 80 -1\nDe 15 0 33 0 400000\nPo 0 58900 39750 59800 39750 80 -1\nDe 15 0 33 0 800000\nPo 0 57950 40700 58900 39750 80 -1\nDe 15 0 33 0 0\nPo 0 59850 39800 59800 39750 80 -1\nDe 15 0 33 0 800000\nPo 0 60550 39800 59850 39800 80 -1\nDe 15 0 33 0 400000\nPo 0 64000 38700 65000 38700 80 -1\nDe 15 0 34 0 C00000\nPo 0 49000 42260 49760 41500 200 -1\nDe 15 0 35 0 0\nPo 0 49000 43000 49000 42260 200 -1\nDe 15 0 35 0 400000\nPo 0 49760 41500 50200 41500 200 -1\nDe 15 0 35 0 800000\nPo 0 47781 39744 56644 39744 80 -1\nDe 15 0 36 0 400000\nPo 0 57650 40750 57650 42300 80 -1\nDe 15 0 36 0 800000\nPo 0 56644 39744 57650 40750 80 -1\nDe 15 0 36 0 0\nPo 0 57950 41700 59200 41700 80 -1\nDe 15 0 37 0 C00000\nPo 0 62558 42313 62293 42313 80 -1\nDe 15 0 37 0 400000\nPo 0 59638 42138 59200 41700 80 -1\nDe 15 0 37 0 800000\nPo 0 62293 42313 62118 42138 80 -1\nDe 15 0 37 0 0\nPo 0 62118 42138 59638 42138 80 -1\nDe 15 0 37 0 0\nPo 0 48356 40000 48450 39906 80 -1\nDe 15 0 38 0 0\nPo 0 56576 39906 57350 40680 80 -1\nDe 15 0 38 0 0\nPo 0 47781 40000 48356 40000 80 -1\nDe 15 0 38 0 400000\nPo 0 57350 41100 57350 41700 80 -1\nDe 15 0 38 0 C00000\nPo 0 48450 39906 56576 39906 80 -1\nDe 15 0 38 0 0\nPo 0 57350 40680 57350 41100 80 -1\nDe 15 0 38 0 800000\nPo 0 62850 44940 62850 45240 80 -1\nDe 15 0 39 0 800000\nPo 0 62488 45240 62228 45500 80 -1\nDe 15 0 39 0 800000\nPo 0 62850 45240 62488 45240 80 -1\nDe 15 0 39 0 400000\nPo 0 63306 44242 63306 44484 80 -1\nDe 15 0 39 0 400000\nPo 0 63306 44484 62850 44940 80 -1\nDe 15 0 39 0 0\nPo 0 65200 44680 64790 44270 200 -1\nDe 15 0 40 0 0\nPo 0 64700 44270 64515 44270 80 -1\nDe 15 0 40 0 0\nPo 0 64790 44270 64700 44270 200 -1\nDe 15 0 40 0 0\nPo 0 65200 45190 65200 44680 200 -1\nDe 15 0 40 0 400000\nPo 0 64515 44270 64487 44242 80 -1\nDe 15 0 40 0 800000\nPo 0 60772 45368 60772 45500 80 -1\nDe 15 0 41 0 800000\nPo 0 63109 44451 62780 44780 80 -1\nDe 15 0 41 0 0\nPo 0 63109 44242 63109 44451 80 -1\nDe 15 0 41 0 400000\nPo 0 62780 44780 61360 44780 80 -1\nDe 15 0 41 0 0\nPo 0 60150 45710 60562 45710 80 -1\nDe 15 0 41 0 400000\nPo 0 61360 44780 60772 45368 80 -1\nDe 15 0 41 0 0\nPo 0 60562 45710 60772 45500 80 -1\nDe 15 0 41 0 800000\nPo 0 64000 39300 64000 41490 80 -1\nDe 15 0 42 0 400000\nPo 0 64094 41584 64094 41958 80 -1\nDe 15 0 42 0 800000\nPo 0 64000 41490 64094 41584 80 -1\nDe 15 0 42 0 0\nPo 0 58250 42300 59200 42300 80 -1\nDe 15 0 43 0 C00000\nPo 0 62558 42509 62259 42509 80 -1\nDe 15 0 43 0 400000\nPo 0 62050 42300 59200 42300 80 -1\nDe 15 0 43 0 800000\nPo 0 62259 42509 62050 42300 80 -1\nDe 15 0 43 0 0\n$EndTRACK\n$ZONE\n$EndZONE\n$CZONE_OUTLINE\nZInfo 504D73B4 21 \"GND\"\nZLayer 0\nZAux 4 E\nZClearance 200 T\nZMinThickness 100\nZOptions 0 16 F 120 200\nZSmoothing 0 0\nZCorner 70500 48000 0\nZCorner 70500 21500 0\nZCorner 46500 21500 0\nZCorner 46500 48000 1\n$POLYSCORNERS\n63771 43100 0 0\n63700 43171 0 0\n63629 43100 0 0\n63700 43029 0 0\n63771 43100 1 0\n70450 47950 0 0\n68911 47950 0 0\n68911 47307 0 0\n68911 45307 0 0\n68902 45046 0 0\n68820 44848 0 0\n68728 44793 0 0\n68657 44864 0 0\n68657 44722 0 0\n68602 44630 0 0\n68516 44598 0 0\n68516 39854 0 0\n68516 37946 0 0\n68494 37835 0 0\n68431 37741 0 0\n67837 37147 0 0\n67743 37084 0 0\n67632 37062 0 0\n67492 37062 0 0\n65470 35040 0 0\n65470 34370 0 0\n65489 34390 0 0\n65658 34460 0 0\n65841 34460 0 0\n66010 34390 0 0\n66140 34261 0 0\n66210 34092 0 0\n66210 33909 0 0\n66140 33740 0 0\n66011 33610 0 0\n65842 33540 0 0\n65659 33540 0 0\n65490 33610 0 0\n65380 33719 0 0\n64145 32485 0 0\n64051 32422 0 0\n63940 32400 0 0\n57830 32400 0 0\n57719 32422 0 0\n57687 32443 0 0\n57637 32476 0 0\n57560 32476 0 0\n57411 32537 0 0\n57298 32651 0 0\n57236 32799 0 0\n57236 32960 0 0\n57297 33109 0 0\n57359 33170 0 0\n57078 33451 0 0\n56891 33451 0 0\n56689 33535 0 0\n56535 33689 0 0\n56500 33773 0 0\n56465 33689 0 0\n56311 33535 0 0\n56109 33451 0 0\n55891 33451 0 0\n55689 33535 0 0\n55535 33689 0 0\n55451 33891 0 0\n55451 34109 0 0\n55535 34311 0 0\n55689 34465 0 0\n55773 34500 0 0\n55689 34535 0 0\n55535 34689 0 0\n55451 34891 0 0\n55451 35109 0 0\n55535 35311 0 0\n55689 35465 0 0\n55891 35549 0 0\n56109 35549 0 0\n56311 35465 0 0\n56465 35311 0 0\n56500 35226 0 0\n56535 35311 0 0\n56689 35465 0 0\n56891 35549 0 0\n57109 35549 0 0\n57311 35465 0 0\n57465 35311 0 0\n57500 35226 0 0\n57535 35311 0 0\n57689 35465 0 0\n57891 35549 0 0\n58109 35549 0 0\n58311 35465 0 0\n58465 35311 0 0\n58500 35226 0 0\n58535 35311 0 0\n58689 35465 0 0\n58891 35549 0 0\n59109 35549 0 0\n59311 35465 0 0\n59465 35311 0 0\n59500 35226 0 0\n59535 35311 0 0\n59689 35465 0 0\n59891 35549 0 0\n60109 35549 0 0\n60311 35465 0 0\n60465 35311 0 0\n60500 35226 0 0\n60535 35311 0 0\n60689 35465 0 0\n60891 35549 0 0\n61109 35549 0 0\n61311 35465 0 0\n61465 35311 0 0\n61500 35226 0 0\n61535 35311 0 0\n61689 35465 0 0\n61891 35549 0 0\n62109 35549 0 0\n62311 35465 0 0\n62465 35311 0 0\n62500 35226 0 0\n62535 35311 0 0\n62689 35465 0 0\n62891 35549 0 0\n63109 35549 0 0\n63311 35465 0 0\n63465 35311 0 0\n63549 35109 0 0\n63549 34891 0 0\n63465 34689 0 0\n63311 34535 0 0\n63154 34470 0 0\n63334 34470 0 0\n63396 34444 0 0\n63444 34396 0 0\n63470 34334 0 0\n63470 34266 0 0\n63470 34092 0 0\n63428 34050 0 0\n63100 34050 0 0\n63050 34050 0 0\n62950 34050 0 0\n62950 33950 0 0\n63050 33950 0 0\n63100 33950 0 0\n63428 33950 0 0\n63470 33908 0 0\n63470 33790 0 0\n63480 33790 0 0\n64080 34390 0 0\n64080 35500 0 0\n64102 35611 0 0\n64165 35705 0 0\n66746 38286 0 0\n66746 38360 0 0\n66807 38509 0 0\n66921 38622 0 0\n67050 38676 0 0\n67097 38789 0 0\n67196 38887 0 0\n67196 39000 0 0\n67257 39149 0 0\n67356 39247 0 0\n67356 39360 0 0\n67417 39509 0 0\n67516 39607 0 0\n67516 39720 0 0\n67577 39869 0 0\n67676 39967 0 0\n67676 40080 0 0\n67737 40229 0 0\n67851 40342 0 0\n67999 40404 0 0\n68160 40404 0 0\n68309 40343 0 0\n68422 40229 0 0\n68484 40081 0 0\n68484 39979 0 0\n68494 39965 0 0\n68516 39854 0 0\n68516 44598 0 0\n68357 44539 0 0\n68096 44548 0 0\n67960 44604 0 0\n67960 43092 0 0\n67960 42909 0 0\n67890 42740 0 0\n67761 42610 0 0\n67592 42540 0 0\n67409 42540 0 0\n67240 42610 0 0\n67199 42650 0 0\n66000 42650 0 0\n65960 42658 0 0\n65960 41692 0 0\n65960 41509 0 0\n65890 41340 0 0\n65761 41210 0 0\n65592 41140 0 0\n65513 41140 0 0\n65464 41107 0 0\n65330 41080 0 0\n64549 41080 0 0\n64421 41026 0 0\n64260 41026 0 0\n64111 41087 0 0\n63998 41201 0 0\n63936 41349 0 0\n63936 41510 0 0\n63997 41659 0 0\n64111 41772 0 0\n64259 41834 0 0\n64420 41834 0 0\n64551 41780 0 0\n65076 41780 0 0\n65110 41860 0 0\n65239 41990 0 0\n65408 42060 0 0\n65591 42060 0 0\n65760 41990 0 0\n65890 41861 0 0\n65960 41692 0 0\n65960 42658 0 0\n65866 42677 0 0\n65752 42753 0 0\n65083 43423 0 0\n65007 43536 0 0\n64980 43670 0 0\n64980 43870 0 0\n64933 43982 0 0\n64717 44198 0 0\n64717 43729 0 0\n64717 43154 0 0\n64717 42579 0 0\n64704 42406 0 0\n64662 42306 0 0\n64592 42278 0 0\n64522 42348 0 0\n64522 42208 0 0\n64494 42138 0 0\n64329 42083 0 0\n64156 42096 0 0\n64056 42138 0 0\n64028 42208 0 0\n64275 42454 0 0\n64522 42208 0 0\n64522 42348 0 0\n64346 42525 0 0\n64592 42772 0 0\n64662 42744 0 0\n64717 42579 0 0\n64717 43154 0 0\n64704 42981 0 0\n64662 42881 0 0\n64592 42853 0 0\n64346 43100 0 0\n64592 43347 0 0\n64662 43319 0 0\n64717 43154 0 0\n64717 43729 0 0\n64704 43556 0 0\n64662 43456 0 0\n64592 43428 0 0\n64522 43498 0 0\n64522 43417 0 0\n64492 43387 0 0\n64522 43358 0 0\n64494 43288 0 0\n64341 43237 0 0\n64310 43206 0 0\n64275 43171 0 0\n64204 43100 0 0\n64275 43029 0 0\n64310 42994 0 0\n64309 42993 0 0\n64346 42957 0 0\n64394 42954 0 0\n64494 42912 0 0\n64522 42842 0 0\n64492 42812 0 0\n64522 42783 0 0\n64494 42713 0 0\n64341 42662 0 0\n64310 42631 0 0\n64275 42596 0 0\n64204 42525 0 0\n64169 42490 0 0\n64132 42453 0 0\n64129 42406 0 0\n64087 42306 0 0\n64017 42278 0 0\n63987 42307 0 0\n63958 42278 0 0\n63947 42282 0 0\n63947 42208 0 0\n63919 42138 0 0\n63754 42083 0 0\n63684 42088 0 0\n63684 40341 0 0\n63684 40180 0 0\n63623 40031 0 0\n63509 39918 0 0\n63361 39856 0 0\n63200 39856 0 0\n63051 39917 0 0\n63018 39950 0 0\n62341 39950 0 0\n62289 39898 0 0\n62141 39836 0 0\n61980 39836 0 0\n61831 39897 0 0\n61718 40011 0 0\n61656 40159 0 0\n61656 40320 0 0\n61717 40469 0 0\n61831 40582 0 0\n61979 40644 0 0\n62140 40644 0 0\n62289 40583 0 0\n62341 40530 0 0\n62978 40530 0 0\n63051 40602 0 0\n63199 40664 0 0\n63360 40664 0 0\n63509 40603 0 0\n63622 40489 0 0\n63684 40341 0 0\n63684 42088 0 0\n63581 42096 0 0\n63481 42138 0 0\n63453 42208 0 0\n63700 42454 0 0\n63947 42208 0 0\n63947 42282 0 0\n63888 42306 0 0\n63837 42458 0 0\n63771 42525 0 0\n63700 42596 0 0\n63629 42525 0 0\n63594 42490 0 0\n63557 42453 0 0\n63554 42406 0 0\n63512 42306 0 0\n63442 42278 0 0\n63412 42307 0 0\n63383 42278 0 0\n63372 42282 0 0\n63372 42208 0 0\n63344 42138 0 0\n63179 42083 0 0\n63006 42096 0 0\n62906 42138 0 0\n62878 42208 0 0\n63125 42454 0 0\n63372 42208 0 0\n63372 42282 0 0\n63313 42306 0 0\n63262 42458 0 0\n63196 42525 0 0\n63125 42596 0 0\n63054 42666 0 0\n63054 42525 0 0\n62808 42278 0 0\n62738 42306 0 0\n62683 42471 0 0\n62696 42644 0 0\n62738 42744 0 0\n62808 42772 0 0\n63054 42525 0 0\n63054 42666 0 0\n63053 42667 0 0\n63006 42671 0 0\n62906 42713 0 0\n62878 42783 0 0\n62907 42812 0 0\n62878 42842 0 0\n62906 42912 0 0\n63058 42962 0 0\n63090 42994 0 0\n63125 43029 0 0\n63196 43100 0 0\n63125 43171 0 0\n63054 43241 0 0\n63054 43100 0 0\n62808 42853 0 0\n62738 42881 0 0\n62683 43046 0 0\n62696 43219 0 0\n62738 43319 0 0\n62808 43347 0 0\n63054 43100 0 0\n63054 43241 0 0\n63053 43242 0 0\n63006 43246 0 0\n62906 43288 0 0\n62878 43358 0 0\n62907 43387 0 0\n62878 43417 0 0\n62906 43487 0 0\n63058 43537 0 0\n63090 43569 0 0\n63125 43604 0 0\n63196 43675 0 0\n63231 43710 0 0\n63267 43746 0 0\n63271 43794 0 0\n63313 43894 0 0\n63383 43922 0 0\n63412 43892 0 0\n63442 43922 0 0\n63512 43894 0 0\n63562 43741 0 0\n63593 43709 0 0\n63594 43710 0 0\n63629 43675 0 0\n63700 43604 0 0\n63771 43675 0 0\n63806 43710 0 0\n63842 43746 0 0\n63846 43794 0 0\n63888 43894 0 0\n63958 43922 0 0\n63987 43892 0 0\n64017 43922 0 0\n64087 43894 0 0\n64137 43741 0 0\n64168 43709 0 0\n64169 43710 0 0\n64204 43675 0 0\n64275 43604 0 0\n64310 43569 0 0\n64309 43568 0 0\n64346 43532 0 0\n64394 43529 0 0\n64494 43487 0 0\n64522 43417 0 0\n64522 43498 0 0\n64346 43675 0 0\n64592 43922 0 0\n64662 43894 0 0\n64717 43729 0 0\n64717 44198 0 0\n64699 44216 0 0\n64580 44216 0 0\n64522 44239 0 0\n64522 43992 0 0\n64275 43746 0 0\n64028 43992 0 0\n64056 44062 0 0\n64221 44117 0 0\n64394 44104 0 0\n64494 44062 0 0\n64522 43992 0 0\n64522 44239 0 0\n64431 44277 0 0\n64318 44391 0 0\n64264 44518 0 0\n64171 44557 0 0\n64058 44671 0 0\n63996 44819 0 0\n63996 44980 0 0\n64057 45129 0 0\n64171 45242 0 0\n64319 45304 0 0\n64480 45304 0 0\n64629 45243 0 0\n64742 45129 0 0\n64795 45001 0 0\n64889 44963 0 0\n64905 44946 0 0\n64924 44943 0 0\n65037 44867 0 0\n65428 44476 0 0\n65559 44423 0 0\n65672 44309 0 0\n65734 44161 0 0\n65734 44000 0 0\n65680 43868 0 0\n65680 43814 0 0\n66144 43350 0 0\n67199 43350 0 0\n67239 43390 0 0\n67408 43460 0 0\n67591 43460 0 0\n67760 43390 0 0\n67890 43261 0 0\n67960 43092 0 0\n67960 44604 0 0\n67898 44630 0 0\n67843 44722 0 0\n68250 45129 0 0\n68657 44722 0 0\n68657 44864 0 0\n68321 45200 0 0\n68728 45607 0 0\n68820 45552 0 0\n68911 45307 0 0\n68911 47307 0 0\n68902 47046 0 0\n68820 46848 0 0\n68728 46793 0 0\n68657 46864 0 0\n68657 46722 0 0\n68602 46630 0 0\n68357 46539 0 0\n68096 46548 0 0\n67999 46588 0 0\n67898 46630 0 0\n67869 46678 0 0\n67849 46658 0 0\n67884 46625 0 0\n67999 46350 0 0\n67999 46052 0 0\n67885 45777 0 0\n67849 45741 0 0\n67869 45721 0 0\n67898 45770 0 0\n68143 45861 0 0\n68404 45852 0 0\n68602 45770 0 0\n68657 45678 0 0\n68285 45306 0 0\n68250 45271 0 0\n68179 45200 0 0\n68144 45165 0 0\n67772 44793 0 0\n67680 44848 0 0\n67589 45093 0 0\n67598 45354 0 0\n67680 45552 0 0\n67728 45580 0 0\n67708 45600 0 0\n67675 45566 0 0\n67400 45451 0 0\n67102 45451 0 0\n66911 45530 0 0\n66827 45565 0 0\n66791 45600 0 0\n66771 45580 0 0\n66820 45552 0 0\n66911 45307 0 0\n66902 45046 0 0\n66820 44848 0 0\n66728 44793 0 0\n66657 44864 0 0\n66657 44722 0 0\n66602 44630 0 0\n66357 44539 0 0\n66096 44548 0 0\n65898 44630 0 0\n65843 44722 0 0\n66250 45129 0 0\n66657 44722 0 0\n66657 44864 0 0\n66356 45165 0 0\n66321 45200 0 0\n66250 45271 0 0\n66215 45306 0 0\n66179 45342 0 0\n66179 45200 0 0\n65772 44793 0 0\n65680 44848 0 0\n65589 45093 0 0\n65598 45354 0 0\n65680 45552 0 0\n65772 45607 0 0\n66179 45200 0 0\n66179 45342 0 0\n65843 45678 0 0\n65898 45770 0 0\n66143 45861 0 0\n66404 45852 0 0\n66602 45770 0 0\n66630 45721 0 0\n66650 45741 0 0\n66616 45775 0 0\n66501 46050 0 0\n66501 46348 0 0\n66615 46623 0 0\n66650 46658 0 0\n66630 46678 0 0\n66602 46630 0 0\n66357 46539 0 0\n66096 46548 0 0\n65898 46630 0 0\n65843 46722 0 0\n66215 47094 0 0\n66250 47129 0 0\n66321 47200 0 0\n66356 47235 0 0\n66728 47607 0 0\n66820 47552 0 0\n66911 47307 0 0\n66902 47046 0 0\n66820 46848 0 0\n66771 46819 0 0\n66791 46799 0 0\n66825 46834 0 0\n67100 46949 0 0\n67398 46949 0 0\n67673 46835 0 0\n67708 46799 0 0\n67728 46819 0 0\n67680 46848 0 0\n67589 47093 0 0\n67598 47354 0 0\n67680 47552 0 0\n67772 47607 0 0\n68144 47235 0 0\n68179 47200 0 0\n68250 47129 0 0\n68285 47094 0 0\n68657 46722 0 0\n68657 46864 0 0\n68321 47200 0 0\n68728 47607 0 0\n68820 47552 0 0\n68911 47307 0 0\n68911 47950 0 0\n68657 47950 0 0\n68657 47678 0 0\n68250 47271 0 0\n68179 47342 0 0\n67843 47678 0 0\n67898 47770 0 0\n68143 47861 0 0\n68404 47852 0 0\n68602 47770 0 0\n68657 47678 0 0\n68657 47950 0 0\n66911 47950 0 0\n66657 47950 0 0\n66657 47678 0 0\n66250 47271 0 0\n66179 47342 0 0\n66179 47200 0 0\n65772 46793 0 0\n65680 46848 0 0\n65589 47093 0 0\n65598 47354 0 0\n65680 47552 0 0\n65772 47607 0 0\n66179 47200 0 0\n66179 47342 0 0\n65843 47678 0 0\n65898 47770 0 0\n66143 47861 0 0\n66404 47852 0 0\n66602 47770 0 0\n66657 47678 0 0\n66657 47950 0 0\n63947 47950 0 0\n63947 43992 0 0\n63700 43746 0 0\n63453 43992 0 0\n63481 44062 0 0\n63646 44117 0 0\n63819 44104 0 0\n63919 44062 0 0\n63947 43992 0 0\n63947 47950 0 0\n63654 47950 0 0\n63654 45021 0 0\n63654 44860 0 0\n63593 44711 0 0\n63479 44598 0 0\n63372 44553 0 0\n63372 43992 0 0\n63125 43746 0 0\n63054 43816 0 0\n63054 43675 0 0\n62808 43428 0 0\n62738 43456 0 0\n62683 43621 0 0\n62696 43794 0 0\n62738 43894 0 0\n62808 43922 0 0\n63054 43675 0 0\n63054 43816 0 0\n62878 43992 0 0\n62906 44062 0 0\n63071 44117 0 0\n63244 44104 0 0\n63344 44062 0 0\n63372 43992 0 0\n63372 44553 0 0\n63331 44536 0 0\n63170 44536 0 0\n63038 44590 0 0\n63014 44590 0 0\n62676 44252 0 0\n62623 44121 0 0\n62509 44008 0 0\n62361 43946 0 0\n62324 43946 0 0\n62324 42781 0 0\n62324 42620 0 0\n62263 42471 0 0\n62149 42358 0 0\n62017 42302 0 0\n61807 42093 0 0\n61840 42061 0 0\n61910 41892 0 0\n61910 41709 0 0\n61840 41540 0 0\n61711 41410 0 0\n61542 41340 0 0\n61359 41340 0 0\n61190 41410 0 0\n61060 41539 0 0\n60990 41708 0 0\n60990 41891 0 0\n61060 42060 0 0\n61100 42100 0 0\n61100 42230 0 0\n61127 42364 0 0\n61203 42477 0 0\n61523 42798 0 0\n61577 42929 0 0\n61691 43042 0 0\n61839 43104 0 0\n62000 43104 0 0\n62149 43043 0 0\n62262 42929 0 0\n62324 42781 0 0\n62324 43946 0 0\n62200 43946 0 0\n62068 44000 0 0\n61690 44000 0 0\n61556 44027 0 0\n61442 44103 0 0\n61115 44430 0 0\n60684 44430 0 0\n60660 44406 0 0\n60660 40392 0 0\n60660 40209 0 0\n60590 40040 0 0\n60461 39910 0 0\n60292 39840 0 0\n60234 39840 0 0\n60150 39755 0 0\n60150 38850 0 0\n60190 38811 0 0\n60260 38642 0 0\n60260 38459 0 0\n60190 38290 0 0\n60061 38160 0 0\n59892 38090 0 0\n59709 38090 0 0\n59540 38160 0 0\n59410 38289 0 0\n59340 38458 0 0\n59340 38641 0 0\n59410 38810 0 0\n59450 38850 0 0\n59450 39900 0 0\n59477 40034 0 0\n59553 40147 0 0\n59740 40334 0 0\n59740 40391 0 0\n59810 40560 0 0\n59939 40690 0 0\n60108 40760 0 0\n60291 40760 0 0\n60460 40690 0 0\n60590 40561 0 0\n60660 40392 0 0\n60660 44406 0 0\n60597 44343 0 0\n60484 44267 0 0\n60350 44240 0 0\n60030 44240 0 0\n59991 44200 0 0\n59822 44130 0 0\n59639 44130 0 0\n59470 44200 0 0\n59340 44329 0 0\n59270 44498 0 0\n59270 44681 0 0\n59340 44850 0 0\n59469 44980 0 0\n59638 45050 0 0\n59821 45050 0 0\n59990 44980 0 0\n60030 44940 0 0\n60205 44940 0 0\n60292 45027 0 0\n60293 45027 0 0\n60406 45103 0 0\n60540 45130 0 0\n61260 45130 0 0\n61260 45129 0 0\n61394 45103 0 0\n61507 45027 0 0\n61834 44700 0 0\n62070 44700 0 0\n62183 44747 0 0\n62622 45187 0 0\n62623 45187 0 0\n62736 45263 0 0\n62870 45290 0 0\n63040 45290 0 0\n63169 45344 0 0\n63330 45344 0 0\n63479 45283 0 0\n63592 45169 0 0\n63654 45021 0 0\n63654 47950 0 0\n59214 47950 0 0\n59214 44801 0 0\n59214 44640 0 0\n59153 44491 0 0\n59039 44378 0 0\n58891 44316 0 0\n58876 44316 0 0\n58592 44032 0 0\n58592 43402 0 0\n58570 43291 0 0\n58507 43197 0 0\n56624 41314 0 0\n56624 39309 0 0\n56689 39283 0 0\n56802 39169 0 0\n56864 39021 0 0\n56864 38961 0 0\n56909 38943 0 0\n57022 38829 0 0\n57084 38681 0 0\n57084 38520 0 0\n57023 38371 0 0\n56909 38258 0 0\n56844 38230 0 0\n56844 38200 0 0\n56783 38051 0 0\n56669 37938 0 0\n56521 37876 0 0\n56360 37876 0 0\n56211 37937 0 0\n56098 38051 0 0\n56036 38199 0 0\n56036 38214 0 0\n55949 38128 0 0\n55801 38066 0 0\n55640 38066 0 0\n55491 38127 0 0\n55378 38241 0 0\n55316 38389 0 0\n55316 38550 0 0\n55377 38699 0 0\n55491 38812 0 0\n55558 38840 0 0\n55558 39942 0 0\n55205 40295 0 0\n55142 40389 0 0\n55120 40500 0 0\n55120 40740 0 0\n55142 40851 0 0\n55205 40945 0 0\n57850 43590 0 0\n57850 44410 0 0\n57872 44521 0 0\n57896 44556 0 0\n57896 44650 0 0\n57957 44799 0 0\n58071 44912 0 0\n58219 44974 0 0\n58380 44974 0 0\n58463 44939 0 0\n58467 44949 0 0\n58581 45062 0 0\n58729 45124 0 0\n58890 45124 0 0\n59039 45063 0 0\n59152 44949 0 0\n59214 44801 0 0\n59214 47950 0 0\n55549 47950 0 0\n55549 44109 0 0\n55549 43891 0 0\n55465 43689 0 0\n55311 43535 0 0\n55226 43500 0 0\n55311 43465 0 0\n55465 43311 0 0\n55549 43109 0 0\n55549 42891 0 0\n55465 42689 0 0\n55311 42535 0 0\n55109 42451 0 0\n54891 42451 0 0\n54689 42535 0 0\n54535 42689 0 0\n54500 42773 0 0\n54465 42689 0 0\n54311 42535 0 0\n54109 42451 0 0\n53891 42451 0 0\n53689 42535 0 0\n53560 42664 0 0\n53560 40592 0 0\n53560 40409 0 0\n53490 40240 0 0\n53450 40199 0 0\n53450 38586 0 0\n53510 38442 0 0\n53510 38259 0 0\n53440 38090 0 0\n53311 37960 0 0\n53142 37890 0 0\n52959 37890 0 0\n52790 37960 0 0\n52660 38089 0 0\n52590 38258 0 0\n52590 38441 0 0\n52660 38610 0 0\n52750 38700 0 0\n52750 40199 0 0\n52710 40239 0 0\n52640 40408 0 0\n52640 40591 0 0\n52710 40760 0 0\n52839 40890 0 0\n53008 40960 0 0\n53191 40960 0 0\n53360 40890 0 0\n53490 40761 0 0\n53560 40592 0 0\n53560 42664 0 0\n53535 42689 0 0\n53500 42773 0 0\n53465 42689 0 0\n53311 42535 0 0\n53109 42451 0 0\n52891 42451 0 0\n52689 42535 0 0\n52535 42689 0 0\n52500 42773 0 0\n52465 42689 0 0\n52311 42535 0 0\n52109 42451 0 0\n51891 42451 0 0\n51710 42526 0 0\n51710 41592 0 0\n51710 41409 0 0\n51640 41240 0 0\n51549 41148 0 0\n51549 34109 0 0\n51549 33891 0 0\n51465 33689 0 0\n51311 33535 0 0\n51109 33451 0 0\n50891 33451 0 0\n50689 33535 0 0\n50535 33689 0 0\n50500 33773 0 0\n50465 33689 0 0\n50311 33535 0 0\n50109 33451 0 0\n49891 33451 0 0\n49689 33535 0 0\n49535 33689 0 0\n49500 33773 0 0\n49465 33689 0 0\n49311 33535 0 0\n49109 33451 0 0\n48891 33451 0 0\n48689 33535 0 0\n48535 33689 0 0\n48451 33891 0 0\n48451 34109 0 0\n48535 34311 0 0\n48689 34465 0 0\n48845 34530 0 0\n48666 34530 0 0\n48604 34556 0 0\n48556 34604 0 0\n48530 34666 0 0\n48530 34734 0 0\n48530 34908 0 0\n48572 34950 0 0\n48900 34950 0 0\n48950 34950 0 0\n49050 34950 0 0\n49100 34950 0 0\n49428 34950 0 0\n49470 34908 0 0\n49470 34734 0 0\n49470 34666 0 0\n49444 34604 0 0\n49396 34556 0 0\n49334 34530 0 0\n49154 34530 0 0\n49311 34465 0 0\n49465 34311 0 0\n49500 34226 0 0\n49535 34311 0 0\n49689 34465 0 0\n49885 34546 0 0\n49878 34547 0 0\n49766 34593 0 0\n49735 34664 0 0\n50000 34929 0 0\n50265 34664 0 0\n50234 34593 0 0\n50102 34549 0 0\n50109 34549 0 0\n50311 34465 0 0\n50465 34311 0 0\n50500 34226 0 0\n50535 34311 0 0\n50689 34465 0 0\n50885 34546 0 0\n50878 34547 0 0\n50766 34593 0 0\n50735 34664 0 0\n51000 34929 0 0\n51265 34664 0 0\n51234 34593 0 0\n51102 34549 0 0\n51109 34549 0 0\n51311 34465 0 0\n51465 34311 0 0\n51549 34109 0 0\n51549 41148 0 0\n51511 41110 0 0\n51465 41090 0 0\n51465 35061 0 0\n51453 34878 0 0\n51407 34766 0 0\n51336 34735 0 0\n51071 35000 0 0\n51336 35265 0 0\n51407 35234 0 0\n51465 35061 0 0\n51465 41090 0 0\n51342 41040 0 0\n51265 41040 0 0\n51265 35336 0 0\n51000 35071 0 0\n50929 35142 0 0\n50929 35000 0 0\n50664 34735 0 0\n50593 34766 0 0\n50535 34939 0 0\n50547 35122 0 0\n50593 35234 0 0\n50664 35265 0 0\n50929 35000 0 0\n50929 35142 0 0\n50735 35336 0 0\n50766 35407 0 0\n50939 35465 0 0\n51122 35453 0 0\n51234 35407 0 0\n51265 35336 0 0\n51265 41040 0 0\n51159 41040 0 0\n50990 41110 0 0\n50860 41239 0 0\n50790 41408 0 0\n50790 41591 0 0\n50860 41760 0 0\n50989 41890 0 0\n51158 41960 0 0\n51341 41960 0 0\n51510 41890 0 0\n51640 41761 0 0\n51710 41592 0 0\n51710 42526 0 0\n51689 42535 0 0\n51535 42689 0 0\n51500 42773 0 0\n51465 42689 0 0\n51311 42535 0 0\n51109 42451 0 0\n50891 42451 0 0\n50689 42535 0 0\n50667 42557 0 0\n50465 42355 0 0\n50465 35061 0 0\n50453 34878 0 0\n50407 34766 0 0\n50336 34735 0 0\n50071 35000 0 0\n50336 35265 0 0\n50407 35234 0 0\n50465 35061 0 0\n50465 42355 0 0\n50265 42155 0 0\n50265 35336 0 0\n50000 35071 0 0\n49929 35142 0 0\n49929 35000 0 0\n49664 34735 0 0\n49593 34766 0 0\n49535 34939 0 0\n49547 35122 0 0\n49593 35234 0 0\n49664 35265 0 0\n49929 35000 0 0\n49929 35142 0 0\n49735 35336 0 0\n49766 35407 0 0\n49939 35465 0 0\n50122 35453 0 0\n50234 35407 0 0\n50265 35336 0 0\n50265 42155 0 0\n49952 41842 0 0\n49952 38702 0 0\n49951 38701 0 0\n49930 38591 0 0\n49929 38590 0 0\n49867 38497 0 0\n49866 38496 0 0\n49470 38100 0 0\n49470 35334 0 0\n49470 35266 0 0\n49470 35092 0 0\n49428 35050 0 0\n49050 35050 0 0\n49050 35428 0 0\n49092 35470 0 0\n49334 35470 0 0\n49396 35444 0 0\n49444 35396 0 0\n49470 35334 0 0\n49470 38100 0 0\n48950 37580 0 0\n48950 35428 0 0\n48950 35050 0 0\n48572 35050 0 0\n48530 35092 0 0\n48530 35266 0 0\n48530 35334 0 0\n48556 35396 0 0\n48604 35444 0 0\n48666 35470 0 0\n48908 35470 0 0\n48950 35428 0 0\n48950 37580 0 0\n48832 37462 0 0\n48832 37345 0 0\n48884 37221 0 0\n48884 37060 0 0\n48823 36911 0 0\n48709 36798 0 0\n48561 36736 0 0\n48400 36736 0 0\n48251 36797 0 0\n48239 36808 0 0\n48161 36776 0 0\n48000 36776 0 0\n47851 36837 0 0\n47738 36951 0 0\n47676 37099 0 0\n47676 37260 0 0\n47725 37380 0 0\n47676 37499 0 0\n47676 37660 0 0\n47737 37809 0 0\n47851 37922 0 0\n47999 37984 0 0\n48074 37984 0 0\n49048 38958 0 0\n49048 41542 0 0\n48374 42216 0 0\n48374 41086 0 0\n48374 40873 0 0\n48374 39128 0 0\n48374 38915 0 0\n48293 38718 0 0\n48142 38568 0 0\n47946 38486 0 0\n47733 38486 0 0\n47536 38567 0 0\n47386 38718 0 0\n47304 38914 0 0\n47304 39127 0 0\n47385 39324 0 0\n47536 39474 0 0\n47732 39556 0 0\n47945 39556 0 0\n48142 39475 0 0\n48292 39324 0 0\n48374 39128 0 0\n48374 40873 0 0\n48293 40676 0 0\n48142 40526 0 0\n47946 40444 0 0\n47733 40444 0 0\n47536 40525 0 0\n47386 40676 0 0\n47304 40872 0 0\n47304 41085 0 0\n47385 41282 0 0\n47536 41432 0 0\n47732 41514 0 0\n47945 41514 0 0\n48142 41433 0 0\n48292 41282 0 0\n48374 41086 0 0\n48374 42216 0 0\n48295 42295 0 0\n48232 42389 0 0\n48210 42500 0 0\n48210 44400 0 0\n48232 44511 0 0\n48295 44605 0 0\n48595 44905 0 0\n48689 44968 0 0\n48800 44990 0 0\n51300 44990 0 0\n51411 44968 0 0\n51505 44905 0 0\n51869 44540 0 0\n51891 44549 0 0\n52109 44549 0 0\n52311 44465 0 0\n52465 44311 0 0\n52546 44114 0 0\n52547 44122 0 0\n52593 44234 0 0\n52664 44265 0 0\n52929 44000 0 0\n52664 43735 0 0\n52593 43766 0 0\n52549 43897 0 0\n52549 43891 0 0\n52465 43689 0 0\n52311 43535 0 0\n52226 43500 0 0\n52311 43465 0 0\n52465 43311 0 0\n52500 43226 0 0\n52535 43311 0 0\n52689 43465 0 0\n52885 43546 0 0\n52878 43547 0 0\n52766 43593 0 0\n52735 43664 0 0\n53000 43929 0 0\n53265 43664 0 0\n53234 43593 0 0\n53102 43549 0 0\n53109 43549 0 0\n53311 43465 0 0\n53465 43311 0 0\n53500 43226 0 0\n53535 43311 0 0\n53689 43465 0 0\n53773 43500 0 0\n53689 43535 0 0\n53535 43689 0 0\n53453 43885 0 0\n53453 43878 0 0\n53407 43766 0 0\n53336 43735 0 0\n53071 44000 0 0\n53336 44265 0 0\n53407 44234 0 0\n53451 44102 0 0\n53451 44109 0 0\n53535 44311 0 0\n53689 44465 0 0\n53891 44549 0 0\n54109 44549 0 0\n54311 44465 0 0\n54465 44311 0 0\n54500 44226 0 0\n54535 44311 0 0\n54689 44465 0 0\n54891 44549 0 0\n55109 44549 0 0\n55311 44465 0 0\n55465 44311 0 0\n55549 44109 0 0\n55549 47950 0 0\n53265 47950 0 0\n53265 44336 0 0\n53000 44071 0 0\n52735 44336 0 0\n52766 44407 0 0\n52939 44465 0 0\n53122 44453 0 0\n53234 44407 0 0\n53265 44336 0 0\n53265 47950 0 0\n46550 47950 0 0\n46550 41645 0 0\n46556 41648 0 0\n46781 41648 0 0\n46989 41562 0 0\n47148 41403 0 0\n47234 41196 0 0\n47234 40971 0 0\n47148 40763 0 0\n46989 40604 0 0\n46782 40518 0 0\n46557 40518 0 0\n46550 40520 0 0\n46550 39479 0 0\n46556 39482 0 0\n46781 39482 0 0\n46989 39396 0 0\n47148 39237 0 0\n47234 39030 0 0\n47234 38805 0 0\n47148 38597 0 0\n46989 38438 0 0\n46782 38352 0 0\n46557 38352 0 0\n46550 38354 0 0\n46550 21550 0 0\n70450 21550 0 0\n70450 47950 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 504D73CA 20 \"3V3\"\nZLayer 15\nZAux 6 E\nZClearance 200 T\nZMinThickness 100\nZOptions 0 16 F 120 200\nZSmoothing 0 0\nZCorner 60100 48000 0\nZCorner 60100 44800 0\nZCorner 70500 44800 0\nZCorner 70500 21500 0\nZCorner 46500 21500 0\nZCorner 46500 48000 1\n$POLYSCORNERS\n60703 44750 0 0\n60481 44750 0 0\n60379 44648 0 0\n60231 44586 0 0\n60070 44586 0 0\n59921 44647 0 0\n59808 44761 0 0\n59746 44909 0 0\n59746 45070 0 0\n59791 45179 0 0\n59791 45239 0 0\n59791 45439 0 0\n59816 45499 0 0\n59791 45560 0 0\n59791 45659 0 0\n59791 45859 0 0\n59829 45951 0 0\n59899 46021 0 0\n59990 46059 0 0\n60050 46059 0 0\n60050 47950 0 0\n52340 47950 0 0\n52340 46004 0 0\n52340 45892 0 0\n52298 45850 0 0\n52050 45850 0 0\n52050 46098 0 0\n52092 46140 0 0\n52136 46140 0 0\n52204 46140 0 0\n52266 46114 0 0\n52314 46066 0 0\n52340 46004 0 0\n52340 47950 0 0\n51950 47950 0 0\n51950 46098 0 0\n51950 45850 0 0\n51702 45850 0 0\n51660 45892 0 0\n51660 46004 0 0\n51686 46066 0 0\n51734 46114 0 0\n51796 46140 0 0\n51864 46140 0 0\n51908 46140 0 0\n51950 46098 0 0\n51950 47950 0 0\n51340 47950 0 0\n51340 46004 0 0\n51340 45892 0 0\n51298 45850 0 0\n51050 45850 0 0\n51050 46098 0 0\n51092 46140 0 0\n51136 46140 0 0\n51204 46140 0 0\n51266 46114 0 0\n51314 46066 0 0\n51340 46004 0 0\n51340 47950 0 0\n50950 47950 0 0\n50950 46098 0 0\n50950 45850 0 0\n50702 45850 0 0\n50660 45892 0 0\n50660 46004 0 0\n50686 46066 0 0\n50734 46114 0 0\n50796 46140 0 0\n50864 46140 0 0\n50908 46140 0 0\n50950 46098 0 0\n50950 47950 0 0\n46550 47950 0 0\n46550 41647 0 0\n46553 41647 0 0\n46556 41648 0 0\n46781 41648 0 0\n46783 41647 0 0\n46979 41647 0 0\n46991 41676 0 0\n47061 41746 0 0\n47152 41784 0 0\n47251 41784 0 0\n47501 41784 0 0\n47503 41783 0 0\n47505 41784 0 0\n47604 41784 0 0\n48174 41784 0 0\n48266 41746 0 0\n48336 41676 0 0\n48374 41585 0 0\n48374 41486 0 0\n48374 41086 0 0\n48374 41000 0 0\n48420 41010 0 0\n50285 41010 0 0\n50290 41011 0 0\n50290 41010 0 0\n50481 40972 0 0\n50482 40972 0 0\n50644 40864 0 0\n50653 40854 0 0\n50762 40692 0 0\n50801 40500 0 0\n50762 40308 0 0\n50686 40196 0 0\n56456 40196 0 0\n57009 40749 0 0\n56969 40789 0 0\n56931 40880 0 0\n56931 40979 0 0\n56931 41319 0 0\n56964 41399 0 0\n56931 41480 0 0\n56931 41579 0 0\n56931 41919 0 0\n56969 42011 0 0\n57039 42081 0 0\n57130 42119 0 0\n57229 42119 0 0\n57231 42119 0 0\n57231 42179 0 0\n57231 42519 0 0\n57269 42611 0 0\n57339 42681 0 0\n57430 42719 0 0\n57529 42719 0 0\n57869 42719 0 0\n57949 42685 0 0\n58030 42719 0 0\n58129 42719 0 0\n58469 42719 0 0\n58561 42681 0 0\n58631 42611 0 0\n58639 42590 0 0\n58810 42590 0 0\n58814 42599 0 0\n58781 42680 0 0\n58781 42779 0 0\n58781 43006 0 0\n56958 43006 0 0\n56131 42179 0 0\n56131 41303 0 0\n56229 41263 0 0\n56342 41149 0 0\n56404 41001 0 0\n56404 40840 0 0\n56343 40691 0 0\n56229 40578 0 0\n56096 40522 0 0\n56043 40391 0 0\n55929 40278 0 0\n55781 40216 0 0\n55620 40216 0 0\n55471 40277 0 0\n55358 40391 0 0\n55296 40539 0 0\n55296 40700 0 0\n55357 40849 0 0\n55380 40871 0 0\n55380 42358 0 0\n55402 42469 0 0\n55465 42563 0 0\n56111 43210 0 0\n55507 43210 0 0\n55549 43109 0 0\n55549 42891 0 0\n55465 42689 0 0\n55311 42535 0 0\n55109 42451 0 0\n54891 42451 0 0\n54689 42535 0 0\n54535 42689 0 0\n54500 42773 0 0\n54465 42689 0 0\n54311 42535 0 0\n54109 42451 0 0\n53891 42451 0 0\n53689 42535 0 0\n53535 42689 0 0\n53500 42773 0 0\n53465 42689 0 0\n53311 42535 0 0\n53109 42451 0 0\n52891 42451 0 0\n52689 42535 0 0\n52535 42689 0 0\n52500 42773 0 0\n52465 42689 0 0\n52311 42535 0 0\n52109 42451 0 0\n51891 42451 0 0\n51689 42535 0 0\n51535 42689 0 0\n51500 42773 0 0\n51465 42689 0 0\n51311 42535 0 0\n51109 42451 0 0\n50891 42451 0 0\n50689 42535 0 0\n50535 42689 0 0\n50500 42773 0 0\n50465 42689 0 0\n50311 42535 0 0\n50109 42451 0 0\n49891 42451 0 0\n49689 42535 0 0\n49535 42689 0 0\n49500 42773 0 0\n49465 42689 0 0\n49350 42574 0 0\n49350 42404 0 0\n49881 41873 0 0\n49889 41881 0 0\n49980 41919 0 0\n50079 41919 0 0\n50419 41919 0 0\n50511 41881 0 0\n50565 41827 0 0\n50596 41840 0 0\n50708 41840 0 0\n50750 41798 0 0\n50750 41773 0 0\n50781 41761 0 0\n50850 41692 0 0\n50850 41798 0 0\n50892 41840 0 0\n51004 41840 0 0\n51066 41814 0 0\n51114 41766 0 0\n51140 41704 0 0\n51140 41636 0 0\n51140 41592 0 0\n51098 41550 0 0\n50889 41550 0 0\n50889 41501 0 0\n50889 41450 0 0\n51098 41450 0 0\n51140 41408 0 0\n51140 41364 0 0\n51140 41296 0 0\n51114 41234 0 0\n51066 41186 0 0\n51004 41160 0 0\n50892 41160 0 0\n50850 41202 0 0\n50850 41308 0 0\n50781 41239 0 0\n50750 41226 0 0\n50750 41202 0 0\n50708 41160 0 0\n50596 41160 0 0\n50565 41173 0 0\n50511 41119 0 0\n50420 41081 0 0\n50321 41081 0 0\n49981 41081 0 0\n49889 41119 0 0\n49858 41150 0 0\n49760 41150 0 0\n49626 41177 0 0\n49512 41253 0 0\n48753 42013 0 0\n48677 42126 0 0\n48650 42260 0 0\n48650 42574 0 0\n48535 42689 0 0\n48451 42891 0 0\n48451 43109 0 0\n48535 43311 0 0\n48675 43451 0 0\n48651 43451 0 0\n48559 43489 0 0\n48489 43559 0 0\n48451 43650 0 0\n48451 43749 0 0\n48451 44349 0 0\n48489 44441 0 0\n48559 44511 0 0\n48650 44549 0 0\n48749 44549 0 0\n49349 44549 0 0\n49441 44511 0 0\n49511 44441 0 0\n49549 44350 0 0\n49549 44325 0 0\n49689 44465 0 0\n49891 44549 0 0\n50109 44549 0 0\n50311 44465 0 0\n50465 44311 0 0\n50500 44226 0 0\n50535 44311 0 0\n50689 44465 0 0\n50710 44473 0 0\n50710 44810 0 0\n50689 44819 0 0\n50619 44889 0 0\n50581 44980 0 0\n50581 45079 0 0\n50581 45419 0 0\n50619 45511 0 0\n50673 45565 0 0\n50660 45596 0 0\n50660 45708 0 0\n50702 45750 0 0\n50900 45750 0 0\n50950 45750 0 0\n51050 45750 0 0\n51100 45750 0 0\n51298 45750 0 0\n51340 45708 0 0\n51340 45596 0 0\n51327 45565 0 0\n51381 45511 0 0\n51419 45420 0 0\n51419 45321 0 0\n51419 44981 0 0\n51381 44889 0 0\n51311 44819 0 0\n51290 44810 0 0\n51290 44473 0 0\n51311 44465 0 0\n51465 44311 0 0\n51500 44226 0 0\n51535 44311 0 0\n51689 44465 0 0\n51710 44473 0 0\n51710 44810 0 0\n51689 44819 0 0\n51619 44889 0 0\n51581 44980 0 0\n51581 45079 0 0\n51581 45419 0 0\n51619 45511 0 0\n51673 45565 0 0\n51660 45596 0 0\n51660 45708 0 0\n51702 45750 0 0\n51900 45750 0 0\n51950 45750 0 0\n52050 45750 0 0\n52100 45750 0 0\n52298 45750 0 0\n52340 45708 0 0\n52340 45596 0 0\n52327 45565 0 0\n52381 45511 0 0\n52389 45490 0 0\n54800 45490 0 0\n54911 45468 0 0\n55005 45405 0 0\n55301 45108 0 0\n55360 45250 0 0\n55489 45380 0 0\n55658 45450 0 0\n55841 45450 0 0\n55948 45405 0 0\n55980 45419 0 0\n56079 45419 0 0\n56419 45419 0 0\n56499 45385 0 0\n56580 45419 0 0\n56679 45419 0 0\n57019 45419 0 0\n57111 45381 0 0\n57181 45311 0 0\n57189 45290 0 0\n57310 45290 0 0\n57319 45311 0 0\n57389 45381 0 0\n57480 45419 0 0\n57579 45419 0 0\n57919 45419 0 0\n57999 45385 0 0\n58080 45419 0 0\n58179 45419 0 0\n58471 45419 0 0\n58309 45581 0 0\n58081 45581 0 0\n58000 45614 0 0\n57920 45581 0 0\n57821 45581 0 0\n57481 45581 0 0\n57389 45619 0 0\n57319 45689 0 0\n57310 45710 0 0\n57189 45710 0 0\n57181 45689 0 0\n57111 45619 0 0\n57020 45581 0 0\n56921 45581 0 0\n56581 45581 0 0\n56500 45614 0 0\n56420 45581 0 0\n56321 45581 0 0\n55981 45581 0 0\n55960 45589 0 0\n55842 45540 0 0\n55659 45540 0 0\n55490 45610 0 0\n55360 45739 0 0\n55290 45908 0 0\n55290 46091 0 0\n55360 46260 0 0\n55489 46390 0 0\n55658 46460 0 0\n55841 46460 0 0\n55960 46410 0 0\n55980 46419 0 0\n56079 46419 0 0\n56419 46419 0 0\n56499 46385 0 0\n56580 46419 0 0\n56679 46419 0 0\n57019 46419 0 0\n57111 46381 0 0\n57181 46311 0 0\n57189 46290 0 0\n57310 46290 0 0\n57319 46311 0 0\n57389 46381 0 0\n57480 46419 0 0\n57579 46419 0 0\n57919 46419 0 0\n57999 46385 0 0\n58080 46419 0 0\n58179 46419 0 0\n58519 46419 0 0\n58611 46381 0 0\n58681 46311 0 0\n58719 46220 0 0\n58719 46121 0 0\n58719 45991 0 0\n59015 45695 0 0\n59078 45601 0 0\n59100 45490 0 0\n59100 45001 0 0\n59152 44949 0 0\n59214 44801 0 0\n59214 44726 0 0\n59420 44521 0 0\n59420 44520 0 0\n59421 44518 0 0\n59544 44396 0 0\n60480 44396 0 0\n60480 44441 0 0\n60550 44610 0 0\n60679 44740 0 0\n60703 44750 1 0\n61987 42647 0 0\n61912 42698 0 0\n61830 42780 0 0\n61824 42786 0 0\n61788 42750 0 0\n61660 42750 0 0\n61610 42750 0 0\n61510 42750 0 0\n61510 42650 0 0\n61610 42650 0 0\n61660 42650 0 0\n61788 42650 0 0\n61830 42608 0 0\n61830 42590 0 0\n61930 42590 0 0\n61987 42647 1 0\n62623 41726 0 0\n62614 41748 0 0\n62614 41867 0 0\n62614 42014 0 0\n62404 42014 0 0\n62323 41933 0 0\n62229 41870 0 0\n62118 41848 0 0\n59758 41848 0 0\n59619 41709 0 0\n59619 41560 0 0\n59741 41560 0 0\n59910 41490 0 0\n60040 41361 0 0\n60110 41192 0 0\n60110 41009 0 0\n60040 40840 0 0\n59911 40710 0 0\n59742 40640 0 0\n59559 40640 0 0\n59439 40689 0 0\n59420 40681 0 0\n59321 40681 0 0\n58981 40681 0 0\n58889 40719 0 0\n58819 40789 0 0\n58781 40880 0 0\n58781 40979 0 0\n58781 41319 0 0\n58814 41399 0 0\n58810 41410 0 0\n58339 41410 0 0\n58335 41400 0 0\n58369 41320 0 0\n58369 41221 0 0\n58369 40881 0 0\n58331 40789 0 0\n58301 40759 0 0\n59020 40040 0 0\n59410 40040 0 0\n59419 40061 0 0\n59489 40131 0 0\n59580 40169 0 0\n59679 40169 0 0\n60019 40169 0 0\n60111 40131 0 0\n60152 40090 0 0\n60160 40090 0 0\n60169 40111 0 0\n60239 40181 0 0\n60330 40219 0 0\n60429 40219 0 0\n60769 40219 0 0\n60849 40185 0 0\n60930 40219 0 0\n61029 40219 0 0\n61369 40219 0 0\n61461 40181 0 0\n61526 40116 0 0\n61656 40246 0 0\n61656 40320 0 0\n61717 40469 0 0\n61831 40582 0 0\n61979 40644 0 0\n62062 40644 0 0\n62062 40652 0 0\n62084 40763 0 0\n62147 40857 0 0\n62623 41333 0 0\n62623 41726 1 0\n62810 44292 0 0\n62688 44292 0 0\n62688 44405 0 0\n62700 44449 0 0\n62660 44490 0 0\n62030 44490 0 0\n62030 44442 0 0\n61988 44400 0 0\n61860 44400 0 0\n61810 44400 0 0\n61710 44400 0 0\n61710 44300 0 0\n61810 44300 0 0\n61860 44300 0 0\n61988 44300 0 0\n62030 44258 0 0\n62030 44206 0 0\n62017 44177 0 0\n62326 44177 0 0\n62348 44186 0 0\n62467 44186 0 0\n62688 44186 0 0\n62688 44192 0 0\n62735 44192 0 0\n62786 44213 0 0\n62810 44213 0 0\n62810 44292 1 0\n64892 43937 0 0\n64877 43937 0 0\n64813 43924 0 0\n64813 43915 0 0\n64813 43837 0 0\n64892 43837 0 0\n64892 43860 0 0\n64892 43914 0 0\n64892 43916 0 0\n64892 43937 1 0\n65419 40341 0 0\n64619 41141 0 0\n64588 41110 0 0\n64400 41110 0 0\n64400 41288 0 0\n64436 41324 0 0\n64430 41330 0 0\n64331 41428 0 0\n64299 41379 0 0\n64298 41378 0 0\n64290 41370 0 0\n64290 41298 0 0\n64300 41288 0 0\n64300 41160 0 0\n64300 41110 0 0\n64300 41010 0 0\n64400 41010 0 0\n64450 41010 0 0\n64588 41010 0 0\n64630 40968 0 0\n64630 40926 0 0\n64628 40923 0 0\n64671 40881 0 0\n64709 40790 0 0\n64709 40691 0 0\n64709 40491 0 0\n64706 40484 0 0\n64740 40451 0 0\n64810 40282 0 0\n64810 40169 0 0\n64908 40210 0 0\n65091 40210 0 0\n65260 40140 0 0\n65390 40011 0 0\n65419 39940 0 0\n65419 40341 1 0\n65925 44523 0 0\n65827 44565 0 0\n65790 44601 0 0\n65790 44488 0 0\n65790 44300 0 0\n65612 44300 0 0\n65570 44342 0 0\n65570 44394 0 0\n65596 44456 0 0\n65644 44504 0 0\n65706 44530 0 0\n65748 44530 0 0\n65790 44488 0 0\n65790 44601 0 0\n65641 44750 0 0\n65550 44750 0 0\n65550 44680 0 0\n65549 44679 0 0\n65523 44546 0 0\n65447 44433 0 0\n65447 44432 0 0\n65096 44081 0 0\n65158 44031 0 0\n65180 43987 0 0\n65209 43987 0 0\n65209 43924 0 0\n65282 43997 0 0\n65283 43997 0 0\n65396 44073 0 0\n65530 44100 0 0\n65572 44100 0 0\n65570 44106 0 0\n65570 44158 0 0\n65612 44200 0 0\n65740 44200 0 0\n65790 44200 0 0\n65890 44200 0 0\n65890 44300 0 0\n65890 44350 0 0\n65890 44488 0 0\n65925 44523 1 0\n70450 44750 0 0\n68858 44750 0 0\n68675 44566 0 0\n68400 44451 0 0\n68102 44451 0 0\n67827 44565 0 0\n67641 44750 0 0\n66858 44750 0 0\n66727 44618 0 0\n66789 44593 0 0\n66902 44479 0 0\n66964 44331 0 0\n66964 44210 0 0\n67091 44210 0 0\n67260 44140 0 0\n67390 44011 0 0\n67460 43842 0 0\n67460 43659 0 0\n67390 43490 0 0\n67261 43360 0 0\n67092 43290 0 0\n66909 43290 0 0\n66789 43339 0 0\n66770 43331 0 0\n66671 43331 0 0\n66577 43331 0 0\n66582 43328 0 0\n68165 41746 0 0\n68165 41745 0 0\n68206 41683 0 0\n68227 41652 0 0\n68228 41651 0 0\n68249 41540 0 0\n68250 41540 0 0\n68250 40367 0 0\n68309 40343 0 0\n68422 40229 0 0\n68484 40081 0 0\n68484 39920 0 0\n68423 39771 0 0\n68324 39672 0 0\n68324 39560 0 0\n68263 39411 0 0\n68164 39312 0 0\n68164 39200 0 0\n68103 39051 0 0\n68004 38952 0 0\n68004 38840 0 0\n67943 38691 0 0\n67844 38592 0 0\n67844 38480 0 0\n67783 38331 0 0\n67669 38218 0 0\n67539 38163 0 0\n67493 38051 0 0\n67379 37938 0 0\n67231 37876 0 0\n67070 37876 0 0\n66921 37937 0 0\n66808 38051 0 0\n66746 38199 0 0\n66746 38360 0 0\n66807 38509 0 0\n66860 38561 0 0\n66860 41080 0 0\n65917 42023 0 0\n65073 42023 0 0\n65052 42014 0 0\n64933 42014 0 0\n64786 42014 0 0\n64786 41794 0 0\n65914 40666 0 0\n65977 40572 0 0\n65999 40461 0 0\n65999 37910 0 0\n66171 37910 0 0\n66263 37872 0 0\n66333 37802 0 0\n66371 37711 0 0\n66371 37676 0 0\n68629 37676 0 0\n68629 37710 0 0\n68667 37802 0 0\n68737 37872 0 0\n68828 37910 0 0\n68927 37910 0 0\n69753 37910 0 0\n69845 37872 0 0\n69915 37802 0 0\n69953 37711 0 0\n69953 37612 0 0\n69953 37062 0 0\n69953 35939 0 0\n69953 35840 0 0\n69953 35290 0 0\n69915 35198 0 0\n69845 35128 0 0\n69760 35092 0 0\n69760 34949 0 0\n69690 34780 0 0\n69561 34650 0 0\n69392 34580 0 0\n69209 34580 0 0\n69040 34650 0 0\n68910 34779 0 0\n68840 34948 0 0\n68840 35090 0 0\n68829 35090 0 0\n68737 35128 0 0\n68667 35198 0 0\n68629 35289 0 0\n68629 35388 0 0\n68629 35938 0 0\n68667 36030 0 0\n68737 36100 0 0\n68828 36138 0 0\n68927 36138 0 0\n69753 36138 0 0\n69845 36100 0 0\n69915 36030 0 0\n69953 35939 0 0\n69953 37062 0 0\n69915 36970 0 0\n69845 36900 0 0\n69754 36862 0 0\n69655 36862 0 0\n68829 36862 0 0\n68737 36900 0 0\n68667 36970 0 0\n68629 37061 0 0\n68629 37096 0 0\n66371 37096 0 0\n66371 37062 0 0\n66371 35939 0 0\n66371 35840 0 0\n66371 35290 0 0\n66360 35263 0 0\n66360 32292 0 0\n66360 32109 0 0\n66290 31940 0 0\n66161 31810 0 0\n65992 31740 0 0\n65934 31740 0 0\n65913 31718 0 0\n65942 31650 0 0\n65942 31352 0 0\n65828 31077 0 0\n65618 30866 0 0\n65343 30751 0 0\n65045 30751 0 0\n64770 30865 0 0\n64559 31075 0 0\n64444 31350 0 0\n64444 31648 0 0\n64558 31923 0 0\n64768 32134 0 0\n65043 32249 0 0\n65341 32249 0 0\n65421 32215 0 0\n65440 32234 0 0\n65440 32291 0 0\n65510 32460 0 0\n65639 32590 0 0\n65808 32660 0 0\n65991 32660 0 0\n66160 32590 0 0\n66290 32461 0 0\n66360 32292 0 0\n66360 35263 0 0\n66333 35198 0 0\n66263 35128 0 0\n66172 35090 0 0\n66170 35090 0 0\n66170 34949 0 0\n66100 34780 0 0\n65971 34650 0 0\n65802 34580 0 0\n65619 34580 0 0\n65450 34650 0 0\n65320 34779 0 0\n65250 34948 0 0\n65250 35090 0 0\n65247 35090 0 0\n65155 35128 0 0\n65085 35198 0 0\n65047 35289 0 0\n65047 35388 0 0\n65047 35938 0 0\n65085 36030 0 0\n65155 36100 0 0\n65246 36138 0 0\n65345 36138 0 0\n66171 36138 0 0\n66263 36100 0 0\n66333 36030 0 0\n66371 35939 0 0\n66371 37062 0 0\n66333 36970 0 0\n66263 36900 0 0\n66172 36862 0 0\n66073 36862 0 0\n65247 36862 0 0\n65155 36900 0 0\n65085 36970 0 0\n65047 37061 0 0\n65047 37096 0 0\n64766 37096 0 0\n64390 36720 0 0\n64390 34381 0 0\n64480 34419 0 0\n64579 34419 0 0\n64919 34419 0 0\n65011 34381 0 0\n65065 34327 0 0\n65096 34340 0 0\n65208 34340 0 0\n65250 34298 0 0\n65250 34273 0 0\n65281 34261 0 0\n65350 34192 0 0\n65350 34298 0 0\n65392 34340 0 0\n65504 34340 0 0\n65566 34314 0 0\n65614 34266 0 0\n65640 34204 0 0\n65640 34136 0 0\n65640 34092 0 0\n65598 34050 0 0\n65389 34050 0 0\n65389 34001 0 0\n65389 33950 0 0\n65598 33950 0 0\n65640 33908 0 0\n65640 33864 0 0\n65640 33796 0 0\n65614 33734 0 0\n65566 33686 0 0\n65504 33660 0 0\n65392 33660 0 0\n65350 33702 0 0\n65350 33808 0 0\n65281 33739 0 0\n65250 33726 0 0\n65250 33702 0 0\n65208 33660 0 0\n65096 33660 0 0\n65065 33673 0 0\n65011 33619 0 0\n64920 33581 0 0\n64821 33581 0 0\n64691 33581 0 0\n62595 31485 0 0\n62595 31352 0 0\n62481 31077 0 0\n62271 30866 0 0\n61996 30751 0 0\n61698 30751 0 0\n61423 30865 0 0\n61212 31075 0 0\n61097 31350 0 0\n61097 31648 0 0\n61211 31923 0 0\n61421 32134 0 0\n61696 32249 0 0\n61994 32249 0 0\n62269 32135 0 0\n62347 32057 0 0\n63500 33210 0 0\n60850 33210 0 0\n60739 33232 0 0\n60645 33295 0 0\n60644 33295 0 0\n60644 33296 0 0\n60358 33582 0 0\n60311 33535 0 0\n60109 33451 0 0\n59891 33451 0 0\n59689 33535 0 0\n59535 33689 0 0\n59500 33773 0 0\n59465 33689 0 0\n59311 33535 0 0\n59249 33509 0 0\n59249 31650 0 0\n59249 31352 0 0\n59135 31077 0 0\n58925 30866 0 0\n58650 30751 0 0\n58352 30751 0 0\n58077 30865 0 0\n57866 31075 0 0\n57809 31210 0 0\n57110 31210 0 0\n56333 30433 0 0\n56239 30370 0 0\n56128 30348 0 0\n48232 30348 0 0\n48121 30370 0 0\n48027 30433 0 0\n47333 31127 0 0\n47270 31221 0 0\n47248 31332 0 0\n47248 37038 0 0\n47270 37149 0 0\n47333 37243 0 0\n47676 37586 0 0\n47676 37660 0 0\n47737 37809 0 0\n47851 37922 0 0\n47999 37984 0 0\n48160 37984 0 0\n48309 37923 0 0\n48422 37809 0 0\n48484 37661 0 0\n48484 37544 0 0\n48560 37544 0 0\n48709 37483 0 0\n48822 37369 0 0\n48884 37221 0 0\n48884 37060 0 0\n48823 36911 0 0\n48709 36798 0 0\n48561 36736 0 0\n48486 36736 0 0\n48190 36440 0 0\n48190 31550 0 0\n48488 31252 0 0\n51098 31252 0 0\n51058 31350 0 0\n51058 31648 0 0\n51172 31923 0 0\n51382 32134 0 0\n51657 32249 0 0\n51955 32249 0 0\n52090 32193 0 0\n53162 33265 0 0\n53256 33328 0 0\n53367 33350 0 0\n57460 33350 0 0\n57571 33328 0 0\n57636 33284 0 0\n57720 33284 0 0\n57869 33223 0 0\n57982 33109 0 0\n58044 32961 0 0\n58044 32800 0 0\n57983 32651 0 0\n57869 32538 0 0\n57721 32476 0 0\n57560 32476 0 0\n57411 32537 0 0\n57298 32651 0 0\n57248 32770 0 0\n53487 32770 0 0\n52500 31783 0 0\n52556 31650 0 0\n52556 31352 0 0\n52447 31090 0 0\n54334 31090 0 0\n54460 31216 0 0\n54405 31350 0 0\n54405 31648 0 0\n54519 31923 0 0\n54729 32134 0 0\n55004 32249 0 0\n55302 32249 0 0\n55577 32135 0 0\n55788 31925 0 0\n55903 31650 0 0\n55903 31352 0 0\n55789 31077 0 0\n55640 30928 0 0\n56008 30928 0 0\n56785 31705 0 0\n56879 31768 0 0\n56990 31790 0 0\n57809 31790 0 0\n57865 31923 0 0\n58075 32134 0 0\n58350 32249 0 0\n58648 32249 0 0\n58923 32135 0 0\n59134 31925 0 0\n59249 31650 0 0\n59249 33509 0 0\n59109 33451 0 0\n58891 33451 0 0\n58689 33535 0 0\n58535 33689 0 0\n58500 33773 0 0\n58465 33689 0 0\n58311 33535 0 0\n58109 33451 0 0\n57891 33451 0 0\n57689 33535 0 0\n57535 33689 0 0\n57500 33773 0 0\n57465 33689 0 0\n57311 33535 0 0\n57109 33451 0 0\n56891 33451 0 0\n56689 33535 0 0\n56535 33689 0 0\n56500 33773 0 0\n56465 33689 0 0\n56311 33535 0 0\n56109 33451 0 0\n55891 33451 0 0\n55689 33535 0 0\n55535 33689 0 0\n55451 33891 0 0\n55451 34109 0 0\n55459 34130 0 0\n55295 34295 0 0\n55232 34389 0 0\n55210 34500 0 0\n55210 35180 0 0\n55232 35291 0 0\n55295 35385 0 0\n55518 35608 0 0\n55518 38115 0 0\n55491 38127 0 0\n55378 38241 0 0\n55316 38389 0 0\n55316 38550 0 0\n55377 38699 0 0\n55491 38812 0 0\n55639 38874 0 0\n55800 38874 0 0\n55930 38820 0 0\n56056 38946 0 0\n56056 39020 0 0\n56117 39169 0 0\n56231 39282 0 0\n56379 39344 0 0\n56540 39344 0 0\n56689 39283 0 0\n56802 39169 0 0\n56864 39021 0 0\n56864 38961 0 0\n56909 38943 0 0\n57022 38829 0 0\n57084 38681 0 0\n57084 38606 0 0\n59705 35985 0 0\n59768 35891 0 0\n59790 35780 0 0\n59790 35507 0 0\n59891 35549 0 0\n60109 35549 0 0\n60311 35465 0 0\n60465 35311 0 0\n60500 35226 0 0\n60535 35311 0 0\n60689 35465 0 0\n60891 35549 0 0\n60909 35549 0 0\n62062 36702 0 0\n62062 39832 0 0\n61825 39595 0 0\n61731 39532 0 0\n61620 39510 0 0\n61539 39510 0 0\n61531 39489 0 0\n61461 39419 0 0\n61370 39381 0 0\n61271 39381 0 0\n60931 39381 0 0\n60850 39414 0 0\n60770 39381 0 0\n60671 39381 0 0\n60331 39381 0 0\n60239 39419 0 0\n60192 39465 0 0\n60181 39439 0 0\n60127 39385 0 0\n60140 39354 0 0\n60140 39242 0 0\n60140 39058 0 0\n60140 38946 0 0\n60114 38884 0 0\n60066 38836 0 0\n60004 38810 0 0\n59936 38810 0 0\n59892 38810 0 0\n59850 38852 0 0\n59850 39100 0 0\n60098 39100 0 0\n60140 39058 0 0\n60140 39242 0 0\n60098 39200 0 0\n59900 39200 0 0\n59850 39200 0 0\n59750 39200 0 0\n59750 39100 0 0\n59750 38852 0 0\n59708 38810 0 0\n59664 38810 0 0\n59596 38810 0 0\n59534 38836 0 0\n59486 38884 0 0\n59460 38946 0 0\n59460 39058 0 0\n59502 39100 0 0\n59750 39100 0 0\n59750 39200 0 0\n59700 39200 0 0\n59502 39200 0 0\n59460 39242 0 0\n59460 39354 0 0\n59473 39385 0 0\n59419 39439 0 0\n59410 39460 0 0\n58900 39460 0 0\n58789 39482 0 0\n58695 39545 0 0\n57775 40464 0 0\n56849 39539 0 0\n56755 39476 0 0\n56644 39454 0 0\n53950 39454 0 0\n53950 38564 0 0\n53950 38442 0 0\n53908 38400 0 0\n53650 38400 0 0\n53650 38658 0 0\n53692 38700 0 0\n53746 38700 0 0\n53814 38700 0 0\n53876 38674 0 0\n53924 38626 0 0\n53950 38564 0 0\n53950 39454 0 0\n53550 39454 0 0\n53550 38658 0 0\n53550 38400 0 0\n53292 38400 0 0\n53250 38442 0 0\n53250 38560 0 0\n53142 38560 0 0\n53100 38602 0 0\n53100 38850 0 0\n53348 38850 0 0\n53390 38808 0 0\n53390 38764 0 0\n53390 38700 0 0\n53454 38700 0 0\n53508 38700 0 0\n53550 38658 0 0\n53550 39454 0 0\n53390 39454 0 0\n53390 39104 0 0\n53390 39036 0 0\n53390 38992 0 0\n53348 38950 0 0\n53100 38950 0 0\n53100 39198 0 0\n53142 39240 0 0\n53254 39240 0 0\n53316 39214 0 0\n53364 39166 0 0\n53390 39104 0 0\n53390 39454 0 0\n53000 39454 0 0\n53000 39198 0 0\n53000 39000 0 0\n53000 38950 0 0\n53000 38850 0 0\n53000 38800 0 0\n53000 38602 0 0\n52958 38560 0 0\n52846 38560 0 0\n52815 38573 0 0\n52761 38519 0 0\n52670 38481 0 0\n52571 38481 0 0\n52231 38481 0 0\n52210 38489 0 0\n52092 38440 0 0\n51909 38440 0 0\n51740 38510 0 0\n51610 38639 0 0\n51540 38808 0 0\n51540 38991 0 0\n51610 39160 0 0\n51739 39290 0 0\n51908 39360 0 0\n52091 39360 0 0\n52210 39310 0 0\n52230 39319 0 0\n52329 39319 0 0\n52669 39319 0 0\n52761 39281 0 0\n52815 39227 0 0\n52846 39240 0 0\n52958 39240 0 0\n53000 39198 0 0\n53000 39454 0 0\n49113 39454 0 0\n50417 38150 0 0\n52610 38150 0 0\n52801 38112 0 0\n52964 38004 0 0\n53072 37841 0 0\n53109 37653 0 0\n53171 37715 0 0\n53171 37879 0 0\n53209 37971 0 0\n53279 38041 0 0\n53300 38049 0 0\n53276 38074 0 0\n53250 38136 0 0\n53250 38258 0 0\n53292 38300 0 0\n53500 38300 0 0\n53550 38300 0 0\n53650 38300 0 0\n53700 38300 0 0\n53908 38300 0 0\n53950 38258 0 0\n53950 38136 0 0\n53924 38074 0 0\n53899 38049 0 0\n53921 38041 0 0\n53971 37991 0 0\n53971 38229 0 0\n54009 38321 0 0\n54079 38391 0 0\n54170 38429 0 0\n54269 38429 0 0\n54629 38429 0 0\n54656 38417 0 0\n54758 38460 0 0\n54941 38460 0 0\n55110 38390 0 0\n55240 38261 0 0\n55310 38092 0 0\n55310 37909 0 0\n55240 37740 0 0\n55111 37610 0 0\n54942 37540 0 0\n54759 37540 0 0\n54656 37582 0 0\n54630 37571 0 0\n54531 37571 0 0\n54171 37571 0 0\n54079 37609 0 0\n54029 37659 0 0\n54029 37421 0 0\n53991 37329 0 0\n53921 37259 0 0\n53830 37221 0 0\n53731 37221 0 0\n53665 37221 0 0\n53469 37024 0 0\n53469 36881 0 0\n53431 36789 0 0\n53361 36719 0 0\n53270 36681 0 0\n53171 36681 0 0\n52910 36681 0 0\n52910 36559 0 0\n52840 36390 0 0\n52711 36260 0 0\n52542 36190 0 0\n52359 36190 0 0\n52190 36260 0 0\n52060 36389 0 0\n51990 36558 0 0\n51990 36741 0 0\n52039 36860 0 0\n52031 36880 0 0\n52031 36979 0 0\n52031 37150 0 0\n51549 37150 0 0\n51549 35109 0 0\n51549 34891 0 0\n51465 34689 0 0\n51465 34061 0 0\n51453 33878 0 0\n51407 33766 0 0\n51336 33735 0 0\n51265 33806 0 0\n51265 33664 0 0\n51234 33593 0 0\n51061 33535 0 0\n50878 33547 0 0\n50766 33593 0 0\n50735 33664 0 0\n51000 33929 0 0\n51265 33664 0 0\n51265 33806 0 0\n51071 34000 0 0\n51336 34265 0 0\n51407 34234 0 0\n51465 34061 0 0\n51465 34689 0 0\n51311 34535 0 0\n51114 34453 0 0\n51122 34453 0 0\n51234 34407 0 0\n51265 34336 0 0\n51000 34071 0 0\n50929 34142 0 0\n50929 34000 0 0\n50664 33735 0 0\n50593 33766 0 0\n50535 33939 0 0\n50547 34122 0 0\n50593 34234 0 0\n50664 34265 0 0\n50929 34000 0 0\n50929 34142 0 0\n50735 34336 0 0\n50766 34407 0 0\n50897 34451 0 0\n50891 34451 0 0\n50689 34535 0 0\n50535 34689 0 0\n50500 34773 0 0\n50465 34689 0 0\n50465 34061 0 0\n50453 33878 0 0\n50407 33766 0 0\n50336 33735 0 0\n50265 33806 0 0\n50265 33664 0 0\n50234 33593 0 0\n50061 33535 0 0\n49878 33547 0 0\n49766 33593 0 0\n49735 33664 0 0\n50000 33929 0 0\n50265 33664 0 0\n50265 33806 0 0\n50071 34000 0 0\n50336 34265 0 0\n50407 34234 0 0\n50465 34061 0 0\n50465 34689 0 0\n50311 34535 0 0\n50114 34453 0 0\n50122 34453 0 0\n50234 34407 0 0\n50265 34336 0 0\n50000 34071 0 0\n49929 34142 0 0\n49929 34000 0 0\n49664 33735 0 0\n49593 33766 0 0\n49535 33939 0 0\n49547 34122 0 0\n49593 34234 0 0\n49664 34265 0 0\n49929 34000 0 0\n49929 34142 0 0\n49735 34336 0 0\n49766 34407 0 0\n49897 34451 0 0\n49891 34451 0 0\n49689 34535 0 0\n49549 34675 0 0\n49549 34651 0 0\n49511 34559 0 0\n49465 34513 0 0\n49465 34061 0 0\n49453 33878 0 0\n49407 33766 0 0\n49336 33735 0 0\n49265 33806 0 0\n49265 33664 0 0\n49234 33593 0 0\n49061 33535 0 0\n48878 33547 0 0\n48766 33593 0 0\n48735 33664 0 0\n49000 33929 0 0\n49265 33664 0 0\n49265 33806 0 0\n49071 34000 0 0\n49336 34265 0 0\n49407 34234 0 0\n49465 34061 0 0\n49465 34513 0 0\n49441 34489 0 0\n49350 34451 0 0\n49251 34451 0 0\n49126 34451 0 0\n49234 34407 0 0\n49265 34336 0 0\n49000 34071 0 0\n48929 34142 0 0\n48929 34000 0 0\n48664 33735 0 0\n48593 33766 0 0\n48535 33939 0 0\n48547 34122 0 0\n48593 34234 0 0\n48664 34265 0 0\n48929 34000 0 0\n48929 34142 0 0\n48735 34336 0 0\n48766 34407 0 0\n48897 34451 0 0\n48651 34451 0 0\n48559 34489 0 0\n48489 34559 0 0\n48451 34650 0 0\n48451 34749 0 0\n48451 35349 0 0\n48489 35441 0 0\n48559 35511 0 0\n48650 35549 0 0\n48749 35549 0 0\n49349 35549 0 0\n49441 35511 0 0\n49511 35441 0 0\n49549 35350 0 0\n49549 35325 0 0\n49689 35465 0 0\n49891 35549 0 0\n50109 35549 0 0\n50311 35465 0 0\n50465 35311 0 0\n50500 35226 0 0\n50535 35311 0 0\n50689 35465 0 0\n50891 35549 0 0\n51109 35549 0 0\n51311 35465 0 0\n51465 35311 0 0\n51549 35109 0 0\n51549 37150 0 0\n50210 37150 0 0\n50018 37188 0 0\n49953 37231 0 0\n49856 37296 0 0\n49854 37298 0 0\n48374 38778 0 0\n48374 38416 0 0\n48336 38324 0 0\n48266 38254 0 0\n48175 38216 0 0\n48076 38216 0 0\n47506 38216 0 0\n47503 38216 0 0\n47502 38216 0 0\n47403 38216 0 0\n47153 38216 0 0\n47061 38254 0 0\n46991 38324 0 0\n46978 38353 0 0\n46784 38353 0 0\n46782 38352 0 0\n46557 38352 0 0\n46554 38353 0 0\n46550 38353 0 0\n46550 21550 0 0\n70450 21550 0 0\n70450 44750 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660000 0 \"\"\nZLayer 20\nZAux 1822 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 53880 25026 0\nZCorner 53881 24994 0\nZCorner 53882 24962 0\nZCorner 53883 24929 0\nZCorner 53884 24897 0\nZCorner 53888 24888 0\nZCorner 53892 24880 0\nZCorner 53896 24871 0\nZCorner 53900 24862 0\nZCorner 53902 24858 0\nZCorner 53905 24854 0\nZCorner 53908 24850 0\nZCorner 53911 24846 0\nZCorner 53575 24846 0\nZCorner 53239 24846 0\nZCorner 52904 24846 0\nZCorner 52568 24846 0\nZCorner 52511 24915 0\nZCorner 52470 24957 0\nZCorner 52443 24971 0\nZCorner 52431 24956 0\nZCorner 51693 24956 0\nZCorner 50955 24956 0\nZCorner 50217 24956 0\nZCorner 49479 24956 0\nZCorner 49476 24977 0\nZCorner 49454 24953 0\nZCorner 49414 24885 0\nZCorner 49354 24772 0\nZCorner 50503 24772 0\nZCorner 51652 24772 0\nZCorner 52801 24772 0\nZCorner 53950 24772 0\nZCorner 54025 24660 0\nZCorner 54102 24581 0\nZCorner 54182 24536 0\nZCorner 54263 24522 0\nZCorner 54587 24523 0\nZCorner 54911 24524 0\nZCorner 55235 24525 0\nZCorner 55559 24526 0\nZCorner 55573 24531 0\nZCorner 55587 24536 0\nZCorner 55600 24541 0\nZCorner 55614 24546 0\nZCorner 55619 24552 0\nZCorner 55624 24558 0\nZCorner 55629 24563 0\nZCorner 55634 24569 0\nZCorner 55638 24575 0\nZCorner 55641 24581 0\nZCorner 55645 24587 0\nZCorner 55649 24593 0\nZCorner 55651 24601 0\nZCorner 55653 24610 0\nZCorner 55655 24619 0\nZCorner 55657 24628 0\nZCorner 55667 24624 0\nZCorner 55677 24620 0\nZCorner 55686 24616 0\nZCorner 55696 24612 0\nZCorner 55746 24592 0\nZCorner 55796 24571 0\nZCorner 55846 24551 0\nZCorner 55895 24530 0\nZCorner 55983 24522 0\nZCorner 56071 24514 0\nZCorner 56159 24507 0\nZCorner 56247 24499 0\nZCorner 56180 24449 0\nZCorner 56112 24399 0\nZCorner 56045 24349 0\nZCorner 55977 24300 0\nZCorner 56010 24244 0\nZCorner 56042 24188 0\nZCorner 56074 24133 0\nZCorner 56106 24077 0\nZCorner 56212 24129 0\nZCorner 56317 24180 0\nZCorner 56423 24232 0\nZCorner 56528 24284 0\nZCorner 56527 24285 0\nZCorner 56526 24286 0\nZCorner 56525 24287 0\nZCorner 56524 24288 0\nZCorner 56526 24287 0\nZCorner 56528 24286 0\nZCorner 56530 24285 0\nZCorner 56532 24284 0\nZCorner 56567 24237 0\nZCorner 56602 24190 0\nZCorner 56637 24143 0\nZCorner 56672 24096 0\nZCorner 56598 24007 0\nZCorner 56524 23917 0\nZCorner 56450 23827 0\nZCorner 56376 23737 0\nZCorner 56422 23692 0\nZCorner 56467 23647 0\nZCorner 56513 23602 0\nZCorner 56559 23557 0\nZCorner 56649 23632 0\nZCorner 56739 23706 0\nZCorner 56829 23780 0\nZCorner 56918 23854 0\nZCorner 56964 23819 0\nZCorner 57010 23784 0\nZCorner 57056 23749 0\nZCorner 57102 23714 0\nZCorner 57052 23609 0\nZCorner 57003 23505 0\nZCorner 56953 23400 0\nZCorner 56903 23296 0\nZCorner 56957 23262 0\nZCorner 57010 23227 0\nZCorner 57064 23193 0\nZCorner 57118 23159 0\nZCorner 57188 23252 0\nZCorner 57258 23345 0\nZCorner 57328 23437 0\nZCorner 57399 23530 0\nZCorner 57451 23508 0\nZCorner 57504 23485 0\nZCorner 57557 23463 0\nZCorner 57610 23440 0\nZCorner 57585 23326 0\nZCorner 57561 23212 0\nZCorner 57537 23098 0\nZCorner 57512 22983 0\nZCorner 57575 22964 0\nZCorner 57637 22944 0\nZCorner 57700 22925 0\nZCorner 57762 22905 0\nZCorner 57807 23013 0\nZCorner 57852 23120 0\nZCorner 57897 23227 0\nZCorner 57942 23335 0\nZCorner 57999 23325 0\nZCorner 58055 23315 0\nZCorner 58112 23305 0\nZCorner 58168 23296 0\nZCorner 58171 23179 0\nZCorner 58174 23061 0\nZCorner 58177 22944 0\nZCorner 58180 22827 0\nZCorner 58246 22823 0\nZCorner 58313 22819 0\nZCorner 58379 22815 0\nZCorner 58445 22811 0\nZCorner 58463 22928 0\nZCorner 58481 23044 0\nZCorner 58498 23160 0\nZCorner 58516 23276 0\nZCorner 58573 23278 0\nZCorner 58631 23280 0\nZCorner 58689 23282 0\nZCorner 58746 23284 0\nZCorner 58777 23177 0\nZCorner 58807 23069 0\nZCorner 58837 22962 0\nZCorner 58878 22839 0\nZCorner 58972 22853 0\nZCorner 59125 22882 0\nZCorner 59115 22999 0\nZCorner 59105 23116 0\nZCorner 59096 23233 0\nZCorner 59086 23350 0\nZCorner 59141 23367 0\nZCorner 59195 23383 0\nZCorner 59250 23400 0\nZCorner 59305 23417 0\nZCorner 59306 23418 0\nZCorner 59306 23419 0\nZCorner 59307 23420 0\nZCorner 59308 23421 0\nZCorner 59308 23420 0\nZCorner 59308 23419 0\nZCorner 59308 23418 0\nZCorner 59308 23417 0\nZCorner 59365 23315 0\nZCorner 59422 23214 0\nZCorner 59478 23112 0\nZCorner 59535 23010 0\nZCorner 59595 23037 0\nZCorner 59654 23063 0\nZCorner 59714 23090 0\nZCorner 59773 23116 0\nZCorner 59735 23227 0\nZCorner 59697 23338 0\nZCorner 59659 23450 0\nZCorner 59621 23561 0\nZCorner 59671 23590 0\nZCorner 59720 23620 0\nZCorner 59770 23649 0\nZCorner 59820 23678 0\nZCorner 59899 23594 0\nZCorner 59978 23510 0\nZCorner 60057 23426 0\nZCorner 60136 23342 0\nZCorner 60188 23381 0\nZCorner 60240 23420 0\nZCorner 60292 23460 0\nZCorner 60343 23499 0\nZCorner 60281 23597 0\nZCorner 60218 23696 0\nZCorner 60156 23794 0\nZCorner 60093 23893 0\nZCorner 60133 23934 0\nZCorner 60174 23975 0\nZCorner 60214 24016 0\nZCorner 60254 24057 0\nZCorner 60353 23994 0\nZCorner 60453 23930 0\nZCorner 60552 23867 0\nZCorner 60652 23803 0\nZCorner 60692 23853 0\nZCorner 60732 23903 0\nZCorner 60772 23953 0\nZCorner 60812 24003 0\nZCorner 60726 24084 0\nZCorner 60640 24165 0\nZCorner 60554 24246 0\nZCorner 60468 24327 0\nZCorner 60499 24376 0\nZCorner 60529 24426 0\nZCorner 60559 24476 0\nZCorner 60589 24526 0\nZCorner 60589 24529 0\nZCorner 60589 24532 0\nZCorner 60589 24535 0\nZCorner 60589 24538 0\nZCorner 60590 24538 0\nZCorner 60591 24538 0\nZCorner 60592 24538 0\nZCorner 60593 24538 0\nZCorner 60592 24535 0\nZCorner 60591 24532 0\nZCorner 60590 24529 0\nZCorner 60589 24526 0\nZCorner 60699 24488 0\nZCorner 60808 24450 0\nZCorner 60917 24412 0\nZCorner 61039 24379 0\nZCorner 61062 24431 0\nZCorner 61097 24514 0\nZCorner 61418 24495 0\nZCorner 61666 24497 0\nZCorner 61841 24519 0\nZCorner 61945 24561 0\nZCorner 61962 24569 0\nZCorner 61980 24577 0\nZCorner 61997 24584 0\nZCorner 62015 24592 0\nZCorner 62016 24564 0\nZCorner 62017 24536 0\nZCorner 62018 24507 0\nZCorner 62019 24479 0\nZCorner 62020 24466 0\nZCorner 62021 24454 0\nZCorner 62022 24441 0\nZCorner 62023 24428 0\nZCorner 62026 24416 0\nZCorner 62028 24405 0\nZCorner 62031 24393 0\nZCorner 62034 24381 0\nZCorner 62039 24373 0\nZCorner 62044 24364 0\nZCorner 62049 24355 0\nZCorner 62054 24346 0\nZCorner 62064 24337 0\nZCorner 62073 24329 0\nZCorner 62083 24320 0\nZCorner 62093 24311 0\nZCorner 62099 24308 0\nZCorner 62105 24305 0\nZCorner 62110 24302 0\nZCorner 62116 24299 0\nZCorner 62120 24296 0\nZCorner 62124 24294 0\nZCorner 62128 24291 0\nZCorner 62132 24288 0\nZCorner 62199 24278 0\nZCorner 62366 24274 0\nZCorner 62633 24276 0\nZCorner 62999 24284 0\nZCorner 63047 24298 0\nZCorner 63082 24356 0\nZCorner 63102 24458 0\nZCorner 63108 24604 0\nZCorner 63108 24609 0\nZCorner 63108 24614 0\nZCorner 63108 24619 0\nZCorner 63108 24623 0\nZCorner 63121 24629 0\nZCorner 63134 24635 0\nZCorner 63146 24641 0\nZCorner 63159 24647 0\nZCorner 63167 24655 0\nZCorner 63175 24663 0\nZCorner 63183 24670 0\nZCorner 63190 24678 0\nZCorner 63199 24702 0\nZCorner 63208 24725 0\nZCorner 63217 24748 0\nZCorner 63225 24772 0\nZCorner 64322 24772 0\nZCorner 65418 24772 0\nZCorner 66515 24772 0\nZCorner 67611 24772 0\nZCorner 67554 24885 0\nZCorner 67515 24953 0\nZCorner 67495 24977 0\nZCorner 67494 24955 0\nZCorner 67421 24967 0\nZCorner 67348 24974 0\nZCorner 67276 24976 0\nZCorner 67205 24975 0\nZCorner 66500 24975 0\nZCorner 65794 24975 0\nZCorner 65088 24975 0\nZCorner 64382 24975 0\nZCorner 64356 24947 0\nZCorner 64331 24918 0\nZCorner 64306 24890 0\nZCorner 64280 24862 0\nZCorner 64020 24862 0\nZCorner 63759 24862 0\nZCorner 63498 24862 0\nZCorner 63237 24862 0\nZCorner 63238 24888 0\nZCorner 63239 24914 0\nZCorner 63240 24941 0\nZCorner 63241 24967 0\nZCorner 63238 24982 0\nZCorner 63235 24997 0\nZCorner 63233 25011 0\nZCorner 63230 25026 0\nZCorner 64353 25026 0\nZCorner 65477 25026 0\nZCorner 66601 25026 0\nZCorner 67725 25026 0\nZCorner 67756 25022 0\nZCorner 67732 25070 0\nZCorner 67653 25170 0\nZCorner 67522 25323 0\nZCorner 67516 25341 0\nZCorner 67510 25360 0\nZCorner 67504 25378 0\nZCorner 67498 25397 0\nZCorner 66476 25398 0\nZCorner 65454 25399 0\nZCorner 64432 25400 0\nZCorner 63409 25401 0\nZCorner 63333 25400 0\nZCorner 63257 25399 0\nZCorner 63181 25398 0\nZCorner 63105 25397 0\nZCorner 63105 25399 0\nZCorner 63105 25401 0\nZCorner 63105 25403 0\nZCorner 63105 25405 0\nZCorner 63105 25447 0\nZCorner 63105 25490 0\nZCorner 63105 25533 0\nZCorner 63105 25576 0\nZCorner 64187 25576 0\nZCorner 65270 25576 0\nZCorner 66353 25576 0\nZCorner 67436 25576 0\nZCorner 67372 25652 0\nZCorner 67309 25727 0\nZCorner 67245 25802 0\nZCorner 67182 25877 0\nZCorner 67175 25949 0\nZCorner 67161 26012 0\nZCorner 67140 26068 0\nZCorner 67111 26115 0\nZCorner 67090 26139 0\nZCorner 67067 26157 0\nZCorner 67042 26170 0\nZCorner 67014 26178 0\nZCorner 66981 26180 0\nZCorner 66948 26182 0\nZCorner 66914 26184 0\nZCorner 66881 26185 0\nZCorner 66873 26185 0\nZCorner 66865 26184 0\nZCorner 66858 26183 0\nZCorner 66850 26182 0\nZCorner 66837 26178 0\nZCorner 66824 26174 0\nZCorner 66812 26170 0\nZCorner 66799 26166 0\nZCorner 66791 26160 0\nZCorner 66784 26154 0\nZCorner 66776 26148 0\nZCorner 66768 26143 0\nZCorner 66761 26137 0\nZCorner 66754 26131 0\nZCorner 66747 26125 0\nZCorner 66741 26119 0\nZCorner 66732 26114 0\nZCorner 66723 26109 0\nZCorner 66714 26105 0\nZCorner 66705 26100 0\nZCorner 66692 26095 0\nZCorner 66678 26090 0\nZCorner 66664 26085 0\nZCorner 66651 26080 0\nZCorner 66627 26080 0\nZCorner 66604 26080 0\nZCorner 66580 26080 0\nZCorner 66557 26080 0\nZCorner 66548 26081 0\nZCorner 66539 26082 0\nZCorner 66531 26083 0\nZCorner 66522 26084 0\nZCorner 66508 26088 0\nZCorner 66495 26092 0\nZCorner 66481 26096 0\nZCorner 66467 26100 0\nZCorner 66455 26109 0\nZCorner 66442 26119 0\nZCorner 66429 26129 0\nZCorner 66416 26139 0\nZCorner 66373 26195 0\nZCorner 66329 26252 0\nZCorner 66285 26309 0\nZCorner 66241 26365 0\nZCorner 66222 26384 0\nZCorner 66193 26400 0\nZCorner 66156 26412 0\nZCorner 66108 26420 0\nZCorner 66103 26419 0\nZCorner 66098 26418 0\nZCorner 66093 26417 0\nZCorner 66088 26416 0\nZCorner 66087 26416 0\nZCorner 66086 26416 0\nZCorner 66085 26416 0\nZCorner 66084 26416 0\nZCorner 66073 26413 0\nZCorner 66061 26410 0\nZCorner 66049 26407 0\nZCorner 66038 26404 0\nZCorner 66024 26395 0\nZCorner 66010 26385 0\nZCorner 65997 26375 0\nZCorner 65983 26365 0\nZCorner 65968 26351 0\nZCorner 65954 26336 0\nZCorner 65939 26321 0\nZCorner 65924 26307 0\nZCorner 65912 26292 0\nZCorner 65899 26277 0\nZCorner 65886 26263 0\nZCorner 65874 26248 0\nZCorner 65860 26234 0\nZCorner 65846 26221 0\nZCorner 65833 26207 0\nZCorner 65819 26193 0\nZCorner 65816 26192 0\nZCorner 65813 26191 0\nZCorner 65810 26190 0\nZCorner 65807 26189 0\nZCorner 65792 26180 0\nZCorner 65776 26170 0\nZCorner 65760 26160 0\nZCorner 65745 26150 0\nZCorner 65738 26150 0\nZCorner 65731 26150 0\nZCorner 65724 26150 0\nZCorner 65717 26150 0\nZCorner 65705 26147 0\nZCorner 65692 26144 0\nZCorner 65679 26142 0\nZCorner 65667 26139 0\nZCorner 65653 26141 0\nZCorner 65639 26143 0\nZCorner 65626 26145 0\nZCorner 65612 26146 0\nZCorner 65609 26146 0\nZCorner 65606 26146 0\nZCorner 65603 26146 0\nZCorner 65600 26146 0\nZCorner 65577 26151 0\nZCorner 65553 26156 0\nZCorner 65530 26161 0\nZCorner 65507 26166 0\nZCorner 65493 26174 0\nZCorner 65479 26182 0\nZCorner 65465 26189 0\nZCorner 65452 26197 0\nZCorner 65429 26220 0\nZCorner 65407 26242 0\nZCorner 65384 26265 0\nZCorner 65362 26287 0\nZCorner 65304 26395 0\nZCorner 65254 26475 0\nZCorner 65212 26526 0\nZCorner 65178 26549 0\nZCorner 65135 26550 0\nZCorner 65092 26551 0\nZCorner 65049 26552 0\nZCorner 65006 26553 0\nZCorner 65000 26550 0\nZCorner 64993 26547 0\nZCorner 64986 26544 0\nZCorner 64979 26541 0\nZCorner 64968 26535 0\nZCorner 64958 26528 0\nZCorner 64947 26521 0\nZCorner 64936 26514 0\nZCorner 64926 26501 0\nZCorner 64917 26489 0\nZCorner 64907 26476 0\nZCorner 64897 26463 0\nZCorner 64884 26444 0\nZCorner 64872 26424 0\nZCorner 64859 26405 0\nZCorner 64846 26385 0\nZCorner 64832 26366 0\nZCorner 64817 26346 0\nZCorner 64802 26327 0\nZCorner 64788 26307 0\nZCorner 64774 26292 0\nZCorner 64760 26276 0\nZCorner 64747 26260 0\nZCorner 64733 26245 0\nZCorner 64716 26234 0\nZCorner 64700 26223 0\nZCorner 64683 26212 0\nZCorner 64667 26202 0\nZCorner 64665 26200 0\nZCorner 64663 26198 0\nZCorner 64661 26196 0\nZCorner 64659 26194 0\nZCorner 64640 26188 0\nZCorner 64622 26182 0\nZCorner 64603 26176 0\nZCorner 64585 26170 0\nZCorner 64567 26168 0\nZCorner 64550 26165 0\nZCorner 64532 26162 0\nZCorner 64514 26159 0\nZCorner 64512 26158 0\nZCorner 64509 26157 0\nZCorner 64506 26156 0\nZCorner 64503 26155 0\nZCorner 64496 26155 0\nZCorner 64489 26155 0\nZCorner 64482 26155 0\nZCorner 64475 26155 0\nZCorner 64450 26153 0\nZCorner 64425 26151 0\nZCorner 64399 26149 0\nZCorner 64374 26147 0\nZCorner 64341 26148 0\nZCorner 64307 26149 0\nZCorner 64274 26150 0\nZCorner 64241 26151 0\nZCorner 64133 26182 0\nZCorner 64048 26227 0\nZCorner 63988 26286 0\nZCorner 63952 26358 0\nZCorner 63738 26358 0\nZCorner 63524 26358 0\nZCorner 63311 26358 0\nZCorner 63097 26358 0\nZCorner 63097 26370 0\nZCorner 63097 26381 0\nZCorner 63097 26393 0\nZCorner 63097 26405 0\nZCorner 63097 26407 0\nZCorner 63097 26409 0\nZCorner 63097 26411 0\nZCorner 63097 26413 0\nZCorner 63287 26413 0\nZCorner 63477 26413 0\nZCorner 63668 26413 0\nZCorner 63858 26413 0\nZCorner 63890 26405 0\nZCorner 63888 26442 0\nZCorner 63851 26522 0\nZCorner 63780 26647 0\nZCorner 63600 26647 0\nZCorner 63421 26647 0\nZCorner 63241 26647 0\nZCorner 63061 26647 0\nZCorner 62985 26755 0\nZCorner 62900 26838 0\nZCorner 62809 26897 0\nZCorner 62710 26932 0\nZCorner 62684 26941 0\nZCorner 62623 26949 0\nZCorner 62527 26955 0\nZCorner 62398 26959 0\nZCorner 62294 26957 0\nZCorner 62191 26955 0\nZCorner 62087 26953 0\nZCorner 61984 26951 0\nZCorner 61984 26924 0\nZCorner 61984 26897 0\nZCorner 61984 26869 0\nZCorner 61984 26842 0\nZCorner 61966 26851 0\nZCorner 61949 26860 0\nZCorner 61931 26868 0\nZCorner 61913 26877 0\nZCorner 61857 26900 0\nZCorner 61789 26920 0\nZCorner 61710 26938 0\nZCorner 61621 26951 0\nZCorner 61540 26954 0\nZCorner 61458 26957 0\nZCorner 61377 26960 0\nZCorner 61296 26963 0\nZCorner 61242 26956 0\nZCorner 61187 26950 0\nZCorner 61132 26943 0\nZCorner 61078 26936 0\nZCorner 60958 26885 0\nZCorner 60866 26856 0\nZCorner 60804 26848 0\nZCorner 60769 26862 0\nZCorner 60826 26903 0\nZCorner 60883 26944 0\nZCorner 60939 26985 0\nZCorner 60996 27026 0\nZCorner 60964 27081 0\nZCorner 60931 27137 0\nZCorner 60899 27192 0\nZCorner 60867 27248 0\nZCorner 60760 27197 0\nZCorner 60654 27147 0\nZCorner 60548 27096 0\nZCorner 60441 27045 0\nZCorner 60406 27092 0\nZCorner 60371 27139 0\nZCorner 60336 27186 0\nZCorner 60301 27232 0\nZCorner 60375 27323 0\nZCorner 60449 27414 0\nZCorner 60523 27505 0\nZCorner 60597 27596 0\nZCorner 60551 27640 0\nZCorner 60506 27685 0\nZCorner 60460 27730 0\nZCorner 60414 27775 0\nZCorner 60323 27700 0\nZCorner 60232 27625 0\nZCorner 60141 27550 0\nZCorner 60050 27475 0\nZCorner 60006 27511 0\nZCorner 59961 27547 0\nZCorner 59916 27583 0\nZCorner 59871 27619 0\nZCorner 59922 27724 0\nZCorner 59972 27830 0\nZCorner 60023 27935 0\nZCorner 60074 28041 0\nZCorner 60017 28074 0\nZCorner 59961 28107 0\nZCorner 59904 28140 0\nZCorner 59847 28174 0\nZCorner 59781 28082 0\nZCorner 59715 27990 0\nZCorner 59648 27898 0\nZCorner 59582 27806 0\nZCorner 59580 27805 0\nZCorner 59578 27803 0\nZCorner 59576 27801 0\nZCorner 59574 27799 0\nZCorner 59521 27822 0\nZCorner 59469 27846 0\nZCorner 59416 27869 0\nZCorner 59363 27892 0\nZCorner 59387 28007 0\nZCorner 59410 28121 0\nZCorner 59434 28235 0\nZCorner 59457 28349 0\nZCorner 59394 28369 0\nZCorner 59332 28388 0\nZCorner 59270 28408 0\nZCorner 59207 28427 0\nZCorner 59164 28320 0\nZCorner 59121 28213 0\nZCorner 59078 28105 0\nZCorner 59035 27998 0\nZCorner 58978 28008 0\nZCorner 58920 28019 0\nZCorner 58862 28030 0\nZCorner 58805 28041 0\nZCorner 58801 28157 0\nZCorner 58797 28273 0\nZCorner 58793 28389 0\nZCorner 58789 28506 0\nZCorner 58723 28509 0\nZCorner 58656 28513 0\nZCorner 58590 28517 0\nZCorner 58524 28521 0\nZCorner 58507 28405 0\nZCorner 58490 28289 0\nZCorner 58474 28172 0\nZCorner 58457 28056 0\nZCorner 58400 28053 0\nZCorner 58342 28050 0\nZCorner 58284 28048 0\nZCorner 58227 28045 0\nZCorner 58195 28157 0\nZCorner 58162 28269 0\nZCorner 58130 28382 0\nZCorner 58098 28494 0\nZCorner 58034 28483 0\nZCorner 57969 28472 0\nZCorner 57905 28461 0\nZCorner 57840 28451 0\nZCorner 57851 28334 0\nZCorner 57862 28216 0\nZCorner 57872 28099 0\nZCorner 57883 27982 0\nZCorner 57828 27965 0\nZCorner 57774 27947 0\nZCorner 57719 27929 0\nZCorner 57664 27912 0\nZCorner 57608 28012 0\nZCorner 57551 28113 0\nZCorner 57494 28214 0\nZCorner 57438 28314 0\nZCorner 57437 28322 0\nZCorner 57416 28317 0\nZCorner 57374 28299 0\nZCorner 57309 28267 0\nZCorner 57279 28257 0\nZCorner 57248 28246 0\nZCorner 57218 28235 0\nZCorner 57188 28224 0\nZCorner 57209 28159 0\nZCorner 57243 28062 0\nZCorner 57288 27933 0\nZCorner 57344 27771 0\nZCorner 57295 27742 0\nZCorner 57247 27713 0\nZCorner 57198 27684 0\nZCorner 57149 27654 0\nZCorner 57070 27736 0\nZCorner 56991 27818 0\nZCorner 56912 27900 0\nZCorner 56833 27982 0\nZCorner 56793 27962 0\nZCorner 56745 27930 0\nZCorner 56688 27887 0\nZCorner 56622 27834 0\nZCorner 56685 27736 0\nZCorner 56749 27639 0\nZCorner 56812 27541 0\nZCorner 56876 27443 0\nZCorner 56878 27444 0\nZCorner 56880 27445 0\nZCorner 56882 27446 0\nZCorner 56884 27447 0\nZCorner 56883 27446 0\nZCorner 56882 27445 0\nZCorner 56880 27444 0\nZCorner 56879 27443 0\nZCorner 56837 27400 0\nZCorner 56794 27358 0\nZCorner 56751 27315 0\nZCorner 56708 27272 0\nZCorner 56610 27337 0\nZCorner 56513 27402 0\nZCorner 56415 27468 0\nZCorner 56317 27533 0\nZCorner 56294 27503 0\nZCorner 56260 27459 0\nZCorner 56215 27399 0\nZCorner 56161 27322 0\nZCorner 56245 27244 0\nZCorner 56329 27166 0\nZCorner 56413 27088 0\nZCorner 56497 27010 0\nZCorner 56487 26991 0\nZCorner 56477 26973 0\nZCorner 56468 26954 0\nZCorner 56458 26936 0\nZCorner 56326 26939 0\nZCorner 56194 26942 0\nZCorner 56063 26945 0\nZCorner 55931 26947 0\nZCorner 55905 26944 0\nZCorner 55880 26940 0\nZCorner 55855 26936 0\nZCorner 55829 26932 0\nZCorner 55819 26926 0\nZCorner 55810 26920 0\nZCorner 55800 26914 0\nZCorner 55790 26908 0\nZCorner 55769 26884 0\nZCorner 55747 26860 0\nZCorner 55726 26835 0\nZCorner 55704 26811 0\nZCorner 55684 26799 0\nZCorner 55663 26787 0\nZCorner 55643 26776 0\nZCorner 55622 26764 0\nZCorner 55618 26778 0\nZCorner 55614 26791 0\nZCorner 55611 26805 0\nZCorner 55607 26819 0\nZCorner 55601 26830 0\nZCorner 55595 26842 0\nZCorner 55589 26854 0\nZCorner 55583 26865 0\nZCorner 55577 26872 0\nZCorner 55571 26879 0\nZCorner 55566 26886 0\nZCorner 55560 26893 0\nZCorner 55555 26897 0\nZCorner 55550 26901 0\nZCorner 55545 26905 0\nZCorner 55540 26908 0\nZCorner 55545 26918 0\nZCorner 55507 26924 0\nZCorner 55425 26925 0\nZCorner 55298 26924 0\nZCorner 54989 26923 0\nZCorner 54679 26922 0\nZCorner 54369 26921 0\nZCorner 54060 26920 0\nZCorner 53960 26863 0\nZCorner 53895 26798 0\nZCorner 53863 26726 0\nZCorner 53865 26647 0\nZCorner 53696 26647 0\nZCorner 53527 26647 0\nZCorner 53358 26647 0\nZCorner 53189 26647 0\nZCorner 53123 26536 0\nZCorner 53089 26459 0\nZCorner 53085 26418 0\nZCorner 53111 26413 0\nZCorner 53300 26413 0\nZCorner 53490 26413 0\nZCorner 53679 26413 0\nZCorner 53869 26413 0\nZCorner 53869 26411 0\nZCorner 53869 26409 0\nZCorner 53869 26407 0\nZCorner 53869 26405 0\nZCorner 53869 26393 0\nZCorner 53869 26381 0\nZCorner 53869 26370 0\nZCorner 53869 26358 0\nZCorner 53654 26358 0\nZCorner 53439 26358 0\nZCorner 53224 26358 0\nZCorner 53010 26358 0\nZCorner 52953 26259 0\nZCorner 52866 26191 0\nZCorner 52747 26154 0\nZCorner 52596 26147 0\nZCorner 52570 26149 0\nZCorner 52545 26151 0\nZCorner 52519 26153 0\nZCorner 52494 26155 0\nZCorner 52487 26155 0\nZCorner 52480 26155 0\nZCorner 52474 26155 0\nZCorner 52467 26155 0\nZCorner 52464 26156 0\nZCorner 52461 26157 0\nZCorner 52458 26158 0\nZCorner 52455 26159 0\nZCorner 52437 26162 0\nZCorner 52420 26165 0\nZCorner 52402 26168 0\nZCorner 52385 26170 0\nZCorner 52367 26176 0\nZCorner 52350 26182 0\nZCorner 52332 26188 0\nZCorner 52315 26194 0\nZCorner 52313 26196 0\nZCorner 52310 26198 0\nZCorner 52308 26200 0\nZCorner 52306 26202 0\nZCorner 52290 26212 0\nZCorner 52273 26223 0\nZCorner 52257 26234 0\nZCorner 52240 26245 0\nZCorner 52227 26260 0\nZCorner 52213 26276 0\nZCorner 52199 26292 0\nZCorner 52185 26307 0\nZCorner 52172 26327 0\nZCorner 52158 26346 0\nZCorner 52144 26366 0\nZCorner 52131 26385 0\nZCorner 52117 26405 0\nZCorner 52103 26424 0\nZCorner 52090 26444 0\nZCorner 52076 26463 0\nZCorner 52065 26476 0\nZCorner 52054 26489 0\nZCorner 52044 26502 0\nZCorner 52033 26514 0\nZCorner 52022 26521 0\nZCorner 52011 26528 0\nZCorner 52000 26535 0\nZCorner 51990 26542 0\nZCorner 51983 26544 0\nZCorner 51976 26547 0\nZCorner 51969 26550 0\nZCorner 51963 26553 0\nZCorner 51924 26553 0\nZCorner 51885 26553 0\nZCorner 51846 26553 0\nZCorner 51807 26553 0\nZCorner 51797 26547 0\nZCorner 51787 26542 0\nZCorner 51777 26536 0\nZCorner 51767 26530 0\nZCorner 51748 26505 0\nZCorner 51728 26481 0\nZCorner 51709 26457 0\nZCorner 51689 26432 0\nZCorner 51641 26344 0\nZCorner 51601 26280 0\nZCorner 51569 26239 0\nZCorner 51545 26221 0\nZCorner 51524 26208 0\nZCorner 51504 26194 0\nZCorner 51483 26180 0\nZCorner 51463 26167 0\nZCorner 51439 26162 0\nZCorner 51416 26157 0\nZCorner 51392 26152 0\nZCorner 51369 26147 0\nZCorner 51366 26147 0\nZCorner 51363 26147 0\nZCorner 51360 26147 0\nZCorner 51357 26147 0\nZCorner 51341 26145 0\nZCorner 51326 26143 0\nZCorner 51310 26141 0\nZCorner 51295 26139 0\nZCorner 51284 26142 0\nZCorner 51273 26145 0\nZCorner 51262 26148 0\nZCorner 51252 26151 0\nZCorner 51245 26151 0\nZCorner 51238 26151 0\nZCorner 51231 26151 0\nZCorner 51224 26151 0\nZCorner 51209 26161 0\nZCorner 51193 26171 0\nZCorner 51178 26180 0\nZCorner 51162 26190 0\nZCorner 51160 26191 0\nZCorner 51158 26192 0\nZCorner 51156 26193 0\nZCorner 51154 26194 0\nZCorner 51141 26207 0\nZCorner 51129 26219 0\nZCorner 51116 26232 0\nZCorner 51103 26245 0\nZCorner 51090 26261 0\nZCorner 51076 26276 0\nZCorner 51062 26292 0\nZCorner 51049 26307 0\nZCorner 51034 26322 0\nZCorner 51019 26337 0\nZCorner 51005 26351 0\nZCorner 50990 26366 0\nZCorner 50975 26376 0\nZCorner 50961 26385 0\nZCorner 50946 26395 0\nZCorner 50931 26405 0\nZCorner 50920 26408 0\nZCorner 50908 26411 0\nZCorner 50896 26414 0\nZCorner 50885 26417 0\nZCorner 50884 26417 0\nZCorner 50883 26417 0\nZCorner 50882 26417 0\nZCorner 50881 26417 0\nZCorner 50876 26418 0\nZCorner 50871 26419 0\nZCorner 50866 26420 0\nZCorner 50861 26421 0\nZCorner 50838 26415 0\nZCorner 50814 26409 0\nZCorner 50791 26403 0\nZCorner 50767 26397 0\nZCorner 50763 26393 0\nZCorner 50760 26389 0\nZCorner 50756 26386 0\nZCorner 50752 26382 0\nZCorner 50638 26234 0\nZCorner 50550 26135 0\nZCorner 50487 26086 0\nZCorner 50451 26085 0\nZCorner 50441 26084 0\nZCorner 50431 26083 0\nZCorner 50422 26082 0\nZCorner 50412 26081 0\nZCorner 50390 26081 0\nZCorner 50367 26081 0\nZCorner 50345 26081 0\nZCorner 50322 26081 0\nZCorner 50308 26086 0\nZCorner 50295 26091 0\nZCorner 50281 26096 0\nZCorner 50268 26100 0\nZCorner 50259 26105 0\nZCorner 50250 26110 0\nZCorner 50241 26115 0\nZCorner 50232 26120 0\nZCorner 50224 26126 0\nZCorner 50217 26132 0\nZCorner 50209 26138 0\nZCorner 50201 26143 0\nZCorner 50193 26149 0\nZCorner 50185 26155 0\nZCorner 50177 26161 0\nZCorner 50170 26167 0\nZCorner 50158 26171 0\nZCorner 50146 26175 0\nZCorner 50135 26179 0\nZCorner 50123 26182 0\nZCorner 50114 26183 0\nZCorner 50105 26184 0\nZCorner 50096 26185 0\nZCorner 50087 26186 0\nZCorner 50059 26185 0\nZCorner 50031 26184 0\nZCorner 50003 26183 0\nZCorner 49974 26182 0\nZCorner 49934 26172 0\nZCorner 49902 26158 0\nZCorner 49879 26141 0\nZCorner 49865 26124 0\nZCorner 49832 26071 0\nZCorner 49808 26013 0\nZCorner 49793 25948 0\nZCorner 49787 25878 0\nZCorner 49724 25803 0\nZCorner 49662 25727 0\nZCorner 49599 25652 0\nZCorner 49537 25577 0\nZCorner 50622 25577 0\nZCorner 51706 25577 0\nZCorner 52791 25577 0\nZCorner 53876 25577 0\nZCorner 53876 25534 0\nZCorner 53876 25491 0\nZCorner 53876 25448 0\nZCorner 53876 25405 0\nZCorner 53876 25403 0\nZCorner 53876 25401 0\nZCorner 53876 25399 0\nZCorner 53876 25397 0\nZCorner 53800 25398 0\nZCorner 53724 25399 0\nZCorner 53647 25400 0\nZCorner 53571 25401 0\nZCorner 52551 25400 0\nZCorner 51531 25399 0\nZCorner 50510 25398 0\nZCorner 49490 25397 0\nZCorner 49490 25397 0\nZCorner 49490 25395 0\nZCorner 49488 25392 0\nZCorner 49486 25390 0\nZCorner 49462 25350 0\nZCorner 49413 25284 0\nZCorner 49339 25192 0\nZCorner 49240 25073 0\nZCorner 49240 25062 0\nZCorner 49240 25050 0\nZCorner 49240 25038 0\nZCorner 49240 25026 0\nZCorner 50400 25026 0\nZCorner 51560 25026 0\nZCorner 52720 25026 0\nZCorner 53880 25026 1\nZCorner 63105 26030 0\nZCorner 63605 26030 0\nZCorner 64104 26030 0\nZCorner 64604 26030 0\nZCorner 65104 26030 0\nZCorner 65137 26029 0\nZCorner 65171 26028 0\nZCorner 65204 26027 0\nZCorner 65237 26026 0\nZCorner 65198 25987 0\nZCorner 65159 25948 0\nZCorner 65120 25909 0\nZCorner 65081 25870 0\nZCorner 65047 25870 0\nZCorner 65012 25870 0\nZCorner 64978 25870 0\nZCorner 64944 25870 0\nZCorner 64484 25870 0\nZCorner 64024 25870 0\nZCorner 63564 25870 0\nZCorner 63105 25870 0\nZCorner 63105 25910 0\nZCorner 63105 25950 0\nZCorner 63105 25990 0\nZCorner 63105 26030 1\nZCorner 62183 26604 0\nZCorner 62269 26604 0\nZCorner 62355 26604 0\nZCorner 62441 26604 0\nZCorner 62527 26604 0\nZCorner 62606 26598 0\nZCorner 62664 26592 0\nZCorner 62699 26585 0\nZCorner 62710 26577 0\nZCorner 62813 26518 0\nZCorner 62880 26435 0\nZCorner 62912 26327 0\nZCorner 62909 26194 0\nZCorner 62909 25925 0\nZCorner 62909 25657 0\nZCorner 62909 25388 0\nZCorner 62909 25120 0\nZCorner 62922 25120 0\nZCorner 62935 25120 0\nZCorner 62948 25120 0\nZCorner 62960 25120 0\nZCorner 62974 25118 0\nZCorner 62988 25116 0\nZCorner 63001 25114 0\nZCorner 63015 25112 0\nZCorner 63019 25111 0\nZCorner 63023 25110 0\nZCorner 63027 25109 0\nZCorner 63030 25108 0\nZCorner 63030 25088 0\nZCorner 63030 25067 0\nZCorner 63030 25047 0\nZCorner 63030 25026 0\nZCorner 63030 24981 0\nZCorner 63030 24936 0\nZCorner 63030 24891 0\nZCorner 63030 24846 0\nZCorner 63030 24841 0\nZCorner 63030 24835 0\nZCorner 63030 24829 0\nZCorner 63030 24823 0\nZCorner 63013 24823 0\nZCorner 62995 24823 0\nZCorner 62978 24823 0\nZCorner 62960 24823 0\nZCorner 62948 24822 0\nZCorner 62935 24821 0\nZCorner 62922 24820 0\nZCorner 62909 24819 0\nZCorner 62909 24750 0\nZCorner 62909 24680 0\nZCorner 62909 24611 0\nZCorner 62909 24542 0\nZCorner 62771 24542 0\nZCorner 62632 24542 0\nZCorner 62493 24542 0\nZCorner 62355 24542 0\nZCorner 62344 24546 0\nZCorner 62333 24550 0\nZCorner 62323 24553 0\nZCorner 62312 24557 0\nZCorner 62313 24624 0\nZCorner 62314 24690 0\nZCorner 62315 24757 0\nZCorner 62316 24823 0\nZCorner 62286 24824 0\nZCorner 62257 24825 0\nZCorner 62228 24826 0\nZCorner 62199 24827 0\nZCorner 62192 24828 0\nZCorner 62185 24829 0\nZCorner 62178 24830 0\nZCorner 62171 24831 0\nZCorner 62169 24834 0\nZCorner 62167 24837 0\nZCorner 62165 24840 0\nZCorner 62163 24842 0\nZCorner 62163 24910 0\nZCorner 62163 24977 0\nZCorner 62163 25045 0\nZCorner 62163 25112 0\nZCorner 62166 25114 0\nZCorner 62169 25116 0\nZCorner 62172 25118 0\nZCorner 62175 25120 0\nZCorner 62210 25120 0\nZCorner 62245 25120 0\nZCorner 62281 25120 0\nZCorner 62316 25120 0\nZCorner 62315 25388 0\nZCorner 62314 25657 0\nZCorner 62313 25925 0\nZCorner 62312 26194 0\nZCorner 62318 26246 0\nZCorner 62302 26283 0\nZCorner 62264 26305 0\nZCorner 62202 26311 0\nZCorner 62190 26310 0\nZCorner 62177 26309 0\nZCorner 62164 26308 0\nZCorner 62152 26307 0\nZCorner 62150 26379 0\nZCorner 62148 26452 0\nZCorner 62146 26524 0\nZCorner 62144 26596 0\nZCorner 62154 26598 0\nZCorner 62163 26600 0\nZCorner 62173 26602 0\nZCorner 62183 26604 1\nZCorner 60804 26010 0\nZCorner 60808 26056 0\nZCorner 60812 26102 0\nZCorner 60816 26148 0\nZCorner 60820 26194 0\nZCorner 60850 26310 0\nZCorner 60911 26412 0\nZCorner 61004 26500 0\nZCorner 61128 26577 0\nZCorner 61129 26577 0\nZCorner 61130 26577 0\nZCorner 61131 26577 0\nZCorner 61132 26577 0\nZCorner 61133 26578 0\nZCorner 61134 26579 0\nZCorner 61135 26580 0\nZCorner 61136 26581 0\nZCorner 61139 26581 0\nZCorner 61142 26582 0\nZCorner 61145 26583 0\nZCorner 61148 26584 0\nZCorner 61366 26623 0\nZCorner 61551 26635 0\nZCorner 61703 26619 0\nZCorner 61820 26577 0\nZCorner 61917 26529 0\nZCorner 61993 26450 0\nZCorner 62049 26338 0\nZCorner 62085 26194 0\nZCorner 62089 26159 0\nZCorner 62093 26124 0\nZCorner 62097 26088 0\nZCorner 62101 26053 0\nZCorner 62101 25898 0\nZCorner 62101 25743 0\nZCorner 62101 25587 0\nZCorner 62101 25432 0\nZCorner 62097 25379 0\nZCorner 62093 25325 0\nZCorner 62089 25271 0\nZCorner 62085 25217 0\nZCorner 62073 25175 0\nZCorner 62062 25133 0\nZCorner 62050 25091 0\nZCorner 62038 25049 0\nZCorner 61890 24863 0\nZCorner 61678 24768 0\nZCorner 61403 24764 0\nZCorner 61066 24850 0\nZCorner 61063 24851 0\nZCorner 61060 24852 0\nZCorner 61057 24853 0\nZCorner 61054 24854 0\nZCorner 61052 24856 0\nZCorner 61050 24858 0\nZCorner 61048 24860 0\nZCorner 61046 24862 0\nZCorner 61026 24869 0\nZCorner 61002 24883 0\nZCorner 60974 24905 0\nZCorner 60941 24936 0\nZCorner 60921 24964 0\nZCorner 60902 24993 0\nZCorner 60882 25021 0\nZCorner 60863 25049 0\nZCorner 60852 25080 0\nZCorner 60841 25110 0\nZCorner 60830 25140 0\nZCorner 60820 25170 0\nZCorner 60815 25236 0\nZCorner 60810 25301 0\nZCorner 60805 25367 0\nZCorner 60800 25432 0\nZCorner 60801 25577 0\nZCorner 60802 25721 0\nZCorner 60803 25866 0\nZCorner 60804 26010 1\nZCorner 59391 25260 0\nZCorner 59391 25267 0\nZCorner 59391 25274 0\nZCorner 59391 25281 0\nZCorner 59391 25288 0\nZCorner 59391 25491 0\nZCorner 59391 25694 0\nZCorner 59391 25897 0\nZCorner 59391 26100 0\nZCorner 59392 26106 0\nZCorner 59392 26112 0\nZCorner 59393 26118 0\nZCorner 59394 26124 0\nZCorner 59394 26127 0\nZCorner 59394 26129 0\nZCorner 59394 26132 0\nZCorner 59394 26135 0\nZCorner 59395 26141 0\nZCorner 59396 26147 0\nZCorner 59397 26153 0\nZCorner 59398 26159 0\nZCorner 59398 26161 0\nZCorner 59398 26163 0\nZCorner 59398 26165 0\nZCorner 59398 26167 0\nZCorner 59399 26172 0\nZCorner 59400 26176 0\nZCorner 59401 26181 0\nZCorner 59402 26186 0\nZCorner 59402 26189 0\nZCorner 59402 26192 0\nZCorner 59402 26195 0\nZCorner 59402 26198 0\nZCorner 59403 26201 0\nZCorner 59404 26204 0\nZCorner 59405 26207 0\nZCorner 59406 26209 0\nZCorner 59406 26210 0\nZCorner 59406 26211 0\nZCorner 59406 26212 0\nZCorner 59406 26213 0\nZCorner 59407 26217 0\nZCorner 59408 26221 0\nZCorner 59409 26225 0\nZCorner 59410 26229 0\nZCorner 59410 26230 0\nZCorner 59410 26231 0\nZCorner 59410 26232 0\nZCorner 59410 26233 0\nZCorner 59411 26235 0\nZCorner 59412 26237 0\nZCorner 59413 26239 0\nZCorner 59414 26241 0\nZCorner 59414 26242 0\nZCorner 59414 26243 0\nZCorner 59414 26244 0\nZCorner 59414 26245 0\nZCorner 59419 26258 0\nZCorner 59424 26272 0\nZCorner 59429 26286 0\nZCorner 59433 26299 0\nZCorner 59470 26383 0\nZCorner 59527 26457 0\nZCorner 59605 26522 0\nZCorner 59703 26577 0\nZCorner 59926 26620 0\nZCorner 60113 26635 0\nZCorner 60265 26620 0\nZCorner 60382 26577 0\nZCorner 60491 26509 0\nZCorner 60573 26423 0\nZCorner 60626 26318 0\nZCorner 60652 26194 0\nZCorner 60656 26098 0\nZCorner 60660 26002 0\nZCorner 60664 25907 0\nZCorner 60667 25811 0\nZCorner 60663 25660 0\nZCorner 60658 25508 0\nZCorner 60653 25357 0\nZCorner 60648 25206 0\nZCorner 60637 25167 0\nZCorner 60626 25128 0\nZCorner 60616 25089 0\nZCorner 60605 25049 0\nZCorner 60506 24906 0\nZCorner 60367 24808 0\nZCorner 60188 24756 0\nZCorner 59968 24749 0\nZCorner 59780 24787 0\nZCorner 59630 24849 0\nZCorner 59519 24937 0\nZCorner 59449 25049 0\nZCorner 59438 25075 0\nZCorner 59427 25100 0\nZCorner 59417 25126 0\nZCorner 59406 25151 0\nZCorner 59405 25157 0\nZCorner 59404 25163 0\nZCorner 59403 25169 0\nZCorner 59402 25175 0\nZCorner 59401 25177 0\nZCorner 59400 25180 0\nZCorner 59399 25183 0\nZCorner 59398 25186 0\nZCorner 59398 25189 0\nZCorner 59398 25192 0\nZCorner 59398 25195 0\nZCorner 59398 25198 0\nZCorner 59397 25202 0\nZCorner 59396 25206 0\nZCorner 59395 25210 0\nZCorner 59394 25214 0\nZCorner 59394 25216 0\nZCorner 59394 25219 0\nZCorner 59394 25222 0\nZCorner 59394 25225 0\nZCorner 59393 25229 0\nZCorner 59392 25233 0\nZCorner 59391 25237 0\nZCorner 59390 25241 0\nZCorner 59390 25246 0\nZCorner 59390 25251 0\nZCorner 59390 25256 0\nZCorner 59391 25260 1\nZCorner 58930 26604 0\nZCorner 58930 26406 0\nZCorner 58930 26208 0\nZCorner 58930 26009 0\nZCorner 58930 25811 0\nZCorner 58934 25638 0\nZCorner 58952 25516 0\nZCorner 58984 25448 0\nZCorner 59027 25432 0\nZCorner 59051 25425 0\nZCorner 59074 25417 0\nZCorner 59098 25409 0\nZCorner 59121 25401 0\nZCorner 59122 25401 0\nZCorner 59123 25401 0\nZCorner 59124 25401 0\nZCorner 59125 25401 0\nZCorner 59156 25398 0\nZCorner 59187 25395 0\nZCorner 59219 25392 0\nZCorner 59250 25389 0\nZCorner 59251 25229 0\nZCorner 59252 25069 0\nZCorner 59253 24909 0\nZCorner 59254 24749 0\nZCorner 59249 24749 0\nZCorner 59244 24749 0\nZCorner 59239 24749 0\nZCorner 59234 24749 0\nZCorner 59149 24766 0\nZCorner 59066 24812 0\nZCorner 58987 24888 0\nZCorner 58910 24995 0\nZCorner 58914 24942 0\nZCorner 58918 24889 0\nZCorner 58922 24837 0\nZCorner 58926 24784 0\nZCorner 58787 24784 0\nZCorner 58648 24784 0\nZCorner 58510 24784 0\nZCorner 58371 24784 0\nZCorner 58371 25232 0\nZCorner 58371 25680 0\nZCorner 58371 26128 0\nZCorner 58371 26577 0\nZCorner 58345 26585 0\nZCorner 58429 26592 0\nZCorner 58624 26598 0\nZCorner 58930 26604 1\nZCorner 57555 25085 0\nZCorner 57574 25085 0\nZCorner 57592 25085 0\nZCorner 57611 25085 0\nZCorner 57629 25085 0\nZCorner 57636 25092 0\nZCorner 57643 25098 0\nZCorner 57650 25105 0\nZCorner 57657 25112 0\nZCorner 57658 25131 0\nZCorner 57660 25149 0\nZCorner 57662 25168 0\nZCorner 57664 25186 0\nZCorner 57664 25438 0\nZCorner 57664 25690 0\nZCorner 57664 25942 0\nZCorner 57664 26194 0\nZCorner 57658 26213 0\nZCorner 57653 26233 0\nZCorner 57647 26252 0\nZCorner 57641 26272 0\nZCorner 57630 26281 0\nZCorner 57619 26289 0\nZCorner 57609 26298 0\nZCorner 57598 26307 0\nZCorner 57579 26304 0\nZCorner 57561 26301 0\nZCorner 57542 26298 0\nZCorner 57524 26295 0\nZCorner 57522 26293 0\nZCorner 57520 26291 0\nZCorner 57518 26289 0\nZCorner 57516 26288 0\nZCorner 57512 26280 0\nZCorner 57508 26272 0\nZCorner 57504 26264 0\nZCorner 57500 26256 0\nZCorner 57498 26250 0\nZCorner 57496 26245 0\nZCorner 57494 26239 0\nZCorner 57492 26233 0\nZCorner 57491 26216 0\nZCorner 57491 26200 0\nZCorner 57490 26183 0\nZCorner 57489 26166 0\nZCorner 57490 26164 0\nZCorner 57491 26162 0\nZCorner 57491 26160 0\nZCorner 57492 26158 0\nZCorner 57491 26158 0\nZCorner 57491 26158 0\nZCorner 57490 26158 0\nZCorner 57489 26158 0\nZCorner 57487 26144 0\nZCorner 57485 26129 0\nZCorner 57483 26115 0\nZCorner 57481 26100 0\nZCorner 57483 26098 0\nZCorner 57485 26096 0\nZCorner 57487 26094 0\nZCorner 57489 26092 0\nZCorner 57487 26092 0\nZCorner 57485 26092 0\nZCorner 57483 26092 0\nZCorner 57481 26092 0\nZCorner 57481 26073 0\nZCorner 57481 26053 0\nZCorner 57481 26033 0\nZCorner 57481 26014 0\nZCorner 57483 26010 0\nZCorner 57485 26006 0\nZCorner 57487 26002 0\nZCorner 57489 25998 0\nZCorner 57487 25997 0\nZCorner 57485 25996 0\nZCorner 57483 25995 0\nZCorner 57481 25994 0\nZCorner 57481 25959 0\nZCorner 57481 25924 0\nZCorner 57481 25889 0\nZCorner 57481 25854 0\nZCorner 57355 25854 0\nZCorner 57229 25854 0\nZCorner 57103 25854 0\nZCorner 56977 25854 0\nZCorner 56982 25939 0\nZCorner 56987 26024 0\nZCorner 56991 26109 0\nZCorner 56996 26194 0\nZCorner 57028 26309 0\nZCorner 57087 26411 0\nZCorner 57174 26500 0\nZCorner 57289 26576 0\nZCorner 57503 26620 0\nZCorner 57681 26635 0\nZCorner 57824 26620 0\nZCorner 57930 26576 0\nZCorner 58037 26513 0\nZCorner 58118 26427 0\nZCorner 58173 26321 0\nZCorner 58203 26194 0\nZCorner 58209 26154 0\nZCorner 58215 26115 0\nZCorner 58221 26076 0\nZCorner 58227 26037 0\nZCorner 58224 25822 0\nZCorner 58221 25608 0\nZCorner 58218 25393 0\nZCorner 58215 25178 0\nZCorner 58205 25146 0\nZCorner 58195 25114 0\nZCorner 58186 25081 0\nZCorner 58176 25049 0\nZCorner 58070 24909 0\nZCorner 57929 24812 0\nZCorner 57752 24759 0\nZCorner 57539 24748 0\nZCorner 57372 24778 0\nZCorner 57232 24837 0\nZCorner 57122 24928 0\nZCorner 57040 25049 0\nZCorner 57030 25080 0\nZCorner 57020 25112 0\nZCorner 57010 25143 0\nZCorner 57001 25174 0\nZCorner 56995 25239 0\nZCorner 56989 25303 0\nZCorner 56983 25367 0\nZCorner 56977 25432 0\nZCorner 56979 25441 0\nZCorner 56981 25449 0\nZCorner 56983 25458 0\nZCorner 56985 25467 0\nZCorner 57117 25467 0\nZCorner 57249 25467 0\nZCorner 57380 25467 0\nZCorner 57512 25467 0\nZCorner 57513 25392 0\nZCorner 57514 25317 0\nZCorner 57515 25242 0\nZCorner 57516 25166 0\nZCorner 57516 25161 0\nZCorner 57516 25157 0\nZCorner 57516 25152 0\nZCorner 57516 25147 0\nZCorner 57516 25145 0\nZCorner 57516 25143 0\nZCorner 57516 25141 0\nZCorner 57516 25139 0\nZCorner 57526 25125 0\nZCorner 57536 25112 0\nZCorner 57545 25098 0\nZCorner 57555 25085 1\nZCorner 55559 25967 0\nZCorner 55563 26024 0\nZCorner 55567 26081 0\nZCorner 55571 26137 0\nZCorner 55575 26194 0\nZCorner 55596 26297 0\nZCorner 55652 26394 0\nZCorner 55744 26487 0\nZCorner 55872 26577 0\nZCorner 56097 26621 0\nZCorner 56285 26635 0\nZCorner 56438 26621 0\nZCorner 56555 26577 0\nZCorner 56577 26566 0\nZCorner 56598 26555 0\nZCorner 56620 26544 0\nZCorner 56641 26534 0\nZCorner 56646 26529 0\nZCorner 56651 26524 0\nZCorner 56656 26519 0\nZCorner 56661 26514 0\nZCorner 56667 26510 0\nZCorner 56674 26506 0\nZCorner 56681 26502 0\nZCorner 56688 26498 0\nZCorner 56692 26493 0\nZCorner 56696 26487 0\nZCorner 56700 26481 0\nZCorner 56704 26475 0\nZCorner 56723 26463 0\nZCorner 56744 26438 0\nZCorner 56766 26403 0\nZCorner 56790 26358 0\nZCorner 56800 26317 0\nZCorner 56811 26276 0\nZCorner 56822 26235 0\nZCorner 56832 26194 0\nZCorner 56837 26138 0\nZCorner 56842 26083 0\nZCorner 56847 26027 0\nZCorner 56852 25971 0\nZCorner 56851 25836 0\nZCorner 56850 25702 0\nZCorner 56849 25567 0\nZCorner 56848 25432 0\nZCorner 56844 25380 0\nZCorner 56840 25329 0\nZCorner 56837 25277 0\nZCorner 56833 25225 0\nZCorner 56823 25161 0\nZCorner 56812 25111 0\nZCorner 56800 25074 0\nZCorner 56786 25049 0\nZCorner 56779 25036 0\nZCorner 56772 25022 0\nZCorner 56765 25008 0\nZCorner 56758 24995 0\nZCorner 56756 24995 0\nZCorner 56753 24995 0\nZCorner 56750 24995 0\nZCorner 56747 24995 0\nZCorner 56737 24980 0\nZCorner 56727 24966 0\nZCorner 56718 24951 0\nZCorner 56708 24936 0\nZCorner 56705 24934 0\nZCorner 56702 24932 0\nZCorner 56699 24930 0\nZCorner 56696 24928 0\nZCorner 56597 24838 0\nZCorner 56459 24780 0\nZCorner 56283 24752 0\nZCorner 56067 24757 0\nZCorner 55916 24795 0\nZCorner 55790 24856 0\nZCorner 55691 24941 0\nZCorner 55618 25050 0\nZCorner 55608 25079 0\nZCorner 55597 25108 0\nZCorner 55586 25138 0\nZCorner 55575 25167 0\nZCorner 55571 25233 0\nZCorner 55567 25300 0\nZCorner 55564 25366 0\nZCorner 55560 25432 0\nZCorner 55560 25566 0\nZCorner 55560 25700 0\nZCorner 55560 25834 0\nZCorner 55559 25967 1\nZCorner 54657 26604 0\nZCorner 54666 26602 0\nZCorner 54675 26600 0\nZCorner 54684 26598 0\nZCorner 54692 26596 0\nZCorner 54695 26231 0\nZCorner 54698 25866 0\nZCorner 54701 25501 0\nZCorner 54704 25135 0\nZCorner 54705 25128 0\nZCorner 54706 25120 0\nZCorner 54707 25112 0\nZCorner 54708 25104 0\nZCorner 54713 25099 0\nZCorner 54718 25094 0\nZCorner 54722 25090 0\nZCorner 54727 25085 0\nZCorner 54739 25084 0\nZCorner 54751 25083 0\nZCorner 54763 25082 0\nZCorner 54774 25081 0\nZCorner 54781 25086 0\nZCorner 54788 25091 0\nZCorner 54795 25095 0\nZCorner 54802 25100 0\nZCorner 54805 25117 0\nZCorner 54809 25134 0\nZCorner 54813 25150 0\nZCorner 54817 25167 0\nZCorner 54818 25526 0\nZCorner 54819 25885 0\nZCorner 54820 26245 0\nZCorner 54821 26604 0\nZCorner 54961 26604 0\nZCorner 55100 26604 0\nZCorner 55240 26604 0\nZCorner 55379 26604 0\nZCorner 55386 26602 0\nZCorner 55393 26600 0\nZCorner 55400 26598 0\nZCorner 55407 26596 0\nZCorner 55408 26146 0\nZCorner 55409 25696 0\nZCorner 55410 25246 0\nZCorner 55411 24796 0\nZCorner 55404 24793 0\nZCorner 55397 24790 0\nZCorner 55390 24787 0\nZCorner 55383 24784 0\nZCorner 55241 24784 0\nZCorner 55098 24784 0\nZCorner 54956 24784 0\nZCorner 54813 24784 0\nZCorner 54815 24812 0\nZCorner 54817 24841 0\nZCorner 54819 24869 0\nZCorner 54821 24897 0\nZCorner 54801 24880 0\nZCorner 54782 24862 0\nZCorner 54762 24845 0\nZCorner 54743 24827 0\nZCorner 54730 24821 0\nZCorner 54717 24815 0\nZCorner 54705 24809 0\nZCorner 54692 24804 0\nZCorner 54681 24799 0\nZCorner 54671 24794 0\nZCorner 54660 24789 0\nZCorner 54649 24784 0\nZCorner 54459 24746 0\nZCorner 54307 24778 0\nZCorner 54191 24879 0\nZCorner 54114 25050 0\nZCorner 54110 25438 0\nZCorner 54106 25827 0\nZCorner 54102 26215 0\nZCorner 54098 26604 0\nZCorner 54238 26604 0\nZCorner 54378 26604 0\nZCorner 54517 26604 0\nZCorner 54657 26604 0\nZCorner 54657 26604 0\nZCorner 54657 26604 0\nZCorner 54657 26604 0\nZCorner 54657 26604 1\nZCorner 53872 25870 0\nZCorner 53410 25870 0\nZCorner 52949 25870 0\nZCorner 52487 25870 0\nZCorner 52025 25870 0\nZCorner 51991 25872 0\nZCorner 51957 25874 0\nZCorner 51922 25875 0\nZCorner 51888 25877 0\nZCorner 51850 25915 0\nZCorner 51812 25952 0\nZCorner 51774 25989 0\nZCorner 51736 26026 0\nZCorner 51768 26027 0\nZCorner 51800 26028 0\nZCorner 51833 26029 0\nZCorner 51865 26030 0\nZCorner 52367 26030 0\nZCorner 52869 26030 0\nZCorner 53370 26030 0\nZCorner 53872 26030 0\nZCorner 53872 25990 0\nZCorner 53872 25950 0\nZCorner 53872 25910 0\nZCorner 53872 25870 1\n$POLYSCORNERS\n58524 28521 0 0\n58656 28513 0 0\n58723 28509 0 0\n58789 28506 0 0\n58793 28389 0 0\n58805 28041 0 0\n58862 28030 0 0\n58930 28017 0 0\n58930 26604 0 0\n58624 26598 0 0\n58429 26592 0 0\n58345 26585 0 0\n58371 26577 0 0\n58371 24784 0 0\n58926 24784 0 0\n58922 24837 0 0\n58918 24889 0 0\n58910 24995 0 0\n58987 24888 0 0\n59066 24812 0 0\n59149 24766 0 0\n59234 24749 0 0\n59254 24749 0 0\n59250 25389 0 0\n59219 25392 0 0\n59187 25395 0 0\n59125 25401 0 0\n59121 25401 0 0\n59098 25409 0 0\n59074 25417 0 0\n59051 25425 0 0\n59027 25432 0 0\n58984 25448 0 0\n58952 25516 0 0\n58934 25638 0 0\n58930 25811 0 0\n58930 26604 0 0\n58930 28017 0 0\n58978 28008 0 0\n59035 27998 0 0\n59078 28105 0 0\n59121 28213 0 0\n59207 28427 0 0\n59270 28408 0 0\n59332 28388 0 0\n59394 28369 0 0\n59457 28349 0 0\n59434 28235 0 0\n59410 28121 0 0\n59387 28007 0 0\n59363 27892 0 0\n59469 27846 0 0\n59521 27822 0 0\n59574 27799 0 0\n59580 27805 0 0\n59582 27806 0 0\n59648 27898 0 0\n59715 27990 0 0\n59847 28174 0 0\n59904 28140 0 0\n59961 28107 0 0\n60017 28074 0 0\n60074 28041 0 0\n60023 27935 0 0\n59972 27830 0 0\n59922 27724 0 0\n59871 27619 0 0\n60006 27511 0 0\n60050 27475 0 0\n60113 27526 0 0\n60113 26635 0 0\n59926 26620 0 0\n59703 26577 0 0\n59605 26522 0 0\n59527 26457 0 0\n59470 26383 0 0\n59433 26299 0 0\n59429 26286 0 0\n59419 26258 0 0\n59414 26245 0 0\n59414 26241 0 0\n59410 26233 0 0\n59410 26229 0 0\n59406 26213 0 0\n59406 26209 0 0\n59405 26207 0 0\n59402 26198 0 0\n59402 26186 0 0\n59400 26176 0 0\n59399 26172 0 0\n59398 26167 0 0\n59398 26159 0 0\n59394 26135 0 0\n59394 26124 0 0\n59392 26112 0 0\n59392 26106 0 0\n59391 26100 0 0\n59391 25260 0 0\n59390 25256 0 0\n59390 25241 0 0\n59394 25225 0 0\n59394 25214 0 0\n59398 25198 0 0\n59398 25186 0 0\n59401 25177 0 0\n59402 25175 0 0\n59406 25151 0 0\n59417 25126 0 0\n59427 25100 0 0\n59438 25075 0 0\n59449 25049 0 0\n59519 24937 0 0\n59630 24849 0 0\n59780 24787 0 0\n59968 24749 0 0\n60188 24756 0 0\n60367 24808 0 0\n60506 24906 0 0\n60589 25025 0 0\n60589 24538 0 0\n60589 24526 0 0\n60593 24538 0 0\n60589 24538 0 0\n60589 25025 0 0\n60605 25049 0 0\n60616 25089 0 0\n60626 25128 0 0\n60648 25206 0 0\n60658 25508 0 0\n60663 25660 0 0\n60667 25811 0 0\n60664 25907 0 0\n60660 26002 0 0\n60652 26194 0 0\n60626 26318 0 0\n60589 26391 0 0\n60573 26423 0 0\n60491 26509 0 0\n60382 26577 0 0\n60265 26620 0 0\n60113 26635 0 0\n60113 27526 0 0\n60414 27775 0 0\n60506 27685 0 0\n60551 27640 0 0\n60597 27596 0 0\n60301 27232 0 0\n60336 27186 0 0\n60441 27045 0 0\n60548 27096 0 0\n60589 27115 0 0\n60654 27147 0 0\n60760 27197 0 0\n60867 27248 0 0\n60899 27192 0 0\n60931 27137 0 0\n60964 27081 0 0\n60996 27026 0 0\n60939 26985 0 0\n60883 26944 0 0\n60769 26862 0 0\n60804 26848 0 0\n60866 26856 0 0\n60958 26885 0 0\n61078 26936 0 0\n61132 26943 0 0\n61187 26950 0 0\n61242 26956 0 0\n61296 26963 0 0\n61458 26957 0 0\n61540 26954 0 0\n61551 26953 0 0\n61551 26635 0 0\n61366 26623 0 0\n61148 26584 0 0\n61139 26581 0 0\n61136 26581 0 0\n61132 26577 0 0\n61128 26577 0 0\n61004 26500 0 0\n60911 26412 0 0\n60850 26310 0 0\n60820 26194 0 0\n60804 26010 0 0\n60803 25866 0 0\n60802 25721 0 0\n60801 25577 0 0\n60800 25432 0 0\n60805 25367 0 0\n60810 25301 0 0\n60815 25236 0 0\n60820 25170 0 0\n60830 25140 0 0\n60852 25080 0 0\n60863 25049 0 0\n60882 25021 0 0\n60902 24993 0 0\n60921 24964 0 0\n60941 24936 0 0\n60974 24905 0 0\n61002 24883 0 0\n61026 24869 0 0\n61046 24862 0 0\n61054 24854 0 0\n61066 24850 0 0\n61403 24764 0 0\n61678 24768 0 0\n61890 24863 0 0\n62038 25049 0 0\n62062 25133 0 0\n62073 25175 0 0\n62085 25217 0 0\n62097 25379 0 0\n62101 25432 0 0\n62101 26053 0 0\n62097 26088 0 0\n62093 26124 0 0\n62085 26194 0 0\n62049 26338 0 0\n61993 26450 0 0\n61917 26529 0 0\n61820 26577 0 0\n61703 26619 0 0\n61551 26635 0 0\n61551 26953 0 0\n61621 26951 0 0\n61710 26938 0 0\n61789 26920 0 0\n61857 26900 0 0\n61913 26877 0 0\n61931 26868 0 0\n61949 26860 0 0\n61966 26851 0 0\n61984 26842 0 0\n61984 26951 0 0\n62087 26953 0 0\n62183 26954 0 0\n62183 26604 0 0\n62163 26600 0 0\n62154 26598 0 0\n62144 26596 0 0\n62148 26452 0 0\n62150 26379 0 0\n62152 26307 0 0\n62164 26308 0 0\n62190 26310 0 0\n62202 26311 0 0\n62264 26305 0 0\n62302 26283 0 0\n62318 26246 0 0\n62312 26194 0 0\n62313 25925 0 0\n62314 25657 0 0\n62315 25388 0 0\n62316 25120 0 0\n62175 25120 0 0\n62163 25112 0 0\n62163 24842 0 0\n62165 24840 0 0\n62171 24831 0 0\n62199 24827 0 0\n62286 24824 0 0\n62316 24823 0 0\n62315 24757 0 0\n62314 24690 0 0\n62313 24624 0 0\n62312 24557 0 0\n62323 24553 0 0\n62333 24550 0 0\n62355 24542 0 0\n62909 24542 0 0\n62909 24819 0 0\n62948 24822 0 0\n62960 24823 0 0\n63030 24823 0 0\n63030 25108 0 0\n63027 25109 0 0\n63015 25112 0 0\n63001 25114 0 0\n62988 25116 0 0\n62960 25120 0 0\n62909 25120 0 0\n62909 26194 0 0\n62912 26327 0 0\n62880 26435 0 0\n62813 26518 0 0\n62710 26577 0 0\n62699 26585 0 0\n62664 26592 0 0\n62606 26598 0 0\n62527 26604 0 0\n62183 26604 0 0\n62183 26954 0 0\n62191 26955 0 0\n62294 26957 0 0\n62398 26959 0 0\n62527 26955 0 0\n62623 26949 0 0\n62684 26941 0 0\n62710 26932 0 0\n62809 26897 0 0\n62900 26838 0 0\n62985 26755 0 0\n63061 26647 0 0\n63780 26647 0 0\n63851 26522 0 0\n63888 26442 0 0\n63890 26405 0 0\n63858 26413 0 0\n63097 26413 0 0\n63097 26358 0 0\n63105 26358 0 0\n63105 26030 0 0\n63105 25870 0 0\n65081 25870 0 0\n65237 26026 0 0\n65171 26028 0 0\n65137 26029 0 0\n65104 26030 0 0\n63105 26030 0 0\n63105 26358 0 0\n63952 26358 0 0\n63988 26286 0 0\n64048 26227 0 0\n64133 26182 0 0\n64241 26151 0 0\n64307 26149 0 0\n64341 26148 0 0\n64374 26147 0 0\n64399 26149 0 0\n64425 26151 0 0\n64475 26155 0 0\n64503 26155 0 0\n64512 26158 0 0\n64514 26159 0 0\n64550 26165 0 0\n64567 26168 0 0\n64585 26170 0 0\n64603 26176 0 0\n64622 26182 0 0\n64640 26188 0 0\n64659 26194 0 0\n64667 26202 0 0\n64683 26212 0 0\n64700 26223 0 0\n64716 26234 0 0\n64733 26245 0 0\n64747 26260 0 0\n64760 26276 0 0\n64774 26292 0 0\n64788 26307 0 0\n64802 26327 0 0\n64817 26346 0 0\n64832 26366 0 0\n64846 26385 0 0\n64859 26405 0 0\n64872 26424 0 0\n64884 26444 0 0\n64897 26463 0 0\n64917 26489 0 0\n64926 26501 0 0\n64936 26514 0 0\n64958 26528 0 0\n64968 26535 0 0\n64979 26541 0 0\n65000 26550 0 0\n65006 26553 0 0\n65178 26549 0 0\n65212 26526 0 0\n65254 26475 0 0\n65304 26395 0 0\n65362 26287 0 0\n65452 26197 0 0\n65465 26189 0 0\n65479 26182 0 0\n65507 26166 0 0\n65553 26156 0 0\n65577 26151 0 0\n65600 26146 0 0\n65612 26146 0 0\n65626 26145 0 0\n65639 26143 0 0\n65667 26139 0 0\n65679 26142 0 0\n65692 26144 0 0\n65705 26147 0 0\n65717 26150 0 0\n65745 26150 0 0\n65760 26160 0 0\n65792 26180 0 0\n65807 26189 0 0\n65819 26193 0 0\n65833 26207 0 0\n65846 26221 0 0\n65860 26234 0 0\n65874 26248 0 0\n65886 26263 0 0\n65899 26277 0 0\n65912 26292 0 0\n65924 26307 0 0\n65939 26321 0 0\n65954 26336 0 0\n65968 26351 0 0\n65983 26365 0 0\n65997 26375 0 0\n66010 26385 0 0\n66024 26395 0 0\n66038 26404 0 0\n66049 26407 0 0\n66073 26413 0 0\n66084 26416 0 0\n66088 26416 0 0\n66108 26420 0 0\n66156 26412 0 0\n66193 26400 0 0\n66222 26384 0 0\n66241 26365 0 0\n66285 26309 0 0\n66373 26195 0 0\n66416 26139 0 0\n66455 26109 0 0\n66467 26100 0 0\n66495 26092 0 0\n66508 26088 0 0\n66522 26084 0 0\n66531 26083 0 0\n66539 26082 0 0\n66557 26080 0 0\n66651 26080 0 0\n66664 26085 0 0\n66692 26095 0 0\n66705 26100 0 0\n66714 26105 0 0\n66723 26109 0 0\n66741 26119 0 0\n66747 26125 0 0\n66768 26143 0 0\n66776 26148 0 0\n66784 26154 0 0\n66791 26160 0 0\n66799 26166 0 0\n66812 26170 0 0\n66824 26174 0 0\n66850 26182 0 0\n66858 26183 0 0\n66865 26184 0 0\n66873 26185 0 0\n66881 26185 0 0\n66914 26184 0 0\n66948 26182 0 0\n67014 26178 0 0\n67042 26170 0 0\n67067 26157 0 0\n67090 26139 0 0\n67111 26115 0 0\n67140 26068 0 0\n67161 26012 0 0\n67175 25949 0 0\n67182 25877 0 0\n67245 25802 0 0\n67309 25727 0 0\n67372 25652 0 0\n67436 25576 0 0\n63105 25576 0 0\n63105 25397 0 0\n63409 25401 0 0\n67498 25397 0 0\n67504 25378 0 0\n67510 25360 0 0\n67516 25341 0 0\n67522 25323 0 0\n67653 25170 0 0\n67732 25070 0 0\n67756 25022 0 0\n67725 25026 0 0\n63230 25026 0 0\n63233 25011 0 0\n63235 24997 0 0\n63241 24967 0 0\n63240 24941 0 0\n63239 24914 0 0\n63237 24862 0 0\n64280 24862 0 0\n64306 24890 0 0\n64331 24918 0 0\n64356 24947 0 0\n64382 24975 0 0\n67205 24975 0 0\n67276 24976 0 0\n67348 24974 0 0\n67421 24967 0 0\n67494 24955 0 0\n67495 24977 0 0\n67515 24953 0 0\n67554 24885 0 0\n67611 24772 0 0\n63225 24772 0 0\n63217 24748 0 0\n63199 24702 0 0\n63190 24678 0 0\n63183 24670 0 0\n63175 24663 0 0\n63159 24647 0 0\n63146 24641 0 0\n63134 24635 0 0\n63108 24623 0 0\n63108 24604 0 0\n63102 24458 0 0\n63082 24356 0 0\n63047 24298 0 0\n62999 24284 0 0\n62633 24276 0 0\n62366 24274 0 0\n62199 24278 0 0\n62132 24288 0 0\n62124 24294 0 0\n62120 24296 0 0\n62116 24299 0 0\n62110 24302 0 0\n62105 24305 0 0\n62093 24311 0 0\n62073 24329 0 0\n62064 24337 0 0\n62054 24346 0 0\n62039 24373 0 0\n62034 24381 0 0\n62028 24405 0 0\n62026 24416 0 0\n62023 24428 0 0\n62021 24454 0 0\n62020 24466 0 0\n62019 24479 0 0\n62018 24507 0 0\n62017 24536 0 0\n62015 24592 0 0\n61997 24584 0 0\n61980 24577 0 0\n61962 24569 0 0\n61945 24561 0 0\n61841 24519 0 0\n61666 24497 0 0\n61418 24495 0 0\n61097 24514 0 0\n61062 24431 0 0\n61039 24379 0 0\n60917 24412 0 0\n60699 24488 0 0\n60589 24526 0 0\n60499 24376 0 0\n60468 24327 0 0\n60812 24003 0 0\n60652 23803 0 0\n60552 23867 0 0\n60453 23930 0 0\n60353 23994 0 0\n60254 24057 0 0\n60174 23975 0 0\n60133 23934 0 0\n60093 23893 0 0\n60156 23794 0 0\n60218 23696 0 0\n60281 23597 0 0\n60343 23499 0 0\n60292 23460 0 0\n60240 23420 0 0\n60136 23342 0 0\n59820 23678 0 0\n59720 23620 0 0\n59671 23590 0 0\n59621 23561 0 0\n59659 23450 0 0\n59697 23338 0 0\n59773 23116 0 0\n59714 23090 0 0\n59654 23063 0 0\n59595 23037 0 0\n59535 23010 0 0\n59478 23112 0 0\n59422 23214 0 0\n59365 23315 0 0\n59308 23417 0 0\n59308 23421 0 0\n59306 23419 0 0\n59306 23418 0 0\n59305 23417 0 0\n59195 23383 0 0\n59141 23367 0 0\n59086 23350 0 0\n59096 23233 0 0\n59105 23116 0 0\n59125 22882 0 0\n58972 22853 0 0\n58878 22839 0 0\n58837 22962 0 0\n58807 23069 0 0\n58777 23177 0 0\n58746 23284 0 0\n58689 23282 0 0\n58573 23278 0 0\n58516 23276 0 0\n58498 23160 0 0\n58481 23044 0 0\n58463 22928 0 0\n58445 22811 0 0\n58313 22819 0 0\n58246 22823 0 0\n58180 22827 0 0\n58174 23061 0 0\n58171 23179 0 0\n58168 23296 0 0\n58112 23305 0 0\n58055 23315 0 0\n57999 23325 0 0\n57942 23335 0 0\n57897 23227 0 0\n57807 23013 0 0\n57762 22905 0 0\n57700 22925 0 0\n57637 22944 0 0\n57575 22964 0 0\n57512 22983 0 0\n57537 23098 0 0\n57585 23326 0 0\n57610 23440 0 0\n57557 23463 0 0\n57504 23485 0 0\n57451 23508 0 0\n57399 23530 0 0\n57328 23437 0 0\n57258 23345 0 0\n57118 23159 0 0\n57010 23227 0 0\n56957 23262 0 0\n56903 23296 0 0\n56953 23400 0 0\n57003 23505 0 0\n57052 23609 0 0\n57102 23714 0 0\n56918 23854 0 0\n56829 23780 0 0\n56649 23632 0 0\n56559 23557 0 0\n56467 23647 0 0\n56422 23692 0 0\n56376 23737 0 0\n56598 24007 0 0\n56672 24096 0 0\n56532 24284 0 0\n56524 24288 0 0\n56528 24284 0 0\n56423 24232 0 0\n56317 24180 0 0\n56212 24129 0 0\n56106 24077 0 0\n56074 24133 0 0\n56042 24188 0 0\n56010 24244 0 0\n55977 24300 0 0\n56045 24349 0 0\n56112 24399 0 0\n56180 24449 0 0\n56247 24499 0 0\n56159 24507 0 0\n56071 24514 0 0\n55895 24530 0 0\n55846 24551 0 0\n55796 24571 0 0\n55746 24592 0 0\n55686 24616 0 0\n55677 24620 0 0\n55657 24628 0 0\n55651 24601 0 0\n55649 24593 0 0\n55641 24581 0 0\n55638 24575 0 0\n55634 24569 0 0\n55629 24563 0 0\n55624 24558 0 0\n55614 24546 0 0\n55600 24541 0 0\n55587 24536 0 0\n55559 24526 0 0\n54263 24522 0 0\n54182 24536 0 0\n54102 24581 0 0\n54025 24660 0 0\n53950 24772 0 0\n49354 24772 0 0\n49414 24885 0 0\n49454 24953 0 0\n49476 24977 0 0\n49479 24956 0 0\n52431 24956 0 0\n52443 24971 0 0\n52470 24957 0 0\n52511 24915 0 0\n52568 24846 0 0\n53911 24846 0 0\n53902 24858 0 0\n53900 24862 0 0\n53892 24880 0 0\n53888 24888 0 0\n53884 24897 0 0\n53883 24929 0 0\n53882 24962 0 0\n53880 25026 0 0\n49240 25026 0 0\n49240 25073 0 0\n49339 25192 0 0\n49413 25284 0 0\n49462 25350 0 0\n49486 25390 0 0\n49488 25392 0 0\n49490 25395 0 0\n49490 25397 0 0\n53571 25401 0 0\n53647 25400 0 0\n53724 25399 0 0\n53876 25397 0 0\n53876 25577 0 0\n49537 25577 0 0\n49599 25652 0 0\n49662 25727 0 0\n49724 25803 0 0\n49787 25878 0 0\n49793 25948 0 0\n49808 26013 0 0\n49832 26071 0 0\n49865 26124 0 0\n49879 26141 0 0\n49902 26158 0 0\n49934 26172 0 0\n49974 26182 0 0\n50003 26183 0 0\n50087 26186 0 0\n50123 26182 0 0\n50135 26179 0 0\n50146 26175 0 0\n50170 26167 0 0\n50177 26161 0 0\n50201 26143 0 0\n50209 26138 0 0\n50217 26132 0 0\n50224 26126 0 0\n50232 26120 0 0\n50268 26100 0 0\n50281 26096 0 0\n50295 26091 0 0\n50308 26086 0 0\n50322 26081 0 0\n50412 26081 0 0\n50422 26082 0 0\n50431 26083 0 0\n50451 26085 0 0\n50487 26086 0 0\n50550 26135 0 0\n50638 26234 0 0\n50752 26382 0 0\n50756 26386 0 0\n50760 26389 0 0\n50763 26393 0 0\n50767 26397 0 0\n50791 26403 0 0\n50814 26409 0 0\n50838 26415 0 0\n50861 26421 0 0\n50881 26417 0 0\n50885 26417 0 0\n50896 26414 0 0\n50920 26408 0 0\n50931 26405 0 0\n50961 26385 0 0\n50975 26376 0 0\n50990 26366 0 0\n51049 26307 0 0\n51062 26292 0 0\n51076 26276 0 0\n51090 26261 0 0\n51103 26245 0 0\n51154 26194 0 0\n51162 26190 0 0\n51178 26180 0 0\n51193 26171 0 0\n51209 26161 0 0\n51224 26151 0 0\n51252 26151 0 0\n51262 26148 0 0\n51295 26139 0 0\n51310 26141 0 0\n51326 26143 0 0\n51341 26145 0 0\n51357 26147 0 0\n51369 26147 0 0\n51392 26152 0 0\n51416 26157 0 0\n51439 26162 0 0\n51463 26167 0 0\n51483 26180 0 0\n51504 26194 0 0\n51524 26208 0 0\n51545 26221 0 0\n51569 26239 0 0\n51601 26280 0 0\n51641 26344 0 0\n51689 26432 0 0\n51709 26457 0 0\n51728 26481 0 0\n51748 26505 0 0\n51767 26530 0 0\n51787 26542 0 0\n51797 26547 0 0\n51807 26553 0 0\n51865 26553 0 0\n51865 26030 0 0\n51833 26029 0 0\n51800 26028 0 0\n51736 26026 0 0\n51850 25915 0 0\n51888 25877 0 0\n51922 25875 0 0\n51957 25874 0 0\n52025 25870 0 0\n53872 25870 0 0\n53872 26030 0 0\n51865 26030 0 0\n51865 26553 0 0\n51963 26553 0 0\n51969 26550 0 0\n51983 26544 0 0\n51990 26542 0 0\n52000 26535 0 0\n52033 26514 0 0\n52044 26502 0 0\n52054 26489 0 0\n52076 26463 0 0\n52090 26444 0 0\n52103 26424 0 0\n52117 26405 0 0\n52131 26385 0 0\n52144 26366 0 0\n52158 26346 0 0\n52172 26327 0 0\n52185 26307 0 0\n52199 26292 0 0\n52227 26260 0 0\n52240 26245 0 0\n52257 26234 0 0\n52273 26223 0 0\n52290 26212 0 0\n52306 26202 0 0\n52310 26198 0 0\n52313 26196 0 0\n52315 26194 0 0\n52332 26188 0 0\n52350 26182 0 0\n52367 26176 0 0\n52385 26170 0 0\n52402 26168 0 0\n52420 26165 0 0\n52437 26162 0 0\n52455 26159 0 0\n52467 26155 0 0\n52494 26155 0 0\n52519 26153 0 0\n52545 26151 0 0\n52570 26149 0 0\n52596 26147 0 0\n52747 26154 0 0\n52866 26191 0 0\n52953 26259 0 0\n53010 26358 0 0\n53869 26358 0 0\n53869 26413 0 0\n53111 26413 0 0\n53085 26418 0 0\n53089 26459 0 0\n53123 26536 0 0\n53189 26647 0 0\n53865 26647 0 0\n53863 26726 0 0\n53895 26798 0 0\n53960 26863 0 0\n54060 26920 0 0\n54369 26921 0 0\n54821 26922 0 0\n54821 26604 0 0\n54820 26245 0 0\n54819 25885 0 0\n54817 25167 0 0\n54813 25150 0 0\n54809 25134 0 0\n54805 25117 0 0\n54802 25100 0 0\n54795 25095 0 0\n54788 25091 0 0\n54774 25081 0 0\n54763 25082 0 0\n54727 25085 0 0\n54708 25104 0 0\n54705 25128 0 0\n54704 25135 0 0\n54701 25501 0 0\n54692 26596 0 0\n54684 26598 0 0\n54657 26604 0 0\n54098 26604 0 0\n54102 26215 0 0\n54106 25827 0 0\n54110 25438 0 0\n54114 25050 0 0\n54191 24879 0 0\n54307 24778 0 0\n54459 24746 0 0\n54649 24784 0 0\n54671 24794 0 0\n54681 24799 0 0\n54692 24804 0 0\n54705 24809 0 0\n54717 24815 0 0\n54743 24827 0 0\n54762 24845 0 0\n54782 24862 0 0\n54801 24880 0 0\n54821 24897 0 0\n54817 24841 0 0\n54815 24812 0 0\n54813 24784 0 0\n55383 24784 0 0\n55411 24796 0 0\n55407 26596 0 0\n55379 26604 0 0\n54821 26604 0 0\n54821 26922 0 0\n54989 26923 0 0\n55298 26924 0 0\n55425 26925 0 0\n55507 26924 0 0\n55545 26918 0 0\n55540 26908 0 0\n55545 26905 0 0\n55560 26893 0 0\n55566 26886 0 0\n55571 26879 0 0\n55583 26865 0 0\n55589 26854 0 0\n55601 26830 0 0\n55607 26819 0 0\n55611 26805 0 0\n55614 26791 0 0\n55618 26778 0 0\n55622 26764 0 0\n55643 26776 0 0\n55663 26787 0 0\n55684 26799 0 0\n55704 26811 0 0\n55726 26835 0 0\n55747 26860 0 0\n55769 26884 0 0\n55790 26908 0 0\n55810 26920 0 0\n55819 26926 0 0\n55829 26932 0 0\n55855 26936 0 0\n55905 26944 0 0\n55931 26947 0 0\n56063 26945 0 0\n56194 26942 0 0\n56285 26939 0 0\n56285 26635 0 0\n56097 26621 0 0\n55872 26577 0 0\n55744 26487 0 0\n55652 26394 0 0\n55596 26297 0 0\n55575 26194 0 0\n55571 26137 0 0\n55567 26081 0 0\n55559 25967 0 0\n55560 25834 0 0\n55560 25432 0 0\n55564 25366 0 0\n55567 25300 0 0\n55571 25233 0 0\n55575 25167 0 0\n55586 25138 0 0\n55597 25108 0 0\n55608 25079 0 0\n55618 25050 0 0\n55691 24941 0 0\n55790 24856 0 0\n55916 24795 0 0\n56067 24757 0 0\n56283 24752 0 0\n56459 24780 0 0\n56597 24838 0 0\n56696 24928 0 0\n56708 24936 0 0\n56718 24951 0 0\n56727 24966 0 0\n56737 24980 0 0\n56747 24995 0 0\n56758 24995 0 0\n56765 25008 0 0\n56779 25036 0 0\n56786 25049 0 0\n56800 25074 0 0\n56812 25111 0 0\n56823 25161 0 0\n56833 25225 0 0\n56837 25277 0 0\n56840 25329 0 0\n56844 25380 0 0\n56848 25432 0 0\n56850 25702 0 0\n56851 25836 0 0\n56852 25971 0 0\n56842 26083 0 0\n56837 26138 0 0\n56832 26194 0 0\n56822 26235 0 0\n56800 26317 0 0\n56790 26358 0 0\n56766 26403 0 0\n56744 26438 0 0\n56723 26463 0 0\n56704 26475 0 0\n56692 26493 0 0\n56688 26498 0 0\n56667 26510 0 0\n56661 26514 0 0\n56641 26534 0 0\n56620 26544 0 0\n56598 26555 0 0\n56577 26566 0 0\n56555 26577 0 0\n56438 26621 0 0\n56285 26635 0 0\n56285 26939 0 0\n56458 26936 0 0\n56468 26954 0 0\n56477 26973 0 0\n56487 26991 0 0\n56497 27010 0 0\n56161 27322 0 0\n56215 27399 0 0\n56260 27459 0 0\n56294 27503 0 0\n56317 27533 0 0\n56415 27468 0 0\n56513 27402 0 0\n56610 27337 0 0\n56708 27272 0 0\n56794 27358 0 0\n56837 27400 0 0\n56879 27443 0 0\n56880 27444 0 0\n56882 27445 0 0\n56884 27447 0 0\n56876 27443 0 0\n56812 27541 0 0\n56749 27639 0 0\n56685 27736 0 0\n56622 27834 0 0\n56688 27887 0 0\n56745 27930 0 0\n56793 27962 0 0\n56833 27982 0 0\n57149 27654 0 0\n57198 27684 0 0\n57247 27713 0 0\n57295 27742 0 0\n57344 27771 0 0\n57288 27933 0 0\n57243 28062 0 0\n57209 28159 0 0\n57188 28224 0 0\n57248 28246 0 0\n57279 28257 0 0\n57309 28267 0 0\n57374 28299 0 0\n57416 28317 0 0\n57437 28322 0 0\n57438 28314 0 0\n57494 28214 0 0\n57608 28012 0 0\n57664 27912 0 0\n57681 27917 0 0\n57681 26635 0 0\n57503 26620 0 0\n57289 26576 0 0\n57174 26500 0 0\n57087 26411 0 0\n57028 26309 0 0\n56996 26194 0 0\n56991 26109 0 0\n56987 26024 0 0\n56977 25854 0 0\n57481 25854 0 0\n57481 25994 0 0\n57489 25998 0 0\n57481 26014 0 0\n57481 26092 0 0\n57489 26092 0 0\n57481 26100 0 0\n57483 26115 0 0\n57485 26129 0 0\n57487 26144 0 0\n57489 26158 0 0\n57492 26158 0 0\n57491 26160 0 0\n57491 26162 0 0\n57489 26166 0 0\n57491 26200 0 0\n57491 26216 0 0\n57492 26233 0 0\n57496 26245 0 0\n57498 26250 0 0\n57500 26256 0 0\n57516 26288 0 0\n57518 26289 0 0\n57524 26295 0 0\n57542 26298 0 0\n57561 26301 0 0\n57579 26304 0 0\n57598 26307 0 0\n57609 26298 0 0\n57619 26289 0 0\n57630 26281 0 0\n57641 26272 0 0\n57647 26252 0 0\n57653 26233 0 0\n57658 26213 0 0\n57664 26194 0 0\n57664 25186 0 0\n57662 25168 0 0\n57660 25149 0 0\n57658 25131 0 0\n57657 25112 0 0\n57643 25098 0 0\n57636 25092 0 0\n57629 25085 0 0\n57555 25085 0 0\n57545 25098 0 0\n57536 25112 0 0\n57526 25125 0 0\n57516 25139 0 0\n57516 25166 0 0\n57515 25242 0 0\n57512 25467 0 0\n56985 25467 0 0\n56981 25449 0 0\n56979 25441 0 0\n56977 25432 0 0\n56983 25367 0 0\n56995 25239 0 0\n57001 25174 0 0\n57010 25143 0 0\n57020 25112 0 0\n57030 25080 0 0\n57040 25049 0 0\n57122 24928 0 0\n57232 24837 0 0\n57372 24778 0 0\n57539 24748 0 0\n57752 24759 0 0\n57929 24812 0 0\n58070 24909 0 0\n58176 25049 0 0\n58186 25081 0 0\n58195 25114 0 0\n58215 25178 0 0\n58221 25608 0 0\n58224 25822 0 0\n58227 26037 0 0\n58209 26154 0 0\n58203 26194 0 0\n58173 26321 0 0\n58118 26427 0 0\n58037 26513 0 0\n57930 26576 0 0\n57824 26620 0 0\n57681 26635 0 0\n57681 27917 0 0\n57719 27929 0 0\n57774 27947 0 0\n57828 27965 0 0\n57883 27982 0 0\n57872 28099 0 0\n57862 28216 0 0\n57851 28334 0 0\n57840 28451 0 0\n57905 28461 0 0\n57969 28472 0 0\n58034 28483 0 0\n58098 28494 0 0\n58130 28382 0 0\n58162 28269 0 0\n58195 28157 0 0\n58227 28045 0 0\n58284 28048 0 0\n58342 28050 0 0\n58400 28053 0 0\n58457 28056 0 0\n58474 28172 0 0\n58490 28289 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660001 0 \"\"\nZLayer 20\nZAux 45 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56180 25085 0\nZCorner 56192 25084 0\nZCorner 56204 25083 0\nZCorner 56216 25082 0\nZCorner 56227 25081 0\nZCorner 56235 25085 0\nZCorner 56243 25089 0\nZCorner 56251 25093 0\nZCorner 56259 25096 0\nZCorner 56262 25109 0\nZCorner 56264 25122 0\nZCorner 56267 25135 0\nZCorner 56270 25147 0\nZCorner 56271 25409 0\nZCorner 56272 25671 0\nZCorner 56273 25932 0\nZCorner 56274 26194 0\nZCorner 56270 26215 0\nZCorner 56267 26237 0\nZCorner 56263 26258 0\nZCorner 56259 26280 0\nZCorner 56249 26287 0\nZCorner 56239 26294 0\nZCorner 56229 26300 0\nZCorner 56220 26307 0\nZCorner 56210 26305 0\nZCorner 56200 26303 0\nZCorner 56190 26301 0\nZCorner 56181 26299 0\nZCorner 56174 26294 0\nZCorner 56167 26288 0\nZCorner 56160 26282 0\nZCorner 56153 26276 0\nZCorner 56150 26255 0\nZCorner 56148 26235 0\nZCorner 56145 26214 0\nZCorner 56142 26194 0\nZCorner 56143 25927 0\nZCorner 56144 25661 0\nZCorner 56145 25394 0\nZCorner 56145 25128 0\nZCorner 56154 25117 0\nZCorner 56163 25106 0\nZCorner 56172 25096 0\nZCorner 56180 25085 1\n$POLYSCORNERS\n56220 26307 0 0\n56229 26300 0 0\n56239 26294 0 0\n56259 26280 0 0\n56263 26258 0 0\n56267 26237 0 0\n56270 26215 0 0\n56274 26194 0 0\n56273 25932 0 0\n56272 25671 0 0\n56270 25147 0 0\n56267 25135 0 0\n56264 25122 0 0\n56262 25109 0 0\n56259 25096 0 0\n56251 25093 0 0\n56227 25081 0 0\n56216 25082 0 0\n56180 25085 0 0\n56172 25096 0 0\n56163 25106 0 0\n56145 25128 0 0\n56145 25394 0 0\n56144 25661 0 0\n56143 25927 0 0\n56142 26194 0 0\n56145 26214 0 0\n56148 26235 0 0\n56150 26255 0 0\n56153 26276 0 0\n56174 26294 0 0\n56181 26299 0 0\n56190 26301 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660002 0 \"\"\nZLayer 20\nZAux 53 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 61386 25174 0\nZCorner 61389 25158 0\nZCorner 61392 25141 0\nZCorner 61395 25125 0\nZCorner 61398 25108 0\nZCorner 61405 25101 0\nZCorner 61412 25094 0\nZCorner 61418 25088 0\nZCorner 61425 25081 0\nZCorner 61439 25084 0\nZCorner 61453 25087 0\nZCorner 61466 25090 0\nZCorner 61480 25093 0\nZCorner 61486 25105 0\nZCorner 61492 25118 0\nZCorner 61497 25131 0\nZCorner 61503 25143 0\nZCorner 61504 25406 0\nZCorner 61505 25669 0\nZCorner 61506 25931 0\nZCorner 61507 26194 0\nZCorner 61504 26212 0\nZCorner 61501 26231 0\nZCorner 61498 26249 0\nZCorner 61495 26268 0\nZCorner 61491 26276 0\nZCorner 61486 26284 0\nZCorner 61481 26292 0\nZCorner 61476 26299 0\nZCorner 61467 26301 0\nZCorner 61458 26303 0\nZCorner 61449 26305 0\nZCorner 61441 26307 0\nZCorner 61433 26304 0\nZCorner 61425 26301 0\nZCorner 61417 26298 0\nZCorner 61409 26295 0\nZCorner 61406 26290 0\nZCorner 61404 26284 0\nZCorner 61401 26278 0\nZCorner 61398 26272 0\nZCorner 61395 26253 0\nZCorner 61392 26233 0\nZCorner 61389 26213 0\nZCorner 61386 26194 0\nZCorner 61386 25939 0\nZCorner 61386 25684 0\nZCorner 61386 25429 0\nZCorner 61386 25174 0\nZCorner 61386 25174 0\nZCorner 61386 25174 0\nZCorner 61386 25174 0\nZCorner 61386 25174 1\n$POLYSCORNERS\n61441 26307 0 0\n61449 26305 0 0\n61476 26299 0 0\n61481 26292 0 0\n61491 26276 0 0\n61495 26268 0 0\n61498 26249 0 0\n61501 26231 0 0\n61504 26212 0 0\n61507 26194 0 0\n61506 25931 0 0\n61505 25669 0 0\n61503 25143 0 0\n61497 25131 0 0\n61492 25118 0 0\n61486 25105 0 0\n61480 25093 0 0\n61466 25090 0 0\n61453 25087 0 0\n61425 25081 0 0\n61398 25108 0 0\n61395 25125 0 0\n61392 25141 0 0\n61389 25158 0 0\n61386 25174 0 0\n61386 26194 0 0\n61389 26213 0 0\n61395 26253 0 0\n61398 26272 0 0\n61404 26284 0 0\n61406 26290 0 0\n61409 26295 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660003 0 \"\"\nZLayer 20\nZAux 49 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59953 25159 0\nZCorner 59957 25143 0\nZCorner 59961 25128 0\nZCorner 59965 25112 0\nZCorner 59969 25096 0\nZCorner 59974 25092 0\nZCorner 59980 25088 0\nZCorner 59986 25085 0\nZCorner 59992 25081 0\nZCorner 60044 25070 0\nZCorner 60077 25125 0\nZCorner 60093 25245 0\nZCorner 60090 25432 0\nZCorner 60090 25622 0\nZCorner 60090 25813 0\nZCorner 60090 26003 0\nZCorner 60090 26194 0\nZCorner 60086 26213 0\nZCorner 60082 26233 0\nZCorner 60078 26252 0\nZCorner 60074 26272 0\nZCorner 60069 26278 0\nZCorner 60064 26285 0\nZCorner 60059 26292 0\nZCorner 60054 26299 0\nZCorner 60042 26301 0\nZCorner 60029 26303 0\nZCorner 60016 26305 0\nZCorner 60004 26307 0\nZCorner 59999 26307 0\nZCorner 59994 26307 0\nZCorner 59989 26307 0\nZCorner 59984 26307 0\nZCorner 59978 26300 0\nZCorner 59972 26293 0\nZCorner 59967 26286 0\nZCorner 59961 26280 0\nZCorner 59959 26258 0\nZCorner 59957 26237 0\nZCorner 59955 26215 0\nZCorner 59953 26194 0\nZCorner 59953 25935 0\nZCorner 59953 25676 0\nZCorner 59953 25418 0\nZCorner 59953 25159 0\nZCorner 59953 25159 0\nZCorner 59953 25159 0\nZCorner 59953 25159 0\nZCorner 59953 25159 1\n$POLYSCORNERS\n60004 26307 0 0\n60016 26305 0 0\n60042 26301 0 0\n60054 26299 0 0\n60069 26278 0 0\n60074 26272 0 0\n60078 26252 0 0\n60082 26233 0 0\n60086 26213 0 0\n60090 26194 0 0\n60090 25432 0 0\n60093 25245 0 0\n60077 25125 0 0\n60044 25070 0 0\n59992 25081 0 0\n59986 25085 0 0\n59980 25088 0 0\n59974 25092 0 0\n59969 25096 0 0\n59961 25128 0 0\n59957 25143 0 0\n59953 25159 0 0\n59953 26194 0 0\n59955 26215 0 0\n59957 26237 0 0\n59959 26258 0 0\n59961 26280 0 0\n59967 26286 0 0\n59972 26293 0 0\n59984 26307 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660004 0 \"\"\nZLayer 20\nZAux 41 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56606 22603 0\nZCorner 56612 22598 0\nZCorner 56618 22593 0\nZCorner 56624 22589 0\nZCorner 56630 22584 0\nZCorner 56670 22596 0\nZCorner 56708 22604 0\nZCorner 56746 22606 0\nZCorner 56786 22603 0\nZCorner 56789 22603 0\nZCorner 56792 22603 0\nZCorner 56795 22603 0\nZCorner 56798 22603 0\nZCorner 56802 22613 0\nZCorner 56806 22623 0\nZCorner 56809 22632 0\nZCorner 56813 22642 0\nZCorner 56786 22643 0\nZCorner 56759 22644 0\nZCorner 56731 22645 0\nZCorner 56704 22646 0\nZCorner 56708 22652 0\nZCorner 56712 22658 0\nZCorner 56716 22664 0\nZCorner 56720 22670 0\nZCorner 56720 22671 0\nZCorner 56720 22672 0\nZCorner 56720 22673 0\nZCorner 56720 22673 0\nZCorner 56755 22731 0\nZCorner 56790 22789 0\nZCorner 56825 22846 0\nZCorner 56860 22904 0\nZCorner 56851 22910 0\nZCorner 56841 22916 0\nZCorner 56831 22921 0\nZCorner 56821 22927 0\nZCorner 56768 22846 0\nZCorner 56714 22765 0\nZCorner 56660 22684 0\nZCorner 56606 22603 1\n$POLYSCORNERS\n56821 22927 0 0\n56831 22921 0 0\n56841 22916 0 0\n56851 22910 0 0\n56860 22904 0 0\n56825 22846 0 0\n56790 22789 0 0\n56720 22673 0 0\n56720 22670 0 0\n56704 22646 0 0\n56731 22645 0 0\n56759 22644 0 0\n56813 22642 0 0\n56809 22632 0 0\n56806 22623 0 0\n56798 22603 0 0\n56786 22603 0 0\n56746 22606 0 0\n56708 22604 0 0\n56670 22596 0 0\n56630 22584 0 0\n56624 22589 0 0\n56618 22593 0 0\n56606 22603 0 0\n56768 22846 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660005 0 \"\"\nZLayer 20\nZAux 50 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56665 22931 0\nZCorner 56665 22932 0\nZCorner 56665 22933 0\nZCorner 56665 22934 0\nZCorner 56665 22935 0\nZCorner 56667 22940 0\nZCorner 56669 22945 0\nZCorner 56671 22950 0\nZCorner 56673 22955 0\nZCorner 56642 23043 0\nZCorner 56594 23090 0\nZCorner 56530 23095 0\nZCorner 56450 23060 0\nZCorner 56373 22972 0\nZCorner 56334 22893 0\nZCorner 56333 22825 0\nZCorner 56372 22767 0\nZCorner 56452 22734 0\nZCorner 56527 22750 0\nZCorner 56599 22816 0\nZCorner 56665 22931 1\nZCorner 56384 22826 0\nZCorner 56384 22837 0\nZCorner 56384 22847 0\nZCorner 56384 22858 0\nZCorner 56384 22869 0\nZCorner 56387 22875 0\nZCorner 56390 22880 0\nZCorner 56393 22886 0\nZCorner 56395 22892 0\nZCorner 56450 22976 0\nZCorner 56500 23030 0\nZCorner 56548 23052 0\nZCorner 56591 23044 0\nZCorner 56618 23000 0\nZCorner 56617 22948 0\nZCorner 56587 22888 0\nZCorner 56528 22822 0\nZCorner 56515 22811 0\nZCorner 56501 22800 0\nZCorner 56487 22790 0\nZCorner 56473 22779 0\nZCorner 56460 22780 0\nZCorner 56446 22781 0\nZCorner 56433 22782 0\nZCorner 56419 22783 0\nZCorner 56410 22794 0\nZCorner 56401 22804 0\nZCorner 56393 22815 0\nZCorner 56384 22826 1\n$POLYSCORNERS\n56530 23095 0 0\n56548 23093 0 0\n56548 23052 0 0\n56500 23030 0 0\n56450 22976 0 0\n56395 22892 0 0\n56393 22886 0 0\n56390 22880 0 0\n56387 22875 0 0\n56384 22869 0 0\n56384 22826 0 0\n56393 22815 0 0\n56401 22804 0 0\n56410 22794 0 0\n56419 22783 0 0\n56433 22782 0 0\n56446 22781 0 0\n56460 22780 0 0\n56473 22779 0 0\n56487 22790 0 0\n56501 22800 0 0\n56515 22811 0 0\n56528 22822 0 0\n56587 22888 0 0\n56617 22948 0 0\n56618 23000 0 0\n56591 23044 0 0\n56548 23052 0 0\n56548 23093 0 0\n56594 23090 0 0\n56642 23043 0 0\n56673 22955 0 0\n56665 22935 0 0\n56665 22931 0 0\n56599 22816 0 0\n56527 22750 0 0\n56452 22734 0 0\n56372 22767 0 0\n56333 22825 0 0\n56334 22893 0 0\n56373 22972 0 0\n56450 23060 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660006 0 \"\"\nZLayer 20\nZAux 70 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56966 22720 0\nZCorner 56898 22599 0\nZCorner 56878 22504 0\nZCorner 56904 22436 0\nZCorner 56977 22396 0\nZCorner 57057 22404 0\nZCorner 57119 22452 0\nZCorner 57165 22539 0\nZCorner 57196 22666 0\nZCorner 57191 22678 0\nZCorner 57186 22689 0\nZCorner 57181 22701 0\nZCorner 57177 22713 0\nZCorner 57171 22720 0\nZCorner 57165 22728 0\nZCorner 57159 22736 0\nZCorner 57153 22744 0\nZCorner 57140 22750 0\nZCorner 57128 22756 0\nZCorner 57115 22761 0\nZCorner 57102 22767 0\nZCorner 57088 22767 0\nZCorner 57073 22767 0\nZCorner 57058 22767 0\nZCorner 57044 22767 0\nZCorner 57037 22765 0\nZCorner 57030 22763 0\nZCorner 57023 22761 0\nZCorner 57017 22759 0\nZCorner 57004 22750 0\nZCorner 56991 22740 0\nZCorner 56979 22730 0\nZCorner 56966 22720 1\nZCorner 56935 22486 0\nZCorner 56936 22498 0\nZCorner 56937 22510 0\nZCorner 56937 22521 0\nZCorner 56938 22533 0\nZCorner 56973 22629 0\nZCorner 57011 22694 0\nZCorner 57052 22727 0\nZCorner 57095 22728 0\nZCorner 57105 22719 0\nZCorner 57116 22711 0\nZCorner 57127 22702 0\nZCorner 57138 22693 0\nZCorner 57139 22678 0\nZCorner 57139 22662 0\nZCorner 57140 22646 0\nZCorner 57141 22631 0\nZCorner 57127 22597 0\nZCorner 57112 22564 0\nZCorner 57098 22531 0\nZCorner 57083 22498 0\nZCorner 57074 22486 0\nZCorner 57065 22474 0\nZCorner 57057 22463 0\nZCorner 57048 22451 0\nZCorner 57035 22446 0\nZCorner 57022 22441 0\nZCorner 57010 22436 0\nZCorner 56997 22431 0\nZCorner 56986 22437 0\nZCorner 56976 22443 0\nZCorner 56965 22449 0\nZCorner 56954 22455 0\nZCorner 56949 22463 0\nZCorner 56944 22470 0\nZCorner 56939 22478 0\nZCorner 56935 22486 1\n$POLYSCORNERS\n57102 22767 0 0\n57115 22761 0 0\n57128 22756 0 0\n57140 22750 0 0\n57153 22744 0 0\n57171 22720 0 0\n57177 22713 0 0\n57181 22701 0 0\n57186 22689 0 0\n57191 22678 0 0\n57196 22666 0 0\n57165 22539 0 0\n57119 22452 0 0\n57057 22404 0 0\n56977 22396 0 0\n56904 22436 0 0\n56878 22504 0 0\n56898 22599 0 0\n56966 22720 0 0\n56979 22730 0 0\n56991 22740 0 0\n57004 22750 0 0\n57017 22759 0 0\n57023 22761 0 0\n57044 22767 0 0\n57095 22767 0 0\n57095 22728 0 0\n57052 22727 0 0\n57011 22694 0 0\n56973 22629 0 0\n56938 22533 0 0\n56937 22521 0 0\n56937 22510 0 0\n56935 22486 0 0\n56939 22478 0 0\n56944 22470 0 0\n56949 22463 0 0\n56954 22455 0 0\n56976 22443 0 0\n56986 22437 0 0\n56997 22431 0 0\n57010 22436 0 0\n57022 22441 0 0\n57048 22451 0 0\n57057 22463 0 0\n57065 22474 0 0\n57083 22498 0 0\n57098 22531 0 0\n57112 22564 0 0\n57127 22597 0 0\n57141 22631 0 0\n57140 22646 0 0\n57139 22662 0 0\n57139 22678 0 0\n57138 22693 0 0\n57116 22711 0 0\n57105 22719 0 0\n57095 22728 0 0\n57095 22767 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660007 0 \"\"\nZLayer 20\nZAux 66 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56431 23134 0\nZCorner 56431 23138 0\nZCorner 56431 23142 0\nZCorner 56431 23146 0\nZCorner 56431 23150 0\nZCorner 56406 23238 0\nZCorner 56361 23285 0\nZCorner 56298 23292 0\nZCorner 56216 23259 0\nZCorner 56128 23177 0\nZCorner 56087 23098 0\nZCorner 56093 23024 0\nZCorner 56145 22955 0\nZCorner 56213 22933 0\nZCorner 56282 22955 0\nZCorner 56354 23022 0\nZCorner 56431 23134 1\nZCorner 56247 22998 0\nZCorner 56237 22994 0\nZCorner 56228 22990 0\nZCorner 56218 22986 0\nZCorner 56208 22982 0\nZCorner 56196 22985 0\nZCorner 56185 22988 0\nZCorner 56173 22991 0\nZCorner 56161 22994 0\nZCorner 56154 23005 0\nZCorner 56148 23015 0\nZCorner 56141 23026 0\nZCorner 56134 23037 0\nZCorner 56135 23049 0\nZCorner 56136 23062 0\nZCorner 56137 23075 0\nZCorner 56138 23087 0\nZCorner 56143 23092 0\nZCorner 56148 23097 0\nZCorner 56153 23102 0\nZCorner 56157 23107 0\nZCorner 56162 23116 0\nZCorner 56167 23125 0\nZCorner 56172 23133 0\nZCorner 56177 23142 0\nZCorner 56178 23144 0\nZCorner 56179 23146 0\nZCorner 56180 23148 0\nZCorner 56181 23150 0\nZCorner 56243 23211 0\nZCorner 56296 23243 0\nZCorner 56340 23245 0\nZCorner 56376 23216 0\nZCorner 56378 23204 0\nZCorner 56380 23191 0\nZCorner 56382 23178 0\nZCorner 56384 23166 0\nZCorner 56381 23157 0\nZCorner 56378 23148 0\nZCorner 56375 23139 0\nZCorner 56372 23131 0\nZCorner 56351 23105 0\nZCorner 56329 23080 0\nZCorner 56308 23054 0\nZCorner 56286 23029 0\nZCorner 56276 23021 0\nZCorner 56267 23013 0\nZCorner 56257 23006 0\nZCorner 56247 22998 1\n$POLYSCORNERS\n56298 23292 0 0\n56340 23287 0 0\n56340 23245 0 0\n56296 23243 0 0\n56243 23211 0 0\n56181 23150 0 0\n56177 23142 0 0\n56172 23133 0 0\n56167 23125 0 0\n56157 23107 0 0\n56153 23102 0 0\n56138 23087 0 0\n56137 23075 0 0\n56135 23049 0 0\n56134 23037 0 0\n56148 23015 0 0\n56154 23005 0 0\n56161 22994 0 0\n56185 22988 0 0\n56196 22985 0 0\n56208 22982 0 0\n56228 22990 0 0\n56237 22994 0 0\n56247 22998 0 0\n56257 23006 0 0\n56267 23013 0 0\n56276 23021 0 0\n56286 23029 0 0\n56308 23054 0 0\n56329 23080 0 0\n56351 23105 0 0\n56372 23131 0 0\n56375 23139 0 0\n56384 23166 0 0\n56382 23178 0 0\n56378 23204 0 0\n56376 23216 0 0\n56340 23245 0 0\n56340 23287 0 0\n56361 23285 0 0\n56406 23238 0 0\n56431 23150 0 0\n56431 23134 0 0\n56354 23022 0 0\n56282 22955 0 0\n56213 22933 0 0\n56145 22955 0 0\n56093 23024 0 0\n56087 23098 0 0\n56128 23177 0 0\n56216 23259 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660008 0 \"\"\nZLayer 20\nZAux 98 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56411 28203 0\nZCorner 56408 28206 0\nZCorner 56405 28209 0\nZCorner 56403 28212 0\nZCorner 56400 28215 0\nZCorner 56399 28216 0\nZCorner 56398 28217 0\nZCorner 56397 28218 0\nZCorner 56396 28219 0\nZCorner 56320 28309 0\nZCorner 56247 28356 0\nZCorner 56176 28359 0\nZCorner 56107 28317 0\nZCorner 56083 28242 0\nZCorner 56093 28170 0\nZCorner 56139 28101 0\nZCorner 56220 28036 0\nZCorner 56222 28034 0\nZCorner 56224 28032 0\nZCorner 56226 28030 0\nZCorner 56228 28028 0\nZCorner 56295 28004 0\nZCorner 56351 28010 0\nZCorner 56397 28044 0\nZCorner 56431 28106 0\nZCorner 56429 28122 0\nZCorner 56427 28139 0\nZCorner 56425 28156 0\nZCorner 56423 28172 0\nZCorner 56422 28174 0\nZCorner 56421 28176 0\nZCorner 56420 28178 0\nZCorner 56419 28180 0\nZCorner 56419 28180 0\nZCorner 56419 28180 0\nZCorner 56419 28180 0\nZCorner 56419 28180 0\nZCorner 56417 28186 0\nZCorner 56415 28192 0\nZCorner 56413 28198 0\nZCorner 56411 28203 1\nZCorner 56177 28157 0\nZCorner 56175 28158 0\nZCorner 56173 28159 0\nZCorner 56171 28160 0\nZCorner 56169 28161 0\nZCorner 56169 28163 0\nZCorner 56169 28165 0\nZCorner 56169 28167 0\nZCorner 56169 28169 0\nZCorner 56167 28170 0\nZCorner 56165 28172 0\nZCorner 56163 28174 0\nZCorner 56161 28176 0\nZCorner 56159 28179 0\nZCorner 56157 28182 0\nZCorner 56155 28185 0\nZCorner 56153 28188 0\nZCorner 56146 28199 0\nZCorner 56140 28209 0\nZCorner 56133 28220 0\nZCorner 56126 28231 0\nZCorner 56126 28237 0\nZCorner 56126 28243 0\nZCorner 56126 28249 0\nZCorner 56126 28254 0\nZCorner 56132 28265 0\nZCorner 56138 28276 0\nZCorner 56144 28287 0\nZCorner 56150 28297 0\nZCorner 56164 28302 0\nZCorner 56179 28307 0\nZCorner 56193 28312 0\nZCorner 56208 28317 0\nZCorner 56214 28316 0\nZCorner 56220 28315 0\nZCorner 56226 28314 0\nZCorner 56231 28313 0\nZCorner 56244 28302 0\nZCorner 56257 28292 0\nZCorner 56269 28281 0\nZCorner 56282 28270 0\nZCorner 56356 28184 0\nZCorner 56383 28118 0\nZCorner 56365 28072 0\nZCorner 56302 28048 0\nZCorner 56291 28052 0\nZCorner 56280 28057 0\nZCorner 56270 28062 0\nZCorner 56259 28067 0\nZCorner 56248 28077 0\nZCorner 56237 28087 0\nZCorner 56227 28096 0\nZCorner 56216 28106 0\nZCorner 56206 28119 0\nZCorner 56196 28132 0\nZCorner 56187 28144 0\nZCorner 56177 28157 1\n$POLYSCORNERS\n56176 28359 0 0\n56208 28357 0 0\n56208 28317 0 0\n56193 28312 0 0\n56179 28307 0 0\n56164 28302 0 0\n56150 28297 0 0\n56144 28287 0 0\n56126 28254 0 0\n56126 28231 0 0\n56140 28209 0 0\n56146 28199 0 0\n56153 28188 0 0\n56161 28176 0 0\n56167 28170 0 0\n56169 28169 0 0\n56169 28161 0 0\n56177 28157 0 0\n56187 28144 0 0\n56196 28132 0 0\n56216 28106 0 0\n56227 28096 0 0\n56237 28087 0 0\n56259 28067 0 0\n56270 28062 0 0\n56280 28057 0 0\n56291 28052 0 0\n56302 28048 0 0\n56365 28072 0 0\n56383 28118 0 0\n56356 28184 0 0\n56282 28270 0 0\n56269 28281 0 0\n56257 28292 0 0\n56244 28302 0 0\n56231 28313 0 0\n56226 28314 0 0\n56208 28317 0 0\n56208 28357 0 0\n56247 28356 0 0\n56320 28309 0 0\n56396 28219 0 0\n56403 28212 0 0\n56405 28209 0 0\n56411 28203 0 0\n56413 28198 0 0\n56419 28180 0 0\n56423 28172 0 0\n56425 28156 0 0\n56429 28122 0 0\n56431 28106 0 0\n56397 28044 0 0\n56351 28010 0 0\n56295 28004 0 0\n56228 28028 0 0\n56220 28036 0 0\n56139 28101 0 0\n56093 28170 0 0\n56083 28242 0 0\n56107 28317 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660009 0 \"\"\nZLayer 20\nZAux 37 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56442 28461 0\nZCorner 56444 28457 0\nZCorner 56446 28454 0\nZCorner 56448 28450 0\nZCorner 56450 28446 0\nZCorner 56491 28393 0\nZCorner 56532 28340 0\nZCorner 56573 28288 0\nZCorner 56614 28235 0\nZCorner 56625 28242 0\nZCorner 56636 28249 0\nZCorner 56646 28255 0\nZCorner 56657 28262 0\nZCorner 56601 28340 0\nZCorner 56544 28418 0\nZCorner 56488 28497 0\nZCorner 56431 28575 0\nZCorner 56422 28570 0\nZCorner 56413 28565 0\nZCorner 56404 28560 0\nZCorner 56396 28555 0\nZCorner 56396 28513 0\nZCorner 56390 28474 0\nZCorner 56378 28438 0\nZCorner 56360 28407 0\nZCorner 56368 28397 0\nZCorner 56376 28387 0\nZCorner 56384 28377 0\nZCorner 56392 28368 0\nZCorner 56402 28390 0\nZCorner 56411 28413 0\nZCorner 56421 28435 0\nZCorner 56431 28457 0\nZCorner 56434 28458 0\nZCorner 56437 28459 0\nZCorner 56439 28460 0\nZCorner 56442 28461 1\n$POLYSCORNERS\n56431 28575 0 0\n56488 28497 0 0\n56544 28418 0 0\n56601 28340 0 0\n56657 28262 0 0\n56646 28255 0 0\n56636 28249 0 0\n56614 28235 0 0\n56573 28288 0 0\n56532 28340 0 0\n56450 28446 0 0\n56446 28454 0 0\n56444 28457 0 0\n56442 28461 0 0\n56439 28460 0 0\n56437 28459 0 0\n56431 28457 0 0\n56411 28413 0 0\n56402 28390 0 0\n56392 28368 0 0\n56384 28377 0 0\n56360 28407 0 0\n56378 28438 0 0\n56390 28474 0 0\n56396 28513 0 0\n56396 28555 0 0\n56404 28560 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000A 0 \"\"\nZLayer 20\nZAux 49 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56860 28403 0\nZCorner 56871 28409 0\nZCorner 56882 28415 0\nZCorner 56893 28420 0\nZCorner 56903 28426 0\nZCorner 56855 28507 0\nZCorner 56808 28588 0\nZCorner 56760 28669 0\nZCorner 56712 28750 0\nZCorner 56710 28752 0\nZCorner 56708 28754 0\nZCorner 56706 28756 0\nZCorner 56704 28758 0\nZCorner 56696 28755 0\nZCorner 56689 28752 0\nZCorner 56681 28749 0\nZCorner 56673 28747 0\nZCorner 56671 28729 0\nZCorner 56669 28711 0\nZCorner 56667 28694 0\nZCorner 56665 28676 0\nZCorner 56655 28658 0\nZCorner 56646 28639 0\nZCorner 56636 28621 0\nZCorner 56626 28602 0\nZCorner 56632 28591 0\nZCorner 56638 28581 0\nZCorner 56644 28570 0\nZCorner 56649 28559 0\nZCorner 56655 28567 0\nZCorner 56661 28575 0\nZCorner 56667 28583 0\nZCorner 56673 28590 0\nZCorner 56681 28605 0\nZCorner 56689 28620 0\nZCorner 56696 28634 0\nZCorner 56704 28649 0\nZCorner 56705 28650 0\nZCorner 56706 28651 0\nZCorner 56707 28652 0\nZCorner 56708 28653 0\nZCorner 56711 28647 0\nZCorner 56714 28641 0\nZCorner 56717 28635 0\nZCorner 56720 28630 0\nZCorner 56755 28573 0\nZCorner 56790 28516 0\nZCorner 56825 28460 0\nZCorner 56860 28403 1\n$POLYSCORNERS\n56704 28758 0 0\n56712 28750 0 0\n56808 28588 0 0\n56855 28507 0 0\n56903 28426 0 0\n56893 28420 0 0\n56882 28415 0 0\n56860 28403 0 0\n56825 28460 0 0\n56790 28516 0 0\n56720 28630 0 0\n56717 28635 0 0\n56708 28653 0 0\n56704 28649 0 0\n56696 28634 0 0\n56689 28620 0 0\n56673 28590 0 0\n56667 28583 0 0\n56649 28559 0 0\n56644 28570 0 0\n56638 28581 0 0\n56632 28591 0 0\n56626 28602 0 0\n56636 28621 0 0\n56646 28639 0 0\n56655 28658 0 0\n56665 28676 0 0\n56667 28694 0 0\n56669 28711 0 0\n56673 28747 0 0\n56681 28749 0 0\n56689 28752 0 0\n56696 28755 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000B 0 \"\"\nZLayer 20\nZAux 37 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56958 28848 0\nZCorner 56943 28828 0\nZCorner 56929 28807 0\nZCorner 56914 28786 0\nZCorner 56900 28766 0\nZCorner 56906 28755 0\nZCorner 56913 28744 0\nZCorner 56920 28734 0\nZCorner 56927 28723 0\nZCorner 56941 28745 0\nZCorner 56956 28766 0\nZCorner 56971 28788 0\nZCorner 56985 28809 0\nZCorner 56990 28803 0\nZCorner 56995 28797 0\nZCorner 57000 28791 0\nZCorner 57005 28786 0\nZCorner 57034 28727 0\nZCorner 57064 28668 0\nZCorner 57093 28610 0\nZCorner 57122 28551 0\nZCorner 57134 28556 0\nZCorner 57146 28561 0\nZCorner 57157 28566 0\nZCorner 57169 28571 0\nZCorner 57127 28658 0\nZCorner 57085 28745 0\nZCorner 57043 28831 0\nZCorner 57001 28918 0\nZCorner 56992 28915 0\nZCorner 56983 28912 0\nZCorner 56975 28910 0\nZCorner 56966 28907 0\nZCorner 56964 28892 0\nZCorner 56962 28877 0\nZCorner 56960 28863 0\nZCorner 56958 28848 1\n$POLYSCORNERS\n57001 28918 0 0\n57043 28831 0 0\n57085 28745 0 0\n57169 28571 0 0\n57157 28566 0 0\n57146 28561 0 0\n57122 28551 0 0\n57093 28610 0 0\n57064 28668 0 0\n57034 28727 0 0\n57005 28786 0 0\n57000 28791 0 0\n56985 28809 0 0\n56971 28788 0 0\n56956 28766 0 0\n56941 28745 0 0\n56927 28723 0 0\n56920 28734 0 0\n56913 28744 0 0\n56906 28755 0 0\n56900 28766 0 0\n56914 28786 0 0\n56929 28807 0 0\n56943 28828 0 0\n56958 28848 0 0\n56960 28863 0 0\n56962 28877 0 0\n56966 28907 0 0\n56975 28910 0 0\n56983 28912 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000C 0 \"\"\nZLayer 20\nZAux 37 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 58707 22057 0\nZCorner 58717 22057 0\nZCorner 58727 22057 0\nZCorner 58737 22057 0\nZCorner 58747 22057 0\nZCorner 58766 22087 0\nZCorner 58790 22114 0\nZCorner 58817 22137 0\nZCorner 58848 22154 0\nZCorner 58851 22156 0\nZCorner 58854 22158 0\nZCorner 58857 22160 0\nZCorner 58860 22162 0\nZCorner 58859 22174 0\nZCorner 58858 22185 0\nZCorner 58857 22197 0\nZCorner 58856 22209 0\nZCorner 58841 22205 0\nZCorner 58821 22194 0\nZCorner 58794 22176 0\nZCorner 58762 22150 0\nZCorner 58762 22158 0\nZCorner 58762 22166 0\nZCorner 58762 22174 0\nZCorner 58762 22181 0\nZCorner 58756 22246 0\nZCorner 58751 22310 0\nZCorner 58745 22375 0\nZCorner 58739 22439 0\nZCorner 58726 22439 0\nZCorner 58713 22439 0\nZCorner 58701 22439 0\nZCorner 58688 22439 0\nZCorner 58693 22344 0\nZCorner 58698 22248 0\nZCorner 58703 22152 0\nZCorner 58707 22057 1\n$POLYSCORNERS\n58739 22439 0 0\n58745 22375 0 0\n58751 22310 0 0\n58756 22246 0 0\n58762 22181 0 0\n58762 22150 0 0\n58794 22176 0 0\n58821 22194 0 0\n58841 22205 0 0\n58856 22209 0 0\n58858 22185 0 0\n58859 22174 0 0\n58860 22162 0 0\n58848 22154 0 0\n58817 22137 0 0\n58790 22114 0 0\n58766 22087 0 0\n58747 22057 0 0\n58707 22057 0 0\n58703 22152 0 0\n58693 22344 0 0\n58688 22439 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000D 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59036 22092 0\nZCorner 59045 22092 0\nZCorner 59055 22092 0\nZCorner 59065 22092 0\nZCorner 59075 22092 0\nZCorner 59094 22128 0\nZCorner 59119 22159 0\nZCorner 59147 22186 0\nZCorner 59180 22209 0\nZCorner 59178 22220 0\nZCorner 59176 22232 0\nZCorner 59174 22244 0\nZCorner 59172 22256 0\nZCorner 59152 22247 0\nZCorner 59131 22233 0\nZCorner 59109 22213 0\nZCorner 59086 22189 0\nZCorner 59084 22196 0\nZCorner 59082 22203 0\nZCorner 59080 22210 0\nZCorner 59078 22217 0\nZCorner 59067 22282 0\nZCorner 59055 22347 0\nZCorner 59043 22413 0\nZCorner 59032 22478 0\nZCorner 59019 22476 0\nZCorner 59006 22474 0\nZCorner 58994 22472 0\nZCorner 58981 22471 0\nZCorner 58995 22376 0\nZCorner 59008 22281 0\nZCorner 59022 22186 0\nZCorner 59036 22092 1\n$POLYSCORNERS\n59032 22478 0 0\n59043 22413 0 0\n59055 22347 0 0\n59067 22282 0 0\n59078 22217 0 0\n59086 22189 0 0\n59109 22213 0 0\n59131 22233 0 0\n59152 22247 0 0\n59172 22256 0 0\n59178 22220 0 0\n59180 22209 0 0\n59147 22186 0 0\n59119 22159 0 0\n59094 22128 0 0\n59075 22092 0 0\n59036 22092 0 0\n59022 22186 0 0\n59008 22281 0 0\n58995 22376 0 0\n58981 22471 0 0\n58994 22472 0 0\n59006 22474 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000E 0 \"\"\nZLayer 20\nZAux 74 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59231 22424 0\nZCorner 59232 22414 0\nZCorner 59233 22404 0\nZCorner 59234 22394 0\nZCorner 59235 22385 0\nZCorner 59254 22275 0\nZCorner 59296 22203 0\nZCorner 59358 22169 0\nZCorner 59442 22174 0\nZCorner 59500 22229 0\nZCorner 59524 22300 0\nZCorner 59512 22387 0\nZCorner 59465 22490 0\nZCorner 59382 22543 0\nZCorner 59316 22549 0\nZCorner 59265 22509 0\nZCorner 59231 22424 1\nZCorner 59340 22232 0\nZCorner 59335 22245 0\nZCorner 59330 22258 0\nZCorner 59326 22270 0\nZCorner 59321 22283 0\nZCorner 59321 22283 0\nZCorner 59321 22283 0\nZCorner 59321 22283 0\nZCorner 59321 22283 0\nZCorner 59320 22285 0\nZCorner 59319 22287 0\nZCorner 59318 22289 0\nZCorner 59317 22291 0\nZCorner 59317 22293 0\nZCorner 59317 22295 0\nZCorner 59317 22297 0\nZCorner 59317 22299 0\nZCorner 59316 22299 0\nZCorner 59315 22299 0\nZCorner 59314 22299 0\nZCorner 59313 22299 0\nZCorner 59287 22395 0\nZCorner 59286 22463 0\nZCorner 59307 22502 0\nZCorner 59352 22513 0\nZCorner 59362 22509 0\nZCorner 59371 22506 0\nZCorner 59381 22502 0\nZCorner 59391 22498 0\nZCorner 59400 22486 0\nZCorner 59408 22474 0\nZCorner 59417 22463 0\nZCorner 59426 22451 0\nZCorner 59436 22418 0\nZCorner 59446 22384 0\nZCorner 59455 22351 0\nZCorner 59465 22318 0\nZCorner 59467 22305 0\nZCorner 59469 22293 0\nZCorner 59471 22280 0\nZCorner 59473 22267 0\nZCorner 59469 22259 0\nZCorner 59465 22252 0\nZCorner 59461 22244 0\nZCorner 59457 22236 0\nZCorner 59445 22229 0\nZCorner 59432 22222 0\nZCorner 59419 22215 0\nZCorner 59407 22209 0\nZCorner 59394 22211 0\nZCorner 59381 22213 0\nZCorner 59368 22214 0\nZCorner 59356 22216 0\nZCorner 59352 22220 0\nZCorner 59348 22224 0\nZCorner 59344 22228 0\nZCorner 59340 22232 1\n$POLYSCORNERS\n59316 22549 0 0\n59352 22545 0 0\n59352 22513 0 0\n59307 22502 0 0\n59286 22463 0 0\n59287 22395 0 0\n59313 22299 0 0\n59317 22299 0 0\n59317 22291 0 0\n59321 22283 0 0\n59326 22270 0 0\n59330 22258 0 0\n59340 22232 0 0\n59356 22216 0 0\n59368 22214 0 0\n59381 22213 0 0\n59407 22209 0 0\n59419 22215 0 0\n59445 22229 0 0\n59457 22236 0 0\n59465 22252 0 0\n59469 22259 0 0\n59473 22267 0 0\n59469 22293 0 0\n59467 22305 0 0\n59465 22318 0 0\n59455 22351 0 0\n59446 22384 0 0\n59436 22418 0 0\n59426 22451 0 0\n59417 22463 0 0\n59408 22474 0 0\n59400 22486 0 0\n59391 22498 0 0\n59371 22506 0 0\n59362 22509 0 0\n59352 22513 0 0\n59352 22545 0 0\n59382 22543 0 0\n59465 22490 0 0\n59512 22387 0 0\n59524 22300 0 0\n59500 22229 0 0\n59442 22174 0 0\n59358 22169 0 0\n59296 22203 0 0\n59254 22275 0 0\n59235 22385 0 0\n59234 22394 0 0\n59231 22424 0 0\n59265 22509 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000F 0 \"\"\nZLayer 20\nZAux 41 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59993 22385 0\nZCorner 60002 22387 0\nZCorner 60012 22390 0\nZCorner 60022 22393 0\nZCorner 60032 22396 0\nZCorner 60031 22416 0\nZCorner 60041 22446 0\nZCorner 60063 22486 0\nZCorner 60098 22537 0\nZCorner 60092 22548 0\nZCorner 60086 22558 0\nZCorner 60081 22569 0\nZCorner 60075 22580 0\nZCorner 60066 22570 0\nZCorner 60057 22560 0\nZCorner 60048 22551 0\nZCorner 60040 22541 0\nZCorner 60033 22529 0\nZCorner 60026 22517 0\nZCorner 60019 22506 0\nZCorner 60012 22494 0\nZCorner 60009 22495 0\nZCorner 60006 22496 0\nZCorner 60003 22497 0\nZCorner 60001 22498 0\nZCorner 60000 22503 0\nZCorner 59999 22508 0\nZCorner 59998 22512 0\nZCorner 59997 22517 0\nZCorner 59967 22576 0\nZCorner 59938 22635 0\nZCorner 59909 22693 0\nZCorner 59879 22752 0\nZCorner 59869 22747 0\nZCorner 59858 22742 0\nZCorner 59847 22737 0\nZCorner 59836 22732 0\nZCorner 59875 22645 0\nZCorner 59914 22558 0\nZCorner 59954 22471 0\nZCorner 59993 22385 1\n$POLYSCORNERS\n59879 22752 0 0\n59909 22693 0 0\n59938 22635 0 0\n59967 22576 0 0\n59997 22517 0 0\n59998 22512 0 0\n59999 22508 0 0\n60001 22498 0 0\n60003 22497 0 0\n60012 22494 0 0\n60019 22506 0 0\n60026 22517 0 0\n60040 22541 0 0\n60048 22551 0 0\n60057 22560 0 0\n60075 22580 0 0\n60081 22569 0 0\n60086 22558 0 0\n60092 22548 0 0\n60098 22537 0 0\n60063 22486 0 0\n60041 22446 0 0\n60031 22416 0 0\n60032 22396 0 0\n60002 22387 0 0\n59993 22385 0 0\n59954 22471 0 0\n59914 22558 0 0\n59836 22732 0 0\n59869 22747 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660010 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60137 22892 0\nZCorner 60126 22886 0\nZCorner 60116 22881 0\nZCorner 60105 22875 0\nZCorner 60094 22869 0\nZCorner 60143 22787 0\nZCorner 60192 22705 0\nZCorner 60240 22623 0\nZCorner 60289 22541 0\nZCorner 60298 22545 0\nZCorner 60307 22549 0\nZCorner 60316 22553 0\nZCorner 60324 22556 0\nZCorner 60323 22579 0\nZCorner 60331 22611 0\nZCorner 60348 22652 0\nZCorner 60375 22701 0\nZCorner 60369 22711 0\nZCorner 60363 22720 0\nZCorner 60358 22730 0\nZCorner 60352 22740 0\nZCorner 60346 22741 0\nZCorner 60334 22725 0\nZCorner 60317 22694 0\nZCorner 60293 22646 0\nZCorner 60289 22653 0\nZCorner 60285 22660 0\nZCorner 60281 22667 0\nZCorner 60278 22674 0\nZCorner 60242 22728 0\nZCorner 60207 22783 0\nZCorner 60172 22838 0\nZCorner 60137 22892 1\n$POLYSCORNERS\n60137 22892 0 0\n60172 22838 0 0\n60242 22728 0 0\n60278 22674 0 0\n60281 22667 0 0\n60293 22646 0 0\n60317 22694 0 0\n60334 22725 0 0\n60346 22741 0 0\n60352 22740 0 0\n60358 22730 0 0\n60363 22720 0 0\n60369 22711 0 0\n60375 22701 0 0\n60348 22652 0 0\n60331 22611 0 0\n60323 22579 0 0\n60324 22556 0 0\n60316 22553 0 0\n60289 22541 0 0\n60240 22623 0 0\n60192 22705 0 0\n60094 22869 0 0\n60116 22881 0 0\n60126 22886 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660011 0 \"\"\nZLayer 20\nZAux 46 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57181 22455 0\nZCorner 57180 22437 0\nZCorner 57179 22420 0\nZCorner 57178 22402 0\nZCorner 57177 22385 0\nZCorner 57197 22325 0\nZCorner 57233 22286 0\nZCorner 57286 22269 0\nZCorner 57356 22275 0\nZCorner 57408 22323 0\nZCorner 57445 22385 0\nZCorner 57468 22461 0\nZCorner 57477 22548 0\nZCorner 57434 22622 0\nZCorner 57379 22649 0\nZCorner 57312 22631 0\nZCorner 57231 22568 0\nZCorner 57219 22540 0\nZCorner 57206 22511 0\nZCorner 57193 22483 0\nZCorner 57181 22455 1\nZCorner 57376 22369 0\nZCorner 57325 22321 0\nZCorner 57283 22308 0\nZCorner 57250 22329 0\nZCorner 57228 22385 0\nZCorner 57230 22390 0\nZCorner 57232 22396 0\nZCorner 57234 22402 0\nZCorner 57236 22408 0\nZCorner 57237 22423 0\nZCorner 57239 22437 0\nZCorner 57241 22452 0\nZCorner 57243 22466 0\nZCorner 57245 22467 0\nZCorner 57247 22468 0\nZCorner 57249 22469 0\nZCorner 57251 22470 0\nZCorner 57276 22540 0\nZCorner 57309 22584 0\nZCorner 57349 22603 0\nZCorner 57396 22595 0\nZCorner 57422 22572 0\nZCorner 57427 22526 0\nZCorner 57411 22458 0\nZCorner 57376 22369 1\n$POLYSCORNERS\n57379 22649 0 0\n57434 22622 0 0\n57477 22548 0 0\n57468 22461 0 0\n57445 22385 0 0\n57408 22323 0 0\n57356 22275 0 0\n57286 22269 0 0\n57233 22286 0 0\n57197 22325 0 0\n57177 22385 0 0\n57178 22402 0 0\n57179 22420 0 0\n57180 22437 0 0\n57181 22455 0 0\n57193 22483 0 0\n57206 22511 0 0\n57219 22540 0 0\n57231 22568 0 0\n57312 22631 0 0\n57349 22640 0 0\n57349 22603 0 0\n57309 22584 0 0\n57276 22540 0 0\n57251 22470 0 0\n57243 22466 0 0\n57241 22452 0 0\n57239 22437 0 0\n57237 22423 0 0\n57236 22408 0 0\n57230 22390 0 0\n57228 22385 0 0\n57250 22329 0 0\n57283 22308 0 0\n57325 22321 0 0\n57376 22369 0 0\n57411 22458 0 0\n57427 22526 0 0\n57422 22572 0 0\n57396 22595 0 0\n57349 22603 0 0\n57349 22640 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660012 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57548 22178 0\nZCorner 57579 22201 0\nZCorner 57615 22219 0\nZCorner 57655 22232 0\nZCorner 57700 22240 0\nZCorner 57702 22251 0\nZCorner 57704 22261 0\nZCorner 57706 22272 0\nZCorner 57708 22283 0\nZCorner 57680 22277 0\nZCorner 57653 22271 0\nZCorner 57626 22265 0\nZCorner 57599 22259 0\nZCorner 57601 22267 0\nZCorner 57603 22275 0\nZCorner 57604 22283 0\nZCorner 57606 22291 0\nZCorner 57623 22354 0\nZCorner 57640 22418 0\nZCorner 57656 22481 0\nZCorner 57673 22545 0\nZCorner 57662 22547 0\nZCorner 57651 22550 0\nZCorner 57641 22553 0\nZCorner 57630 22556 0\nZCorner 57603 22463 0\nZCorner 57575 22371 0\nZCorner 57548 22278 0\nZCorner 57521 22185 0\nZCorner 57527 22183 0\nZCorner 57534 22181 0\nZCorner 57541 22179 0\nZCorner 57548 22178 1\n$POLYSCORNERS\n57630 22556 0 0\n57641 22553 0 0\n57651 22550 0 0\n57662 22547 0 0\n57673 22545 0 0\n57656 22481 0 0\n57640 22418 0 0\n57623 22354 0 0\n57606 22291 0 0\n57604 22283 0 0\n57603 22275 0 0\n57599 22259 0 0\n57680 22277 0 0\n57708 22283 0 0\n57704 22261 0 0\n57702 22251 0 0\n57700 22240 0 0\n57655 22232 0 0\n57615 22219 0 0\n57579 22201 0 0\n57548 22178 0 0\n57541 22179 0 0\n57527 22183 0 0\n57521 22185 0 0\n57575 22371 0 0\n57603 22463 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660013 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57845 22115 0\nZCorner 57853 22112 0\nZCorner 57862 22109 0\nZCorner 57871 22106 0\nZCorner 57880 22103 0\nZCorner 57905 22128 0\nZCorner 57935 22147 0\nZCorner 57970 22163 0\nZCorner 58009 22174 0\nZCorner 58012 22186 0\nZCorner 58016 22199 0\nZCorner 58020 22212 0\nZCorner 58024 22225 0\nZCorner 57998 22216 0\nZCorner 57971 22207 0\nZCorner 57945 22198 0\nZCorner 57919 22189 0\nZCorner 57919 22196 0\nZCorner 57919 22203 0\nZCorner 57919 22210 0\nZCorner 57919 22217 0\nZCorner 57929 22282 0\nZCorner 57940 22348 0\nZCorner 57951 22413 0\nZCorner 57962 22479 0\nZCorner 57951 22480 0\nZCorner 57940 22482 0\nZCorner 57929 22484 0\nZCorner 57919 22486 0\nZCorner 57900 22394 0\nZCorner 57882 22301 0\nZCorner 57863 22208 0\nZCorner 57845 22115 1\n$POLYSCORNERS\n57919 22486 0 0\n57929 22484 0 0\n57951 22480 0 0\n57962 22479 0 0\n57951 22413 0 0\n57940 22348 0 0\n57929 22282 0 0\n57919 22217 0 0\n57919 22189 0 0\n57971 22207 0 0\n57998 22216 0 0\n58024 22225 0 0\n58012 22186 0 0\n58009 22174 0 0\n57970 22163 0 0\n57935 22147 0 0\n57905 22128 0 0\n57880 22103 0 0\n57853 22112 0 0\n57845 22115 0 0\n57863 22208 0 0\n57882 22301 0 0\n57900 22394 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660014 0 \"\"\nZLayer 20\nZAux 54 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 58149 22385 0\nZCorner 58146 22381 0\nZCorner 58143 22377 0\nZCorner 58140 22373 0\nZCorner 58138 22369 0\nZCorner 58108 22248 0\nZCorner 58116 22156 0\nZCorner 58160 22092 0\nZCorner 58243 22057 0\nZCorner 58315 22071 0\nZCorner 58361 22126 0\nZCorner 58381 22222 0\nZCorner 58376 22357 0\nZCorner 58372 22364 0\nZCorner 58368 22371 0\nZCorner 58364 22378 0\nZCorner 58360 22385 0\nZCorner 58320 22433 0\nZCorner 58272 22449 0\nZCorner 58215 22433 0\nZCorner 58149 22385 1\nZCorner 58259 22096 0\nZCorner 58246 22098 0\nZCorner 58233 22099 0\nZCorner 58221 22101 0\nZCorner 58208 22103 0\nZCorner 58202 22109 0\nZCorner 58196 22115 0\nZCorner 58190 22121 0\nZCorner 58184 22127 0\nZCorner 58182 22140 0\nZCorner 58179 22154 0\nZCorner 58176 22168 0\nZCorner 58173 22181 0\nZCorner 58170 22272 0\nZCorner 58181 22340 0\nZCorner 58206 22385 0\nZCorner 58243 22408 0\nZCorner 58292 22391 0\nZCorner 58322 22351 0\nZCorner 58333 22288 0\nZCorner 58325 22201 0\nZCorner 58323 22190 0\nZCorner 58321 22179 0\nZCorner 58319 22169 0\nZCorner 58317 22158 0\nZCorner 58313 22150 0\nZCorner 58309 22142 0\nZCorner 58305 22135 0\nZCorner 58302 22127 0\nZCorner 58291 22119 0\nZCorner 58280 22111 0\nZCorner 58269 22103 0\nZCorner 58259 22096 1\n$POLYSCORNERS\n58272 22449 0 0\n58320 22433 0 0\n58360 22385 0 0\n58376 22357 0 0\n58381 22222 0 0\n58361 22126 0 0\n58315 22071 0 0\n58243 22057 0 0\n58160 22092 0 0\n58116 22156 0 0\n58108 22248 0 0\n58138 22369 0 0\n58140 22373 0 0\n58149 22385 0 0\n58215 22433 0 0\n58243 22440 0 0\n58243 22408 0 0\n58206 22385 0 0\n58181 22340 0 0\n58170 22272 0 0\n58173 22181 0 0\n58176 22168 0 0\n58182 22140 0 0\n58184 22127 0 0\n58208 22103 0 0\n58221 22101 0 0\n58233 22099 0 0\n58246 22098 0 0\n58259 22096 0 0\n58269 22103 0 0\n58302 22127 0 0\n58305 22135 0 0\n58309 22142 0 0\n58317 22158 0 0\n58319 22169 0 0\n58321 22179 0 0\n58325 22201 0 0\n58333 22288 0 0\n58322 22351 0 0\n58292 22391 0 0\n58243 22408 0 0\n58243 22440 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660015 0 \"\"\nZLayer 20\nZAux 41 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60567 22728 0\nZCorner 60575 22732 0\nZCorner 60584 22736 0\nZCorner 60593 22740 0\nZCorner 60602 22744 0\nZCorner 60599 22779 0\nZCorner 60605 22815 0\nZCorner 60617 22853 0\nZCorner 60637 22892 0\nZCorner 60631 22902 0\nZCorner 60625 22912 0\nZCorner 60619 22922 0\nZCorner 60613 22931 0\nZCorner 60604 22917 0\nZCorner 60594 22902 0\nZCorner 60584 22887 0\nZCorner 60574 22873 0\nZCorner 60571 22863 0\nZCorner 60568 22853 0\nZCorner 60566 22843 0\nZCorner 60563 22834 0\nZCorner 60559 22839 0\nZCorner 60555 22845 0\nZCorner 60551 22851 0\nZCorner 60547 22857 0\nZCorner 60546 22858 0\nZCorner 60545 22859 0\nZCorner 60544 22860 0\nZCorner 60543 22861 0\nZCorner 60503 22912 0\nZCorner 60463 22963 0\nZCorner 60423 23013 0\nZCorner 60383 23064 0\nZCorner 60372 23057 0\nZCorner 60361 23050 0\nZCorner 60351 23044 0\nZCorner 60340 23037 0\nZCorner 60397 22960 0\nZCorner 60453 22882 0\nZCorner 60510 22805 0\nZCorner 60567 22728 1\n$POLYSCORNERS\n60383 23064 0 0\n60423 23013 0 0\n60463 22963 0 0\n60543 22861 0 0\n60547 22857 0 0\n60559 22839 0 0\n60563 22834 0 0\n60566 22843 0 0\n60568 22853 0 0\n60574 22873 0 0\n60584 22887 0 0\n60604 22917 0 0\n60613 22931 0 0\n60619 22922 0 0\n60637 22892 0 0\n60617 22853 0 0\n60605 22815 0 0\n60599 22779 0 0\n60602 22744 0 0\n60575 22732 0 0\n60567 22728 0 0\n60453 22882 0 0\n60397 22960 0 0\n60340 23037 0 0\n60351 23044 0 0\n60361 23050 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660016 0 \"\"\nZLayer 20\nZAux 58 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60574 23150 0\nZCorner 60577 23140 0\nZCorner 60580 23131 0\nZCorner 60583 23121 0\nZCorner 60586 23111 0\nZCorner 60653 23015 0\nZCorner 60720 22956 0\nZCorner 60785 22935 0\nZCorner 60848 22951 0\nZCorner 60905 23006 0\nZCorner 60919 23071 0\nZCorner 60891 23146 0\nZCorner 60820 23232 0\nZCorner 60813 23237 0\nZCorner 60807 23242 0\nZCorner 60800 23247 0\nZCorner 60793 23252 0\nZCorner 60696 23285 0\nZCorner 60627 23278 0\nZCorner 60586 23233 0\nZCorner 60574 23150 1\nZCorner 60719 23029 0\nZCorner 60715 23034 0\nZCorner 60711 23039 0\nZCorner 60707 23044 0\nZCorner 60703 23048 0\nZCorner 60645 23113 0\nZCorner 60615 23166 0\nZCorner 60615 23208 0\nZCorner 60645 23240 0\nZCorner 60696 23241 0\nZCorner 60745 23222 0\nZCorner 60791 23183 0\nZCorner 60836 23123 0\nZCorner 60842 23117 0\nZCorner 60848 23111 0\nZCorner 60854 23105 0\nZCorner 60860 23099 0\nZCorner 60863 23088 0\nZCorner 60867 23076 0\nZCorner 60871 23064 0\nZCorner 60875 23052 0\nZCorner 60865 23038 0\nZCorner 60856 23023 0\nZCorner 60846 23009 0\nZCorner 60836 22994 0\nZCorner 60827 22991 0\nZCorner 60818 22988 0\nZCorner 60810 22985 0\nZCorner 60801 22982 0\nZCorner 60791 22984 0\nZCorner 60781 22986 0\nZCorner 60772 22988 0\nZCorner 60762 22990 0\nZCorner 60751 23000 0\nZCorner 60740 23009 0\nZCorner 60730 23019 0\nZCorner 60719 23029 1\n$POLYSCORNERS\n60696 23241 0 0\n60696 23285 0 0\n60793 23252 0 0\n60807 23242 0 0\n60813 23237 0 0\n60820 23232 0 0\n60891 23146 0 0\n60919 23071 0 0\n60905 23006 0 0\n60848 22951 0 0\n60785 22935 0 0\n60720 22956 0 0\n60653 23015 0 0\n60586 23111 0 0\n60580 23131 0 0\n60577 23140 0 0\n60574 23150 0 0\n60586 23233 0 0\n60627 23278 0 0\n60696 23285 0 0\n60696 23241 0 0\n60645 23240 0 0\n60615 23208 0 0\n60615 23166 0 0\n60645 23113 0 0\n60703 23048 0 0\n60707 23044 0 0\n60719 23029 0 0\n60730 23019 0 0\n60740 23009 0 0\n60751 23000 0 0\n60762 22990 0 0\n60772 22988 0 0\n60781 22986 0 0\n60801 22982 0 0\n60810 22985 0 0\n60818 22988 0 0\n60836 22994 0 0\n60846 23009 0 0\n60856 23023 0 0\n60865 23038 0 0\n60875 23052 0 0\n60863 23088 0 0\n60860 23099 0 0\n60836 23123 0 0\n60791 23183 0 0\n60745 23222 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660017 0 \"\"\nZLayer 20\nZAux 54 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57473 28774 0\nZCorner 57450 28898 0\nZCorner 57409 28982 0\nZCorner 57350 29028 0\nZCorner 57274 29036 0\nZCorner 57202 29003 0\nZCorner 57172 28939 0\nZCorner 57184 28844 0\nZCorner 57239 28719 0\nZCorner 57318 28663 0\nZCorner 57383 28653 0\nZCorner 57435 28690 0\nZCorner 57473 28774 1\nZCorner 57235 28871 0\nZCorner 57234 28878 0\nZCorner 57233 28885 0\nZCorner 57232 28892 0\nZCorner 57231 28899 0\nZCorner 57229 28908 0\nZCorner 57227 28916 0\nZCorner 57226 28925 0\nZCorner 57224 28934 0\nZCorner 57226 28942 0\nZCorner 57229 28950 0\nZCorner 57232 28957 0\nZCorner 57235 28965 0\nZCorner 57246 28972 0\nZCorner 57257 28979 0\nZCorner 57267 28986 0\nZCorner 57278 28992 0\nZCorner 57288 28992 0\nZCorner 57298 28992 0\nZCorner 57307 28992 0\nZCorner 57317 28992 0\nZCorner 57326 28988 0\nZCorner 57335 28983 0\nZCorner 57344 28978 0\nZCorner 57352 28973 0\nZCorner 57360 28959 0\nZCorner 57368 28946 0\nZCorner 57376 28932 0\nZCorner 57384 28918 0\nZCorner 57414 28822 0\nZCorner 57422 28752 0\nZCorner 57408 28708 0\nZCorner 57372 28692 0\nZCorner 57324 28705 0\nZCorner 57286 28739 0\nZCorner 57258 28793 0\nZCorner 57239 28868 0\nZCorner 57238 28869 0\nZCorner 57237 28869 0\nZCorner 57236 28870 0\nZCorner 57235 28871 1\n$POLYSCORNERS\n57274 29036 0 0\n57278 29035 0 0\n57278 28992 0 0\n57267 28986 0 0\n57257 28979 0 0\n57235 28965 0 0\n57232 28957 0 0\n57229 28950 0 0\n57226 28942 0 0\n57224 28934 0 0\n57226 28925 0 0\n57227 28916 0 0\n57229 28908 0 0\n57231 28899 0 0\n57235 28871 0 0\n57237 28869 0 0\n57238 28869 0 0\n57239 28868 0 0\n57258 28793 0 0\n57286 28739 0 0\n57324 28705 0 0\n57372 28692 0 0\n57408 28708 0 0\n57422 28752 0 0\n57414 28822 0 0\n57384 28918 0 0\n57368 28946 0 0\n57360 28959 0 0\n57352 28973 0 0\n57344 28978 0 0\n57326 28988 0 0\n57317 28992 0 0\n57278 28992 0 0\n57278 29035 0 0\n57350 29028 0 0\n57409 28982 0 0\n57450 28898 0 0\n57473 28774 0 0\n57435 28690 0 0\n57383 28653 0 0\n57318 28663 0 0\n57239 28719 0 0\n57184 28844 0 0\n57172 28939 0 0\n57202 29003 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660018 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57970 28824 0\nZCorner 57982 28826 0\nZCorner 57995 28828 0\nZCorner 58007 28830 0\nZCorner 58020 28832 0\nZCorner 58006 28927 0\nZCorner 57991 29022 0\nZCorner 57976 29117 0\nZCorner 57962 29211 0\nZCorner 57952 29210 0\nZCorner 57942 29209 0\nZCorner 57932 29208 0\nZCorner 57923 29207 0\nZCorner 57896 29165 0\nZCorner 57870 29132 0\nZCorner 57845 29108 0\nZCorner 57821 29094 0\nZCorner 57823 29083 0\nZCorner 57825 29071 0\nZCorner 57827 29059 0\nZCorner 57829 29047 0\nZCorner 57848 29054 0\nZCorner 57869 29067 0\nZCorner 57890 29087 0\nZCorner 57911 29114 0\nZCorner 57914 29107 0\nZCorner 57917 29100 0\nZCorner 57920 29093 0\nZCorner 57923 29086 0\nZCorner 57935 29021 0\nZCorner 57946 28955 0\nZCorner 57958 28890 0\nZCorner 57970 28824 1\n$POLYSCORNERS\n57962 29211 0 0\n57976 29117 0 0\n58006 28927 0 0\n58020 28832 0 0\n58007 28830 0 0\n57995 28828 0 0\n57982 28826 0 0\n57970 28824 0 0\n57958 28890 0 0\n57946 28955 0 0\n57935 29021 0 0\n57923 29086 0 0\n57911 29114 0 0\n57890 29087 0 0\n57869 29067 0 0\n57848 29054 0 0\n57829 29047 0 0\n57823 29083 0 0\n57821 29094 0 0\n57845 29108 0 0\n57870 29132 0 0\n57896 29165 0 0\n57923 29207 0 0\n57932 29208 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660019 0 \"\"\nZLayer 20\nZAux 37 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 58149 29145 0\nZCorner 58148 29132 0\nZCorner 58147 29120 0\nZCorner 58146 29107 0\nZCorner 58146 29094 0\nZCorner 58168 29109 0\nZCorner 58190 29123 0\nZCorner 58213 29138 0\nZCorner 58235 29153 0\nZCorner 58237 29152 0\nZCorner 58239 29151 0\nZCorner 58241 29150 0\nZCorner 58243 29149 0\nZCorner 58243 29143 0\nZCorner 58243 29137 0\nZCorner 58243 29131 0\nZCorner 58243 29125 0\nZCorner 58248 29059 0\nZCorner 58253 28993 0\nZCorner 58258 28926 0\nZCorner 58263 28860 0\nZCorner 58276 28861 0\nZCorner 58290 28862 0\nZCorner 58304 28863 0\nZCorner 58318 28864 0\nZCorner 58312 28960 0\nZCorner 58306 29057 0\nZCorner 58300 29154 0\nZCorner 58294 29250 0\nZCorner 58285 29250 0\nZCorner 58277 29250 0\nZCorner 58268 29250 0\nZCorner 58259 29250 0\nZCorner 58232 29213 0\nZCorner 58204 29183 0\nZCorner 58176 29161 0\nZCorner 58149 29145 1\n$POLYSCORNERS\n58294 29250 0 0\n58300 29154 0 0\n58312 28960 0 0\n58318 28864 0 0\n58276 28861 0 0\n58263 28860 0 0\n58258 28926 0 0\n58253 28993 0 0\n58243 29125 0 0\n58243 29149 0 0\n58235 29153 0 0\n58213 29138 0 0\n58190 29123 0 0\n58168 29109 0 0\n58146 29094 0 0\n58146 29107 0 0\n58147 29120 0 0\n58148 29132 0 0\n58149 29145 0 0\n58176 29161 0 0\n58204 29183 0 0\n58232 29213 0 0\n58259 29250 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001A 0 \"\"\nZLayer 20\nZAux 66 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57766 28844 0\nZCorner 57767 28848 0\nZCorner 57768 28852 0\nZCorner 57769 28856 0\nZCorner 57770 28860 0\nZCorner 57754 28986 0\nZCorner 57718 29074 0\nZCorner 57662 29123 0\nZCorner 57587 29133 0\nZCorner 57519 29112 0\nZCorner 57487 29055 0\nZCorner 57490 28961 0\nZCorner 57528 28832 0\nZCorner 57590 28765 0\nZCorner 57650 28744 0\nZCorner 57710 28769 0\nZCorner 57767 28840 0\nZCorner 57767 28841 0\nZCorner 57767 28842 0\nZCorner 57767 28843 0\nZCorner 57766 28844 1\nZCorner 57563 28871 0\nZCorner 57560 28881 0\nZCorner 57558 28891 0\nZCorner 57555 28901 0\nZCorner 57552 28910 0\nZCorner 57551 28911 0\nZCorner 57550 28912 0\nZCorner 57549 28913 0\nZCorner 57548 28914 0\nZCorner 57547 28929 0\nZCorner 57546 28944 0\nZCorner 57545 28958 0\nZCorner 57544 28973 0\nZCorner 57543 28973 0\nZCorner 57542 28973 0\nZCorner 57541 28973 0\nZCorner 57540 28973 0\nZCorner 57540 28979 0\nZCorner 57540 28985 0\nZCorner 57540 28990 0\nZCorner 57540 28996 0\nZCorner 57535 29035 0\nZCorner 57544 29065 0\nZCorner 57567 29086 0\nZCorner 57606 29098 0\nZCorner 57618 29093 0\nZCorner 57630 29088 0\nZCorner 57641 29083 0\nZCorner 57653 29078 0\nZCorner 57658 29072 0\nZCorner 57663 29065 0\nZCorner 57668 29058 0\nZCorner 57673 29051 0\nZCorner 57675 29044 0\nZCorner 57677 29037 0\nZCorner 57679 29031 0\nZCorner 57681 29024 0\nZCorner 57706 28954 0\nZCorner 57716 28894 0\nZCorner 57711 28844 0\nZCorner 57692 28805 0\nZCorner 57653 28787 0\nZCorner 57619 28793 0\nZCorner 57589 28821 0\nZCorner 57563 28871 1\n$POLYSCORNERS\n57587 29133 0 0\n57606 29130 0 0\n57606 29098 0 0\n57567 29086 0 0\n57544 29065 0 0\n57535 29035 0 0\n57540 28996 0 0\n57540 28973 0 0\n57544 28973 0 0\n57545 28958 0 0\n57546 28944 0 0\n57548 28914 0 0\n57552 28910 0 0\n57555 28901 0 0\n57558 28891 0 0\n57560 28881 0 0\n57563 28871 0 0\n57589 28821 0 0\n57619 28793 0 0\n57653 28787 0 0\n57692 28805 0 0\n57711 28844 0 0\n57716 28894 0 0\n57706 28954 0 0\n57681 29024 0 0\n57679 29031 0 0\n57677 29037 0 0\n57673 29051 0 0\n57658 29072 0 0\n57653 29078 0 0\n57641 29083 0 0\n57630 29088 0 0\n57606 29098 0 0\n57606 29130 0 0\n57662 29123 0 0\n57718 29074 0 0\n57754 28986 0 0\n57770 28860 0 0\n57766 28844 0 0\n57767 28843 0 0\n57767 28840 0 0\n57710 28769 0 0\n57650 28744 0 0\n57590 28765 0 0\n57528 28832 0 0\n57490 28961 0 0\n57487 29055 0 0\n57519 29112 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001B 0 \"\"\nZLayer 20\nZAux 54 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59817 28684 0\nZCorner 59823 28601 0\nZCorner 59861 28553 0\nZCorner 59929 28540 0\nZCorner 60028 28563 0\nZCorner 60096 28673 0\nZCorner 60127 28763 0\nZCorner 60118 28834 0\nZCorner 60071 28887 0\nZCorner 59975 28897 0\nZCorner 59902 28868 0\nZCorner 59850 28802 0\nZCorner 59821 28700 0\nZCorner 59820 28698 0\nZCorner 59819 28696 0\nZCorner 59818 28694 0\nZCorner 59817 28692 0\nZCorner 59817 28690 0\nZCorner 59817 28688 0\nZCorner 59817 28686 0\nZCorner 59817 28684 1\nZCorner 60059 28735 0\nZCorner 60019 28646 0\nZCorner 59978 28591 0\nZCorner 59935 28568 0\nZCorner 59891 28579 0\nZCorner 59871 28633 0\nZCorner 59871 28690 0\nZCorner 59892 28752 0\nZCorner 59934 28817 0\nZCorner 59939 28824 0\nZCorner 59944 28830 0\nZCorner 59949 28837 0\nZCorner 59953 28844 0\nZCorner 59962 28849 0\nZCorner 59971 28854 0\nZCorner 59980 28859 0\nZCorner 59989 28864 0\nZCorner 60002 28862 0\nZCorner 60016 28860 0\nZCorner 60030 28858 0\nZCorner 60043 28856 0\nZCorner 60052 28844 0\nZCorner 60061 28832 0\nZCorner 60070 28821 0\nZCorner 60078 28809 0\nZCorner 60076 28792 0\nZCorner 60074 28776 0\nZCorner 60073 28759 0\nZCorner 60071 28743 0\nZCorner 60068 28741 0\nZCorner 60065 28739 0\nZCorner 60062 28737 0\nZCorner 60059 28735 1\n$POLYSCORNERS\n59975 28897 0 0\n59989 28895 0 0\n59989 28864 0 0\n59953 28844 0 0\n59949 28837 0 0\n59944 28830 0 0\n59939 28824 0 0\n59934 28817 0 0\n59892 28752 0 0\n59871 28690 0 0\n59871 28633 0 0\n59891 28579 0 0\n59935 28568 0 0\n59978 28591 0 0\n60019 28646 0 0\n60059 28735 0 0\n60071 28743 0 0\n60073 28759 0 0\n60074 28776 0 0\n60076 28792 0 0\n60078 28809 0 0\n60070 28821 0 0\n60061 28832 0 0\n60043 28856 0 0\n60030 28858 0 0\n60002 28862 0 0\n59989 28864 0 0\n59989 28895 0 0\n60071 28887 0 0\n60118 28834 0 0\n60127 28763 0 0\n60096 28673 0 0\n60028 28563 0 0\n59929 28540 0 0\n59861 28553 0 0\n59823 28601 0 0\n59817 28684 0 0\n59817 28692 0 0\n59821 28700 0 0\n59850 28802 0 0\n59902 28868 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001C 0 \"\"\nZLayer 20\nZAux 66 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59743 28684 0\nZCorner 59743 28686 0\nZCorner 59743 28688 0\nZCorner 59743 28690 0\nZCorner 59743 28692 0\nZCorner 59746 28694 0\nZCorner 59748 28696 0\nZCorner 59751 28698 0\nZCorner 59754 28700 0\nZCorner 59811 28834 0\nZCorner 59830 28934 0\nZCorner 59811 28998 0\nZCorner 59754 29028 0\nZCorner 59661 29022 0\nZCorner 59593 28982 0\nZCorner 59550 28908 0\nZCorner 59532 28801 0\nZCorner 59551 28713 0\nZCorner 59593 28663 0\nZCorner 59657 28654 0\nZCorner 59743 28684 1\nZCorner 59688 28704 0\nZCorner 59680 28701 0\nZCorner 59672 28698 0\nZCorner 59665 28695 0\nZCorner 59657 28692 0\nZCorner 59608 28707 0\nZCorner 59583 28742 0\nZCorner 59583 28797 0\nZCorner 59606 28872 0\nZCorner 59613 28888 0\nZCorner 59620 28905 0\nZCorner 59627 28922 0\nZCorner 59633 28938 0\nZCorner 59639 28947 0\nZCorner 59645 28956 0\nZCorner 59651 28964 0\nZCorner 59657 28973 0\nZCorner 59665 28978 0\nZCorner 59672 28983 0\nZCorner 59680 28988 0\nZCorner 59688 28993 0\nZCorner 59701 28992 0\nZCorner 59713 28991 0\nZCorner 59726 28990 0\nZCorner 59739 28989 0\nZCorner 59749 28979 0\nZCorner 59758 28969 0\nZCorner 59768 28959 0\nZCorner 59778 28950 0\nZCorner 59779 28937 0\nZCorner 59780 28924 0\nZCorner 59781 28912 0\nZCorner 59782 28899 0\nZCorner 59779 28894 0\nZCorner 59776 28889 0\nZCorner 59773 28884 0\nZCorner 59770 28879 0\nZCorner 59756 28844 0\nZCorner 59743 28809 0\nZCorner 59729 28774 0\nZCorner 59715 28739 0\nZCorner 59708 28730 0\nZCorner 59702 28721 0\nZCorner 59695 28712 0\nZCorner 59688 28704 1\n$POLYSCORNERS\n59754 29028 0 0\n59811 28998 0 0\n59830 28934 0 0\n59811 28834 0 0\n59754 28700 0 0\n59748 28696 0 0\n59746 28694 0 0\n59743 28692 0 0\n59743 28684 0 0\n59657 28654 0 0\n59593 28663 0 0\n59551 28713 0 0\n59532 28801 0 0\n59550 28908 0 0\n59593 28982 0 0\n59661 29022 0 0\n59688 29023 0 0\n59688 28993 0 0\n59672 28983 0 0\n59665 28978 0 0\n59657 28973 0 0\n59651 28964 0 0\n59645 28956 0 0\n59633 28938 0 0\n59627 28922 0 0\n59613 28888 0 0\n59606 28872 0 0\n59583 28797 0 0\n59583 28742 0 0\n59608 28707 0 0\n59657 28692 0 0\n59665 28695 0 0\n59672 28698 0 0\n59688 28704 0 0\n59695 28712 0 0\n59702 28721 0 0\n59708 28730 0 0\n59715 28739 0 0\n59743 28809 0 0\n59756 28844 0 0\n59770 28879 0 0\n59782 28899 0 0\n59781 28912 0 0\n59780 28924 0 0\n59778 28950 0 0\n59768 28959 0 0\n59758 28969 0 0\n59749 28979 0 0\n59739 28989 0 0\n59713 28991 0 0\n59701 28992 0 0\n59688 28993 0 0\n59688 29023 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001D 0 \"\"\nZLayer 20\nZAux 37 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59379 28747 0\nZCorner 59406 28838 0\nZCorner 59432 28930 0\nZCorner 59458 29022 0\nZCorner 59485 29114 0\nZCorner 59476 29116 0\nZCorner 59467 29118 0\nZCorner 59459 29120 0\nZCorner 59450 29122 0\nZCorner 59428 29105 0\nZCorner 59397 29089 0\nZCorner 59357 29075 0\nZCorner 59309 29063 0\nZCorner 59307 29052 0\nZCorner 59305 29041 0\nZCorner 59303 29031 0\nZCorner 59301 29020 0\nZCorner 59328 29027 0\nZCorner 59354 29034 0\nZCorner 59380 29040 0\nZCorner 59407 29047 0\nZCorner 59408 29047 0\nZCorner 59409 29047 0\nZCorner 59410 29047 0\nZCorner 59411 29047 0\nZCorner 59410 29040 0\nZCorner 59409 29034 0\nZCorner 59408 29027 0\nZCorner 59407 29020 0\nZCorner 59388 28954 0\nZCorner 59370 28889 0\nZCorner 59351 28824 0\nZCorner 59332 28758 0\nZCorner 59344 28755 0\nZCorner 59356 28752 0\nZCorner 59368 28749 0\nZCorner 59379 28747 1\n$POLYSCORNERS\n59450 29122 0 0\n59459 29120 0 0\n59467 29118 0 0\n59485 29114 0 0\n59458 29022 0 0\n59406 28838 0 0\n59379 28747 0 0\n59368 28749 0 0\n59332 28758 0 0\n59351 28824 0 0\n59370 28889 0 0\n59388 28954 0 0\n59407 29020 0 0\n59409 29034 0 0\n59410 29040 0 0\n59411 29047 0 0\n59407 29047 0 0\n59380 29040 0 0\n59354 29034 0 0\n59328 29027 0 0\n59301 29020 0 0\n59303 29031 0 0\n59305 29041 0 0\n59309 29063 0 0\n59357 29075 0 0\n59397 29089 0 0\n59428 29105 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001E 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59043 28824 0\nZCorner 59055 28823 0\nZCorner 59067 28821 0\nZCorner 59079 28819 0\nZCorner 59090 28817 0\nZCorner 59108 28911 0\nZCorner 59125 29006 0\nZCorner 59143 29101 0\nZCorner 59160 29196 0\nZCorner 59151 29197 0\nZCorner 59141 29197 0\nZCorner 59131 29198 0\nZCorner 59121 29199 0\nZCorner 59100 29175 0\nZCorner 59071 29155 0\nZCorner 59034 29138 0\nZCorner 58989 29125 0\nZCorner 58987 29113 0\nZCorner 58985 29102 0\nZCorner 58983 29090 0\nZCorner 58981 29078 0\nZCorner 59007 29087 0\nZCorner 59033 29096 0\nZCorner 59060 29105 0\nZCorner 59086 29113 0\nZCorner 59087 29108 0\nZCorner 59088 29102 0\nZCorner 59089 29096 0\nZCorner 59090 29090 0\nZCorner 59078 29024 0\nZCorner 59067 28957 0\nZCorner 59055 28891 0\nZCorner 59043 28824 1\n$POLYSCORNERS\n59121 29199 0 0\n59141 29197 0 0\n59151 29197 0 0\n59160 29196 0 0\n59143 29101 0 0\n59125 29006 0 0\n59108 28911 0 0\n59090 28817 0 0\n59079 28819 0 0\n59055 28823 0 0\n59043 28824 0 0\n59055 28891 0 0\n59067 28957 0 0\n59078 29024 0 0\n59090 29090 0 0\n59087 29108 0 0\n59086 29113 0 0\n59060 29105 0 0\n59033 29096 0 0\n58981 29078 0 0\n58985 29102 0 0\n58987 29113 0 0\n58989 29125 0 0\n59034 29138 0 0\n59071 29155 0 0\n59100 29175 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001F 0 \"\"\nZLayer 20\nZAux 62 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60356 28395 0\nZCorner 60345 28298 0\nZCorner 60371 28238 0\nZCorner 60436 28214 0\nZCorner 60539 28227 0\nZCorner 60632 28328 0\nZCorner 60675 28416 0\nZCorner 60670 28490 0\nZCorner 60617 28551 0\nZCorner 60544 28570 0\nZCorner 60476 28551 0\nZCorner 60414 28493 0\nZCorner 60356 28395 1\nZCorner 60617 28489 0\nZCorner 60620 28477 0\nZCorner 60623 28465 0\nZCorner 60626 28454 0\nZCorner 60629 28442 0\nZCorner 60623 28430 0\nZCorner 60617 28419 0\nZCorner 60612 28407 0\nZCorner 60606 28395 0\nZCorner 60553 28318 0\nZCorner 60505 28268 0\nZCorner 60462 28245 0\nZCorner 60422 28247 0\nZCorner 60415 28254 0\nZCorner 60408 28260 0\nZCorner 60402 28267 0\nZCorner 60395 28274 0\nZCorner 60393 28280 0\nZCorner 60391 28286 0\nZCorner 60389 28292 0\nZCorner 60387 28297 0\nZCorner 60387 28307 0\nZCorner 60387 28317 0\nZCorner 60387 28327 0\nZCorner 60387 28336 0\nZCorner 60404 28365 0\nZCorner 60420 28393 0\nZCorner 60437 28421 0\nZCorner 60453 28450 0\nZCorner 60461 28458 0\nZCorner 60469 28467 0\nZCorner 60477 28476 0\nZCorner 60485 28485 0\nZCorner 60486 28486 0\nZCorner 60487 28487 0\nZCorner 60487 28488 0\nZCorner 60488 28489 0\nZCorner 60498 28496 0\nZCorner 60508 28504 0\nZCorner 60518 28512 0\nZCorner 60527 28520 0\nZCorner 60540 28521 0\nZCorner 60553 28522 0\nZCorner 60566 28523 0\nZCorner 60578 28524 0\nZCorner 60588 28515 0\nZCorner 60598 28506 0\nZCorner 60608 28497 0\nZCorner 60617 28489 1\n$POLYSCORNERS\n60544 28570 0 0\n60578 28561 0 0\n60578 28524 0 0\n60566 28523 0 0\n60527 28520 0 0\n60518 28512 0 0\n60498 28496 0 0\n60488 28489 0 0\n60487 28488 0 0\n60487 28487 0 0\n60485 28485 0 0\n60461 28458 0 0\n60453 28450 0 0\n60437 28421 0 0\n60420 28393 0 0\n60404 28365 0 0\n60387 28336 0 0\n60387 28297 0 0\n60389 28292 0 0\n60395 28274 0 0\n60402 28267 0 0\n60408 28260 0 0\n60415 28254 0 0\n60422 28247 0 0\n60462 28245 0 0\n60505 28268 0 0\n60553 28318 0 0\n60606 28395 0 0\n60612 28407 0 0\n60617 28419 0 0\n60623 28430 0 0\n60629 28442 0 0\n60626 28454 0 0\n60623 28465 0 0\n60617 28489 0 0\n60608 28497 0 0\n60578 28524 0 0\n60578 28561 0 0\n60617 28551 0 0\n60670 28490 0 0\n60675 28416 0 0\n60632 28328 0 0\n60539 28227 0 0\n60436 28214 0 0\n60371 28238 0 0\n60345 28298 0 0\n60356 28395 0 0\n60414 28493 0 0\n60476 28551 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660020 0 \"\"\nZLayer 20\nZAux 78 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60750 28016 0\nZCorner 60754 28019 0\nZCorner 60758 28020 0\nZCorner 60764 28022 0\nZCorner 60770 28024 0\nZCorner 60802 28055 0\nZCorner 60834 28087 0\nZCorner 60866 28118 0\nZCorner 60899 28149 0\nZCorner 60916 28178 0\nZCorner 60923 28213 0\nZCorner 60918 28253 0\nZCorner 60902 28297 0\nZCorner 60847 28354 0\nZCorner 60779 28361 0\nZCorner 60700 28318 0\nZCorner 60609 28223 0\nZCorner 60599 28206 0\nZCorner 60589 28188 0\nZCorner 60581 28169 0\nZCorner 60574 28149 0\nZCorner 60573 28138 0\nZCorner 60572 28128 0\nZCorner 60571 28117 0\nZCorner 60570 28106 0\nZCorner 60597 28052 0\nZCorner 60635 28019 0\nZCorner 60686 28007 0\nZCorner 60750 28016 1\nZCorner 60879 28231 0\nZCorner 60872 28217 0\nZCorner 60865 28204 0\nZCorner 60858 28190 0\nZCorner 60852 28176 0\nZCorner 60850 28175 0\nZCorner 60848 28174 0\nZCorner 60846 28173 0\nZCorner 60844 28172 0\nZCorner 60844 28172 0\nZCorner 60844 28171 0\nZCorner 60844 28170 0\nZCorner 60844 28169 0\nZCorner 60840 28165 0\nZCorner 60836 28161 0\nZCorner 60832 28157 0\nZCorner 60828 28153 0\nZCorner 60759 28080 0\nZCorner 60701 28049 0\nZCorner 60656 28058 0\nZCorner 60621 28106 0\nZCorner 60623 28120 0\nZCorner 60625 28134 0\nZCorner 60627 28147 0\nZCorner 60629 28161 0\nZCorner 60648 28184 0\nZCorner 60666 28208 0\nZCorner 60685 28231 0\nZCorner 60703 28255 0\nZCorner 60713 28263 0\nZCorner 60723 28270 0\nZCorner 60732 28278 0\nZCorner 60742 28286 0\nZCorner 60755 28294 0\nZCorner 60768 28302 0\nZCorner 60780 28310 0\nZCorner 60793 28317 0\nZCorner 60804 28316 0\nZCorner 60814 28315 0\nZCorner 60825 28314 0\nZCorner 60836 28313 0\nZCorner 60843 28308 0\nZCorner 60850 28302 0\nZCorner 60856 28296 0\nZCorner 60863 28290 0\nZCorner 60867 28275 0\nZCorner 60871 28261 0\nZCorner 60875 28246 0\nZCorner 60879 28231 1\n$POLYSCORNERS\n60779 28361 0 0\n60793 28359 0 0\n60793 28317 0 0\n60780 28310 0 0\n60768 28302 0 0\n60742 28286 0 0\n60732 28278 0 0\n60723 28270 0 0\n60713 28263 0 0\n60703 28255 0 0\n60685 28231 0 0\n60666 28208 0 0\n60648 28184 0 0\n60629 28161 0 0\n60627 28147 0 0\n60625 28134 0 0\n60621 28106 0 0\n60656 28058 0 0\n60701 28049 0 0\n60759 28080 0 0\n60828 28153 0 0\n60844 28169 0 0\n60844 28172 0 0\n60852 28176 0 0\n60858 28190 0 0\n60865 28204 0 0\n60872 28217 0 0\n60879 28231 0 0\n60871 28261 0 0\n60867 28275 0 0\n60863 28290 0 0\n60856 28296 0 0\n60850 28302 0 0\n60843 28308 0 0\n60836 28313 0 0\n60814 28315 0 0\n60804 28316 0 0\n60793 28317 0 0\n60793 28359 0 0\n60847 28354 0 0\n60902 28297 0 0\n60918 28253 0 0\n60923 28213 0 0\n60916 28178 0 0\n60899 28149 0 0\n60866 28118 0 0\n60834 28087 0 0\n60802 28055 0 0\n60770 28024 0 0\n60758 28020 0 0\n60754 28019 0 0\n60750 28016 0 0\n60686 28007 0 0\n60635 28019 0 0\n60597 28052 0 0\n60570 28106 0 0\n60572 28128 0 0\n60573 28138 0 0\n60574 28149 0 0\n60581 28169 0 0\n60589 28188 0 0\n60599 28206 0 0\n60609 28223 0 0\n60700 28318 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660021 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60149 28403 0\nZCorner 60159 28397 0\nZCorner 60170 28391 0\nZCorner 60181 28385 0\nZCorner 60192 28379 0\nZCorner 60243 28458 0\nZCorner 60295 28536 0\nZCorner 60347 28614 0\nZCorner 60399 28692 0\nZCorner 60393 28698 0\nZCorner 60387 28704 0\nZCorner 60381 28709 0\nZCorner 60375 28715 0\nZCorner 60337 28703 0\nZCorner 60298 28697 0\nZCorner 60258 28694 0\nZCorner 60215 28696 0\nZCorner 60209 28687 0\nZCorner 60204 28678 0\nZCorner 60198 28669 0\nZCorner 60192 28661 0\nZCorner 60219 28659 0\nZCorner 60247 28657 0\nZCorner 60274 28655 0\nZCorner 60301 28653 0\nZCorner 60298 28647 0\nZCorner 60295 28641 0\nZCorner 60292 28635 0\nZCorner 60290 28629 0\nZCorner 60254 28573 0\nZCorner 60219 28516 0\nZCorner 60184 28459 0\nZCorner 60149 28403 1\n$POLYSCORNERS\n60375 28715 0 0\n60381 28709 0 0\n60387 28704 0 0\n60399 28692 0 0\n60243 28458 0 0\n60192 28379 0 0\n60159 28397 0 0\n60149 28403 0 0\n60184 28459 0 0\n60254 28573 0 0\n60290 28629 0 0\n60292 28635 0 0\n60301 28653 0 0\n60247 28657 0 0\n60219 28659 0 0\n60192 28661 0 0\n60198 28669 0 0\n60204 28678 0 0\n60209 28687 0 0\n60215 28696 0 0\n60258 28694 0 0\n60298 28697 0 0\n60337 28703 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660022 0 \"\"\nZLayer 20\nZAux 82 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 58665 28887 0\nZCorner 58668 28883 0\nZCorner 58672 28879 0\nZCorner 58676 28875 0\nZCorner 58680 28871 0\nZCorner 58694 28867 0\nZCorner 58708 28862 0\nZCorner 58721 28857 0\nZCorner 58735 28852 0\nZCorner 58744 28852 0\nZCorner 58753 28852 0\nZCorner 58761 28852 0\nZCorner 58770 28852 0\nZCorner 58782 28857 0\nZCorner 58794 28862 0\nZCorner 58805 28867 0\nZCorner 58817 28871 0\nZCorner 58828 28883 0\nZCorner 58839 28895 0\nZCorner 58849 28907 0\nZCorner 58860 28918 0\nZCorner 58887 29050 0\nZCorner 58886 29148 0\nZCorner 58858 29212 0\nZCorner 58801 29242 0\nZCorner 58709 29237 0\nZCorner 58649 29190 0\nZCorner 58620 29102 0\nZCorner 58622 28973 0\nZCorner 58623 28970 0\nZCorner 58624 28967 0\nZCorner 58625 28964 0\nZCorner 58626 28961 0\nZCorner 58626 28960 0\nZCorner 58626 28959 0\nZCorner 58626 28958 0\nZCorner 58626 28957 0\nZCorner 58636 28940 0\nZCorner 58645 28922 0\nZCorner 58655 28905 0\nZCorner 58665 28887 1\nZCorner 58786 29207 0\nZCorner 58794 29201 0\nZCorner 58803 29194 0\nZCorner 58812 29187 0\nZCorner 58821 29180 0\nZCorner 58823 29175 0\nZCorner 58825 29170 0\nZCorner 58827 29165 0\nZCorner 58829 29161 0\nZCorner 58830 29149 0\nZCorner 58831 29137 0\nZCorner 58832 29125 0\nZCorner 58833 29114 0\nZCorner 58833 29112 0\nZCorner 58833 29110 0\nZCorner 58833 29108 0\nZCorner 58833 29106 0\nZCorner 58833 29103 0\nZCorner 58834 29100 0\nZCorner 58835 29097 0\nZCorner 58836 29094 0\nZCorner 58825 28987 0\nZCorner 58801 28919 0\nZCorner 58766 28889 0\nZCorner 58719 28899 0\nZCorner 58689 28931 0\nZCorner 58674 28981 0\nZCorner 58674 29048 0\nZCorner 58688 29133 0\nZCorner 58694 29147 0\nZCorner 58700 29161 0\nZCorner 58706 29174 0\nZCorner 58711 29188 0\nZCorner 58715 29190 0\nZCorner 58719 29192 0\nZCorner 58723 29194 0\nZCorner 58727 29196 0\nZCorner 58742 29199 0\nZCorner 58756 29202 0\nZCorner 58771 29204 0\nZCorner 58786 29207 1\n$POLYSCORNERS\n58801 29242 0 0\n58858 29212 0 0\n58886 29148 0 0\n58887 29050 0 0\n58860 28918 0 0\n58849 28907 0 0\n58839 28895 0 0\n58817 28871 0 0\n58805 28867 0 0\n58794 28862 0 0\n58770 28852 0 0\n58735 28852 0 0\n58721 28857 0 0\n58708 28862 0 0\n58694 28867 0 0\n58680 28871 0 0\n58668 28883 0 0\n58665 28887 0 0\n58655 28905 0 0\n58645 28922 0 0\n58636 28940 0 0\n58626 28957 0 0\n58626 28961 0 0\n58622 28973 0 0\n58620 29102 0 0\n58649 29190 0 0\n58709 29237 0 0\n58786 29241 0 0\n58786 29207 0 0\n58771 29204 0 0\n58756 29202 0 0\n58742 29199 0 0\n58727 29196 0 0\n58711 29188 0 0\n58706 29174 0 0\n58700 29161 0 0\n58688 29133 0 0\n58674 29048 0 0\n58674 28981 0 0\n58689 28931 0 0\n58719 28899 0 0\n58766 28889 0 0\n58801 28919 0 0\n58825 28987 0 0\n58836 29094 0 0\n58833 29103 0 0\n58833 29114 0 0\n58832 29125 0 0\n58829 29161 0 0\n58827 29165 0 0\n58821 29180 0 0\n58794 29201 0 0\n58786 29207 0 0\n58786 29241 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660023 0 \"\"\nZLayer 20\nZAux 62 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59524 22541 0\nZCorner 59524 22540 0\nZCorner 59524 22539 0\nZCorner 59524 22538 0\nZCorner 59524 22537 0\nZCorner 59525 22529 0\nZCorner 59526 22521 0\nZCorner 59527 22513 0\nZCorner 59528 22506 0\nZCorner 59534 22475 0\nZCorner 59541 22445 0\nZCorner 59548 22415 0\nZCorner 59555 22385 0\nZCorner 59606 22305 0\nZCorner 59664 22267 0\nZCorner 59730 22270 0\nZCorner 59805 22314 0\nZCorner 59826 22360 0\nZCorner 59825 22422 0\nZCorner 59801 22499 0\nZCorner 59754 22592 0\nZCorner 59676 22638 0\nZCorner 59611 22645 0\nZCorner 59560 22612 0\nZCorner 59524 22541 1\nZCorner 59621 22385 0\nZCorner 59621 22385 0\nZCorner 59621 22386 0\nZCorner 59621 22387 0\nZCorner 59621 22388 0\nZCorner 59588 22465 0\nZCorner 59575 22527 0\nZCorner 59583 22572 0\nZCorner 59614 22603 0\nZCorner 59660 22607 0\nZCorner 59702 22577 0\nZCorner 59738 22513 0\nZCorner 59770 22416 0\nZCorner 59771 22408 0\nZCorner 59772 22400 0\nZCorner 59773 22392 0\nZCorner 59774 22385 0\nZCorner 59745 22329 0\nZCorner 59712 22308 0\nZCorner 59673 22321 0\nZCorner 59629 22369 0\nZCorner 59628 22370 0\nZCorner 59627 22371 0\nZCorner 59626 22372 0\nZCorner 59625 22373 0\nZCorner 59624 22375 0\nZCorner 59623 22377 0\nZCorner 59622 22379 0\nZCorner 59621 22381 0\nZCorner 59621 22382 0\nZCorner 59621 22383 0\nZCorner 59621 22384 0\nZCorner 59621 22385 0\nZCorner 59621 22385 0\nZCorner 59621 22385 0\nZCorner 59621 22385 0\nZCorner 59621 22385 1\n$POLYSCORNERS\n59611 22645 0 0\n59660 22639 0 0\n59660 22607 0 0\n59614 22603 0 0\n59583 22572 0 0\n59575 22527 0 0\n59588 22465 0 0\n59621 22388 0 0\n59621 22381 0 0\n59625 22373 0 0\n59629 22369 0 0\n59673 22321 0 0\n59712 22308 0 0\n59745 22329 0 0\n59774 22385 0 0\n59773 22392 0 0\n59770 22416 0 0\n59738 22513 0 0\n59702 22577 0 0\n59660 22607 0 0\n59660 22639 0 0\n59676 22638 0 0\n59754 22592 0 0\n59801 22499 0 0\n59825 22422 0 0\n59826 22360 0 0\n59805 22314 0 0\n59730 22270 0 0\n59664 22267 0 0\n59606 22305 0 0\n59555 22385 0 0\n59534 22475 0 0\n59528 22506 0 0\n59527 22513 0 0\n59524 22537 0 0\n59524 22541 0 0\n59560 22612 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E176 0 \"\"\nZLayer 21\nZAux 26 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 48804 23098 0\nZCorner 48804 23838 0\nZCorner 49190 23838 0\nZCorner 49190 24582 0\nZCorner 48804 24582 0\nZCorner 48804 27097 0\nZCorner 48816 27458 0\nZCorner 48851 27614 0\nZCorner 48975 27654 0\nZCorner 49250 27667 0\nZCorner 49250 28425 0\nZCorner 48673 28425 0\nZCorner 48254 28415 0\nZCorner 47975 28384 0\nZCorner 47778 28317 0\nZCorner 47607 28196 0\nZCorner 47477 28039 0\nZCorner 47408 27860 0\nZCorner 47379 27542 0\nZCorner 47369 26969 0\nZCorner 47369 24582 0\nZCorner 47061 24582 0\nZCorner 47061 23838 0\nZCorner 47369 23838 0\nZCorner 47369 23098 0\nZCorner 48804 23098 1\n$POLYSCORNERS\n49250 28425 0 0\n49250 27667 0 0\n48975 27654 0 0\n48851 27614 0 0\n48816 27458 0 0\n48804 27097 0 0\n48804 24582 0 0\n49190 24582 0 0\n49190 23838 0 0\n48804 23838 0 0\n48804 23098 0 0\n47369 23098 0 0\n47369 23838 0 0\n47061 23838 0 0\n47061 24582 0 0\n47369 24582 0 0\n47369 26969 0 0\n47379 27542 0 0\n47408 27860 0 0\n47477 28039 0 0\n47607 28196 0 0\n47778 28317 0 0\n47975 28384 0 0\n48254 28415 0 0\n48673 28425 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E177 0 \"\"\nZLayer 21\nZAux 58 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 52624 25376 0\nZCorner 52624 25951 0\nZCorner 52624 26526 0\nZCorner 52608 27076 0\nZCorner 52560 27456 0\nZCorner 52460 27742 0\nZCorner 52288 28009 0\nZCorner 52049 28232 0\nZCorner 51751 28387 0\nZCorner 51399 28479 0\nZCorner 50999 28510 0\nZCorner 50561 28484 0\nZCorner 50195 28405 0\nZCorner 49902 28274 0\nZCorner 49683 28090 0\nZCorner 49527 27857 0\nZCorner 49423 27580 0\nZCorner 49364 27206 0\nZCorner 49345 26682 0\nZCorner 49345 26080 0\nZCorner 49345 25478 0\nZCorner 49380 24895 0\nZCorner 49486 24455 0\nZCorner 49685 24123 0\nZCorner 49996 23864 0\nZCorner 50416 23696 0\nZCorner 50938 23640 0\nZCorner 51386 23676 0\nZCorner 51765 23784 0\nZCorner 52071 23949 0\nZCorner 52298 24157 0\nZCorner 52457 24391 0\nZCorner 52555 24632 0\nZCorner 52607 24940 0\nZCorner 52624 25376 1\nZCorner 51193 25021 0\nZCorner 51184 24727 0\nZCorner 51155 24566 0\nZCorner 51094 24496 0\nZCorner 50988 24472 0\nZCorner 50882 24496 0\nZCorner 50818 24566 0\nZCorner 50786 24727 0\nZCorner 50776 25021 0\nZCorner 50776 26082 0\nZCorner 50776 27143 0\nZCorner 50786 27418 0\nZCorner 50818 27576 0\nZCorner 50881 27652 0\nZCorner 50985 27677 0\nZCorner 51090 27654 0\nZCorner 51153 27585 0\nZCorner 51183 27440 0\nZCorner 51194 27189 0\nZCorner 51194 26105 0\nZCorner 51194 25021 0\nZCorner 51194 25021 0\nZCorner 51193 25021 1\n$POLYSCORNERS\n50999 28510 0 0\n51399 28479 0 0\n51751 28387 0 0\n52049 28232 0 0\n52288 28009 0 0\n52460 27742 0 0\n52560 27456 0 0\n52608 27076 0 0\n52624 26526 0 0\n52624 25376 0 0\n52607 24940 0 0\n52555 24632 0 0\n52457 24391 0 0\n52298 24157 0 0\n52071 23949 0 0\n51765 23784 0 0\n51386 23676 0 0\n50938 23640 0 0\n50416 23696 0 0\n49996 23864 0 0\n49685 24123 0 0\n49486 24455 0 0\n49380 24895 0 0\n49345 25478 0 0\n49345 26682 0 0\n49364 27206 0 0\n49423 27580 0 0\n49527 27857 0 0\n49683 28090 0 0\n49902 28274 0 0\n50195 28405 0 0\n50561 28484 0 0\n50985 28509 0 0\n50985 27677 0 0\n50881 27652 0 0\n50818 27576 0 0\n50786 27418 0 0\n50776 27143 0 0\n50776 25021 0 0\n50786 24727 0 0\n50818 24566 0 0\n50882 24496 0 0\n50988 24472 0 0\n51094 24496 0 0\n51155 24566 0 0\n51184 24727 0 0\n51193 25021 0 0\n51194 25021 0 0\n51194 27189 0 0\n51183 27440 0 0\n51153 27585 0 0\n51090 27654 0 0\n50985 27677 0 0\n50985 28509 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E178 0 \"\"\nZLayer 21\nZAux 56 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56332 25376 0\nZCorner 56332 25951 0\nZCorner 56332 26526 0\nZCorner 56316 27076 0\nZCorner 56268 27456 0\nZCorner 56168 27742 0\nZCorner 55996 28009 0\nZCorner 55757 28232 0\nZCorner 55459 28387 0\nZCorner 55107 28479 0\nZCorner 54707 28510 0\nZCorner 54268 28484 0\nZCorner 53903 28405 0\nZCorner 53610 28274 0\nZCorner 53391 28090 0\nZCorner 53235 27857 0\nZCorner 53131 27580 0\nZCorner 53072 27206 0\nZCorner 53053 26682 0\nZCorner 53053 26080 0\nZCorner 53053 25478 0\nZCorner 53088 24895 0\nZCorner 53194 24455 0\nZCorner 53393 24123 0\nZCorner 53704 23864 0\nZCorner 54124 23696 0\nZCorner 54646 23640 0\nZCorner 55094 23676 0\nZCorner 55473 23784 0\nZCorner 55779 23949 0\nZCorner 56006 24157 0\nZCorner 56164 24391 0\nZCorner 56263 24632 0\nZCorner 56315 24940 0\nZCorner 56332 25376 1\nZCorner 54901 25021 0\nZCorner 54892 24727 0\nZCorner 54862 24566 0\nZCorner 54801 24496 0\nZCorner 54696 24472 0\nZCorner 54590 24496 0\nZCorner 54526 24566 0\nZCorner 54494 24727 0\nZCorner 54483 25021 0\nZCorner 54483 26082 0\nZCorner 54483 27143 0\nZCorner 54494 27418 0\nZCorner 54526 27576 0\nZCorner 54589 27652 0\nZCorner 54692 27677 0\nZCorner 54798 27654 0\nZCorner 54861 27585 0\nZCorner 54891 27440 0\nZCorner 54901 27189 0\nZCorner 54901 26105 0\nZCorner 54901 25021 1\n$POLYSCORNERS\n54707 28510 0 0\n55107 28479 0 0\n55459 28387 0 0\n55757 28232 0 0\n55996 28009 0 0\n56168 27742 0 0\n56268 27456 0 0\n56316 27076 0 0\n56332 26526 0 0\n56332 25376 0 0\n56315 24940 0 0\n56263 24632 0 0\n56164 24391 0 0\n56006 24157 0 0\n55779 23949 0 0\n55473 23784 0 0\n55094 23676 0 0\n54646 23640 0 0\n54124 23696 0 0\n53704 23864 0 0\n53393 24123 0 0\n53194 24455 0 0\n53088 24895 0 0\n53053 25478 0 0\n53053 26682 0 0\n53072 27206 0 0\n53131 27580 0 0\n53235 27857 0 0\n53391 28090 0 0\n53610 28274 0 0\n53903 28405 0 0\n54268 28484 0 0\n54692 28509 0 0\n54692 27677 0 0\n54589 27652 0 0\n54526 27576 0 0\n54494 27418 0 0\n54483 27143 0 0\n54483 25021 0 0\n54494 24727 0 0\n54526 24566 0 0\n54590 24496 0 0\n54696 24472 0 0\n54801 24496 0 0\n54862 24566 0 0\n54892 24727 0 0\n54901 25021 0 0\n54901 27189 0 0\n54891 27440 0 0\n54861 27585 0 0\n54798 27654 0 0\n54692 27677 0 0\n54692 28509 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E179 0 \"\"\nZLayer 21\nZAux 17 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 58984 23725 0\nZCorner 58984 28425 0\nZCorner 57553 28425 0\nZCorner 57553 26569 0\nZCorner 57511 25696 0\nZCorner 57432 25527 0\nZCorner 57284 25400 0\nZCorner 57048 25321 0\nZCorner 56707 25294 0\nZCorner 56707 23640 0\nZCorner 56985 23699 0\nZCorner 57228 23836 0\nZCorner 57436 24050 0\nZCorner 57610 24343 0\nZCorner 57553 23725 0\nZCorner 58984 23725 0\nZCorner 58984 23725 1\n$POLYSCORNERS\n58984 28425 0 0\n58984 23725 0 0\n57553 23725 0 0\n57610 24343 0 0\n57436 24050 0 0\n57228 23836 0 0\n56985 23699 0 0\n56707 23640 0 0\n56707 25294 0 0\n57048 25321 0 0\n57284 25400 0 0\n57432 25527 0 0\n57511 25696 0 0\n57553 26569 0 0\n57553 28425 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E17A 0 \"\"\nZLayer 21\nZAux 49 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 62562 25499 0\nZCorner 61212 25499 0\nZCorner 61212 24958 0\nZCorner 61201 24720 0\nZCorner 61166 24573 0\nZCorner 61101 24498 0\nZCorner 60996 24472 0\nZCorner 60893 24495 0\nZCorner 60830 24561 0\nZCorner 60798 24705 0\nZCorner 60787 24958 0\nZCorner 60787 27174 0\nZCorner 60803 27395 0\nZCorner 60851 27552 0\nZCorner 60930 27646 0\nZCorner 61038 27677 0\nZCorner 61160 27645 0\nZCorner 61235 27546 0\nZCorner 61274 27357 0\nZCorner 61286 27051 0\nZCorner 61286 26491 0\nZCorner 62561 26491 0\nZCorner 62549 26984 0\nZCorner 62520 27336 0\nZCorner 62443 27621 0\nZCorner 62283 27913 0\nZCorner 62053 28172 0\nZCorner 61761 28359 0\nZCorner 61401 28472 0\nZCorner 60964 28509 0\nZCorner 60422 28458 0\nZCorner 60005 28302 0\nZCorner 59702 28054 0\nZCorner 59503 27721 0\nZCorner 59393 27270 0\nZCorner 59356 26661 0\nZCorner 59356 25326 0\nZCorner 59386 24801 0\nZCorner 59477 24423 0\nZCorner 59665 24135 0\nZCorner 59990 23879 0\nZCorner 60426 23700 0\nZCorner 60946 23640 0\nZCorner 61465 23699 0\nZCorner 61902 23877 0\nZCorner 62233 24146 0\nZCorner 62430 24476 0\nZCorner 62529 24912 0\nZCorner 62562 25499 1\n$POLYSCORNERS\n60964 28509 0 0\n61401 28472 0 0\n61761 28359 0 0\n62053 28172 0 0\n62283 27913 0 0\n62443 27621 0 0\n62520 27336 0 0\n62549 26984 0 0\n62561 26491 0 0\n61286 26491 0 0\n61286 27051 0 0\n61274 27357 0 0\n61235 27546 0 0\n61160 27645 0 0\n61038 27677 0 0\n60930 27646 0 0\n60851 27552 0 0\n60803 27395 0 0\n60787 27174 0 0\n60787 24958 0 0\n60798 24705 0 0\n60830 24561 0 0\n60893 24495 0 0\n60996 24472 0 0\n61101 24498 0 0\n61166 24573 0 0\n61201 24720 0 0\n61212 24958 0 0\n61212 25499 0 0\n62562 25499 0 0\n62529 24912 0 0\n62430 24476 0 0\n62233 24146 0 0\n61902 23877 0 0\n61465 23699 0 0\n60946 23640 0 0\n60426 23700 0 0\n59990 23879 0 0\n59665 24135 0 0\n59477 24423 0 0\n59386 24801 0 0\n59356 25326 0 0\n59356 26661 0 0\n59393 27270 0 0\n59503 27721 0 0\n59702 28054 0 0\n60005 28302 0 0\n60422 28458 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E17B 0 \"\"\nZLayer 21\nZAux 56 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 66106 25376 0\nZCorner 66106 25951 0\nZCorner 66106 26526 0\nZCorner 66090 27076 0\nZCorner 66042 27456 0\nZCorner 65942 27742 0\nZCorner 65770 28009 0\nZCorner 65531 28232 0\nZCorner 65233 28387 0\nZCorner 64881 28479 0\nZCorner 64480 28510 0\nZCorner 64042 28484 0\nZCorner 63676 28405 0\nZCorner 63384 28274 0\nZCorner 63165 28090 0\nZCorner 63008 27857 0\nZCorner 62904 27580 0\nZCorner 62846 27206 0\nZCorner 62826 26682 0\nZCorner 62826 26080 0\nZCorner 62826 25478 0\nZCorner 62862 24895 0\nZCorner 62968 24455 0\nZCorner 63166 24123 0\nZCorner 63478 23864 0\nZCorner 63898 23696 0\nZCorner 64420 23640 0\nZCorner 64868 23676 0\nZCorner 65247 23784 0\nZCorner 65553 23949 0\nZCorner 65780 24157 0\nZCorner 65938 24391 0\nZCorner 66036 24632 0\nZCorner 66088 24940 0\nZCorner 66106 25376 1\nZCorner 64675 25021 0\nZCorner 64666 24727 0\nZCorner 64636 24566 0\nZCorner 64575 24496 0\nZCorner 64469 24472 0\nZCorner 64364 24496 0\nZCorner 64299 24566 0\nZCorner 64268 24727 0\nZCorner 64257 25021 0\nZCorner 64257 26082 0\nZCorner 64257 27143 0\nZCorner 64268 27418 0\nZCorner 64299 27576 0\nZCorner 64363 27652 0\nZCorner 64466 27677 0\nZCorner 64572 27654 0\nZCorner 64634 27585 0\nZCorner 64665 27440 0\nZCorner 64675 27189 0\nZCorner 64675 26105 0\nZCorner 64675 25021 1\n$POLYSCORNERS\n64480 28510 0 0\n64881 28479 0 0\n65233 28387 0 0\n65531 28232 0 0\n65770 28009 0 0\n65942 27742 0 0\n66042 27456 0 0\n66090 27076 0 0\n66106 26526 0 0\n66106 25376 0 0\n66088 24940 0 0\n66036 24632 0 0\n65938 24391 0 0\n65780 24157 0 0\n65553 23949 0 0\n65247 23784 0 0\n64868 23676 0 0\n64420 23640 0 0\n63898 23696 0 0\n63478 23864 0 0\n63166 24123 0 0\n62968 24455 0 0\n62862 24895 0 0\n62826 25478 0 0\n62826 26682 0 0\n62846 27206 0 0\n62904 27580 0 0\n63008 27857 0 0\n63165 28090 0 0\n63384 28274 0 0\n63676 28405 0 0\n64042 28484 0 0\n64466 28509 0 0\n64466 27677 0 0\n64363 27652 0 0\n64299 27576 0 0\n64268 27418 0 0\n64257 27143 0 0\n64257 25021 0 0\n64268 24727 0 0\n64299 24566 0 0\n64364 24496 0 0\n64469 24472 0 0\n64575 24496 0 0\n64636 24566 0 0\n64666 24727 0 0\n64675 25021 0 0\n64675 27189 0 0\n64665 27440 0 0\n64634 27585 0 0\n64572 27654 0 0\n64466 27677 0 0\n64466 28509 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E17C 0 \"\"\nZLayer 21\nZAux 27 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 68032 23725 0\nZCorner 68008 24158 0\nZCorner 68181 23932 0\nZCorner 68388 23770 0\nZCorner 68630 23673 0\nZCorner 68907 23640 0\nZCorner 69242 23684 0\nZCorner 69509 23814 0\nZCorner 69701 24010 0\nZCorner 69810 24251 0\nZCorner 69861 24603 0\nZCorner 69877 25131 0\nZCorner 69877 28425 0\nZCorner 68447 28425 0\nZCorner 68447 25170 0\nZCorner 68439 24780 0\nZCorner 68415 24579 0\nZCorner 68355 24499 0\nZCorner 68238 24472 0\nZCorner 68114 24503 0\nZCorner 68047 24595 0\nZCorner 68017 24819 0\nZCorner 68008 25248 0\nZCorner 68008 28425 0\nZCorner 66577 28425 0\nZCorner 66577 23725 0\nZCorner 68032 23725 1\n$POLYSCORNERS\n69877 28425 0 0\n69877 25131 0 0\n69861 24603 0 0\n69810 24251 0 0\n69701 24010 0 0\n69509 23814 0 0\n69242 23684 0 0\n68907 23640 0 0\n68630 23673 0 0\n68388 23770 0 0\n68181 23932 0 0\n68008 24158 0 0\n68032 23725 0 0\n66577 23725 0 0\n66577 28425 0 0\n68008 28425 0 0\n68008 25248 0 0\n68017 24819 0 0\n68047 24595 0 0\n68114 24503 0 0\n68238 24472 0 0\n68355 24499 0 0\n68415 24579 0 0\n68439 24780 0 0\n68447 25170 0 0\n68447 28425 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$EndBOARD\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Schematic/Volume.sch",
    "content": "EESchema Schematic File Version 2\nLIBS:mfk_alps\nLIBS:mfk_connector\nLIBS:mfk_interface\nLIBS:power\nLIBS:device\nLIBS:transistors\nLIBS:conn\nLIBS:linear\nLIBS:regul\nLIBS:74xx\nLIBS:cmos4000\nLIBS:adc-dac\nLIBS:memory\nLIBS:xilinx\nLIBS:special\nLIBS:microcontrollers\nLIBS:dsp\nLIBS:microchip\nLIBS:analog_switches\nLIBS:motorola\nLIBS:texas\nLIBS:intel\nLIBS:audio\nLIBS:interface\nLIBS:digital-audio\nLIBS:philips\nLIBS:display\nLIBS:cypress\nLIBS:siliconi\nLIBS:opto\nLIBS:atmel\nLIBS:contrib\nLIBS:valves\nLIBS:Volume-AlpsRK16814MG-cache\nEELAYER 27 0\nEELAYER END\n$Descr A 11000 8500\nencoding utf-8\nSheet 1 1\nTitle \"ALPS RK16816MG with H-bridge\"\nDate \"4 apr 2015\"\nRev \"\"\nComp \"Mithat Konar\"\nComment1 \"Copyright (C) 2015 Mithat Konar\"\nComment2 \"CERN Open Hardware Licence v1.2\"\nComment3 \"\"\nComment4 \"\"\n$EndDescr\n$Comp\nL SN754410 U1\nU 1 1 550CA683\nP 7600 4650\nF 0 \"U1\" H 7600 5350 60  0000 C CNN\nF 1 \"SN754410\" H 7600 4000 60  0000 C CNN\nF 2 \"mfk-DIP-16_AriesC84_e\" H 7600 4650 60  0001 C CNN\nF 3 \"~\" H 7600 4650 60  0000 C CNN\n\t1    7600 4650\n\t1    0    0    -1  \n$EndComp\n$Comp\nL DGND #PWR01\nU 1 1 550CA83D\nP 8450 5500\nF 0 \"#PWR01\" H 8450 5500 40  0001 C CNN\nF 1 \"DGND\" H 8450 5430 40  0000 C CNN\nF 2 \"\" H 8450 5500 60  0000 C CNN\nF 3 \"\" H 8450 5500 60  0000 C CNN\n\t1    8450 5500\n\t1    0    0    -1  \n$EndComp\n$Comp\nL DGND #PWR02\nU 1 1 550CA86E\nP 6600 5300\nF 0 \"#PWR02\" H 6600 5300 40  0001 C CNN\nF 1 \"DGND\" H 6600 5230 40  0000 C CNN\nF 2 \"\" H 6600 5300 60  0000 C CNN\nF 3 \"\" H 6600 5300 60  0000 C CNN\n\t1    6600 5300\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t6900 4550 6600 4550\nWire Wire Line\n\t6600 4550 6600 5300\nWire Wire Line\n\t6900 4700 6600 4700\nConnection ~ 6600 4700\nWire Wire Line\n\t8300 4550 8450 4550\nWire Wire Line\n\t8450 4250 8450 5500\nWire Wire Line\n\t8300 4700 8450 4700\nConnection ~ 8450 4700\nWire Wire Line\n\t3900 4450 4600 4450\nWire Wire Line\n\t4400 4450 4400 4400\nWire Wire Line\n\t4600 4450 4600 4400\nWire Wire Line\n\t4400 5250 4400 5500\nWire Wire Line\n\t4600 5400 4600 5250\nWire Wire Line\n\t5700 4200 5700 4150\nWire Wire Line\n\t5700 4150 6150 4150\nWire Wire Line\n\t6150 4400 6900 4400\nWire Wire Line\n\t5700 4850 6900 4850\nWire Wire Line\n\t5700 4800 5700 4850\nWire Wire Line\n\t8300 4250 8450 4250\nConnection ~ 8450 4550\nWire Wire Line\n\t6400 4250 6900 4250\nWire Wire Line\n\t6400 3250 6400 4250\nWire Wire Line\n\t6750 3750 8450 3750\nWire Wire Line\n\t8300 5000 8450 5000\nWire Wire Line\n\t8300 4100 8700 4100\nWire Wire Line\n\t6750 5150 6900 5150\n$Comp\nL C C1\nU 1 1 550CAD46\nP 8700 4350\nF 0 \"C1\" H 8700 4450 40  0000 L CNN\nF 1 \"100n\" H 8706 4265 40  0000 L CNN\nF 2 \"mfk-C_4.0_2.5_2.5_0.5\" H 8738 4200 30  0001 C CNN\nF 3 \"~\" H 8700 4350 60  0000 C CNN\n\t1    8700 4350\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t8700 4100 8700 4150\n$Comp\nL DGND #PWR03\nU 1 1 550CADFB\nP 8700 4700\nF 0 \"#PWR03\" H 8700 4700 40  0001 C CNN\nF 1 \"DGND\" H 8700 4630 40  0000 C CNN\nF 2 \"\" H 8700 4700 60  0000 C CNN\nF 3 \"\" H 8700 4700 60  0000 C CNN\n\t1    8700 4700\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t8700 4700 8700 4550\nText Label 6400 3250 3    50   ~ 0\nVOL_UP\nText Label 6400 6150 1    50   ~ 0\nVOL_DOWN\n$Comp\nL DGND #PWR04\nU 1 1 550CB0E4\nP 3150 2100\nF 0 \"#PWR04\" H 3150 2100 40  0001 C CNN\nF 1 \"DGND\" H 3150 2030 40  0000 C CNN\nF 2 \"\" H 3150 2100 60  0000 C CNN\nF 3 \"\" H 3150 2100 60  0000 C CNN\n\t1    3150 2100\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3650 1350 3650 1800\nWire Wire Line\n\t3100 2450 3850 2450\nText Label 3850 2450 2    50   ~ 0\nVOL_UP\nWire Wire Line\n\t3100 2650 3850 2650\nText Label 3850 2650 2    50   ~ 0\nVOL_DOWN\n$Comp\nL PWR_FLAG #FLG05\nU 1 1 550CB3B3\nP 3400 2000\nF 0 \"#FLG05\" H 3400 2095 30  0001 C CNN\nF 1 \"PWR_FLAG\" H 3400 2180 30  0000 C CNN\nF 2 \"\" H 3400 2000 60  0000 C CNN\nF 3 \"\" H 3400 2000 60  0000 C CNN\n\t1    3400 2000\n\t-1   0    0    1   \n$EndComp\n$Comp\nL PWR_FLAG #FLG06\nU 1 1 550CB3CC\nP 3900 1650\nF 0 \"#FLG06\" H 3900 1745 30  0001 C CNN\nF 1 \"PWR_FLAG\" H 3900 1830 30  0000 C CNN\nF 2 \"\" H 3900 1650 60  0000 C CNN\nF 3 \"\" H 3900 1650 60  0000 C CNN\n\t1    3900 1650\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3150 1900 3100 1900\nWire Wire Line\n\t3150 1900 3150 2100\nWire Wire Line\n\t3900 1650 3650 1650\nConnection ~ 3650 1650\nWire Wire Line\n\t3400 2000 3150 2000\nConnection ~ 3150 2000\n$Comp\nL CONN_2 P4\nU 1 1 550CCCA8\nP 2750 2550\nF 0 \"P4\" V 2700 2550 50  0000 C CNN\nF 1 \"CTRL\" V 2800 2550 50  0000 C CNN\nF 2 \"mfk-TE_282834-2\" H 2750 2550 60  0001 C CNN\nF 3 \"\" H 2750 2550 60  0000 C CNN\n\t1    2750 2550\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t4150 3250 4150 3850\n$Comp\nL CONN_5 P1\nU 1 1 550CCE69\nP 2750 3450\nF 0 \"P1\" V 2700 3450 50  0000 C CNN\nF 1 \"AB I/O\" V 2800 3450 50  0000 C CNN\nF 2 \"mfk-TE_282834-5\" H 2750 3450 60  0001 C CNN\nF 3 \"\" H 2750 3450 60  0000 C CNN\n\t1    2750 3450\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3150 3250 4150 3250\nWire Wire Line\n\t4300 4100 4350 4100\nWire Wire Line\n\t4350 4100 4350 3350\nWire Wire Line\n\t4350 3350 3150 3350\nText Label 3150 3250 0    50   ~ 0\nA_TOP\nText Label 3150 3350 0    50   ~ 0\nA_WIPER\nText Label 3150 3550 0    50   ~ 0\nB_TOP\nText Label 3150 3650 0    50   ~ 0\nB_WIPER\n$Comp\nL CONN_5 P2\nU 1 1 550CCF9F\nP 2800 4800\nF 0 \"P2\" V 2750 4800 50  0000 C CNN\nF 1 \"CD I/O\" V 2850 4800 50  0000 C CNN\nF 2 \"mfk-TE_282834-5\" H 2800 4800 60  0001 C CNN\nF 3 \"\" H 2800 4800 60  0000 C CNN\n\t1    2800 4800\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3200 4600 4150 4600\nWire Wire Line\n\t3200 4700 3900 4700\nWire Wire Line\n\t3200 4900 3700 4900\nWire Wire Line\n\t5100 4950 5100 5700\nWire Wire Line\n\t5100 4950 4950 4950\nWire Wire Line\n\t3200 4800 3800 4800\nWire Wire Line\n\t5000 4600 5000 5600\nWire Wire Line\n\t5000 4600 4800 4600\nWire Wire Line\n\t4800 4600 4800 4700\nWire Wire Line\n\t4300 5400 4300 4950\nText Label 3200 4600 0    50   ~ 0\nC_TOP\nWire Wire Line\n\t3900 5400 4300 5400\nWire Wire Line\n\t4400 5400 4600 5400\nWire Wire Line\n\t3900 4700 3900 5400\n$Comp\nL RK16814MG RV1\nU 1 1 550CA765\nP 4500 4500\nF 0 \"RV1\" H 5850 5250 50  0000 C CNN\nF 1 \"RK16814MG\" H 5700 3600 50  0000 C CNN\nF 2 \"mfk-ALPS_RK16814MG\" V 4800 4900 60  0001 C CNN\nF 3 \"~\" V 4800 4900 60  0000 C CNN\n\t1    4500 4500\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t4150 4600 4150 4700\nText Label 3200 4700 0    50   ~ 0\nC_WIPER\nText Label 3200 4900 0    50   ~ 0\nD_TOP\nText Label 3200 5000 0    50   ~ 0\nD_WIPER\nWire Wire Line\n\t3900 3450 3900 4450\nConnection ~ 4400 4450\nConnection ~ 4400 5400\nText Label 3150 3450 0    50   ~ 0\nAB_COMMON\nWire Wire Line\n\t3600 5000 3200 5000\nText Label 3200 4800 0    50   ~ 0\nCD_COMMON\n$Comp\nL +5VD #PWR07\nU 1 1 550CE6FC\nP 7600 3650\nF 0 \"#PWR07\" H 7600 3600 20  0001 C CNN\nF 1 \"+5VD\" H 7600 3750 50  0000 C CNN\nF 2 \"\" H 7600 3650 60  0000 C CNN\nF 3 \"\" H 7600 3650 60  0000 C CNN\n\t1    7600 3650\n\t1    0    0    -1  \n$EndComp\n$Comp\nL +5VD #PWR08\nU 1 1 550CE733\nP 3650 1350\nF 0 \"#PWR08\" H 3650 1300 20  0001 C CNN\nF 1 \"+5VD\" H 3650 1450 50  0000 C CNN\nF 2 \"\" H 3650 1350 60  0000 C CNN\nF 3 \"\" H 3650 1350 60  0000 C CNN\n\t1    3650 1350\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3900 3450 3150 3450\nWire Wire Line\n\t4800 3850 4800 3550\nWire Wire Line\n\t4800 3550 3150 3550\nWire Wire Line\n\t4950 4100 5000 4100\nWire Wire Line\n\t5000 4100 5000 3650\nWire Wire Line\n\t5000 3650 3150 3650\nWire Wire Line\n\t3600 5000 3600 5700\nWire Wire Line\n\t3700 4900 3700 5600\nWire Wire Line\n\t3800 4800 3800 5500\nWire Wire Line\n\t3800 5500 4400 5500\nWire Wire Line\n\t3700 5600 5000 5600\nWire Wire Line\n\t3600 5700 5100 5700\n$Bitmap\nPos 10300 6850\nScale 1.000000\nData\n89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 5F 00 00 00 64 08 06 00 00 00 E0 F1 EC \n9B 00 00 00 04 73 42 49 54 08 08 08 08 7C 08 64 88 00 00 00 09 70 48 59 73 00 00 07 6C 00 00 07 \n6C 01 9C F3 D5 25 00 00 13 B3 49 44 41 54 78 9C ED 9D 7B 7C 54 D5 B5 C7 BF EB CC 04 C2 43 1E 5A \n45 D0 2A F6 FA 82 52 A0 6A D5 D6 5A B1 3E 69 21 27 40 A3 F6 E1 55 51 4E 78 5C B5 B4 DA 56 3F 7E \n8A 69 BD D4 6A 6F 6F AB AD 90 13 90 48 3F B7 B6 E6 16 66 22 8A F6 65 44 AD AD A2 45 B4 A5 D6 17 \n88 12 15 5A 0C F2 CA 64 E6 AC FB C7 3E 93 49 86 10 66 92 7D 48 E8 E5 F7 F9 E4 33 AF BD D7 59 FB \n77 76 F6 D9 7B ED B5 D6 16 55 E5 40 80 F8 C9 7B 80 59 05 14 5D A0 9E 3B 3B 6A 7D 6C C0 E9 69 05 \n8A C0 85 96 CB F5 38 E4 40 E8 F9 E2 27 0F 01 9A 00 29 A0 B8 02 83 D5 73 3F 88 56 AB EE E3 40 E9 \nF9 63 29 8C 78 C2 72 63 23 D4 C5 1A 0E 14 F2 C7 45 5C BE 47 70 A0 90 3F 3E E2 F2 3D 82 83 E4 F7 \n20 22 27 5F FC E4 67 C5 4F 5E DE 8D FA 31 60 4C 91 D5 C6 84 F5 BA 7A CD CB C5 4F 7E B6 AB F5 0B \n45 A4 E4 8B 9F 2C 03 56 02 4B C5 4F AE 14 3F 39 A2 0B 62 4E 04 FA 15 59 A7 5F 58 AF 28 88 9F 1C \n21 7E 72 25 B0 14 58 19 EA 1F 19 22 23 3F 54 BC 0E E8 13 7E 75 31 F0 92 F8 C9 CB 8A 14 75 4A 17 \n55 38 B5 98 C2 A1 5E 2F 61 F4 04 A3 77 5D 94 37 20 92 79 7E 07 C4 E7 E3 01 60 B6 7A EE 3F 3A 91 \n31 00 B8 0C A8 02 8E EA 82 1A 8D C0 AD C0 CF D5 73 B7 77 72 9D C3 80 7B 80 4B F6 52 24 05 54 A8 \nE7 D6 77 41 87 4E 61 9D FC 02 88 CF A2 11 98 A1 9E FB 50 5E FD 31 40 25 70 39 30 D8 82 4A 1F 00 \n3F 03 16 AA E7 BE 98 77 AD CF 03 35 C0 F0 7D C8 88 E4 06 58 25 BF 08 E2 DB 62 11 70 3B F0 49 60 \n26 70 96 35 85 F6 C4 53 C0 42 E0 69 E0 5B C0 35 45 D4 B5 7E 03 AC 91 DF 45 E2 0F 34 58 BD 01 36 \n1F B8 35 FC 6B 13 0F A6 7D 35 B6 84 D9 24 FF 4E 8B B2 7A 33 AC B5 D3 26 F9 3F 04 9E B4 28 AF 37 \nE2 49 4C 3B AD C0 F6 03 F7 23 C0 0B C0 40 6B 42 7B 0F B6 03 E3 D4 73 5F B7 25 D0 EA 22 2B 54 EC \n06 9B 32 7B 11 6E B0 49 3C 44 B7 C8 5A 49 6E A5 F8 AF 80 47 D4 73 27 DA 16 1A 95 79 E1 6A 60 6B \n44 B2 F7 37 B6 62 DA 63 1D 91 90 AF 9E BB 09 98 13 85 EC 1E C0 9C B0 3D D6 11 E9 1E AE F8 C9 06 \nE0 9C C8 2E 10 3D 1E 57 CF 9D 10 95 F0 A8 ED F9 F1 88 E5 47 8D 48 F5 8F AC E7 8B 9F 1C 07 AC 89 \n44 F8 FE C5 78 F5 DC 17 A2 10 1C 65 CF BF 2E 42 D9 FB 13 91 B5 23 AA A9 E6 61 C0 5B 40 A9 75 E1 \n39 BC 05 BC 0C 9C 04 1C 1D E1 75 76 03 47 77 B6 F7 D0 55 44 35 A6 CD C0 3E F1 29 E0 2E E0 31 E0 \n39 F5 DC 77 B3 3F 88 9F 1C 86 D9 B9 3A 17 D3 53 6D 1A F8 4A 31 ED B9 DD A2 4C 20 9A CD 94 18 F0 \n06 F0 61 8B 62 D7 00 57 A8 E7 AE 2D E0 FA 63 81 FB B0 EB C1 B0 11 38 4E 3D 37 63 51 66 24 63 FE \n97 B1 4B FC 7C E0 F4 42 88 07 08 CB 9D 1E D6 B3 85 0F 63 DA 65 15 DD EA F9 E2 27 FB 03 1F C3 F4 \nB2 F1 18 4F B1 D3 81 2E BB 6D E4 A1 4E 3D 77 6F 7B AB FB 84 F8 C9 07 80 0A 4B BA 64 80 67 30 86 \nC3 35 E1 DF 8B EA B9 3B BB 2A B0 60 F2 C5 4F 96 00 E7 63 08 CE 92 7D 02 D1 CD 98 36 03 1F 55 CF \nDD DC 55 01 E2 27 0F 07 FE 02 1C 6E 4D AB F6 08 80 57 C8 DD 8C 17 80 DF AA E7 B6 14 52 B9 98 07 \nEE 95 80 5F AC 76 DD C0 9C EE 10 0F A0 9E BB 59 FC E4 1C 8C B7 44 14 70 30 B3 AD 93 80 4B C3 EF \n3C 0A DC ED 2A A6 D7 0E 28 4E AF 6E A1 51 3D B7 CE 86 A0 50 4E A3 0D 59 05 A2 60 9E 7A AB AF E6 \nEA 5E 2E CF 0A 7A 2B F9 CF F5 72 79 56 D0 5B C9 3F D8 F3 7B 10 7B 75 EF EB 25 F2 AC A0 B7 92 7F \n5C 2F 97 67 05 BD 95 FC 13 7A B9 3C 2B E8 AD E4 5F 22 7E B2 D0 00 B8 4E 11 CA E9 F2 2A 39 4A 14 \n43 FE FE 0C AD 3C 1E B3 9A B6 81 F3 43 79 FB 0B 05 F3 54 CC 0A B7 16 78 8D 9C 0D 67 1C 30 1A E8 \n5B 8C 66 45 60 BE F8 C9 86 42 97 EA 1D 21 34 89 D8 34 B0 E5 A3 19 F8 2B C6 AC 90 B5 F9 3C 51 68 \nE5 82 C9 0F CD A9 0D E1 1F 00 E2 27 E3 C0 C9 E4 6E C6 29 C0 79 85 CA DC 07 4E C3 10 77 63 37 64 \nCC 0F E5 D8 C2 EF 80 E7 C9 91 FD 37 F5 DC 74 57 85 45 61 CF FF 09 F6 DC 46 14 F8 86 7A EE 0F BA \nA0 C7 0D C0 1D 14 1E 3C BD 2F FC 54 3D F7 3F 2C C9 02 A2 21 7F 14 E6 5F D1 26 EE C5 84 11 35 17 \n70 FD BE 98 30 9F E9 96 75 18 AD 9E BB CE A6 C0 A8 F6 70 57 01 67 5B 16 FB 22 50 DE 99 BF 64 E8 \nA8 9B C0 EC 31 D8 C4 13 EA B9 9F B1 2C 33 B2 A9 66 14 A6 E7 8F 01 1F DD 47 99 8F 62 9F 78 88 C8 \n94 1E 15 F9 FF 8B 7D 5F CD B7 31 31 BD 9D 61 65 58 CE 26 B6 62 DA 63 1D 51 F9 6A EE C6 04 12 DB \n84 BF AF 99 45 F8 BB ED 5E BA 34 6C 8F 75 44 B9 C2 B5 16 BB 04 A4 8B 90 57 13 96 B7 05 9B ED 68 \n87 C8 C8 57 CF FD 0B F6 86 9E 84 7A 6E 41 BB 51 61 B9 84 A5 EB 6E 0D DB 11 09 A2 0C FF BF 1C 18 \n6A 49 DC 3D 11 97 DF 1B 86 76 27 69 C7 BE 10 D5 54 F3 68 4C 1E 03 1B 11 E4 7F 53 CF 1D D5 05 1D \nD6 61 56 DF DD 45 13 30 46 3D F7 2D 0B B2 DA C1 7A CF 0F AD 88 4B B0 43 3C C0 82 FD 5C 2F 1F 83 \n81 25 B6 AC AC 6D 11 C5 B0 33 1B 7B 16 C9 1D 18 D7 BF AE E0 BE B0 BE 0D 9C 8F 69 97 55 58 25 5F \nFC E4 09 18 7B 8A 2D FC 5C 3D B7 A9 2B 15 C3 7A 3F B7 A8 CB 1D 61 FB AC C1 1A F9 A1 83 EC 52 A0 \nBF 2D 99 74 FF C1 69 EB C1 0B A6 5D 4B BB 93 C1 2A 1F 36 7B FE 37 80 33 2D CA FB A3 7A 6E B7 22 \n5B C2 FA 7F B4 A4 0F 98 F6 7D C3 96 30 9B E4 7F D5 A2 2C B0 D7 6B 6D F6 7E B0 D8 4E 9B E4 5F 81 \nD9 D9 B1 81 2D D8 F3 AF 7C 20 94 67 03 CD 98 76 5A 81 35 F2 D5 73 1F 01 CA 29 EE 06 28 F0 3F C0 \n43 79 DF DF 5B 88 ED BE 40 BD 9A 31 FB 01 6D F1 50 78 DD 62 16 39 CD 18 93 F6 23 36 F4 02 FB B9 \n17 8A B9 01 6F 02 E7 A9 E7 7E 45 3D 77 12 26 C3 D4 2A 8C DB 75 B5 4D BD 42 79 41 28 FF 2C F5 DC \n49 EA B9 5F C1 6C 79 BE 59 40 7D EB C4 43 74 2B DC 8B 31 F6 95 BD 6D AE D7 02 D7 AB E7 6E EB A0 \nEE D1 51 AC 26 F7 26 57 FC E4 20 E0 C7 18 17 F8 8E 10 09 F1 10 6D 1C 6E 47 37 E0 3D C0 53 CF 4D \n46 72 D1 6E 40 FC A4 8B 31 47 1F D1 E6 EB C8 88 87 68 AD 9A F9 43 50 02 63 23 E9 75 C4 03 84 7A \n8D 21 67 11 8D 94 78 D8 0F F9 F3 C5 4F 7E 1A 18 6E 2B D8 61 7F 40 FC 64 05 26 40 23 D2 CC 59 07 \nC4 E1 05 FF AA E8 AD BE 9A FF 2F 70 90 FC 1E C4 41 F2 7B 10 07 C9 EF 41 1C 24 BF 07 71 90 FC 1E \n44 1C 40 FC 15 FD 91 CC 6C 94 B3 50 FA 01 7F 42 32 0B D5 9B DA 08 20 8B 96 1D 4D 26 B6 08 61 23 \nE2 FC 08 74 2E AA 27 80 AE 25 16 FC 40 AF 9E BA 21 2B 50 40 A8 4E 4C C7 61 32 EA 0C 41 83 35 68 \nFC 4E 9D 39 A9 D5 93 4C AA 93 8F 20 A4 08 62 B3 88 65 6E 41 39 09 E1 61 E2 A9 FB F4 AA 8A 4E A3 \nCE A5 BA FE 34 24 98 08 72 2E E8 56 90 75 A4 A9 D6 D9 EE C6 D6 32 FE 8A 0F 41 7A 16 22 67 A2 64 \n10 79 9A DD 25 3F D5 6B 27 6E 33 ED A9 1F 4B 46 EF 40 58 AD 9E 7B 4B 6B BD 9A E5 E7 10 38 37 21 \n34 A8 E7 DE DE AE DD 8E DC 8D EA D7 51 8E 02 EA 29 49 DD AF 57 55 6C 96 EA E5 E3 10 67 16 30 0A \n65 23 8E 3C CE A6 41 4B 74 DE 84 34 80 DC 5B 7F 08 69 FD 26 AA 9F 44 64 17 C8 E3 34 97 DC A5 D7 \n4E 6C 16 EE 7A 78 10 7D 53 7F 04 F2 3D 04 DE 45 63 67 6B E5 A4 57 C4 5F 71 32 64 D6 61 F6 44 1D \nDA 1F A3 F1 0E 64 4E 69 BD 51 7E F2 7E CC A1 03 6D B1 0D 71 CE D7 19 93 9F 0D CB 28 C6 D0 B5 85 \nF6 CB F9 9D 88 73 BA CE 98 DC A1 AF 8C F8 89 AF 83 74 E4 2E BE 03 63 A4 FB 93 2C 4C 8C C4 91 A7 \n80 FC 23 42 5E 25 96 3A 43 AF AE F8 A7 2C 4C 4C C0 91 C7 50 1E D5 4A B7 35 FF A7 D4 D4 5F 86 EA \nFD C0 2F D5 73 2F 6B D3 EE ED 61 BB C3 5D 3A D9 4C 26 7D 26 F1 F8 79 A8 2E 20 3F D1 87 EA EF E9 \nCB 34 00 52 F2 67 60 64 9E 2E 6B E9 D7 EF 53 0E A5 A9 9B 31 C4 6F 04 AE 47 F5 4B 18 8F E0 61 38 \nE9 FC A4 CD 03 80 DF A3 72 0E A2 97 62 6C 35 47 42 7C 96 51 3E 31 11 43 FC 1B 88 7C 11 62 A7 A2 \nF2 00 30 08 0D F2 DD 07 1D 60 13 C8 25 28 D3 41 5E 07 FA A3 C1 BC 0E C8 CD D2 73 63 D8 B8 EB 88 \n65 46 12 E8 19 20 FF 85 92 C0 73 9F 31 52 E5 76 0C F1 EB 40 AE 44 65 16 B0 1E 38 9E 74 C9 B7 F7 \n2E BB 53 0C 04 9E 04 BD 08 F8 1A 9A 71 D1 58 0B AA 3F 0C DB 51 8F 52 16 72 F2 32 48 23 A9 F7 76 \n90 92 2A 60 24 CA A3 08 67 A1 94 61 B8 1D CB AE 5D F3 E2 A8 5C 0C 0A AA DF D4 CA F2 FB 01 A4 7A \nF9 5F 11 67 8D F9 2D 0F E9 92 6B 74 F6 E7 DE 01 90 9A E4 31 28 77 82 8E 36 A4 38 E5 A1 AC FF 56 \nCF FD 05 80 D4 26 2A 49 89 0B 9C 2C 0B 13 23 75 66 F9 FA 36 64 7E 4D BD B2 C7 CC 35 93 20 DC 0B \nD2 E1 59 27 52 57 17 83 3E 31 20 4D 89 F3 2B 9D 5E BE 09 D8 80 49 C3 D2 16 46 67 0D AE D6 CA 29 \n4F 1B D9 0F 36 22 41 02 E9 A0 3D 85 41 09 B4 32 D4 FD D7 A6 ED F5 D7 A3 3A 10 58 AD 9E EB B6 EA \n79 4F DD C3 CC AE D8 A1 A0 E2 27 CB 01 08 32 B3 B5 72 EA EB 21 67 71 94 65 C0 E7 E2 A0 E6 3C 12 \n47 73 21 F2 87 A6 5F 62 6B 9F 9D 40 7F F9 E9 F2 C3 28 29 C9 FE B2 2D 4B 7C 88 D7 C2 D7 21 A1 8E \nC6 49 49 E4 02 F1 13 6D 49 FC 00 E8 4B 4C 8E C7 F4 42 80 16 1A FF FC 38 84 E7 C1 C4 32 BF 21 88 \n01 DA 61 E2 08 AD A8 C8 88 9F 5C 02 DC 48 5A D7 8B 9F 5C 0B F2 1E 12 AC 03 7E A6 33 CA D7 C8 CF \n7E 3D 00 E3 67 93 61 67 3A B7 FF 2B 2D CF 84 23 43 57 CE 5E 01 F4 D5 F6 9D 06 50 0D 87 69 6D B7 \n11 A4 B3 2B B6 43 F8 1C 35 49 92 76 10 73 BE 2D 7E 68 AF 13 A7 4F B8 87 73 72 9C 6C C6 6F 4D B7 \nE6 2C 0B 1B BA 19 38 96 52 1D 48 2E B9 55 7B 37 0E 71 9A D0 00 90 AC D9 F8 D0 F0 75 72 87 D1 38 \n81 B4 8D 01 0B 74 DE BC A0 F5 53 AA 34 4D 7C 1F B1 6F 2D C1 F7 29 71 52 98 A8 93 53 CD 7F 99 4C \n04 E6 C8 E2 FA 31 68 6B 24 E0 07 3A B7 62 57 AE E2 96 2D 30 2C 0D F4 97 AA 2A 87 61 C5 9E DE 27 \nC1 9E 5F 71 98 E1 D0 79 A3 C3 2A 01 43 71 10 60 00 48 6E EB 31 67 4B 8B C5 31 E9 50 8E 43 E2 E3 \n81 C7 01 4C 6F 77 8E 05 60 67 BF 77 E8 9B C9 46 70 1F 25 BE 5F A2 9E D7 12 0A 1A 19 4A 0C 6F 8A \nFE 1D 64 0C 4A 99 56 BA 0F 16 D9 C2 7D 42 E7 4C F9 07 70 8B 54 55 7D 9B C3 3F 71 04 B1 F4 D1 88 \n7E 0B 98 46 9A CB 78 E7 CF F3 19 3E 3E 03 0C 91 C5 CB 8E 6D 9D 85 39 47 8C 25 20 0E 34 EA BC 79 \n81 D4 2C 57 54 40 F2 D2 91 69 11 E9 C9 94 97 C3 37 17 D2 91 63 D7 CC 49 9B F0 93 3B 00 A5 5F BF \n23 F5 F2 0B F7 70 E0 72 00 13 66 A3 CE 54 F1 FD 12 01 A1 24 F6 C5 F0 F7 B7 F5 DA 89 CD ED CB 1F \n99 3B 6F 56 35 FB FE 9F E1 6B F6 34 9E AB A4 AA CA 01 90 BB 57 0E 92 9A FA 2F 4B 5D 5D B7 32 FE \n49 5D 5D 4C FC E4 0F C5 AF 3F 57 E7 CD 0B 74 F6 E7 DE D1 CA B2 D5 48 E8 1A 22 3A 3E FC 4F 5A 0F \n40 10 AB 90 AA 2A 47 AA 1A E2 04 8E 09 82 96 B0 AD 69 CD 4E 4B 47 8B BF FC D3 90 1D 26 F4 2B 85 \n2B D4 9A C9 E4 62 59 58 FF F1 D6 AF 6B 12 57 4A F5 F2 71 6A C6 96 97 80 81 EC DA D9 9A 9F 4D 16 \nD7 1F 2F 7E FD E7 01 E2 A8 7E 0F 91 F3 80 EB 60 D8 17 F0 93 4D E4 A6 9D DF DB F3 AA FA 2B F1 93 \n7F 00 8E 6C 2D A7 84 B6 FA F8 4F 20 98 8D E8 14 86 8F 7F 53 AA EB 9F A2 AF 4E 44 39 84 F7 4B AE \n10 B8 48 8B DB B4 CE 61 6B 89 07 CC 05 FD AA F8 C9 E7 50 5E 02 86 23 61 AE 66 D5 95 E1 EB F7 10 \n59 84 72 27 C3 C7 57 42 53 1F E0 18 F3 9B 98 F6 CC 9A FA 06 7E F2 AF C0 68 70 56 89 9F CC 4E B5 \n87 14 AC CF 0C 37 41 75 F2 09 84 B3 71 F4 79 F1 13 CF 83 F4 03 19 85 C8 56 59 52 77 12 D2 67 1E \nCA 23 20 D5 E2 27 2A C1 79 37 9C 31 39 E2 27 6E 70 B4 B2 FC 77 66 AA C7 36 CC 14 6D 14 D0 02 F2 \n5D 1A D7 E4 3B 9B 6E 40 B9 1F 93 BF 32 7B 83 6E CF 0E 31 EA 4D DA 82 F2 05 4C B2 D1 A3 10 BD 04 \n38 04 78 0D 8D 7F AB CB C4 03 EA 95 2F 08 A7 72 1B 81 D3 10 AE 44 B8 08 78 15 B8 49 2B CB 17 03 \n50 59 7E 2F 22 37 63 76 A2 8E C7 10 BF 13 74 B6 7A 65 0F 81 79 52 40 6C 1A C8 4A F3 91 4F 82 B4 \n80 14 1C D5 A2 A0 48 E6 52 44 C3 9D 39 39 25 E4 64 13 2A 97 EA 55 15 9B 75 86 FB 28 AA D7 01 4D \nE6 77 9D 08 38 A8 AC 20 D6 B2 A4 75 33 45 AA 1A E2 1C B9 6D 3C 4E 66 00 DB D3 CF B4 7D 60 B5 59 \n6C BC AC 9E 7B B2 F8 2B 8E 41 83 D1 68 E6 79 9D 39 E5 BD 7C C5 A4 AA 21 CE 51 EF 8F 23 23 23 70 \n82 97 99 31 E5 95 B6 C4 CB A2 07 CF 24 9D 09 74 66 F9 33 B9 6B F8 25 38 C3 4F 25 90 94 7A 93 9E \nEF AC E1 66 E5 19 1F 43 09 6B 75 7A 59 87 E9 D5 E5 EE 95 7D 29 69 39 8D B8 64 08 1A 9F 6B 7D 4E \nE5 97 5B 98 18 49 4C 8F A5 74 C0 6A B6 ED 28 A5 6F FC 04 44 B7 E8 D5 65 AF 4A 6D 43 29 E9 0F C6 \n93 49 EF D2 CA 29 7B CD A7 6C 64 30 8A 40 36 68 A5 BB 47 18 AC F8 75 83 71 FA 8C 25 23 03 C8 C4 \nD7 B4 4E D5 0B D9 C9 CA 27 7F 9F 15 22 80 D4 26 86 90 6A 51 F5 2A BA E4 38 DB 1B 71 40 A4 58 97 \nDA 86 52 52 B2 15 FA 34 13 6D 7E E6 FD 8A 83 56 CD 1E C4 41 F2 7B 10 5D 22 5F AA AA 1C 59 52 D7 \n69 96 56 A9 4D 0C 91 BB 57 0E EA F0 37 DF 2F 91 DA 86 D2 D6 B5 C0 E2 BA 43 F3 D7 01 02 22 F7 3C \n7C 64 87 F5 EF 5E D9 57 6A 1B 4A 25 6F 19 2D BE 5F D2 D1 7A 42 6A 1B 4A A5 B6 A1 B4 7D D9 BA C1 \nE2 D7 75 18 BA D4 AA 5F 5D 5D 0C 40 16 3C 34 54 EE 5E B9 87 F7 9D DC 53 37 50 16 D5 0F EB 48 46 \n21 28 F6 81 FB 77 4C 00 C4 CD 40 7F 84 06 54 7F AC 5E 79 22 57 36 F9 25 CC FA E0 18 4C FE E1 35 \nC0 2A 88 CD 57 6F D2 96 B0 CC 2F 80 4B 41 6F 00 F9 22 26 FD FA 3F 81 85 78 EE 2D F8 89 5B 40 E6 \n62 A2 19 DF 46 E4 86 D0 D4 DB AC 9E 5B 2A 7E 72 35 70 2A 2A 17 6A 65 D9 6F DA 5C FB 15 60 10 8D \n6B 86 67 4D 17 C6 FE AF CF 02 6F E1 B9 C7 50 9D 9C 86 70 27 C6 CC 1B 00 2F A0 BA 8A 4C 9F DB 5B \n67 21 7E A2 D6 98 04 E4 D6 70 7A 78 06 F0 3E 48 AD 7A 65 73 A5 66 F9 89 E0 54 A3 9C 83 E9 00 9B \n40 6E 56 AF AC A8 10 A6 62 7B FE 89 C0 6D 21 A9 01 CA 04 90 5F 49 75 FD 67 20 34 4B A0 B7 62 0E \n13 58 0B FA 3C 66 EE 3B 17 49 77 10 A2 23 3F C0 E4 E8 69 02 06 A3 D2 80 9F 98 09 F2 1D 0C F1 DB \n81 41 21 F1 6D B1 DC BC B4 AE B0 91 EA E5 E3 30 F3 FA 23 18 31 36 97 74 C3 E1 82 B0 6C 02 BF 6E \n10 C2 77 30 1D E3 45 E0 59 E0 44 44 AE 27 D6 D2 81 4B BA DE 8A 21 BE C9 E8 21 0D E2 AF E8 8F 3A \nBF 35 6D 67 1B C6 B8 38 02 B4 56 6A EA 8B CA 74 52 FC B0 23 7A 1B 3B 52 C3 08 F4 DF 30 C9 42 1D \n24 B8 02 B2 B6 97 96 4F A0 72 AE 7A EE 38 F5 CA 4F 87 D8 28 20 85 CA 67 43 AB 63 5B AC 27 93 39 \n1E DE 3D 1C 47 4E 09 7B F1 55 E1 85 16 30 34 35 84 C6 C1 87 62 CE CC 6D A3 75 B0 CC 14 E1 A2 9C \n5E B1 69 6D 0A B4 79 9F BD 41 CE 32 F5 2A 9A 48 A7 4E 07 39 5F 3D 77 AC 7A EE 99 94 A4 8E 03 76 \n21 9C 2D B5 89 FC 15 EE 26 34 76 22 8D 83 3F 84 06 A7 68 E5 E4 24 9A B9 16 63 AD 4C 40 6C 04 9E \n7B 02 E6 1C 5F 50 BD 23 7F 28 EC 0C C5 92 BF 8B 98 73 87 CE AD D8 A5 33 CB D7 87 BB 38 80 B4 CE \nFD D5 AB 68 D2 CA B2 55 B9 CF 93 DE C4 1C 66 10 63 FB EE FC E3 35 6A 74 D6 D4 D7 D5 F3 5A F4 9A \nB2 30 3F BE 7C C8 68 26 4B B5 A2 22 A3 F3 26 A4 D1 A0 9D 7F BD 5E 33 65 1D F0 37 E0 63 E2 2F 0B \n4F 71 D6 69 98 5E F8 07 94 29 02 62 7A 29 9F 02 FE C1 D0 E6 55 60 4C BE D9 3D 04 00 B3 6D 29 7F \n07 A0 59 8F CD D3 6F A9 56 4E 7A 45 E7 4D 48 B7 59 64 9D 11 D6 5C A0 DE A4 9D 66 F1 F8 EE BD 98 \n5D B9 C3 A8 5E 51 70 3E B7 62 E7 F9 6F EA F4 B2 5C 02 B7 58 EC 2F 04 01 B4 D9 46 93 EA FA 99 88 \n7A 98 21 2A 2B DF 3C 04 63 4E 5E AF D0 0E 92 22 C9 40 50 48 A7 73 79 75 94 D7 F6 E8 4F AA CB 11 \nB9 09 8D 5D 20 FE 8A 67 80 D1 20 3F 42 78 0F D5 F9 2C 7A F0 0C 24 33 14 95 3E 40 BD 56 54 64 00 \nA4 A6 7E 3A 1A CC 01 39 11 C8 6E 54 18 FD 1C 69 7F 15 D1 97 F7 54 2F 1B 58 2D F5 E2 67 7D 7E 87 \nB5 91 D1 32 02 93 D6 7D 9F B0 BA C8 92 85 F5 67 E1 E8 02 60 37 CA B3 38 6A AC 9D 2A E7 51 F0 49 \nA1 6A 6C E7 71 CD CD 5A E2 DA 87 3D 2C EA CE 32 D0 9B CC D0 93 31 A6 60 47 1E 24 9D 7E 0F C7 99 \n4F 26 98 86 88 E9 14 62 86 29 59 94 38 15 95 C5 20 CD 08 AB 41 B7 84 FA 9D 0B 74 38 33 EB A0 95 \nA9 D0 52 F2 24 A2 7B 66 AA CD 50 F0 C1 36 76 57 B8 4E 30 03 04 54 2E 6A 3B F4 88 9F DC 44 E1 C7 \nB4 6E 07 86 41 EC 38 CC 89 40 90 89 7F 04 69 3F 2B D3 CA B2 D5 E2 27 37 62 02 94 47 03 EF F3 F6 \n21 AB 74 DE 84 B4 F8 C9 0D 88 4C 05 DD 0D 6C 67 77 A9 99 11 05 32 23 AC 5D A6 33 CA 7F DD 46 BF \n37 28 98 7C 5D 07 8C 43 F5 7E F5 42 63 5E 17 61 79 91 E5 1C 11 4A FD B8 D4 D5 F5 11 90 70 53 7D \n78 11 42 8C 8B 49 C0 8D E2 AF 38 46 16 2F 3B 16 D1 9B C2 DF F2 E7 C5 CB 31 DE 0F E3 81 47 B2 EE \n1A C0 0A D0 8F 00 A3 51 79 B8 75 4F 42 B3 9E 12 72 5A 76 9D 20 7E FD B9 EC E9 5D D0 09 E4 29 F3 \n22 D7 C9 A2 07 CF 94 AA 86 B8 D4 D4 5F 26 7E B2 5E 16 D4 9F 54 44 3B 2D 93 AF 7A 5F F8 FA 23 B6 \nF6 79 1F 3F B9 1D 95 87 8B 93 21 3F 0E DF 4D 86 CC 06 32 B1 F5 E4 D2 09 B4 1F 93 03 5D DE E6 53 \n6E E7 4C 65 45 EB 7B 87 5C 19 D1 AC 07 C5 7F 92 6A DA 8A 9F FC 00 F4 F7 45 E9 37 B4 79 01 E8 B3 \nC0 58 82 E0 69 86 37 6D 0B A7 C2 93 89 E9 5D C5 88 2A 90 FC 74 0B B0 01 D5 F6 29 B4 D2 DA 8C F1 \n20 68 04 D0 4A F7 97 88 FE 3B B0 16 D3 4B DF 45 F4 36 CC D9 56 1B 42 39 80 6E 0E EB ED 71 D8 8B \n56 96 2D 0B ED F6 7F C2 CC A3 57 85 CF 8C 0D E1 5F 0E 87 B5 3C 11 5E EB 0D 32 F1 5C 0A B0 54 C9 \n63 98 05 E1 6B C4 72 91 8E EA 95 27 8C 4B 0B 6B 30 6B 95 2D 08 DF 47 79 14 D8 40 20 A9 90 96 2D \nE1 E7 3D C6 74 F3 E0 6E B9 00 E4 0E CC EC 2A 00 9E 03 F9 2E 43 53 93 3B E7 B1 3D FE 0F E4 2C B5 \nB8 3A B8 3B 5D 00 00 00 00 49 45 4E 44 AE 42 60 82 AC $EndBitmap\nEndData\n$EndBitmap\nWire Wire Line\n\t5350 4600 5250 4600\nWire Wire Line\n\t5350 4400 5250 4400\n$Comp\nL GND #PWR09\nU 1 1 550CF9FF\nP 5350 4700\nF 0 \"#PWR09\" H 5350 4700 30  0001 C CNN\nF 1 \"GND\" H 5350 4630 30  0001 C CNN\nF 2 \"\" H 5350 4700 60  0000 C CNN\nF 3 \"\" H 5350 4700 60  0000 C CNN\n\t1    5350 4700\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t5350 4400 5350 4700\nConnection ~ 5350 4600\nText Notes 5050 4800 0    40   ~ 0\nchassis ground\n$Comp\nL GND #PWR010\nU 1 1 550CFBE5\nP 5350 6250\nF 0 \"#PWR010\" H 5350 6250 30  0001 C CNN\nF 1 \"GND\" H 5350 6180 30  0001 C CNN\nF 2 \"\" H 5350 6250 60  0000 C CNN\nF 3 \"\" H 5350 6250 60  0000 C CNN\n\t1    5350 6250\n\t1    0    0    -1  \n$EndComp\nText Notes 5150 6400 0    40   ~ 0\nchassis ground\n$Comp\nL PWR_FLAG #FLG011\nU 1 1 550CFBF4\nP 5350 6150\nF 0 \"#FLG011\" H 5350 6245 30  0001 C CNN\nF 1 \"PWR_FLAG\" H 5350 6330 30  0000 C CNN\nF 2 \"\" H 5350 6150 60  0000 C CNN\nF 3 \"\" H 5350 6150 60  0000 C CNN\n\t1    5350 6150\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t5350 6150 5350 6250\n$Comp\nL CONN_1 P5\nU 1 1 550D1AD1\nP 5000 6150\nF 0 \"P5\" H 5080 6150 40  0000 L CNN\nF 1 \"GND\" H 5000 6205 30  0001 C CNN\nF 2 \"mfk-AVA-20ga\" H 5000 6150 60  0001 C CNN\nF 3 \"\" H 5000 6150 60  0000 C CNN\n\t1    5000 6150\n\t-1   0    0    1   \n$EndComp\nWire Wire Line\n\t5150 6150 5350 6150\n$Comp\nL C C2\nU 1 1 550D2A54\nP 6900 5500\nF 0 \"C2\" H 6900 5600 40  0000 L CNN\nF 1 \"1u\" H 6906 5415 40  0000 L CNN\nF 2 \"mfk-C_4.0_2.5_2.5_0.5\" H 6938 5350 30  0001 C CNN\nF 3 \"TDK FK18X5R1A105K\" H 6900 5500 60  0001 C CNN\n\t1    6900 5500\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t6900 5150 6900 5300\n$Comp\nL DGND #PWR012\nU 1 1 550D2ACA\nP 6900 5800\nF 0 \"#PWR012\" H 6900 5800 40  0001 C CNN\nF 1 \"DGND\" H 6900 5730 40  0000 C CNN\nF 2 \"\" H 6900 5800 60  0000 C CNN\nF 3 \"\" H 6900 5800 60  0000 C CNN\n\t1    6900 5800\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t6900 5800 6900 5700\nNoConn ~ 8300 4400\nNoConn ~ 8300 4850\nConnection ~ 8450 5000\nWire Wire Line\n\t8450 3750 8450 4100\nWire Wire Line\n\t7600 3650 7600 3750\nConnection ~ 7600 3750\nWire Wire Line\n\t6900 4100 6750 4100\nWire Wire Line\n\t6150 4150 6150 4400\nConnection ~ 8450 4100\nWire Wire Line\n\t8300 5150 8450 5150\nConnection ~ 8450 5150\nWire Wire Line\n\t6900 5000 6400 5000\nWire Wire Line\n\t6400 5000 6400 6150\n$Comp\nL CONN_3 P3\nU 1 1 551F2247\nP 2750 1800\nF 0 \"P3\" V 2700 1800 50  0000 C CNN\nF 1 \"PWR\" V 2800 1800 40  0000 C CNN\nF 2 \"mfk-TE_282834-3\" H 2750 1800 60  0001 C CNN\nF 3 \"\" H 2750 1800 60  0000 C CNN\n\t1    2750 1800\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3650 1800 3100 1800\nWire Wire Line\n\t3100 1700 3350 1700\nWire Wire Line\n\t3150 1250 3150 1700\nText Label 3150 1250 3    60   ~ 0\nV_MOT\nWire Wire Line\n\t6750 4100 6750 3750\nWire Wire Line\n\t6750 5150 6750 6150\nText Label 6750 6150 1    60   ~ 0\nV_MOT\n$Comp\nL PWR_FLAG #FLG013\nU 1 1 551F243F\nP 3350 1650\nF 0 \"#FLG013\" H 3350 1745 30  0001 C CNN\nF 1 \"PWR_FLAG\" H 3350 1830 30  0000 C CNN\nF 2 \"\" H 3350 1650 60  0000 C CNN\nF 3 \"\" H 3350 1650 60  0000 C CNN\n\t1    3350 1650\n\t-1   0    0    -1  \n$EndComp\nConnection ~ 3150 1700\nWire Wire Line\n\t3350 1700 3350 1650\n$Comp\nL JUMPER J1\nU 1 1 552023B1\nP 4750 1800\nF 0 \"J1\" H 4750 1950 60  0000 C CNN\nF 1 \"PWR_BR\" H 4750 1720 40  0000 C CNN\nF 2 \"mfk-SIL-2\" H 4750 1800 60  0001 C CNN\nF 3 \"~\" H 4750 1800 60  0000 C CNN\n\t1    4750 1800\n\t1    0    0    -1  \n$EndComp\n$Comp\nL +5VD #PWR014\nU 1 1 552023F3\nP 4400 1450\nF 0 \"#PWR014\" H 4400 1400 20  0001 C CNN\nF 1 \"+5VD\" H 4400 1550 50  0000 C CNN\nF 2 \"\" H 4400 1450 60  0000 C CNN\nF 3 \"\" H 4400 1450 60  0000 C CNN\n\t1    4400 1450\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t4450 1800 4400 1800\nWire Wire Line\n\t4400 1800 4400 1450\nText Label 5100 1350 3    60   ~ 0\nV_MOT\nWire Wire Line\n\t5050 1800 5100 1800\nWire Wire Line\n\t5100 1800 5100 1350\nText Notes 4000 2000 0    60   ~ 0\nUse jumper to power motor from +5VD.\n$EndSCHEMATC\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Schematic/buttons.sch",
    "content": "EESchema Schematic File Version 2\nLIBS:simonLib\nLIBS:power\nLIBS:simonShield-cache\nEELAYER 25 0\nEELAYER END\n$Descr A4 11693 8268\nencoding utf-8\nSheet 2 4\nTitle \"Poncho Simon EDU-CIAA\"\nDate \"2016-07-26\"\nRev \"1.0\"\nComp \"Proyecto CIAA\"\nComment1 \"Juan Agustin Bassi\"\nComment2 \"CESE - Diseño PCB\"\nComment3 \"Licencia BSD\"\nComment4 \"\"\n$EndDescr\n$Comp\nL SW_PUSH SW1\nU 1 1 5777DBBB\nP 3500 3000\nF 0 \"SW1\" H 3650 3110 50  0000 C CNN\nF 1 \"SW_PUSH\" H 3500 2920 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 3500 3000 50  0001 C CNN\nF 3 \"\" H 3500 3000 50  0000 C CNN\nF 4 \"450-1804-ND\" H 3500 3000 60  0001 C CNN \"Digikey#\"\n\t1    3500 3000\n\t1    0    0    -1  \n$EndComp\n$Comp\nL R R1\nU 1 1 5777DBC2\nP 3150 2750\nF 0 \"R1\" V 3230 2750 50  0000 C CNN\nF 1 \"3K3\" V 3150 2750 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 3080 2750 50  0001 C CNN\nF 3 \"\" H 3150 2750 50  0000 C CNN\nF 4 \"680EBK-ND\" H 3150 2750 60  0001 C CNN \"Digikey#\"\n\t1    3150 2750\n\t-1   0    0    1   \n$EndComp\n$Comp\nL GND #PWR05\nU 1 1 5777DBC9\nP 3900 3100\nF 0 \"#PWR05\" H 3900 2850 50  0001 C CNN\nF 1 \"GND\" H 3900 2950 50  0000 C CNN\nF 2 \"\" H 3900 3100 50  0000 C CNN\nF 3 \"\" H 3900 3100 50  0000 C CNN\n\t1    3900 3100\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t3150 2450 3150 2600\nWire Wire Line\n\t3150 2900 3150 3000\nWire Wire Line\n\t3800 3000 3900 3000\nWire Wire Line\n\t3900 3000 3900 3100\nConnection ~ 3150 3000\n$Comp\nL SW_PUSH SW3\nU 1 1 5777DBDD\nP 5050 3000\nF 0 \"SW3\" H 5200 3110 50  0000 C CNN\nF 1 \"SW_PUSH\" H 5050 2920 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 5050 3000 50  0001 C CNN\nF 3 \"\" H 5050 3000 50  0000 C CNN\nF 4 \"450-1804-ND\" H 5050 3000 60  0001 C CNN \"Digikey#\"\n\t1    5050 3000\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR06\nU 1 1 5777DBEB\nP 5450 3100\nF 0 \"#PWR06\" H 5450 2850 50  0001 C CNN\nF 1 \"GND\" H 5450 2950 50  0000 C CNN\nF 2 \"\" H 5450 3100 50  0000 C CNN\nF 3 \"\" H 5450 3100 50  0000 C CNN\n\t1    5450 3100\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t4700 2450 4700 2600\nWire Wire Line\n\t4700 2900 4700 3000\nWire Wire Line\n\t5350 3000 5450 3000\nWire Wire Line\n\t5450 3000 5450 3100\nConnection ~ 4700 3000\n$Comp\nL SW_PUSH SW5\nU 1 1 5777DBFF\nP 6600 3000\nF 0 \"SW5\" H 6750 3110 50  0000 C CNN\nF 1 \"SW_PUSH\" H 6600 2920 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 6600 3000 50  0001 C CNN\nF 3 \"\" H 6600 3000 50  0000 C CNN\nF 4 \"450-1804-ND\" H 6600 3000 60  0001 C CNN \"Digikey#\"\n\t1    6600 3000\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR07\nU 1 1 5777DC0D\nP 7000 3100\nF 0 \"#PWR07\" H 7000 2850 50  0001 C CNN\nF 1 \"GND\" H 7000 2950 50  0000 C CNN\nF 2 \"\" H 7000 3100 50  0000 C CNN\nF 3 \"\" H 7000 3100 50  0000 C CNN\n\t1    7000 3100\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t6250 2450 6250 2600\nWire Wire Line\n\t6250 2900 6250 3000\nWire Wire Line\n\t6900 3000 7000 3000\nWire Wire Line\n\t7000 3000 7000 3100\nConnection ~ 6250 3000\n$Comp\nL SW_PUSH SW7\nU 1 1 5777DC21\nP 8150 3000\nF 0 \"SW7\" H 8300 3110 50  0000 C CNN\nF 1 \"SW_PUSH\" H 8150 2920 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 8150 3000 50  0001 C CNN\nF 3 \"\" H 8150 3000 50  0000 C CNN\nF 4 \"450-1804-ND\" H 8150 3000 60  0001 C CNN \"Digikey#\"\n\t1    8150 3000\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR08\nU 1 1 5777DC2F\nP 8550 3100\nF 0 \"#PWR08\" H 8550 2850 50  0001 C CNN\nF 1 \"GND\" H 8550 2950 50  0000 C CNN\nF 2 \"\" H 8550 3100 50  0000 C CNN\nF 3 \"\" H 8550 3100 50  0000 C CNN\n\t1    8550 3100\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t7800 2450 7800 2600\nWire Wire Line\n\t7800 2900 7800 3000\nWire Wire Line\n\t8450 3000 8550 3000\nWire Wire Line\n\t8550 3000 8550 3100\nConnection ~ 7800 3000\n$Comp\nL SW_PUSH SW2\nU 1 1 5777DC43\nP 3550 4350\nF 0 \"SW2\" H 3700 4460 50  0000 C CNN\nF 1 \"SW_PUSH\" H 3550 4270 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 3550 4350 50  0001 C CNN\nF 3 \"\" H 3550 4350 50  0000 C CNN\nF 4 \"450-1804-ND\" H 3550 4350 60  0001 C CNN \"Digikey#\"\n\t1    3550 4350\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR09\nU 1 1 5777DC51\nP 3950 4450\nF 0 \"#PWR09\" H 3950 4200 50  0001 C CNN\nF 1 \"GND\" H 3950 4300 50  0000 C CNN\nF 2 \"\" H 3950 4450 50  0000 C CNN\nF 3 \"\" H 3950 4450 50  0000 C CNN\n\t1    3950 4450\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t3200 3800 3200 3950\nWire Wire Line\n\t3200 4250 3200 4350\nWire Wire Line\n\t3850 4350 3950 4350\nWire Wire Line\n\t3950 4350 3950 4450\nConnection ~ 3200 4350\n$Comp\nL SW_PUSH SW4\nU 1 1 5777DC65\nP 5100 4350\nF 0 \"SW4\" H 5250 4460 50  0000 C CNN\nF 1 \"SW_PUSH\" H 5100 4270 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 5100 4350 50  0001 C CNN\nF 3 \"\" H 5100 4350 50  0000 C CNN\nF 4 \"450-1804-ND\" H 5100 4350 60  0001 C CNN \"Digikey#\"\n\t1    5100 4350\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR010\nU 1 1 5777DC73\nP 5500 4450\nF 0 \"#PWR010\" H 5500 4200 50  0001 C CNN\nF 1 \"GND\" H 5500 4300 50  0000 C CNN\nF 2 \"\" H 5500 4450 50  0000 C CNN\nF 3 \"\" H 5500 4450 50  0000 C CNN\n\t1    5500 4450\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t4750 4250 4750 4350\nWire Wire Line\n\t5400 4350 5500 4350\nWire Wire Line\n\t5500 4350 5500 4450\nConnection ~ 4750 4350\n$Comp\nL SW_PUSH SW6\nU 1 1 5777DC87\nP 6650 4350\nF 0 \"SW6\" H 6800 4460 50  0000 C CNN\nF 1 \"SW_PUSH\" H 6650 4270 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 6650 4350 50  0001 C CNN\nF 3 \"\" H 6650 4350 50  0000 C CNN\nF 4 \"450-1804-ND\" H 6650 4350 60  0001 C CNN \"Digikey#\"\n\t1    6650 4350\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR011\nU 1 1 5777DC95\nP 7050 4450\nF 0 \"#PWR011\" H 7050 4200 50  0001 C CNN\nF 1 \"GND\" H 7050 4300 50  0000 C CNN\nF 2 \"\" H 7050 4450 50  0000 C CNN\nF 3 \"\" H 7050 4450 50  0000 C CNN\n\t1    7050 4450\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t6300 3800 6300 3950\nWire Wire Line\n\t6300 4250 6300 4350\nWire Wire Line\n\t6950 4350 7050 4350\nWire Wire Line\n\t7050 4350 7050 4450\nConnection ~ 6300 4350\n$Comp\nL SW_PUSH SW8\nU 1 1 5777DCA9\nP 8200 4350\nF 0 \"SW8\" H 8350 4460 50  0000 C CNN\nF 1 \"SW_PUSH\" H 8200 4270 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 8200 4350 50  0001 C CNN\nF 3 \"\" H 8200 4350 50  0000 C CNN\nF 4 \"450-1804-ND\" H 8200 4350 60  0001 C CNN \"Digikey#\"\n\t1    8200 4350\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR012\nU 1 1 5777DCB7\nP 8600 4450\nF 0 \"#PWR012\" H 8600 4200 50  0001 C CNN\nF 1 \"GND\" H 8600 4300 50  0000 C CNN\nF 2 \"\" H 8600 4450 50  0000 C CNN\nF 3 \"\" H 8600 4450 50  0000 C CNN\n\t1    8600 4450\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t7850 3800 7850 3950\nWire Wire Line\n\t7850 4250 7850 4350\nWire Wire Line\n\t8500 4350 8600 4350\nWire Wire Line\n\t8600 4350 8600 4450\nConnection ~ 7850 4350\nWire Notes Line\n\t2400 1850 2400 4700\nWire Notes Line\n\t2400 4700 8800 4700\nWire Notes Line\n\t8800 4700 8800 1850\nWire Notes Line\n\t8800 2150 2400 2150\nText HLabel 2950 2800 0    60   Input ~ 0\nBTN_LED_1\nWire Wire Line\n\t2950 3000 3200 3000\nWire Wire Line\n\t2950 3000 2950 2800\nText HLabel 4500 2800 0    60   Input ~ 0\nBTN_LED_2\nText HLabel 6050 2800 0    60   Input ~ 0\nBTN_LED_3\nText HLabel 7600 2800 0    60   Input ~ 0\nBTN_LED_4\nWire Wire Line\n\t4500 3000 4750 3000\nWire Wire Line\n\t4500 3000 4500 2800\nWire Wire Line\n\t6050 3000 6300 3000\nWire Wire Line\n\t6050 3000 6050 2800\nWire Wire Line\n\t7600 3000 7850 3000\nWire Wire Line\n\t7600 3000 7600 2800\nText HLabel 3000 4150 0    60   Input ~ 0\nBTN_CFG_1\nWire Wire Line\n\t3000 4350 3250 4350\nWire Wire Line\n\t3000 4350 3000 4150\nText HLabel 4550 4150 0    60   Input ~ 0\nBTN_CFG_2\nText HLabel 6100 4150 0    60   Input ~ 0\nBTN_CFG_3\nText HLabel 7650 4150 0    60   Input ~ 0\nBTN_CFG_4\nWire Wire Line\n\t4550 4150 4550 4350\nWire Wire Line\n\t4550 4350 4800 4350\nWire Wire Line\n\t6100 4150 6100 4350\nWire Wire Line\n\t6100 4350 6350 4350\nWire Wire Line\n\t7650 4150 7650 4350\nWire Wire Line\n\t7650 4350 7900 4350\n$Comp\nL R R3\nU 1 1 577967E7\nP 4700 2750\nF 0 \"R3\" V 4780 2750 50  0000 C CNN\nF 1 \"3K3\" V 4700 2750 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 4630 2750 50  0001 C CNN\nF 3 \"\" H 4700 2750 50  0000 C CNN\nF 4 \"680EBK-ND\" H 4700 2750 60  0001 C CNN \"Digikey#\"\n\t1    4700 2750\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R5\nU 1 1 57796847\nP 6250 2750\nF 0 \"R5\" V 6330 2750 50  0000 C CNN\nF 1 \"3K3\" V 6250 2750 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 6180 2750 50  0001 C CNN\nF 3 \"\" H 6250 2750 50  0000 C CNN\nF 4 \"680EBK-ND\" H 6250 2750 60  0001 C CNN \"Digikey#\"\n\t1    6250 2750\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R7\nU 1 1 577968BC\nP 7800 2750\nF 0 \"R7\" V 7880 2750 50  0000 C CNN\nF 1 \"3K3\" V 7800 2750 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 7730 2750 50  0001 C CNN\nF 3 \"\" H 7800 2750 50  0000 C CNN\nF 4 \"680EBK-ND\" H 7800 2750 60  0001 C CNN \"Digikey#\"\n\t1    7800 2750\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R2\nU 1 1 5779693E\nP 3200 4100\nF 0 \"R2\" V 3280 4100 50  0000 C CNN\nF 1 \"3K3\" V 3200 4100 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 3130 4100 50  0001 C CNN\nF 3 \"\" H 3200 4100 50  0000 C CNN\nF 4 \"680EBK-ND\" H 3200 4100 60  0001 C CNN \"Digikey#\"\n\t1    3200 4100\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R4\nU 1 1 577969F3\nP 4750 4100\nF 0 \"R4\" V 4830 4100 50  0000 C CNN\nF 1 \"3K3\" V 4750 4100 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 4680 4100 50  0001 C CNN\nF 3 \"\" H 4750 4100 50  0000 C CNN\nF 4 \"680EBK-ND\" H 4750 4100 60  0001 C CNN \"Digikey#\"\n\t1    4750 4100\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R6\nU 1 1 57796A6F\nP 6300 4100\nF 0 \"R6\" V 6380 4100 50  0000 C CNN\nF 1 \"3K3\" V 6300 4100 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 6230 4100 50  0001 C CNN\nF 3 \"\" H 6300 4100 50  0000 C CNN\nF 4 \"680EBK-ND\" H 6300 4100 60  0001 C CNN \"Digikey#\"\n\t1    6300 4100\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R8\nU 1 1 57796AEC\nP 7850 4100\nF 0 \"R8\" V 7930 4100 50  0000 C CNN\nF 1 \"3K3\" V 7850 4100 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 7780 4100 50  0001 C CNN\nF 3 \"\" H 7850 4100 50  0000 C CNN\nF 4 \"680EBK-ND\" H 7850 4100 60  0001 C CNN \"Digikey#\"\n\t1    7850 4100\n\t-1   0    0    1   \n$EndComp\nText Notes 5400 2050 0    60   ~ 12\nBUTTONS\\n\nWire Notes Line\n\t8800 1850 2400 1850\nWire Wire Line\n\t4750 3950 4750 3800\n$Comp\nL VCC #PWR013\nU 1 1 5798AF98\nP 4750 3800\nF 0 \"#PWR013\" H 4750 3650 50  0001 C CNN\nF 1 \"VCC\" H 4750 3950 50  0000 C CNN\nF 2 \"\" H 4750 3800 50  0000 C CNN\nF 3 \"\" H 4750 3800 50  0000 C CNN\n\t1    4750 3800\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR014\nU 1 1 5798B8B6\nP 3200 3800\nF 0 \"#PWR014\" H 3200 3650 50  0001 C CNN\nF 1 \"VCC\" H 3200 3950 50  0000 C CNN\nF 2 \"\" H 3200 3800 50  0000 C CNN\nF 3 \"\" H 3200 3800 50  0000 C CNN\n\t1    3200 3800\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR015\nU 1 1 5798B8F1\nP 6300 3800\nF 0 \"#PWR015\" H 6300 3650 50  0001 C CNN\nF 1 \"VCC\" H 6300 3950 50  0000 C CNN\nF 2 \"\" H 6300 3800 50  0000 C CNN\nF 3 \"\" H 6300 3800 50  0000 C CNN\n\t1    6300 3800\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR016\nU 1 1 5798B9EC\nP 7850 3800\nF 0 \"#PWR016\" H 7850 3650 50  0001 C CNN\nF 1 \"VCC\" H 7850 3950 50  0000 C CNN\nF 2 \"\" H 7850 3800 50  0000 C CNN\nF 3 \"\" H 7850 3800 50  0000 C CNN\n\t1    7850 3800\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR017\nU 1 1 5798BB07\nP 7800 2450\nF 0 \"#PWR017\" H 7800 2300 50  0001 C CNN\nF 1 \"VCC\" H 7800 2600 50  0000 C CNN\nF 2 \"\" H 7800 2450 50  0000 C CNN\nF 3 \"\" H 7800 2450 50  0000 C CNN\n\t1    7800 2450\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR018\nU 1 1 5798BB42\nP 6250 2450\nF 0 \"#PWR018\" H 6250 2300 50  0001 C CNN\nF 1 \"VCC\" H 6250 2600 50  0000 C CNN\nF 2 \"\" H 6250 2450 50  0000 C CNN\nF 3 \"\" H 6250 2450 50  0000 C CNN\n\t1    6250 2450\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR019\nU 1 1 5798BB7D\nP 4700 2450\nF 0 \"#PWR019\" H 4700 2300 50  0001 C CNN\nF 1 \"VCC\" H 4700 2600 50  0000 C CNN\nF 2 \"\" H 4700 2450 50  0000 C CNN\nF 3 \"\" H 4700 2450 50  0000 C CNN\n\t1    4700 2450\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR020\nU 1 1 5798BBB8\nP 3150 2450\nF 0 \"#PWR020\" H 3150 2300 50  0001 C CNN\nF 1 \"VCC\" H 3150 2600 50  0000 C CNN\nF 2 \"\" H 3150 2450 50  0000 C CNN\nF 3 \"\" H 3150 2450 50  0000 C CNN\n\t1    3150 2450\n\t1    0    0    -1  \n$EndComp\n$EndSCHEMATC\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Schematic/buzzer.sch",
    "content": "EESchema Schematic File Version 2\nLIBS:simonShield-rescue\nLIBS:simonLib\nLIBS:74xgxx\nLIBS:74xx\nLIBS:ac-dc\nLIBS:actel\nLIBS:adc-dac\nLIBS:Altera\nLIBS:analog_devices\nLIBS:analog_switches\nLIBS:atmel\nLIBS:audio\nLIBS:brooktre\nLIBS:cmos4000\nLIBS:cmos_ieee\nLIBS:conn\nLIBS:contrib\nLIBS:cypress\nLIBS:dc-dc\nLIBS:device\nLIBS:digital-audio\nLIBS:diode\nLIBS:display\nLIBS:dsp\nLIBS:elec-unifil\nLIBS:ESD_Protection\nLIBS:ftdi\nLIBS:gennum\nLIBS:graphic\nLIBS:hc11\nLIBS:intel\nLIBS:interface\nLIBS:ir\nLIBS:Lattice\nLIBS:linear\nLIBS:logo\nLIBS:maxim\nLIBS:memory\nLIBS:microchip\nLIBS:microchip_dspic33dsc\nLIBS:microchip_pic10mcu\nLIBS:microchip_pic12mcu\nLIBS:microchip_pic16mcu\nLIBS:microchip_pic18mcu\nLIBS:microchip_pic32mcu\nLIBS:microcontrollers\nLIBS:motor_drivers\nLIBS:motorola\nLIBS:msp430\nLIBS:nordicsemi\nLIBS:nxp_armmcu\nLIBS:onsemi\nLIBS:opto\nLIBS:Oscillators\nLIBS:philips\nLIBS:power\nLIBS:powerint\nLIBS:Power_Management\nLIBS:pspice\nLIBS:references\nLIBS:regul\nLIBS:relays\nLIBS:rfcom\nLIBS:sensors\nLIBS:silabs\nLIBS:siliconi\nLIBS:stm8\nLIBS:stm32\nLIBS:supertex\nLIBS:switches\nLIBS:texas\nLIBS:transf\nLIBS:transistors\nLIBS:ttl_ieee\nLIBS:valves\nLIBS:video\nLIBS:Worldsemi\nLIBS:Xicor\nLIBS:xilinx\nLIBS:Zilog\nLIBS:simonShield-cache\nEELAYER 25 0\nEELAYER END\n$Descr A4 11693 8268\nencoding utf-8\nSheet 3 5\nTitle \"Poncho Simon EDU-CIAA\"\nDate \"2016-07-26\"\nRev \"1.0\"\nComp \"Proyecto CIAA\"\nComment1 \"Juan Agustin Bassi\"\nComment2 \"CESE - Diseño PCB\"\nComment3 \"Licencia BSD\"\nComment4 \"\"\n$EndDescr\n$Comp\nL BUZZER U1\nU 1 1 5777FCBE\nP 5600 4150\nF 0 \"U1\" H 5600 4150 60  0000 C CNN\nF 1 \"BUZZER\" H 5600 4150 60  0000 C CNN\nF 2 \"footprints:MagneticBuzzer_ProSignal_ABT-410-RC\" H 5600 4150 60  0001 C CNN\nF 3 \"\" H 5600 4150 60  0000 C CNN\nF 4 \"445-2525-1-ND\" H 5600 4150 60  0001 C CNN \"Digikey#\"\n\t1    5600 4150\n\t0    1    1    0   \n$EndComp\n$Comp\nL BC547 Q1\nU 1 1 5777FCC6\nP 5500 3350\nF 0 \"Q1\" H 5700 3425 50  0000 L CNN\nF 1 \"BC547\" H 5700 3350 50  0000 L CNN\nF 2 \"simonShield:TO-92_Molded_Narrow\" H 5700 3275 50  0000 L CIN\nF 3 \"\" H 5500 3350 50  0000 L CNN\nF 4 \"BC33725TACT-ND\" H 5500 3350 60  0001 C CNN \"Digikey#\"\n\t1    5500 3350\n\t1    0    0    -1  \n$EndComp\n$Comp\nL R R9\nU 1 1 5777FCCD\nP 5050 3350\nF 0 \"R9\" V 5130 3350 50  0000 C CNN\nF 1 \"3K3\" V 5050 3350 50  0000 C CNN\nF 2 \"footprints:Resistor_Horizontal_RM7mm\" V 4980 3350 50  0001 C CNN\nF 3 \"\" H 5050 3350 50  0000 C CNN\nF 4 \"680EBK-ND\" H 5050 3350 60  0001 C CNN \"Digikey#\"\n\t1    5050 3350\n\t0    1    1    0   \n$EndComp\n$Comp\nL GND #PWR017\nU 1 1 5777FCDA\nP 5600 4850\nF 0 \"#PWR017\" H 5600 4600 50  0001 C CNN\nF 1 \"GND\" H 5600 4700 50  0000 C CNN\nF 2 \"\" H 5600 4850 50  0000 C CNN\nF 3 \"\" H 5600 4850 50  0000 C CNN\n\t1    5600 4850\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t5600 2600 5600 3150\nWire Wire Line\n\t5600 3550 5600 3700\nWire Wire Line\n\t5600 4700 5600 4850\nWire Wire Line\n\t5200 3350 5300 3350\nText HLabel 4700 3050 0    60   Input ~ 0\nPWM\nWire Wire Line\n\t4700 3050 4700 3350\nWire Wire Line\n\t4700 3350 4900 3350\n$Comp\nL R R10\nU 1 1 577960FD\nP 5600 2450\nF 0 \"R10\" V 5680 2450 50  0000 C CNN\nF 1 \"1K\" H 5600 2450 50  0000 C CNN\nF 2 \"footprints:Resistor_Horizontal_RM7mm\" V 5530 2450 50  0001 C CNN\nF 3 \"\" H 5600 2450 50  0000 C CNN\nF 4 \"680EBK-ND\" H 5600 2450 60  0001 C CNN \"Digikey#\"\n\t1    5600 2450\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t5600 2100 5600 2300\nWire Notes Line\n\t3800 1000 3800 5450\nWire Notes Line\n\t3800 5450 7650 5450\nWire Notes Line\n\t7650 5450 7650 1000\nWire Notes Line\n\t7650 1350 3800 1350\nWire Notes Line\n\t7650 1000 3800 1000\nText Notes 5350 1250 0    60   ~ 12\nBUZZER CIRCUIT\n$Comp\nL VDD-RESCUE-simonShield #PWR018\nU 1 1 5777FCD4\nP 5600 2100\nF 0 \"#PWR018\" H 5600 1950 50  0001 C CNN\nF 1 \"VDD\" H 5600 2250 50  0000 C CNN\nF 2 \"\" H 5600 2100 50  0000 C CNN\nF 3 \"\" H 5600 2100 50  0000 C CNN\n\t1    5600 2100\n\t1    0    0    -1  \n$EndComp\n$EndSCHEMATC\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Schematic/ciaaConector.sch",
    "content": "EESchema Schematic File Version 2\nLIBS:simonLib\nLIBS:power\nLIBS:simonShield-cache\nEELAYER 25 0\nEELAYER END\n$Descr A4 11693 8268\nencoding utf-8\nSheet 4 4\nTitle \"Poncho Simon EDU-CIAA\"\nDate \"2016-07-26\"\nRev \"1.0\"\nComp \"Proyecto CIAA\"\nComment1 \"Juan Agustin Bassi\"\nComment2 \"CESE - Diseño PCB\"\nComment3 \"Licencia BSD\"\nComment4 \"\"\n$EndDescr\n$Comp\nL GND #PWR029\nU 1 1 57781CE9\nP 3200 3000\nF 0 \"#PWR029\" H 3200 2750 50  0001 C CNN\nF 1 \"GND\" H 3200 2850 50  0000 C CNN\nF 2 \"\" H 3200 3000 50  0000 C CNN\nF 3 \"\" H 3200 3000 50  0000 C CNN\n\t1    3200 3000\n\t1    0    0    -1  \n$EndComp\n$Comp\nL Conn_Poncho2P_2x_20x2 XA?\nU 2 1 57781CEF\nP 3900 3050\nAR Path=\"/57781CEF\" Ref=\"XA?\"  Part=\"2\" \nAR Path=\"/57781B52/57781CEF\" Ref=\"XA1\"  Part=\"2\" \nF 0 \"XA1\" H 4200 3450 60  0000 C CNN\nF 1 \"Conn_Poncho2P_2x_20x2\" H 4250 1350 60  0000 C CNN\nF 2 \"simonShield:Conn_Poncho_SinBorde\" H 3900 3050 60  0001 C CNN\nF 3 \"\" H 3900 3050 60  0000 C CNN\nF 4 \"952-2121-ND\" H 3900 3050 60  0001 C CNN \"Digikey#\"\n\t2    3900 3050\n\t1    0    0    -1  \n$EndComp\n$Comp\nL PWR_JUMPER P1\nU 1 1 57781CF6\nP 4250 2250\nF 0 \"P1\" H 4250 2400 50  0000 C CNN\nF 1 \"PWR_JUMPER\" H 4250 2100 50  0000 C CNN\nF 2 \"simonShield:Pin_Header_Straight_2x02\" H 4250 1050 50  0001 C CNN\nF 3 \"\" H 4250 1050 50  0000 C CNN\nF 4 \"952-2121-ND\" H 4250 2250 60  0001 C CNN \"Digikey#\"\n\t1    4250 2250\n\t1    0    0    -1  \n$EndComp\nNoConn ~ 4850 2850\nNoConn ~ 4850 2950\nNoConn ~ 4850 3050\nNoConn ~ 4850 3150\nNoConn ~ 4850 3250\nNoConn ~ 4850 3350\nNoConn ~ 4850 3450\nNoConn ~ 3650 4050\nNoConn ~ 3650 3950\nNoConn ~ 3650 3850\nNoConn ~ 3650 3750\nNoConn ~ 3650 3650\nNoConn ~ 3650 3550\nNoConn ~ 3650 3450\nNoConn ~ 3650 3350\nNoConn ~ 3650 3250\nNoConn ~ 3650 3050\nNoConn ~ 3650 2950\nText HLabel 4850 3750 2    60   Input ~ 0\nBTN_CFG_1\nText HLabel 4850 3850 2    60   Input ~ 0\nBTN_CFG_2\nText HLabel 4850 4450 2    60   Input ~ 0\nBTN_CFG_3\nText HLabel 4850 4650 2    60   Input ~ 0\nBTN_CFG_4\nText HLabel 3650 4350 0    60   Input ~ 0\nLED_4\nText HLabel 4850 4350 2    60   Input ~ 0\nLED_3\nText HLabel 4850 4050 2    60   Input ~ 0\nLED_2\nText HLabel 4850 3550 2    60   Input ~ 0\nLED_1\nText HLabel 3650 4450 0    60   Input ~ 0\nBTN_LED_4\nText HLabel 4850 4550 2    60   Input ~ 0\nBTN_LED_3\nText HLabel 4850 3950 2    60   Input ~ 0\nBTN_LED_2\nText HLabel 4850 3650 2    60   Input ~ 0\nBTN_LED_1\nText HLabel 3650 3150 0    60   Input ~ 0\nPWM\n$Comp\nL Conn_Poncho2P_2x_20x2 XA1\nU 1 1 577946F6\nP 7400 3000\nF 0 \"XA1\" H 7700 3400 60  0000 C CNN\nF 1 \"Conn_Poncho2P_2x_20x2\" H 7750 1300 60  0000 C CNN\nF 2 \"simonShield:Conn_Poncho_SinBorde\" H 7400 3000 60  0001 C CNN\nF 3 \"\" H 7400 3000 60  0000 C CNN\nF 4 \"952-2121-ND\" H 7400 3000 60  0001 C CNN \"Digikey#\"\n\t1    7400 3000\n\t1    0    0    -1  \n$EndComp\nNoConn ~ 7150 2700\nNoConn ~ 7150 2800\nNoConn ~ 7150 2900\nNoConn ~ 7150 3000\nNoConn ~ 7150 3100\nNoConn ~ 7150 3200\nNoConn ~ 7150 3300\nNoConn ~ 7150 3400\nNoConn ~ 7150 3500\nNoConn ~ 7150 3600\nNoConn ~ 7150 3700\nNoConn ~ 7150 3800\nNoConn ~ 7150 3900\nNoConn ~ 7150 4000\nNoConn ~ 7150 4100\nNoConn ~ 7150 4200\nNoConn ~ 7150 4300\nNoConn ~ 7150 4400\nNoConn ~ 7150 4500\nNoConn ~ 7150 4600\nNoConn ~ 8350 4600\nNoConn ~ 8350 4500\nNoConn ~ 8350 4400\nNoConn ~ 8350 4300\nNoConn ~ 8350 4200\nNoConn ~ 8350 4100\nNoConn ~ 8350 4000\nNoConn ~ 8350 3900\nNoConn ~ 8350 3800\nNoConn ~ 8350 3700\nNoConn ~ 8350 3600\nNoConn ~ 8350 3500\nNoConn ~ 8350 3400\nNoConn ~ 8350 3300\nNoConn ~ 8350 3200\nNoConn ~ 8350 3100\nNoConn ~ 8350 3000\nNoConn ~ 8350 2900\nNoConn ~ 8350 2800\nNoConn ~ 8350 2700\nText Notes 5450 1150 0    60   ~ 12\nEDU-CIAA NXP CONNECTORS\nText Notes 4100 1300 0    60   ~ 12\nP2\nText Notes 7700 1300 0    60   ~ 12\nP1\n$Comp\nL GND #PWR030\nU 1 1 578F601E\nP 3400 4750\nF 0 \"#PWR030\" H 3400 4500 50  0001 C CNN\nF 1 \"GND\" H 3400 4600 50  0000 C CNN\nF 2 \"\" H 3400 4750 50  0000 C CNN\nF 3 \"\" H 3400 4750 50  0000 C CNN\n\t1    3400 4750\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR031\nU 1 1 57781D17\nP 5150 2900\nF 0 \"#PWR031\" H 5150 2650 50  0001 C CNN\nF 1 \"GND\" H 5150 2750 50  0000 C CNN\nF 2 \"\" H 5150 2900 50  0000 C CNN\nF 3 \"\" H 5150 2900 50  0000 C CNN\n\t1    5150 2900\n\t1    0    0    -1  \n$EndComp\n$Comp\nL C_100nF C1\nU 1 1 57781D10\nP 5150 2550\nF 0 \"C1\" H 5150 2650 40  0000 L CNN\nF 1 \"C_100nF\" H 5156 2465 40  0000 L CNN\nF 2 \"simonShield:C_Disc_D3_P2.5\" H 5188 2400 30  0001 C CNN\nF 3 \"\" H 5150 2550 60  0000 C CNN\nF 4 \"BC1160TR­ND\" H 5150 2550 60  0001 C CNN \"Digikey#\"\n\t1    5150 2550\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR032\nU 1 1 5798B140\nP 4800 2050\nF 0 \"#PWR032\" H 4800 1900 50  0001 C CNN\nF 1 \"VCC\" H 4800 2200 50  0000 C CNN\nF 2 \"\" H 4800 2050 50  0000 C CNN\nF 3 \"\" H 4800 2050 50  0000 C CNN\n\t1    4800 2050\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t4850 2750 4900 2750\nWire Wire Line\n\t4900 2750 4900 2500\nWire Wire Line\n\t4900 2500 3800 2500\nWire Wire Line\n\t3800 2500 3800 2300\nWire Wire Line\n\t3800 2300 4000 2300\nWire Wire Line\n\t3650 2750 3600 2750\nWire Wire Line\n\t3600 2750 3600 2200\nWire Wire Line\n\t3600 2200 4000 2200\nWire Wire Line\n\t3200 2850 3200 3000\nWire Wire Line\n\t3650 2850 3200 2850\nWire Notes Line\n\t1950 1050 1950 5450\nWire Notes Line\n\t1950 5450 9850 5450\nWire Notes Line\n\t9850 5450 9850 1050\nWire Notes Line\n\t9850 1050 1950 1050\nWire Notes Line\n\t1950 1200 9850 1200\nWire Notes Line\n\t9850 1350 1950 1350\nWire Notes Line\n\t6050 1200 6050 5450\nWire Wire Line\n\t3650 4650 3400 4650\nWire Wire Line\n\t3400 4550 3400 4750\nWire Wire Line\n\t3650 4550 3400 4550\nConnection ~ 3400 4650\nWire Wire Line\n\t5150 2750 5150 2900\nWire Wire Line\n\t4500 2200 4800 2200\nWire Wire Line\n\t4800 2300 4800 2050\nWire Wire Line\n\t4500 2300 5150 2300\nConnection ~ 4800 2200\nWire Wire Line\n\t5150 2300 5150 2350\nConnection ~ 4800 2300\nNoConn ~ 3650 4250\nNoConn ~ 3650 4150\nNoConn ~ 4850 4150\nNoConn ~ 4850 4250\n$EndSCHEMATC\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Schematic/gedda-junk.sch",
    "content": "v 20080706 2\nT 10000 20000 9 10 1 0 0 0 1\n_0_0_   0.sym\nT 10000 19800 9 10 1 0 0 0 1\n_1_1_   1.sym\nT 10000 19600 9 10 1 0 0 0 1\n_2_2_   2.sym\nT 10000 19400 9 10 1 0 0 0 1\n_3_3_   3.sym\nT 10000 19200 9 10 1 0 0 0 1\n_4_4_   4.sym\nT 10000 19000 9 10 1 0 0 0 1\n_5_5_   5.sym\nT 10000 18800 9 10 1 0 0 0 1\n_6_6_   6.sym\nT 10000 18600 9 10 1 0 0 0 1\n_7_7_   7.sym\nT 10000 18400 9 10 1 0 0 0 1\n_8_8_   8.sym\nT 10000 18200 9 10 1 0 0 0 1\n_9_9_   9.sym\nT 18000 17200 9 10 1 0 0 0 1\n_q_q_   q_.sym\nv 20130925 2\nC 40000 40000 0 0 0 title-B.sym\nN 43500 47000 44200 47000 4\nN 44200 47000 44200 49400 4\nN 44200 49400 41800 49400 4\nN 41800 47300 41800 49400 4\nN 41800 47300 41500 47300 4\nN 41500 47300 41500 45600 4\nN 41500 45600 41600 45600 4\nN 41600 45600 41600 44600 4\nN 41100 44600 41600 44600 4\nN 41100 44600 41100 42900 4\nN 41100 42900 42400 42900 4\nN 42400 42900 42400 43600 4\nN 42400 43600 41000 43600 4\nN 41000 43600 41000 41300 4\nU 45300 49600 45300 43900 10 0\nU 45300 43900 53800 43900 10 0\nU 53800 43900 53800 45900 10 0\nU 53800 45900 53100 45900 10 0\nU 53100 45900 53100 47300 10 0\nU 53100 47300 50500 47300 10 0\nV 48500 47400 900 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1\nP 47300 49100 50100 49100 1 0 0\n{\nT 47300 49100 5 10 0 0 0 0 1\npintype=unknown\nT 50155 49095 5 10 1 1 0 0 1\npinlabel=unknown\nT 50005 49145 5 10 1 1 0 6 1\npinnumber=0\nT 47300 49100 5 10 0 0 0 0 1\npinseq=0\n}\nP 51800 50000 51800 48500 1 0 0\n{\nT 51800 50000 5 10 0 0 0 0 1\npintype=unknown\nT 51800 48445 5 10 1 1 90 6 1\npinlabel=unknown\nT 51750 48595 5 10 1 1 90 0 1\npinnumber=0\nT 51800 50000 5 10 0 0 0 0 1\npinseq=0\n}\nP 54500 48500 54500 47900 1 0 0\n{\nT 54500 48500 5 10 0 0 0 0 1\npintype=unknown\nT 54500 47845 5 10 1 1 90 6 1\npinlabel=unknown\nT 54450 47995 5 10 1 1 90 0 1\npinnumber=0\nT 54500 48500 5 10 0 0 0 0 1\npinseq=0\n}\nC 46700 49800 1 0 0 af_output_transformer-1.sym\n{\nT 48000 52200 5 10 0 0 0 0 1\ndevice=AF_OUTPUT_TRANSFORMER\nT 48000 51900 5 10 1 1 0 0 1\nrefdes=U?\n}\nC 42900 41300 1 0 0 af_output_transformer-1.sym\n{\nT 44200 43700 5 10 0 0 0 0 1\ndevice=AF_OUTPUT_TRANSFORMER\nT 44200 43400 5 10 1 1 0 0 1\nrefdes=U?\n}\nT 48100 42000 9 10 1 0 0 0 1\nNFI_LOL\nC 42200 44500 1 0 0 ssrelay-spdt-lcc110-1.sym\n{\nT 42500 47100 5 10 0 0 0 0 1\ndevice=LCC110\nT 42500 46700 5 10 0 0 0 0 1\nsymversion=0.1\nT 42500 46250 5 10 1 1 0 0 1\nrefdes=U?\nT 42500 46900 5 10 0 0 0 0 1\nfootprint=DIP8\n}\nU 53200 50000 53200 47900 10 0\nU 53200 47900 53700 47900 10 0\nU 53700 47900 53700 46500 10 0\nU 53700 46500 54200 46500 10 0\nU 54200 46500 54200 43800 10 0\nU 54200 43800 45500 43800 10 0\nU 45500 43800 45500 42600 10 0\nU 45500 42600 49200 42600 10 0\nU 49200 42600 49200 41500 10 0\nU 49200 41500 47700 41500 10 0\nU 47700 41500 47700 42200 10 0\nU 47700 42200 45300 42200 10 0\nU 45300 42200 45300 40500 10 0\nU 45300 40500 40900 40500 10 0\nU 40900 40500 40900 41000 10 0\nU 40900 41000 40500 41000 10 0\nU 40500 41000 40500 50300 10 0\nU 40500 50300 45800 50300 10 0\nU 45800 50300 45800 49700 10 0\nU 45800 49700 45300 49700 10 0\nU 45300 49700 45300 48100 10 0\nU 45300 48100 43600 48100 10 0\nC 42500 47400 1 0 0 switch-dip12.sym\n{\nT 42800 51700 5 10 1 1 0 0 1\nfootprint=SWITCH_DIP12\nT 42800 51975 5 8 0 0 0 0 1\ndevice=SWITCH_DIP12\nT 42800 51350 5 10 1 1 0 0 1\nrefdes=S?\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/KiCad Schematic/ultimate-temp-controller.sch",
    "content": "EESchema Schematic File Version 2\nLIBS:power\nLIBS:device\nLIBS:transistors\nLIBS:conn\nLIBS:linear\nLIBS:regul\nLIBS:74xx\nLIBS:cmos4000\nLIBS:adc-dac\nLIBS:memory\nLIBS:xilinx\nLIBS:special\nLIBS:microcontrollers\nLIBS:dsp\nLIBS:microchip\nLIBS:analog_switches\nLIBS:motorola\nLIBS:texas\nLIBS:intel\nLIBS:audio\nLIBS:interface\nLIBS:digital-audio\nLIBS:philips\nLIBS:display\nLIBS:cypress\nLIBS:siliconi\nLIBS:opto\nLIBS:atmel\nLIBS:contrib\nLIBS:valves\nLIBS:relays\nLIBS:w_relay\nLIBS:ultimate-temp-controller-cache\nEELAYER 25 0\nEELAYER END\n$Descr A4 11693 8268\nencoding utf-8\nSheet 1 2\nTitle \"\"\nDate \"\"\nRev \"\"\nComp \"\"\nComment1 \"\"\nComment2 \"\"\nComment3 \"\"\nComment4 \"\"\n$EndDescr\n$Sheet\nS 1400 2100 2150 2000\nU 54E5B803\nF0 \"controller\" 60\nF1 \"controller.sch\" 60\nF2 \"TC+\" I L 1400 2300 60 \nF3 \"TC-\" I L 1400 2400 60 \nF4 \"VCC\" I L 1400 3750 60 \nF5 \"GND\" I L 1400 3900 60 \nF6 \"RS485A\" I R 3550 3700 60 \nF7 \"RS485B\" I R 3550 3800 60 \nF8 \"DRAIN\" O R 3550 3300 60 \nF9 \"+5V\" O R 3550 2250 60 \nF10 \"SDA\" B R 3550 2350 60 \nF11 \"SCL\" B R 3550 2450 60 \nF12 \"GND\" O R 3550 2550 60 \nF13 \"RELAY_NO\" I R 3550 2850 60 \nF14 \"RELAY_COM\" I R 3550 3050 60 \nF15 \"RELAY_NC\" I R 3550 2950 60 \n$EndSheet\n$EndSCHEMATC\n"
  },
  {
    "path": "src/test/resources/samples/langs/Kit/demo.kit",
    "content": "<!-- $pageTitle: The Kit Language -->\n\n<section>\n\t<h1><!-- $pageTitle --></h1>\n\t<p>\n\t\t<!-- @include \"loremipsum\" -->\n\t</p>\n</section>"
  },
  {
    "path": "src/test/resources/samples/langs/Kotlin/Foo.kt",
    "content": "package addressbook\n\nclass Contact(\n  val name : String,\n  val emails : List<EmailAddress>,\n  val addresses : List<PostalAddress>,\n  val phonenums : List<PhoneNumber>\n)\n\nclass EmailAddress(\n  val user : String,\n  val host : String\n)\n\nclass PostalAddress(\n  val streetAddress : String,\n  val city : String,\n  val zip : String,\n  val state : USState?,\n  val country : Country\n) {\n   assert {(state == null) xor (country == Countries[\"US\"]) }\n}\n\nclass PhoneNumber(\n  val country : Country,\n  val areaCode : Int,\n  val number : Long\n)\n\nobject Countries {\n  fun get(id : CountryID) : Country = countryTable[id]\n  \n  private var table : Map<String, Country>? = null\n  private val countryTable : Map<String, Country>\n    get() {\n      if (table == null) {\n        table = HashMap()\n        for (line in TextFile(\"countries.txt\").lines(stripWhiteSpace = true)) {\n          table[line] = Country(line)\n        }\n      }\n      return table\n    }\n}\n\nclass Country(val name : String)"
  },
  {
    "path": "src/test/resources/samples/langs/LFE/church.lfe",
    "content": ";; Copyright (c) 2013 Duncan McGreggor <oubiwann@cogitat.io>\n;;\n;; Licensed under the Apache License, Version 2.0 (the \"License\");\n;; you may not use this file except in compliance with the License.\n;; You may obtain a copy of the License at\n;;\n;;     http://www.apache.org/licenses/LICENSE-2.0\n;;\n;; Unless required by applicable law or agreed to in writing, software\n;; distributed under the License is distributed on an \"AS IS\" BASIS,\n;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n;; See the License for the specific language governing permissions and\n;; limitations under the License.\n\n;; File    : church.lfe\n;; Author  : Duncan McGreggor\n;; Purpose : Demonstrating church numerals from the lambda calculus\n\n;; The code below was used to create the section of the user guide here:\n;;    http://lfe.github.io/user-guide/recursion/5.html\n;;\n;; Here is some example usage:\n;;\n;; > (slurp '\"church.lfe\")\n;; #(ok church)\n;; > (zero)\n;; #Fun<lfe_eval.10.53503600>\n;; > (church->int1 (zero))\n;; 0\n;; > (church->int1 (three))\n;; 3\n;; > (church->int1 (five))\n;; 5\n;; > (church->int2 #'five/0)\n;; 5\n;; > (church->int2 (lambda () (get-church 25)))\n;; 25\n\n(defmodule church\n  (export all))\n\n(defun zero ()\n  (lambda (s)\n    (lambda (x) x)))\n\n(defun one ()\n  (lambda (s)\n    (lambda (x)\n      (funcall s x))))\n\n(defun two ()\n  (lambda (s)\n    (lambda (x)\n      (funcall s\n        (funcall s x)))))\n\n(defun three ()\n  (lambda (s)\n    (lambda (x)\n      (funcall s\n        (funcall s\n          (funcall s x))))))\n\n(defun four ()\n  (lambda (s)\n    (lambda (x)\n      (funcall s\n        (funcall s\n          (funcall s\n            (funcall s x)))))))\n\n(defun five ()\n  (get-church 5))\n\n(defun int-successor (n)\n  (+ n 1))\n\n(defun church->int1 (church-numeral)\n  \"\n  Converts a called church numeral to an integer, e.g.:\n  > (church->int1 (five))\n  \"\n  (funcall\n    (funcall church-numeral #'int-successor/1) 0))\n\n(defun church->int2 (church-numeral)\n  \"\n  Converts a non-called church numeral to an integer, e.g.:\n  > (church->int2 #'five/0)\n  \"\n  (funcall\n    (funcall\n      (funcall church-numeral) #'int-successor/1) 0))\n\n(defun church-successor (church-numeral)\n  (lambda (s)\n    (lambda (x)\n      (funcall s\n        (funcall\n          (funcall church-numeral s) x)))))\n\n(defun get-church (church-numeral count limit)\n  (cond ((== count limit) church-numeral)\n        ((/= count limit)\n         (get-church\n           (church-successor church-numeral)\n           (+ 1 count)\n           limit))))\n\n(defun get-church (integer)\n  (get-church (zero) 0 integer))\n"
  },
  {
    "path": "src/test/resources/samples/langs/LFE/gps1.lfe",
    "content": ";;; -*- Mode: LFE; -*-\n;;; Code from Paradigms of Artificial Intelligence Programming\n;;; Copyright (c) 1991 Peter Norvig\n\n;;;; File gps1.lisp: First version of GPS (General Problem Solver)\n\n;;;; Converted to LFE by Robert Virding\n\n;; Define macros for global variable access. This is a hack and very naughty!\n(defsyntax defvar\n  ([name val] (let ((v val)) (put 'name v) v)))\n\n(defsyntax setvar\n  ([name val] (let ((v val)) (put 'name v) v)))\n\n(defsyntax getvar\n  ([name] (get 'name)))\n\n;; Module definition.\n\n(defmodule gps1\n  (export (gps 2) (gps 3) (school-ops 0))\n  (import (from lists (member 2) (all 2) (any 2))\n      ;; Rename lists functions to be more CL like.\n      (rename lists ((all 2) every) ((any 2) some) ((filter 2) find-all))))\n\n;; An operation.\n(defrecord op\n  action preconds add-list del-list)\n\n;; General Problem Solver: achieve all goals using *ops*.\n(defun gps (state goals ops)\n  ;; Set global variables\n  (defvar *state* state)    ;The current state: a list of conditions.\n  (defvar *ops* ops)        ;A list of available operators.\n  (if (every (fun achieve 1) goals) 'solved))\n\n(defun gps (state goals)\n  ;; Set global variables, but use existing *ops*\n  (defvar *state* state)    ;The current state: a list of conditions.\n  (if (every (fun achieve 1) goals) 'solved))\n\n;; A goal is achieved if it already holds or if there is an\n;; appropriate op for it that is applicable.\"\n(defun achieve (goal)\n  (orelse (member goal (getvar *state*))\n      (some (fun apply-op 1)\n        (find-all (lambda (op) (appropriate-p goal op))\n              (getvar *ops*)))))\n\n;; An op is appropriate to a goal if it is in its add list.\n(defun appropriate-p (goal op)\n  (member goal (op-add-list op)))\n\n;; Print a message and update *state* if op is applicable.\n(defun apply-op (op)\n  (if (every (fun achieve 1) (op-preconds op))\n    (progn\n      (: io fwrite '\"executing ~p\\n\" (list (op-action op)))\n      (setvar *state* (set-difference (getvar *state*) (op-del-list op)))\n      (setvar *state* (union (getvar *state*) (op-add-list op)))\n      'true)))\n\n;; Define the set functions to work on list, a listsets module really.\n(defun set-difference\n  ([(cons e es) s2]\n   (if (member e s2)\n     (set-difference es s2)\n     (cons e (set-difference es s2))))\n  ([() s2] ()))\n\n(defun union\n  ([(cons e es) s2]\n   (if (member e s2) (union es s2) (cons e (union es s2))))\n  ([() s2] ()))\n\n;;; ==============================\n\n(defun school-ops ()\n  (list\n    (make-op action 'drive-son-to-school\n         preconds '(son-at-home car-works)\n         add-list '(son-at-school)\n         del-list '(son-at-home))\n    (make-op action 'shop-installs-battery\n         preconds '(car-needs-battery shop-knows-problem shop-has-money)\n         add-list '(car-works)\n         del-list ())\n    (make-op action 'tell-shop-problem\n         preconds '(in-communication-with-shop)\n         add-list '(shop-knows-problem)\n         del-list ())\n    (make-op action 'telephone-shop\n         preconds '(know-phone-number)\n         add-list '(in-communication-with-shop)\n         del-list ())\n    (make-op action 'look-up-number\n         preconds '(have-phone-book)\n         add-list '(know-phone-number)\n         del-list ())\n    (make-op action 'give-shop-money\n         preconds '(have-money)\n         add-list '(shop-has-money)\n         del-list '(have-money))))\n"
  },
  {
    "path": "src/test/resources/samples/langs/LFE/mnesia_demo.lfe",
    "content": ";; Copyright (c) 2008-2013 Robert Virding\n;;\n;; Licensed under the Apache License, Version 2.0 (the \"License\");\n;; you may not use this file except in compliance with the License.\n;; You may obtain a copy of the License at\n;;\n;;     http://www.apache.org/licenses/LICENSE-2.0\n;;\n;; Unless required by applicable law or agreed to in writing, software\n;; distributed under the License is distributed on an \"AS IS\" BASIS,\n;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n;; See the License for the specific language governing permissions and\n;; limitations under the License.\n\n;; File    : mnesia_demo.lfe\n;; Author  : Robert Virding\n;; Purpose : A simple Mnesia demo file for LFE.\n\n;; This file contains a simple demo of using LFE to access Mnesia\n;; tables.  It shows how to use the emp-XXXX macro (ETS match pattern)\n;; together with mnesia:match_object, match specifications with\n;; mnesia:select and Query List Comprehensions.\n\n(defmodule mnesia_demo\n  (export (new 0) (by_place 1) (by_place_ms 1) (by_place_qlc 1)))\n\n(defrecord person name place job)\n\n(defun new ()\n  ;; Start mnesia and create a table, we will get an in memory only schema.\n  (: mnesia start)\n  (: mnesia create_table 'person '(#(attributes (name place job))))\n  ;; Initialise the table.\n  (let ((people '(\n          ;; First some people in London.\n          #(fred london waiter)\n          #(bert london waiter)\n          #(john london painter)\n          #(paul london driver)\n          ;; Now some in Paris.\n          #(jean paris waiter)\n          #(gerard paris driver)\n          #(claude paris painter)\n          #(yves paris waiter)\n          ;; And some in Rome.\n          #(roberto rome waiter)\n          #(guiseppe rome driver)\n          #(paulo rome painter)\n          ;; And some in Berlin.\n          #(fritz berlin painter)\n          #(kurt berlin driver)\n          #(hans berlin waiter)\n          #(franz berlin waiter)\n          )))\n    (: lists foreach (match-lambda\n               ([(tuple n p j)]\n            (: mnesia transaction\n              (lambda ()\n                (let ((new (make-person name n place p job j)))\n                  (: mnesia write new))))))\n       people)))\n\n;; Match records by place using match_object and the emp-XXXX macro.\n(defun by_place (place)\n  (: mnesia transaction\n    (lambda () (: mnesia match_object (emp-person place place)))))\n\n;; Use match specifications to match records\n(defun by_place_ms (place)\n  (let ((f (lambda () (: mnesia select 'person\n             (match-spec ([(match-person name n place p job j)]\n                      (when (=:= p place))\n                      (tuple n j)))))))\n    (: mnesia transaction f)))\n\n;; Use Query List Comprehensions to match records\n(defun by_place_qlc (place)\n  (let ((f (lambda ()\n         (let ((q (qlc (lc ((<- person (: mnesia table 'person))\n                (=:= (person-place person) place))\n                 person))))\n           (: qlc e q)))))\n    (: mnesia transaction f)))\n"
  },
  {
    "path": "src/test/resources/samples/langs/LFE/object.lfe",
    "content": ";; Copyright (c) 2013 Duncan McGreggor <oubiwann@cogitat.io>\n;;\n;; Licensed under the Apache License, Version 2.0 (the \"License\");\n;; you may not use this file except in compliance with the License.\n;; You may obtain a copy of the License at\n;;\n;;     http://www.apache.org/licenses/LICENSE-2.0\n;;\n;; Unless required by applicable law or agreed to in writing, software\n;; distributed under the License is distributed on an \"AS IS\" BASIS,\n;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n;; See the License for the specific language governing permissions and\n;; limitations under the License.\n\n;; File    : object.lfe\n;; Author  : Duncan McGreggor\n;; Purpose : Demonstrating simple OOP with closures\n\n;; The simple object system demonstrated below shows how to do the following:\n;;  * create objects\n;;  * call methods on those objects\n;;  * have methods which can call other methods\n;;  * update the state of an instance variable\n;;\n;; Note, however, that his example does not demonstrate inheritance.\n;;\n;; To use the code below in LFE, do the following:\n;;\n;;  $ cd examples\n;;  $ ../bin/lfe -pa ../ebin\n;;\n;; Load the file and create a fish-class instance:\n;;\n;; > (slurp '\"object.lfe\")\n;; #(ok object)\n;; > (set mommy-fish (fish-class '\"Carp\"))\n;; #Fun<lfe_eval.10.91765564>\n;;\n;; Execute some of the basic methods:\n;;\n;; > (get-species mommy-fish)\n;; \"Carp\"\n;; > (move mommy-fish 17)\n;; The Carp swam 17 feet!\n;; ok\n;; > (get-id mommy-fish)\n;; \"47eebe91a648f042fc3fb278df663de5\"\n;;\n;; Now let's look at \"modifying\" state data (e.g., children counts):\n;;\n;; > (get-children mommy-fish)\n;; ()\n;; > (get-children-count mommy-fish)\n;; 0\n;; > (set (mommy-fish baby-fish-1) (reproduce mommy-fish))\n;; (#Fun<lfe_eval.10.91765564> #Fun<lfe_eval.10.91765564>)\n;; > (get-id mommy-fish)\n;; \"47eebe91a648f042fc3fb278df663de5\"\n;; > (get-id baby-fish-1)\n;; \"fdcf35983bb496650e558a82e34c9935\"\n;; > (get-children-count mommy-fish)\n;; 1\n;; > (set (mommy-fish baby-fish-2) (reproduce mommy-fish))\n;; (#Fun<lfe_eval.10.91765564> #Fun<lfe_eval.10.91765564>)\n;; > (get-id mommy-fish)\n;; \"47eebe91a648f042fc3fb278df663de5\"\n;; > (get-id baby-fish-2)\n;; \"3e64e5c20fb742dd88dac1032749c2fd\"\n;; > (get-children-count mommy-fish)\n;; 2\n;; > (get-info mommy-fish)\n;; id: \"47eebe91a648f042fc3fb278df663de5\"\n;; species: \"Carp\"\n;; children: [\"fdcf35983bb496650e558a82e34c9935\",\n;;            \"3e64e5c20fb742dd88dac1032749c2fd\"]\n;; ok\n\n(defmodule object\n (export all))\n\n(defun fish-class (species)\n  \"\n  This is the constructor that will be used most often, only requiring that\n  one pass a 'species' string.\n\n  When the children are not defined, simply use an empty list.\n  \"\n  (fish-class species ()))\n\n(defun fish-class (species children)\n  \"\n  This contructor is mostly useful as a way of abstracting out the id\n  generation from the larger constructor. Nothing else uses fish-class/2\n  besides fish-class/1, so it's not strictly necessary.\n\n  When the id isn't know, generate one.\"\n  (let* (((binary (id (size 128))) (: crypto rand_bytes 16))\n         (formatted-id (car\n                         (: io_lib format\n                           '\"~32.16.0b\" (list id)))))\n    (fish-class species children formatted-id)))\n\n(defun fish-class (species children id)\n  \"\n  This is the constructor used internally, once the children and fish id are\n  known.\n  \"\n  (let ((move-verb '\"swam\"))\n    (lambda (method-name)\n      (case method-name\n        ('id\n          (lambda (self) id))\n        ('species\n          (lambda (self) species))\n        ('children\n          (lambda (self) children))\n        ('info\n          (lambda (self)\n            (: io format\n              '\"id: ~p~nspecies: ~p~nchildren: ~p~n\"\n              (list (get-id self)\n                    (get-species self)\n                    (get-children self)))))\n        ('move\n          (lambda (self distance)\n            (: io format\n              '\"The ~s ~s ~p feet!~n\"\n              (list species move-verb distance))))\n        ('reproduce\n          (lambda (self)\n            (let* ((child (fish-class species))\n                   (child-id (get-id child))\n                   (children-ids (: lists append\n                                   (list children (list child-id))))\n                   (parent-id (get-id self))\n                   (parent (fish-class species children-ids parent-id)))\n              (list parent child))))\n        ('children-count\n          (lambda (self)\n            (: erlang length children)))))))\n\n(defun get-method (object method-name)\n  \"\n  This is a generic function, used to call into the given object (class\n  instance).\n  \"\n  (funcall object method-name))\n\n; define object methods\n(defun get-id (object)\n  (funcall (get-method object 'id) object))\n\n(defun get-species (object)\n  (funcall (get-method object 'species) object))\n\n(defun get-info (object)\n  (funcall (get-method object 'info) object))\n\n(defun move (object distance)\n  (funcall (get-method object 'move) object distance))\n\n(defun reproduce (object)\n  (funcall (get-method object 'reproduce) object))\n\n(defun get-children (object)\n  (funcall (get-method object 'children) object))\n\n(defun get-children-count (object)\n  (funcall (get-method object 'children-count) object))"
  },
  {
    "path": "src/test/resources/samples/langs/LOLCODE/LOLTracer.lol",
    "content": "HAI 1.3\n    OBTW\n      Author: Logan Kelly (logan.kelly@gmail.com)\n      Github: https://github.com/LoganKelly/LOLTracer\n    TLDR\n\n    OBTW prev is the number used in the randin function.\n         I had to declare it in global scope so that it\n         would retain its value between calls to randin.\n    TLDR\n    I HAS A prev ITZ 0\n    I HAS A rand_max ITZ 104729\n\n\n    OBTW Equivalent to C's rand() function, except returns\n        a number in the range of 0 to rand_max.\n    TLDR\n    HOW IZ I randin\n        I HAS A a ITZ 33083\n        I HAS A c ITZ 67607\n        prev R MOD OF SUM OF PRODUKT OF prev AN a AN c AN rand_max\n        FOUND YR prev\n    IF U SAY SO\n\n\n    BTW Returns a random number within the range of 0-1.\n    HOW IZ I rand_onein\n        I HAS A rand_num ITZ I IZ randin MKAY\n        rand_num IS NOW A NUMBAR\n        I HAS A rand_max_float ITZ MAEK rand_max A NUMBAR\n        FOUND YR  QUOSHUNT OF rand_num AN rand_max_float\n    IF U SAY SO\n\n\n    OBTW Equivalent to C ceil() function. Returns the next\n        largest integer for the given number.\n    TLDR\n    HOW IZ I ceilin YR num\n        I HAS A int_num ITZ num\n        int_num IS NOW A NUMBR\n        BOTH SAEM int_num AN num, O RLY?\n            YA RLY, FOUND YR num\n        OIC\n        DIFFRINT num AN SMALLR OF num AN 0, O RLY?\n            YA RLY\n                int_num R SUM OF int_num AN 1\n                FOUND YR MAEK int_num A NUMBAR\n        OIC\n        DIFFRINT num AN BIGGR OF num AN 0, O RLY?\n            YA RLY\n                FOUND YR MAEK int_num A NUMBAR\n        OIC\n    IF U SAY SO\n\n\n    OBTW Convert a number to hexadecimal. This\n         is returned as a string.\n    TLDR\n    HOW IZ I decimal_to_hex YR num\n        I HAS A i ITZ 0\n        I HAS A rem\n        I HAS A hex_num ITZ A BUKKIT\n        I HAS A decimal_num ITZ num\n        IM IN YR num_loop\n            rem R MOD OF decimal_num AN 16\n            I HAS A hex_digit\n            rem, WTF?\n                OMG 10, hex_digit R \"A\", GTFO\n                OMG 11, hex_digit R \"B\", GTFO\n                OMG 12, hex_digit R \"C\", GTFO\n                OMG 13, hex_digit R \"D\", GTFO\n                OMG 14, hex_digit R \"E\", GTFO\n                OMG 15, hex_digit R \"F\", GTFO\n                OMGWTF, hex_digit R rem\n            OIC\n            hex_num HAS A SRS i ITZ hex_digit\n            decimal_num R QUOSHUNT OF decimal_num AN 16\n            BOTH SAEM decimal_num AN 0, O RLY?\n                YA RLY, GTFO\n                NO WAI, i R SUM OF i AN 1\n            OIC\n        IM OUTTA YR num_loop\n        I HAS A hex_string ITZ A YARN\n        IM IN YR string_reverse\n            DIFFRINT i AN BIGGR OF i AN 0, O RLY?\n                YA RLY, GTFO\n            OIC\n            hex_string R SMOOSH hex_string AN hex_num'Z SRS i MKAY\n            i R DIFF OF i AN 1\n        IM OUTTA YR string_reverse\n        FOUND YR hex_string\n    IF U SAY SO\n\n\n    OBTW Convert a number to binary. This is returned\n         as a bukkit which has slots number 0-N where\n         n is equal to the number of binary digits - 1.\n         It also has a length slot which is equal to\n         the number of binary digits.\n    TLDR\n    HOW IZ I decimal_to_binary YR num\n        I HAS A i ITZ 0\n        I HAS A decimal_num ITZ num\n        I HAS A binary_num ITZ A BUKKIT\n        IM IN YR num_loop\n            binary_num HAS A SRS i ITZ MOD OF decimal_num AN 2\n            decimal_num R QUOSHUNT OF decimal_num AN 2\n            BOTH SAEM decimal_num AN 0, O RLY?\n                YA RLY\n                    I HAS A length ITZ SUM OF i AN 1\n                    binary_num HAS A length ITZ length\n                    GTFO\n                NO WAI, i R SUM OF i AN 1\n            OIC\n        IM OUTTA YR num_loop\n        FOUND YR binary_num\n    IF U SAY SO\n\n\n    OBTW Bitwise and two binary numbers. The numbers\n         must be provided in the format returned by\n         decimal_to_binary.\n    TLDR\n    HOW IZ I bitwise_andin YR first_num AN YR second_num\n        I HAS A binary_first_num ITZ I IZ decimal_to_binary YR first_num MKAY\n        I HAS A binary_second_num ITZ I IZ decimal_to_binary YR second_num MKAY\n        I HAS A first_length ITZ binary_first_num'Z length\n        I HAS A second_length ITZ binary_second_num'Z length\n        I HAS A max_length ITZ BIGGR OF first_length AN second_length\n        I HAS A final_binary ITZ A BUKKIT\n        I HAS A final_length ITZ 0\n        I HAS A i ITZ 0\n        IM IN YR num_loop\n            BOTH SAEM i AN max_length, O RLY?\n                YA RLY, GTFO\n            OIC\n            I HAS A first_binary ITZ 0\n            I HAS A second_binary ITZ 0\n            DIFFRINT i AN BIGGR OF i AN first_length, O RLY?\n                YA RLY, first_binary R binary_first_num'Z SRS i\n            OIC\n            DIFFRINT i AN BIGGR OF i AN second_length, O RLY?\n                YA RLY, second_binary R binary_second_num'Z SRS i\n            OIC\n            EITHER OF BOTH SAEM first_binary AN 0 AN ...\n                      BOTH SAEM second_binary AN 0, O RLY?\n                YA RLY, final_binary HAS A SRS i ITZ 0\n                NO WAI\n                    final_binary HAS A SRS i ITZ 1\n                    final_length R SUM OF i AN 1\n            OIC\n            i R SUM OF i AN 1\n        IM OUTTA YR num_loop\n        final_binary HAS A length ITZ final_length\n        FOUND YR final_binary\n    IF U SAY SO\n\n\n    OBTW Bitshift left a binary number by num_bits.\n         The binary number must be provided in the format\n         returned by decimal_to_binary.\n    TLDR\n    HOW IZ I bit_shift_leftin YR num AN YR num_bits\n        I HAS A binary_num ITZ num\n        I HAS A length ITZ binary_num'Z length\n        I HAS A i ITZ SUM OF DIFF OF length AN 1 AN num_bits\n        I HAS A shifted_binary_num ITZ A BUKKIT\n        IM IN YR num_loop\n            BOTH SAEM i AN -1, O RLY?\n                YA RLY, GTFO\n            OIC\n            I HAS A unshifted_index ITZ DIFF OF i AN num_bits\n            BOTH SAEM unshifted_index AN BIGGR OF unshifted_index AN 0, O RLY?\n                YA RLY\n                    shifted_binary_num HAS A SRS i ITZ binary_num'Z SRS unshifted_index\n                NO WAI\n                    shifted_binary_num HAS A SRS i ITZ 0\n            OIC\n            i R DIFF OF i AN 1\n        IM OUTTA YR num_loop\n        shifted_binary_num HAS A length ITZ SUM OF binary_num'Z length AN num_bits\n        FOUND YR shifted_binary_num\n    IF U SAY SO\n\n\n    OBTW Convert a binary number into a decimal number.\n         The binary number must be provided in the format\n         return by decimal_to_binary.\n    TLDR\n    HOW IZ I binary_to_decimal YR binary_num\n        I HAS A length ITZ binary_num'Z length\n        I HAS A decimal_num ITZ 0\n        I HAS A i ITZ 0\n        IM IN YR num_loop\n            BOTH SAEM i AN length, O RLY?\n                YA RLY, GTFO\n            OIC\n            I HAS A binary_value ITZ binary_num'Z SRS i\n            I HAS A decimal_value ITZ 0\n            BOTH SAEM binary_value AN 1, O RLY?\n                YA RLY, decimal_value R I IZ power_of YR 2 AN YR i MKAY\n            OIC\n            decimal_num R SUM OF decimal_num AN decimal_value\n            i R SUM OF i AN 1\n        IM OUTTA YR num_loop\n        FOUND YR decimal_num\n    IF U SAY SO\n\n\n    OBTW Equivalent to C's pow() function. Raises\n         base to the power of exponent.\n    TLDR\n    HOW IZ I power_of YR base AN YR exponent\n        I HAS A i ITZ 0\n        I HAS A num ITZ 1\n        IM IN YR num_loop\n            BOTH SAEM i AN exponent, O RLY?\n                YA RLY, GTFO\n            OIC\n            num R PRODUKT OF num AN base\n            i R SUM OF i AN 1\n        IM OUTTA YR num_loop\n        FOUND YR num\n    IF U SAY SO\n\n\n    OBTW Return a binary number as a YARN.\n         The binary number must be provided in the format\n         return by decimal_to_binary.\n    TLDR\n    HOW IZ I binary_to_string YR binary_num\n        I HAS A binary_string ITZ A YARN\n        I HAS A i ITZ DIFF OF binary_num'Z length AN 1\n        IM IN YR string_reverse\n            DIFFRINT i AN BIGGR OF i AN 0, O RLY?\n                YA RLY, GTFO\n            OIC\n            binary_string R SMOOSH binary_string AN binary_num'Z SRS i MKAY\n            i R DIFF OF i AN 1\n        IM OUTTA YR string_reverse\n        FOUND YR binary_string\n    IF U SAY SO\n\n    OBTW Converts a hexadecimal number to the character\n         equivalent in UNICODE. This was originally used\n         in an attempt to write out to the P6 format of PPM,\n         but the string produced by VISIBLE didn't seem to be\n         properly formatted for some reason. Instead I fell back\n         to P3 of PPM and wrote out to regular ascii format.\n    TLDR\n    HOW IZ I hex_to_char YR hex_string\n        OBTW This is a hack I found for converting hexadecimal strings\n             into their unicode character equivalents. Instead of using\n             the \":\" character directly, we escape it and get it using its\n             unicode hex value (3A). This allows us to assemble the string\n             with our inserted hex value without errors.\n        TLDR\n        FOUND YR SMOOSH \":(3A)\" AN \"(\" AN hex_string AN \")\" MKAY\n    IF U SAY SO\n\n\n    OBTW Equivalent to C's square() function. However it will only\n         produce accurate results if the number is no larger than\n         1048576. See the note below. This is based upon Newton's\n         Approximation Method as adapted in C at this website (#11):\n\n         http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi\n    TLDR\n    HOW IZ I square_rootin YR number\n        OBTW Forcing a comparison between  the accuracy and a number\n             which is so big that its precision is larger than the\n             accuracy causes an infinite loop to occur. For this\n             reason we have to set any number larger than 2^20 to\n             a value below it.\n        TLDR\n        BOTH SAEM number AN BIGGR OF number AN 1048576.00, O RLY?\n            YA RLY, number R 1048575.00\n        OIC\n        I HAS A accuracy ITZ 0.0001\n        I HAS A lower ITZ A NUMBAR\n        I HAS A upper ITZ A NUMBAR\n        I HAS A guess ITZ A NUMBAR\n        DIFFRINT number AN BIGGR OF number AN 1.0, O RLY?\n            YA RLY\n                lower R number\n                upper R 1.0\n            NO WAI\n                lower R 1.0\n                upper R number\n        OIC\n        IM IN YR LOOP\n            I HAS A delta ITZ DIFF OF upper AN lower\n            BOTH SAEM delta AN SMALLR OF delta AN accuracy, O RLY?\n                YA RLY, GTFO\n            OIC\n            I HAS A guess ITZ QUOSHUNT OF SUM OF lower AN upper AN 2.0\n            I HAS A guess_squared ITZ PRODUKT OF guess AN guess\n            DIFFRINT guess_squared AN SMALLR OF guess_squared AN number, O RLY?\n                YA RLY\n                    upper R guess\n                NO WAI\n                    lower R guess\n            OIC\n        IM OUTTA YR LOOP\n        FOUND YR QUOSHUNT OF SUM OF lower AN upper AN 2.0\n    IF U SAY SO\n\n\n    OBTW\n         The intersection test for line [o, d]\n         Return 2 if a hit was found (and also return distance t and bouncing ray n).\n         Return 0 if no hit was found but ray goes upward\n         Return 1 if no hit was found but ray goes downward\n    TLDR\n    HOW IZ I tracin YR o AN YR d\n        I HAS A t ITZ 1000000000\n        I HAS A m ITZ 0\n        BOTH SAEM d'Z z AN 0, O RLY?\n            YA RLY, d'Z z R 0.00001\n        OIC\n        I HAS A p ITZ QUOSHUNT OF DIFF OF 0 AN o'Z z AN d'Z z\n        I HAS A n ITZ LIEK A Vector\n        DIFFRINT p AN SMALLR OF p AN 0.01, O RLY?\n            YA RLY\n                t R p\n                n R Vector IZ constructin YR 0.0 AN YR 0.0 AN YR 1.0 MKAY\n                m R 1\n        OIC\n\n        BTW The world is encoded in sphere_positions, with 9 lines and 19 columns\n        I HAS A k ITZ 18\n        IM IN YR column_loop BTW For each column of objects\n            BOTH SAEM k AN -1, O RLY?\n                YA RLY, GTFO\n            OIC\n\n            I HAS A j ITZ 8\n            IM IN YR line_loop BTW For each line on that column\n                BOTH SAEM j AN -1, O RLY?\n                    YA RLY, GTFO\n                OIC\n\n                I HAS A sphere_positions_line ITZ sphere_positions'Z SRS j\n                sphere_positions_line'Z SRS k, O RLY?\n                    YA RLY\n                       BTW There is a sphere, but does the ray hit it?\n                       p R Vector IZ addin YR o AN YR ...\n                           Vector IZ constructin YR DIFF OF 0 AN k AN ...\n                                                 YR 0 AN ...\n                                                 YR DIFF OF DIFF OF 0 AN j AN 4 MKAY ...\n                           MKAY\n                       I HAS A b ITZ Vector IZ dot_productin YR p AN YR d MKAY\n                       I HAS A q_c ITZ DIFF OF Vector IZ dot_productin YR p AN YR p MKAY AN 1\n                       I HAS A q ITZ DIFF OF PRODUKT OF b AN b AN q_c\n\n\n                       DIFFRINT q AN SMALLR OF q AN 0, O RLY?\n                           YA RLY\n                               BTW It does, compute the distance camera-sphere\n                               I HAS A s ITZ DIFF OF DIFF OF 0 AN b AN I IZ square_rootin YR q MKAY\n\n\n                               BOTH OF DIFFRINT s AN BIGGR OF s AN t AN ...\n                                       DIFFRINT s AN SMALLR OF s AN 0.01, O RLY?\n                                   YA RLY\n                                       BTW So far this is the minimum distance, save it. And\n                                       BTW also compute the bouncing ray vector into 'n'\n                                       t R s\n                                       I HAS A bouncing_ray ITZ Vector IZ scalin YR direction AN YR t MKAY\n                                       bouncing_ray R Vector IZ addin YR p AN YR bouncing_ray MKAY\n                                       n R Vector IZ normalizin YR bouncing_ray MKAY\n                                       m R 2\n                               OIC\n                       OIC\n                OIC\n                j R DIFF OF j AN 1\n            IM OUTTA YR line_loop\n            k R DIFF OF k AN 1\n        IM OUTTA YR column_loop\n        I HAS A result ITZ A BUKKIT\n        result HAS A m ITZ m\n        result HAS A t ITZ t\n        result HAS A n ITZ n\n        FOUND YR result\n    IF U SAY SO\n\n\n    OBTW\n        Sample the world and return the pixel color for\n        a ray [o, d]\n    TLDR\n    HOW IZ I samplin YR o AN YR d\n\n        BTW Search for an intersection ray Vs. world\n        I HAS A result ITZ I IZ tracin YR o AN YR d MKAY\n        I HAS A m ITZ result'Z m\n        I HAS A t ITZ result'Z t\n        I HAS A n ITZ result'Z n\n\n        BOTH SAEM m AN 0, O RLY?\n            YA RLY\n                BTW No sphere found and the ray goes upward: Generate a sky color\n                I HAS A vec_result ITZ Vector IZ constructin YR 0.7 AN YR 0.6 AN YR 1.0 MKAY\n\n                I HAS A z_component ITZ d'Z z\n                DIFFRINT z_component AN BIGGR OF z_component AN 0, O RLY?\n                    YA RLY, z_component R 0\n                OIC\n                I HAS A vec_num ITZ DIFF OF 1 AN z_component\n                vec_num R I IZ power_of YR vec_num AN YR 4 MKAY\n                FOUND YR Vector IZ scalin YR vec_result AN YR vec_num MKAY\n        OIC\n\n        BTW h = intersection coordinate\n        I HAS A h ITZ Vector IZ scalin YR d AN YR t MKAY\n        h R Vector IZ addin YR o AN YR h MKAY\n        BTW l = direction to light (with random delta for soft shadows)\n        I HAS A l ITZ LIEK A Vector\n        l HAS A x ITZ SUM OF 9 AN I IZ rand_onein MKAY\n        l HAS A y ITZ SUM OF 9 AN I IZ rand_onein MKAY\n        l HAS A z ITZ 16\n        I HAS A l_two ITZ Vector IZ scalin YR h AN YR -1.0 MKAY\n        l R Vector IZ addin YR l AN YR l_two MKAY\n        l R Vector IZ normalizin YR l MKAY\n        BTW r = The half-vector\n        I HAS A r ITZ Vector IZ dot_productin YR n AN YR d MKAY\n        r R PRODUKT OF r AN -2\n        r R Vector IZ scalin YR n AN YR r MKAY\n        r R Vector IZ addin YR d AN YR r MKAY\n\n        BTW Calculate the lambertian factor\n        I HAS A b ITZ Vector IZ dot_productin YR l AN YR n MKAY\n\n        BTW Calculate illumination factor (lambertian coefficient > 0 or in shadow)?\n        I HAS A illumination_result ITZ I IZ tracin YR h AN YR l MKAY\n        I HAS A i_m ITZ illumination_result'Z m\n        EITHER OF DIFFRINT b AN BIGGR OF b AN 0 AN BOTH SAEM i_m AN 2, O RLY?\n            YA RLY, b R 0\n        OIC\n\n        BTW Calculate the color 'p' with diffuse and specular component\n        I HAS A base\n        DIFFRINT b AN SMALLR OF b AN 0, O RLY?\n            YA RLY, base R 1\n            NO WAI, base R 0\n        OIC\n        base R Vector IZ scalin YR r AN YR base MKAY\n        base R Vector IZ dot_productin YR l AN YR r MKAY\n        I HAS A p ITZ I IZ power_of YR base AN YR 99 MKAY\n\n        BOTH SAEM m AN 1, O RLY?\n            YA RLY\n                BTW No sphere was hit and the ray was going downward: Generate a floor color\n                h R Vector IZ scalin YR h AN YR 0.2 MKAY\n                I HAS A ceil_h_x ITZ I IZ ceilin YR h'Z x MKAY\n                I HAS A ceil_h_y ITZ I IZ ceilin YR h'Z y MKAY\n                I HAS A ceil_h ITZ SUM OF ceil_h_x AN ceil_h_y\n                ceil_h IS NOW A NUMBR\n                I HAS A color_choice ITZ MOD OF ceil_h AN 2\n                I HAS A color ITZ LIEK A Vector\n                color_choice, O RLY?\n                    YA RLY\n                        color HAS A x ITZ 3\n                        color HAS A y ITZ 1\n                        color HAS A z ITZ 1\n                    NO WAI\n                        color HAS A x ITZ 3\n                        color HAS A y ITZ 3\n                        color HAS A z ITZ 3\n                OIC\n                FOUND YR Vector IZ scalin YR color AN YR SUM OF PRODUKT OF b AN 0.2 AN 0.1 MKAY\n        OIC\n\n        BTW m == 2 A sphere was hit. Cast a ray bouncing from the sphere surface.\n        I HAS A sphere_color ITZ LIEK A Vector\n        sphere_color HAS A x ITZ p\n        sphere_color HAS A y ITZ p\n        sphere_color HAS A z ITZ p\n        I HAS A recursive_color ITZ I IZ samplin YR h AN YR r MKAY\n        BTW Attenuate color by 50% since it is bouncing (* .5)\n        recursive_color R Vector IZ scalin YR recursive_color AN YR 0.5 MKAY\n        FOUND YR Vector IZ addin YR sphere_color AN YR recursive_color MKAY\n    IF U SAY SO\n\n\n    OBTW The vector class provides functionality for all the common\n         linear algebra operations performed on vectors.\n    TLDR\n    O HAI IM Vector\n        I HAS A x ITZ 0\n        I HAS A y ITZ 0\n        I HAS A z ITZ 0\n\n        BTW Add vector_one and vector_two\n        HOW IZ I addin YR vector_one AN YR vector_two\n            I HAS A result ITZ LIEK A Vector\n            result HAS A x ITZ 0\n            result HAS A y ITZ 0\n            result HAS A z ITZ 0\n            result'Z x R SUM OF vector_one'Z x AN vector_two'Z x\n            result'Z y R SUM OF vector_one'Z y AN vector_two'Z y\n            result'Z z R SUM OF vector_one'Z z AN vector_two'Z z\n            FOUND YR result\n        IF U SAY SO\n\n        BTW Scale vector_one by value\n    HOW IZ I scalin YR vector_one AN YR value\n            I HAS A result ITZ LIEK A Vector\n            result HAS A x ITZ 0\n            result HAS A y ITZ 0\n            result HAS A z ITZ 0\n            result'Z x R PRODUKT OF vector_one'Z x AN value\n            result'Z y R PRODUKT OF vector_one'Z y AN value\n            result'Z z R PRODUKT OF vector_one'Z z AN value\n            FOUND YR result\n        IF U SAY SO\n\n        BTW Dot product of vector_one and vector_two\n        HOW IZ I dot_productin YR vector_one AN YR vector_two\n            FOUND YR SUM OF SUM OF PRODUKT OF vector_one'Z x AN vector_two'Z x AN ...\n                                   PRODUKT OF vector_one'Z y AN vector_two'Z y AN ...\n                                   PRODUKT OF vector_one'Z z AN vector_two'Z z\n        IF U SAY SO\n\n        BTW Cross product of vector_one and vector_two\n        HOW IZ I cross_productin YR vector_one AN YR vector_two\n        I HAS A result ITZ LIEK A Vector\n            result HAS A x ITZ 0\n            result HAS A y ITZ 0\n            result HAS A z ITZ 0\n            result'Z x R DIFF OF PRODUKT OF vector_one'Z y AN vector_two'Z z AN ...\n                                 PRODUKT OF vector_one'Z z AN vector_two'Z y\n            result'Z y R DIFF OF PRODUKT OF vector_one'Z z AN vector_two'Z x AN ...\n                                 PRODUKT OF vector_one'Z x AN vector_two'Z z\n            result'Z z R DIFF OF PRODUKT OF vector_one'Z x AN vector_two'Z y AN ...\n                                 PRODUKT OF vector_one'Z y AN vector_two'Z x\n            FOUND YR result\n        IF U SAY SO\n\n        BTW Length of vector_one\n        HOW IZ I lengthin YR vector_one\n            FOUND YR I IZ square_rootin YR ...\n                SUM OF SUM OF PRODUKT OF vector_one'Z x AN vector_one'Z x AN ...\n                              PRODUKT OF vector_one'Z y AN vector_one'Z y AN ...\n                              PRODUKT OF vector_one'Z z AN vector_one'Z z MKAY\n        IF U SAY SO\n\n        BTW Normalize vector_one\n        HOW IZ I normalizin YR vector_one\n            I HAS A result ITZ LIEK A Vector\n            result HAS A x ITZ 0\n            result HAS A y ITZ 0\n            result HAS A z ITZ 0\n            I HAS A length ITZ Vector IZ lengthin YR vector_one MKAY\n            BOTH SAEM length AN 0, O RLY?\n                YA RLY\n                    length R 1\n            OIC\n            result'Z x R QUOSHUNT OF vector_one'Z x AN length\n            result'Z y R QUOSHUNT OF vector_one'Z y AN length\n            result'Z z R QUOSHUNT OF vector_one'Z z AN length\n            FOUND YR result\n        IF U SAY SO\n\n        BTW Printable YARN version of vector\n        HOW IZ I to_stringin YR vector\n            FOUND YR SMOOSH \"[\" AN vector'Z x AN \", \" ...\n                                AN vector'Z y AN \", \" ...\n                                AN vector'Z z AN \"]\" MKAY\n        IF U SAY SO\n\n        BTW Create and return a vector with components x, y, and z\n        HOW IZ I constructin YR x AN YR y AN YR z\n            I HAS A result ITZ LIEK A Vector\n            result HAS A x ITZ x\n            result HAS A y ITZ y\n            result HAS A z ITZ z\n            FOUND YR result\n        IF U SAY SO\n    KTHX\n\n    OBTW The positions of the spheres are essentially\n         stored in a 2-D array. This differs from Kensler's\n         version where he used bit flags to store the\n         positions in a compressed and quickly accessed\n         manner. Unfortunately for us, bit operations\n         in LOLCODE were too slow for this to be a tenable\n         solution.\n    TLDR\n    I HAS A sphere_positions ITZ A BUKKIT\n    I HAS A sphere_positions_0 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_0 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 0 ITZ sphere_positions_0\n    I HAS A sphere_positions_1 ITZ A BUKKIT\n    sphere_positions_1 HAS A SRS 0 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 0 ITZ FAIL\n    sphere_positions_1 HAS A SRS 1 ITZ FAIL\n    sphere_positions_1 HAS A SRS 2 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 2 ITZ FAIL\n    sphere_positions_1 HAS A SRS 3 ITZ FAIL\n    sphere_positions_1 HAS A SRS 4 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 4 ITZ FAIL\n    sphere_positions_1 HAS A SRS 5 ITZ FAIL\n    sphere_positions_1 HAS A SRS 6 ITZ FAIL\n    sphere_positions_1 HAS A SRS 7 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 7 ITZ FAIL\n    sphere_positions_1 HAS A SRS 8 ITZ FAIL\n    sphere_positions_1 HAS A SRS 9 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 9 ITZ FAIL\n    sphere_positions_1 HAS A SRS 10 ITZ FAIL\n    sphere_positions_1 HAS A SRS 11 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 11 ITZ FAIL\n    sphere_positions_1 HAS A SRS 12 ITZ FAIL\n    sphere_positions_1 HAS A SRS 13 ITZ FAIL\n    sphere_positions_1 HAS A SRS 14 ITZ WIN\n    BTWsphere_positions_1 HAS A SRS 14 ITZ FAIL\n    sphere_positions_1 HAS A SRS 15 ITZ FAIL\n    sphere_positions_1 HAS A SRS 16 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 16 ITZ FAIL\n    sphere_positions_1 HAS A SRS 17 ITZ FAIL\n    sphere_positions_1 HAS A SRS 18 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 18 ITZ FAIL\n    sphere_positions HAS A SRS 1 ITZ sphere_positions_1\n    I HAS A sphere_positions_2 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_2 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 2 ITZ sphere_positions_2\n    I HAS A sphere_positions_3 ITZ A BUKKIT\n    sphere_positions_3 HAS A SRS 0 ITZ FAIL\n    sphere_positions_3 HAS A SRS 1 ITZ FAIL\n    sphere_positions_3 HAS A SRS 2 ITZ FAIL\n    sphere_positions_3 HAS A SRS 3 ITZ FAIL\n    sphere_positions_3 HAS A SRS 4 ITZ WIN\n    BTW sphere_positions_3 HAS A SRS 4 ITZ FAIL\n    sphere_positions_3 HAS A SRS 5 ITZ FAIL\n    sphere_positions_3 HAS A SRS 6 ITZ FAIL\n    sphere_positions_3 HAS A SRS 7 ITZ WIN\n    BTW sphere_positions_3 HAS A SRS 7 ITZ FAIL\n    sphere_positions_3 HAS A SRS 8 ITZ FAIL\n    sphere_positions_3 HAS A SRS 9 ITZ FAIL\n    sphere_positions_3 HAS A SRS 10 ITZ FAIL\n    sphere_positions_3 HAS A SRS 11 ITZ WIN\n    sphere_positions_3 HAS A SRS 12 ITZ FAIL\n    sphere_positions_3 HAS A SRS 13 ITZ FAIL\n    sphere_positions_3 HAS A SRS 14 ITZ FAIL\n    sphere_positions_3 HAS A SRS 15 ITZ FAIL\n    sphere_positions_3 HAS A SRS 16 ITZ FAIL\n    sphere_positions_3 HAS A SRS 17 ITZ FAIL\n    sphere_positions_3 HAS A SRS 18 ITZ WIN\n    BTW sphere_positions_3 HAS A SRS 18 ITZ FAIL\n    sphere_positions HAS A SRS 3 ITZ sphere_positions_3\n    I HAS A sphere_positions_4 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_4 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 4 ITZ sphere_positions_4\n    I HAS A sphere_positions_5 ITZ A BUKKIT\n    sphere_positions_5 HAS A SRS 0 ITZ FAIL\n    sphere_positions_5 HAS A SRS 1 ITZ FAIL\n    sphere_positions_5 HAS A SRS 2 ITZ FAIL\n    sphere_positions_5 HAS A SRS 3 ITZ FAIL\n    sphere_positions_5 HAS A SRS 4 ITZ WIN\n    BTW sphere_positions_5 HAS A SRS 4 ITZ FAIL\n    sphere_positions_5 HAS A SRS 5 ITZ FAIL\n    sphere_positions_5 HAS A SRS 6 ITZ FAIL\n    sphere_positions_5 HAS A SRS 7 ITZ WIN\n    BTW sphere_positions_5 HAS A SRS 7 ITZ FAIL\n    sphere_positions_5 HAS A SRS 8 ITZ FAIL\n    sphere_positions_5 HAS A SRS 9 ITZ WIN\n    BTW sphere_positions_5 HAS A SRS 9 ITZ FAIL\n    sphere_positions_5 HAS A SRS 10 ITZ FAIL\n    sphere_positions_5 HAS A SRS 11 ITZ WIN\n    BTW sphere_positions_5 HAS A SRS 11 ITZ FAIL\n    sphere_positions_5 HAS A SRS 12 ITZ FAIL\n    sphere_positions_5 HAS A SRS 13 ITZ FAIL\n    sphere_positions_5 HAS A SRS 14 ITZ FAIL\n    sphere_positions_5 HAS A SRS 15 ITZ FAIL\n    sphere_positions_5 HAS A SRS 16 ITZ FAIL\n    sphere_positions_5 HAS A SRS 17 ITZ FAIL\n    sphere_positions_5 HAS A SRS 18 ITZ WIN\n    BTW sphere_positions_5 HAS A SRS 18 ITZ FAIL\n    sphere_positions HAS A SRS 5 ITZ sphere_positions_5\n    I HAS A sphere_positions_6 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_6 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 6 ITZ sphere_positions_6\n    I HAS A sphere_positions_7 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_7 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 7 ITZ sphere_positions_7\n    I HAS A sphere_positions_8 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_8 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 8 ITZ sphere_positions_8\n\n    BTW Camera direction\n    I HAS A g ITZ Vector IZ constructin YR -6.0 AN YR -16.0 AN YR 0.0 MKAY\n    g R Vector IZ normalizin YR g MKAY\n\n    BTW Camera up vector\n    I HAS A a ITZ Vector IZ constructin YR 0.0 AN YR 0.0 AN YR 1.0 MKAY\n    a R Vector IZ cross_productin YR a AN YR g MKAY\n    a R Vector IZ normalizin YR a MKAY\n    a R Vector IZ scalin YR a AN YR 0.002 MKAY\n    BTW Camera right vector\n    I HAS A b ITZ Vector IZ cross_productin YR g AN YR a MKAY\n    b R Vector IZ normalizin YR b MKAY\n    b R Vector IZ scalin YR b AN YR 0.002 MKAY\n    BTW Camera eye offset\n    I HAS A c ITZ Vector IZ addin YR a AN YR b MKAY\n    c R Vector IZ scalin YR c AN YR -256.0 MKAY\n    c R Vector IZ addin YR c AN YR g MKAY\n\n    I HAS A max_x ITZ 511\n    I HAS A max_y ITZ max_x\n    BTW Issue the PPM Header info\n    VISIBLE \"P3 \" SUM OF max_x AN 1 \" \" SUM OF max_y AN 1 \" 255\"!\n\n    I HAS A viewpoint ITZ Vector IZ constructin YR 17 AN YR 16 AN YR 8 MKAY\n\n    I HAS A y ITZ max_y\n    IM IN YR y_loop\n        BOTH SAEM y AN -1, O RLY?\n            YA RLY, GTFO\n        OIC\n        I HAS A x ITZ max_x\n        IM IN YR x_loop\n            BOTH SAEM x AN -1, O RLY?\n                YA RLY, GTFO\n            OIC\n            I HAS A pixel_color ITZ Vector IZ constructin YR 13 AN YR 13 AN YR 13 MKAY\n\n            I HAS A rays ITZ 64\n            IM IN YR ray_loop\n                BOTH SAEM rays AN 0, O RLY?\n                    YA RLY, GTFO\n                OIC\n\n                BTW The delta to apply to the origin of the view (For Depth of View blur).\n                I HAS A a_rand ITZ DIFF OF I IZ rand_onein MKAY AN 0.5\n                I HAS A t_a ITZ Vector IZ scalin YR a AN YR a_rand MKAY\n                t_a R Vector IZ scalin YR t_a AN YR 99.0 MKAY\n                I HAS A b_rand ITZ DIFF OF I IZ rand_onein MKAY AN 0.5\n                I HAS A t_b ITZ Vector IZ scalin YR b AN YR b_rand MKAY\n                t_b R Vector IZ scalin YR t_b AN YR 99.0 MKAY\n                I HAS A t ITZ Vector IZ addin YR t_a AN YR t_b MKAY\n\n                I HAS A origin ITZ Vector IZ addin YR viewpoint AN YR t MKAY\n\n                BTW Ray direction with random deltas for stochastic sampling\n                I HAS A direction_up ITZ SUM OF I IZ rand_onein MKAY AN x\n                direction_up R Vector IZ scalin YR a AN YR direction_up MKAY\n                I HAS A direction_right ITZ SUM OF I IZ rand_onein MKAY AN y\n                direction_right R Vector IZ scalin YR b AN YR direction_right MKAY\n                I HAS A direction_t ITZ Vector IZ scalin YR t AN YR -1 MKAY\n                I HAS A direction ITZ Vector IZ addin YR direction_right AN YR direction_up MKAY\n                direction R Vector IZ addin YR direction AN YR c MKAY\n                direction R Vector IZ scalin YR direction AN YR 16 MKAY\n                direction R Vector IZ addin YR direction AN YR direction_t MKAY\n                direction R Vector IZ normalizin YR direction MKAY\n\n                I HAS A sample_color ITZ I IZ samplin YR origin AN YR direction MKAY\n                sample_color R Vector IZ scalin YR sample_color AN YR 3.5 MKAY\n                BTW + pixel_color for color accumulation\n                pixel_color R Vector IZ addin YR sample_color AN YR pixel_color MKAY\n                rays R DIFF OF rays AN 1\n            IM OUTTA YR ray_loop\n            I HAS A write_color ITZ pixel_color\n            write_color'Z x IS NOW A NUMBR\n            write_color'Z y IS NOW A NUMBR\n            write_color'Z z IS NOW A NUMBR\n            DIFFRINT write_color'Z x AN BIGGR OF write_color'Z x AN 0, O RLY?\n                YA RLY, write_color'Z x R 0\n            OIC\n            DIFFRINT write_color'Z y AN BIGGR OF write_color'Z y AN 0, O RLY?\n                YA RLY, write_color'Z y R 0\n            OIC\n            DIFFRINT write_color'Z z AN BIGGR OF write_color'Z z AN 0, O RLY?\n                YA RLY, write_color'Z z R 0\n            OIC\n            VISIBLE \" \" write_color'Z x \" \" ...\n                    \" \" write_color'Z y \" \" ...\n                    \" \" write_color'Z z \" \"!\n            x R DIFF OF x AN 1\n        IM OUTTA YR x_loop\n        y R DIFF OF y AN 1\n    IM OUTTA YR y_loop\n\nKTHXBYE\n"
  },
  {
    "path": "src/test/resources/samples/langs/LSL/LSL.lsl",
    "content": "/*\n    Testing syntax highlighting\n    for the Linden Scripting Language\n*/\n\ninteger someIntNormal       = 3672;\ninteger someIntHex          = 0x00000000;\ninteger someIntMath         = PI_BY_TWO;\n\ninteger event               = 5673;// 'event' is invalid.illegal\n\nkey someKeyTexture          = TEXTURE_DEFAULT;\nstring someStringSpecial    = EOF;\n\nsome_user_defined_function_without_return_type(string inputAsString)\n{\n    llSay(PUBLIC_CHANNEL, inputAsString);\n}\n\nstring user_defined_function_returning_a_string(key inputAsKey)\n{\n    return (string)inputAsKey;\n}\n\ndefault\n{\n    state_entry()\n    {\n        key someKey = NULL_KEY;\n        someKey = llGetOwner();\n\n        string someString = user_defined_function_returning_a_string(someKey);\n\n        some_user_defined_function_without_return_type(someString);\n    }\n\n    touch_start(integer num_detected)\n    {\n        list agentsInRegion = llGetAgentList(AGENT_LIST_REGION, []);\n        integer numOfAgents = llGetListLength(agentsInRegion);\n\n        integer index;                                                          // defaults to 0\n        for (; index <= numOfAgents - 1; index++)                               // for each agent in region\n        {\n            llRegionSayTo(llList2Key(agentsInRegion, index), PUBLIC_CHANNEL, \"Hello, Avatar!\");\n        }\n    }\n\n    touch_end(integer num_detected)\n    {\n        someIntNormal       = 3672;\n        someIntHex          = 0x00000000;\n        someIntMath         = PI_BY_TWO;\n\n        event               = 5673;// 'event' is invalid.illegal\n\n        someKeyTexture      = TEXTURE_DEFAULT;\n        someStringSpecial   = EOF;\n\n        llSetInventoryPermMask(\"some item\", MASK_NEXT, PERM_ALL);// 'llSetInventoryPermMask' is reserved.godmode\n\n        llWhisper(PUBLIC_CHANNEL, \"Leaving \\\"default\\\" now...\");\n        state other;\n    }\n}\n\nstate other\n{\n    state_entry()\n    {\n        llWhisper(PUBLIC_CHANNEL, \"Entered \\\"state other\\\", returning to \\\"default\\\" again...\");\n        state default;\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/LSL/LSL.lslp",
    "content": "/*\n    Testing syntax highlighting\n    for the Linden Scripting Language\n*/\n\ninteger someIntNormal       = 3672;\ninteger someIntHex          = 0x00000000;\ninteger someIntMath         = PI_BY_TWO;\n\ninteger event               = 5673;// 'event' is invalid.illegal\n\nkey someKeyTexture          = TEXTURE_DEFAULT;\nstring someStringSpecial    = EOF;\n\nsome_user_defined_function_without_return_type(string inputAsString)\n{\n    llSay(PUBLIC_CHANNEL, inputAsString);\n}\n\nstring user_defined_function_returning_a_string(key inputAsKey)\n{\n    return (string)inputAsKey;\n}\n\ndefault\n{\n    state_entry()\n    {\n        key someKey = NULL_KEY;\n        someKey = llGetOwner();\n\n        string someString = user_defined_function_returning_a_string(someKey);\n\n        some_user_defined_function_without_return_type(someString);\n    }\n\n    touch_start(integer num_detected)\n    {\n        list agentsInRegion = llGetAgentList(AGENT_LIST_REGION, []);\n        integer numOfAgents = llGetListLength(agentsInRegion);\n\n        integer index;                                                          // defaults to 0\n        for (; index <= numOfAgents - 1; index++)                               // for each agent in region\n        {\n            llRegionSayTo(llList2Key(agentsInRegion, index), PUBLIC_CHANNEL, \"Hello, Avatar!\");\n        }\n    }\n\n    touch_end(integer num_detected)\n    {\n        someIntNormal       = 3672;\n        someIntHex          = 0x00000000;\n        someIntMath         = PI_BY_TWO;\n\n        event               = 5673;// 'event' is invalid.illegal\n\n        someKeyTexture      = TEXTURE_DEFAULT;\n        someStringSpecial   = EOF;\n\n        llSetInventoryPermMask(\"some item\", MASK_NEXT, PERM_ALL);// 'llSetInventoryPermMask' is reserved.godmode\n\n        llWhisper(PUBLIC_CHANNEL, \"Leaving \\\"default\\\" now...\");\n        state other;\n    }\n}\n\nstate other\n{\n    state_entry()\n    {\n        llWhisper(PUBLIC_CHANNEL, \"Entered \\\"state other\\\", returning to \\\"default\\\" again...\");\n        state default;\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Lasso/json.lasso",
    "content": "<?LassoScript\n\t//\n\t// JSON Encoding and Decoding\n\t//\n\t// Copyright 2007-2012 LassoSoft Inc.\n\t//\n\t// <http://json.org/>\n\t// <http://json-rpc.org/>\n\t// <http://www.ietf.org/rfc/rfc4627.txt?number=4627>\n\t// This tag is now incorporated in Lasso 8.6.0.1\n\t//\n\nIf: (Lasso_TagExists: 'Encode_JSON') == False;\n\n\tDefine_Tag: 'JSON', -Namespace='Encode_', -Required='value', -Optional='options';\n\t\n\t\tLocal: 'escapes' = Map('\\\\' = '\\\\', '\"'  = '\"', '\\r' = 'r', '\\n' = 'n', '\\t' = 't', '\\f' = 'f', '\\b' = 'b');\n\t\tLocal: 'output' = '';\n\t\tLocal: 'newoptions' = (Array: -Internal);\n\t\tIf: !(Local_Defined: 'options') || (#options->(IsA: 'array') == False);\n\t\t\tLocal: 'options' = (Array);\n\t\t/If;\n\t\tIf: (#options >> -UseNative) || (Params >> -UseNative);\n\t\t\t#newoptions->(Insert: -UseNative);\n\t\t/If;\n\t\tIf: (#options >> -NoNative) || (Params >> -NoNative);\n\t\t\t#newoptions->(Insert: -NoNative);\n\t\t/If;\n\t\tIf: (#options !>> -UseNative) && ((#value->(IsA: 'set')) || (#value->(IsA: 'list')) || (#value->(IsA: 'queue')) || (#value->(IsA: 'priorityqueue')) || (#value->(IsA: 'stack')));\n\t\t\t#output += (Encode_JSON: Array->(insertfrom: #value->iterator) &, -Options=#newoptions);\n\t\tElse: (#options !>> -UseNative) && (#value->(IsA: 'pair'));\n\t\t\t#output += (Encode_JSON: (Array: #value->First, #value->Second));\n\t\tElse: (#options !>> -Internal) && (#value->(Isa: 'array') == False) && (#value->(IsA: 'map') == False);\n\t\t\t#output += '[' + (Encode_JSON: #value, -Options=#newoptions) + ']';\n\t\tElse: (#value->(IsA: 'literal'));\n\t\t\t#output += #value;\n\t\tElse: (#value->(IsA: 'string'));\n\t\t\t#output += '\"';\n\t\t\tLoop: (#value->Length);\n\t\t\t\tLocal('character' = #value->(Get: Loop_Count));\n\t\t\t\t#output->(Append:\n\t\t\t\t\t(Match_RegExp('[\\\\x{0020}-\\\\x{21}\\\\x{23}-\\\\x{5b}\\\\x{5d}-\\\\x{10fff}]') == #character) ? #character |\n\t\t\t\t\t\t'\\\\' + (#escapes->(Contains: #character) ? #escapes->(Find: #character) | 'u' + String(Encode_Hex(#character))->PadLeading(4, '0')&)\n\t\t\t\t);\n\t\t\t/Loop;\n\t\t\t#output += '\"';\n\t\tElse: (#value->(IsA: 'integer')) || (#value->(IsA: 'decimal')) || (#value->(IsA: 'boolean'));\n\t\t\t#output += (String: #value);\n\t\tElse: (#value->(IsA: 'null'));\n\t\t\t#output += 'null';\n\t\tElse: (#value->(IsA: 'date'));\n\t\t\tIf: #value->gmt;\n\t\t\t\t#output += '\"' + #value->(format: '%QT%TZ') + '\"';\n\t\t\tElse;\n\t\t\t\t#output += '\"' + #value->(format: '%QT%T') + '\"';\n\t\t\t/If;\n\t\tElse: (#value->(IsA: 'array'));\n\t\t\t#output += '[';\n\t\t\tIterate: #value, (Local: 'temp');\n\t\t\t\t#output += (Encode_JSON: #temp, -Options=#newoptions);\n\t\t\t\tIf: #value->Size != Loop_Count;\n\t\t\t\t\t#output += ', ';\n\t\t\t\t/If;\n\t\t\t/Iterate;\n\t\t\t#output += ']';\n\t\tElse: (#value->(IsA: 'object'));\n\t\t\t#output += '{';\n\t\t\tIterate: #value, (Local: 'temp');\n\t\t\t\t#output += #temp->First + ': ' + (Encode_JSON: #temp->Second, -Options=#newoptions);\n\t\t\t\tIf: (#value->Size != Loop_Count);\n\t\t\t\t\t#output += ', ';\n\t\t\t\t/If;\n\t\t\t/Iterate;\n\t\t\t#output += '}';\n\t\tElse: (#value->(IsA: 'map'));\n\t\t\t#output += '{';\n\t\t\tIterate: #value, (Local: 'temp');\n\t\t\t\t#output += (Encode_JSON: #temp->First, -Options=#newoptions) + ': ' + (Encode_JSON: #temp->Second, -Options=#newoptions);\n\t\t\t\tIf: (#value->Size != Loop_Count);\n\t\t\t\t\t#output += ', ';\n\t\t\t\t/If;\n\t\t\t/Iterate;\n\t\t\t#output += '}';\n\t\tElse: (#value->(IsA: 'client_ip')) || (#value->(IsA: 'client_address'));\n\t\t\t#output += (Encode_JSON: (String: #value), -Options=#newoptions);\n\t\tElse: (#options !>> -UseNative) && (#value->(IsA: 'set')) || (#value->(IsA: 'list')) || (#value->(IsA: 'queue')) || (#value->(IsA: 'priorityqueue')) || (#value->(IsA: 'stack'));\n\t\t\t#output += (Encode_JSON: Array->(insertfrom: #value->iterator) &, -Options=#newoptions);\n\t\tElse: (#options !>> -NoNative);\n\t\t\t#output += (Encode_JSON: (Map: '__jsonclass__'=(Array:'deserialize',(Array:'<LassoNativeType>' + #value->Serialize + '</LassoNativeType>'))));\n\t\t/If;\n\t\tReturn: @#output;\n\t\t\n\t/Define_Tag;\n\n/If;\n\nIf: (Lasso_TagExists: 'Decode_JSON') == False;\n\n\tDefine_Tag: 'JSON', -Namespace='Decode_', -Required='value';\n\n\t\t(#value == '') ? Return: Null;\n\t\t\n\t\tDefine_Tag: 'consume_string', -Required='ibytes';\n\t\t\tLocal: 'unescapes' = (map: 34 = '\"', 92 = '\\\\', 98 = '\\b', 102 = '\\f', 110 = '\\n', 114 = '\\r', 116 = '\\t');\n\t\t\tLocal: 'temp' = 0, 'obytes' = Bytes;\n\t\t\tWhile: ((#temp := #ibytes->export8bits) != 34); // '\"'\n\t\t\t\tIf: (#temp === 92); // '\\'\n\t\t\t\t\t#temp = #ibytes->export8bits;\n\t\t\t\t\tIf: (#temp === 117); // 'u'\n\t\t\t\t\t\t#obytes->(ImportString: (Decode_Hex: (String: #ibytes->(GetRange: #ibytes->Position + 1, 4)))->(ExportString: 'UTF-16'), 'UTF-8');\n\t\t\t\t\t\t#ibytes->(SetPosition: #ibytes->Position + 4);\n\t\t\t\t\tElse;\n\t\t\t\t\t\tIf: (#unescapes->(Contains: #temp));\n\t\t\t\t\t\t\t#obytes->(ImportString: #unescapes->(Find: #temp), 'UTF-8');\n\t\t\t\t\t\tElse;\n\t\t\t\t\t\t\t#obytes->(Import8Bits: #temp);\n\t\t\t\t\t\t/If;\n\t\t\t\t\t/If;\n\t\t\t\tElse;\n\t\t\t\t\t#obytes->(Import8Bits: #temp);\n\t\t\t\t/If;\n\t\t\t/While;\n\t\t\tLocal('output' = #obytes->(ExportString: 'UTF-8'));\n\t\t\tIf: #output->(BeginsWith: '<LassoNativeType>') && #output->(EndsWith: '</LassoNativeType>');\n\t\t\t\tLocal: 'temp' = #output - '<LassoNativeType>' - '</LassoNativeType>';\n\t\t\t\tLocal: 'output' = null;\n\t\t\t\tProtect;\n\t\t\t\t\t#output->(Deserialize: #temp);\n\t\t\t\t/Protect;\n\t\t\tElse: (Valid_Date: #output, -Format='%QT%TZ');\n\t\t\t\tLocal: 'output' = (Date: #output, -Format='%QT%TZ');\n\t\t\tElse: (Valid_Date: #output, -Format='%QT%T');\n\t\t\t\tLocal: 'output' = (Date: #output, -Format='%QT%T');\n\t\t\t/If;\t\t\t\n\t\t\tReturn: @#output;\n\t\t/Define_Tag;\n\n\t\tDefine_Tag: 'consume_token', -Required='ibytes', -required='temp';\n\t\t\tLocal: 'obytes' = bytes->(import8bits: #temp) &;\n\t\t\tlocal: 'delimit' = (array: 9, 10, 13, 32, 44, 58, 93, 125); // \\t\\r\\n ,:]}\n\t\t\tWhile: (#delimit !>> (#temp := #ibytes->export8bits));\n\t\t\t\t#obytes->(import8bits: #temp);\n\t\t\t/While;\n\t\t\tLocal: 'output' = (String: #obytes);\n\t\t\tIf: (#output == 'true') || (#output == 'false');\n\t\t\t\tReturn: (Boolean: #output);\n\t\t\tElse: (#output == 'null');\n\t\t\t\tReturn: Null;\n\t\t\tElse: (String_IsNumeric: #output);\n\t\t\t\tReturn: (#output >> '.') ? (Decimal: #output) | (Integer: #output);\n\t\t\t/If;\n\t\t\tReturn: @#output;\n\t\t/Define_Tag;\n\n\t\tDefine_Tag: 'consume_array', -Required='ibytes';\n\t\t\tLocal: 'output' = array;\n\t\t\tlocal: 'delimit' = (array:  9, 10, 13, 32, 44); // \\t\\r\\n ,\n\t\t\tlocal: 'temp' = 0;\n\t\t\tWhile: ((#temp := #ibytes->export8bits) != 93); // ]\n\t\t\t\tIf: (#delimit >> #temp);\n\t\t\t\t\t// Discard whitespace \n\t\t\t\tElse: (#temp == 34); // \"\n\t\t\t\t\t#output->(insert: (consume_string: @#ibytes));\n\t\t\t\tElse: (#temp == 91); // [\n\t\t\t\t\t#output->(insert: (consume_array: @#ibytes));\n\t\t\t\tElse: (#temp == 123); // {\n\t\t\t\t\t#output->(insert: (consume_object: @#ibytes));\n\t\t\t\tElse;\n\t\t\t\t\t#output->(insert: (consume_token: @#ibytes, @#temp));\n\t\t\t\t\t(#temp == 93) ? Loop_Abort;\n\t\t\t\t/If;\n\t\t\t/While;\n\t\t\tReturn: @#output;\n\t\t/Define_Tag;\n\n\t\tDefine_Tag: 'consume_object', -Required='ibytes';\n\t\t\tLocal: 'output' = map;\n\t\t\tlocal: 'delimit' = (array:  9, 10, 13, 32, 44); // \\t\\r\\n ,\n\t\t\tlocal: 'temp' = 0;\n\t\t\tlocal: 'key' = null;\n\t\t\tlocal: 'val' = null;\n\t\t\tWhile: ((#temp := #ibytes->export8bits) != 125); // }\n\t\t\t\tIf: (#delimit >> #temp);\n\t\t\t\t\t// Discard whitespace \n\t\t\t\tElse: (#key !== null) && (#temp == 34); // \"\n\t\t\t\t\t#output->(insert: #key = (consume_string: @#ibytes));\n\t\t\t\t\t#key = null;\n\t\t\t\tElse: (#key !== null) && (#temp == 91); // [\n\t\t\t\t\t#output->(insert: #key = (consume_array: @#ibytes));\n\t\t\t\t\t#key = null;\n\t\t\t\tElse: (#key !== null) && (#temp == 123); // {\n\t\t\t\t\t#output->(insert: #key = (consume_object: @#ibytes));\n\t\t\t\t\t#key = null;\n\t\t\t\tElse: (#key !== null);\n\t\t\t\t\t#output->(insert: #key = (consume_token: @#ibytes, @#temp));\n\t\t\t\t\t(#temp == 125) ? Loop_abort;\n\t\t\t\t\t#key = null;\n\t\t\t\tElse;\n\t\t\t\t\t#key = (consume_string: @#ibytes);\n \t\t\t\t    while(#delimit >> (#temp := #ibytes->export8bits));\n\t\t\t\t\t/while;\n  \t\t\t\t\t#temp != 58 ? Loop_Abort;\n\t\t\t\t/If;\n\t\t\t/While;\n\t\t\tIf: (#output >> '__jsonclass__') && (#output->(Find: '__jsonclass__')->(isa: 'array')) && (#output->(Find: '__jsonclass__')->size >= 2) && (#output->(Find: '__jsonclass__')->First == 'deserialize');\n\t\t\t\tReturn: #output->(find: '__jsonclass__')->Second->First;\n\t\t\tElse: (#output >> 'native') && (#output >> 'comment') && (#output->(find: 'comment') == 'http://www.lassosoft.com/json');\n\t\t\t\tReturn: #output->(find: 'native');\n\t\t\t/If;\n\t\t\tReturn: @#output;\n\t\t/Define_Tag;\n\t\t\n\t\tLocal: 'ibytes' = (bytes: #value);\n\t\tLocal: 'start' = 1;\n \t  \t#ibytes->removeLeading(BOM_UTF8);\n\t\tLocal: 'temp' = #ibytes->export8bits;\n\t\tIf: (#temp == 91); // [\n\t\t\tLocal: 'output' = (consume_array: @#ibytes);\n\t\t\tReturn: @#output;\n\t\tElse: (#temp == 123); // {\n\t\t\tLocal: 'output' = (consume_object: @#ibytes);\n\t\t\tReturn: @#output;\n\t\t/If;\n\t\t\n\t/Define_Tag;\n\n/If;\n\t\nIf: (Lasso_TagExists: 'Literal') == False;\n\n\tDefine_Type: 'Literal', 'String';\n\t/Define_Type;\n\n/If;\n\t\nIf: (Lasso_TagExists: 'Object') == False;\n\t\n\tDefine_Type: 'Object', 'Map';\n\t/Define_Type;\n\t\n/If;\n\nIf: (Lasso_TagExists: 'JSON_RPCCall') == False;\n\t\n\tDefine_Tag: 'RPCCall', -Namespace='JSON_',\n\t\t\t-Required='method',\n\t\t\t-Optional='params',\n\t\t\t-Optional='id',\n\t\t\t-Optional='host';\n\n\t\t!(Local_Defined: 'host') ? Local: 'host' = 'http://localhost/lassoapps.8/rpc/rpc.lasso';\n\t\t!(Local_Defined: 'id') ? Local: 'id' = Lasso_UniqueID;\n\t\tLocal: 'request' = (Map: 'method' = #method, 'params' = #params, 'id' = #id);\n\t\tLocal: 'request' = (Encode_JSON: #request);\n\t\tLocal: 'result' = (Include_URL: #host, -PostParams=#request);\n\t\tLocal: 'result' = (Decode_JSON: #result);\n\t\tReturn: @#result;\n\n\t/Define_Tag;\n\t\n/If;\n\nIf: (Lasso_TagExists: 'JSON_Records') == False;\n\n\tDefine_Tag: 'JSON_Records',\n\t\t\t-Optional='KeyField',\n\t\t\t-Optional='ReturnField',\n\t\t\t-Optional='ExcludeField',\n\t\t\t-Optional='Fields';\n\n\t\tLocal: '_fields' = (Local_Defined: 'fields') && #fields->(IsA: 'array') ? #fields | Field_Names;\n\t\tFail_If: #_fields->size == 0, -1, 'No fields found for [JSON_Records]';\n\t\tLocal: '_keyfield' = (Local: 'keyfield');\n\t\tIf: #_fields !>> #_keyfield;\n\t\t\tLocal: '_keyfield' = (KeyField_Name);\n\t\t\tIf: #_fields !>> #_keyfield;\n\t\t\t\tLocal: '_keyfield' = 'ID';\n\t\t\t\tIf: #_fields !>> #_keyfield;\n\t\t\t\t\tLocal: '_keyfield' = #_fields->First;\n\t\t\t\t/If;\n\t\t\t/If;\n\t\t/If;\n\t\tLocal: '_index' = #_fields->(FindPosition: #_keyfield)->First;\n\t\tLocal: '_return' = (Local_Defined: 'returnfield') ? (Params->(Find: -ReturnField)->(ForEach: {Params->First = Params->First->Second; Return: True}) &) | @#_fields;\n\t\tLocal: '_exclude' = (Local_Defined: 'excludefield') ? (Params->(Find: -ExcludeField)->(ForEach: {Params->First = Params->First->Second; Return: True}) &) | Array;\n\t\tLocal: '_records' =  Array;\n\t\tIterate: Records_Array, (Local: '_record');\n\t\t\tLocal: '_temp' = Map;\n\t\t\tIterate: #_fields, (Local: '_field');\n\t\t\t\t((#_return >> #_field) && (#_exclude !>> #_field)) ? #_temp->Insert(#_field = #_record->(Get: Loop_Count));\n\t\t\t/Iterate;\n\t\t\t#_records->Insert(#_temp);\n\t\t/Iterate;\n\t\tLocal: '_output' = (Encode_JSON: (Object: 'error_msg'=Error_Msg, 'error_code'=Error_Code, 'found_count'=Found_Count, 'keyfield'=#_keyfield, 'rows'=#_records));\n\t\tReturn: @#_output;\n\n\t/Define_Tag;\n\n/If;\n\n?>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Lasso/json.lasso9",
    "content": "\n/**\n\ttrait_json_serialize\n\tObjects with this trait will be assumed to convert to json data\n\twhen its ->asString method is called\n*/\ndefine trait_json_serialize => trait {\n\trequire asString()\n}\n\ndefine json_serialize(e::bytes)::string => ('\"' + (string(#e)->Replace(`\\`, `\\\\`) & Replace('\\\"', '\\\\\"') & Replace('\\r', '\\\\r') & Replace('\\n', '\\\\n') & Replace('\\t', '\\\\t') & Replace('\\f', '\\\\f') & Replace('\\b', '\\\\b') &) + '\"')\ndefine json_serialize(e::string)::string => ('\"' + (string(#e)->Replace(`\\`, `\\\\`) & Replace('\\\"', '\\\\\"') & Replace('\\r', '\\\\r') & Replace('\\n', '\\\\n') & Replace('\\t', '\\\\t') & Replace('\\f', '\\\\f') & Replace('\\b', '\\\\b') &) + '\"')\ndefine json_serialize(e::json_literal)::string => (#e->asstring)\ndefine json_serialize(e::integer)::string => (#e->asstring)\ndefine json_serialize(e::decimal)::string => (#e->asstring)\ndefine json_serialize(e::boolean)::string => (#e->asstring)\ndefine json_serialize(e::null)::string => ('null')\ndefine json_serialize(e::date)::string => ('\"' + #e->format(#e->gmt ? '%QT%TZ' | '%Q%T') + '\"')\n/*\ndefine json_serialize(e::array)::string => {\n\tlocal(output) = '';\n\tlocal(delimit) = '';\n\t#e->foreach => { #output += #delimit + json_serialize(#1); #delimit = ', '; }\n\treturn('[' + #output + ']');\n}\ndefine json_serialize(e::staticarray)::string => {\n\tlocal(output) = '';\n\tlocal(delimit) = '';\n\t#e->foreach => { #output += #delimit + json_serialize(#1); #delimit = ', '; }\n\treturn('[' + #output + ']');\n}\n*/\ndefine json_serialize(e::trait_forEach)::string => {\n\tlocal(output) = '';\n\tlocal(delimit) = '';\n\t#e->foreach => { #output += #delimit + json_serialize(#1); #delimit = ', '; }\n\treturn('[' + #output + ']');\n}\ndefine json_serialize(e::map)::string => {\n\tlocal(output = with pr in #e->eachPair \n\t\t\t\t\tselect json_serialize(#pr->first->asString) + ': ' + json_serialize(#pr->second))\n\treturn '{' + #output->join(',') + '}'\n}\ndefine json_serialize(e::json_object)::string => {\n\tlocal(output) = '';\n\tlocal(delimit) = '';\n\t#e->foreachpair => { #output += #delimit + #1->first + ': ' + json_serialize(#1->second); #delimit = ', '; }\n\treturn('{' + #output + '}');\n}\ndefine json_serialize(e::trait_json_serialize) => #e->asString\ndefine json_serialize(e::any)::string => json_serialize('<LassoNativeType>' + #e->serialize + '</LassoNativeType>')\n\n// Bil Corry fixes for decoding json\ndefine json_consume_string(ibytes::bytes) => {\n\tlocal(obytes) = bytes;\n\tlocal(temp) = 0;\n\twhile((#temp := #ibytes->export8bits) != 34);\n\t\t#obytes->import8bits(#temp);\n\t\t(#temp == 92) ? #obytes->import8bits(#ibytes->export8bits); // Escape \\\n \t/while;\n\tlocal(output = string(#obytes)->unescape)\n\t//Replace('\\\\\"', '\\\"') & Replace('\\\\r', '\\r') & Replace('\\\\n', '\\n') & Replace('\\\\t', '\\t') & Replace('\\\\f', '\\f') & Replace('\\\\b', '\\b') &;\n\tif(#output->BeginsWith('<LassoNativeType>') && #output->EndsWith('</LassoNativeType>'));\n\t\tProtect;\n\t\t\treturn serialization_reader(xml(#output - '<LassoNativeType>' - '</LassoNativeType>'))->read\n\t\t/Protect;\n\telse( (#output->size == 16 or #output->size == 15) and regexp(`\\d{8}T\\d{6}Z?`, '', #output)->matches)\n\t\treturn date(#output, -Format=#output->size == 16?`yyyyMMdd'T'HHmmssZ`|`yyyyMMdd'T'HHmmss`)\n\t/if\n\treturn #output\n}\n\n// Bil Corry fix + Ke fix\ndefine json_consume_token(ibytes::bytes, temp::integer) => {\n\n\tlocal(obytes = bytes->import8bits(#temp) &,\n\t\tdelimit = array(9, 10, 13, 32, 44, 58, 93, 125)) // \\t\\r\\n ,:]}\n\n\twhile(#delimit !>> (#temp := #ibytes->export8bits))\n\t\t#obytes->import8bits(#temp)\n\t/while\n\n\t#temp == 125? // }\n\t\t#ibytes->marker -= 1\n//============================================================================\n//\tIs also end of token if end of array[]\n\t#temp == 93? // ]\n\t\t#ibytes->marker -= 1\n//............................................................................\t\t\n\n\tlocal(output = string(#obytes))\n\t#output == 'true'?\n\t\treturn true\n\t#output == 'false'?\n\t\treturn false\n\t#output == 'null'?\n\t\treturn null\n\tstring_IsNumeric(#output)?\n\treturn (#output >> '.')? decimal(#output) | integer(#output)\n\n\treturn #output\n}\n\n// Bil Corry fix\ndefine json_consume_array(ibytes::bytes)::array => {\n\tLocal(output) = array;\n\tlocal(delimit) = array( 9, 10, 13, 32, 44); // \\t\\r\\n ,\n\tlocal(temp) = 0;\n\tWhile((#temp := #ibytes->export8bits) != 93); // ]\n\t\tIf(#delimit >> #temp);\n\t\t\t// Discard whitespace\n\t\tElse(#temp == 34); // \"\n\t\t\t#output->insert(json_consume_string(#ibytes));\n\t\tElse(#temp == 91); // [\n\t\t\t#output->insert(json_consume_array(#ibytes));\n\t\tElse(#temp == 123); // {\n\t\t\t#output->insert(json_consume_object(#ibytes));\n\t\tElse;\n\t\t\t#output->insert(json_consume_token(#ibytes, #temp));\n\t\t\t(#temp == 93) ? Loop_Abort;\n\t\t/If;\n\t/While;\n\tReturn(#output);\n}\n\n// Bil Corry fix\ndefine json_consume_object(ibytes::bytes)::map => {\n\tLocal('output' = map,\n\t\t'delimit' = array( 9, 10, 13, 32, 44), // \\t\\r\\n ,\n\t\t'temp' = 0,\n\t\t'key' = null,\n\t\t'val' = null);\n\tWhile((#temp := #ibytes->export8bits) != 125); // }\n\t\tIf(#delimit >> #temp);\n\t\t\t// Discard whitespace\n\t\tElse((#key !== null) && (#temp == 34)); // \"\n\t\t\t#output->insert(#key = json_consume_string(#ibytes));\n\t\t\t#key = null;\n\t\tElse((#key !== null) && (#temp == 91)); // [\n\t\t\t#output->insert(#key = json_consume_array(#ibytes));\n\t\t\t#key = null;\n\t\tElse((#key !== null) && (#temp == 123)); // {\n\t\t\t#output->insert(#key = json_consume_object(#ibytes));\n\t\t\t#key = null;\n\t\tElse((#key !== null));\n\t\t\t#output->insert(#key = json_consume_token(#ibytes, #temp));\n\t\t\t#key = null;\n\t\tElse;\n\t\t\t#key = json_consume_string(#ibytes);\n\t\t\twhile(#delimit >> (#temp := #ibytes->export8bits));\n\t\t\t/while;\n\t\t\t#temp != 58 ? Loop_Abort;\n\t\t/If;\n\t/While;\n\n\tIf((#output >> '__jsonclass__') && (#output->Find('__jsonclass__')->isa('array')) && (#output->Find('__jsonclass__')->size >= 2) && (#output->Find('__jsonclass__')->First == 'deserialize'));\n\t\tReturn(#output->find('__jsonclass__')->Second->First);\n\tElse((#output >> 'native') && (#output >> 'comment') && (#output->find('comment') == 'http://www.lassosoft.com/json'));\n\t\tReturn(#output->find('native'));\n\t/If;\n\tReturn(#output);\n}\n\n// Bil Corry fix + Ke fix\ndefine json_deserialize(ibytes::bytes)::any => {\n\t#ibytes->removeLeading(bom_utf8);\n\n//============================================================================\n//\tReset marker on provided bytes\n\t#ibytes->marker = 0\n//............................................................................\t\t\n\t\n\tLocal(temp) = #ibytes->export8bits;\n\tIf(#temp == 91); // [\n\t\tReturn(json_consume_array(#ibytes));\n\tElse(#temp == 123); // {\n\t\tReturn(json_consume_object(#ibytes));\n\telse(#temp == 34) // \"\n\t\treturn json_consume_string(#ibytes)\n\t/If;\n}\n\ndefine json_deserialize(s::string) => json_deserialize(bytes(#s))\n\n/**! json_literal - This is a subclass of String used for JSON encoding.\n\n\tA json_literal works exactly like a string, but will be inserted directly\n\trather than being encoded into JSON. This allows JavaScript elements\n\tlike functions to be inserted into JSON objects. This is most useful\n\twhen the JSON object will be used within a JavaScript on the local page.\n\t[Map: 'fn'=Literal('function(){ ...})] => {'fn': function(){ ...}}\n**/\ndefine json_literal => type {\n\tparent string\n}\n\n/**! json_object - This is a subclass of Map used for JSON encoding.\n\n\tAn object works exactly like a map, but when it is encoded into JSON all\n\tof the keys will be inserted literally. This makes it easy to create a\n\tJavaScript object without extraneous quote marks.\n\tObject('name'='value') => {name: \"value\"}\n**/\ndefine json_object => type {\n\tparent map\n\tpublic onCreate(...) => ..onCreate(:#rest or (:))\n}\n\ndefine json_rpccall(method::string, params=map, id='', host='') => {\n\t#id == '' ? #host = Lasso_UniqueID;\n\t#host == '' ? #host = 'http://localhost/lassoapps.8/rpc/rpc.lasso';\n\tReturn(Decode_JSON(Include_URL(#host, -PostParams=Encode_JSON(Map('method' = #method, 'params' = #params, 'id' = #id)))));\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Lasso/knop.las",
    "content": "﻿[/* \n\n\tOn-Demand library for namespace knop\n\tNamespace file built date 2012-06-10 02:05:30 by http://knop8/buildnamespace.lasso\n\tMontania System AB\n\n*/]\n\n[\n//------------------------------------------------------------------\n//    Begin knop custom tags in util.inc\n//------------------------------------------------------------------\n\n]<?LassoScript\n\n/*\n\n2009-09-04\tJS\tAdded content_body tag for compatibility with pre 8.5\n2009-05-07\tJS\tAdded timestamp to knop_cachestore and -maxage parameter to knop_cachefetch\n2009-05-07\tJS\tCorrected construction of cache_name internally in the knop_cache tags so it will work correctly at the site root\n2008-11-04\tJS\tAdded dummy knop_debug ctype to be able to work transparently with or without L-Debug\n2008-09-24\tJS\tAdded knop_stripbackticks\n2008-01-28\tJS\tCache tags: -name is now used also when using session storage\n2007-12-12\tJS\tAdded knop_cachedelete\n2007-12-11\tJS\tCreated knop_cachestore and knop_cachefetch\n2007-12-03\tJS\tCorrected knop_foundrows condition for returning normal found_count\n\n*/\n\n// For compatibility with pre Lasso 8.5 \nif(!lasso_tagexists('content_body'));\n\tdefine_tag('content_body', -namespace='_global_');\n\t\treturn(@$__html_reply__);\n\t/define_tag;\n/if;\n\nif(!lasso_tagexists('knop_debug'));\n\tdefine_type('debug',\n\t\t-namespace='knop_');\n\t\tdefine_tag('_unknowntag');/define_tag;\n\t\tdefine_tag('onconvert');/define_tag;\n\t/define_type;\n/if;\n\ndefine_tag('stripbackticks', -description='Remove backticks (`) from a string to make it safe for MySQL object names',\n\t-namespace='knop_',\n\t-priority='replace',\n\t-required='input');\n\tlocal('output'=string(#input));\n\t#output = #output -> split('`') -> first;\n\treturn(@#output);\n/define_tag;\n\ndefine_tag: 'unique', -description='Returns a very unique but still rather short random string',\n\t-namespace='knop_',\n\t-priority='replace';\n\n\t// Johan Sölve 2006-09-20 \n\t\n\tlocal: 'output'=string,\n\t\t'seed'=integer,\n\t\t'charlist'='abcdefghijklmnopqrstuvwxyz0123456789';\n\tlocal: 'base'=(#charlist -> size);\n\t// start with the current date and time in a mixed up format as seed\n\t#seed = integer: (date -> (format: '%S%y%m%d%H%M'));\n\t// convert this integer to a string using base conversion\n\twhile: #seed>0;\n\t\t#output = #charlist -> (get: (#seed % #base)+1) + #output;\n\t\t#seed = #seed / #base;\n\t/while;\n\t// start over with a new chunk as seed\n\t#seed = string: 1000+(date->millisecond);\n\t#seed = #seed + string: (math_random: -lower=1000, -upper=9999);\n\t#seed = integer: #seed;\n\t// convert this integer to a string using base conversion\n\twhile: #seed>0;\n\t\t#output = #charlist -> (get: (#seed % #base)+1) + #output;\n\t\t#seed = #seed / #base;\n\t/while;\n\treturn: #output;\n/define_tag;\n\n\ndefine_tag: 'seed', \n\t-namespace='knop_',\n\t-priority='replace';\n\t\n\tlocal: 'seed'= (string: $__lassoservice_ip__) + response_localpath;\n\t#seed -> removetrailing(response_filepath);\n\treturn:\t #seed;\n/define_tag;\n\ndefine_tag: 'foundrows', // http://tagswap.net/found_rows\n\t-namespace='knop_',\n\t-priority='replace';\n\tlocal: 'sql'= action_statement;\n\tif: (string_findregexp: #sql, -find= '\\\\sLIMIT\\\\s', -ignorecase) -> size == 0;\n\t\t// || found_count < maxrecords_value; (this condition is inaccurate)\n\t\t// found_count must be accurate\n\t\treturn: found_count;\n\t/if;\n\tif: (string_findregexp: #sql, -find= '\\\\s(GROUP\\\\s+BY|HAVING)\\\\s', -ignorecase) -> size == 0;\n\t\t// Default method, usually the fastest. Can not be used with GROUP BY for example. \n\t\t// First normalize whitespace around FROM in the expression\n\t\t#sql = (string_replaceregexp: #sql, -find= '\\\\sFROM\\\\s', -replace=' FROM ', -ignorecase, -ReplaceOnlyOne);\n\t\t#sql = 'SELECT COUNT(*) AS found_rows ' + #sql -> (substring: (#sql -> (find: ' FROM ')) + 1) ;\n\t\t#sql = (string_replaceregexp: #sql, -find='\\\\sLIMIT\\\\s+[0-9,]+', -replace='');\n\t\tif: (string_findregexp: #sql, -find= '\\\\sORDER\\\\s+BY\\\\s', -ignorecase) -> size;\n\t\t\t// remove ORDER BY statement since it causes problems with field aliases\n\t\t\t// first normalize the expression so we can find it with simple string expression later\n\t\t\t#sql = (string_replaceregexp: #sql, -find= '\\\\sORDER\\\\s+BY\\\\s', -replace=' ORDER BY ', -ignorecase);\n\t\t\t#sql = #sql -> (substring: 1, (#sql -> (find: ' ORDER BY ')) -1);\n\t\t/if;\n\telse; // query contains GROUP BY so use SQL_CALC_FOUND_ROWS which can be much slower, see http://bugs.mysql.com/bug.php?id=18454\n\t\t#sql -> (removeleading: 'SELECT');\n\t\t#sql = 'SELECT SQL_CALC_FOUND_ROWS ' + #sql + ';SELECT FOUND_ROWS() AS found_rows';\n\t\t#sql = (string_replaceregexp: #sql, -find='\\\\sLIMIT\\\\s+[0-9,]+', -replace=' LIMIT 1', -ignorecase);\n\t/if;\n\tinline: -sql=#sql;\n\t\tif: (field: 'found_rows') > 0;\n\t\t\treturn: integer: (field: 'found_rows'); // exit here normally\n\t\t/if;\n\t/inline;\n\t// fallback\n\treturn: found_count;\n/define_tag;\t\n\ndefine_tag:'IDcrypt', -description='Encrypts or Decrypts integer values',\n\t-namespace='knop_',\n\t-required='value',\n\t-optional='seed',\n\t-priority='replace';\n/*\n\n[IDcrypt]\nEncrypts or Decrypts integer values\n\nAuthor: Pier Kuipers\nLast Modified: Jan. 29, 2007\nLicense: Public Domain\n\nDescription:\nThis tag was written to deal with \"scraping\" attacks where bots keep \nrequesting the same page with incremental id parameters, corresponding to \nmysql id columns. Rather than introducing a new column with a unique id, this \ntag will \"intelligently\" blowfish encrypt or decrypt existing id values.\n\n\nSample Usage:\n[local('myID' = (action_param('id')))]\n[IDcrypt(#myID)]\n\n[IDcrypt('35446')] -> j4b50f315238d68df\n\n[IDcrypt('j4b50f315238d68df')] -> 35446\n\n\n\nDownloaded from tagSwap.net on Feb. 07, 2007.\nLatest version available from <http://tagSwap.net/IDcrypt>.\n\n*/\n// if id values need to be retrieved from bookmarked urls, the tag's built-in seed value must be used,\n// or the seed value used must be guaranteed to be the same as when the value was encrypted!\t\t\n\n\tlocal('cryptvalue' = string);\n\t!local_defined('seed') ? local('seed' = knop_seed);\n\tLocal('RandChars' = 'AaBbCcDdEeFfGgHhiJjKkLmNnoPpQqRrSsTtUuVvWwXxYyZz');\n\tLocal('anyChar' = (#RandChars -> (Get:(Math_Random: -Min=1, -Max=(#RandChars->Size)))));\n// taken from Bil Corry's [lp_string_getNumeric]\n\tlocal('numericValue' = (string_findregexp((string: #value), -find='\\\\d')->(join:'')));\n\t\n\tif(\n\t\t(#numericValue == (integer(#value))) \n\t\t&& \n\t\t(((string(#value))->length) == ((string(#numericValue)) -> length))\n\t);\n// alpha character is inserted at beginning of encrypted string in case value needs to be\n// cast to a javascript variable, which cannot start with a number\t\t\n\t\t#cryptvalue = (#anyChar + (Encrypt_Blowfish(#value, -seed=#seed)));\n\telse(\n\t\t((((string(#value))->length) - 1) % 2 == 0)\n\t\t&&\n\t\t(((string(#value))->length) > 16)\n\t);\n\t\t#cryptvalue = (decrypt_blowfish((String_Remove: #value, -StartPosition=1, -EndPosition=1),-Seed=#seed));\n\telse;\n\t\t#cryptvalue = 0;\n\t/if;\n\t\n\tif(String_IsAlphaNumeric(#cryptvalue));\n\t\treturn(#cryptvalue);\n\telse;\n// successfully decrypted values resulting in lots of strange characters are probably\n// the result of someone guessing a value\t\t\n\t\treturn(0);\n\t/if;\n\n/define_tag;\n\n\n\ndefine_type: 'timer', -description='Utility type to provide a simple timer',\n\t-namespace='knop_';\n\t/*\n\t\n\tCHANGE NOTES\n\t2007-06-17\tJS\tCreated the type\n\t\n\t*/\n\n\tlocal: 't'=integer;\n\tdefine_tag: 'oncreate';\n\t\t(self -> 't') = _date_msec;\n\t/define_tag;\n\tdefine_tag: 'onconvert';\n\t\treturn: _date_msec - (self -> 't');\n\t/define_tag;\n\t\n/define_type;\n\ndefine_tag: 'cachestore', -description='Stores all instances of page variables of the specified type in a cache object. Caches are stored \\\n\t\tin a global variable named by host name and document root to isolate the storage of different hosts. \\n\\\n\t\tParameters:\\n\\\n\t\t-type (required string) Page variables of the specified type will be stored in cache. Data types can be specified with or without namespace.\\n\\\n\t\t-expires (optional integer) The number of seconds that the cached data should be valid. Defaults to 600 (10 minutes)\\n\\\n\t\t-session (optional string) The name of an existing session to use for cache storage instead of the global storage\\n\\\n\t\t-name (optional string) Extra name parameter to be able to isolate the cache storage from other sites on the same virtual hosts, or caches for different uses. ',\n\t-namespace='knop_',\n\t-required='type', -type='string',\n\t-optional='expires', -type='integer', // seconds\n\t-optional='session', -type='string',\n\t-optional='name', -type='string';\n\n\tlocal: 'data'=map;\n\t!(local_defined: 'expires') ? local: 'expires'=600; // default seconds\n\t// store all page vars of the specified type\n\titerate: vars -> keys, local: 'item';\n\t\tif: (var: #item) -> isa(#type);\n\t\t\t#data -> insert(#item = (var: #item));\n\t\t/if;\n\t/iterate;\n\tif: (local_defined: 'session');\n\t\t//fail_if: (session_id: -name=#session) -> size == 0, -1, 'Cachestore with -session requires that the specified session is started';\n\t\tlocal: 'cache_name' = '_knop_cache_' + (local: 'name');\n\t\tsession_addvar: -name=#session, #cache_name;\n\t\t!((var: #cache_name) -> isa('map')) ? var: #cache_name = map;\n\t\t(var: #cache_name) -> insert(#type = (map: \n\t\t\t'content'=#data, \n\t\t\t'timestamp'=date, \n\t\t\t'expires'=(date + (duration: -second=#expires))));\n\telse;\n\t\tlocal: 'cache_name'='knop_' + (local: 'name') + '_' + server_name + response_localpath;\n\t\t#cache_name -> removetrailing(response_filepath);\n\t\t// initiate thread RW lock\n\t\t!(global: 'rwlock_' + #cache_name) -> isa('rwlock') ? global: 'rwlock_' + #cache_name=Thread_RWLock;\n\t\t// create a reference to the lock\n\t\tlocal: 'lock'=@(global: 'rwlock_' + #cache_name);\n\t\t// lock for writing\n\t\t#lock -> writelock;\n\t\t// check and initiate the cache storage\n\t\t!((global: #cache_name) -> isa('map')) ? global: #cache_name = map;\n\t\t(global: #cache_name) -> insert(#type = (map: \n\t\t\t'content'=#data, \n\t\t\t'timestamp'=date, \n\t\t\t'expires'=(date + (duration: -second=#expires))));\n\t\t// unlock\n\t\t#lock -> writeunlock;\n\t/if;\n/define_tag;\n\ndefine_tag: 'cachefetch', -description='Recreates page variables from previously cached instances of the specified type, returns true if successful or false if there was no valid \\\n\t\texisting cache for the specified type. Caches are stored in a global variable named by host name and document root to isolate the storage of different hosts. \\n\\\n\t\tParameters:\\n\\\n\t\t-type (required string) Page variables of the specified type will be stored in cache. \\n\\\n\t\t-session (optional string) The name of an existing session to use for cache storage instead of the global storage\\n\\\n\t\t-name (optional string) Extra name parameter to be able to isolate the cache storage from other sites on the same virtual hosts. \\n\\\n\t\t-maxage (optional date) Cache data older than the date/time specified in -maxage will not be used.',\n\t-namespace='knop_',\n\t-required='type', -type='string',\n\t-optional='session', -type='string',\n\t-optional='name', -type='string',\n\t-optional='maxage', -type='date';\n\t\n\t\n\tlocal: 'data'=null;\n\tif: (local_defined: 'session');\n\t\t//fail_if: (session_id: -name=#session) -> size == 0, -1, 'Cachefetch with -session requires that the specified session is started';\n\t\tlocal: 'cache_name' = '_knop_cache_' + (local: 'name');\n\t\tif: (var: #cache_name) -> isa('map') \n\t\t\t&& (var: #cache_name) >> #type \n\t\t\t&& (var: #cache_name) -> find(#type) -> find('expires') > date;\n\t\t\tif(local_defined('maxage') \n\t\t\t\t&& var(#cache_name) -> find(#type) -> find('timestamp') < #maxage);\n\t\t\t\t// cached data too old\n\t\t\telse;\n\t\t\t\t#data = (var: #cache_name) -> find(#type) -> find('content');\n\t\t\t/if;\n\t\t/if;\n\telse;\n\t\tlocal: 'cache_name'='knop_' + (local: 'name') + '_' + server_name + response_localpath;\n\t\t#cache_name -> removetrailing(response_filepath);\n\t\t// initiate thread RW lock\n\t\t!(global: 'rwlock_' + #cache_name) -> isa('rwlock') ? global: 'rwlock_' + #cache_name=Thread_RWLock;\n\t\t// create a reference to the lock\n\t\tlocal: 'lock'=@(global: 'rwlock_' + #cache_name);\n\t\t// lock for reading\n\t\t#lock -> readlock;\n\t\tif: (global: #cache_name) -> isa('map') \n\t\t\t&& (global: #cache_name) >> #type \n\t\t\t&& (global: #cache_name) -> find(#type) -> find('expires') > date;\n\t\t\tif(local_defined('maxage') \n\t\t\t\t&& global(#cache_name) -> find(#type) -> find('timestamp') < #maxage);\n\t\t\t\t// cached data too old\n\t\t\telse;\n\t\t\t\t#data = (global: #cache_name) -> find(#type) -> find('content');\n\t\t\t/if;\n\t\t/if;\n\t\t// unlock\n\t\t#lock -> readunlock;\n\t/if;\n\tif: #data -> isa('map');\n\t\titerate: #data, local: 'item';\n\t\t\tvar: (#item -> name) = #item -> value;\n\t\t/iterate;\n\t\treturn: true;\n\telse;\n\t\treturn: false;\n\t/if;\n/define_tag;\n\n\ndefine_tag: 'cachedelete', -description='Deletes the cache for the specified name (and optionally name). \\n\\\n\t\tParameters:\\n\\\n\t\t-type (required string) Page variables of the specified type will be stored in cache. \\n\\\n\t\t-session (optional string) The name of an existing session to use for cache storage instead of the global storage\\n\\\n\t\t-name (optional string) Extra name parameter to be able to isolate the cache storage from other sites on the same virtual hosts. ',\n\t-namespace='knop_',\n\t-required='type', -type='string',\n\t-optional='session', -type='string',\n\t-optional='name', -type='string'; // ignored for session\n\tif: (local_defined: 'session');\n\t\t//fail_if: (session_id: -name=#session) -> size == 0, -1, 'Cachestore with -session requires that the specified session is started';\n\t\tlocal: 'cache_name' = '_knop_cache_' + (local: 'name');\n\t\tsession_addvar: -name=#session, #cache_name;\n\t\t!((var: #cache_name) -> isa('map')) ? var: #cache_name = map;\n\t\t(var: #cache_name) -> remove(#type);\n\telse;\n\t\tlocal: 'cache_name'='knop_' + (local: 'name') + '_' + server_name + response_localpath;\n\t\t#cache_name -> removetrailing(response_filepath);\n\t\t// initiate thread RW lock\n\t\t!(global: 'rwlock_' + #cache_name) -> isa('rwlock') ? global: 'rwlock_' + #cache_name=Thread_RWLock;\n\t\t// create a reference to the lock\n\t\tlocal: 'lock'=@(global: 'rwlock_' + #cache_name);\n\t\t// lock for writing\n\t\t#lock -> writelock;\n\t\t// check and initiate the cache storage\n\t\t!((global: #cache_name) -> isa('map')) ? global: #cache_name = map;\n\t\t(global: #cache_name) -> remove(#type);\n\t\t// unlock\n\t\t#lock -> writeunlock;\n\t/if;\n\n/define_tag;\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop custom tags in util.inc\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_base\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type('knoptype',\n\t-namespace='knop_');\n\tlocal('description'='All Knop custom types should have this type as parent type. This is to be able to identify all registered knop types. ');\n\tlocal('isknoptype'=true);\n/define_type;\n\ndefine_type: 'base',\n\t'knop_knoptype',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2009-09-14',\n\t\t'description'='Base data type for Knop framework. Contains common member tags. Used as boilerplate when creating the other types. \\\n\t\t\t\t\t\tAll member tags and instance variables in this type are available in the other knop types as well. ';\n/*\n\n\nCHANGE NOTES\n2009-09-14\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-04-07\tJS\t->error_msg: custom error numbers can now be added, even if the language already exists.\n2008-01-10\tJS\t->error_msg: improved reporting of custom error messages such as from bad database queries\n2007-12-13\tJS\tAdded -> error_lang to provide a reference to the knop_lang object for error messages, to be able to add localized error messages to any Knop type (except knop_lang and knop_base)\n2007-12-12\tJS\tAdded -html and -xhtml to ->help to get a nicely formatted output. \n2007-12-11\tJS\tCentralized ->error_code and ->error_msg to knop_base. Moved all error codes to error_msg\n2007-12-06\tJS\tChanged ->help to improve the self-documentation. It will now always return an up to date list of member tags and parameter. \n2007-11-05\tJS\tAdded var name to trace output\n2007-06-17\tJS\tAdded ->tagtime (was in nav earlier)\n2007-06-13\tJS\tAdded -> varname to be able to retreive the name of the page variable that a type instance is stored in.\n2007-06-13\tJS\tAdded -> xhtml to automatically sense if an xhtml doctype exists in the current page buffer. The result is cached in a page variable for performance. \n\t\t\t\tThis is for internal use for member tags that output html. \n2007-06-13\tJS\tIntroduced page variable $_knop_data for general page level storage and caching, common between different knop objects. \n2007-06-13\tJS\tCreated the data type\n\nTODO: ->help: add output option to format for Google Code Wiki\n->xhtml is not working properly when site is run by atbegin handler and explicitly writing to content_body \n\n\n*/\n\n\tlocal: 'debug_trace'=array,\n\t\t'_debug_trace'=array,\n\t\t'instance_unique'=null,\n\t\t'instance_varname'=null,\n\t\t'tagtime'=integer,\t\t\t\t// time for entire tag in ms\n\t\t'tagtime_tagname'=string,\n\t\t'error_code'=0,\n\t\t'error_msg'=string,\n\t\t'error_lang'=null,\t// must be defined as knop_lang in each type instead, to avoid recursion\n\t\t;\n\n\tdefine_tag: 'ondeserialize', -description='Recreates transient variables after coming back from a session';\n\t\tself -> properties -> first -> insert('_debug_trace'=array);\n\t/define_tag;\n\n\tdefine_tag: 'help', -description='Auto generates an overview of all member tags of a type, with all parameters specified for each member tag.', \n\t\t-optional='html',\n\t\t-optional='xhtml';\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\n\t\tlocal: 'output'=string,\n\t\t\t'tags'=array,\n\t\t\t'description'=string,\n\t\t\t'parameters'=string;\n\t\t#output += (self -> type) + ' - version ' + (self -> 'version') + '\\n' ;\n\t\t#output += (self -> 'description') + '\\n\\n';\n\t\titerate: (self -> properties -> second) , local: 't';\n\t\t\t#tags -> (insert: #t);\n\t\t/iterate;\n\t\tif: (self -> parent -> type != 'null'); // this doesn't work\n\t\t\titerate: (self -> parent -> properties -> second) , local: 't';\n\t\t\t\t#tags -> (insert: #t);\n\t\t\t/iterate;\n\t\t/if;\n\t\t#tags -> sort;\n\t\titerate: #tags , local: 't';\n\t\t\t#parameters = string;\n\t\t\t#output += '-> ' + (#t -> name);\n\t\t\t#description=(#t -> value -> description);\n\t\t\titerate: (#t -> value -> paraminfo) , local: 'p';\n\t\t\t\tif: #description !>> '-' + (#p -> paramname);\n\t\t\t\t\t#parameters += '-' + (#p -> paramname) + ' (' (#p -> isrequired ? 'required' | 'optional') \n\t\t\t\t\t\t+ (#p -> paramtype != 'null' && #p -> paramtype -> size ? ' ' + (#p -> paramtype))  + ')\\n';\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#output += (#description -> size || #parameters -> size ? '\\n' + #description);\n\t\t\t#output += (#description >> 'Parameters:' ?  '\\n');\n\t\t\t#output += (#description !>> 'Parameters:' && #parameters -> size ? '\\nParameters:\\n');\n\t\t\t#output += (#parameters -> size ? #parameters);\n\t\t\t#output -> removetrailing('\\n');\n\t\t\t#output += '\\n\\n';\n\t\t/iterate;\n\t\tif: ((local_defined: 'html') && #html != false) || ((local_defined: 'xhtml') && #xhtml != false);\n\t\t\t#output = encode_html: #output;\n\t\t\t// normalize line breaks and convert to <br>\n\t\t\t#output -> (replace: '\\r\\n', '\\n') & (replace: '\\r', '\\n') & (replace: '\\n', #eol + '\\n');\n\t\t/if;\n\t\treturn: #output;\n\t/define_tag;\n\n\n\tdefine_tag: 'xhtml', -description='Internal. Finds out if xhtml output should be used. Looks at doctype unless -xhtml is specified \\\n\t\t\tin the params array. The result is cached in a page variable. \\n\\\n\t\t\tLooking at doctype doesn\\'t work when using atbegin driven solutions since content_body isn\\'t filled with the page buffer until the page has already been processed.  ',\n\t\t-optional='params';\n\t\tif: (local_defined: 'params') && #params >> '-xhtml';\n\t\t\tlocal: 'xhtmlparam'=#params -> (find: '-xhtml') -> first;\n\t\t\tif: #xhtmlparam -> type == 'pair'; // -xhtml=true / -xhtml=false\n\t\t\t\treturn: boolean: (#xhtmlparam -> value);\n\t\t\telse; // plain -xhtml\n\t\t\t\treturn: true;\n\t\t\t/if;\n\t\t/if;\n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t$_knop_data = map;\n\t\t/if;\n\t\tif: $_knop_data !>> 'doctype_xhtml';\n\t\t\tlocal: 'doctype' = content_body -> (substring: 1, (content_body -> (find: '>')));\n\t\t\t$_knop_data -> (insert: 'doctype_xhtml' = (#doctype >> '<!DOCTYPE' && #doctype >> 'xhtml'));\n\t\t/if;\n\t\treturn: $_knop_data -> (find: 'doctype_xhtml');\n\t/define_tag;\n\n\n\tdefine_tag: 'error_lang', -description='Returns a reference to the language object used for error codes, to be able to add localized error messages to any Knop type (except knop_lang and knop_base)';\n\t\treturn: @(self -> 'error_lang');\n\t/define_tag;\n\n\tdefine_tag: 'error_code', -description='Either proprietary error code or standard Lasso error code';\n\t\t\t\treturn: integer: (self -> 'error_code');\n\t/define_tag;\n\n\tdefine_tag: 'error_msg',\n\t\t-optional='error_code', -type='integer', -copy;\n\t\t!(local_defined: 'error_code') ? local: 'error_code'=(self -> error_code);\n\t\tlocal: 'error_lang_custom'=(self -> 'error_lang');\n\t\tlocal: 'error_lang'=(knop_lang: -default='en', -fallback);\n\n\t\tlocal: 'errorcodes'=(map:\n\t\t\t0 = 'No error',\n\t\t\t-1728 = 'No records found', // standard Lasso error code\n\t\t\t\n\t\t\t// database errors 7000\n\t\t\t7001 ='The specified table was not found',\n\t\t\t7002 = 'Keyfield not specified',\n\t\t\t7003 = 'Lockfield not specified',\n\t\t\t7004 = 'User not specified for record lock',\n\t\t\t7005 = 'Either keyvalue or lockvalue must be specified for update or delete',\n\t\t\t7006 = 'Keyfield or keyvalue missing',\n\t\t\t7007 = 'Keyvalue missing',\n\t\t\t7008 = 'Keyvalue not unique',\n\t\t\t7009 = '-sql can not be used with FileMaker',\n\t\t\t7010 = 'Record locked by another user', // see error_data\n\t\t\t7011 = 'Record lock not valid any more',\n\t\t\t7012 = 'Could not set record lock', // see error_data\n\t\t\t7013 = 'Failed to clear record locks', // see error_data\n\t\t\t7016 = 'Add error', // see error_data\n\t\t\t7017 = 'Add failed, duplicate key value',\n\t\t\t7018 = 'Update error', // see error_data\n\t\t\t7019 = 'Delete error', // see error_data\n\t\t\t7020 = 'Keyfield not present in query',\n\t\t\t7021 = 'Lockfield not present in query',\n\t\t\t\n\t\t\t// form errors 7100\n\t\t\t7101 ='Form validation failed',\n\t\t\t7102 = 'Unsupported field type',\n\t\t\t7103 = 'Form->process requires that a database object is defined for the form',\n\t\t\t7104 = 'Copyfield must copy to a different field name',\n\n\t\t\t// grid errors 7200 \n\t\t\t\n\t\t\t// lang errors 7300\n\t\t\t\n\t\t\t// nav errors 7400\n\t\t\t\n\t\t\t// user errors 7500\n\t\t\t7501 = 'Authentication failed',\n\t\t\t7502 = 'Username or password missing',\n\t\t\t7503 = 'Client fingerprint has changed'\n\t\t\t\n\t\t\t);\n\t\t#error_lang -> (addlanguage: -language='en', -strings=@#errorcodes);\n\t\t// add any custom error strings\n\t\titerate(#error_lang_custom -> 'strings', local('custom_language'));\n\t\t\tif(#error_lang -> 'strings' !>> #custom_language -> name);\n\t\t\t\t// add entire language at once\n\t\t\t\t#error_lang -> addlanguage(-language=#custom_language -> name, -strings=#custom_language -> value);\n\t\t\telse;\n\t\t\t\t// add one string at a time\n\t\t\t\titerate(#custom_language -> value, local('custom_string'));\n\t\t\t\t\t#error_lang -> insert(-language=#custom_language -> name, \n\t\t\t\t\t\t-key=#custom_string -> name, \n\t\t\t\t\t\t-value=#custom_string -> value);\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t/iterate;\n\t\t\n\t\tif: #errorcodes >> #error_code;\n\t\t\t// return error message defined by this tag\n\t\t\tif: #error_lang -> keys >> #error_code;\n\t\t\t\treturn: #error_lang -> (getstring: #error_code);\n\t\t\telse;\n\t\t\t\treturn: #errorcodes -> (find: #error_code);\n\t\t\t/if;\n\t\telse;\n\t\t\tif: (self -> 'error_msg') != '';\n\t\t\t\t// return literal error message\n\t\t\t\treturn: (self -> 'error_msg');\n\t\t\telse;\n\t\t\t\t// test for error known by lasso\n\t\t\t\terror_code = #error_code;\n\t\t\t\t// return Lasso error message\n\t\t\t\treturn: error_msg;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'varname', -description='Returns the name of the variable that this type instance is stored in.';\n\t\tlocal: 'timer'=knop_timer;\n\t\tif: self -> 'instance_unique' == null;\n\t\t\tself -> 'instance_unique' = knop_unique;\n\t\t/if;\n\t\tif: self -> 'instance_varname' == null;\n\t\t\t// look for the var name and store it in instance variable\n\t\t\titerate: (vars -> keys), (local: 'varname');\n\t\t\t\tif: (var: #varname) -> type == self -> type \n\t\t\t\t\t&& ((var: #varname) -> 'instance_unique') == (self -> 'instance_unique');\n\t\t\t\t\t(self -> 'instance_varname')=#varname;\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer;\n\t\treturn: self -> 'instance_varname';\n\t/define_tag;\n\n\tdefine_tag: 'trace', -description='Returns the debug trace for a type instance',\n\t\t-optional='html',\n\t\t-optional='xhtml';\n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\t\tlocal: 'trace'=(self -> 'debug_trace');\n\t\t(self -> '_debug_trace') -> isa('array') ? #trace -> merge(self -> '_debug_trace');\n\t\treturn: #eol + 'Debug trace for ' + (self -> type ) + ' $' + (self -> varname) + #eol \n\t\t\t+ #trace -> (join: #eol) + #eol;\n\n\t/define_tag;\n\n\n\tdefine_tag: 'tagtime', -description='Returns the time it took to execute the last executed member tag for a type instance.',\n\t\t-optional='html',\n\t\t-optional='xhtml';\n\t\t/* Standard timer code\n\t\tAt beginning of tag code:\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tBefore the end of tag code (before return):\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\n\t\t*/\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\t((local_defined: 'html') || (local_defined: 'xhtml')) ? return: (self -> type) + '->' + (self -> 'tagtime_tagname') + ': ' + (self -> 'tagtime') + ' ms<br' + #endslash + '>';\n\t\treturn: (self -> 'tagtime');\n\t/define_tag;\n\n/define_type;\n\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_base\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_database\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'database',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\t\n\tlocal: 'version'='2010-11-23',\n\t\t'description'='Custom type to interact with databases. Supports both MySQL and FileMaker datasources. ';\n\n/*\n\nCHANGE NOTES\n2012-06-10\tSP\tFix for decimal precision bug in 8.6.0.1 in renderfooter.\n2012-01-15\tSP\tAdd support for inline host method.  Thanks to Ric Lewis.\n2010-11-23\tJS\t->settable: removed reference for -table\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->nextrecord: Added deprecation warning\n2009-05-15\tJS\t->field: corrected the verification of the -index parameter\n2009-01-09\tJS\tAdded a check before calling resultset_count so it will not break in Lasso versions before 8.5\n2009-01-09\tJS\t->_unknowntag: fixed incorrect debug_trace\n2008-12-03\tJS\t->addrecord: improved how keyvalue is returned when adding records\n2008-12-03\tJS\t->addrecord: inserting a generated keyvalue can now be suppressed by specifying -keyvalue=false\n2008-12-03\tJS\t->saverecord and ->deleterecord will now use the current keyvalue (if any), so -keyvalue will not have to be specified in that case. \n2008-11-25\tJS\t->field and ->recorddata will no longer touch current_record if it was zero\n2008-11-24\tJS\t->field: Added -index parameter to be able to access any occurrence of the same field name\n2008-11-24\tJS\tAdded -> records that returns a new data type knop_databaserows\n2008-11-24\tJS\t->resultset_count: added support for -inlinename. \n2008-11-24\tJS\tChanged ->nextrecord to ->next. ->nextrecord remains supported for backwards compatibility.\n2008-11-14\tJS\t->nextrecord resets the record pointer when reaching the last record\n2008-11-13\tJS\t->recorddata now honors the current record pointer (as incremented by -nextrecord)\n2008-11-13\tJS\t->recorddata: added -recordindex parameter so a specific record can be returned instead of the first found.\n2008-10-30\tJS\t->getrecord now REALLY works with integer keyvalues (double oops) - I thought I fixed it 2008-05-28 but misplaced a paren...\n2008-09-26\tJS\tAdded -> resultset_count corresponding to the same Lasso tag, so [resultset]...[/resultset] can now be used through the use of inlinename.\n2008-09-10\tJS\t-> getrecord, ->saverecord, ->deleterecord: Corrected handling of lock user to work better with knop_user\n2008-07-09\tJS\t->saverecord: -keeplock now updates the lock timestamp\n2008-05-28\tJS\t->getrecord now works with integer keyvalues (oops)\n2008-05-27\tJS\t->get returns a new datatype knop_databaserow \n2008-05-27\tJS\tAdded ->size and ->get so a database object can be iterated. When iterating each row is returned as an array of field values. \n2008-05-27\tJS\tAddedd ->nextrecord that increments the recordpointer each time it is called until the last record in the found set is reached. Returns true as long as there are more records. Useful in a while loop - see example below\n2008-05-27\tJS\tImplemented record pointer 'current_record'. The record pointer is reset for each new query. \n2008-05-27\tJS\t->field: added -recordindex to get data from any record in the current found set\n2008-05-27\tJS\tAdded ->_unknowntag as shortcut to field\n2008-05-26\tJS\tRemoved onassign since it causes touble\n2008-05-26\tJS\tExtended field_names to return the field names for any specified table, return field names also for db objects that have never been used for a database query and optionally return field types\n2008-01-29\tJS\t->getrecord now supports -sql. Make sure that the SQL statement includes the relevant keyfield (and lockfield if locking is used). \n2008-01-10\tJS\t->capturesearchvars: error_code and error_msg was mysteriously not set after database operations that caused errors. \n2008-01-08\tJS\t->saverecord: added flag -keeplock to be able to save a locked record without releasing the lock\n2007-12-15\tJS\tAdding support for knop_user in record locking is in progress. Done for ->oncreate and ->getrecord. \n2007-12-11\tJS\tMoved error_code and error_msg to knop_base\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-10\tJS\tAdded ->settable to be able to copy an existing database object and properly set a new table name for it. Faster than creating a new instance from scratch. \n2007-12-03\tJS\tCorrected shown_first once again, hoping it's right this time\n2007-11-29\tJS\tAdded support for field_names and corresponding member tag ->field_names\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-26\tJS\t->capturesearchvars: corrected shown_first when no records found\n2007-10-26\tJS\t->oncreate: added default value \"keyfield\" if the -keyfield parameter is not specified\n2007-09-06\tJS\tCorrected self -> 'tagtime' typo\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\tChanged recordid_value to keyfield_value and -recordid to -keyvalue\n2007-05-28\tJS\t->oncreate: Added clearing of current error at beginning of tag\n2007-04-19\tJS\tCorrected the handling of -maxrecords and -skiprecords for SQL selects that have LIMIT specified\n2007-04-19\tJS\tImproved handling of foundrows so it finds any whitespace around SQL keywords, instead of just plain spaces\n2007-04-18\tJS\t->select now populates recorddata with all the fields for the first found record. Previously it only populated recorddata when there was 1 found record. \n2007-04-12\tJS\t->oncreate: Added authentication inline around Database_TableNames../Database_TableNames\n2007-04-10\tJS\t->oncreate: Improved validation of table name (table_realname can sometimes be null even for valid table names)\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-01-30\tJS \tAdded real error codes and additional error data for some errors (like record locked)\n2007-01-30\tJS\tChanged -keyvalue parameters to copy value instead of pass as reference, to not cause problems when using keyvalue from the same db object as is being updated, for example $db->(saverecord: -keyvalue=$db->keyvalue)\n2007-01-26\tJS\tAdjusted affectedrecord_keyvalue so it's only captured for -add and -update\n2007-01-23\tJS\tSupports -uselimit (or querys that use LIMIT) and still gets proper searchresult vars (using a separate COUNT(*) query) - may not always get the right result for example for queries with GROUP BY\n2007-01-23\tJS\t-keyfield can be specified for saverecord to override the default\n2007-01-23\tJS\tChanged name of ->updaterecord to ->saverecord\n2007-01-23\tJS \tFixed bug where keyfield was missing as returnfield when looking up locked record for deleterecord\n2007-01-23\tJS\tAdded ->field\n2007-01-19\tJS\tAdded maxrecords_value and skiprecords_value to searchresultvars\n2007-01-18\tJS\tAdded affectedrecord_keyvalue to make it possible to highlight affected record in record list (grid)\n\n\nTODO:\nAllow -keyfield to be specified for ->addrecord and ->deleterecord\nAdd some Active Record similar functionality for editing\nLook at making it so -table can be set dynamically instead of fixed at oncreate, to eliminate the need for one db object for each table. This can cause problems with record locks and how they interact with knop_user \ndatetime_create and datetime_mod, and also user_create and user_mod.\n\tUse default field names but allow to override at oncreate, and verify them at oncreate before trying to use them. \n\n\n*/\n\n\t// instance variables\n\t// these variables are set once\n\tlocal: 'database'=string,\n\t\t'table'=string,\n\t\t'table_realname'=string,\t// the actual table name, to be used in SQL statements (in case the table name is aliased in Lasso)\n\t\t'username'=string,\n\t\t'password'=string,\n\t\t'db_connect'=array,\n\t\t'host'=array,\t\t\t\t// add support for inline host method\n\t\t'datasource_name'=string,\n\t\t'isfilemaker'=false,\n\t\t'lock_expires'=1800,\t\t// seconds before a record lock expires\n\t\t'lock_seed'=knop_seed,\t\t// encryption seed for the record lock\n\t\t'error_lang'=(knop_lang: -default='en', -fallback),\n\t\t'user'=null,\t\t\t\t// knop_user that will be used for record locking\n\t\t'databaserows_map'=map;\t\t// map to hold databaserows for each inlinename\n\n\t// these variables are set for each query\n\tlocal: 'inlinename'=string,\t\t\t// the inlinename that holds the result of the latest db operation\n\t\t'keyfield'=string,\n\t\t'keyvalue'=null,\n\t\t'affectedrecord_keyvalue'=null,\t// keyvalue of last added or updated record (not reset by other db actions)\n\t\t'lockfield'=string,\n\t\t'lockvalue'=null,\n\t\t'lockvalue_encrypted'=null,\n\t\t'timestampfield'=string,\t\t// for optimistic locking\n\t\t'timestampvalue'=string,\n\t\t'searchparams'=string,\t\t\t// the resulting pair array used in the database action\n\t\t'querytime'=integer,\t\t\t// query time in ms\n\t\t// 'tagtime'=integer,\t\tmoved to knop_base\n\t\t'recorddata'=map,\t\t\t\t// for single record results, a map of all returned db fields\n\t\t'error_data'=map,\t\t\t\t// additional data for certain errors\n\t\t'message'=string,\t\t\t\t// user message for normal result\n\t\t'current_record'=integer,\t\t// index of the current record to get field values from a specific record\n\t\t'field_names_map'=map,\n\t\t'resultset_count_map'=map;\t\t// resultset_count stored for each inlinename \n\t// these vars have directly corresponding Lasso tags so they can be set programatically\n\tlocal: 'searchresultvars'=(array: 'action_statement', 'found_count', 'shown_first', \n\t\t'shown_last', 'shown_count', 'field_names', 'records_array', 'maxrecords_value', 'skiprecords_value');\n\titerate: #searchresultvars, (local: 'resultvar');\n\t\tlocal(#resultvar = null);\n\t/iterate;\n\n\tlocal: 'errors_error_data'=(map: 7010, 7012, 7013, 7016, 7018, 7019); // these error codes can have more info in error_data map\n\n\tdefine_tag: 'oncreate',\n\t\t-required='database',\n\t\t-required='table',\n\t\t-optional='host',\t\t\t// add support for inline host method\n\t\t-optional='username',\n\t\t-optional='password',\n\t\t-optional='keyfield',\n\t\t-optional='lockfield',\n\t\t-optional='user',\n\t\t-optional='validate';\t\t// validate the database connection info (adds the overhead of making a test connection to the database)\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\t// reset error\n\t\terror_code = 0;\n\t\terror_msg = error_noerror;\n\t\n\t\t// validate database and table names to make sure they exist in Lasso\n\t\t(self -> 'datasource_name') = Lasso_DatasourceModuleName: #database;\n\t\tfail_if: error_code != 0, error_code, error_msg;\n\t\t\t\t\n\t\t// store params as instance variables\n\t\tlocal_defined('database') ? (self -> 'database') = @#database; \n\t\tlocal_defined('table') ? (self -> 'table') = @#table; \n\t\tlocal_defined('host') ? (self -> 'host') = @#host;\t// add support for inline host method\n\t\tlocal_defined('username') ? (self -> 'username') = @#username; \n\t\tlocal_defined('password') ? (self -> 'password') = @#password; \n\t\tlocal_defined('lockfield') ? (self -> 'lockfield') = @#lockfield; \n\t\tlocal_defined('user') ? (self -> 'user') = @#user;\n\t\t\t// param has default value\n\t\t(self -> 'keyfield') = (local_defined('keyfield') \n\t\t\t\t\t\t\t\t? @#keyfield // use parameter value\n\t\t\t\t\t\t\t\t| 'keyfield'); // use default value\n\n\t\t\n\t\t// build inline connection array\n\t\tlocal_defined('database') ? (self -> 'db_connect') -> insert('-database'  = @#database);\n\t\tlocal_defined('table') ? (self -> 'db_connect') -> insert('-table'  = @#table);\n\t\tlocal_defined('host') ? (self -> 'db_connect') -> insert('-host'  = @#host);\t// add support for inline host method\n\t\tlocal_defined('username') ? (self -> 'db_connect') -> insert('-username'  = @#username);\n\t\tlocal_defined('password') ? (self -> 'db_connect') -> insert('-password'  = @#password);\n\n\t\t(self -> 'table_realname') = (table_realname: #database, #table);\n\t\tif:  (self -> 'table_realname') == null;\n\t\t\t// verify that the table exists even if table_realname is null\n\t\t\tinline: (self -> 'db_connect');\n\t\t\t\tDatabase_TableNames: #database;\n\t\t\t\t\tif: Database_TableNameItem == #table;\n\t\t\t\t\t\t(self -> 'table_realname') = #table;\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/Database_TableNames;\n\t\t\t/inline;\n\t\t/if;\n\t\tfail_if: (self -> 'table_realname') == null, 7001, self -> error_msg(7001); // The specified table was not found\n\t\t\n\t\tif: (local_defined: 'validate');\n\t\t\t// validate db connection\n\t\t\tinline: (self -> 'db_connect');\n\t\t\t\tfail_if: error_code != 0, error_code, error_msg;\n\t\t\t/inline;\n\t\t/if;\n\n\t\tif: Lasso_DatasourceIsFilemaker: #database || Lasso_DatasourceIsFilemakerSA: #database;\n\t\t\t(self -> 'isfilemaker') = true;\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': creating database object on ' + (self -> 'datasource_name') +', isfilemaker: ' + (self -> 'isfilemaker') + ' at ' + (date -> (format: '%Q %T')));\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\n\t/define_tag;\n\t\n\t/* \n\tdefine_tag: 'onassign', -required='value', -description='Internal, needed to restore references when ctype is defined as prototype';\n\t\t// recreate references here\n\t\t(self -> 'user') = @(#value -> 'user');\n\t/define_tag;\n\t*/\n\n\tdefine_tag('_unknowntag', -description='Shortcut to field');\n\t\tif((self -> 'field_names_map') >> tag_name);\n\t\t\treturn(self -> field(tag_name));\n\t\telse;\n\t\t\t//fail(-9948, self -> type + '->' + tag_name + ' not known.');\n\t\t\t(self -> 'debug_trace') -> insert(self -> type + '->' + tag_name + ' not known.');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'settable',\t-description='Changes the current table for a database object. Useful to be able to create \\\n\t\tdatabase objects faster by copying an existing object and just change the table name. This is a little bit faster \\\n\t\tthan creating a new instance from scratch, but no table validation is performed. Only do this to add database \\\n\t\tobjects for tables within the same database as the original database object. ',\n\t\t-required='table', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\t\n\t\t(self -> 'error_code')=0;\n\t\t(self -> 'error_msg')=string;\n\t\t(self -> 'table_realname') = #table;\n\t\t(self -> 'db_connect') -> removeall(#table);\n\t\t(self -> 'db_connect') -> (insert: '-table' = #table);\n\t\t(self -> 'table_realname') = (table_realname: self -> 'database', #table);\n\t\tif:  (self -> 'table_realname') == null;\n\t\t\t// verify that the table exists even if table_realname is null\n\t\t\tinline: (self -> 'db_connect');\n\t\t\t\tDatabase_TableNames: (self -> 'database');\n\t\t\t\t\tif: Database_TableNameItem == #table;\n\t\t\t\t\t\t(self -> 'table_realname') = #table;\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/Database_TableNames;\n\t\t\t/inline;\n\t\t/if;\n\t\tfail_if: (self -> 'table_realname') == null, 7001, self -> error_msg(7001); // The specified table was not found\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'select', -description='perform database query, either Lasso-style pair array or SQL statement.\\\n\t\t\t ->recorddata returns a map with all the fields for the first found record. \\\n\t\t\t If multiple records are returned, the records can be accessed either through ->inlinename or ->records_array.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-search (optional array) Lasso-style search parameters in pair array\\n\\\n\t\t\t-sql (optional string) Raw sql query\\n\\\n\t\t\t-keyfield (optional) Overrides default keyfield, if any\\n\\\n\t\t\t-keyvalue (optional)\\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename',\n\t\t-optional='search', -type='array',\n\t\t-optional='sql', -type='string',\n\t\t-optional='keyfield',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='inlinename', -copy;\n\n\t\tknop_debug(self->type + ' -> ' + tag_name, -open, -type=self->type);\n\t\thandle;\n\t\t\t//knop_debug(-close, -witherrors, -type=self->type);\n\t\t\tknop_debug('Done with ' + self->type + ' -> ' + tag_name, -close, -witherrors, -time);\n\t\t/handle;\n\t\tlocal: 'timer'=knop_timer; \n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\t\t\n\t\tlocal: '_search'=(local: 'search'),\n\t\t\t'_sql'=(local: 'sql');\n\t\tif: #_search -> type != 'array';\n\t\t\t#_search = array;\n\t\t/if;\n\t\tif: #_sql != '' && (self -> 'isfilemaker');\n\t\t\t#_sql='';\n\t\t\tfail: 7009, self -> error_msg(7009); // sql can not be used with filemaker\n\t\t/if;\n\t\t// inlinename defaults to a random string\n\t\t(self -> 'inlinename') = ((local: 'inlinename') != '' ? #inlinename | 'inline_' + knop_unique);\n\t\t#_search -> (removeall: -inlinename);\n\t\t#_search -> (insert: -inlinename=(self -> 'inlinename'));\n\t\t\n\t\t// remove all database actions from the search array\n\t\t#_search -> (removeall: -search) & (removeall: -add) & (removeall: -delete) & (removeall: -update) \n\t\t\t& (removeall: -sql) & (removeall: -nothing) & (removeall: -show)\n\t\t\t// & (removeall: -table)  // table is ok to override\n\t\t\t& (removeall: -database);\n\n\t\tif: (local: 'sql') != '' && (string_findregexp: #sql, -find='\\\\bLIMIT\\\\b', -ignorecase) -> size;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing -maxrecords and -skiprecords from search array');\n\t\t\t// store maxrecords and skiprecords for later use\n\t\t\tif: #_search >> '-maxrecords';\n\t\t\t\t(self -> 'maxrecords_value') = #_search -> (find: '-maxrecords') -> last -> value;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': -maxrecords value found in search array ' + (self -> 'maxrecords_value'));\n\t\t\t/if;\n\t\t\tif: #_search >> '-skiprecords';\n\t\t\t\t(self -> 'skiprecords_value') = #_search -> (find: '-skiprecords') -> last -> value;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': -skiprecords value found in search array ' + (self -> 'skiprecords_value'));\n\t\t\t/if;\n\t\t\t// remove skiprecords from the actual search parameters since it will conflict with LIMIT\n\t\t\t#_search -> (removeall: '-skiprecords');\n\t\t/if;\n\n\t\tif: !(local_defined: 'keyfield') && (self -> 'keyfield') != '';\n\t\t\tlocal: 'keyfield'=(self -> 'keyfield');\n\t\t/if;\n\t\tif: (local: 'keyfield') != '';\n\t\t\t#_search -> (removeall: '-keyfield');\n\t\t\tif: !(self -> 'isfilemaker');\n\t\t\t\t#_search -> (insert: '-keyfield'=#keyfield);\n\t\t\t/if;\n\t\t\tif: (local: 'keyvalue') != '';\n\t\t\t\t#_search -> (removeall: '-keyvalue');\n\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\t#_search -> (insert: '-op'='eq');\n\t\t\t\t\t#_search -> (insert: #keyfield=#keyvalue);\n\t\t\t\telse;\n\t\t\t\t\t#_search -> (insert: '-keyvalue'=#keyvalue);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\n\t\t// add sql action or normal search action\n\t\tif: #_sql != '';\n\t\t\t#_search -> (insert: '-sql'=#_sql);\n\t\telse;\n\t\t\t#_search -> (insert: '-search');\n\t\t/if;\n\t\t// perform database query, put connection parameters last to override any provided by the search parameters\n\t\t//(self -> 'debug_trace') -> (insert: tag_name + ': search ' + #_search);\n\t\tlocal: 'querytimer'=knop_timer;\n\t\tinline: #_search,(self -> 'db_connect');\n\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t(self -> 'searchparams') = #_search;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name ': action_statement ' + action_statement);\n\t\t\tknop_debug(action_statement, -sql);\n\t\t\tknop_debug(found_count ' found');\n\t\t\tself -> capturesearchvars;\n\t\t/inline;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found ' (self -> 'found_count') + ' records in ' + (self -> 'querytime') + ' ms, tag time ' + (self -> 'tagtime') + ' ms, ' + (self -> error_msg) + ' ' + (self -> error_code));\n\t/define_tag;\n\n\n\tdefine_tag: 'addrecord', -description='Add a new record to the database. A random string keyvalue will be generated unless a -keyvalue is specified. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-fields (required array) Lasso-style field values in pair array\\n\\\n\t\t\t-keyvalue (optional) If -keyvalue is specified, it must not already exist in the database. Specify -keyvalue=false to prevent generating a keyvalue. \\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename',\n\t\t-required='fields', -type='array',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='inlinename';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\t\tlocal: '_fields'=#fields;\n\t\t\n\t\t// remove all database actions from the search array\n\t\t#_fields -> (removeall: '-search') & (removeall: '-add') & (removeall: '-delete') & (removeall: '-update') \n\t\t\t& (removeall: '-sql') & (removeall: '-nothing') & (removeall: '-show')\n\t\t\t// & (removeall: '-table')  // table is ok to override\n\t\t\t& (removeall: '-database');\n\n\t\tinline: (self -> 'db_connect'); // connection wrapper\n\t\t\tif: (local: 'keyvalue') != '' && (local: 'keyvalue') !== false && (self -> 'keyfield')!='';\n\t\t\t\t// look for existing keyvalue\n\t\t\t\tinline: -op='eq', (self -> 'keyfield')=#keyvalue, \n\t\t\t\t\t-maxrecords=1,\n\t\t\t\t\t-returnfield=(self -> 'keyfield'),\n\t\t\t\t\t-search;\n\t\t\t\t\tif: found_count > 0;\n\t\t\t\t\t\t(self -> 'error_code') = 7017; // duplicate keyvalue\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> 'keyvalue') = #keyvalue;\n\t\t\t\t\t/if;\n\t\t\t\t/inline;\n\t\t\t/if;\n\n\t\t\t\n\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t// proceed to add record\n\n\t\t\t\tif: (self -> 'keyfield') != '';\n\t\t\t\t\tif: (local: 'keyvalue') == '' && (local: 'keyvalue') !== false;\n\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': generating keyvalue');\n\t\t\t\t\t\t// create unique keyvalue\n\t\t\t\t\t\t(self -> 'keyvalue')=knop_unique;\n\t\t\t\t\t/if;\n\t\t\t\t\t#_fields -> (removeall: (self -> 'keyfield'));\n\t\t\t\t\t#_fields -> (removeall: '-keyfield') & (removeall: '-keyvalue');\n\t\t\t\t\t#_fields -> (insert: '-keyfield'=(self -> 'keyfield'));\n\t\t\t\t\tif: (local: 'keyvalue') !== false;\n\t\t\t\t\t\t#_fields -> (insert: (self -> 'keyfield')=(self -> 'keyvalue'));\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\n\t\t\t\t// inlinename defaults to a random string\n\t\t\t\t(self -> 'inlinename') = ((local: 'inlinename') != '' ? #inlinename | 'inline_' + knop_unique);\n\t\t\t\t#_fields -> (removeall: '-inlinename');\n\t\t\t\t#_fields -> (insert: '-inlinename'=(self -> 'inlinename'));\n\t\t\t\t\n\t\t\t\tlocal: 'querytimer'=knop_timer;\n\t\t\t\tinline: #_fields, -add;\n\t\t\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t\t\t(self -> 'searchparams') = #_fields;\n\t\t\t\t\n\t\t\t\t\tself -> capturesearchvars;\n\t\t\t\t\tif: error_code != 0;\n\t\t\t\t\t\t(self -> 'keyvalue') = null;\n\t\t\t\t\t/if;\n\t\t\t\t/inline;\n\t\t\t/if;\n\t\t/inline;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> error_msg) + ' ' + (self -> error_code) \n\t\t\t+ ' keyvalue ' + (self -> 'keyvalue') + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'getrecord', -description='Returns a single specific record from the database, optionally locking the record. \\\n\t\t\tIf the keyvalue matches multiple records, an error is returned. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-keyvalue (optional) Uses a previously set keyvalue if not specified. If no keyvalue is available, an error is returned unless -sql is used. \\n\\\n\t\t\t-keyfield (optional) Temporarily override of keyfield specified at oncreate\\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename\\n\\\n\t\t\t-lock (optional flag) If flag is specified, a record lock will be set\\n\\\n\t\t\t-user (optional) The user who is locking the record (required if using lock)\\n\\\n\t\t\t-sql (optional) SQL statement to use instead of keyvalue. Must include the keyfield (and lockfield of locking is used).',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='keyfield',\n\t\t-optional='inlinename', -copy,\n\t\t-optional='lock',\n\t\t-optional='user', -copy,\n\t\t-optional='sql', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: '_sql'=(local: 'sql');\n\n\t\tif: #_sql != '' && (self -> 'isfilemaker');\n\t\t\t#_sql='';\n\t\t\tfail: 7009, self -> error_msg(7009); // sql can not be used with filemaker\n\t\t/if;\n\t\t\n\t\t// get existing record pointer if any\n\t\tif: #_sql -> size == 0 && !(local_defined: 'keyvalue');\n\t\t\tlocal: 'keyvalue'=(self -> 'keyvalue');\n\t\telse: !(local_defined: 'keyvalue');\n\t\t\tlocal: 'keyvalue'=string;\n\t\t/if;\n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\t\t\n\t\tfail_if: !(local_defined: 'keyfield') && (self -> 'keyfield') == '', 7002, self -> error_msg(7002); // Keyfield not specified\n\t\tif: (local_defined: 'lock') && #lock != false;\n\t\t\tfail_if: (self -> 'lockfield') == '', 7003, self -> error_msg(7003); // Lockfield must be specified to get record with lock\n\t\t\tif: !(local_defined: 'user') && ((self -> 'user') != '' || (self -> 'user') -> isa('user'));\n\t\t\t\t// use user from database object\n\t\t\t\tlocal('user' = (self -> 'user'));\n\t\t\t/if;\n\t\t\tfail_if: (local: 'user') == '' && !((local: 'user') -> isa('user')), 7004, self -> error_msg(7004); // User must be specified to get record with lock\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user is type ' + (#user -> type) + ', isa(user) = ' + (#user -> isa('user')) );\n\t\t\tif: #user -> isa('user');\n\t\t\t\t#user= #user -> id_user;\n\t\t\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User must be logged in to get record with lock\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user id is ' + #user);\n\t\t/if;\n\t\tif: !(local_defined: 'keyfield') && (self -> 'keyfield') != '';\n\t\t\tlocal: 'keyfield'=(self -> 'keyfield');\n\t\t/if;\n\t\tif:  #_sql -> size == 0 && string(#keyvalue) -> size == 0;\n\t\t\t(self -> 'error_code') = 7007; // keyvalue missing\n\t\t/if;\n\t\tif: (self -> 'error_code') == 0;\n\t\t\tinline: (self -> 'db_connect'); // connection wrapper\n\n\t\t\t\tif: #_sql -> size;\n\t\t\t\t\tself -> (select: -sql=#_sql, -inlinename=(local: 'inlinename'));\n\t\t\t\t\t#keyvalue = (self -> 'keyvalue');\n\t\t\t\telse;\n\t\t\t\t\tself -> (select: -keyfield=#keyfield, -keyvalue=#keyvalue, -inlinename=(local: 'inlinename'));\n\t\t\t\t/if;\n\t\t\t\tif: (self -> field_names) !>> #keyfield;\n\t\t\t\t\t(self -> 'error_code') = 7020; // Keyfield not present in query\n\t\t\t\t/if;\n\t\t\t\tif: (self -> field_names) !>> (self -> 'lockfield') && (local_defined: 'lock') && #lock != false;\n\t\t\t\t\t(self -> 'error_code') = 7021; // Lockfield not present in query\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t\tif: (self -> 'found_count') == 0 && (self -> 'error_code') == 0;\n\t\t\t\t\t(self -> 'error_code') = -1728;\n\t\t\t\telse: (self -> 'found_count') > 1 && (self -> 'error_code') == 0;\n\t\t\t\t\tself -> reset;\n\t\t\t\t\t(self -> 'error_code') = 7008; // keyvalue not unique\n\t\t\t\t/if;\n\t\t\n\t\t\n\t\t\t\t// handle record locking\n\t\t\t\tif: (self -> 'error_code') == 0 && (local_defined: 'lock') && #lock != false;\n\t\t\t\t\t// check for current lock\n\t\t\t\t\tif: (self -> 'lockvalue') != '';\n\t\t\t\t\t\t// there is a lock already set, check if it has expired or if it is the same user\n\t\t\t\t\t\tlocal: 'lockvalue'=(self -> 'lockvalue') -> (split: '|');\n\t\t\t\t\t\tlocal: 'lock_timestamp'=date: (#lockvalue->size > 1 ? #lockvalue -> (get: 2) | null);\n\t\t\t\t\t\tlocal: 'lock_user'=#lockvalue -> first;\n\t\t\t\t\t\tif: (date - #lock_timestamp) -> seconds < (self -> 'lock_expires')\n\t\t\t\t\t\t\t&& #lock_user != #user;\n\t\t\t\t\t\t\t// the lock is still valid and it is locked by another user\n\t\t\t\t\t\t\t// this is not a real error, more a warning condition\n\t\t\t\t\t\t\t(self -> 'error_code') = 7010; \n\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'user' = #lock_user, 'timestamp' = #lock_timestamp);\n\t\t\t\t\t\t\t(self -> 'keyvalue') = null;\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name ': record ' + #keyvalue + ' was already locked by ' + #lock_user + '.');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\t\t// go ahead and lock record\n\t\t\t\t\t\t(self -> 'lockvalue') = #user + '|' + (date -> format: '%Q %T');\n\t\t\t\t\t\t(self -> 'lockvalue_encrypted') = (encrypt_blowfish: (self -> 'lockvalue'), -seed=(self -> 'lock_seed'));\n\t\t\t\t\t\tlocal: 'keyvalue_temp'=#keyvalue;\n\t\t\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\t\t\t// find internal keyvalue\n\t\t\t\t\t\t\tinline: -op='eq', #keyfield=#keyvalue,\n\t\t\t\t\t\t\t\t-search;\n\t\t\t\t\t\t\t\tif: found_count == 1;\n\t\t\t\t\t\t\t\t\t#keyvalue_temp=keyfield_value;\n\t\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': will set record lock for FileMaker record id ' + keyfield_value + ' ' + error_msg + ' ' + error_code);\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': could not get record id for FileMaker record, ' found_count + ' found ' + + error_msg + ' ' + error_code);\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/inline;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tinline: -keyfield=#keyfield,\n\t\t\t\t\t\t\t-keyvalue=#keyvalue_temp, \n\t\t\t\t\t\t\t(self -> 'lockfield')=(self -> 'lockvalue'),\n\t\t\t\t\t\t\t-update;\n\t\t\t\t\t\t\tif: error_code;\n\t\t\t\t\t\t\t\t(self -> 'error_code') = 7012; // could not set record lock\n\t\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\t\t\t(self -> 'lockvalue') = null;\n\t\t\t\t\t\t\t\t(self -> 'lockvalue_encrypted') = null;\n\t\t\t\t\t\t\t\t(self -> 'keyvalue') = null;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t// lock was set ok\n\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': set record lock ' + (self -> 'lockvalue') + ' ' + (self -> 'lockvalue_encrypted'));\n\t\t\t\t\t\t\t\tif: (self -> 'user') -> isa('user');\n\t\t\t\t\t\t\t\t\t// tell user it has locked a record in this db object\n\t\t\t\t\t\t\t\t\t(self -> 'user') -> addlock(-dbname=self -> varname);\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/inline;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t/inline;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> error_msg) + ' ' + (self -> error_code) + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'saverecord', -description='Updates a specific database record. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-fields (required array) Lasso-style field values in pair array\\n\\\n\t\t\t-keyfield (optional) Keyfield is ignored if lockvalue is specified\\n\\\n\t\t\t-keyvalue (optional) Keyvalue is ignored if lockvalue is specified\\n\\\n\t\t\t-lockvalue (optional) Either keyvalue or lockvalue must be specified\\n\\\n\t\t\t-keeplock (optional flag) Avoid clearing the record lock when saving. Updates the lock timestamp.\\n\\'\n\t\t\t-user (optional) If lockvalue is specified, user must be specified as well\\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename',\n\t\t-required='fields', -type='array',\n\t\t-optional='keyfield',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='lockvalue', -copy,\n\t\t-optional='keeplock',\n\t\t-optional='user', -copy,\n\t\t-optional='inlinename', -copy;\n\t\t\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tif(!local_defined('keyvalue') && string(self -> 'keyvalue') -> size);\n\t\t\t// use current record's keyvalue if any\n\t\t\tlocal('keyvalue'=(self -> 'keyvalue'));\n\t\t/if;\n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\n\t\tfail_if: !(local_defined: 'keyvalue') && !(local_defined: 'lockvalue'), 7005, self -> error_msg(7005); // Either keyvalue or lockvalue must be specified for update or delete\n\t\tfail_if: (local_defined: 'keyvalue') && (self -> 'keyfield') == '' && (local: 'keyfield') == '', 7002, self -> error_msg(7002); // Keyfield not specified\n\t\tif: (local_defined: 'lockvalue');\n\t\t\tfail_if: (self -> 'lockfield') == '', 7003, self -> error_msg(7003); // Lockfield not specified\n\t\t\tif: !(local_defined: 'user') && ((self -> 'user') != '' || (self -> 'user') -> isa('user'));\n\t\t\t\t// use user from database object\n\t\t\t\tlocal('user' = (self -> 'user'));\n\t\t\t/if;\n\t\t\tfail_if: (local: 'user') == '' && !((local: 'user') -> isa('user')), 7004, self -> error_msg(7004); \n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user is type ' + (#user -> type) + ', isa(user) = ' + (#user -> isa('user')) );\n\t\t\tif: #user -> isa('user');\n\t\t\t\t#user= #user -> id_user;\n\t\t\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User must be logged in to get record with lock\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user id is ' + #user);\n\t\t/if;\n\t\t\n\t\t!(local_defined: 'keyfield') ? local: 'keyfield'=self -> 'keyfield';\n\t\t\n\t\tlocal: '_fields'=#fields;\n\t\t\n\t\t// remove all database actions from the search array\n\t\t#_fields -> (removeall: '-search') & (removeall: '-add') & (removeall: '-delete') & (removeall: '-update') \n\t\t\t& (removeall: '-sql') & (removeall: '-nothing') & (removeall: '-show')\n\t\t\t// & (removeall: '-table') // table is ok to override\n\t\t\t& (removeall: '-database');\n\t\t#_fields -> (removeall: '-keyfield') & (removeall: '-keyvalue');\n\n\t\tinline: (self -> 'db_connect'); // connection wrapper\n\n\t\t\t// handle record locking\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'lockvalue') != '';\n\n\t\t\t\t// first check if record was locked by someone else, and that lock is still valid\n\t\t\t\tlocal: 'lock'=(decrypt_blowfish: #lockvalue, -seed=(self -> 'lock_seed')) -> (split: '|');\n\t\t\t\tlocal: 'lock_timestamp'=date: (#lock->size > 1 ? (#lock -> (get: 2)) | null);\n\t\t\t\tlocal: 'lock_user'=#lock -> first;\n\t\t\t\tif: (date - #lock_timestamp) -> seconds < (self -> 'lock_expires')\n\t\t\t\t\t&& #lock_user != #user;\n\t\t\t\t\t// the lock is still valid and it is locked by another user\n\t\t\t\t\t(self -> 'error_code') = 7010; \n\t\t\t\t\t(self -> 'error_data') = (map: 'user' = #lock_user, 'timestamp' = #lock_timestamp);\n\t\t\t\t/if;\n\n\t\t\t\t// check that the current lock is still valid\n\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\tinline: -op='eq', (self -> 'lockfield')=#lock -> (join: '|'), \n\t\t\t\t\t\t-maxrecords=1,\n\t\t\t\t\t\t-returnfield=(self -> 'lockfield'),\n\t\t\t\t\t\t-returnfield=(self -> 'keyfield'),\n\t\t\t\t\t\t-search;\n\t\t\t\t\t\tif: error_code == 0 && found_count != 1;\n\t\t\t\t\t\t\t// lock is not valid any more\n\t\t\t\t\t\t\t(self -> 'error_code') = 7011; // Update failed, record lock not valid any more\n\t\t\t\t\t\telse: error_code != 0;\n\t\t\t\t\t\t\t(self -> 'error_code') = 7018; // Update error\n\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t// lock OK, grab keyvalue for update\n\t\t\t\t\t\t\tlocal: 'keyvalue'=(field: (self -> 'keyfield'));\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\t// go ahead and release record lock by clearing the field value in the update fields array\n\t\t\t\t\t#_fields -> (removeall: (self -> 'lockfield'));\n\t\t\t\t\tif: ((local_defined: 'keeplock') && #keeplock != false);\n\t\t\t\t\t\t// update the lock timestamp\n\t\t\t\t\t\t(self -> 'lockvalue') = #user + '|' + (date -> format: '%Q %T');\n\t\t\t\t\t\t(self -> 'lockvalue_encrypted') = (encrypt_blowfish: (self -> 'lockvalue'), -seed=(self -> 'lock_seed'));\n\t\t\t\t\t\t#_fields -> (insert: (self -> 'lockfield')=(self -> 'lockvalue'));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#_fields -> (insert: (self -> 'lockfield') = '');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\n\t\t\t/if;\n\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'keyvalue') != '';\n\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\tinline: -op='eq', #keyfield=#keyvalue, -search;\n\t\t\t\t\t\tif: found_count == 1;\n\t\t\t\t\t\t\t#_fields -> (insert: '-keyvalue'=keyfield_value);\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': FileMaker record id ' + keyfield_value);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\telse;\n\t\t\t\t\t#_fields -> (insert: '-keyfield'=#keyfield);\n\t\t\t\t\t#_fields -> (insert: '-keyvalue'=#keyvalue);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\tif: (#_fields >> '-keyfield' && #_fields -> (find: '-keyfield') -> first -> value != '' || (self -> 'isfilemaker'))\n\t\t\t\t&& #_fields >> '-keyvalue' && #_fields -> (find: '-keyvalue') -> first -> value != '';\n\t\t\t\t// ok to update\n\t\t\telse: (self -> 'error_code') == 0;\n\t\t\t\t(self -> 'error_code') = 7006; // Update failed, keyfield or keyvalue missing';\n\t\t\t/if;\n\n\t\t\t// update record\n\t\t\tif: (self -> 'error_code') == 0;\n\n\t\t\t\t// inlinename defaults to a random string\n\t\t\t\t(self -> 'inlinename') = ((local: 'inlinename') != '' ? #inlinename | 'inline_' + knop_unique);\n\t\t\t\t#_fields -> (removeall: '-inlinename');\n\t\t\t\t#_fields -> (insert: '-inlinename'=(self -> 'inlinename'));\n\t\n\t\t\t\tlocal: 'querytimer'=knop_timer;\n\t\t\t\tinline: #_fields, -update;\n\t\t\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t\t\t(self -> 'searchparams') = #_fields;\n\t\t\t\t\tself -> capturesearchvars;\n\t\t\t\t/inline;\n\t\t\t/if;\n\t\t/inline;\n\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> 'keyvalue') + ' '+ (self -> error_msg) + ' ' + (self -> error_code) + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'deleterecord', -description='Deletes a specific database record. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-keyvalue (optional) Keyvalue is ignored if lockvalue is specified\\n\\\n\t\t\t-lockvalue (optional) Either keyvalue or lockvalue must be specified\\n\\\n\t\t\t-user (optional) If lockvalue is specified, user must be specified as well',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='lockvalue', -copy,\n\t\t-optional='user';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tif(!local_defined('keyvalue') && string(self -> 'keyvalue') -> size);\n\t\t\t// use current record's keyvalue if any\n\t\t\tlocal('keyvalue'=(self -> 'keyvalue'));\n\t\t/if;\n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\n\t\tfail_if: !(local_defined: 'keyvalue') && !(local_defined: 'lockvalue'), 7005,  self -> error_msg(7005); // Either keyvalue or lockvalue must be specified for update or delete\n\t\tfail_if: (local_defined: 'keyvalue') && (self -> 'keyfield') == '', 7002,  self -> error_msg(7002); // Keyfield not specified\n\t\tif: (local_defined: 'lockvalue');\n\t\t\tfail_if: (self -> 'lockfield') == '', 7003,  self -> error_msg(7003); //  Lockfield not specified\n\t\t\tif: !(local_defined: 'user') && ((self -> 'user') != '' || (self -> 'user') -> isa('user'));\n\t\t\t\t// use user from database object\n\t\t\t\tlocal('user' = (self -> 'user'));\n\t\t\t/if;\n\t\t\tfail_if: (local: 'user') == '' && !((local: 'user') -> isa('user')), 7004, self -> error_msg(7004); \n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user is type ' + (#user -> type) + ', isa(user) = ' + (#user -> isa('user')) );\n\t\t\tif: #user -> isa('user');\n\t\t\t\t#user= #user -> id_user;\n\t\t\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User must be logged in to get record with lock\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user id is ' + #user);\n\t\t/if;\n\t\t\n\t\tlocal: '_fields'=array;\n\t\t\n\t\tinline: (self -> 'db_connect'); // connection wrapper\n\n\t\t\t// handle record locking\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'lockvalue') != '';\n\n\t\t\t\t// first check if record was locked by someone else, and that lock is still valid\n\t\t\t\tlocal: 'lockvalue'=(decrypt_blowfish: #lockvalue, -seed=(self -> 'lock_seed')) -> (split: '|');\n\t\t\t\tlocal: 'lock_timestamp'=date: (#lockvalue->size > 1 ? #lockvalue -> (get: 2) | null);\n\t\t\t\tlocal: 'lock_user'=(#lockvalue -> first);\n\t\t\t\tif: (date - #lock_timestamp) -> seconds < (self -> 'lock_expires')\n\t\t\t\t\t&& #lock_user != #user;\n\t\t\t\t\t// the lock is still valid and it is locked by another user\n\t\t\t\t\t(self -> 'error_code') = 7010; // Delete failed, record locked \n\t\t\t\t\t(self -> 'error_data') = (map: 'user' = #lock_user, 'timestamp' = #lock_timestamp);\n\t\t\t\t/if;\n\n\t\t\t\t// check that the current lock is still valid\n\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\tinline: -op='eq', (self -> 'lockfield')=#lockvalue -> (join: '|'), \n\t\t\t\t\t\t-maxrecords=1,\n\t\t\t\t\t\t-returnfield=(self -> 'lockfield'),\n\t\t\t\t\t\t-returnfield=(self -> 'keyfield'),\n\t\t\t\t\t\t-search;\n\t\t\t\t\t\tif: error_code == 0 && found_count != 1;\n\t\t\t\t\t\t\t// lock is not valid any more\n\t\t\t\t\t\t\t(self -> 'error_code') = 7011; // Delete failed, record lock not valid any more';\n\t\t\t\t\t\telse: error_code != 0;\n\t\t\t\t\t\t\t(self -> 'error_code') = 7019; // delete error\n\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t// lock OK, grab keyvalue for update\n\t\t\t\t\t\t\tlocal: 'keyvalue'=(field: (self -> 'keyfield'));\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': got keyvalue ' + #keyvalue + ' for keyfield ' + (self -> 'keyfield'));\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t/if;\n\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'keyvalue') != '';\n\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\tinline: -op='eq', (self -> 'keyfield')=#keyvalue, -search;\n\t\t\t\t\t\tif: found_count == 1;\n\t\t\t\t\t\t\t#_fields -> (insert: '-keyvalue'=keyfield_value);\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': FileMaker record id ' + keyfield_value);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\telse;\n\t\t\t\t\t#_fields -> (insert: '-keyfield'=(self -> 'keyfield'));\n\t\t\t\t\t#_fields -> (insert: '-keyvalue'=#keyvalue);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': will delete record with params ' + #_fields);\n\t\t\t\n\t\t\tif: (#_fields >> '-keyfield' && #_fields -> (find: '-keyfield') -> first -> value != '' || (self -> 'isfilemaker'))\n\t\t\t\t&& #_fields >> '-keyvalue' && #_fields -> (find: '-keyvalue') -> first -> value != '';\n\t\t\t\t// ok to delete\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = 7006; // Delete failed, keyfield or keyvalue missing\n\t\t\t/if;\n\t\t\t\n\t\t\t// delete record\n\t\t\tif: (self -> 'error_code') == 0;\n\t\n\t\t\t\tlocal: 'querytimer'=knop_timer;\n\t\t\t\tinline: #_fields, -delete;\n\t\t\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t\t\t(self -> 'searchparams') = #_fields;\n\t\t\t\t\n\t\t\t\t\tself -> capturesearchvars;\n\t\t\t\t\n\t\t\t\t/inline;\n\t\t\t/if;\n\t\t/inline;\n\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> error_msg) + ' ' + (self -> error_code) + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'clearlocks', -description='Release all record locks for the specified user, suitable to use when showing record list. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-user (required) The user to unlock records for',\n\t\t-required='user';\n\t\t// release all record locks for the specified user, suitable to use when showing record list\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tfail_if: (self -> 'lockfield') == '', 7003,  self -> error_msg(7003); //  Lockfield not specified\n\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User not specified\n\t\n\t\tif: (self -> 'isfilemaker');\n\t\t\tinline: (self -> 'db_connect'),\n\t\t\t\t-maxrecords=all,\n\t\t\t\t(self -> 'lockfield')='\"' + #user + '|\"',\n\t\t\t\t-search;\n\t\t\t\tif: found_count > 0;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': clearing locks for ' + #user + ' in ' + found_count + ' FileMaker records ' + error_msg + ' ' + error_code);\n\t\t\t\t\trecords;\n\t\t\t\t\t\tinline: -keyvalue=keyfield_value,\n\t\t\t\t\t\t\t(self -> 'lockfield')='',\n\t\t\t\t\t\t\t-update;\n\t\t\t\t\t\t\tif: error_code;\n\t\t\t\t\t\t\t\t(self -> 'error_code') = 7013; // Clearlocks failed\n\t\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': error when clearing lock on FileMaker record ' + keyfield_value + ' ' + error_msg + ' ' + error_code);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/inline;\n\t\t\t\t\t/records;\n\t\t\t\telse: error_code;\n\t\t\t\t\t(self -> 'error_code') = 7013; // Clearlocks failed\n\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t/if;\n\t\t\t/inline;\n\t\telse;\n\t\t\tinline: (self -> 'db_connect'),\n\t\t\t\t-sql='UPDATE `' + (self -> 'table_realname') + '` SET `' + (self -> 'lockfield') + '`=\"\"  WHERE `' + (self -> 'lockfield') \n\t\t\t\t\t+ '` LIKE \"' + (encode_sql: #user) + '|%\"';\n\t\t\t\tif: error_code != 0;\n\t\t\t\t\t(self -> 'error_code') = 7013; // Clearlocks failed\n\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t/if;\n\t\t\t/inline;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': clearing all locks for ' + #user + ' ' + (self -> error_msg) + ' ' + (self -> error_code));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'action_statement';\t\treturn: (self -> 'action_statement');\t/define_tag;\n\tdefine_tag: 'found_count';\t\t\treturn: (self -> 'found_count');\t\t/define_tag;\n\tdefine_tag: 'shown_count';\t\t\treturn: (self -> 'shown_count');\t\t/define_tag;\n\tdefine_tag: 'shown_first';\t\t\treturn: (self -> 'shown_first');\t\t/define_tag;\n\tdefine_tag: 'shown_last';\t\t\treturn: (self -> 'shown_last');\t\t\t/define_tag;\n\tdefine_tag: 'maxrecords_value';\t\treturn: (self -> 'maxrecords_value');\t/define_tag;\n\tdefine_tag: 'skiprecords_value';\treturn: (self -> 'skiprecords_value');\t/define_tag;\n\tdefine_tag: 'keyfield';\t\t\t\treturn: (self -> 'keyfield');\t\t\t/define_tag;\n\tdefine_tag: 'keyvalue';\t\t\t\treturn: (self -> 'keyvalue');\t\t\t/define_tag;\n\tdefine_tag: 'lockfield';\t\t\treturn: (self -> 'lockfield');\t\t\t/define_tag;\n\tdefine_tag: 'lockvalue';\t\t\treturn: (self -> 'lockvalue');\t\t\t/define_tag;\n\tdefine_tag: 'lockvalue_encrypted';\treturn: (self -> 'lockvalue_encrypted'); /define_tag;\n\tdefine_tag: 'querytime';\t\t\treturn: (self -> 'querytime');\t\t\t/define_tag;\n\tdefine_tag: 'inlinename';\t\t\treturn: (self -> 'inlinename');\t\t\t/define_tag;\n\tdefine_tag: 'searchparams';\t\t\treturn: (self -> 'searchparams');\t\t/define_tag;\n\tdefine_tag: 'resultset_count',\n\t\t-optional='inlinename';\n\t\t!local_defined('inlinename') ? local('inlinename'=(self -> 'inlinename'));\n\t\treturn((self -> 'resultset_count_map') -> find(#inlinename));\n\t/define_tag;\n\n\tdefine_tag('recorddata', -description='A map containing all fields, only available for single record results',\n\t\t-optional='recordindex', -copy);\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex == 1);\n\t\t\t// return default (i.e. first) record\n\t\t\treturn(self -> 'recorddata');\n\t\telse;\n\t\t\tlocal('recorddata'=map);\n\t\t\titerate(self -> field_names, local('field_name'));\n\t\t\t\t#recorddata -> insert(#field_name  =  (self -> 'records_array' -> get(#recordindex) \n\t\t\t\t\t-> get(self -> 'field_names_map' -> find(#field_name))));\n\t\t\t/iterate;\n\t\t\treturn(#recorddata);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'records_array';\t\treturn: (self -> 'records_array');\t\t/define_tag;\n\t\n\tdefine_tag('field_names', -description='Returns an array of the field names from the last database query. If no database query has been performed, a \"-show\" request is performed. \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-table (optional) Return the field names for the specified table\\n\\\n\t\t\t-types (optional flag) If specified, returns a pair array with fieldname and corresponding Lasso data type',\n\t\t-optional='table',\n\t\t-optional='types');\n\t\t!local_defined('table') ? local('table'=(self -> 'table'));\n\t\tlocal('field_names'=(self -> 'field_names'));\n\t\tif(#field_names -> size == 0 || (local_defined('types') && #types != false));\n\t\t\t#field_names=array;\n\t\t\tif(local_defined('types') && #types != false);\n\t\t\t\tlocal('types_mapping'=map('text'='string', 'number'='decimal', 'date/time'='date'));\n\t\t\t/if;\n\t\t\tinline(self->'db_connect', -table=#table, -show);\n\t\t\t\tif(local_defined('types') && #types != false);\n\t\t\t\t\tloop(field_name(-count));\n\t\t\t\t\t\t#field_names -> insert(field_name(loop_count) = #types_mapping->find(field_name(loop_count, -type)));\n\t\t\t\t\t/loop;\n\t\t\t\telse;\n\t\t\t\t\t#field_names=field_names;\n\t\t\t\t/if;\n\t\t\t/inline;\n\t\t/if;\n\t\treturn(@#field_names);\n\t/define_tag;\n\t\n\tdefine_tag('table_names', -description='Returns an array with all table names for the database');\n\t\tlocal('table_names'=array);\n\t\tinline(self -> 'db_connect');\n\t\t\tDatabase_TableNames(self -> 'database');\n\t\t\t\t#table_names -> insert(Database_TableNameItem);\n\t\t\t/Database_TableNames;\n\t\t/inline;\n\t\treturn(@#table_names);\n\t/define_tag;\n\t\n\tdefine_tag: 'error_data', -description='Returns more info for those errors that provide such';\n\t\tif: (self -> 'errors_error_data') >> (self -> error_code);\n\t\t\treturn: (self -> 'error_data');\n\t\telse;\n\t\t\treturn: map;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('size');\n\t\treturn(self -> 'shown_count');\n\t/define_tag;\n\n\tdefine_tag('get', -required='index');\n\t\treturn(knop_databaserow(\n\t\t\t-record_array=(self -> 'records_array' -> get(#index)), \n\t\t\t-field_names=(self -> 'field_names')));\n\t/define_tag;\n\n\tdefine_tag('records', -description='Returns all found records as a knop_databaserows object',\n\t\t-optional='inlinename');\n\t\t!local_defined('inlinename') ? local('inlinename'=(self -> 'inlinename'));\n\t\tif((self -> 'databaserows_map') !>> #inlinename);\n\t\t\t// create knop_databaserows on demand\n\t\t\t(self -> 'databaserows_map') -> insert(#inlinename = knop_databaserows(\n\t\t\t\t\t-records_array=(self -> 'records_array'), \n\t\t\t\t\t-field_names=(self -> 'field_names'))\n\t\t\t\t);\n\t\t/if;\n\t\treturn(@((self -> 'databaserows_map') -> find(#inlinename)));\n\t/define_tag;\n\n\tdefine_tag('field', -description='A shortcut to return a specific field from a single record result',\n\t\t-required='fieldname',\n\t\t-optional='recordindex',\n\t\t-optional='index');\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(#recordindex == 1 && #index == 1);\n\t\t\t// return first field occurrence from the default (i.e. first) record\n\t\t\treturn((self -> 'recorddata') -> find(#fieldname));\n\t\telse(self -> 'field_names_map' >> #fieldname \n\t\t\t&& #recordindex >= 1 \n\t\t\t&& #recordindex <= (self -> 'records_array') -> size);\n\t\t\t// return specific record\n\t\t\tif(#index==1);\n\t\t\t\t// return first ocurrence of field name through the index map - this is faster\n\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(self -> 'field_names_map' -> find(#fieldname)));\n\t\t\telse;\n\t\t\t\t// return another occurrence of the field - this is slightly slower\n\t\t\t\tlocal('indexmatches'=(self -> 'field_names') -> findposition(#fieldname));\n\t\t\t\tif(#index >= 1 && #index <= #indexmatches -> size);\n\t\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(#indexmatches -> get(#index)));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag('next', -description='Increments the record pointer, returns true if there are more records to show, false otherwise.\\n\\\n\t\t\tUseful as an alternative to a regular records loop:\\n\\\n\t\t\t\\t$database -> select;\\n\\\n\t\t\t\\twhile: $database -> next;\\n\\\n\t\t\t\\t\\t$database -> field(\\'name\\');\\'<br>\\';\\n\\\n\t\t\t\\t/while;');\n\t\tif((self -> 'current_record') < (self -> 'shown_count'));\n\t\t\t(self -> 'current_record') += 1;\n\t\t\treturn(true);\n\t\telse;\n\t\t\t// reset record pointer\n\t\t\t(self -> 'current_record') = 0;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('nextrecord', -description='Deprecated synonym for ->next');\n\t\t(self -> 'debug_trace') -> insert('*** DEPRECATION WARNING *** ' + tag_name + ' is deprecated, use ->next instead ');\n\t\treturn(self -> next);\n\t/define_tag;\n\n\tdefine_tag: 'trace', \n\t\t-optional='html',\n\t\t-optional='xhtml';\n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\n\t\treturn: #eol + 'Debug trace for database $' + (self -> varname) + ' (' (self -> 'database') '.' (self -> 'table') + ')' +  #eol \n\t\t\t+ (self -> 'debug_trace') -> (join: #eol) + #eol;\n\n\t/define_tag;\n\n\n\t// =========== Internal member tags ===============\n\t\n\tdefine_tag: 'reset', -description='Internal, reset all search result vars';\n\t\t// reset all search result vars\n\t\t// searchresultvars\n\t\t(self -> 'action_statement') = null;\n\t\t(self -> 'found_count') = null;\n\t\t(self -> 'shown_first') = null;\n\t\t(self -> 'shown_last') = null;\n\t\t(self -> 'shown_count') = null;\n\t\t(self -> 'field_names') = null;\n\t\t(self -> 'records_array') = null;\n\t\t(self -> 'maxrecords_value') = null;\n\t\t(self -> 'skiprecords_value') = null;\n\t\t\n\t\t(self -> 'inlinename')=string;\n\t\t(self -> 'keyvalue')=null;\n\t\t(self -> 'lockvalue')=null;\n\t\t(self -> 'lockvalue_encrypted')=null;\n\t\t(self -> 'timestampfield')=string;\n\t\t(self -> 'timestampvalue')=string;\n\t\t(self -> 'searchparams')=string;\n\t\t(self -> 'querytime')=integer;\n\t\t(self -> 'recorddata')=map;\n\t\t(self -> 'message')=string;\n\t\t(self -> 'current_record')=0;\n\t\t(self -> 'field_names_map')=map;\n\n\t\t(self -> 'error_code')=0;\n\t\t(self -> 'error_msg')=string;\n\t/define_tag;\n\n\tdefine_tag: 'capturesearchvars', -description='Internal';\n\t\t// internal member tag\n\n\t\t// capture various result variables like found_count, shown_first, shown_last, shown_count\n\t\t// searchresultvars\n\t\t(self -> 'action_statement') = action_statement;\n\t\t(self -> 'found_count') = found_count;\n\t\t(self -> 'shown_first') = shown_first;\n\t\t(self -> 'shown_last') = shown_last;\n\t\t(self -> 'shown_count') = shown_count;\n\t\t(self -> 'field_names') = field_names;\n\t\t(self -> 'records_array') = records_array;\n\t\n\t\t!((self -> 'maxrecords_value') > 0) ? (self -> 'maxrecords_value') = maxrecords_value;\n\t\t!((self -> 'skiprecords_value') > 0) ? (self -> 'skiprecords_value') = skiprecords_value;\n\n\t\tlasso_tagexists('resultset_count') ? (self -> 'resultset_count_map') -> insert((self -> 'inlinename')=resultset_count);\n\t\titerate(field_names, local('field_name'));\n\t\t\t(self -> 'field_names_map') !>> #field_name \n\t\t\t\t? (self -> 'field_names_map') -> insert(#field_name=loop_count);\n\t\t/iterate;\n\t\t\n\t\t(self -> 'error_code') = error_code;\n\t\terror_code && error_msg -> size ? (self -> 'error_msg') = error_msg;\n\t\t\n\n\t\t// handle queries that use LIMIT\n\t\tif: !(self -> 'isfilemaker') && (string_findregexp: action_statement, -find= '\\\\sLIMIT\\\\s', -ignorecase) -> size;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': old found_count, shown_first and shown_last ' + (self -> 'found_count') + ' '+ (self -> 'shown_first') + ' '+ (self -> 'shown_last'));\n\t\t\t(self -> 'found_count') = knop_foundrows;\n\t\t\t// adjust shown_first and shown_last\n\t\t\t(self -> 'shown_first') = ((self -> 'found_count') ? (self -> 'skiprecords_value') + 1 | 0);\n\t\t\t(self -> 'shown_last') = integer(math_min(((self -> 'skiprecords_value') + (self -> 'maxrecords_value')), (self -> 'found_count')));\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': new found_count, shown_first and shown_last ' + (self -> 'found_count') + ' '+ (self -> 'shown_first') + ' '+ (self -> 'shown_last'));\n\t\t/if;\n\n\t\t// capture some variables for single record results\n\t\tif: found_count <= 1  // -update gives found_count 0 but still has one record result\n\t\t\t&& error_code == 0;\n\t\t\tif((self -> 'keyfield') != '' && string(field(self -> 'keyfield')) -> size);\n\t\t\t\t(self -> 'keyvalue')=field(self -> 'keyfield');\n\t\t\telse: (self -> 'keyfield') != '' && (self -> 'keyvalue') == '' && !(self -> 'isfilemaker');\n\t\t\t\t(self -> 'keyvalue')=keyfield_value;\n\t\t\t/if;\n\t\t\tif: lasso_currentaction == 'add' || lasso_currentaction == 'update';\n\t\t\t\t(self -> 'affectedrecord_keyvalue') = (self -> 'keyvalue');\n\t\t\t/if;\n\t\t\tif: (self -> 'lockfield') != ''; \n\t\t\t\t(self -> 'lockvalue')=(field: (self -> 'lockfield'));\n\t\t\t\t(self -> 'lockvalue_encrypted')=(encrypt_blowfish: (field: (self -> 'lockfield')), -seed=(self -> 'lock_seed'));\n\t\t\t/if;\n\t\t/if;\n\t\tif: error_code == 0;\n\t\t\t// populate recorddata with field values from the first found record\n\t\t\titerate: field_names, local: 'field_name';\n\t\t\t\t(self -> 'recorddata') !>> #field_name \n\t\t\t\t\t? (self -> 'recorddata') -> (insert: #field_name  =  (field: #field_name) );\n\t\t\t/iterate;\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + error_msg);\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found_count ' + (self -> 'found_count') + ' ' + (self -> 'keyfield') + ' '+ (field: (self -> 'keyfield')) + ' keyfield_value ' + keyfield_value + ' keyvalue ' + (self -> 'keyvalue') + ' fieldcount ' + (field_name: -count));\n\n\t/define_tag;\n\n/define_type;\n\n\ndefine_type('databaserows',\n\t-namespace='knop_');\n\tlocal('version'='2009-01-08',\n\t\t'description'='Custom type to return all record rows from knop_database. Used as output for knop_database->records. ');\n/*\n\nCHANGE NOTES\n2009-01-08\tJS\t->_unknowntag: Added -index parameter\n2008-11-24\tJS\tCreated the type\n\n\n*/\n\n\tlocal('records_array'=array,\n\t\t'field_names'=array,\n\t\t'field_names_map'=map,\n\t\t'current_record'=integer);\n\t\t\n\tdefine_tag('oncreate', -description='Create a record rows object. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-records_array (array) Array of arrays with field values for all fields for each record of all found records\n\t\t\t-field_names (array) Array with all the field names',\n\t\t-required='records_array',\n\t\t-required='field_names');\n\t\tself -> 'records_array'=#records_array;\n\t\tself -> 'field_names'=#field_names;\n\t\t// store indexes to first occurrence of each field name for faster access\n\t\titerate(#field_names, local('field_name'));\n\t\t\t(self -> 'field_names_map') !>> #field_name \n\t\t\t\t? (self -> 'field_names_map') -> insert(#field_name=loop_count);\n\t\t/iterate;\n\t/define_tag;\n\t\n\tdefine_tag('_unknowntag', -description='Shortcut to field',\n\t\t-optional='index');\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names' >> tag_name);\n\t\t\treturn(self -> field(tag_name(-index=#index)));\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('onconvert', -description='Output the current record as a plain array of field values');\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex >= 1 \n\t\t\t&& #recordindex <= (self -> 'records_array' -> size));\n\t\t\treturn(self -> 'records_array' -> get(#recordindex));\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('size');\n\t\treturn(self -> 'records_array' -> size);\n\t/define_tag;\n\n\tdefine_tag('get', -required='index');\n\t\treturn(knop_databaserow(-record_array=(self -> 'records_array' -> get(#index)), -field_names=(self -> 'field_names')));\n\t/define_tag;\n\n\tdefine_tag('field', -description='Return an individual field value',\n\t\t-required='fieldname',\n\t\t-optional='recordindex',\n\t\t-optional='index');\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names_map' >> #fieldname \n\t\t\t&& #recordindex >= 1 \n\t\t\t&& #recordindex <= (self -> 'records_array') -> size);\n\t\t\t// return specific record\n\t\t\tif(#index==1);\n\t\t\t\t// return first ocurrence of field name through the index map - this is faster\n\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(self -> 'field_names_map' -> find(#fieldname)));\n\t\t\telse;\n\t\t\t\t// return another occurrence of the field - this is slightly slower\n\t\t\t\tlocal('indexmatches'=(self -> 'field_names') -> findposition(#fieldname));\n\t\t\t\tif(#index >= 1 && #index <= #indexmatches -> size);\n\t\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(#indexmatches -> get(#index)));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('summary_header', -description='Returns true if the specified field name has changed since the previous record, or if we are at the first record',\n\t\t-required='fieldname');\n\t\tlocal('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex == 1 // first record\n\t\t\t|| self -> field(#fieldname) != self -> field(#fieldname, -recordindex=(#recordindex - 1)) ); // different than previous record (look behind)\n\t\t\treturn(true);\n\t\telse;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('summary_footer', -description='Returns true if the specified field name will change in the following record, or if we are at the last record',\n\t\t-required='fieldname');\n\t\tlocal('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex == (self -> 'records_array') -> size // last record\n\t\t\t|| self -> field(#fieldname) != self -> field(#fieldname, -recordindex=(#recordindex + 1)) ); // different than next record (look ahead)\n\t\t\treturn(true);\n\t\telse;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\n\tdefine_tag('next', -description='Increments the record pointer, returns true if there are more records to show, false otherwise.');\n\t\tif((self -> 'current_record') < (self -> 'records_array') -> size);\n\t\t\t(self -> 'current_record') += 1;\n\t\t\treturn(true);\n\t\telse;\n\t\t\t// reset record pointer\n\t\t\t(self -> 'current_record') = 0;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n/define_type;\n\n\n\ndefine_type('databaserow',\n\t-namespace='knop_',\n\t//-prototype, // prototype prevents the namespace from unloading without restart\n\t);\n\tlocal: 'version'='2009-01-08',\n\t\t'description'='Custom type to return individual record rows from knop_database. Used as output for knop_database->get. ';\n/*\n\nCHANGE NOTES\n2009-01-08\tJS\t->_unknowntag: Added -index parameter\n2008-11-24\tJS\t->field: Added -index parameter to be able to access any occurrence of the same field name\n2008-05-29\tJS\tRemoved -prototype since it prevents unloading the namespace. It is recommended to turn it on for best performance\n2008-05-27\tJS\tCreated the type\n\n\n*/\n\tlocal('record_array'=array,\n\t\t'field_names'=array);\n\t\t\n\tdefine_tag('oncreate', -description='Create a record row object. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-record_array (array) Array with field values for all fields for the record\n\t\t\t-field_names (array) Array with all the field names, should be same size as -record_array',\n\t\t-required='record_array',\n\t\t-required='field_names');\n\t\tself -> 'record_array'=#record_array;\n\t\tself -> 'field_names'=#field_names;\n\t/define_tag;\n\t\n\tdefine_tag('_unknowntag', -description='Shortcut to field',\n\t\t-optional='index');\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names' >> tag_name);\n\t\t\treturn(self -> field(tag_name, -index=#index));\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('onconvert', -description='Output the record as a plain array of field values');\n\t\treturn(self -> 'record_array');\n\t/define_tag;\n\n\n\tdefine_tag('field', -description='Return an individual field value',\n\t\t-required='fieldname',\n\t\t-optional='index');\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names' >> #fieldname);\n\t\t\t// return any occurrence of the field\n\t\t\tlocal('indexmatches'=(self -> 'field_names') -> findposition(#fieldname));\n\t\t\tif(#index >= 1 && #index <= #indexmatches -> size);\n\t\t\t\treturn((self -> 'record_array') -> get(#indexmatches -> get(#index)));\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\n/define_type;\n?>\n[\n//------------------------------------------------------------------\n//    End knop_database\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_form\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'form', \n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype; \n\n\tlocal: 'version'='2011-02-28',\n\t\t'description'='Custom type to handle forms.';\n\n/*\n\nCHANGE NOTES\n2011-02-28\tJS\t->addfield: Added -template to specify field specific template \n2010-11-22\tSP\t->init: Correction of -lockvalue handling after L9 syntax adjustment\n2010-07-18\tSP\tAdded support for series for -options\n2010-06-10\tJS\t->renderform: avoid adding -upload parameters to post forms since it conflicts with file uploads (found by Steve Piercy)\n2010-04-21\tJS\t->renderhtml:  removed encode_html for label\n2010-03-06\tSP\tChanged default behavior of ->updatefields with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->updatefields with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2009-11-11\tJS\tAdded class and id to optiongroup div that surrounds for checkbox and radio\n2009-11-11\tJS\tCorrected id for checkbox and radio option labels\n2009-10-02\tJS\tAdded id for labels, auto generated from the field's id with _label appended\n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-09-04\tJS\t->renderhtml: corrected typ for autoparams\n2009-07-23\tJS\t->renderform: removed encode_html that somehow has reappeared for label. \n2009-07-10\tSP\tadded -maxlength option for text fields\n2009-06-26\tJS\t->oncreate: added deprecation warning for -action\n2009-06-22\tJS\t->addfield: corrected -options check to look for set instead of series (besides array)\n2009-04-16\tJS\t->loadfileds can now load field values from -params also inside an inline\n2009-03-20\tJS\tAdded  <![CDATA[ ... ]]>  around injected scripts for better xhtml compliance\n2009-01-08\tJS\t->getvalue and _unknowntag: added -index parameter to be able to get value for a specific field instance when there are multiple fields with the same name \n2009-01-08\tJS\t->loadfields: implemented support for multiple fields with the same name when loading field values from form submission where the number of same name fields matches\n2009-01-07\tJS\t->setvalue: added -index parameter to be able to set value for a specific field instance when there are multiple fields with the same name \n2008-12-08\tJS\t->renderform: Removed the onclick handlers for checkbox and radio since Safari now supports clicking the label text as click for the checkbox/radio control. \n2008-12-05\tJS\t->renderform: the fieldset and legend field types will now use id and class on the fieldset tag if specified\n2008-12-03\tJS\t->renderform: fields of type fieldset now uses value as legend (just as field type legend already did) instead of always using an empty legend\n2008-09-24\tJS\t->updatefields: Added protection against backtick sql injection in MySQL object names\n2008-09-17\tJS\t->renderform and ->renderhtml: -from and -to allows negative numbers to count from end of form instead\n2008-09-13\tJS\tAdded ->getlabel to return the display name for a field. \n2008-09-13\tJS\t->addfield and ->validate: Implemented -validate to specify a compound expression to validate the field input. \n2008-09-13\tJS\t->addfield and ->loadfields: Implemented -filter to specify a compound expression to filter the field input. \n2008-09-11\tJS\t->updatefields: fixed exclusion of special field types html, legend and fieldset. \n2008-09-11\tJS\t->renderform: Fixed missing value for password fields\n2008-07-02\tJS\t->renderform: Cleaned up the automatic adding of javascript code so it's not added if not needed. Also moved all scripts to the end of the page. More work with with the javascripts is needed.\n2008-06-03\tJS\t->renderform: corrected missing closing </fieldset>\n2008-05-15\tJS\t->renderform and ->renderhtml: adjusted the behavior for nested fieldsets\n2008-05-13\tJS\tImplemented -legend for ->renderhtml, to make it consistent with the new legend field type\n2008-05-13\tJS\tImplemented special field types html, fieldset and legend. Use -value to display data for these fields. A legend field also creates a fieldset (closes any previously open fieldsets). Use fieldset with -value=false to close a fieldset without opening a new one. \n2008-05-06\tJS\tAdded unknowntag as shortcut to getvalue\n2008-01-30\tJS\tRemoved duplicate endscript entries for if(dirty) {makedirty()};\n2007-12-13\tJS\tCorrected ->addfield: -dbfield so empty dbfields are properly ignored by ->updatefields. \n2007-12-11\tJS\tMoved error_msg to knop_base (special version of error_code stays here) \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-11-13\tJS\tAdded -buttontemplate to be able to specify separate template for buttons, defaults to no <br>, but if template has been specified that will be used instead (for backwards compatibility)\n2007-11-12\tJS\t->process delete now works also when not using record locking (not specifying -user)\n2007-11-01\tJS\t->renderform: added support for -hint for textarea fields.\n2007-09-27\tJS\t->renderhtml: multiple values (array) for radio, checkbox and select are now rendered properly with either \",\" or <br> depending on the presence of -linebreak, and with the display text instead of the actual option value\n2007-09-27\tJS\t->renderform: improved handling of multiple values for checkbox, radio and select\n2007-09-21\tJS\t->addfield: flag parameters now accept false as value\n2007-09-06\tJS\t->oncreate: changed name of -action to -formaction to make it more clear what it is. -action is still supported but deprecated.\n2007-09-06\tJS\t->renderform: Corrected the exception for -session... (duh)\n2007-08-08\tJS\t->renderform: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-12\tJC\tbugfixed -xhtml form rendering when called by quicksearch\n2007-06-11\tJC\tadded handling of xhtml output\n2007-04-19\tJS\t->loadfields: fixed -params that was broken when adding -database\n2007-04-19\tJS\t->renderform: removed invalid wrap=\"soft\" from textarea\n2007-04-12\tJS\t->process: made -user optional (only needed when using record locking)\n2007-04-12\tJS ->loadfields can now take a -database parameter, either as a flag (no value) where the database object connected to the form will be used, or by specifying a database object as value. \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\t->renderform fixed unsavedwarning on page load by moving checkdirty() to afterscript\n2007-03-01\tJS\t->formmode and ->init changed so it preserves the right mode after a failed add\n2007-02-27\tJS\t->renderform: added <div class=\"inputgroup\"> around checkboxes and radios for css formating\n2007-02-26\tJS\t->oncreate: added -actionpath to specify the framework action path for the form instead of manually adding the -action hidden field\n2007-02-24\tJS\tCorrected entersubmitblock behavior by adding onfocus handler on form and starting with submitBlock=false\n2007-02-23\tJS\tRemoved encode_html from form field labels\n2007-02-22\tJS\t->setformat: Added -legend\n2007-02-07\tJS\tAdded ->copyfield to copy a form field to a new name, with the same properties. \n2007-02-07\tJS\t->errors now returns empty array if validate has not been called, instead of performing validation\n2007-02-05\tJS\t->getbutton can now look for also button names that are not one of the built-in ones (for example button_apply)\n2007-02-05\tJS The -keyvalue parameter can be given another name by specifying -keyparamname in oncreate\n2007-02-02\tJS\tAdded ->lockvalue_decrypted\n2007-02-02\tJS\t->addfield: -value is now stored as reference\n2007-02-02\tJS\terror_code now returns an error for when the form contains validation errors\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-02-02\tJS \tAdded real error codes\n2007-01-31\tJS\t->rederform action_params now also exclude \"-\" params that appear in the form action\n2007-01-29\tJS\t->renderform: The first field with input error will get focus when loading page\n2007-01-29\tJS\tAdded -focus to ->addfield to give default field focus when loading page with form\n2007-01-29\tJS\tAdded -disabled to ->addfield, and handling of it in ->renderform\n2007-01-29\tJS\tAdded -noautoparams to ->oncreate to disable the automatic passing of action_params that begin with \"-\"\n2007-01-29\tJS\t->renderform now renders label also for submit, reset to format properly with css\n2007-01-26\tJS\tAdded support for Safari specific <input type=\"search\">\n2007-01-26\tJS\t->renderform action_params that begin with \"-\" now exclude params that exist in the form. Minor corrections to the behavior. \n2007-01-25\tJS\tAdded -nowarning to ->oncreate to disable unsaved warnings for the entire form\n2007-01-25\tJS\tAdded -required to ->oncreate (and a few more from ->setformat)\n2007-01-23\tJS\tAutogenerates id for the form itself\n2007-01-23\tJS\tAdded ->getbutton to return the button that was clicked when submitting a form (cancel, add, save, delete)\n2007-01-23\tJS\tAdded auto conversion of options left hand pair member to string, to make comparsions work reliably. Integer zeros don't compare nicely to strings. \n2007-01-23\tJS\tAdded support for submit-on-enter prevention: specify -entersubmitblock at oncreate\n2007-01-19\tJS\tAddes renderform: -legend to be able to group form fields at render time\n2007-01-19\tJS\tadded support for -optgroup in -options for select. Also works for radio and checkbox. Specify empty -optgroup to close optgroup in select without starting a new, or to add extra linebreak between checkboxes/radio buttons. \n2007-01-19\tJS\tadded -template for oncreate\n2007-01-19\tJS\tadded optional fieldset and legend to form, legend can be specified as -legend at oncreate. if -legend is specified, the form will be wrapped in a fieldset. \n2007-01-19\tJS\tmethod now defaults to post\n2007-01-19\tJS\tCorrected line separator for FileMaker checkboxes and added the same handling also for radio\n2007-01-18\tJS\trenderform: any action_params that begin with \"-\" (except -keyvalue and -lockvalue) are added as form parameters\n2007-01-18\tJS\trenderform: checkboxes and multiselects now show checked and selected properly when loading values from database\n2007-01-18\tJS\tupdatefields: added support for multiple values for one fieldname, like checkboxes (multiple fields in the update pair array, -sql generates comma separated values)\n2007-01-17\tJS\treset button now makes form undirty\n2007-01-17\tJS\taddfield: -confirmmessage can now be specified for any submit or reset button\n2007-01-17\tJS\tadded addfield: -nowarning to avoid unsaved warning when the field is changed\n2007-01-17\tJS\tchanged default class name for unsaved marker from dirty to unsaved\n2007-01-17\tJS\tchanged name of -dirtymarker and -dirtymarkerclass to unsavedmarker and -unsavedmarkerclass for userfriendlyness\n2007-01-17\tJS\tadded setformat: -unsavedwarning to dynamically set the javascript form dirty warning message\n2007-01-17\tJS\trenderform: -field changed to renderform: -name for consistency\n2007-01-16\tJS\trenderform: -field with wrong field name does not output anything, instead of the entire form\n2007-01-16\tJS\tfixed onbeforeunload in javascript form dirty handler\n\nTODO:\n->addfield: Add -format to manipulate the field value before it is displayed by ->renderform and ->renderhtml, much like -filter but only for display and without affecting input. \n->addfield: Add -fieldgroup to be able to group related fields together, useful for ->updatefields to return just fields that belong to a specific db table, or ->renderform as another way to render a form selectively\n->renderform needs a better way to display errors inline together with the fields\nMake _unknowntag also work as shortcut to setvalue if a value is specified\nAdd a new special field type to the form object, let's say \"data\". That field type will not interact with forms and will never be touched by loadfields, but it will populate ->updatefields.\nAdd -> searchfields, which will return a fulltext enabled pair array better suited for searchs than ->updatefields is. -fulltext needs to be specified per field. \nReview and clean up the javascripts inserted automatically by knop_form - partially done\nOption to let textarea grow automatically depending on the amount of text in it.  \nUse http://bassistance.de/jquery-plugins/jquery-plugin-validation/ instead of client side validation\nPossibly add support for the same validation expressions as the jquery validation plugin uses, so server side a nd client side validation can be specified at once. \nAdd -path as parameter for oncreate so the form action can be set with less confusion...  In that case -formaction will be a physical url, while -path would be a framework path. \nFix actionpath reference so it updates properly when altering the value (not possible?)\nShould loadfields load \"-\" params?\nUnsavedwarning made optional, does not seem to work properly now?\nMore flexible error hightlighting\nMove templates to a member tag to be make it easier to subclass (Douglas Burchard)\nAdd \"button\". <button></button>. Subtypes are submit, reset and button. How to specify the subtype? (Douglas Burchard)\nChange ->addfield to ->insert and make ->addfield deprecated\nThere is no src for input type image!\nAdd ->size and ->get so the form object can be iterated\nAdd -skipemtpy to to ->renderhtml\nOption for -> renderhtml to output without html encoding\n->renderhtml should never html encode fields of type html\n\n*/\n\t\n\n\t// instance variables\n\tlocal: 'fields'=array,\n\t\t'template'=string,\t\t\t// html template used to render the html form fields\n\t\t'buttontemplate'=string,\t// html template used to render the html buttons (submit, reset, image)\n\t\t'class'=string,\t\t\t\t// default class for all form fields, can be overridden field by field\n\t\t'errorclass'=string,\t\t// class used to highlight field labels when validation fails\n\t\t'formaction'=null,\n\t\t'method'='post',\n\t\t'fieldset'=false,\t\t\t// html form fieldset\n\t\t'legend'=null,\t\t\t\t// html form legend\n\t\t'name'=null,\n\t\t'id'=null,\n\t\t'raw'=null,\n\t\t'enctype'=null,\t\t\t\t// is automatically set to multipart/formdata if the form contains a file input\n\t\t'actionpath'=null,\n\t\t'noautoparams'=false,\t\t// if true then no parameters that begin with - will be automatically added to the form\n\t\t'fieldsource'=null,\t\t\t// the source of the latest -> loadfields, can be database, form or params\n\t\t'required'=string,\t\t\t// marker used to show fields that are required (html or plain string)\n\t\t'entersubmitblock'=false,\t// if true, a javascript will prevent form submit without clicking on submit button (like pressing enter key)\n\t\t'unsavedmarker'=null,\n\t\t'unsavedmarkerclass'=null,\n\t\t'unsavedwarning'=string,\t// must be specified, or else there is no unsaved warning for the form\n\t\t'database'=null,\n\t\t'keyparamname'=string,\t\t// param name to use instead of the default -keyvalue\n\t\t'formmode'=null,\t\t\t// whether the form is for editing an existing record or a blank for for adding a new record (edit/add)\n\t\t\t\t\t\t\t\t\t// only valid if a database object is specified\n\t\t'formbutton'=null,\t\t\t// the button that was clicked when submitting a form (cancel, add, save, delete)\n\t\t'db_keyvalue'=null,\n\t\t'db_lockvalue'=null,\n\t\t\n\t\t'render_fieldset_open'=false,\t// used when rendering to keep track of if a fieldset from fieldset or legend field types is open so it can be closed properly\n\t\t'render_fieldset2_open'=false,\t// used when rendering to keep track of if a fieldset from renderform or renderhtml legend is open so it can be closed properly\n\t\t'noscript'=false,\t\t\t\t// when set to true, no scripts will be injected by renderform\n\t\t'error_lang'=(knop_lang: -default='en', -fallback);\n\t\n\tlocal: 'errors'=null;\n\n\n\t// config vars\n\tlocal: 'validfieldtypes' = (map: 'text', 'password', 'checkbox', 'radio', 'textarea', 'select', 'file', 'search',\n\t\t\t\t'submit', 'reset', 'image', 'hidden', \n\t\t\t\t'fieldset', 'legend', 'html'), // special types\n\t\t'exceptionfieldtypes' = (map: 'file', 'submit', 'reset', 'image', 'addbutton', 'savebutton', 'deletebutton', 'cancelbutton',\n\t\t\t\t'fieldset', 'legend', 'html'); // special types\n\tlocal: 'validfieldtypes_array'=array;\n\titerate: #validfieldtypes, (local: 'temp');\n\t\t#validfieldtypes_array -> (insert: #temp -> name);\n\t/iterate;\n\tlocal: 'exceptionfieldtypes_array'=array;\n\titerate: #exceptionfieldtypes, (local: 'temp');\n\t\t#exceptionfieldtypes_array -> (insert: #temp -> name);\n\t/iterate;\n\t\n\t// page var to keep track of the number of forms that have been rendered on a page\n\tif: !(var_defined: 'knop_form_renderform_counter');\n\t\tvar: 'knop_form_renderform_counter'=0;\n\t/if;\n\t\n\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-formaction (optional) The action atribute in the form html tag\\n\\\n\t\t\t-action (optional) Deprecated synonym to -formaction\\n\\\n\t\t\t-method (optional) Defaults to post\\n\\\n\t\t\t-name (optional)\\n\\\n\t\t\t-id (optional)\\n\\\n\t\t\t-raw (optional) Anything in this parameter will be put in the opening form tag\\n\\\n\t\t\t-actionpath (optional) Knop action path\\n\\\n\t\t\t-fieldset (optional)\\n\\\n\t\t\t-legend (optional string) legend for the entire form - if specified, a fieldset will also be wrapped around the form\\n\\\n\t\t\t-entersubmitblock (optional)\\n\\\n\t\t\t-noautoparams (optional)\\n\\\n\t\t\t-template (optional string) html template, defaults to #label# #field##required#<br>\\n\\\n\t\t\t-buttontemplate (optional string) html template for buttons, defaults to #field# but uses -template if specified\\n\\\n\t\t\t-required (optional string) character(s) to display for required fields (used for #required#), defaults to *\\n\\\n\t\t\t-class (optional string) css class name that will be used for the form element, default none\\n\\\n\t\t\t-errorclass (optional string) css class name that will be used for the label to highlight input errors, if not defined style=\"color: red\" will be used\\n\\\n\t\t\t-unsavedmarker (optional string) id for html element that should be used to indicate when the form becomes dirty. \\n\\\n\t\t\t-unsavedmarkerclass (optional string) class name to use for the html element. Defaults to \"unsaved\". \\n\\\n\t\t\t-unsavedwarning (optional string)\\n\\\n\t\t\t-keyparamname (optional)\\n\\\n\t\t\t-noscript (optional flag) if specified, don\\'t inject any javascript in the form. This will disable all client side functionality such as hints, focus and unsaved warnings. \\n\\\n\t\t\t-database (optional database) Optional database object that the form object will interact with',\n\t\t// parameters for form html tag attributes\n\t\t-optional='formaction',\n\t\t-optional='action',\n\t\t-optional='method',\n\t\t-optional='name',\n\t\t-optional='id',\n\t\t-optional='raw',\n\n\t\t// knop parameters\n\t\t-optional='actionpath',\n\t\t-optional='fieldset',\n\t\t-optional='legend', \n\t\t-optional='entersubmitblock',\n\t\t-optional='noautoparams',\n\t\t-optional='template', -type='string',\n\t\t-optional='buttontemplate', -type='string',\n\t\t-optional='required', -type='string',\n\t\t-optional='class', -type='string',\n\t\t-optional='errorclass', -type='string',\n\t\t-optional='unsavedmarker', -type='string',\n\t\t-optional='unsavedmarkerclass', -type='string',\n\t\t-optional='unsavedwarning', -type='string',\n\t\t-optional='keyparamname',\n\t\t-optional='noscript',\n\t\t-optional='database', -type='database';\n\t\tlocal: 'timer'=knop_timer; \n\n\n\t\tlocal_defined('method') ? (self -> 'method') = #method;\n\t\tlocal_defined('name') ? (self -> 'name') = #name;\n\t\tlocal_defined('id') ? (self -> 'id') = #id;\n\t\tlocal_defined('raw') ? (self -> 'raw') = #raw;\n\t\tlocal_defined('legend') ? (self -> 'legend') = #legend;\n\t\tlocal_defined('template') ? (self -> 'template') = #template;\n\t\tlocal_defined('buttontemplate') ? (self -> 'buttontemplate') = #buttontemplate;\n\t\tlocal_defined('required') ? (self -> 'required') = #required;\n\t\tlocal_defined('class') ? (self -> 'class') = #class;\n\t\tlocal_defined('errorclass') ? (self -> 'errorclass') = #errorclass;\n\t\tlocal_defined('unsavedmarker') ? (self -> 'unsavedmarker') = #unsavedmarker;\n\t\tlocal_defined('unsavedmarkerclass') ? (self -> 'unsavedmarkerclass') = #unsavedmarkerclass;\n\t\tlocal_defined('unsavedwarning') ? (self -> 'unsavedwarning') = #unsavedwarning;\n\t\tlocal_defined('keyparamname') ? (self -> 'keyparamname') = #keyparamname;\n\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('formaction') ? (self -> 'formaction') = @#formaction;\n\t\tlocal_defined('actionpath') ? (self -> 'actionpath') = @#actionpath;\n\t\tlocal_defined('database') ? (self -> 'database') = @#database;\n\n\t\tif: !(local_defined: 'formaction') && (local_defined: 'action');\n\t\t\t// keep support for old -action insead of -formaction\n\t\t\t(self -> 'debug_trace') -> insert('*** DEPRECATION WARNING *** ' + tag_name + ' -action parameter is deprecated, use -formaction instead ');\n\t\t\t(self -> 'formaction') = @#action;\n\t\t/if;\n\t\t\n\t\t(self -> 'noscript') = (local_defined('noscript') && #noscript != false);\n\n\t\t// default value\n\t\t!(local_defined: 'required') ? (self -> 'required' = '*');\n\t\t!(local_defined: 'keyparamname') ? (self -> 'keyparamname' = '-keyvalue');\n\n\t\t(self -> 'fieldset') = ((local_defined: 'fieldset') && #fieldset != false) || (self -> 'legend') != '';\n\t\t(self -> 'entersubmitblock') = (local_defined: 'entersubmitblock');\n\t\t(self -> 'noautoparams') = (local_defined: 'noautoparams');\n\n\n\t\tif: (self -> 'unsavedmarker') != '' && (self -> 'unsavedmarkerclass') == '';\n\t\t\t// set default unsavedmarkerclass\n\t\t\t(self -> 'unsavedmarkerclass')='unsaved';\n\t\t/if;\n\n\t\tif: (self -> 'unsavedwarning') == '';\n\t\t\t// set default dirtywarning message\n\t\t\t//(self -> 'unsavedwarning')='Det finns ändringar som inte har sparats - vill du fortsätta utan att spara?';\n\t\t/if;\n\t\t\n\t\t// escape quotes for javascript\n\t\t(self -> 'unsavedwarning') -> (replace: '\\'', '\\\\\\'');\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\t/*\n\tdefine_tag: 'onassign', -description='Internal, needed to restore references when ctype is defined as prototype',\n\t\t-required='value'; \n\t\t// recreate references here\n\n\t\titerate: (array: \n\t\t\t'formaction',\n\t\t\t'actionpath',\n\t\t\t'database'), (local: 'param');\n\t\t\t(self -> #param) = @(#value -> #param);\n\t\t/iterate;\n\n\t/define_tag;\n\t*/\n\t\n\tdefine_tag: 'onconvert', -description='Outputs the form data in very basic form, just to see what it contains',\n\t\t-optional='xhtml';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\tlocal: 'output'=string;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t#output += #fieldpair -> name + ' = ' + #fieldpair -> value + '    <br' + #endslash + '>\\n';\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t/define_tag;\n\t\n\tdefine_tag: '_unknowntag', -description='Shortcut to getvalue',\n\t\t-optional='index', -type='integer', -copy;\n\t\t!local_defined('index') ? local('index') = 1;\n\t\tif: (self -> 'fields') >> tag_name; // should be (self -> keys) but this is faster\n\t\t\treturn: (self -> (getvalue: tag_name, -index=#index));\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t\t(self -> '_debug_trace') -> insert(self -> type + '->' + tag_name + ' not known.');\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag: 'addfield', -description='Inserts a form element in the form. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-type (required) Supported types are listed in form -> \\'validfieldtypes_array\\'. Also custom field types addbuton, savebutton or deletebutton are supported (translated to submit buttons with predefined names). \\\n\t\t\tFor the field types html, fieldset and legend use -value to specify the data to display for these fields. A legend field automatically creates a fieldset (closes any previously open fieldsets). Use fieldset with -value=false to close a fieldset without opening a new one. \\n\\\n\t\t\t-name (optional) Required for all input types except addbuton, savebutton, deletebutton, fieldset, legend and html\\n\\\n\t\t\t-id (optional) id for the html object, will be autogenerated if not specified\\n\\\n\t\t\t-dbfield (optional) Corresponding database field name (name is used if dbfield is not specified), or null/emtpy string if ignore this field for database\\n\\\n\t\t\t-value (optional) Initial value for the field\\n\\\n\t\t\t-hint (optional) Optional gray hint text to show in empty text field\\n\\\n            -options (optional) For select, checkbox and radio, must be array, set or series. For select, the array can contain -optgroup=label to create an optiongroup. \\n\\ \n\t\t\t-multiple (optional flag) Used for select\\n\\\n\t\t\t-linebreak (optional flag) Put linebreaks between checkbox and radio values\\n\\\n\t\t\t-default (optional) Default text to display in a popup menu, will be selected (with empty value) if no current value is set. Is followed by an empty option. \\n\\\n\t\t\t-label (optional) Text label for the field\\n\\\n\t\t\t-size (optional) Used for text and select\\n\\\n\t\t\t-maxlength (optional) Used for text\\n\\\n\t\t\t-rows (optional) Used for textarea\\n\\\n\t\t\t-cols (optional) Used for textarea\\n\\\n\t\t\t-focus (optional flag) The first text field with this parameter specified will get focus when page loads\\n\\\n\t\t\t-class (optional)\\n\\\n\t\t\t-disabled (optional flag) The form field will be rendered as disabled\\n\\\n\t\t\t-raw (optional) Raw attributes that will be put in the html tag\\n\\\n\t\t\t-confirmmessage (optional) Message to show in submit/reset confirm dialog (delete button always shows confirm dialog)\\n\\\n\t\t\t-required (optional flag) If specified then the field must not be empty (very basic validation)\\n\\\n\t\t\t-validate (optional) Compound expression to validate the field input. The input can be accessed as params inside the expression which should either return true for valid input or false for invalid, or return 0 for valid input or a non-zero error code or error message string for invalid input. \\n\\\n\t\t\t-filter (optional) Compound expression to filter the input before it is loaded into the form by ->loadfields. The field value can be accessed as params inside the expression which should return the filtered field value. -filter is applied before validation. \\n\\\n\t\t\t-nowarning (optional flag) If specified then changing the field will not trigger an unsaved warning\\n\\\n\t\t\t-after (optional) Numeric index or name of field to insert after\\n\\\n\t\t\t-template (optional) Format string that will override global template or buttontemplate',\n\t\t-required='type',\n\t\t-optional='name',\n\t\t-optional='id',\t\n\t\t-optional='dbfield',\n\t\t-optional='value',\n\t\t-optional='hint',\n\t\t-optional='options',\n\t\t-optional='multiple',\n\t\t-optional='linebreak',\n\t\t-optional='default',\n\t\t-optional='label',\n\t\t-optional='size',\n\t\t-optional='maxlength',\n\t\t-optional='rows',\n\t\t-optional='cols',\n\t\t-optional='focus',\n\t\t-optional='class',\n\t\t-optional='disabled',\n\t\t-optional='raw',\n\t\t-optional='confirmmessage',\n\t\t-optional='required',\n\t\t-optional='validate', -type='tag',\n\t\t-optional='filter', -type='tag',\n\t\t-optional='nowarning',\n\t\t-optional='after',\n\t\t-optional='template';\n\t\t// TODO: add optiontemplate to be able to format individual options\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: '_type'=(local: 'type'), '_name'=(local: 'name'), 'originaltype'=(local: 'type');\n\t\tif: (map: 'addbutton', 'savebutton', 'deletebutton', 'cancelbutton') >> #_type;\n\t\t\t#originaltype = #_type;\n\t\t\t#_name = 'button_' + #_type;\n\t\t\t#_name -> (removetrailing: 'button');\n\t\t\t#_type = 'submit';\n\t\telse: #_type == 'reset' && (local: 'name') == '';\n\t\t\t#_name = 'button_' + #_type;\n\t\telse: (map: 'legend', 'fieldset', 'html') >> #_type && (local: 'name') == '';\n\t\t\t#_name = #_type;\n\t\telse;\n\t\t\tfail_if: (local: 'name') == '', -9956, 'form->addfield missing required parameter -name';\n\t\t/if;\n\t\t\n\t\t\n\t\tfail_if: !((self -> 'validfieldtypes') >> #_type), 7102, self -> error_msg(7202);\n\t\tfail_if: (map: 'select', 'radio', 'checkbox') >> #_type \n\t\t\t&& (local: 'options') -> type != 'array' \n\t\t\t&& (local: 'options') -> type != 'set' \n\t\t\t&& (local: 'options') -> type != 'series', \n\t\t\t-9956, 'Field type ' #_type ' requires -options array, set or series'; \n\t\tlocal: 'index'= (self -> 'fields') -> size + 1;\n\t\t(local_defined: 'after') \t? (#after -> type == 'string' && (self -> 'fields') >> #after \n\t\t\t\t\t\t\t\t\t\t? #index = (integer: ((self -> 'fields') -> (findindex: #after) -> first)) + 1\n\t\t\t\t\t\t\t\t\t\t| #after -> type == 'integer' ? #index= #after + 1);\n\t\tif: #_type == 'file';\n\t\t\t(self -> 'enctype') ='multipart/form-data';\n\t\t\t(self -> 'method') = 'post';\n\t\t/if;\n\t\tlocal: 'field'=(map: \n\t\t\t'required'=(local_defined: 'required') \t\t&& #required != false,\n\t\t\t'multiple'=(local_defined: 'multiple') \t\t&& #multiple != false,\n\t\t\t'linebreak'=(local_defined: 'linebreak') \t&& #linebreak != false,\n\t\t\t'focus'=(local_defined: 'focus') \t\t\t&& #focus != false,\n\t\t\t'nowarning'=(local_defined: 'nowarning') \t&& #nowarning != false,\n\t\t\t'disabled'=(local_defined: 'disabled') \t\t&& #disabled != false\n\t\t\t);\n\t\tif: (self -> 'exceptionfieldtypes') >> #_type;\n\t\t\t// || (map: 'legend', 'fieldset', 'html') >> #_type;\n\t\t\t// never make certain field types required\n\t\t\t#field -> insert('required'=false);\n\t\t/if;\n\n\t\t#field -> (insert: 'type'=#_type);\n\t\t#field -> (insert: 'name'=#_name);\n\n\t\tlocal_defined('id') ? #field -> insert('id' = #id);\n\t\tlocal_defined('hint') ? #field -> insert('hint' = #hint);\n\t\tlocal_defined('default') ? #field -> insert('default' = #default); \n\t\tlocal_defined('label') ? #field -> insert('label' = #label); \n\t\tlocal_defined('size') ? #field -> insert('size' = #size); \n\t\tlocal_defined('maxlength') ? #field -> insert('maxlength' = #maxlength); \n\t\tlocal_defined('rows') ? #field -> insert('rows' = #rows); \n\t\tlocal_defined('cols') ? #field -> insert('cols' = #cols); \n\t\tlocal_defined('class') ? #field -> insert('class' = #class); \n\t\tlocal_defined('raw') ? #field -> insert('raw' = #raw); \n\t\tlocal_defined('confirmmessage') ? #field -> insert('confirmmessage' = #confirmmessage);\n\t\tlocal_defined('originaltype') ? #field -> insert('originaltype' = #originaltype);\n\t\t(local_defined: 'template') ? #field -> (insert: 'template'=#template);\n\n\t\t#field -> (insert: 'dbfield'=( (local_defined: 'dbfield') ? #dbfield | #_name ) );\n\t\t(local_defined: 'value') ? #field -> (insert: 'defaultvalue'=#value);\n\t\t\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('options') ? #field -> insert('options' = @#options);\n\t\tlocal_defined('value') ? #field -> insert('value' = @#value);\n\t\tlocal_defined('validate') ? #field -> insert('validate' = @#validate);\n\t\tlocal_defined('filter') ? #field -> insert('filter' = @#filter);\n\t\t\n\t\t(self -> 'fields') -> (insert: #_name = @#field, #index);\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'copyfield', -description='Copies a form field to a new name.',\n\t\t-required='name',\n\t\t-required='newname';\n\t\tlocal: 'timer'=knop_timer; \n\t\tfail_if: #name == #newname, 7104, self -> error_msg(7104);\n\t\tif: (self -> 'fields') >> #name;\n\t\t\tlocal: 'copyfield'=(self -> 'fields') -> (find: #name) -> first -> value;\n\t\t\t#copyfield -> (insert: 'name' = #newname);\n\t\t\t(self -> 'fields') -> (insert: #newname = #copyfield);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'init', -description='Initiates form to grab keyvalue and set formmode if we have a database connected to the form. \\\n\t\t\tDoes nothing if no database is specified. ',\n\t\t-optional='get',\n\t\t-optional='post',\n\t\t-optional='keyvalue';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// Initiates form to grab keyvalue and set formmode if we have a database connected to the form. \n\t\t// TODO: should we run init if form is not valid? Now we have a condition in lib before running init. \n\t\t// TODO: how can we get the right formmode when showing an add form again after failed validation? Now we have an extra condition in lib for this\n\t\t\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t(self -> 'db_keyvalue') = null;\n\t\t\t(self -> 'db_lockvalue') = null;\n\t\t\tlocal: '_params'=array,\n\t\t\t\t'source'='form',\n\t\t\t\t'field'=map;\n\t\t\t#_params = array;\n\t\t\tif: (local_defined: 'post');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t/if;\n\t\t\tif: (local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t\tif: !(local_defined: 'post') && !(local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: 'Init ');\n\t\t\n\t\t\tif: #_params >> '-lockvalue';\n\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) ) != '' \n\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) ) | null);\n\t\t\t\telse;\n\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) -> first -> value) != '' \n\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) -> first -> value) | null);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing lockvalue from form ' + (self -> 'db_lockvalue'));\n\t\t\telse: (local_defined: 'keyvalue');\n\t\t\t\t(self -> 'db_keyvalue') = #keyvalue;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from parameter ' + (self -> 'db_keyvalue'));\n\t\t\telse: #_params >> (self -> 'keyparamname');\n\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) ) != '' \n\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) ) | null);\n\t\t\t\telse;\n\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) -> first -> value) != '' \n\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) -> first -> value) | null);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from form ' + (self -> 'db_keyvalue'));\n\t\t\t/if;\n\t\t\tif: (self -> 'db_lockvalue') == '' && (self -> 'db_keyvalue') == '';\n\t\t\t\t// we have no keyvalue or lockvalue - this must be an add operation\n\t\t\t\t(self -> 'formmode') = 'add';\n\t\t\t\t// create a keyvalue for the record to add\n\t\t\t\t(self -> 'db_keyvalue') = knop_unique;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': generating keyvalue ' + (self -> 'db_keyvalue'));\n\t\t\telse: (self -> getbutton) == 'add';\n\t\t\t\t(self -> 'formmode') = 'add';\n\t\t\telse: (self -> formmode)=='';\n\t\t\t\t(self -> 'formmode') = 'edit';\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': formmode ' + (self -> formmode));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'loadfields', -description='Overwrites all field values with values from either database, action_params or explicit -params. \\\n\t\t\t\tAuto-detects based on current lasso_currentaction.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t\t-params (optional) Array or map to take field values from instead of database or submit (using dbnames)\\n\\\n\t\t\t\t-get (optional flag) Only getparams will be used\\n\\\n\t\t\t\t-post (optional flag) Only postparams will be used\\n\\\n\t\t\t\t-inlinename (optional) The first record in the result from the specified inline will be used as field values\\n\\ \n\t\t\t\t-database (optional) If a database object is specified, the first record from the latest search result of the database object will be used. \\\n\t\t\t\t\tIf -database is specified as flag (no value) and the form object has a database object attached to it, that database object will be used.',\n\t\t-optional='params',\n\t\t-optional='post',\n\t\t-optional='get',\n\t\t-optional='inlinename',\n\t\t-optional='database';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: '_params'=array,\n\t\t\t'source'='form',\n\t\t\t'field'=map;\n\t\t(self -> 'fieldsource') = null;\n\t\tif: (local_defined: 'params');\n\t\t\t(self -> 'fieldsource') = 'params';\n\t\t\tlocal: 'source'='params';\n\t\t\t#_params = #params;\n\t\telse: (local_defined: 'database') && !(local_defined: 'inlinename');\n\t\t\tif: #database -> type == 'database';\n\t\t\t\tlocal: 'inlinename'=#database -> inlinename;\n\t\t\telse: self -> 'database' -> type == 'database';\n\t\t\t\tlocal: 'inlinename'=self -> 'database' -> inlinename;\n\t\t\t/if;\n\t\t/if;\n\t\t\t\n\t\tif: (local_defined: 'inlinename');\n\t\t\t(self -> 'fieldsource') = 'database';\n\t\t\tlocal: 'source'='params';\n\t\t\t#_params=map;\n\t\t\trecords: -inlinename=#inlinename;\n\t\t\t\tloop: (field_name: -count);\n\t\t\t\t\t#_params -> (insert: (field_name: loop_count)  =  (field: (field_name: loop_count)) );\n\t\t\t\t/loop;\n\t\t\t\tloop_abort;\n\t\t\t/records;\n\t\telse: (self -> 'fieldsource') == null && lasso_currentaction != 'nothing';\n\t\t\t(self -> 'fieldsource') = 'database';\n\t\t\tlocal: 'source'='database';\n\t\telse: (self -> 'fieldsource') == null;\n\t\t\t(self -> 'fieldsource') = 'form';\n\t\t\t#_params = array;\n\t\t\tif: (local_defined: 'post');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t/if;\n\t\t\tif: (local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t\tif: !(local_defined: 'post') && !(local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': loading field values from ' + (self -> 'fieldsource'));\n\t\tlocal('fieldnames_done'=map, 'fields_samename'=array, 'params_fieldname'=array);\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t//#field = @(#fieldpair -> value);\n\t\t\tif: (self -> 'exceptionfieldtypes') !>> #fieldpair -> value -> (find: 'type') // do not load data for excluded form fields (maybe it should do that in some cases???)\n\t\t\t\t// && (map: 'legend', 'fieldset', 'html') !>> #fieldpair -> value -> (find: 'type')\n\t\t\t\t&& !(#fieldpair -> name -> (beginswith: '-')); // exclude field names that begin with \"-\"\n\t\t\t\tif(#fieldnames_done !>> #fieldpair -> name); // check if we are already done with this field name (for multiple fields with the same name)\n\t\t\t\t\t// find all fields with the same name\n\t\t\t\t\t#fields_samename = @((self -> 'fields') -> find(#fieldpair -> name));\n\t\t\t\t\t#params_fieldname = @(#_params -> find(#fieldpair -> name));\n\t\t\t\t\tif: #source == 'database' && found_count > 0;\n\t\t\t\t\t\t// load field values from database\n\t\t\t\t\t\tif: (#fieldpair -> value -> find: 'dbfield') != '';\n\t\t\t\t\t\t\t// first remove value to break reference\n\t\t\t\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=(field: (#fieldpair -> value -> find: 'dbfield')) );\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: #source == 'params';\n\t\t\t\t\t\t// load field values from explicit -params using dbfield names\n\t\t\t\t\t\tif: #_params >> (#fieldpair -> value -> find: 'dbfield') && (#fieldpair -> value -> find: 'dbfield') != '';\n\t\t\t\t\t\t\t// first remove value to break reference\n\t\t\t\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t\t\t\tif(#_params -> isa('map'));\n\t\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=(#_params -> (find: (#fieldpair -> value -> find: 'dbfield') ) ) );\n\t\t\t\t\t\t\t/*else: #_params -> (find: (#fieldpair -> value -> find: 'dbfield') ) -> size > 1;\n\t\t\t\t\t\t\t\t// multiple field values\n\t\t\t\t\t\t\t\tlocal: 'valuearray'=array;\n\t\t\t\t\t\t\t\titerate: #_params -> (find:  (#fieldpair -> value -> find: 'dbfield')), (local: 'parampair');\n\t\t\t\t\t\t\t\t\t#parampair -> value != '' ? #valuearray -> (insert: #parampair -> value);\n\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=#valuearray);*/\n\t\t\t\t\t\t\telse(#_params -> isa('array'));\n\t\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=(#_params -> (find: (#fieldpair -> value -> find: 'dbfield')) -> first -> value) );\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: #source == 'form';\n\t\t\t\t\t\t// load field values from form submission\n\t\t\t\t\t\titerate(#fields_samename, local('fieldpair_samename'));\n\t\t\t\t\t\t\t// first remove value to break reference\n\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (remove: 'value');\n\t\t\t\t\t\t\tif(#params_fieldname -> size == #fields_samename -> size);\n\t\t\t\t\t\t\t\t// the number of submitted fields match the number of fields in the form\n\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'=(#params_fieldname -> get(loop_count) -> value) );\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\tif: #params_fieldname -> size > 1;\n\t\t\t\t\t\t\t\t\t// multiple field values\n\t\t\t\t\t\t\t\t\tlocal: 'valuearray'=array;\n\t\t\t\t\t\t\t\t\titerate: #_params -> (find:  (#fieldpair -> name)), (local: 'parampair');\n\t\t\t\t\t\t\t\t\t\t#parampair -> value != '' ? #valuearray -> (insert: #parampair -> value);\n\t\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'=#valuearray);\n\t\t\t\t\t\t\t\telse: #_params >> (#fieldpair -> name);\n\t\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'=(#_params -> (find: #fieldpair_samename -> name) -> first -> value) );\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'='');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#fieldnames_done -> insert(#fieldpair -> name);\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t// apply filtering of field value (do this for all instances of the same field name, so outside of the #fieldnames_done check\n\t\t\t\tif(#fieldpair -> value -> find('filter') -> isa('tag'));\n\t\t\t\t\t(#fieldpair -> value) -> insert('value'= (#fieldpair -> value -> find('filter')) -> run(-params=(#fieldpair -> value -> find('value'))));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\t\t\n\t\t// capture keyvalue or lockvalue if we have a database object connected to the form\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t//(self -> 'db_keyvalue') = null;\n\t\t\t//(self -> 'db_lockvalue') = null;\n\t\t\tif: (self -> 'fieldsource') == 'database';\n\t\t\t\tif: (self -> 'database') -> lockfield != '' && (self -> 'database') -> lockvalue != '';\n\t\t\t\t\t(self -> 'db_lockvalue') = (self -> 'database') -> lockvalue_encrypted;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing lockvalue from database ' + (self -> 'db_lockvalue'));\n\t\t\t\telse: (self -> 'database') -> keyfield != '' && (self -> 'database') -> keyvalue != '';\n\t\t\t\t\t(self -> 'db_keyvalue') = (self -> 'database') -> keyvalue;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from database ' + (self -> 'db_keyvalue'));\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\tif: #_params >> '-lockvalue';\n\t\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) ) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) ) | null);\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) -> first -> value) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) -> first -> value) | null);\n\t\t\t\t\t/if;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing lockvalue from form ' + (self -> 'db_lockvalue'));\n\t\t\t\telse: #_params >> (self -> 'keyparamname');\n\t\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) ) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) ) | null);\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) -> first -> value) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) -> first -> value) | null);\n\t\t\t\t\t/if;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from form ' + (self -> 'db_keyvalue'));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: (self -> 'db_lockvalue') == '' && (self -> 'db_keyvalue') == '';\n\t\t\t\t// we have no keyvalue or lockvalue - this must be an add operation\n\t\t\t\t(self -> 'formmode') = 'add';\n\t\t\t\t// create a keyvalue for the record to add\n\t\t\t\t(self -> 'db_keyvalue') = knop_unique;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': generating keyvalue ' + (self -> 'db_keyvalue'));\n\t\t\telse: (self -> formmode) == '';\n\t\t\t\t(self -> 'formmode') = 'edit';\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': formmode ' + (self -> formmode));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'clearfields', -description='Emtpies all form field values';\n\t\tlocal: 'timer'=knop_timer; \n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\tif: (self -> 'exceptionfieldtypes') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t// && (map: 'legend', 'fieldset', 'html') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t// first remove value to break reference\n\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t(#fieldpair -> value) -> (insert: 'value'='');\n\t\t\t/if;\n\t\t/iterate;\t\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t(self -> 'db_keyvalue') = null;\n\t\t\t(self -> 'db_lockvalue') = null;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'resetfields', -description='Resets all form field values to their initial values';\n\t\tlocal: 'timer'=knop_timer; \n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\tif: (self -> 'exceptionfieldtypes') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t//&& (map: 'legend', 'fieldset', 'html') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t// first remove value to break reference\n\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=#fieldpair -> value -> (find: 'defaultvalue'));\n\t\t\t/if;\n\t\t/iterate;\t\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t(self -> 'db_keyvalue') = null;\n\t\t\t(self -> 'db_lockvalue') = null;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'validate', -description='Performs validation and fills a transient array with field names that have input errors. \\\n\t\t\t\t form -> loadfields must be called first.';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\t// Performs validation and fills a transient array with field names that have input errors.\n\t\t// Must call -> loadfields first\n\t\tif: (self -> 'errors') == null;\n\t\t\t// initiate the errors array so we know validate has been performed\n\t\t\t(self -> 'errors') = array;\n\t\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t\tif: !( (self -> 'exceptionfieldtypes') >> #fieldpair -> value -> (find: 'type') );\n\t\t\t\t\tif: (#fieldpair -> value -> (find: 'required') ) \n\t\t\t\t\t\t&& (#fieldpair -> value -> (find: 'value') ) == '';\n\t\t\t\t\t\t(self -> 'errors') -> (insert: (#fieldpair -> value -> (find: 'name') ));\n\t\t\t\t\t/if;\n\t\t\t\t\tif(#fieldpair -> value -> find('validate') -> isa('tag'));\n\t\t\t\t\t\t// perform validation expression on the field value\n\t\t\t\t\t\tlocal('result'=(#fieldpair -> value -> find('validate')) -> run(-params=#fieldpair -> value -> find('value')));\n\t\t\t\t\t\tif(#result === true || #result === 0);\n\t\t\t\t\t\t\t// validation was ok\n\t\t\t\t\t\telse(#result != 0 || #result -> size);\n\t\t\t\t\t\t\t// validation result was an error code or message\n\t\t\t\t\t\t\t(self -> 'errors') -> insert(#fieldpair -> value -> find('name') = #result);\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t(self -> 'errors') -> insert(#fieldpair -> value -> find('name'));\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': form is valid ' + ((self -> 'errors') -> size == 0));\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'isvalid', -description='Returns the result of form -> validate (true/false) without performing the validation again (unless it hasn\\'t been performed already)';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// Returns the result of -> validate (true/false) without performing the validation again (unless it is needed)\n\t\t(self -> 'errors') == null ? self -> validate;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': form is valid ' + ((self -> 'errors') -> size == 0));\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: (self -> 'errors') -> size == 0;\n\t/define_tag;\n\n\n\tdefine_tag: 'adderror', -description='adds the name for a field that has validation error, used for custom field validation. \\\n\t\t\t\tcalls form -> validate first if needed',\n\t\t-required='fieldname';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// adds a field that has error\n\t\t// calls ->validate first if needed, to make sure self -> 'errors' is an array\n\t\t(self -> 'errors') == null ? self -> validate;\n\t\t(self -> 'errors') -> (insert: #fieldname);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'errors', -description='Returns an array with fields that have input errors, or empty array if no errors or form has not been validated';\n\t\t// returns an array with fields that have input errors, or emtpy array if no errors or form has not been validated\n\t\tif: (self -> 'errors') == null;\n\t\t\treturn: array;\n\t\telse;\n\t\t\treturn: (self -> 'errors');\n\t\t/if;\n\t/define_tag;\n\n\n\n\tdefine_tag: 'updatefields', -description='Returns a pair array with fieldname=value, or optionally SQL string to be used in an update inline.\\\n\t\tform -> loadfields must be called first.\\n\\\n\t\tParameters:\\n\\\n\t\t-sql (optional)\\n\\\n\t\t-removedotbackticks (optional flag) Use with -sql for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.',\n\t\t-optional='sql',\n\t\t-optional='removedotbackticks';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// Returns a pair array with fieldname=value, or optionally SQL string to be used in an update inline. Optionally use -removedotbackticks with -sql for backward compatibility with fields that contain periods.\n\t\t// Must call ->loadfields first.\n\t\tlocal: 'output'=array,\n\t\t\t'_sql'=(local_defined: 'sql'),\n\t\t\t'_removedotbackticks'=(local_defined: 'removedotbackticks'),\n\t\t\t'fieldvalue'=null, 'onevalue'=null;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\tif: !( (self -> 'exceptionfieldtypes') >> #fieldpair -> value -> (find: 'type') )\n\t\t\t\t&& !(#fieldpair -> value -> (find: 'name') -> (beginswith: '-'))\n\t\t\t\t&& (#fieldpair -> value -> (find: 'dbfield')) != '';\n\t\t\t\t// don't use submit etc and exclude fields whose name begins with -\n\t\t\t\t#fieldvalue = (#fieldpair -> value -> (find: 'value') );\n\t\t\t\tif: #fieldvalue -> type != 'array';\n\t\t\t\t\t// to support multiple values for one fieldname, like checkboxes\n\t\t\t\t\t#fieldvalue = array: #fieldvalue;\n\t\t\t\t/if;\n\t\t\t\tif: #_sql;\n\t\t\t\t\tif(#_removedotbackticks);\n\t\t\t\t\t\t#output -> (insert:  '`' + (encode_sql(knop_stripbackticks(#fieldpair -> value -> find('dbfield'))) ) + '`' \n\t\t\t\t\t\t\t+ '=\"' + (encode_sql: (#fieldvalue -> (join: ',')) ) + '\"');\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output -> (insert:  '`' + (encode_sql(string_replace(knop_stripbackticks(#fieldpair -> value -> find('dbfield')), -find='.', -replace='`.`')) ) + '`' \n\t\t\t\t\t\t+ '=\"' + (encode_sql: (#fieldvalue -> (join: ',')) ) + '\"');\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\titerate: #fieldvalue, #onevalue;\n\t\t\t\t\t\t#output -> (insert:  (#fieldpair -> value -> (find: 'dbfield') ) \n\t\t\t\t\t\t\t= #onevalue );\n\t\t\t\t\t/iterate;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: #_sql;\n\n\t\t\t#output = '(' + #output -> (join: ',') + ')';\n\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t\t\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'getbutton', -description='Returns what button was clicked on the form on the previous page. Assumes that submit buttons are named button_add etc. \\\n\t\t\t\tReturns add, update, delete, cancel or any custom submit button name that begins with button_.';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (self -> 'formbutton') != '';\n\t\t\t// we have already found out once what button was clicked\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': cached ' + (self -> 'formbutton'));\n\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\treturn: (self -> 'formbutton');\n\t\t/if;\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t// look for submit buttons, the least destructive first\n\t\titerate: (array: 'cancel', 'save', 'add', 'delete'), (local: 'buttonname');\n\t\t\tif: #clientparams >> 'button_' + #buttonname \n\t\t\t\t|| #clientparams >> 'button_' + #buttonname + '.x'\n\t\t\t\t|| #clientparams >> 'button_' + #buttonname + '.y';\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': built-in button name ' + #buttonname);\n\t\t\t\t(self -> 'formbutton') = #buttonname;\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\treturn: #buttonname;\n\t\t\t/if;\n\t\t/iterate;\n\t\t// no button found yet - look for custom button names\n\t\titerate: #clientparams, #buttonname;\n\t\t\t#buttonname -> type == 'pair' ? #buttonname =  #buttonname -> name;\n\t\t\tif: #buttonname -> (beginswith: 'button_');\n\t\t\t\t#buttonname -> (removeleading: 'button_') & (removetrailing: '.x') & (removetrailing: '.y');\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': custom button name ' + #buttonname);\n\t\t\t\t(self -> 'formbutton') = #buttonname;\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\treturn: #buttonname;\n\t\t\t/if;\n\t\t/iterate;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': No button found');\n\t/define_tag;\n\t\n\tdefine_tag: 'process', -description='Automatically handles a form submission and handles add, update, or delete. \\\n\t\t\t\tRequires that a database object is specified for the form',\n\t\t-optional='user',\n\t\t-optional='lock',\n\t\t-optional='keyvalue';\n\t\tlocal: 'timer'=knop_timer; \n\t\tfail_if: (self -> 'database') -> type != 'database', 7103, self -> error_msg(7103);\n\n\t\t(self -> 'error_code') = 0;\n\t\t(self -> 'error_msg') = string;\n\t\t\n\t\tif: self -> getbutton == 'cancel';\n\t\t\t// do nothing at all\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': cancelling ');\n\t\t\t\n\t\telse: self -> getbutton == 'save';\n\t\t\tself -> loadfields;\n\t\t\tif: self -> isvalid;\n\t\t\t\tif: (local_defined: 'user') && (self -> lockvalue) != '';\n\t\t\t\t\t(self -> database) -> (saverecord: (self -> updatefields), -lockvalue=(self -> lockvalue), -keyvalue=(self -> keyvalue), -user=#user);\n\t\t\t\telse;\n\t\t\t\t\t(self -> database) -> (saverecord: (self -> updatefields), -keyvalue=(self -> keyvalue));\n\t\t\t\t/if;\n\t\t\t\tif: self -> database -> error_code != 0;\n\t\t\t\t\t(self -> 'error_code') = self -> database -> error_code;\n\t\t\t\t\t(self -> 'error_msg') = 'Process: update record error ' + (self -> database -> error_msg);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': updating record ' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = 7101; // Process: update record did not pass form validation\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': update record did not pass form validation');\n\t\t\t/if;\n\t\t\n\t\telse: self -> getbutton == 'add';\n\t\t\tself -> loadfields;\n\t\t\tif: self -> isvalid;\n\t\t\t\t(self -> database) -> (addrecord: (self -> updatefields), -keyvalue=(self -> keyvalue));\n\t\t\t\tif: self -> database -> error_code != 0;\n\t\t\t\t\t(self -> 'error_code') = self -> database -> error_code;\n\t\t\t\t\t(self -> 'error_msg') = 'Process: add record error ' + (self -> database -> error_msg);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': adding record ' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = 7101; // Process: add record did not pass form validation\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': add record did not pass form validation');\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': reverting form mode to add');\n\t\t\t/if;\n\n\t\telse: self -> getbutton == 'delete';\n\t\t\tself -> loadfields;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': will delete record with keyvalue ' + (self -> keyvalue) + ' lockvalue ' + (self -> lockvalue));\n\t\t\tif: (local_defined: 'user') && (self -> lockvalue) != '';\n\t\t\t\t(self -> database) -> (deleterecord: -lockvalue=(self -> lockvalue), -keyvalue=(self -> keyvalue), -user=#user);\n\t\t\telse;\n\t\t\t\t(self -> database) -> (deleterecord: -keyvalue=(self -> keyvalue));\n\t\t\t/if;\n\t\t\tif: self -> database -> error_code == 0;\n\t\t\t\tself -> resetfields;\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = self -> database -> error_code;\n\t\t\t\t(self -> 'error_msg') = 'Process: delete record error ' + (self -> database -> error_msg);\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': deleting record ' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\telse: false;\n\t\t\t// do not go here, database record should be loaded with a separate call\n\t\t\tif: (local_defined: 'lock');\n\t\t\t\tself -> database ->(getrecord: (local: 'keyvalue'), -lock, -user=#user);\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': loading record using lock' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\telse;\n\t\t\t\tself -> database ->(getrecord: (local: 'keyvalue'), -user=#user);\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': loading record' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\t/if;\n\t\t\tself -> (loadfields: -inlinename=(self -> database -> inlinename));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'setformat', -description='Defines a html template for the form. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-template (optional string) html template, defaults to #label# #field##required#<br>\\n\\\n\t\t\t-buttontemplate (optional string) html template for buttons, defaults to #field#\\n\\\n\t\t\t-required (optional string) character(s) to display for required fields (used for #required#), defaults to *\\n\\\n\t\t\t-legend (optional string) legend for the entire form - if specified, a fieldset will also be wrapped around the form\\n\\\n\t\t\t-class (optional string) css class name that will be used for the form element, default none\\n\\\n\t\t\t-errorclass (optional string) css class name that will be used for the label to highlight input errors, if not defined style=\"color: red\" will be used\\n\\\n\t\t\t-unsavedmarker (optional string) \\n\\\n\t\t\t-unsavedmarkerclass (optional string) \\n\\\n\t\t\t-unsavedwarning (optional string)',\n\t\t-optional='template', -type='string',\n\t\t-optional='buttontemplate', -type='string',\n\t\t-optional='required', -type='string',\n\t\t-optional='legend', -type='string',\n\t\t-optional='class', -type='string',\n\t\t-optional='errorclass', -type='string',\n\t\t-optional='unsavedmarker', -type='string',\n\t\t-optional='unsavedmarkerclass', -type='string',\n\t\t-optional='unsavedwarning', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal_defined('template') ? (self -> 'template') = #template;\n\t\tlocal_defined('buttontemplate') ? (self -> 'buttontemplate') = #buttontemplate;\n\t\tlocal_defined('required') ? (self -> 'required') = #required;\n\t\tlocal_defined('legend') ? (self -> 'legend') = #legend;\n\t\tlocal_defined('class') ? (self -> 'class') = #class;\n\t\tlocal_defined('errorclass') ? (self -> 'errorclass') = #errorclass;\n\t\tlocal_defined('unsavedmarker') ? (self -> 'unsavedmarker') = #unsavedmarker;\n\t\tlocal_defined('unsavedmarkerclass') ? (self -> 'unsavedmarkerclass') = #unsavedmarkerclass;\n\t\tlocal_defined('unsavedwarning') ? (self -> 'unsavedwarning') = #unsavedwarning;\n\n\t\tif: local_defined: 'unsavedwarning';\n\t\t\t// escape quotes for javascript\n\t\t\t(self -> 'unsavedwarning') -> (replace: '\\'', '\\\\\\'');\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'renderform', -description='Outputs HTML for the form fields, a specific field, a range of fields or all fields of a specific type. \\\n\t\t\tAlso inserts all needed javascripts into the page. \\\n\t\t\tUse form -> setformat first to specify the html format, otherwise default format #label# #field##required#<br> is used. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-name (optional) Render only the specified field\\n\\\n\t\t\t-from (optional) Render form fields from the specified number index or field name. Negative number count from the last field.\\n\\\n\t\t\t-to (optional) Render form fields to the specified number index or field name. Negative number count from the last field.\\n\\\n\t\t\t-type (optional) Only render fields of this or these types (string or array)\\n\\\n\t\t\t-excludetype (optional) Render fields except of this or these types (string or array)\\n\\\n\t\t\t-legend (optional) Groups the rendered fields in a fieldset and outputs a legend for the fieldset\\n\\\n\t\t\t-start (optional) Only render the starting <form> tag\\n\\\n\t\t\t-end (optional) Only render the ending </form> tag\\n\\\n\t\t\t-xhtml (optional flag) XHTML valid output',\n\t\t-optional='name', -copy, \t// field name\n\t\t-optional='from', -copy, \t// number index or field name\n\t\t-optional='to', -copy, \t\t// number index or field name\n\t\t-optional='type', -copy,\t// only output fields of this or these types (string or array)\n\t\t-optional='excludetype', -copy,\t// output fields except of this or these types (string or array)\n\t\t-optional='legend',\t\t\t// groups the rendered fields in a fieldset and outputs a legend for the fieldset\n\t\t-optional='start',\t\t\t// only output the starting <form> tag\n\t\t-optional='end',\t\t\t// only output the ending </form> tag\n\t\t-optional='xhtml';\t\t\t// boolean, if set to true adjust output for XHTML\n\t\tlocal: 'timer'=knop_timer; \n\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name, -time, -type=self->type);/handle;\n\t\t\n\t\t// Outputs HTML for the form fields\n\t\t\n\t\t/*\n\t\t\tTODO: \n\t\t\tHandling of multiple fields with the same name\n\t\t*/\n\t\tlocal: 'output'=string, \n\t\t\t'onefield'=map, \n\t\t\t'renderfield'=string, \n\t\t\t'renderfield_base'=string, \n\t\t\t'renderrow'=string,\n\t\t\t'formid'=null,\n\t\t\t'usehint'=array,\n\t\t\t'nowarning'=false,\n\t\t\t'fieldtype',\n\t\t\t'fieldvalue'=string,\n\t\t\t'fieldvalue_array'=array,\n\t\t\t'options'=array,\n\t\t\t'focusfield';\n\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t#clientparams -> (removeall: (self -> 'keyparamname'));\n\t\t#clientparams -> (removeall: '-lockvalue');\n\t\t#clientparams -> (removeall: '-action');\n\t\t#clientparams -> (removeall: '-xhtml');\n\n\t\t// local var that adjust tag endings if rendered for XHTML\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\t// page var to keep track of the number of forms that has been rendered on a page\n\t\tif: !(var_defined: 'knop_form_renderform_counter');\n\t\t\tvar: 'knop_form_renderform_counter'=0;\n\t\t/if;\n\t\t\n\t\t$knop_form_renderform_counter += 1;\n\n\t\tif: (self -> 'id') != '';\n\t\t\t#formid = (self -> 'id');\n\t\telse: (self -> 'name') != '';\n\t\t\t#formid = (self -> 'name');\n\t\telse;\n\t\t\t#formid = 'form' + $knop_form_renderform_counter;\n\t\t/if;\n\t\t\n\t\t\n\t\tlocal: 'renderformStartTag'=false, 'renderformEndTag'=false;\n\t\t// remove params that should not stop formstarttag and formendtag from rendering\n\t\tparams -> type == 'array' ? params -> (removeall: '-legend') & (removeall: '-xhtml');\n\t\tif: (self -> 'formaction') != null \n\t\t\t&& (params -> size == 0 || (local_defined: 'start') );\n\t\t\t#renderformStartTag=true;\n\t\t/if;\n\t\tif: (self -> 'formaction') != null \n\t\t\t&& (params -> size == 0 || (local_defined: 'end') );\n\t\t\t#renderformEndTag=true;\n\t\t/if;\n\t\tif: #renderformStartTag;\n\t\t\t// render opening form tag\n\n\t\t\t#output +='<form';\n\t\t\t(self -> 'debug_trace') -> insert(tag_name + ': formaction = ' + (self -> 'formaction'));\n\t\t\tif: (self -> 'formaction') != null;\n\t\t\t\t#output += ' action=\"' + (self -> 'formaction');\n\t\t\t\tif: (self -> 'method') == 'post' && !(self -> 'noautoparams');\n\t\t\t\t\tlocal: 'actionparams'=array;\n\t\t\t\t\titerate: #clientparams, (local: 'clientparam');\n\t\t\t\t\t\tif: #clientparam -> type == 'pair';\n\t\t\t\t\t\t\tif: #clientparam -> name -> (beginswith: '-') \n\t\t\t\t\t\t\t    && !(#clientparam -> name -> (beginswith: '-upload.'))\n\t\t\t\t\t\t\t    && !(#clientparam -> name -> (beginswith: '-upload2.'))\n\t\t\t\t\t\t\t\t&& #clientparam -> name != '-session'\n\t\t\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam -> name\n\t\t\t\t\t\t\t\t// check if param name appears in form action\n\t\t\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like \".\"\n\t\t\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t\t\t+ ((#clientparam -> name) -> (split: '') -> (join: '][')) \n\t\t\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t\t\t#actionparams -> (insert: (#clientparam -> name) + '=' + (encode_url: (#clientparam -> value)) );\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\telse: #clientparam -> type == 'string' \n\t\t\t\t\t\t\t&& #clientparam -> (beginswith: '-') \n\t\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam\n\t\t\t\t\t\t\t// check if param appears in form action\n\t\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like \".\"\n\t\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t\t+ (#clientparam -> (split: '') -> (join: '][')) \n\t\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t\t#actionparams -> (insert: #clientparam );\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/iterate;\n\t\t\t\t\tif: #actionparams -> size;\n\t\t\t\t\t\t#output += ((self -> 'formaction') >> '?' ? '&amp;' | '?' ) + #actionparams -> (join: '&amp;');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t#output += '\"';\n\t\t\t/if;\n\t\t\t(self -> 'method') != null\t\t? #output += ' method=\"' + (self -> 'method') + '\"';\n\t\t\t(self -> 'name') != null\t\t? #output += ' name=\"' + (self -> 'name') + '\"';\n\t\t\t#output += ' id=\"' + #formid + '\"';\n\t\t\t(self -> 'class') != null\t\t? #output += ' class=\"' + (self -> 'class') + '\"';\n\t\t\t(self -> 'enctype') != ''\t\t? #output += ' enctype=\"' + (self -> 'enctype') + '\"';\n\t\t\t(self -> 'raw') != null\t\t\t? #output += ' ' + (self -> 'raw');\n\t\t\t!(self -> 'noscript') ? #output += ' onsubmit=\"return validateform(this)\"';\n\t\t\t(self -> 'entersubmitblock') && !(self -> 'noscript')\t? #output += ' onkeydown=\"return submitOk(event);\" onfocus=\"submitBlock=true; return true;\" onblur=\"submitBlock=false; return true;\"';\n\t\t\t#output += '>\\n';\n\n\n\t\t\tif: (self -> 'actionpath') != '' \n\t\t\t\t&& !(self -> 'noautoparams') \n\t\t\t\t&& (self -> 'fields') !>> '-action';\n\t\t\t\t// auto-add -action unless there is already an -action field in the form\n\t\t\t\t#output += '<input type=\"hidden\" name=\"-action\" value=\"' + (encode_html: (self -> 'actionpath')) + '\"' + #endslash + '>\\n';\n\t\t\t/if;\n\t\t\tif: (self -> 'fieldset');\n\t\t\t\t#output += '<fieldset>\\n';\n\t\t\t\t#output +='<legend>' + (self -> 'legend') + '</legend>\\n';\n\t\t\t/if;\n\t\t\tif: (self -> 'method') == 'get' && !(self -> 'noautoparams');\n\t\t\t\titerate: #clientparams, (local: 'clientparam');\n\t\t\t\t\tif: #clientparam -> type == 'pair';\n\t\t\t\t\t\tif: #clientparam -> name -> (beginswith: '-')\n\t\t\t\t\t\t\t&& #clientparam -> name != '-session'\n\t\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam -> name\n\t\t\t\t\t\t\t// check if param name appears in form action\n\t\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like .\n\t\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t\t+ ((#clientparam -> name) -> (split: '') -> (join: '][')) \n\t\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t\t#output += '<input type=\"hidden\" name=\"' + (#clientparam -> name) + '\" value=\"' + (encode_html: (#clientparam -> value)) + '\"' + #endslash + '>\\n';\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: #clientparam -> type == 'string' \n\t\t\t\t\t\t&& #clientparam -> (beginswith: '-')\n\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam\n\t\t\t\t\t\t// check if param appears in form action\n\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like .\n\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t+ (#clientparam -> (split: '') -> (join: ']['))\n\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t#output += '<input type=\"hidden\" name=\"' + #clientparam + '\"' + #endslash + '>\\n';\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t\tif: (self -> 'database') -> lockfield != '' && (self -> 'db_lockvalue') != '';\n\t\t\t\t\t#output += '<input type=\"hidden\" name=\"-lockvalue\" value=\"' + (encode_html: (self -> 'db_lockvalue')) + '\"' + #endslash + '>\\n';\n\t\t\t\telse: (self -> 'database') -> keyfield != '' && (self -> 'db_keyvalue') != '';\n\t\t\t\t\t#output += '<input type=\"hidden\" name=\"' + (self -> 'keyparamname') + '\" value=\"' + (encode_html: (self -> 'db_keyvalue')) + '\"' + #endslash + '>\\n';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\t\n\t\t\n\t\tif: !(local_defined: 'start') && !(local_defined: 'end');\n\n\t\t\t(local_defined: 'name') && !((self -> 'fields') >> #name) \t? \treturn;\n\t\t\t\n\t\t\t(local_defined: 'name')\t\t? local: 'from'=#name, 'to'=#name;\n\t\t\t!(local_defined: 'from') \t\t? local: 'from'=1;\n\t\t\t!(local_defined: 'to') \t\t\t? local: 'to'=(self -> 'fields') -> size;\n\t\t\t!(local_defined: 'type')\t\t? local: 'type'=(self -> 'validfieldtypes');\n\t\t\t!(local_defined: 'excludetype')\t? local: 'excludetype'=map;\n\t\t\t#type -> type == 'string' \t\t? #type = (map: #type);\n\t\t\t#excludetype -> type == 'string' ? #excludetype = (map: #excludetype);\n\n\t\t\t// only render form inputs if we are not only rendering the form tags\n\t\t\n\t\t\t// use field name if #from is a string\n\t\t\t#from -> type == 'string' ? #from = integer: ((self -> 'fields') -> (findindex: #from) -> first);\n\t\t\t#from == 0 ? #from = 1;\n\t\t\t// negative numbers count from the end\n\t\t\t#from < 0 ? #from = (self -> 'fields') -> size + #from;\n\t\n\t\t\t// use field name if #to is a string\n\t\t\t#to -> type == 'string' ? #to = integer: ((self -> 'fields') -> (findindex: #to) -> last);\n\t\t\t#to == 0 ? #to = (self -> 'fields') -> size;\n\t\t\t// negative numbers count from the end\n\t\t\t#to < 0 ? #to = (self -> 'fields') -> size + #to;\n\n\t\t\t// sanity check\n\t\t\t#from > #to ? #to = #from;\n\t\n\t\t\tlocal: 'template'=( (self -> 'template') != '' \n\t\t\t\t? (self -> 'template') \t\t\n\t\t\t\t| '#label# #field##required#<br' + #endslash + '>\\n' );\n\t\t\tlocal: 'buttontemplate'=( (self -> 'buttontemplate') != '' \n\t\t\t\t? (self -> 'buttontemplate') \n\t\t\t\t| (self -> 'template') != '' \n\t\t\t\t? (self -> 'template')\n\t\t\t\t| '#field#\\n' );\n\t\t\tlocal: 'requiredmarker'=(self -> 'required');\n\t\t\tlocal: 'defaultclass'=( (self -> 'class') != '' \n\t\t\t\t? (self -> 'class') \t\t\n\t\t\t\t| '');\n\t\t\tlocal: 'errorclass'=( (self -> 'errorclass') != '' \n\t\t\t\t? ' class=\"' + (self -> 'errorclass') + '\"' \n\t\t\t\t| ' style=\"color: red;\"');\n\t\t\t\n\t\t\tif: (local_defined: 'legend');\n\t\t\t\t(self -> 'render_fieldset2_open') = true;\n\t\t\t\t#output += '<fieldset>\\n'\n\t\t\t\t\t+ '<legend>' + #legend + '</legend>\\n';\n\t\t\t/if;\n\n\t\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t\t#onefield = #fieldpair -> value;\n\t\t\t\t#fieldvalue = (#onefield -> (find: 'value'));\n\t\t\t\t#fieldvalue_array = #fieldvalue;\n\t\t\t\tif: #fieldvalue_array -> type != 'array';\n\t\t\t\t\tif: #fieldvalue_array >> '\\r'; // Filemaker value list with multiple checked\n\t\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: '\\r');\n\t\t\t\t\telse: #fieldvalue_array >> ','; // Other database with multiple checked\n\t\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: ',');\n\t\t\t\t\telse;\n\t\t\t\t\t\t#fieldvalue_array = array: #fieldvalue_array;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif: #onefield >> 'options';\n\t\t\t\t\t#options = (#onefield -> find: 'options');\n\t\t\t\t\t// convert types for pair \n\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\tif: #option -> type != 'pair';\n\t\t\t\t\t\t\t#option = (pair: #option = #option);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t// name must be string to make sure comparsions work\n\t\t\t\t\t\t(#option -> name) = (string: #option -> name);\n\t\t\t\t\t/iterate;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t\tif: loop_count >= #from \n\t\t\t\t\t&& loop_count <= #to\n\t\t\t\t\t&& #type >> #onefield -> (find: 'type')\n\t\t\t\t\t&& !(#excludetype >> #onefield -> (find: 'type'));\n\t\t\t\t\tif: (self -> 'unsavedwarning') == '';\n\t\t\t\t\t\t#nowarning=true;\n\t\t\t\t\telse;\n\t\t\t\t\t\t#nowarning=#onefield -> (find: 'nowarning');\n\t\t\t\t\t/if;\n\t\t\t\t\t\n\t\t\t\t\tif: #onefield -> (find: 'template') -> size;\n\t\t\t\t\t\t#renderrow = #onefield -> (find: 'template');\n\t\t\t\t\telse: (map: 'submit', 'reset', 'image') >> #onefield -> (find: 'type');\n\t\t\t\t\t\t#renderrow=#buttontemplate;\n\t\t\t\t\telse;\n\t\t\t\t\t\t#renderrow=#template;\n\t\t\t\t\t/if;\n\t\t\t\t\tlocal: 'id'= string;\n\t\t\t\t\tif: (#onefield -> (find: 'id')) !='';\n\t\t\t\t\t\t#id = (#onefield -> (find: 'id'));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#id = #formid + '_' + (#onefield -> (find: 'name')) + loop_count;\n\t\t\t\t\t/if;\n\t\t\t\t\tif: (self -> 'errors') -> size == 0 && #focusfield == '' && #onefield -> (find: 'focus');\n\t\t\t\t\t\t// give this field focus\n\t\t\t\t\t\t#focusfield = #id;\n\t\t\t\t\t/if;\n\t\t\t\t\t\n\t\t\t\t\t// set field label, with error marker if field validation failed\n\t\t\t\t\t// if: (self -> 'exceptionfieldtypes') >> (#onefield -> (find: 'type')) && (#onefield -> (find: 'type')) != 'file';\n\t\t\t\t\t//\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t\t//else: \n\t\t\t\t\tif: (self -> 'errors') -> type == 'array' && (self -> 'errors') >> (#onefield -> (find: 'name'));\n\t\t\t\t\t\t#renderrow -> (replace: '#label#', \n\t\t\t\t\t\t\t'<label for=\"' + #id + '\" id=\"' + #id + '_label\" ' + #errorclass + '>' + (#onefield -> find('label')) + '</label>');\n\t\t\t\t\t\tif: #focusfield == '';\n\t\t\t\t\t\t\t#focusfield = #id;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse;\n\t\t\t\t\t\t#renderrow -> (replace: '#label#', '<label for=\"' + #id + '\" id=\"' + #id + '_label\">' + (#onefield -> find('label')) + '</label>');\n\t\t\t\t\t/if;\n\t\t\t\t\t\n\t\t\t\t\t// set markers for required fields \n\t\t\t\t\tif: #onefield -> (find: 'required') && !((self -> 'exceptionfieldtypes') >> (#onefield -> (find: 'type')) );\n\t\t\t\t\t\t#renderrow -> (replace: '#required#', (encode_smart: #requiredmarker));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#renderrow -> (replace: '#required#', '');\n\t\t\t\t\t/if;\n\t\t\t\t\t#renderfield=string;\n\t\t\t\t\t#renderfield_base = ' name=\"' + (encode_html: (#onefield -> (find: 'name'))) + '\"'\n\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' class=\"' + (#onefield -> (find: 'class')) + '\"' \n\t\t\t\t\t\t\t| (#defaultclass != '' ? ' class=\"' + #defaultclass + '\"') )\n\t\t\t\t\t\t+ ' id=\"' +  (encode_html: #id) + '\"'\n\t\t\t\t\t\t+ (#onefield >> 'raw'\t?  ' ' + (#onefield -> (find: 'raw')) )\n\t\t\t\t\t\t+ (#onefield -> (find: 'disabled') ? ' disabled=\"disabled\"');\n\n\t\t\t\t\t#fieldtype=(#onefield -> (find: 'type'));\n\t\t\t\t\tif: #fieldtype == 'search' && client_type !>> 'WebKit';\n\t\t\t\t\t\t// only show <input type=search\" for WebKit based browsers like Safari\n\t\t\t\t\t\t#fieldtype = 'text';\n\t\t\t\t\t/if;\n\t\t\t\t\tselect: #fieldtype;\n\t\t\t\t\tcase: 'html';\n\t\t\t\t\t\t#renderrow = #template;\n\t\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t\t\t#renderrow -> (replace: '#required#', '');\n\t\t\t\t\t\t#renderfield = #fieldvalue + '\\n';\n\t\t\t\t\tcase: 'legend';\n\t\t\t\t\t\t#renderrow = '';\n\t\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#output += '<fieldset' \n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' class=\"' + (#onefield -> (find: 'class')) + '\"' \n\t\t\t\t\t\t\t\t| (#defaultclass != '' ? ' class=\"' + #defaultclass + '\"') )\n\t\t\t\t\t\t\t+ ((#onefield -> (find: 'id') != '') ? ' id=\"' + #id + '\"') \n\t\t\t\t\t\t\t+ '>\\n';\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\t\t\t#output += '<legend>' + (encode_html: #fieldvalue) + '</legend>\\n';\n\t\t\t\t\tcase: 'fieldset';\n\t\t\t\t\t\t#renderrow = '';\n\t\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: #fieldvalue !== false;\n\t\t\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\t\t\t\t#output += '<fieldset' \n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' class=\"' + (#onefield -> (find: 'class')) + '\"' \n\t\t\t\t\t\t\t\t| (#defaultclass != '' ? ' class=\"' + #defaultclass + '\"') )\n\t\t\t\t\t\t\t+ ((#onefield -> (find: 'id') != '') ? ' id=\"' + #id + '\"') \n\t\t\t\t\t\t\t+ '>\\n<legend>' + (encode_html: #fieldvalue) + '</legend>\\n'; // must contain a legend\n\t\t\t\t\t\t/if;\n\t\t\t\t\tcase: 'hidden';\n\t\t\t\t\t\t#renderfield += '<input type=\"hidden\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\t\t#renderrow = '';\n\t\t\t\t\t\t#output += #renderfield + '\\n';\n\t\t\t\t\tcase: 'text';\n\t\t\t\t\t\t#renderfield += '<input type=\"text\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"'\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' )\n\t\t\t\t\t\t\t+ (#onefield >> 'maxlength' \t? ' maxlength=\"' + (#onefield -> (find: 'maxlength')) + '\"' );\n\t\t\t\t\t\tif: !(self -> 'noscript') && (#onefield -> (find: 'hint')) != '';\n\t\t\t\t\t\t\t#renderfield += ' onfocus=\"clearHint(this)\" onblur=\"setHint(this, \\'' (#onefield -> (find: 'hint')) '\\')\"';\n\t\t\t\t\t\t\t#usehint -> (insert: (#onefield -> find: 'name') = #id);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'search';\n\t\t\t\t\t\t#renderfield += '<input type=\"search\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"'\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' );\n\t\t\t\t\t\tif: (#onefield -> (find: 'hint')) != '';\n\t\t\t\t\t\t\t#renderfield += ' placeholder=\"' + (encode_html: (#onefield -> (find: 'hint'))) + '\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'password';\n\t\t\t\t\t\t#renderfield += '<input type=\"password\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"'\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' );\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'textarea';\n\t\t\t\t\t\t#renderfield += '<textarea' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ (#onefield >> 'cols' \t? ' cols=\"' + (#onefield -> (find: 'cols')) + '\"')\n\t\t\t\t\t\t\t+ (#onefield >> 'rows' \t? ' rows=\"' + (#onefield -> (find: 'rows')) + '\"');\n\t\t\t\t\t\tif: !(self -> 'noscript') && (#onefield -> (find: 'hint')) != '';\n\t\t\t\t\t\t\t#renderfield += ' onfocus=\"clearHint(this)\" onblur=\"setHint(this, \\'' (#onefield -> (find: 'hint')) '\\')\"';\n\t\t\t\t\t\t\t#usehint -> (insert: (#onefield -> find: 'name') = #id);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += '>'\n\t\t\t\t\t\t\t+ (encode_html: #fieldvalue) + '</textarea>';\n\t\t\t\t\tcase: 'checkbox';\n\t\t\t\t\t\tlocal: 'optioncount'=integer;\n\t\t\t\t\t\t#renderfield += '<div class=\"inputgroup'\n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' ' + (#onefield -> find('class'))\n\t\t\t\t\t\t\t| (#defaultclass != '' ? ' ' + #defaultclass) ) \n\t\t\t\t\t\t\t+ '\" id=\"' + #id + '\">\\n';\n\t\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\t\t#optioncount += 1;\n\t\t\t\t\t\t\t#renderfield += (#optioncount > 1 && (#onefield -> find: 'linebreak') ? '<br' + #endslash + '>') + '\\n';\n\t\t\t\t\t\t\tif: #option -> name == '-optgroup';\n\t\t\t\t\t\t\t\t#renderfield += (!(#onefield -> find: 'linebreak') && #optioncount > 1 ? '\\n<br' + #endslash + '>');\n\t\t\t\t\t\t\t\tif: #option -> value != '-optgroup';\n\t\t\t\t\t\t\t\t\t#renderfield += #option -> value\n\t\t\t\t\t\t\t\t\t\t+ (!(#onefield -> find: 'linebreak') ? '<br' + #endslash + '>\\n');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield +=  '<input type=\"checkbox\"'\n\t\t\t\t\t\t\t\t\t+ (string_replaceregexp: #renderfield_base, -find='id=\"(.+?)\"', -replace=('id=\"\\\\1_' + #optioncount + '\"'))\n\t\t\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #option -> name) + '\"';\n\t\t\t\t\t\t\t\tif: #option -> name != '' && #fieldvalue_array >> #option -> name;\n\t\t\t\t\t\t\t\t\t#renderfield +=' checked=\"checked\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += #endslash + '> <label for=\"' + #id + '_' + #optioncount \n\t\t\t\t\t\t\t\t\t+ '\" id=\"' + #id + '_' + #optioncount + '_label\"';\n\t\t\t\t\t\t\t\tif: (self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += '>' + (#option -> value) + '</label> ';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#renderfield += '</div>\\n';\n\t\t\t\t\tcase: 'radio';\n\t\t\t\t\t\tlocal: 'optioncount'=integer;\n\t\t\t\t\t\t#renderfield += '<div class=\"inputgroup'\n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' ' + (#onefield -> find('class'))\n\t\t\t\t\t\t\t| (#defaultclass != '' ? ' ' + #defaultclass) ) \n\t\t\t\t\t\t\t+ '\" id=\"' + #id + '\">\\n';\n\t\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\t\t#optioncount += 1;\n\t\t\t\t\t\t\t#renderfield += (#optioncount > 1 && (#onefield -> find: 'linebreak') ? '<br' + #endslash + '>') + '\\n';\n\t\t\t\t\t\t\tif: #option -> name == '-optgroup';\n\t\t\t\t\t\t\t\t#renderfield += (!(#onefield -> find: 'linebreak') && #optioncount > 1 ? '\\n<br' + #endslash + '>');\n\t\t\t\t\t\t\t\tif: #option -> value != '-optgroup';\n\t\t\t\t\t\t\t\t\t#renderfield += #option -> value\n\t\t\t\t\t\t\t\t\t\t+ (!(#onefield -> find: 'linebreak') ? '<br' + #endslash + '>\\n');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += '<input type=\"radio\"'\n\t\t\t\t\t\t\t\t\t+ (string_replaceregexp: #renderfield_base, -find='id=\"(.+?)\"', -replace=('id=\"\\\\1_' + #optioncount + '\"'))\n\t\t\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #option -> name) + '\"';\n\t\t\t\t\t\t\t\tif: #option -> name != '' && #fieldvalue_array >> #option -> name;\n\t\t\t\t\t\t\t\t\t#renderfield +=' checked=\"checked\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += #endslash + '> <label for=\"' + #id + '_' + #optioncount \n\t\t\t\t\t\t\t\t\t+ '\" id=\"' + #id + '_' + #optioncount + '_label\"';\n\t\t\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += '>' + (#option -> value) + '</label> ';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#renderfield += '</div>\\n';\n\t\t\t\t\tcase: 'select';\n\t\t\t\t\t\t#renderfield += '<select '\n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ (#onefield -> (find: 'multiple') ? ' multiple')\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' );\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\tif: #renderfield >> 'onchange=\"';\n\t\t\t\t\t\t\t\t#renderfield -> (replace: 'onchange=\"', 'onchange=\"makedirty();');\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += ' onchange=\"makedirty()\"';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += '>\\n';\n\t\t\t\t\t\tif: (#onefield -> (find: 'default')) != '' && (#onefield -> (find: 'size')) <= 1;\n\t\t\t\t\t\t\t#renderfield += '<option'\n\t\t\t\t\t\t\t\t+ ' value=\"\">' + (encode_html: (#onefield -> (find: 'default'))) + '</option>\\n';\n\t\t\t\t\t\t\t#renderfield += '<option'\n\t\t\t\t\t\t\t\t+ ' value=\"\"></option>\\n';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tlocal: 'optgroup_open'=false;\n\t\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\t\tif: #option -> name == '-optgroup';\n\t\t\t\t\t\t\t\tif: #optgroup_open;\n\t\t\t\t\t\t\t\t\t#renderfield += '</optgroup>\\n';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\tif: #option -> value != '-optgroup';\n\t\t\t\t\t\t\t\t\t#renderfield += '<optgroup label=\"' + (#option -> value) + '\">\\n';\n\t\t\t\t\t\t\t\t\t#optgroup_open = true;\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += '<option'\n\t\t\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #option -> name) + '\"';\n\t\t\t\t\t\t\t\tif: #option -> name != '' && #fieldvalue_array >> #option -> name;\n\t\t\t\t\t\t\t\t\t#renderfield +=' selected=\"selected\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield +=  '>' + (encode_html: #option -> value) + '</option>\\n';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\tif: #optgroup_open;\n\t\t\t\t\t\t\t#renderfield += '</optgroup>\\n';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += '</select>\\n';\n\t\t\t\t\tcase: 'submit';\n\t\t\t\t\t\t#renderfield += '<input type=\"submit\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\tif: (self -> formmode) == 'add' \n\t\t\t\t\t\t\t&& !(#onefield -> (find: 'disabled')) // already disabled\n\t\t\t\t\t\t\t&& (#onefield -> (find: 'originaltype') == 'savebutton' || #onefield -> (find: 'originaltype') == 'deletebutton'\n\t\t\t\t\t\t\t|| #onefield -> (find: 'name') == 'button_save' || #onefield -> (find: 'name') == 'button_delete');\n\t\t\t\t\t\t\t#renderfield += ' disabled=\"disabled\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') \n\t\t\t\t\t\t\t&& (#onefield -> (find: 'name') == 'button_delete' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'originaltype') == 'deletebutton' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'confirmmessage') != '');\n\t\t\t\t\t\t\tlocal: 'confirmmessage'=(#onefield -> (find: 'confirmmessage') != '' \n\t\t\t\t\t\t\t\t? #onefield -> (find: 'confirmmessage') | 'Really delete?');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\"', '&quot;');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\\'', '\\\\\\'');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"return confirm(\\'' + #confirmmessage +  '\\')\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'reset';\n\t\t\t\t\t\t#renderfield += '<input type=\"reset\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\tif: !(self -> 'noscript') && #onefield -> (find: 'confirmmessage') != '';\n\t\t\t\t\t\t\tlocal: 'confirmmessage'=#onefield -> (find: 'confirmmessage');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\"', '&quot;');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\\'', '\\\\\\'');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"if(confirm(\\'' + #confirmmessage +  '\\')){makeundirty();return true}else{return false};\"';\n\t\t\t\t\t\telse: !(self -> 'noscript');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"makeundirty();\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'image';\n\t\t\t\t\t\t#renderfield += '<input type=\"image\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\tif: (self -> formmode) == 'add' && \n\t\t\t\t\t\t\t(#onefield -> (find: 'originaltype') == 'savebutton' || #onefield -> (find: 'originaltype') == 'deletebutton'\n\t\t\t\t\t\t\t|| #onefield -> (find: 'name') == 'button_save' || #onefield -> (find: 'name') == 'button_delete');\n\t\t\t\t\t\t\t#renderfield += ' disabled=\"disabled\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript')\n\t\t\t\t\t\t\t&& (#onefield -> (find: 'name') == 'button_delete' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'originaltype') == 'deletebutton' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'confirmmessage') != '');\n\t\t\t\t\t\t\tlocal: 'confirmmessage'=(#onefield -> (find: 'confirmmessage') != '' \n\t\t\t\t\t\t\t\t? #onefield -> (find: 'confirmmessage') | 'Really delete?');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\"', '&quot;');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\\'', '\\\\\\'');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"return confirm(\\'' + #confirmmessage +  '\\')\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'file';\n\t\t\t\t\t\t#renderfield += '<input type=\"file\"' \n\t\t\t\t\t\t\t+ #renderfield_base;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\tif: #renderfield >> 'onchange=\"';\n\t\t\t\t\t\t\t\t#renderfield -> (replace: 'onchange=\"', 'onchange=\"makedirty();');\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += ' onchange=\"makedirty()\"';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\t/select;\n\t\t\t\t\t#renderrow -> (replace: '#field#', #renderfield);\n\t\t\t\t\t#output += #renderrow;\n\t\t\t\t/if; \n\t\t\t/iterate;\n\t\t\t\n\t\t\t\t\n\t\t/if; //  !(local_defined: 'start') && !(local_defined: 'end');\n\n\t\t// Add just the needed scripts to support the client side functionality\n\t\tif(!(self -> 'noscript'));\n\t\t\t#output >> 'togglecontrol(' \n\t\t\t\t? self -> (afterhandler: -endscript='function togglecontrol(obj){\n\t\t\t\t\t// toggles checkboxes and radios when clicking on label (for browsers that don´t support this already)\n\t\t\t\t\tswitch (obj.type){\n\t\t\t\t\tcase \\'checkbox\\':\n\t\t\t\t\t\tobj.checked=!obj.checked;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \\'radio\\':\n\t\t\t\t\t\tobj.checked=true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}');\n\t\t\t#output >> 'setHint('\n\t\t\t\t? \t\tself -> (afterhandler: -endscript='function setHint(myField, hint) {\n\t\t\t\t\tif(myField.value==\\'\\') {\n\t\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') != 0) {\n\t\t\t\t\t\t\tmyField.name=\\'off_\\' + myField.name;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmyField.value=hint;\n\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'#aaa\\';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction clearHint(myField) {\n\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') == 0) {\n\t\t\t\t\t\tmyField.name=myField.name.substr(4);\n\t\t\t\t\t\tmyField.value=\\'\\';\n\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'black\\';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction getStyleObject(objectId) {\n\t\t\t\t\tif(document.getElementById && document.getElementById(objectId)) {\n\t\t\t\t\treturn document.getElementById(objectId).style;\n\t\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}');\n\t\t\n\t\t\t#output >> 'makedirty(' || #output >> 'validateform('\n\t\t\t\t? self -> (afterhandler: -endscript='\n\t\t\t\tvar dirty=' + ((self -> 'errors') -> size ? 'true' | 'false') + ';\n\t\t\t\tvar dirtycheckname=null;\n\t\t\t\tvar dirtycheckvalue=null;\n\t\t\t\tvar submitBlock=false;\n\t\t\t\tfunction validateform(myForm) {\n\t\t\t\t\t// perform validation of myForm here\n\t\t\t\t\tif(submitBlock){return false};\n\t\t\t\t\tmakeundirty();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction dirtyvalue(obj){ // to be called at keydown to track if a text field changes or if arrow keys/tab/cmd-keys are pressed\n\t\t\t\t\t dirtycheckname = obj.name;\n\t\t\t\t\t dirtycheckvalue = obj.value;\n\t\t\t\t}\n\t\t\t\tfunction makeundirty(){\n\t\t\t\t\tdirty=false; \n\t\t\t\t\tdirtymarker();\n\t\t\t\t\twindow.onbeforeunload=null;\n\t\t\t\t}\n\t\t\t\tfunction makedirty(obj){\n\t\t\t\t\tif(obj){ // if object is specified then we are tracking if the value changes through keydown/keyup \n\t\t\t\t\t\tif (obj.value == dirtycheckvalue || obj.name != dirtycheckname) { // no change or tabbed to another field - return immediately\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdirty=true; \n\t\t\t\t\tdirtymarker();\n\t\t\t\t}\n\t\t\t\tfunction checkdirty(){\n\t\t\t\t\tif(dirty){\n\t\t\t\t\t\treturn confirm(\\'' + (self -> 'unsavedwarning') + '\\')\n\t\t\t\t\t} else {return true}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction dirtymarker() {\n\t\t\t\t\tvar obj = document.getElementById(\\'' + (self -> 'unsavedmarker') + '\\');\n\t\t\t\t\tif(dirty && obj){\n\t\t\t\t\t\tjscss(\\'add\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t}else if(obj) {\n\t\t\t\t\t\tjscss(\\'remove\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction jscss(a,o,c1,c2){\n\t\t\t\t\t/*\n\t\t\t\t\t\ta = action: swap, add, remove, check\n\t\t\t\t\t\to = object\n\t\t\t\t\t\tc1 = name of the class (first class for swap)\n\t\t\t\t\t\tc2 = for swap, name of the second class\n\t\t\t\t\t\thttp://onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html\n\t\t\t\t\t*/\n\t\t\t\t\tswitch (a){\n\t\t\t\t\t\tcase \\'swap\\':\n\t\t\t\t\t\t\to.className=!jscss(\\'check\\',o,c1)?o.className.replace(c2,c1): o.className.replace(c1,c2);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \\'add\\':\n\t\t\t\t\t\t\tif(!jscss(\\'check\\',o,c1)){o.className+=o.className?\\' \\'+c1:c1;}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \\'remove\\':\n\t\t\t\t\t\t\tvar rep=o.className.match(\\' \\'+c1)?\\' \\'+c1:c1;\n\t\t\t\t\t\t\to.className=o.className.replace(rep,\\'\\');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \\'check\\':\n\t\t\t\t\t\t\treturn new RegExp(\\'\\\\\\\\b\\'+c1+\\'\\\\\\\\b\\').test(o.className);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(dirty) {makedirty()};');\n\t\t\t\t\n\t\t\t\t(self -> 'unsavedwarning') != '' \n\t\t\t\t\t? self -> (afterhandler: -endscript='function beforeunload() {\n\t\t\t\t\tif(dirty) {return \\'' + (self -> 'unsavedwarning') + '\\';}\n\t\t\t\t}\n\t\t\t\twindow.onbeforeunload=beforeunload;');\n\t\t\t\t\n\t\t\t\t#output >> 'submitOk'\n\t\t\t\t\t? self -> (afterhandler: -endscript='function submitOk(e) { // prevents submit-on-enter\n\t\t\t\t\tvar keynum;\n\t\t\t\t\tvar elTarget;\n\t\t\t\t\tvar elType;\n\t\t\n\t\t\t\t\t// get keycode for the event \n\t\t\t\t\tif(window.event) keynum = e.keyCode; // IE\n\t\t\t\t\telse if(e.which) keynum = e.which; // DOM\n\t\t\n\t\t\t\t\t// get target\n\t\t\t\t\tif (e.target) elTarget = e.target;\n\t\t\t\t\telse if (e.srcElement) elTarget = e.srcElement;\n\t\t\n\t\t\t\t\tif(elTarget.tagName.toLowerCase()  == \\'input\\') elType = elTarget.getAttribute(\\'type\\').toLowerCase();\n\t\t\t\t\tsubmitBlock=false;\n\t\t\t\t\tif (elType != \\'submit\\' && elType != \\'image\\' && elType != \\'reset\\') {\n\t\t\t\t\t\t// allow enter submit when submit button/image or reset button has focus\n\t\t\t\t\t\tif (keynum==13) submitBlock=true;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}');\n\t\t\t/if; // noscript\n\n\t\tif: false && $knop_form_renderform_counter <= 1;\n\t\t\t\t\t\t\t\t\t\tself -> (afterhandler: -headscript=\n\t\t\t\t\t\t\t\t\t\t\t'function getStyleObject(objectId) {\n\t\t\t\t\t\t\t\t\t\t\t\tif(document.getElementById && document.getElementById(objectId)) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn document.getElementById(objectId).style;\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction jscss(a,o,c1,c2){\n\t\t\t\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\t\t\t\ta = action: swap, add, remove, check\n\t\t\t\t\t\t\t\t\t\t\t\t\to = object\n\t\t\t\t\t\t\t\t\t\t\t\t\tc1 = name of the class (first class for swap)\n\t\t\t\t\t\t\t\t\t\t\t\t\tc2 = for swap, name of the second class\n\t\t\t\t\t\t\t\t\t\t\t\t\thttp://onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html\n\t\t\t\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\t\t\t\tswitch (a){\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'swap\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\to.className=!jscss(\\'check\\',o,c1)?o.className.replace(c2,c1): o.className.replace(c1,c2);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'add\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(!jscss(\\'check\\',o,c1)){o.className+=o.className?\\' \\'+c1:c1;}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'remove\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar rep=o.className.match(\\' \\'+c1)?\\' \\'+c1:c1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\to.className=o.className.replace(rep,\\'\\');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'check\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn new RegExp(\\'\\\\\\\\b\\'+c1+\\'\\\\\\\\b\\').test(o.className);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction togglecontrol(obj){\n\t\t\t\t\t\t\t\t\t\t\t\t// toggles checkboxes and radios when clicking on label (for browsers that don´t support this already)\n\t\t\t\t\t\t\t\t\t\t\t\tswitch (obj.type){\n\t\t\t\t\t\t\t\t\t\t\t\tcase \\'checkbox\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\tobj.checked=!obj.checked;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\tcase \\'radio\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\tobj.checked=true;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction setHint(myField, hint) {\n\t\t\t\t\t\t\t\t\t\t\t\tif(myField.value==\\'\\') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') != 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.name=\\'off_\\' + myField.name;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.value=hint;\n\t\t\t\t\t\t\t\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'#aaa\\';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction clearHint(myField) {\n\t\t\t\t\t\t\t\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') == 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.name=myField.name.substr(4);\n\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.value=\\'\\';\n\t\t\t\t\t\t\t\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'black\\';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tvar dirty=' + ((self -> 'errors') -> size ? 'true' | 'false') + ';\n\t\t\t\t\t\t\t\t\t\t\tvar dirtycheckname=null;\n\t\t\t\t\t\t\t\t\t\t\tvar dirtycheckvalue=null;\n\t\t\t\t\t\t\t\t\t\t\tvar submitBlock=false;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction validateform(myForm) {\n\t\t\t\t\t\t\t\t\t\t\t\t// perform validation of myForm here\n\t\t\t\t\t\t\t\t\t\t\t\tif(submitBlock){return false};\n\t\t\t\t\t\t\t\t\t\t\t\tmakeundirty();\n\t\t\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction dirtyvalue(obj){ // to be called at keydown to track if a text field changes or if arrow keys/tab/cmd-keys are pressed\n\t\t\t\t\t\t\t\t\t\t\t\t dirtycheckname = obj.name;\n\t\t\t\t\t\t\t\t\t\t\t\t dirtycheckvalue = obj.value;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction makeundirty(){\n\t\t\t\t\t\t\t\t\t\t\t\tdirty=false; \n\t\t\t\t\t\t\t\t\t\t\t\tdirtymarker();\n\t\t\t\t\t\t\t\t\t\t\t\twindow.onbeforeunload=null;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction makedirty(obj){\n\t\t\t\t\t\t\t\t\t\t\t\tif(obj){ // if object is specified then we are tracking if the value changes through keydown/keyup \n\t\t\t\t\t\t\t\t\t\t\t\t\tif (obj.value == dirtycheckvalue || obj.name != dirtycheckname) { // no change or tabbed to another field - return immediately\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tdirty=true; \n\t\t\t\t\t\t\t\t\t\t\t\tdirtymarker();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction checkdirty(){\n\t\t\t\t\t\t\t\t\t\t\t\tif(dirty){\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn confirm(\\'' + (self -> 'unsavedwarning') + '\\')\n\t\t\t\t\t\t\t\t\t\t\t\t} else {return true}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction beforeunload() {\n\t\t\t\t\t\t\t\t\t\t\t\tif(dirty) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn \\'' + (self -> 'unsavedwarning') + '\\';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction dirtymarker() {\n\t\t\t\t\t\t\t\t\t\t\t\tvar obj = document.getElementById(\\'' + (self -> 'unsavedmarker') + '\\');\n\t\t\t\t\t\t\t\t\t\t\t\tif(dirty && obj){\n\t\t\t\t\t\t\t\t\t\t\t\t\tjscss(\\'add\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t\t\t\t\t\t\t\t}else if(obj) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tjscss(\\'remove\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t' + ((self -> 'unsavedwarning') != '' ? 'window.onbeforeunload=beforeunload;') + '\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction submitOk(e) { // prevents submit-on-enter\n\t\t\t\t\t\t\t\t\t\t\t\tvar keynum;\n\t\t\t\t\t\t\t\t\t\t\t\tvar elTarget;\n\t\t\t\t\t\t\t\t\t\t\t\tvar elType;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// get keycode for the event \n\t\t\t\t\t\t\t\t\t\t\t\tif(window.event) keynum = e.keyCode; // IE\n\t\t\t\t\t\t\t\t\t\t\t\telse if(e.which) keynum = e.which; // DOM\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// get target\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.target) elTarget = e.target;\n\t\t\t\t\t\t\t\t\t\t\t\telse if (e.srcElement) elTarget = e.srcElement;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tif(elTarget.tagName.toLowerCase()  == \\'input\\') elType = elTarget.getAttribute(\\'type\\').toLowerCase();\n\t\t\t\t\t\t\t\t\t\t\t\tsubmitBlock=false;\n\t\t\t\t\t\t\t\t\t\t\t\tif (elType != \\'submit\\' && elType != \\'image\\' && elType != \\'reset\\') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t// allow enter submit when submit button/image or reset button has focus\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (keynum==13) submitBlock=true;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t');\n\t\t/if;\n\t\tif: !(self -> 'noscript') && #usehint -> size > 0;\n\t\t\tlocal: 'hintscript'=string;\n\t\t\t// #usehint is a pair array with name=id\n\t\t\titerate: #usehint, (local: 'hintfield');\n\t\t\t\tif: (self -> 'fields') >> #hintfield -> name;\n\t\t\t\t\t#onefield = (self -> 'fields') -> (find: #hintfield -> name) -> first -> value;\n\t\t\t\t\t#hintscript += 'setHint(document.getElementById(\\'' + (encode_html: #hintfield -> value) + '\\'), \\'' \n\t\t\t\t\t\t+ (#onefield -> (find: 'hint')) + '\\');\\n';\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t\n\t\t\tself -> (afterhandler: -endscript=#hintscript);\n\t\t/if;\n\t\tif: !(self -> 'noscript') && #focusfield != '';\n\t\t\tself -> (afterhandler: -endscript='document.getElementById(\\'' + #focusfield + '\\').focus();document.getElementById(\\'' + #focusfield + '\\').select();');\n\t\t/if;\n\n\t\tif: (self -> 'render_fieldset_open') && (params -> size == 0 || (local_defined: 'end'));\n\t\t\t// inner fieldset is open\n\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t#output += '</fieldset>\\n';\n\t\t/if;\n\t\tif: (self -> 'render_fieldset2_open') && (local_defined: 'legend');\n\t\t\t// inner fieldset is open\n\t\t\t(self -> 'render_fieldset2_open') = false;\n\t\t\t#output += '</fieldset>\\n';\n\t\t/if;\n\n\t\tif: #renderformEndTag;\n\t\t\tif: (self -> 'fieldset');\n\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t/if;\n\t\t\n\t\t\t// render closing form tag\n\t\t\t#output += '</form>';\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'renderhtml', -description='Outputs form data as plain HTML, a specific field, a range of fields or all fields of a specific type. \\\n\t\t\tSome form field types are excluded, such as submit, reset, file etc. \\\n\t\t\tUse form -> setformat first to specify the html format, otherwise default format #label#: #field#<br> is used.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-name (optional) Render only the specified field\\n\\\n\t\t\t-from (optional) Render fields from the specified number index or field name\\n\\\n\t\t\t-to (optional) Render fields to the specified number index or field name\\n\\\n\t\t\t-type (optional) Only render fields of this or these types (string or array)\\n\\\n\t\t\t-excludetype (optional) Render fields except of this or these types (string or array)\\n\\\n\t\t\t-legend (optional) Groups the rendered fields in a fieldset and outputs a legend for the fieldset\\n\\\n\t\t\t-xhtml (optional flag) XHTML valid output',\n\t\t-optional='name', -copy,\t// field name\n\t\t-optional='from', -copy, \t// number index or field name\n\t\t-optional='to', -copy, \t\t// number index or field name\n\t\t-optional='type', -copy,\t// only output fields of this or these types (string or array)\n\t\t-optional='excludetype', -copy,\t// do not output fields of this or these types (string or array)\n\t\t-optional='legend',\t\t\t// groups the rendered fields in a fieldset and outputs a legend for the fieldset\n\t\t-optional='xhtml';\t\t\t// boolean, if set to true adjust output for XHTML\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: 'output'=string, \n\t\t\t'onefield'=map, \n\t\t\t'renderfield'=string, \n\t\t\t'renderfield_base'=string, \n\t\t\t'renderrow'=string,\n\t\t\t'fieldvalue'=string,\n\t\t\t'fieldvalue_array'=array,\n\t\t\t'options'=array,\n\t\t\t'usehint'=array;\n\n\t\t\n\t\t// local var that adjust tag endings if rendered for XHTML\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\t(local_defined: 'name') && !((self -> 'fields') >> #name) \t? \treturn;\n\n\t\t(local_defined: 'name')\t\t? local: 'from'=#name, 'to'=#name;\n\t\t!(local_defined: 'from') \t\t? local: 'from'=1;\n\t\t!(local_defined: 'to') \t\t\t? local: 'to'=(self -> 'fields') -> size;\n\t\t!(local_defined: 'type')\t\t? local: 'type'=(self -> 'validfieldtypes');\n\t\t!(local_defined: 'excludetype')\t? local: 'excludetype'=map;\n\t\t#type -> type == 'string' \t\t? #type = (map: #type);\n\t\t#excludetype -> type == 'string' ? #excludetype = (map: #excludetype);\n\n\t\t// use field name if #from is a string\n\t\t#from -> type == 'string' ? #from = integer: ((self -> 'fields') -> (findindex: #from) -> first);\n\t\t#from == 0 ? #from = 1;\n\t\t// negative numbers count from the end\n\t\t#from < 0 ? #from = (self -> 'fields') -> size + #from;\n\n\t\t// use field name if #to is a string\n\t\t#to -> type == 'string' ? #to = integer: ((self -> 'fields') -> (findindex: #to) -> last);\n\t\t#to == 0 ? #to = (self -> 'fields') -> size;\n\t\t// negative numbers count from the end\n\t\t#to < 0 ? #to = (self -> 'fields') -> size + #to;\n\n\t\t//Sanity check\n\t\t#from > #to ? #to = #from;\n\n\t\tlocal: 'template'=( (self -> 'template') != '' \n\t\t\t? (self -> 'template') \t\t\n\t\t\t| '#label#: #field#<br' + #endslash + '>\\n' );\n\t\tlocal: 'buttontemplate'=( (self -> 'buttontemplate') != '' \n\t\t\t? (self -> 'buttontemplate') \t\t\n\t\t\t| (self -> 'template') != '' \n\t\t\t? (self -> 'template')\n\t\t\t| '#field#\\n' );\n\t\tlocal: 'defaultclass'=( (self -> 'class') != '' \n\t\t\t? (self -> 'class') \t\t\n\t\t\t| '');\n\t\tif: (local_defined: 'legend');\n\t\t\t#output += '<fieldset>\\n'\n\t\t\t\t+ '<legend>' + #legend + '</legend>\\n';\n\t\t\t(self -> 'render_fieldset2_open') = true;\n\t\t/if;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t#onefield = #fieldpair -> value;\n\t\t\t#fieldvalue = (#onefield -> (find: 'value'));\n\t\t\t#fieldvalue_array = #fieldvalue;\n\t\t\tif: #fieldvalue_array -> type != 'array';\n\t\t\t\tif: #fieldvalue_array >> '\\r'; // Filemaker value list with multiple checked\n\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: '\\r');\n\t\t\t\telse: #fieldvalue_array >> ','; // Other database with multiple checked\n\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: ',');\n\t\t\t\telse;\n\t\t\t\t\t#fieldvalue_array = array: #fieldvalue_array;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: #onefield >> 'options';\n\t\t\t\t#options = (#onefield -> find: 'options');\n\t\t\t\t// convert types for pair \n\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\tif: #option -> type != 'pair';\n\t\t\t\t\t\t#option = (pair: #option = #option);\n\t\t\t\t\t/if;\n\t\t\t\t\t// name must be string to make sure comparsions work\n\t\t\t\t\t(#option -> name) = (string: #option -> name);\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\tif: loop_count >= #from \n\t\t\t\t&& loop_count <= #to\n\t\t\t\t&& #type >> #onefield -> (find: 'type')\n\t\t\t\t&& !(#excludetype >> #onefield -> (find: 'type'));\n\n\t\t\t\tif: #onefield -> (find: 'template') -> size;\n\t\t\t\t\t#renderrow = #onefield -> (find: 'template');\n\t\t\t\telse: (map: 'submit', 'reset', 'image') >> #onefield -> (find: 'type');\n\t\t\t\t\t#renderrow=#buttontemplate;\n\t\t\t\telse;\n\t\t\t\t\t#renderrow=#template;\n\t\t\t\t/if;\n\n\t\t\t\tif: (self -> 'exceptionfieldtypes') >> (#onefield -> (find: 'type'));\n\t\t\t\t\t#renderrow -> (replace: '#label#:', '');\n\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\telse: (#onefield -> (find: 'label')) != '';\n\t\t\t\t\t#renderrow -> (replace: '#label#', (#onefield -> (find: 'label') ));\n\t\t\t\telse: \n\t\t\t\t\t#renderrow -> (replace: '#label#:', '');\n\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t/if;\n\t\t\t\tif: (map: 'radio', 'checkbox', 'select') >> (#onefield -> (find: 'type'));\n\t\t\t\t\t#renderfield = string;\n\t\t\t\t\titerate: #fieldvalue_array, local: 'onefieldvalue';\n\t\t\t\t\t\tif: loop_count > 1;\n\t\t\t\t\t\t\t#renderfield += ( (#onefield -> find: 'linebreak') ? '<br' + #endslash + '>\\n' | ', ');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: #options >> #onefieldvalue;\n\t\t\t\t\t\t\t// show the display text for a selected option\n\t\t\t\t\t\t\t#renderfield += (encode_break: (#options -> (find: #onefieldvalue) -> first -> value));\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t// show the option value itself\n\t\t\t\t\t\t\t#renderfield += (encode_break: #onefieldvalue);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/iterate;\n\t\t\t\telse: (#onefield -> (find: 'type')) == 'html';\n\t\t\t\t\t#renderrow = #template;\n\t\t\t\t\t#renderrow -> (replace: '#label#:', '');\n\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t\t#renderrow -> (replace: '#required#', '');\n\t\t\t\t\t#renderfield = #fieldvalue + '\\n';\n\t\t\t\telse: (#onefield -> (find: 'type')) == 'legend';\n\t\t\t\t\t#renderrow = '';\n\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t/if;\n\t\t\t\t\t#output += '<fieldset>\\n';\n\t\t\t\t\t#output += '<legend>' + (encode_html: #fieldvalue) + '</legend>';\n\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\telse: (#onefield -> (find: 'type')) == 'fieldset';\n\t\t\t\t\t#renderrow = '';\n\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t/if;\n\t\t\t\t\tif: #fieldvalue != false;\n\t\t\t\t\t\t#output += '<fieldset>\\n<legend></legend>'; // must contain a legend\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\t#renderfield = (encode_break: #fieldvalue);\n\t\t\t\t/if;\n\t\t\t\t#renderrow -> (replace: '#field#', #renderfield);\n\t\t\t\t#output += #renderrow;\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: (local_defined: 'legend') && (self -> 'render_fieldset2_open');\n\t\t\t// inner fieldset is open\n\t\t\t(self -> 'render_fieldset2_open') = false;\n\t\t\t#output += '</fieldset>\\n';\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t/define_tag;\n\n\tdefine_tag: 'getvalue', -description='Returns the current value of a form field. Returns an array for repeated form fields. ',\n\t\t-required='name', -type='string',\n\t\t-optional='index', -type='integer', -copy;\n\t\t!local_defined('index') ? local('index' = 1);\n\t\t#index < 1 ? #index = 1;\n\t\tif: (self -> 'fields') >> #name;\n\t\t\tif(#index > (self -> 'fields') -> find(#name) -> size);\n\t\t\t\treturn;\n\t\t\t/if;\n\t\t\treturn: (self -> 'fields') -> (find: #name) -> get(#index) -> value -> (find: 'value');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'getlabel', -description='Returns the label for a form field. ',\n\t\t-required='name', -type='string';\n\t\tif: (self -> 'fields') >> #name;\n\t\t\treturn: (self -> 'fields') -> (find: #name) -> first -> value -> (find: 'label');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'setvalue', -description='Sets the value for a form field. \\\n\t\t\t\tEither form -> (setvalue: fieldname=newvalue) or form -> (setvalue: -name=fieldname, -value=newvalue)',\n\t\t-required='name',\n\t\t-optional='value',\n\t\t-optional='index', -type='integer', -copy;\n\t\tlocal: 'timer'=knop_timer; \n\t\t// either -> (setvalue: 'fieldname'='newvalue') or -> (setvalue: -name='fieldname', -value='newvalue')\n\t\tlocal: '_name'=#name, '_value'=(local: 'value');\n\t\t!local_defined('index') ? local('index' = 1);\n\t\t#index < 1 ? #index = 1;\n\t\tif: #name -> type == 'pair';\n\t\t\t#_name = #name -> name;\n\t\t\t#_value = #name -> value;\n\t\t/if;\n\t\tif: (self -> 'fields') >> #_name;\n\t\t\tif(#index > (self -> 'fields') -> find(#_name) -> size);\n\t\t\t\treturn;\n\t\t\t/if;\n\t\t\t// first remove value to break reference\n\t\t\t((self -> 'fields') -> get((self -> 'fields') -> (findindex: #_name) -> get(#index)) -> value) -> (remove: 'value');\n\t\t\t((self -> 'fields') -> get((self -> 'fields') -> (findindex: #_name) -> get(#index)) -> value) -> (insert: 'value'=#_value);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'removefield', -description='Removes all form elements with the specified name from the form',\n\t\t-required='name', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\t\t(self -> 'fields') -> (removeall: #name);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'keys', -description='Returns an array of all field names';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=array;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t#output -> (insert: #fieldpair -> name);\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t/define_tag;\n\n\n\tdefine_tag: 'keyvalue'; \t\t\treturn: (self -> 'db_keyvalue');\t\t/define_tag;\n\tdefine_tag: 'lockvalue'; \t\t\treturn: (self -> 'db_lockvalue');\t\t/define_tag;\n\tdefine_tag: 'lockvalue_decrypted';\n\t\t(self -> 'database') -> type != 'database' ? return;\n\t\treturn: (decrypt_blowfish: (self -> 'db_lockvalue'), -seed=(self -> 'database' -> 'lock_seed'));\n\t/define_tag;\n\tdefine_tag: 'database'; \t\t\treturn: (self -> 'database');\t\t\t/define_tag;\n\n\tdefine_tag: 'formmode', -description='Returns add or edit after for -> init has been called';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (self -> getbutton) == 'add';\n\t\t\t// this is needed to keep the right form mode after a failed add\n\t\t\t(self -> 'formmode') = 'add';\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n \t\treturn: (self -> 'formmode');\n \t/define_tag;\n\n\tdefine_tag: 'error_code';\n\t\t// custom error_code for knop_form\n\t\tif: (self -> 'error_code');\n\t\t\treturn: integer: (self -> 'error_code');\n\t\telse: (self -> 'errors') -> type == 'array' && (self -> 'errors') -> size > 0;\n\t\t\t(self -> 'error_code') = 7101;\n\t\t\treturn: (self -> 'error_code');\n\t\telse;\n\t\t\treturn: 0;\n\t\t/if;\n\t/define_tag;\n\n\n\t\n\tdefine_tag: 'afterhandler', -description='Internal member tag. Adds needed javascripts through an atend handler that will be processed when the entire page is done. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-headscript (optional) A single script, will be placed before </head>  (or at top of page if </head> is missing)\\n\\\n\t\t\t-endscript (optional) Multiple scripts (no duplicates), will be placed before </body> (or at end of page if </body> is missing)',\n\t\t-optional='headscript', -type='string',\n\t\t-optional='endscript', -type='string';\n\t\t// adds needed javascripts through an atend handler that will be processed when the entire page is done\n\n\t\tif: !(var_defined: 'knop_afterhandler_data');\n\t\t\tvar: 'knop_afterhandler_data'=map;\n\t\t\tdefine_atend: { // this will run after the page is done processing\n\t\t\t\tif: $knop_afterhandler_data >> 'headscript';\n\t\t\t\t\t// put before </head> or at beginning of page\n\t\t\t\t\tlocal: 'scriptdata'='<script language=\"javascript\" type=\"text/javascript\">\\n/*<![CDATA[ */\\n' \n\t\t\t\t\t\t+ ($knop_afterhandler_data -> (find: 'headscript') -> join('\\n')) \n\t\t\t\t\t\t+ '\\n/* ]]> */\\n</script>\\n';\n\t\t\t\t\tif: content_body >> '</head>';\n\t\t\t\t\t\tcontent_body -> (replace: '</head>', #scriptdata + '</head>');\n\t\t\t\t\telse;\n\t\t\t\t\t\tcontent_body = #scriptdata + content_body;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif: $knop_afterhandler_data >> 'endscript';\n\t\t\t\t\t// put before </body> or at end of page\n\t\t\t\t\tlocal: 'scriptdata'='\\n\\n\\n\\n<script language=\"javascript\" type=\"text/javascript\">\\n/* <![CDATA[ */\\n' \n\t\t\t\t\t\t+ ($knop_afterhandler_data -> (find: 'endscript') -> join('\\n')) \n\t\t\t\t\t\t+ '\\n/* ]]> */\\n</script>\\n';\n\t\t\t\t\tif: content_body >> '</body>';\n\t\t\t\t\t\tcontent_body -> (replace: '</body>', #scriptdata + '</body>');\n\t\t\t\t\telse;\n\t\t\t\t\t\tcontent_body += #scriptdata;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t};\n\t\t/if;\n\t\t\n\t\tif: (local_defined: 'headscript');\n\t\t\t// add to current headscript\n\t\t\tif: $knop_afterhandler_data !>> 'headscript';\n\t\t\t\t$knop_afterhandler_data -> (insert: 'headscript' = array);\n\t\t\t/if;\n\t\t\tif: $knop_afterhandler_data -> (find: 'headscript') !>> #headscript;\n\t\t\t\t$knop_afterhandler_data -> (find: 'headscript') -> insert(#headscript);\n\t\t\t/if;\n\t\t/if;\n\t\tif: (local_defined: 'endscript');\n\t\t\t// add to current endscript\n\t\t\tif: $knop_afterhandler_data !>> 'endscript';\n\t\t\t\t$knop_afterhandler_data -> (insert: 'endscript' = array);\n\t\t\t/if;\n\t\t\tif: $knop_afterhandler_data -> (find: 'endscript') !>> #endscript;\n\t\t\t\t$knop_afterhandler_data -> (find: 'endscript') -> insert(#endscript);\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n/define_type;\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_form\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_grid\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'grid',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2011-01-01',\n\t\t'description'='Custom type to handle data grids (record listings).';\n\n/*\n\nCHANGE NOTES\n2011-01-01\tSP\tCorrection of invalid HTML in <thead> and <tr>\n2010-12-23\tSP\tCorrected pagination bug for -numbered.\n2010-11-17\tJC\tAdded -startwithfooter flag to grid->renderhtml.  This moves the footer before the column titles in the table header.\n2010-11-17\tJC\tChanged rawheader inclusion to work even if there's no quicksearch for a grid\n2010-05-14\tJC\tAdded span separation on grid footer for better styling\n2010-03-06\tSP\tChanged default behavior of ->sortparams and ->quicksearch with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->sortparams and ->quicksearch with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2010-01-27\tJC\tAdjusted the id support\n2010-01-25\tJC\tAdded support for optional id, used by table, quicksearch and quicksearch_reset\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-08-26\tJS\tCorrected prev/next links when no nav is defined for the grid object\n2009-06-29\tJS\t->renderlisting: documentation correction (renderlisting never calls renderfooter). \n2009-01-11\tJS\t->renderlisting: Made sure that template isn't applied on NULL field values since that would cause an error with ->replace \n2008-12-29\tJC\tSupport for optional classes in table header\n2008-11-27\tJC\t-> implemented support for td specific classes. The class is inserted in both the TH and TD tag for the specified field\n2008-09-24\tJS\t->sortparams: fieldnames specified by the -sort parameter are now validated so they exist in the database\n2008-09-24\tJS\t->sortparams, ->quicksearch: Added protection against backtick sql injection in MySQL object names\n2008-09-10\tJS\t-numbered can now be specified at oncreate in addition to  ->renderhtml and ->renderfooter. \n2008-09-08\tJS\t->sortfield changed so defaultsort is honored even if -nosort is specified (-nosort is only used to prevent the user from changing sort order on the fly)\n2008-09-08\tJS\t->renderlisting and ->renderfooter optimized by caching the result of nav->url. \n2008-05-15\tJS\t->renderfooter: minor adjustment to numbered pagination links\n2008-05-14\tJS\t->renderfooter (and ->renderhtml): added -numbered as option to get google style numbered pagination links. Render the grid with -numbered (defaults to show 6 page number links plus the far ends) or -numbered=10 or another number. \n2008-05-13\tJS\tAdded ->renderlisting which is now part of ->renderhtml for more flexibility\n2008-02-25\tJS\t->renderheader and ->renderfooter calls nav -> url with -getargs \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: addded -autoparams to nav -> url used in links since url was changed to default to no autoparams. \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: improved support for param based navigation method  in links, cleaned up linking to use nav -> url instead of self -> urlparams when nav is available\n2008-01-22\tJC\t->quicksearch: Changed wordseparators so that \\r and \\n aren't placed as \\r\\n, otherwise they are treated as a single character by ->split. \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-03\tJS\tAdded optional -language parameter to set the initial language for the grid object\n2007-12-03\tJS\tAdded -> lang to provide a reference to the knop_lang object that is used for localized strings\n2007-12-03\tJS\tAdded localized strings for English and Swedish\n2007-12-03\tJS\tAdded knop_lang to handle localized strings\n2007-11-11\tJC\tAdded optional -rawheader for extra header content to be inserted before the Quicksearch form\n2007-10-23\tJS\t->renderheader: added class=\"grid\" to the opening table tag to be able to isolate the css specifications\n2007-10-03\tJS\t->renderfooter: added unique classes for each type of prev/next link to be able to replace with images using css\n2007-10-03\tJS\t->renderfooter: Changed prev/next link texts to simple |< << >> >| instead of unicode glyphs\n2007-09-20\tJS\tPostparams are only sent along for nav params (not \"-\" params)\n2007-09-07\tJS\tAlso send postparams along in prev/next links (not only getparams)\n2007-09-06\tJS\tIf nav has params defined, those params will be sent along with prev/next links\n2007-09-06\tJS\tAdded encode_url for link params\n2007-09-06\tJS\tChanged -action to -formaction in the quicksearch form\n2007-08-08\tJS\t->urlargs: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\t->quicksearch: added \\r and \\n as word separators. \n2007-05-03\tJS\t->addfield: Added check for empty dbfield name before adding to dbfieldmap\n2007-04-19\tJS\t->quicksearch: added  -value (flag) that makes quicksearch output just the value of the quicksearch field instead of a query\n2007-04-13\tJS\t->oncreate: added -nosort as global flag (overrides column specific sort options)\n2007-04-13\tJS\t->renderfooter: Added tbody to footer to make it pass validation, but it's still not semantically correct. \n2007-04-13\tJS\tChanged field type for quicksearch for non-WebKit based browsers\n2007-04-10\tJS\t->quicksearch: Added @ as word separator for \"word begins with\" search\n2007-04-10\tJS\t->quicksearch: Added -contains as option to perform a simple contains search instead of emulating \"word begins with\" search\n2007-04-10\tJS\t->renderheader: When grid has a defaultsort, there should be no \"unsort\" option in the sortable headings\n2007-04-10\tJS\t->insert: (-defaultsort='desc') or (-defaultsort='descending') makes the default sort order sort in descending order\n2007-04-04\tJS\t->addfield: -template can now also be a compound expression\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tAdded support for FileMaker with quicksearch (untested)\n2007-03-01\tJS\tChanged all texts to English\n2007-02-07\tJS\tRemoved classs=\"first\" and class=\"notopborder\" since CSS border-collapse: collapse; eliminates the need\n2007-02-05\tJS The -keyvalue parameter for url edit links can be given another name by specifying -keyparamname in addfield\n2007-01-31\tJS\t->addfield: #value# can be used in -url, as a way to provide mailto links etc in lists\n2007-01-30\tJS\tSortable columns now thave three states instead of two: sorted ascending, sorted descending and unsorted. \n2007-01-30\tJS\tImprovements to quicksearch, to emulate \"word begins with\"  searches\n2007-01-26\tJS\tAdded support for quicksearch field in grid header. Specify -quicksearch at ->oncreate, and tell what fields to search by specifying -quicksearch for those fields at ->addfield. \n\t\t\t\tFields can be search only (no display) by leaving out name and label. All specified fields are searched word for word of thew search string. \n\t\t\t\tUse ->quicksearch to get the search parameters (optionally -sql)\n2007-01-26\tJS\tAdded ->urlargs to get a querystring with all \"-\" GET params, except those in optional -except string or array parameter. \n2007-01-22\tJS\tAdjustments to highlighting and \"(redigera)\"-link for records with empty values in the linked field\n2007-01-19\tJS\tAdded href titles to sort links and prevnext links\n2007-01-19\tJS\tCorrected sortparams when no sortfield is specified\n2007-01-19\tJS\tAddded go to first page, go to last page in footer\n2007-01-19\tJS\tAdded member tag page_skiprecords to help correcting out of bounds page numbers\n2007-01-19\tJS\tAdded member tag lastpage\n2007-01-18\tJS\tSupport for highlighting of affected record after edit or update (class name \"highlight\")\n2007-01-17\tJS\tAdded addfield: -template\n\nTODO\nMake it possible for knop_grid to work independently of a knop_database object so other types of listings can bre created. \nLanguage of quicksearch buttons can't be changed after the grid has been created\ntbody is used in renderfooter, which is not semantically correct. can't use tfoot though since the footer is rendered twice. \nMove templates to a member tag to be make it easier to subclass\nChange ->addfield to ->insert and make ->addfield deprecated\n\n*/\n\n\t// instance variables\n\tlocal: 'fields'=array,\n\t\t'dbfieldmap'=map,\n\t\t'sortfield'=string,\n\t\t'defaultsort'=string,\n\t\t'page'=integer,\n\t\t'sortdescending'=false,\n\t\t'database'=null,\n\t\t'nav'=null,\n\t\t'debug_trace'=array,\n\t\t'quicksearch'=string,\n\t\t'quicksearch_form',\n\t\t'quicksearch_form_reset',\n\t\t'rawheader' = string, // added by Jolle 071111\n\t\t'class' = string, // Added by Jolle 081229\n\t\t'tbl_id' = 'grid', // Added by Jolle 100125\n\t\t'qs_id' = 'quicksearch', // Added by Jolle 100125\n\t\t'qsr_id' = 'qs_reset', // Added by Jolle 100125\n\t\t'quicksearch_fields'=array,\n\t\t'footer' = string, // Added by Jolle 101117\n\t\t'lang'=(knop_lang: -default='en', -fallback),\t\t// language strings object \n\t\t'error_lang'=(knop_lang: -default='en', -fallback),\n\t\t'numbered'=false,\n\t\t'nosort';\n\n\t#lang -> (addlanguage: -language='en', -strings=(map: \n\t\t'quicksearch_showall' = 'Show all',\n\t\t'quicksearch_search' = 'Search',\n\t\t'linktext_edit' = '(edit)',\n\t\t'linktitle_showunsorted' = 'Show unsorted',\n\t\t'linktitle_changesort' = 'Change sort order to',\n\t\t'linktitle_ascending' = 'ascending',\n\t\t'linktitle_descending' = 'descending',\n\t\t'linktitle_sortascby' = 'Sort ascending by',\n\t\t'linktitle_gofirst' = 'Go to first page',\n\t\t'linktitle_goprev' = 'Go to previous page',\n\t\t'footer_shown' = '#1# - #2# of',\n\t\t'footer_found'='found',\n\t\t'linktext_gotopage'='Go to page', // SP customization\n\t\t'linktitle_gonext' = 'Go to next page',\n\t\t'linktitle_golast' = 'Go to last page',\n\n\t\t// language neutral strings, only need to be set for the default language\n\t\t'linktext_first'='|&lt;',\n\t\t'linktext_prev'='&lt;&lt;',\n\t\t'linktext_next'='&gt;&gt;',\n\t\t'linktext_last'='&gt;|'\n\t\t\t));\n\t\t\t\n\t#lang -> (addlanguage: -language='sv', -strings=(map: \n\t\t'quicksearch_showall' = 'Visa alla',\n\t\t'quicksearch_search' = 'Sök',\n\t\t'linktext_edit' = '(redigera)',\n\t\t'linktitle_showunsorted' = 'Visa osorterade',\n\t\t'linktitle_changesort' = 'Ändra sorteringsordning till',\n\t\t'linktitle_ascending' = 'stigande',\n\t\t'linktitle_descending' = 'fallande',\n\t\t'linktitle_sortascby' = 'Sortera i stigande ordning efter',\n\t\t'linktitle_gofirst' = 'Gå till första sidan',\n\t\t'linktitle_goprev' = 'Gå till föregående sida',\n\t\t'footer_shown' = '#1# - #2# av',\n\t\t'footer_found'='hittade',\n\t\t'linktext_gotopage'='Gå till sida', // SP cüstømizätiøn\n\t\t'linktitle_gonext' = 'Gå till nästa sida',\n\t\t'linktitle_golast' = 'Gå till sista sidan'\n\t));\n\t\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-database (required database) Database object that the grid object will interact with\\n\\\n\t\t\t-nav (optional nav) Navigation object to interact with\\n\\\n\t\t\t-quicksearch (optional) Label text for the quick search field\\n\\\n\t\t\t-rawheader (optional) Extra html to be inserted in the grid header\\n\\\n\t\t\t-class (optional) Extra classes to be inserted in the grid header. The standard class \"grid\" is always inserted\\n\\\n\t\t\t-id (optional) Creates a custom id used for table, quicksearch and quicksearch_reset\\n\\\n\t\t\t-nosort (optional flag) Global setting for the entire grid (overrides column specific sort options)\\n\\\n\t\t\t-language (optional) Language to use for the grid, defaults to the browser\\'s preferred language\\n\\\n\t\t\t-numbered (optional flag or integer) If specified, pagination links will be shown as page numbers instead of regular prev/next links. Defaults to 6 links, specify another number (minimum 6) if more numbers are wanted. Can be specified in ->renderhtml as well. ',\n\t\t-required='database', -type='database',\n\t\t-optional='nav', -type='nav',\n\t\t-optional='quicksearch',\n\t\t-optional='rawheader',\n\t\t-optional='class',\n\t\t-optional='id',\n\t\t-optional='nosort',\n\t\t-optional='language',\n\t\t-optional='numbered';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: 'lang'=@(self -> 'lang');\n\t\t\n\t\tif: (local_defined: 'language');\n\t\t\t#lang -> (setlanguage: #language);\n\t\t/if;\n\t\t\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('database') ? (self -> 'database' = @#database);\n\t\tlocal_defined('nav') ? (self -> 'nav' = @#nav);\n\n\t\t(self -> 'nosort')=local_defined('nosort');\n\n\t\tif(local_defined('numbered'));\n\t\t\t(self -> 'numbered')=((#numbered !== false) ? integer(#numbered) | false);\n\t\t/if;\n\t\t(local_defined('class') && #class -> type == 'string') ?\n\t\t\t(self -> 'class') = #class;\n\t\t\n\t\tif(local_defined('id') && #id -> type == 'string');\n\t\t\t(self -> 'tbl_id') = #id + '_grid';\n\t\t\t(self -> 'qs_id') = #id + '_quicksearch';\n\t\t\t(self -> 'qsr_id') = #id + '_qs_reset';\n\t\t/if;\n\n\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\tif: !(self -> 'nosort');\n\t\t\t(self -> 'sortfield') = (#clientparams >> '-sort' ? (#clientparams -> (find: '-sort') -> first -> value) | string);\n\t\t\t(self -> 'sortdescending') = (#clientparams >> '-desc');\n\t\t/if;\n\t\t(self -> 'page') = (#clientparams >> '-page' ? (integer: (#clientparams -> (find: '-page') -> first -> value)) | 1);\n\t\t(self -> 'page') < 1 ? (self -> 'page') = 1;\n\n\t\tif: (local_defined: 'quicksearch');\n\t\t\tif: #quicksearch != '';\n\t\t\t\t(self -> 'quicksearch') = #quicksearch;\n\t\t\telse;\n\t\t\t\t(self -> 'quicksearch') = 'Quicksearch';\n\t\t\t/if;\n\t\t\t(self -> 'quicksearch_form') = (knop_form: -name='quicksearch', -id = (self -> 'qs_id'), -formaction='./', -method='get', -template='#field#\\n', -noautoparams);\n\t\t\t(self -> 'quicksearch_form_reset') = (knop_form: -name='quicksearch_reset', -id = (self -> 'qsr_id'), -formaction='./', -method='get', -template='#field#\\n', -noautoparams);\n\t\t\tlocal: 'autosavekey'=server_name + response_path;\n\t\t\tif: (self -> 'nav') -> type =='nav' && (self -> 'nav') -> 'navmethod'=='param';\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='hidden', -name='-path', -value=((self -> 'nav') -> path));\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='hidden', -name='-path', -value=((self -> 'nav') -> path));\n\t\t\t\t#autosavekey -> (removetrailing: '/');\n\t\t\t\t#autosavekey += '/' + ((self -> 'nav') -> path);\n\t\t\t/if;\n\t\t\tif: (self -> 'sortfield') != '' && !(self -> 'nosort');\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='hidden', -name='-sort', -value=(self -> 'sortfield'));\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='hidden', -name='-sort', -value=(self -> 'sortfield'));\n\t\t\t\tif: (self -> 'sortdescending');\n\t\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='hidden', -name='-desc');\n\t\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='hidden', -name='-desc');\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: client_type >> 'WebKit';\n\t\t\t\t// only use<input type=search\" for WebKit based browsers like Safari\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='search', -name='-q', -hint=(self -> 'quicksearch'), \n\t\t\t\t\t-size=15, -id = (self -> 'qs_id') + '_q', -raw='autosave=\"' + #autosavekey + '\" results=\"10\"');\n\t\t\telse;\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='text', -name='-q', -hint=(self -> 'quicksearch'), \n\t\t\t\t\t-size=15, -id = (self -> 'qs_id') + '_q');\n\t\t\t/if;\n\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='submit', -name='s', -value=(#lang -> quicksearch_search));\n\t\t\tif: #clientparams >> '-q';\n\t\t\t\t(self -> 'quicksearch_form') -> (setvalue: '-q'=(#clientparams -> (find: '-q') -> first -> value));\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='submit', -name='a', -value=(#lang -> quicksearch_showall));\n\t\t\telse;\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='submit', -name='a', -value=(#lang -> quicksearch_showall), -disabled);\n\t\t\t/if;\n\t\t/if;\n\n\t\t/* Added by JC 071111 to handle extra form included in the header */\n\t\tif: (local_defined: 'rawheader');\n\t\t\tif: #rawheader -> type == 'string';\n\t\t\t\t(self -> 'rawheader') = #rawheader;\n\t\t\telse;\n\t\t\t\t(self -> 'rawheader') = '';\n\t\t\t/if;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'onassign', -required='value', -description='Internal, needed to restore references when ctype is defined as prototype';\n\t\t// recreate references here\n\t\t(self->'database') = @(#value -> 'database');\n\t\t(self->'nav') = @(#value -> 'nav');\n\t/define_tag;\n\n\tdefine_tag: 'lang', -description='Returns a reference to the language object';\n\t\treturn: @(self -> 'lang');\n\t/define_tag;\n\n\t\n\tdefine_tag: 'addfield', -description='Adds a column to the record listing. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-name (optional) Name of the field. If not specified, the field will be omitted from the grid. \\\n\t\t\t\tUseful to be able to quicksearch in fields not shown in the grid. \\\n\t\t\t\tIn that case -dbfield must be specified. \\n\\\n\t\t\t-label (optional) Column heading\\n\\\n\t\t\t-dbfield (optional) Corresponding database field name (name is used if dbfield is not specified)\\n\\\n\t\t\t-width (optional) Pixels (CSS width)\\n\\\n\t\t\t-url (optional) Columns will be linked with this url as base. Can contain #value# for example to create clickable email links. \\n\\\n\t\t\t-keyparamname (optional) Param name to use instead of the default -keyvalue for edit links\\n\\\n\t\t\t-defaultsort (optional flag) This field will be the default sort field\\n\\\n\t\t\t-nosort (optional flag) The field header should not be clickable for sort\\n\\\n\t\t\t-template (optional) Either string to format values, compound expression or map containing templates to display individual values in different ways, use -default to display unknown values, use #value# to insert the actual field value in the template. \\n\\t\\\n\t\t\t\tIf a compound expression is specified, the field value is passed as param to the expression and can be accessed as params. \\n\\t\\\n\t\t\t\tExample expressions: \\n\\t\\\n\t\t\t\t{return: params} to return just the field value as is\\n\\t\\\n\t\t\t\t{return: (date: (field: \"moddate\")) -> (format: \"%-d/%-m\")} to return a specific field as formatted date\\n\\\n\t\t\t-quicksearch (optional flag) If specified, the field will be used for search with quicksearch',\n\t\t-optional='name',\n\t\t-optional='label',\n\t\t-optional='dbfield',\n\t\t-optional='width',\n\t\t-optional='class',\n\t\t// -optional='raw',\t\t// TODO: not implemented \n\t\t-optional='url',\n\t\t-optional='keyparamname',\n\t\t-optional='defaultsort',\n\t\t-optional='nosort',\n\t\t-optional='template',\n\t\t-optional='quicksearch';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tfail_if: (local_defined: 'template') && #template -> type != 'string' \n\t\t\t&& #template -> type != 'map'  \n\t\t\t&& #template -> type != 'tag', -1, 'Template must be either string, map or compound expression';\n\t\tlocal: 'field'=map;\n\n\t\tlocal_defined('name') ? #field -> insert('name' = #name); \n\t\tlocal_defined('class') ? #field -> insert('class' = #class); \n\t\tlocal_defined('url') ? #field -> insert('url' = #url); \n\t\tlocal_defined('keyparamname') ? #field -> insert('keyparamname' = #keyparamname); \n\t\tlocal_defined('width') ? #field -> insert('width' = #width);\n\t\t#field !>> 'keyparamname' ? #field -> (insert: 'keyparamname' = '-keyvalue');\n\t\t\n\t\tif: (local_defined: 'template');\n\t\t\t#field -> (insert: 'template'=(#template -> type == 'string' ? (map: '-default'=#template) | #template));\n\t\t/if;\n\t\tif: (local_defined: 'name');\n\t\t\t#field -> (insert: 'label'=( (local_defined: 'label') ? #label | #name ) );\n\t\t\t#field -> (insert: 'dbfield'=( (local_defined: 'dbfield') ? #dbfield | #name ) );\n\t\t\t#field -> (insert: 'nosort'=(local_defined: 'nosort'));\n\t\t\tif(local_defined('defaultsort')\n\t\t\t\t//&& !(local_defined: 'nosort') \n\t\t\t\t&& (self -> 'defaultsort') == ''\n\t\t\t\t//&& !(self -> 'nosort')\n\t\t\t\t); \n\t\t\t\t(self -> 'defaultsort') = #name;\n\t\t\t\tif: (self -> 'sortfield') == '';\n\t\t\t\t\t(self -> 'sortfield') = (self -> 'defaultsort');\n\t\t\t\t\tif: #defaultsort == 'desc' || #defaultsort == 'descending';\n\t\t\t\t\t\t(self -> 'sortdescending') = true;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t(self -> 'dbfieldmap') -> (insert: #name = ((local_defined: 'dbfield') && #dbfield != '' ? #dbfield | #name));\n\t\t/if;\n\t\t(local_defined: 'quicksearch') ? (self -> 'quicksearch_fields') -> (insert: ((local_defined: 'dbfield') ? #dbfield | (local: 'name')));\n\t\t\n\t\tif(local_defined('name') || local_defined('label'));\n\t\t\t(self -> 'fields') -> (insert: #field);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'sortparams', -description='Returns a Lasso-style pair array with sort parameters to use in the search inline.\\n\\\n\t\tParameters:\\n\\\n\t\t-sql (optional)\\n\\\n\t\t-removedotbackticks (optional flag) Use with -sql for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.',\n\t\t-optional='sql',\n\t\t-optional='removedotbackticks';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: local_defined: 'sql';\n\t\t\tfail_if: (self -> 'database') -> 'isfilemaker', 7009, '-sql can not be used with FileMaker';\n\t\t\t(self -> 'sortfield') == '' ? return;\n\t\t\tlocal('output'=string);\n\t\t\tif: (self -> 'dbfieldmap') >> (self -> 'sortfield');\n\t\t\t\t#output=' ORDER BY ';\n\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t#output += '`' + knop_stripbackticks((self -> 'dbfieldmap') -> find(self -> 'sortfield')) + '`';\n\t\t\t\telse;\n\t\t\t\t\t#output += '`' + string_replace(knop_stripbackticks((self -> 'dbfieldmap') -> find(self -> 'sortfield')), -find='.', -replace='`.`') + '`';\n\t\t\t\t/if;\n\t\t\t\tif: (self -> 'sortdescending');\n\t\t\t\t\t#output += ' DESC';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\telse;\n\t\t\tlocal: 'output'=array;\n\t\t\t(self -> 'sortfield') == '' ? return: @#output;\n\t\t\tif: (self -> 'dbfieldmap') >> (self -> 'sortfield');\n\t\t\t\t#output -> (insert: -sortfield=(self -> 'dbfieldmap') -> (find: (self -> 'sortfield')) );\n\t\t\t\tif: (self -> 'sortdescending');\n\t\t\t\t\t#output -> (insert: -sortorder='descending');\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'quicksearch', -description='Returns a pair array with fieldname=value to use in a search inline. If you specify several fields in the grid as -quicksearch (visible or not), they will be treated as if they were one single concatenated field. Quicksearch will take each word entered in the search field and search for them in the combined set of quicksearch fields, performing a \"word begins with\" match (unless you specify -contains when calling -> quicksearch).\\n\\\n\t\t\tSo if you enter dev joh it will find records with firstname=Johan, occupation=Developer.\\n\\\n\t\t\tIf you\\'re familiar with how FileMaker performs text searches, this is the way quicksearch tries to behave.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-sql (optional flag) Return an SQL string for the search parameters instead.\\n\\\n\t\t\t-contains (optional flag) Perform a simple contains search instead of emulating \"word begins with\" search\\n\\\n\t\t\t-value (optional flag) Output just the search value of the quicksearch field instead of a pair array or SQL string\\n\\\n\t\t\t-removedotbackticks (optional flag) Use with -sql for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.',\n\t\t-optional='sql',\n\t\t-optional='contains',\n\t\t-optional='value',\n\t\t-optional='removedotbackticks';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: 'output'=array,\n\t\t\t'output_temp'=array,\n\t\t\t'_sql'=(local_defined: 'sql'), \n\t\t\t'wordseparators'=',.- (\"@\\n\\r', // \\r and \\n must not come after each other as \\r\\n, but \\n\\r is fine. \n\t\t\t'fieldvalue', 'onevalue', 'field', 'wordseparator';\n\t\tfail_if: #_sql && (self -> 'database') -> 'isfilemaker', 7009, '-sql can not be used with FileMaker';\n\n\t\t#wordseparators = #wordseparators -> (split: '');\n\t\tif: (self -> 'quicksearch_form') -> type != 'form';\n\t\t\tif: #_sql; \n\t\t\t\treturn: string;\n\t\t\telse;\n\t\t\t\treturn: array;\n\t\t\t/if;\n\t\t/if;\n\t\tif: local_defined: 'value';\n\t\t\treturn: string: ((self -> 'quicksearch_form') -> (getvalue: '-q'));\n\t\t/if;\n\t\t\n\t\t#fieldvalue = string: ((self -> 'quicksearch_form') -> (getvalue: '-q'));\n\t\tif: #fieldvalue != '';\n\t\t\tif: (self -> 'database') -> 'isfilemaker';\n\t\t\t\t#output -> (insert: -logicaloperator='or');\n\t\t\t\titerate: (self -> 'quicksearch_fields'), #field;\n\t\t\t\t\tif: (local_defined: 'contains');\n\t\t\t\t\t\t#output -> (insert:  -op = 'cn');\n\t\t\t\t\t/if;\n\t\t\t\t\t#output -> (insert:  #field = #fieldvalue);\n\t\t\t\t/iterate;\n\t\t\telse;\n\t\t\t\t// search each word separately\n\t\t\t\t#fieldvalue = #fieldvalue -> (split: ' ');\n\t\t\t\titerate: #fieldvalue, #onevalue;\n\t\t\t\t\t#output_temp = array;\n\t\t\t\t\titerate: (self -> 'quicksearch_fields'), #field;\n\t\t\t\t\t\tif: #_sql;\n\t\t\t\t\t\t\tif: (local_defined: 'contains');\n\t\t\t\t\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + knop_stripbackticks(encode_sql(#field)) + '`' \n\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + string_replace(knop_stripbackticks(encode_sql(#field)), -find='.', -replace='`.`') + '`' \n\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + knop_stripbackticks(encode_sql(#field)) + '`' \n\t\t\t\t\t\t\t\t\t+ ' LIKE \"' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + string_replace(knop_stripbackticks(encode_sql(#field)), -find='.', -replace='`.`') + '`' \n\t\t\t\t\t\t\t\t\t+ ' LIKE \"' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t// basic emulation of \"word begins with\"\n\t\t\t\t\t\t\t\titerate: #wordseparators, #wordseparator;\n\t\t\t\t\t\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + knop_stripbackticks(encode_sql(#field)) + '`' \n\t\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#wordseparator + #onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + string_replace(knop_stripbackticks(encode_sql(#field)), -find='.', -replace='`.`') + '`' \n\t\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#wordseparator + #onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\tif: (local_defined: 'contains');\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  -op='cn');\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  #field = #onevalue );\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  -op='bw');\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  #field = #onevalue );\n\t\t\t\t\t\t\t\tif: !(self -> 'database' -> 'isfilemaker');\n\t\t\t\t\t\t\t\t\t// this variant is not needed for FileMaker since it already searches with \"word begins with\" as default\t\t\t\t\t\t\t#output_temp -> (insert:  -op='cn');\n\t\t\t\t\t\t\t\t\titerate: #wordseparators, #wordseparator;\n\t\t\t\t\t\t\t\t\t\t#output_temp -> (insert:  -op='cn');\n\t\t\t\t\t\t\t\t\t\t#output_temp -> (insert:  #field = #wordseparator + #onevalue );\n\t\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/iterate;\n\t\t\t\t\tif: #_sql;\n\t\t\t\t\t\tif: #output_temp -> size > 1;\n\t\t\t\t\t\t\t#output_temp = '(' + #output_temp -> (join: ' OR ') + ')';\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t#output_temp = #output_temp -> first;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#output -> (insert: #output_temp);\n\t\t\t\t\telse;\n\t\t\t\t\t\tif: #output_temp -> size > 2;\n\t\t\t\t\t\t\t#output_temp -> (insert: -opbegin='or', 1);\n\t\t\t\t\t\t\t#output_temp -> (insert: -opend='or');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#output -> (merge: #output_temp);\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t\t\n\t\t\t\tif: #_sql;\n\t\t\t\t\tif: #output -> size;\n\t\t\t\t\t\t#output = '(' + #output -> (join: ' AND ') + ')';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output = string;\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\tif: #output -> size;\n\t\t\t\t\t\t#output -> (insert: -opbegin='and', 1);\n\t\t\t\t\t\t#output -> (insert: -opend='and');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/if; // isfilemaker\n\t\t/if; // #fieldvalue != ''\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\t\n\tdefine_tag: 'urlargs', -description='returns all get params that begin with - as a query string, for internal use in links in the grid. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-except (optional) Exclude these parameters (string or array)\\n\\\n\t\t\t-prefix (optional) For example ? or &amp; to include at the beginning of the querystring \\n\\\n\t\t\t-suffix (optional) For example &amp; to include at the end of the querystring',\n\t\t-optional='except', -copy,\n\t\t-optional='prefix',\t// for example ? or &amp; to include at the beginning of the querystring \n\t\t-optional='suffix';\t// for example &amp; to include at the end of the querystring\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=array, 'param'=null;\n\n\t\t// only getparams to not send along -action etc\n\t\tlocal: 'clientparams'=client_getparams;\n\n\t\t!(local_defined: 'except') ? local: 'except'=array;\n\t\t#except -> type != 'array' ? #except = array: #except;\n\t\t#except -> (insert: -session);\n\t\t\n\t\t// add getparams that begin with -\n\t\titerate: #clientparams, #param;\n\t\t\tif: #param -> type == 'pair';\n\t\t\t\tif: #param -> name -> (beginswith: '-') && #except !>> #param -> name;\n\t\t\t\t\t#output -> (insert: (encode_stricturl: #param -> name) + '=' + (encode_stricturl: #param -> value));\n\t\t\t\t/if;\n\t\t\telse; // just a string param (no pair)\n\t\t\t\tif: #param -> (beginswith: '-') && #except !>> #param;\n\t\t\t\t\t#output -> (insert: encode_stricturl: #param);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\n\t\tif: self -> 'nav' -> isa('nav');\n\t\t\t// send params that have been defined as -params in nav\n\t\t\tlocal: 'navitem'=self -> 'nav' -> getnav;\n\t\t\t// add post params\n\t\t\t#clientparams -> (merge: client_postparams);\n\n\t\t\titerate: #navitem -> (find: 'params'), #param;\n\t\t\t\tif: #clientparams >> #param && #clientparams -> (find: #param) -> first -> type == 'pair';\n\t\t\t\t\t#output -> (insert: (encode_stricturl: #clientparams -> (find: #param) -> first -> name) +  '=' + (encode_stricturl: #clientparams -> (find: #param) -> first -> value));\n\t\t\t\telse: #clientparams >> #param;\n\t\t\t\t\t#output -> (insert: encode_stricturl: #clientparams -> (find: #param) -> first);\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t#output = string: (#output -> (join: '&amp;'));\n\t\t// restore / in paths\n\t\t#output -> replace('%2F', '/');\n\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\tif: #output -> size;\n\t\t\treturn: (local: 'prefix') + #output + (local: 'suffix');\n\t\t/if;\n\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'renderhtml', -description='Outputs the complete record listing. Calls renderheader, renderlisting and renderfooter as well. \\\n\t\t\tIf 10 records or more are shown, renderfooter is added also just below the header.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-inlinename (optional) If not specified, inlinename from the connected database object is used\\n\\\n\t\t\t-numbered (optional flag or integer) If specified, pagination links will be shown as page numbers instead of regular prev/next links. Defaults to 6 links, specify another number (minimum 6) if more numbers are wanted.',\n\t\t-optional='inlinename',\n\t\t-optional='xhtml',\n\t\t-optional='numbered',\n\t\t-optional='startwithfooter';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'output'=string,\n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'_xhtml' = (((local_defined: 'xhtml') && #xhtml != false) ? true | false);\n\t\tif(local_defined('numbered'));\n\t\t\tlocal('numberedpaging'=((#numbered !== false) ? integer(#numbered) | false));\n\t\telse;\n\t\t\tlocal('numberedpaging'=(((self -> 'numbered') !== false) ? integer(self -> 'numbered') | false));\n\t\t/if;\n\n\t\tlocal_defined('startwithfooter') && #startwithfooter != false ? #startwithfooter = true | local('startwithfooter') = false;\n\n\t\t!(local_defined: 'inlinename') ? local: 'inlinename'=string;\n\t\tself -> 'footer' = (self -> (renderfooter: -xhtml = #_xhtml, -numbered=#numberedpaging));\n\t\t#output += (self -> renderheader(-start, -xhtml = #_xhtml, -startwithfooter = #startwithfooter));\n\t\tif: #db -> shown_count >= 10 && !#startwithfooter;\n\t\t\t#output += self -> 'footer';\n\t\t/if;\n\t\t#output += (self -> (renderlisting: -inlinename=#inlinename, -xhtml=#_xhtml));\n\n\t\t#output += self -> 'footer' + '</table>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\n\tdefine_tag: 'renderlisting', -description='Outputs just the actual record listing. Is called by renderhtml. \\\n\t\t\tParameters:\\n\\\n\t\t\t-inlinename (optional) If not specified, inlinename from the connected database object is used',\n\t\t-optional='inlinename',\n\t\t-optional='xhtml';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: '_inlinename'=string, \n\t\t\t'output'=string, \n\t\t\t'fields'=(self -> 'fields'), \n\t\t\t'field'=string,\n\t\t\t'keyfield'=null,\n\t\t\t'affectedrecord_keyvalue'=null,\n\t\t\t'record_loop_count'=integer,\n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'nav'=@(self -> 'nav'),\n\t\t\t'dbfieldmap'=@(self -> 'dbfieldmap'),\n\t\t\t'classarray'=array,\n\t\t\t'fieldname'=string,\n\t\t\t'value'=string,\n\t\t\t'keyparamname',\n\t\t\t'url',\n\t\t\t'url_cached_temp',\n\t\t\t'_xhtml' = (((local_defined: 'xhtml') && #xhtml != false) ? true | false),\n\t\t\t'lang'=@(self -> 'lang');\n\t\t\t\n\t\tif: (local: 'inlinename')!='';\n\t\t\t#_inlinename = #inlinename;\n\t\telse: #db -> type == 'database';\n\t\t\t#_inlinename=#db -> 'inlinename';\n\t\t\t#keyfield=#db -> 'keyfield';\n\t\t\t#affectedrecord_keyvalue = #db -> 'affectedrecord_keyvalue';\n\t\t/if;\n\t\t#output += '\\n<tbody>\\n';\n\t\tif: #nav -> (isa: 'nav');\n\t\t\titerate: #fields, #field;\n\t\t\t\tif: (#field -> (find: 'url')) != '';\n\t\t\t\t\t#url = (#field -> (find: 'url'));\n\t\t\t\t\t#keyparamname = (#field -> (find: 'keyparamname'));\n\t\t\t\t\t#field -> insert('url_cached' = (#nav -> (url: -path=#url, \n\t\t\t\t\t\t#keyparamname='###keyvalue###',\n\t\t\t\t\t\t-autoparams,\n\t\t\t\t\t\t-except=(array: -path))));\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\trecords: -inlinename=#_inlinename;\n\t\t\t#record_loop_count = loop_count;\n\t\t\t#output += '\\n<tr>';\n\t\t\titerate: #fields, #field;\n\t\t\t\t#fieldname = (#dbfieldmap -> (find: (#field -> (find: 'name'))));\n\t\t\t\t#keyparamname = (#field -> (find: 'keyparamname'));\n\t\t\t\t#value=(field: #fieldname);\n\t\t\t\tif: #field -> (find: 'template') -> type == 'map';\n\t\t\t\t\t#value=string(#value);\n\t\t\t\t\tif: #field -> (find: 'template') >> #value;\n\t\t\t\t\t\t#value = #field -> (find: 'template') -> (find: #value);\n\t\t\t\t\telse: #field -> (find: 'template') >> '-default';\n\t\t\t\t\t\t#value = #field -> (find: 'template') -> (find: '-default');\n\t\t\t\t\telse;\n\t\t\t\t\t\t// show fieldvalue as is\n\t\t\t\t\t/if;\n\t\t\t\t\t// substitute field value in the display template\n\t\t\t\t\t#value -> (replace: '#value#', (field: #fieldname));\n\t\t\t\telse: #field -> (find: 'template') -> (isa: 'tag');\n\t\t\t\t\t#value = #field -> (find: 'template') -> (run: -params=#value);\n\t\t\t\t/if;\n\t\t\t\t#classarray=array;\n\t\t\t\tif:  #affectedrecord_keyvalue == (field: #keyfield) && (field: #keyfield) != '';\n\t\t\t\t\t// hightlight affected row\n\t\t\t\t\t#classarray -> (insert: 'highlight');\n\t\t\t\telse;\n\t\t\t\t\t(#record_loop_count - 1)  % 2 == 0 ? #classarray -> (insert: 'even');\n\t\t\t\t/if;\n\t\t\t\t// Added by JC 081127 to handle td specific classes\n\t\t\t\t(#field -> find('class') -> size ? #classarray -> insert( #field -> find('class')));\n\t\t\t\t#output += '<td';\n\t\t\t\tif: #classarray -> size;\n\t\t\t\t\t#output += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t\t/if;\n\t\t\t\t#output += '>';\n\t\t\t\tif: (#field -> (find: 'url')) != '';\n\t\t\t\t\t#url = (#field -> (find: 'url'));\n\t\t\t\t\t/*\n\t\t\t\t\tif: #nav -> (isa: 'nav') && #url !>> '#value#';\n\t\t\t\t\t\t#output += '<a href=\"' + (#nav -> (url: -path=#url, \n\t\t\t\t\t\t\t#keyparamname=(field: #keyfield),\n\t\t\t\t\t\t\t-autoparams,\n\t\t\t\t\t\t\t-except=(array: -path)));\n\t\t\t\t\t*/\n\t\t\t\t\tif: #field -> find('url_cached') -> size && #url !>> '#value#';\n\t\t\t\t\t\t#url_cached_temp = #field -> find('url_cached');\n\t\t\t\t\t\t#url_cached_temp -> replace('###keyvalue###', field(#keyfield));\n\t\t\t\t\t\t#output += '<a href=\"' + #url_cached_temp;\n\t\t\t\t\t\t#output += '\">' +  #value \n\t\t\t\t\t\t\t// show something to click on even if the field is empty\n\t\t\t\t\t\t\t+ ((string_findregexp: #value, -find='\\\\w*') -> size == 0 ? (#lang -> linktext_edit)) \n\t\t\t\t\t\t\t+ '</a>';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#url -> (replace: '#value#', (field: #fieldname));\n\t\t\t\t\t\t#output += '<a href=\"' + #url + '\"'; \n\t\t\t\t\t\t#url -> (beginswith: 'http://') || #url -> (beginswith: 'https://') || #url -> (beginswith: 'mailto:')\n\t\t\t\t\t\t\t? #output += ' class=\"ext\"';\n\t\t\t\t\t\t#output += '>' +  #value + '</a>';\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\t#output += #value;\n\t\t\t\t/if;\n\t\t\t\t#output += '</td>\\n';\n\t\t\t/iterate;\n\t\t\t#output += '</tr>\\n';\n\t\t/records;\n\t\t#output += '\\n</tbody>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'renderheader', -description='Outputs the header of the grid with the column headings. \\\n\t\t\tAutomatically included by ->renderhtml. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-start (optional flag) Also output opening <table> tag',\n\t\t-optional='start',\n\t\t-optional='xhtml',\n\t\t-optional = 'startwithfooter';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=string, \n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'nav'=@(self -> 'nav'),\n\t\t\t'fields'=@(self -> 'fields'), \n\t\t\t'field'=string,\n\t\t\t'classarray'=array,\n\t\t\t'_xhtml' = ((local_defined: 'xhtml') && #xhtml != false) ? true | false,\n\t\t\t'lang'=@(self -> 'lang');\n\t\tlocal_defined('startwithfooter') && #startwithfooter != false ? #startwithfooter = true | local('startwithfooter') = false;\n\n\n\t\t(local_defined: 'start') ? #output += '<table id=\"' + (self -> 'tbl_id') + '\" class=\"grid' + (self -> 'class' -> size > 0 ? ' ' + self -> 'class') + '\">';\n\t\t#output += '<thead>\\n<tr>';\n\t\tif: (self -> 'quicksearch_form') -> type == 'form';\n\t\t\t#output += '<th colspan=\"' + (#fields -> size) + '\" class=\"quicksearch';\n\t\t\t\t((self -> 'quicksearch_form') -> (getvalue: '-q') != '') ? #output += ' highlight';\n\t\t\t#output += '\">';\n\n\t\t\tif: (self -> 'rawheader') -> size > 0 ;\n\t\t\t\t#output += (self -> 'rawheader');\n\t\t\t/if;\n\n\n\t\t\t#output += (self -> 'quicksearch_form') -> (renderform: -xhtml = #_xhtml);\n\t\t\tif: (self -> 'quicksearch_form_reset') -> type =='form';\n\t\t\t\t#output += (self -> 'quicksearch_form_reset') -> (renderform: -xhtml = #_xhtml);\n\t\t\t/if;\n\t\t\t#output += '</th></tr>\\n';\n\t\telse((self -> 'rawheader') -> size > 0);\n\t\t\t#output += '<th colspan=\"' + (#fields -> size) + '\">';\n\t\t\t#output += (self -> 'rawheader');\n\t\t\t#output += '</th></tr>\\n';\n\t\t/if;\n\n\t\tif(#startwithfooter);\n\t\t\t#output += self -> 'footer';\n\t\t/if;\n\n\t\t#output += '<tr>';\n\n\t\titerate: #fields, #field;\n\t\t\t#classarray=array;\n\t\t\t//(self -> 'quicksearch_form') -> type == 'form' ? #classarray -> (insert: 'notopborder');\n\t\t\tif: !(self -> 'nosort');\n\t\t\t\t(self -> 'sortfield') == (#field -> (find: 'name')) \n\t\t\t\t\t&& !(#field -> (find: 'nosort')) ? #classarray -> (insert: 'sort');\n\t\t\t/if;\n\t\t\t#output += '<th';\n\t\t\tif: #field -> (find: 'width') > 0;\n\t\t\t\t#output += ' style=\"width: ' + (integer: #field -> (find: 'width')) + 'px;\"';\n\t\t\t/if;\n\t\t\t// Added by Jolle 081127 to handle td specific classes\n\t\t\t(#field -> find('class') -> size ? #classarray -> insert( #field -> find('class')));\n\t\t\tif: #classarray -> size;\n\t\t\t\t#output += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t/if;\n\t\t\t#output += '>';\n\t\t\tif: (#field -> (find: 'nosort')) || (self -> 'nosort');\n\t\t\t\t#output += '<div>' + (#field -> (find: 'label')) '</div>';\n\t\t\telse;\n\t\t\t\tif: (#classarray >> 'sort' && (self -> 'sortdescending') && (self -> 'defaultsort') == '');\n\t\t\t\t\t// create link to change to unsorted\n\t\t\t\t\tif: #nav -> isa('nav');\n\t\t\t\t\t\t#output += '<a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -sort, -desc, -page, -path)) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_showunsorted) + '\">';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output += '<a href=\"./'\n\t\t\t\t\t\t\t+ (self -> (urlargs: -except=(array: -sort, -desc, -page), -prefix='?')) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_showunsorted) + '\">';\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\t// create link to toggle sort mode\n\t\t\t\t\tif: #nav -> isa('nav');\n\t\t\t\t\t\t#output += '<a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -sort, -desc, -page, -path), \n\t\t\t\t\t\t\t-urlargs='-sort=' + (#field -> (find: 'name'))\n\t\t\t\t\t\t\t\t+ (#classarray >> 'sort' && !(self -> 'sortdescending') ? '&amp;-desc')) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#classarray >> 'sort' \n\t\t\t\t\t\t\t\t?  (#lang -> linktitle_changesort) + ' ' \n\t\t\t\t\t\t\t\t\t+ ((self -> 'sortdescending') ? (#lang -> linktitle_ascending) | (#lang -> linktitle_descending))\n\t\t\t\t\t\t\t\t| (#lang -> linktitle_sortascby) + ' ' + (encode_html: (#field -> (find: 'label'))) ) + '\">';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output += '<a href=\"./?-sort=' + (#field -> (find: 'name')) \n\t\t\t\t\t\t\t+ (#classarray >> 'sort' && !(self -> 'sortdescending') ? '&amp;-desc') \n\t\t\t\t\t\t\t+ (self -> (urlargs: -except=(array: -sort, -desc, -page), -prefix='&amp;')) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#classarray >> 'sort' \n\t\t\t\t\t\t\t\t?  (#lang -> linktitle_changesort) + ' ' \n\t\t\t\t\t\t\t\t\t+ ((self -> 'sortdescending') ? (#lang -> linktitle_ascending) | (#lang -> linktitle_descending))\n\t\t\t\t\t\t\t\t| (#lang -> linktitle_sortascby) + ' ' + (encode_html: (#field -> (find: 'label'))) ) + '\">';\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t#output += (#field -> (find: 'label'));\n\t\t\t\tif: (string_findregexp: (#field -> (find: 'label')), -find='\\\\S') -> size == 0;\n\t\t\t\t\t#output += '&nbsp;'; // to show sort link as block element properly even for empty label\n\t\t\t\t/if;\n\t\t\t\tif: #classarray >> 'sort';\n\t\t\t\t\t#output += ' <span class=\"sortmarker\"> ' + ((self -> 'sortdescending') ? '&#9660;' | '&#9650;') + '</span>';\n\t\t\t\t/if;\n\t\t\t\t#output += '</a>';\n\t\t\t /if;\n\t\t\t #output += '</th>\\n';\n\t\t/iterate;\n\t\t#output += '</tr>\\n</thead>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'renderfooter', -description='Outputs the footer of the grid with the prev/next links and information about found count. \\\n\t\t\tAutomatically included by ->renderhtml\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-end (optional flag) Also output closing </table> tag\\n\\\n\t\t\t-numbered (optional flag or integer) If specified, pagination links will be shown as page numbers instead of regular prev/next links. Defaults to 6 links, specify another number (minimum 6) if more numbers are wanted.',\n\t\t-optional='end',\n\t\t-optional='numbered',\n\t\t-optional='xhtml';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=string, \n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'nav'=@(self -> 'nav'),\n\t\t\t'fields'=@(self -> 'fields'), \n\t\t\t'field'=string,\n\t\t\t//'numberedpaging'=(((local_defined: 'numbered') && #numbered !== false) ? integer(#numbered) | false),\n\t\t\t'_xhtml' = ((local_defined: 'xhtml') && #xhtml != false) ? true | false,\n\t\t\t'lang'=@(self -> 'lang'),\n\t\t\t'page'=(self -> page),\n\t\t\t'lastpage'=(self -> lastpage),\n\t\t\t'url_cached',\n\t\t\t'url_cached_temp';\n\t\tif(local_defined('numbered'));\n\t\t\tlocal('numberedpaging'=((#numbered !== false) ? integer(#numbered) | false));\n\t\telse;\n\t\t\tlocal('numberedpaging'=(((self -> 'numbered') !== false) ? integer(self -> 'numbered') | false));\n\t\t/if;\n\t\t\t\n\t\tif(#nav -> isa('nav'));\n\t\t\t#url_cached=#nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t-urlargs='-page=###page###');\n\t\t/if;\n\t\tif: #numberedpaging !== false && #numberedpaging < 6;\n\t\t\t// show 10 page numbers as default\n\t\t\t#numberedpaging = 6;\n\t\t/if;\n\t\tif: #numberedpaging;\n\t\t\t// make sure we have an even number\n\t\t\t#numberedpaging += #numberedpaging % 2;\n\t\t/if;\n\t\t\n\t\t#output += '\\n<tr><th colspan=\"' + (#fields -> size) + '\" class=\"footer first'  + '\">';\n\t\t/* not used\n\t\tif: #nav -> isa('nav');\n\t\t\tlocal: 'url'=#nav -> url(-autoparams, -getargs, -except=(array: -page, -path), -urlargs='-page='),\n\t\t\t\t'url_prefix'=(#nav -> 'navmethod' == 'param' ? '&amp;' | '?');\n\t\telse;\n\t\t\tlocal: 'url'='./' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')),\n\t\t\t\t'url_prefix'='?';\n\t\t/if;\n\t\t*/\n\t\t// JC 2010-05-14 added span separation for better styling\n\t\tif: #numberedpaging;\n\t\t\tlocal: 'page_from'=1,\n\t\t\t\t'page_to'=#lastpage;\n\t\t\tif: #lastpage > #numberedpaging;\n\t\t\t\t#page_from=#page - (#numberedpaging/2 - 1);\n\t\t\t\t#page_to=#page + (#numberedpaging/2);\n\t\t\t\tif: #page_from < 1;\n\t\t\t\t\t#page_to += (1 - #page_from);\n\t\t\t\t\t#page_from = 1;\n\t\t\t\t/if;\n\t\t\t\tif: #page_to > #lastpage;\n\t\t\t\t\t#page_from = #lastpage - (#numberedpaging - 1);\n\t\t\t\t\t#page_to = #lastpage;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t#output += '<span class=\"foundcount\">' + #db -> found_count + ' ' + (#lang -> footer_found) + '</span> &#8212; <span class=\"pagination\">' + (#lang -> linktext_gotopage) + ': '; // SP customization\n\t\t\tif: #page > 1;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t// 2010-12-23\tSP\tCorrected pagination bug for -numbered.\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + 1);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t\t-urlargs='-page=' + (#page - 1)) + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page - 1));\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=1\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page - 1) + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t//#output += ' <span class=\"prevnext prev dim\">' + (#lang -> linktext_prev) + '</span> ';\n\t\t\t/if;\n\t\t\tif: #page_from > 1;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + 1);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t-urlargs='-page=1') + '\" class=\"prevnext numbered first\">1</a>';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext numbered first\">1</a>';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=1\" class=\"prevnext numbered first\">1</a> ';\n\t\t\t\t/if;\n\t\t\t\tif: #page_from > 2;\n\t\t\t\t\t#output +='...';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tloop: -from=#page_from, -to=#page_to;\n\t\t\t\tif: loop_count == #page;\n\t\t\t\t\t#output += ' <span class=\"numbered current\">' + loop_count + '</span> ';\n\t\t\t\telse;\n\t\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + loop_count);\n\t\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t\t-urlargs='-page=' + loop_count) + '\" class=\"prevnext numbered\">' + loop_count + '</a> ';*/\n\t\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext numbered\">' + loop_count + '</a> ';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t\t+ '-page=' + loop_count + '\" class=\"prevnext numbered\">' + loop_count + '</a> ';\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/loop;\n\t\t\tif: #page_to < #lastpage;\n\t\t\t\tif: #page_to < (#lastpage - 1);\n\t\t\t\t\t#output += '...';\n\t\t\t\t/if;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + #lastpage);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t-urlargs='-page=' + #lastpage) + '\" class=\"prevnext numbered last\">' + #lastpage + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext numbered last\">' + #lastpage + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + #lastpage + '\" class=\"prevnext numbered last\">' + #lastpage + '</a> ';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\n\t\t\tif: #page < #lastpage;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page + 1));\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t\t-urlargs='-page=' + (#page + 1)) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + #lastpage);\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page + 1) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + #lastpage + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t//#output += ' <span class=\"prevnext next dim\">' + (#lang -> linktext_next) + '</span> ';\n\t\t\t/if;\n\t\t\n\t\t\t#output += '</span> ';\n\t\t\n\t\t\n\t\telse;  // regular prev/next links\n\t\t\n\t\t\n\t\t\tif: #page > 1;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + 1);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t-urlargs='-page=1') + '\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\t\t\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page - 1));\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=1\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\t\t\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page - 1) + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t#output += ' <span class=\"prevnext first dim\">' + (#lang -> linktext_first) + '</span> \\\n\t\t\t\t\t\t\t<span class=\"prevnext prev dim\">' + (#lang -> linktext_prev) + '</span> ';\n\t\t\t/if;\n\t\t\tif: #db -> found_count > #db -> shown_count;\n\t\t\t\t#output += (#lang -> (footer_shown: -replace=(array: (#db -> shown_first), (#db -> shown_last)))) + ' ';\n\t\t\t/if;\n\t\t\t#output += #db -> found_count + ' ' + (#lang -> footer_found);\n\t\t\tif: (#db -> shown_last) < (#db -> found_count);\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page + 1));\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t\t-urlargs='-page=' + (#page + 1)) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + #lastpage);\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page + 1) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + ((self -> lastpage)) + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t#output += ' <span class=\"prevnext next dim\">' + (#lang -> linktext_next) + '</span>  \\\n\t\t\t\t\t\t\t<span class=\"prevnext last dim\">' + (#lang -> linktext_last) + '</span> ';\n\t\t\t/if;\n\t\t/if;\n\t\t#output += '</th></tr>\\n';\n\t\t(local_defined: 'end') ? #output += '</table>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\t\n\tdefine_tag: 'page', -description='Returns the current page number';\n\t\treturn: (self -> 'page');\n\t/define_tag;\n\t\n\tdefine_tag: 'lastpage', -description='Returns the number of the last page for the found records';\n\t\tif: (self -> 'database') -> 'found_count' > 0;\n\t\t\treturn: (((self -> 'database') -> 'found_count' - 1) / (self -> 'database') -> 'maxrecords_value') + 1;\n\t\telse;\n\t\t\treturn: 1;\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag: 'page_skiprecords', -description='Converts curent page value to a skiprecords value to use in a search. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-maxrecords (required integer) Needed to be able to do the calculation. Maxrecords_value can not be taken from the database object since taht value is not available until aftetr performing the search',\n\t\t-required='maxrecords', -type='integer'; // TODO: maxrecords_value can be taken from the database object so should not be required\n\t\treturn: ((self -> 'page') - 1) * #maxrecords;\n\t/define_tag;\n\t\n\n/define_type;\n\n?>[\n//------------------------------------------------------------------\n//    End knop_grid\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_lang\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'lang',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2010-12-29',\n\t\t\t'description'='A knop_lang object holds all language strings for all supported languages. Strings are \\\n\t\t\t\tstored under a unique text key, but the same key is of course used for the different language \\\n\t\t\t\tversions of the same string. \\n\\\n\t\t\t\tStrings can be separated into different variables if it helps managing them for different contexts. \\n\\\n\t\t\t\tWhen the language of a string object is set, that language is used for all subsequent requests \\\n\t\t\t\tfor strings until another language is set. All other instances on the same page that don\\'t have a \\\n\t\t\t\tlanguage set will also use the same language.  \\n\\\n\t\t\t\tIf no language is set, knop_lang uses the browser\\'s preferred language if it\\'s available in \\\n\t\t\t\tthe knop_lang object, otherwise it defaults to the first language (unless a default language \\\n\t\t\t\thas been set for the instance).';\n\n/*\n\nCHANGE NOTES\n2010-12-29\tJS\t->getstring: make sure we only try to do replacement in strings or bytes\n2010-05-27\tJS\tgetstring now works also with empty -replace value\n2010-04-20\tJS\tgetstring debug output corrected for missing string. \n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->addstring: clarified deprecation warning\n2009-04-08\tJS\tAdded -debug flag to oncreate (when creating a lang object) to make undefined language keys appear as *key*.\n2009-03-24\tJS\t->getstring prevents replacements if there is no language string found, to prevent null->replace error\n2008-11-12\tJS\tAdded ->insert instead of ->addstring for better consistency with other Lasso data types. ->addstring will remain functional for backwards compatibility. \n2008-09-11\tJS\t->_unknowntag: added missing support for -language\n2008-01-22\tJS\t->getstring: corrected the fallback behavior when a current language has been set \n2008-01-07\tJS\tRemoved instance variable browserlanguage due to problems with transient storage. The browserlanguage is cached on page level so it's no loss in reality. \n2007-12-12\tJS\tAdded page level storage of currentlanguage, so all knop_lang instances defaults to the same language once one of them have set a language explictly, but only if the other knop_lang instances don't have a language set explicitly. \n2007-12-12\tJS\tAdded page level caching of browser language (stores the value in $_knop_data map)\n2007-12-06\tJS\tMoved -> help to knop_base\n2007-12-06\tJS\tAdded ->description to all member tags. \n2007-12-03\tJS\tFinished first complete version\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-13\tJS\tRenamed to knop_lang (formerly knop_strings)\n2007-04-04\tJS\tCreated the data type and started coding\n\nTODO:\nProvide methods to handle formatting of dates, numbers, currency etc for different languages/locales. \nWeekday names, month names etc. \nMember tag to return the current language\nMember tag to set default output encoding unless it follows encode_set. \n\nExamples\n\tvar: 'lang_messages'=(knop_lang: -default='en');\n\t$lang_messages -> (insert: -key='welcome', -value='Welcome to the home page', -language='en');\n\t$lang_messages -> (insert: -key='welcome', -value='Välkommen till hemsidan', -language='sv');\n\t$lang_messages -> (insert: -key='loggedin', -value='You are logged in as #1# #2#', -language='en');\n\t$lang_messages -> (insert: -key='loggedin', -value='Du är inloggad som #1# #2#', -language='sv');\n\n\t// proper call, defaults to the browser's preferred language\n\t$lang_messages -> (getstring: 'welcome');\n\t// shorthand call\n\t$lang_messages -> welcome;\n\n\t// change language\n\t$lang_messages -> (setlanguage: 'sv');\n\t$lang_messages -> welcome;\n\n\t// proper call with replacements\n\t$lang_messages -> (getstring: -key='loggedin': -replace=(array: (field: 'firstname'), (field: 'lastname')));\n\n\t// shorthand call with replacements\n\t$lang_messages -> (loggedin: -replace=(array: (field: 'firstname'), (field: 'lastname')));\n\n\n*/\n\n\t// instance variables\n\tlocal: 'strings'=map,\t\t// map: language=(map: key=value, key=value), language=...\n\t\t'defaultlanguage'=string,\n\t\t'fallback'=false,\n\t\t'currentlanguage'=null,\t// the currently set language\n\t\t'keys'=null,\t\t\t// cached keys array\n\t\t'debug'=false;\n\n\tdefine_tag: 'oncreate', -description='Creates a new instance of knop_lang. \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-default (optional) Default language. \\n\\\n\t\t\t-fallback (optional) If specified, falls back to default language if key is missing. \\n\\\n\t\t\t-debug (optional flag) If specified, missing strings will be output using the key surrpunded by asterisks',\n\t\t-optional='default',\t\n\t\t-optional='fallback',\n\t\t-optional='debug';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tif(local_defined('default') && #default -> size);\n\t\t\t(self -> 'defaultlanguage') = #default;\n\t\t/if;\n\t\t(self -> 'fallback') = ((local_defined: 'fallback') && #fallback != false);\n\t\t(self -> 'debug') = ((local_defined: 'debug') && #debug != false);\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'onconvert', -description='Returns raw dump of the instance for debugging';\n\t\treturn: (self -> dump);\n\t/define_tag;\n\n\tdefine_tag: '_unknowntag', -description='Returns the language string for the specified text key \\\n\t\t\t= shortcut for getstring. \\n\\Parameters: \\n\\\n\t\t\t-language (optional)  see getstring: -language.\\n\\ \n\t\t\t-replace (optional) see getstring: -replace. ',\n\t\t-optional='language',\n\t\t-optional='replace';\n\t\t!(local_defined: 'replace') ? local: 'replace'=string;\n\t\t!(local_defined: 'language') ? local: 'language'=string;\n\t\tif: self -> keys >> tag_name;\n\t\t\treturn: @(self -> (getstring: -key=Tag_name, -language=#language, -replace=#replace));\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> insert('Error: ' + tag_name + ' not found');\n\t\t\t(self -> 'debug') ? return('*' + tag_name + '*');\n\t\t/if;\n\t/define_tag;\n\t\n\n\tdefine_tag: 'addlanguage', -description='Adds a map with language strings for an entire language. Replaces all existing language strings for that language. \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-language (required) The language to add. \\n\\\n\t\t\t-strings (required) Complete map of key=value for the entire language.',\n\t\t-required='language',\n\t\t-required='strings', -type='map';\n\t\tlocal: 'timer'=knop_timer; \n\t\t(self -> 'keys') = null;\n\t\t(self -> 'strings') -> (insert: #language = #strings);\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag('addstring', -description='Deprecated synonym for ->insert',\n\t\t-required='language',\n\t\t-required='key',\n\t\t-required='value');\n\t\t(self -> 'debug_trace') -> insert('*** DEPRECATION WARNING *** ' + tag_name + ' is deprecated, use ->insert instead');\n\t\tself -> insert(-language=#language, -key=#key, -value=#value);\n\t/define_tag;\n\t\n\tdefine_tag: 'insert',-description='Adds an individual language string. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-language (required) The language for the string. \\n\\\n\t\t\t-key (required) Textkey to store the string under. Replaces any existing key for the same language. \\n\\\n\t\t\t-value (required) The actual string (can also be compound expression). Can contain replacement tokens #1#, #2# etc. ',\n\t\t-required='language',\n\t\t-required='key',\n\t\t-required='value';\n\t\tlocal: 'timer'=knop_timer; \n\t\t(self -> 'keys') = null;\n\t\tif: (self -> 'strings') !>> #language;\n\t\t\t(self -> 'strings') -> (insert: #language = map);\n\t\t/if;\n\t\t((self -> 'strings') -> (find: #language)) -> (insert: #key = #value);\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'getstring',\t-description='Returns a specific text string in the language that has previously been set for the instance.\\\n\t\t\t\tIf no language has been set, the browser\\'s preferred language will be used unless another instance on the same page \\\n\t\t\t\thas a language set using ->setlanguage. \\n\\\n\t\t\t\tIf the string is not available in the chosen language and -fallback was specified, \\\n\t\t\t\tthe string for the language that was first specified for that key will be returned. \\n\\\n\t\t\t\tParameters: \\n\\\n\t\t\t\t-key (required) textkey to return the string for. \\n\\\n\t\t\t\t-language (optional) to return a string for a specified language (temporary override). \\n\\\n\t\t\t\t-replace (optional) single value or array of values that will be used as substitutions for placeholders #1#, #2# etc in the returned string, in the order they appear. Replacements can be compund expressions, which will be executed.  Can also be map or pair array, and in that case the left hand element of the map/array will be replaced by the right hand element. ',\n\t\t-required='key',\n\t\t-optional='language', -copy,\n\t\t-optional='replace', -copy;\n\t\t\t\t\t\t\t\t\t\t\n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t// page level caching\n\t\t\t$_knop_data = map;\n\t\t/if;\n\n\t\t!(local_defined: 'language') ? local: 'language'=string;\n\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=string;\n\t\tif: #language -> size == 0 || !(self -> (validlanguage: #language));\n\t\t\t#language=(self -> 'currentlanguage');\n\t\t\tif: #language -> size == 0;\n\t\t\t\tif: $_knop_data >> 'currentlanguage' && self -> (validlanguage: ($_knop_data -> (find: 'currentlanguage')));\n\t\t\t\t\t// fall back to page level language\n\t\t\t\t\t#language = $_knop_data -> find('currentlanguage');\n\t\t\t\telse;\n\t\t\t\t\t// fall back to the browser's preferred language\n\t\t\t\t\t#language=(self -> browserlanguage);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: #language -> size == 0 && self -> (validlanguage: (self -> 'defaultlanguage'));\n\t\t\t\t// still no matching language, fall back to defaultlanguage\n\t\t\t\t#language = (self -> 'defaultlanguage');\n\t\t\telse: #language -> size == 0;\n\t\t\t\t// still no matching language, fall back to the first language\n\t\t\t\t#language = (self -> 'strings') -> keys -> first;\n\t\t\t/if;\n\t\t\tif: (self -> 'strings') !>> #language\n\t\t\t\t|| ((self -> 'strings') >> #language\n\t\t\t\t\t&& (self -> 'strings') -> (find: #language) !>> #key\n\t\t\t\t\t&& (self -> 'fallback'));\n\t\t\t\t// key is not found in current language, switch to default language\n\t\t\t\tif: self -> (validlanguage: (self -> 'defaultlanguage'));\n\t\t\t\t\t// still no matching language, fall back to defaultlanguage\n\t\t\t\t\t#language = (self -> 'defaultlanguage');\n\t\t\t\telse;\n\t\t\t\t\t// no default language to fall back to\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\tif: (self -> 'strings') >> #language;\n\t\t\tif((self -> 'strings') -> find(#language) !>> #key);\n\t\t\t\t(self -> 'debug_trace') -> insert('Error: ' + #key + ' not found');\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer(#timer); // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\t(self -> 'debug') \n\t\t\t\t\t? return('*' + #key + '*') \n\t\t\t\t\t| return;\n\t\t\t/if;\n\t\t\t#output = (self -> 'strings') -> (find: #language) -> (find: #key);\n\t\t\t//(self -> 'debug_trace') -> (insert: tag_name + ': found string \"' + (encode_html: #output) + '\" for key \"' + #key + '\" and language ' + #language);\n\t\t\t\n\t\t\tif: #output -> (isa: 'tag');\n\t\t\t\t// execute compund expression\n\t\t\t\t#output = #output -> run;\n\t\t\t/if;\n\t\t\tif((#output -> isa('string') || #output -> isa('bytes')) \n\t\t\t\t&& #output -> size && (local_defined: 'replace'));\n\t\t\t\t// replace placeholders with real values\n\t\t\t\tif: !(#replace -> (isa: 'array')) && !(#replace -> (isa: 'map'));\n\t\t\t\t\t#replace = (array: #replace);\n\t\t\t\t/if;\n\t\t\t\titerate: #replace, local: 'replacement';\n\t\t\t\t\t// make sure we have a pair\n\t\t\t\t\tif: !(#replacement -> (isa: 'pair'));\n\t\t\t\t\t\t#replacement = (pair: '#' + loop_count + '#' = #replacement);\n\t\t\t\t\t/if;\n\t\t\t\t\t// if we have a compund expression as replacement, execute the replacement first\n\t\t\t\t\tif: (#replacement -> value -> (isa: 'tag'));\n\t\t\t\t\t\t(#replacement -> value) = #replacement -> value -> run;\n\t\t\t\t\t/if;\n\t\t\t\t\t#output -> (replace: #replacement -> name, #replacement -> value);\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t/if;\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t\t\n\t/define_tag;\n\t\n\tdefine_tag: 'setlanguage', -description='Sets the current language for the string object. Also affects other instances on the same page that do not have an explicit language set. ',\n\t\t-required='language';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t// page level caching\n\t\t\t$_knop_data = map;\n\t\t/if;\n\t\tif: self -> (validlanguage: #language);\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': Setting language to ' + #language);\n\t\t\t(self -> 'currentlanguage') = #language;\n\t\t\t// save page level language\n\t\t\t$_knop_data -> insert('currentlanguage' = #language);\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': Could not set current language to ' + #language + ' since it does not exist in the lang object');\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'validlanguage', -description='Checks if a specified language exists in the string object, \\\n\t\treturns true or false.',\n\t\t-required='language';\n\t\treturn: (self -> 'strings') -> keys >> #language;\n\t/define_tag;\n\t\n\tdefine_tag: 'browserlanguage', -description='Autodetects and returns the most preferred language \\\n\t\t\tout of all available languages as specified by the browser\\'s accept-language q-value. ';\n\t\t\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'browserlanguage'=string;\n\n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t// page level caching\n\t\t\t$_knop_data = map;\n\t\t/if;\n\n\t\tif: $_knop_data >> 'browserlanguage';\n\t\t\t// use page cache\n\t\t\t#browserlanguage = $_knop_data -> find('browserlanguage');\n\n\t\telse;\n\t\t\tlocal: 'requestheader'=client_headers -> (split: '\\r\\n'),\n\t\t\t\t'acceptlanguage'=string,\n\t\t\t\t'browserlanguages'=array;\n\t\t\t\n\t\t\titerate: #requestheader, (local: 'headerfield'); \n\t\t\t\t// strip IIS header prefix\n\t\t\t\t#headerfield -> (removeleading: 'HTTP_');\n\t\t\t\t\n\t\t\t\tif: #headerfield -> (beginswith: 'Accept-Language:'); \n\t\t\t\t\t#acceptlanguage=#headerfield;\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#acceptlanguage -> (removeleading: 'Accept-Language:');\n\t\t\t#acceptlanguage -> trim;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': Accept-Language: ' + #acceptlanguage);\n\t\t\t#acceptlanguage = #acceptlanguage -> (split: ',');\n\t\t\titerate: #acceptlanguage, local: 'language';\n\t\t\t\t#language = #language -> (split: ';');\n\t\t\t\tif: #language -> size == 1;\n\t\t\t\t\t// no q value specified, use default 1.0\n\t\t\t\t\t#language -> (insert: 'q=1.0');\n\t\t\t\t/if;\n\t\t\t\t(#language -> first) -> trim; \n\t\t\t\tif: #language -> size >= 2 && #language -> first -> size;\n\t\t\t\t\t(#language -> second) = (#language -> second) -> (split: '=') -> last;\n\t\t\t\t\t(#language -> second) -> trim; \n\t\t\t\t\t#browserlanguages -> (insert: (decimal: (#language -> second)) = (#language -> first) );\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#browserlanguages -> (sort: -ascending=false);\n\t\n\t\t\t// find the most preferred language\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': looking for matching languages ');\n\t\t\titerate: #browserlanguages, local: 'language';\n\t\t\t\tif: (self -> validlanguage: (#language -> second));\n\t\t\t\t\t/// found a valid language\n\t\t\t\t\t#browserlanguage=#language -> second;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found valid language ' + #browserlanguage);\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\tif: #browserlanguage -> size == 0;\n\t\t\t\t// no matching language found, try again without locale\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': no valid language found, looking again without locale ' + #language);\n\t\t\t\titerate: #browserlanguages, local: 'language';\n\t\t\t\t\t(#language -> second) = (#language -> second) -> (split: '-') -> first;\n\t\t\t\t\tif: (self -> validlanguage: (#language -> second));\n\t\t\t\t\t\t/// found a valid language\n\t\t\t\t\t\t#browserlanguage=#language -> second;\n\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found valid language ' + #browserlanguage);\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\t$_knop_data -> insert('browserlanguage'=#browserlanguage);\n\t\t/if;\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #browserlanguage;\n\n\t/define_tag;\n\t\n\tdefine_tag: 'languages', -description='Returns an array of all available languages in the string object \\\n\t\t\t(out of the languages in the -language array if specified). \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-language (optional) string or array of strings.',\n\t\t-optional='language', -copy;\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'languages'=(self -> 'strings') -> keys;\n\t\tif: (local_defined: 'language');\n\t\t\tif: !(#language -> (isa: 'array'));\n\t\t\t\t#language = array: #language;\n\t\t\t/if;\n\t\t\t#languages -> sort;\n\t\t\t#language -> sort;\n\t\t\t// get the languages that exist in both arrays\n\t\t\t#languages = #languages -> (intersection: #language);\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #languages;\n\t/define_tag;\n\t\n\tdefine_tag: 'keys', -description='Returns array of all text keys in the string object. ';\n\t\tif: !((self -> 'keys') -> (isa: 'array'));\n\t\t\tlocal: 'keysarray'=array, 'keysmap'=map, 'keysarray_new'=array;\n\t\t\t// no cached result yet - create list of all keys\n\t\t\titerate: (self -> 'strings'), local: 'strings_language';\n\t\t\t\t#keysarray_new = #strings_language -> value -> keys;\n\t\t\t\t#keysarray_new -> sort;\n\t\t\t\t#keysarray -> sort;\n\t\t\t\t// add the keys that are not already in #keysarray by using union\n\t\t\t\t#keysarray = #keysarray -> (union: #keysarray_new);\n\t\t\t/iterate;\n\t\t\t(self -> 'keys') = #keysarray;\n\t\t/if;\n\t\treturn: (self -> 'keys');\n\t/define_tag;\n\t\n\n/define_type;\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_lang\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_nav\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'nav',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2010-11-17',\n \t\t'description'='Custom type to handle site navigation menu';\n\n/*\n\nCHANGE NOTES\n2010-11-17\tJC\tFixed bug so that session links no longer gets added to urls by the nav -> url tag.\n2010-11-17\tJC\tFixed a bug that would not convert local params to an array under certain situations\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\t->linkparams: Multiple paramaters with the same name (typically checkboxes) are now passed properly\n2009-05-06\tJS\t->directorytree considers _include folders as part of the Knop directory structure. nav->include('_include/myfile.inc') will first look for _include/myfile.inc and if not found it will look for _knop/_include/myfile.inc \n2009-05-05\tJS\t->include looks for a specified file also inside a _knop folder, if the file does not exist at the specified location\n2009-02-09\tJS\t->filename: Casting path and actionpath to string\n2008-12-19\tJS\t->filename (and consequently ->include and ->library) can now use a specific -path instead of the current location's path\n2008-12-09\tJS\t->linkparams: fixed undefined local in trace call (only showed when trace was enabled for the nav object)\n2008-11-25\tJS\t->getlocation will now avoid disabled and hidden pages when looking for the first page if no default page is specified\n2008-11-03\tJS\t->getlocation will not break if no navigation items have been defined\n2008-10-30\tJS\t_mod folders will now work with knop paths with just a single level, so an include file path can end up as _mod_customer/lib_customer.inc or just _mod_customer/lib.inc (the latter variant does not apply to extension-based filenaming, so _mod_customer/.lib will never be a working file path)\n2008-07-10\tJS\tAdded -> label to return the name of the current page\n2008-05-20\tJS\t->renderhtml: #current# is not automatically added to the template if the more elaborate template format is used. This makes it easier to hide the currentmarker without changing the nav config (partial revert of fix 2008-01-04). \n2008-05-08\tJS\t->insert: A duplicate key does no longer cause a fatal error but instead fails silently and logs to the debug log\n2008-05-07\tJS\t->url: will now call ->linkparams so all links that are constructed from ->url will properly send along the parameters specified in the nav item. This also affects pagination and sort links in grid. \n2008-05-07\tJS\tAdded ->linkparams, Returns an array for all parameters that should be sent along with nav links (this was previously embedded in renderhtml)\n2008-02-25\tJS\t->url: new parameter -getargs to add the getargs to the path link if the path equals the current path\n2008-02-06\tJC\t->insert: the -hide flag can now be a boolean (also the -disabled flag)\n2008-02-03\tJS\t->include: can now include any specified filename\n2008-02-01\tJS\t->oncreate: added optional -fileroot to be able to use a root for files that is different from the logical site root used for navigation \n2008-01-23\tJS\t->url: Added -autoparams that is required to enable the automatic passing of action_params that begin with \"-\" (this reverts the default behavior to match the the old)\n2008-01-22\tJS\t->url: GET params that begin with \"-\" are sent as parameters on links. -path, -sort, -desc, -q are explicitly excluded from nav links in renderhtml. \n2008-01-22\tJS\tWhen using param based navigation, navigation links now use much cleaner /?path/to/page/ style links instead of /?-path=path/to/page/\n2008-01-22\tJS\t->getlocation: when navmethod is param, the path can now be sent as unnamed parameter insetad of -path parameter (such as /?path/to/page/). \n2008-01-04\tJS\t->renderbreadcrumb: added flag -plain to output breadcrumb without html\n2008-01-04\tJS\t->renderbreadcrumb: added flag -skipcurrent to not include the current location in the output\n2008-01-04\tJS\t->insert: -template can now be specified also for individual nav items. Use the form #link##label##current##/link##children#. \n2008-01-04\tJS\t->renderhtml: changed #title# to #label# in template for clarity, for example #link##label##current##/link##children# (#title# will remain supported)\n2008-01-04\tJS\tAdded #current# as placeholder for template, to specify where the current marker should occurr. If not specified in the template, the current marker appears immediately after the label.\n2007-12-12\tJS\t->include now logs processing time for the include to debug trace\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-04\tJS\tnav item css class is now applied also to disabled nav items (rendered as <span>)\n2007-11-08\tJS\tChanged trace so it tracks some things even when it's not enabled (like include etc)\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-28\tJS\t->directorytree: should now work also when knop folders are symlinks\n2007-09-06\tJS\ttop level nav elements that are -disabled now behave properly when accessed\n2007-09-05\tJS\t-currentmarker can now be set separately on sublevels, not only on topmost level\n2007-08-29\tJS\tAdded _knop as optional base folder to put all knop files in\n2007-08-29\tJS\t->include: Removed file_exists check since the filename has already been verified in ->filename.\n2007-08-29\tJS\tAdded ->directorytree which returns a map with all knop filenames, to use when searching for includes\n2007-08-28\tJS\t->oncreate: -filenaming to specify how include files are named prefix/suffix/extension\n2007-08-28\tJS\t->filename: Implemented support for flexible folder structures\n2007-08-28\tJS\tInstance variable #actionconfigfile_didrun was not properly declared\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-14\tJS\t->insert: -url='/' can now be used to specify the \"home\" location. \n2007-06-13\tJS\tadded ->children to get a reference to the children nav object for a specified path, so new children can be inserted. Must call ->reindex afterwards. \n2007-06-13\tJS\tadded ->reindex to rebuild the index maps from scratch. Must be done after adding children items. \n2007-06-13\tJS\tadded ->addchildren to replace a current children nav object for a specified path. Will handle the reindexing transparently. \n2007-06-13\tJS\tadded ->keymap, ->pathmap and ->urlmap to access the index maps so they call reindex if they have been invalidated (for example by ->addchildren)\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-06-08\tJS\t->insert: params with empty values are now ignored\n2007-05-04\tJS\t->insert: added check that default item exists in children before storing the default\n2007-04-19\tJS added ->data to retrieve data stored for the current path (or specified path). Optional -type ensures the returned data has the correct type. \n2007-04-19\tJS ->insert: added -data to store arbitrary data object for each path. The object is stored as reference so a variable can be changed after it has been added to the nav object\n2007-04-19\tJS\tadded ->patharray to return the current path as array\n2007-04-17\tJS\t->renderhtml: template now supports #link##title##/link##children# in addition to #item# to provide more flexibility\n2007-04-17\tJS\t->oncreate: added support for -template, -class, currentclass and -currentmarker\n2007-04-13\tJS\tImplemented -class per navitem (only worked globally with setformat before)\n2007-04-03\tJS\t->renderhtml: added -renderpath, -expand and -flat to be able to render parts of the nav menu for more flexible layout\n2007-04-03\tJS\t->renderbreadcrumb: added -home to show the default navigation item first in the breadcrumb \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tChanged navmethod path so it uses response_filepath instead of $url_path\n2007-02-25\tJS\tAdded ->actionpath\n2007-02-24\tJS\t->renderhtml: improved handling of classes in nav links\n2007-02-22\tJS\t->url: added -except\n2007-02-09\tJS\t->url: corrected the behavior for plain parameters passed to the tag\n2007-02-05\tJS\t->insert: Added -param to be able to specify params that should be propagated in nav for certain nav elements (like -keyvalue to be able to move between different subtabs for a selected record\n2007-02-05\tJS\t->renderhtml now use ->url to get the right links\n2007-02-01\tJS\tMade usage of trace optional to improve performance\n2007-02-01\tJS\tImprovements to debug_trace to log also recursive events\n2007-02-01\tJS\tAdded ->haschildren, which is now used by ->renderhtml to properly show or hide child level\n2007-01-31\tJS\t->renderhtml Added renderhtml_levels to keep track of how many levels deep navigation has been rendered, to be able to add proper spacing between navigation and content\n2007-01-31\tJS \t->url: -urlargs  Improved handling of urlargs and ?/& delimiters, should work better with navmethod path\n2007-01-30\tJS\tRemoved automatic link title attribute since it can be confusing to show children page titles there\n2007-01-30\tJS\tCorrected parameter path to -path (bug)\n2007-01-23\tJS\t->include: 'config' checks if the same config has already run as actionconfig and won't run again in that case\n2007-01-23\tJS\t->include checks if the file exists first, so no need for empty placeholder files\n2007-01-23\tJS\tAdded ->include and ->library\n2007-01-23\tJS\tAdded ->setlocation\n2007-01-17\tJS\tAdded insert: -hide to allow a location without showing it in navigation\n\nTODO\nAdd support for compound expressions for template. The expression could return a map that would override corresponding param values. \n->insert: Add -raw to be able to inject code into the link tag, similar to form->addfield(-raw). \nExclude file name for example index.lasso from getargs\nOptimize nav->url! Very slow with complex nav object. \nNeeds to exclude also -keyfield and -lockfield. Maybe better to add an option to ->url to not auto-add any \"-\" params at all. \n-params are not sent along in breadcrumb links\nNeed simple way to exclude certain \"-\" params from ->url, also in config per nav item\nAdd support for adding nav structure from a database\nMove templates to a member tag to be make it easier to subclass\nMake it possible to use external URL for -url (make sure there is no / before http)\n\n*/\n\n\tlocal: 'navitems'=array,\t// array of maps\n\t\t'keymap'=map,\t\t\t// to speed up the locating of critical navigation elements (TBD)\n\t\t'pathmap'=map,\t\t\t// contains full key paths also for children navitems\n\t\t'urlmap'=map,\t\t\t// to translate a url to key path, contains url also for children navitems\n\t\t'default'=string,\t\t// default path, i.e. home page\n\t\t'parentkey'=null,\t\t// the key of the parent to this navitem (null for top item)\n\t\t'template'=string,\n\t\t'class'=string,\n\t\t'currentclass'=string,\n\t\t'currentmarker'=null,\n\n\t\t'actionpath'=string,\t\t// captured from -action parameter in submission\n\t\t'path'=string,\t\t\t// captured from path param or urlhandler and translated from url\n\t\t'patharray'=array,\t\t// path broken down into elements\n\t\t'pathargs'=string,\t\t// extra path parts that can contain record identification etc\n\t\t'urlparams'array,\t\t// holds everything needed to generate nav links\n\t\t'navmethod'=string,\t\t// path or param depending on how the nav is propagated. To be able to force path, since url handler doesn't kick in for the start page\n\t\t'filenaming'=string,\n\t\t'directorytreemap'=map,\t// contains a list of all existing filenames in the knop directory tree\n\t\t'root'='/',\t\t\t\t// site root\n\t\t'fileroot'='/',\t\t\t// root for physical files\n\t\t'renderhtml_levels'=0,\t// number of levels rendered by renderhtml\n\t\t// 'tagtime'=integer, \t\t\t// moved to knop_base\n\t\t// 'tagtime_tagname'=string, \t// moved to knop_base\n\t\t'debug_trace'=array,\n\t\t'dotrace'=false,\n\t\t'actionconfigfile_didrun'=string,\t// path to action config file that has been run for the current page load\n\t\t\t\t\t\t\t\t\t\t\t// used to not load the same config again\n\t\t'error_lang'=(knop_lang: -default='en', -fallback);\n\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-default (optional) Key of default navigation item\\n\\\n\t\t\t-root (optional) The root path for the site section that this nav object is used for\\n\\\n\t\t\t-fileroot (optional) The root for include files, to be able to use a different root for physical files than the logical root of the site. Defaults to the value of -root. \\n\\\n\t\t\t-navmethod (optional) path or param. Path for \"URL designed\" URLs, otherwise a -path parameter will be used for the navigation. \\n\\\n\t\t\t-filenaming (optional) prefix (default), suffix or extension, specifies how include files are named\\n\\\n\t\t\t-trace (optional flag) If specified debug_trace will be used. Defaults to disabled for performance reasons. \\n\\\n\t\t\t-template (optional) html template used to render the navigation menu\\n\\\n\t\t\t-class (optional) default class for all navigation links\\n\\\n\t\t\t-currentclass (optional) class added for the currently active link\\n\\\n\t\t\t-currentmarker (optional) character(s) show to the right link of current nav (typically &raquo;)',\n\t\t-optional='template',\n\t\t-optional='class',\n\t\t-optional='currentclass',\n\t\t-optional='currentmarker',\n\t\t-optional='default',\n\t\t-optional='root',\n\t\t-optional='fileroot',\n\t\t-optional='navmethod',\n\t\t-optional='filenaming',\n\t\t-optional='trace';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace');\n\t\t// TODO: check if we are in an inline, in that case use -key, -label etc as field names and loop through records to fill nav\t\t\n\t\t\n\t\tlocal_defined('default') ? (self -> 'default') = #default;\n\t\tlocal_defined('root') ? (self -> 'root') = #root;\n\t\tlocal_defined('navmethod') ? (self -> 'navmethod') = #navmethod; \n\t\tlocal_defined('template') ? (self -> 'template') = #template;\n\t\tlocal_defined('class') ? (self -> 'class') = #class;\n\t\tlocal_defined('currentclass') ? (self -> 'currentclass') = #currentclass;\n\t\tlocal_defined('currentmarker') ? (self -> 'currentmarker') = #currentmarker;\n\t\tlocal_defined('filenaming') ? (self -> 'filenaming') = #filenaming;\n\n\t\t(self -> 'dotrace') = (local_defined: 'trace') && #trace != false;\n\t\t// normalize slashes\n\t\t(self -> 'root') -> removeleading('/') & removetrailing('/');\n\t\t(self -> 'root') = '/' + (self -> 'root') + '/';\n\t\t(self -> 'root') -> replace('//', '/');\n\n\t\tif: (local_defined: 'fileroot');\n\t\t\t(self -> 'fileroot') = #fileroot;\n\t\t\t// normalize slashes\n\t\t\t(self -> 'fileroot') -> removeleading('/') & removetrailing('/');\n\t\t\t(self -> 'fileroot') = '/' + (self -> 'fileroot') + '/';\n\t\t\t(self -> 'fileroot') -> replace('//', '/');\n\t\telse;\n\t\t\t(self -> 'fileroot') = (self -> 'root');\n\t\t/if;\n\t\t\n\t\t// validate and set default value\n\t\t(map: 'prefix', 'suffix', 'extension') !>> (self -> 'filenaming') ? (self -> 'filenaming') = 'prefix'; \n\t\t\n\t\t// can not perform getlocation here since the nav structure must be defined first\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'onconvert', -description='Outputs the navigation object in a very basic form, just to see what it contains';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'output' = (self -> 'parentkey') + ': ';\n\t\titerate: (self -> 'navitems'), (local: 'navitem');\n\t\t\t#output += #navitem + '\\n';\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'insert', -description='Adds a navigation item to nav structure\\n\\\n\t\t\tParameters:\\n\\ \n\t\t\t-key (required) The key will be part of the path\\n\\ \n\t\t\t-label (optional) The menu text\\n\\ \n\t\t\t-url (optional) Nav url to use instead of the default url that is derived from the keys path, used as shortcuts for cleaner URLs\\n\\ \n\t\t\t-title (optional) Link href title text\\n\\ \n\t\t\t-template (optional) Template to use only for this specific nav item, in the form #link##label##current##/link##children#\\n\\\n\t\t\t-children (optional nav) Sub navitems\\n\\ \n\t\t\t-default (optional) Key of default child subnav item\\n\\ \n\t\t\t-param (optional) Name of param or params (string/array) that should be sent along with nav links\\n\\ \n\t\t\t-class (optional) CSS class name to use for this nav item (defaults to none)\\n\\ \n\t\t\t-filename (optional) Name stem for lib, action and content files (defaults to key path with _ instead of /), to be able to use the same processing files for multiple locations\\n\\ \n\t\t\t-disabled (optional flag) Makes the menu item dimmed and non-clickable\\n\\ \n\t\t\t-hide (optional flag) Makes the location valid without showing a menu item for it\\n\\ \n\t\t\t-after (optional) After which navitem to insert this navitem (key or numeric index)\\n\\ \n\t\t\t-data (optional) Arbitrary data object (variable, map, array, compound expression) that can be returned for the location by calling ->data',\n\t\t-required='key',\n\t\t-optional='label',\n\t\t-optional='default',\n\t\t-optional='url', -copy,\n\t\t-optional='title',\n\t\t-optional='template',\n\t\t-optional='children', -type='nav',\n\t\t-optional='param',\n\t\t-optional='class',\n\t\t-optional='filename',\n\t\t-optional='disabled',\n\t\t-optional='hide',\n\t\t-optional='after',\n\t\t-optional='data';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t\n\t\tfail_if: !(local_defined: 'hide') && (local: 'label') == '', -1, 'Insert requires a label';\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': -key = ' + #key);\n\t\t// fail_if: (self -> keymap) >> #key, -1, #key + ' is not unique';\n\t\tif: (self -> keymap) >> #key;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': *** Error key ' + #key + ' is not unique - skipping');\n\t\t\treturn;\n\t\t/if;\n\t\tlocal: 'urlmapchildren'=map,\n\t\t\t'pathmapchildren'=map;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tif: (local_defined: 'children');\n\t\t\t(#children -> 'parentkey') = #key;\n\t\t\t// grab urlmap and pathmap from children\n\t\t\t#urlmapchildren = (#children -> urlmap);\n\t\t\t#pathmapchildren = (#children -> pathmap);\n\t\t\tif: !(local_defined: 'title');\n\t\t\t\t// set default title to labels of children\n\t\t\t\t/*\n\t\t\t\tlocal: 'title' = array;\n\t\t\t\titerate: (#children -> 'navitems'), (local: 'item');\n\t\t\t\t\t#title -> (insert: (#item -> (find: 'label')));\n\t\t\t\t/iterate;\n\t\t\t\t#title = #title ->  (join: ', ');\n\t\t\t\t*/\n\t\t\t/if;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': adding children');\n\t\t\t(self -> 'debug_trace') -> (merge: (#children -> 'debug_trace'));\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': done adding children');\n\t\t/if;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tlocal: 'navitem'=map;\n\t\tlocal_defined('key') && #key != '' ? #navitem -> insert('key' = #key); \n\t\tlocal_defined('label') && #label != '' ? #navitem -> insert('label' = #label); \n\t\tlocal_defined('default') && #default != '' ? #navitem -> insert('default' = #default); \n\t\tlocal_defined('url') && #url != '' ? #navitem -> insert('url' = #url); \n\t\tlocal_defined('title') && #title != '' ? #navitem -> insert('title' = #title); \n\t\tlocal_defined('template') && #template != '' ? #navitem -> insert('template' = #template); \n\t\tlocal_defined('children') && #children != '' ? #navitem -> insert('children' = #children); \n\t\tlocal_defined('class') && #class != '' ? #navitem -> insert('class' = #class); \n\t\tlocal_defined('filename') && #filename != '' ? #navitem -> insert('filename' = #filename);\n\n\t\tif(local_defined('default') && #default != '' && #pathmapchildren >> #default);\n\t\t\t// only add default that exists in children\n\t\t\t#navitem -> insert('default' = #default);\n\t\t/if;\n\t\t// store these params by reference\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tlocal_defined('data') && #data != '' ? #navitem -> insert('data' = @#data);\n\n\t\tif: (local_defined: 'param') && #param -> type =='array';\n\t\t\t#navitem -> (insert: 'params'=#param);\n\t\telse: (local_defined: 'param') && #param != '';\n\t\t\t#navitem -> (insert: 'params'=(array: #param));\n\t\t/if;\n\t\t#navitem -> (insert: 'disabled'=(local_defined: 'disabled') && #disabled != false);\n\t\t#navitem -> (insert: 'hide'=(local_defined: 'hide') && #hide != false);\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tlocal: 'index'=(self -> 'navitems') -> size + 1;\n\t\tif: (local_defined: 'after') && (string: #after) -> size;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': -after=' + #after);\n\t\t\tif: #after -> type == 'integer';\n\t\t\t\t#index = #after;\n\t\t\telse: (self -> keymap) >> #after;\n\t\t\t\t#index = (self -> keymap) -> (find: #after) + 1;\n\t\t\t/if;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': index=' + #index);\n\t\t/if;\n\t\tif: #urlmapchildren -> size;\n\t\t\t// we have urlmap from children - insert it into our urlmap with modified keyvalues\n\t\t\titerate: #urlmapchildren, (local: 'urlitem');\n\t\t\t\tfail_if: (self -> urlmap) >> #urlitem -> name, -1, 'url ' + (#urlitem -> name) + ' is not unique';\n\t\t\t\t(self -> 'urlmap') -> (insert: #urlitem -> name = #key + '/' + (#urlitem -> value));\n\t\t\t/iterate;\n\t\t/if;\n\t\tif: #pathmapchildren -> size;\n\t\t\t// we have pathmap from children - insert it into our pathmap with modified keys\n\t\t\titerate: #pathmapchildren, (local: 'pathitem');\n\t\t\t\t(self -> 'pathmap') -> (insert: #key + '/' + #pathitem -> name);\n\t\t\t/iterate;\n\t\t/if;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tif: (local_defined: 'url') && #url != '';\n\t\t\t#url -> (removeleading: '/') & (removetrailing: '/');\n\t\t\tfail_if: (self -> urlmap) >> #url, -1, 'url ' + #url + ' is not unique';\n\t\t\t(self -> 'urlmap') -> (insert: #url = #key);\n\t\t/if;\n\t\t(self -> 'pathmap') -> (insert: #key);\n\t\t(self -> 'navitems') -> (insert: #navitem, #index);\n\t\t// update keymap\n\t\t(self -> 'keymap') = map;\n\t\titerate: (self -> 'navitems'), (local: 'item');\n\t\t\t(self -> 'keymap') -> (insert: (#item -> (find: 'key'))  = loop_count);\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\t\n\t/define_tag;\n\t\n\t\n\t/*\n\tdefine_tag: 'remove',\t-description='Remove nav object and its children for specified key path. Must update index maps afterwards. ',\n\t\t-required='path', -type='string', -copy;\n\t\tfail: -1, 'Not implemented'; // This tag is not yet functional\n\t\t\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t#path -> removeleading('/') & removetrailing('/');\n\t\tlocal: 'path_remove'=#path -> split('/') -> last;\n\t\t#path -> removetrailing(#path_remove) & removetrailing('/');\n\t\t// we need to find a reference to the navitems array of maps that contains the nav item to remove\n\t\tif: #path -> size;\n\t\t\tlocal: 'navitem'=@(self -> getnav(#path));\n\t\telse;\n\t\t\tlocal: 'navitem'=@self -> getnav;\n\t\t/if;\n\t\t// we also need to find a reference to the keymap where we can find the index of the array item to remove\n\t\treturn: #navitem;\n\t\t(#navitem -> getnav) -> remove(#navitem -> keymap -> find(#path_remove));\n\t\t\n\t\t// invalidate index maps\n\t\t(#navitem -> 'keymap') = null;\n\t\t(#navitem -> 'pathmap') = null;\n\t\t(#navitem -> 'urlmap') = null;\n\n\t\t(self -> 'keymap') = null;\n\t\t(self -> 'pathmap') = null;\n\t\t(self -> 'urlmap') = null;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t*/\n\t\n\tdefine_tag: 'addchildren',\t-description='Add nav object as children to specified key path, replacing the current children if any. \\\n\t\tMust update index maps afterwards. ',\n\t\t-required='path',\n\t\t-required='children', -type='nav';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'navitem'=@(self -> (getnav: #path));\n\t\t#navitem -> (insert: 'children' = #children);\n\n\t\t// invalidate index maps\n\t\t(#navitem -> 'keymap') = null;\n\t\t(#navitem -> 'pathmap') = null;\n\t\t(#navitem -> 'urlmap') = null;\n\n\t\t(self -> 'keymap') = null;\n\t\t(self -> 'pathmap') = null;\n\t\t(self -> 'urlmap') = null;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'children', -description='Return reference to the children of the current navigation object map, or for the specified path',\n\t\t-optional='path', -copy;  \n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t!(local_defined: 'path') ? local: 'path'=(self -> 'patharray');\n\t\tif: #path -> type != 'array';\n\t\t\t#path = string: #path;\n\t\t\t#path -> (removeleading: '/') & (removetrailing: '/');\n\t\t\t#path = #path -> (split: '/');\n\t\t/if;\n\t\t(self -> pathmap) !>> (#path -> (join: '/')) ? return: knop_nav;\n\n\t\tlocal: 'nav'=@(self -> (getnav: #path));\n\t\tif: #nav !>> 'children';\n\t\t\t#nav -> (insert: 'children'=knop_nav);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @(#nav -> (find: 'children'));\n\t/define_tag;\n\t\n\tdefine_tag: 'reindex', -description='To recreate keymap, pathmap and urlmap';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t(self -> 'keymap') = map;\n\t\t(self -> 'pathmap') = map;\n\t\t(self -> 'urlmap') = map;\n\t\tlocal: 'key'=null, 'pathitem'=null, 'urlitem'=null, 'url'=string;\n\t\titerate: (self -> 'navitems'), (local: 'navitem');\n\t\t\t#key = #navitem -> (find: 'key');\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': key=' + #key);\n\t\t\t(self -> 'keymap') -> (insert: #key = loop_count);\n\t\t\t(self -> 'pathmap') -> (insert: #key);\n\t\t\tif: #navitem -> (find: 'url') != '';\n\t\t\t\t#url=#navitem -> (find: 'url');\n\t\t\t\t#url -> (removeleading: '/') & (removetrailing: '/');\n\t\t\t\tfail_if: (self -> urlmap) >> #url, -1, 'url ' + #url + ' is not unique';\n\t\t\t\t(self -> 'urlmap') -> (insert: #url = #key);\n\t\t\t/if;\n\t\t\tif: #navitem >> 'children';\n\t\t\t\t#navitem -> (find: 'children') -> reindex; // recursive\n\t\t\t\titerate: (#navitem -> (find: 'children') -> pathmap), #pathitem;\n\t\t\t\t\t(self -> 'pathmap') -> (insert: #key + '/' + #pathitem -> name);\n\t\t\t\t/iterate;\n\t\t\t\titerate: (#navitem -> (find: 'children') -> urlmap), #urlitem;\n\t\t\t\t\tfail_if: (self -> urlmap) >> #urlitem -> name, -1, 'url ' + (#urlitem -> name) + ' is not unique';\n\t\t\t\t\t(self -> 'urlmap') -> (insert: #urlitem -> name = #key + '/' + (#urlitem -> value));\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'keymap';\n\t\t(self -> 'keymap') -> type != 'map' ? self -> reindex;\n\t\treturn: (self -> 'keymap');\n\t/define_tag;\n\tdefine_tag: 'pathmap';\n\t\t(self -> 'pathmap') -> type != 'map' ? self -> reindex;\n\t\treturn: (self -> 'pathmap');\n\t/define_tag;\n\tdefine_tag: 'urlmap';\n\t\t(self -> 'urlmap') -> type != 'map' ? self -> reindex;\n\t\treturn: (self -> 'urlmap');\n\t/define_tag;\n\t\n\tdefine_tag: 'getlocation', -description='Grabs path and actionpath from params or urlhandler, translates from url to path if needed. This must be called before using the nav object. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-setpath (optional) forces a new path',\n\t\t-optional='setpath';\n\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name, -time, -type=self->type);/handle;\n\t\tlocal: 'path'=string, \n\t\t\t'patharray'=array, \n\t\t\t'originalpath'=string, \n\t\t\t'pathargs'=string,\n\t\t\t'actionpath'=string,\n\t\t\t'validurl'=false;\n\t\t\t// TODO: Produce 404 error for invalid urls\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t\t\n\t\t(self -> 'path') = string;\n\t\t(self -> 'patharray') = array;\n\t\t(self -> 'pathargs') = string;\n\t\t(self -> 'actionpath') = string;\n\t\t// get action path\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t#actionpath = (#clientparams >> '-action' ? (#clientparams -> (find: '-action') -> first -> value) | string);\n\t\t#actionpath -> (removeleading: '/') & (removetrailing: '/');\n\t\t// validate action path\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': testing action path ' + #actionpath);\n\t\tif: #actionpath -> size && (self -> pathmap) >> #actionpath;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found match for action path ' + #actionpath);\n\t\t\t(self -> 'actionpath') = #actionpath;\n\t\t/if;\n\n\t\t// get url or path\n\t\tif: (local: 'setpath') != '';\n\t\t\t#originalpath = string: #setpath;\n\t\telse: (self -> 'navmethod') != 'param'; \n\t\t\t(self -> 'navmethod') = 'path';\n\t\t\t#originalpath = response_filepath;\n\t\t\t#originalpath -> (removeleading: (self -> 'root'));\n\t\telse: (self -> 'navmethod') != 'path';\n\t\t\t(self -> 'navmethod') = 'param';\n\t\t\tif: #clientparams >> '-path';\n\t\t\t\t// path is sent as -path GET or POST parameter\n\t\t\t\t#originalpath = (#clientparams >> '-path' ? (#clientparams -> (find: '-path') -> first -> value) | string);\n\t\t\telse: client_getparams -> size && client_getparams -> first -> isa('string');\n\t\t\t\t// path is sent as first unnamed GET parameter \n\t\t\t\t#originalpath = client_getparams -> first;\n\t\t\t/if;\n\t\t/if;\n\t\t#originalpath -> (removeleading: '/') & (removetrailing: '/');\n\t\t#path = #originalpath;\n\t\t#patharray = (string: #originalpath) -> (split: '/');\n\t\t// look for longest match in urlmap\n\t\tlocal: 'pathfinder'=#patharray;\n\t\tloop: #pathfinder -> size;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': looking at url ' + #pathfinder -> (join: '/'));\n\t\t\tif: (self -> urlmap) >> #pathfinder -> (join: '/');\n\t\t\t\t// use translated key path\n\t\t\t\t#path=(self -> urlmap) -> (find: #pathfinder -> (join: '/'));\n\t\t\t\t#validurl=true;\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found url match for ' (#pathfinder -> (join: '/')) + ' translating to ' + #path);\n\t\t\t\tloop_abort;\n\t\t\telse;\n\t\t\t\t// remove last path part and try again\n\t\t\t\t#pathfinder -> remove;\n\t\t\t/if;\n\t\t/loop;\n\t\tif: !#validurl;\n\t\t\t// no url found, dig into the nav structure to see if path is valid\n\t\t\tlocal: 'pathfinder'=#patharray;\n\t\t\tloop: #pathfinder -> size;\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': looking at path ' + #pathfinder -> (join: '/'));\n\t\t\t\tif: (self -> pathmap) >> #pathfinder -> (join: '/');\n\t\t\t\t\t// use key path\n\t\t\t\t\t#path=#pathfinder -> (join: '/');\n\t\t\t\t\t#validurl=true;\n\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found path match for ' (#pathfinder -> (join: '/')));\n\t\t\t\t\tloop_abort;\n\t\t\t\telse;\n\t\t\t\t\t// remove last path part and try again\n\t\t\t\t\t#pathfinder -> remove;\n\t\t\t\t/if;\n\t\t\t/loop;\n\t\t/if;\n\t\t// look for disabled path\n\t\tif: #validurl;\n\t\t\t#path = (string: #path) -> (split: '/');\n\t\t\twhile: #path -> size > 1 && (self -> (getnav: #path)) -> (find: 'disabled');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': path '+ #path + ' is disabled');\n\t\t\t\t#path -> remove;\n\t\t\t/while;\n\t\t\tif: (self -> (getnav: #path)) -> (find: 'disabled');\n\t\t\t\t#validurl = false;\n\t\t\t/if;\n\t\t\t#path = #path -> (join: '/');\n\t\t/if;\n\t\t\n\t\tif: !#validurl;\n\t\t\t// we haven't found a valid location, we must resort to a default page\n\t\t\tif: self -> 'default' != '' && self -> pathmap >>  self -> 'default';\n\t\t\t\t#path = self -> 'default';\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': use defalt location ' #path);\n\t\t\telse;\n\t\t\t\t// use first page as default, if it exists\n\t\t\t\titerate(self -> 'navitems', local('navitem'));\n\t\t\t\t\tif(#navitem >> 'key' \n\t\t\t\t\t\t&& !(#navitem -> find('disabled')) \n\t\t\t\t\t\t&& !(#navitem -> find('hide')));\n\t\t\t\t\t\t#path = #navitem -> find('key');\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': use first page as default location ' #path);\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\tif: (self -> pathmap) >> #path;\n\t\t\t\t#validurl = true;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': no navigation seems to be defined ' #path);\n\t\t\t/if;\n\t\t/if;\n\t\t\n\t\tif: #validurl;\n\t\t\t// recursively look for default sub page\n\t\t\tlocal: 'hasdefault'=true;\n\t\t\twhile: #hasdefault;\n\t\t\t\tlocal: 'defaultkey' = (self -> (getnav: #path)) -> (find: 'default');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': looking for default key ' + #defaultkey);\n\t\t\t\tif: !(((self -> (getnav: #path))) -> (find: 'disabled')) \n\t\t\t\t\t&& !(((self -> (getnav: #path + '/' + #defaultkey))) -> (find: 'disabled'))\n\t\t\t\t\t&& #defaultkey != '' && (self -> (getnav: #path)) -> (find: 'children') -> keymap >> #defaultkey;\n\t\t\t\t\t#path += '/' + #defaultkey;\n\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': new path is ' + #path);\n\t\t\t\telse;\n\t\t\t\t\t#hasdefault=false;\n\t\t\t\t/if;\n\t\t\t/while;\n\t\t\t\n\t\t\t// look for path arguments = the leftover when we found a matching path\n\t\t\t#pathargs = #originalpath;\n\t\t\t#pathargs -> (removeleading: #pathfinder -> (join: '/')) & (removeleading: '/');\n\t\t\t\n\t\t\t// store values\n\t\t\t(self -> 'path') = #path;\n\t\t\t(self -> 'patharray') = (string: #path) -> (split: '/');\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': path is ' + #path);\n\t\t\tif: #pathargs != '';\n\t\t\t\t(self -> 'pathargs') = #pathargs;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': pathargs is ' + #pathargs);\n\t\t\t/if;\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': no matching path found');\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'setlocation', -description='Sets the current location to a specific nav path or url',\n\t\t-required='path';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tself -> (getlocation: -setpath=#path);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'setformat', -description='Sets html template for the nav object, use #items# #item# #/items# or more elaborate #items# #link##label##current##/link##children# #/items# as placeholders.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-template (optional string) Html template, defaults to <ul>#items#<li>#item#</li>#/items#</ul>\\n\\\n\t\t\t-class (optional string) Css class name that will be used for every navigation link\\n\\\n\t\t\t-currentclass (optional string) Css class name that will be added to the currently active navigation link (defaults to crnt)\\n\\\n\t\t\t-currentmarker (optional string) String that will be appended to menu text of currently active navigation link',\n\t\t-optional='template', -type='string',\n\t\t-optional='class', -type='string',\n\t\t-optional='currentclass', -type='string',\n\t\t-optional='currentmarker', -type='string';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t\n\t\t(local_defined: 'template') ? (self -> 'template') = #template;\n\t\t(local_defined: 'class') ? (self -> 'class') = #class;\n\t\t(local_defined: 'currentclass') ? (self -> 'currentclass') = #currentclass;\n\t\t(local_defined: 'currentmarker') ? (self -> 'currentmarker') = #currentmarker;\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'haschildren',\t-description='Returns true if nav object has children that are not all -hide.',\n\t\t-required='navitem', -type='map';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'haschildren'=#navitem >> 'children';\n\t\tif: #haschildren;\t// verify that there is at least one child that does not have -hide\n\t\t\t#haschildren=false; // assume there is no child to show\n\t\t\titerate: #navitem -> (find: 'children') -> 'navitems', (local: 'childitem');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': checking ' + (#childitem -> (find: 'key')) + ', hide=' + (#childitem -> (find: 'hide')));\n\t\t\t\tif: !(#childitem -> (find: 'hide')); // found one\n\t\t\t\t\t#haschildren=true;\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': ' + #haschildren);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #haschildren;\n\t/define_tag;\n\n\tdefine_tag: 'renderhtml', -description='Called recursively to render hierarchial nav structure.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-renderpath (optional) Only render the children of the specified path (and below)\\n\\\n\t\t\t-flat (optional flag) Only render one level\\n\\\n\t\t\t-expand (optional flag) Render the entire expanded nav tree and not just the currently active branch\\n\\\n\t\t\t-basepath (optional) Internal, needed for recursive calls to get proper paths\\n\\\n\t\t\t-ancestor (optional nav) Internal, reference to the topmost object, needed for recursive calls\\n\\\n\t\t\t-xhtml (optional) XHTML valid output',\n\t\t-optional='renderpath', -copy,\n\t\t-optional='flat',\n\t\t-optional='expand',\n\t\t-optional='basepath', -copy,\n\t\t-optional='ancestor', -type='nav';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tif: !(local_defined: 'ancestor');\n\t\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name, -time, -type=self->type);/handle;\n\t\t\t// reset timer when called at top level\n\t\t\t// (self -> 'timer')=0; // undefined instance variable\n\t\t/if;\n\t\t\n\t\t// create reference to the topmost level nav object\n\t\tlocal: 'topself'=(local_defined: 'ancestor') ? @#ancestor | @self ;\n\t\t!(local_defined: 'ancestor') ? (#topself -> 'renderhtml_levels') = 1 | (#topself -> 'renderhtml_levels') += 1;\n\t\t\n\t\tlocal: '_flat' = (local_defined: 'flat') && #flat != false;\n\t\tlocal: '_expand' = (local_defined: 'expand') && #expand != false;\n\t\t\n\t\tlocal: 'template'=(self -> 'template' != '' ? self -> 'template' | #topself -> 'template');\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t\n\t\t!(local_defined: 'basepath') ? local: 'basepath'=string;\n\t\tif: #template == '';\n\t\t\t#template = '<ul>#items#<li>#item#</li>#/items#</ul>';\n\t\t/if;\n\t\tlocal: 'output'=string,\n\t\t\t'itemoutput'=string,\n\t\t\t'itemchildren'=string,\n\t\t\t'itemrow'=string,\n\t\t\t'link'=string,\n\t\t\t'linkparams'=array,\n\t\t\t'thispath'=string,\n\t\t\t'classarray'=array,\n\t\t\t'currentmarker'=string,\n\t\t\t'itemtemplate'=(string_findregexp: #template, -find='(?si)#items#(.*?)#/items#'),\n\t\t\t'itemlinkstart'=string,\n\t\t\t'itemlinkend'=string,\n\t\t\t'itemlabel'=string;\n\t\t#itemtemplate = (#itemtemplate -> size >= 2 ? #itemtemplate -> (get: 2) | string);\n\t\t\n\t\tif: (local_defined: 'renderpath') && #renderpath != '' && #renderpath != '/';\n\t\t\t// render nav for specified path\n\t\t\t#renderpath -> (removeleading: '/') & (removetrailing: '/');\n\t\t\tif: #topself -> (getnav: #renderpath) -> (find: 'children') -> type == 'nav';\n\t\t\t\treturn: @(#topself -> (getnav: #renderpath) -> (find: 'children') -> (renderhtml: -basepath=#renderpath, \n\t\t\t\t\t-ancestor=#topself, -flat=#_flat, -expand=#_expand));\n\t\t\telse;\n\t\t\t\treturn: string;\n\t\t\t/if;\n\t\t/if;\n\t\titerate: (self -> 'navitems'), (local: 'navitem');\n\t\t\tif: #navitem -> (find: 'hide');\n\t\t\t\t// do not show in navigation\n\t\t\telse;\n\t\t\t\t#itemlinkstart=string;\n\t\t\t\t#itemlabel=string;\n\t\t\t\t#itemlinkend=string;\n\t\t\t\t#itemchildren = string;\n\t\t\t\t#currentmarker=string;\n\n\t\t\t\t#thispath=#basepath + '/' + (#navitem -> (find: 'key'));\n\t\t\t\t#thispath -> (removeleading: '/');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': thispath is ' + #thispath + ', currentpath is ' + (#topself -> 'path'));\n\t\t\t\tif: (#navitem -> (find: 'template')) != '';\n\t\t\t\t\t#itemrow = (#navitem -> (find: 'template'));\n\t\t\t\telse;\n\t\t\t\t\t#itemrow = #itemtemplate;\n\t\t\t\t/if;\n\t\t\t\t#classarray = array;\n\t\t\t\t(#topself -> 'class') != '' ? #classarray -> (insert: (#topself -> 'class'));\n\t\t\t\t(#navitem -> (find: 'class')) != '' ? #classarray -> (insert: (#navitem -> (find: 'class')));\n\t\t\t\tif: #navitem -> (find: 'disabled');\n\t\t\t\t\t#itemlinkstart='<span';\n\t\t\t\t\tif: #classarray -> size;\n\t\t\t\t\t\t#itemlinkstart += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemlinkstart += '>';\n\t\t\t\t\t#itemlabel=(#navitem -> (find: 'label'));\n\t\t\t\t\t#itemlinkend='</span>';\n\t\t\t\telse;\n\t\t\t\t\t/* this code is moved into ->url\n\t\t\t\t\tif: (#navitem -> (find: 'params')) -> type == 'array';\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': checking params for ' + #thispath + ' with ' + (#navitem -> (find: 'params')));\n\t\t\t\t\t\t// TODO: Move this to a new member tag ->linkparams: path|navitem\n\t\t\t\t\t\t#linkparams=array;\n\t\t\t\t\t\titerate: #navitem -> (find: 'params'), (local: 'param');\n\t\t\t\t\t\t\tif: #clientparams >> #param && #clientparams -> (find: #param) -> first -> type == 'pair';\n\t\t\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got pair param');\n\t\t\t\t\t\t\t\t#linkparams -> (insert: #clientparams -> (find: #param) -> first -> name = #clientparams -> (find: #param) -> first -> value);\n\t\t\t\t\t\t\telse: #clientparams >> #param;\n\t\t\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got plain param');\n\t\t\t\t\t\t\t\t#linkparams -> (insert: #clientparams -> (find: #param) -> first);\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#link = (self -> (url: -path=#thispath, -params=self -> (linkparams: -navitem=#navitem), -topself=#topself));\n\t\t\t\t\telse;*/\n\t\t\t\t\t\t//#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': no params for ' + #thispath);\n\t\t\t\t\t\t#link = (self -> (url: -path=#thispath, -topself=#topself));\n\t\t\t\t\t///if;\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t#itemlinkstart = '<a href=\"' + #link + '\"';\n\t\t\t\t\tif: (#navitem -> (find: 'title')) != '';\n\t\t\t\t\t\t#itemlinkstart += ' title=\"' + (encode_html: (#navitem -> (find: 'title'))) + '\"';\n\t\t\t\t\t/if;\n\t\t\t\t\tif: (((#topself -> 'path') + '/') -> (beginswith: #thispath + '/'));\n\t\t\t\t\t\t#classarray -> (insert: ((#topself -> 'currentclass') != '' ? (#topself -> 'currentclass') | 'crnt') );\n\t\t\t\t\t/if;\n\t\t\t\t\tif: #classarray -> size;\n\t\t\t\t\t\t#itemlinkstart += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemlinkstart += '>';\n\t\t\t\t\t#itemlabel=(#navitem -> (find: 'label'));\n\t\t\t\t\tif: #thispath == (#topself -> 'path');\n\t\t\t\t\t\tif: (self -> 'currentmarker') -> type != 'null';\n\t\t\t\t\t\t\t#currentmarker = (self -> 'currentmarker');\n\t\t\t\t\t\telse: (#topself -> 'currentmarker') -> type != 'null';\n\t\t\t\t\t\t\t#currentmarker = (#topself -> 'currentmarker');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemlinkend = '</a>';\n\t\t\t\t\tif: ( (((#topself -> 'path') + '/') -> (beginswith: #thispath + '/')) || #_expand)\n\t\t\t\t\t\t&& self -> (haschildren: #navitem)\n\t\t\t\t\t\t&& !#_flat;\n\t\t\t\t\t\t// recursively render child items\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': begin rendering children for ' + #basepath + '/' + (#navitem -> (find: 'key')) );\n\t\t\t\t\t\t// clear debug_trace for child\n\t\t\t\t\t\t(#navitem -> (find: 'children') -> 'debug_trace') = array;\n\t\t\t\t\t\t#itemchildren += (#navitem -> (find: 'children') -> (renderhtml: -basepath=#basepath + '/' + (#navitem -> (find: 'key')), \n\t\t\t\t\t\t\t-ancestor=#topself,\n\t\t\t\t\t\t\t-flat=#_flat,\n\t\t\t\t\t\t\t-expand=#_expand));\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (merge: (#navitem -> (find: 'children') -> 'debug_trace'));\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': done rendering children');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif: #itemrow >> '#link#';\n\t\t\t\t\t#itemrow -> (replace: '#link#', #itemlinkstart) \n\t\t\t\t\t\t& (replace: '#title#', #itemlabel)\t// deprecated, use #label# instead\n\t\t\t\t\t\t& (replace: '#label#', #itemlabel)\t// preferred\n\t\t\t\t\t\t& (replace: '#/link#', #itemlinkend)\n\t\t\t\t\t\t& (replace: '#children#', #itemchildren);\n\t\t\t\telse;\n\t\t\t\t\tif: #itemrow !>> '#current#';\n\t\t\t\t\t\t#itemlabel += '#current#';\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemrow -> (replace: '#item#', #itemlinkstart + #itemlabel + #itemlinkend \n\t\t\t\t\t\t+ #itemchildren);\n\t\t\t\t/if;\n\t\t\t\t#itemrow -> (replace: '#current#', #currentmarker);\n\t\t\t\t#itemoutput += #itemrow;\n\t\t\t/if;\n\t\t/iterate;\n\t\t#output = (string_replaceregexp: #template, -find='(?si)#items#(.*?)#/items#', -replace=#itemoutput);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': render done in ' (self -> 'tagtime') + ' ms');\n\t\treturn: @#output;\n\n\t/define_tag;\n\n\tdefine_tag: 'renderbreadcrumb', -description='Shows the current navigation as breadcrumb trail. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-delimiter (optional) Specifies the delimiter to use between nav levels, defaults to \" > \" if not specified\\n\\\n\t\t\t-home (optional flag) Show the default navigation item (i.e. \"home\") first in the breadcrumb (unless already there).',\n\t\t-optional='delimiter',\n\t\t-optional='home',\n\t\t-optional='skipcurrent',\n\t\t-optional='plain';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'output'=array, 'path'=array;\n\t\t!(local_defined: 'delimiter') ? local: 'delimiter'=' &gt; ';\n\t\tif: (local_defined: 'home') && #home != false;\n\t\t\t// show the default navigation item first in breadcrumb\n\t\t\t\n\t\t\t// find default path\n\t\t\tif: self -> 'default' != '' && self -> pathmap >>  self -> 'default';\n\t\t\t\tlocal: 'homepath'= (self -> 'default');\n\t\t\telse;\n\t\t\t\t// use first top level nav item as default\n\t\t\t\tlocal: 'homepath'= self -> 'navitems' -> first -> (find: 'key');\n\t\t\t/if;\n\t\t\t\n\t\t\tif: !((self -> 'path') -> (beginswith: #homepath));\n\t\t\t\tif: (local_defined: 'plain') && #plain != false;\n\t\t\t\t\t#output -> (insert: (self -> (getnav: #homepath)) -> (find: 'label'));\n\t\t\t\telse;\n\t\t\t\t\t#output -> (insert: '<a href=\"' + (self -> (url: -path=#homepath)) + '\">' + (self -> (getnav: #homepath)) -> (find: 'label') + '</a>');\t\t\t\t\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\titerate: (self -> 'patharray'), (local: 'pathitem');\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': pathitem ' #pathitem);\n\t\t\t#path -> (insert: #pathitem);\n\t\t\tif: (self -> (getnav: #path)) -> (find: 'hide');\n\t\t\t\t// do not show in navigation\n\t\t\t\tloop_abort;\n\t\t\telse;\n\t\t\t\tif: (local_defined: 'plain') && #plain != false;\n\t\t\t\t\t#output -> (insert: (self -> (getnav: #path)) -> (find: 'label'));\n\t\t\t\telse;\n\t\t\t\t\t#output -> (insert: '<a href=\"' + (self -> (url: -path=#path)) + '\">' + (self -> (getnav: #path)) -> (find: 'label') + '</a>');\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: (local_defined: 'skipcurrent') && #skipcurrent != false;\n\t\t\t#output -> removelast;\n\t\t/if;\n\t\t#output = #output -> (join: #delimiter);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'getnav', -description='Return reference to the current navigation object map, or for the specified path.',\n\t\t-optional='path', -copy;  \n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t!(local_defined: 'path') ? local: 'path'=(self -> 'patharray');\n\t\tif: #path -> type != 'array';\n\t\t\t#path = string: #path;\n\t\t\t#path -> (removeleading: '/') & (removetrailing: '/');\n\t\t\t#path = #path -> (split: '/');\n\t\t/if;\n\t\t(self -> pathmap) !>> (#path -> (join: '/')) ? return: map;\n\n\t\tlocal: 'nav'=@self,\n\t\t\t'navmap'=map;\n\t\tlocal: 'pathitem' = #path -> (get: 1);\n\t\tif: #nav -> keymap >> #pathitem; \n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found ' + #pathitem + ' in nav');\n\t\t\t#navmap = @((#nav -> 'navitems') -> (get: ((#nav -> keymap) -> (find: #pathitem))));\n\t\t\tif: #navmap -> type == 'map' && !(#navmap -> (find: 'disabled')) && #navmap -> (find: 'children') -> type == 'nav' && #path -> size > 1;\n\t\t\t\t// look into children level recursively - remove the path level we are at now\n\t\t\t\t#path -> (remove: 1);\n\t\t\t\treturn: @(#navmap -> (find: 'children')) -> (getnav: #path); // recursion\n\t\t\telse;\n\t\t\t\t// we are at the bottom, bail out\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\treturn: @#navmap;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\n\t\n\tdefine_tag: 'getargs', -description='Path arguments = the leftover when we found a matching path, to be used for keyvalue for example.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-index (optional integer) Specifies which leftover path item to return, defaults to all path items as a string',\n\t\t-optional='index', -type='integer';\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t\n\t\tlocal: 'args'=(self -> 'pathargs');\n\t\t#args == '' ? return;\n\t\tif: local_defined: 'index';\n\t\t\t#args = #args -> (split: '/');\n\t\t\tif: #args -> size >= #index;\n\t\t\t\treturn: #args -> (get: #index);\n\t\t\telse;\n\t\t\t\treturn;\n\t\t\t/if;\n\t\telse;\n\t\t\treturn: #args;\n\t\t/if;\n\t\t\n\t/define_tag;\n\t\n\tdefine_tag: 'label', -description='Returns the name of the current (or specified) nav location\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-path (optional)',\n\t\t-optional='path', -copy;\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t!(local_defined: 'path') ? local: 'path'=@(self -> 'path');\n\t\treturn: self -> (getnav: #path) -> (find: 'label');\n\t/define_tag;\n\n\tdefine_tag: 'path', -description='Returns url or key path for the current or specified location.',\n\t\t-optional='path', -copy;\t\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t!(local_defined: 'path') ? local: 'path'=@(self -> 'path');\n\t\tif: self -> (getnav: #path) -> (find: 'url') != '';\n\t\t\tlocal: 'url'=self -> (getnav: #path) -> (find: 'url');\n\t\t\t#url -> (removeleading: '/') & (removetrailing: '/');\n\t\t\treturn: #url;\n\t\telse: #path -> type == 'array';\n\t\t\treturn: @(#path -> (join: '/'));\n\t\telse;\n\t\t\treturn: @#path;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'patharray', -description='Returns current path as array.';\n\t\t\treturn: (self -> 'patharray');\n\t/define_tag;\n\n\tdefine_tag: 'actionpath', -description='Returns action path if any.';\n\t\t\treturn: (self -> 'actionpath');\n\t/define_tag;\n\n\tdefine_tag: 'linkparams', -description='Returns an array for all parameters that should be sent along with nav links',\n\t\t-required='navitem', -type='map';\n\t\tif: (#navitem -> (find: 'params')) -> type == 'array';\n\t\t\tlocal: 'linkparams'=array,\n\t\t\t\t'dotrace'=(self -> 'dotrace'),\n\t\t\t\t'clientparams'=client_getparams;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': checking params ' + (#navitem -> (find: 'params')));\n\t\t\t#clientparams -> (merge: client_postparams);\n\t\t\titerate: #navitem -> (find: 'params'), (local: 'param');\n\t\t\t\t\titerate(#clientparams -> find(#param), local('paraminstance'));\n\t\t\t\t\tif: #paraminstance -> type == 'pair';\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got pair param');\n\t\t\t\t\t\t#linkparams -> (insert: (#paraminstance -> name) = (#paraminstance -> value));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got plain param');\n\t\t\t\t\t\t#linkparams -> (insert: #paraminstance);\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/iterate;\n\t\t\treturn: @#linkparams;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'data', -description='Returns data object that can be stored for the current nav location (or specified nav location).\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-path (optional)\\n\\\n\t\t\t-type (optional string) Force a certain return type. If the stored object doesn´t match the specified type, an empty instance of the type is returned. That way the data can be filtered by type without having to use conditionals to check the type before. ',\n\t\t-optional='path', -copy,\n\t\t-optional='type';\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t!(local_defined: 'path') ? local: 'path'=@(self -> 'path');\n\t\tif: (local_defined: 'type');\n\t\t\tif: self -> (getnav: #path) -> (find: 'data') -> type == #type;\n\t\t\t\treturn: self -> (getnav: #path) -> (find: 'data');\n\t\t\telse;\n\t\t\t\t// return empty instance of the specified type\n\t\t\t\treturn: (\\#type)->astype;\n\t\t\t/if;\n\t\telse;\n\t\t\treturn: self -> (getnav: #path) -> (find: 'data');\n\t\t/if;\n\t/define_tag;\n\n\t\n\tdefine_tag: 'url', -description='Returns full url for current path or specified path. Path parameters can be provided and overridden by \\\n\t\t\tpassing them to this tag. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-path (optional) \\n\\\n\t\t\t-params (optional) Pair array to be used in url instead of plain parameters sent to this tag\\n\\\n\t\t\t-urlargs (optional) Raw string with url parameters to append at end of url and -params\\n\\\n\t\t\t-getargs (optional flag) Add the getargs (leftover path parts) to the url\\n\\\n\t\t\t-except (optional) Array of parameter names to exclude (or single parameter name as string)\\n\\\n\t\t\t-topself (optional nav) Internal, needed to call url from renderhtml when rendering sublevels\\n\\\n\t\t\t-autoparams (optional flag) Enables the automatic passing of action_params that begin with \"-\"',\n\t\t-optional='path', -copy,\n\t\t-optional='params', -copy,\n\t\t-optional='urlargs',\n\t\t-optional='except', -copy,\n\t\t-optional='topself', -type='nav',\n\t\t-optional='autoparams';\n\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'url'=string,\n\t\t\t'urlparams'=array;\n\t\t// only getparams to not send along -action etc\n\t\tlocal: 'clientparams'=client_getparams, 'param'=null;\n\n\t\t!(local_defined: 'except') ? local: 'except'=array;\n\t\t#except -> type != 'array' ? #except = array: #except;\n\t\t#except -> insert('-session');\n\t\t!(local_defined: 'topself') ? local: 'topself'=@self;\n\t\t!(local_defined: 'params') ? local: 'params'=(params -> isa('array') ? params | array);\n\t\t!#params -> isa('array') ? #params = array(#params); // added by Jolle 101117\n\t\tif: local_defined: 'path';\n\t\t\tif: #params >> '-path';\n\t\t\t\t// -path was passed as explicit param\n\t\t\t\t#params -> (removeall: '-path');\n\t\t\telse: #params >> #path;\n\t\t\t\t// -path was passed as implicit param - shows up in params as plain value (no pair) so remove the value from params\n\t\t\t\t#params -> (removeall: #path);\n\t\t\t/if;\n\t\telse;\n\t\t\tlocal: 'path'=(#topself -> 'path');\n\t\t/if;\n\t\tlocal: 'navitem'=#topself -> getnav: #path;\n\t\tif: (#navitem -> (find: 'params')) -> type == 'array';\n\t\t\t// add parameters defined as -param for nav item\n\t\t\t#params -> (merge: (#topself -> (linkparams: -navitem=#navitem)));\n\t\t/if;\n\t\tif: #params -> isa('array');\n\t\t\t// clean up other parameters passed to he tag\n\t\t\t#params -> (removeall: '-urlargs')\n\t\t\t\t& (removeall: '-topself')\n\t\t\t\t& (removeall: '-params')\n\t\t\t\t& (removeall: '-except')\n\t\t\t\t& (removeall: '-autoparams')\n\t\t\t\t& (removeall: '-getargs');\n\t\t /if;\n\n\t\titerate: #except, (local: 'param');\n\t\t\t#params -> (removeall: #param);\n\t\t/iterate;\n\n\t\t#url = (#topself -> (path: #path)) + ((#topself -> (path: #path)) != '' ? '/');\n\t\tif: (#topself -> getargs) -> size && (local_defined: 'getargs') && #getargs != false;\n\t\t\t// for links to the current path, add the path args \n\t\t\t#url += (#topself -> getargs) + '/';\n\t\t/if;\n\t\tif: #params >> '-keyvalue';\n\t\t\t#url += (#params -> (find: '-keyvalue') -> first -> value) + '/';\n\t\t\t#params -> (removeall: '-keyvalue');\n\t\t/if;\n\t\t\n\t\titerate: (#params -> type == 'array' ? #params | array: #params), (local: 'param');\n\t\t\tif: #param -> type == 'pair';\n\t\t\t\t#urlparams -> (insert: (encode_stricturl: #param -> name) + '=' + (encode_stricturl: #param -> value));\n\t\t\telse: #param != '';\n\t\t\t\t#urlparams -> (insert: (encode_stricturl: #param));\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: (local_defined: 'autoparams') && #autoparams != false;\n\t\t\t// add getparams that begin with -\n\t\t\titerate: #clientparams, #param;\n\t\t\t\tif: #param -> type == 'pair';\n\t\t\t\t\tif: #param -> name -> (beginswith: '-') && #except !>> #param -> name;\n\t\t\t\t\t\t#urlparams -> (insert: (encode_stricturl: #param -> name) + '=' + (encode_stricturl: #param -> value));\n\t\t\t\t\t/if;\n\t\t\t\telse; // just a string param (no pair)\n\t\t\t\t\tif: #param -> (beginswith: '-') && #except !>> #param;\n\t\t\t\t\t\t#urlparams -> (insert: encode_stricturl: #param);\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t\n\t\tif: (#topself -> 'navmethod') == 'param';\n\t\t\t#url = './?' + #url + (#urlparams -> size || (local: 'urlargs') != '' ? '&amp;');\n\t\telse;  // path\n\t\t\t#url = (#topself -> 'root') + #url +  (#urlparams -> size || (local: 'urlargs') != '' ? '?');\n\t\t/if;\n\n\t\t#urlparams = string: (#urlparams -> (join: '&amp;'));\n\t\t// restore / in paths for looks\n\t\t#urlparams -> replace('%2f', '/');\n\t\t#url += #urlparams;\n\t\t#urlparams -> size && (local: 'urlargs') -> size ? #url += '&amp;';\n\t\t(local: 'urlargs') -> size ? #url += #urlargs;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#url;\n\t/define_tag;\n\t\n\tdefine_tag: 'filename', -description='Returns the full path to the specified type of precissing file for the current navigation. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-type (required) lib, act, cnt, cfg, actcfg',\n\t\t-required='type',\n\t\t-optional='path', -copy;\n\t\t/*\n\t\t\n\t\t-filenaming can be one of prefix, suffix or extension. \n\t\tPrefix is \"the old way\". lib_customer.inc.  This is the default if -filenaming is not specified. \n\t\tSuffix is a hybrid, for example customer_lib.inc. \n\t\tExtension is for example customer.lib\n\t\t\n\t\tThe rest is automatic. \n\t\t\n\t\t\n\t\tPossible places to look for a library file that belongs to the path \"customer/edit\" (in order of precedence):\n\t\tA) -filenaming='prefix' (default)\n\t\t1. _mod_customer/lib_customer_edit.inc \t\t// modular prefixed with module name\n\t\t2. _mod_customer/lib_edit.inc\t\t\t\t// modular\n\t\t3. _mod_customer/_library/lib_customer_edit.inc\t// modular separated, prefixed with module name\n\t\t4. _mod_customer/_library/lib_edit.inc\t\t// modular separated\n\t\t5. _library/lib_customer_edit.inc\t\t\t// collective (\"all modules together\") separated. This is the old way. \n\t\t\n\t\tB) -filenaming='suffix'\n\t\t1. _mod_customer/customer_edit_lib.inc\n\t\t2. _mod_customer/edit_lib.inc\n\t\t3. _mod_customer/_library/customer_edit_lib.inc\n\t\t4. _mod_customer/_library/edit_lib.inc\n\t\t5. _library/customer_edit_lib.inc\n\t\t\n\t\tC) -filenaming='extension'\n\t\t1. _mod_customer/customer_edit.lib\n\t\t2. _mod_customer/edit.lib\n\t\t3. _mod_customer/_library/customer_edit.lib\n\t\t4. _mod_customer/_library/edit.lib\n\t\t5. _library/customer_edit.lib\n\t\t\n\t\tThe principle is to start looking at the most specific location and then look at more and more generic locations, to be able to do the local override. \n\n\t\t*/\n\t\t\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'filenamearray'=array, \n\t\t\t'filenamearray_temp'=array,\n\t\t\t'filename'=string,\n\t\t\t'prefix'=string,\n\t\t\t'type_short'=string,\n\t\t\t'suffix'=string,\n\t\t\t'extension'=string,\n\t\t\t'typefoldermap'=(map: \n\t\t\t\t'cfg'='_config/', \n\t\t\t\t'actcfg'='_config/', \n\t\t\t\t'act'='_action/',\n\t\t\t\t'lib'='_library/',\n\t\t\t\t'cnt'='_content/'),\n\t\t\t'typefolder'=string,\n\t\t\t'basefolder'=string,\n\t\t\t'directorytree' = (self -> directorytree);\n\t\tif: #type == 'act' || #type == 'actcfg';\n\t\t\tlocal('path') -> size == 0 ? local('actionpath'=string(self -> 'actionpath')) | local('actionpath'=string(#path));\n\t\t\t#actionpath -> removeleading('/') & removetrailing('/');\n\t\t\t#actionpath == '' ? return;\n\t\t\t#filenamearray = (self -> getnav(#actionpath) -> find('filename'));\n\t\t\tif: #filenamearray  == '';\n\t\t\t\t#filenamearray=#actionpath;\n\t\t\t/if;\n\t\t\t#filenamearray = #filenamearray -> split('/');\n\t\telse;\n\t\t\tlocal('path') -> size == 0 ? local('path'=string(self -> 'path'));\n\t\t\t#path -> removeleading('/') & removetrailing('/');\n\t\t\tself -> getnav(#path) -> size == 0 ? return;\n\t\t\t#filenamearray=(self -> getnav(#path) -> find('filename'));\n\t\t\tif: #filenamearray == '';\n\t\t\t\t#filenamearray=#path;\n\t\t\t/if;\n\t\t\t#filenamearray = #filenamearray -> split('/');\n\t\t/if;\n\t\t#type =='actcfg' ? #prefix = 'cfg' | #prefix = #type;\n\t\t#type_short = #prefix;\n\t\t#typefolder=#typefoldermap -> (find: #type);\n\n\t\tselect: (self -> 'filenaming');\n\t\tcase: 'suffix';\n\t\t\t#suffix='_' + #prefix;\n\t\t\t#extension='.inc';\n\t\t\t#prefix = '';\n\t\tcase: 'extension';\n\t\t\t#extension='.' + #prefix;\n\t\t\t#suffix='';\n\t\t\t#prefix = '';\n\t\tcase; // prefix as default\n\t\t\t#prefix += '_';\n\t\t\t#extension='.inc';\n\t\t\t#suffix='';\n\t\t/select;\n\n\t\tlocal: 'findtimer'=_date_msec;\n\t\tloop: 2;\n\t\t\t#basefolder=(array: '', '_knop/') -> (get: loop_count);\n\t\t\tloop: 5;\n\t\t\t\t#filename = string;\n\t\t\t\tselect: loop_count;\n\t\t\t\tcase: 1;\n\t\t\t\t\t// customer/lib_customer_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= 1;\n\t\t\t\t\t\t// at least 1 level, look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filename += '/' + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t/if;\n\t\t\t\tcase: 2; \n\t\t\t\t\t// customer/lib_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= ((self -> 'filenaming') == 'extension' ? 2 | 1);\n\t\t\t\t\t\t// at least 1 level (2 levels for suffix naming), look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filenamearray_temp -> removefirst;\n\t\t\t\t\t\t#filename += '/' + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t\tif(#filenamearray -> size == 1);\n\t\t\t\t\t\t\t// clean up underscore so filename ends up as lib.inc instead of lib_.inc etc\n\t\t\t\t\t\t\t#filename -> replace('/' + #type_short + '_' + #extension, '/' + #type_short + #extension);\n\t\t\t\t\t\t\t#filename -> replace('/_' + #type_short + #extension, '/' + #type_short + #extension);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\tcase: 3;\n\t\t\t\t\t// customer/_library/lib_customer_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= 2;\n\t\t\t\t\t\t// at least 2 levels, look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filename += '/' + #typefolder + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t/if;\n\t\t\t\tcase: 4;\n\t\t\t\t\t// customer/_library/lib_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= 2;\n\t\t\t\t\t\t// at least 2 levels, look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filenamearray_temp -> removefirst;\n\t\t\t\t\t\t#filename += '/' + #typefolder + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t/if;\n\t\t\t\tcase;\n\t\t\t\t\t// _library/lib_customer_edit.inc\n\t\t\t\t\t#filename = #basefolder + #typefolder + #prefix + (#filenamearray -> (join: '_')) \n\t\t\t\t\t\t+ #suffix + #extension;\n\t\t\t\t/select;\n\t\t\t\tif: #filename != '';\n\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': trying ' + (self -> 'fileroot') + #filename );\n\t\t\t\t\tif: #directorytree >> #filename;\n\t\t\t\t\t\t//file_exists: (self -> 'fileroot') + #filename;\n\t\t\t\t\t\t// clean up and exit\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': ** Found ' + (self -> 'fileroot') + #filename + ' in ' + (_date_msec - #findtimer) ' ms');\n\t\t\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\t\t\treturn: (self -> 'fileroot') + #filename;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/loop;\n\t\t/loop;\n\t\t// clean exit if nothing was found\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn;\n\n\t/define_tag;\n\t\n\tdefine_tag: 'actionconfigfile', -description='Shortcut to filename: actcfg'; return: self -> (filename: 'actcfg'); \t/define_tag;\n\tdefine_tag: 'actionfile', -description='Shortcut to filename: act'; \t\treturn: self -> (filename: 'act'); \t\t/define_tag;\n\tdefine_tag: 'configfile', -description='Shortcut to filename: cfg'; \t\treturn: self -> (filename: 'cfg'); \t\t/define_tag;\n\tdefine_tag: 'libraryfile', -description='Shortcut to filename: lib'; \t\treturn: self -> (filename: 'lib'); \t\t/define_tag;\n\tdefine_tag: 'contentfile', -description='Shortcut to filename: cnt'; \t\treturn: self -> (filename: 'cnt'); \t\t/define_tag;\n\n\tdefine_tag: 'include', -description='Includes any of the files for the current path, fails silently if file does not exist. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-file (required) lib, act, cnt, cfg, actcfg or library, action, config, actionconfig, content, or any arbitrary filename',\n\t\t-required='file',\n\t\t-optional='path';\n\t\tknop_debug(self->type + ' -> ' + tag_name + ' ' + params -> first, -type=self->type, -open);\n\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name + ' ' + params -> first, -close, -time, -witherrors);/handle;\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t// includes any of the files for the current path, fails silently if file does not exist\n\t\tlocal: 'translation'=(map:\n\t\t\t\t'actionconfig'= 'actcfg',\n\t\t\t\t'action'= 'act',\n\t\t\t\t'config'= 'cfg',\n\t\t\t\t'library'= 'lib',\n\t\t\t\t'content'= 'cnt'),\n\t\t\t'types'=(map: 'actcfg', 'act', 'cfg', 'lib', 'cnt'),\n\t\t\t'result'=string;\n\t\tlocal: 'type'= (#translation >> #file ? #translation -> (find: #file) | #types >> #file ? #file | 'other');\n\t\t// find out full filename\n\t\t!local_defined('path') ? local('path'=null);\n\t\tlocal: 'filename'=null;\n\t\tif: #types >> #type;\n\t\t\t// knop include\n\t\t\t#filename = self -> filename(#type, -path=#path);\n\t\telse: (self -> directorytree) >> #file;\n\t\t\t// arbitrary include within the Knop folder structure\n\t\t\t#filename = (self -> 'fileroot') + #file;\n\t\telse: (self -> directorytree) >> '_knop/' + #file;\n\t\t\t// arbitrary include one level down in _knop folder\n\t\t\t#filename = (self -> 'fileroot') + '_knop/' + #file;\n\t\t/if;\n\t\tif: #type == 'cfg' && #filename -> size && (self -> 'actionconfigfile_didrun') == #filename;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': ' + #filename ' has already run as actionconfig');\n\t\t\t//knop_debug(self->type + ' -> ' + tag_name + ': ' + #filename ' has already run as actionconfig');\n\t\t\treturn;\n\t\telse: #type == 'actcfg';\n\t\t\t// remember that we have run this config file as actionconfig so we don't run the same file again as page config\n\t\t\t(self -> 'actionconfigfile_didrun') = #filename;\n\t\t/if;\n\t\tif: #filename != '';\n\t\t\tlocal: 't'=_date_msec;\n\t\t\t#result=@(include: #filename);\n\t\t\t(self -> 'debug_trace') -> (insert: 'Include ' + #file + ': ' + #filename + ' processed in ' + (_date_msec - #t) ' ms');\n\t\t\t//knop_debug(self->type + ' -> ' + tag_name + ' ' + #file + ': ' + #filename + ' processed in ' + (_date_msec - #t) ' ms', -type=self->type);\n\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\treturn: @#result;\n\t\telse;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: 'Include ' + #file + ': no matching filename found');\n\t\t\tknop_debug(self->type + ' -> ' + tag_name + ' ' + #file + ': no matching filename found');\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag: 'library', -description='includes file just as ->include, but returns no output', \n\t\t-required='file',\n\t\t-optional='path';\n\t\t// includes file just as ->include, but returns no output\n\t\t!local_defined('path') ? local('path'=null);\n\t\tself -> include(#file, -path=#path);\n\t\t// returns nothing\n\t/define_tag;\n\n\tdefine_tag: 'directorytree', -description='Returns a map of all existing knop file paths', \n\t\t-optional='basepath'; // only used for recursive calls\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'dirlist'=map;\n\t\tif: (self -> 'directorytreemap') -> size;\n\t\t\t// use the stored directory tree that has already been created\n\t\t\t#dirlist = (self -> 'directorytreemap');\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': Returning stored directorytree');\n\n\t\telse;\n\t\t\t// first time calling this tag - create the directory tree\n\t\t\tif: (local_defined: 'basepath');\n\t\t\t\tlocal: 'path' = #basepath;\n\t\t\telse;\n\t\t\t\tlocal: 'path'=(self -> 'fileroot');\n\t\t\t/if;\n\t\t\t!(#path -> (endswith: '/')) ? #path += '/';\n\t\t\tlocal: 'diritem'=string,\n\t\t\t\t'dirlist_sub'=map,\n\t\t\t\t'diritem_sub'=pair;\n\t\t\titerate: file_listdirectory: #path, #diritem;\n\t\t\t\tif: !(#diritem -> (beginswith: '.'));\n\t\t\t\t\t#dirlist_sub = map;\n\t\t\t\t\t#diritem -> (removetrailing: '/');\n\t\t\t\t\tif: //#diritem -> (endswith: '/') && \n\t\t\t\t\t\t((map: '_knop', '_include', '_config', '_action', '_library', '_content') >> #diritem\n\t\t\t\t\t\t\t|| #diritem -> (beginswith: '_mod_'));\n\t\t\t\t\t\t// recursive call for sub folder within the Knop directory structure\n\t\t\t\t\t\t#dirlist_sub = self -> (directorytree: #path + #diritem);\n\t\t\t\t\t\titerate: #dirlist_sub, #diritem_sub;\n\t\t\t\t\t\t\t#dirlist -> (insert: #diritem + '/' +  #diritem_sub -> name);\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t/if;\n\t\t\t\t\t// Add item to map, with trailing / if item has sub items (folder contents)\n\t\t\t\t\t#dirlist -> (insert: #diritem + (#dirlist_sub -> size ? '/'));\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\tif: !(local_defined: 'basepath');\n\t\t\t\t// this was the topmost call in the recursive chain, so store the result\n\t\t\t\t(self -> 'directorytreemap') = #dirlist;\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': Creating directorytree');\n\t\t\t/if;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #dirlist;\n\t/define_tag;\n\n\n\tdefine_tag: 'trace', \n\t\t-optional='html',\n\t\t-optional='xhtml';\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\n\t\treturn: #eol + 'Debug trace for nav $' + (self -> varname)\n\t\t\t+ (!#dotrace ? ' (detailed trace not enabled)' )\n\t\t\t+ #eol + (self -> 'debug_trace') -> (join: #eol) \n\t\t\t+ #eol;\n\n\t/define_tag;\n\n/define_type;\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_nav\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_user\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'user',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2009-09-18',\n\t\t'descripion'='Custom type to handle user identification and authentication';\n\n/*\n\nCHANGE NOTES\n2012-01-16\tSP\tAdded ->removedata to remove field from the data map.  Thanks to Ric Lewis.\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-23\tJS\t->encrypt now uses default encrypt_cipher from the custom type instead of a hard coded default\n2009-02-26\tJS\t->login: further correction on the search for login with FileMaker, to reduce the risk for false duplicates\n2009-02-26\tJS\t->login: Added optional -searchparams to be able to add more conditions to the login search, for example to exclude users that are not enabled. \n2008-12-02\tJS\t->encrypt: Changed to -hex cipher instead of encode_base64\n2008-11-05\tJS\t->getdata: corrected a check that prevented the tag from returning anything\n2008-11-05\tJC\t->login: A failed login attempt now results in a logout instead of keeping any old authentication\n2008-11-05\tJC\t->getpermission will always return falseif a user is not logged in\n2008-11-05\tJC\t->logout: The permissions map is now cleared when logging out\n2008-11-04\tJC\t->encrypt: changed incorrect encrypt_cipher to encrypt_digest\n2008-09-10\tJS\tAdded ondeserialize to make client_fingerprint_expression survive session\n2008-07-17\tJS\tImplemented ->setpermission and ->getpermission\n2008-07-17\tJS\tAdded client_fingerprint_expression as compound expression so it can be configurable by changing the instant variable\n2008-05-20\tJS\t->login: Added delay between more than 5 failed login attempts \n2008-05-08\tJS\t->login: improved the search for FileMaker datasources to make it work for email address as username\n2008-02-08\tJS\tAdded ->keys\n2008-02-03\tJS\t-> login: Corrected storage of id_user\n2007-11-27\tJS\tCoded an incomplete version\n2007-06-13\tJS\tCreated the data type\n\n// TODO: \nMake it possible for knop_user to work independently of a knop_database object by creating a custom user lookup - see http://listsearch.com/Lasso/Thread/index.lasso?20528\nuserdb reference is brooken, probably when stored in session. Can this be fixed?\nMake client_fingerprint configurable by specifying a compound expression at oncreate\nAdd support for role based permisions\n\n*/\n\n\n/*\nPurpose:\n- Maintain user identity and authentication\n- Handle database record locking more intelligently, also to be able to release all unused locks for a user\n- Authenticating user login\n- Restricting access to data\n- displaying specific navigation options depending on type of user\n\nlets add some date handling in there too like time of last login\nand probably the IP that the user logged in from.\n\n\nSome options to handle what happens when a user logs in again whilst already logged in.\nie one could:\ndisallow second login (with a message explaining why)\nautomatically log the first session out (with a message indicating what happened)\nsend a message to first session: \"Your username is attempting to log in again, do you wish to close this session, or deny the second login attempt?\"\nallow multiple logins (from the same IP address)\nallow multiple logins from any IP address\n\nAll of these could be useful options, depending of the type of app.\n\nAnd different types of user (ie normal, admin) could have different types of treatment.\n\nHandling for failed login attempts:\nOption to set how many tries can be attempted; \nOption to lock users out permanently after x failed attempts? \nLogging (to database) of failed logins / successful logins\n\nPassword recovery system (ie emailing a time sensitive link to re-set password)\nBy \"password recovery\" I'm not thinking \"email my password\" (hashed passwords can't be emailed...) but rather to email a short lived link that gives the user an opportunity to change his password. How is this different from \"password reset\"?\nYes, that is an accurate description of what I had in mind, except for the bit about emailing a short-lived link.  Instead I imagined having the user reset their password 100% on the web site through the use of \"Security Questions\", much like banks employ.\n\nI like the idea of more info attached to the user. Like login attempts, locking a user temporarily after too many failed attempts etc.\n\n\nThe setup is more or less that I have users and groups.\n\nI'm thinking that Knop shouldn't do any session handling by itself, but the knop_user variable would be stored in the app's session as any other variable. Knop should stay as lean as possible...\n\nOther things to handle:\nPrevent session sidejacking by storing and comparing the user's ip and other identifying properties.\nProvide safe password handling with strong one-way salted encryption.\n\nconsider having a separate table for auditing all user actions, including logging in, logging out, the basic CRUD actions, searches\n\nThe object have to handle situations where no user is logged in. A guest can still have rights to some actions. Modules that can be viewed. Forms that could be sent in etc.\nThat the added functions don't slow down the processing. We already have a lot of time consuming overhead in Knop.\n\n\n\nFeatures:\n1. Authentication and credentials\n- Handle the authentication process\n- Keep track of if a user is properly logged in\n- Optionally keep track of multiple logins to same account\n- Prevent sidejacking\n- Optionally handle encrypted/hashed passwords (with salt)\n- Prevent brute force attacks (delay between attempts etc)\n- Handle general information about the user\n- Provide accessors for user data\n\n2. Permissions and access control\n- Keep track of what actions a user is allowed to perform (the \"verbs\")\n- Tie into knop_nav to be able to filter out locations based on permissions\n\n3. Record locks\n- Handle clearing of record locks from knop_database\n\n4. Audit trail/logging\n- Optionally log login/logout actions\n- Provide hooks to be able to log other user actions\n\nFuture additions:\n- Keep track of what objects and resources a user is allowed to act on (the \"nouns\")\n- Provide filtering to use in database queries\n- What groups a user belongs to\n- Mechanism to update user information, password etc\n- Handle password recovery\n\n\nPermissions can be read, create, update, delete, or application specific (for example publish)\n\n*/\n\n\tlocal: 'id_user'=null,\n\t\t'validlogin'=false,\n\t\t'groups'=array,\n\t\t'data'=map,\t\t\t\t\t\t// map with arbitrary user information (name, address etc)\n\t\t'permissions'=map,\n\t\t'loginattempt_date'=(date: 0),\t// to keep track of delays multiple login attempts\n\t\t'loginattempt_count'=integer,\t// number of failed login attempts\n\n\t\t'userdb'=null,\t\t\t\t\t// database object for user authentication\n\t\t'useridfield'='id',\t\n\t\t'userfield'='username',\t\n\t\t'passwordfield'='password',\n\t\t'saltfield'=null,\n\t\t'encrypt'=false,\n\t\t'encrypt_cipher'='RIPEMD160',\t// digest encryption method\n\n\t\t'logdb'=null,\t\t\t\t\t// database object for logging\n\t\t'logeventfield'='event',\t\t// the event to be logged\n\t\t'loguserfield'='id_user',\t\t// the user who is performing the logged action\n\t\t'logobjectfield'='id_object',\t// what object is affected by the logged action\n\t\t'logdatafield'='data',\t\t\t// details about the logged action\n\n\t\t'singleuser'=false,\n\t\t'uniqueid'=null,\t\t\t\t// To track multiple logins on the same account (this is to be stored and compared server side)\n\t\t'client_fingerprint'=null,\t\t// combination of ip, useragent etc to be able to track sidejacking\n\t\t'client_fingerprint_expression'={return(encrypt_md5(string(client_ip) + client_type))},\n\t\t'dblocks'=array,\t\t\t\t// a list of all database objects that have been locked by this user \n\t\t'error_lang'=(knop_lang: -default='en', -fallback),\n\t\t;\n\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-encrypt (optional flag or string) Use encrypted passwords. If a value is specified then that cipher will be used instead of the default RIPEMD160. If -saltfield is specified then the value of that field will be used as salt.\\n\\\n\t\t\t-singleuser (optional flag) Multiple logins to the same account are prevented (not implemented)',\n\t\t-required='userdb', -type='database',\n\t\t-optional='encrypt',\n\t\t-optional='useridfield', -type='string',\n\t\t-optional='userfield', -type='string',\n\t\t-optional='passwordfield', -type='string',\n\t\t-optional='saltfield', -type='string',\n\t\t-optional='logdb', -type='database',\n\t\t-optional='loguserfield', -type='string',\n\t\t-optional='logeventfield', -type='string',\n\t\t-optional='logdatafield', -type='string',\n\t\t-optional='singleuser';\n\t\t\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal_defined('userfield') ? (self -> 'userfield') = #userfield;\n\t\tlocal_defined('useridfield') ? (self -> 'useridfield') = #useridfield;\n\t\tlocal_defined('passwordfield') ? (self -> 'passwordfield') = #passwordfield;\n\t\tlocal_defined('saltfield') ? (self -> 'saltfield') = #saltfield;\n\t\tlocal_defined('loguserfield') ? (self -> 'loguserfield') = #loguserfield;\n\t\tlocal_defined('logeventfield') ? (self -> 'logeventfield') = #logeventfield;\n\t\tlocal_defined('logdatafield') ? (self -> 'logdatafield') = #logdatafield;\n\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('userdb') ? (self -> 'userdb') = @#userdb;\n\t\tlocal_defined('logdb') ? (self -> 'logdb') = @#logdb;\n\n\t\tif: (local_defined: 'encrypt') && #encrypt != false;\n\t\t\t(self -> 'encrypt') = true;\n\t\t\tif: #encrypt -> size && (Cipher_List: -digest) >> #encrypt; // a valid digest cipher was specified\n\t\t\t\t(self -> 'encrypt_cipher') = #encrypt;\n\t\t\t/if;\n\t\telse;\n\t\t\t(self -> 'encrypt') = false;\n\t\t/if;\n\t\t(self -> 'singleuser') = (local_defined: 'singleuser') && #singleuser != false;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'ondeserialize', -description='Recreates transient variables after coming back from a session';\n\t\t// MARK: Why is client_fingerprint_expression considered a transient variable?\n\t\tself -> properties -> first -> insert('client_fingerprint_expression'={return(encrypt_md5(string(client_ip) + client_type))});\n\t/define_tag;\n\n/*\n\tdefine_tag: 'onassign', -description='Internal, needed to restore references when ctype is defined as prototype',\n\t\t-required='value';\n\t\t// recreate references here\n\t\titerate: (array: \n\t\t\t'userdb',\n\t\t\t'logdb'), (local: 'param');\n\t\t\t(self -> #param) = @(#value -> #param);\n\t\t/iterate;\n\t/define_tag;\n// */\t\n\t\n\tdefine_tag: '_unknowntag', -description='Shortcut to getdata';\n\t\tif: (self -> 'data') >> tag_name;\n\t\t\treturn: (self -> 'data') -> (find: tag_name);\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t\t(self -> '_debug_trace') -> insert(self -> type + '->' + tag_name + ' not known.');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'auth', -description='Checks if user is authenticated, returns true/false';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'validlogin'=false, 'client_fingerprint_now'=string;\n\t\t// check validlogin\n\t\t#validlogin = (self -> 'validlogin');\n\t\tif: #validlogin;\n\t\t\t// check client_fingerprint to prevent sidejacking\n\t\t\t#client_fingerprint_now = (self -> 'client_fingerprint_expression') -> invoke;\n\t\t\tif: #client_fingerprint_now != (self -> 'client_fingerprint');\n\t\t\t\t#validlogin = false;\n\t\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': Client fingerprint has changed - this looks like session sidejacking. Logging out.');\n\t\t\t\t(self -> 'error_code') = 7503;\n\t\t\t\tself -> logout;\n\t\t\t\t// TODO: log this\n\t\t\t/if;\n\t\t\t// TODO: if singleuser, check uniqueid\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #validlogin;\n\t/define_tag;\n\n\n\tdefine_tag: 'login', -description='Log in user. On successful login, all fields on the user record will be available by -> getdata.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-username (required) Optional if -force is specified\\n\\\n\t\t\t-password (required) Optional if -force is specified\\n\\\n\t\t\t-searchparams (optional) Extra search params array to use in combination with username and password\\n\\\n\t\t\t-force (optional) Supply a user id for a manually authenticated user if custom authentication logics is needed',\n\t\t-optional='username',\n\t\t-optional='password',\n\t\t-optional='searchparams', -type='array', -copy,\n\t\t-optional='force';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tif(!local_defined('force') && (!local_defined('username') || !local_defined('password')));\n\t\t\tfail(-9956, self -> type + '->' + tag_name + ' requires -username and -password, or -force');\n\t\t/if;\n\t\t\n\t\tlocal: 'db'=@(self -> 'userdb'),\n\t\t\t'validlogin'=false;\n\t\t\n\n\t\tif(local_defined('force') && string(#force) -> size && #force != false);\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': ' + 'Manually authenticating user id ' + #force);\n\t\t\t#validlogin = true;\n\t\t\t(self -> 'id_user') = #force;\n\n\t\telse;\n\t\t\t!local_defined('searchparams') ? local('searchparams'=array);\n\t\t\tif((local('username') -> size && local('password') -> size));\n\t\t\t\tif((self -> 'loginattempt_count') >= 5);\n\t\t\t\t\t// login delay since last attempt was made \n\t\t\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': Too many login attempts, wait until ' + (2 * (self -> 'loginattempt_count')) + ' seconds has passed since last attempt.');\n\t\t\t\t\twhile(((date - (self -> 'loginattempt_date')) -> second) <  (2 * (self -> 'loginattempt_count')) // at least 5 seconds, longer the more attempts\n\t\t\t\t\t\t&& loop_count < 100); // rescue sling\n\t\t\t\t\t\tsleep(200);\n\t\t\t\t\t/while;\n\t\t\t\t/if;\n\t\t\t\t// authenticate user against database (username must be unique)\n\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Authenticating user');\n\t\t\t\tif(#db -> 'isfilemaker');\n\t\t\t\t\t#searchparams -> merge(array(-op='eq', (self -> 'userfield') = '=\"' + #username + '\"'));\n\t\t\t\telse;\n\t\t\t\t\t#searchparams -> merge(array(-op='eq', (self -> 'userfield') = #username));\n\t\t\t\t/if;\n\t\t\t\t#db -> select(#searchparams);\n\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Searching user db, ' (#db -> found_count) + ' found ' + (#db -> error_msg) + ' ' + (#db -> action_statement));\n\t\t\t\tif: #db -> found_count == 1\n\t\t\t\t\t&& #db -> (field: (self -> 'userfield')) == #username; // double check the username\n\t\t\t\t\t// one match, continue by checking the password with case sensitive comparsion\n\t\t\t\t\tif: (self -> 'encrypt') && (self -> 'saltfield') -> size;\n\t\t\t\t\t\t// use encryption with salt\n\t\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Checking password with salted encryption');\n\t\t\t\t\t\tif: bytes: (#db -> (field: (self -> 'passwordfield'))) \n\t\t\t\t\t\t\t== bytes: (self -> (encrypt: #password, -salt=#db -> (field: (self -> 'saltfield') ), -cipher=(self -> 'encrypt_cipher') ));\n\t\t\t\t\t\t\t#validlogin=true;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: (self -> 'encrypt');\n\t\t\t\t\t\t// use encryption with no salt\n\t\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Checking password with encryption, no salt');\n\t\t\t\t\t\tif: bytes: (#db -> (field: (self -> 'passwordfield'))) \n\t\t\t\t\t\t\t== bytes: (self -> (encrypt: #password, -cipher=(self -> 'encrypt_cipher')));\n\t\t\t\t\t\t\t#validlogin=true;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Checking plain text password');\n\t\t\t\t\t\tif: bytes: (#db -> (field: (self -> 'passwordfield'))) \n\t\t\t\t\t\t\t== bytes: #password;\n\t\t\t\t\t\t\t#validlogin=true;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif(#validlogin);\n\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'id_user: ' + #db -> (field: (self -> 'useridfield')));\n\t\t\t\t\t// store user id\n\t\t\t\t\t(self -> 'id_user') = #db -> (field: (self -> 'useridfield'));\n\t\t\t\t\t// store all user record fields in data map\n\t\t\t\t\t(self -> 'data') = #db -> recorddata;\n\t\t\t\t/if;\n\t\t\t/if; // #username and #password\n\t\t/if; // #force\n\n\t\tif: #validlogin; \n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Valid login');\n\t\t\t(self -> 'loginattempt_count') = 0;\n\t\t\t(self -> 'error_code') = 0; // No error\n\t\t\t// set validlogin to true\n\t\t\t(self -> 'validlogin')=true;\n\t\t\t// log the action TODO\n\t\t\t// store client_fingerprint\n\t\t\t(self -> 'client_fingerprint') = (self -> 'client_fingerprint_expression') -> invoke;\n\t\t\t// if singleuser, store uniqueid in server side storage\n\t\telse(!(local('username') -> size && local('password') -> size));\n\t\t\t(self -> 'error_code') = 7502; // Username or password missing\n\t\t\tself -> logout;\n\t\telse;\n\t\t\t// TODO:\n\t\t\t// - block username for a while after too many attempts\n\t\t\t(self -> 'loginattempt_count') += 1;\n\t\t\t(self -> 'loginattempt_date') = date; // keep track of when last login attempt happened\n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Invalid login (' +  (self -> 'loginattempt_count') + ' attempts)');\n\t\t\t(self -> 'error_code') = 7501; // Authentication failed\n\t\t\tself -> logout;\n\t\t\t// exit\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'logout'; \n\t\tlocal: 'timer'=knop_timer; \n\t\t// set validlogin to false\n\t\t(self -> 'validlogin')=false;\n\t\t(self -> 'id_user') = null;\n\t\t(self -> 'data') = map;\n\t\t(self -> 'permissions') = map;\n\t\t\n\t\t// clear all record locks\n\t\tself -> clearlocks;\n\t\t// log the action\n\n\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Logged out');\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'getdata', -description='Get field data from the data map.',\n\t\t-required='field';\n\t\tif: (self -> 'data') >> #field;\n\t\t\treturn: (self -> 'data') -> (find: #field);\n\t\telse;\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': ' + #field + ' not known');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'removedata', -description='Remove field from the data map.',\n\t\t-required='field';\n\t\tif: (self -> 'data') >> #field;\n\t\t\t(self -> 'data') -> (remove: #field);\n\t\telse;\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': ' + #field + ' not known');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'id_user', -description='Return the user id';\n\t\tif: self -> auth;\n\t\t\treturn: (self -> 'id_user');\n\t\telse;\n\t\t\treturn: false;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'setdata', -description='Set field data in the data map. Either -> (setdata: -field=\\'fieldname\\', -value=\\'value\\') or -> (setdata: \\'fieldname\\'=\\'value\\')',\n\t\t-required='field', -copy,\t// can also be a pair with field=value\n\t\t-optional='value', -copy;\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: #field -> isa('pair');\n\t\t\tlocal: 'value'=#field -> value;\n\t\t\t#field = #field -> name;\n\t\t/if;\n\t\tfail_if: !(local_defined: 'value'), -1, (self -> type) '->setdata requires a value parameter';\n\t\t(self -> 'data') -> insert(#field = #value);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'getpermission', -description='Returns true if user has permission to perform the specified action, false otherwise',\n\t\t-required='permission';\n\t\tif((self -> auth) && (self -> 'permissions') >> #permission);\n\t\t\treturn((self -> 'permissions') -> find(#permission));\n\t\telse;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'setpermission', -description='Sets the user\\'s permission to perform the specified action (true or false, or just the name of the permission)',\n\t\t-required='permission',\n\t\t-optional='value';\n\t\tif(local_defined('value') && #value != false); // any non-false value is regarded as true\n\t\t\t(self -> 'permissions') -> insert(#permission=true);\n\t\telse(local_defined('value') && #value == false); // explicit false\n\t\t\t(self -> 'permissions') -> insert(#permission=false);\n\t\telse; // no value specified is regarded as true\n\t\t\t(self -> 'permissions') -> insert(#permission=true);\n\t\t/if;\n\t/define_tag;\n\n\n\tdefine_tag: 'addlock', -description='Called by database object, adds the name of a database object that has been locked by this user.',\n\t\t-required='dbname';\n\t\tif: (self -> 'dblocks') !>> #dbname && (var: #dbname) -> (isa: 'database');\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': adding database name  ' + #dbname);\n\t\t\t(self -> 'dblocks') -> (insert: #dbname);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'clearlocks', -description='Clears all database locks that has been set by this user';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (self -> auth);\n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + (self -> 'dblocks') -> (join: ', '));\n\t\t\titerate: (self -> 'dblocks'), local: 'dbname';\n\t\t\t\tif: (var: #dbname) -> (isa: 'database');\n\t\t\t\t\t(var: #dbname) -> (clearlocks: -user=(self -> 'id_user'));\n\t\t\t\t\t#dbname = null;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t// remove all locks that has been cleared\n\t\t\t(self -> 'dblocks') -> (removeall: null);\n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': done, remaining locks: ' + (self -> 'dblocks') -> (join: ', '));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'encrypt', -description='Internal use. Encrypts the input using digest encryption, optionally with salt. ',\n\t\t-required='data', -copy,\n\t\t-optional='salt',\n\t\t-optional='cipher';\n\t\tlocal: 'output'=string;\n\t\t!(local_defined: 'cipher') ? local: 'cipher'=self -> 'encrypt_cipher';\n\t\tif: (local_defined: 'salt');\n\t\t\t#data = #salt + #data;\n\t\t/if;\n\t\tif: (Cipher_List: -digest) !>> #cipher;\n\t\t\t// fall back to default digest cipher\n\t\t\t#cipher = 'MD5';\n\t\t/if;\n\t\t#output = (cipher_digest: #data, -digest=#cipher, -hex);\n\t\treturn: #output;\n\t/define_tag;\n\t\n\tdefine_tag: 'keys', -description='Returns all keys for the stored user data';\n\t\treturn: (self -> 'data') -> keys;\n\t/define_tag;\n\n/define_type;\n\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_user\n//------------------------------------------------------------------\n\n//##################################################################\n\n][define_tag('changenotes', -description='This tag is created on the fly by buildnamespace.lasso',\n\t\t-namespace='knop_',\n\t\t-optional='type', -optional='date', -copy);\n\t\tlocal('output'=string, 'changenotes'=map('knop_nav'='2010-11-17\tJC\tFixed bug so that session links no longer gets added to urls by the nav -> url tag.\n2010-11-17\tJC\tFixed a bug that would not convert local params to an array under certain situations\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\t->linkparams: Multiple paramaters with the same name (typically checkboxes) are now passed properly\n2009-05-06\tJS\t->directorytree considers _include folders as part of the Knop directory structure. nav->include(\\'_include/myfile.inc\\') will first look for _include/myfile.inc and if not found it will look for _knop/_include/myfile.inc \n2009-05-05\tJS\t->include looks for a specified file also inside a _knop folder, if the file does not exist at the specified location\n2009-02-09\tJS\t->filename: Casting path and actionpath to string\n2008-12-19\tJS\t->filename (and consequently ->include and ->library) can now use a specific -path instead of the current location\\'s path\n2008-12-09\tJS\t->linkparams: fixed undefined local in trace call (only showed when trace was enabled for the nav object)\n2008-11-25\tJS\t->getlocation will now avoid disabled and hidden pages when looking for the first page if no default page is specified\n2008-11-03\tJS\t->getlocation will not break if no navigation items have been defined\n2008-10-30\tJS\t_mod folders will now work with knop paths with just a single level, so an include file path can end up as _mod_customer/lib_customer.inc or just _mod_customer/lib.inc (the latter variant does not apply to extension-based filenaming, so _mod_customer/.lib will never be a working file path)\n2008-07-10\tJS\tAdded -> label to return the name of the current page\n2008-05-20\tJS\t->renderhtml: #current# is not automatically added to the template if the more elaborate template format is used. This makes it easier to hide the currentmarker without changing the nav config (partial revert of fix 2008-01-04). \n2008-05-08\tJS\t->insert: A duplicate key does no longer cause a fatal error but instead fails silently and logs to the debug log\n2008-05-07\tJS\t->url: will now call ->linkparams so all links that are constructed from ->url will properly send along the parameters specified in the nav item. This also affects pagination and sort links in grid. \n2008-05-07\tJS\tAdded ->linkparams, Returns an array for all parameters that should be sent along with nav links (this was previously embedded in renderhtml)\n2008-02-25\tJS\t->url: new parameter -getargs to add the getargs to the path link if the path equals the current path\n2008-02-06\tJC\t->insert: the -hide flag can now be a boolean (also the -disabled flag)\n2008-02-03\tJS\t->include: can now include any specified filename\n2008-02-01\tJS\t->oncreate: added optional -fileroot to be able to use a root for files that is different from the logical site root used for navigation \n2008-01-23\tJS\t->url: Added -autoparams that is required to enable the automatic passing of action_params that begin with \"-\" (this reverts the default behavior to match the the old)\n2008-01-22\tJS\t->url: GET params that begin with \"-\" are sent as parameters on links. -path, -sort, -desc, -q are explicitly excluded from nav links in renderhtml. \n2008-01-22\tJS\tWhen using param based navigation, navigation links now use much cleaner /?path/to/page/ style links instead of /?-path=path/to/page/\n2008-01-22\tJS\t->getlocation: when navmethod is param, the path can now be sent as unnamed parameter insetad of -path parameter (such as /?path/to/page/). \n2008-01-04\tJS\t->renderbreadcrumb: added flag -plain to output breadcrumb without html\n2008-01-04\tJS\t->renderbreadcrumb: added flag -skipcurrent to not include the current location in the output\n2008-01-04\tJS\t->insert: -template can now be specified also for individual nav items. Use the form #link##label##current##/link##children#. \n2008-01-04\tJS\t->renderhtml: changed #title# to #label# in template for clarity, for example #link##label##current##/link##children# (#title# will remain supported)\n2008-01-04\tJS\tAdded #current# as placeholder for template, to specify where the current marker should occurr. If not specified in the template, the current marker appears immediately after the label.\n2007-12-12\tJS\t->include now logs processing time for the include to debug trace\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-04\tJS\tnav item css class is now applied also to disabled nav items (rendered as <span>)\n2007-11-08\tJS\tChanged trace so it tracks some things even when it\\'s not enabled (like include etc)\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-28\tJS\t->directorytree: should now work also when knop folders are symlinks\n2007-09-06\tJS\ttop level nav elements that are -disabled now behave properly when accessed\n2007-09-05\tJS\t-currentmarker can now be set separately on sublevels, not only on topmost level\n2007-08-29\tJS\tAdded _knop as optional base folder to put all knop files in\n2007-08-29\tJS\t->include: Removed file_exists check since the filename has already been verified in ->filename.\n2007-08-29\tJS\tAdded ->directorytree which returns a map with all knop filenames, to use when searching for includes\n2007-08-28\tJS\t->oncreate: -filenaming to specify how include files are named prefix/suffix/extension\n2007-08-28\tJS\t->filename: Implemented support for flexible folder structures\n2007-08-28\tJS\tInstance variable #actionconfigfile_didrun was not properly declared\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-14\tJS\t->insert: -url=\\'/\\' can now be used to specify the \"home\" location. \n2007-06-13\tJS\tadded ->children to get a reference to the children nav object for a specified path, so new children can be inserted. Must call ->reindex afterwards. \n2007-06-13\tJS\tadded ->reindex to rebuild the index maps from scratch. Must be done after adding children items. \n2007-06-13\tJS\tadded ->addchildren to replace a current children nav object for a specified path. Will handle the reindexing transparently. \n2007-06-13\tJS\tadded ->keymap, ->pathmap and ->urlmap to access the index maps so they call reindex if they have been invalidated (for example by ->addchildren)\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-06-08\tJS\t->insert: params with empty values are now ignored\n2007-05-04\tJS\t->insert: added check that default item exists in children before storing the default\n2007-04-19\tJS added ->data to retrieve data stored for the current path (or specified path). Optional -type ensures the returned data has the correct type. \n2007-04-19\tJS ->insert: added -data to store arbitrary data object for each path. The object is stored as reference so a variable can be changed after it has been added to the nav object\n2007-04-19\tJS\tadded ->patharray to return the current path as array\n2007-04-17\tJS\t->renderhtml: template now supports #link##title##/link##children# in addition to #item# to provide more flexibility\n2007-04-17\tJS\t->oncreate: added support for -template, -class, currentclass and -currentmarker\n2007-04-13\tJS\tImplemented -class per navitem (only worked globally with setformat before)\n2007-04-03\tJS\t->renderhtml: added -renderpath, -expand and -flat to be able to render parts of the nav menu for more flexible layout\n2007-04-03\tJS\t->renderbreadcrumb: added -home to show the default navigation item first in the breadcrumb \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tChanged navmethod path so it uses response_filepath instead of $url_path\n2007-02-25\tJS\tAdded ->actionpath\n2007-02-24\tJS\t->renderhtml: improved handling of classes in nav links\n2007-02-22\tJS\t->url: added -except\n2007-02-09\tJS\t->url: corrected the behavior for plain parameters passed to the tag\n2007-02-05\tJS\t->insert: Added -param to be able to specify params that should be propagated in nav for certain nav elements (like -keyvalue to be able to move between different subtabs for a selected record\n2007-02-05\tJS\t->renderhtml now use ->url to get the right links\n2007-02-01\tJS\tMade usage of trace optional to improve performance\n2007-02-01\tJS\tImprovements to debug_trace to log also recursive events\n2007-02-01\tJS\tAdded ->haschildren, which is now used by ->renderhtml to properly show or hide child level\n2007-01-31\tJS\t->renderhtml Added renderhtml_levels to keep track of how many levels deep navigation has been rendered, to be able to add proper spacing between navigation and content\n2007-01-31\tJS \t->url: -urlargs  Improved handling of urlargs and ?/& delimiters, should work better with navmethod path\n2007-01-30\tJS\tRemoved automatic link title attribute since it can be confusing to show children page titles there\n2007-01-30\tJS\tCorrected parameter path to -path (bug)\n2007-01-23\tJS\t->include: \\'config\\' checks if the same config has already run as actionconfig and won\\'t run again in that case\n2007-01-23\tJS\t->include checks if the file exists first, so no need for empty placeholder files\n2007-01-23\tJS\tAdded ->include and ->library\n2007-01-23\tJS\tAdded ->setlocation\n2007-01-17\tJS\tAdded insert: -hide to allow a location without showing it in navigation\n\nTODO\nAdd support for compound expressions for template. The expression could return a map that would override corresponding param values. \n->insert: Add -raw to be able to inject code into the link tag, similar to form->addfield(-raw). \nExclude file name for example index.lasso from getargs\nOptimize nav->url! Very slow with complex nav object. \nNeeds to exclude also -keyfield and -lockfield. Maybe better to add an option to ->url to not auto-add any \"-\" params at all. \n-params are not sent along in breadcrumb links\nNeed simple way to exclude certain \"-\" params from ->url, also in config per nav item\nAdd support for adding nav structure from a database\nMove templates to a member tag to be make it easier to subclass\nMake it possible to use external URL for -url (make sure there is no / before http)\n\n','knop_base'='2009-09-14\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-04-07\tJS\t->error_msg: custom error numbers can now be added, even if the language already exists.\n2008-01-10\tJS\t->error_msg: improved reporting of custom error messages such as from bad database queries\n2007-12-13\tJS\tAdded -> error_lang to provide a reference to the knop_lang object for error messages, to be able to add localized error messages to any Knop type (except knop_lang and knop_base)\n2007-12-12\tJS\tAdded -html and -xhtml to ->help to get a nicely formatted output. \n2007-12-11\tJS\tCentralized ->error_code and ->error_msg to knop_base. Moved all error codes to error_msg\n2007-12-06\tJS\tChanged ->help to improve the self-documentation. It will now always return an up to date list of member tags and parameter. \n2007-11-05\tJS\tAdded var name to trace output\n2007-06-17\tJS\tAdded ->tagtime (was in nav earlier)\n2007-06-13\tJS\tAdded -> varname to be able to retreive the name of the page variable that a type instance is stored in.\n2007-06-13\tJS\tAdded -> xhtml to automatically sense if an xhtml doctype exists in the current page buffer. The result is cached in a page variable for performance. \n\t\t\t\tThis is for internal use for member tags that output html. \n2007-06-13\tJS\tIntroduced page variable $_knop_data for general page level storage and caching, common between different knop objects. \n2007-06-13\tJS\tCreated the data type\n\nTODO: ->help: add output option to format for Google Code Wiki\n->xhtml is not working properly when site is run by atbegin handler and explicitly writing to content_body \n\n\n','knop_grid'='2011-01-01\tSP\tCorrection of invalid HTML in <thead> and <tr>\n2010-12-23\tSP\tCorrected pagination bug for -numbered.\n2010-11-17\tJC\tAdded -startwithfooter flag to grid->renderhtml.  This moves the footer before the column titles in the table header.\n2010-11-17\tJC\tChanged rawheader inclusion to work even if there\\'s no quicksearch for a grid\n2010-05-14\tJC\tAdded span separation on grid footer for better styling\n2010-03-06\tSP\tChanged default behavior of ->sortparams and ->quicksearch with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->sortparams and ->quicksearch with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2010-01-27\tJC\tAdjusted the id support\n2010-01-25\tJC\tAdded support for optional id, used by table, quicksearch and quicksearch_reset\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-08-26\tJS\tCorrected prev/next links when no nav is defined for the grid object\n2009-06-29\tJS\t->renderlisting: documentation correction (renderlisting never calls renderfooter). \n2009-01-11\tJS\t->renderlisting: Made sure that template isn\\'t applied on NULL field values since that would cause an error with ->replace \n2008-12-29\tJC\tSupport for optional classes in table header\n2008-11-27\tJC\t-> implemented support for td specific classes. The class is inserted in both the TH and TD tag for the specified field\n2008-09-24\tJS\t->sortparams: fieldnames specified by the -sort parameter are now validated so they exist in the database\n2008-09-24\tJS\t->sortparams, ->quicksearch: Added protection against backtick sql injection in MySQL object names\n2008-09-10\tJS\t-numbered can now be specified at oncreate in addition to  ->renderhtml and ->renderfooter. \n2008-09-08\tJS\t->sortfield changed so defaultsort is honored even if -nosort is specified (-nosort is only used to prevent the user from changing sort order on the fly)\n2008-09-08\tJS\t->renderlisting and ->renderfooter optimized by caching the result of nav->url. \n2008-05-15\tJS\t->renderfooter: minor adjustment to numbered pagination links\n2008-05-14\tJS\t->renderfooter (and ->renderhtml): added -numbered as option to get google style numbered pagination links. Render the grid with -numbered (defaults to show 6 page number links plus the far ends) or -numbered=10 or another number. \n2008-05-13\tJS\tAdded ->renderlisting which is now part of ->renderhtml for more flexibility\n2008-02-25\tJS\t->renderheader and ->renderfooter calls nav -> url with -getargs \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: addded -autoparams to nav -> url used in links since url was changed to default to no autoparams. \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: improved support for param based navigation method  in links, cleaned up linking to use nav -> url instead of self -> urlparams when nav is available\n2008-01-22\tJC\t->quicksearch: Changed wordseparators so that \\\\r and \\\\n aren\\'t placed as \\\\r\\\\n, otherwise they are treated as a single character by ->split. \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-03\tJS\tAdded optional -language parameter to set the initial language for the grid object\n2007-12-03\tJS\tAdded -> lang to provide a reference to the knop_lang object that is used for localized strings\n2007-12-03\tJS\tAdded localized strings for English and Swedish\n2007-12-03\tJS\tAdded knop_lang to handle localized strings\n2007-11-11\tJC\tAdded optional -rawheader for extra header content to be inserted before the Quicksearch form\n2007-10-23\tJS\t->renderheader: added class=\"grid\" to the opening table tag to be able to isolate the css specifications\n2007-10-03\tJS\t->renderfooter: added unique classes for each type of prev/next link to be able to replace with images using css\n2007-10-03\tJS\t->renderfooter: Changed prev/next link texts to simple |< << >> >| instead of unicode glyphs\n2007-09-20\tJS\tPostparams are only sent along for nav params (not \"-\" params)\n2007-09-07\tJS\tAlso send postparams along in prev/next links (not only getparams)\n2007-09-06\tJS\tIf nav has params defined, those params will be sent along with prev/next links\n2007-09-06\tJS\tAdded encode_url for link params\n2007-09-06\tJS\tChanged -action to -formaction in the quicksearch form\n2007-08-08\tJS\t->urlargs: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\t->quicksearch: added \\\\r and \\\\n as word separators. \n2007-05-03\tJS\t->addfield: Added check for empty dbfield name before adding to dbfieldmap\n2007-04-19\tJS\t->quicksearch: added  -value (flag) that makes quicksearch output just the value of the quicksearch field instead of a query\n2007-04-13\tJS\t->oncreate: added -nosort as global flag (overrides column specific sort options)\n2007-04-13\tJS\t->renderfooter: Added tbody to footer to make it pass validation, but it\\'s still not semantically correct. \n2007-04-13\tJS\tChanged field type for quicksearch for non-WebKit based browsers\n2007-04-10\tJS\t->quicksearch: Added @ as word separator for \"word begins with\" search\n2007-04-10\tJS\t->quicksearch: Added -contains as option to perform a simple contains search instead of emulating \"word begins with\" search\n2007-04-10\tJS\t->renderheader: When grid has a defaultsort, there should be no \"unsort\" option in the sortable headings\n2007-04-10\tJS\t->insert: (-defaultsort=\\'desc\\') or (-defaultsort=\\'descending\\') makes the default sort order sort in descending order\n2007-04-04\tJS\t->addfield: -template can now also be a compound expression\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tAdded support for FileMaker with quicksearch (untested)\n2007-03-01\tJS\tChanged all texts to English\n2007-02-07\tJS\tRemoved classs=\"first\" and class=\"notopborder\" since CSS border-collapse: collapse; eliminates the need\n2007-02-05\tJS The -keyvalue parameter for url edit links can be given another name by specifying -keyparamname in addfield\n2007-01-31\tJS\t->addfield: #value# can be used in -url, as a way to provide mailto links etc in lists\n2007-01-30\tJS\tSortable columns now thave three states instead of two: sorted ascending, sorted descending and unsorted. \n2007-01-30\tJS\tImprovements to quicksearch, to emulate \"word begins with\"  searches\n2007-01-26\tJS\tAdded support for quicksearch field in grid header. Specify -quicksearch at ->oncreate, and tell what fields to search by specifying -quicksearch for those fields at ->addfield. \n\t\t\t\tFields can be search only (no display) by leaving out name and label. All specified fields are searched word for word of thew search string. \n\t\t\t\tUse ->quicksearch to get the search parameters (optionally -sql)\n2007-01-26\tJS\tAdded ->urlargs to get a querystring with all \"-\" GET params, except those in optional -except string or array parameter. \n2007-01-22\tJS\tAdjustments to highlighting and \"(redigera)\"-link for records with empty values in the linked field\n2007-01-19\tJS\tAdded href titles to sort links and prevnext links\n2007-01-19\tJS\tCorrected sortparams when no sortfield is specified\n2007-01-19\tJS\tAddded go to first page, go to last page in footer\n2007-01-19\tJS\tAdded member tag page_skiprecords to help correcting out of bounds page numbers\n2007-01-19\tJS\tAdded member tag lastpage\n2007-01-18\tJS\tSupport for highlighting of affected record after edit or update (class name \"highlight\")\n2007-01-17\tJS\tAdded addfield: -template\n\nTODO\nMake it possible for knop_grid to work independently of a knop_database object so other types of listings can bre created. \nLanguage of quicksearch buttons can\\'t be changed after the grid has been created\ntbody is used in renderfooter, which is not semantically correct. can\\'t use tfoot though since the footer is rendered twice. \nMove templates to a member tag to be make it easier to subclass\nChange ->addfield to ->insert and make ->addfield deprecated\n\n','knop_database'='2012-06-10\tSP\tFix for decimal precision bug in 8.6.0.1 in renderfooter.\n2012-01-15\tSP\tAdd support for inline host method.  Thanks to Ric Lewis.\n2010-11-23\tJS\t->settable: removed reference for -table\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->nextrecord: Added deprecation warning\n2009-05-15\tJS\t->field: corrected the verification of the -index parameter\n2009-01-09\tJS\tAdded a check before calling resultset_count so it will not break in Lasso versions before 8.5\n2009-01-09\tJS\t->_unknowntag: fixed incorrect debug_trace\n2008-12-03\tJS\t->addrecord: improved how keyvalue is returned when adding records\n2008-12-03\tJS\t->addrecord: inserting a generated keyvalue can now be suppressed by specifying -keyvalue=false\n2008-12-03\tJS\t->saverecord and ->deleterecord will now use the current keyvalue (if any), so -keyvalue will not have to be specified in that case. \n2008-11-25\tJS\t->field and ->recorddata will no longer touch current_record if it was zero\n2008-11-24\tJS\t->field: Added -index parameter to be able to access any occurrence of the same field name\n2008-11-24\tJS\tAdded -> records that returns a new data type knop_databaserows\n2008-11-24\tJS\t->resultset_count: added support for -inlinename. \n2008-11-24\tJS\tChanged ->nextrecord to ->next. ->nextrecord remains supported for backwards compatibility.\n2008-11-14\tJS\t->nextrecord resets the record pointer when reaching the last record\n2008-11-13\tJS\t->recorddata now honors the current record pointer (as incremented by -nextrecord)\n2008-11-13\tJS\t->recorddata: added -recordindex parameter so a specific record can be returned instead of the first found.\n2008-10-30\tJS\t->getrecord now REALLY works with integer keyvalues (double oops) - I thought I fixed it 2008-05-28 but misplaced a paren...\n2008-09-26\tJS\tAdded -> resultset_count corresponding to the same Lasso tag, so [resultset]...[/resultset] can now be used through the use of inlinename.\n2008-09-10\tJS\t-> getrecord, ->saverecord, ->deleterecord: Corrected handling of lock user to work better with knop_user\n2008-07-09\tJS\t->saverecord: -keeplock now updates the lock timestamp\n2008-05-28\tJS\t->getrecord now works with integer keyvalues (oops)\n2008-05-27\tJS\t->get returns a new datatype knop_databaserow \n2008-05-27\tJS\tAdded ->size and ->get so a database object can be iterated. When iterating each row is returned as an array of field values. \n2008-05-27\tJS\tAddedd ->nextrecord that increments the recordpointer each time it is called until the last record in the found set is reached. Returns true as long as there are more records. Useful in a while loop - see example below\n2008-05-27\tJS\tImplemented record pointer \\'current_record\\'. The record pointer is reset for each new query. \n2008-05-27\tJS\t->field: added -recordindex to get data from any record in the current found set\n2008-05-27\tJS\tAdded ->_unknowntag as shortcut to field\n2008-05-26\tJS\tRemoved onassign since it causes touble\n2008-05-26\tJS\tExtended field_names to return the field names for any specified table, return field names also for db objects that have never been used for a database query and optionally return field types\n2008-01-29\tJS\t->getrecord now supports -sql. Make sure that the SQL statement includes the relevant keyfield (and lockfield if locking is used). \n2008-01-10\tJS\t->capturesearchvars: error_code and error_msg was mysteriously not set after database operations that caused errors. \n2008-01-08\tJS\t->saverecord: added flag -keeplock to be able to save a locked record without releasing the lock\n2007-12-15\tJS\tAdding support for knop_user in record locking is in progress. Done for ->oncreate and ->getrecord. \n2007-12-11\tJS\tMoved error_code and error_msg to knop_base\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-10\tJS\tAdded ->settable to be able to copy an existing database object and properly set a new table name for it. Faster than creating a new instance from scratch. \n2007-12-03\tJS\tCorrected shown_first once again, hoping it\\'s right this time\n2007-11-29\tJS\tAdded support for field_names and corresponding member tag ->field_names\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-26\tJS\t->capturesearchvars: corrected shown_first when no records found\n2007-10-26\tJS\t->oncreate: added default value \"keyfield\" if the -keyfield parameter is not specified\n2007-09-06\tJS\tCorrected self -> \\'tagtime\\' typo\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\tChanged recordid_value to keyfield_value and -recordid to -keyvalue\n2007-05-28\tJS\t->oncreate: Added clearing of current error at beginning of tag\n2007-04-19\tJS\tCorrected the handling of -maxrecords and -skiprecords for SQL selects that have LIMIT specified\n2007-04-19\tJS\tImproved handling of foundrows so it finds any whitespace around SQL keywords, instead of just plain spaces\n2007-04-18\tJS\t->select now populates recorddata with all the fields for the first found record. Previously it only populated recorddata when there was 1 found record. \n2007-04-12\tJS\t->oncreate: Added authentication inline around Database_TableNames../Database_TableNames\n2007-04-10\tJS\t->oncreate: Improved validation of table name (table_realname can sometimes be null even for valid table names)\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-01-30\tJS \tAdded real error codes and additional error data for some errors (like record locked)\n2007-01-30\tJS\tChanged -keyvalue parameters to copy value instead of pass as reference, to not cause problems when using keyvalue from the same db object as is being updated, for example $db->(saverecord: -keyvalue=$db->keyvalue)\n2007-01-26\tJS\tAdjusted affectedrecord_keyvalue so it\\'s only captured for -add and -update\n2007-01-23\tJS\tSupports -uselimit (or querys that use LIMIT) and still gets proper searchresult vars (using a separate COUNT(*) query) - may not always get the right result for example for queries with GROUP BY\n2007-01-23\tJS\t-keyfield can be specified for saverecord to override the default\n2007-01-23\tJS\tChanged name of ->updaterecord to ->saverecord\n2007-01-23\tJS \tFixed bug where keyfield was missing as returnfield when looking up locked record for deleterecord\n2007-01-23\tJS\tAdded ->field\n2007-01-19\tJS\tAdded maxrecords_value and skiprecords_value to searchresultvars\n2007-01-18\tJS\tAdded affectedrecord_keyvalue to make it possible to highlight affected record in record list (grid)\n\n\nTODO:\nAllow -keyfield to be specified for ->addrecord and ->deleterecord\nAdd some Active Record similar functionality for editing\nLook at making it so -table can be set dynamically instead of fixed at oncreate, to eliminate the need for one db object for each table. This can cause problems with record locks and how they interact with knop_user \ndatetime_create and datetime_mod, and also user_create and user_mod.\n\tUse default field names but allow to override at oncreate, and verify them at oncreate before trying to use them. \n\n\n','knop custom tags in util.inc'='\t2007-06-17\tJS\tCreated the type\n\t\n\t','knop_user'='2012-01-16\tSP\tAdded ->removedata to remove field from the data map.  Thanks to Ric Lewis.\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-23\tJS\t->encrypt now uses default encrypt_cipher from the custom type instead of a hard coded default\n2009-02-26\tJS\t->login: further correction on the search for login with FileMaker, to reduce the risk for false duplicates\n2009-02-26\tJS\t->login: Added optional -searchparams to be able to add more conditions to the login search, for example to exclude users that are not enabled. \n2008-12-02\tJS\t->encrypt: Changed to -hex cipher instead of encode_base64\n2008-11-05\tJS\t->getdata: corrected a check that prevented the tag from returning anything\n2008-11-05\tJC\t->login: A failed login attempt now results in a logout instead of keeping any old authentication\n2008-11-05\tJC\t->getpermission will always return falseif a user is not logged in\n2008-11-05\tJC\t->logout: The permissions map is now cleared when logging out\n2008-11-04\tJC\t->encrypt: changed incorrect encrypt_cipher to encrypt_digest\n2008-09-10\tJS\tAdded ondeserialize to make client_fingerprint_expression survive session\n2008-07-17\tJS\tImplemented ->setpermission and ->getpermission\n2008-07-17\tJS\tAdded client_fingerprint_expression as compound expression so it can be configurable by changing the instant variable\n2008-05-20\tJS\t->login: Added delay between more than 5 failed login attempts \n2008-05-08\tJS\t->login: improved the search for FileMaker datasources to make it work for email address as username\n2008-02-08\tJS\tAdded ->keys\n2008-02-03\tJS\t-> login: Corrected storage of id_user\n2007-11-27\tJS\tCoded an incomplete version\n2007-06-13\tJS\tCreated the data type\n\n// TODO: \nMake it possible for knop_user to work independently of a knop_database object by creating a custom user lookup - see http://listsearch.com/Lasso/Thread/index.lasso?20528\nuserdb reference is brooken, probably when stored in session. Can this be fixed?\nMake client_fingerprint configurable by specifying a compound expression at oncreate\nAdd support for role based permisions\n\n','knop_lang'='2010-12-29\tJS\t->getstring: make sure we only try to do replacement in strings or bytes\n2010-05-27\tJS\tgetstring now works also with empty -replace value\n2010-04-20\tJS\tgetstring debug output corrected for missing string. \n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->addstring: clarified deprecation warning\n2009-04-08\tJS\tAdded -debug flag to oncreate (when creating a lang object) to make undefined language keys appear as *key*.\n2009-03-24\tJS\t->getstring prevents replacements if there is no language string found, to prevent null->replace error\n2008-11-12\tJS\tAdded ->insert instead of ->addstring for better consistency with other Lasso data types. ->addstring will remain functional for backwards compatibility. \n2008-09-11\tJS\t->_unknowntag: added missing support for -language\n2008-01-22\tJS\t->getstring: corrected the fallback behavior when a current language has been set \n2008-01-07\tJS\tRemoved instance variable browserlanguage due to problems with transient storage. The browserlanguage is cached on page level so it\\'s no loss in reality. \n2007-12-12\tJS\tAdded page level storage of currentlanguage, so all knop_lang instances defaults to the same language once one of them have set a language explictly, but only if the other knop_lang instances don\\'t have a language set explicitly. \n2007-12-12\tJS\tAdded page level caching of browser language (stores the value in $_knop_data map)\n2007-12-06\tJS\tMoved -> help to knop_base\n2007-12-06\tJS\tAdded ->description to all member tags. \n2007-12-03\tJS\tFinished first complete version\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-13\tJS\tRenamed to knop_lang (formerly knop_strings)\n2007-04-04\tJS\tCreated the data type and started coding\n\nTODO:\nProvide methods to handle formatting of dates, numbers, currency etc for different languages/locales. \nWeekday names, month names etc. \nMember tag to return the current language\nMember tag to set default output encoding unless it follows encode_set. \n\nExamples\n\tvar: \\'lang_messages\\'=(knop_lang: -default=\\'en\\');\n\t$lang_messages -> (insert: -key=\\'welcome\\', -value=\\'Welcome to the home page\\', -language=\\'en\\');\n\t$lang_messages -> (insert: -key=\\'welcome\\', -value=\\'Välkommen till hemsidan\\', -language=\\'sv\\');\n\t$lang_messages -> (insert: -key=\\'loggedin\\', -value=\\'You are logged in as #1# #2#\\', -language=\\'en\\');\n\t$lang_messages -> (insert: -key=\\'loggedin\\', -value=\\'Du är inloggad som #1# #2#\\', -language=\\'sv\\');\n\n\t// proper call, defaults to the browser\\'s preferred language\n\t$lang_messages -> (getstring: \\'welcome\\');\n\t// shorthand call\n\t$lang_messages -> welcome;\n\n\t// change language\n\t$lang_messages -> (setlanguage: \\'sv\\');\n\t$lang_messages -> welcome;\n\n\t// proper call with replacements\n\t$lang_messages -> (getstring: -key=\\'loggedin\\': -replace=(array: (field: \\'firstname\\'), (field: \\'lastname\\')));\n\n\t// shorthand call with replacements\n\t$lang_messages -> (loggedin: -replace=(array: (field: \\'firstname\\'), (field: \\'lastname\\')));\n\n\n','knop_form'='2011-02-28\tJS\t->addfield: Added -template to specify field specific template \n2010-11-22\tSP\t->init: Correction of -lockvalue handling after L9 syntax adjustment\n2010-07-18\tSP\tAdded support for series for -options\n2010-06-10\tJS\t->renderform: avoid adding -upload parameters to post forms since it conflicts with file uploads (found by Steve Piercy)\n2010-04-21\tJS\t->renderhtml:  removed encode_html for label\n2010-03-06\tSP\tChanged default behavior of ->updatefields with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->updatefields with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2009-11-11\tJS\tAdded class and id to optiongroup div that surrounds for checkbox and radio\n2009-11-11\tJS\tCorrected id for checkbox and radio option labels\n2009-10-02\tJS\tAdded id for labels, auto generated from the field\\'s id with _label appended\n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-09-04\tJS\t->renderhtml: corrected typ for autoparams\n2009-07-23\tJS\t->renderform: removed encode_html that somehow has reappeared for label. \n2009-07-10\tSP\tadded -maxlength option for text fields\n2009-06-26\tJS\t->oncreate: added deprecation warning for -action\n2009-06-22\tJS\t->addfield: corrected -options check to look for set instead of series (besides array)\n2009-04-16\tJS\t->loadfileds can now load field values from -params also inside an inline\n2009-03-20\tJS\tAdded  <![CDATA[ ... ]]>  around injected scripts for better xhtml compliance\n2009-01-08\tJS\t->getvalue and _unknowntag: added -index parameter to be able to get value for a specific field instance when there are multiple fields with the same name \n2009-01-08\tJS\t->loadfields: implemented support for multiple fields with the same name when loading field values from form submission where the number of same name fields matches\n2009-01-07\tJS\t->setvalue: added -index parameter to be able to set value for a specific field instance when there are multiple fields with the same name \n2008-12-08\tJS\t->renderform: Removed the onclick handlers for checkbox and radio since Safari now supports clicking the label text as click for the checkbox/radio control. \n2008-12-05\tJS\t->renderform: the fieldset and legend field types will now use id and class on the fieldset tag if specified\n2008-12-03\tJS\t->renderform: fields of type fieldset now uses value as legend (just as field type legend already did) instead of always using an empty legend\n2008-09-24\tJS\t->updatefields: Added protection against backtick sql injection in MySQL object names\n2008-09-17\tJS\t->renderform and ->renderhtml: -from and -to allows negative numbers to count from end of form instead\n2008-09-13\tJS\tAdded ->getlabel to return the display name for a field. \n2008-09-13\tJS\t->addfield and ->validate: Implemented -validate to specify a compound expression to validate the field input. \n2008-09-13\tJS\t->addfield and ->loadfields: Implemented -filter to specify a compound expression to filter the field input. \n2008-09-11\tJS\t->updatefields: fixed exclusion of special field types html, legend and fieldset. \n2008-09-11\tJS\t->renderform: Fixed missing value for password fields\n2008-07-02\tJS\t->renderform: Cleaned up the automatic adding of javascript code so it\\'s not added if not needed. Also moved all scripts to the end of the page. More work with with the javascripts is needed.\n2008-06-03\tJS\t->renderform: corrected missing closing </fieldset>\n2008-05-15\tJS\t->renderform and ->renderhtml: adjusted the behavior for nested fieldsets\n2008-05-13\tJS\tImplemented -legend for ->renderhtml, to make it consistent with the new legend field type\n2008-05-13\tJS\tImplemented special field types html, fieldset and legend. Use -value to display data for these fields. A legend field also creates a fieldset (closes any previously open fieldsets). Use fieldset with -value=false to close a fieldset without opening a new one. \n2008-05-06\tJS\tAdded unknowntag as shortcut to getvalue\n2008-01-30\tJS\tRemoved duplicate endscript entries for if(dirty) {makedirty()};\n2007-12-13\tJS\tCorrected ->addfield: -dbfield so empty dbfields are properly ignored by ->updatefields. \n2007-12-11\tJS\tMoved error_msg to knop_base (special version of error_code stays here) \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-11-13\tJS\tAdded -buttontemplate to be able to specify separate template for buttons, defaults to no <br>, but if template has been specified that will be used instead (for backwards compatibility)\n2007-11-12\tJS\t->process delete now works also when not using record locking (not specifying -user)\n2007-11-01\tJS\t->renderform: added support for -hint for textarea fields.\n2007-09-27\tJS\t->renderhtml: multiple values (array) for radio, checkbox and select are now rendered properly with either \",\" or <br> depending on the presence of -linebreak, and with the display text instead of the actual option value\n2007-09-27\tJS\t->renderform: improved handling of multiple values for checkbox, radio and select\n2007-09-21\tJS\t->addfield: flag parameters now accept false as value\n2007-09-06\tJS\t->oncreate: changed name of -action to -formaction to make it more clear what it is. -action is still supported but deprecated.\n2007-09-06\tJS\t->renderform: Corrected the exception for -session... (duh)\n2007-08-08\tJS\t->renderform: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-12\tJC\tbugfixed -xhtml form rendering when called by quicksearch\n2007-06-11\tJC\tadded handling of xhtml output\n2007-04-19\tJS\t->loadfields: fixed -params that was broken when adding -database\n2007-04-19\tJS\t->renderform: removed invalid wrap=\"soft\" from textarea\n2007-04-12\tJS\t->process: made -user optional (only needed when using record locking)\n2007-04-12\tJS ->loadfields can now take a -database parameter, either as a flag (no value) where the database object connected to the form will be used, or by specifying a database object as value. \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\t->renderform fixed unsavedwarning on page load by moving checkdirty() to afterscript\n2007-03-01\tJS\t->formmode and ->init changed so it preserves the right mode after a failed add\n2007-02-27\tJS\t->renderform: added <div class=\"inputgroup\"> around checkboxes and radios for css formating\n2007-02-26\tJS\t->oncreate: added -actionpath to specify the framework action path for the form instead of manually adding the -action hidden field\n2007-02-24\tJS\tCorrected entersubmitblock behavior by adding onfocus handler on form and starting with submitBlock=false\n2007-02-23\tJS\tRemoved encode_html from form field labels\n2007-02-22\tJS\t->setformat: Added -legend\n2007-02-07\tJS\tAdded ->copyfield to copy a form field to a new name, with the same properties. \n2007-02-07\tJS\t->errors now returns empty array if validate has not been called, instead of performing validation\n2007-02-05\tJS\t->getbutton can now look for also button names that are not one of the built-in ones (for example button_apply)\n2007-02-05\tJS The -keyvalue parameter can be given another name by specifying -keyparamname in oncreate\n2007-02-02\tJS\tAdded ->lockvalue_decrypted\n2007-02-02\tJS\t->addfield: -value is now stored as reference\n2007-02-02\tJS\terror_code now returns an error for when the form contains validation errors\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-02-02\tJS \tAdded real error codes\n2007-01-31\tJS\t->rederform action_params now also exclude \"-\" params that appear in the form action\n2007-01-29\tJS\t->renderform: The first field with input error will get focus when loading page\n2007-01-29\tJS\tAdded -focus to ->addfield to give default field focus when loading page with form\n2007-01-29\tJS\tAdded -disabled to ->addfield, and handling of it in ->renderform\n2007-01-29\tJS\tAdded -noautoparams to ->oncreate to disable the automatic passing of action_params that begin with \"-\"\n2007-01-29\tJS\t->renderform now renders label also for submit, reset to format properly with css\n2007-01-26\tJS\tAdded support for Safari specific <input type=\"search\">\n2007-01-26\tJS\t->renderform action_params that begin with \"-\" now exclude params that exist in the form. Minor corrections to the behavior. \n2007-01-25\tJS\tAdded -nowarning to ->oncreate to disable unsaved warnings for the entire form\n2007-01-25\tJS\tAdded -required to ->oncreate (and a few more from ->setformat)\n2007-01-23\tJS\tAutogenerates id for the form itself\n2007-01-23\tJS\tAdded ->getbutton to return the button that was clicked when submitting a form (cancel, add, save, delete)\n2007-01-23\tJS\tAdded auto conversion of options left hand pair member to string, to make comparsions work reliably. Integer zeros don\\'t compare nicely to strings. \n2007-01-23\tJS\tAdded support for submit-on-enter prevention: specify -entersubmitblock at oncreate\n2007-01-19\tJS\tAddes renderform: -legend to be able to group form fields at render time\n2007-01-19\tJS\tadded support for -optgroup in -options for select. Also works for radio and checkbox. Specify empty -optgroup to close optgroup in select without starting a new, or to add extra linebreak between checkboxes/radio buttons. \n2007-01-19\tJS\tadded -template for oncreate\n2007-01-19\tJS\tadded optional fieldset and legend to form, legend can be specified as -legend at oncreate. if -legend is specified, the form will be wrapped in a fieldset. \n2007-01-19\tJS\tmethod now defaults to post\n2007-01-19\tJS\tCorrected line separator for FileMaker checkboxes and added the same handling also for radio\n2007-01-18\tJS\trenderform: any action_params that begin with \"-\" (except -keyvalue and -lockvalue) are added as form parameters\n2007-01-18\tJS\trenderform: checkboxes and multiselects now show checked and selected properly when loading values from database\n2007-01-18\tJS\tupdatefields: added support for multiple values for one fieldname, like checkboxes (multiple fields in the update pair array, -sql generates comma separated values)\n2007-01-17\tJS\treset button now makes form undirty\n2007-01-17\tJS\taddfield: -confirmmessage can now be specified for any submit or reset button\n2007-01-17\tJS\tadded addfield: -nowarning to avoid unsaved warning when the field is changed\n2007-01-17\tJS\tchanged default class name for unsaved marker from dirty to unsaved\n2007-01-17\tJS\tchanged name of -dirtymarker and -dirtymarkerclass to unsavedmarker and -unsavedmarkerclass for userfriendlyness\n2007-01-17\tJS\tadded setformat: -unsavedwarning to dynamically set the javascript form dirty warning message\n2007-01-17\tJS\trenderform: -field changed to renderform: -name for consistency\n2007-01-16\tJS\trenderform: -field with wrong field name does not output anything, instead of the entire form\n2007-01-16\tJS\tfixed onbeforeunload in javascript form dirty handler\n\nTODO:\n->addfield: Add -format to manipulate the field value before it is displayed by ->renderform and ->renderhtml, much like -filter but only for display and without affecting input. \n->addfield: Add -fieldgroup to be able to group related fields together, useful for ->updatefields to return just fields that belong to a specific db table, or ->renderform as another way to render a form selectively\n->renderform needs a better way to display errors inline together with the fields\nMake _unknowntag also work as shortcut to setvalue if a value is specified\nAdd a new special field type to the form object, let\\'s say \"data\". That field type will not interact with forms and will never be touched by loadfields, but it will populate ->updatefields.\nAdd -> searchfields, which will return a fulltext enabled pair array better suited for searchs than ->updatefields is. -fulltext needs to be specified per field. \nReview and clean up the javascripts inserted automatically by knop_form - partially done\nOption to let textarea grow automatically depending on the amount of text in it.  \nUse http://bassistance.de/jquery-plugins/jquery-plugin-validation/ instead of client side validation\nPossibly add support for the same validation expressions as the jquery validation plugin uses, so server side a nd client side validation can be specified at once. \nAdd -path as parameter for oncreate so the form action can be set with less confusion...  In that case -formaction will be a physical url, while -path would be a framework path. \nFix actionpath reference so it updates properly when altering the value (not possible?)\nShould loadfields load \"-\" params?\nUnsavedwarning made optional, does not seem to work properly now?\nMore flexible error hightlighting\nMove templates to a member tag to be make it easier to subclass (Douglas Burchard)\nAdd \"button\". <button></button>. Subtypes are submit, reset and button. How to specify the subtype? (Douglas Burchard)\nChange ->addfield to ->insert and make ->addfield deprecated\nThere is no src for input type image!\nAdd ->size and ->get so the form object can be iterated\nAdd -skipemtpy to to ->renderhtml\nOption for -> renderhtml to output without html encoding\n->renderhtml should never html encode fields of type html\n\n',));\n\t\tif(local_defined('type'));return(#changenotes -> find(#type));else;\n\t\t!local_defined('date') ? local('date'=date('1900-01-01')) | #date = date(#date);\n\t\titerate(#changenotes, local('changenote'));\n\t\t\t#output += #changenote -> name + '\\n';\n\t\t\titerate(#changenote ->value -> split('\\n'), local('changenote_row'));\n\t\t\t\tif(date(#changenote_row -> split(regexp('\\\\s')) -> first) >= #date);\n\t\t\t\t\t#output += #changenote_row + '\\n';\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#output += '\\n';\n\t\t/iterate;\n\t\treturn(@#output);/if;\n\t\t/define_tag]"
  },
  {
    "path": "src/test/resources/samples/langs/Lasso/knop.ldml",
    "content": "﻿[/* \n\n\tOn-Demand library for namespace knop\n\tNamespace file built date 2012-06-10 02:05:30 by http://knop8/buildnamespace.lasso\n\tMontania System AB\n\n*/]\n\n[\n//------------------------------------------------------------------\n//    Begin knop custom tags in util.inc\n//------------------------------------------------------------------\n\n]<?LassoScript\n\n/*\n\n2009-09-04\tJS\tAdded content_body tag for compatibility with pre 8.5\n2009-05-07\tJS\tAdded timestamp to knop_cachestore and -maxage parameter to knop_cachefetch\n2009-05-07\tJS\tCorrected construction of cache_name internally in the knop_cache tags so it will work correctly at the site root\n2008-11-04\tJS\tAdded dummy knop_debug ctype to be able to work transparently with or without L-Debug\n2008-09-24\tJS\tAdded knop_stripbackticks\n2008-01-28\tJS\tCache tags: -name is now used also when using session storage\n2007-12-12\tJS\tAdded knop_cachedelete\n2007-12-11\tJS\tCreated knop_cachestore and knop_cachefetch\n2007-12-03\tJS\tCorrected knop_foundrows condition for returning normal found_count\n\n*/\n\n// For compatibility with pre Lasso 8.5 \nif(!lasso_tagexists('content_body'));\n\tdefine_tag('content_body', -namespace='_global_');\n\t\treturn(@$__html_reply__);\n\t/define_tag;\n/if;\n\nif(!lasso_tagexists('knop_debug'));\n\tdefine_type('debug',\n\t\t-namespace='knop_');\n\t\tdefine_tag('_unknowntag');/define_tag;\n\t\tdefine_tag('onconvert');/define_tag;\n\t/define_type;\n/if;\n\ndefine_tag('stripbackticks', -description='Remove backticks (`) from a string to make it safe for MySQL object names',\n\t-namespace='knop_',\n\t-priority='replace',\n\t-required='input');\n\tlocal('output'=string(#input));\n\t#output = #output -> split('`') -> first;\n\treturn(@#output);\n/define_tag;\n\ndefine_tag: 'unique', -description='Returns a very unique but still rather short random string',\n\t-namespace='knop_',\n\t-priority='replace';\n\n\t// Johan Sölve 2006-09-20 \n\t\n\tlocal: 'output'=string,\n\t\t'seed'=integer,\n\t\t'charlist'='abcdefghijklmnopqrstuvwxyz0123456789';\n\tlocal: 'base'=(#charlist -> size);\n\t// start with the current date and time in a mixed up format as seed\n\t#seed = integer: (date -> (format: '%S%y%m%d%H%M'));\n\t// convert this integer to a string using base conversion\n\twhile: #seed>0;\n\t\t#output = #charlist -> (get: (#seed % #base)+1) + #output;\n\t\t#seed = #seed / #base;\n\t/while;\n\t// start over with a new chunk as seed\n\t#seed = string: 1000+(date->millisecond);\n\t#seed = #seed + string: (math_random: -lower=1000, -upper=9999);\n\t#seed = integer: #seed;\n\t// convert this integer to a string using base conversion\n\twhile: #seed>0;\n\t\t#output = #charlist -> (get: (#seed % #base)+1) + #output;\n\t\t#seed = #seed / #base;\n\t/while;\n\treturn: #output;\n/define_tag;\n\n\ndefine_tag: 'seed', \n\t-namespace='knop_',\n\t-priority='replace';\n\t\n\tlocal: 'seed'= (string: $__lassoservice_ip__) + response_localpath;\n\t#seed -> removetrailing(response_filepath);\n\treturn:\t #seed;\n/define_tag;\n\ndefine_tag: 'foundrows', // http://tagswap.net/found_rows\n\t-namespace='knop_',\n\t-priority='replace';\n\tlocal: 'sql'= action_statement;\n\tif: (string_findregexp: #sql, -find= '\\\\sLIMIT\\\\s', -ignorecase) -> size == 0;\n\t\t// || found_count < maxrecords_value; (this condition is inaccurate)\n\t\t// found_count must be accurate\n\t\treturn: found_count;\n\t/if;\n\tif: (string_findregexp: #sql, -find= '\\\\s(GROUP\\\\s+BY|HAVING)\\\\s', -ignorecase) -> size == 0;\n\t\t// Default method, usually the fastest. Can not be used with GROUP BY for example. \n\t\t// First normalize whitespace around FROM in the expression\n\t\t#sql = (string_replaceregexp: #sql, -find= '\\\\sFROM\\\\s', -replace=' FROM ', -ignorecase, -ReplaceOnlyOne);\n\t\t#sql = 'SELECT COUNT(*) AS found_rows ' + #sql -> (substring: (#sql -> (find: ' FROM ')) + 1) ;\n\t\t#sql = (string_replaceregexp: #sql, -find='\\\\sLIMIT\\\\s+[0-9,]+', -replace='');\n\t\tif: (string_findregexp: #sql, -find= '\\\\sORDER\\\\s+BY\\\\s', -ignorecase) -> size;\n\t\t\t// remove ORDER BY statement since it causes problems with field aliases\n\t\t\t// first normalize the expression so we can find it with simple string expression later\n\t\t\t#sql = (string_replaceregexp: #sql, -find= '\\\\sORDER\\\\s+BY\\\\s', -replace=' ORDER BY ', -ignorecase);\n\t\t\t#sql = #sql -> (substring: 1, (#sql -> (find: ' ORDER BY ')) -1);\n\t\t/if;\n\telse; // query contains GROUP BY so use SQL_CALC_FOUND_ROWS which can be much slower, see http://bugs.mysql.com/bug.php?id=18454\n\t\t#sql -> (removeleading: 'SELECT');\n\t\t#sql = 'SELECT SQL_CALC_FOUND_ROWS ' + #sql + ';SELECT FOUND_ROWS() AS found_rows';\n\t\t#sql = (string_replaceregexp: #sql, -find='\\\\sLIMIT\\\\s+[0-9,]+', -replace=' LIMIT 1', -ignorecase);\n\t/if;\n\tinline: -sql=#sql;\n\t\tif: (field: 'found_rows') > 0;\n\t\t\treturn: integer: (field: 'found_rows'); // exit here normally\n\t\t/if;\n\t/inline;\n\t// fallback\n\treturn: found_count;\n/define_tag;\t\n\ndefine_tag:'IDcrypt', -description='Encrypts or Decrypts integer values',\n\t-namespace='knop_',\n\t-required='value',\n\t-optional='seed',\n\t-priority='replace';\n/*\n\n[IDcrypt]\nEncrypts or Decrypts integer values\n\nAuthor: Pier Kuipers\nLast Modified: Jan. 29, 2007\nLicense: Public Domain\n\nDescription:\nThis tag was written to deal with \"scraping\" attacks where bots keep \nrequesting the same page with incremental id parameters, corresponding to \nmysql id columns. Rather than introducing a new column with a unique id, this \ntag will \"intelligently\" blowfish encrypt or decrypt existing id values.\n\n\nSample Usage:\n[local('myID' = (action_param('id')))]\n[IDcrypt(#myID)]\n\n[IDcrypt('35446')] -> j4b50f315238d68df\n\n[IDcrypt('j4b50f315238d68df')] -> 35446\n\n\n\nDownloaded from tagSwap.net on Feb. 07, 2007.\nLatest version available from <http://tagSwap.net/IDcrypt>.\n\n*/\n// if id values need to be retrieved from bookmarked urls, the tag's built-in seed value must be used,\n// or the seed value used must be guaranteed to be the same as when the value was encrypted!\t\t\n\n\tlocal('cryptvalue' = string);\n\t!local_defined('seed') ? local('seed' = knop_seed);\n\tLocal('RandChars' = 'AaBbCcDdEeFfGgHhiJjKkLmNnoPpQqRrSsTtUuVvWwXxYyZz');\n\tLocal('anyChar' = (#RandChars -> (Get:(Math_Random: -Min=1, -Max=(#RandChars->Size)))));\n// taken from Bil Corry's [lp_string_getNumeric]\n\tlocal('numericValue' = (string_findregexp((string: #value), -find='\\\\d')->(join:'')));\n\t\n\tif(\n\t\t(#numericValue == (integer(#value))) \n\t\t&& \n\t\t(((string(#value))->length) == ((string(#numericValue)) -> length))\n\t);\n// alpha character is inserted at beginning of encrypted string in case value needs to be\n// cast to a javascript variable, which cannot start with a number\t\t\n\t\t#cryptvalue = (#anyChar + (Encrypt_Blowfish(#value, -seed=#seed)));\n\telse(\n\t\t((((string(#value))->length) - 1) % 2 == 0)\n\t\t&&\n\t\t(((string(#value))->length) > 16)\n\t);\n\t\t#cryptvalue = (decrypt_blowfish((String_Remove: #value, -StartPosition=1, -EndPosition=1),-Seed=#seed));\n\telse;\n\t\t#cryptvalue = 0;\n\t/if;\n\t\n\tif(String_IsAlphaNumeric(#cryptvalue));\n\t\treturn(#cryptvalue);\n\telse;\n// successfully decrypted values resulting in lots of strange characters are probably\n// the result of someone guessing a value\t\t\n\t\treturn(0);\n\t/if;\n\n/define_tag;\n\n\n\ndefine_type: 'timer', -description='Utility type to provide a simple timer',\n\t-namespace='knop_';\n\t/*\n\t\n\tCHANGE NOTES\n\t2007-06-17\tJS\tCreated the type\n\t\n\t*/\n\n\tlocal: 't'=integer;\n\tdefine_tag: 'oncreate';\n\t\t(self -> 't') = _date_msec;\n\t/define_tag;\n\tdefine_tag: 'onconvert';\n\t\treturn: _date_msec - (self -> 't');\n\t/define_tag;\n\t\n/define_type;\n\ndefine_tag: 'cachestore', -description='Stores all instances of page variables of the specified type in a cache object. Caches are stored \\\n\t\tin a global variable named by host name and document root to isolate the storage of different hosts. \\n\\\n\t\tParameters:\\n\\\n\t\t-type (required string) Page variables of the specified type will be stored in cache. Data types can be specified with or without namespace.\\n\\\n\t\t-expires (optional integer) The number of seconds that the cached data should be valid. Defaults to 600 (10 minutes)\\n\\\n\t\t-session (optional string) The name of an existing session to use for cache storage instead of the global storage\\n\\\n\t\t-name (optional string) Extra name parameter to be able to isolate the cache storage from other sites on the same virtual hosts, or caches for different uses. ',\n\t-namespace='knop_',\n\t-required='type', -type='string',\n\t-optional='expires', -type='integer', // seconds\n\t-optional='session', -type='string',\n\t-optional='name', -type='string';\n\n\tlocal: 'data'=map;\n\t!(local_defined: 'expires') ? local: 'expires'=600; // default seconds\n\t// store all page vars of the specified type\n\titerate: vars -> keys, local: 'item';\n\t\tif: (var: #item) -> isa(#type);\n\t\t\t#data -> insert(#item = (var: #item));\n\t\t/if;\n\t/iterate;\n\tif: (local_defined: 'session');\n\t\t//fail_if: (session_id: -name=#session) -> size == 0, -1, 'Cachestore with -session requires that the specified session is started';\n\t\tlocal: 'cache_name' = '_knop_cache_' + (local: 'name');\n\t\tsession_addvar: -name=#session, #cache_name;\n\t\t!((var: #cache_name) -> isa('map')) ? var: #cache_name = map;\n\t\t(var: #cache_name) -> insert(#type = (map: \n\t\t\t'content'=#data, \n\t\t\t'timestamp'=date, \n\t\t\t'expires'=(date + (duration: -second=#expires))));\n\telse;\n\t\tlocal: 'cache_name'='knop_' + (local: 'name') + '_' + server_name + response_localpath;\n\t\t#cache_name -> removetrailing(response_filepath);\n\t\t// initiate thread RW lock\n\t\t!(global: 'rwlock_' + #cache_name) -> isa('rwlock') ? global: 'rwlock_' + #cache_name=Thread_RWLock;\n\t\t// create a reference to the lock\n\t\tlocal: 'lock'=@(global: 'rwlock_' + #cache_name);\n\t\t// lock for writing\n\t\t#lock -> writelock;\n\t\t// check and initiate the cache storage\n\t\t!((global: #cache_name) -> isa('map')) ? global: #cache_name = map;\n\t\t(global: #cache_name) -> insert(#type = (map: \n\t\t\t'content'=#data, \n\t\t\t'timestamp'=date, \n\t\t\t'expires'=(date + (duration: -second=#expires))));\n\t\t// unlock\n\t\t#lock -> writeunlock;\n\t/if;\n/define_tag;\n\ndefine_tag: 'cachefetch', -description='Recreates page variables from previously cached instances of the specified type, returns true if successful or false if there was no valid \\\n\t\texisting cache for the specified type. Caches are stored in a global variable named by host name and document root to isolate the storage of different hosts. \\n\\\n\t\tParameters:\\n\\\n\t\t-type (required string) Page variables of the specified type will be stored in cache. \\n\\\n\t\t-session (optional string) The name of an existing session to use for cache storage instead of the global storage\\n\\\n\t\t-name (optional string) Extra name parameter to be able to isolate the cache storage from other sites on the same virtual hosts. \\n\\\n\t\t-maxage (optional date) Cache data older than the date/time specified in -maxage will not be used.',\n\t-namespace='knop_',\n\t-required='type', -type='string',\n\t-optional='session', -type='string',\n\t-optional='name', -type='string',\n\t-optional='maxage', -type='date';\n\t\n\t\n\tlocal: 'data'=null;\n\tif: (local_defined: 'session');\n\t\t//fail_if: (session_id: -name=#session) -> size == 0, -1, 'Cachefetch with -session requires that the specified session is started';\n\t\tlocal: 'cache_name' = '_knop_cache_' + (local: 'name');\n\t\tif: (var: #cache_name) -> isa('map') \n\t\t\t&& (var: #cache_name) >> #type \n\t\t\t&& (var: #cache_name) -> find(#type) -> find('expires') > date;\n\t\t\tif(local_defined('maxage') \n\t\t\t\t&& var(#cache_name) -> find(#type) -> find('timestamp') < #maxage);\n\t\t\t\t// cached data too old\n\t\t\telse;\n\t\t\t\t#data = (var: #cache_name) -> find(#type) -> find('content');\n\t\t\t/if;\n\t\t/if;\n\telse;\n\t\tlocal: 'cache_name'='knop_' + (local: 'name') + '_' + server_name + response_localpath;\n\t\t#cache_name -> removetrailing(response_filepath);\n\t\t// initiate thread RW lock\n\t\t!(global: 'rwlock_' + #cache_name) -> isa('rwlock') ? global: 'rwlock_' + #cache_name=Thread_RWLock;\n\t\t// create a reference to the lock\n\t\tlocal: 'lock'=@(global: 'rwlock_' + #cache_name);\n\t\t// lock for reading\n\t\t#lock -> readlock;\n\t\tif: (global: #cache_name) -> isa('map') \n\t\t\t&& (global: #cache_name) >> #type \n\t\t\t&& (global: #cache_name) -> find(#type) -> find('expires') > date;\n\t\t\tif(local_defined('maxage') \n\t\t\t\t&& global(#cache_name) -> find(#type) -> find('timestamp') < #maxage);\n\t\t\t\t// cached data too old\n\t\t\telse;\n\t\t\t\t#data = (global: #cache_name) -> find(#type) -> find('content');\n\t\t\t/if;\n\t\t/if;\n\t\t// unlock\n\t\t#lock -> readunlock;\n\t/if;\n\tif: #data -> isa('map');\n\t\titerate: #data, local: 'item';\n\t\t\tvar: (#item -> name) = #item -> value;\n\t\t/iterate;\n\t\treturn: true;\n\telse;\n\t\treturn: false;\n\t/if;\n/define_tag;\n\n\ndefine_tag: 'cachedelete', -description='Deletes the cache for the specified name (and optionally name). \\n\\\n\t\tParameters:\\n\\\n\t\t-type (required string) Page variables of the specified type will be stored in cache. \\n\\\n\t\t-session (optional string) The name of an existing session to use for cache storage instead of the global storage\\n\\\n\t\t-name (optional string) Extra name parameter to be able to isolate the cache storage from other sites on the same virtual hosts. ',\n\t-namespace='knop_',\n\t-required='type', -type='string',\n\t-optional='session', -type='string',\n\t-optional='name', -type='string'; // ignored for session\n\tif: (local_defined: 'session');\n\t\t//fail_if: (session_id: -name=#session) -> size == 0, -1, 'Cachestore with -session requires that the specified session is started';\n\t\tlocal: 'cache_name' = '_knop_cache_' + (local: 'name');\n\t\tsession_addvar: -name=#session, #cache_name;\n\t\t!((var: #cache_name) -> isa('map')) ? var: #cache_name = map;\n\t\t(var: #cache_name) -> remove(#type);\n\telse;\n\t\tlocal: 'cache_name'='knop_' + (local: 'name') + '_' + server_name + response_localpath;\n\t\t#cache_name -> removetrailing(response_filepath);\n\t\t// initiate thread RW lock\n\t\t!(global: 'rwlock_' + #cache_name) -> isa('rwlock') ? global: 'rwlock_' + #cache_name=Thread_RWLock;\n\t\t// create a reference to the lock\n\t\tlocal: 'lock'=@(global: 'rwlock_' + #cache_name);\n\t\t// lock for writing\n\t\t#lock -> writelock;\n\t\t// check and initiate the cache storage\n\t\t!((global: #cache_name) -> isa('map')) ? global: #cache_name = map;\n\t\t(global: #cache_name) -> remove(#type);\n\t\t// unlock\n\t\t#lock -> writeunlock;\n\t/if;\n\n/define_tag;\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop custom tags in util.inc\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_base\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type('knoptype',\n\t-namespace='knop_');\n\tlocal('description'='All Knop custom types should have this type as parent type. This is to be able to identify all registered knop types. ');\n\tlocal('isknoptype'=true);\n/define_type;\n\ndefine_type: 'base',\n\t'knop_knoptype',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2009-09-14',\n\t\t'description'='Base data type for Knop framework. Contains common member tags. Used as boilerplate when creating the other types. \\\n\t\t\t\t\t\tAll member tags and instance variables in this type are available in the other knop types as well. ';\n/*\n\n\nCHANGE NOTES\n2009-09-14\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-04-07\tJS\t->error_msg: custom error numbers can now be added, even if the language already exists.\n2008-01-10\tJS\t->error_msg: improved reporting of custom error messages such as from bad database queries\n2007-12-13\tJS\tAdded -> error_lang to provide a reference to the knop_lang object for error messages, to be able to add localized error messages to any Knop type (except knop_lang and knop_base)\n2007-12-12\tJS\tAdded -html and -xhtml to ->help to get a nicely formatted output. \n2007-12-11\tJS\tCentralized ->error_code and ->error_msg to knop_base. Moved all error codes to error_msg\n2007-12-06\tJS\tChanged ->help to improve the self-documentation. It will now always return an up to date list of member tags and parameter. \n2007-11-05\tJS\tAdded var name to trace output\n2007-06-17\tJS\tAdded ->tagtime (was in nav earlier)\n2007-06-13\tJS\tAdded -> varname to be able to retreive the name of the page variable that a type instance is stored in.\n2007-06-13\tJS\tAdded -> xhtml to automatically sense if an xhtml doctype exists in the current page buffer. The result is cached in a page variable for performance. \n\t\t\t\tThis is for internal use for member tags that output html. \n2007-06-13\tJS\tIntroduced page variable $_knop_data for general page level storage and caching, common between different knop objects. \n2007-06-13\tJS\tCreated the data type\n\nTODO: ->help: add output option to format for Google Code Wiki\n->xhtml is not working properly when site is run by atbegin handler and explicitly writing to content_body \n\n\n*/\n\n\tlocal: 'debug_trace'=array,\n\t\t'_debug_trace'=array,\n\t\t'instance_unique'=null,\n\t\t'instance_varname'=null,\n\t\t'tagtime'=integer,\t\t\t\t// time for entire tag in ms\n\t\t'tagtime_tagname'=string,\n\t\t'error_code'=0,\n\t\t'error_msg'=string,\n\t\t'error_lang'=null,\t// must be defined as knop_lang in each type instead, to avoid recursion\n\t\t;\n\n\tdefine_tag: 'ondeserialize', -description='Recreates transient variables after coming back from a session';\n\t\tself -> properties -> first -> insert('_debug_trace'=array);\n\t/define_tag;\n\n\tdefine_tag: 'help', -description='Auto generates an overview of all member tags of a type, with all parameters specified for each member tag.', \n\t\t-optional='html',\n\t\t-optional='xhtml';\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\n\t\tlocal: 'output'=string,\n\t\t\t'tags'=array,\n\t\t\t'description'=string,\n\t\t\t'parameters'=string;\n\t\t#output += (self -> type) + ' - version ' + (self -> 'version') + '\\n' ;\n\t\t#output += (self -> 'description') + '\\n\\n';\n\t\titerate: (self -> properties -> second) , local: 't';\n\t\t\t#tags -> (insert: #t);\n\t\t/iterate;\n\t\tif: (self -> parent -> type != 'null'); // this doesn't work\n\t\t\titerate: (self -> parent -> properties -> second) , local: 't';\n\t\t\t\t#tags -> (insert: #t);\n\t\t\t/iterate;\n\t\t/if;\n\t\t#tags -> sort;\n\t\titerate: #tags , local: 't';\n\t\t\t#parameters = string;\n\t\t\t#output += '-> ' + (#t -> name);\n\t\t\t#description=(#t -> value -> description);\n\t\t\titerate: (#t -> value -> paraminfo) , local: 'p';\n\t\t\t\tif: #description !>> '-' + (#p -> paramname);\n\t\t\t\t\t#parameters += '-' + (#p -> paramname) + ' (' (#p -> isrequired ? 'required' | 'optional') \n\t\t\t\t\t\t+ (#p -> paramtype != 'null' && #p -> paramtype -> size ? ' ' + (#p -> paramtype))  + ')\\n';\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#output += (#description -> size || #parameters -> size ? '\\n' + #description);\n\t\t\t#output += (#description >> 'Parameters:' ?  '\\n');\n\t\t\t#output += (#description !>> 'Parameters:' && #parameters -> size ? '\\nParameters:\\n');\n\t\t\t#output += (#parameters -> size ? #parameters);\n\t\t\t#output -> removetrailing('\\n');\n\t\t\t#output += '\\n\\n';\n\t\t/iterate;\n\t\tif: ((local_defined: 'html') && #html != false) || ((local_defined: 'xhtml') && #xhtml != false);\n\t\t\t#output = encode_html: #output;\n\t\t\t// normalize line breaks and convert to <br>\n\t\t\t#output -> (replace: '\\r\\n', '\\n') & (replace: '\\r', '\\n') & (replace: '\\n', #eol + '\\n');\n\t\t/if;\n\t\treturn: #output;\n\t/define_tag;\n\n\n\tdefine_tag: 'xhtml', -description='Internal. Finds out if xhtml output should be used. Looks at doctype unless -xhtml is specified \\\n\t\t\tin the params array. The result is cached in a page variable. \\n\\\n\t\t\tLooking at doctype doesn\\'t work when using atbegin driven solutions since content_body isn\\'t filled with the page buffer until the page has already been processed.  ',\n\t\t-optional='params';\n\t\tif: (local_defined: 'params') && #params >> '-xhtml';\n\t\t\tlocal: 'xhtmlparam'=#params -> (find: '-xhtml') -> first;\n\t\t\tif: #xhtmlparam -> type == 'pair'; // -xhtml=true / -xhtml=false\n\t\t\t\treturn: boolean: (#xhtmlparam -> value);\n\t\t\telse; // plain -xhtml\n\t\t\t\treturn: true;\n\t\t\t/if;\n\t\t/if;\n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t$_knop_data = map;\n\t\t/if;\n\t\tif: $_knop_data !>> 'doctype_xhtml';\n\t\t\tlocal: 'doctype' = content_body -> (substring: 1, (content_body -> (find: '>')));\n\t\t\t$_knop_data -> (insert: 'doctype_xhtml' = (#doctype >> '<!DOCTYPE' && #doctype >> 'xhtml'));\n\t\t/if;\n\t\treturn: $_knop_data -> (find: 'doctype_xhtml');\n\t/define_tag;\n\n\n\tdefine_tag: 'error_lang', -description='Returns a reference to the language object used for error codes, to be able to add localized error messages to any Knop type (except knop_lang and knop_base)';\n\t\treturn: @(self -> 'error_lang');\n\t/define_tag;\n\n\tdefine_tag: 'error_code', -description='Either proprietary error code or standard Lasso error code';\n\t\t\t\treturn: integer: (self -> 'error_code');\n\t/define_tag;\n\n\tdefine_tag: 'error_msg',\n\t\t-optional='error_code', -type='integer', -copy;\n\t\t!(local_defined: 'error_code') ? local: 'error_code'=(self -> error_code);\n\t\tlocal: 'error_lang_custom'=(self -> 'error_lang');\n\t\tlocal: 'error_lang'=(knop_lang: -default='en', -fallback);\n\n\t\tlocal: 'errorcodes'=(map:\n\t\t\t0 = 'No error',\n\t\t\t-1728 = 'No records found', // standard Lasso error code\n\t\t\t\n\t\t\t// database errors 7000\n\t\t\t7001 ='The specified table was not found',\n\t\t\t7002 = 'Keyfield not specified',\n\t\t\t7003 = 'Lockfield not specified',\n\t\t\t7004 = 'User not specified for record lock',\n\t\t\t7005 = 'Either keyvalue or lockvalue must be specified for update or delete',\n\t\t\t7006 = 'Keyfield or keyvalue missing',\n\t\t\t7007 = 'Keyvalue missing',\n\t\t\t7008 = 'Keyvalue not unique',\n\t\t\t7009 = '-sql can not be used with FileMaker',\n\t\t\t7010 = 'Record locked by another user', // see error_data\n\t\t\t7011 = 'Record lock not valid any more',\n\t\t\t7012 = 'Could not set record lock', // see error_data\n\t\t\t7013 = 'Failed to clear record locks', // see error_data\n\t\t\t7016 = 'Add error', // see error_data\n\t\t\t7017 = 'Add failed, duplicate key value',\n\t\t\t7018 = 'Update error', // see error_data\n\t\t\t7019 = 'Delete error', // see error_data\n\t\t\t7020 = 'Keyfield not present in query',\n\t\t\t7021 = 'Lockfield not present in query',\n\t\t\t\n\t\t\t// form errors 7100\n\t\t\t7101 ='Form validation failed',\n\t\t\t7102 = 'Unsupported field type',\n\t\t\t7103 = 'Form->process requires that a database object is defined for the form',\n\t\t\t7104 = 'Copyfield must copy to a different field name',\n\n\t\t\t// grid errors 7200 \n\t\t\t\n\t\t\t// lang errors 7300\n\t\t\t\n\t\t\t// nav errors 7400\n\t\t\t\n\t\t\t// user errors 7500\n\t\t\t7501 = 'Authentication failed',\n\t\t\t7502 = 'Username or password missing',\n\t\t\t7503 = 'Client fingerprint has changed'\n\t\t\t\n\t\t\t);\n\t\t#error_lang -> (addlanguage: -language='en', -strings=@#errorcodes);\n\t\t// add any custom error strings\n\t\titerate(#error_lang_custom -> 'strings', local('custom_language'));\n\t\t\tif(#error_lang -> 'strings' !>> #custom_language -> name);\n\t\t\t\t// add entire language at once\n\t\t\t\t#error_lang -> addlanguage(-language=#custom_language -> name, -strings=#custom_language -> value);\n\t\t\telse;\n\t\t\t\t// add one string at a time\n\t\t\t\titerate(#custom_language -> value, local('custom_string'));\n\t\t\t\t\t#error_lang -> insert(-language=#custom_language -> name, \n\t\t\t\t\t\t-key=#custom_string -> name, \n\t\t\t\t\t\t-value=#custom_string -> value);\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t/iterate;\n\t\t\n\t\tif: #errorcodes >> #error_code;\n\t\t\t// return error message defined by this tag\n\t\t\tif: #error_lang -> keys >> #error_code;\n\t\t\t\treturn: #error_lang -> (getstring: #error_code);\n\t\t\telse;\n\t\t\t\treturn: #errorcodes -> (find: #error_code);\n\t\t\t/if;\n\t\telse;\n\t\t\tif: (self -> 'error_msg') != '';\n\t\t\t\t// return literal error message\n\t\t\t\treturn: (self -> 'error_msg');\n\t\t\telse;\n\t\t\t\t// test for error known by lasso\n\t\t\t\terror_code = #error_code;\n\t\t\t\t// return Lasso error message\n\t\t\t\treturn: error_msg;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'varname', -description='Returns the name of the variable that this type instance is stored in.';\n\t\tlocal: 'timer'=knop_timer;\n\t\tif: self -> 'instance_unique' == null;\n\t\t\tself -> 'instance_unique' = knop_unique;\n\t\t/if;\n\t\tif: self -> 'instance_varname' == null;\n\t\t\t// look for the var name and store it in instance variable\n\t\t\titerate: (vars -> keys), (local: 'varname');\n\t\t\t\tif: (var: #varname) -> type == self -> type \n\t\t\t\t\t&& ((var: #varname) -> 'instance_unique') == (self -> 'instance_unique');\n\t\t\t\t\t(self -> 'instance_varname')=#varname;\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer;\n\t\treturn: self -> 'instance_varname';\n\t/define_tag;\n\n\tdefine_tag: 'trace', -description='Returns the debug trace for a type instance',\n\t\t-optional='html',\n\t\t-optional='xhtml';\n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\t\tlocal: 'trace'=(self -> 'debug_trace');\n\t\t(self -> '_debug_trace') -> isa('array') ? #trace -> merge(self -> '_debug_trace');\n\t\treturn: #eol + 'Debug trace for ' + (self -> type ) + ' $' + (self -> varname) + #eol \n\t\t\t+ #trace -> (join: #eol) + #eol;\n\n\t/define_tag;\n\n\n\tdefine_tag: 'tagtime', -description='Returns the time it took to execute the last executed member tag for a type instance.',\n\t\t-optional='html',\n\t\t-optional='xhtml';\n\t\t/* Standard timer code\n\t\tAt beginning of tag code:\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tBefore the end of tag code (before return):\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\n\t\t*/\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\t((local_defined: 'html') || (local_defined: 'xhtml')) ? return: (self -> type) + '->' + (self -> 'tagtime_tagname') + ': ' + (self -> 'tagtime') + ' ms<br' + #endslash + '>';\n\t\treturn: (self -> 'tagtime');\n\t/define_tag;\n\n/define_type;\n\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_base\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_database\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'database',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\t\n\tlocal: 'version'='2010-11-23',\n\t\t'description'='Custom type to interact with databases. Supports both MySQL and FileMaker datasources. ';\n\n/*\n\nCHANGE NOTES\n2012-06-10\tSP\tFix for decimal precision bug in 8.6.0.1 in renderfooter.\n2012-01-15\tSP\tAdd support for inline host method.  Thanks to Ric Lewis.\n2010-11-23\tJS\t->settable: removed reference for -table\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->nextrecord: Added deprecation warning\n2009-05-15\tJS\t->field: corrected the verification of the -index parameter\n2009-01-09\tJS\tAdded a check before calling resultset_count so it will not break in Lasso versions before 8.5\n2009-01-09\tJS\t->_unknowntag: fixed incorrect debug_trace\n2008-12-03\tJS\t->addrecord: improved how keyvalue is returned when adding records\n2008-12-03\tJS\t->addrecord: inserting a generated keyvalue can now be suppressed by specifying -keyvalue=false\n2008-12-03\tJS\t->saverecord and ->deleterecord will now use the current keyvalue (if any), so -keyvalue will not have to be specified in that case. \n2008-11-25\tJS\t->field and ->recorddata will no longer touch current_record if it was zero\n2008-11-24\tJS\t->field: Added -index parameter to be able to access any occurrence of the same field name\n2008-11-24\tJS\tAdded -> records that returns a new data type knop_databaserows\n2008-11-24\tJS\t->resultset_count: added support for -inlinename. \n2008-11-24\tJS\tChanged ->nextrecord to ->next. ->nextrecord remains supported for backwards compatibility.\n2008-11-14\tJS\t->nextrecord resets the record pointer when reaching the last record\n2008-11-13\tJS\t->recorddata now honors the current record pointer (as incremented by -nextrecord)\n2008-11-13\tJS\t->recorddata: added -recordindex parameter so a specific record can be returned instead of the first found.\n2008-10-30\tJS\t->getrecord now REALLY works with integer keyvalues (double oops) - I thought I fixed it 2008-05-28 but misplaced a paren...\n2008-09-26\tJS\tAdded -> resultset_count corresponding to the same Lasso tag, so [resultset]...[/resultset] can now be used through the use of inlinename.\n2008-09-10\tJS\t-> getrecord, ->saverecord, ->deleterecord: Corrected handling of lock user to work better with knop_user\n2008-07-09\tJS\t->saverecord: -keeplock now updates the lock timestamp\n2008-05-28\tJS\t->getrecord now works with integer keyvalues (oops)\n2008-05-27\tJS\t->get returns a new datatype knop_databaserow \n2008-05-27\tJS\tAdded ->size and ->get so a database object can be iterated. When iterating each row is returned as an array of field values. \n2008-05-27\tJS\tAddedd ->nextrecord that increments the recordpointer each time it is called until the last record in the found set is reached. Returns true as long as there are more records. Useful in a while loop - see example below\n2008-05-27\tJS\tImplemented record pointer 'current_record'. The record pointer is reset for each new query. \n2008-05-27\tJS\t->field: added -recordindex to get data from any record in the current found set\n2008-05-27\tJS\tAdded ->_unknowntag as shortcut to field\n2008-05-26\tJS\tRemoved onassign since it causes touble\n2008-05-26\tJS\tExtended field_names to return the field names for any specified table, return field names also for db objects that have never been used for a database query and optionally return field types\n2008-01-29\tJS\t->getrecord now supports -sql. Make sure that the SQL statement includes the relevant keyfield (and lockfield if locking is used). \n2008-01-10\tJS\t->capturesearchvars: error_code and error_msg was mysteriously not set after database operations that caused errors. \n2008-01-08\tJS\t->saverecord: added flag -keeplock to be able to save a locked record without releasing the lock\n2007-12-15\tJS\tAdding support for knop_user in record locking is in progress. Done for ->oncreate and ->getrecord. \n2007-12-11\tJS\tMoved error_code and error_msg to knop_base\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-10\tJS\tAdded ->settable to be able to copy an existing database object and properly set a new table name for it. Faster than creating a new instance from scratch. \n2007-12-03\tJS\tCorrected shown_first once again, hoping it's right this time\n2007-11-29\tJS\tAdded support for field_names and corresponding member tag ->field_names\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-26\tJS\t->capturesearchvars: corrected shown_first when no records found\n2007-10-26\tJS\t->oncreate: added default value \"keyfield\" if the -keyfield parameter is not specified\n2007-09-06\tJS\tCorrected self -> 'tagtime' typo\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\tChanged recordid_value to keyfield_value and -recordid to -keyvalue\n2007-05-28\tJS\t->oncreate: Added clearing of current error at beginning of tag\n2007-04-19\tJS\tCorrected the handling of -maxrecords and -skiprecords for SQL selects that have LIMIT specified\n2007-04-19\tJS\tImproved handling of foundrows so it finds any whitespace around SQL keywords, instead of just plain spaces\n2007-04-18\tJS\t->select now populates recorddata with all the fields for the first found record. Previously it only populated recorddata when there was 1 found record. \n2007-04-12\tJS\t->oncreate: Added authentication inline around Database_TableNames../Database_TableNames\n2007-04-10\tJS\t->oncreate: Improved validation of table name (table_realname can sometimes be null even for valid table names)\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-01-30\tJS \tAdded real error codes and additional error data for some errors (like record locked)\n2007-01-30\tJS\tChanged -keyvalue parameters to copy value instead of pass as reference, to not cause problems when using keyvalue from the same db object as is being updated, for example $db->(saverecord: -keyvalue=$db->keyvalue)\n2007-01-26\tJS\tAdjusted affectedrecord_keyvalue so it's only captured for -add and -update\n2007-01-23\tJS\tSupports -uselimit (or querys that use LIMIT) and still gets proper searchresult vars (using a separate COUNT(*) query) - may not always get the right result for example for queries with GROUP BY\n2007-01-23\tJS\t-keyfield can be specified for saverecord to override the default\n2007-01-23\tJS\tChanged name of ->updaterecord to ->saverecord\n2007-01-23\tJS \tFixed bug where keyfield was missing as returnfield when looking up locked record for deleterecord\n2007-01-23\tJS\tAdded ->field\n2007-01-19\tJS\tAdded maxrecords_value and skiprecords_value to searchresultvars\n2007-01-18\tJS\tAdded affectedrecord_keyvalue to make it possible to highlight affected record in record list (grid)\n\n\nTODO:\nAllow -keyfield to be specified for ->addrecord and ->deleterecord\nAdd some Active Record similar functionality for editing\nLook at making it so -table can be set dynamically instead of fixed at oncreate, to eliminate the need for one db object for each table. This can cause problems with record locks and how they interact with knop_user \ndatetime_create and datetime_mod, and also user_create and user_mod.\n\tUse default field names but allow to override at oncreate, and verify them at oncreate before trying to use them. \n\n\n*/\n\n\t// instance variables\n\t// these variables are set once\n\tlocal: 'database'=string,\n\t\t'table'=string,\n\t\t'table_realname'=string,\t// the actual table name, to be used in SQL statements (in case the table name is aliased in Lasso)\n\t\t'username'=string,\n\t\t'password'=string,\n\t\t'db_connect'=array,\n\t\t'host'=array,\t\t\t\t// add support for inline host method\n\t\t'datasource_name'=string,\n\t\t'isfilemaker'=false,\n\t\t'lock_expires'=1800,\t\t// seconds before a record lock expires\n\t\t'lock_seed'=knop_seed,\t\t// encryption seed for the record lock\n\t\t'error_lang'=(knop_lang: -default='en', -fallback),\n\t\t'user'=null,\t\t\t\t// knop_user that will be used for record locking\n\t\t'databaserows_map'=map;\t\t// map to hold databaserows for each inlinename\n\n\t// these variables are set for each query\n\tlocal: 'inlinename'=string,\t\t\t// the inlinename that holds the result of the latest db operation\n\t\t'keyfield'=string,\n\t\t'keyvalue'=null,\n\t\t'affectedrecord_keyvalue'=null,\t// keyvalue of last added or updated record (not reset by other db actions)\n\t\t'lockfield'=string,\n\t\t'lockvalue'=null,\n\t\t'lockvalue_encrypted'=null,\n\t\t'timestampfield'=string,\t\t// for optimistic locking\n\t\t'timestampvalue'=string,\n\t\t'searchparams'=string,\t\t\t// the resulting pair array used in the database action\n\t\t'querytime'=integer,\t\t\t// query time in ms\n\t\t// 'tagtime'=integer,\t\tmoved to knop_base\n\t\t'recorddata'=map,\t\t\t\t// for single record results, a map of all returned db fields\n\t\t'error_data'=map,\t\t\t\t// additional data for certain errors\n\t\t'message'=string,\t\t\t\t// user message for normal result\n\t\t'current_record'=integer,\t\t// index of the current record to get field values from a specific record\n\t\t'field_names_map'=map,\n\t\t'resultset_count_map'=map;\t\t// resultset_count stored for each inlinename \n\t// these vars have directly corresponding Lasso tags so they can be set programatically\n\tlocal: 'searchresultvars'=(array: 'action_statement', 'found_count', 'shown_first', \n\t\t'shown_last', 'shown_count', 'field_names', 'records_array', 'maxrecords_value', 'skiprecords_value');\n\titerate: #searchresultvars, (local: 'resultvar');\n\t\tlocal(#resultvar = null);\n\t/iterate;\n\n\tlocal: 'errors_error_data'=(map: 7010, 7012, 7013, 7016, 7018, 7019); // these error codes can have more info in error_data map\n\n\tdefine_tag: 'oncreate',\n\t\t-required='database',\n\t\t-required='table',\n\t\t-optional='host',\t\t\t// add support for inline host method\n\t\t-optional='username',\n\t\t-optional='password',\n\t\t-optional='keyfield',\n\t\t-optional='lockfield',\n\t\t-optional='user',\n\t\t-optional='validate';\t\t// validate the database connection info (adds the overhead of making a test connection to the database)\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\t// reset error\n\t\terror_code = 0;\n\t\terror_msg = error_noerror;\n\t\n\t\t// validate database and table names to make sure they exist in Lasso\n\t\t(self -> 'datasource_name') = Lasso_DatasourceModuleName: #database;\n\t\tfail_if: error_code != 0, error_code, error_msg;\n\t\t\t\t\n\t\t// store params as instance variables\n\t\tlocal_defined('database') ? (self -> 'database') = @#database; \n\t\tlocal_defined('table') ? (self -> 'table') = @#table; \n\t\tlocal_defined('host') ? (self -> 'host') = @#host;\t// add support for inline host method\n\t\tlocal_defined('username') ? (self -> 'username') = @#username; \n\t\tlocal_defined('password') ? (self -> 'password') = @#password; \n\t\tlocal_defined('lockfield') ? (self -> 'lockfield') = @#lockfield; \n\t\tlocal_defined('user') ? (self -> 'user') = @#user;\n\t\t\t// param has default value\n\t\t(self -> 'keyfield') = (local_defined('keyfield') \n\t\t\t\t\t\t\t\t? @#keyfield // use parameter value\n\t\t\t\t\t\t\t\t| 'keyfield'); // use default value\n\n\t\t\n\t\t// build inline connection array\n\t\tlocal_defined('database') ? (self -> 'db_connect') -> insert('-database'  = @#database);\n\t\tlocal_defined('table') ? (self -> 'db_connect') -> insert('-table'  = @#table);\n\t\tlocal_defined('host') ? (self -> 'db_connect') -> insert('-host'  = @#host);\t// add support for inline host method\n\t\tlocal_defined('username') ? (self -> 'db_connect') -> insert('-username'  = @#username);\n\t\tlocal_defined('password') ? (self -> 'db_connect') -> insert('-password'  = @#password);\n\n\t\t(self -> 'table_realname') = (table_realname: #database, #table);\n\t\tif:  (self -> 'table_realname') == null;\n\t\t\t// verify that the table exists even if table_realname is null\n\t\t\tinline: (self -> 'db_connect');\n\t\t\t\tDatabase_TableNames: #database;\n\t\t\t\t\tif: Database_TableNameItem == #table;\n\t\t\t\t\t\t(self -> 'table_realname') = #table;\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/Database_TableNames;\n\t\t\t/inline;\n\t\t/if;\n\t\tfail_if: (self -> 'table_realname') == null, 7001, self -> error_msg(7001); // The specified table was not found\n\t\t\n\t\tif: (local_defined: 'validate');\n\t\t\t// validate db connection\n\t\t\tinline: (self -> 'db_connect');\n\t\t\t\tfail_if: error_code != 0, error_code, error_msg;\n\t\t\t/inline;\n\t\t/if;\n\n\t\tif: Lasso_DatasourceIsFilemaker: #database || Lasso_DatasourceIsFilemakerSA: #database;\n\t\t\t(self -> 'isfilemaker') = true;\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': creating database object on ' + (self -> 'datasource_name') +', isfilemaker: ' + (self -> 'isfilemaker') + ' at ' + (date -> (format: '%Q %T')));\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\n\t/define_tag;\n\t\n\t/* \n\tdefine_tag: 'onassign', -required='value', -description='Internal, needed to restore references when ctype is defined as prototype';\n\t\t// recreate references here\n\t\t(self -> 'user') = @(#value -> 'user');\n\t/define_tag;\n\t*/\n\n\tdefine_tag('_unknowntag', -description='Shortcut to field');\n\t\tif((self -> 'field_names_map') >> tag_name);\n\t\t\treturn(self -> field(tag_name));\n\t\telse;\n\t\t\t//fail(-9948, self -> type + '->' + tag_name + ' not known.');\n\t\t\t(self -> 'debug_trace') -> insert(self -> type + '->' + tag_name + ' not known.');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'settable',\t-description='Changes the current table for a database object. Useful to be able to create \\\n\t\tdatabase objects faster by copying an existing object and just change the table name. This is a little bit faster \\\n\t\tthan creating a new instance from scratch, but no table validation is performed. Only do this to add database \\\n\t\tobjects for tables within the same database as the original database object. ',\n\t\t-required='table', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\t\n\t\t(self -> 'error_code')=0;\n\t\t(self -> 'error_msg')=string;\n\t\t(self -> 'table_realname') = #table;\n\t\t(self -> 'db_connect') -> removeall(#table);\n\t\t(self -> 'db_connect') -> (insert: '-table' = #table);\n\t\t(self -> 'table_realname') = (table_realname: self -> 'database', #table);\n\t\tif:  (self -> 'table_realname') == null;\n\t\t\t// verify that the table exists even if table_realname is null\n\t\t\tinline: (self -> 'db_connect');\n\t\t\t\tDatabase_TableNames: (self -> 'database');\n\t\t\t\t\tif: Database_TableNameItem == #table;\n\t\t\t\t\t\t(self -> 'table_realname') = #table;\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/Database_TableNames;\n\t\t\t/inline;\n\t\t/if;\n\t\tfail_if: (self -> 'table_realname') == null, 7001, self -> error_msg(7001); // The specified table was not found\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'select', -description='perform database query, either Lasso-style pair array or SQL statement.\\\n\t\t\t ->recorddata returns a map with all the fields for the first found record. \\\n\t\t\t If multiple records are returned, the records can be accessed either through ->inlinename or ->records_array.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-search (optional array) Lasso-style search parameters in pair array\\n\\\n\t\t\t-sql (optional string) Raw sql query\\n\\\n\t\t\t-keyfield (optional) Overrides default keyfield, if any\\n\\\n\t\t\t-keyvalue (optional)\\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename',\n\t\t-optional='search', -type='array',\n\t\t-optional='sql', -type='string',\n\t\t-optional='keyfield',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='inlinename', -copy;\n\n\t\tknop_debug(self->type + ' -> ' + tag_name, -open, -type=self->type);\n\t\thandle;\n\t\t\t//knop_debug(-close, -witherrors, -type=self->type);\n\t\t\tknop_debug('Done with ' + self->type + ' -> ' + tag_name, -close, -witherrors, -time);\n\t\t/handle;\n\t\tlocal: 'timer'=knop_timer; \n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\t\t\n\t\tlocal: '_search'=(local: 'search'),\n\t\t\t'_sql'=(local: 'sql');\n\t\tif: #_search -> type != 'array';\n\t\t\t#_search = array;\n\t\t/if;\n\t\tif: #_sql != '' && (self -> 'isfilemaker');\n\t\t\t#_sql='';\n\t\t\tfail: 7009, self -> error_msg(7009); // sql can not be used with filemaker\n\t\t/if;\n\t\t// inlinename defaults to a random string\n\t\t(self -> 'inlinename') = ((local: 'inlinename') != '' ? #inlinename | 'inline_' + knop_unique);\n\t\t#_search -> (removeall: -inlinename);\n\t\t#_search -> (insert: -inlinename=(self -> 'inlinename'));\n\t\t\n\t\t// remove all database actions from the search array\n\t\t#_search -> (removeall: -search) & (removeall: -add) & (removeall: -delete) & (removeall: -update) \n\t\t\t& (removeall: -sql) & (removeall: -nothing) & (removeall: -show)\n\t\t\t// & (removeall: -table)  // table is ok to override\n\t\t\t& (removeall: -database);\n\n\t\tif: (local: 'sql') != '' && (string_findregexp: #sql, -find='\\\\bLIMIT\\\\b', -ignorecase) -> size;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing -maxrecords and -skiprecords from search array');\n\t\t\t// store maxrecords and skiprecords for later use\n\t\t\tif: #_search >> '-maxrecords';\n\t\t\t\t(self -> 'maxrecords_value') = #_search -> (find: '-maxrecords') -> last -> value;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': -maxrecords value found in search array ' + (self -> 'maxrecords_value'));\n\t\t\t/if;\n\t\t\tif: #_search >> '-skiprecords';\n\t\t\t\t(self -> 'skiprecords_value') = #_search -> (find: '-skiprecords') -> last -> value;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': -skiprecords value found in search array ' + (self -> 'skiprecords_value'));\n\t\t\t/if;\n\t\t\t// remove skiprecords from the actual search parameters since it will conflict with LIMIT\n\t\t\t#_search -> (removeall: '-skiprecords');\n\t\t/if;\n\n\t\tif: !(local_defined: 'keyfield') && (self -> 'keyfield') != '';\n\t\t\tlocal: 'keyfield'=(self -> 'keyfield');\n\t\t/if;\n\t\tif: (local: 'keyfield') != '';\n\t\t\t#_search -> (removeall: '-keyfield');\n\t\t\tif: !(self -> 'isfilemaker');\n\t\t\t\t#_search -> (insert: '-keyfield'=#keyfield);\n\t\t\t/if;\n\t\t\tif: (local: 'keyvalue') != '';\n\t\t\t\t#_search -> (removeall: '-keyvalue');\n\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\t#_search -> (insert: '-op'='eq');\n\t\t\t\t\t#_search -> (insert: #keyfield=#keyvalue);\n\t\t\t\telse;\n\t\t\t\t\t#_search -> (insert: '-keyvalue'=#keyvalue);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\n\t\t// add sql action or normal search action\n\t\tif: #_sql != '';\n\t\t\t#_search -> (insert: '-sql'=#_sql);\n\t\telse;\n\t\t\t#_search -> (insert: '-search');\n\t\t/if;\n\t\t// perform database query, put connection parameters last to override any provided by the search parameters\n\t\t//(self -> 'debug_trace') -> (insert: tag_name + ': search ' + #_search);\n\t\tlocal: 'querytimer'=knop_timer;\n\t\tinline: #_search,(self -> 'db_connect');\n\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t(self -> 'searchparams') = #_search;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name ': action_statement ' + action_statement);\n\t\t\tknop_debug(action_statement, -sql);\n\t\t\tknop_debug(found_count ' found');\n\t\t\tself -> capturesearchvars;\n\t\t/inline;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found ' (self -> 'found_count') + ' records in ' + (self -> 'querytime') + ' ms, tag time ' + (self -> 'tagtime') + ' ms, ' + (self -> error_msg) + ' ' + (self -> error_code));\n\t/define_tag;\n\n\n\tdefine_tag: 'addrecord', -description='Add a new record to the database. A random string keyvalue will be generated unless a -keyvalue is specified. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-fields (required array) Lasso-style field values in pair array\\n\\\n\t\t\t-keyvalue (optional) If -keyvalue is specified, it must not already exist in the database. Specify -keyvalue=false to prevent generating a keyvalue. \\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename',\n\t\t-required='fields', -type='array',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='inlinename';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\t\tlocal: '_fields'=#fields;\n\t\t\n\t\t// remove all database actions from the search array\n\t\t#_fields -> (removeall: '-search') & (removeall: '-add') & (removeall: '-delete') & (removeall: '-update') \n\t\t\t& (removeall: '-sql') & (removeall: '-nothing') & (removeall: '-show')\n\t\t\t// & (removeall: '-table')  // table is ok to override\n\t\t\t& (removeall: '-database');\n\n\t\tinline: (self -> 'db_connect'); // connection wrapper\n\t\t\tif: (local: 'keyvalue') != '' && (local: 'keyvalue') !== false && (self -> 'keyfield')!='';\n\t\t\t\t// look for existing keyvalue\n\t\t\t\tinline: -op='eq', (self -> 'keyfield')=#keyvalue, \n\t\t\t\t\t-maxrecords=1,\n\t\t\t\t\t-returnfield=(self -> 'keyfield'),\n\t\t\t\t\t-search;\n\t\t\t\t\tif: found_count > 0;\n\t\t\t\t\t\t(self -> 'error_code') = 7017; // duplicate keyvalue\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> 'keyvalue') = #keyvalue;\n\t\t\t\t\t/if;\n\t\t\t\t/inline;\n\t\t\t/if;\n\n\t\t\t\n\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t// proceed to add record\n\n\t\t\t\tif: (self -> 'keyfield') != '';\n\t\t\t\t\tif: (local: 'keyvalue') == '' && (local: 'keyvalue') !== false;\n\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': generating keyvalue');\n\t\t\t\t\t\t// create unique keyvalue\n\t\t\t\t\t\t(self -> 'keyvalue')=knop_unique;\n\t\t\t\t\t/if;\n\t\t\t\t\t#_fields -> (removeall: (self -> 'keyfield'));\n\t\t\t\t\t#_fields -> (removeall: '-keyfield') & (removeall: '-keyvalue');\n\t\t\t\t\t#_fields -> (insert: '-keyfield'=(self -> 'keyfield'));\n\t\t\t\t\tif: (local: 'keyvalue') !== false;\n\t\t\t\t\t\t#_fields -> (insert: (self -> 'keyfield')=(self -> 'keyvalue'));\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\n\t\t\t\t// inlinename defaults to a random string\n\t\t\t\t(self -> 'inlinename') = ((local: 'inlinename') != '' ? #inlinename | 'inline_' + knop_unique);\n\t\t\t\t#_fields -> (removeall: '-inlinename');\n\t\t\t\t#_fields -> (insert: '-inlinename'=(self -> 'inlinename'));\n\t\t\t\t\n\t\t\t\tlocal: 'querytimer'=knop_timer;\n\t\t\t\tinline: #_fields, -add;\n\t\t\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t\t\t(self -> 'searchparams') = #_fields;\n\t\t\t\t\n\t\t\t\t\tself -> capturesearchvars;\n\t\t\t\t\tif: error_code != 0;\n\t\t\t\t\t\t(self -> 'keyvalue') = null;\n\t\t\t\t\t/if;\n\t\t\t\t/inline;\n\t\t\t/if;\n\t\t/inline;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> error_msg) + ' ' + (self -> error_code) \n\t\t\t+ ' keyvalue ' + (self -> 'keyvalue') + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'getrecord', -description='Returns a single specific record from the database, optionally locking the record. \\\n\t\t\tIf the keyvalue matches multiple records, an error is returned. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-keyvalue (optional) Uses a previously set keyvalue if not specified. If no keyvalue is available, an error is returned unless -sql is used. \\n\\\n\t\t\t-keyfield (optional) Temporarily override of keyfield specified at oncreate\\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename\\n\\\n\t\t\t-lock (optional flag) If flag is specified, a record lock will be set\\n\\\n\t\t\t-user (optional) The user who is locking the record (required if using lock)\\n\\\n\t\t\t-sql (optional) SQL statement to use instead of keyvalue. Must include the keyfield (and lockfield of locking is used).',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='keyfield',\n\t\t-optional='inlinename', -copy,\n\t\t-optional='lock',\n\t\t-optional='user', -copy,\n\t\t-optional='sql', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: '_sql'=(local: 'sql');\n\n\t\tif: #_sql != '' && (self -> 'isfilemaker');\n\t\t\t#_sql='';\n\t\t\tfail: 7009, self -> error_msg(7009); // sql can not be used with filemaker\n\t\t/if;\n\t\t\n\t\t// get existing record pointer if any\n\t\tif: #_sql -> size == 0 && !(local_defined: 'keyvalue');\n\t\t\tlocal: 'keyvalue'=(self -> 'keyvalue');\n\t\telse: !(local_defined: 'keyvalue');\n\t\t\tlocal: 'keyvalue'=string;\n\t\t/if;\n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\t\t\n\t\tfail_if: !(local_defined: 'keyfield') && (self -> 'keyfield') == '', 7002, self -> error_msg(7002); // Keyfield not specified\n\t\tif: (local_defined: 'lock') && #lock != false;\n\t\t\tfail_if: (self -> 'lockfield') == '', 7003, self -> error_msg(7003); // Lockfield must be specified to get record with lock\n\t\t\tif: !(local_defined: 'user') && ((self -> 'user') != '' || (self -> 'user') -> isa('user'));\n\t\t\t\t// use user from database object\n\t\t\t\tlocal('user' = (self -> 'user'));\n\t\t\t/if;\n\t\t\tfail_if: (local: 'user') == '' && !((local: 'user') -> isa('user')), 7004, self -> error_msg(7004); // User must be specified to get record with lock\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user is type ' + (#user -> type) + ', isa(user) = ' + (#user -> isa('user')) );\n\t\t\tif: #user -> isa('user');\n\t\t\t\t#user= #user -> id_user;\n\t\t\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User must be logged in to get record with lock\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user id is ' + #user);\n\t\t/if;\n\t\tif: !(local_defined: 'keyfield') && (self -> 'keyfield') != '';\n\t\t\tlocal: 'keyfield'=(self -> 'keyfield');\n\t\t/if;\n\t\tif:  #_sql -> size == 0 && string(#keyvalue) -> size == 0;\n\t\t\t(self -> 'error_code') = 7007; // keyvalue missing\n\t\t/if;\n\t\tif: (self -> 'error_code') == 0;\n\t\t\tinline: (self -> 'db_connect'); // connection wrapper\n\n\t\t\t\tif: #_sql -> size;\n\t\t\t\t\tself -> (select: -sql=#_sql, -inlinename=(local: 'inlinename'));\n\t\t\t\t\t#keyvalue = (self -> 'keyvalue');\n\t\t\t\telse;\n\t\t\t\t\tself -> (select: -keyfield=#keyfield, -keyvalue=#keyvalue, -inlinename=(local: 'inlinename'));\n\t\t\t\t/if;\n\t\t\t\tif: (self -> field_names) !>> #keyfield;\n\t\t\t\t\t(self -> 'error_code') = 7020; // Keyfield not present in query\n\t\t\t\t/if;\n\t\t\t\tif: (self -> field_names) !>> (self -> 'lockfield') && (local_defined: 'lock') && #lock != false;\n\t\t\t\t\t(self -> 'error_code') = 7021; // Lockfield not present in query\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t\tif: (self -> 'found_count') == 0 && (self -> 'error_code') == 0;\n\t\t\t\t\t(self -> 'error_code') = -1728;\n\t\t\t\telse: (self -> 'found_count') > 1 && (self -> 'error_code') == 0;\n\t\t\t\t\tself -> reset;\n\t\t\t\t\t(self -> 'error_code') = 7008; // keyvalue not unique\n\t\t\t\t/if;\n\t\t\n\t\t\n\t\t\t\t// handle record locking\n\t\t\t\tif: (self -> 'error_code') == 0 && (local_defined: 'lock') && #lock != false;\n\t\t\t\t\t// check for current lock\n\t\t\t\t\tif: (self -> 'lockvalue') != '';\n\t\t\t\t\t\t// there is a lock already set, check if it has expired or if it is the same user\n\t\t\t\t\t\tlocal: 'lockvalue'=(self -> 'lockvalue') -> (split: '|');\n\t\t\t\t\t\tlocal: 'lock_timestamp'=date: (#lockvalue->size > 1 ? #lockvalue -> (get: 2) | null);\n\t\t\t\t\t\tlocal: 'lock_user'=#lockvalue -> first;\n\t\t\t\t\t\tif: (date - #lock_timestamp) -> seconds < (self -> 'lock_expires')\n\t\t\t\t\t\t\t&& #lock_user != #user;\n\t\t\t\t\t\t\t// the lock is still valid and it is locked by another user\n\t\t\t\t\t\t\t// this is not a real error, more a warning condition\n\t\t\t\t\t\t\t(self -> 'error_code') = 7010; \n\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'user' = #lock_user, 'timestamp' = #lock_timestamp);\n\t\t\t\t\t\t\t(self -> 'keyvalue') = null;\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name ': record ' + #keyvalue + ' was already locked by ' + #lock_user + '.');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\t\t// go ahead and lock record\n\t\t\t\t\t\t(self -> 'lockvalue') = #user + '|' + (date -> format: '%Q %T');\n\t\t\t\t\t\t(self -> 'lockvalue_encrypted') = (encrypt_blowfish: (self -> 'lockvalue'), -seed=(self -> 'lock_seed'));\n\t\t\t\t\t\tlocal: 'keyvalue_temp'=#keyvalue;\n\t\t\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\t\t\t// find internal keyvalue\n\t\t\t\t\t\t\tinline: -op='eq', #keyfield=#keyvalue,\n\t\t\t\t\t\t\t\t-search;\n\t\t\t\t\t\t\t\tif: found_count == 1;\n\t\t\t\t\t\t\t\t\t#keyvalue_temp=keyfield_value;\n\t\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': will set record lock for FileMaker record id ' + keyfield_value + ' ' + error_msg + ' ' + error_code);\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': could not get record id for FileMaker record, ' found_count + ' found ' + + error_msg + ' ' + error_code);\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/inline;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tinline: -keyfield=#keyfield,\n\t\t\t\t\t\t\t-keyvalue=#keyvalue_temp, \n\t\t\t\t\t\t\t(self -> 'lockfield')=(self -> 'lockvalue'),\n\t\t\t\t\t\t\t-update;\n\t\t\t\t\t\t\tif: error_code;\n\t\t\t\t\t\t\t\t(self -> 'error_code') = 7012; // could not set record lock\n\t\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\t\t\t(self -> 'lockvalue') = null;\n\t\t\t\t\t\t\t\t(self -> 'lockvalue_encrypted') = null;\n\t\t\t\t\t\t\t\t(self -> 'keyvalue') = null;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t// lock was set ok\n\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': set record lock ' + (self -> 'lockvalue') + ' ' + (self -> 'lockvalue_encrypted'));\n\t\t\t\t\t\t\t\tif: (self -> 'user') -> isa('user');\n\t\t\t\t\t\t\t\t\t// tell user it has locked a record in this db object\n\t\t\t\t\t\t\t\t\t(self -> 'user') -> addlock(-dbname=self -> varname);\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/inline;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t/inline;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> error_msg) + ' ' + (self -> error_code) + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'saverecord', -description='Updates a specific database record. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-fields (required array) Lasso-style field values in pair array\\n\\\n\t\t\t-keyfield (optional) Keyfield is ignored if lockvalue is specified\\n\\\n\t\t\t-keyvalue (optional) Keyvalue is ignored if lockvalue is specified\\n\\\n\t\t\t-lockvalue (optional) Either keyvalue or lockvalue must be specified\\n\\\n\t\t\t-keeplock (optional flag) Avoid clearing the record lock when saving. Updates the lock timestamp.\\n\\'\n\t\t\t-user (optional) If lockvalue is specified, user must be specified as well\\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename',\n\t\t-required='fields', -type='array',\n\t\t-optional='keyfield',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='lockvalue', -copy,\n\t\t-optional='keeplock',\n\t\t-optional='user', -copy,\n\t\t-optional='inlinename', -copy;\n\t\t\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tif(!local_defined('keyvalue') && string(self -> 'keyvalue') -> size);\n\t\t\t// use current record's keyvalue if any\n\t\t\tlocal('keyvalue'=(self -> 'keyvalue'));\n\t\t/if;\n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\n\t\tfail_if: !(local_defined: 'keyvalue') && !(local_defined: 'lockvalue'), 7005, self -> error_msg(7005); // Either keyvalue or lockvalue must be specified for update or delete\n\t\tfail_if: (local_defined: 'keyvalue') && (self -> 'keyfield') == '' && (local: 'keyfield') == '', 7002, self -> error_msg(7002); // Keyfield not specified\n\t\tif: (local_defined: 'lockvalue');\n\t\t\tfail_if: (self -> 'lockfield') == '', 7003, self -> error_msg(7003); // Lockfield not specified\n\t\t\tif: !(local_defined: 'user') && ((self -> 'user') != '' || (self -> 'user') -> isa('user'));\n\t\t\t\t// use user from database object\n\t\t\t\tlocal('user' = (self -> 'user'));\n\t\t\t/if;\n\t\t\tfail_if: (local: 'user') == '' && !((local: 'user') -> isa('user')), 7004, self -> error_msg(7004); \n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user is type ' + (#user -> type) + ', isa(user) = ' + (#user -> isa('user')) );\n\t\t\tif: #user -> isa('user');\n\t\t\t\t#user= #user -> id_user;\n\t\t\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User must be logged in to get record with lock\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user id is ' + #user);\n\t\t/if;\n\t\t\n\t\t!(local_defined: 'keyfield') ? local: 'keyfield'=self -> 'keyfield';\n\t\t\n\t\tlocal: '_fields'=#fields;\n\t\t\n\t\t// remove all database actions from the search array\n\t\t#_fields -> (removeall: '-search') & (removeall: '-add') & (removeall: '-delete') & (removeall: '-update') \n\t\t\t& (removeall: '-sql') & (removeall: '-nothing') & (removeall: '-show')\n\t\t\t// & (removeall: '-table') // table is ok to override\n\t\t\t& (removeall: '-database');\n\t\t#_fields -> (removeall: '-keyfield') & (removeall: '-keyvalue');\n\n\t\tinline: (self -> 'db_connect'); // connection wrapper\n\n\t\t\t// handle record locking\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'lockvalue') != '';\n\n\t\t\t\t// first check if record was locked by someone else, and that lock is still valid\n\t\t\t\tlocal: 'lock'=(decrypt_blowfish: #lockvalue, -seed=(self -> 'lock_seed')) -> (split: '|');\n\t\t\t\tlocal: 'lock_timestamp'=date: (#lock->size > 1 ? (#lock -> (get: 2)) | null);\n\t\t\t\tlocal: 'lock_user'=#lock -> first;\n\t\t\t\tif: (date - #lock_timestamp) -> seconds < (self -> 'lock_expires')\n\t\t\t\t\t&& #lock_user != #user;\n\t\t\t\t\t// the lock is still valid and it is locked by another user\n\t\t\t\t\t(self -> 'error_code') = 7010; \n\t\t\t\t\t(self -> 'error_data') = (map: 'user' = #lock_user, 'timestamp' = #lock_timestamp);\n\t\t\t\t/if;\n\n\t\t\t\t// check that the current lock is still valid\n\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\tinline: -op='eq', (self -> 'lockfield')=#lock -> (join: '|'), \n\t\t\t\t\t\t-maxrecords=1,\n\t\t\t\t\t\t-returnfield=(self -> 'lockfield'),\n\t\t\t\t\t\t-returnfield=(self -> 'keyfield'),\n\t\t\t\t\t\t-search;\n\t\t\t\t\t\tif: error_code == 0 && found_count != 1;\n\t\t\t\t\t\t\t// lock is not valid any more\n\t\t\t\t\t\t\t(self -> 'error_code') = 7011; // Update failed, record lock not valid any more\n\t\t\t\t\t\telse: error_code != 0;\n\t\t\t\t\t\t\t(self -> 'error_code') = 7018; // Update error\n\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t// lock OK, grab keyvalue for update\n\t\t\t\t\t\t\tlocal: 'keyvalue'=(field: (self -> 'keyfield'));\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\t// go ahead and release record lock by clearing the field value in the update fields array\n\t\t\t\t\t#_fields -> (removeall: (self -> 'lockfield'));\n\t\t\t\t\tif: ((local_defined: 'keeplock') && #keeplock != false);\n\t\t\t\t\t\t// update the lock timestamp\n\t\t\t\t\t\t(self -> 'lockvalue') = #user + '|' + (date -> format: '%Q %T');\n\t\t\t\t\t\t(self -> 'lockvalue_encrypted') = (encrypt_blowfish: (self -> 'lockvalue'), -seed=(self -> 'lock_seed'));\n\t\t\t\t\t\t#_fields -> (insert: (self -> 'lockfield')=(self -> 'lockvalue'));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#_fields -> (insert: (self -> 'lockfield') = '');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\n\t\t\t/if;\n\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'keyvalue') != '';\n\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\tinline: -op='eq', #keyfield=#keyvalue, -search;\n\t\t\t\t\t\tif: found_count == 1;\n\t\t\t\t\t\t\t#_fields -> (insert: '-keyvalue'=keyfield_value);\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': FileMaker record id ' + keyfield_value);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\telse;\n\t\t\t\t\t#_fields -> (insert: '-keyfield'=#keyfield);\n\t\t\t\t\t#_fields -> (insert: '-keyvalue'=#keyvalue);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\tif: (#_fields >> '-keyfield' && #_fields -> (find: '-keyfield') -> first -> value != '' || (self -> 'isfilemaker'))\n\t\t\t\t&& #_fields >> '-keyvalue' && #_fields -> (find: '-keyvalue') -> first -> value != '';\n\t\t\t\t// ok to update\n\t\t\telse: (self -> 'error_code') == 0;\n\t\t\t\t(self -> 'error_code') = 7006; // Update failed, keyfield or keyvalue missing';\n\t\t\t/if;\n\n\t\t\t// update record\n\t\t\tif: (self -> 'error_code') == 0;\n\n\t\t\t\t// inlinename defaults to a random string\n\t\t\t\t(self -> 'inlinename') = ((local: 'inlinename') != '' ? #inlinename | 'inline_' + knop_unique);\n\t\t\t\t#_fields -> (removeall: '-inlinename');\n\t\t\t\t#_fields -> (insert: '-inlinename'=(self -> 'inlinename'));\n\t\n\t\t\t\tlocal: 'querytimer'=knop_timer;\n\t\t\t\tinline: #_fields, -update;\n\t\t\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t\t\t(self -> 'searchparams') = #_fields;\n\t\t\t\t\tself -> capturesearchvars;\n\t\t\t\t/inline;\n\t\t\t/if;\n\t\t/inline;\n\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> 'keyvalue') + ' '+ (self -> error_msg) + ' ' + (self -> error_code) + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'deleterecord', -description='Deletes a specific database record. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-keyvalue (optional) Keyvalue is ignored if lockvalue is specified\\n\\\n\t\t\t-lockvalue (optional) Either keyvalue or lockvalue must be specified\\n\\\n\t\t\t-user (optional) If lockvalue is specified, user must be specified as well',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='lockvalue', -copy,\n\t\t-optional='user';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tif(!local_defined('keyvalue') && string(self -> 'keyvalue') -> size);\n\t\t\t// use current record's keyvalue if any\n\t\t\tlocal('keyvalue'=(self -> 'keyvalue'));\n\t\t/if;\n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\n\t\tfail_if: !(local_defined: 'keyvalue') && !(local_defined: 'lockvalue'), 7005,  self -> error_msg(7005); // Either keyvalue or lockvalue must be specified for update or delete\n\t\tfail_if: (local_defined: 'keyvalue') && (self -> 'keyfield') == '', 7002,  self -> error_msg(7002); // Keyfield not specified\n\t\tif: (local_defined: 'lockvalue');\n\t\t\tfail_if: (self -> 'lockfield') == '', 7003,  self -> error_msg(7003); //  Lockfield not specified\n\t\t\tif: !(local_defined: 'user') && ((self -> 'user') != '' || (self -> 'user') -> isa('user'));\n\t\t\t\t// use user from database object\n\t\t\t\tlocal('user' = (self -> 'user'));\n\t\t\t/if;\n\t\t\tfail_if: (local: 'user') == '' && !((local: 'user') -> isa('user')), 7004, self -> error_msg(7004); \n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user is type ' + (#user -> type) + ', isa(user) = ' + (#user -> isa('user')) );\n\t\t\tif: #user -> isa('user');\n\t\t\t\t#user= #user -> id_user;\n\t\t\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User must be logged in to get record with lock\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user id is ' + #user);\n\t\t/if;\n\t\t\n\t\tlocal: '_fields'=array;\n\t\t\n\t\tinline: (self -> 'db_connect'); // connection wrapper\n\n\t\t\t// handle record locking\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'lockvalue') != '';\n\n\t\t\t\t// first check if record was locked by someone else, and that lock is still valid\n\t\t\t\tlocal: 'lockvalue'=(decrypt_blowfish: #lockvalue, -seed=(self -> 'lock_seed')) -> (split: '|');\n\t\t\t\tlocal: 'lock_timestamp'=date: (#lockvalue->size > 1 ? #lockvalue -> (get: 2) | null);\n\t\t\t\tlocal: 'lock_user'=(#lockvalue -> first);\n\t\t\t\tif: (date - #lock_timestamp) -> seconds < (self -> 'lock_expires')\n\t\t\t\t\t&& #lock_user != #user;\n\t\t\t\t\t// the lock is still valid and it is locked by another user\n\t\t\t\t\t(self -> 'error_code') = 7010; // Delete failed, record locked \n\t\t\t\t\t(self -> 'error_data') = (map: 'user' = #lock_user, 'timestamp' = #lock_timestamp);\n\t\t\t\t/if;\n\n\t\t\t\t// check that the current lock is still valid\n\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\tinline: -op='eq', (self -> 'lockfield')=#lockvalue -> (join: '|'), \n\t\t\t\t\t\t-maxrecords=1,\n\t\t\t\t\t\t-returnfield=(self -> 'lockfield'),\n\t\t\t\t\t\t-returnfield=(self -> 'keyfield'),\n\t\t\t\t\t\t-search;\n\t\t\t\t\t\tif: error_code == 0 && found_count != 1;\n\t\t\t\t\t\t\t// lock is not valid any more\n\t\t\t\t\t\t\t(self -> 'error_code') = 7011; // Delete failed, record lock not valid any more';\n\t\t\t\t\t\telse: error_code != 0;\n\t\t\t\t\t\t\t(self -> 'error_code') = 7019; // delete error\n\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t// lock OK, grab keyvalue for update\n\t\t\t\t\t\t\tlocal: 'keyvalue'=(field: (self -> 'keyfield'));\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': got keyvalue ' + #keyvalue + ' for keyfield ' + (self -> 'keyfield'));\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t/if;\n\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'keyvalue') != '';\n\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\tinline: -op='eq', (self -> 'keyfield')=#keyvalue, -search;\n\t\t\t\t\t\tif: found_count == 1;\n\t\t\t\t\t\t\t#_fields -> (insert: '-keyvalue'=keyfield_value);\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': FileMaker record id ' + keyfield_value);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\telse;\n\t\t\t\t\t#_fields -> (insert: '-keyfield'=(self -> 'keyfield'));\n\t\t\t\t\t#_fields -> (insert: '-keyvalue'=#keyvalue);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': will delete record with params ' + #_fields);\n\t\t\t\n\t\t\tif: (#_fields >> '-keyfield' && #_fields -> (find: '-keyfield') -> first -> value != '' || (self -> 'isfilemaker'))\n\t\t\t\t&& #_fields >> '-keyvalue' && #_fields -> (find: '-keyvalue') -> first -> value != '';\n\t\t\t\t// ok to delete\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = 7006; // Delete failed, keyfield or keyvalue missing\n\t\t\t/if;\n\t\t\t\n\t\t\t// delete record\n\t\t\tif: (self -> 'error_code') == 0;\n\t\n\t\t\t\tlocal: 'querytimer'=knop_timer;\n\t\t\t\tinline: #_fields, -delete;\n\t\t\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t\t\t(self -> 'searchparams') = #_fields;\n\t\t\t\t\n\t\t\t\t\tself -> capturesearchvars;\n\t\t\t\t\n\t\t\t\t/inline;\n\t\t\t/if;\n\t\t/inline;\n\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> error_msg) + ' ' + (self -> error_code) + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'clearlocks', -description='Release all record locks for the specified user, suitable to use when showing record list. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-user (required) The user to unlock records for',\n\t\t-required='user';\n\t\t// release all record locks for the specified user, suitable to use when showing record list\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tfail_if: (self -> 'lockfield') == '', 7003,  self -> error_msg(7003); //  Lockfield not specified\n\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User not specified\n\t\n\t\tif: (self -> 'isfilemaker');\n\t\t\tinline: (self -> 'db_connect'),\n\t\t\t\t-maxrecords=all,\n\t\t\t\t(self -> 'lockfield')='\"' + #user + '|\"',\n\t\t\t\t-search;\n\t\t\t\tif: found_count > 0;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': clearing locks for ' + #user + ' in ' + found_count + ' FileMaker records ' + error_msg + ' ' + error_code);\n\t\t\t\t\trecords;\n\t\t\t\t\t\tinline: -keyvalue=keyfield_value,\n\t\t\t\t\t\t\t(self -> 'lockfield')='',\n\t\t\t\t\t\t\t-update;\n\t\t\t\t\t\t\tif: error_code;\n\t\t\t\t\t\t\t\t(self -> 'error_code') = 7013; // Clearlocks failed\n\t\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': error when clearing lock on FileMaker record ' + keyfield_value + ' ' + error_msg + ' ' + error_code);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/inline;\n\t\t\t\t\t/records;\n\t\t\t\telse: error_code;\n\t\t\t\t\t(self -> 'error_code') = 7013; // Clearlocks failed\n\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t/if;\n\t\t\t/inline;\n\t\telse;\n\t\t\tinline: (self -> 'db_connect'),\n\t\t\t\t-sql='UPDATE `' + (self -> 'table_realname') + '` SET `' + (self -> 'lockfield') + '`=\"\"  WHERE `' + (self -> 'lockfield') \n\t\t\t\t\t+ '` LIKE \"' + (encode_sql: #user) + '|%\"';\n\t\t\t\tif: error_code != 0;\n\t\t\t\t\t(self -> 'error_code') = 7013; // Clearlocks failed\n\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t/if;\n\t\t\t/inline;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': clearing all locks for ' + #user + ' ' + (self -> error_msg) + ' ' + (self -> error_code));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'action_statement';\t\treturn: (self -> 'action_statement');\t/define_tag;\n\tdefine_tag: 'found_count';\t\t\treturn: (self -> 'found_count');\t\t/define_tag;\n\tdefine_tag: 'shown_count';\t\t\treturn: (self -> 'shown_count');\t\t/define_tag;\n\tdefine_tag: 'shown_first';\t\t\treturn: (self -> 'shown_first');\t\t/define_tag;\n\tdefine_tag: 'shown_last';\t\t\treturn: (self -> 'shown_last');\t\t\t/define_tag;\n\tdefine_tag: 'maxrecords_value';\t\treturn: (self -> 'maxrecords_value');\t/define_tag;\n\tdefine_tag: 'skiprecords_value';\treturn: (self -> 'skiprecords_value');\t/define_tag;\n\tdefine_tag: 'keyfield';\t\t\t\treturn: (self -> 'keyfield');\t\t\t/define_tag;\n\tdefine_tag: 'keyvalue';\t\t\t\treturn: (self -> 'keyvalue');\t\t\t/define_tag;\n\tdefine_tag: 'lockfield';\t\t\treturn: (self -> 'lockfield');\t\t\t/define_tag;\n\tdefine_tag: 'lockvalue';\t\t\treturn: (self -> 'lockvalue');\t\t\t/define_tag;\n\tdefine_tag: 'lockvalue_encrypted';\treturn: (self -> 'lockvalue_encrypted'); /define_tag;\n\tdefine_tag: 'querytime';\t\t\treturn: (self -> 'querytime');\t\t\t/define_tag;\n\tdefine_tag: 'inlinename';\t\t\treturn: (self -> 'inlinename');\t\t\t/define_tag;\n\tdefine_tag: 'searchparams';\t\t\treturn: (self -> 'searchparams');\t\t/define_tag;\n\tdefine_tag: 'resultset_count',\n\t\t-optional='inlinename';\n\t\t!local_defined('inlinename') ? local('inlinename'=(self -> 'inlinename'));\n\t\treturn((self -> 'resultset_count_map') -> find(#inlinename));\n\t/define_tag;\n\n\tdefine_tag('recorddata', -description='A map containing all fields, only available for single record results',\n\t\t-optional='recordindex', -copy);\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex == 1);\n\t\t\t// return default (i.e. first) record\n\t\t\treturn(self -> 'recorddata');\n\t\telse;\n\t\t\tlocal('recorddata'=map);\n\t\t\titerate(self -> field_names, local('field_name'));\n\t\t\t\t#recorddata -> insert(#field_name  =  (self -> 'records_array' -> get(#recordindex) \n\t\t\t\t\t-> get(self -> 'field_names_map' -> find(#field_name))));\n\t\t\t/iterate;\n\t\t\treturn(#recorddata);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'records_array';\t\treturn: (self -> 'records_array');\t\t/define_tag;\n\t\n\tdefine_tag('field_names', -description='Returns an array of the field names from the last database query. If no database query has been performed, a \"-show\" request is performed. \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-table (optional) Return the field names for the specified table\\n\\\n\t\t\t-types (optional flag) If specified, returns a pair array with fieldname and corresponding Lasso data type',\n\t\t-optional='table',\n\t\t-optional='types');\n\t\t!local_defined('table') ? local('table'=(self -> 'table'));\n\t\tlocal('field_names'=(self -> 'field_names'));\n\t\tif(#field_names -> size == 0 || (local_defined('types') && #types != false));\n\t\t\t#field_names=array;\n\t\t\tif(local_defined('types') && #types != false);\n\t\t\t\tlocal('types_mapping'=map('text'='string', 'number'='decimal', 'date/time'='date'));\n\t\t\t/if;\n\t\t\tinline(self->'db_connect', -table=#table, -show);\n\t\t\t\tif(local_defined('types') && #types != false);\n\t\t\t\t\tloop(field_name(-count));\n\t\t\t\t\t\t#field_names -> insert(field_name(loop_count) = #types_mapping->find(field_name(loop_count, -type)));\n\t\t\t\t\t/loop;\n\t\t\t\telse;\n\t\t\t\t\t#field_names=field_names;\n\t\t\t\t/if;\n\t\t\t/inline;\n\t\t/if;\n\t\treturn(@#field_names);\n\t/define_tag;\n\t\n\tdefine_tag('table_names', -description='Returns an array with all table names for the database');\n\t\tlocal('table_names'=array);\n\t\tinline(self -> 'db_connect');\n\t\t\tDatabase_TableNames(self -> 'database');\n\t\t\t\t#table_names -> insert(Database_TableNameItem);\n\t\t\t/Database_TableNames;\n\t\t/inline;\n\t\treturn(@#table_names);\n\t/define_tag;\n\t\n\tdefine_tag: 'error_data', -description='Returns more info for those errors that provide such';\n\t\tif: (self -> 'errors_error_data') >> (self -> error_code);\n\t\t\treturn: (self -> 'error_data');\n\t\telse;\n\t\t\treturn: map;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('size');\n\t\treturn(self -> 'shown_count');\n\t/define_tag;\n\n\tdefine_tag('get', -required='index');\n\t\treturn(knop_databaserow(\n\t\t\t-record_array=(self -> 'records_array' -> get(#index)), \n\t\t\t-field_names=(self -> 'field_names')));\n\t/define_tag;\n\n\tdefine_tag('records', -description='Returns all found records as a knop_databaserows object',\n\t\t-optional='inlinename');\n\t\t!local_defined('inlinename') ? local('inlinename'=(self -> 'inlinename'));\n\t\tif((self -> 'databaserows_map') !>> #inlinename);\n\t\t\t// create knop_databaserows on demand\n\t\t\t(self -> 'databaserows_map') -> insert(#inlinename = knop_databaserows(\n\t\t\t\t\t-records_array=(self -> 'records_array'), \n\t\t\t\t\t-field_names=(self -> 'field_names'))\n\t\t\t\t);\n\t\t/if;\n\t\treturn(@((self -> 'databaserows_map') -> find(#inlinename)));\n\t/define_tag;\n\n\tdefine_tag('field', -description='A shortcut to return a specific field from a single record result',\n\t\t-required='fieldname',\n\t\t-optional='recordindex',\n\t\t-optional='index');\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(#recordindex == 1 && #index == 1);\n\t\t\t// return first field occurrence from the default (i.e. first) record\n\t\t\treturn((self -> 'recorddata') -> find(#fieldname));\n\t\telse(self -> 'field_names_map' >> #fieldname \n\t\t\t&& #recordindex >= 1 \n\t\t\t&& #recordindex <= (self -> 'records_array') -> size);\n\t\t\t// return specific record\n\t\t\tif(#index==1);\n\t\t\t\t// return first ocurrence of field name through the index map - this is faster\n\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(self -> 'field_names_map' -> find(#fieldname)));\n\t\t\telse;\n\t\t\t\t// return another occurrence of the field - this is slightly slower\n\t\t\t\tlocal('indexmatches'=(self -> 'field_names') -> findposition(#fieldname));\n\t\t\t\tif(#index >= 1 && #index <= #indexmatches -> size);\n\t\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(#indexmatches -> get(#index)));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag('next', -description='Increments the record pointer, returns true if there are more records to show, false otherwise.\\n\\\n\t\t\tUseful as an alternative to a regular records loop:\\n\\\n\t\t\t\\t$database -> select;\\n\\\n\t\t\t\\twhile: $database -> next;\\n\\\n\t\t\t\\t\\t$database -> field(\\'name\\');\\'<br>\\';\\n\\\n\t\t\t\\t/while;');\n\t\tif((self -> 'current_record') < (self -> 'shown_count'));\n\t\t\t(self -> 'current_record') += 1;\n\t\t\treturn(true);\n\t\telse;\n\t\t\t// reset record pointer\n\t\t\t(self -> 'current_record') = 0;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('nextrecord', -description='Deprecated synonym for ->next');\n\t\t(self -> 'debug_trace') -> insert('*** DEPRECATION WARNING *** ' + tag_name + ' is deprecated, use ->next instead ');\n\t\treturn(self -> next);\n\t/define_tag;\n\n\tdefine_tag: 'trace', \n\t\t-optional='html',\n\t\t-optional='xhtml';\n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\n\t\treturn: #eol + 'Debug trace for database $' + (self -> varname) + ' (' (self -> 'database') '.' (self -> 'table') + ')' +  #eol \n\t\t\t+ (self -> 'debug_trace') -> (join: #eol) + #eol;\n\n\t/define_tag;\n\n\n\t// =========== Internal member tags ===============\n\t\n\tdefine_tag: 'reset', -description='Internal, reset all search result vars';\n\t\t// reset all search result vars\n\t\t// searchresultvars\n\t\t(self -> 'action_statement') = null;\n\t\t(self -> 'found_count') = null;\n\t\t(self -> 'shown_first') = null;\n\t\t(self -> 'shown_last') = null;\n\t\t(self -> 'shown_count') = null;\n\t\t(self -> 'field_names') = null;\n\t\t(self -> 'records_array') = null;\n\t\t(self -> 'maxrecords_value') = null;\n\t\t(self -> 'skiprecords_value') = null;\n\t\t\n\t\t(self -> 'inlinename')=string;\n\t\t(self -> 'keyvalue')=null;\n\t\t(self -> 'lockvalue')=null;\n\t\t(self -> 'lockvalue_encrypted')=null;\n\t\t(self -> 'timestampfield')=string;\n\t\t(self -> 'timestampvalue')=string;\n\t\t(self -> 'searchparams')=string;\n\t\t(self -> 'querytime')=integer;\n\t\t(self -> 'recorddata')=map;\n\t\t(self -> 'message')=string;\n\t\t(self -> 'current_record')=0;\n\t\t(self -> 'field_names_map')=map;\n\n\t\t(self -> 'error_code')=0;\n\t\t(self -> 'error_msg')=string;\n\t/define_tag;\n\n\tdefine_tag: 'capturesearchvars', -description='Internal';\n\t\t// internal member tag\n\n\t\t// capture various result variables like found_count, shown_first, shown_last, shown_count\n\t\t// searchresultvars\n\t\t(self -> 'action_statement') = action_statement;\n\t\t(self -> 'found_count') = found_count;\n\t\t(self -> 'shown_first') = shown_first;\n\t\t(self -> 'shown_last') = shown_last;\n\t\t(self -> 'shown_count') = shown_count;\n\t\t(self -> 'field_names') = field_names;\n\t\t(self -> 'records_array') = records_array;\n\t\n\t\t!((self -> 'maxrecords_value') > 0) ? (self -> 'maxrecords_value') = maxrecords_value;\n\t\t!((self -> 'skiprecords_value') > 0) ? (self -> 'skiprecords_value') = skiprecords_value;\n\n\t\tlasso_tagexists('resultset_count') ? (self -> 'resultset_count_map') -> insert((self -> 'inlinename')=resultset_count);\n\t\titerate(field_names, local('field_name'));\n\t\t\t(self -> 'field_names_map') !>> #field_name \n\t\t\t\t? (self -> 'field_names_map') -> insert(#field_name=loop_count);\n\t\t/iterate;\n\t\t\n\t\t(self -> 'error_code') = error_code;\n\t\terror_code && error_msg -> size ? (self -> 'error_msg') = error_msg;\n\t\t\n\n\t\t// handle queries that use LIMIT\n\t\tif: !(self -> 'isfilemaker') && (string_findregexp: action_statement, -find= '\\\\sLIMIT\\\\s', -ignorecase) -> size;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': old found_count, shown_first and shown_last ' + (self -> 'found_count') + ' '+ (self -> 'shown_first') + ' '+ (self -> 'shown_last'));\n\t\t\t(self -> 'found_count') = knop_foundrows;\n\t\t\t// adjust shown_first and shown_last\n\t\t\t(self -> 'shown_first') = ((self -> 'found_count') ? (self -> 'skiprecords_value') + 1 | 0);\n\t\t\t(self -> 'shown_last') = integer(math_min(((self -> 'skiprecords_value') + (self -> 'maxrecords_value')), (self -> 'found_count')));\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': new found_count, shown_first and shown_last ' + (self -> 'found_count') + ' '+ (self -> 'shown_first') + ' '+ (self -> 'shown_last'));\n\t\t/if;\n\n\t\t// capture some variables for single record results\n\t\tif: found_count <= 1  // -update gives found_count 0 but still has one record result\n\t\t\t&& error_code == 0;\n\t\t\tif((self -> 'keyfield') != '' && string(field(self -> 'keyfield')) -> size);\n\t\t\t\t(self -> 'keyvalue')=field(self -> 'keyfield');\n\t\t\telse: (self -> 'keyfield') != '' && (self -> 'keyvalue') == '' && !(self -> 'isfilemaker');\n\t\t\t\t(self -> 'keyvalue')=keyfield_value;\n\t\t\t/if;\n\t\t\tif: lasso_currentaction == 'add' || lasso_currentaction == 'update';\n\t\t\t\t(self -> 'affectedrecord_keyvalue') = (self -> 'keyvalue');\n\t\t\t/if;\n\t\t\tif: (self -> 'lockfield') != ''; \n\t\t\t\t(self -> 'lockvalue')=(field: (self -> 'lockfield'));\n\t\t\t\t(self -> 'lockvalue_encrypted')=(encrypt_blowfish: (field: (self -> 'lockfield')), -seed=(self -> 'lock_seed'));\n\t\t\t/if;\n\t\t/if;\n\t\tif: error_code == 0;\n\t\t\t// populate recorddata with field values from the first found record\n\t\t\titerate: field_names, local: 'field_name';\n\t\t\t\t(self -> 'recorddata') !>> #field_name \n\t\t\t\t\t? (self -> 'recorddata') -> (insert: #field_name  =  (field: #field_name) );\n\t\t\t/iterate;\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + error_msg);\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found_count ' + (self -> 'found_count') + ' ' + (self -> 'keyfield') + ' '+ (field: (self -> 'keyfield')) + ' keyfield_value ' + keyfield_value + ' keyvalue ' + (self -> 'keyvalue') + ' fieldcount ' + (field_name: -count));\n\n\t/define_tag;\n\n/define_type;\n\n\ndefine_type('databaserows',\n\t-namespace='knop_');\n\tlocal('version'='2009-01-08',\n\t\t'description'='Custom type to return all record rows from knop_database. Used as output for knop_database->records. ');\n/*\n\nCHANGE NOTES\n2009-01-08\tJS\t->_unknowntag: Added -index parameter\n2008-11-24\tJS\tCreated the type\n\n\n*/\n\n\tlocal('records_array'=array,\n\t\t'field_names'=array,\n\t\t'field_names_map'=map,\n\t\t'current_record'=integer);\n\t\t\n\tdefine_tag('oncreate', -description='Create a record rows object. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-records_array (array) Array of arrays with field values for all fields for each record of all found records\n\t\t\t-field_names (array) Array with all the field names',\n\t\t-required='records_array',\n\t\t-required='field_names');\n\t\tself -> 'records_array'=#records_array;\n\t\tself -> 'field_names'=#field_names;\n\t\t// store indexes to first occurrence of each field name for faster access\n\t\titerate(#field_names, local('field_name'));\n\t\t\t(self -> 'field_names_map') !>> #field_name \n\t\t\t\t? (self -> 'field_names_map') -> insert(#field_name=loop_count);\n\t\t/iterate;\n\t/define_tag;\n\t\n\tdefine_tag('_unknowntag', -description='Shortcut to field',\n\t\t-optional='index');\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names' >> tag_name);\n\t\t\treturn(self -> field(tag_name(-index=#index)));\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('onconvert', -description='Output the current record as a plain array of field values');\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex >= 1 \n\t\t\t&& #recordindex <= (self -> 'records_array' -> size));\n\t\t\treturn(self -> 'records_array' -> get(#recordindex));\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('size');\n\t\treturn(self -> 'records_array' -> size);\n\t/define_tag;\n\n\tdefine_tag('get', -required='index');\n\t\treturn(knop_databaserow(-record_array=(self -> 'records_array' -> get(#index)), -field_names=(self -> 'field_names')));\n\t/define_tag;\n\n\tdefine_tag('field', -description='Return an individual field value',\n\t\t-required='fieldname',\n\t\t-optional='recordindex',\n\t\t-optional='index');\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names_map' >> #fieldname \n\t\t\t&& #recordindex >= 1 \n\t\t\t&& #recordindex <= (self -> 'records_array') -> size);\n\t\t\t// return specific record\n\t\t\tif(#index==1);\n\t\t\t\t// return first ocurrence of field name through the index map - this is faster\n\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(self -> 'field_names_map' -> find(#fieldname)));\n\t\t\telse;\n\t\t\t\t// return another occurrence of the field - this is slightly slower\n\t\t\t\tlocal('indexmatches'=(self -> 'field_names') -> findposition(#fieldname));\n\t\t\t\tif(#index >= 1 && #index <= #indexmatches -> size);\n\t\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(#indexmatches -> get(#index)));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('summary_header', -description='Returns true if the specified field name has changed since the previous record, or if we are at the first record',\n\t\t-required='fieldname');\n\t\tlocal('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex == 1 // first record\n\t\t\t|| self -> field(#fieldname) != self -> field(#fieldname, -recordindex=(#recordindex - 1)) ); // different than previous record (look behind)\n\t\t\treturn(true);\n\t\telse;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('summary_footer', -description='Returns true if the specified field name will change in the following record, or if we are at the last record',\n\t\t-required='fieldname');\n\t\tlocal('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex == (self -> 'records_array') -> size // last record\n\t\t\t|| self -> field(#fieldname) != self -> field(#fieldname, -recordindex=(#recordindex + 1)) ); // different than next record (look ahead)\n\t\t\treturn(true);\n\t\telse;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\n\tdefine_tag('next', -description='Increments the record pointer, returns true if there are more records to show, false otherwise.');\n\t\tif((self -> 'current_record') < (self -> 'records_array') -> size);\n\t\t\t(self -> 'current_record') += 1;\n\t\t\treturn(true);\n\t\telse;\n\t\t\t// reset record pointer\n\t\t\t(self -> 'current_record') = 0;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n/define_type;\n\n\n\ndefine_type('databaserow',\n\t-namespace='knop_',\n\t//-prototype, // prototype prevents the namespace from unloading without restart\n\t);\n\tlocal: 'version'='2009-01-08',\n\t\t'description'='Custom type to return individual record rows from knop_database. Used as output for knop_database->get. ';\n/*\n\nCHANGE NOTES\n2009-01-08\tJS\t->_unknowntag: Added -index parameter\n2008-11-24\tJS\t->field: Added -index parameter to be able to access any occurrence of the same field name\n2008-05-29\tJS\tRemoved -prototype since it prevents unloading the namespace. It is recommended to turn it on for best performance\n2008-05-27\tJS\tCreated the type\n\n\n*/\n\tlocal('record_array'=array,\n\t\t'field_names'=array);\n\t\t\n\tdefine_tag('oncreate', -description='Create a record row object. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-record_array (array) Array with field values for all fields for the record\n\t\t\t-field_names (array) Array with all the field names, should be same size as -record_array',\n\t\t-required='record_array',\n\t\t-required='field_names');\n\t\tself -> 'record_array'=#record_array;\n\t\tself -> 'field_names'=#field_names;\n\t/define_tag;\n\t\n\tdefine_tag('_unknowntag', -description='Shortcut to field',\n\t\t-optional='index');\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names' >> tag_name);\n\t\t\treturn(self -> field(tag_name, -index=#index));\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('onconvert', -description='Output the record as a plain array of field values');\n\t\treturn(self -> 'record_array');\n\t/define_tag;\n\n\n\tdefine_tag('field', -description='Return an individual field value',\n\t\t-required='fieldname',\n\t\t-optional='index');\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names' >> #fieldname);\n\t\t\t// return any occurrence of the field\n\t\t\tlocal('indexmatches'=(self -> 'field_names') -> findposition(#fieldname));\n\t\t\tif(#index >= 1 && #index <= #indexmatches -> size);\n\t\t\t\treturn((self -> 'record_array') -> get(#indexmatches -> get(#index)));\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\n/define_type;\n?>\n[\n//------------------------------------------------------------------\n//    End knop_database\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_form\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'form', \n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype; \n\n\tlocal: 'version'='2011-02-28',\n\t\t'description'='Custom type to handle forms.';\n\n/*\n\nCHANGE NOTES\n2011-02-28\tJS\t->addfield: Added -template to specify field specific template \n2010-11-22\tSP\t->init: Correction of -lockvalue handling after L9 syntax adjustment\n2010-07-18\tSP\tAdded support for series for -options\n2010-06-10\tJS\t->renderform: avoid adding -upload parameters to post forms since it conflicts with file uploads (found by Steve Piercy)\n2010-04-21\tJS\t->renderhtml:  removed encode_html for label\n2010-03-06\tSP\tChanged default behavior of ->updatefields with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->updatefields with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2009-11-11\tJS\tAdded class and id to optiongroup div that surrounds for checkbox and radio\n2009-11-11\tJS\tCorrected id for checkbox and radio option labels\n2009-10-02\tJS\tAdded id for labels, auto generated from the field's id with _label appended\n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-09-04\tJS\t->renderhtml: corrected typ for autoparams\n2009-07-23\tJS\t->renderform: removed encode_html that somehow has reappeared for label. \n2009-07-10\tSP\tadded -maxlength option for text fields\n2009-06-26\tJS\t->oncreate: added deprecation warning for -action\n2009-06-22\tJS\t->addfield: corrected -options check to look for set instead of series (besides array)\n2009-04-16\tJS\t->loadfileds can now load field values from -params also inside an inline\n2009-03-20\tJS\tAdded  <![CDATA[ ... ]]>  around injected scripts for better xhtml compliance\n2009-01-08\tJS\t->getvalue and _unknowntag: added -index parameter to be able to get value for a specific field instance when there are multiple fields with the same name \n2009-01-08\tJS\t->loadfields: implemented support for multiple fields with the same name when loading field values from form submission where the number of same name fields matches\n2009-01-07\tJS\t->setvalue: added -index parameter to be able to set value for a specific field instance when there are multiple fields with the same name \n2008-12-08\tJS\t->renderform: Removed the onclick handlers for checkbox and radio since Safari now supports clicking the label text as click for the checkbox/radio control. \n2008-12-05\tJS\t->renderform: the fieldset and legend field types will now use id and class on the fieldset tag if specified\n2008-12-03\tJS\t->renderform: fields of type fieldset now uses value as legend (just as field type legend already did) instead of always using an empty legend\n2008-09-24\tJS\t->updatefields: Added protection against backtick sql injection in MySQL object names\n2008-09-17\tJS\t->renderform and ->renderhtml: -from and -to allows negative numbers to count from end of form instead\n2008-09-13\tJS\tAdded ->getlabel to return the display name for a field. \n2008-09-13\tJS\t->addfield and ->validate: Implemented -validate to specify a compound expression to validate the field input. \n2008-09-13\tJS\t->addfield and ->loadfields: Implemented -filter to specify a compound expression to filter the field input. \n2008-09-11\tJS\t->updatefields: fixed exclusion of special field types html, legend and fieldset. \n2008-09-11\tJS\t->renderform: Fixed missing value for password fields\n2008-07-02\tJS\t->renderform: Cleaned up the automatic adding of javascript code so it's not added if not needed. Also moved all scripts to the end of the page. More work with with the javascripts is needed.\n2008-06-03\tJS\t->renderform: corrected missing closing </fieldset>\n2008-05-15\tJS\t->renderform and ->renderhtml: adjusted the behavior for nested fieldsets\n2008-05-13\tJS\tImplemented -legend for ->renderhtml, to make it consistent with the new legend field type\n2008-05-13\tJS\tImplemented special field types html, fieldset and legend. Use -value to display data for these fields. A legend field also creates a fieldset (closes any previously open fieldsets). Use fieldset with -value=false to close a fieldset without opening a new one. \n2008-05-06\tJS\tAdded unknowntag as shortcut to getvalue\n2008-01-30\tJS\tRemoved duplicate endscript entries for if(dirty) {makedirty()};\n2007-12-13\tJS\tCorrected ->addfield: -dbfield so empty dbfields are properly ignored by ->updatefields. \n2007-12-11\tJS\tMoved error_msg to knop_base (special version of error_code stays here) \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-11-13\tJS\tAdded -buttontemplate to be able to specify separate template for buttons, defaults to no <br>, but if template has been specified that will be used instead (for backwards compatibility)\n2007-11-12\tJS\t->process delete now works also when not using record locking (not specifying -user)\n2007-11-01\tJS\t->renderform: added support for -hint for textarea fields.\n2007-09-27\tJS\t->renderhtml: multiple values (array) for radio, checkbox and select are now rendered properly with either \",\" or <br> depending on the presence of -linebreak, and with the display text instead of the actual option value\n2007-09-27\tJS\t->renderform: improved handling of multiple values for checkbox, radio and select\n2007-09-21\tJS\t->addfield: flag parameters now accept false as value\n2007-09-06\tJS\t->oncreate: changed name of -action to -formaction to make it more clear what it is. -action is still supported but deprecated.\n2007-09-06\tJS\t->renderform: Corrected the exception for -session... (duh)\n2007-08-08\tJS\t->renderform: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-12\tJC\tbugfixed -xhtml form rendering when called by quicksearch\n2007-06-11\tJC\tadded handling of xhtml output\n2007-04-19\tJS\t->loadfields: fixed -params that was broken when adding -database\n2007-04-19\tJS\t->renderform: removed invalid wrap=\"soft\" from textarea\n2007-04-12\tJS\t->process: made -user optional (only needed when using record locking)\n2007-04-12\tJS ->loadfields can now take a -database parameter, either as a flag (no value) where the database object connected to the form will be used, or by specifying a database object as value. \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\t->renderform fixed unsavedwarning on page load by moving checkdirty() to afterscript\n2007-03-01\tJS\t->formmode and ->init changed so it preserves the right mode after a failed add\n2007-02-27\tJS\t->renderform: added <div class=\"inputgroup\"> around checkboxes and radios for css formating\n2007-02-26\tJS\t->oncreate: added -actionpath to specify the framework action path for the form instead of manually adding the -action hidden field\n2007-02-24\tJS\tCorrected entersubmitblock behavior by adding onfocus handler on form and starting with submitBlock=false\n2007-02-23\tJS\tRemoved encode_html from form field labels\n2007-02-22\tJS\t->setformat: Added -legend\n2007-02-07\tJS\tAdded ->copyfield to copy a form field to a new name, with the same properties. \n2007-02-07\tJS\t->errors now returns empty array if validate has not been called, instead of performing validation\n2007-02-05\tJS\t->getbutton can now look for also button names that are not one of the built-in ones (for example button_apply)\n2007-02-05\tJS The -keyvalue parameter can be given another name by specifying -keyparamname in oncreate\n2007-02-02\tJS\tAdded ->lockvalue_decrypted\n2007-02-02\tJS\t->addfield: -value is now stored as reference\n2007-02-02\tJS\terror_code now returns an error for when the form contains validation errors\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-02-02\tJS \tAdded real error codes\n2007-01-31\tJS\t->rederform action_params now also exclude \"-\" params that appear in the form action\n2007-01-29\tJS\t->renderform: The first field with input error will get focus when loading page\n2007-01-29\tJS\tAdded -focus to ->addfield to give default field focus when loading page with form\n2007-01-29\tJS\tAdded -disabled to ->addfield, and handling of it in ->renderform\n2007-01-29\tJS\tAdded -noautoparams to ->oncreate to disable the automatic passing of action_params that begin with \"-\"\n2007-01-29\tJS\t->renderform now renders label also for submit, reset to format properly with css\n2007-01-26\tJS\tAdded support for Safari specific <input type=\"search\">\n2007-01-26\tJS\t->renderform action_params that begin with \"-\" now exclude params that exist in the form. Minor corrections to the behavior. \n2007-01-25\tJS\tAdded -nowarning to ->oncreate to disable unsaved warnings for the entire form\n2007-01-25\tJS\tAdded -required to ->oncreate (and a few more from ->setformat)\n2007-01-23\tJS\tAutogenerates id for the form itself\n2007-01-23\tJS\tAdded ->getbutton to return the button that was clicked when submitting a form (cancel, add, save, delete)\n2007-01-23\tJS\tAdded auto conversion of options left hand pair member to string, to make comparsions work reliably. Integer zeros don't compare nicely to strings. \n2007-01-23\tJS\tAdded support for submit-on-enter prevention: specify -entersubmitblock at oncreate\n2007-01-19\tJS\tAddes renderform: -legend to be able to group form fields at render time\n2007-01-19\tJS\tadded support for -optgroup in -options for select. Also works for radio and checkbox. Specify empty -optgroup to close optgroup in select without starting a new, or to add extra linebreak between checkboxes/radio buttons. \n2007-01-19\tJS\tadded -template for oncreate\n2007-01-19\tJS\tadded optional fieldset and legend to form, legend can be specified as -legend at oncreate. if -legend is specified, the form will be wrapped in a fieldset. \n2007-01-19\tJS\tmethod now defaults to post\n2007-01-19\tJS\tCorrected line separator for FileMaker checkboxes and added the same handling also for radio\n2007-01-18\tJS\trenderform: any action_params that begin with \"-\" (except -keyvalue and -lockvalue) are added as form parameters\n2007-01-18\tJS\trenderform: checkboxes and multiselects now show checked and selected properly when loading values from database\n2007-01-18\tJS\tupdatefields: added support for multiple values for one fieldname, like checkboxes (multiple fields in the update pair array, -sql generates comma separated values)\n2007-01-17\tJS\treset button now makes form undirty\n2007-01-17\tJS\taddfield: -confirmmessage can now be specified for any submit or reset button\n2007-01-17\tJS\tadded addfield: -nowarning to avoid unsaved warning when the field is changed\n2007-01-17\tJS\tchanged default class name for unsaved marker from dirty to unsaved\n2007-01-17\tJS\tchanged name of -dirtymarker and -dirtymarkerclass to unsavedmarker and -unsavedmarkerclass for userfriendlyness\n2007-01-17\tJS\tadded setformat: -unsavedwarning to dynamically set the javascript form dirty warning message\n2007-01-17\tJS\trenderform: -field changed to renderform: -name for consistency\n2007-01-16\tJS\trenderform: -field with wrong field name does not output anything, instead of the entire form\n2007-01-16\tJS\tfixed onbeforeunload in javascript form dirty handler\n\nTODO:\n->addfield: Add -format to manipulate the field value before it is displayed by ->renderform and ->renderhtml, much like -filter but only for display and without affecting input. \n->addfield: Add -fieldgroup to be able to group related fields together, useful for ->updatefields to return just fields that belong to a specific db table, or ->renderform as another way to render a form selectively\n->renderform needs a better way to display errors inline together with the fields\nMake _unknowntag also work as shortcut to setvalue if a value is specified\nAdd a new special field type to the form object, let's say \"data\". That field type will not interact with forms and will never be touched by loadfields, but it will populate ->updatefields.\nAdd -> searchfields, which will return a fulltext enabled pair array better suited for searchs than ->updatefields is. -fulltext needs to be specified per field. \nReview and clean up the javascripts inserted automatically by knop_form - partially done\nOption to let textarea grow automatically depending on the amount of text in it.  \nUse http://bassistance.de/jquery-plugins/jquery-plugin-validation/ instead of client side validation\nPossibly add support for the same validation expressions as the jquery validation plugin uses, so server side a nd client side validation can be specified at once. \nAdd -path as parameter for oncreate so the form action can be set with less confusion...  In that case -formaction will be a physical url, while -path would be a framework path. \nFix actionpath reference so it updates properly when altering the value (not possible?)\nShould loadfields load \"-\" params?\nUnsavedwarning made optional, does not seem to work properly now?\nMore flexible error hightlighting\nMove templates to a member tag to be make it easier to subclass (Douglas Burchard)\nAdd \"button\". <button></button>. Subtypes are submit, reset and button. How to specify the subtype? (Douglas Burchard)\nChange ->addfield to ->insert and make ->addfield deprecated\nThere is no src for input type image!\nAdd ->size and ->get so the form object can be iterated\nAdd -skipemtpy to to ->renderhtml\nOption for -> renderhtml to output without html encoding\n->renderhtml should never html encode fields of type html\n\n*/\n\t\n\n\t// instance variables\n\tlocal: 'fields'=array,\n\t\t'template'=string,\t\t\t// html template used to render the html form fields\n\t\t'buttontemplate'=string,\t// html template used to render the html buttons (submit, reset, image)\n\t\t'class'=string,\t\t\t\t// default class for all form fields, can be overridden field by field\n\t\t'errorclass'=string,\t\t// class used to highlight field labels when validation fails\n\t\t'formaction'=null,\n\t\t'method'='post',\n\t\t'fieldset'=false,\t\t\t// html form fieldset\n\t\t'legend'=null,\t\t\t\t// html form legend\n\t\t'name'=null,\n\t\t'id'=null,\n\t\t'raw'=null,\n\t\t'enctype'=null,\t\t\t\t// is automatically set to multipart/formdata if the form contains a file input\n\t\t'actionpath'=null,\n\t\t'noautoparams'=false,\t\t// if true then no parameters that begin with - will be automatically added to the form\n\t\t'fieldsource'=null,\t\t\t// the source of the latest -> loadfields, can be database, form or params\n\t\t'required'=string,\t\t\t// marker used to show fields that are required (html or plain string)\n\t\t'entersubmitblock'=false,\t// if true, a javascript will prevent form submit without clicking on submit button (like pressing enter key)\n\t\t'unsavedmarker'=null,\n\t\t'unsavedmarkerclass'=null,\n\t\t'unsavedwarning'=string,\t// must be specified, or else there is no unsaved warning for the form\n\t\t'database'=null,\n\t\t'keyparamname'=string,\t\t// param name to use instead of the default -keyvalue\n\t\t'formmode'=null,\t\t\t// whether the form is for editing an existing record or a blank for for adding a new record (edit/add)\n\t\t\t\t\t\t\t\t\t// only valid if a database object is specified\n\t\t'formbutton'=null,\t\t\t// the button that was clicked when submitting a form (cancel, add, save, delete)\n\t\t'db_keyvalue'=null,\n\t\t'db_lockvalue'=null,\n\t\t\n\t\t'render_fieldset_open'=false,\t// used when rendering to keep track of if a fieldset from fieldset or legend field types is open so it can be closed properly\n\t\t'render_fieldset2_open'=false,\t// used when rendering to keep track of if a fieldset from renderform or renderhtml legend is open so it can be closed properly\n\t\t'noscript'=false,\t\t\t\t// when set to true, no scripts will be injected by renderform\n\t\t'error_lang'=(knop_lang: -default='en', -fallback);\n\t\n\tlocal: 'errors'=null;\n\n\n\t// config vars\n\tlocal: 'validfieldtypes' = (map: 'text', 'password', 'checkbox', 'radio', 'textarea', 'select', 'file', 'search',\n\t\t\t\t'submit', 'reset', 'image', 'hidden', \n\t\t\t\t'fieldset', 'legend', 'html'), // special types\n\t\t'exceptionfieldtypes' = (map: 'file', 'submit', 'reset', 'image', 'addbutton', 'savebutton', 'deletebutton', 'cancelbutton',\n\t\t\t\t'fieldset', 'legend', 'html'); // special types\n\tlocal: 'validfieldtypes_array'=array;\n\titerate: #validfieldtypes, (local: 'temp');\n\t\t#validfieldtypes_array -> (insert: #temp -> name);\n\t/iterate;\n\tlocal: 'exceptionfieldtypes_array'=array;\n\titerate: #exceptionfieldtypes, (local: 'temp');\n\t\t#exceptionfieldtypes_array -> (insert: #temp -> name);\n\t/iterate;\n\t\n\t// page var to keep track of the number of forms that have been rendered on a page\n\tif: !(var_defined: 'knop_form_renderform_counter');\n\t\tvar: 'knop_form_renderform_counter'=0;\n\t/if;\n\t\n\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-formaction (optional) The action atribute in the form html tag\\n\\\n\t\t\t-action (optional) Deprecated synonym to -formaction\\n\\\n\t\t\t-method (optional) Defaults to post\\n\\\n\t\t\t-name (optional)\\n\\\n\t\t\t-id (optional)\\n\\\n\t\t\t-raw (optional) Anything in this parameter will be put in the opening form tag\\n\\\n\t\t\t-actionpath (optional) Knop action path\\n\\\n\t\t\t-fieldset (optional)\\n\\\n\t\t\t-legend (optional string) legend for the entire form - if specified, a fieldset will also be wrapped around the form\\n\\\n\t\t\t-entersubmitblock (optional)\\n\\\n\t\t\t-noautoparams (optional)\\n\\\n\t\t\t-template (optional string) html template, defaults to #label# #field##required#<br>\\n\\\n\t\t\t-buttontemplate (optional string) html template for buttons, defaults to #field# but uses -template if specified\\n\\\n\t\t\t-required (optional string) character(s) to display for required fields (used for #required#), defaults to *\\n\\\n\t\t\t-class (optional string) css class name that will be used for the form element, default none\\n\\\n\t\t\t-errorclass (optional string) css class name that will be used for the label to highlight input errors, if not defined style=\"color: red\" will be used\\n\\\n\t\t\t-unsavedmarker (optional string) id for html element that should be used to indicate when the form becomes dirty. \\n\\\n\t\t\t-unsavedmarkerclass (optional string) class name to use for the html element. Defaults to \"unsaved\". \\n\\\n\t\t\t-unsavedwarning (optional string)\\n\\\n\t\t\t-keyparamname (optional)\\n\\\n\t\t\t-noscript (optional flag) if specified, don\\'t inject any javascript in the form. This will disable all client side functionality such as hints, focus and unsaved warnings. \\n\\\n\t\t\t-database (optional database) Optional database object that the form object will interact with',\n\t\t// parameters for form html tag attributes\n\t\t-optional='formaction',\n\t\t-optional='action',\n\t\t-optional='method',\n\t\t-optional='name',\n\t\t-optional='id',\n\t\t-optional='raw',\n\n\t\t// knop parameters\n\t\t-optional='actionpath',\n\t\t-optional='fieldset',\n\t\t-optional='legend', \n\t\t-optional='entersubmitblock',\n\t\t-optional='noautoparams',\n\t\t-optional='template', -type='string',\n\t\t-optional='buttontemplate', -type='string',\n\t\t-optional='required', -type='string',\n\t\t-optional='class', -type='string',\n\t\t-optional='errorclass', -type='string',\n\t\t-optional='unsavedmarker', -type='string',\n\t\t-optional='unsavedmarkerclass', -type='string',\n\t\t-optional='unsavedwarning', -type='string',\n\t\t-optional='keyparamname',\n\t\t-optional='noscript',\n\t\t-optional='database', -type='database';\n\t\tlocal: 'timer'=knop_timer; \n\n\n\t\tlocal_defined('method') ? (self -> 'method') = #method;\n\t\tlocal_defined('name') ? (self -> 'name') = #name;\n\t\tlocal_defined('id') ? (self -> 'id') = #id;\n\t\tlocal_defined('raw') ? (self -> 'raw') = #raw;\n\t\tlocal_defined('legend') ? (self -> 'legend') = #legend;\n\t\tlocal_defined('template') ? (self -> 'template') = #template;\n\t\tlocal_defined('buttontemplate') ? (self -> 'buttontemplate') = #buttontemplate;\n\t\tlocal_defined('required') ? (self -> 'required') = #required;\n\t\tlocal_defined('class') ? (self -> 'class') = #class;\n\t\tlocal_defined('errorclass') ? (self -> 'errorclass') = #errorclass;\n\t\tlocal_defined('unsavedmarker') ? (self -> 'unsavedmarker') = #unsavedmarker;\n\t\tlocal_defined('unsavedmarkerclass') ? (self -> 'unsavedmarkerclass') = #unsavedmarkerclass;\n\t\tlocal_defined('unsavedwarning') ? (self -> 'unsavedwarning') = #unsavedwarning;\n\t\tlocal_defined('keyparamname') ? (self -> 'keyparamname') = #keyparamname;\n\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('formaction') ? (self -> 'formaction') = @#formaction;\n\t\tlocal_defined('actionpath') ? (self -> 'actionpath') = @#actionpath;\n\t\tlocal_defined('database') ? (self -> 'database') = @#database;\n\n\t\tif: !(local_defined: 'formaction') && (local_defined: 'action');\n\t\t\t// keep support for old -action insead of -formaction\n\t\t\t(self -> 'debug_trace') -> insert('*** DEPRECATION WARNING *** ' + tag_name + ' -action parameter is deprecated, use -formaction instead ');\n\t\t\t(self -> 'formaction') = @#action;\n\t\t/if;\n\t\t\n\t\t(self -> 'noscript') = (local_defined('noscript') && #noscript != false);\n\n\t\t// default value\n\t\t!(local_defined: 'required') ? (self -> 'required' = '*');\n\t\t!(local_defined: 'keyparamname') ? (self -> 'keyparamname' = '-keyvalue');\n\n\t\t(self -> 'fieldset') = ((local_defined: 'fieldset') && #fieldset != false) || (self -> 'legend') != '';\n\t\t(self -> 'entersubmitblock') = (local_defined: 'entersubmitblock');\n\t\t(self -> 'noautoparams') = (local_defined: 'noautoparams');\n\n\n\t\tif: (self -> 'unsavedmarker') != '' && (self -> 'unsavedmarkerclass') == '';\n\t\t\t// set default unsavedmarkerclass\n\t\t\t(self -> 'unsavedmarkerclass')='unsaved';\n\t\t/if;\n\n\t\tif: (self -> 'unsavedwarning') == '';\n\t\t\t// set default dirtywarning message\n\t\t\t//(self -> 'unsavedwarning')='Det finns ändringar som inte har sparats - vill du fortsätta utan att spara?';\n\t\t/if;\n\t\t\n\t\t// escape quotes for javascript\n\t\t(self -> 'unsavedwarning') -> (replace: '\\'', '\\\\\\'');\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\t/*\n\tdefine_tag: 'onassign', -description='Internal, needed to restore references when ctype is defined as prototype',\n\t\t-required='value'; \n\t\t// recreate references here\n\n\t\titerate: (array: \n\t\t\t'formaction',\n\t\t\t'actionpath',\n\t\t\t'database'), (local: 'param');\n\t\t\t(self -> #param) = @(#value -> #param);\n\t\t/iterate;\n\n\t/define_tag;\n\t*/\n\t\n\tdefine_tag: 'onconvert', -description='Outputs the form data in very basic form, just to see what it contains',\n\t\t-optional='xhtml';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\tlocal: 'output'=string;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t#output += #fieldpair -> name + ' = ' + #fieldpair -> value + '    <br' + #endslash + '>\\n';\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t/define_tag;\n\t\n\tdefine_tag: '_unknowntag', -description='Shortcut to getvalue',\n\t\t-optional='index', -type='integer', -copy;\n\t\t!local_defined('index') ? local('index') = 1;\n\t\tif: (self -> 'fields') >> tag_name; // should be (self -> keys) but this is faster\n\t\t\treturn: (self -> (getvalue: tag_name, -index=#index));\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t\t(self -> '_debug_trace') -> insert(self -> type + '->' + tag_name + ' not known.');\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag: 'addfield', -description='Inserts a form element in the form. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-type (required) Supported types are listed in form -> \\'validfieldtypes_array\\'. Also custom field types addbuton, savebutton or deletebutton are supported (translated to submit buttons with predefined names). \\\n\t\t\tFor the field types html, fieldset and legend use -value to specify the data to display for these fields. A legend field automatically creates a fieldset (closes any previously open fieldsets). Use fieldset with -value=false to close a fieldset without opening a new one. \\n\\\n\t\t\t-name (optional) Required for all input types except addbuton, savebutton, deletebutton, fieldset, legend and html\\n\\\n\t\t\t-id (optional) id for the html object, will be autogenerated if not specified\\n\\\n\t\t\t-dbfield (optional) Corresponding database field name (name is used if dbfield is not specified), or null/emtpy string if ignore this field for database\\n\\\n\t\t\t-value (optional) Initial value for the field\\n\\\n\t\t\t-hint (optional) Optional gray hint text to show in empty text field\\n\\\n            -options (optional) For select, checkbox and radio, must be array, set or series. For select, the array can contain -optgroup=label to create an optiongroup. \\n\\ \n\t\t\t-multiple (optional flag) Used for select\\n\\\n\t\t\t-linebreak (optional flag) Put linebreaks between checkbox and radio values\\n\\\n\t\t\t-default (optional) Default text to display in a popup menu, will be selected (with empty value) if no current value is set. Is followed by an empty option. \\n\\\n\t\t\t-label (optional) Text label for the field\\n\\\n\t\t\t-size (optional) Used for text and select\\n\\\n\t\t\t-maxlength (optional) Used for text\\n\\\n\t\t\t-rows (optional) Used for textarea\\n\\\n\t\t\t-cols (optional) Used for textarea\\n\\\n\t\t\t-focus (optional flag) The first text field with this parameter specified will get focus when page loads\\n\\\n\t\t\t-class (optional)\\n\\\n\t\t\t-disabled (optional flag) The form field will be rendered as disabled\\n\\\n\t\t\t-raw (optional) Raw attributes that will be put in the html tag\\n\\\n\t\t\t-confirmmessage (optional) Message to show in submit/reset confirm dialog (delete button always shows confirm dialog)\\n\\\n\t\t\t-required (optional flag) If specified then the field must not be empty (very basic validation)\\n\\\n\t\t\t-validate (optional) Compound expression to validate the field input. The input can be accessed as params inside the expression which should either return true for valid input or false for invalid, or return 0 for valid input or a non-zero error code or error message string for invalid input. \\n\\\n\t\t\t-filter (optional) Compound expression to filter the input before it is loaded into the form by ->loadfields. The field value can be accessed as params inside the expression which should return the filtered field value. -filter is applied before validation. \\n\\\n\t\t\t-nowarning (optional flag) If specified then changing the field will not trigger an unsaved warning\\n\\\n\t\t\t-after (optional) Numeric index or name of field to insert after\\n\\\n\t\t\t-template (optional) Format string that will override global template or buttontemplate',\n\t\t-required='type',\n\t\t-optional='name',\n\t\t-optional='id',\t\n\t\t-optional='dbfield',\n\t\t-optional='value',\n\t\t-optional='hint',\n\t\t-optional='options',\n\t\t-optional='multiple',\n\t\t-optional='linebreak',\n\t\t-optional='default',\n\t\t-optional='label',\n\t\t-optional='size',\n\t\t-optional='maxlength',\n\t\t-optional='rows',\n\t\t-optional='cols',\n\t\t-optional='focus',\n\t\t-optional='class',\n\t\t-optional='disabled',\n\t\t-optional='raw',\n\t\t-optional='confirmmessage',\n\t\t-optional='required',\n\t\t-optional='validate', -type='tag',\n\t\t-optional='filter', -type='tag',\n\t\t-optional='nowarning',\n\t\t-optional='after',\n\t\t-optional='template';\n\t\t// TODO: add optiontemplate to be able to format individual options\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: '_type'=(local: 'type'), '_name'=(local: 'name'), 'originaltype'=(local: 'type');\n\t\tif: (map: 'addbutton', 'savebutton', 'deletebutton', 'cancelbutton') >> #_type;\n\t\t\t#originaltype = #_type;\n\t\t\t#_name = 'button_' + #_type;\n\t\t\t#_name -> (removetrailing: 'button');\n\t\t\t#_type = 'submit';\n\t\telse: #_type == 'reset' && (local: 'name') == '';\n\t\t\t#_name = 'button_' + #_type;\n\t\telse: (map: 'legend', 'fieldset', 'html') >> #_type && (local: 'name') == '';\n\t\t\t#_name = #_type;\n\t\telse;\n\t\t\tfail_if: (local: 'name') == '', -9956, 'form->addfield missing required parameter -name';\n\t\t/if;\n\t\t\n\t\t\n\t\tfail_if: !((self -> 'validfieldtypes') >> #_type), 7102, self -> error_msg(7202);\n\t\tfail_if: (map: 'select', 'radio', 'checkbox') >> #_type \n\t\t\t&& (local: 'options') -> type != 'array' \n\t\t\t&& (local: 'options') -> type != 'set' \n\t\t\t&& (local: 'options') -> type != 'series', \n\t\t\t-9956, 'Field type ' #_type ' requires -options array, set or series'; \n\t\tlocal: 'index'= (self -> 'fields') -> size + 1;\n\t\t(local_defined: 'after') \t? (#after -> type == 'string' && (self -> 'fields') >> #after \n\t\t\t\t\t\t\t\t\t\t? #index = (integer: ((self -> 'fields') -> (findindex: #after) -> first)) + 1\n\t\t\t\t\t\t\t\t\t\t| #after -> type == 'integer' ? #index= #after + 1);\n\t\tif: #_type == 'file';\n\t\t\t(self -> 'enctype') ='multipart/form-data';\n\t\t\t(self -> 'method') = 'post';\n\t\t/if;\n\t\tlocal: 'field'=(map: \n\t\t\t'required'=(local_defined: 'required') \t\t&& #required != false,\n\t\t\t'multiple'=(local_defined: 'multiple') \t\t&& #multiple != false,\n\t\t\t'linebreak'=(local_defined: 'linebreak') \t&& #linebreak != false,\n\t\t\t'focus'=(local_defined: 'focus') \t\t\t&& #focus != false,\n\t\t\t'nowarning'=(local_defined: 'nowarning') \t&& #nowarning != false,\n\t\t\t'disabled'=(local_defined: 'disabled') \t\t&& #disabled != false\n\t\t\t);\n\t\tif: (self -> 'exceptionfieldtypes') >> #_type;\n\t\t\t// || (map: 'legend', 'fieldset', 'html') >> #_type;\n\t\t\t// never make certain field types required\n\t\t\t#field -> insert('required'=false);\n\t\t/if;\n\n\t\t#field -> (insert: 'type'=#_type);\n\t\t#field -> (insert: 'name'=#_name);\n\n\t\tlocal_defined('id') ? #field -> insert('id' = #id);\n\t\tlocal_defined('hint') ? #field -> insert('hint' = #hint);\n\t\tlocal_defined('default') ? #field -> insert('default' = #default); \n\t\tlocal_defined('label') ? #field -> insert('label' = #label); \n\t\tlocal_defined('size') ? #field -> insert('size' = #size); \n\t\tlocal_defined('maxlength') ? #field -> insert('maxlength' = #maxlength); \n\t\tlocal_defined('rows') ? #field -> insert('rows' = #rows); \n\t\tlocal_defined('cols') ? #field -> insert('cols' = #cols); \n\t\tlocal_defined('class') ? #field -> insert('class' = #class); \n\t\tlocal_defined('raw') ? #field -> insert('raw' = #raw); \n\t\tlocal_defined('confirmmessage') ? #field -> insert('confirmmessage' = #confirmmessage);\n\t\tlocal_defined('originaltype') ? #field -> insert('originaltype' = #originaltype);\n\t\t(local_defined: 'template') ? #field -> (insert: 'template'=#template);\n\n\t\t#field -> (insert: 'dbfield'=( (local_defined: 'dbfield') ? #dbfield | #_name ) );\n\t\t(local_defined: 'value') ? #field -> (insert: 'defaultvalue'=#value);\n\t\t\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('options') ? #field -> insert('options' = @#options);\n\t\tlocal_defined('value') ? #field -> insert('value' = @#value);\n\t\tlocal_defined('validate') ? #field -> insert('validate' = @#validate);\n\t\tlocal_defined('filter') ? #field -> insert('filter' = @#filter);\n\t\t\n\t\t(self -> 'fields') -> (insert: #_name = @#field, #index);\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'copyfield', -description='Copies a form field to a new name.',\n\t\t-required='name',\n\t\t-required='newname';\n\t\tlocal: 'timer'=knop_timer; \n\t\tfail_if: #name == #newname, 7104, self -> error_msg(7104);\n\t\tif: (self -> 'fields') >> #name;\n\t\t\tlocal: 'copyfield'=(self -> 'fields') -> (find: #name) -> first -> value;\n\t\t\t#copyfield -> (insert: 'name' = #newname);\n\t\t\t(self -> 'fields') -> (insert: #newname = #copyfield);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'init', -description='Initiates form to grab keyvalue and set formmode if we have a database connected to the form. \\\n\t\t\tDoes nothing if no database is specified. ',\n\t\t-optional='get',\n\t\t-optional='post',\n\t\t-optional='keyvalue';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// Initiates form to grab keyvalue and set formmode if we have a database connected to the form. \n\t\t// TODO: should we run init if form is not valid? Now we have a condition in lib before running init. \n\t\t// TODO: how can we get the right formmode when showing an add form again after failed validation? Now we have an extra condition in lib for this\n\t\t\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t(self -> 'db_keyvalue') = null;\n\t\t\t(self -> 'db_lockvalue') = null;\n\t\t\tlocal: '_params'=array,\n\t\t\t\t'source'='form',\n\t\t\t\t'field'=map;\n\t\t\t#_params = array;\n\t\t\tif: (local_defined: 'post');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t/if;\n\t\t\tif: (local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t\tif: !(local_defined: 'post') && !(local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: 'Init ');\n\t\t\n\t\t\tif: #_params >> '-lockvalue';\n\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) ) != '' \n\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) ) | null);\n\t\t\t\telse;\n\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) -> first -> value) != '' \n\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) -> first -> value) | null);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing lockvalue from form ' + (self -> 'db_lockvalue'));\n\t\t\telse: (local_defined: 'keyvalue');\n\t\t\t\t(self -> 'db_keyvalue') = #keyvalue;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from parameter ' + (self -> 'db_keyvalue'));\n\t\t\telse: #_params >> (self -> 'keyparamname');\n\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) ) != '' \n\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) ) | null);\n\t\t\t\telse;\n\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) -> first -> value) != '' \n\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) -> first -> value) | null);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from form ' + (self -> 'db_keyvalue'));\n\t\t\t/if;\n\t\t\tif: (self -> 'db_lockvalue') == '' && (self -> 'db_keyvalue') == '';\n\t\t\t\t// we have no keyvalue or lockvalue - this must be an add operation\n\t\t\t\t(self -> 'formmode') = 'add';\n\t\t\t\t// create a keyvalue for the record to add\n\t\t\t\t(self -> 'db_keyvalue') = knop_unique;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': generating keyvalue ' + (self -> 'db_keyvalue'));\n\t\t\telse: (self -> getbutton) == 'add';\n\t\t\t\t(self -> 'formmode') = 'add';\n\t\t\telse: (self -> formmode)=='';\n\t\t\t\t(self -> 'formmode') = 'edit';\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': formmode ' + (self -> formmode));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'loadfields', -description='Overwrites all field values with values from either database, action_params or explicit -params. \\\n\t\t\t\tAuto-detects based on current lasso_currentaction.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t\t-params (optional) Array or map to take field values from instead of database or submit (using dbnames)\\n\\\n\t\t\t\t-get (optional flag) Only getparams will be used\\n\\\n\t\t\t\t-post (optional flag) Only postparams will be used\\n\\\n\t\t\t\t-inlinename (optional) The first record in the result from the specified inline will be used as field values\\n\\ \n\t\t\t\t-database (optional) If a database object is specified, the first record from the latest search result of the database object will be used. \\\n\t\t\t\t\tIf -database is specified as flag (no value) and the form object has a database object attached to it, that database object will be used.',\n\t\t-optional='params',\n\t\t-optional='post',\n\t\t-optional='get',\n\t\t-optional='inlinename',\n\t\t-optional='database';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: '_params'=array,\n\t\t\t'source'='form',\n\t\t\t'field'=map;\n\t\t(self -> 'fieldsource') = null;\n\t\tif: (local_defined: 'params');\n\t\t\t(self -> 'fieldsource') = 'params';\n\t\t\tlocal: 'source'='params';\n\t\t\t#_params = #params;\n\t\telse: (local_defined: 'database') && !(local_defined: 'inlinename');\n\t\t\tif: #database -> type == 'database';\n\t\t\t\tlocal: 'inlinename'=#database -> inlinename;\n\t\t\telse: self -> 'database' -> type == 'database';\n\t\t\t\tlocal: 'inlinename'=self -> 'database' -> inlinename;\n\t\t\t/if;\n\t\t/if;\n\t\t\t\n\t\tif: (local_defined: 'inlinename');\n\t\t\t(self -> 'fieldsource') = 'database';\n\t\t\tlocal: 'source'='params';\n\t\t\t#_params=map;\n\t\t\trecords: -inlinename=#inlinename;\n\t\t\t\tloop: (field_name: -count);\n\t\t\t\t\t#_params -> (insert: (field_name: loop_count)  =  (field: (field_name: loop_count)) );\n\t\t\t\t/loop;\n\t\t\t\tloop_abort;\n\t\t\t/records;\n\t\telse: (self -> 'fieldsource') == null && lasso_currentaction != 'nothing';\n\t\t\t(self -> 'fieldsource') = 'database';\n\t\t\tlocal: 'source'='database';\n\t\telse: (self -> 'fieldsource') == null;\n\t\t\t(self -> 'fieldsource') = 'form';\n\t\t\t#_params = array;\n\t\t\tif: (local_defined: 'post');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t/if;\n\t\t\tif: (local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t\tif: !(local_defined: 'post') && !(local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': loading field values from ' + (self -> 'fieldsource'));\n\t\tlocal('fieldnames_done'=map, 'fields_samename'=array, 'params_fieldname'=array);\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t//#field = @(#fieldpair -> value);\n\t\t\tif: (self -> 'exceptionfieldtypes') !>> #fieldpair -> value -> (find: 'type') // do not load data for excluded form fields (maybe it should do that in some cases???)\n\t\t\t\t// && (map: 'legend', 'fieldset', 'html') !>> #fieldpair -> value -> (find: 'type')\n\t\t\t\t&& !(#fieldpair -> name -> (beginswith: '-')); // exclude field names that begin with \"-\"\n\t\t\t\tif(#fieldnames_done !>> #fieldpair -> name); // check if we are already done with this field name (for multiple fields with the same name)\n\t\t\t\t\t// find all fields with the same name\n\t\t\t\t\t#fields_samename = @((self -> 'fields') -> find(#fieldpair -> name));\n\t\t\t\t\t#params_fieldname = @(#_params -> find(#fieldpair -> name));\n\t\t\t\t\tif: #source == 'database' && found_count > 0;\n\t\t\t\t\t\t// load field values from database\n\t\t\t\t\t\tif: (#fieldpair -> value -> find: 'dbfield') != '';\n\t\t\t\t\t\t\t// first remove value to break reference\n\t\t\t\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=(field: (#fieldpair -> value -> find: 'dbfield')) );\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: #source == 'params';\n\t\t\t\t\t\t// load field values from explicit -params using dbfield names\n\t\t\t\t\t\tif: #_params >> (#fieldpair -> value -> find: 'dbfield') && (#fieldpair -> value -> find: 'dbfield') != '';\n\t\t\t\t\t\t\t// first remove value to break reference\n\t\t\t\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t\t\t\tif(#_params -> isa('map'));\n\t\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=(#_params -> (find: (#fieldpair -> value -> find: 'dbfield') ) ) );\n\t\t\t\t\t\t\t/*else: #_params -> (find: (#fieldpair -> value -> find: 'dbfield') ) -> size > 1;\n\t\t\t\t\t\t\t\t// multiple field values\n\t\t\t\t\t\t\t\tlocal: 'valuearray'=array;\n\t\t\t\t\t\t\t\titerate: #_params -> (find:  (#fieldpair -> value -> find: 'dbfield')), (local: 'parampair');\n\t\t\t\t\t\t\t\t\t#parampair -> value != '' ? #valuearray -> (insert: #parampair -> value);\n\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=#valuearray);*/\n\t\t\t\t\t\t\telse(#_params -> isa('array'));\n\t\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=(#_params -> (find: (#fieldpair -> value -> find: 'dbfield')) -> first -> value) );\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: #source == 'form';\n\t\t\t\t\t\t// load field values from form submission\n\t\t\t\t\t\titerate(#fields_samename, local('fieldpair_samename'));\n\t\t\t\t\t\t\t// first remove value to break reference\n\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (remove: 'value');\n\t\t\t\t\t\t\tif(#params_fieldname -> size == #fields_samename -> size);\n\t\t\t\t\t\t\t\t// the number of submitted fields match the number of fields in the form\n\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'=(#params_fieldname -> get(loop_count) -> value) );\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\tif: #params_fieldname -> size > 1;\n\t\t\t\t\t\t\t\t\t// multiple field values\n\t\t\t\t\t\t\t\t\tlocal: 'valuearray'=array;\n\t\t\t\t\t\t\t\t\titerate: #_params -> (find:  (#fieldpair -> name)), (local: 'parampair');\n\t\t\t\t\t\t\t\t\t\t#parampair -> value != '' ? #valuearray -> (insert: #parampair -> value);\n\t\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'=#valuearray);\n\t\t\t\t\t\t\t\telse: #_params >> (#fieldpair -> name);\n\t\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'=(#_params -> (find: #fieldpair_samename -> name) -> first -> value) );\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'='');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#fieldnames_done -> insert(#fieldpair -> name);\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t// apply filtering of field value (do this for all instances of the same field name, so outside of the #fieldnames_done check\n\t\t\t\tif(#fieldpair -> value -> find('filter') -> isa('tag'));\n\t\t\t\t\t(#fieldpair -> value) -> insert('value'= (#fieldpair -> value -> find('filter')) -> run(-params=(#fieldpair -> value -> find('value'))));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\t\t\n\t\t// capture keyvalue or lockvalue if we have a database object connected to the form\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t//(self -> 'db_keyvalue') = null;\n\t\t\t//(self -> 'db_lockvalue') = null;\n\t\t\tif: (self -> 'fieldsource') == 'database';\n\t\t\t\tif: (self -> 'database') -> lockfield != '' && (self -> 'database') -> lockvalue != '';\n\t\t\t\t\t(self -> 'db_lockvalue') = (self -> 'database') -> lockvalue_encrypted;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing lockvalue from database ' + (self -> 'db_lockvalue'));\n\t\t\t\telse: (self -> 'database') -> keyfield != '' && (self -> 'database') -> keyvalue != '';\n\t\t\t\t\t(self -> 'db_keyvalue') = (self -> 'database') -> keyvalue;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from database ' + (self -> 'db_keyvalue'));\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\tif: #_params >> '-lockvalue';\n\t\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) ) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) ) | null);\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) -> first -> value) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) -> first -> value) | null);\n\t\t\t\t\t/if;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing lockvalue from form ' + (self -> 'db_lockvalue'));\n\t\t\t\telse: #_params >> (self -> 'keyparamname');\n\t\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) ) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) ) | null);\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) -> first -> value) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) -> first -> value) | null);\n\t\t\t\t\t/if;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from form ' + (self -> 'db_keyvalue'));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: (self -> 'db_lockvalue') == '' && (self -> 'db_keyvalue') == '';\n\t\t\t\t// we have no keyvalue or lockvalue - this must be an add operation\n\t\t\t\t(self -> 'formmode') = 'add';\n\t\t\t\t// create a keyvalue for the record to add\n\t\t\t\t(self -> 'db_keyvalue') = knop_unique;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': generating keyvalue ' + (self -> 'db_keyvalue'));\n\t\t\telse: (self -> formmode) == '';\n\t\t\t\t(self -> 'formmode') = 'edit';\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': formmode ' + (self -> formmode));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'clearfields', -description='Emtpies all form field values';\n\t\tlocal: 'timer'=knop_timer; \n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\tif: (self -> 'exceptionfieldtypes') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t// && (map: 'legend', 'fieldset', 'html') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t// first remove value to break reference\n\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t(#fieldpair -> value) -> (insert: 'value'='');\n\t\t\t/if;\n\t\t/iterate;\t\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t(self -> 'db_keyvalue') = null;\n\t\t\t(self -> 'db_lockvalue') = null;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'resetfields', -description='Resets all form field values to their initial values';\n\t\tlocal: 'timer'=knop_timer; \n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\tif: (self -> 'exceptionfieldtypes') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t//&& (map: 'legend', 'fieldset', 'html') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t// first remove value to break reference\n\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=#fieldpair -> value -> (find: 'defaultvalue'));\n\t\t\t/if;\n\t\t/iterate;\t\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t(self -> 'db_keyvalue') = null;\n\t\t\t(self -> 'db_lockvalue') = null;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'validate', -description='Performs validation and fills a transient array with field names that have input errors. \\\n\t\t\t\t form -> loadfields must be called first.';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\t// Performs validation and fills a transient array with field names that have input errors.\n\t\t// Must call -> loadfields first\n\t\tif: (self -> 'errors') == null;\n\t\t\t// initiate the errors array so we know validate has been performed\n\t\t\t(self -> 'errors') = array;\n\t\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t\tif: !( (self -> 'exceptionfieldtypes') >> #fieldpair -> value -> (find: 'type') );\n\t\t\t\t\tif: (#fieldpair -> value -> (find: 'required') ) \n\t\t\t\t\t\t&& (#fieldpair -> value -> (find: 'value') ) == '';\n\t\t\t\t\t\t(self -> 'errors') -> (insert: (#fieldpair -> value -> (find: 'name') ));\n\t\t\t\t\t/if;\n\t\t\t\t\tif(#fieldpair -> value -> find('validate') -> isa('tag'));\n\t\t\t\t\t\t// perform validation expression on the field value\n\t\t\t\t\t\tlocal('result'=(#fieldpair -> value -> find('validate')) -> run(-params=#fieldpair -> value -> find('value')));\n\t\t\t\t\t\tif(#result === true || #result === 0);\n\t\t\t\t\t\t\t// validation was ok\n\t\t\t\t\t\telse(#result != 0 || #result -> size);\n\t\t\t\t\t\t\t// validation result was an error code or message\n\t\t\t\t\t\t\t(self -> 'errors') -> insert(#fieldpair -> value -> find('name') = #result);\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t(self -> 'errors') -> insert(#fieldpair -> value -> find('name'));\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': form is valid ' + ((self -> 'errors') -> size == 0));\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'isvalid', -description='Returns the result of form -> validate (true/false) without performing the validation again (unless it hasn\\'t been performed already)';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// Returns the result of -> validate (true/false) without performing the validation again (unless it is needed)\n\t\t(self -> 'errors') == null ? self -> validate;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': form is valid ' + ((self -> 'errors') -> size == 0));\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: (self -> 'errors') -> size == 0;\n\t/define_tag;\n\n\n\tdefine_tag: 'adderror', -description='adds the name for a field that has validation error, used for custom field validation. \\\n\t\t\t\tcalls form -> validate first if needed',\n\t\t-required='fieldname';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// adds a field that has error\n\t\t// calls ->validate first if needed, to make sure self -> 'errors' is an array\n\t\t(self -> 'errors') == null ? self -> validate;\n\t\t(self -> 'errors') -> (insert: #fieldname);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'errors', -description='Returns an array with fields that have input errors, or empty array if no errors or form has not been validated';\n\t\t// returns an array with fields that have input errors, or emtpy array if no errors or form has not been validated\n\t\tif: (self -> 'errors') == null;\n\t\t\treturn: array;\n\t\telse;\n\t\t\treturn: (self -> 'errors');\n\t\t/if;\n\t/define_tag;\n\n\n\n\tdefine_tag: 'updatefields', -description='Returns a pair array with fieldname=value, or optionally SQL string to be used in an update inline.\\\n\t\tform -> loadfields must be called first.\\n\\\n\t\tParameters:\\n\\\n\t\t-sql (optional)\\n\\\n\t\t-removedotbackticks (optional flag) Use with -sql for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.',\n\t\t-optional='sql',\n\t\t-optional='removedotbackticks';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// Returns a pair array with fieldname=value, or optionally SQL string to be used in an update inline. Optionally use -removedotbackticks with -sql for backward compatibility with fields that contain periods.\n\t\t// Must call ->loadfields first.\n\t\tlocal: 'output'=array,\n\t\t\t'_sql'=(local_defined: 'sql'),\n\t\t\t'_removedotbackticks'=(local_defined: 'removedotbackticks'),\n\t\t\t'fieldvalue'=null, 'onevalue'=null;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\tif: !( (self -> 'exceptionfieldtypes') >> #fieldpair -> value -> (find: 'type') )\n\t\t\t\t&& !(#fieldpair -> value -> (find: 'name') -> (beginswith: '-'))\n\t\t\t\t&& (#fieldpair -> value -> (find: 'dbfield')) != '';\n\t\t\t\t// don't use submit etc and exclude fields whose name begins with -\n\t\t\t\t#fieldvalue = (#fieldpair -> value -> (find: 'value') );\n\t\t\t\tif: #fieldvalue -> type != 'array';\n\t\t\t\t\t// to support multiple values for one fieldname, like checkboxes\n\t\t\t\t\t#fieldvalue = array: #fieldvalue;\n\t\t\t\t/if;\n\t\t\t\tif: #_sql;\n\t\t\t\t\tif(#_removedotbackticks);\n\t\t\t\t\t\t#output -> (insert:  '`' + (encode_sql(knop_stripbackticks(#fieldpair -> value -> find('dbfield'))) ) + '`' \n\t\t\t\t\t\t\t+ '=\"' + (encode_sql: (#fieldvalue -> (join: ',')) ) + '\"');\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output -> (insert:  '`' + (encode_sql(string_replace(knop_stripbackticks(#fieldpair -> value -> find('dbfield')), -find='.', -replace='`.`')) ) + '`' \n\t\t\t\t\t\t+ '=\"' + (encode_sql: (#fieldvalue -> (join: ',')) ) + '\"');\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\titerate: #fieldvalue, #onevalue;\n\t\t\t\t\t\t#output -> (insert:  (#fieldpair -> value -> (find: 'dbfield') ) \n\t\t\t\t\t\t\t= #onevalue );\n\t\t\t\t\t/iterate;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: #_sql;\n\n\t\t\t#output = '(' + #output -> (join: ',') + ')';\n\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t\t\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'getbutton', -description='Returns what button was clicked on the form on the previous page. Assumes that submit buttons are named button_add etc. \\\n\t\t\t\tReturns add, update, delete, cancel or any custom submit button name that begins with button_.';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (self -> 'formbutton') != '';\n\t\t\t// we have already found out once what button was clicked\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': cached ' + (self -> 'formbutton'));\n\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\treturn: (self -> 'formbutton');\n\t\t/if;\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t// look for submit buttons, the least destructive first\n\t\titerate: (array: 'cancel', 'save', 'add', 'delete'), (local: 'buttonname');\n\t\t\tif: #clientparams >> 'button_' + #buttonname \n\t\t\t\t|| #clientparams >> 'button_' + #buttonname + '.x'\n\t\t\t\t|| #clientparams >> 'button_' + #buttonname + '.y';\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': built-in button name ' + #buttonname);\n\t\t\t\t(self -> 'formbutton') = #buttonname;\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\treturn: #buttonname;\n\t\t\t/if;\n\t\t/iterate;\n\t\t// no button found yet - look for custom button names\n\t\titerate: #clientparams, #buttonname;\n\t\t\t#buttonname -> type == 'pair' ? #buttonname =  #buttonname -> name;\n\t\t\tif: #buttonname -> (beginswith: 'button_');\n\t\t\t\t#buttonname -> (removeleading: 'button_') & (removetrailing: '.x') & (removetrailing: '.y');\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': custom button name ' + #buttonname);\n\t\t\t\t(self -> 'formbutton') = #buttonname;\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\treturn: #buttonname;\n\t\t\t/if;\n\t\t/iterate;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': No button found');\n\t/define_tag;\n\t\n\tdefine_tag: 'process', -description='Automatically handles a form submission and handles add, update, or delete. \\\n\t\t\t\tRequires that a database object is specified for the form',\n\t\t-optional='user',\n\t\t-optional='lock',\n\t\t-optional='keyvalue';\n\t\tlocal: 'timer'=knop_timer; \n\t\tfail_if: (self -> 'database') -> type != 'database', 7103, self -> error_msg(7103);\n\n\t\t(self -> 'error_code') = 0;\n\t\t(self -> 'error_msg') = string;\n\t\t\n\t\tif: self -> getbutton == 'cancel';\n\t\t\t// do nothing at all\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': cancelling ');\n\t\t\t\n\t\telse: self -> getbutton == 'save';\n\t\t\tself -> loadfields;\n\t\t\tif: self -> isvalid;\n\t\t\t\tif: (local_defined: 'user') && (self -> lockvalue) != '';\n\t\t\t\t\t(self -> database) -> (saverecord: (self -> updatefields), -lockvalue=(self -> lockvalue), -keyvalue=(self -> keyvalue), -user=#user);\n\t\t\t\telse;\n\t\t\t\t\t(self -> database) -> (saverecord: (self -> updatefields), -keyvalue=(self -> keyvalue));\n\t\t\t\t/if;\n\t\t\t\tif: self -> database -> error_code != 0;\n\t\t\t\t\t(self -> 'error_code') = self -> database -> error_code;\n\t\t\t\t\t(self -> 'error_msg') = 'Process: update record error ' + (self -> database -> error_msg);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': updating record ' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = 7101; // Process: update record did not pass form validation\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': update record did not pass form validation');\n\t\t\t/if;\n\t\t\n\t\telse: self -> getbutton == 'add';\n\t\t\tself -> loadfields;\n\t\t\tif: self -> isvalid;\n\t\t\t\t(self -> database) -> (addrecord: (self -> updatefields), -keyvalue=(self -> keyvalue));\n\t\t\t\tif: self -> database -> error_code != 0;\n\t\t\t\t\t(self -> 'error_code') = self -> database -> error_code;\n\t\t\t\t\t(self -> 'error_msg') = 'Process: add record error ' + (self -> database -> error_msg);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': adding record ' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = 7101; // Process: add record did not pass form validation\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': add record did not pass form validation');\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': reverting form mode to add');\n\t\t\t/if;\n\n\t\telse: self -> getbutton == 'delete';\n\t\t\tself -> loadfields;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': will delete record with keyvalue ' + (self -> keyvalue) + ' lockvalue ' + (self -> lockvalue));\n\t\t\tif: (local_defined: 'user') && (self -> lockvalue) != '';\n\t\t\t\t(self -> database) -> (deleterecord: -lockvalue=(self -> lockvalue), -keyvalue=(self -> keyvalue), -user=#user);\n\t\t\telse;\n\t\t\t\t(self -> database) -> (deleterecord: -keyvalue=(self -> keyvalue));\n\t\t\t/if;\n\t\t\tif: self -> database -> error_code == 0;\n\t\t\t\tself -> resetfields;\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = self -> database -> error_code;\n\t\t\t\t(self -> 'error_msg') = 'Process: delete record error ' + (self -> database -> error_msg);\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': deleting record ' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\telse: false;\n\t\t\t// do not go here, database record should be loaded with a separate call\n\t\t\tif: (local_defined: 'lock');\n\t\t\t\tself -> database ->(getrecord: (local: 'keyvalue'), -lock, -user=#user);\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': loading record using lock' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\telse;\n\t\t\t\tself -> database ->(getrecord: (local: 'keyvalue'), -user=#user);\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': loading record' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\t/if;\n\t\t\tself -> (loadfields: -inlinename=(self -> database -> inlinename));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'setformat', -description='Defines a html template for the form. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-template (optional string) html template, defaults to #label# #field##required#<br>\\n\\\n\t\t\t-buttontemplate (optional string) html template for buttons, defaults to #field#\\n\\\n\t\t\t-required (optional string) character(s) to display for required fields (used for #required#), defaults to *\\n\\\n\t\t\t-legend (optional string) legend for the entire form - if specified, a fieldset will also be wrapped around the form\\n\\\n\t\t\t-class (optional string) css class name that will be used for the form element, default none\\n\\\n\t\t\t-errorclass (optional string) css class name that will be used for the label to highlight input errors, if not defined style=\"color: red\" will be used\\n\\\n\t\t\t-unsavedmarker (optional string) \\n\\\n\t\t\t-unsavedmarkerclass (optional string) \\n\\\n\t\t\t-unsavedwarning (optional string)',\n\t\t-optional='template', -type='string',\n\t\t-optional='buttontemplate', -type='string',\n\t\t-optional='required', -type='string',\n\t\t-optional='legend', -type='string',\n\t\t-optional='class', -type='string',\n\t\t-optional='errorclass', -type='string',\n\t\t-optional='unsavedmarker', -type='string',\n\t\t-optional='unsavedmarkerclass', -type='string',\n\t\t-optional='unsavedwarning', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal_defined('template') ? (self -> 'template') = #template;\n\t\tlocal_defined('buttontemplate') ? (self -> 'buttontemplate') = #buttontemplate;\n\t\tlocal_defined('required') ? (self -> 'required') = #required;\n\t\tlocal_defined('legend') ? (self -> 'legend') = #legend;\n\t\tlocal_defined('class') ? (self -> 'class') = #class;\n\t\tlocal_defined('errorclass') ? (self -> 'errorclass') = #errorclass;\n\t\tlocal_defined('unsavedmarker') ? (self -> 'unsavedmarker') = #unsavedmarker;\n\t\tlocal_defined('unsavedmarkerclass') ? (self -> 'unsavedmarkerclass') = #unsavedmarkerclass;\n\t\tlocal_defined('unsavedwarning') ? (self -> 'unsavedwarning') = #unsavedwarning;\n\n\t\tif: local_defined: 'unsavedwarning';\n\t\t\t// escape quotes for javascript\n\t\t\t(self -> 'unsavedwarning') -> (replace: '\\'', '\\\\\\'');\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'renderform', -description='Outputs HTML for the form fields, a specific field, a range of fields or all fields of a specific type. \\\n\t\t\tAlso inserts all needed javascripts into the page. \\\n\t\t\tUse form -> setformat first to specify the html format, otherwise default format #label# #field##required#<br> is used. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-name (optional) Render only the specified field\\n\\\n\t\t\t-from (optional) Render form fields from the specified number index or field name. Negative number count from the last field.\\n\\\n\t\t\t-to (optional) Render form fields to the specified number index or field name. Negative number count from the last field.\\n\\\n\t\t\t-type (optional) Only render fields of this or these types (string or array)\\n\\\n\t\t\t-excludetype (optional) Render fields except of this or these types (string or array)\\n\\\n\t\t\t-legend (optional) Groups the rendered fields in a fieldset and outputs a legend for the fieldset\\n\\\n\t\t\t-start (optional) Only render the starting <form> tag\\n\\\n\t\t\t-end (optional) Only render the ending </form> tag\\n\\\n\t\t\t-xhtml (optional flag) XHTML valid output',\n\t\t-optional='name', -copy, \t// field name\n\t\t-optional='from', -copy, \t// number index or field name\n\t\t-optional='to', -copy, \t\t// number index or field name\n\t\t-optional='type', -copy,\t// only output fields of this or these types (string or array)\n\t\t-optional='excludetype', -copy,\t// output fields except of this or these types (string or array)\n\t\t-optional='legend',\t\t\t// groups the rendered fields in a fieldset and outputs a legend for the fieldset\n\t\t-optional='start',\t\t\t// only output the starting <form> tag\n\t\t-optional='end',\t\t\t// only output the ending </form> tag\n\t\t-optional='xhtml';\t\t\t// boolean, if set to true adjust output for XHTML\n\t\tlocal: 'timer'=knop_timer; \n\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name, -time, -type=self->type);/handle;\n\t\t\n\t\t// Outputs HTML for the form fields\n\t\t\n\t\t/*\n\t\t\tTODO: \n\t\t\tHandling of multiple fields with the same name\n\t\t*/\n\t\tlocal: 'output'=string, \n\t\t\t'onefield'=map, \n\t\t\t'renderfield'=string, \n\t\t\t'renderfield_base'=string, \n\t\t\t'renderrow'=string,\n\t\t\t'formid'=null,\n\t\t\t'usehint'=array,\n\t\t\t'nowarning'=false,\n\t\t\t'fieldtype',\n\t\t\t'fieldvalue'=string,\n\t\t\t'fieldvalue_array'=array,\n\t\t\t'options'=array,\n\t\t\t'focusfield';\n\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t#clientparams -> (removeall: (self -> 'keyparamname'));\n\t\t#clientparams -> (removeall: '-lockvalue');\n\t\t#clientparams -> (removeall: '-action');\n\t\t#clientparams -> (removeall: '-xhtml');\n\n\t\t// local var that adjust tag endings if rendered for XHTML\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\t// page var to keep track of the number of forms that has been rendered on a page\n\t\tif: !(var_defined: 'knop_form_renderform_counter');\n\t\t\tvar: 'knop_form_renderform_counter'=0;\n\t\t/if;\n\t\t\n\t\t$knop_form_renderform_counter += 1;\n\n\t\tif: (self -> 'id') != '';\n\t\t\t#formid = (self -> 'id');\n\t\telse: (self -> 'name') != '';\n\t\t\t#formid = (self -> 'name');\n\t\telse;\n\t\t\t#formid = 'form' + $knop_form_renderform_counter;\n\t\t/if;\n\t\t\n\t\t\n\t\tlocal: 'renderformStartTag'=false, 'renderformEndTag'=false;\n\t\t// remove params that should not stop formstarttag and formendtag from rendering\n\t\tparams -> type == 'array' ? params -> (removeall: '-legend') & (removeall: '-xhtml');\n\t\tif: (self -> 'formaction') != null \n\t\t\t&& (params -> size == 0 || (local_defined: 'start') );\n\t\t\t#renderformStartTag=true;\n\t\t/if;\n\t\tif: (self -> 'formaction') != null \n\t\t\t&& (params -> size == 0 || (local_defined: 'end') );\n\t\t\t#renderformEndTag=true;\n\t\t/if;\n\t\tif: #renderformStartTag;\n\t\t\t// render opening form tag\n\n\t\t\t#output +='<form';\n\t\t\t(self -> 'debug_trace') -> insert(tag_name + ': formaction = ' + (self -> 'formaction'));\n\t\t\tif: (self -> 'formaction') != null;\n\t\t\t\t#output += ' action=\"' + (self -> 'formaction');\n\t\t\t\tif: (self -> 'method') == 'post' && !(self -> 'noautoparams');\n\t\t\t\t\tlocal: 'actionparams'=array;\n\t\t\t\t\titerate: #clientparams, (local: 'clientparam');\n\t\t\t\t\t\tif: #clientparam -> type == 'pair';\n\t\t\t\t\t\t\tif: #clientparam -> name -> (beginswith: '-') \n\t\t\t\t\t\t\t    && !(#clientparam -> name -> (beginswith: '-upload.'))\n\t\t\t\t\t\t\t    && !(#clientparam -> name -> (beginswith: '-upload2.'))\n\t\t\t\t\t\t\t\t&& #clientparam -> name != '-session'\n\t\t\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam -> name\n\t\t\t\t\t\t\t\t// check if param name appears in form action\n\t\t\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like \".\"\n\t\t\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t\t\t+ ((#clientparam -> name) -> (split: '') -> (join: '][')) \n\t\t\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t\t\t#actionparams -> (insert: (#clientparam -> name) + '=' + (encode_url: (#clientparam -> value)) );\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\telse: #clientparam -> type == 'string' \n\t\t\t\t\t\t\t&& #clientparam -> (beginswith: '-') \n\t\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam\n\t\t\t\t\t\t\t// check if param appears in form action\n\t\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like \".\"\n\t\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t\t+ (#clientparam -> (split: '') -> (join: '][')) \n\t\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t\t#actionparams -> (insert: #clientparam );\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/iterate;\n\t\t\t\t\tif: #actionparams -> size;\n\t\t\t\t\t\t#output += ((self -> 'formaction') >> '?' ? '&amp;' | '?' ) + #actionparams -> (join: '&amp;');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t#output += '\"';\n\t\t\t/if;\n\t\t\t(self -> 'method') != null\t\t? #output += ' method=\"' + (self -> 'method') + '\"';\n\t\t\t(self -> 'name') != null\t\t? #output += ' name=\"' + (self -> 'name') + '\"';\n\t\t\t#output += ' id=\"' + #formid + '\"';\n\t\t\t(self -> 'class') != null\t\t? #output += ' class=\"' + (self -> 'class') + '\"';\n\t\t\t(self -> 'enctype') != ''\t\t? #output += ' enctype=\"' + (self -> 'enctype') + '\"';\n\t\t\t(self -> 'raw') != null\t\t\t? #output += ' ' + (self -> 'raw');\n\t\t\t!(self -> 'noscript') ? #output += ' onsubmit=\"return validateform(this)\"';\n\t\t\t(self -> 'entersubmitblock') && !(self -> 'noscript')\t? #output += ' onkeydown=\"return submitOk(event);\" onfocus=\"submitBlock=true; return true;\" onblur=\"submitBlock=false; return true;\"';\n\t\t\t#output += '>\\n';\n\n\n\t\t\tif: (self -> 'actionpath') != '' \n\t\t\t\t&& !(self -> 'noautoparams') \n\t\t\t\t&& (self -> 'fields') !>> '-action';\n\t\t\t\t// auto-add -action unless there is already an -action field in the form\n\t\t\t\t#output += '<input type=\"hidden\" name=\"-action\" value=\"' + (encode_html: (self -> 'actionpath')) + '\"' + #endslash + '>\\n';\n\t\t\t/if;\n\t\t\tif: (self -> 'fieldset');\n\t\t\t\t#output += '<fieldset>\\n';\n\t\t\t\t#output +='<legend>' + (self -> 'legend') + '</legend>\\n';\n\t\t\t/if;\n\t\t\tif: (self -> 'method') == 'get' && !(self -> 'noautoparams');\n\t\t\t\titerate: #clientparams, (local: 'clientparam');\n\t\t\t\t\tif: #clientparam -> type == 'pair';\n\t\t\t\t\t\tif: #clientparam -> name -> (beginswith: '-')\n\t\t\t\t\t\t\t&& #clientparam -> name != '-session'\n\t\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam -> name\n\t\t\t\t\t\t\t// check if param name appears in form action\n\t\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like .\n\t\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t\t+ ((#clientparam -> name) -> (split: '') -> (join: '][')) \n\t\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t\t#output += '<input type=\"hidden\" name=\"' + (#clientparam -> name) + '\" value=\"' + (encode_html: (#clientparam -> value)) + '\"' + #endslash + '>\\n';\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: #clientparam -> type == 'string' \n\t\t\t\t\t\t&& #clientparam -> (beginswith: '-')\n\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam\n\t\t\t\t\t\t// check if param appears in form action\n\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like .\n\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t+ (#clientparam -> (split: '') -> (join: ']['))\n\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t#output += '<input type=\"hidden\" name=\"' + #clientparam + '\"' + #endslash + '>\\n';\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t\tif: (self -> 'database') -> lockfield != '' && (self -> 'db_lockvalue') != '';\n\t\t\t\t\t#output += '<input type=\"hidden\" name=\"-lockvalue\" value=\"' + (encode_html: (self -> 'db_lockvalue')) + '\"' + #endslash + '>\\n';\n\t\t\t\telse: (self -> 'database') -> keyfield != '' && (self -> 'db_keyvalue') != '';\n\t\t\t\t\t#output += '<input type=\"hidden\" name=\"' + (self -> 'keyparamname') + '\" value=\"' + (encode_html: (self -> 'db_keyvalue')) + '\"' + #endslash + '>\\n';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\t\n\t\t\n\t\tif: !(local_defined: 'start') && !(local_defined: 'end');\n\n\t\t\t(local_defined: 'name') && !((self -> 'fields') >> #name) \t? \treturn;\n\t\t\t\n\t\t\t(local_defined: 'name')\t\t? local: 'from'=#name, 'to'=#name;\n\t\t\t!(local_defined: 'from') \t\t? local: 'from'=1;\n\t\t\t!(local_defined: 'to') \t\t\t? local: 'to'=(self -> 'fields') -> size;\n\t\t\t!(local_defined: 'type')\t\t? local: 'type'=(self -> 'validfieldtypes');\n\t\t\t!(local_defined: 'excludetype')\t? local: 'excludetype'=map;\n\t\t\t#type -> type == 'string' \t\t? #type = (map: #type);\n\t\t\t#excludetype -> type == 'string' ? #excludetype = (map: #excludetype);\n\n\t\t\t// only render form inputs if we are not only rendering the form tags\n\t\t\n\t\t\t// use field name if #from is a string\n\t\t\t#from -> type == 'string' ? #from = integer: ((self -> 'fields') -> (findindex: #from) -> first);\n\t\t\t#from == 0 ? #from = 1;\n\t\t\t// negative numbers count from the end\n\t\t\t#from < 0 ? #from = (self -> 'fields') -> size + #from;\n\t\n\t\t\t// use field name if #to is a string\n\t\t\t#to -> type == 'string' ? #to = integer: ((self -> 'fields') -> (findindex: #to) -> last);\n\t\t\t#to == 0 ? #to = (self -> 'fields') -> size;\n\t\t\t// negative numbers count from the end\n\t\t\t#to < 0 ? #to = (self -> 'fields') -> size + #to;\n\n\t\t\t// sanity check\n\t\t\t#from > #to ? #to = #from;\n\t\n\t\t\tlocal: 'template'=( (self -> 'template') != '' \n\t\t\t\t? (self -> 'template') \t\t\n\t\t\t\t| '#label# #field##required#<br' + #endslash + '>\\n' );\n\t\t\tlocal: 'buttontemplate'=( (self -> 'buttontemplate') != '' \n\t\t\t\t? (self -> 'buttontemplate') \n\t\t\t\t| (self -> 'template') != '' \n\t\t\t\t? (self -> 'template')\n\t\t\t\t| '#field#\\n' );\n\t\t\tlocal: 'requiredmarker'=(self -> 'required');\n\t\t\tlocal: 'defaultclass'=( (self -> 'class') != '' \n\t\t\t\t? (self -> 'class') \t\t\n\t\t\t\t| '');\n\t\t\tlocal: 'errorclass'=( (self -> 'errorclass') != '' \n\t\t\t\t? ' class=\"' + (self -> 'errorclass') + '\"' \n\t\t\t\t| ' style=\"color: red;\"');\n\t\t\t\n\t\t\tif: (local_defined: 'legend');\n\t\t\t\t(self -> 'render_fieldset2_open') = true;\n\t\t\t\t#output += '<fieldset>\\n'\n\t\t\t\t\t+ '<legend>' + #legend + '</legend>\\n';\n\t\t\t/if;\n\n\t\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t\t#onefield = #fieldpair -> value;\n\t\t\t\t#fieldvalue = (#onefield -> (find: 'value'));\n\t\t\t\t#fieldvalue_array = #fieldvalue;\n\t\t\t\tif: #fieldvalue_array -> type != 'array';\n\t\t\t\t\tif: #fieldvalue_array >> '\\r'; // Filemaker value list with multiple checked\n\t\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: '\\r');\n\t\t\t\t\telse: #fieldvalue_array >> ','; // Other database with multiple checked\n\t\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: ',');\n\t\t\t\t\telse;\n\t\t\t\t\t\t#fieldvalue_array = array: #fieldvalue_array;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif: #onefield >> 'options';\n\t\t\t\t\t#options = (#onefield -> find: 'options');\n\t\t\t\t\t// convert types for pair \n\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\tif: #option -> type != 'pair';\n\t\t\t\t\t\t\t#option = (pair: #option = #option);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t// name must be string to make sure comparsions work\n\t\t\t\t\t\t(#option -> name) = (string: #option -> name);\n\t\t\t\t\t/iterate;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t\tif: loop_count >= #from \n\t\t\t\t\t&& loop_count <= #to\n\t\t\t\t\t&& #type >> #onefield -> (find: 'type')\n\t\t\t\t\t&& !(#excludetype >> #onefield -> (find: 'type'));\n\t\t\t\t\tif: (self -> 'unsavedwarning') == '';\n\t\t\t\t\t\t#nowarning=true;\n\t\t\t\t\telse;\n\t\t\t\t\t\t#nowarning=#onefield -> (find: 'nowarning');\n\t\t\t\t\t/if;\n\t\t\t\t\t\n\t\t\t\t\tif: #onefield -> (find: 'template') -> size;\n\t\t\t\t\t\t#renderrow = #onefield -> (find: 'template');\n\t\t\t\t\telse: (map: 'submit', 'reset', 'image') >> #onefield -> (find: 'type');\n\t\t\t\t\t\t#renderrow=#buttontemplate;\n\t\t\t\t\telse;\n\t\t\t\t\t\t#renderrow=#template;\n\t\t\t\t\t/if;\n\t\t\t\t\tlocal: 'id'= string;\n\t\t\t\t\tif: (#onefield -> (find: 'id')) !='';\n\t\t\t\t\t\t#id = (#onefield -> (find: 'id'));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#id = #formid + '_' + (#onefield -> (find: 'name')) + loop_count;\n\t\t\t\t\t/if;\n\t\t\t\t\tif: (self -> 'errors') -> size == 0 && #focusfield == '' && #onefield -> (find: 'focus');\n\t\t\t\t\t\t// give this field focus\n\t\t\t\t\t\t#focusfield = #id;\n\t\t\t\t\t/if;\n\t\t\t\t\t\n\t\t\t\t\t// set field label, with error marker if field validation failed\n\t\t\t\t\t// if: (self -> 'exceptionfieldtypes') >> (#onefield -> (find: 'type')) && (#onefield -> (find: 'type')) != 'file';\n\t\t\t\t\t//\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t\t//else: \n\t\t\t\t\tif: (self -> 'errors') -> type == 'array' && (self -> 'errors') >> (#onefield -> (find: 'name'));\n\t\t\t\t\t\t#renderrow -> (replace: '#label#', \n\t\t\t\t\t\t\t'<label for=\"' + #id + '\" id=\"' + #id + '_label\" ' + #errorclass + '>' + (#onefield -> find('label')) + '</label>');\n\t\t\t\t\t\tif: #focusfield == '';\n\t\t\t\t\t\t\t#focusfield = #id;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse;\n\t\t\t\t\t\t#renderrow -> (replace: '#label#', '<label for=\"' + #id + '\" id=\"' + #id + '_label\">' + (#onefield -> find('label')) + '</label>');\n\t\t\t\t\t/if;\n\t\t\t\t\t\n\t\t\t\t\t// set markers for required fields \n\t\t\t\t\tif: #onefield -> (find: 'required') && !((self -> 'exceptionfieldtypes') >> (#onefield -> (find: 'type')) );\n\t\t\t\t\t\t#renderrow -> (replace: '#required#', (encode_smart: #requiredmarker));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#renderrow -> (replace: '#required#', '');\n\t\t\t\t\t/if;\n\t\t\t\t\t#renderfield=string;\n\t\t\t\t\t#renderfield_base = ' name=\"' + (encode_html: (#onefield -> (find: 'name'))) + '\"'\n\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' class=\"' + (#onefield -> (find: 'class')) + '\"' \n\t\t\t\t\t\t\t| (#defaultclass != '' ? ' class=\"' + #defaultclass + '\"') )\n\t\t\t\t\t\t+ ' id=\"' +  (encode_html: #id) + '\"'\n\t\t\t\t\t\t+ (#onefield >> 'raw'\t?  ' ' + (#onefield -> (find: 'raw')) )\n\t\t\t\t\t\t+ (#onefield -> (find: 'disabled') ? ' disabled=\"disabled\"');\n\n\t\t\t\t\t#fieldtype=(#onefield -> (find: 'type'));\n\t\t\t\t\tif: #fieldtype == 'search' && client_type !>> 'WebKit';\n\t\t\t\t\t\t// only show <input type=search\" for WebKit based browsers like Safari\n\t\t\t\t\t\t#fieldtype = 'text';\n\t\t\t\t\t/if;\n\t\t\t\t\tselect: #fieldtype;\n\t\t\t\t\tcase: 'html';\n\t\t\t\t\t\t#renderrow = #template;\n\t\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t\t\t#renderrow -> (replace: '#required#', '');\n\t\t\t\t\t\t#renderfield = #fieldvalue + '\\n';\n\t\t\t\t\tcase: 'legend';\n\t\t\t\t\t\t#renderrow = '';\n\t\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#output += '<fieldset' \n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' class=\"' + (#onefield -> (find: 'class')) + '\"' \n\t\t\t\t\t\t\t\t| (#defaultclass != '' ? ' class=\"' + #defaultclass + '\"') )\n\t\t\t\t\t\t\t+ ((#onefield -> (find: 'id') != '') ? ' id=\"' + #id + '\"') \n\t\t\t\t\t\t\t+ '>\\n';\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\t\t\t#output += '<legend>' + (encode_html: #fieldvalue) + '</legend>\\n';\n\t\t\t\t\tcase: 'fieldset';\n\t\t\t\t\t\t#renderrow = '';\n\t\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: #fieldvalue !== false;\n\t\t\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\t\t\t\t#output += '<fieldset' \n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' class=\"' + (#onefield -> (find: 'class')) + '\"' \n\t\t\t\t\t\t\t\t| (#defaultclass != '' ? ' class=\"' + #defaultclass + '\"') )\n\t\t\t\t\t\t\t+ ((#onefield -> (find: 'id') != '') ? ' id=\"' + #id + '\"') \n\t\t\t\t\t\t\t+ '>\\n<legend>' + (encode_html: #fieldvalue) + '</legend>\\n'; // must contain a legend\n\t\t\t\t\t\t/if;\n\t\t\t\t\tcase: 'hidden';\n\t\t\t\t\t\t#renderfield += '<input type=\"hidden\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\t\t#renderrow = '';\n\t\t\t\t\t\t#output += #renderfield + '\\n';\n\t\t\t\t\tcase: 'text';\n\t\t\t\t\t\t#renderfield += '<input type=\"text\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"'\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' )\n\t\t\t\t\t\t\t+ (#onefield >> 'maxlength' \t? ' maxlength=\"' + (#onefield -> (find: 'maxlength')) + '\"' );\n\t\t\t\t\t\tif: !(self -> 'noscript') && (#onefield -> (find: 'hint')) != '';\n\t\t\t\t\t\t\t#renderfield += ' onfocus=\"clearHint(this)\" onblur=\"setHint(this, \\'' (#onefield -> (find: 'hint')) '\\')\"';\n\t\t\t\t\t\t\t#usehint -> (insert: (#onefield -> find: 'name') = #id);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'search';\n\t\t\t\t\t\t#renderfield += '<input type=\"search\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"'\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' );\n\t\t\t\t\t\tif: (#onefield -> (find: 'hint')) != '';\n\t\t\t\t\t\t\t#renderfield += ' placeholder=\"' + (encode_html: (#onefield -> (find: 'hint'))) + '\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'password';\n\t\t\t\t\t\t#renderfield += '<input type=\"password\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"'\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' );\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'textarea';\n\t\t\t\t\t\t#renderfield += '<textarea' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ (#onefield >> 'cols' \t? ' cols=\"' + (#onefield -> (find: 'cols')) + '\"')\n\t\t\t\t\t\t\t+ (#onefield >> 'rows' \t? ' rows=\"' + (#onefield -> (find: 'rows')) + '\"');\n\t\t\t\t\t\tif: !(self -> 'noscript') && (#onefield -> (find: 'hint')) != '';\n\t\t\t\t\t\t\t#renderfield += ' onfocus=\"clearHint(this)\" onblur=\"setHint(this, \\'' (#onefield -> (find: 'hint')) '\\')\"';\n\t\t\t\t\t\t\t#usehint -> (insert: (#onefield -> find: 'name') = #id);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += '>'\n\t\t\t\t\t\t\t+ (encode_html: #fieldvalue) + '</textarea>';\n\t\t\t\t\tcase: 'checkbox';\n\t\t\t\t\t\tlocal: 'optioncount'=integer;\n\t\t\t\t\t\t#renderfield += '<div class=\"inputgroup'\n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' ' + (#onefield -> find('class'))\n\t\t\t\t\t\t\t| (#defaultclass != '' ? ' ' + #defaultclass) ) \n\t\t\t\t\t\t\t+ '\" id=\"' + #id + '\">\\n';\n\t\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\t\t#optioncount += 1;\n\t\t\t\t\t\t\t#renderfield += (#optioncount > 1 && (#onefield -> find: 'linebreak') ? '<br' + #endslash + '>') + '\\n';\n\t\t\t\t\t\t\tif: #option -> name == '-optgroup';\n\t\t\t\t\t\t\t\t#renderfield += (!(#onefield -> find: 'linebreak') && #optioncount > 1 ? '\\n<br' + #endslash + '>');\n\t\t\t\t\t\t\t\tif: #option -> value != '-optgroup';\n\t\t\t\t\t\t\t\t\t#renderfield += #option -> value\n\t\t\t\t\t\t\t\t\t\t+ (!(#onefield -> find: 'linebreak') ? '<br' + #endslash + '>\\n');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield +=  '<input type=\"checkbox\"'\n\t\t\t\t\t\t\t\t\t+ (string_replaceregexp: #renderfield_base, -find='id=\"(.+?)\"', -replace=('id=\"\\\\1_' + #optioncount + '\"'))\n\t\t\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #option -> name) + '\"';\n\t\t\t\t\t\t\t\tif: #option -> name != '' && #fieldvalue_array >> #option -> name;\n\t\t\t\t\t\t\t\t\t#renderfield +=' checked=\"checked\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += #endslash + '> <label for=\"' + #id + '_' + #optioncount \n\t\t\t\t\t\t\t\t\t+ '\" id=\"' + #id + '_' + #optioncount + '_label\"';\n\t\t\t\t\t\t\t\tif: (self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += '>' + (#option -> value) + '</label> ';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#renderfield += '</div>\\n';\n\t\t\t\t\tcase: 'radio';\n\t\t\t\t\t\tlocal: 'optioncount'=integer;\n\t\t\t\t\t\t#renderfield += '<div class=\"inputgroup'\n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' ' + (#onefield -> find('class'))\n\t\t\t\t\t\t\t| (#defaultclass != '' ? ' ' + #defaultclass) ) \n\t\t\t\t\t\t\t+ '\" id=\"' + #id + '\">\\n';\n\t\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\t\t#optioncount += 1;\n\t\t\t\t\t\t\t#renderfield += (#optioncount > 1 && (#onefield -> find: 'linebreak') ? '<br' + #endslash + '>') + '\\n';\n\t\t\t\t\t\t\tif: #option -> name == '-optgroup';\n\t\t\t\t\t\t\t\t#renderfield += (!(#onefield -> find: 'linebreak') && #optioncount > 1 ? '\\n<br' + #endslash + '>');\n\t\t\t\t\t\t\t\tif: #option -> value != '-optgroup';\n\t\t\t\t\t\t\t\t\t#renderfield += #option -> value\n\t\t\t\t\t\t\t\t\t\t+ (!(#onefield -> find: 'linebreak') ? '<br' + #endslash + '>\\n');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += '<input type=\"radio\"'\n\t\t\t\t\t\t\t\t\t+ (string_replaceregexp: #renderfield_base, -find='id=\"(.+?)\"', -replace=('id=\"\\\\1_' + #optioncount + '\"'))\n\t\t\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #option -> name) + '\"';\n\t\t\t\t\t\t\t\tif: #option -> name != '' && #fieldvalue_array >> #option -> name;\n\t\t\t\t\t\t\t\t\t#renderfield +=' checked=\"checked\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += #endslash + '> <label for=\"' + #id + '_' + #optioncount \n\t\t\t\t\t\t\t\t\t+ '\" id=\"' + #id + '_' + #optioncount + '_label\"';\n\t\t\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += '>' + (#option -> value) + '</label> ';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#renderfield += '</div>\\n';\n\t\t\t\t\tcase: 'select';\n\t\t\t\t\t\t#renderfield += '<select '\n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ (#onefield -> (find: 'multiple') ? ' multiple')\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' );\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\tif: #renderfield >> 'onchange=\"';\n\t\t\t\t\t\t\t\t#renderfield -> (replace: 'onchange=\"', 'onchange=\"makedirty();');\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += ' onchange=\"makedirty()\"';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += '>\\n';\n\t\t\t\t\t\tif: (#onefield -> (find: 'default')) != '' && (#onefield -> (find: 'size')) <= 1;\n\t\t\t\t\t\t\t#renderfield += '<option'\n\t\t\t\t\t\t\t\t+ ' value=\"\">' + (encode_html: (#onefield -> (find: 'default'))) + '</option>\\n';\n\t\t\t\t\t\t\t#renderfield += '<option'\n\t\t\t\t\t\t\t\t+ ' value=\"\"></option>\\n';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tlocal: 'optgroup_open'=false;\n\t\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\t\tif: #option -> name == '-optgroup';\n\t\t\t\t\t\t\t\tif: #optgroup_open;\n\t\t\t\t\t\t\t\t\t#renderfield += '</optgroup>\\n';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\tif: #option -> value != '-optgroup';\n\t\t\t\t\t\t\t\t\t#renderfield += '<optgroup label=\"' + (#option -> value) + '\">\\n';\n\t\t\t\t\t\t\t\t\t#optgroup_open = true;\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += '<option'\n\t\t\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #option -> name) + '\"';\n\t\t\t\t\t\t\t\tif: #option -> name != '' && #fieldvalue_array >> #option -> name;\n\t\t\t\t\t\t\t\t\t#renderfield +=' selected=\"selected\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield +=  '>' + (encode_html: #option -> value) + '</option>\\n';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\tif: #optgroup_open;\n\t\t\t\t\t\t\t#renderfield += '</optgroup>\\n';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += '</select>\\n';\n\t\t\t\t\tcase: 'submit';\n\t\t\t\t\t\t#renderfield += '<input type=\"submit\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\tif: (self -> formmode) == 'add' \n\t\t\t\t\t\t\t&& !(#onefield -> (find: 'disabled')) // already disabled\n\t\t\t\t\t\t\t&& (#onefield -> (find: 'originaltype') == 'savebutton' || #onefield -> (find: 'originaltype') == 'deletebutton'\n\t\t\t\t\t\t\t|| #onefield -> (find: 'name') == 'button_save' || #onefield -> (find: 'name') == 'button_delete');\n\t\t\t\t\t\t\t#renderfield += ' disabled=\"disabled\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') \n\t\t\t\t\t\t\t&& (#onefield -> (find: 'name') == 'button_delete' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'originaltype') == 'deletebutton' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'confirmmessage') != '');\n\t\t\t\t\t\t\tlocal: 'confirmmessage'=(#onefield -> (find: 'confirmmessage') != '' \n\t\t\t\t\t\t\t\t? #onefield -> (find: 'confirmmessage') | 'Really delete?');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\"', '&quot;');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\\'', '\\\\\\'');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"return confirm(\\'' + #confirmmessage +  '\\')\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'reset';\n\t\t\t\t\t\t#renderfield += '<input type=\"reset\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\tif: !(self -> 'noscript') && #onefield -> (find: 'confirmmessage') != '';\n\t\t\t\t\t\t\tlocal: 'confirmmessage'=#onefield -> (find: 'confirmmessage');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\"', '&quot;');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\\'', '\\\\\\'');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"if(confirm(\\'' + #confirmmessage +  '\\')){makeundirty();return true}else{return false};\"';\n\t\t\t\t\t\telse: !(self -> 'noscript');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"makeundirty();\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'image';\n\t\t\t\t\t\t#renderfield += '<input type=\"image\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\tif: (self -> formmode) == 'add' && \n\t\t\t\t\t\t\t(#onefield -> (find: 'originaltype') == 'savebutton' || #onefield -> (find: 'originaltype') == 'deletebutton'\n\t\t\t\t\t\t\t|| #onefield -> (find: 'name') == 'button_save' || #onefield -> (find: 'name') == 'button_delete');\n\t\t\t\t\t\t\t#renderfield += ' disabled=\"disabled\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript')\n\t\t\t\t\t\t\t&& (#onefield -> (find: 'name') == 'button_delete' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'originaltype') == 'deletebutton' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'confirmmessage') != '');\n\t\t\t\t\t\t\tlocal: 'confirmmessage'=(#onefield -> (find: 'confirmmessage') != '' \n\t\t\t\t\t\t\t\t? #onefield -> (find: 'confirmmessage') | 'Really delete?');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\"', '&quot;');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\\'', '\\\\\\'');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"return confirm(\\'' + #confirmmessage +  '\\')\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'file';\n\t\t\t\t\t\t#renderfield += '<input type=\"file\"' \n\t\t\t\t\t\t\t+ #renderfield_base;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\tif: #renderfield >> 'onchange=\"';\n\t\t\t\t\t\t\t\t#renderfield -> (replace: 'onchange=\"', 'onchange=\"makedirty();');\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += ' onchange=\"makedirty()\"';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\t/select;\n\t\t\t\t\t#renderrow -> (replace: '#field#', #renderfield);\n\t\t\t\t\t#output += #renderrow;\n\t\t\t\t/if; \n\t\t\t/iterate;\n\t\t\t\n\t\t\t\t\n\t\t/if; //  !(local_defined: 'start') && !(local_defined: 'end');\n\n\t\t// Add just the needed scripts to support the client side functionality\n\t\tif(!(self -> 'noscript'));\n\t\t\t#output >> 'togglecontrol(' \n\t\t\t\t? self -> (afterhandler: -endscript='function togglecontrol(obj){\n\t\t\t\t\t// toggles checkboxes and radios when clicking on label (for browsers that don´t support this already)\n\t\t\t\t\tswitch (obj.type){\n\t\t\t\t\tcase \\'checkbox\\':\n\t\t\t\t\t\tobj.checked=!obj.checked;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \\'radio\\':\n\t\t\t\t\t\tobj.checked=true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}');\n\t\t\t#output >> 'setHint('\n\t\t\t\t? \t\tself -> (afterhandler: -endscript='function setHint(myField, hint) {\n\t\t\t\t\tif(myField.value==\\'\\') {\n\t\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') != 0) {\n\t\t\t\t\t\t\tmyField.name=\\'off_\\' + myField.name;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmyField.value=hint;\n\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'#aaa\\';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction clearHint(myField) {\n\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') == 0) {\n\t\t\t\t\t\tmyField.name=myField.name.substr(4);\n\t\t\t\t\t\tmyField.value=\\'\\';\n\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'black\\';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction getStyleObject(objectId) {\n\t\t\t\t\tif(document.getElementById && document.getElementById(objectId)) {\n\t\t\t\t\treturn document.getElementById(objectId).style;\n\t\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}');\n\t\t\n\t\t\t#output >> 'makedirty(' || #output >> 'validateform('\n\t\t\t\t? self -> (afterhandler: -endscript='\n\t\t\t\tvar dirty=' + ((self -> 'errors') -> size ? 'true' | 'false') + ';\n\t\t\t\tvar dirtycheckname=null;\n\t\t\t\tvar dirtycheckvalue=null;\n\t\t\t\tvar submitBlock=false;\n\t\t\t\tfunction validateform(myForm) {\n\t\t\t\t\t// perform validation of myForm here\n\t\t\t\t\tif(submitBlock){return false};\n\t\t\t\t\tmakeundirty();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction dirtyvalue(obj){ // to be called at keydown to track if a text field changes or if arrow keys/tab/cmd-keys are pressed\n\t\t\t\t\t dirtycheckname = obj.name;\n\t\t\t\t\t dirtycheckvalue = obj.value;\n\t\t\t\t}\n\t\t\t\tfunction makeundirty(){\n\t\t\t\t\tdirty=false; \n\t\t\t\t\tdirtymarker();\n\t\t\t\t\twindow.onbeforeunload=null;\n\t\t\t\t}\n\t\t\t\tfunction makedirty(obj){\n\t\t\t\t\tif(obj){ // if object is specified then we are tracking if the value changes through keydown/keyup \n\t\t\t\t\t\tif (obj.value == dirtycheckvalue || obj.name != dirtycheckname) { // no change or tabbed to another field - return immediately\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdirty=true; \n\t\t\t\t\tdirtymarker();\n\t\t\t\t}\n\t\t\t\tfunction checkdirty(){\n\t\t\t\t\tif(dirty){\n\t\t\t\t\t\treturn confirm(\\'' + (self -> 'unsavedwarning') + '\\')\n\t\t\t\t\t} else {return true}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction dirtymarker() {\n\t\t\t\t\tvar obj = document.getElementById(\\'' + (self -> 'unsavedmarker') + '\\');\n\t\t\t\t\tif(dirty && obj){\n\t\t\t\t\t\tjscss(\\'add\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t}else if(obj) {\n\t\t\t\t\t\tjscss(\\'remove\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction jscss(a,o,c1,c2){\n\t\t\t\t\t/*\n\t\t\t\t\t\ta = action: swap, add, remove, check\n\t\t\t\t\t\to = object\n\t\t\t\t\t\tc1 = name of the class (first class for swap)\n\t\t\t\t\t\tc2 = for swap, name of the second class\n\t\t\t\t\t\thttp://onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html\n\t\t\t\t\t*/\n\t\t\t\t\tswitch (a){\n\t\t\t\t\t\tcase \\'swap\\':\n\t\t\t\t\t\t\to.className=!jscss(\\'check\\',o,c1)?o.className.replace(c2,c1): o.className.replace(c1,c2);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \\'add\\':\n\t\t\t\t\t\t\tif(!jscss(\\'check\\',o,c1)){o.className+=o.className?\\' \\'+c1:c1;}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \\'remove\\':\n\t\t\t\t\t\t\tvar rep=o.className.match(\\' \\'+c1)?\\' \\'+c1:c1;\n\t\t\t\t\t\t\to.className=o.className.replace(rep,\\'\\');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \\'check\\':\n\t\t\t\t\t\t\treturn new RegExp(\\'\\\\\\\\b\\'+c1+\\'\\\\\\\\b\\').test(o.className);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(dirty) {makedirty()};');\n\t\t\t\t\n\t\t\t\t(self -> 'unsavedwarning') != '' \n\t\t\t\t\t? self -> (afterhandler: -endscript='function beforeunload() {\n\t\t\t\t\tif(dirty) {return \\'' + (self -> 'unsavedwarning') + '\\';}\n\t\t\t\t}\n\t\t\t\twindow.onbeforeunload=beforeunload;');\n\t\t\t\t\n\t\t\t\t#output >> 'submitOk'\n\t\t\t\t\t? self -> (afterhandler: -endscript='function submitOk(e) { // prevents submit-on-enter\n\t\t\t\t\tvar keynum;\n\t\t\t\t\tvar elTarget;\n\t\t\t\t\tvar elType;\n\t\t\n\t\t\t\t\t// get keycode for the event \n\t\t\t\t\tif(window.event) keynum = e.keyCode; // IE\n\t\t\t\t\telse if(e.which) keynum = e.which; // DOM\n\t\t\n\t\t\t\t\t// get target\n\t\t\t\t\tif (e.target) elTarget = e.target;\n\t\t\t\t\telse if (e.srcElement) elTarget = e.srcElement;\n\t\t\n\t\t\t\t\tif(elTarget.tagName.toLowerCase()  == \\'input\\') elType = elTarget.getAttribute(\\'type\\').toLowerCase();\n\t\t\t\t\tsubmitBlock=false;\n\t\t\t\t\tif (elType != \\'submit\\' && elType != \\'image\\' && elType != \\'reset\\') {\n\t\t\t\t\t\t// allow enter submit when submit button/image or reset button has focus\n\t\t\t\t\t\tif (keynum==13) submitBlock=true;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}');\n\t\t\t/if; // noscript\n\n\t\tif: false && $knop_form_renderform_counter <= 1;\n\t\t\t\t\t\t\t\t\t\tself -> (afterhandler: -headscript=\n\t\t\t\t\t\t\t\t\t\t\t'function getStyleObject(objectId) {\n\t\t\t\t\t\t\t\t\t\t\t\tif(document.getElementById && document.getElementById(objectId)) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn document.getElementById(objectId).style;\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction jscss(a,o,c1,c2){\n\t\t\t\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\t\t\t\ta = action: swap, add, remove, check\n\t\t\t\t\t\t\t\t\t\t\t\t\to = object\n\t\t\t\t\t\t\t\t\t\t\t\t\tc1 = name of the class (first class for swap)\n\t\t\t\t\t\t\t\t\t\t\t\t\tc2 = for swap, name of the second class\n\t\t\t\t\t\t\t\t\t\t\t\t\thttp://onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html\n\t\t\t\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\t\t\t\tswitch (a){\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'swap\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\to.className=!jscss(\\'check\\',o,c1)?o.className.replace(c2,c1): o.className.replace(c1,c2);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'add\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(!jscss(\\'check\\',o,c1)){o.className+=o.className?\\' \\'+c1:c1;}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'remove\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar rep=o.className.match(\\' \\'+c1)?\\' \\'+c1:c1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\to.className=o.className.replace(rep,\\'\\');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'check\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn new RegExp(\\'\\\\\\\\b\\'+c1+\\'\\\\\\\\b\\').test(o.className);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction togglecontrol(obj){\n\t\t\t\t\t\t\t\t\t\t\t\t// toggles checkboxes and radios when clicking on label (for browsers that don´t support this already)\n\t\t\t\t\t\t\t\t\t\t\t\tswitch (obj.type){\n\t\t\t\t\t\t\t\t\t\t\t\tcase \\'checkbox\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\tobj.checked=!obj.checked;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\tcase \\'radio\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\tobj.checked=true;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction setHint(myField, hint) {\n\t\t\t\t\t\t\t\t\t\t\t\tif(myField.value==\\'\\') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') != 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.name=\\'off_\\' + myField.name;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.value=hint;\n\t\t\t\t\t\t\t\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'#aaa\\';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction clearHint(myField) {\n\t\t\t\t\t\t\t\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') == 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.name=myField.name.substr(4);\n\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.value=\\'\\';\n\t\t\t\t\t\t\t\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'black\\';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tvar dirty=' + ((self -> 'errors') -> size ? 'true' | 'false') + ';\n\t\t\t\t\t\t\t\t\t\t\tvar dirtycheckname=null;\n\t\t\t\t\t\t\t\t\t\t\tvar dirtycheckvalue=null;\n\t\t\t\t\t\t\t\t\t\t\tvar submitBlock=false;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction validateform(myForm) {\n\t\t\t\t\t\t\t\t\t\t\t\t// perform validation of myForm here\n\t\t\t\t\t\t\t\t\t\t\t\tif(submitBlock){return false};\n\t\t\t\t\t\t\t\t\t\t\t\tmakeundirty();\n\t\t\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction dirtyvalue(obj){ // to be called at keydown to track if a text field changes or if arrow keys/tab/cmd-keys are pressed\n\t\t\t\t\t\t\t\t\t\t\t\t dirtycheckname = obj.name;\n\t\t\t\t\t\t\t\t\t\t\t\t dirtycheckvalue = obj.value;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction makeundirty(){\n\t\t\t\t\t\t\t\t\t\t\t\tdirty=false; \n\t\t\t\t\t\t\t\t\t\t\t\tdirtymarker();\n\t\t\t\t\t\t\t\t\t\t\t\twindow.onbeforeunload=null;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction makedirty(obj){\n\t\t\t\t\t\t\t\t\t\t\t\tif(obj){ // if object is specified then we are tracking if the value changes through keydown/keyup \n\t\t\t\t\t\t\t\t\t\t\t\t\tif (obj.value == dirtycheckvalue || obj.name != dirtycheckname) { // no change or tabbed to another field - return immediately\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tdirty=true; \n\t\t\t\t\t\t\t\t\t\t\t\tdirtymarker();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction checkdirty(){\n\t\t\t\t\t\t\t\t\t\t\t\tif(dirty){\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn confirm(\\'' + (self -> 'unsavedwarning') + '\\')\n\t\t\t\t\t\t\t\t\t\t\t\t} else {return true}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction beforeunload() {\n\t\t\t\t\t\t\t\t\t\t\t\tif(dirty) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn \\'' + (self -> 'unsavedwarning') + '\\';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction dirtymarker() {\n\t\t\t\t\t\t\t\t\t\t\t\tvar obj = document.getElementById(\\'' + (self -> 'unsavedmarker') + '\\');\n\t\t\t\t\t\t\t\t\t\t\t\tif(dirty && obj){\n\t\t\t\t\t\t\t\t\t\t\t\t\tjscss(\\'add\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t\t\t\t\t\t\t\t}else if(obj) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tjscss(\\'remove\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t' + ((self -> 'unsavedwarning') != '' ? 'window.onbeforeunload=beforeunload;') + '\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction submitOk(e) { // prevents submit-on-enter\n\t\t\t\t\t\t\t\t\t\t\t\tvar keynum;\n\t\t\t\t\t\t\t\t\t\t\t\tvar elTarget;\n\t\t\t\t\t\t\t\t\t\t\t\tvar elType;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// get keycode for the event \n\t\t\t\t\t\t\t\t\t\t\t\tif(window.event) keynum = e.keyCode; // IE\n\t\t\t\t\t\t\t\t\t\t\t\telse if(e.which) keynum = e.which; // DOM\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// get target\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.target) elTarget = e.target;\n\t\t\t\t\t\t\t\t\t\t\t\telse if (e.srcElement) elTarget = e.srcElement;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tif(elTarget.tagName.toLowerCase()  == \\'input\\') elType = elTarget.getAttribute(\\'type\\').toLowerCase();\n\t\t\t\t\t\t\t\t\t\t\t\tsubmitBlock=false;\n\t\t\t\t\t\t\t\t\t\t\t\tif (elType != \\'submit\\' && elType != \\'image\\' && elType != \\'reset\\') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t// allow enter submit when submit button/image or reset button has focus\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (keynum==13) submitBlock=true;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t');\n\t\t/if;\n\t\tif: !(self -> 'noscript') && #usehint -> size > 0;\n\t\t\tlocal: 'hintscript'=string;\n\t\t\t// #usehint is a pair array with name=id\n\t\t\titerate: #usehint, (local: 'hintfield');\n\t\t\t\tif: (self -> 'fields') >> #hintfield -> name;\n\t\t\t\t\t#onefield = (self -> 'fields') -> (find: #hintfield -> name) -> first -> value;\n\t\t\t\t\t#hintscript += 'setHint(document.getElementById(\\'' + (encode_html: #hintfield -> value) + '\\'), \\'' \n\t\t\t\t\t\t+ (#onefield -> (find: 'hint')) + '\\');\\n';\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t\n\t\t\tself -> (afterhandler: -endscript=#hintscript);\n\t\t/if;\n\t\tif: !(self -> 'noscript') && #focusfield != '';\n\t\t\tself -> (afterhandler: -endscript='document.getElementById(\\'' + #focusfield + '\\').focus();document.getElementById(\\'' + #focusfield + '\\').select();');\n\t\t/if;\n\n\t\tif: (self -> 'render_fieldset_open') && (params -> size == 0 || (local_defined: 'end'));\n\t\t\t// inner fieldset is open\n\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t#output += '</fieldset>\\n';\n\t\t/if;\n\t\tif: (self -> 'render_fieldset2_open') && (local_defined: 'legend');\n\t\t\t// inner fieldset is open\n\t\t\t(self -> 'render_fieldset2_open') = false;\n\t\t\t#output += '</fieldset>\\n';\n\t\t/if;\n\n\t\tif: #renderformEndTag;\n\t\t\tif: (self -> 'fieldset');\n\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t/if;\n\t\t\n\t\t\t// render closing form tag\n\t\t\t#output += '</form>';\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'renderhtml', -description='Outputs form data as plain HTML, a specific field, a range of fields or all fields of a specific type. \\\n\t\t\tSome form field types are excluded, such as submit, reset, file etc. \\\n\t\t\tUse form -> setformat first to specify the html format, otherwise default format #label#: #field#<br> is used.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-name (optional) Render only the specified field\\n\\\n\t\t\t-from (optional) Render fields from the specified number index or field name\\n\\\n\t\t\t-to (optional) Render fields to the specified number index or field name\\n\\\n\t\t\t-type (optional) Only render fields of this or these types (string or array)\\n\\\n\t\t\t-excludetype (optional) Render fields except of this or these types (string or array)\\n\\\n\t\t\t-legend (optional) Groups the rendered fields in a fieldset and outputs a legend for the fieldset\\n\\\n\t\t\t-xhtml (optional flag) XHTML valid output',\n\t\t-optional='name', -copy,\t// field name\n\t\t-optional='from', -copy, \t// number index or field name\n\t\t-optional='to', -copy, \t\t// number index or field name\n\t\t-optional='type', -copy,\t// only output fields of this or these types (string or array)\n\t\t-optional='excludetype', -copy,\t// do not output fields of this or these types (string or array)\n\t\t-optional='legend',\t\t\t// groups the rendered fields in a fieldset and outputs a legend for the fieldset\n\t\t-optional='xhtml';\t\t\t// boolean, if set to true adjust output for XHTML\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: 'output'=string, \n\t\t\t'onefield'=map, \n\t\t\t'renderfield'=string, \n\t\t\t'renderfield_base'=string, \n\t\t\t'renderrow'=string,\n\t\t\t'fieldvalue'=string,\n\t\t\t'fieldvalue_array'=array,\n\t\t\t'options'=array,\n\t\t\t'usehint'=array;\n\n\t\t\n\t\t// local var that adjust tag endings if rendered for XHTML\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\t(local_defined: 'name') && !((self -> 'fields') >> #name) \t? \treturn;\n\n\t\t(local_defined: 'name')\t\t? local: 'from'=#name, 'to'=#name;\n\t\t!(local_defined: 'from') \t\t? local: 'from'=1;\n\t\t!(local_defined: 'to') \t\t\t? local: 'to'=(self -> 'fields') -> size;\n\t\t!(local_defined: 'type')\t\t? local: 'type'=(self -> 'validfieldtypes');\n\t\t!(local_defined: 'excludetype')\t? local: 'excludetype'=map;\n\t\t#type -> type == 'string' \t\t? #type = (map: #type);\n\t\t#excludetype -> type == 'string' ? #excludetype = (map: #excludetype);\n\n\t\t// use field name if #from is a string\n\t\t#from -> type == 'string' ? #from = integer: ((self -> 'fields') -> (findindex: #from) -> first);\n\t\t#from == 0 ? #from = 1;\n\t\t// negative numbers count from the end\n\t\t#from < 0 ? #from = (self -> 'fields') -> size + #from;\n\n\t\t// use field name if #to is a string\n\t\t#to -> type == 'string' ? #to = integer: ((self -> 'fields') -> (findindex: #to) -> last);\n\t\t#to == 0 ? #to = (self -> 'fields') -> size;\n\t\t// negative numbers count from the end\n\t\t#to < 0 ? #to = (self -> 'fields') -> size + #to;\n\n\t\t//Sanity check\n\t\t#from > #to ? #to = #from;\n\n\t\tlocal: 'template'=( (self -> 'template') != '' \n\t\t\t? (self -> 'template') \t\t\n\t\t\t| '#label#: #field#<br' + #endslash + '>\\n' );\n\t\tlocal: 'buttontemplate'=( (self -> 'buttontemplate') != '' \n\t\t\t? (self -> 'buttontemplate') \t\t\n\t\t\t| (self -> 'template') != '' \n\t\t\t? (self -> 'template')\n\t\t\t| '#field#\\n' );\n\t\tlocal: 'defaultclass'=( (self -> 'class') != '' \n\t\t\t? (self -> 'class') \t\t\n\t\t\t| '');\n\t\tif: (local_defined: 'legend');\n\t\t\t#output += '<fieldset>\\n'\n\t\t\t\t+ '<legend>' + #legend + '</legend>\\n';\n\t\t\t(self -> 'render_fieldset2_open') = true;\n\t\t/if;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t#onefield = #fieldpair -> value;\n\t\t\t#fieldvalue = (#onefield -> (find: 'value'));\n\t\t\t#fieldvalue_array = #fieldvalue;\n\t\t\tif: #fieldvalue_array -> type != 'array';\n\t\t\t\tif: #fieldvalue_array >> '\\r'; // Filemaker value list with multiple checked\n\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: '\\r');\n\t\t\t\telse: #fieldvalue_array >> ','; // Other database with multiple checked\n\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: ',');\n\t\t\t\telse;\n\t\t\t\t\t#fieldvalue_array = array: #fieldvalue_array;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: #onefield >> 'options';\n\t\t\t\t#options = (#onefield -> find: 'options');\n\t\t\t\t// convert types for pair \n\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\tif: #option -> type != 'pair';\n\t\t\t\t\t\t#option = (pair: #option = #option);\n\t\t\t\t\t/if;\n\t\t\t\t\t// name must be string to make sure comparsions work\n\t\t\t\t\t(#option -> name) = (string: #option -> name);\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\tif: loop_count >= #from \n\t\t\t\t&& loop_count <= #to\n\t\t\t\t&& #type >> #onefield -> (find: 'type')\n\t\t\t\t&& !(#excludetype >> #onefield -> (find: 'type'));\n\n\t\t\t\tif: #onefield -> (find: 'template') -> size;\n\t\t\t\t\t#renderrow = #onefield -> (find: 'template');\n\t\t\t\telse: (map: 'submit', 'reset', 'image') >> #onefield -> (find: 'type');\n\t\t\t\t\t#renderrow=#buttontemplate;\n\t\t\t\telse;\n\t\t\t\t\t#renderrow=#template;\n\t\t\t\t/if;\n\n\t\t\t\tif: (self -> 'exceptionfieldtypes') >> (#onefield -> (find: 'type'));\n\t\t\t\t\t#renderrow -> (replace: '#label#:', '');\n\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\telse: (#onefield -> (find: 'label')) != '';\n\t\t\t\t\t#renderrow -> (replace: '#label#', (#onefield -> (find: 'label') ));\n\t\t\t\telse: \n\t\t\t\t\t#renderrow -> (replace: '#label#:', '');\n\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t/if;\n\t\t\t\tif: (map: 'radio', 'checkbox', 'select') >> (#onefield -> (find: 'type'));\n\t\t\t\t\t#renderfield = string;\n\t\t\t\t\titerate: #fieldvalue_array, local: 'onefieldvalue';\n\t\t\t\t\t\tif: loop_count > 1;\n\t\t\t\t\t\t\t#renderfield += ( (#onefield -> find: 'linebreak') ? '<br' + #endslash + '>\\n' | ', ');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: #options >> #onefieldvalue;\n\t\t\t\t\t\t\t// show the display text for a selected option\n\t\t\t\t\t\t\t#renderfield += (encode_break: (#options -> (find: #onefieldvalue) -> first -> value));\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t// show the option value itself\n\t\t\t\t\t\t\t#renderfield += (encode_break: #onefieldvalue);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/iterate;\n\t\t\t\telse: (#onefield -> (find: 'type')) == 'html';\n\t\t\t\t\t#renderrow = #template;\n\t\t\t\t\t#renderrow -> (replace: '#label#:', '');\n\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t\t#renderrow -> (replace: '#required#', '');\n\t\t\t\t\t#renderfield = #fieldvalue + '\\n';\n\t\t\t\telse: (#onefield -> (find: 'type')) == 'legend';\n\t\t\t\t\t#renderrow = '';\n\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t/if;\n\t\t\t\t\t#output += '<fieldset>\\n';\n\t\t\t\t\t#output += '<legend>' + (encode_html: #fieldvalue) + '</legend>';\n\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\telse: (#onefield -> (find: 'type')) == 'fieldset';\n\t\t\t\t\t#renderrow = '';\n\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t/if;\n\t\t\t\t\tif: #fieldvalue != false;\n\t\t\t\t\t\t#output += '<fieldset>\\n<legend></legend>'; // must contain a legend\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\t#renderfield = (encode_break: #fieldvalue);\n\t\t\t\t/if;\n\t\t\t\t#renderrow -> (replace: '#field#', #renderfield);\n\t\t\t\t#output += #renderrow;\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: (local_defined: 'legend') && (self -> 'render_fieldset2_open');\n\t\t\t// inner fieldset is open\n\t\t\t(self -> 'render_fieldset2_open') = false;\n\t\t\t#output += '</fieldset>\\n';\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t/define_tag;\n\n\tdefine_tag: 'getvalue', -description='Returns the current value of a form field. Returns an array for repeated form fields. ',\n\t\t-required='name', -type='string',\n\t\t-optional='index', -type='integer', -copy;\n\t\t!local_defined('index') ? local('index' = 1);\n\t\t#index < 1 ? #index = 1;\n\t\tif: (self -> 'fields') >> #name;\n\t\t\tif(#index > (self -> 'fields') -> find(#name) -> size);\n\t\t\t\treturn;\n\t\t\t/if;\n\t\t\treturn: (self -> 'fields') -> (find: #name) -> get(#index) -> value -> (find: 'value');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'getlabel', -description='Returns the label for a form field. ',\n\t\t-required='name', -type='string';\n\t\tif: (self -> 'fields') >> #name;\n\t\t\treturn: (self -> 'fields') -> (find: #name) -> first -> value -> (find: 'label');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'setvalue', -description='Sets the value for a form field. \\\n\t\t\t\tEither form -> (setvalue: fieldname=newvalue) or form -> (setvalue: -name=fieldname, -value=newvalue)',\n\t\t-required='name',\n\t\t-optional='value',\n\t\t-optional='index', -type='integer', -copy;\n\t\tlocal: 'timer'=knop_timer; \n\t\t// either -> (setvalue: 'fieldname'='newvalue') or -> (setvalue: -name='fieldname', -value='newvalue')\n\t\tlocal: '_name'=#name, '_value'=(local: 'value');\n\t\t!local_defined('index') ? local('index' = 1);\n\t\t#index < 1 ? #index = 1;\n\t\tif: #name -> type == 'pair';\n\t\t\t#_name = #name -> name;\n\t\t\t#_value = #name -> value;\n\t\t/if;\n\t\tif: (self -> 'fields') >> #_name;\n\t\t\tif(#index > (self -> 'fields') -> find(#_name) -> size);\n\t\t\t\treturn;\n\t\t\t/if;\n\t\t\t// first remove value to break reference\n\t\t\t((self -> 'fields') -> get((self -> 'fields') -> (findindex: #_name) -> get(#index)) -> value) -> (remove: 'value');\n\t\t\t((self -> 'fields') -> get((self -> 'fields') -> (findindex: #_name) -> get(#index)) -> value) -> (insert: 'value'=#_value);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'removefield', -description='Removes all form elements with the specified name from the form',\n\t\t-required='name', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\t\t(self -> 'fields') -> (removeall: #name);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'keys', -description='Returns an array of all field names';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=array;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t#output -> (insert: #fieldpair -> name);\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t/define_tag;\n\n\n\tdefine_tag: 'keyvalue'; \t\t\treturn: (self -> 'db_keyvalue');\t\t/define_tag;\n\tdefine_tag: 'lockvalue'; \t\t\treturn: (self -> 'db_lockvalue');\t\t/define_tag;\n\tdefine_tag: 'lockvalue_decrypted';\n\t\t(self -> 'database') -> type != 'database' ? return;\n\t\treturn: (decrypt_blowfish: (self -> 'db_lockvalue'), -seed=(self -> 'database' -> 'lock_seed'));\n\t/define_tag;\n\tdefine_tag: 'database'; \t\t\treturn: (self -> 'database');\t\t\t/define_tag;\n\n\tdefine_tag: 'formmode', -description='Returns add or edit after for -> init has been called';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (self -> getbutton) == 'add';\n\t\t\t// this is needed to keep the right form mode after a failed add\n\t\t\t(self -> 'formmode') = 'add';\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n \t\treturn: (self -> 'formmode');\n \t/define_tag;\n\n\tdefine_tag: 'error_code';\n\t\t// custom error_code for knop_form\n\t\tif: (self -> 'error_code');\n\t\t\treturn: integer: (self -> 'error_code');\n\t\telse: (self -> 'errors') -> type == 'array' && (self -> 'errors') -> size > 0;\n\t\t\t(self -> 'error_code') = 7101;\n\t\t\treturn: (self -> 'error_code');\n\t\telse;\n\t\t\treturn: 0;\n\t\t/if;\n\t/define_tag;\n\n\n\t\n\tdefine_tag: 'afterhandler', -description='Internal member tag. Adds needed javascripts through an atend handler that will be processed when the entire page is done. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-headscript (optional) A single script, will be placed before </head>  (or at top of page if </head> is missing)\\n\\\n\t\t\t-endscript (optional) Multiple scripts (no duplicates), will be placed before </body> (or at end of page if </body> is missing)',\n\t\t-optional='headscript', -type='string',\n\t\t-optional='endscript', -type='string';\n\t\t// adds needed javascripts through an atend handler that will be processed when the entire page is done\n\n\t\tif: !(var_defined: 'knop_afterhandler_data');\n\t\t\tvar: 'knop_afterhandler_data'=map;\n\t\t\tdefine_atend: { // this will run after the page is done processing\n\t\t\t\tif: $knop_afterhandler_data >> 'headscript';\n\t\t\t\t\t// put before </head> or at beginning of page\n\t\t\t\t\tlocal: 'scriptdata'='<script language=\"javascript\" type=\"text/javascript\">\\n/*<![CDATA[ */\\n' \n\t\t\t\t\t\t+ ($knop_afterhandler_data -> (find: 'headscript') -> join('\\n')) \n\t\t\t\t\t\t+ '\\n/* ]]> */\\n</script>\\n';\n\t\t\t\t\tif: content_body >> '</head>';\n\t\t\t\t\t\tcontent_body -> (replace: '</head>', #scriptdata + '</head>');\n\t\t\t\t\telse;\n\t\t\t\t\t\tcontent_body = #scriptdata + content_body;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif: $knop_afterhandler_data >> 'endscript';\n\t\t\t\t\t// put before </body> or at end of page\n\t\t\t\t\tlocal: 'scriptdata'='\\n\\n\\n\\n<script language=\"javascript\" type=\"text/javascript\">\\n/* <![CDATA[ */\\n' \n\t\t\t\t\t\t+ ($knop_afterhandler_data -> (find: 'endscript') -> join('\\n')) \n\t\t\t\t\t\t+ '\\n/* ]]> */\\n</script>\\n';\n\t\t\t\t\tif: content_body >> '</body>';\n\t\t\t\t\t\tcontent_body -> (replace: '</body>', #scriptdata + '</body>');\n\t\t\t\t\telse;\n\t\t\t\t\t\tcontent_body += #scriptdata;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t};\n\t\t/if;\n\t\t\n\t\tif: (local_defined: 'headscript');\n\t\t\t// add to current headscript\n\t\t\tif: $knop_afterhandler_data !>> 'headscript';\n\t\t\t\t$knop_afterhandler_data -> (insert: 'headscript' = array);\n\t\t\t/if;\n\t\t\tif: $knop_afterhandler_data -> (find: 'headscript') !>> #headscript;\n\t\t\t\t$knop_afterhandler_data -> (find: 'headscript') -> insert(#headscript);\n\t\t\t/if;\n\t\t/if;\n\t\tif: (local_defined: 'endscript');\n\t\t\t// add to current endscript\n\t\t\tif: $knop_afterhandler_data !>> 'endscript';\n\t\t\t\t$knop_afterhandler_data -> (insert: 'endscript' = array);\n\t\t\t/if;\n\t\t\tif: $knop_afterhandler_data -> (find: 'endscript') !>> #endscript;\n\t\t\t\t$knop_afterhandler_data -> (find: 'endscript') -> insert(#endscript);\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n/define_type;\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_form\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_grid\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'grid',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2011-01-01',\n\t\t'description'='Custom type to handle data grids (record listings).';\n\n/*\n\nCHANGE NOTES\n2011-01-01\tSP\tCorrection of invalid HTML in <thead> and <tr>\n2010-12-23\tSP\tCorrected pagination bug for -numbered.\n2010-11-17\tJC\tAdded -startwithfooter flag to grid->renderhtml.  This moves the footer before the column titles in the table header.\n2010-11-17\tJC\tChanged rawheader inclusion to work even if there's no quicksearch for a grid\n2010-05-14\tJC\tAdded span separation on grid footer for better styling\n2010-03-06\tSP\tChanged default behavior of ->sortparams and ->quicksearch with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->sortparams and ->quicksearch with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2010-01-27\tJC\tAdjusted the id support\n2010-01-25\tJC\tAdded support for optional id, used by table, quicksearch and quicksearch_reset\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-08-26\tJS\tCorrected prev/next links when no nav is defined for the grid object\n2009-06-29\tJS\t->renderlisting: documentation correction (renderlisting never calls renderfooter). \n2009-01-11\tJS\t->renderlisting: Made sure that template isn't applied on NULL field values since that would cause an error with ->replace \n2008-12-29\tJC\tSupport for optional classes in table header\n2008-11-27\tJC\t-> implemented support for td specific classes. The class is inserted in both the TH and TD tag for the specified field\n2008-09-24\tJS\t->sortparams: fieldnames specified by the -sort parameter are now validated so they exist in the database\n2008-09-24\tJS\t->sortparams, ->quicksearch: Added protection against backtick sql injection in MySQL object names\n2008-09-10\tJS\t-numbered can now be specified at oncreate in addition to  ->renderhtml and ->renderfooter. \n2008-09-08\tJS\t->sortfield changed so defaultsort is honored even if -nosort is specified (-nosort is only used to prevent the user from changing sort order on the fly)\n2008-09-08\tJS\t->renderlisting and ->renderfooter optimized by caching the result of nav->url. \n2008-05-15\tJS\t->renderfooter: minor adjustment to numbered pagination links\n2008-05-14\tJS\t->renderfooter (and ->renderhtml): added -numbered as option to get google style numbered pagination links. Render the grid with -numbered (defaults to show 6 page number links plus the far ends) or -numbered=10 or another number. \n2008-05-13\tJS\tAdded ->renderlisting which is now part of ->renderhtml for more flexibility\n2008-02-25\tJS\t->renderheader and ->renderfooter calls nav -> url with -getargs \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: addded -autoparams to nav -> url used in links since url was changed to default to no autoparams. \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: improved support for param based navigation method  in links, cleaned up linking to use nav -> url instead of self -> urlparams when nav is available\n2008-01-22\tJC\t->quicksearch: Changed wordseparators so that \\r and \\n aren't placed as \\r\\n, otherwise they are treated as a single character by ->split. \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-03\tJS\tAdded optional -language parameter to set the initial language for the grid object\n2007-12-03\tJS\tAdded -> lang to provide a reference to the knop_lang object that is used for localized strings\n2007-12-03\tJS\tAdded localized strings for English and Swedish\n2007-12-03\tJS\tAdded knop_lang to handle localized strings\n2007-11-11\tJC\tAdded optional -rawheader for extra header content to be inserted before the Quicksearch form\n2007-10-23\tJS\t->renderheader: added class=\"grid\" to the opening table tag to be able to isolate the css specifications\n2007-10-03\tJS\t->renderfooter: added unique classes for each type of prev/next link to be able to replace with images using css\n2007-10-03\tJS\t->renderfooter: Changed prev/next link texts to simple |< << >> >| instead of unicode glyphs\n2007-09-20\tJS\tPostparams are only sent along for nav params (not \"-\" params)\n2007-09-07\tJS\tAlso send postparams along in prev/next links (not only getparams)\n2007-09-06\tJS\tIf nav has params defined, those params will be sent along with prev/next links\n2007-09-06\tJS\tAdded encode_url for link params\n2007-09-06\tJS\tChanged -action to -formaction in the quicksearch form\n2007-08-08\tJS\t->urlargs: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\t->quicksearch: added \\r and \\n as word separators. \n2007-05-03\tJS\t->addfield: Added check for empty dbfield name before adding to dbfieldmap\n2007-04-19\tJS\t->quicksearch: added  -value (flag) that makes quicksearch output just the value of the quicksearch field instead of a query\n2007-04-13\tJS\t->oncreate: added -nosort as global flag (overrides column specific sort options)\n2007-04-13\tJS\t->renderfooter: Added tbody to footer to make it pass validation, but it's still not semantically correct. \n2007-04-13\tJS\tChanged field type for quicksearch for non-WebKit based browsers\n2007-04-10\tJS\t->quicksearch: Added @ as word separator for \"word begins with\" search\n2007-04-10\tJS\t->quicksearch: Added -contains as option to perform a simple contains search instead of emulating \"word begins with\" search\n2007-04-10\tJS\t->renderheader: When grid has a defaultsort, there should be no \"unsort\" option in the sortable headings\n2007-04-10\tJS\t->insert: (-defaultsort='desc') or (-defaultsort='descending') makes the default sort order sort in descending order\n2007-04-04\tJS\t->addfield: -template can now also be a compound expression\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tAdded support for FileMaker with quicksearch (untested)\n2007-03-01\tJS\tChanged all texts to English\n2007-02-07\tJS\tRemoved classs=\"first\" and class=\"notopborder\" since CSS border-collapse: collapse; eliminates the need\n2007-02-05\tJS The -keyvalue parameter for url edit links can be given another name by specifying -keyparamname in addfield\n2007-01-31\tJS\t->addfield: #value# can be used in -url, as a way to provide mailto links etc in lists\n2007-01-30\tJS\tSortable columns now thave three states instead of two: sorted ascending, sorted descending and unsorted. \n2007-01-30\tJS\tImprovements to quicksearch, to emulate \"word begins with\"  searches\n2007-01-26\tJS\tAdded support for quicksearch field in grid header. Specify -quicksearch at ->oncreate, and tell what fields to search by specifying -quicksearch for those fields at ->addfield. \n\t\t\t\tFields can be search only (no display) by leaving out name and label. All specified fields are searched word for word of thew search string. \n\t\t\t\tUse ->quicksearch to get the search parameters (optionally -sql)\n2007-01-26\tJS\tAdded ->urlargs to get a querystring with all \"-\" GET params, except those in optional -except string or array parameter. \n2007-01-22\tJS\tAdjustments to highlighting and \"(redigera)\"-link for records with empty values in the linked field\n2007-01-19\tJS\tAdded href titles to sort links and prevnext links\n2007-01-19\tJS\tCorrected sortparams when no sortfield is specified\n2007-01-19\tJS\tAddded go to first page, go to last page in footer\n2007-01-19\tJS\tAdded member tag page_skiprecords to help correcting out of bounds page numbers\n2007-01-19\tJS\tAdded member tag lastpage\n2007-01-18\tJS\tSupport for highlighting of affected record after edit or update (class name \"highlight\")\n2007-01-17\tJS\tAdded addfield: -template\n\nTODO\nMake it possible for knop_grid to work independently of a knop_database object so other types of listings can bre created. \nLanguage of quicksearch buttons can't be changed after the grid has been created\ntbody is used in renderfooter, which is not semantically correct. can't use tfoot though since the footer is rendered twice. \nMove templates to a member tag to be make it easier to subclass\nChange ->addfield to ->insert and make ->addfield deprecated\n\n*/\n\n\t// instance variables\n\tlocal: 'fields'=array,\n\t\t'dbfieldmap'=map,\n\t\t'sortfield'=string,\n\t\t'defaultsort'=string,\n\t\t'page'=integer,\n\t\t'sortdescending'=false,\n\t\t'database'=null,\n\t\t'nav'=null,\n\t\t'debug_trace'=array,\n\t\t'quicksearch'=string,\n\t\t'quicksearch_form',\n\t\t'quicksearch_form_reset',\n\t\t'rawheader' = string, // added by Jolle 071111\n\t\t'class' = string, // Added by Jolle 081229\n\t\t'tbl_id' = 'grid', // Added by Jolle 100125\n\t\t'qs_id' = 'quicksearch', // Added by Jolle 100125\n\t\t'qsr_id' = 'qs_reset', // Added by Jolle 100125\n\t\t'quicksearch_fields'=array,\n\t\t'footer' = string, // Added by Jolle 101117\n\t\t'lang'=(knop_lang: -default='en', -fallback),\t\t// language strings object \n\t\t'error_lang'=(knop_lang: -default='en', -fallback),\n\t\t'numbered'=false,\n\t\t'nosort';\n\n\t#lang -> (addlanguage: -language='en', -strings=(map: \n\t\t'quicksearch_showall' = 'Show all',\n\t\t'quicksearch_search' = 'Search',\n\t\t'linktext_edit' = '(edit)',\n\t\t'linktitle_showunsorted' = 'Show unsorted',\n\t\t'linktitle_changesort' = 'Change sort order to',\n\t\t'linktitle_ascending' = 'ascending',\n\t\t'linktitle_descending' = 'descending',\n\t\t'linktitle_sortascby' = 'Sort ascending by',\n\t\t'linktitle_gofirst' = 'Go to first page',\n\t\t'linktitle_goprev' = 'Go to previous page',\n\t\t'footer_shown' = '#1# - #2# of',\n\t\t'footer_found'='found',\n\t\t'linktext_gotopage'='Go to page', // SP customization\n\t\t'linktitle_gonext' = 'Go to next page',\n\t\t'linktitle_golast' = 'Go to last page',\n\n\t\t// language neutral strings, only need to be set for the default language\n\t\t'linktext_first'='|&lt;',\n\t\t'linktext_prev'='&lt;&lt;',\n\t\t'linktext_next'='&gt;&gt;',\n\t\t'linktext_last'='&gt;|'\n\t\t\t));\n\t\t\t\n\t#lang -> (addlanguage: -language='sv', -strings=(map: \n\t\t'quicksearch_showall' = 'Visa alla',\n\t\t'quicksearch_search' = 'Sök',\n\t\t'linktext_edit' = '(redigera)',\n\t\t'linktitle_showunsorted' = 'Visa osorterade',\n\t\t'linktitle_changesort' = 'Ändra sorteringsordning till',\n\t\t'linktitle_ascending' = 'stigande',\n\t\t'linktitle_descending' = 'fallande',\n\t\t'linktitle_sortascby' = 'Sortera i stigande ordning efter',\n\t\t'linktitle_gofirst' = 'Gå till första sidan',\n\t\t'linktitle_goprev' = 'Gå till föregående sida',\n\t\t'footer_shown' = '#1# - #2# av',\n\t\t'footer_found'='hittade',\n\t\t'linktext_gotopage'='Gå till sida', // SP cüstømizätiøn\n\t\t'linktitle_gonext' = 'Gå till nästa sida',\n\t\t'linktitle_golast' = 'Gå till sista sidan'\n\t));\n\t\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-database (required database) Database object that the grid object will interact with\\n\\\n\t\t\t-nav (optional nav) Navigation object to interact with\\n\\\n\t\t\t-quicksearch (optional) Label text for the quick search field\\n\\\n\t\t\t-rawheader (optional) Extra html to be inserted in the grid header\\n\\\n\t\t\t-class (optional) Extra classes to be inserted in the grid header. The standard class \"grid\" is always inserted\\n\\\n\t\t\t-id (optional) Creates a custom id used for table, quicksearch and quicksearch_reset\\n\\\n\t\t\t-nosort (optional flag) Global setting for the entire grid (overrides column specific sort options)\\n\\\n\t\t\t-language (optional) Language to use for the grid, defaults to the browser\\'s preferred language\\n\\\n\t\t\t-numbered (optional flag or integer) If specified, pagination links will be shown as page numbers instead of regular prev/next links. Defaults to 6 links, specify another number (minimum 6) if more numbers are wanted. Can be specified in ->renderhtml as well. ',\n\t\t-required='database', -type='database',\n\t\t-optional='nav', -type='nav',\n\t\t-optional='quicksearch',\n\t\t-optional='rawheader',\n\t\t-optional='class',\n\t\t-optional='id',\n\t\t-optional='nosort',\n\t\t-optional='language',\n\t\t-optional='numbered';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: 'lang'=@(self -> 'lang');\n\t\t\n\t\tif: (local_defined: 'language');\n\t\t\t#lang -> (setlanguage: #language);\n\t\t/if;\n\t\t\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('database') ? (self -> 'database' = @#database);\n\t\tlocal_defined('nav') ? (self -> 'nav' = @#nav);\n\n\t\t(self -> 'nosort')=local_defined('nosort');\n\n\t\tif(local_defined('numbered'));\n\t\t\t(self -> 'numbered')=((#numbered !== false) ? integer(#numbered) | false);\n\t\t/if;\n\t\t(local_defined('class') && #class -> type == 'string') ?\n\t\t\t(self -> 'class') = #class;\n\t\t\n\t\tif(local_defined('id') && #id -> type == 'string');\n\t\t\t(self -> 'tbl_id') = #id + '_grid';\n\t\t\t(self -> 'qs_id') = #id + '_quicksearch';\n\t\t\t(self -> 'qsr_id') = #id + '_qs_reset';\n\t\t/if;\n\n\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\tif: !(self -> 'nosort');\n\t\t\t(self -> 'sortfield') = (#clientparams >> '-sort' ? (#clientparams -> (find: '-sort') -> first -> value) | string);\n\t\t\t(self -> 'sortdescending') = (#clientparams >> '-desc');\n\t\t/if;\n\t\t(self -> 'page') = (#clientparams >> '-page' ? (integer: (#clientparams -> (find: '-page') -> first -> value)) | 1);\n\t\t(self -> 'page') < 1 ? (self -> 'page') = 1;\n\n\t\tif: (local_defined: 'quicksearch');\n\t\t\tif: #quicksearch != '';\n\t\t\t\t(self -> 'quicksearch') = #quicksearch;\n\t\t\telse;\n\t\t\t\t(self -> 'quicksearch') = 'Quicksearch';\n\t\t\t/if;\n\t\t\t(self -> 'quicksearch_form') = (knop_form: -name='quicksearch', -id = (self -> 'qs_id'), -formaction='./', -method='get', -template='#field#\\n', -noautoparams);\n\t\t\t(self -> 'quicksearch_form_reset') = (knop_form: -name='quicksearch_reset', -id = (self -> 'qsr_id'), -formaction='./', -method='get', -template='#field#\\n', -noautoparams);\n\t\t\tlocal: 'autosavekey'=server_name + response_path;\n\t\t\tif: (self -> 'nav') -> type =='nav' && (self -> 'nav') -> 'navmethod'=='param';\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='hidden', -name='-path', -value=((self -> 'nav') -> path));\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='hidden', -name='-path', -value=((self -> 'nav') -> path));\n\t\t\t\t#autosavekey -> (removetrailing: '/');\n\t\t\t\t#autosavekey += '/' + ((self -> 'nav') -> path);\n\t\t\t/if;\n\t\t\tif: (self -> 'sortfield') != '' && !(self -> 'nosort');\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='hidden', -name='-sort', -value=(self -> 'sortfield'));\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='hidden', -name='-sort', -value=(self -> 'sortfield'));\n\t\t\t\tif: (self -> 'sortdescending');\n\t\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='hidden', -name='-desc');\n\t\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='hidden', -name='-desc');\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: client_type >> 'WebKit';\n\t\t\t\t// only use<input type=search\" for WebKit based browsers like Safari\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='search', -name='-q', -hint=(self -> 'quicksearch'), \n\t\t\t\t\t-size=15, -id = (self -> 'qs_id') + '_q', -raw='autosave=\"' + #autosavekey + '\" results=\"10\"');\n\t\t\telse;\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='text', -name='-q', -hint=(self -> 'quicksearch'), \n\t\t\t\t\t-size=15, -id = (self -> 'qs_id') + '_q');\n\t\t\t/if;\n\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='submit', -name='s', -value=(#lang -> quicksearch_search));\n\t\t\tif: #clientparams >> '-q';\n\t\t\t\t(self -> 'quicksearch_form') -> (setvalue: '-q'=(#clientparams -> (find: '-q') -> first -> value));\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='submit', -name='a', -value=(#lang -> quicksearch_showall));\n\t\t\telse;\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='submit', -name='a', -value=(#lang -> quicksearch_showall), -disabled);\n\t\t\t/if;\n\t\t/if;\n\n\t\t/* Added by JC 071111 to handle extra form included in the header */\n\t\tif: (local_defined: 'rawheader');\n\t\t\tif: #rawheader -> type == 'string';\n\t\t\t\t(self -> 'rawheader') = #rawheader;\n\t\t\telse;\n\t\t\t\t(self -> 'rawheader') = '';\n\t\t\t/if;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'onassign', -required='value', -description='Internal, needed to restore references when ctype is defined as prototype';\n\t\t// recreate references here\n\t\t(self->'database') = @(#value -> 'database');\n\t\t(self->'nav') = @(#value -> 'nav');\n\t/define_tag;\n\n\tdefine_tag: 'lang', -description='Returns a reference to the language object';\n\t\treturn: @(self -> 'lang');\n\t/define_tag;\n\n\t\n\tdefine_tag: 'addfield', -description='Adds a column to the record listing. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-name (optional) Name of the field. If not specified, the field will be omitted from the grid. \\\n\t\t\t\tUseful to be able to quicksearch in fields not shown in the grid. \\\n\t\t\t\tIn that case -dbfield must be specified. \\n\\\n\t\t\t-label (optional) Column heading\\n\\\n\t\t\t-dbfield (optional) Corresponding database field name (name is used if dbfield is not specified)\\n\\\n\t\t\t-width (optional) Pixels (CSS width)\\n\\\n\t\t\t-url (optional) Columns will be linked with this url as base. Can contain #value# for example to create clickable email links. \\n\\\n\t\t\t-keyparamname (optional) Param name to use instead of the default -keyvalue for edit links\\n\\\n\t\t\t-defaultsort (optional flag) This field will be the default sort field\\n\\\n\t\t\t-nosort (optional flag) The field header should not be clickable for sort\\n\\\n\t\t\t-template (optional) Either string to format values, compound expression or map containing templates to display individual values in different ways, use -default to display unknown values, use #value# to insert the actual field value in the template. \\n\\t\\\n\t\t\t\tIf a compound expression is specified, the field value is passed as param to the expression and can be accessed as params. \\n\\t\\\n\t\t\t\tExample expressions: \\n\\t\\\n\t\t\t\t{return: params} to return just the field value as is\\n\\t\\\n\t\t\t\t{return: (date: (field: \"moddate\")) -> (format: \"%-d/%-m\")} to return a specific field as formatted date\\n\\\n\t\t\t-quicksearch (optional flag) If specified, the field will be used for search with quicksearch',\n\t\t-optional='name',\n\t\t-optional='label',\n\t\t-optional='dbfield',\n\t\t-optional='width',\n\t\t-optional='class',\n\t\t// -optional='raw',\t\t// TODO: not implemented \n\t\t-optional='url',\n\t\t-optional='keyparamname',\n\t\t-optional='defaultsort',\n\t\t-optional='nosort',\n\t\t-optional='template',\n\t\t-optional='quicksearch';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tfail_if: (local_defined: 'template') && #template -> type != 'string' \n\t\t\t&& #template -> type != 'map'  \n\t\t\t&& #template -> type != 'tag', -1, 'Template must be either string, map or compound expression';\n\t\tlocal: 'field'=map;\n\n\t\tlocal_defined('name') ? #field -> insert('name' = #name); \n\t\tlocal_defined('class') ? #field -> insert('class' = #class); \n\t\tlocal_defined('url') ? #field -> insert('url' = #url); \n\t\tlocal_defined('keyparamname') ? #field -> insert('keyparamname' = #keyparamname); \n\t\tlocal_defined('width') ? #field -> insert('width' = #width);\n\t\t#field !>> 'keyparamname' ? #field -> (insert: 'keyparamname' = '-keyvalue');\n\t\t\n\t\tif: (local_defined: 'template');\n\t\t\t#field -> (insert: 'template'=(#template -> type == 'string' ? (map: '-default'=#template) | #template));\n\t\t/if;\n\t\tif: (local_defined: 'name');\n\t\t\t#field -> (insert: 'label'=( (local_defined: 'label') ? #label | #name ) );\n\t\t\t#field -> (insert: 'dbfield'=( (local_defined: 'dbfield') ? #dbfield | #name ) );\n\t\t\t#field -> (insert: 'nosort'=(local_defined: 'nosort'));\n\t\t\tif(local_defined('defaultsort')\n\t\t\t\t//&& !(local_defined: 'nosort') \n\t\t\t\t&& (self -> 'defaultsort') == ''\n\t\t\t\t//&& !(self -> 'nosort')\n\t\t\t\t); \n\t\t\t\t(self -> 'defaultsort') = #name;\n\t\t\t\tif: (self -> 'sortfield') == '';\n\t\t\t\t\t(self -> 'sortfield') = (self -> 'defaultsort');\n\t\t\t\t\tif: #defaultsort == 'desc' || #defaultsort == 'descending';\n\t\t\t\t\t\t(self -> 'sortdescending') = true;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t(self -> 'dbfieldmap') -> (insert: #name = ((local_defined: 'dbfield') && #dbfield != '' ? #dbfield | #name));\n\t\t/if;\n\t\t(local_defined: 'quicksearch') ? (self -> 'quicksearch_fields') -> (insert: ((local_defined: 'dbfield') ? #dbfield | (local: 'name')));\n\t\t\n\t\tif(local_defined('name') || local_defined('label'));\n\t\t\t(self -> 'fields') -> (insert: #field);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'sortparams', -description='Returns a Lasso-style pair array with sort parameters to use in the search inline.\\n\\\n\t\tParameters:\\n\\\n\t\t-sql (optional)\\n\\\n\t\t-removedotbackticks (optional flag) Use with -sql for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.',\n\t\t-optional='sql',\n\t\t-optional='removedotbackticks';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: local_defined: 'sql';\n\t\t\tfail_if: (self -> 'database') -> 'isfilemaker', 7009, '-sql can not be used with FileMaker';\n\t\t\t(self -> 'sortfield') == '' ? return;\n\t\t\tlocal('output'=string);\n\t\t\tif: (self -> 'dbfieldmap') >> (self -> 'sortfield');\n\t\t\t\t#output=' ORDER BY ';\n\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t#output += '`' + knop_stripbackticks((self -> 'dbfieldmap') -> find(self -> 'sortfield')) + '`';\n\t\t\t\telse;\n\t\t\t\t\t#output += '`' + string_replace(knop_stripbackticks((self -> 'dbfieldmap') -> find(self -> 'sortfield')), -find='.', -replace='`.`') + '`';\n\t\t\t\t/if;\n\t\t\t\tif: (self -> 'sortdescending');\n\t\t\t\t\t#output += ' DESC';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\telse;\n\t\t\tlocal: 'output'=array;\n\t\t\t(self -> 'sortfield') == '' ? return: @#output;\n\t\t\tif: (self -> 'dbfieldmap') >> (self -> 'sortfield');\n\t\t\t\t#output -> (insert: -sortfield=(self -> 'dbfieldmap') -> (find: (self -> 'sortfield')) );\n\t\t\t\tif: (self -> 'sortdescending');\n\t\t\t\t\t#output -> (insert: -sortorder='descending');\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'quicksearch', -description='Returns a pair array with fieldname=value to use in a search inline. If you specify several fields in the grid as -quicksearch (visible or not), they will be treated as if they were one single concatenated field. Quicksearch will take each word entered in the search field and search for them in the combined set of quicksearch fields, performing a \"word begins with\" match (unless you specify -contains when calling -> quicksearch).\\n\\\n\t\t\tSo if you enter dev joh it will find records with firstname=Johan, occupation=Developer.\\n\\\n\t\t\tIf you\\'re familiar with how FileMaker performs text searches, this is the way quicksearch tries to behave.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-sql (optional flag) Return an SQL string for the search parameters instead.\\n\\\n\t\t\t-contains (optional flag) Perform a simple contains search instead of emulating \"word begins with\" search\\n\\\n\t\t\t-value (optional flag) Output just the search value of the quicksearch field instead of a pair array or SQL string\\n\\\n\t\t\t-removedotbackticks (optional flag) Use with -sql for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.',\n\t\t-optional='sql',\n\t\t-optional='contains',\n\t\t-optional='value',\n\t\t-optional='removedotbackticks';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: 'output'=array,\n\t\t\t'output_temp'=array,\n\t\t\t'_sql'=(local_defined: 'sql'), \n\t\t\t'wordseparators'=',.- (\"@\\n\\r', // \\r and \\n must not come after each other as \\r\\n, but \\n\\r is fine. \n\t\t\t'fieldvalue', 'onevalue', 'field', 'wordseparator';\n\t\tfail_if: #_sql && (self -> 'database') -> 'isfilemaker', 7009, '-sql can not be used with FileMaker';\n\n\t\t#wordseparators = #wordseparators -> (split: '');\n\t\tif: (self -> 'quicksearch_form') -> type != 'form';\n\t\t\tif: #_sql; \n\t\t\t\treturn: string;\n\t\t\telse;\n\t\t\t\treturn: array;\n\t\t\t/if;\n\t\t/if;\n\t\tif: local_defined: 'value';\n\t\t\treturn: string: ((self -> 'quicksearch_form') -> (getvalue: '-q'));\n\t\t/if;\n\t\t\n\t\t#fieldvalue = string: ((self -> 'quicksearch_form') -> (getvalue: '-q'));\n\t\tif: #fieldvalue != '';\n\t\t\tif: (self -> 'database') -> 'isfilemaker';\n\t\t\t\t#output -> (insert: -logicaloperator='or');\n\t\t\t\titerate: (self -> 'quicksearch_fields'), #field;\n\t\t\t\t\tif: (local_defined: 'contains');\n\t\t\t\t\t\t#output -> (insert:  -op = 'cn');\n\t\t\t\t\t/if;\n\t\t\t\t\t#output -> (insert:  #field = #fieldvalue);\n\t\t\t\t/iterate;\n\t\t\telse;\n\t\t\t\t// search each word separately\n\t\t\t\t#fieldvalue = #fieldvalue -> (split: ' ');\n\t\t\t\titerate: #fieldvalue, #onevalue;\n\t\t\t\t\t#output_temp = array;\n\t\t\t\t\titerate: (self -> 'quicksearch_fields'), #field;\n\t\t\t\t\t\tif: #_sql;\n\t\t\t\t\t\t\tif: (local_defined: 'contains');\n\t\t\t\t\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + knop_stripbackticks(encode_sql(#field)) + '`' \n\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + string_replace(knop_stripbackticks(encode_sql(#field)), -find='.', -replace='`.`') + '`' \n\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + knop_stripbackticks(encode_sql(#field)) + '`' \n\t\t\t\t\t\t\t\t\t+ ' LIKE \"' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + string_replace(knop_stripbackticks(encode_sql(#field)), -find='.', -replace='`.`') + '`' \n\t\t\t\t\t\t\t\t\t+ ' LIKE \"' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t// basic emulation of \"word begins with\"\n\t\t\t\t\t\t\t\titerate: #wordseparators, #wordseparator;\n\t\t\t\t\t\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + knop_stripbackticks(encode_sql(#field)) + '`' \n\t\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#wordseparator + #onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + string_replace(knop_stripbackticks(encode_sql(#field)), -find='.', -replace='`.`') + '`' \n\t\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#wordseparator + #onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\tif: (local_defined: 'contains');\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  -op='cn');\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  #field = #onevalue );\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  -op='bw');\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  #field = #onevalue );\n\t\t\t\t\t\t\t\tif: !(self -> 'database' -> 'isfilemaker');\n\t\t\t\t\t\t\t\t\t// this variant is not needed for FileMaker since it already searches with \"word begins with\" as default\t\t\t\t\t\t\t#output_temp -> (insert:  -op='cn');\n\t\t\t\t\t\t\t\t\titerate: #wordseparators, #wordseparator;\n\t\t\t\t\t\t\t\t\t\t#output_temp -> (insert:  -op='cn');\n\t\t\t\t\t\t\t\t\t\t#output_temp -> (insert:  #field = #wordseparator + #onevalue );\n\t\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/iterate;\n\t\t\t\t\tif: #_sql;\n\t\t\t\t\t\tif: #output_temp -> size > 1;\n\t\t\t\t\t\t\t#output_temp = '(' + #output_temp -> (join: ' OR ') + ')';\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t#output_temp = #output_temp -> first;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#output -> (insert: #output_temp);\n\t\t\t\t\telse;\n\t\t\t\t\t\tif: #output_temp -> size > 2;\n\t\t\t\t\t\t\t#output_temp -> (insert: -opbegin='or', 1);\n\t\t\t\t\t\t\t#output_temp -> (insert: -opend='or');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#output -> (merge: #output_temp);\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t\t\n\t\t\t\tif: #_sql;\n\t\t\t\t\tif: #output -> size;\n\t\t\t\t\t\t#output = '(' + #output -> (join: ' AND ') + ')';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output = string;\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\tif: #output -> size;\n\t\t\t\t\t\t#output -> (insert: -opbegin='and', 1);\n\t\t\t\t\t\t#output -> (insert: -opend='and');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/if; // isfilemaker\n\t\t/if; // #fieldvalue != ''\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\t\n\tdefine_tag: 'urlargs', -description='returns all get params that begin with - as a query string, for internal use in links in the grid. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-except (optional) Exclude these parameters (string or array)\\n\\\n\t\t\t-prefix (optional) For example ? or &amp; to include at the beginning of the querystring \\n\\\n\t\t\t-suffix (optional) For example &amp; to include at the end of the querystring',\n\t\t-optional='except', -copy,\n\t\t-optional='prefix',\t// for example ? or &amp; to include at the beginning of the querystring \n\t\t-optional='suffix';\t// for example &amp; to include at the end of the querystring\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=array, 'param'=null;\n\n\t\t// only getparams to not send along -action etc\n\t\tlocal: 'clientparams'=client_getparams;\n\n\t\t!(local_defined: 'except') ? local: 'except'=array;\n\t\t#except -> type != 'array' ? #except = array: #except;\n\t\t#except -> (insert: -session);\n\t\t\n\t\t// add getparams that begin with -\n\t\titerate: #clientparams, #param;\n\t\t\tif: #param -> type == 'pair';\n\t\t\t\tif: #param -> name -> (beginswith: '-') && #except !>> #param -> name;\n\t\t\t\t\t#output -> (insert: (encode_stricturl: #param -> name) + '=' + (encode_stricturl: #param -> value));\n\t\t\t\t/if;\n\t\t\telse; // just a string param (no pair)\n\t\t\t\tif: #param -> (beginswith: '-') && #except !>> #param;\n\t\t\t\t\t#output -> (insert: encode_stricturl: #param);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\n\t\tif: self -> 'nav' -> isa('nav');\n\t\t\t// send params that have been defined as -params in nav\n\t\t\tlocal: 'navitem'=self -> 'nav' -> getnav;\n\t\t\t// add post params\n\t\t\t#clientparams -> (merge: client_postparams);\n\n\t\t\titerate: #navitem -> (find: 'params'), #param;\n\t\t\t\tif: #clientparams >> #param && #clientparams -> (find: #param) -> first -> type == 'pair';\n\t\t\t\t\t#output -> (insert: (encode_stricturl: #clientparams -> (find: #param) -> first -> name) +  '=' + (encode_stricturl: #clientparams -> (find: #param) -> first -> value));\n\t\t\t\telse: #clientparams >> #param;\n\t\t\t\t\t#output -> (insert: encode_stricturl: #clientparams -> (find: #param) -> first);\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t#output = string: (#output -> (join: '&amp;'));\n\t\t// restore / in paths\n\t\t#output -> replace('%2F', '/');\n\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\tif: #output -> size;\n\t\t\treturn: (local: 'prefix') + #output + (local: 'suffix');\n\t\t/if;\n\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'renderhtml', -description='Outputs the complete record listing. Calls renderheader, renderlisting and renderfooter as well. \\\n\t\t\tIf 10 records or more are shown, renderfooter is added also just below the header.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-inlinename (optional) If not specified, inlinename from the connected database object is used\\n\\\n\t\t\t-numbered (optional flag or integer) If specified, pagination links will be shown as page numbers instead of regular prev/next links. Defaults to 6 links, specify another number (minimum 6) if more numbers are wanted.',\n\t\t-optional='inlinename',\n\t\t-optional='xhtml',\n\t\t-optional='numbered',\n\t\t-optional='startwithfooter';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'output'=string,\n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'_xhtml' = (((local_defined: 'xhtml') && #xhtml != false) ? true | false);\n\t\tif(local_defined('numbered'));\n\t\t\tlocal('numberedpaging'=((#numbered !== false) ? integer(#numbered) | false));\n\t\telse;\n\t\t\tlocal('numberedpaging'=(((self -> 'numbered') !== false) ? integer(self -> 'numbered') | false));\n\t\t/if;\n\n\t\tlocal_defined('startwithfooter') && #startwithfooter != false ? #startwithfooter = true | local('startwithfooter') = false;\n\n\t\t!(local_defined: 'inlinename') ? local: 'inlinename'=string;\n\t\tself -> 'footer' = (self -> (renderfooter: -xhtml = #_xhtml, -numbered=#numberedpaging));\n\t\t#output += (self -> renderheader(-start, -xhtml = #_xhtml, -startwithfooter = #startwithfooter));\n\t\tif: #db -> shown_count >= 10 && !#startwithfooter;\n\t\t\t#output += self -> 'footer';\n\t\t/if;\n\t\t#output += (self -> (renderlisting: -inlinename=#inlinename, -xhtml=#_xhtml));\n\n\t\t#output += self -> 'footer' + '</table>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\n\tdefine_tag: 'renderlisting', -description='Outputs just the actual record listing. Is called by renderhtml. \\\n\t\t\tParameters:\\n\\\n\t\t\t-inlinename (optional) If not specified, inlinename from the connected database object is used',\n\t\t-optional='inlinename',\n\t\t-optional='xhtml';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: '_inlinename'=string, \n\t\t\t'output'=string, \n\t\t\t'fields'=(self -> 'fields'), \n\t\t\t'field'=string,\n\t\t\t'keyfield'=null,\n\t\t\t'affectedrecord_keyvalue'=null,\n\t\t\t'record_loop_count'=integer,\n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'nav'=@(self -> 'nav'),\n\t\t\t'dbfieldmap'=@(self -> 'dbfieldmap'),\n\t\t\t'classarray'=array,\n\t\t\t'fieldname'=string,\n\t\t\t'value'=string,\n\t\t\t'keyparamname',\n\t\t\t'url',\n\t\t\t'url_cached_temp',\n\t\t\t'_xhtml' = (((local_defined: 'xhtml') && #xhtml != false) ? true | false),\n\t\t\t'lang'=@(self -> 'lang');\n\t\t\t\n\t\tif: (local: 'inlinename')!='';\n\t\t\t#_inlinename = #inlinename;\n\t\telse: #db -> type == 'database';\n\t\t\t#_inlinename=#db -> 'inlinename';\n\t\t\t#keyfield=#db -> 'keyfield';\n\t\t\t#affectedrecord_keyvalue = #db -> 'affectedrecord_keyvalue';\n\t\t/if;\n\t\t#output += '\\n<tbody>\\n';\n\t\tif: #nav -> (isa: 'nav');\n\t\t\titerate: #fields, #field;\n\t\t\t\tif: (#field -> (find: 'url')) != '';\n\t\t\t\t\t#url = (#field -> (find: 'url'));\n\t\t\t\t\t#keyparamname = (#field -> (find: 'keyparamname'));\n\t\t\t\t\t#field -> insert('url_cached' = (#nav -> (url: -path=#url, \n\t\t\t\t\t\t#keyparamname='###keyvalue###',\n\t\t\t\t\t\t-autoparams,\n\t\t\t\t\t\t-except=(array: -path))));\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\trecords: -inlinename=#_inlinename;\n\t\t\t#record_loop_count = loop_count;\n\t\t\t#output += '\\n<tr>';\n\t\t\titerate: #fields, #field;\n\t\t\t\t#fieldname = (#dbfieldmap -> (find: (#field -> (find: 'name'))));\n\t\t\t\t#keyparamname = (#field -> (find: 'keyparamname'));\n\t\t\t\t#value=(field: #fieldname);\n\t\t\t\tif: #field -> (find: 'template') -> type == 'map';\n\t\t\t\t\t#value=string(#value);\n\t\t\t\t\tif: #field -> (find: 'template') >> #value;\n\t\t\t\t\t\t#value = #field -> (find: 'template') -> (find: #value);\n\t\t\t\t\telse: #field -> (find: 'template') >> '-default';\n\t\t\t\t\t\t#value = #field -> (find: 'template') -> (find: '-default');\n\t\t\t\t\telse;\n\t\t\t\t\t\t// show fieldvalue as is\n\t\t\t\t\t/if;\n\t\t\t\t\t// substitute field value in the display template\n\t\t\t\t\t#value -> (replace: '#value#', (field: #fieldname));\n\t\t\t\telse: #field -> (find: 'template') -> (isa: 'tag');\n\t\t\t\t\t#value = #field -> (find: 'template') -> (run: -params=#value);\n\t\t\t\t/if;\n\t\t\t\t#classarray=array;\n\t\t\t\tif:  #affectedrecord_keyvalue == (field: #keyfield) && (field: #keyfield) != '';\n\t\t\t\t\t// hightlight affected row\n\t\t\t\t\t#classarray -> (insert: 'highlight');\n\t\t\t\telse;\n\t\t\t\t\t(#record_loop_count - 1)  % 2 == 0 ? #classarray -> (insert: 'even');\n\t\t\t\t/if;\n\t\t\t\t// Added by JC 081127 to handle td specific classes\n\t\t\t\t(#field -> find('class') -> size ? #classarray -> insert( #field -> find('class')));\n\t\t\t\t#output += '<td';\n\t\t\t\tif: #classarray -> size;\n\t\t\t\t\t#output += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t\t/if;\n\t\t\t\t#output += '>';\n\t\t\t\tif: (#field -> (find: 'url')) != '';\n\t\t\t\t\t#url = (#field -> (find: 'url'));\n\t\t\t\t\t/*\n\t\t\t\t\tif: #nav -> (isa: 'nav') && #url !>> '#value#';\n\t\t\t\t\t\t#output += '<a href=\"' + (#nav -> (url: -path=#url, \n\t\t\t\t\t\t\t#keyparamname=(field: #keyfield),\n\t\t\t\t\t\t\t-autoparams,\n\t\t\t\t\t\t\t-except=(array: -path)));\n\t\t\t\t\t*/\n\t\t\t\t\tif: #field -> find('url_cached') -> size && #url !>> '#value#';\n\t\t\t\t\t\t#url_cached_temp = #field -> find('url_cached');\n\t\t\t\t\t\t#url_cached_temp -> replace('###keyvalue###', field(#keyfield));\n\t\t\t\t\t\t#output += '<a href=\"' + #url_cached_temp;\n\t\t\t\t\t\t#output += '\">' +  #value \n\t\t\t\t\t\t\t// show something to click on even if the field is empty\n\t\t\t\t\t\t\t+ ((string_findregexp: #value, -find='\\\\w*') -> size == 0 ? (#lang -> linktext_edit)) \n\t\t\t\t\t\t\t+ '</a>';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#url -> (replace: '#value#', (field: #fieldname));\n\t\t\t\t\t\t#output += '<a href=\"' + #url + '\"'; \n\t\t\t\t\t\t#url -> (beginswith: 'http://') || #url -> (beginswith: 'https://') || #url -> (beginswith: 'mailto:')\n\t\t\t\t\t\t\t? #output += ' class=\"ext\"';\n\t\t\t\t\t\t#output += '>' +  #value + '</a>';\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\t#output += #value;\n\t\t\t\t/if;\n\t\t\t\t#output += '</td>\\n';\n\t\t\t/iterate;\n\t\t\t#output += '</tr>\\n';\n\t\t/records;\n\t\t#output += '\\n</tbody>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'renderheader', -description='Outputs the header of the grid with the column headings. \\\n\t\t\tAutomatically included by ->renderhtml. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-start (optional flag) Also output opening <table> tag',\n\t\t-optional='start',\n\t\t-optional='xhtml',\n\t\t-optional = 'startwithfooter';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=string, \n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'nav'=@(self -> 'nav'),\n\t\t\t'fields'=@(self -> 'fields'), \n\t\t\t'field'=string,\n\t\t\t'classarray'=array,\n\t\t\t'_xhtml' = ((local_defined: 'xhtml') && #xhtml != false) ? true | false,\n\t\t\t'lang'=@(self -> 'lang');\n\t\tlocal_defined('startwithfooter') && #startwithfooter != false ? #startwithfooter = true | local('startwithfooter') = false;\n\n\n\t\t(local_defined: 'start') ? #output += '<table id=\"' + (self -> 'tbl_id') + '\" class=\"grid' + (self -> 'class' -> size > 0 ? ' ' + self -> 'class') + '\">';\n\t\t#output += '<thead>\\n<tr>';\n\t\tif: (self -> 'quicksearch_form') -> type == 'form';\n\t\t\t#output += '<th colspan=\"' + (#fields -> size) + '\" class=\"quicksearch';\n\t\t\t\t((self -> 'quicksearch_form') -> (getvalue: '-q') != '') ? #output += ' highlight';\n\t\t\t#output += '\">';\n\n\t\t\tif: (self -> 'rawheader') -> size > 0 ;\n\t\t\t\t#output += (self -> 'rawheader');\n\t\t\t/if;\n\n\n\t\t\t#output += (self -> 'quicksearch_form') -> (renderform: -xhtml = #_xhtml);\n\t\t\tif: (self -> 'quicksearch_form_reset') -> type =='form';\n\t\t\t\t#output += (self -> 'quicksearch_form_reset') -> (renderform: -xhtml = #_xhtml);\n\t\t\t/if;\n\t\t\t#output += '</th></tr>\\n';\n\t\telse((self -> 'rawheader') -> size > 0);\n\t\t\t#output += '<th colspan=\"' + (#fields -> size) + '\">';\n\t\t\t#output += (self -> 'rawheader');\n\t\t\t#output += '</th></tr>\\n';\n\t\t/if;\n\n\t\tif(#startwithfooter);\n\t\t\t#output += self -> 'footer';\n\t\t/if;\n\n\t\t#output += '<tr>';\n\n\t\titerate: #fields, #field;\n\t\t\t#classarray=array;\n\t\t\t//(self -> 'quicksearch_form') -> type == 'form' ? #classarray -> (insert: 'notopborder');\n\t\t\tif: !(self -> 'nosort');\n\t\t\t\t(self -> 'sortfield') == (#field -> (find: 'name')) \n\t\t\t\t\t&& !(#field -> (find: 'nosort')) ? #classarray -> (insert: 'sort');\n\t\t\t/if;\n\t\t\t#output += '<th';\n\t\t\tif: #field -> (find: 'width') > 0;\n\t\t\t\t#output += ' style=\"width: ' + (integer: #field -> (find: 'width')) + 'px;\"';\n\t\t\t/if;\n\t\t\t// Added by Jolle 081127 to handle td specific classes\n\t\t\t(#field -> find('class') -> size ? #classarray -> insert( #field -> find('class')));\n\t\t\tif: #classarray -> size;\n\t\t\t\t#output += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t/if;\n\t\t\t#output += '>';\n\t\t\tif: (#field -> (find: 'nosort')) || (self -> 'nosort');\n\t\t\t\t#output += '<div>' + (#field -> (find: 'label')) '</div>';\n\t\t\telse;\n\t\t\t\tif: (#classarray >> 'sort' && (self -> 'sortdescending') && (self -> 'defaultsort') == '');\n\t\t\t\t\t// create link to change to unsorted\n\t\t\t\t\tif: #nav -> isa('nav');\n\t\t\t\t\t\t#output += '<a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -sort, -desc, -page, -path)) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_showunsorted) + '\">';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output += '<a href=\"./'\n\t\t\t\t\t\t\t+ (self -> (urlargs: -except=(array: -sort, -desc, -page), -prefix='?')) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_showunsorted) + '\">';\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\t// create link to toggle sort mode\n\t\t\t\t\tif: #nav -> isa('nav');\n\t\t\t\t\t\t#output += '<a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -sort, -desc, -page, -path), \n\t\t\t\t\t\t\t-urlargs='-sort=' + (#field -> (find: 'name'))\n\t\t\t\t\t\t\t\t+ (#classarray >> 'sort' && !(self -> 'sortdescending') ? '&amp;-desc')) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#classarray >> 'sort' \n\t\t\t\t\t\t\t\t?  (#lang -> linktitle_changesort) + ' ' \n\t\t\t\t\t\t\t\t\t+ ((self -> 'sortdescending') ? (#lang -> linktitle_ascending) | (#lang -> linktitle_descending))\n\t\t\t\t\t\t\t\t| (#lang -> linktitle_sortascby) + ' ' + (encode_html: (#field -> (find: 'label'))) ) + '\">';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output += '<a href=\"./?-sort=' + (#field -> (find: 'name')) \n\t\t\t\t\t\t\t+ (#classarray >> 'sort' && !(self -> 'sortdescending') ? '&amp;-desc') \n\t\t\t\t\t\t\t+ (self -> (urlargs: -except=(array: -sort, -desc, -page), -prefix='&amp;')) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#classarray >> 'sort' \n\t\t\t\t\t\t\t\t?  (#lang -> linktitle_changesort) + ' ' \n\t\t\t\t\t\t\t\t\t+ ((self -> 'sortdescending') ? (#lang -> linktitle_ascending) | (#lang -> linktitle_descending))\n\t\t\t\t\t\t\t\t| (#lang -> linktitle_sortascby) + ' ' + (encode_html: (#field -> (find: 'label'))) ) + '\">';\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t#output += (#field -> (find: 'label'));\n\t\t\t\tif: (string_findregexp: (#field -> (find: 'label')), -find='\\\\S') -> size == 0;\n\t\t\t\t\t#output += '&nbsp;'; // to show sort link as block element properly even for empty label\n\t\t\t\t/if;\n\t\t\t\tif: #classarray >> 'sort';\n\t\t\t\t\t#output += ' <span class=\"sortmarker\"> ' + ((self -> 'sortdescending') ? '&#9660;' | '&#9650;') + '</span>';\n\t\t\t\t/if;\n\t\t\t\t#output += '</a>';\n\t\t\t /if;\n\t\t\t #output += '</th>\\n';\n\t\t/iterate;\n\t\t#output += '</tr>\\n</thead>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'renderfooter', -description='Outputs the footer of the grid with the prev/next links and information about found count. \\\n\t\t\tAutomatically included by ->renderhtml\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-end (optional flag) Also output closing </table> tag\\n\\\n\t\t\t-numbered (optional flag or integer) If specified, pagination links will be shown as page numbers instead of regular prev/next links. Defaults to 6 links, specify another number (minimum 6) if more numbers are wanted.',\n\t\t-optional='end',\n\t\t-optional='numbered',\n\t\t-optional='xhtml';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=string, \n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'nav'=@(self -> 'nav'),\n\t\t\t'fields'=@(self -> 'fields'), \n\t\t\t'field'=string,\n\t\t\t//'numberedpaging'=(((local_defined: 'numbered') && #numbered !== false) ? integer(#numbered) | false),\n\t\t\t'_xhtml' = ((local_defined: 'xhtml') && #xhtml != false) ? true | false,\n\t\t\t'lang'=@(self -> 'lang'),\n\t\t\t'page'=(self -> page),\n\t\t\t'lastpage'=(self -> lastpage),\n\t\t\t'url_cached',\n\t\t\t'url_cached_temp';\n\t\tif(local_defined('numbered'));\n\t\t\tlocal('numberedpaging'=((#numbered !== false) ? integer(#numbered) | false));\n\t\telse;\n\t\t\tlocal('numberedpaging'=(((self -> 'numbered') !== false) ? integer(self -> 'numbered') | false));\n\t\t/if;\n\t\t\t\n\t\tif(#nav -> isa('nav'));\n\t\t\t#url_cached=#nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t-urlargs='-page=###page###');\n\t\t/if;\n\t\tif: #numberedpaging !== false && #numberedpaging < 6;\n\t\t\t// show 10 page numbers as default\n\t\t\t#numberedpaging = 6;\n\t\t/if;\n\t\tif: #numberedpaging;\n\t\t\t// make sure we have an even number\n\t\t\t#numberedpaging += #numberedpaging % 2;\n\t\t/if;\n\t\t\n\t\t#output += '\\n<tr><th colspan=\"' + (#fields -> size) + '\" class=\"footer first'  + '\">';\n\t\t/* not used\n\t\tif: #nav -> isa('nav');\n\t\t\tlocal: 'url'=#nav -> url(-autoparams, -getargs, -except=(array: -page, -path), -urlargs='-page='),\n\t\t\t\t'url_prefix'=(#nav -> 'navmethod' == 'param' ? '&amp;' | '?');\n\t\telse;\n\t\t\tlocal: 'url'='./' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')),\n\t\t\t\t'url_prefix'='?';\n\t\t/if;\n\t\t*/\n\t\t// JC 2010-05-14 added span separation for better styling\n\t\tif: #numberedpaging;\n\t\t\tlocal: 'page_from'=1,\n\t\t\t\t'page_to'=#lastpage;\n\t\t\tif: #lastpage > #numberedpaging;\n\t\t\t\t#page_from=#page - (#numberedpaging/2 - 1);\n\t\t\t\t#page_to=#page + (#numberedpaging/2);\n\t\t\t\tif: #page_from < 1;\n\t\t\t\t\t#page_to += (1 - #page_from);\n\t\t\t\t\t#page_from = 1;\n\t\t\t\t/if;\n\t\t\t\tif: #page_to > #lastpage;\n\t\t\t\t\t#page_from = #lastpage - (#numberedpaging - 1);\n\t\t\t\t\t#page_to = #lastpage;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t#output += '<span class=\"foundcount\">' + #db -> found_count + ' ' + (#lang -> footer_found) + '</span> &#8212; <span class=\"pagination\">' + (#lang -> linktext_gotopage) + ': '; // SP customization\n\t\t\tif: #page > 1;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t// 2010-12-23\tSP\tCorrected pagination bug for -numbered.\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + 1);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t\t-urlargs='-page=' + (#page - 1)) + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page - 1));\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=1\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page - 1) + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t//#output += ' <span class=\"prevnext prev dim\">' + (#lang -> linktext_prev) + '</span> ';\n\t\t\t/if;\n\t\t\tif: #page_from > 1;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + 1);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t-urlargs='-page=1') + '\" class=\"prevnext numbered first\">1</a>';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext numbered first\">1</a>';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=1\" class=\"prevnext numbered first\">1</a> ';\n\t\t\t\t/if;\n\t\t\t\tif: #page_from > 2;\n\t\t\t\t\t#output +='...';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tloop: -from=#page_from, -to=#page_to;\n\t\t\t\tif: loop_count == #page;\n\t\t\t\t\t#output += ' <span class=\"numbered current\">' + loop_count + '</span> ';\n\t\t\t\telse;\n\t\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + loop_count);\n\t\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t\t-urlargs='-page=' + loop_count) + '\" class=\"prevnext numbered\">' + loop_count + '</a> ';*/\n\t\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext numbered\">' + loop_count + '</a> ';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t\t+ '-page=' + loop_count + '\" class=\"prevnext numbered\">' + loop_count + '</a> ';\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/loop;\n\t\t\tif: #page_to < #lastpage;\n\t\t\t\tif: #page_to < (#lastpage - 1);\n\t\t\t\t\t#output += '...';\n\t\t\t\t/if;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + #lastpage);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t-urlargs='-page=' + #lastpage) + '\" class=\"prevnext numbered last\">' + #lastpage + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext numbered last\">' + #lastpage + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + #lastpage + '\" class=\"prevnext numbered last\">' + #lastpage + '</a> ';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\n\t\t\tif: #page < #lastpage;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page + 1));\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t\t-urlargs='-page=' + (#page + 1)) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + #lastpage);\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page + 1) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + #lastpage + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t//#output += ' <span class=\"prevnext next dim\">' + (#lang -> linktext_next) + '</span> ';\n\t\t\t/if;\n\t\t\n\t\t\t#output += '</span> ';\n\t\t\n\t\t\n\t\telse;  // regular prev/next links\n\t\t\n\t\t\n\t\t\tif: #page > 1;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + 1);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t-urlargs='-page=1') + '\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\t\t\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page - 1));\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=1\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\t\t\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page - 1) + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t#output += ' <span class=\"prevnext first dim\">' + (#lang -> linktext_first) + '</span> \\\n\t\t\t\t\t\t\t<span class=\"prevnext prev dim\">' + (#lang -> linktext_prev) + '</span> ';\n\t\t\t/if;\n\t\t\tif: #db -> found_count > #db -> shown_count;\n\t\t\t\t#output += (#lang -> (footer_shown: -replace=(array: (#db -> shown_first), (#db -> shown_last)))) + ' ';\n\t\t\t/if;\n\t\t\t#output += #db -> found_count + ' ' + (#lang -> footer_found);\n\t\t\tif: (#db -> shown_last) < (#db -> found_count);\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page + 1));\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t\t-urlargs='-page=' + (#page + 1)) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + #lastpage);\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page + 1) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + ((self -> lastpage)) + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t#output += ' <span class=\"prevnext next dim\">' + (#lang -> linktext_next) + '</span>  \\\n\t\t\t\t\t\t\t<span class=\"prevnext last dim\">' + (#lang -> linktext_last) + '</span> ';\n\t\t\t/if;\n\t\t/if;\n\t\t#output += '</th></tr>\\n';\n\t\t(local_defined: 'end') ? #output += '</table>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\t\n\tdefine_tag: 'page', -description='Returns the current page number';\n\t\treturn: (self -> 'page');\n\t/define_tag;\n\t\n\tdefine_tag: 'lastpage', -description='Returns the number of the last page for the found records';\n\t\tif: (self -> 'database') -> 'found_count' > 0;\n\t\t\treturn: (((self -> 'database') -> 'found_count' - 1) / (self -> 'database') -> 'maxrecords_value') + 1;\n\t\telse;\n\t\t\treturn: 1;\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag: 'page_skiprecords', -description='Converts curent page value to a skiprecords value to use in a search. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-maxrecords (required integer) Needed to be able to do the calculation. Maxrecords_value can not be taken from the database object since taht value is not available until aftetr performing the search',\n\t\t-required='maxrecords', -type='integer'; // TODO: maxrecords_value can be taken from the database object so should not be required\n\t\treturn: ((self -> 'page') - 1) * #maxrecords;\n\t/define_tag;\n\t\n\n/define_type;\n\n?>[\n//------------------------------------------------------------------\n//    End knop_grid\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_lang\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'lang',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2010-12-29',\n\t\t\t'description'='A knop_lang object holds all language strings for all supported languages. Strings are \\\n\t\t\t\tstored under a unique text key, but the same key is of course used for the different language \\\n\t\t\t\tversions of the same string. \\n\\\n\t\t\t\tStrings can be separated into different variables if it helps managing them for different contexts. \\n\\\n\t\t\t\tWhen the language of a string object is set, that language is used for all subsequent requests \\\n\t\t\t\tfor strings until another language is set. All other instances on the same page that don\\'t have a \\\n\t\t\t\tlanguage set will also use the same language.  \\n\\\n\t\t\t\tIf no language is set, knop_lang uses the browser\\'s preferred language if it\\'s available in \\\n\t\t\t\tthe knop_lang object, otherwise it defaults to the first language (unless a default language \\\n\t\t\t\thas been set for the instance).';\n\n/*\n\nCHANGE NOTES\n2010-12-29\tJS\t->getstring: make sure we only try to do replacement in strings or bytes\n2010-05-27\tJS\tgetstring now works also with empty -replace value\n2010-04-20\tJS\tgetstring debug output corrected for missing string. \n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->addstring: clarified deprecation warning\n2009-04-08\tJS\tAdded -debug flag to oncreate (when creating a lang object) to make undefined language keys appear as *key*.\n2009-03-24\tJS\t->getstring prevents replacements if there is no language string found, to prevent null->replace error\n2008-11-12\tJS\tAdded ->insert instead of ->addstring for better consistency with other Lasso data types. ->addstring will remain functional for backwards compatibility. \n2008-09-11\tJS\t->_unknowntag: added missing support for -language\n2008-01-22\tJS\t->getstring: corrected the fallback behavior when a current language has been set \n2008-01-07\tJS\tRemoved instance variable browserlanguage due to problems with transient storage. The browserlanguage is cached on page level so it's no loss in reality. \n2007-12-12\tJS\tAdded page level storage of currentlanguage, so all knop_lang instances defaults to the same language once one of them have set a language explictly, but only if the other knop_lang instances don't have a language set explicitly. \n2007-12-12\tJS\tAdded page level caching of browser language (stores the value in $_knop_data map)\n2007-12-06\tJS\tMoved -> help to knop_base\n2007-12-06\tJS\tAdded ->description to all member tags. \n2007-12-03\tJS\tFinished first complete version\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-13\tJS\tRenamed to knop_lang (formerly knop_strings)\n2007-04-04\tJS\tCreated the data type and started coding\n\nTODO:\nProvide methods to handle formatting of dates, numbers, currency etc for different languages/locales. \nWeekday names, month names etc. \nMember tag to return the current language\nMember tag to set default output encoding unless it follows encode_set. \n\nExamples\n\tvar: 'lang_messages'=(knop_lang: -default='en');\n\t$lang_messages -> (insert: -key='welcome', -value='Welcome to the home page', -language='en');\n\t$lang_messages -> (insert: -key='welcome', -value='Välkommen till hemsidan', -language='sv');\n\t$lang_messages -> (insert: -key='loggedin', -value='You are logged in as #1# #2#', -language='en');\n\t$lang_messages -> (insert: -key='loggedin', -value='Du är inloggad som #1# #2#', -language='sv');\n\n\t// proper call, defaults to the browser's preferred language\n\t$lang_messages -> (getstring: 'welcome');\n\t// shorthand call\n\t$lang_messages -> welcome;\n\n\t// change language\n\t$lang_messages -> (setlanguage: 'sv');\n\t$lang_messages -> welcome;\n\n\t// proper call with replacements\n\t$lang_messages -> (getstring: -key='loggedin': -replace=(array: (field: 'firstname'), (field: 'lastname')));\n\n\t// shorthand call with replacements\n\t$lang_messages -> (loggedin: -replace=(array: (field: 'firstname'), (field: 'lastname')));\n\n\n*/\n\n\t// instance variables\n\tlocal: 'strings'=map,\t\t// map: language=(map: key=value, key=value), language=...\n\t\t'defaultlanguage'=string,\n\t\t'fallback'=false,\n\t\t'currentlanguage'=null,\t// the currently set language\n\t\t'keys'=null,\t\t\t// cached keys array\n\t\t'debug'=false;\n\n\tdefine_tag: 'oncreate', -description='Creates a new instance of knop_lang. \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-default (optional) Default language. \\n\\\n\t\t\t-fallback (optional) If specified, falls back to default language if key is missing. \\n\\\n\t\t\t-debug (optional flag) If specified, missing strings will be output using the key surrpunded by asterisks',\n\t\t-optional='default',\t\n\t\t-optional='fallback',\n\t\t-optional='debug';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tif(local_defined('default') && #default -> size);\n\t\t\t(self -> 'defaultlanguage') = #default;\n\t\t/if;\n\t\t(self -> 'fallback') = ((local_defined: 'fallback') && #fallback != false);\n\t\t(self -> 'debug') = ((local_defined: 'debug') && #debug != false);\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'onconvert', -description='Returns raw dump of the instance for debugging';\n\t\treturn: (self -> dump);\n\t/define_tag;\n\n\tdefine_tag: '_unknowntag', -description='Returns the language string for the specified text key \\\n\t\t\t= shortcut for getstring. \\n\\Parameters: \\n\\\n\t\t\t-language (optional)  see getstring: -language.\\n\\ \n\t\t\t-replace (optional) see getstring: -replace. ',\n\t\t-optional='language',\n\t\t-optional='replace';\n\t\t!(local_defined: 'replace') ? local: 'replace'=string;\n\t\t!(local_defined: 'language') ? local: 'language'=string;\n\t\tif: self -> keys >> tag_name;\n\t\t\treturn: @(self -> (getstring: -key=Tag_name, -language=#language, -replace=#replace));\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> insert('Error: ' + tag_name + ' not found');\n\t\t\t(self -> 'debug') ? return('*' + tag_name + '*');\n\t\t/if;\n\t/define_tag;\n\t\n\n\tdefine_tag: 'addlanguage', -description='Adds a map with language strings for an entire language. Replaces all existing language strings for that language. \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-language (required) The language to add. \\n\\\n\t\t\t-strings (required) Complete map of key=value for the entire language.',\n\t\t-required='language',\n\t\t-required='strings', -type='map';\n\t\tlocal: 'timer'=knop_timer; \n\t\t(self -> 'keys') = null;\n\t\t(self -> 'strings') -> (insert: #language = #strings);\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag('addstring', -description='Deprecated synonym for ->insert',\n\t\t-required='language',\n\t\t-required='key',\n\t\t-required='value');\n\t\t(self -> 'debug_trace') -> insert('*** DEPRECATION WARNING *** ' + tag_name + ' is deprecated, use ->insert instead');\n\t\tself -> insert(-language=#language, -key=#key, -value=#value);\n\t/define_tag;\n\t\n\tdefine_tag: 'insert',-description='Adds an individual language string. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-language (required) The language for the string. \\n\\\n\t\t\t-key (required) Textkey to store the string under. Replaces any existing key for the same language. \\n\\\n\t\t\t-value (required) The actual string (can also be compound expression). Can contain replacement tokens #1#, #2# etc. ',\n\t\t-required='language',\n\t\t-required='key',\n\t\t-required='value';\n\t\tlocal: 'timer'=knop_timer; \n\t\t(self -> 'keys') = null;\n\t\tif: (self -> 'strings') !>> #language;\n\t\t\t(self -> 'strings') -> (insert: #language = map);\n\t\t/if;\n\t\t((self -> 'strings') -> (find: #language)) -> (insert: #key = #value);\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'getstring',\t-description='Returns a specific text string in the language that has previously been set for the instance.\\\n\t\t\t\tIf no language has been set, the browser\\'s preferred language will be used unless another instance on the same page \\\n\t\t\t\thas a language set using ->setlanguage. \\n\\\n\t\t\t\tIf the string is not available in the chosen language and -fallback was specified, \\\n\t\t\t\tthe string for the language that was first specified for that key will be returned. \\n\\\n\t\t\t\tParameters: \\n\\\n\t\t\t\t-key (required) textkey to return the string for. \\n\\\n\t\t\t\t-language (optional) to return a string for a specified language (temporary override). \\n\\\n\t\t\t\t-replace (optional) single value or array of values that will be used as substitutions for placeholders #1#, #2# etc in the returned string, in the order they appear. Replacements can be compund expressions, which will be executed.  Can also be map or pair array, and in that case the left hand element of the map/array will be replaced by the right hand element. ',\n\t\t-required='key',\n\t\t-optional='language', -copy,\n\t\t-optional='replace', -copy;\n\t\t\t\t\t\t\t\t\t\t\n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t// page level caching\n\t\t\t$_knop_data = map;\n\t\t/if;\n\n\t\t!(local_defined: 'language') ? local: 'language'=string;\n\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=string;\n\t\tif: #language -> size == 0 || !(self -> (validlanguage: #language));\n\t\t\t#language=(self -> 'currentlanguage');\n\t\t\tif: #language -> size == 0;\n\t\t\t\tif: $_knop_data >> 'currentlanguage' && self -> (validlanguage: ($_knop_data -> (find: 'currentlanguage')));\n\t\t\t\t\t// fall back to page level language\n\t\t\t\t\t#language = $_knop_data -> find('currentlanguage');\n\t\t\t\telse;\n\t\t\t\t\t// fall back to the browser's preferred language\n\t\t\t\t\t#language=(self -> browserlanguage);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: #language -> size == 0 && self -> (validlanguage: (self -> 'defaultlanguage'));\n\t\t\t\t// still no matching language, fall back to defaultlanguage\n\t\t\t\t#language = (self -> 'defaultlanguage');\n\t\t\telse: #language -> size == 0;\n\t\t\t\t// still no matching language, fall back to the first language\n\t\t\t\t#language = (self -> 'strings') -> keys -> first;\n\t\t\t/if;\n\t\t\tif: (self -> 'strings') !>> #language\n\t\t\t\t|| ((self -> 'strings') >> #language\n\t\t\t\t\t&& (self -> 'strings') -> (find: #language) !>> #key\n\t\t\t\t\t&& (self -> 'fallback'));\n\t\t\t\t// key is not found in current language, switch to default language\n\t\t\t\tif: self -> (validlanguage: (self -> 'defaultlanguage'));\n\t\t\t\t\t// still no matching language, fall back to defaultlanguage\n\t\t\t\t\t#language = (self -> 'defaultlanguage');\n\t\t\t\telse;\n\t\t\t\t\t// no default language to fall back to\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\tif: (self -> 'strings') >> #language;\n\t\t\tif((self -> 'strings') -> find(#language) !>> #key);\n\t\t\t\t(self -> 'debug_trace') -> insert('Error: ' + #key + ' not found');\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer(#timer); // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\t(self -> 'debug') \n\t\t\t\t\t? return('*' + #key + '*') \n\t\t\t\t\t| return;\n\t\t\t/if;\n\t\t\t#output = (self -> 'strings') -> (find: #language) -> (find: #key);\n\t\t\t//(self -> 'debug_trace') -> (insert: tag_name + ': found string \"' + (encode_html: #output) + '\" for key \"' + #key + '\" and language ' + #language);\n\t\t\t\n\t\t\tif: #output -> (isa: 'tag');\n\t\t\t\t// execute compund expression\n\t\t\t\t#output = #output -> run;\n\t\t\t/if;\n\t\t\tif((#output -> isa('string') || #output -> isa('bytes')) \n\t\t\t\t&& #output -> size && (local_defined: 'replace'));\n\t\t\t\t// replace placeholders with real values\n\t\t\t\tif: !(#replace -> (isa: 'array')) && !(#replace -> (isa: 'map'));\n\t\t\t\t\t#replace = (array: #replace);\n\t\t\t\t/if;\n\t\t\t\titerate: #replace, local: 'replacement';\n\t\t\t\t\t// make sure we have a pair\n\t\t\t\t\tif: !(#replacement -> (isa: 'pair'));\n\t\t\t\t\t\t#replacement = (pair: '#' + loop_count + '#' = #replacement);\n\t\t\t\t\t/if;\n\t\t\t\t\t// if we have a compund expression as replacement, execute the replacement first\n\t\t\t\t\tif: (#replacement -> value -> (isa: 'tag'));\n\t\t\t\t\t\t(#replacement -> value) = #replacement -> value -> run;\n\t\t\t\t\t/if;\n\t\t\t\t\t#output -> (replace: #replacement -> name, #replacement -> value);\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t/if;\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t\t\n\t/define_tag;\n\t\n\tdefine_tag: 'setlanguage', -description='Sets the current language for the string object. Also affects other instances on the same page that do not have an explicit language set. ',\n\t\t-required='language';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t// page level caching\n\t\t\t$_knop_data = map;\n\t\t/if;\n\t\tif: self -> (validlanguage: #language);\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': Setting language to ' + #language);\n\t\t\t(self -> 'currentlanguage') = #language;\n\t\t\t// save page level language\n\t\t\t$_knop_data -> insert('currentlanguage' = #language);\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': Could not set current language to ' + #language + ' since it does not exist in the lang object');\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'validlanguage', -description='Checks if a specified language exists in the string object, \\\n\t\treturns true or false.',\n\t\t-required='language';\n\t\treturn: (self -> 'strings') -> keys >> #language;\n\t/define_tag;\n\t\n\tdefine_tag: 'browserlanguage', -description='Autodetects and returns the most preferred language \\\n\t\t\tout of all available languages as specified by the browser\\'s accept-language q-value. ';\n\t\t\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'browserlanguage'=string;\n\n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t// page level caching\n\t\t\t$_knop_data = map;\n\t\t/if;\n\n\t\tif: $_knop_data >> 'browserlanguage';\n\t\t\t// use page cache\n\t\t\t#browserlanguage = $_knop_data -> find('browserlanguage');\n\n\t\telse;\n\t\t\tlocal: 'requestheader'=client_headers -> (split: '\\r\\n'),\n\t\t\t\t'acceptlanguage'=string,\n\t\t\t\t'browserlanguages'=array;\n\t\t\t\n\t\t\titerate: #requestheader, (local: 'headerfield'); \n\t\t\t\t// strip IIS header prefix\n\t\t\t\t#headerfield -> (removeleading: 'HTTP_');\n\t\t\t\t\n\t\t\t\tif: #headerfield -> (beginswith: 'Accept-Language:'); \n\t\t\t\t\t#acceptlanguage=#headerfield;\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#acceptlanguage -> (removeleading: 'Accept-Language:');\n\t\t\t#acceptlanguage -> trim;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': Accept-Language: ' + #acceptlanguage);\n\t\t\t#acceptlanguage = #acceptlanguage -> (split: ',');\n\t\t\titerate: #acceptlanguage, local: 'language';\n\t\t\t\t#language = #language -> (split: ';');\n\t\t\t\tif: #language -> size == 1;\n\t\t\t\t\t// no q value specified, use default 1.0\n\t\t\t\t\t#language -> (insert: 'q=1.0');\n\t\t\t\t/if;\n\t\t\t\t(#language -> first) -> trim; \n\t\t\t\tif: #language -> size >= 2 && #language -> first -> size;\n\t\t\t\t\t(#language -> second) = (#language -> second) -> (split: '=') -> last;\n\t\t\t\t\t(#language -> second) -> trim; \n\t\t\t\t\t#browserlanguages -> (insert: (decimal: (#language -> second)) = (#language -> first) );\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#browserlanguages -> (sort: -ascending=false);\n\t\n\t\t\t// find the most preferred language\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': looking for matching languages ');\n\t\t\titerate: #browserlanguages, local: 'language';\n\t\t\t\tif: (self -> validlanguage: (#language -> second));\n\t\t\t\t\t/// found a valid language\n\t\t\t\t\t#browserlanguage=#language -> second;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found valid language ' + #browserlanguage);\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\tif: #browserlanguage -> size == 0;\n\t\t\t\t// no matching language found, try again without locale\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': no valid language found, looking again without locale ' + #language);\n\t\t\t\titerate: #browserlanguages, local: 'language';\n\t\t\t\t\t(#language -> second) = (#language -> second) -> (split: '-') -> first;\n\t\t\t\t\tif: (self -> validlanguage: (#language -> second));\n\t\t\t\t\t\t/// found a valid language\n\t\t\t\t\t\t#browserlanguage=#language -> second;\n\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found valid language ' + #browserlanguage);\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\t$_knop_data -> insert('browserlanguage'=#browserlanguage);\n\t\t/if;\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #browserlanguage;\n\n\t/define_tag;\n\t\n\tdefine_tag: 'languages', -description='Returns an array of all available languages in the string object \\\n\t\t\t(out of the languages in the -language array if specified). \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-language (optional) string or array of strings.',\n\t\t-optional='language', -copy;\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'languages'=(self -> 'strings') -> keys;\n\t\tif: (local_defined: 'language');\n\t\t\tif: !(#language -> (isa: 'array'));\n\t\t\t\t#language = array: #language;\n\t\t\t/if;\n\t\t\t#languages -> sort;\n\t\t\t#language -> sort;\n\t\t\t// get the languages that exist in both arrays\n\t\t\t#languages = #languages -> (intersection: #language);\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #languages;\n\t/define_tag;\n\t\n\tdefine_tag: 'keys', -description='Returns array of all text keys in the string object. ';\n\t\tif: !((self -> 'keys') -> (isa: 'array'));\n\t\t\tlocal: 'keysarray'=array, 'keysmap'=map, 'keysarray_new'=array;\n\t\t\t// no cached result yet - create list of all keys\n\t\t\titerate: (self -> 'strings'), local: 'strings_language';\n\t\t\t\t#keysarray_new = #strings_language -> value -> keys;\n\t\t\t\t#keysarray_new -> sort;\n\t\t\t\t#keysarray -> sort;\n\t\t\t\t// add the keys that are not already in #keysarray by using union\n\t\t\t\t#keysarray = #keysarray -> (union: #keysarray_new);\n\t\t\t/iterate;\n\t\t\t(self -> 'keys') = #keysarray;\n\t\t/if;\n\t\treturn: (self -> 'keys');\n\t/define_tag;\n\t\n\n/define_type;\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_lang\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_nav\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'nav',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2010-11-17',\n \t\t'description'='Custom type to handle site navigation menu';\n\n/*\n\nCHANGE NOTES\n2010-11-17\tJC\tFixed bug so that session links no longer gets added to urls by the nav -> url tag.\n2010-11-17\tJC\tFixed a bug that would not convert local params to an array under certain situations\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\t->linkparams: Multiple paramaters with the same name (typically checkboxes) are now passed properly\n2009-05-06\tJS\t->directorytree considers _include folders as part of the Knop directory structure. nav->include('_include/myfile.inc') will first look for _include/myfile.inc and if not found it will look for _knop/_include/myfile.inc \n2009-05-05\tJS\t->include looks for a specified file also inside a _knop folder, if the file does not exist at the specified location\n2009-02-09\tJS\t->filename: Casting path and actionpath to string\n2008-12-19\tJS\t->filename (and consequently ->include and ->library) can now use a specific -path instead of the current location's path\n2008-12-09\tJS\t->linkparams: fixed undefined local in trace call (only showed when trace was enabled for the nav object)\n2008-11-25\tJS\t->getlocation will now avoid disabled and hidden pages when looking for the first page if no default page is specified\n2008-11-03\tJS\t->getlocation will not break if no navigation items have been defined\n2008-10-30\tJS\t_mod folders will now work with knop paths with just a single level, so an include file path can end up as _mod_customer/lib_customer.inc or just _mod_customer/lib.inc (the latter variant does not apply to extension-based filenaming, so _mod_customer/.lib will never be a working file path)\n2008-07-10\tJS\tAdded -> label to return the name of the current page\n2008-05-20\tJS\t->renderhtml: #current# is not automatically added to the template if the more elaborate template format is used. This makes it easier to hide the currentmarker without changing the nav config (partial revert of fix 2008-01-04). \n2008-05-08\tJS\t->insert: A duplicate key does no longer cause a fatal error but instead fails silently and logs to the debug log\n2008-05-07\tJS\t->url: will now call ->linkparams so all links that are constructed from ->url will properly send along the parameters specified in the nav item. This also affects pagination and sort links in grid. \n2008-05-07\tJS\tAdded ->linkparams, Returns an array for all parameters that should be sent along with nav links (this was previously embedded in renderhtml)\n2008-02-25\tJS\t->url: new parameter -getargs to add the getargs to the path link if the path equals the current path\n2008-02-06\tJC\t->insert: the -hide flag can now be a boolean (also the -disabled flag)\n2008-02-03\tJS\t->include: can now include any specified filename\n2008-02-01\tJS\t->oncreate: added optional -fileroot to be able to use a root for files that is different from the logical site root used for navigation \n2008-01-23\tJS\t->url: Added -autoparams that is required to enable the automatic passing of action_params that begin with \"-\" (this reverts the default behavior to match the the old)\n2008-01-22\tJS\t->url: GET params that begin with \"-\" are sent as parameters on links. -path, -sort, -desc, -q are explicitly excluded from nav links in renderhtml. \n2008-01-22\tJS\tWhen using param based navigation, navigation links now use much cleaner /?path/to/page/ style links instead of /?-path=path/to/page/\n2008-01-22\tJS\t->getlocation: when navmethod is param, the path can now be sent as unnamed parameter insetad of -path parameter (such as /?path/to/page/). \n2008-01-04\tJS\t->renderbreadcrumb: added flag -plain to output breadcrumb without html\n2008-01-04\tJS\t->renderbreadcrumb: added flag -skipcurrent to not include the current location in the output\n2008-01-04\tJS\t->insert: -template can now be specified also for individual nav items. Use the form #link##label##current##/link##children#. \n2008-01-04\tJS\t->renderhtml: changed #title# to #label# in template for clarity, for example #link##label##current##/link##children# (#title# will remain supported)\n2008-01-04\tJS\tAdded #current# as placeholder for template, to specify where the current marker should occurr. If not specified in the template, the current marker appears immediately after the label.\n2007-12-12\tJS\t->include now logs processing time for the include to debug trace\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-04\tJS\tnav item css class is now applied also to disabled nav items (rendered as <span>)\n2007-11-08\tJS\tChanged trace so it tracks some things even when it's not enabled (like include etc)\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-28\tJS\t->directorytree: should now work also when knop folders are symlinks\n2007-09-06\tJS\ttop level nav elements that are -disabled now behave properly when accessed\n2007-09-05\tJS\t-currentmarker can now be set separately on sublevels, not only on topmost level\n2007-08-29\tJS\tAdded _knop as optional base folder to put all knop files in\n2007-08-29\tJS\t->include: Removed file_exists check since the filename has already been verified in ->filename.\n2007-08-29\tJS\tAdded ->directorytree which returns a map with all knop filenames, to use when searching for includes\n2007-08-28\tJS\t->oncreate: -filenaming to specify how include files are named prefix/suffix/extension\n2007-08-28\tJS\t->filename: Implemented support for flexible folder structures\n2007-08-28\tJS\tInstance variable #actionconfigfile_didrun was not properly declared\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-14\tJS\t->insert: -url='/' can now be used to specify the \"home\" location. \n2007-06-13\tJS\tadded ->children to get a reference to the children nav object for a specified path, so new children can be inserted. Must call ->reindex afterwards. \n2007-06-13\tJS\tadded ->reindex to rebuild the index maps from scratch. Must be done after adding children items. \n2007-06-13\tJS\tadded ->addchildren to replace a current children nav object for a specified path. Will handle the reindexing transparently. \n2007-06-13\tJS\tadded ->keymap, ->pathmap and ->urlmap to access the index maps so they call reindex if they have been invalidated (for example by ->addchildren)\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-06-08\tJS\t->insert: params with empty values are now ignored\n2007-05-04\tJS\t->insert: added check that default item exists in children before storing the default\n2007-04-19\tJS added ->data to retrieve data stored for the current path (or specified path). Optional -type ensures the returned data has the correct type. \n2007-04-19\tJS ->insert: added -data to store arbitrary data object for each path. The object is stored as reference so a variable can be changed after it has been added to the nav object\n2007-04-19\tJS\tadded ->patharray to return the current path as array\n2007-04-17\tJS\t->renderhtml: template now supports #link##title##/link##children# in addition to #item# to provide more flexibility\n2007-04-17\tJS\t->oncreate: added support for -template, -class, currentclass and -currentmarker\n2007-04-13\tJS\tImplemented -class per navitem (only worked globally with setformat before)\n2007-04-03\tJS\t->renderhtml: added -renderpath, -expand and -flat to be able to render parts of the nav menu for more flexible layout\n2007-04-03\tJS\t->renderbreadcrumb: added -home to show the default navigation item first in the breadcrumb \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tChanged navmethod path so it uses response_filepath instead of $url_path\n2007-02-25\tJS\tAdded ->actionpath\n2007-02-24\tJS\t->renderhtml: improved handling of classes in nav links\n2007-02-22\tJS\t->url: added -except\n2007-02-09\tJS\t->url: corrected the behavior for plain parameters passed to the tag\n2007-02-05\tJS\t->insert: Added -param to be able to specify params that should be propagated in nav for certain nav elements (like -keyvalue to be able to move between different subtabs for a selected record\n2007-02-05\tJS\t->renderhtml now use ->url to get the right links\n2007-02-01\tJS\tMade usage of trace optional to improve performance\n2007-02-01\tJS\tImprovements to debug_trace to log also recursive events\n2007-02-01\tJS\tAdded ->haschildren, which is now used by ->renderhtml to properly show or hide child level\n2007-01-31\tJS\t->renderhtml Added renderhtml_levels to keep track of how many levels deep navigation has been rendered, to be able to add proper spacing between navigation and content\n2007-01-31\tJS \t->url: -urlargs  Improved handling of urlargs and ?/& delimiters, should work better with navmethod path\n2007-01-30\tJS\tRemoved automatic link title attribute since it can be confusing to show children page titles there\n2007-01-30\tJS\tCorrected parameter path to -path (bug)\n2007-01-23\tJS\t->include: 'config' checks if the same config has already run as actionconfig and won't run again in that case\n2007-01-23\tJS\t->include checks if the file exists first, so no need for empty placeholder files\n2007-01-23\tJS\tAdded ->include and ->library\n2007-01-23\tJS\tAdded ->setlocation\n2007-01-17\tJS\tAdded insert: -hide to allow a location without showing it in navigation\n\nTODO\nAdd support for compound expressions for template. The expression could return a map that would override corresponding param values. \n->insert: Add -raw to be able to inject code into the link tag, similar to form->addfield(-raw). \nExclude file name for example index.lasso from getargs\nOptimize nav->url! Very slow with complex nav object. \nNeeds to exclude also -keyfield and -lockfield. Maybe better to add an option to ->url to not auto-add any \"-\" params at all. \n-params are not sent along in breadcrumb links\nNeed simple way to exclude certain \"-\" params from ->url, also in config per nav item\nAdd support for adding nav structure from a database\nMove templates to a member tag to be make it easier to subclass\nMake it possible to use external URL for -url (make sure there is no / before http)\n\n*/\n\n\tlocal: 'navitems'=array,\t// array of maps\n\t\t'keymap'=map,\t\t\t// to speed up the locating of critical navigation elements (TBD)\n\t\t'pathmap'=map,\t\t\t// contains full key paths also for children navitems\n\t\t'urlmap'=map,\t\t\t// to translate a url to key path, contains url also for children navitems\n\t\t'default'=string,\t\t// default path, i.e. home page\n\t\t'parentkey'=null,\t\t// the key of the parent to this navitem (null for top item)\n\t\t'template'=string,\n\t\t'class'=string,\n\t\t'currentclass'=string,\n\t\t'currentmarker'=null,\n\n\t\t'actionpath'=string,\t\t// captured from -action parameter in submission\n\t\t'path'=string,\t\t\t// captured from path param or urlhandler and translated from url\n\t\t'patharray'=array,\t\t// path broken down into elements\n\t\t'pathargs'=string,\t\t// extra path parts that can contain record identification etc\n\t\t'urlparams'array,\t\t// holds everything needed to generate nav links\n\t\t'navmethod'=string,\t\t// path or param depending on how the nav is propagated. To be able to force path, since url handler doesn't kick in for the start page\n\t\t'filenaming'=string,\n\t\t'directorytreemap'=map,\t// contains a list of all existing filenames in the knop directory tree\n\t\t'root'='/',\t\t\t\t// site root\n\t\t'fileroot'='/',\t\t\t// root for physical files\n\t\t'renderhtml_levels'=0,\t// number of levels rendered by renderhtml\n\t\t// 'tagtime'=integer, \t\t\t// moved to knop_base\n\t\t// 'tagtime_tagname'=string, \t// moved to knop_base\n\t\t'debug_trace'=array,\n\t\t'dotrace'=false,\n\t\t'actionconfigfile_didrun'=string,\t// path to action config file that has been run for the current page load\n\t\t\t\t\t\t\t\t\t\t\t// used to not load the same config again\n\t\t'error_lang'=(knop_lang: -default='en', -fallback);\n\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-default (optional) Key of default navigation item\\n\\\n\t\t\t-root (optional) The root path for the site section that this nav object is used for\\n\\\n\t\t\t-fileroot (optional) The root for include files, to be able to use a different root for physical files than the logical root of the site. Defaults to the value of -root. \\n\\\n\t\t\t-navmethod (optional) path or param. Path for \"URL designed\" URLs, otherwise a -path parameter will be used for the navigation. \\n\\\n\t\t\t-filenaming (optional) prefix (default), suffix or extension, specifies how include files are named\\n\\\n\t\t\t-trace (optional flag) If specified debug_trace will be used. Defaults to disabled for performance reasons. \\n\\\n\t\t\t-template (optional) html template used to render the navigation menu\\n\\\n\t\t\t-class (optional) default class for all navigation links\\n\\\n\t\t\t-currentclass (optional) class added for the currently active link\\n\\\n\t\t\t-currentmarker (optional) character(s) show to the right link of current nav (typically &raquo;)',\n\t\t-optional='template',\n\t\t-optional='class',\n\t\t-optional='currentclass',\n\t\t-optional='currentmarker',\n\t\t-optional='default',\n\t\t-optional='root',\n\t\t-optional='fileroot',\n\t\t-optional='navmethod',\n\t\t-optional='filenaming',\n\t\t-optional='trace';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace');\n\t\t// TODO: check if we are in an inline, in that case use -key, -label etc as field names and loop through records to fill nav\t\t\n\t\t\n\t\tlocal_defined('default') ? (self -> 'default') = #default;\n\t\tlocal_defined('root') ? (self -> 'root') = #root;\n\t\tlocal_defined('navmethod') ? (self -> 'navmethod') = #navmethod; \n\t\tlocal_defined('template') ? (self -> 'template') = #template;\n\t\tlocal_defined('class') ? (self -> 'class') = #class;\n\t\tlocal_defined('currentclass') ? (self -> 'currentclass') = #currentclass;\n\t\tlocal_defined('currentmarker') ? (self -> 'currentmarker') = #currentmarker;\n\t\tlocal_defined('filenaming') ? (self -> 'filenaming') = #filenaming;\n\n\t\t(self -> 'dotrace') = (local_defined: 'trace') && #trace != false;\n\t\t// normalize slashes\n\t\t(self -> 'root') -> removeleading('/') & removetrailing('/');\n\t\t(self -> 'root') = '/' + (self -> 'root') + '/';\n\t\t(self -> 'root') -> replace('//', '/');\n\n\t\tif: (local_defined: 'fileroot');\n\t\t\t(self -> 'fileroot') = #fileroot;\n\t\t\t// normalize slashes\n\t\t\t(self -> 'fileroot') -> removeleading('/') & removetrailing('/');\n\t\t\t(self -> 'fileroot') = '/' + (self -> 'fileroot') + '/';\n\t\t\t(self -> 'fileroot') -> replace('//', '/');\n\t\telse;\n\t\t\t(self -> 'fileroot') = (self -> 'root');\n\t\t/if;\n\t\t\n\t\t// validate and set default value\n\t\t(map: 'prefix', 'suffix', 'extension') !>> (self -> 'filenaming') ? (self -> 'filenaming') = 'prefix'; \n\t\t\n\t\t// can not perform getlocation here since the nav structure must be defined first\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'onconvert', -description='Outputs the navigation object in a very basic form, just to see what it contains';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'output' = (self -> 'parentkey') + ': ';\n\t\titerate: (self -> 'navitems'), (local: 'navitem');\n\t\t\t#output += #navitem + '\\n';\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'insert', -description='Adds a navigation item to nav structure\\n\\\n\t\t\tParameters:\\n\\ \n\t\t\t-key (required) The key will be part of the path\\n\\ \n\t\t\t-label (optional) The menu text\\n\\ \n\t\t\t-url (optional) Nav url to use instead of the default url that is derived from the keys path, used as shortcuts for cleaner URLs\\n\\ \n\t\t\t-title (optional) Link href title text\\n\\ \n\t\t\t-template (optional) Template to use only for this specific nav item, in the form #link##label##current##/link##children#\\n\\\n\t\t\t-children (optional nav) Sub navitems\\n\\ \n\t\t\t-default (optional) Key of default child subnav item\\n\\ \n\t\t\t-param (optional) Name of param or params (string/array) that should be sent along with nav links\\n\\ \n\t\t\t-class (optional) CSS class name to use for this nav item (defaults to none)\\n\\ \n\t\t\t-filename (optional) Name stem for lib, action and content files (defaults to key path with _ instead of /), to be able to use the same processing files for multiple locations\\n\\ \n\t\t\t-disabled (optional flag) Makes the menu item dimmed and non-clickable\\n\\ \n\t\t\t-hide (optional flag) Makes the location valid without showing a menu item for it\\n\\ \n\t\t\t-after (optional) After which navitem to insert this navitem (key or numeric index)\\n\\ \n\t\t\t-data (optional) Arbitrary data object (variable, map, array, compound expression) that can be returned for the location by calling ->data',\n\t\t-required='key',\n\t\t-optional='label',\n\t\t-optional='default',\n\t\t-optional='url', -copy,\n\t\t-optional='title',\n\t\t-optional='template',\n\t\t-optional='children', -type='nav',\n\t\t-optional='param',\n\t\t-optional='class',\n\t\t-optional='filename',\n\t\t-optional='disabled',\n\t\t-optional='hide',\n\t\t-optional='after',\n\t\t-optional='data';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t\n\t\tfail_if: !(local_defined: 'hide') && (local: 'label') == '', -1, 'Insert requires a label';\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': -key = ' + #key);\n\t\t// fail_if: (self -> keymap) >> #key, -1, #key + ' is not unique';\n\t\tif: (self -> keymap) >> #key;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': *** Error key ' + #key + ' is not unique - skipping');\n\t\t\treturn;\n\t\t/if;\n\t\tlocal: 'urlmapchildren'=map,\n\t\t\t'pathmapchildren'=map;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tif: (local_defined: 'children');\n\t\t\t(#children -> 'parentkey') = #key;\n\t\t\t// grab urlmap and pathmap from children\n\t\t\t#urlmapchildren = (#children -> urlmap);\n\t\t\t#pathmapchildren = (#children -> pathmap);\n\t\t\tif: !(local_defined: 'title');\n\t\t\t\t// set default title to labels of children\n\t\t\t\t/*\n\t\t\t\tlocal: 'title' = array;\n\t\t\t\titerate: (#children -> 'navitems'), (local: 'item');\n\t\t\t\t\t#title -> (insert: (#item -> (find: 'label')));\n\t\t\t\t/iterate;\n\t\t\t\t#title = #title ->  (join: ', ');\n\t\t\t\t*/\n\t\t\t/if;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': adding children');\n\t\t\t(self -> 'debug_trace') -> (merge: (#children -> 'debug_trace'));\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': done adding children');\n\t\t/if;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tlocal: 'navitem'=map;\n\t\tlocal_defined('key') && #key != '' ? #navitem -> insert('key' = #key); \n\t\tlocal_defined('label') && #label != '' ? #navitem -> insert('label' = #label); \n\t\tlocal_defined('default') && #default != '' ? #navitem -> insert('default' = #default); \n\t\tlocal_defined('url') && #url != '' ? #navitem -> insert('url' = #url); \n\t\tlocal_defined('title') && #title != '' ? #navitem -> insert('title' = #title); \n\t\tlocal_defined('template') && #template != '' ? #navitem -> insert('template' = #template); \n\t\tlocal_defined('children') && #children != '' ? #navitem -> insert('children' = #children); \n\t\tlocal_defined('class') && #class != '' ? #navitem -> insert('class' = #class); \n\t\tlocal_defined('filename') && #filename != '' ? #navitem -> insert('filename' = #filename);\n\n\t\tif(local_defined('default') && #default != '' && #pathmapchildren >> #default);\n\t\t\t// only add default that exists in children\n\t\t\t#navitem -> insert('default' = #default);\n\t\t/if;\n\t\t// store these params by reference\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tlocal_defined('data') && #data != '' ? #navitem -> insert('data' = @#data);\n\n\t\tif: (local_defined: 'param') && #param -> type =='array';\n\t\t\t#navitem -> (insert: 'params'=#param);\n\t\telse: (local_defined: 'param') && #param != '';\n\t\t\t#navitem -> (insert: 'params'=(array: #param));\n\t\t/if;\n\t\t#navitem -> (insert: 'disabled'=(local_defined: 'disabled') && #disabled != false);\n\t\t#navitem -> (insert: 'hide'=(local_defined: 'hide') && #hide != false);\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tlocal: 'index'=(self -> 'navitems') -> size + 1;\n\t\tif: (local_defined: 'after') && (string: #after) -> size;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': -after=' + #after);\n\t\t\tif: #after -> type == 'integer';\n\t\t\t\t#index = #after;\n\t\t\telse: (self -> keymap) >> #after;\n\t\t\t\t#index = (self -> keymap) -> (find: #after) + 1;\n\t\t\t/if;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': index=' + #index);\n\t\t/if;\n\t\tif: #urlmapchildren -> size;\n\t\t\t// we have urlmap from children - insert it into our urlmap with modified keyvalues\n\t\t\titerate: #urlmapchildren, (local: 'urlitem');\n\t\t\t\tfail_if: (self -> urlmap) >> #urlitem -> name, -1, 'url ' + (#urlitem -> name) + ' is not unique';\n\t\t\t\t(self -> 'urlmap') -> (insert: #urlitem -> name = #key + '/' + (#urlitem -> value));\n\t\t\t/iterate;\n\t\t/if;\n\t\tif: #pathmapchildren -> size;\n\t\t\t// we have pathmap from children - insert it into our pathmap with modified keys\n\t\t\titerate: #pathmapchildren, (local: 'pathitem');\n\t\t\t\t(self -> 'pathmap') -> (insert: #key + '/' + #pathitem -> name);\n\t\t\t/iterate;\n\t\t/if;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tif: (local_defined: 'url') && #url != '';\n\t\t\t#url -> (removeleading: '/') & (removetrailing: '/');\n\t\t\tfail_if: (self -> urlmap) >> #url, -1, 'url ' + #url + ' is not unique';\n\t\t\t(self -> 'urlmap') -> (insert: #url = #key);\n\t\t/if;\n\t\t(self -> 'pathmap') -> (insert: #key);\n\t\t(self -> 'navitems') -> (insert: #navitem, #index);\n\t\t// update keymap\n\t\t(self -> 'keymap') = map;\n\t\titerate: (self -> 'navitems'), (local: 'item');\n\t\t\t(self -> 'keymap') -> (insert: (#item -> (find: 'key'))  = loop_count);\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\t\n\t/define_tag;\n\t\n\t\n\t/*\n\tdefine_tag: 'remove',\t-description='Remove nav object and its children for specified key path. Must update index maps afterwards. ',\n\t\t-required='path', -type='string', -copy;\n\t\tfail: -1, 'Not implemented'; // This tag is not yet functional\n\t\t\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t#path -> removeleading('/') & removetrailing('/');\n\t\tlocal: 'path_remove'=#path -> split('/') -> last;\n\t\t#path -> removetrailing(#path_remove) & removetrailing('/');\n\t\t// we need to find a reference to the navitems array of maps that contains the nav item to remove\n\t\tif: #path -> size;\n\t\t\tlocal: 'navitem'=@(self -> getnav(#path));\n\t\telse;\n\t\t\tlocal: 'navitem'=@self -> getnav;\n\t\t/if;\n\t\t// we also need to find a reference to the keymap where we can find the index of the array item to remove\n\t\treturn: #navitem;\n\t\t(#navitem -> getnav) -> remove(#navitem -> keymap -> find(#path_remove));\n\t\t\n\t\t// invalidate index maps\n\t\t(#navitem -> 'keymap') = null;\n\t\t(#navitem -> 'pathmap') = null;\n\t\t(#navitem -> 'urlmap') = null;\n\n\t\t(self -> 'keymap') = null;\n\t\t(self -> 'pathmap') = null;\n\t\t(self -> 'urlmap') = null;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t*/\n\t\n\tdefine_tag: 'addchildren',\t-description='Add nav object as children to specified key path, replacing the current children if any. \\\n\t\tMust update index maps afterwards. ',\n\t\t-required='path',\n\t\t-required='children', -type='nav';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'navitem'=@(self -> (getnav: #path));\n\t\t#navitem -> (insert: 'children' = #children);\n\n\t\t// invalidate index maps\n\t\t(#navitem -> 'keymap') = null;\n\t\t(#navitem -> 'pathmap') = null;\n\t\t(#navitem -> 'urlmap') = null;\n\n\t\t(self -> 'keymap') = null;\n\t\t(self -> 'pathmap') = null;\n\t\t(self -> 'urlmap') = null;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'children', -description='Return reference to the children of the current navigation object map, or for the specified path',\n\t\t-optional='path', -copy;  \n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t!(local_defined: 'path') ? local: 'path'=(self -> 'patharray');\n\t\tif: #path -> type != 'array';\n\t\t\t#path = string: #path;\n\t\t\t#path -> (removeleading: '/') & (removetrailing: '/');\n\t\t\t#path = #path -> (split: '/');\n\t\t/if;\n\t\t(self -> pathmap) !>> (#path -> (join: '/')) ? return: knop_nav;\n\n\t\tlocal: 'nav'=@(self -> (getnav: #path));\n\t\tif: #nav !>> 'children';\n\t\t\t#nav -> (insert: 'children'=knop_nav);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @(#nav -> (find: 'children'));\n\t/define_tag;\n\t\n\tdefine_tag: 'reindex', -description='To recreate keymap, pathmap and urlmap';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t(self -> 'keymap') = map;\n\t\t(self -> 'pathmap') = map;\n\t\t(self -> 'urlmap') = map;\n\t\tlocal: 'key'=null, 'pathitem'=null, 'urlitem'=null, 'url'=string;\n\t\titerate: (self -> 'navitems'), (local: 'navitem');\n\t\t\t#key = #navitem -> (find: 'key');\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': key=' + #key);\n\t\t\t(self -> 'keymap') -> (insert: #key = loop_count);\n\t\t\t(self -> 'pathmap') -> (insert: #key);\n\t\t\tif: #navitem -> (find: 'url') != '';\n\t\t\t\t#url=#navitem -> (find: 'url');\n\t\t\t\t#url -> (removeleading: '/') & (removetrailing: '/');\n\t\t\t\tfail_if: (self -> urlmap) >> #url, -1, 'url ' + #url + ' is not unique';\n\t\t\t\t(self -> 'urlmap') -> (insert: #url = #key);\n\t\t\t/if;\n\t\t\tif: #navitem >> 'children';\n\t\t\t\t#navitem -> (find: 'children') -> reindex; // recursive\n\t\t\t\titerate: (#navitem -> (find: 'children') -> pathmap), #pathitem;\n\t\t\t\t\t(self -> 'pathmap') -> (insert: #key + '/' + #pathitem -> name);\n\t\t\t\t/iterate;\n\t\t\t\titerate: (#navitem -> (find: 'children') -> urlmap), #urlitem;\n\t\t\t\t\tfail_if: (self -> urlmap) >> #urlitem -> name, -1, 'url ' + (#urlitem -> name) + ' is not unique';\n\t\t\t\t\t(self -> 'urlmap') -> (insert: #urlitem -> name = #key + '/' + (#urlitem -> value));\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'keymap';\n\t\t(self -> 'keymap') -> type != 'map' ? self -> reindex;\n\t\treturn: (self -> 'keymap');\n\t/define_tag;\n\tdefine_tag: 'pathmap';\n\t\t(self -> 'pathmap') -> type != 'map' ? self -> reindex;\n\t\treturn: (self -> 'pathmap');\n\t/define_tag;\n\tdefine_tag: 'urlmap';\n\t\t(self -> 'urlmap') -> type != 'map' ? self -> reindex;\n\t\treturn: (self -> 'urlmap');\n\t/define_tag;\n\t\n\tdefine_tag: 'getlocation', -description='Grabs path and actionpath from params or urlhandler, translates from url to path if needed. This must be called before using the nav object. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-setpath (optional) forces a new path',\n\t\t-optional='setpath';\n\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name, -time, -type=self->type);/handle;\n\t\tlocal: 'path'=string, \n\t\t\t'patharray'=array, \n\t\t\t'originalpath'=string, \n\t\t\t'pathargs'=string,\n\t\t\t'actionpath'=string,\n\t\t\t'validurl'=false;\n\t\t\t// TODO: Produce 404 error for invalid urls\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t\t\n\t\t(self -> 'path') = string;\n\t\t(self -> 'patharray') = array;\n\t\t(self -> 'pathargs') = string;\n\t\t(self -> 'actionpath') = string;\n\t\t// get action path\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t#actionpath = (#clientparams >> '-action' ? (#clientparams -> (find: '-action') -> first -> value) | string);\n\t\t#actionpath -> (removeleading: '/') & (removetrailing: '/');\n\t\t// validate action path\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': testing action path ' + #actionpath);\n\t\tif: #actionpath -> size && (self -> pathmap) >> #actionpath;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found match for action path ' + #actionpath);\n\t\t\t(self -> 'actionpath') = #actionpath;\n\t\t/if;\n\n\t\t// get url or path\n\t\tif: (local: 'setpath') != '';\n\t\t\t#originalpath = string: #setpath;\n\t\telse: (self -> 'navmethod') != 'param'; \n\t\t\t(self -> 'navmethod') = 'path';\n\t\t\t#originalpath = response_filepath;\n\t\t\t#originalpath -> (removeleading: (self -> 'root'));\n\t\telse: (self -> 'navmethod') != 'path';\n\t\t\t(self -> 'navmethod') = 'param';\n\t\t\tif: #clientparams >> '-path';\n\t\t\t\t// path is sent as -path GET or POST parameter\n\t\t\t\t#originalpath = (#clientparams >> '-path' ? (#clientparams -> (find: '-path') -> first -> value) | string);\n\t\t\telse: client_getparams -> size && client_getparams -> first -> isa('string');\n\t\t\t\t// path is sent as first unnamed GET parameter \n\t\t\t\t#originalpath = client_getparams -> first;\n\t\t\t/if;\n\t\t/if;\n\t\t#originalpath -> (removeleading: '/') & (removetrailing: '/');\n\t\t#path = #originalpath;\n\t\t#patharray = (string: #originalpath) -> (split: '/');\n\t\t// look for longest match in urlmap\n\t\tlocal: 'pathfinder'=#patharray;\n\t\tloop: #pathfinder -> size;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': looking at url ' + #pathfinder -> (join: '/'));\n\t\t\tif: (self -> urlmap) >> #pathfinder -> (join: '/');\n\t\t\t\t// use translated key path\n\t\t\t\t#path=(self -> urlmap) -> (find: #pathfinder -> (join: '/'));\n\t\t\t\t#validurl=true;\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found url match for ' (#pathfinder -> (join: '/')) + ' translating to ' + #path);\n\t\t\t\tloop_abort;\n\t\t\telse;\n\t\t\t\t// remove last path part and try again\n\t\t\t\t#pathfinder -> remove;\n\t\t\t/if;\n\t\t/loop;\n\t\tif: !#validurl;\n\t\t\t// no url found, dig into the nav structure to see if path is valid\n\t\t\tlocal: 'pathfinder'=#patharray;\n\t\t\tloop: #pathfinder -> size;\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': looking at path ' + #pathfinder -> (join: '/'));\n\t\t\t\tif: (self -> pathmap) >> #pathfinder -> (join: '/');\n\t\t\t\t\t// use key path\n\t\t\t\t\t#path=#pathfinder -> (join: '/');\n\t\t\t\t\t#validurl=true;\n\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found path match for ' (#pathfinder -> (join: '/')));\n\t\t\t\t\tloop_abort;\n\t\t\t\telse;\n\t\t\t\t\t// remove last path part and try again\n\t\t\t\t\t#pathfinder -> remove;\n\t\t\t\t/if;\n\t\t\t/loop;\n\t\t/if;\n\t\t// look for disabled path\n\t\tif: #validurl;\n\t\t\t#path = (string: #path) -> (split: '/');\n\t\t\twhile: #path -> size > 1 && (self -> (getnav: #path)) -> (find: 'disabled');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': path '+ #path + ' is disabled');\n\t\t\t\t#path -> remove;\n\t\t\t/while;\n\t\t\tif: (self -> (getnav: #path)) -> (find: 'disabled');\n\t\t\t\t#validurl = false;\n\t\t\t/if;\n\t\t\t#path = #path -> (join: '/');\n\t\t/if;\n\t\t\n\t\tif: !#validurl;\n\t\t\t// we haven't found a valid location, we must resort to a default page\n\t\t\tif: self -> 'default' != '' && self -> pathmap >>  self -> 'default';\n\t\t\t\t#path = self -> 'default';\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': use defalt location ' #path);\n\t\t\telse;\n\t\t\t\t// use first page as default, if it exists\n\t\t\t\titerate(self -> 'navitems', local('navitem'));\n\t\t\t\t\tif(#navitem >> 'key' \n\t\t\t\t\t\t&& !(#navitem -> find('disabled')) \n\t\t\t\t\t\t&& !(#navitem -> find('hide')));\n\t\t\t\t\t\t#path = #navitem -> find('key');\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': use first page as default location ' #path);\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\tif: (self -> pathmap) >> #path;\n\t\t\t\t#validurl = true;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': no navigation seems to be defined ' #path);\n\t\t\t/if;\n\t\t/if;\n\t\t\n\t\tif: #validurl;\n\t\t\t// recursively look for default sub page\n\t\t\tlocal: 'hasdefault'=true;\n\t\t\twhile: #hasdefault;\n\t\t\t\tlocal: 'defaultkey' = (self -> (getnav: #path)) -> (find: 'default');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': looking for default key ' + #defaultkey);\n\t\t\t\tif: !(((self -> (getnav: #path))) -> (find: 'disabled')) \n\t\t\t\t\t&& !(((self -> (getnav: #path + '/' + #defaultkey))) -> (find: 'disabled'))\n\t\t\t\t\t&& #defaultkey != '' && (self -> (getnav: #path)) -> (find: 'children') -> keymap >> #defaultkey;\n\t\t\t\t\t#path += '/' + #defaultkey;\n\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': new path is ' + #path);\n\t\t\t\telse;\n\t\t\t\t\t#hasdefault=false;\n\t\t\t\t/if;\n\t\t\t/while;\n\t\t\t\n\t\t\t// look for path arguments = the leftover when we found a matching path\n\t\t\t#pathargs = #originalpath;\n\t\t\t#pathargs -> (removeleading: #pathfinder -> (join: '/')) & (removeleading: '/');\n\t\t\t\n\t\t\t// store values\n\t\t\t(self -> 'path') = #path;\n\t\t\t(self -> 'patharray') = (string: #path) -> (split: '/');\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': path is ' + #path);\n\t\t\tif: #pathargs != '';\n\t\t\t\t(self -> 'pathargs') = #pathargs;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': pathargs is ' + #pathargs);\n\t\t\t/if;\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': no matching path found');\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'setlocation', -description='Sets the current location to a specific nav path or url',\n\t\t-required='path';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tself -> (getlocation: -setpath=#path);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'setformat', -description='Sets html template for the nav object, use #items# #item# #/items# or more elaborate #items# #link##label##current##/link##children# #/items# as placeholders.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-template (optional string) Html template, defaults to <ul>#items#<li>#item#</li>#/items#</ul>\\n\\\n\t\t\t-class (optional string) Css class name that will be used for every navigation link\\n\\\n\t\t\t-currentclass (optional string) Css class name that will be added to the currently active navigation link (defaults to crnt)\\n\\\n\t\t\t-currentmarker (optional string) String that will be appended to menu text of currently active navigation link',\n\t\t-optional='template', -type='string',\n\t\t-optional='class', -type='string',\n\t\t-optional='currentclass', -type='string',\n\t\t-optional='currentmarker', -type='string';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t\n\t\t(local_defined: 'template') ? (self -> 'template') = #template;\n\t\t(local_defined: 'class') ? (self -> 'class') = #class;\n\t\t(local_defined: 'currentclass') ? (self -> 'currentclass') = #currentclass;\n\t\t(local_defined: 'currentmarker') ? (self -> 'currentmarker') = #currentmarker;\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'haschildren',\t-description='Returns true if nav object has children that are not all -hide.',\n\t\t-required='navitem', -type='map';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'haschildren'=#navitem >> 'children';\n\t\tif: #haschildren;\t// verify that there is at least one child that does not have -hide\n\t\t\t#haschildren=false; // assume there is no child to show\n\t\t\titerate: #navitem -> (find: 'children') -> 'navitems', (local: 'childitem');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': checking ' + (#childitem -> (find: 'key')) + ', hide=' + (#childitem -> (find: 'hide')));\n\t\t\t\tif: !(#childitem -> (find: 'hide')); // found one\n\t\t\t\t\t#haschildren=true;\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': ' + #haschildren);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #haschildren;\n\t/define_tag;\n\n\tdefine_tag: 'renderhtml', -description='Called recursively to render hierarchial nav structure.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-renderpath (optional) Only render the children of the specified path (and below)\\n\\\n\t\t\t-flat (optional flag) Only render one level\\n\\\n\t\t\t-expand (optional flag) Render the entire expanded nav tree and not just the currently active branch\\n\\\n\t\t\t-basepath (optional) Internal, needed for recursive calls to get proper paths\\n\\\n\t\t\t-ancestor (optional nav) Internal, reference to the topmost object, needed for recursive calls\\n\\\n\t\t\t-xhtml (optional) XHTML valid output',\n\t\t-optional='renderpath', -copy,\n\t\t-optional='flat',\n\t\t-optional='expand',\n\t\t-optional='basepath', -copy,\n\t\t-optional='ancestor', -type='nav';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tif: !(local_defined: 'ancestor');\n\t\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name, -time, -type=self->type);/handle;\n\t\t\t// reset timer when called at top level\n\t\t\t// (self -> 'timer')=0; // undefined instance variable\n\t\t/if;\n\t\t\n\t\t// create reference to the topmost level nav object\n\t\tlocal: 'topself'=(local_defined: 'ancestor') ? @#ancestor | @self ;\n\t\t!(local_defined: 'ancestor') ? (#topself -> 'renderhtml_levels') = 1 | (#topself -> 'renderhtml_levels') += 1;\n\t\t\n\t\tlocal: '_flat' = (local_defined: 'flat') && #flat != false;\n\t\tlocal: '_expand' = (local_defined: 'expand') && #expand != false;\n\t\t\n\t\tlocal: 'template'=(self -> 'template' != '' ? self -> 'template' | #topself -> 'template');\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t\n\t\t!(local_defined: 'basepath') ? local: 'basepath'=string;\n\t\tif: #template == '';\n\t\t\t#template = '<ul>#items#<li>#item#</li>#/items#</ul>';\n\t\t/if;\n\t\tlocal: 'output'=string,\n\t\t\t'itemoutput'=string,\n\t\t\t'itemchildren'=string,\n\t\t\t'itemrow'=string,\n\t\t\t'link'=string,\n\t\t\t'linkparams'=array,\n\t\t\t'thispath'=string,\n\t\t\t'classarray'=array,\n\t\t\t'currentmarker'=string,\n\t\t\t'itemtemplate'=(string_findregexp: #template, -find='(?si)#items#(.*?)#/items#'),\n\t\t\t'itemlinkstart'=string,\n\t\t\t'itemlinkend'=string,\n\t\t\t'itemlabel'=string;\n\t\t#itemtemplate = (#itemtemplate -> size >= 2 ? #itemtemplate -> (get: 2) | string);\n\t\t\n\t\tif: (local_defined: 'renderpath') && #renderpath != '' && #renderpath != '/';\n\t\t\t// render nav for specified path\n\t\t\t#renderpath -> (removeleading: '/') & (removetrailing: '/');\n\t\t\tif: #topself -> (getnav: #renderpath) -> (find: 'children') -> type == 'nav';\n\t\t\t\treturn: @(#topself -> (getnav: #renderpath) -> (find: 'children') -> (renderhtml: -basepath=#renderpath, \n\t\t\t\t\t-ancestor=#topself, -flat=#_flat, -expand=#_expand));\n\t\t\telse;\n\t\t\t\treturn: string;\n\t\t\t/if;\n\t\t/if;\n\t\titerate: (self -> 'navitems'), (local: 'navitem');\n\t\t\tif: #navitem -> (find: 'hide');\n\t\t\t\t// do not show in navigation\n\t\t\telse;\n\t\t\t\t#itemlinkstart=string;\n\t\t\t\t#itemlabel=string;\n\t\t\t\t#itemlinkend=string;\n\t\t\t\t#itemchildren = string;\n\t\t\t\t#currentmarker=string;\n\n\t\t\t\t#thispath=#basepath + '/' + (#navitem -> (find: 'key'));\n\t\t\t\t#thispath -> (removeleading: '/');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': thispath is ' + #thispath + ', currentpath is ' + (#topself -> 'path'));\n\t\t\t\tif: (#navitem -> (find: 'template')) != '';\n\t\t\t\t\t#itemrow = (#navitem -> (find: 'template'));\n\t\t\t\telse;\n\t\t\t\t\t#itemrow = #itemtemplate;\n\t\t\t\t/if;\n\t\t\t\t#classarray = array;\n\t\t\t\t(#topself -> 'class') != '' ? #classarray -> (insert: (#topself -> 'class'));\n\t\t\t\t(#navitem -> (find: 'class')) != '' ? #classarray -> (insert: (#navitem -> (find: 'class')));\n\t\t\t\tif: #navitem -> (find: 'disabled');\n\t\t\t\t\t#itemlinkstart='<span';\n\t\t\t\t\tif: #classarray -> size;\n\t\t\t\t\t\t#itemlinkstart += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemlinkstart += '>';\n\t\t\t\t\t#itemlabel=(#navitem -> (find: 'label'));\n\t\t\t\t\t#itemlinkend='</span>';\n\t\t\t\telse;\n\t\t\t\t\t/* this code is moved into ->url\n\t\t\t\t\tif: (#navitem -> (find: 'params')) -> type == 'array';\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': checking params for ' + #thispath + ' with ' + (#navitem -> (find: 'params')));\n\t\t\t\t\t\t// TODO: Move this to a new member tag ->linkparams: path|navitem\n\t\t\t\t\t\t#linkparams=array;\n\t\t\t\t\t\titerate: #navitem -> (find: 'params'), (local: 'param');\n\t\t\t\t\t\t\tif: #clientparams >> #param && #clientparams -> (find: #param) -> first -> type == 'pair';\n\t\t\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got pair param');\n\t\t\t\t\t\t\t\t#linkparams -> (insert: #clientparams -> (find: #param) -> first -> name = #clientparams -> (find: #param) -> first -> value);\n\t\t\t\t\t\t\telse: #clientparams >> #param;\n\t\t\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got plain param');\n\t\t\t\t\t\t\t\t#linkparams -> (insert: #clientparams -> (find: #param) -> first);\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#link = (self -> (url: -path=#thispath, -params=self -> (linkparams: -navitem=#navitem), -topself=#topself));\n\t\t\t\t\telse;*/\n\t\t\t\t\t\t//#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': no params for ' + #thispath);\n\t\t\t\t\t\t#link = (self -> (url: -path=#thispath, -topself=#topself));\n\t\t\t\t\t///if;\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t#itemlinkstart = '<a href=\"' + #link + '\"';\n\t\t\t\t\tif: (#navitem -> (find: 'title')) != '';\n\t\t\t\t\t\t#itemlinkstart += ' title=\"' + (encode_html: (#navitem -> (find: 'title'))) + '\"';\n\t\t\t\t\t/if;\n\t\t\t\t\tif: (((#topself -> 'path') + '/') -> (beginswith: #thispath + '/'));\n\t\t\t\t\t\t#classarray -> (insert: ((#topself -> 'currentclass') != '' ? (#topself -> 'currentclass') | 'crnt') );\n\t\t\t\t\t/if;\n\t\t\t\t\tif: #classarray -> size;\n\t\t\t\t\t\t#itemlinkstart += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemlinkstart += '>';\n\t\t\t\t\t#itemlabel=(#navitem -> (find: 'label'));\n\t\t\t\t\tif: #thispath == (#topself -> 'path');\n\t\t\t\t\t\tif: (self -> 'currentmarker') -> type != 'null';\n\t\t\t\t\t\t\t#currentmarker = (self -> 'currentmarker');\n\t\t\t\t\t\telse: (#topself -> 'currentmarker') -> type != 'null';\n\t\t\t\t\t\t\t#currentmarker = (#topself -> 'currentmarker');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemlinkend = '</a>';\n\t\t\t\t\tif: ( (((#topself -> 'path') + '/') -> (beginswith: #thispath + '/')) || #_expand)\n\t\t\t\t\t\t&& self -> (haschildren: #navitem)\n\t\t\t\t\t\t&& !#_flat;\n\t\t\t\t\t\t// recursively render child items\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': begin rendering children for ' + #basepath + '/' + (#navitem -> (find: 'key')) );\n\t\t\t\t\t\t// clear debug_trace for child\n\t\t\t\t\t\t(#navitem -> (find: 'children') -> 'debug_trace') = array;\n\t\t\t\t\t\t#itemchildren += (#navitem -> (find: 'children') -> (renderhtml: -basepath=#basepath + '/' + (#navitem -> (find: 'key')), \n\t\t\t\t\t\t\t-ancestor=#topself,\n\t\t\t\t\t\t\t-flat=#_flat,\n\t\t\t\t\t\t\t-expand=#_expand));\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (merge: (#navitem -> (find: 'children') -> 'debug_trace'));\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': done rendering children');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif: #itemrow >> '#link#';\n\t\t\t\t\t#itemrow -> (replace: '#link#', #itemlinkstart) \n\t\t\t\t\t\t& (replace: '#title#', #itemlabel)\t// deprecated, use #label# instead\n\t\t\t\t\t\t& (replace: '#label#', #itemlabel)\t// preferred\n\t\t\t\t\t\t& (replace: '#/link#', #itemlinkend)\n\t\t\t\t\t\t& (replace: '#children#', #itemchildren);\n\t\t\t\telse;\n\t\t\t\t\tif: #itemrow !>> '#current#';\n\t\t\t\t\t\t#itemlabel += '#current#';\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemrow -> (replace: '#item#', #itemlinkstart + #itemlabel + #itemlinkend \n\t\t\t\t\t\t+ #itemchildren);\n\t\t\t\t/if;\n\t\t\t\t#itemrow -> (replace: '#current#', #currentmarker);\n\t\t\t\t#itemoutput += #itemrow;\n\t\t\t/if;\n\t\t/iterate;\n\t\t#output = (string_replaceregexp: #template, -find='(?si)#items#(.*?)#/items#', -replace=#itemoutput);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': render done in ' (self -> 'tagtime') + ' ms');\n\t\treturn: @#output;\n\n\t/define_tag;\n\n\tdefine_tag: 'renderbreadcrumb', -description='Shows the current navigation as breadcrumb trail. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-delimiter (optional) Specifies the delimiter to use between nav levels, defaults to \" > \" if not specified\\n\\\n\t\t\t-home (optional flag) Show the default navigation item (i.e. \"home\") first in the breadcrumb (unless already there).',\n\t\t-optional='delimiter',\n\t\t-optional='home',\n\t\t-optional='skipcurrent',\n\t\t-optional='plain';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'output'=array, 'path'=array;\n\t\t!(local_defined: 'delimiter') ? local: 'delimiter'=' &gt; ';\n\t\tif: (local_defined: 'home') && #home != false;\n\t\t\t// show the default navigation item first in breadcrumb\n\t\t\t\n\t\t\t// find default path\n\t\t\tif: self -> 'default' != '' && self -> pathmap >>  self -> 'default';\n\t\t\t\tlocal: 'homepath'= (self -> 'default');\n\t\t\telse;\n\t\t\t\t// use first top level nav item as default\n\t\t\t\tlocal: 'homepath'= self -> 'navitems' -> first -> (find: 'key');\n\t\t\t/if;\n\t\t\t\n\t\t\tif: !((self -> 'path') -> (beginswith: #homepath));\n\t\t\t\tif: (local_defined: 'plain') && #plain != false;\n\t\t\t\t\t#output -> (insert: (self -> (getnav: #homepath)) -> (find: 'label'));\n\t\t\t\telse;\n\t\t\t\t\t#output -> (insert: '<a href=\"' + (self -> (url: -path=#homepath)) + '\">' + (self -> (getnav: #homepath)) -> (find: 'label') + '</a>');\t\t\t\t\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\titerate: (self -> 'patharray'), (local: 'pathitem');\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': pathitem ' #pathitem);\n\t\t\t#path -> (insert: #pathitem);\n\t\t\tif: (self -> (getnav: #path)) -> (find: 'hide');\n\t\t\t\t// do not show in navigation\n\t\t\t\tloop_abort;\n\t\t\telse;\n\t\t\t\tif: (local_defined: 'plain') && #plain != false;\n\t\t\t\t\t#output -> (insert: (self -> (getnav: #path)) -> (find: 'label'));\n\t\t\t\telse;\n\t\t\t\t\t#output -> (insert: '<a href=\"' + (self -> (url: -path=#path)) + '\">' + (self -> (getnav: #path)) -> (find: 'label') + '</a>');\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: (local_defined: 'skipcurrent') && #skipcurrent != false;\n\t\t\t#output -> removelast;\n\t\t/if;\n\t\t#output = #output -> (join: #delimiter);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'getnav', -description='Return reference to the current navigation object map, or for the specified path.',\n\t\t-optional='path', -copy;  \n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t!(local_defined: 'path') ? local: 'path'=(self -> 'patharray');\n\t\tif: #path -> type != 'array';\n\t\t\t#path = string: #path;\n\t\t\t#path -> (removeleading: '/') & (removetrailing: '/');\n\t\t\t#path = #path -> (split: '/');\n\t\t/if;\n\t\t(self -> pathmap) !>> (#path -> (join: '/')) ? return: map;\n\n\t\tlocal: 'nav'=@self,\n\t\t\t'navmap'=map;\n\t\tlocal: 'pathitem' = #path -> (get: 1);\n\t\tif: #nav -> keymap >> #pathitem; \n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found ' + #pathitem + ' in nav');\n\t\t\t#navmap = @((#nav -> 'navitems') -> (get: ((#nav -> keymap) -> (find: #pathitem))));\n\t\t\tif: #navmap -> type == 'map' && !(#navmap -> (find: 'disabled')) && #navmap -> (find: 'children') -> type == 'nav' && #path -> size > 1;\n\t\t\t\t// look into children level recursively - remove the path level we are at now\n\t\t\t\t#path -> (remove: 1);\n\t\t\t\treturn: @(#navmap -> (find: 'children')) -> (getnav: #path); // recursion\n\t\t\telse;\n\t\t\t\t// we are at the bottom, bail out\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\treturn: @#navmap;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\n\t\n\tdefine_tag: 'getargs', -description='Path arguments = the leftover when we found a matching path, to be used for keyvalue for example.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-index (optional integer) Specifies which leftover path item to return, defaults to all path items as a string',\n\t\t-optional='index', -type='integer';\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t\n\t\tlocal: 'args'=(self -> 'pathargs');\n\t\t#args == '' ? return;\n\t\tif: local_defined: 'index';\n\t\t\t#args = #args -> (split: '/');\n\t\t\tif: #args -> size >= #index;\n\t\t\t\treturn: #args -> (get: #index);\n\t\t\telse;\n\t\t\t\treturn;\n\t\t\t/if;\n\t\telse;\n\t\t\treturn: #args;\n\t\t/if;\n\t\t\n\t/define_tag;\n\t\n\tdefine_tag: 'label', -description='Returns the name of the current (or specified) nav location\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-path (optional)',\n\t\t-optional='path', -copy;\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t!(local_defined: 'path') ? local: 'path'=@(self -> 'path');\n\t\treturn: self -> (getnav: #path) -> (find: 'label');\n\t/define_tag;\n\n\tdefine_tag: 'path', -description='Returns url or key path for the current or specified location.',\n\t\t-optional='path', -copy;\t\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t!(local_defined: 'path') ? local: 'path'=@(self -> 'path');\n\t\tif: self -> (getnav: #path) -> (find: 'url') != '';\n\t\t\tlocal: 'url'=self -> (getnav: #path) -> (find: 'url');\n\t\t\t#url -> (removeleading: '/') & (removetrailing: '/');\n\t\t\treturn: #url;\n\t\telse: #path -> type == 'array';\n\t\t\treturn: @(#path -> (join: '/'));\n\t\telse;\n\t\t\treturn: @#path;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'patharray', -description='Returns current path as array.';\n\t\t\treturn: (self -> 'patharray');\n\t/define_tag;\n\n\tdefine_tag: 'actionpath', -description='Returns action path if any.';\n\t\t\treturn: (self -> 'actionpath');\n\t/define_tag;\n\n\tdefine_tag: 'linkparams', -description='Returns an array for all parameters that should be sent along with nav links',\n\t\t-required='navitem', -type='map';\n\t\tif: (#navitem -> (find: 'params')) -> type == 'array';\n\t\t\tlocal: 'linkparams'=array,\n\t\t\t\t'dotrace'=(self -> 'dotrace'),\n\t\t\t\t'clientparams'=client_getparams;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': checking params ' + (#navitem -> (find: 'params')));\n\t\t\t#clientparams -> (merge: client_postparams);\n\t\t\titerate: #navitem -> (find: 'params'), (local: 'param');\n\t\t\t\t\titerate(#clientparams -> find(#param), local('paraminstance'));\n\t\t\t\t\tif: #paraminstance -> type == 'pair';\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got pair param');\n\t\t\t\t\t\t#linkparams -> (insert: (#paraminstance -> name) = (#paraminstance -> value));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got plain param');\n\t\t\t\t\t\t#linkparams -> (insert: #paraminstance);\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/iterate;\n\t\t\treturn: @#linkparams;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'data', -description='Returns data object that can be stored for the current nav location (or specified nav location).\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-path (optional)\\n\\\n\t\t\t-type (optional string) Force a certain return type. If the stored object doesn´t match the specified type, an empty instance of the type is returned. That way the data can be filtered by type without having to use conditionals to check the type before. ',\n\t\t-optional='path', -copy,\n\t\t-optional='type';\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t!(local_defined: 'path') ? local: 'path'=@(self -> 'path');\n\t\tif: (local_defined: 'type');\n\t\t\tif: self -> (getnav: #path) -> (find: 'data') -> type == #type;\n\t\t\t\treturn: self -> (getnav: #path) -> (find: 'data');\n\t\t\telse;\n\t\t\t\t// return empty instance of the specified type\n\t\t\t\treturn: (\\#type)->astype;\n\t\t\t/if;\n\t\telse;\n\t\t\treturn: self -> (getnav: #path) -> (find: 'data');\n\t\t/if;\n\t/define_tag;\n\n\t\n\tdefine_tag: 'url', -description='Returns full url for current path or specified path. Path parameters can be provided and overridden by \\\n\t\t\tpassing them to this tag. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-path (optional) \\n\\\n\t\t\t-params (optional) Pair array to be used in url instead of plain parameters sent to this tag\\n\\\n\t\t\t-urlargs (optional) Raw string with url parameters to append at end of url and -params\\n\\\n\t\t\t-getargs (optional flag) Add the getargs (leftover path parts) to the url\\n\\\n\t\t\t-except (optional) Array of parameter names to exclude (or single parameter name as string)\\n\\\n\t\t\t-topself (optional nav) Internal, needed to call url from renderhtml when rendering sublevels\\n\\\n\t\t\t-autoparams (optional flag) Enables the automatic passing of action_params that begin with \"-\"',\n\t\t-optional='path', -copy,\n\t\t-optional='params', -copy,\n\t\t-optional='urlargs',\n\t\t-optional='except', -copy,\n\t\t-optional='topself', -type='nav',\n\t\t-optional='autoparams';\n\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'url'=string,\n\t\t\t'urlparams'=array;\n\t\t// only getparams to not send along -action etc\n\t\tlocal: 'clientparams'=client_getparams, 'param'=null;\n\n\t\t!(local_defined: 'except') ? local: 'except'=array;\n\t\t#except -> type != 'array' ? #except = array: #except;\n\t\t#except -> insert('-session');\n\t\t!(local_defined: 'topself') ? local: 'topself'=@self;\n\t\t!(local_defined: 'params') ? local: 'params'=(params -> isa('array') ? params | array);\n\t\t!#params -> isa('array') ? #params = array(#params); // added by Jolle 101117\n\t\tif: local_defined: 'path';\n\t\t\tif: #params >> '-path';\n\t\t\t\t// -path was passed as explicit param\n\t\t\t\t#params -> (removeall: '-path');\n\t\t\telse: #params >> #path;\n\t\t\t\t// -path was passed as implicit param - shows up in params as plain value (no pair) so remove the value from params\n\t\t\t\t#params -> (removeall: #path);\n\t\t\t/if;\n\t\telse;\n\t\t\tlocal: 'path'=(#topself -> 'path');\n\t\t/if;\n\t\tlocal: 'navitem'=#topself -> getnav: #path;\n\t\tif: (#navitem -> (find: 'params')) -> type == 'array';\n\t\t\t// add parameters defined as -param for nav item\n\t\t\t#params -> (merge: (#topself -> (linkparams: -navitem=#navitem)));\n\t\t/if;\n\t\tif: #params -> isa('array');\n\t\t\t// clean up other parameters passed to he tag\n\t\t\t#params -> (removeall: '-urlargs')\n\t\t\t\t& (removeall: '-topself')\n\t\t\t\t& (removeall: '-params')\n\t\t\t\t& (removeall: '-except')\n\t\t\t\t& (removeall: '-autoparams')\n\t\t\t\t& (removeall: '-getargs');\n\t\t /if;\n\n\t\titerate: #except, (local: 'param');\n\t\t\t#params -> (removeall: #param);\n\t\t/iterate;\n\n\t\t#url = (#topself -> (path: #path)) + ((#topself -> (path: #path)) != '' ? '/');\n\t\tif: (#topself -> getargs) -> size && (local_defined: 'getargs') && #getargs != false;\n\t\t\t// for links to the current path, add the path args \n\t\t\t#url += (#topself -> getargs) + '/';\n\t\t/if;\n\t\tif: #params >> '-keyvalue';\n\t\t\t#url += (#params -> (find: '-keyvalue') -> first -> value) + '/';\n\t\t\t#params -> (removeall: '-keyvalue');\n\t\t/if;\n\t\t\n\t\titerate: (#params -> type == 'array' ? #params | array: #params), (local: 'param');\n\t\t\tif: #param -> type == 'pair';\n\t\t\t\t#urlparams -> (insert: (encode_stricturl: #param -> name) + '=' + (encode_stricturl: #param -> value));\n\t\t\telse: #param != '';\n\t\t\t\t#urlparams -> (insert: (encode_stricturl: #param));\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: (local_defined: 'autoparams') && #autoparams != false;\n\t\t\t// add getparams that begin with -\n\t\t\titerate: #clientparams, #param;\n\t\t\t\tif: #param -> type == 'pair';\n\t\t\t\t\tif: #param -> name -> (beginswith: '-') && #except !>> #param -> name;\n\t\t\t\t\t\t#urlparams -> (insert: (encode_stricturl: #param -> name) + '=' + (encode_stricturl: #param -> value));\n\t\t\t\t\t/if;\n\t\t\t\telse; // just a string param (no pair)\n\t\t\t\t\tif: #param -> (beginswith: '-') && #except !>> #param;\n\t\t\t\t\t\t#urlparams -> (insert: encode_stricturl: #param);\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t\n\t\tif: (#topself -> 'navmethod') == 'param';\n\t\t\t#url = './?' + #url + (#urlparams -> size || (local: 'urlargs') != '' ? '&amp;');\n\t\telse;  // path\n\t\t\t#url = (#topself -> 'root') + #url +  (#urlparams -> size || (local: 'urlargs') != '' ? '?');\n\t\t/if;\n\n\t\t#urlparams = string: (#urlparams -> (join: '&amp;'));\n\t\t// restore / in paths for looks\n\t\t#urlparams -> replace('%2f', '/');\n\t\t#url += #urlparams;\n\t\t#urlparams -> size && (local: 'urlargs') -> size ? #url += '&amp;';\n\t\t(local: 'urlargs') -> size ? #url += #urlargs;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#url;\n\t/define_tag;\n\t\n\tdefine_tag: 'filename', -description='Returns the full path to the specified type of precissing file for the current navigation. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-type (required) lib, act, cnt, cfg, actcfg',\n\t\t-required='type',\n\t\t-optional='path', -copy;\n\t\t/*\n\t\t\n\t\t-filenaming can be one of prefix, suffix or extension. \n\t\tPrefix is \"the old way\". lib_customer.inc.  This is the default if -filenaming is not specified. \n\t\tSuffix is a hybrid, for example customer_lib.inc. \n\t\tExtension is for example customer.lib\n\t\t\n\t\tThe rest is automatic. \n\t\t\n\t\t\n\t\tPossible places to look for a library file that belongs to the path \"customer/edit\" (in order of precedence):\n\t\tA) -filenaming='prefix' (default)\n\t\t1. _mod_customer/lib_customer_edit.inc \t\t// modular prefixed with module name\n\t\t2. _mod_customer/lib_edit.inc\t\t\t\t// modular\n\t\t3. _mod_customer/_library/lib_customer_edit.inc\t// modular separated, prefixed with module name\n\t\t4. _mod_customer/_library/lib_edit.inc\t\t// modular separated\n\t\t5. _library/lib_customer_edit.inc\t\t\t// collective (\"all modules together\") separated. This is the old way. \n\t\t\n\t\tB) -filenaming='suffix'\n\t\t1. _mod_customer/customer_edit_lib.inc\n\t\t2. _mod_customer/edit_lib.inc\n\t\t3. _mod_customer/_library/customer_edit_lib.inc\n\t\t4. _mod_customer/_library/edit_lib.inc\n\t\t5. _library/customer_edit_lib.inc\n\t\t\n\t\tC) -filenaming='extension'\n\t\t1. _mod_customer/customer_edit.lib\n\t\t2. _mod_customer/edit.lib\n\t\t3. _mod_customer/_library/customer_edit.lib\n\t\t4. _mod_customer/_library/edit.lib\n\t\t5. _library/customer_edit.lib\n\t\t\n\t\tThe principle is to start looking at the most specific location and then look at more and more generic locations, to be able to do the local override. \n\n\t\t*/\n\t\t\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'filenamearray'=array, \n\t\t\t'filenamearray_temp'=array,\n\t\t\t'filename'=string,\n\t\t\t'prefix'=string,\n\t\t\t'type_short'=string,\n\t\t\t'suffix'=string,\n\t\t\t'extension'=string,\n\t\t\t'typefoldermap'=(map: \n\t\t\t\t'cfg'='_config/', \n\t\t\t\t'actcfg'='_config/', \n\t\t\t\t'act'='_action/',\n\t\t\t\t'lib'='_library/',\n\t\t\t\t'cnt'='_content/'),\n\t\t\t'typefolder'=string,\n\t\t\t'basefolder'=string,\n\t\t\t'directorytree' = (self -> directorytree);\n\t\tif: #type == 'act' || #type == 'actcfg';\n\t\t\tlocal('path') -> size == 0 ? local('actionpath'=string(self -> 'actionpath')) | local('actionpath'=string(#path));\n\t\t\t#actionpath -> removeleading('/') & removetrailing('/');\n\t\t\t#actionpath == '' ? return;\n\t\t\t#filenamearray = (self -> getnav(#actionpath) -> find('filename'));\n\t\t\tif: #filenamearray  == '';\n\t\t\t\t#filenamearray=#actionpath;\n\t\t\t/if;\n\t\t\t#filenamearray = #filenamearray -> split('/');\n\t\telse;\n\t\t\tlocal('path') -> size == 0 ? local('path'=string(self -> 'path'));\n\t\t\t#path -> removeleading('/') & removetrailing('/');\n\t\t\tself -> getnav(#path) -> size == 0 ? return;\n\t\t\t#filenamearray=(self -> getnav(#path) -> find('filename'));\n\t\t\tif: #filenamearray == '';\n\t\t\t\t#filenamearray=#path;\n\t\t\t/if;\n\t\t\t#filenamearray = #filenamearray -> split('/');\n\t\t/if;\n\t\t#type =='actcfg' ? #prefix = 'cfg' | #prefix = #type;\n\t\t#type_short = #prefix;\n\t\t#typefolder=#typefoldermap -> (find: #type);\n\n\t\tselect: (self -> 'filenaming');\n\t\tcase: 'suffix';\n\t\t\t#suffix='_' + #prefix;\n\t\t\t#extension='.inc';\n\t\t\t#prefix = '';\n\t\tcase: 'extension';\n\t\t\t#extension='.' + #prefix;\n\t\t\t#suffix='';\n\t\t\t#prefix = '';\n\t\tcase; // prefix as default\n\t\t\t#prefix += '_';\n\t\t\t#extension='.inc';\n\t\t\t#suffix='';\n\t\t/select;\n\n\t\tlocal: 'findtimer'=_date_msec;\n\t\tloop: 2;\n\t\t\t#basefolder=(array: '', '_knop/') -> (get: loop_count);\n\t\t\tloop: 5;\n\t\t\t\t#filename = string;\n\t\t\t\tselect: loop_count;\n\t\t\t\tcase: 1;\n\t\t\t\t\t// customer/lib_customer_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= 1;\n\t\t\t\t\t\t// at least 1 level, look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filename += '/' + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t/if;\n\t\t\t\tcase: 2; \n\t\t\t\t\t// customer/lib_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= ((self -> 'filenaming') == 'extension' ? 2 | 1);\n\t\t\t\t\t\t// at least 1 level (2 levels for suffix naming), look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filenamearray_temp -> removefirst;\n\t\t\t\t\t\t#filename += '/' + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t\tif(#filenamearray -> size == 1);\n\t\t\t\t\t\t\t// clean up underscore so filename ends up as lib.inc instead of lib_.inc etc\n\t\t\t\t\t\t\t#filename -> replace('/' + #type_short + '_' + #extension, '/' + #type_short + #extension);\n\t\t\t\t\t\t\t#filename -> replace('/_' + #type_short + #extension, '/' + #type_short + #extension);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\tcase: 3;\n\t\t\t\t\t// customer/_library/lib_customer_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= 2;\n\t\t\t\t\t\t// at least 2 levels, look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filename += '/' + #typefolder + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t/if;\n\t\t\t\tcase: 4;\n\t\t\t\t\t// customer/_library/lib_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= 2;\n\t\t\t\t\t\t// at least 2 levels, look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filenamearray_temp -> removefirst;\n\t\t\t\t\t\t#filename += '/' + #typefolder + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t/if;\n\t\t\t\tcase;\n\t\t\t\t\t// _library/lib_customer_edit.inc\n\t\t\t\t\t#filename = #basefolder + #typefolder + #prefix + (#filenamearray -> (join: '_')) \n\t\t\t\t\t\t+ #suffix + #extension;\n\t\t\t\t/select;\n\t\t\t\tif: #filename != '';\n\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': trying ' + (self -> 'fileroot') + #filename );\n\t\t\t\t\tif: #directorytree >> #filename;\n\t\t\t\t\t\t//file_exists: (self -> 'fileroot') + #filename;\n\t\t\t\t\t\t// clean up and exit\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': ** Found ' + (self -> 'fileroot') + #filename + ' in ' + (_date_msec - #findtimer) ' ms');\n\t\t\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\t\t\treturn: (self -> 'fileroot') + #filename;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/loop;\n\t\t/loop;\n\t\t// clean exit if nothing was found\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn;\n\n\t/define_tag;\n\t\n\tdefine_tag: 'actionconfigfile', -description='Shortcut to filename: actcfg'; return: self -> (filename: 'actcfg'); \t/define_tag;\n\tdefine_tag: 'actionfile', -description='Shortcut to filename: act'; \t\treturn: self -> (filename: 'act'); \t\t/define_tag;\n\tdefine_tag: 'configfile', -description='Shortcut to filename: cfg'; \t\treturn: self -> (filename: 'cfg'); \t\t/define_tag;\n\tdefine_tag: 'libraryfile', -description='Shortcut to filename: lib'; \t\treturn: self -> (filename: 'lib'); \t\t/define_tag;\n\tdefine_tag: 'contentfile', -description='Shortcut to filename: cnt'; \t\treturn: self -> (filename: 'cnt'); \t\t/define_tag;\n\n\tdefine_tag: 'include', -description='Includes any of the files for the current path, fails silently if file does not exist. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-file (required) lib, act, cnt, cfg, actcfg or library, action, config, actionconfig, content, or any arbitrary filename',\n\t\t-required='file',\n\t\t-optional='path';\n\t\tknop_debug(self->type + ' -> ' + tag_name + ' ' + params -> first, -type=self->type, -open);\n\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name + ' ' + params -> first, -close, -time, -witherrors);/handle;\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t// includes any of the files for the current path, fails silently if file does not exist\n\t\tlocal: 'translation'=(map:\n\t\t\t\t'actionconfig'= 'actcfg',\n\t\t\t\t'action'= 'act',\n\t\t\t\t'config'= 'cfg',\n\t\t\t\t'library'= 'lib',\n\t\t\t\t'content'= 'cnt'),\n\t\t\t'types'=(map: 'actcfg', 'act', 'cfg', 'lib', 'cnt'),\n\t\t\t'result'=string;\n\t\tlocal: 'type'= (#translation >> #file ? #translation -> (find: #file) | #types >> #file ? #file | 'other');\n\t\t// find out full filename\n\t\t!local_defined('path') ? local('path'=null);\n\t\tlocal: 'filename'=null;\n\t\tif: #types >> #type;\n\t\t\t// knop include\n\t\t\t#filename = self -> filename(#type, -path=#path);\n\t\telse: (self -> directorytree) >> #file;\n\t\t\t// arbitrary include within the Knop folder structure\n\t\t\t#filename = (self -> 'fileroot') + #file;\n\t\telse: (self -> directorytree) >> '_knop/' + #file;\n\t\t\t// arbitrary include one level down in _knop folder\n\t\t\t#filename = (self -> 'fileroot') + '_knop/' + #file;\n\t\t/if;\n\t\tif: #type == 'cfg' && #filename -> size && (self -> 'actionconfigfile_didrun') == #filename;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': ' + #filename ' has already run as actionconfig');\n\t\t\t//knop_debug(self->type + ' -> ' + tag_name + ': ' + #filename ' has already run as actionconfig');\n\t\t\treturn;\n\t\telse: #type == 'actcfg';\n\t\t\t// remember that we have run this config file as actionconfig so we don't run the same file again as page config\n\t\t\t(self -> 'actionconfigfile_didrun') = #filename;\n\t\t/if;\n\t\tif: #filename != '';\n\t\t\tlocal: 't'=_date_msec;\n\t\t\t#result=@(include: #filename);\n\t\t\t(self -> 'debug_trace') -> (insert: 'Include ' + #file + ': ' + #filename + ' processed in ' + (_date_msec - #t) ' ms');\n\t\t\t//knop_debug(self->type + ' -> ' + tag_name + ' ' + #file + ': ' + #filename + ' processed in ' + (_date_msec - #t) ' ms', -type=self->type);\n\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\treturn: @#result;\n\t\telse;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: 'Include ' + #file + ': no matching filename found');\n\t\t\tknop_debug(self->type + ' -> ' + tag_name + ' ' + #file + ': no matching filename found');\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag: 'library', -description='includes file just as ->include, but returns no output', \n\t\t-required='file',\n\t\t-optional='path';\n\t\t// includes file just as ->include, but returns no output\n\t\t!local_defined('path') ? local('path'=null);\n\t\tself -> include(#file, -path=#path);\n\t\t// returns nothing\n\t/define_tag;\n\n\tdefine_tag: 'directorytree', -description='Returns a map of all existing knop file paths', \n\t\t-optional='basepath'; // only used for recursive calls\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'dirlist'=map;\n\t\tif: (self -> 'directorytreemap') -> size;\n\t\t\t// use the stored directory tree that has already been created\n\t\t\t#dirlist = (self -> 'directorytreemap');\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': Returning stored directorytree');\n\n\t\telse;\n\t\t\t// first time calling this tag - create the directory tree\n\t\t\tif: (local_defined: 'basepath');\n\t\t\t\tlocal: 'path' = #basepath;\n\t\t\telse;\n\t\t\t\tlocal: 'path'=(self -> 'fileroot');\n\t\t\t/if;\n\t\t\t!(#path -> (endswith: '/')) ? #path += '/';\n\t\t\tlocal: 'diritem'=string,\n\t\t\t\t'dirlist_sub'=map,\n\t\t\t\t'diritem_sub'=pair;\n\t\t\titerate: file_listdirectory: #path, #diritem;\n\t\t\t\tif: !(#diritem -> (beginswith: '.'));\n\t\t\t\t\t#dirlist_sub = map;\n\t\t\t\t\t#diritem -> (removetrailing: '/');\n\t\t\t\t\tif: //#diritem -> (endswith: '/') && \n\t\t\t\t\t\t((map: '_knop', '_include', '_config', '_action', '_library', '_content') >> #diritem\n\t\t\t\t\t\t\t|| #diritem -> (beginswith: '_mod_'));\n\t\t\t\t\t\t// recursive call for sub folder within the Knop directory structure\n\t\t\t\t\t\t#dirlist_sub = self -> (directorytree: #path + #diritem);\n\t\t\t\t\t\titerate: #dirlist_sub, #diritem_sub;\n\t\t\t\t\t\t\t#dirlist -> (insert: #diritem + '/' +  #diritem_sub -> name);\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t/if;\n\t\t\t\t\t// Add item to map, with trailing / if item has sub items (folder contents)\n\t\t\t\t\t#dirlist -> (insert: #diritem + (#dirlist_sub -> size ? '/'));\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\tif: !(local_defined: 'basepath');\n\t\t\t\t// this was the topmost call in the recursive chain, so store the result\n\t\t\t\t(self -> 'directorytreemap') = #dirlist;\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': Creating directorytree');\n\t\t\t/if;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #dirlist;\n\t/define_tag;\n\n\n\tdefine_tag: 'trace', \n\t\t-optional='html',\n\t\t-optional='xhtml';\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\n\t\treturn: #eol + 'Debug trace for nav $' + (self -> varname)\n\t\t\t+ (!#dotrace ? ' (detailed trace not enabled)' )\n\t\t\t+ #eol + (self -> 'debug_trace') -> (join: #eol) \n\t\t\t+ #eol;\n\n\t/define_tag;\n\n/define_type;\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_nav\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_user\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'user',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2009-09-18',\n\t\t'descripion'='Custom type to handle user identification and authentication';\n\n/*\n\nCHANGE NOTES\n2012-01-16\tSP\tAdded ->removedata to remove field from the data map.  Thanks to Ric Lewis.\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-23\tJS\t->encrypt now uses default encrypt_cipher from the custom type instead of a hard coded default\n2009-02-26\tJS\t->login: further correction on the search for login with FileMaker, to reduce the risk for false duplicates\n2009-02-26\tJS\t->login: Added optional -searchparams to be able to add more conditions to the login search, for example to exclude users that are not enabled. \n2008-12-02\tJS\t->encrypt: Changed to -hex cipher instead of encode_base64\n2008-11-05\tJS\t->getdata: corrected a check that prevented the tag from returning anything\n2008-11-05\tJC\t->login: A failed login attempt now results in a logout instead of keeping any old authentication\n2008-11-05\tJC\t->getpermission will always return falseif a user is not logged in\n2008-11-05\tJC\t->logout: The permissions map is now cleared when logging out\n2008-11-04\tJC\t->encrypt: changed incorrect encrypt_cipher to encrypt_digest\n2008-09-10\tJS\tAdded ondeserialize to make client_fingerprint_expression survive session\n2008-07-17\tJS\tImplemented ->setpermission and ->getpermission\n2008-07-17\tJS\tAdded client_fingerprint_expression as compound expression so it can be configurable by changing the instant variable\n2008-05-20\tJS\t->login: Added delay between more than 5 failed login attempts \n2008-05-08\tJS\t->login: improved the search for FileMaker datasources to make it work for email address as username\n2008-02-08\tJS\tAdded ->keys\n2008-02-03\tJS\t-> login: Corrected storage of id_user\n2007-11-27\tJS\tCoded an incomplete version\n2007-06-13\tJS\tCreated the data type\n\n// TODO: \nMake it possible for knop_user to work independently of a knop_database object by creating a custom user lookup - see http://listsearch.com/Lasso/Thread/index.lasso?20528\nuserdb reference is brooken, probably when stored in session. Can this be fixed?\nMake client_fingerprint configurable by specifying a compound expression at oncreate\nAdd support for role based permisions\n\n*/\n\n\n/*\nPurpose:\n- Maintain user identity and authentication\n- Handle database record locking more intelligently, also to be able to release all unused locks for a user\n- Authenticating user login\n- Restricting access to data\n- displaying specific navigation options depending on type of user\n\nlets add some date handling in there too like time of last login\nand probably the IP that the user logged in from.\n\n\nSome options to handle what happens when a user logs in again whilst already logged in.\nie one could:\ndisallow second login (with a message explaining why)\nautomatically log the first session out (with a message indicating what happened)\nsend a message to first session: \"Your username is attempting to log in again, do you wish to close this session, or deny the second login attempt?\"\nallow multiple logins (from the same IP address)\nallow multiple logins from any IP address\n\nAll of these could be useful options, depending of the type of app.\n\nAnd different types of user (ie normal, admin) could have different types of treatment.\n\nHandling for failed login attempts:\nOption to set how many tries can be attempted; \nOption to lock users out permanently after x failed attempts? \nLogging (to database) of failed logins / successful logins\n\nPassword recovery system (ie emailing a time sensitive link to re-set password)\nBy \"password recovery\" I'm not thinking \"email my password\" (hashed passwords can't be emailed...) but rather to email a short lived link that gives the user an opportunity to change his password. How is this different from \"password reset\"?\nYes, that is an accurate description of what I had in mind, except for the bit about emailing a short-lived link.  Instead I imagined having the user reset their password 100% on the web site through the use of \"Security Questions\", much like banks employ.\n\nI like the idea of more info attached to the user. Like login attempts, locking a user temporarily after too many failed attempts etc.\n\n\nThe setup is more or less that I have users and groups.\n\nI'm thinking that Knop shouldn't do any session handling by itself, but the knop_user variable would be stored in the app's session as any other variable. Knop should stay as lean as possible...\n\nOther things to handle:\nPrevent session sidejacking by storing and comparing the user's ip and other identifying properties.\nProvide safe password handling with strong one-way salted encryption.\n\nconsider having a separate table for auditing all user actions, including logging in, logging out, the basic CRUD actions, searches\n\nThe object have to handle situations where no user is logged in. A guest can still have rights to some actions. Modules that can be viewed. Forms that could be sent in etc.\nThat the added functions don't slow down the processing. We already have a lot of time consuming overhead in Knop.\n\n\n\nFeatures:\n1. Authentication and credentials\n- Handle the authentication process\n- Keep track of if a user is properly logged in\n- Optionally keep track of multiple logins to same account\n- Prevent sidejacking\n- Optionally handle encrypted/hashed passwords (with salt)\n- Prevent brute force attacks (delay between attempts etc)\n- Handle general information about the user\n- Provide accessors for user data\n\n2. Permissions and access control\n- Keep track of what actions a user is allowed to perform (the \"verbs\")\n- Tie into knop_nav to be able to filter out locations based on permissions\n\n3. Record locks\n- Handle clearing of record locks from knop_database\n\n4. Audit trail/logging\n- Optionally log login/logout actions\n- Provide hooks to be able to log other user actions\n\nFuture additions:\n- Keep track of what objects and resources a user is allowed to act on (the \"nouns\")\n- Provide filtering to use in database queries\n- What groups a user belongs to\n- Mechanism to update user information, password etc\n- Handle password recovery\n\n\nPermissions can be read, create, update, delete, or application specific (for example publish)\n\n*/\n\n\tlocal: 'id_user'=null,\n\t\t'validlogin'=false,\n\t\t'groups'=array,\n\t\t'data'=map,\t\t\t\t\t\t// map with arbitrary user information (name, address etc)\n\t\t'permissions'=map,\n\t\t'loginattempt_date'=(date: 0),\t// to keep track of delays multiple login attempts\n\t\t'loginattempt_count'=integer,\t// number of failed login attempts\n\n\t\t'userdb'=null,\t\t\t\t\t// database object for user authentication\n\t\t'useridfield'='id',\t\n\t\t'userfield'='username',\t\n\t\t'passwordfield'='password',\n\t\t'saltfield'=null,\n\t\t'encrypt'=false,\n\t\t'encrypt_cipher'='RIPEMD160',\t// digest encryption method\n\n\t\t'logdb'=null,\t\t\t\t\t// database object for logging\n\t\t'logeventfield'='event',\t\t// the event to be logged\n\t\t'loguserfield'='id_user',\t\t// the user who is performing the logged action\n\t\t'logobjectfield'='id_object',\t// what object is affected by the logged action\n\t\t'logdatafield'='data',\t\t\t// details about the logged action\n\n\t\t'singleuser'=false,\n\t\t'uniqueid'=null,\t\t\t\t// To track multiple logins on the same account (this is to be stored and compared server side)\n\t\t'client_fingerprint'=null,\t\t// combination of ip, useragent etc to be able to track sidejacking\n\t\t'client_fingerprint_expression'={return(encrypt_md5(string(client_ip) + client_type))},\n\t\t'dblocks'=array,\t\t\t\t// a list of all database objects that have been locked by this user \n\t\t'error_lang'=(knop_lang: -default='en', -fallback),\n\t\t;\n\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-encrypt (optional flag or string) Use encrypted passwords. If a value is specified then that cipher will be used instead of the default RIPEMD160. If -saltfield is specified then the value of that field will be used as salt.\\n\\\n\t\t\t-singleuser (optional flag) Multiple logins to the same account are prevented (not implemented)',\n\t\t-required='userdb', -type='database',\n\t\t-optional='encrypt',\n\t\t-optional='useridfield', -type='string',\n\t\t-optional='userfield', -type='string',\n\t\t-optional='passwordfield', -type='string',\n\t\t-optional='saltfield', -type='string',\n\t\t-optional='logdb', -type='database',\n\t\t-optional='loguserfield', -type='string',\n\t\t-optional='logeventfield', -type='string',\n\t\t-optional='logdatafield', -type='string',\n\t\t-optional='singleuser';\n\t\t\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal_defined('userfield') ? (self -> 'userfield') = #userfield;\n\t\tlocal_defined('useridfield') ? (self -> 'useridfield') = #useridfield;\n\t\tlocal_defined('passwordfield') ? (self -> 'passwordfield') = #passwordfield;\n\t\tlocal_defined('saltfield') ? (self -> 'saltfield') = #saltfield;\n\t\tlocal_defined('loguserfield') ? (self -> 'loguserfield') = #loguserfield;\n\t\tlocal_defined('logeventfield') ? (self -> 'logeventfield') = #logeventfield;\n\t\tlocal_defined('logdatafield') ? (self -> 'logdatafield') = #logdatafield;\n\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('userdb') ? (self -> 'userdb') = @#userdb;\n\t\tlocal_defined('logdb') ? (self -> 'logdb') = @#logdb;\n\n\t\tif: (local_defined: 'encrypt') && #encrypt != false;\n\t\t\t(self -> 'encrypt') = true;\n\t\t\tif: #encrypt -> size && (Cipher_List: -digest) >> #encrypt; // a valid digest cipher was specified\n\t\t\t\t(self -> 'encrypt_cipher') = #encrypt;\n\t\t\t/if;\n\t\telse;\n\t\t\t(self -> 'encrypt') = false;\n\t\t/if;\n\t\t(self -> 'singleuser') = (local_defined: 'singleuser') && #singleuser != false;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'ondeserialize', -description='Recreates transient variables after coming back from a session';\n\t\t// MARK: Why is client_fingerprint_expression considered a transient variable?\n\t\tself -> properties -> first -> insert('client_fingerprint_expression'={return(encrypt_md5(string(client_ip) + client_type))});\n\t/define_tag;\n\n/*\n\tdefine_tag: 'onassign', -description='Internal, needed to restore references when ctype is defined as prototype',\n\t\t-required='value';\n\t\t// recreate references here\n\t\titerate: (array: \n\t\t\t'userdb',\n\t\t\t'logdb'), (local: 'param');\n\t\t\t(self -> #param) = @(#value -> #param);\n\t\t/iterate;\n\t/define_tag;\n// */\t\n\t\n\tdefine_tag: '_unknowntag', -description='Shortcut to getdata';\n\t\tif: (self -> 'data') >> tag_name;\n\t\t\treturn: (self -> 'data') -> (find: tag_name);\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t\t(self -> '_debug_trace') -> insert(self -> type + '->' + tag_name + ' not known.');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'auth', -description='Checks if user is authenticated, returns true/false';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'validlogin'=false, 'client_fingerprint_now'=string;\n\t\t// check validlogin\n\t\t#validlogin = (self -> 'validlogin');\n\t\tif: #validlogin;\n\t\t\t// check client_fingerprint to prevent sidejacking\n\t\t\t#client_fingerprint_now = (self -> 'client_fingerprint_expression') -> invoke;\n\t\t\tif: #client_fingerprint_now != (self -> 'client_fingerprint');\n\t\t\t\t#validlogin = false;\n\t\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': Client fingerprint has changed - this looks like session sidejacking. Logging out.');\n\t\t\t\t(self -> 'error_code') = 7503;\n\t\t\t\tself -> logout;\n\t\t\t\t// TODO: log this\n\t\t\t/if;\n\t\t\t// TODO: if singleuser, check uniqueid\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #validlogin;\n\t/define_tag;\n\n\n\tdefine_tag: 'login', -description='Log in user. On successful login, all fields on the user record will be available by -> getdata.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-username (required) Optional if -force is specified\\n\\\n\t\t\t-password (required) Optional if -force is specified\\n\\\n\t\t\t-searchparams (optional) Extra search params array to use in combination with username and password\\n\\\n\t\t\t-force (optional) Supply a user id for a manually authenticated user if custom authentication logics is needed',\n\t\t-optional='username',\n\t\t-optional='password',\n\t\t-optional='searchparams', -type='array', -copy,\n\t\t-optional='force';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tif(!local_defined('force') && (!local_defined('username') || !local_defined('password')));\n\t\t\tfail(-9956, self -> type + '->' + tag_name + ' requires -username and -password, or -force');\n\t\t/if;\n\t\t\n\t\tlocal: 'db'=@(self -> 'userdb'),\n\t\t\t'validlogin'=false;\n\t\t\n\n\t\tif(local_defined('force') && string(#force) -> size && #force != false);\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': ' + 'Manually authenticating user id ' + #force);\n\t\t\t#validlogin = true;\n\t\t\t(self -> 'id_user') = #force;\n\n\t\telse;\n\t\t\t!local_defined('searchparams') ? local('searchparams'=array);\n\t\t\tif((local('username') -> size && local('password') -> size));\n\t\t\t\tif((self -> 'loginattempt_count') >= 5);\n\t\t\t\t\t// login delay since last attempt was made \n\t\t\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': Too many login attempts, wait until ' + (2 * (self -> 'loginattempt_count')) + ' seconds has passed since last attempt.');\n\t\t\t\t\twhile(((date - (self -> 'loginattempt_date')) -> second) <  (2 * (self -> 'loginattempt_count')) // at least 5 seconds, longer the more attempts\n\t\t\t\t\t\t&& loop_count < 100); // rescue sling\n\t\t\t\t\t\tsleep(200);\n\t\t\t\t\t/while;\n\t\t\t\t/if;\n\t\t\t\t// authenticate user against database (username must be unique)\n\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Authenticating user');\n\t\t\t\tif(#db -> 'isfilemaker');\n\t\t\t\t\t#searchparams -> merge(array(-op='eq', (self -> 'userfield') = '=\"' + #username + '\"'));\n\t\t\t\telse;\n\t\t\t\t\t#searchparams -> merge(array(-op='eq', (self -> 'userfield') = #username));\n\t\t\t\t/if;\n\t\t\t\t#db -> select(#searchparams);\n\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Searching user db, ' (#db -> found_count) + ' found ' + (#db -> error_msg) + ' ' + (#db -> action_statement));\n\t\t\t\tif: #db -> found_count == 1\n\t\t\t\t\t&& #db -> (field: (self -> 'userfield')) == #username; // double check the username\n\t\t\t\t\t// one match, continue by checking the password with case sensitive comparsion\n\t\t\t\t\tif: (self -> 'encrypt') && (self -> 'saltfield') -> size;\n\t\t\t\t\t\t// use encryption with salt\n\t\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Checking password with salted encryption');\n\t\t\t\t\t\tif: bytes: (#db -> (field: (self -> 'passwordfield'))) \n\t\t\t\t\t\t\t== bytes: (self -> (encrypt: #password, -salt=#db -> (field: (self -> 'saltfield') ), -cipher=(self -> 'encrypt_cipher') ));\n\t\t\t\t\t\t\t#validlogin=true;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: (self -> 'encrypt');\n\t\t\t\t\t\t// use encryption with no salt\n\t\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Checking password with encryption, no salt');\n\t\t\t\t\t\tif: bytes: (#db -> (field: (self -> 'passwordfield'))) \n\t\t\t\t\t\t\t== bytes: (self -> (encrypt: #password, -cipher=(self -> 'encrypt_cipher')));\n\t\t\t\t\t\t\t#validlogin=true;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Checking plain text password');\n\t\t\t\t\t\tif: bytes: (#db -> (field: (self -> 'passwordfield'))) \n\t\t\t\t\t\t\t== bytes: #password;\n\t\t\t\t\t\t\t#validlogin=true;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif(#validlogin);\n\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'id_user: ' + #db -> (field: (self -> 'useridfield')));\n\t\t\t\t\t// store user id\n\t\t\t\t\t(self -> 'id_user') = #db -> (field: (self -> 'useridfield'));\n\t\t\t\t\t// store all user record fields in data map\n\t\t\t\t\t(self -> 'data') = #db -> recorddata;\n\t\t\t\t/if;\n\t\t\t/if; // #username and #password\n\t\t/if; // #force\n\n\t\tif: #validlogin; \n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Valid login');\n\t\t\t(self -> 'loginattempt_count') = 0;\n\t\t\t(self -> 'error_code') = 0; // No error\n\t\t\t// set validlogin to true\n\t\t\t(self -> 'validlogin')=true;\n\t\t\t// log the action TODO\n\t\t\t// store client_fingerprint\n\t\t\t(self -> 'client_fingerprint') = (self -> 'client_fingerprint_expression') -> invoke;\n\t\t\t// if singleuser, store uniqueid in server side storage\n\t\telse(!(local('username') -> size && local('password') -> size));\n\t\t\t(self -> 'error_code') = 7502; // Username or password missing\n\t\t\tself -> logout;\n\t\telse;\n\t\t\t// TODO:\n\t\t\t// - block username for a while after too many attempts\n\t\t\t(self -> 'loginattempt_count') += 1;\n\t\t\t(self -> 'loginattempt_date') = date; // keep track of when last login attempt happened\n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Invalid login (' +  (self -> 'loginattempt_count') + ' attempts)');\n\t\t\t(self -> 'error_code') = 7501; // Authentication failed\n\t\t\tself -> logout;\n\t\t\t// exit\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'logout'; \n\t\tlocal: 'timer'=knop_timer; \n\t\t// set validlogin to false\n\t\t(self -> 'validlogin')=false;\n\t\t(self -> 'id_user') = null;\n\t\t(self -> 'data') = map;\n\t\t(self -> 'permissions') = map;\n\t\t\n\t\t// clear all record locks\n\t\tself -> clearlocks;\n\t\t// log the action\n\n\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Logged out');\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'getdata', -description='Get field data from the data map.',\n\t\t-required='field';\n\t\tif: (self -> 'data') >> #field;\n\t\t\treturn: (self -> 'data') -> (find: #field);\n\t\telse;\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': ' + #field + ' not known');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'removedata', -description='Remove field from the data map.',\n\t\t-required='field';\n\t\tif: (self -> 'data') >> #field;\n\t\t\t(self -> 'data') -> (remove: #field);\n\t\telse;\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': ' + #field + ' not known');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'id_user', -description='Return the user id';\n\t\tif: self -> auth;\n\t\t\treturn: (self -> 'id_user');\n\t\telse;\n\t\t\treturn: false;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'setdata', -description='Set field data in the data map. Either -> (setdata: -field=\\'fieldname\\', -value=\\'value\\') or -> (setdata: \\'fieldname\\'=\\'value\\')',\n\t\t-required='field', -copy,\t// can also be a pair with field=value\n\t\t-optional='value', -copy;\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: #field -> isa('pair');\n\t\t\tlocal: 'value'=#field -> value;\n\t\t\t#field = #field -> name;\n\t\t/if;\n\t\tfail_if: !(local_defined: 'value'), -1, (self -> type) '->setdata requires a value parameter';\n\t\t(self -> 'data') -> insert(#field = #value);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'getpermission', -description='Returns true if user has permission to perform the specified action, false otherwise',\n\t\t-required='permission';\n\t\tif((self -> auth) && (self -> 'permissions') >> #permission);\n\t\t\treturn((self -> 'permissions') -> find(#permission));\n\t\telse;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'setpermission', -description='Sets the user\\'s permission to perform the specified action (true or false, or just the name of the permission)',\n\t\t-required='permission',\n\t\t-optional='value';\n\t\tif(local_defined('value') && #value != false); // any non-false value is regarded as true\n\t\t\t(self -> 'permissions') -> insert(#permission=true);\n\t\telse(local_defined('value') && #value == false); // explicit false\n\t\t\t(self -> 'permissions') -> insert(#permission=false);\n\t\telse; // no value specified is regarded as true\n\t\t\t(self -> 'permissions') -> insert(#permission=true);\n\t\t/if;\n\t/define_tag;\n\n\n\tdefine_tag: 'addlock', -description='Called by database object, adds the name of a database object that has been locked by this user.',\n\t\t-required='dbname';\n\t\tif: (self -> 'dblocks') !>> #dbname && (var: #dbname) -> (isa: 'database');\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': adding database name  ' + #dbname);\n\t\t\t(self -> 'dblocks') -> (insert: #dbname);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'clearlocks', -description='Clears all database locks that has been set by this user';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (self -> auth);\n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + (self -> 'dblocks') -> (join: ', '));\n\t\t\titerate: (self -> 'dblocks'), local: 'dbname';\n\t\t\t\tif: (var: #dbname) -> (isa: 'database');\n\t\t\t\t\t(var: #dbname) -> (clearlocks: -user=(self -> 'id_user'));\n\t\t\t\t\t#dbname = null;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t// remove all locks that has been cleared\n\t\t\t(self -> 'dblocks') -> (removeall: null);\n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': done, remaining locks: ' + (self -> 'dblocks') -> (join: ', '));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'encrypt', -description='Internal use. Encrypts the input using digest encryption, optionally with salt. ',\n\t\t-required='data', -copy,\n\t\t-optional='salt',\n\t\t-optional='cipher';\n\t\tlocal: 'output'=string;\n\t\t!(local_defined: 'cipher') ? local: 'cipher'=self -> 'encrypt_cipher';\n\t\tif: (local_defined: 'salt');\n\t\t\t#data = #salt + #data;\n\t\t/if;\n\t\tif: (Cipher_List: -digest) !>> #cipher;\n\t\t\t// fall back to default digest cipher\n\t\t\t#cipher = 'MD5';\n\t\t/if;\n\t\t#output = (cipher_digest: #data, -digest=#cipher, -hex);\n\t\treturn: #output;\n\t/define_tag;\n\t\n\tdefine_tag: 'keys', -description='Returns all keys for the stored user data';\n\t\treturn: (self -> 'data') -> keys;\n\t/define_tag;\n\n/define_type;\n\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_user\n//------------------------------------------------------------------\n\n//##################################################################\n\n][define_tag('changenotes', -description='This tag is created on the fly by buildnamespace.lasso',\n\t\t-namespace='knop_',\n\t\t-optional='type', -optional='date', -copy);\n\t\tlocal('output'=string, 'changenotes'=map('knop_nav'='2010-11-17\tJC\tFixed bug so that session links no longer gets added to urls by the nav -> url tag.\n2010-11-17\tJC\tFixed a bug that would not convert local params to an array under certain situations\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\t->linkparams: Multiple paramaters with the same name (typically checkboxes) are now passed properly\n2009-05-06\tJS\t->directorytree considers _include folders as part of the Knop directory structure. nav->include(\\'_include/myfile.inc\\') will first look for _include/myfile.inc and if not found it will look for _knop/_include/myfile.inc \n2009-05-05\tJS\t->include looks for a specified file also inside a _knop folder, if the file does not exist at the specified location\n2009-02-09\tJS\t->filename: Casting path and actionpath to string\n2008-12-19\tJS\t->filename (and consequently ->include and ->library) can now use a specific -path instead of the current location\\'s path\n2008-12-09\tJS\t->linkparams: fixed undefined local in trace call (only showed when trace was enabled for the nav object)\n2008-11-25\tJS\t->getlocation will now avoid disabled and hidden pages when looking for the first page if no default page is specified\n2008-11-03\tJS\t->getlocation will not break if no navigation items have been defined\n2008-10-30\tJS\t_mod folders will now work with knop paths with just a single level, so an include file path can end up as _mod_customer/lib_customer.inc or just _mod_customer/lib.inc (the latter variant does not apply to extension-based filenaming, so _mod_customer/.lib will never be a working file path)\n2008-07-10\tJS\tAdded -> label to return the name of the current page\n2008-05-20\tJS\t->renderhtml: #current# is not automatically added to the template if the more elaborate template format is used. This makes it easier to hide the currentmarker without changing the nav config (partial revert of fix 2008-01-04). \n2008-05-08\tJS\t->insert: A duplicate key does no longer cause a fatal error but instead fails silently and logs to the debug log\n2008-05-07\tJS\t->url: will now call ->linkparams so all links that are constructed from ->url will properly send along the parameters specified in the nav item. This also affects pagination and sort links in grid. \n2008-05-07\tJS\tAdded ->linkparams, Returns an array for all parameters that should be sent along with nav links (this was previously embedded in renderhtml)\n2008-02-25\tJS\t->url: new parameter -getargs to add the getargs to the path link if the path equals the current path\n2008-02-06\tJC\t->insert: the -hide flag can now be a boolean (also the -disabled flag)\n2008-02-03\tJS\t->include: can now include any specified filename\n2008-02-01\tJS\t->oncreate: added optional -fileroot to be able to use a root for files that is different from the logical site root used for navigation \n2008-01-23\tJS\t->url: Added -autoparams that is required to enable the automatic passing of action_params that begin with \"-\" (this reverts the default behavior to match the the old)\n2008-01-22\tJS\t->url: GET params that begin with \"-\" are sent as parameters on links. -path, -sort, -desc, -q are explicitly excluded from nav links in renderhtml. \n2008-01-22\tJS\tWhen using param based navigation, navigation links now use much cleaner /?path/to/page/ style links instead of /?-path=path/to/page/\n2008-01-22\tJS\t->getlocation: when navmethod is param, the path can now be sent as unnamed parameter insetad of -path parameter (such as /?path/to/page/). \n2008-01-04\tJS\t->renderbreadcrumb: added flag -plain to output breadcrumb without html\n2008-01-04\tJS\t->renderbreadcrumb: added flag -skipcurrent to not include the current location in the output\n2008-01-04\tJS\t->insert: -template can now be specified also for individual nav items. Use the form #link##label##current##/link##children#. \n2008-01-04\tJS\t->renderhtml: changed #title# to #label# in template for clarity, for example #link##label##current##/link##children# (#title# will remain supported)\n2008-01-04\tJS\tAdded #current# as placeholder for template, to specify where the current marker should occurr. If not specified in the template, the current marker appears immediately after the label.\n2007-12-12\tJS\t->include now logs processing time for the include to debug trace\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-04\tJS\tnav item css class is now applied also to disabled nav items (rendered as <span>)\n2007-11-08\tJS\tChanged trace so it tracks some things even when it\\'s not enabled (like include etc)\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-28\tJS\t->directorytree: should now work also when knop folders are symlinks\n2007-09-06\tJS\ttop level nav elements that are -disabled now behave properly when accessed\n2007-09-05\tJS\t-currentmarker can now be set separately on sublevels, not only on topmost level\n2007-08-29\tJS\tAdded _knop as optional base folder to put all knop files in\n2007-08-29\tJS\t->include: Removed file_exists check since the filename has already been verified in ->filename.\n2007-08-29\tJS\tAdded ->directorytree which returns a map with all knop filenames, to use when searching for includes\n2007-08-28\tJS\t->oncreate: -filenaming to specify how include files are named prefix/suffix/extension\n2007-08-28\tJS\t->filename: Implemented support for flexible folder structures\n2007-08-28\tJS\tInstance variable #actionconfigfile_didrun was not properly declared\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-14\tJS\t->insert: -url=\\'/\\' can now be used to specify the \"home\" location. \n2007-06-13\tJS\tadded ->children to get a reference to the children nav object for a specified path, so new children can be inserted. Must call ->reindex afterwards. \n2007-06-13\tJS\tadded ->reindex to rebuild the index maps from scratch. Must be done after adding children items. \n2007-06-13\tJS\tadded ->addchildren to replace a current children nav object for a specified path. Will handle the reindexing transparently. \n2007-06-13\tJS\tadded ->keymap, ->pathmap and ->urlmap to access the index maps so they call reindex if they have been invalidated (for example by ->addchildren)\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-06-08\tJS\t->insert: params with empty values are now ignored\n2007-05-04\tJS\t->insert: added check that default item exists in children before storing the default\n2007-04-19\tJS added ->data to retrieve data stored for the current path (or specified path). Optional -type ensures the returned data has the correct type. \n2007-04-19\tJS ->insert: added -data to store arbitrary data object for each path. The object is stored as reference so a variable can be changed after it has been added to the nav object\n2007-04-19\tJS\tadded ->patharray to return the current path as array\n2007-04-17\tJS\t->renderhtml: template now supports #link##title##/link##children# in addition to #item# to provide more flexibility\n2007-04-17\tJS\t->oncreate: added support for -template, -class, currentclass and -currentmarker\n2007-04-13\tJS\tImplemented -class per navitem (only worked globally with setformat before)\n2007-04-03\tJS\t->renderhtml: added -renderpath, -expand and -flat to be able to render parts of the nav menu for more flexible layout\n2007-04-03\tJS\t->renderbreadcrumb: added -home to show the default navigation item first in the breadcrumb \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tChanged navmethod path so it uses response_filepath instead of $url_path\n2007-02-25\tJS\tAdded ->actionpath\n2007-02-24\tJS\t->renderhtml: improved handling of classes in nav links\n2007-02-22\tJS\t->url: added -except\n2007-02-09\tJS\t->url: corrected the behavior for plain parameters passed to the tag\n2007-02-05\tJS\t->insert: Added -param to be able to specify params that should be propagated in nav for certain nav elements (like -keyvalue to be able to move between different subtabs for a selected record\n2007-02-05\tJS\t->renderhtml now use ->url to get the right links\n2007-02-01\tJS\tMade usage of trace optional to improve performance\n2007-02-01\tJS\tImprovements to debug_trace to log also recursive events\n2007-02-01\tJS\tAdded ->haschildren, which is now used by ->renderhtml to properly show or hide child level\n2007-01-31\tJS\t->renderhtml Added renderhtml_levels to keep track of how many levels deep navigation has been rendered, to be able to add proper spacing between navigation and content\n2007-01-31\tJS \t->url: -urlargs  Improved handling of urlargs and ?/& delimiters, should work better with navmethod path\n2007-01-30\tJS\tRemoved automatic link title attribute since it can be confusing to show children page titles there\n2007-01-30\tJS\tCorrected parameter path to -path (bug)\n2007-01-23\tJS\t->include: \\'config\\' checks if the same config has already run as actionconfig and won\\'t run again in that case\n2007-01-23\tJS\t->include checks if the file exists first, so no need for empty placeholder files\n2007-01-23\tJS\tAdded ->include and ->library\n2007-01-23\tJS\tAdded ->setlocation\n2007-01-17\tJS\tAdded insert: -hide to allow a location without showing it in navigation\n\nTODO\nAdd support for compound expressions for template. The expression could return a map that would override corresponding param values. \n->insert: Add -raw to be able to inject code into the link tag, similar to form->addfield(-raw). \nExclude file name for example index.lasso from getargs\nOptimize nav->url! Very slow with complex nav object. \nNeeds to exclude also -keyfield and -lockfield. Maybe better to add an option to ->url to not auto-add any \"-\" params at all. \n-params are not sent along in breadcrumb links\nNeed simple way to exclude certain \"-\" params from ->url, also in config per nav item\nAdd support for adding nav structure from a database\nMove templates to a member tag to be make it easier to subclass\nMake it possible to use external URL for -url (make sure there is no / before http)\n\n','knop_base'='2009-09-14\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-04-07\tJS\t->error_msg: custom error numbers can now be added, even if the language already exists.\n2008-01-10\tJS\t->error_msg: improved reporting of custom error messages such as from bad database queries\n2007-12-13\tJS\tAdded -> error_lang to provide a reference to the knop_lang object for error messages, to be able to add localized error messages to any Knop type (except knop_lang and knop_base)\n2007-12-12\tJS\tAdded -html and -xhtml to ->help to get a nicely formatted output. \n2007-12-11\tJS\tCentralized ->error_code and ->error_msg to knop_base. Moved all error codes to error_msg\n2007-12-06\tJS\tChanged ->help to improve the self-documentation. It will now always return an up to date list of member tags and parameter. \n2007-11-05\tJS\tAdded var name to trace output\n2007-06-17\tJS\tAdded ->tagtime (was in nav earlier)\n2007-06-13\tJS\tAdded -> varname to be able to retreive the name of the page variable that a type instance is stored in.\n2007-06-13\tJS\tAdded -> xhtml to automatically sense if an xhtml doctype exists in the current page buffer. The result is cached in a page variable for performance. \n\t\t\t\tThis is for internal use for member tags that output html. \n2007-06-13\tJS\tIntroduced page variable $_knop_data for general page level storage and caching, common between different knop objects. \n2007-06-13\tJS\tCreated the data type\n\nTODO: ->help: add output option to format for Google Code Wiki\n->xhtml is not working properly when site is run by atbegin handler and explicitly writing to content_body \n\n\n','knop_grid'='2011-01-01\tSP\tCorrection of invalid HTML in <thead> and <tr>\n2010-12-23\tSP\tCorrected pagination bug for -numbered.\n2010-11-17\tJC\tAdded -startwithfooter flag to grid->renderhtml.  This moves the footer before the column titles in the table header.\n2010-11-17\tJC\tChanged rawheader inclusion to work even if there\\'s no quicksearch for a grid\n2010-05-14\tJC\tAdded span separation on grid footer for better styling\n2010-03-06\tSP\tChanged default behavior of ->sortparams and ->quicksearch with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->sortparams and ->quicksearch with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2010-01-27\tJC\tAdjusted the id support\n2010-01-25\tJC\tAdded support for optional id, used by table, quicksearch and quicksearch_reset\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-08-26\tJS\tCorrected prev/next links when no nav is defined for the grid object\n2009-06-29\tJS\t->renderlisting: documentation correction (renderlisting never calls renderfooter). \n2009-01-11\tJS\t->renderlisting: Made sure that template isn\\'t applied on NULL field values since that would cause an error with ->replace \n2008-12-29\tJC\tSupport for optional classes in table header\n2008-11-27\tJC\t-> implemented support for td specific classes. The class is inserted in both the TH and TD tag for the specified field\n2008-09-24\tJS\t->sortparams: fieldnames specified by the -sort parameter are now validated so they exist in the database\n2008-09-24\tJS\t->sortparams, ->quicksearch: Added protection against backtick sql injection in MySQL object names\n2008-09-10\tJS\t-numbered can now be specified at oncreate in addition to  ->renderhtml and ->renderfooter. \n2008-09-08\tJS\t->sortfield changed so defaultsort is honored even if -nosort is specified (-nosort is only used to prevent the user from changing sort order on the fly)\n2008-09-08\tJS\t->renderlisting and ->renderfooter optimized by caching the result of nav->url. \n2008-05-15\tJS\t->renderfooter: minor adjustment to numbered pagination links\n2008-05-14\tJS\t->renderfooter (and ->renderhtml): added -numbered as option to get google style numbered pagination links. Render the grid with -numbered (defaults to show 6 page number links plus the far ends) or -numbered=10 or another number. \n2008-05-13\tJS\tAdded ->renderlisting which is now part of ->renderhtml for more flexibility\n2008-02-25\tJS\t->renderheader and ->renderfooter calls nav -> url with -getargs \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: addded -autoparams to nav -> url used in links since url was changed to default to no autoparams. \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: improved support for param based navigation method  in links, cleaned up linking to use nav -> url instead of self -> urlparams when nav is available\n2008-01-22\tJC\t->quicksearch: Changed wordseparators so that \\\\r and \\\\n aren\\'t placed as \\\\r\\\\n, otherwise they are treated as a single character by ->split. \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-03\tJS\tAdded optional -language parameter to set the initial language for the grid object\n2007-12-03\tJS\tAdded -> lang to provide a reference to the knop_lang object that is used for localized strings\n2007-12-03\tJS\tAdded localized strings for English and Swedish\n2007-12-03\tJS\tAdded knop_lang to handle localized strings\n2007-11-11\tJC\tAdded optional -rawheader for extra header content to be inserted before the Quicksearch form\n2007-10-23\tJS\t->renderheader: added class=\"grid\" to the opening table tag to be able to isolate the css specifications\n2007-10-03\tJS\t->renderfooter: added unique classes for each type of prev/next link to be able to replace with images using css\n2007-10-03\tJS\t->renderfooter: Changed prev/next link texts to simple |< << >> >| instead of unicode glyphs\n2007-09-20\tJS\tPostparams are only sent along for nav params (not \"-\" params)\n2007-09-07\tJS\tAlso send postparams along in prev/next links (not only getparams)\n2007-09-06\tJS\tIf nav has params defined, those params will be sent along with prev/next links\n2007-09-06\tJS\tAdded encode_url for link params\n2007-09-06\tJS\tChanged -action to -formaction in the quicksearch form\n2007-08-08\tJS\t->urlargs: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\t->quicksearch: added \\\\r and \\\\n as word separators. \n2007-05-03\tJS\t->addfield: Added check for empty dbfield name before adding to dbfieldmap\n2007-04-19\tJS\t->quicksearch: added  -value (flag) that makes quicksearch output just the value of the quicksearch field instead of a query\n2007-04-13\tJS\t->oncreate: added -nosort as global flag (overrides column specific sort options)\n2007-04-13\tJS\t->renderfooter: Added tbody to footer to make it pass validation, but it\\'s still not semantically correct. \n2007-04-13\tJS\tChanged field type for quicksearch for non-WebKit based browsers\n2007-04-10\tJS\t->quicksearch: Added @ as word separator for \"word begins with\" search\n2007-04-10\tJS\t->quicksearch: Added -contains as option to perform a simple contains search instead of emulating \"word begins with\" search\n2007-04-10\tJS\t->renderheader: When grid has a defaultsort, there should be no \"unsort\" option in the sortable headings\n2007-04-10\tJS\t->insert: (-defaultsort=\\'desc\\') or (-defaultsort=\\'descending\\') makes the default sort order sort in descending order\n2007-04-04\tJS\t->addfield: -template can now also be a compound expression\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tAdded support for FileMaker with quicksearch (untested)\n2007-03-01\tJS\tChanged all texts to English\n2007-02-07\tJS\tRemoved classs=\"first\" and class=\"notopborder\" since CSS border-collapse: collapse; eliminates the need\n2007-02-05\tJS The -keyvalue parameter for url edit links can be given another name by specifying -keyparamname in addfield\n2007-01-31\tJS\t->addfield: #value# can be used in -url, as a way to provide mailto links etc in lists\n2007-01-30\tJS\tSortable columns now thave three states instead of two: sorted ascending, sorted descending and unsorted. \n2007-01-30\tJS\tImprovements to quicksearch, to emulate \"word begins with\"  searches\n2007-01-26\tJS\tAdded support for quicksearch field in grid header. Specify -quicksearch at ->oncreate, and tell what fields to search by specifying -quicksearch for those fields at ->addfield. \n\t\t\t\tFields can be search only (no display) by leaving out name and label. All specified fields are searched word for word of thew search string. \n\t\t\t\tUse ->quicksearch to get the search parameters (optionally -sql)\n2007-01-26\tJS\tAdded ->urlargs to get a querystring with all \"-\" GET params, except those in optional -except string or array parameter. \n2007-01-22\tJS\tAdjustments to highlighting and \"(redigera)\"-link for records with empty values in the linked field\n2007-01-19\tJS\tAdded href titles to sort links and prevnext links\n2007-01-19\tJS\tCorrected sortparams when no sortfield is specified\n2007-01-19\tJS\tAddded go to first page, go to last page in footer\n2007-01-19\tJS\tAdded member tag page_skiprecords to help correcting out of bounds page numbers\n2007-01-19\tJS\tAdded member tag lastpage\n2007-01-18\tJS\tSupport for highlighting of affected record after edit or update (class name \"highlight\")\n2007-01-17\tJS\tAdded addfield: -template\n\nTODO\nMake it possible for knop_grid to work independently of a knop_database object so other types of listings can bre created. \nLanguage of quicksearch buttons can\\'t be changed after the grid has been created\ntbody is used in renderfooter, which is not semantically correct. can\\'t use tfoot though since the footer is rendered twice. \nMove templates to a member tag to be make it easier to subclass\nChange ->addfield to ->insert and make ->addfield deprecated\n\n','knop_database'='2012-06-10\tSP\tFix for decimal precision bug in 8.6.0.1 in renderfooter.\n2012-01-15\tSP\tAdd support for inline host method.  Thanks to Ric Lewis.\n2010-11-23\tJS\t->settable: removed reference for -table\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->nextrecord: Added deprecation warning\n2009-05-15\tJS\t->field: corrected the verification of the -index parameter\n2009-01-09\tJS\tAdded a check before calling resultset_count so it will not break in Lasso versions before 8.5\n2009-01-09\tJS\t->_unknowntag: fixed incorrect debug_trace\n2008-12-03\tJS\t->addrecord: improved how keyvalue is returned when adding records\n2008-12-03\tJS\t->addrecord: inserting a generated keyvalue can now be suppressed by specifying -keyvalue=false\n2008-12-03\tJS\t->saverecord and ->deleterecord will now use the current keyvalue (if any), so -keyvalue will not have to be specified in that case. \n2008-11-25\tJS\t->field and ->recorddata will no longer touch current_record if it was zero\n2008-11-24\tJS\t->field: Added -index parameter to be able to access any occurrence of the same field name\n2008-11-24\tJS\tAdded -> records that returns a new data type knop_databaserows\n2008-11-24\tJS\t->resultset_count: added support for -inlinename. \n2008-11-24\tJS\tChanged ->nextrecord to ->next. ->nextrecord remains supported for backwards compatibility.\n2008-11-14\tJS\t->nextrecord resets the record pointer when reaching the last record\n2008-11-13\tJS\t->recorddata now honors the current record pointer (as incremented by -nextrecord)\n2008-11-13\tJS\t->recorddata: added -recordindex parameter so a specific record can be returned instead of the first found.\n2008-10-30\tJS\t->getrecord now REALLY works with integer keyvalues (double oops) - I thought I fixed it 2008-05-28 but misplaced a paren...\n2008-09-26\tJS\tAdded -> resultset_count corresponding to the same Lasso tag, so [resultset]...[/resultset] can now be used through the use of inlinename.\n2008-09-10\tJS\t-> getrecord, ->saverecord, ->deleterecord: Corrected handling of lock user to work better with knop_user\n2008-07-09\tJS\t->saverecord: -keeplock now updates the lock timestamp\n2008-05-28\tJS\t->getrecord now works with integer keyvalues (oops)\n2008-05-27\tJS\t->get returns a new datatype knop_databaserow \n2008-05-27\tJS\tAdded ->size and ->get so a database object can be iterated. When iterating each row is returned as an array of field values. \n2008-05-27\tJS\tAddedd ->nextrecord that increments the recordpointer each time it is called until the last record in the found set is reached. Returns true as long as there are more records. Useful in a while loop - see example below\n2008-05-27\tJS\tImplemented record pointer \\'current_record\\'. The record pointer is reset for each new query. \n2008-05-27\tJS\t->field: added -recordindex to get data from any record in the current found set\n2008-05-27\tJS\tAdded ->_unknowntag as shortcut to field\n2008-05-26\tJS\tRemoved onassign since it causes touble\n2008-05-26\tJS\tExtended field_names to return the field names for any specified table, return field names also for db objects that have never been used for a database query and optionally return field types\n2008-01-29\tJS\t->getrecord now supports -sql. Make sure that the SQL statement includes the relevant keyfield (and lockfield if locking is used). \n2008-01-10\tJS\t->capturesearchvars: error_code and error_msg was mysteriously not set after database operations that caused errors. \n2008-01-08\tJS\t->saverecord: added flag -keeplock to be able to save a locked record without releasing the lock\n2007-12-15\tJS\tAdding support for knop_user in record locking is in progress. Done for ->oncreate and ->getrecord. \n2007-12-11\tJS\tMoved error_code and error_msg to knop_base\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-10\tJS\tAdded ->settable to be able to copy an existing database object and properly set a new table name for it. Faster than creating a new instance from scratch. \n2007-12-03\tJS\tCorrected shown_first once again, hoping it\\'s right this time\n2007-11-29\tJS\tAdded support for field_names and corresponding member tag ->field_names\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-26\tJS\t->capturesearchvars: corrected shown_first when no records found\n2007-10-26\tJS\t->oncreate: added default value \"keyfield\" if the -keyfield parameter is not specified\n2007-09-06\tJS\tCorrected self -> \\'tagtime\\' typo\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\tChanged recordid_value to keyfield_value and -recordid to -keyvalue\n2007-05-28\tJS\t->oncreate: Added clearing of current error at beginning of tag\n2007-04-19\tJS\tCorrected the handling of -maxrecords and -skiprecords for SQL selects that have LIMIT specified\n2007-04-19\tJS\tImproved handling of foundrows so it finds any whitespace around SQL keywords, instead of just plain spaces\n2007-04-18\tJS\t->select now populates recorddata with all the fields for the first found record. Previously it only populated recorddata when there was 1 found record. \n2007-04-12\tJS\t->oncreate: Added authentication inline around Database_TableNames../Database_TableNames\n2007-04-10\tJS\t->oncreate: Improved validation of table name (table_realname can sometimes be null even for valid table names)\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-01-30\tJS \tAdded real error codes and additional error data for some errors (like record locked)\n2007-01-30\tJS\tChanged -keyvalue parameters to copy value instead of pass as reference, to not cause problems when using keyvalue from the same db object as is being updated, for example $db->(saverecord: -keyvalue=$db->keyvalue)\n2007-01-26\tJS\tAdjusted affectedrecord_keyvalue so it\\'s only captured for -add and -update\n2007-01-23\tJS\tSupports -uselimit (or querys that use LIMIT) and still gets proper searchresult vars (using a separate COUNT(*) query) - may not always get the right result for example for queries with GROUP BY\n2007-01-23\tJS\t-keyfield can be specified for saverecord to override the default\n2007-01-23\tJS\tChanged name of ->updaterecord to ->saverecord\n2007-01-23\tJS \tFixed bug where keyfield was missing as returnfield when looking up locked record for deleterecord\n2007-01-23\tJS\tAdded ->field\n2007-01-19\tJS\tAdded maxrecords_value and skiprecords_value to searchresultvars\n2007-01-18\tJS\tAdded affectedrecord_keyvalue to make it possible to highlight affected record in record list (grid)\n\n\nTODO:\nAllow -keyfield to be specified for ->addrecord and ->deleterecord\nAdd some Active Record similar functionality for editing\nLook at making it so -table can be set dynamically instead of fixed at oncreate, to eliminate the need for one db object for each table. This can cause problems with record locks and how they interact with knop_user \ndatetime_create and datetime_mod, and also user_create and user_mod.\n\tUse default field names but allow to override at oncreate, and verify them at oncreate before trying to use them. \n\n\n','knop custom tags in util.inc'='\t2007-06-17\tJS\tCreated the type\n\t\n\t','knop_user'='2012-01-16\tSP\tAdded ->removedata to remove field from the data map.  Thanks to Ric Lewis.\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-23\tJS\t->encrypt now uses default encrypt_cipher from the custom type instead of a hard coded default\n2009-02-26\tJS\t->login: further correction on the search for login with FileMaker, to reduce the risk for false duplicates\n2009-02-26\tJS\t->login: Added optional -searchparams to be able to add more conditions to the login search, for example to exclude users that are not enabled. \n2008-12-02\tJS\t->encrypt: Changed to -hex cipher instead of encode_base64\n2008-11-05\tJS\t->getdata: corrected a check that prevented the tag from returning anything\n2008-11-05\tJC\t->login: A failed login attempt now results in a logout instead of keeping any old authentication\n2008-11-05\tJC\t->getpermission will always return falseif a user is not logged in\n2008-11-05\tJC\t->logout: The permissions map is now cleared when logging out\n2008-11-04\tJC\t->encrypt: changed incorrect encrypt_cipher to encrypt_digest\n2008-09-10\tJS\tAdded ondeserialize to make client_fingerprint_expression survive session\n2008-07-17\tJS\tImplemented ->setpermission and ->getpermission\n2008-07-17\tJS\tAdded client_fingerprint_expression as compound expression so it can be configurable by changing the instant variable\n2008-05-20\tJS\t->login: Added delay between more than 5 failed login attempts \n2008-05-08\tJS\t->login: improved the search for FileMaker datasources to make it work for email address as username\n2008-02-08\tJS\tAdded ->keys\n2008-02-03\tJS\t-> login: Corrected storage of id_user\n2007-11-27\tJS\tCoded an incomplete version\n2007-06-13\tJS\tCreated the data type\n\n// TODO: \nMake it possible for knop_user to work independently of a knop_database object by creating a custom user lookup - see http://listsearch.com/Lasso/Thread/index.lasso?20528\nuserdb reference is brooken, probably when stored in session. Can this be fixed?\nMake client_fingerprint configurable by specifying a compound expression at oncreate\nAdd support for role based permisions\n\n','knop_lang'='2010-12-29\tJS\t->getstring: make sure we only try to do replacement in strings or bytes\n2010-05-27\tJS\tgetstring now works also with empty -replace value\n2010-04-20\tJS\tgetstring debug output corrected for missing string. \n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->addstring: clarified deprecation warning\n2009-04-08\tJS\tAdded -debug flag to oncreate (when creating a lang object) to make undefined language keys appear as *key*.\n2009-03-24\tJS\t->getstring prevents replacements if there is no language string found, to prevent null->replace error\n2008-11-12\tJS\tAdded ->insert instead of ->addstring for better consistency with other Lasso data types. ->addstring will remain functional for backwards compatibility. \n2008-09-11\tJS\t->_unknowntag: added missing support for -language\n2008-01-22\tJS\t->getstring: corrected the fallback behavior when a current language has been set \n2008-01-07\tJS\tRemoved instance variable browserlanguage due to problems with transient storage. The browserlanguage is cached on page level so it\\'s no loss in reality. \n2007-12-12\tJS\tAdded page level storage of currentlanguage, so all knop_lang instances defaults to the same language once one of them have set a language explictly, but only if the other knop_lang instances don\\'t have a language set explicitly. \n2007-12-12\tJS\tAdded page level caching of browser language (stores the value in $_knop_data map)\n2007-12-06\tJS\tMoved -> help to knop_base\n2007-12-06\tJS\tAdded ->description to all member tags. \n2007-12-03\tJS\tFinished first complete version\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-13\tJS\tRenamed to knop_lang (formerly knop_strings)\n2007-04-04\tJS\tCreated the data type and started coding\n\nTODO:\nProvide methods to handle formatting of dates, numbers, currency etc for different languages/locales. \nWeekday names, month names etc. \nMember tag to return the current language\nMember tag to set default output encoding unless it follows encode_set. \n\nExamples\n\tvar: \\'lang_messages\\'=(knop_lang: -default=\\'en\\');\n\t$lang_messages -> (insert: -key=\\'welcome\\', -value=\\'Welcome to the home page\\', -language=\\'en\\');\n\t$lang_messages -> (insert: -key=\\'welcome\\', -value=\\'Välkommen till hemsidan\\', -language=\\'sv\\');\n\t$lang_messages -> (insert: -key=\\'loggedin\\', -value=\\'You are logged in as #1# #2#\\', -language=\\'en\\');\n\t$lang_messages -> (insert: -key=\\'loggedin\\', -value=\\'Du är inloggad som #1# #2#\\', -language=\\'sv\\');\n\n\t// proper call, defaults to the browser\\'s preferred language\n\t$lang_messages -> (getstring: \\'welcome\\');\n\t// shorthand call\n\t$lang_messages -> welcome;\n\n\t// change language\n\t$lang_messages -> (setlanguage: \\'sv\\');\n\t$lang_messages -> welcome;\n\n\t// proper call with replacements\n\t$lang_messages -> (getstring: -key=\\'loggedin\\': -replace=(array: (field: \\'firstname\\'), (field: \\'lastname\\')));\n\n\t// shorthand call with replacements\n\t$lang_messages -> (loggedin: -replace=(array: (field: \\'firstname\\'), (field: \\'lastname\\')));\n\n\n','knop_form'='2011-02-28\tJS\t->addfield: Added -template to specify field specific template \n2010-11-22\tSP\t->init: Correction of -lockvalue handling after L9 syntax adjustment\n2010-07-18\tSP\tAdded support for series for -options\n2010-06-10\tJS\t->renderform: avoid adding -upload parameters to post forms since it conflicts with file uploads (found by Steve Piercy)\n2010-04-21\tJS\t->renderhtml:  removed encode_html for label\n2010-03-06\tSP\tChanged default behavior of ->updatefields with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->updatefields with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2009-11-11\tJS\tAdded class and id to optiongroup div that surrounds for checkbox and radio\n2009-11-11\tJS\tCorrected id for checkbox and radio option labels\n2009-10-02\tJS\tAdded id for labels, auto generated from the field\\'s id with _label appended\n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-09-04\tJS\t->renderhtml: corrected typ for autoparams\n2009-07-23\tJS\t->renderform: removed encode_html that somehow has reappeared for label. \n2009-07-10\tSP\tadded -maxlength option for text fields\n2009-06-26\tJS\t->oncreate: added deprecation warning for -action\n2009-06-22\tJS\t->addfield: corrected -options check to look for set instead of series (besides array)\n2009-04-16\tJS\t->loadfileds can now load field values from -params also inside an inline\n2009-03-20\tJS\tAdded  <![CDATA[ ... ]]>  around injected scripts for better xhtml compliance\n2009-01-08\tJS\t->getvalue and _unknowntag: added -index parameter to be able to get value for a specific field instance when there are multiple fields with the same name \n2009-01-08\tJS\t->loadfields: implemented support for multiple fields with the same name when loading field values from form submission where the number of same name fields matches\n2009-01-07\tJS\t->setvalue: added -index parameter to be able to set value for a specific field instance when there are multiple fields with the same name \n2008-12-08\tJS\t->renderform: Removed the onclick handlers for checkbox and radio since Safari now supports clicking the label text as click for the checkbox/radio control. \n2008-12-05\tJS\t->renderform: the fieldset and legend field types will now use id and class on the fieldset tag if specified\n2008-12-03\tJS\t->renderform: fields of type fieldset now uses value as legend (just as field type legend already did) instead of always using an empty legend\n2008-09-24\tJS\t->updatefields: Added protection against backtick sql injection in MySQL object names\n2008-09-17\tJS\t->renderform and ->renderhtml: -from and -to allows negative numbers to count from end of form instead\n2008-09-13\tJS\tAdded ->getlabel to return the display name for a field. \n2008-09-13\tJS\t->addfield and ->validate: Implemented -validate to specify a compound expression to validate the field input. \n2008-09-13\tJS\t->addfield and ->loadfields: Implemented -filter to specify a compound expression to filter the field input. \n2008-09-11\tJS\t->updatefields: fixed exclusion of special field types html, legend and fieldset. \n2008-09-11\tJS\t->renderform: Fixed missing value for password fields\n2008-07-02\tJS\t->renderform: Cleaned up the automatic adding of javascript code so it\\'s not added if not needed. Also moved all scripts to the end of the page. More work with with the javascripts is needed.\n2008-06-03\tJS\t->renderform: corrected missing closing </fieldset>\n2008-05-15\tJS\t->renderform and ->renderhtml: adjusted the behavior for nested fieldsets\n2008-05-13\tJS\tImplemented -legend for ->renderhtml, to make it consistent with the new legend field type\n2008-05-13\tJS\tImplemented special field types html, fieldset and legend. Use -value to display data for these fields. A legend field also creates a fieldset (closes any previously open fieldsets). Use fieldset with -value=false to close a fieldset without opening a new one. \n2008-05-06\tJS\tAdded unknowntag as shortcut to getvalue\n2008-01-30\tJS\tRemoved duplicate endscript entries for if(dirty) {makedirty()};\n2007-12-13\tJS\tCorrected ->addfield: -dbfield so empty dbfields are properly ignored by ->updatefields. \n2007-12-11\tJS\tMoved error_msg to knop_base (special version of error_code stays here) \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-11-13\tJS\tAdded -buttontemplate to be able to specify separate template for buttons, defaults to no <br>, but if template has been specified that will be used instead (for backwards compatibility)\n2007-11-12\tJS\t->process delete now works also when not using record locking (not specifying -user)\n2007-11-01\tJS\t->renderform: added support for -hint for textarea fields.\n2007-09-27\tJS\t->renderhtml: multiple values (array) for radio, checkbox and select are now rendered properly with either \",\" or <br> depending on the presence of -linebreak, and with the display text instead of the actual option value\n2007-09-27\tJS\t->renderform: improved handling of multiple values for checkbox, radio and select\n2007-09-21\tJS\t->addfield: flag parameters now accept false as value\n2007-09-06\tJS\t->oncreate: changed name of -action to -formaction to make it more clear what it is. -action is still supported but deprecated.\n2007-09-06\tJS\t->renderform: Corrected the exception for -session... (duh)\n2007-08-08\tJS\t->renderform: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-12\tJC\tbugfixed -xhtml form rendering when called by quicksearch\n2007-06-11\tJC\tadded handling of xhtml output\n2007-04-19\tJS\t->loadfields: fixed -params that was broken when adding -database\n2007-04-19\tJS\t->renderform: removed invalid wrap=\"soft\" from textarea\n2007-04-12\tJS\t->process: made -user optional (only needed when using record locking)\n2007-04-12\tJS ->loadfields can now take a -database parameter, either as a flag (no value) where the database object connected to the form will be used, or by specifying a database object as value. \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\t->renderform fixed unsavedwarning on page load by moving checkdirty() to afterscript\n2007-03-01\tJS\t->formmode and ->init changed so it preserves the right mode after a failed add\n2007-02-27\tJS\t->renderform: added <div class=\"inputgroup\"> around checkboxes and radios for css formating\n2007-02-26\tJS\t->oncreate: added -actionpath to specify the framework action path for the form instead of manually adding the -action hidden field\n2007-02-24\tJS\tCorrected entersubmitblock behavior by adding onfocus handler on form and starting with submitBlock=false\n2007-02-23\tJS\tRemoved encode_html from form field labels\n2007-02-22\tJS\t->setformat: Added -legend\n2007-02-07\tJS\tAdded ->copyfield to copy a form field to a new name, with the same properties. \n2007-02-07\tJS\t->errors now returns empty array if validate has not been called, instead of performing validation\n2007-02-05\tJS\t->getbutton can now look for also button names that are not one of the built-in ones (for example button_apply)\n2007-02-05\tJS The -keyvalue parameter can be given another name by specifying -keyparamname in oncreate\n2007-02-02\tJS\tAdded ->lockvalue_decrypted\n2007-02-02\tJS\t->addfield: -value is now stored as reference\n2007-02-02\tJS\terror_code now returns an error for when the form contains validation errors\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-02-02\tJS \tAdded real error codes\n2007-01-31\tJS\t->rederform action_params now also exclude \"-\" params that appear in the form action\n2007-01-29\tJS\t->renderform: The first field with input error will get focus when loading page\n2007-01-29\tJS\tAdded -focus to ->addfield to give default field focus when loading page with form\n2007-01-29\tJS\tAdded -disabled to ->addfield, and handling of it in ->renderform\n2007-01-29\tJS\tAdded -noautoparams to ->oncreate to disable the automatic passing of action_params that begin with \"-\"\n2007-01-29\tJS\t->renderform now renders label also for submit, reset to format properly with css\n2007-01-26\tJS\tAdded support for Safari specific <input type=\"search\">\n2007-01-26\tJS\t->renderform action_params that begin with \"-\" now exclude params that exist in the form. Minor corrections to the behavior. \n2007-01-25\tJS\tAdded -nowarning to ->oncreate to disable unsaved warnings for the entire form\n2007-01-25\tJS\tAdded -required to ->oncreate (and a few more from ->setformat)\n2007-01-23\tJS\tAutogenerates id for the form itself\n2007-01-23\tJS\tAdded ->getbutton to return the button that was clicked when submitting a form (cancel, add, save, delete)\n2007-01-23\tJS\tAdded auto conversion of options left hand pair member to string, to make comparsions work reliably. Integer zeros don\\'t compare nicely to strings. \n2007-01-23\tJS\tAdded support for submit-on-enter prevention: specify -entersubmitblock at oncreate\n2007-01-19\tJS\tAddes renderform: -legend to be able to group form fields at render time\n2007-01-19\tJS\tadded support for -optgroup in -options for select. Also works for radio and checkbox. Specify empty -optgroup to close optgroup in select without starting a new, or to add extra linebreak between checkboxes/radio buttons. \n2007-01-19\tJS\tadded -template for oncreate\n2007-01-19\tJS\tadded optional fieldset and legend to form, legend can be specified as -legend at oncreate. if -legend is specified, the form will be wrapped in a fieldset. \n2007-01-19\tJS\tmethod now defaults to post\n2007-01-19\tJS\tCorrected line separator for FileMaker checkboxes and added the same handling also for radio\n2007-01-18\tJS\trenderform: any action_params that begin with \"-\" (except -keyvalue and -lockvalue) are added as form parameters\n2007-01-18\tJS\trenderform: checkboxes and multiselects now show checked and selected properly when loading values from database\n2007-01-18\tJS\tupdatefields: added support for multiple values for one fieldname, like checkboxes (multiple fields in the update pair array, -sql generates comma separated values)\n2007-01-17\tJS\treset button now makes form undirty\n2007-01-17\tJS\taddfield: -confirmmessage can now be specified for any submit or reset button\n2007-01-17\tJS\tadded addfield: -nowarning to avoid unsaved warning when the field is changed\n2007-01-17\tJS\tchanged default class name for unsaved marker from dirty to unsaved\n2007-01-17\tJS\tchanged name of -dirtymarker and -dirtymarkerclass to unsavedmarker and -unsavedmarkerclass for userfriendlyness\n2007-01-17\tJS\tadded setformat: -unsavedwarning to dynamically set the javascript form dirty warning message\n2007-01-17\tJS\trenderform: -field changed to renderform: -name for consistency\n2007-01-16\tJS\trenderform: -field with wrong field name does not output anything, instead of the entire form\n2007-01-16\tJS\tfixed onbeforeunload in javascript form dirty handler\n\nTODO:\n->addfield: Add -format to manipulate the field value before it is displayed by ->renderform and ->renderhtml, much like -filter but only for display and without affecting input. \n->addfield: Add -fieldgroup to be able to group related fields together, useful for ->updatefields to return just fields that belong to a specific db table, or ->renderform as another way to render a form selectively\n->renderform needs a better way to display errors inline together with the fields\nMake _unknowntag also work as shortcut to setvalue if a value is specified\nAdd a new special field type to the form object, let\\'s say \"data\". That field type will not interact with forms and will never be touched by loadfields, but it will populate ->updatefields.\nAdd -> searchfields, which will return a fulltext enabled pair array better suited for searchs than ->updatefields is. -fulltext needs to be specified per field. \nReview and clean up the javascripts inserted automatically by knop_form - partially done\nOption to let textarea grow automatically depending on the amount of text in it.  \nUse http://bassistance.de/jquery-plugins/jquery-plugin-validation/ instead of client side validation\nPossibly add support for the same validation expressions as the jquery validation plugin uses, so server side a nd client side validation can be specified at once. \nAdd -path as parameter for oncreate so the form action can be set with less confusion...  In that case -formaction will be a physical url, while -path would be a framework path. \nFix actionpath reference so it updates properly when altering the value (not possible?)\nShould loadfields load \"-\" params?\nUnsavedwarning made optional, does not seem to work properly now?\nMore flexible error hightlighting\nMove templates to a member tag to be make it easier to subclass (Douglas Burchard)\nAdd \"button\". <button></button>. Subtypes are submit, reset and button. How to specify the subtype? (Douglas Burchard)\nChange ->addfield to ->insert and make ->addfield deprecated\nThere is no src for input type image!\nAdd ->size and ->get so the form object can be iterated\nAdd -skipemtpy to to ->renderhtml\nOption for -> renderhtml to output without html encoding\n->renderhtml should never html encode fields of type html\n\n',));\n\t\tif(local_defined('type'));return(#changenotes -> find(#type));else;\n\t\t!local_defined('date') ? local('date'=date('1900-01-01')) | #date = date(#date);\n\t\titerate(#changenotes, local('changenote'));\n\t\t\t#output += #changenote -> name + '\\n';\n\t\t\titerate(#changenote ->value -> split('\\n'), local('changenote_row'));\n\t\t\t\tif(date(#changenote_row -> split(regexp('\\\\s')) -> first) >= #date);\n\t\t\t\t\t#output += #changenote_row + '\\n';\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#output += '\\n';\n\t\t/iterate;\n\t\treturn(@#output);/if;\n\t\t/define_tag]"
  },
  {
    "path": "src/test/resources/samples/langs/Latte/layout.latte",
    "content": "{**\n * @param string $basePath web base path\n * @param string $robots tell robots how to index the content of a page (optional)\n * @param array $flashes flash messages\n *}\n<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta name=\"description\" content=\"\">\n\t<meta name=\"author\" content=\"\">\n\t<meta name=\"robots\" content=\"{$robots}\" n:ifset=\"$robots\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n\t<title>{ifset $title}{$title} › {/ifset}Translation report</title>\n\n\t<link rel=\"stylesheet\" media=\"screen,projection,tv\" href=\"{$cdnUrl}/css/style.css?v={$cssHash}\">\n\t<link rel=\"shortcut icon\" href=\"{$cdnUrl}/favicon.png\">\n\t<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n\t\t<script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n\t\t<script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n    <script n:syntax=\"off\">\n\t\t(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n\t\t(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n\t\tm=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n\t\t})(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\t\tga('create', 'UA-33892654-4', 'khanovaskola.cz');\n\t\tga('send', 'pageview');\n    </script>\n\t{block #head}{/block}\n</head>\n\n<body class=\"amara-guest history-empty\">\n\t<script> document.documentElement.className+=' js' </script>\n\n\t{block #navbar}\n\t\t{include _navbar.latte}\n\t{/block}\n\n\t<div class=\"container\">\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-md-8 col-md-offset-2\" n:inner-foreach=\"$flashes as $flash\">\n\t\t\t\t{include _flash.latte, flash => $flash}\n\t\t\t</div>\n\t\t</div>\n\n\t\t{include #content}\n\t</div>\n\n\t<footer>\n\t</footer>\n\n\t<script src=\"{$cdnUrl}/js/compiled.js?v={$jsHash}\"></script>\n\t{block #scripts}{/block}\n</body>\n</html>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Latte/template.latte",
    "content": "{var $title => \"⚐ {$new->title}\"}\n{define author}\n\t<a n:href=\"Author: authorId => $author->id\" class=\"black\">\n\t\t<img src=\"{$author->avatar}\" width=\"32\" height=\"32\" class=\"img-rounded\">\n\t\t<span class=\"{$class}\">{$author->name|trim}</span>\n\t</a>\n\t<span data-toggle=\"tooltip\" title=\"Total time {$author->shortName} translated on all videos.\">\n\t\t{$author->estimatedTimeTranslated|secondsToTime}{*\n\t*}</span>{if $author->joined}, {/if}\n\t{if $author->joined}joined {$author->joined|timeAgo}{/if}{*\n\t*}{ifset $postfix}, {$postfix}{/ifset}\n{/define}\n{block #scripts}\n\t<script src=\"{$amaraCallbackLink}\"></script>\n{/block}\n{block #content}\n\n{if isset($old)}\n\t<h1>Diffing revision #{$old->revision} and #{$new->revision}</h1>\n{else}\n\t<h1>First revision</h1>\n{/if}\n\n{var $editor = $user->loggedIn && $new->language === 'cs'}\n{var $rev = $new->video->siteRevision}\n<div class=\"row\">\n\t<div class=\"col-md-7\">\n\t\t<p>\n\t\t\tpublished <b>{$new->publishedAt|timeAgo}</b>{*\n\t\t\t*}{ifset $old},\n\t\t\t\t<span>\n\t\t\t\t\t{$new->textChange * 100|number}&thinsp;% text change{*\n\t\t\t\t*}</span>{*\n\t\t\t\t*}{if $new->timeChange},\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{$new->timeChange * 100|number}&thinsp;% timing change\n\t\t\t\t\t</span>\n\t\t\t\t{/if}\n\t\t\t{/ifset}\n\t\t</p>\n\t\t{cache $new->id, expires => '+4 hours'}\n\t\t\t<p>\n\t\t\t\t{if isset($old) && $old->author->name !== $new->author->name}\n\t\t\t\t\t{include author, author => $old->author, class => 'author-old'}\n\t\t\t\t\t&mdash;\n\t\t\t\t\t{include author, author => $new->author, class => 'author-new'}\n\t\t\t\t{elseif isset($old)}\n\t\t\t\t\t{include author, author => $new->author, class => 'author-new', postfix => 'authored both revisions'}\n\t\t\t\t{else}\n\t\t\t\t\t{include author, author => $new->author, class => 'author-new'}\n\t\t\t\t{/if}\n\t\t\t</p>\n\t\t{/cache}\n\n\t\t{var $threshold = 10}\n\t\t{cache $new->id}\n\t\t\t{var $done = $new->timeTranslated}\n\t\t\t{var $outOf = $new->video->canonicalTimeTranslated}\n\t\t\t{if $outOf}\n\t\t\t\t<p n:if=\"$outOf > $done + $threshold\" class=\"alert alert-warning\">\n\t\t\t\t\tOnly {$done|time} translated out of {$outOf|time},\n\t\t\t\t\t{(1-$done/$outOf) * 100|number}&thinsp;% ({$outOf - $done|time}) left\n\t\t\t\t</p>\n\t\t\t\t<p n:if=\"$outOf <= $done + $threshold\" class=\"alert alert-success\">\n\t\t\t\t\tSeems complete: {$done|time} translated out of {$outOf|time}\n\t\t\t\t</p>\n\t\t\t{elseif $done}\n\t\t\t\t<p n:if=\"$outOf <= $done + $threshold\" class=\"alert alert-info\">\n\t\t\t\t\tAlthough {$done|time} is translated, there are no English subtitles for comparison.\n\t\t\t\t</p>\n\t\t\t{/if}\n\t\t{/cache}\n\n\t\t{if $editor}\n\t\t\t{var $ksid = $new->video->siteId}\n\t\t\t{if $ksid}\n\t\t\t\t<a href=\"https://khanovaskola.cz/watch/default/?vid={$ksid}\">\n\t\t\t\t\tVideo on khanovaskola.cz\n\t\t\t\t\t{if $new->revision === $rev}\n\t\t\t\t\t\t(on this revision)\n\t\t\t\t\t{elseif $new->revision > $rev}\n\t\t\t\t\t\t(on older revision #{$rev})\n\t\t\t\t\t{else}\n\t\t\t\t\t\t(on newer revision #{$rev})\n\t\t\t\t\t{/if}\n\t\t\t\t</a>\n\t\t\t{/if}\n\t\t{/if}\n\n\t\t<h3 class=\"diff\">{$diffs->title|noescape}</h3>\n\t\t<div class=\"lead diff\">{$diffs->description|noescape}</div>\n\t\t<div class=\"diff subtitles\">\n\t\t\t<div n:foreach=\"$diffs->text as $line\" class=\"line\" data-context=\"{$line->context}\">\n\t\t\t\t{$line->text|noescape}&nbsp;\n\t\t\t</div>\n\t\t\t<div class=\"splitter template\">\n\t\t\t\t<span data-toggle=\"tooltip\" data-placement=\"bottom\" title=\"Expand\">\n\t\t\t\t\t<i class=\"fa fa-sort\"></i> <i class=\"fa fa-ellipsis-h\"></i>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\n\t\t{if $editor}\n\t\t\t{if $new->approved}\n\t\t\t\t<span class=\"text-success\">\n\t\t\t\t\tRevision has been approved{if $new->editor} by {$new->editor->name}{/if}.\n\t\t\t\t</span>\n\t\t\t\t<a n:href=\"amaraEdit, amaraId => $new->video->amaraId\" n:block=\"editButton\" class=\"btn btn-default\">\n\t\t\t\t\t<i class=\"fa fa-edit\"></i>\n\t\t\t\t\tEdit on Amara\n\t\t\t\t</a>\n\t\t\t\t<a n:href=\"khanAcademy\" n:block=\"kaButton\" class=\"btn btn-link\">\n\t\t\t\t\ton Khan Academy\n\t\t\t\t</a>\n\n\t\t\t{elseif $new->incomplete}\n\t\t\t\t<span class=\"text-info\">\n\t\t\t\t\tRevision has been marked as incomplete by {if $new->editor}{$new->editor->name}{/if}.\n\t\t\t\t</span>\n\t\t\t\t{include editButton}\n\t\t\t\t{include kaButton}\n\n\t\t\t{* else $new->status === UNSET: *}\n\t\t\t{elseif $new->video->siteId}\n\t\t\t\t<div class=\"btn-group\">\n\t\t\t\t\t<a n:href=\"approve!\" class=\"btn btn-default\">\n\t\t\t\t\t\t<i class=\"fa fa-thumbs-o-up\"></i>\n\t\t\t\t\t\tApprove (update kš)\n\t\t\t\t\t</a>\n\t\t\t\t\t<a n:href=\"markIncomplete!\" class=\"btn btn-default\">\n\t\t\t\t\t\t<i class=\"fa fa-thumbs-o-down\"></i>\n\t\t\t\t\t\tMark as incomplete\n\t\t\t\t\t</a>\n\t\t\t\t\t{include editButton}\n\t\t\t\t</div>\n\t\t\t\t{include kaButton}\n\n\t\t\t{else}\n\t\t\t\t<div class=\"btn-group\">\n\t\t\t\t\t<a n:href=\"redirectToAdd!\" class=\"btn btn-default\">\n\t\t\t\t\t\t<i class=\"fa fa-plus-square-o\"></i>\n\t\t\t\t\t\tApprove (add to kš)\n\t\t\t\t\t</a>\n\t\t\t\t\t<a n:href=\"markIncomplete!\" class=\"btn btn-default\">\n\t\t\t\t\t\t<i class=\"fa fa-thumbs-o-down\"></i>\n\t\t\t\t\t\tMark as incomplete\n\t\t\t\t\t</a>\n\t\t\t\t\t{include editButton}\n\t\t\t\t</div>\n\t\t\t\t{include kaButton}\n\t\t\t\t<div>\n\t\t\t\t\t<h5>Filed under category:</h5>\n\t\t\t\t\t{foreach $new->video->categories as $list}\n\t\t\t\t\t\t&mdash; {$list|implode:' › '}{sep}<br>{/sep}\n\t\t\t\t\t{/foreach}\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{/if}\n\t</div>\n\t<div class=\"col-md-5\">\n\t\t<h4>All revisions:</h4>\n\t\t<table class=\"table table-condensed revisions\">\n\t\t\t{foreach $new->video->getRevisionsIn($new->language) as $revision}\n\t\t\t\t<tr n:class=\"$revision->revision === $new->revision ? 'active'\">\n\t\t\t\t\t<td class=\"revision\">\n\t\t\t\t\t\t<a n:href=\"this, revId => $revision->id\">#{$revision->revision}</a>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<a n:href=\"Author: authorId => $revision->author->id\" class=\"black\">\n\t\t\t\t\t\t\t<img src=\"{$revision->author->avatar}\" width=\"32\" height=\"32\" class=\"img-rounded\">\n\t\t\t\t\t\t\t{$revision->author->name}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<span class=\"secondary\">\n\t\t\t\t\t\t\t{$revision->publishedAt|timeAgo}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t{* vars $outOf, $threshold already set *}\n\t\t\t\t\t\t{default $outOf = $new->video->canonicalTimeTranslated}\n\t\t\t\t\t\t{if $outOf} {* ignore if canonical time not set *}\n\t\t\t\t\t\t\t{var $done = $revision->timeTranslated}\n\t\t\t\t\t\t\t<span n:if=\"$outOf > $done + $threshold\" class=\"text-warning\"\n\t\t\t\t\t\t\t\tdata-toggle=\"tooltip\" title=\"Percent of lines translated\">\n\t\t\t\t\t\t\t\t{$done/$outOf * 100|number}&thinsp;%\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span n:if=\"$outOf <= $done + $threshold\" class=\"text-success\">\n\t\t\t\t\t\t\t\t~100&thinsp;%\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t{if $revision->incomplete || $revision->approved}\n\t\t\t\t\t\t\t{var $i = $revision->incomplete}\n\t\t\t\t\t\t\t<span n:class=\"$i ? 'text-warning' : 'text-success'\">\n\t\t\t\t\t\t\t\t{if $i}incomplete{else}approved{/if}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</td>\n\t\t\t\t\t{if $user->loggedIn && $revision->comments->count()}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr class=\"row-noborder\">\n\t\t\t\t\t\t\t<td colspan=\"99\">\n\t\t\t\t\t\t\t\t<table class=\"comments\">\n\t\t\t\t\t\t\t\t\t<tr n:foreach=\"$revision->comments as $comment\">\n\t\t\t\t\t\t\t\t\t\t<td class=\"col-comment-author\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"secondary\" data-toggle=\"tooltip\" data-placement=\"left\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"{$comment->createdAt|timeAgo}\">\n\t\t\t\t\t\t\t\t\t\t\t\t{$comment->user->name}:\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t{$comment->text}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{if $user->loggedIn && $new->id === $revision->id}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr class=\"row-noborder\">\n\t\t\t\t\t\t\t<td colspan=\"99\">\n\t\t\t\t\t\t\t\t{form commentForm}\n\t\t\t\t\t\t\t\t\t<div class=\"input-group comment-input\">\n\t\t\t\t\t\t\t\t\t\t{input text, class => \"form-control\", placeholder => \"Comment this revision (only visible to other editors)\"}\n\t\t\t\t\t\t\t\t\t\t<span class=\"input-group-btn\">\n\t\t\t\t\t\t\t\t\t\t\t<button class=\"btn btn-default\" n:name=\"save\">\n\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-share\"></i>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{/form}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t{/if}\n\t\t\t\t</tr>\n\t\t\t{/foreach}\n\t\t</table>\n\n\t</div>\n</div>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Lean/binary.lean",
    "content": "/-\nCopyright (c) 2014 Microsoft Corporation. All rights reserved.\nReleased under Apache 2.0 license as described in the file LICENSE.\n\nModule: algebra.binary\nAuthors: Leonardo de Moura, Jeremy Avigad\n\nGeneral properties of binary operations.\n-/\n\nimport logic.eq\nopen eq.ops\n\nnamespace binary\n  section\n    variable {A : Type}\n    variables (op₁ : A → A → A) (inv : A → A) (one : A)\n\n    local notation a * b := op₁ a b\n    local notation a ⁻¹  := inv a\n    local notation 1     := one\n\n    definition commutative := ∀a b, a * b = b * a\n    definition associative := ∀a b c, (a * b) * c = a * (b * c)\n    definition left_identity := ∀a, 1 * a = a\n    definition right_identity := ∀a, a * 1 = a\n    definition left_inverse := ∀a, a⁻¹ * a = 1\n    definition right_inverse := ∀a, a * a⁻¹ = 1\n    definition left_cancelative := ∀a b c, a * b = a * c → b = c\n    definition right_cancelative := ∀a b c, a * b = c * b → a = c\n\n    definition inv_op_cancel_left := ∀a b, a⁻¹ * (a * b) = b\n    definition op_inv_cancel_left := ∀a b, a * (a⁻¹ * b) = b\n    definition inv_op_cancel_right := ∀a b, a * b⁻¹ * b =  a\n    definition op_inv_cancel_right := ∀a b, a * b * b⁻¹ = a\n\n    variable (op₂ : A → A → A)\n\n    local notation a + b := op₂ a b\n\n    definition left_distributive := ∀a b c, a * (b + c) = a * b + a * c\n    definition right_distributive := ∀a b c, (a + b) * c = a * c + b * c\n  end\n\n  context\n    variable {A : Type}\n    variable {f : A → A → A}\n    variable H_comm : commutative f\n    variable H_assoc : associative f\n    infixl `*` := f\n    theorem left_comm : ∀a b c, a*(b*c) = b*(a*c) :=\n    take a b c, calc\n      a*(b*c) = (a*b)*c  : H_assoc\n        ...   = (b*a)*c  : H_comm\n        ...   = b*(a*c)  : H_assoc\n\n    theorem right_comm : ∀a b c, (a*b)*c = (a*c)*b :=\n    take a b c, calc\n      (a*b)*c = a*(b*c) : H_assoc\n        ...   = a*(c*b) : H_comm\n        ...   = (a*c)*b : H_assoc\n  end\n\n  context\n    variable {A : Type}\n    variable {f : A → A → A}\n    variable H_assoc : associative f\n    infixl `*` := f\n    theorem assoc4helper (a b c d) : (a*b)*(c*d) = a*((b*c)*d) :=\n    calc\n      (a*b)*(c*d) = a*(b*(c*d)) : H_assoc\n              ... = a*((b*c)*d) : H_assoc\n  end\n\nend binary\n"
  },
  {
    "path": "src/test/resources/samples/langs/Lean/set.hlean",
    "content": "-- Copyright (c) 2015 Jakob von Raumer. All rights reserved.\n-- Released under Apache 2.0 license as described in the file LICENSE.\n-- Authors: Jakob von Raumer\n-- Category of sets\n\nimport .basic types.pi trunc\n\nopen truncation sigma sigma.ops pi function eq morphism precategory\nopen equiv\n\nnamespace precategory\n\n  universe variable l\n\n  definition set_precategory : precategory.{l+1 l} (Σ (A : Type.{l}), is_hset A) :=\n  begin\n    fapply precategory.mk.{l+1 l},\n                  intros, apply (a.1 → a_1.1),\n                intros, apply trunc_pi, intros, apply b.2,\n              intros, intro x, exact (a_1 (a_2 x)),\n            intros, exact (λ (x : a.1), x),\n          intros, apply funext.path_pi, intro x, apply idp,\n        intros, apply funext.path_pi, intro x, apply idp,\n      intros, apply funext.path_pi, intro x, apply idp,\n  end\n\nend precategory\n\nnamespace category\n\n  universe variable l\n  local attribute precategory.set_precategory.{l+1 l} [instance]\n\n  definition set_category_equiv_iso (a b : (Σ (A : Type.{l}), is_hset A))\n    : (a ≅ b) = (a.1 ≃ b.1) :=\n  /-begin\n    apply ua, fapply equiv.mk,\n      intro H,\n        apply (isomorphic.rec_on H), intros (H1, H2),\n        apply (is_iso.rec_on H2), intros (H3, H4, H5),\n        fapply equiv.mk,\n        apply (isomorphic.rec_on H), intros (H1, H2),\n        exact H1,\n      fapply is_equiv.adjointify, exact H3,\n          exact sorry,\n        exact sorry,\n  end-/ sorry\n\n  definition set_category : category.{l+1 l} (Σ (A : Type.{l}), is_hset A) :=\n  /-begin\n    assert (C : precategory.{l+1 l} (Σ (A : Type.{l}), is_hset A)),\n      apply precategory.set_precategory,\n    apply category.mk,\n    assert (p : (λ A B p, (set_category_equiv_iso A B) ▹ iso_of_path p) = (λ A B p, @equiv_path A.1 B.1 p)),\n    apply is_equiv.adjointify,\n        intros,\n        apply (isomorphic.rec_on a_1), intros (iso', is_iso'),\n        apply (is_iso.rec_on is_iso'), intros (f', f'sect, f'retr),\n        fapply sigma.path,\n          apply ua, fapply equiv.mk, exact iso',\n          fapply is_equiv.adjointify,\n              exact f',\n            intros, apply (f'retr ▹ _),\n          intros, apply (f'sect ▹ _),\n        apply (@is_hprop.elim),\n        apply is_trunc_is_hprop,\n      intros,\n  end -/ sorry\n\nend category\n"
  },
  {
    "path": "src/test/resources/samples/langs/Less/screen.less",
    "content": "@blue: #3bbfce;\n@margin: 16px;\n\n.content-navigation {\n  border-color: @blue;\n  color:\n    darken(@blue, 9%);\n}\n\n.border {\n  padding: @margin / 2;\n  margin: @margin / 2;\n  border-color: @blue;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Lex/zend_ini_scanner.l",
    "content": "/*\n   +----------------------------------------------------------------------+\n   | Zend Engine                                                          |\n   +----------------------------------------------------------------------+\n   | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |\n   +----------------------------------------------------------------------+\n   | This source file is subject to version 2.00 of the Zend license,     |\n   | that is bundled with this package in the file LICENSE, and is        |\n   | available through the world-wide-web at the following url:           |\n   | http://www.zend.com/license/2_00.txt.                                |\n   | If you did not receive a copy of the Zend license and are unable to  |\n   | obtain it through the world-wide-web, please send a note to          |\n   | license@zend.com so we can mail you a copy immediately.              |\n   +----------------------------------------------------------------------+\n   | Authors: Zeev Suraski <zeev@zend.com>                                |\n   |          Jani Taskinen <jani@php.net>                                |\n   |          Marcus Boerger <helly@php.net>                              |\n   |          Nuno Lopes <nlopess@php.net>                                |\n   |          Scott MacVicar <scottmac@php.net>                           |\n   +----------------------------------------------------------------------+\n*/\n\n/* $Id$ */\n\n#include <errno.h>\n#include \"zend.h\"\n#include \"zend_globals.h\"\n#include <zend_ini_parser.h>\n#include \"zend_ini_scanner.h\"\n\n#if 0\n# define YYDEBUG(s, c) printf(\"state: %d char: %c\\n\", s, c)\n#else\n# define YYDEBUG(s, c)\n#endif\n\n#include \"zend_ini_scanner_defs.h\"\n\n#define YYCTYPE   unsigned char\n/* allow the scanner to read one null byte after the end of the string (from ZEND_MMAP_AHEAD)\n * so that if will be able to terminate to match the current token (e.g. non-enclosed string) */\n#define YYFILL(n) { if (YYCURSOR > YYLIMIT) return 0; }\n#define YYCURSOR  SCNG(yy_cursor)\n#define YYLIMIT   SCNG(yy_limit)\n#define YYMARKER  SCNG(yy_marker)\n\n#define YYGETCONDITION()  SCNG(yy_state)\n#define YYSETCONDITION(s) SCNG(yy_state) = s\n\n#define STATE(name)  yyc##name\n\n/* emulate flex constructs */\n#define BEGIN(state) YYSETCONDITION(STATE(state))\n#define YYSTATE      YYGETCONDITION()\n#define yytext       ((char*)SCNG(yy_text))\n#define yyleng       SCNG(yy_leng)\n#define yyless(x)    do {\tYYCURSOR = (unsigned char*)yytext + x; \\\n\t\t\t\t\t\t\tyyleng   = (unsigned int)x; } while(0)\n\n/* #define yymore()     goto yymore_restart */\n\n/* perform sanity check. If this message is triggered you should\n   increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */\n/*!max:re2c */\n#if ZEND_MMAP_AHEAD < (YYMAXFILL + 1)\n# error ZEND_MMAP_AHEAD should be greater than YYMAXFILL\n#endif\n\n\n/* How it works (for the core ini directives):\n * ===========================================\n *\n * 1. Scanner scans file for tokens and passes them to parser.\n * 2. Parser parses the tokens and passes the name/value pairs to the callback\n *    function which stores them in the configuration hash table.\n * 3. Later REGISTER_INI_ENTRIES() is called which triggers the actual\n *    registering of ini entries and uses zend_get_configuration_directive()\n *    to fetch the previously stored name/value pair from configuration hash table\n *    and registers the static ini entries which match the name to the value\n *    into EG(ini_directives) hash table.\n * 4. PATH section entries are used per-request from down to top, each overriding\n *    previous if one exists. zend_alter_ini_entry() is called for each entry.\n *    Settings in PATH section are ZEND_INI_SYSTEM accessible and thus mimics the\n *    php_admin_* directives used within Apache httpd.conf when PHP is compiled as\n *    module for Apache.\n * 5. User defined ini files (like .htaccess for apache) are parsed for each request and\n *    stored in separate hash defined by SAPI.\n */\n\n/* TODO: (ordered by importance :-)\n * ===============================================================================\n *\n *  - Separate constant lookup totally from plain strings (using CONSTANT pattern)\n *  - Add #if .. #else .. #endif and ==, !=, <, > , <=, >= operators\n *  - Add #include \"some.ini\"\n *  - Allow variables to refer to options also when using parse_ini_file()\n *\n */\n\n/* Globals Macros */\n#define SCNG\tINI_SCNG\n#ifdef ZTS\nZEND_API ts_rsrc_id ini_scanner_globals_id;\n#else\nZEND_API zend_ini_scanner_globals ini_scanner_globals;\n#endif\n\n/* Eat leading whitespace */\n#define EAT_LEADING_WHITESPACE()                     \\\n\twhile (yytext[0]) {                              \\\n\t\tif (yytext[0] == ' ' || yytext[0] == '\\t') { \\\n\t\t\tSCNG(yy_text)++;                         \\\n\t\t\tyyleng--;                                \\\n\t\t} else {                                     \\\n\t\t\tbreak;                                   \\\n\t\t}                                            \\\n\t}\n\n/* Eat trailing whitespace + extra char */\n#define EAT_TRAILING_WHITESPACE_EX(ch)              \\\n\twhile (yyleng > 0 && (                          \\\n\t\t(ch != 'X' && yytext[yyleng - 1] ==  ch) || \\\n\t\tyytext[yyleng - 1] == '\\n' ||               \\\n\t\tyytext[yyleng - 1] == '\\r' ||               \\\n\t\tyytext[yyleng - 1] == '\\t' ||               \\\n\t\tyytext[yyleng - 1] == ' ')                  \\\n\t) {                                             \\\n\t\tyyleng--;                                   \\\n\t}\n\n/* Eat trailing whitespace */\n#define EAT_TRAILING_WHITESPACE()\tEAT_TRAILING_WHITESPACE_EX('X')\n\n#define zend_ini_copy_value(retval, str, len) {  \\\n\tZ_STRVAL_P(retval) = zend_strndup(str, len); \\\n\tZ_STRLEN_P(retval) = len;                    \\\n\tZ_TYPE_P(retval) = IS_STRING;                \\\n}\n\n#define RETURN_TOKEN(type, str, len) {           \\\n\tzend_ini_copy_value(ini_lval, str, len);     \\\n\treturn type;                                 \\\n}\n\nstatic void _yy_push_state(int new_state TSRMLS_DC)\n{\n\tzend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));\n\tYYSETCONDITION(new_state);\n}\n\n#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm)\n\nstatic void yy_pop_state(TSRMLS_D)\n{\n\tint *stack_state;\n\tzend_stack_top(&SCNG(state_stack), (void **) &stack_state);\n\tYYSETCONDITION(*stack_state);\n\tzend_stack_del_top(&SCNG(state_stack));\n}\n\nstatic void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC)\n{\n\tYYCURSOR = (YYCTYPE*)str;\n\tSCNG(yy_start) = YYCURSOR;\n\tYYLIMIT  = YYCURSOR + len;\n}\n\n#define ini_filename SCNG(filename)\n\n/* {{{ init_ini_scanner()\n*/\nstatic int init_ini_scanner(int scanner_mode, zend_file_handle *fh TSRMLS_DC)\n{\n\t/* Sanity check */\n\tif (scanner_mode != ZEND_INI_SCANNER_NORMAL && scanner_mode != ZEND_INI_SCANNER_RAW) {\n\t\tzend_error(E_WARNING, \"Invalid scanner mode\");\n\t\treturn FAILURE;\n\t}\n\n\tSCNG(lineno) = 1;\n\tSCNG(scanner_mode) = scanner_mode;\n\tSCNG(yy_in) = fh;\n\n\tif (fh != NULL) {\n\t\tini_filename = zend_strndup(fh->filename, strlen(fh->filename));\n\t} else {\n\t\tini_filename = NULL;\n\t}\n\n\tzend_stack_init(&SCNG(state_stack));\n\tBEGIN(INITIAL);\n\n\treturn SUCCESS;\n}\n/* }}} */\n\n/* {{{ shutdown_ini_scanner()\n*/\nvoid shutdown_ini_scanner(TSRMLS_D)\n{\n\tzend_stack_destroy(&SCNG(state_stack));\n\tif (ini_filename) {\n\t\tfree(ini_filename);\n\t}\n}\n/* }}} */\n\n/* {{{ zend_ini_scanner_get_lineno()\n*/\nint zend_ini_scanner_get_lineno(TSRMLS_D)\n{\n\treturn SCNG(lineno);\n}\n/* }}} */\n\n/* {{{ zend_ini_scanner_get_filename()\n*/\nchar *zend_ini_scanner_get_filename(TSRMLS_D)\n{\n\treturn ini_filename ? ini_filename : \"Unknown\";\n}\n/* }}} */\n\n/* {{{ zend_ini_open_file_for_scanning()\n*/\nint zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC)\n{\n\tchar *buf;\n\tsize_t size;\n\n\tif (zend_stream_fixup(fh, &buf, &size TSRMLS_CC) == FAILURE) {\n\t\treturn FAILURE;\n\t}\n\n\tif (init_ini_scanner(scanner_mode, fh TSRMLS_CC) == FAILURE) {\n\t\tzend_file_handle_dtor(fh TSRMLS_CC);\n\t\treturn FAILURE;\n\t}\n\n\tyy_scan_buffer(buf, size TSRMLS_CC);\n\n\treturn SUCCESS;\n}\n/* }}} */\n\n/* {{{ zend_ini_prepare_string_for_scanning()\n*/\nint zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC)\n{\n\tint len = strlen(str);\n\n\tif (init_ini_scanner(scanner_mode, NULL TSRMLS_CC) == FAILURE) {\n\t\treturn FAILURE;\n\t}\n\n\tyy_scan_buffer(str, len TSRMLS_CC);\n\n\treturn SUCCESS;\n}\n/* }}} */\n\n/* {{{ zend_ini_escape_string()\n */\nstatic void zend_ini_escape_string(zval *lval, char *str, int len, char quote_type TSRMLS_DC)\n{\n\tregister char *s, *t;\n\tchar *end;\n\n\tzend_ini_copy_value(lval, str, len);\n\n\t/* convert escape sequences */\n\ts = t = Z_STRVAL_P(lval);\n\tend = s + Z_STRLEN_P(lval);\n\n\twhile (s < end) {\n\t\tif (*s == '\\\\') {\n\t\t\ts++;\n\t\t\tif (s >= end) {\n\t\t\t\t*t++ = '\\\\';\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tswitch (*s) {\n\t\t\t\tcase '\"':\n\t\t\t\t\tif (*s != quote_type) {\n\t\t\t\t\t\t*t++ = '\\\\';\n\t\t\t\t\t\t*t++ = *s;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase '\\\\':\n\t\t\t\tcase '$':\n\t\t\t\t\t*t++ = *s;\n\t\t\t\t\tZ_STRLEN_P(lval)--;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t*t++ = '\\\\';\n\t\t\t\t\t*t++ = *s;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\t*t++ = *s;\n\t\t}\n\t\tif (*s == '\\n' || (*s == '\\r' && (*(s+1) != '\\n'))) {\n\t\t\tSCNG(lineno)++;\n\t\t}\n\t\ts++;\n\t}\n\t*t = 0;\n}\n/* }}} */\n\nint ini_lex(zval *ini_lval TSRMLS_DC)\n{\nrestart:\n\tSCNG(yy_text) = YYCURSOR;\n\n/* yymore_restart: */\n\t/* detect EOF */\n\tif (YYCURSOR >= YYLIMIT) {\n\t\tif (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) {\n\t\t\tBEGIN(INITIAL);\n\t\t\treturn END_OF_LINE;\n\t\t}\n\t\treturn 0;\n\t}\n\n\t/* Eat any UTF-8 BOM we find in the first 3 bytes */\n\tif (YYCURSOR == SCNG(yy_start) && YYCURSOR + 3 < YYLIMIT) {\n\t\tif (memcmp(YYCURSOR, \"\\xef\\xbb\\xbf\", 3) == 0) {\n\t\t\tYYCURSOR += 3;\n\t\t\tgoto restart;\n\t\t}\n\t}\n/*!re2c\nre2c:yyfill:check = 0;\nLNUM [0-9]+\nDNUM ([0-9]*[\\.][0-9]+)|([0-9]+[\\.][0-9]*)\nNUMBER [-]?{LNUM}|{DNUM}\nANY_CHAR (.|[\\n\\t])\nNEWLINE\t(\"\\r\"|\"\\n\"|\"\\r\\n\")\nTABS_AND_SPACES [ \\t]\nWHITESPACE [ \\t]+\nCONSTANT [a-zA-Z_][a-zA-Z0-9_]*\nLABEL [^=\\n\\r\\t;|&$~(){}!\"\\[]+\nTOKENS [:,.\\[\\]\"'()|^&+-/*=%$!~<>?@{}]\nOPERATORS [&|~()!]\nDOLLAR_CURLY \"${\"\n\nSECTION_RAW_CHARS [^\\]\\n\\r]\nSINGLE_QUOTED_CHARS [^']\nRAW_VALUE_CHARS [^\"\\n\\r;\\000]\n\nLITERAL_DOLLAR (\"$\"([^{\\000]|(\"\\\\\"{ANY_CHAR})))\nVALUE_CHARS         ([^$= \\t\\n\\r;&|~()!\"'\\000]|{LITERAL_DOLLAR})\nSECTION_VALUE_CHARS ([^$\\n\\r;\"'\\]\\\\]|(\"\\\\\"{ANY_CHAR})|{LITERAL_DOLLAR})\n\n<!*> := yyleng = YYCURSOR - SCNG(yy_text);\n\n<INITIAL>\"[\" { /* Section start */\n\t/* Enter section data lookup state */\n\tif (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {\n\t\tyy_push_state(ST_SECTION_RAW TSRMLS_CC);\n\t} else {\n\t\tyy_push_state(ST_SECTION_VALUE TSRMLS_CC);\n\t}\n\treturn TC_SECTION;\n}\n\n<ST_VALUE,ST_SECTION_VALUE,ST_OFFSET>\"'\"{SINGLE_QUOTED_CHARS}+\"'\" { /* Raw string */\n\t/* Eat leading and trailing single quotes */\n\tif (yytext[0] == '\\'' && yytext[yyleng - 1] == '\\'') {\n\t\tSCNG(yy_text)++;\n\t\tyyleng = yyleng - 2;\n\t}\n\tRETURN_TOKEN(TC_RAW, yytext, yyleng);\n}\n\n<ST_SECTION_RAW,ST_SECTION_VALUE>\"]\"{TABS_AND_SPACES}*{NEWLINE}? { /* End of section */\n\tBEGIN(INITIAL);\n\tSCNG(lineno)++;\n\treturn ']';\n}\n\n<INITIAL>{LABEL}\"[\"{TABS_AND_SPACES}* { /* Start of option with offset */\n\t/* Eat leading whitespace */\n\tEAT_LEADING_WHITESPACE();\n\t\n\t/* Eat trailing whitespace and [ */\n\tEAT_TRAILING_WHITESPACE_EX('[');\n\n\t/* Enter offset lookup state */\n\tyy_push_state(ST_OFFSET TSRMLS_CC);\n\n\tRETURN_TOKEN(TC_OFFSET, yytext, yyleng);\n}\n\n<ST_OFFSET>{TABS_AND_SPACES}*\"]\" { /* End of section or an option offset */\n\tBEGIN(INITIAL);\n\treturn ']';\n}\n\n<ST_DOUBLE_QUOTES,ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{DOLLAR_CURLY} { /* Variable start */\n\tyy_push_state(ST_VARNAME TSRMLS_CC);\n\treturn TC_DOLLAR_CURLY;\n}\n\n<ST_VARNAME>{LABEL} { /* Variable name */\n\t/* Eat leading whitespace */\n\tEAT_LEADING_WHITESPACE();\n\n\t/* Eat trailing whitespace */\n\tEAT_TRAILING_WHITESPACE();\n\n\tRETURN_TOKEN(TC_VARNAME, yytext, yyleng);\n}\n\n<ST_VARNAME>\"}\" { /* Variable end */\n\tyy_pop_state(TSRMLS_C);\n\treturn '}';\n}\n\n<INITIAL,ST_VALUE>(\"true\"|\"on\"|\"yes\"){TABS_AND_SPACES}* { /* TRUE value (when used outside option value/offset this causes parse error!) */\n\tRETURN_TOKEN(BOOL_TRUE, \"1\", 1);\n}\n\n<INITIAL,ST_VALUE>(\"false\"|\"off\"|\"no\"|\"none\"|\"null\"){TABS_AND_SPACES}* { /* FALSE value (when used outside option value/offset this causes parse error!)*/\n\tRETURN_TOKEN(BOOL_FALSE, \"\", 0);\n}\n\n<INITIAL>{LABEL} { /* Get option name */\n\t/* Eat leading whitespace */\n\tEAT_LEADING_WHITESPACE();\n\n\t/* Eat trailing whitespace */\n\tEAT_TRAILING_WHITESPACE();\n\n\tRETURN_TOKEN(TC_LABEL, yytext, yyleng);\n}\n\n<INITIAL>{TABS_AND_SPACES}*[=]{TABS_AND_SPACES}* { /* Start option value */\n\tif (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {\n\t\tyy_push_state(ST_RAW TSRMLS_CC);\n\t} else {\n\t\tyy_push_state(ST_VALUE TSRMLS_CC);\n\t}\n\treturn '=';\n}\n\n<ST_RAW>[\"] {\n\twhile (YYCURSOR < YYLIMIT) {\n\t\tswitch (*YYCURSOR++) {\n\t\t\tcase '\\n':\n\t\t\t\tSCNG(lineno)++;\n\t\t\t\tbreak;\n\t\t\tcase '\\r':\n\t\t\t\tif (*YYCURSOR != '\\n') {\n\t\t\t\t\tSCNG(lineno)++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '\"':\n\t\t\t\tyyleng = YYCURSOR - SCNG(yy_text) - 2;\n\t\t\t\tSCNG(yy_text)++;\n\t\t\t\tRETURN_TOKEN(TC_RAW, yytext, yyleng);\n\t\t\tcase '\\\\':\n\t\t\t\tif (YYCURSOR < YYLIMIT) {\n\t\t\t\t\tYYCURSOR++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tyyleng = YYCURSOR - SCNG(yy_text);\n\tRETURN_TOKEN(TC_RAW, yytext, yyleng);\n}\n\n<ST_RAW>{RAW_VALUE_CHARS}+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */\n\tRETURN_TOKEN(TC_RAW, yytext, yyleng);\n}\n\n<ST_SECTION_RAW>{SECTION_RAW_CHARS}+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */\n\tRETURN_TOKEN(TC_RAW, yytext, yyleng);\n}\n\n<ST_VALUE,ST_RAW>{TABS_AND_SPACES}*{NEWLINE} { /* End of option value */\n\tBEGIN(INITIAL);\n\tSCNG(lineno)++;\n\treturn END_OF_LINE;\n}\n\n<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{CONSTANT} { /* Get constant option value */\n\tRETURN_TOKEN(TC_CONSTANT, yytext, yyleng);\n}\n\n<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{NUMBER} { /* Get number option value as string */\n\tRETURN_TOKEN(TC_NUMBER, yytext, yyleng);\n}\n\n<INITIAL>{TOKENS} { /* Disallow these chars outside option values */\n\treturn yytext[0];\n}\n\n<ST_VALUE>{OPERATORS}{TABS_AND_SPACES}* { /* Boolean operators */\n\treturn yytext[0];\n}\n\n<ST_VALUE>[=] { /* Make = used in option value to trigger error */\n\tyyless(0);\n\tBEGIN(INITIAL);\n\treturn END_OF_LINE;\n}\n\n<ST_VALUE>{VALUE_CHARS}+ { /* Get everything else as option/offset value */\n\tRETURN_TOKEN(TC_STRING, yytext, yyleng);\n}\n\n<ST_SECTION_VALUE,ST_OFFSET>{SECTION_VALUE_CHARS}+ { /* Get rest as section/offset value */\n\tRETURN_TOKEN(TC_STRING, yytext, yyleng);\n}\n\n<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{TABS_AND_SPACES}*[\"] { /* Double quoted '\"' string start */\n\tyy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC);\n\treturn '\"';\n}\n\n<ST_DOUBLE_QUOTES>[\"]{TABS_AND_SPACES}* { /* Double quoted '\"' string ends */\n\tyy_pop_state(TSRMLS_C);\n\treturn '\"';\n}\n\n<ST_DOUBLE_QUOTES>[^] { /* Escape double quoted string contents */\n\tif (YYCURSOR > YYLIMIT) {\n\t\treturn 0;\n\t}\n\t\n\twhile (YYCURSOR < YYLIMIT) {\n\t\tswitch (*YYCURSOR++) {\n\t\t\tcase '\"':\n\t\t\t\tif (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\\\' && *YYCURSOR != '\\r' && *YYCURSOR != '\\n') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '$':\n\t\t\t\tif (*YYCURSOR == '{') {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\tcase '\\\\':\n\t\t\t\tif (YYCURSOR < YYLIMIT && *YYCURSOR != '\"') {\n\t\t\t\t\tYYCURSOR++;\n\t\t\t\t}\n\t\t\t\t/* fall through */\n\t\t\tdefault:\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tYYCURSOR--;\n\t\tbreak;\n\t}\n\n\tyyleng = YYCURSOR - SCNG(yy_text);\n\t\n\tzend_ini_escape_string(ini_lval, yytext, yyleng, '\"' TSRMLS_CC);\n\treturn TC_QUOTED_STRING;\n}\n\n<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{WHITESPACE} {\n\tRETURN_TOKEN(TC_WHITESPACE, yytext, yyleng);\n}\n\n<INITIAL,ST_RAW>{TABS_AND_SPACES}+ {\n\t/* eat whitespace */\n\tgoto restart;\n}\n\n<INITIAL>{TABS_AND_SPACES}*{NEWLINE} {\n\tSCNG(lineno)++;\n\treturn END_OF_LINE;\n}\n\n<INITIAL,ST_VALUE,ST_RAW>{TABS_AND_SPACES}*[;][^\\r\\n]*{NEWLINE} { /* Comment */\n\tBEGIN(INITIAL);\n\tSCNG(lineno)++;\n\treturn END_OF_LINE;\n}\n\n<INITIAL>{TABS_AND_SPACES}*[#][^\\r\\n]*{NEWLINE} { /* #Comment */\n\tzend_error(E_DEPRECATED, \"Comments starting with '#' are deprecated in %s on line %d\", zend_ini_scanner_get_filename(TSRMLS_C), SCNG(lineno));\n\tBEGIN(INITIAL);\n\tSCNG(lineno)++;\n\treturn END_OF_LINE;\n}\n\n<ST_VALUE,ST_RAW>[^] { /* End of option value (if EOF is reached before EOL */\n\tBEGIN(INITIAL);\n\treturn END_OF_LINE;\n}\n\n<*>[^] {\n\treturn 0;\n}\n\n*/\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Limbo/cat.b",
    "content": "implement Cat;\n\ninclude \"sys.m\";\n\tsys: Sys;\n\ninclude \"draw.m\";\n\nCat: module\n{\n\tinit:\tfn(ctxt: ref Draw->Context, argv: list of string);\n};\n\nstdout: ref Sys->FD;\n\ninit(nil: ref Draw->Context, args: list of string)\n{\n\tsys = load Sys Sys->PATH;\n\tstdout = sys->fildes(1);\n\targs = tl args;\n\tif(args == nil)\n\t\targs = \"-\" :: nil;\n\tfor(; args != nil; args = tl args){\n\t\tfile := hd args;\n\t\tif(file != \"-\"){\n\t\t\tfd := sys->open(file, Sys->OREAD);\n\t\t\tif(fd == nil){\n\t\t\t\tsys->fprint(sys->fildes(2), \"cat: cannot open %s: %r\\n\", file);\n\t\t\t\traise \"fail:bad open\";\n\t\t\t}\n\t\t\tcat(fd, file);\n\t\t}else\n\t\t\tcat(sys->fildes(0), \"<stdin>\");\n\t}\n}\n\ncat(fd: ref Sys->FD, file: string)\n{\n\tbuf := array[Sys->ATOMICIO] of byte;\n\twhile((n := sys->read(fd, buf, len buf)) > 0)\n\t\tif(sys->write(stdout, buf, n) < n) {\n\t\t\tsys->fprint(sys->fildes(2), \"cat: write error: %r\\n\");\n\t\t\traise \"fail:write error\";\n\t\t}\n\tif(n < 0) {\n\t\tsys->fprint(sys->fildes(2), \"cat: error reading %s: %r\\n\", file);\n\t\traise \"fail:read error\";\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Limbo/lock.b",
    "content": "implement Lock;\n\ninclude \"sys.m\";\n\tsys:\tSys;\ninclude \"lock.m\";\n\nSemaphore.obtain(l: self ref Semaphore)\n{\n\tl.c <-= 0;\n}\n\nSemaphore.release(l: self ref Semaphore)\n{\n\t<-l.c;\n}\n\nSemaphore.new(): ref Semaphore\n{\n\tl := ref Semaphore;\n\tl.c = chan[1] of int;\n\treturn l;\n}\n\ninit()\n{\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Limbo/lock.m",
    "content": "Lock: module\n{\n\tPATH:\tcon \"/dis/lib/lock.dis\";\n\n\tSemaphore: adt {\n\t\tc: chan of int;\n\t\tobtain:\tfn(nil: self ref Semaphore);\n\t\trelease: fn(nil: self ref Semaphore);\n\t\tnew: fn(): ref Semaphore;\n\t};\n\t\n\tinit: fn();\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/Linker Script/filenames/ld.script",
    "content": "/*\n * ld.script for compressed kernel support of MIPS\n *\n * Copyright (C) 2009 Lemote Inc.\n * Author: Wu Zhangjin <wuzhanjing@gmail.com>\n * Copyright (C) 2010 \"Wu Zhangjin\" <wuzhanjing@gmail.com>\n */\n\nOUTPUT_ARCH(mips)\nENTRY(start)\nSECTIONS\n{\n\t/* Text and read-only data */\n\t/* . = VMLINUZ_LOAD_ADDRESS; */\n\t.text : {\n\t\t*(.text)\n\t\t*(.rodata)\n\t}\n\t/* End of text section */\n\n\t/* Writable data */\n\t.data : {\n\t\t*(.data)\n\t\t/* Put the compressed image here */\n\t\t__image_begin = .;\n\t\t*(.image)\n\t\t__image_end = .;\n\t\tCONSTRUCTORS\n\t}\n\t. = ALIGN(16);\n\t_edata = .;\n\t/* End of data section */\n\n\t/* BSS */\n\t.bss : {\n\t\t*(.bss)\n\t}\n\t. = ALIGN(16);\n\t_end = .;\n\n\t/* Sections to be discarded */\n\t/DISCARD/ : {\n\t\t*(.MIPS.options)\n\t\t*(.options)\n\t\t*(.pdr)\n\t\t*(.reginfo)\n\t\t*(.comment)\n\t\t*(.note)\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Linker Script/inject.x",
    "content": "/* OUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-bigarm\", \"elf32-littlearm\") */\n/* OUTPUT_ARCH(arm) */\nENTRY(__adbi$entry)\nSECTIONS\n{\n    . = 0x00000000 + SIZEOF_HEADERS;\n   \n    .adbi : { \n      *(.rodata) \n      *(.rodata.*) \n      *(.data) *(.data.*)\n      *(.bss) *(.bss.*)\n      *(.text) \n      *(.text.*)\n      *(.adbi)\n      *(.adbi.*)\n    } = 0\n    \n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Linker Script/link.ld",
    "content": "/*\n*  link.ld\n*/\nOUTPUT_FORMAT(elf32-i386)\nENTRY(start)\nSECTIONS\n {\n   . = 0x100000;\n   .text : { *(.text) }\n   .data : { *(.data) }\n   .bss  : { *(.bss)  }\n }"
  },
  {
    "path": "src/test/resources/samples/langs/Linker Script/vmlinux.lds",
    "content": "/*\n * ld script for the x86 kernel\n *\n * Historic 32-bit version written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>\n *\n * Modernisation, unification and other changes and fixes:\n *   Copyright (C) 2007-2009  Sam Ravnborg <sam@ravnborg.org>\n *\n *\n * Don't define absolute symbols until and unless you know that symbol\n * value is should remain constant even if kernel image is relocated\n * at run time. Absolute symbols are not relocated. If symbol value should\n * change if kernel is relocated, make the symbol section relative and\n * put it inside the section definition.\n */\n\n#ifdef CONFIG_X86_32\n#define LOAD_OFFSET __PAGE_OFFSET\n#else\n#define LOAD_OFFSET __START_KERNEL_map\n#endif\n\n#include <asm-generic/vmlinux.lds.h>\n#include <asm/asm-offsets.h>\n#include <asm/thread_info.h>\n#include <asm/page_types.h>\n#include <asm/cache.h>\n#include <asm/boot.h>\n\n#undef i386     /* in case the preprocessor is a 32bit one */\n\nOUTPUT_FORMAT(CONFIG_OUTPUT_FORMAT, CONFIG_OUTPUT_FORMAT, CONFIG_OUTPUT_FORMAT)\n\n#ifdef CONFIG_X86_32\nOUTPUT_ARCH(i386)\nENTRY(phys_startup_32)\njiffies = jiffies_64;\n#else\nOUTPUT_ARCH(i386:x86-64)\nENTRY(phys_startup_64)\njiffies_64 = jiffies;\n#endif\n\n#if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA)\n/*\n * On 64-bit, align RODATA to 2MB so that even with CONFIG_DEBUG_RODATA\n * we retain large page mappings for boundaries spanning kernel text, rodata\n * and data sections.\n *\n * However, kernel identity mappings will have different RWX permissions\n * to the pages mapping to text and to the pages padding (which are freed) the\n * text section. Hence kernel identity mappings will be broken to smaller\n * pages. For 64-bit, kernel text and kernel identity mappings are different,\n * so we can enable protection checks that come with CONFIG_DEBUG_RODATA,\n * as well as retain 2MB large page mappings for kernel text.\n */\n#define X64_ALIGN_DEBUG_RODATA_BEGIN\t. = ALIGN(HPAGE_SIZE);\n\n#define X64_ALIGN_DEBUG_RODATA_END\t\t\t\t\\\n\t\t. = ALIGN(HPAGE_SIZE);\t\t\t\t\\\n\t\t__end_rodata_hpage_align = .;\n\n#else\n\n#define X64_ALIGN_DEBUG_RODATA_BEGIN\n#define X64_ALIGN_DEBUG_RODATA_END\n\n#endif\n\nPHDRS {\n\ttext PT_LOAD FLAGS(5);          /* R_E */\n\tdata PT_LOAD FLAGS(6);          /* RW_ */\n#ifdef CONFIG_X86_64\n#ifdef CONFIG_SMP\n\tpercpu PT_LOAD FLAGS(6);        /* RW_ */\n#endif\n\tinit PT_LOAD FLAGS(7);          /* RWE */\n#endif\n\tnote PT_NOTE FLAGS(0);          /* ___ */\n}\n\nSECTIONS\n{\n#ifdef CONFIG_X86_32\n        . = LOAD_OFFSET + LOAD_PHYSICAL_ADDR;\n        phys_startup_32 = startup_32 - LOAD_OFFSET;\n#else\n        . = __START_KERNEL;\n        phys_startup_64 = startup_64 - LOAD_OFFSET;\n#endif\n\n\t/* Text and read-only data */\n\t.text :  AT(ADDR(.text) - LOAD_OFFSET) {\n\t\t_text = .;\n\t\t/* bootstrapping code */\n\t\tHEAD_TEXT\n\t\t. = ALIGN(8);\n\t\t_stext = .;\n\t\tTEXT_TEXT\n\t\tSCHED_TEXT\n\t\tLOCK_TEXT\n\t\tKPROBES_TEXT\n\t\tENTRY_TEXT\n\t\tIRQENTRY_TEXT\n\t\t*(.fixup)\n\t\t*(.gnu.warning)\n\t\t/* End of text section */\n\t\t_etext = .;\n\t} :text = 0x9090\n\n\tNOTES :text :note\n\n\tEXCEPTION_TABLE(16) :text = 0x9090\n\n#if defined(CONFIG_DEBUG_RODATA)\n\t/* .text should occupy whole number of pages */\n\t. = ALIGN(PAGE_SIZE);\n#endif\n\tX64_ALIGN_DEBUG_RODATA_BEGIN\n\tRO_DATA(PAGE_SIZE)\n\tX64_ALIGN_DEBUG_RODATA_END\n\n\t/* Data */\n\t.data : AT(ADDR(.data) - LOAD_OFFSET) {\n\t\t/* Start of data section */\n\t\t_sdata = .;\n\n\t\t/* init_task */\n\t\tINIT_TASK_DATA(THREAD_SIZE)\n\n#ifdef CONFIG_X86_32\n\t\t/* 32 bit has nosave before _edata */\n\t\tNOSAVE_DATA\n#endif\n\n\t\tPAGE_ALIGNED_DATA(PAGE_SIZE)\n\n\t\tCACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)\n\n\t\tDATA_DATA\n\t\tCONSTRUCTORS\n\n\t\t/* rarely changed data like cpu maps */\n\t\tREAD_MOSTLY_DATA(INTERNODE_CACHE_BYTES)\n\n\t\t/* End of data section */\n\t\t_edata = .;\n\t} :data\n\n\n\t. = ALIGN(PAGE_SIZE);\n\t__vvar_page = .;\n\n\t.vvar : AT(ADDR(.vvar) - LOAD_OFFSET) {\n\t\t/* work around gold bug 13023 */\n\t\t__vvar_beginning_hack = .;\n\n\t\t/* Place all vvars at the offsets in asm/vvar.h. */\n#define EMIT_VVAR(name, offset) \t\t\t\\\n\t\t. = __vvar_beginning_hack + offset;\t\\\n\t\t*(.vvar_ ## name)\n#define __VVAR_KERNEL_LDS\n#include <asm/vvar.h>\n#undef __VVAR_KERNEL_LDS\n#undef EMIT_VVAR\n\n\t\t/*\n\t\t * Pad the rest of the page with zeros.  Otherwise the loader\n\t\t * can leave garbage here.\n\t\t */\n\t\t. = __vvar_beginning_hack + PAGE_SIZE;\n\t} :data\n\n       . = ALIGN(__vvar_page + PAGE_SIZE, PAGE_SIZE);\n\n\t/* Init code and data - will be freed after init */\n\t. = ALIGN(PAGE_SIZE);\n\t.init.begin : AT(ADDR(.init.begin) - LOAD_OFFSET) {\n\t\t__init_begin = .; /* paired with __init_end */\n\t}\n\n#if defined(CONFIG_X86_64) && defined(CONFIG_SMP)\n\t/*\n\t * percpu offsets are zero-based on SMP.  PERCPU_VADDR() changes the\n\t * output PHDR, so the next output section - .init.text - should\n\t * start another segment - init.\n\t */\n\tPERCPU_VADDR(INTERNODE_CACHE_BYTES, 0, :percpu)\n\tASSERT(SIZEOF(.data..percpu) < CONFIG_PHYSICAL_START,\n\t       \"per-CPU data too large - increase CONFIG_PHYSICAL_START\")\n#endif\n\n\tINIT_TEXT_SECTION(PAGE_SIZE)\n#ifdef CONFIG_X86_64\n\t:init\n#endif\n\n\tINIT_DATA_SECTION(16)\n\n\t.x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) {\n\t\t__x86_cpu_dev_start = .;\n\t\t*(.x86_cpu_dev.init)\n\t\t__x86_cpu_dev_end = .;\n\t}\n\n#ifdef CONFIG_X86_INTEL_MID\n\t.x86_intel_mid_dev.init : AT(ADDR(.x86_intel_mid_dev.init) - \\\n\t\t\t\t\t\t\t\tLOAD_OFFSET) {\n\t\t__x86_intel_mid_dev_start = .;\n\t\t*(.x86_intel_mid_dev.init)\n\t\t__x86_intel_mid_dev_end = .;\n\t}\n#endif\n\n\t/*\n\t * start address and size of operations which during runtime\n\t * can be patched with virtualization friendly instructions or\n\t * baremetal native ones. Think page table operations.\n\t * Details in paravirt_types.h\n\t */\n\t. = ALIGN(8);\n\t.parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) {\n\t\t__parainstructions = .;\n\t\t*(.parainstructions)\n\t\t__parainstructions_end = .;\n\t}\n\n\t/*\n\t * struct alt_inst entries. From the header (alternative.h):\n\t * \"Alternative instructions for different CPU types or capabilities\"\n\t * Think locking instructions on spinlocks.\n\t */\n\t. = ALIGN(8);\n\t.altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {\n\t\t__alt_instructions = .;\n\t\t*(.altinstructions)\n\t\t__alt_instructions_end = .;\n\t}\n\n\t/*\n\t * And here are the replacement instructions. The linker sticks\n\t * them as binary blobs. The .altinstructions has enough data to\n\t * get the address and the length of them to patch the kernel safely.\n\t */\n\t.altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {\n\t\t*(.altinstr_replacement)\n\t}\n\n\t/*\n\t * struct iommu_table_entry entries are injected in this section.\n\t * It is an array of IOMMUs which during run time gets sorted depending\n\t * on its dependency order. After rootfs_initcall is complete\n\t * this section can be safely removed.\n\t */\n\t.iommu_table : AT(ADDR(.iommu_table) - LOAD_OFFSET) {\n\t\t__iommu_table = .;\n\t\t*(.iommu_table)\n\t\t__iommu_table_end = .;\n\t}\n\n\t. = ALIGN(8);\n\t.apicdrivers : AT(ADDR(.apicdrivers) - LOAD_OFFSET) {\n\t\t__apicdrivers = .;\n\t\t*(.apicdrivers);\n\t\t__apicdrivers_end = .;\n\t}\n\n\t. = ALIGN(8);\n\t/*\n\t * .exit.text is discard at runtime, not link time, to deal with\n\t *  references from .altinstructions and .eh_frame\n\t */\n\t.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {\n\t\tEXIT_TEXT\n\t}\n\n\t.exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) {\n\t\tEXIT_DATA\n\t}\n\n#if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP)\n\tPERCPU_SECTION(INTERNODE_CACHE_BYTES)\n#endif\n\n\t. = ALIGN(PAGE_SIZE);\n\n\t/* freed after init ends here */\n\t.init.end : AT(ADDR(.init.end) - LOAD_OFFSET) {\n\t\t__init_end = .;\n\t}\n\n\t/*\n\t * smp_locks might be freed after init\n\t * start/end must be page aligned\n\t */\n\t. = ALIGN(PAGE_SIZE);\n\t.smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {\n\t\t__smp_locks = .;\n\t\t*(.smp_locks)\n\t\t. = ALIGN(PAGE_SIZE);\n\t\t__smp_locks_end = .;\n\t}\n\n#ifdef CONFIG_X86_64\n\t.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {\n\t\tNOSAVE_DATA\n\t}\n#endif\n\n\t/* BSS */\n\t. = ALIGN(PAGE_SIZE);\n\t.bss : AT(ADDR(.bss) - LOAD_OFFSET) {\n\t\t__bss_start = .;\n\t\t*(.bss..page_aligned)\n\t\t*(.bss)\n\t\t. = ALIGN(PAGE_SIZE);\n\t\t__bss_stop = .;\n\t}\n\n\t. = ALIGN(PAGE_SIZE);\n\t.brk : AT(ADDR(.brk) - LOAD_OFFSET) {\n\t\t__brk_base = .;\n\t\t. += 64 * 1024;\t\t/* 64k alignment slop space */\n\t\t*(.brk_reservation)\t/* areas brk users have reserved */\n\t\t__brk_limit = .;\n\t}\n\n\t_end = .;\n\n        STABS_DEBUG\n        DWARF_DEBUG\n\n\t/* Sections to be discarded */\n\tDISCARDS\n\t/DISCARD/ : { *(.eh_frame) }\n}\n\n\n#ifdef CONFIG_X86_32\n/*\n * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility:\n */\n. = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE),\n\t   \"kernel image bigger than KERNEL_IMAGE_SIZE\");\n#else\n/*\n * Per-cpu symbols which need to be offset from __per_cpu_load\n * for the boot processor.\n */\n#define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load\nINIT_PER_CPU(gdt_page);\nINIT_PER_CPU(irq_stack_union);\n\n/*\n * Build-time check on the image size:\n */\n. = ASSERT((_end - _text <= KERNEL_IMAGE_SIZE),\n\t   \"kernel image bigger than KERNEL_IMAGE_SIZE\");\n\n#ifdef CONFIG_SMP\n. = ASSERT((irq_stack_union == 0),\n           \"irq_stack_union is not at start of per-cpu area\");\n#endif\n\n#endif /* CONFIG_X86_32 */\n\n#ifdef CONFIG_KEXEC\n#include <asm/kexec.h>\n\n. = ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE,\n           \"kexec control code size is too big\");\n#endif\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Linux Kernel Module/bcm4334x.mod",
    "content": "/data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcm4334x.ko\n/data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_pno.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_common.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_ip.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_custom_gpio.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_linux.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_linux_sched.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_cfg80211.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_linux_wq.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/aiutils.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmevent.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmutils.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmwifi_channels.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/hndpmu.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/linux_osl.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/sbutils.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/siutils.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wl_android.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wl_cfg80211.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wl_cfgp2p.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wl_cfg_btcoex.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wldev_common.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wl_linux_mon.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_linux_platdev.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmsdh.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmsdh_linux.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmsdh_sdmmc.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmsdh_sdmmc_linux.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_cdc.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_wlfc.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_sdio.o\n"
  },
  {
    "path": "src/test/resources/samples/langs/Linux Kernel Module/mbcache.mod",
    "content": "fs/mbcache.ko\nfs/mbcache.o\n"
  },
  {
    "path": "src/test/resources/samples/langs/Linux Kernel Module/md5.mod",
    "content": "crypto/md5.ko\ncrypto/md5.o\n"
  },
  {
    "path": "src/test/resources/samples/langs/Liquid/layout.liquid",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n  <title>{{shop.name}} - {{page_title}}</title>\n\n  {{ 'textile.css'  | global_asset_url | stylesheet_tag }}\n  {{ 'lightbox/v204/lightbox.css' | global_asset_url | stylesheet_tag }}\n\n  {{ 'prototype/1.6/prototype.js' | global_asset_url  | script_tag }}\n  {{ 'scriptaculous/1.8.2/scriptaculous.js' | global_asset_url  | script_tag }}\n  {{ 'lightbox/v204/lightbox.js'  | global_asset_url  | script_tag }}\n  {{ 'option_selection.js'        | shopify_asset_url | script_tag }}\n\n  {{ 'layout.css'   | asset_url | stylesheet_tag }}\n  {{ 'shop.js'      | asset_url | script_tag }}\n\n  {{ content_for_header }}\n</head>\n\n<body id=\"page-{{template}}\">\n\n  <p class=\"hide\"><a href=\"#rightsiders\">Skip to navigation.</a></p>\n    <!-- mini cart -->\n        {% if cart.item_count > 0 %}\n      <div id=\"minicart\" style=\"display:none;\"><div id=\"minicart-inner\">\n      <div id=\"minicart-items\">\n      <h2>There {{ cart.item_count | pluralize: 'is', 'are' }} {{ cart.item_count }} {{ cart.item_count | pluralize: 'item', 'items' }} in <a href=\"/cart\" title=\"View your cart\">your cart</a>!</h2><h4 style=\"font-size: 16px; margin: 0 0 10px 0; padding: 0;\">Your subtotal is {{ cart.total_price | money }}.</h4>\n        {% for item in cart.items %}\n        <div class=\"thumb\">\n          <div class=\"prodimage\"><a href=\"{{item.product.url}}\" onMouseover=\"tooltip('{{ item.quantity }} x {{ item.title }} ({{ item.variant.title }})', 200)\"; onMouseout=\"hidetooltip()\"><img src=\"{{ item.product.featured_image | product_img_url: 'thumb' }}\" /></a></div>\n        </div>\n        {% endfor %}\n        </div>\n       <br style=\"clear:both;\" />\n      </div></div>\n        {% endif %}\n\n  <div id=\"container\">\n    <div id=\"header\">\n      <!-- Begin Header -->\n        <h1 id=\"logo\"><a href=\"/\" title=\"Go Home\">{{shop.name}}</a></h1>\n      <div id=\"cartlinks\">\n        {% if cart.item_count > 0 %}\n          <h2 id=\"cartcount\"><a href=\"/cart\" onMouseover=\"tooltip('There {{ cart.item_count | pluralize: 'is', 'are' }} {{ cart.item_count }} {{ cart.item_count | pluralize: 'item', 'items' }} in your cart!', 200)\"; onMouseout=\"hidetooltip()\">{{ cart.item_count }} {{ cart.item_count | pluralize: 'thing', 'things' }}!</a></h2>\n      <a href=\"/cart\" id=\"minicartswitch\" onclick=\"superSwitch(this, 'minicart', 'Close Mini Cart'); return false;\" id=\"cartswitch\">View Mini Cart ({{ cart.total_price | money }})</a>\n        {% endif %}\n      </div>\n      <!-- End Header -->\n\n    </div>\n  <hr />\n<div id=\"main\">\n\n    <div id=\"content\">\n    <div id=\"innercontent\">\n      {{ content_for_layout }}\n      </div>\n    </div>\n\n  <hr />\n    <div id=\"rightsiders\">\n\n      <ul class=\"rightlinks\">\n        {% for link in linklists.main-menu.links %}\n           <li>{{ link.title | link_to: link.url }}</li>\n        {% endfor %}\n      </ul>\n\n        {% if tags %}\n        <ul class=\"rightlinks\">\n          {% for tag in collection.tags %}\n            <li><span class=\"add-link\">{{ '+' | link_to_add_tag: tag }}</span>{{ tag | highlight_active_tag | link_to_tag: tag }}</li>\n          {% endfor %}\n        </ul>\n        {% endif %}\n\n      <ul class=\"rightlinks\">\n        {% for link in linklists.footer.links %}\n           <li>{{ link.title | link_to: link.url }}</li>\n        {% endfor %}\n      </ul>\n\n    </div>\n\n  <hr /><br style=\"clear:both;\" />\n\n    <div id=\"footer\">\n      <div class=\"footerinner\">\n      All prices are in {{ shop.currency }}.\n      Powered by <a href=\"http://www.shopify.com\" title=\"Shopify, Hosted E-Commerce\">Shopify</a>.\n    </div>\n    </div>\n\n  </div>\n</div>\n\n<div id=\"tooltip\"></div>\n<img id=\"pointer\" src=\"{{ 'arrow2.gif' | asset_url }}\" />\n\n</body>\n</html>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Liquid/template.liquid",
    "content": "<h3>We have wonderful products!</h3>\n<ul id=\"products\">\n  <div id=\"productpage\">\n    <div id=\"productimages\"><div id=\"productimages-top\"><div id=\"productimages-bottom\">\n      {% for image in product.images %}\n        {% if forloop.first %}\n          <a href=\"{{ image | product_img_url: 'large' }}\" class=\"productimage\" rel=\"lightbox\">\n            <img src=\"{{ image | product_img_url: 'medium'}}\" alt=\"{{product.title | escape }}\" />\n          </a>\n        {% else %}\n          <a href=\"{{ image | product_img_url: 'large' }}\" class=\"productimage-small\" rel=\"lightbox\">\n            <img src=\"{{ image | product_img_url: 'small'}}\" alt=\"{{product.title | escape }}\" />\n          </a>\n        {% endif %}\n      {% endfor %}\n    </div></div></div>\n\n    <h2>{{ product.title }}</h2>\n\n    <ul id=\"details\" class=\"hlist\">\n      <li>Vendor: {{ product.vendor | link_to_vendor }}</li>\n      <li>Type: {{ product.type | link_to_type }}</li>\n    </ul>\n\n    <small>{{ product.price_min | money }}{% if product.price_varies %} - {{ product.price_max | money }}{% endif %}</small>\n\n    <div id=\"variant-add\">\n      <form action=\"/cart/add\" method=\"post\">\n\n        <select id=\"variant-select\" name=\"id\" class=\"product-info-options\">\n          {% for variant in product.variants %}\n            <option value=\"{{ variant.id }}\">{{ variant.title }} - {{ variant.price | money }}</option>\n          {% endfor %}\n        </select>\n\n        <div id=\"price-field\" class=\"price\"></div>\n\n      <div style=\"text-align:center;\"><input type=\"image\" name=\"add\" value=\"Add to Cart\" id=\"add\" src=\"{{ 'addtocart.gif' | asset_url }}\" /></div>\n      </form>\n    </div>\n\n    <div class=\"description textile\">\n      {{ product.description }}\n    </div>\n  </div>\n\n  <script type=\"text/javascript\">\n  <!--\n    // prototype callback for multi variants dropdown selector\n    var selectCallback = function(variant, selector) {\n      if (variant && variant.available == true) {\n        // selected a valid variant\n        $('add').removeClassName('disabled'); // remove unavailable class from add-to-cart button\n        $('add').disabled = false;           // reenable add-to-cart button\n        $('price-field').innerHTML = Shopify.formatMoney(variant.price, \"{{shop.money_with_currency_format}}\");  // update price field\n      } else {\n        // variant doesn't exist\n        $('add').addClassName('disabled');      // set add-to-cart button to unavailable class\n        $('add').disabled = true;              // disable add-to-cart button\n        $('price-field').innerHTML = (variant) ? \"Sold Out\" : \"Unavailable\"; // update price-field message\n      }\n    };\n\n    // initialize multi selector for product\n    Event.observe(document, 'dom:loaded', function() {\n      new Shopify.OptionSelectors(\"variant-select\", { product: {{ product | json }}, onVariantSelected: selectCallback });\n    });\n  -->\n  </script>\n</ul>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Literate Agda/NatCat.lagda",
    "content": "\\documentclass{article}\r\n\r\n % The following packages are needed because unicode\r\n % is translated (using the next set of packages) to\r\n % latex commands. You may need more packages if you\r\n % use more unicode characters:\r\n\r\n \\usepackage{amssymb}\r\n \\usepackage{bbm}\r\n \\usepackage[greek,english]{babel}\r\n\r\n % This handles the translation of unicode to latex:\r\n\r\n \\usepackage{ucs}\r\n \\usepackage[utf8x]{inputenc}\r\n \\usepackage{autofe}\r\n\r\n % Some characters that are not automatically defined\r\n % (you figure out by the latex compilation errors you get),\r\n % and you need to define:\r\n\r\n \\DeclareUnicodeCharacter{8988}{\\ensuremath{\\ulcorner}}\r\n \\DeclareUnicodeCharacter{8989}{\\ensuremath{\\urcorner}}\r\n \\DeclareUnicodeCharacter{8803}{\\ensuremath{\\overline{\\equiv}}}\r\n\r\n % Add more as you need them (shouldn’t happen often).\r\n\r\n % Using “\\newenvironment” to redefine verbatim to\r\n % be called “code” doesn’t always work properly. \r\n % You can more reliably use:\r\n\r\n \\usepackage{fancyvrb}\r\n\r\n \\DefineVerbatimEnvironment\r\n   {code}{Verbatim}\r\n   {} % Add fancy options here if you like.\r\n\r\n \\begin{document}\r\n\r\n \\begin{code}\r\nmodule NatCat where\r\n\r\nopen import Relation.Binary.PropositionalEquality\r\n\r\n-- If you can show that a relation only ever has one inhabitant\r\n-- you get the category laws for free\r\nmodule\r\n  EasyCategory\r\n  (obj : Set)\r\n  (_⟶_ : obj → obj → Set)\r\n  (_∘_ : ∀ {x y z} → x ⟶ y → y ⟶ z → x ⟶ z)\r\n  (id : ∀ x → x ⟶ x)\r\n  (single-inhabitant : (x y : obj) (r s : x ⟶ y) → r ≡ s)\r\n  where\r\n\r\n  idʳ : ∀ x y (r : x ⟶ y) → r ∘ id y ≡ r\r\n  idʳ x y r = single-inhabitant x y (r ∘ id y) r \r\n\r\n  idˡ : ∀ x y (r : x ⟶ y) → id x ∘ r ≡ r\r\n  idˡ x y r = single-inhabitant x y (id x ∘ r) r\r\n\r\n  ∘-assoc : ∀ w x y z (r : w ⟶ x) (s : x ⟶ y) (t : y ⟶ z) → (r ∘ s) ∘ t ≡ r ∘ (s ∘ t)\r\n  ∘-assoc w x y z r s t = single-inhabitant w z ((r ∘ s) ∘ t) (r ∘ (s ∘ t))\r\n\r\nopen import Data.Nat\r\n\r\nsame : (x y : ℕ) (r s : x ≤ y) → r ≡ s\r\nsame .0 y z≤n z≤n = refl\r\nsame .(suc m) .(suc n) (s≤s {m} {n} r) (s≤s s) = cong s≤s (same m n r s)\r\n\r\n≤-trans : ∀ x y z → x ≤ y → y ≤ z → x ≤ z\r\n≤-trans .0 y z z≤n s = z≤n\r\n≤-trans .(suc m) .(suc n) .(suc n₁) (s≤s {m} {n} r) (s≤s {.n} {n₁} s) = s≤s (≤-trans m n n₁ r s)\r\n\r\n≤-refl : ∀ x → x ≤ x\r\n≤-refl zero = z≤n\r\n≤-refl (suc x) = s≤s (≤-refl x)\r\n\r\nmodule Nat-EasyCategory = EasyCategory ℕ _≤_ (λ {x}{y}{z} → ≤-trans x y z) ≤-refl same\r\n \\end{code}\r\n\r\n \\end{document} "
  },
  {
    "path": "src/test/resources/samples/langs/Literate CoffeeScript/scope.litcoffee",
    "content": "The **Scope** class regulates lexical scoping within CoffeeScript. As you\ngenerate code, you create a tree of scopes in the same shape as the nested\nfunction bodies. Each scope knows about the variables declared within it,\nand has a reference to its parent enclosing scope. In this way, we know which\nvariables are new and need to be declared with `var`, and which are shared\nwith external scopes.\n\nImport the helpers we plan to use.\n\n    {extend, last} = require './helpers'\n\n    exports.Scope = class Scope\n\nThe `root` is the top-level **Scope** object for a given file.\n\n      @root: null\n\nInitialize a scope with its parent, for lookups up the chain,\nas well as a reference to the **Block** node it belongs to, which is\nwhere it should declare its variables, and a reference to the function that\nit belongs to.\n\n      constructor: (@parent, @expressions, @method) ->\n        @variables = [{name: 'arguments', type: 'arguments'}]\n        @positions = {}\n        Scope.root = this unless @parent\n\nAdds a new variable or overrides an existing one.\n\n      add: (name, type, immediate) ->\n        return @parent.add name, type, immediate if @shared and not immediate\n        if Object::hasOwnProperty.call @positions, name\n          @variables[@positions[name]].type = type\n        else\n          @positions[name] = @variables.push({name, type}) - 1\n\nWhen `super` is called, we need to find the name of the current method we're\nin, so that we know how to invoke the same method of the parent class. This\ncan get complicated if super is being called from an inner function.\n`namedMethod` will walk up the scope tree until it either finds the first\nfunction object that has a name filled in, or bottoms out.\n\n      namedMethod: ->\n        return @method if @method.name or !@parent\n        @parent.namedMethod()\n\nLook up a variable name in lexical scope, and declare it if it does not\nalready exist.\n\n      find: (name) ->\n        return yes if @check name\n        @add name, 'var'\n        no\n\nReserve a variable name as originating from a function parameter for this\nscope. No `var` required for internal references.\n\n      parameter: (name) ->\n        return if @shared and @parent.check name, yes\n        @add name, 'param'\n\nJust check to see if a variable has already been declared, without reserving,\nwalks up to the root scope.\n\n      check: (name) ->\n        !!(@type(name) or @parent?.check(name))\n\nGenerate a temporary variable name at the given index.\n\n      temporary: (name, index) ->\n        if name.length > 1\n          '_' + name + if index > 1 then index - 1 else ''\n        else\n          '_' + (index + parseInt name, 36).toString(36).replace /\\d/g, 'a'\n\nGets the type of a variable.\n\n      type: (name) ->\n        return v.type for v in @variables when v.name is name\n        null\n\nIf we need to store an intermediate result, find an available name for a\ncompiler-generated variable. `_var`, `_var2`, and so on...\n\n      freeVariable: (name, reserve=true) ->\n        index = 0\n        index++ while @check((temp = @temporary name, index))\n        @add temp, 'var', yes if reserve\n        temp\n\nEnsure that an assignment is made at the top of this scope\n(or at the top-level scope, if requested).\n\n      assign: (name, value) ->\n        @add name, {value, assigned: yes}, yes\n        @hasAssignments = yes\n\nDoes this scope have any declared variables?\n\n      hasDeclarations: ->\n        !!@declaredVariables().length\n\nReturn the list of variables first declared in this scope.\n\n      declaredVariables: ->\n        realVars = []\n        tempVars = []\n        for v in @variables when v.type is 'var'\n          (if v.name.charAt(0) is '_' then tempVars else realVars).push v.name\n        realVars.sort().concat tempVars.sort()\n\nReturn the list of assignments that are supposed to be made at the top\nof this scope.\n\n      assignedVariables: ->\n        \"#{v.name} = #{v.type.value}\" for v in @variables when v.type.assigned\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/LiveScript/hello.ls",
    "content": "a = -> 1\nconst b = --> 2\nvar c = ~> 3\nd = ~~> 10_000_000km * 500ms\ne = (a) -> (b) ~> (c) --> (d, e) ~~> 5\ndashes-identifiers = ->\n  a - a\n  b -- c\n  1-1 1- -1\n  a- a\n  a -a\nunderscores_i$d = ->\n/regexp1/ and //regexp2//g\n'strings' and \"strings\" and \\strings\n([2 til 10] or [1 to 50])\n  |> map (* 2)\n  |> filter (> 5)\n  |> fold (+)\n\nclass Class extends Anc-est-or\n  (args) ->\n\ncopy = (from, to, callback) -->\n  error, data <- read file\n  return callback error if error?\n  error <~ write file, data\n  return callback error if error?\n  callback()\n\n->\n~>\n~~>\n-->\n# Comment\n/* Comment */\n"
  },
  {
    "path": "src/test/resources/samples/langs/Logos/NCHax.x",
    "content": "#import <UIKit/UIKit.h>\n#import <BulletinBoard/BBSectionInfo.h>\n#import <UIKit/UIImage+Private.h>\n#import <version.h>\n\nstatic NSString *const kHBDPWeeAppIdentifier = @\"ws.hbang.dailypaperweeapp\";\n\n#pragma mark - Change section header and icon\n\n// courtesy of benno\n\nBOOL isDailyPaper = NO;\n\n%hook SBBulletinObserverViewController\n\n- (void)_addSection:(BBSectionInfo *)section toCategory:(NSInteger)category widget:(id)widget {\n\tif ([section.sectionID isEqualToString:kHBDPWeeAppIdentifier]) {\n\t\tisDailyPaper = YES;\n\t\t%orig;\n\t\tisDailyPaper = NO;\n\t} else {\n\t\t%orig;\n\t}\n}\n\n%end\n\n%hook SBBulletinListSection\n\n- (void)setDisplayName:(NSString *)displayName {\n\t%orig(isDailyPaper ? @\"Current Wallpaper\" : displayName);\n}\n\n- (void)setIconImage:(UIImage *)iconImage {\n\t%orig(isDailyPaper ? [UIImage imageNamed:@\"icon\" inBundle:[NSBundle bundleWithPath:@\"/Library/PreferenceBundles/DailyPaper.bundle\"]] : iconImage);\n}\n\n%end\n\n#pragma mark - Enable by default\n\n%hook SBNotificationCenterDataProviderController\n\n- (NSArray *)_copyDefaultEnabledWidgetIDs {\n\tNSArray *defaultWidgets = %orig;\n\treturn [[defaultWidgets arrayByAddingObject:kHBDPWeeAppIdentifier] copy];\n}\n\n%end\n\n#pragma mark - Constructor\n\n%ctor {\n\tif (!IS_IOS_OR_NEWER(iOS_8_0)) {\n\t\t%init;\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Logos/NoCarrier.x",
    "content": "//\n//  NoCarrier.x\n//  NoCarrier\n//\n//  Created by Jonas Gessner on 27.01.2014.\n//  Copyright (c) 2014 Jonas Gessner. All rights reserved.\n//\n\n#import <CoreGraphics/CoreGraphics.h>\n\n#include <substrate.h>\n\n%group main\n\n%hook UIStatusBarServiceItemView\n\n- (id)_serviceContentsImage {\n    return nil;\n}\n\n- (CGFloat)extraLeftPadding {\n    return 0.0f;\n}\n\n- (CGFloat)extraRightPadding {\n    return 0.0f;\n}\n\n- (CGFloat)standardPadding {\n    return 2.0f;\n}\n\n%end\n\n%end\n\n\n%ctor {\n\t@autoreleasepool {\n\t\t%init(main);\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Logos/Tweak.x",
    "content": "/*\n *    ShadowSocks Per-App Proxy Plugin\n *    https://github.com/linusyang/MobileShadowSocks\n *\n *    Copyright (c) 2014 Linus Yang <laokongzi@gmail.com>\n *\n *    This program is free software: you can redistribute it and/or modify\n *    it under the terms of the GNU General Public License as published by\n *    the Free Software Foundation, either version 3 of the License, or\n *    (at your option) any later version.\n *\n *    This program is distributed in the hope that it will be useful,\n *    but WITHOUT ANY WARRANTY; without even the implied warranty of\n *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *    GNU General Public License for more details.\n *\n *    You should have received a copy of the GNU General Public License\n *    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n#include <UIKit/UIKit.h>\n#include <libfinder/LFFinderController.h>\n\n#define FUNC_NAME SCDynamicStoreCopyProxies\n#define ORIG_FUNC original_ ## FUNC_NAME\n#define CUST_FUNC custom_ ## FUNC_NAME\n\n#define DECL_FUNC(ret, ...) \\\n    extern ret FUNC_NAME(__VA_ARGS__); \\\n    static ret (*ORIG_FUNC)(__VA_ARGS__); \\\n    ret CUST_FUNC(__VA_ARGS__)\n\n#define HOOK_FUNC() \\\n    MSHookFunction(FUNC_NAME, (void *) CUST_FUNC, (void **) &ORIG_FUNC)\n\ntypedef const struct __SCDynamicStore *SCDynamicStoreRef;\nvoid MSHookFunction(void *symbol, void *replace, void **result);\n\nstatic BOOL proxyEnabled = YES;\nstatic BOOL spdyDisabled = YES;\nstatic BOOL finderEnabled = YES;\n\nstatic BOOL getValue(NSDictionary *dict, NSString *key, BOOL defaultVal)\n{\n    if (dict == nil || key == nil) {\n        return defaultVal;\n    }\n    NSNumber *valObj = [dict objectForKey:key];\n    if (valObj == nil) {\n        return defaultVal;\n    }\n    return [valObj boolValue];\n}\n\nstatic void updateSettings(void)\n{\n    proxyEnabled = YES;\n    spdyDisabled = YES;\n    finderEnabled = YES;\n    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:@\"/var/mobile/Library/Preferences/com.linusyang.ssperapp.plist\"];\n    if (dict != nil) {\n        NSString *bundleName = [[NSBundle mainBundle] bundleIdentifier];\n        if (getValue(dict, @\"SSPerAppEnabled\", NO) && bundleName != nil) {\n            NSString *entry = [[NSString alloc] initWithFormat:@\"Enabled-%@\", bundleName];\n            proxyEnabled = getValue(dict, entry, NO);\n            if (getValue(dict, @\"SSPerAppReversed\", NO)) {\n                proxyEnabled = !proxyEnabled;\n            }\n            [entry release];\n        }\n        spdyDisabled = getValue(dict, @\"SSPerAppDisableSPDY\", YES);\n        finderEnabled = getValue(dict, @\"SSPerAppFinder\", YES);\n        [dict release];\n    }\n}\n\nDECL_FUNC(CFDictionaryRef, SCDynamicStoreRef store)\n{\n    if (proxyEnabled) {\n        return ORIG_FUNC(store);\n    }\n    CFMutableDictionaryRef proxyDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);\n    int zero = 0;\n    CFNumberRef zeroNumber = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &zero);\n    CFDictionarySetValue(proxyDict, CFSTR(\"HTTPEnable\"), zeroNumber);\n    CFDictionarySetValue(proxyDict, CFSTR(\"HTTPProxyType\"), zeroNumber);\n    CFDictionarySetValue(proxyDict, CFSTR(\"HTTPSEnable\"), zeroNumber);\n    CFDictionarySetValue(proxyDict, CFSTR(\"ProxyAutoConfigEnable\"), zeroNumber);\n    CFRelease(zeroNumber);\n    return proxyDict;\n}\n\n@interface SettingTableViewController <LFFinderActionDelegate>\n\n- (BOOL)useLibFinder;\n- (UIViewController *)allocFinderController;\n- (void)finderSelectedFilePath:(NSString *)path checkSanity:(BOOL)check;\n\n@end\n\n%group FinderHook\n\n%hook SettingTableViewController\n- (BOOL)useLibFinder\n{\n    return finderEnabled;\n}\n\n- (UIViewController *)allocFinderController\n{\n    LFFinderController* finder = [[LFFinderController alloc] initWithMode:LFFinderModeDefault];\n    finder.actionDelegate = self;\n    return finder;\n}\n\n%new\n-(void)finder:(LFFinderController*)finder didSelectItemAtPath:(NSString*)path\n{\n    [self finderSelectedFilePath:path checkSanity:NO];\n}\n%end\n\n%end\n\n%group TwitterHook\n\n%hook T1SPDYConfigurationChangeListener \n- (BOOL)_shouldEnableSPDY\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%end\n\n%group FacebookHook\n\n%hook FBRequester\n- (BOOL)allowSPDY\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n\n- (BOOL)useDNSCache\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%hook FBNetworkerRequest\n- (BOOL)disableSPDY\n{\n    if (spdyDisabled) {\n        return YES;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%hook FBRequesterState\n- (BOOL)didUseSPDY\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%hook FBAppConfigService\n- (BOOL)disableDNSCache\n{\n    if (spdyDisabled) {\n        return YES;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%hook FBNetworker\n- (BOOL)_shouldAllowUseOfDNSCache:(id)arg\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%hook FBAppSessionController\n- (BOOL)networkerShouldAllowUseOfDNSCache:(id)arg\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%end\n\n%ctor\n{\n    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n    NSString *bundleName = [[NSBundle mainBundle] bundleIdentifier];\n    if (bundleName != nil && ![bundleName isEqualToString:@\"com.apple.springboard\"]) {\n        updateSettings();\n        CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback) updateSettings, CFSTR(\"com.linusyang.ssperapp.settingschanged\"), NULL, CFNotificationSuspensionBehaviorCoalesce);\n        if ([bundleName isEqualToString:@\"com.linusyang.MobileShadowSocks\"]) {\n            %init(FinderHook);\n        } else {\n            HOOK_FUNC();\n            if ([bundleName isEqualToString:@\"com.atebits.Tweetie2\"]) {\n                %init(TwitterHook);\n            } else if ([bundleName isEqualToString:@\"com.facebook.Facebook\"]) {\n                %init(FacebookHook);\n            }\n        }\n    }\n    [pool drain];\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Logos/example.xm",
    "content": "%hook ABC\n- (id)a:(B)b {\n\t%log;\n\treturn %orig(nil);\n}\n%end\n\n%subclass DEF: NSObject\n- (id)init {\n\t[%c(RuntimeAccessibleClass) alloc];\n\treturn nil;\n}\n%end\n\n%group OptionalHooks\n%hook ABC\n- (void)release {\n\t[self retain];\n\t%orig;\n}\n%end\n%end\n\n%ctor {\n\t%init;\n\tif(OptionalCondition)\n\t\t%init(OptionalHooks);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Logos/string1.x",
    "content": "# APPLE LOCAL file string workaround 4943900\nif { [istarget \"*-*-darwin\\[9123\\]*\"] } {\n  set additional_flags \"-framework Foundation -fconstant-cfstrings\"\n}\nreturn 0\n"
  },
  {
    "path": "src/test/resources/samples/langs/Logtalk/foo.lgt",
    "content": "% this is a Logtalk source file\n\n:- object(hello_world).\n\n\t% the initialization/1 directive argument is automatically executed\n\t% when the object is loaded into memory:\n\t:- initialization((nl, write('********** Hello World! **********'), nl)).\n\n:- end_object.\n"
  },
  {
    "path": "src/test/resources/samples/langs/LookML/comments.view.lookml",
    "content": "- view: comments\n  fields:\n\n  - dimension: id\n    primary_key: true\n    type: int\n    sql: ${TABLE}.id\n\n  - dimension: body\n    sql: ${TABLE}.body\n\n  - dimension_group: created\n    type: time\n    timeframes: [time, date, week, month]\n    sql: ${TABLE}.created_at\n\n  - dimension: headline_id\n    type: int\n    hidden: true\n    sql: ${TABLE}.headline_id\n\n  - dimension_group: updated\n    type: time\n    timeframes: [time, date, week, month]\n    sql: ${TABLE}.updated_at\n\n  - dimension: user_id\n    type: int\n    hidden: true\n    sql: ${TABLE}.user_id\n\n  - measure: count\n    type: count\n    detail: detail*\n\n\n  # ----- Detail ------\n  sets:\n    detail:\n      - id\n      - headlines.id\n      - headlines.name\n      - users.id\n"
  },
  {
    "path": "src/test/resources/samples/langs/LookML/example.model.lkml",
    "content": "- label:          'desired label name'\n- connection:     connection_name\n- include:        filename_or_pattern\n  # Possibly more include declarations\n- persist_for:    N (seconds | minutes | hours)\n- case_sensitive: true | false\n- week_start_day: monday | tuesday | wednesday | thursday | friday | saturday | sunday\n- value_formats:\n  - name: desired_format_name\n    value_format: 'excel-style formatting string'\n  # Possibly more value formats\n\n- explore: view_name\n  label:  'desired label name'\n  description: 'description string'\n  symmetric_aggregates: true | false\n  hidden: true | false\n  fields: [field_or_set, field_or_set, …]\n\n  sql_always_where: SQL WHERE condition\n  always_filter:\n    field_name: 'looker filter expression'\n  conditionally_filter:\n    field_name: 'looker filter expression'\n    unless: [field_or_set, field_or_set, …]\n  access_filter_fields: [fully_scoped_field, fully_scoped_field, …]\n\n  always_join: [view_name, view_name, …]\n  joins:\n    - join: view_name\n      type: left_outer | full_outer | inner | cross\n      relationship: one_to_one | many_to_one | one_to_many | many_to_many\n      from: view_name\n      sql_table_name: table_name\n      view_label: 'desired label name'\n      fields: [field_or_set, field_or_set, …]\n      required_joins: [view_name, view_name, …]\n      foreign_key: dimension_name\n      sql_on: SQL ON clause\n    # Possibly more join declarations\n\n  persist_for: N (seconds | minutes | hours)\n  from: view_name\n  view: view_name\n  case_sensitive: true | false\n  sql_table_name: table_name\n  cancel_grouping_fields: [fully_scoped_field, fully_scoped_field, …]\n\n# Possibly more explore declarations\n"
  },
  {
    "path": "src/test/resources/samples/langs/LookML/example.view.lkml",
    "content": "- view: view_name\n  sql_table_name: table_name\n  suggestions: true | false\n\n  derived_table:\n    sql: SQL query\n    persist_for: N (seconds | minutes | hours)\n    sql_trigger_value: SQL query\n    distribution: column_name\n    distribution_style: ALL | EVEN\n    sortkeys: [column_name, column_name, …]\n    indexes: [column_name, column_name, …]\n\n  sets:\n    set_name:\n      - field_or_set\n      - field_or_set\n      - …\n    # Possibly more set declarations\n\n  fields:\n  - (dimension | dimension_group | measure | filter): field_name\n    label: 'desired label name'\n    view_label: 'desired label name'\n    group_label: 'desired label name'\n    description: 'description string'\n    hidden: true | false\n    alias: [old_field_name, old_field_name, …]\n    value_format: 'excel-style formatting string'\n    value_format_name: format_name\n    html: HTML expression using Liquid template elements\n    sql: SQL expression to generate the field value\n    required_fields: [field_name, field_name, …]\n    drill_fields: [field_or_set, field_or_set, …]\n    can_filter: true | false\n    fanout_on: repeated_record_name\n\n    # DIMENSION SPECIFIC PARAMETERS\n\n    type: dimension_field_type\n    primary_key: true | false\n    sql_case:\n      value: SQL condition\n      value: SQL condition\n      # Possibly more sql_case statements\n    alpha_sort: true | false\n    tiers: [N, N, …]\n    style: classic | interval | integer | relational\n    sql_latitude: SQL expression to generate a latitude\n    sql_longitude: SQL expression to generate a longitude\n    suggestable: true | false\n    suggest_persist_for: N (seconds | minutes | hours)\n    suggest_dimension: dimension_name\n    suggest_explore: explore_name\n    suggestions: ['suggestion string', 'suggestion string', …]\n    bypass_suggest_restrictions: true | false\n    full_suggestions: true | false\n    skip_drill_filter: true | false\n    case_sensitive: true | false\n    order_by_field: dimension_name\n    map_layer: name_of_map_layer\n    links:\n      - label: 'desired label name'\n        url: desired_url\n        icon_url: url_of_an_ico_file\n      # Possibly more links\n\n    # DIMENSION GROUP SPECIFIC PARAMETERS\n\n    timeframes: [timeframe, timeframe, …]\n    convert_tz: true | false\n    datatype: epoch | timestamp | datetime | date | yyyymmdd\n\n    # MEASURE SPECIFIC PARAMETERS\n\n    type: measure_field_type\n    direction: row | column\n    approximate: true | false\n    approximate_threshold: N\n    sql_distinct_key: SQL expression to define repeated entities\n    list_field: dimension_name\n    filters:\n      dimension_name: 'looker filter expression'\n      # Possibly more filters statements\n\n    # FILTER SPECIFIC PARAMETERS\n\n    default_value: 'desired default value'\n\n  # Possibly more dimension or measure declarations\n"
  },
  {
    "path": "src/test/resources/samples/langs/LoomScript/HelloWorld.ls",
    "content": "package\n{\n    import loom.Application;\n    import loom2d.display.StageScaleMode;\n    import loom2d.ui.SimpleLabel;\n\n    /**\n    The HelloWorld app renders a label with its name on it,\n    and traces 'hello' to the log.\n    */\n    public class HelloWorld extends Application\n    {\n\n        override public function run():void\n        {\n            stage.scaleMode = StageScaleMode.LETTERBOX;\n            centeredMessage(simpleLabel, this.getFullTypeName());\n\n            trace(\"hello\");\n        }\n\n        // a convenience getter that generates a label and adds it to the stage\n        private function get simpleLabel():SimpleLabel\n        {\n            return stage.addChild(new SimpleLabel(\"assets/Curse-hd.fnt\")) as SimpleLabel;\n        }\n\n        // a utility to set the label's text and then center it on the stage\n        private function centeredMessage(label:SimpleLabel, msg:String):void\n        {\n            label.text = msg;\n            label.center();\n            label.x = stage.stageWidth / 2;\n            label.y = (stage.stageHeight / 2) - (label.height / 2);\n        }\n\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/LoomScript/SyntaxExercise.ls",
    "content": "package\n{\n    import loom.Application;\n\n    public interface I {}\n    public class C {}\n    public class B extends C implements I {}\n    final public class A extends B {}\n\n    delegate ToCompute(s:String, o:Object):Number;\n\n    public enum Enumeration\n    {\n      foo,\n      baz,\n      cat,\n    }\n\n    struct P {\n        public var x:Number = 0;\n        public var y:Number = 0;\n        public static operator function =(a:P, b:P):P\n        {\n            a.x = b.x;\n            a.y = b.y;\n\n            return a;\n        }\n    }\n\n    // single-line comment\n\n    /*\n    Multi-line comment\n    */\n\n    /**\n    Doc comment\n    */\n    public class SyntaxExercise extends Application\n    {\n        static public var classVar:String = 'class variable';\n        public const CONST:String = 'constant';\n        private var _a:A = new A();\n        public var _d:ToCompute;\n\n        override public function run():void\n        {\n            trace(\"hello\");\n        }\n\n        private function get a():A { return _a; }\n        private function set a(value:A):void { _a = value; }\n\n        private function variousTypes(defaultValue:String = ''):void\n        {\n            var nil:Object = null;\n            var b1:Boolean = true;\n            var b2:Boolean = false;\n            var n1:Number = 0.123;\n            var n2:Number = 12345;\n            var n3:Number = 0xfed;\n            var s1:String = 'single-quotes with \"quotes\" inside';\n            var s2:String = \"double-quotes with 'quotes' inside\";\n            var f1:Function = function (life:String, universe:Object, ...everything):Number { return 42; };\n            var v1:Vector.<Number> = [1, 2];\n            var d1:Dictionary.<String, Number> = { 'three': 3, 'four': 4 };\n\n            _d += f1;\n            _d -= f1;\n        }\n\n        private function variousOps():void\n        {\n            var a = ((100 + 200 - 0) / 300) % 2;\n            var b = 100 * 30;\n            var d = true && (b > 301);\n            var e = 0x10 | 0x01;\n\n            b++; b--;\n            a += 300; a -= 5; a *= 4; a /= 2; a %= 7;\n\n            var castable1:Boolean = (a is B);\n            var castable2:Boolean = (a as B) != null;\n            var cast:String = B(a).toString();\n            var instanced:Boolean = (_a instanceof A);\n        }\n\n        private function variousFlow():void\n        {\n            var n:Number = Math.random();\n            if (n > 0.6)\n                trace('top 40!');\n            else if(n > 0.3)\n                trace('mid 30!');\n            else\n                trace('bottom 30');\n\n            var flip:String =  (Math.random() > 0.5) ? 'heads' : 'tails';\n\n            for (var i = 0; i < 100; i++)\n                trace(i);\n\n            var v:Vector.<String> = ['a', 'b', 'c'];\n            for each (var s:String in v)\n                trace(s);\n\n            var d:Dictionary.<String, Number> = { 'one': 1 };\n            for (var key1:String in d)\n                trace(key1);\n\n            for (var key2:Number in v)\n                trace(key2);\n\n            while (i > 0)\n            {\n                i--;\n                if (i == 13) continue;\n                trace(i);\n            }\n\n            do\n            {\n                i++;\n            }\n            while (i < 10);\n\n            switch (Math.floor(Math.random()) * 3 + 1)\n            {\n                case 1 : trace('rock'); break;\n                case 2 : trace('paper'); break;\n                default: trace('scissors'); break;\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Lua/h-counter.pd_lua",
    "content": "\n-- A simple counting object that increments an internal counter whenever it receives a bang at its first inlet, or changes to whatever number it receives at its second inlet.\n\nlocal HelloCounter = pd.Class:new():register(\"h-counter\")\n\nfunction HelloCounter:initialize(sel, atoms)\n\tself.inlets = 2\n\tself.outlets = 1\n\tself.num = 0\n\treturn true\nend\n\nfunction HelloCounter:in_1_bang()\n\tself:outlet(1, \"float\", {self.num})\n\tself.num = self.num + 1\nend\n\nfunction HelloCounter:in_2_float(f)\n\tself.num = f\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Lua/treegen.p8",
    "content": "pico-8 cartridge // http://www.pico-8.com\nversion 7\n// taken from: https://github.com/lvictorino/pico8/blob/master/treegen.p8\n__lua__\n-- tree generation\n-- basic space colonization algorithm\n-- by laurent victorino\n\ntree={} --tree node list\ninfluence={} --influence list\nnewnodedist=5 -- distance between tree nodes\ninfluencedist=50 -- attraction max distance\ninfluencekilldist=10 -- distance at which an influence node is killed\ncrownw=64 -- tree crown width\ncrownh=64 -- tree crown height\ncrownx=64 -- tree crown x center position\ncronwy=64 -- tree crown y center position\ngenerate=false -- has generation started?\n\nfunction _init()\n\t-- randomize properties\n\tnewnodedist=rnd(10)+2\n\tinfluencedist=rnd(60)+20\n\tinfluencekilldist=rnd(20)+8\n\tcrownx=64+rnd(40)*(rnd(1)-rnd(1))\n\tcrowny=64+rnd(40)*(rnd(1)-rnd(1))\n\tcrownw=rnd(60)+30\n\tcrownh=rnd(60)+20\n\t--\n\tgenerate = false\n\t\n\tinitialize_root()\n\tinitialize_crown()\nend\n\n-- initialize first tree node\nfunction initialize_root()\n\ttree={}\n\tadd(tree,newnode(rnd(10)+54,127,nil,7))\nend\n\n-- initialize crown size and influence\nfunction initialize_crown()\n\tinfluence={}\n\t-- create an eliptic crown composed of 100->400 influence nodes\n\tfor i=0,rnd(100)+300 do\n\t a = rnd(1)\n\t\tx = crownx + rnd(crownw) * cos(a)\n\t\ty = crowny + rnd(crownh) * sin(a)\n\t\t-- add a new influence to the list\n\t\tadd(influence,newnode(x,y,nil,5))\n\tend\nend\n\nfunction _update()\n\t-- x button: generate a new set\n\tif btn(4) and btnp(4) == true then\n\t\t_init()\n\tend\n\t-- c button: start generation\n\tif btn(5) and btnp(5) == true then\n\t\tgenerate=true\n\tend\n\n -- generation loop\n\tif #influence != 0 and generate==true then\t\t\t\n\t\t-- reset all tree nodes influence\n\t\tfor c in all(tree) do c.resetinfluence(c) end \n\t\t-- is there any remaining influence?\n\t\tflag=false\n\t\t-- for every influence node\n\t\t-- check what node they it influenced\n\t\tfor i in all(influence) do\n\t\t\tclosest=nil\n\t\t\tfor t in all(tree) do\n\t\t\t\tif distvector(i,t) < influencedist\n\t\t\t\t\t\tand (closest==nil or abs(distvector(i,t)) < abs(distvector(i,closest))) \t\t\t\t\t\t\t\tthen\n\t\t\t\t\tflag=true\n\t\t\t\t\tclosest=t\n\t\t\t\tend\n\t\t\tend\n\t\t\tif closest!=nil then \n\t\t\t\tclosest.addinfluence(closest,i) \n\t\t\tend\n\t\tend\t\n\t\t-- if no influence remains stop the generation\n\t\tif flag == false then \n\t\t\tinfluence={}\n\t\t\tgenerate=false\n\t\t\treturn\n\t\tend\n\t\t-- for every tree node\n\t\t-- compute the influence vector\n\t\t-- and add a new tree node to the list\n\t\tfor t in all(tree) do\n\t\t\tif #t.influence != 0 then\n \t\t\tmedv={}\n\t \t\tmedv.x=0\n\t\t \tmedv.y=0\n\t\t\t for i in all(t.influence) do\n\t\t\t\t dist=distvector(i,t)\n\t\t\t\t medv.x+=(i.x-t.x)/dist -- closest influence nodes are more powerful\n\t\t\t\t medv.y+=(i.y-t.y)/dist\n\t\t\t\t -- destroy influence if too close\n\t\t\t\t if dist < influencekilldist then\n\t\t\t\t\t del(influence,i)\n\t\t\t\t end\n\t\t\t end\n\t\t\t -- compute the influence vector\n\t\t\t\tmedv.x /= #t.influence\n\t\t\t\tmedv.y /= #t.influence\n\t\t\t\t-- normalize influence vector\n\t\t\t\tnewn=normalize(medv)\n\t\t\t\t-- compute new node position\n\t\t\t\tnewn.x=t.x+newnodedist*newn.x\n\t\t\t\tnewn.y=t.y+newnodedist*newn.y\n\t\t\t\t-- add new node to the list\n\t\t\t\tadd(tree,newnode(newn.x,newn.y,t))\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction _draw()\n\tcls()\n\n\t-- draw tree lines\n\tfor t in all(tree) do\n\t\tif t.parent != nil then\n\t\t\tline(t.x,t.y,t.parent.x,t.parent.y,4)\n\t\tend\n\tend\n\t-- draw influence\n\tfor i in all(influence) do\n\t\ti.draw(i,8)\n\tend\n\n\t-- helpers\n\tcolor(13)\n\tprint(\"c:new set\\tx:generate\")\n\tprint(\"nodes\\t\\t\\t\\t\\tcount:\"..#tree..\"\\tdist:\"..flr(newnodedist))\n\tprint(\"influence\\tcount:\"..#influence..\"\\tdist:\"..flr(influencedist))\n\tif #influence==0 then\n\t\tprint(\"generation is over.\",0,123)\n\tend\nend\n\n-- generate a new node\n-- params: xpos,ypos,parent node to be attached to\nfunction newnode(x,y,parent)\n\t\tn={}\n\t\tn.x=x\n\t\tn.y=y\n\t\t-- set parent\n\t\tn.parent=parent\n\t\t-- list of influence node\n\t\tn.influence={}\n\t\t-- draw node as crosses\n\t\tn.draw=function(node,col)\n\t\t\tline(node.x,node.y-1,node.x,node.y+1,col)\n\t\t\tline(node.x-1,node.y,node.x+1,node.y,col)\n\t\tend\n\t\t-- add an influence node to the list\n\t\tn.addinfluence=function(node,influence)\n\t\t\tadd(node.influence,influence)\n\t\tend\n\t\t-- reset the influence list\n\t\tn.resetinfluence=function(node)\n\t\t\tnode.influence={}\n\t\tend\n\t\treturn n\nend\n\n-- return the distance between \n-- two vectors\nfunction distvector(v1,v2)\n\tvx=v1.x-v2.x\n\tvy=v1.y-v2.y\n\treturn sqrt(vx*vx+vy*vy)\nend\n\n-- return the magnitude of a vector\nfunction magnitude(v)\n\treturn sqrt(v.x*v.x+v.y*v.y)\nend\n\n-- return a normalized vector\nfunction normalize(v)\n\tvp={}\n\tvp.x=v.x/magnitude(v)\n\tvp.y=v.y/magnitude(v)\n\treturn vp\nend\n__gfx__\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n__gff__\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n__map__\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n__sfx__\n000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n__music__\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n"
  },
  {
    "path": "src/test/resources/samples/langs/Lua/vidya-file-list-parser.pd_lua",
    "content": "\nlocal FileListParser = pd.Class:new():register(\"vidya-file-list-parser\")\n\nfunction FileListParser:initialize(sel, atoms)\n\n\t-- 1. Base filename\n\t-- 2. File extension\n\t-- 3. Number of files in batch\n\tself.inlets = 3\n\t\n\t-- 1. To [list trim]-[binfile]\n\t-- 2. To [vidya-file-modder]'s filename variables\n\t-- 3. Sends a bang to [vidya-file-modder], triggering the object's mechanisms\n\tself.outlets = 3\n\t\n\t-- File extension\n\tself.extension = \"jpg\"\n\t\n\t-- Number of the last file in the batch\n\tself.batchlimit = 0\n\t\n\treturn true\n\nend\n\nfunction FileListParser:in_1_symbol(s)\n\n\tfor i = 0, self.batchlimit do\n\t\tself:outlet(2, \"list\", {s, i})\n\t\tself:outlet(1, \"read\", {s .. i .. \".\" .. self.extension})\n\t\tself:outlet(1, \"info\", {})\n\t\tself:outlet(3, \"bang\", {})\n\tend\n\nend\n\nfunction FileListParser:in_2_list(d)\n\tself.extension = d[1]\nend\n\nfunction FileListParser:in_3_float(f)\n\tself.batchlimit = f\nend"
  },
  {
    "path": "src/test/resources/samples/langs/Lua/vidya-file-modder.pd_lua",
    "content": "\nlocal FileModder = pd.Class:new():register(\"vidya-file-modder\")\n\nfunction FileModder:initialize(sel, atoms)\n\n\t-- 1. Object-triggering bang\n\t-- 2. Incoming single data bytes from [binfile]\n\t-- 3. Total bytes in file, from [route buflength]\n\t-- 4. Glitch type\n\t-- 5. Glitch point\n\t-- 6. Number of times to glitch a file\n\t-- 7. Toggle for a randomized number of glitches within the bounds of (6)\n\t-- 8. Active filename\n\tself.inlets = 8\n\t\n\t-- 1. To [binfile] inlet - bang(get next byte), clear(clear the buffer), FLOAT(write a byte to buffer), write(write to file)\n\tself.outlets = 1\n\t\n\t-- Currently active file's namedata\n\tself.filedata = {\n\t\t\"default-filename\",\n\t\t0,\n\t}\n\t\n\t-- Glitch type (pattern, random, or splice)\n\tself.glitchtype = \"random\"\n\t\n\t-- Minimum glitch point in image data\n\tself.glitchpoint = 500\n\t\n\t-- Number of times to repeat random glitches on a given file\n\tself.randrepeat = 1\n\t\n\t-- Toggles whether the number of repeating glitches should be random, within the bounds of 1 to self.randrepeat\n\tself.randtoggle = \"concrete\"\n\t\n\t-- Hold all bytes, which are converted to ints in the 0-255 range\n\tself.bytebuffer = {}\n\t\n\t-- Buffer length of currently active file\n\tself.buflength = 0\n\t\n\treturn true\n\nend\n\nfunction FileModder:in_1_bang()\n\n\tfor i = 1, self.buflength do\n\t\tself:outlet(1, \"bang\", {})\n\tend\n\t\n\tself:outlet(1, \"clear\", {})\n\t\n\tif self.glitchtype == \"pattern\" then\n\t\n\t\tlocal plen = math.random(2, 1000)\n\t\tlocal patbuffer = {}\n\t\t\n\t\tfor i = 1, plen do\n\t\t\ttable.insert(patbuffer, math.random(1, 254))\n\t\tend\n\t\t\n\t\tfor i = self.glitchpoint, self.buflength do\n\t\t\tself.bytebuffer[i] = patbuffer[((i - 1) % #patbuffer) + 1]\n\t\tend\n\t\t\n\telseif self.glitchtype == \"random\" then\n\t\n\t\tlocal randlimit = 0\n\t\tif self.randtoggle == \"random\" then\n\t\t\trandlimit = math.random(1, self.randrepeat)\n\t\telse\n\t\t\trandlimit = self.randrepeat\n\t\tend\n\t\t\n\t\tfor i = 1, randlimit do\n\t\t\tself.bytebuffer[math.random(self.glitchpoint, self.buflength)] = math.random(1, 244)\n\t\tend\n\t\t\n\telseif self.glitchtype == \"splice\" then\n\t\t\n\t\tlocal sloc = math.random(self.glitchpoint, self.buflength)\n\t\tlocal schunksize = math.random(1, self.buflength - sloc)\n\t\tlocal splicebuffer = {}\n\t\tfor i = 1, schunksize do\n\t\t\ttable.insert(splicebuffer, table.remove(self.bytebuffer, sloc))\n\t\tend\n\t\t\n\t\tlocal insertpoint = math.random(self.glitchpoint, #self.bytebuffer)\n\t\tfor _, v in ipairs(splicebuffer) do\n\t\t\ttable.insert(self.bytebuffer, insertpoint, v)\n\t\tend\n\t\t\n\tend\n\n\tfor _, v in ipairs(self.bytebuffer) do\n\t\tself:outlet(1, \"float\", {v})\n\tend\n\t\n\tlocal outname = self.filedata[1] .. \"-glitch\" .. self.filedata[2] .. \".jpeg\"\n\tself:outlet(1, \"write\", {outname})\n\tpd.post(\"New glitched image: \" .. outname)\n\t\n\tself:outlet(1, \"clear\", {})\n\t\n\tself.bytebuffer = {}\n\nend\n\nfunction FileModder:in_2_float(f)\n\ttable.insert(self.bytebuffer, f)\nend\n\nfunction FileModder:in_3_list(f)\n\tself.buflength = f[1] + 1 -- Shift from 0-indexed to 1-indexed\nend\n\nfunction FileModder:in_4_list(d)\n\tself.glitchtype = d[1]\nend\n\nfunction FileModder:in_5_float(f)\n\tself.glitchpoint = f\nend\n\nfunction FileModder:in_6_float(f)\n\tself.randrepeat = f\nend\n\nfunction FileModder:in_7_list(d)\n\tself.randtoggle = d[1]\nend\n\nfunction FileModder:in_8_list(d)\n\tself.filedata = {d[1], d[2]}\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Lua/wsapi.fcgi",
    "content": "#!/usr/bin/lua\n\n-- Generic WSAPI FastCGI launcher, extracts application to launch\n-- from SCRIPT_FILENAME/PATH_TRANSLATED, each application (defined\n-- by its script entry point) gets an isolated Lua VM; sequential\n-- requests to the same application go to the same VM\n\npcall(require,\"luarocks.require\")\n\nlocal common = require \"wsapi.common\"\nlocal fastcgi = require \"wsapi.fastcgi\"\n\nlocal ONE_HOUR = 60 * 60\nlocal ONE_DAY = 24 * ONE_HOUR\n\nlocal wsapi_loader = common.make_loader{\n  isolated = true,         -- isolate each script in its own Lua state\n  filename = nil,          -- if you want to force the launch of a single script\n  launcher = \"wsapi.fcgi\", -- the name of this script\n  reload = false,          -- if you want to reload the application on every request\n  period = ONE_HOUR,       -- frequency of Lua state staleness checks\n  ttl = ONE_DAY,           -- time-to-live for Lua states\n  vars =                   -- order of checking for the path of the script\n   { \"SCRIPT_FILENAME\",\n     \"PATH_TRANSLATED\" } \n}\n\nfastcgi.run(wsapi_loader)\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/Comment.m",
    "content": "Comment ;\n  ; this is a comment block\n  ; comments always start with a semicolon\n  ; the next line, while not a comment, is a legal blank line\n  \n  ;whitespace alone is a valid line in a routine\n  ;** Comments can have any graphic character, but no \"control\"\n  ;** characters\n  \n  ;graphic characters such as: !@#$%^&*()_+=-{}[]|\\:\"?/>.<,\n  ;the space character is considered a graphic character, even \n  ;though you can't see it.\n  ; ASCII characters whose numeric code is above 128 and below 32\n  ; are NOT allowed on a line in a routine.\n  ;; multiple semicolons are okay\n  ; a line that has a tag must have whitespace after the tag, bug\n  ; does not have to have a comment or a command on it\nTag1  \n  ;\n  ;Tags can start with % or an uppercase or lowercase alphabetic\n  ; or can be a series of numeric characters\n%HELO ;\n ;\n0123 ;\n  ;\n%987  ;\n  ; the most common label is uppercase alphabetic\nLABEL ;\n  ; \n  ; Tags can be followed directly by an open parenthesis and a\n  ; formal list of variables, and a close parenthesis\nANOTHER(X) ;\n  ;\n  ;Normally, a subroutine would be ended by a QUIT command, but we\n  ; are taking advantage of the rule that the END of routine is an\n  ; implicit QUIT\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/GMRGPNB0.m",
    "content": "GMRGPNB0 ;CISC/JH/RM-NARRATIVE BUILDER FOR TEXT GENERATOR (cont.) ;6/20/91\n ;;3.0;Text Generator;;Jan 24, 1996\nTEXT ; ENTRY WITH GMRGA SET TO POINT AT WHICH WANT TO START BUILDING TEXT\n S (GMRGE0,GMRGADD)=\"\"\n Q:'$D(^GMR(124.3,GMRGPDA,1,\"ALIST\",GMRGA0))&GMRGCSW  Q:('$D(^GMR(124.3,\"B\",GMRGA0,GMRGPDA))&'$D(^GMR(124.3,GMRGPDA,1,\"B\",GMRGA0)))&'GMRGCSW  D NOW^%DTC\n S GMRGB0=$O(^GMR(124.3,GMRGPDA,1,\"B\",GMRGA0,0)) I GMRGB0>0 S GMRGST=GMRGB0,GMRGST(1)=GMRGPDA,GMRGST(2)=$S(GMRGCSW=1:%,1:GMRGPDT) D STAT^GMRGRUT0 S GMRGF0=GMRGSTAT,GMRGST=GMRGB0,GMRGST(1)=GMRGPDA,GMRGST(2)=GMRGPDT D STAT^GMRGRUT0\n I GMRGB0>0 S GMRGE0=$S($P(GMRGSTAT,\"^\",3)=1:\"\",$P(GMRGSTAT,\"^\")=$P(GMRGF0,\"^\"):$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,0)):$P(^(0),\"^\",2),1:\"\"),1:$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,2,+$P(GMRGSTAT,\"^\"),0)):$P(^(0),\"^\",4),1:\"\"))\n I  S GMRGADD=$S($P(GMRGSTAT,\"^\",3)=1:\"\",$P(GMRGSTAT,\"^\")=$P(GMRGF0,\"^\"):$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,\"ADD\")):\"1;\"_GMRGB0_\";0\",1:\"\"),1:$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,2,$P(GMRGSTAT,\"^\"),\"ADD\")):\"1;\"_GMRGB0_\";2;\"_$P(GMRGSTAT,\"^\"),1:\"\"))\n S GMRGE0(0)=$S($D(^GMRD(124.2,GMRGA0,0)):^(0),1:\"\"),GMRGE0(4)=$S($D(^GMRD(124.2,GMRGA0,4)):^(4),1:\"\"),GMRGE0(5)=$S($D(^GMRD(124.2,GMRGA0,5)):^(5),1:\"\") Q:$P(GMRGE0(0),\"^\",2)=3&GMRGSSW\n I \"S\"[$P(GMRGE0(0),\"^\",8)!GMRGSSW D SNT^GMRGPNB1 Q\n S GMRGNAR=GMRGPAR_\"^\"_$P(GMRGE0(0),\"^\",8)_\"^\"_GMRGSPC_\"^^\"_GMRGRM,GMRGNAR(0)=$P(GMRGE0(0),\"^\")_\"^\"_GMRGE0,GMRGNAR(\"LEAD\")=GMRGE0(4),GMRGNAR(\"TRAIL\")=GMRGE0(5) D STORETXT^GMRGRUT1\n S GMRGSPC=GMRGSPC+3\n F GMRGD0=0:0 S GMRGD0=$O(^GMRD(124.2,GMRGA0,1,GMRGD0)) Q:GMRGD0'>0  D RECUR\n Q:'GMRGADD\n S GMRGNAR=GMRGPAR_\"^T^\"_GMRGSPC_\"^^\"_GMRGRM,GMRGNAR(\"LEAD\")=\"Additional Text: \",GMRGNAR(\"TRAIL\")=\"\"\n S GMRGNAR(0)=$S('$P(GMRGADD,\";\",3):^GMR(124.3,GMRGPDA,1,$P(GMRGADD,\";\",2),\"ADD\"),1:^GMR(124.3,GMRGPDA,1,$P(GMRGADD,\";\",2),2,$P(GMRGADD,\";\",4),\"ADD\")) D STORETXT^GMRGRUT1\n Q\nRECUR ;\n Q:'$$ALIST^GMRGRUT0(GMRGPDA,GMRGA0,+$G(^GMRD(124.2,+GMRGA0,1,+GMRGD0,0)))\n S ^TMP($J,\"GMRGPLVL\",GMRGPLVL)=GMRGA0_\"^\"_GMRGD0_\"^\"_GMRGSPC_\"^\"_GMRGSSW_\"^\"_GMRGADD,GMRGPLVL=GMRGPLVL+1,GMRGA0=$S($D(^GMRD(124.2,GMRGA0,1,GMRGD0,0)):$P(^(0),\"^\"),1:\"\")\n D TEXT\n S GMRGPLVL=GMRGPLVL-1,GMRGI0=^TMP($J,\"GMRGPLVL\",GMRGPLVL),GMRGA0=$P(GMRGI0,\"^\"),GMRGD0=$P(GMRGI0,\"^\",2),GMRGSPC=$P(GMRGI0,\"^\",3),GMRGSSW=$P(GMRGI0,\"^\",4),GMRGADD=$P(GMRGI0,\"^\",5)\n Q\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/MDB.m",
    "content": "MDB ; M/DB: Mumps Emulation of Amazon SimpleDB\n ;\n ; ----------------------------------------------------------------------------\n ; | M/DB                                                                     |\n ; | Copyright (c) 2004-11 M/Gateway Developments Ltd,                        |\n ; | Reigate, Surrey UK.                                                      |\n ; | All rights reserved.                                                     |\n ; |                                                                          |\n ; | http://www.mgateway.com                                                  |\n ; | Email: rtweed@mgateway.com                                               |\n ; |                                                                          |\n ; | This program is free software: you can redistribute it and/or modify     |\n ; | it under the terms of the GNU Affero General Public License as           |\n ; | published by the Free Software Foundation, either version 3 of the       |\n ; | License, or (at your option) any later version.                          |\n ; |                                                                          |\n ; | This program is distributed in the hope that it will be useful,          |\n ; | but WITHOUT ANY WARRANTY; without even the implied warranty of           |\n ; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            |\n ; | GNU Affero General Public License for more details.                      |\n ; |                                                                          |\n ; | You should have received a copy of the GNU Affero General Public License |\n ; | along with this program.  If not, see <http://www.gnu.org/licenses/>.    |\n ; ----------------------------------------------------------------------------\n ;\n ;\nversion()\t\n\tQUIT \"44\"\n\t;\nbuildDate()\t\n\tQUIT \"06 July 2011\"\n\t;\nindexLength()\n QUIT 180\n ;\n ; Note: keyId will have been tested and must be valid\n ; by the time these methods are called\n ;\n ; To Initialise the service: http://192.168.1.xxx/mdb/test.mgwsi?Action=Initialise\n ;\naddUser(userKeyId,userSecretKey,requestId,boxUsage)\n ;\n n startTime,stop\n ;\n s requestId=$$init(.startTime)\n s ^MDBUAF(\"keys\",userKeyId)=userSecretKey\n QUIT $$end(startTime,.boxUsage)\n ;\ncreateDomain(keyId,domainName,requestId,boxUsage)\n ;\n n dn,dnx,id,noOfDomains,startTime,token\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s dn=$tr(domainName,\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-.\",\"\")\n i dn'=\"\" QUIT $$end(startTime,.boxUsage,\"InvalidParameterValue\",domainName,\"DomainName\")\n ;\n s noOfDomains=+$g(^MDB(keyId))\n i $g(^MDBConfig(\"DomainsPerAccount\"))'=\"\",noOfDomains=^MDBConfig(\"DomainsPerAccount\") QUIT $$end(startTime,.boxUsage,\"NumberDomainsExceeded\")\n s dnx=$e(domainName,1,$$indexLength())\n i '$$domainExists(keyId,domainName) d\n . s noOfDomains=$increment(^MDB(keyId))\n . s id=$increment(^MDB(keyId,\"domains\"))\n . s ^MDB(keyId,\"domains\",id,\"name\")=domainName\n . s ^MDB(keyId,\"domains\",id,\"created\")=$h\n . d updateDomainMetaData(keyId,id)\n . s ^MDB(keyId,\"domainIndex\",dnx,id)=\"\"\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\nupdateDomainMetaData(keyId,id)\n ;\n s ^MDB(keyId,\"domains\",id,\"modified\")=$h\n QUIT\n ;\ngetDomainMetaData(keyId,domainId,metaData)\n ;\n n size,timestamp\n ;\n k metaData\n s timestamp=$g(^MDB(keyId,\"domains\",domainId,\"modified\"))\n s timestamp=$$convertToEpochTime(timestamp)\n s metaData(\"Timestamp\")=timestamp\n s metaData(\"ItemCount\")=$$countItems(keyId,domainId,.size)_\".0\"\n s metaData(\"ItemNamesSizeBytes\")=size_\".0\"\n s metaData(\"AttributeValueCount\")=$$countNVPs(keyId,domainId,.size)_\".0\"\n s metaData(\"AttributeValuesSizeBytes\")=size_\".0\"\n s metaData(\"AttributeNameCount\")=$$countAttributeNames(keyId,domainId,.size)_\".0\"\n s metaData(\"AttributeNamesSizeBytes\")=size_\".0\"\n QUIT\n ;\ndomainMetadata(keyId,domainName,metaData,requestId,boxUsage)\n ;\n n domainId,startTime\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s domainId=$$getDomainId(keyId,domainName)\n i domainId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchDomain\",\"The specified domain does not exist.\")\n ;\n d getDomainMetaData(keyId,domainId,.metaData)\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\nconvertToEpochTime(dh)\n ;\n n time\n ;\n s time=(dh*86400)+$p(dh,\",\",2)\n s time=time-4070908800\n QUIT time\n ;\nconvertFromEpochTime(time)\n ;\n n dh\n ;\n s time=time+4070908800\n s dh=time\\86400\n s time=time#86400\n QUIT dh_\",\"_time\n ;\ncountItems(keyId,domainId,size)\n ;\n n count,id\n ;\n s id=\"\",count=0,size=0\n f  s id=$o(^MDB(keyId,\"domains\",domainId,\"items\",id)) q:id=\"\"  d\n . s count=count+1\n . s size=size+$l(^MDB(keyId,\"domains\",domainId,\"items\",id))\n QUIT count\n ;\ncountNVPs(keyId,domainId,size)\n ;\n n attribId,count,itemId,valueId\n ;\n s itemId=\"\",count=0,size=0\n f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . s attribId=0\n . f  s attribId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId)) q:attribId=\"\"  d\n . . s valueId=\"\"\n . . f  s valueId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)) q:valueId=\"\"  d\n . . . s count=count+1\n . . . s size=size+$l(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId))\n QUIT count\n ;\ncountAttributeNames(keyId,domainId,size)\n ;\n n attribId,count,name\n ;\n s attribId=0,count=0,size=0\n f  s attribId=$o(^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)) q:attribId=\"\"  d\n . s count=count+1\n . s name=^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)\n . s size=size+$l(name)\n QUIT count\n ;\n \ndomainExists(keyId,name)\n ;\n n id\n ;\n s id=$$getDomainId($g(keyId),$g(name))\n QUIT (id'=\"\")\n ;\ngetDomainId(keyId,name)\n ;\n n found,id,namex\n ;\n i $g(name)=\"\" QUIT \"\"\n i $g(keyId)=\"\" QUIT \"\"\n s namex=$e(name,1,$$indexLength())\n s id=\"\",found=0\n f  s id=$o(^MDB(keyId,\"domainIndex\",namex,id)) q:id=\"\"  d  q:found\n . i $g(^MDB(keyId,\"domains\",id,\"name\"))=name s found=1\n i id'=\"\",'$d(^MDB(keyId,\"domains\",id,\"attribs\",0)) d buildItemNameIndex(keyId,id)\n QUIT id\n ;\nbuildItemNameIndex(keyId,domainId)\n ;\n n itemId,itemValue,itemValuex\n ;\n s ^MDB(keyId,\"domains\",domainId,\"attribs\",0)=\"itemName()\"\n s ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",\"itemName()\",0)=\"\"\n s itemId=\"\"\n f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . s itemValue=^MDB(keyId,\"domains\",domainId,\"items\",itemId)\n . s itemValuex=$e(itemValue,1,$$indexLength())\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\")=1\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\",1)=itemValue\n . s ^MDB(keyId,\"domains\",domainId,\"queryIndex\",0,itemValuex,itemId)=\"\"\n QUIT \n ;\ncountDomains(key)\n ;\n n id,no\n ;\n s id=\"\",no=0\n f  s id=$o(^MDB(key,\"domains\",id)) q:id=\"\"  s no=no+1\n QUIT no\n ;\ndeleteDomain(keyId,domainName,requestId,boxUsage)\n ;\n n dn,dnx,id,noOfDomains,startTime,token\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s id=$$getDomainId(keyId,domainName)\n i id=\"\" QUIT $$end(startTime,.boxUsage)\n k ^MDB(keyId,\"domains\",id)\n k ^MDB(keyId,\"domainIndex\",$e(domainName,1,$$indexLength()),id)\n s noOfDomains=$$countDomains(keyId)\n i noOfDomains>0 d\n . s ^MDB(keyId)=noOfDomains\n e  d\n . k ^MDB(keyId)\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\nlistDomains(keyId,maxNoOfDomains,nextToken,domainList,requestId,boxUsage)\n ;\n n domainName,fullName,id,noOfDomains,startTime,stop,token\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n k domainList s noOfDomains=0,stop=0\n i $g(nextToken)=\"\" d\n . s domainName=\"\"\n e  d\n . s domainName=$$decodeBase64(nextToken)\n s nextToken=\"\"\n f  s domainName=$o(^MDB(keyId,\"domainIndex\",domainName)) q:domainName=\"\"  d  q:stop\n . s id=\"\"\n . f  s id=$o(^MDB(keyId,\"domainIndex\",domainName,id)) q:id=\"\"  d\n . . s fullName=$g(^MDB(keyId,\"domains\",id,\"name\"))\n . . s noOfDomains=noOfDomains+1\n . . s domainList(noOfDomains)=fullName\n . i noOfDomains=maxNoOfDomains d  q\n . . s stop=1\n . . s nextToken=$$encodeBase64(domainName)\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\nitemExists(keyId,domainId,name)\n ;\n n id\n ;\n s id=$$getItemId($g(keyId),$g(domainId),$g(name))\n QUIT (id'=\"\")\n ;\ngetItemId(keyId,domainId,name)\n ;\n n found,id,namex\n ;\n i $g(domainId)=\"\" QUIT \"\"\n i $g(name)=\"\" QUIT \"\"\n i $g(keyId)=\"\" QUIT \"\"\n i domainId=\"\" QUIT \"\"\n s namex=$e(name,1,$$indexLength())\n s id=\"\",found=0\n f  s id=$o(^MDB(keyId,\"domains\",domainId,\"itemIndex\",namex,id)) q:id=\"\"  d  q:found\n . i $g(^MDB(keyId,\"domains\",domainId,\"items\",id))=name s found=1\n QUIT id\n ;\ngetAttributeId(keyId,domainId,name)\n ;\n n found,id,namex\n ;\n i $g(domainId)=\"\" QUIT \"\"\n i $g(name)=\"\" QUIT \"\"\n i $g(keyId)=\"\" QUIT \"\"\n i domainId=\"\" QUIT \"\"\n s namex=$e(name,1,$$indexLength())\n s id=\"\",found=0\n f  s id=$o(^MDB(keyId,\"domains\",domainId,\"attribsIndex\",namex,id)) q:id=\"\"  d  q:found\n . i $g(^MDB(keyId,\"domains\",domainId,\"attribs\",id))'=name q\n . s found=1\n QUIT id\n ;\ngetAttributeValueId(keyId,domainId,itemId,attribId,value)\n ;\n n found,id,valuex\n ;\n i $g(domainId)=\"\" QUIT \"\"\n i '$d(value) QUIT \"\"\n i $g(keyId)=\"\" QUIT \"\"\n i domainId=\"\" QUIT \"\"\n i value=\"\" s value=$c(31)\n s itemId=$g(itemId)\n i itemId=\"\" QUIT \"\"\n s valuex=$e(value,1,$$indexLength())\n s id=\"\",found=0\n f  s id=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",valuex,id)) q:id=\"\"  d  q:found\n . i $g(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",id))'=value q\n . s found=1\n QUIT id\n \nputAttributes(keyId,domainName,itemName,attributes,requestId,boxUsage)\n ;\n n attribId,domainId,itemId,name,namex,no,replace,startTime,value,valueId,valuex,xvalue\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s domainId=$$getDomainId(keyId,domainName)\n i domainId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchDomain\",\"The specified domain does not exist.\")\n s itemName=$g(itemName)\n i itemName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"ItemName\")\n s itemId=$$getItemId(keyId,domainId,itemName)\n i itemId=\"\" d\n . ; add Item to Domain if it's new\n . n itemNamex\n . s itemNamex=$e(itemName,1,$$indexLength())\n . s itemId=$increment(^MDB(keyId,\"domains\",domainId,\"items\"))\n . s ^MDB(keyId,\"domains\",domainId,\"itemIndex\",itemNamex,itemId)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId)=itemName\n . s ^MDB(keyId,\"domains\",domainId,\"attribs\",0)=\"itemName()\"\n . s ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",\"itemName()\",0)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\")=1\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\",1)=itemName\n . s ^MDB(keyId,\"domains\",domainId,\"queryIndex\",0,itemNamex,itemId)=\"\"\n ;\n ; attributes(no,\"name\")=attribute name\n ; attributes(no,\"value\")=attribute value\n ; attributes(no,\"replace\")=1\n ;\n s no=\"\"\n f  s no=$o(attributes(no)) q:no=\"\"  d\n . s name=$g(attributes(no,\"name\"))\n . s value=$g(attributes(no,\"value\"))\n . i value=\"\" s value=$c(31)\n . s replace=+$g(attributes(no,\"replace\"))\n . s namex=$e(name,1,$$indexLength())\n . s valuex=$e(value,1,$$indexLength())\n . s attribId=$$getAttributeId(keyId,domainId,name)\n . i attribId=\"\" d\n . . ; add new attribute name to the domain\n . . s attribId=$increment(^MDB(keyId,\"domains\",domainId,\"attribs\"))\n . . s ^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)=name\n . . s ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",namex,attribId)=\"\"\n . s valueId=$$getAttributeValueId(keyId,domainId,itemId,attribId,value)\n . i 'replace,valueId'=\"\" q  ; Not allowed to have more than one attribute with the same name and value\n . i replace d\n . . ; first remove any existing values for this attribute name\n . . f  s valueId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)) q:valueId=\"\"  d\n . . . s xvalue=^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",xvalue,valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)\n . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\")\n . ; now add the new attribute name/value pair\n . s valueId=$increment(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\"))\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)=value\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",valuex,valueId)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,valuex,itemId)=\"\"\n ;\n d updateDomainMetaData(keyId,domainId)\n QUIT $$end(startTime,.boxUsage)\n ;\nbatchPutItem(keyId,domainId,itemName,attributesJSON)\n ;\n n attribId,attributes,error,itemId,name,namex,no,replace,value,valueId,valuex,xvalue\n ;\n ;d trace^zmwire(\"batchPutItem: keyid=\"_keyId_\"; domainId=\"_domainId_\"; itemName=\"_itemName_\"; attributes=\"_attributesJSON)\n s itemName=$g(itemName)\n i itemName=\"\" QUIT 0\n s itemId=$$getItemId(keyId,domainId,itemName)\n i itemId=\"\" d\n . ; add Item to Domain if it's new\n . n itemNamex\n . s itemNamex=$e(itemName,1,$$indexLength())\n . s itemId=$increment(^MDB(keyId,\"domains\",domainId,\"items\"))\n . s ^MDB(keyId,\"domains\",domainId,\"itemIndex\",itemNamex,itemId)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId)=itemName\n . s ^MDB(keyId,\"domains\",domainId,\"attribs\",0)=\"itemName()\"\n . s ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",\"itemName()\",0)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\")=1\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\",1)=itemName\n . s ^MDB(keyId,\"domains\",domainId,\"queryIndex\",0,itemNamex,itemId)=\"\"\n ;\n s error=$$parseJSON^zmwire(attributesJSON,.attributes,1)\n ;\n ; attributes(no,\"name\")=attribute name\n ; attributes(no,\"value\")=attribute value\n ; attributes(no,\"replace\")=1\n ;\n s no=\"\"\n f  s no=$o(attributes(no)) q:no=\"\"  d\n . s name=$g(attributes(no,\"name\"))\n . s value=$g(attributes(no,\"value\"))\n . i value=\"\" s value=$c(31)\n . s replace=+$g(attributes(no,\"replace\"))\n . s namex=$e(name,1,$$indexLength())\n . s valuex=$e(value,1,$$indexLength())\n . s attribId=$$getAttributeId(keyId,domainId,name)\n . i attribId=\"\" d\n . . ; add new attribute name to the domain\n . . s attribId=$increment(^MDB(keyId,\"domains\",domainId,\"attribs\"))\n . . s ^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)=name\n . . s ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",namex,attribId)=\"\"\n . s valueId=$$getAttributeValueId(keyId,domainId,itemId,attribId,value)\n . i 'replace,valueId'=\"\" q  ; Not allowed to have more than one attribute with the same name and value\n . i replace d\n . . ; first remove any existing values for this attribute name\n . . f  s valueId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)) q:valueId=\"\"  d\n . . . s xvalue=^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",xvalue,valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)\n . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\")\n . ; now add the new attribute name/value pair\n . s valueId=$increment(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\"))\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)=value\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",valuex,valueId)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,valuex,itemId)=\"\"\n QUIT 1\n ;\ngetAttributes(keyId,domainName,itemName,attributes,requestId,boxUsage,suppressBoxUsage)\n ;\n n attribId,attrNo,domainId,itemId,name,startTime,value,valueId,valueNo\n ;\n s requestId=\"\"\n i '$g(suppressBoxUsage) s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s domainId=$$getDomainId(keyId,domainName)\n i domainId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchDomain\",\"The specified domain does not exist.\")\n s itemName=$g(itemName)\n i itemName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"ItemName\")\n s itemId=$$getItemId(keyId,domainId,itemName)\n i itemId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchItemName\",\"The specified ItemName does not exist.\")\n ;\n ; attributes(no)=attribute name\n ; attributes(no,\"value\",vno)=attribute value\n ;\n i '$d(attributes) d\n . s name=\"\",attrNo=0\n . f  s name=$o(^MDB(keyId,\"domains\",domainId,\"attribsIndex\",name)) q:name=\"\"  d \n . . s attribId=0\n . . f  s attribId=$o(^MDB(keyId,\"domains\",domainId,\"attribsIndex\",name,attribId)) q:attribId=\"\"  d\n . . . i '$d(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId)) q\n . . . s attrNo=attrNo+1\n . . . s attributes(attrNo)=^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)\n . . . s valueId=\"\",valueNo=0\n . . . f  s valueId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)) q:valueId=\"\"  d\n . . . . s value=^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)\n . . . . s valueNo=valueNo+1\n . . . . i value=$c(31) s value=\"\"\n . . . . s attributes(attrNo,\"value\",valueNo)=value\n e  d\n . s attrNo=\"\"\n . f  s attrNo=$o(attributes(attrNo)) q:attrNo=\"\"  d\n . . s name=attributes(attrNo)\n . . s attribId=$$getAttributeId(keyId,domainId,name)\n . . i attribId=\"\" q\n . . s valueId=\"\",valueNo=0\n . . f  s valueId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)) q:valueId=\"\"  d\n . . . s value=^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)\n . . . s valueNo=valueNo+1\n . . . i value=$c(31) s value=\"\"\n . . . s attributes(attrNo,\"value\",valueNo)=value\n . . . ;i $g(^zewd(\"trace\")) d trace($h_\": attributes(\"_attrNo_\",value,\"_valueNo_\")=\"_value)\n ;\n i $g(suppressBoxUsage) QUIT \"\"\n QUIT $$end(startTime,.boxUsage)\n ;\ndeleteAttributes(keyId,domainName,itemName,attributes,requestId,boxUsage)\n ;\n n attribId,attrNo,domainId,itemId,name,namex,startTime,value,valueId,valueNo,valuex\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s domainId=$$getDomainId(keyId,domainName)\n i domainId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchDomain\",\"The specified domain does not exist.\")\n s itemName=$g(itemName)\n i itemName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"ItemName\")\n s itemId=$$getItemId(keyId,domainId,itemName)\n i itemId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchItemName\",\"The specified ItemName does not exist.\")\n i '$d(attributes) d\n . ; delete all attributes for this item, first the associated queryIndex records\n . s attribId=\"\"\n . f  s attribId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId)) q:attribId=\"\"  d\n . . s valuex=\"\"\n . . f  s valuex=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",valuex)) q:valuex=\"\"  d\n . . . k ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,valuex,itemId)\n . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId)\n . s namex=$e(itemName,1,$$indexLength())\n . k ^MDB(keyId,\"domains\",domainId,\"itemIndex\",namex,itemId)\n e  d\n . ;delete the specified attribute name/value pairs\n . ; attributes(no)=name\n . ; attributes(no,\"value\",vno)=value\n . s attrNo=\"\"\n . f  s attrNo=$o(attributes(attrNo)) q:attrNo=\"\"  d\n . . s name=$g(attributes(attrNo))\n . . i name=\"\" q\n . . s attribId=$$getAttributeId(keyId,domainId,name)\n . . i attribId=\"\" q\n . . s valueNo=\"\"\n . . f  s valueNo=$o(attributes(attrNo,\"value\",valueNo)) q:valueNo=\"\"  d\n . . . s value=attributes(attrNo,\"value\",valueNo)\n . . . s valueId=$$getAttributeValueId(keyId,domainId,itemId,attribId,value)\n . . . i valueId=\"\" q\n . . . ; remove specified value\n . . . s valuex=$e(value,1,$$indexLength())\n . . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",valuex,valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,valuex,itemId)\n . . ; if no values are left, completely remove attribute from item\n . . i $o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",\"\"))=\"\" d\n . . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\")\n . . ; if no references left to this attribute name, remove the attribute name\n . . i '$d(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId)) d\n . . . s namex=$e(name,1,$$indexLength())\n . . . k ^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",namex,attribId)\n . ; if no attributes are left, remove the item\n . i $o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",\"\"))=\"\" d\n . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId)\n . . s namex=$e(itemName,1,$$indexLength())\n . . k ^MDB(keyId,\"domains\",domainId,\"itemIndex\",namex,itemId)\n . . k ^MDB(keyId,\"domains\",domainId,\"attribs\")\n . . k ^MDB(keyId,\"domains\",domainId,\"attribsIndex\")\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\nquery(keyId,domainName,queryExpression,maxNoOfItems,nextToken,itemList,requestId,boxUsage)\n ;\n n context,name,error,startTime,stop,token,value,xvalue\n ;\n i $zv[\"GT.M\" d\n . s context=1\n . i $d(^zewd(\"config\",\"MGWSI\")) s context=0\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"keyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s queryExpression=$g(queryExpression)\n i $g(^zewd(\"trace\"))=1 d trace(\"Query Expression=\"_queryExpression)\n s maxNoOfItems=$g(maxNoOfItems)\n k itemList\n ;\n s error=\"\"\n i $g(nextToken)'=\"\" d  QUIT error\n . n n,pos\n . s pos=$g(^MDB(keyId,\"queryResults\",\"nextToken\",nextToken))\n . i pos=\"\" s error=\"InvalidNextToken~The specified next token is not valid\" q\n . s n=0,nextToken=\"\"\n . f  s pos=$o(^MDB(keyId,\"queryResults\",\"itemList\",pos)) q:pos=\"\"  d  q:n=maxNoOfItems\n . . s n=n+1\n . . s itemList(n)=^MDB(keyId,\"queryResults\",\"itemList\",pos)\n . i pos'=\"\" d\n . . s nextToken=itemList(n)\n . . i $zv[\"GT.M\" d\n . . . s nextToken=$$B64^%ZMGWSIS(nextToken)\n . . e  d\n . . . s nextToken=$$b64Encode^MDBMCache(nextToken)\n . . s ^MDB(keyId,\"queryResults\",\"nextToken\",nextToken)=pos\n . e  d\n . . k ^MDB(keyId,\"queryResults\")\n . s error=$$end(startTime,.boxUsage)\n ;\n s nextToken=\"\"\n s error=$$runQuery(keyId,domainName,queryExpression,nextToken,.itemList)\n i error'=\"\" QUIT error\n i $g(maxNoOfItems)>0 d\n . ; add session identifier to stored records\n . k ^MDB(keyId,\"queryResults\")\n . m ^MDB(keyId,\"queryResults\",\"itemList\")=itemList\n . ;i queryExpression[\"sort \" s ^MDB(keyId,\"queryResults\",\"sorted\")=1\n . k itemList\n . s n=0,pos=\"\"\n . f  s pos=$o(^MDB(keyId,\"queryResults\",\"itemList\",pos)) q:pos=\"\"  d  q:n=maxNoOfItems\n . . s n=n+1\n . . s itemList(n)=^MDB(keyId,\"queryResults\",\"itemList\",pos)\n . i pos'=\"\" d\n . . s nextToken=itemList(n)\n . . i $zv[\"GT.M\" d\n . . . s nextToken=$$B64^%ZMGWSIS(nextToken,context)\n . . e  d\n . . . s nextToken=$$b64Encode^MDBMCache(nextToken)\n . . s ^MDB(keyId,\"queryResults\",\"nextToken\",nextToken)=pos\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\n ;\n ;  MDB Server side response to incoming REST requests\n ;\nmgwsiResponse(cgi,data)\n ; m_apache HTTP entry point: normalise to WebLink interface\n n %CGIEVAR,n,name,%KEY,unescName\n i $g(^zewd(\"trace\"))=1 k ^mdbcgi m ^mdbcgi=cgi\n i $g(^zewd(\"trace\"))=1 s n=$increment(^mdbdata) m ^mdbdata(n)=data\n i $g(^%zewd(\"relink\"))=1,'$d(^%zewd(\"relink\",\"process\",$j)) s ok=$$relink^%zewdGTMRuntime()\n m %CGIEVAR=cgi\n s name=\"\"\n f  s name=$o(data(name)) q:name=\"\"  d\n . i name=\"$CONTENT\" q\n . s unescName=$$urlDecode(name)\n . s %KEY(unescName)=$$urlDecode($g(data(name,1)))\n . i %KEY(unescName)[$c(13,10) s %KEY(unescName)=$$replace(%KEY(unescName),$c(13,10),\"\")\n d response\n QUIT\n ;\nresponse\n i $d(%KEY) d\n . ; WebLink access entry point here\n . n action,attributes,AWSAcessKeyId,boxUsage,db,error,hash,itemsAndAttrs,keyId\n . n requestId,secretKey,signatureMethod,signatureVersion,stringToSign\n . ;\n . ;k ^rltKey m ^rltKey=%KEY\n . s db=$g(%KEY(\"db\"))\n . i db=\"\" s db=\"mdb\" ;,%KEY(\"db\")=db\n . s action=$g(%KEY(\"Action\"))\n . i $g(^zewd(\"trace\"))=1 d\n . . n i\n . . d trace(\"MDB request processing for \"_action_\": started at \"_$h_\"; process: \"_$j)\n . . s i=$increment(^mdbKey)\n . . m ^mdbKey(i)=%KEY\n . i action=\"Initialise\"!(action=\"initialise\")!(action=\"Initialize\")!(action=\"initialize\") d  QUIT\n . . s %KEY(\"db\")=db\n . . i $d(^MDBUAF(\"administrator\")) d errorResponse(\"InvalidAction\",\"M DB has already been initialised\") q\n . . s error=$$initialise(.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse(\"InvalidConfigurationFile\",error) q\n . . d createResponse(action,requestId,boxUsage)\n . i action=\"InstallMDBX\" d  QUIT\n . . s %KEY(\"db\")=db\n . . s error=$$installMDBX(.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse(\"InvalidInstallRequest\",error) q\n . . d createResponse(action,requestId,boxUsage)\n . i action=\"InstallMDBM\" d  QUIT\n . . s %KEY(\"db\")=db\n . . s error=$$installMDBM(.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse(\"InvalidInstallRequest\",error) q\n . . d createResponse(action,requestId,boxUsage)\n . i $g(%KEY(\"MDBToken\"))'=\"\" d  q:error\n . . n keyId\n . . s error=\"\"\n . . s keyId=$$authenticate^MDBSession(%KEY(\"MDBToken\"))\n . . i keyId=\"\" s error=1 d errorResponse(\"InvalidTokenId\",\"The Access Token you provided does not exist in our records\") QUIT\n . e  d  q:error=1\n . . s error=\"\"\n . . s signatureVersion=+$g(%KEY(\"SignatureVersion\"))\n . . s signatureMethod=$g(%KEY(\"SignatureMethod\"))\n . . s stringToSign=$$createResponseStringToSign(signatureVersion)\n . . s keyId=$g(%KEY(\"AWSAccessKeyId\"))\n . . i keyId=\"\" s keyId=$g(%KEY(\"MDBAccessKeyId\"))\n . . i action=\"AddUser\" d  i error'=\"\" QUIT\n . . . s error=\"\"\n . . . i keyId=$g(^MDBUAF(\"administrator\")) q\n . . . d errorResponse(\"InvalidAdministratorKey\",\"The Access Key Id was not that of the Administrator\")\n . . . s error=1\n . . i keyId=\"\" s error=1 d errorResponse(\"InvalidClientTokenId\",\"The Access Key Id you provided does not exist in our records\") QUIT\n . . i $g(^MDBUAF(\"keys\",keyId))=\"\" s error=1 d errorResponse(\"InvalidClientTokenId\",\"The Access Key Id you provided does not exist in our records\") QUIT\n . . i $g(%KEY(\"Signature\"))=\"\" s error=1 d errorResponse(\"SignatureDoesNotMatch\",\"The request signature we calculated does not match the signature you provided.  Check your Secret Access Key and signing method.  Consult the service documentation for details\") QUIT\n . . s secretKey=$g(^MDBUAF(\"keys\",keyId))\n . . s hash=$$getSignedString(stringToSign,secretKey,signatureMethod)\n . . i $g(^zewd(\"trace\"))=1 d trace($h_\": string to sign:\"_stringToSign)\n . . i $g(^zewd(\"trace\"))=1 d trace($h_\": hash=\"_hash_\"; signature rcvd=\"_%KEY(\"Signature\"))\n . . i hash'=%KEY(\"Signature\") s error=1 d errorResponse(\"SignatureDoesNotMatch\",\"The request signature we calculated does not match the signature you provided.  Check your Secret Access Key and signing method.  Consult the service documentation for details\") QUIT\n . ;\n . ; Security OK\n . ;\n . ;d trace(\"security ok: db=\"_db)\n . i $g(^MDBAPI(db,action))'=\"\" d  QUIT\n . . ; Custom extension gateway.  Method should return output in response(lineNo)\n . . ; any error should be returned as errorCode~errorText\n . . n doll,lineNo,method,no,requestId,response,startTime,x\n . . s method=^MDBAPI(db,action)\n . . s x=\"s error=$$\"_method_\"(.%KEY,.response)\"\n . . s requestId=$$init(.startTime)\n . . x x\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . i $$end(startTime,.boxUsage)\n . . s lineNo=1\n . . i $g(%KEY(\"mdbRawOutput\"))'=\"true\",$g(%KEY(\"OutputFormat\"))'=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"<?xml version='1.0'?>\"_$c(13,10),lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"<\"_action_\"Response xmlns=\"\"http://\"_db_\".mgateway.com/doc/2009-06-05/\"\">\",lineNo=lineNo+1\n . . s no=\"\"\n . . f  s no=$o(response(no)) q:no=\"\"  d\n . . . s ^CacheTempEWD($j,lineNo)=response(no),lineNo=lineNo+1\n . . d createResponse(db_\":\"_action,requestId,boxUsage) QUIT\n . ;\n . i db=\"mdb\" s %KEY(\"db\")=\"mdb\"\n . i action=\"AddUser\" d  QUIT\n . . n userKeyId,userSecretKey\n . . s userKeyId=$g(%KEY(\"UserAccessKeyId\"))\n . . i userKeyId=\"\" d errorResponse(\"InvalidKeyId\",\"The new user Access Key Id was not defined\") QUIT\n . . s userSecretKey=$g(%KEY(\"UserSecretKey\"))\n . . i userSecretKey=\"\" d errorResponse(\"InvalidSecretKey\",\"The new user Secret Key was not defined\") QUIT\n . . s error=$$addUser(userKeyId,userSecretKey,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"GetToken\" d  QUIT\n . . n boxUsage,requestId,startTime,token\n . . s requestId=$$init(.startTime)\n . . s token=$$createNewSession^MDBSession(keyId,1200)\n . . i $$end(startTime,.boxUsage)\n . . d createResponse(action,requestId,boxUsage)\n . ;\n . i action=\"CreateDomain\" d  QUIT\n . . n domainName,resp\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s error=$$createDomain(keyId,domainName,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"DeleteDomain\" d  QUIT\n . . n domainName,resp\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s error=$$deleteDomain(keyId,domainName,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"ListDomains\" d  QUIT\n . . ;d trace(\"in ListDomains\")\n . . n domainList,maxNoOfDomains,nextToken,resp\n . . s maxNoOfDomains=$g(%KEY(\"MaxNumberOfDomains\"))\n . . s nextToken=$g(%KEY(\"NextToken\"))\n . . s error=$$listDomains(keyId,maxNoOfDomains,.nextToken,.domainList,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"DomainMetadata\" d  QUIT\n . . n domainName,metaData\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s error=$$domainMetadata(keyId,domainName,.metaData,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"PutAttributes\" d  QUIT\n . . n domainName,error,i,itemName,name,paramName,paramValue,replace,start,stop\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s itemName=$g(%KEY(\"ItemName\"))\n . . s stop=0\n . . s name=$o(%KEY(\"Attribute.\"))\n . . s start=$p(name,\".\",2)\n . . s error=\"\"\n . . f i=start:1 d  q:stop\n . . . s paramName=\"Attribute.\"_i_\".Name\"\n . . . i '$d(%KEY(paramName)) s stop=1 q\n . . . s paramValue=\"Attribute.\"_i_\".Value\"\n . . . ;i '$d(%KEY(paramValue)) s stop=1 q\n . . . i '$d(%KEY(paramValue)) s error=\"MissingParameter~Attribute Value missing for Attribute Name='\"_%KEY(paramName),stop=1 q\n . . . ;i %KEY(paramValue)=\"\" s error=\"MissingParameter~Attribute Value missing for Attribute Name='\"_%KEY(paramName),stop=1\n . . . s replace=$g(%KEY(\"Attribute.\"_i_\".Replace\"))\n . . . i replace=\"true\" s replace=1\n . . . ; attributes(no,\"name\")=attribute name\n . . . ; attributes(no,\"value\")=attribute value\n . . . ; attributes(no,\"replace\")=1\n . . . s attributes(i,\"name\")=%KEY(paramName)\n . . . s attributes(i,\"value\")=%KEY(paramValue)\n . . . i replace s attributes(i,\"replace\")=1\n . . i error=\"\" s error=$$putAttributes(keyId,domainName,itemName,.attributes,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"GetAttributes\" d  QUIT\n . . n domainName,error,i,itemName,name,paramName,paramValue,replace,start,stop\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s itemName=$g(%KEY(\"ItemName\"))\n . . s stop=0\n . . s name=$o(%KEY(\"AttributeName.\"))\n . . s start=$p(name,\".\",2)\n . . s error=\"\"\n . . k attributes\n . . f i=start:1 d  q:stop\n . . . s paramName=\"AttributeName.\"_i\n . . . i '$d(%KEY(paramName)) s stop=1 q\n . . . s attributes(i)=%KEY(paramName)\n . . . ;s attributes(1)=\"test\"\n . . s error=$$getAttributes(keyId,domainName,itemName,.attributes,.requestId,.boxUsage)\n . . ; attributes(no)=attribute name\n . . ; attributes(no,\"value\",vno)=attribute value\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage)\n . ;\n . i action=\"DeleteAttributes\" d  QUIT\n . . n attributes,domainName,error,i,itemName,name,paramName,paramValue,start,stop\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s itemName=$g(%KEY(\"ItemName\"))\n . . s stop=0\n . . s name=$o(%KEY(\"Attribute.\"))\n . . s start=$p(name,\".\",2)\n . . s error=\"\"\n . . ; attributes(no)=name\n . . ; attributes(no,\"value\",vno)=value\n . . k attributes\n . . f i=start:1 d  q:stop\n . . . s paramName=\"Attribute.\"_i_\".Name\"\n . . . i '$d(%KEY(paramName)) s stop=1 q\n . . . s name=%KEY(paramName)\n . . . s attributes(i)=name\n . . . s paramValue=\"Attribute.\"_i_\".Value\"\n . . . i '$d(%KEY(paramValue)) s stop=1 q\n . . . i %KEY(paramValue)=\"\" s error=\"MissingParameter~Attribute Value missing for Attribute Name='\"_%KEY(paramName),stop=1\n . . . s attributes(i,\"value\",1)=%KEY(paramValue)\n . . i error=\"\" s error=$$deleteAttributes(keyId,domainName,itemName,.attributes,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"Query\" d  QUIT\n . . n domainName,error,itemList,maxNoOfItems,nextToken,queryExpression\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s queryExpression=$g(%KEY(\"QueryExpression\"))\n . . s maxNoOfItems=$g(%KEY(\"MaxNumberOfItems\"))\n . . s nextToken=$g(%KEY(\"NextToken\"))\n . . s error=$$query(keyId,domainName,queryExpression,maxNoOfItems,.nextToken,.itemList,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"QueryWithAttributes\" d  QUIT\n . . n attribs,bx,domainName,error,ex,i,name,itemList,itemName,itemsAndAttrs,maxNoOfItems,name,nextToken\n . . n paramName,pos,queryExpression,rx,sorted,start,stop,sub\n . . ;\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s queryExpression=$g(%KEY(\"QueryExpression\"))\n . . s maxNoOfItems=$g(%KEY(\"MaxNumberOfItems\"))\n . . s nextToken=$g(%KEY(\"NextToken\"))\n . . s name=$o(%KEY(\"AttributeName.\"))\n . . s start=$p(name,\".\",2)\n . . s error=\"\",stop=0\n . . f i=start:1 d  q:stop\n . . . s paramName=\"AttributeName.\"_i\n . . . i '$d(%KEY(paramName)) s stop=1 q\n . . . s attributes(i)=%KEY(paramName)\n . . s error=$$query(keyId,domainName,queryExpression,maxNoOfItems,.nextToken,.itemList,.requestId,.boxUsage)\n . . s pos=\"\"\n . . f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . . . s itemName=itemList(pos)\n . . . k attribs\n . . . m attribs=attributes\n . . . s ex=$$getAttributes(keyId,domainName,itemName,.attribs,.rx,.bx,1)\n . . . m itemsAndAttrs(pos)=attribs\n . . . s itemsAndAttrs(pos)=itemName\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"Select\" d  QUIT\n . . n attribs,attributes,boxUsage,bx,domainName,error,ex,itemList,itemName,nextToken\n . . n pos,requestId,rx,selectExpression,startTime\n . . ;\n . . s requestId=$$init(.startTime)\n . . s selectExpression=$g(%KEY(\"SelectExpression\"))\n . . s nextToken=$g(%KEY(\"NextToken\"))\n . . i $g(^zewd(\"trace\"))=1 d trace($h_\": Action Select, entering runSelect. keyId=\"_keyId_\"; selectExpression=\"_selectExpression)\n . . s error=$$runSelect(keyId,selectExpression,.itemList,.attributes,.domainName)\n . . i $g(^zewd(\"trace\")) d trace($h_\": finished runSelect\")\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . i $g(attributes)=\"count(*)\" d\n . . . n count\n . . . s itemsAndAttrs(1)=\"Domain\"\n . . . s itemsAndAttrs(1,1)=\"Count\"\n . . . s pos=\"\",count=0\n . . . f  s pos=$o(itemList(pos)) q:pos=\"\"  s count=count+1\n . . . s itemsAndAttrs(1,1,\"value\",1)=count\n . . e  d\n . . . s pos=\"\"\n . . . ;i $g(^zewd(\"trace\")) d trace($h_\": pos=''\")\n . . . f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . . . . ;i $g(^zewd(\"trace\")) d trace($h_\": pos=\"_pos)\n . . . . s itemName=itemList(pos)\n . . . . k attribs\n . . . . m attribs=attributes\n . . . . ;i $g(^zewd(\"trace\")) d trace($h_\": calling getAttributes for keyId=\"_keyId_\"; domainName=\"_domainName_\"; itemName \"_itemName)\n . . . . s ex=$$getAttributes(keyId,domainName,itemName,.attribs,.rx,.bx,1)\n . . . . ;i $g(^zewd(\"trace\")) d trace($h_\": finished getAttributes\")\n . . . . m itemsAndAttrs(pos)=attribs\n . . . . s itemsAndAttrs(pos)=itemName\n . . ;i $g(^zewd(\"trace\")) d trace($h_\": about to call $$end\")\n . . i $$end(startTime,.boxUsage)\n . . ;i $g(^zewd(\"trace\")) d trace($h_\": about to start createResponse\")\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . d errorResponse(\"InvalidAction\",\"The action \"_action_\" is not valid for this web service\") QUIT\n i $g(^zewd(\"trace\"))=1 d trace(\"MDB request processing ended at \"_$h)\n QUIT\n ;\ncreateResponse(action,requestId,boxUsage)\n ;\n n len,lineNo\n ;\n ;i $g(^zewd(\"trace\"))=1 d trace($h_\": Commencing createResponse\")\n i '$d(%KEY(\"isCSP\")) d\n . w \"HTTP/1.0 200 OK\"_$c(13,10)\n . w \"Date: \"_$$inetDate^%zewdAPI($h)_\" \"_$tr($g(^MDBConfig(\"GMTOffset\")),\":\",\"\")_$c(13,10)\n . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . w \"Content-type: application/json\"_$c(13,10)\n . e  d\n . . w \"Content-type: text/xml\"_$c(13,10)\n s lineNo=1\n i $g(%KEY(\"OutputFormat\"))'=\"JSON\" d\n . i $g(%KEY(\"db\"))=\"mdb\" d\n . . n apiVersion\n . . k ^CacheTempEWD($j)\n . . s lineNo=1\n . . s ^CacheTempEWD($j,lineNo)=\"<?xml version='1.0'?>\"_$c(13,10),lineNo=lineNo+1\n . . s apiVersion=$g(%KEY(\"Version\")) i apiVersion=\"\" s apiVersion=\"2009-04-15\"\n . . s ^CacheTempEWD($j,lineNo)=\"<\"_action_\"Response xmlns=\"\"http://sdb.amazonaws.com/doc/\"_apiVersion_\"/\"\">\",lineNo=lineNo+1\n . e  d\n . . s action=$p(action,\":\",2)\n . . s lineNo=$o(^CacheTempEWD($j,\"\"),-1)+1\n ;\n i action=\"GetToken\" d\n . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . s ^CacheTempEWD($j,lineNo)=\"{token:\"\"\"_token_\"\"\"}\"\n . e  d\n . . s ^CacheTempEWD($j,lineNo)=\"<GetTokenResult>\"_token_\"</GetTokenResult>\",lineNo=lineNo+1\n ;\n i action=\"ListDomains\" d\n . i '$d(domainList) d\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"[]\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<ListDomainsResult />\",lineNo=lineNo+1\n . e  d\n . . n comma,no\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"[\",lineNo=lineNo+1\n . . . s no=\"\",comma=\"\"\n . . . f  s no=$o(domainList(no)) q:no=\"\"  d\n . . . . s ^CacheTempEWD($j,lineNo)=comma_\"\"\"\"_domainList(no)_\"\"\"\",lineNo=lineNo+1,comma=\",\"\n . . . s ^CacheTempEWD($j,lineNo)=\"]\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<ListDomainsResult>\",lineNo=lineNo+1\n . . . s no=\"\"\n . . . f  s no=$o(domainList(no)) q:no=\"\"  d\n . . . . s ^CacheTempEWD($j,lineNo)=\"<DomainName>\"_domainList(no)_\"</DomainName>\",lineNo=lineNo+1\n . . . i $g(nextToken)'=\"\" s ^CacheTempEWD($j,lineNo)=\"<NextToken>\"_nextToken_\"</NextToken>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</ListDomainsResult>\",lineNo=lineNo+1\n ;\n i action=\"CreateDomain\",$g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"{ok:true}\",lineNo=lineNo+1\n ;\n i action=\"DeleteAttributes\",$g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"{ok:true}\",lineNo=lineNo+1\n ;\n i action=\"DeleteDomain\",$g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"{ok:true}\",lineNo=lineNo+1\n ;\n i action=\"PutAttributes\",$g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"{ok:true}\",lineNo=lineNo+1\n ;\n i action=\"DomainMetadata\" d\n . i '$d(metaData) d\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"{}\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<DomainMetadataResult />\",lineNo=lineNo+1\n . e  d\n . . n comma,name\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"{\",lineNo=lineNo+1\n . . . s name=\"\",comma=\"\"\n . . . f  s name=$o(metaData(name)) q:name=\"\"  d\n . . . . s ^CacheTempEWD($j,lineNo)=comma_name_\":\"_metaData(name),lineNo=lineNo+1,comma=\",\"\n . . . s ^CacheTempEWD($j,lineNo)=\"}\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<DomainMetadataResult>\",lineNo=lineNo+1\n . . . s name=\"\"\n . . . f  s name=$o(metaData(name)) q:name=\"\"  d\n . . . . s ^CacheTempEWD($j,lineNo)=\"<\"_name_\">\"_metaData(name)_\"</\"_name_\">\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</DomainMetadataResult>\",lineNo=lineNo+1\n ;\n i action=\"GetAttributes\",%KEY(\"db\")=\"mdb\" d\n . i '$d(attributes) d\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"{}\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<GetAttributesResult />\",lineNo=lineNo+1\n . e  d\n . . n acomma,comma,count,name,no,quote,stop,value,valueNo\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"{\",lineNo=lineNo+1\n . . . s no=\"\",comma=\"\"\n . . . f  s no=$o(attributes(no)) q:no=\"\"  d\n . . . . s name=attributes(no)\n . . . . s valueNo=\"\",count=0,stop=0\n . . . . f  s valueNo=$o(attributes(no,\"value\",valueNo)) q:valueNo=\"\"  d  q:stop\n . . . . . s count=count+1 i count>1 s stop=1\n . . . . i count=1 d\n . . . . . s ^CacheTempEWD($j,lineNo)=comma_name_\":\",acomma=\"\",comma=\",\",lineNo=lineNo+1\n . . . . e  d\n . . . . . s ^CacheTempEWD($j,lineNo)=comma_name_\":[\",acomma=\"\",comma=\",\",lineNo=lineNo+1\n . . . . s valueNo=\"\"\n . . . . f  s valueNo=$o(attributes(no,\"value\",valueNo)) q:valueNo=\"\"  d\n . . . . . s value=attributes(no,\"value\",valueNo)\n . . . . . s quote=\"\"\"\" i $$numeric(value) s quote=\"\"\n . . . . . s ^CacheTempEWD($j,lineNo)=acomma_quote_value_quote,lineNo=lineNo+1,acomma=\",\"\n . . . . i count>1 s ^CacheTempEWD($j,lineNo)=\"]\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"}\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<GetAttributesResult>\",lineNo=lineNo+1\n . . . s no=\"\"\n . . . f  s no=$o(attributes(no)) q:no=\"\"  d\n . . . . s name=attributes(no)\n . . . . s valueNo=\"\"\n . . . . f  s valueNo=$o(attributes(no,\"value\",valueNo)) q:valueNo=\"\"  d\n . . . . . s value=attributes(no,\"value\",valueNo)\n . . . . . s value=$$escape(value)\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Attribute>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Name>\"_name_\"</Name>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Value>\"_value_\"</Value>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"</Attribute>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</GetAttributesResult>\",lineNo=lineNo+1\n ;\n i action=\"Select\" d\n . ;i $g(^zewd(\"trace\"))=1 d trace($h_\": action=Select\")\n . i '$d(itemsAndAttrs) d  q\n . . s ^CacheTempEWD($j,lineNo)=\"<SelectResult />\",lineNo=lineNo+1\n . e  d\n . . n attrName,attrNo,attrValue,attrValueNo,itemName,itemNo\n . . s ^CacheTempEWD($j,lineNo)=\"<SelectResult>\",lineNo=lineNo+1\n . . s itemNo=\"\"\n . . f  s itemNo=$o(itemsAndAttrs(itemNo)) q:itemNo=\"\"  d\n . . . s itemName=itemsAndAttrs(itemNo)\n . . . s ^CacheTempEWD($j,lineNo)=\"<Item>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"<Name>\"_itemName_\"</Name>\",lineNo=lineNo+1\n . . . s attrNo=\"\"\n . . . f  s attrNo=$o(itemsAndAttrs(itemNo,attrNo)) q:attrNo=\"\"  d\n . . . . s attrName=itemsAndAttrs(itemNo,attrNo)\n . . . . s attrValueNo=\"\"\n . . . . f  s attrValueNo=$o(itemsAndAttrs(itemNo,attrNo,\"value\",attrValueNo)) q:attrValueNo=\"\"  d\n . . . . . s attrValue=itemsAndAttrs(itemNo,attrNo,\"value\",attrValueNo)\n . . . . . s attrValue=$$escape(attrValue)\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Attribute>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Name>\"_attrName_\"</Name><Value>\"_attrValue_\"</Value>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"</Attribute>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</Item>\",lineNo=lineNo+1\n . . s ^CacheTempEWD($j,lineNo)=\"</SelectResult>\",lineNo=lineNo+1\n . ;i $g(^zewd(\"trace\"))=1 d trace($h_\": finished action=Select\")\n ;\n i action=\"Query\" d\n . i '$d(itemList) d\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"[]\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<QueryResult />\",lineNo=lineNo+1\n . e  d\n . . n comma,position,quotes\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"[\",lineNo=lineNo+1\n . . . s position=\"\",comma=\"\"\n . . . f  s position=$o(itemList(position)) q:position=\"\"  d\n . . . . s quotes=\"\"\"\" i $$numeric(itemList(position)) s quotes=\"\"\n . . . . s ^CacheTempEWD($j,lineNo)=comma_quotes_itemList(position)_quotes,lineNo=lineNo+1,comma=\",\"\n . . . s ^CacheTempEWD($j,lineNo)=\"]\",lineNo=lineNo+1\n . . e  d\n . . . n position\n . . . s ^CacheTempEWD($j,lineNo)=\"<QueryResult>\",lineNo=lineNo+1\n . . . s position=\"\"\n . . . f  s position=$o(itemList(position)) q:position=\"\"  d\n . . . . s ^CacheTempEWD($j,lineNo)=\"<ItemName>\"_itemList(position)_\"</ItemName>\",lineNo=lineNo+1\n . . . i $g(nextToken)'=\"\" s ^CacheTempEWD($j,lineNo)=\"<NextToken>\"_nextToken_\"</NextToken>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</QueryResult>\",lineNo=lineNo+1\n ;\n i action=\"QueryWithAttributes\" d\n . i '$d(itemsAndAttrs) d  q\n . . s ^CacheTempEWD($j,lineNo)=\"<QueryWithAttributesResult />\",lineNo=lineNo+1\n . e  d\n . . n attrName,attrNo,attrValue,attrValueNo,itemName,itemNo\n . . s ^CacheTempEWD($j,lineNo)=\"<QueryWithAttributesResult>\",lineNo=lineNo+1\n . . s itemNo=\"\"\n . . f  s itemNo=$o(itemsAndAttrs(itemNo)) q:itemNo=\"\"  d\n . . . s itemName=itemsAndAttrs(itemNo)\n . . . s ^CacheTempEWD($j,lineNo)=\"<Item>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"<Name>\"_itemName_\"</Name>\",lineNo=lineNo+1\n . . . s attrNo=\"\"\n . . . f  s attrNo=$o(itemsAndAttrs(itemNo,attrNo)) q:attrNo=\"\"  d\n . . . . s attrName=itemsAndAttrs(itemNo,attrNo)\n . . . . s attrValueNo=\"\"\n . . . . f  s attrValueNo=$o(itemsAndAttrs(itemNo,attrNo,\"value\",attrValueNo)) q:attrValueNo=\"\"  d\n . . . . . s attrValue=itemsAndAttrs(itemNo,attrNo,\"value\",attrValueNo)\n . . . . . s attrValue=$$escape(attrValue)\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Attribute>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Name>\"_attrName_\"</Name><Value>\"_attrValue_\"</Value>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"</Attribute>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</Item>\",lineNo=lineNo+1\n . . s ^CacheTempEWD($j,lineNo)=\"</QueryWithAttributesResult>\",lineNo=lineNo+1\n ;\n i $g(%KEY(\"db\"))=\"mdb\",$g(%KEY(\"OutputFormat\"))'=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"<ResponseMetadata>\",lineNo=lineNo+1\n . s ^CacheTempEWD($j,lineNo)=\"<RequestId>\"_$g(requestId)_\"</RequestId>\",lineNo=lineNo+1\n . s ^CacheTempEWD($j,lineNo)=\"<BoxUsage>\"_$g(boxUsage)_\"</BoxUsage>\",lineNo=lineNo+1\n . s ^CacheTempEWD($j,lineNo)=\"</ResponseMetadata>\",lineNo=lineNo+1\n i $g(%KEY(\"mdbRawOutput\"))'=\"true\",$g(%KEY(\"OutputFormat\"))'=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"</\"_action_\"Response>\"_$c(13,10),lineNo=lineNo+1\n ;\n s len=0,lineNo=\"\"\n f  s lineNo=$o(^CacheTempEWD($j,lineNo)) q:lineNo=\"\"  d\n . s len=len+$l(^CacheTempEWD($j,lineNo))\n i '$d(%KEY(\"isCSP\")) w \"Content-length: \"_len_$c(13,10,13,10) \n s lineNo=\"\"\n f  s lineNo=$o(^CacheTempEWD($j,lineNo)) q:lineNo=\"\"  d\n . w ^CacheTempEWD($j,lineNo)\n k ^CacheTempEWD($j)\n w !\n ;i $g(^zewd(\"trace\"))=1 d trace($h_\": finished createResponse\")\n QUIT\n ;\nerrorResponse(ec,em)\n ;\n n resp\n ;\n i $g(%KEY(\"OutputFormat\"))=\"JSON\" d  QUIT\n . s resp=\"400 Bad Request\"\n . i ec=\"SignatureDoesNotMatch\" s resp=\"403 Forbidden\"\n . w \"HTTP/1.0 \"_resp_$c(13,10)\n . w \"Date: \"_$$inetDate^%zewdAPI($h)_\" \"_$tr($g(^MDBConfig(\"GMTOffset\")),\":\",\"\")_$c(13,10)\n . w \"Content-type: application/json\"_$c(13,10),$c(13,10)\n . w \"{\"\"ErrorCode\"\":\"\"\"_ec_\"\"\",\"\"ErrorMessage\"\":\"\"\"_em_\"\"\"}\"_$c(13,10)\n . w !\n ;\n s resp=\"400 Bad Request\"\n i ec=\"SignatureDoesNotMatch\" s resp=\"403 Forbidden\"\n w \"HTTP/1.0 \"_resp_$c(13,10)\n w \"Date: \"_$$inetDate^%zewdAPI($h)_\" \"_$tr($g(^MDBConfig(\"GMTOffset\")),\":\",\"\")_$c(13,10)\n w \"Content-type: text/xml\"_$c(13,10),$c(13,10)\n w \"<?xml version='1.0'?>\"_$c(13,10)\n w \"<Response><Errors><Error>\"\n w \"<Code>\"_ec_\"</Code>\"\n w \"<Message>\"_em_\"</Message>\"\n i ec'=\"SignatureDoesNotMatch\",ec'=\"InvalidClientTokenId\" w \"<BoxUsage>0</BoxUsage>\"\n w \"</Error></Errors>\"\n ; Note mis-spelling of ID instead of Id to follow SimpleDB's \"feature\"!\n w \"<RequestID>\"_$$createRequestId()_\"</RequestID>\"\n w \"</Response>\"_$c(13,10)\n w !\n QUIT\n ;\ncreateResponseStringToSign(version)\n ;\n n amp,n,name,nlc,stringToSign,nvpListlc,value\n ;\n s stringToSign=\"\"\n ;\n i version=0 d  QUIT stringToSign\n . s stringToSign=$g(%KEY(\"Action\"))_$g(%KEY(\"Timestamp\"))\n ;\n i version=1 d  QUIT stringToSign\n . s n=\"\"\n . f  s n=$o(%KEY(n)) q:n=\"\"  d\n . . q:$e(n,1,3)=\"MGW\"\n . . q:n=\"Signature\"\n . . q:n=\"isCSP\"\n . . s nvpListlc($zconvert(n,\"l\"))=n\n . . ;i $zv[\"GT.M\" d\n . . ;. s nvpListlc($zconvert(n,\"l\"))=n\n . . ;e  d\n . . ;. s nvpListlc($zconvert(n,\"l\"))=n\n . s nlc=\"\"\n . f  s nlc=$o(nvpListlc(nlc)) q:nlc=\"\"  d\n . . s name=nvpListlc(nlc)\n . . s value=%KEY(name)\n . . s stringToSign=stringToSign_name_value\n ;\n i version=2 d  QUIT stringToSign\n . n location,method,url\n . s name=\"\",amp=\"\"\n . f  s name=$o(%KEY(name)) q:name=\"\"  d\n . . q:$e(name,1,3)=\"MGW\"\n . . q:name=\"Signature\"\n . . q:name=\"isCSP\"\n . . s value=$$urlEscape(%KEY(name))\n . . s stringToSign=stringToSign_amp_name_\"=\"_value\n . . s amp=\"&\"\n . s method=$g(%CGIEVAR(\"REQUEST_METHOD\"))\n . s url=$g(%CGIEVAR(\"SERVER_NAME\"))\n . s location=$g(%CGIEVAR(\"REQUEST_URI\"))\n . i location[\"?\" s location=$p(location,\"?\",1)\n . i location=\"\" d\n . . s location=\"/scripts/mgwms32.dll\"\n . . i $d(%KEY(\"isCSP\")) s location=$$baseUri^MDBMCache()\n . e  d\n . . i location[\"http://\"!(location[\"https://\") d\n . . . s location=$p(location,\"://\",2)\n . . . s location=\"/\"_$p(location,\"/\",2,2000)\n . . . s location=$p(location,\"?\",1)\n . s stringToSign=method_$c(10)_url_$c(10)_location_$c(10)_stringToSign\n . ;s stringToSign=$$replaceAll(stringToSign,$c(13,10),\"\")\n ;\n QUIT stringToSign\n ;\ncreateToken(length)\n ;\n n i,string,token\n ;\n s string=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"\n s token=\"\"\n f i=1:1:length s token=token_$e(string,($r($l(string))+1))\n QUIT token_\"=\"\n ;\ninit(startTime)\n ;\n i $g(^zewd(\"trace\")) d trace($h_\": $$init\")\n i $zv[\"GT.M\" d\n . s startTime=$$ZTS^%ZMGWSIS(1)\n e  d\n . s startTime=$zts\n s startTime=(startTime*86400)+$p(startTime,\",\",2)\n QUIT $$createRequestId()\n ;\ncreateRequestId()\n n hex,i,responseId\n s responseId=\"\" \n f i=1:1:16 d\n . s hex=$$hex($r(256))\n . i $l(hex)=1 s hex=0_hex\n . s responseId=responseId_hex\n . i i=4!(i=6)!(i=8)!(i=10) s responseId=responseId_\"-\"\n QUIT $zconvert(responseId,\"l\")\n ;i $zv[\"GT.M\" QUIT $zconvert(responseId,\"l\")\n ;QUIT $zconvert(responseId,\"l\")\n \nend(startTime,boxUsage,errorCode,parameter1,parameter2)\n ;\n n endTime,error\n ;\n i $g(^zewd(\"trace\")) d trace($h_\": $$end\")\n i $zv[\"GT.M\" d\n . s endTime=$$ZTS^%ZMGWSIS(1)\n e  d\n . s endTime=$zts\n s endTime=(endTime*86400)+$p(endTime,\",\",2)\n s boxUsage=endTime-startTime,boxUsage=$j(boxUsage,1,10)\n i $g(errorCode)=\"\" QUIT \"\"\n s error=$g(^MDBErrors(errorCode))\n i error=\"\" QUIT errorCode_\"~\"_$g(parameter1)\n i $g(parameter1)'=\"\" s $p(error,\"~\",2)=parameter1\n i $g(parameter2)'=\"\" s $p(error,\"~\",4)=parameter2\n QUIT errorCode_\"~\"_$tr(error,\"~\",\"\")\n ;\ngetSignedString(string,secretKey,signatureMethod)\n ;\n n context,hash,returnValue\n ;\n i $zv[\"GT.M\" d  QUIT returnValue\n . s context=1\n . i $d(^zewd(\"config\",\"MGWSI\")) s context=0\n . i $zconvert($g(signatureMethod),\"l\")=\"hmacsha256\" d\n . . s returnValue=$$HMACSHA256^%ZMGWSIS(string,secretKey,1,context)\n . e  d\n . . s returnValue=$$HMACSHA1^%ZMGWSIS(string,secretKey,1,context)\n ;\n QUIT $$sign^MDBMCache(signatureMethod,string,secretKey)\n ;\nrunQuery(keyId,domainName,queryExpression,nextToken,itemList)\n ;\n n domainId,error,filter,itemId,itemName,matchList,name,no,pos,stop\n ;\n ;i $g(^zewd(\"trace\")) d trace($h_\": runQuery started\")\n s error=\"\"\n s filter=\"\",stop=0\n i queryExpression[\"itemName{}\" s queryExpression=$$replaceAll(queryExpression,\"itemName{}\",\"itemName()\")\n s queryExpression=$$stripSpaces($g(queryExpression))\n s domainId=$$getDomainId(keyId,domainName)\n i $g(^zewd(\"trace\"))=1 d trace(\"runQuery: domainId=\"_domainId_\"; queryExpression=\"_queryExpression)\n i domainId=\"\" QUIT \"\"\n ;\n i queryExpression=\"\" d  QUIT error\n . s itemId=\"\",no=0\n . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . . s no=no+1\n . . s itemList(no)=^MDB(keyId,\"domains\",domainId,\"items\",itemId)\n ;\n i queryExpression[\"sort \" d  i error'=\"\" QUIT error\n . i queryExpression[\"union \"!(queryExpression[\"union[\")!(queryExpression[\"not \")!(queryExpression[\"not[\") s error=$$queryError(1)\n ;\n f  d  q:stop  q:queryExpression=\"\"  q:error'=\"\"\n . k matchList\n . s error=$$queryPredicate(.queryExpression,keyId,domainId,.matchList,.name)\n . q:error'=\"\"\n . i filter=\"\" d mergeLists(.itemList,.matchList) ;m itemList=matchList\n . i filter=\"intersection\" d\n . . s pos=\"\"\n . . f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . . . s itemName=itemList(pos)\n . . . i '$$inMatchList(.matchList,itemName) k itemList(pos)\n . . . ;i '$d(matchList(itemId)) k itemList(itemId)\n . i filter=\"union\" d mergeLists(.itemList,.matchList) ;m itemList=matchList\n . q:queryExpression=\"\"\n . s filter=\"\"\n . i $$startsWith(queryExpression,\"intersection\") d  q\n . . s queryExpression=$e(queryExpression,13,$l(queryExpression))\n . . s queryExpression=$$stripSpaces(queryExpression)\n . . s filter=\"intersection\"\n . i $$startsWith(queryExpression,\"union\") d  q\n . . s queryExpression=$e(queryExpression,6,$l(queryExpression))\n . . s queryExpression=$$stripSpaces(queryExpression)\n . . s filter=\"union\"\n . i $$startsWith(queryExpression,\"sort\") s stop=1 q\n . s error=$$queryError(2)\n ;\n i $$startsWith(queryExpression,\"sort\") d\n . n attrNo,direction,found,itemName,itemId,n,sortAttr,sortAttrId,sortedList,xvalue\n . s queryExpression=$e(queryExpression,5,$l(queryExpression))\n . s queryExpression=$$stripSpaces(queryExpression)\n . s sortAttr=$p(queryExpression,\"'\",2)\n . i sortAttr=\"\" s error=$$queryError(3) q\n . s sortAttrId=$$getAttributeId(keyId,domainId,sortAttr)\n . i sortAttrId=\"\" s error=$$queryError(4) q\n . i $g(name)'=\"\",name'=sortAttr s error=$$queryError(5) q\n . i $g(name)=\"\" d  q:error'=\"\"\n . . n no,ok\n . . s no=\"\",ok=0\n . . f  s no=$o(name(no)) q:no=\"\"  d  q:ok\n . . . i name(no)=sortAttr s ok=1 q\n . . i 'ok s error=$$queryError(6)\n . s direction=\"1\"\n . s queryExpression=$p(queryExpression,\"'\",3)\n . i queryExpression[\"desc\" s direction=\"-1\"\n . s pos=\"\"\n . ;f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . ;. s itemName=itemList(pos)\n . ;. s itemNamex=$e(itemName,1,$$indexLength())\n . ;. s sortedList(itemNamex,pos)=itemName\n . s pos=\"\"\n . f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . . s itemName=itemList(pos)\n . . s itemId=$$getItemId(keyId,domainId,itemName)\n . . s attrNo=\"\"\n . . f  s attrNo=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",sortAttrId,\"value\",attrNo)) q:attrNo=\"\"  d\n . . . s xvalue=^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",sortAttrId,\"value\",attrNo)\n . . . s sortedList(xvalue,itemName)=\"\"\n . k itemList\n . s n=0\n . s xvalue=\"\"\n . f  s xvalue=$o(sortedList(xvalue),direction) q:xvalue=\"\"  d\n . . s itemName=\"\"\n . . f  s itemName=$o(sortedList(xvalue,itemName)) q:itemName=\"\"  d\n . . . i $d(found(itemName)) q\n . . . s n=n+1\n . . . s itemList(n)=itemName\n . . . s found(itemName)=\"\"\n ;i $g(^zewd(\"trace\")) d trace($h_\": runQuery ended\")\n QUIT error\n ;\ninMatchList(matchList,itemName)\n ;\n n pos,present\n ;\n s pos=\"\",present=0\n f  s pos=$o(matchList(pos)) q:pos=\"\"  d  q:present\n . i matchList(pos)=itemName s present=1\n QUIT present\n ;\n ;\nmergeLists(toList,fromList)\n ;\n n index,itemName,maxPos,newPos,pos,posx,stop,toPos\n ;\n s pos=\"\"\n f  s pos=$o(toList(pos)) q:pos=\"\"  d\n . s itemName=toList(pos)\n . i itemName=\"\" s itemName=\" \"\n . s index(itemName)=pos\n ;\n s pos=\"\",maxPos=$o(toList(\"\"),-1)\n f  s pos=$o(fromList(pos)) q:pos=\"\"  d\n . s itemName=fromList(pos)\n . ;s toPos=\"\",stop=0\n . ;f  s toPos=$o(toList(toPos)) q:toPos=maxPos  q:toPos=\"\"  d  q:stop\n . ;. i toList(toPos)=itemName s stop=1\n . ;i 'stop d\n . s posx=$g(index(itemName))\n . i posx=\"\" d\n . . s newPos=$o(toList(\"\"),-1)+1\n . . s toList(newPos)=itemName\n . . s index(itemName)=newPos\n QUIT\n ;\nqueryPredicate(query,keyId,domainId,itemList,name)\n n c,compOp,error,i,inString,no,not,predicate,relation,stop,value\n ;\n ;d trace(\"in queryPredicate - query=\"_query)\n d\n . n queryx\n . s queryx=$$replaceAll(query,\"\\\\\",$c(3))\n . i queryx[\"\\'\" s query=$$replaceAll(queryx,\"\\'\",$c(1))\n i query[\"''\" s query=$$replaceAll(query,\"''\",$c(1))\n i query[$c(32,1,39) s query=$$replaceAll(query,$c(32,1,39),$c(32,39,1))\n i query[$c(61,1,39) s query=$$replaceAll(query,$c(61,1,39),$c(61,39,1))\n i query[$c(2) s query=$$replaceAll(query,$c(2),$c(1))\n s error=\"\",predicate=\"\"\n s not=$$queryNot(.query)\n i $e(query,1)'=\"[\" QUIT $$queryError(7)\n s inString=0\n s query=$e(query,2,$l(query))\n s stop=0\n ;d trace(\"1 query=\"_query)\n f i=1:1:$l(query) d  q:stop\n . s c=$e(query,i)\n . i c=\"'\" s inString='inString\n . i c=\"]\",'inString d  q\n . . s predicate=$e(query,1,i-1)\n . . s query=$e(query,i+1,$l(query))\n . . s stop=1\n ;d trace(\"predicate=\"_predicate)\n i predicate=\"\" QUIT $$queryError(8)\n s query=$$stripSpaces(query)\n ;d trace(\"query=\"_query)\n s error=$$parsePredicate(.predicate,.name,.compOp,.value)\n i error'=\"\" QUIT error\n s no=1\n ;d trace(\"predicate=\"_predicate)\n i predicate'=\"\" d  i error'=\"\" QUIT error\n . ;d trace(\"name=\"_name)\n . s name(1)=name\n . ;d trace(\"compOp=\"_compOp)\n . s compOp(1)=compOp\n . ;d trace(\"value=\"_value)\n . i value=\"\" s value=$c(31)\n . s value(1)=value\n . f  q:predicate=\"\"  d  q:error'=\"\"\n . . i $e(predicate,1,3)=\"and\" d  q\n . . . s predicate=$e(predicate,4,$l(predicate))\n . . . s error=$$parseSubPredicate(.predicate,.name,.compOp,.value,.no)\n . . . s relation(no)=\"&\"\n . . i $e(predicate,1,2)=\"or\" d  q\n . . . s predicate=$e(predicate,3,$l(predicate))\n . . . s error=$$parseSubPredicate(.predicate,.name,.compOp,.value,.no)\n . . . s relation(no)=\"!\"\n ;d trace(\"about to run executeQuery\")\n d executeQuery(keyId,domainId,no,.name,.compOp,.value,.relation,.itemList)\n i not d not(.itemList)\n QUIT error\n ;\nparseSubPredicate(predicate,name,compOp,value,no)\n n error\n ;\n s predicate=$$stripSpaces(predicate)\n s error=$$parsePredicate(.predicate,.name,.compOp,.value)\n i error'=\"\" QUIT error\n i name'=name(1) QUIT $$queryError(9)\n i value=\"\" s value=$c(31)\n s no=no+1\n s name(no)=name,compOp(no)=compOp,value(no)=value\n QUIT \"\"\n ;\nparsePredicate(predicate,name,compOp,value)\n n c1,cx,error\n ;\n ;d trace(\"in parsePredicate - predicate=\"_predicate)\n s predicate=$$stripSpaces(predicate)\n s c1=$e(predicate,1)\n ;d trace(\"c1=\"_c1)\n i c1'=\"'\" QUIT $$queryError(10)\n s cx=$e(predicate,$l(predicate))\n ;d trace(\"cx=\"_cx)\n i cx'=\"'\",cx'=\"\"\"\" QUIT $$queryError(11)\n ;d trace(\"passed 1\")\n ;d trace(\"111 predicate=\"_predicate)\n s error=$$getIdentifier(.predicate,.name)\n ;d trace(\"name=\"_name)\n i error'=\"\" QUIT error\n i name=\"\" QUIT $$queryError(13)\n s error=$$getCompOp(.predicate,.compOp)\n i error'=\"\" QUIT error\n ;d trace(\"222 predicate=\"_predicate)\n s error=$$getIdentifier(.predicate,.value)\n ;d trace(\"222 value=\"_value)\n i value=\"\" s value=$c(31)\n i error'=\"\",compOp=\"starts-with\",value=\"\" s error=\"\"\n QUIT error\n ;\ngetIdentifier(predicate,identifier)\n ;\n n c,c1,cx,error,escaped,i\n ;\n s error=\"\"\n s identifier=\"\"\n s escaped=0\n s c1=$e(predicate,1)\n ;d trace(\"in getIdentifier: c1=\"_c1)\n i c1'=\"'\",c1'=\"\"\"\" QUIT $$queryError(12)\n s cx=c1\n f i=2:1:$l(predicate) d  q:identifier'=\"\"\n . s c=$e(predicate,i)\n . i c=\"\\\",'escaped s escaped=1 q\n . i 'escaped,c=cx d  q\n . . s identifier=$e(predicate,2,i-1)\n . . s predicate=$e(predicate,i+1,$l(predicate))\n . . s predicate=$$stripSpaces(predicate)\n . i escaped s escaped=0\n i identifier[\"\\\\\" d\n . s identifier=$$replaceAll(identifier,\"\\\\\",$c(5))\n . s identifier=$$replaceAll(identifier,$c(5),\"\\\")\n ;d trace(\"predicate=\"_predicate_\"; identifier=\"_identifier)\n ;i identifier=\"\" QUIT $$queryError(13)\n QUIT error\n ;\ngetCompOp(predicate,compOp)\n ;\n n error\n ;\n s error=\"\"\n i $e(predicate,1)=\"=\" d  QUIT \"\"\n . s compOp=\"=\"\n . s predicate=$e(predicate,2,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,2)=\"<=\" d  QUIT \"\"\n . s compOp=\"<=\"\n . s predicate=$e(predicate,3,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,2)=\">=\" d  QUIT \"\"\n . s compOp=\">=\"\n . s predicate=$e(predicate,3,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,2)=\"!=\" d  QUIT \"\"\n . s compOp=\"!=\"\n . s predicate=$e(predicate,3,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1)=\"<\" d  QUIT \"\"\n . s compOp=\"<\"\n . s predicate=$e(predicate,2,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1)=\">\" d  QUIT \"\"\n . s compOp=\">\"\n . s predicate=$e(predicate,2,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,11)=\"starts-with\" d  QUIT \"\"\n . s compOp=\"starts-with\"\n . s predicate=$e(predicate,12,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,4)=\"like\" d  QUIT \"\"\n . s compOp=\"like\"\n . s predicate=$e(predicate,5,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,8)=\"not like\" d  QUIT \"\"\n . s compOp=\"notlike\"\n . s predicate=$e(predicate,9,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,19)=\"does-not-start-with\" d  QUIT \"\"\n . s compOp=\"does-not-start-with\"\n . s predicate=$e(predicate,20,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,6)=\"isNull\" d  QUIT \"\"\n . s compOp=\"isNull\"\n . s predicate=$e(predicate,7,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,9)=\"isNotNull\" d  QUIT \"\"\n . s compOp=\"isNotNull\"\n . s predicate=$e(predicate,10,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n QUIT $$queryError(14)\n ;\nqueryNot(query)\n n not\n s not=0\n i $e(query,1,3)=\"not\" d\n . s not=1\n . s query=$e(query,4,$l(query))\n . s query=$$stripSpaces(query)\n QUIT not\n ;\nqueryError(x)\n i x=5 QUIT \"InvalidSortExpression~Invalid sort expression. The sort attribute must be present in at least one of the predicates, and the predicate cannot contain the is null operator.\"\n QUIT \"InvalidQueryExpression~The specified query expression syntax is not valid (\"_x_\")\"\n ;\nnot(itemList)\n ;\n n itemId,itemName,pos,selected\n ;\n s pos=\"\"\n f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . s itemName=itemList(pos)\n . s itemId=$$getItemId(keyId,domainId,itemName)\n . s selected(itemId)=\"\"\n k itemList\n s itemId=\"\",pos=0\n f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . i '$d(selected(itemId)) d\n . . s pos=pos+1\n . . s itemList(pos)=^MDB(keyId,\"domains\",domainId,\"items\",itemId)\n ;\n QUIT\n ;\nexecuteQuery(keyId,domainId,no,name,compOp,value,relation,itemList)\n ;\n n attribId,expr,func,itemId,itemName,pos,stop,xvalue\n ;\n s attribId=\"\"\n ;d trace(\"xx keyId=\"_keyId_\"; domainId=\"_domainId_\"; name=\"_name_\": no=\"_no)\n i $g(name)'=\"\" d\n . i $e(name,1)=\"`\",$e(name,$l(name))=\"`\" s name=$e(name,2,$l(name)-1)\n . i name[\"``\" s name=$$replace(name,\"``\",\"`\")\n . s attribId=$$getAttributeId(keyId,domainId,name)\n ;d trace(\"xx attribId=\"_attribId)\n i attribId=\"\",compOp'=\"isNull\" QUIT\n ;\n ;d trace(\"name=\"_name_\"; value=\"_value_\"; compOp=\"_compOp)\n i value[$c(1) s value=$tr(value,$c(1),\"'\")\n i name[$c(1) s name=$tr(name,$c(1),\"'\")\n i no=1,compOp=\"=\" d  QUIT\n . s pos=0,itemId=\"\"\n . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,value,itemId)) q:itemId=\"\"  d\n . . s pos=pos+1\n . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n . . ;d trace(value_\" found for itemId=\"_itemId)\n ;\n i no=1,compOp=\"!=\" d  QUIT\n . s xvalue=\"\",pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . i value=xvalue q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"<\" d  QUIT\n . s xvalue=\"\",stop=0,pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue'<value  q:xvalue=\"\"  d  q:stop\n . . i $e(xvalue,1)'?1N s stop=1 q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"<=\" d  QUIT\n . s xvalue=\"\",stop=0,pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue>value  q:xvalue=\"\"  d  q:stop\n . . i $e(xvalue,1)'?1N s stop=1 q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\">\" d  QUIT\n . s xvalue=value,stop=0,pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d  q:stop\n . . i $e(xvalue,1)'?1N s stop=1 q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\">=\" d  QUIT\n . s xvalue=value-1,stop=0,pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d  q:stop\n . . i $e(xvalue,1)'?1N s stop=1 q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"isNull\" d  QUIT\n . s itemId=\"\",pos=0\n . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . . i attribId'=\"\",$d(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId)) q\n . . s pos=pos+1\n . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"isNotNull\" d  QUIT\n . s itemId=\"\",pos=0\n . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . . i '$d(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId)) q\n . . s pos=pos+1\n . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . i $e(xvalue,1,len)=value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"like\" d\n . i value[\"\\%\" s value=$$replaceAll(value,\"\\%\",$c(6))\n . i $e(value,1)=\"%\",$e(value,$l(value))=\"%\" d  q\n . . s value=$e(value,2,$l(value)-1)\n . . s compOp=\"contains\"\n . i $e(value,$l(value))=\"%\" d  q\n . . s value=$e(value,1,$l(value)-1)\n . . s compOp=\"starts-with\"\n . i $e(value,1)=\"%\" d  q\n . . s value=$e(value,2,$l(value))\n . . s compOp=\"ends-with\"\n i no=1,compOp=\"notlike\" d\n . i value[\"\\%\" s value=$$replaceAll(value,\"\\%\",$c(6))\n . i $e(value,1)=\"%\",$e(value,$l(value))=\"%\" d  q\n . . s value=$e(value,2,$l(value)-1)\n . . s compOp=\"does-not-contain\"\n . i $e(value,$l(value))=\"%\" d  q\n . . s value=$e(value,1,$l(value)-1)\n . . s compOp=\"does-not-start-with\"\n . i $e(value,1)=\"%\" d  q\n . . s value=$e(value,2,$l(value))\n . . s compOp=\"does-not-end-with\"\n . ;s compOp=\"does-not-start-with\"\n . ;i $e(value,$l(value))=\"%\" s value=$e(value,1,$l(value)-1)\n i no=1 s value=$$replaceAll(value,$c(6),\"%\")\n i no=1,compOp=\"starts-with\" d  QUIT\n . i value=$c(31) s value=\"\"\n . i $l(value)=1 d\n . . s xvalue=$c($a(value)-1)\n . e  d\n . . n c\n . . q:value=\"\"\n . . s c=$e(value,$l(value))\n . . s c=$c($a(c)-1)\n . . s xvalue=$e(value,1,$l(value)-1)_c\n . s stop=0,pos=0\n . i value?1N.N d\n . . n len\n . . s xvalue=value-1\n . . s len=$l(value)\n . . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . . i $e(xvalue,1,len)'=value q\n . . . s itemId=\"\"\n . . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . . s pos=pos+1\n . . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n . e  d\n . . n len\n . . i value'=\"\" d\n . . . s xvalue=xvalue_\"~\"\n . . . s len=$l(value)\n . . e  d\n . . . s xvalue=\"\"\n . . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d  q:stop\n . . . i value'=\"\",$e(xvalue,1,len)'=value s stop=1 q\n . . . s itemId=\"\"\n . . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . . s pos=pos+1\n . . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"does-not-start-with\" d  QUIT\n . n len\n . i value=$c(31) q\n . s xvalue=\"\",len=$l(value),pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . i $e(xvalue,1,len)=value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"contains\" d  QUIT\n . n len\n . i value=$c(31) q\n . s xvalue=\"\",pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . i xvalue'[value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"does-not-contain\" d  QUIT\n . n len\n . i value=$c(31) q\n . s xvalue=\"\",pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . i xvalue[value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"ends-with\" d  QUIT\n . n len,xend,xlen\n . i value=$c(31) q\n . s xvalue=\"\",len=$l(value),pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . s xlen=$l(xvalue)\n . . s xend=$e(xvalue,(xlen-len+1),xlen)\n . . i xend'=value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"does-not-end-with\" d  QUIT\n . n len,xend,xlen\n . i value=$c(31) q\n . s xvalue=\"\",len=$l(value),pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . s xlen=$l(xvalue)\n . . s xend=$e(xvalue,(xlen-len+1),xlen)\n . . i xend=value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1 QUIT\n s expr=\"\"\n f i=1:1:no d\n . i i>1 s expr=expr_relation(i)\n . d\n . . i compOp(i)=\"=\" s func=\"equals\" q\n . . i compOp(i)=\"<\" s func=\"lt\" q\n . . i compOp(i)=\">\" s func=\"gt\" q\n . . i compOp(i)=\"!=\" s func=\"notEquals\" q\n . . i compOp(i)=\"<=\" s func=\"le\" q\n . . i compOp(i)=\">=\" s func=\"ge\" q\n . . i compOp(i)=\"starts-with\" s func=\"startsWith\" q\n . . i compOp(i)=\"notlike\" d  q\n . . . i $e(value(i),1)=\"%\",$e(value(i),$l(value(i)))=\"%\" d  q\n . . . . s value(i)=$e(value(i),2,$l(value(i))-1)\n . . . . s func=\"notContains\"\n . . . i $e(value(i),$l(value(i)))=\"%\" d  q\n . . . . s value(i)=$e(value(i),1,$l(value(i))-1)\n . . . . s func=\"notStartsWith\"\n . . . i $e(value(i),1)=\"%\" d  q\n . . . . s value(i)=$e(value(i),2,$l(value(i)))\n . . . . s func=\"notEndsWith\"\n . . . ;s func=\"notStartsWith\"\n . . . ;i $e(value(i),$l(value(i)))=\"%\" s value(i)=$e(value(i),1,$l(value(i))-1)\n . . i compOp(i)=\"like\" d  q\n . . . i $e(value(i),1)=\"%\",$e(value(i),$l(value(i)))=\"%\" d  q\n . . . . s value(i)=$e(value(i),2,$l(value(i))-1)\n . . . . s func=\"contains\"\n . . . i $e(value(i),$l(value(i)))=\"%\" d  q\n . . . . s value(i)=$e(value(i),1,$l(value(i))-1)\n . . . . s func=\"startsWith\"\n . . . i $e(value(i),1)=\"%\" d  q\n . . . . s value(i)=$e(value(i),2,$l(value(i)))\n . . . . s func=\"endsWith\"\n . . . ;s func=\"startsWith\"\n . . . ;i $e(value(i),$l(value(i)))=\"%\" s value(i)=$e(value(i),1,$l(value(i))-1)\n . . i compOp(i)=\"does-not-start-with\" s func=\"notStartsWith\"\n . s value(i)=$$replaceAll(value(i),$c(6),\"%\")\n . s expr=expr_\"$$\"_func_\"(xvalue,\"\"\"_value(i)_\"\"\")\"\n . ;d trace(\"expr=\"_expr)\n s xvalue=\"\"\n s attribId=$$getAttributeId(keyId,domainId,name(1))\n s pos=0\n f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . i @expr d\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) \n QUIT\n ;\nequals(indexValue,targetValue)\n QUIT indexValue=targetValue\n ;\nnotEquals(indexValue,targetValue)\n QUIT indexValue'=targetValue\n ;\nlt(indexValue,targetValue)\n i $e(indexValue,1)'?1N QUIT 0\n QUIT indexValue<targetValue\n ;\ngt(indexValue,targetValue)\n i $e(indexValue,1)'?1N QUIT 0\n QUIT indexValue>targetValue\n ;\nle(indexValue,targetValue)\n i $e(indexValue,1)'?1N QUIT 0\n QUIT indexValue'>targetValue\n ;\nge(indexValue,targetValue)\n i $e(indexValue,1)'?1N QUIT 0\n QUIT indexValue'<targetValue\n ;\nstartsWith(index,targetValue)\n QUIT $e(index,1,$l(targetValue))=targetValue\n ;\nnotStartsWith(index,targetValue)\n QUIT $e(index,1,$l(targetValue))'=targetValue\n ;\ncontains(indexValue,targetValue)\n QUIT indexValue[targetValue\n ;\nnotContains(indexValue,targetValue)\n QUIT indexValue'[targetValue\n ;\nendsWith(indexValue,targetValue)\n n ilen,tlen,end\n s ilen=$l(indexValue)\n s tlen=$l(targetValue)\n s end=$e(indexValue,(ilen-tlen+1),ilen)\n QUIT end=targetValue\n ;\nnotEndsWith(indexValue,targetValue)\n n ilen,tlen,end\n s ilen=$l(indexValue)\n s tlen=$l(targetValue)\n s end=$e(indexValue,(ilen-tlen+1),ilen)\n QUIT end'=targetValue\n ;\nhex(number)\n n hex,no,str\n s hex=\"\"\n s str=\"123456789ABCDEF\"\n f  d  q:number=0\n . s no=number#16\n . s number=number\\16\n . i no s no=$e(str,no)\n . s hex=no_hex\n QUIT hex\n ;\nhexDecode(hex)\n QUIT $f(\"0123456789ABCDEF\",hex)-2\n \nhexToDecimal(hex)\n ;\n n i,num\n s num=0\n f i=1:1:$l(hex) d\n . s num=num*16+$$hexDecode($e(hex,i))\n QUIT num\n ;\nurlDecode(string)\n ;\n n ascii,c,hex,pos\n ;\n i string[\"%25\" s string=$$replaceAll(string,\"%25\",$c(1))\n i string[\"+\" s string=$$replaceAll(string,\"+\",\"%20\")\n f  q:string'[\"%\"  d\n . s pos=$f(string,\"%\")\n . s c=$e(string,pos) s c=$zconvert(c,\"l\") i \"0123456789abcdef\"'[c s string=$$replace(string,\"%\",$c(1)) q\n . s c=$e(string,pos+1) s c=$zconvert(c,\"l\") i \"0123456789abcdef\"'[c s string=$$replace(string,\"%\",$c(1)) q\n . s hex=$e(string,pos,pos+1)\n . i $l(hex)'=2 s string=$$replace(string,\"%\",$c(1)) q\n . s ascii=$$hexToDecimal(hex)\n . s string=$e(string,1,pos-2)_$c(ascii)_$e(string,pos+2,$l(string))\n i string[$c(1) s string=$$replaceAll(string,$c(1),\"%\")\n QUIT string\n ;\nurlEscape(string)\n ;The unreserved characters are A-Z, a-z, 0-9, hyphen ( - ), underscore ( _ ), period ( . ), and tilde ( ~ ). \n i string?1AN.AN QUIT string\n n a,c,esc,i,pass\n f i=45,46,95,126 s pass(i)=\"\"\n s esc=\"\"\n f i=1:1:$l(string) d\n . s c=$e(string,i)\n . i c?1AN s esc=esc_c q\n . s a=$a(c)\n . i $d(pass(a)) s esc=esc_c q\n . s a=$$hex^MDB(a)\n . s esc=esc_\"%\"_$zconvert(a,\"u\")\n QUIT esc\n ;\ninstallMDBX(requestId,boxUsage) ; Install M/DB:X Extensions\n n error,startTime\n s requestId=$$init(.startTime)\n s error=\"\"\n i $t(MDBX^MDBX)'=\"\" d\n . d install^MDBX\n e  d\n . s error=\"The M/DB:X routine is not available.  Download and install it and try again\"\n i error'=\"\" QUIT error\n QUIT $$end(startTime,.boxUsage)\n ;\ninstallMDBM(requestId,boxUsage) ; Install M/DB:M(umps) Extensions\n n error,startTime\n s requestId=$$init(.startTime)\n s error=\"\"\n i $t(MDBMumps^MDBMumps)'=\"\" d\n . d install^MDBMumps\n e  d\n . s error=\"The M/DB:M routine is not available.  Download and install it and try again\"\n i error'=\"\" QUIT error\n QUIT $$end(startTime,.boxUsage)\n ;\ninitialise(requestId,boxUsage) ; Initialise the M/DB database\n\tn configFile,i,io,key,line,ok,secret,startTime,stop\n\ts requestId=$$init(.startTime)\n\ts io=$io\n\ts configFile=\"/usr/MDB/MDB.conf\"\n\tc configFile\n\to configFile:(readonly:exception=\"g configFileNotExists\")\n\tu configFile\n\ts stop=0,key=\"\",secret=\"\"\n\tf i=1:1 r line d  q:stop\n\t. i $e(line,1)=\"#\" q\n\t. i line[\"AdminstratorAccessKeyId\"!(line[\"AdministratorAccessKeyId\") d  q\n\t. . s key=$p(line,\"=\",2)\n\t. . s key=$$stripSpaces(key)\n\t. . s key=$$replaceAll(key,$c(9),\"\")\n\t. . i $e(key,1)=\"<\" s key=\"\"  ; user hasn't changed the explanatory text\n\t. i line[\"AdminstratorSecretKey\"!(line[\"AdministratorSecretKey\") d  q\n\t. . s secret=$p(line,\"=\",2)\n\t. . s secret=$$stripSpaces(secret)\n\t. . s secret=$$replaceAll(secret,$c(9),\"\")\n\t. . i $e(secret,1)=\"<\" s secret=\"\"  ; user hasn't changed the explanatory text\n\t. . s stop=1\n\tc configFile\n\tu io\n\ti key'=\"\",secret'=\"\" d  QUIT $$end(startTime,.boxUsage)\n\t. i $$createAdministrator^MDBConfig(key,secret)\n\t. i $$reset^MDBConfig(key,secret)\n\tQUIT \"The contents of the Configuration File /usr/MDB/MDB.conf were invalid\"\n\t;\nconfigFileNotExists\t\n\tc configFile\n\tu io\n\tQUIT \"Configuration File /usr/MDB/MDB.conf was not found\"\n\t;\ninitialisationResponse\n\tQUIT\n\t;\ndecodeBase64(string)\n ;\n n b64,context\n ;\n i $zv[\"GT.M\" d  QUIT b64\n . s context=1\n . i $d(^zewd(\"config\",\"MGWSI\")) s context=0\n . s b64=$$DB64^%ZMGWSIS(string,context)\n ;\n QUIT $$b64Decode^MDBMCache(string)\n ;\nencodeBase64(string)\n ;\n n b64,context\n ;\n i $zv[\"GT.M\" d  QUIT b64\n . s context=1\n . i $d(^zewd(\"config\",\"MGWSI\")) s context=0\n . s b64=$$B64^%ZMGWSIS(string,context)\n ;\n QUIT $$b64Encode^MDBMCache(string)\n ;\nparseSelect(selectExpression,domainName,queryExpression,attributes,orderBy,limit)\n ;select Ranking,Keyword from books where Title = 'The Right Stuff'\n ;\n n attributeList,error,no,p1\n ;\n ;d trace(\"in parseSelect - selectExpression=\"_selectExpression)\n s error=\"\"\n s limit=\"\"\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\"select \")\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\" and \")\n i selectExpression=$$stripSpaces(selectExpression)\n i $e(selectExpression,1,7)'=\"select \" QUIT $$invalid(1)\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\" from \")\n i selectExpression'[\" from \" QUIT $$invalid(3)\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\"count(*)\")\n s p1=$p(selectExpression,\"select\",2)\n s attributeList=$p(p1,\"from\",1)\n s attributeList=$$stripSpaces(attributeList)\n i attributeList=\"\" QUIT $$invalid(2)\n i attributeList=\"*\" d\n . ; do nothing\n e  i attributeList=\"count(*)\" d\n . s attributes=\"count(*)\"\n e  i attributeList'[\",\" d\n . s attributes(1)=attributeList\n e  d\n . f no=1:1 q:attributeList=\"\"  d\n . . s p1=$p(attributeList,\",\",1)\n . . s attributeList=$p(attributeList,\",\",2,5000)\n . . s p1=$$stripSpaces(p1)\n . . s attributes(no)=p1\n s p1=$p(selectExpression,\" from\",2,1000)\n s domainName=p1\n s domainName=$$stripSpaces(domainName)\n s domainName=$p(domainName,\" \",1)\n i domainName=\"\" QUIT $$invalid(4)\n i $e(domainName,1)=\"`\",$e(domainName,$l(domainName))=\"`\" s domainName=$e(domainName,2,$l(domainName)-1)\n s selectExpression=$p(selectExpression,domainName,2,5000)\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\" where \")\n s selectExpression=$$stripSpaces(selectExpression)\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\"order by\")\n s orderBy=\"\"\n i selectExpression[\"order by\" d\n . n attrName,dir\n . s orderBy=$p(selectExpression,\"order by\",2)\n . s orderBy=$$stripSpaces(orderBy)\n . s orderBy=$$convertSubstringToLowerCase(orderBy,\" limit \")\n . i orderBy[\" limit \" d\n . . s limit=$p(orderBy,\" limit \",2)\n . . s orderBy=$p(orderBy,\" limit \",1)\n . s attrName=$p(orderBy,\" \",1)\n . s dir=$p(orderBy,\" \",2)\n . i dir=\"\" s dir=\"asc\"\n . s orderBy=\"'\"_attrName_\"' \"_dir\n . s selectExpression=$p(selectExpression,\"order by\",1)\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\" limit \")\n i limit=\"\",selectExpression[\"limit \" d\n . s limit=$p(selectExpression,\"limit \",2)\n . s selectExpression=$p(selectExpression,\"limit \",1)\n s selectExpression=$p(selectExpression,\"where\",2,1000)\n s queryExpression=selectExpression\n s queryExpression=$$stripSpaces(queryExpression)\n ;\n QUIT error\n ;\nconvertSubstringToLowerCase(string,subString)\n ;\n n lcString,newString,p1,pos,to1\n ;\n s lcString=$zconvert(string,\"l\")\n s subString=$zconvert(subString,\"l\")\n i lcString'[subString QUIT string\n s p1=$p(lcString,subString,1)\n s to1=$l(p1)\n s pos=$f(lcString,subString)\n s newString=$e(string,1,to1)_subString_$e(string,pos,$l(string))\n ;\n QUIT newString\n ;\ninProc(queryExpression,expr,thisWord)\n ;\n n attrName,c,i,inValue,list,no,np,or,str,value\n ;\n i thisWord=\"in\" s expr=expr_\" \"\n s list=$p(queryExpression,\")\",1)\n s queryExpression=$p(queryExpression,\")\",2,5000)\n s inValue=0,no=0,str=\"\"\n f  q:list=\"\"  d\n . s c=$e(list,1),list=$e(list,2,$l(list))\n . i c=\"'\" d  q\n . . s inValue='inValue\n . . i inValue q\n . . s no=no+1\n . . s value(no)=str\n . . s str=\"\"\n . i 'inValue q\n . s str=str_c\n s np=$l(expr,\" \")\n s attrName=$p(expr,\" \",np-2)\n s expr=$p(expr,\" \",1,np-3)\n s or=\"\"\n f i=1:1:no d\n . s expr=expr_or_attrName_\" = '\"_value(i)_\"'\"\n . s or=\" or \"\n QUIT\n ;\nexecuteSelect(queryExpression,itemList,keyId,itemStack)\n n c,error,expr,inAttr,lastWord,thisWord\n i $g(^zewd(\"trace\"))=1 d trace($h_\": in executeSelect.  queryExpression=\"_queryExpression)\n i queryExpression[\"''\" d\n . s queryExpression=$$replaceAll(queryExpression,\" '''\",\" '\"_$c(2))\n . s queryExpression=$$replaceAll(queryExpression,\"='''\",\"='\"_$c(2))\n . s queryExpression=$$replaceAll(queryExpression,\"'''\",$c(2)_\"'\")\n . s queryExpression=$$replaceAll(queryExpression,\"''\",$c(2))\n k itemList\n s error=\"\"\n s inAttr=0,expr=\"\",lastWord=\"\",thisWord=\"\"\n f  q:queryExpression=\"\"  d  q:c=\")\"\n . s c=$e(queryExpression,1),queryExpression=$e(queryExpression,2,$l(queryExpression))\n . i c=\"(\" d  q\n . . n rel\n . . i thisWord=\"in\"!(lastWord=\"in\") d  q\n . . . d inProc(.queryExpression,.expr,thisWord)\n . . s error=$$executeSelect(.queryExpression,.itemList,keyId,.itemStack)\n . . i error'=\"\" s queryExpression=\"\",expr=\"\" q\n . . s rel=$g(itemStack(\"rel\"))\n . . i '$d(itemStack(\"list\")) d\n . . . m itemStack(\"list\")=itemList\n . . e  d\n . . . i rel=\"or\" d\n . . . . n index,itemNo,no,newList\n . . . . s no=\"\"\n . . . . f  s no=$o(itemList(no)) q:no=\"\"  d\n . . . . . s itemNo=itemList(no)\n . . . . . s index(itemNo)=\"\"\n . . . . s no=\"\"\n . . . . f  s no=$o(itemStack(\"list\",no)) q:no=\"\"  d\n . . . . . s itemNo=itemStack(\"list\",no)\n . . . . . s index(itemNo)=\"\"\n . . . . s itemNo=\"\",no=0\n . . . . k itemStack\n . . . . f  s itemNo=$o(index(itemNo)) q:itemNo=\"\"  d\n . . . . . s no=no+1\n . . . . . s itemStack(\"list\",no)=itemNo\n . . . i rel=\"and\" d\n . . . . n index,itemNo,no,newList\n . . . . s no=\"\"\n . . . . f  s no=$o(itemList(no)) q:no=\"\"  d\n . . . . . s itemNo=itemList(no)\n . . . . . s index(itemNo)=\"\"\n . . . . s no=\"\"\n . . . . f  s no=$o(itemStack(\"list\",no)) q:no=\"\"  d\n . . . . . s itemNo=itemStack(\"list\",no)\n . . . . . i $d(index(itemNo)) s newList(itemNo)=\"\"\n . . . . s itemNo=\"\",no=0\n . . . . k itemStack\n . . . . f  s itemNo=$o(newList(itemNo)) q:itemNo=\"\"  d\n . . . . . s no=no+1\n . . . . . s itemStack(\"list\",no)=itemNo\n . . s queryExpression=$$stripSpaces(queryExpression)\n . . s rel=$p(queryExpression,\" \",1)\n . . s queryExpression=$p(queryExpression,\" \",2,5000)\n . . s queryExpression=$$stripSpaces(queryExpression)\n . . i queryExpression'=\"\",$e(queryExpression,1)'=\"(\" s queryExpression=\"(\"_queryExpression_\")\"\n . . s itemStack(\"rel\")=rel\n . i c=\")\" d  quit  ; pop\n . . k itemList\n . i expr=\"\",c=\" \" q\n . i expr=\"\" s inAttr=1,expr=\"'\",thisWord=expr\n . i 'inAttr d\n . . n stop\n . . s stop=0\n . . i lastWord=\"and\",expr[\"between\" d  q:stop\n . . . n np\n . . . s np=$l(expr,\" \")\n . . . i $p(expr,\" \",np-3)=\"between\" d\n . . . . n p1\n . . . . s stop=1\n . . . . s p1=$p(expr,\" \",1,np-4)_\" >= \"\n . . . . s p1=p1_$p(expr,\" \",np-2)_\" and \"_$p(expr,\" \",np-4)_\" <= \"\n . . . . s expr=p1\n . . . . s lastWord=\"<=\"\n . . i lastWord=\"and\" s inAttr=1,expr=expr_\"'\",thisWord=\"'\"\n . . i lastWord=\"or\" s inAttr=1,expr=expr_\"'\",thisWord=\"'\"\n . . i lastWord=\"union\" s inAttr=1,expr=expr_\"'\",thisWord=\"'\"\n . . i lastWord=\"intersection\" s inAttr=1,expr=expr_\"'\",thisWord=\"'\"\n . i inAttr,c=\"=\" d\n . . s c=\" \"\n . . i $e(queryExpression,1)'=\" \" s queryExpression=\" \"_queryExpression\n . . s queryExpression=\"=\"_queryExpression\n . i c'=\" \" d  q\n . . s thisWord=thisWord_c\n . . s expr=expr_c\n . i inAttr d\n . . s expr=expr_\"'\"\n . . s thisWord=thisWord_\"'\"\n . . s inAttr=0\n . s expr=expr_c\n . s lastWord=thisWord\n . s thisWord=\"\"\n . i lastWord=\"is\" d\n . . i $e(queryExpression,1,4)=\"null\" d\n . . . s lastWord=\"isNull\"\n . . . s expr=$e(expr,1,$l(expr)-3)_\"isNull \"\n . . . s queryExpression=\"'null'\"_$e(queryExpression,5,$l(queryExpression))\n . . i $e(queryExpression,1,8)=\"not null\" d\n . . . s lastWord=\"isNotNull\"\n . . . s expr=$e(expr,1,$l(expr)-3)_\"isNotNull \"\n . . . s queryExpression=\"'null'\"_$e(queryExpression,9,$l(queryExpression))\n i expr'=\"\" d\n . n i,name,np,offset,prevName,rel,term\n . s expr=$$escVals(expr)\n . s np=$l(expr,\" \")\n . i np>3 d\n . . n diffNames,name\n . . f i=1:1:np s term(i)=$p(expr,\" \",i)\n . . s offset=4\n . . s diffNames=0\n . . s name=term(1)\n . . f i=1:offset q:'$d(term(i))  d  q:diffNames\n . . . i term(i)'=name s diffNames=1 q\n . . . i $g(term(i+3))=\"intersection\" s diffNames=1 q\n . . . i $g(term(i+3))=\"union\" s diffNames=1 q\n . . i diffNames d\n . . . s expr=\"[\"_term(1)_\" \"_term(2)_\" \"_term(3)\n . . . f  d  q:'$d(term(offset+1))\n . . . . s name=term(offset+1)\n . . . . s rel=term(offset)\n . . . . i rel=\"and\"!(rel=\"intersection\") d\n . . . . . s expr=expr_\"] intersection [\"\n . . . . i rel=\"or\"!(rel=\"union\") d\n . . . . . s expr=expr_\"] union [\"\n . . . . s expr=expr_term(offset+1)_\" \"_term(offset+2)_\" \"_term(offset+3)\n . . . . s offset=offset+4\n . . . s expr=expr_\"]\"\n . . e  d\n . . . s expr=\"[\"_expr_\"]\"\n . e  d\n . . s expr=\"[\"_expr_\"]\"\n . k itemList\n . s expr=$tr(expr,$c(1),\" \")\n . i $g(orderBy)'=\"\" s expr=expr_\" sort \"_orderBy\n . s error=$$runQuery(keyId,domainName,expr,,.itemList)\n QUIT error\n ;\nescVals(expr)\n ;\n n c,inValue,no,str\n ;\n s inValue=0,no=0,str=\"\"\n f  q:expr=\"\"  d\n . s c=$e(expr,1),expr=$e(expr,2,$l(expr))\n . i c=\"'\" d  q\n . . s inValue='inValue\n . . s str=str_c\n . i 'inValue s str=str_c q\n . i c=\" \" s c=$c(1)\n . s str=str_c\n QUIT str\n ;\ninvalid(x)\n QUIT \"InvalidQueryExpression~The specified query expression syntax is not valid. (\"_x_\")\"\n ;\nrunSelect(keyId,query,itemList,attributes,domainName)\n ;\n n error,limit,orderBy,queryExpression\n ;\n ;d trace(\"in runSelect: query=\"_query)\n s error=$$parseSelect(query,.domainName,.queryExpression,.attributes,.orderBy,.limit)\n i $g(^zewd(\"trace\"))=1 d trace($h_\": completed parseSelect: queryExpression=\"_$g(queryExpression))\n i error'=\"\" QUIT error\n i queryExpression=\"\" d\n . i orderBy'=\"\" d\n . . s error=$$invalid(5)\n . e  d\n . . s error=$$runQuery(keyId,domainName,\"\",,.itemList)\n e  d\n . i queryExpression[\"itemName()\" s queryExpression=$$replaceAll(queryExpression,\"itemName()\",\"itemName{}\")\n . s error=$$executeSelect(queryExpression,.itemList,keyId,.itemStack)\n . i $g(^zewd(\"trace\"))=1 d trace($h_\": finished executeSelect and returned to runSelect\")\n ;***\n i $d(itemStack(\"list\")) k itemList m itemList=itemStack(\"list\")\n ;***\n i limit>0 d\n . n count,listCopy,no,stop\n . s count=0,no=\"\",stop=0\n . f  s no=$o(itemList(no)) q:no=\"\"  d  q:stop\n . . s count=count+1\n . . i count>limit s stop=1 q\n . . s listCopy(no)=itemList(no)\n . k itemList\n . m itemList=listCopy\n QUIT error\n ;\nnumeric(value)\n i $e(value,1)=0,$l(value)>1 QUIT 0\n i value?1N.N QUIT 1\n i value?1\"-\"1N.N QUIT 1\n i value?1N.N1\".\"1N.N QUIT 1\n i value?1\"-\"1N.N1\".\"1N.N QUIT 1\n QUIT 0\n ; \nescape(value)\n i value[\"&\" s value=$$replaceAll(value,\"&\",\"&amp;\")\n i value[\"<\" s value=$$replaceAll(value,\"<\",\"&lt;\")\n i value[\">\" s value=$$replaceAll(value,\">\",\"&gt;\")\n QUIT value\n ;\nexternalSelect(keyId,selectExpression) ;\n ;\n n attributes,count,domainName,error,itemList,itemsAndAttrs,json,pos\n ;\n i $g(^zewd(\"trace\"))=1 d trace(\"in externalSelect - keyId = \"_keyId_\": select=\"_selectExpression)\n s error=$$runSelect(keyId,selectExpression,.itemList,.attributes,.domainName)\n i error'=\"\" d  QUIT json\n . s json=\"{\"\"error\"\":{\"\"errorCode\"\":\"\"\"_$p(error,\"~\",1)_\"\"\",\"\"errorMessage\"\":\"\"\"_$p(error,\"~\",2)_\"\"\"}}\"\n i $g(attributes)=\"count(*)\" d\n . n count,pos\n . s itemsAndAttrs(1,\"i\")=\"Domain\"\n . s itemsAndAttrs(1,\"a\",1,\"n\")=\"Count\"\n . s pos=\"\",count=0\n . f  s pos=$o(itemList(pos)) q:pos=\"\"  s count=count+1\n . s itemsAndAttrs(1,\"a\",1,\"v\",1)=count\n e  d\n . n attribs,attribArray,ex,itemName,no,rx,bx,val,vno\n . s pos=\"\"\n . f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . . s itemName=itemList(pos)\n . . k attribs,attribArray\n . . m attribs=attributes\n . . s ex=$$getAttributes(keyId,domainName,itemName,.attribs,.rx,.bx,1)\n . . s no=\"\"\n . . f  s no=$o(attribs(no)) q:no=\"\"  d\n . . . s attribArray(no,\"n\")=$g(attribs(no))\n . . . s vno=\"\"\n . . . f  s vno=$o(attribs(no,\"value\",vno)) q:vno=\"\"  d\n . . . . s val=attribs(no,\"value\",vno)\n . . . . ;s val=$$replaceAll(val,\"\"\"\",\"\\\"\"\")\n . . . . s val=$$replaceAll(val,\"\\\",\"\\\\\")\n . . . . s attribArray(no,\"v\",vno)=val\n . . m itemsAndAttrs(pos,\"a\")=attribArray\n . . s itemsAndAttrs(pos,\"i\")=itemName\n s pos=\"\",count=0\n f  s pos=$o(itemsAndAttrs(pos)) q:pos=\"\"  s count=count+1\n i count=1 d\n . n array\n . m array=itemsAndAttrs(1)\n . ;m ^rob=array\n . s json=$$arrayToJSON^zmwire(\"array\")\n . s json=\"[\"_json_\"]\"\n e  d\n . s json=$$arrayToJSON^zmwire(\"itemsAndAttrs\")\n i $g(^zewd(\"trace\"))=1 d trace(\"json=\"_json)\n QUIT json\n ;\ntrace(text,clear) ; trace  ;\n n i\n s text=$g(text)\n i $g(clear)=1 k ^%zewdTrace\n s i=$increment(^%zewdTrace)\n s ^%zewdTrace(i)=text\n QUIT\n ;\nreplaceAll(InText,FromStr,ToStr) ; Replace all occurrences of a substring\n ;\n n p\n ;\n s p=InText\n i ToStr[FromStr d  QUIT p\n . n i,stop,tempText,tempTo\n . s stop=0\n . f i=0:1:255 d  q:stop\n . . q:InText[$c(i)\n . . q:FromStr[$c(i)\n . . q:ToStr[$c(i)\n . . s stop=1\n . s tempTo=$c(i)\n . s tempText=$$replaceAll(InText,FromStr,tempTo)\n . s p=$$replaceAll(tempText,tempTo,ToStr)\n f  q:p'[FromStr  S p=$$replace(p,FromStr,ToStr)\n QUIT p\n ;\nreplace(InText,FromStr,ToStr) ; replace old with new in string\n ;\n n np,p1,p2\n ;\n i InText'[FromStr q InText\n s np=$l(InText,FromStr)+1\n s p1=$p(InText,FromStr,1),p2=$p(InText,FromStr,2,np)\n QUIT p1_ToStr_p2\n ;\nstripSpaces(string)\n i $zv[\"Cache\" QUIT $$stripSpaces^MDBMCache(string)\n ;\n s string=$$stripLeadingSpaces(string)\n QUIT $$stripTrailingSpaces(string)\n ;\nstripLeadingSpaces(string)\n ;\n n i\n ;\n f i=1:1:$l(string) QUIT:$e(string,i)'=\" \"\n QUIT $e(string,i,$l(string))\n ;\nstripTrailingSpaces(string)\n ;\n n i,spaces,new\n ;\n s spaces=$$makeString(\" \",100)\n s new=string_spaces\n QUIT $p(new,spaces,1)\n ;\nmakeString(char,len) ; create a string of len characters\n ;\n n str\n ;\n s str=\"\",$p(str,char,len+1)=\"\"\n QUIT str\n ;\ntest\n s select=\"select * from testing where attr3 = 'control'\"\n s key=\"rob\"\n s ok=$$externalSelect^MDB(key,select)\n QUIT\n ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/PRCAAPR.m",
    "content": "PRCAAPR ;WASH-ISC@ALTOONA,PA/RGY-PATIENT ACCOUNT PROFILE (CONT) ;3/9/94  8:41 AM\nV ;;4.5;Accounts Receivable;**198,221**;Mar 20, 1995\n ;;Per VHA Directive 10-93-142, this routine should not be modified.\nEN(PRCATY) ;\n NEW DIC,X,Y,DEBT,PRCADB,DA,PRCA,COUNT,OUT,SEL,BILL,BAT,TRAN,DR,DXS,DTOUT,DIROUT,DIRUT,DUOUT\nASK N DPTNOFZY,DPTNOFZK S (DPTNOFZY,DPTNOFZK)=1\n K OUT S COUNT=0 R !,\"Select DEBTOR NAME or BILL NUMBER: \",X:DTIME I \"^\"[$E(X) S $P(DEBT,\"^\",2)=\"\" G Q\n S X=$$UPPER^VALM1(X)\n S Y=$S($O(^PRCA(430,\"B\",X,0)):$O(^(0)),$O(^PRCA(430,\"D\",X,0)):$O(^(0)),1:-1)\n I Y>0 S DEBT=$P($G(^PRCA(430,Y,0)),\"^\",9) I DEBT S PRCADB=$P($G(^RCD(340,DEBT,0)),\"^\"),^DISV(DUZ,\"^PRCA(430,\")=Y,$P(DEBT,\"^\",2)=$$NAM^RCFN01(DEBT) D COMP,EN1^PRCAATR(Y) G:$D(DTOUT) Q G ASK\n S DIC=\"^RCD(340,\",DIC(0)=\"E\" D ^DIC G:Y<0 ASK\n S ^DISV(DUZ,\"^RCD(340,\")=+Y,PRCADB=$P(Y,\"^\",2),DEBT=+Y_\"^\"_$P(@(\"^\"_$P(PRCADB,\";\",2)_+PRCADB_\",0)\"),\"^\")\n D COMP,HDR^PRCAAPR1,HDR2^PRCAAPR1,DIS^PRCAAPR1 G:'$D(DTOUT) ASK\nQ K ^TMP(\"PRCAAPR\",$J) Q\nCOMP ;Compile patient bills\n K ^TMP(\"PRCAAPR\",$J)\n NEW STAT,STAT1,CNT,Y\n S STAT1=0\n F CNT=1:1 S STAT1=+$S(PRCATY=\"ALL\":$O(^PRCA(430,\"AS\",+DEBT,STAT1)),1:$O(^PRCA(430.3,\"AC\",+$P(PRCATY,\",\",CNT),0))) Q:'STAT1  F BILL=0:0 S BILL=$O(^PRCA(430,\"AS\",+DEBT,STAT1,BILL)) Q:'BILL  D COMP1\n I PRCADB[\";DPT(\" F BILL=0:0 S BILL=$O(^PRCA(430,\"E\",+PRCADB,BILL)) Q:'BILL  I PRCATY=\"ALL\"!((\",\"_PRCATY_\",\")[(\",\"_$P($G(^PRCA(430.3,+$P($G(^PRCA(430,BILL,0)),\"^\",8),0)),\"^\",3)_\",\")) D COMP1\n F BAT=0:0 S BAT=$O(^RCY(344,\"AC\",PRCADB,BAT)) Q:'BAT  F TRAN=0:0 S TRAN=$O(^RCY(344,\"AC\",PRCADB,BAT,TRAN)) Q:'TRAN  I $G(^RCY(344,BAT,1,TRAN,0))]\"\",$P(^(0),\"^\",5)=\"\" D COMP2\n Q\nCOMP1 S STAT=$P($G(^PRCA(430.3,+$P($G(^PRCA(430,BILL,0)),\"^\",8),0)),\"^\",3) Q:STAT=\"\"\n S X=$G(^PRCA(430,BILL,7)),Y=$P(X,\"^\")+$P(X,\"^\",2)+$P(X,\"^\",3)+$P(X,\"^\",4)+$P(X,\"^\",5)\n I $P(^PRCA(430,BILL,0),\"^\",2)=$O(^PRCA(430.2,\"AC\",33,0)) S Y=-Y\n S Y=$S($P(^PRCA(430,BILL,0),\"^\",2)=$O(^PRCA(430.2,\"AC\",33,0))&(STAT'=112):0,$P(^PRCA(430,BILL,0),\"^\",9)'=+DEBT:0,\",102,107,112,\"[(\",\"_STAT_\",\"):Y,1:0)\n S ^TMP(\"PRCAAPR\",$J,\"C\")=$G(^TMP(\"PRCAAPR\",$J,\"C\"))+Y\n S ^TMP(\"PRCAAPR\",$J,\"C\",STAT)=$G(^TMP(\"PRCAAPR\",$J,\"C\",STAT))+Y_\"^\"_STAT,^(STAT,BILL)=$P(X,\"^\",1,5)\n Q\nCOMP2 ;Compile payments\n S Y=$P(^RCY(344,BAT,1,TRAN,0),\"^\",4)\n S ^TMP(\"PRCAAPR\",$J,\"C\")=$G(^TMP(\"PRCAAPR\",$J,\"C\"))-Y\n S ^TMP(\"PRCAAPR\",$J,\"C\",99)=$G(^TMP(\"PRCAAPR\",$J,\"C\",99))-Y_\"^99\",^TMP(\"PRCAAPR\",$J,\"C\",99,$P(^RCY(344,BAT,0),\"^\")_\"-\"_TRAN)=$P(^RCY(344,BAT,1,TRAN,0),\"^\",4)\n Q\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/PXAI.m",
    "content": "PXAI ;ISL/JVS,ISA/KWP,ESW - PCE DRIVING RTN FOR 'DATA2PCE' API ;6/20/03 11:15am\n ;;1.0;PCE PATIENT CARE ENCOUNTER;**15,74,69,102,111,112,130,164,168**;Aug 12, 1996;Build 14\n Q\n ;\n ;+  1       2       3        4        5       6      7      8       9\nDATA2PCE(PXADATA,PXAPKG,PXASOURC,PXAVISIT,PXAUSER,PXANOT,ERRRET,PXAPREDT,PXAPROB,PXACCNT) ;+API to pass data for add/edit/delete to PCE.\n ;+  PXADATA  (required)\n ;+  PXAPKG   (required)\n ;+  PXASOURC (required)\n ;+  PXAVISIT (optional) is pointer to a visit for which the data is to\n ;+        be related.  If the visit is not known then there must be\n ;+        the ENCOUNTER nodes needed to lookup/create the visit.\n ;+  PXAUSER  (optional) this is a pointer to the user adding the data.\n ;+  PXANOT   (optional) set to 1 if errors are to be displayed to the screen should only be set while writing and debugging the initial code.\n ;+  ERRRET   (optional) passed by reference.  If present will return PXKERROR\n ;+                      array elements to the caller.\n ;+  PXAPREDT  (optional) Set to 1 if you want to edit the Primary Provider\n ;+            only use if for the moment that editing is being done. (dangerous)\n ;+  PXAPROB   (optional) A dotted variable name. When errors and\n ;+             warnings occur, They will be passed back in the form\n ;+            of an array with the general description of the problem.\n ;+ IF ERROR1 - (GENERAL ERRORS)\n ;+      PXAPROB($J,SUBSCRIPT,\"ERROR1\",PASSED IN 'FILE',PASSED IN FIELD,\n ;+              SUBSCRIPT FROM PXADATA)\n ;+      PXAPROB(23432234,2,\"ERROR1\",\"PROVIDER\",\"NAME\",7)=\"BECAUSE...\"\n ;+ IF WARNING2 - (GENERAL WARNINGS)\n ;+      PXAPROB($J,SUBSCRIPT,\"WARNING2\",PASSED IN 'FILE',PASSED IN FIELD,\n ;+              SUBSCRIPT FROM PXADATA)\n ;+      PXAPROB(23432234,3,\"WARNING2\",\"PROCEDURE\",\"QTY\",3)=\"BECAUSE...\"\n ;+ IF WARNING3 - (WARNINGS FOR SERVICE CONNECTION)\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"AO\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"EC\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"IR\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"SC\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"MST\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"HNC\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"CV\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"SHAD\")=REASON\n ;+ IF ERROR4 - (PROBLEM LIST ERRORS)\n ;+      PXAPROB($J,6,\"ERROR4\",\"PX/DL\",(SUBSCRIPT FROM PXADATA))=REASON\n ;+ PXACCNT    (optional)  passed by reference.  Returns the PFSS Account Reference if known.\n ;              Returned as null if the PFSS Account Reference is located in the Order file(#100)\n ;+\n ;+\n ;+ Returns:\n ;+   1  if no errors and process completely\n ;+  -1  if errors occurred but processed completely as possible\n ;+  -2  if could not get a visit\n ;+  -3  if called incorrectly\n ;\nNEW ;--NEW VARIABLES\n N NOVSIT,PXAK,DFN,PXAERRF,PXADEC,PXELAP,PXASUB\n N PATIENT,VALQUIET,PRIMFND\n K PXAERROR,PXKERROR,PXAERR,PRVDR\n S PXASUB=0,VALQUIET=1\n ; needs to look up if not passed. \n I '$G(PXAVISIT),'$D(@PXADATA@(\"ENCOUNTER\")) Q -3\n I $G(PXAUSER)<1 S PXAUSER=DUZ\n ;\n K ^TMP(\"PXK\",$J),^TMP(\"DIERR\",$J),^TMP(\"PXAIADDPRV\",$J)\nSOR ;--SOURCE\n I PXAPKG=+PXAPKG S PXAPKG=PXAPKG\n E  S PXAPKG=$$PKG2IEN^VSIT(PXAPKG)\n I PXASOURC=+PXASOURC S PXASOURC=PXASOURC\n E  S PXASOURC=$$SOURCE^PXAPIUTL(PXASOURC)\n ;\n D TMPSOURC^PXAPIUTL(PXASOURC) ;-SAVES & CREATES ^TMP(\"PXK\",$J,\"SOR\")\nVST ;--VISIT\n ;--KILL VISIT\n I $G(PXAVISIT) D VPTR^PXAIVSTV I $G(PXAERRF) D ERR Q -2\n D VST^PXAIVST\n I $G(PXAVISIT)<0 Q -2\n I $G(PXAERRF) D ERR K PXAERR Q -2\nPRV ;--PROVIDER\n S PATIENT=$P($G(^AUPNVSIT(PXAVISIT,0)),\"^\",5)\n S (PXAK,PRIMFND)=0\n F  S PXAK=$O(@PXADATA@(\"PROVIDER\",PXAK)) Q:(PRIMFND)!(PXAK=\"\")  D\n .I $D(@PXADATA@(\"PROVIDER\",PXAK,\"PRIMARY\")) D\n ..S PRIMFND=$G(@PXADATA@(\"PROVIDER\",PXAK,\"PRIMARY\"))\n I 'PRIMFND D  ;Check for each provider's status as Primary or Secondary\n .S PXAK=0 F  S PXAK=$O(@PXADATA@(\"PROVIDER\",PXAK)) Q:PXAK=\"\"  D\n ..I '$D(@PXADATA@(\"PROVIDER\",PXAK,\"PRIMARY\")) D PROVDRST\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"PROVIDER\",PXAK)) Q:PXAK=\"\"  D\n . D PRV^PXAIPRV I $G(PXAERRF) D ERR\n K PRI ;--FLAG FOR PRIMARY PROVIDER\n K PXAERR\nPOV ;--DIAGNOSIS\n S (PXAK,PRIMFND)=0\n F  S PXAK=$O(@PXADATA@(\"DX/PL\",PXAK)) Q:(PXAK=\"\")  D  Q:PRIMFND\n .I +$G(@PXADATA@(\"DX/PL\",PXAK,\"PRIMARY\"))=1 D\n ..S PRIMFND=$G(@PXADATA@(\"DX/PL\",PXAK,\"DIAGNOSIS\"))\n I $D(@PXADATA@(\"DX/PL\")) D POVPRM(PXAVISIT,PRIMFND,.PXADATA) D\n .S PXAK=0 F  S PXAK=$O(@PXADATA@(\"DX/PL\",PXAK))  Q:PXAK=\"\"  D\n ..D POV^PXAIPOV I $G(PXAERRF) D ERR\n K PXAERR\n ;\nCPT ;--PROCEDURE\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"PROCEDURE\",PXAK))  Q:PXAK=\"\"  D\n . D CPT^PXAICPT I $G(PXAERRF) D ERR\n K PXAERR\n ;\nEDU ;--PATIENT EDUCATION\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"PATIENT ED\",PXAK))  Q:PXAK=\"\"  D\n . D EDU^PXAIPED I $G(PXAERRF) D ERR\n K PXAERR\n ;\nEXAM ;--EXAMINATION\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"EXAM\",PXAK))  Q:PXAK=\"\"  D\n . D EXAM^PXAIXAM I $G(PXAERRF) D ERR\n K PXAERR\n ;\nHF ;--HEALTH FACTOR\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"HEALTH FACTOR\",PXAK))  Q:PXAK=\"\"  D\n . D HF^PXAIHF I $G(PXAERRF) D ERR\n K PXAERR\n ;\nIMM ;--IMMUNIZATION\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"IMMUNIZATION\",PXAK))  Q:PXAK=\"\"  D\n . D IMM^PXAIIMM I $G(PXAERRF) D ERR\n K PXAERR\n ;\nSKIN ;--SKIN TEST\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"SKIN TEST\",PXAK))  Q:PXAK=\"\"  D\n . D SKIN^PXAISK I $G(PXAERRF) D ERR\n K PXAERR\n ;\n ;\n D OTHER^PXAIPRV\n ;\n ;\n I $D(^TMP(\"PXK\",$J)) D\n . D EN1^PXKMAIN\n . M ERRRET=PXKERROR\n . D PRIM^PXAIPRV K PRVDR\n . D EVENT^PXKMAIN\n S PXACCNT=$P($G(^AUPNVSIT(PXAVISIT,0)),\"^\",26) ;PX*1.0*164 ;Sets the PFSS Account Reference, if any\n K ^TMP(\"PXK\",$J),PXAERR,PXKERROR\n Q $S($G(PXAERRF):-1,1:1)\n ;\n ;\nEXIT ;--EXIT AND CLEAN UP\n D EVENT^PXKMAIN\n K ^TMP(\"PXK\",$J),PRVDR\n K PXAERR\n Q\n ;-----------------SUBROUTINES-----------------------\nERR ;\n ;\n ;\n I '$D(PXADI(\"DIALOG\")) Q\n N NODE,SCREEN\n S PXAERR(1)=$G(PXADATA),PXAERR(2)=$G(PXAPKG),PXAERR(3)=$G(PXASOURC)\n S PXAERR(4)=$G(PXAVISIT),PXAERR(5)=$G(PXAUSER)_\"  \"_$P($G(^VA(200,PXAUSER,0)),\"^\",1)\n I $G(PXANOT)=1 D EXTERNAL\n E  D INTERNAL\n D ARRAY^PXAICPTV\n K PXADI(\"DIALOG\")\n Q\n ;\nEXTERNAL ;---SEND ERRORS TO SCREEN\n W !,\"-----------------------------------------------------------------\"\n D BLD^DIALOG($G(PXADI(\"DIALOG\")),.PXAERR,\"\",\"SCREEN\",\"F\")\n D MSG^DIALOG(\"ESW\",\"\",50,10,\"SCREEN\")\n ;\n Q\nINTERNAL ;---SET ERRORS TO GLOBAL ARRAY\n S NODE=PXADATA\n D BLD^DIALOG($G(PXADI(\"DIALOG\")),.PXAERR,.PXAERR,NODE,\"F\")\n S NODE=$NA(@PXADATA@(\"DIERR\",$J)) D MSG^DIALOG(\"ESW\",\"\",50,10,NODE)\n Q\n ;\nPROVDRST ; Check provider status (Primary or Secondary)\n N PRVIEN,DETS,DIC,DR,DA,DIQ,PRI,PRVPRIM\n I $G(PXAK)=\"\" QUIT\n S PRVIEN=0\n F  S PRVIEN=$O(^AUPNVPRV(\"AD\",PXAVISIT,PRVIEN)) Q:PRVIEN=\"\"  D\n .S DETS=$G(^AUPNVPRV(PRVIEN,0))\n .I $P(DETS,U)=$G(@PXADATA@(\"PROVIDER\",PXAK,\"NAME\")) D\n ..S DIC=9000010.06,DR=.04,DA=PRVIEN\n ..S DIQ=\"PRVPRIM(\",DIQ(0)=\"EI\" D EN^DIQ1\n ..S PRI=$E($G(PRVPRIM(9000010.06,DA,DR,\"E\")),1,1)\n ..S @PXADATA@(\"PROVIDER\",PXAK,\"PRIMARY\")=$S(PRI=\"P\":1,1:0)\n Q\nPOVPRM(VISIT,PRIMFND,POVARR) ;\n N PRVIEN,DETS,STOP,LPXAK,ORDX,NDX,ORDXP\n S PRVIEN=0\n ;create array of existing DX; ORDX - pointer to ^ICD9(\n F  S PRVIEN=$O(^AUPNVPOV(\"AD\",PXAVISIT,PRVIEN)) Q:PRVIEN=\"\"  D\n .S DETS=$G(^AUPNVPOV(PRVIEN,0)),ORDX=$P(DETS,U)\n .S ORDX(ORDX)=PRVIEN I $P(DETS,U,12)=\"P\" S ORDXP(ORDX)=\"\"\n ; create array of passed DX; NDX - pointer to ^ICD9(\n S PXAK=0 F  S PXAK=$O(@POVARR@(\"DX/PL\",PXAK)) Q:PXAK=\"\"  D\n .S NDX=$G(@POVARR@(\"DX/PL\",PXAK,\"DIAGNOSIS\")) S NDX(NDX)=PXAK\n ; force entry of originally primary diagnosis with \"S\" flag\n I PRIMFND S ORDX=\"\" D\n .F  S ORDX=$O(ORDXP(ORDX)) Q:ORDX=\"\"  I PRIMFND'=ORDX D\n ..I $D(NDX(ORDX)) S @POVARR@(\"DX/PL\",NDX(ORDX),\"PRIMARY\")=0\n ..E  D\n ...S LPXAK=$O(@POVARR@(\"DX/PL\",\"\"),-1)\n ...S @POVARR@(\"DX/PL\",LPXAK+1,\"DIAGNOSIS\")=ORDX\n ...S @POVARR@(\"DX/PL\",LPXAK+1,\"PRIMARY\")=0\n Q\n ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/WVBRNOT.m",
    "content": "WVBRNOT ;HCIOFO/FT,JR IHS/ANMC/MWR - BROWSE NOTIFICATIONS; ;7/30/98  11:02\n ;;1.0;WOMEN'S HEALTH;;Sep 30, 1998\n ;;* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER *\n ;;  CALLED BY OPTION: \"WV BROWSE NOTIFICATIONS\" TO BROWSE AND EDIT\n ;;  NOTIFICATIONS.\n ;\n ;---> VARIABLES:\n ;---> WVA:   1=ALL PATIENTS, 0=ONE PATIENT\n ;---> WVDFN: DFN OF SELECTED PATIENT\n ;---> DATES: WVBEGDT=BEGINNING DATE, WVENDDT=ENDING DATE\n ;---> WVB:   d=DELINQUENT, o=OPEN, q=queued, a=ALL (includes CLOSED).\n ;---> SORT SEQUENCE IN WVC:  1=DATE, PATIENT, PRIORITY\n ;--->                        2=PATIENT, DATE, PRIORITY\n ;--->                        3=PRIORITY, DATE, PATIENT\n ;---> USE NODES 3 & 4 IN ^TMP GLOBAL.\n ;\n D SETVARS^WVUTL5\n D ^WVBRNOT2 G:WVPOP EXIT\n D SORT\n D COPYGBL\n D ^WVBRNOT1\n ;\nEXIT ;EP\n D KILLALL^WVUTL8\n Q\n ;\n ;\nSORT ;EP\n ;---> SORT AND STORE ARRAY IN ^TMP(\"WV\",$J\n K ^TMP(\"WV\",$J)\n ;---> WVBEGDT1=ONE SECOND BEFORE BEGIN DATE.\n ;---> WVENDDT1=THE LAST SECOND OF END DATE.\n S WVBEGDT1=WVBEGDT-.0001,WVENDDT1=WVENDDT+.9999\n ;\n ;**************************\n ;---> WVA=1: ALL PATIENTS\n I WVA D  Q\n .;---> BY DATE GET EITHER ALL OR OPEN ONLY.\n .N WVDFN,WVIEN,Y\n .S WVXREF=$S(WVB=\"a\":\"D\",WVB=\"q\":\"APRT\",1:\"AOPEN\")\n .S WVDATE=WVBEGDT1\n .F  S WVDATE=$O(^WV(790.4,WVXREF,WVDATE)) Q:'WVDATE!(WVDATE>WVENDDT1)  D\n ..S WVIEN=0\n ..F  S WVIEN=$O(^WV(790.4,WVXREF,WVDATE,WVIEN)) Q:'WVIEN  D\n ...Q:'$D(^WV(790.4,WVIEN,0))\n ...S Y=^WV(790.4,WVIEN,0),WVDFN=$P(Y,U)\n ...;---> QUIT IF SELECTING FOR ONE CASE MANAGER AND THIS DOESN'T MATCH.\n ...I 'WVE Q:$P(^WV(790,WVDFN,0),U,10)'=WVCMGR\n ...;---> QUIT IF LISTING \"DELINQUENT\" AND THIS PROCDURE IS NOT DELINQ.\n ...I WVB=\"d\" Q:$P(Y,U,13)'<DT!($P(Y,U,13)=\"\")\n ...D STORE\n ;\n ;**************************\n ;---> WVA=0: ONE PATIENT\n N WVIEN,Y S WVIEN=0\n F  S WVIEN=$O(^WV(790.4,\"B\",WVDFN,WVIEN)) Q:'WVIEN  D\n .S Y=^WV(790.4,WVIEN,0)\n .;---> QUIT IF NOT WITHIN DATE RANGE.\n .S WVDATE=$P(Y,U,2)\n .Q:WVDATE'>WVBEGDT1!(WVDATE>WVENDDT1)\n .;---> QUIT IF \"QUEUED\" AND THIS NOTIFICATION IS NOT QUEUED.\n .I WVB=\"q\" Q:'$P(Y,U,11)  Q:'$D(^WV(790.4,\"APRT\",$P(Y,U,11),WVIEN))\n .;---> QUIT IF \"DELINQUENT\" OR OPEN ONLY AND THIS ENTRY IS CLOSED.\n .Q:\"do\"[WVB&($P(Y,U,14)=\"c\")\n .I WVB=\"d\" Q:$P(Y,U,13)'<DT!($P(Y,U,13)=\"\")\n .D STORE\n Q\n ;\nSTORE ;EP\n ;--->WVDATE IS ALREADY SET FROM LL SORT ABOVE.      ;---> DATE\n S WVCHRT=$$SSN^WVUTL1(WVDFN)_\" \"                    ;---> SSN#\n S WVNAME=$$NAME^WVUTL1(WVDFN)                       ;---> NAME\n S WVACC=$P(Y,U,6)                                   ;---> ACCESSION#\n I WVACC]\"\" S WVACC=$P(^WV(790.1,WVACC,0),U)\n S WVSTAT=$$STATUS^WVUTL4                            ;---> STATUS\n S WVPRIO=9\n S:$P(Y,U,4)]\"\" WVPRIO=$P(^WV(790.404,$P(Y,U,4),0),U,2)  ;---> PRIORITY\n ;\n S X=WVCHRT_U_WVNAME_U_WVDATE_U_WVACC_U_WVSTAT_U_WVPRIO_U_WVIEN\n I WVC=1 S ^TMP(\"WV\",$J,3,WVDATE,WVNAME,WVPRIO,WVIEN)=X Q\n I WVC=2 S ^TMP(\"WV\",$J,3,WVNAME,WVDATE,WVPRIO,WVIEN)=X Q\n I WVC=3 S ^TMP(\"WV\",$J,3,WVPRIO,WVDATE,WVNAME,WVIEN)=X\n Q\n ;\nCOPYGBL ;EP\n ;---> COPY ^TMP(\"WV\",$J,3 TO ^TMP(\"WV\",$J,4 TO MAKE IT FLAT.\n N I,M,N,P,Q\n S N=0,I=0\n F  S N=$O(^TMP(\"WV\",$J,3,N)) Q:N=\"\"  D\n .S M=0\n .F  S M=$O(^TMP(\"WV\",$J,3,N,M)) Q:M=\"\"  D\n ..S P=0\n ..F  S P=$O(^TMP(\"WV\",$J,3,N,M,P)) Q:P=\"\"  D\n ...S Q=0\n ...F  S Q=$O(^TMP(\"WV\",$J,3,N,M,P,Q)) Q:Q=\"\"  D\n ....S I=I+1,^TMP(\"WV\",$J,4,I)=^TMP(\"WV\",$J,3,N,M,P,Q)\n Q\n ;\n ;\nDEQUEUE ;EP\n ;---> TASKMAN QUEUE OF PRINTOUT.\n D SETVARS^WVUTL5,SORT,COPYGBL,^WVBRNOT1,EXIT\n Q\n ;\nFOLLOW(WVDFN) ;EP\n ;---> CALLED FROM PROCEDURE FOLLOWUP MENU.\n D SETVARS^WVUTL5\n S WVA=0,WVB=\"o\",WVBEGDT=(DT-50000),WVC=1,WVE=1,WVENDDT=DT\n D DEVICE^WVBRNOT2 Q:WVPOP\n S WVLOOP=1\n D SORT,COPYGBL,^WVBRNOT1\n Q\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/ZDIOUT1.m",
    "content": "ZDIOUT1 ; Experimental FileMan file output to host file\n ;---------------------------------------------------------------------------\n ; Copyright 2011 The Open Source Electronic Health Record Agent\n ;\n ; Licensed under the Apache License, Version 2.0 (the \"License\");\n ; you may not use this file except in compliance with the License.\n ; You may obtain a copy of the License at\n ;\n ;     http://www.apache.org/licenses/LICENSE-2.0\n ;\n ; Unless required by applicable law or agreed to in writing, software\n ; distributed under the License is distributed on an \"AS IS\" BASIS,\n ; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ; See the License for the specific language governing permissions and\n ; limitations under the License.\n ;---------------------------------------------------------------------------\n N  W \"Experimental FileMan file output to host file\",!\n D ASKFILE Q:FILE[\"^\"\n D ASKDIR Q:DIR[\"^\"\n D SAVEFILE(FILE,DIR)\n Q\nSAVEFILE(FILE,DIR) ; Save FILE to given host directory\n I '$$SLASH(DIR) Q\n N FGR S FGR=$$FGR(FILE) Q:'$$CHECK(FGR,\"Not a valid file number: \"_FILE)\n S IO=DIR_$P($E(FGR,2,$L(FGR)),\"(\")_\"+\"_$$FILENAME(FILE,FGR)_\".txt\"\n W IO,!\n C IO O IO:(\"WNS\"):1 E  U $P W \"Cannot open \"\"\"_IO_\"\"\" for write!\",! Q\n D FILE(\"\",FILE,FGR)\n C IO\n Q\nPRNFILE(FILE,IO) ; Print FILE, optionally to IO device\n S:'$D(IO) IO=$P\n N FGR S FGR=$$FGR(FILE) Q:'$$CHECK(FGR,\"Not a valid file number: \"_FILE)\n D FILE(\"\",FILE,FGR)\n Q\nPRNENTRY(FILE,I,IO) ; Print FILE record #I, optionally to IO device\n S:'$D(IO) IO=$P\n N FGR S FGR=$$FGR(FILE) Q:'$$CHECK(FGR,\"Not a valid file number: \"_FILE)\n N DD D DDCR(FILE,.DD)\n D ENTITY(\"\",FILE,.DD,$$EGR(FGR,I))\n Q\nPRNDD(FILE,IO) ; Print DD for FILE, optionally to IO device\n S:'$D(IO) IO=$P\n ; DD(FILE) is a file#0 whose entries define fields of FILE\n N FGR S FGR=$NA(^DD(FILE))\n I '$D(@FGR) W \"Not a valid file number: \"_FILE,! Q\n D FILE(\"\",0,FGR)\n Q\n ;---------------------------------------------------------------------------\n ; Private implementation entry points below.\n ; References cite the VA FileMan 22.0 Programmer Manual.\n ;\nASKFILE ; Ask for file number\n R !,\"File#: \",FILE G:FILE=\"\" ASKFILE Q:FILE[\"^\"  S FILE=+FILE\n S FGR=$$FGR(FILE)\n I '$$CHECK(FGR,\" (Not a valid file number)\") G ASKFILE\n W \"  \",$$FILENAME(FILE,FGR)\n Q\nASKDIR ; Ask for host dir\n R !,!,\"Host output directory: \",DIR,! Q:DIR[\"^\"   G:'$$SLASH(DIR) ASKDIR\n Q\nSLASH(DIR) ; Validate trailing slash\n I $E(DIR,$L(DIR))?1(1\"/\",1\"\\\") Q 1\n E  U $P W \"Output directory must end in a slash!\" Q 0\nFGR(FILE) ; Get FILE Global Root\n Q $$ROOT^DILFD(FILE,\"\",1)\nEGR(FGR,I) ; Get ENTRY Global Root\n Q $NA(@FGR@(I))\nCHECK(V,MSG) ; Validate non-empty value\n I V=\"\" W MSG,! Q 0\n Q 1\nDDCR(FILE,DD) ; X-ref global subscript location to DD field\n ; The DD field definition 0-node has ^-pieces \"^^^S;P^\" where\n ; \"S;P\" is the node Subscript and Piece within the node value (14.9.2).\n N F S F=\"\" F  S F=$O(^DD(FILE,F)) Q:F=\"\"  D:+F\n . N F4,S,P S F4=$P(^DD(FILE,F,0),\"^\",4),S=$P(F4,\";\",1),P=$P(F4,\";\",2) Q:S=\" \"\n . S DD(S,F)=P ; Subscript S contains field F at piece P\n Q\nFILE(D,FILE,FGR) ; Write all entries in a file\n ; TODO: Sort entries by .01 or KEY to ensure consistent order\n N DD D DDCR(FILE,.DD)\n N I S I=\"\" F  S I=$O(@FGR@(I)) Q:I=\"\"  D\n . I +I D\n . . D ENTITY(D,FILE,.DD,$$EGR(FGR,I))\n . E  D ; TODO: Handle known non-entry subscripts such as \"B\"\n . . D SUBS(D,$$EGR(FGR,I),I)\n Q\nWP(D,FGR) ; Write a word-processing value\n ; A word processing field is actually a file in which each entry has a\n ; .01 field containing the line of text, and the type of the field has \"W\".\n U IO W D,\";\",$$VALUE(@FGR@(0)),! ; TODO: Preserve date from ^(0)\n N I S I=\"\" F  S I=$O(@FGR@(I)) Q:I=\"\"  D:+I ; TODO: Other subscripts?\n . U IO W D,$$VALUE(@FGR@(I,0)),!\n U IO W D,\";\",!\n Q\nENTITY(D,FILE,DD,EGR) ; Write a file entry\n U IO W D,\"ENTITY\"_$C(9)_\";;\"_$$FILENAME(FILE,FGR)_\"^\"_$S(FILE=0:\"\",1:FILE)_\" ;\"_EGR,!\n U IO W D_$C(9)_\";\",!\n ; Add key tag with field .01 value (14.9.2).\n ; TODO: Use indexing cross-references or KEY file entries for key tags?\n ; TODO: Escape key values, handle pointers?\n U IO W D,\"KA\"_$C(9)_\";;\",$P(@EGR@(0),\"^\"),!\n U IO W D_$C(9)_\";\",!\n N S S S=\"\" F  S S=$O(@EGR@(S)) Q:S=\"\"  D ; Find DD fields at S.\n . I $D(DD(S))<10 D ; TODO: Field defs like \"DEL\" not in ^DD(0)\n . . D SUBS(D,$NA(@EGR@(S)),S)\n . N F S F=\"\" F  S F=$O(DD(S,F)) Q:F=\"\"  D\n . . D FIELD(D,FILE,F,$NA(@EGR@(S)),DD(S,F))\n Q\n ;\nSUBS(D,G,S) ; Write an extraneous subscript\n U IO W D,\"SUBS\"_$C(9)_\";;\"_S,!\n I $D(@G)#10 U IO W D_$C(9),$$VALUE(@G),!\n I $D(@G)\\10 U IO W D_$C(9),\"; OMITTED CHILDREN\",!\n U IO W D_$C(9),\";\",!\n Q\nFIELD(D,FILE,F,EGRF,P) ; Write a field\n ; The DD field definition 0-node has ^-pieces \"NAME^TYPE^\" (14.9.2).\n N FD S FD=^DD(FILE,F,0)\n N NAME S NAME=$P(FD,\"^\",1)\n N TYPE S TYPE=$P(FD,\"^\",2)\n ; TYPE starts with a subfile number if the field is a multiple (14.9.2)\n N SUBFILE S SUBFILE=+TYPE\n I SUBFILE D\n . D FIELDSUB\n E  D\n . D FIELDONE\n Q\nFIELDTAG ; Write tag for a field\n U IO W D,\"F\"_$TR(F,\".\",\"P\")_$C(9)_\";;\"_NAME_\"^\"_F_\" ;\"_TYPE,!\n Q\nFIELDSUB ; Write a multiple-valued field\n D FIELDTAG\n I $D(@EGRF)#10 U IO W D_$C(9),\"; OMITTED SELF\",!\n ; Word-processing values are files whose .01 field type has \"W\".\n I $P($G(^DD(SUBFILE,.01,0)),\"^\",2)[\"W\" D\n . D WP(D_$C(9),EGRF)\n E  D\n . D FILE(D_$C(9),SUBFILE,EGRF) U IO W D_$C(9),\";\",!\n Q\nFIELDONE ; Write a single-valued field\n N V S V=$$FIELDVAL(EGRF,P) Q:V=\"\"\n N EV ; Some TYPEs have an external-format value\n N T S T=TYPE\n I T[\"F\" S TYPE=TYPE_\";\"_\"Free Text\"\n I T[\"N\" S TYPE=TYPE_\";\"_\"Numeric\"\n I T[\"K\" S TYPE=TYPE_\";\"_\"MUMPS Code\"\n I T[\"P\" S TYPE=TYPE_\";\"_\"Pointer\",EV=1\n I T[\"V\" S TYPE=TYPE_\";\"_\"Variable Pointer\",EV=1\n I T[\"S\" S TYPE=TYPE_\";\"_\"Set of Codes\",EV=1\n I T[\"D\" S TYPE=TYPE_\";\"_\"Date\",EV=1\n I $D(EV) S V=V_\"^\"_$$EXTERNAL^DILFD(FILE,F,\"\",V)\n D FIELDTAG\n U IO W D_$C(9),$$VALUE(V),!\n I $D(@EGRF)\\10 U IO W D_$C(9),\"; OMITTED CHILDREN\",!\n U IO W D_$C(9),\";\",!\n Q\nFIELDVAL(EGRF,P) ; Extract piece P of node value holding field\n I +P Q $P(@EGRF,\"^\",P)\n I $E(P,1)=\"E\" Q $E(@EGRF,$P($E(P,2,$L(P)),\",\",1),$P(P,\",\",2))\n Q \";UNKNOWN \"\"GLOBAL SUBSCRIPT LOCATION\"\" PIECE \"\"\"_P_\"\"\"\"\n ;\nFILENAME(FILE,FGR) ; Lookup the name of given FILE# (or subfile#)\n I FILE=0 Q $P(@FGR@(0),\"^\") ; DD\n Q $O(^DD(FILE,0,\"NM\",\"\")) ; TODO: Reliable?  Any documented API?\nVALUE(V) ; Write value line to output\n ; TODO: If value starts in one of \" $ ; or contains non-printing\n ; characters then it must be escaped for evaluation on RHS of SET.\n ; TODO: Caller must define indentation level with a comment if\n ; the first character of the first value is a tab or space.\n Q V\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/_zewdAPI.m",
    "content": "%zewdAPI\t; Enterprise Web Developer run-time functions and user APIs\n ;\n ; Product: Enterprise Web Developer (Build 944)\n ; Build Date: Fri, 23 Nov 2012 17:15:06\n ; \n ; ----------------------------------------------------------------------------\n ; | Enterprise Web Developer for GT.M and m_apache                           |\n ; | Copyright (c) 2004-12 M/Gateway Developments Ltd,                        |\n ; | Reigate, Surrey UK.                                                      |\n ; | All rights reserved.                                                     |\n ; |                                                                          |\n ; | http://www.mgateway.com                                                  |\n ; | Email: rtweed@mgateway.com                                               |\n ; |                                                                          |\n ; | This program is free software: you can redistribute it and/or modify     |\n ; | it under the terms of the GNU Affero General Public License as           |\n ; | published by the Free Software Foundation, either version 3 of the       |\n ; | License, or (at your option) any later version.                          |\n ; |                                                                          |\n ; | This program is distributed in the hope that it will be useful,          |\n ; | but WITHOUT ANY WARRANTY; without even the implied warranty of           |\n ; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            |\n ; | GNU Affero General Public License for more details.                      |\n ; |                                                                          |\n ; | You should have received a copy of the GNU Affero General Public License |\n ; | along with this program.  If not, see <http://www.gnu.org/licenses/>.    |\n ; ----------------------------------------------------------------------------\n ;\n ;QUIT\n ;\n ;\nversion() ;\n QUIT \"Enterprise Web Developer (Build \"_$$getVersion^%zewdCompiler()_\")\"\n ;\ndate() ;\n QUIT $$getDate^%zewdCompiler()\n ;\ncompilePage(app,page,mode,technology,outputPath,multilingual,maxLines)\n d compilePage^%zewdCompiler($g(app),$g(page),$g(mode),$g(technology),$g(outputPath),$g(multilingual),$g(maxLines))\n QUIT\n ;\ncompileAll(app,mode,technology,outputPath,multilingual,templatePageName,maxLines)\n d compileAll^%zewdCompiler($g(app),$g(mode),$g(technology),$g(outputPath),$g(multilingual),$g(templatePageName),$g(maxLines))\n QUIT\n ;\nautoTranslate(app,language,verbose)\n d autoTranslate^%zewdMgr($g(app),$g(language),$g(verbose))\n ;\nstartSession(page,requestArray,serverArray,sessionArray,filesArray) ;\n ;\n QUIT $$startSession^%zewdPHP(page,.requestArray,.serverArray,.sessionArray,.filesArray)\n ;\ncloseSession(requestArray) ;\n ;\n QUIT $$closeSession^%zewdPHP(.requestArray)\n ;\nsaveSession(sessionArray) ;\n ;\n d saveSession^%zewdPHP(.sessionArray)\n QUIT\n ;\nendOfPage(sessionArray)\n ;\n d endOfPage^%zewdPHP(.sessionArray)\n QUIT\n ;\nprePageScript(sessid)\n QUIT $$prePageScript^%zewdPHP(sessid)\n ;\nreleaseLock(sessid)\n d releaseLock^%zewdPHP(sessid)\n QUIT\n ;\ntokeniseURL(url,sessid)\n QUIT $$tokeniseURL^%zewdCompiler16($g(url),$g(sessid))\n ;\ngetSessid(token)\n ;\n i token=\"\" QUIT \"\"\n i $$isTokenExpired(token) QUIT \"\"\n QUIT $p(^%zewdSession(\"tokens\",token),\"~\",1)\n ;\ninitialiseSession(sessid)\n k ^%zewdSession(\"session\",sessid)\n QUIT\n ;\ndeleteSession(sessid)\n ;\n d deleteSession^%zewdPHP(sessid)\n ;\n QUIT\n ;\nchangeApp(appName,sessid)\n i $g(appName)=\"\" QUIT\n i $g(sessid)=\"\" QUIT\n d setSessionValue(\"ewd_appName\",appName,sessid)\n QUIT\n ;\nsetRedirect(toPage,sessid,app)\n i $g(app)'=\"\" d\n . d setSessionValue(\"ewd_appName\",app,sessid)\n d setJump(toPage,sessid,$g(app))\n QUIT\n ;\nsetJump(toPage,sessid,app)\n ;\n n token\n ;\n i $g(app)'=\"\",$e(sessid,1,4)=\"csp:\" d\n . n path\n . s path=$$getRootURL(\"csp\")\n . i $e(path,$l(path))'=\"/\" s path=path_\"/\"\n . s toPage=path_app_\"/\"_toPage\n d setSessionValue(\"ewd_jump\",toPage,sessid)\n d setSessionValue(\"ewd_nextPage\",toPage,sessid)\n QUIT:$e(sessid,1,4)=\"csp:\"\n s token=$$setNextPageToken(toPage,sessid)\n d setSessionValue(\"ewd_pageToken\",token,sessid)\n QUIT\n ;\nsetNextPageToken(nextPage,sessid)\n ;\n n token,length\n ;\n s length=$$getSessionValue(\"ewd_sessid_length\",sessid)\n i length=\"\" s length=30\n i $g(sessid)=\"\" s sessid=0\n f  s token=$$makeTokenString(length) q:'$d(^%zewdSession(\"nextPageTokens\",sessid,token))\n i $g(^zewd(\"trace\"))=1 d trace^%zewdAPI(\"setNextPageToken^%zewdAPI: sessid=\"_sessid_\"; token=\"_token_\"; nextPage=\"_nextPage)\n s ^%zewdSession(\"nextPageTokens\",sessid,token,$$zcvt(nextPage,\"l\"))=\"\"\n QUIT token\n ; \nisNextPageTokenValid(token,sessid,page)\n QUIT $$isNextPageTokenValid^%zewdCompiler13(token,sessid,page)\n ;\nisCSP(sessid)\n QUIT $e(sessid,1,4)=\"csp:\"\n ;\nnormaliseTextValue(text)\n s text=$$replaceAll(text,\"&#39;\",\"'\")\n QUIT $$zcvt(text,\"o\",\"HTML\")\n ;\nwriteLine(line,technology)\n i technology=\"node\" d\n . s ^CacheTempBuffer($j,$increment(^CacheTempBuffer($j)))=line\n e  d\n . w line\n QUIT\n ;\ndisplayOptions(fieldName,listName,escape)\n ;d displayOptions^%zewdCompiler13($g(fieldName),$g(listName),$g(escape))\n n codeValue,%d,i,line,name,nnvp,nvp,pos,technology,textValue,value\n ;\n s technology=$$getSessionValue^%zewdAPI(\"ewd.technology\",sessid)\n s fieldName=$tr(fieldName,\".\",\"_\")\n s listName=$tr(listName,\".\",\"_\")\n i 0\n e  d\n . s escape=+$g(escape)\n . s pos=\"\"\n . f  s pos=$o(^%zewdSession(\"session\",sessid,\"ewd_list\",listName,pos)) q:pos=\"\"  d\n . . k %d,textValue,codeValue,codeValueEsc,textValueEsc\n . . s %d=^%zewdSession(\"session\",sessid,\"ewd_list\",listName,pos)\n . . s textValue=$p(%d,$c(1),1)\n . . ;\n . . s textValueEsc=textValue\n . . i $g(^zewd(\"xssEncoding\")) d\n . . . s textValueEsc=$$htmlOutputEncode^%zewdAPI2(textValueEsc)\n . . e  d \n . . . s textValueEsc=$$replaceAll(textValueEsc,\"&#39;\",\"'\")\n . . . i escape s textValueEsc=$$zcvt(textValue,\"o\",\"HTML\")\n . . ;\n . . s codeValue=$p(%d,$c(1),2)\n . . i codeValue=\"\" s codeValue=textValue\n . . s codeValueEsc=codeValue\n . . i $g(^zewd(\"xssEncoding\")) d\n . . . s codeValueEsc=$$htmlOutputEncode^%zewdAPI2(codeValueEsc)\n . . e  d \n . . . s codeValueEsc=$$replaceAll(codeValueEsc,\"&#39;\",\"'\")\n . . . i escape s codeValueEsc=$$zcvt(codeValue,\"o\",\"HTML\")\n . . s line=\"<option value='\"_codeValueEsc_\"'\"\n . . d writeLine(line,technology)\n . . i $e(fieldName,1)'=\"$\" d\n . . . n fn\n . . . s fn=$tr(fieldName,\"_\",\".\")\n . . . i $$getSessionValue(fn,sessid)=codeValue d  q\n . . . . s line=\" selected='selected'\"\n . . . . d writeLine(line,technology)\n . . . i $d(^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName,codeValue)) d  q\n . . . . s line=\" selected='selected'\"\n . . . . d writeLine(line,technology)\n . . i $e(fieldName,1)=\"$\" d\n . . . n fieldValue\n . . . s fieldValue=$e(fieldName,2,$l(fieldName))\n . . . s fieldValue=$g(@fieldValue)\n . . . i fieldValue=codeValue d\n . . . . s line=\" selected='selected'\"\n . . . . d writeLine(line,technology)\n . . s nnvp=$l(%d,$c(1))\n . . f i=3:1:nnvp d\n . . . s nvp=$p(%d,$c(1),i)\n . . . i nvp=\"\" q\n . . . s name=$p(nvp,$c(3),1)\n . . . s value=$p(nvp,$c(3),2)\n . . . s line=\" \"_name_\"='\"_value_\"'\"\n . . . d writeLine(line,technology)\n . . s line=\">\"_textValueEsc_\"</option>\"_$c(13,10)\n . . d writeLine(line,technology)\n QUIT\n ;\ndisplayTextArea(fieldName)\n d displayTextArea^%zewdCompiler13($g(fieldName))\n QUIT\n ;\nmCSPReq2(fields)\n ;\n n i,noOfFields,field,type\n s noOfFields=$l(fields,\"`\")\n f i=1:1:noOfFields d\n . s field=$p(fields,\"`\",i)\n . q:field=\"\"\n . s type=$p(field,\"|\",2)\n . S field=$P(field,\"|\",1)\n . d mergeCSPRequestToSession(field,type)\n d mergeCSPRequestToSession(\"ewd_pressed\",\"hidden\")\n QUIT\n ;\nmCSPReq(fieldName,type)\n d mergeCSPRequestToSession(fieldName,type)\n QUIT\n ;\nmergeCSPRequestToSession(fieldName,type)\n d mergeCSPRequestToSession^%zewdCompiler16($g(fieldName),$g(type))\n QUIT\n ;\n ; note - textarea data storage can be queried using SQL with the following construct\n ; \n ; listAttributeFL {type=%Library.String ; sqllisttype=subnode}\n ;\ndisplayText(textID,reviewMode,sessid)\n\tQUIT $$displayText^%zewdCompiler13($g(textID),$g(reviewMode),$g(sessid))\n\t;\nsystemMessage(text,type,sessid,appName,langCode)\n n textid,fragments,outputText,error,technology,translationMode,typex\n ;\n ;d trace^%zewdAPI(\"systemMessage : text=\"_text_\" ; type=\"_type_\" ; sessid=\"_sessid)\n i $g(text)=\"\" QUIT \"\"\n ; manual API or where sessid not known\n i $g(sessid)=\"\" QUIT $$systemMessage^%zewdCompiler5(text,$g(type),$g(appName),$g(langCode))\n s translationMode=+$$getSessionValue^%zewdAPI(\"ewd_translationMode\",sessid)\n ;d trace^%zewdAPI(\"ewd_translationMode=\"_translationMode)\n i 'translationMode QUIT text\n s appName=$$getSessionValue^%zewdAPI(\"ewd_appName\",sessid)\n ;d trace^%zewdAPI(\"appName=\"_appName)\n s typex=type ; avoid Cache bug !\n i $$getPhraseIndex^%zewdCompiler5(text)=\"\" QUIT \"\"\n i '$$isTextPreviouslyFound^%zewdCompiler5(text,appName,\"\",\"\",.textid,,,type) d\n . s textid=$$addTextToIndex^%zewdCompiler5(text,appName,\"\",\"\",.fragments,.outputText,typex)\n s error=$$displayText(textid,0,sessid)\n QUIT error\n ;\nerrorMessage(text,sessid)\n QUIT $$systemMessage(text,\"error\",sessid)\n ;\n ; ============================================================================\n ;   User API Methods\n ; ============================================================================\n ;\nisCSPPage(docOID)\n ;\n n docName\n ;\n s docName=$$getDocumentName^%zewdDOM(docOID)\n QUIT $$bypassMode^%zewdCompiler(docName)\n ;\ngetSessionValue(name,sessid)\n ;\n n %zt,return,technology,value\n ;\n s name=$$stripSpaces(name)\n i $g(name)=\"\" QUIT \"\"\n i $g(sessid)=\"\" QUIT \"\"\n i name[\".\" d  QUIT value\n . n np,obj,prop\n . i name[\"_\" s name=$p(name,\"_\",1)_\".\"_$p(name,\"_\",2,200)\n . s np=$l(name,\".\")\n . s obj=$p(name,\".\",1,np-1)\n . s prop=$p(name,\".\",np)\n . s value=$$getSessionObject(obj,prop,sessid)\n ;s $zt=\"extcErr\"\n ;i $r(100)<10 i '$$$licensed(\"DOM\",,,,,,,,,,) d setWarning(\"You do not have a current eXtc License\",sessid)\n ;i $$isTemp(name) d  QUIT value\n i $e(name,1,4)=\"tmp_\" d  QUIT value\n . s value=$g(zewdSession(name))\n . i value=\"\",$g(^%zewdSession(\"session\",sessid,\"ewd_technology\"))=\"gtm\" s value=$g(sessionArray(name))\n QUIT $g(^%zewdSession(\"session\",sessid,name))\n ;\nsetWLDSymbol(name,sessid)\n ;\n ;  ------------------------------------------------------\n ;  Duplicate copy for performance: see also %zewdPHP!\n ;  ------------------------------------------------------\n ;\n n wldAppName,wldName,wldSessid,%zzname\n ;\n QUIT:$zv[\"GT.M\"\n QUIT\n ;\nextcErr\n ;\n n mess\n s mess=\"eXtc does not appear to have been installed or is unavailable in the \"_$$namespace()_\" namespace where your application is attempting to run.  Your application will be unable to run correctly\"\n d setWarning(mess,sessid)\n s $zt=%zt\n QUIT \"\"\n ;\nvalueErr ;\n s $zt=$g(%zt)\n QUIT \"\"\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nexportCustomTags(tagList,filepath)\n QUIT $$exportCustomTags^%zewdCompiler16(.tagList,$g(filepath))\n ;\nexportAllCustomTags(filepath)\n QUIT $$exportAllCustomTags^%zewdCompiler16($g(filepath))\n ;\nimportCustomTags(filePath)\n QUIT $$importCustomTags^%zewdForm($g(filePath))\n ;\nsetSessionValue(name,value,sessid)\n ;\n s name=$$stripSpaces(name)\n i $g(name)=\"\" QUIT\n i $g(sessid)=\"\" QUIT\n i name[\".\" d  QUIT\n . n np,obj,prop\n . i name[\"_\" s name=$p(name,\"_\",1)_\".\"_$p(name,\"_\",2,200)\n . s np=$l(name,\".\")\n . s obj=$p(name,\".\",1,np-1)\n . s prop=$p(name,\".\",np)\n . d setSessionObject(obj,prop,value,sessid)\n s value=$g(value)\n i $e(name,1,4)=\"tmp_\" s zewdSession(name)=value QUIT\n s ^%zewdSession(\"session\",sessid,name)=value\n QUIT\n ;\nallowJSONAccess(sessionName,access,sessid)\n ; access=\"r|rw\"\n s ^%zewdSession(\"jsonAccess\",sessid,sessionName)=access\n QUIT\n ;\ndisallowJSONAccess(sessionName,sessid)\n k ^%zewdSession(\"jsonAccess\",sessid,sessionName)\n QUIT\n ;\nJSONAccess(sessionName,sessid)\n QUIT $g(^%zewdSession(\"jsonAccess\",sessid,sessionName))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nisTemp(name)\n QUIT $e(name,1,4)=\"tmp_\"\n ;\n ;\nexistsInSession(name,sessid)\n QUIT $$existsInSession^%zewdCompiler13($g(name),$g(sessid))\n ;\nexistsInSessionArray(name,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11)\n QUIT $$existsInSessionArray^%zewdCompiler13($g(name),$g(p1),$g(p2),$g(p3),$g(p4),$g(p5),$g(p6),$g(p7),$g(p8),$g(p9),$g(p10),$g(p11))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nclearSessionArray(arrayName,sessid)\n s arrayName=$$stripSpaces(arrayName)\n i $g(sessid)=\"\" QUIT\n i $g(arrayName)=\"\" QUIT\n s arrayName=$tr(arrayName,\".\",\"_\")\n ;i $$isTemp(arrayName) k zewdSession(arrayName) QUIT\n i $e(arrayName,1,4)=\"tmp_\" k zewdSession(arrayName) QUIT\n k ^%zewdSession(\"session\",sessid,arrayName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsetSessionArray(arrayName,itemName,itemValue,sessid)\n ;\n s arrayName=$$stripSpaces(arrayName)\n QUIT:$g(arrayName)=\"\"\n QUIT:$g(itemName)=\"\"\n QUIT:$g(sessid)=\"\"\n s arrayName=$tr(arrayName,\".\",\"_\")\n i $$isTemp(arrayName) s zewdSession(arrayName,itemName)=itemValue QUIT\n s ^%zewdSession(\"session\",sessid,arrayName,itemName)=itemValue\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetSessionArray(arrayName,sessid,array,clearArray)\n ;\n s arrayName=$$stripSpaces(arrayName)\n QUIT:$g(arrayName)=\"\"\n s arrayName=$tr(arrayName,\".\",\"_\")\n QUIT:$g(sessid)=\"\"\n set $zt=\"getSessionArrayErr\"\n i $g(clearArray)=1 k array\n i $$isTemp(arrayName) m array=zewdSession(arrayName) QUIT\n m array=^%zewdSession(\"session\",sessid,arrayName)\n QUIT\n ;\ngetSessionArrayErr ; --- Come here if error occurred in 'getSessionArray' ---\n set $zt=\"\"\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\naddToSession(name,sessid)\n s name=$$stripSpaces(name)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(name)=\"\"\n s name=$tr(name,\".\",\"_\")\n i $$isTemp(name) m zewdSession(name)=@name QUIT\n m ^%zewdSession(\"session\",sessid,name)=@name\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeToSession(name,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(name)=\"\"\n d addToSession(name,sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeGlobalToSession(globalName,sessionName,sessid)\n d mergeGlobalToSession^%zewdCompiler13($g(globalName),$g(sessionName),$g(sessid))\n QUIT\n ;\nmergeGlobalFromSession(globalName,sessionName,sessid)\n d mergeGlobalFromSession^%zewdCompiler13($g(globalName),$g(sessionName),$g(sessid))\n QUIT\n ;\nmergeArrayToSession(array,sessionName,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(sessionName)=\"\"\n s sessionName=$tr(sessionName,\".\",\"_\")\n ;i $$isTemp(sessionName) m zewdSession(sessionName)=array QUIT\n i $e(sessionName,1,4)=\"tmp_\" m zewdSession(sessionName)=array QUIT\n m ^%zewdSession(\"session\",sessid,sessionName)=array\n QUIT\n ;\nmergeArrayToSessionObject(array,sessionName,sessid)\n d mergeArrayToSessionObject^%zewdCompiler16(.array,$g(sessionName),$g(sessid))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeArrayFromSession(array,sessionName,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(sessionName)=\"\"\n s sessionName=$tr(sessionName,\".\",\"_\")\n ;i $$isTemp(sessionName) m array=zewdSession(sessionName) QUIT\n i $e(sessionName,1,4)=\"tmp_\" m array=zewdSession(sessionName) QUIT\n m array=^%zewdSession(\"session\",sessid,sessionName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeFromSession(name,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(name)=\"\"\n s name=$tr(name,\".\",\"_\")\n i $$isTemp(name) m @name=zewdSession(name)\n m @name=^%zewdSession(\"session\",sessid,name)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ndeleteFromSession(name,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(name)=\"\"\n i name[\".\" d  QUIT\n . n np,obj,prop\n . s np=$l(name,\".\")\n . s obj=$p(name,\".\",1,np-1)\n . s prop=$p(name,\".\",np)\n . d deleteFromSessionObject(obj,prop,sessid)\n ;i $$isTemp(name) k zewdSession(name) QUIT\n i $e(name,1,4)=\"tmp_\" k zewdSession(name) QUIT\n k ^%zewdSession(\"session\",sessid,name)\n QUIT\n ;\nsessionNameExists(name,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(name)=\"\"\n s name=$tr(name,\".\",\"_\")\n i $$isTemp(name) QUIT $d(zewdSession(name))\n QUIT $d(^%zewdSession(\"session\",sessid,name))\n ;\ngetSessionArrayValue(arrayName,subscript,sessid,exists)\n QUIT $$getSessionArrayValue^%zewdCompiler13($g(arrayName),$g(subscript),$g(sessid),.exists)\n ;\nsessionArrayValueExists(arrayName,subscript,sessid)\n QUIT $$sessionArrayValueExists^%zewdCompiler13($g(arrayName),$g(subscript),$g(sessid))\n ;\ndeleteSessionArrayValue(arrayName,subscript,sessid)\n d deleteSessionArrayValue^%zewdCompiler13($g(arrayName),$g(subscript),$g(sessid))\n QUIT\n ;\n ; Objects\n ;\nsetSessionObject(objectName,propertyName,propertyValue,sessid)\n ;d setSessionObject^%zewdCompiler13($g(objectName),$g(propertyName),$g(propertyValue),$g(sessid))\n ;QUIT\n\t;\n\tn comma,i,np,p,sessionArray,x\n\t;\n\ti $g(objectName)=\"\" QUIT\n\ti $g(propertyName)=\"\" QUIT\n\t;i $g(propertyValue)=\"\" QUIT\n\ti $g(sessid)=\"\" QUIT\n    s np=$l(objectName,\".\")\n    ;s objectName=$$replace(objectName,\".\",\"_\")\n    i objectName[\".\" s objectName=$p(objectName,\".\",1)_\"_\"_$p(objectName,\".\",2,2000)\n    i np=1 d  QUIT\n\t. i $e(objectName,1,3)=\"tmp\" s zewdSession(objectName_\"_\"_propertyName)=propertyValue  q\n\t. s ^%zewdSession(\"session\",sessid,(objectName_\"_\"_propertyName))=propertyValue\n    ;\n    f i=1:1:np-1 s p(i)=$p(objectName,\".\",i)\n    s comma=\",\"\n    i $e(objectName,1,4)=\"tmp_\" d\n    . s x=\"s zewdSession(\",comma=\"\"\n\te  d\n    . s x=\"s ^%zewdSession(\"\"session\"\",\"\"\"_sessid_\"\"\"\"\n    i propertyValue[\"\"\"\" d\n    . s propertyValue=$$replaceAll^%zewdAPI(propertyValue,\"\"\"\",$c(4))\n    . s propertyValue=$$replaceAll^%zewdAPI(propertyValue,$c(4),\"\"\"\"\"\")\n    f i=1:1:np-1 s x=x_comma_\"\"\"\"_p(i)_\"\"\"\",comma=\",\"\n    s x=x_\",\"\"\"_propertyName_\"\"\")=\"\"\"_propertyValue_\"\"\"\"\n    x x\n    QUIT\n ;\ngetSessionObject(objectName,propertyName,sessid)\n    ;\n    n i,np,p,value,x\n    ;\n    i $g(sessid)=\"\" QUIT \"\"\n    s value=\"\"\n    s np=$l(objectName,\".\")\n    i objectName[\".\",objectName'[\"_\" s objectName=$p(objectName,\".\",1)_\"_\"_$p(objectName,\".\",2,2000)\n    ;s objectName=$$replace(objectName,\".\",\"_\")\n    i np=1 QUIT $g(^%zewdSession(\"session\",sessid,(objectName_\"_\"_propertyName)))\n    ;\n    f i=1:1:np-1 s p(i)=$p(objectName,\".\",i)\n    s x=\"s value=$g(^%zewdSession(\"\"session\"\",\"\"\"_sessid_\"\"\"\"\n    f i=1:1:np-1 s x=x_\",\"\"\"_p(i)_\"\"\"\"\n    s x=x_\",\"\"\"_propertyName_\"\"\"))\"\n    x x\n    QUIT value\n    ;\ndeleteFromSessionObject(objectName,propertyName,sessid)\n d deleteFromSessionObject^%zewdCompiler13($g(objectName),$g(propertyName),$g(sessid))\n QUIT\n ;\nsessionObjectPropertyExists(objectName,propertyName,sessid)\n QUIT $$sessionObjectPropertyExists^%zewdCompiler13($g(objectName),$g(propertyName),$g(sessid))\n ;\ndeleteSessionObject(objectName,sessid)\n n obj\n s obj=objectName\n i obj[\".\" s obj=$tr(obj,\".\",\"_\")\n i obj'[\"_\" s obj=obj_\"_\"\n d clearSessionByPrefix(obj,$g(sessid))\n ;d deleteSessionObject^%zewdCompiler13($g(objectName),$g(sessid))\n QUIT\n ;\ncopyObjectToSession(oref,objectName,sessid)\n d copyObjectToSession^%zewdCompiler13($g(oref),$g(objectName),$g(sessid))\n QUIT\n ;\ncopyResultSetToSession(oref,objectName,sessid)\n d copyResultSetToSession^%zewdCompiler13($g(oref),$g(objectName),$g(sessid))\n QUIT\n ;\ngetResultSetValue(resultSetName,index,propertyName,sessid)\n QUIT $$getResultSetValue^%zewdCompiler13($g(resultSetName),$g(index),$g(propertyName),$g(sessid))\n ;\naddToResultSet(sessionName,propertyName,value,sessid)\n d addToResultSet^%zewdCompiler13($g(sessionName),$g(propertyName),$g(value),$g(sessid))\n QUIT\n ;\nmergeRecordArrayToResultSet(sessionName,recordArray,sessid)\n d mergeRecordArrayToResultSet^%zewdCompiler13($g(sessionName),.recordArray,$g(sessid))\n QUIT\n ;\nJSONToSessionObject(objectName,jsonString,sessid)\n d JSONToSessionObject^%zewdCompiler13($g(objectName),$g(jsonString),$g(sessid))\n QUIT\n ;\nsessionObjectToJSON(objectName,sessid)\n QUIT $$sessionObjectToJSON^%zewdCompiler13($g(objectName),$g(sessid))\n ;\nobjectGlobalToJSON(objectName)\n QUIT $$objectGlobalToJSON^%zewdCompiler13($g(objectName))\n ;\nsaveJSON(objectName,jsonString)\n QUIT $$saveJSON^%zewdCompiler13($g(objectName),$g(jsonString))\n ;\ngetJSON(objectName,addRefCol)\n QUIT $$getJSON^%zewdCompiler13($g(objectName),$g(addRefCol))\n ;\nsetJSONValue(JSONName,objectName,sessid)\n d setJSONValue^%zewdCompiler16($g(JSONName),$g(objectName),$g(sessid))\n d allowJSONAccess(objectName,\"r\",sessid)\n QUIT\n ;\nconvertToJSON(arrayName,isExtJS)\n n dojo\n i '$d(@arrayName) QUIT \"\"\n s dojo=\"\"\n i $g(isExtJS)=1 s dojo=2\n QUIT $$walkArray^%zewdCompiler13(\"\",arrayName,dojo)\n ;\nmergeToJSObject(sessionObject,JSObject)\n QUIT $$mergeToJSObject^%zewdCompiler13($g(sessionObject),$g(JSObject),$g(sessid))\n ;\n ; Javascript objects\n ;\ngetJavascriptObjectBlock(objectName,docName,textArray)\n QUIT $$getJavascriptObjectBlock^%zewdCompiler13($g(objectName),$g(docName),.textArray)\n ;\nreplaceJavascriptObject(objectName,newFunctionText,docName)\n QUIT $$replaceJavascriptObject^%zewdCompiler13($g(objectName),$g(newFunctionText),$g(docName))\n ;\nreplaceJavascriptObjectBody(functionName,newBody,docName)\n QUIT $$replaceJavascriptObjectBody^%zewdCompiler13($g(functionName),$g(newBody),$g(docName))\n ;\ngetJavascriptObjectBody(functionName,docName)\n QUIT $$getJavascriptObjectBody^%zewdCompiler13($g(functionName),$g(docName))\n ;\ngetJavascriptObject(objectName,docName,eOID)\n QUIT $$getJavascriptObject^%zewdCompiler13($g(objectName),$g(docName),$g(eOID))\n ;\njavascriptObjectExists(objectName,docName)\n QUIT $$javascriptObjectExists^%zewdCompiler13($g(objectName),$g(docName))\n ;\ngetLastJavascriptTag(docName,textArray)\n QUIT $$getLastJavascriptTag^%zewdCompiler13($g(docName),.textArray)\n ;\naddJavascriptObject(docName,jsText)\n QUIT $$addJavascriptObject^%zewdCompiler13($g(docName),.jsText)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsetSessionValues(nvArray,sessid)\n ;\n QUIT:$g(sessid)=\"\"\n n name,no,value\n s name=\"\"\n f  s name=$o(nvArray(name)) q:name=\"\"  d\n . d deleteFromSession(name,sessid)\n . d clearSelected(name,sessid)\n . s value=$g(nvArray(name))\n . d setSessionValue(name,value,sessid)\n . s no=\"\"\n . f  s no=$o(nvArray(name,no)) q:no=\"\"  d\n . . s value=nvArray(name,no)\n . . d addToSelected(name,value,sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetSessionValues(prefix,nvArray,sessid)\n ;\n n len,name,no,value\n QUIT:$g(sessid)=\"\"\n QUIT:$g(prefix)=\"\"\n set $zt=\"getSessionValuesErr\"\n s len=$l(prefix)\n k nvArray\n s name=prefix\n f  s name=$o(^%zewdSession(\"session\",sessid,name)) q:name=\"\"  q:$e(name,1,len)'=prefix  d\n . d setNVArray(name,.nvArray,sessid)\n s name=prefix,no=0\n f  s name=$o(^%zewdSession(\"session\",sessid,\"ewd_selected\",name)) q:name=\"\"  q:$e(name,1,len)'=prefix  d\n . s value=\"\"\n . f  s value=$o(^%zewdSession(\"session\",sessid,\"ewd_selected\",name,value)) q:value=\"\"  d\n . . s no=no+1\n . . s nvArray(name,no)=value\n QUIT\n ;\ngetSessionValuesErr ; --- Come here if error occurred in 'getSessionValues' ---\n set $zt=\"\"\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetSessionValuesByPrefix(prefix,sessid)\n ;\n n len,name\n QUIT:$g(sessid)=\"\"\n QUIT:$g(prefix)=\"\"\n s prefix=$tr(prefix,\".\",\"_\")\n set $zt=\"getSessionValuesByPrefixErr\"\n s len=$l(prefix)\n s name=prefix\n f  s name=$o(^%zewdSession(\"session\",sessid,name)) q:name=\"\"  q:$e(name,1,len)'=prefix  d\n . i name?1A.AN m @name=^%zewdSession(\"session\",sessid,name)\n QUIT\n ;\ngetSessionValuesByPrefixErr\n set $zt=\"\"\n QUIT\n ;\nsetNVArray(name,nvArray,sessid)\n n selected,value,no\n s nvArray(name)=$$getSessionValue(name,sessid)\n QUIT\n ;\nclearSessionByPrefix(prefix,sessid)\n d clearSessionByPrefix^%zewdCompiler20($g(prefix),$g(sessid))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\n ; HTML Form-specific APIs\n ;\ngetTextValue(fieldName,sessid)\n QUIT $$getSessionValue(fieldName,sessid)\n ;\nsetTextValue(fieldName,value,sessid)\n d setSessionValue(fieldName,value,sessid)\n QUIT\n ;\ngetPasswordValue(fieldName,sessid)\n QUIT $$getSessionValue(fieldName,sessid)\n ;\ngetHiddenValue(fieldName,sessid)\n QUIT $$getSessionValue(fieldName,sessid)\n ;\nsetHiddenValue(fieldName,value,sessid)\n d setSessionValue(fieldName,value,sessid)\n ;\ngetRadioValue(fieldName,sessid)\n QUIT $$getSessionValue(fieldName,sessid)\n ;\nsetRadioOn(fieldName,value,sessid)\n d setSessionValue(fieldName,value,sessid)\n QUIT\n ;\nisRadionOn(fieldName,value,sessid)\n QUIT $$getRadioValue(fieldName,sessid)=value\n ;\nisCheckboxOn(fieldName,value,sessid)\n QUIT $$isSelected(fieldName,value,sessid)\n ;\ngetCheckboxValues(fieldName,selectedValueArray,sessid)\n d mergeFromSelected(fieldName,.selectedValueArray,sessid)\n QUIT\n ;\ninitialiseCheckbox(fieldName,sessid)\n d clearSelected(fieldName,sessid)\n QUIT\n ;\nsetCheckboxOn(fieldName,value,sessid)\n d addToSelected(fieldName,value,sessid)\n QUIT\n ;\nsetCheckboxOff(fieldName,value,sessid)\n d removeFromSelected(fieldName,value,sessid)\n ;\nsetCheckboxValues(fieldName,selectedValueArray,sessid)\n ;\n ; array format : array(checkboxValue)=checkboxValue\n ; eg selected(\"red\")=\"red\"\n ;\n d mergeToSelected(fieldName,.selectedValueArray,sessid)\n QUIT\n ;\ngetSelectValue(fieldName,sessid,nullify)\n ;\n n value\n ;\n s value=$$getSessionValue(fieldName,sessid)\n i $a(value)=160 s value=\"\"\n QUIT value\n ;\nsetSelectValue(fieldName,value,sessid)\n d setSessionValue(fieldName,value,sessid)\n ;\nisSelectOn(fieldName,value,sessid)\n QUIT $$getSelectValue(fieldName,sessid)=value\n ;\nisMultipleSelectOn(fieldName,value,sessid)\n QUIT $$isSelected(fieldName,value,sessid)\n ;\ngetMultipleSelectValues(fieldName,selectedValueArray,sessid)\n n value\n d mergeFromSelected(fieldName,.selectedValueArray,sessid)\n s value=$$getSessionValue^%zewdAPI(fieldName,sessid)\n i value'=\"\" s selectedValueArray(value)=value\n QUIT\n ;\ninitialiseMultipleSelect(fieldName,sessid)\n d clearSelected(fieldName,sessid)\n QUIT\n ;\nsetMultipleSelectOn(fieldName,value,sessid)\n d addToSelected(fieldName,value,sessid)\n QUIT\n ;\nsetMultipleSelectOff(fieldName,value,sessid)\n d removeFromSelected(fieldName,value,sessid)\n ;\nsetMultipleSelectValues(fieldName,selectedValueArray,sessid)\n ;\n ; array format : array(checkboxValue)=checkboxValue\n ; eg selected(\"red\")=\"red\"\n ;\n d mergeToSelected(fieldName,.selectedValueArray,sessid)\n QUIT\n ;\ngetTextArea(fieldName,textArray,sessid)\n d mergeFromTextArea(fieldName,.textArray,sessid)\n QUIT\n ;\nsetFieldError(fieldName,sessid)\n ;\n n errors\n s errors(fieldName)=$$getSessionValue(\"ewd_errorClass\",sessid)\n d mergeArrayToSession^%zewdAPI(.errors,\"ewd_errorFields\",sessid)\n d setSessionValue^%zewdAPI(\"ewd_hasErrors\",1,sessid)\n QUIT\n ;\nsetErrorClasses()\n QUIT $$setErrorClasses^%zewdUtilities()\n ;\ngetRequestValue(fieldName,sessid)\n n value,zt\n i $g(fieldName)=\"\" QUIT \"\"\n s value=$g(requestArray(fieldName))\n QUIT value\n ;\nmergeGlobalFromRequest(globalName,fieldName,sessid)\n d mergeGlobalFromRequest^%zewdCompiler13($g(globalName),$g(fieldName),$g(sessid))\n QUIT\n ;\nmergeFromRequest(array,fieldName,sessid)\n QUIT:fieldName=\"\"\n m array=requestArray(fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ncopyRequestValueToSession(fieldName,sessid)\n ;\n QUIT:$g(sessid)=\"\"\n QUIT:$g(fieldName)=\"\"\n i $$isTemp(fieldName) m zewdSession(fieldName)=requestArray(fieldName)\n m ^%zewdSession(\"session\",sessid,fieldName)=requestArray(fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetCookieValue(cookieName,sessid)\n QUIT:$g(cookieName)=\"\"\n set $zt=\"getCookieValueErr\"\n QUIT $g(requestArray(cookieName))\n ;\ngetCookieValueErr ; --- Come here if error occurred in 'getCookieValue' ---\n set $zt=\"\"\n QUIT \"\"\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ndeleteCookie(cookieName,sessid)\n d setCookieValue(cookieName,\"\",-3600,sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nenableGetPage(page,sessid)\n d enableGetPage^%zewdCompiler24($g(page),$g(sessid))\n QUIT\n ;\ndisableGetPage(page,sessid)\n d disableGetPage^%zewdCompiler24($g(page),$g(sessid))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nconvertDaysToSeconds(days)\n QUIT days*86400\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nparseHTMLFile(filepath,docName)\n QUIT $$parseHTMLFile^%zewdCompiler16($g(filepath),$g(docName))\n ;\nparseXMLFile(filepath,docName)\n QUIT $$parseXMLFile^%zewdCompiler16($g(filepath),$g(docName))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nparseStream(streamName,docName,error,isHTML)\n d parseStream^%zewdCompiler16($g(streamName),$g(docName),.error,$g(isHTML))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nparseHTMLStream(streamName,docName)\n QUIT $$parseHTMLStream^%zewdCompiler16($g(streamName),$g(docName))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nparseURL(server,getPath,docName,port,isHTML,responseTime,browserType,post,maxLineLength,headers)\n ;\n QUIT $$parseURL^%zewdHTMLParser($g(server),$g(getPath),$g(docName),$g(port),$g(isHTML),.responseTime,$g(browserType),$g(post),$g(maxLineLength),.headers)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsetCookieValue(cookieName,value,expiryDuration,sessid)\n ;\n ; expiryDuration is no of seconds\n ;\n n expires\n s expires=expiryDuration\n i $$isCSP(sessid) d\n . s expires=$$convertDateToSeconds($h)+expires\n . s expires=$$convertSecondsToDate(expires)\n . s expires=$$inetDate(expires)\n s value=value_$c(1)_expires\n d setSessionArray(\"ewd_cookie\",cookieName,value,sessid)\n ;\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsetResponseHeader(headerName,headerValue,sessid)\n d setSessionArray^%zewdAPI(\"ewd_header\",$g(headerName),$g(headerValue),$g(sessid))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsuppressResponseHeader(headerName,sessid)\n i $$isCSP(sessid) d setResponseHeader(headerName,\"\",sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\naddServerToSession(sessid,serverArray)\n d addServerToSession^%zewdCompiler13($g(sessid),.serverArray)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetServerValue(serverFieldName,sessid)\n ;\n n value,zt\n ;\n i $g(serverFieldName)=\"\" QUIT \"\"\n ;\n QUIT $g(serverArray(serverFieldName))\n ;\ngetServerValueErr ; --- Come here if error occurred in 'getServerValue' ---\n set $zt=zt\n QUIT \"\"\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ndeleteWarning(sessid)\n QUIT:$g(sessid)=\"\"\n d deleteFromSession(\"ewd_warning\",sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsetWarning(warningMessage,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(warningMessage)=\"\"\n s warningMessage=$$systemMessage(warningMessage,\"warning\",sessid)\n i '$$isCSP(sessid) s warningMessage=$$zcvt(warningMessage,\"o\",\"JS\")\n d setSessionValue(\"ewd_warning\",warningMessage,sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nclearAllSelected(sessid)\n k ^%zewdSession(\"session\",sessid,\"ewd_selected\")\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nclearSelected(fieldName,sessid)\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n k ^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\naddToSelected(fieldName,fieldValue,sessid)\n ;\n n shortFieldValue\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n QUIT:$g(fieldValue)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n s shortFieldValue=$e(fieldValue,1,200)\n s ^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName,shortFieldValue)=fieldValue\n QUIT\n ;\nremoveFromSelected(fieldName,fieldValue,sessid)\n ;\n n shortFieldValue\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n QUIT:$g(fieldValue)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n s shortFieldValue=$e(fieldValue,1,200)\n k ^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName,shortFieldValue)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeFromSelected(fieldName,selected,sessid)\n ;\n k selected\n s fieldName=$tr(fieldName,\".\",\"_\")\n m selected=^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeToSelected(fieldName,selected,sessid)\n ;\n s fieldName=$tr(fieldName,\".\",\"_\")\n ;\n k ^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName)\n m ^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName)=selected\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nisSelected(fieldName,fieldValue,sessid)\n n shortFieldValue\n i $g(fieldName)=\"\" QUIT 0\n i $g(sessid)=\"\" QUIT 0\n i $g(fieldValue)=\"\" QUIT 0\n s fieldName=$tr(fieldName,\".\",\"_\")\n set $zt=\"isSelectedErr\"\n s shortFieldValue=$e(fieldValue,1,200)\n QUIT $d(^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName,shortFieldValue))\n ;\nisSelectedErr ; --- Come here if error occurred in 'isSelected' ---\n set $zt=\"\"\n QUIT 0\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nclearTextArea(fieldName,sessid)\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n k ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName)\n s ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName,1)=\"\"\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ncreateTextArea(fieldName,textArray,sessid)\n ;\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n m ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName)=textArray\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeTextAreaFromRequest(fieldName,requestArray,sessid)\n ;\n q:$g(sessid)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n ;\n q:'$d(^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName))\n d clearTextArea(fieldName,sessid)\n m ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName)=requestArray(fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nappendToTextArea(fieldName,lineOfText,sessid)\n ;\n n position\n ;\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n ;\n s position=$o(^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName,\"\"),-1)+1\n s ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName,position)=lineOfText \n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeFromTextArea(fieldName,textArray,sessid)\n ;\n s fieldName=$tr(fieldName,\".\",\"_\")\n m textArray=^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeToTextArea(fieldName,textArray,sessid)\n ;\n s fieldName=$tr(fieldName,\".\",\"_\")\n m ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName)=textArray\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nclearList(listName,sessid)\n QUIT:$g(listName)=\"\"\n QUIT:$g(sessid)=\"\"\n s listName=$tr(listName,\".\",\"_\")\n k ^%zewdSession(\"session\",sessid,\"ewd_list\",listName)\n k ^%zewdSession(\"session\",sessid,\"ewd_listIndex\",listName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nisListDefined(listName,sessid)\n QUIT $d(^%zewdSession(\"session\",sessid,\"ewd_list\",listName))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ncountList(listName,sessid)\n QUIT $$countList^%zewdCompiler16($g(listName),$g(sessid))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nappendToList(listName,textValue,codeValue,sessid,otherAttrs)\n ;\n n position\n ;\n QUIT:$g(listName)=\"\"\n QUIT:$g(sessid)=\"\"\n ;QUIT:$g(textValue)=\"\"\n ;QUIT:$g(codeValue)=\"\"\n s listName=$tr(listName,\".\",\"_\")\n ;\n s position=$o(^%zewdSession(\"session\",sessid,\"ewd_list\",listName,\"\"),-1)+1\n d addToList(listName,textValue,codeValue,position,sessid,.otherAttrs)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\naddToList(listName,textValue,codeValue,position,sessid,otherAttrs)\n ;d addToList^%zewdCompiler16($g(listName),$g(textValue),$g(codeValue),$g(position),$g(sessid),.otherAttrs)\n ;\n n attrList,attrName\n ;\n QUIT:$g(listName)=\"\"\n QUIT:$g(sessid)=\"\"\n QUIT:$g(position)=\"\"\n i $g(codeValue)=\"\",$g(textValue)=\"\" QUIT\n s position=+position\n d removeFromList(listName,codeValue,sessid) ; just in case\n s attrName=\"\",attrList=\"\"\n f  s attrName=$o(otherAttrs(attrName)) q:attrName=\"\"  d\n . s attrList=attrList_attrName_$c(3)_otherAttrs(attrName)_$c(1)\n ;\n s codeValue=$g(codeValue) i codeValue=\"\" s codeValue=textValue\n s ^%zewdSession(\"session\",sessid,\"ewd_list\",listName,position)=textValue_$c(1)_codeValue_$c(1)_attrList\n s ^%zewdSession(\"session\",sessid,\"ewd_listIndex\",listName,codeValue)=position\n k otherAttrs\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeToList(listName,listArray,sessid)\n ;\n d mergeToList^%zewdCompiler7(listName,.listArray,sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nremoveFromList(listName,codeValue,sessid)\n d removeFromList^%zewdCompiler20($g(listName),$g(codeValue),$g(sessid))\n QUIT\n ;\ncopyList(fromListName,toListName,sessid)\n d copyList^%zewdCompiler7($g(fromListName),$g(toListName),$g(sessid))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetTextFromList(listName,codeValue,sessid)\n ;\n QUIT $$getTextFromList^%zewdCompiler7(listName,codeValue,sessid)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nreplaceOptionsByFieldName(formName,fieldName,listName,sessid)\n ;\n QUIT $$replaceOptionsByFieldName^%zewdCompiler7(formName,fieldName,listName,sessid)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\nreplaceOptionsByID(fieldID,listName,sessid)\n ;\n QUIT $$replaceOptionsByID^%zewdCompiler7(fieldID,listName,sessid)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetUploadedFileName(fieldName,sessid)\n QUIT $$getUploadedFileName^%zewdCompiler20($g(fieldName),$g(sessid))\n ;\ngetUploadedFileSize(fieldName,sessid)\n QUIT $$getUploadedFileSize^%zewdCompiler20($g(fieldName),$g(sessid))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetUploadedFileType(fieldName,sessid)\n ;\n set $zt=\"getUploadedFileTypeErr\"\n QUIT 0\n ;\ngetUploadedFileTypeErr\n set $zt=\"\"\n QUIT \"\"\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nerrorOccurred(sessid)\n ;\n n warning\n ;\n i $g(Error)=\"\" QUIT 0\n s warning=$$getSessionValue(\"ewd_warning\",sessid)\n QUIT Error'=warning\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nremoveQuotes(string)\n ;\n n quoted,c1,quote\n s quote=\"\"\n s c1=$e(string,1)\n s quoted=0\n i c1=\"\"\"\"!(c1=\"'\") s quoted=1,quote=c1\n i 'quoted QUIT string\n i $e(string,$l(string))'=quote QUIT string\n QUIT $e(string,2,$l(string)-1)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nescapeQuotes(text)\n ;\n s text=$$replaceAll(text,\"'\",$c(4))\n s text=$$replaceAll(text,$c(4),\"\\'\")\n s text=$$replaceAll(text,\"\"\"\",$c(4))\n s text=$$replaceAll(text,$c(4),\"\\\"\"\")\n ;\n QUIT text\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetAttrValue(attrName,attrValues,technology)\n QUIT $$getAttrValue^%zewdCompiler4(attrName,.attrValues,technology)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nreplaceAll(InText,FromStr,ToStr) ; Replace all occurrences of a substring\n ;\n n %p\n ;\n s %p=InText\n i ToStr[FromStr d  QUIT %p\n . n i,stop,tempText,tempTo\n . s stop=0\n . f i=0:1:255 d  q:stop\n . . q:InText[$c(i)\n . . q:FromStr[$c(i)\n . . q:ToStr[$c(i)\n . . s stop=1\n . s tempTo=$c(i)\n . s tempText=$$replaceAll(InText,FromStr,tempTo)\n . s %p=$$replaceAll(tempText,tempTo,ToStr)\n f  q:%p'[FromStr  S %p=$$replace(%p,FromStr,ToStr)\n QUIT %p\n ;\nreplace(InText,FromStr,ToStr) ; replace old with new in string\n ;\n n %np,%p1,%p2\n ;\n i InText'[FromStr q InText\n s %np=$l(InText,FromStr)+1\n s %p1=$p(InText,FromStr,1),%p2=$p(InText,FromStr,2,%np)\n QUIT %p1_ToStr_%p2\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\naddImmediateOneOffTask(executeCode,startTime,namespace,rc,rm)\n QUIT $$addImmediateOneOffTask^%zewdScheduler($g(executeCode),$g(startTime),$g(namespace),.rc,.rm)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetDataTypeErrors(errorArray,sessid)\n k errorArray\n d mergeArrayFromSession(.errorArray,\"ewd_DataTypeError\",sessid)\n QUIT\n ;\nclearSchemaFormErrors(sessid)\n d deleteFromSession(\"ewd_SchemaFormError\",sessid)\n QUIT\n ;\ngetSchemaFormErrors(errorArray,sessid)\n QUIT $$getSchemaFormErrors^%zewdCompiler13(.errorArray,$g(sessid))\n ;\nsetSchemaFormErrors(errorArray,sessid)\n ;\n n sessionName\n ;\n s sessionName=\"ewd_SchemaFormError\"\n d deleteFromSession(sessionName,sessid)\n d mergeArrayToSession(.errorArray,sessionName,sessid)\n QUIT\n ;\nremoveInstanceDocument(instanceName)\n ;\n n ok\n s ok=$$openDOM\n i ok'=\"\" QUIT ok \n s ok=$$removeDocument^%zewdDOM(instanceName,\"\",\"\")\n d clearXMLIndex^%zewdSchemaForm(instanceName)\n s ok=$$closeDOM^%zewdDOM()\n QUIT \"\"\n ;\n ;\nmakeTokenString(length)\n ;\n n string,token,i\n ;\n s string=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"\n s token=\"\"\n f i=1:1:length s token=token_$e(string,($r($l(string))+1))\n QUIT token\n ;\nmakeString(%char,%len) ; create a string of len characters\n ;\n n %str\n ;\n s %str=\"\",$p(%str,%char,%len+1)=\"\"\n QUIT %str\n ;\nconvertDateToSeconds(hdate)\n ;\n Q (hdate*86400)+$p(hdate,\",\",2)\n ;\nconvertSecondsToDate(secs)\n ;\n QUIT (secs\\86400)_\",\"_(secs#86400)\n ;\ngetTokenExpiry(token)\n ;\n n sessid\n ;\n i $g(token)=\"\" QUIT 0\n s sessid=$p($g(^%zewdSession(\"tokens\",token)),\"~\",1)\n i sessid=\"\" QUIT 0\n QUIT $$getSessionValue(\"ewd_sessionExpiry\",sessid)\n ;\nisTokenExpired(token)\n ;\n ;QUIT $$getTokenExpiry(token)'>$$convertDateToSeconds($h)\n QUIT $$getTokenExpiry(token)'>(($h*86400)+$p($h,\",\",2))\n ;\nrandChar()\n ;\n n string\n ;\n s string=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"\n QUIT $e(string,($R($l(string))+1))\n ;\nlowerCase(string)\n QUIT $tr(string,\"ABCDEFGHIJKLMNOPQRSTUVQXYZ\",\"abcdefghijklmnopqrstuvwxyz\")\n ;\nstripSpaces(string)\n s string=$$stripLeadingSpaces(string)\n QUIT $$stripTrailingSpaces(string)\n ;\nstripLeadingSpaces(string)\n n i\n ;\n f i=1:1:$l(string) QUIT:$e(string,i)'=\" \"\n QUIT $e(string,i,$l(string))\n ;\nstripTrailingSpaces(string)\n n i,spaces,new\n ;\n s spaces=$$makeString(\" \",100)\n s new=string_spaces\n QUIT $p(new,spaces,1)\n ;\nparseMethod(methodString,class,method)\n ;\n n %p1,%p2,meth\n ;\n s %p1=$p(methodString,\"##class(\",2)\n s class=$p(%p1,\")\",1)\n s %p2=$p(%p1,\")\",2,500)\n s method=$p(%p2,\".\",2)\n s method=$p(method,\"(\",1)\n QUIT\n ;\nevent(requestArray)\n QUIT $$event^%zewdPHP(.requestArray)\n ;\nclearURLNVP(urlNo)\n ;\n QUIT\n ;\nsetURLNVP(urlNo,name)\n ;\n QUIT\n ;\ndecodeDataType(name,dataType,sessid)\n d decodeDataType^%zewdCompiler20($g(name),$g(dataType),$g(sessid))\n QUIT\n ;\nencodeDataType(name,dataType,sessid)\n QUIT $$encodeDataType^%zewdCompiler13($g(name),$g(dataType),$g(sessid))\n ;\ncopyURLNVPsToSession(urlNo)\n ;\n n name\n ;\n QUIT\n ;\ndoubleQuotes(string)\n ;\n s string=$$replaceAll(string,\"\"\"\",$c(1,1))\n s string=$tr(string,$c(1),\"\"\"\")\n QUIT string\n ;\n ;  ==========================================================================\n ;     Error Trap Functions\n ;  ==========================================================================\n ;\ncopySessionToSymbolTable(sessid)\n d copySessionToSymbolTable^%zewdCompiler16($g(sessid))\n QUIT\n ;\nsaveSymbolTable(sessid)\n ;\n n ok\n ;s sessid=0\n k ^%zewdError(sessid)\n n %zzv\n k ^%zewdError(sessid)\n s %zzv=\"%\"\n f  s %zzv=$o(@%zzv) Q:%zzv=\"\"  m ^%zewdError(sessid,%zzv)=@%zzv\n QUIT\n ;\nloadErrorSymbols(sessid)\n d loadErrorSymbols^%zewdCompiler19($g(sessid))\n QUIT\n ;\ndeleteErrorLog(sessid)\n k ^%zewdError(sessid)\n QUIT\n ;\ndeleteAllErrorLogs\n k ^%zewdError\n QUIT\n ;\nfileSize(path)\n QUIT $$fileSize^%zewdCompiler13($g(path))\n ;\nfileExists(path)\n QUIT $$fileExists^%zewdCompiler13($g(path))\n ;\nfileInfo(path,info)\n d fileInfo^%zewdCompiler13($g(path),.info)\n QUIT\n ;\ndirectoryExists(path)\n QUIT $$directoryExists^%zewdCompiler13($g(path))\n ;\ndeleteFile(filepath)\n QUIT $$deleteFile^%zewdCompiler13($g(filepath))\n ;\nrenameFile(filepath,newpath)\n QUIT $$renameFile^%zewdCompiler13($g(filepath),$g(newpath))\n ;\ncreateDirectory(path)\n QUIT $$createDirectory^%zewdCompiler13($g(path))\n ;\nremoveCR(string)\n i $e(string,$l(string))=$c(13) s string=$e(string,1,$l(string)-1)\n QUIT string\n ;\nsetApplicationRootPath(path)\n d setApplicationRootPath^%zewdCompiler(path)\n QUIT\n ;\napplicationRootPath()\n QUIT $$applicationRootPath^%zewdCompiler()\n ;\ngetApplicationRootPath()\n QUIT $$getApplicationRootPath^%zewdCompiler()\n ;\nsetOutputRootPath(path,technology)\n d setOutputRootPath^%zewdCompiler(path,technology)\n QUIT\n ;\ngetRootURL(technology)\n QUIT $$getRootURL^%zewdCompiler(technology)\n ;\nsetRootURL(cspURL,technology)\n d setRootURL^%zewdCompiler(cspURL,technology)\n QUIT\n ;\ngetDefaultTechnology()\n QUIT $$getDefaultTechnology^%zewdCompiler()\n ;\ngetDefaultMultiLingual()\n QUIT $$getDefaultMultiLingual^%zewdCompiler()\n ;\ngetOutputRootPath(technology)\n QUIT $$getOutputRootPath^%zewdCompiler(technology)\n ;\ngetJSScriptsPath(app,technology)\n QUIT $$getJSScriptsPath^%zewdCompiler8(app,technology)\n ;\ngetJSScriptsPathMode(technology)\n QUIT $$getJSScriptsPathMode^%zewdCompiler8(technology)\n\t;\nsetJSScriptsPathMode(technology,mode)\n d setJSScriptsPathMode^%zewdCompiler8(technology,mode)\n QUIT\n\t;\ngetJSScriptsRootPath(technology)\n QUIT $$getJSScriptsRootPath^%zewdCompiler8(technology)\n\t;\nsetJSScriptsRootPath(technology,path)\n d setJSScriptsRootPath^%zewdCompiler8(technology,path)\n QUIT\n ;\ngetHomePage()\n QUIT $$getHomePage^%zewdCompiler()\n ;\nsetHomePage(homePage)\n d setHomePage^%zewdCompiler($g(homePage))\n QUIT\n ;\ngetApplications(appList)\n QUIT $$getApplications^%zewdCompiler16(.appList)\n ;\ngetPages(application,pageList)\n QUIT $$getPages^%zewdCompiler16($g(application),.pageList)\n ;\ngetDefaultFormat()\n QUIT $$getDefaultFormat^%zewdCompiler()\n ;\ngetNextChild(parentOID,childOID)\n i $g(parentOID)=\"\" QUIT \"\"\n i childOID=\"\" QUIT $$getFirstChild^%zewdDOM(parentOID)\n QUIT $$getNextSibling^%zewdDOM(childOID)\n ;\naddCSPServerScript(parentOID,text,atTop)\n QUIT $$addCSPServerScript^%zewdCompiler4(parentOID,text,$g(atTop))\n ;\ncreatePHPCommand(data,docOID)\n QUIT $$createPHPCommand^%zewdCompiler4(data,docOID)\n ;\ncreateJSPCommand(data,docOID)\n QUIT $$createJSPCommand^%zewdCompiler4(data,docOID)\n ;\ninstantiateJSPVar(var,type,docOID,arraySize,initialValue)\n d instantiateJSPVar^%zewdCompiler4(var,type,docOID,arraySize,initialValue)\n QUIT\n ;\nremoveIntermediateNode(inOID)\n d removeIntermediateNode^%zewdCompiler4(inOID)\n QUIT\n ;\ngetNormalisedAttributeValue(attrName,nodeOID,technology)\n QUIT $$getNormalAttributeValue^%zewdCompiler($g(attrName),$g(nodeOID),$g(technology))\n ;\ngetNormalAttributeValue(attrName,nodeOID,technology)\n QUIT $$getNormalAttributeValue^%zewdCompiler($g(attrName),$g(nodeOID),$g(technology))\n ;\ngetTagOID(tagName,docName,lowerCase)\n QUIT $$getTagOID^%zewdCompiler($g(tagName),$g(docName),$g(lowerCase))\n ;\ngetTagByNameAndAttr(tagName,attrName,attrValue,matchCase,docName)\n QUIT $$getTagByNameAndAttr^%zewdCompiler3($g(tagName),$g(attrName),$g(attrValue),$g(matchCase),$g(docName))\n ;\njavascriptFunctionExists(functionName,docName)\n QUIT $$javascriptFunctionExists^%zewdCompiler7($g(functionName),$g(docName))\n ;\naddJavascriptFunction(docName,jsTextArray)\n QUIT $$addJavascriptFunction^%zewdCompiler7($g(docName),.jsTextArray)\n ;\ngetJavascriptFunctionBody(functionName,docName)\n QUIT $$getJavascriptFunctionBody^%zewdCompiler7($g(functionName),docName)\n ;\nreplaceJavascriptFunctionBody(functionName,jsText,docName)\n QUIT $$replaceJavascriptFunctionBody^%zewdCompiler7($g(functionName),$g(jsText),$g(docName))\n ;\ngetDelim()\n QUIT $$getDelim^%zewdCompiler()\n ;\nsetJSONPage(sessid)\n QUIT $$setJSONPage^%zewdCompiler20($g(sessid))\n ; ===========================================================================\n ;    WLD conversion utilities\n ; ===========================================================================\n ;\nconfigureWebLink(webserver,mode,alias,path)\n QUIT $$configure^%zewdWLD($g(webserver),$g(mode),$g(alias),$g(path))\n ;\nmergeListToSession(fieldName,sessid)\n d mergeListToSession^%zewdCompiler16($g(fieldName),$g(sessid))\n QUIT\n ;\ngetPREVPAGE(sessid) ;\n QUIT $$getPREVPAGE^%zewdCompiler19($g(sessid)) ;\n ;\ncopyToWLDSymbolTable(sessid)\n d copyToWLDSymbolTable^%zewdCompiler16($g(sessid))\n ;\ngetPRESSED(sessid)\n QUIT $$getSessionValue(\"ewd_pressed\",sessid)\n ;\ncopyToLIST(listName,sessid)\n ;\n k LIST(listName)\n m LIST(listName)=^%zewdSession(\"session\",sessid,\"ewd_list\",listName)\n QUIT\n ;\ncopyToSELECTED(fieldName,sessid)\n ;\n k SELECTED(fieldName)\n m SELECTED(fieldName)=^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName)\n QUIT\n ;\ntraceModeOn\n s ^zewd(\"trace\")=1\n QUIT\n ;\ntraceModeOff\n k ^zewd(\"trace\")\n QUIT\n ;\ngetTraceMode()\n i $g(^zewd(\"trace\"))=1 QUIT 1\n QUIT 0\n ;\ntrace(text,clear) ; trace  ;\n n i\n s text=$g(text)\n i $g(clear)=1 k ^%zewdTrace\n s i=$increment(^%zewdTrace)\n s ^%zewdTrace(i)=text\n QUIT\n ;\ninetDate(hdate) ; Decode $H date and time to Internet format\n ;\n N %d,%day,%time,%date\n ;\n S %time=$P(hdate,\",\",2)\n I %time>86400 D\n .S %time=%time-86400\n .S hdate=(hdate+1)_\",\"_%time\n ;\n S %d=\"Thu,Fri,Sat,Sun,Mon,Tue,Wed\"\n S %day=(hdate#7)+1\n S %day=$P(%d,\",\",%day)\n ;\n S %date=$$decDate(hdate)\n ;S %date=$TR(%date,\" \",\"-\")\n S %time=$$inetTime(hdate)\n S %date=%day_\", \"_%date_\" \"_%time\n Q %date\ndecDate(hdate) ; Decode a date from $H format\n ;\n n %yy,%mm,%dd,%d1,%d\n i $zv'[\"GT.M\" d\n . s %d1=$zd(hdate,5)\n . s %yy=$p(%d1,\", \",2)\n . s %dd=+$p(%d1,\" \",2) I %dd<10 S %dd=\"0\"_%dd\n . s %mm=$p(%d1,\" \",1)\n e  d\n . n p1,p2\n . s %d1=$zd(hdate,2) \n . s %dd=$p(%d1,\"-\",1)\n . s %mm=$p(%d1,\"-\",2)\n . s p1=$e(%mm,1),p2=$e(%mm,2,$l(%mm))\n . s %mm=p1_$$lowerCase(p2)\n . s %yy=$p(%d1,\"-\",3)\n . i hdate>58073 s %yy=\"20\"_%yy\n s %d=%dd_\" \"_%mm_\" \"_%yy\n QUIT %d\n ;\ninetTime(hdate) ; Decode Internet Format Time from $H format\n ; Offset is relative to GMT, eg -0500\n ;\n n hh,mm,ss,time\n s time=$p(hdate,\",\",2)\n s hh=time\\3600 i hh<10 s hh=\"0\"_hh\n s time=time#3600\n s mm=time\\60 i mm<10 s mm=\"0\"_mm\n s ss=time#60 i ss<10 s ss=\"0\"_ss\n QUIT hh_\":\"_mm_\":\"_ss\n ;\nopenNewFile(filepath)\n QUIT $$openNewFile^%zewdCompiler($g(filepath))\n ;\nopenFile(filepath)\n QUIT $$openFile^%zewdCompiler($g(filepath))\n ;\nopenDOM()\n ;\n n i,ok\n ;\n f i=1:1:20 s ok=$$openDOM^%zewdDOM(0,,,,,,,,,,,,,,,,,) q:$$zcvt(ok,\"l\")[\"licensing violation\"  q:ok=\"\"  h 1\n i ok'=\"\" s ok=\"No eXtc Licenses available!\"\n QUIT ok\n ;\nremoveChild(nodeOID,removeFromDOM)\n ;\n n ver\n ;\n s ver=\"\" \n QUIT $$removeChild^%zewdDOM(nodeOID,$g(removeFromDOM))\n ;\nremoveAttribute(attrName,nodeOID,removeFromDOM)\n ;\n n ver\n ;\n s ver=\"\" \n d removeAttribute^%zewdDOM(attrName,nodeOID,$g(removeFromDOM)) QUIT\n ;\nremoveAttributeNS(ns,attrName,nodeOID,removeFromDOM)\n ;\n n ver\n ;\n s ver=\"\" \n d removeAttributeNS^%zewdDOM(ns,attrName,nodeOID,$g(removeFromDOM)) QUIT\n ;\nremoveIntermediateNodeeXtc(nodeOID,removeFromDOM)\n ;\n n ver\n ;\n d removeIntermediateNode^%zewdDOM(nodeOID,$g(removeFromDOM))\n QUIT\n ;\nexport(fileName,prefix,extension)\n d export^%zewdCompiler16($g(fileName),$g(prefix),$g(extension))\n QUIT\n ;\nimport(fileName)\n ;\n i $g(fileName)=\"\" s fileName=\"zewd.xml\"\n QUIT\n ;\nlistDOMsByPrefix(prefix)\n\td listDOMsByPrefix^%zewdCompiler19($g(prefix))\n\tQUIT\n ;\nremoveDOMsByPrefix(prefix)\n\td removeDOMsByPrefix^%zewdCompiler19($g(prefix))\n\tQUIT\n\t;\ndumpDOM(docName)\n ;\n d dumpDOM^%zewdCompiler20($g(docName))\n QUIT\n ;\nnamespace()\n QUIT $zdir\n ;\nsetNamespace(namespace)\n s $zdir=namespace\n QUIT\n ;\nzcvt(string,param,param2)\n ;\n i $g(param)=\"\" s param=\"l\"\n i param=\"l\"!(param=\"L\") QUIT $tr(string,\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\"abcdefghijklmnopqrstuvwxyz\")\n i param=\"u\"!(param=\"U\") QUIT $tr(string,\"abcdefghijklmnopqrstuvwxyz\",\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\")\n i param=\"O\",param2=\"HTML\" d  QUIT string\n . s string=$$replaceAll^%zewdAPI(string,\"&\",$c(1))\n . s string=$$replaceAll^%zewdAPI(string,\"\"\"\",\"&quot;\")\n . s string=$$replaceAll^%zewdAPI(string,\"'\",\"&#39;\")\n . s string=$$replaceAll^%zewdAPI(string,\"<\",\"&lt;\")\n . s string=$$replaceAll^%zewdAPI(string,\">\",\"&gt;\")\n . s string=$$replaceAll^%zewdAPI(string,$c(1),\"&amp;\")\n i param=\"I\",param2=\"HTML\" d  QUIT string\n . n c,no,no2,p1,p2,p3,stop\n . s string=$$replaceAll^%zewdAPI(string,\"&quot;\",\"\"\"\")\n . s string=$$replaceAll^%zewdAPI(string,\"&#39;\",\"'\")\n . s string=$$replaceAll^%zewdAPI(string,\"&amp;\",\"&\")\n . s string=$$replaceAll^%zewdAPI(string,\"&lt;\",\"<\")\n . s string=$$replaceAll^%zewdAPI(string,\"&gt;\",\">\")\n . s stop=0\n . f  d  q:stop\n . . s no=$l(string,\"&#\")\n . . i string'[\"&#\" s stop=1 q\n . . s p1=$p(string,\"&#\",1)\n . . s p2=$p(string,\"&#\",2,no+1)\n . . s no2=$l(p2,\";\")\n . . s p3=$p(p2,\";\",1)\n . . i $l(p3)'=2 s stop=1 q\n . . s p2=$p(p2,\";\",2,no2+1)\n . . s c=$c(p3)\n . . s string=p1_c_p2\n QUIT string\n ;\ngetIP() ; Get own IP address\n QUIT $$getIP^%zewdAPI2()\n ;\najaxErrorRedirect(sessid)\n QUIT $$ajaxErrorRedirect^%zewdAPI2($g(sessid))\n ;\nclassExport(className,methods,filepath)\n ;\n QUIT $$classExport^%zewdCompiler16($g(className),.methods,$g(filepath))\n ;\nstrx(string)\n d strx^%zewdAPI2($g(string))\n QUIT\n ;\ndisableEwdMgr\n s ^%zewd(\"disabled\")=1\n QUIT\n ;\nenableEwdMgr\n k ^%zewd(\"disabled\")\n QUIT\n ;\nenableWLDAccess(app,page)\n i $g(^zewd(\"allowWLDAccess\",$$zcvt(app,\"l\"),$$zcvt(page,\"l\")))'=1 s ^zewd(\"allowWLDAccess\",$$zcvt(app,\"l\"),$$zcvt(page,\"l\"))=1\n QUIT\n ;\ndisableWLDAccess(app,page)\n k ^zewd(\"allowWLDAccess\",$$zcvt(app,\"l\"),$$zcvt(page,\"l\"))\n QUIT\nisSSOValid(sso,username,password,sessid)\n QUIT $$isSSOValid^%zewdMgrAjax2($g(sso),$g(username),$g(password),$g(sessid))\n ;\nuniqueId(nodeOID,filename)\n QUIT $p(filename,\".ewd\",1)_$p(nodeOID,\"-\",2)\n ;\nlinkToParentSession(sessid)\n QUIT $$linkToParentSession^%zewdCompiler20($g(sessid))\n ;\nexportToGTM(routine)\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/_zewdDemo.m",
    "content": "%zewdDemo ; Tutorial page functions\n ;\n ; Product: Enterprise Web Developer (Build 910)\n ; Build Date: Wed, 25 Apr 2012 17:59:25\n ;\n ; \n ; ----------------------------------------------------------------------------\n ; | Enterprise Web Developer for GT.M and m_apache                           |\n ; | Copyright (c) 2004-12 M/Gateway Developments Ltd,                        |\n ; | Reigate, Surrey UK.                                                      |\n ; | All rights reserved.                                                     |\n ; |                                                                          |\n ; | http://www.mgateway.com                                                  |\n ; | Email: rtweed@mgateway.com                                               |\n ; |                                                                          |\n ; | This program is free software: you can redistribute it and/or modify     |\n ; | it under the terms of the GNU Affero General Public License as           |\n ; | published by the Free Software Foundation, either version 3 of the       |\n ; | License, or (at your option) any later version.                          |\n ; |                                                                          |\n ; | This program is distributed in the hope that it will be useful,          |\n ; | but WITHOUT ANY WARRANTY; without even the implied warranty of           |\n ; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            |\n ; | GNU Affero General Public License for more details.                      |\n ; |                                                                          |\n ; | You should have received a copy of the GNU Affero General Public License |\n ; | along with this program.  If not, see <http://www.gnu.org/licenses/>.    |\n ; ----------------------------------------------------------------------------\n ;\ngetLanguage(sessid)\n ;\n s language=$$getRequestValue^%zewdAPI(\"ewd_Language\",sessid)\n d setSessionValue^%zewdAPI(\"ewd_Language\",language,sessid)\n d setSessionValue^%zewdAPI(\"url\",\"www.mgateway.com\",sessid)\n d setSessionValue^%zewdAPI(\"imageTest\",2,sessid)\n d setSessionValue^%zewdAPI(\"tmp_testing\",1234567,sessid)\n QUIT \"\"\n ;\nlogin(sessid)\n ;\n n username,password\n ;\n s username=$$getTextValue^%zewdAPI(\"username\",sessid)\n s password=$$getPasswordValue^%zewdAPI(\"password\",sessid)\n ;d trace^%zewdAPI(\"in login - username=\"_username_\" ; password=\"_password)\n i username'=\"ROB\" QUIT \"invalid username\"\n i password'=\"ROB\" QUIT \"invalid password\"\n QUIT \"\"\n ;\nlogine(sessid)\n ;\n n error,username,password,message,textid\n ;\n s error=\"\"\n s message=$$errorMessage^%zewdAPI(\"invalid login attempt\",sessid)\n s username=$$getTextValue^%zewdAPI(\"username\",sessid)\n s password=$$getPasswordValue^%zewdAPI(\"password\",sessid)\n ;\n i '$d(^ewdDemo(\"tutorial\",\"authentication\")) d  QUIT $$errorMessage^%zewdAPI(error,sessid)\n . i username'=\"ROB\" s error=message q\n . i password'=\"ROB\" s error=message q\n ;\n i username=\"\" QUIT message\n i '$d(^ewdDemo(\"tutorial\",\"authentication\",username)) QUIT message\n i password'=$p(^ewdDemo(\"tutorial\",\"authentication\",username),\"~\",1) QUIT message\n QUIT \"\"\n ;\ngetUsernames(sessid) ;\n ;\n n user\n ;\n i '$d(^ewdDemo(\"tutorial\",\"authentication\")) d  QUIT \"\"\n . d clearList^%zewdAPI(\"user\",sessid)\n . d appendToList^%zewdAPI(\"user\",\"Select a user..\",\"nul\",sessid)\n . d appendToList^%zewdAPI(\"user\",\"ROB\",\"ROB\",sessid)\n ;\n s user=\"\"\n d clearList^%zewdAPI(\"user\",sessid)\n d appendToList^%zewdAPI(\"user\",\"Select a user..\",\"\",sessid)\n f  s user=$o(^ewdDemo(\"tutorial\",\"authentication\",user)) q:user=\"\"  d\n . d appendToList^%zewdAPI(\"user\",user,user,sessid)\n ;\n QUIT \"\"\n ;\naddUsername(sessid)\n ;\n n newUsername\n ;\n s newUsername=$$getTextValue^%zewdAPI(\"newUsername\",sessid)\n i newUsername=\"\" QUIT \"You must enter a username\"\n i $d(^ewdDemo(\"tutorial\",\"authentication\",newUsername)) QUIT newUsername_\" already exists\"\n d setTextValue^%zewdAPI(\"user\",newUsername,sessid)\n QUIT \"\"\n ;\ntestValue(sessid)\n ;\n n user,pass\n ;\n s user=$$getSelectValue^%zewdAPI(\"user\",sessid)\n ;d trace^%zewdAPI(\"user=\"_user)\n QUIT \"\"\n ;\ngetPassword(sessid)\n ;\n n user,pass\n ;\n s user=$$getSelectValue^%zewdAPI(\"user\",sessid)\n s pass=$g(^ewdDemo(\"tutorial\",\"authentication\",user))\n s pass=$p(pass,\"~\",1)\n i user=\"ROB\",pass=\"\" s pass=\"ROB\"\n d setTextValue^%zewdAPI(\"pass\",pass,sessid)\n QUIT \"\"\n ;\nsetPassword(sessid)\n ;\n n user,pass\n ;\n s user=$$getSelectValue^%zewdAPI(\"user\",sessid)\n s pass=$$getTextValue^%zewdAPI(\"pass\",sessid)\n i pass=\"\" QUIT \"You must enter a password\"\n s ^ewdDemo(\"tutorial\",\"authentication\",user)=pass\n QUIT \"\"\n ;\ngetObjDetails(sessid)\n i '$$sessionNameExists^%zewdAPI(\"person.username\",sessid) d\n . d setSessionValue^%zewdAPI(\"person.username\",\"Rob\",sessid)\n . d setSessionValue^%zewdAPI(\"person.password\",\"secret!\",sessid)\n . d setSessionValue^%zewdAPI(\"person.userType\",\"g\",sessid)\n . d setCheckboxOn^%zewdAPI(\"person.permissions\",\"w\",sessid)\n . d setCheckboxOn^%zewdAPI(\"person.permissions\",\"e\",sessid)\n . d clearList^%zewdAPI(\"person.language\",sessid)\n . d appendToList^%zewdAPI(\"person.language\",\"English\",\"en\",sessid)\n . d appendToList^%zewdAPI(\"person.language\",\"French\",\"fr\",sessid)\n . d appendToList^%zewdAPI(\"person.language\",\"German\",\"d\",sessid)\n . d appendToList^%zewdAPI(\"person.language\",\"Italian\",\"it\",sessid)\n . d setMultipleSelectOn^%zewdAPI(\"person.language\",\"en\",sessid)\n . d setMultipleSelectOn^%zewdAPI(\"person.language\",\"d\",sessid)\n . d clearTextArea^%zewdAPI(\"person.comments\",sessid)\n . s textarea(1)=\"This is a line of text\"\n . s textarea(2)=\"This is the second line\"\n . d createTextArea^%zewdAPI(\"person.comments\",.textarea,sessid)\n . d setSessionValue^%zewdAPI(\"wld.%KEY.MGWLPN\",\"EXTC\",sessid)\n QUIT \"\"\n ;\nsetObjDetails(sessid)\n QUIT \"\"\n ;\ngetDetails(sessid)\n ;\n n user,pass,data,expireDate,userType,selected,textarea,confirmText\n ;\n ;d trace^%zewdAPI(\"got here!!\")\n s browser=$$getServerValue^%zewdAPI(\"HTTP_USER_AGENT\",sessid)\n d setSessionValue^%zewdAPI(\"browser\",browser,sessid)\n s user=$$getTextValue^%zewdAPI(\"user\",sessid)\n s data=\"\"\n i user'=\"\" s data=$g(^ewdDemo(\"tutorial\",\"authentication\",user))\n ;d trace^%zewdAPI(\"user=\"_user_\" ; data=\"_data)\n s pass=$p(data,\"~\",1)\n i user=\"ROB\",pass=\"\" d  QUIT \"\"\n . d setTextValue^%zewdAPI(\"pass\",\"ROB\",sessid)\n . d setRadioOn^%zewdAPI(\"userType\",\"a\",sessid)\n . d initialiseCheckbox^%zewdAPI(\"permissions\",sessid)\n . d setCheckboxOn^%zewdAPI(\"permissions\",\"w\",sessid)\n . d setCheckboxOn^%zewdAPI(\"permissions\",\"e\",sessid)\n . d setCheckboxOn^%zewdAPI(\"permissions\",\"s\",sessid)\n . d createLanguageList(sessid)\n . d setMultipleSelectOn^%zewdAPI(\"language\",\"en\",sessid)\n . d setMultipleSelectOn^%zewdAPI(\"language\",\"d\",sessid)\n . d clearTextArea^%zewdAPI(\"comments\",sessid)\n . s textarea(1)=\"This is a line of text\"\n . s textarea(2)=\"This is the second line\"\n . d createTextArea^%zewdAPI(\"comments\",.textarea,sessid)\n ;\n d setTextValue^%zewdAPI(\"pass\",pass,sessid)\n ;d trace^%zewdAPI(\"data=\"_data)\n s userType=$p(data,\"~\",2)\n i userType=\"\" s userType=\"g\"\n d setRadioOn^%zewdAPI(\"userType\",userType,sessid)\n d initialiseCheckbox^%zewdAPI(\"permissions\",sessid)\n i user'=\"\" m selected=^ewdDemo(\"tutorial\",\"authentication\",user,\"permissions\")\n d setCheckboxValues^%zewdAPI(\"permissions\",.selected,sessid)\n d createLanguageList(sessid)\n k selected\n i user'=\"\" m selected=^ewdDemo(\"tutorial\",\"authentication\",user,\"language\")\n d setMultipleSelectValues^%zewdAPI(\"language\",.selected,sessid)\n d clearTextArea^%zewdAPI(\"comments\",sessid)\n i user'=\"\" m textarea=^ewdDemo(\"tutorial\",\"authentication\",user,\"comments\")\n d createTextArea^%zewdAPI(\"comments\",.textarea,sessid)\n ;\n QUIT \"\"\n ;\ncreateLanguageList(sessid)\n ;\n n attr\n d clearList^%zewdAPI(\"language\",sessid)\n d appendToList^%zewdAPI(\"language\",\"English\",\"en\",sessid)\n s attr(\"style\")=\"color:red\"\n d appendToList^%zewdAPI(\"language\",\"French\",\"fr\",sessid,.attr)\n d appendToList^%zewdAPI(\"language\",\"German\",\"d\",sessid,.attr)\n s attr(\"style\")=\"color:green\"\n d appendToList^%zewdAPI(\"language\",\"Italian\",\"it\",sessid,.attr)\n s attr(\"style\")=\"color:green\"\n d appendToList^%zewdAPI(\"language\",\"Spanish\",\"esp\",sessid,.attr)\n d appendToList^%zewdAPI(\"language\",\"Portuguese\",\"por\",sessid)\n d appendToList^%zewdAPI(\"language\",\"Danish\",\"den\",sessid)\n d appendToList^%zewdAPI(\"language\",\"Swedish\",\"swe\",sessid)\n d appendToList^%zewdAPI(\"language\",\"Norwegian\",\"nor\",sessid)\n d initialiseMultipleSelect^%zewdAPI(\"language\",sessid)\n QUIT\n ;\nsetDetails(sessid)\n ;\n n error,expireDate,user,pass,userType,selected,comments,warning\n ;\n s user=$$getTextValue^%zewdAPI(\"user\",sessid)\n s pass=$$getTextValue^%zewdAPI(\"pass\",sessid)\n i pass=\"\" d  QUIT \"You must enter a password\"\n . d setFieldError^%zewdAPI(\"pass\",sessid)\n i pass=\"xxx\" d setFieldError^%zewdAPI(\"testField\",sessid) QUIT \"test error\"\n s userType=$$getRadioValue^%zewdAPI(\"userType\",sessid)\n s ^ewdDemo(\"tutorial\",\"authentication\",user)=pass_\"~\"_userType\n k ^ewdDemo(\"tutorial\",\"authentication\",user,\"permissions\")\n d getCheckboxValues^%zewdAPI(\"permissions\",.selected,sessid)\n m ^ewdDemo(\"tutorial\",\"authentication\",user,\"permissions\")=selected\n k ^ewdDemo(\"tutorial\",\"authentication\",user,\"language\")\n k selected\n d getMultipleSelectValues^%zewdAPI(\"language\",.selected,sessid)\n m ^ewdDemo(\"tutorial\",\"authentication\",user,\"language\")=selected\n k ^ewdDemo(\"tutorial\",\"authentication\",user,\"comments\")\n d getTextArea^%zewdAPI(\"comments\",.comments,sessid)\n m ^ewdDemo(\"tutorial\",\"authentication\",user,\"comments\")=comments\n ;s warning=\"Record successfully updated\"\n ;d setWarning^%zewdAPI(warning,sessid)\n ;\n QUIT \"\"\n ;\ntestAjaxForm(sessid)\n ;\n i $$getRequestValue^%zewdAPI(\"testField1\",sessid)=\"\" d  QUIT \"field1 must not be null\"\n . d setFieldError^%zewdAPI(\"testField1\",sessid)\n i $$getRequestValue^%zewdAPI(\"testField2\",sessid)=\"\" d  QUIT \"javascript: x=1 ; document.getElementById('testField3').value = x\"\n . d setFieldError^%zewdAPI(\"testField2\",sessid)\n i $$getRequestValue^%zewdAPI(\"testField3\",sessid)=\"\" d  QUIT \"field3 must not be null\"\n . d setFieldError^%zewdAPI(\"testField3\",sessid)\n ;\n QUIT \"\"\n ;\ngetVersion() ;\n QUIT $zv\n ;\ngetTime(sessid)\n ;\n d setSessionValue^%zewdAPI(\"dateTime\",$$inetDate^%zewdAPI($h),sessid)\n QUIT \"\"\n ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/arrays.m",
    "content": "start ; create student data\n  set student(\"name\",\"first\")=\"Linus\"\n  set student(\"name\",\"last\")=\"Torvalds\"\n  set student(\"language\")=\"C\"\n  set student(\"classes\",\"monday\")=\"Algebra\"\n  set student(\"classes\",\"tuesday\")=\"Geometry\"\n  set student(\"classes\",\"wednesday\")=\"English\"\n  set student(\"classes\",\"thursday\")=\"French\"\n  set student(\"classes\",\"friday\")=\"Jujitsu\"\n  zwrite student\n  write $order(student)\n\n  write !,\"Student array top level\",!\n  set x=\"\"\n  for  do  quit:x=\"\"\n  . set x=$order(student(x))\n  . write x,!\n\n  write !,\"Student classes \",!\n  set x=\"\"\n  for  do  quit:x=\"\"\n  . set x=$order(student(\"classes\",x))\n  . write:x'=\"\" x,\" : \",student(\"classes\",x),!\n\n  quit\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/base64.m",
    "content": "\t;\n\t; This file is part of DataBallet.\n\t; Copyright (C) 2012 Laurent Parenteau <laurent.parenteau@gmail.com>\n\t;\n\t; DataBallet is free software: you can redistribute it and/or modify\n\t; it under the terms of the GNU Affero General Public License as\n\t; published by the Free Software Foundation, either version 3 of the\n\t; License, or (at your option) any later version.\n\t;\n\t; DataBallet is distributed in the hope that it will be useful,\n\t; but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\t; GNU Affero General Public License for more details.\n\t;\n\t; You should have received a copy of the GNU Affero General Public License\n\t; along with DataBallet.  If not, see <http://www.gnu.org/licenses/>.\n\t;\n\nencode(message)\n\t;\n\t; Return base64 with URL and Filename safe alphabet (RFC 4648)\n\t;\n\tnew base64,todrop,i\n\t\n\t; Populate safe alphabet values on first use only.\n\tif '$data(base64safe) do\n\t.\tfor i=0:1:25 set base64safe(i)=$zchar(65+i),base64safe(i+26)=$zchar(97+i)\n\t.\tfor i=52:1:61 set base64safe(i)=$zchar(i-4)\n\t.\tset base64safe(62)=\"-\",base64safe(63)=\"_\"\n\n\t; Pad message with 0 to ensure number of bytes is a multiple of 3.\n\tset todrop=0\n\tfor  quit:($zlength(message)#3)=0  set message=message_$zchar(0) set todrop=todrop+1\n\n\t; Base64 encode the message\n\tset base64=\"\"\n\tfor i=1:3:$zlength(message) do\n\t.\tset base64=base64_base64safe($zascii(message,i)\\4)\n\t.\tset base64=base64_base64safe(($zascii(message,i)#4*16)+($zascii(message,i+1)\\16))\n\t.\tset base64=base64_base64safe(($zascii(message,i+1)#16*4)+($zascii(message,i+2)\\64))\n\t.\tset base64=base64_base64safe($zascii(message,i+2)#64)\n\n\tset:todrop'=0 base64=$zextract(base64,1,$zlength(base64)-todrop)\n\n\tquit base64\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/digest.m",
    "content": ";\n;  GT.M Digest Extension\n;  Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>\n;\n;  This program is free software: you can redistribute it and/or modify\n;  it under the terms of the GNU Affero General Public License as\n;  published by the Free Software Foundation, either version 3 of the\n;  License, or (at your option) any later version.\n;\n;  This program is distributed in the hope that it will be useful,\n;  but WITHOUT ANY WARRANTY; without even the implied warranty of\n;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;  GNU Affero General Public License for more details.\n;\n;  You should have received a copy of the GNU Affero General Public License\n;  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n;\n\n;  GT.M™ is a trademark of Fidelity Information Services, Inc.\n\n; \"GT.M™ is a vetted industrial strength, transaction processing application\n;  platform consisting of a key-value database engine optimized for extreme\n;  transaction processing throughput & business continuity.\"\n;                                -- http://sourceforge.net/projects/fis-gtm/\n\n\n\n; GT.M Digest Extension\n;\n; This simple OpenSSL based digest extension is a rewrite of OpenSSL\n; EVP_DigestInit usage example with additional M wrapper.\n; See http://www.openssl.org/docs/crypto/EVP_DigestInit.html for details.\n;\n; The return value from $&digest.init() is 0, usually when an invalid digest\n; algorithm was specification. Anyway, properly used, should never fail.\n;\n; Please feel free to contact me if you have any questions or comments,\n; Piotr Koper <piotr.koper@gmail.com>\n;\n\n\ndigest(m,a) ; returns digest in ASCII HEX, all-in-one\n\tn c,d\n\ts c=$&digest.init(a)\n\td &digest.update(.c,.m)\n\td &digest.final(.c,.d)\n\tq d\n\n\ninit(alg) ; returns context handler, for alg try \"md5\", \"sha256\", etc\n\t; 0 is returned when an error occurs (e.g. unknown digest)\n\tq $&digest.init(alg)\n\nupdate(ctx,msg) ; updates digest (ctx) by message msg\n\td &digest.update(.ctx,.msg)\n\tq\n\nfinal(ctx,digest) ; returns hex encoded message digest in digest\n\t; frees memory allocated for the ctx also\n\td &digest.final(.ctx,.digest)\n\tq\n\n\n; digest algorithms availability depends on libcrypto (OpenSSL) configuration\n\nmd4(m) q $$digest(.m,\"md4\")\nmd5(m) q $$digest(.m,\"md5\")\nsha(m) q $$digest(.m,\"sha\")\nsha1(m) q $$digest(.m,\"sha1\")\nsha224(m) q $$digest(.m,\"sha224\")\nsha256(m) q $$digest(.m,\"sha256\")\nsha512(m) q $$digest(.m,\"sha512\")\ndss1(m) q $$digest(.m,\"dss1\")\nripemd160(m) q $$digest(.m,\"ripemd160\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/dynamicscoping.m",
    "content": ";------------------------------------\n; These first two routines illustrate\n; the dynamic scope of variables in M\n;------------------------------------\ntriangle1(x) ;;\n set sum=0\n for  do  quit:x'>1\n . set sum=sum+x\n . set x=x-1\n quit sum\n\nmain1() ;;\n set sum=1500\n set x=6\n write \"sum before=\",sum,!\n set y=$$triangle1(x)\n write \"sum after=\",sum,!\n write \"triangle of \",x,\" is \",y,!\n quit\n\n\n;------------------------------------\n; These next two routines illustrate\n; the use of the NEW command to make\n; variables limited to the local scope\n;------------------------------------\ntriangle2(x) ;;\n new sum ; <-- HERE !!\n set sum=0\n for  do  quit:x'>1\n . set sum=sum+x\n . set x=x-1\n quit sum\n\nmain2() ;;\n set sum=1500\n set x=6\n write \"sum before=\",sum,!\n set y=$$triangle2(x)\n write \"sum after=\",sum,!\n write \"triangle of \",x,\" is \",y,!\n quit\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/fibonacci.m",
    "content": "start ; compute the Fibonacci series\n set (a,b)=1\n for i=1:1 do  quit:term>100\n . set term=a+b\n . write !,term\n . set a=b\n . set b=term\n write !,\"Result= \",term,!\n quit\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/forloop.m",
    "content": "start1 ; entry label\n set a=1\n set b=20\n set c=2\n set sum=0\n for i=a:c do  quit:'(i<b)\n . set sum=sum+i\n . write i,\" : \",sum,!\n quit\n\nstart2 ; entry label\n set a=1\n set b=20\n set c=2\n set sum=0\n for i=a:c:b do\n . set sum=sum+i\n . write i,\" : \",sum,!\n quit\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/functions.m",
    "content": "; This function computes a factorial\n\n\nfactorial(n) ;;\n new f\n set f=n\n for  do  quit:n'>1\n . set n=n-1\n . set f=f*n\n . write n,\" : \",f,!\n quit f\n\n\n\nmain() ;;\n set x=5\n set y=$$factorial(x)\n write \"Factorial of \",x,\" = \",y,!\n quit\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/helloworld.m",
    "content": "label1 ; This is a label\n    write \"Hello World !\",!\n    quit\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/ifelse.m",
    "content": "if1 ; simple if statement\n set a=5\n set b=10\n set c=25\n if (a<b) set c=b\n write c,!\n quit\n\nif2 ; if statements contrasted\n set a=5\n set b=10\n if (a<b) write \"variable a=\",a,\" is smaller than b=\",b,!\n if (a>b) write \"variable a=\",a,\" is larger  than b=\",b,!\n quit\n\nif3 ; if statement with else clause\n set a=5\n set b=10\n if (a<b) write \"variable a=\",a,\" is smaller than b=\",b,!\n else  write \"variable a=\",a,\" is larger  than b=\",b,!\n quit\n\nif4 ; if statement with else clause and bodies\n set a=5\n set b=10\n set c=10\n if (a<b) do\n . write \"variable a=\",a,\" is smaller than b=\",b,!\n . set c=c+a\n else  do\n . write \"variable a=\",a,\" is larger  than b=\",b,!\n . set c=c+b\n write \"c=\",c,!\n quit\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/indirectfunctions.m",
    "content": "start ; exercise\n set ^car(\"make\")=\"toyota\"\n set ^car(\"model\")=\"corolla\"\n set ^car(\"mileage\")=\"$$compute^mileage\"\n\n write !,\"Regular computation\",!\n write \"make = \",^car(\"make\"),!\n write \"model = \",^car(\"model\"),!\n write \"mileage = \",@^car(\"mileage\")@(150,4),!\n\n write !,\"Pesimist computation\",!\n set ^car(\"mileage\")=\"$$computepesimist^mileage\"\n write \"make = \",^car(\"make\"),!\n write \"model = \",^car(\"model\"),!\n write \"mileage = \",@^car(\"mileage\")@(150,4),!\n\n write !,\"Optimist computation\",!\n set ^car(\"mileage\")=\"$$computeoptimist^mileage\"\n write \"make = \",^car(\"make\"),!\n write \"model = \",^car(\"model\"),!\n write \"mileage = \",@^car(\"mileage\")@(150,4),!\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/md5.m",
    "content": ";\n;  MD5 Implementation in M\n;  Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>\n;\n;  This program is free software: you can redistribute it and/or modify\n;  it under the terms of the GNU Affero General Public License as\n;  published by the Free Software Foundation, either version 3 of the\n;  License, or (at your option) any later version.\n;\n;  This program is distributed in the hope that it will be useful,\n;  but WITHOUT ANY WARRANTY; without even the implied warranty of\n;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;  GNU Affero General Public License for more details.\n;\n;  You should have received a copy of the GNU Affero General Public License\n;  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n;\n\n; It works in GT.M with ZCHSET=M, but please, don't use it. It's only a joke.\n; Serves well as a reverse engineering example on obtaining boolean functions\n; from integer addition, modulo and division.\n\n\nmd5(msg)\n\t; http://en.wikipedia.org/wiki/MD5\n\tn m,r,k,h,i,j,a,b,c,d,f,g,w,t,p,q\n\ts r(0)=7,r(1)=12,r(2)=17,r(3)=22,r(4)=7,r(5)=12,r(6)=17,r(7)=22,r(8)=7,r(9)=12,r(10)=17,r(11)=22,r(12)=7,r(13)=12,r(14)=17,r(15)=22,r(16)=5,r(17)=9,r(18)=14,r(19)=20,r(20)=5,r(21)=9,r(22)=14,r(23)=20,r(24)=5,r(25)=9,r(26)=14,r(27)=20,r(28)=5,r(29)=9,r(30)=14,r(31)=20,r(32)=4,r(33)=11,r(34)=16,r(35)=23,r(36)=4,r(37)=11,r(38)=16,r(39)=23,r(40)=4,r(41)=11,r(42)=16,r(43)=23,r(44)=4,r(45)=11,r(46)=16,r(47)=23,r(48)=6,r(49)=10,r(50)=15,r(51)=21,r(52)=6,r(53)=10,r(54)=15,r(55)=21,r(56)=6,r(57)=10,r(58)=15,r(59)=21,r(60)=6,r(61)=10,r(62)=15,r(63)=21\n\ts k(0)=3614090360,k(1)=3905402710,k(2)=606105819,k(3)=3250441966,k(4)=4118548399,k(5)=1200080426,k(6)=2821735955,k(7)=4249261313,k(8)=1770035416,k(9)=2336552879,k(10)=4294925233,k(11)=2304563134,k(12)=1804603682,k(13)=4254626195,k(14)=2792965006,k(15)=1236535329,k(16)=4129170786,k(17)=3225465664,k(18)=643717713,k(19)=3921069994,k(20)=3593408605,k(21)=38016083,k(22)=3634488961,k(23)=3889429448,k(24)=568446438,k(25)=3275163606,k(26)=4107603335,k(27)=1163531501,k(28)=2850285829,k(29)=4243563512,k(30)=1735328473,k(31)=2368359562,k(32)=4294588738,k(33)=2272392833,k(34)=1839030562,k(35)=4259657740,k(36)=2763975236,k(37)=1272893353,k(38)=4139469664,k(39)=3200236656,k(40)=681279174,k(41)=3936430074,k(42)=3572445317,k(43)=76029189,k(44)=3654602809,k(45)=3873151461,k(46)=530742520,k(47)=3299628645,k(48)=4096336452,k(49)=1126891415,k(50)=2878612391,k(51)=4237533241,k(52)=1700485571,k(53)=2399980690,k(54)=4293915773,k(55)=2240044497,k(56)=1873313359,k(57)=4264355552,k(58)=2734768916,k(59)=1309151649,k(60)=4149444226,k(61)=3174756917,k(62)=718787259,k(63)=3951481745\n\ts h(0)=1732584193,h(1)=4023233417,h(2)=2562383102,h(3)=271733878\n\ts $p(m,$c(0),(55-$l(msg))#64+1)=\"\",m=msg_$c(128)_m_$$n64($l(msg)*8),p=1,q=0\n\tf  q:q  d\n\t. f j=0:1:15 s w(j)=$$read(.m,.p)\n\t. i w(0)<0 s q=1 q\n\t. s a=h(0),b=h(1),c=h(2),d=h(3)\n\t. f i=0:1:63 d\n\t.. i i<16 d\n\t... s f=$$or($$and(b,c),$$and($$not(b),d)),g=i\n\t.. e  i i<32 d\n\t... s f=$$or($$and(d,b),$$and($$not(d),c)),g=(5*i+1)#16\n\t.. e  i i<48 d\n\t... s f=$$xor($$xor(b,c),d),g=(3*i+5)#16\n\t.. e  s f=$$xor(c,$$or(b,$$not(d))),g=(7*i)#16\n\t.. s t=d,d=c,c=b,b=(b+$$rotate((a+f+k(i)+w(g))#4294967296,r(i)))#4294967296,a=t\n\t. s h(0)=(h(0)+a)#4294967296,h(1)=(h(1)+b)#4294967296,h(2)=(h(2)+c)#4294967296,h(3)=(h(3)+d)#4294967296\n\tq $$n32h(h(0))_$$n32h(h(1))_$$n32h(h(2))_$$n32h(h(3))\n\nnot(a) ; 32bit\n\tq 4294967295-a\n\nxor(a,b) ; 32bit\n\tn x,i s x=0 f i=1:1:32 s x=(x\\2)+(((a+b)#2)*2147483648),a=a\\2,b=b\\2\n\tq x\n\nand(a,b) ; 32bit\n\tn x,i s x=0 f i=1:1:32 s x=(x\\2)+((((a#2)+(b#2))\\2)*2147483648),a=a\\2,b=b\\2\n\tq x\n\nor(a,b) ; 32bit\n\tq $$not($$and($$not(.a),$$not(.b)))\n\nrotate(a,n) ; 32bit, rol\n\tn c s c=a*(2**n)\n\tq c#4294967296+(c\\4294967296)\n\nread(b,i)\n\tn n,j s n=0 f j=3:-1:0 s n=256*n+$a($e(b,i+j))\n\ts i=i+4\n\tq n\n\nn64(n)\n\tn s,i f i=1:1:8 s $e(s,i)=$c(n#256),n=n\\256\n\tq s\n\nn32h(n)\n\tn h,s,i s h=\"0123456789abcdef\" f i=1:2:8 s $e(s,i+1)=$e(h,n#16+1),n=n\\16,$e(s,i)=$e(h,n#16+1),n=n\\16\n\tq s\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/mileage.m",
    "content": "compute(miles,gallons)\n quit miles/gallons\n\ncomputepesimist(miles,gallons)\n quit miles/(gallons+1)\n\ncomputeoptimist(miles,gallons)\n quit (miles+1)/gallons\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/mumtris.m",
    "content": ";\n;  Mumtris\n;  Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>\n;\n;  This program is free software: you can redistribute it and/or modify\n;  it under the terms of the GNU Affero General Public License as\n;  published by the Free Software Foundation, either version 3 of the\n;  License, or (at your option) any later version.\n;\n;  This program is distributed in the hope that it will be useful,\n;  but WITHOUT ANY WARRANTY; without even the implied warranty of\n;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;  GNU Affero General Public License for more details.\n;\n;  You should have received a copy of the GNU Affero General Public License\n;  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n;\n\n; Mumtris\n; This is a tetris game in MUMPS, for GT.M, have fun.\n;\n; Resize your terminal (e.g. maximize your PuTTY window), restart GT.M so that\n; it can report true size of your terminal, and d ^mumtris.\n;\n; Try setting ansi=0 for GT.M compatible cursor positioning.\n;\n; NOTICE: Mumtris uses \"active waiting\" for making delays lower that 1s.\n;         That means that one of your CPU will be used at 99%. It's not a bug,\n;         the Mumtris and GT.M will be fully responsive. Take care when\n;         running on production system ;-)\n;\n\nmumtris\n\tn ansi,e,n,w,h,gr,fl,hl,sc,lv,lc,sb,st,ml,dh,dw,mx,my,mt,r,y,x,t10m,c,ne,i,q\n\n\ts ansi=1\t; use (faster) ANSI CSI instead of USE $P:X=x positioning\n\ts w=10\t\t; matrix width\n\ts h=22\t\t; matrix height (see below)\n\ts gr=1\t\t; grid\n\ts fl=1\t\t; fill\n\ts hl=1\t\t; help\n\ts sc=0\t\t; score\n\ts lv=1\t\t; level\n\ts lc=0\t\t; lines cleared at current level\n\ts sb=70\t\t; step base\n\ts st=$$step\t; current step\n\ts ml=3\t\t; move/rotate hold limit (without fall)\n\n\td dev\t\t; defines dw, dh (device width, device height)\n\ts h=dh-2\t; comment out to disable auto height\n\ts mx=dw/2-(3*w/2)\t; matrix left coordinate\n\ts my=dh/2-(h/2)-1\t; matrix top coordinate\n\ts mt=\"3 5_9 8 2_9 .2_02 /5 \\2 2_ 2_2 6_/2 |8_|2_| 6_0 /2 \\ /2 \\|2 |2 \\/5 \\3 2_\\_2 2_ \\2 |/2 3_/0/4 Y4 \\2 |2 /2 Y Y2 \\2 |2 |2 | \\/2 |\\3_ \\0\\4_|2_2 /4_/|2_|_|2 /2_|2 |2_|2 |2_/4_2 >08 \\/9 3 \\/9 9 2 \\/0\" ; Mumtris\n\n\tu $p:noecho\n\tu $p:escape\n\td cls\n\n\td intro\n\n\td elements\n\ts ne=$r(e)+1\t; new element\n\td change,new(),preview\n\td score(),help,redraw\n\n\ts (i,q)=0\n\tf  q:q  d\n\t. d pos(0,0)\n\t. s c=$$key\n\t. i c=1 d exit s q=1 q\n\t. s i=$s('c:0,1:i+1)\n\t. s:i'<ml (i,c)=0\n\t. i c'=3,$$fall d lock,clear,change,preview i $$new d over,exit s q=1 q\t; short-circuit and in first if\n\t. d redraw\n\tq\n\nkey() ; 0 - timeout, 1 - exit, 2 - harddrop, 3 - other char\n\tn q,c,d,ex,hd\n\ts (q,d,ex,hd)=0\n\tn i\n\tn l s l=1\n\tf  q:q  d\n\t. r *c:0\n\t. i c<0&'d d\n\t.. f i=1:1:st*t10m r *c:0 q:c>-1  i $h\n\t. i c<0 s q=1 q\n\t. s d=2\n\t. i c=27 d  q:q\n\t.. i $l($zb)=1 s (q,ex)=1 q\n\t.. s c=$a($e($zb,3))\n\t.. d:c=65 rotate\n\t.. d:c=66 fall(1)\n\t.. d:c=67 right\n\t.. d:c=68 left\n\t. i c=70!(c=102) s fl=fl+1#3 d preview\n\t. s:c=71!(c=103) gr='gr\n\t. i c=72!(c=104) s hl='hl d help\n\t. d:c=73!(c=105) rotate\n\t. d:c=74!(c=106) left\n\t. d:c=75!(c=107) fall(1)\n\t. d:c=76!(c=108) right\n\t. s:c=81!(c=113) (q,ex)=1\n\t. i c=32 d drop s hd=1\n\tq $s(ex:1,hd:2,d:3,1:0)\n\nredraw\n\td matrix\n\td stack\n\td draw(n,r,y,x)\n\tq\n\nticks\n\tn x,h,b,e,q\n\ts h=$h,(b,e,q)=0 f i=1:1:1000000000 r *x:0 i h'=$h s h=$h d  q:q\n\t. i 'b s b=i\n\t. e  s e=i,q=1\n\ts t10m=(e-b)\\100\n\tq\n\nchange\n\ts n=ne\n\ts ne=$r(e)+1\n\ts x=0,y=0,r=1\n\tq\n\nnew()\n\ts r=1,x=w/2-2,y=1-e(n,r)\n\tq:$q $$collision(r,y,x) q\n\ndrop\n\tn i\n\ts i=0 f  q:$$fall  s i=i+2\n\td score(i)\n\tq\n\nrotate\n\tn k\n\ts k=r#e(n)+1\n\tq:$$collision(k,y,x)\n\ts r=k\n\tq\n\nfall(k)\n\tn c\n\ti $$collision(r,y+1,x) q:$q 1 q\n\ts y=y+1\n\td:$g(k) score(1)\n\tq:$q 0 q\n\nright\tq:$$collision(r,y,x+1)  s x=x+1 q\nleft\tq:$$collision(r,y,x-1)  s x=x-1 q\n\ncollision(r,y,x)\n\tn i,j,q\n\ts q=0\n\tf i=1:1:4 q:q  f j=1:1:4 q:q  s:$g(e(n,r,j,i))&($g(n(y+j,x+i))!(y+j>h!(x+i>w!(x+i<1)))) q=1\n\tq q\n\nlock\n\tn i,j\n\tf i=1:1:4 q:q  f j=1:1:4 q:q  s:$g(e(n,r,j,i)) n(y+j,x+i)=1\n\tq\n\nclear\n\tn c,i,j,q\n\ts c=0\n\tf j=h:-1:1 d\n\t. s q=0\n\t. f i=1:1:w i '$g(n(j,i)) s q=1 q\n\t. q:q\n\t. f i=j:-1:1 k n(i) m n(i)=n(i-1)\n\t. s j=j+1,c=c+1\n\t. d redraw\n\ti c d\n\t. d score($s(c=4:800,1:i*200-100*lv))\n\t. s lc=lc+c\n\t. i lv*10'>lc d score(,1) s lc=0\n\tq\n\nexit\n\tn s\n\ts s=mt_\"09  Piotr Koper <piotr.koper@gmail.com>09 8 h2tps:2/github.com/pkoper\"\n\td cls d write(.s,dh/2-3,dw/2-24) h 1 r *s:0 r *s:4\n\td cls u $p:echo\n\tq\n\nintro\n\tn s\n\ts s=mt_\"9 9 8 Mumtris for GT.M0\"\n\td cls h 1 d write(.s,dh/2-3,dw/2-24) h 1\n\td ticks\n\td cls\n\tr s:0\n\tq\n\ncls\n\td pos(0,0,1)\n\tq\n\npos(y,x,c)\n\ti ansi d\n\t. ; workaround for ANSI driver: NL in some safe place (1,1)\n\t. w $c(27)_\"[1;1f\",!,$c(27)_\"[\"_(y\\1+1)_\";\"_(x\\1+1)_\"f\"\n\t. w:$g(c) $c(27)_\"[2J\"\n\te  d\n\t. u $p:(x=x:y=y)\n\t. u:$g(c) $p:clearscreen\n\tq\n\nover\n\tn s\n\ts s=\"2 8_9 9 6 8_0 /2 5_/5_4 5_3 4_3 \\5_2 \\3_2 2_ 9_2_0/3 \\2 3_\\2_2 \\2 /5 \\_/ 2_ \\3 /3 |3 \\2 \\/ 2/ 2_ \\_2 2_ \\0\\4 \\_\\2 \\/ 2_ \\|2 Y Y2 \\2 3_/2 /4 |4 \\3 /\\2 3_/|2 | \\/0 \\6_2 (4_2 /2_|_|2 /\\3_2 > \\7_2 /\\_/2 \\3_2 >2_|08 \\/5 \\/6 \\/5 \\/9  \\/9  \\/0\"\n\td cls,write(.s,dh/2-3,dw/2-32) h 1 r *s:0 r *s:2\n\tq\n\nwrite(s,y,x)\n\tn i,j,l,c,d\n\td pos(y,x)\n\ts l=$l(s) f i=1:1:l d\n\t. s c=$e(s,i)\n\t. i c?1N d\n\t.. i 'c s y=y+1 d pos(y,x) q\n\t.. s d=$e(s,i+1) f j=1:1:c w d\n\t.. s i=i+1\n\t. e  w c\n\td pos(0,0)\n\tq\n\nhelp\n\tn i,x,l,j\n\ts i=9 f x=\"MOVE: LEFT, RIGHT\",\"TURN: UP\",\"DROP: SPACE\",\"\",\"FILL: F\",\"GRID: G\",\"HELP: H\",\"\",\"QUIT: ESC, Q\" d pos(dh/2-(h/2)+i,dw/2+(3*w/2+3)) d  s i=i+1\n\t. i hl w x\n\t. e  s l=$l(x) f j=1:1:l w \" \"\n\tq\n\nfill() q $s(fl=1:\"[#]\",fl=2:\"[+]\",1:\"[ ]\")\n\ndraw(n,r,y,x,o)\n\tn i,j\n\ts x=3*x+mx+1,y=y+my\n\tf i=1:1:4 i y+i>my f j=1:1:4 d pos(y+i-1,3*(j-1)+x) w $s($g(e(n,r,i,j)):$$fill,$g(o):\"   \",1:\"\")\n\tq\n\nstep() q 0.85**lv*sb+(0.1*lv)\n\nscore(s,l)\n\ts:$g(s) sc=sc+s\n\ti $g(l) s lv=lv+l,st=$$step\n\td pos(dh/2-(h/2)+2,dw/2+(3*w/2+3)) w \"SCORE: \",sc\n\td pos(dh/2-(h/2)+3,dw/2+(3*w/2+3)) w \"LEVEL: \",lv\n\tq\n\npreview\n\td draw(ne,1,4-e(ne,1),-5,1)\n\tq\n\nstack\n\tn i,j,x,y\n\ts x=mx+1,y=my\n\tf i=1:1:h f j=1:1:w i $g(n(i,j)) d pos(y+i-1,3*(j-1)+x) w $$fill\n\tq\n\nmatrix\n\tn i,j\n\tf i=0:1:h-1 d\n\t. d pos(my+i,mx) w \"|\" f j=1:1:w w $s(gr:\" . \",1:\"   \")\n\t. w \"|\"\n\td pos(my+h,mx) w \"|\" f j=1:1:w*3 w \"~\"\n\tw \"|\",!\n\tq\n\ndev\n\tn x,i\n\tzsh \"d\":x\n\ts i=\"\" f  s i=$o(x(\"D\",i)) q:i=\"\"  d:(x(\"D\",i)[$p)\n\t. s dw=$p($p(x(\"D\",i),\"WIDTH=\",2),\" \",1),dh=$p($p(x(\"D\",i),\"LENG=\",2),\" \",1)\n\tq\n\nelements\n\t; e - elements\n\t; e(elemId) - rotateVersions\n\t; e(elemId,rotateVersion) - bottom coordinate\n\t; e(elemId,rotateVersion,y,x) - point\n\t;\n\ts e=7\n\t; ____\n\ts e(1)=2,e(1,1)=2\n\ts (e(1,1,2,1),e(1,1,2,2),e(1,1,2,3),e(1,1,2,4))=1\n\ts (e(1,2,1,2),e(1,2,2,2),e(1,2,3,2),e(1,2,4,2))=1\n\t; |__\n\ts e(2)=4,e(2,1)=2\n\ts (e(2,1,1,1),e(2,1,2,1),e(2,1,2,2),e(2,1,2,3))=1\n\ts (e(2,2,1,2),e(2,2,1,3),e(2,2,2,2),e(2,2,3,2))=1\n\ts (e(2,3,2,1),e(2,3,2,2),e(2,3,2,3),e(2,3,3,3))=1\n\ts (e(2,4,1,2),e(2,4,2,2),e(2,4,3,1),e(2,4,3,2))=1\n\t; __|\n\ts e(3)=4,e(3,1)=2\n\ts (e(3,1,1,3),e(3,1,2,1),e(3,1,2,2),e(3,1,2,3))=1\n\ts (e(3,2,1,2),e(3,2,2,2),e(3,2,3,2),e(3,2,3,3))=1\n\ts (e(3,3,2,1),e(3,3,2,2),e(3,3,2,3),e(3,3,3,1))=1\n\ts (e(3,4,1,1),e(3,4,1,2),e(3,4,2,2),e(3,4,3,2))=1\n\t; ||\n\ts e(4)=1,e(4,1)=2\n\ts (e(4,1,1,1),e(4,1,1,2),e(4,1,2,1),e(4,1,2,2))=1\n\t; _-\n\ts e(5)=2,e(5,1)=3\n\ts (e(5,1,2,2),e(5,1,2,3),e(5,1,3,1),e(5,1,3,2))=1\n\ts (e(5,2,1,2),e(5,2,2,2),e(5,2,2,3),e(5,2,3,3))=1\n\t; _|_\n\ts e(6)=4,e(6,1)=2\n\ts (e(6,1,1,2),e(6,1,2,1),e(6,1,2,2),e(6,1,2,3))=1\n\ts (e(6,2,1,2),e(6,2,2,2),e(6,2,2,3),e(6,2,3,2))=1\n\ts (e(6,3,2,1),e(6,3,2,2),e(6,3,2,3),e(6,3,3,2))=1\n\ts (e(6,4,1,2),e(6,4,2,1),e(6,4,2,2),e(6,4,3,2))=1\n\t; -_\n\ts e(7)=2,e(7,1)=3\n\ts (e(7,1,2,1),e(7,1,2,2),e(7,1,3,2),e(7,1,3,3))=1\n\ts (e(7,2,1,2),e(7,2,2,1),e(7,2,2,2),e(7,2,3,1))=1\n\tq\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/nesting.m",
    "content": "start1 ; entry label\n set ax=1\n set bx=20\n set cx=2\n set ay=1\n set by=20\n set cy=2\n set sumx=0\n set sqrx=0\n set sumxy=0\n for x=ax:cx:bx do\n . set sumx=sumx+x\n . set sqrx=sqrx+(x*x)\n . for y=ay:cy:by do\n .. set sumxy=sumxy+(x*y)\n .. if (sumxy<100) do\n ... write sumxy,!\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/pcre.m",
    "content": ";\n;  GT.M PCRE Extension\n;  Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>\n;\n;  This program is free software: you can redistribute it and/or modify\n;  it under the terms of the GNU Affero General Public License as\n;  published by the Free Software Foundation, either version 3 of the\n;  License, or (at your option) any later version.\n;\n;  This program is distributed in the hope that it will be useful,\n;  but WITHOUT ANY WARRANTY; without even the implied warranty of\n;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;  GNU Affero General Public License for more details.\n;\n;  You should have received a copy of the GNU Affero General Public License\n;  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n;\n\n;  GT.M™ is a trademark of Fidelity Information Services, Inc.\n\n; \"GT.M™ is a vetted industrial strength, transaction processing application\n;  platform consisting of a key-value database engine optimized for extreme\n;  transaction processing throughput & business continuity.\"\n;                                -- http://sourceforge.net/projects/fis-gtm/\n\n\n\n; GT.M PCRE Extension\n;\n; This extension tries to deliver the best possible PCRE interface for the\n; M world by providing a support for PCRE with M arrays, stringified parameter\n; names, simplified API, locales, exceptions and Perl5 Global Match.\n;\n; See pcreexamples.m for comprehensive examples on ^pcre routines usage and\n; beginner level tips on match limits, exception handling and UTF-8 in GT.M.\n;\n; Try out the best known book on regular expressions: http://regex.info/\n; For more information on PCRE see: http://pcre.org/\n;\n; Please feel free to contact me if you have any questions or comments,\n; Piotr Koper <piotr.koper@gmail.com>\n;\n\n\npcre\t;GT.M PCRE Extension\n\t;1.0;Initial release;pkoper\n\tq\n\n\nversion()\n\tq $&pcre.version()\n\nconfig(name)\n\t; name is one of: (case insensitive)\n\t;\t\"UTF8\", \"NEWLINE\", \"LINK_SIZE\", \"POSIX_MALLOC_THRESHOLD\",\n\t;\t\"MATCH_LIMIT\", \"MATCH_LIMIT_RECURSION\", \"STACKRECURSE\",\n\t;\t\"BSR\", \"UNICODE_PROPERTIES\", \"JIT\", \"JITTARGET\"\n\t;\n\td protect\n\t;\n\tn erropt,isstring,s,n,code\n\ts code=$&pcre.config(.name,.erropt,.isstring,.s,.n)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq $s(isstring:s,1:n)\n\ncompile(pattern,options,locale,mlimit,reclimit)\n\t; options is case insensitive and optional string with \"|\" joined:\n\t;\t\"ANCHORED\", \"CASELESS\", \"DOLLAR_ENDONLY\", \"DOTALL\", \"EXTENDED\",\n\t;\t\"FIRSTLINE\", \"MULTILINE\", \"NO_AUTO_CAPTURE\", \"DUPNAMES\",\n\t;\t\"UNGREEDY\", \"BSR_ANYCRLF\", \"BSR_UNICODE\", \"JAVASCRIPT_COMPAT\",\n\t;\t\"NL_ANY\", \"NL_ANYCRLF\", \"NL_CR\", \"NL_CRLF\",\"NL_LF\",\n\t;\t\"UTF8\", \"UCP\", \"NO_UTF8_CHECK\"\n\t;\n\t; locale is an optional Unix locale name used for pcre_maketables(),\n\t; cases:\n\t;\tundefined or \"\":\n\t;\t\tpcre_maketables() will not be called\n\t;\t\"ENV\" (case insensitive):\n\t;\t\tuse locale in program environment defined by the\n\t;\t\tenvironment variables LANG or LC_*\n\t;\tspecified:\n\t;\t\t\"pl_PL.iso88592\", \"pl_PL.utf8\", \"C\", ...\n\t;\t\tsee locale(1), locale(2) and the output of command:\n\t;\t\t\t$ locale -a\n\t;\t\tDebian tip: use\n\t;\t\t\t$ dpkg-reconfigure locales\n\t;\t\tto enable or set system-wide locale\n\t;\n\t; mlimit (optional) limits the number of internal matching function\n\t;\tcalls in pcre_exec() execution, see PCRE manual for details\n\t;\n\t; reclimit (optional) limit for the depth of recursion when calling\n\t;\tthe internal matching function in a pcre_exec() execution,\n\t;\tsee PCRE manual for details\n\t;\n\td protect\n\t;\n\tn erropt,ref,err,erroffset,code\n\ts code=$&pcre.compile(.pattern,$g(options),.erropt,.ref,.err,.erroffset,$g(locale),$g(mlimit,0),$g(reclimit,0))\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq ref\n\nexec(ref,subject,options,startoffset,length)\n\t; options is case insensitive and optional string with \"|\" joined:\n\t;\t\"ANCHORED\", \"BSR_ANYCRLF\", \"BSR_UNICODE\",\n\t;\t\"NL_ANY\", \"NL_ANYCRLF\", \"NL_CR\", \"NL_CRLF\", \"NL_LF\",\n\t;\t\"NOTBOL\", \"NOTEOL\", \"NOTEMPTY\", \"NOTEMPTY_ATSTART\",\n\t;\t\"NO_START_OPTIMIZE\", \"NO_UTF8_CHECK\",\n\t;\t\"PARTIAL_SOFT\", \"PARTIAL_HARD\"\n\t;\n\t; startoffset is in octets, starts with 1 (like in M) (optional)\n\t;\n\t; length is subject length in octets, not chars (optional)\n\t;\n\td protect\n\t;\n\tn erropt,code,start\n\ts start=$g(startoffset,1)-1\n\ts code=$&pcre.exec(.ref,.subject,$g(length,$zl(subject)),start,$g(options),.erropt)\n\ts:code<0 $ec=\",U\"_(-code)_\",\"\n\tq code\n\novector(ref,i) ; return i-element from ovector\n\td protect\n\t;\n\tn n,code\n\ts code=$&pcre.ovector(.ref,.i,.n)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\t;s $ec=\",U123,\"\n\tq n\n\novecsize(ref) ; return ovecsize\n\td protect\n\t;\n\tn n,code\n\ts code=$&pcre.ovecsize(.ref,.n)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq n\n\nfullinfo(ref,name)\n\t; name is one of: (case insensitive)\n\t;\t\"OPTIONS\", \"SIZE\", \"CAPTURECOUNT\", \"BACKREFMAX\", \"FIRSTBYTE\",\n\t;\t\"FIRSTTABLE\", \"LASTLITERAL\", \"NAMEENTRYSIZE\", \"NAMECOUNT\",\n\t; \t\"STUDYSIZE\", \"OKPARTIAL\", \"JCHANGED\", \"HASCRORLF\", \"MINLENGTH\",\n\t;\t\"JIT\", \"JITSIZE\"\n\t; for NAME* options see also $$nametable^pcre()\n\t;\n\td protect\n\t;\n\tn erropt,isstring,s,n,code\n\ts code=$&pcre.fullinfo(.ref,.name,.erropt,.isstring,.s,.n)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq $s(isstring:s,1:n)\n\nnametable(ref,i,n) ; returns index (n) and name, or { 0, \"\" } for invalid i\n\t; i is indexed from 1\n\t;\n\td protect\n\t;\n\tn s,code\n\ts code=$&pcre.nametable(.ref,.i,.n,.s)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq s\n\nsubstring(ref,i,begin,end)\n\ts begin=$$ovector(.ref,i*2)+1,end=$$ovector(.ref,i*2+1)\n\t; ovector contains octet indexed data not UNICODE chars, so $ze is used\n\tq:'begin \"\"\n\tq $s($g(o,0):begin_\",\"_end,1:$ze(subject,begin,end))\n\nstore(ref,i,n,o,key) ; same as above but stores captured data in n array\n\tn begin,end\n\ts begin=$$ovector(.ref,i*2)+1,end=$$ovector(.ref,i*2+1)\n\tq:'begin\n\ts key=$g(key,i)\n\ts:o n(key,0)=begin,n(key,1)=end\n\ts n(key)=$ze(subject,begin,end)\n\tq\n\ngstore(ref,i,n,round,byref,o,key) ; store for global match\n\tn begin,end\n\ts begin=$$ovector(.ref,i*2)+1,end=$$ovector(.ref,i*2+1)\n\tq:'begin\n\ts key=$g(key,i)\n\ti byref d\n\t. s:o n(key,round,0)=begin,n(key,round,1)=end\n\t. s n(key,round)=$ze(subject,begin,end)\n\te  d\n\t. s:o n(round,key,0)=begin,n(round,key,1)=end\n\t. s n(round,key)=$ze(subject,begin,end)\n\tq\n\ntest(subject,pattern,options,locale,mlimit,reclimit)\n\t; see $$compile^pcre for options, locale, mlimit and reclimit\n\t;\n\td protect\n\tn ref,l\n\ts ref=$$compile(.pattern,$g(options),$g(locale),$g(mlimit,0),$g(reclimit,0))\n\ts l=$$exec(.ref,.subject)\n\td free(.ref)\n\tq l\n\nmatch(subject,pattern,match,capture,options,locale,mlimit,reclimit)\n\t; see $$compile^pcre for options, locale, mlimit and reclimit\n\t;\n\t; capture is case insensitive and optional string with \"|\" joined\n\t;\tnames or indexes to be capture\n\t;\n\t; extended options:\n\t;   \"NAMED_ONLY\" - capture only named groups\n\t;   \"OVECTOR\"    - return additional ovector data\n\t;\n\td protect\n\t;\n\tn namedonly,ovector,ref,o,l,i,j,s,c,begin\n\t;\n\ts options=$g(options),(namedonly,ovector)=0\n\tf i=1:1:$l(options,\"|\") d\n\t. s o=$zco($p(options,\"|\",i),\"u\")\n\t. i o=\"NAMED_ONLY\" s namedonly=1,$p(options,\"|\",i)=\"\"\n\t. i o=\"OVECTOR\" s ovector=1,$p(options,\"|\",i)=\"\"\n\ts:namedonly options=options_\"|NO_AUTO_CAPTURE\"\n\t;\n\tk match\n\ts ref=$$compile(.pattern,.options,$g(locale),$g(mlimit,0),$g(reclimit,0))\n\ts l=$$exec(.ref,.subject)\n\ti $d(capture) d\n\t. s c=\"|\"_capture_\"|\"\n\t. ; ovector indexed data\n\t. i 'namedonly f i=0:1:l-1 d:c[(\"|\"_i_\"|\") store(.ref,.i,.match,.ovector)\n\t. ; named matches data\n\t. f i=1:1 s s=$$nametable(.ref,.i,.j) q:s=\"\"  d:c[(\"|\"_s_\"|\") store(.ref,.j,.match,.ovector,.s)\n\te  d\n\t. i 'namedonly f i=0:1:l-1 d store(.ref,.i,.match,.ovector)\n\t. f i=1:1 s s=$$nametable(.ref,.i,.j) q:s=\"\"  d store(.ref,.j,.match,.ovector,.s)\n\td free(.ref)\n\tq:$q l q\n\nglobal(subject,pattern,match,capture,options,locale,mlimit,reclimit)\n\t; options is the same as for match^pcre, extended options:\n\t;   \"OVECTOR\"    - return additional ovector data\n\t;   \"GROUPED\"    - group the result in match array by pattern groups\n\t;   \"NAMED_ONLY\" - capture only named patterns\n\t;\n\t; see pcredemo.c and pcreccp.cc from PCRE for comments on procedure\n\t; for Perl like global matching\n\t;\n\td protect\n\t;\n\tn ref,c,o,ovector,byref,namedonly,utf8,crlf,start,end,matches,empty,skip,round,i,j,s,n,q\n\tk match\n\t;\n\t; determine additional options and remove them before calling the compile^pcre\n\ts options=$g(options),(ovector,byref,namedonly)=0\n\tf i=1:1:$l(options,\"|\") d\n\t. s o=$zco($p(options,\"|\",i),\"u\")\n\t. i o=\"NAMED_ONLY\" s namedonly=1,$p(options,\"|\",i)=\"\"\n\t. i o=\"GROUPED\" s byref=1,$p(options,\"|\",i)=\"\"\n\t. i o=\"OVECTOR\" s ovector=1,$p(options,\"|\",i)=\"\"\n\ts:namedonly options=options_\"|NO_AUTO_CAPTURE\"\n\t;\n\t; compile the pattern\n\ts ref=$$compile(.pattern,.options,$g(locale),$g(mlimit,0),$g(reclimit,0))\n\t;\n\ts:$d(capture) c=\"|\"_capture_\"|\"\n\ts byref=$g(byref,0)\n\t;\n\t; check pattern options for UTF8 and double char new line\n\ts o=\"|\"_$$fullinfo(.ref,\"OPTIONS\")_\"|\"\n\ts utf8=$s(o[\"|UTF8|\":1,1:0)\n\ts crlf=$s(o[\"|NL_CRLF|\":1,o[\"|NL_ANY|\":1,o[\"|NL_ANYCRLF|\":1,1:0)\n\t;\n\t; if none check the PCRE build options\n\ti crlf=0 d\n\t. s o=$$config(\"NEWLINE\")\n\t. s crlf=$s(o=\"NL_CRLF\":1,o=\"NL_ANY\":1,o=\"NL_ANYCRLF\":1,1:0)\n\t;\n\ts (start,round,i)=1,(empty,skip,q)=0\n\ts end=$l(subject)+1\n\tf  d  q:start>end!q\n\t. i empty d\n\t.. s matches=$$exec(.ref,.subject,\"NOTEMPTY_ATSTART|ANCHORED\",.start) ; unwind this call to optimize\n\t.. q:matches ; quit this do, leave empty=1, store the matches\n\t..\n\t.. ; advance if no match & clear empty\n\t.. s start=start+1\n\t.. i start>end s q=1 q\n\t..\n\t.. ; skip LF if CR was before and CRLF mode\n\t.. s:crlf&(($ze(subject,start-1)=$c(13))&($ze(subject,start)=$c(10))) start=start+1\n\t..\n\t.. ; skip if in a middle of UTF char\n\t.. i utf8 f  q:start'<end!($zbitand($c(0)_$ze(subject,start),$c(0)_$c(192))=$c(0)_$c(128))  s start=start+1\n\t..\n\t.. ; take into account skipped chars\n\t.. s skip=1,empty=0\n\t. e  d\n\t.. s matches=$$exec(.ref,.subject,,.start)\n\t.. i 'matches s q=1 q\n\t.\n\t. q:q\n\t. i skip s skip=0 q\n\t.\n\t. i $d(c) d\n\t.. ; ovector indexed data\n\t.. i 'namedonly f i=0:1:matches-1 d:c[(\"|\"_i_\"|\") gstore(.ref,.i,.match,.round,.byref,.ovector)\n\t.. ; named matches data\n\t.. f i=1:1 s s=$$nametable(.ref,.i,.n) q:s=\"\"  d:c[(\"|\"_s_\"|\") gstore(.ref,.n,.match,.round,.byref,.ovector,.s)\n\t. e  d\n\t.. i 'namedonly f i=0:1:matches-1 d gstore(.ref,.i,.match,.round,.byref,.ovector)\n\t.. f i=1:1 s s=$$nametable(.ref,.i,.n) q:s=\"\"  d gstore(.ref,.n,.match,.round,.byref,.ovector,.s)\n\t. s round=round+1\n\t.\n\t. s start=$$ovector(.ref,1)+1\n\t. s empty=(($$ovector(.ref,0)+1)=start)\n\td free(.ref)\n\tq:$q round-1 q\n\n\nreplace(subject,pattern,subst,first,last,options,locale,mlimit,reclimit)\n\t; see $$match^pcre and $$compile^pcre for options, locale, mlimit and\n\t;\treclimit\n\t;\n\t; subst is a string to replace with all occurrences of matched data\n\t; \t\\n (like \\1, \\2, ..) is a back ref for the n-th captured group\n\t;\t\\{name} is back ref for a named captured data\n\t;\t\\\\ is replaced with \\\n\t;\n\t; first is the n-th match in the subject where the substitution begins,\n\t;\t1 .. n-1 matches are not substituted\n\t;\tdefaults to 1\n\t;\n\t; last is the n-th match in the subject where the substitution ends,\n\t;\tn+1 .. matches are not substituted\n\t;\tdefaults to 0 (no limit)\n\t;\n\tn ref,o,n,i,j,begin,end,offset,backref,boffset,value,s\n\ts ref=$$compile(.pattern,,$g(locale),$g(mlimit,0),$g(reclimit,0))\n\t;\n\t; prepare back reference stack\n\td global^pcre(.subst,\"\\\\(?:(?<ref>(?:\\d+|\\\\))|{(?<ref>[^}]+)})\",.backref,,\"ovector|dupnames\")\n\t;\n\ts options=$g(options)_\"|ovector\"\n\t; silently remove \"NAMED_ONLY\" and \"GROUPPED\" options\n\tf i=1:1:$l(options,\"|\") d\n\t. s o=$zco($p(options,\"|\",i),\"u\")\n\t. s:o=\"NAMED_ONLY\"!(o=\"GROUPED\") $p(options,\"|\",i)=\"\"\n\tq:'$$global(.subject,.pattern,.n,,.options,$g(locale),$g(mlimit,0),$g(reclimit,0)) subject\n\t;\n\t; perform the substitution on matched subject parts\n\ts first=$g(first,1),last=$g(last,0)\n\ts offset=0,i=\"\"\n\tf  s i=$o(n(i)) q:i=\"\"  d:i'<first  q:last>0&(i'<last)\n\t.\n\t. ; replace back refs in subst (s) with captured data\n\t. s s=subst,boffset=0,j=\"\"\n\t. f  s j=$o(backref(j)) q:j=\"\"  d\n\t..\n\t.. ; determine the back ref type and get the value\n\t.. ; silently ignore invalid refs\n\t.. s value=$s(backref(j,\"ref\")=\"\\\":\"\\\\\",1:$g(n(i,backref(j,\"ref\"))))\n\t..\n\t.. ; replace back ref with the value\n\t.. s begin=backref(j,0,0)\n\t.. s end=backref(j,0,1)\n\t.. s $ze(s,begin+boffset,end+boffset)=value\n\t.. s boffset=boffset-(end+1-begin)+$l(value)\n\t.\n\t. ; replace matched data with prepared s\n\t. s begin=n(i,0,0)\n\t. s end=n(i,0,1)\n\t.\n\t. s $ze(subject,begin+offset,end+offset)=s\n\t.\n\t. ; substitute empty matches also (Perl style)\n\t. ;\n\t. ; perl -e '$_ = \"aa\"; s/(b*|a)/Xy/g; print \"$_\\n\"'\n\t. ; w $$replace^pcre(\"aa\",\"(b*|a)\",\"Xy\")\n\t. ; \n\t. ; perl -e '$_ = \"aa\"; s/(b*|aa)/Xy/g; print \"$_\\n\"'\n\t. ; w $$replace^pcre(\"aa\",\"(b*|aa)\",\"Xy\")\n\t. ; \n\t. ; perl -e '$_ = \"aaa\"; s/(b*|aa)/Xy/g; print \"$_\\n\"'\n\t. ; w $$replace^pcre(\"aaa\",\"(b*|aa)\",\"Xy\")\n\t. ;\n\t. s:begin>end $ze(subject,begin+offset,begin+offset+1)=s_$ze(subject,begin+offset,begin+offset+1)\n\t.\n\t. s offset=offset-(end+1-begin)+$l(s)\n\tq:$q subject q\n\nfree(ref)\n\td protect\n\tn code\n\ts code=$&pcre.free(.ref)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq\n\nstackusage()\n\t; return the approximate amount of stack (in bytes) used per\n\t; recursion in pcre_exec()\n\tq -$&pcre.stackusage()\n\n\n; Exception Handling\n;\n; Error conditions are handled by setting the $zc to user codes, see labels\n; at the end of this file. When neither $zt nor $et are set by the user,\n; the default handler (trap^pcre) is used within $zt mechanism.\n;\n; The default handler will write out the details of the exception, and\n; depending on the caller type, it will re raise the exception. This will\n; lead to:\n; a) writing the exception details, when called from the GT.M prompt,\n; b) writing the exception details, the M code place when the pcre routine\n;    was called, and terminating the GT.M image.\n;\n; The user should define own exception handler using $zt or $et, see\n; pcreexample.m for example exception handlers.\n;\n\nprotect ; try setup $zt with default handler\n\t;\n\t; \"n protect\" in the $zt is a marker for trap^pcre\n\ts:'$l($et)&(($zt=\"B\")!'$l($zt)) $zt=\"n protect d trap zg \"_($zl-2)\n\tq\n\ntrap(stack)\n\t; see U* labels at the bottom of this file, some lvns are mandatory\n\t; all exceptions are passed through if we wasn't called from direct mode\n\t;\n\tn zl,ref,msg,place\n\t;\n\t; take the $zl if in default handler setup by protect^trap\n\ts zl=$p($zt,\"n protect d trap zg \",2)\n\t;\n\t; clear the $zt\n\ts $zt=\"\"\n\t;\n\t; source location from either stack argument, zl (default handler), or $st-2\n\ts place=$st($g(stack,$g(zl,$st-1)-1),\"PLACE\")\n\t;\n\t; clear location if called from direct mode\n\ts:place[\"^GTM$DMOD\" place=\"\"\n\t;\n\ts ref=$p($ec,\",\",$l($ec,\",\")-1)\n\ti $l($t(@ref)) d\n\t. u $p\n\t. w @$p($t(@ref),\";\",2)\n\t. ; %PCRE-E-COMPILE additional message\n\t. w:ref=\"U16392\"&$g(erroffset) \" in \"_$e($g(pattern),1,erroffset)_\" <-- HERE\"\n\t. w !\n\t. ; write the location it has any meaning\n\t. w:$l(place) \"%PCRE-I-RTSLOC,          At M source location \",place,!\n\te  d\n\t. w $p($zs,\",\",3,4),!\n\t. w \"%GTM-I-RTSLOC,          At M source location \",$p($zs,\",\",2),!\n\t; \n\t; re raise the exception if in a default handler and not called from the direct mode\n\ts:$l(place)&$g(zl,0) $ec=$ec\n\tq\n\n; XC API specific\n;\nU16384\t;\"%PCRE-E-ARGSMALL, Actual argument count is too small\"\nU16385\t;\"%PCRE-E-OPTNAME, Unknown option name \"_$p($g(erropt),\"|\")\nU16386\t;\"%PCRE-E-OBJLIMIT, Maximum number of objects exceeded\"\nU16387\t;\"%PCRE-E-INVREF, Invalid object reference\"\nU16388\t;\"%PCRE-E-INTBUF, Internal buffer too small\"\nU16389\t;\"%PCRE-E-MALLOC, Could not allocate memory\"\nU16390\t;\"%PCRE-E-STUDY, Pattern study failed: \"_$g(err,\"unknown reason\")\nU16391\t;\"%PCRE-E-LOCALE, Invalid locale name \"_$g(locale)\nU16392\t;\"%PCRE-E-COMPILE, Pattern compilation failed, \"_$g(err,\"unknown reason\")\nU16393\t;\"%PCRE-E-LENGTH, Invalid length value specified\"\n\n; PCRE specific\n;\n; NOTES:\n;\n;\tU16401 exception is never raised; when pcre_exec() returns -1\n;       (i.e. NOMATCH) the pcre.exec returns 0, so no exception will\n;\tever raise, NOMATCH is not an uncommon situation\n;\n;\tU16388 is raised when pcre_exec() returns 0, i.e. the ovector\n;\twas too small; considering that ovector size is not controlled\n;\tin M world, it is an exception here\n;\nU16401\t;\"%PCRE-E-NOMATCH, The subject string did not match the pattern\"\nU16402\t;\"%PCRE-E-NULL, Either compiled code or subject was passed as NULL, or ovector was NULL\"\nU16403\t;\"%PCRE-E-BADOPTION, An unrecognized bit was set in the options argument\"\nU16404\t;\"%PCRE-E-BADMAGIC, The magic number is not present in compiled code\"\nU16405\t;\"%PCRE-E-UNKNOWNOPCODE, While running the pattern match, an unknown item was encountered in the compiled pattern\"\nU16406\t;\"%PCRE-E-NOMEMORY, Call via pcre_malloc() or pcre_stack_malloc() failed\"\nU16407\t;\"%PCRE-E-NOSUBSTRING, No substring\"\nU16408\t;\"%PCRE-E-MATCHLIMIT, Match limit was reached\"\nU16409\t;\"%PCRE-E-CALLOUT, Callout function wanted to yield a distinctive error code\"\nU16410\t;\"%PCRE-E-BADUTF8, A string that contains an invalid UTF-8 byte sequence was passed as a subject\"\nU16411\t;\"%PCRE-E-BADUTF8OFFSET, The value of startoffset did not point to the beginning of a UTF-8 character or the end of the subject\"\nU16412\t;\"%PCRE-E-PARTIAL, The subject string did not match, but it did match partially\"\nU16414\t;\"%PCRE-E-INTERNAL, An unexpected internal error has occurred\"\nU16415\t;\"%PCRE-E-BADCOUNT, The value of the ovecsize argument is negative\"\nU16416\t;\"%PCRE-E-DFAUITEM, Unsupported item in the pattern, for e.g. \\C o a back reference\"\nU16417\t;\"%PCRE-E-DFAUCOND, Unsupported condition item, for e.g. a back reference for a condition, or a test for recursion in a specific group\"\nU16418\t;\"%PCRE-E-DFAUMLIMIT, Match limits are unsupported for DTA matching\"\nU16419\t;\"%PCRE-E-DFAWSSIZE, Out of space in the workspace vector\"\nU16420\t;\"%PCRE-E-DFARECURSE, The output vector was not large enough while processing recursive subpattern\"\nU16421\t;\"%PCRE-E-RECURSIONLIMIT, The internal recursion limit was reached\"\nU16423\t;\"%PCRE-E-BADNEWLINE, An invalid combination of NL_xxx options was given\"\nU16424\t;\"%PCRE-E-BADOFFSET, The startoffset was negative or greater than the length of the value in length\"\nU16425\t;\"%PCRE-E-SHORTUTF8, The subject string ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set\"\nU16426\t;\"%PCRE-E-RECURSELOOP, A recursion loop within the pattern was detected\"\nU16427\t;\"%PCRE-E-JITSTACKLIMIT, The memory available for the just-in-time processing stack is not large enough\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/pcreexamples.m",
    "content": ";\n;  GT.M PCRE Extension\n;  Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>\n;\n;  This program is free software: you can redistribute it and/or modify\n;  it under the terms of the GNU Affero General Public License as\n;  published by the Free Software Foundation, either version 3 of the\n;  License, or (at your option) any later version.\n;\n;  This program is distributed in the hope that it will be useful,\n;  but WITHOUT ANY WARRANTY; without even the implied warranty of\n;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;  GNU Affero General Public License for more details.\n;\n;  You should have received a copy of the GNU Affero General Public License\n;  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n;\n\n\n\n; GT.M PCRE Extension Examples\n;\n; see pcre.m for comments on routines parameters and all possible values for\n; the options\n;\npcreexamples ;GT.M PCRE Extension Examples\n\t;1.0;Initial release;pkoper\n\td routines\n\tq\n\n\n; GT.M PCRE Extension API\n; The shining examples\n;\n\ntest\n\t; Test the subject for the match\n\tw $$test^pcre(\"The quick brown fox jumps over the lazy dog\",\"fox\"),!\n\tw $$test^pcre(\"The quick brown fox jumps over the lazy dog\",\"FoX\",\"caseless\"),!\n\tq\n\nmatch\n\tn n\n\t; Simple match\n\tw $$match^pcre(\"The quick brown fox jumps over the lazy dog\",\" (\\w+) \",.n),! zwr\n\n\t; Match with a named groups\n\tw $$match^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+) (?<second>\\w+)\",.n),! zwr\n\n\t; Match with a named group and limit the output to only the \"second\"\n\tw $$match^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+) (?<second>\\w+)\",.n,\"second\"),! zwr\n\n\t; Match with a named group with only named patterns\n\tw $$match^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+) (?<second>\\w+)\",.n,,\"named_only\"),! zwr\n\tq\n\nglobal\n\tn n\n\t; Global match\n\tw $$global^pcre(\"The quick brown fox jumps over the lazy dog\",\"(\\w+)\",.n),! zwr\n\n\t; Global match with a named groups\n\tw $$global^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",.n),! zwr\n\n\t; Global match with grouped captured data\n\tw $$global^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",.n,,\"grouped\"),! zwr\n\n\t; Global match with grouped captured data and only named patterns\n\tw $$global^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",.n,,\"grouped|named_only\"),! zwr\n\tq\n\nreplace\n\t; Just the replace\n\tw $$replace^pcre(\"The quick brown fox jumps over the lazy dog\",\"brown\",\"yellow\"),!\n\n\t; Change the word order\n\tw $$replace^pcre(\"The quick brown fox jumps over the lazy dog\",\"(\\w+)\\s+(\\w+)\",\"\\2 \\1\"),!\n\n\t; Change the word order with named groups\n\tw $$replace^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",\"\\{second} \\{first}\"),!\n\n\t; Escape the \\ sequence\n\tw $$replace^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",\"\\{second} \\\\{first}\"),!\n\n\t; More \\ chars\n\tw $$replace^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",\"\\\\\\{second} \\\\\\\\{first}\"),!\n\tq\n\n\n\n; PCRE API\n; Low level PCRE API examples\n;\napi\n\tn subject,pattern,options,offset,ref,count,i,begin,end,s,name,n\n\n\t; Setup exception trap as in myexception2^pcreexamples\n\ts $zt=\"d trap^pcre(\"_$st_\") zg \"_$zl_\":apitrap^pcreexamples\"\n\n\ts subject=\"The quick brown fox \"_$c(10)_\"jumps over the lazy dog\"\n\ts pattern=\"(?<all>(.*?(?<red>F\\S+).*?)(?<high>\\w+))\"\n\n\t; options are case insensitive, as well as all stringified option\n\t; names for all functions in this extension\n\ts options=\"CASELESS|multiLINE|NL_CrLf|NO_AUTO_CAPTURE|dotall\"\n\ts offset=5 ; start the match with \"quick\"\n\n\t; Compile the pattern\n\ts ref=$$compile^pcre(.pattern,.options) ; pass by the reference\n\n\t; Run the match\n\ts count=$$exec^pcre(.ref,.subject,,.offset)\n\tw \"count: \",count,!\n\n\t; To access the ovector array $$ovector^pcre and $$ovecsize^pcre can\n\t; be used.\n\t;\n\t; ovector array size is always (n + 1) * 3, where n is a number of\n\t; possible capture strings in the submitted pattern for the\n\t; $$compile^pcre(). The exact number of usable pairs of integers in\n\t; ovector array is by the $$exec^pcre().\n\t;\n\tw \"ovecsize: \",$$ovecsize^pcre(.ref),!\n\n\t; Get the captured data in an old way\n\tf i=0:1:count-1 d\n\t. s begin=$$ovector^pcre(.ref,i*2)+1\n\t. s end=$$ovector^pcre(.ref,i*2+1)\n\t. s s=$ze(subject,begin,end)\n\t. w i,\": \",s,!\n\n\t; See what's in the nametable\n\t;\n\t; $$nametable^pcre returns i-th element of nametable array, where the\n\t; index of the ovector array is passed by the reference in n, and the\n\t; return value is a name.\n\t;\n\tf i=1:1 s name=$$nametable^pcre(.ref,.i,.n) q:name=\"\"  d\n\t. s begin=$$ovector^pcre(.ref,n*2)+1 ; the returned subject index in n\n\t. s end=$$ovector^pcre(.ref,n*2+1)\n\t. s s=$ze(subject,begin,end)\n\t. w name,\": \",s,!\n\n\t; Use $$substring^pcre() to get the captured string instead of playing\n\t; with $$ovector^pcre().\n\tf i=0:1:count-1 w i,\": \",$$substring^pcre(.ref,.i),!\n\n\t; .. and get the begin and the end index of the captured data in the\n\t; subject, as a side effect.\n\tf i=0:1:count-1 d\n\t. w i,\": \",$$substring^pcre(.ref,.i,.begin,.end),!\n\t. w \"begin: \",begin,!\n\t. w \"end: \",end,!\n\n\t; Get some details on compiled pattern\n\tw \"options: \",$$fullinfo^pcre(.ref,\"OPTIONS\"),!\n\tw \"capture count: \",$$fullinfo^pcre(.ref,\"CAPTURECOUNT\"),!\n\tw \"jit: \",$$fullinfo^pcre(.ref,\"JIT\"),!\n\tw \"min length: \",$$fullinfo^pcre(.ref,\"MINLENGTH\"),!\n\n\t; Free the data internally allocated for the PCRE structures\n\t;\n\td free^pcre(.ref)\n\n\t; Finally, raise an example exception\n\t;\n\t; see \"Exception Handler Examples\"\n\t; \n\tw $t(api+4^pcreexamples),!\n\tw $$compile^pcre(\"aa)bb\"),!\n\tw \"should never be written, the %PCRE-E-COMPILE should be raised\",!\n\tq\n\napitrap\n\tw \"apitrap^pcreexamples\",!\n\tq\n\n\n\n\n; Perl5 Global Match Compatibility\n;\n; Global match as with /g switch on regular expressions in Perl5 is supported.\n;\n; See $$global^pcre and $$replace^pcre examples.\n\n\n; Compatibility Case: Empty Matches\n;\n\n; Global Match\n;\np5global\n\tw \"$ perl -e '$_ = \"\"aa\"\"; print \"\"1: $1\\n\"\" while /(b*|aa)/mg'\",!\n\tzsy \"perl -e \"\"\\$_ = \\\"\"aa\\\"\"; print \\\"\"1: \\$1\\n\\\"\" while /(b*|aa)/mg\"\"\"\n\td global^pcre(\"aa\",\"b*|aa\",.n) zwr\n\tq\n\n; Global Replace\n;\np5replace\n\tw \"$ perl -e '$_ = \"\"aa\"\"; s/(b*|a)/Xy/g; print \"\"$_\\n\"\"'\",!\n\tzsy \"perl -e \"\"\\$_ = \\\"\"aa\\\"\"; s/(b*|a)/Xy/g; print \\\"\"\\$_\\n\\\"\"\"\"\"\n\tw $$replace^pcre(\"aa\",\"(b*|a)\",\"Xy\"),!\n\n\tw \"$ perl -e '$_ = \"\"aa\"\"; s/(b*|aa)/Xy/g; print \"\"$_\\n\"\"'\",!\n\tzsy \"perl -e \"\"\\$_ = \\\"\"aa\\\"\"; s/(b*|aa)/Xy/g; print \\\"\"\\$_\\n\\\"\"\"\"\"\n\tw $$replace^pcre(\"aa\",\"(b*|aa)\",\"Xy\"),!\n\n\tw \"$ perl -e '$_ = \"\"aaa\"\"; s/(b*|aa)/Xy/g; print \"\"$_\\n\"\"'\",!\n\tzsy \"perl -e \"\"\\$_ = \\\"\"aaa\\\"\"; s/(b*|aa)/Xy/g; print \\\"\"\\$_\\n\\\"\"\"\"\"\n\tw $$replace^pcre(\"aaa\",\"(b*|aa)\",\"Xy\"),!\n\tq\n\n\n; Compatibility Case: New Line Characters\n;\n\n; Multi-line with LF\n;\np5lf\n\tw \"perl -e '$_ = \"\"aa\\nbb\"\"; print \"\"1: $1\\n\"\" while /(.*)/mg'\",!\n\tzsy \"perl -e \"\"\\$_ = \\\"\"aa\\nbb\\\"\"; print \\\"\"1: \\$1\\n\\\"\" while /(.*)/mg\"\"\"\n\td global^pcre(\"aa\"_$c(10)_\"bb\",\".*\",.n,,\"multiline|nl_lf\") zwr\n\tq\n\n; Various New Line Specs\n;\np5nl\n\td global^pcre(\"aa\"_$c(13)_$c(10)_\"bb\",\".*\",.n,,\"multiline|nl_lf\") zwr\n\td global^pcre(\"aa\"_$c(13)_$c(10)_\"bb\",\".*\",.n,,\"multiline|nl_cr\") zwr\n\td global^pcre(\"aa\"_$c(13)_$c(10)_\"bb\",\".*\",.n,,\"multiline|nl_crlf\") zwr\n\tq\n\n\n\n; PCRE library version\n;\nversion\n\tw $$version^pcre,!\n\tq\n\n; PCRE compile time defaults\n;\nnewline\n\tw $$config^pcre(\"NEWLINE\"),!\n\tq\n\nutf8support\n\tw $$config^pcre(\"UTF8\"),!\n\tq\n\n; Stack Usage\n;\n; PCRE's stack usage discover procedure\n;\nstackusage\n \tw $$stackusage^pcre,!\n\tq\n\n\n\n; Locale Support Examples\n;\n; Polish language has been used as an example for I18N support in PCRE.\n;\n\n; The example word \"dąb\" (encoded here in UTF-8) is an \"oak\" in Polish.\n;\n; The second letter in \"dąb\" is <aogonek> (I18N) which is:\n;   $c(177) in ISO8859-2,\n;   $c(261) in UTF-8,\n; see http://en.wikipedia.org/wiki/Polish_code_pages for complete listing\n;\n\n; Note of $CHAR(n) in different GT.M character modes:\n;\n;\tIn UTF-8 mode $c(177) will return two octet encoded UTF-8 char is\n;\tprobably not an expected result when working with single octet ISO\n;\tencoded chars.\n;\n;\tUse $zch(177) to create single octet ISO char, but be prepared for\n;\t%GTM-E-BADCHAR errors. Also the result of $l(), $a() and others might\n;\tbe not what is expected.\n;\n\n\n; Locale: C or POSIX (i.e. no localization)\n;\nnolocale\n\tw $zchset,!\n\tw $$match^pcre(\"d\"_$zch(177)_\"b\",\"\\w{3}\",.n,,,),! zwr\n\tq\n\n; Locale: ISO\n;\nisolocale\n\tw $zchset,!\n\tw $$match^pcre(\"d\"_$zch(177)_\"b\",\"\\w{3}\",.n,,,\"pl_PL\"),! zwr\n\tq\n\n; Locale: UTF-8\n;\nutflocale\n\t; M and UTF-8 mode\n\tw $$match^pcre(\"d\"_$zch(196)_$zch(133)_\"b\",\"\\w{3}\",.n,,\"UTF8|UCP\",\"pl_PL.UTF8\"),! zwr\n\n\t; UTF-8 mode only\n\tw $$match^pcre(\"d\"_$c(261)_\"b\",\"\\w{3}\",.n,,\"UTF8|UCP\",\"pl_PL.UTF8\"),! zwr\n\tq\n\n; Locale: environment ($LANG, $LC_CTYPE)\n;\n; Set the GT.M environment for LANG=\"pl_PL\" or LANG=\"pl_PL.UTF8\" to obtain\n; different results.\n;\nenvlocale\n\tw $ztrnlnm(\"LANG\"),!\n\tw $ztrnlnm(\"LC_CTYPE\"),!\n\tw $$match^pcre(\"d\"_$c(177)_\"b\",\"\\w{3}\",.n,,,\"env\"),! zwr\n\tw $$match^pcre(\"d\"_$zch(196)_$zch(133)_\"b\",\"\\w{3}\",.n,,\"UTF8|UCP\",\"pl_PL.UTF8\"),! zwr\n\tq\n\n\n; Notes on GT.M in UTF-8\n;\n;\tEnabling native support for UTF-8 in GT.M requires:\n;\t1) libicu\n;\t2) environment:\n;\t   gtm_chset=UTF-8\n;\t   gtm_icu_version=4.8\n;\t3) recompiled object files for UTF-8\n;\n;\n; Instructions for UTF-8 in Debian 6\n;\n;\t1) Install libicu (libicu48)\n;\t   $ apt-get install libicu48\n;\t2) append environment setup to GT.M's user .bash_profile\n;\t   export gtm_chset=UTF-8\n;\t   export gtm_icu_version=4.8\n;\t3) remove *.o files from the GT.M installation directory\n;\t   $ rm /opt/gtm/*.o\n;\t4) allow GT.M's user to write new object files\n;          $ chown gtm /opt/gtm\n;\n;\n; Startup errors in UTF-8 mode\n;\n; %GTM-E-INVOBJ, Cannot ZLINK object file due to unexpected format\n; %GTM-I-TEXT, Object compiled with CHSET=M which is different from $ZCHSET\n;\n; The above errors are written by the GT.M at the startup when the environment\n; has the correct setup for the UTF-8, but GT.M can't use already existing\n; object files for execution, because they were compiled for the M charset.\n; Remove all GT.M's object files like in step 3) in the \"Instructions for\n; UTF-8 in Debian 6\" above.\n;\n\n\n\n; Match Limits\n;\n;\tPCRE has built-in limits on internal matching and recursion.\n;\n;\tThose limits prevent the PCRE engine from a very long runs, especially\n;\twhen there would be no matches and all possible\tpaths in the match\n;\ttree must be checked.\n;\n;\tFunctions using $$compile^pcre and the $$compile^pcre itself allows\n;\tsetting MATCH_LIMIT and MATCH_LIMIT_RECURSION in optional arguments\n;\tnamed mlimit and reclimit:\n;\n;\t  $$compile^pcre(pattern,options,locale,mlimit,reclimit)\n;\t  $$match^pcre(subject,pattern,match,capture,options,locale,mlimit,reclimit)\n;\t  $$global^pcre(subject,pattern,match,capture,options,locale,mlimit,reclimit)\n;\t  $$replace^pcre(subject,pattern,subst,first,last,options,locale,mlimit,reclimit)\n;\n;\tIf the mlimit or reclimit are not specified, the PCRE library\n;\tcompilation time defaults are used.\n;\nlimits\n\tw \"Compile time (default) MATCH_LIMIT is: \",$$config^pcre(\"MATCH_LIMIT\"),!\n\tw \"Compile time (default) MATCH_LIMIT_RECURSION is: \",$$config^pcre(\"MATCH_LIMIT\"),!\n\tq\n\n; Example pattern with a very long run time\n;\nlongrun\n\tw $$match^pcre(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"(\\D+|<\\d+>)*[!?]\",.n),! zwr\n\tw \"should never be written, the %PCRE-E-MATCHLIMIT should be raised\",!\n\tq\n\n; Equal to the longrun^pcreexamples, but corrected pattern\n;\nshortrun\n\tw $$match^pcre(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"((?>\\D+)|<\\d+>)*[!?]\",.n),! zwr\n\tq\n\n; Enforced mlimit\n;\nenforcedlimit\n\tw $$match^pcre(\"aaaaaa\",\"(.)(.)\",.n,,,,2),! zwr\n\tw \"should never be written, the %PCRE-E-MATCHLIMIT should be raised\",!\n\tq\n\n\n\n; Exception Handling\n;\n; Error conditions are handled by setting the $zc to user codes, see labels at\n; the end of this file. When neither $zt nor $et are set by the user, the\n; default handler (trap^pcre) is used within $zt mechanism.\n;\n; The default handler will write out the details of the exception, and\n; depending on the caller type, it will re raise the exception. This will lead\n; to:\n; a) writing the exception details, when called from the GT.M prompt,\n; b) writing the exception details, the M code place when the pcre routine\n;    was called, and terminating the GT.M image.\n;\n; The user should define own exception handler using $zt or $et, see\n; pcreexamples.m for example exception handlers.\n;\n\n\n; Exception Handler Examples\n;\n\n; No handler\n;\nnohandler\n\ts ($ec,$et,$zt)=\"\"\n\ts x=$$compile^pcre(\"a)b\")\n\tw \"will never be written\",!\n\tq\n;\n; GTM>d nohandler^pcreexamples\n; %PCRE-E-COMPILE, Pattern compilation failed, unmatched parentheses in a <-- HERE\n; %PCRE-I-RTSLOC,          At M source location nohandler+2^pcreexamples\n; %GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap)\n; %GTM-I-RTSLOC,          At M source location trap+32^pcre\n; $ (GT.M image has been terminated)\n;\n\n\n; Simple handler\n;\nmyexception1\n\ts $zt=\"zg \"_$zl_\":mytrap1^pcreexamples\"\n\ts x=$$compile^pcre(\"a)b\")\n\tw \"will never be written\",!\n\tq\n\nmytrap1\n\tw \"it's a trap\",!\n\tw $ec,!\n\ts $ec=\"\"\n\tq\n;\n; GTM>d myexception1^pcreexamples\n; it's a trap\n; ,U16392,\n; GTM>\n;\n\n\n; Simple handler with pcre exception details\n;\nmyexception2\n\ts $zt=\"d trap^pcre(\"_$st_\") zg \"_$zl_\":mytrap2^pcreexamples\"\n\ts x=$$compile^pcre(\"a)b\")\n\tw \"will never be written\",!\n\tq\n\nmytrap2\n\tw \"it's a trap\",!\n\tw $ec,!\n\ts $ec=\"\"\n\tq\n;\n; GTM>d myexception2^pcreexamples\n; %PCRE-E-COMPILE, Pattern compilation failed, unmatched parentheses in a <-- HERE\n; %PCRE-I-RTSLOC,          At M source location myexception2+2^pcreexamples\n; it's a trap\n; ,U16392,\n; GTM>\n;\n; In this example the trap^pcre is called with optional argument (level\n; of M execution stack), for which trap^pcre will produce the\n; %PCRE-I-RTSLOC details.\n;\n; DETAILS:\n;\tThe trap^pcre is executed in the stack frame where the error condition\n;\toccurred, that gives the trap^pcre routine an access to the local\n;\tvariables like locale (locale name) or err (PCRE error message).\n;\tThe following zg command drops stack frames up to the current frame\n;\t(the frame where the s $zt=.. is used), and executes the mytrap label,\n;\twhere locale or err is not available.\n;\n\n\n; Simple handler with limited pcre exception details\n;\nmyexception3\n\ts $zt=\"zg \"_$zl_\":mytrap3^pcreexamples\"\n\ts x=$$compile^pcre(\"a)b\")\n\tw \"will never be written\",!\n\tq\n\nmytrap3\n\td trap^pcre($st)\n\tw \"it's a trap\",!\n\tw $ec,!\n\ts $ec=\"\"\n\tq\n;\n; GTM>d myexception3^pcreexamples\n; %PCRE-E-COMPILE, Pattern compilation failed, unknown reason\n; %PCRE-I-RTSLOC,          At M source location myexception3+2^pcreexamples\n; it's a trap\n; ,U16392,\n; GTM>\n;\n; DETAILS:\n;\tThe trap^pcre is executed in the stack frame where the compile^pcre\n;\twas called. The deeper stack frames has already\tbeen dropped by the\n;\tzg command, so the err local variable is not available in this\n;\tcontext. Thats why trap^pcre doesn't know the exact reason why the\n;\t%PCRE-E-COMPILE was raised.\n;\n\n\n; Note on $st() and repeated exceptions\n;\n;\tThe $st() function returns information connected with $ec codes\tin\n;\ta stack manner. That means that when once the $ec was set at n-th\n;\texecution level, any future exceptions at that level won't change\n;\tthe $st() output for that level unless $ec is cleared.\n;\n;\tAlways clear $ec when the exception handling is done.\n;\n\n\n; Execute all of the routines in this file\n;\nroutines\n\tw \">> test^pcreexamples\",!\n\td test^pcreexamples\n\n\tw !,\">> match^pcreexamples\",!\n\td match^pcreexamples\n\n\tw !,\">> global^pcreexamples\",!\n\td global^pcreexamples\n\n\tw !,\">> replace^pcreexamples\",!\n\td replace^pcreexamples\n\n\tw !,\">> p5global^pcreexamples\",!\n\td p5global^pcreexamples\n\n\tw !,\">> p5replace^pcreexamples\",!\n\td p5replace^pcreexamples\n\n\tw !,\">> p5lf^pcreexamples\",!\n\td p5lf^pcreexamples\n\n\tw !,\">> p5nl^pcreexamples\",!\n\td p5nl^pcreexamples\n\n\tw !,\">> version^pcreexamples\",!\n\td version^pcreexamples\n\n\tw !,\">> newline^pcreexamples\",!\n\td newline^pcreexamples\n\n\tw !,\">> utf8support^pcreexamples\",!\n\td utf8support^pcreexamples\n\n\tw !,\">> stackusage^pcreexamples\",!\n\td stackusage^pcreexamples\n\n\tw !,\">> nolocale^pcreexamples\",!\n\td nolocale^pcreexamples\n\n\tw !,\">> isolocale^pcreexamples\",!\n\td isolocale^pcreexamples\n\n\tw !,\">> utflocale^pcreexamples\",!\n\td utflocale^pcreexamples\n\n\tw !,\">> envlocale^pcreexamples\",!\n\td envlocale^pcreexamples\n\n\tw !,\">> limits^pcreexamples\",!\n\td limits^pcreexamples\n\n\tw !,\">> longrun^pcreexamples\",!\n\tw \"(skipped, uncomment to raise the exception)\",!\n\t; d longrun^pcreexamples\n\n\tw !,\">> shortrun^pcreexamples\",!\n\td shortrun^pcreexamples\n\n\tw !,\">> enforcedlimit^pcreexamples\",!\n\tw \"(skipped, uncomment to raise the exception)\",!\n\t; d enforcedlimit^pcreexamples\n\n\tw !,\">> nohandler^pcreexamples\",!\n\tw \"(skipped, uncomment to raise the exception)\",!\n\t; d nohandler^pcreexamples\n\n\tw !,\">> myexception1^pcreexamples\",!\n\td myexception1^pcreexamples\n\n\tw !,\">> myexception2^pcreexamples\",!\n\td myexception2^pcreexamples\n\n\tw !,\">> myexception3^pcreexamples\",!\n\td myexception3^pcreexamples\n\tq\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/postconditional.m",
    "content": " ;\n ; M code examples contrasting postconditionals with IF-commands\n ;\npost1 ; postconditional in set command\n set a=5\n set b=10\n set c=25\n I 0  ;purposely set $TEST to false\n write \"$TEST special variable (before post-condition)=\",$TEST\n set:(a<b) c=b\n write \"$TEST special variable (after post-condition) =\",$TEST \n write \"c =\",c,!\n quit\n ;\npost2 ; postconditional in write command\n set a=5\n set b=10\n I 0  ;purposely set $TEST to false\n write \"$TEST special variable (before post-condition)=\",$TEST\n write:(a<b) \"variable a=\",a,\" is smaller than b=\",b,!\n write \"$TEST special variable (after post-condition) =\",$TEST \n write:(a>b) \"variable a=\",a,\" is larger  than b=\",b,!\n write \"$TEST special variable (after post-condition) =\",$TEST \n quit\n ;\nif1 ; if command\n set a=5\n set b=10\n set c=25\n I 0  ;purposely set $TEST to false\n write \"$TEST special variable (before IF)=\",$TEST\n if (a<b) set c=b\n write \"$TEST special variable (after IF) =\",$TEST\n write c,!\n quit\n ;\nif2 ; postconditional in write command\n set a=5\n set b=10\n I 0  ;purposely set $TEST to false\n write \"$TEST special variable (before IF)=\",$TEST\n if (a<b) write \"variable a=\",a,\" is smaller than b=\",b,!\n write \"$TEST special variable (after IF) =\",$TEST \n if (a>b) write \"variable a=\",a,\" is larger  than b=\",b,!\n write \"$TEST special variable (after IF) =\",$TEST \n quit\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/primes.m",
    "content": "\t; part of Keith Lynch's .signature; it prints a table of primes,\n\t; including code to format it neatly into columns -- DPBS\n\t;    -- M Technology and MUMPS Language FAQ, Part 1/2\n\t;\n\n\tf p=2,3:2 s q=1 x \"f f=3:2 q:f*f>p!'q  s q=p#f\" w:q p,?$x\\8+1*8\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/url.m",
    "content": "\t;\n\t; This file is part of DataBallet.\n\t; Copyright (C) 2012 Laurent Parenteau <laurent.parenteau@gmail.com>\n\t;\n\t; DataBallet is free software: you can redistribute it and/or modify\n\t; it under the terms of the GNU Affero General Public License as published by\n\t; the Free Software Foundation, either version 3 of the License, or\n\t; (at your option) any later version.\n\t;\n\t; DataBallet is distributed in the hope that it will be useful,\n\t; but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t; GNU Affero General Public License for more details.\n\t;\n\t; You should have received a copy of the GNU Affero General Public License\n\t; along with DataBallet. If not, see <http://www.gnu.org/licenses/>.\n\t;\n\ndecode(val)\n\t;\n\t; Decoded a URL Encoded string\n\t;\n\tnew decoded,c,i\n\n\tset decoded=\"\"\n\tfor i=1:1:$zlength(val) do\n\t.\tset c=$zextract(val,i,i)\n\t.\tif c=\"+\" set decoded=decoded_\" \"\n\t.\telse  if c'=\"%\" set decoded=decoded_c\n\t.\telse  set decoded=decoded_$zchar($$FUNC^%HD($zextract(val,i+1,i+2))) set i=i+2\n\tquit decoded\n\nencode(val)\n\t;\n\t; Encoded a string for URL usage\n\t;\n\tnew encoded,c,i\n\tset encoded=\"\"\n\n\t; Populate safe char only the first time\n\tif '$data(safechar) for i=45,46,95,126,48:1:57,65:1:90,97:1:122 set safechar($zchar(i))=\"\"\n\n\tfor i=1:1:$zlength(val) do\n\t.\tset c=$zextract(val,i,i)\n\t.\tif $data(safechar(c)) set encoded=encoded_c\n\t.\telse  if c=\" \" set encoded=encoded_\"+\"\n\t.\telse  set encoded=encoded_\"%\"_$$FUNC^%DH($zascii(c),2)\n\n\tquit encoded\n"
  },
  {
    "path": "src/test/resources/samples/langs/M/zmwire.m",
    "content": "zmwire ; M/Wire Protocol for M Systems (eg GT.M, Cache)\n ;\n ; ----------------------------------------------------------------------------\n ; | M/Wire                                                                   |\n ; | Copyright (c) 2004-11 M/Gateway Developments Ltd,                        |\n ; | Reigate, Surrey UK.                                                      |\n ; | All rights reserved.                                                     |\n ; |                                                                          |\n ; | http://www.mgateway.com                                                  |\n ; | Email: rtweed@mgateway.com                                               |\n ; |                                                                          |\n ; | This program is free software: you can redistribute it and/or modify     |\n ; | it under the terms of the GNU Affero General Public License as           |\n ; | published by the Free Software Foundation, either version 3 of the       |\n ; | License, or (at your option) any later version.                          |\n ; |                                                                          |\n ; | This program is distributed in the hope that it will be useful,          |\n ; | but WITHOUT ANY WARRANTY; without even the implied warranty of           |\n ; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            |\n ; | GNU Affero General Public License for more details.                      |\n ; |                                                                          |\n ; | You should have received a copy of the GNU Affero General Public License |\n ; | along with this program.  If not, see <http://www.gnu.org/licenses/>.    |\n ; ----------------------------------------------------------------------------\n ;\n QUIT\n ;\n ; By default this server code runs on port 6330\n ;\n ; For GT.M systems it is invoked via xinetd:\n ;   Edit /etc/services and add the line:\n ; \n ;    mwire  6330/tcp  # Service for M/Wire Protocol\n ;\n ;   Copy the file mwire to /etc/xinetd.d/mwire\n ;   Copy the file zmwire to /usr/local/gtm/zmwire and change \n ;    its permissions to executable (eg 755)\n ;\n ;   These files may be edited to change the paths or port number\n ;   Restart xinetd using: sudo /etc/init.d/xinetd restart\n ;\n ;   On GT.M systems you must also have installed MGWSI or m_apache\n ;     in order to provide the MD5 hashing function for passwords\n ;     Alternatively substitute the MD5 callout to the MD5 function of your choice\n ;\n ; For Cache systems, it is invoked via the M/Wire Daemon routine\n ;   which should be running as a jobbed process:\n ;\n ;     job start^zmwireDaemon\n ;\n ;   You can change the port number by simply editing the line\n ; \n ;      port+1^zmwireDaemon\n ;\n ;    Stop the Daemon process using ^RESJOB and restart it.\n ;\nmwireVersion\n ;;Build 22\n ;\nmwireDate\n ;;06 July 2011\n ;\nversion\n ;\n s output=\"+M/Wire \"_$p($t(mwireVersion+1),\";;\",2,2000)_crlf\n w output\n QUIT\n ;\nbuild\n ;\n n crlf,response\n ;\n s crlf=$c(13,10)\n s response=\"*3\"_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"build: \"_response_\" sent\")\n ;\n s response=$p($t(mwireVersion+1),\";;\",2,2000)\n s response=\"$\"_$l(response)_crlf_response_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"build: \"_response_\" sent\")\n ;\n s response=$p($t(mwireDate+1),\";;\",2,2000)\n s response=\"$\"_$l(response)_crlf_response_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"build: \"_response_\" sent\")\n ;\n s response=$zv\n s response=\"$\"_$l(response)_crlf_response_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"build: \"_response_\" sent\")\n QUIT\n ;\ncommand ;\n n authNeeded,c,crlf,input,output\n ;\n d cleardown\n i $zv[\"GT.M\" s $zint=\"d monitoroutput\"\n s ^zmwire(\"connected\",$j)=\"\"\n l +^zmwire(\"connected\",$j)\n s crlf=$c(13,10)\n s authNeeded=0\n s role=\"user\"\n i $d(^zmwire(\"auth\")) s authNeeded=1\nloop\n i $g(^zmwire(\"relink\"))=1,'$d(^zmwire(\"relink\",\"process\",$j)) s ok=$$relinkRoutines()\n r *c\n i $c(c)=\"*\" d\n . s input=$$multiBulkRequest()\n . i $g(^zewd(\"trace\"))=1 d trace($j_\": \"_$h_\": mwire input: \"_input)\n e  d\n . r input s input=$c(c)_input \n . i $g(^zewd(\"trace\"))=1 d trace($h_\": mwire input: \"_input)\n . i input'=\"\" d\n . . i $zv[\"GT.M\" s input=$e(input,1,$l(input)-2)\n . . i $zv[\"Cache\" s input=$e(input,1,$l(input)-1)\n ;i input=\"PING\" w \"+PONG\"_crlf g loop\n i input=\"PING\" s output=\"+PONG\"_crlf w output g loop\n i $d(^zmwire(\"monitor\",\"listener\")) d log(input)\n i input=\"\" g loop\n i input=\"EXIT\" g halt\n i input=\"QUIT\" g quit\n i input=\"HALT\" g halt\n ;\n i authNeeded,$e(input,1,4)'=\"AUTH\" s output=\"-Authentication required\"_crlf w output g loop\n i 'authNeeded,$e(input,1,4)=\"AUTH\" s output=\"-Authentication ignored\"_crlf w output g loop\n i $e(input,1,5)=\"AUTH \" d auth($e(input,6,$l(input))) g loop\n i 'authNeeded!(role=\"admin\"),$e(input,1,12)=\"SETPASSWORD \" d setpassword($e(input,13,$l(input))) g loop\n ;\n s input=$$utfConvert(input)\n i $e(input,1,4)=\"SET \" d set($e(input,5,$l(input))) g loop\n i $e(input,1,10)=\"GETGLOBAL \" d getGlobal($e(input,11,$l(input))) g loop\n i $e(input,1,14)=\"GETJSONSTRING \" d getJSON($e(input,15,$l(input))) g loop\n i $e(input,1,14)=\"SETJSONSTRING \" d setJSON($e(input,15,$l(input))) g loop\n i $e(input,1,15)=\"RUNTRANSACTION \" d runTransaction($e(input,16,$l(input))) g loop\n i $e(input,1,4)=\"GET \" d get($e(input,5,$l(input))) g loop\n i $e(input,1,7)=\"INCRBY \" d incrby($e(input,8,$l(input))) g loop\n i $e(input,1,7)=\"DECRBY \" d decrby($e(input,8,$l(input))) g loop\n i $e(input,1,14)=\"NEXTSUBSCRIPT \" d nextSubscript($e(input,15,$l(input)),1) g loop\n i $e(input,1,18)=\"PREVIOUSSUBSCRIPT \" d nextSubscript($e(input,19,$l(input)),-1) g loop\n i $e(input,1,5)=\"KILL \" d kill($e(input,6,$l(input))) g loop\n i $e(input,1,4)=\"DEL \" d kill($e(input,5,$l(input))) g loop\n i $e(input,1,5)=\"DATA \" d data($e(input,6,$l(input))) g loop\n i $e(input,1,7)=\"EXISTS \" d data($e(input,8,$l(input))) g loop\n i $e(input,1,5)=\"INCR \" d incr($e(input,6,$l(input))) g loop\n i $e(input,1,5)=\"DECR \" d decr($e(input,6,$l(input))) g loop\n i $e(input,1,11)=\"COPYGLOBAL \" d copy($e(input,12,$l(input))) g loop\n i $e(input,1,5)=\"LOCK \" d lock($e(input,6,$l(input))) g loop\n i $e(input,1,7)=\"UNLOCK \" d unlock($e(input,8,$l(input))) g loop\n i $e(input,1,6)=\"ORDER \" d order($e(input,7,$l(input))) g loop\n i $e(input,1,5)=\"NEXT \" d order($e(input,6,$l(input))) g loop\n i $e(input,1,9)=\"ORDERALL \" d orderall($e(input,10,$l(input))) g loop\n i $e(input,1,11)=\"GETGLOBALS2\" d getGlobals() g loop\n i $e(input,1,10)=\"GETGLOBALS\" d getGlobalList() g loop\n i $e(input,1,9)=\"MULTIGET \" d multiGet($e(input,10,$l(input))) g loop\n i $e(input,1,11)=\"GETALLSUBS \" d orderall($e(input,12,$l(input))) g loop\n i $e(input,1,14)=\"GETSUBSCRIPTS \" d getAllSubscripts($e(input,15,$l(input))) g loop\n i $e(input,1,9)=\"REVORDER \" d reverseorder($e(input,10,$l(input))) g loop\n i $e(input,1,9)=\"PREVIOUS \" d reverseorder($e(input,10,$l(input))) g loop\n i $e(input,1,6)=\"QUERY \" d query($e(input,7,$l(input))) g loop\n i $e(input,1,9)=\"QUERYGET \" d queryget($e(input,10,$l(input))) g loop\n i $e(input,1,10)=\"MERGEFROM \" d mergefrom($e(input,11,$l(input))) g loop\n i $e(input,1,11)=\"GETSUBTREE \" d mergefrom($e(input,12,$l(input))) g loop\n i $e(input,1,8)=\"MERGETO \" d mergeto($e(input,9,$l(input))) g loop\n i $e(input,1,11)=\"SETSUBTREE \" d mergeto($e(input,12,$l(input))) g loop\n i $e(input,1,9)=\"FUNCTION \" d function($e(input,10,$l(input))) g loop\n i $e(input,1,8)=\"EXECUTE \" d function($e(input,9,$l(input))) g loop\n i $e(input,1,6)=\"TSTART\" d tstart g loop\n i $e(input,1,7)=\"TCOMMIT\" d tcommit g loop\n i $e(input,1,9)=\"TROLLBACK\" d trollback g loop\n i $e(input,1,5)=\"MDATE\" d mdate g loop\n i $e(input,1,9)=\"PROCESSID\" d processid g loop\n i $e(input,1,7)=\"VERSION\" d version g loop\n i $e(input,1,8)=\"GETBUILD\" d build g loop\n i $e(input,1,8)=\"MVERSION\" d zv g loop\n i $e(input,1,4)=\"INFO\" d info g loop\n i $e(input,1,7)=\"MONITOR\" d monitor g loop\n s output=\"-\"_input_\" not recognized\"_crlf w output\n g loop\n ;\nmultiBulkRequest()\n ;\n n buff,c,i,input,j,len,noOfCommands,param,space\n ;\n s noOfCommands=\"\"\n f  d  q:c=13\n . r *c q:c=13\n . ;d trace(\"0: \"_$c(c))\n . s noOfCommands=noOfCommands_$c(c)\n r *x\n ;d trace(\"1: \"_$c(x))\n ;\n f i=1:1:noOfCommands d\n . ;d trace(\"i=\"_i)\n . s len=\"\"\n . f  d  q:c=13\n . . r *c\n . . ;d trace(\"2: \"_$c(c))\n . . i $c(c)=\"$\",len=\"\" q\n . . q:c=13\n . . s len=len_$c(c)\n . r *c\n . ;d trace(\"3: \"_$c(c))\n . s input=\"\"\n . i len=0 d\n . . s param(i)=\"\"\n . . r *c\n . . ;d trace(\"4: \"_$c(c))\n . e  d\n . . r input#len\n . . ;d trace(\"input=\"_input)\n . . s param(i)=input\n . . ;d trace(\"param \"_i_\" = \"_input)\n . . r *c,*c\n ;\n s param(1)=$zconvert(param(1),\"U\")\n ;QUIT \"PING\"\n i param(1)=\"PING\" QUIT param(1)\n ;s no=$increment(^rob) m ^rob(no)=param\n i param(1)=\"SET\" QUIT param(1)_\" \"_param(2)_\" \"_$l(param(3))_crlf_param(3)\n i param(1)=\"SETJSONSTRING\" QUIT param(1)_\" \"_param(2)_crlf_param(3)_crlf_param(4)\n i param(1)=\"COPYGLOBAL\"!(param(1)=\"GETSUBSCRIPTS\") d  QUIT input\n . s space=\"\",input=\"\"\n . f i=1:1:noOfCommands d\n . . s input=input_space_param(i)\n . . i space=\"\" s space=\" \" q\n . . i space=\" \" s space=$c(1)\n i param(1)=\"EXECUTE\" d  QUIT input\n . ;d trace(\"Execute: param(3)=\"_param(3))\n . s param(3)=$$replaceAll(param(3),\"\\\"\"\",\"\"\"\"\"\")\n . i $e(param(3),1)=\"[\" s input=param(1)_\" \"_param(2)_\"(\"_$e(param(3),2,$l(param(3))-1)_\")\" q\n . s input=param(1)_\" \"_param(2)\n ;\n s space=\"\",input=\"\"\n f i=1:1:noOfCommands d\n . s input=input_space_param(i)\n . s space=\" \" \n ;\n QUIT input\n ;\nhalt\n k ^zmwire(\"connected\",$j)\n HALT\n ;\nquit\n ;\n i '$d(^zmwire(\"monitor\",\"listener\",$j)) g halt\n k ^zmwire(\"monitor\",\"listener\",$j)\n g loop\n ;\ncleardown\n ;\n n ignore,pid\n ;\n s pid=\"\"\n f  s pid=$o(^zmwire(\"connected\",pid)) q:pid=\"\"  d\n . i pid=$j q\n . s ignore=1\n . l +^zmwire(\"connected\",pid):0 e  s ignore=0\n . i ignore d\n . . l -^zmwire(\"connected\",pid)\n . . k ^zmwire(\"connected\",pid)\n . . k ^zmwire(\"monitor\",\"listener\",pid)\n . . k ^zmwire(\"monitor\",\"output\",pid)\n s pid=\"\"\n f  s pid=$o(^zmwire(\"monitor\",\"output\",pid)) q:pid=\"\"  d\n . i pid=$j q\n . s ignore=1\n . l +^zmwire(\"connected\",pid):0 e  s ignore=0\n . l -^zmwire(\"connected\",pid)\n . i ignore d\n . . k ^zmwire(\"monitor\",\"output\",pid)\n QUIT\n ;\nmonitor\n ;\n i $zv'[\"GT.M\" w \"-Command unavailable\"_crlf QUIT\n n quit\n ;\n s ^zmwire(\"monitor\",\"listener\",$j)=\"\"\n s output=\"+OK\"_crlf w output\n f  h 1 r quit:0  i $e(quit,1,4)=\"QUIT\" q\n k ^zmwire(\"monitor\",\"listener\",$j)\n s output=\"+OK\"_crlf w output\n QUIT\n ;\nlog(input)\n ;\n i $zv'[\"GT.M\" QUIT\n ;\n QUIT:'$d(^zmwire(\"monitor\",\"listener\"))\n ;\n n dev,inputr,io,lineNo,pid\n ;\n i input[\"AUTH\" QUIT\n i input[\"QUIT\" QUIT\n i input[\"EXIT\" QUIT\n i input[\"HALT\" QUIT\n s inputr=$re(input)\n i $e(inputr,1,2)'=$c(10,13) s input=input_crlf\n s pid=\"\"\n f  s pid=$o(^zmwire(\"monitor\",\"listener\",pid)) q:pid=\"\"  d\n . i pid=$j q\n . s lineNo=$o(^zmwire(\"monitor\",\"output\",pid,\"\"),-1)+1\n . s ^zmwire(\"monitor\",\"output\",pid,lineNo)=input\n . ;zsy \"mupip intrpt \"_pid_\" >/dev/null\"\n . zsy \"kill -USR1 \"_pid\n ;\n QUIT\n ;\nmonitoroutput\n ;\n n lineNo\n ;\n s lineNo=\"\"\n f  s lineNo=$o(^zmwire(\"monitor\",\"output\",$j,lineNo)) q:lineNo=\"\"  d\n . w ^zmwire(\"monitor\",\"output\",$j,lineNo)\n . k ^zmwire(\"monitor\",\"output\",$j,lineNo)\n QUIT\n ;\nlogger(command,initialise)\n ;\n n tot,count\n ;\n i $g(initialise) k ^mwireLogger\n s tot=$increment(^mwireLogger)\n s count=$increment(^mwireLogger(command))\n ;\n QUIT\n ;\ninfo\n ;\n n count,ignore,pid,response\n ;\n s response=\"m_wire_version:\"_$p($t(mwireVersion+1),\";;\",2,2000)_crlf\n s pid=\"\",count=0\n f  s pid=$o(^zmwire(\"connected\",pid)) q:pid=\"\"  d\n . s ignore=1\n . i pid=$j d\n . . s ignore=0\n . e  d\n . . l +^zmwire(\"connected\",pid):0 e  s ignore=0\n . i ignore d\n . . l -^zmwire(\"connected\",pid)\n . . k ^zmwire(\"connected\",pid)\n . . k ^zmwire(\"monitor\",\"listener\",pid)\n . e  d\n . . s count=count+1\n s response=response_\"connected_clients:\"_count ;_crlf\n s output=\"$\"_$l(response)_crlf_response_crlf\n w output\n QUIT\n ;\nauth(input)\n ;\n n pass\n s pass=$$MD5(input)\n i $d(^zmwire(\"auth\",pass)) d\n . s authNeeded=0\n . s role=^zmwire(\"auth\",pass)\n . s output=\"+OK\"_crlf\n . w output\n e  d\n . s output=\"-Invalid password\"_crlf\n . w output\n QUIT\n ;\nsetpassword(input)\n ;\n ; SETPASSWORD secret\n ; +OK <set as role=user>\n ;\n ; SETPASSWORD secret admin\n ; +OK\n ;\n n pass,newrole\n ;\n i $d(^zmwire(\"auth\")),role'=\"admin\" s output=\"-Invalid command\"_crlf w output QUIT\n i $$stripSpaces(input)=\"\" s output=\"-Invalid command\"_crlf w output QUIT\n s newrole=\"user\"\n i input[\" \" d\n . s newrole=$p(input,\" \",2)\n . s input=$p(input,\" \",1)\n i '$d(^zmwire(\"auth\")) s newrole=\"admin\"\n i newrole'=\"user\",newrole'=\"admin\" s output=\"-Invalid role\"_crlf w output QUIT\n ;\n s pass=$$MD5(input)\n s ^zmwire(\"auth\",pass)=newrole\n s output=\"+OK\"_crlf\n w output\n QUIT\n ;\ngetGloRef(input)\n ;\n n gloName,gloRef,nb,subs\n ;\n s gloRef=input\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n i subs=\"\" QUIT gloName\n QUIT gloName_\"(\"_subs_\")\"\n ;\nset(input)\n ;\n n c123,data,gloName,gloRef,i,inputr,json,len,nb,nsp,ok,quot,subs,x\n ;\n ; SET myglobal[\"1\",\"xx yy\",3] 5\n ; hello\n ; +OK\n ; SET myGlo 5\n ; hello\n ; +OK\n ;\n ;n n\n ;s n=$increment(^rob(\"set\"))\n ;s ^rob(\"set\",n)=input\n i input[crlf d\n . s data=$p(input,crlf,2,$l(input))\n . s input=$p(input,crlf,1)\n s nsp=$l(input,\" \")\n s len=$p(input,\" \",nsp)\n i len'=0,+len=0 s output=\"-Data length was not specified\"_crlf w output QUIT\n s gloRef=$p(input,\" \",1,nsp-1)\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n ; Process Javascript escaping\n i subs'=\"\" s subs=subs_\")\"\n s quot=\"\"\"\"\n i subs'=\"\" f i=1:1:$l(subs)-2 d\n . s c123=$e(subs,i,i+2)\n . i $e(c123,1)'=\"\\\" q\n . i $e(c123,2)=\"\\\" q\n . i $e(c123,2)=quot d  q\n . . i $e(c123,3)=\",\" q\n . . i $e(c123,3)=\")\" q\n . . s subs=$e(subs,1,i-1)_quot_quot_$e(subs,i+2,$l(subs))\n i subs[\"\\\\\" d\n . s subs=$$replaceAll(subs,\"\\\\\",$c(5))\n . s subs=$$replaceAll(subs,$c(5),\"\\\")\n s gloRef=gloName\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs\n i '$d(data)  d\n . s data=$$readChars(len)\n . r ok \n . i $d(^zmwire(\"monitor\",\"listener\")) d log(data)\n i data[\"\"\"\" s data=$$replaceAll(data,\"\"\"\",\"\"\"\"\"\")\n i data=\"zmwire_null_value\" s data=\"\"\n s x=\"s \"_gloRef_\"=\"\"\"_data_\"\"\"\"\n i $g(^zewd(\"trace\"))=1 d trace(\"SET x = \"_x)\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s json=\"{\"\"ok\"\":true}\"\n s output=\"$\"_$l(json)_crlf_json_crlf\n w output\n i $g(^zewd(\"trace\"))=1 d trace(\"set: ok:true sent\")\n i $g(^mwire(\"logger\"))=1 d logger(\"set\")\n QUIT\n ;\ngetGlobalList()\n ;\n n arrString,comma,count,glo,gloRef,list,response,x\n ;\n i $zv[\"GT.M\" d\n . s x=\"^%\"\n . i $d(@x) s list(x)=\"\"\n . f  s x=$order(@x) q:x=\"\"  s list(x)=\"\"\n . ;\n e  d\n . d getGlobalList^MDBMCache(.list)\n ;\n ;s count=0,glo=\"\"\n ;f  s glo=$o(list(glo)) q:glo=\"\"  s count=count+1\n ;s response=\"*\"_count_crlf\n ;w response\n ;i $g(^zewd(\"trace\"))=1 d trace(\"getGlobalList: \"_response_\" sent\") \n ;s glo=\"\"\n ;f  s glo=$o(list(glo)) q:glo=\"\"  d\n ;. s gloRef=$e(glo,2,$l(glo))\n ;. s response=\"$\"_$l(gloRef)_crlf_gloRef_crlf\n ;. w response\n ;. i $g(^zewd(\"trace\"))=1 d trace(\"getGlobalList: \"_response_\" sent\") \n s arrString=\"[\"\n s glo=\"\",comma=\"\"\n f  s glo=$o(list(glo)) q:glo=\"\"  d\n . s gloRef=$e(glo,2,$l(glo))\n . s arrString=arrString_comma_\"\"\"\"_gloRef_\"\"\"\"\n . s comma=\",\"\n s arrString=arrString_\"]\"\n s response=\"$\"_$l(arrString)_crlf_arrString_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"getGlobalList: \"_response_\" sent\")  ;\n QUIT\n ;\ngetGlobals()\n ;\n n arrString,comma,count,glo,gloRef,list,response,x\n ;\n i $zv[\"GT.M\" d\n . s x=\"^%\"\n . i $d(@x) s list(x)=\"\"\n . f  s x=$order(@x) q:x=\"\"  s list(x)=\"\"\n . ;\n e  d\n . d getGlobalList^MDBMCache(.list)\n ;\n s count=0,glo=\"\"\n f  s glo=$o(list(glo)) q:glo=\"\"  s count=count+1\n s response=\"*\"_count_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"getGlobalList: \"_response_\" sent\") \n s glo=\"\"\n f  s glo=$o(list(glo)) q:glo=\"\"  d\n . s gloRef=$e(glo,2,$l(glo))\n . s response=\"$\"_$l(gloRef)_crlf_gloRef_crlf\n . w response\n . i $g(^zewd(\"trace\"))=1 d trace(\"getGlobalList: \"_response_\" sent\") \n QUIT\n ;\nget(input)\n ;\n n data,exists,gloRef,response,x\n ;\n ; GET myglobal[\"1\",\"xx yy\",3]\n ; $6\n ; foobar\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s exists=$d(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n i exists'=1,exists'=11 s output=\"$-1\"_crlf w output QUIT\n s x=\"s data=\"_gloRef\n s $zt=$$zt()\n x x\n s $zt=\"\"\n ;\n s response=\"$\"_$l(data)_crlf_data_crlf\n ;\n w response\n i $g(^mwire(\"logger\"))=1 d logger(\"get\")\n QUIT\n ;\ngetGlobal(input)\n ;\n n data,exists,gloRef,json,response,x\n ;\n ; GET myglobal[\"1\",\"xx yy\",3]\n ; $6\n ; foobar\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s exists=$d(\"_gloRef_\"),\"\n ;x x\n s x=x_\"data=$g(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s json=\"{\"\"value\"\":\"\"\"_data_\"\"\",\"\"dataStatus\"\":\"_exists_\"}\"\n ;\n s response=\"$\"_$l(json)_crlf_json_crlf\n ;\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"getGlobal: response=\"_response)\n i $g(^mwire(\"logger\"))=1 d logger(\"getGlobal\")\n QUIT\n ;\nmultiGet(input)\n ;\n n comma,dataStatus,error,exists,globalName,i,json,props,ref,response,subs,value\n ;\n ; MULTIGET myglobal[\n ;  {globalName:'xxx', subscripts:[\"x1\",\"y1\"]},\n ;  {globalName:'xxx', subscripts:[\"x2\",\"\"]},\n ;  {globalName:'xxx', subscripts:[\"x2\",\"y2\"]}\n ;]\n ;\n ;\n s error=$$parseJSON(input,.props,1)\n i error'=\"\" s output=\"-\"_error_crlf w output QUIT\n ;\n s stop=0,error=\"\",json=\"[\",comma=\"\"\n f i=1:1 q:'$d(props(i))  d\n . s dataStatus=0,value=\"\",error=\"\"\n . s globalName=$g(props(i,\"globalName\"))\n . i globalName=\"\" s globalName=$g(props(i,\"GlobalName\"))\n . i globalName=\"\" d\n . . s error=\"globalName not defined\"\n . e  d\n . . i $e(globalName,1)'=\"^\" s globalName=\"^\"_globalName\n . . s ref=\"s exists=$d(\"_globalName\n . . s subs=\"\"\n . . i $d(props(i,\"subscripts\")) d\n . . . n comma,j,stop,sub\n . . . s subs=\"(\",comma=\"\",stop=0\n . . . f j=1:1 q:'$d(props(i,\"subscripts\",j))  d  q:stop\n . . . . s sub=props(i,\"subscripts\",j)\n . . . . i sub=\"\" s error=\"Subscript \"_j_\" is null\",stop=1 q\n . . . . s subs=subs_comma_\"\"\"\"_props(i,\"subscripts\",j)_\"\"\"\",comma=\",\"\n . . . i error=\"\" s subs=subs_\")\"\n . . i error=\"\" d\n . . . s ref=ref_subs_\")\"\n . . . s $zt=$$zt()\n . . . x ref\n . . . s $zt=\"\"\n . . . i exists d\n . . . . s ref=\"s value=$g(\"_globalName\n . . . . s ref=ref_subs_\")\"\n . . . . s $zt=$$zt()\n . . . . x ref\n . . . . s $zt=\"\"\n . s json=json_comma_\"{\"\"value\"\":\"\"\"_value_\"\"\",\"\"dataStatus\"\":\"_exists_\",\"\"error\"\":\"\"\"_error_\"\"\"}\"\n . s comma=\",\"\n s json=json_\"]\"\n ;\n s response=\"$\"_$l(json)_crlf_json_crlf\n ;\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"multiGet: response=\"_response)\n QUIT\n ;\nkill(input)\n ;\n n i,glo,gloRef,len,nsp,p1,p2,x\n ;\n ; KILL myglobal[\"1\",\"xx yy\",3]\n ; +OK\n ;\n s glo=input\n s p1=$p(glo,\"[\",1)\n s p2=$p(glo,\"[\",2,2000)\n s p2=$e(p2,1,$l(p2)-1)\n s glo=p1_\"(\"_p2_\")\"\n i glo[\"()\" d\n . s len=$l(glo)\n . i $e(glo,len-1,len)=\"()\" s glo=$e(glo,1,len-2)\n e  d\n . ; Process Javascript escaping\n . n c123,quot\n . s quot=\"\"\"\"\n . f i=1:1:$l(glo)-2 d\n . . s c123=$e(glo,i,i+2)\n . . i $e(c123,1)'=\"\\\" q\n . . i $e(c123,2)=\"\\\" q\n . . i $e(c123,2)=quot d  q\n . . . i $e(c123,3)=\",\" q\n . . . i $e(c123,3)=\")\" q\n . . . s glo=$e(glo,1,i-1)_quot_quot_$e(glo,i+2,$l(glo))\n . i glo[\"\\\\\" d\n . . s glo=$$replaceAll(glo,\"\\\\\",$c(5))\n . . s glo=$$replaceAll(glo,$c(5),\"\\\")\n ;\n i glo'[\"zmwire\" s glo(glo)=\"\"\n\n s x=\"k ^\"_glo\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s response=\"+ok\"_crlf\n i $g(^%zewd(\"trace\"))=1 d trace(\"kill: response=\"_response)\n w response\n i $g(^mwire(\"logger\"))=1 d logger(\"kill\")\n QUIT\n ;\ndata(input)\n ;\n n data,gloRef,x\n ;\n ; DATA myglobal[\"1\",\"xx yy\",3]\n ; :10\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$d(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n i $g(^zewd(\"trace\"))=1 d trace(\"input=\"_input_\"; data=\"_data)\n s output=\":\"_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"data\")\n QUIT\n ;\nrunTransaction(input)\n ;\n n error,globalName,i,json,props,ref,result,stop,subscripts\n ;\n s error=$$parseJSON(input,.props,1)\n i error'=\"\" s output=\"-\"_error_crlf w output QUIT\n ;\n s stop=0,error=\"\"\n f i=1:1 q:'$d(props(i))  d  q:stop\n . s method=$g(props(i,\"method\"))\n . i method=\"\" s stop=1,error=\"Missing method in JSON transaction document at step \"_i q\n . i method=\"setJSON\" d  q:stop\n . . n json\n . . m json=props(i,\"json\")\n . . i '$d(json) s stop=1,error=\"Missing JSON document in JSON transaction document at step \"_i q\n . . s globalName=$g(props(i,\"globalName\"))\n . . i globalName=\"\" s globalName=$g(props(i,\"GlobalName\"))\n . . i globalName=\"\" s stop=1,error=\"Missing Global name in JSON transaction document at step \"_i q\n . . i $e(globalName,1)'=\"^\" s globalName=\"^\"_globalName\n . . s ref=\"m \"_globalName\n . . i $d(props(i,\"subscripts\")) d\n . . . n comma,j\n . . . s ref=ref_\"(\",comma=\"\"\n . . . f j=1:1 q:'$d(props(i,\"subscripts\",j))  d\n . . . . s ref=ref_comma_\"\"\"\"_props(i,\"subscripts\",j)_\"\"\"\",comma=\",\"\n . . . s ref=ref_\")\"\n . . s ref=ref_\"=json\"\n . . x ref\n . i method=\"setGlobal\" d  q:stop\n . . n value\n . . s globalName=$g(props(i,\"globalName\"))\n . . i globalName=\"\" s globalName=$g(props(i,\"GlobalName\"))\n . . i globalName=\"\" s stop=1,error=\"Missing Global name in JSON transaction document at step \"_i q\n . . i $e(globalName,1)'=\"^\" s globalName=\"^\"_globalName\n . . s ref=\"s \"_globalName\n . . i $d(props(i,\"subscripts\")) d\n . . . n comma,j\n . . . s ref=ref_\"(\",comma=\"\"\n . . . f j=1:1 q:'$d(props(i,\"subscripts\",j))  d\n . . . . s ref=ref_comma_\"\"\"\"_props(i,\"subscripts\",j)_\"\"\"\",comma=\",\"\n . . . s value=$g(props(i,\"value\"))\n . . . i value=\"zmwire_null_value\" s value=\"\"\n . . . s ref=ref_\")=\"\"\"_value_\"\"\"\"\n . . x ref\n . i method=\"kill\" d  q:stop\n . . s globalName=$g(props(i,\"globalName\"))\n . . i globalName=\"\" s globalName=$g(props(i,\"GlobalName\"))\n . . i globalName=\"\" s stop=1,error=\"Missing Global name in JSON transaction document at step \"_i q\n . . i $e(globalName,1)'=\"^\" s globalName=\"^\"_globalName\n . . s ref=\"k \"_globalName\n . . i $d(props(i,\"subscripts\")) d\n . . . n comma,j\n . . . s ref=ref_\"(\",comma=\"\"\n . . . f j=1:1 q:'$d(props(i,\"subscripts\",j))  d\n . . . . s ref=ref_comma_\"\"\"\"_props(i,\"subscripts\",j)_\"\"\"\",comma=\",\"\n . . . s ref=ref_\")\"\n . . x ref\n ;\n i error'=\"\" s output=\"-\"_error_crlf w output QUIT\n s response=\"+ok\"_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"transaction: response=\"_response)\n QUIT\n ;\nsetJSON(input)\n ;\n n arr,del,error,flrc,inputr,gloRef,inputr,json,nb,nsp,props,ref,response,subs\n ;\n ; SETJSONSTRING myglobal[\"1\",\"xx yy\",3] CRLF {\"a\":123} CRLF 1\n ; +ok\n ;\n s flrc=$c(10,13)\n s gloRef=$p(input,crlf,1)\n s input=$p(input,crlf,2,10000)\n s inputr=$re(input)\n s del=$p(inputr,flrc,1),del=$re(del)\n s inputr=$p(inputr,flrc,2,10000) ; in case it contains crlfs\n s json=$re(inputr)\n i $zv[\"GT.M\" d\n . s json=$$unEscape(json)\n e  d\n . s json=$$unEscape^MDBMCache(json)\n ;\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n s gloRef=gloName\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs_\")\"\n s error=$$parseJSON(json,.props,1)\n i error'=\"\" s output=\"-Invalid JSON in setJSON: \"_json_crlf w output QUIT\n ;\n s ref=\"\"\n i del s ref=\"k \"_gloRef_\" \"\n ;\n s ref=ref_\"m \"_gloRef_\"=props\"\n x ref\n s response=\"+OK\"_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"setJSON: response=\"_response)\n i $g(^mwire(\"logger\"))=1 d logger(\"setJSON\")\n ;\n QUIT\n ;\ngetJSON(input)\n ;\n n arr,inputr,gloRef,json,nb,nsp,ref,response,subs\n ;\n ; GETJSONSTRING myglobal[\"1\",\"xx yy\",3]\n ; $5\n ; {x:1}\n ;\n s gloRef=input\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n s gloRef=gloName\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs_\")\"\n s ref=\"m arr=\"_gloRef\n x ref\n i '$d(arr) d\n . s response=\"$-1\"_crlf\n e  d\n . s json=$$arrayToJSON(\"arr\")\n . s response=\"$\"_$l(json)_crlf_json_crlf\n i $g(^zewd(\"trace\"))=1 d trace(\"getJSON: response=\"_response)\n ;\n w response\n ;\n i $g(^mwire(\"logger\"))=1 d logger(\"getJSON\")\n QUIT\n ;\nincr(input)\n ;\n n data,gloRef,x\n ;\n ; INCR myglobal[\"1\",\"xx yy\",3]\n ; :4\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$increment(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s output=\":\"_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"incr\")\n QUIT\n ;\nincrby(input)\n ;\n n by,data,gloName,gloRef,inputr,len,nb,nsp,ok,subs,x\n ;\n ; INCRBY myglobal[\"1\",\"xx yy\",3] 3\n ; :7\n ;\n s inputr=$re(input)\n s by=$re($p(inputr,\" \",1))\n s nsp=$l(input,\" \")+2\n s gloRef=$p(inputr,\" \",2,nsp)\n s gloRef=$re(gloRef)\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n s gloRef=gloName\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs_\")\"\n s x=\"s data=$increment(\"_gloRef_\",\"_by_\")\"\n s $zt=$$zt() x x\n s $zt=\"\"\n s output=\":\"_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"incrbr\")\n QUIT\n ;\nfunction(input)\n ;\n n data,func,x\n ;\n ; FUNCTION label^rou(\"1\",\"xx yy\")\n ; $5\n ; hello\n ;\n s func=input\n i func[\"^\",$e(func,1,2)'=\"$$\" s func=\"$$\"_func\n i func[\"class(\",$e(func,1,2)'=\"##\" s func=\"##\"_func\n s x=\"s data=\"_func\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s output=\"$\"_$l(data)_crlf_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"function\")\n QUIT\n ;\ndecr(input)\n ;\n n data,gloRef,x\n ;\n ; DECR myglobal[\"1\",\"xx yy\",3]\n ; :3\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$increment(\"_gloRef_\",-1)\"\n s $zt=$$zt() x x\n s $zt=\"\"\n s output=\":\"_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"decr\")\n QUIT\n ;\ndecrby(input)\n ;\n n by,data,gloName,gloRef,inputr,nb,nsp,ok,subs,x\n ;\n ; DECRBY myglobal[\"1\",\"xx yy\",3] 3\n ; :4\n ;\n s inputr=$re(input)\n s by=$re($p(inputr,\" \",1))\n s nsp=$l(input,\" \")+2\n s gloRef=$p(inputr,\" \",2,nsp)\n s gloRef=$re(gloRef)\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n s gloRef=gloName\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs_\")\"\n s x=\"s data=$increment(\"_gloRef_\",-\"_by_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s output=\":\"_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"decrby\")\n QUIT\n ;\nnextSubscript(input,direction)\n ;\n n data,gloRef,response,subscript,x,value\n ;\n ; NEXTSUBSCRIPT myglobal[\"1\",\"xx yy\",\"\"]\n ; +abc\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s subscript=$o(\"_gloRef_\",direction)\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s value=\"\",data=0\n i subscript'=\"\" d\n . s value=$g(^(subscript))\n . s data=$d(^(subscript))\n ;\n s response=\"{\"\"subscriptValue\"\":\"\"\"_subscript_\"\"\",\"\n s response=response_\"\"\"dataStatus\"\":\"_data_\",\"\n s response=response_\"\"\"dataValue\"\":\"\"\"_value_\"\"\"}\"\n ;\n s response=\"$\"_$l(response)_crlf_response_crlf\n i $g(^zewd(\"trace\"))=1 d trace(\"nextsubscript: response=\"_response)\n w response\n i $g(^mwire(\"logger\"))=1 d logger(\"nextsubscript\")\n ;\n QUIT\n ;\norder(input)\n ;\n n data,gloRef,x\n ;\n ; ORDER myglobal[\"1\",\"xx yy\",\"\"]\n ; +abc\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$o(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n i data=\"\" s output=\"$-1\"_crlf w output QUIT\n s output=\"$\"_$l(data)_crlf_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"order\")\n QUIT\n ;\nreverseorder(input)\n ;\n n data,gloRef,x\n ;\n ; REVORDER myglobal[\"1\",\"xx yy\",\"\"]\n ; +abc\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$o(\"_gloRef_\",-1)\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n i data=\"\" s output=\"$-1\"_crlf w output QUIT\n s output=\"$\"_$l(data)_crlf_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"reverseorder\")\n QUIT\n ;\nquery(input)\n ;\n n data,gloRef,nb,p1,p2,x\n ;\n ; QUERY myglobal[\"1\",\"xx yy\"]\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$q(\"_gloRef_\")\"\n s $zt=$$zt()\n ;d trace(\"query x=\"_x)\n x x\n i data=\"\" s output=\"$-1\"_crlf w output QUIT\n s data=$e(data,2,$l(data))\n ;d trace(\"data=\"_data)\n s p1=$p(data,\"(\",1)\n s nb=$l(data,\"(\")+2\n ;d trace(\"nb=\"_nb)\n s p2=$p(data,\"(\",2,nb)\n ;d trace(\"1 p2=\"_p2)\n s p2=$e(p2,1,$l(p2)-1)\n ;d trace(\"2 p2=\"_p2)\n s data=p1_\"[\"_p2_\"]\"\n s output=\"$\"_$l(data)_crlf_data_crlf\n w output\n s $zt=\"\"\n i $g(^mwire(\"logger\"))=1 d logger(\"query\")\n QUIT\n ;\nqueryget(input)\n ;\n n data,gloRef,nb,odata,p1,p2,value,x\n ;\n ; QUERYGET myglobal[\"1\",\"xx yy\"]\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$q(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n i data=\"\" s output=\"$-1\"_crlf w output QUIT\n s odata=data\n s output=\"*2\"_crlf\n w output\n s data=$e(data,2,$l(data))\n s p1=$p(data,\"(\",1)\n s nb=$l(data,\"(\")+2\n s p2=$p(data,\"(\",2,nb)\n s p2=$e(p2,1,$l(p2)-1)\n s data=p1_\"[\"_p2_\"]\"\n s output=\"$\"_$l(data)_crlf_data_crlf\n w output\n s value=@odata\n s output=\"$\"_$l(value)_crlf_value_crlf\n w output\n s $zt=\"\"\n i $g(^mwire(\"logger\"))=1 d logger(\"queryget\")\n QUIT\n ;\nlock(input)\n ;\n n gloName,gloRef,inputr,nb,nsp,ok,subs,time,x\n ;\n ; LOCK myglobal[\"1\",\"xxyy\"] 5\n ; +OK\n ;\n s inputr=$re(input)\n s time=$re($p(inputr,\" \",1))\n i time?1N.N d\n . s nsp=$l(input,\" \")+2\n . s gloRef=$p(inputr,\" \",2,nsp)\n e  d\n . s time=5\n . s gloRef=inputr\n s gloRef=$re(gloRef)\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n s gloRef=gloName\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs_\")\"\n s x=\"s ok=1 l +\"_gloRef_\":\"_time_\" e  s ok=0\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s output=\":\"_ok_crlf\n w output\n QUIT\n ;\nunlock(input)\n ;\n n gloRef,x\n ;\n ; UNLOCK myglobal[\"1\",\"xxyy\"]\n ; +OK\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"l -\"_gloRef\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s output=\"+OK\"_crlf\n w output\n QUIT\n ;\ngetAllSubscripts(input)\n ;\n n comma,data,exists,from,i,gloRef,len,numericEnd,rec,ref\n n stop,subscripts,subs,subs1,to,x\n ;\n ; GETSUBSCRIPTS myglobal[\"1\",\"xx yy\"] fromValue toValue\n ; \n s gloRef=$p(input,$c(1),1)\n s gloRef=$$getGloRef(gloRef)\n s from=$p(input,$c(1),2)\n i from=\"zz-null\" s from=\"\"\n s to=$p(input,$c(1),3)\n i to=\"zz-null\" s to=\"\"\n s numericEnd=$$numeric(to)\n ;d trace(\"to=\"_to_\": numeric = \"_numericEnd)\n ;\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i $e(gloRef,$l(gloRef))=\")\" d\n . s x=\"s exists=$d(\"_gloRef_\")\"\n . s gloRef=$e(gloRef,1,$l(gloRef)-1)_\",\"\n e  d\n . s x=\"s exists=$d(\"_gloRef_\")\"\n . s gloRef=gloRef_\"(\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n i 'exists!(exists=1) s output=\"$2\"_crlf_\"[]\"_crlf w output QUIT\n ;\n s subs=from\n s subs1=subs i subs1[\"\"\"\" s subs1=$$replaceAll(subs1,\"\"\"\",\"\"\"\"\"\")\n i from'=\"\" d\n . s x=\"s subs1=$o(\"_gloRef_\"\"\"\"_subs1_\"\"\"),-1)\"\n . ;d trace(\"1 x=\"_x)\n . x x\n s x=\"s subs=$o(\"_gloRef_\"\"\"\"_subs1_\"\"\"))\"\n x x\n s len=3+$l(subs)\n s comma=\",\",stop=0\n i subs'=\"\" d\n . f  s subs=$o(^(subs)) q:stop  d\n . . i subs=\"\" s stop=1 q\n . . i to'=\"\" d  q:stop\n . . . i numericEnd d\n . . . . ;d trace(\"numeric: subs=\"_subs_\": to=\"_to)\n . . . . i $$numeric(subs),subs>to s stop=1\n . . . e  d\n . . . . i subs]to s stop=1\n . . s len=len+$l(comma)+2+$l(subs)\n ;d trace(\"3 len=\"_len)\n s len=len+1\n s response=\"$\"_len_crlf\n w response\n ;\n s x=\"s subs=$o(\"_gloRef_\"\"\"\"_subs1_\"\"\"))\"\n ;d trace(\"4 x=\"_x)\n ;d trace(\"xx to=\"_to)\n x x\n s response=\"[\"\"\"_subs_\"\"\"\"\n w response\n i subs'=\"\" d\n . s stop=0\n . f  s subs=$o(^(subs)) q:stop  d\n . . i subs=\"\" s stop=1 q\n . . i to'=\"\" d  q:stop\n . . . i numericEnd d\n . . . . ;d trace(\"numeric: subs=\"_subs_\": to=\"_to)\n . . . . i $$numeric(subs),subs>to s stop=1\n . . . e  d\n . . . . i subs]to s stop=1\n . . s response=comma_\"\"\"\"_subs_\"\"\"\"\n . . w response\n ;d trace(\"5 response=\"_response)\n s response=\"]\"_crlf\n w response\n i $g(^mwire(\"logger\"))=1 d logger(\"getallsubscripts\")\n ;\n QUIT\n ;\norderall(input)\n ;\n n data,exists,i,gloRef,rec,subs,subs1,x\n ;\n ; ORDERALL myglobal[\"1\",\"xx yy\"] \n ; *6\n ; $2\n ; aa\n ; $5\n ; hello\n ; $2\n ; bb\n ; $5\n ; world\n ; $3\n ; bba\n ; $-1\n ; \n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i $e(gloRef,$l(gloRef))=\")\" d\n . s x=\"s exists=$d(\"_gloRef_\")\"\n . s gloRef=$e(gloRef,1,$l(gloRef)-1)_\",\"\n e  d\n . s x=\"s exists=$d(\"_gloRef_\")\"\n . s gloRef=gloRef_\"(\"\n s $zt=$$zt()\n x x\n i 'exists s output=\"$-1\"_crlf w output QUIT\n ;\n s subs=\"\",rec=0\n k ^CacheTempEWD($j)\n f  d  q:subs=\"\"\n . s subs1=subs i subs1[\"\"\"\" s subs1=$$replaceAll(subs1,\"\"\"\",\"\"\"\"\"\")\n . s x=\"s subs=$o(\"_gloRef_\"\"\"\"_subs1_\"\"\"))\"\n . x x\n . i subs=\"\" q\n . s rec=rec+1\n . s ^CacheTempEWD($j,rec)=\"$\"_$l(subs)_crlf_subs_crlf\n . s x=\"s exists=$d(\"_gloRef_\"\"\"\"_subs_\"\"\"))\"\n . x x\n . i exists=1!(exists=11) d\n . . s x=\"s data=\"_gloRef_\"\"\"\"_subs_\"\"\")\"\n . . x x\n . . s rec=rec+1\n . . s ^CacheTempEWD($j,rec)=\"$\"_$l(data)_crlf_data_crlf\n . e  d\n . . s rec=rec+1\n . . s ^CacheTempEWD($j,rec)=\"$-1\"_crlf\n s $zt=\"\"\n s output=\"*\"_rec_crlf\n w output\n f i=1:1:rec w ^CacheTempEWD($j,i)\n k ^CacheTempEWD($j)\n i $g(^mwire(\"logger\"))=1 d logger(\"orderall\")\n QUIT\n ;\nmergefrom(input)\n ;\n n data,gloRef,i,params,resp,start,x\n ;\n ; MERGEFROM myglobal[\"1\",\"a\"]\n ; *6\n ; $1\n ; 1  <keys>\n ; $5\n ; hello  <data>\n ; $9\n ; 1,\"a\\\"aa\"  <keys> note escaping\n ; $5\n ; world\n ; $8\n ; 2,\"cccc\"\n ; $3\n ; foo\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n k ^CacheTempEWD($j)\n s x=\"m ^CacheTempEWD($j)=\"_gloRef\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s x=$q(^CacheTempEWD($j,\"\"))\n i x=\"\" d  QUIT\n . s output=\"*-1\"_crlf \n . w output \n . k ^CacheTempEWD($j)\n f i=1:1 s x=$q(@x) q:x=\"\"\n i $d(^CacheTempEWD($j))=1!($d(^CacheTempEWD($j))=11) s i=i+1\n s output=\"*\"_(i*2)_crlf\n w output\n i $d(^CacheTempEWD($j))=1!($d(^CacheTempEWD($j))=11) d\n . s output=\"$-1\"_crlf\n . w output\n . s output=\"$\"_$l(^CacheTempEWD($j))_crlf_^CacheTempEWD($j)_crlf\n . w output\n s x=$q(^CacheTempEWD($j,\"\"))\n s start=\"^CacheTempEWD(\"_$j_\",\"\n s params=$p(x,start,2,2000)\n s params=$e(params,1,$l(params)-1)\n s resp=params\n s output=\"$\"_$l(resp)_crlf_resp_crlf\n w output\n s data=@x\n s output=\"$\"_$l(data)_crlf_data_crlf  \n w output\n f i=1:1 s x=$q(@x) q:x=\"\"  d\n . s params=$p(x,start,2,2000)\n . s params=$e(params,1,$l(params)-1)\n . s resp=params\n . s output=\"$\"_$l(resp)_crlf_resp_crlf  \n . w output\n . s data=@x\n . i data=\"\" d\n . . s output=\"$-1\"_crlf\n . . w output\n . e  d\n . . s output=\"$\"_$l(data)_crlf_data_crlf  \n . . w output\n k ^CacheTempEWD($j)\n QUIT\n ;\nmergeto(input)\n ;\n n data,dataLength,error,gloRef,i,key,keyLength,noOfRecs,x\n ;\n ; MERGETO myglobal[\"1\",\"a\"]\n ; *6\n ; $1\n ; 1   <keys>\n ; $5\n ; hello  <data>\n ; $7\n ; 1,\"aaa\"  <keys>\n ; $5\n ; world   <data>\n ; $8\n ; 2,\"cccc\"\n ; $3\n ; foo\n ; +OK\n ;   note $-1 for key length means no key - data put at top level\n ;\n s $zt=$$zt()\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i $e(gloRef,$l(gloRef))=\")\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n ;\n r noOfRecs\n i $e(noOfRecs,1)'=\"*\" s output=\"-Invalid: expected number of records\"_crlf w output QUIT\n s noOfRecs=+$e(noOfRecs,2,$l(noOfRecs))\n i noOfRecs'?1N.N s output=\"-Invalid format for number of records\"_crlf w output QUIT\n i noOfRecs=0 QUIT \"+OK\"_crlf QUIT\n i (noOfRecs#2)=1 s output=\"-Invalid: no of records must be an even number\"_crlf w output QUIT\n s noOfRecs=noOfRecs/2\n k ^CacheTempEWD($j)\n s error=\"\"\n k ^CacheTempEWD($j)\n f i=1:1:noOfRecs d  q:error'=\"\"\n . r keyLength\n . i $e(keyLength,1)'=\"$\" s error=\"Invalid record \"_i_\": record length\" q\n . s keyLength=+$e(keyLength,2,$l(keyLength))\n . i keyLength=-1 d\n . . s key=\"\"\n . e  d\n . . i keyLength'?1N.N s error=\"Invalid record \"_i_\": bad format for record length\" q\n . . i keyLength=0 s error=\"Invalid record \"_i_\": record length cannot be zero\" q\n . . s key=$$readChars(keyLength)\n . . r ok d log(key)\n . . ;r key#keyLength,ok d log(key)\n . . i key[\"\\\"\"\" s key=$$replaceAll(key,\"\\\"\"\",\"\"\"\"\"\")\n . i error'=\"\" q\n . r dataLength\n . i $e(dataLength,1)'=\"$\" s error=\"Invalid record \"_i_\": expected data length\" q\n . s dataLength=+$e(dataLength,2,$l(dataLength))\n . i dataLength'=-1,dataLength'?1N.N s error=\"Invalid record \"_i_\": bad format for data length\" q\n . i dataLength=-1 d\n . . s data=\"\"\n . e  d\n . . s data=$$readChars(dataLength)\n . . r ok\n . . d log(data)\n . . ;r data#dataLength,ok d log(data)\n . . i data[\"\"\"\" s data=$$replaceAll(data,\"\"\"\",\"\"\"\"\"\")\n . i key=\"\" d\n . . n gloRef1\n . . s gloRef1=gloRef\n . . i gloRef[\"(\" s gloRef1=gloRef1_\")\"\n . . s x=\"s \"_gloRef1_\"=\"\"\"_data_\"\"\"\"\n . e  d\n . . n gloRef1\n . . s gloRef1=gloRef\n . . i gloRef'[\"(\" d\n . . . s gloRef1=gloRef1_\"(\"\n . . e  d\n . . . s gloRef1=gloRef1_\",\"\n . . s x=\"s \"_gloRef1_key_\")=\"\"\"_data_\"\"\"\"\n . s ^CacheTempEWD($j,i)=x\n i error'=\"\" s output=\"-\"_error_crlf w output QUIT\n f i=1:1:noOfRecs d\n . s x=^CacheTempEWD($j,i)\n . x x\n k ^CacheTempEWD($j)\n s output=\"+OK\"_crlf\n w output\n s $zt=\"\"\n QUIT\n ;\ncopy(input)\n ;\n n fromGlo,killToFirst,p2,response,toGlo,x\n ;\n ; COPY fromGlobal[\"1\",\"a\"] toGlobal[\"x\"] 1\n i $g(^%zewd(\"trace\"))=1 d trace(\"copy: input=\"_input)\n s $zt=$$zt()\n s fromGlo=$p(input,$c(1),1)\n s toGlo=$p(input,$c(1),2)\n s killToFirst=$p(input,$c(1),3)\n s p2=$p(fromGlo,\"[\",2,2000)\n s p2=$e(p2,1,$l(p2)-1)\n i p2'=\"\" s p2=\"(\"_p2_\")\"\n s fromGlo=\"^\"_$p(fromGlo,\"[\",1)_p2\n s p2=$p(toGlo,\"[\",2,2000)\n s p2=$e(p2,1,$l(p2)-1)\n i p2'=\"\" s p2=\"(\"_p2_\")\"\n s toGlo=\"^\"_$p(toGlo,\"[\",1)_p2\n s x=\"\"\n i killToFirst s x=\"k \"_toGlo_\" \"\n s x=x_\"m \"_toGlo_\"=\"_fromGlo\n x x\n ;\n i $g(^%zewd(\"trace\"))=1 d trace(\"x=\"_x)\n s response=\"+ok\"_crlf\n i $g(^%zewd(\"trace\"))=1 d trace(\"copy: response=\"_response)\n w response\n s $zt=\"\"\n i $g(^mwire(\"logger\"))=1 d logger(\"copy\")\n ;\n QUIT\n ;\nmdate\n ;\n n date,day,time\n ;\n s date=$h\n s day=+date\n s output=\"*2\"_crlf_\"$\"_$l(day)_crlf_day_crlf\n w output\n s time=$p(date,\",\",2)\n s output=\"$\"_$l(time)_crlf_time_crlf\n w output\n QUIT\n ;\ntstart\n s $zt=$$zt()\n TSTART\n s output=\"+OK\"_crlf\n w output\n s $zt=\"\"\n QUIT\n ;\ntcommit\n s $zt=$$zt()\n TCOMMIT\n s output=\"+OK\"_crlf\n w output\n s $zt=\"\"\n QUIT\n ;\ntrollback\n s $zt=$$zt()\n TROLLBACK\n s output=\"+OK\"_crlf\n w output\n s $zt=\"\"\n QUIT\n ;\nzv\n s output=\"+\"_$zv_crlf\n w output\n QUIT\n ;\nzt()\n i $zv[\"GT.M\" QUIT \"g executeError^zmwire\"\n QUIT \"executeError^zmwire\"\n ;\nprocessid\n s output=\":\"_$j_crlf\n w output\n QUIT\n ;\nping\n s output=\"+PONG\"_crlf\n w output\n QUIT\n ;\nexecuteError\n s output=\"-Invalid Command\"_crlf\n w output\n g loop\n ;\nreplaceAll(InText,FromStr,ToStr) ; Replace all occurrences of a substring\n ;\n n p\n ;\n s p=InText\n i ToStr[FromStr d  QUIT p\n . n i,stop,tempText,tempTo\n . s stop=0\n . f i=0:1:255 d  q:stop\n . . q:InText[$c(i)\n . . q:FromStr[$c(i)\n . . q:ToStr[$c(i)\n . . s stop=1\n . s tempTo=$c(i)\n . s tempText=$$replaceAll(InText,FromStr,tempTo)\n . s p=$$replaceAll(tempText,tempTo,ToStr)\n f  q:p'[FromStr  S p=$$replace(p,FromStr,ToStr)\n QUIT p\n ;\nreplace(InText,FromStr,ToStr) ; replace old with new in string\n ;\n n np,p1,p2\n ;\n i InText'[FromStr q InText\n s np=$l(InText,FromStr)+1\n s p1=$p(InText,FromStr,1),p2=$p(InText,FromStr,2,np)\n QUIT p1_ToStr_p2\n ;\nreadChars(length)\n ;\n n data,i,x\n ;\n s data=\"\"\n f i=1:1:length r *x s data=data_$c(x)\n QUIT data\n ;\nstripSpaces(string)\n i $zv[\"Cache\" QUIT $$stripSpaces^MDBMCache(string)\n ;\n s string=$$stripLeadingSpaces(string)\n QUIT $$stripTrailingSpaces(string)\n ;\nstripLeadingSpaces(string)\n ;\n n i\n ;\n f i=1:1:$l(string) QUIT:$e(string,i)'=\" \"\n QUIT $e(string,i,$l(string))\n ;\nstripTrailingSpaces(string)\n ;\n n i,spaces,new\n ;\n s spaces=$$makeString(\" \",100)\n s new=string_spaces\n QUIT $p(new,spaces,1)\n ;\nmakeString(char,len) ; create a string of len characters\n ;\n n str\n ;\n s str=\"\",$p(str,char,len+1)=\"\"\n QUIT str\n ;\nMD5(string)\n ;\n ; n hash\n ;\n i $zv[\"Cache\" QUIT $$MD5^MDBMCache(string)\n ;\n QUIT $$MD5^%ZMGWSIS(string,1,1)\n ;\nunEscape(string)\n ;\n n buf,outstring,p1,p2,hex,asc\n ;\n s buf=string\n s outstring=\"\"\n f  q:buf'[\"%\"  d\n . s p1=$p(buf,\"%\",1)\n . s outstring=outstring_p1\n . s p2=$p(buf,\"%\",2,50000)\n . i $e(p2)=\"u\" s buf=$e(p2,6,9999),hex=$e(p2,2,5),outstring=outstring_$c($$hex2Ascii(hex)-1264) q\n . s hex=$e(p2,1,2)\n . s buf=$e(p2,3,$l(p2))\n . s asc=$$hex2Ascii(hex)\n . s outstring=outstring_$c(asc)\n QUIT (outstring_buf)\n ;\nhex2Ascii(string)\n ;\n n asc,c,conv,err,i,n,power\n ;\n s string=$zconvert(string,\"U\")\n s asc=0\n f i=0:1:9 S conv(i)=i\n s conv(\"A\")=10\n s conv(\"B\")=11\n s conv(\"C\")=12\n s conv(\"D\")=13\n s conv(\"E\")=14\n s conv(\"F\")=15\n s n=-1,err=0\n f i=$l(string):-1:1 d  q:err\n . s n=n+1\n . s power=16**n\n . s c=$e(string,i)\n . i '$d(conv(c)) s err=1 q\n . s asc=asc+(conv(c)*power)\n i err QUIT \"-1\"\n QUIT asc\n ;\nts()\n s last=$g(^zmwire(\"lastts\"))\n n io,p,resp\n s io=$io\n s p=\"time\"\n o p:(COMMAND=\"date +%s%N\":READONLY)::\"PIPE\"\n u p\n r resp q:$ZEOF\n c p\n u io\n s ^zmwire(\"lastts\")=resp\n QUIT ((resp-last)/1000000000)\n ;\nrelinkRoutines()\n n list,rou,xrou\n i $g(^zewd(\"trace\"))=1 d trace(\"Process \"_$j_\": Relinking...\")\n s rou=\"\"\n f  s rou=$view(\"RTNNEXT\",rou) q:rou=\"\"  d\n . i rou=\"zmwire\" q\n . i rou=\"%zewdGTMRuntime\" q\n . i rou=\"%zewdPHP\" q\n . i rou=\"MDB\" q\n . i rou=\"ewdWLewdmgrrelink\" q\n . i rou=\"%ZMGWSI\" q\n . i rou=\"%ZMGWSIS\" q\n . i rou=\"GTM$DMOD\" q\n . s xrou=rou\n . i $e(xrou,1)=\"%\" s xrou=\"_\"_$e(xrou,2,$l(xrou))\n . zl xrou\n . i $g(^zewd(\"trace\"))=1 d trace(\"relinked \"_rou)\n s ^zmwire(\"relink\",\"process\",$j)=\"\"\n i $g(^zewd(\"trace\"))=1 d trace(\"Process \"_$j_\": Relinking complete\")\n QUIT \"\"\n ;\nrelink ;\n s ^zmwire(\"relink\")=1\n k ^zmwire(\"relink\",\"process\")\n QUIT\n ;\narrayToJSON(name)\n n a,buff,c,json,subscripts\n i '$d(@name) QUIT \"[]\"\n s json=$$walkArray(\"\",name)\n ; Encode UTF-8 characters\n s buff=\"\"\n f i=1:1:$l(json) d\n . s c=$e(json,i)\n . s a=$a(c)\n . i a>160 d\n . . i a<192 d\n . . . s buff=buff_$c(194)_c\n . . e  d\n . . . s buff=buff_$c(195)_$c(a-64)\n . e  d\n . . s buff=buff_c\n QUIT buff\n ;\nwalkArray(json,name,subscripts)\n ;\n n allNumeric,arrComma,brace,comma,count,cr,dd,i,no,numsub,dblquot,quot\n n ref,sub,subNo,subscripts1,type,valquot,value,xref,zobj\n ;\n s cr=$c(13,10),comma=\",\"\n s (quot,dblquot,valquot)=\"\"\"\"\n s dd=$d(@name)\n i dd=1!(dd=11) d  i dd=1 QUIT json\n . s value=@name\n . i value'[\">\" q\n . s json=$$walkArray(json,value,.subscripts)\n s ref=name_\"(\"\n s no=$o(subscripts(\"\"),-1)\n i no>0 f i=1:1:no d\n . i subscripts(i)[quot s subscripts(i)=$$replaceAll(subscripts(i),quot,quot_quot)\n . i subscripts(i)?.\"-\"1N.N s quot=\"\"\n . s ref=ref_quot_subscripts(i)_quot_\",\"\n . s quot=dblquot\n s ref=ref_\"sub)\"\n s sub=\"\",numsub=0,subNo=0,count=0\n s allNumeric=1\n f  s sub=$o(@ref) q:sub=\"\"  d  q:'allNumeric\n . i sub'?1N.N s allNumeric=0\n . s count=count+1\n . i sub'=count s allNumeric=0\n ;i allNumeric,count=1 s allNumeric=0\n s allNumeric=0\n i allNumeric d\n . s json=json_\"[\"\n e  d\n . s json=json_\"{\"\n s sub=\"\"\n f  s sub=$o(@ref) q:sub=\"\"  d\n . s subscripts(no+1)=sub\n . s subNo=subNo+1\n . s dd=$d(@ref)\n . i dd=1 d\n . . s value=@ref\n . . ;i value[\"\\\" s value=$$replaceAll(value,\"\\\",\"\\\\\")\n . . s value=$$removeControlChars(value)\n . . i 'allNumeric d\n . . . ;i sub[\"\\\",sub'[\"\\\\\",sub'[\"\\\"\"\"  s sub=$$replaceAll(sub,\"\\\",\"\\\\\")\n . . . i sub[\"\\\" s sub=$$replaceAll(sub,\"\\\",\"\\\\\")\n . . . s sub=$$removeControlChars(sub)\n . . . s json=json_\"\"\"\"_sub_\"\"\":\"\n . . s type=\"literal\"\n . . i $$numeric(value) s type=\"numeric\"\n . . i value=\"true\"!(value=\"false\") s type=\"boolean\"\n . . i $e(value,1)=\"{\",$e(value,$l(value))=\"}\" s type=\"variable\"\n . . i type=\"literal\" d\n . . . ;i value[quot s value=$$replaceAll(value,quot,\"\\\"_quot)\n . . . ;i value[\"\\\",value'[\"\\\\\",value'[\"\\\"\"\"  s value=$$replaceAll(value,\"\\\",\"\\\\\")\n . . . i value[\"\\\" s value=$$replaceAll(value,\"\\\",\"\\\\\")\n . . . i value[quot s value=$$replaceAll(value,quot,\"\\\"\"\")\n . . . s value=valquot_value_valquot\n . . d\n . . . s json=json_value_\",\"\n . k subscripts1\n . m subscripts1=subscripts\n . i dd>9 d\n . . n subx\n . . ;i sub?1N.N d\n . . ;. i subNo=1 d\n . . ;. . s numsub=1\n . . ;. . s json=$e(json,1,$l(json)-1)_\"[\"\n . . ;e  d\n . . ;. s json=json_\"\"\"\"_sub_\"\"\":\"\n . . ;i sub[\"\\\",sub'[\"\\\\\",sub'[\"\\\"\"\" s sub=$$replaceAll(sub,\"\\\",\"\\\\\")\n . . s subx=sub\n . . i subx[\"\\\" s subx=$$replaceAll(sub,\"\\\",\"\\\\\")\n . . i subx[quot s subx=$$replaceAll(subx,quot,\"\\\"\"\")\n . . s subx=$$removeControlChars(subx)\n . . s json=json_\"\"\"\"_subx_\"\"\":\"\n . . s json=$$walkArray(json,name,.subscripts1)\n . . d\n . . . s json=json_\",\"\n ;\n s json=$e(json,1,$l(json)-1)\n i allNumeric d\n . s json=json_\"]\"\n e  d\n . s json=json_\"}\"\n QUIT json ; exit!\n ;\ntrace(text,clear) ; trace  ;\n n i\n s text=$g(text)\n i $g(clear)=1 k ^%zewdTrace\n s i=$increment(^%zewdTrace)\n s ^%zewdTrace(i)=text\n QUIT\n ;\nparseJSON(jsonString,propertiesArray,mode)\n ;\n n array,arrRef,buff,c,error\n ;\n k propertiesArray\n s error=\"\"\n s buff=$g(jsonString)\n s buff=$$replaceAll(buff,\"\\\"\"\",\"\\'\")\n s arrRef=\"array\"\n s c=$e(buff,1)\n s buff=$e(buff,2,$l(buff))\n d\n . i c=\"{\" d  q\n . . n prefix\n . . s prefix=\"\"\"zobj1\"\"\"\n . . i $g(mode)=1 s prefix=\"\"\n . . s error=$$parseJSONObject(.buff,prefix)\n . . q:error\n . . i buff'=\"\" s error=1\n . i c=\"[\" d  q\n . . n prefix\n . . s prefix=1\n . . i $g(mode)=1 s prefix=\"\"\n . . s error=$$parseJSONArray(.buff,prefix)\n . . q:error\n . . i buff'=\"\" s error=1\n . s error=1\n i error=1 QUIT \"Invalid JSON\"\n m propertiesArray=array\n QUIT \"\"\n ;\nparseJSONObject(buff,subs)\n n c,error,name,stop,subs2,value,x\n s stop=0,name=\"\",error=\"\"\n f  d  q:stop\n . s c=$e(buff,1)\n . i c=\"\" s error=1,stop=1 q\n . s buff=$e(buff,2,$l(buff))\n . i c=\"[\" s error=1,stop=1 q\n . i c=\"}\" d  q\n . . s stop=1\n . i c=\":\" d  q\n . . n subs2\n . . s value=$$getJSONValue(.buff)\n . . d  q:stop\n . . . i value=\"\" q\n . . . i $e(value,1)=\"\"\"\",$e(value,$l(value))=\"\"\"\" q\n . . . i value=\"true\"!(value=\"false\") s value=\"\"\"\"_value_\"\"\"\" q\n . . . i $$numeric(value) q\n . . . s error=1,stop=1\n . . i value=\"\",$e(buff,1)=\"{\" d  q\n . . . i $e(name,1)'=\"\"\"\",$e(name,$l(name))'=\"\"\"\" s name=\"\"\"\"_name_\"\"\"\"\n . . . s subs2=subs\n . . . i subs'=\"\" s subs2=subs2_\",\"\n . . . s subs2=subs2_name\n . . . i $g(mode)=\"\" s subs2=subs2_\",\"\"zobj1\"\"\"\n . . . s buff=$e(buff,2,$l(buff))\n . . . s error=$$parseJSONObject(.buff,subs2)\n . . . i error=1 s stop=1 q\n . . i value=\"\",$e(buff,1)=\"[\" d  q\n . . . ;s subs2=subs_\",\"\"\"_name_\"\"\",\"\"1\"\"\"\n . . . i $e(name,1)'=\"\"\"\",$e(name,$l(name))'=\"\"\"\" s name=\"\"\"\"_name_\"\"\"\"\n . . . s subs2=subs\n . . . i subs'=\"\" s subs2=subs2_\",\"\n . . . s subs2=subs2_name\n . . . s buff=$e(buff,2,$l(buff))\n . . . s error=$$parseJSONArray(.buff,subs2)\n . . . i error=1 s stop=1 q\n . . i $e(name,1)=\"\"\"\",$e(name,$l(name))'=\"\"\"\" s error=1,stop=1 q\n . . i $e(name,1)'=\"\"\"\",$e(name,$l(name))=\"\"\"\" s error=1,stop=1 q\n . . i $e(name,1)'=\"\"\"\",$e(name,$l(name))'=\"\"\"\" s name=\"\"\"\"_name_\"\"\"\"\n . . s subs2=subs\n . . i subs'=\"\" s subs2=subs2_\",\"\n . . s subs2=subs2_name\n . . i value[\"\\'\" s value=$$replaceAll(value,\"\\'\",\"\"\"\"\"\")\n . . s x=\"s \"_arrRef_\"(\"_subs2_\")=\"_value\n . . x x\n . i c=\",\" s name=\"\" q\n . s name=name_c q\n QUIT error\n ;\nparseJSONArray(buff,subs)\n n c,error,name,no,stop,subs2,value,x\n s stop=0,name=\"\",no=0,error=\"\"\n f  d  q:stop\n . s c=$e(buff,1)\n . i c=\"\" s error=1,stop=1 q\n . s buff=$e(buff,2,$l(buff))\n . i c=\":\" s error=1,stop=1 q\n . i c=\"]\" d  q\n . . s stop=1\n . . i name=\"\" q\n . . s no=no+1\n . . s subs2=subs\n . . i subs'=\"\" s subs2=subs2_\",\"\n . . s subs2=subs2_no\n . . s x=\"s \"_arrRef_\"(\"_subs2_\")=\"_name\n . . x x\n . i c=\"[\" d  q\n . . s no=no+1\n . . s subs2=subs\n . . i subs'=\"\" s subs2=subs2_\",\"\n . . s subs2=subs2_no\n . . ;s buff=$e(buff,2,$l(buff))\n . . s error=$$parseJSONArray(.buff,subs2)\n . . i error=1 s stop=1 q\n . i c=\"{\" d  q\n . . s no=no+1\n . . s subs2=subs\n . . i subs'=\"\" s subs2=subs2_\",\"\n . . s subs2=subs2_no\n . . i $g(mode)=\"\" s subs2=subs2_\",\"\"zobj1\"\"\"\n . . ;s buff=$e(buff,2,$l(buff))\n . . s error=$$parseJSONObject(.buff,subs2)\n . . i error=1 s stop=1 q\n . s subs2=subs\n . i subs'=\"\" s subs2=subs2_\",\"\n . s subs2=subs2_\"\"\"\"_name_\"\"\"\"\n . i c=\",\" d  q\n . . i name=\"\" q\n . . d  q:stop\n . . . i $e(name,1)=\"\"\"\",$e(name,$l(name))=\"\"\"\" q\n . . . ;i value=\"true\"!(value=\"false\") s value=\"\"\"\"_value_\"\"\"\" q\n . . . i $$numeric(name) q\n . . . s error=1,stop=1\n . . s no=no+1\n . . s subs2=subs\n . . i subs'=\"\" s subs2=subs2_\",\"\n . . s subs2=subs2_\"\"\"\"_no_\"\"\"\"\n . . s x=\"s \"_arrRef_\"(\"_subs2_\")=\"_name\n . . x x\n . . s name=\"\"\n . s name=name_c q\n QUIT error\n ;\ngetJSONValue(buff)\n n c,isLiteral,lc,stop,value\n s stop=0,value=\"\",isLiteral=0,lc=\"\"\n f  d  q:stop  q:buff=\"\"\n . s c=$e(buff,1)\n . i value=\"\",c=\"\"\"\" s isLiteral=1\n . i 'isLiteral,c=\"[\" s stop=1 q\n . i 'isLiteral,c=\"{\" s stop=1 q\n . i c=\"}\" d  q:stop\n . . i isLiteral,lc'=\"\"\"\" q\n . . s stop=1\n . i c=\",\" d  q:stop\n . . i isLiteral,lc'=\"\"\"\" q\n . . s stop=1\n . s buff=$e(buff,2,$l(buff))\n . s value=value_c\n . s lc=c\n QUIT value\n ;\nnumeric(value)\n i $e(value,1)=0,$l(value)>1 QUIT 0\n i $e(value,1,2)=\"-0\",$l(value)>2,$e(value,1,3)'=\"-0.\" QUIT 0\n i value?1N.N QUIT 1\n i value?1\"-\"1N.N QUIT 1\n i value?1N.N1\".\"1N.N QUIT 1\n i value?1\"-\"1N.N1\".\"1N.N QUIT 1\n i value?1\".\"1N.N QUIT 1\n i value?1\"-.\"1N.N QUIT 1\n QUIT 0\n ;\nremoveControlChars(string)\n n c,i,newString\n s newString=\"\"\n f i=1:1:$l(string) d\n . s c=$e(string,i)\n . i $a(c)<32 s c=\"~\"\n . s newString=newString_c\n QUIT newString\n ;\nutfConvert(input)\n ; Unescape UTF-8 characters\n i input[$c(195) d\n . n buf,c1,i,no,p\n . s buf=$p(input,$c(195),1)\n . s no=$l(input,$c(195))\n . f i=2:1:no d\n . . s p=$p(input,$c(195),i)\n . . s c1=$e(p,1)\n . . s c1=$c($a(c1)+64)\n . . s buf=buf_c1_$e(p,2,$l(p))\n . s input=buf\n s input=$tr(input,$c(194),\"\")\n QUIT input\n ;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/M4/htmlgen.m4",
    "content": "dnl Took from https://en.wikipedia.org/wiki/M4_(computer_language)\ndivert(-1)\n\nM4 has multiple output queues that can be manipulated with the\n`divert' macro. Valid queues range from 0 to 10, inclusive, with\nthe default queue being 0.\n\nCalling the `divert' macro with an invalid queue causes text to be\ndiscarded until another call.  Note that even while output is being\ndiscarded, quotes around `divert' and other macros are needed to\nprevent expansion.\n\n# Macros aren't expanded within comments, meaning that keywords such\n# as divert and other built-ins may be used without consequence.\n\n# HTML utility macro:\n\ndefine(`H2_COUNT', 0)\n\n# The H2_COUNT macro is redefined every time the H2 macro is used:\n\ndefine(`H2',\n\t`define(`H2_COUNT', incr(H2_COUNT))<h2>H2_COUNT. $1</h2>')\n\ndivert(1)dnl\ndnl\ndnl The dnl macro causes m4 to discard the rest of the line, thus\ndnl preventing unwanted blank lines from appearing in the output.\ndnl\nH2(First Section)\nH2(Second Section)\nH2(Conclusion)\ndnl\ndivert(0)dnl\ndnl\n<HTML>\nundivert(1)dnl One of the queues is being pushed to output.\n</HTML>\n"
  },
  {
    "path": "src/test/resources/samples/langs/M4Sugar/ax_ruby_devel.m4",
    "content": "# ===========================================================================\n#       http://www.gnu.org/software/autoconf-archive/ax_ruby_devel.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_RUBY_DEVEL([version])\n#\n# DESCRIPTION\n#\n#   This macro checks for Ruby and tries to get the include path to\n#   'ruby.h'. It provides the $(RUBY_CPPFLAGS) and $(RUBY_LDFLAGS) output\n#   variables. It also exports $(RUBY_EXTRA_LIBS) for embedding Ruby in your\n#   code.\n#\n#   You can search for some particular version of Ruby by passing a\n#   parameter to this macro, for example \"1.8.6\".\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Rafal Rzepecki <divided.mind@gmail.com>\n#   Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de>\n#   Copyright (c) 2008 Alan W. Irwin\n#   Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net>\n#   Copyright (c) 2008 Andrew Collier\n#   Copyright (c) 2008 Matteo Settenvini <matteo@member.fsf.org>\n#   Copyright (c) 2008 Horst Knorr <hk_classes@knoda.org>\n#\n#   This program is free software: you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation, either version 3 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 11\n\nAC_DEFUN([AX_RUBY_DEVEL],[\n    AC_REQUIRE([AX_WITH_RUBY])\n    AS_IF([test -n \"$1\"], [AX_PROG_RUBY_VERSION([$1])])\n\n    #\n    # Check if you have mkmf, else fail\n    #\n    AC_MSG_CHECKING([for the mkmf Ruby package])\n    ac_mkmf_result=`$RUBY -rmkmf -e \";\" 2>&1`\n    if test -z \"$ac_mkmf_result\"; then\n        AC_MSG_RESULT([yes])\n    else\n        AC_MSG_RESULT([no])\n        AC_MSG_ERROR([cannot import Ruby module \"mkmf\".\nPlease check your Ruby installation. The error was:\n$ac_mkmf_result])\n    fi\n\n    #\n    # Check for Ruby include path\n    #\n    AC_MSG_CHECKING([for Ruby include path])\n    if test -z \"$RUBY_CPPFLAGS\"; then\n        ruby_path=`$RUBY -rmkmf -e 'print Config::CONFIG[[\"archdir\"]]'`\n        if test -n \"${ruby_path}\"; then\n                ruby_path=\"-I$ruby_path\"\n        fi\n        RUBY_CPPFLAGS=$ruby_path\n    fi\n    AC_MSG_RESULT([$RUBY_CPPFLAGS])\n    AC_SUBST([RUBY_CPPFLAGS])\n\n    #\n    # Check for Ruby library path\n    #\n    AC_MSG_CHECKING([for Ruby library path])\n    if test -z \"$RUBY_LDFLAGS\"; then\n        RUBY_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[[\"LIBRUBYARG_SHARED\"]]'`\n    fi\n    AC_MSG_RESULT([$RUBY_LDFLAGS])\n    AC_SUBST([RUBY_LDFLAGS])\n\n    #\n    # Check for site packages\n    #\n    AC_MSG_CHECKING([for Ruby site-packages path])\n    if test -z \"$RUBY_SITE_PKG\"; then\n        RUBY_SITE_PKG=`$RUBY -rmkmf -e 'print Config::CONFIG[[\"sitearchdir\"]]'`\n    fi\n    AC_MSG_RESULT([$RUBY_SITE_PKG])\n    AC_SUBST([RUBY_SITE_PKG])\n\n    #\n    # libraries which must be linked in when embedding\n    #\n    AC_MSG_CHECKING(ruby extra libraries)\n    if test -z \"$RUBY_EXTRA_LIBS\"; then\n       RUBY_EXTRA_LIBS=`$RUBY -rmkmf -e 'print Config::CONFIG[[\"SOLIBS\"]]'`\n    fi\n    AC_MSG_RESULT([$RUBY_EXTRA_LIBS])\n    AC_SUBST(RUBY_EXTRA_LIBS)\n\n    #\n    # linking flags needed when embedding\n    # (is it even needed for Ruby?)\n    #\n    # AC_MSG_CHECKING(ruby extra linking flags)\n    # if test -z \"$RUBY_EXTRA_LDFLAGS\"; then\n    # RUBY_EXTRA_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[[\"LINKFORSHARED\"]]'`\n    # fi\n    # AC_MSG_RESULT([$RUBY_EXTRA_LDFLAGS])\n    # AC_SUBST(RUBY_EXTRA_LDFLAGS)\n\n    # this flags breaks ruby.h, and is sometimes defined by KDE m4 macros\n    CFLAGS=\"`echo \"$CFLAGS\" | sed -e 's/-std=iso9899:1990//g;'`\"\n    #\n    # final check to see if everything compiles alright\n    #\n    AC_MSG_CHECKING([consistency of all components of ruby development environment])\n    AC_LANG_PUSH([C])\n    # save current global flags\n    ac_save_LIBS=\"$LIBS\"\n    LIBS=\"$ac_save_LIBS $RUBY_LDFLAGS\"\n    ac_save_CPPFLAGS=\"$CPPFLAGS\"\n    CPPFLAGS=\"$ac_save_CPPFLAGS $RUBY_CPPFLAGS\"\n    AC_TRY_LINK([\n        #include <ruby.h>\n    ],[\n        ruby_init();\n    ],[rubyexists=yes],[rubyexists=no])\n\n    AC_MSG_RESULT([$rubyexists])\n\n    if test ! \"$rubyexists\" = \"yes\"; then\n       AC_MSG_ERROR([\n  Could not link test program to Ruby. Maybe the main Ruby library has been\n  installed in some non-standard library path. If so, pass it to configure,\n  via the LDFLAGS environment variable.\n  Example: ./configure LDFLAGS=\"-L/usr/non-standard-path/ruby/lib\"\n  ============================================================================\n   ERROR!\n   You probably have to install the development version of the Ruby package\n   for your distribution.  The exact name of this package varies among them.\n  ============================================================================\n       ])\n      RUBY_VERSION=\"\"\n    fi\n    AC_LANG_POP\n    # turn back to default flags\n    CPPFLAGS=\"$ac_save_CPPFLAGS\"\n    LIBS=\"$ac_save_LIBS\"\n\n    #\n    # all done!\n    #\n])\n"
  },
  {
    "path": "src/test/resources/samples/langs/M4Sugar/filenames/configure.ac",
    "content": "#                                               -*- Autoconf -*-\n# Process this file with autoconf to produce a configure script.\n\nAC_PREREQ(2.68)\nAC_INIT([GARDEN], \n\t[1.0.9], \n\t[bubla@users.sourceforge.net])\nAC_CONFIG_AUX_DIR([build-aux])\nAM_INIT_AUTOMAKE([-Wall])\nAC_CONFIG_SRCDIR([src/input.h])\nAC_CONFIG_HEADERS([src/configure.h])\nAC_CONFIG_MACRO_DIR([m4])\n\nAC_ARG_ENABLE([debug],\n\t      [AS_HELP_STRING([--enable-debug],\n\t\t\t   [Builds the debug version of the library [[default = no]]]) ],\n\t      [],\n\t      [enable_debug=\"no\"])\n\nAS_IF([test \"x$enable_debug\" = \"xyes\"],\n      [CFLAGS=\"${CFLAGS} -g -O0\"])\n\n# Checks for programs.\nAC_PROG_CC\nAC_PROG_LIBTOOL\nLT_PROG_RC\n\nAC_CANONICAL_HOST\n\ndnl\ndnl Check whether it makes sense to install a garden.desktop file\ndnl\nAC_CHECK_PROG([have_freedesktop],\n\t      [update-desktop-database],\n\t      [yes])\n\nAM_CONDITIONAL([HAVE_FREEDESKTOP],\n\t       [test \"x$have_freedesktop\" = \"xyes\"])\n\nAM_CONDITIONAL([WANT_FREEDESKTOP],\n\t       [test \"x$enable_desktop_install\" = \"xyes\"])\n\nAC_ARG_ENABLE([desktop-install],\n\t      [AS_HELP_STRING([--enable-desktop-install],\n\t\t\t      [Whether you want to install the garden.desktop file if applicable. !!! DO NOT USE if you are a PACKAGER!!!])]\n\t      )\n\nAS_CASE([$host],\n        [*mingw* | *cygwin*],\n        [AC_DEFINE([WINDOWS_VERSION],\n \t\t   [1],\n\t\t   [Define when building for Windows])\n         windows_version=\"yes\"])\n\nAM_CONDITIONAL([WINDOWS_VERSION],\n\t       [test \"x$windows_version\" = \"xyes\" ])\n\ndnl now the datadir specification, that is useful if one does want to play without installing\nAC_ARG_ENABLE([datadir],\n\t      [AS_HELP_STRING([--enable-datadir=path-to-your-garden-datafiles],\n\t\t\t      [Normally you dont have to use this, but it is handy when you want to play the game without installing it or if you want to use already installed data. In the first case, use for instance --enable-datadir=`pwd`/data (if it makes sense)])], \n\t      [DATADIR_NAME=\"$enableval\"],\n\t      [DATADIR_NAME='$(datadir)/'garden])\n\n# Sets the data subdirectory\nAC_SUBST([DATADIR_NAME])\n\n# Checks for libraries.\nAC_CHECK_HEADER([allegro.h],\n\t\t[],\n\t\t[have_allegro=\"no\"\n\t\t AC_MSG_ERROR([You don't even have Allegro headers... Get Allegro first!]) ])\n\nAC_CHECK_LIB([m], [sin])\n\ntest \"x$host_os\" != \"x$build_os\" && CROSS_COMPILING=\"yes\"\n\ntry_link_allegro ()\n{\n\tLIBS_SAVE=$LIBS\n\tLIBS=\"$LIBS $1\"\n\tAC_MSG_CHECKING([for Allegro using $1])\n\tAC_LINK_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT\n\t\t\t\t\t [ #include <allegro.h> ]],\n\t\t\t\t\t[allegro_init();])END_OF_MAIN() ],\n\t\t       [have_allegro=\"yes\"],\n\t\t       [have_allegro=\"no\"])\n\tAC_MSG_RESULT([$have_allegro])\n\tLIBS=$LIBS_SAVE\n\tAS_IF([test \"x$have_allegro\" == \"xyes\"],\n\t      [return 0],\n\t      [return 1])\n}\n# first check for 'official allegro'\n# The official allegro does not support cross-compiling, though...\nAM_PATH_ALLEGRO([4.2.0]) \n\ntry_link_allegro \"$allegro_LIBS\"\nAS_IF([test \"x$?\" == \"x0\"],\n      [[LIBS=\"$LIBS $allegro_LIBS\"\n       ALLEGRO_LIB=`echo $allegro_LIBS | sed -e 's/.*-l\\([^[:blank:]]*\\).*/\\1/'`\n       have_allegro=\"yes\"]])\n\nALLEGRO_RELEASE_LIBS=\"alleg alleg42 alleg44\"\nALLEGRO_DEBUG_LIBS=\"alld42 alleg44-debug\"\nAS_IF([test \"x$enable_debug\" = \"xyes\"],\n      [ALLEGRO_LIBS=\"$ALLEGRO_DEBUG_LIBS $ALLEGRO_RELEASE_LIBS\"],\n      [ALLEGRO_LIBS=\"$ALLEGRO_RELEASE_LIBS $ALLEGRO_DEBUG_LIBS\"])\n\nfor lib in $ALLEGRO_LIBS\ndo\n\tldflag=\"-l$lib\"\n\tAS_IF([test \"x$have_allegro\" == \"xyes\"],\n\t      [break])\n\ttry_link_allegro $ldflag\n\tAS_IF([test \"x$?\" == \"x0\"],\n\t      [LIBS=\"$LIBS $ldflag\"\n\t       ALLEGRO_LIB=\"$lib\"\n\t       have_allegro=\"yes\"])\ndone\n\nAS_IF([test \"x$have_allegro\" != \"xyes\"],\n      [AC_MSG_ERROR([Unable to find Allegro game programming library 4.2, check out www.allegro.cc (or your distro repositories if you use a unix-like system)]) ])\n\n# Checks for header files.\nAC_CHECK_HEADERS([string.h sys/stat.h])\n\n# Checks for typedefs, structures, and compiler characteristics.\nAC_C_INLINE\nAC_HEADER_STDBOOL\n\n# Checks for library functions.\n\nAC_SUBST([ALLEGRO_LIB])\n\nAC_CONFIG_FILES([Makefile\n                 src/Makefile\n\t\t data/Makefile\n\t\t resources/Makefile\n\t \t docs/garden.doxyfile\n\t\t pkgs/w32/winstaller.nsi])\n\nAC_OUTPUT\n"
  },
  {
    "path": "src/test/resources/samples/langs/M4Sugar/list.m4",
    "content": "m4_define([m4_list_declare], [m4_do(\n\t[m4_define([$1_GET], [m4_expand([m4_list_nth([$1], $][1)])])],\n\t[m4_define([$1_FOREACH], [m4_foreach([item], [m4_dquote_elt(m4_list_contents([$1]))], m4_quote($][1))])],\n)])\n\nm4_define([m4_list_add], [m4_do(\n\t[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],\n\t[m4_ifndef(_LIST_NAME,\n\t\t[m4_define(_LIST_NAME, m4_dquote(m4_escape([$2])))],\n\t\t[m4_define(_LIST_NAME, m4_dquote(m4_list_contents([$1]), m4_escape([$2])))],\n\t)],\n\t[m4_popdef([_LIST_NAME])],\n)])\n\nm4_define([m4_list_contents], [m4_do(\n\t[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],\n\t[m4_ifndef(_LIST_NAME, [], m4_quote(_LIST_NAME))],\n\t[m4_popdef([_LIST_NAME])],\n)])\n\nm4_define([m4_list_nth], [m4_argn([$2], m4_list_contents([$1]))])\n\nm4_define([m4_list_pop_front], [m4_do(\n\t[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],\n\t[m4_car(m4_unquote(_LIST_NAME))],\n\t[m4_define(_LIST_NAME, m4_cdr(m4_unquote(_LIST_NAME)))],\n\t[m4_popdef([_LIST_NAME])],\n)])\n\nm4_define([m4_list_pop_back], [m4_do(\n\t[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],\n\t[m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))],\n\t[m4_list_pop_front([$1])],\n\t[m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))],\n\t[m4_popdef([_LIST_NAME])],\n)])\n\ndnl\ndnl $1: List name\ndnl $2: What\ndnl $3: If contains\ndnl $4: If not\nm4_define([m4_list_contains], [m4_do(\n\t[m4_foreach([item], m4_list_contents([$1]), m4_if(item, [$2], [[$3]], [[$4]]))]\n)])\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/MAXScript/macro-1.mcr",
    "content": "-- Taken from an example from Autodesk's MAXScript reference:\n-- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_84E24969_C175_4389_B9A6_3B2699B66785_htm\n\nmacroscript MoveToSurface\n    category: \"HowTo\"\n(\n    fn g_filter o = superclassof o == Geometryclass\n    fn find_intersection z_node node_to_z = (\n        local testRay = ray node_to_z.pos [0,0,-1]\n        local nodeMaxZ = z_node.max.z\n        testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ\n        intersectRay z_node testRay\n    )\n    \n    on isEnabled return selection.count > 0\n    \n    on Execute do (\n        target_mesh = pickObject message:\"Pick Target Surface:\" filter:g_filter\n        \n        if isValidNode target_mesh then (\n            undo \"MoveToSurface\" on (\n                for i in selection do (\n                    int_point = find_intersection target_mesh i\n                    if int_point != undefined then i.pos = int_point.pos\n                )--end i loop\n            )--end undo\n        )--end if\n    )--end execute\n)--end script\n"
  },
  {
    "path": "src/test/resources/samples/langs/MAXScript/macro-2.mcr",
    "content": "-- Taken from an example from Autodesk's MAXScript reference:\n-- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_0876DF46_FAA3_4131_838D_5739A67FF2C1_htm\n\nmacroscript FreeSpline category:\"HowTo\" tooltip:\"FreeSpline\" (\nlocal old_pos\nlocal new_spline\nlocal second_knot_set\n\nfn get_mouse_pos pen_pos old_pen_pos = (\n\tif old_pos == undefined then old_pos = old_pen_pos\n\tif distance pen_pos old_pos > 10 then\n\t(\n\t\tif second_knot_set then\n\t\t\taddKnot new_spline 1 #smooth #curve pen_pos\n\t\telse\n\t\t(\n\t\t\tsetKnotPoint new_spline 1 2 pen_pos\n\t\t\tsecond_knot_set = true\n\t\t)\n\t\told_pos = pen_pos\n\t\tupdateShape new_spline\n\t)-- end if\n)-- end fn\n\nfn draw_new_line old_pen_pos = (\n\tpickPoint mouseMoveCallback:#(get_mouse_pos,old_pen_pos)\n)\n\nundo\"Free Spline\"on(\n\tnew_spline = splineShape ()\n\told_pen_pos = pickPoint ()\n\t\n\tif old_pen_pos == #RightClick then\n\t\tdelete new_spline\n\telse\n\t(\n\t\tselect new_spline\n\t\tnew_spline.pos = old_pen_pos\n\t\taddNewSpline new_spline\n\t\taddKnot new_spline 1 #smooth #curve old_pen_pos\n\t\taddKnot new_spline 1 #smooth #curve old_pen_pos\n\t\tsecond_knot_set = false\n\t\tdraw_new_line old_pen_pos\n\t\tq = querybox \"Close Spline?\" title:\"Free Spline\"\n\t\tif q then\n\t\t(\n\t\t\tclose new_spline 1\n\t\t\tupdateshape new_spline\n\t\t)\n\t\tselect new_spline\n\t)--end else\n)--end undo\n)--end script\n"
  },
  {
    "path": "src/test/resources/samples/langs/MAXScript/rolloutCreator.ms",
    "content": "-------------------------------------------------------------------------------\n--   \n--  File:\t\trolloutCreator.ms\n--  Description:\tLocalization friendly helper struct for dynamically creating rollouts\n--  By:\t\tRavi Karra [Discreet] \t\t\travi.karra@discreet.com\n--\t \n--  Version:\t1.01\n--  Version:\t1.02 - Larry Minton [Discreet] \n--\t\t\t\t\t\tchanged <string1> += <string2> to append string1 string2\n--\t\t\t\t\t\tadded addText method\n--  Declarations:\n/*\n\trolloutCreator <rollout_name> <rollout_caption> [width:] [height:]\n\t\tcreates an instance of rolloutCreator, assign it to a variable\n\t\twidth - width of the rollout/dialog to be created\n\t\theight - of the rollout/dialog to be created\n\t\t\n\t\teg:\n\t \trci = rolloutCreator \"myRollout\" \"My Rollout\"\n\t\t\n\n\t.begin()\n\t\tthis function needs to be called immediately after the instance is created, this does the initialization\n\n\t.addLocal <local_name> [init:]\n\t\t<local_name> \n\t\tname of the local\n\t\t\n\t\t[init:]\n\t\twhat the local should be initialized to\n\t\n\t.addControl <control_type> <control_name> <control_caption> [paramStr:<string>] =\n\t\tadds a control to the rollout\n\t\t\n\t\t<control_type>\n\t\tcan be any of named rolloutControls eg: #button, #spinner, #activeXControl etc\n\t\t\n\t\t<control_name>\n\t\tvariable name of the control by which it is referred eg: #btnButton\n\t\t\n\t\t<control_caption>\n\t\tcaption of the control \"My Button\"\n\t\t\n\t\t[paramStr:]\n\t\tan optional string representation of all the keyword parameters that needs to be passed to the control\n\t\teg: \"width:100 height:20 align:#right\"\n\t\t\n\t\teg:\n\t\trci.addControl #button #myButton \"My Button\"\n\t\n\t.addHandler <control_name> <event_type> [paramStr:<string>]  [codeStr:<string>] [filter:<boolean>]\n\t\tadds an event handler for the controls previously added \n\t\t\n\t\t<control_name>\n\t\tthe variable passed during the control creation\n\t\t \n\t\t<event_type>\n\t\tany of the events supported by the control, eg: #changed, #pressed, #selected\n\t\t\n\t\t[paramStr:<string>]\n\t\tan optional string representation of all the positional and keyword parameters that are passed to the event\t\n\n\t\t[codeStr:<string>]\n\t\ta string representation of the event handler code, if the string contains sub-strings, enclose them in two character '@' \n\t\tand pass on\\true for the filter: parameter\n\n\t\t[filter:<boolean>]\n\t\tif true, converts '@' to quote in codeStr\n\t\t\t\t\n\t\teg:\n\t\trci.addHandler #myButton #pressed codeStr:\"MessageBox @Hey@\" filter:on\n\t\twill add an event handler for button named \"myButton\". When the button is clicked, messagebox pops up with text \"hey\" in it.\n\t\t\n\t.addText <string> [filter:<boolean>]\n\t\tadds string to rollout definition. Typically used for function definitions.\n\n\t\t[filter:<boolean>]\n\t\tif true, converts '@' to quote in string\n\t\t\t\t\n\t.end()\n\t\tthis function has to be called whenever all the required control and their event handler's are called. This function forms \n\t\tthe rollout string, evaluates it and returns the definition which can passed to createDialog and addRollout functions.\n\t\n\tComplete Example:\n\t\t rci = rolloutCreator \"myRollout\" \"My Rollout\"\n\t\t rci.begin()\n\t\t\trci.addControl #button #myButton \"My Button\"\n\t\t\trci.addHandler #myButton #pressed filter:on codeStr:\"MessageBox @Isn't this cool@ title:@Wow@\"\n\t\tcreateDialog (rci.end())\n*/\n-------------------------------------------------------------------------------\n\n\nif __rcCounter == undefined then global __rcCounter = 0\nstruct rolloutCreator\n(\n\t-- variables\n\tname, caption, str, def, width, height, quote=\"\\\"\",\n\t\n\t-- functions\n\tfn begin = \n( \n\t\tif name == undefined then\n\t(\n\t\t\t__rcCounter += 1\n\t\t\tname = \"rolloutCreator\" + __rcCounter as string\n\t)\n\t\tif caption == undefined then caption = \"\"\n\t\tstr = \"\"\n\t),\n\t\n\tfn addLocal name init: = \n(\n\t\tlocal dStr = \"\\tlocal \" + name as string\n\t\tif init != unsupplied then append dStr (\" = \" + init as string)\n\t\tappend dStr \"\\n\"\n\t\tappend str dStr\n\t),\n\n\tfn addControl type name caption paramStr:\"\" =\n(\t\n\t\tappend str (\"\\t\" + type as string + \" \" + name as string + \" \" + quote + caption + quote + paramStr + \"\\n\")\n\t),\n\t\n\tfn strFilter codeStr =\n(\n\t\t\tlocal last_is_at = codeStr[codeStr.count] == \"@\"\n\t\t\tlocal fltStr = filterString codeStr \"@\"\n\t\t\tlocal rep = \"\\\"\"\n\t\t\tcodeStr = (if (codeStr[1] == \"@\") then rep else \"\") + fltStr[1]\n\t\t\tfor i=2 to fltStr.count do\n\t\t(\n\t\t\t\tappend codeStr (rep + fltStr[i])\n\t\t)\n\t\t\tif last_is_at then append codeStr rep\n\t\t\tcodeStr\n\t),\n\n\tfn addHandler ctrl event paramStr:\"\" filter:on codeStr:\"\" =\n(\n\t\tif filter do codeStr = (strFilter codeStr)\n\t\tappend str (\"\\non \" + ctrl as string + \" \" + event as string + \" \" + paramStr as string + \" do \\n(\\n\" + codeStr + \";ok\\n)\\n\")\n\t),\n\t\n\tfn addText txt filter:on =\n(\n\t\tif filter do txt = (strFilter txt )\n\t\tappend str (\"\\t \" + txt + \"\\n\")\n\t),\n\t\n\tfn end = \n( \n\t\tlocal dStr = \"rollout \" + name + \" \" + quote + caption + quote\n\t\tif width != undefined then\n \t\t\tappend dStr (\" width:\" + width as string)\n\t\tif height != undefined then\n\t\t\tappend dStr (\" height:\" + height as string)\n\t\tappend dStr \"\\n(\\n\" \n\t\tappend dStr str\n\t\tappend dStr \"\\n)\\n\"\n\t\tstr = dStr\n\t\tdef = execute str\n)\n)\n\n/*-- Usage\n-- Create an instance of the rolloutCreator passing the name and the caption\nrfTest = rolloutCreator \"rfTestN\" \"rfTestC\" --width:300 height:100\n-- Start creating the rollout\nrfTest.begin()\n\trfTest.addControl #button #myButton \"My Button\"\t\t\t-- add a button\n--\trfTest.addHandler #myButton #pressed filter:on codeStr:\"MessageBox @Hey@\"\nrfTest.addHandler #myButton #pressed filter:on codeStr:\"MessageBox @Look to the \\@Light\\@ thing@\" \nrfTest.end()\ncreateDialog rfTest.def\n*/"
  },
  {
    "path": "src/test/resources/samples/langs/MAXScript/svg-renderer.ms",
    "content": "-- Taken from a 3-part tutorial from Autodesk's MAXScript reference\n-- Source: http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_6B5EDC11_A154_4AA7_A972_A11AC36949E9_htm\n\nfn ColourToHex col = (\n\tlocal theComponents = #(bit.intAsHex col.r, bit.intAsHex col.g, bit.intAsHex col.b)\n\tlocal theValue = \"#\"\n\tfor i in theComponents do \n\t\ttheValue += (if i.count == 1 then \"0\" else \"\") + i\n\ttheValue\n)\n\nlocal st = timestamp()\nlocal theFileName = (getDir #userscripts + \"\\\\PolygonRendering3.svg\")\nlocal theSVGfile = createFile theFileName\nformat \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n\" to:theSVGfile\nformat \"\\t\\txmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\">\\n\" to:theSVGfile\n\nlocal theViewTM =  viewport.getTM()\ntheViewTM.row4 = [0,0,0]\n\nlocal theViewTM2 = viewport.getTM()\nlocal theViewSize = getViewSize()\nlocal theViewScale = getViewSize()\ntheViewScale.x /= 1024.0\ntheViewScale.y /= 1024.0\n\t\nlocal theStrokeThickness = 3\n\t\ngw.setTransform (matrix3 1)\t\nfor o in Geometry where not o.isHiddenInVpt and classof o != TargetObject do (\n\tlocal theStrokeColour = white\n\tlocal theFillColour = o.wirecolor\n\t\n\tlocal theMesh = snapshotAsMesh o\n\tfor f = 1 to theMesh.numfaces do (\n\t\tlocal theNormal = normalize (getFaceNormal theMesh f)\n\t\t\n\t\tif (theNormal*theViewTM).z > 0 do\n\t\t(\n\t\t\tlocal theFace = getFace theMesh f\n\t\t\tlocal v1 = gw.transPoint (getVert theMesh theFace.x)\n\t\t\tlocal v2 = gw.transPoint (getVert theMesh theFace.y)\n\t\t\tlocal v3 = gw.transPoint (getVert theMesh theFace.z)\n\t\t\t\n\t\t\tv1.x /= theViewScale.x \n\t\t\tv1.y /= theViewScale.y \n\t\t\tv2.x /= theViewScale.x \n\t\t\tv2.y /= theViewScale.y\n\t\t\tv3.x /= theViewScale.x\n\t\t\tv3.y /= theViewScale.y\n\t\t\t\n\t\t\tformat \"\\t<polygon points='%,%  %,%  %,%' \\n\" v1.x v1.y v2.x v2.y v3.x v3.y to:theSVGfile\n\t\t\tformat \"\\tstyle='stroke:%; fill:%; stroke-width:%'/>\\n\" (ColourToHex theStrokeColour) (ColourToHex theFillColour) theStrokeThickness to:theSVGfile\t\t\t\n\t\t)--end if normal positive\n\t)--end f loop\n)--end o loop\n\nformat \"</svg>\\n\" to:theSVGfile\nclose theSVGfile\nlocal theSVGMap = VectorMap vectorFile:theFileName alphasource:0\nlocal theBitmap = bitmap theViewSize.x theViewSize.y\nrenderMap theSVGMap into:theBitmap filter:true\ndisplay theBitmap\nformat \"Render Time: % sec.\\n\" ((timestamp()-st)/1000.0)\n"
  },
  {
    "path": "src/test/resources/samples/langs/MAXScript/volume-calc.ms",
    "content": "fn CalculateVolumeAndCentreOfMass obj =\n(\n\tlocal Volume= 0.0\n\tlocal Centre= [0.0, 0.0, 0.0]\n\tlocal theMesh = snapshotasmesh obj\n\tlocal numFaces = theMesh.numfaces\n\tfor i = 1 to numFaces do\n\t(\n\t\tlocal Face= getFace theMesh i\n\t\tlocal vert2 = getVert theMesh Face.z\n\t\tlocal vert1 = getVert theMesh Face.y\n\t\tlocal vert0 = getVert theMesh Face.x\n\t\tlocal dV = Dot (Cross (vert1 - vert0) (vert2 - vert0)) vert0\n\t\tVolume+= dV\n\t\tCentre+= (vert0 + vert1 + vert2) * dV\n\t)\n\tdelete theMesh\n\tVolume /= 6\n\tCentre /= 24\n\tCentre /= Volume\n\t#(Volume,Centre)\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/MQL4/header-sample.mqh",
    "content": "//+------------------------------------------------------------------+\r\n//|                                                header-sample.mqh |\r\n//|                                   Copyright 2016, Andrey Osorgin |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\n#property strict\r\n//+------------------------------------------------------------------+\r\n//|                                                                  |\r\n//+------------------------------------------------------------------+\r\nclass CSomeObject\r\n  {\r\nprotected:\r\n   int               m_someproperty;\r\nprivate:\r\n   bool              SomeFunction() {return true;}\r\npublic:\r\n                     CSomeObject(void): m_someproperty(0) {}\r\n                    ~CSomeObject(void)                    {}\r\n   void              SetName(int n){m_someproperty=n;}// sets somepropery\r\n   int               GetName(){return(m_someproperty);} // returns someproperty\r\n  };\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/MQL4/indicator-sample.mq4",
    "content": "//+------------------------------------------------------------------+\r\n//|                                             indicator-sample.mq4 |\r\n//|                                   Copyright 2016, Andrey Osorgin |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\n#property version   \"1.00\"\r\n#property strict\r\n\r\n#property indicator_chart_window\r\n#property indicator_plots 0\r\n//+------------------------------------------------------------------+\r\n//| Custom indicator initialization function                         |\r\n//+------------------------------------------------------------------+\r\nvoid OnInit(void)\r\n  {\r\n //---\r\n   }\r\n//+------------------------------------------------------------------+\r\n//| Bears Power                                                      |\r\n//+------------------------------------------------------------------+\r\nint OnCalculate(const int rates_total,\r\n                const int prev_calculated,\r\n                const datetime &time[],\r\n                const double &open[],\r\n                const double &high[],\r\n                const double &low[],\r\n                const double &close[],\r\n                const long &tick_volume[],\r\n                const long &volume[],\r\n                const int &spread[])\r\n  {\r\n  Print(\"The number of bars on the current chart: \",iBars(Symbol(),Period()));\r\n//---\r\n   return(rates_total);\r\n  }\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/MQL4/script-sample.mq4",
    "content": "//+------------------------------------------------------------------+\r\n//|                                                script-sample.mq4 |\r\n//|                                   Copyright 2016, Andrey Osorgin |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\n#property version   \"1.00\"\r\n#property strict\r\n#property script_show_inputs\r\n\r\ninput int StopLoss=100; //Stop Loss\r\ninput int TakeProfit=100; //Take Profit\r\n//+------------------------------------------------------------------+\r\n//| Script program start function                                    |\r\n//+------------------------------------------------------------------+\r\nvoid OnStart()\r\n  {\r\n   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);\r\n   Print(\"Minimum Stop Level=\",minstoplevel,\" points\");\r\n//---\r\n   double sl=NormalizeDouble(Bid-StopLoss*Point,Digits);\r\n   double tp=NormalizeDouble(Ask+TakeProfit*Point,Digits);\r\n//---\r\n   int result=OrderSend(Symbol(),OP_BUY,0.01,Ask,1,sl,tp,\"Test\",0,0,clrNONE);\r\n   Print(\"Success? \",result);\r\n  }\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/MQL5/Regex.mqh",
    "content": "//+------------------------------------------------------------------+\r\n//|                                               Regular Expression |\r\n//|                        Copyright 2016, MetaQuotes Software Corp. |\r\n//|                                             https://www.mql5.com |\r\n//+------------------------------------------------------------------+\r\n//| Regular Expression Library from .NET Framework 4.6.1 implemented |\r\n//| in MetaQuotes Language 5 (MQL5)                                  |\r\n//| Original sources at https://github.com/Microsoft/referencesource |\r\n//|                                                                  |\r\n//| The capabilities of the Regular Expression Library include:      |\r\n//| - Lazy quantifiers                                               |\r\n//| - Positive and negative lookbehind                               |\r\n//| - Conditional evaluation                                         |\r\n//| - Balancing group definitions                                    |\r\n//| - Nonbacktracking subexpressions                                 |\r\n//| - Right-to-left matching                                         |\r\n//|                                                                  |\r\n//| If you find any functional differences between Regular Expression|\r\n//| Library for MQL5 and the original .NET Framework 4.6.1 project,  |\r\n//| please contact developers of MQL5 on the Forum at www.mql5.com.  |\r\n//|                                                                  |\r\n//| You can report bugs found in the computational algorithms of the |\r\n//| Regular Expression Library from .Net Framework 4.6.1 by notifying|\r\n//| the project coordinators.                                        |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\nclass Match;\r\nclass MatchCollection;\r\nclass CachedCodeEntry;\r\nclass ReplacementReference;\r\nclass RunnerReference;\r\nclass RegexRunner;\r\n//+------------------------------------------------------------------+\r\n//| Callback class.                                                  |\r\n//+------------------------------------------------------------------+\r\ntypedef string(*MatchEvaluator)(Match*);\r\n#include <Internal\\TimeSpan\\TimeSpan.mqh>\r\n#include <Internal\\Generic\\LinkedList.mqh>\r\n#include <Internal\\Generic\\Dictionary.mqh>\r\n#include \"RegexOptions.mqh\"\r\n#include \"RegexCode.mqh\"\r\n#include \"RegexTree.mqh\"\r\n#include \"RegexParser.mqh\"\r\n#include \"RegexReplacement.mqh\"\r\n#include \"RegexWriter.mqh\"\r\n#include \"RegexMatchCollection.mqh\"\r\n#include \"RegexRunner.mqh\"\r\n#include \"RegexInterpreter.mqh\"\r\n//+------------------------------------------------------------------+\r\n//| Purpose: The Regex class represents a single compiled instance of| \r\n//| a regular expression.                                            |\r\n//+------------------------------------------------------------------+\r\n//+------------------------------------------------------------------+\r\n//| Represents an immutable, compiled regular expression. Also       |\r\n//| contains static methods that allow use of regular expressions    |\r\n//| without instantiating a Regex explicitly.                        |\r\n//+------------------------------------------------------------------+\r\nclass Regex\r\n  {\r\nprotected:\r\n   string            m_pattern;\r\n   RegexOptions      m_roptions;\r\nprivate:\r\n   static const TimeSpan MaximumMatchTimeout;\r\npublic:\r\n   static const TimeSpan InfiniteMatchTimeout;\r\nprotected:\r\n   TimeSpan          m_internalMatchTimeout;// timeout for the execution of this regex\r\nprivate:\r\n   static const string DefaultMatchTimeout_ConfigKeyName;\r\npublic:\r\n   static const TimeSpan FallbackDefaultMatchTimeout;\r\n   static const TimeSpan DefaultMatchTimeout;\r\nprotected:\r\n   Dictionary<int,int>*m_caps;        // if captures are sparse, this is the hashtable capnum->index\r\n   Dictionary<string,int>*m_capnames; // if named captures are used, this maps names->index\r\n   string            m_capslist[];    // if captures are sparse or named captures are used, this is the sorted list of names\r\n   int               m_capsize;       // the size of the capture array\r\n   RegexTree        *m_tree;\r\n   RunnerReference *m_runnerref;      // cached runner\r\n   ReplacementReference*m_replref;    // cached parsed replacement pattern\r\n   RegexCode        *m_code;          // if interpreted, this is the code for RegexIntepreter\r\n   bool              m_refsInitialized;// Default is false\r\n   static            LinkedList<CachedCodeEntry*>m_livecode;// the cached of code that are currently loaded\r\n   static int        m_cacheSize;     // Default is 15\r\npublic:\r\n   static const int  MaxOptionShift;\r\npublic:\r\n   //--- Constructors:\r\n   //+------------------------------------------------------------------+\r\n   //| Initializes a new instance of the Regex class.                   |\r\n   //+------------------------------------------------------------------+\r\n                     Regex() : m_refsInitialized(false)\r\n     {\r\n      this.m_internalMatchTimeout=DefaultMatchTimeout;\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Creates and compiles a regular expression object for the         |\r\n   //| specified regular expression.                                    |\r\n   //+------------------------------------------------------------------+\r\n                     Regex(const string pattern) : m_refsInitialized(0)\r\n     {\r\n      Initialize(pattern,None,DefaultMatchTimeout,false);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Creates and compiles a regular expression object for the         |\r\n   //| specified regular expression with options that modify the        |\r\n   //| pattern.                                                         |\r\n   //+------------------------------------------------------------------+\r\n                     Regex(const string pattern,RegexOptions options) : m_refsInitialized(0)\r\n     {\r\n      Initialize(pattern,options,DefaultMatchTimeout,false);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Initializes a new instance of the Regex class for the specified  |\r\n   //| regular expression,with options that modify the pattern and a    |\r\n   //| value that specifies how long a pattern matching method should   |\r\n   //| attempt a match before it times out.                             |\r\n   //+------------------------------------------------------------------+\r\n                     Regex(const string pattern,RegexOptions options,const TimeSpan &matchTimeout) : m_refsInitialized(0)\r\n     {\r\n      Initialize(pattern,options,matchTimeout,false);\r\n     }\r\n   //--- Destructors:     \r\n   //+------------------------------------------------------------------+\r\n   //| Destructor without parameters.                                   |\r\n   //+------------------------------------------------------------------+\r\n                    ~Regex()\r\n     {\r\n      if(CheckPointer(m_tree)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_tree;\r\n        }\r\n      if(CheckPointer(m_caps)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_caps;\r\n        }\r\n      bool deleteRun=true;\r\n      bool deleteRepl = true;\r\n      bool deleteCode = true;\r\n      for(LinkedListNode<CachedCodeEntry*>*current=m_livecode.First(); current!=NULL; current=current.Next())\r\n        {\r\n         if(CheckPointer(current.Value())==POINTER_DYNAMIC)\r\n           {\r\n            if(current.Value().RunnerRef()==m_runnerref)\r\n              {\r\n               deleteRun=false;\r\n              }\r\n            if(current.Value().ReplRef()==m_replref)\r\n              {\r\n               deleteRepl=false;\r\n              }\r\n            if(current.Value().Code()==m_code)\r\n              {\r\n               deleteCode=false;\r\n              }\r\n           }\r\n        }\r\n      if(CheckPointer(m_replref)==POINTER_DYNAMIC && deleteRepl)\r\n        {\r\n         delete m_replref;\r\n        }\r\n      if(CheckPointer(m_runnerref)==POINTER_DYNAMIC && deleteRun)\r\n        {\r\n         delete m_runnerref;\r\n        }\r\n      if(CheckPointer(m_code)==POINTER_DYNAMIC && deleteCode)\r\n        {\r\n         delete m_code;\r\n        }\r\n     }\r\nprivate:\r\n   //+------------------------------------------------------------------+\r\n   //| General constructor with parameters.                             |\r\n   //+------------------------------------------------------------------+\r\n                     Regex(const string pattern,RegexOptions options,const TimeSpan &matchTimeout,const bool useCache) : m_refsInitialized(0)\r\n     {\r\n      Initialize(pattern,options,matchTimeout,useCache);\r\n     }\r\n   //--- Methods:\r\n   //+------------------------------------------------------------------+\r\n   //| Initialize.                                                      |\r\n   //+------------------------------------------------------------------+\r\n   void Initialize(const string pattern,RegexOptions options,const TimeSpan &matchTimeout,const bool useCache)\r\n     {\r\n      RegexTree *tree;\r\n      CachedCodeEntry *cached=NULL;\r\n      if(pattern==NULL)\r\n        {\r\n         Print(\"Argument 'pattern'= Null.\");\r\n         //--- return\r\n         return;\r\n        }\r\n      if(options<None || (((int) options)>>MaxOptionShift)!=0)\r\n        {\r\n         Print(\"Argument 'options' out of range.\");\r\n         //--- return \r\n         return;\r\n        }\r\n      if((options    &ECMAScript)!=0\r\n         && (options  &~(ECMAScript|IgnoreCase|Multiline\r\n         #ifdef _DEBUG\r\n         |Debug\r\n         #endif\r\n         ))!=0)\r\n        {\r\n         Print(\"Argument 'options' out of range\");\r\n         //--- return\r\n         return;\r\n        }\r\n      ValidateMatchTimeout(matchTimeout);\r\n      //--- Try to look up this regex in the cache.  We do this regardless of whether useCache is true since there's really no reason not to. \r\n      string key=IntegerToString(options)+\":\"+pattern;\r\n      cached=LookupCachedAndUpdate(key);\r\n      this.m_pattern=pattern;\r\n      this.m_roptions=options;\r\n      this.m_internalMatchTimeout=matchTimeout;\r\n      if(cached==NULL)\r\n        {\r\n         //--- Parse the input\r\n         tree=RegexParser::Parse(pattern,(RegexOptions)m_roptions);\r\n         //--- Extract the relevant information\r\n         m_capnames=tree.CapNames();\r\n         tree.GetCapsList(m_capslist);\r\n         m_code       = RegexWriter::Write(tree);\r\n         m_caps       = m_code.Caps();\r\n         m_capsize    = m_code.CapSize();\r\n         InitializeReferences();\r\n         m_tree=tree;\r\n         if(useCache)\r\n           {\r\n            cached=CacheCode(key);\r\n           }\r\n        }\r\n      else\r\n        {\r\n         m_caps       = cached.Caps();\r\n         m_capnames   = cached.CapNames();\r\n         cached.GetCapList(m_capslist);\r\n         m_capsize    = cached.CapSize();\r\n         m_code       = cached.Code();\r\n         m_runnerref  = cached.RunnerRef();\r\n         m_replref    = cached.ReplRef();\r\n         m_refsInitialized=true;\r\n        }\r\n     }\r\npublic:\r\n   //--- Methods:\r\n   //+------------------------------------------------------------------+\r\n   //| Pattern.                                                         |\r\n   //+------------------------------------------------------------------+\r\n   string Pattern()\r\n     {\r\n      //--- return pattern\r\n      return (m_pattern);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Validates that the specified match timeout value is valid.       |\r\n   //| The valid range is:                                              | \r\n   //| TimeSpan::Zero < matchTimeout <= Regex::MaximumMatchTimeout.     |\r\n   //+------------------------------------------------------------------+\r\n   static void ValidateMatchTimeout(const TimeSpan &matchTimeout)\r\n     {\r\n      if(InfiniteMatchTimeout==matchTimeout)\r\n        {\r\n         //--- return\r\n         return;\r\n        }\r\n      //--- Change this to make sure timeout is not longer then Environment.Ticks cycle length:\r\n      if(TimeSpan::Zero()<matchTimeout && matchTimeout<=MaximumMatchTimeout)\r\n        {\r\n         //--- return\r\n         return;\r\n        }\r\n      Print(\"Argument 'matchTimeout' out of range.\");\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Specifies the default RegEx matching timeout value (i.e. the     |\r\n   //| timeout that will be used if no explicit timeout is specified).  |\r\n   //+------------------------------------------------------------------+\r\n   static TimeSpan InitDefaultMatchTimeout()\r\n     {\r\n      //--- retrun result\r\n      return (FallbackDefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the runner reference.                                       |\r\n   //+------------------------------------------------------------------+\r\n   RunnerReference*RunnerReference()\r\n     {\r\n      //--- return runner reference\r\n      return (m_runnerref);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the weak reference.                                         |\r\n   //+------------------------------------------------------------------+\r\n   ReplacementReference*ReplacementReference()\r\n     {\r\n      //--- return week reference\r\n      return (m_replref);\r\n     };\r\n   Dictionary<int,int>*Caps()\r\n     {\r\n      //---\r\n      return (m_caps);\r\n     }\r\n   Dictionary<string,int>*CapNames()\r\n     {\r\n      //--- return \r\n      return (m_capnames);\r\n     }\r\n   int CapSize()\r\n     {\r\n      //--- \r\n      return (m_capsize);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns the options passed into the constructor.                 |\r\n   //+------------------------------------------------------------------+\r\n   RegexOptions Options()\r\n     {\r\n      //--- return\r\n      return (m_roptions);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Escape metacharacters within the string.                         |\r\n   //+------------------------------------------------------------------+\r\n   static string Escape(const string str)\r\n     {\r\n      if(StringLen(str)==NULL)\r\n        {\r\n         Print(\"Argument 'str' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return RegexParser::Escape(str);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Unescape character codes within the string.                      |\r\n   //+------------------------------------------------------------------+\r\n   static string Unescape(const string str)\r\n     {\r\n      if(StringLen(str)==NULL)\r\n        {\r\n         Print(\"Argument 'str' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return RegexParser::Unescape(str);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| CacheCount.                                                      |\r\n   //+------------------------------------------------------------------+\r\n   static int CacheCount()\r\n     {\r\n      //--- return count\r\n      return (m_livecode.Count());\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| CacheSize.                                                       |\r\n   //+------------------------------------------------------------------+\r\n   static int CacheSize()\r\n     {\r\n      //--- return size\r\n      return (m_cacheSize);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| CacheSize.                                                       |\r\n   //+------------------------------------------------------------------+\r\n   static void CacheSize(const int value)\r\n     {\r\n      if(value<0)\r\n        {\r\n         Print(\"Argument 'value' out of range.\");\r\n         //--- return\r\n         return;\r\n        }\r\n      m_cacheSize=value;\r\n      if(m_livecode.Count()>m_cacheSize)\r\n        {\r\n         while(m_livecode.Count()>m_cacheSize)\r\n           {\r\n            m_livecode.RemoveLast();\r\n           }\r\n        }\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| The match timeout used by this Regex instance.                   |\r\n   //+------------------------------------------------------------------+\r\n   TimeSpan MatchTimeout()\r\n     {\r\n      //--- return result\r\n      return (m_internalMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| True if the regex is leftward.                                   |\r\n   //|                                                                  |\r\n   //| Indicates whether the regular expression matches from right to   |\r\n   //| left.                                                            |\r\n   //+------------------------------------------------------------------+\r\n   bool RightToLeft()\r\n     {\r\n      //--- return result\r\n      return UseOptionR();\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns the regular expression pattern passed into the           |\r\n   //| constructor.                                                     |\r\n   //+------------------------------------------------------------------+\r\n   string ToString()\r\n     {\r\n      //--- return result\r\n      return (m_pattern);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns an array of the group names that are used to capture     |\r\n   //| groups in the regular expression. Only needed if the regex is not|\r\n   //| known until runtime, and one wants to extract captured groups.   |\r\n   //| (Probably unusual, but supplied for completeness.).              |\r\n   //+------------------------------------------------------------------+\r\n   void GetGroupNames(string &result[])\r\n     {\r\n      if(ArraySize(m_capslist)==NULL)\r\n        {\r\n         int max=m_capsize;\r\n         ArrayResize(result,max);\r\n         for(int i=0; i<max; i++)\r\n           {\r\n            result[i]=IntegerToString(i);\r\n           }\r\n        }\r\n      else\r\n        {\r\n         ArrayCopy(result,m_capslist,0,0);\r\n        }\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns an array of the group names that are used to capture     |\r\n   //| groups in the regular expression. Only needed if the regex is not|\r\n   //| known until runtime, and one wants to extract captured groups.   |\r\n   //| (Probably unusual, but supplied for completeness.).              |\r\n   //+------------------------------------------------------------------+\r\n   void GetGroupNumbers(int &result[])\r\n     {\r\n      if(m_caps==NULL)\r\n        {\r\n         int max=m_capsize;\r\n         ArrayResize(result,max);\r\n         for(int i=0; i<max; i++)\r\n           {\r\n            result[i]=i;\r\n           }\r\n        }\r\n      else\r\n        {\r\n         ArrayResize(result,m_caps.Count());\r\n         DictionaryEnumerator<int,int>*de=m_caps.GetEnumerator();\r\n         while(de.MoveNext())\r\n           {\r\n            result[(int)de.Value()]=(int)de.Key();\r\n           }\r\n         delete de;\r\n        }\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Given a group number, maps it to a group name. Note that nubmered|\r\n   //| groups automatically get a group name that is the decimal string |\r\n   //| equivalent of its number.                                        |\r\n   //+------------------------------------------------------------------+\r\n   string GroupNameFromNumber(const int index)\r\n     {\r\n      int i=index;\r\n      if(ArraySize(m_capslist)==NULL)\r\n        {\r\n         if(i>=0 && i<m_capsize)\r\n           {\r\n            //--- return result\r\n            return IntegerToString(i);\r\n           }\r\n         //--- return result\r\n         return (\"\");\r\n        }\r\n      else\r\n        {\r\n         if(m_caps!=NULL)\r\n           {\r\n            if(!m_caps.ContainsKey(i))\r\n              {\r\n               //--- return result\r\n               return (\"\");\r\n              }\r\n            i=m_caps[i];\r\n           }\r\n         if(i>=0 && i<ArraySize(m_capslist))\r\n           {\r\n            //--- return result\r\n            return (m_capslist[i]);\r\n           }\r\n         //--- return result\r\n         return (\"\");\r\n        }\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Given a group name, maps it to a group number. Note that nubmered|\r\n   //| groups automatically get a group name that is the decimal string |   \r\n   //| equivalent of its number.                                        |\r\n   //|                                                                  |\r\n   //| Returns -1 if the name is not a recognized group name.           |\r\n   //+------------------------------------------------------------------+\r\n   int GroupNumberFromName(const string name)\r\n     {\r\n      int result=-1;\r\n      if(name==NULL)\r\n        {\r\n         Print(\"Argument 'name' = NNULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- look up name if we have a hashtable of names\r\n      if(m_capnames!=NULL)\r\n        {\r\n         if(!m_capnames.ContainsKey(name))\r\n           {\r\n            //--- return result\r\n            return (-1);\r\n           }\r\n         //--- return result\r\n         return (m_capnames[name]);\r\n        }\r\n      //--- convert to an int if it looks like a number\r\n      result=0;\r\n      for(int i=0; i<StringLen(name); i++)\r\n        {\r\n         ushort ch=StringGetCharacter(name,i);\r\n         if(ch>'9' || ch<'0')\r\n           {\r\n            //--- return result\r\n            return (-1);\r\n           }\r\n         result *= 10;\r\n         result += (ch - '0');\r\n        }\r\n      //--- return int if it's in range\r\n      if(result>=0 && result<m_capsize)\r\n        {\r\n         //--- return result\r\n         return (result);\r\n        }\r\n      //--- return result\r\n      return (-1);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the input string for one or more occurrences of the text|\r\n   //| supplied in the pattern parameter.                               |\r\n   //+------------------------------------------------------------------+\r\n   static bool IsMatch(const string in,const string pattern)\r\n     {\r\n      //--- return result\r\n      return IsMatch(in, pattern, None, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more occurrences of the text   |\r\n   //| supplied in the pattern parameter.                               |\r\n   //+------------------------------------------------------------------+\r\n   static bool IsMatch(const string in,const string pattern,const RegexOptions options)\r\n     {\r\n      //--- return result\r\n      return IsMatch(in, pattern, options, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more occurrences of the text   |\r\n   //| supplied in the pattern parameter.                               |\r\n   //+------------------------------------------------------------------+\r\n   static bool IsMatch(const string in,const string pattern,const RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex regex(pattern,options,matchTimeout,true);\r\n      //--- return result\r\n      return (regex.IsMatch(in));\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more matches using the         |\r\n   //| previous pattern, options, and starting position.                |\r\n   //+------------------------------------------------------------------+\r\n   bool IsMatch(const string in)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return IsMatch(in, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more matches using the         |\r\n   //| previous pattern and options, with a new starting position.      |\r\n   //+------------------------------------------------------------------+\r\n   bool IsMatch(const string in,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      Match *run=Run(true,-1,in,0,StringLen(in),startat);\r\n      bool result=(NULL==run);\r\n      if(CheckPointer(run)==POINTER_DYNAMIC)\r\n        {\r\n         delete run;\r\n        }\r\n      //--- return result\r\n      return (result);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more occurrences of the text|\r\n   //| supplied in the pattern parameter.                               |\r\n   //+------------------------------------------------------------------+\r\n   static Match *Match(const string in,const string pattern)\r\n     {\r\n      //--- return result\r\n      return Regex::Match(in, pattern, None, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more occurrences of the text|\r\n   //| supplied in the pattern parameter. Matching is modified with an  |\r\n   //| option string.                                                   |\r\n   //+------------------------------------------------------------------+\r\n   static Match *Match(const string in,const string pattern,const RegexOptions options)\r\n     {\r\n      //--- return result\r\n      return Regex::Match(in, pattern, options, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more occurrences of the text|\r\n   //| supplied in the pattern parameter. Matching is modified with an  |\r\n   //| option string.                                                   |\r\n   //+------------------------------------------------------------------+\r\n   static Match *Match(string in,string pattern,RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex *regex=new Regex(pattern,options,matchTimeout,true);\r\n      //--- return result\r\n      return (regex.Match(in));\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Matches a regular expression with a string and returns the       |\r\n   //| precise result as a RegexMatch object.                           |\r\n   //+------------------------------------------------------------------+\r\n   Match *Match(const string in)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Regex::Match(in, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Matches a regular expression with a string and returns the       |\r\n   //| precise result as a RegexMatch object.                           |\r\n   //+------------------------------------------------------------------+\r\n   Match *Match(const string in,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Run(false, -1, in, 0, StringLen(in), startat);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Matches a regular expression with a string and returns the       |\r\n   //| precise result as a RegexMatch object.                           |\r\n   //+------------------------------------------------------------------+\r\n   Match *Match(const string in,const int beginning,const int length)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Run(false, -1, in, beginning, length, UseOptionR() ? beginning + length : beginning);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns all the successful matches as if Match was called        |\r\n   //| iteratively numerous times.                                      |\r\n   //+------------------------------------------------------------------+\r\n   static MatchCollection *Matches(const string in,const string pattern)\r\n     {\r\n      //--- return result\r\n      return Regex::Matches(in, pattern, None, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns all the successful matches as if Match was called        |\r\n   //| iteratively numerous times.                                      |\r\n   //+------------------------------------------------------------------+\r\n   static MatchCollection *Matches(const string in,const string pattern,const RegexOptions options)\r\n     {\r\n      //--- return result\r\n      return Regex::Matches(in, pattern, options, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns all the successful matches as if Match was called        |\r\n   //| iteratively numerous times.                                      |\r\n   //+------------------------------------------------------------------+\r\n   static MatchCollection *Matches(const string in,const string pattern,const RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex *regex=new Regex(pattern,options,matchTimeout,true);\r\n      //--- return result\r\n      return (regex.Matches(in));\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns all the successful matches as if Match was called        |\r\n   //| iteratively numerous times.                                      |\r\n   //+------------------------------------------------------------------+\r\n   MatchCollection *Matches(const string in)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Matches(in, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns all the successful matches as if Match was called        |\r\n   //| iteratively numerous times.                                      |\r\n   //+------------------------------------------------------------------+\r\n   MatchCollection *Matches(const string in,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return new MatchCollection(GetPointer(this), in, 0, StringLen(in), startat);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the pattern with the \"replacement\"   |\r\n   //| pattern, starting at the first character in the in string.       |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,const string replacement)\r\n     {\r\n      //--- return result\r\n      return Replace(in, pattern, replacement, None, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the \"replacement\" |\r\n   //| pattern, starting at the first character in the in string.       |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,const string replacement,const RegexOptions options)\r\n     {\r\n      //--- return result\r\n      return Replace(in, pattern, replacement, options, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the \"replacement\" |\r\n   //| pattern, starting at the first character in the in string.       |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,const string replacement,const RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex *regex = new Regex(pattern,options,matchTimeout,true);\r\n      string result=regex.Replace(in,replacement);\r\n      delete regex;\r\n      //--- return result\r\n      return (result);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern \" with the \"replacement\"|\r\n   //| pattern, starting at the first character in the in string, using |\r\n   //| the previous patten.                                             |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,const string replacement)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Replace(in, replacement, -1, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the (previously defined) \"pattern\"   |\r\n   //| with the \"replacement\" pattern, starting at the first character  |\r\n   //| in the in string.                                                |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,const string replacement,const int count)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Replace(in, replacement, count, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the recent        |\r\n   //| \"replacement\" pattern, starting at the character position        |\r\n   //| \"startat.\".                                                      |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,const string replacement,const int count,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'replacement' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- A little code to grab a cached parsed replacement object\r\n      RegexReplacement *repl=m_replref.Get();\r\n      if(repl==NULL || !(repl.Pattern()==replacement))\r\n        {\r\n         repl=RegexParser::ParseReplacement(replacement,m_caps,m_capsize,m_capnames,this.m_roptions);\r\n         if(CheckPointer(m_replref.Get())==POINTER_DYNAMIC)\r\n           {\r\n            delete m_replref.Get();\r\n           }\r\n         m_replref.Set(repl);\r\n        }\r\n      //--- return result\r\n      return repl.Replace(GetPointer(this), in, count, startat);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the \"replacement\" |\r\n   //| pattern \".\".                                                     |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,MatchEvaluator evaluator)\r\n     {\r\n      //--- return result\r\n      return Replace(in, pattern, evaluator, None, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern \" with the recent       |\r\n   //| \"replacement\" pattern, starting at the first character \".\".      |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,MatchEvaluator evaluator,const RegexOptions options)\r\n     {\r\n      //--- return result\r\n      return Replace(in, pattern, evaluator, options, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern \" with the recent       |\r\n   //| \"replacement\" pattern, starting at the first character \".\".      |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,MatchEvaluator evaluator,const RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex regex(pattern,options,matchTimeout,true);\r\n      string result=regex.Replace(in,evaluator);\r\n      //--- return result\r\n      return (result);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the recent        |\r\n   //| \"replacement\" pattern, starting at the first character position  |\r\n   //| \".\".                                                             |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,MatchEvaluator evaluator)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result  \r\n      return Replace(in, evaluator, -1, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the recent        |\r\n   //| \"replacement\" pattern, starting at the first character position  |\r\n   //| \".\".                                                             |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,MatchEvaluator evaluator,const int count)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result \r\n      return Replace(in, evaluator, count, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the (previouly defined) \"pattern\"    |\r\n   //| with the recent \"replacement\" pattern, starting at the character |\r\n   //| position \"startat.\"                                              |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,MatchEvaluator evaluator,const int count,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result \r\n      return RegexReplacement::Replace(evaluator, GetPointer(this), in, count, startat);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by \"pattern\".     |\r\n   //+------------------------------------------------------------------+\r\n   static void Split(string &result[],const string in,const string pattern)\r\n     {\r\n      Split(result,in,pattern,None,DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by \"pattern\".     |\r\n   //+------------------------------------------------------------------+\r\n   static void Split(string &result[],const string in,const string pattern,RegexOptions options)\r\n     {\r\n      Split(result,in,pattern,options,DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by \"pattern\".     |\r\n   //+------------------------------------------------------------------+\r\n   static void Split(string &result[],const string in,const string pattern,const RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex regex(pattern,options,matchTimeout,true);\r\n      regex.Split(result,in);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by a previous     |\r\n   //| \"pattern\".                                                       |\r\n   //+------------------------------------------------------------------+\r\n   void Split(string &result[],const string in)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return \r\n         return;\r\n        }\r\n      Split(result,in,0,UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by a previous     |\r\n   //| \"pattern\".                                                       |\r\n   //+------------------------------------------------------------------+\r\n   void Split(string &result[],const string in,const int count)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return \r\n         return;\r\n        }\r\n      RegexReplacement::Split(result,GetPointer(this),in,count,UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by a previous     |\r\n   //| \"pattern\".                                                       |\r\n   //+------------------------------------------------------------------+\r\n   void Split(string &result[],const string in,const int count,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return \r\n         return;\r\n        }\r\n      RegexReplacement::Split(result,GetPointer(this),in,count,startat);\r\n     }\r\nprotected:\r\n   //+------------------------------------------------------------------+\r\n   //| InitializeReferences.                                            |\r\n   //+------------------------------------------------------------------+\r\n   void InitializeReferences()\r\n     {\r\n      if(m_refsInitialized)\r\n        {\r\n         Print(\"Internal error! On file:'\"+__FILE__+\"'; in function:'\"+__FUNCTION__+\"'.\");\r\n         //--- return\r\n         return;\r\n        }\r\n      m_refsInitialized=true;\r\n      m_runnerref  = new RunnerReference();\r\n      m_replref    = new ReplacementReference();\r\n     }\r\npublic:\r\n   //+------------------------------------------------------------------+\r\n   //| Internal worker called by all the  APIs.                         |\r\n   //+------------------------------------------------------------------+\r\n   Match *Run(const bool quick,const int prevlen,const string in,const int beginning,const int length,const int startat)\r\n     {\r\n      Match *match;\r\n      RegexRunner *runner=NULL;\r\n      if(startat<0 || startat>StringLen(in))\r\n        {\r\n         Print(\"Argument 'start' out of range.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      if(length<0 || length>StringLen(in))\r\n        {\r\n         Print(\"Argument 'length' out of range.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      bool fromCache=false;\r\n      //--- There may be a cached runner; grab ownership of it if we can.\r\n      if(m_runnerref!=NULL)\r\n        {\r\n         fromCache=true;\r\n         runner=m_runnerref.Get();\r\n        }\r\n      //--- Create a RegexRunner instance if we need to\r\n      if(runner==NULL)\r\n        {\r\n         fromCache=false;\r\n         //--- Use the compiled RegexRunner factory if the code was compiled to MSIL\r\n         runner=new RegexInterpreter(m_code);\r\n        }\r\n      //--- Do the scan starting at the requested position            \r\n      match=runner.Scan(GetPointer(this),in,beginning,beginning+length,startat,prevlen,quick,m_internalMatchTimeout);\r\n      if(m_runnerref!=NULL && !fromCache)\r\n        {\r\n         if(CheckPointer(m_runnerref.Get())==POINTER_DYNAMIC)\r\n           {\r\n            delete m_runnerref.Get();\r\n           }\r\n         //--- Release or fill the cache slot\r\n         m_runnerref.Set(runner);\r\n        }\r\n      else if(!fromCache)\r\n        {\r\n         delete runner;\r\n        }\r\n#ifdef _DEBUG\r\n      if(Debug() && match!=NULL)\r\n        {\r\n         match.Dump();\r\n        }\r\n#endif\r\n      //--- return result\r\n      return (match);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Find code cache based on options+pattern.                        |\r\n   //+------------------------------------------------------------------+\r\n   static CachedCodeEntry *LookupCachedAndUpdate(const string key)\r\n     {\r\n      for(LinkedListNode<CachedCodeEntry*>*current=m_livecode.First(); current!=NULL; current=current.Next())\r\n        {\r\n         if(current.Value().Key()==key)\r\n           {\r\n            //--- If we find an entry in the cache, move it to the head at the same time. \r\n            m_livecode.Remove(current);\r\n            m_livecode.AddFirst(current);\r\n            //--- retrun result\r\n            return (current.Value());\r\n           }\r\n        }\r\n      //--- return result\r\n      return (NULL);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Add current code to the cache.                                   |\r\n   //+------------------------------------------------------------------+\r\n   CachedCodeEntry *CacheCode(const string key)\r\n     {\r\n      CachedCodeEntry *newcached=NULL;\r\n      //--- first look for it in the cache and move it to the head\r\n      for(LinkedListNode<CachedCodeEntry*>*current=m_livecode.First(); current!=NULL; current=current.Next())\r\n        {\r\n         if(current.Value().Key()==key)\r\n           {\r\n            m_livecode.Remove(current);\r\n            m_livecode.AddFirst(current);\r\n            //--- return result\r\n            return (current.Value());\r\n           }\r\n        }\r\n      //--- it wasn't in the cache, so we'll add a new one.  Shortcut out for the case where cacheSize is zero.\r\n      if(m_cacheSize!=0)\r\n        {\r\n         newcached=new CachedCodeEntry(key,m_capnames,m_capslist,m_code,m_caps,m_capsize,m_runnerref,m_replref);\r\n         m_livecode.AddFirst(newcached);\r\n         if(m_livecode.Count()>m_cacheSize)\r\n           {\r\n            m_livecode.RemoveLast();\r\n           }\r\n        }\r\n      //--- return result\r\n      return (newcached);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Delete all objects in cache.                                     |\r\n   //+------------------------------------------------------------------+\r\n   static void ClearCache()\r\n     {\r\n      IEnumerator<CachedCodeEntry*>*en=m_livecode.GetEnumerator();\r\n      while(en.MoveNext())\r\n        {\r\n         if(CheckPointer(en.Current())==POINTER_DYNAMIC)\r\n           {\r\n            if(CheckPointer(en.Current().RunnerRef().Get().RunRegex())==POINTER_DYNAMIC)\r\n              {\r\n               delete en.Current().RunnerRef().Get().RunRegex();\r\n              }\r\n            delete en.Current();\r\n           }\r\n        }\r\n      delete en;\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| True if the O option was set.                                    |\r\n   //+------------------------------------------------------------------+\r\n   bool UseOptionC()\r\n     {\r\n      return(m_roptions) != 0;\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| True if the L option was set.                                    |\r\n   //+------------------------------------------------------------------+\r\n   bool UseOptionR()\r\n     {\r\n      return(m_roptions & RightToLeft) != 0;\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| UseOptionInvariant.                                              |\r\n   //+------------------------------------------------------------------+\r\n   bool UseOptionInvariant()\r\n     {\r\n      return(m_roptions) != 0;\r\n     }\r\n#ifdef _DEBUG\r\n   //+------------------------------------------------------------------+\r\n   //| True if the regex has debugging enabled.                         |\r\n   //+------------------------------------------------------------------+\r\n   bool Debug()\r\n     {\r\n      //--- return result\r\n      return((m_roptions &Debug) != 0);\r\n     }\r\n#endif\r\n  };\r\nstatic const TimeSpan   Regex::MaximumMatchTimeout=TimeSpan::FromMilliseconds(Int32::MaxValue-1);\r\nstatic const TimeSpan   Regex::InfiniteMatchTimeout(0,0,0,0,-1);\r\nstatic const string Regex::DefaultMatchTimeout_ConfigKeyName=\"REGEX_DEFAULT_MATCH_TIMEOUT\";\r\nstatic const TimeSpan   Regex::FallbackDefaultMatchTimeout=Regex::InfiniteMatchTimeout;\r\nstatic const TimeSpan   Regex::DefaultMatchTimeout=Regex::InitDefaultMatchTimeout();\r\nstatic LinkedList<CachedCodeEntry*>Regex::m_livecode();\r\nstatic int Regex::m_cacheSize=15;\r\nstatic const int Regex::MaxOptionShift=10;\r\n//+------------------------------------------------------------------+\r\n//| Purpose: Used to cache byte codes or compiled factories.         |\r\n//+------------------------------------------------------------------+\r\nclass CachedCodeEntry : public IComparable\r\n  {\r\nprivate:\r\n   string            m_key;\r\n   RegexCode        *m_code;\r\n   Dictionary<int,int>*m_caps;\r\n   Dictionary<string,int>*m_capnames;\r\n   string            m_capslist[];\r\n   int               m_capsize;\r\n   RunnerReference *m_runnerref;\r\n   ReplacementReference *m_replref;\r\npublic:\r\n   //--- Constructors:\r\n   //+------------------------------------------------------------------+\r\n   //| Constructor with parameters.                                     |\r\n   //+------------------------------------------------------------------+\r\n                     CachedCodeEntry(const string key,Dictionary<string,int>*capnames,const string &capslist[],\r\n                                                       RegexCode *code,Dictionary<int,int>*caps,const int capsize,\r\n                                                       RunnerReference *runner,ReplacementReference *repl)\r\n     {\r\n      m_key=key;\r\n      m_capnames=capnames;\r\n      ArrayCopy(m_capslist,capslist);\r\n      m_code= code;\r\n      m_caps= caps;\r\n      m_capsize=capsize;\r\n      m_runnerref=runner;\r\n      m_replref=repl;\r\n     }\r\n   //--- Destructors:\r\n   //+------------------------------------------------------------------+\r\n   //| destructor without parameters.                                   |\r\n   //+------------------------------------------------------------------+\r\n                    ~CachedCodeEntry()\r\n     {\r\n      if(CheckPointer(m_code)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_code;\r\n        }\r\n      if(CheckPointer(m_caps)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_caps;\r\n        }\r\n      if(CheckPointer(m_capnames)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_capnames;\r\n        }\r\n      if(CheckPointer(m_replref)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_replref;\r\n        }\r\n      if(CheckPointer(m_runnerref)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_runnerref;\r\n        }\r\n     }\r\n   //--- Methods:\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the runnerref.                                              |\r\n   //+------------------------------------------------------------------+\r\n   RunnerReference *RunnerRef()\r\n     {\r\n      //--- reurn runnerref\r\n      return (m_runnerref);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the replref.                                                |\r\n   //+------------------------------------------------------------------+\r\n   ReplacementReference *ReplRef()\r\n     {\r\n      //--- return replref\r\n      return (m_replref);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the key.                                                    |\r\n   //+------------------------------------------------------------------+\r\n   string Key()\r\n     {\r\n      //--- return key\r\n      return (m_key);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the caps.                                                   |\r\n   //+------------------------------------------------------------------+\r\n   Dictionary<int,int>*Caps()\r\n     {\r\n      //--- return caps\r\n      return (m_caps);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the capnames.                                               |\r\n   //+------------------------------------------------------------------+\r\n   Dictionary<string,int>*CapNames()\r\n     {\r\n      //--- return capnames\r\n      return (m_capnames);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the capsize.                                                |\r\n   //+------------------------------------------------------------------+\r\n   int CapSize()\r\n     {\r\n      //--- retrun capsize\r\n      return (m_capsize);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the code.                                                   |\r\n   //+------------------------------------------------------------------+\r\n   RegexCode *Code()\r\n     {\r\n      //--- return code\r\n      return (m_code);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the caplist.                                                |\r\n   //+------------------------------------------------------------------+\r\n   void GetCapList(string &array[])\r\n     {\r\n      ArrayCopy(array,m_capslist);\r\n     }\r\n  };\r\n//+------------------------------------------------------------------+\r\n//| Used to cache a weak reference in a threadsafe way.              |\r\n//+------------------------------------------------------------------+\r\nclass ReplacementReference\r\n  {\r\nprivate:\r\n   RegexReplacement *m_obj;\r\npublic:\r\n   //--- Destructors:\r\n   //+------------------------------------------------------------------+\r\n   //| Destructor without parameters.                                   |\r\n   //+------------------------------------------------------------------+   \r\n                    ~ReplacementReference()\r\n     {\r\n      if(CheckPointer(m_obj)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_obj;\r\n        }\r\n     }\r\n   //--- Methods:\r\n   //+------------------------------------------------------------------+\r\n   //| Get RegexReplacement.                                            |\r\n   //+------------------------------------------------------------------+\r\n   RegexReplacement *Get()\r\n     {\r\n      //--- return pointer\r\n      return (m_obj);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Set RegexReplacement.                                            |\r\n   //+------------------------------------------------------------------+\r\n   void      Set(RegexReplacement *obj)\r\n     {\r\n      m_obj=obj;\r\n     }\r\n  };\r\n//+------------------------------------------------------------------+\r\n//| Used to cache one exclusive runner reference.                    |\r\n//+------------------------------------------------------------------+\r\nclass RunnerReference\r\n  {\r\nprivate:\r\n   RegexRunner      *m_obj;\r\npublic:\r\n   //--- Destructors:\r\n   //+------------------------------------------------------------------+\r\n   //| Destructor without parameters.                                   |\r\n   //+------------------------------------------------------------------+   \r\n                    ~RunnerReference()\r\n     {\r\n      if(CheckPointer(m_obj)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_obj;\r\n        }\r\n     }\r\n   //--- Methods:\r\n   //+------------------------------------------------------------------+\r\n   //| Get RegexRunner.                                                 |\r\n   //+------------------------------------------------------------------+\r\n   RegexRunner *Get()\r\n     {\r\n      //--- return pointer\r\n      return (m_obj);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Set RegexRunner.                                                 |\r\n   //+------------------------------------------------------------------+\r\n   void Set(RegexRunner *obj)\r\n     {\r\n      m_obj=obj;\r\n     }\r\n  };\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/MQL5/indicator-sample.mq5",
    "content": "//+------------------------------------------------------------------+\r\n//|                                             indicator-sample.mq5 |\r\n//|                                   Copyright 2016, Andrey Osorgin |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\n#property version   \"1.00\"\r\n\r\n#property indicator_chart_window\r\n#property indicator_plots   0\r\n//+------------------------------------------------------------------+\r\n//| Custom indicator initialization function                         |\r\n//+------------------------------------------------------------------+\r\nint OnInit()\r\n  {\r\n//---\r\n   return(INIT_SUCCEEDED);\r\n  }\r\n//+------------------------------------------------------------------+\r\n//| Custom indicator iteration function                              |\r\n//+------------------------------------------------------------------+\r\nint OnCalculate(const int rates_total,\r\n                const int prev_calculated,\r\n                const datetime &time[],\r\n                const double &open[],\r\n                const double &high[],\r\n                const double &low[],\r\n                const double &close[],\r\n                const long &tick_volume[],\r\n                const long &volume[],\r\n                const int &spread[])\r\n  {\r\n//---\r\n   int bars=Bars(Symbol(),0);\r\n   Print(\"Bars = \",bars,\", rates_total = \",rates_total,\",  prev_calculated = \",prev_calculated);\r\n   Print(\"time[0] = \",time[0],\" time[rates_total-1] = \",time[rates_total-1]);\r\n//--- return value of prev_calculated for next call\r\n   return(rates_total);\r\n  }\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/MQL5/script-sample.mq5",
    "content": "//+------------------------------------------------------------------+\r\n//|                                                script-sample.mq5 |\r\n//|                                   Copyright 2016, Andrey Osorgin |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\n#property version   \"1.00\"\r\n#property script_show_inputs\r\n\r\n#include <Trade\\Trade.mqh>\r\n\r\ninput int StopLoss=100; // Stop Loss\r\ninput int TakeProfit=100; // Take Profit\r\n//+------------------------------------------------------------------+\r\n//| Script program start function                                    |\r\n//+------------------------------------------------------------------+\r\nvoid OnStart()\r\n  {\r\n   CTrade trade;\r\n//---\r\n   long stoplevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);\r\n   Print(\"Minimum stop level is: \",stoplevel);\r\n   double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);\r\n   double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);\r\n   double sl = NormalizeDouble(bid - StopLoss*Point(),Digits());\r\n   double tp = NormalizeDouble(ask + TakeProfit*Point(),Digits());\r\n//---\r\n   bool result=trade.Buy(0.01,Symbol(),ask,sl,tp,\"test\");\r\n//---\r\n   Print(\"Success? \",result);\r\n  }\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/MTML/categories_to_columns.mtml",
    "content": "<$mt:Var name=\"num_cols\" value=\"6\"$>\n<$mt:Var name=\"index\" value=\"0\"$>\n<mt:Categories>\n  <$mt:Var name=\"index\" op=\"++\" setvar=\"index\"$>\n  <mt:SetVarBlock name=\"categories{$index}\">\n    <a href=\"<$mt:CategoryArchiveLink$>\"><$mt:CategoryLabel remove_html=\"1\"$></a>\n  </mt:SetVarBlock>\n</mt:Categories>\n<$mt:Var name=\"categories\" function=\"count\" setvar=\"cat_count\"$>\n<$mt:Var name=\"cat_count\" op=\"%\" value=\"$num_cols\" setvar=\"modulus\"$>\n<mt:If name=\"modulus\" gt=\"0\">\n  <$mt:Var name=\"cat_count\" op=\"-\" value=\"$modulus\" setvar=\"cat_count_minus_mod\"$>\n  <$mt:Var name=\"cat_count_minus_mod\" op=\"/\" value=\"$num_cols\" setvar=\"cats_per_col\"$>\n  <$mt:Var name=\"cats_per_col\" op=\"+\" value=\"1\" setvar=\"cats_per_col\"$>\n<mt:Else>\n  <$mt:Var name=\"cat_count\" op=\"/\" value=\"$num_cols\" setvar=\"cats_per_col\"$>\n</mt:If>\n<mt:SetVarTemplate name=\"for_inner\">\n  <$mt:Var name=\"index\" op=\"++\" setvar=\"index\"$>\n  <mt:Unless name=\"index\" gt=\"$cat_count\">\n    <$mt:Var name=\"categories{$index}\"$>\n  </mt:Unless>\n</mt:SetVarTemplate>\n\n<$mt:Var name=\"index\" value=\"0\"$>\n<$mt:Var name=\"col_num\" value=\"1\"$>\n<mt:For from=\"1\" to=\"$num_cols\">\n  <div class=\"col<$mt:Var name=\"col_num\"$>\">\n    <mt:For from=\"1\" to=\"$cats_per_col\">\n      <$mt:Var name=\"for_inner\"$>\n    </mt:For>\n  </div>\n  <$mt:Var name=\"col_num\" op=\"++\" setvar=\"col_num\"$>\n</mt:For>\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/MUF/39.m",
    "content": "$include $lib/strings\n$include $lib/match\nlvar check-obj-addr\n   \n: check-next-loop (d -- )\n   dup not if pop exit then\n   dup exit? over thing? or\n   me @ 3 pick .controls and if\n      dup check-obj-addr @ execute\n   then\n   next check-next-loop\n;\n   \n: check-contents (d -- )\n   contents check-next-loop\n;\n   \n: check-exits (d -- )\n   exits check-next-loop\n;\n   \n: exec-err (d mtypestr warnstr -- )\n   \"On \" 4 rotate unparseobj strcat\n   \", in it's \" strcat rot strcat\n   \", \" strcat swap strcat .tell\n;\n   \n: can-linkto? (player object -- i)\n   dup \"link_ok\" flag? if pop pop 1 exit then\n   .controls\n;\n   \n: check-exec (d mtype execstr -- )\n   dup \"@\" 1 strncmp if pop pop pop exit then\n   1 strcut swap pop\n   \" \" .split pop\n   dup \"$\" 1 strncmp not if\n      dup match ok? not if\n         \" is not a known registered program.\" strcat\n         exec-err exit\n      then\n      dup match program? not if\n         \" is not a program.\" strcat\n         exec-err exit\n      then\n      3 pick owner over match can-linkto? not if\n         \" is not Link_OK.\" strcat\n         exec-err exit\n      then\n   else\n      dup number? not if\n         \" is not a program dbref.\" strcat\n         \"@\" swap strcat exec-err exit\n      then\n      dup atoi dbref ok? not if\n         \" is not a valid program reference.\" strcat\n         \"@\" swap strcat exec-err exit\n      then\n      dup atoi dbref program? not if\n         \" is not a valid program reference.\" strcat\n         \"@\" swap strcat exec-err exit\n      then\n      3 pick owner over atoi dbref can-linkto? not if\n         \" is not Link_OK.\" strcat\n         \"@\" swap strcat exec-err exit\n      then\n   then\n   pop pop pop\n;\n   \n   \n: missing-err ( d s -- )\n   swap unparseobj\n   \" is missing an \"\n   strcat swap strcat\n   \" message.\" strcat .tell\n;\n   \n: colon-err ( d s -- )\n   swap unparseobj\n   \" has an unnecesary ':' at the start of its \"\n   strcat swap strcat\n   \" message.\" strcat .tell\n;\n   \n: check-desc (d -- )\n   dup desc not if\n      \"@description\" missing-err\n   else\n      \"@description\" over\n      desc check-exec\n   then\n;\n   \n: check-succ (d -- )\n   dup succ not if\n      \"@success\" missing-err\n   else\n      \"@success\" over\n      succ check-exec\n   then\n;\n   \n: check-fail (d -- )\n   dup fail not if\n      \"@fail\" missing-err\n   else\n      \"@fail\" over\n      fail check-exec\n   then\n;\n   \n: check-drop (d -- )\n   dup drop not if\n      \"@drop\" missing-err\n   else\n      \"@drop\" over\n      drop check-exec\n   then\n;\n   \n: check-osucc (d -- )\n   dup osucc not if\n      \"@osuccess\" missing-err\n   else\n      dup osucc \":\" 1 strncmp not if\n         \"@osuccess\" colon-err\n      else pop\n      then\n   then\n;\n   \n: check-ofail (d -- )\n   dup ofail not if\n      \"@ofail\" missing-err\n   else\n      dup ofail \":\" 1 strncmp not if\n         \"@ofail\" colon-err\n      else pop\n      then\n   then\n;\n   \n: check-odrop (d -- )\n   dup odrop not if\n      \"@odrop\" missing-err\n   else\n      dup odrop \":\" 1 strncmp not if\n         \"@odrop\" colon-err\n      else pop\n      then\n   then\n;\n   \n   \n$define islocked? (d -- i) getlockstr \"*UNLOCKED*\" stringcmp $enddef\n   \n: islocked_always? (d -- i)\n   getlockstr dup \"#0\" stringcmp not if pop 1 exit then\n   dup \"#\" STRsplit swap pop atoi\n   \"#\" swap intostr strcat\n   (lockstr \"#dbref\")\n   dup \"&!\" over strcat strcat\n   3 pick stringcmp not if pop pop 1 exit then\n   \"&\" over strcat strcat \"!\" swap strcat\n   stringcmp not if 1 exit then\n   0\n;\n   \n: check-link ( d -- )\n   dup getlink not if\n      dup unparseobj \" is unlinked.\" strcat .tell\n   else\n      dup getlink over location dbcmp if\n         dup islocked? not if\n            dup unparseobj\n            \" is linked to it's location, but is unlocked.\"\n            strcat .tell\n         then\n      else (is not linked to it's location)\n         dup getlink program? if\n            dup dup owner swap getlink can-linkto? not if\n               dup unparseobj\n               \" is linked to a program which is not Link_OK.\"\n               strcat .tell\n            then\n         then\n      then\n   then\n   pop\n;\n         \n: check-room (d -- )\n   dup check-desc\n   dup islocked? if\n      dup islocked_always? not if\n         dup check-succ\n      then\n      dup check-fail\n   then\n   dup getlink if\n      dup check-drop\n      dup check-odrop\n   then\n   dup check-contents\n   check-exits\n;\n   \n: check-exit ( d -- )\n   dup check-link\n   dup check-desc\n   dup getlink dup ok? if\n      program? not if\n         dup islocked_always? not if\n            dup check-succ\n            dup check-osucc\n            dup check-odrop\n         then\n         dup islocked? if\n            dup check-fail\n            dup check-ofail\n         then\n      then\n   else pop\n   then\n   pop\n;\n   \n: check-thing ( d -- )\n   dup check-desc\n   dup islocked_always? not if\n      dup check-succ\n      dup check-osucc\n   then\n   dup islocked? if\n      dup check-fail\n      dup check-ofail\n   then\n   dup check-drop\n   dup check-odrop\n   check-exits\n;\n   \n: check-player ( d -- )\n   dup check-desc\n   dup islocked_always? not if\n      dup check-succ\n      dup check-osucc\n   then\n   dup islocked? if\n      dup check-fail\n      dup check-ofail\n   then\n   dup check-contents\n   check-exits\n;\n   \n: check-program ( d -- )\n   check-desc\n;\n   \n: check-obj (d -- )\n   dup room?   if check-room   exit then\n   dup exit?   if check-exit   exit then\n   dup thing?  if check-thing  exit then\n   dup player? if check-player exit then\n   check-program\n;\n   \n: main\n   'check-obj check-obj-addr !\n   .strip dup not if pop \"here\" then\n   .match_controlled\n   dup #-3 dbcmp if pop me @ getlink then\n   dup ok? not if pop exit then\n   check-obj\n   me @ \"Check done.\" notify\n;\n"
  },
  {
    "path": "src/test/resources/samples/langs/MUF/cmd-say.muf",
    "content": "@program cmd-say.muf\n1 1000 d\ni\n( cmd-say.muf by Natasha@HLM\n\n  Copyright 2002-2004 Natasha Snunkmeox. Copyright 2002-2004 Here Lie Monsters.\n  \"@view $box/mit\" for license information.\n)\n$author Natasha Snunkmeox <natmeox@neologasm.org>\n$note Say for Fuzzball 6.\n$version 1.0\n\n$include $lib/ignore\n$include $lib/strings\n$include $lib/match\n\n$def str_program \"saypose\"\n$def prop_third \"_prefs/say/third\"\n$def prop_quotes \"_say/def/quotes\"\n$def prop_overb \"_say/def/osay\"\n$def prop_verb \"_say/def/say\"\n$def prop_split \"_prefs/say/split\"\n$def prop_color \"_prefs/say/color\"\n$def prop_meow \"_prefs/say/meow\"\n\nlvar randomWord\n\nlvar verb\nlvar overb\nlvar lquo\nlvar rquo\nlvar splitsay\n\n: rtn-getThirdVerb[ var:overb -- ]\n    ( Get the third-person verb. )\n    me @ prop_overb getpropstr dup if  ( str strOverb )\n        strip dup dup \",\" instr not and if \",\" strcat then\n    else pop \"says,\" then  ( str strOverb )\n    me @ \"%D %s\" fmtstring overb @ !  ( str )\n;\n\n: rtn-getFirstVerb[ var:verb var:overb -- ]\n    me @ prop_third getpropstr .yes? not if  ( str )\n        ( Get the first-person verb. )\n        me @ prop_verb getpropstr dup if  ( str strVerb )\n            strip dup dup \",\" instr not and if \",\" strcat then\n        else pop \"say,\" then  ( str strVerb )\n        splitsay @ if \"you %s\" else \"You %s\" then fmtstring  ( str strVerb )\n    else overb @ @ then verb @ !  ( str )\n;\n\n: rtn-getQuotes[ var:lquo var:rquo -- ]\n    me @ prop_quotes getpropstr dup \"%m\" instr if  ( strQuotes )\n        \"%m\" split  ( strLquo strRquo )\n    else pop \"\\\"\" dup then  ( strLquo strRquo )\n    rquo @ ! lquo @ !  (  )\n;\n\n: do-say  ( str -- )\n    \"\" randomWord !\n\n    var who\n    var exclude\n\n    ( Ignoring? Get 'em outta here. )\n    loc @ contents_array  ( str arrHere )\n    dup me @ str_program array_get_ignorers  ( str arrHere arrIgnorers )\n    dup exclude !\n    swap array_diff who !\n\n\n    ( Anyone #meowing this player? Go ahead and notify before special formatting. )\n    who @ prop_meow me @ owner \"*{%d}*\" fmtstring array_filter_prop  ( str arrMeow )\n    dup if  ( str arrMeow )\n        dup who @ array_diff who !  ( str arrMeow )\n        dup exclude @ array_union exclude !  ( str arrMeow )\n\n        over ansi_strip  ( str arrMeow str )\n        \"\\\\b[A-Z0-9_]+\\\\b\" \"MEOW\" REG_ALL regsub  ( str arrMeow str' )\n        \"\\\\b[A-Z0-9_][A-Za-z0-9_]*[a-z][A-Za-z0-9_]*\\\\b\" \"Meow\" REG_ALL regsub  ( str arrMeow str' )\n        \"\\\\b[a-z_][A-Za-z0-9_]*\\\\b\" \"meow\" REG_ALL regsub  ( str arrMeow str' )\n        me @ \"%D meows, \\\"%s\\\"\" fmtstring  ( str arrMeow str\" )\n        1 array_make swap array_notify  ( str )\n    else pop then  ( str )\n\n\n    var msg\n\n    dup \",,\" instr  ( str boolCommas )\n    me @ prop_split getpropstr .no? not  ( str boolCommas boolSplitOK )\n    and if  ( str )\n        \",,\" split  ( str- -str )\n\n        ( User-supplied verb? )\n        dup \",,\" instr if\n            \",,\" split  ( str- strVerb -str )\n            swap dup if  ( str- -str strVerb )\n                strip  ( str- -str strVerb )\n                dup me @ name instr over tolower \"%n\" instr or if  ( str- -str strVerb )\n                    \"%n\" \"%N\" subst me @ name \"%n\" subst  ( str- -str strVerb )\n                else\n                    me @ swap \"%s %D,\" fmtstring  ( str- -str -str- )\n                then  ( str- -str -str- )\n                dup \"*[-!.,:;]\" smatch not if \",\" strcat then  ( str- -str -str- )\n                dup verb ! overb !  ( str- -str )\n            else pop then  ( str- -str )\n        then  ( str- -str )\n\n        2 array_make  ( arrMsg )\n        1\n    else 0 then splitsay ! msg !\n\n\n    verb @ string? not if\n        overb rtn-getThirdVerb\n        verb overb rtn-getFirstVerb\n    then\n    lquo rquo rtn-getQuotes  ( str )\n\n\n    ( Say. )\n    msg @ string? if\n        rquo @ msg @ lquo @  ( strRquo strMsg strLquo )\n        \"%s %s%s%s\"  ( strRquo strMsg strLquo strFormat )\n\n        4 dupn\n        verb  @ swap fmtstring .tell  ( strRquo strMsg strLquo strFormat )\n        overb @ swap fmtstring  ( strOsay )\n    else\n        rquo @ msg @ array_vals pop  ( strRquo strMsg strMsg2 )\n        swap dup \"*[-!.,:;]\" smatch not if \",\" strcat then swap  ( strRquo strMsg strMsg2 )\n        ( Only handle strMsg if there's no strMsg2. )\n        dup if  ( strRquo strMsg strMsg2 )\n            swap  ( strRquo strMsg2 strMsg )\n            lquo @ swap rquo @ swap lquo @  ( strRquo strMsg2 strLquo strRquo strMsg' strLquo )\n            \"%s%s%s %s %s%s%s\"  ( strRquo strMsg2 strLquo strRquo strMsg' strLquo strFormat )\n\n            7\n        else  ( strRquo strMsg strMsg2 )\n            pop lquo @  ( strRquo strMsg' strLquo )\n            \"%s%s%s %s\"  ( strRquo strMsg' strLquo strFormat )\n\n            verb @ \",$\" \".\" 0 regsub verb !\n            overb @ \",$\" \".\" 0 regsub overb !\n\n            4\n        then  ( ... strRquo strMsg strLquo strFormat intDepth )\n\n        dupn\n        verb  @ -5 rotate fmtstring .tell  ( ... strRquo strMsg strLquo strFormat )\n        overb @ -5 rotate fmtstring  ( strOsay )\n    then  ( strOsay )\n\n\n    ( Is there color to avoid? )\n    dup \"\\[[\" instr if\n        who @ prop_color \"{n*|0}\" array_filter_prop  ( strOsay arrGreyed )\n        dup if  ( strOsay arrGreyed )\n            over ansi_strip 1 array_make  ( strOsay arrGreyed arrMsg )\n            over array_notify  ( strOsay arrGreyed )\n\n            exclude @ array_union exclude !  ( strOsay )\n        else pop then  ( strOsay )\n    then  ( strOsay )\n\n    loc @  ( strOsay db )\n    exclude @ array_vals  ( strOsay db dbExcludeN..dbExclude1 intN )\n    me @ swap ++  ( strOsay db dbGreyedN..dbGreyed1' intN' )\n    dup 3 + rotate  ( db dbGreyedN..dbGreyed1 intN strOsay )\n    notify_exclude  (  )\n;\n\n: do-help pop pop .showhelp ;\n: do-ignore pop str_program cmd-ignore-add ;\n: do-unignore pop str_program cmd-ignore-del ;\n\n: do-third  ( strY strZ -- )\n    pop pop  (  )\n    me @ prop_third \"yes\" setprop\n    me @ \"You will see your own says in the third person (\\\"%D says\\\").\" fmtstring .tellgood\n;\n: do-unthird  ( strY strZ -- )\n    pop pop  (  )\n    me @ prop_third remove_prop\n    \"You will see your own says in the second person (\\\"You say\\\").\" .tellgood\n;\n\n: do-grey  ( strY strZ -- )\n    pop pop  (  )\n    me @ prop_color \"no\" setprop\n    me @ \"You will not see color in any says. Note you will see color in your own says.\" fmtstring .tellgood\n;\n: do-ungrey  ( strY strZ -- )\n    pop pop  (  )\n    me @ prop_color remove_prop\n    \"You will see color in says.\" .tellgood\n;\n\n: do-meow  ( strY strZ -- )\n    pop  ( strY )\n    dup if\n        .noisy_pmatch dup ok? not if pop exit then  ( db )\n        me @ prop_meow 3 pick reflist_find if  ( db )\n            \"%D is already in your #meow list.\" fmtstring .tellbad exit  (  )\n        then  ( db )\n        me @ prop_meow 3 pick reflist_add  ( db )\n        \"%D added.\" fmtstring .tellgood\n    else\n        me @ prop_meow array_get_reflist  ( arr )\n        \"\" swap foreach swap pop \"%D %s\" fmtstring repeat\n        \"Your meowlist: \" swap strcat .tellgood\n    then\n;\n: do-unmeow  ( strY strZ -- )\n    pop  ( strY )\n    .noisy_pmatch dup ok? not if pop exit then  ( db )\n    me @ prop_meow 3 pick reflist_find not if  ( db )\n        \"%D is not in your #meow list.\" fmtstring .tellbad exit  (  )\n    then  ( db )\n    me @ prop_meow 3 pick reflist_del  ( db )\n    \"%D removed.\" fmtstring .tellgood\n;\n\n$define dict_commands {\n    \"help\"    'do-help\n    \"ignore\"  'do-ignore\n    \"!ignore\" 'do-unignore\n    \"meow\"    'do-meow\n    \"!meow\"   'do-unmeow\n    \"third\"   'do-third\n    \"!third\"  'do-unthird\n    \"grey\"    'do-grey\n    \"gray\"    'do-grey\n    \"!grey\"   'do-ungrey\n    \"!gray\"   'do-ungrey\n}dict $enddef\n\n: main  ( str -- )\n    dup STRparse  ( str strX strY strZ )\n    3 pick string? if 3 pick \"#\" stringpfx if  ( str strX strY strZ )\n        pop pop pop  ( str )\n        \"#\" split strcat  ( str' )\n        do-say exit  (  )\n    then then\n    3 pick int? if pop pop pop do-say exit then\n    4 rotate pop  ( strX strY strZ )\n\n    rot dict_commands over array_getitem  ( strY strZ strX ? )\n    dup address? if  ( strY strZ strX adr )\n        swap pop  ( strY strZ adr )\n        execute  (  )\n    else pop  ( strY strZ strX )\n        \"I don't recognize the command '#%s'. Try 'say #help' for help, or using '##' to say something starting with '#'.\" fmtstring .tellbad  ( strY strZ )\n        pop pop  (  )\n    then  (  )\n;\n.\nc\nq\n\nlsedit #257=_help\n.del 1 $\nsay <message>\n.\"<message>\nsay #[!]ignore <names>\nsay #[!]third\nsay #[!]grey\nsay #[!]meow <names>\n\nSpeaks <message> to the room. Use #ignore <name> to not see <name>'s says, poses, and spoofs; use #meow <name> to see <name>'s says with all the words replaced with \"meow.\" Use #third to see your own says in the third person (that is, \"Puck says\" instead of the normal \"You say\"). Use #grey to turn off color in others' says and poses.\n\nSay supports a \"split\" say if you put two consecutive commas in your message. For example, if CobaltBlue typed '\"Hello,,how are you?' everyone would see '\"Hello,\" says CobaltBlue, \"how are you?\"' You can also specify an \"ad-hoc\" verb by putting a message with your name or '%N' between pairs of commas: '\"Hello,,%N welcomes Weiran,,how are you?' would display '\"Hello,\" CobaltBlue welcomes Weiran, \"how are you?\"'\n.format 10=78\n.format 8=78\n.end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/file-icons.make",
    "content": "charmap     := charmap.md\nfont-name   := file-icons\nfont-folder := dist\nfont-config := icomoon.json\nicon-size   := 34\nicon-folder := svg\nrepo-name   := Alhadis/FileIcons\nsvg         := $(wildcard $(icon-folder)/*.svg)\nlast-commit  = $(shell git log -1 --oneline --no-abbrev | cut -d' ' -f1)\n\n\nall: unpack $(font-folder)/$(font-name).woff2 charmap\n\n\n# Aliases\nunpack:  $(font-folder)/$(font-name).ttf\ncharmap: $(charmap)\n\n\n# Extract a downloaded IcoMoon folder\n$(font-folder)/%.ttf: %.zip\n\t@rm -rf $(font-folder) tmp $(font-config)\n\t@unzip -qd tmp $^\n\t@mv tmp/fonts $(font-folder)\n\t@mv tmp/selection.json $(font-config)\n\t@rm -rf tmp $^\n\t@perl -pi -e 's|^( {2})+|\"\\t\" x (length($$&)/2)|ge' $(font-config)\n\t@echo \"\" >> $(font-config) # Ensure trailing newline\n\t@echo \"Files extracted.\"\n\n\n# Generate a WOFF2 file from a TTF\n%.woff2: %.ttf\n\t@[ ! -f $@ ] && { \\\n\t\thash woff2_compress 2>/dev/null || { \\\n\t\t\techo >&2 \"WOFF2 conversion tools not found. Consult the readme file.\"; \\\n\t\t\texit 2; \\\n\t\t}; \\\n\t\twoff2_compress $^ >/dev/null; \\\n\t\techo \"WOFF2 file generated.\"; \\\n\t};\n\t\n\n\n# Clean up SVG source\nlint: $(svg)\n\t@perl -0777 -pi -e '\\\n\t\ts/\\r\\n/\\n/g; \\\n\t\ts/<g id=\"icomoon-ignore\">\\s*<\\/g>//gmi; \\\n\t\ts/<g\\s*>\\s*<\\/g>//gmi; \\\n\t\ts/\\s+(id|viewBox|xml:space)=\"[^\"]*\"/ /gmi; \\\n\t\ts/<!DOCTYPE[^>]*>//gi; \\\n\t\ts/<\\?xml.*?\\?>//gi; \\\n\t\ts/<!--.*?-->//gm; \\\n\t\ts/ style=\"enable-background:.*?;\"//gmi; \\\n\t\ts/\"\\s+>/\">/g; \\\n\t\ts/\\x20{2,}/ /g; \\\n\t\ts/[\\t\\n]+//gm;' $^\n\n\n\n# Generate/update character map\n$(charmap):\n\t@./create-map.pl -r=$(repo-name) -i=$(icon-folder) --size=$(icon-size) $(font-folder)/$(font-name).svg $@\n\n\n\n\n# POSIX systems only: reattach hard links to File-Icons package\nrelink:\n\t@$(call need-var,ATOM_FILE_ICONS,ERROR_NO_PKG)\n\t@ln -f $(font-folder)/$(font-name).woff2 $(wildcard $(ATOM_FILE_ICONS)/fonts/file-icons-*.woff2)\n\n\n\n# Force an icon's preview to be refreshed on GitHub\ncachebust:\n\t@$(call need-var,icon,ERROR_NO_ICON)\n\t@base=\"https://cdn.rawgit.com/Alhadis/FileIcons/\"; \\\n\tperl -pi -e 's{$$base\\K\\w+(?=/svg/$(icon:%.svg=%)\\.svg\")}{$(last-commit)}ig;' $(charmap)\n\n\n# Dummy task to improve feedback if `cachebust` is mistyped\nicon:\n\t$(call need-var,,ERROR_UNDEF_ICON)\n\n\n\n# Reset unstaged changes/additions in object directories\nclean:\n\t@git clean -fd $(font-folder)\n\t@git checkout -- $(font-folder) 2>/dev/null || true\n\n\n# Delete extracted and generated files\ndistclean:\n\t@rm -rf $(font-folder)\n\n\n.PHONY: clean distclean $(charmap) cachebust icon\n.ONESHELL:\n\n\n# Error message shown to users attempting to run `make relink` without a link\nERROR_NO_PKG := Environment variable ATOM_FILE_ICONS not found. \\\n\t| \\\n\t| Try this instead:\\\n\t| \\\n\t| \\\tmake relink ATOM_FILE_ICONS=/path/to/your/file-icons/installation | \n\n\n# Error message shown when running `make cachebust` without an icon\nERROR_NO_ICON := No icon specified. Task aborted.| \\\n\t| Usage: \\\n\t| \\\tmake icon=file[.svg] cachebust \\\n\t| \\\n\t| Examples: \\\n\t| \\\tmake icon=Manpage cachebust \\\n\t| \\\tmake icon=APL.svg cachebust | \n\n\n# Shown if user tries running `make icon NAME cachebust` by mistake\nERROR_UNDEF_ICON := No task named \\\"icon\\\". \\\n\t| \\\n\t| Did you mean this? \\\n\t| \\\tmake icon=NAME cachebust | \n\t\n\n\n# If the given value is empty, die with an error message\nneed = @$(if $(1),,echo $(subst | ,$$'\\n',$(2)); exit 2)\n\n# Like `need`, but uses variable names instead of string values\nneed-var = @$(call need,$($(1)),$($(2)))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/filenames/BSDmakefile",
    "content": "# pmake might add -J (private)\nFLAGS=${.MAKEFLAGS:C/\\-J ([0-9]+,?)+//W}\n\nall: .DEFAULT\n.DEFAULT:\n\t@which gmake > /dev/null 2>&1 ||\\\n\t\t(echo \"GMake is required for node.js to build.\\\n\t\t\tInstall and try again\" && exit 1)\n\t@gmake ${.FLAGS} ${.TARGETS}\n\n.PHONY: test\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/filenames/Kbuild",
    "content": "# Fail on warnings - also for files referenced in subdirs\n# -Werror can be disabled for specific files using:\n# CFLAGS_<file.o> := -Wno-error\nsubdir-ccflags-y := -Werror\n\n# platform specific definitions\ninclude arch/mips/Kbuild.platforms\nobj-y := $(platform-y)\n\n# make clean traverses $(obj-) without having included .config, so\n# everything ends up here\nobj- := $(platform-)\n\n# mips object files\n# The object files are linked as core-y files would be linked\n\nobj-y += kernel/\nobj-y += mm/\nobj-y += net/\n\nifdef CONFIG_KVM\nobj-y += kvm/\nendif\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/filenames/Makefile",
    "content": "all: hello\n\nhello: main.o factorial.o hello.o\n\tg++ main.o factorial.o hello.o -o hello\n\nmain.o: main.cpp\n\tg++ -c main.cpp\n\nfactorial.o: factorial.cpp\n\tg++ -c factorial.cpp\n\nhello.o: hello.cpp\n\tg++ -c hello.cpp\n\nclean:\n\trm -rf *o hello\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/filenames/Makefile.boot",
    "content": "# $NetBSD$\n\nS=\t${.CURDIR}/../../../../..\n\nNOMAN=\nPROG?= boot\nNEWVERSWHAT?= \"BIOS Boot\"\nVERSIONFILE?= ${.CURDIR}/../version\n\nAFLAGS.biosboot.S= ${${ACTIVE_CC} == \"clang\":?-no-integrated-as:}\n\nSOURCES?= biosboot.S boot2.c conf.c devopen.c exec.c\nSRCS= ${SOURCES}\n.if !make(depend)\nSRCS+= vers.c\n.endif\n\nPIE_CFLAGS=\nPIE_AFLAGS=\nPIE_LDFLAGS=\n\n.include <bsd.own.mk>\n\nSTRIPFLAG=\t# nothing\n\nLIBCRT0=\t# nothing\nLIBCRTI=\t# nothing\nLIBCRTBEGIN=\t# nothing\nLIBCRTEND=\t# nothing\nLIBC=\t\t# nothing\n\nBINDIR=/usr/mdec\nBINMODE=444\n\n.PATH:\t${.CURDIR}/.. ${.CURDIR}/../../lib\n\nLDFLAGS+= -nostdlib -Wl,-N -Wl,-e,boot_start\nCPPFLAGS+= -I ${.CURDIR}/..  -I ${.CURDIR}/../../lib -I ${S}/lib/libsa\nCPPFLAGS+= -I ${.OBJDIR}\n# Make sure we override any optimization options specified by the user\nCOPTS=  -Os\n\n.if ${MACHINE_ARCH} == \"x86_64\"\nLDFLAGS+=  -Wl,-m,elf_i386\nAFLAGS+=   -m32\nCPUFLAGS=  -m32\nLIBKERN_ARCH=i386\nKERNMISCMAKEFLAGS=\"LIBKERN_ARCH=i386\"\n.else\nCPUFLAGS=  -march=i386 -mtune=i386\n.endif\n\nCFLAGS+=   -mno-sse -mno-sse2 -mno-sse3\n\nCOPTS+=    -ffreestanding\nCFLAGS+= -Wall -Wmissing-prototypes -Wstrict-prototypes\nCPPFLAGS+= -nostdinc -D_STANDALONE\nCPPFLAGS+= -I$S\n\nCPPFLAGS+= -DSUPPORT_PS2\nCPPFLAGS+= -DDIRECT_SERIAL\nCPPFLAGS+= -DSUPPORT_SERIAL=boot_params.bp_consdev\n\nCPPFLAGS+= -DCONSPEED=boot_params.bp_conspeed\nCPPFLAGS+= -DCONSADDR=boot_params.bp_consaddr\nCPPFLAGS+= -DCONSOLE_KEYMAP=boot_params.bp_keymap\n\nCPPFLAGS+= -DSUPPORT_CD9660\nCPPFLAGS+= -DSUPPORT_USTARFS\nCPPFLAGS+= -DSUPPORT_DOSFS\nCPPFLAGS+= -DSUPPORT_EXT2FS\n#CPPFLAGS+= -DSUPPORT_MINIXFS3\nCPPFLAGS+= -DPASS_BIOSGEOM\nCPPFLAGS+= -DPASS_MEMMAP\n#CPPFLAGS+= -DBOOTPASSWD\nCPPFLAGS+= -DEPIA_HACK\n#CPPFLAGS+= -DDEBUG_MEMSIZE\n#CPPFLAGS+= -DBOOT_MSG_COM0\nCPPFLAGS+= -DLIBSA_ENABLE_LS_OP\n\n# The biosboot code is linked to 'virtual' address of zero and is\n# loaded at physical address 0x10000.\n# XXX The heap values should be determined from _end.\nSAMISCCPPFLAGS+= -DHEAP_START=0x40000 -DHEAP_LIMIT=0x70000\nSAMISCCPPFLAGS+= -DLIBSA_PRINTF_LONGLONG_SUPPORT\nSAMISCMAKEFLAGS+= SA_USE_CREAD=yes\t# Read compressed kernels\nSAMISCMAKEFLAGS+= SA_INCLUDE_NET=no\t# Netboot via TFTP, NFS\n\nCPPFLAGS+=\t-Wno-pointer-sign\n\n# CPPFLAGS+= -DBOOTXX_RAID1_SUPPORT\n\nI386_STAND_DIR?= $S/arch/i386/stand\n\n### find out what to use for libi386\nI386DIR= ${I386_STAND_DIR}/lib\n.include \"${I386DIR}/Makefile.inc\"\nLIBI386= ${I386LIB}\n\n### find out what to use for libsa\nSA_AS= library\nSAMISCMAKEFLAGS+=\"SA_USE_LOADFILE=yes\"\nSAMISCMAKEFLAGS+=\"SA_ENABLE_LS_OP=yes\"\n.include \"${S}/lib/libsa/Makefile.inc\"\nLIBSA= ${SALIB}\n\n### find out what to use for libkern\nKERN_AS= library\n.include \"${S}/lib/libkern/Makefile.inc\"\nLIBKERN= ${KERNLIB}\n\n### find out what to use for libz\nZ_AS= library\n.include \"${S}/lib/libz/Makefile.inc\"\nLIBZ= ${ZLIB}\n\nLDSCRIPT ?= $S/arch/i386/conf/stand.ldscript\n\ncleandir distclean: .WAIT cleanlibdir\n\ncleanlibdir:\n\t-rm -rf lib\n\nLIBLIST= ${LIBI386} ${LIBSA} ${LIBZ} ${LIBKERN} ${LIBI386} ${LIBSA}\n# LIBLIST= ${LIBSA} ${LIBKERN} ${LIBI386} ${LIBSA} ${LIBZ} ${LIBKERN}\n\nCLEANFILES+= ${PROG}.tmp ${PROG}.map ${PROG}.sym vers.c\n\nvers.c: ${VERSIONFILE} ${SOURCES} ${LIBLIST} ${.CURDIR}/../Makefile.boot\n\t${HOST_SH} ${S}/conf/newvers_stand.sh ${VERSIONFILE} x86 ${NEWVERSWHAT}\n\n# Anything that calls 'real_to_prot' must have a %pc < 0x10000.\n# We link the program, find the callers (all in libi386), then\n# explicitly pull in the required objects before any other library code.\n${PROG}: ${OBJS} ${LIBLIST} ${.CURDIR}/../Makefile.boot\n\t${_MKTARGET_LINK}\n\tbb=\"$$( ${CC} -o ${PROG}.sym ${LDFLAGS} -Wl,-Ttext,0 -Wl,-cref \\\n\t    ${OBJS} ${LIBLIST} | ( \\\n\t\twhile read symbol file; do \\\n\t\t\t[ -z \"$$file\" ] && continue; \\\n\t\t\t[ \"$$symbol\" = real_to_prot ] && break; \\\n\t\tdone; \\\n\t\twhile \\\n\t\t\toifs=\"$$IFS\"; \\\n\t\t\tIFS='()'; \\\n\t\t\tset -- $$file; \\\n\t\t\tIFS=\"$$oifs\"; \\\n\t\t\t[ -n \"$$2\" ] && echo \"${I386DST}/$$2\"; \\\n\t\t\tread file rest && [ -z \"$$rest\" ]; \\\n\t\tdo :; \\\n\t\tdone; \\\n\t) )\"; \\\n\t${CC} -o ${PROG}.sym ${LDFLAGS} -Wl,-Ttext,0 -T ${LDSCRIPT} \\\n\t\t-Wl,-Map,${PROG}.map -Wl,-cref ${OBJS} $$bb ${LIBLIST}\n\t${OBJCOPY} -O binary ${PROG}.sym ${PROG}\n\n.include <bsd.prog.mk>\nKLINK_MACHINE=\ti386\n.include <bsd.klinks.mk>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/filenames/Makefile.frag",
    "content": "all: link-php-objects index-php-objects $(all_targets)\n\t@echo\n\t@echo \"Build complete.\"\n\t@echo \"Don't forget to run 'make test'.\"\n\t@echo\n\ngenerate-php-objects:\n\t@echo \"Generating PHP objects in $(PHP_DIR)\"\n\t@for f in `ls $(PHP_DIR)/*.php`; do \\\n\t\tobjcopy --input binary --output elf64-x86-64 --binary-architecture i386 $$f $$f.o; \\\n\tdone;\n\nlink-php-objects: generate-php-objects\n\t@echo \"Linking PHP objects in $(PHP_DIR)\"\n\t@for f in `ls $(PHP_DIR)/*.php`; do \\\n\t\tar rcs $(PHP_DIR)/lib$(PHP_LIB).a $$f.o; \\\n\tdone;\n\nindex-php-objects: link-php-objects\n\t@echo \"Indexing PHP objects in $(PHP_DIR)\"\n\t@echo \"#ifndef HAVE_PHP_$(PHP_LIB)_H\" \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"#define HAVE_PHP_$(PHP_LIB)_H\" \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"/* I AM GENERATED | DO NOT EDIT | I AM GENERATED */\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@for f in `ls $(PHP_DIR)/*.php`; do \\\n\t\tname=`echo $$f | sed 's/[^a-z]/_/g'`; \\\n\t\techo \"extern char _binary_\"$$name\"_start;\" \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"static inline char* php_index_$(PHP_LIB)_\"$$name\"() {\" \t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"\treturn (char*) &_binary_\"$$name\"_start;\"\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"extern char _binary_\"$$name\"_end;\" \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"static inline char* php_index_$(PHP_LIB)_\"$$name\"_end() {\" \t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"\treturn (char*) &_binary_\"$$name\"_end;\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"static inline size_t php_index_$(PHP_LIB)_\"$$name\"_size() {\" \t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"\treturn (size_t) (php_index_$(PHP_LIB)_\"$$name\"_end() - php_index_$(PHP_LIB)_\"$$name\"());\"\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\tdone;\n\t@echo \"static inline php_$(PHP_LIB)_init(HashTable *index, HashTable *includes) {\"\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzval val;\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_hash_init(index, 8, NULL, ZVAL_PTR_DTOR, 0);\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_hash_init(includes, 8, NULL, NULL, 0);\"\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@for f in `ls $(PHP_DIR)/*.php`; do \\\n\t\tname=`echo $$f | sed 's/[^a-z]/_/g'`; \\\n\t\techo \"\tZVAL_NEW_STR(&val, zend_string_init(\\\n\t\t\t\t\tphp_index_$(PHP_LIB)_\"$$name\"(), \\\n\t\t\t\t\t\tphp_index_$(PHP_LIB)_\"$$name\"_size(), 0));\"\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"\tzend_hash_str_add(index, \\\"\"$$f\"\\\", sizeof(\\\"\"$$f\"\\\")-1, &val);\"\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\tdone;\n\t@echo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"static inline void php_$(PHP_LIB)_include(HashTable *index, HashTable *includes, \\\n\t\t\t\t\tchar *path, size_t len, zval *retval) {\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_string *key = zend_string_init(path, len, 0);\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzval *code = zend_hash_find(index, key);\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tif (code && !zend_hash_exists(includes, key)) {\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tzend_string *prepared = zend_string_alloc(Z_STRLEN_P(code) + (sizeof(\\\";\\\")-1), 0);\"\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tmemcpy(&ZSTR_VAL(prepared)[0], \\\";\\\", sizeof(\\\";\\\")-1);\"\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tif (Z_STRLEN_P(code) > (sizeof(\\\"<?php\\\") -1) && \"\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t\tmemcmp(Z_STRVAL_P(code), \\\"<?php\\\", sizeof(\\\"<?php\\\")-1) == SUCCESS) {\"\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t\t\tmemcpy(&ZSTR_VAL(prepared)[1], &Z_STRVAL_P(code)[5], \\\n\t\t\t\t\t\t\tZ_STRLEN_P(code) - (sizeof(\\\"<?php\\\") - 1));\"\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t\t\tZSTR_LEN(prepared) -= (sizeof(\\\"<?php\\\") - 1);\"\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t\t\tZSTR_VAL(prepared)[ZSTR_LEN(prepared)] = 0;\"\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t} else {\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t\tmemcpy(&ZSTR_VAL(prepared)[1], Z_STRVAL_P(code), Z_STRLEN_P(code));\"\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tzend_eval_stringl(ZSTR_VAL(prepared), ZSTR_LEN(prepared), retval, path);\"\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tzend_hash_add_empty_element(includes, key);\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tzend_string_release(prepared);\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_string_release(key);\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"static inline void php_$(PHP_LIB)_shutdown(HashTable *index, HashTable *includes) {\"\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_hash_destroy(index);\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_hash_destroy(includes);\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"#endif\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/filenames/Makefile.inc",
    "content": "#\t$OpenBSD: Makefile.inc,v 1.2 2003/11/14 20:09:20 drahn Exp $\n#\t$NetBSD: Makefile.inc,v 1.1 1996/09/30 16:34:59 ws Exp $\n\n.if !defined(__stand_makefile_inc)\n__stand_makefile_inc=1\n\nKERN_AS=\tlibrary\n\nS=$(.CURDIR)/../../../$(R)\n\n.if !make(libdep) && !make(sadep) && !make(salibdir) && !make(kernlibdir) && !make(obj) && !defined(NOMACHINE)\n.BEGIN:\n\t@([ -h machine ] || ln -s $(S)/arch/$(MACHINE)/include machine)\n.endif\n\n#\nEXTRACFLAGS=\t-msoft-float\nREAL_VIRT?=\t-v\nENTRY?=\t_start\n\nINCLUDES+=\t-I. -I$(.OBJDIR) -I$(.CURDIR)/.. -I$(S)/arch -I$(S)\nINCLUDES+=\t-I$(S)/lib/libsa\nDEFS+=\t\t-DSTANDALONE\nCFLAGS+=\t$(INCLUDES) $(DEFS) $(EXTRACFLAGS)\nCFLAGS+=\t-fno-stack-protector\nLDFLAGS?=\t-X -N -Ttext $(RELOC) -e $(ENTRY)\n\ncleandir:\n\trm -rf lib machine\n\n.endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/filenames/Makefile.wat",
    "content": "#\n#                     The FreeType Project LICENSE\n#                     ----------------------------\n# \n#                        Copyright 1996-1999 by\n#           David Turner, Robert Wilhelm, and Werner Lemberg\n# \n# \n# \n# Introduction\n# ============\n# \n#   The FreeType  Project is distributed in  several archive packages;\n#   some of them may contain, in addition to the FreeType font engine,\n#   various tools and  contributions which rely on, or  relate to, the\n#   FreeType Project.\n# \n#   This  license applies  to all  files found  in such  packages, and\n#   which do not  fall under their own explicit  license.  The license\n#   affects  thus  the  FreeType   font  engine,  the  test  programs,\n#   documentation and makefiles, at the very least.\n# \n#   This  license   was  inspired  by  the  BSD,   Artistic,  and  IJG\n#   (Independent JPEG  Group) licenses, which  all encourage inclusion\n#   and  use of  free  software in  commercial  and freeware  products\n#   alike.  As a consequence, its main points are that:\n# \n#     o We don't promise that this software works.  However, we are be\n#       interested in any kind of bug reports. (`as is' distribution)\n# \n#     o You can  use this software for whatever you  want, in parts or\n#       full form, without having to pay us. (`royalty-free' usage)\n# \n#     o You may not pretend that  you wrote this software.  If you use\n#       it, or  only parts of it,  in a program,  you must acknowledge\n#       somewhere in your documentation  that you've used the FreeType\n#       code. (`credits')\n# \n#   We  specifically  permit  and  encourage  the  inclusion  of  this\n#   software,  with  or without modifications, in commercial products,\n#   provided that all warranty or  liability claims are assumed by the\n#   product vendor.\n# \n# \n# Legal Terms\n# ===========\n# \n# 0. Definitions\n# --------------\n# \n#   Throughout this license,  the terms `package', `FreeType Project',\n#   and  `FreeType  archive' refer  to  the  set  of files  originally\n#   distributed  by the  authors  (David Turner,  Robert Wilhelm,  and\n#   Werner Lemberg) as the `FreeType project', be they named as alpha,\n#   beta or final release.\n# \n#   `You' refers to  the licensee, or person using  the project, where\n#   `using' is a generic term including compiling the project's source\n#   code as  well as linking it  to form a  `program' or `executable'.\n#   This  program is  referred to  as  `a program  using the  FreeType\n#   engine'.\n# \n#   This  license applies  to all  files distributed  in  the original\n#   FreeType  archive,   including  all  source   code,  binaries  and\n#   documentation,  unless  otherwise  stated   in  the  file  in  its\n#   original, unmodified form as  distributed in the original archive.\n#   If you are  unsure whether or not a particular  file is covered by\n#   this license, you must contact us to verify this.\n# \n#   The FreeType  project is copyright (C) 1996-1999  by David Turner,\n#   Robert Wilhelm, and Werner Lemberg.  All rights reserved except as\n#   specified below.\n# \n# 1. No Warranty\n# --------------\n# \n#   THE FREETYPE ARCHIVE  IS PROVIDED `AS IS' WITHOUT  WARRANTY OF ANY\n#   KIND, EITHER EXPRESSED OR  IMPLIED, INCLUDING, BUT NOT LIMITED TO,\n#   WARRANTIES  OF  MERCHANTABILITY   AND  FITNESS  FOR  A  PARTICULAR\n#   PURPOSE.  IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS\n#   BE LIABLE  FOR ANY DAMAGES CAUSED  BY THE USE OR  THE INABILITY TO\n#   USE, OF THE FREETYPE PROJECT.\n# \n#   As  you have  not signed  this license,  you are  not  required to\n#   accept  it.   However,  as  the FreeType  project  is  copyrighted\n#   material, only  this license, or  another one contracted  with the\n#   authors, grants you  the right to use, distribute,  and modify it.\n#   Therefore,  by  using,  distributing,  or modifying  the  FreeType\n#   project, you indicate that you understand and accept all the terms\n#   of this license.\n# \n# 2. Redistribution\n# -----------------\n# \n#   Redistribution and use in source and binary forms, with or without\n#   modification, are permitted provided that the following conditions\n#   are met:\n# \n#     o Redistribution  of source code  must retain this  license file\n#       (`licence.txt') unaltered; any additions, deletions or changes\n#       to   the  original   files  must   be  clearly   indicated  in\n#       accompanying  documentation.   The  copyright notices  of  the\n#       unaltered, original  files must be preserved in  all copies of\n#       source files.\n# \n#     o Redistribution in binary form must provide a  disclaimer  that\n#       states  that  the software is based in part of the work of the\n#       FreeType Team,  in  the  distribution  documentation.  We also\n#       encourage you to put an URL to the FreeType web page  in  your\n#       documentation, though this isn't mandatory.\n# \n#   These conditions  apply to any  software derived from or  based on\n#   the FreeType code, not just  the unmodified files.  If you use our\n#   work, you  must acknowledge us.  However,  no fee need  be paid to\n#   us.\n# \n# 3. Advertising\n# --------------\n# \n#   The names of  FreeType's authors and contributors may  not be used\n#   to endorse or promote  products derived from this software without\n#   specific prior written permission.\n#   \n#   We suggest,  but do not require, that  you use one or  more of the\n#   following phrases to refer  to this software in your documentation\n#   or advertising  materials: `FreeType Project',  `FreeType Engine',\n#   `FreeType library', or `FreeType Distribution'.\n# \n# 4. Contacts\n# -----------\n# \n#   There are two mailing lists related to FreeType:\n# \n#     o freetype@freetype.org\n# \n#       Discusses general use and applications of FreeType, as well as\n#       future and  wanted additions to the  library and distribution.\n#       If  you are looking  for support,  start in  this list  if you\n#       haven't found anything to help you in the documentation.\n# \n#     o devel@freetype.org\n# \n#       Discusses bugs,  as well  as engine internals,  design issues,\n#       specific licenses, porting, etc.\n# \n#     o http://www.freetype.org\n# \n#       Holds the current  FreeType web page, which will  allow you to\n#       download  our  latest  development  version  and  read  online\n#       documentation.\n# \n#   You can also contact us individually at:\n# \n#     David Turner      <david.turner@freetype.org>\n#     Robert Wilhelm    <robert.wilhelm@freetype.org>\n#     Werner Lemberg    <werner.lemberg@freetype.org>\n# \n# \n# --- end of license ---\n#\n# This file is part of the FreeType project.\n#\n# This builds the Watcom library with Watcom's wcc386 under OS/2.\n#\n# You'll need Watcom's wmake.\n#\n#\n# Invoke by \"wmake -f arch\\os2\\Makefile.wat\" when in the \"lib\" directory\n#\n# This will build \"freetype\\lib\\libttf.lib\"\n\nARCH = arch\\os2\nFT_MAKEFILE = $(ARCH)\\Makefile.wat\nFT_MAKE = wmake -h\n\n\n.EXTENSIONS:\n.EXTENSIONS: .lib .obj .c .h\n.obj:.;.\\extend;.\\$(ARCH)\n.c:.;.\\extend;.\\$(ARCH)\n.h:.;.\\extend;.\\$(ARCH)\n\nCC = wcc386\n\nCCFLAGS = /otexanl+ /s /w5 /zq -Iarch\\os2 -I. -Iextend\n\nTTFILE   = .\\ttfile.c\nTTMEMORY = .\\ttmemory.c\nTTMUTEX  = .\\ttmutex.c\n\nTTFILE_OBJ = ttfile.obj\nTTMEMORY_OBJ = ttmemory.obj\nTTMUTEX_OBJ = ttmutex.obj\n\nPORT = $(TTFILE) $(TTMEMORY) $(TTMUTEX)\nPORT_OBJS = $(TTFILE_OBJ) $(TTMEMORY_OBJ) $(TTMUTEX_OBJ)\n\nSRC_X = extend\\ftxgasp.c extend\\ftxkern.c  extend\\ftxpost.c &\n        extend\\ftxcmap.c extend\\ftxwidth.c extend\\ftxsbit.c &\n        extend\\ftxgsub.c extend\\ftxgpos.c  extend\\ftxopen.c &\n        extend\\ftxgdef.c\n\nOBJS_X = extend\\ftxgasp.obj extend\\ftxkern.obj  extend\\ftxpost.obj &\n         extend\\ftxcmap.obj extend\\ftxwidth.obj extend\\ftxsbit.obj &\n         extend\\ftxgsub.obj extend\\ftxgpos.obj  extend\\ftxopen.obj &\n         extend\\ftxgdef.obj\n\nSRC_M = ttapi.c     ttcache.c   ttcalc.c   ttcmap.c  &\n        ttgload.c   ttinterp.c  ttload.c   ttobjs.c  &\n        ttraster.c  ttextend.c  $(PORT)\n\nOBJS_M = ttapi.obj     ttcache.obj   ttcalc.obj   ttcmap.obj  &\n         ttgload.obj   ttinterp.obj  ttload.obj   ttobjs.obj  &\n         ttraster.obj  ttextend.obj  $(PORT_OBJS) $(OBJS_X)\n\nSRC_S = freetype.c\nOBJ_S = freetype.obj\nOBJS_S = $(OBJ_S) $(OBJS_X)\n\n\n.c.obj:\n  $(CC) $(CCFLAGS) $[* /fo=$[*.obj\n\nall: .symbolic\n  $(FT_MAKE) -f $(FT_MAKEFILE) libttf.lib\n\ndebug: .symbolic\n  $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES=\"$(OBJS_M)\" libttf.lib\n\n\nlibttf.lib: $(OBJS_M)\n  wlib -q -n libttf.lib $(OBJS_M)\n\n# is this correct? Know nothing about wmake and the Watcom compiler...\n$(OBJ_S): $(SRC_S) $(SRC_M)\n  $(CC) $(CCFLAGS) $(SRC_S) /fo=$(OBJ_S)\n\nclean: .symbolic\n  @-erase $(OBJS_M)\n  @-erase *.err\n\ndistclean: .symbolic clean\n  @-erase libttf.lib\n\nnew: .symbolic\n  @-wtouch *.c\n\n# end of Makefile.wat\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/filenames/makefile.sco",
    "content": "# makefile for SCO OSr5  ELF and Unixware 7 with Native cc\n# Contributed by Mike Hopkirk (hops@sco.com) modified from Makefile.lnx\n#   force ELF build dynamic linking, SONAME setting in lib and RPATH in app\n# Copyright (C) 2002, 2006, 2010-2014 Glenn Randers-Pehrson\n# Copyright (C) 1998 Greg Roelofs\n# Copyright (C) 1996, 1997 Andreas Dilger\n#\n# This code is released under the libpng license.\n# For conditions of distribution and use, see the disclaimer\n# and license in png.h\n\n# Library name:\nLIBNAME = libpng16\nPNGMAJ = 16\n\n# Shared library names:\nLIBSO=$(LIBNAME).so\nLIBSOMAJ=$(LIBNAME).so.$(PNGMAJ)\nLIBSOREL=$(LIBSOMAJ).$(RELEASE)\nOLDSO=libpng.so\n\n# Utilities:\nCC=cc\nAR_RC=ar rc\nMKDIR_P=mkdir\nLN_SF=ln -f -s\nRANLIB=echo\nCP=cp\nRM_F=/bin/rm -f\n\n# where make install puts libpng.a, $(OLDSO)*, and png.h\nprefix=/usr/local\nexec_prefix=$(prefix)\n\n# Where the zlib library and include files are located\n#ZLIBLIB=/usr/local/lib\n#ZLIBINC=/usr/local/include\nZLIBLIB=../zlib\nZLIBINC=../zlib\n\nCPPFLAGS=-I$(ZLIBINC)\nCFLAGS= -dy -belf -O3\nLDFLAGS=-L. -L$(ZLIBLIB) -lpng16 -lz -lm\n\nINCPATH=$(prefix)/include\nLIBPATH=$(exec_prefix)/lib\nMANPATH=$(prefix)/man\nBINPATH=$(exec_prefix)/bin\n\n# override DESTDIR= on the make install command line to easily support\n# installing into a temporary location.  Example:\n#\n#    make install DESTDIR=/tmp/build/libpng\n#\n# If you're going to install into a temporary location\n# via DESTDIR, $(DESTDIR)$(prefix) must already exist before\n# you execute make install.\nDESTDIR=\n\nDB=$(DESTDIR)$(BINPATH)\nDI=$(DESTDIR)$(INCPATH)\nDL=$(DESTDIR)$(LIBPATH)\nDM=$(DESTDIR)$(MANPATH)\n\n# Pre-built configuration\n# See scripts/pnglibconf.mak for more options\nPNGLIBCONF_H_PREBUILT = scripts/pnglibconf.h.prebuilt\n\nOBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \\\n\tpngread.o pngrio.o pngwio.o pngwrite.o pngrtran.o \\\n\tpngwtran.o pngmem.o pngerror.o pngpread.o\n\nOBJSDLL = $(OBJS:.o=.pic.o)\n\n.SUFFIXES:      .c .o .pic.o\n\n.c.o:\n\t$(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $<\n\n.c.pic.o:\n\t$(CC) -c $(CPPFLAGS) $(CFLAGS) -KPIC -o $@ $*.c\n\nall: libpng.a $(LIBSO) pngtest libpng.pc libpng-config\n\npnglibconf.h: $(PNGLIBCONF_H_PREBUILT)\n\t$(CP) $(PNGLIBCONF_H_PREBUILT) $@\n\nlibpng.a: $(OBJS)\n\t$(AR_RC) $@ $(OBJS)\n\t$(RANLIB) $@\n\nlibpng.pc:\n\tcat scripts/libpng.pc.in | sed -e s!@prefix@!$(prefix)! \\\n\t-e s!@exec_prefix@!$(exec_prefix)! \\\n\t-e s!@libdir@!$(LIBPATH)! \\\n\t-e s!@includedir@!$(INCPATH)! \\\n\t-e s!-lpng16!-lpng16\\ -lz\\ -lm! > libpng.pc\n\nlibpng-config:\n\t( cat scripts/libpng-config-head.in; \\\n\techo prefix=\\\"$(prefix)\\\"; \\\n\techo I_opts=\\\"-I$(INCPATH)/$(LIBNAME)\\\"; \\\n\techo ccopts=\\\"-belf\\\"; \\\n\techo L_opts=\\\"-L$(LIBPATH)\\\"; \\\n\techo libs=\\\"-lpng16 -lz -lm\\\"; \\\n\tcat scripts/libpng-config-body.in ) > libpng-config\n\tchmod +x libpng-config\n\n$(LIBSO): $(LIBSOMAJ)\n\t$(LN_SF) $(LIBSOMAJ) $(LIBSO)\n\n$(LIBSOMAJ): $(OBJSDLL)\n\t$(CC) -G  -Wl,-h,$(LIBSOMAJ) -o $(LIBSOMAJ) \\\n\t $(OBJSDLL)\n\npngtest: pngtest.o $(LIBSO)\n\tLD_RUN_PATH=.:$(ZLIBLIB) $(CC) -o pngtest $(CFLAGS) pngtest.o $(LDFLAGS)\n\ntest: pngtest\n\t./pngtest\n\ninstall-headers: png.h pngconf.h pnglibconf.h\n\t-@if [ ! -d $(DI) ]; then $(MKDIR_P) $(DI); fi\n\t-@if [ ! -d $(DI)/$(LIBNAME) ]; then $(MKDIR_P) $(DI)/$(LIBNAME); fi\n\t-@$(RM_F) $(DI)/png.h\n\t-@$(RM_F) $(DI)/pngconf.h\n\t-@$(RM_F) $(DI)/pnglibconf.h\n\tcp png.h pngconf.h pnglibconf.h $(DI)/$(LIBNAME)\n\tchmod 644 $(DI)/$(LIBNAME)/png.h $(DI)/$(LIBNAME)/pngconf.h $(DI)/$(LIBNAME)/pnglibconf.h\n\t-@$(RM_F) $(DI)/png.h $(DI)/pngconf.h $(DI)/pnglibconf.h\n\t-@$(RM_F) $(DI)/libpng\n\t(cd $(DI); $(LN_SF) $(LIBNAME) libpng; $(LN_SF) $(LIBNAME)/* .)\n\ninstall-static: install-headers libpng.a\n\t-@if [ ! -d $(DL) ]; then $(MKDIR_P) $(DL); fi\n\tcp libpng.a $(DL)/$(LIBNAME).a\n\tchmod 644 $(DL)/$(LIBNAME).a\n\t-@$(RM_F) $(DL)/libpng.a\n\t(cd $(DL); $(LN_SF) $(LIBNAME).a libpng.a)\n\ninstall-shared: install-headers $(LIBSOMAJ) libpng.pc\n\t-@if [ ! -d $(DL) ]; then $(MKDIR_P) $(DL); fi\n\t-@$(RM_F) $(DL)/$(LIBSO)\n\t-@$(RM_F) $(DL)/$(LIBSOREL)\n\t-@$(RM_F) $(DL)/$(OLDSO)\n\tcp $(LIBSOMAJ) $(DL)/$(LIBSOREL)\n\tchmod 755 $(DL)/$(LIBSOREL)\n\t(cd $(DL); \\\n\t$(LN_SF) $(LIBSOREL) $(LIBSO); \\\n\t$(LN_SF) $(LIBSO) $(OLDSO))\n\t-@if [ ! -d $(DL)/pkgconfig ]; then $(MKDIR_P) $(DL)/pkgconfig; fi\n\t-@$(RM_F) $(DL)/pkgconfig/$(LIBNAME).pc\n\t-@$(RM_F) $(DL)/pkgconfig/libpng.pc\n\tcp libpng.pc $(DL)/pkgconfig/$(LIBNAME).pc\n\tchmod 644 $(DL)/pkgconfig/$(LIBNAME).pc\n\t(cd $(DL)/pkgconfig; $(LN_SF) $(LIBNAME).pc libpng.pc)\n\ninstall-man: libpng.3 libpngpf.3 png.5\n\t-@if [ ! -d $(DM) ]; then $(MKDIR_P) $(DM); fi\n\t-@if [ ! -d $(DM)/man3 ]; then $(MKDIR_P) $(DM)/man3; fi\n\t-@$(RM_F) $(DM)/man3/libpng.3\n\t-@$(RM_F) $(DM)/man3/libpngpf.3\n\tcp libpng.3 $(DM)/man3\n\tcp libpngpf.3 $(DM)/man3\n\t-@if [ ! -d $(DM)/man5 ]; then $(MKDIR_P) $(DM)/man5; fi\n\t-@$(RM_F) $(DM)/man5/png.5\n\tcp png.5 $(DM)/man5\n\ninstall-config: libpng-config\n\t-@if [ ! -d $(DB) ]; then $(MKDIR_P) $(DB); fi\n\t-@$(RM_F) $(DB)/libpng-config\n\t-@$(RM_F) $(DB)/$(LIBNAME)-config\n\tcp libpng-config $(DB)/$(LIBNAME)-config\n\tchmod 755 $(DB)/$(LIBNAME)-config\n\t(cd $(DB); $(LN_SF) $(LIBNAME)-config libpng-config)\n\ninstall: install-static install-shared install-man install-config\n\n# If you installed in $(DESTDIR), test-installed won't work until you\n# move the library to its final location.  Use test-dd to test it\n# before then.\n\ntest-dd:\n\techo\n\techo Testing installed dynamic shared library in $(DL).\n\t$(CC) -I$(DI) $(CPPFLAGS) \\\n\t   `$(BINPATH)/$(LIBNAME)-config --cflags` pngtest.c \\\n\t   -L$(DL) -L$(ZLIBLIB) \\\n\t   -o pngtestd `$(BINPATH)/$(LIBNAME)-config --ldflags`\n\t./pngtestd pngtest.png\n\ntest-installed:\n\t$(CC) $(CPPFLAGS) $(CFLAGS) \\\n\t   `$(BINPATH)/$(LIBNAME)-config --cflags` pngtest.c \\\n\t   -L$(ZLIBLIB) \\\n\t   -o pngtesti `$(BINPATH)/$(LIBNAME)-config --ldflags`\n\t./pngtesti pngtest.png\n\nclean:\n\t$(RM_F) *.o libpng.a pngtest pngout.png libpng-config \\\n\t$(LIBSO) $(LIBSOMAJ)* pngtest-static pngtesti \\\n\tpnglibconf.h libpng.pc\n\nDOCS = ANNOUNCE CHANGES INSTALL KNOWNBUG LICENSE README TODO Y2KINFO\nwritelock:\n\tchmod a-w *.[ch35] $(DOCS) scripts/*\n\n# DO NOT DELETE THIS LINE -- make depend depends on it.\n\npng.o png.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngerror.o pngerror.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngrio.o pngrio.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngwio.o pngwio.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngmem.o pngmem.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngset.o pngset.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngget.o pngget.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngread.o pngread.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngrtran.o pngrtran.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngrutil.o pngrutil.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngtrans.o pngtrans.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngwrite.o pngwrite.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngwtran.o pngwtran.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngwutil.o pngwutil.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngpread.o pngpread.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\n\npngtest.o: png.h pngconf.h pnglibconf.h\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/filenames/mkfile",
    "content": "GREETINGS=hello gday bonjour hola ola kaixo tag hoi konnichiwa nihao dobredan namaste salaam\n\nall:V:\n\tmk greet.^($GREETINGS)\n\tfor(i in $GREETINGS)\n\t\tmk $i\n\ngreet.%: text-folder\n\t/n/$printer $stem >[2=1]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/foo.o.d",
    "content": "bar/foo.o: \\\n bar/foo.c \\\n bar/baz.h\n\nbar/baz.h:\n"
  },
  {
    "path": "src/test/resources/samples/langs/Makefile/makefile",
    "content": "#!/usr/bin/make -f\n%:\n\tls -l\n"
  },
  {
    "path": "src/test/resources/samples/langs/Markdown/README.mdown",
    "content": "# Installation\n\nYou can install this bundle in TextMate by opening the preferences and going to the bundles tab. After installation it will be automatically updated for you.\n\n# General\n\n* [Bundle Styleguide](http://kb.textmate.org/bundle_styleguide) — _before you make changes_\n* [Commit Styleguide](http://kb.textmate.org/commit_styleguide) — _before you send a pull request_\n* [Writing Bug Reports](http://kb.textmate.org/writing_bug_reports) — _before you report an issue_\n\n# License\n\nIf not otherwise specified (see below), files in this repository fall under the following license:\n\n\tPermission to copy, use, modify, sell and distribute this\n\tsoftware is granted. This software is provided \"as is\" without\n\texpress or implied warranty, and with no claim as to its\n\tsuitability for any purpose.\n\nAn exception is made for files in readable text which contain their own license information, or files where an accompanying file exists (in the same directory) with a “-license” suffix added to the base-name name of the original file, and an extension of txt, html, or similar. For example “tidy” is accompanied by “tidy-license.txt”."
  },
  {
    "path": "src/test/resources/samples/langs/Markdown/csharp6.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- Console\n---\n\n# Using C# 6\n\nSome examples from Xamarin's [intro to C# 6](https://developer.xamarin.com/guides/cross-platform/advanced/csharp_six/).\n\n* Null-conditional operator\n\n* String Interpolation\n\n* Expression-bodied Function Members\n\n* Auto-property Initialization\n\n* Index Initializers\n\n* using static\n\n## Null-conditional operator\n\nThe `?.` operator automatically does a null-check before referencing the\nspecified member. The example string array below has a `null` entry:\n\n```csharp\nvar names = new string[] { \"Foo\", null };\n```\n\nIn C# 5, a null-check is required before accessing the `.Length` property:\n\n```csharp\n// C# 5\nint secondLength = 0;\nif (names[1] != null)\n  secondLength = names[1].Length;\n```\n\nC# 6 allows the length to be queried in a single line; the entire\nstatement returns `null` if any object is null.\n\n```csharp\nvar length0 = names[0]?.Length; // 3\nvar length1 = names[1]?.Length; // null\n```\n\nThis can be used in conjunction with the `??` null coalescing operator\nto set a default value (such as `0`) in the example below:\n\n```csharp\nvar lengths = names.Select (names => names?.Length ?? 0); //[3, 0]\n```\n\n## String Interpolation\n\nPreviously strings were built in a number of different ways:\n\n```csharp\nvar animal = \"Monkeys\";\nvar food = \"bananas\";\n\nvar out1 = String.Format (\"{0} love to eat {1}\", animal, food);\nvar out2 = animal + \" love to eat \" + food;\n// or even StringBuilder\n```\n\nC# 6 provides a simple syntax where the fieldname can be\nembedded directly in the string:\n\n```csharp\n$\"{animal} love to eat {food}\"\n```\n\nString-formatting can also be done with this syntax:\n\n```csharp\nvar values = new int[] { 1, 2, 3, 4, 12, 123456 };\nforeach (var s in values.Select (i => $\"The value is {i,10:N2}.\")) {\n   Console.WriteLine (s);\n}\n```\n\n## Expression-bodied Function Members\n\nThe `ToString` override in the following class is an expression-bodied\nfunction - a more succinct declaration syntax.\n\n```csharp\nclass Person\n{\n    public string FirstName { get; }\n    public string LastName { get; }\n    public Person (string firstname, string lastname)\n    {\n       FirstName = firstname;\n       LastName = lastname;\n    }\n    // note there is no explicit `return` keyword\n    public override string ToString () => $\"{LastName}, {FirstName} {LastName}\";\n}\n```\n\n`void` expression bodied functions are also allowed so long as\nthe expression is a statement:\n\n```csharp\npublic void Log(string message) => System.Console.WriteLine($\"{DateTime.Now.ToString (\"s\", System.Globalization.CultureInfo.InvariantCulture )}: {message}\");\n```\n\nThis simple example calls these two methods:\n\n```csharp\nLog(new Person(\"James\", \"Bond\").ToString())\n```\n\n## Auto-property Initialization\n\nProperties (ie. specified with `{get;set;}`) can be initialized inline\nwith C# 6:\n\n```csharp\nclass Todo\n{\n    public bool Done { get; set; } = false;\n    public DateTime Created { get; } = DateTime.Now;\n    public string Description { get; }\n\n    public Todo (string description)\n    {\n       this.Description = description; // can assign (only in constructor!)\n    }\n    public override string ToString () => $\"'{Description}' was created on {Created}\";\n}\n```\n\n```csharp\nnew Todo(\"buy apples\")\n```\n\n## Index Initializers\n\nDictionary-style data structures let you specify key/value\ntypes with a simple object-initializer-like syntax:\n\n```csharp\nvar userInfo = new Dictionary<string,object> {\n    [\"Created\"] = DateTime.Now,\n    [\"Due\"] = DateTime.Now.AddSeconds(60 * 60 * 24),\n    [\"Task\"] = \"buy lettuce\"\n};\n```\n\n## using static\n\nEnumerations, and certain classes such as System.Math, are primarily\nholders of static values and functions. In C# 6, you can import all\nstatic members of a type with a single using static statement:\n\n```csharp\nusing static System.Math;\n```\n\nC# 6 code can then reference the static members directly, avoiding\nrepetition of the class name (eg. `Math.PI` becomes `PI`):\n\n```csharp\npublic class Location \n{\n    public Location (double lat, double @long) {Latitude = lat; Longitude = @long;} \n    public double Latitude = 0; public double Longitude = 0; \n}\nstatic public double MilesBetween(Location loc1, Location loc2)\n{\n  double rlat1  = PI * loc1.Latitude / 180;\n  double rlat2  = PI * loc2.Latitude / 180;\n  double theta  = loc1.Longitude - loc2.Longitude;\n  double rtheta = PI * theta / 180;\n  double dist =\n      Sin(rlat1) * Sin(rlat2) + Cos(rlat1) *\n      Cos(rlat2) * Cos(rtheta);\n  dist = Acos(dist);\n  dist = dist*180/PI;\n  dist = dist*60*1.1515;\n  return dist; //miles\n}\n```\n\n```csharp\nMilesBetween (new Location(-12,22), new Location(-13,33))\n```"
  },
  {
    "path": "src/test/resources/samples/langs/Markdown/minimal.md",
    "content": "_This_ is a **Markdown** readme."
  },
  {
    "path": "src/test/resources/samples/langs/Markdown/symlink.md",
    "content": "# Installation\n\nYou can install this bundle in TextMate by opening the preferences and going to the bundles tab. After installation it will be automatically updated for you.\n\n# General\n\n* [Bundle Styleguide](http://kb.textmate.org/bundle_styleguide) — _before you make changes_\n* [Commit Styleguide](http://kb.textmate.org/commit_styleguide) — _before you send a pull request_\n* [Writing Bug Reports](http://kb.textmate.org/writing_bug_reports) — _before you report an issue_\n\n# License\n\nIf not otherwise specified (see below), files in this repository fall under the following license:\n\n\tPermission to copy, use, modify, sell and distribute this\n\tsoftware is granted. This software is provided \"as is\" without\n\texpress or implied warranty, and with no claim as to its\n\tsuitability for any purpose.\n\nAn exception is made for files in readable text which contain their own license information, or files where an accompanying file exists (in the same directory) with a “-license” suffix added to the base-name name of the original file, and an extension of txt, html, or similar. For example “tidy” is accompanied by “tidy-license.txt”."
  },
  {
    "path": "src/test/resources/samples/langs/Markdown/tender.md",
    "content": "Tender\n======\n"
  },
  {
    "path": "src/test/resources/samples/langs/Marko/counter.marko",
    "content": "class {\n    constructor() {\n        this.state = { count:0 };\n    }\n    increment() {\n        this.state.count++;\n    }\n}\n\nstyle {\n    .count {\n        color:#09c;\n        font-size:3em;\n    }\n    .example-button {\n        font-size:1em;\n        padding:0.5em;\n    }\n}\n\n<div.count>\n    ${state.count}\n</div>\n<button.example-button on-click('increment')>\n    Click me!\n</button>"
  },
  {
    "path": "src/test/resources/samples/langs/Marko/hello.marko",
    "content": "$ var name = 'Frank';\n$ var colors = ['red', 'green', 'blue'];\n\n<h1>\n    Hello ${name}!\n</h1>\n\n<ul if(colors.length)>\n    <li style={color: color} for(color in colors)>\n        ${color}\n    </li>\n</ul>\n<div else>\n    No colors!\n</div>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Marko/rgb-sliders.marko",
    "content": "static const colors = ['red', 'green', 'blue'];\nstatic const defaultColor = [255, 0, 0];\n\nclass {\n\tonInput(input) {\n\t\tthis.state = { color: input.color || defaultColor };\n\t}\n\n\tupdateColor() {\n    \tthis.state.color = colors.map((color) => {\n        \treturn parseInt(this.getEl(color + 'Input').value, 10);\n        });\n    }\n\n    getStyleColor() {\n    \treturn 'rgb(' + this.state.color.join(',') + ')';\n    }\n}\n\n<div.rgb-sliders>\n    <div.inputs>\n    \t<for(i, color in colors)>\n        \t<div>\n                <label for-key=color+\"Input\">\n                    ${color}:\n                </label>\n                <input type=\"range\" max=\"255\"\n                    key=color+\"Input\"\n                    on-input('updateColor')\n                    value=state.color[i] >\n            </div>\n        </for>\n    </div>\n    <div.color style={backgroundColor: component.getStyleColor()}>\n    </div>\n</div>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mask/view.mask",
    "content": "\n// HTML Elements\nheader {\n    \n    img .logo src='/images/~[currentLogo].png' alt=logo;\n    \n    h4 > 'Bar View'\n    \n    if (currentUser) {\n        \n        .account >\n            a href='/acount' >\n                'Hello, ~[currentUser.username]'\n    }\n}\n\n.view {\n    ul {\n       \n        // Iteration\n        for ((user, index) of users) {\n            \n            li.user data-id='~[user.id]' {\n                \n                // interpolation\n                .name > '~[ user.username ]'\n                \n                // expression\n                .count > '~[: user.level.toFixed(2) ]'\n                \n                // util\n                /* Localization sample\n                 * lastActivity: \"Am {0:dd. MM} war der letzte Eintrag\"\n                 */\n                .date > '~[ L: \"lastActivity\",  user.date]'\n            }\n        }\n    }\n    \n    // Component\n    :countdownComponent {\n        input type = text >\n            :dualbind value='number';\n            \n        button x-signal='click: countdownStart' > 'Start';\n        \n        h5 {\n            '~[bind: number]'\n            \n            :animation x-slot='countdownStart' {\n                @model > 'transition | scale(0) > scale(1) | 500ms'\n                @next  > 'background-color | red > blue | 2s linear'\n            }\n        }\n    }\n}\n\nfooter > :bazCompo {\n    \n    'Component generated at ~[: $u.format($c.date, \"HH-mm\") ]'\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/HeyexImport.m",
    "content": "(* Mathematica Package *)\n(* Created with IntelliJ IDEA and the Mathematica Language plugin *)\n\n(* :Title: Importer for the RAW data-format of the Heidelberg Eye Explorer (known as HEYEX) *)\n\n(* :Context: HeyexImport` *)\n\n(* :Author: Patrick Scheibe pscheibe@trm.uni-leipzig.de *)\n\n(* :Package Version: 1.0 *)\n\n(* :Mathematica Version: 8.0 *)\n\n(* :Copyright: Patrick Scheibe, 2013-2015 *)\n\n(* :Discussion: This package registers a new importer which can load the RAW data-format exported by a\n                Heidelberg Spectralis OCT. The import-functionality can access different information contained\n                in a file:\n                1. The file header which contains meta data like when the patient was scanned etc\n                2. The scanned volume data\n                3. Images which represent slices of the scanned volume\n                4. The Scanning laser ophthalmoscopy (SLO) image which is taken with every scanned patient\n                5. The segmentation data for different retina layers provided by the software\n\n*)\n\n(* :Keywords: Import, Heyex, OCT, Spectralis, Heidelberg Engineering *)\n\nBeginPackage[ \"HeyexImport`\" ]\n\nHeyexEyePosition::usage = \"HeyexEyePosition[file] tries to extract which eye was scanned, left or right.\";\n\nHeyexImport::wrongHdr = \"Error importing OCT data. Broken/Wrong file?\";\n\n\nBegin[ \"`Private`\" ];\n\n(*\n    Registration of all import possibilities for the Heidelberg OCT.\n*)\n\nImportExport`RegisterImport[\n  \"Heyex\" ,\n  {\n    \"FileHeader\" :> importHeader,\n    { \"Data\" , n_Integer} :> (importData[n][##]&),\n    \"Data\" :> importData,\n    { \"Images\" , n_Integer} :> (importImages[n][##]&),\n    \"Images\" :> importImages,\n    \"SLOImage\" :> importSLOImage,\n    \"SegmentationData\" :> importSegmentation,\n    { \"SegmentationData\" , n_Integer} :> (importSegmentation[n][##]&),\n    \"DataSize\" :> importDataSize,\n    importData\n  },\n\n  {\n    \"Image3D\" :> (Image3D[\"Data\" /. #1]&)\n  },\n\n  \"AvailableElements\" -> {\"FileHeader\", \"Data\", \"DataSize\", \"Images\", \"SLOImage\", \"SegmentationData\", \"Image3D\"}\n];\n\n\nIf[Quiet[Check[TrueQ[Compile[{}, 0, CompilationTarget -> \"C\"][] == 0], False]],\n  $compileTarget = CompilationTarget -> \"C\",\n  $compileTarget = CompilationTarget -> \"MVM\"\n];\n\n\n(*\n    Helper function which reads data from a stream. This is\n    only a unification so I can map the read function over a\n    list.\n*)\nread[{id_String, type_String}, str_] :=\nid -> BinaryRead[str, type];\nread[{type_String, n_Integer}, str_] := BinaryReadList[str, type, n];\nread[{id_String, {type_String, n_Integer}}, str_] := id -> BinaryReadList[str, type, n];\n(*\n    Note that when reading bytes explicitly I convert them to\n    a string and remove any zeroes at the end.\n*)\nread[{id_String, { \"Byte\" , n_Integer}}, str_] :=\nid -> StringJoin[\n    FromCharacterCode /@ (Rest[\n      NestList[BinaryRead[str, \"Byte\" ] &, Null,\n        n]] /. {chars___Integer, Longest[0 ...]} :> {chars})];\n\n(*\n    The layout of a file exported with \"Raw Export\"\n\n    *****************\n    *   File Header *\n    *****************\n    *   SLO Image   *\n    *****************\n    *   B-Scan #0   *\n    *****************\n    *   .....       *\n    *****************\n    *   B-Scan #n-1 *\n    *****************\n*)\n\nWith[{i = \"Integer32\", f = \"Real32\", d = \"Real64\", b = \"Byte\"},\n\n  $fileHeaderInfo = Transpose[{\n    {\n      \"Version\" , \"SizeX\" , \"NumBScans\" , \"SizeZ\" , \"ScaleX\" , \"Distance\" ,\n      \"ScaleZ\" , \"SizeXSlo\" , \"SizeYSlo\" , \"ScaleXSlo\" , \"ScaleYSlo\" ,\n      \"FieldSizeSlo\" , \"ScanFocus\" , \"ScanPosition\" , \"ExamTime\" ,\n      \"ScanPattern\" , \"BScanHdrSize\" , \"ID\" , \"ReferenceID\" , \"PID\" ,\n      \"PatientID\" , \"Padding\" , \"DOB\" , \"VID\" , \"VisitID\" , \"VisitDate\" ,\n      \"Spare\"\n    },\n    {\n      {b, 12}, i, i, i, d, d, d, i, i, d, d, i, d, {b, 4}, {i, 2}, i, i,\n      {b, 16}, {b, 16}, i, {b, 21}, {b, 3}, d, i, {b, 24}, d, {b, 1840}\n    }\n  }];\n\n  $bScanHeaderInfo = Transpose[{\n    {\n      \"Version\" , \"BScanHdrSize\" , \"StartX\" , \"StartY\" , \"EndX\" , \"EndY\" ,\n      \"NumSeg\" , \"OffSeg\" , \"Quality\" , \"Spare\"\n    },\n    {{b, 12}, i, d, d, d, d, i, i, f, {b, 196}}\n  }];\n];\n\n\nisHeyexRawFormat[{\"Version\" -> version_String, \"SizeX\" -> _Integer, \"NumBScans\" -> _Integer, _Rule..}] /; StringMatchQ[version, \"HSF-OCT\" ~~__] := True ;\nisHeyexRawFormat[___] := False;\n\nreadFileHeader[str_InputStream] := With[{hdr = Quiet[read[#, str]] & /@ $fileHeaderInfo},\n  hdr /; TrueQ[isHeyexRawFormat[hdr]]\n];\nreadFileHeader[___] := (Message[HeyexImport::wrongHdr]; Throw[$Failed]);\n\n\n(*  Reads the camera image of the retina. Note that you must have the\n    information from the fileheader and you must be at the right position\n    of the file stream for this.*)\nreadSLOImage[str_InputStream, fileHdr : {(_String -> _) ..}] :=\n  Image[Partition[\n    BinaryReadList[str, \"Byte\" , \"SizeXSlo\" * \"SizeYSlo\" /. fileHdr],\n    \"SizeXSlo\" /. fileHdr], \"Byte\" ];\n\nskipSLOImage[str_InputStream, fileHdr : {(_String -> _) ..}] :=\n  Skip[str, \"Byte\" , \"SizeXSlo\" * \"SizeYSlo\" /. fileHdr];\n\n\n(*  One single BScan consists itself again of a header and a data part *)\nreadBScanHeader[str_InputStream, fileHdr : {(_String -> _) ..}] :=\n  Module[{i = \"Integer32\", f = \"Real32\", d = \"Real64\", b = \"Byte\",\n    bScanHdr},\n    bScanHdr = read[#, str] & /@ Transpose[{\n      { \"Version\" , \"BScanHdrSize\" , \"StartX\" , \"StartY\" , \"EndX\" , \"EndY\" ,\n        \"NumSeg\" , \"OffSeg\" , \"Quality\" , \"Spare\" },\n      {{b, 12}, i, d, d, d, d, i, i, f, {b, 196}}}\n    ];\n    AppendTo[bScanHdr,\n      read[{ \"SegArray\" , { \"Real32\" ,\n        \"NumSeg\" * \"SizeX\" /. bScanHdr /. fileHdr}}, str]\n    ];\n    (*\n      This is horrible slow, therefore I just skip the fillbytes\n   \n      AppendTo[bScanHdr,\n       read[{\"Fillbytes\", {\"Byte\",\n          \"BScanHdrSize\" - 256 - \"NumSeg\"*\"SizeX\"*4 /. bScanHdr /.\n           fileHdr}}, str]\n       ]\n   *)\n    Skip[str, \"Byte\" , \"BScanHdrSize\" - 256 - \"NumSeg\" * \"SizeX\" * 4 /. bScanHdr /. fileHdr];\n    AppendTo[bScanHdr, \"FillBytes\" -> None]\n  ]\n\nskipBScanHeader[str_InputStream, fileHdr : {(_String -> _) ..}] :=\n  Skip[str, \"Byte\" , \"BScanHdrSize\" /. fileHdr];\n\nreadBScanData[str_InputStream, fileHdr : {(_String -> _) ..}] :=\n  Module[{},\n    Developer`ToPackedArray[\n      Partition[read[{ \"Real32\" , \"SizeX\" * \"SizeZ\" /. fileHdr}, str],\n        \"SizeX\" /. fileHdr]]\n  ];\n\nskipBScanData[str_InputStream, fileHdr : {(_String -> _) ..}] :=\n  Skip[str, \"Byte\" , \"SizeX\" * \"SizeZ\" * 4 /. fileHdr];\n\nskipBScanBlocks[str_InputStream, fileHdr : {(_String -> _) ..}, n_Integer] :=\n  Skip[str, \"Byte\" , n * (\"BScanHdrSize\" + \"SizeX\" * \"SizeZ\" * 4) /. fileHdr];\n\n\nimportHeader[filename_String, ___] := Module[\n  {str, header},\n  str = OpenRead[filename, BinaryFormat -> True];\n  header = readFileHeader[str];\n  Close[str];\n  \"FileHeader\" -> header\n];\n\n\n(* Imports the dimension of the scanned volume. *)\nimportDataSize[filename_String, r___] := Module[{header = importHeader[filename]},\n  \"DataSize\" -> ({\"NumBScans\", \"SizeZ\", \"SizeXSlo\"} /. (\"FileHeader\" /. header))\n]\n\nimportSLOImage[filename_String, ___] := Module[\n  {str, header, slo},\n  str = OpenRead[filename, BinaryFormat -> True];\n  header = readFileHeader[str];\n  slo = readSLOImage[str, header];\n  Close[str];\n  \"SLOImage\" -> slo\n]\n\nimportData[filename_String, ___] := Module[\n  {str, header, nx, n, data},\n  str = OpenRead[filename, BinaryFormat -> True];\n  header = readFileHeader[str];\n  {nx, n} = { \"SizeX\" , \"SizeX\" * \"SizeZ\"} /. header;\n  skipSLOImage[str, header];\n  data = Table[\n    skipBScanHeader[str, header];\n    Partition[read[{ \"Real32\" , n}, str], nx],\n    {\"NumBScans\" /. header}\n  ];\n  Close[str];\n  \"Data\" -> Developer`ToPackedArray[data]\n];\n\nimportData[num_Integer][filename_String, ___] := Module[\n  {str, header, nx, n, data},\n  str = OpenRead[filename, BinaryFormat -> True];\n  header = readFileHeader[str];\n  {nx, n} = { \"SizeX\" , \"SizeX\" * \"SizeZ\"} /. header;\n  skipSLOImage[str, header];\n  skipBScanBlocks[str, header, Max[Min[\"NumBScans\" /. header, num - 1], 0] ];\n  skipBScanHeader[str, header];\n  data = Partition[read[{ \"Real32\" , n}, str], nx];\n  Close[str];\n  {\"Data\" -> {num -> Developer`ToPackedArray[data]}}\n];\n\n(*\n    As suggested in the Heidelberg OCT Manual the importer will adjust\n    the graylevels when importing images. Since this is very time-consuming\n    for the whole scanned volume, I use an optimized version of this function.\n*)\nWith[{$compileTarget = $compileTarget}, $adjustGraylevelFunc := ($adjustGraylevelFunc = Compile[{{values, _Real, 2}},\n  Map[Floor[255.0 * Min[Max[0.0, #], 1.0]^(0.25) + 0.5] &, values, {2}],\n  RuntimeAttributes -> {Listable},\n  Parallelization -> True,\n  RuntimeOptions -> \"Speed\",\n  $compileTarget\n])];\n\nimportImages[filename_String, ___] := Module[\n  {data},\n  data = \"Data\" /. importData[filename];\n  \"Images\" -> (Image[#, \"Byte\" ]& /@ $adjustGraylevelFunc[data])\n]\n\nimportImages[imageNumber_Integer][filename_String, ___] := Module[\n  {data},\n  data = {imageNumber /. (\"Data\" /. importData[imageNumber][filename])};\n  {\"Images\" -> {imageNumber -> (Image[#, \"Byte\" ]& @@ $adjustGraylevelFunc[data])}}\n];\n\nimportSegmentation[filename_String, ___] := Module[\n  {str, header, data},\n  str = OpenRead[filename, BinaryFormat -> True];\n  header = readFileHeader[str];\n  skipSLOImage[str, header];\n  data = Table[\n    Module[{bScanHeader, t},\n      {t, bScanHeader} = Timing@readBScanHeader[str, header];\n      skipBScanData[str, header];\n      bScanHeader\n    ], {\"NumBScans\" /. header}\n  ];\n  Close[str];\n  (*\n      The BScanHeaderData contain the segmentation vectors as a single list\n      of numbers. Before returning the result, I check how many segmentations\n      there are inside the BScan an I transform the segmentation value list\n      into separate vectors and call them \"ILM\", \"RPE\" and \"NFL\" like described\n      in the manual\n      *)\n  \"SegmentationData\" -> Function[{bhdr},\n    Block[{numVecs = \"NumSeg\" /. bhdr, vecNames, nx = \"SizeX\" /. header},\n      If[numVecs > 0,\n        vecNames = Take[{ \"ILM\" , \"RPE\" , \"NFL\" }, numVecs];\n        bhdr /. (\"SegArray\" -> vec_) :> Sequence @@ (Rule @@@ Transpose[{vecNames, Partition[vec, nx]} ]),\n        bhdr\n      ]\n    ]] /@ data\n]\n\nimportSegmentation[num_Integer][filename_String, ___] := Module[\n  {str, header, bhdr},\n  str = OpenRead[filename, BinaryFormat -> True];\n  header = readFileHeader[str];\n  skipSLOImage[str, header];\n  skipBScanBlocks[str, header, Max[Min[\"NumBScans\" /. header, num - 1], 0] ];\n  bhdr = readBScanHeader[str, header];\n  Close[str];\n  (* See doc above *)\n  {\"SegmentationData\" -> {num -> Block[\n    {numVecs = \"NumSeg\" /. bhdr, vecNames, nx = \"SizeX\" /. header},\n    If[ numVecs > 0,\n      vecNames = Take[{ \"ILM\" , \"RPE\" , \"NFL\" }, numVecs];\n      bhdr /. (\"SegArray\" -> vec_) :> Sequence @@ (Rule @@@ Transpose[{vecNames, Partition[vec, nx]} ]),\n      bhdr\n    ]\n  ]\n  }}\n]\n\n(* Extracts which eye was scanned. This is stored in the header of the file *)\n(* OD stands for oculus dexter which is latin for \"right eye\" and OS stands\n   for oculus sinister which is latin for \"left eye\" *)\nHeyexEyePosition[file_String /; FileExistsQ[file]] := Module[{position},\n  Check[\n    position = \"ScanPosition\" /. Import[file, { \"Heyex\" , \"FileHeader\" }];\n    Switch[\n      position,\n      \"OD\" ,\n      Right,\n      \"OS\" ,\n      Left,\n      _,\n      $Failed\n    ],\n    $Failed\n  ]\n];\n\nEnd[]\n\nEndPackage[]"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/Init.m",
    "content": "(* Mathematica Init File *)\n\nGet[ \"Foobar`Foobar`\"]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/MiscCalculations.nb",
    "content": "(* Content-type: application/vnd.wolfram.mathematica *)\r\n\r\n(*** Wolfram Notebook File ***)\r\n(* http://www.wolfram.com/nb *)\r\n\r\n(* CreatedBy='Mathematica 9.0' *)\r\n\r\n(*CacheID: 234*)\r\n(* Internal cache information:\r\nNotebookFileLineBreakTest\r\nNotebookFileLineBreakTest\r\nNotebookDataPosition[       157,          7]\r\nNotebookDataLength[      7164,        223]\r\nNotebookOptionsPosition[      6163,        182]\r\nNotebookOutlinePosition[      6508,        197]\r\nCellTagsIndexPosition[      6465,        194]\r\nWindowFrame->Normal*)\r\n\r\n(* Beginning of Notebook Content *)\r\nNotebook[{\r\n\r\nCell[CellGroupData[{\r\nCell[BoxData[\r\n RowBox[{\r\n  RowBox[{\"Solve\", \"[\", \r\n   RowBox[{\r\n    RowBox[{\"y\", \"'\"}], \"\\[Equal]\", \" \", \"xy\"}], \"]\"}], \r\n  \"\\[IndentingNewLine]\"}]], \"Input\",\r\n CellChangeTimes->{{3.6112716342092056`*^9, 3.6112716549793935`*^9}}],\r\n\r\nCell[BoxData[\r\n RowBox[{\"{\", \r\n  RowBox[{\"{\", \r\n   RowBox[{\"xy\", \"\\[Rule]\", \r\n    SuperscriptBox[\"y\", \"\\[Prime]\",\r\n     MultilineFunction->None]}], \"}\"}], \"}\"}]], \"Output\",\r\n CellChangeTimes->{3.6112716579295626`*^9}]\r\n}, Open  ]],\r\n\r\nCell[CellGroupData[{\r\n\r\nCell[BoxData[\r\n RowBox[{\"Log\", \"[\", \r\n  RowBox[{\"Sin\", \"[\", \"38\", \"]\"}], \"]\"}]], \"Input\",\r\n CellChangeTimes->{{3.611271663920905*^9, 3.6112716759275913`*^9}}],\r\n\r\nCell[BoxData[\r\n RowBox[{\"Log\", \"[\", \r\n  RowBox[{\"Sin\", \"[\", \"38\", \"]\"}], \"]\"}]], \"Output\",\r\n CellChangeTimes->{3.611271678256725*^9}]\r\n}, Open  ]],\r\n\r\nCell[CellGroupData[{\r\n\r\nCell[BoxData[\r\n RowBox[{\"N\", \"[\", \r\n  RowBox[{\"Log\", \"[\", \r\n   RowBox[{\"Sin\", \"[\", \"38\", \"]\"}], \"]\"}], \"]\"}]], \"Input\",\r\n NumberMarks->False],\r\n\r\nCell[BoxData[\r\n RowBox[{\"-\", \"1.2161514009320473`\"}]], \"Output\",\r\n CellChangeTimes->{3.611271682061942*^9}]\r\n}, Open  ]],\r\n\r\nCell[CellGroupData[{\r\n\r\nCell[BoxData[\r\n RowBox[{\"Abs\", \"[\", \r\n  RowBox[{\"-\", \"1.2161514009320473`\"}], \"]\"}]], \"Input\",\r\n NumberMarks->False],\r\n\r\nCell[BoxData[\"1.2161514009320473`\"], \"Output\",\r\n CellChangeTimes->{3.6112716842780695`*^9}]\r\n}, Open  ]],\r\n\r\nCell[CellGroupData[{\r\n\r\nCell[BoxData[\r\n RowBox[{\"RealDigits\", \"[\", \"1.2161514009320473`\", \"]\"}]], \"Input\",\r\n NumberMarks->False],\r\n\r\nCell[BoxData[\r\n RowBox[{\"{\", \r\n  RowBox[{\r\n   RowBox[{\"{\", \r\n    RowBox[{\r\n    \"1\", \",\", \"2\", \",\", \"1\", \",\", \"6\", \",\", \"1\", \",\", \"5\", \",\", \"1\", \",\", \"4\",\r\n      \",\", \"0\", \",\", \"0\", \",\", \"9\", \",\", \"3\", \",\", \"2\", \",\", \"0\", \",\", \"4\", \r\n     \",\", \"7\"}], \"}\"}], \",\", \"1\"}], \"}\"}]], \"Output\",\r\n CellChangeTimes->{3.611271685319129*^9}]\r\n}, Open  ]],\r\n\r\nCell[CellGroupData[{\r\n\r\nCell[BoxData[\r\n RowBox[{\r\n  RowBox[{\"Graph\", \"[\", \r\n   RowBox[{\"Log\", \"[\", \"x\", \"]\"}], \"]\"}], \"\\[IndentingNewLine]\"}]], \"Input\",\r\n CellChangeTimes->{{3.611271689258354*^9, 3.611271702038085*^9}}],\r\n\r\nCell[BoxData[\r\n RowBox[{\"Graph\", \"[\", \r\n  RowBox[{\"Log\", \"[\", \"x\", \"]\"}], \"]\"}]], \"Output\",\r\n CellChangeTimes->{3.611271704295214*^9}]\r\n}, Open  ]],\r\n\r\nCell[BoxData[\"\"], \"Input\",\r\n CellChangeTimes->{{3.611271712769699*^9, 3.6112717423153887`*^9}}],\r\n\r\nCell[CellGroupData[{\r\n\r\nCell[BoxData[\r\n RowBox[{\r\n  RowBox[{\"Plot\", \"[\", \r\n   RowBox[{\r\n    RowBox[{\"Log\", \"[\", \"x\", \"]\"}], \",\", \" \", \r\n    RowBox[{\"{\", \r\n     RowBox[{\"x\", \",\", \" \", \"0\", \",\", \" \", \"10\"}], \"}\"}]}], \"]\"}], \r\n  \"\\[IndentingNewLine]\"}]], \"Input\",\r\n CellChangeTimes->{{3.6112717573482485`*^9, 3.6112717747822456`*^9}}],\r\n\r\nCell[BoxData[\r\n GraphicsBox[{{}, {}, \r\n   {Hue[0.67, 0.6, 0.6], LineBox[CompressedData[\"\r\n1:eJwVzXs81Pkex/GZH7XlsutSQprwqxTSZVfJGp9P6UYqlyxHUhTaLrq4JpVK\r\n0SHRisGWjYiEbHSvb+Q27rllmYwaY6JpwxgZTI7zx/vxejz/eht4H3PyoRgM\r\nRsj0/t+1MEPjP1Zc8O6L0tCYkJERTokxP5YLLR+MQy2qZWSzX62gWcaFn9s7\r\n5sVFyohY4ZvLs5Ya6AheLQxnyIgFe4fllag6yH4zayhMcYw0FU5SRl8bweS/\r\nwyVFa0aJBsz2VDVrAl8V299DGKPk1yWJllEHmqD42vuI4RopiRvJlYS9bYLZ\r\na2c4j3pJyS8JbT7eeW/By6ht44vkEXKuxtRu1d4WOB5QmStjSUhO0eMleTda\r\n4EZtHmU5PEyaORsUFte1QFHRg6WjFcNkkZ/bC+11rVC0s8n9nf8wqVGINGNo\r\ntkFRzD3HsYohosXu0misbAdxXml1VdQgKSi80nXErBNo/oP47aliMqAxEGvn\r\n1QlVgoRvezzExCjYznppYifkn+K6CVli8peV8m2BrBNM20LljlmfyXVurK97\r\nRRfcVCpPCXg8QIIF14a2eLyHn6Y4909//UTSlWsvqm/qge1fVjduzhISa/Zp\r\njwjPHvCM6ZD7BQgJz9/E/GtIDyRsSj3Svl5ItJtj+uru9cBdE2PXZH4vSeDY\r\n20arfYAT6Z3e8axecnFxw49TXR/gU5X5vDu5H4kfvE0RnxSAsqvDMcduPmFk\r\njD7rihGA7RmZ5qlYPuEo6vFq7gigR67QPetXPqnm+rJy2wUA0hVVHindZOmu\r\nyQwfy17Y4OU185n7e/LpoNH9bqYQPPrPvwn+2kkOXT/zqim+DzJ72WEzdrcT\r\nSprBJ7l9UD/Fag2c005SXasZhWV9kH51Z/aqhjZSo6dpc3WkD4L1tqolbGgj\r\nJndzqmzdRPD67PLxVrNWIn7e0lS28BMs6Ba9FM1pJv7CZYLign6IeWFYmrqk\r\njvR4/jOrlNsPoqNsieZftcS5I9qsvrcf8tnmIzq6tcSiVnRKqDsALqbKTVU/\r\n1RCFoiw1ragBULG3LYphVhNOuIF1yN7PkFMpYVXI35BSTZ2UdWpfgMls07e/\r\n84QoGUQa8S0GgVn/55MIdixUWyWsOLtpEAIiTazYlglw2e3W2gVOg5BMOVFO\r\nzolAxT/ZsvvwIJAvj7SczqbC+Hex37ubgxD8udJ0tkcmfOa55DRSQ8DwsFzc\r\n6lkIdRyjZa/rhsAywLBSze45xKnVGt/eJwFLB1UN7sVq8O7aRRTqRsFbq7Mr\r\nJqcdTlREeh8zGoeOsKZ1bgF8KDqu4qxtK4c/T0q26boJ4PbpwwMrXRn4N9vd\r\nqamzDy6kTzqOiJmo6OOuteZtPzBaevBFmALy6nNqfwkTw5JA39BdxjPwSH3B\r\nvlWGX6FXmvyb8suZeCtkhRV5NAh2wkNnrp+YhaOXrkQMdg/Bjt54ExZLCdti\r\nv+y2+XcYBt54R1TnKyOH4R+txpOAmXr7Apu9quiaByGbG0dACaRePMmPmLmw\r\nvX84Swpbvrh/M3RRQziRFnP5wih0lB1gupuqY0FCbZyewzcoiS731JeqY4Zj\r\n3+qZP4yB74ygnoYGDcz5GOJ8uXwM9p88XaKSqonn9R26+EdlsMLPpMHeaw4K\r\nrc1neaqOQ6OGqXLQurmYKexKyno4Ds8LLqSZKmhhhvxW6cjWCTjNNHaoe6+F\r\npidKHHi9E6DEC9vqXzwPGaH7eO6hkyDMNkhMD9fGsUD+Knv5JCQu1VF86qKD\r\nh3vll15HyyE+1bfKS18XbTje/KqZ38E9cU+DikgXNYxUk++f/Q5jG7Nk6a/m\r\n49yHih6fJ7+DQLghtCxKD9We/pFtf2wKMtir5td7LcDHFdUyrmgK8i8Fqfst\r\nZ2H5rdC2ZGMGRrns36YgZWHfc/sj7Z4MNOfdzo2qX4jaWiITpSQGcpal5ddv\r\n08c4nrYPVjPw3OurnG1P9ZGdfship5yB2+e7ZNUsMsAzD/MLtFcycb1/1W71\r\nKwb4qn7LsIcnE9P1vBfVSQ1QUbd5z75rTFz05m7Sjt2GeHJ9UIrOCybGLy8z\r\nbn5liLETFcsURUz0lSi+5RrTGL/GlX1jDoXeRcP6V67R6DRvQNHcmsIjF5wn\r\n7RJoPPVD0ph42kHOxe9U/qDR/97LrjtAYbQ0KC4+iUa6N+b4nPUUFqyTTSTf\r\npDFTFtw6bEOhrHSqPTuPRo1786Pv21IY36xytbyKxo0v5z7UdKEwNfPowctc\r\nGuUeojTutDMDG2y21tIYpHQ98NxvFD7Sih+vbaBRfeZZ6YArhTx3zYMtbTRC\r\nCmNNqTuFRgIdm48CGveGmxUf2kfhyuIw1h0hjasPiNIWelFoealL5iOiMZKf\r\nHdA6bXujmw/6B2gk7zZK2PspPHlYnzU0RGN40raf1XwpDLc6L/tbMv0vikor\r\nn/Yl1Y+tgVIayzZ/kIT6UcgpzIwZG6Px0d7RwA8HKcyIUPR7Nk7j8sLHN2/8\r\nTmGeo8+G8Ekab1ncfmR7iMJiw8oF1t9pnF9RQuTTfiVZIpuaonFCb+xJ0WEK\r\n/wc13qzo\r\n     \"]]}},\r\n  AspectRatio->NCache[GoldenRatio^(-1), 0.6180339887498948],\r\n  Axes->True,\r\n  AxesLabel->{None, None},\r\n  AxesOrigin->{0, 0},\r\n  Method->{},\r\n  PlotRange->{{0, 10}, {-1.623796532045525, 2.3025850725858823`}},\r\n  PlotRangeClipping->True,\r\n  PlotRangePadding->{\r\n    Scaled[0.02], \r\n    Scaled[0.02]}]], \"Output\",\r\n CellChangeTimes->{3.6112717778594217`*^9}]\r\n}, Open  ]]\r\n},\r\nWindowSize->{716, 833},\r\nWindowMargins->{{Automatic, 214}, {Automatic, 26}},\r\nFrontEndVersion->\"9.0 for Microsoft Windows (64-bit) (January 25, 2013)\",\r\nStyleDefinitions->\"Default.nb\"\r\n]\r\n(* End of Notebook Content *)\r\n\r\n(* Internal cache information *)\r\n(*CellTagsOutline\r\nCellTagsIndex->{}\r\n*)\r\n(*CellTagsIndex\r\nCellTagsIndex->{}\r\n*)\r\n(*NotebookFileOutline\r\nNotebook[{\r\nCell[CellGroupData[{\r\nCell[579, 22, 224, 6, 52, \"Input\"],\r\nCell[806, 30, 211, 6, 31, \"Output\"]\r\n}, Open  ]],\r\nCell[CellGroupData[{\r\nCell[1054, 41, 155, 3, 31, \"Input\"],\r\nCell[1212, 46, 130, 3, 31, \"Output\"]\r\n}, Open  ]],\r\nCell[CellGroupData[{\r\nCell[1379, 54, 137, 4, 31, \"Input\"],\r\nCell[1519, 60, 105, 2, 31, \"Output\"]\r\n}, Open  ]],\r\nCell[CellGroupData[{\r\nCell[1661, 67, 113, 3, 31, \"Input\"],\r\nCell[1777, 72, 90, 1, 31, \"Output\"]\r\n}, Open  ]],\r\nCell[CellGroupData[{\r\nCell[1904, 78, 102, 2, 31, \"Input\"],\r\nCell[2009, 82, 321, 8, 31, \"Output\"]\r\n}, Open  ]],\r\nCell[CellGroupData[{\r\nCell[2367, 95, 191, 4, 52, \"Input\"],\r\nCell[2561, 101, 131, 3, 31, \"Output\"]\r\n}, Open  ]],\r\nCell[2707, 107, 94, 1, 31, \"Input\"],\r\nCell[CellGroupData[{\r\nCell[2826, 112, 299, 8, 52, \"Input\"],\r\nCell[3128, 122, 3019, 57, 265, \"Output\"]\r\n}, Open  ]]\r\n}\r\n]\r\n*)\r\n\r\n(* End of internal cache information *)\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/MiscCalculations2.nb",
    "content": "(* Content-type: application/vnd.wolfram.mathematica *)\r\n\r\n(*** Wolfram Notebook File ***)\r\n(* http://www.wolfram.com/nb *)\r\n\r\n(* CreatedBy='Mathematica 9.0' *)\r\n\r\n(*CacheID: 234*)\r\n(* Internal cache information:\r\nNotebookFileLineBreakTest\r\nNotebookFileLineBreakTest\r\nNotebookDataPosition[       157,          7]\r\nNotebookDataLength[    200462,       3656]\r\nNotebookOptionsPosition[    199657,       3624]\r\nNotebookOutlinePosition[    200002,       3639]\r\nCellTagsIndexPosition[    199959,       3636]\r\nWindowFrame->Normal*)\r\n\r\n(* Beginning of Notebook Content *)\r\nNotebook[{\r\n\r\nCell[CellGroupData[{\r\nCell[\"\\<\\\r\nHow far is the Earth from the Moon?\\\r\n\\>\", \"WolframAlphaLong\",\r\n CellChangeTimes->{{3.6112720079145803`*^9, 3.61127201386392*^9}}],\r\n\r\nCell[BoxData[\r\n NamespaceBox[\"WolframAlphaQueryResults\",\r\n  DynamicModuleBox[{Typeset`q$$ = \"How far is the Earth from the Moon?\", \r\n   Typeset`opts$$ = {\r\n   AppearanceElements -> {\r\n     \"Warnings\", \"Assumptions\", \"Brand\", \"Pods\", \"PodMenus\", \"Unsuccessful\", \r\n      \"Sources\"}, Asynchronous -> All, \r\n    TimeConstraint -> {30, Automatic, Automatic, Automatic}, \r\n    Method -> {\r\n     \"Formats\" -> {\"cell\", \"minput\", \"msound\", \"dataformats\"}, \"Server\" -> \r\n      \"http://api.wolframalpha.com/v1/\"}}, Typeset`elements$$ = {\r\n   \"Warnings\", \"Assumptions\", \"Brand\", \"Pods\", \"PodMenus\", \"Unsuccessful\", \r\n    \"Sources\"}, Typeset`pod1$$ = XMLElement[\r\n   \"pod\", {\"title\" -> \"Input interpretation\", \"scanner\" -> \"Identity\", \"id\" -> \r\n     \"Input\", \"position\" -> \"100\", \"error\" -> \"false\", \"numsubpods\" -> \"1\"}, {\r\n     XMLElement[\"subpod\", {\"title\" -> \"\"}, {\r\n       XMLElement[\"cell\", {\"compressed\" -> False, \"string\" -> True}, {\r\n         Cell[\r\n          BoxData[\r\n           FormBox[\r\n            TagBox[\r\n             FormBox[\r\n              TagBox[\r\n               GridBox[{{\r\n                  PaneBox[\r\n                   StyleBox[\r\n                    TagBox[\r\n                    GridBox[{{\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\"\\\"Moon\\\"\", \r\n                    $CellContext`TagBoxWrapper[\r\n                    \"Entity\" -> {AstronomicalData, \"Moon\"}]], Identity], {\r\n                    LineIndent -> 0, LineSpacing -> {0.9, 0, 1.5}}], \r\n                    \"\\\"distance from Earth\\\"\"}}, \r\n                    GridBoxBackground -> {\"Columns\" -> {\r\n                    GrayLevel[0.949], None}, \"Rows\" -> {{None}}}, \r\n                    GridBoxItemSize -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}, \r\n                    ColumnsEqual -> False, RowsEqual -> False, \r\n                    GridBoxDividers -> {\"Columns\" -> {\r\n                    GrayLevel[0.84], \r\n                    GrayLevel[0.84], \r\n                    GrayLevel[0.84]}, \"Rows\" -> {{\r\n                    GrayLevel[0.84]}}, \r\n                    \"RowsIndexed\" -> {\r\n                    1 -> GrayLevel[0.84], -1 -> GrayLevel[0.84]}}, \r\n                    GridBoxSpacings -> {\r\n                    \"Columns\" -> {1, 1, 1}, \"Rows\" -> {{0.3}}}, \r\n                    GridBoxAlignment -> {\r\n                    \"Columns\" -> {{Left}}, \"Rows\" -> {{Baseline}}}, \r\n                    AllowScriptLevelChange -> False, BaselinePosition -> 1], \r\n                    $CellContext`TagBoxWrapper[\"Separator\" -> \" | \"]], \r\n                    LineSpacing -> {1, 0, 1.5}, LineIndent -> 0], \r\n                   BaselinePosition -> Center]}}, \r\n                GridBoxItemSize -> {\r\n                 \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}, \r\n                ColumnsEqual -> False, RowsEqual -> False, \r\n                GridBoxSpacings -> {\"Columns\" -> {{\r\n                    AbsoluteThickness[-1]}}, \"Rows\" -> {{0}}}, \r\n                AllowScriptLevelChange -> False], \r\n               $CellContext`TagBoxWrapper[\"Separator\" -> \" | \"]], \r\n              TraditionalForm], \r\n             PolynomialForm[#, TraditionalOrder -> False]& ], \r\n            TraditionalForm]], \"Output\", {}]}], \r\n       XMLElement[\r\n       \"dataformats\", {}, {\"plaintext,computabledata,formatteddata\"}]}]}], \r\n   Typeset`pod2$$ = XMLElement[\r\n   \"pod\", {\"title\" -> \"Current result\", \"scanner\" -> \"Data\", \"id\" -> \"Result\",\r\n      \"position\" -> \"200\", \"error\" -> \"false\", \"numsubpods\" -> \"1\", \"primary\" -> \r\n     \"true\"}, {\r\n     XMLElement[\"subpod\", {\"title\" -> \"\"}, {\r\n       XMLElement[\"cell\", {\"compressed\" -> False, \"string\" -> True}, {\r\n         Cell[\r\n          BoxData[\r\n           FormBox[\r\n            StyleBox[\r\n             TagBox[\r\n              TagBox[\r\n               TagBox[\r\n                RowBox[{\r\n                  TagBox[\"239\\[ThinSpace]262\", \r\n                   $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"239262\"]], \r\n                  \"\\[InvisibleSpace]\", \" \", \r\n                  StyleBox[\r\n                  \"\\\"miles\\\"\", LinebreakAdjustments -> {1, 100, 1, 0, 100}, \r\n                   LineIndent -> 0, {\r\n                   FontFamily :> $CellContext`$UnitFontFamily, FontSize -> \r\n                    Smaller}, StripOnInput -> False]}], Identity], #& , \r\n               SyntaxForm -> Dot], \"Unit\", SyntaxForm -> Dot], \r\n             LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> 0, \r\n             ZeroWidthTimes -> False], TraditionalForm]], \"Output\", {}]}], \r\n       XMLElement[\r\n       \"dataformats\", {}, {\r\n        \"plaintext,moutput,computabledata,formatteddata,numberdata,\\\r\nquantitydata\"}]}], \r\n     XMLElement[\"states\", {\"count\" -> \"1\"}, {\r\n       XMLElement[\r\n       \"state\", {\r\n        \"name\" -> \"Show metric\", \"input\" -> \"Result__Show metric\"}, {}]}]}], \r\n   Typeset`pod3$$ = XMLElement[\r\n   \"pod\", {\"title\" -> \"History\", \"scanner\" -> \"Data\", \"id\" -> \r\n     \"DistanceHistory:AstronomicalData\", \"position\" -> \"300\", \"error\" -> \r\n     \"false\", \"numsubpods\" -> \"1\"}, {\r\n     XMLElement[\"subpod\", {\"title\" -> \"\"}, {\r\n       XMLElement[\"cell\", {\"compressed\" -> True, \"string\" -> False}, {\r\n         Cell[\r\n          BoxData[\r\n           FormBox[\r\n            TemplateBox[{\r\n              GraphicsBox[\r\n               GraphicsComplexBox[CompressedData[\"\r\n1:eJxcnHc8lv/7961K0lCUnRWl7JHMt7JCIoRCGso4r+u0QktRpIyGKCoaRkap\r\nbNFQUQoVSRlZITOJkHS/rvv+fP+5f//8Hq/Hh+s8jufxfh/H6zgvfSX30Nvc\r\nOdjY2ATnsrGx/v+wEU/7SFO/YUOKbGH4LpoEPBBMiPjcb6j70EbK25YmdcFB\r\nU2u+9BvKxbtfdz7CJIXcHGcqoJ1lDalFZxnksi4t7NjcbzivYCPbyRKKWL1Z\r\n5zQN/eiozmB4AEUuSC1/caGl3/DCduc4Q3sGyWzY2qLR2m+YkhR6eOAjkzyS\r\npyYaoc3/GAj4HqCJ0+Z8XUZbv6GqcrJn4nMmqamwVF7ytd9QJ2Ms9Uwig9Rw\r\n8VnfgS7McrW78Y0iVf1Fvnrt/YZncyYcxR5RJGFtLvkKHap4MvC8AoOMqn/Q\r\nCezoN/QLi+9o1GYSqUTjbqHOfkOj6GrBUGOaWN68GlsK3T4+P1pQliacfmLu\r\n1l39hsun8pUNZxnk3PWRvp/QNV66JcoVFMm4MHTlbHe/4Zb30xPV5ykS364z\r\nofit39CJ42NTNJ53tJ6yfwfNXFIyv3Ylk/yIfd2+v6ff8Lpc+POzvDTZkBYo\r\nxNPbb1iZvGJ3AUWTRae2htyCzghf4ut2nUnY/r//UznCp6ODepx28K88fZgm\r\nUgKvTJuguRKsZjaMM0nFU13DQNQjhO2Z82IOJkm/VWyzEPwzm7oCY4UZ5Cdn\r\n7YZM6L9n15gMoB4/Am8uMkE9Iv94sp1GPtf/qL7rgj57QkDQX4xJHv5z8YxA\r\nPWSKtN/8NacJj/Z5ISnUo7h8aIOwKk2WRZwofAy9h8OpUH4d6tOlSJxRjyfz\r\n4zakrmOQ6qDu9p/QKisin4g+o4hilJpTLOoRXXKl7U0zRYzuk8fyqMfN0yb8\r\nNukMwtO7YMkraN663d2un5hk/XWfDV6ox6/4SofZPTS5c6bl0Bzwd/GfN/dV\r\nOpO8Pj034yb0l0SfQx2mDHL18vBTfdRDcmHz69IzFBEvuVTVAv0y4dQPmVqK\r\ncO9oSDuOejzMLKzISmEQTRWRqyKox8noIVfua0zCLyxxrBh6rjrvcArOfyp/\r\nl8V21OPkJbHJyjU0CTS+qzIEffXJl8GD7QyypD0mRgD8swMtLXQDaWKx9wcz\r\nF7po3/ePB/Dzr0R3iFmjHrwX/g4M6DPJPXuXoV5oi79b1q+2YRCjG+JZJ1CP\r\nmCmuPck4Pysle9UkwH9E72x+/wWKrDgnU10KXXRgRuRkEYMo9jdKuaIerSvv\r\nrYwVpske1dnTM9D8/Y9v7rWnSeGBpKl41COG+8TbqENMsqVeT0sT/Gdsik/l\r\nuTKI5ePDV2qgSXPw9fA6ikyXHvzmjnp8U7eWbHhJkaGhoH9c4L/v8ivXD/sY\r\nZHbhyKoU6I0Bh2o0o5lknUjzoo2oh/l8jWd24HNYQJerHfqJYdSXc0NM0jPD\r\nN/cQ6rHNYp3KQ/CNFx5pEAR/d44FT3yvU2TPKsP7edDfV271H89EfxDjtnJA\r\nPfZVKU2dwPOcOIwmx6G/vnhYKeHKJGENv+6dQz12OzonL9GjyXBLjqoy+P/J\r\nqOhkR74V+2Y/VUF/mfkxw9jEJNuWx/e5gb9d268PUkyaTFamSLCDd1yy+KRJ\r\nKZMkjywrVAXvI0X8krt7KXLjwLHX76E97kfN8/OiyNO3O797g3d1QtSFAi4G\r\nkfYwbOQF39oNIpY6x5lEU+Bb7j1oLl/7ky37aPLQUCrbFLxlfmWJu7LRxCd1\r\nv38v9Cb5NdmKOB9bfq00CwPvcFONtJv4PDMVqzWC4D2g/PuObil47Bx9Wwi9\r\nbnt3ssIsRZL85h+zBu9etuGl08MMsvzp6ukf0Eo+juTVcppsXDl330Xwrt5w\r\ncfTOVpo0/j06Ig/eOW/fOJ60Z5KcpX9Mq6E9t5auSpqhyE3+4Zx94O0re8FF\r\nPIIiXyz72uaA78nET9SdaYosc/upZwi+hd1zuXhx39J3WVh0QBc1Lg8/4oP+\r\naynkfhR8d9aeXNs9wPzv/H/57/y7kONL3xZygDeJKmHr8KKJ29lTHFehDb5k\r\nqKob0uRttccCPfCvu+w1bunCJKq5SjofoesvVNlcZTAIc9hkDwX+uY7SIa9v\r\nUURz4ozJQvBPDqiM6AqhSIOjmGk6tFlRwbadEQxC7Yr7txn8VW0sFzRPMkms\r\nosaT79AD6iLn/XbTJNJR7moo+I/MvmEYpTDJQgtjdWnwn+Iwvlt4hEGiO4x/\r\nlUL/ZRP/RH2mSPuHhGwb8LfNLC1sfEyRiuhlEj+hh47VXu43Y5Dgm+33z4J/\r\nj7NMyfu9TCK34/yUAvhzHa8S+rOdJnubvTfXQKuMLBFrQj8PKLpcsA/851+w\r\ncpyqZZClziNtc8D/vDDbxsG7FDm187JMCvSJiVizliSK/JyVlNqEeix5cbJm\r\nN57X79Uk2wVtoDVmMYV+UaLy1fQI6mEsrON/FvOI/xmfrBjqERtX+mzBfpp4\r\n/JJdWwDNZ+ofWueD/m9Wz2cF/rzD3cXn0Y8WDqvlD0IfOXbiAt9nzLvNPZwS\r\n4H2Nmah5mY1BXhekhZZDX6kcdKrF+W+6OfvHEbzPZeXpb+4EHxVt20noVIq6\r\n5GrFJAFnb0YngbeTJqfWkBNN2vScOtXBWz1eN+2eKM5n/Bh/PfS3sqSQ1Dng\r\nT8kZ0eA90snmHybIIGfshMLngO+Utc3Sc5jPZv5L425BP2iVLUoeoAjNl3Zd\r\nD7wzmv/Y7atmkPO2wuEt0MvD9xodnGISXddHViHgPSAletoQ/efJ8xx1QfAO\r\nThsS9g9hEu2aE78LoB/U7nMKk2QQ8e3DhTbgbdLJOKJ+iiIzYfq2o9CzNSfP\r\nreuiSOqrCEoRfJ/2zOy5W8IkrWUa3W+hvWJUbfO8aRKiHOLoCb6vrd11+hfS\r\nRPCX4bdRhW7D/MWpvo4e+8mNu1v3rQZfAS+dC7cO0URT17n5OfRgruiBPXw0\r\nEdk2MXoJfM/wv+YjxzF/LI0k1cBTRDt7Yk8G5m+AsIkfeH5WsT+6SB2/r1ll\r\nvRj8dHuSa8NNaRKzU1N3M/i13l31NduYQRZczdVth/ZsfUxlVVKE/7bdysPg\r\nZ8ambW6Ifn7q8N+kPPCyv1nNvygP961llcx28Jrh9l39COflwlbeJz+h2Xmr\r\nfKLfMInjxujtMeBV+PxMYaQ/gwh+Hq5eCz628nUaiZhHZKRf5xW0wpKtZubo\r\nVxZBPMtTwefvQfk2DhuavJ40NdjEmo+PqjknN9FE9OPHU1+gddq+/RrlY5Ku\r\nru1P/MHj+6qXE2f20kQ4wdDDGDxePL2a7I54g4Ts+Xqg1yfJFwjg/N35XdwY\r\nAj5zXv8KK4N/2J9s5iQJPhcb/L3eZzHJZMrq+groLxcSMqs8aBJhPOC/A7yi\r\nRi2ss7uYJOaooGU8+By7kFHp/wu8F52skQefQbUFSznhR49uejf3DXQev/ej\r\n9/wMcm3denoOeLhEa3PkqNDEtN36UDr0li/lk28MaCLuePBKG/jwemgP8rVR\r\nRKZ+6FYQeFzzyjfgjqRI2G+XxXbgIRovffDITybx4dj9cBw6sk05WdKfJuoe\r\n+b7nwKNsRerdTZX/65/V//XPLaRwrbfFFPy2noDPTjV3mvRft3p7Hrx+be6S\r\nuwe/VSvpE6aGfvlAwOO1HcUkv5oFO99Ar3Dm+tqAfhYmsFN/D/iZ8ERtTEV/\r\nqXBrruMEv5zJEyX5hyjysDxxzjXokjnz/WvRb3mSRocMwE/ZQySUvY9JUnPe\r\n7WiHts5WsXqP8/Hj3ZB3EHgeFCwYYD5gkqG5mx8KgaeQveiaG/D36/zX3noA\r\n3RL3w98NPBpcM2JNwXNudtO86TKKrHPefb8Pen3j6tN6Ogyi7u0UeALnsWxT\r\n+bdzW/G8qf5hafAlF+9o6WF+OT7mHHwO3eIbYxcsRJOySztidoD3+QdfB671\r\nMMi7oyN7Z1j+O+PwyTWF8POBFW2XwH9V94uU+niKvBhR5N3A8gt719n+1mYQ\r\ntRSpx5+hHWQas/YqMYmdmx2/L+pxIo3LKht+SVbtRcoy1GPCuPpNgSdNdHQf\r\nNWRDu/QYTq04zSTTu/3SjcC/b7wluwr++gr77LFO6EVneitX9TJJ98G6rOXg\r\nrVC901B1IYO0tZS45EH/funU/pSmyD5e6/Ct4M1bH7vS4wNFHicU8g1Dt3HF\r\na/3QYJJlL/8dPg/eHEI7Lh60o8mvR7+OrQXvwDXx9D45mmQtLP32Cjq+/VBS\r\nryD4y62tcAfv1Ps9n/2kGES+Z1Z1htVP8wb77DGvdP5JBV4B7xtvvpoXoJ99\r\naf+poA7e/15zBAoVw3+IxZl/gP7urmB5+juTlP4VMAoAb0dn35GVmJf56Uaf\r\nFoGvQ9Th89cvwm9lbarLhj7Fq+0/ocYgLYHDOmbgnT/bHmcB/7Aw2XNhL/Ru\r\nVa6nd5rgF2feca4C39i+oKWzuJ/BA1n3K6Bzl/49OMzqN7eUP+wC33S/Z4lN\r\nIjSpuhYUNXK21/DOAQOlAzJepKlyeFIcfHf7p0wooX8+3SqbVsLab+TPZoSK\r\n0UT5EE/tWfBd8Xq8PvI0RS4VxmetAc+EsqSP6dcoci43WN0DPNXozoaE1djf\r\n8vcMzgG/Oy/OyzvjfDFWaJcagNfwv+EHStsYJGddfH8j9G6zdLaL1RSZp+TO\r\n4QN+l4VfFpyFNjQKdMsErx//bjt43mCS3CMnhCzBK7V24FIo+leEauru79CT\r\nqzJXxbYwScrKrYonWf3Tabm98xkGaZwa3ioFPo8Dzx9Tx/m04Vk+UQ69QLCu\r\ndeVDivSkHe9MBJ+OicE8WzOatHhNF28Any0PTMaOWtJkRNRL8T10FGNgMlee\r\nSYT/jtt6gUdw48zXAZzXlgr5xbrg0b9z2/LKLxSJJp5DzdBWq3a2bUL/VN/D\r\n43YQfPqUCE8J5q0R58sVK8An5Ae1xyieSS5/iXhWDC3c+mzMD5937XnEYhvw\r\navI7UsSF/sXQEq2OAp92rrfHW/+gH6d4HJEEH2/V0NYU9E+6rv37U2hmgdzd\r\n4/Ph1ydy1f+AV/m3bY99V9HkxfFs5jXw8eVZfbAU88tdQ8unAXycD5SEcwxS\r\npHNsSI4JHkde3bJahnpWr72Tbg4eh6p/1vh/Y5IFKo0hA9DH/nAnf/WjicmX\r\n/QPh4MH9K25wGfzL/5u/Df/N3+3EbGqdFC/4bGTnTI+FX20MLNVKg+5JNuOy\r\n0oB/rVKNCASflWv4f+QlUiQrSqt8OfiYPjkUp4jn18ho8NmBR6TWsfj8+TQJ\r\nvp8oPQZ9fPGQoPdOmgxudTN5AR7iTAvtQw047yYRr3Yif42tzdFi2GezSjW4\r\ntFjzwyhkSA4/z5ysT2+EPu3COHdhFv1HZ8RpMav+seFsuWkU8SeUVyZ0pVwd\r\n95ub2E85vY6Es85DyZvIGswf9q27cmSR74vr+h8iXGhyVkn9mAPyUe4ZfOkE\r\nHvmxF9KqkE+YTpnyDdT749ZNyamI955tTus++KFXT8pN9FFPv4NfwosW0UTh\r\nvnRlMOLXFhDhvbiIQfoq1D4tQvxeSoyAz5jn9r3s93OgX4wwpCPHKFJ/5uaT\r\nHtTz9rRLhTg3/NVjN6dI5DPoOcO47ECTsZHylU9Z8/DcOYNFixnETWNYZSfy\r\n8Tx1nFoTTpGNsU9XfEI+Sg9lqBXYv6jHb9r8kM/dO/5e+eDhZcFr8Otdu+Gz\r\nIu78zTl7iMel+3UqyO+V26e1Aui3c9d2CqQgvznWU9kChzGvO35e1mX5ARnj\r\njjTcHxvtMoejrPr8qpKOwHyWKF5bIIh8p21MuN7p0uRuiurjbci3bqcz7+oN\r\nDOI1vzr2O7T/YemErucUkVxhpHuK5T+/3Wv7XU+RfN03im7I70KdyFPWPrej\r\neNhYA/lEi3z8tyaGIkoNT0I/QMv94ZK8id+/bxa/+R7yc7EX2W/jiH07Iv6l\r\nJfJrLDq0vWA9TTbHGDZ3Qfdbtf9Qm0K/qS6SP4b80ryjog/jfOz5STR+NLPu\r\nU7H+JJMikRveJq1FPmnFh/1cnzLJDvfq7rfQZ0y8d4nC33gcvb5SHfG2/r7H\r\nsR/37+uex5mLEa9NdFhMgg5NqsnEyfvQXibvbG+p4fwffvi0D/UR83q0TfId\r\nRfY/HBILRfwvOE0frorGvK4f+PYP8dfppx4foP/3PqP0Pz+iR7YVl8b/gh+J\r\n3PEm0nkPTXIz1B5EIX7BEOE0XvRTq5qxckX4D43G/XlN/kxi7xejUQW94dmt\r\ntNEwBuFd477OBfnptu+/GZcH/7X8FP8/6Dzttm1iQRSR+vGpOwH1dMhV5Yzc\r\nzSA7iiS+aSNf53GOsktfmeS+d/KdZmij+mIVyQM0kVloY+eH+q5Py5Q/hf29\r\ntdt8lB/1lJ+d18t/kUFmdMSncqDT9rlJzXZQpDZV6cRG8PqafeD+AviRjk2R\r\nk13QzhyNs/vVsY+9E3A6gvPNvydzr5oxk+zdfOW7OPhtOleyehf81ofcrXpP\r\noNvyLHxercQ+y6l7yB48GwzvFDB/MohyDJ3+G5pt/4YtudhfxLmaHp0D38Nf\r\ndllsjYP/8dBgV4f/8HvItnwjnudYUjX/I7TmVdMvV+SY5Nbv2Glv1rzsecF9\r\ndRnmG3W9ZRHOi8ZPnwQN7BsybuFrMqDV16/R0MU8Thh+9sMA/Ie2PVv2DPfD\r\nZUHXnlboM4uvdigNM4kxr9EsH/je4Hre+GQZg3j8eG5xD/rQHcNl2/3Qn55N\r\nvjYHb4sDM+eCMN8UX//60QftYpvJU7KGSfZ0KvpFgXfvil/JJdY0+Xe44o0s\r\neF/2f2b3ZB32u81itc+hmX6eq89Igf8cBfbd4B1y2WmhtxyDTN8bPfMb+py7\r\ntl3JE8wf4+wDceCttrHs0tOvmM+vhAKVwFuNRMz9dQ/+MWyrQg2061VTQf92\r\n+IUtz/Vp8Nabuiq9GOdN8cr51Tzg6/SPvHl4jUlkhVY9SodmZsucUNZjEN3T\r\nzJBN4F02p02RM5L1fvd4fwe0gLtR037c56UrArdKgK+ul4ZX+m0mqQz7llAO\r\n7XSbS9UU8zupef7ineBrfWrkVZ0U9nVb/U3C4Dkv2CZzIhjz3WnB2Xzo+VUl\r\njwOkaVIazV8WDp7bdv9NWob788Vbf0QG/OqPLX1pdpkibW8z1u4FP6uFa9ib\r\n8XkO/sra7ODl8kmuZ9c21GtcZ0obfMbv2F71dWSQo+OnDT9Av7uwuG5BDUXY\r\nDg6NeYHXyYyz3kqvKCKRqboplbXvPopdap3AJMw3Cvym4LOOWrLWG36NTebH\r\nw27oZjVhtsWYlxtjlYVDwKc6zVnG5BKDaPLQF8XAQ6psi7gt5t2Xy2vri6F3\r\niZ67w3MP9dErfXUJPG5kyKx5uJEm327Xj6uDx+0cLu8nqH8TUT/5Fjpcc3h6\r\n0XomKTxjnOwOHvu/BDvNo2ii55SyZz14PDyTd3UZ7ttyO//mRugvXmM/d2Ae\r\nHV6Rl+oDPk5d37YUYd7ka3D+5gOf2BOebcfOMknP74LiPGivf2u2X8H9zgiz\r\nc7EEr+Nqy7xVsN+7LBeffxp8stwqfDP/USTYY+cHUfDJUdHdNIz+5yHg2fwI\r\nWm/O3PRGTgbR2kmtmACve9n2/0TFaXKyztHzMviISbnkPbCgCXeqkHMd+Jy4\r\nXyfohvm2kYvp5QkeYb+FGq/Azw4bb/lpDB7z9m7O2duGffjVEvce6Jm+cxfu\r\n+tLEehlZHcq6n+0LeI92wv+HH6XmgUesiWt9EYMmV0+kiN2AjtMNFjFEP+7+\r\nohvgCx4BT0WK9JOx35MO9qXgEX5iNOxdKEVEN+7j3or8573Y986UHfHSB3yH\r\noTWlTjUwXbH/CNpef4L8Y4ryucca4RejF5VuR77Bd9Yueon75cHTNauK/I50\r\n3DrJ50STvu8rJ99DR97bxh45lyZ5FvQ1Htb3EQ0bb9ZkUmSmJtQ0FVpk3bn6\r\ngusUoZJSd59g1d+Lc3Yt7jdPpNZ3SeQnkjiz+TXOl2zZyaptyEe838PgYABN\r\n9G9djatAPktC7YyLUF8Zhl98CuItf/GJJ9OZJvUhUZc2oH6Cmn4bugVoIha7\r\nak4A4uefiTE4i35UHCWryIP4MxVXf5FDv7RSOHszA3r7fnNG3Aj202GXWx2o\r\n36WnbpzVbDQJWbTI7iTySQxVyYnFvExwTVnwCPWrUjpsaQY/+8SYGbAd+Tjk\r\nTYzdO0WR86v+/H2PfPpTsnd9w/k8+DtVhIl8JAzW846BB5ckm7AC8mG6n2lr\r\nxn5xXn+QMwn5nFbtaMs6in054WrLetSnNVht3rMcitxwGLAKQn5JFxdZV2+g\r\nydqgKQ5+5Cdyze+7PO7L9WPqf7cgv0auZ+OeBgyi/aHsWzcr33W+7KYvKSLs\r\n8lbhOOt9ul/ApWvv4feig9fsRD6mlMmvN9jvS14xI5UR/4jUh6SOWIoU7/7o\r\nWgN9m/fcsV3Y52a/1illIh/uHimpLOyHT58wOcyQz/xXGeE5+jRRfbBA+St0\r\nz4qunxfnMImZw7yDwchvh9kdwzD4v8E5FtIDyG9jzMQBFYoiv715Dssin6sm\r\nQcOXC5gkM2yquYr1/nTwBJcf/IWW8flAJdb9UrfOyS/Gvlp1OJoH8dZHt5ne\r\n1KRJ5PnbIdnQ3D556w9o0+Tw97icLtRD4PvhFKFPFHlZwXA7ivifiQ4trj+D\r\n+e4t+3Ya8WfH9sdG4P6suuTZG4/43gnkZG01ockku431AcS3VT23Kz8D/i5b\r\nNYob/NMKpSUsUY/EIY6F3xDfLdOHFoHwY85ZWhaF4MswP53W04x+JrjyuiXi\r\nXZu1eVdfOe5Hpt6v1YhvfcJlMxHwantblPQK+otSndZqzFdfipZkR3z1buWd\r\nPPCPC7/nsCex3m8NrfnlcIUiYtP9ewTB0z1Rml0TPFw/SjlvRrzTo26qOZgH\r\ndq9z6WLE69/le3ctgyIvMt6djEd8YxmK7irww99nZJWVcT7sv3qcnY/+v0OM\r\nt4UN8W3hSDn2E/7jz12PzYcQz80nJo+U3WhybD9zyhLPt/ndNRmH8ytv51Nd\r\nBV7fD5eYhHqBt6dD/D7E89ctzquDnya62in3pBHPI+bQJk+c33R3tvZziKdF\r\neZh3Ngz3iX3IXZHVb/9I9XDdogi5uFmPgfgE31+9s02RJobjl5J5EN/ogymm\r\nI/bLlr234prBc3RWV1UQ82bR95YlB1n1j/n379tb9Ku19eI2iFdEpWr2Ms5r\r\n0HfmQjnEW6Ty9p31RYq8Osom9By6YNniZRqFFLmyyHgmGfGPzlFN2rkF/klF\r\n8qg+4m8ujDyijf02xCd9Ps3aXzk7sy+g33Mo7PrXjviffq14vQ79xKzcoboc\r\n8fquz7ESwz7a1HhQRpZVX7XKIBv0+8MXxmzYEE9fVEJZIfrVXOVZ/5vQU6M/\r\nNZ9vQv/sYnzzY/n1xLVVMdjnHidevfKD9X5yYVgWH/pXDtX6aQme//tRRrC7\r\nP032NZ4LFgEvnln21GjM85B5c4Wd8Pz5d+N3SC6lyS+22UY31vvUCoFPwfD7\r\nv+ZG2jfjebe3zuQvmWBi/+fPyGR9X9154r4E/IrzzUOPH+DnhTIqLp+apMie\r\n8J83g5D/ibI/5pbjTPJ23u5wTTxfynnVISv4N8115raGeH7VuU8+Cdi/OMRi\r\n3ELxefu2h/42NKZJ+TPl4w6oT9XD31I9qgyy+v0j8zP4/D7lg6s/4b65eQZF\r\n9OHzf4S3DjcMMsiVvKxXWvjvlh8+3DXE590I6dT+Cf+u9Dd45SjO28V16dJn\r\nPrPePxZ26djQZNHtgp3r4NeDNfffSQpCPuWmX19Azxsb5T4RwSAfVL1u70B9\r\neKsbrKNQ32yfpsIZ6KLm6JT3BymyY36Q3SXEL3vK9M2+nQzCYVLspoX48wfF\r\n4zWamUTTInzrZ2j9A0elN6Pe+tlhr2icvysD0tWLnjDJx/o355civ4cf/hrX\r\nxTPIvhuXU7Ogl0bu0qnrokh11dikAfIRW5d76hLmRVnR1Wsd0KsTc0r/KDNI\r\nGEdAdTDmhYl/itQcAv8zOrxflNVfF1ZI/DClybk749/KWN/fN8iH/MB9fFi6\r\nbmQb+tXvM9FJDpPYV+NzTcehi3q1OX+g33ZW75GPwflJs1eQXIjz7ZZafEQF\r\nfv3RZ6+gXjzPyyQp9wP0B3s2vzxpJtm8KYfhifMlMG9Vz9Il2Me5eY7wsr6v\r\nN3txZBz+Xcivvz4VmtEmalt7GX4h/3u8Hvgb2gszUlF/ct7+4xfo5R9+DeeP\r\nMkmgw2zGYtb7HEa9rNwKBlGYflWRDV2WWJBzw58iW0S3UGbg7amiZna8Evtc\r\nZ5xbD/TVw3n+1xEPj2/lUCR4RxxYUdCM+3dqR6afDHhvSHSoopTQb3utNj6D\r\n3qGze8QJ+8fHX3dvuIL3AM8yud41DLJnmbfGOOt9mH7HfO+nFFHxoNvPs/an\r\nY1kbKlsp4qWrIKwA3ikHkv95ZDHI1fy7ydXQGgV2s32ot+O4UBkF3qGmD8oj\r\ncB8Gzmu+nwe+OzakepTfhL9/J6CSCl3uV3OB2sgg1Ll7Kw3B2+CM80wb/PuO\r\nn/Odvnazvm/b1/0S+6pMqtm4GPhu2eDb1JPCJIxaDp5H0Pe9uc/7w5+sDA68\r\n6wi+XtERbhayNPkb1DE6zHpfVixk+aGZQSqE9vetAN85Dcn5GUHYn9uOzTyA\r\nDkywMWfi548nCKmdBF9aIXTWEfP3aOXFC1Lgae1SW5Z4iSIROw0y3MDT1Ek7\r\n7AX8ZMu2FR2z0Dy7x5532NLEvrvsihZ4Hfo75/xFnP9uJ/ahOujTmkaFZrUU\r\n+Xv5AeXBej/EZFSyV2H/aT6ffxO87q7g8tl0gUm2+J+6YAReZaVSE7twP8tF\r\nE3Z2QteUbmNs/c4kl4wlzx8BLyVOM8vXiQyyf2mumghrfrnmMPdcpUiya6Fh\r\nIbS0+MhCNviV5shPOhfBh/3E070dBjTxIuSSKni0Znalt2P/qNmWqFANfT9x\r\n5Ii+HpNwWTM27QUPlxbN5QLwr8xUJ16NZtb38ftctbvxeS7B2xqgb8UYHNuP\r\n/izmN8+UCT5Ly4vpwvkMMmh1a/9i8Ljy6sA14XAmiY3Yov6A5V+Ln1Da+2my\r\nbo8Olznr/TX/1xdVM0xiPyflzinwEWw4ErWKg0Ha3zYcEwYfiwdCgQLoV+5a\r\nCnYl0PkKB6U42BkkI6Y6cgy8RhZ+SvFj/X1DUG7PJfBxuBe07S7O946dPB/e\r\ngs+vf0Yr//6miB/vvQUHwGPuuY+JO+Hn2epXXtkEHsulVzcVfWGSf8sUm7qg\r\nv+yyjeKHH2nIzakMAQ+jpioR5V4mUbVM5ZsDHurfF3hZwj+GzFl6/jp0A8+S\r\nDG34rcxuwwEmeFyMThE+dYMicVc1UheDR2L9Cm2lE/AD7/6ctET+1882Mfj+\r\nMgn3VivBQeiu7K0Pf8CPyRx7a1aO/E2cv48oNVGkK/eDqh3LH67279wCP2/2\r\ncMNRZeR3ULnAaq4j5nvnyxt1rO+Ta1UW359Pk07bXD1u5Pc16OZoSzZFnl7i\r\nLbwJvf3IMz/xa9h3e541HEN+PYYpWjvXoP/JpJ1eifxsE5rD+7HvBoRlU9as\r\n7ycHZWfCDsIP59zgeYp8Pty+UVeB+r79M5/vOuKNOsaQtIDfdnT101mP+imv\r\n0I87LEQTgWPpqb6IP5Q2dZq7nEEkfqR8nof4ze/NWbgV/dnC2ko4DZrrltbS\r\nxCGKSEqWLfuK+jVIdd5eCR4uhfven0A+DQstLc66YF8ROB9ajPrpHh/Z9k2U\r\nQYa33BOwQz4V5g+LfOGHNH0FfeuQT/Ry2olVj+k4vlJv5KNtWnubyUOTbb1y\r\nT+SRT8WBzvVP4Ie2m40evox8TKXtg8eP4TyNjoRooD7HnEZm+bLAtyesOgD5\r\nbehU2T8IP3t/e3smH/Irf8bt3GREk3iq4JoF8tvh5N9/Fv3plqbmhU7obi7B\r\nokn4+RUnzqcfZX0/sMFhhIn+tE29Lt0R+ZSW7ozdhPPe9+7eGkXEX5du7VF+\r\nDv1ktVtNNfSBRSOddvB/qWuHbqUjn/S7sicacR+NnJtvGCMf88cDVY2GNJF7\r\n7vOlBXrJkW7/igVMkiCmJByI/PIKNUUj0O8eLrZO6kN+Gx7Fz9SgXorhmd+l\r\nkc/Z6IM56veZxJrvgsNL6MVPFny6Bv96I3O+lALrfuUrfG2Gn1eYbvo7j7VP\r\nRfOmyaqjH2pN/7kDfYwzLfO1Hk3e3jgl1YF6XLjz5WX8F/id6rvshxE/+5qn\r\njzPRn18XbjKYRPyJhTHL7fywTwu1OMUhvoBc0+8h8HflC7ZX7UN8FivF4nLA\r\ne+Xc0wpzwT/T4QPFdoQi4jXf8zoR39b3x9ZMwk++WPRwIg98ZUYeRUtjvnzS\r\n6RIwR7yJ8hfUfOHnX9pc8pVFfLr8N0gO/MrVly6bKlnfD1rfM7FejvwCcitm\r\nEe9eLlE14XyKfMhd73MZ8f7x+P1a4DJFbiU4sC8Hz1MjgT3j4JFz1ZzdFPGO\r\njomPlOC8CNXn9xQg3vyGbyaBTOzDmh7/LiK+p24vjtTbox+2LPykgPPxm+vf\r\nTKEMTSpCw0/PIt6VzcZqqYjvi/2TykDEw7/I2f4O+ncO816SOZ6vcmRPJR1O\r\nkfcpMXovWe+bzKdWVOD5vHNfqO1BPDFe8hwugjQ5y1ZlK8n6PtHX5Lol4vGm\r\n5zjEIJ6pGV+fTfj90Z2G3OvA73dzW6t9CkX6JDqKvRBfocSTxwFraVLZcMSY\r\nG/El67y0/IJ+aPRKxOAz4rtz21fI/jVFeHhvnvFj9Rfbzh3Fbyjyrn7NNStW\r\nvCc+v47GPpU+eu+eDOK9UmCevC6OItGbok4/Zb2/FKCD5cHTYMce+hriDxW3\r\nOSRjQROH2hhhXcTPn3+gaKc5zotm7T0K8Yc16Eu3Ib8qzX2BbYg/gmOxnRbO\r\n5w+LEeNHiFePZ72kGfw80Rmpk0Y8bx/ezgqGn+9/bvP8L/rDkZPvxUTRr759\r\nshtNRnwaIQsbH8P/Phy4G+GDeCaUe89aw8/v+1a8YBjxpJwyTg2Gf59WnXNs\r\nEZ5/3dV+8TT6+TyVbmEh8LrTVn61FfunbML1+O0sf+4/f5L19xo/pCu2urLe\r\nr0VOqlhUUOTBP4XZJjwvvlFdymaaSRSfZUtl4Oepq8urKlBPxxd663Px8761\r\nKvz3xynSK7mLHET+lx8W7WDDzwvXRsqrs86/a8gHFfi5zxHJ4/p4fq/TojXJ\r\n8MtZ2TItIfg8zvTUhfs20qTg/gNxe9THfF7WinmaDCLz6/jzCHx+jffempaP\r\nFLE70qLcg89/NtBGc40xCJugTIAm/jv/N9JUD17y0UXsbay/hzUYN5hCv7n0\r\nKXVLLj5vg+Hu+QrtFDl105CSZL0/5XugXIv9ji1cac407sfm7vWXmbj/2XXK\r\n+nz4/OXXxB4cxH5ptjrJYiPiv2rtUdqK+EttL0/EsN63vx+5swL+hve4Yqsx\r\n+GuF7dotB/4r17+Sfgr+XM1sDcK4v7Ixy5NF8fsFBye3LmP9vYv+kvvu+P3c\r\n8jkDxauw/8VtjuPE+by/xZm7zZom/BcWJTSw5v/Ql95anMdY6U8JmxGvqtjs\r\nrkD4xbkcSqMr8TxaaKRmE+5vzOg1+8t4nmFd5HAYzoPHc7GpA3ge3VR6bQrx\r\n63uK6xXieddMLhlM4Py5y133PIPPL5EUGC76i/109aL0SZyvWdMG1ypJmhQO\r\nru55Dx7rVwvlhLDeNx0dG+3D5+/we3vZBP1sS0/0Ln7U71uKRtRxzJ9+T3ND\r\nJ/DXWd29QRd+eO3ooa0NiPdQd9rMew6aaM373ZTOev8kr8R8ivtpLXc3jBc/\r\nz5NrnsGGebiNp3J1FrTfWudXMaPgp2uqrY3P178StNgnF/1Qm7sgFP89O+fC\r\nhuoP6LdJ5j/q8HlzBFYpsD2jiI40xz5z1n73ZMmwsg7mw4xxzhDuV+Muh/pL\r\nDNzn9uVvVPD76TxiCpOob2afJfs9xLeh+dlLrvU0SShVeBLCer+5RHj3zFmK\r\nqE1afPbE79fIZHQsSqMI/yLR/b3gN17ew/j1f/n3Bq7F78fVfO4eQf+74hLy\r\nQpjljza9EwnE/hb7JGuyFL9f8PPvsg5v3EcxckYV9c0r+bDCeSVNfhZfVOZE\r\nPOjuVQTzTnTu0rdH8HlKviqSJfA/Vq6KjlsRz5tDawx+n8R55bZ1qAZ/U64J\r\nS2HsS+07/3hcxOenuntlFsNPlQnc+82Lzy/l0TBUQ78J+Le6rxX1HSxwl3KG\r\nn+Y7dfSmLT4/qjNf7Tbug1mHIrUGn//p7hbOgxco8rNC7sxNfP42fUVdJdb3\r\nVfH5rYT19zfFmQZCJjRRzgrZ58t6vxlv+z4G51lXekdkF54/WxZoIIn+tWBX\r\nfDsHPl862mOXCvYn2ciMidus96v7my5XYV7bNSsYHWT9fTGHD+cb3I8VViGr\r\nxvC8g3MbVo2gP738kPvVCfFucjVWfKnEIN4OS1v68fyXUi2MtB4GaZ274Nv6\r\nvn7DYfVaVYYQg4R2L5/6DD3V1tDSJYPzedZqg+93/HxNurVGKkWKoxplBfpx\r\n/h65fipuY5BiZcPlhdA5R7e8HsS+YJT8ScVyoN9Q7pP3NVHc57T9j6eHoU1O\r\nTqpaaNMk7ve7kYjBfsOgOr/BO0MMcnhdZY/IUL+hvErwuqVOFFlftiCqHPqR\r\nvaD+6SFvcoL/2E67YfiRBTPC1FIGSa7S//wb2sny7t7+ONb+u+7k+ZF+w3V5\r\nEbsJ+A3tmVGU/YHz75lpuieaJgdaRSNfQZfKJyckNWJ/k/Bc6DaK8yxoW/TU\r\ngUHMHs8hXD8x/xs5bwu1ehMxtvCANOiLEZm6mgoUCeFR/qgzhv616MB3/QoG\r\nKaDXdrVBL1t18L2/PE2Cr28TC/qF+b8py1sijiYatLMT7zjuc9fZ1aLw61VX\r\nCzfeg15Rw5PxWZlJvp3XdTSewDzg2HI8Gn576aPxf0PQCyZ6RpIavQlH8P/b\r\nH0XOWaxm7Y+540tGIlGPELuJ9DKaIklFqomrUI/+k3P1agwoohG1VPk59GXv\r\nANczegyi1RaV7I56ZEuJzByimSTkAK8MO6seG9afvon+H8BhkXAd+sISlfXx\r\nx2kimms6ro16eG2qMm97wCRzL1p4v4eOF4opEYS/dvzVV0yhHn92l6Xnd3kT\r\nZw+jMW7wbxM8pVi9iyKLh12E06FfRs7YJbUzSEC4hqIR6rFr/7XTHEtpImLL\r\n79QMXefzeNPBWJrI34jeGYR6ZL/97h8K/9k/W2HOj3qs/mDLEbGGSXbQRbIP\r\noXN8qjQ2BVFEdZfxFzvUo33VrO6ZZ97EKvxL6g/oBetGR/71U0S4XME5BvXo\r\nSePQCMB5SJhrwLYW9fi50KvdFudve4TDo2fQdmf7t5ofxT4VPt/KBfX4HGY8\r\n90Itk2xPOFQzBd1HMt+2HGWQmVVCOYmoh7FVZchlAeq/+1H93/3YQkxmF3q5\r\noR7zZWT+sv49x6Jamdf/oM/e0E3wlUP/PHtfPek76+9FBBQ+Yv+YVH+wRw/1\r\n0IzZL3MZ+Ym8lb3eDD1o92ewDPuMszVfdwDqsSZJ+7xGOPoPD+ckP/i3eR7a\r\ndnyWSd4axSrkQP/2YsY9D2UQz/OfthqhHve1fobXLqaI+dLVBl3Q9bY7jr8T\r\nwX4ROqR9DPU4X/OvqO4wg5yRLeUUB//rXEGtlk3YLy0khgug7S6OsdWF0CQ6\r\n1OilFeoxt9dNfWsQTVYP057D0AfP+Gati2CSbtMlwmdQD9k5ome0uihSHrsq\r\nZh34S6WELhgs9yaFFbm8b6ANnjn7H4RffNt178o+1KP8xKRgGs67rE7BKBf4\r\nx1bHpuc50aSXz566Bv3s6N59XDHYn6cf1quDvyX3gQ86vDRZJCTI3QB95eql\r\nkqrPDOLTLB9Gox7pL7iF+HbDf8g6Ry0F74wBi5lPyE9waFnAA+gDa2ee5erC\r\nb90knhbgL1CxopO1Twaf3v8lBrwFynni3+QySQfHzyxZ8B5MnuO1FftodP4p\r\ns0rodr2qoIWYL4620T/dwPu8bLPLV3smIV+5MyegwwKNns5/AL6O05Lx4C28\r\n6+YtzSZvwnzslqEI3pPrE2dewK827qidqoWOO3o729SASVy77zt6gbes8BPV\r\nUYJ9dyf3Czbw1RQ9PnQc/eLV44bRFOh7Cl8sOcXg3xcvX6cN3lqWk1F7nzPI\r\n+wRXtWbon13f/XnFKHJHyV3uGHh7jqt0f+j1Jj2mc/SWg/fLPZkKedsZxCMh\r\nZ2UhtPS129ese5lk3odXi2zA2/z7lgxh8K6cduLphd4mfchwCvvcrSVur8LB\r\nu3FT6wK1cCZJXtZ8cSV4u1hQPXZiDHLaZ17jc+g2k4hRl2/e/92H0v/ugx65\r\nGBYtZwn+rR7BX3T7wOezWMcgtNwF25iOlRSpP/uvMBz1cEhlWx/3iiKO7c+N\r\n1qAejqmdf+W4mMRrNu/zK2ir9KXte+BnrIN+nXVDPd5q5lh0hmHfKXabYgd/\r\nA9m5cw3EMS+Tc2MTof/221+SK2YQvzYrEWXUo8dc4M9vRYqQXiH3d9Dnf+W/\r\nbuSgSLe5xhsP1KN2cUXNHhMG4Q86OsyDelhN+QuJFzOJvmm61m1o86oxDyPM\r\nS10/icPaqEfiw/Un/uL5r9wrg5uhTTu3BQ1jv12dXxYXgHowD4oOXhdlkLD0\r\n+P2CqMc6ZeE3b6u9idfuJFIMvXwVZ5M95tmqoBFN6zFWvRUzo/4wCNPep390\r\njPV+2PaiJvzk/U/1L86gHn+/zvVYeh7Pyz+dIIF6iPPt3lIvRxOvHQdWPYM2\r\nrAycyJ7LJPKFaowdqMf7rto88/PwXwWn2v5hXoSqCMQU3WWQfb4XVa6z7odg\r\neqSJDUXccjaEaoE/ezBvRdk2ijSpHio7BN4eCRcOVZ9jEmWN473LwFtAUNeb\r\nE37rRPOBkQfQTsraihmBNNFm7x/bwuKtbtPQdpJJbmvJ83RDT71/4OLXAb+Z\r\n7jt0ArwP5I2PfcJ9cI/bViMC3t53YuNN4ff8ZJafLYVemZe6YQ4fk3xX99/k\r\nAN4PnkgGyKyjyRKH2EXD0Jcqk69MI/9DuffTo8DbvCJDpWoDTSxOUzpy4O3H\r\nm5HJel++nHPB3UrW/Vhb+tPJlCIM049snuAtLO72s6remyT1jPhwgu/85dJ3\r\n10gwyLM1Q+U3ocVcMrWOPGMSq8GT8/R/sb7fXHm45RT85NOmPQ3QBZmTn8x8\r\nEM8b9Shf8Jbelu5blcMk03by93nB+620dc+0JYNstFjy7B60LNd22+C/3kTW\r\n+NXAGsUGw4cZwj189fZk+tC5nADwf5vK/bcD/q+hYu2DpeA/lLsqhV0J/TEx\r\n0W0Y/Fvvj713gJ/zWKOodwa8KV/xA9Xo/7POaRNy4Ds5Z83udvRrt41upxzB\r\n18z2/gqBX97EVk9TaAJ6eudT3xg9isx+/C2oAn73F6y42v4b/XZr0u1X0EXm\r\nx7fIn6ZJ83mPJXvBs2dp37Jj8KcpzXtvXAc/j72+4QbZmE+BBXkE/Op+5ha0\r\nop/7WzOng8Erd3inCsOdSdokpidXgM/wmvuZEhRNxC0bl+VCv1YMFxNFvIMG\r\nbUs2g1dsXnfSjh9MUsgmdfnUBOvfK93aY60Df52gprUKPC4GpS/N2cwgbz3i\r\nC19Czy55kdcqT5HBeFMbV5afoai0wAiKXHy3j7kBPJ6vqvO4in36SszNm1+g\r\npd7fty/APtga3ms6H/nzinySugl/TnhObs+EFrt+1PdTmzdpiBtmHEP+Hw+m\r\nr+DHeZ50DTu0jHWeuuKfr8X5Eqyd1M2HHm04Gqo4wyTR8g9LRsCj3uNoQd+U\r\nN+lcMb7lAnicctvT58mD+c5JhVaDxz3HrF0/MJ+eFi1cvg/5v7VSVPPF582q\r\nNz+Ygl51/dDt7zY0eRs/29+E/G8lF/rMtP6vX2b91y8VSPELi7kbWX4u2vC5\r\n4T/0J1dhRhf0voMtPMJSFKngkQs+Ah5ri+s37cP+zq1Zo7ES5+V77g0vn1EG\r\nuXB5OugJ9G6r5M8FE0xSzbPfdTv4TM/lDTiOeZ5/bvHhSeg5dsdFjXG/Os2J\r\nwXmcJ7bs15ec6hkkMJyHXRa8uB9XLptjhP3m/dLJSujCtB5OpUlv8lDJKc4V\r\n93VQ+bbjunUM4pTSupcdPA3jE8wG0+Hvjb+3JkIn6em5b8R5uOQVa6cMnnsF\r\npdMbIlGvm75sH6Avc+/05nvJJOb9F629wPfGqyIbJW0GcX+4xXYR+K7mXLx+\r\nDPf1xf1zX+5Bszls5zHZRJEPTxfPNQHv0qyj7Gu/MsjFzpr9fdAdQt0qH7FP\r\nXtJe5nsCvB9caPJMvAD+fD+DluP8PS5MFHJVQ33/LMovgq6uflpbIcIkkdLF\r\nnVtRD6GfMYkDGRS5/VcwcgL9km44ZC9XxSBn82yWxIH/ibVDfzJdKfJXRXOh\r\nEviPHzvzz2gzRSIjw+7S4L2U8+PA6+NM4lD7MpwHfLf8bdptYkmTaebnigzo\r\ngzcKVMWP0GRt05UAI/BW140+15bEJHbfSku/QDfamHab/aGI3RaF+kDwfsDj\r\ntMUE57X9mIXbUvA+uWt+J/dBnOf52tvuQysG6CxsmGIQRZeG4i3g7bT067Fl\r\n2G+X27/P64Z+cVVxuOgcTT5kiIeGgndn1CKZNWY0EX6+4rkYeCf6/P04vIRJ\r\ntDZ0eJax/EMNuWQFv25tGzPkCt6+UrmX72Be/dL4xjMNnTXydbCbC/PJf2HM\r\nZfC+zdFYGJTFJH6HOk6qg7dFjJHCFewLftKCi99A91Bat33gF01Xp1AHwPt4\r\n/7hOTjmT3Bl/r88J3jseHv08sI9BUoovaaZCa65Z9P30fPjVbtkRqffvDPk7\r\nnhp0K20jEmVWUV7gn8x+ODYW+6Wv2Wq9+eCvu/pB0oa18NOq7bPd4N+cQ495\r\nrsJ5LktZchy8q8Nz/hxH/xlRswsSB9+B9e8/5w4wyb7vIl5W4Jtt8r52lJ0i\r\ntXJKOYPQ7A4xk/fWUcRo1jFWDvzEooIN9vUxybotrWZPoMOZGzJmMO/VzzT2\r\nO4JnhEZv12HMgwo+bZc48Ot/aDJPF/v+lzDGDU3wmnp1pb0b/VIiKfY1E7ys\r\n8lvfqVgwCcc9h4OLwMfg8MrV/XtowpEr8DQNmjN0G1f4GZpIXzf7qQ9enZz9\r\n/D7w98uY6byHwaf47sdyZSuKOLRVdYiAh2LSxbA3uxnkZ5Zd/CPoSvUM132q\r\nFDkjYtRqBz7HV1Q8vxZMkVLPbF5l8Cjd4+XJep+2VHLZwXfQofPK9u92wXxT\r\nDZ78Bz4C1TG+H68g/wf6uingITq7iOd0szcRKtva5Y/8Z6tU0zgsWPPnpTgP\r\n8reSiA5dcpEmPpX7V2Sx9rU9/jtuLqLJPbfIwG/goSeXd+nwAoq8lL6rfRo8\r\nJuTN94ujfz6yjLZ+Ch6e07IhEtPYH4y8L+5A/lKi+kMvsf91XhZ2/QEt4bYh\r\n8P0O7IOcJ91qkX+cn7jK3Y7/zdMX/81TY0KRGrPtyN/PpNb77nuKZNtK2k9A\r\nfxZ8dSFTGn67K6zIC/mevvdKZgDz/H3Hg+AFyPffRPSI1hKaMNfHaWgj3wL5\r\nZXrZ8M8vZyQ+fIaONjp5LmQhRbQ2743LQf6/rbMoE+yL3Ycephgh33eWljtk\r\nj9HkRlLrISnkZ+a8alc69k/zV0uZf5DfV+FZmWPW6PcBlwTjWP5aUWN/FPK7\r\n4CBWII/65vN2n5snTCP63N/7kJ95/eLaTNTrL+OH+nzEfyn2/gvTSwyir1S/\r\nLQOaW8pm1R8TijyX1Rs3RH2zKQbbd2f0/2tam8UGWO/7b3itcabJXLMJkTJo\r\nEvAhsgTn0/Jfwbwo5CP0VE2np8GbpPIurXVDPi4Mi6dfNWnC42Th+RvafXTR\r\nJj3UU6Jo49t45Pdwkhi4r6XJr7fqP96hnsci1Wzc4U/O6ojx+yPf50J8W3pb\r\nvAl/+9vhbOQ7R1fi0YkG+M9dslGmyHcmaqpS4ixNslwSC1uhT/YU80p6gl9r\r\nlEUJ8tVpv17uMepNONI9+5SjPhlaMwOiDQKdSMP6dzUhyPfYsX82dZjf6/WU\r\nVoki37YzJw/ba1JkOL7MMw753T2Ro8OLejpfTU3eg/yMS1aySX/3Jk3b9CL+\r\nQY+5jfV7476U3E24rY385pc4XRjlQn42DrPvoftkX445RNEk7Mq0BoPl33/0\r\nbToOfgLefyvNkV+6aNXZRtzf0rhrRyURf1LsubjFB+F3vyccKGbtqy1Fmnkn\r\naFLQ6a9ki3qqicS/O/iVSZzirkueQ37Nx+l5Pqspki7b+KkO+UgGW75qx/7v\r\nvV783UbEL2zBrckH/yw+rVTbDZ16784Km800Wfd5++WlQ6x/j7gqJZiiiO7e\r\nKp88aHHd/ia5Tm8S6x0zGYH4b7C1hwi70uSnm0GDKOI3Sk+ZY4rz5fWreWYK\r\n9fLMMm7c3udN2Hj1dl9FPq8vH/YqwP6/p8TiYQPqddh2fq24KE2uyd9PZCCf\r\nwFDxQ6Kov/CHq3M4kU+RAUcPB+YFvfrwwS7ks73a6r7FF29S7Z49rot82Dvn\r\nHXHgZZCHNwXz2qDts5rGQnDfSqtLHQNRr8mNetWWdynS3m6jKIz+/KDg3w3+\r\nPgaR6RarKoX+pnB7IgV+8HSDuJkN8l8yosNtdRT5/9lfOga9b/CRnBnmtfbN\r\nyMtRuK/engFfm9oZZNKxb0wCPK4ErbwRhfpOm5wzrIA2D/kn0fwT/UrKO8gJ\r\n87H4q0ad9koGOaoWmzwD/XZUcrv3dSYxeXFWOR78OCd3733mAb+2/6XhWvA7\r\n1bNz906chxMGpkY10I+uzLA11jCJ85xZRXfw3E6Hc02aMcj24szN88FThDGf\r\nEYF9xsfxrFwW9LWh49L6Wti/v6UMEfANa/Edz3+HfDNnUrugFW/khMqo4H4O\r\nqlYdAe+zXs/6ncE7iWR48IH3KculkuVa6Kdv9vx5CF1f/U3bSpZJNHccvm4O\r\n/keOMHjL8igSLdnVMgp/YiiXs+Er/No1uwf/YsC/8amvjdoB7A8B6rby4O/D\r\nbiZ+Bv7NTW1euhd4HyiZSH0dxCT9wt8b5oBvoXDkL39TmhRpXcy5BX3KcSzf\r\nCf0sddOPfAPwTny8huEKP3dXh3NZI3SBRn/tfW4GaZRYUOkL3tsLeQ7/bfcm\r\n4mNVmQvBV7nMJNKT9e9h/1hoZkMX/BNRWT/EIDajp8bMwNu5rJwjShD+q8Fv\r\nbju0VsTEleXwJ7O37ZlHwbtNuz8qbAvm4e6huULgvfvmakpbjEk221maFUFv\r\nXcn1zcybIoZO37ucwHtN6vZ+wUpvcrP1q8M4tIrqj4ze35hfV64HXARvI7vB\r\n8fFkJuEiSyqUwDt5y6e5Ezhf3Q3r3Suh13ecbGH9+53O7XYue8A7rEjspngl\r\nk/x7uSpiFvrm1FLbbh8GsRrZPpoM/vI6/XnnFlNEzeXeYXfwrl9aZ9yYCz8W\r\nJXuSC7wTugOv2K+BHzzOadUO3idDNXzi4MdSIhynD7H897mxlzvgRzxSsouE\r\nwLN366qEFeNM0lM25bwZPF2e7pZv56YI7/Xs8V5or49jjwxkKLL/4vzXUuA1\r\ntyoo1rGdSZTehlwthWacWN7wDf3HLXxhky34Sal739wbQJP6dWk6seDF7axi\r\npv0R5yHydYIK+CxUXxjYh3428Vj8gSf4hAsPBAzoMcmlgIi8+eCxX8qh1wr9\r\nJMBNY/lNaEn5kqAS3IfHb/52bgCPlxF3xuznwO+kelQFsOaVFj1wwwH5c1zU\r\nXAEeMVeFBCWYDDLHMv9UIfSK+zZLzq6niKPrRmlr8IkYGvyQ60sRq8LanWvB\r\nQ4292LMT+2Zd/xvXN9D3bxnS6+GHeiOfWv8BHwuJ71dG4PcqT4kqJYHHNUXH\r\nxrbP3kTXmk2cZu0Xo5MDU8Y0YW/Z7zsH+b/XP93OEYd+VnGdKw163at02w8C\r\nuN9HxuzawaPslNWpTfwUKVwzXyUMPOwW66cF//AmF31FtR6Bh5qle0wx+lHg\r\ngqR39si/hsPE/EcMTew2a+cPQJcYft7pDj5NG4xFXk+w/vcVtl0I7/ImxzvW\r\nadkg3zsO0tLjLRQ5nLDy6ii02seYcy8lKRJ3V+emO/IrLl488hLzynzL/JK5\r\nyK8z5vW0zgqa/ODxXa2B/Pan3r6SiHpz+F0X+Qj9V+RajjzOg84rrp4M5CvJ\r\nW+f1EvNiSeD3aIMfrPtlOMSH+l+4scFHDPnoVK6M34D70BJrmDOBfLifa3R3\r\nwK/py+YzYxG/9DzxXivct3URH9JWoZ6Xz91iDknQ5Ohx34e7kA+9Y4QcPkWR\r\nngulZ7hY70s7Ou/8u4H7+0514y1ox+t/GiUssX976ujooZ6nx7fcDkb9r/Xt\r\nvCKI/BIPDXslONLkOV/unCJoy+CZbG+cx9oPcdPhyKdinlGVRKM3qbxRwe2M\r\nfAbi+eZ9Qj9c2DT46Cf03+bGoavY1yzzDpWcR35qrgFaCao0mdOXUvsG9Wv+\r\nPHFzlw5Fjhoe4mEi3z3XilMc0H/7uVwa05HvRJRrteAbJilbZf96I/K1toy+\r\nEXKaJqKLS3g/Q4u+cvyZj300jt9qbj7yVf15KNLntzfpbVIqP4T8ZPhOZTie\r\nocjcEwreK5Cf08KNiYkq8JO7DtrGIh+9A5+ujeD+tjHDLrggn4TPK8tkh7zJ\r\n8lclddPQO7863ZsxpkiLoWmbBvLh3au13BP+XfrdpHUN6/sNrVsShvD39y6p\r\nSHsgP/6wvrUhuzEPfJ3KjZFP6WkdiS+4n5Y73pSKIt6XocH9j+DfcpIKy/Og\r\nc8LFs3qxf1jzrZGwQv00+8o0+nqZhLt6V8sZ5MPgma/RjnhLqjSqqpHPOSNu\r\n/V3oR7MnDVfqI/7mU41hC1CP5ud9RV+hRzXWbvlqRZNTSikjCxF/U+HRprWB\r\nFHmsmbb3HnQypZZ2HP39wT89tTDEr23Z/k4Ufnz8a7usIOKvfJG0bwPO05HF\r\nps2/UJ/r8zteroSfG+VLdEhAPnJHmZmLl8E/tzUn1qE+fzxtLX/x00RxtO2T\r\nB6u/eMg2mqDe0Scf7ZyFpofLjSawL4vv0lVuQz5b88OWyMBfLhcVletDPv6k\r\nXbJAgiILDe8G7ET8XeItX+/j/P96sG7RWsQbyMU8HbIB86HSNCp5hPW/lyV4\r\n4DmNfst0OKCBeEPcFZZ9R/0CckadlyE+zUR+drc6+CPRlNVDiC8+TqQzXJ8m\r\ne7t0T4uwvu9ZKbn0nwJNSj9bqf3BvL0WaupLlzJI0NKfEldY33/GWWtT2ymi\r\nOLK+Sg3n5ch0dTsb/MiL0FuaixFf99c1dYI2NNFLk/icA+3RF3S/Mxj7+KGt\r\n7UdY76d2ZUicw37F+1o6ZBviLfBkm7qK/TU9uzcuAvHulm2WnyQ0uWJ1LO0a\r\n4mN78CRoqoBJ2h8+NN4AXr/fPrDVxnlg85ssroPeEnWlvMUf90lk5CrN4qUV\r\ns807iSK35sj/Xoj4OrwHrokpUGTVWI/sKcRz9Yi7Shp4dAroB9kinqm3xJ/z\r\njzfhjkn564LnF93u/XPEmybfj/Jl6YBXt4uMRQfOp0/v6vXLfrH+HrjXI/wA\r\nTc7/HffMYu37nwbOW+O+RTLj2I3Ab/bEWs2zv5nk6/zxtKeIJ7BkJkcfz5cV\r\niyxXx/P1X4h6cjNpYu+wI+ojtA2l6RqF/qHZonSDC/EY+aqaP4qmSEWr2+ZU\r\n6Os1L/WUWjG/5FLuBIPX3mTKdQH2qz+t0m8XId637BekxHGejKqV5HOhx4+r\r\nH43DvLpuLHalf5T171FWpD1gve+Xm/F4CZ437vQxIzlpsi1E124X4g/S0Dx/\r\nFefZp2d63jh0i4UGR+t2mggJV9fQA6zvI0J3LAEvx8AdWkvQvxtO1izqnUeT\r\nwb0FGw0QH8eDsI6y5Zj/p1Mj21j+/cPTjbtx/jWqn5EHiFcn9Z1C8VHW/Q89\r\nKQee63kmboyAZzF7txIbnlfkV+kuaE+THc8DKi5D+9pbfqvC/BFfOqTrhfsg\r\nZ6m88zP2gV9d+rkmqGdqwsbRj3spsjlET/UZ4lv82fJEF+pVvbaJ/zyen3Su\r\nnxmLfjvvS+byGTy/dq7plTb4zc4Hr/kaWd/XbQrf+3EVRRI1nokFIx7eK57T\r\ngdivr1z5bWnJen9bZ89lHI16ZLw+/xjPl6x59tNtwJt4TCt/lcDz9819uZMP\r\n/VjlLeeJKwOs93fMknehNPlSVZl9AM+/sZBZ793jTZJa/09RVx6P1fa9M5Qh\r\npAwp0q0oQyKRpLRTSTSSjGWWvOd9T/ESciuXkoQikZKpkAjhkhQiiUsoQ4ZK\r\nykwqUVJ9n/NHv9+fz6ez91rrOWuv/ax99quyDfzQg+ffXVjRgfUi31Rwp4VZ\r\nn1L9VRzEp+CS1LAH9i/lmn5tAh9KdWz95bBvWD99P/c4+kfbDtfLsL/ja/Or\r\n3/LoXzSOvx+AvXWxexXrN2N9Rgz8XQR7ohs1jzb2sQjV2vkwFPMbWq85moX6\r\nOtYdH7AE+RAefDN1P+xZvToq/xvxz1SVinmMeMVmdbsnwn5+7llVG+y/ws4B\r\nNh6wXxsnLfcZfJV9Kizuh/1Dbxfu9cR+s3+tDXs9c/4iPHTg3Tw2c552oBM4\r\noPKA22qM/zeD/5kn+Dkk6CFank6RnWsvZ8yHHoxep17i2sMmnPPZnCLgHebf\r\n7AxHOMRV90fJbsRj2mNmqn2CJv05kdafgCPXWWc9Q3/u+l/mlhDkW2P8lw+k\r\nj03uG1iw5RGvw0uT3nozisQG7OotBfYYCFVfDT2zU5Y7cAB8LxuX8XohwyZh\r\nf/fqTQFLJPR1ZsRySHVgx6tI5jzDnPtuBtZvy3v7IiXw0532z8vX0HtcMc3e\r\nGuA6+zqTdU0c8j5yzQ1H8HV52/BB271ssudBa+Us8JWYNEuwAf2gYaZAfRrw\r\nUJGkRrEmRSS+HXbQ/8KcV1MffZ+xCSUiubUbeKT7ovJ/qKellQYevkz9atG+\r\n8wj89rfydIuhXhyOqb9J6UG/5Ykk5AC3GX8bi1LlkHCvjqntE8zfl+vadvM+\r\nRQLWGAV/RD3es+eJql47myxXdDgeyuhxIa3p4+gP1lxZM7EC/GcZpKmpGjD6\r\nd8dSN/AdeTk44Jknh2iV+/nzgd+Pt988FIZ+vBLPWZIIbKY1z/v4Sejp77Lm\r\nG8E3b8A3G/lMDml3XVH6Alg7Va/SeQ6bxAj7baLBt9IFJ3Er9OMP1c7ung1+\r\nz7q7dCxwwf4/vj89Hdhvm0hFfy+bOOp1XTQE39niak8MoUfjoiqyu4CjT1iP\r\nMuddkks/vfcdY37vPvibB/VsQr0tXRp8P9HV17FfxiFN3QGF+cz3hyoXUUPo\r\n5/W28+0swLevS4ZEYwWL+Kw++Osz8MmcsVrPTxTJznDpjwDfUn8fl9K+yiG7\r\nUlY4qDHrOSvxy03kV3zWdvFK4CptHWkNYI3Ru8124FstPveFRQ2HqNx9rjwN\r\nHCL/OuKtN5vcEi7afZ05f9xqeTVqHkVK1A59dmTuM1z3XeJXQJG0TMXlvOD7\r\n4mOrGCclijQpRn/tAt9trNhV6XI0OTmkRR9nvh9KzVc1Qv1UMG+1mA8+e2z3\r\ncGu/c0h6qluLIfhs+aFsaSECvdV6JO4Doz8k0xYJYr/36XRw/Qt83XadLDDt\r\n5JCc0Odbi4BXCJ1xbz9FE2++27v3gb9o0V73V140sS1uzwgFX7rZqW660OOV\r\noZNz1cFPzJGnZBD1xaGxV+EwU//rPhka6XBIV2u8qQD48Jv4bMhjC32iu638\r\nBrCZ+MeUZNQ/ESdLGx3wce6pQE+1IPaDsmcKHuDD95cer5Ut6rvk5FtJ8BFX\r\noSnsz2WTcDnn6TzgzaPLB+TWU6T01OaqXeCn3uIfa10O1qutPZ8y+PBoeD0g\r\n44L9YE/6i2rg53SQZ7Iz8iH//fQ38LOw5krmdAZFgjmh6THgo6PKv0QY/c+u\r\nOMsHFOJ/M9M2wmsLTf65VriQj+l36vnF/dH/3CO6J5KBR/xIg/sCmhgJKVd2\r\ngQ9NbbnpNBnkx0qdzFPg4xBvUaXiMIv8DHx/pwh8qHL5o/mHOeQRJ5c2Q/xf\r\nvz7zOYN6KbrU2G4A+Kzm7d3q9sgX81SfKsRfsI8qP/YeeuFeZ/ZuxGvfXfcr\r\n9h1Fugvl9T8Cq+UdDX+B9+cxT0baCfFNGlzm+REIvcunbcWP+Oa2Hz79cCFN\r\ncsffJGky3+dG+/PzoVeTMm3KmoC3n1N6cHom8i3YPOIW4jU/0j3Aj/e7fDyI\r\nbyPiW/Gq5N9g7DfnUw4PLUQ8pVNyGoHVLKL42dJkHPEsqeEMhhvRZPJXxYIL\r\n8P+SZ2RaDvZ3v0Vq8svwPm0aeA7ZK6BfjmuacxDx/LXYzs/xPEU6UhZr8cJ/\r\nrtB0nE0am7QnvrufwNT3jobsPOi77+fXv16P91m5NuveQnP0S+Ejm6QRX5uR\r\n1NB/0AvJ3qF++cCy+2XZIfA3ooSXG4h4LnddP+jfyiJtgwtTrRDPpjvcDFN1\r\nmoTHbHQZY85DGtdvMYF+cVwtpRHO6BdxsYJVqP/hXs0bn+H9HQqwrLHdTBHu\r\n1rQzLMRbayvybA729wPzFY1vIt7qgp+NzlUcMjOEciNMPmeah6mdpUlzX3Vh\r\nC/BAkdKHk9Bbg+rZTrmIt/RHH5s7BT13+43W8X7m748YmsaHUYSdtFJMCvF9\r\naTRI/MKc91buqw5FPBbDUzxdWL8Jlp+EbRAPR7p/IB77TT6vD/cbcJWcqPgT\r\n+DcSmnBiDXO/qzCtTeEHh9yM2DFVAxxSLl6ofY4mlfPqrrogvinj/oSfTjT5\r\n7Rm8bgvi2frw62AH1mf0w3dWC+HvK3NJYw78dfGscssF1mtv7OFB/3wjPTDW\r\nhPk+UrfXbQny1e5DmW4w4rnW0GwSu5YiBrEf9KsRz7BKr4+8CkWMVF5U6cH/\r\n8aSNtwWhj4uVnqzsYs4b+Tj7jKHPc6wrrs1m6vkyJa+ZJyhy6i/JrjsjzN+/\r\nsgy984ZFHu+40nAK/gfYb+HGWqDeJKxukGLOW/bLXL6HfOKP9zf+zLyforsb\r\ng76iH5V82hTFnEfR/dUlYhRJGUsRrcP70fPymW03lybH9094uzJ60yaDv/Mi\r\nTbbZ1s6aBq55IjtO76GJl198WAdTX25fJ+LQu39vlK35gHiGrA9dObyEIsO3\r\nQgYs4b+ixLgy872t4Nq1YCX4u8khrq5cH3r5TKzWdfib+kallxf8nRz+3KUJ\r\nf8f00zsPQZ9T2YvbxOFfSv3c67cbWWTHqX+fDsK/By2/Q9Sw/+b4xfyWAb/t\r\nrK7ouxqoT0N5Xd+w3zpk2jvVlrHJjJ6k2Gj4E/hOZZ+LNUWuiOu4r0a+FG1Q\r\nGUs2oYiYktZrEfgnRwfEZqO/lBP+uSsDWKfyyrEZfui/nR5Z+TL8as0oHER/\r\nt0jCX3Yvc771iH5gsZQmJcqBwkEMv6+4aRe30oTPYduCOPjX+Mo4Zl0OhyhL\r\n17xfy/SPaifIAPq/+8aCznXAC/zdclKx3q4M3ZBgM+ftfs/vDd6AnluhHDcb\r\n/m0xrr+mupIi/JYV1wLgT+GMkCuRyOeU35lje5n7cUJCSX6/WER+th7XZozp\r\nf/voH2zo5VObFHXBFzvqtVQP8vO+MWkRhz3V1MBqHdTvHS0zpdKBuSsTatyR\r\n3y0zR303g7/y8vOKP6c4xK395qJH8CdxsvFMI9bT0YoFLpqwfyJqy4A+RROt\r\nkrUzXgAf1fV1nEB/7Siwfycv/Mlc9PZgdSRFAp8+f5wE3OkyuMwGfAl6TG7z\r\nZu5v5D3nCd5FE/94rpcI/F1+Scw0BvXD2qg2MRPYx/zi923CqJcvTAX6kZ/V\r\n3h/kpAUosnd9Zedj8HmsKdj75S8OudZt9sWWOe9SKn6kgXxWLhXO+8zsf/SR\r\nQAErmnw7mWrAhn9c5VulP7H+JFeebRNF/W64ODkcJ0KTrF0KJRuY/WnEeI7W\r\nQvR3jx3VOoEN2iZOK4lDD4fMG7wLfydWbqrMhN5Ii8n+pcB8P1qhVGlbyiI8\r\nLj/qf8KfWkPHJzWmNJG4HsSOhv2u8rJbytBH3mq74w5jPVwVS7xc7kER25n6\r\npluZ/oO3zcfOniJKPQvSHsG/VakRQbuR76FS28PDYL99xRzz4mYWOXd1qvQ7\r\n7AtOZ4yEQW+yNv0+/QJ89H0y7dBFfYhc9zHWC/7YWD1cpo713v1DbHgH7Dep\r\narQfgx4Oe6wy+gD277aotzmPskiDrMY/8rCfbKTAyltHEfHVb8ejYZ++GeY3\r\nin78Wq62ogujx3uqjjxFP6Irc6qbB3rw0RISkmJKkYRLs8xfwh+1GwcOOkFf\r\nyLk9N9kF+3J9ImUvkV/HNM50LWPOQ1ZVpdp704TXZ0PlJdjPup88VriMIiTa\r\nzKoP9jgp/jcioF9P+FpOFsCegsamkAnsx38v0bYJwfyeWSGTPXY0OZY0qrIY\r\n+dAvvbSlDvv5O9fUsGnEz9u8aO58PC8gNKc3HvYf3Zxhwugts6exUzSzvsLj\r\njIPBl4zoAple2Fdr1jptB/1hcnqBeDdzny/C+tR/SymS0a9cq4b5Wz7F08bn\r\naRI756TmOOqF/3Tk9sA6NpEI4jl3Ec+v9M5OHXWkSL9i8eRJPD9xbHA+nwlN\r\nVKdXFFfD3u0LDck/fNDvXfjF64bnZUMU3DWhf4wFPBwO4Pkc67HWEQ+aPAhW\r\nZKUw+3nzTP0E2PM/wS96n6n3x/x1JrUoclpOulqAuZ+aLZQbAv/PbuUNTwOm\r\npERbdefh/RxVERrF+OG9QkeuQe/lG9mtdAOf19cMh7Qx971iumSEkN/5m1W9\r\niiVoor6EN1sH/IYd7nBfivrrrPPGuxW4OWfOjZfCFCkWzN+QAb6H75YMnYH/\r\nsfGzvy4Gn/9eWjr1Efo8SlVF9Dvye3z0apA66qGK0YbYTcifHXmjUS1WFHmf\r\n2XTxPnP+YSAVpsCc3wwoBJzD/B9XD2k8ecki/tbudvV4Xxaa0b6O2qgH+iYR\r\nRzH/vA5n7wT0X56PN6psQzzLhx/nPUf9uXFoVfUCzC9b+y5kcg36n6nY1xcx\r\n/6ht7bQy6t2iMxIy9phfJsLnyslBFkkWT097Dv8lc9ac3wk+xTiqBkaYX900\r\nwLwN+cg3mSe7mLlPk9V5Xgj+5XdlHyeYr/IwbSuGejt9SGTLO+CXbv1G3J00\r\n+blz7WAO8z3jpVipGfrrxIIP0UGYP2z/2ln7wPfngLnUJOJ5bS2x+wH054ew\r\np+tYzH0pbnJaLupX9pRc0CDe5w9Fxyxe5OPoZoPbccD15iccXqHf9esQj5jL\r\n9Mt9jkO6ZjRZuaFgdQL4HT2jZVn8gEP03qvsF0f8fWGCN+asosgB3W2rKjBe\r\nbDJp9Loq+jPvCSkdjOf5+rW/kaZJoeiQ7STsB3BbTZ3202RgZ2/PW/gvECXa\r\nHTsf9euSmaAK+Mh8qdcyAj4SB53nx+H5VQOtCq5YT08nQt9QWB/c4LIln1wp\r\ncnahFfsXc19xbo+BOvR4omZUsh/Gl7RINT7qYZG92m+zdmN8YmdjczbW/+tQ\r\ntzXlGH+/0kz0YD+LXJ/nwvsK44Vdl15VQP1TdfQ0N8V4jb59rptRL802+wnF\r\n4Hk5daGK7ai3DSZ62Tz4d6EAkUUc1C9pvryPycAOZSIid9GPlc9wL+Ey33fT\r\nIkds4c+RlgMHhzBee2jGX8Gt//97gqhLPltNY9z/7/cGf/Cf/1/hD/7z+/U/\r\n+H+hweW+\r\n                \"], {{{}, {\r\n                   EdgeForm[], \r\n                   Directive[\r\n                    Opacity[0.05], \r\n                    Hue[0.67, 0.6, 0.6]], \r\n                   GraphicsGroupBox[{\r\n                    PolygonBox[CompressedData[\"\r\n1:eJwl1nfYjnUYxvEH2XuTkD2yV1b23iTKnmWFMkr2SJTsVfauEClSSUOiUkaI\r\nllIhIQ0qUX0u/XEe5/d73e/xep/7/t2Xp0CvIe0GJ00kEknkctL/O2eKRCKX\r\nlOIV+VX9tws7dWX9hjyK17n2l0zktXgLPEYOyX1m2c1y4x2Shs+V1ma9+BW8\r\nDRfVm2UAnmt+Ei/EZ/AQfAeugCvhk/h1/Yhea3ZJ/8BX6z/5BHwXbo5z45XS\r\nlY/m3+pD/Gl9kO/W9/JsOhevjffKJL6d/64v8hd0an1Qz9GtdE/Xi+BN0j/m\r\n/Kw+wRfE38Tf1YN5SV2eV8SvyUi+hl/U3/NV+g/+gR7Pa+pmPBdeIV34Y/wT\r\n6ciz8pz4FUnFZ0tLsx58tnwvD5qVMCuHm8oo+Vg6mGcxz4HLShN5VA7IPa5l\r\ndi077i6z5DsZZF7cvAyugE/gnXqEXh0/E/cZX8XjcA3cOM4Q/hQv1531I2YH\r\n8Qz8EW6PM+FsuBb+Cr+nJ+qXzX7TF/jzOqWeJS1wN9cK443Sj8/kZ/RnfL4+\r\nzd/RA3kxXZqXx6/KcL6KX4ifi/urr/D9eiyvrhvxHHiZdOIj497jp/CH+E19\r\nN8+os/K78B6ZwLfxFPiT+Lt0c93VrFCcI3mAPx1nUQbworwUXhnnLd4ds2pm\r\nDfGIOBPSziyDWRbcRWbIN9LfvIj5HXhF3C8ZbVbVrAH+FW+J56mP6KX6Pj08\r\nzgJ+Eu/HbXF6nBnXxF/id/V4/VL8Hv0Tf04nj/dHmuHOrhWM5yP386f4D/o4\r\nn6dP8X64MC6Jy+EdMizOBP9Jf8uX61/5vjjn/E5dn2fDS+RePiw+sz7Ap+t9\r\nfJduw9PpTLwGfkfG8a38F32eb9C36I/1DN1Ud3K9QHwm6cuf5F/LA7wQL4GX\r\nxe+Id8esilk9/LC8L63N0ppljD0n0+Urud+8oHlxXFcekr3SyjyNeQa8RZLF\r\neZImsYPi2eOX8O36mN6g++hprn0pfXkBXgxfi7OMy+rPYlfph+P5xj2Kc4sv\r\nx3uNK+M68Tnwi3Fe9WH9rO6oh7r2EZ4W7x5uiVPj9Ph67CtcXX+h39Zj9Yuu\r\n/YjX46RxjqQx7mieHx/F63Vv/UTsI32Mz9Vf8D74dlwUl8GvyEN8CT8f54Yv\r\n1T/HvY69wSvp2jwLfkY68CH8Q/wE3oPf0C14Kp2Ob5Yk/ACfrhvpDmb58Drp\r\nxafyz6U3z8+L4Cv6rzirsTv0yzI07plrl2Qkr8hr4cGx56W5WUqztLFH5XE5\r\nKb3M85kXjj0Rezl2kzQzT2GeBm9KJG7+pztNGpq1p3nxWunJp8SO1Uf5HH2C\r\n98R5cSFcCm+TIfyZeDb663h39MU4f3oEr6Br8sx4sdzDB/FT+gM+NZ4xf103\r\n5cl1al4NvyVj+EZ+Lu4f/jfOTjxj3iB2YuwgvBXfptdIDzzZ/FM8O3Y0flv3\r\n4LfpgvxPvD32WLwDEl9GFsf7hJ/FF/B7sbd4eV2DX8ab473Xi6Q9Hmj+ljTh\r\nt/BUuCreLaP5C/wfmcrr83Z4khyX7mZ5zArg6rGbZbc0Nk9mnhI/Lzfi2ZrV\r\nM2uLJ8ox6WZ2a7y/+I8407Hz9PHYRfpBvSje5Ti/sU/xMFwOV8M/402xT/Qh\r\nvVDfrfu7th8/jt/EjXBS7KtZ4k78ecz1Y/q5xP/f387G2dHX+RRcN/YkzoNX\r\nS3c+gZ/WR/isOFu8K86N8+MSeIsMir8lnnm8u3FuYqfGHsRlcVWcAS+Qdrxf\r\n7NHYz3yK3sUb4iQ4Od4gf8tkszpmrfH4OB/SxSyXWb74bLGL452WBuaJ2OHx\r\nXkiV2LNxTqW+a//GM4odK+PkiHQ2yxnnEC+IdyJ2sVkZs8o4PZ4vbXnf2DN4\r\nMn4N18P/JLn5Tyaq6F0yKnZaPCd9Js62vhb7R0/itXVLfiteJd34WH4Yz8SH\r\n42zqTjyHzsOvxm7BxWM3y0A8P/ZRnGl8Du+JHc1L60qxf/DG2G96nrTBfcx3\r\nSl1+Q/4D9Bd4ag==\r\n                    \"]]}]}, {}, {\r\n                   EdgeForm[], \r\n                   Directive[\r\n                    Opacity[0.05], \r\n                    Hue[0.67, 0.6, 0.6]], \r\n                   GraphicsGroupBox[{\r\n                    PolygonBox[CompressedData[\"\r\n1:eJwl1nfcVnMcxvG78bT30iYVbTLae+89VTRQifZSaUgTUbRRKqloKomoRFFU\r\nCCkZIUlD2tv7+/LH9bo+1/U7z32fc+7z+56nUPd+rfomTyQSyShPikQiC+VM\r\nlUjkosw4B0+dlEh8T+VTJhIf0TT8trWbNFnuIHfEGR17Ud4p5+dLaDCeau0w\r\n9ZTLy8Xiexx7U94rl+BraRx+xdppGi43kGvitI49LW+RM/KZ9AgeaO1Tai7f\r\nKmfCHWgK/UiP6svp78Q1aAB9Qs30BeOzcPu4BjpEj+jv19+Bi+M1NFaeLx/E\r\nK/ApPAzXx9VxBvwyPSz3l3fgWXg7booL4Ay4HP6QnpffkpNc01H5XfmG/Duf\r\nJLfn7eR8eDENil7+Cr+OD8a95A/L9/GicjG8msbI8+Qf8HJ8Ev/Ch8r1eDU5\r\nje89Fb+jnJ6/RD1wP2sfUxM5f6zh7I5Nhb+j+/XX+Wb+HF9h/Q+8AV/HE3E7\r\n3Dbuib+7IO+Q8/IzfBEfyCda34cX4h9wD3wvLoJv4D3xe/GLfBUfzedaO4CX\r\n4RN4CK6Lq+KTcV9xOv43n8G7877xbMSzgrfhxjhfHIfvwx/Qs/LyuPd4Pb6G\r\nJ+C2uA3OE/ecBsgT5GSua6+8QD4gd8f34MJ4Dv1Ng3V1dFXwE7SVGuny6tLi\r\n1vQMfU/d9GX1t+PK9DhtoYb6PPo0OJvvTMLf0r3692kqXmbtanyW3EZuhdM7\r\n9rz8qZyb/8MX8v58vPXvqKt8t1wIZ3b8dfnLeOb5Bb6SP8VnxzniN/FxPAjX\r\nxpVwan93Qt4c18SP8+m8G+8Teyz2BP4IN8C5cWqc1d+lxPvpHv01volP4W9a\r\n/w2/g6/g8bg1bonP4U/wLfw0X8D78aetfUsPyXfJt+FZ9BcN1NXSVcSP0YdU\r\nX3eLLhVuQeNoPz2oL6O/FVeg3rSZ6ulz6ZPwUjoir5Mvx7nG98uteHM5F36N\r\n+spj5T2R8Tcxi3gXuTQvKBfFb9MoeWb8LngpPoZ/5gPkmjFvY7/iF6mr3Eve\r\nHnsWfxD7nNeVc/KUcor4Piqre48m4zf0v8Z8xZfiGvg4uSVvJqfzm5yVt8s5\r\n+av0BB5j7WvqLJeSC+BMjr0mfxH7lZ+PWcZH8pet/0n95RpyudgPsc/it+d/\r\n8Rf4Q7xnzBo8A7+P6+AcOAVOzr+mu3VX+UY+iS+JWRYzGV/EY3EL3BTnwK/Q\r\n4/Jo+cu4DvwV7oRL4vy4cMxwGiG/JB+lfnL1mG/xvqBNVFuXXZc85iE9FTOL\r\nHtCX0OeLGRLvC3qPaumz6ZPFnKFRtJc66ovHDIy9infHXo/ZTE/GrIoZSn3l\r\narG/cSr3+Hjs83hO+TE+jT8YM9/6RqopZ5UTMZPiOuku3RX+Lp/IF8ezFO8F\r\nfAGPwc1xI/wv/hhn56f4fN6Hj7T2RdxLvAd3wMWS/v+/4AreFXODn4v5w4fH\r\nvo89iN/Av8fMw1Vjf8c+xJti//A/+fO8C+9hbRueHueLa+As+KZ/RMrgDTRB\r\nXmTtJ7wKn8ejcTPcEI+I35na6+6MeYfLxkymDVRdn1l/w2c2kJ+Ma6N2+jti\r\nluAXYx/H3NVViWcOH4u9E/uJH+XP8c68m7X1VE3OJF+Pf5r4Piqtu8zX82f4\r\n6447jFfic/H84Ka4Pj6Dt+Fs/CSfxx/jw63txvPxbtwWF8W58GX8ecw3fjZm\r\nJR8W+ynmF16Cj+A+uHI8C7EX8cbYU/wP/izvxLta2xozBb+Dq+KM+JrrKYUv\r\nRc/H84XWU3oef4x5JZ+NZxs3wfVinuO51FseJiccu0ueJ++S2+AiMVfwtJhD\r\nMYt1lXRlYm7TOqqiy6C76hzqykPpc2qtL6zPgUvHnKa1VFmfPt4Tjs8ul6Iu\r\ntIYqWUsXM9ragnjWaaSusa4O/gdvxVn4CT6H9+JD4jvjevBnuBW+PX4nfAl/\r\nFu8H/i9fyofG8xzzyjV/Iy+Wf4l3B66IS8YankoPyJ3lG3yL/AJfLR/gFeW0\r\nMZudb0m8jp6WX4t57rMPyW/JZ+L+8RFyI15bzoxnU095sHwzzl2ew3fKh3hL\r\nuRDPKheMfUpD4rmO+Y4X4Z9jn/FecgVeIuYKnkId5U7yKqogp4n561xfjXsZ\r\n+0rXUFcr3g94Fj0qD5J3xvnhHfggbyHfxv8DtIGUAA==\r\n                    \"]]}]}, {}, {}, {}, {}, {}, {}}, {{}, {}, {\r\n                   Hue[0.67, 0.6, 0.6], \r\n                   Directive[\r\n                    RGBColor[0.24720000000000014`, 0.24, 0.6]], \r\n                   LineBox[CompressedData[\"\r\n1:eJwl1nfYiFUcxvFXJNolJBUqKg07JaMiiowQIjM7hRKRrUJlJKLSsBLtEhoo\r\nbRpWQ3soEdp7fu6rP2739/t7XK/nPc8551Khx8DWVxQqKCjYs1dBQfpvf5wt\r\nK3FPaWV+K99fHsB7dE3zU/Ag/IL+ms/W7/OZ+DL8MD5BnsC/6LLmpXBHvEZv\r\n5FPTfBTugufhI6Q5b8DH43X6D75Af8W/1ffx4fpZfprAgn/0OfIUnmDwMu6F\r\nL8Qz8QFSi5/KB+MdeJYcKaXNOpltwqOlhRSWf80aytO4t5wmR0kRyT/ayLNn\r\nYB+pLUfL4eaXmG/GY6SlnGU2wexPvFj2lkJm55o9i6/Dr+CPdV/eWs/iB8rp\r\nvAq/Eu/Ec/AH+Gt9Gx+gH+EnSjlehnfGW/A0vAl/rsfyrnp+voW04mfz6/Bf\r\neCHejr/T9/MRehV/X9fWRfMr48Z4Fb4ev4r74TZ5F7xBH6Qf1N/qMzyriq/C\r\n3+Db8Yd4Nr4cP4rf0ZX1Mv2rLu/ZEbgLfhuPyzeUc8yuN/sbL5F98o3Mmpit\r\nxv2ljlSQsuZd87Px+KynNDS7wewfvFSu5auzvlIs35Sfl72Z/Stt+Wx+sDyE\r\nv9NnmlfDQ/CLehe/Q3/E5+Ar8GP4JHkS/6aPyR7D3fBz+l0+XW/mE3A3vAAf\r\nKY/iH3Ub80Z4Il6v/+WLcs5yBvFIvCbrK8Wzn/j52af6OX6Dfo1/ogfwi/Qc\r\nfojU5dX51fglvZvfqT/OmdC384H6cX6yHJs9z7vj9/AteAv+InuHd9cL+VHS\r\nlp/LJ+UiyT5Q+0pRs6b8+Xx3qSfH5byY9zDfmv2U95T98m3Nm5mvzZpKfalh\r\nNtRsT9ZcBvEn+CmyHP+uf9YVPSunL83ezVpID76IHy3teGM+Gb+eOy/f12x/\r\nKcYvyJnWL/CJeh0fiNtlbfCh0oDX5MPwy9nrfK7+JGdU38kH62X8VKnEy/Oe\r\n+AM8A7+Nt+Ub80tzp+XM6nK6vVkTfGPuNrkP79APm4/KN87P0XVy3+m/cr95\r\nVhw3z97Ek/B6PAi3x3fgjbpEfo7+Xp/lWS18Tc49vgt/iufiK/GT+F1dRa/I\r\nPayPzxnDvfCH+XekJ1+c86rL68f0T7qDZ+fhm3BheYQfmD1h1iL7L+uUe0hO\r\nkGPMe5t/hCfLxXJQ9oR5y6x13it3Qe5is+Fm3+e95UQ51qxP7lF8o/TKXcYr\r\nSEd+Pr8Zv6GL6MV6Z35G7iLPR+vnc85z7rMneKvc0bmf8076df5p7jTeId+a\r\nHyYNeW0+Ar+if+B3689y9+m7+VV6Oa8qlXMGeN+cU3wrfgd/mfXivfWS3B/S\r\niTflU/Decj/+Rv+Q+8azMXptvoeum3NudgC+EL+atcBv4CFZUzwXb9Il803y\r\nrrqRZ6fja/GP+B45SSqa9cvvjG+WS+TQfEfz1uav4atz7uUMs5FmP+F75WSp\r\nZNbf7DM8RfrwpblXpDNvxqfiN3VR/bjZ2Jw/XE9KZA/wNnhVziO/Sb/Jh+KO\r\n+C5cShrzOnxUfm/9c34P/TnfpefxIXoFr5a7gx/PL8vdlL/HZ+aO5l/lvXhf\r\n/QA/TrrwC/g0vI8swbuyXrmLPBunX8z+1fWzL8wOxm3x+qwffgsPw52yJ/Bm\r\nXVo3MTsTj8a/ZP3wF3h+1hevzP2rq+dOyXnBA3IP42nSVUrKIeYX5W7D1+T8\r\nSRUple/mWbvsfzw850Gq5uyYX577CE+XbtLcbLpZMVnGS0sJs/b5VnhE9gK/\r\nhx8uTXldPiZ7Qv/K5+ltfLdewIfqp3iNrD+vzPOfz7X6Sz5Lv8e361t4P/0g\r\nryjdeYvM8Vu6uF6qd2e/5a7yfLx+Kfdz3okfxjvg1Vn37D+9IXsx+5x31vfy\r\nMtKM1+Nj8W94ft6p0P//L17Ih+mn+VZdU1fP+cADs1fwbXgrnoH744dwpezn\r\n7EPdw7wlnoH3leW8TL6Z2cV8Ax6Z/SX1zcaZ/Y4X5TvyZ3gtWYn/zB7RNXLG\r\n9H+6xHgr\r\n                    \"]]}, {\r\n                   Hue[0.9060679774997897, 0.6, 0.6], \r\n                   Directive[\r\n                    RGBColor[0.24720000000000014`, 0.24, 0.6], \r\n                    Dashing[{0, Small}]], \r\n                   LineBox[CompressedData[\"\r\n1:eJwl1XccjfUbxvFjr8y0JFmhLRooZEUKEUpTIUqhkEppokFSycwMGVFWu2hv\r\n7ZSGSlvSFEq/9/X6/XG9rs91388553m+z/d7n1oXDu42qEihUNinWKFQiWqW\r\nKBROK14ofMJfkifzl+Wh+CJ8H65AreWT5avxNnw/bS9aKJRWa6K2TD6besm3\r\nyUXoELmJPAB/zr+Q5/J35XF4OJ6Pa1BluZbcFW/MPchT+Cvyf3yY3J9PlitS\r\nG7mjfA3+kv8qL+Eb5WIlC4WZ8k3yCvlQ+tu9lpGb4g18uf4E/qy8m58jn8Vv\r\nl4vmM3JT+WK8Cc/D76Xnu8fLV8oL5N/4gfwV/jevolcbd0sNT8Wv4uF4AJ6C\r\nt/BKfC3fxtvqnYJH5vvwLNrhfsuqNVN7WD6XDqM9aadeOb3j9R6Rz6PDqSrV\r\nUT9d/dXcI7WjXa7fQ/0E9RXy+XQENVO7JOuH76S9qK5ad7XX8DT8Gi545hHy\r\nxfLUvCs6ST5Vvhb/jpfiT3Fx186Wb5ZXZt35Yfwf91AeN8cr9e/Ca3Hv7Bt8\r\nB/6GF+OP8u/4kXrH44H4K/wAfh9PwCPwwvw2r5nn5Tv43noH4R74dTwdv46v\r\nwpfgafhnXoWvy77h7fU64evwH/gh/Bmeg2/Bq/AOfjh/mxfoX89TgbdQW+W6\r\nC+gceZz8LS/OH+Pf84Z6J+BL8dd59mL/P3/11HqqvYGvpg602/dWVG+pvlq+\r\nkI6ifam++hnqb+Jrch6ps9ootT/xMvw5notH49X4iJwf31lJPhGv0ZuI1+E+\r\n2Vd4PP6Ol+CP8x94I73m+DK8Gc/HH+CJ+Cr8YNaK18pe4Tv5fnoN8Jn4LTwD\r\nv4FH4oF4Ot7K9+TP8d94R70u+Hr8F16eOYHn4TF4Dd7Jj+Tv8CJZf73KvFX2\r\nCu6bMyDfKX/PS/In+I+8pP3YWL+FPCh7DN+d9ZYXybWzT/AuXk39YNwLr8fX\r\n5lxSEaqi3jrvFPejo2l/OkT9rOwLfF3OBBXNOVVvk/XMHKVjqKXa4OwPfE/e\r\nobxYrkPV5UPls/Ocma/4TTwKX4pn4KrUST5NvgFvxw/jTfgBPBY/infxhvxd\r\nXjRnKrOBt8265Pnxc7h/ZgGegH/gpfiT/Cd+rN6JeEj2Br6XRspLstd43exb\r\n/k/+H6zxAZlPmaP5XXw9XSbfL+9Fz+PfeVnXdtbrKt+Yc525KT/Cv5Tn41vx\r\nY/goei/3n/OU+cTbqX3Mn8wa8uflAbg3vguXpuPkVvLl+IucQXkB/1CelPeK\r\nl+KDqEZmp3wu/jQzXp7J35JvwIPwzMwV6iJ3k2/KOc68kVfwr+QFuATtLZ8k\r\nP5V5SU3owMxb9fPU38c35h1SycwB9fbqT2c+UVNqrXZF3gm+j2rSkWrnq32A\r\nb6LB8iz5F74Pf4H/wbvqnY5vzrnBK/HXeCG+DT+eWcwb5V6yrlTZOymVGYM7\r\nqD+T941fwAMz2/BE/CMvk2fjW3gpn2um30Yemj5eiD/Ck3Me8EM517xe5lbm\r\nJq/oc7X0G8q95Q/zf0FD5NnyNr4vf5H/ycu5vpt+d/mW7G/8IN0uPyE3zrpk\r\nfmWuu7a03n74ZPVnc37yP0K1M0vVL1D/KLM9a0VlqJp6R/W12beZ19RWbZja\r\nT3gK1aFGaheqbcCz8HpcxG+Oli+X52QOUne5hzw6641X4c14Eb4j+xcfnfOQ\r\nOSKfgtfhSfhFPCizH9+d3+dls0f4z7y5Xjs8HG/JWuANeCoehZdlNvD6mcN8\r\nN6+r1xj3yfnBs/HbeAy+As/Fv/Jq/CX+F9/Dc/XQ7ymPkf/Fq/E3eDEeh59K\r\nnR+T95jZm/nuc+X0q+NTM+uzX6mPfE/eZ/YY3prz6toWeifJV8qb8ozyIv6x\r\nPC2zBC/HDXJmM3vlvvgz/ok8h78jj8VD8Ty8P/WUz5DH4s1ZB3kN/1Yu4XeX\r\nyOPlpzPv8rzyAXKnzKucPfwSHoL74ntzDbWU28sj8Fa8OPeBp+Mb8MP4YKqX\r\nuS/3wxsz13I/VJ5qqHfOuc2+yayl+nSs+kWZRTmvdCZVyAxR75IzkfdF/eRJ\r\ncvnscfwLL+OZWul1kK/KbMAzMm/kR+RDaD3+j1dybQO94+T+WcucJxomPyBX\r\np5fx9vyGa3vlXuRb5f/wUrpTfibzNucp/x9U1bUV9f4HQ42TxQ==\r\n                    \"]]}}}], {GridLines -> Dynamic[\r\n                  Join[{{{3605299200, \r\n                    GrayLevel[0.9]}, {3607891200, \r\n                    GrayLevel[0.9]}, {3610569600, \r\n                    GrayLevel[0.9]}, {3613161600, \r\n                    GrayLevel[0.9]}, {3615840000, \r\n                    GrayLevel[0.9]}, {3618518400, \r\n                    GrayLevel[0.9]}}, {210, 220, 230, 240, 250, 260}}, \r\n                   Replace[\r\n                    MousePosition[{\"Graphics\", Graphics}, None], {\r\n                    None -> {{}, {}}, {\r\n                    Pattern[CalculateUtilities`GraphicsUtilities`Private`x$, \r\n                    Blank[]], \r\n                    Pattern[CalculateUtilities`GraphicsUtilities`Private`y$, \r\n                    Blank[]]} :> {{{\r\n                    CalculateUtilities`GraphicsUtilities`Private`x$, \r\n                    GrayLevel[0.7]}}, {{\r\n                    CalculateUtilities`GraphicsUtilities`Private`y$, \r\n                    GrayLevel[0.7]}}}}], 2]], Epilog -> {{\r\n                   Directive[\r\n                    AbsoluteThickness[0.5], \r\n                    RGBColor[1, 0, 0]], \r\n                   \r\n                   LineBox[{{3611188800, 212.72879241512837`}, {\r\n                    3611188800, 257.21097084166985`}}], {\r\n                    CapForm[None], {\r\n                    GrayLevel[1], \r\n                    PolygonBox[{\r\n                    Offset[{-4.6, -4.25}, \r\n                    Scaled[{0, 0.08}]], \r\n                    Offset[{-4.6, -0.34999999999999987`}, \r\n                    Scaled[{0, 0.08}]], \r\n                    Offset[{4.6, 4.25}, \r\n                    Scaled[{0, 0.08}]], \r\n                    Offset[{4.6, 0.34999999999999987`}, \r\n                    Scaled[{0, 0.08}]]}]}, {\r\n                    AbsoluteThickness[1], \r\n                    GrayLevel[0], \r\n                    LineBox[{{\r\n                    Offset[{-4.6, -4.25}, \r\n                    Scaled[{0, 0.08}]], \r\n                    Offset[{4.6, 0.34999999999999987`}, \r\n                    Scaled[{0, 0.08}]]}, {\r\n                    Offset[{-4.6, -0.34999999999999987`}, \r\n                    Scaled[{0, 0.08}]], \r\n                    Offset[{4.6, 4.25}, \r\n                    Scaled[{0, 0.08}]]}}]}}}, \r\n                  DynamicBox[\r\n                   Typeset`ToBoxes[\r\n                    \r\n                    DynamicModule[{\r\n                    CalculateUtilities`GraphicsUtilities`Private`pt = (\r\n                    NearestFunction[1, {1541, 1}, 3, CompressedData[\"\r\n1:eJwl2nc41t//B3AjQshKdjbZO1lRZIayV0kI2clKSkZKJDIiq0QhK0miRCER\r\n4SNlZCWUmZXE7/n+/v5wPf64Xec8X6/zHufc183n5HPChYyEhIQUfxSUJCRz\r\n2jQj8/0zWrnhYypL8ERNbcoyrBY/Z/gHXmZqryb7MqMlZ5TPSAEnosM8d0K9\r\nPxL8tHBDjuISPSzxHPrMABlG4uP3wEZ216m9MMBM4wgHFI5nzeaC/c1z6zzw\r\nBkmLGR9UU8kpFYC5T0ycReGJHyKvxeAOPhIOSeh2p7xTFnJ8jBVTgO07T0cr\r\nQdmLjKqqRJ6q6RR1mDr3ZuEQkUs0w/Awkeu0f4E2kSvTgFQXnvyP316fyKXX\r\nw2hM5Lpa7GlK5KqLbDlB5JFWuGRFzM+aMuVIzG/qdeQMrL6uk+1C5Gji/nOW\r\nyPFvxcyDyKH0sdQThvsWUPtAmaJwZz84Pm75+jyRh1uaI5DIY7XzQjCRo+25\r\n2CVi3gq21BiYJFEgcB2WFcpXxMGZLOP2REjFPmiTDIXuuP9IgY43osgyiXko\r\nmBKzYOaVHO5c2BdYq/wQGp5Z8C4j8g1f2qyAMTa7blTBBhPhhy+gkpr9QBPk\r\n39Oq2w81Ey3++woddo07DcF00q1LY5BuTr7qF1xvzuEl/Tqj1Rkc9Gc/pH/w\r\nzE4CGnf8rpeCH/l8r8rD9ja3XeqwlcuW2xQ2NqhpBcJqKrLrjTCmXvfbW2jh\r\nH6/YApcH2MY+QLkyadX/YKmFw+wPWHC/5jjdwIxWoNVW4W6oQ6u9xQgnLnQW\r\nsUJ+/UlyXpg9z1wtB73zbWgVobpNjtMBONgotlsNcqRquenANDUfDmvYLefx\r\nwBbS7neRcIBX99hpOMH6XZYtznCd9LjpWSi/bvjFnRh37qiTJ3w8ofXTm5j/\r\nq1qAH7RpkYsJhNq5PEVX4OVUdvlIWHuTpS4ayoTQfLwBz/lQWMXDAheSkVtw\r\nxO6vWxLkPLG6eAda6i2GpsFEjV/kGZBSfGxPDlwi/3jwMZTcaG0shm4LTYal\r\ncHjwhcNTyN5TNfkMmr8v86mBCa+L1mvh+2cPI+rhjpJcmgaocT8zuRFWJdx+\r\n2AJzz156/wkOOASf6IWs5ucH+uBNTffZAdii5Bw4DMkkT22PQDUB29hxGMRu\r\nwTgJK3ebZkzBXxSGAj+hyKZOySx0WtJUXIDGHyRsNmCxb3/1JqRijWLZho2O\r\nA53kgzNa+yivSVLCsGK5OCqotHr9KB1MzlTM3w0XNEdJmeCxyZunWGBRnHI9\r\nK9wpO8HBDp37bgVzEuPw/ZDnJcZpTrrND7+e05gXhHeqU4r2w0U7LSoJaEw6\r\n6yIFqYy0+eShy+J8uCJsTM0cPECMo6arokKMM7qUpga/xGSvaBC5JAzMtIg8\r\ngXn0R4k8XMc89Yg8b9bfGxA5aE2jTWB/3tZfa9jQbjd9DnL779T1hqF7n+b7\r\nQgUnGscL8NFaTV84vM3P+vY2tKUOMr8D+Rc+T6TCyvq7FPdgrzW3bgHce0uw\r\nrRZm/ZXrGoeuY8mOk1Dq/fLCFHyVWs04B0dkVczWoYCbVh/tENbF+L7rblil\r\nSL7GCLXJ3+3dC12z9Wz4oFT042kBuHaOJlQYxh5szxCHj3tNBhUh2dEaR2Vo\r\n+5z3uwqkyVicPQQ9TyVv68O3XX8jjSDXYWcqE9ghqMhoDoVTs1IsYfhOSg4b\r\nYp6ZPv6TMMbuUKEjHG4vFD8DlTQYyl3grbJgBTc4xTta4wE1k/TVveBCAMdR\r\nf6g3ebUtAOZa/TQOgsdV6qzCYFGx4GA4kZM73jECVm47uMcQOf2aZ2Oh05iU\r\nfxysNUtbjYfM77ZDE4n8Sm7bSUT+wq7IFBhwI+9mBmz/S82YBQW9/FNy4H8m\r\nR7LzifxvivkLifxyLIWPidx7vpeVwoSYYwoVcHLtWc1TqOHOo14N077GvKkh\r\n8hvO67wk8tdbtdXD9RzRnkZoynjb6h3R56t/BlqI/rq0TbTDl2Keq33E+IbR\r\nJl9g+bnsRwNQ7OZz0mGYX9JlOwJ5OqafjsG7s2R03yELPZfrDyKPlOLraUhl\r\nYsz2C0b6nPWbg8HldwV+E/2Q27q2CQdP7B3dglbnZVRIh/EcTNZPJodGVU6/\r\nKGBz70UdKqi1ciebBtbtKV2jhUpKLaa7YbnlyGNGKB70h4wF8taIP2ODNCqJ\r\n7PwwyvaxvyDcDm38IAyXXy5fEofeg3SfJeH0prCMDHTm1rwuB4fVbcYUoPVJ\r\nf9UDsCc87s5B2Pq6/qgGrNTiL9aFEk6qOwxg4VVzByN4rylm93EYo/PzvC20\r\n0a9S84IaxVdbfaAg3XFzf7jQNXsuCMZai2RGwOqzGX9SIHPMlepXcP2H8eE3\r\nRA597o9NsIiu9nsrPJzym6UH+ua7nv8BOxqNZBi+4bro+ZDIBIcmDBZZ4Cyl\r\nfiU7pDPUURCAx3rUlZWgxURdujJ0WFH9owK99qrUHoLxdkpq+jDF89k9Q5h1\r\nSeHfMfgkR+7VCfisvILHAta/kblsBd91l32zgR3jUpr2xPzLT3JPEvNTSJKe\r\nJuYXEW90Ieb3FNH2gXsuFeT7Qe4EIYoAKFku0BxM5Frep3eVyEWR8yiKyMXK\r\nQ30NuohkuV8n8ilztcUR+cLYjFKI+XYwmj6Czrlp+UVwU5XnTwm88zn/WBmU\r\nOC9+vwK+pa9cfQrti5QNq+HNUZ3lWih4qV2vHtaxmWW9hr9MHI++hUavQtM7\r\n4IQN6WwnDFu5ptUNWW7Tp/bCEomUmT6o3cp56AscPHM/eQAGbItODcFdmWVq\r\nI/C+ktLtMajSXfd9AnpQtyVMw7agiZEl6MR8TnEFbpQuXl+DYpNbcpuwMSL6\r\n2ha05aYdJBnB+7UmSYYcXjdnj6aAvAs5X3bCmjhhKRpoKvLkKi2capT/TA/1\r\nZI33s8GR9t5LHDDYza6bCz7KcbvIBzVV5zsFYH/fBUFhSEUf2SEGcx9T80tC\r\nZZ3EQGnYNcL6QRa6hWXtU4AkbIIBSjD9aVGrMmyZee6nDttafq8fgh/zpa8c\r\nhr0nCxN04WfV8T0G8CvbviwjIk93avFxOF7WLWcOJ2/S11rCGXcDLRs4ezSm\r\n1Q4uCDSanITLJFt9jnCj9sJ3F/gvrcLTjchxYfa3B9wp7ULmC2lo8677Q/rp\r\nQYYLkOWB+b5QuPdKYkEY5HBol7wMeVSonkVAvr3aalFQcPlyUwwU/fTS4DqU\r\nipO3SYCybj4jiVBBp/hsMlTd5g9MJ/p6nin5PjQ0NeZ4CI0lb+QVwhM0zaJF\r\n0OIHaXkJtH6rfqAM2ueFvKqATnaL7dXQRVnS/AXRzz3uAy+hT+fIdAMMO9JF\r\n+QGmipdpfoN1zzPvjcLRI7Hr41DC/nT5FGy8ycy7RPRpNmh7xyiuv3LNV2LQ\r\nQ02SQxLeamUPlIZfR5YkFaAP48MsdZjhT33JFC4qdKsGwqtkAW3BkKlrj81F\r\nqHDOJvAKDM4bKb8Bt+jmhXKI8QYSq/Ig72O5I/lQSzvQ8TGMCv2X8RTS/NjF\r\n0Aozq55kt0GJqyaSHfAYd7JBN0w044gehHx8dczfYOWcw/1R2HM97/UkZG0Q\r\n3ViAhfFtsb+hsp3n3lXYKkpfsA5tVssU/sKZpuNN/2Do7d/HScZwf51KGSGD\r\n9yQO+FCMEfvO/n874auW0Js08JvTq8e7If9dnQl2eHhxzpULntFPn+aBUXla\r\nnnww/8/MnAB8d/yOnzCcfKy+LAopyX4EikMR28Q/klCv8mCYDHSjGd+Sg0W1\r\nijuUoQTnAP1heOx81G1t6P1BkkUXJgh8TtWHZRevsBvBrp7994zhgngPz3HI\r\nGBWWZwblBoUELeEJhc4Ca3j+ZvB+O1il9kHKER7I8j3oAa1X2Os8YfCxJg0f\r\nWPtvj3YA/GrxujkQ/n3iph8CuSiZ2i9CtZMvjcOhQ7XzpyswnJ7ePBK+fuVo\r\nE0v0Yx+lcxJ0CiqbvAMjO63d0+Dby8Xe9+D3z+aL2UQfZLbO50Hh2MLVB1B3\r\nxDSkgOiD8sbfRzA28UF4MXw8ZURaCts0VyPLoVFeZkItvPVo5Xsd7C4zUX9N\r\n1PGK/FcTzHzncKR5jNhnPc9oJdZl4Jx+BywYe5fbCaem961/guKLISa9RF/X\r\newr6YMW25FY/XKaMtRiAoXvUdozAeq5UuzFIIrhQOTFG7IPyT0/D2ya0r5fg\r\no+uDIRTjM1o/E5U+7YRS6YmiNLCqQPszPXzdVKLABvv+hc2LQXJ/bhdTWFkr\r\nMX8COpKrhVjAuju28bYw4HnaM2c4uclIGQLv6PAlXoSHE2Q4wmHOPhOpSGh9\r\n+KZlPHx/jbIwDwZ37ZHNh8LsQi8L4NWiI53FUKXjytozOLUnMaIGpp7M2fUS\r\n/p6v39cAS5j+6rZBWzua7nZIlc9u3wmrf4lOfoIuisq+vZDH+kL6MGzPjeIf\r\nhaHTySXjRF2hlQ1T8FbW/NQSUU9Kme4KlIn3KViDJNHSFBuwK2z+zCbMDShr\r\n3IJ+nj58pBN4TtjPD1PAMbMydSr41NDnHg00V5232Q1TOOZ72aArU5k8J1Si\r\n8UniniDuI+nFfbDvz5wJPyxYLC0VhEHT3nQiUG9UynM/ZPsy1yYOp7pK90vB\r\nF63esTLQtmZORxFmps01aEDPW6X7tKDaNe/wI5D2stSQDhwMnFPVgyXepRkG\r\n8JKr9x8jaHxSytoE8ljOVR+Hc8dK95jD1zreAZbQUXFO1g7mscyVOEN/2tJd\r\nZ+HhHd4e7kS9v2dFvGHlzycxvjBy3Ou7P1H3gKT2BSjYM3s/CC63PSENhe8a\r\nvRzDYGqt5Otwoh+Vs9wRsPD2bPoNYrw2J7F4Is+O/pe3iP8LbBy+M0HcHwd8\r\n0yDddAlpBoyySxPMgQ13aKvz4GZHhG4+VN651l8Az2t6ejyGTkJa5U9h9slq\r\nrWr4NU28pwYep2FdrYc3j8Rda4CtYSTsTVBzfka1FYaJOna0wZrT/53sIPJn\r\nGCx0Qune1xHdRL4Xd1oGif4vUdt8I3KKX54ZJfJlu9P9IPJc1TBbJOYzmhqm\r\n+I71H1FdlYKO+TUXZaGEmyKpAnw7L0V7EC5t8fEfgcbcVMZWkMq29+FlGNbj\r\nadEFPY5mlHVD6xct1P9B+Rz+V1/gjEe/8Di0IdNeX4FKspyZnJPoe77eCjdk\r\n2htowgtnN7vIhWB+a4ynFGR2XFLXgiQ9+9KPwDmdY0s6sE38UYEBvLrmsNsc\r\nLiS8H3GF+kdKvNzh/bWEjXPQ3NGcxQ++kP2me5GYZ/JN7yXomZF/+grkIfe4\r\nGE2M07tcegsOxH5WTYIK6rWtd2D84j2LNDj58PLYXXjI1snnHkyn19nMhkuN\r\nItfzoGEQDWs+kVt89n4B3PrWKf0Yluul6JdCFg7eSzXQ6yMZzUvYfPV7aj3c\r\nd6BVoAEG/ywqb4SfcuLV30Exc9+2FhhFZWbVBofqFCfaoZIfm18nTBT6++/T\r\nJPGcatj7GRacMjQchdvMUv3j0LqVwWUSVob9XpyCu2T7wn9C5+81u+bgq7uZ\r\n6Qtwr3G40G/oS3a6cgW+rz5yaB3ynxNu34C9PT+/b8ODDwPZaX7gOUtFc5EW\r\nynhmDdLD4k4ZDUYoLP82hxneT7UiZYXcGzNObDDdIfwtB2R5wyjMDW8JPry2\r\nD9LEKk/zQVKTUyXCcG6wRE4Gemhq3pGD3x/0rCjAQY+NmoPQ6mM8hxrsluUL\r\n04DGKVVDmvD9uu6hI1DbfiBXBza89ibTg6oCZM4GsDom5Z0RzGcZN7SE+4ID\r\nn1jDjAHq3Xbw9n2Z7lOQlvKtvBOMdbdKcYbhMuHW7nAjmbH2HLywls/pDT1f\r\nfRj2hz/4TmlegE7RS3lB0MaI3SUM9paVNIdDU2ZN0Qh49Kvrz2io4FbldwvS\r\nR5mE34fs/jM9+VDQMXp/IZFX7WVvMXRbFhZ/Bhudtz63wI4TdyXbYL+mQmQ7\r\nnOfykPoEuf77L+orFGny/ToI5Sp2yXyD+vFaA+PQ/OKgzCR0dA+KmYLnrJgG\r\nZ2CgzhPZWfgvaHRxDpIF/78R8nrX5uFNvvHBRWLddofLLcMH/9hiV2Hpz6dD\r\n67D2i7H8X9j1LGp4Gw482KdANoX743bt9R3wn9eCAjUUE7aPY4KKLGsjLFCT\r\nLElpL7QabhnlhFGp8spCcIhy1/cD0FzJzksFtrkUr6jBmreGlIdh0tWbIkaQ\r\nqnKwzBheHpVQPg49NTv0LOHRLToPR1gneXLJCco7lIa6wKKbW2RukLfOOM4D\r\npv7MZvaCdJzzmT5wI+RWSQD0ffxNIQj+6JeuD4G9B7o6wmHZCsN8LBQWOh0U\r\nB++ZV2zHQ+Yo0thEeOPpcYZkSDKel54Cg5iWeNPhnNbhxxnQ2S9JNgt+zR17\r\nkQOPd8kdvg81pHtOFEK2WeaACpjA5bz5FFIYVUVVw7CLO+hewKUi85SX0O1r\r\nPvcr+I165WEDtDyoI9UE291Sqt/Bw+nfNVrhixbFljZYINz3uRNGTLD++QI5\r\nmvZaDsLKPLanw9DwCjvDKJw4yeE1Di+pc7Z9h6xcXCJTRN0bXFEzUO8L9+gv\r\nOPqcR2Mehqbuy1yExWZ8FquQ/qPg+21YWCIkTDaN9Y0TjtwB/fRE1akhjcj+\r\njF3wPoXYGh1UnRAzZ4C9jeIVTNArT4J+D6S8Inlu7zTx3pNqZYcH1KWFuGAX\r\np8xVHui2IfONF2Y8l7srBOVT5VdFYHuAgpkY/CerRCcNUxkOeMhCqfkDLfLQ\r\nseRghDL8c0NlWAUmuauqqkMxPbX0Q7BJWH1FC9pTaJzQhsvjGmVHoXCeprsh\r\nfH1Zq/nYNPE90WEBU3idU3vIHP5K0T1+ElbeMD7oB6uLdrw/D2vbaq0DYSON\r\nSPBF2HNjuzqaGPdGuUIGVIxjkmmaJs75fcJ7ZrCvVrpTtBeOjByX4oBUSh2K\r\n+6D1SJP2friuUOGkDpWH47JdYHusPr8bdJTfWeABY2OvPvGB/XIhdSEw+Jrr\r\n13hYI6PFWg29b5R510DBCe6WWng7bSPoNfTYevqlFXK2C2cNwG6hlJUhYrzL\r\n5MYjcFluZGuCmO/uXcc5GH6WVpD0J55fb0LDyOEMx3QvxU/iefwumgbSiyoM\r\n08K3EfeVdsPQAYZbjFBG8fIPZjiZMHuIFd6bsktng1T3lPW54SjZUpEwTLd3\r\nJN8Pjas/2onDWvdiWhno28TuIgeFuWPrFX4S+8LVPQdgUpez90GoJ9bTrAq3\r\nIrX2acCqobIgTXjuAE/XYaid/VnWCLoe/FtnDK/18ugdh200rict4a+H16et\r\nIZ3WkwA7aBq0fMMR+jOxsZ6ByU9U81yIcfVOSbjBvvGrzz3genjBYS/IztHW\r\n4QPtTRknAmD4TwWfIJgTY70RAsfqchguwx3WTZkREC9Z4Sjotl9K/Tq88fZ4\r\naxwsPnXBLAG2b6QPJ8K5lDr3ZMggO7KcAmXbya+kwwAyw9QsmJrlzZcLnysn\r\nldyHG95fGgshF82/Y0VQ/SHvlxJ4ZeDsfAW8HxgXWgWbGMsonsOJku7EF5BS\r\nb5WzDoqOsxe+gvrh6nJv4M2qKL1mWGryqKcVds58OPkBMvExX+giroM6JZIe\r\naGFlG/cfsX7xeXlfiXUTfScxBAeapp5/g5snaY+MQZ4N6Y8TUDPFzOYHdJIJ\r\nmpiGD11fbczBqfIk20Uo8de19jfR71u7Q9dhY43jH9JfyEmuaLMDGhyjfkEJ\r\nE9KG2Kjhp9GK4F2QRSKmnw5aB9oqM8ARGvJ1Fiho8dlqL3TLKX7ODuflzYN4\r\n4Jb9w1URyIVjkwp0/MNpoQ7zjyxUHYLi/ekB2lCFdOb3MWJcs5tLjjB5rWs+\r\nBrq2lxy5TnyeF5sWB8cMNA8lQpnssoS7sF07QbKEyJ1keO4T/Ooq8roHPlEl\r\nZ+6D5t9ra7/CB8piNBNQ8xvV41WijqqJzXX4I7bB9C9Rp1zw+jZ02mluRDaL\r\nfd+gdO4OOBT9Q5calts2Ze6CUdI583RQ4otlGhMMlWie5IQvDlt58cB166nf\r\nvDAwmoZUGD7LzLwmCpcrJOjFof+wMacMrFj+licHF2j8RBWhNB9Z2QHofSBZ\r\nUQU+OSZYpwZ/nXl2+BB0T/xsog0fFbj1HYWTdX/s9aHzNKeHMXywXbJgCsf2\r\naASZQcfDjlHWMMd6kcYODntfve0AuaOZ2RyhfWZ+thPMrFAUcoFfW5qLz0Lr\r\n5akaT5hGE3rIB/bx7mr2g+bHJHsCYfKZVzYhsDvEZOQiNC3wm70Cb9WRBUTC\r\nj93JG9GzxHlMMCIWGm0/2xkH4/boJsTPEueIfpZEqGe9wZcCr3nHPUqDzVFc\r\n0hlQu0JDLQdGtnQ25sHGIUf9fKhJE2n5GF7mZRkqhq+UHp4phf+MlGbKodqZ\r\nFt+n8GKI9dozWHtr+lINPFC3K64epkccm3wNN47e0mqEdZ+Y1puJcX+wu3TB\r\nvBK7hm5I5p/F+R/R1wPfAj/Dd5u83V+gcKOT5CCMvZYfOwynjSbHR6ABk+ih\r\ncVj82T3jO6TNKl75QfRBRLrkFzRTV2JfhVVkwQHrkLX1RecG7D+hHrMND7Jd\r\nHiWdw/t2qEFtB7R30/5NBeslY4x3QZ7fLY/p4MglQ0cm6JJ8ooMTer9yLJSC\r\nV1gu2ZlDI86AaUvIzn8uyAZWStskn4QTBoof3KBexKzKJbh7zoGjAA4umz96\r\nBB/9NVQqhprUKifKob8g641a2Gf78c9HmN2i8WUNxl+aVN2AYfIJ2ZvQJmfo\r\nDOk87qOgsDkaeF24lpwHBg+eduWFrknU7/mh9pZ1ggjc+m+NTRbOxuVclIeD\r\nWrrDivDFk9QHKjAgWlFKGzqpDiUehccXo37rQSmH3ppjkJs5jNMU0r4XCD8B\r\npxXOH7GC/TMcBTawObeRyh7m0zJ9dIQnJ8qtPeCxDOuXnlDNlITHB7LXmYyf\r\nh1T+azqBcFUk51Ew7E2e87oEG/VTuy7PE9+XqctfhbnPvqdEwYRz8esx8BKf\r\not116Pl5sD5unjj/SkQmwtbIgS9J8OjbGzIpRN0600N3ifGi0xXuQa1m3bhs\r\nqKFboPwA1l2zuPUQqrbumCyEtVRVakVQWf9Mcsk88bsTpplSqNj2RrMCyhny\r\nzj2D5XGd2jVQuj08sxZKHBvSew2FTTIetBL139LfaIMCXeumHfA+w6PCTsh7\r\n3GrrE8y5TWnRC3m6nxX3wXtMLmRfIKcZi80AzEhuKhuCbL3+lCOQ1eLT0wnI\r\nYJVAP0f0IU3dZQHS9f96uQRpbAzd12Ds3Y3Xf+DOr49ZN2EMh43XFtxhR/WW\r\nZAHn/cznHOSQdNDVjwJe4WJt3blAvB/e8dDAsKyAC7Tw75BAOz1cP3k1hBkG\r\n5sh27YEr30aE2eCS46FeLuiXNye2Dy6MZkXwwVmnTSlh2DfhWCMKG1zfaYnD\r\noqn9HyThHY8EcxkY/mtpSA66eVudVYRq/ryhKlB4OYpcHTIETt88BCdCKnO0\r\n4c0I7XfGRA7yx8bHoWM0Xb8ZNNjpf9oSKlzvm7GGPLtUA+wgVXzOPwc4kOjG\r\ncAa+Zeq46wJL78gKuBF9SN9Q9IJiuTftgiAL/+JECNGHBxbeYXBKqHYtHHYX\r\n8kREwLr9kTRRsKD4R3IMDCkrL4iDTrJ7ZBKg0dOQF4mQ9/nh9hTY+qp3MQdW\r\nah68eB/ea8za8RDGaJMlFELfZte9RdBW70NuCdRukxYrg2wf19Wq4NkhrthW\r\nGEAvN9lGrNMhXe0OmJ7nR9JNjO/SHDwARed83OfgzFajAcsi7iPp/keskOz0\r\nLCX74v/OQU3c0PCap6oILNnNKqECvXjd6RzhRJJ8ttMicR7YknKBBjNJph5Q\r\ntKouOYD4XJeB4zrxee3XojjYI/FQNQE2Mqo4JMOcgTO5WdDW57lwJewejXhe\r\nBfXNjfSeQ+WDo+51kJV815NmmHDhP/X3kGIq5+MHGGbrceojXG5XWOiC5w5t\r\nX+mBYxXvGfvgp9ST8gNQj3r/2yHYcPG3+QgsdYwN/A6Fe07snIJZOtzpM/Cm\r\nWOWLebgjK8xgCV7crTuwDJciGD3XoMfywOYfYnzXgvhNaPPFl2cbdhmqlpEu\r\nYZ5XFJo7oMnLz28poWXNY31q6FJ5zIweepbt62eAASWL9szwakGKKxu88eDs\r\nTw54O/egLzdMz9q1sg/mZgyF8MPCtLItwSXi+ouIFIHVt82oxGB9glC8BHwb\r\nt8YovUScd96nysKvV71yleDY5UNCB+F0GGORKlwPfPZUE26fv6Z8BFL62dTr\r\nQHpv8cN6cM+5f80GkMut0/AYFHTJ6zKB4k7nLU5AuVM6X82hiv3eU1ZQy2Z6\r\n3AaamsXPnoReuv+RuBP1aRdGn4NhWiE03jBSw/CWL1GnKjfLeZikPJ9+Ad5V\r\nfMMdTNQpl3w/FD6SdhG5BMskDpRcJurcTy17Fb4TeKJyjahn78qx23CGpaU7\r\nGS4y3rVKhSS06qcz4U7q3ZNZRD2Uox65S8R183T+PuQmiQ54CI+W7PxYCH2t\r\nb4gUEX0rv/W1FHqcztCsIeZrLKP9AI2jv+YvwGBZh60lmDf0zWoFLit+p9mA\r\nGZPzvuS/sX/TpVBnheE0Mv+pQub1s6c14KPvObOasLthN+VRKBQ0r2QK28dL\r\n053h6U+Tgmfh6iueCnfIm5Hw3hueN/XeCIYc9ZL28bCsyGXqFtROzwpIgt7n\r\n6eLTIPlpHfYMmG586eE9KKH2TDYHvtk/W58HLfcKGeTDmR0OfQWQZaR9rhi6\r\npZbsq4b/IieKa2CSH5fyS/jS6KZpAzRVeTvYCCdENt3eQXpyz4g2+GDhAV3H\r\nb+JcPXC3Ezq9MKzshc98xMeHoScti/YoFHy8mT9OjDvW4ToF9S9Xt8xAEq4c\r\n0Vkiv4XvzCLRjyVrw2U4mKBVsgqTxcXo/kCDVibvv5DU5e/Hf7CGdEKaZBn3\r\nqeqzxR1w6HPWiZ3wTkDMU2pIVmp1gR6+MNDsY4C+P0QPMMNh3o31vTClfsyG\r\nAxrZfqjlguRrTzn3wdrke2F80E8mekgAinZ4aQjDVMpDJOLw2AOR05JwhyZD\r\nozT0DxmNVID7WdsmlOBIZaXOQWj8K3KnBqS47ummCeuELN4fhucb1cV0oNgp\r\n4ThdOPqX/pc+TE9fMzKCpoojT4zhzu5W+uPwlXeFjxkM3JXRZQEntM8l2cLM\r\nUbPf9vBEuJr5KdjwnI7VGQaZrwa6QqnF4c9u8Ht8i/I5eE+s/K4XNGtJ3/CB\r\nNM4Rdv7wDYlHXQAMzjrBHQRfvz3sHwIpf8m1XCT6qcLsdwWWf+55ex2ubTWx\r\n34QawlXeCcvE90Z32JIh870orxRo2xTQmAZzZ5z3ZsAfjBae94g8B3XeZMMA\r\nR0XWPPjymtC5B8Q6le1peAj1+yj2PIKJ/1bciyCPUR9zGXQ53+xWAUsyquuf\r\nQpXp1LM10DLG6uUbmPVEl+Et0ZfeAy7NUHxTpLaVWBcBtt0f/rf+VM4dkMR/\r\nvaYTJjT0O/XC/360Pu+DXLtf0H6BRQ53q4dg84YNzQ9Ix29wahqa66tU/ST6\r\n7StGPQfH0jhOLhDr/Zrm6RJxXU1u7FyBz+l+2q/BLYWBij9Qx/4D5Sa8GfnS\r\nbgtydGdSkK9gv+djb0MLpz6TjtLDDM1CN0a4xbgUxArLQ9O22eCZcbVrnLC1\r\n6loqLwzlluQRgBIx3Q+F4G0r7mdi0HajskcB0p6xtjsAX334N3YQCmTpLWnA\r\nPoq5EC0Y651Mqg1/HRpm0IfZjyLTDVeI37Pt5zWGz8bOS5vB8GhqYwcoM1f6\r\n3yk4Zmnu4AR1RXM8z0KGDwpxfivEvtOxNRq2ZFYfLoX3ntLmlEPfD05/KyHb\r\nX/qq59DD9qzQG0jPzkbVCy1TQzr+QLHSzv2bcPudUMwWfLTySYN8Fec3c7Fy\r\nWpjNPJC0D35PVLPWWSXe7wMbulDJNjTLAMYK1IyZQLFqeS9b2JPRvdsBhl32\r\nqzwFO/TK1pxhoKRxxlnIwzSr5gFbVuO+eULfAbGrPpC94b2gP2zMd2sJgMze\r\nBbShsJqEPy0KnvrecPAapGo7NXgd2iRn8d1aJb7nV3t7GxbZD7jegWZaodRp\r\ncFOIveQufEhTY3wPGs9bLmbDnJo7SvnwsCHDm1I4I112pgImsxhTVsGJoTjD\r\nFzC+UWzuJVFn4fvEV3A4zk3+Dbzmu7OvCcpYFAQ3w/6DOpzvifrJIx0/wvaU\r\nrZl+eCE0K36AqPeUmsww9BENvTAO2ejY2SZhw+Lz2ino3mfp8BMyvVzZnoX/\r\nB69ISgU=\r\n                    \"], CompressedData[\"\r\n1:eJwl2nc8l9/7B3AjQshKdjbZO1lRZIayV0kI2clKSkZKJDIiq0QhK0miRCER\r\n4SNlZCWUmZXE73V/f389/3h7nPO6rnOPc+4HPiefEy6kJCQkFJQkJHPaNCPz\r\n/TNaueFjKkvwRE1tyjKsFj9n+AdeZmqvJvsyoyVnlM9IASeiwzx3Qr0/Evy0\r\ncEOO4hI9LPEc+swAGUbi4/fARnbXqb0wwEzjCAcUjmfN5oL9zXPrPPAGSYsZ\r\nH1RTySkVgLlPTJxF4YkfIq/F4A4+Eg5J6HanvFMWcnyMFVOA7TtPRytB2YuM\r\nqqpEnqrpFHWYOvdm4RCRSzTD8DCR67R/gTaRK9OAVBee/I/fXp/IpdfDaEzk\r\nulrsaUrkqotsOUHkkVa4ZEXMz5oy5UjMb+p15Aysvq6T7ULkaOL+c5bI8W/F\r\nzIPIofSx1BOG+xZQ+0CZonBnPzg+bvn6PJGHW5ojkMhjtfNCMJGj7bnYJWLe\r\nCrbUGJgkUSBwHZYVylfEwZks4/ZESMU+aJMMhe64/0iBjjeiyDKJeSiYErNg\r\n5pUc7lzYF1ir/BAanlnwLiPyDV/arIAxNrtuVMEGE+GHL6CSmv1AE+Tf06rb\r\nDzUTLf77Ch12jTsNwXTSrUtjkG5OvuoXXG/O4SX9OqPVGRz0Zz+kf/DMTgIa\r\nd/yul4If+XyvysP2Nrdd6rCVy5bbFDY2qGkFwmoqsuuNMKZe99tbaOEfr9gC\r\nlwfYxj5AuTJp1f9gqYXD7A9YcL/mON3AjFag1VbhbqhDq73FCCcudBaxQn79\r\nSXJemD3PXC0HvfNtaBWhuk2O0wE42Ci2Ww1ypGq56cA0NR8Oa9gt5/HAFtLu\r\nd5FwgFf32Gk4wfpdli3OcJ30uOlZKL9u+MWdGHfuqJMnfDyh9dObmP+rWoAf\r\ntGmRiwmE2rk8RVfg5VR2+UhYe5OlLhrKhNB8vAHP+VBYxcMCF5KRW3DE7q9b\r\nEuQ8sbp4B1rqLYamwUSNX+QZkFJ8bE8OXCL/ePAxlNxobSyGbgtNhqVwePCF\r\nw1PI3lM1+Qyavy/zqYEJr4vWa+H7Zw8j6uGOklyaBqhxPzO5EVYl3H7YAnPP\r\nXnr/CQ44BJ/ohazm5wf64E1N99kB2KLkHDgMySRPbY9ANQHb2HEYxG7BOAkr\r\nd5tmTMFfFIYCP6HIpk7JLHRa0lRcgMYfJGw2YLFvf/UmpGKNYtmGjY4DneSD\r\nM1r7KK9JUsKwYrk4Kqi0ev0oHUzOVMzfDRc0R0mZ4LHJm6dYYFGccj0r3Ck7\r\nwcEOnftuBXMS4/D9kOclxmlOus0Pv57TmBeEd6pTivbDRTstKgloTDrrIgWp\r\njLT55KHL4ny4ImxMzRw8QIyjpquiQowzupSmBr/EZK9oELkkDMy0iDyBefRH\r\niTxcxzz1iDxv1t8bEDloTaNNYH/e1l9r2NBuN30Ocvvv1PWGoXuf5vtCBSca\r\nxwvw0VpNXzi8zc/69ja0pQ4yvwP5Fz5PpMLK+rsU92CvNbduAdx7S7CtFmb9\r\nlesah65jyY6TUOr98sIUfJVazTgHR2RVzNahgJtWH+0Q1sX4vutuWKVIvsYI\r\ntcnf7d0LXbP1bPigVPTjaQG4do4mVBjGHmzPEIePe00GFSHZ0RpHZWj7nPe7\r\nCqTJWJw9BD1PJW/rw7ddfyONINdhZyoT2CGoyGgOhVOzUixh+E5KDhtinpk+\r\n/pMwxu5QoSMcbi8UPwOVNBjKXeCtsmAFNzjFO1rjATWT9NW94EIAx1F/qDd5\r\ntS0A5lr9NA6Cx1XqrMJgUbHgYDiRkzveMQJWbju4xxA5/ZpnY6HTmJR/HKw1\r\nS1uNh8zvtkMTifxKbttJRP7CrsgUGHAj72YGbP9LzZgFBb38U3LgfyZHsvOJ\r\n/G+K+QuJ/HIshY+J3Hu+l5XChJhjChVwcu1ZzVOo4c6jXg3Tvsa8qSHyG87r\r\nvCTy11u11cP1HNGeRmjKeNvqHdHnq38GWoj+urRNtMOXYp6rfcT4htEmX2D5\r\nuexHA1Ds5nPSYZhf0mU7Ank6pp+OwbuzZHTfIQs9l+sPIo+U4utpSGVizPYL\r\nRvqc9ZuDweV3BX4T/ZDburYJB0/sHd2CVudlVEiH8RxM1k8mh0ZVTr8oYHPv\r\nRR0qqLVyJ5sG1u0pXaOFSkotprthueXIY0YoHvSHjAXy1og/Y4M0Kons/DDK\r\n9rG/INwObfwgDJdfLl8Sh96DdJ8l4fSmsIwMdObWvC4Hh9VtxhSg9Ul/1QOw\r\nJzzuzkHY+rr+qAas1OIv1oUSTqo7DGDhVXMHI3ivKWb3cRij8/O8LbTRr1Lz\r\nghrFV1t9oCDdcXN/uNA1ey4IxlqLZEbA6rMZf1Igc8yV6ldw/Yfx4TdEDn3u\r\nj02wiK72eys8nPKbpQf65rue/wE7Go1kGL7huuj5kMgEhyYMFlngLKV+JTuk\r\nM9RREIDHetSVlaDFRF26MnRYUf2jAr32qtQegvF2Smr6MMXz2T1DmHVJ4d8x\r\n+CRH7tUJ+Ky8gscC1r+RuWwF33WXfbOBHeNSmvbE/MtPck8S81NIkp4m5hcR\r\nb3Qh5vcU0faBey4V5PtB7gQhigAoWS7QHEzkWt6nd5XIRZHzKIrIxcpDfQ26\r\niGS5XyfyKXO1xRH5wtiMUoj5djCaPoLOuWn5RXBTledPCbzzOf9YGZQ4L36/\r\nAr6lr1x9Cu2LlA2r4c1RneVaKHipXa8e1rGZZb2Gv0wcj76FRq9C0zvghA3p\r\nbCcMW7mm1Q1ZbtOn9sISiZSZPqjdynnoCxw8cz95AAZsi04NwV2ZZWoj8L6S\r\n0u0xqNJd930CelC3JUzDtqCJkSXoxHxOcQVulC5eX4Nik1tym7AxIvraFrTl\r\nph0kGcH7tSZJhhxeN2ePpoC8CzlfdsKaOGEpGmgq8uQqLZxqlP9MD/Vkjfez\r\nwZH23kscMNjNrpsLPspxu8gHNVXnOwVgf98FQWFIRR/ZIQZzH1PzS0JlncRA\r\nadg1wvpBFrqFZe1TgCRsggFKMP1pUasybJl57qcO21p+rx+CH/OlrxyGvScL\r\nE3ThZ9XxPQbwK9u+LCMiT3dq8XE4XtYtZw4nb9LXWsIZdwMtGzh7NKbVDi4I\r\nNJqchMskW32OcKP2wncX+C+twtONyHFh9rcH3CntQuYLaWjzrvtD+ulBhguQ\r\n5YH5vlC490piQRjkcGiXvAx5VKieRUC+vdpqUVBw+XJTDBT99NLgOpSKk7dJ\r\ngLJuPiOJUEGn+GwyVN3mD0wn+nqeKfk+NDQ15ngIjSVv5BXCEzTNokXQ4gdp\r\neQm0fqt+oAza54W8qoBOdovt1dBFWdL8BdHPPe4DL6FP58h0Aww70kX5AaaK\r\nl2l+g3XPM++NwtEjsevjUML+dPkUbLzJzLtE9Gk2aHvHKK6/cs1XYtBDTZJD\r\nEt5qZQ+Uhl9HliQVoA/jwyx1mOFPfckULip0qwbCq2QBbcGQqWuPzUWocM4m\r\n8AoMzhspvwG36OaFcojxBhKr8iDvY7kj+VBLO9DxMYwK/ZfxFNL82MXQCjOr\r\nnmS3QYmrJpId8Bh3skE3TDTjiB6EfHx1zN9g5ZzD/VHYcz3v9SRkbRDdWICF\r\n8W2xv6GynefeVdgqSl+wDm1WyxT+wpmm403/YOjt38dJxnB/nUoZIYP3JA74\r\nUIwR+87+fzvhq5bQmzTwm9Orx7sh/12dCXZ4eHHOlQue0U+f5oFReVqefDD/\r\nz8ycAHx3/I6fMJx8rL4sCinJfgSKQxHbxD+SUK/yYJgMdKMZ35KDRbWKO5Sh\r\nBOcA/WF47HzUbW3o/UGSRRcmCHxO1YdlF6+wG8Gunv33jOGCeA/PccgYFZZn\r\nBuUGhQQt4QmFzgJreP5m8H47WKX2QcoRHsjyPegBrVfY6zxh8LEmDR9Y+2+P\r\ndgD8avG6ORD+feKmHwK5KJnaL0K1ky+Nw6FDtfOnKzCcnt48Er5+5WgTS/Rj\r\nH6VzEnQKKpu8AyM7rd3T4NvLxd734PfP5ovZRB9kts7nQeHYwtUHUHfENKSA\r\n6IPyxt9HMDbxQXgxfDxlRFoK2zRXI8uhUV5mQi289Wjlex3sLjNRf03U8Yr8\r\nVxPMfOdwpHmM2Gc9z2gl1mXgnH4HLBh7l9sJp6b3rX+C4oshJr1EX9d7Cvpg\r\nxbbkVj9cpoy1GIChe9R2jMB6rlS7MUgiuFA5MUbsg/JPT8PbJrSvl+Cj64Mh\r\nFOMzWj8TlT7thFLpiaI0sKpA+zM9fN1UosAG+/6FzYtBcn9uF1NYWSsxfwI6\r\nkquFWMC6O7bxtjDgedozZzi5yUgZAu/o8CVehIcTZDjCYc4+E6lIaH34pmU8\r\nfH+NsjAPBnftkc2HwuxCLwvg1aIjncVQpePK2jM4tScxogamnszZ9RL+nq/f\r\n1wBLmP7qtkFbO5rudkiVz27fCat/iU5+gi6Kyr69kMf6QvowbM+N4h+FodPJ\r\nJeNEXaGVDVPwVtb81BJRT0qZ7gqUifcpWIMk0dIUG7ArbP7MJswNKGvcgn6e\r\nPnykE3hO2M8PU8AxszJ1KvjU0OceDTRXnbfZDVM45nvZoCtTmTwnVKLxSeKe\r\nIO4j6cV9sO/PnAk/LFgsLRWEQdPedCJQb1TKcz9k+zLXJg6nukr3S8EXrd6x\r\nMtC2Zk5HEWamzTVoQM9bpfu0oNo17/AjkPay1JAOHAycU9WDJd6lGQbwkqv3\r\nHyNofFLK2gTyWM5VH4dzx0r3mMPXOt4BltBRcU7WDuaxzJU4Q3/a0l1n4eEd\r\n3h7uRL2/Z0W8YeXPJzG+MHLc67s/UfeApPYFKNgzez8ILrc9IQ2F7xq9HMNg\r\naq3k63CiH5Wz3BGw8PZs+g1ivDYnsXgiz47+l7eIvwtsHL4zQdwfB3zTIN10\r\nCWkGjLJLE8yBDXdoq/PgZkeEbj5U3rnWXwDPa3p6PIZOQlrlT2H2yWqtavg1\r\nTbynBh6nYV2thzePxF1rgK1hJOxNUHN+RrUVhok6drTBmtP/newg8mcYLHRC\r\n6d7XEd1Evhd3WgaJ/i9R23wjcopfnhkl8mW70/0g8lzVMFsk5jOaGqb4jvUf\r\nUV2Vgo75NRdloYSbIqkCfDsvRXsQLm3x8R+BxtxUxlaQyrb34WUY1uNp0QU9\r\njmaUdUPrFy3U/0H5HP5XX+CMR7/wOLQh015fgUqynJmck+h7vt4KN2TaG2jC\r\nC2c3u8iFYH5rjKcUZHZcUteCJD370o/AOZ1jSzqwTfxRgQG8uuaw2xwuJLwf\r\ncYX6R0q83OH9tYSNc9Dc0ZzFD76Q/aZ7kZhn8k3vJeiZkX/6CuQh97gYTYzT\r\nu1x6Cw7EflZNggrqta13YPziPYs0OPnw8thdeMjWyeceTKfX2cyGS40i1/Og\r\nYRANaz6RW3z2fgHc+tYp/RiW66Xol0IWDt5LNdDrIxnNS9h89XtqPdx3oFWg\r\nAQb/LCpvhJ9y4tXfQTFz37YWGEVlZtUGh+oUJ9qhkh+bXydMFPr779Mk8Zxq\r\n2PsZFpwyNByF28xS/ePQupXBZRJWhv1enIK7ZPvCf0Ln7zW75uCru5npC3Cv\r\ncbjQb+hLdrpyBb6vPnJoHfKfE27fgL09P79vw4MPA9lpfuA5S0VzkRbKeGYN\r\n0sPiThkNRigs/zaHGd5PtSJlhdwbM05sMN0h/C0HZHnDKMwNbwk+vLYP0sQq\r\nT/NBUpNTJcJwbrBETgZ6aGrekYPfH/SsKMBBj42ag9DqYzyHGuyW5QvTgMYp\r\nVUOa8P267qEjUNt+IFcHNrz2JtODqgJkzgawOiblnRHMZxk3tIT7ggOfWMOM\r\nAerddvD2fZnuU5CW8q28E4x1t0pxhuEy4dbucCOZsfYcvLCWz+kNPV99GPaH\r\nP/hOaV6ATtFLeUHQxojdJQz2lpU0h0NTZk3RCHj0q+vPaKjgVuV3C9JHmYTf\r\nh+z+Mz35UNAxen8hkVftZW8xdFsWFn8GG523PrfAjhN3Jdtgv6ZCZDuc5/KQ\r\n+gS5/vsv6isUafL9OgjlKnbJfIP68VoD49D84qDMJHR0D4qZguesmAZnYKDO\r\nE9lZ+C9odHEOkgX/vxHyetfm4U2+8cFFYt12h8stwwf/2GJXYenPp0PrsPaL\r\nsfxf2PUsangbDjzYp0A2hfvjdu31HfCf14ICNRQTto9jgoosayMsUJMsSWkv\r\ntBpuGeWEUanyykJwiHLX9wPQXMnOSwW2uRSvqMGat4aUh2HS1ZsiRpCqcrDM\r\nGF4elVA+Dj01O/Qs4dEtOg9HWCd5cskJyjuUhrrAoptbZG6Qt844zgOm/sxm\r\n9oJ0nPOZPnAj5FZJAPR9/E0hCP7ol64Pgb0HujrCYdkKw3wsFBY6HRQH75lX\r\nbMdD5ijS2ER44+lxhmRIMp6XngKDmJZ40+Gc1uHHGdDZL0k2C37NHXuRA493\r\nyR2+DzWke04UQrZZ5oAKmMDlvPkUUhhVRVXDsIs76F7ApSLzlJfQ7Ws+9yv4\r\njXrlYQO0PKgj1QTb3VKq38HD6d81WuGLFsWWNlgg3Pe5E0ZMsP75Ajma9loO\r\nwso8tqfD0PAKO8MonDjJ4TUOL6lztn2HrFxcIlNE3RtcUTNQ7wv36C84+pxH\r\nYx6Gpu7LXITFZnwWq5D+o+D7bVhYIiRMNo31jROO3AH99ETVqSGNyP6MXfA+\r\nhdgaHVSdEDNngL2N4hVM0CtPgn4PpLwieW7vNPHek2plhwfUpYW4YBenzFUe\r\n6LYh840XZjyXuysE5VPlV0Vge4CCmRj8J6tEJw1TGQ54yEKp+QMt8tCx5GCE\r\nMvxzQ2VYBSa5q6qqQzE9tfRDsElYfUUL2lNonNCGy+MaZUehcJ6muyF8fVmr\r\n+dg08Z3osIApvM6pPWQOf6XoHj8JK28YH/SD1UU73p+HtW211oGwkUYk+CLs\r\nubFdHU2Me6NcIQMqxjHJNE0T5/w+4T0z2Fcr3SnaC0dGjktxQCqlDsV90Hqk\r\nSXs/XFeocFKHysNx2S6wPVaf3w06yu8s8ICxsVef+MB+uZC6EBh8zfVrPKyR\r\n0WKtht43yrxroOAEd0stvJ22EfQaemw9/dIKOduFswZgt1DKyhAx3mVy4xG4\r\nLDeyNUHMd/eu4xwMP0srSPoTz683oWHkcIZjupfiJ/E8fhdNA+lFFYZp4duI\r\n+0q7YegAwy1GKKN4+QcznEyYPcQK703ZpbNBqnvK+txwlGypSBim2zuS74fG\r\n1R/txGGtezGtDPRtYneRg8LcsfUKP4l94eqeAzCpy9n7INQT62lWhVuRWvs0\r\nYNVQWZAmPHeAp+sw1M7+LGsEXQ/+rTOG13p59I7DNhrXk5bw18Pr09aQTutJ\r\ngB00DVq+4Qj9mdhYz8DkJ6p5LsS4eqck3GDf+NXnHnA9vOCwF2TnaOvwgfam\r\njBMBMPyngk8QzImx3giBY3U5DJfhDuumzAiIl6xwFHTbL6V+Hd54e7w1Dhaf\r\numCWANs30ocT4VxKnXsyZJAdWU6Bsu3kV9JhAJlhahZMzfLmy4XPlZNK7sMN\r\n7y+NhZCL5t+xIqj+kPdLCbwycHa+At4PjAutgk2MZRTP4URJd+ILSKm3ylkH\r\nRcfZC19B/XB1uTfwZlWUXjMsNXnU0wo7Zz6c/ACZ+JgvdBHXQZ0SSQ+0sLKN\r\n+49Yv/i8vK/Euom+kxiCA01Tz7/BzZO0R8Ygz4b0xwmomWJm8wM6yQRNTMOH\r\nrq825uBUeZLtIpT461r7m+j3rd2h67CxxvEP6S/kJFe02QENjlG/oIQJaUNs\r\n1PDTaEXwLsgiEdNPB60DbZUZ4AgN+ToLFLT4bLUXuuUUP2eH8/LmQTxwy/7h\r\nqgjkwrFJBTr+4bRQh/lHFqoOQfH+9ABtqEI68/sYMa7ZzSVHmLzWNR8DXdtL\r\njlwnfs+LTYuDYwaahxKhTHZZwl3Yrp0gWULkTjI89wl+dRV53QOfqJIz90Hz\r\n77W1X+EDZTGaCaj5jerxKlFH1cTmOvwR22D6l6hTLnh9GzrtNDcim8W+b1A6\r\ndwcciv6hSw3LbZsyd8Eo6Zx5OijxxTKNCYZKNE9ywheHrbx44Lr11G9eGBhN\r\nQyoMn2VmXhOFyxUS9OLQf9iYUwZWLH/Lk4MLNH6iilCaj6zsAPQ+kKyoAp8c\r\nE6xTg7/OPDt8CLonfjbRho8K3PqOwsm6P/b60Hma08MYPtguWTCFY3s0gsyg\r\n42HHKGuYY71IYweHva/edoDc0cxsjtA+Mz/bCWZWKAq5wK8tzcVnofXyVI0n\r\nTKMJPeQD+3h3NftB82OSPYEw+cwrmxDYHWIychGaFvjNXoG36sgCIuHH7uSN\r\n6FniPCYYEQuNtp/tjINxe3QT4meJc0Q/SyLUs97gS4HXvOMepcHmKC7pDKhd\r\noaGWAyNbOhvzYOOQo34+1KSJtHwML/OyDBXDV0oPz5TCf0ZKM+VQ7UyL71N4\r\nMcR67RmsvTV9qQYeqNsVVw/TI45NvoYbR29pNcK6T0zrzcS4P9hdumBeiV1D\r\nNyTzz+L8j+jrgW+Bn+G7Td7uL1C40UlyEMZey48dhtNGk+Mj0IBJ9NA4LP7s\r\nnvEd0mYVr/wg+iAiXfILmqkrsa/CKrLggHXI2vqicwP2n1CP2YYH2S6Pks7h\r\nfTvUoLYD2rtp/6aC9ZIxxrsgz++Wx3Rw5JKhIxN0ST7RwQm9XzkWSsErLJfs\r\nzKERZ8C0JWTnPxdkAyulbZJPwgkDxQ9uUC9iVuUS3D3nwFEAB5fNHz2Cj/4a\r\nKhVDTWqVE+XQX5D1Ri3ss/345yPMbtH4sgbjL02qbsAw+YTsTWiTM3SGdB73\r\nUVDYHA28LlxLzgODB0+78kLXJOr3/FB7yzpBBG79t8YmC2fjci7Kw0Et3WFF\r\n+OJJ6gMVGBCtKKUNnVSHEo/C44tRv/WglENvzTHIzRzGaQpp3wuEn4DTCueP\r\nWMH+GY4CG9ic20hlD/NpmT46wpMT5dYe8FiG9UtPqGZKwuMD2etMxs9DKv81\r\nnUC4KpLzKBj2Js95XYKN+qldl+eJ72Xq8ldh7rPvKVEw4Vz8egy8xKdodx16\r\nfh6sj5snzr8SkYmwNXLgSxI8+vaGTApRt8700F1ivOh0hXtQq1k3Lhtq6BYo\r\nP4B11yxuPYSqrTsmC2EtVZVaEVTWP5NcMk/83wnTTClUbHujWQHlDHnnnsHy\r\nuE7tGijdHp5ZCyWODem9hsImGQ9aifpv6W+0QYGuddMOeJ/hUWEn5D1utfUJ\r\n5tymtOiFPN3PivvgPSYXsi+Q04zFZgBmJDeVDUG2Xn/KEchq8enpBGSwSqCf\r\nI/qQpu6yAOn6f71cgjQ2hu5rMPbuxus/cOfXx6ybMIbDxmsL7rCjekuygPN+\r\n5nMOckg66OpHAa9wsbbuXCDeD+94aGBYVsAFWvh3SKCdHq6fvBrCDANzZLv2\r\nwJVvI8JscMnxUC8X9MubE9sHF0azIvjgrNOmlDDsm3CsEYUNru+0xGHR1P4P\r\nkvCOR4K5DAz/tTQkB928rc4qQjV/3lAVKLwcRa4OGQKnbx6CEyGVOdrwZoT2\r\nO2MiB/lj4+PQMZqu3wwa7PQ/bQkVrvfNWEOeXaoBdpAqPuefAxxIdGM4A98y\r\nddx1gaV3ZAXciD6kbyh6QbHcm3ZBkIV/cSKE6MMDC+8wOCVUuxYOuwt5IiJg\r\n3f5ImihYUPwjOQaGlJUXxEEn2T0yCdDoaciLRMj7/HB7Cmx91buYAys1D168\r\nD+81Zu14CGO0yRIKoW+z694iaKv3IbcEardJi5VBto/ralXw7BBXbCsMoJeb\r\nbCPW6ZCudgdMz/Mj6SbGd2kOHoCicz7uc3Bmq9GAZRH3kXT/I1ZIdnqWkn3x\r\nf+egJm5oeM1TVQSW7GaVUIFevO50jnAiST7baZE4D2xJuUCDmSRTDyhaVZcc\r\nQPyuy8Bxnfi99mtRHOyReKiaABsZVRySYc7AmdwsaOvzXLgSdo9GPK+C+uZG\r\nes+h8sFR9zrISr7rSTNMuPCf+ntIMZXz8QMMs/U49REutyssdMFzh7av9MCx\r\niveMffBT6kn5AahHvf/tEGy4+Nt8BJY6xgZ+h8I9J3ZOwSwd7vQZeFOs8sU8\r\n3JEVZrAEL+7WHViGSxGMnmvQY3lg8w8xvmtB/Ca0+eLLsw27DFXLSJcwzysK\r\nzR3Q5OXnt5TQsuaxPjV0qTxmRg89y/b1M8CAkkV7Zni1IMWVDd54cPYnB7yd\r\ne9CXG6Zn7VrZB3MzhkL4YWFa2ZbgEnH9RUSKwOrbZlRisD5BKF4Cvo1bY5Re\r\nIs4771Nl4derXrlKcOzyIaGDcDqMsUgVrgc+e6oJt89fUz4CKf1s6nUgvbf4\r\nYT2459y/ZgPI5dZpeAwKuuR1mUBxp/MWJ6DcKZ2v5lDFfu8pK6hlMz1uA03N\r\n4mdPQi/d/0jcifq0C6PPwTCtEBpvGKlheMuXqFOVm+U8TFKeT78A7yq+4Q4m\r\n6pRLvh8KH0m7iFyCZRIHSi4Tde6nlr0K3wk8UblG1LN35dhtOMPS0p0MFxnv\r\nWqVCElr105lwJ/XuySyiHspRj9wl4rp5On8fcpNEBzyER0t2fiyEvtY3RIqI\r\nvpXf+loKPU5naNYQ8zWW0X6AxtFf8xdgsKzD1hLMG/pmtQKXFb/TbMCMyXlf\r\n8t/Yv+lSqLPCcBqZ/1Qh8/rZ0xrw0fecWU3Y3bCb8igUCppXMoXt46XpzvD0\r\np0nBs3D1FU+FO+TNSHjvDc+bem8EQ456Sft4WFbkMnULaqdnBSRB7/N08WmQ\r\n/LQOewZMN7708B6UUHsmmwPf7J+tz4OWe4UM8uHMDoe+Asgy0j5XDN1SS/ZV\r\nw3+RE8U1MMmPS/klfGl007QBmqq8HWyEEyKbbu8gPblnRBt8sPCAruM3ca4e\r\nuNsJnV4YVvbCZz7i48PQk5ZFexQKPt7MHyfGHetwnYL6l6tbZiAJV47oLJHf\r\nwndmkejHkrXhMhxM0CpZhcniYnR/oEErk/dfSOry9+M/WEM6IU2yjPtU9dni\r\nDjj0OevETngnIOYpNSQrtbpAD18YaPYxQN8fogeY4TDvxvpemFI/ZsMBjWw/\r\n1HJB8rWnnPtgbfK9MD7oJxM9JABFO7w0hGEq5SEScXjsgchpSbhDk6FRGvqH\r\njEYqwP2sbRNKcKSyUucgNP4VuVMDUlz3dNOEdUIW7w/D843qYjpQ7JRwnC4c\r\n/Uv/Sx+mp68ZGUFTxZEnxnBndyv9cfjKu8LHDAbuyuiygBPa55JsYeao2W97\r\neCJczfwUbHhOx+oMg8xXA12h1OLwZzf4Pb5F+Ry8J1Z+1wuataRv+EAa5wg7\r\nf/iGxKMuAAZnneAOgq/fHvYPgZS/5FouEv1UYfa7Ass/97y9Dte2mthvQg3h\r\nKu+EZeK70R22ZMh8L8orBdo2BTSmwdwZ570Z8Aejhec9Is9BnTfZMMBRkTUP\r\nvrwmdO4BsU5lexoeQv0+ij2PYOK/FfciyGPUx1wGXc43u1XAkozq+qdQZTr1\r\nbA20jLF6+QZmPdFleEv0pfeASzMU3xSpbSXWRYBt94f/rT+Vcwck8V+v6YQJ\r\nDf1OvfC/H63P+yDX7he0X2CRw93qIdi8YUPzA9LxG5yahub6KlU/iX77ilHP\r\nwbE0jpMLxHq/pnm6RFxXkxs7V+Bzup/2a3BLYaDiD9Sx/0C5CW9GvrTbghzd\r\nmRTkK9jv+djb0MKpz6Sj9DBDs9CNEW4xLgWxwvLQtG02eGZc7RonbK26lsoL\r\nQ7kleQSgREz3QyF424r7mRi03ajsUYC0Z6ztDsBXH/6NHYQCWXpLGrCPYi5E\r\nC8Z6J5Nqw1+Hhhn0YfajyHTDFeL/2fbzGsNnY+elzWB4NLWxA5SZK/3vFByz\r\nNHdwgrqiOZ5nIcMHhTi/FWLf6dgaDVsyqw+XwntPaXPKoe8Hp7+VkO0vfdVz\r\n6GF7VugNpGdno+qFlqkhHX+gWGnn/k24/U4oZgs+WvmkQb6K85u5WDktzGYe\r\nSNoHvyeqWeusEu/3gQ1dqGQbmmUAYwVqxkygWLW8ly3syeje7QDDLvtVnoId\r\nemVrzjBQ0jjjLORhmlXzgC2rcd88oe+A2FUfyN7wXtAfNua7tQRAZu8C2lBY\r\nTcKfFgVPfW84eA1StZ0avA5tkrP4bq0S3/nV3t6GRfYDrnegmVYodRrcFGIv\r\nuQsf0tQY34PG85aL2TCn5o5SPjxsyPCmFM5Il52pgMksxpRVcGIozvAFjG8U\r\nm3tJ1Fn4PvEVHI5zk38Dr/nu7GuCMhYFwc2w/6AO53uifvJIx4+wPWVrph9e\r\nCM2KHyDqPaUmMwx9REMvjEM2Ona2Sdiw+Lx2Crr3WTr8hEwvV7Zn4f8BSDhK\r\nAw==\r\n                    \"], CompressedData[\"\r\n1:eJwk3Hc41e0fB3CzJCSRrUhkb9luJYREESJpKON7zskIqRRRZJZIFCmRURpW\r\n0lIhhYpHyshKtjSQpN/7XL+/nut1cc65x+e+v593zvVI72Vs82JjYWHhXMTC\r\nwvzvhDl3z2T7iFlrtlx59G4GuRreZ/AdVvsbumrKk0G2VVal/oRjdr6Ocd/L\r\nIOVKfja/YWOhQ25aXgxyQuBNOdvHETMS94Cl15dBNG1zl3PC2sNLfW0pBhmI\r\nPkYthhMtPFoqaAxi9VtZhgfewMqel3iIQeY0OY/zwVc8nJbN+TNIMdX1gR+e\r\neZgf6hXIIPw9CQlCcFGwrY1RMIPUiB4YEoY5W7NK80MYJGi7yUYxeHGoQ8F0\r\nKIPIJazMkoDLDs9uXXGEQdprJ2al4D2B2dNq8FmWuu3SMJ+/xRVb2Mgg+/Ya\r\n+CF9fKMPfPXW1v3rYCFfw3PX4G1f5Z8owjUH+9Y/gTmkWcRUYLpXbHcH7H3h\r\nTrMGXO/5QUkojEHEmmIUteEgj/D3GvCbxXuidWEZ97VH7GCNo8sNDeEzzoG1\r\nZ+CB0uFUY9jMSYyWC6dNPPtmCo9ve7biGWy1LsNmA5xp713VBc/tCcgzh4d+\r\ndRbVwcWZ1qyW8NQPqckHGI/HfzLum+G5KU/NYqxHjVXLcjuYZ2KgMhnrFxRZ\r\nRNkz5zcmNx95GOtVfapuGyw14m16OAjro6Z93BlWHxx76RqA+a9MHfKEHbt/\r\nvpehY/72tI374F2duiuFsJ/lsZuyvOADn0JdF2O/vZ9L/j4IM9qrLv9GPYj9\r\n/bXdFw5tm/886oP10G26TcGRrSZrur0ZJPxQ3hIG8+fsfUXnDjKIemH4fn/m\r\neFK3v0tAffX373gSCA+vfTkduw/rI6kmFgzfL9eVOL0H6+O8+HAovNPqplkk\r\n6re4oULxOHzDLy4+zA3zvSuSdho2uucg47edQc4r562JhauFy/sNHRikJF/r\r\nbhwsEi52g2crg4xcsXuTDP/c3C9/25pBuEQ7XVOY+1liORxuxSBrL/h8TYXf\r\nChUXbrVgEM+zUWyZsOmnfE1tM8yHUyD5CtzKzZ9vYMIgmSezJa/CKUah4maG\r\nDNIWXKV3Ax7MsuKw02EQm33f6CVwxf7h/w4qYP26j8/fhYPTHKzpcgxy2nXp\r\n2VJ4Sd2Dx0FrGOTpVrkbD5j1o3g2P0KSQXSN3Duew2MlEgf3LmcQGaF6y3aY\r\nI81uXv8XnZBkp/8+wSvf/5wonaKTXUv793bBscsye9Um6CSddeF4H/M8xH6t\r\nXfuVTngntErH4KPHT55b/pFOZmuzV7N+wvizpGYtquikOTTktwIsn+p1xf0o\r\nnfBdL3NThkN1D9zMCKETu8Yfj1RhnbYD99sD6aRJ+lCkFnxXyPuVI0Unbxq8\r\nlxrDzRd9f9nuopN6iZ2S9jDPub+joyZ0UvPUyCwYDmd55r6MjU7Kudhia2B3\r\nOTOK7yyNnH5k+fkFvPjHFNfJ0zTiFJCgUwfrP7t2YyqSRn52iPS9hoXdOT63\r\nHqURzRI1w//glnN1Dpk0GrnttGv8K2zzd8v6dQ40knet0oG3Y8SsoL0/OFGM\r\nRoKdF/KXwSO0Fjl5YRrZxGO+sBy+yvG87ckKGhk43Fy4ElZpcDPT5KURmc2D\r\n7Kvhy/RLuhdZaCRrckW5Jny0QlB6z1eK0HNdeXTg4VX7PQwGKGLsmr13PXwv\r\n9n7mil6KdNYoLjNifp7btpW1nygilmbmvQl+8TQzy6uZIheNGGIu8OKyDSyn\r\nHlDkvabv9Z0wT0OrfVw5RXgUvJR3wUY9B3JS7lMkUsjNZC9swR23IfcWRR4t\r\n3VG3H7ZZJZlSXEiRWVYH+4PwVu2S/tJ8imjN2nz0gRtl83v5bmC8ExZ7KbjE\r\nZU34q2sUKRgwG6XD5+OzxaKuUmTgk1GQPxz0VLzCJIsirnWap4PhVQqC3+5f\r\nooj5VanCk3DCb469WckUOZEmqnUKZqhELLgkUqQqXrA6Gt6252/GiniKqB/h\r\nbjoLC7/61RJzhiJ+DE7nBPj3vP+hjdEUyfNi6UmCO9UneBYiKdLj9sf7PJzr\r\n5VtQeZIi4tumpy7AsYKvlpMTFNlhNRV2EbZc4xT66zhFkk3G2DPgM5q93YXH\r\nKLJIqU8oG+a0/10kFEaR7+xN+gXw37MKFqNBFFGZq68pgqsvlRVfDaSI97fn\r\nNrfhIzfNVuwIoEh354Nd9+GZl649TxkUEW0pHSyDS1u/WATTKeL4qoRRCQf2\r\n+99SolEk8UnhbBVc9v3vil4/irwquxHxCE6vHXNt8qUIR/FV7qfw++tXm2tg\r\nk2uZKTUwf4Tjpgq4NPHcjTo40rBa/Sp89eDxV+9g7ztxiwPgjl2h21rhawmm\r\nxw/AKx0DO9rgT74/vu+E44nPeAdst9ateyNcp7s/uBs+zbbMUQ9mU9n9rwd+\r\n+rnmlTJstGZnTD+8UB1sKg2HiDotH4TXZyiWCcH3ltlnDMH6D1PnG+ExTps1\r\no/CGhOmDGhRF5Oc3FY/DbbudWy5g/nu/E51vsJ9mpcks1sfutbLrHPzwmOFY\r\nNNa76FB7+Txc0RGf/e4wRbhWRgn+g+8bdG+TDKFIjWdHM3vniFnx7MkHpUco\r\nsmrRGZVFcIHze4rlKEWOFWnGccE3ytestsX+6k7HWvDCWUG1p/vDKZKSqZO7\r\nDL7UImyghnr5RnpZBeDok1ORbyMosmUwfrcg/CVbJ+5EFEUK4/QerYQtnxxJ\r\nUUU9LtYYEBOFb3Y/yuyKpcj+tqRQcZh7gTU3HvW7Svqr1mp40vhs6cg5jKf2\r\n/DkZ2H5XU/WlCxT55GcyKQu3HBd4aXWRIhfKUwsV4LTqjP/yLlNkys2MSxme\r\n6ejucsrG+rCOe6nCrn9kBjlw/rhszaW1YHGDoum9OK9eU5PhOvBx18mF5TjP\r\nNWmZnevhrlCtxc+KMR4jSwMD2CQ9ZNmhEoyn9/tFI5hTdlPvjXsU+Xg665cJ\r\n/NWVTyEL94eusvV2M7gu6cOhtCqsT3AOnwUc88eH5UwN1kdiC2UF+2hoWZ2o\r\nxfo8m31lDdscnE8KacB68NhHb4V5WhJXeb+nSHvOwh8XOKnwvsnmPoo8feM2\r\n7Ac3pMWdK+OgEcmAxZZ0WOBRJaN8CY2ECd/PPcScb/+XLRV8NKK9l9vzMDyk\r\nRrgfiNDIzZnKtnDm+F/9jKxWppFzMitfnIPP7XBPMXOikZ1LQhwvwHJRlq/3\r\nu+E+/vZhIA12LtFkj9lDI/ceXeK8DD/gXBLYhPu/1UXSMg+2qijb5obnh3CS\r\nbEMVXHFwXvxUBY1c+aP5th8+e1JIJFCSTg70pXgOwplh9wOvrKET1Vc/vw3B\r\nu7YXcD9QoJPHaeXLJ+BujlS9bzp00qNhsH0WzqWoCx52dLLG26yNp2vErElf\r\n3NbwBJ2M2V07sAxOrz94WSyaTkp12GeWw4knfbqPn6UTc/aXwsJw+Ddqr3kq\r\nPj/LylUaPt8a6PuuEJ8fXTC8Bj4bf7hY+w6dzPhxh8nBmRYhExfL6CRG/02G\r\nEnyjMizA4ymdFLRu7dSBszMiwkb/oxM2i0pPPbh0TCpVp4NOdlas/mIAu/9i\r\nq77wmU64M6bGTWF1b/EI1iE6oXan/NsMazrYLu2YpZMXb/+csoWvnG2nLf9L\r\nJxIb9nNthRe/2P/WkpVBGmV1ljvCMXrHU0uXoL9Mu5K6g/n5gUtmR3jRHy1e\r\nJOYKL7mVulNagEFUR9pkPOCuVbdXJYqh33EzzfeELV0NIl9IMUj3m3ylfbAd\r\nrwJrhwz6HRP+O15wySPO0cq1DJJUEqrtDWsx+lrT1jHI0OreSl+4fPWTx0FK\r\nDELObzamwSLvMm9uU2WQb0FiFgHwRw2nY3za6B8HIxuCYP0+jQNjuuj/nUft\r\nQuCM83z2DfoM4mBQ7XwMPvGzbs1pUwYpLJLtDIfZ83J5929gEDbJBM8IeP+O\r\niBmzTQxy798un9OwbIXB67/oH7n9a8dj4NMHhcs6tjDI3j7VgDj4q/DPrAf2\r\nDFK1/eJ0Amz+bvKmMPrTFS//hSXDbKI7zx92ZBBK1/vfefip54ujLU4M8iL/\r\n7alU+Ee+qpeGM/rbsznxGbCrLrveuCv66z9Lll+B447TpG3Q/8rSAlKz4Ucv\r\nPnAXuDPIf1s3ZuXCt7cXd+1Hv6z6rEgmH6YyV9bVIO+d1hTML2DuV9/JO6uR\r\n93SFvpTchjn8nU517meQxNNbtO/CupVPKIMDDDI4U1Z5H/b9p7AjHf27iY+U\r\ncTl82eKC6TT6+4ufTj+rhMW6nv0IQP//zWZy00PYmHu9tBVs9ci54RHsv77Y\r\nThKezV7XUgN/OpdWUIfX2y8/5/wSXvZk6YfLcEHk7446Zj2OneQIgHd6NQy8\r\ngWMt/HZLwA8Vqek22PqPqZA/xqNrE731I2xy8NiazfAdv6ybHcz1bqnUkIYV\r\n4ytYu5m/b/rL9Dfmk1v8dmcPbF+kYfcOlmocvt8Hb313XGEWeeTSOBvvF/ia\r\n5T2bYKyHIJ/Ega/wr0eDtJ9Yr0RVnSfD8Ki2eHIA8gnXVjuRMbi/aOu9b1jv\r\nU4yD/hPM9ZOJaqV7MEjonUtrfjDra9m4iB/2a6/mwpl5WHDkcc4+7HfnNuHe\r\nBZh7z4/nvagP50B1A9Zu3D8f5Ad3b2OQ9ymbU9jhO1vcubpRT7ale8c44Zsv\r\nkhXdkWdqW49u4oKzDF/afkL9mf26kMUNT939TXexZZBqodszPHAVt46ZFupV\r\nV7fOfhlsNJjVFG2J9drRU7AcfvSMy73dnEGUQn6zCcLilwOGFVH/qyuVykTg\r\nOQcLjrdGqHeDZFEZuPLRuL6YJoNE7SwIkIX1LznXUWoM8i+s5rUcfDHwmeMT\r\nZQb5+fDncSU4WCGVsV+eQeidvB9U4BmOf/PlsgwyPC+nrg47ffY+uwTnf78k\r\nidWE7z94L+y+CveDsWufNqydanTjtgSDuHgEGK6H1YVNUsJEGaQlPO6CPiyi\r\nG6A/IMQg9U8eWZjAAYc/RVfw4byayRRZwrI/C6U8WBhEea8hhzWcKvj5Rd08\r\nneRHOu6yhU9orfDT+E0nl5+fXuYAtwccreD4TienN40G7oTjpmzsi/rpxHVz\r\nqREN1lTP8rn0nE5MiiLrGXD66JoGvid0Isvr4BgAr79RoBiFPPXt7bhfCHxY\r\npGyUfhf3t4t8ZgQ8ufCaZp6N/HMw43cqnMB18k3cETpZcfpk+WN4L5truaIy\r\n8tlXuw3P4J2GeyZd5emke7Nk03OYHuCzLlaGTgp5q77UM+fTcyTjqwidbEj9\r\nIdgCf6nOCM/lpJNDuQcCv8IbFRWKVHtopLHGVp3/84iZYf6P3NhLNPJfy+tk\r\nAfje+7+bmlNppGvAekoQVlxY/FXwPI2ML9p8TxQWdZJQuIp8xmuzSXsN/Jtt\r\n061y5K8tLcZ6uvC8Q2XUfQ/ktYHqdD34yF/O5PN4Xu/6ZfjbAP51c3umvwuN\r\n0IQNqkzhiX8Td9W20UiCm67RZrjr1trPRZtoJJUqu2wD73QNHDm7Ac/r49p/\r\nt8BtHM9++ZjSyK1szcfb4GY3d551+jRSdueulBNsvbhQeLEujTx6pn7CGa67\r\nNyMzqEkjL9+XfHaFN3psUn2phvn3qxJ3+MmSFP1c9Bv//bx11QMe5V4h/1UB\r\n8+dUYd0Dh1905fWTx/zllWq84Nw7gx8DZDB/St6cAU/2sQRGon8ROp6X6w9H\r\nMCxdF61E/5O4ljMIFpxPMD2LPKlyZ01tKGwgJM5zHv3Plp+rrCLhaEudGzno\r\nl5w4s29GwSKtR+PWsmG9VkotOQMXetb4F/xDPyh/xScWfiAtNFHxlyI0PYmG\r\nOLiH482Jrj8USTgmYpsKHz+XXxv4kyKNHMvtb8LlhR6OV7+gf7t6MbcQFojZ\r\nbdjcT5F5Q6nfxfCN/Z4yC8inFz7kbimB9c32LFHpoYhyoNK1u3BnyrdAz26K\r\nvOC7N30flp18GL+miyLuhXo25TDN+syNwQ7kj95NP6vgvyxSH6iPFJE9/sbq\r\nEWzhPjyp1k6RapHtV57ACRWlXD/akCe2elq8gKXoNgZHWili+zgsvREmHaFX\r\nopGHB1xZx5vhM7rm5VZN6G9/nTF7D789t6x5aSNFBM/xpbUy12v809em1xQp\r\nVk4daYP3WOWxnEe/al4vbvoRvnndX9TpFfL3vmspHfDUgpGmSD1Fgv6tG+qC\r\nx8q8ZNzrKLI0s8SoB/bpekwVov+9pqt7rg8e4BCpmH1JEYP31V8GmPup7M9q\r\nCfsuaUgchgPD1qT1P6dIQ8hAz3dYQzjmicQz5KEVfjq/mOMx6V3i95Qic7en\r\nYmfgJC8DxwdPKKI4uKA5z6yf+2NDTo/R30dEn1mAV3Vs0sp9RJGdkjydLD0j\r\nZlvYso9/r0Z+rTyvzg7j6VRH4FhH0WhO+Le9g0DSQ4qs/pb9cTFsfZuTdytc\r\nGSenyg0XqK77JA/by9+K5IG5S6zzWeChGq0PfLCvGi3oI/KAlYadggg8qj5z\r\n0wjuedN6XAy2uSsaLASHeru9l4CLNYw2TjygyM1s76PSPcy8F9GVDRPDyeY1\r\n8Jt71wtD4fa2w7JysJJWbYgDzMV3qlERHtNaKsAOXy1YIqPCfP9Slc8dlRTR\r\n25QcrMZ8f2374lL4bc/K1xpwHrekyizsfezKKm24a+Y22wG8nkVENkgXFvxC\r\n2lvg9PuF9Xqw7fv3t8ww3rqRCn9j+GzxtIsk5ttQ92PWFJZULom6ADflqp3c\r\nAH8uOnhnKdaz1SM/0RJeVNS+eA7+YNgvZA1fUjyn5Y/9+CSy6ootcz6Fm3cP\r\nwT3v04oc4O0FVeVt2L/+kveajvCXdYF9W7C/g/F8VTvg0JtKfC/hER9rM1fY\r\ncN2AvhHqYdzidL0brLO1I14S9fJtTc1WD/hUzKyGDfLYT5aFNk/YqkboQyjq\r\na67q8Bcv5vtr20u3ov7+XrxLeTNfT6fVsqJ+WQ6P//Blvj7/rJ8a6nuxmhfb\r\nIfii2MuyszgP3Dw5sQHM12/v21mJ88I33Ml/mLneCf/+fXmD83TdcVUY8/NY\r\nDKzNcP6ETybnHWO+Xt95kv6WImK73qicYL4+IOjC5XcUkTLgKouAi4rP6Tcg\r\nD0oLmxtFMevxy+3umRac/58nnp+GG/32NXb+R5F17x5ax8JD6ofXffhAEdU4\r\nLddEOP5Bevdr3B8a3oyeZOZ+HC/Ur8X9or2p6GAKrLWh+sLTzxQx/CcTnA5f\r\nff3Zugz3l1WgQMo1+G6XXEXWKEVs7O3EbsAc1/QELo0jX6uczcmHdxywpqVM\r\nUmQbd+26QjhAyb0+YYoiTl9Z7xTDLyZpa2J+UMTlhfH6Eti/SUPwzi/cbzlH\r\nHt+FRfNrLkbN4jy7Tb0ph5V3DGSpLOA+1lNxfACXqhyWYWOlEW8hn46HsDHn\r\norw2dhphNPcMP4XpZfK3TiD/Htv4dtFr+L6g38N3gjSSplRCPsMRqqeCk1Vo\r\npLoi83IvvO5ScdUfdRrp3Rgz2w+7s7UtHNCmEWX3PXeG4PVt684YG9JITfyK\r\n1d/h8eNNF0es8HwaD/nH0Yt8crHe4/1+GjG/Qx4rwjlnLAQd8mjE10hFTAXO\r\nPpj1z7uQRpLqRYPVYC1yetHP2zTyqee7ijb87xVbsGglxr/8xhVjOL/jj+P+\r\nBhrJCFhy3B7+yjIhMDdBI1Pa7w2D4YDI1N42AzqJZAtqCIUtArNlOAmdCLwV\r\ncj0KC+4t2Ke1iU60/VyDT8LVGx99SdpKJ6E5PXfOwoPusg/e7aOTBd7Jtdnw\r\nhqAjjbrxdJLUkVyaA98S5ji08RydrC7Q3JgLr3yYKGCfRidm5sGeBfC3f9ed\r\nfa7SSVTY34z7sFNOgyDffeTbr0v562Ge5j0DHh/oJLP0VlYDrFPmuDCEPKwc\r\nuVWlEfbItBQJ7KGTLZIp1u/hYS8V2zPDdJK8XSy6k/l50fvMD6MflJauXvEZ\r\nbpXpu74KefjexK5rvfCFp57sDegnW2JzngzC1+d21UhxMcjKp+vmvsFqh1xI\r\n/UoGyU9oiPkBT/J+yA5A/tVzo4Sn4dtFTv8kkH/r1/HlzcILlq0eddIM4jpd\r\nov0HfvRl22N/5N+R5w7P/8JHT72TlFBgkLBzPxxY+nCe4tKqy9FfL92d2sMG\r\nr4n33q2B/vuy8noGJ7wr3oCtWINBVOba/y6GL8Xz3JBDHn5cFxbPDbfEd1vm\r\nIA9/3vu4YBnsEB+ZkGbIIDKXNg2IwubxDSIRyLsbpiYOSMCWvDWrvyEv7Nuc\r\nPiwFb0x6sG438kRUjhklDRsvv6vehLyR+3tkYg1Mzt/UM0Y+eelwwV8ONhK8\r\nSoodkCcLjH+ug9enXbQSR/5dxPY1WAlOafw4MIk8JL8z+bcKzHGiTvTPDuTH\r\ne/rH1OHD6mV2i1wYxJu7f0ETPtp77dRy5OHCKh0OPeZ8zcPH5ZGvlMU7+DbA\r\n1kt0njkij20JjDpnDldXyUzvRv6lv1YRtISVKX4lP+S3xDUf0jbDmpILu4OR\r\n70qOnhS1hXObRi9E7GOQty0Kl+1gwZMfX8UjD35TapFygMU16hYuIi8ujzqW\r\nsx2O6yvVuo48qdm5VnYHPM/lv+4hvE27Oc8FrqpyS9wIB8aHKrgx15Oy+Pka\r\nry81eq3qCZ9rFn/KzN/rrxzS94V/ptY6L2A8Lr9Eqyk4wvLuo9Nw6JbnJgzm\r\nev/OXLMMrvorZB4Eu7j7T67CfD45PakNZo6Xz93pJub755b35iNwzhOLh+qw\r\nxCKBN0dhNX8N6QdYHyOPh3bh8KiMxBkzeFf5/ncn4VZeW5uzuxgknI/P8RSz\r\nfiI0ihOxvk8ee7rGwGM+87SLzqiPVYv2n4cb9M9P3cR+7w0pGbwAO98O2XYL\r\nefRUs4vPRVhSZtf9uzYM8uJEEf0y7M+97nAV6unLB8epLFgnnLftMeptkfpC\r\nYA78e+q77vONDCIXkz99HY450H6xzoxBLHvsj+TBWz49mn1tinrQm/tzEz7O\r\nfqPglTGDxCRfDy+CuQ7dX3/QgEEKhmxZb8P6Hc9ecqxnkAYyfeoO7Gvxdvs1\r\nLeTpnMzEKrjn15J4ETkGSbr560s1062K4d+QR9+XbDV+AnfftzlUjzzq8ph9\r\n7Dnc6Z/gGIr8mfly18Zapu1vW9ivZP57VkVGPfxJrVlv3Qqclw6/zY2wxiS/\r\nZDsPg+T1vbzazHSTxrI7SxhkaHjV7Dvm/G5vY41ZhPw9dWRrK3xk4Mb8OzbU\r\n62xLXht8Zhct6dwCndz9p7LQDqe2acs4zNHJz0UxTh3w9a3zpfzTdBImZMTR\r\nAz8xi/uUNE4njyTS3PrgxqpttK2431hkv90bgDu0xFiWfUG+1czdMwzPri1Y\r\nm9hJJ+e28jz5DrPy1B2Kf00nN2M7j3D243wFLl5Un0cno8m67xbDO/VzvR/l\r\n0IlqevI6btj1H3l97zKdlOaZf+CDnePCkq+cp5Mnz4u1ReDQG+NigeF00vb3\r\n2KQiXPzmtcspJzphD5D0sodX/i5VN1ugkXtVypPb4JnY+AznWRrxZDc64gS3\r\nmt0so3/H8/LCzoSdcPLdz6OXB2kkqOJi2X54yTk7l99NNDI4v3zREXibjbLG\r\nvWwaubBJOvkorMZuZfsKeXdDorpYONxww13W4gKNZK/aqnoKLndd6eQeSyMu\r\nG+J3JDD9PLY8JpBGXp1ZlJ8Df7p06EivJY2EvhXSyIUfBTSeo5BP5UTXPsyD\r\n6UWyJ9WNaSSycGNzERzFYxA4rUUjBo0nZ8rgu037XSOlaWRIKDmiEjY6Mbnt\r\niwT6AY/spQ/hOrUwWyvkyR+Tj1Y9hXmSkkz5ltFIscAfywbYZ2vV2ox55AM3\r\n7vdv4J//zFf9nUF/nSvq3gyfvNMs4ol+pnxs3eA7eP060eJw9D9eOnqHWmH3\r\ngw+i2cbQv7kcTu9mvr+3wdhy5Ls3V6NkeuFzNz+9TP1EkbDhlOJ+WGg4LFsU\r\n/Vpb2L2nQ7Ck78Nt0ugHk65MDn2HG32NHqijX/VMLbH8BVd8NWD/hn5YPYGR\r\nNwOzHNDfUoJ+myVajXMO3jyw/iKd2d8fm9w3z9zv/LBTCuXIA0ElNQvwPg4J\r\nLbFSivhTDGnWATyfPB/1cd+jiID7ZDcnnCzGsmHsFkX6tpcYc8GfQ3KmOoso\r\nct+GcZkb3tK6IaexgCKOhpOuy+ClidEsJTcokio22SoCe7EtfeJ/hSIHBEq0\r\nxJnv71FM35tJEV1uxnlJWKZ6i9T2SxSeR2pTq2CG6GTjxouY/++JrTLw4+Dk\r\n49qpFMmbun1bFk4vs85STqFIyDCdVx6u0Hjz1v48+tNeVUoB/nBrC/vhcxQR\r\n+TjRoARvV2zWuZSM/PX2toIq3Jxn7/0oiSIP6ukx6vCkzPuM3kTsb+XEJh04\r\nXvy/fwoJFMm8OPHUBJbm7XhVFUsRKun2KjPYNNZ9vjuGIkZn6OEb4WrOblV2\r\nmOeEatcmWC9y9x75M8i/wROGVnDpQk+KzWnkZfrtDGtY4+jeWkY0RY4foP+2\r\nhR1m+mdTotA/e6i6bIVfH1EwnTmFetkxUe4AW/TRjmrj5xNbbgs5wjXW9yr8\r\n4Seb6EE7YOf70z9uw546ExpusE/UCUoB758jOFG8H/aXO7dLCp8fwHN76UF4\r\nUdJ/l9zgDRx0Xx84cka0LR3u+zEuT4eP1l+zW4Hx3xu9dfoQPK3+9aw9fKqf\r\n9iWAuT6XlOoSYMcOFfPDzPVhO8T+GpZtGb8WAl/2LTXlwnr8bLjFGgazKjx9\r\nXAC/rKF5HoOfSYwva8F6plWpPAlnfj6/2J75s6iPe+OSEfALdst7a+Mpkn9u\r\nPP0ss77ezU03YP/6GvYqJsA3nFSkebHfUhztD5PgsE+7bbaiHtKCa7ovwGsH\r\nXmS3oF7el6w/dBH+4z3zSgj1xDtczJrBrIdxhZ/O6RSJcrsomw2fnE606syg\r\nyNMLPOU58I6jzwKkLlNkvjHCMhcWV05qKUP96i2eac9jrreiGv1pNkUCCeVb\r\nANfKN3O9zkFeWWt25/4A8/sIWwN/4TxkeZSblcNrpCZ5WYqRZy8qtVTCuyWS\r\nbnLfpogD98rpR8zzItLctQrnLX5j3JmnzPkIMUIVcR7rj7GIPofLVixboYPz\r\nSiZHDOthFf6tVtbI28fWeTY2wAf5JvsckZ8r9/zn0Qhf50k6vhv3wc8M62/N\r\nMKfQWhUW5F211icR72H5PxzSOci3Ug8u1HXCL9Oivsk2of6/L3H9PMDMN/sH\r\nXuK+SVM6MdILC3mZtx9AvuTN8uH9Cu/R5Hh6sx3rE2myfQpeaDyVpIx8+Ml2\r\nqJvzC/LwpQ/UzTmc/x7DaVXYle2/9njkLc/cyqMa8MOPviFfkbeUvXVYteGA\r\neywrNyBvvZhU5dGHP+9T3j5jQCPfF6RlNsL8L0417kHespPksnOG99ep/T6J\r\nvMW1s/XGCfheQXlNIZ43x1oop7cwnf/BkqZVdOJrkVHyHn7vxBJwfw2duDyo\r\nW/IfrJtp+Sldnk60smUef4SdZdsK96nRyYhvu1w/bKr3w+a3CZ24spnP/mKO\r\n58W92tUedKKrIZ4pPoj5xY97cOF5K5tr9UsS3qLv3z6YjfwlHLx1NWzkq+Ob\r\nd51Oxuffsq+FE4dCBBYK6SS3/jSlCj8dnN976wGdrPD8bmwGlw8s4uBBXmJp\r\nWZW+EV65Zl17xSc6mdi05fsmePG+zcX7uumkQelmnjV8pOF7YyD6h8iZXcsc\r\nYYnUNYePfqeTb4mveg7AV+Sjn59Fv7N5YzHNBxZavHZQgJ9Brs0kzvkxxzP4\r\ngisT/ZGjp6OgP3zyBoddEfLRA43PlkfhTWKGgWfRjwkMPms9Dg+aZeu5If9Q\r\nGbl7TsJXfdkXlJB/pNh9j0bDvQ9exzQi70S2/rydBO9xcc/iRz/YEfPB8DzM\r\nevLpvl70i9rGVfUXmK/Pl1W4t4FBEqYuO12EzZpjJiLRfw7eONF3ifl+02P3\r\nt1sxiOnOvYzLcISUwxFZ9K/pfJvms+ApTs0MN/S332vkY3PgbSaqRmrof21C\r\nuFfmwn8PK3azIe/kKo1fy4PzbsmdbNvGIAufm9UKYK5BGZlC5J87Vqmbb8O7\r\nnMQPOCDfCIqtPl4JL9LmmchGP05rYuN+CN/x40oORH9fG/kl7RHsep1D0xL5\r\nZNX6+jVPYY4OllYx5InQ0cI7NXCJwN/DE8gb77ITjF8yf9/6t3CNN4MoOh5q\r\nqIOHwx5YRPgiv3Ftd26ALTmmbcX8GKSrWmfgDeyboLn9PqzrL+LfDMevZLgy\r\nv++ZvPbP33fwSHbR7i/whsSnwh9gtXuylDAd/e1uG5teuKJtZfTRQwzyb4Vq\r\nez/8aff2OEF/9M/1/F6D8PxQ0rlb8L1jP6aG4J0Bby5aBCDParSFj8LH/3Bl\r\nfYb3f6lcOgFnR23KDQ1Efr2Umf6Nub68kYXLgxhE2C587Q/48KLWtZP4+SG2\r\nPfd+wTHd6lnS8Kvyjaaz8KXyhJWOeD8ZP7k3c3BR4kjiaXx+a8vol39ws0nu\r\niVEGg+jfCBbl/or7NEt4TxnmV8rFfZQHzrd6cfQX1kOdutLJB+t8P5SmAxc1\r\nq5ssh1delrx7GOspp/UiewU8vanhdZkP6j3NmXUlHDUZPPgL6y85N7JXBPa6\r\ntIZVF07fFf5CDDbf+FY8+CD2/9lyOUk4MaXq2VLsX5LsjTOr4O1pHdEj2G/u\r\nGL1haVj80vzmV6gH1q27i+XgF1dM3p9GXpvoLNZUh//k1/SxIk/7EnJBE+4q\r\n6M/rQf19ud7ySxu+Xszh98SeQTp95yr14S13LX4cQ353bkoQM4IFSw9WuCHf\r\nv9eQPmYCd5THHDXAebBLLe0icHVlgamoBdZ31tJ0I3zqYQP7LPKauXvH1U2w\r\n9ePRujbktadP6GxW8JL6/OhiEwYxXMO23xr+9oR/Qt2QQcpPp760hdsqjuwo\r\nQz7LFey32cF8vwuSs7U476tCg2+5wL7xpz1tcB9kdCxZ5gbbR03WNyOfnbum\r\n/n43nBfw7FK7OIPwLHqhtRdO8FVk2yWCPOjjnLof/uuZ4tsriDyrHu7iA7+y\r\n9zJkfl9hLmV5lR9sYNl0nc7NIIdncsXp8GrT9Tw/kMeox6+7A+BbNwN9S5G/\r\nvkrvJofhi/cqdrIgf+2N/p4TAp+s/mNt+wv3ta2o1zHYremU0sAonbSWFNeG\r\nM/e3vU5c/Sud2K8g6yKY9dOzlOdYH51YfDowGg1z/UwZW/GRTrS9S/2TmOsr\r\nnHtrYy2d8EVtDb/GrL9ofn/PK3QiGjDSkgvTuiW2N13E/e8ZrZAPa69X0DFC\r\n3jI0ethaBO8aNPstfIZOvH/KKZXByy0DI5oP0UnN/oUPdfCn+W/ztI100rjt\r\nkkoDfOfS5FETYzppJ9qn3sDRuhNzfOvpZFLCV/UdHEcbnS1RpBOJ//6L+gQb\r\ndn/5ObWcTuSfH/rUCfMfHQisWUonmneXqn+GB4X7v5/npJPNCWYd/fCIXc83\r\nrd804ni0U30QfjbazeD4geexT8jpIWY9RHdNtI7RiJ+zQOcI/FKmk3YD+S54\r\n0y2NcTjzyaexwz008jekd2qCOZ5KUdv3HTTCFvp/iyfZrGM6QsvqzCS8detL\r\nJcNPNBIv3d85BZvJF+t/bqGR9GXhmj/hY/PnLU810sj1vyIx0zCj9YiTfB2N\r\n3B693zUL7yn23Pf6KY1UfbTT+gNfjrD0Z1TRyNuyqO5/cISGUELFLRrpuL5K\r\nm21oxCxoyXyGWz7y57mqWA74YG/fzX9XMV7aN+0l8IXEOy8skTcV5dzjBOD8\r\nUZv5D2E0oiM40yMIZzzX5D4WRCOE7byuMJyQKSqymk4jzt11veKwasb5yNd7\r\naCQqTUtvLXw+JE+geDONdC1a+mU9PKHdpEkTxfrqutEMmL/PPbqjT4BGGryK\r\nfhnBrH2Ljzrz0EjlC5tFG+DweLPnZv8ocj4yXt4W7vIO/WQ0hDx5r7PEDvbs\r\nbVxI76PIiV5lPQf4pvOaNb86kT9Io9UOOMCiye/WO4pYLPD6esJLZGX/Mv/e\r\nUq3i8X0vfPbyEemwMopo7bod5gW3CDRvaiuhSGH8Aps3LB4r66tZSJHV1XZx\r\nvnAWa1hiYi76vdGsFTRYOqz53kgW+j3xyUwGHKiXsM0P/fHckaTiIPhNLtff\r\nXuSrQwWftUOGmH8Ptth2BXnpa7vaoyOw7PKofBf0963r3zaGw8eP/3NoPkmR\r\nkl/8kzHM+TtO51UzKCK3dk9IHHN8S7TnQ/woctnx7r8EuO2pv4PWQYqsiGKN\r\nSYaVg0vyJvZS5Ox9B/4U+KTS+J8CD+Tb/pz0VPhUn6KD107kQYHvq9Ph3yn2\r\nBtQO5CWzDQUZcJPT0T0ft1Nkv/95jSvM/RfJi7FwQL96te9BNhzR8bbkvh36\r\n8beaG67BLlf+tK22pYiJWsu2fJhLxmHtHwvkyfEVQXeZ9aU0/6zEiCKJEvvn\r\n78NmE3LDEgYU4bQtjSqHhe848J9dj/78KAfvA3jM/9j6GW2KfC90TH0I12rn\r\ne+zXpIj3p1zJx/DVmXfR79Qo8nnJrxtP4eAH88UmKhTZob9J9TnMN5MzcVmJ\r\nIm+8U8tfwgv8L+53KSK/pX8xqWe+v+JgqBT8oE6nrgFOMucy2a2AvCzX9qGZ\r\nuZ+htvU98hSJGFj5+yNzfbpbO/tlKSL2XHhHJ3P+L3Z4a8D3ckTud8NOhe0/\r\nwtdQxOakKH8vsz6Tdp54I0ORAQ8xWj+8/3Antxh83Fi84Qs8utMj7aA0RVZK\r\nSMgPMeuF9EiXrcZ+z0lEjcB/1u69xQZbfZTsHYPlz21P6F1Fkd4KKZNJWOX+\r\nocQW/DwsbVXmFKz1X0LSS7xf0XZpp2n4o0j9uQKMh69J9tU/Zn1fNUrzx3zy\r\ni9fKsQ2PmCXXuF7ctw75KE7uFAecNhCc7oT5+1utM14CG627m6GP9eOWV8hY\r\nCm+0bspUUqbINU7FGV6412/0siTW23BA0ZEf/prAlbVMFfVbo3RXAB4vWZvN\r\niv2h5SjzCcE/3m24+gNedFLFTxh25d1w6ZIGM++p1ovC4q/7Yme0KLLeWG2t\r\nBNwdeyrMSZcib8XVI6Xga1ayfvf1sP9z6p9Xw/sXvXRbbkiRjArNS2vhkVOL\r\njBtNcX7TtKbl4Vsb8lWUNmD/g7S3K8KHWK2kYs0p8ldDl1cN/nU89p/5Zpxf\r\n/vW+GnClkeK3azYUUZ1cX6cFH51r6GFBfXsW60fowayhPDXV2yjy+6xBtwH8\r\nQvfWPTEn3Ec+hobG8JlfW66HOlNE0coo3RTefH8ipc2VIs/ljH+ZwUUUjWXY\r\nnSLunCbbzJnjZ2sP3e2JvNlvUmIB56ZtmPpvH853DvGxgYVqhPuY379+csKs\r\ndgvc5By5U59OERePDWvs4dPjY+9L/CkSK27e5QifEK55fjmUImOplg4ezPWg\r\nqBvBp1GfZ+30/eGXjXn2Orivygs5XgXCHlwBvM9uUqSqocolGJ7dYNxge4si\r\nNdzyoUdhpcqWjfuRn1vO/iuPhp1zWdan1GO8Z+9oZwwz+10hlf/GKaITJ6D+\r\nHL7oF+QRa4z7Oq5NTmgEeeuhx4fKbhqx1b1QKAyn6qlVH+inkZ4eB1Ux+G7Z\r\nv6uCQ8ijuo06q+Dhkqu+h6ZoxKXnubkC7JLb91eeg05mte/uNYZ1Ew7IXlSg\r\nE73uuCwvuEhGfP4Ig07exGyW8YbPXzgT8SqQTjy1Fuf5wgcfTOe+CqGTmJjI\r\nWwxYgP2/0Vcn0C9oHqk+AnunnTvSkEQnoWcOfEqAhR5xp74uoZNKdbOV5XDx\r\nsS2vxobphH62hF4Jb3aa3W0xjv5lQLKuCv6icn06+xudnLs4F/IE3mOX9bFs\r\nGvl54f7HetguT6BnLxuDiL+Ru9IBjzn+GasWRX+6NvVXF9zul656UwL93gl2\r\nux74VITOoZRVDPJTs2dhAO4oZvzwWcsgby5d8pyAu+78eOeshn7wII8s6yju\r\nA/31Z3KQB7WfhR1jhycLPj/iRh4cERtu5YTLxWJ+Bloy++OX0dzwlr/teyzQ\r\nL/Ot0+7mgSUYEekldgzyIuKa7jJ44LNCswjyX1gHf9JyeNvXvaP625EfdE58\r\nXQELiRj5saM/H0wcN10Jt1sJjb7ZwSCXh9zSReBLRyZ805AHuS7rbZYcZX4/\r\n5KqvgjuD9LJ9L5SDx7I4fbciD6S7e7IrwAFvu4dFkP/sypvclGAt1kqfPuSH\r\nKp8iHnW4aq+vDzOfHHou6qUJH03ZOGyCfCMnGfNIGzZ5IeHDhfzWGTwttB5m\r\n/fVr6B3y0Pm3++n68PO1zd6ZyEtWii21hvDPHOMCLuSrhVNmq0zgjqi2yKXI\r\nY6VdJSEEfnGQ4c53mEH81ku93QCL2XDpLg9GPsj6oGHLXO8PfpclwhjkgP6f\r\najvm+vRv36ZzlEHOtEpZOcD8k4ZcdscYpIH7gMcOeG4RT9CJcAYZuxE77AKv\r\nXfFTIf0Eg/Ca3Qpyg/ulOj/fOckg9iE/z3rCb3SLbfoiGSRAQGTlPnhmwwXW\r\nP6cYJOWWYY4XXFm5bPJlFMZrtVvZG76sNRbbDrf1R1b4wmdu18uOwrPheRto\r\ncJDCjSd/YVGxhkbGKPM8Rezkj2YQd/vlA0GwQoZBsg4cPqrNCGHur5CwkhWc\r\nfdpl7ghz/Ek/Xu6E+6qz+U/ADdHFf07AHC7PMyPgCpbYtPMwwqxcFJx51Evj\r\nBuytoGocC1P+Ugcb4LMvHOrjYOexOdYuuGj34e2JsPHBD5cn4Tdz6d3J8IT7\r\n63kFeCK12icFvnWy2JAH4+fX6PmZCjNyE8ImsD4ab9hPpsNX6+kP3kYwSBCb\r\nTdoV+By/xvpUrG/aFbr0VXi7tkBwCNa/Qu988TU4yuVHqetx5Cf6x5p8+PDV\r\nMk0p7J8E998thfD6F2n+LNhf4xurPxbD3kMhd/pCGeRkx8HJu7CruoFqPurh\r\nWnBcWCks7ihOi0W9PF9ewlkB24bOF/mhngaK3yc/gB02CCXIot4WWU2LV8Mk\r\n6H3Mg0MMsq5fNP8xrJqXFGWH+t0cbqz5DF720fZkP/J5fGmUVS3cY1wXwot8\r\nfXvrzZZ6uJkRFXhtP4M0j7z2eA3fuWbGWL+XQQSkVxx+C0csrj6wB3lau1qX\r\npQU+pH9k7/ROBnFy3hn3H3M8lK5HHM5nekJOzidY5t0dpzKc76p1L5W7mPXL\r\nTnewxvnveD5U8Rme0lHa8hn3w7wHz8Y+uNV7yCoI94fUnFrTAJx7+6aww2YG\r\nIanbXb/C9OvHspJw/+xVDxkYhvXS7dc2IU/fOPB4bgK2ODWraWPAIEN3zu+c\r\ngs/r7bz1SpdBlP8cqPoB7x97KG+lhfpOWhY2C3M6npDYpMwgNZWev1nHRsxM\r\n5RYtMpXCerLruHLAyz8dPPlIjEGstyx5sAjuS3g1ZyjMIIkXu0SWwKVmSoer\r\nVjDIu967oUvhf9Pxk3r8DCKofLqdF36bPDOWwcMgLsE79fjh1lONfF8XM0gP\r\nN/usINztc2TbCeRnWacPzsJwv/vWoNe/kU+ziypE4a9b16YJIz9PajmGSMGj\r\n6999LEF+XnC/MS0Pz3Iq7OlpR/4ssfxlAPturLPuvovn029xJ2OYLWLWTaqY\r\nTnI3fis1hS89VqB55NGJUnt6kDmsbRSf1J1BJwasIz+2wH+1HVq7T9GJy/b4\r\n755wslzHrs9OdJIy83byNBzSHDB2c5xGDrwp3hgLv7vy4wv5SiMGOTEX42A/\r\nn6DP7cijfdbENBlmKXp1wRX5Uj2rJPES8/1HnC7IV9LIG/NElWJ4xpee8jyC\r\nRhadt/F7B6eKJjwQWUkjnw7IP2mBdfIMX+xfRiO3DNlXtMFlOiNNd7iQ575U\r\nVX2C2xwsB6z+UOS6niL3APz73d1dAb3oNz9zFUzDkcHmT5fcpYhg6cD8LCzW\r\nkFY8j3z1Neap/R/YZvVw+iT6lUTN0Nl/sFBDgv9/6RTZu9jRlm0cz2fJnl31\r\n5ymi26l2lQM299e0fhhPka7or5ZLYB7xDzI5yE93dj7PXAqvW7PuMOdRikSp\r\nZU/ywu3lx9qVgimi/HHHRYFx5r8PrM0OpdBPK9cOisOKGqHKAujfHmxwpknB\r\ne1ptBpuQh2Zdhn6shtNDVl2NQ38YHM3NKgdzPa5dwYn+siwz88w62HRPRuMz\r\nE/RLd5X5lOBgDvqZcH2KBHTbiavDg9ZCf2bQL9/9+TlHE5acGCotRf/9jdt/\r\nnQ58IPd6+iXkCzVptpL1cMLBDl8Z9Pf09Sk6BnCZ4grjIkmK3NoiW20Ed4xb\r\nL9MWQ/+3r2yDKcx2N7K3eiVFfJI/bDWH7+h9j25aRpGbed5tFnDbHwUXZx6K\r\nDFb/dt8M73q6R7GHC3lvWNzXDi6yeNc0xYr9+1f8zX6cmTeX5IQt+JE+IZOQ\r\n7fDvNySQ/Y8f8dzgGeUCW22/Iyz0049ku0xxu8H0lUPDV775kW565LldcNrH\r\nVdVy435EMnqFiCcskhSaFj7iR9wzc7P2wpserGJZM+xHMu/qrPWCA/prfeq+\r\n+pFPdbVFB+GrvPQWv0E/4vJzqJKC/+ypzivt9yMXucNMGcz9jd/H79rnR9pW\r\nL631h3eUc4f97fEjjltUWoLhu9yuWyy6/UjKvseuR+BubZaKkU4/8v7I1p6j\r\nzHrZnb86qcOP2Of5j5+ED97/9eNDux9JqmYLOgVf6Lq869gHP9L0PmUuGq5Z\r\nbF63us2P8A7LRsTAkxqj6i9b/Yjtv7LFcbDoUy3DQThOyDIxAf4kv8yp6j8/\r\n0qDULpgMZySN0BPxeiuXOelUWGx3zjVdfN4ZetzNi8z9rD1Wzf3Rj9RGSahl\r\nwJdVXdq6YfO7JkbZsMQCH/cZjPdUXXNNDtzpNbLGDfOp6fLcnAtfaXxprNbl\r\nRwj3qR0FzPq6csz/A+Z/YrVgVxFz/hwucUWf/chj3Rv7bsNZlNaNE1ivv7a6\r\nI3eY9dDK92R7rx8x2ld36D4sZTTSLo/1PXrEZaYMllU3jZ0e8CNVScPHK2Fe\r\nY81D77Bf66uXxj2CHzqJmJzBfqdHbBl8wtzP4Tg1DdTDnEWSWQ1sHf5vdcd3\r\nP1L9TmC2Fi6/MciuNovxfhX1egsn/yx91cZGkZxit6fvYcuYdQ9PclKELeCK\r\n+H/wX/HLxYrMel3/OfgD/N+dZVmt3BR5Ob/6/Uc43vxUUjgv8lTNXpVOeEP7\r\n9Ml1/BSJOZMb08087++fbtizgiLDtoP9PfDiFN7edGGKWAusM+1n1vv2nSfe\r\niiNPf/DJ+MJcH8F8SS7kbZ4rRb++wr7//XhoivPZJK9WPAazOifM3kY+3m6s\r\nKzoNz7k99U8wpkgpW2jQLFwrwcv/0gx5v/5B8xzs9tn19vwmirRvMz79D/7h\r\n+WPED/eJvsiJXtaJEbPH0iT2OvJmRtdTIw74bF+8fMcO5Edv8x9ccLdIlGrD\r\nboo8UjlttxQ+7evVIepFEakfdQW8sHq1RYwP8mPPcRtPAfjU7iV9XIcp4pWy\r\nrVEc9ruZmGp5FvfJY898VXh2/aX5F6UUOSl43M0R5l86L0YJIL+JBw3vgNf8\r\nFDncIkIjojJ+Ia5w5WedZoNVNHJPzTXFAx5Tv+6irEwjA9Y6r73hpmU1jXst\r\naMQqYtzgOJzc+K+iOYxGlk3sEsuDX8bMO2bgedT50/HmTThsE8/zoUEaufnH\r\nRrcILvsnrrEezzOyxGDbHVg1yJC39TeNBMiuPFsFr7qfq8+5nE7adjb9boJT\r\njl0vsjSlk6w6k48zsKvtrX0jKXSScHzQcA5ekf21szCdTo5pJWbNw2+mpHf4\r\nXaET1+yufayTI2ZmqWlWY3j+CoYcm+CG7X4HikpV0kmsXBW7FHyFI6TLFs/z\r\n0M49B1bDBQdmyrZ10smB80teycCL6kISXXroxHzBJVEelowLNd0/hH7gvxkR\r\nDfjOUuHMnhk6GY/LPqoF767Ib5f9QyedZpbdOjDPPr2VPug3HtxKu24AL3ng\r\nem6KA/1ttI6qOfP3D1w+wyaA/sqwK9kCLuFXeWkhxCAOU1E/rGD36kdscSIM\r\norqrtXIL7Crw+fgK5EnJFcfE7Znje8x46CzDIDyv1oRvg8t8WH5nIl8Oawdu\r\ndIbvPpEOkkW/1T4ilucKmxYFFW5D3qy9WsPlDo+mLl/8QYNBcnkEmjzhXTSb\r\np5/Rv3kM3HHxheXEnmhOEQbZkuHykII/c7onHd7IIEb2LFIMOGNqdvQ3+kPR\r\n6q39gfBCneYNNhvkxYCZTcFwxf1m1jNbGGRaPvtmKLwvi/JYas8grSkTtOPw\r\nf4fzhAWRP2s2p709AUd4bgxKd2aQu/+MtSJhA9uetxLod6+WfUmNghMcdRc5\r\nIH8m+iXMnoavsvSEi3kwyHFpHbdYOPBW7Ez/bgahPnQ+ioMtdmodurWH+fdf\r\n5VPJsPL903sI8mn9qY6P5+EZp6A+FvTjFi/OqqfC7LN79j3zRj7cNNx1iTk/\r\nY2OvDcinNdHp2pfhvM+Kg2zo781qLeOyJpnfPxY5+Bz51MQyT+86bF33w9sc\r\n+aD6jFPSDdjJp3eYA3nCsJ5jMB+W5mn2fYm8UcVValQIj92uHo1GHtHbvC+l\r\nmDke+0LKIoz5/zsRGLkNTyubvihGntFpeEbuwoa5b1UqkUc1bVZPlMGO53+w\r\nNCMP3YlrNq+E5ZdE+35CXlJ7E55ZBdNOrmz9gjyqvKXL6gkcTdfPn0fektua\r\ncb2euT/WJ7YonsH+J22ea4Bjn/FX6MQwyJq3s/aNcLPetdVmschH/Dfzm2HB\r\nO1pnbc8yyGoH54V38JDcyx/OcciX5xY5tcIqWTt27YtHnnhfVtTGXB+hoVp6\r\nAoNcFvBi+whzH5C5JJvIIOLbBV07mO9/6PHGw3BGyvOSLjj16M6Jl7BIa8Ci\r\nHljv9HT6yiQGWen07v4A/CJTdaIC5ndO5JuAL9Rmpc8lM/OBsdc35u+/M9ho\r\ncw55vH3s4Xf4b0fbeCbM7WrjMwN7TfFtND7PIDGX5p78hrnmC8cT4MWfClbO\r\nw02LLNO74dNirrQF5vsv79+gloJ87Mb1guXbiJmuxInxE3BkZoUYO6zcxMF/\r\nDGbtPODPCb8zOdPDBp+UWFm/GD5csuRuLN5vwf2lFDdstzo+gh8+diXoMA8s\r\nd45v20WM70/Xmjd88BvWczJS8KxH5JEVsHV/6nMlzC84W+OtECzjKHLhHub/\r\n63OPnAhc+yJjvz783dO0VQI2z8vmtMT6+edMKK6Ch1bKtDVi/b/1XomQhhPP\r\n5OY5wuN751XlYG6fAsu92K+2Ac/KdXBvfmRrN/bz6YGXZkpw1KDbHje4cEjh\r\ntQrcNnWFYY39v+Cb6KgO7xNZk9eKegkf+96lCX8zudnpgXrypjsf1IHDvVRW\r\nDCP/GwWsDjOAL91bf/Ivs/5+RrEbw/Ifq8vPIO/zBw/Hm35jPh/MxpejXgeO\r\n3Ms2h9/a2u6UQ76PjzB/aQcv+uqpvTUE68FeYOcAp/IO+n7E+fKM5m3fzlwf\r\nbb+cfcjr1osD9uyA7+z89mE8APk5tm3EBT6t87U/DHldaqlhkNs3Zn/0lfGH\r\nhvsqIfvvLrji+tc/R5HXO5K9+ffBgwJDK44fYJAXAo2XvOA566Hsv/uQ3y9o\r\nrPGGBSOHlMJxv0Smz+nQYMtvQxtP4H5SvBrvFgIXvRkOjNiGfCozNXDkG/P7\r\nXCP/WHH/LVx3oh+Duw1G4iJxPw6trZoJh6f9R4TZcX++z5eKiID74vhkFaxw\r\nnyic4o5izu9jUH6yOYPkFX1NOQ3vketQnMX9fKTkTl4cs15q8jXq9PE80RBS\r\nT4R/8fOVqeI+t71/5EEyrOURpJemifNbseFNKnxvlph6KeE+fNw6lQ3fVvlk\r\nyy7JIPeI/tFr8HgYeesrivNbc4XjBrPe6/O2v8fz6bQ5W2I+TAnxftDH8+tQ\r\n7QHhQuZ89wbuzOFjkJ1Wr68Ww6FOyb83ceM+bVBTLGGO54T2sRROnO+mWaNS\r\neKr1WITqPJ0c7JKIqYerFLPSMtroJIhPc7ABbvRstNF7TycnTS3NG+GH6fMs\r\nbY10kp7jz/Ievsjl5rf8JZ3Ue9WGdjDXv29byMQdOlk3wfCZYJ6/WP9C5dN0\r\nMrJQYy04hTzxfjvbaQU6mVZrv7kSfqlvst5zDZ2w7RlfJArvyVlHGUjSmX8P\r\nei4JXzr0978JfjqxOUMZysMBPPkFzO8DFy9bqWwA69nOxu17TiO01T68nvA3\r\nke0VT53RL53XytoLX9g0tsvdnkbcORdUveAdjGiOWSsasR45b+87xfz3rgoH\r\nNQMaWVdanRIE0w9LjF2RwOst+cViYTlOiVi9fvSHVZ8K42D9kjxv/U6KtCjf\r\nMEyEudw1rAz+o0jNcoNdKfDIPYvFRnUUye7Yd/UK7L3PP9q0iCI7GRVy9+Di\r\nQ3U6G0Mo8r43oqIUbqn14rXwp8hmR1urCnjrKo4vVn4U0dPv9amGvzeSC3bo\r\nR1eyL71Vy5yvUtV3V0vk98P/Gb+CPSJcGtzR/3IOZTe9hjs+TufsNqTIsZ2+\r\nu5tgZ83UI3t1kJffaH97Cx+P0XLwUqOIn+m/ky3w16ltHfqKFOm7+2p5G3O+\r\nG6P3/beWIu/SPLQ6mJ/fPxzIgzxstUThRResqSMxny9CkadHfzj2wNVRdlEb\r\nBSly2zMm+AtsLH//QthS5IOWbYuH4PrgLxIrF1PkyibJ9JEp5vc/hG/cRf6I\r\nV7z3YJI5f+9jZUO//QjHlWPW35nzqbxtHPULeWiZZcdP+MqS3perpvzI94jl\r\n1AzcvXOF3cMxP+L7s2P+N+xTuKltxxDy84G8hHmY7T/J5cLIT64fD0n9gzmV\r\nhC7WIG+9tTEsYf2Oz4/gkaQjn1k95iQcsGwb+3VR5LmtDz+8WARfzVnE9faT\r\nH9lRWbB5CSxOW0I7jfzodW/Ldj54Hfuy9T9a/AhVsqqdH77etPxywTs/ElQ8\r\n5b4C1r0kyOrZ7Eci81IPiMDK6mKv3zT4kbPXD46KwU/mJNRP1fuRc1f1D0nC\r\nhrWrUvVrkeeuLP21Ci4/JzM3+dyPXM3oOiIDW7mv3Z33zI/kXyxZkIWfy697\r\n4f7ED/dfxCl5eP3/KrjzcKq2MAzgQkTGRiQRypBQkeJq1Y1uSK4xUySKzjn7\r\nEJlut0kooqIyRCQRV4YMkRSSmaKQDJkyz0Wl6b77z99zDvZe61trfe/jnM0/\r\nnzhVwiAF182WKMEZb7VbJ+CScPmwTfD6hPNLx+GK0C+iqnCUWxUZhesv1dxS\r\nhwW3CXoPw+8vsBI14W/V0T0DcN/ZXfI7YFZk98p+eOS0aLo2PGAvZ9gLf/XO\r\nzyXwq9ms/C74t2ew1p/w3pK50Q6Yx8O6RA9+Eqwt/R4WopT3/AWrmp63eAev\r\nZPysNIBTJKtCWmFJ11eGB2DJIYHSt7Ccy93XB+HrOaZzzbCyk6eFKaw29Pex\r\n3bj/LQ56783hHvlfOpcxPjvtVjtYwX4u6cubMH67rUf6rWHFZMtRMYyviVnY\r\nxGHYY31W1APMB2tfC4cbLCHlOFuF+fTamxrIgOvsBGqEWxnk9G4/fgp2iitM\r\nsML8B+gaXnWHl3U4eyegPkK0167wpOdDXPTAUCeDRGhNRZ+Cba1LZFVRXzEa\r\nZWt9YYFotwVv1F/ilsgkf/hp68qmZ/0M8kDVZeO/sNuc+kAz8n3Wpu0ZZ+HD\r\nnIUV8qjvAkU+9QuwubDufV/k+5eyD3cGw/NKBseksF76Vs8duA5fdHQadkM+\r\nH11R1RwJq7OHq58KMcmMaIzVLXjjaSpNGHmcQ+CPI7fhmij/E/nI37x8woPx\r\n8LNkDkM6fwvx9J5IhPNygpRt5ej9JncqCT5SKiCQqcAkazkCve7DEUFpOpoq\r\nTKKfwduYCo8VrlB7soVJ3A+FbEyH4ybOyupqMUlF9tX3mTCHlSW//p9McuJI\r\nLCmEV8lzvbOwZpKC8iyBOnhXmZ3nqUAmMQ58nzwNL900M/V7lEl81e1/zcJn\r\nsqfrPGeY5G7XB6s5+v62TKcOfcF+pvGRfwFOn/owPsDNIrGDU+5cn7C+V8k+\r\nVJRmkcF9i/9YBb90SlPJtWSRM/xqLdrwfqHjI7rlLLL86/Ejup/ozw8wp/xq\r\nkI8/JkwQ+EKnx1zeaxZpLhXm0YefpJ9epPyBReR9pjRNPtH95+a00O8sUt+f\r\nGe0Ml5z7KnZfjSJHmgbljsOJDTP6f23H+fZMKscNDpQY8xr7gyLSseE1FGyc\r\n1/Va3ZAinibUgi+cNWmrznLBeVeiYhcGD97n1PBCvs5Kdxm+Cq/812elRgzy\r\nb3S8VwS813x8bu4ORShPwbAo+B5na4FPOkW4juiJx8JN7QZRWjh/o43/vR8H\r\nc+Q89/mWT5FNOvnqCfBk4LZDT4opUqY4UXIXXmufpvVPGUUsV8sbJMPV+T+b\r\nnCtxXnPbt6bA86GHa8XqkN976if/gxfrSBefe0sR11sZ6wpg2bh7cSZDFPkZ\r\nMPBfIazsxX2Te5wiER6SWsXwViOXsMJpihQbXTEphd0WNpyRXqCIyc6KznLY\r\noznY+y3y+cDGH64v6fF7MExd4mITIS7m+Vo481C6w7QAm9ybvifYAGuf8l3q\r\nIIq81t0R8wr+7mZm9HkF+q0iw0dvYX8zvkYpSTbJZyv3d8PL5U81eSohjwqs\r\n2NsLT/ReU6xXYRO5tB/J/fDmxIzzcsjfEX0Nx4bhXvEB9ZbtyKtnC6pG4eLW\r\n35dVtNmEQzJBYQK+GbmmL1CXTSgL99GZT/T3Ic0iNJG/5WcPGX6GZWqp0XD0\r\ni53huzPm4SUvNAZ60U9GKisJfoM/T8ZcVDVGf1y9jPoOf5D4Jfcv+tFFLt8b\r\nf8J1+k4va9GvFi4aUOX4jH74ZKWLGPL5Bu38GW44vDY8JdeaTbra4k15Yf/5\r\nWf1F6HdveAXl8sHH1lsNGSOPc2ZanRKCd/mvUxh1YpMiA9IqAiunBFRvR/52\r\nH1LYvvwz/bzIIddA5O9u6YWvq+FJxew0aeTtmyV91hJwu8UKAwp528im7okk\r\n/PK872gx+neuL7lr1sE5DztD+JC3n0TGnZaBY8OvRgojD3ioBXbJwuzNlSmO\r\nyNsKDSzdDbB+44+iHOSHWzy7OJThWcETPWbI2wfubTyiAtc8TPyUjLzNTUTK\r\nVeE7B9p45pG3T/r1BmyDDcP2qtD/71VcVTugCcuo/ENGkFd6Hj3S2wF/qc8x\r\n24l8YzwewKv7mf7+wTr/zotssvgy05XQ45VhEaYShH5e3qJmD2xidCXxDPKS\r\nZ/kfSnrwhvHy3FfIU0oOG0L3wT9Cv1VKI2/1fhca3w83K6u990Aei47+YmRE\r\nX+8rC2495DcTjZ6HxnBiZ1NLFszbXC30N2wwciBVAnnvGZXDNoPn5mp8A2Hv\r\npbGvLeAGTn2DaXhgLyPCBl4vqTtB5+/bvWaf7OjXFZ48U0O+ND2jY+4A+2ho\r\nXrsNlz4WXOUM1xtv3uqBfOpjPu99jH7dNp27E948093mSo+P64ZWfeTZj2FV\r\nWgz6/V5JqTlwnFJ2DAv2Pi/lJ4k8bFYVvcCm3x8eaxAM8zuftz0J18WukpyF\r\nyzhOPPWi358aMWGHfO0bb7rWBz76ZzpDGn5eseekHz3+rRr/PcP7eca3VP0D\r\nh5woG7WDb+xc7nGOrpfr79xi8Pez295UXIZ/fuBxXYbr/fLrhfgV+LpnRGo2\r\n7k93Qx4VDsvySg0Zw/VeN8Qi6fHcrHEsFOOzPO4i6ybcVVZ6XxG2eeFVHgV7\r\nWBh9rMJ4Jo46r46FN4+0yR2Dh0QtmHFw2emjztzw5h16ZXdgM5Gpe0mYLy9H\r\njVV36ftXKvIpwvwWB8sz7tHX07JYNwHzz5m1svQ+zHXelDvwMvaH1sUrH8Be\r\nmxJqT6Berv2cc0uHB9vGrpmgnqSMWpdn0fWxOXCtJPK3i2elaw6s/b6pfxHq\r\nMSO2oCQXzgiUSh9Cve4cuXW8kF7fnY81c1HPlkFWxWWwecjoQQPUf/zDfSIV\r\ncKXG9lVqWB8Db7e7VMLbewM66ecRK//Y+KQaTrvyOum7L9aLrJhwHX09TK17\r\n7j70+l/i3ACLn3bNTsH65Dj5tfAVfCA0uqQT6ze89J3TWzg/7WvbX1jfLUPV\r\nj1vhkUKFj2ew/iWFiwTaYcnqQ7N52B/S7WMKuuCAwUIBGTc2qVyw5h+CTWX9\r\ndn9DHhdcb+AwAgdtSTNWdWQT8/0788bgot3tti7Yn267K/FNwuMmfG63sX/1\r\nRUkcnoalHXd4N9lgfT/nz52l54ftFsCL/c59cIF3Du401ODssmSTx4Jjdl/g\r\n815tpkfNkee3deR8g+Xj/e6N/M0menZ1PD/g2pdrPrMPssmVgGLbX/R+NFmy\r\nd96ITSSaby/mmsP+uotzkBP7tQbbzloAtukPUZDE/j7ctqhXCD4e1ZjMxP4f\r\nS1JdReGLRstkSrTw90RnfVbBzwpixA9vRT37R/0Wg98zum5mqrHJ0X6d4DXw\r\n8DqZZb9x3lTnBd+ShqVEjxx4s5FN/NeqSMnCtq8XHXaUY5NNQc335eGoq0nU\r\nhDSbXLdam68E5wkMXOWVQH0vPHqzDTZacrxZG+ehwNFDttvhS1W8/dVLsL/U\r\n/ezbAb8MevDJAvleNv6vWV24j2t0hTvO19bFk3674bKyEPmfOH8vUZGL9sK/\r\nzilrhnyhyPiubpH9cHjuQKwNzus7DwKiDemfbzBxlcF5biKqKG0Maw4/1RjG\r\neZ/f56lqBm9dc/P1qQ8UORPIZ2wPt1/Q47neSBG1ycwWB1glPueNVS1F+izN\r\n7Z3gC4/X3pVCf7FPIYF5HD47OqedUUIRkbptoR6wrGmKR1UGRZJEHKsD4dY/\r\nu5ZuDaRI1e2CPZnw6gb+1Hb0W3G5AgnZ8DuDr9ORyhRxr3P6/gh+U/txp/EG\r\nioh9F8p7DNfWljaWr6HICZvj8mXw7krv+f94KCIkLrbkLRx9+0ZRVTuLWN7y\r\na/hGzxdJq+88zSJKma8Uf8CXpbqv9nizyO+X8kG/4LvflpkNuKNfnGvS5ZpH\r\nvTw63T7mzCIL5krZAnC9rMngghGL3FneEbEOtjdkDpqvZZGP13QO6cEJnAfO\r\nXnlO5/eOhX3z9PNEu/SSi5hE08Y/3gD+5x+WwNNcJrkkW9h3EBafDYsZS2US\r\npYKtLBu4qb8x1+Aak7yJbRa2h6XXOfg7hSDvn/V45ACzbaaI/0X609lZX5xh\r\ngzfCjWm+TOKtYhx7HI4RSrxRdpJJpJZN6JyANxqp2bYzmaRqPvQDE/YKLpWZ\r\nOYZ+vkPpAhtOqVgiLnqEScRLa+ROwn6/tDmt7ZikPNm1yov+/VrssUQrJllO\r\npQj4w4UPW0rUjNHfc6yPujhPPw80yclEm0kcPpbuCIZvv24xjNZkkiW1Dp2X\r\nYRY/n0aPOpNYR8bLXIU7zrJ53ZE3OH11Kq7DD4uSph/LMkm6XcexG/D+uZb2\r\n31JMYrbbny8KllTle7FPgkl+yItnxMB6xpVnolYyyX3+QuM4+nr2HoqJXIZ8\r\nMWU5cwdW0h7NvSrMJAmFNzSTYU1FoZFgPibZYyhSlglv4LY08/3JIKOqWUdz\r\n4Offh1heCwwSucKYJw/eMut3yf0Lgwx0hRoWwdo98SWuMwwSVq40WQxntqq+\r\nc55kEM3UmmvPYJmGslnHMQbpDnXdWgYXVZgJ2g8zSLA7b+sLuFs/aMb+I4Oo\r\nWaT4VsL5fzPLPAYY5N0OvTU18/TzUUyvByIvKnEFODbCkSel1B8iT9bf/DX6\r\nDk66U+D+o4tBTvnHh3XQ85MWR0RgKQcdtW74YN4FETnkU7aC/6l+2LLWONsQ\r\n+VVMUFxsEFZp2XbOoZ1BSmcePxmGD/dImHgi77q1WtqPwRpjHNLBbQyyrHju\r\n9wS8dH5wKhb5+H+PylPO\r\n                    \"], Automatic, \r\n                    Hold[\r\n                    Nearest[CompressedData[\"\r\n1:eJwl2nc8l9/7B3AjQshKdjbZO1lRZIayV0kI2clKSkZKJDIiq0QhK0miRCER\r\n4SNlZCWUmZXE73V/f389/3h7nPO6rnOPc+4HPiefEy6kJCQkFJQkJHPaNCPz\r\n/TNaueFjKkvwRE1tyjKsFj9n+AdeZmqvJvsyoyVnlM9IASeiwzx3Qr0/Evy0\r\ncEOO4hI9LPEc+swAGUbi4/fARnbXqb0wwEzjCAcUjmfN5oL9zXPrPPAGSYsZ\r\nH1RTySkVgLlPTJxF4YkfIq/F4A4+Eg5J6HanvFMWcnyMFVOA7TtPRytB2YuM\r\nqqpEnqrpFHWYOvdm4RCRSzTD8DCR67R/gTaRK9OAVBee/I/fXp/IpdfDaEzk\r\nulrsaUrkqotsOUHkkVa4ZEXMz5oy5UjMb+p15Aysvq6T7ULkaOL+c5bI8W/F\r\nzIPIofSx1BOG+xZQ+0CZonBnPzg+bvn6PJGHW5ojkMhjtfNCMJGj7bnYJWLe\r\nCrbUGJgkUSBwHZYVylfEwZks4/ZESMU+aJMMhe64/0iBjjeiyDKJeSiYErNg\r\n5pUc7lzYF1ir/BAanlnwLiPyDV/arIAxNrtuVMEGE+GHL6CSmv1AE+Tf06rb\r\nDzUTLf77Ch12jTsNwXTSrUtjkG5OvuoXXG/O4SX9OqPVGRz0Zz+kf/DMTgIa\r\nd/yul4If+XyvysP2Nrdd6rCVy5bbFDY2qGkFwmoqsuuNMKZe99tbaOEfr9gC\r\nlwfYxj5AuTJp1f9gqYXD7A9YcL/mON3AjFag1VbhbqhDq73FCCcudBaxQn79\r\nSXJemD3PXC0HvfNtaBWhuk2O0wE42Ci2Ww1ypGq56cA0NR8Oa9gt5/HAFtLu\r\nd5FwgFf32Gk4wfpdli3OcJ30uOlZKL9u+MWdGHfuqJMnfDyh9dObmP+rWoAf\r\ntGmRiwmE2rk8RVfg5VR2+UhYe5OlLhrKhNB8vAHP+VBYxcMCF5KRW3DE7q9b\r\nEuQ8sbp4B1rqLYamwUSNX+QZkFJ8bE8OXCL/ePAxlNxobSyGbgtNhqVwePCF\r\nw1PI3lM1+Qyavy/zqYEJr4vWa+H7Zw8j6uGOklyaBqhxPzO5EVYl3H7YAnPP\r\nXnr/CQ44BJ/ohazm5wf64E1N99kB2KLkHDgMySRPbY9ANQHb2HEYxG7BOAkr\r\nd5tmTMFfFIYCP6HIpk7JLHRa0lRcgMYfJGw2YLFvf/UmpGKNYtmGjY4DneSD\r\nM1r7KK9JUsKwYrk4Kqi0ev0oHUzOVMzfDRc0R0mZ4LHJm6dYYFGccj0r3Ck7\r\nwcEOnftuBXMS4/D9kOclxmlOus0Pv57TmBeEd6pTivbDRTstKgloTDrrIgWp\r\njLT55KHL4ny4ImxMzRw8QIyjpquiQowzupSmBr/EZK9oELkkDMy0iDyBefRH\r\niTxcxzz1iDxv1t8bEDloTaNNYH/e1l9r2NBuN30Ocvvv1PWGoXuf5vtCBSca\r\nxwvw0VpNXzi8zc/69ja0pQ4yvwP5Fz5PpMLK+rsU92CvNbduAdx7S7CtFmb9\r\nlesah65jyY6TUOr98sIUfJVazTgHR2RVzNahgJtWH+0Q1sX4vutuWKVIvsYI\r\ntcnf7d0LXbP1bPigVPTjaQG4do4mVBjGHmzPEIePe00GFSHZ0RpHZWj7nPe7\r\nCqTJWJw9BD1PJW/rw7ddfyONINdhZyoT2CGoyGgOhVOzUixh+E5KDhtinpk+\r\n/pMwxu5QoSMcbi8UPwOVNBjKXeCtsmAFNzjFO1rjATWT9NW94EIAx1F/qDd5\r\ntS0A5lr9NA6Cx1XqrMJgUbHgYDiRkzveMQJWbju4xxA5/ZpnY6HTmJR/HKw1\r\nS1uNh8zvtkMTifxKbttJRP7CrsgUGHAj72YGbP9LzZgFBb38U3LgfyZHsvOJ\r\n/G+K+QuJ/HIshY+J3Hu+l5XChJhjChVwcu1ZzVOo4c6jXg3Tvsa8qSHyG87r\r\nvCTy11u11cP1HNGeRmjKeNvqHdHnq38GWoj+urRNtMOXYp6rfcT4htEmX2D5\r\nuexHA1Ds5nPSYZhf0mU7Ank6pp+OwbuzZHTfIQs9l+sPIo+U4utpSGVizPYL\r\nRvqc9ZuDweV3BX4T/ZDburYJB0/sHd2CVudlVEiH8RxM1k8mh0ZVTr8oYHPv\r\nRR0qqLVyJ5sG1u0pXaOFSkotprthueXIY0YoHvSHjAXy1og/Y4M0Kons/DDK\r\n9rG/INwObfwgDJdfLl8Sh96DdJ8l4fSmsIwMdObWvC4Hh9VtxhSg9Ul/1QOw\r\nJzzuzkHY+rr+qAas1OIv1oUSTqo7DGDhVXMHI3ivKWb3cRij8/O8LbTRr1Lz\r\nghrFV1t9oCDdcXN/uNA1ey4IxlqLZEbA6rMZf1Igc8yV6ldw/Yfx4TdEDn3u\r\nj02wiK72eys8nPKbpQf65rue/wE7Go1kGL7huuj5kMgEhyYMFlngLKV+JTuk\r\nM9RREIDHetSVlaDFRF26MnRYUf2jAr32qtQegvF2Smr6MMXz2T1DmHVJ4d8x\r\n+CRH7tUJ+Ky8gscC1r+RuWwF33WXfbOBHeNSmvbE/MtPck8S81NIkp4m5hcR\r\nb3Qh5vcU0faBey4V5PtB7gQhigAoWS7QHEzkWt6nd5XIRZHzKIrIxcpDfQ26\r\niGS5XyfyKXO1xRH5wtiMUoj5djCaPoLOuWn5RXBTledPCbzzOf9YGZQ4L36/\r\nAr6lr1x9Cu2LlA2r4c1RneVaKHipXa8e1rGZZb2Gv0wcj76FRq9C0zvghA3p\r\nbCcMW7mm1Q1ZbtOn9sISiZSZPqjdynnoCxw8cz95AAZsi04NwV2ZZWoj8L6S\r\n0u0xqNJd930CelC3JUzDtqCJkSXoxHxOcQVulC5eX4Nik1tym7AxIvraFrTl\r\nph0kGcH7tSZJhhxeN2ePpoC8CzlfdsKaOGEpGmgq8uQqLZxqlP9MD/Vkjfez\r\nwZH23kscMNjNrpsLPspxu8gHNVXnOwVgf98FQWFIRR/ZIQZzH1PzS0JlncRA\r\nadg1wvpBFrqFZe1TgCRsggFKMP1pUasybJl57qcO21p+rx+CH/OlrxyGvScL\r\nE3ThZ9XxPQbwK9u+LCMiT3dq8XE4XtYtZw4nb9LXWsIZdwMtGzh7NKbVDi4I\r\nNJqchMskW32OcKP2wncX+C+twtONyHFh9rcH3CntQuYLaWjzrvtD+ulBhguQ\r\n5YH5vlC490piQRjkcGiXvAx5VKieRUC+vdpqUVBw+XJTDBT99NLgOpSKk7dJ\r\ngLJuPiOJUEGn+GwyVN3mD0wn+nqeKfk+NDQ15ngIjSVv5BXCEzTNokXQ4gdp\r\neQm0fqt+oAza54W8qoBOdovt1dBFWdL8BdHPPe4DL6FP58h0Aww70kX5AaaK\r\nl2l+g3XPM++NwtEjsevjUML+dPkUbLzJzLtE9Gk2aHvHKK6/cs1XYtBDTZJD\r\nEt5qZQ+Uhl9HliQVoA/jwyx1mOFPfckULip0qwbCq2QBbcGQqWuPzUWocM4m\r\n8AoMzhspvwG36OaFcojxBhKr8iDvY7kj+VBLO9DxMYwK/ZfxFNL82MXQCjOr\r\nnmS3QYmrJpId8Bh3skE3TDTjiB6EfHx1zN9g5ZzD/VHYcz3v9SRkbRDdWICF\r\n8W2xv6GynefeVdgqSl+wDm1WyxT+wpmm403/YOjt38dJxnB/nUoZIYP3JA74\r\nUIwR+87+fzvhq5bQmzTwm9Orx7sh/12dCXZ4eHHOlQue0U+f5oFReVqefDD/\r\nz8ycAHx3/I6fMJx8rL4sCinJfgSKQxHbxD+SUK/yYJgMdKMZ35KDRbWKO5Sh\r\nBOcA/WF47HzUbW3o/UGSRRcmCHxO1YdlF6+wG8Gunv33jOGCeA/PccgYFZZn\r\nBuUGhQQt4QmFzgJreP5m8H47WKX2QcoRHsjyPegBrVfY6zxh8LEmDR9Y+2+P\r\ndgD8avG6ORD+feKmHwK5KJnaL0K1ky+Nw6FDtfOnKzCcnt48Er5+5WgTS/Rj\r\nH6VzEnQKKpu8AyM7rd3T4NvLxd734PfP5ovZRB9kts7nQeHYwtUHUHfENKSA\r\n6IPyxt9HMDbxQXgxfDxlRFoK2zRXI8uhUV5mQi289Wjlex3sLjNRf03U8Yr8\r\nVxPMfOdwpHmM2Gc9z2gl1mXgnH4HLBh7l9sJp6b3rX+C4oshJr1EX9d7Cvpg\r\nxbbkVj9cpoy1GIChe9R2jMB6rlS7MUgiuFA5MUbsg/JPT8PbJrSvl+Cj64Mh\r\nFOMzWj8TlT7thFLpiaI0sKpA+zM9fN1UosAG+/6FzYtBcn9uF1NYWSsxfwI6\r\nkquFWMC6O7bxtjDgedozZzi5yUgZAu/o8CVehIcTZDjCYc4+E6lIaH34pmU8\r\nfH+NsjAPBnftkc2HwuxCLwvg1aIjncVQpePK2jM4tScxogamnszZ9RL+nq/f\r\n1wBLmP7qtkFbO5rudkiVz27fCat/iU5+gi6Kyr69kMf6QvowbM+N4h+FodPJ\r\nJeNEXaGVDVPwVtb81BJRT0qZ7gqUifcpWIMk0dIUG7ArbP7MJswNKGvcgn6e\r\nPnykE3hO2M8PU8AxszJ1KvjU0OceDTRXnbfZDVM45nvZoCtTmTwnVKLxSeKe\r\nIO4j6cV9sO/PnAk/LFgsLRWEQdPedCJQb1TKcz9k+zLXJg6nukr3S8EXrd6x\r\nMtC2Zk5HEWamzTVoQM9bpfu0oNo17/AjkPay1JAOHAycU9WDJd6lGQbwkqv3\r\nHyNofFLK2gTyWM5VH4dzx0r3mMPXOt4BltBRcU7WDuaxzJU4Q3/a0l1n4eEd\r\n3h7uRL2/Z0W8YeXPJzG+MHLc67s/UfeApPYFKNgzez8ILrc9IQ2F7xq9HMNg\r\naq3k63CiH5Wz3BGw8PZs+g1ivDYnsXgiz47+l7eIvwtsHL4zQdwfB3zTIN10\r\nCWkGjLJLE8yBDXdoq/PgZkeEbj5U3rnWXwDPa3p6PIZOQlrlT2H2yWqtavg1\r\nTbynBh6nYV2thzePxF1rgK1hJOxNUHN+RrUVhok6drTBmtP/newg8mcYLHRC\r\n6d7XEd1Evhd3WgaJ/i9R23wjcopfnhkl8mW70/0g8lzVMFsk5jOaGqb4jvUf\r\nUV2Vgo75NRdloYSbIqkCfDsvRXsQLm3x8R+BxtxUxlaQyrb34WUY1uNp0QU9\r\njmaUdUPrFy3U/0H5HP5XX+CMR7/wOLQh015fgUqynJmck+h7vt4KN2TaG2jC\r\nC2c3u8iFYH5rjKcUZHZcUteCJD370o/AOZ1jSzqwTfxRgQG8uuaw2xwuJLwf\r\ncYX6R0q83OH9tYSNc9Dc0ZzFD76Q/aZ7kZhn8k3vJeiZkX/6CuQh97gYTYzT\r\nu1x6Cw7EflZNggrqta13YPziPYs0OPnw8thdeMjWyeceTKfX2cyGS40i1/Og\r\nYRANaz6RW3z2fgHc+tYp/RiW66Xol0IWDt5LNdDrIxnNS9h89XtqPdx3oFWg\r\nAQb/LCpvhJ9y4tXfQTFz37YWGEVlZtUGh+oUJ9qhkh+bXydMFPr779Mk8Zxq\r\n2PsZFpwyNByF28xS/ePQupXBZRJWhv1enIK7ZPvCf0Ln7zW75uCru5npC3Cv\r\ncbjQb+hLdrpyBb6vPnJoHfKfE27fgL09P79vw4MPA9lpfuA5S0VzkRbKeGYN\r\n0sPiThkNRigs/zaHGd5PtSJlhdwbM05sMN0h/C0HZHnDKMwNbwk+vLYP0sQq\r\nT/NBUpNTJcJwbrBETgZ6aGrekYPfH/SsKMBBj42ag9DqYzyHGuyW5QvTgMYp\r\nVUOa8P267qEjUNt+IFcHNrz2JtODqgJkzgawOiblnRHMZxk3tIT7ggOfWMOM\r\nAerddvD2fZnuU5CW8q28E4x1t0pxhuEy4dbucCOZsfYcvLCWz+kNPV99GPaH\r\nP/hOaV6ATtFLeUHQxojdJQz2lpU0h0NTZk3RCHj0q+vPaKjgVuV3C9JHmYTf\r\nh+z+Mz35UNAxen8hkVftZW8xdFsWFn8GG523PrfAjhN3Jdtgv6ZCZDuc5/KQ\r\n+gS5/vsv6isUafL9OgjlKnbJfIP68VoD49D84qDMJHR0D4qZguesmAZnYKDO\r\nE9lZ+C9odHEOkgX/vxHyetfm4U2+8cFFYt12h8stwwf/2GJXYenPp0PrsPaL\r\nsfxf2PUsangbDjzYp0A2hfvjdu31HfCf14ICNRQTto9jgoosayMsUJMsSWkv\r\ntBpuGeWEUanyykJwiHLX9wPQXMnOSwW2uRSvqMGat4aUh2HS1ZsiRpCqcrDM\r\nGF4elVA+Dj01O/Qs4dEtOg9HWCd5cskJyjuUhrrAoptbZG6Qt844zgOm/sxm\r\n9oJ0nPOZPnAj5FZJAPR9/E0hCP7ol64Pgb0HujrCYdkKw3wsFBY6HRQH75lX\r\nbMdD5ijS2ER44+lxhmRIMp6XngKDmJZ40+Gc1uHHGdDZL0k2C37NHXuRA493\r\nyR2+DzWke04UQrZZ5oAKmMDlvPkUUhhVRVXDsIs76F7ApSLzlJfQ7Ws+9yv4\r\njXrlYQO0PKgj1QTb3VKq38HD6d81WuGLFsWWNlgg3Pe5E0ZMsP75Ajma9loO\r\nwso8tqfD0PAKO8MonDjJ4TUOL6lztn2HrFxcIlNE3RtcUTNQ7wv36C84+pxH\r\nYx6Gpu7LXITFZnwWq5D+o+D7bVhYIiRMNo31jROO3AH99ETVqSGNyP6MXfA+\r\nhdgaHVSdEDNngL2N4hVM0CtPgn4PpLwieW7vNPHek2plhwfUpYW4YBenzFUe\r\n6LYh840XZjyXuysE5VPlV0Vge4CCmRj8J6tEJw1TGQ54yEKp+QMt8tCx5GCE\r\nMvxzQ2VYBSa5q6qqQzE9tfRDsElYfUUL2lNonNCGy+MaZUehcJ6muyF8fVmr\r\n+dg08Z3osIApvM6pPWQOf6XoHj8JK28YH/SD1UU73p+HtW211oGwkUYk+CLs\r\nubFdHU2Me6NcIQMqxjHJNE0T5/w+4T0z2Fcr3SnaC0dGjktxQCqlDsV90Hqk\r\nSXs/XFeocFKHysNx2S6wPVaf3w06yu8s8ICxsVef+MB+uZC6EBh8zfVrPKyR\r\n0WKtht43yrxroOAEd0stvJ22EfQaemw9/dIKOduFswZgt1DKyhAx3mVy4xG4\r\nLDeyNUHMd/eu4xwMP0srSPoTz683oWHkcIZjupfiJ/E8fhdNA+lFFYZp4duI\r\n+0q7YegAwy1GKKN4+QcznEyYPcQK703ZpbNBqnvK+txwlGypSBim2zuS74fG\r\n1R/txGGtezGtDPRtYneRg8LcsfUKP4l94eqeAzCpy9n7INQT62lWhVuRWvs0\r\nYNVQWZAmPHeAp+sw1M7+LGsEXQ/+rTOG13p59I7DNhrXk5bw18Pr09aQTutJ\r\ngB00DVq+4Qj9mdhYz8DkJ6p5LsS4eqck3GDf+NXnHnA9vOCwF2TnaOvwgfam\r\njBMBMPyngk8QzImx3giBY3U5DJfhDuumzAiIl6xwFHTbL6V+Hd54e7w1Dhaf\r\numCWANs30ocT4VxKnXsyZJAdWU6Bsu3kV9JhAJlhahZMzfLmy4XPlZNK7sMN\r\n7y+NhZCL5t+xIqj+kPdLCbwycHa+At4PjAutgk2MZRTP4URJd+ILSKm3ylkH\r\nRcfZC19B/XB1uTfwZlWUXjMsNXnU0wo7Zz6c/ACZ+JgvdBHXQZ0SSQ+0sLKN\r\n+49Yv/i8vK/Euom+kxiCA01Tz7/BzZO0R8Ygz4b0xwmomWJm8wM6yQRNTMOH\r\nrq825uBUeZLtIpT461r7m+j3rd2h67CxxvEP6S/kJFe02QENjlG/oIQJaUNs\r\n1PDTaEXwLsgiEdNPB60DbZUZ4AgN+ToLFLT4bLUXuuUUP2eH8/LmQTxwy/7h\r\nqgjkwrFJBTr+4bRQh/lHFqoOQfH+9ABtqEI68/sYMa7ZzSVHmLzWNR8DXdtL\r\njlwnfs+LTYuDYwaahxKhTHZZwl3Yrp0gWULkTjI89wl+dRV53QOfqJIz90Hz\r\n77W1X+EDZTGaCaj5jerxKlFH1cTmOvwR22D6l6hTLnh9GzrtNDcim8W+b1A6\r\ndwcciv6hSw3LbZsyd8Eo6Zx5OijxxTKNCYZKNE9ywheHrbx44Lr11G9eGBhN\r\nQyoMn2VmXhOFyxUS9OLQf9iYUwZWLH/Lk4MLNH6iilCaj6zsAPQ+kKyoAp8c\r\nE6xTg7/OPDt8CLonfjbRho8K3PqOwsm6P/b60Hma08MYPtguWTCFY3s0gsyg\r\n42HHKGuYY71IYweHva/edoDc0cxsjtA+Mz/bCWZWKAq5wK8tzcVnofXyVI0n\r\nTKMJPeQD+3h3NftB82OSPYEw+cwrmxDYHWIychGaFvjNXoG36sgCIuHH7uSN\r\n6FniPCYYEQuNtp/tjINxe3QT4meJc0Q/SyLUs97gS4HXvOMepcHmKC7pDKhd\r\noaGWAyNbOhvzYOOQo34+1KSJtHwML/OyDBXDV0oPz5TCf0ZKM+VQ7UyL71N4\r\nMcR67RmsvTV9qQYeqNsVVw/TI45NvoYbR29pNcK6T0zrzcS4P9hdumBeiV1D\r\nNyTzz+L8j+jrgW+Bn+G7Td7uL1C40UlyEMZey48dhtNGk+Mj0IBJ9NA4LP7s\r\nnvEd0mYVr/wg+iAiXfILmqkrsa/CKrLggHXI2vqicwP2n1CP2YYH2S6Pks7h\r\nfTvUoLYD2rtp/6aC9ZIxxrsgz++Wx3Rw5JKhIxN0ST7RwQm9XzkWSsErLJfs\r\nzKERZ8C0JWTnPxdkAyulbZJPwgkDxQ9uUC9iVuUS3D3nwFEAB5fNHz2Cj/4a\r\nKhVDTWqVE+XQX5D1Ri3ss/345yPMbtH4sgbjL02qbsAw+YTsTWiTM3SGdB73\r\nUVDYHA28LlxLzgODB0+78kLXJOr3/FB7yzpBBG79t8YmC2fjci7Kw0Et3WFF\r\n+OJJ6gMVGBCtKKUNnVSHEo/C44tRv/WglENvzTHIzRzGaQpp3wuEn4DTCueP\r\nWMH+GY4CG9ic20hlD/NpmT46wpMT5dYe8FiG9UtPqGZKwuMD2etMxs9DKv81\r\nnUC4KpLzKBj2Js95XYKN+qldl+eJ72Xq8ldh7rPvKVEw4Vz8egy8xKdodx16\r\nfh6sj5snzr8SkYmwNXLgSxI8+vaGTApRt8700F1ivOh0hXtQq1k3Lhtq6BYo\r\nP4B11yxuPYSqrTsmC2EtVZVaEVTWP5NcMk/83wnTTClUbHujWQHlDHnnnsHy\r\nuE7tGijdHp5ZCyWODem9hsImGQ9aifpv6W+0QYGuddMOeJ/hUWEn5D1utfUJ\r\n5tymtOiFPN3PivvgPSYXsi+Q04zFZgBmJDeVDUG2Xn/KEchq8enpBGSwSqCf\r\nI/qQpu6yAOn6f71cgjQ2hu5rMPbuxus/cOfXx6ybMIbDxmsL7rCjekuygPN+\r\n5nMOckg66OpHAa9wsbbuXCDeD+94aGBYVsAFWvh3SKCdHq6fvBrCDANzZLv2\r\nwJVvI8JscMnxUC8X9MubE9sHF0azIvjgrNOmlDDsm3CsEYUNru+0xGHR1P4P\r\nkvCOR4K5DAz/tTQkB928rc4qQjV/3lAVKLwcRa4OGQKnbx6CEyGVOdrwZoT2\r\nO2MiB/lj4+PQMZqu3wwa7PQ/bQkVrvfNWEOeXaoBdpAqPuefAxxIdGM4A98y\r\nddx1gaV3ZAXciD6kbyh6QbHcm3ZBkIV/cSKE6MMDC+8wOCVUuxYOuwt5IiJg\r\n3f5ImihYUPwjOQaGlJUXxEEn2T0yCdDoaciLRMj7/HB7Cmx91buYAys1D168\r\nD+81Zu14CGO0yRIKoW+z694iaKv3IbcEardJi5VBto/ralXw7BBXbCsMoJeb\r\nbCPW6ZCudgdMz/Mj6SbGd2kOHoCicz7uc3Bmq9GAZRH3kXT/I1ZIdnqWkn3x\r\nf+egJm5oeM1TVQSW7GaVUIFevO50jnAiST7baZE4D2xJuUCDmSRTDyhaVZcc\r\nQPyuy8Bxnfi99mtRHOyReKiaABsZVRySYc7AmdwsaOvzXLgSdo9GPK+C+uZG\r\nes+h8sFR9zrISr7rSTNMuPCf+ntIMZXz8QMMs/U49REutyssdMFzh7av9MCx\r\niveMffBT6kn5AahHvf/tEGy4+Nt8BJY6xgZ+h8I9J3ZOwSwd7vQZeFOs8sU8\r\n3JEVZrAEL+7WHViGSxGMnmvQY3lg8w8xvmtB/Ca0+eLLsw27DFXLSJcwzysK\r\nzR3Q5OXnt5TQsuaxPjV0qTxmRg89y/b1M8CAkkV7Zni1IMWVDd54cPYnB7yd\r\ne9CXG6Zn7VrZB3MzhkL4YWFa2ZbgEnH9RUSKwOrbZlRisD5BKF4Cvo1bY5Re\r\nIs4771Nl4derXrlKcOzyIaGDcDqMsUgVrgc+e6oJt89fUz4CKf1s6nUgvbf4\r\nYT2459y/ZgPI5dZpeAwKuuR1mUBxp/MWJ6DcKZ2v5lDFfu8pK6hlMz1uA03N\r\n4mdPQi/d/0jcifq0C6PPwTCtEBpvGKlheMuXqFOVm+U8TFKeT78A7yq+4Q4m\r\n6pRLvh8KH0m7iFyCZRIHSi4Tde6nlr0K3wk8UblG1LN35dhtOMPS0p0MFxnv\r\nWqVCElr105lwJ/XuySyiHspRj9wl4rp5On8fcpNEBzyER0t2fiyEvtY3RIqI\r\nvpXf+loKPU5naNYQ8zWW0X6AxtFf8xdgsKzD1hLMG/pmtQKXFb/TbMCMyXlf\r\n8t/Yv+lSqLPCcBqZ/1Qh8/rZ0xrw0fecWU3Y3bCb8igUCppXMoXt46XpzvD0\r\np0nBs3D1FU+FO+TNSHjvDc+bem8EQ456Sft4WFbkMnULaqdnBSRB7/N08WmQ\r\n/LQOewZMN7708B6UUHsmmwPf7J+tz4OWe4UM8uHMDoe+Asgy0j5XDN1SS/ZV\r\nw3+RE8U1MMmPS/klfGl007QBmqq8HWyEEyKbbu8gPblnRBt8sPCAruM3ca4e\r\nuNsJnV4YVvbCZz7i48PQk5ZFexQKPt7MHyfGHetwnYL6l6tbZiAJV47oLJHf\r\nwndmkejHkrXhMhxM0CpZhcniYnR/oEErk/dfSOry9+M/WEM6IU2yjPtU9dni\r\nDjj0OevETngnIOYpNSQrtbpAD18YaPYxQN8fogeY4TDvxvpemFI/ZsMBjWw/\r\n1HJB8rWnnPtgbfK9MD7oJxM9JABFO7w0hGEq5SEScXjsgchpSbhDk6FRGvqH\r\njEYqwP2sbRNKcKSyUucgNP4VuVMDUlz3dNOEdUIW7w/D843qYjpQ7JRwnC4c\r\n/Uv/Sx+mp68ZGUFTxZEnxnBndyv9cfjKu8LHDAbuyuiygBPa55JsYeao2W97\r\neCJczfwUbHhOx+oMg8xXA12h1OLwZzf4Pb5F+Ry8J1Z+1wuataRv+EAa5wg7\r\nf/iGxKMuAAZnneAOgq/fHvYPgZS/5FouEv1UYfa7Ass/97y9Dte2mthvQg3h\r\nKu+EZeK70R22ZMh8L8orBdo2BTSmwdwZ570Z8Aejhec9Is9BnTfZMMBRkTUP\r\nvrwmdO4BsU5lexoeQv0+ij2PYOK/FfciyGPUx1wGXc43u1XAkozq+qdQZTr1\r\nbA20jLF6+QZmPdFleEv0pfeASzMU3xSpbSXWRYBt94f/rT+Vcwck8V+v6YQJ\r\nDf1OvfC/H63P+yDX7he0X2CRw93qIdi8YUPzA9LxG5yahub6KlU/iX77ilHP\r\nwbE0jpMLxHq/pnm6RFxXkxs7V+Bzup/2a3BLYaDiD9Sx/0C5CW9GvrTbghzd\r\nmRTkK9jv+djb0MKpz6Sj9DBDs9CNEW4xLgWxwvLQtG02eGZc7RonbK26lsoL\r\nQ7kleQSgREz3QyF424r7mRi03ajsUYC0Z6ztDsBXH/6NHYQCWXpLGrCPYi5E\r\nC8Z6J5Nqw1+Hhhn0YfajyHTDFeL/2fbzGsNnY+elzWB4NLWxA5SZK/3vFByz\r\nNHdwgrqiOZ5nIcMHhTi/FWLf6dgaDVsyqw+XwntPaXPKoe8Hp7+VkO0vfdVz\r\n6GF7VugNpGdno+qFlqkhHX+gWGnn/k24/U4oZgs+WvmkQb6K85u5WDktzGYe\r\nSNoHvyeqWeusEu/3gQ1dqGQbmmUAYwVqxkygWLW8ly3syeje7QDDLvtVnoId\r\nemVrzjBQ0jjjLORhmlXzgC2rcd88oe+A2FUfyN7wXtAfNua7tQRAZu8C2lBY\r\nTcKfFgVPfW84eA1StZ0avA5tkrP4bq0S3/nV3t6GRfYDrnegmVYodRrcFGIv\r\nuQsf0tQY34PG85aL2TCn5o5SPjxsyPCmFM5Il52pgMksxpRVcGIozvAFjG8U\r\nm3tJ1Fn4PvEVHI5zk38Dr/nu7GuCMhYFwc2w/6AO53uifvJIx4+wPWVrph9e\r\nCM2KHyDqPaUmMwx9REMvjEM2Ona2Sdiw+Lx2Crr3WTr8hEwvV7Zn4f8BSDhK\r\nAw==\r\n                    \"] -> CompressedData[\"\r\n1:eJwk3Hc41e0fB3CzJCSRrUhkb9luJYREESJpKON7zskIqRRRZJZIFCmRURpW\r\n0lIhhYpHyshKtjSQpN/7XL+/nut1cc65x+e+v593zvVI72Vs82JjYWHhXMTC\r\nwvzvhDl3z2T7iFlrtlx59G4GuRreZ/AdVvsbumrKk0G2VVal/oRjdr6Ocd/L\r\nIOVKfja/YWOhQ25aXgxyQuBNOdvHETMS94Cl15dBNG1zl3PC2sNLfW0pBhmI\r\nPkYthhMtPFoqaAxi9VtZhgfewMqel3iIQeY0OY/zwVc8nJbN+TNIMdX1gR+e\r\neZgf6hXIIPw9CQlCcFGwrY1RMIPUiB4YEoY5W7NK80MYJGi7yUYxeHGoQ8F0\r\nKIPIJazMkoDLDs9uXXGEQdprJ2al4D2B2dNq8FmWuu3SMJ+/xRVb2Mgg+/Ya\r\n+CF9fKMPfPXW1v3rYCFfw3PX4G1f5Z8owjUH+9Y/gTmkWcRUYLpXbHcH7H3h\r\nTrMGXO/5QUkojEHEmmIUteEgj/D3GvCbxXuidWEZ97VH7GCNo8sNDeEzzoG1\r\nZ+CB0uFUY9jMSYyWC6dNPPtmCo9ve7biGWy1LsNmA5xp713VBc/tCcgzh4d+\r\ndRbVwcWZ1qyW8NQPqckHGI/HfzLum+G5KU/NYqxHjVXLcjuYZ2KgMhnrFxRZ\r\nRNkz5zcmNx95GOtVfapuGyw14m16OAjro6Z93BlWHxx76RqA+a9MHfKEHbt/\r\nvpehY/72tI374F2duiuFsJ/lsZuyvOADn0JdF2O/vZ9L/j4IM9qrLv9GPYj9\r\n/bXdFw5tm/886oP10G26TcGRrSZrur0ZJPxQ3hIG8+fsfUXnDjKIemH4fn/m\r\neFK3v0tAffX373gSCA+vfTkduw/rI6kmFgzfL9eVOL0H6+O8+HAovNPqplkk\r\n6re4oULxOHzDLy4+zA3zvSuSdho2uucg47edQc4r562JhauFy/sNHRikJF/r\r\nbhwsEi52g2crg4xcsXuTDP/c3C9/25pBuEQ7XVOY+1liORxuxSBrL/h8TYXf\r\nChUXbrVgEM+zUWyZsOmnfE1tM8yHUyD5CtzKzZ9vYMIgmSezJa/CKUah4maG\r\nDNIWXKV3Ax7MsuKw02EQm33f6CVwxf7h/w4qYP26j8/fhYPTHKzpcgxy2nXp\r\n2VJ4Sd2Dx0FrGOTpVrkbD5j1o3g2P0KSQXSN3Duew2MlEgf3LmcQGaF6y3aY\r\nI81uXv8XnZBkp/8+wSvf/5wonaKTXUv793bBscsye9Um6CSddeF4H/M8xH6t\r\nXfuVTngntErH4KPHT55b/pFOZmuzV7N+wvizpGYtquikOTTktwIsn+p1xf0o\r\nnfBdL3NThkN1D9zMCKETu8Yfj1RhnbYD99sD6aRJ+lCkFnxXyPuVI0Unbxq8\r\nlxrDzRd9f9nuopN6iZ2S9jDPub+joyZ0UvPUyCwYDmd55r6MjU7Kudhia2B3\r\nOTOK7yyNnH5k+fkFvPjHFNfJ0zTiFJCgUwfrP7t2YyqSRn52iPS9hoXdOT63\r\nHqURzRI1w//glnN1Dpk0GrnttGv8K2zzd8v6dQ40knet0oG3Y8SsoL0/OFGM\r\nRoKdF/KXwSO0Fjl5YRrZxGO+sBy+yvG87ckKGhk43Fy4ElZpcDPT5KURmc2D\r\n7Kvhy/RLuhdZaCRrckW5Jny0QlB6z1eK0HNdeXTg4VX7PQwGKGLsmr13PXwv\r\n9n7mil6KdNYoLjNifp7btpW1nygilmbmvQl+8TQzy6uZIheNGGIu8OKyDSyn\r\nHlDkvabv9Z0wT0OrfVw5RXgUvJR3wUY9B3JS7lMkUsjNZC9swR23IfcWRR4t\r\n3VG3H7ZZJZlSXEiRWVYH+4PwVu2S/tJ8imjN2nz0gRtl83v5bmC8ExZ7KbjE\r\nZU34q2sUKRgwG6XD5+OzxaKuUmTgk1GQPxz0VLzCJIsirnWap4PhVQqC3+5f\r\nooj5VanCk3DCb469WckUOZEmqnUKZqhELLgkUqQqXrA6Gt6252/GiniKqB/h\r\nbjoLC7/61RJzhiJ+DE7nBPj3vP+hjdEUyfNi6UmCO9UneBYiKdLj9sf7PJzr\r\n5VtQeZIi4tumpy7AsYKvlpMTFNlhNRV2EbZc4xT66zhFkk3G2DPgM5q93YXH\r\nKLJIqU8oG+a0/10kFEaR7+xN+gXw37MKFqNBFFGZq68pgqsvlRVfDaSI97fn\r\nNrfhIzfNVuwIoEh354Nd9+GZl649TxkUEW0pHSyDS1u/WATTKeL4qoRRCQf2\r\n+99SolEk8UnhbBVc9v3vil4/irwquxHxCE6vHXNt8qUIR/FV7qfw++tXm2tg\r\nk2uZKTUwf4Tjpgq4NPHcjTo40rBa/Sp89eDxV+9g7ztxiwPgjl2h21rhawmm\r\nxw/AKx0DO9rgT74/vu+E44nPeAdst9ateyNcp7s/uBs+zbbMUQ9mU9n9rwd+\r\n+rnmlTJstGZnTD+8UB1sKg2HiDotH4TXZyiWCcH3ltlnDMH6D1PnG+ExTps1\r\no/CGhOmDGhRF5Oc3FY/DbbudWy5g/nu/E51vsJ9mpcks1sfutbLrHPzwmOFY\r\nNNa76FB7+Txc0RGf/e4wRbhWRgn+g+8bdG+TDKFIjWdHM3vniFnx7MkHpUco\r\nsmrRGZVFcIHze4rlKEWOFWnGccE3ytestsX+6k7HWvDCWUG1p/vDKZKSqZO7\r\nDL7UImyghnr5RnpZBeDok1ORbyMosmUwfrcg/CVbJ+5EFEUK4/QerYQtnxxJ\r\nUUU9LtYYEBOFb3Y/yuyKpcj+tqRQcZh7gTU3HvW7Svqr1mp40vhs6cg5jKf2\r\n/DkZ2H5XU/WlCxT55GcyKQu3HBd4aXWRIhfKUwsV4LTqjP/yLlNkys2MSxme\r\n6ejucsrG+rCOe6nCrn9kBjlw/rhszaW1YHGDoum9OK9eU5PhOvBx18mF5TjP\r\nNWmZnevhrlCtxc+KMR4jSwMD2CQ9ZNmhEoyn9/tFI5hTdlPvjXsU+Xg665cJ\r\n/NWVTyEL94eusvV2M7gu6cOhtCqsT3AOnwUc88eH5UwN1kdiC2UF+2hoWZ2o\r\nxfo8m31lDdscnE8KacB68NhHb4V5WhJXeb+nSHvOwh8XOKnwvsnmPoo8feM2\r\n7Ac3pMWdK+OgEcmAxZZ0WOBRJaN8CY2ECd/PPcScb/+XLRV8NKK9l9vzMDyk\r\nRrgfiNDIzZnKtnDm+F/9jKxWppFzMitfnIPP7XBPMXOikZ1LQhwvwHJRlq/3\r\nu+E+/vZhIA12LtFkj9lDI/ceXeK8DD/gXBLYhPu/1UXSMg+2qijb5obnh3CS\r\nbEMVXHFwXvxUBY1c+aP5th8+e1JIJFCSTg70pXgOwplh9wOvrKET1Vc/vw3B\r\nu7YXcD9QoJPHaeXLJ+BujlS9bzp00qNhsH0WzqWoCx52dLLG26yNp2vErElf\r\n3NbwBJ2M2V07sAxOrz94WSyaTkp12GeWw4knfbqPn6UTc/aXwsJw+Ddqr3kq\r\nPj/LylUaPt8a6PuuEJ8fXTC8Bj4bf7hY+w6dzPhxh8nBmRYhExfL6CRG/02G\r\nEnyjMizA4ymdFLRu7dSBszMiwkb/oxM2i0pPPbh0TCpVp4NOdlas/mIAu/9i\r\nq77wmU64M6bGTWF1b/EI1iE6oXan/NsMazrYLu2YpZMXb/+csoWvnG2nLf9L\r\nJxIb9nNthRe/2P/WkpVBGmV1ljvCMXrHU0uXoL9Mu5K6g/n5gUtmR3jRHy1e\r\nJOYKL7mVulNagEFUR9pkPOCuVbdXJYqh33EzzfeELV0NIl9IMUj3m3ylfbAd\r\nrwJrhwz6HRP+O15wySPO0cq1DJJUEqrtDWsx+lrT1jHI0OreSl+4fPWTx0FK\r\nDELObzamwSLvMm9uU2WQb0FiFgHwRw2nY3za6B8HIxuCYP0+jQNjuuj/nUft\r\nQuCM83z2DfoM4mBQ7XwMPvGzbs1pUwYpLJLtDIfZ83J5929gEDbJBM8IeP+O\r\niBmzTQxy798un9OwbIXB67/oH7n9a8dj4NMHhcs6tjDI3j7VgDj4q/DPrAf2\r\nDFK1/eJ0Amz+bvKmMPrTFS//hSXDbKI7zx92ZBBK1/vfefip54ujLU4M8iL/\r\n7alU+Ee+qpeGM/rbsznxGbCrLrveuCv66z9Lll+B447TpG3Q/8rSAlKz4Ucv\r\nPnAXuDPIf1s3ZuXCt7cXd+1Hv6z6rEgmH6YyV9bVIO+d1hTML2DuV9/JO6uR\r\n93SFvpTchjn8nU517meQxNNbtO/CupVPKIMDDDI4U1Z5H/b9p7AjHf27iY+U\r\ncTl82eKC6TT6+4ufTj+rhMW6nv0IQP//zWZy00PYmHu9tBVs9ci54RHsv77Y\r\nThKezV7XUgN/OpdWUIfX2y8/5/wSXvZk6YfLcEHk7446Zj2OneQIgHd6NQy8\r\ngWMt/HZLwA8Vqek22PqPqZA/xqNrE731I2xy8NiazfAdv6ybHcz1bqnUkIYV\r\n4ytYu5m/b/rL9Dfmk1v8dmcPbF+kYfcOlmocvt8Hb313XGEWeeTSOBvvF/ia\r\n5T2bYKyHIJ/Ega/wr0eDtJ9Yr0RVnSfD8Ki2eHIA8gnXVjuRMbi/aOu9b1jv\r\nU4yD/hPM9ZOJaqV7MEjonUtrfjDra9m4iB/2a6/mwpl5WHDkcc4+7HfnNuHe\r\nBZh7z4/nvagP50B1A9Zu3D8f5Ad3b2OQ9ymbU9jhO1vcubpRT7ale8c44Zsv\r\nkhXdkWdqW49u4oKzDF/afkL9mf26kMUNT939TXexZZBqodszPHAVt46ZFupV\r\nV7fOfhlsNJjVFG2J9drRU7AcfvSMy73dnEGUQn6zCcLilwOGFVH/qyuVykTg\r\nOQcLjrdGqHeDZFEZuPLRuL6YJoNE7SwIkIX1LznXUWoM8i+s5rUcfDHwmeMT\r\nZQb5+fDncSU4WCGVsV+eQeidvB9U4BmOf/PlsgwyPC+nrg47ffY+uwTnf78k\r\nidWE7z94L+y+CveDsWufNqydanTjtgSDuHgEGK6H1YVNUsJEGaQlPO6CPiyi\r\nG6A/IMQg9U8eWZjAAYc/RVfw4byayRRZwrI/C6U8WBhEea8hhzWcKvj5Rd08\r\nneRHOu6yhU9orfDT+E0nl5+fXuYAtwccreD4TienN40G7oTjpmzsi/rpxHVz\r\nqREN1lTP8rn0nE5MiiLrGXD66JoGvid0Isvr4BgAr79RoBiFPPXt7bhfCHxY\r\npGyUfhf3t4t8ZgQ8ufCaZp6N/HMw43cqnMB18k3cETpZcfpk+WN4L5truaIy\r\n8tlXuw3P4J2GeyZd5emke7Nk03OYHuCzLlaGTgp5q77UM+fTcyTjqwidbEj9\r\nIdgCf6nOCM/lpJNDuQcCv8IbFRWKVHtopLHGVp3/84iZYf6P3NhLNPJfy+tk\r\nAfje+7+bmlNppGvAekoQVlxY/FXwPI2ML9p8TxQWdZJQuIp8xmuzSXsN/Jtt\r\n061y5K8tLcZ6uvC8Q2XUfQ/ktYHqdD34yF/O5PN4Xu/6ZfjbAP51c3umvwuN\r\n0IQNqkzhiX8Td9W20UiCm67RZrjr1trPRZtoJJUqu2wD73QNHDm7Ac/r49p/\r\nt8BtHM9++ZjSyK1szcfb4GY3d551+jRSdueulBNsvbhQeLEujTx6pn7CGa67\r\nNyMzqEkjL9+XfHaFN3psUn2phvn3qxJ3+MmSFP1c9Bv//bx11QMe5V4h/1UB\r\n8+dUYd0Dh1905fWTx/zllWq84Nw7gx8DZDB/St6cAU/2sQRGon8ROp6X6w9H\r\nMCxdF61E/5O4ljMIFpxPMD2LPKlyZ01tKGwgJM5zHv3Plp+rrCLhaEudGzno\r\nl5w4s29GwSKtR+PWsmG9VkotOQMXetb4F/xDPyh/xScWfiAtNFHxlyI0PYmG\r\nOLiH482Jrj8USTgmYpsKHz+XXxv4kyKNHMvtb8LlhR6OV7+gf7t6MbcQFojZ\r\nbdjcT5F5Q6nfxfCN/Z4yC8inFz7kbimB9c32LFHpoYhyoNK1u3BnyrdAz26K\r\nvOC7N30flp18GL+miyLuhXo25TDN+syNwQ7kj95NP6vgvyxSH6iPFJE9/sbq\r\nEWzhPjyp1k6RapHtV57ACRWlXD/akCe2elq8gKXoNgZHWili+zgsvREmHaFX\r\nopGHB1xZx5vhM7rm5VZN6G9/nTF7D789t6x5aSNFBM/xpbUy12v809em1xQp\r\nVk4daYP3WOWxnEe/al4vbvoRvnndX9TpFfL3vmspHfDUgpGmSD1Fgv6tG+qC\r\nx8q8ZNzrKLI0s8SoB/bpekwVov+9pqt7rg8e4BCpmH1JEYP31V8GmPup7M9q\r\nCfsuaUgchgPD1qT1P6dIQ8hAz3dYQzjmicQz5KEVfjq/mOMx6V3i95Qic7en\r\nYmfgJC8DxwdPKKI4uKA5z6yf+2NDTo/R30dEn1mAV3Vs0sp9RJGdkjydLD0j\r\nZlvYso9/r0Z+rTyvzg7j6VRH4FhH0WhO+Le9g0DSQ4qs/pb9cTFsfZuTdytc\r\nGSenyg0XqK77JA/by9+K5IG5S6zzWeChGq0PfLCvGi3oI/KAlYadggg8qj5z\r\n0wjuedN6XAy2uSsaLASHeru9l4CLNYw2TjygyM1s76PSPcy8F9GVDRPDyeY1\r\n8Jt71wtD4fa2w7JysJJWbYgDzMV3qlERHtNaKsAOXy1YIqPCfP9Slc8dlRTR\r\n25QcrMZ8f2374lL4bc/K1xpwHrekyizsfezKKm24a+Y22wG8nkVENkgXFvxC\r\n2lvg9PuF9Xqw7fv3t8ww3rqRCn9j+GzxtIsk5ttQ92PWFJZULom6ADflqp3c\r\nAH8uOnhnKdaz1SM/0RJeVNS+eA7+YNgvZA1fUjyn5Y/9+CSy6ootcz6Fm3cP\r\nwT3v04oc4O0FVeVt2L/+kveajvCXdYF9W7C/g/F8VTvg0JtKfC/hER9rM1fY\r\ncN2AvhHqYdzidL0brLO1I14S9fJtTc1WD/hUzKyGDfLYT5aFNk/YqkboQyjq\r\na67q8Bcv5vtr20u3ov7+XrxLeTNfT6fVsqJ+WQ6P//Blvj7/rJ8a6nuxmhfb\r\nIfii2MuyszgP3Dw5sQHM12/v21mJ88I33Ml/mLneCf/+fXmD83TdcVUY8/NY\r\nDKzNcP6ETybnHWO+Xt95kv6WImK73qicYL4+IOjC5XcUkTLgKouAi4rP6Tcg\r\nD0oLmxtFMevxy+3umRac/58nnp+GG/32NXb+R5F17x5ax8JD6ofXffhAEdU4\r\nLddEOP5Bevdr3B8a3oyeZOZ+HC/Ur8X9or2p6GAKrLWh+sLTzxQx/CcTnA5f\r\nff3Zugz3l1WgQMo1+G6XXEXWKEVs7O3EbsAc1/QELo0jX6uczcmHdxywpqVM\r\nUmQbd+26QjhAyb0+YYoiTl9Z7xTDLyZpa2J+UMTlhfH6Eti/SUPwzi/cbzlH\r\nHt+FRfNrLkbN4jy7Tb0ph5V3DGSpLOA+1lNxfACXqhyWYWOlEW8hn46HsDHn\r\norw2dhphNPcMP4XpZfK3TiD/Htv4dtFr+L6g38N3gjSSplRCPsMRqqeCk1Vo\r\npLoi83IvvO5ScdUfdRrp3Rgz2w+7s7UtHNCmEWX3PXeG4PVt684YG9JITfyK\r\n1d/h8eNNF0es8HwaD/nH0Yt8crHe4/1+GjG/Qx4rwjlnLAQd8mjE10hFTAXO\r\nPpj1z7uQRpLqRYPVYC1yetHP2zTyqee7ijb87xVbsGglxr/8xhVjOL/jj+P+\r\nBhrJCFhy3B7+yjIhMDdBI1Pa7w2D4YDI1N42AzqJZAtqCIUtArNlOAmdCLwV\r\ncj0KC+4t2Ke1iU60/VyDT8LVGx99SdpKJ6E5PXfOwoPusg/e7aOTBd7Jtdnw\r\nhqAjjbrxdJLUkVyaA98S5ji08RydrC7Q3JgLr3yYKGCfRidm5sGeBfC3f9ed\r\nfa7SSVTY34z7sFNOgyDffeTbr0v562Ge5j0DHh/oJLP0VlYDrFPmuDCEPKwc\r\nuVWlEfbItBQJ7KGTLZIp1u/hYS8V2zPDdJK8XSy6k/l50fvMD6MflJauXvEZ\r\nbpXpu74KefjexK5rvfCFp57sDegnW2JzngzC1+d21UhxMcjKp+vmvsFqh1xI\r\n/UoGyU9oiPkBT/J+yA5A/tVzo4Sn4dtFTv8kkH/r1/HlzcILlq0eddIM4jpd\r\nov0HfvRl22N/5N+R5w7P/8JHT72TlFBgkLBzPxxY+nCe4tKqy9FfL92d2sMG\r\nr4n33q2B/vuy8noGJ7wr3oCtWINBVOba/y6GL8Xz3JBDHn5cFxbPDbfEd1vm\r\nIA9/3vu4YBnsEB+ZkGbIIDKXNg2IwubxDSIRyLsbpiYOSMCWvDWrvyEv7Nuc\r\nPiwFb0x6sG438kRUjhklDRsvv6vehLyR+3tkYg1Mzt/UM0Y+eelwwV8ONhK8\r\nSoodkCcLjH+ug9enXbQSR/5dxPY1WAlOafw4MIk8JL8z+bcKzHGiTvTPDuTH\r\ne/rH1OHD6mV2i1wYxJu7f0ETPtp77dRy5OHCKh0OPeZ8zcPH5ZGvlMU7+DbA\r\n1kt0njkij20JjDpnDldXyUzvRv6lv1YRtISVKX4lP+S3xDUf0jbDmpILu4OR\r\n70qOnhS1hXObRi9E7GOQty0Kl+1gwZMfX8UjD35TapFygMU16hYuIi8ujzqW\r\nsx2O6yvVuo48qdm5VnYHPM/lv+4hvE27Oc8FrqpyS9wIB8aHKrgx15Oy+Pka\r\nry81eq3qCZ9rFn/KzN/rrxzS94V/ptY6L2A8Lr9Eqyk4wvLuo9Nw6JbnJgzm\r\nev/OXLMMrvorZB4Eu7j7T67CfD45PakNZo6Xz93pJub755b35iNwzhOLh+qw\r\nxCKBN0dhNX8N6QdYHyOPh3bh8KiMxBkzeFf5/ncn4VZeW5uzuxgknI/P8RSz\r\nfiI0ihOxvk8ee7rGwGM+87SLzqiPVYv2n4cb9M9P3cR+7w0pGbwAO98O2XYL\r\nefRUs4vPRVhSZtf9uzYM8uJEEf0y7M+97nAV6unLB8epLFgnnLftMeptkfpC\r\nYA78e+q77vONDCIXkz99HY450H6xzoxBLHvsj+TBWz49mn1tinrQm/tzEz7O\r\nfqPglTGDxCRfDy+CuQ7dX3/QgEEKhmxZb8P6Hc9ecqxnkAYyfeoO7Gvxdvs1\r\nLeTpnMzEKrjn15J4ETkGSbr560s1062K4d+QR9+XbDV+AnfftzlUjzzq8ph9\r\n7Dnc6Z/gGIr8mfly18Zapu1vW9ivZP57VkVGPfxJrVlv3Qqclw6/zY2wxiS/\r\nZDsPg+T1vbzazHSTxrI7SxhkaHjV7Dvm/G5vY41ZhPw9dWRrK3xk4Mb8OzbU\r\n62xLXht8Zhct6dwCndz9p7LQDqe2acs4zNHJz0UxTh3w9a3zpfzTdBImZMTR\r\nAz8xi/uUNE4njyTS3PrgxqpttK2431hkv90bgDu0xFiWfUG+1czdMwzPri1Y\r\nm9hJJ+e28jz5DrPy1B2Kf00nN2M7j3D243wFLl5Un0cno8m67xbDO/VzvR/l\r\n0IlqevI6btj1H3l97zKdlOaZf+CDnePCkq+cp5Mnz4u1ReDQG+NigeF00vb3\r\n2KQiXPzmtcspJzphD5D0sodX/i5VN1ugkXtVypPb4JnY+AznWRrxZDc64gS3\r\nmt0so3/H8/LCzoSdcPLdz6OXB2kkqOJi2X54yTk7l99NNDI4v3zREXibjbLG\r\nvWwaubBJOvkorMZuZfsKeXdDorpYONxww13W4gKNZK/aqnoKLndd6eQeSyMu\r\nG+J3JDD9PLY8JpBGXp1ZlJ8Df7p06EivJY2EvhXSyIUfBTSeo5BP5UTXPsyD\r\n6UWyJ9WNaSSycGNzERzFYxA4rUUjBo0nZ8rgu037XSOlaWRIKDmiEjY6Mbnt\r\niwT6AY/spQ/hOrUwWyvkyR+Tj1Y9hXmSkkz5ltFIscAfywbYZ2vV2ox55AM3\r\n7vdv4J//zFf9nUF/nSvq3gyfvNMs4ol+pnxs3eA7eP060eJw9D9eOnqHWmH3\r\ngw+i2cbQv7kcTu9mvr+3wdhy5Ls3V6NkeuFzNz+9TP1EkbDhlOJ+WGg4LFsU\r\n/Vpb2L2nQ7Ck78Nt0ugHk65MDn2HG32NHqijX/VMLbH8BVd8NWD/hn5YPYGR\r\nNwOzHNDfUoJ+myVajXMO3jyw/iKd2d8fm9w3z9zv/LBTCuXIA0ElNQvwPg4J\r\nLbFSivhTDGnWATyfPB/1cd+jiID7ZDcnnCzGsmHsFkX6tpcYc8GfQ3KmOoso\r\nct+GcZkb3tK6IaexgCKOhpOuy+ClidEsJTcokio22SoCe7EtfeJ/hSIHBEq0\r\nxJnv71FM35tJEV1uxnlJWKZ6i9T2SxSeR2pTq2CG6GTjxouY/++JrTLw4+Dk\r\n49qpFMmbun1bFk4vs85STqFIyDCdVx6u0Hjz1v48+tNeVUoB/nBrC/vhcxQR\r\n+TjRoARvV2zWuZSM/PX2toIq3Jxn7/0oiSIP6ukx6vCkzPuM3kTsb+XEJh04\r\nXvy/fwoJFMm8OPHUBJbm7XhVFUsRKun2KjPYNNZ9vjuGIkZn6OEb4WrOblV2\r\nmOeEatcmWC9y9x75M8i/wROGVnDpQk+KzWnkZfrtDGtY4+jeWkY0RY4foP+2\r\nhR1m+mdTotA/e6i6bIVfH1EwnTmFetkxUe4AW/TRjmrj5xNbbgs5wjXW9yr8\r\n4Seb6EE7YOf70z9uw546ExpusE/UCUoB758jOFG8H/aXO7dLCp8fwHN76UF4\r\nUdJ/l9zgDRx0Xx84cka0LR3u+zEuT4eP1l+zW4Hx3xu9dfoQPK3+9aw9fKqf\r\n9iWAuT6XlOoSYMcOFfPDzPVhO8T+GpZtGb8WAl/2LTXlwnr8bLjFGgazKjx9\r\nXAC/rKF5HoOfSYwva8F6plWpPAlnfj6/2J75s6iPe+OSEfALdst7a+Mpkn9u\r\nPP0ss77ezU03YP/6GvYqJsA3nFSkebHfUhztD5PgsE+7bbaiHtKCa7ovwGsH\r\nXmS3oF7el6w/dBH+4z3zSgj1xDtczJrBrIdxhZ/O6RSJcrsomw2fnE606syg\r\nyNMLPOU58I6jzwKkLlNkvjHCMhcWV05qKUP96i2eac9jrreiGv1pNkUCCeVb\r\nANfKN3O9zkFeWWt25/4A8/sIWwN/4TxkeZSblcNrpCZ5WYqRZy8qtVTCuyWS\r\nbnLfpogD98rpR8zzItLctQrnLX5j3JmnzPkIMUIVcR7rj7GIPofLVixboYPz\r\nSiZHDOthFf6tVtbI28fWeTY2wAf5JvsckZ8r9/zn0Qhf50k6vhv3wc8M62/N\r\nMKfQWhUW5F211icR72H5PxzSOci3Ug8u1HXCL9Oivsk2of6/L3H9PMDMN/sH\r\nXuK+SVM6MdILC3mZtx9AvuTN8uH9Cu/R5Hh6sx3rE2myfQpeaDyVpIx8+Ml2\r\nqJvzC/LwpQ/UzTmc/x7DaVXYle2/9njkLc/cyqMa8MOPviFfkbeUvXVYteGA\r\neywrNyBvvZhU5dGHP+9T3j5jQCPfF6RlNsL8L0417kHespPksnOG99ep/T6J\r\nvMW1s/XGCfheQXlNIZ43x1oop7cwnf/BkqZVdOJrkVHyHn7vxBJwfw2duDyo\r\nW/IfrJtp+Sldnk60smUef4SdZdsK96nRyYhvu1w/bKr3w+a3CZ24spnP/mKO\r\n58W92tUedKKrIZ4pPoj5xY97cOF5K5tr9UsS3qLv3z6YjfwlHLx1NWzkq+Ob\r\nd51Oxuffsq+FE4dCBBYK6SS3/jSlCj8dnN976wGdrPD8bmwGlw8s4uBBXmJp\r\nWZW+EV65Zl17xSc6mdi05fsmePG+zcX7uumkQelmnjV8pOF7YyD6h8iZXcsc\r\nYYnUNYePfqeTb4mveg7AV+Sjn59Fv7N5YzHNBxZavHZQgJ9Brs0kzvkxxzP4\r\ngisT/ZGjp6OgP3zyBoddEfLRA43PlkfhTWKGgWfRjwkMPms9Dg+aZeu5If9Q\r\nGbl7TsJXfdkXlJB/pNh9j0bDvQ9exzQi70S2/rydBO9xcc/iRz/YEfPB8DzM\r\nevLpvl70i9rGVfUXmK/Pl1W4t4FBEqYuO12EzZpjJiLRfw7eONF3ifl+02P3\r\nt1sxiOnOvYzLcISUwxFZ9K/pfJvms+ApTs0MN/S332vkY3PgbSaqRmrof21C\r\nuFfmwn8PK3azIe/kKo1fy4PzbsmdbNvGIAufm9UKYK5BGZlC5J87Vqmbb8O7\r\nnMQPOCDfCIqtPl4JL9LmmchGP05rYuN+CN/x40oORH9fG/kl7RHsep1D0xL5\r\nZNX6+jVPYY4OllYx5InQ0cI7NXCJwN/DE8gb77ITjF8yf9/6t3CNN4MoOh5q\r\nqIOHwx5YRPgiv3Ftd26ALTmmbcX8GKSrWmfgDeyboLn9PqzrL+LfDMevZLgy\r\nv++ZvPbP33fwSHbR7i/whsSnwh9gtXuylDAd/e1uG5teuKJtZfTRQwzyb4Vq\r\nez/8aff2OEF/9M/1/F6D8PxQ0rlb8L1jP6aG4J0Bby5aBCDParSFj8LH/3Bl\r\nfYb3f6lcOgFnR23KDQ1Efr2Umf6Nub68kYXLgxhE2C587Q/48KLWtZP4+SG2\r\nPfd+wTHd6lnS8Kvyjaaz8KXyhJWOeD8ZP7k3c3BR4kjiaXx+a8vol39ws0nu\r\niVEGg+jfCBbl/or7NEt4TxnmV8rFfZQHzrd6cfQX1kOdutLJB+t8P5SmAxc1\r\nq5ssh1delrx7GOspp/UiewU8vanhdZkP6j3NmXUlHDUZPPgL6y85N7JXBPa6\r\ntIZVF07fFf5CDDbf+FY8+CD2/9lyOUk4MaXq2VLsX5LsjTOr4O1pHdEj2G/u\r\nGL1haVj80vzmV6gH1q27i+XgF1dM3p9GXpvoLNZUh//k1/SxIk/7EnJBE+4q\r\n6M/rQf19ud7ySxu+Xszh98SeQTp95yr14S13LX4cQ353bkoQM4IFSw9WuCHf\r\nv9eQPmYCd5THHDXAebBLLe0icHVlgamoBdZ31tJ0I3zqYQP7LPKauXvH1U2w\r\n9ePRujbktadP6GxW8JL6/OhiEwYxXMO23xr+9oR/Qt2QQcpPp760hdsqjuwo\r\nQz7LFey32cF8vwuSs7U476tCg2+5wL7xpz1tcB9kdCxZ5gbbR03WNyOfnbum\r\n/n43nBfw7FK7OIPwLHqhtRdO8FVk2yWCPOjjnLof/uuZ4tsriDyrHu7iA7+y\r\n9zJkfl9hLmV5lR9sYNl0nc7NIIdncsXp8GrT9Tw/kMeox6+7A+BbNwN9S5G/\r\nvkrvJofhi/cqdrIgf+2N/p4TAp+s/mNt+wv3ta2o1zHYremU0sAonbSWFNeG\r\nM/e3vU5c/Sud2K8g6yKY9dOzlOdYH51YfDowGg1z/UwZW/GRTrS9S/2TmOsr\r\nnHtrYy2d8EVtDb/GrL9ofn/PK3QiGjDSkgvTuiW2N13E/e8ZrZAPa69X0DFC\r\n3jI0ethaBO8aNPstfIZOvH/KKZXByy0DI5oP0UnN/oUPdfCn+W/ztI100rjt\r\nkkoDfOfS5FETYzppJ9qn3sDRuhNzfOvpZFLCV/UdHEcbnS1RpBOJ//6L+gQb\r\ndn/5ObWcTuSfH/rUCfMfHQisWUonmneXqn+GB4X7v5/npJPNCWYd/fCIXc83\r\nrd804ni0U30QfjbazeD4geexT8jpIWY9RHdNtI7RiJ+zQOcI/FKmk3YD+S54\r\n0y2NcTjzyaexwz008jekd2qCOZ5KUdv3HTTCFvp/iyfZrGM6QsvqzCS8detL\r\nJcNPNBIv3d85BZvJF+t/bqGR9GXhmj/hY/PnLU810sj1vyIx0zCj9YiTfB2N\r\n3B693zUL7yn23Pf6KY1UfbTT+gNfjrD0Z1TRyNuyqO5/cISGUELFLRrpuL5K\r\nm21oxCxoyXyGWz7y57mqWA74YG/fzX9XMV7aN+0l8IXEOy8skTcV5dzjBOD8\r\nUZv5D2E0oiM40yMIZzzX5D4WRCOE7byuMJyQKSqymk4jzt11veKwasb5yNd7\r\naCQqTUtvLXw+JE+geDONdC1a+mU9PKHdpEkTxfrqutEMmL/PPbqjT4BGGryK\r\nfhnBrH2Ljzrz0EjlC5tFG+DweLPnZv8ocj4yXt4W7vIO/WQ0hDx5r7PEDvbs\r\nbVxI76PIiV5lPQf4pvOaNb86kT9Io9UOOMCiye/WO4pYLPD6esJLZGX/Mv/e\r\nUq3i8X0vfPbyEemwMopo7bod5gW3CDRvaiuhSGH8Aps3LB4r66tZSJHV1XZx\r\nvnAWa1hiYi76vdGsFTRYOqz53kgW+j3xyUwGHKiXsM0P/fHckaTiIPhNLtff\r\nXuSrQwWftUOGmH8Ptth2BXnpa7vaoyOw7PKofBf0963r3zaGw8eP/3NoPkmR\r\nkl/8kzHM+TtO51UzKCK3dk9IHHN8S7TnQ/woctnx7r8EuO2pv4PWQYqsiGKN\r\nSYaVg0vyJvZS5Ox9B/4U+KTS+J8CD+Tb/pz0VPhUn6KD107kQYHvq9Ph3yn2\r\nBtQO5CWzDQUZcJPT0T0ft1Nkv/95jSvM/RfJi7FwQL96te9BNhzR8bbkvh36\r\n8beaG67BLlf+tK22pYiJWsu2fJhLxmHtHwvkyfEVQXeZ9aU0/6zEiCKJEvvn\r\n78NmE3LDEgYU4bQtjSqHhe848J9dj/78KAfvA3jM/9j6GW2KfC90TH0I12rn\r\ne+zXpIj3p1zJx/DVmXfR79Qo8nnJrxtP4eAH88UmKhTZob9J9TnMN5MzcVmJ\r\nIm+8U8tfwgv8L+53KSK/pX8xqWe+v+JgqBT8oE6nrgFOMucy2a2AvCzX9qGZ\r\nuZ+htvU98hSJGFj5+yNzfbpbO/tlKSL2XHhHJ3P+L3Z4a8D3ckTud8NOhe0/\r\nwtdQxOakKH8vsz6Tdp54I0ORAQ8xWj+8/3Antxh83Fi84Qs8utMj7aA0RVZK\r\nSMgPMeuF9EiXrcZ+z0lEjcB/1u69xQZbfZTsHYPlz21P6F1Fkd4KKZNJWOX+\r\nocQW/DwsbVXmFKz1X0LSS7xf0XZpp2n4o0j9uQKMh69J9tU/Zn1fNUrzx3zy\r\ni9fKsQ2PmCXXuF7ctw75KE7uFAecNhCc7oT5+1utM14CG627m6GP9eOWV8hY\r\nCm+0bspUUqbINU7FGV6412/0siTW23BA0ZEf/prAlbVMFfVbo3RXAB4vWZvN\r\niv2h5SjzCcE/3m24+gNedFLFTxh25d1w6ZIGM++p1ovC4q/7Yme0KLLeWG2t\r\nBNwdeyrMSZcib8XVI6Xga1ayfvf1sP9z6p9Xw/sXvXRbbkiRjArNS2vhkVOL\r\njBtNcX7TtKbl4Vsb8lWUNmD/g7S3K8KHWK2kYs0p8ldDl1cN/nU89p/5Zpxf\r\n/vW+GnClkeK3azYUUZ1cX6cFH51r6GFBfXsW60fowayhPDXV2yjy+6xBtwH8\r\nQvfWPTEn3Ec+hobG8JlfW66HOlNE0coo3RTefH8ipc2VIs/ljH+ZwUUUjWXY\r\nnSLunCbbzJnjZ2sP3e2JvNlvUmIB56ZtmPpvH853DvGxgYVqhPuY379+csKs\r\ndgvc5By5U59OERePDWvs4dPjY+9L/CkSK27e5QifEK55fjmUImOplg4ezPWg\r\nqBvBp1GfZ+30/eGXjXn2Orivygs5XgXCHlwBvM9uUqSqocolGJ7dYNxge4si\r\nNdzyoUdhpcqWjfuRn1vO/iuPhp1zWdan1GO8Z+9oZwwz+10hlf/GKaITJ6D+\r\nHL7oF+QRa4z7Oq5NTmgEeeuhx4fKbhqx1b1QKAyn6qlVH+inkZ4eB1Ux+G7Z\r\nv6uCQ8ijuo06q+Dhkqu+h6ZoxKXnubkC7JLb91eeg05mte/uNYZ1Ew7IXlSg\r\nE73uuCwvuEhGfP4Ig07exGyW8YbPXzgT8SqQTjy1Fuf5wgcfTOe+CqGTmJjI\r\nWwxYgP2/0Vcn0C9oHqk+AnunnTvSkEQnoWcOfEqAhR5xp74uoZNKdbOV5XDx\r\nsS2vxobphH62hF4Jb3aa3W0xjv5lQLKuCv6icn06+xudnLs4F/IE3mOX9bFs\r\nGvl54f7HetguT6BnLxuDiL+Ru9IBjzn+GasWRX+6NvVXF9zul656UwL93gl2\r\nux74VITOoZRVDPJTs2dhAO4oZvzwWcsgby5d8pyAu+78eOeshn7wII8s6yju\r\nA/31Z3KQB7WfhR1jhycLPj/iRh4cERtu5YTLxWJ+Bloy++OX0dzwlr/teyzQ\r\nL/Ot0+7mgSUYEekldgzyIuKa7jJ44LNCswjyX1gHf9JyeNvXvaP625EfdE58\r\nXQELiRj5saM/H0wcN10Jt1sJjb7ZwSCXh9zSReBLRyZ805AHuS7rbZYcZX4/\r\n5KqvgjuD9LJ9L5SDx7I4fbciD6S7e7IrwAFvu4dFkP/sypvclGAt1kqfPuSH\r\nKp8iHnW4aq+vDzOfHHou6qUJH03ZOGyCfCMnGfNIGzZ5IeHDhfzWGTwttB5m\r\n/fVr6B3y0Pm3++n68PO1zd6ZyEtWii21hvDPHOMCLuSrhVNmq0zgjqi2yKXI\r\nY6VdJSEEfnGQ4c53mEH81ku93QCL2XDpLg9GPsj6oGHLXO8PfpclwhjkgP6f\r\najvm+vRv36ZzlEHOtEpZOcD8k4ZcdscYpIH7gMcOeG4RT9CJcAYZuxE77AKv\r\nXfFTIf0Eg/Ca3Qpyg/ulOj/fOckg9iE/z3rCb3SLbfoiGSRAQGTlPnhmwwXW\r\nP6cYJOWWYY4XXFm5bPJlFMZrtVvZG76sNRbbDrf1R1b4wmdu18uOwrPheRto\r\ncJDCjSd/YVGxhkbGKPM8Rezkj2YQd/vlA0GwQoZBsg4cPqrNCGHur5CwkhWc\r\nfdpl7ghz/Ek/Xu6E+6qz+U/ADdHFf07AHC7PMyPgCpbYtPMwwqxcFJx51Evj\r\nBuytoGocC1P+Ugcb4LMvHOrjYOexOdYuuGj34e2JsPHBD5cn4Tdz6d3J8IT7\r\n63kFeCK12icFvnWy2JAH4+fX6PmZCjNyE8ImsD4ab9hPpsNX6+kP3kYwSBCb\r\nTdoV+By/xvpUrG/aFbr0VXi7tkBwCNa/Qu988TU4yuVHqetx5Cf6x5p8+PDV\r\nMk0p7J8E998thfD6F2n+LNhf4xurPxbD3kMhd/pCGeRkx8HJu7CruoFqPurh\r\nWnBcWCks7ihOi0W9PF9ewlkB24bOF/mhngaK3yc/gB02CCXIot4WWU2LV8Mk\r\n6H3Mg0MMsq5fNP8xrJqXFGWH+t0cbqz5DF720fZkP/J5fGmUVS3cY1wXwot8\r\nfXvrzZZ6uJkRFXhtP4M0j7z2eA3fuWbGWL+XQQSkVxx+C0csrj6wB3lau1qX\r\npQU+pH9k7/ROBnFy3hn3H3M8lK5HHM5nekJOzidY5t0dpzKc76p1L5W7mPXL\r\nTnewxvnveD5U8Rme0lHa8hn3w7wHz8Y+uNV7yCoI94fUnFrTAJx7+6aww2YG\r\nIanbXb/C9OvHspJw/+xVDxkYhvXS7dc2IU/fOPB4bgK2ODWraWPAIEN3zu+c\r\ngs/r7bz1SpdBlP8cqPoB7x97KG+lhfpOWhY2C3M6npDYpMwgNZWev1nHRsxM\r\n5RYtMpXCerLruHLAyz8dPPlIjEGstyx5sAjuS3g1ZyjMIIkXu0SWwKVmSoer\r\nVjDIu967oUvhf9Pxk3r8DCKofLqdF36bPDOWwcMgLsE79fjh1lONfF8XM0gP\r\nN/usINztc2TbCeRnWacPzsJwv/vWoNe/kU+ziypE4a9b16YJIz9PajmGSMGj\r\n6999LEF+XnC/MS0Pz3Iq7OlpR/4ssfxlAPturLPuvovn029xJ2OYLWLWTaqY\r\nTnI3fis1hS89VqB55NGJUnt6kDmsbRSf1J1BJwasIz+2wH+1HVq7T9GJy/b4\r\n755wslzHrs9OdJIy83byNBzSHDB2c5xGDrwp3hgLv7vy4wv5SiMGOTEX42A/\r\nn6DP7cijfdbENBlmKXp1wRX5Uj2rJPES8/1HnC7IV9LIG/NElWJ4xpee8jyC\r\nRhadt/F7B6eKJjwQWUkjnw7IP2mBdfIMX+xfRiO3DNlXtMFlOiNNd7iQ575U\r\nVX2C2xwsB6z+UOS6niL3APz73d1dAb3oNz9zFUzDkcHmT5fcpYhg6cD8LCzW\r\nkFY8j3z1Neap/R/YZvVw+iT6lUTN0Nl/sFBDgv9/6RTZu9jRlm0cz2fJnl31\r\n5ymi26l2lQM299e0fhhPka7or5ZLYB7xDzI5yE93dj7PXAqvW7PuMOdRikSp\r\nZU/ywu3lx9qVgimi/HHHRYFx5r8PrM0OpdBPK9cOisOKGqHKAujfHmxwpknB\r\ne1ptBpuQh2Zdhn6shtNDVl2NQ38YHM3NKgdzPa5dwYn+siwz88w62HRPRuMz\r\nE/RLd5X5lOBgDvqZcH2KBHTbiavDg9ZCf2bQL9/9+TlHE5acGCotRf/9jdt/\r\nnQ58IPd6+iXkCzVptpL1cMLBDl8Z9Pf09Sk6BnCZ4grjIkmK3NoiW20Ed4xb\r\nL9MWQ/+3r2yDKcx2N7K3eiVFfJI/bDWH7+h9j25aRpGbed5tFnDbHwUXZx6K\r\nDFb/dt8M73q6R7GHC3lvWNzXDi6yeNc0xYr9+1f8zX6cmTeX5IQt+JE+IZOQ\r\n7fDvNySQ/Y8f8dzgGeUCW22/Iyz0049ku0xxu8H0lUPDV775kW565LldcNrH\r\nVdVy435EMnqFiCcskhSaFj7iR9wzc7P2wpserGJZM+xHMu/qrPWCA/prfeq+\r\n+pFPdbVFB+GrvPQWv0E/4vJzqJKC/+ypzivt9yMXucNMGcz9jd/H79rnR9pW\r\nL631h3eUc4f97fEjjltUWoLhu9yuWyy6/UjKvseuR+BubZaKkU4/8v7I1p6j\r\nzHrZnb86qcOP2Of5j5+ED97/9eNDux9JqmYLOgVf6Lq869gHP9L0PmUuGq5Z\r\nbF63us2P8A7LRsTAkxqj6i9b/Yjtv7LFcbDoUy3DQThOyDIxAf4kv8yp6j8/\r\n0qDULpgMZySN0BPxeiuXOelUWGx3zjVdfN4ZetzNi8z9rD1Wzf3Rj9RGSahl\r\nwJdVXdq6YfO7JkbZsMQCH/cZjPdUXXNNDtzpNbLGDfOp6fLcnAtfaXxprNbl\r\nRwj3qR0FzPq6csz/A+Z/YrVgVxFz/hwucUWf/chj3Rv7bsNZlNaNE1ivv7a6\r\nI3eY9dDK92R7rx8x2ld36D4sZTTSLo/1PXrEZaYMllU3jZ0e8CNVScPHK2Fe\r\nY81D77Bf66uXxj2CHzqJmJzBfqdHbBl8wtzP4Tg1DdTDnEWSWQ1sHf5vdcd3\r\nP1L9TmC2Fi6/MciuNovxfhX1egsn/yx91cZGkZxit6fvYcuYdQ9PclKELeCK\r\n+H/wX/HLxYrMel3/OfgD/N+dZVmt3BR5Ob/6/Uc43vxUUjgv8lTNXpVOeEP7\r\n9Ml1/BSJOZMb08087++fbtizgiLDtoP9PfDiFN7edGGKWAusM+1n1vv2nSfe\r\niiNPf/DJ+MJcH8F8SS7kbZ4rRb++wr7//XhoivPZJK9WPAazOifM3kY+3m6s\r\nKzoNz7k99U8wpkgpW2jQLFwrwcv/0gx5v/5B8xzs9tn19vwmirRvMz79D/7h\r\n+WPED/eJvsiJXtaJEbPH0iT2OvJmRtdTIw74bF+8fMcO5Edv8x9ccLdIlGrD\r\nboo8UjlttxQ+7evVIepFEakfdQW8sHq1RYwP8mPPcRtPAfjU7iV9XIcp4pWy\r\nrVEc9ruZmGp5FvfJY898VXh2/aX5F6UUOSl43M0R5l86L0YJIL+JBw3vgNf8\r\nFDncIkIjojJ+Ia5w5WedZoNVNHJPzTXFAx5Tv+6irEwjA9Y6r73hpmU1jXst\r\naMQqYtzgOJzc+K+iOYxGlk3sEsuDX8bMO2bgedT50/HmTThsE8/zoUEaufnH\r\nRrcILvsnrrEezzOyxGDbHVg1yJC39TeNBMiuPFsFr7qfq8+5nE7adjb9boJT\r\njl0vsjSlk6w6k48zsKvtrX0jKXSScHzQcA5ekf21szCdTo5pJWbNw2+mpHf4\r\nXaET1+yufayTI2ZmqWlWY3j+CoYcm+CG7X4HikpV0kmsXBW7FHyFI6TLFs/z\r\n0M49B1bDBQdmyrZ10smB80teycCL6kISXXroxHzBJVEelowLNd0/hH7gvxkR\r\nDfjOUuHMnhk6GY/LPqoF767Ib5f9QyedZpbdOjDPPr2VPug3HtxKu24AL3ng\r\nem6KA/1ttI6qOfP3D1w+wyaA/sqwK9kCLuFXeWkhxCAOU1E/rGD36kdscSIM\r\norqrtXIL7Crw+fgK5EnJFcfE7Znje8x46CzDIDyv1oRvg8t8WH5nIl8Oawdu\r\ndIbvPpEOkkW/1T4ilucKmxYFFW5D3qy9WsPlDo+mLl/8QYNBcnkEmjzhXTSb\r\np5/Rv3kM3HHxheXEnmhOEQbZkuHykII/c7onHd7IIEb2LFIMOGNqdvQ3+kPR\r\n6q39gfBCneYNNhvkxYCZTcFwxf1m1jNbGGRaPvtmKLwvi/JYas8grSkTtOPw\r\nf4fzhAWRP2s2p709AUd4bgxKd2aQu/+MtSJhA9uetxLod6+WfUmNghMcdRc5\r\nIH8m+iXMnoavsvSEi3kwyHFpHbdYOPBW7Ez/bgahPnQ+ioMtdmodurWH+fdf\r\n5VPJsPL903sI8mn9qY6P5+EZp6A+FvTjFi/OqqfC7LN79j3zRj7cNNx1iTk/\r\nY2OvDcinNdHp2pfhvM+Kg2zo781qLeOyJpnfPxY5+Bz51MQyT+86bF33w9sc\r\n+aD6jFPSDdjJp3eYA3nCsJ5jMB+W5mn2fYm8UcVValQIj92uHo1GHtHbvC+l\r\nmDke+0LKIoz5/zsRGLkNTyubvihGntFpeEbuwoa5b1UqkUc1bVZPlMGO53+w\r\nNCMP3YlrNq+E5ZdE+35CXlJ7E55ZBdNOrmz9gjyqvKXL6gkcTdfPn0fektua\r\ncb2euT/WJ7YonsH+J22ea4Bjn/FX6MQwyJq3s/aNcLPetdVmschH/Dfzm2HB\r\nO1pnbc8yyGoH54V38JDcyx/OcciX5xY5tcIqWTt27YtHnnhfVtTGXB+hoVp6\r\nAoNcFvBi+whzH5C5JJvIIOLbBV07mO9/6PHGw3BGyvOSLjj16M6Jl7BIa8Ci\r\nHljv9HT6yiQGWen07v4A/CJTdaIC5ndO5JuAL9Rmpc8lM/OBsdc35u+/M9ho\r\ncw55vH3s4Xf4b0fbeCbM7WrjMwN7TfFtND7PIDGX5p78hrnmC8cT4MWfClbO\r\nw02LLNO74dNirrQF5vsv79+gloJ87Mb1guXbiJmuxInxE3BkZoUYO6zcxMF/\r\nDGbtPODPCb8zOdPDBp+UWFm/GD5csuRuLN5vwf2lFDdstzo+gh8+diXoMA8s\r\nd45v20WM70/Xmjd88BvWczJS8KxH5JEVsHV/6nMlzC84W+OtECzjKHLhHub/\r\n63OPnAhc+yJjvz783dO0VQI2z8vmtMT6+edMKK6Ch1bKtDVi/b/1XomQhhPP\r\n5OY5wuN751XlYG6fAsu92K+2Ac/KdXBvfmRrN/bz6YGXZkpw1KDbHje4cEjh\r\ntQrcNnWFYY39v+Cb6KgO7xNZk9eKegkf+96lCX8zudnpgXrypjsf1IHDvVRW\r\nDCP/GwWsDjOAL91bf/Ivs/5+RrEbw/Ifq8vPIO/zBw/Hm35jPh/MxpejXgeO\r\n3Ms2h9/a2u6UQ76PjzB/aQcv+uqpvTUE68FeYOcAp/IO+n7E+fKM5m3fzlwf\r\nbb+cfcjr1osD9uyA7+z89mE8APk5tm3EBT6t87U/DHldaqlhkNs3Zn/0lfGH\r\nhvsqIfvvLrji+tc/R5HXO5K9+ffBgwJDK44fYJAXAo2XvOA566Hsv/uQ3y9o\r\nrPGGBSOHlMJxv0Smz+nQYMtvQxtP4H5SvBrvFgIXvRkOjNiGfCozNXDkG/P7\r\nXCP/WHH/LVx3oh+Duw1G4iJxPw6trZoJh6f9R4TZcX++z5eKiID74vhkFaxw\r\nnyic4o5izu9jUH6yOYPkFX1NOQ3vketQnMX9fKTkTl4cs15q8jXq9PE80RBS\r\nT4R/8fOVqeI+t71/5EEyrOURpJemifNbseFNKnxvlph6KeE+fNw6lQ3fVvlk\r\nyy7JIPeI/tFr8HgYeesrivNbc4XjBrPe6/O2v8fz6bQ5W2I+TAnxftDH8+tQ\r\n7QHhQuZ89wbuzOFjkJ1Wr68Ww6FOyb83ceM+bVBTLGGO54T2sRROnO+mWaNS\r\neKr1WITqPJ0c7JKIqYerFLPSMtroJIhPc7ABbvRstNF7TycnTS3NG+GH6fMs\r\nbY10kp7jz/Ievsjl5rf8JZ3Ue9WGdjDXv29byMQdOlk3wfCZYJ6/WP9C5dN0\r\nMrJQYy04hTzxfjvbaQU6mVZrv7kSfqlvst5zDZ2w7RlfJArvyVlHGUjSmX8P\r\nei4JXzr0978JfjqxOUMZysMBPPkFzO8DFy9bqWwA69nOxu17TiO01T68nvA3\r\nke0VT53RL53XytoLX9g0tsvdnkbcORdUveAdjGiOWSsasR45b+87xfz3rgoH\r\nNQMaWVdanRIE0w9LjF2RwOst+cViYTlOiVi9fvSHVZ8K42D9kjxv/U6KtCjf\r\nMEyEudw1rAz+o0jNcoNdKfDIPYvFRnUUye7Yd/UK7L3PP9q0iCI7GRVy9+Di\r\nQ3U6G0Mo8r43oqIUbqn14rXwp8hmR1urCnjrKo4vVn4U0dPv9amGvzeSC3bo\r\nR1eyL71Vy5yvUtV3V0vk98P/Gb+CPSJcGtzR/3IOZTe9hjs+TufsNqTIsZ2+\r\nu5tgZ83UI3t1kJffaH97Cx+P0XLwUqOIn+m/ky3w16ltHfqKFOm7+2p5G3O+\r\nG6P3/beWIu/SPLQ6mJ/fPxzIgzxstUThRResqSMxny9CkadHfzj2wNVRdlEb\r\nBSly2zMm+AtsLH//QthS5IOWbYuH4PrgLxIrF1PkyibJ9JEp5vc/hG/cRf6I\r\nV7z3YJI5f+9jZUO//QjHlWPW35nzqbxtHPULeWiZZcdP+MqS3perpvzI94jl\r\n1AzcvXOF3cMxP+L7s2P+N+xTuKltxxDy84G8hHmY7T/J5cLIT64fD0n9gzmV\r\nhC7WIG+9tTEsYf2Oz4/gkaQjn1k95iQcsGwb+3VR5LmtDz+8WARfzVnE9faT\r\nH9lRWbB5CSxOW0I7jfzodW/Ldj54Hfuy9T9a/AhVsqqdH77etPxywTs/ElQ8\r\n5b4C1r0kyOrZ7Eci81IPiMDK6mKv3zT4kbPXD46KwU/mJNRP1fuRc1f1D0nC\r\nhrWrUvVrkeeuLP21Ci4/JzM3+dyPXM3oOiIDW7mv3Z33zI/kXyxZkIWfy697\r\n4f7ED/dfxCl5eP3/KrjzcKq2MAzgQkTGRiQRypBQkeJq1Y1uSK4xUySKzjn7\r\nEJlut0kooqIyRCQRV4YMkRSSmaKQDJkyz0Wl6b77z99zDvZe61trfe/jnM0/\r\nnzhVwiAF182WKMEZb7VbJ+CScPmwTfD6hPNLx+GK0C+iqnCUWxUZhesv1dxS\r\nhwW3CXoPw+8vsBI14W/V0T0DcN/ZXfI7YFZk98p+eOS0aLo2PGAvZ9gLf/XO\r\nzyXwq9ms/C74t2ew1p/w3pK50Q6Yx8O6RA9+Eqwt/R4WopT3/AWrmp63eAev\r\nZPysNIBTJKtCWmFJ11eGB2DJIYHSt7Ccy93XB+HrOaZzzbCyk6eFKaw29Pex\r\n3bj/LQ56783hHvlfOpcxPjvtVjtYwX4u6cubMH67rUf6rWHFZMtRMYyviVnY\r\nxGHYY31W1APMB2tfC4cbLCHlOFuF+fTamxrIgOvsBGqEWxnk9G4/fgp2iitM\r\nsML8B+gaXnWHl3U4eyegPkK0167wpOdDXPTAUCeDRGhNRZ+Cba1LZFVRXzEa\r\nZWt9YYFotwVv1F/ilsgkf/hp68qmZ/0M8kDVZeO/sNuc+kAz8n3Wpu0ZZ+HD\r\nnIUV8qjvAkU+9QuwubDufV/k+5eyD3cGw/NKBseksF76Vs8duA5fdHQadkM+\r\nH11R1RwJq7OHq58KMcmMaIzVLXjjaSpNGHmcQ+CPI7fhmij/E/nI37x8woPx\r\n8LNkDkM6fwvx9J5IhPNygpRt5ej9JncqCT5SKiCQqcAkazkCve7DEUFpOpoq\r\nTKKfwduYCo8VrlB7soVJ3A+FbEyH4ybOyupqMUlF9tX3mTCHlSW//p9McuJI\r\nLCmEV8lzvbOwZpKC8iyBOnhXmZ3nqUAmMQ58nzwNL900M/V7lEl81e1/zcJn\r\nsqfrPGeY5G7XB6s5+v62TKcOfcF+pvGRfwFOn/owPsDNIrGDU+5cn7C+V8k+\r\nVJRmkcF9i/9YBb90SlPJtWSRM/xqLdrwfqHjI7rlLLL86/Ejup/ozw8wp/xq\r\nkI8/JkwQ+EKnx1zeaxZpLhXm0YefpJ9epPyBReR9pjRNPtH95+a00O8sUt+f\r\nGe0Ml5z7KnZfjSJHmgbljsOJDTP6f23H+fZMKscNDpQY8xr7gyLSseE1FGyc\r\n1/Va3ZAinibUgi+cNWmrznLBeVeiYhcGD97n1PBCvs5Kdxm+Cq/812elRgzy\r\nb3S8VwS813x8bu4ORShPwbAo+B5na4FPOkW4juiJx8JN7QZRWjh/o43/vR8H\r\nc+Q89/mWT5FNOvnqCfBk4LZDT4opUqY4UXIXXmufpvVPGUUsV8sbJMPV+T+b\r\nnCtxXnPbt6bA86GHa8XqkN976if/gxfrSBefe0sR11sZ6wpg2bh7cSZDFPkZ\r\nMPBfIazsxX2Te5wiER6SWsXwViOXsMJpihQbXTEphd0WNpyRXqCIyc6KznLY\r\noznY+y3y+cDGH64v6fF7MExd4mITIS7m+Vo481C6w7QAm9ybvifYAGuf8l3q\r\nIIq81t0R8wr+7mZm9HkF+q0iw0dvYX8zvkYpSTbJZyv3d8PL5U81eSohjwqs\r\n2NsLT/ReU6xXYRO5tB/J/fDmxIzzcsjfEX0Nx4bhXvEB9ZbtyKtnC6pG4eLW\r\n35dVtNmEQzJBYQK+GbmmL1CXTSgL99GZT/T3Ic0iNJG/5WcPGX6GZWqp0XD0\r\ni53huzPm4SUvNAZ60U9GKisJfoM/T8ZcVDVGf1y9jPoOf5D4Jfcv+tFFLt8b\r\nf8J1+k4va9GvFi4aUOX4jH74ZKWLGPL5Bu38GW44vDY8JdeaTbra4k15Yf/5\r\nWf1F6HdveAXl8sHH1lsNGSOPc2ZanRKCd/mvUxh1YpMiA9IqAiunBFRvR/52\r\nH1LYvvwz/bzIIddA5O9u6YWvq+FJxew0aeTtmyV91hJwu8UKAwp528im7okk\r\n/PK872gx+neuL7lr1sE5DztD+JC3n0TGnZaBY8OvRgojD3ioBXbJwuzNlSmO\r\nyNsKDSzdDbB+44+iHOSHWzy7OJThWcETPWbI2wfubTyiAtc8TPyUjLzNTUTK\r\nVeE7B9p45pG3T/r1BmyDDcP2qtD/71VcVTugCcuo/ENGkFd6Hj3S2wF/qc8x\r\n24l8YzwewKv7mf7+wTr/zotssvgy05XQ45VhEaYShH5e3qJmD2xidCXxDPKS\r\nZ/kfSnrwhvHy3FfIU0oOG0L3wT9Cv1VKI2/1fhca3w83K6u990Aei47+YmRE\r\nX+8rC2495DcTjZ6HxnBiZ1NLFszbXC30N2wwciBVAnnvGZXDNoPn5mp8A2Hv\r\npbGvLeAGTn2DaXhgLyPCBl4vqTtB5+/bvWaf7OjXFZ48U0O+ND2jY+4A+2ho\r\nXrsNlz4WXOUM1xtv3uqBfOpjPu99jH7dNp27E948093mSo+P64ZWfeTZj2FV\r\nWgz6/V5JqTlwnFJ2DAv2Pi/lJ4k8bFYVvcCm3x8eaxAM8zuftz0J18WukpyF\r\nyzhOPPWi358aMWGHfO0bb7rWBz76ZzpDGn5eseekHz3+rRr/PcP7eca3VP0D\r\nh5woG7WDb+xc7nGOrpfr79xi8Pez295UXIZ/fuBxXYbr/fLrhfgV+LpnRGo2\r\n7k93Qx4VDsvySg0Zw/VeN8Qi6fHcrHEsFOOzPO4i6ybcVVZ6XxG2eeFVHgV7\r\nWBh9rMJ4Jo46r46FN4+0yR2Dh0QtmHFw2emjztzw5h16ZXdgM5Gpe0mYLy9H\r\njVV36ftXKvIpwvwWB8sz7tHX07JYNwHzz5m1svQ+zHXelDvwMvaH1sUrH8Be\r\nmxJqT6Berv2cc0uHB9vGrpmgnqSMWpdn0fWxOXCtJPK3i2elaw6s/b6pfxHq\r\nMSO2oCQXzgiUSh9Cve4cuXW8kF7fnY81c1HPlkFWxWWwecjoQQPUf/zDfSIV\r\ncKXG9lVqWB8Db7e7VMLbewM66ecRK//Y+KQaTrvyOum7L9aLrJhwHX09TK17\r\n7j70+l/i3ACLn3bNTsH65Dj5tfAVfCA0uqQT6ze89J3TWzg/7WvbX1jfLUPV\r\nj1vhkUKFj2ew/iWFiwTaYcnqQ7N52B/S7WMKuuCAwUIBGTc2qVyw5h+CTWX9\r\ndn9DHhdcb+AwAgdtSTNWdWQT8/0788bgot3tti7Yn267K/FNwuMmfG63sX/1\r\nRUkcnoalHXd4N9lgfT/nz52l54ftFsCL/c59cIF3Du401ODssmSTx4Jjdl/g\r\n815tpkfNkee3deR8g+Xj/e6N/M0menZ1PD/g2pdrPrMPssmVgGLbX/R+NFmy\r\nd96ITSSaby/mmsP+uotzkBP7tQbbzloAtukPUZDE/j7ctqhXCD4e1ZjMxP4f\r\nS1JdReGLRstkSrTw90RnfVbBzwpixA9vRT37R/0Wg98zum5mqrHJ0X6d4DXw\r\n8DqZZb9x3lTnBd+ShqVEjxx4s5FN/NeqSMnCtq8XHXaUY5NNQc335eGoq0nU\r\nhDSbXLdam68E5wkMXOWVQH0vPHqzDTZacrxZG+ehwNFDttvhS1W8/dVLsL/U\r\n/ezbAb8MevDJAvleNv6vWV24j2t0hTvO19bFk3674bKyEPmfOH8vUZGL9sK/\r\nzilrhnyhyPiubpH9cHjuQKwNzus7DwKiDemfbzBxlcF5biKqKG0Maw4/1RjG\r\neZ/f56lqBm9dc/P1qQ8UORPIZ2wPt1/Q47neSBG1ycwWB1glPueNVS1F+izN\r\n7Z3gC4/X3pVCf7FPIYF5HD47OqedUUIRkbptoR6wrGmKR1UGRZJEHKsD4dY/\r\nu5ZuDaRI1e2CPZnw6gb+1Hb0W3G5AgnZ8DuDr9ORyhRxr3P6/gh+U/txp/EG\r\nioh9F8p7DNfWljaWr6HICZvj8mXw7krv+f94KCIkLrbkLRx9+0ZRVTuLWN7y\r\na/hGzxdJq+88zSJKma8Uf8CXpbqv9nizyO+X8kG/4LvflpkNuKNfnGvS5ZpH\r\nvTw63T7mzCIL5krZAnC9rMngghGL3FneEbEOtjdkDpqvZZGP13QO6cEJnAfO\r\nXnlO5/eOhX3z9PNEu/SSi5hE08Y/3gD+5x+WwNNcJrkkW9h3EBafDYsZS2US\r\npYKtLBu4qb8x1+Aak7yJbRa2h6XXOfg7hSDvn/V45ACzbaaI/0X609lZX5xh\r\ngzfCjWm+TOKtYhx7HI4RSrxRdpJJpJZN6JyANxqp2bYzmaRqPvQDE/YKLpWZ\r\nOYZ+vkPpAhtOqVgiLnqEScRLa+ROwn6/tDmt7ZikPNm1yov+/VrssUQrJllO\r\npQj4w4UPW0rUjNHfc6yPujhPPw80yclEm0kcPpbuCIZvv24xjNZkkiW1Dp2X\r\nYRY/n0aPOpNYR8bLXIU7zrJ53ZE3OH11Kq7DD4uSph/LMkm6XcexG/D+uZb2\r\n31JMYrbbny8KllTle7FPgkl+yItnxMB6xpVnolYyyX3+QuM4+nr2HoqJXIZ8\r\nMWU5cwdW0h7NvSrMJAmFNzSTYU1FoZFgPibZYyhSlglv4LY08/3JIKOqWUdz\r\n4Offh1heCwwSucKYJw/eMut3yf0Lgwx0hRoWwdo98SWuMwwSVq40WQxntqq+\r\nc55kEM3UmmvPYJmGslnHMQbpDnXdWgYXVZgJ2g8zSLA7b+sLuFs/aMb+I4Oo\r\nWaT4VsL5fzPLPAYY5N0OvTU18/TzUUyvByIvKnEFODbCkSel1B8iT9bf/DX6\r\nDk66U+D+o4tBTvnHh3XQ85MWR0RgKQcdtW74YN4FETnkU7aC/6l+2LLWONsQ\r\n+VVMUFxsEFZp2XbOoZ1BSmcePxmGD/dImHgi77q1WtqPwRpjHNLBbQyyrHju\r\n9wS8dH5wKhb5+H+PylPO\r\n                    \"]]]][\r\n                    Part[#, 1]]& )[\r\n                    MousePosition[{\"Graphics\", Graphics}, {0, 0}]], \r\n                    CalculateUtilities`GraphicsUtilities`Private`scaled = \r\n                    MousePosition[{\"GraphicsScaled\", Graphics}, None]}, \r\n                    If[\r\n                    CalculateUtilities`GraphicsUtilities`Private`scaled === \r\n                    None, {}, {\r\n                    Text[\r\n                    Style[\r\n                    Row[{\r\n                    (\r\n                    DateString[#, {\r\n                    \"DayShort\", \" \", \"MonthNameShort\", \" \", \"Year\"}]& )[\r\n                    Part[\r\n                    CalculateUtilities`GraphicsUtilities`Private`pt, 1, 1]], \r\n                    (\r\n                    Function[{\r\n                    CalculateUtilities`GraphicsUtilities`Private`a, \r\n                    CalculateUtilities`GraphicsUtilities`Private`acc}, \r\n                    Quiet[\r\n                    RawBoxes[\r\n                    ToBoxes[\r\n                    NumberForm[CalculateUtilities`GraphicsUtilities`Private`a, \r\n                    Max[1, \r\n                    Ceiling[\r\n                    RealExponent[\r\n                    CalculateUtilities`GraphicsUtilities`Private`a] + \r\n                    CalculateUtilities`GraphicsUtilities`Private`acc]], \r\n                    ExponentFunction -> (Null& ), \r\n                    NumberFormat -> (StringReplace[#, StringExpression[\r\n                    Pattern[CalculateUtilities`GraphicsUtilities`Private`s, \r\n                    BlankSequence[]], \".\", EndOfString] -> \r\n                    CalculateUtilities`GraphicsUtilities`Private`s]& )]]]]][#,\r\n                     0]& )[\r\n                    Part[\r\n                    CalculateUtilities`GraphicsUtilities`Private`pt, 1, 2]]}, \r\n                    \",\"], 12], \r\n                    Part[\r\n                    CalculateUtilities`GraphicsUtilities`Private`pt, 1], {\r\n                    1.5 Sign[\r\n                    Part[CalculateUtilities`GraphicsUtilities`Private`scaled, \r\n                    1] - 0.5], 0}, Background -> White], \r\n                    AbsolutePointSize[7], \r\n                    Point[CalculateUtilities`GraphicsUtilities`Private`pt], \r\n                    White, \r\n                    AbsolutePointSize[5], \r\n                    Point[CalculateUtilities`GraphicsUtilities`Private`pt]}]],\r\n                     TraditionalForm, Graphics]]}, FrameTicks -> {{{{220., \r\n                    FormBox[\r\n                    TagBox[\"220\", #& ], TraditionalForm], {0.00625, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.25]}}, {230., \r\n                    FormBox[\r\n                    TagBox[\"230\", #& ], TraditionalForm], {0.00625, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.25]}}, {240., \r\n                    FormBox[\r\n                    TagBox[\"240\", #& ], TraditionalForm], {0.00625, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.25]}}, {250., \r\n                    FormBox[\r\n                    TagBox[\"250\", #& ], TraditionalForm], {0.00625, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.25]}}, {222., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {224., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {226., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {228., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {232., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {234., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {236., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {238., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {242., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {244., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {246., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {248., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {252., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {254., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {256., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}}, {{220., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00625, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.25]}}, {230., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00625, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.25]}}, {240., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00625, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.25]}}, {250., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00625, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.25]}}, {222., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {224., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {226., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {228., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {232., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {234., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {236., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {238., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {242., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {244., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {246., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {248., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {218., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {216., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {214., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {252., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {254., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}, {256., \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {0.00375, 0.}, {\r\n                    GrayLevel[0.], \r\n                    AbsoluteThickness[0.125]}}}}, {{{3605299200, \r\n                    FormBox[\"\\\"Apr\\\"\", TraditionalForm], {\r\n                    0.020601132958329826`, 0}}, {3607891200, \r\n                    FormBox[\"\\\"May\\\"\", TraditionalForm], {\r\n                    0.020601132958329826`, 0}}, {3610569600, \r\n                    FormBox[\"\\\"Jun\\\"\", TraditionalForm], {\r\n                    0.020601132958329826`, 0}}, {3613161600, \r\n                    FormBox[\"\\\"Jul\\\"\", TraditionalForm], {\r\n                    0.020601132958329826`, 0}}, {3615840000, \r\n                    FormBox[\"\\\"Aug\\\"\", TraditionalForm], {\r\n                    0.020601132958329826`, 0}}, {3618518400, \r\n                    FormBox[\"\\\"Sep\\\"\", TraditionalForm], {\r\n                    0.020601132958329826`, 0}}, {3603830400, \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {\r\n                    0.012360679774997897`, 0}}, {3606508800, \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {\r\n                    0.012360679774997897`, 0}}, {3609100800, \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {\r\n                    0.012360679774997897`, 0}}, {3611779200, \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {\r\n                    0.012360679774997897`, 0}}, {3614371200, \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {\r\n                    0.012360679774997897`, 0}}, {3617049600, \r\n                    FormBox[\"\\\"\\\"\", TraditionalForm], {\r\n                    0.012360679774997897`, 0}}}, {{3605299200, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.020601132958329826`, 0}}, {\r\n                    3607891200, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.020601132958329826`, 0}}, {\r\n                    3610569600, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.020601132958329826`, 0}}, {\r\n                    3613161600, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.020601132958329826`, 0}}, {\r\n                    3615840000, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.020601132958329826`, 0}}, {\r\n                    3618518400, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.020601132958329826`, 0}}, {\r\n                    3603830400, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.012360679774997897`, 0}}, {\r\n                    3606508800, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.012360679774997897`, 0}}, {\r\n                    3609100800, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.012360679774997897`, 0}}, {\r\n                    3611779200, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.012360679774997897`, 0}}, {\r\n                    3614371200, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.012360679774997897`, 0}}, {\r\n                    3617049600, \r\n                    FormBox[\r\n                    StyleBox[\"\\\"\\\"\", 0, StripOnInput -> False], \r\n                    TraditionalForm], {0.012360679774997897`, 0}}}}}, \r\n                ImagePadding -> All, GridLines -> {{{3605299200, \r\n                    GrayLevel[0.9]}, {3607891200, \r\n                    GrayLevel[0.9]}, {3610569600, \r\n                    GrayLevel[0.9]}, {3613161600, \r\n                    GrayLevel[0.9]}, {3615840000, \r\n                    GrayLevel[0.9]}, {3618518400, \r\n                    GrayLevel[0.9]}}, Automatic}, Epilog -> {\r\n                  Directive[\r\n                   AbsoluteThickness[0.5], \r\n                   RGBColor[1, 0, 0]], \r\n                  \r\n                  LineBox[{{3611188800, 212.72879241512837`}, {\r\n                    3611188800, 257.21097084166985`}}], {\r\n                   CapForm[None], {\r\n                    GrayLevel[1], \r\n                    PolygonBox[{\r\n                    Offset[{-4.6, -4.25}, \r\n                    Scaled[{0, 0.08}]], \r\n                    Offset[{-4.6, -0.34999999999999987`}, \r\n                    Scaled[{0, 0.08}]], \r\n                    Offset[{4.6, 4.25}, \r\n                    Scaled[{0, 0.08}]], \r\n                    Offset[{4.6, 0.34999999999999987`}, \r\n                    Scaled[{0, 0.08}]]}]}, {\r\n                    AbsoluteThickness[1], \r\n                    GrayLevel[0], \r\n                    LineBox[{{\r\n                    Offset[{-4.6, -4.25}, \r\n                    Scaled[{0, 0.08}]], \r\n                    Offset[{4.6, 0.34999999999999987`}, \r\n                    Scaled[{0, 0.08}]]}, {\r\n                    Offset[{-4.6, -0.34999999999999987`}, \r\n                    Scaled[{0, 0.08}]], \r\n                    Offset[{4.6, 4.25}, \r\n                    Scaled[{0, 0.08}]]}}]}}}, PlotRangeClipping -> False, \r\n                PlotRangePadding -> None, AspectRatio -> 0.3, \r\n                AxesOrigin -> {3.604*^9, 214.}, AxesStyle -> Directive[\r\n                  GrayLevel[0, 0.35], FontColor -> GrayLevel[0.25], \r\n                  FontOpacity -> 1], BaseStyle -> AbsoluteThickness[1], \r\n                Epilog -> {\r\n                  Directive[\r\n                   AbsoluteThickness[0.5], \r\n                   RGBColor[1, 0, 0]], \r\n                  \r\n                  LineBox[{{3611188800, 212.72879241512837`}, {\r\n                    3611188800, 257.21097084166985`}}]}, Frame -> True, \r\n                FrameLabel -> {None, None}, FrameStyle -> Directive[\r\n                  GrayLevel[0, 0.35], FontColor -> GrayLevel[0.25], \r\n                  FontOpacity -> 1], FrameTicksStyle -> \r\n                Directive[FontFamily -> \"Times\", FontSize -> 10], \r\n                GridLines -> {{{3605299200, \r\n                    GrayLevel[0.9]}, {3607891200, \r\n                    GrayLevel[0.9]}, {3610569600, \r\n                    GrayLevel[0.9]}, {3613161600, \r\n                    GrayLevel[0.9]}, {3615840000, \r\n                    GrayLevel[0.9]}, {3618518400, \r\n                    GrayLevel[0.9]}}, Automatic}, GridLinesStyle -> \r\n                GrayLevel[0.9], ImageSize -> Full, \r\n                LabelStyle -> {FontFamily -> \"Verdana\", FontSize -> 10}, \r\n                Method -> {\"AxesInFront\" -> True}, \r\n                PlotRange -> {{3603398400, 3619123200}, {212.72879241512837`, \r\n                  257.21097084166985`}}, PlotRangeClipping -> True, \r\n                PlotRangePadding -> None, Prolog -> {\r\n                  Opacity[0], \r\n                  TagBox[\r\n                   RectangleBox[\r\n                    Scaled[{0, 0}], \r\n                    Scaled[{1, 1}]], Annotation[#, \"DatePlot\", \"Frame\"]& ]}, \r\n                TicksStyle -> \r\n                Directive[FontFamily -> \"Times\", FontSize -> 10]}], \r\n              TagBox[\r\n               GridBox[{{\r\n                  TagBox[\r\n                   GridBox[{{\r\n                    StyleBox[\r\n                    RowBox[{\"\\\"(\\\"\", \"\\[NoBreak]\", \r\n                    FormBox[\r\n                    TagBox[\r\n                    FormBox[\r\n                    TemplateBox[{\"\\\"from \\\"\", \r\n                    FormBox[\r\n                    TagBox[\"\\\"Mar 10, 2014\\\"\", Identity], TraditionalForm], \r\n                    \"\\\" to \\\"\", \r\n                    FormBox[\r\n                    TagBox[\"\\\"Sep 8, 2014\\\"\", Identity], TraditionalForm]}, \r\n                    \"RowDefault\"], TraditionalForm], \r\n                    Format[#, TraditionalForm]& ], TraditionalForm], \r\n                    \"\\[NoBreak]\", \"\\\")\\\"\"}], {\r\n                    FontFamily -> \"Verdana\", FontSize -> 10, \r\n                    GrayLevel[0.5], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0}, StripOnInput -> False]}}, \r\n                    GridBoxAlignment -> {\"Columns\" -> {{Left}}}, \r\n                    DefaultBaseStyle -> \"Column\", \r\n                    GridBoxItemSize -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}], \r\n                   \"Column\"], \r\n                  TagBox[\r\n                   GridBox[{{\r\n                    StyleBox[\r\n                    RowBox[{\"\\\"(\\\"\", \"\\[NoBreak]\", \r\n                    \r\n                    TemplateBox[{\r\n                    \"\\\"in \\\"\", \"\\\"thousands\\\"\", \"\\\" of \\\"\", \"\\\"miles\\\"\"}, \r\n                    \"RowDefault\"], \"\\[NoBreak]\", \"\\\")\\\"\"}], {\r\n                    FontFamily -> \"Verdana\", FontSize -> 10, \r\n                    GrayLevel[0.5], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0}, StripOnInput -> False]}}, \r\n                    GridBoxAlignment -> {\"Columns\" -> {{Left}}}, \r\n                    DefaultBaseStyle -> \"Column\", \r\n                    GridBoxItemSize -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}], \r\n                   \"Column\"]}}, \r\n                GridBoxAlignment -> {\r\n                 \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Baseline}}}, \r\n                AutoDelete -> False, \r\n                GridBoxItemSize -> {\r\n                 \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}, \r\n                GridBoxSpacings -> {\"Columns\" -> {{0.5}}}], \"Grid\"]}, \r\n             \"Labeled\", DisplayFunction -> (FormBox[\r\n               GridBox[{{\r\n                  TagBox[\r\n                   ItemBox[\r\n                    PaneBox[\r\n                    TagBox[#, \"SkipImageSizeLevel\"], \r\n                    Alignment -> {Center, Baseline}, BaselinePosition -> \r\n                    Baseline], DefaultBaseStyle -> \"Labeled\"], \r\n                   \"SkipImageSizeLevel\"]}, {\r\n                  \r\n                  ItemBox[#2, Alignment -> {Left, Inherited}, \r\n                   DefaultBaseStyle -> \"LabeledLabel\"]}}, \r\n                GridBoxAlignment -> {\r\n                 \"Columns\" -> {{Center}}, \"Rows\" -> {{Center}}}, AutoDelete -> \r\n                False, GridBoxItemSize -> {\r\n                 \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}, \r\n                BaselinePosition -> {1, 1}], TraditionalForm]& ), \r\n             InterpretationFunction -> (RowBox[{\r\n                StyleBox[\r\n                \"Labeled\", FontFamily -> \"Bitstream Vera Sans\", \r\n                 FontSize -> -1 + Inherited], \"[\", \r\n                RowBox[{#, \",\", \r\n                  RowBox[{\"{\", #2, \"}\"}], \",\", \r\n                  RowBox[{\"(\", \"\\[NoBreak]\", \r\n                    GridBox[{{\r\n                    StyleBox[\r\n                    \"Bottom\", FontFamily -> \"Bitstream Vera Sans\", \r\n                    FontSize -> -1 + Inherited], \r\n                    StyleBox[\r\n                    \"Left\", FontFamily -> \"Bitstream Vera Sans\", \r\n                    FontSize -> -1 + Inherited]}}, RowSpacings -> 1, \r\n                    ColumnSpacings -> 1, RowAlignments -> Baseline, \r\n                    ColumnAlignments -> Center], \"\\[NoBreak]\", \")\"}]}], \r\n                \"]\"}]& )], TraditionalForm]], \"Output\", {\r\n          Background -> None}]}], \r\n       XMLElement[\r\n       \"dataformats\", {}, {\"computabledata,formatteddata,timeseriesdata\"}]}], \r\n     XMLElement[\"states\", {\"count\" -> \"2\"}, {\r\n       XMLElement[\r\n       \"state\", {\r\n        \"name\" -> \"Use Metric\", \"input\" -> \r\n         \"DistanceHistory:AstronomicalData__Use Metric\"}, {}], \r\n       XMLElement[\r\n       \"statelist\", {\r\n        \"count\" -> \"5\", \"value\" -> \"\\[PlusMinus]3 months\", \"delimiters\" -> \r\n         \"\"}, {\r\n         XMLElement[\r\n         \"state\", {\r\n          \"name\" -> \"\\[PlusMinus]3 months\", \"input\" -> \r\n           \"DistanceHistory:AstronomicalData__\\[PlusMinus]3 months\"}, {}], \r\n         XMLElement[\r\n         \"state\", {\r\n          \"name\" -> \"\\[PlusMinus]6 months\", \"input\" -> \r\n           \"DistanceHistory:AstronomicalData__\\[PlusMinus]6 months\"}, {}], \r\n         XMLElement[\r\n         \"state\", {\r\n          \"name\" -> \"\\[PlusMinus]1 year\", \"input\" -> \r\n           \"DistanceHistory:AstronomicalData__\\[PlusMinus]1 year\"}, {}], \r\n         XMLElement[\r\n         \"state\", {\r\n          \"name\" -> \"\\[PlusMinus]5 years\", \"input\" -> \r\n           \"DistanceHistory:AstronomicalData__\\[PlusMinus]5 years\"}, {}], \r\n         XMLElement[\r\n         \"state\", {\r\n          \"name\" -> \"\\[PlusMinus]10 years\", \"input\" -> \r\n           \"DistanceHistory:AstronomicalData__\\[PlusMinus]10 years\"}, \\\r\n{}]}]}]}], Typeset`pod4$$ = XMLElement[\r\n   \"pod\", {\"title\" -> \"Unit conversions\", \"scanner\" -> \"Unit\", \"id\" -> \r\n     \"UnitConversion\", \"position\" -> \"400\", \"error\" -> \"false\", \"numsubpods\" -> \r\n     \"2\"}, {\r\n     XMLElement[\"subpod\", {\"title\" -> \"\"}, {\r\n       XMLElement[\"cell\", {\"compressed\" -> False, \"string\" -> True}, {\r\n         Cell[\r\n          BoxData[\r\n           FormBox[\r\n            StyleBox[\r\n             TagBox[\r\n              RowBox[{\r\n                TagBox[\r\n                 TagBox[\r\n                  RowBox[{\r\n                    TagBox[\"385\\[ThinSpace]056\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"385056\"]], \r\n                    \"\\[NoBreak]\", \r\n                    StyleBox[\r\n                    RowBox[{}], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller], \"\\[InvisibleSpace]\", \"\\[ThickSpace]\", \r\n                    \"\\[InvisibleSpace]\", \r\n                    StyleBox[\r\n                    \"\\\"km\\\"\", FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], #& , SyntaxForm -> Dot], \"  \", \r\n                StyleBox[\r\n                 \r\n                 RowBox[{\r\n                  \"\\\"(\\\"\", \"\\[NoBreak]\", \"\\\"kilometers\\\"\", \"\\[NoBreak]\", \r\n                   \"\\\")\\\"\"}], {\r\n                 FontFamily :> $CellContext`$UnitFontFamily, FontSize -> \r\n                  Smaller, \r\n                  GrayLevel[0.6], LinebreakAdjustments -> {1, 100, 1, 0, 100},\r\n                   LineIndent -> 0}, StripOnInput -> False]}], \"Unit\", \r\n              SyntaxForm -> Dot], LinebreakAdjustments -> {1, 100, 1, 0, 100},\r\n              LineIndent -> 0, ZeroWidthTimes -> False], TraditionalForm]], \r\n          \"Output\", {}]}], \r\n       XMLElement[\r\n       \"dataformats\", {}, {\r\n        \"plaintext,computabledata,formatteddata,numberdata,quantitydata\"}]}], \r\n     XMLElement[\"subpod\", {\"title\" -> \"\"}, {\r\n       XMLElement[\"cell\", {\"compressed\" -> False, \"string\" -> True}, {\r\n         Cell[\r\n          BoxData[\r\n           FormBox[\r\n            StyleBox[\r\n             TagBox[\r\n              TagBox[\r\n               TagBox[\r\n                RowBox[{\r\n                  TagBox[\r\n                   RowBox[{\"3.851\", \r\n                    StyleBox[\"\\[Times]\", \r\n                    GrayLevel[0.5]], \r\n                    SuperscriptBox[\"10\", \"8\"]}], \r\n                   $CellContext`TagBoxWrapper[\r\n                   \"StringBoxes\" -> RowBox[{\"3.851\", \"\\[Times]\", \r\n                    SuperscriptBox[\"10\", \"8\"]}]], SyntaxForm -> CenterDot], \r\n                  \"\\[InvisibleSpace]\", \" \", \r\n                  StyleBox[\r\n                  \"\\\"meters\\\"\", LinebreakAdjustments -> {1, 100, 1, 0, 100}, \r\n                   LineIndent -> 0, {\r\n                   FontFamily :> $CellContext`$UnitFontFamily, FontSize -> \r\n                    Smaller}, StripOnInput -> False]}], Identity], #& , \r\n               SyntaxForm -> Dot], \"Unit\", SyntaxForm -> Dot], \r\n             LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> 0, \r\n             ZeroWidthTimes -> False], TraditionalForm]], \"Output\", {}]}], \r\n       XMLElement[\r\n       \"dataformats\", {}, {\r\n        \"plaintext,computabledata,formatteddata,numberdata,quantitydata\"}]}]}]\\\r\n, Typeset`pod5$$ = XMLElement[\r\n   \"pod\", {\"title\" -> \"Comparison as distance\", \"scanner\" -> \"Unit\", \"id\" -> \r\n     \"ComparisonAsDistance\", \"position\" -> \"500\", \"error\" -> \"false\", \r\n     \"numsubpods\" -> \"1\"}, {\r\n     XMLElement[\"subpod\", {\"title\" -> \"\"}, {\r\n       XMLElement[\"cell\", {\"compressed\" -> False, \"string\" -> True}, {\r\n         Cell[\r\n          BoxData[\r\n           FormBox[\r\n            FormBox[\r\n             \r\n             TemplateBox[{\r\n              \"\\\" \\[TildeTilde] \\\"\", \r\n               \"1.00017081986198578379799203020065608125`4.767535813146223\", \r\n               \"\\\" \\\"\", \r\n               StyleBox[\"\\\"\\[Times]\\\"\", \r\n                GrayLevel[0.3], FontSize -> 10.219999999999999`, StripOnInput -> \r\n                False], \"\\\"\\[MediumSpace]\\\"\", \r\n               StyleBox[\r\n               \"\\\"mean Moon\\[Hyphen]Earth distance\\\"\", FontFamily -> \r\n                \"Helvetica\", FontSize -> Smaller, StripOnInput -> False], \r\n               \"\\\" \\\"\", \r\n               StyleBox[\r\n                RowBox[{\"\\\"(\\\"\", \"\\[NoBreak]\", \r\n                  TemplateBox[{\"\\\"\\[MediumSpace]\\\"\", \r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\r\n                    RowBox[{\"3.85\", \r\n                    StyleBox[\"\\[Times]\", \r\n                    GrayLevel[0.5]], \r\n                    SuperscriptBox[\"10\", \"8\"]}], \r\n                    $CellContext`TagBoxWrapper[\r\n                    \"StringBoxes\" -> RowBox[{\"3.85\", \"\\[Times]\", \r\n                    SuperscriptBox[\"10\", \"8\"]}]], SyntaxForm -> CenterDot], \r\n                    \"\\[NoBreak]\", \r\n                    StyleBox[\r\n                    RowBox[{}], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller], \"\\[InvisibleSpace]\", \"\\[ThickSpace]\", \r\n                    \"\\[InvisibleSpace]\", \r\n                    StyleBox[\r\n                    \"\\\"m\\\"\", FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], #& , SyntaxForm -> Dot], \"Unit\", \r\n                    SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False], \"\\\"\\[MediumSpace]\\\"\"}, \r\n                   \"RowDefault\"], \"\\[NoBreak]\", \"\\\")\\\"\"}], {\r\n                FontFamily -> \"Verdana\", FontSize -> 10, \r\n                 GrayLevel[0.5], LinebreakAdjustments -> {1, 100, 1, 0, 100}, \r\n                 LineIndent -> 0}, StripOnInput -> False]}, \"RowDefault\"], \r\n             TraditionalForm], TraditionalForm]], \"Output\", {}]}], \r\n       XMLElement[\"dataformats\", {}, {\"plaintext\"}]}]}], Typeset`pod6$$ = \r\n   XMLElement[\r\n   \"pod\", {\"title\" -> \"Corresponding quantities\", \"scanner\" -> \"Unit\", \"id\" -> \r\n     \"CorrespondingQuantity\", \"position\" -> \"600\", \"error\" -> \"false\", \r\n     \"numsubpods\" -> \"2\"}, {\r\n     XMLElement[\"subpod\", {\"title\" -> \"\"}, {\r\n       XMLElement[\"cell\", {\"compressed\" -> False, \"string\" -> True}, {\r\n         Cell[\r\n          BoxData[\r\n           FormBox[\r\n            TagBox[\r\n             GridBox[{{\r\n                InterpretationBox[\r\n                 Cell[\r\n                  TextData[{\"Light travel time \", \r\n                    Cell[\r\n                    BoxData[\r\n                    FormBox[\"t\", TraditionalForm]]], \" in vacuum from \", \r\n                    Cell[\r\n                    BoxData[\r\n                    FormBox[\r\n                    FormBox[\r\n                    TemplateBox[{\r\n                    TagBox[\r\n                    RowBox[{\"t\", \"\\[LongEqual]\", \r\n                    \r\n                    RowBox[{\"x\", \"\\[InvisibleSpace]\", \"\\\"/\\\"\", \r\n                    \"\\[InvisibleSpace]\", \"c\"}]}], \r\n                    PolynomialForm[#, TraditionalOrder -> False]& ]}, \r\n                    \"RowDefault\"], TraditionalForm], TraditionalForm]]], \r\n                    \":\"}]], \r\n                 TextCell[\r\n                  Row[{\"Light travel time \", \r\n                    $CellContext`CalculateSymbol[\"t\"], \" in vacuum from \", \r\n                    $CellContext`InlineForm[\"t \\[LongEqual] x/c\"], \":\"}]]]}, {\r\n                TagBox[\r\n                 GridBox[{{\r\n                    InterpretationBox[\r\n                    StyleBox[\r\n                    \r\n                    GraphicsBox[{}, ImageSize -> {10, 0}, BaselinePosition -> \r\n                    Baseline], \"CacheGraphics\" -> False], \r\n                    Spacer[10]], \r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"1.3\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"1.3\"]], \r\n                    \"\\[InvisibleSpace]\", \" \", \r\n                    StyleBox[\r\n                    \"\\\"seconds\\\"\", \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, {FontFamily :> $CellContext`$UnitFontFamily, FontSize -> \r\n                    Smaller}, StripOnInput -> False]}], Identity], #& , \r\n                    SyntaxForm -> Dot], \"Unit\", SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False]}}, \r\n                  GridBoxAlignment -> {\"Columns\" -> {{Left}}}, AutoDelete -> \r\n                  False, GridBoxItemSize -> {\r\n                   \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}], \r\n                 \"Grid\"]}}, GridBoxAlignment -> {\"Columns\" -> {{Left}}}, \r\n              DefaultBaseStyle -> \"Column\", \r\n              GridBoxItemSize -> {\"ColumnsIndexed\" -> {1 -> 0}}], \"Column\"], \r\n            TraditionalForm]], \"Output\", {}]}], \r\n       XMLElement[\r\n       \"dataformats\", {}, {\r\n        \"plaintext,computabledata,formatteddata,numberdata,quantitydata\"}]}], \r\n     XMLElement[\"subpod\", {\"title\" -> \"\"}, {\r\n       XMLElement[\"cell\", {\"compressed\" -> False, \"string\" -> True}, {\r\n         Cell[\r\n          BoxData[\r\n           FormBox[\r\n            TagBox[\r\n             GridBox[{{\r\n                InterpretationBox[\r\n                 Cell[\r\n                  TextData[{\"Light travel time \", \r\n                    Cell[\r\n                    BoxData[\r\n                    FormBox[\"t\", TraditionalForm]]], \" in an optical fiber \", \r\n                    Cell[\r\n                    BoxData[\r\n                    FormBox[\r\n                    FormBox[\r\n                    TemplateBox[{\r\n                    TagBox[\r\n                    RowBox[{\"t\", \"\\[LongEqual]\", \r\n                    RowBox[{\r\n                    RowBox[{\"1.48`\", \"\\[InvisibleSpace]\", \"x\"}], \r\n                    \"\\[InvisibleSpace]\", \"\\\"/\\\"\", \"\\[InvisibleSpace]\", \r\n                    \"c\"}]}], PolynomialForm[#, TraditionalOrder -> False]& ]},\r\n                     \"RowDefault\"], TraditionalForm], TraditionalForm]]], \r\n                    \":\"}]], \r\n                 TextCell[\r\n                  Row[{\"Light travel time \", \r\n                    $CellContext`CalculateSymbol[\"t\"], \r\n                    \" in an optical fiber \", \r\n                    $CellContext`InlineForm[\"t \\[LongEqual] 1.48x/c\"], \r\n                    \":\"}]]]}, {\r\n                TagBox[\r\n                 GridBox[{{\r\n                    InterpretationBox[\r\n                    StyleBox[\r\n                    \r\n                    GraphicsBox[{}, ImageSize -> {10, 0}, BaselinePosition -> \r\n                    Baseline], \"CacheGraphics\" -> False], \r\n                    Spacer[10]], \r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"1.9\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"1.9\"]], \r\n                    \"\\[InvisibleSpace]\", \" \", \r\n                    StyleBox[\r\n                    \"\\\"seconds\\\"\", \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, {FontFamily :> $CellContext`$UnitFontFamily, FontSize -> \r\n                    Smaller}, StripOnInput -> False]}], Identity], #& , \r\n                    SyntaxForm -> Dot], \"Unit\", SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False]}}, \r\n                  GridBoxAlignment -> {\"Columns\" -> {{Left}}}, AutoDelete -> \r\n                  False, GridBoxItemSize -> {\r\n                   \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}], \r\n                 \"Grid\"]}}, GridBoxAlignment -> {\"Columns\" -> {{Left}}}, \r\n              DefaultBaseStyle -> \"Column\", \r\n              GridBoxItemSize -> {\"ColumnsIndexed\" -> {1 -> 0}}], \"Column\"], \r\n            TraditionalForm]], \"Output\", {}]}], \r\n       XMLElement[\r\n       \"dataformats\", {}, {\r\n        \"plaintext,computabledata,formatteddata,numberdata,quantitydata\"}]}]}]\\\r\n, Typeset`pod7$$ = XMLElement[\r\n   \"pod\", {\"title\" -> \"Orbital properties\", \"scanner\" -> \"Data\", \"id\" -> \r\n     \"BasicPlanetOrbitalProperties:AstronomicalData\", \"position\" -> \"700\", \r\n     \"error\" -> \"false\", \"numsubpods\" -> \"1\"}, {\r\n     XMLElement[\"subpod\", {\"title\" -> \"\"}, {\r\n       XMLElement[\"cell\", {\"compressed\" -> True, \"string\" -> False}, {\r\n         Cell[\r\n          BoxData[\r\n           FormBox[\r\n            StyleBox[\r\n             TagBox[\r\n              GridBox[{{\r\n                 TagBox[\r\n                  PaneBox[\r\n                  \"\\\"current distance from Earth\\\"\", \r\n                   BaseStyle -> {{\r\n                    BaselinePosition -> Baseline, FontColor -> \r\n                    GrayLevel[0.3]}, LineSpacing -> {0.9, 0, 1.5}, \r\n                    LinebreakAdjustments -> {1, 10, 10000, 0, 100}, \r\n                    TextAlignment -> Left}, BaselinePosition -> Baseline], \r\n                  $CellContext`TagBoxWrapper[\"Label\"]], \r\n                 TagBox[\r\n                  GridBox[{{\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"239\\[ThinSpace]262\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"239262\"]], \r\n                    \"\\[NoBreak]\", \r\n                    StyleBox[\r\n                    RowBox[{}], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller], \"\\[InvisibleSpace]\", \"\\[ThickSpace]\", \r\n                    \"\\[InvisibleSpace]\", \r\n                    StyleBox[\r\n                    \"\\\"mi\\\"\", FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], #& , SyntaxForm -> Dot], \"Unit\", \r\n                    SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False]}, {\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"60.37\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"60.37\"]], \r\n                    \"\\[NoBreak]\", \r\n                    StyleBox[\r\n                    RowBox[{}], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller], \"\\[InvisibleSpace]\", \"\\[ThickSpace]\", \r\n                    \"\\[InvisibleSpace]\", \r\n                    StyleBox[\r\n                    SubscriptBox[\r\n                    StyleBox[\"\\\"a\\\"\", Italic, StripOnInput -> False], \r\n                    \"\\\"\\[Earth]\\\"\"], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], #& , SyntaxForm -> Dot], \"Unit\", \r\n                    SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False]}}, \r\n                   GridBoxAlignment -> {\"Columns\" -> {{Left}}}, \r\n                   BaselinePosition -> 1, DefaultBaseStyle -> \"Column\", \r\n                   GridBoxItemSize -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}, \r\n                   GridBoxSpacings -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}], \r\n                  \"Column\"]}, {\r\n                 TagBox[\r\n                  PaneBox[\r\n                   TagBox[\"\\\"average distance from Earth\\\"\", Identity], \r\n                   BaseStyle -> {{\r\n                    BaselinePosition -> Baseline, FontColor -> \r\n                    GrayLevel[0.3]}, LineSpacing -> {0.9, 0, 1.5}, \r\n                    LinebreakAdjustments -> {1, 10, 10000, 0, 100}, \r\n                    TextAlignment -> Left}, BaselinePosition -> Baseline], \r\n                  $CellContext`TagBoxWrapper[\"Label\"]], \r\n                 TagBox[\r\n                  GridBox[{{\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"239\\[ThinSpace]200\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"239200\"]], \r\n                    \"\\[NoBreak]\", \r\n                    StyleBox[\r\n                    RowBox[{}], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller], \"\\[InvisibleSpace]\", \"\\[ThickSpace]\", \r\n                    \"\\[InvisibleSpace]\", \r\n                    StyleBox[\r\n                    \"\\\"mi\\\"\", FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], #& , SyntaxForm -> Dot], \"Unit\", \r\n                    SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False]}, {\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"60.36\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"60.36\"]], \r\n                    \"\\[NoBreak]\", \r\n                    StyleBox[\r\n                    RowBox[{}], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller], \"\\[InvisibleSpace]\", \"\\[ThickSpace]\", \r\n                    \"\\[InvisibleSpace]\", \r\n                    StyleBox[\r\n                    SubscriptBox[\r\n                    StyleBox[\"\\\"a\\\"\", Italic, StripOnInput -> False], \r\n                    \"\\\"\\[Earth]\\\"\"], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], #& , SyntaxForm -> Dot], \"Unit\", \r\n                    SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False]}}, \r\n                   GridBoxAlignment -> {\"Columns\" -> {{Left}}}, \r\n                   BaselinePosition -> 1, DefaultBaseStyle -> \"Column\", \r\n                   GridBoxItemSize -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}, \r\n                   GridBoxSpacings -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}], \r\n                  \"Column\"]}, {\r\n                 TagBox[\r\n                  PaneBox[\r\n                  \"\\\"largest distance from orbit center\\\"\", \r\n                   BaseStyle -> {{\r\n                    BaselinePosition -> Baseline, FontColor -> \r\n                    GrayLevel[0.3]}, LineSpacing -> {0.9, 0, 1.5}, \r\n                    LinebreakAdjustments -> {1, 10, 10000, 0, 100}, \r\n                    TextAlignment -> Left}, BaselinePosition -> Baseline], \r\n                  $CellContext`TagBoxWrapper[\"Label\"]], \r\n                 TagBox[\r\n                  GridBox[{{\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"252\\[ThinSpace]100\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"252100\"]], \r\n                    \"\\[NoBreak]\", \r\n                    StyleBox[\r\n                    RowBox[{}], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller], \"\\[InvisibleSpace]\", \"\\[ThickSpace]\", \r\n                    \"\\[InvisibleSpace]\", \r\n                    StyleBox[\r\n                    \"\\\"mi\\\"\", FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], #& , SyntaxForm -> Dot], \"Unit\", \r\n                    SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False]}, {\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"63.61\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"63.61\"]], \r\n                    \"\\[NoBreak]\", \r\n                    StyleBox[\r\n                    RowBox[{}], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller], \"\\[InvisibleSpace]\", \"\\[ThickSpace]\", \r\n                    \"\\[InvisibleSpace]\", \r\n                    StyleBox[\r\n                    SubscriptBox[\r\n                    StyleBox[\"\\\"a\\\"\", Italic, StripOnInput -> False], \r\n                    \"\\\"\\[Earth]\\\"\"], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], #& , SyntaxForm -> Dot], \"Unit\", \r\n                    SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False]}}, \r\n                   GridBoxAlignment -> {\"Columns\" -> {{Left}}}, \r\n                   BaselinePosition -> 1, DefaultBaseStyle -> \"Column\", \r\n                   GridBoxItemSize -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}, \r\n                   GridBoxSpacings -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}], \r\n                  \"Column\"]}, {\r\n                 TagBox[\r\n                  PaneBox[\r\n                  \"\\\"nearest distance from orbit center\\\"\", \r\n                   BaseStyle -> {{\r\n                    BaselinePosition -> Baseline, FontColor -> \r\n                    GrayLevel[0.3]}, LineSpacing -> {0.9, 0, 1.5}, \r\n                    LinebreakAdjustments -> {1, 10, 10000, 0, 100}, \r\n                    TextAlignment -> Left}, BaselinePosition -> Baseline], \r\n                  $CellContext`TagBoxWrapper[\"Label\"]], \r\n                 TagBox[\r\n                  GridBox[{{\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"225\\[ThinSpace]600\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"225600\"]], \r\n                    \"\\[NoBreak]\", \r\n                    StyleBox[\r\n                    RowBox[{}], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller], \"\\[InvisibleSpace]\", \"\\[ThickSpace]\", \r\n                    \"\\[InvisibleSpace]\", \r\n                    StyleBox[\r\n                    \"\\\"mi\\\"\", FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], #& , SyntaxForm -> Dot], \"Unit\", \r\n                    SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False]}, {\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"56.93\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"56.93\"]], \r\n                    \"\\[NoBreak]\", \r\n                    StyleBox[\r\n                    RowBox[{}], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller], \"\\[InvisibleSpace]\", \"\\[ThickSpace]\", \r\n                    \"\\[InvisibleSpace]\", \r\n                    StyleBox[\r\n                    SubscriptBox[\r\n                    StyleBox[\"\\\"a\\\"\", Italic, StripOnInput -> False], \r\n                    \"\\\"\\[Earth]\\\"\"], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], #& , SyntaxForm -> Dot], \"Unit\", \r\n                    SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False]}}, \r\n                   GridBoxAlignment -> {\"Columns\" -> {{Left}}}, \r\n                   BaselinePosition -> 1, DefaultBaseStyle -> \"Column\", \r\n                   GridBoxItemSize -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}, \r\n                   GridBoxSpacings -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}], \r\n                  \"Column\"]}, {\r\n                 TagBox[\r\n                  PaneBox[\r\n                   TagBox[\"\\\"orbital period\\\"\", Identity], \r\n                   BaseStyle -> {{\r\n                    BaselinePosition -> Baseline, FontColor -> \r\n                    GrayLevel[0.3]}, LineSpacing -> {0.9, 0, 1.5}, \r\n                    LinebreakAdjustments -> {1, 10, 10000, 0, 100}, \r\n                    TextAlignment -> Left}, BaselinePosition -> Baseline], \r\n                  $CellContext`TagBoxWrapper[\"Label\"]], \r\n                 StyleBox[\r\n                  TagBox[\r\n                   TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    TagBox[\"27.322\", \r\n                    $CellContext`TagBoxWrapper[\"StringBoxes\" -> \"27.322\"]], \r\n                    \"\\[InvisibleSpace]\", \" \", \r\n                    StyleBox[\r\n                    \"\\\"days\\\"\", LinebreakAdjustments -> {1, 100, 1, 0, 100}, \r\n                    LineIndent -> 0, {\r\n                    FontFamily :> $CellContext`$UnitFontFamily, FontSize -> \r\n                    Smaller}, StripOnInput -> False]}], Identity], #& , \r\n                    SyntaxForm -> Dot], \"Unit\", SyntaxForm -> Dot], \r\n                  LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                  0, ZeroWidthTimes -> False]}}, \r\n               GridBoxAlignment -> {\r\n                \"Columns\" -> {Left, Left}, \"Rows\" -> {{Baseline}}}, \r\n               AutoDelete -> False, \r\n               GridBoxBackground -> {\"Columns\" -> {None, None}}, \r\n               GridBoxFrame -> {\"Columns\" -> {{True}}, \"Rows\" -> {{True}}}, \r\n               GridBoxItemSize -> {\r\n                \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}, \r\n               GridBoxSpacings -> {\"Columns\" -> {{1.5}, 2}, \"Rows\" -> {{1}}}, \r\n               FrameStyle -> GrayLevel[0.84], BaselinePosition -> Automatic, \r\n               AllowScriptLevelChange -> False], \"Grid\"], \r\n             LineSpacing -> {0.9, 0, 1.5}, LineIndent -> 0, StripOnInput -> \r\n             False], TraditionalForm]], \"Output\", {}]}], \r\n       XMLElement[\r\n       \"dataformats\", {}, {\r\n        \"plaintext,computabledata,formatteddata,numberdata,quantitydata\"}]}], \r\n     XMLElement[\"states\", {\"count\" -> \"2\"}, {\r\n       XMLElement[\r\n       \"state\", {\r\n        \"name\" -> \"Show metric\", \"input\" -> \r\n         \"BasicPlanetOrbitalProperties:AstronomicalData__Show metric\"}, {}], \r\n       XMLElement[\r\n       \"state\", {\r\n        \"name\" -> \"More\", \"input\" -> \r\n         \"BasicPlanetOrbitalProperties:AstronomicalData__More\"}, {}]}], \r\n     XMLElement[\"infos\", {\"count\" -> \"1\"}, {\r\n       XMLElement[\"info\", {}, {\r\n         XMLElement[\"units\", {\"count\" -> \"2\"}, {\r\n           XMLElement[\r\n           \"unit\", {\r\n            \"short\" -> \"a_\\[Earth]\", \"long\" -> \r\n             \"equatorial radii of Earth\"}, {}], \r\n           XMLElement[\"unit\", {\"short\" -> \"mi\", \"long\" -> \"miles\"}, {}], \r\n           XMLElement[\"cell\", {\"compressed\" -> False, \"string\" -> True}, {\r\n             Cell[\r\n              BoxData[\r\n               FormBox[\r\n                StyleBox[\r\n                 TagBox[\r\n                  GridBox[{{\r\n                    StyleBox[\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    StyleBox[\r\n                    SubscriptBox[\r\n                    StyleBox[\"\\\"a\\\"\", Italic, StripOnInput -> False], \r\n                    \"\\\"\\[Earth]\\\"\"], FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], \"UnitOnly\", SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False], 10, StripOnInput -> False], \r\n                    StyleBox[\r\n                    \"\\\"equatorial radii of Earth\\\"\", FontSize -> 10, \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, {FontFamily :> $CellContext`$UnitFontFamily, FontSize -> \r\n                    Smaller}, \r\n                    GrayLevel[0.6], StripOnInput -> False]}, {\r\n                    StyleBox[\r\n                    StyleBox[\r\n                    TagBox[\r\n                    TagBox[\r\n                    RowBox[{\r\n                    StyleBox[\r\n                    \"\\\"mi\\\"\", FontFamily -> \"Helvetica\", FontSize -> \r\n                    Smaller]}], Identity], \"UnitOnly\", SyntaxForm -> Dot], \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, ZeroWidthTimes -> False], 10, StripOnInput -> False], \r\n                    StyleBox[\r\n                    \"\\\"miles\\\"\", FontSize -> 10, \r\n                    LinebreakAdjustments -> {1, 100, 1, 0, 100}, LineIndent -> \r\n                    0, {FontFamily :> $CellContext`$UnitFontFamily, FontSize -> \r\n                    Smaller}, \r\n                    GrayLevel[0.6], StripOnInput -> False]}}, \r\n                   GridBoxAlignment -> {\r\n                    \"Columns\" -> {Left, Left}, \"Rows\" -> {{Baseline}}}, \r\n                   AutoDelete -> False, \r\n                   GridBoxBackground -> {\"Columns\" -> {{None}}}, \r\n                   GridBoxFrame -> {\r\n                    \"Columns\" -> {{True}}, \"Rows\" -> {{True}}}, \r\n                   GridBoxItemSize -> {\r\n                    \"Columns\" -> {{Automatic}}, \"Rows\" -> {{Automatic}}}, \r\n                   GridBoxSpacings -> {\r\n                    \"Columns\" -> {{1.5}}, \"Rows\" -> {{0.5}}}, FrameStyle -> \r\n                   GrayLevel[0.84], BaselinePosition -> Automatic, \r\n                   AllowScriptLevelChange -> False], \"Grid\"], \r\n                 LineSpacing -> {0.9, 0, 1.5}, LineIndent -> 0, StripOnInput -> \r\n                 False], TraditionalForm]], \"Output\", {}]}]}]}]}]}], \r\n   Typeset`aux1$$ = {True, False, {False}, True}, Typeset`aux2$$ = {\r\n   True, False, {False}, True}, Typeset`aux3$$ = {True, False, {False}, True},\r\n    Typeset`aux4$$ = {True, False, {False, False}, True}, Typeset`aux5$$ = {\r\n   True, False, {False}, True}, Typeset`aux6$$ = {\r\n   True, False, {False, False}, True}, Typeset`aux7$$ = {\r\n   True, False, {False}, True}, Typeset`asyncpods$$ = {}, Typeset`nonpods$$ = {\r\n    XMLElement[\"sources\", {\"count\" -> \"1\"}, {\r\n      XMLElement[\r\n      \"source\", {\r\n       \"url\" -> \r\n        \"http://www.wolframalpha.com/sources/\\\r\nAstronomicalDataSourceInformationNotes.html\", \"text\" -> \r\n        \"Astronomical data\"}, {}]}]}, Typeset`initdone$$ = True, \r\n   Typeset`queryinfo$$ = {\r\n   \"success\" -> \"true\", \"error\" -> \"false\", \"numpods\" -> \"7\", \"datatypes\" -> \r\n    \"Astronomical\", \"timedout\" -> \"\", \"timedoutpods\" -> \"\", \"timing\" -> \r\n    \"2.573\", \"parsetiming\" -> \"0.486\", \"parsetimedout\" -> \"false\", \r\n    \"recalculate\" -> \"\", \"id\" -> \r\n    \"MSPa79522303fg0608bh95i00004h41i28eicg1ci5g\", \"host\" -> \r\n    \"http://www3.wolframalpha.com\", \"server\" -> \"20\", \"related\" -> \r\n    \"http://www3.wolframalpha.com/api/v2/relatedQueries.jsp?id=\\\r\nMSPa79622303fg0608bh95i000037d20g9h7ib3ec64&s=20\", \"version\" -> \"2.6\"}, \r\n   Typeset`sessioninfo$$ = {\r\n   \"TimeZone\" -> -4., \r\n    \"Date\" -> {2014, 6, 8, 23, 7, 20.2144277`9.058236384941416}, \"Line\" -> 3, \r\n    \"SessionID\" -> 25552092645876612485}, Typeset`showpods$$ = {1, 2, 3, 4, 5,\r\n    6, 7}, Typeset`failedpods$$ = {}, Typeset`chosen$$ = {}, Typeset`open$$ = \r\n   False, Typeset`newq$$ = \"How far is the Earth from the Moon?\"}, \r\n   DynamicBox[ToBoxes[\r\n     AlphaIntegration`FormatAlphaResults[\r\n      Dynamic[{\r\n       1, {Typeset`pod1$$, Typeset`pod2$$, Typeset`pod3$$, Typeset`pod4$$, \r\n         Typeset`pod5$$, Typeset`pod6$$, Typeset`pod7$$}, {\r\n        Typeset`aux1$$, Typeset`aux2$$, Typeset`aux3$$, Typeset`aux4$$, \r\n         Typeset`aux5$$, Typeset`aux6$$, Typeset`aux7$$}, Typeset`chosen$$, \r\n        Typeset`open$$, Typeset`elements$$, Typeset`q$$, Typeset`opts$$, \r\n        Typeset`nonpods$$, Typeset`queryinfo$$, Typeset`sessioninfo$$, \r\n        Typeset`showpods$$, Typeset`failedpods$$, Typeset`newq$$}]], \r\n     StandardForm],\r\n    ImageSizeCache->{648., {478., 483.}},\r\n    TrackedSymbols:>{Typeset`showpods$$, Typeset`failedpods$$}],\r\n   DynamicModuleValues:>{},\r\n   Initialization:>If[\r\n     Not[Typeset`initdone$$], Null; WolframAlphaClient`Private`doAsyncUpdates[\r\n       Hold[{\r\n        Typeset`pod1$$, Typeset`pod2$$, Typeset`pod3$$, Typeset`pod4$$, \r\n         Typeset`pod5$$, Typeset`pod6$$, Typeset`pod7$$}], \r\n       Typeset`asyncpods$$, \r\n       Dynamic[Typeset`failedpods$$]]; Typeset`asyncpods$$ = {}; \r\n     Typeset`initdone$$ = True],\r\n   SynchronousInitialization->False],\r\n  BaseStyle->{Deployed -> True},\r\n  DeleteWithContents->True,\r\n  Editable->False,\r\n  SelectWithContents->True]], \"Print\",\r\n CellMargins->{{20, 10}, {Inherited, Inherited}},\r\n CellChangeTimes->{3.611272040233429*^9}]\r\n}, Open  ]],\r\n\r\nCell[CellGroupData[{\r\n\r\nCell[BoxData[\r\n RowBox[{\"Plot3D\", \"[\", \r\n  RowBox[{\r\n   RowBox[{\r\n    RowBox[{\"Power\", \"[\", \r\n     RowBox[{\"x\", \",\", \" \", \"2\"}], \"]\"}], \" \", \"+\", \" \", \"y\", \" \", \"+\", \" \", \r\n    \"z\"}], \",\", \" \", \r\n   RowBox[{\"{\", \r\n    RowBox[{\"x\", \",\", \" \", \"0\", \",\", \" \", \"10\"}], \"}\"}], \" \", \",\", \" \", \r\n   RowBox[{\"{\", \r\n    RowBox[{\"y\", \",\", \" \", \"0\", \",\", \" \", \"10\"}], \"}\"}]}], \"]\"}]], \"Input\",\r\n CellChangeTimes->{{3.6112720578024335`*^9, 3.6112721112124887`*^9}}],\r\n\r\nCell[BoxData[\r\n Graphics3DBox[{},\r\n  Axes->True,\r\n  BoxRatios->{1, 1, 0.4},\r\n  Method->{\"RotationControl\" -> \"Globe\"},\r\n  PlotRange->{{0, 10}, {0, 10}, {0., 0.}},\r\n  PlotRangePadding->{\r\n    Scaled[0.02], \r\n    Scaled[0.02], \r\n    Scaled[0.02]}]], \"Output\",\r\n CellChangeTimes->{3.6112721144606743`*^9}]\r\n}, Open  ]],\r\n\r\nCell[CellGroupData[{\r\n\r\nCell[BoxData[\r\n RowBox[{\"Plot3D\", \"[\", \r\n  RowBox[{\r\n   RowBox[{\r\n    SuperscriptBox[\"x\", \"2\"], \"+\", \"y\", \"+\", \"z\"}], \",\", \r\n   RowBox[{\"{\", \r\n    RowBox[{\"x\", \",\", \"0\", \",\", \"10\"}], \"}\"}], \",\", \r\n   RowBox[{\"{\", \r\n    RowBox[{\"y\", \",\", \"0\", \",\", \"10\"}], \"}\"}], \",\", \r\n   RowBox[{\"Mesh\", \"\\[Rule]\", \"Automatic\"}], \",\", \r\n   RowBox[{\"MeshFunctions\", \"\\[Rule]\", \"Automatic\"}]}], \"]\"}]], \"Input\",\r\n NumberMarks->False],\r\n\r\nCell[BoxData[\r\n Graphics3DBox[{},\r\n  Axes->True,\r\n  BoxRatios->{1, 1, 0.4},\r\n  Method->{\"RotationControl\" -> \"Globe\"},\r\n  PlotRange->{{0, 10}, {0, 10}, {0., 0.}},\r\n  PlotRangePadding->{\r\n    Scaled[0.02], \r\n    Scaled[0.02], \r\n    Scaled[0.02]}]], \"Output\",\r\n CellChangeTimes->{3.6112721290995116`*^9}]\r\n}, Open  ]],\r\n\r\nCell[CellGroupData[{\r\n\r\nCell[BoxData[\r\n RowBox[{\"Plot3D\", \"[\", \r\n  RowBox[{\r\n   RowBox[{\r\n    SuperscriptBox[\"x\", \"2\"], \"+\", \"y\", \"+\", \"z\"}], \",\", \r\n   RowBox[{\"{\", \r\n    RowBox[{\"x\", \",\", \"0\", \",\", \"10\"}], \"}\"}], \",\", \r\n   RowBox[{\"{\", \r\n    RowBox[{\"y\", \",\", \"0\", \",\", \"10\"}], \"}\"}], \",\", \r\n   RowBox[{\"MeshStyle\", \"\\[Rule]\", \r\n    RowBox[{\"Directive\", \"[\", \r\n     RowBox[{\r\n      RowBox[{\"RGBColor\", \"[\", \r\n       RowBox[{\"0.05`\", \",\", \"1.`\", \",\", \"0.98`\"}], \"]\"}], \",\", \r\n      RowBox[{\"Opacity\", \"[\", \"0.11`\", \"]\"}], \",\", \r\n      RowBox[{\"AbsoluteThickness\", \"[\", \"1.555`\", \"]\"}]}], \"]\"}]}], \",\", \r\n   RowBox[{\"Mesh\", \"\\[Rule]\", \"Automatic\"}], \",\", \r\n   RowBox[{\"MeshFunctions\", \"\\[Rule]\", \"Automatic\"}]}], \"]\"}]], \"Input\",\r\n NumberMarks->False],\r\n\r\nCell[BoxData[\r\n Graphics3DBox[{},\r\n  Axes->True,\r\n  BoxRatios->{1, 1, 0.4},\r\n  Method->{\"RotationControl\" -> \"Globe\"},\r\n  PlotRange->{{0, 10}, {0, 10}, {0., 0.}},\r\n  PlotRangePadding->{\r\n    Scaled[0.02], \r\n    Scaled[0.02], \r\n    Scaled[0.02]}]], \"Output\",\r\n CellChangeTimes->{3.6112721409161873`*^9}]\r\n}, Open  ]],\r\n\r\nCell[CellGroupData[{\r\n\r\nCell[BoxData[\r\n RowBox[{\"Manipulate\", \"[\", \r\n  RowBox[{\r\n   RowBox[{\"Plot\", \"[\", \r\n    RowBox[{\r\n     RowBox[{\"Derivative\", \"[\", \r\n      RowBox[{\"Power\", \"[\", \r\n       RowBox[{\"x\", \",\", \" \", \"3\"}], \"]\"}], \"]\"}], \",\", \" \", \r\n     RowBox[{\"{\", \r\n      RowBox[{\"x\", \",\", \" \", \"0\", \",\", \" \", \"10\"}], \"}\"}]}], \"]\"}], \",\", \" \", \r\n   RowBox[{\"{\", \r\n    RowBox[{\"x\", \",\", \" \", \"0\", \",\", \" \", \"100\"}], \"}\"}]}], \"]\"}]], \"Input\",\r\n CellChangeTimes->{{3.611272144379386*^9, 3.61127220827404*^9}}],\r\n\r\nCell[BoxData[\r\n TagBox[\r\n  StyleBox[\r\n   DynamicModuleBox[{$CellContext`x$$ = 74.60000000000001, Typeset`show$$ = \r\n    True, Typeset`bookmarkList$$ = {}, Typeset`bookmarkMode$$ = \"Menu\", \r\n    Typeset`animator$$, Typeset`animvar$$ = 1, Typeset`name$$ = \r\n    \"\\\"untitled\\\"\", Typeset`specs$$ = {{\r\n      Hold[$CellContext`x$$], 0, 100}}, Typeset`size$$ = {360., {106., 110.}},\r\n     Typeset`update$$ = 0, Typeset`initDone$$, Typeset`skipInitDone$$ = \r\n    True, $CellContext`x$5214$$ = 0}, \r\n    DynamicBox[Manipulate`ManipulateBoxes[\r\n     1, StandardForm, \"Variables\" :> {$CellContext`x$$ = 0}, \r\n      \"ControllerVariables\" :> {\r\n        Hold[$CellContext`x$$, $CellContext`x$5214$$, 0]}, \r\n      \"OtherVariables\" :> {\r\n       Typeset`show$$, Typeset`bookmarkList$$, Typeset`bookmarkMode$$, \r\n        Typeset`animator$$, Typeset`animvar$$, Typeset`name$$, \r\n        Typeset`specs$$, Typeset`size$$, Typeset`update$$, Typeset`initDone$$,\r\n         Typeset`skipInitDone$$}, \"Body\" :> Plot[\r\n        Derivative[$CellContext`x$$^3], {$CellContext`x$$, 0, 10}], \r\n      \"Specifications\" :> {{$CellContext`x$$, 0, 100}}, \"Options\" :> {}, \r\n      \"DefaultOptions\" :> {}],\r\n     ImageSizeCache->{411., {152., 157.}},\r\n     SingleEvaluation->True],\r\n    Deinitialization:>None,\r\n    DynamicModuleValues:>{},\r\n    SynchronousInitialization->True,\r\n    UnsavedVariables:>{Typeset`initDone$$},\r\n    UntrackedVariables:>{Typeset`size$$}], \"Manipulate\",\r\n   Deployed->True,\r\n   StripOnInput->False],\r\n  Manipulate`InterpretManipulate[1]]], \"Output\",\r\n CellChangeTimes->{3.611272211487224*^9}]\r\n}, Open  ]]\r\n},\r\nWindowSize->{716, 833},\r\nWindowMargins->{{Automatic, 275}, {Automatic, 64}},\r\nFrontEndVersion->\"9.0 for Microsoft Windows (64-bit) (January 25, 2013)\",\r\nStyleDefinitions->\"Default.nb\"\r\n]\r\n(* End of Notebook Content *)\r\n\r\n(* Internal cache information *)\r\n(*CellTagsOutline\r\nCellTagsIndex->{}\r\n*)\r\n(*CellTagsIndex\r\nCellTagsIndex->{}\r\n*)\r\n(*NotebookFileOutline\r\nNotebook[{\r\nCell[CellGroupData[{\r\nCell[579, 22, 138, 3, 41, \"WolframAlphaLong\"],\r\nCell[720, 27, 194311, 3452, 971, \"Print\"]\r\n}, Open  ]],\r\nCell[CellGroupData[{\r\nCell[195068, 3484, 441, 11, 31, \"Input\"],\r\nCell[195512, 3497, 292, 10, 306, \"Output\"]\r\n}, Open  ]],\r\nCell[CellGroupData[{\r\nCell[195841, 3512, 404, 11, 55, \"Input\"],\r\nCell[196248, 3525, 292, 10, 306, \"Output\"]\r\n}, Open  ]],\r\nCell[CellGroupData[{\r\nCell[196577, 3540, 708, 18, 76, \"Input\"],\r\nCell[197288, 3560, 292, 10, 306, \"Output\"]\r\n}, Open  ]],\r\nCell[CellGroupData[{\r\nCell[197617, 3575, 472, 12, 31, \"Input\"],\r\nCell[198092, 3589, 1549, 32, 358, \"Output\"]\r\n}, Open  ]]\r\n}\r\n]\r\n*)\r\n\r\n(* End of internal cache information *)\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/PacletInfo.m",
    "content": "(* Paclet Info File *)\n\n(* created 2014/02/07*)\n\nPaclet[\n    Name -> \"Foobar\",\n    Version -> \"0.0.1\",\n    MathematicaVersion -> \"8+\",\n    Description -> \"Example of an automatically generated PacletInfo file.\",\n    Creator -> \"Chris Granade\",\n    Extensions -> \n        {\n            {\"Documentation\", Language -> \"English\", MainPage -> \"Guides/Foobar\"}\n        }\n]\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/Predicates.m",
    "content": "(* ::Package:: *)\n\nBeginPackage[\"Predicates`\"];\n\n\n(* ::Title:: *)\n(*Predicates*)\n\n\n(* ::Section::Closed:: *)\n(*Fuzzy Logic*)\n\n\n(* ::Subsection:: *)\n(*Documentation*)\n\n\nPossiblyTrueQ::usage=\"Returns True if the argument is not definitely False.\";\nPossiblyFalseQ::usage=\"Returns True if the argument is not definitely True.\";\nPossiblyNonzeroQ::usage=\"Returns True if and only if its argument is not definitely zero.\";\n\n\n(* ::Subsection:: *)\n(*Implimentation*)\n\n\nBegin[\"`Private`\"];\n\n\nPossiblyTrueQ[expr_]:=\\[Not]TrueQ[\\[Not]expr]\n\n\nPossiblyFalseQ[expr_]:=\\[Not]TrueQ[expr]\n\n\nEnd[];\n\n\n(* ::Section::Closed:: *)\n(*Numbers and Lists*)\n\n\n(* ::Subsection:: *)\n(*Documentation*)\n\n\nAnyQ::usage=\"Given a predicate and a list, retuns True if and only if that predicate is True for at least one element of the list.\";\nAnyElementQ::usage=\"Returns True if cond matches any element of L.\";\nAllQ::usage=\"Given a predicate and a list, retuns True if and only if that predicate is True for all elements of the list.\";\nAllElementQ::usage=\"Returns True if cond matches any element of L.\";\n\n\nAnyNonzeroQ::usage=\"Returns True if L is a list such that at least one element is definitely not zero.\";\nAnyPossiblyNonzeroQ::usage=\"Returns True if expr is a list such that at least one element is not definitely zero.\";\n\n\nRealQ::usage=\"Returns True if and only if the argument is a real number\";\nPositiveQ::usage=\"Returns True if and only if the argument is a positive real number\";\nNonnegativeQ::usage=\"Returns True if and only if the argument is a non-negative real number\";\nPositiveIntegerQ::usage=\"Returns True if and only if the argument is a positive integer\";\nNonnegativeIntegerQ::usage=\"Returns True if and only if the argument is a non-negative integer\";\n\n\nIntegerListQ::usage=\"Returns True if and only if the input is a list of integers.\";\nPositiveIntegerListQ::usage=\"Returns True if and only if the input is a list of positive integers.\";\nNonnegativeIntegerListQ::usage=\"Returns True if and only if the input is a list of non-negative integers.\";\nIntegerOrListQ::usage=\"Returns True if and only if the input is a list of integers or an integer.\";\nPositiveIntegerOrListQ::usage=\"Returns True if and only if the input is a list of positive integers or a positive integer.\";\nNonnegativeIntegerOrListQ::usage=\"Returns True if and only if the input is a list of positive integers or a positive integer.\";\n\n\nSymbolQ::usage=\"Returns True if argument is an unassigned symbol.\";\nSymbolOrNumberQ::usage=\"Returns True if argument is a number of has head 'Symbol'\";\n\n\n(* ::Subsection:: *)\n(*Implimentation*)\n\n\nBegin[\"`Private`\"];\n\n\nAnyQ[cond_, L_] := Fold[Or, False, cond /@ L]\n\n\nAnyElementQ[cond_,L_]:=AnyQ[cond,Flatten[L]]\n\n\nAllQ[cond_, L_] := Fold[And, True, cond /@ L]\n\n\nAllElementQ[cond_, L_] := Fold[And, True, cond /@ L]\n\n\nAnyNonzeroQ[L_]:=AnyElementQ[#!=0&,L]\n\n\nPossiblyNonzeroQ[expr_]:=PossiblyTrueQ[expr!=0]\n\n\nAnyPossiblyNonzeroQ[expr_]:=AnyElementQ[PossiblyNonzeroQ,expr]\n\n\nRealQ[n_]:=TrueQ[Im[n]==0];\n\n\nPositiveQ[n_]:=Positive[n];\n\n\nPositiveIntegerQ[n_]:=PositiveQ[n]\\[And]IntegerQ[n];\n\n\nNonnegativeQ[n_]:=TrueQ[RealQ[n]&&n>=0];\n\n\nNonnegativeIntegerQ[n_]:=NonnegativeQ[n]\\[And]IntegerQ[n];\n\n\nIntegerListQ[input_]:=ListQ[input]&&Not[MemberQ[IntegerQ/@input,False]];\n\n\nIntegerOrListQ[input_]:=IntegerListQ[input]||IntegerQ[input];\n\n\nPositiveIntegerListQ[input_]:=IntegerListQ[input]&&Not[MemberQ[Positive[input],False]];\n\n\nPositiveIntegerOrListQ[input_]:=PositiveIntegerListQ[input]||PositiveIntegerQ[input];\n\n\nNonnegativeIntegerListQ[input_]:=IntegerListQ[input]&&Not[MemberQ[NonnegativeIntegerQ[input],False]];\n\n\nNonnegativeIntegerOrListQ[input_]:=NonnegativeIntegerListQ[input]||NonnegativeIntegerQ[input];\n\n\nSymbolQ[a_]:=Head[a]===Symbol;\n\n\nSymbolOrNumberQ[a_]:=NumericQ[a]||Head[a]===Symbol;\n\n\nEnd[];\n\n\n(* ::Section:: *)\n(*Epilogue*)\n\n\nEndPackage[];\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/Predicates.wl",
    "content": "(* ::Package:: *)\n\nBeginPackage[\"Predicates`\"];\n\n\n(* ::Title:: *)\n(*Predicates*)\n\n\n(* ::Section::Closed:: *)\n(*Fuzzy Logic*)\n\n\n(* ::Subsection:: *)\n(*Documentation*)\n\n\nPossiblyTrueQ::usage=\"Returns True if the argument is not definitely False.\";\nPossiblyFalseQ::usage=\"Returns True if the argument is not definitely True.\";\nPossiblyNonzeroQ::usage=\"Returns True if and only if its argument is not definitely zero.\";\n\n\n(* ::Subsection:: *)\n(*Implimentation*)\n\n\nBegin[\"`Private`\"];\n\n\nPossiblyTrueQ[expr_]:=\\[Not]TrueQ[\\[Not]expr]\n\n\nPossiblyFalseQ[expr_]:=\\[Not]TrueQ[expr]\n\n\nEnd[];\n\n\n(* ::Section::Closed:: *)\n(*Numbers and Lists*)\n\n\n(* ::Subsection:: *)\n(*Documentation*)\n\n\nAnyQ::usage=\"Given a predicate and a list, retuns True if and only if that predicate is True for at least one element of the list.\";\nAnyElementQ::usage=\"Returns True if cond matches any element of L.\";\nAllQ::usage=\"Given a predicate and a list, retuns True if and only if that predicate is True for all elements of the list.\";\nAllElementQ::usage=\"Returns True if cond matches any element of L.\";\n\n\nAnyNonzeroQ::usage=\"Returns True if L is a list such that at least one element is definitely not zero.\";\nAnyPossiblyNonzeroQ::usage=\"Returns True if expr is a list such that at least one element is not definitely zero.\";\n\n\nRealQ::usage=\"Returns True if and only if the argument is a real number\";\nPositiveQ::usage=\"Returns True if and only if the argument is a positive real number\";\nNonnegativeQ::usage=\"Returns True if and only if the argument is a non-negative real number\";\nPositiveIntegerQ::usage=\"Returns True if and only if the argument is a positive integer\";\nNonnegativeIntegerQ::usage=\"Returns True if and only if the argument is a non-negative integer\";\n\n\nIntegerListQ::usage=\"Returns True if and only if the input is a list of integers.\";\nPositiveIntegerListQ::usage=\"Returns True if and only if the input is a list of positive integers.\";\nNonnegativeIntegerListQ::usage=\"Returns True if and only if the input is a list of non-negative integers.\";\nIntegerOrListQ::usage=\"Returns True if and only if the input is a list of integers or an integer.\";\nPositiveIntegerOrListQ::usage=\"Returns True if and only if the input is a list of positive integers or a positive integer.\";\nNonnegativeIntegerOrListQ::usage=\"Returns True if and only if the input is a list of positive integers or a positive integer.\";\n\n\nSymbolQ::usage=\"Returns True if argument is an unassigned symbol.\";\nSymbolOrNumberQ::usage=\"Returns True if argument is a number of has head 'Symbol'\";\n\n\n(* ::Subsection:: *)\n(*Implimentation*)\n\n\nBegin[\"`Private`\"];\n\n\nAnyQ[cond_, L_] := Fold[Or, False, cond /@ L]\n\n\nAnyElementQ[cond_,L_]:=AnyQ[cond,Flatten[L]]\n\n\nAllQ[cond_, L_] := Fold[And, True, cond /@ L]\n\n\nAllElementQ[cond_, L_] := Fold[And, True, cond /@ L]\n\n\nAnyNonzeroQ[L_]:=AnyElementQ[#!=0&,L]\n\n\nPossiblyNonzeroQ[expr_]:=PossiblyTrueQ[expr!=0]\n\n\nAnyPossiblyNonzeroQ[expr_]:=AnyElementQ[PossiblyNonzeroQ,expr]\n\n\nRealQ[n_]:=TrueQ[Im[n]==0];\n\n\nPositiveQ[n_]:=Positive[n];\n\n\nPositiveIntegerQ[n_]:=PositiveQ[n]\\[And]IntegerQ[n];\n\n\nNonnegativeQ[n_]:=TrueQ[RealQ[n]&&n>=0];\n\n\nNonnegativeIntegerQ[n_]:=NonnegativeQ[n]\\[And]IntegerQ[n];\n\n\nIntegerListQ[input_]:=ListQ[input]&&Not[MemberQ[IntegerQ/@input,False]];\n\n\nIntegerOrListQ[input_]:=IntegerListQ[input]||IntegerQ[input];\n\n\nPositiveIntegerListQ[input_]:=IntegerListQ[input]&&Not[MemberQ[Positive[input],False]];\n\n\nPositiveIntegerOrListQ[input_]:=PositiveIntegerListQ[input]||PositiveIntegerQ[input];\n\n\nNonnegativeIntegerListQ[input_]:=IntegerListQ[input]&&Not[MemberQ[NonnegativeIntegerQ[input],False]];\n\n\nNonnegativeIntegerOrListQ[input_]:=NonnegativeIntegerListQ[input]||NonnegativeIntegerQ[input];\n\n\nSymbolQ[a_]:=Head[a]===Symbol;\n\n\nSymbolOrNumberQ[a_]:=NumericQ[a]||Head[a]===Symbol;\n\n\nEnd[];\n\n\n(* ::Section:: *)\n(*Epilogue*)\n\n\nEndPackage[];\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/Problem12.m",
    "content": "(* ::Package:: *)\r\n\r\n(* Problem12.m *)\r\n(* Author: William Woodruff *)\r\n(* Problem: What is the value of the first triangle number to have over five hundred divisors? *)\r\n\r\nDo[If[Length[Divisors[Binomial[i + 1, 2]]] > 500, \r\n  Print[Binomial[i + 1, 2]]; Break[]], {i, 1000000}]\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/TestArithmetic.mt",
    "content": "Test[1 + 2, 3, TestID -> \"One plus two\"]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/TestString.mt",
    "content": "Test[\"a\" <> \"b\", \"ab\", TestID -> \"Concat \\\"a\\\" and \\\"b\\\"\"]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/TestSuite.mt",
    "content": "TestSuite[\n    { \"TestArithmetic.mt\"\n    , \"TestString.mt\"\n    }\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mathematica/UnitTest.wlt",
    "content": "BeginTestSection[\"Untitled-5\"]\n\nVerificationTest[(* 1 *)\n\tRotationMatrix[phi]\n\t,\n\tList[List[Cos[phi], Times[-1, Sin[phi]]], List[Sin[phi], Cos[phi]]]\t\n]\n\nVerificationTest[(* 2 *)\n\tTimes[1, Power[Plus[a, Times[-1, a]], -1]]\n\t,\n\tComplexInfinity\n\t,\n\t{Power::infy}\n]\n\nEndTestSection[]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/Contents.m",
    "content": "% CVX: A system for disciplined convex programming.\n%   CVX is a modeling framework for building, constructing, and solving\n%   disciplined convex programs. \n%\n%   cvx_setup        - Sets up and tests the cvx distribution.\n%   cvx_error        - Formats text for inclusion in error messages.\n%   cvx_license      - License processing for CVX Professional.\n%   cvx_startup      - Quietly add CVX to your MATLAB path (for startup).\n%   cvx_version      - Returns version and environment information for CVX.\n%\n%   commands/        - Top-level commands to create and control CVX.\n%   functions/       - Additional functions created specifically for CVX.\n%   keywords/        - Keywords for declaring variables and objectives\n%   lib/             - Code for internal use by CVX.\n%   sdpt3/           - The SDPT3 semidefinite-quadratic-linear solver.\n%   sedumi/          - The SeDuMi semidefinite-quadratic-linear solver.\n%   sets/            - CVX set definitions: nonnegative, semidefinite, etc.\n%   shims/           - Interface code to connect CVX to solvers.\n%   structures/      - Matrix structure definitions and utilities.\n%   doc/             - Documentation (PDF, HTML)\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/abs.m",
    "content": "function y = abs( x )\n\n%Disciplined convex/geometric programming information for ABS:\n%   ABS(X) is convex and nonmonotonic in X. Therefore, when used in\n%   DCPs, X must be affine. ABS(X) is not useful in DGPs, since all\n%   log-convex and log-concave expressions are already positive.\n\n%\n% Determine the expression types\n%\n\n% 0 : convex, concave, invalid\n% 1 : constant\n% 2 : real affine\n% 3 : complex affine\npersistent remap\nif isempty( remap ),\n    remap_1 = cvx_remap( 'constant' );\n    remap_2 = cvx_remap( 'real-affine' );\n    remap_3 = cvx_remap( 'complex-affine' );\n    remap_4 = cvx_remap( 'log-valid' );\n    remap = remap_1 + ( 2 * remap_2 + 3 * remap_3 + 4 * remap_4 ) .* ~remap_1;\nend\nv = remap( cvx_classify( x ) );\n\n%\n% Process each type of expression one piece at a time\n%\n\nvu = sort( v(:) );\nvu = vu([true;diff(vu)~=0]);\nnv = length( vu );\nsx = x.size_;\nif nv ~= 1,\n    y = cvx( sx, [] );\nend\nfor k = 1 : nv,\n\n    %\n    % Select the category of expression to compute\n    %\n\n    vk = vu( k );\n    if nv == 1,\n        xt = x;\n    else\n        t = v == vk;\n        xt = cvx_subsref( x, t );\n    end\n\n    %\n    % Perform the computations\n    %\n\n    switch vk,\n        case 0,\n            % Invalid\n            error( 'Disciplined convex programming error:\\n    Illegal operation: abs( {%s} ).', cvx_class( xt ) );\n        case 1,\n            % Constant\n            cvx_optval = cvx( builtin( 'abs', cvx_constant( xt ) ) );\n        case 2,\n            % Real affine\n            w = [];\n            st = size( xt );\n            cvx_begin\n                epigraph variable w( st )\n                { xt, w } == lorentz( st, 0 ); %#ok\n            cvx_end\n        case 3,\n            % Complex affine\n            w = [];\n            st = size( xt );\n            cvx_begin\n                epigraph variable w( st )\n                { xt, w } == complex_lorentz( st, 0 ); %#ok\n            cvx_end\n        case 4,\n            % log-affine, log-convex\n            cvx_optval = xt;\n        otherwise,\n            error( 'Shouldn''t be here.' );\n    end\n\n    %\n    % Store the results\n    %\n\n    if nv == 1,\n        y = cvx_optval;\n    else\n        y = cvx_subsasgn( y, t, cvx_optval );\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/blkdiag.m",
    "content": "function y = blkdiag( varargin )\n\n%Disciplined convex/geometric programming information for BLKDIAG:\n%   BLKDIAG imposes no convexity restrictions on its arguments.\n\nnv = 0;\nnz = 0;\nsz = [ 0, 0 ];\nfor k = 1 : nargin,\n    x  = cvx( varargin{k} );\n    sx = x.size_;\n    if length( sx ) > 2,\n        error( 'N-D matrices not supported.' );\n    end\n    b  = x.basis_;\n    sz = sz + sx;\n    nv = max( nv, size( b, 1 ) );\n    nz = nz + nnz( b );\n    varargin{k} = x;\nend\nbz = sparse( [], [], [], prod( sz ), nz, nv );\nroff = 0;\ncoff = 0;\nfor k = 1 : nargin,\n    x  = varargin{k};\n    b  = x.basis_;\n    sx = x.size_;\n    ndxr = ( roff : roff + sx( 1 ) - 1 )';\n    ndxr = ndxr( :, ones( 1, sx( 2 ) ) );\n    ndxc = ( coff : coff + sx( 2 ) - 1 );\n    ndxc = ndxc( ones( 1, sx( 1 ) ), : );\n    bz( 1 : size( b, 1 ), ndxc( : ) * sz( 1 ) + ndxr( : ) + 1 ) = b; %#ok\n    roff = roff + sx( 1 );\n    coff = coff + sx( 2 );\nend\ny = cvx( sz, bz );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/builtins.m",
    "content": "% CVX: Built-in operators and functions supported in CVX models.\n%   \n%    The following operators and functions are included with MATLAB but\n%    have either been verified to work properly within CVX models or have\n%    been extended with additional code to do so. In many cases, typing\n%       help cvx/<func>\n%    where <func> is one of the names listed below will provide specific\n%    help on the proper use of that item in CVX models---including any\n%    restrictions imposed by the DCP and DGP rulesets.\n%\n%    For a list of new functions created specifically for CVX, type\n%    \"help cvx/functions\".\n%\n% Computational operators:\n%    plus (+), uplus (unary +), minus (-), uminus (unary -), times (.*),\n%    mtimes (*), ldivide (.\\), mldivide (\\), rdivide (./), mrdivide (/), \n%    power (.^), mpower (^), subsref/subsasgn/end (subscripting),\n%    transpose (.'), ctranspose (')\n% Relational operators:\n%    eq (==), ge (>=), gt (>), le (<=), lt(<), ne (~=).\n% Linear/affine functions:\n%    blkdiag, cat, conj, conv, cumsum, diag, dot, find, flipdim, fliplr, \n%    flipud, hankel, horzcat, imag, ipermute, kron, permute, polyval, real,\n%    repmat, reshape, rot90, sparse, sum, toeplitz, tril, triu, vertcat\n% Nonlinear functions:\n%    abs, max, min, norm, prod, sqrt\n% Query functions:\n%    disp/display, end, isempty, isequal, length, isreal, ndims, nnz,\n%    numel, size, spy\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/cat.m",
    "content": "function y = cat( dim, varargin )\n\n%Disciplined convex/geometric programming information for CAT:\n%   CAT imposes no convexity restrictions on its arguments.\n\nif ~isnumeric( dim ) || any( size( dim ) ~= 1 ) || dim <= 0 || dim ~= floor( dim ),\n    error( 'First argument must be a dimension.' );\nend\n\n%\n% Quick exit\n%\n\nif nargin == 2,\n    y = varargin{1};\n    return\nend\n\n%\n% Determine the final size and check consistency\n%\n\nsz    = [];\nnz    = 1;\nnzer  = 0;\nnargs = 0;\nisr   = true;\nfor k = 1 : nargin - 1,\n    x = varargin{k};\n    sx = size( x );\n    if any( sx ),\n        x = cvx( x );\n        bx = x.basis_;\n        nz = max( nz, size( bx, 1 ) );\n        nzer = nzer + nnz( bx );\n        sx( end + 1 : dim ) = 1;\n        if isempty( sz ),\n            sz = sx;\n        elseif length( sx ) ~= length( sz ) || nnz( sx - sz ) > 1,\n            error( 'All dimensions but the one being concatenated (%d) must be equal.', dim );\n        else\n            sz( dim ) = sz( dim ) + sx( dim ); %#ok\n        end\n        if ~isreal( bx ), \n            isr = false; \n        end\n        if all( sx ),\n            nargs = nargs + 1;\n            varargin{nargs} = x;\n        end\n    end\nend\n\n%\n% Simple cases\n%\n\nif nargs == 0,\n    \n    if isempty( sz ), \n        sz( dim ) = nargin; \n    end\n    y = cvx( sz, [] );\n    return\n    \nelseif nargs == 1,\n    \n    y = varargin{1};\n    return\n    \nend\n\n%\n% Harder cases\n%\n\nmsiz = sz( dim );\nlsiz = prod( sz( 1 : dim - 1 ) );\nrsiz = prod( sz( dim + 1 : end ) );\npsz  = lsiz * msiz * rsiz;\nissp = cvx_use_sparse( [ nz, psz ], nzer, isr );\nfor k = 1 : nargs,\n    x = varargin{k}.basis_;\n    if issp ~= issparse(x),\n        if issp, \n            x = sparse(x); \n        else\n            x = full(x); \n        end\n    end\n    x( end + 1 : nz, end ) = 0; %#ok\n    if rsiz > 1,\n        x = reshape( x, numel(x) / rsiz, rsiz );\n    end\n    varargin{k} = x;\nend\nif rsiz > 1,\n    yb = builtin( 'cat', 1, varargin{1:nargs} );\nelse\n    yb = builtin( 'cat', 2, varargin{1:nargs} );\nend\nyb = reshape( yb, nz, psz );\n \n%\n% Create object\n%\n\ny = cvx( sz, yb );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/conj.m",
    "content": "function y = conj( x )\n\n%Disciplined convex/geometric programming information for CONJ:\n%   CONJ(X) imposes no convexity restrictions on its arguments. However,\n%   since CONJ(X)=X when X is real, it is only useful for complex\n%   affine expressions.\n\ny = cvx( x.size_, conj( x.basis_ ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/conv.m",
    "content": "function z = conv(x,y)\n\n%Disciplined convex programming information for CONV:\n%   Convolutions are a combination of both multiplications and additions.\n%   Therefore, to insure that the no-product rule is satisfied, CONV(X,Y)\n%   requires that either X or Y be constant. Further conditions may also\n%   apply depending on the exact content of X and Y. For example, if the\n%   elements of Y are all convex, then the convolution kernel X must be\n%   real, and all of the elements must have the same sign.\n%\n%Disciplined geometric programming information for TIMES:\n%   CONV(X,Y) requires that either X or Y be constant, and that the\n%   non-constant term be log-convex or log-affine. Strictly speaking,\n%   CONV(X,Y) where X and Y are both log-convex satisfies the DGP rulest,\n%   but this version does not support that scenario.\n\nnarginchk(2,2);\nsx = size(x);\nsy = size(y);\nif sum(sx~=1)>1 || sum(sy~=1)>1,\n    \n    error( 'Arguments must be vectors.' );\n    \nelseif any(sx==0) && any(sy==0),\n    \n    error( 'At least one argument must be non-empty.' );\n    \nelseif cvx_isconstant(x) || cvx_isconstant(y),    \n    \n    sz = sy;\n    sx = prod(sx);\n    sy = prod(sy);\n    nz = sx + sy - 1;\n    sz(sz>1) = nz;\n    if cvx_isconstant(x),\n        [xi,xj,xv] = find(cvx_constant(x));\n        yb         = cvx_basis(y);\n    else\n        [xi,xj,xv] = find(cvx_constant(y));\n        yb         = cvx_basis(x);\n    end\n    [yi,yj,yv] = find(yb);\n    nx = length(xv);\n    ny = length(yv);\n    ox = ones(1,nx);\n    yi = yi(:,ox);\n    xi = reshape( xi + xj - 2, 1, nx ); \n    yj = yj(:,ox) + xi(ones(ny,1),:);\n    yv = yv * reshape( xv, 1, nx );\n    z  = sparse( yi, yj, yv, size(yb,1), nz );\n    z  = cvx( sz, z );\n    if nnz( cvx_classify( z ) == 13 ),\n        error( 'Disciplined convex programming error:\\n   Illegal affine combination of convex/concave terms in convolution.' );\n    end\n    \nelse\n    \n    error( 'At least one argument must be constant.' );\n    \nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/ctranspose.m",
    "content": "function y = ctranspose( x )\n\n%Disciplined convex/geometric programming information for CTRANSPOSE (.):\n%   The complex conjugate transpose operation may be applied to CVX\n%   variables without restriction.\n\n%\n% Determine permutation\n%\n\ns = x.size_;\nif length( s ) > 2,\n    error( 'Transpose of an ND array is not defined.' );\nend\n\n%\n% Permute the data\n%\n\nndxs = 1 : prod( s );\nndx2 = reshape( ndxs, s ).';\nb = conj( x.basis_ );\ntry\n    b = b( :, ndx2 );\ncatch %#ok\n    ndxs( ndx2( : ).' ) = ndxs;\n    [ r, c, v ] = find( b );\n    b = sparse( r, ndxs( c ), v, size( b, 1 ), size( b, 2 ) );\n    clear r c v\nend\ny = cvx( size( ndx2 ), b );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/cumprod.m",
    "content": "function y = cumprod( x, dim )\r\n\r\n%   Disciplined geometric programming information for PROD:\r\n%      CUMPROD(X,DIM) is a vectorized version of multiplication,\r\n%      so in most cases it would be incompatible with DCPs. Therefore it\r\n%      has not been implemented to support DCPs. DGPs however support\r\n%      products more liberally. When PROD is used in a DCP, elements in\r\n%      each subvector must satisfy the corresponding combination rule\r\n%      for multiplication (see TIMES). For example, suppose that X looks\r\n%      like this:\r\n%         X = [ log-convex log-concave log-affine  ;\r\n%               log-affine log-concave log-concave ]\r\n%      Then CUMPROD(X,1) would be legal, but CUMPROD(X,2) would not, \r\n%      because the top row contains the product of log-convex and \r\n%      log-concave terms, in violation of the DGP ruleset.\r\n\r\nnarginchk(1,2);\r\n\r\n%\r\n% Size check\r\n%\r\n\r\ntry\r\n    ox = x;\r\n    if nargin < 2, dim = []; end\r\n    [ x, sx, sy, zx, zy, nx, nv, perm ] = cvx_reduce_size( x, dim ); %#ok\r\ncatch exc\r\n    error( exc.message );\r\nend\r\n    \r\n%\r\n% Quick exit for easy cases\r\n%\r\n\r\nif isempty( x ) || nx == 1,\r\n    y = ox;\r\n    return\r\nend\r\n\r\n%\r\n% Type check\r\n%\r\n\r\npersistent remap_1 remap_2 remap_3 remap_0\r\nif isempty( remap_3 ),\r\n    remap_0 = cvx_remap( 'zero' );\r\n    remap_1 = cvx_remap( 'constant' );\r\n    remap_2 = cvx_remap( 'log-convex' );\r\n    remap_3 = cvx_remap( 'log-concave' );\r\nend\r\nvx = cvx_reshape( cvx_classify( x ), sx );\r\nt0 = any( reshape( remap_0( vx ), sx ) );\r\nt1 = all( reshape( remap_1( vx ), sx ) );\r\nt2 = all( reshape( remap_2( vx ), sx ) ) | ...\r\n     all( reshape( remap_3( vx ), sx ) );\r\nt3 = t2 & t0;\r\nta = ( t1 | t3 ) + 2 * ( t2 & ~t3 );\r\nnu = sort( ta(:) );\r\nnu = nu([true;diff(nu)~=0]);\r\nnk = length( nu );\r\n\r\n%\r\n% Perform the computations\r\n%\r\n\r\nif nk > 1,\r\n    y = cvx( [ nx, nv ], [] );\r\nend\r\nfor k = 1 : nk,\r\n\r\n    if nk == 1,\r\n        xt = x;\r\n    else\r\n        tt = ta == nu( k );\r\n        xt = cvx_subsref( x, ':', tt );\r\n    end\r\n\r\n    switch nu( k ),\r\n        case 0,\r\n            error( 'Disciplined convex programming error:\\n   Invalid computation: cumprod( {%s} )', cvx_class( xt, true, true ) );\r\n        case 1,\r\n            yt = cvx( cumprod( cvx_constant( xt ) ) );\r\n        case 2,\r\n            yt = exp( cumsum( log( xt ) ) );\r\n        otherwise,\r\n            error( 'Shouldn''t be here.' );\r\n    end\r\n\r\n    if nk == 1,\r\n        y = yt;\r\n    else\r\n        y = cvx_subsasgn( y, ':', tt, yt );\r\n    end\r\n\r\nend\r\n\r\n%\r\n% Reverse the reshaping and permutation steps\r\n%\r\n\r\ny = reshape( y, sx );\r\nif ~isempty( perm ),\r\n    y = ipermute( y, perm );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/cumsum.m",
    "content": "function y = cumsum( x, dim )\n\n%Disciplined convex/geometric programming information for SUM:\n%   CUMSUM(X) and CUMSUM(X,DIM) are vectorized forms of addition. So \n%   when CUMSUM is used in a DCP or DGP, elements in each subvector \n%   must satisfy the corresponding combination rules for addition (see\n%   PLUS). For example, suppose that X looks like this:\n%      X = [ convex concave affine  ;\n%            affine concave concave ]\n%   Then CUMSUM(X,1) would be permittted, but CUMSUM(X,2) would not, \n%   because the top row contains the sum of convex and concave terms, in\n%   violation of the DCP ruleset. For DGPs, addition rules dictate that\n%   the elements of X must be log-convex or log-affine.\n\ns = x.size_;\nswitch nargin,\n    case 0,\n        error( 'Not enough input arguments.' );\n    case 1,\n        dim = cvx_default_dimension( s );\n    case 2,\n        if ~cvx_check_dimension( dim, false ),\n            error( 'Second argument must be a dimension.' );\n        end\nend\n\nif dim > length( s ) || s( dim ) <= 1,\n\n    y = x;\n\nelse\n\n    b = x.basis_;\n    sb = size( b );\n    need_perm = any( s( dim + 1 : end ) > 1 );\n    if need_perm,\n        ndxs = reshape( 1 : prod( s ), s );\n        ndxs = permute( ndxs, [ 1 : dim - 1, dim + 1 : length( s ), dim ] );\n        b = b( :, ndxs );\n    end\n    b = reshape( b, prod( sb ) / s( dim ), s( dim ) );\n    b = cumsum( b, 2 );\n    b = reshape( b, sb );\n    if need_perm,\n        b( :, ndxs ) = b;\n    end\n    y = cvx( s, b );\n    v = cvx_vexity( y );\n    if any( isnan( v( : ) ) ),\n        error( 'Disciplined convex programming error:\\n   Illegal addition encountered (e.g., {convex} + {concave}).', 1 ); %#ok\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/diag.m",
    "content": "function y = diag( v, k )\n\n%Disciplined convex/geometric programming information for DIAG:\n%   DIAG imposes no convexity restrictions on its arguments.\n\nswitch nargin,\n    case 0,\n        error( 'Not enough arguments.' );\n    case 1,\n        k = 0;\n    case 2,\n        if ~isnumeric( k ) || k ~= floor( k ),\n            error( 'Second argument must be an integer.' );\n        end\nend\n\ns = size( v );\nif length( s ) ~= 2,\n    error( 'First input must be 2D.' );\nend\n\nif k < 0,\n    absk = -k;\n    roff = absk;\n    coff = 0;\nelse\n    absk = +k;\n    roff = 0;\n    coff = absk;\nend\n\nif any( s == 1 ),\n    nn = prod( s );\n    nel = nn + roff + coff;\n    y = sparse( roff + 1 : roff + nn, coff + 1 : coff + nn, v, nel, nel );\nelseif roff >= s(1) || coff >= s(2),\n    y = sparse( 0, 1 );\nelse\n    nel = min( s(1) - roff, s(2) - coff );\n    nv = roff + ( coff - 1 ) * s(1) + ( 1 : nel ) * ( s(1) + 1 );\n    y = reshape( cvx_subsref( v, nv ), nel, 1 );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/disp.m",
    "content": "function disp( x, prefix )\nif nargin < 2,\n    prefix = '';\nend\ndisp( [ prefix, 'cvx ', cvx_class( x, true, true, true ), ' expression (', type( x ), ')' ] );\ndual = cvx_getdual( x );\nif ~isempty( dual ),\n    disp( [ prefix, '   tied to dual variable: ', dual.subs ] );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/end.m",
    "content": "function y = end( x, k, n )\n\n%Disciplined convex/geometric programming information for END:\n%   The use of END as an array subscript (e.g., X(:,end)) is identical\n%   with CVX variables as it is for numeric vectors and arrays.\n\nsz = size( x );\nnz = length( sz );\nif k > nz,\n    y = 1;\nelseif k < n || nz <= n,\n    y = sz( k );\nelse\n    y = prod( sz( k : end ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/eq.m",
    "content": "function a = eq( x, y )\n\n%Disciplined convex programming information for EQ (==):\n%   Both the left- and right-hand sides of an equality constraint must\n%   be affine (or constant). If either side of the constraint is complex,\n%   then the real and imaginary portions are constrained separately.\n%\n%Disciplined geometric programming information for EQ (>):\n%   Both the left- and right-hand sides of an equality constraint must\n%   be log-affine, which includes positive constants and monomials.\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '==' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/exp.m",
    "content": "function y = exp( x )\r\n\r\n%   Disciplined convex programming information:\r\n%       EXP(X) is convex and nondecreasing in X. When used in CVX\r\n%       expressions, X must be real. Typically, X must also be affine\r\n%       or convex; X can also be concave, but this produces a log-concave\r\n%       result with very limited usefulness.\r\n%\r\n%   Disciplined geometric programming information:\r\n%       EXP(X) is typically not used in geometric programs. However,\r\n%       EXP(X), where X is a monomial or posynomial, can be included in \r\n%       geometric programs wherever a posynomial would be appropriate.\r\n\r\nglobal cvx___\r\nnarginchk(1,1);\r\ncvx_expert_check( 'log', x );\r\n            \r\n%\r\n% Determine the expression types\r\n%\r\n\r\npersistent remap\r\nif isempty( remap ),\r\n    remap_1 = cvx_remap( 'real' );\r\n    remap_2 = cvx_remap( 'convex', 'concave' ) & ~remap_1;\r\n    remap = remap_1 + 2 * remap_2;\r\nend\r\nv = remap( cvx_classify( x ) );\r\n\r\n%\r\n% Process each type of expression one piece at a time\r\n%\r\n\r\nvu = sort( v(:) );\r\nvu = vu([true;diff(vu)~=0]);\r\nnv = length( vu );\r\nsx = x.size_;\r\nif nv ~= 1,\r\n    y = cvx( sx, [] );\r\nend\r\nfor k = 1 : nv,\r\n\r\n    %\r\n    % Select the category of expression to compute\r\n    %\r\n\r\n    vk = vu( k );\r\n    if nv == 1,\r\n        xt = x;\r\n    else\r\n        t = v == vk;\r\n        xt = cvx_subsref( x, t );\r\n    end\r\n\r\n    %\r\n    % Perform the computations\r\n    %\r\n\r\n    switch vk,\r\n        case 0,\r\n            % Invalid\r\n            error( 'Disciplined convex programming error:\\n    Illegal operation: exp( {%s} ).', cvx_class( xt ) );\r\n        case 1,\r\n            % Constant\r\n            xt = cvx( exp( cvx_constant( xt ) ) );\r\n        case 2,\r\n            % Affine, convex, concave\r\n            xt = sparsify( xt, 'exponential' );\r\n            [ rx, cx, vx ] = find( xt.basis_ );\r\n            tt = rx == 1;  rx( tt ) = [];\r\n            cc = cx( tt ); cx( tt ) = [];\r\n            vc = vx( tt ); % vx( tt ) = [];\r\n            exps = cvx___.exponential( rx, 1 );\r\n            tt = exps == 0;\r\n            if any( tt ),\r\n                n1 = unique( rx( tt ) );\r\n                n2 = newvar( cvx___.problems( end ).self, '', length( n1 ) );\r\n                [ n2, dummy ] = find( n2.basis_ ); %#ok\r\n                cvx___.exponential( n1, 1 ) = n2( : );\r\n                cvx___.logarithm( n2, 1 ) = n1( : );\r\n                cvx___.vexity( n2 ) = 1;\r\n                n2 = n2( cvx___.vexity( n1 ) < 0 );\r\n                if ~isempty( n2 ),\r\n                    cvx___.vexity( n2 ) = NaN;\r\n                    cvx___.nan_used = true;\r\n                    cvx___.canslack( n2 ) = +1;\r\n                end\r\n                exps = cvx___.exponential( rx, 1 );\r\n                cvx___.exp_used = true;\r\n            end\r\n            nb = size( xt.basis_, 2 );\r\n            bx = sparse( exps, cx, 1, full( max( exps ) ), nb );\r\n            if ~isempty( cc ),\r\n                bx = bx * diag(exp(sparse(cc,1,vc,nb,1)));\r\n            end\r\n            xt = cvx( xt.size_, bx );\r\n        otherwise,\r\n            error( 'Shouldn''t be here.' );\r\n    end\r\n\r\n    %\r\n    % Store the results\r\n    %\r\n\r\n    if nv == 1,\r\n        y = xt;\r\n    else\r\n        y = cvx_subsasgn( y, t, xt );\r\n    end\r\n\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/find.m",
    "content": "function [ i, j, v ] = find( x )\r\n\r\n%Disciplined convex/geometric programming information for FIND:\r\n%   When used in CVX models, FIND cannot deduce the numeric value of a\r\n%   CVX variable. So it returns the indices of elements that are \r\n%   \"structurally\" nonzero; i.e., that are not *identically* zero.\r\n%   This is similar to the concept of structural nonzeros in sparse\r\n%   matrix factorizations. To illustrate the distinction, consider:\r\n%      variable x(3);\r\n%      x(2) == 0;\r\n%      y = [x(1);0;x(3)];\r\n%   In this case, FIND(x) returns [1;2;3] even though x(2) has been set\r\n%   to zero in an equality constraint. (After all, the overall model may\r\n%   be infeasible, in which case x(2) is arguably not zero.) However,\r\n%   FIND(y) will return [1;3], because y(2) is identically zero.\r\n%\r\n%   When X is a CVX variable, the first two outputs of [I,J,V]=FIND(X) \r\n%   are constant, and the third is a CVX variable containing the \r\n%   structural nonzeros of X.\r\n%\r\n%   FIND(X) places no convexity restrictions on its argument.\r\n\r\nndxs = find( any( x.basis_, 1 ) );\r\nndxs = ndxs( : );\r\n\r\nif nargout > 1,\r\n    i = ndxs - 1;\r\n    j = floor( i / x.size_(1) ) + 1;\r\n    i = rem( i, x.size_(1) ) + 1;\r\nelse\r\n\ti = ndxs;\r\nend\t\r\n\r\nif nargout > 2,\r\n    v = reshape( cvx_subsref( x, ndxs ), length( ndxs ) );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/full.m",
    "content": "function z = full( x )\n\n%   Disciplined convex/geometric programming information for FULL (+):\n%      This is effectively a \"no-op\", and can be used in DCPs and DGPs\n%      without restrictions.\n\nz = x;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/ge.m",
    "content": "function a = ge( x, y )\n\n%Disciplined convex programming information for GE (>=):\n%   The right-hand side of a less-than constraint must be convex. The\n%   left-hand side must be concave. Of course, real constant and affine\n%   expressions are both convex and concave and can be used on either\n%   side as well.\n%\n%Disciplined geometric programming information for GE (>=):\n%   The right-hand side of a less-than constraint must be log-convex---\n%   including positive constants, monomials, posynomials, generalized\n%   posynomials, and products thereof. The left-hand side must be log-\n%   concave---including positive constants, monomials, reciprocals of\n%   log-convex expressions, and products thereof.\n%\n%Note that CVX does not distinguish between strict greater-than (>) and\n%greater-than-or-equal (<=) constraints; they are treated identically. \n%Feasible interior-point solvers tend to return points which satisfy\n%strict inequality, but not all solvers do.\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '>=' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/gt.m",
    "content": "function a = gt( x, y )\n\n%Disciplined convex programming information for GT (>):\n%   The right-hand side of a less-than constraint must be convex. The\n%   left-hand side must be concave. Of course, real constant and affine\n%   expressions are both convex and concave and can be used on either\n%   side as well.\n%\n%Disciplined geometric programming information for GT (>):\n%   The right-hand side of a less-than constraint must be log-convex---\n%   including positive constants, monomials, posynomials, generalized\n%   posynomials, and products thereof. The left-hand side must be log-\n%   concave---including positive constants, monomials, reciprocals of\n%   log-convex expressions, and products thereof.\n%\n%Note that CVX does not distinguish between strict greater-than (>) and\n%greater-than-or-equal (>=) constraints; they are treated identically. \n%Feasible interior-point solvers tend to return points which satisfy\n%strict inequality, but not all solvers do.\n\nwarning( 'CVX:StrictInequalities', cvx_error( 'The use of strict inequalities in CVX is strongly discouraged, because solvers treat them as non-strict inequalities. Please consider using \">=\" instead.', [66,75], false, '' ) );\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '>' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/hankel.m",
    "content": "function H = hankel(c,r)\n\n%Disciplined convex/geometric programming information for HANKEL:\n%   HANKEL imposes no convexity restrictions on its arguments. Instead\n%   of using the HANKEL function, however, consider creating a matrix\n%   variable using the 'hankel' or 'upper_hankel' keyword; e.g.\n%       variable X(5,5) hankel;\n%       variable Y(4,4) upper_hankel;\n\n%\n% Check arguments\n%\n\nnarginchk(1,2);\nif nargin < 2,\n    r = zeros(size(c));\nelse\n    temp = cvx_subsref( r, 1 ) - cvx_subsref( c, numel(c) );\n    if ~cvx_isnonzero( temp ),\n        warning('MATLAB:hankel:AntiDiagonalConflict',['Last element of ' ...\n               'input column does not match first element of input row. ' ...\n               '\\n         Column wins anti-diagonal conflict.'])\n    end\nend\n\n%\n% Compute indices and construct data vector\n%\n\nr  = vec( r );\nc  = vec( c );\nnc = length( c );\nnr = length( r );\nx  = [ c ; cvx_subsref( r, 2 : nr, 1 ) ];\n\n%\n% Construct matrix\n%\n\ncidx = ( 1 : nc )';\nridx = 0 : nr - 1;\nH    = cidx(:,ones(nr,1)) + ridx(ones(nc,1),:);\nH    = reshape( cvx_subsref( x, H( : ) ), size( H ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/horzcat.m",
    "content": "function y = horzcat( varargin )\ny = cat( 2, varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/imag.m",
    "content": "function y = imag( x )\n\n%Disciplined convex/geometric programming information for IMAG:\n%   IMAG(X) may be freely applied to any CVX expression. Of course,\n%   IMAG(X)=0 for all real expressions (including convex, concave,\n%   log-convex, and log-concave), so it is primarily useful in the\n%   complex affine case.\n\ny = cvx( x.size_, imag( x.basis_ ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/ipermute.m",
    "content": "function y = ipermute( x, order )\n\n%   Disciplined convex/geometric programming information for IPERMUTE:\n%      IPERMUTE(A,ORDER) imposes no convexity restrictions on A. ORDER\n%      must be constant.\n\n%\n% Determine the permutation\n%\n\ns = x.size_;\nndxs = 1 : prod( s );\nndx2 = ipermute( reshape( ndxs, s ), order );\n\n%\n% Permute the data\n%\n\nb = x.basis_;\ntry\n    b = b( :, ndx2 );\ncatch\n    ndxs( ndx2( : ).' ) = ndxs;\n    [ r, c, v ] = find( b );\n    b = sparse( r, ndxs( c ), v, size( b, 1 ), size( b, 2 ) );\n    clear r c v\nend\ny = cvx( size( ndx2 ), b );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/isreal.m",
    "content": "function y = isreal( x, full )\n\n%Disciplined convex/geometric programming information for ISREAL:\n%   ISREAL(X) may be freely applied to any CVX expression. It will\n%   return TRUE for all real affine, convex, concave, log-convex,\n%   and log-concave expressions, and FALSE for complex affine \n%   expressions.\n\ny = x.basis_;\nif nargin > 1 && full,\n    y = any( imag( y ), 1 );\nelse\n    y = isreal( x.basis_ ) | nnz(imag(x.basis_)) == 0;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/kron.m",
    "content": "function z = kron( x, y )\n\n%Disciplined convex/geometric programming information for KRON:\n%   KRON(X,Y) computes scalar products between every element of X and\n%   every element of Y. Each of those scalar products must obey the\n%   DCP or DGP ruleset.\n\n%\n% Check sizes and handle cases that can be computed\n% using non-Kronecker products\n%\n\nnarginchk(2,2);\nsx = size( x );\nsy = size( y );\nif length( sx ) > 2 || length( sy ) > 2,\n    error( 'N-D arrays not supported.' );\nelseif sx( 2 ) == 1 && ( sx( 1 ) == 1 || sy( 1 ) == 1 ),\n    z = mtimes( x, y );\n    return\nelseif sy( 2 ) == 1 && ( sy( 1 ) == 1 || sx( 1 ) == 1 ),\n    z = mtimes( y, x );\n    return\nelse\n    sz = sx .* sy;\nend\n\n%\n% Expand and multiply\n%\n\n[ ix, jx, vx ] = find(x);\n[ iy, jy, vy ] = find(y);\nif isempty( vx ) || isempty( vy ),\n    z = cvx( sparse( [], [], [], sz(1), sz(2) ) );\nelse\n    ix = ix(:); jx = jx(:); nx = numel(ix); kx = ones(nx,1);\n    iy = iy(:); jy = jy(:); ny = numel(iy); ky = ones(ny,1);\n    t  = sy(1) * ( ix - 1 )';\n    iz = t( ky, : ) + iy( :, kx );\n    t  = sy(2) * ( jx - 1 )';\n    jz = t( ky, : ) + jy( :, kx );\n    z  = reshape( vy, ny, 1 ) * reshape( vx, 1, nx );\n    z  = sparse( iz, jz, z, sz(1), sz(2) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/ldivide.m",
    "content": "function z = ldivide( x, y )\n\n%Disciplined convex programming information for LDIVIDE:\n%   For DCP purposes, the LDIVIDE division operator X.\\Y is equivalent to\n%   (1./X).*Y. The left-hand term must be constant and non-zero; and if the\n%   right-hand term is nonlinear, t constant must also be real.\n%\n%Disciplined geometric programming information for LDIVIDE:\n%   Terms in a left divide must have opposite log-curvature, so the\n%   following products are permitted:\n%      {log-convex} .\\ {log-concave}  {log-concave} .\\ {log-convex}\n%      {log-affine} .\\ {log-affine}\n%   Note that log-affine expressions are both log-convex and log-concave.\n%\n%For vectors, matrices, and arrays, these rules are verified indepdently\n%for each element.\n\nz = times( x, y, '.\\' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/le.m",
    "content": "function a = le( x, y )\n\n%   Disciplined convex programming information for LE (<=):\n%      The left-hand side of a less-than constraint must be convex. The\n%      right-hand side must be concave. Of course, real constant and \n%      affine expressions are both convex and concave and can be used on\n%      either side as well.\n%   \n%   Disciplined geometric programming information for LE (<=):\n%      The left-hand side of a less-than constraint must be log-convex,\n%      including positive constants, monomials, posynomials, generalized\n%      posynomials, and products thereof. The right-hand side must be \n%      log-concave---including positive constants, monomials, \n%      reciprocals of log-convex expressions, and products thereof.\n%   \n%   Note that CVX does not distinguish between strict less-than (<) and\n%   less-than-or-equal (<=) constraints; they are treated identically. \n%   Feasible interior-point solvers tend to return points which satisfy\n%   strict inequality, but not all solvers do.\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '<=' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/log.m",
    "content": "function y = log( x )\r\n\r\n%   Disciplined convex programming information:\r\n%       LOG(X) is concave and nondecreasing in X. When used in CVX\r\n%       expressions, X must be concave.\r\n%\r\n%   Disciplined geometric programming information:\r\n%       LOG(X) is typically not used in geometric programs. Technically it\r\n%       possible to do so in certain advanced cases, because monomials and\r\n%       posynomials are treated by CVX as log-affine and log-convex\r\n%       constructs, respectively. However, such usage is undocumented and\r\n%       will not be officially supported.\r\n\r\nglobal cvx___\r\nnarginchk(1,1);\r\ncvx_expert_check( 'log', x );\r\n\r\n%\r\n% Determine the expression types\r\n%\r\n\r\npersistent remap\r\nif isempty( remap ),\r\n    remap_0 = cvx_remap( 'nonpositive' );\r\n    remap_1 = cvx_remap( 'positive' );\r\n    remap_2 = cvx_remap( 'real-affine', 'concave' ) & ~remap_1 & ~remap_0;\r\n    remap_3 = cvx_remap( 'monomial' );\r\n    remap_4 = cvx_remap( 'posynomial' );\r\n    remap   = remap_1 + 2 * remap_2 + 3 * remap_3 + 4 * remap_4;\r\nend\r\nv = remap( cvx_classify( x ) );\r\n\r\n%\r\n% Process each type of expression one piece at a time\r\n%\r\n\r\nvu = sort( v(:) );\r\nvu = vu([true;diff(vu)~=0]);\r\nnv = length( vu );\r\nif nv ~= 1,\r\n    y = cvx( size( x ), [] );\r\nend\r\nfor k = 1 : nv,\r\n\r\n    %\r\n    % Select the category of expression to compute\r\n    %\r\n\r\n    vk = vu( k );\r\n    if nv == 1,\r\n        xt = x;\r\n    else\r\n        t = v == vk;\r\n        xt = cvx_subsref( x, t );\r\n    end\r\n\r\n    %\r\n    % Perform the computations\r\n    %\r\n\r\n    switch vk,\r\n        case 0,\r\n            % Invalid\r\n            error( 'Disciplined convex programming error:\\n    Illegal operation: log( {%s} ).', cvx_class( xt, true, true, true ) );\r\n        case 1,\r\n            % Positive constant\r\n            yt = cvx( log( cvx_constant( xt ) ) );\r\n        case 2,\r\n            % Affine, convex (invalid)\r\n            sx = xt.size_; %#ok\r\n            yt = [];\r\n            cvx_begin\r\n                hypograph variable yt( sx ) \r\n                exp( yt ) <= xt;            %#ok\r\n            cvx_end\r\n        case 3,\r\n            % Monomial\r\n            nb = prod( xt.size_ );\r\n            [ rx, cx, vx ] = find( xt.basis_ );\r\n            logs = cvx___.logarithm( rx, 1 );\r\n            tt = vx ~= 1; nt = sum( tt );\r\n            bx = sparse( [ ones( nt, 1 ) ; logs ], [ cx( tt ) ; cx ], [ log( vx( tt ) ) ; ones( nb, 1 ) ], full( max( logs ) ), size( xt.basis_, 2 ) );\r\n            yt = cvx( xt.size_, bx );\r\n        case 4,\r\n            % Posynomial\r\n            sx = xt.size_;\r\n            xt = xt.basis_;\r\n            rc = full( sum( xt ~= 0, 1 ) );\r\n            ru = sort( rc(:) );\r\n            ru = ru([true;diff(ru)~=0]);\r\n            nu = length( ru );\r\n            if nu ~= 1,\r\n                yt = cvx( sx, [] );\r\n            end\r\n            for kk = 1 : nu,\r\n                rk = ru( kk );\r\n                if nu == 1,\r\n                    xtt = xt;\r\n                else\r\n                    tt  = rc == rk;\r\n                    xtt = xt( :, tt );\r\n                end\r\n                [ rx, cx, vx ] = find( xtt ); %#ok\r\n                rx = rx( : ); vx = vx( : );\r\n                nq = length( vx );\r\n                vx = log( vx );\r\n                tz = rx ~= 1;\r\n                rx = cvx___.logarithm( rx( tz ), 1 );\r\n                vx = vx + cvx( nq, sparse( rx, find( tz ), 1, full( max( rx ) ), nq ) );\r\n                vx = reshape( vx, rk, nq / rk );\r\n                vx = log_sum_exp( vx );\r\n                if nu == 1,\r\n                    yt = reshape( vx, sx );\r\n                else\r\n                    yt = cvx_subsasgn( yt, tt, vx );\r\n                end\r\n            end\r\n        otherwise,\r\n            error( 'Shouldn''t be here.' );\r\n    end\r\n\r\n    %\r\n    % Store the results\r\n    %\r\n\r\n    if nv == 1,\r\n        y = yt;\r\n    else\r\n        y = cvx_subsasgn( y, t, yt );\r\n    end\r\n\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/lt.m",
    "content": "function a = lt( x, y )\n\n%   Disciplined convex programming information for LT (<):\n%      The left-hand side of a less-than constraint must be convex. The\n%      right-hand side must be concave. Of course, real constant and \n%      affine expressions are both convex and concave and can be used on\n%      either side as well.\n%   \n%   Disciplined geometric programming information for LT (<):\n%      The left-hand side of a less-than constraint must be log-convex,\n%      including positive constants, monomials, posynomials, generalized\n%      posynomials, and products thereof. The right-hand side must be \n%      log-concave---including positive constants, monomials, \n%      reciprocals of log-convex expressions, and products thereof.\n%   \n%   Note that CVX does not distinguish between strict less-than (<) and\n%   less-than-or-equal (<=) constraints; they are treated identically. \n%   Feasible interior-point solvers tend to return points which satisfy\n%   strict inequality, but not all solvers do.\n\nwarning( 'CVX:StrictInequalities', cvx_error( 'The use of strict inequalities in CVX is strongly discouraged, because solvers treat them as non-strict inequalities. Please consider using \"<=\" instead.', [66,75], false, '' ) );\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '<' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/max.m",
    "content": "function z = max( x, y, dim )\n\n%   Disciplined convex/geometric programming information:\n%       MAX is convex, log-log-convex, and nondecreasing in its first \n%       two arguments. Thus when used in disciplined convex programs, \n%       both arguments must be convex (or affine). In disciplined \n%       geometric programs, both arguments must be log-convex/affine.\n\npersistent remap remap_1 remap_2 remap_3\nnarginchk(1,3);\nif nargin == 2,\n\n    %\n    % max( X, Y )\n    %\n\n    sx = size( x );\n    sy = size( y );\n    xs = all( sx == 1 );\n    ys = all( sy == 1 );\n    if xs,\n        sz = sy;\n    elseif ys || isequal( sx, sy ),\n        sz = sx;\n    else\n        error( 'Array dimensions must match.' );\n    end\n\n    %\n    % Determine the computation methods\n    %\n\n\n    if isempty( remap ),\n        remap1 = cvx_remap( 'real' );\n        remap1 = remap1' * remap1;\n        remap2 = cvx_remap( 'log-valid' )' * cvx_remap( 'nonpositive' );\n        remap3 = remap2';\n        remap4 = cvx_remap( 'log-convex', 'real' );\n        remap4 = remap4' * remap4;\n        remap5 = cvx_remap( 'convex' );\n        remap5 = remap5' * remap5;\n        remap   = remap1 + ~remap1 .* ...\n            ( 2 * remap2 + 3 * remap3 + ~( remap2 | remap3 ) .* ...\n            ( 4 * remap4 + ~remap4 .* ( 5 * remap5 ) ) );\n    end\n    vx = cvx_classify( x );\n    vy = cvx_classify( y );\n    vr = remap( vx + size( remap, 1 ) * ( vy - 1 ) );\n    vu = sort( vr(:) );\n    vu = vu([true;diff(vu)~=0]);\n    nv = length( vu );\n\n    %\n    % The cvx multi-objective problem\n    %\n\n    xt = x;\n    yt = y;\n    if nv ~= 1,\n        z = cvx( sz, [] );\n    end\n    for k = 1 : nv,\n\n        %\n        % Select the category of expression to compute\n        %\n\n        if nv ~= 1,\n            t = vr == vu( k );\n            if ~xs,\n                xt = cvx_subsref( x, t );\n                sz = size( xt ); %#ok\n            end\n            if ~ys,\n                yt = cvx_subsref( y, t );\n                sz = size( yt ); %#ok\n            end\n        end\n\n        %\n        % Apply the appropriate computation\n        %\n\n        switch vu( k ),\n        case 0,\n            % Invalid\n            error( 'Disciplined convex programming error:\\n    Cannot perform the operation max( {%s}, {%s} )', cvx_class( xt, false, true ), cvx_class( yt, false, true ) );\n        case 1,\n            % constant\n            cvx_optval = cvx( max( cvx_constant( xt ), cvx_constant( yt ) ) );\n        case 2,\n            % max( log-valid, nonpositive ) (no-op)\n            cvx_optval = xt;\n        case 3,\n            % max( nonpositive, log-valid ) (no-op)\n            cvx_optval = yt;\n        case 4,\n            % posy\n            zt = [];\n            cvx_begin gp\n                epigraph variable zt( sz );\n                xt <= zt; %#ok\n                yt <= zt; %#ok\n            cvx_end\n        case 5,\n            % non-posy\n            zt = [];\n            cvx_begin\n                epigraph variable zt( sz );\n                xt <= zt; %#ok\n                yt <= zt; %#ok\n            cvx_end\n        otherwise,\n            error( 'Shouldn''t be here.' );\n        end\n\n        %\n        % Store the results\n        %\n\n        if nv == 1,\n            z = cvx_optval;\n        else\n            z = cvx_subsasgn( z, t, cvx_optval );\n        end\n\n    end\n\nelse\n\n    %\n    % max( X, [], dim )\n    %\n\n    if nargin > 1 && ~isempty( y ),\n        error( 'max with two matrices to compare and a working dimension is not supported.' );\n    end\n\n\t%\n\t% Size check\n\t%\n\n\ttry\n\t\tox = x;\n\t\tif nargin < 3, dim = []; end\n\t\t[ x, sx, sy, zx, zy, nx, nv, perm ] = cvx_reduce_size( x, dim ); %#ok\n\tcatch exc\n\t    error( exc.message );\n\tend\n\t\n\t%\n\t% Quick exit for empty array\n\t%\n\t\n\tif isempty( x ),\n\t\tz = zeros( zx );\n\t\treturn\n\tend\n\t\n    %\n    % Type check\n    %\n\n    if isempty( remap_3 ),\n        remap_1 = cvx_remap( 'real' );\n        remap_2 = cvx_remap( 'log-convex', 'real' );\n        remap_3 = cvx_remap( 'convex' );\n    end\n    vx = cvx_reshape( cvx_classify( x ), sx );\n    t1 = all( reshape( remap_1( vx ), sx ) );\n    t2 = all( reshape( remap_2( vx ), sx ) );\n    t3 = all( reshape( remap_3( vx ), sx ) );\n    t3 = t3 & ~( t1 | t2 );\n    t2 = t2 & ~t1;\n    ta = t1 + ( 2 * t2 + 3 * t3 ) .* ~t1;\n    nu = sort( ta(:) );\n    nu = nu([true;diff(nu)~=0]);\n    nk = length( nu );\n\n    %\n    % Quick exit for size 1\n    %\n\n    if nx == 1 && all( nu ),\n        z = ox;\n        return\n    end\n\n    %\n    % Perform the computations\n    %\n\n    if nk ~= 1,\n        z = cvx( [ 1, nv ], [] );\n    end\n    for k = 1 : nk,\n\n        if nk == 1,\n            xt = x;\n        else\n            tt = ta == nu( k );\n            xt = cvx_subsref( x, ':', tt );\n            nv = nnz( tt ); %#ok\n        end\n\n        switch nu( k ),\n            case 0,\n                error( 'Disciplined convex programming error:\\n   Invalid computation: max( {%s} )', cvx_class( xt, false, true ) );\n            case 1,\n                cvx_optval = max( cvx_constant( xt ), [], 1 );\n            case 2,\n\t            zt = [];\n                cvx_begin gp\n                    epigraph variable zt( 1, nv )\n                    xt <= ones(nx,1) * zt; %#ok\n                cvx_end\n            case 3,\n\t            zt = [];\n                cvx_begin\n                    epigraph variable zt( 1, nv )\n                    xt <= ones(nx,1) * zt; %#ok\n                cvx_end\n            otherwise,\n                error( 'Shouldn''t be here.' );\n        end\n\n        if nk == 1,\n            z = cvx_optval;\n        else\n            z = cvx_subsasgn( z, tt, cvx_optval );\n        end\n\n    end\n\n    %\n    % Reverse the reshaping and permutation steps\n    %\n\n    z = reshape( z, sy );\n    if ~isempty( perm ),\n        z = ipermute( z, perm );\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/min.m",
    "content": "function z = min( x, y, dim )\n\n%   Disciplined convex/geometric programming information:\n%       MAX is convex, log-log-concave, and nondecreasing in its first\n%       two arguments. Thus when used in disciplined convex programs, \n%       both arguments must be concave (or affine). In disciplined \n%       geometric programs, both arguments must be log-concave/affine.\n\npersistent remap remap_1 remap_2 remap_3\nnarginchk(1,3);\nif nargin == 2,\n\n    %\n    % min( X, Y )\n    %\n\n    sx = size( x );\n    sy = size( y );\n    xs = all( sx == 1 );\n    ys = all( sy == 1 );\n    if xs,\n        sz = sy;\n    elseif ys || isequal( sx, sy ),\n        sz = sx;\n    else\n        error( 'Array dimensions must match.' );\n    end\n\n    %\n    % Determine the computation methods\n    %\n\n    if isempty( remap ),\n        remap1 = cvx_remap( 'real' );\n        remap1 = remap1' * remap1;\n        remap2 = cvx_remap( 'log-concave' )' * cvx_remap( 'nonpositive' );\n        remap3 = remap2';\n        remap4 = cvx_remap( 'log-concave', 'real' );\n        remap4 = remap4' * remap4;\n        remap5 = cvx_remap( 'concave' );\n        remap5 = remap5' * remap5;\n        remap   = remap1 + ~remap1 .* ...\n            ( 2 * remap2 + 3 * remap3 + ~( remap2 | remap3 ) .* ...\n            ( 4 * remap4 + ~remap4 .* ( 5 * remap5 ) ) );\n    end\n    vx = cvx_classify( x );\n    vy = cvx_classify( y );\n    vr = remap( vx + size( remap, 1 ) * ( vy - 1 ) );\n    vu = sort( vr(:) );\n    vu = vu([true;diff(vu)~=0]);\n    nv = length( vu );\n\n    %\n    % The cvx multi-objective problem\n    %\n\n    xt = x;\n    yt = y;\n    if nv ~= 1,\n        z = cvx( sz, [] );\n    end\n    for k = 1 : nv,\n\n        %\n        % Select the category of expression to compute\n        %\n\n        if nv ~= 1,\n            t = vr == vu( k );\n            if ~xs,\n                xt = cvx_subsref( x, t );\n                sz = size( xt ); %#ok\n            end\n            if ~ys,\n                yt = cvx_subsref( y, t );\n                sz = size( yt ); %#ok\n            end\n        end\n\n        %\n        % Apply the appropriate computation\n        %\n\n        switch vu( k ),\n        case 0,\n            % Invalid\n            error( 'Disciplined convex programming error:\\n    Cannot perform the operation min( {%s}, {%s} )', cvx_class( xt, false, true ), cvx_class( yt, false, true ) );\n        case 1,\n            % constant\n            cvx_optval = cvx( min( cvx_constant( xt ), cvx_constant( yt ) ) );\n        case 2,\n            % min( log-concave, nonpositive ) (no-op)\n            cvx_optval = yt;\n        case 3,\n            % min( nonpositive, log-concave ) (no-op)\n            cvx_optval = xt;\n        case 4,\n            % posy\n            zt = [];\n            cvx_begin gp\n                hypograph variable zt( sz )\n                xt >= zt; %#ok\n                yt >= zt; %#ok\n            cvx_end\n        case 5,\n            % non-posy\n            zt = [];\n            cvx_begin\n                hypograph variable zt( sz )\n                xt >= zt; %#ok\n                yt >= zt; %#ok\n            cvx_end\n        otherwise,\n            error( 'Shouldn''t be here.' );\n        end\n\n        %\n        % Store the results\n        %\n\n        if nv == 1,\n            z = cvx_optval;\n        else\n            z = cvx_subsasgn( z, t, cvx_optval );\n        end\n\n    end\n\nelse\n\n    %\n    % min( X, [], dim )\n    %\n\n    if nargin > 1 && ~isempty( y ),\n        error( 'min with two matrices to compare and a working dimension is not supported.' );\n    end\n    \n\t%\n\t% Size check\n\t%\n\n\ttry\n\t\tox = x;\n\t\tif nargin < 3, dim = []; end\n\t\t[ x, sx, sy, zx, zy, nx, nv, perm ] = cvx_reduce_size( x, dim ); %#ok\n\tcatch exc\n\t    error( exc.message );\n\tend\n\t\n\t%\n\t% Quick exit for empty array\n\t%\n\t\n\tif isempty( x ),\n\t\tz = zeros( zx );\n\t\treturn\n\tend\n\n    %\n    % Type check\n    %\n\n    if isempty( remap_3 ),\n        remap_1 = cvx_remap( 'real' );\n        remap_2 = cvx_remap( 'log-concave', 'real' );\n        remap_3 = cvx_remap( 'concave' );\n    end\n    vx = cvx_reshape( cvx_classify( x ), sx );\n    t1 = all( reshape( remap_1( vx ), sx ) );\n    t2 = all( reshape( remap_2( vx ), sx ) );\n    t3 = all( reshape( remap_3( vx ), sx ) );\n    t3 = t3 & ~( t1 | t2 );\n    t2 = t2 & ~t1;\n    ta = t1 + ( 2 * t2 + 3 * t3 ) .* ~t1;\n    nu = sort( ta(:) );\n    nu = nu([true;diff(nu)~=0]);\n    nk = length( nu );\n\n    %\n    % Quick exit for size 1\n    %\n\n    if nx == 1 && all( nu ),\n        z = ox;\n        return\n    end\n\n    %\n    % Perform the computations\n    %\n\n    if nk ~= 1,\n        z = cvx( [ 1, nv ], [] );\n    end\n    for k = 1 : nk,\n\n        if nk == 1,\n            xt = x;\n        else\n            tt = ta == nu( k );\n            xt = cvx_subsref( x, ':', tt );\n            nv = nnz( tt ); %#ok\n        end\n\n        switch nu( k ),\n            case 0,\n                error( 'Disciplined convex programming error:\\n   Invalid computation: min( {%s} )', cvx_class( xt, false, true ) );\n            case 1,\n                cvx_optval = min( cvx_constant( xt ), [], 1 );\n            case 2,\n            \tzt = [];\n                cvx_begin gp\n                    hypograph variable zt( 1, nv )\n                    xt >= ones(nx,1) * zt; %#ok\n                cvx_end\n            case 3,\n            \tzt = [];\n                cvx_begin\n                    hypograph variable zt( 1, nv )\n                    xt >= ones(nx,1) * zt; %#ok\n                cvx_end\n            otherwise,\n                error( 'Shouldn''t be here.' );\n        end\n\n        if nk == 1,\n            z = cvx_optval;\n        else\n            z = cvx_subsasgn( z, tt, cvx_optval );\n        end\n\n    end\n\n    %\n    % Reverse the reshaping and permutation steps\n    %\n\n    z = reshape( z, sy );\n    if ~isempty( perm ),\n        z = ipermute( z, perm );\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/minus.m",
    "content": "function z = minus( x, y, cheat )\n\n%   Disciplined convex programming information for MINUS:\n%      Terms in a difference must have opposite curvature. Real affine\n%      expressions are both convex and concave, so they can be involved\n%      in a difference with any nonlinear expression. Complex affine (or\n%      constant) expressions, however, are neither, so they can only be\n%      involved in differences with other affine expressions. So, for\n%      example, the following differences are valid:\n%         {convex}-{concave}   {concave}-{convex}   {affine}-{affine}\n%      The following are not:\n%         {convex}-{concave}  {convex}-{complex constant}\n%      For vectors, matrices, and arrays, these rules are verified\n%      independently for each element.\n%   \n%   Disciplined geometric programming information for MINUS:\n%      Non-constant expressions (log-convex or log-concave) may not be\n%      involved in a subtraction in disciplined geometric programs.\n\nif nargin < 3, cheat = false; end\nz = plus( x, y, true, cheat );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/mldivide.m",
    "content": "function z = mldivide( x, y )\n\n%   Disciplined convex/geomtric programming information for MLDIVIDE:\n%      The MLDIVIDE operation X\\Y can be employed with X as a scalar. In\n%      that case, it is equivalent to the LDIVIDE operation X.\\Y, and \n%      must obey the same rules as outlined in the help for CVX/LDIVIDE.\n%   \n%      When X is a matrix, the MRDIVIDE operation X\\Y is equivalent to\n%      inv(X)*Y for both DCP and DGP purposes. The inv() operation is \n%      not supported for non-constant expressions, so X must be both \n%      constant and nonsingular. The resulting matrix multiplication \n%      must obey the same rules as outlined in the help for CVX/MTIMES.\n\nz = mtimes( x, y, 'ldivide' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/mpower.m",
    "content": "function z = mpower( x, y )\n\n%   Disciplined convex/geometric programming information for MPOWER (^):\n%      The CVX version of the matrix power function Z=X.^Y supports only\n%      the case where X and Y are scalars. In such instances, the rules\n%      are identical to those outlined in the help for CVX/POWER.\n\nif length( x ) == 1 && length( y ) == 1,\n    z = power( x, y );\nelse\n    error( 'Disciplined convex programming error:\\n    Matrix powers not permitted.', 1 ); %#ok\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/mrdivide.m",
    "content": "function z = mrdivide( x, y )\n\n%   Disciplined convex/geomtric programming information for MRDIVIDE:\n%      The MRDIVIDE operation X/Y is quite often employed with Y as a \n%      scalar. In that case, it is equivalent to the RDIVIDE operation\n%      X./Y, and must obey the same rules as outlined in the help for \n%      CVX/RDIVIDE.\n%   \n%      When Y is a matrix, the MRDIVIDE operation X/Y is equivalent to\n%      X*inv(Y) for both DCP and DGP purposes. The inv() operation is \n%      not supported for non-constant expressions, so Y must be both \n%      constant and nonsingular. The resulting matrix multiplication \n%      must obey the same rules as outlined in the help for CVX/MTIMES.\n\nz = mtimes( x, y, 'rdivide' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/mtimes.m",
    "content": "function z = mtimes( x, y, oper )\n\n%   Disciplined convex programming information for MTIMES:\n%      True matrix multiplications Z = X * Y---that is, where neither X\n%      nor Y is a scalar---require both multiplications and additions. \n%      For example, element (i,j) of Z is given by\n%         X(i,1) * Y(1,j) + X(i,2) * Y(2,j) + ... + X(i,k) * Y(k,j)\n%      Therefore, matrix multiplications must satisfy *both* the \n%      \"no-product\" rule of multiplication and the \"same curvature\" rule\n%      of addition. See the help for CVX/TIMES and CVX/PLUS, \n%      respectively, for individual descriptions of these rules.\n%   \n%      An exception is made to these general rules for quadratic forms.\n%      That is, two affine expressions may be multiplied together if the\n%      result can immediately be verified as a convex quadratic form. \n%      For example, the construction\n%         variable x(n)\n%         x' * Q * x  <= 1;\n%      would be permitted if Q is *constant* and positive semidefinite.\n%   \n%   Disciplined geometric programming information for TIMES:\n%      As mentioned above, true matrix multiplies Z = X * Y require both\n%      multiplications and additions. Since only log-convex terms can be\n%      summed, both X and Y must be elementwise log-convex/affine.\n\npersistent remap\nif nargin < 3, oper = 'times'; end\n\n%\n% Check sizes\n%\n\nsx = size( x );\nsy = size( y );\nif all( sx == 1 ) || all( sy == 1 ),\n    z = feval( oper, x, y );\n    return\nelseif length( sx ) > 2 || length( sy ) > 2,\n    error( 'Input arguments must be 2-D.' );\nelseif sx( 2 ) ~= sy( 1 ),\n    error( 'Inner matrix dimensions must agree.' );\nelse\n    sz = [ sx( 1 ), sy( 2 ) ];\nend\nnz = prod( sz );\n\n%\n% Check expression types\n%\n\nif cvx_isconstant( x ),\n    \n    xC = cvx_constant( x );\n    if nnz( isnan( xC ) ),\n        error( 'Disciplined convex programming error:\\n    Invalid numeric values (NaNs) may not be used in CVX expressions.', 1 ); %#ok\n    elseif cvx_isconstant( y ),\n        yC = cvx_constant( y );\n        if nnz( isnan( yC ) ),\n            error( 'Disciplined convex programming error:\\n    Invalid numeric values (NaNs) may not be used in CVX expressions.', 1 ); %#ok\n        end\n        z = feval( [ 'm', oper ], xC, yC );\n        if nnz( isnan( z ) ),\n            error( 'Disciplined convex programming error:\\n    This expression produced one or more invalid numeric values (NaNs).', 1 ); %#ok\n        end\n        z = cvx( z );\n        return\n    elseif isequal( oper, 'rdivide' ),\n        error( 'Disciplined convex programming error:\\n    Matrix divisor must be constant.', 1 ); %#ok\n    end\n    yA   = cvx_basis( y );\n    laff = true;\n    cnst = false;\n    raff = false;\n    quad = false;\n    posy = false;\n    vpos = false;\n    \nelseif cvx_isconstant( y ),\n\n    yC = cvx_constant( y );\n    if nnz( isnan( yC ) ),\n        error( 'Disciplined convex programming error:\\n    Invalid numeric values (NaNs) may not be used in CVX expressions.', 1 ); %#ok\n    elseif isequal( oper, 'ldivide' ),\n        error( 'Disciplined convex programming error:\\n    Matrix divisor must be constant.', 1 ); %#ok\n    end\n    xA   = cvx_basis( x );\n    raff = true;\n    laff = false;\n    quad = false;\n    cnst = false;\n    posy = false;\n    vpos = false;\n    \nelse\n\n    if isempty( remap ),\n        remap_0 = cvx_remap( 'zero' );\n        remap_1 = cvx_remap( 'nonzero', 'complex' );\n        temp    = ~( remap_0 | remap_1 );\n        remap_2 = cvx_remap( 'affine' ) & temp;\n        remap_4 = cvx_remap( 'log-convex' );\n        remap_5 = cvx_remap( 'log-concave' ) & ~remap_4;\n        remap_4 = remap_4 & temp;\n        remap_3 = cvx_remap( 'valid' ) & ~( remap_0 | remap_1 | remap_2 | remap_4 | remap_5 );\n        remap   = remap_1 + 2 * remap_2 + 3 * remap_3 + 4 * remap_4 + 5 * remap_5 - cvx_remap( 'invalid' );\n    end\n    vx = remap( cvx_classify( x ) );\n    vy = remap( cvx_classify( y ) );\n    xA = cvx_basis( x );\n    yA = cvx_basis( y );\n    xC = cvx_reshape( xA( 1, : ), sx );\n    yC = cvx_reshape( yA( 1, : ), sy );\n    vx = reshape( vx, sx );\n    vy = reshape( vy, sy );\n    cx = xC ~= 0;\n    cy = yC ~= 0;\n    ax = vx == 2;\n    ay = vy == 2;\n    px = vx == 4;\n    py = vy == 4;\n    gx = vx == 5;\n    gy = vy == 5;\n    quad = +ax * +ay;\n    if nnz( quad ) ~= 0,\n        if length( quad ) ~= 1,\n            error( 'Disciplined convex programming error:\\n    Only scalar quadratic forms can be specified in CVX\\n.', 1 ); %#ok\n        else\n            cx = cx & ~ax;\n            cy = cy & ~ay;\n            xC( ax ) = 0;\n            yC( ay ) = 0;\n        end\n    end\n    cnst = +cx * +cy; %#ok\n    laff = +cx * +( vy > 1 );\n    raff = +( vx > 1 ) * cy;\n    posy = +px * +py;\n    vpos = +gx * +gy;\n    if nnz( raff ) ~= 0,\n        raff = true;\n        cnst = false;\n    elseif nnz( laff ) ~= 0,\n        laff = true;\n        cnst = false;\n    else\n        laff = false;\n        raff = false;\n        cnst = true;\n    end\n    othr = +( vx > 1 | vx < 0 ) * +( vy > 1 | vy < 0 ) - quad - posy - vpos;\n    if nnz( othr ) ~= 0,\n        error( 'Disciplined convex programming error:\\n    Cannot perform the operation {%s}*{%s}', cvx_class( x ), cvx_class( y ) );\n    end\n    quad = nnz( quad ) ~= 0;\n    posy = nnz( posy ) ~= 0;\n    \nend\n\nfirst = true;\n\nif cnst,\n    switch oper,\n    case 'ldivide', z2 = xC \\ yC;\n    case 'rdivide', z2 = xC / yC;\n    otherwise,      z2 = xC * yC;\n    end\n    if first, z = z2; first = false; else z = z + z2; end %#ok\nend\n\nif raff,\n    % everything * constant\n    nA = size( xA, 1 );\n    z2 = cvx_reshape( xA, [ nA * sx( 1 ), sx( 2 ) ] );\n    if issparse( z2 ),\n        tt = any( z2, 2 );\n        if cvx_use_sparse( size( z2 ), nnz( tt ) * sx( 2 ), isreal( z2 ) & isreal( yC ) ),\n            z2 = z2( tt, : );\n        else\n            tt = [];\n        end\n    else\n        tt = [];\n    end\n    switch oper,\n    case 'rdivide', z2 = z2 / yC;\n    otherwise,      z2 = z2 * yC;\n    end\n    z2 = cvx_reshape( z2, [ nA, nz ], tt );\n    z2 = cvx( sz, z2 );\n    if first, z = z2; first = false; else z = z + z2; end\nend\n\nif laff,\n    % constant * everything\n    nA = size( yA, 1 );\n    t1 = reshape( 1 : prod( sy ), sy )';\n    t2 = reshape( 1 : prod( sz ), [ sz(2), sz(1) ] )';\n    z2 = yA; if raff, z2( 1, : ) = 0; end\n    z2 = cvx_reshape( z2, [ nA * sy( 2 ), sy( 1 ) ], [], t1 );\n    if issparse( z2 ),\n        tt = any( z2, 2 );\n        if cvx_use_sparse( size( z2 ), nnz( tt ) * sy( 1 ), isreal( z2 ) & isreal( xC ) ),\n            z2 = z2( tt, : );\n        else\n            tt = [];\n        end\n    else\n        tt = [];\n    end\n    switch oper,\n    case 'ldivide', z2 = z2 / xC.';\n    otherwise,      z2 = z2 * xC.';\n    end\n    z2 = cvx_reshape( z2, [ nA, nz ], tt, [], t2 );\n    z2 = cvx( sz, z2 );\n    if first, z = z2; first = false; else z = z + z2; end\nend\n\nif quad,\n    % affine * affine\n    tt = ax( : ) & ay( : );\n    xA = xA( :, tt ); xB = xA( 1, : ); xA( 1, : ) = 0;\n    yA = yA( :, tt ); yB = yA( 1, : ); yA( 1, : ) = 0;\n    xM = size( xA, 1 ); yM = size( yA, 1 );\n    if xM < yM, xA( yM, end ) = 0;\n    elseif yM < xM, yA( xM, end ) = 0; end\n    %\n    % Quadratic form test 1: See if x == a conj( y ) + b for some real a, b,\n    % so that the quadratic form involves a simple squaring (or sum of squares)\n    %\n    cyA   = conj( yA );\n    alpha = sum( sum( real( xA .* yA ) ) ) ./ max( sum( sum( cyA .* yA ) ), realmin );\n    if sum( sum( abs( xA - alpha * cyA ) ) ) <= 2 * eps * sum( sum( abs( xA ) ) ),\n        beta = xB - alpha * conj( yB );\n        yt = cvx( [ 1, size( yA, 2 ) ], yA ) + yB;\n        if isreal( yA ) && isreal( yB ) && isreal( beta ),\n            beta = ( 0.5 / alpha ) * beta;\n            z2 = alpha * ( sum_square( yt + beta ) - sum_square( beta ) );\n        elseif all( abs( beta ) <= 2 * eps * abs( xB ) ),\n            z2 = alpha * sum_square_abs( yt );\n        else\n            error( 'Disciplined convex programming error:\\n    Invalid quadratic form: product is not real.\\n', 1 ); %#ok\n        end\n    else\n        %\n        % Quadratic form test 2: Extract the quadratic coefficient matrix\n        % and test it for semidefiniteness\n        %\n        dx = find( any( xA, 2 ) | any( yA, 2 ) );\n        zb = length( dx );\n        cxA = conj( xA( dx, : ) );\n        cyA = cyA( dx, : );\n        P  = cxA * cyA.';\n        Q  = cxA * yB.' + cyA * xB.';\n        R  = xB * yB.';\n        P  = 0.5 * ( P + P.' );\n        if ~isreal( R ) || ~isreal( Q ) || ~isreal( P ),\n            error( 'Disciplined convex programming error:\\n   Invalid quadratic form: product is complex.', 1 ); %#ok\n        else\n            xx = cvx( zb, sparse( dx, 1 : zb, 1 ) );\n            [ z2, success ] = quad_form( xx, P, Q, R );\n            if ~success,\n                error( 'Disciplined convex programming error:\\n   Invalid quadratic form: neither convex nor concave.', 1 ); %#ok\n            end\n        end\n    end\n    if first, z = z2; first = false; else z = z + z2; end\nend\n\nif posy,\n    [ ix, jx ] = find( reshape( px, sx ) );\n    vx = log( cvx_subsref( x, px ) );\n    [ iy, jy ] = find( reshape( py, sy ) );\n    vy = log( cvx_subsref( y, py ) );\n    [ iz, jz ] = find( sparse( 1 : nnz(px), jx, 1 ) * sparse( iy, 1 : nnz(py), 1 ) );\n    z2 = exp( vec( cvx_subsref( vx, iz ) ) + vec( cvx_subsref( vy, jz ) ) );\n    z2 = sparse( ix(iz), jy(jz), z2, sz(1), sz(2) );\n    if first, z = z2; first = false; else z = z + z2; end\nend\n\nif vpos,\n    [ ix, jx ] = find( reshape( gx, sx ) );\n    vx = log( cvx_subsref( x, gx ) );\n    [ iy, jy ] = find( reshape( gy, sy ) );\n    vy = log( cvx_subsref( y, gy ) );\n    [ iz, jz ] = find( sparse( 1 : nnz(gx), jx, 1 ) * sparse( iy, 1 : nnz(gy), 1 ) );\n    z2 = exp( vec( cvx_subsref( vx, iz ) ) + vec( cvx_subsref( vy, jz ) ) );\n    z2 = sparse( ix(iz), jy(jz), z2, sz(1), sz(2) );\n    if first, z = z2; first = false; else z = z + z2; end %#ok\nend\n\n%\n% Check that the sums are legal\n%\n\nv = cvx_vexity( z );\nif any( isnan( v( : ) ) ),\n    temp = 'Disciplined convex programming error:';\n    tt = isnan( cvx_constant( z ) );\n    if any( tt ),\n        temp = [ temp, '\\n    This expression produced one or more invalid numeric values (NaNs).' ];\n    end\n    if any( isnan( v( ~tt ) ) ),\n        temp = [ temp, '\\n   Illegal affine combination of convex and/or concave terms detected.' ];\n    end\n    error( temp, 1 ); \nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/ne.m",
    "content": "function a = ne( x, y )\n\n%   Disciplined convex/geometric programming information for NE (~=):\n%      Not-equal constraints violate both the DCP and DGP rulesets. Thus\n%      not-equal expressions may only appear in CVX models when both \n%      sides are constant.\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '~=' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/nnz.m",
    "content": "function s = nnz( x )\n\n%   Disciplined convex/geometric programming information for NNZ:\n%      When used in CVX models, NNZ cannot deduce the numeric value of a\n%      CVX variable, so it returns the number of \"structurally\" nonzero\n%      elements; i.e., those that are not *identically* zero. This is\n%      similar to the concept of structural nonzeros in sparse matrix\n%      factorizations. To illustrate the distinction, consider:\n%         variable x(3);\n%         x(2) == 0;\n%         y = [x(1);0;x(3)];\n%      In this case, NNZ(x) returns 3, even though x(2) has been set to\n%      zero in an equality constraint. (After all, the overall model may\n%      be infeasible, in which case x(2) is arguably not zero.) However,\n%      NNZ(y) returns 2, because y(2) is identically zero.\n\ns = nnz( any( x.basis_, 1 ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/norm.m",
    "content": "function cvx_optval = norm( x, p )\n\n%   Disciplined convex programming information:\n%       NORM is convex, except when P<1, so an error will result if\n%       these non-convex \"norms\" are used within CVX expressions. NORM \n%       is nonmonotonic, so its input must be affine.\n\n%\n% Argument map\n%\n\npersistent remap1 remap2\nif isempty( remap2 ),\n    remap1 = cvx_remap( 'log-convex' );\n    remap2 = cvx_remap( 'affine', 'log-convex' );\nend\n\n%\n% Check arguments\n%\n\nnarginchk(1,2);\nif nargin < 2,\n    p = 2;\nelseif ~isequal( p, 'fro' ) && ( ~isnumeric( p ) || ~isreal( p ) || p < 1 ),\n    error( 'Second argument must be a real number between 1 and Inf, or ''fro''.' );\nend\nif ndims( x ) > 2, %#ok\n    error( 'norm is not defined for N-D arrays.' );\nend\n\n[m,n] = size(x);\nif m == 1 || n == 1 || isequal( p, 'fro' ),\n    \n    %\n    % Vector norms\n    %\n    \n    if isempty( x ),\n        cvx_optval = cvx( 0 );\n        return\n    end\n    if isequal( p, 'fro' ),\n        p = 2;\n    end\n    x = svec( x, p );\n    if length( x ) == 1,\n        p = 1;\n    end\n    xc = cvx_classify( x );\n    if ~all( remap2( xc ) ),\n        error( 'Disciplined convex programming error:\\n    Cannot perform the operation norm( {%s}, %g )', cvx_class( x ), p );\n    end\n    switch p,\n        case 1,\n            cvx_optval = sum( abs( x ) );\n        case Inf,\n            cvx_optval = max( abs( x ) );\n        otherwise,\n            tt = remap1( xc );\n            if all( tt ),\n                cvx_optval = ( sum( x .^ p ) ) .^ (1/p);\n            else\n                if nnz( tt ) > 1,\n                    tt = tt ~= 0;\n                    xx = cvx_subsref( x, tt );\n                    xx = ( sum( xx .^ p ) ) .^ (1/p);\n                    x  = [ cvx_subsref( x, ~tt ) ; cvx_accept_convex( xx ) ];\n                end\n                n = length( x );\n                if p == 2,\n                    z = [];\n                    cvx_begin\n                        epigraph variable z\n                        { x, z } == lorentz( n, [], ~isreal( x ) ); %#ok\n                    cvx_end\n                else\n                    if isreal( x ),\n                        cmode = 'abs';\n                    else\n                        cmode = 'cabs';\n                    end\n                    y = []; z = [];\n                    cvx_begin\n                        epigraph variable z\n                        variable y( n )\n                        { [ y, z*ones(n,1) ], x } == geo_mean_cone( [n,2], 2, [1/p,1-1/p], cmode ); %#ok\n                        sum( y ) == z; %#ok\n                    cvx_end\n                end\n            end\n    end\n    \nelse\n    \n    %\n    % Matrix norms\n    %\n    \n    if ~cvx_isaffine( x ),\n        error( 'Disciplined convex programming error:\\n    Cannot perform the operation norm( {%s}, %g )\\n   when the first argument is a matrix.', cvx_class( xt ), p );\n    end\n    switch p,\n        case 1,\n            cvx_optval = max( sum( abs( x ), 1 ), [], 2 );\n        case Inf,\n            cvx_optval = max( sum( abs( x ), 2 ), [], 1 );\n        case 2,\n            cvx_optval = sigma_max( x );\n        otherwise,\n            error( 'The only matrix norms available are 1, 2, Inf, and ''fro''.' );\n    end\n    \nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/permute.m",
    "content": "function y = permute( x, order )\n\n%   Disciplined convex/geometric programming information for PERMUTE:\n%      PERMUTE(A,ORDER) imposes no convexity restrictions on A. ORDER\n%      must be constant.\n\n%\n% Determine the permutation\n%\n\ns = x.size_;\nndxs = 1 : prod( s );\nndx2 = permute( reshape( ndxs, s ), order );\n\n%\n% Permute the data\n%\n\nb = x.basis_;\ntry\n    b = x.basis_( :, ndx2 );\ncatch %#ok\n    ndxs( ndx2( : ).' ) = ndxs;\n    [ r, c, v ] = find( b );\n    b = sparse( r, ndxs( c ), v, size( b, 1 ), size( b, 2 ) );\n    clear r c v\nend\ny = cvx( size( ndx2 ), b );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/plus.m",
    "content": "function z = plus( x, y, isdiff, cheat )\n\n%   Disciplined convex programming information for PLUS:\n%      Both terms in a sum must have the same curvature. Real affine\n%      expressions are both convex and concave, so they can be added to\n%      any nonlinear expressions. Complex affine (or constant)\n%      expressions, however, can only be added to other affine \n%      expressions. So, for example, the following sums are valid:\n%         {convex}+{convex}   {concave}+{concave}   {affine}+{affine}\n%      The following are not:\n%         {convex}+{concave}  {convex}+{complex constant}\n%   \n%   Disciplined geometric programming information for PLUS:\n%      Only log-convex terms may be summed; this includes positive \n%      constants, monomials, posynomials, and generalized posynomials.\n%   \n%   For vectors, matrices, and arrays, these rules are verified \n%   indepdently for each element.\n\n%\n% Default arguments\n%\n\npersistent remap_plus remap_minus\nif nargin < 4,\n    if nargin < 3,\n        isdiff = false;\n    end\n    cheat = false;\nend\n\n%\n% Check sizes\n%\n\nsx = size( x );\nsy = size( y );\nxs = all( sx == 1 );\nys = all( sy == 1 );\nif xs,\n    sz = sy;\nelseif ys,\n    sz = sx;\nelseif ~isequal( sx, sy ),\n    error( 'Matrix dimensions must agree.' );\nelse\n    sz = sx;\nend\n\n%\n% Check vexity\n%\n\nif ~cheat,\n    if isempty( remap_plus ),\n        temp0  = cvx_remap( 'affine'  );\n        tempc  = cvx_remap( 'complex', 'complex-affine' );\n        temp1  = cvx_remap( 'convex'  ) & ~temp0;\n        temp1c = temp1 + tempc;\n        temp2  = cvx_remap( 'concave' ) & ~temp0;\n        temp2c = temp2 + tempc;\n        temp3  = temp1' * temp2c + temp2' * temp1c;\n        temp1  = temp1' * temp1c;\n        temp2  = temp2' * temp2c;\n        temp4  = ( cvx_remap( 'log-concave' ) & ~cvx_remap( 'log-affine' ) )' * +(~cvx_remap( 'zero' )) | ...\n                   cvx_remap( 'invalid' )' * cvx_remap( 'valid', 'invalid' );\n        temp4 = temp4 | temp4';\n        remap_minus = temp4 | temp1 | temp1' | temp2 | temp2';\n        remap_plus  = temp4 | temp3 | temp3';\n    end\n    vx = cvx_classify( x );\n    vy = cvx_classify( y );\n    bad = vx + size( remap_plus, 1 ) * ( vy - 1 );\n    if isdiff,\n        bad = remap_minus( bad );\n    else\n        bad = remap_plus( bad );\n    end\n    if nnz( bad ),\n        if ~xs, x = cvx_subsref( x, bad ); end\n        if ~ys, y = cvx_subsref( y, bad ); end\n        if isdiff, op = '-'; else op = '+'; end\n        error( 'Disciplined convex programming error:\\n   Illegal operation: {%s} %s {%s}', cvx_class( x, false, true ), op, cvx_class( y, false, true ) );\n    end\nend\n\n%\n% Apply operation, stretching basis matrices as needed\n%\n\nif any( sz == 0 ),\n    bz = sparse( 1, 0 );\nelse\n    x  = cvx( x );\n    y  = cvx( y );\n    bx = x.basis_;\n    by = y.basis_;\n    if isdiff,\n        by = -by;\n    end\n    if xs && ~ys,\n        nz = prod( sz );\n        bx = bx( :, ones( 1, nz ) );\n    elseif ys && ~xs,\n        nz = prod( sz );\n        by = by( :, ones( 1, nz ) );\n    end\n    [ nx, nv ] = size( bx );\n    ny = size( by, 1 );\n    if nx < ny,\n        if issparse( by ), bx = sparse( bx ); end\n        bx = [ bx ; sparse( ny - nx, nv ) ];\n    elseif ny < nx,\n        if issparse( bx ), by = sparse( by ); end\n        by = [ by ; sparse( nx - ny, nv ) ];\n    end\n    bz = bx + by;\nend\n\n%\n% Construct result\n%\n\nz = cvx( sz, bz );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/polyval.m",
    "content": "function y = polyval( p, x )\r\n\r\n%   Disciplined convex/geometric programming information for POLYVAL:\r\n%      POLYVAL can be used with CVX variables in two ways:\r\n%      -- If P is constant and X is a variable, then POLYVAL(P,X)\r\n%         represents a polynomial function of X, p(X). If p(X) is affine\r\n%         then the basic  DCP or DCP rules for sums and products apply.\r\n%         If P is nonlinear then:\r\n%         -- for DCPs, the polynomial must be convex or concave, and X\r\n%            must be affine (such polynomials cannot be monotonic).\r\n%         -- for DGPs, the elements of P must be nonnegative, in which\r\n%            case p(X) is nondecreasing, so X must be log-convex.\r\n%      -- If X is a constant and P is a variable, then POLYVAL(P,X)\r\n%         performs a weighted sum of the elements of P. The weights are,\r\n%         of course, [X^N,X^(N-1),...,X,1]. As in the affine case above,\r\n%         then standard DCP or DGP rules for sums and products apply.\r\n\r\nsp = size( p );\r\nif isempty( p ),\r\n    p = zeros( 1, 0 );\r\nelseif length( sp ) > 2 || ~any( sp == 1 ),\r\n    error( 'First argument must be a vector.' );\r\nend\r\nsx = size(x);\r\n\r\npersistent remap\r\nif isempty( remap ),\r\n    remap_1 = cvx_remap( 'real-affine' );\r\n    remap_2 = cvx_remap( 'log-convex' );\r\n    remap = remap_1 + 2 * remap_2;\r\nend\r\n\r\nif cvx_isconstant( p ),\r\n    p = cvx_constant( p );\r\n    if cvx_isconstant( x ),\r\n        y = cvx( polyval( p, cvx_constant( x ) ) );\r\n        return\r\n    end\r\n    if any( isinf( p ) | isnan( p ) ),\r\n        error( 'Inf and NaN not accepted here.' );\r\n    end\r\n    ndxs = find( p );\r\n    if isempty( ndxs ),\r\n        y = zeros( sx );\r\n        return\r\n    end\r\n    for k = ndxs(:)',\r\n        pt = p( k : end );\r\n        if ~any( isinf( pt ./ pt(1) ) ),\r\n            p = pt;\r\n            break;\r\n        end\r\n    end\r\n    n = length( p );\r\n    switch length( p ),\r\n        case 0,\r\n            % Zero\r\n            y = zeros(sx);\r\n        case 1,\r\n            % Constant\r\n            y = cvx( p(1) * ones(sx) );\r\n        case 2,\r\n            % Affine\r\n            y = p(1) * x + p(2);\r\n        otherwise,\r\n            vu = remap(cvx_classify(x));\r\n            p = reshape( p, n, 1 );\r\n            t0 = vu == 0;\r\n            if any( t0 ),\r\n                error( 'Disciplined convex programming error:\\n    Illegal operation: polyval( p, {%s} ).', cvx_class( cvx_subsref( x, t0 ), false, true ) );\r\n            end\r\n            t1 = vu == 1;\r\n            if any( t1 ),\r\n                pd = roots( (n-2:-1:1).*(n-1:-1:2).*p(1:end-2,:)' );\r\n                pd = pd( imag(pd) == 0 );\r\n                if ~isempty( pd ),\r\n                    pr = diff( [ 0, find(diff(sort(pd))~=0), length(pd) ] );\r\n                    if any( rem( pr, 2 ) ),\r\n                        error( 'Polynomials in DCPs must be affine, convex, or concave.' );\r\n                    end\r\n                end\r\n            end\r\n            t2 = vu == 2;\r\n            if any( t2 ) && any( p < 0 ),\r\n                error( 'Polynomials in DGPs must have nonnegative coefficients.' );\r\n            end\r\n            if any( t2 ),\r\n                if all( t2 ),\r\n                    y = x;\r\n                else\r\n                    y = cvx_subsref( x, t2 );\r\n                end\r\n                ny = numel(y);\r\n                y = reshape( y, ny, 1 );\r\n                q = find( p(1:end-2) );\r\n                y = ( ( y * ones(1,length(q)) ) .^ ( ones(ny,1) * (n-q)' ) ) * p(q,:) + p(end-1) * y + p(end);\r\n                if all( t2 ),\r\n                    y = reshape( y, sx );\r\n                else\r\n                    y = cvx_subsasgn( x, t2, y );\r\n                end\r\n            end\r\n            if all( t1 ),\r\n                y = poly_env( p, x );\r\n            elseif any( t1 ),\r\n                y = cvx_subsasgn( y, t1, poly_env( p, cvx_subsref( x, t1 ) ) );\r\n            end\r\n    end\r\n    \r\nelseif cvx_isconstant( x ),\r\n    \r\n    n = length( p );\r\n    [ ii, jj, vv ] = find( p );\r\n    jj = ii + jj - 1;\r\n    nv = length(vv);\r\n    nx = prod( sx );\r\n    y = reshape( x, nx, 1 ) * ones( 1, nv );\r\n    y = y .^ ( ones( nx, 1 ) * (n-jj(:))' );\r\n    y = reshape( y * reshape( vv, nv, 1 ), sx );\r\n    \r\nelse\r\n    \r\n    error( 'At least one of the arguments must be constant.' );\r\n    \r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/power.m",
    "content": "function z = power( x, y )\n\n%   Disciplined convex programming information for POWER (.^):\n%      When used in CVX expressions, either X or Y must be constant. Only\n%      certain convex or concave branches are accepted as valid:\n%         --- if both X and Y are constant, then Z = X.^Y is interpreted\n%             precisely as the MATLAB built-in version.\n%         --- if Y is constant and 0 < Y < 1, then Z = X.^Y is concave and\n%             nondecreasing in X. Therefore, X must be concave, and is\n%             implicitly constrained to be nonnegative.\n%         --- if Y is constant and Y == 1, then Z = X.\n%         --- if Y is constant and a positive even integer, then Z = X.^Y\n%             is convex and nonmonotonic in X. Therefore, X must be affine.\n%         --- if Y is constant and Y > 1, but *not* an integer, then \n%             Z = X.^Y is convex and nonmonotonic in X. Therefore, X must\n%             be affine (and real), and is implicitly constrained to be\n%             nonnegative.\n%      In expert mode, additional cases are handled:\n%         --- if X is constant and 0 < X < 1, then Z = X.^Y is convex and\n%             nonincreasing in X. Therefore, Y must be concave.\n%         --- if X is constant and X == 1, then Z = 1.\n%         --- if X is constant and X > 1, then Z = X.^Y is convex and\n%             nondecreasing in X. Therefore, Y must be convex.\n%      All other combinations are rejected as invalid. For instance, if Y\n%      is an odd integer, then X .^ Y is neither convex nor concave, so it\n%      is rejected. In such cases, consider using POW_P, POW_POS, or\n%      POW_ABS instead.\n%             \n%   Disciplined geometric programming information for POWER (.^):\n%      In disciplined geometric programs, the power operation Z=X.^Y is\n%      valid only if Y is a real constant. There are no restrictions on\n%      X. Note that a negative exponent Y reverses curvature; that is, Z\n%      is log-convex if X is log-concave, and vice versa.\n\n%\n% Check sizes\n%\n\nsx = size( x ); xs = all( sx == 1 );\nsy = size( y ); ys = all( sy == 1 );\nif xs,\n    sz = sy;\nelseif ys || isequal( sx, sy ),\n    sz = sx;\nelse\n    error( 'Matrix dimensions must agree.' );\nend\n\n%\n% Determine the expression types\n%\n\nif cvx_isconstant( y ),\n    \n    z = pow_cvx( x, y, 'power' );\n    return\n    \nelseif ~cvx_isconstant( x ),\n    \n    error( 'Disciplined convex programming error:\\n   In an expression X .^ Y, either X or Y must be constant.', 1 ); %#ok\n    \nend\n\n%\n% Now handle constant .^ non-constant\n%\n    \npersistent remap\nif isempty( remap ),\n\tremap_y1 = cvx_remap( 'real-affine' );\n\tremap_y2 = cvx_remap( 'convex' )    & ~remap_y1;\n\tremap_y3 = cvx_remap( 'concave' )   & ~remap_y1;\n\tremap_y4 = cvx_remap( 'log-valid' ) & ~( remap_y1 | remap_y2 | remap_y3 );\n\tremap    = [0;0;2;2;2] * remap_y1 + ...\n\t           [0;0;0;2;2] * remap_y2 + ...\n\t           [0;0;2;2;0] * remap_y3 + ...\n\t           [0;1;0;2;0] * remap_y4;\nend\nx  = cvx_constant( x );\nvy = cvx_classify( y );\nvx = 1 + isreal( x ) .* ( ( x >= 0 ) + ( x > 0 ) + ( x >= 1 ) + ( x > 1 ) );\nvr = remap( vx + size( remap, 1 ) * ( vy - 1 ) );\nvu = sort( vr(:) );\nvu = vu([true;diff(vu)~=0]);\nnv = length( vu );\n\n%\n% Perform the individual computations and combine\n%\n\nx = cvx( x ); xt = x;\ny = cvx( y ); yt = y;\nif nv ~= 1,\n    z = cvx( sz, [] );\nend\nfor k = 1 : nv,\n\n    %\n    % Select the category of expression to compute\n    %\n\n    if nv ~= 1,\n        t = vr == vu( k );\n        if ~xs, xt = cvx_subsref( x, t ); sz = size( xt ); end\n        if ~ys, yt = cvx_subsref( y, t ); sz = size( yt ); end\n    end\n\n    %\n    % The computational kernels\n    %\n\n    switch vu( k ),\n        case 0,\n            % Invalid\n            error( 'Disciplined convex programming error:\\n    Cannot perform the operation {%s}.^{%s}', cvx_class( xt, true, true, true ), cvx_class( yt, true, true, true ) );\n        case 1,\n            % zero .^ convex\n            cvx_optval = cvx( zeros( sz ) );\n        case 2,\n            % (0<x<1) .^ concave, (x>1) .^ convex\n            cvx_optval = exp( log( cvx_constant( xt ) ) .* yt );\n        otherwise,\n            error( 'Shouldn''t be here.' );\n    end\n\n    %\n    % Store the results\n    %\n\n    if nv == 1,\n        z = cvx_optval;\n    else\n        z = cvx_subsasgn( z, t, cvx_optval );\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/prod.m",
    "content": "function y = prod( x, dim )\r\n\r\n%   Disciplined geometric programming information for PROD:\r\n%      PROD(X) and PROD(X,DIM) are vectorized versions of multiplication\r\n%      so in most cases it would be incompatible with DCPs. Therefore it\r\n%      has not been implemented to support DCPs. DGPs however support\r\n%      products more liberally. When PROD is used in a DCP, elements in\r\n%      each subvector must satisfy the corresponding combination rule\r\n%      for multiplication (see TIMES). For example, suppose that X looks\r\n%      like this:\r\n%         X = [ log-convex log-concave log-affine  ;\r\n%               log-affine log-concave log-concave ]\r\n%      Then PROD(X,1) would be permittted, but PROD(X,2) would not, \r\n%      because the top row contains the product of log-convex and \r\n%      log-concave terms, in violation of the DGP ruleset.\r\n\r\nnarginchk(1,2);\r\n\r\n%\r\n% Size check\r\n%\r\n\r\ntry\r\n    ox = x;\r\n    if nargin < 2, dim = []; end\r\n    [ x, sx, sy, zx, zy, nx, nv, perm ] = cvx_reduce_size( x, dim ); %#ok\r\ncatch exc\r\n    error( exc.message );\r\nend\r\n    \r\n%\r\n% Quick exit for easy cases\r\n%\r\n\r\nif isempty( x ),\r\n    if ~any( zy ), zy = 1; end\r\n    y = cvx( ones( zy ) );\r\n    return\r\nelseif nx == 1,\r\n    y = ox;\r\n    return\r\nend\r\n\r\n%\r\n% Type check\r\n%\r\n\r\npersistent remap_1 remap_2 remap_3 remap_0\r\nif isempty( remap_3 ),\r\n    remap_0 = cvx_remap( 'zero' );\r\n    remap_1 = cvx_remap( 'constant' );\r\n    remap_2 = cvx_remap( 'log-convex' );\r\n    remap_3 = cvx_remap( 'log-concave' );\r\nend\r\nvx = cvx_reshape( cvx_classify( x ), sx );\r\nt0 = any( reshape( remap_0( vx ), sx ) );\r\nt1 = all( reshape( remap_1( vx ), sx ) );\r\nt2 = all( reshape( remap_2( vx ), sx ) ) | ...\r\n     all( reshape( remap_3( vx ), sx ) );\r\nt3 = t0 & t1;\r\nta = t3 + 2 * ( t2 & ~t3 );\r\nnu = sort( ta(:) );\r\nnu = nu([true;diff(nu)~=0]);\r\nnk = length( nu );\r\n\r\n%\r\n% Perform the computations\r\n%\r\n\r\nif nk > 1,\r\n    y = cvx( [ 1, nv ], [] );\r\nend\r\nfor k = 1 : nk,\r\n\r\n    if nk == 1,\r\n        xt = x;\r\n    else\r\n        tt = ta == nu( k );\r\n        xt = cvx_subsref( x, ':', tt );\r\n    end\r\n\r\n    switch nu( k ),\r\n        case 0,\r\n            error( 'Disciplined convex programming error:\\n   Invalid computation: prod( {%s} )', cvx_class( xt, true, true ) );\r\n        case 1,\r\n            yt = cvx( prod( cvx_constant( xt ) ) );\r\n        case 2,\r\n            yt = exp( sum( log( xt ) ) );\r\n        otherwise,\r\n            error( 'Shouldn''t be here.' );\r\n    end\r\n\r\n    if nk == 1,\r\n        y = yt;\r\n    else\r\n        y = cvx_subsasgn( y, tt, yt );\r\n    end\r\n\r\nend\r\n\r\n%\r\n% Reverse the reshaping and permutation steps\r\n%\r\n\r\ny = reshape( y, sy );\r\nif ~isempty( perm ),\r\n    y = ipermute( y, perm );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/rdivide.m",
    "content": "function z = rdivide( x, y )\n\n%   Disciplined convex programming information for RDIVIDE:\n%      For DCP purposes, the RDIVIDE division operator X./Y is identical\n%      to X.*(1./Y). The right-hand term must be constant and non-zero;\n%      and if the left-hand term is nonlinear, the constat must be real.\n%   \n%   Disciplined geometric programming information for RDIVIDE:\n%      Terms in a left divide must have opposite log-curvature, so the\n%      following products are permitted:\n%         {log-convex} ./ {log-concave}  {log-concave} ./ {log-convex}\n%         {log-affine} ./ {log-affine}\n%      Note that log-affine expressions are both log-convex and \n%      log-concave.\n%   \n%   For vectors, matrices, and arrays, these rules are verified \n%   indepdently for each element.\n\nz = times( x, y, './' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/real.m",
    "content": "function y = real( x )\n\n%   Disciplined convex/geometric programming information for REAL:\n%      REAL(X) may be freely applied to any CVX expression. However,\n%      since REAL(X)=X for all real expressions (including convex,\n%      concave, log-convex, and log-concave), it is only useful in\n%      the complex affine case.\n\ny = cvx( x.size_, real( x.basis_ ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/reshape.m",
    "content": "function x = reshape( x, varargin )\n\n%   Disciplined convex/geometric programming information for RESHAPE:\n%       RESHAPE imposes no convexity restrictions on its arguments.\n\n%\n% Check size arguments\n%\n\nswitch nargin,\n    case {0,1},\n        error( 'Not enough input arguments.' );\n    case 2,\n        [ temp, sz ] = cvx_check_dimlist( varargin{1}, true );\n        if ~temp,\n            error( 'Second argument must be a valid dimension list.' );\n        end\n    otherwise,\n        [ temp, sz ] = cvx_check_dimlist( varargin, true );\n        if ~temp,\n            error( 'Second and subsequent arguments must be nonnegative integers.' );\n        end\nend\n\n%\n% Quick exit if the size remains the same\n%\n\nsx = x.size_;\nif isequal( sx, sz ),\n    return;\nend\n\n%\n% Confirm compatible reshape\n%\n\npx = prod( sx );\ntt = isnan( sz );\nif any( tt ),\n    if nnz( tt ) > 1,\n        error( 'Size can only have one unknown dimension.' );\n    end\n    tmp = px / prod( sz( ~tt ) );\n    if isnan( tmp ) || tmp ~= floor( tmp ),\n        error( 'Product of known dimensions, %d, not divisible into total number of elements, %d.', prod( sz( ~tt ) ), px );\n    end\n    sz( tt ) = tmp;\nelseif px ~= prod( sz ),\n    error( 'To RESHAPE the number of elements must not change.' );\nend\n\n%\n% Perform the resize\n%\n\nx = cvx( sz, x.basis_ );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/size.m",
    "content": "function varargout = size( x, dim )\n\n%   Disciplined convex/geometric programming information for SIZE:\n%       SIZE imposes no convexity restrictions on its first argument.\n%       The second argument, if supplied, must be a positive integer.\n\ns = x.size_;\nif nargin > 1,\n    if nargout > 1,\n        error( 'Too many output arguments.' );\n    elseif ~isnumeric( dim ) || length( dim ) ~= 1 || dim <= 0 || dim ~= floor( dim ),\n        error( 'Dimension argument must be a positive integer scalar.' );\n    elseif dim > length( s ),\n        varargout{1} = 1;\n    else\n        varargout{1} = s(dim);\n    end\nelseif nargout > 1,\n    ns = length( s );\n    no = nargout;\n    if no > ns,\n        s( end+1:no ) = 1;\n    elseif no < ns,\n        s( no ) = prod( s( no : end ) );\n    end\n    for k = 1 : no,\n        varargout{k} = s(k); %#ok\n    end\nelse\n    varargout{1} = s;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/sparse.m",
    "content": "function z = sparse( i, j, x, m, n )\r\n\r\n%   Disciplined convex/geometric programming information for SPARSE:\r\n%       For a CVX variable X, SPARSE(X) just returns X. In the three-\r\n%       and five-argument versions SPARSE(I,J,V,M,N), the index\r\n%       arguments I and J and size arguments M and N must be constant.\r\n%       If any of the index pairs (I(k),J(k)) are repeated, then the\r\n%       corresponding elements V(k) will be added together. Therefore,\r\n%       those elements must be compatible with addition; i.e., they\r\n%       must have the same curvature.\r\n\r\nswitch nargin,\r\n\tcase 1,\r\n\t\tz = i;\r\n\t\treturn\r\n\tcase {2,4}\r\n\t\terror( 'Not enough arguments.' );\r\nend\r\n\r\n%\r\n% Check sizes and indices\r\n%\r\n\r\nif ( ~isnumeric( i ) && ~ischar( i ) ) || ( ~isnumeric( j ) && ~ischar( j ) ),\r\n    error( 'The first two arguments must be numeric.' );\r\nend\r\nnn = [ numel( i ), numel( j ), prod( x.size_ ) ];\r\nnz = max( nn );\r\nif any( nn(nn~=nz) ~= 1 ),\r\n    error( 'Vectors must be the same lengths.' );\r\nend\r\ni = i( : ); j = j( : );\r\nif nargin == 3,\r\n    m = max( i );\r\n    n = max( j );\r\nelseif ( ~isnumeric( m ) && ~ischar( m ) ) || ( ~isnumeric( n ) && ~ischar( n ) ) || n < 0 || m < 0 || n ~= floor( n ) || m ~= floor( m ),\r\n    error( 'Sparse matrix sizes must be positive integers.' );\r\nelseif any( i > m ) || any( j > n ),\r\n    error( 'Index exceeds matrix dimensions.' );\r\nend\r\n\r\n%\r\n% Reconstruct basis matrices and indices\r\n%\r\n\r\n[ ix, jx, vx ] = find( x.basis_ );\r\nij = i + m * ( j - 1 );\r\nif length(ij) > 1,\r\n    ij = ij(jx);\r\nend\r\nxb = sparse( ix, ij, vx, max(ix), m * n );\r\nz = cvx( [ m, n ], xb );\r\n\r\n%\r\n% Verify vexity is preserved\r\n%\r\n\r\nv = cvx_vexity( z );\r\nif any( isnan( v( : ) ) ),\r\n    error( 'Disciplined convex programming error:\\n    Sparse matrix construction produced invalid sums of convex and concave terms.' );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/spy.m",
    "content": "function spy( x, mode )\nglobal cvx___\n\n%   SPY is not a computational function, so it can be applied to any  \n%   CVX variables. \n\nswitch nargin,\n    case 0,\n        error( 'Not enough arguments.' );\n    case 1,\n        mode = '';\n    case 2,\n        if ~ischar( mode ) || size( mode, 1 ) > 1,\n            error( 'Second argument must be a string.' );\n        end\nend\n\nb = x.basis_;\ns = x.size_;\n\nswitch mode,\n    case { '2-d', '2-D', '2d', '2D' },\n        b = sum( b ~= 0, 1 );\n        b = reshape( b, s );\n    case { '', '3-d', '3-D', '3d', '3D' },\n        p = length( cvx___.reserved ) + 1;\n        if size( b, 1 ) < p, b( p, end ) = 0; end\n    otherwise,\n        error( [ 'Unknown spy mode: ', mode ] );\nend\n\nspy( b );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/sqrt.m",
    "content": "function cvx_optval = sqrt( x )\n\n%   Discipined convex programming information for SQRT:\n%      SQRT(X) is log-concave and nondecreasing in X. Therefore, when used\n%      in DCPs, X must be concave (or affine).\n%   \n%   Disciplined geometric programming information for SQRT:\n%      SQRT(X) is log-log-affine and nondecreasing in X. Therefore, when\n%      used in DGPs, X may be log-affine, log-convex, or log-concave.\n\nnarginchk(1,1);\n\n%\n% Determine the expression types\n%\n\n% 0 : affine complex, convex, invalid\n% 1 : constant\n% 2 : concave, real affine\npersistent remap\nif isempty( remap ),\n    remap_1 = cvx_remap( 'constant' );\n    remap_2 = cvx_remap( 'real-affine', 'concave' );\n    remap_3 = cvx_remap( 'log-convex', 'log-concave' );\n    remap = remap_1 + ( 2 * remap_2 + 3 * remap_3 ) .* ~remap_1;\nend\nv = remap( cvx_classify( x ) );\n\n%\n% Perform the computations for each expression type separately\n%\n\nvu = sort( v(:) );\nvu = vu([true;diff(vu)~=0]);\nnv = length( vu );\nsx = x.size_;\nif nv ~= 1,\n    y = cvx( sx, [] );\nend\nfor k = 1 : nv,\n\n    %\n    % Select the category of expression to compute\n    %\n\n    vk = vu( k );\n    if nv == 1,\n        xt = x;\n    else\n        t = v == vk;\n        xt = cvx_subsref( x, t );\n    end\n\n    %\n    % Perform the computations\n    %\n\n    switch vk,\n        case 0,\n            % Invalid\n            error( 'Disciplined convex programming error:\\n    Illegal operation: sqrt( {%s} ).', cvx_class( xt, true, true ) );\n        case 1,\n            % Constant\n            cvx_optval = cvx( builtin( 'sqrt', cvx_constant( xt ) ) );\n        case 2,\n            % Real affine, concave\n            w = [];\n            st = size( xt ); %#ok\n            cvx_begin\n                hypograph variable w( st );\n                square( w ) <= xt; %#ok\n            cvx_end\n        case 3,\n            % Monomial, posynomial\n            cvx_optval = exp( 0.5 * log( xt ) );\n        otherwise,\n            error( 'Shouldn''t be here.' );\n    end\n\n    %\n    % Store the results\n    %\n\n    if nv == 1,\n        y = cvx_optval;\n    else\n        y = cvx_subsasgn( y, t, cvx_optval );\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/std.m",
    "content": "function y = std( x, w, dim )\n\n%STD    Internal cvx version.\n\nif ~cvx_isaffine( x ),\n    error( 'Disciplined convex programming error:\\n    VAR is convex and nonmonotonic in X, so X must be affine.', 1 ); %#ok\nelseif nargin > 1 && ~cvx_isconstant( w ),\n    error( 'Weight vector must be constant.' );\nend\n\ntry\n    if nargin < 3, dim = []; end\n    [ x, sx, sy, zx, zy, nx, nv, perm ] = cvx_reduce_size( x, dim ); %#ok\ncatch exc\n    error( exc.message );\nend\n\nif nx > 1 && nv > 0,\n    if nargin < 2 || numel( w ) == 1,\n        if nargin == 2 && w,\n            denom = nx;\n        else\n            denom = nx - 1;\n        end\n        % In theory we could just say y = mean(abs(x-mean(x))). However, by\n        % adding an extra variable we preserve sparsity.\n        cvx_begin\n            variable xbar( 1, nv )\n            denom * xbar == sum( x ); %#ok\n            minimize( norms( x - ones(nx,1) * xbar ) / sqrt( denom ) );\n        cvx_end\n        y = cvx_optval;\n    elseif numel( w ) ~= nx || ~isreal( w ) || any( w < 0 ),\n        error( 'Weight vector expected to have %d nonnegative elements.', w );\n    else\n        sw = sum( w(:) );\n        if sw == 0,\n            error( 'Weight vector must not be all zeros.' );\n        end\n        w = w(:) / sw;\n        cvx_begin\n            variable xbar( 1, nv )\n            xbar == sum( w' * x ); %#ok\n            w = sqrt( w );\n            minimize( norms( w( :, ones(1,nv) ) .* ( x - ones(nx,1) * xbar ) ) );\n        cvx_end\n        y = cvx_optval;\n    end\nelseif nx == 0,\n    y = NaN( sy );\nelse\n    y = zeros( sy );\nend\n\n%\n% Reverse the reshaping and permutation steps\n%\n\ny = reshape( y, sy );\nif ~isempty( perm ),\n    y = ipermute( y, perm );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/subsasgn.m",
    "content": "function x = subsasgn( x, S, y )\n\n%   Disciplined convex/geometric programming information for SUBSASGN:\n%      Subscripting can be used to change values of elements or slices\n%      of CVX variables in the same manner as with numeric arrays. All\n%      conventions are preserved, including the colon ':' and 'end'\n%      notation, as well as the ability to \"expand\" a CVX variable by\n%      assigning a value to a location outside of its current dimensions\n%      (e.g., X(end+1)=0).\n%   \n%      One notable exception is this: if the right-hand side is a CVX\n%      expression, then the left-hand side must be as well. So, for \n%      example, the following will fail:\n%         variable x;\n%         y = ones(3,1);\n%         y(2) = x;\n%      This is because MATLAB does not know how to automatically promote\n%      'y' to a CVX variable so that it can accept 'x' as an element. If\n%     you want\n%      to accomplish something like this, you must manually convert y into a\n%      CVX variable first, as follows:\n%         variable x;\n%         y = cvx(ones(3,1));\n%         y(2) = x;\n\nnarginchk(3,3);\n\n%\n% Test subscripts\n%\n\nszx = size( x );\nszy = size( y );\nnlx = prod( szx );\ntry\n    temp = reshape( 1 : nlx, szx );\n    ndx_x = builtin( 'subsasgn', temp, S, zeros( szy ) );\ncatch errmsg\n    error( errmsg.identifier, errmsg.message );\nend\nszx_n = size( ndx_x );\nif length( szx_n ) ~= length( szx ),\n   szx_n(end+1:length(szx)) = 1;\n   szx(end+1:length(szx_n)) = 1;\nend\n\n%\n% Assign data\n%\n\nx = cvx( x );\nbx = x.basis_;\nif any( szx_n < szx ),\n    bx = bx( :, ndx_x );\nelse\n    if any( szx_n > szx ),\n        bx( :, end + 1 ) = 0;\n        ndx_x( ndx_x == 0 ) = size( bx, 2 );\n        bx = bx( :, ndx_x );\n        temp = reshape( 1 : prod( szx_n ), szx_n );\n    end\n    ndx_x = builtin( 'subsref', temp, S );\n    ndx_x = ndx_x( : );\n    nlz = length( ndx_x );\n    y = cvx( y );\n    by = y.basis_;\n    nx = size( bx, 1 );\n    [ ny, my ] = size( by );\n    if nx < ny,\n        if issparse( by ) && ~issparse( bx ), bx = sparse( bx ); end\n        bx( ny, : ) = 0;\n    elseif nx > ny,\n        if issparse( bx ) && ~issparse( by ), by = sparse( by ); end\n        by( nx, : ) = 0;\n    end\n    if my < nlz,\n        by = by( :, ones( 1, nlz ) );\n    end\n    bx( :, ndx_x ) = by;\nend\n\n%\n% Create the new object\n%\n\nx = cvx( szx_n, bx );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/subsref.m",
    "content": "function x = subsref( x, S )\n\n%   Disciplined convex/geometric programming information for SUBSREF:\n%      The use of subscripts to extract elements or \"slices\" of any CVX\n%      variable is identical to their use with numeric arrays. All \n%      conventions are preserved, including the colon ':' and 'end'.\n\nnarginchk(2,2);\n\ntry\n    ndxs = builtin( 'subsref', reshape( 1 : prod( x.size_ ), x.size_ ), S );\ncatch errmsg\n    error( errmsg.identifier, errmsg.message );\nend\n\nx = cvx( size( ndxs ), x.basis_( :, ndxs ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/sum.m",
    "content": "function y = sum( x, dim )\n\n%   Disciplined convex/geometric programming information for SUM:\n%      SUM(X) and SUM(X,DIM) is a vectorized version of addition. So \n%      when SUM is used in a DCP or DGP, elements in each subvector must\n%      satisfy the corresponding combination rules for addition (see \n%      PLUS). For example, suppose that X looks like this:\n%         X = [ convex concave affine  ;\n%               affine concave concave ]\n%      Then SUM(X,1) would be permittted, but SUM(X,2) would not, \n%      because the top row contains the sum of convex and concave terms,\n%      in violation of the DCP ruleset. For DGPs, addition rules dictate\n%      that the elements of X must be log-convex or log-affine.\n\n%\n% Basic argument check\n%\n\ns = size( x );\nswitch nargin,\n    case 0,\n        error( 'Not enough input arguments.' );\n    case 1,\n        dim = [ find( s > 1 ), 1 ];\n        dim = dim( 1 );\n    case 2,\n        if ~isnumeric( dim ) || dim <= 0 || dim ~= floor( dim ),\n            error( 'Second argument must be a dimension.' );\n        end\nend\n\nif dim > length( s ) || s( dim ) == 1,\n\n    y = x;\n\nelseif s( dim ) == 0,\n\n    if ~any( s ), s = [1,1];\n    else s( dim ) = 1; end\n    y = cvx( s, sparse( 1, prod( s ) ) );\n\nelse\n\n    p  = prod( s( 1 : dim - 1 ) );\n    cc = 0 : prod( s ) - 1;\n    cl = rem( cc, p );\n    cr = floor( cc / ( p * s( dim ) ) );\n    cc = cl + cr * p + 1;\n    s( dim ) = 1;\n    b = x.basis_;\n    [ r, c, v ] = find( b );\n    b = sparse( r, cc( c ), v, size( b, 1 ), prod( s ) );\n    y = cvx( s, b );\n    v = cvx_vexity( y );\n    if any( isnan( v( : ) ) ),\n        error( 'Disciplined convex programming error:\\n   Illegal addition encountered (e.g., {convex} + {concave}).', 1 ); %#ok\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/times.m",
    "content": "function z = times( x, y, oper )\n\n%   Disciplined convex programming information for TIMES:\n%      In general, disciplined convex programs must obey the \"no-product\n%      rule\" which states that two non-constant expressions cannot be \n%      multiplied together. Under this rule, the following combinations\n%      are allowed:\n%         {constant} .* {non-constant}  {non-constant} .* {constant}\n%      Furthermore, if the non-constant expression is nonlinear, then \n%      the constant term must be real.\n%   \n%      A lone exception to the no-product rule is made for quadratic \n%      forms: two affine expressions may be multiplied together if the \n%      result is convex or concave. For example, the construction\n%         variable x(n)\n%         x.*x  <= 1;\n%      would be permitted because each element of x.*x is convex.\n%   \n%   Disciplined geometric programming information for TIMES:\n%      Both terms in a multiplication must have the same log-curvature, \n%      so the following products are permitted:\n%         {log-convex} .* {log-convex}  {log-concave} .* {log-concave}\n%         {log-affine} .* {log-affine}\n%      Note that log-affine expressions are both log-convex and\n%      log-concave.\n%   \n%   For vectors, matrices, and arrays, these rules are verified \n%   indepdently for each element.\n\nnarginchk(2,3);\nif nargin < 3, oper = '.*'; end\n\n%\n% Check sizes\n%\n\nsx = size( x );\nsy = size( y );\nxs = all( sx == 1 );\nys = all( sy == 1 );\nif xs,\n    sz = sy;\nelseif ys,\n    sz = sx;\nelseif ~isequal( sx, sy ),\n    error( 'Matrix dimensions must agree.' );\nelse\n    sz = sx;\nend\nnn = prod( sz );\nif nn == 0,\n    z = zeros( sz );\n    return\nend\n\n%\n% Determine the computation methods\n%\n\npersistent remap_m remap_l remap_r\nif isempty( remap_r ),\n    % zero .* valid, valid .* zero, constant .* constant\n    temp_1    = cvx_remap( 'constant' );\n    temp_2    = cvx_remap( 'zero' );\n    temp_3    = temp_2' * cvx_remap( 'valid' );\n    remap_1   = ( temp_1' * temp_1 ) | temp_3 | temp_3';\n    remap_1n  = ~remap_1;\n    % constant / nonzero, zero / log-concave, zero / log-convex\n    temp_4    = temp_1 & ~temp_2;\n    remap_1r  = ( temp_1' * temp_4 ) | ( temp_2' * cvx_remap( 'log-valid' ) );\n    remap_1rn = ~remap_1r;\n\n    % constant * affine, real * convex/concave/log-convex, positive * log-concave\n    temp_5   = cvx_remap( 'real' );\n    temp_6   = cvx_remap( 'positive' );\n    temp_7   = cvx_remap( 'affine' );\n    temp_1n   = ~temp_1;\n    temp_8   = cvx_remap( 'log-concave' ) & temp_1n;\n    remap_2  = ( temp_1' * temp_7 ) | ...\n               ( temp_5' * cvx_remap( 'convex', 'concave', 'log-convex' ) ) | ...\n               ( temp_6' * temp_8 );\n    remap_2  = remap_2 & remap_1n;\n    % real / log-concave, positive / log-convex\n    temp_9   = cvx_remap( 'log-convex' ) & temp_1n;\n    remap_2r = ( temp_5' * temp_8 ) | ...\n               ( temp_6' * temp_9 );\n    remap_2r = remap_2r & remap_1rn;\n           \n    % Affine * constant, convex/concave/log-convex * real, log-concave * positive\n    remap_3  = remap_2';\n    % Affine / nonzero, convex/concave/log-convex / nzreal, log-concave / positive\n    remap_3r = remap_3;\n    remap_3r(:,2) = 0;\n           \n    % Affine * affine\n    remap_4  = temp_7 & ~temp_1;\n    remap_4  = remap_4' * +remap_4;\n\n    % log-concave * log-concave, log-convex * log-convex\n    remap_5  = ( temp_8' * +temp_8 ) | ( temp_9' * +temp_9 );\n    % log-concave / log-convex, log-convex / log-concave\n    remap_5r = temp_8' * +temp_9;\n    remap_5r = remap_5r | remap_5r';\n           \n    remap_m = remap_1 + 2 * remap_2  + 3 * remap_3 + 4 * remap_4 + 5 * remap_5;\n    remap_r = remap_1r + 2 * remap_2r + 3 * remap_3r + 5 * remap_5r;\n    remap_r(:,2) = 0;\n    remap_l = remap_r';\nend\nswitch oper,\n    case '.*',\n        remap = remap_m;\n        r_recip = 0;\n        l_recip = 0;\n    case './',\n        remap = remap_r;\n        r_recip = 1;\n        l_recip = 0;\n    case '.\\',\n        remap = remap_l;\n        r_recip = 0;\n        l_recip = 1;\nend\nvx = cvx_classify( x );\nvy = cvx_classify( y );\nvr = remap( vx + size( remap, 1 ) * ( vy - 1 ) );\nvu = sort( vr(:) );\nvu = vu([true;diff(vu)~=0]);\nnv = length( vu );\nif vu(1) == 1 && nv > 1,\n    vr(vr==1) = vu(2); \n    nv = nv - 1;\n    vu(1) = [];\nend\n\n%\n% Process each computation type separately\n%\n\nx   = cvx( x );\ny   = cvx( y );\nxt  = x;\nyt  = y;\nif nv ~= 1,\n    z = cvx( sz, [] );\nend\nfor k = 1 : nv,\n\n    %\n    % Select the category of expression to compute\n    %\n\n    if nv ~= 1,\n        t = vr == vu( k );\n        if ~xs,\n            xt = cvx_subsref( x, t );\n            sz = size( xt );\n        end\n        if ~ys,\n            yt = cvx_subsref( y, t );\n            sz = size( yt );\n        end\n    end\n\n    %\n    % Apply the appropriate computation\n    %\n\n    switch vu( k ),\n    case 0,\n\n        % Invalid\n        error( 'Disciplined convex programming error:\\n    Cannot perform the operation: {%s} %s {%s}', cvx_class( xt, true, true, true ), oper, cvx_class( yt, true, true, true ) );\n        \n    case 1,\n        \n        % constant .* constant\n        xb = cvx_constant( xt );\n        yb = cvx_constant( yt );\n        if l_recip,\n            cvx_optval = xb .\\ yb;\n        elseif r_recip,\n            cvx_optval = xb ./ yb;\n        else\n            cvx_optval = xb .* yb;\n        end\n        if nnz( isnan( cvx_optval ) ),\n            error( 'Disciplined convex programming error:\\n    This expression produced one or more invalid numeric values (NaNs).', 1 ); %#ok\n        end\n        cvx_optval = cvx( cvx_optval );\n\n    case 2,\n\n        % constant .* something\n        xb = cvx_constant( xt );\n        if l_recip, xb = 1.0 ./ xb; end\n        yb = yt;\n        if r_recip && nnz( xb ), yb = exp( - log( yb ) ); end\n        yb = yb.basis_;\n        if ~xs,\n            nn = numel(  xb  );\n            if ys,\n                xb = cvx_reshape( xb, [ 1, nn ] );\n                if issparse( yb ) && ~issparse( xb ), \n                    xb = sparse( xb ); \n                end\n            else\n                n1 = 1 : nn;\n                xb = sparse( n1, n1, xb( : ), nn, nn );\n            end\n        end\n        cvx_optval = cvx( sz, yb * xb );\n\n    case 3,\n\n        % something .* constant\n        yb = cvx_constant( yt );\n        if r_recip, yb = 1.0 ./ yb; end\n        xb = xt;\n        if l_recip && any( xb ), xb = exp( - log( xb ) ); end\n        xb = xb.basis_;\n        if ~ys,\n            nn = numel(  yb  );\n            if xs,\n                yb = cvx_reshape( yb, [ 1, nn ] );\n                if issparse( xb ) && ~issparse( yb ),\n                    yb = sparse( yb );\n                end\n            else\n                n1 = 1 : nn;\n                yb = sparse( n1, n1, yb( : ), nn, nn );\n            end\n        end\n        cvx_optval = cvx( sz, xb * yb );\n\n    case 4,\n\n        % affine .* affine\n        nn = prod( sz );\n        xA = xt.basis_; yA = yt.basis_;\n        if xs && ~ys, xA = xA( :, ones( 1, nn ) ); end\n        if ys && ~xs, yA = yA( :, ones( 1, nn ) ); end\n        mm = max( size( xA, 1 ), size( yA, 1 ) );\n        if size( xA, 1 ) < mm, xA( mm, end ) = 0; end\n        if size( yA, 1 ) < mm, yA( mm, end ) = 0; end\n        xB = xA( 1, : ); xA( 1, : ) = 0;\n        yB = yA( 1, : ); yA( 1, : ) = 0;\n        cyA   = conj( yA );\n        alpha = sum( real( xA .* yA ), 1 ) ./ max( sum( cyA .* yA, 1 ), realmin );\n        adiag = sparse( 1 : nn, 1 : nn, alpha, nn, nn );\n        if all( sum( abs( xA - cyA * adiag ), 2 ) <= 2 * eps * sum( abs( xA ), 2 ) ),\n            beta  = xB - alpha .* conj( yB );\n            alpha = reshape( alpha, sz );\n            if isreal( y ),\n                cvx_optval = alpha .* square( y ) + reshape( beta, sz ) .* y;\n            elseif all( abs( beta ) <= 2 * eps * abs( xB ) ),\n                cvx_optval = alpha .* square_abs( y );\n            else\n                error( 'Disciplined convex programming error:\\n    Invalid quadratic form(s): product is not real.\\n', 1 ); %#ok\n            end\n        else\n            error( 'Disciplined convex programming error:\\n    Invalid quadratic form(s): not a square.\\n', 1 ); %#ok\n        end\n\n    case 5,\n\n        % posynomial .* posynomial\n        xb = log( xt );\n        if l_recip, xb = - xb; end\n        yb = log( yt );\n        if r_recip, yb = - yb; end\n        cvx_optval = exp( xb + yb );\n\n    otherwise,\n\n        error( 'Shouldn''t be here.' );\n\n    end\n\n    %\n    % Store the results\n    %\n\n    if nv == 1,\n        z = cvx_optval;\n    else\n        z = cvx_subsasgn( z, t, cvx_optval );\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/toeplitz.m",
    "content": "function t = toeplitz( c, r )\n\n%   Disciplined convex/geometric programming information for TOEPLITZ:\n%      TOEPLITZ imposes no convexity restrictions on its arguments. \n%      Instead of using the TOEPLITZ function, however, consider \n%      creating a matrix variable using the 'toeplitz' keyword; e.g.\n%          variable X(5,5) toeplitz;\n\n%\n% Check arguments\n%\n\nnarginchk(1,2);\nif nargin < 2,\n    c    = vec( c );\n    m    = length( c );\n    p    = m;\n    x    = [ cvx_subsref( c, p : -1 : 1 ) ; conj( cvx_subsref( c, 2 : p ) ) ];\nelse\n    temp = cvx_subsref( r, 1 ) - cvx_subsref( c, 1 );\n    if ~cvx_isconstant( temp ) || cvx_constant( temp ) ~= 0,\n        warning('MATLAB:toeplitz:DiagonalConflict',['First element of ' ...\n               'input column does not match first element of input row. ' ...\n               '\\n         Column wins diagonal conflict.'])\n    end\n    r = vec( r );\n    c = vec( c );\n    p = length( r );\n    m = length( c );\n    x = [ cvx_subsref( r, p : -1 : 2 ) ; c ];\nend\n\n%\n% Construct matrix\n%\n\ncidx = ( 0 : m - 1 )';\nridx = p : -1 : 1;\nt    = cidx( :, ones( p, 1 ) ) + ridx( ones( m, 1 ) , : );\nt    = reshape( cvx_subsref( x, t ), size( t ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/transpose.m",
    "content": "function y = transpose( x )\n\n%   Disciplined convex/geometric programming information for TRANSPOSE:\n%      The transpose operation may be applied to CVX variables without\n%      restriction.\n\n%\n% Determine permutation\n%\n\ns = x.size_;\nif length( s ) > 2,\n    error( 'Transpose of an ND array is not defined.' );\nend\n\n%\n% Permute the data\n%\n\nndxs = 1 : prod( s );\nndx2 = reshape( ndxs, s ).';\nb = x.basis_;\ntry\n    b = b( :, ndx2 );\ncatch %#ok\n    ndxs( ndx2( : ).' ) = ndxs;\n    [ r, c, v ] = find( b );\n    b = sparse( r, ndxs( c ), v, size( b, 1 ), size( b, 2 ) );\n    clear r c v\nend\ny = cvx( size( ndx2 ), b );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/tril.m",
    "content": "function x = tril( x, k )\n\n%   Disciplined convex/geometric programming information for TRIL:\n%       TRIL imposes no convexity restrictions on its arguments.\n\n%\n% Check inputs\n%\n\nif nargin < 2, k = 0; end\ns = x.size_;\nif length( s ) > 2,\n    error( 'The first argument must be 2-D.' );\nelseif ~isnumeric( k ) || length( k ) ~= 1,\n    error( 'The second argument must be an integer scalar.' );\nend\n\n%\n% Zero out the elements outside of the desired triangle\n%\n\nb = x.basis_;\nb( :, ~tril(ones(s),k) ) = 0;\nx = cvx( s, b );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/triu.m",
    "content": "function x = triu( x, k )\n\n%   Disciplined convex/geometric programming information for TRIU:\n%       TRIU imposes no convexity restrictions on its arguments.\n\n%\n% Check inputs\n%\n\nif nargin < 2, k = 0; end\ns = x.size_;\nif length( s ) > 2,\n    error( 'The first argument must be 2-D.' );\nelseif ~isnumeric( k ) || length( k ) ~= 1,\n    error( 'The second argument must be an integer scalar.' );\nend\n\n%\n% Zero out the elements outside of the desired triangle\n%\n\nb = x.basis_;\nb( :, ~triu(ones(s),k) ) = 0;\nx = cvx( s, b );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/uminus.m",
    "content": "function z = uminus( x )\n\n%   Disciplined convex programming information for UMINUS (-):\n%      Unary minus may be used in DCPs without restrictions---with the\n%      understanding, of course, that it produces a result with the \n%      opposite cuvature to its argument; i.e., the negative of a convex\n%      expression is concave, and vice versa.\n%\n%   Disciplined geometric programming information for UMINUS(-):\n%      Negation of non-constant values may not be used in disciplined\n%      geometric programs.\n\npersistent remap\nif isempty( remap ),\n    remap = cvx_remap( 'invalid', 'log-concave' ) & ~cvx_remap( 'log-affine' );\nend\ntt = remap( cvx_classify( x ) );\nif nnz( tt ),\n    xt = cvx_subsref( x, tt );\n    error( 'Disciplined convex programming error:\\n    Illegal operation: - {%s}', cvx_class( xt ) );\nend\n\nz = cvx( x.size_, -x.basis_ );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/uplus.m",
    "content": "function z = uplus( x )\n\n%   Disciplined convex/geometric programming information for UPLUS (+):\n%      Unary plus may be used in DCPs and DGPs without restrictions.\n\nz = x;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/var.m",
    "content": "function y = var( varargin )\n\n%STD    Internal cvx version.\n\ny = square_pos( std( varargin{:} ) );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvx/vertcat.m",
    "content": "function y = vertcat( varargin )\n\n%   Disciplined convex/geometric programming information for VERTCAT:\n%      VERTCAT imposes no convexity restrictions on its arguments.\n\ny = cat( 1, varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvxcnst/eq.m",
    "content": "function a = eq( x, y )\n\n%Disciplined convex programming information for EQ (==):\n%   Both the left- and right-hand sides of an equality constraint must\n%   be affine (or constant). If either side of the constraint is complex,\n%   then the real and imaginary portions are constrained separately.\n%\n%Disciplined geometric programming information for EQ (>):\n%   Both the left- and right-hand sides of an equality constraint must\n%   be log-affine, which includes positive constants and monomials.\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '==' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvxcnst/ge.m",
    "content": "function a = ge( x, y )\n\n%Disciplined convex programming information for GE (>=):\n%   The right-hand side of a less-than constraint must be convex. The\n%   left-hand side must be concave. Of course, real constant and affine\n%   expressions are both convex and concave and can be used on either\n%   side as well.\n%\n%Disciplined geometric programming information for GE (>=):\n%   The right-hand side of a less-than constraint must be log-convex---\n%   including positive constants, monomials, posynomials, generalized\n%   posynomials, and products thereof. The left-hand side must be log-\n%   concave---including positive constants, monomials, reciprocals of\n%   log-convex expressions, and products thereof.\n%\n%Note that CVX does not distinguish between strict greater-than (>) and\n%greater-than-or-equal (<=) constraints; they are treated identically. \n%Feasible interior-point solvers tend to return points which satisfy\n%strict inequality, but not all solvers do.\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '>=' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvxcnst/gt.m",
    "content": "function a = gt( x, y )\n\n%Disciplined convex programming information for GT (>):\n%   The right-hand side of a less-than constraint must be convex. The\n%   left-hand side must be concave. Of course, real constant and affine\n%   expressions are both convex and concave and can be used on either\n%   side as well.\n%\n%Disciplined geometric programming information for GT (>):\n%   The right-hand side of a less-than constraint must be log-convex---\n%   including positive constants, monomials, posynomials, generalized\n%   posynomials, and products thereof. The left-hand side must be log-\n%   concave---including positive constants, monomials, reciprocals of\n%   log-convex expressions, and products thereof.\n%\n%Note that CVX does not distinguish between strict greater-than (>) and\n%greater-than-or-equal (<=) constraints; they are treated identically. \n%Feasible interior-point solvers tend to return points which satisfy\n%strict inequality, but not all solvers do.\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '>' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvxcnst/le.m",
    "content": "function a = le( x, y )\n\n%   Disciplined convex programming information for LE (<=):\n%      The left-hand side of a less-than constraint must be convex. The\n%      right-hand side must be concave. Of course, real constant and \n%      affine expressions are both convex and concave and can be used on\n%      either side as well.\n%   \n%   Disciplined geometric programming information for LE (<=):\n%      The left-hand side of a less-than constraint must be log-convex,\n%      including positive constants, monomials, posynomials, generalized\n%      posynomials, and products thereof. The right-hand side must be \n%      log-concave---including positive constants, monomials, \n%      reciprocals of log-convex expressions, and products thereof.\n%   \n%   Note that CVX does not distinguish between strict less-than (<) and\n%   less-than-or-equal (<=) constraints; they are treated identically. \n%   Feasible interior-point solvers tend to return points which satisfy\n%   strict inequality, but not all solvers do.\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '<=' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvxcnst/lt.m",
    "content": "function a = lt( x, y )\n\n%   Disciplined convex programming information for LT (<):\n%      The left-hand side of a less-than constraint must be convex. The\n%      right-hand side must be concave. Of course, real constant and \n%      affine expressions are both convex and concave and can be used on\n%      either side as well.\n%   \n%   Disciplined geometric programming information for LT (<):\n%      The left-hand side of a less-than constraint must be log-convex,\n%      including positive constants, monomials, posynomials, generalized\n%      posynomials, and products thereof. The right-hand side must be \n%      log-concave---including positive constants, monomials, \n%      reciprocals of log-convex expressions, and products thereof.\n%   \n%   Note that CVX does not distinguish between strict less-than (<) and\n%   less-than-or-equal (<=) constraints; they are treated identically. \n%   Feasible interior-point solvers tend to return points which satisfy\n%   strict inequality, but not all solvers do.\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '<' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/@cvxcnst/ne.m",
    "content": "function a = ne( x, y )\n\n%   Disciplined convex/geometric programming information for NE (~=):\n%      Not-equal constraints violate both the DCP and DGP rulesets. Thus\n%      not-equal expressions may only appear in CVX models when both \n%      sides are constant.\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '~=' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/builtins/Contents.m",
    "content": "% CVX: Built-in operators and functions supported in CVX models.\n%   \n%   The following operators and functions are included with MATLAB but\n%   have either been verified to work properly within CVX models or have\n%   been extended with additional code to do so. In many cases, typing\n%      help cvx/<func>\n%   where <func> is one of the names listed below will provide specific\n%   help on the proper use of that item in CVX models---including any\n%   restrictions imposed by the DCP and DGP rulesets.\n%\n%   For a list of new functions created specifically for CVX, type\n%   \"help cvx/functions\".\n%\n%   The exponential and logarithm functions, along with the starred \n%   functions listed in \"help cvx/functions\", are supported using a\n%   \"successive approximation\" approach: the solver must be called \n%   multiple times to achieve the required accuracy. Thus models using\n%   these functions should be expected to run more slowly than models\n%   of comparable size that do not. See the CVX user guide for details.\n%\n% Computational operators:\n%    plus (+), uplus (unary +), minus (-), uminus (unary -), times (.*),\n%    mtimes (*), ldivide (.\\), mldivide (\\), rdivide (./), mrdivide (/), \n%    power (.^), mpower (^), subsref/subsasgn/end (subscripting),\n%    transpose (.'), ctranspose (')\n% Relational operators:\n%    eq (==), ge (>=), gt (>), le (<=), lt(<), ne (~=).\n% Linear/affine functions:\n%    blkdiag, cat, conj, conv, cumsum, diag, dot, find, flipdim, fliplr, \n%    flipud, hankel, horzcat, imag, ipermute, kron, permute, polyval, real,\n%    repmat, reshape, rot90, sparse, sum, toeplitz, tril, triu, vertcat\n% Nonlinear functions:\n%    abs, exp(*), log (*), max, min, norm, prod, sqrt\n% Query functions:\n%    disp/display, end, isempty, isequal, length, isreal, ndims, nnz,\n%    numel, size, spy\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/@cvx/commands.m",
    "content": "% CVX: Top-level commands to control CVX.\n%   cvx_begin         - Starts a new CVX specification.\n%   cvx_begin_set     - Starts a new cvx CVX specification.\n%   cvx_cd            - Change current working directory to a CVX subdirectory. \n%   cvx_clear         - Clears all active CVX data.\n%   cvx_end           - Completes a cvx specification.\n%   cvx_end_set       - Completes a cvx set specification.\n%   cvx_gp_precision  - Changes the precision of CVX's GP approximation.\n%   cvx_pause         - Pauses the processing of CVX models.\n%   cvx_power_warning - Controls the CVX warning message for x.^p expressions.\n%   cvx_precision     - Controls CVX solver precision.\n%   cvx_profile       - CVX-specific profiler control.\n%   cvx_quiet         - CVX output control.\n%   cvx_solver        - CVX solver selection.\n%   cvx_where         - Returns the location of the CVX system.\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/Contents.m",
    "content": "% CVX: Top-level commands to control CVX.\n%\n%   cvx_begin           - Starts a new CVX specification.\n%   cvx_clear           - Clears all active CVX data.\n%   cvx_end             - Completes a cvx specification.\n%   cvx_pause           - Pauses the processing of CVX models.\n%   cvx_power_warning   - Controls the CVX warning message for x.^p expressions.\n%   cvx_precision       - Controls CVX solver precision.\n%   cvx_profile         - CVX-specific profiler control.\n%   cvx_quiet           - CVX output control.\n%   cvx_solver          - CVX solver selection.\n%   cvx_where           - Returns the location of the CVX system.\n%   cvx_expert          - CVX expert mode.\n%   cvx_save_prefs      - Saves current CVX settings for future MATLAB sessions.\n%   cvx_solver_settings - CVX solver settings adjustment.\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_begin.m",
    "content": "function cvx_begin( varargin )\n\n%CVX_BEGIN    Starts a new CVX specification.\n%   CVX_BEGIN marks the beginning of a new CVX model. Following this command\n%   may be variable declarations, objective functions, and constraints, and\n%   a CVX_END to mark the completion of the model.\n%\n%   If another model has already been created and is still in progress, then\n%   CVX_BEGIN will issue a warning and clear the previous model.\n%\n%   CVX_BEGIN SDP marks the beginning of a semidefinite programming (SDP) model.\n%   This command alters the interpretation of inequality constraints when used\n%   with matrices, so that SDPs are easier to construct. Specifically, \n%   constraints of the form\n%       X >= Y    X > Y    Y < X    Y <= X\n%   where X and Y are matrices (i.e., not vectors or scalars), CVX will\n%   interpret them all as LMIs, and convert them to\n%        X - Y == semidefinite(size(X,1));\n%   X and Y _must_ be square and identically sized---with one exception: \n%   X or Y may also be the scalar number zero, so that expressions such as\n%   X >= 0 have the expected meaning.\n%\n%   CVX_BEGIN GP marks the beginning of a geometric programming (GP) model. This\n%   command alters the definition of the VARIABLE keyword to create geometric\n%   variables by default GP and SDP cannot be supplied simultaneously.\n%\n%   CVX_BEGIN SET can be used to mark the beginning of a set definition---a cvx\n%   feasibility problem intended to describe a set for use in other models. See\n%   the files in the cvx subdirectory sets/ for examples. The SET keyword can be\n%   combined with SDP or GP to specify sets which use SDP or GP conventions;\n%   for example, CVX_BEGIN SET SDP\n%\n%   CVX_BEGIN SEPARABLE gives permission for CVX to solve a multiobjective\n%   problem simply by taking the sum of the objectives and solving the resulting\n%   single-objective problem. As the name implies, this produces equivalent \n%   results only when the subproblems are separable. Behavior is undefined when\n%   one or more of the subproblems is infeasible or unbounded. The keyword is\n%   ignored for sets and incomplete specifications.\n\nif ~iscellstr( varargin ), error( 'Arguments must be strings.' ); end\nassignin( 'caller', 'cvx_problem', cvxprob( varargin{:} ) );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_clear.m",
    "content": "% CVX_CLEAR   Clears all active CVX data.\n%    CVX_CLEAR clears the current CVX model in progress. This is useful if, for\n%    example, you have made an error typing in your model and wish to start \n%    over. Typing this before entering another CVX_BEGIN again avoids the \n%    warning message that occurs if CVX_BEGIN detects a model in progress.\n\nprob = evalin( 'caller', 'cvx_problem', '[]' );\nif isa( prob, 'cvxprob' ),\n\tevalin( 'caller', 'pop( cvx_problem, ''clear'' )' );\nend\n% cvx_clearpath( 1 );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_end.m",
    "content": "function cvx_end\n\n%CVX_END  Completes a cvx specification.\n%   CVX_BEGIN marks the end of a new cvx model, and instructs cvx to\n%   complete its processing. For standard, complete models, cvx will send\n%   a transformed version of the problem to a solver to obtain numeric\n%   results, and replace references to cvx variables with numeric values.\n\nglobal cvx___\ntstart = tic;\nprob = evalin( 'caller', 'cvx_problem', '[]' );\nif ~isa( prob, 'cvxprob' ),\n    error( 'No CVX model exists in this scope.' );\nelseif isempty( cvx___.problems ) || cvx___.problems( end ).self ~= prob,\n    error( 'Internal CVX data corruption. Please CLEAR ALL and rebuild your model.' );\nend\npstr = cvx___.problems( end );\nestruc = [];\n\nif isempty( pstr.objective ) && isempty( pstr.variables ) && isempty( pstr.duals ) && nnz( pstr.t_variable ) == 1,\n\n    warning( 'CVX:EmptyModel', 'Empty cvx model; no action taken.' );\n    evalin( 'caller', 'pop( cvx_problem, ''none'' )' );\n\nelseif pstr.complete && nnz( pstr.t_variable ) == 1,\n\n    %\n    % Check the integrity of the variables\n    %\n\n    if isempty( pstr.variables ),\n        fn1 = cell( 0, 1 );\n        vv1 = fn1;\n    else\n        fn1  = fieldnames( pstr.variables );\n        ndxs = horzcat( fn1{:} );\n        ndxs = ndxs( cumsum( cellfun( 'length', fn1 ) ) ) ~= '_';\n        fn1  = fn1( ndxs );\n        vv1  = struct2cell( pstr.variables );\n        vv1  = vv1(ndxs);\n    end\n    if isempty( pstr.duals ),\n        fn2 = cell( 0, 1 );\n        vv2 = fn2;\n    else\n        fn2  = fieldnames( pstr.duals );\n        ndxs = horzcat( fn2{:} );\n        ndxs = ndxs( cumsum( cellfun( 'length', fn2 ) ) ) ~= '_';\n        fn2  = fn2( ndxs );\n        vv2  = struct2cell( pstr.dvars );\n        vv2  = vv2( ndxs );\n    end\n    fn1 = [ fn1 ; fn2 ];\n    i1  = cvx_ids( vv1{:}, vv2{:} );\n    i2  = sprintf( '%s,', fn1{:} );\n    try\n        i2 = evalin( 'caller', sprintf( 'cvx_ids( %s )', i2(1:end-1) ) );\n    catch\n        i2 = zeros(1,numel(fn1));\n        for k = 1 : length(fn1),\n            try\n                i2(k) = evalin( 'caller', sprintf( 'cvx_ids( %s )', fn1{k} ) );\n            catch\n            end\n        end\n    end\n    if any( i1 ~= i2 ),\n        evalin( 'caller', 'cvx_clear' );\n        temp = sprintf( ' %s', fn1{ i1 ~= i2 } );\n        error( 'The following cvx variable(s) have been cleared or overwritten:\\n  %s\\nThis is often an indication that an equality constraint was\\nwritten with one equals ''='' instead of two ''==''. The model\\nmust be rewritten before cvx can proceed.', temp ); %#ok\n    end\n\n    %\n    % Pause\n    %\n\n    if cvx___.pause,\n        disp( ' ' );\n        input( 'Press Enter/Return to call the solver:' );\n        disp( ' ' );\n    end\n\n    %\n    % Compress and solve\n    %\n\n    try\n        solve( prob );\n    catch estruc\n    end\n    pstr = cvx___.problems( end );\n\n    %\n    % Pause again!\n    %\n\n    if cvx___.pause && ~cvx___.quiet,\n        disp( ' ' );\n        input( 'Press Enter/Return to continue:' );\n        disp( ' ' );\n    end\n\n    %\n    % Copy the variable data to the workspace\n    %\n\n    if numel( pstr.objective ) > 1 && ~isempty(pstr.result),\n        if strfind( pstr.status, 'Solved' ),\n            pstr.result = value( pstr.objective );\n            if pstr.geometric, pstr.result = exp( pstr.result ); end\n        else\n            pstr.result = pstr.result * ones(size(pstr.objective));\n        end\n    end\n    % Removed these for simplicity. cvx_optdpt in particular was buggy,\n    % and I can't support it. In fact they are for internal use anyway.\n    % assignin( 'caller', 'cvx_optpnt',  pstr.variables );\n    % assignin( 'caller', 'cvx_optdpt',  pstr.duals );\n    assignin( 'caller', 'cvx_status',  pstr.status );\n    assignin( 'caller', 'cvx_optval',  pstr.result );\n    assignin( 'caller', 'cvx_optbnd',  pstr.bound );\n    assignin( 'caller', 'cvx_slvitr',  pstr.iters );\n    assignin( 'caller', 'cvx_slvtol',  pstr.tol );\n    assignin( 'caller', 'cvx_cputime', cputime - pstr.cputime );\n    \n    %\n    % Compute the numerical values and clear out\n    %\n\n    evalin( 'caller', 'pop( cvx_problem, ''value'' )' );\n\nelse\n\n    %\n    % Determine the parent problem\n    %\n\n    p = length( cvx___.problems );\n    if p < 2,\n        error( 'Internal cvx data corruption.' );\n    end\n    np = p - 1;\n\n    %\n    % Move the variable structure into the parent\n    %\n\n    vars = cvx_collapse( pstr.variables, true, false );\n    dvars = cvx_collapse( pstr.duals, true, false );\n    if ~isempty( vars ) || ~isempty( dvars ),\n        pname = [ pstr.name, '_' ];\n        if ~isempty( vars ),\n            try\n                ovars = cvx___.problems(np).variables.(pname);\n            catch\n                ovars = {};\n            end\n            ovars{end+1} = vars;\n            cvx___.problems(np).variables.(pname) = ovars;\n        end\n        if ~isempty( dvars ),\n            try\n                ovars = cvx___.problems(np).duals.(name);\n            catch\n                ovars = {};\n            end\n            ovars{end+1} = dvars;\n            cvx___.problems(np).duals.(pname) = ovars;\n        end\n    end\n\n    %\n    % Merge the touch information\n    %\n\n    v = cvx___.problems( np ).t_variable;\n    v = v | pstr.t_variable( 1 : size( v, 1 ), : );\n    cvx___.problems( np ).t_variable = v;\n\n    %\n    % Process the objective and optimal point, converting to pure\n    % epigraph/hypograph form if necessary\n    %\n\n    assignin( 'caller', 'cvx_optpnt', cvxtuple( cvx_collapse( vars, false, false ) ) );\n    assignin( 'caller', 'cvx_optdpt', cvxtuple( cvx_collapse( dvars, false, false ) ) );\n    x = pstr.objective;\n    if isempty( x ),\n\n        assignin( 'caller', 'cvx_optval', 0 );\n        temp = length( pstr.t_variable ) + 1 : length( cvx___.readonly );\n        cvx___.readonly( temp ) = cvx___.readonly( temp ) - 1;\n\n    else\n\n        switch pstr.direction,\n            case 'minimize',\n                force = false;\n                os = +1;\n            case 'epigraph',\n                force = true;\n                os = +1;\n            case 'maximize',\n                force = false;\n                os = -1;\n            case 'hypograph',\n                force = true;\n                os = -1;\n        end\n        \n        if ~force,\n            x = sparsify( x, 'objective' );\n        end\n        xB = cvx_basis( x );\n        [ r, c ] = find( xB ); %#ok\n        t = r ~= 1; r = r( t );\n        cvx___.canslack( r ) = true;\n\n        %\n        % Set the vexity flags\n        %\n\n        cvx___.vexity( r, : ) = os;\n        cvx___.readonly( r, : ) = np;\n        \n        %\n        % Convert to geometric form if necessary\n        %\n\n        tt = pstr.geometric;\n        if any( tt ),\n            if all( tt ),\n                x = exp( x );\n            else\n                x( tt ) = exp( x( tt ) );\n            end\n        end\n\n        assignin( 'caller', 'cvx_optval', x );\n    end\n\n    %\n    % Set the status and clear the problem from internal storage\n    %\n\n    evalin( 'caller', 'pop( cvx_problem, ''none'' )' );\n\nend\n\nif isempty( cvx___.problems ),\n    tfin = tic;\n    ptic = pstr.tictime;\n    timers = cvx___.timers;\n    if isa( timers, 'double' ),\n        tfin = double(tfin);\n        ptic = double(ptic);\n        tstart = double(tstart);\n    end\n    timers(2) = timers(2) + ( tfin - ptic );\n    timers(3) = timers(3) + ( tfin - tstart );\n    cvx___.timers = timers;\n    profile off;\nend\n\nif ~isempty( estruc ),\n    if strncmp( estruc.identifier, 'CVX:', 4 ),\n        error( estruc.identifier, estruc.message );\n    else\n        rethrow( estruc );\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_expert.m",
    "content": "function cvx_expert( flag )\n\n%CVX_EXPERT    CVX expert mode.\n%   CVX_EXPERT(TRUE) enables certain feature of CVX that have not yet been\n%   announced to the general audience due to insufficient testing.\n%   Specifically, CVX_EXPERT(TRUE) enables the use of successive\n%   approximation methods to handle exponentials, logarithms, and entropy,\n%   and changes CVX to solve geometric programs using the same method.\n%\n%   CVX_EXPERT(FALSE) disables expert mode.\n%\n%   On exit, CVX_EXPERT(TF) returns the *previous* value of the expert flag,\n%   so that it can be flag, so it can be saved and restored later.\n%\n%   CVX_EXPERT, with no arguments, returns the current flag value.\n\nglobal cvx___\ncvx_global\nnarginchk(1,1);\nif nargin == 1,\n    if isnumeric(flag) || islogical(flag),\n        ns = double(flag) ~= 0;\n    elseif ischar(flag) && size(flag,1) == 1,\n        switch lower(flag),\n            case 'true',\n                ns = true;\n            case 'false',\n                ns = false;\n            otherwise,\n                error( 'String arugment must be ''true'' or ''false''.' );\n        end\n    else\n        error( 'Argument must be a numeric scalar or a string.' );\n    end\nend\ncvx___.expert = ns;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_pause.m",
    "content": "function sout = cvx_pause( flag )\n\n%CVX_PAUSE   Pauses the processing of CVX models.\n%   CVX_PAUSE(TRUE) instructs CVX to pause and wait for user keypress before\n%   and after proceeding with the numerical solution of a model. The pauses\n%   occur within the CVX_END. This is useful for demo purposes.\n%\n%   CVX_PAUSE(FALSE) ends the pausing behavior.\n\nglobal cvx___\ncvx_global\ns = cvx___.pause;\nif nargin == 1,\n    if isnumeric(flag) || islogical(flag),\n        ns = double(flag) ~= 0;\n    elseif ischar(flag) && size(flag,1) == 1,\n        switch lower(flag),\n            case 'true',\n                ns = true;\n            case 'false',\n                ns = false;\n            otherwise,\n                error( 'String arugment must be ''true'' or ''false''.' );\n        end\n    else\n        error( 'Argument must be a numeric scalar or a string.' );\n    end\n    cvx___.pause = ns;\nend\nif nargin == 0 || nargout > 0,\n    sout = s;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_power_warning.m",
    "content": "function sout = cvx_power_warning( flag )\r\n\r\n%CVX_POWER_WARNING   Controls the CVX warning message for x.^p expressions.\r\n%   CVX converts power functions like x.^p, for variable x and fixed p, into\r\n%   solvable form using an SOCP transformation. For quadratics x.^2 and square\r\n%   roots x.^(1/2), a single second-order cone is required; for other powers,\r\n%   the number depends on the rational representation of the exponent p.\r\n%\r\n%   CVX_POWER_WARNING(Q) instructs CVX to issue a warning if the resulting\r\n%   transformations requires more than Q second-order cones. The default value\r\n%   is 10, which is not likely to be exceeded for typical choices of P.\r\n\r\nglobal cvx___\r\ncvx_global\r\nif nargin > 0,\r\n    if isempty( flag ),\r\n        ns = 10;\r\n    elseif ~isnumeric( flag ) || ~isreal( flag ) || numel( flag ) > 1 || flag <= 0 || flag ~= floor( flag ),\r\n        error( 'Argument must be a positive integer.' );\r\n    else\r\n        ns = flag;\r\n    end\r\nend\r\nif isempty( cvx___.problems ),\r\n    s = cvx___.rat_growth;\r\n    if nargin > 0,\r\n        cvx___.rat_growth = ns;\r\n    end\r\nelse\r\n    s = cvx___.problems(end).rat_growth;\r\n    if nargin > 0,\r\n        if ~isequal( s, ns ) && isa( evalin( 'caller', 'cvx_problem', '[]' ), 'cvxprob' ),\r\n            warning( 'CVX:PowerWarning', 'The global CVX x.^p warning setting cannot be changed while a model is being constructed.' );\r\n        else\r\n            cvx___.problems(end).rat_growth = ns;\r\n        end\r\n    end\r\nend\r\nif nargin == 0 || nargout > 0,\r\n    sout = s;\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_precision.m",
    "content": "function sout = cvx_precision( flag )\r\n\r\n%CVX_PRECISION    Controls CVX solver precision.\r\n%   The CVX_PRECISION command controls the precision-related stopping criteria\r\n%   for the numerical solver. Up to 3 precision levels can be specified:\r\n%       0 <= PBEST <= PHIGH <= PLOW << 1.\r\n%       --- PBEST: the solver's target precision. The solver is instructed\r\n%           to iterate until it achieves this precision OR until it can\r\n%           make no further progress.\r\n%       --- PHIGH: the 'standard' precision level. Any problem achieving\r\n%           PRECISION <= PHIGH is considered accurately solved (returning\r\n%           cvx_status = 'Solved').\r\n%       --- PLOW: the 'minimum acceptable' precision level. Any problem\r\n%           achieving PHIGH < PRECISION <= PLOW is considered inaccurately\r\n%           solved (returning cvx_status = 'Inaccurate/Solved').\r\n%   Problems which cannot achieve PRECISION <= PLOW are considered unsolved\r\n%   (returning cvx_status = 'Failed'). These precision levels apply in\r\n%   appropriate ways to infeasible and unbounded problems as well.\r\n%\r\n%   CVX_PRECISION(TOL), where TOL is a positive scalar, sets\r\n%       PBEST = MAX(TOL,eps^0.5), PHIGH = TOL, \r\n%       PLOW = min(sqrt(TOL),max(TOL,eps^0.25)).\r\n%   Note that if TOL>eps^0.25, then PLOW=PHIGH.\r\n%\r\n%   CVX_PRECISION(TOL), where TOL is a nonnegative 2-vector, \r\n%       PBEST = MAX(MIN(TOL),eps^0.5), PHIGH = MIN(TOL), and PLOW = MAX(TOL).\r\n%\r\n%   CVX_PRECISION(TOL), where TOL is a 3-vector, sets\r\n%       PBEST = MIN(TOL), PHIGH = MEDIAN(TOL), and PLOW = MAX(TOL).\r\n%   MIN(TOL) may be zero, but the other two elements must be positive.\r\n%   \r\n%   A number of text-based options are provided for convenience:\r\n%       CVX_PRECISION DEFAULT: [eps^0.5,  eps^0.5,   eps^0.25 ]\r\n%       CVX_PRECISION HIGH   : [eps^0.75, eps^0.75,  eps^0.375] \r\n%       CVX_PRECISION MEDIUM : [eps^0.5,  eps^0.375, eps^0.25 ]\r\n%       CVX_PRECISION LOW    : [eps^0.5,  eps^0.25,  eps^0.25 ]\r\n%       CVX_PRECISION BEST   : [0,        eps^0.5,   eps^0.25 ]\r\n%\r\n%   CVX_PRECISION([]) is the same as CVX_PRECISION DEFAULT.\r\n%\r\n%   CVX_PRECISION BEST creates a 'best effort' mode. By setting PBSET=0,\r\n%   it instructs the solver to proceed as long as it can make any useful\r\n%   progress. By setting PLOW and PHIGH to their default values, it returns\r\n%   exactly the same CVX_STATUS values as the DEFAULT setting. Therefore,\r\n%   it yields higher precision when it can be achieved, without penalizing\r\n%   models for which it cannot. Of course, higher precision comes at a cost\r\n%   of increased computation time as well.\r\n%\r\n%   If CVX_PRECISION(TOL) is called within a model---that is, between the\r\n%   statements CVX_BEGIN and CVX_END---then the new precision applies only to\r\n%   that particular model. If called outside of a model, then the change \r\n%   applies to all subsequent models.\r\n%\r\n%   On exit, CVX_PRECISION(TOL) returns the *previous* precision, so that it\r\n%   can be saved and restored later; for example:\r\n%       otol = cvx_precision(tol);\r\n%       cvx_begin\r\n%           ...\r\n%       cvx_end\r\n%       cvx_precision(otol);\r\n%   Of course, this is equivalent to\r\n%       cvx_begin\r\n%           cvx_precision(tol);\r\n%           ...\r\n%       cvx_end\r\n%   but the former syntax it may come in handy if you wish to solve several \r\n%   models in a row with a different precision.\r\n%\r\n%   CVX_PRECISION, with no arguments, returns the current precision value.\r\n\r\nglobal cvx___\r\ncvx_global\r\npersistent prefvals prefnames\r\nif isempty( prefvals ),\r\n    prefvals = { ...\r\n        [ eps^0.5,   eps^0.5,   eps^0.25  ], ...\r\n        [ eps^0.75,  eps^0.75,  eps^0.375 ], ...\r\n        [ eps^0.5,   eps^0.375, eps^0.25  ], ...\r\n        [ eps^0.375, eps^0.25,  eps^0.25  ], ...\r\n        [ 0,         eps^0.5,   eps^0.25  ] };\r\n    prefnames = { 'default', 'high', 'medium', 'low', 'best' };\r\nend\r\nif nargin > 0,\r\n    if isempty( flag ),\r\n        flag = 'default';\r\n    end\r\n    if ischar( flag ),\r\n        if size( flag, 1 ) ~= 1,\r\n            error( 'Invalid precision string.' );\r\n        else\r\n            ndx = find( strcmpi( flag, prefnames ) );\r\n            if isempty( ndx ),\r\n                error( [ 'Invalid precision mode: ', flag ] );\r\n            else\r\n                flag = prefnames{ndx};\r\n                ns = prefvals{ndx};\r\n            end\r\n        end\r\n    else\r\n        if ~isnumeric( flag ) || numel( flag ) > 3 || length(flag) ~= numel(flag),\r\n            error( 'Argument must be a real number, a 2-vector, a 3-vector, or a string.' );\r\n        elseif any( flag < 0 ) || any( flag >= 1 ),\r\n            error( 'Each precision value must satisfy 0 <= P < 1.' );\r\n        elseif numel( flag ) == 1,\r\n            ns = [ max(flag,eps^0.5), flag, min(sqrt(flag),max(flag,eps^0.25)) ];\r\n        elseif numel( flag ) == 2,\r\n            ns = [ min(flag), min(flag), max(flag) ];\r\n        elseif all( flag == 0 ),\r\n            error( 'At least one precision must be positive.' );\r\n        else\r\n            ns = reshape( sort(flag), 1, 3 );\r\n        end\r\n        ndx = find(cellfun(@(x)all(x==ns),prefvals));\r\n        if isempty(ndx),\r\n            flag = 'custom';\r\n        else\r\n            flag = prefnames{ndx};\r\n        end\r\n    end\r\nend\r\nif isempty( cvx___.problems ),\r\n    s = cvx___.precision;\r\n    f = cvx___.precflag;\r\n    if nargin > 0,\r\n        cvx___.precision = ns;\r\n        cvx___.precflag = flag;\r\n    end\r\nelse\r\n    s = cvx___.problems(end).precision;\r\n    f = cvx___.problems(end).precflag;\r\n    if nargin > 0,\r\n        if ~isequal( s, ns ) && ~isa( evalin( 'caller', 'cvx_problem', '[]' ), 'cvxprob' ),\r\n            warning( 'CVX:Precision', 'The global CVX precision setting cannot be changed while a model is being constructed.' );\r\n        else\r\n            cvx___.problems(end).precision = ns;\r\n            cvx___.problems(end).precflag = flag;\r\n        end\r\n    end\r\nend\r\nif nargout > 0,\r\n    sout = s;\r\nelseif nargin == 0,\r\n    fprintf( 'Precision setting: %s\\n', f );\r\n    fprintf( '              Solver goal:             precision <= %.2e\\n', s(1) );\r\n    fprintf( '               \"Solved\" if             precision <= %.2e\\n', s(2) );\r\n    fprintf( '    \"Inaccurate/Solved\" if  %.2e < precision <= %.2e\\n', s(2), s(3) );\r\nend    \r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_profile.m",
    "content": "function sout = cvx_profile( flag )\r\n\r\n% CVX_PROFILE\tCVX-specific profiler control.\r\n%    This is a function used for internal CVX development to help determine \r\n%    performance limits within the CVX code itself, by turning off the profiler\r\n%    when the solver is being called. End users will likely not find this\r\n%    function to be useful.\r\n\r\nglobal cvx___\r\ncvx_global\r\ns = cvx___.profile;\r\nif nargin == 1,\r\n    if isnumeric(flag) || islogical(flag),\r\n        ns = double(flag) ~= 0;\r\n    elseif ischar(flag) && size(flag,1) == 1,\r\n        switch lower(flag),\r\n            case 'true',\r\n                ns = true;\r\n            case 'false',\r\n                ns = false;\r\n            otherwise,\r\n                error( 'String arugment must be ''true'' or ''false''.' );\r\n        end\r\n    else\r\n        error( 'Argument must be a numeric scalar or a string.' );\r\n    end\r\n    if cvx___.profile ~= ns,\r\n        cvx___.profile = ns;\r\n        stat = profile('status');\r\n        if ns && ~isempty( cvx___.problems ) && ~isequal( stat.ProfilerStatus, 'on' ),\r\n            profile on\r\n        elseif ~ns && isequal( stat.ProfilerStatus, 'on' ),\r\n            profile off\r\n        end\r\n    end\r\nend\r\nif nargin == 0 || nargout > 0,\r\n    sout = s;\r\nend\r\n  \r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n  \r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_quiet.m",
    "content": "function sout = cvx_quiet( flag )\n\n%CVX_QUIET    CVX output control.\n%   CVX_QUIET(TRUE) suppresses all text output from CVX (except for error and\n%   warning messages). Specifically, solver progress is not printed.\n%\n%   CVX_QUIET(FALSE) restores full text output.\n%\n%   If CVX_QUIET(TF) is called within a model---that is, between the statements\n%   CVX_BEGIN and CVX_END---then its effect applies only for the current model.\n%   If called outside of a model, the change applies to all subsequent models.\n%\n%   On exit, CVX_QUIET(TF) returns the *previous* value of the quiet flag, so \n%   that it can be saved and restored later; for example:\n%       oflag = cvx_quiet(true);\n%       cvx_begin\n%           ...\n%       cvx_end\n%       cvx_quiet(oflag);\n%   Of course, this is equivalent to\n%       cvx_begin\n%       cvx_quiet(true);\n%           ...\n%       cvx_end\n%   but the former syntax is handy if you have a script that solves several \n%   models at once. In general it is good practice to make sure that the\n%   CVX_QUIET flag is restored to its previous state upon exit from a script,\n%   using either of these techniques.\n%\n%   CVX_QUIET, with no arguments, returns the current flag value.\n\nglobal cvx___\ncvx_global\nif nargin == 1,\n    if isnumeric(flag) || islogical(flag),\n        ns = double(flag) ~= 0;\n    elseif ischar(flag) && size(flag,1) == 1,\n        switch lower(flag),\n            case 'true',\n                ns = true;\n            case 'false',\n                ns = false;\n            otherwise,\n                error( 'String arugment must be ''true'' or ''false''.' );\n        end\n    else\n        error( 'Argument must be a numeric scalar or a string.' );\n    end\nend\nif isempty( cvx___.problems ),\n    s = cvx___.quiet;\n    if nargin > 0,\n        cvx___.quiet = ns;\n    end\nelse\n    s = cvx___.problems(end).quiet;\n    if nargin > 0,\n        if s ~= ns && ~isa( evalin( 'caller', 'cvx_problem', '[]' ), 'cvxprob' ),\n            warning( 'CVX:Quiet', 'The global CVX quiet setting cannot be changed while a model is being constructed.' );\n        else\n            cvx___.problems(end).quiet = ns;\n        end\n    end\nend\nif nargin == 0 || nargout > 0,\n    sout = s;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_save_prefs.m",
    "content": "function cvx_save_prefs( varargin )\n\n%CVX_SAVE_PREFS   Saves current CVX settings for future MATLAB sessions.\n%   CVX_SAVE_PREFS saves the the current global CVX settings to a special\n%   prefences file (stored in the \"prefdir\" directory). This enables CVX to\n%   remember your preferred settings (solver, precision, etc.) between\n%   MATLAB sessions.\n\nglobal cvx___\nif ~isfield( cvx___, 'pfile' ),\n    error( 'CVX:BadPrefsSave', 'CVX is not currently loaded; there are no preferences to save.' );\nelseif nargin == 0,\n    fprintf( 'Saving prefs...' );\nend\noutp.expert = cvx___.expert;\noutp.precision = cvx___.precision;\noutp.precflag = cvx___.precflag;\noutp.rat_growth = cvx___.rat_growth;\noutp.path = cvx___.path;\noutp.solvers = cvx___.solvers;\noutp.license = cvx___.license;\noutp.solvers.map.default = cvx___.solvers.selected;\n[ outp.solvers.list.check, outp.solvers.list.solve, outp.solvers.list.eargs ] = deal( {} );\noutp.solvers.active = 0;\nsave(cvx___.pfile,'-struct','outp');\nif nargin == 0,\n    fprintf( 'done.\\n' );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_solver.m",
    "content": "function [ sout, slist ] = cvx_solver( sname )\r\n\r\n%CVX_SOLVER    CVX solver selection.\r\n%   CVX_SOLVER <solver_name> or CVX_SOLVER('<solver_name>')\r\n%   selects the named solver the CVX uses to solve models. The solver name\r\n%   is case-insensitive; so, for example, both 'SeDuMi' and 'sedumi' will\r\n%   select the same solver.\r\n%\r\n%   When CVX is first installed, the solver SDPT3 is selected as the\r\n%   default. For most problems, this will be a good choice; nevertheless,\r\n%   no solver is perfect, so if you encounter issues you may wish to\r\n%   experiment with other solvers.\r\n%\r\n%   There are two ways to use the CVX_SOLVER command. If you use it within\r\n%   a model---that is, between the statements CVX_BEGIN and CVX_END---then\r\n%   the new solver selection will apply only to that particular model. For\r\n%   instance, if the default solver is SDPT3, then the following structure\r\n%   will solve a single model using SeDuMi instead:\r\n%       cvx_begin\r\n%           cvx_solver sedumi\r\n%           variables ...\r\n%           ...\r\n%       cvx_end\r\n%   On the other hand, if CVX_SOLVER is called *outside* of a model, then\r\n%   the change will apply for all subsequent models, or until you call \r\n%   CVX_SOLVER once again.\r\n%\r\n%   [ SOLVER, SOLVER_LIST ] = CVX_SOLVER returns the name of the current\r\n%   solver, and a cell array containing the names of all available choices.\r\n%\r\n%   Calling CVX_SOLVER with no input or output arguments produces a listing\r\n%   of the solvers that CVX currently recognized, and an indication of the\r\n%   current solver selection and/or the default.\r\n\r\nglobal cvx___\r\ncvx_global\r\nif nargin,\r\n    if isempty( sname ),\r\n        sname = 'default';\r\n    elseif ~ischar( sname ) || size( sname, 1 ) ~= 1,\r\n        error( 'Argument must be a string.' );\r\n    end\r\n    try\r\n        snumber = cvx___.solvers.map.(lower(sname));\r\n    catch\r\n        error( 'Unknown, unusable, or missing solver: %s', sname );\r\n    end\r\n    if ~isempty( cvx___.solvers.list(snumber).error ),\r\n        error( 'Solver unusable due to prior errors: %s', sname );\r\n    end\r\n    if isempty( cvx___.problems ),\r\n        cvx___.solvers.selected = snumber;\r\n    elseif ~isa( evalin( 'caller', 'cvx_problem', '[]' ), 'cvxprob' ),\r\n        error( 'The global CVX solver selection cannot be changed while a model is being constructed.' );\r\n    else\r\n        cvx___.problems(end).solver.index = snumber;\r\n    end\r\n    if cvx___.solvers.active,\r\n        cvx_setspath;\r\n    end\r\nelseif nargout == 0,\r\n    solvers = cvx___.solvers;\r\n    snames = solvers.names;\r\n    statvec = [ 0, solvers.map.default, solvers.active ];\r\n    statstr = { 'selected', 'default', 'active' };\r\n    if ~isempty( cvx___.problems ),\r\n        statvec(1) = cvx___.problems(end).solver.index;\r\n    else\r\n        statvec(1) = solvers.selected;\r\n    end\r\n    fprintf( '\\n' );\r\n    dash = '-';\r\n    solvers = solvers.list;\r\n    nsolv = length( solvers );\r\n    lens = [4,6,7,8];\r\n    for k = 1 : nsolv,\r\n        if isempty( solvers(k).error ),\r\n            nstat = statstr(k==statvec);\r\n            if ~isempty(nstat),\r\n                nstat = sprintf( '%s,', nstat{:} );\r\n                nstat = nstat(1:end-1);\r\n            end\r\n        else\r\n            nstat = 'disabled';\r\n        end\r\n        lens = max( lens, [ length(snames{k}), length(nstat), length(solvers(k).version), length(solvers(k).location) ] );\r\n    end\r\n    fmt = sprintf( '   %%-%ds   %%-%ds   %%-%ds   %%s\\\\n', lens(1), lens(2), lens(3) );\r\n    fprintf( fmt, 'Name', 'Status', 'Version', 'Location' ); %#ok\r\n    fprintf( '%s\\n', dash(ones(1,sum(lens)+15)) );\r\n    for k = 1 : nsolv,\r\n        if isempty( solvers(k).error ),\r\n            nstat = statstr(k==statvec);\r\n            if ~isempty(nstat),\r\n                nstat = sprintf( '%s,', nstat{:} );\r\n                nstat = nstat(1:end-1);\r\n            else\r\n                nstat = '';\r\n            end\r\n        else\r\n            nstat = 'disabled';\r\n        end\r\n        fprintf( fmt, snames{k}, nstat, solvers(k).version, solvers(k).location );\r\n    end\r\n    fprintf( '\\n' );\r\nend\r\nif nargout > 0,\r\n    sout = cvx___.solvers.list(cvx___.solvers.selected).name;\r\n    slist = cvx___.solvers.names;\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_solver_settings.m",
    "content": "function sout = cvx_solver_settings( varargin )\n\n%CVX_SOLVER_SETTINGS    CVX solver settings adjustment.\n%   CVX_SOLVER_SETTINGS is used to adjust the advaned settings of the \n%   current solver being used by CVX. Before using this function, please \n%   read the IMPORTANT NOTE below.\n%\n%   CVX_SOLVER_SETTINGS( <name1>, <value1>, [ <name2>, <value2>, ... ] )\n%   stores a custom setting called <name1> for the active solver, and gives\n%   it a value of <value2>, and so forth for the other key-value pairs.\n%   Each name must be a string containing a valid variable name; the values\n%   may be of any type or size, including empty arrays or strings.\n%\n%   When CVX_END is reached, these key/value pairs will be delivered to the\n%   underlying solver as parameters. This allows an expert user to modify\n%   the behavior of the underlying solver in a manner that is otherwise\n%   unavailable through more standard CVX commands.\n%\n%   CVX_SOLVER_SETTINGS( 'name' ) or\n%   CVX_SOLVER_SETTINGS name\n%   returns the current value of that setting for the current solver. If\n%   there is no such setting by that name, an error results.\n%\n%   CVX_SOLVER_SETTINGS( '-clear', <name1>, '-clear', <name2>, ... ) or\n%   CVX_SOLVER_SETTINGS -clear <name>\n%   Removes the key/value pair matching <name> from the settings list for \n%   the active solver.\n%\n%   CVX_SOLVER_SETTINGS, with no arguments, displays the current list of\n%   settings for the active solver.\n%\n%   CVX_SOLVER_SETTINGS -all displays a list of the settings for all\n%   all available solvers.\n%\n%   CVX_SOLVER_SETTINGS -clear clears all settings for the active solver.\n%\n%   CVX_SOLVER_SETTINGS -clearall clears all settings for all solvers.\n%\n%   CVX_SOLVER_SETTINGS( S )\n%   where S is a structure, replaces the *entire* list of solver settings\n%   with the field-value pairs stored in the structure S.\n%\n%   S = CVX_SOLVER_SETTINGS returns a structure containing all of the\n%   settings for the current solver.\n%\n%   If you call CVX_SOLVER_SETTINGS within a model --- that is, between\n%   CVX_BEGIN and CVX_END --- then the changes are \"local\": that is, they\n%   will apply ONLY to the current model.\n%\n%   On the other hand, if you call CVX_SOLVER_SETTINGS outside of a model,\n%   then the changes are \"global\": they will apply to all subsequent models\n%   that employ that solver.\n%\n%   CVX_SAVE_PREFS will save any global settings you have provided, so they\n%   will be restored the next time you start MATLAB.\n%\n%   CVX_SOLVER_SETTINGS( 'dumpfile', <filename> ) is a setting supported by\n%   all solvers. If set, it will save a .MAT file containing the exact\n%   input arguments delivered to the solver. This file will be created\n%   immediately before the solver is called, so you will be able to examine\n%   their contents even if the solver fails with an error. This feature is\n%   to be used primarily by solver developers.\n%\n%   **** IMPORTANT NOTE ****\n%   Please use this feature with extreme caution, and at your own risk:\n%   * CVX does not check the correctness of the settings you supply. If the\n%     solver rejects the setting you supply, CVX will fail until you change\n%     or remove that setting.\n%   * Use of this feature can alter the quality of the solutions that the\n%     solver produces: sometimes for the better, sometimes for the worse.\n%   * Please consult your solver's specific documentation for information\n%     about its available settings.\n%   * The settings set here *override* any default values CVX has chosen\n%     for each solver. In certain cases, this may actually confuse CVX and\n%     and cause it to misinterpret the results. Fpr this reason, we cannot\n%     support all possible combinations of custom settings.\n%\n%   See also CVX_SOLVER, CVX_SAVE_PREFS, CVX_QUIET, CVX_PRECISION.\n\nglobal cvx___\ncvx_global\nis_local = ~isempty( cvx___.problems );\nif is_local,\n    snumber = cvx___.problems(end).solver.index;\n    settings = cvx___.problems(end).solver.settings;\nelse\n    snumber = cvx___.solvers.selected;\n    if isfield( cvx___.solvers.list, 'settings' ),\n        settings = cvx___.solvers.list(snumber).settings;\n    else\n        settings = [];\n    end\nend\nsname = cvx___.solvers.names{snumber};\nupdate = false;\nswitch nargin,\n    case 0,\n        if is_local,\n            fprintf( '\\nLocal settings for solver %s:\\n', sname );\n        else\n            fprintf( '\\nGlobal settings for solver %s:\\n', sname );\n        end\n        if isempty( settings ) || isempty( fieldnames( settings ) ),\n            fprintf( '    No custom settings specified.\\n\\n' );\n        else\n            disp( settings );\n        end\n    case 1,\n        t_setting = varargin{1};\n        if isstruct( t_setting ),\n            update = true;\n            if numel( t_setting ) > 1,\n                error( 'Argument must be a string or a scalar structure.' );\n            elseif isempty( fieldnames( settings ) ),\n                settings = [];\n            else\n                settings = t_setting;\n            end\n        elseif ~ischar( t_setting ) || isempty( t_setting ) || size( t_setting, 1 ) > 1,\n            error( 'Argument must be a string or a scalar structure.' );\n        else\n            switch t_setting,\n                case '-all',\n                    fprintf( '\\n' );\n                    if is_local,\n                        fprintf( 'Local settings for solver %s:\\n', sname );\n                        if isempty( settings ) || isempty( fieldnames( settings ) ),\n                            fprintf( '    No custom settings specified.\\n\\n' );\n                        else\n                            disp( settings );\n                        end\n                    end\n                    for k = 1 : length(cvx___.solvers.list),\n                        fprintf( 'Global settings for solver %s:\\n', cvx___.solvers.names{k} );\n                        settings = cvx___.solvers.list(k).settings;\n                        if isempty( settings ) || isempty( fieldnames( settings ) ),\n                            fprintf( '    No custom settings specified.\\n\\n' );\n                        else\n                            disp( settings );\n                        end\n                    end\n                case '-clear',\n                    settings = [];\n                    update = true;\n                case '-clearall',\n                    settings = [];\n                    update = is_local;\n                    [ cvx___.solvers.list.settings ] = deal( [] );\n                otherwise,\n                    if ~isvarname( t_setting ),\n                        error( 'CVX:InvalidField', 'Not a valid setting name: %s', t_setting );\n                    elseif isfield( settings, t_setting ),\n                        settings = settings.(t_setting);\n                    else\n                        error( 'CVX:NoSetting', 'Setting %s is not set.', t_setting );\n                    end\n            end\n        end\n    otherwise,\n        update = true;\n        if rem( nargin, 2 ) ~= 0,\n            error( 'Number of arguments must be even.' );\n        end\n        for k = 1 : nargin/2,\n            t_setting = varargin{2*k-1};\n            t_value = varargin{2*k};\n            if ~ischar( t_setting ) || isempty( t_setting ) || size( t_setting, 1 ) > 1,\n                error( 'CVX:InvalidField', 'Argument %d must be a string.', 2*k-1 );\n            else\n                switch t_setting,\n                    case '-clear',\n                        if ~isvarname( t_value ),\n                            error( 'CVX:InvalidField', 'Not a valid setting name: %s', t_value );\n                        elseif ~isfield( settings, t_value ),\n                            error( 'CVX:NoSetting', 'Setting %s is not set.', t_setting );\n                        else\n                            settings = rmfield( settings, t_value );\n                            update = true;\n                        end\n                    otherwise,\n                        if ~isvarname( t_setting ),\n                            error( 'CVX:InvalidField', 'Not a valid setting name: %s', t_setting );\n                        else\n                            settings.(t_setting) = t_value;\n                            update = true;\n                        end\n                end\n            end\n        end\nend\nif update,\n    if is_local,\n        cvx___.problems(end).solver.settings = settings;\n    else\n        cvx___.solvers.list(snumber).settings = settings;\n    end\nend    \nif nargout,\n    sout = settings;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_tic.m",
    "content": "function cvx_tic\n \n%CVX_TIC Resets the CVX timing functionality.\n%\n%   CVX collects the following timing information:\n%   --- Elapsed time since CVX_TIC was last called. If CVX_TIC was never\n%       called, this measures the time since CVX was first initialized.\n%   --- Elapsed time spent between top-level CVX_BEGIN and CVX_END comamnds\n%   --- Elapsed time spent within the top-level CVX_END itself. This\n%       includes final problem extraction, presolving, and solving.\n%   --- Elapsed time spent calling the numerical solver.\n%   To retrieve the current totals for these numbers, type CVX_TOC.\n%   CVX_TIC resets these numbers to zero.\n\nglobal cvx___\ncvx_global\nif ~isempty( cvx___.problems ),\n    error( 'CVX_TIC can only be called when no models are in construction.' );\nend\ncvx___.timers(1) = tic;\ncvx___.timers(2:4) = 0;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_toc.m",
    "content": "function timers = cvx_toc\n \n%CVX_TOC Returns the current timing information.\n%\n%   CVX collects the following timing information:\n%   --- Elapsed time since CVX_TIC was last called. If CVX_TIC was never\n%       called, this measures the time since CVX was first initialized.\n%   --- Elapsed time spent between top-level CVX_BEGIN and CVX_END comamnds\n%   --- Elapsed time spent within the top-level CVX_END itself. This\n%       includes final problem extraction, presolving, and solving.\n%   --- Elapsed time spent calling the numerical solver.\n%   To retrieve the current totals for these numbers, type CVX_TOC.\n%   CVX_TIC resets these numbers to zero.\n\nglobal cvx___\nif isempty( cvx___ ),\n    error( 'CVX has not yet been used (or the global workspace has been cleared).' );\nend\ntstart = tic;\ntimers = double(cvx___.timers);\ndbltim = isa( timers, 'double' );\nif dbltim,\n    tstart = double(tstart);\nend\ntimers(1) = tstart - timers(1);\nif isempty(cvx___.increment),\n    switch computer,\n        case { 'MACI', 'MACI64' },\n            cvx___.increment = 1e9;\n        otherwise,\n            t1 = tic; pause(0.25); t2 = tic; t3 = toc(t1); t4=toc(t2);\n            if dbltim,\n                cvx___.increment = (double(t2)-double(t1))/(double(t3)-0.5*double(t4));\n            else\n                two = uint64(2);\n                cvx___.increment = double( two * ( t2 - t1 ) ) / ( two * t3 - t4 );\n            end\n    end\nend\ntimers = [ timers(1), timers(1:3) - timers(2:4), timers(4) ];\ntimers = timers / cvx___.increment;\nif nargout == 0,\n    fprintf( 'Total time:      %g sec\\n', timers(1) );\n    fprintf( 'Outside of CVX:  %g sec\\n', timers(2) );\n    fprintf( 'Model building:  %g sec\\n', timers(3) );\n    fprintf( 'Presolving:      %g sec\\n', timers(4) );\n    fprintf( 'Solving:         %g sec\\n', timers(5) );\n    clear timers\nend\n    \n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/commands/cvx_where.m",
    "content": "function s = cvx_where\n\n%CVX_WHERE    Returns the location of the CVX system.\n%   CVX_WHERE returns a string containing the base directory of the CVX\n%   modeling framework. Within that directory are some useful\n%   subdirectories and files:\n%       functions/    new functions \n%       examples/     sample cvx models\n%       LICENSE.txt   copyright information\n%   The proper operation of this function assumes that it has not been\n%   moved from its default position within the cvx distribution.\n\ntry\n    s = dbstack('-completenames');\ncatch\n    s = dbstack;\nend\ns = s(1);\nif isfield( s, 'file' ),\n    s = s.file;\nelse\n    s = s.name;\nend\nif ispc, \n    fs = '\\'; \nelse\n    fs = '/'; \nend\ntemp = strfind( s, fs );\ns( temp(end-1) + 1 : end ) = [];\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/cvx_error.m",
    "content": "function lines = cvx_error( errmsg, widths, useline, prefix, chop )\n\n% CVX_ERROR   Formats text for inclusion in error messages.\n%    This is an internal function used by CVX. It needed to be in the CVX\n%    home directory so that it's available during a fresh installation.\n\nif ~ischar( errmsg ),\n    if strncmp( errmsg.identifier, 'CVX:', 4 ),\n        format = 'basic';\n    else\n        format = 'extended';\n    end\n    try\n        errmsg = getReport( errmsg, format, 'hyperlinks', 'off' );\n        errmsg = regexprep( errmsg,'</?a[^>]*>', '' );\n    catch\n        if isfield(errmsg,'stack') && length(errmsg.stack) >= 1,\n            errmsg = sprintf( '%s\\n    Line %d: %s\\n', errmsg.message, errmsg.stack(1).line, errmsg.stack(1).file );\n        else\n            errmsg = sprintf( '%s\\n', errmsg.message );\n        end\n    end\nend\nlines = {};\nrndx = [ 0, regexp( errmsg, '\\n' ), length(errmsg) + 1 ];\nfor k = 1 : length(rndx) - 1,\n    line = errmsg( rndx(k)+1 : rndx(k+1) - 1 );\n    if ~isempty( line ),\n        width    = widths( min( k, length(widths) ) );\n        emax     = length( line );\n        n_indent = 0;\n        if emax > width,\n            f_indent = sum( regexp( line, '[^ ]', 'once' ) - 1 );\n            sndxs = find( line == ' ' );\n        end\n        while true,\n            if emax + n_indent <= width || isempty( sndxs ),\n                lines{end+1} = [ 32 * ones(1,n_indent), line ];\n                break;\n            end\n            sndx = sndxs( sndxs <= width - n_indent + 1 );\n            if isempty( sndx ), sndx = sndxs(1); end\n            chunk = line(1:sndx(end)-1);\n            lines{end+1} = [ 32*ones(1,n_indent), chunk ]; %#ok\n            line(1:sndx(end)) = [];\n            sndxs = sndxs(length(sndx)+1:end) - sndx(end);\n            emax = emax - sndx(end);\n            n_indent = f_indent + 4;\n        end\n    end\nend\nif nargin >= 3 && ( ischar(useline) || useline ),\n    line = '-';\n    line = line(1,ones(1,max(cellfun(@length,lines))));\n    sline = line;\n    if ischar( useline ),\n        sline(1:length(useline)) = useline;\n    end\n    lines = [ sline, lines, line ];\nend\nif nargout == 0 || nargin >= 4,\n    if nargin < 4, prefix = ''; end\n    lines = sprintf( [ prefix, '%s\\n' ], lines{:} );\nend\nif nargin >= 5 && chop,\n    lines(end) = [];\nend\nif nargout == 0,\n    fprintf( '%s', lines );\n    clear lines\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/cvx_setup.m",
    "content": "function cvx_setup( varargin )\n\n% CVX_SETUP   Sets up and tests the cvx distribution.\n%    This function is to be called any time CVX is installed on a new machine,\n%    to insure that the paths are set properly and the MEX files are compiled.\n\nglobal cvx___\ntry \n\n    cvx___ = [];\n    squares = {}; %#ok\n    nret = false;\n    oldpath = '';\n    line = '---------------------------------------------------------------------------'; \n\n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    % Get version and portability information %\n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    \n    cvx_version( '-install', varargin{:} );\n    if ~isfield( cvx___, 'loaded' ) || ~cvx___.loaded, %#ok\n        error( 'CVX:Expected', 'Error detected by cvx_version' );\n    end\n    isoctave = cvx___.isoctave;\n    mpath = cvx___.where;\n    fs = cvx___.fs;\n    ps = cvx___.ps;\n\n    %%%%%%%%%%%%%%%%%%%%%%%\n    % Reset the CVX paths %\n    %%%%%%%%%%%%%%%%%%%%%%%\n    \n    oldpath = cvx_startup( false );\n    if ~isempty( oldpath ),\n        fprintf( 'Saving updated path...' ); \n        nret = true;\n        s = warning('off'); %#ok\n        stat = savepath;\n        warning(s);\n        if stat,\n            fprintf('failed. (see below)\\n');\n        else\n            fprintf('done.\\n');\n            oldpath = [];\n        end\n    end\n    \n    %%%%%%%%%%%%%%%%%%%%%%\n    % Search for solvers %\n    %%%%%%%%%%%%%%%%%%%%%%\n\n    try\n        selected = cvx___.solvers.names{cvx___.solvers.map.default};\n    catch\n        selected = 'sdpt3';\n    end\n    cvx___.solvers = struct( 'selected', 0, 'active', 0, 'list', [], 'names', {{}}, 'map', struct( 'default', 0 ) );\n    fprintf( 'Searching for solvers...' ); nret = true;\n    shimpath = [ mpath, fs, 'shims', fs ];\n    solvers = dir( shimpath );\n    solvers = { solvers(~[solvers.isdir]).name };\n    if isoctave, efilt = '\\.m$'; else efilt = '\\.(m|p)$'; end\n    solvers = solvers( ~cellfun( @isempty, regexp( solvers, efilt ) ) );\n    solvers = unique( cellfun( @(x)x(1:end-2), solvers, 'UniformOutput', false ) );\n    solvers = struct( 'name', '', 'version', '', 'location', '', 'fullpath', '', 'error', '', 'warning', '', 'dualize', '', 'path', '', 'check', [], 'solve', [], 'settings', [], 'sname', solvers, 'spath', shimpath, 'params', [], 'eargs', {{}} );\n    solver2 = which( 'cvx_solver_shim', '-all' );\n    if ~isempty(solver2) && ~iscell(solver2),\n        solver2 = { solver2 };\n    end\n    for k = 1 : length(solver2),\n        tsolv = solver2{k};\n        ndxs = find(tsolv==fs,1,'last');\n        solvers(end+1).spath = tsolv(1:ndxs); %#ok\n        solvers(end).sname = tsolv(ndxs+1:end-2);\n    end\n    cur_d = pwd;\n    nsolvers = [];\n    nshims = length(solvers);\n    for k = 1 : nshims,\n        tsolv = solvers(k);\n        try\n            cd(tsolv.spath);\n            tsolv = feval( tsolv.sname, tsolv );\n            nsolv = length(tsolv);\n            if nsolv > 1,\n               sndx = 0;\n                for e = 0 : 1,\n                    for j = 1 : nsolv,\n                        if e ~= isempty( tsolv(j).error ),\n                            sndx = sndx + 1;\n                            if sndx > 1, tsolv(j).name = sprintf( '%s_%d', tsolv(j).name, sndx ); end\n                        end\n                    end\n                end\n            end\n        catch errmsg\n            errmsg = cvx_error( errmsg, 63, false, '  ' );\n            if isempty( tsolv.name ),\n                tsolv.name = [ tsolv.spath, tsolv.sname ];\n            end\n            tsolv.error = sprintf( 'unexpected error:\\n%s', errmsg );\n        end\n        nsolvers = [ nsolvers, tsolv ]; %#ok\n    end\n    solvers = nsolvers;\n    cd( cur_d );\n    \n    %%%%%%%%%%%%%%%%%%%%%%%%%\n    % Process solver errors %\n    %%%%%%%%%%%%%%%%%%%%%%%%%\n    \n    plurals = { 's', '', 's' };\n    nsolv = length(solvers);\n    nrej = sum(~cellfun(@isempty,{solvers.error}));\n    nwarn = sum(~cellfun(@isempty,{solvers.warning}));\n    fprintf( '%d shim%s found.\\n', nshims, plurals{min(nshims+1,3)} ); nret = false;\n    lens = [ 0, 0 ];\n    for k = 1 : nsolv,\n        lens = max( lens, [ length(solvers(k).name), length(solvers(k).version) ] );\n    end\n    fmt = sprintf( ' %%s  %%-%ds   %%-%ds    %%s\\\\n', lens(1), lens(2) );\n    if nsolv > nrej,\n        fprintf( '%d solver%s initialized (* = default):\\n', nsolv-nrej, plurals{min(nsolv-nrej+1,3)} );\n        stats =  { ' ', '*' };\n        for k = 1 : nsolv,\n            if isempty( solvers(k).error ),\n                fprintf( fmt, stats{1+strcmpi(solvers(k).name,selected)}, solvers(k).name, solvers(k).version, solvers(k).location );\n            end\n        end\n    end\n    if nrej,\n        fprintf( '%d solver%s skipped:\\n', nrej, plurals{min(nrej+1,3)} );\n        for k = 1 : nsolv,\n            if ~isempty( solvers(k).error ),\n                fprintf( fmt, ' ', solvers(k).name, solvers(k).version, solvers(k).location ); %#ok\n                cvx_error( solvers(k).error, 63, false, '        ' );\n            end\n        end\n    end\n    if nwarn,\n        fprintf( '%d solver%s issued warnings:\\n', nwarn, plurals{min(nwarn+1,3)} );\n        for k = 1 : nsolv,\n            if ~isempty( solvers(k).warning ) && isempty( solvers(k).error ),\n                fprintf( fmt, ' ', solvers(k).name, solvers(k).version, solvers(k).location ); %#ok\n                cvx_error( solvers(k).warning, 63, false, '        ' );\n            end\n        end\n    end\n    if nrej == nsolv,\n        fprintf( [ ... \n            'No valid solvers were found. This suggests a corrupt installation. Please\\n', ...\n            'try re-installing the files and re-running cvx_setup. If the same error\\n', ...\n            'occurs, please contact CVX support.\\n' ] );\n        error('CVX:Unexpected','No valid solvers were found.');\n    end\n    solvers = solvers(cellfun(@isempty,{solvers.error}));\n    cvx___.solvers.list  = solvers;\n    cvx___.solvers.names = { solvers.name };\n    cvx___.solvers.map   = struct( 'default', 0 );\n    for k = 1 : length(solvers),\n        cvx___.solvers.map.(lower(solvers(k).name)) = k;\n        if strcmpi( solvers(k).name, selected ),\n            cvx___.solvers.map.default = k;\n            cvx___.solvers.selected = k;\n        end\n    end\n    if cvx___.solvers.selected == 0,\n        cvx___.solvers.selected = 1;\n        cvx___.solvers.map.default = 1;\n        fprintf( [ ...\n            'WARNING: The default solver %s is missing; %s has been selected as a\\n', ...\n            '    new default. If this was unexpected, try re-running cvx_setup.\\n' ], ...\n            selected, cvx___.solvers.list(cvx___.solvers.selected).name, lower(cvx___.solvers.list(cvx___.solvers.selected).name) );\n    end\n    \n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    % Create the global data structure %\n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    \n    cvx_global;\n    if isempty( cvx___.solvers.list ),\n        error('CVX:Unexpected','No valid solvers were found.');\n    end\n    \n    %%%%%%%%%%%%%%%%%%%%\n    % Save preferences %\n    %%%%%%%%%%%%%%%%%%%%\n    \n    fprintf( 'Saving updated preferences...' ); nret = true;\n    try\n        cvx_save_prefs( 'save' );\n        fprintf( 'done.\\n' ); nret = false;\n    catch errmsg\n        fprintf( 'unexpected error:\\n' ); nret = false;\n        cvx_error( errmsg, 67, true, '    ' );\n        fprintf( 'Please attempt to correct this error and re-run cvx_setup. If you cannot,\\n' );\n        fprintf( 'you will be forced to re-run cvx_setup every time you start MATLAB.\\n' );\n    end\n    \n    %%%%%%%%%%%%%%%%%%%%%%%%%\n    % Test the distribution %\n    %%%%%%%%%%%%%%%%%%%%%%%%%\n\n    fprintf( 'Testing with a simple model...' ); nret = true;\n    need_cc = false;\n    try\n        m = 16; n = 8;\n        A = randn(m,n);\n        b = randn(m,1);\n        cvx_begin('quiet')\n            variable('x(n)');\n            minimize( norm(A*x-b,1) );\n        cvx_end\n        fprintf( 'done!\\n' ); nret = false;\n    catch exc\n        if any(strfind(exc.message,'clear classes')),\n            fprintf( 'problem (see below).\\n' );\n            need_cc = true;\n        else\n            rethrow( exc );\n        end\n    end\n        \n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    % Quick instructions on changing the solver %\n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    \n    if length( cvx___.solvers.list ) > 1,\n        fprintf( '%s\\n', line );\n        fprintf( 'To change the default solver, type \"cvx_solver <solver_name>\".\\n')\n        fprintf( 'To save this change for future sessions, type \"cvx_save_prefs\".\\n' );\n        fprintf( 'Please consult the users'' guide for more information.\\n' );\n    end\n    \n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    % Instruct the user to save the path %\n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    \n    if ~isempty( oldpath )\n        need_upr = false;\n        need_disclaim = true;\n        user_path = which( 'startup.m' );\n        if isempty( user_path ),\n            user_path = userpath;\n            if length(user_path) <= 1,\n                need_upr = true;\n                user_path = system_dependent('getuserworkfolder', 'default');\n                if ~isempty( user_path ),\n                    if isempty( strfind( user_path, [ fs, 'MATLAB' ] ) ),\n                        user_path = [ user_path, fs, 'MATLAB' ];\n                    end\n                end\n            elseif user_path(end) == ps,\n                user_path(end) = '';\n            end\n            if ~isempty( user_path ),\n                user_file = [ user_path, fs, 'startup.m' ];\n            else\n                user_file = '';\n            end\n        else\n            user_file = user_path;\n            user_path = user_path(1:end-10);\n        end\n        fprintf( '%s\\n', line );\n        fprintf('NOTE: the MATLAB path has been changed to point to the CVX distribution. To\\n' );\n        fprintf('use CVX without having to re-run CVX_SETUP every time MATLAB starts, you\\n' );\n        fprintf('will need to save this path permanently. This script attempted to do this\\n' );\n        if fs == '/',\n            fprintf('for you, but failed---likely due to UNIX permissions restrictions.\\n' );\n            nextword = 'To solve the problem';\n        else\n            fprintf('for you, but failed, due to the Windows User Access Control (UAC) settings.\\n');\n            fprintf('<a href=\"http://www.mathworks.com/support/solutions/en/data/1-9574H9/index.html?solution=1-9574H9\">Click here</a> for a MATLAB document that discusses the issue.\\n\\n');\n            fprintf('To solve this problem, please take the following steps:\\n');\n            fprintf('    1) Exit MATLAB.\\n');\n            fprintf('    2) Right click on the MATLAB icon, and select \"Run as administrator.\"\\n' );\n            fprintf('    3) Re-run \"cvx_setup\".\\n\\n');\n            nextword = 'Alternatively, if you do not have administrator access';\n        end\n        if exist( user_file, 'file' ),\n            fprintf( '%s, edit the file\\n    %s\\nand add the following line to the end of the file:\\n', nextword, user_file ); \n            fprintf( '    run %s%scvx_startup.m\\n', mpath, fs );\n        elseif ~isempty( user_path ),\n            fprintf( '%s, create a new file\\n    %s\\ncontaining the following line:\\n', nextword, user_file );\n            fprintf( '    run %s%scvx_startup.m\\n', mpath, fs );\n        else\n            fprintf( '%s, create a startup.m file containing the line:\\n', nextword );\n            fprintf( '    run %s%scvx_startup.m\\n', mpath, fs );\n            fprintf( 'Consult the MATLAB documentation for the proper location for that file.\\n' );\n            need_disclaim = false;\n        end\n        if need_upr,\n            fprintf( 'Then execute the following MATLAB commands:\\n    userpath reset; startup\\n' );\n        end\n        if need_disclaim,\n            fprintf( 'Please consult the MATLAB documentation for more information about the\\n' );\n            fprintf( 'startup.m file and its proper placement and usage.\\n' );\n        end\n    end\n    \n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    % Warn about class conflict with previous version of CVX %\n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    \n    if need_cc,\n        fprintf( '%s\\n', line );\n        fprintf('WARNING: CVX was unable to run the test model due to a conflict with the\\n' );\n        fprintf('previous version of CVX. If no other errors occurred, then the setup was\\n' );\n        fprintf('still successful; however, to use CVX, you will need to re-start MATLAB.\\n' );\n    end\n    \n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    % Warn about signal processing toolbox conflict %\n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    \n    squares = which( 'square', '-all' );\n    if iscell( squares ) && length( squares ) > 1,\n        squares = squares(~cellfun(@(x)any(strfind(x,[fs,'@cvx',fs])),squares));\n        if length(squares) == 1 || ~strncmp(squares{1},[mpath,fs],length(mpath)+1),\n            squares = {};\n        end\n    else\n        squares = {};\n    end\n    if ~isempty(squares),\n        fprintf( '%s\\n', line );\n        fprintf('WARNING: CVX includes a function\\n    %s\\n', squares{1} );\n        fprintf('that conflicts with a function of the same name found here:\\n    %s\\n', squares{2} );\n        fprintf('If you wish to use this second function, you will need to rename or delete\\n' );\n        fprintf('the CVX version, as it will likely produce different results. This will not\\n' );\n        fprintf('affect the use of SQUARE() within CVX models, because CVX relies on a\\n' );\n        fprintf('different, internal version of SQUARE() when constructing CVX models.\\n')\n    end\n\ncatch errmsg\n\n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    % Restore the environment in the event of an error %\n    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n    if nret, fprintf( '\\n' ); end\n    switch errmsg.identifier,\n        case { 'CVX:Expected', 'CVX:Licensing' },\n            unexpected = false;\n            if ~isempty( errmsg.message ),\n                cvx_error( errmsg, 67, 'ERROR: ', '    ' );\n            end\n        case 'CVX:Unexpected',\n            unexpected = true;\n        otherwise,\n            cvx_error( errmsg, 67, 'UNEXPECTED ERROR: ', '    ' );\n            unexpected = true;\n    end\n    if ~isempty( oldpath ),\n        path( oldpath );\n    end\n    clear global cvx___\n    if unexpected,\n        fprintf( 'Please report this error to support, and include entire output of\\n' );\n        fprintf( 'CVX_SETUP in your support request.\\n' );\n    else\n        fprintf( 'The installation of CVX was not completed. Please correct the error\\n' );\n        fprintf( 'and re-run CVX_SETUP.\\n' );\n    end\n\nend\n\nfprintf( '%s\\n\\n', line );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/cvx_startup.m",
    "content": "function prevpath = cvx_startup( quiet )\n\n%CVX_STARTUP   Quietly add CVX to your MATLAB path (for startup).\n%    Running CVX_STARTUP upon startup ensures that CVX is properly included\n%    in your MATLAB path.\n%\n%    On Mac and PC systems, this function is not necessary, because you can\n%    simply run \"savepath\" to save the CVX path changes permanently, or use\n%    the \"pathtool\" command to do the same. In fact, CVX_SETUP attempts to\n%    run \"savepath\" as part of its setup process.\n%\n%    On UNIX systems, the MATLAB installation is usually installed in such\n%    a manner that individual users cannot change the global MATLAB path.\n%    This can be circumvented by making the PATHDEF.M file world-writable;\n%    but if the system serves multiple users, this may not be desirable.\n%\n%    CVX_STARTUP provides a simple solution to this problem. Simply add the\n%    following line to the end of your local STARTUP.M file:\n%        run <full_path_to_CVX>/cvx_startup\n%    Note that using the \"run\" command *and* providing the full path to the\n%    CVX installation are critical. With this change, CVX_STARTUP.M will be\n%    called every time the user runs MATLAB.\n%\n%    Note that CVX_STARTUP is *not* a substitute for running CVX_SETUP.\n%    Please run CVX_SETUP first when installing CVX, and *then* add the\n%    CVX_STARTUP line if instructed to do so.\n\nglobal cvx___\nif nargin < 1 || isempty( quiet ), \n    quiet = false; \nend\nif ~quiet,\n    fprintf( 'Setting CVX paths...' );\nend\ncvx_version(1);\nfs = cvx___.fs;\nps = cvx___.ps;\ncs = cvx___.cs;\nmpath = cvx___.where;\nmsub = cvx___.msub;\n\nprevpath = path;\noldpath = textscan( prevpath, '%s', 'Delimiter', ps );\noldpath = oldpath{1}(:)';\nother_homes = which( 'cvx_setup.m', '-all' );\nif ~iscell( other_homes ), other_homes = { other_homes }; end\nother_homes = regexprep( other_homes, '.cvx_setup\\.m$', '' );\nother_homes( strcmp( other_homes, mpath ) ) = [];\nndxs = false(size(oldpath));\nfor k = 0 : length(other_homes),\n    if k, tpath = other_homes{k}; else tpath = mpath; end\n    plen = length(tpath);\n    if cs, tndxs = strncmp( tpath, oldpath, plen );\n    else tndxs = strncmpi( tpath, oldpath, plen ); end\n    tndxs(tndxs) = cellfun(@(x)length(x)<=plen||x(plen+1)==fs,oldpath(tndxs));\n    ndxs = ndxs | tndxs;\nend\ndndx = find(ndxs,1) - 1;\nif isempty(dndx),\n    dndx = +strcmp(oldpath{1},'.');\nend\nchanged = false;\nif any(ndxs),\n    changed = true;\n    newpath = horzcat( oldpath(~ndxs) );\n    npath = sprintf( [ '%s', pathsep ], newpath{:} );\n    npath = npath(1:end-1);\n    path(npath);\nend\n\naddpaths = { 'builtins', 'commands', 'functions', 'lib', 'structures' };\nmpath2 = mpath + fs; npath2 = length(mpath2);\nif ~any(~strncmp(which('vec', '-all'), mpath2, npath2)),\n    addpaths{end+1} = [ 'functions', fs, 'vec_' ]; \nend\nif ~any(~strncmp(which('square', '-all'), mpath2, npath2)),\n    addpaths{end+1} = [ 'functions', fs, 'square_' ]; \nend\nif ~any(~strncmp(which('narginchk', '-all'), mpath2, npath2)),\n    addpaths{end+1} = [ 'lib', fs, 'narginchk_' ]; \nend\naddpaths = strcat( [ mpath, fs ], addpaths );\nif ~isempty(msub),\n  mpath2 = [ mpath, fs, 'lib', fs, msub ];\n  if exist( mpath2, 'dir' ),\n    addpaths{end+1} = mpath2;\n  end\nend\naddpaths{end+1} = mpath;\n\nndxs(1:dndx) = true;\nnewpath = horzcat( oldpath(1:dndx), addpaths, oldpath(~ndxs) );\nif changed || ~isequal( newpath, oldpath ),\n    npath = sprintf( [ '%s', pathsep ], newpath{:} );\n    npath = npath(1:end-1);\n    path(npath);\nend\nif ~quiet,\n    if isequal( newpath, oldpath ),\n        fprintf( 'already set!\\n' );\n    else\n        fprintf( 'done.\\n' );\n    end\n    if ~isempty( other_homes ),\n        fprintf( 'WARNING: other CVX installations were found in your MATLAB path:\\n' );\n        fprintf( '    %s\\n', other_homes{:} );\n        fprintf( 'They have been removed to prevent conflicts.\\n' );\n    end\nend\nif nargout,\n    if isequal( npath, prevpath ),\n        prevpath = '';\n    end\nelse\n    clear prevpath\nend\ncpath = struct('string','','active',false,'hold',false);\nsubs = strcat([mpath,fs],{'keywords','sets'});\ncpath.string = sprintf( ['%s',ps], subs{:} );\ncvx___.path = cpath;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/cvx_version.m",
    "content": "function varargout = cvx_version( varargin )\n\n% CVX_VERSION   Returns version and environment information for CVX.\n%\n%    When called with no arguments, CVX_VERSION prints out version and\n%    platform information that is needed when submitting CVX bug reports.\n%\n%    This function is also used internally to return useful variables that\n%    allows CVX to adjust its settings to the current environment.\n\nglobal cvx___\n\nargs = varargin;\ncompile = false;\nquick = nargout > 0;\nif nargin\n    if ~ischar( args{1} ),\n        quick = true;\n    else\n        tt = strcmp( args, '-quick' );\n        quick = any( tt );\n        if quick, args(tt) = []; end\n        tt = strcmp( args, '-compile' );\n        compile = any( tt );\n        if compile, quick = false; args(tt) = []; end\n    end\nend\n\nif isfield( cvx___, 'loaded' ),\n    \n    if quick, return; end\n    fs = cvx___.fs;\n    mpath = cvx___.where;\n    isoctave = cvx___.isoctave;\n    \nelse\n    \n    % Matlab / Octave flag\n    isoctave = exist( 'OCTAVE_VERSION', 'builtin' );\n\n    % File and path separators, MEX extension\n    if isoctave,\n        comp = octave_config_info('canonical_host_type');\n        mext = 'mex';\n        izpc = false;\n        izmac = false;\n        if octave_config_info('mac'),\n            msub = 'mac';\n            izmac = true;\n        elseif octave_config_info('windows'),\n            msub = 'win';\n            izpc = true;\n        elseif octave_config_info('unix') && any(strfind(comp,'linux')),\n            msub = 'lin';\n        else\n            msub = 'unknown';\n        end\n        if ~isempty( msub ),\n            msub = [ 'o_', msub ];\n            if strncmp( comp, 'x86_64', 6 ),\n                msub = [ msub, '64' ];\n            else\n                msub = [ msub, '32' ];\n            end\n        end\n    else\n        comp = computer;\n        izpc = strncmp( comp, 'PC', 2  );\n        izmac = strncmp( comp, 'MAC', 3 );\n        mext = mexext;\n        msub = '';\n    end\n    if izpc,\n        fs = '\\'; \n        fsre = '\\\\';\n        ps = ';'; \n        cs = false;\n    else\n        fs = '/'; \n        fsre = '/';\n        ps = ':';\n        cs = ~izmac;\n    end\n\n    % Install location\n    mpath = mfilename('fullpath');\n    temp = strfind( mpath, fs );\n    mpath = mpath( 1 : temp(end) - 1 );\n\n    % Numeric version\n    nver = version;\n    nver(nver=='.') = ' ';\n    nver = sscanf(nver,'%d');\n    nver = nver(1) + 0.01 * ( nver(2) + 0.01 * nver(3) );\n    \n    if isoctave || ~usejava('jvm'),\n        jver = 0;\n    else\n        jver = char(java.lang.System.getProperty('java.version'));\n        try\n            ndxs = strfind( jver, '.' );\n            jver = str2double( jver(1:ndxs(2)-1) );\n        catch\n            jver = 0;\n        end\n    end\n    \n    cvx___.where = mpath;\n    cvx___.isoctave = isoctave;\n    cvx___.nver = nver;\n    cvx___.jver = jver;\n    cvx___.comp = comp;\n    cvx___.mext = mext;\n    cvx___.msub = msub;\n    cvx___.fs = fs;\n    cvx___.fsre = fsre;\n    cvx___.ps = ps;\n    cvx___.cs = cs;\n    \nend\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Quick exit for non-verbose output %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nif quick,\n    if nargout,\n        varargout = { fs, cvx___.ps, mpath, cvx___.mext };\n    end\n    cvx_load_prefs( false );\n    cvx___.loaded = true;\n    return\nend\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Verbose output (cvx_setup, cvx_version plain) %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\ncvx_ver = '2.1';\ncvx_bld = '****';\ncvx_bdate = '<undated>';\ncvx_bcomm = '*******';\nline = '---------------------------------------------------------------------------';\nfprintf( '\\n%s\\n', line );\nfprintf( 'CVX: Software for Disciplined Convex Programming       (c)2014 CVX Research\\n' );\nfprintf( 'Version %3s, Build %4s (%7s)%42s\\n', cvx_ver, cvx_bld, cvx_bcomm, cvx_bdate );\nfprintf( '%s\\n', line );\nfprintf( 'Installation info:\\n    Path: %s\\n', cvx___.where );\nif isoctave,\n    fprintf( '    GNU Octave %s on %s\\n', version, cvx___.comp );\nelse\n    verd = ver('MATLAB');\n    fprintf( '    MATLAB version: %s %s\\n', verd.Version, verd.Release );\n    if usejava( 'jvm' ),\n        os_name = char(java.lang.System.getProperty('os.name'));\n        os_arch = char(java.lang.System.getProperty('os.arch'));\n        os_version = char(java.lang.System.getProperty('os.version'));\n        java_str = char(java.lang.System.getProperty('java.version'));\n        fprintf('    OS: %s %s version %s\\n', os_name, os_arch, os_version );\n        fprintf('    Java version: %s\\n', java_str );\n    else\n        fprintf( '    Architecture: %s\\n', cvx___.comp );\n        fprintf( '    Java version: disabled\\n' );\n    end\nend\n    \n%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Check for valid version %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nissue = false;\nisoctave = cvx___.isoctave;\nnver = cvx___.nver;\nif isoctave,\n    if nver <= 3.08,\n        fprintf( '%s\\nCVX is not yet supported on Octave.\\n(Please do not waste further time trying: changes to Octave are required.\\nBut they are coming! Stay tuned.)\\n%s\\n', line, line );\n        issue = true;\n    end\nelseif nver < 7.08 && strcmp( cvx___.comp(end-1:end), '64' ),\n    fprintf( '%s\\nCVX requires MATLAB 7.8 or later (7.5 or later on 32-bit platforms).\\n' , line, line );\n    issue = true;\nelseif nver < 7.05,\n    fprintf( '%s\\nCVX requires MATLAB 7.5 or later (7.8 or later on 64-bit platforms).\\n' , line, line );\n    issue = true;\nend\n\n%%%%%%%%%%%%%%%%%%%%%%%%\n% Verify file contents %\n%%%%%%%%%%%%%%%%%%%%%%%%\n\nfid = fopen( [ mpath, fs, 'MANIFEST' ], 'r' );\nif fid > 0,\n    fprintf( 'Verfying CVX directory contents:' );\n    manifest = textscan( fid, '%s' );\n    manifest = manifest{1};\n    fclose( fid );\n    newman = get_manifest( mpath, fs );\n    if ~isequal( manifest, newman ),\n        missing = setdiff( manifest, newman );\n        additional = setdiff( newman, manifest );\n        if ~isempty( missing ) || ~isempty( additional ),\n            if fs ~= '/',\n                missing = strrep( missing, '/', fs );\n                additional = strrep( additional, '/', fs );\n            end\n            if ~isempty( missing ),\n                fprintf( '\\n    WARNING: The following files/directories are missing:\\n' );\n                isdir = cellfun(@(x)x(end)==fs,missing);\n                missing_d = missing(isdir);\n                missing_f = missing(~isdir);\n                while ~isempty( missing_d ),\n                    mdir = missing_d{1};\n                    ss = strncmp( missing_d, mdir, length(mdir) );\n                    tt = strncmp( missing_f, mdir, length(mdir) );\n                    fprintf( '        %s%s%s + %d files, %d subdirectories\\n', mpath, fs, mdir, nnz(tt), nnz(ss) - 1 );\n                    missing_d(ss) = [];\n                    missing_f(tt) = [];\n                end\n                for k = 1 : min(length(missing_f),10),\n                    fprintf( '        %s%s%s\\n', mpath, fs, missing_f{k} );\n                end\n                if length(missing_f) > 10,\n                    fprintf( '        (and %d more files)\\n', length(missing_f) - 10 );\n                end\n                fprintf( '    These omissions may prevent CVX from operating properly.\\n'  );\n            end\n            if ~isempty( additional ),\n                if isempty( missing ), fprintf( '\\n' ); end\n                fprintf( '    WARNING: The following extra files/directories were found:\\n' );\n                isdir = cellfun(@(x)x(end)==fs,additional);\n                issedumi = cellfun(@any,regexp( additional, [ '^sedumi.*[.]', mexext, '$' ] ));\n                additional_d = additional(isdir&~issedumi);\n                additional_f = additional(~isdir&~issedumi);\n                additional_s = additional(issedumi);\n                while ~isempty( additional_d ),\n                    mdir = additional_d{1};\n                    ss = strncmp( additional_d, mdir, length(mdir) );\n                    tt = strncmp( additional_f, mdir, length(mdir) );\n                    fprintf( '        %s%s%s + %d files, %d subdirectories\\n', mpath, fs, mdir, nnz(tt), nnz(ss) - 1 );\n                    additional_d(ss) = [];\n                    additional_f(tt) = [];\n                end\n                for k = 1 : min(length(additional_f),10),\n                    fprintf( '        %s%s%s\\n', mpath, fs, additional_f{k} );\n                end\n                if length(additional_f) > 10,\n                    fprintf( '        (and %d more files)\\n', length(additional_f) - 10 );\n                end\n                fprintf( '    These files may alter the behavior of CVX in unsupported ways.\\n' );\n                if ~isempty( additional_s ),\n                    fprintf( '    ERROR: obsolete versions of SeDuMi MEX files were found:\\n' );\n                    for k = 1 : length(additional_s),\n                        fprintf( '        %s%s%s\\n', mpath, fs, additional_f{k} );\n                    end\n                    fprintf( '    These files are now obsolete, and must be removed to ensure\\n' );\n                    fprintf( '    that SeDuMi operates properly and produces sound results.\\n' );\n                    if ~issue,\n                        fprintf( '    Please remove these files and re-run CVX_SETUP.\\n' );\n                        issue = true;\n                    end\n                end\n            end\n        else\n            fprintf( '\\n    No missing files.\\n' );\n        end\n    else\n        fprintf( '\\n    No missing files.\\n' );\n    end\nelse    \n    fprintf( 'Manifest missing; cannot verify file structure.\\n' ) ;\nend\nif ~compile,\n    mexpath = [ mpath, fs, 'lib', fs ];\n    mext = cvx___.mext;\n    if ( ~exist( [ mexpath, 'cvx_eliminate_mex.', mext ], 'file' ) || ...\n         ~exist( [ mexpath, 'cvx_bcompress_mex.', mext ], 'file' ) ) && ~issue,\n        issue = true;\n        if ~isempty( msub ),\n          mexpath = [ mexpath, msub, fs ];\n          issue = ~exist( [ mexpath, 'cvx_eliminate_mex.mex' ], 'file' ) || ...\n                         ~exist( [ mexpath, 'cvx_bcompress_mex.mex' ], 'file' );\n        end\n        if issue,\n          fprintf( '    ERROR: one or more MEX files for this platform are missing.\\n' );\n          fprintf( '    These files end in the suffix \".%s\". CVX will not operate\\n', mext );\n          fprintf( '    without these files. Please visit\\n' );\n          fprintf( '        http://cvxr.com/cvx/download\\n' );\n          fprintf( '    And download a distribution targeted for your platform.\\n' );\n        end\n    end\nend\n\n%%%%%%%%%%%%%%%\n% Preferences %\n%%%%%%%%%%%%%%%\n\ncvx_load_prefs( true );\n    \n%%%%%%%%%%%%%%%%\n% License file %\n%%%%%%%%%%%%%%%%\n\nif isoctave,\n    if ~isempty( cvx___.license ),\n        fprintf( 'CVX Professional is not supported with Octave.\\n' );\n    end\nelseif cvx___.jver < 1.6,\n    fprintf('       WARNING: full support for CVX Professional licenses\\n' );\n    fprintf('       requres Java version 1.6.0 or later. Please upgrade.\\n' );\nelseif exist( 'cvx_license', 'file' ),\n    cvx_license( args{:} );\nend\n\n%%%%%%%%%%%%%%%\n% Wrapping up %\n%%%%%%%%%%%%%%%\n\nif ~issue,\n    cvx___.loaded = true;\nend\nclear fs;\nfprintf( '%s\\n', line );\nif length(dbstack) <= 1,\n    fprintf( '\\n' );\nend\n\n%%%%%%%%%%%%%%%%%%%%%%\n% Preference loading %\n%%%%%%%%%%%%%%%%%%%%%%\n\nfunction cvx_load_prefs( verbose )\n\nglobal cvx___\nfs = cvx___.fs;\nisoctave = cvx___.isoctave;\nerrmsg = '';\nif verbose,\n    fprintf( 'Preferences: ' );\nend\nif isoctave,\n    pfile = [ prefdir, fs, '.cvx_prefs.mat' ];\nelse\n    pfile = [ regexprep( prefdir(1), [ cvx___.fsre, 'R\\d\\d\\d\\d\\w$' ], '' ), fs, 'cvx_prefs.mat' ];\nend\noutp = [];\ntry\n    if exist( pfile, 'file' )\n        outp = load( pfile );\n        pfile2 = pfile;\n    elseif ~isoctave,\n        pfile2 = [ prefdir, fs, 'cvx_prefs.mat' ];\n        if exist( pfile2, 'file' ),\n            outp = load( pfile2 );\n        end\n    end\ncatch errmsg\n    errmsg = cvx_error( errmsg, 67, false, '    ' );\n    errmsg = sprintf( 'CVX encountered the following error attempting to load your preferences:\\n%sPlease attempt to diagnose this error and try again.\\nYou may need to re-run CVX_SETUP as well.\\nIn the meanwhile, preferences will be set to their defaults.\\n', errmsg );\nend\nif ~isempty( outp ),\n    try\n        cvx___.expert = outp.expert;\n        cvx___.precision = outp.precision;\n        cvx___.precflag = outp.precflag;\n        cvx___.rat_growth = outp.rat_growth;\n        cvx___.path = outp.path;\n        cvx___.solvers = outp.solvers;\n        cvx___.license = outp.license;\n    catch\n        outp = [];\n        errmsg = 'Your CVX preferences file seems out of date; default preferences will be used.';\n    end\nend\nif isempty( outp ),\n    cvx___.expert = false;\n    cvx___.precision = [eps^0.5,eps^0.5,eps^0.25];\n    cvx___.precflag = 'default';\n    cvx___.rat_growth = 10;\n    cvx___.path = [];\n    cvx___.solvers = [];\n    cvx___.license = [];\nend\ncvx___.pfile = pfile;\nif verbose,\n    if ~isempty( errmsg ),\n        fprintf( 'error during load:\\n%s', cvx_error( errmsg, 70, false, '   ' ) );\n    elseif isempty( cvx___.path ),\n        fprintf( 'none found; defaults loaded.\\n' );\n    else\n        fprintf( '\\n    Path: %s\\n', pfile2 );\n    end\nelseif ~isempty( errmsg ),\n    warning( 'CVX:BadPrefsLoad', errmsg );\nend\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Recursive manifest building function %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nfunction newman = get_manifest( mpath, fs )\ndirs   = {};\nfiles  = {};\nnfiles = dir( mpath );\nndir   = '';\ndndx   = 0;\npat2   = '^\\.|~$|';\npat    = '^\\.|~$|^cvx_license.[md]at$|^doc$|^examples$';\nwhile true,\n    isdir  = [ nfiles.isdir ];\n    nfiles = { nfiles.name };\n    tt     = cellfun( @isempty, regexp( nfiles, pat ) ); pat = pat2;\n    isdir  = isdir(tt);\n    nfiles = nfiles(tt);\n    ndirs  = nfiles(isdir);\n    if ~isempty(ndirs),\n        dirs = horzcat( dirs, strcat(strcat(ndir,ndirs), fs ) ); %#ok\n    end\n    nfiles = nfiles(~isdir);\n    if ~isempty(nfiles),\n        files = horzcat( files, strcat(ndir,nfiles) ); %#ok\n    end\n    if length( dirs ) == dndx, break; end\n    dndx = dndx + 1;\n    ndir = dirs{dndx};\n    nfiles = dir( [ mpath, fs, ndir ] );\nend\n[tmp,ndxs1] = sort(upper(dirs)); %#ok\n[tmp,ndxs2] = sort(upper(files)); %#ok\nnewman = horzcat( dirs(ndxs1), files(ndxs2) );\nif fs ~= '/',\n    newman = strrep( newman, fs, '/' );\nend\nnewman = newman(:);\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/Contents.m",
    "content": "% CVX example library\n%\n%  antenna_array_design/       - Antenna array design\n%  circuit_design/             - Circuit design\n%  cvxbook/                    - Figures, examples, and exercises from the book <a href=\"http://stanford.edu/~boyd/cvxbook\">Convex Optimization</a>\n%  filter_design/              - Filter design\n%  gp_tutorial/                - Examples from <a href=\"http://stanford.edu/~boyd/papers/gp_tutorial.html\">A Tutorial on Geometric Programming</a>\n%  graph_laplacian/            - Graph Laplacian eigenvalue optimization\n%  log_exp/                    - Examples employing logarithms, exponentials, and entropy functions\n%  sparse_heuristics/          - Sparse solution heuristics\n%  time_series_analysis/       - Example from <a href=\"http://stanford.edu/~boyd/papers/l1_trend_filter.html\">l1 Trend Filtering</a>\n%  quickstart.m                - Examples from the CVX Users' guide\n%  regularized_norm_tradeoff.m - Builds a norm minimization tradeoff curve\n%  simple_LP2.m                - Builds and solves a simple inequality-constrained linear program\n%  simple_LS.m                 - Builds and solves a simple least-squares problem using cvx\n%  simple_LP.m                 - Builds and solves a simple linear program\n%  closest_toeplitz_psd.m      - Closest Toeplitz SDP search.\n%  equality_constr_norm_min.m  - Equality constrained norm minimization.\n%  min_phase_spectral_fact.m   - Minimal phase spectral factorization\n%  nonneg_matrix_fact.m        - Nonnegative matrix factorization\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/antenna_array_design/Contents.m",
    "content": "% Antenna array design\n% <a href=\"http://stanford.edu/~boyd/papers/ant-pat.html\">Antenna Array Pattern Synthesis via Convex Optimization</a>\n% <a href=\"http://stanford.edu/~boyd/papers/magdes.html\">FIR Filter Design via Spectral Factorization and Convex Optimization</a>\n%\n%  ant_array_min_beamwidth.m      - Minimize beamwidth of an array with arbitrary 2-D geometry\n%  line_array_spec_fact.m         - Minimize sidelobe level of a uniform linear array via spectral factorization\n%  broadband_array_min_sidelobe.m - Minimize sidelobe level of an FIR broadband far-field antenna array\n%  ant_array_min_sidelobe.m       - Minimize sidelobe level of an array with arbitrary 2-D geometry\n%  ant_array_min_therm_noise.m    - Minimize thermal noise power of an array with arbitrary 2-D geometry\n%  polar_plot_ant.m               - Plot a polar plot of an antenna array sensitivity\n%  spectral_fact.m                - Spectral factorization using Kolmogorov 1939 approach\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/antenna_array_design/ant_array_min_beamwidth.m",
    "content": "% Minimize beamwidth of an array with arbitrary 2-D geometry\n% \"Convex optimization examples\" lecture notes (EE364) by S. Boyd\n% \"Antenna array pattern synthesis via convex optimization\"\n% by H. Lebret and S. Boyd\n% (figures are generated)\n%\n% Designs an antenna array such that:\n% - it has unit sensitivity at some target direction\n% - it obeys a constraint on a minimum sidelobe level outside the beam\n% - it minimizes the beamwidth of the pattern\n%\n% This is a quasiconvex problem and can be solved using a bisection.\n%\n%   minimize   max |y(theta)|     for theta outside the beam\n%       s.t.   y(theta_tar) = 1\n%\n% where y is the antenna array gain pattern (complex function) and\n% variables are w (antenna array weights or shading coefficients).\n% Gain pattern is a linear function of w: y(theta) = w'*a(theta)\n% for some a(theta) describing antenna array configuration and specs.\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n% select array geometry\nARRAY_GEOMETRY = '2D_RANDOM';\n% ARRAY_GEOMETRY = '1D_UNIFORM_LINE';\n% ARRAY_GEOMETRY = '2D_UNIFORM_LATTICE';\n\n%********************************************************************\n% problem specs\n%********************************************************************\nlambda = 1;           % wavelength\ntheta_tar = 60;       % target direction\nmin_sidelobe = -20;   % maximum sidelobe level in dB\n\nmax_half_beam = 50;   % starting half beamwidth (must be feasible)\n\n%********************************************************************\n% random array of n antenna elements\n%********************************************************************\nif strcmp( ARRAY_GEOMETRY, '2D_RANDOM' )\n  % set random seed to repeat experiments\n  rand('state',0);\n\n  % (uniformly distributed on [0,L]-by-[0,L] square)\n  n = 36;\n  L = 5;\n  loc = L*rand(n,2);\n\n%********************************************************************\n% uniform 1D array with n elements with inter-element spacing d\n%********************************************************************\nelseif strcmp( ARRAY_GEOMETRY, '1D_UNIFORM_LINE' )\n  % (unifrom array on a line)\n  n = 30;\n  d = 0.45*lambda;\n  loc = [d*[0:n-1]' zeros(n,1)];\n\n%********************************************************************\n% uniform 2D array with m-by-m element with d spacing\n%********************************************************************\nelseif strcmp( ARRAY_GEOMETRY, '2D_UNIFORM_LATTICE' )\n  m = 6; n = m^2;\n  d = 0.45*lambda;\n\n  loc = zeros(n,2);\n  for x = 0:m-1\n    for y = 0:m-1\n      loc(m*y+x+1,:) = [x y];\n    end\n  end\n  loc = loc*d;\n\nelse\n  error('Undefined array geometry')\nend\n\n%********************************************************************\n% construct optimization data\n%********************************************************************\n% build matrix A that relates w and y(theta), ie, y = A*w\ntheta = [1:360]';\nA = kron(cos(pi*theta/180), loc(:,1)') + kron(sin(pi*theta/180), loc(:,2)');\nA = exp(2*pi*i/lambda*A);\n\n% target constraint matrix\n[diff_closest, ind_closest] = min( abs(theta - theta_tar) );\nAtar = A(ind_closest,:);\n\n%*********************************************************************\n% use bisection algorithm to solve the problem\n%*********************************************************************\n\nhalfbeam_bot = 1;\nhalfbeam_top = max_half_beam;\n\ndisp('We are only considering integer values of the half beam-width')\ndisp('(since we are sampling the angle with 1 degree resolution).')\ndisp(' ')\n\nwhile( halfbeam_top - halfbeam_bot > 1)\n  % try to find a feasible design for given specs\n  halfbeam_cur = ceil( (halfbeam_top + halfbeam_bot)/2 );\n\n  % create optimization matrices for the stopband\n  ind = find(theta <= (theta_tar-halfbeam_cur) | ...\n             theta >= (theta_tar+halfbeam_cur) );\n  As = A(ind,:);\n\n  % formulate and solve the feasibility antenna array problem\n  cvx_begin quiet\n    variable w(n) complex\n    % feasibility problem\n    Atar*w == 1;\n    abs(As*w) <= 10^(min_sidelobe/20);\n  cvx_end\n\n  % bisection\n  if strfind(cvx_status,'Solved') % feasible\n    fprintf(1,'Problem is feasible for half beam-width = %d degress\\n',...\n               halfbeam_cur);\n    halfbeam_top = halfbeam_cur;\n  else % not feasible\n    fprintf(1,'Problem is not feasible for half beam-width = %d degress\\n',...\n               halfbeam_cur);\n    halfbeam_bot = halfbeam_cur;\n  end\nend\n\n% optimal beamwidth\nhalfbeam = halfbeam_top;\nfprintf(1,'\\nOptimum half beam-width for given specs is %d.\\n',halfbeam);\n\n% compute the minimum noise design for the optimal beamwidth\nind = find(theta <= (theta_tar-halfbeam) | ...\n           theta >= (theta_tar+halfbeam) );\nAs = A(ind,:);\ncvx_begin quiet\n  variable w(n) complex\n  minimize( norm( w ) )\n  subject to\n    Atar*w == 1;\n    abs(As*w) <= 10^(min_sidelobe/20);\ncvx_end\n\n%********************************************************************\n% plots\n%********************************************************************\nfigure(1), clf\nplot(loc(:,1),loc(:,2),'o')\ntitle('Antenna locations')\n\n% plot array pattern\ny = A*w;\n\nfigure(2), clf\nymin = -40; ymax = 0;\nplot([1:360], 20*log10(abs(y)), ...\n     [theta_tar theta_tar],[ymin ymax],'g--',...\n     [theta_tar+halfbeam theta_tar+halfbeam],[ymin ymax],'r--',...\n     [theta_tar-halfbeam theta_tar-halfbeam],[ymin ymax],'r--');\nxlabel('look angle'), ylabel('mag y(theta) in dB');\naxis([0 360 ymin ymax]);\n\n% polar plot\nfigure(3), clf\nzerodB = 50;\ndBY = 20*log10(abs(y)) + zerodB;\nplot(dBY.*cos(pi*theta/180), dBY.*sin(pi*theta/180), '-');\naxis([-zerodB zerodB -zerodB zerodB]), axis('off'), axis('square')\nhold on\nplot(zerodB*cos(pi*theta/180),zerodB*sin(pi*theta/180),'k:') % 0 dB\nplot( (min_sidelobe + zerodB)*cos(pi*theta/180), ...\n      (min_sidelobe + zerodB)*sin(pi*theta/180),'k:')  % min level\ntext(-zerodB,0,'0 dB')\ntext(-(min_sidelobe + zerodB),0,sprintf('%0.1f dB',min_sidelobe));\ntheta_1 = theta_tar+halfbeam;\ntheta_2 = theta_tar-halfbeam;\nplot([0 55*cos(theta_tar*pi/180)], [0 55*sin(theta_tar*pi/180)], 'k:')\nplot([0 55*cos(theta_1*pi/180)], [0 55*sin(theta_1*pi/180)], 'k:')\nplot([0 55*cos(theta_2*pi/180)], [0 55*sin(theta_2*pi/180)], 'k:')\nhold off\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/antenna_array_design/ant_array_min_sidelobe.m",
    "content": "% Minimize sidelobe level of an array with arbitrary 2-D geometry\n% \"Convex optimization examples\" lecture notes (EE364) by S. Boyd\n% \"Antenna array pattern synthesis via convex optimization\"\n% by H. Lebret and S. Boyd\n% (figures are generated)\n%\n% Designs an antenna array such that:\n% - it minimizes sidelobe level outside the beamwidth of the pattern\n% - it has a unit sensitivity at some target direction\n% - it has nulls (zero sensitivity) at specified direction(s) (optional)\n%\n% This is a convex problem (after sampling it can be formulated as an SOCP).\n%\n%   minimize   max |y(theta)|     for theta outside the beam\n%       s.t.   y(theta_tar) = 1\n%              y(theta_null) = 0  (optional)\n%\n% where y is the antenna array gain pattern (complex function) and\n% variables are w (antenna array weights or shading coefficients).\n% Gain pattern is a linear function of w: y(theta) = w'*a(theta)\n% for some a(theta) describing antenna array configuration and specs.\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n% select array geometry\nARRAY_GEOMETRY = '2D_RANDOM';\n% ARRAY_GEOMETRY = '1D_UNIFORM_LINE';\n% ARRAY_GEOMETRY = '2D_UNIFORM_LATTICE';\n\n% select if the optimal array pattern should enforce nulls or not\nHAS_NULLS = 0; % HAS_NULLS = 1;\n\n%********************************************************************\n% problem specs\n%********************************************************************\nlambda = 1;           % wavelength\ntheta_tar = 60;       % target direction (should be an integer -- discretization)\nhalf_beamwidth = 10;  % half beamwidth around the target direction\n\n% angles where we want nulls (optional)\nif HAS_NULLS\n  theta_nulls = [95 110 120 140 225];\nend\n\n%********************************************************************\n% random array of n antenna elements\n%********************************************************************\nif strcmp( ARRAY_GEOMETRY, '2D_RANDOM' )\n  % set random seed to repeat experiments\n  rand('state',0);\n\n  % (uniformly distributed on [0,L]-by-[0,L] square)\n  n = 40;\n  L = 5;\n  loc = L*rand(n,2);\n  angleRange = 360;\n\n%********************************************************************\n% uniform 1D array with n elements with inter-element spacing d\n%********************************************************************\nelseif strcmp( ARRAY_GEOMETRY, '1D_UNIFORM_LINE' )\n  % (unifrom array on a line)\n  n = 30;\n  d = 0.45*lambda;\n  loc = [d*[0:n-1]' zeros(n,1)];\n  angleRange = 180;\n\n%********************************************************************\n% uniform 2D array with m-by-m element with d spacing\n%********************************************************************\nelseif strcmp( ARRAY_GEOMETRY, '2D_UNIFORM_LATTICE' )\n  m = 6; n = m^2;\n  d = 0.45*lambda;\n\n  loc = zeros(n,2);\n  for x = 0:m-1\n    for y = 0:m-1\n      loc(m*y+x+1,:) = [x y];\n    end\n  end\n  loc = loc*d;\n  angleRange = 360;\n\nelse\n  error('Undefined array geometry')\nend\n\n%********************************************************************\n% construct optimization data\n%********************************************************************\n% build matrix A that relates w and y(theta), ie, y = A*w\ntheta = [1:angleRange]';\nA = kron(cos(pi*theta/180), loc(:,1)') + kron(sin(pi*theta/180), loc(:,2)');\nA = exp(2*pi*i/lambda*A);\n\n% target constraint matrix\n[diff_closest, ind_closest] = min( abs(theta - theta_tar) );\nAtar = A(ind_closest,:);\n\n% nulls constraint matrix\nif HAS_NULLS\n  Anull = []; ind_nulls = [];\n  for k = 1:length(theta_nulls)\n    [diff_closest, ind_closest] = min( abs(theta - theta_nulls(k)) );\n    Anull = [Anull; A(ind_closest,:)];\n    ind_nulls = [ind_nulls ind_closest];\n  end\nend\n\n% stopband constraint matrix\nind = find(theta <= (theta_tar-half_beamwidth) | ...\n           theta >= (theta_tar+half_beamwidth) );\nif HAS_NULLS, ind = setdiff(ind,ind_nulls); end;\nAs = A(ind,:);\n\n%********************************************************************\n% optimization problem\n%********************************************************************\ncvx_begin\n  variable w(n) complex\n  minimize( max( abs(As*w) ) )\n  subject to\n    Atar*w == 1;   % target constraint\n    if HAS_NULLS   % nulls constraints\n      Anull*w == 0;\n    end\ncvx_end\n\n% check if problem was successfully solved\ndisp(['Problem is ' cvx_status])\nif ~strfind(cvx_status,'Solved')\n  return\nend\n\nmin_sidelobe_level = 20*log10( max(abs(As*w)) );\nfprintf(1,'The minimum sidelobe level is %3.2f dB.\\n\\n',...\n          min_sidelobe_level );\n\n%********************************************************************\n% plots\n%********************************************************************\nfigure(1), clf\nplot(loc(:,1),loc(:,2),'o')\ntitle('Antenna locations')\n\n% plot array pattern\nif angleRange == 180,\n    theta = [1:360]';\n    A = [ A; -A ];\nend\ny = A*w;\nfigure(2), clf\nymin = floor(0.1*min_sidelobe_level)*10-10; ymax = 0;\nplot([1:360], 20*log10(abs(y)), ...\n     [theta_tar theta_tar],[ymin ymax],'r--',...\n     [theta_tar+half_beamwidth theta_tar+half_beamwidth],[ymin ymax],'g--',...\n     [theta_tar-half_beamwidth theta_tar-half_beamwidth],[ymin ymax],'g--');\nif HAS_NULLS % add lines that represent null positions\n  hold on;\n  for k = 1:length(theta_nulls)\n    plot([theta_nulls(k) theta_nulls(k)],[ymin ymax],'m--');\n  end\n  hold off;\nend\nxlabel('look angle'), ylabel('mag y(theta) in dB');\naxis([0 360 ymin ymax]);\n\n% polar plot\nfigure(3), clf\nzerodB = -ymin;\ndBY = 20*log10(abs(y)) + zerodB;\nind = find( dBY <= 0 ); dBY(ind) = 0;\nplot(dBY.*cos(pi*theta/180), dBY.*sin(pi*theta/180), '-');\naxis([-zerodB zerodB -zerodB zerodB]), axis('off'), axis('square')\nhold on\nplot(zerodB*cos(pi*theta/180),zerodB*sin(pi*theta/180),'k:') % 0 dB\nplot( (min_sidelobe_level + zerodB)*cos(pi*theta/180), ...\n      (min_sidelobe_level + zerodB)*sin(pi*theta/180),'k:')  % min level\ntext(-zerodB,0,'0 dB')\ntt = text(-(min_sidelobe_level + zerodB),0,sprintf('%0.1f dB',min_sidelobe_level));\nset(tt,'HorizontalAlignment','right');\ntheta_1 = theta_tar+half_beamwidth;\ntheta_2 = theta_tar-half_beamwidth;\nplot([0 55*cos(theta_tar*pi/180)], [0 55*sin(theta_tar*pi/180)], 'k:')\nplot([0 55*cos(theta_1*pi/180)], [0 55*sin(theta_1*pi/180)], 'k:')\nplot([0 55*cos(theta_2*pi/180)], [0 55*sin(theta_2*pi/180)], 'k:')\nif HAS_NULLS % add lines that represent null positions\n  for k = 1:length(theta_nulls)\n    plot([0 55*cos(theta_nulls(k)*pi/180)], ...\n         [0 55*sin(theta_nulls(k)*pi/180)], 'k:')\n  end\nend\nhold off\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/antenna_array_design/ant_array_min_therm_noise.m",
    "content": "% Minimize thermal noise power of an array with arbitrary 2-D geometry\n% \"Convex optimization examples\" lecture notes (EE364) by S. Boyd\n% \"Antenna array pattern synthesis via convex optimization\"\n% by H. Lebret and S. Boyd\n% (figures are generated)\n%\n% Designs an antenna array such that:\n% - it has unit a sensitivity at some target direction\n% - obeys constraint for minimum sidelobe level outside the beamwidth\n% - minimizes thermal noise power in y (sigma*||w||_2^2)\n%\n% This is a convex problem described as:\n%\n%   minimize   norm(w)\n%       s.t.   y(theta_tar) = 1\n%              |y(theta)| <= min_sidelobe   for theta outside the beam\n%\n% where y is the antenna array gain pattern (complex function) and\n% variables are w (antenna array weights or shading coefficients).\n% Gain pattern is a linear function of w: y(theta) = w'*a(theta)\n% for some a(theta) describing antenna array configuration and specs.\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n% select array geometry\nARRAY_GEOMETRY = '2D_RANDOM';\n% ARRAY_GEOMETRY = '1D_UNIFORM_LINE';\n% ARRAY_GEOMETRY = '2D_UNIFORM_LATTICE';\n\n%********************************************************************\n% problem specs\n%********************************************************************\nlambda = 1;           % wavelength\ntheta_tar = 60;       % target direction\nhalf_beamwidth = 10;  % half beamwidth around the target direction\nmin_sidelobe = -20;   % maximum sidelobe level in dB\n\n%********************************************************************\n% random array of n antenna elements\n%********************************************************************\nif strcmp( ARRAY_GEOMETRY, '2D_RANDOM' )\n  % set random seed to repeat experiments\n  rand('state',0);\n\n  % (uniformly distributed on [0,L]-by-[0,L] square)\n  n = 36;\n  L = 5;\n  loc = L*rand(n,2);\n\n%********************************************************************\n% uniform 1D array with n elements with inter-element spacing d\n%********************************************************************\nelseif strcmp( ARRAY_GEOMETRY, '1D_UNIFORM_LINE' )\n  % (unifrom array on a line)\n  n = 30;\n  d = 0.45*lambda;\n  loc = [d*[0:n-1]' zeros(n,1)];\n\n%********************************************************************\n% uniform 2D array with m-by-m element with d spacing\n%********************************************************************\nelseif strcmp( ARRAY_GEOMETRY, '2D_UNIFORM_LATTICE' )\n  m = 6; n = m^2;\n  d = 0.45*lambda;\n\n  loc = zeros(n,2);\n  for x = 0:m-1\n    for y = 0:m-1\n      loc(m*y+x+1,:) = [x y];\n    end\n  end\n  loc = loc*d;\n\nelse\n  error('Undefined array geometry')\nend\n\n%********************************************************************\n% construct optimization data\n%********************************************************************\n% build matrix A that relates w and y(theta), ie, y = A*w\ntheta = [1:360]';\nA = kron(cos(pi*theta/180), loc(:,1)') + kron(sin(pi*theta/180), loc(:,2)');\nA = exp(2*pi*i/lambda*A);\n\n% target constraint matrix\n[diff_closest, ind_closest] = min( abs(theta - theta_tar) );\nAtar = A(ind_closest,:);\n\n% stopband constraint matrix\nind = find(theta <= (theta_tar-half_beamwidth) | ...\n           theta >= (theta_tar+half_beamwidth) );\nAs = A(ind,:);\n\n%********************************************************************\n% optimization problem\n%********************************************************************\ncvx_begin\n  variable w(n) complex\n  minimize( norm( w ) )\n  subject to\n    Atar*w == 1;\n    abs(As*w) <= 10^(min_sidelobe/20);\ncvx_end\n\n% check if problem was successfully solved\ndisp(['Problem is ' cvx_status])\nif ~strfind(cvx_status,'Solved')\n  return\nend\n\nfprintf(1,'The minimum norm of w is %3.2f.\\n\\n',norm(w));\n\n%********************************************************************\n% plots\n%********************************************************************\nfigure(1), clf\nplot(loc(:,1),loc(:,2),'o')\ntitle('Antenna locations')\n\n% plot array pattern\ny = A*w;\n\nfigure(2), clf\nymin = -30; ymax = 0;\nplot([1:360], 20*log10(abs(y)), ...\n     [theta_tar theta_tar],[ymin ymax],'r--',...\n     [theta_tar+half_beamwidth theta_tar+half_beamwidth],[ymin ymax],'g--',...\n     [theta_tar-half_beamwidth theta_tar-half_beamwidth],[ymin ymax],'g--',...\n     [0 theta_tar-half_beamwidth],[min_sidelobe min_sidelobe],'r--',...\n     [theta_tar+half_beamwidth 360],[min_sidelobe min_sidelobe],'r--');\nxlabel('look angle'), ylabel('mag y(theta) in dB');\naxis([0 360 ymin ymax]);\n\n% polar plot\nfigure(3), clf\nzerodB = 50;\ndBY = 20*log10(abs(y)) + zerodB;\nplot(dBY.*cos(pi*theta/180), dBY.*sin(pi*theta/180), '-');\naxis([-zerodB zerodB -zerodB zerodB]), axis('off'), axis('square')\nhold on\nplot(zerodB*cos(pi*theta/180),zerodB*sin(pi*theta/180),'k:') % 0 dB\nplot( (min_sidelobe + zerodB)*cos(pi*theta/180), ...\n      (min_sidelobe + zerodB)*sin(pi*theta/180),'k:')  % min level\ntext(-zerodB,0,'0 dB')\ntext(-(min_sidelobe + zerodB),0,sprintf('%0.1f dB',min_sidelobe));\ntheta_1 = theta_tar+half_beamwidth;\ntheta_2 = theta_tar-half_beamwidth;\nplot([0 55*cos(theta_tar*pi/180)], [0 55*sin(theta_tar*pi/180)], 'k:')\nplot([0 55*cos(theta_1*pi/180)], [0 55*sin(theta_1*pi/180)], 'k:')\nplot([0 55*cos(theta_2*pi/180)], [0 55*sin(theta_2*pi/180)], 'k:')\nhold off\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/antenna_array_design/broadband_array_min_sidelobe.m",
    "content": "% Minimize sidelobe level of an FIR broadband far-field antenna array\n% \"Antenna array pattern synthesis via convex optimization\"\n% by H. Lebret and S. Boyd\n% (figures are generated)\n%\n% Designs a broadband antenna array with the far-field wave model such that:\n% - it minimizes sidelobe level outside the beamwidth of the pattern\n% - it has a unit sensitivity at some target direction and for some frequencies\n%\n% This is a convex problem (after sampling it can be formulated as an SOCP).\n%\n%   minimize   max |y(theta,f)|        for theta,f outside the desired region\n%       s.t.   y(theta_tar,f_tar) = 1\n%\n% where y is the antenna array gain pattern (complex function) and\n% variables are w (antenna array weights or shading coefficients).\n% Gain pattern is a linear function of w: y(theta,f) = w'*a(theta,f)\n% for some a(theta,f) describing antenna array configuration and specs.\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n% select array geometry\nARRAY_GEOMETRY = '2D_UNIFORM_LATTICE';\n% ARRAY_GEOMETRY = '2D_RANDOM';\n\n%********************************************************************\n% problem specs\n%********************************************************************\nP = 2;                % number of filter taps at each antenna element\nfs = 8000;            % sampling rate = 8000 Hz\nT = 1/fs;             % sampling spacing\nc = 2000;             % wave speed\n\ntheta_tar = 70;       % target direction\nhalf_beamwidth = 10;  % half beamwidth around the target direction\nf_low  = 1500;        % low frequency bound for the desired band\nf_high = 2000;        % high frequency bound for the desired band\n\n%********************************************************************\n% random array of n antenna elements\n%********************************************************************\nif strcmp( ARRAY_GEOMETRY, '2D_RANDOM' )\n  % set random seed to repeat experiments\n  rand('state',0);\n\n  % uniformly distributed on [0,L]-by-[0,L] square\n  n = 20;\n  L = 0.45*(c/f_high)*sqrt(n);\n  % loc is a column vector of x and y coordinates\n  loc = L*rand(n,2);\n\n%********************************************************************\n% uniform 2D array with m-by-m element with d spacing\n%********************************************************************\nelseif strcmp( ARRAY_GEOMETRY, '2D_UNIFORM_LATTICE' )\n  m = 6; n = m^2;\n  d = 0.45*(c/f_high);\n\n  loc = zeros(n,2);\n  for x = 0:m-1\n    for y = 0:m-1\n      loc(m*y+x+1,:) = [x y];\n    end\n  end\n  loc = loc*d;\n\nelse\n  error('Undefined array geometry')\nend\n\n%********************************************************************\n% construct optimization data\n%********************************************************************\n% discretized grid sampling parameters\nnumtheta = 180;\nnumfreqs = 6;\n\ntheta = linspace(1,360,numtheta)';\nfreqs = linspace(500,3000,numfreqs)';\n\nclear Atotal;\nfor k = 1:numfreqs\n  % FIR portion of the main matrix\n  Afir = kron( ones(numtheta,n), -[0:P-1]/fs );\n\n  % cos/sine part of the main matrix\n  Alocx = kron( loc(:,1)', ones(1,P) );\n  Alocy = kron( loc(:,2)', ones(1,P) );\n  Aloc = kron( cos(pi*theta/180)/c, Alocx ) + kron( sin(pi*theta/180)/c, Alocy );\n\n  % create the main matrix for each frequency sample\n  Atotal(:,:,k) = exp(2*pi*i*freqs(k)*(Afir+Aloc));\nend\n\n% single out indices so we can make equalities and inequalities\ninbandInd    = find( freqs >= f_low & freqs <= f_high );\noutbandInd   = find( freqs < f_low | freqs > f_high );\nthetaStopInd = find( theta > (theta_tar+half_beamwidth) | ...\n                     theta < (theta_tar-half_beamwidth) );\n[diffClosest, thetaTarInd] = min( abs(theta - theta_tar) );\n\n% create target and stopband constraint matrices\nAtar = []; As = [];\n% inband frequencies constraints\nfor k = [inbandInd]'\n  Atar = [Atar; Atotal(thetaTarInd,:,k)];\n  As = [As; Atotal(thetaStopInd,:,k)];\nend\n% outband frequencies constraints\nfor k = [outbandInd]'\n  As = [As; Atotal(:,:,k)];\nend\n\n%********************************************************************\n% optimization problem\n%********************************************************************\ncvx_begin\n  variable w(n*P) complex\n  minimize( max( abs( As*w ) ) )\n  subject to\n    % target direction equality constraint\n    Atar*w == 1;\ncvx_end\n\n% check if problem was successfully solved\ndisp(['Problem is ' cvx_status])\nif ~strfind(cvx_status,'Solved')\n  return\nend\n\nfprintf(1,'The minimum sidelobe level is %3.2f dB.\\n\\n',...\n          20*log10(cvx_optval) );\n\n%********************************************************************\n% plots\n%********************************************************************\nfigure(1); clf;\nplot(loc(:,1),loc(:,2),'o')\ntitle('Antenna locations')\naxis('square')\n\n% plots of array patterns (cross sections for different frequencies)\nfigure(2); clf;\nclr = { 'r' 'r' 'b' 'b' 'r' 'r' };\nlinetype = {'--' '--' '-' '-' '--' '--'};\nfor k = 1:numfreqs\n  plot(theta, 20*log10(abs(Atotal(:,:,k)*w)), [clr{k} linetype{k}]);\n  hold on;\nend\naxis([1 360 -15 0])\ntitle('Passband (blue solid curves) and stopband (red dashed curves)')\nxlabel('look angle'), ylabel('abs(y) in dB');\nhold off;\n\n% cross section polar plots\nfigure(3); clf;\nbw = 2*half_beamwidth;\nsubplot(2,2,1); polar_plot_ant(abs( Atotal(:,:,2)*w ),theta_tar,bw,'f = 1000 (stop)');\nsubplot(2,2,2); polar_plot_ant(abs( Atotal(:,:,3)*w ),theta_tar,bw,'f = 1500 (pass)');\nsubplot(2,2,3); polar_plot_ant(abs( Atotal(:,:,4)*w ),theta_tar,bw,'f = 2000 (pass)');\nsubplot(2,2,4); polar_plot_ant(abs( Atotal(:,:,5)*w ),theta_tar,bw,'f = 2500 (stop)');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/antenna_array_design/line_array_spec_fact.m",
    "content": "% Minimize sidelobe level of a uniform linear array via spectral factorization\n% \"FIR Filter Design via Spectral Factorization and Convex Optimization\" example\n% by S.-P. Wu, S. Boyd, and L. Vandenberghe\n% (figures are generated)\n%\n% Designs a uniform linear antenna array using spectral factorization method where:\n% - it minimizes sidelobe level outside the beamwidth of the pattern\n% - it has a constraint on the maximum ripple around unit gain in the beamwidth\n%\n%   minimize   max |y(theta)|                   for theta in the stop-beamwidth\n%       s.t.   1/delta <= |y(theta)| <= delta   for theta in the pass-beamwidth\n%\n% We first replace the look-angle variable theta with the \"frequency\"\n% variable omega, defined by omega = -2*pi*d/lambda*cos(theta).\n% This transforms the antenna pattern y(theta) into a standard discrete\n% Fourier transform of array weights w. Then we apply another change of\n% variables: we replace w with its auto-correlation coefficients r.\n%\n% Now the problem can be solved via spectral factorization approach:\n%\n%   minimize   max R(omega)                        for omega in the stopband\n%       s.t.   (1/delta)^2 <= R(omega) <= delta^2  for omega in the passband\n%              R(omega) >= 0                       for all omega\n%\n% where R(omega) is the squared magnitude of the y(theta) array response\n% (and the Fourier transform of the autocorrelation coefficients r).\n% Variables are coefficients r. delta is the allowed passband ripple.\n% This is a convex problem (can be formulated as an LP after sampling).\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%********************************************************************\n% problem specs: a uniform line array with inter-element spacing d\n%                antenna element locations are at d*[0:n-1]\n%                (the array pattern will be symmetric around origin)\n%********************************************************************\nn = 20;               % number of antenna elements\nlambda = 1;           % wavelength\nd = 0.45*lambda;      % inter-element spacing\n\n% passband direction from 30 to 60 degrees (30 degrees bandwidth)\n% transition band is 15 degrees on both sides of the passband\ntheta_pass = 40;\ntheta_stop = 50;\n\n% passband max allowed ripple\nripple = 0.1; % in dB (+/- around the unit gain)\n\n%********************************************************************\n% construct optimization data\n%********************************************************************\n% number of frequency samples\nm = 30*n;\n\n% convert passband and stopband angles into omega frequencies\nomega_zero = -2*pi*d/lambda;\nomega_pass = -2*pi*d/lambda*cos(theta_pass*pi/180);\nomega_stop = -2*pi*d/lambda*cos(theta_stop*pi/180);\nomega_pi   = +2*pi*d/lambda;\n\n% build matrix A that relates R(omega) and r, ie, R = A*r\nomega = linspace(-pi,pi,m)';\nA = exp( -j*omega(:)*[1-n:n-1] );\n\n% passband constraint matrix\nAp = A(omega >= omega_zero & omega <= omega_pass,:);\n\n% stopband constraint matrix\nAs = A(omega >= omega_stop & omega <= omega_pi,:);\n\n%********************************************************************\n% formulate and solve the magnitude design problem\n%********************************************************************\ncvx_begin\n  variable r(2*n-1,1) complex\n  % minimize stopband attenuation\n  minimize( max( real( As*r ) ) )\n  subject to\n    % passband ripple constraints\n    (10^(-ripple/20))^2 <= real( Ap*r ) <= (10^(+ripple/20))^2;\n    % nonnegative-real constraint for all frequencies\n    % a bit redundant: the passband frequencies are already constrained\n    real( A*r ) >= 0;\n    % auto-correlation symmetry constraints\n    imag(r(n)) == 0;\n    r(n-1:-1:1) == conj(r(n+1:end));\ncvx_end\n\n% check if problem was successfully solved\nif ~strfind(cvx_status,'Solved')\n    return\nend\n\n% find antenna weights by computing the spectral factorization\nw = spectral_fact(r);\n\n% divided by 2 since this is in PSD domain\nmin_sidelobe_level = 10*log10( cvx_optval );\nfprintf(1,'The minimum sidelobe level is %3.2f dB.\\n\\n',...\n          min_sidelobe_level);\n\n%********************************************************************\n% plots\n%********************************************************************\n% build matrix G that relates y(theta) and w, ie, y = G*w\ntheta = [-180:180]';\nG = kron( cos(pi*theta/180), [0:n-1] );\nG = exp(2*pi*i*d/lambda*G);\ny = G*w;\n\n% plot array pattern\nfigure(1), clf\nymin = -40; ymax = 5;\nplot([-180:180], 20*log10(abs(y)), ...\n     [theta_stop theta_stop],[ymin ymax],'r--',...\n     [-theta_pass -theta_pass],[ymin ymax],'r--',...\n     [-theta_stop -theta_stop],[ymin ymax],'r--',...\n     [theta_pass theta_pass],[ymin ymax],'r--');\nxlabel('look angle'), ylabel('mag y(theta) in dB');\naxis([-180 180 ymin ymax]);\n\n% polar plot\nfigure(2), clf\nzerodB = 50;\ndBY = 20*log10(abs(y)) + zerodB;\nplot(dBY.*cos(pi*theta/180), dBY.*sin(pi*theta/180), '-');\naxis([-zerodB zerodB -zerodB zerodB]), axis('off'), axis('square')\nhold on\nplot(zerodB*cos(pi*theta/180),zerodB*sin(pi*theta/180),'k:') % 0 dB\nplot( (min_sidelobe_level + zerodB)*cos(pi*theta/180), ...\n      (min_sidelobe_level + zerodB)*sin(pi*theta/180),'k:')  % min level\ntext(-zerodB,0,'0 dB')\ntext(-(min_sidelobe_level + zerodB),0,sprintf('%0.1f dB',min_sidelobe_level));\nplot([0 60*cos(theta_pass*pi/180)], [0 60*sin(theta_pass*pi/180)], 'k:')\nplot([0 60*cos(-theta_pass*pi/180)],[0 60*sin(-theta_pass*pi/180)],'k:')\nplot([0 60*cos(theta_stop*pi/180)], [0 60*sin(theta_stop*pi/180)], 'k:')\nplot([0 60*cos(-theta_stop*pi/180)],[0 60*sin(-theta_stop*pi/180)],'k:')\nhold off\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/antenna_array_design/polar_plot_ant.m",
    "content": "% Plot a polar plot of an antenna array sensitivity\n% with lines denoting the target direction and beamwidth.\n% This is a helper function used in the broadband antenna examples.\n%\n% Inputs:\n%    X:      an array of abs(y(theta)) where y is the antenna array pattern\n%    theta0: target direction\n%    bw:     total beamwidth\n%    label:  a string displayed as the plot legend\n%\n% Original code by Lieven Vandenberghe\n% Updated for CVX by Almir Mutapcic 02/17/06\n\nfunction polar_plot_ant(X,theta0,bw,label)\n\n% polar plot\nnumpoints = length(X);\nthetas2 = linspace(1,360,numpoints)';\n\nplot(X.*cos(pi*thetas2/180), X.*sin(pi*thetas2/180), '-');\nplot(X.*cos(pi*thetas2/180), X.*sin(pi*thetas2/180), '-');\nhold on;\naxis('equal');\n\nplot(cos(pi*[thetas2;1]/180), sin(pi*[thetas2;1]/180), '--');\ntext(1.1,0,'1');\n\nplot([0 cos(pi*theta0/180)], [0 sin(pi*theta0/180)], '--');\nsl1 = find(thetas2-theta0 > bw/2);\nsl2 = find(thetas2-theta0 < -bw/2);\nGsl = max(max(X(sl1)), max(X(sl2)));\nplot(Gsl*cos(pi*thetas2(sl1)/180), Gsl*sin(pi*thetas2(sl1)/180), '--');\nplot(Gsl*cos(pi*thetas2(sl2)/180), Gsl*sin(pi*thetas2(sl2)/180), '--');\n\ntext(-1,1.1,label);\n\naxis off;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/antenna_array_design/spectral_fact.m",
    "content": "% Spectral factorization using Kolmogorov 1939 approach\n% (code follows pp. 232-233, Signal Analysis, by A. Papoulis)\n%\n% Computes the minimum-phase impulse response which satisfies\n% given auto-correlation.\n%\n% Input:\n%   r: top-half of the auto-correlation coefficients\n%      starts from 0th element to end of the auto-corelation\n%      should be passed in as a column vector\n% Output\n%   h: impulse response that gives the desired auto-correlation\n\nfunction h = spectral_fact(r)\n\n% length of the impulse response sequence\nnr = length(r);\nn  = (nr+1)/2;\n\n% over-sampling factor\nmult_factor = 30;        % should have mult_factor*(n) >> n\nm = mult_factor*n;\n\n% computation method:\n% H(exp(jTw)) = alpha(w) + j*phi(w)\n% where alpha(w) = 1/2*ln(R(w)) and phi(w) = Hilbert_trans(alpha(w))\n\n% compute 1/2*ln(R(w))\nw = 2*pi*[0:m-1]/m;\nR = exp( -j*kron(w',[-(n-1):n-1]) )*r;\nR = abs(real(R)); % remove numerical noise from the imaginary part\nfigure; plot(20*log10(R));\nalpha = 1/2*log(R);\n\n% find the Hilbert transform\nalphatmp = fft(alpha);\nalphatmp(floor(m/2)+1:m) = -alphatmp(floor(m/2)+1:m);\nalphatmp(1) = 0;\nalphatmp(floor(m/2)+1) = 0;\nphi = real(ifft(j*alphatmp));\n\n% now retrieve the original sampling\nindex  = find(rem([0:m-1],mult_factor)==0);\nalpha1 = alpha(index);\nphi1   = phi(index);\n\n% compute the impulse response (inverse Fourier transform)\nh = ifft(exp(alpha1+j*phi1),n);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/Contents.m",
    "content": "% Circuit design\n% <a href=\"http://stanford.edu/~boyd/papers/rc.html\">Optimizing Dominant Time Constant in RC Circuits</a>\n% <a href=\"http://stanford.edu/~boyd/papers/rc_iccad.html\">Optimal Wire and Transistor Sizing for Circuits with Non-Tree Topology</a>\n% <a href=\"http://stanford.edu/~boyd/papers/date05.html\">Geometric Programming and its Applications to EDA Problems</a>\n% <a href=\"http://stanford.edu/~boyd/papers/gp_digital_ckt.html\">Digital Circuit Optimization via Geometric Programming</a>\n%\n%  wire_driver_sizing.m       - Combined sizing of drivers, repeaters, and wire\n%  wire_sizing_spacing.m      - Combined wire sizing and spacing\n%  dig_ckt_sizing.m           - Digital circuit sizing example (GP)\n%  inverter_chain_sizing.m    - Digital circuit sizing for an inverter chain (GP)\n%  elmore_straight_wire.m     - Elmore delay sizing for a straight wire (GP)\n%  LC_osc_design.m            - LC oscillator design (GP)\n%  wire_sizing.m              - Optimal interconnect wire sizing\n%  clock_mesh.m               - Sizing of clock meshes\n%  tristate_bus_sizing.m      - Tri-state bus sizing and topology design\n%  simple_NAND2_gate_design.m - Two-input NAND gate sizing (GP)\n%  wire_sizing_topology.m     - Wire sizing and topology design\n%  simple_step.m              - Computes the step response of a linear system\n%  plot_four_tapers.m         - Plots four different taper desings on a single graph.\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/LC_osc_design.m",
    "content": "% LC oscillator design (GP)\n% Boyd, Kim, and Mohan, \"Geometric programming and its\n% applications to EDA Problems\", (DATE Tutorial 2005), pp.102-113.\n% Original code by S. Mohan\n% Written for CVX by Almir Mutapcic 02/08/06\n%\n% Designs an LC oscillator consisting of a loop inductor, varactors\n% for fine tuning, binary weighted switching capacitors for coarse\n% tuning, cross coupled NMOS transistors, and tail current source.\n% The optimal LC oscillator design iwith minimum power consumption,\n% and limits on phase noise, area, etc... can be formulated as a GP:\n%\n%   minimize   P\n%       s.t.   N <= Nmax, A <= Amax, l >= lmin, etc.\n%\n% where optimization variables are loop inductor dimensions D,W,\n% size of varactor Vc, size of switching caps Csw, width and length\n% of transistors Wnmos, Lnmos, bias current Ibias, etc.\n\n%********************************************************************\n% problem data\n%********************************************************************\nVdd   = 1.2;         % voltage\nCL    = 0.2e-12;     % load capcitance\nF     = 5e9;         % operating frequency in Hz\nomega = 2*pi*F;      % operating freq. in radians\n\nFOff   = 6e5;        % offset frequency for phase noise calculation\nLoopGainSpec = 2.0;  % loop gain spec\nVbias  = 0.2;        % non ideality of current mirror\n\n% tuning specs\nT         = 0.1;     % +/- tuning range as a normalized value\nCvarRatio = 3;       % maximum to minimum value of CVar\nCswBits   = 3;\nCswSegs   = 2^(CswBits);\nCvarCswLSBOverlap = 2;\n\ndisp('Generating the optimal tradeoff curve...')\n\n%********************************************************************\n% optimization of LC oscillator circuit (with tradeoff curve)\n%********************************************************************\n% varying phase noise parameter for the tradeoff curve\npowers = [];\nfor PNSpec=0.7e-12:0.2e-12:1e-11\n  fprintf('  PNSpec = %5.2f dBc/Hz: ', 10*log10(PNSpec) );\n  cvx_begin gp quiet\n    % optimization variables\n    variable D;        % diameter of loop inductor\n    variable W;        % width of loop inductor\n    variable SRF;      % self resonance frequency\n    variable l;        % length of CMOS transistor\n    variable w;        % width of CMOS transistor\n    variable Imax;     % maximum current through CMOS transistor\n    variable VOsc;     % differential voltage amplitude\n    variable CT;       % total capacitance of oscillator\n    variable Csw;      % maximum switching capacitance\n    variable Cvar;     % minimum variable capacitance\n    variable IBias;    % bias current\n    variable CMaxFreq; % capacitor max frequency\n\n    % minimize power = Vdd*IBias;\n    minimize( Vdd*IBias )\n    subject to\n      %*******************************************%\n      % loop inductor definitions and constraints %\n      %*******************************************%\n      SRFSpec  = 3*F;\n      omegaSRF = 2*pi*SRF;\n\n      % inductance\n      L = 2.1e-06*D^(1.28)*(W)^(-0.25)*(F)^(-0.01);\n      % series resistance\n      R = 0.1*D/W+3e-6*D*W^(-0.84)*F^(0.5)+5e-9*D*W^(-0.76)*F^(0.75)+0.02*D*W*F;\n      % effective capacitance\n      C = 1e-11*D+5e-6*D*W;\n\n      % area, tank conductance, and inverse quality factor\n      Area = (D+W)^2;\n      G    = R/(omega*L)^2;\n      invQ = R/(omega*L);\n\n      % loop constraints\n      Area <= 0.25e-6;\n      W <= 30e-6;\n      5e-6 <= W;\n      10*W <= D;\n      D <= 100*W;\n      SRFSpec <= SRF;\n      omegaSRF^2*L*C <= 1;\n\n      %****************************************%\n      % transistor definitions and constraints %\n      %****************************************%\n      GM  = 6e-3*(w/l)^0.6*(Imax/2)^(0.4);\n      GD  = 4e-10*(w/l)^0.4*(Imax/2)^(0.6)*1/l;\n      Vgs = 0.34+1e-8/l+800*(Imax*l/(2*w))^0.7;\n      Cgs = 1e-2*w*l;\n      Cgd = 1e-9*w;\n      Cdb = 1e-9*w;\n\n      % transistor constraints\n      2e-6 <= w;\n      0.13e-6 <= l;\n      l <= 1e-6;\n\n      %***************************************************%\n      % overall LC oscillator definitions and constraints %\n      %***************************************************%\n      invVOsc = (G+GD)/IBias;\n\n      % phase noise\n      kT4  = 4*1.38e-23*300;\n      kT4G = 2*kT4;\n      LoopCurrentNoise = kT4*G;\n      TransistorCurrentNoise = 0.5*kT4G*GM;\n      PN = 1/(160*(FOff*VOsc*CT)^2)*(LoopCurrentNoise+TransistorCurrentNoise);\n\n      % capacitance\n      Cfix = C+0.5*(CL+Cgs+Cdb+4*Cgd); % fixed capacitance\n      CDiffMaxFreq = Cfix+0.5*Cvar;\n\n      invLoopGain = (G+0.5*GD)/(0.5*GM);\n\n      % LC oscillator constraints\n      PN <= PNSpec;\n      omega^2*L*CT == 1;\n      omega^2*(1+T)^2*L*CMaxFreq == 1;\n      4*T/((1-T^2)^2)*CT <= Csw*(1+CvarCswLSBOverlap/CswSegs);\n      Csw*CvarCswLSBOverlap/CswSegs <= 0.5*Cvar*(CvarRatio-1);\n      CDiffMaxFreq <= CMaxFreq;\n      VOsc+2*Vbias <= 2*Vdd;\n      VOsc*invVOsc <= 1;\n      invLoopGain*LoopGainSpec <= 1; % loop gain spec\n      Vbias+Vgs+IBias/2*R/2 <= Vdd;  % bias constraint spec\n      Imax == IBias;\n  cvx_end\n  fprintf('min_power = %3.2f mW\\n', cvx_optval/1e-3);\n  powers = [powers cvx_optval];\nend\n\n% plot the tradeoff curve\nPNSpec = 0.7e-12:0.2e-12:1e-11;\nplot(10*log10(PNSpec),powers/1e-3);\nxlabel('Phase Noise (dBc/Hz)')\nylabel('Power (mW)')\ndisp('Optimal tradeoff curve plotted.')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/clock_mesh.m",
    "content": "% Sizing of clock meshes\n% Section 4, L. Vandenberghe, S. Boyd, and A. El Gamal\n% \"Optimal Wire and Transistor Sizing for Circuits with Non-Tree Topology\"\n% Original by Lieven Vanderberghe\n% Adapted to CVX by Argyris Zymnis - 12/04/05\n% Modified by Michael Grant - 3/8/06\n%\n% We consider the problem of sizing a clock mesh, so as to minimize the\n% total dissipated power under a constraint on the dominant time constant.\n% The numbers of nodes in the mesh is N per row or column (thus n=(N+1)^2\n% in total). We divide the wire into m segments of width xi, i = 1,...,m\n% which is constrained as 0 <= xi <= Wmax. We use a pi-model of each wire\n% segment, with capacitance beta_i*xi and conductance alpha_i*xi.\n% Defining C(x) = C0+x1*C1+x2*C2+...+xm*Cm we have that the dissipated\n% power is equal to ones(1,n)*C(x)*ones(n,1). Thus to minimize the\n% dissipated power subject to a constraint in the widths and a constraint\n% in the dominant time constant, we solve the SDP\n%               minimize        ones(1,m)*C(x)*ones(m,1)\n%                   s.t.        Tmax*G(x) - C(x) >= 0\n%                               0 <= xi <= Wmax\n\n%\n% Circuit parameters\n%\n\ndim=4;           % grid is dimxdim (assume dim is even)\nn=(dim+1)^2;     % number of nodes\nm=2*dim*(dim+1); % number of wires\n                 % 1...dim(dim+1) are horizontal segments\n                 % (numbered rowwise);\n                 % dim(dim+1)+1 ... 2*dim(dim+1) are vertical\n                 % (numbered columnwise)\nbeta = 0.5;      % capacitance per segment is twice beta times xi\nalpha = 1;       % conductance per segment is alpha times xi\nG0 = 1;          % source conductance\nC0 = [ 10     2     7     5     3;\n        8     3     9     5     5;\n        1     8     4     9     3;\n        7     3     6     8     2;\n        5     2     1     9    10 ];\nwmax = 1;       % upper bound on x\n\n%\n% Build capacitance and conductance matrices\n%\n\nCC = zeros(dim+1,dim+1,dim+1,dim+1,m+1);\nGG = zeros(dim+1,dim+1,dim+1,dim+1,m+1);\n\n% constant term\nCC(:,:,:,:,1) = reshape( diag(C0(:)), dim+1, dim+1, dim+1, dim+1 );\nzo13 = reshape( [1,0;0,1],   2, 1, 2, 1 );\nzo24 = reshape( zo13,        1, 2, 1, 2 );\npn13 = reshape( [1,-1;-1,1], 2, 1, 2, 1 );\npn24 = reshape( pn13,        1, 2, 1, 2 );\nfor i = 1 : dim+1,\n    % source conductance\n    % first driver in the middle of row 1\n    GG(dim/2+1,i,dim/2+1,i,1) = G0;\n    for j = 1 : dim,\n        % horizontal segments\n        node = 1 + j + ( i - 1 ) * dim;\n        CC([j,j+1],i,[j,j+1],i,node) = beta * zo13;\n        GG([j,j+1],i,[j,j+1],i,node) = alpha * pn13;\n        % vertical segments\n        node = node + dim * ( dim + 1 );\n        CC(i,[j,j+1],i,[j,j+1],node) = beta * zo24;\n        GG(i,[j,j+1],i,[j,j+1],node) = alpha * pn24;\n    end\nend\n% reshape for ease of use in Matlab\nCC = reshape( CC, n*n, m+1 );\nGG = reshape( GG, n*n, m+1 );\n\n%\n% Compute points the tradeoff curve, and the three sample points\n%\n\nnpts    = 50;\ndelays  = linspace( 50, 150, npts );\nxdelays = [ 50, 100 ];\nxnpts   = length( xdelays );\nareas   = zeros(1,npts);\nfor i = 1 : npts  + xnpts,\n\n    if i > npts,\n        xi = i - npts;\n        delay = xdelays(xi);\n        disp( sprintf( 'Particular solution %d of %d (Tmax = %g)', xi, xnpts, delay ) );\n    else,\n        delay = delays(i);\n        disp( sprintf( 'Point %d of %d on the tradeoff curve (Tmax = %g)', i, npts, delay ) );\n    end\n\n    %\n    % Construct and solve the convex model\n    %\n\n    cvx_begin sdp quiet\n        variable x(m)\n        variable G(n,n) symmetric\n        variable C(n,n) symmetric\n        dual variables Y1 Y2 Y3 Y4 Y5\n        minimize( sum( C(:) ) )\n        subject to\n            G == reshape( GG * [ 1 ; x ], n, n );\n            C == reshape( CC * [ 1 ; x ], n, n );\n            delay * G - C >= 0;\n            0 <= x <= wmax;\n    cvx_end\n\n    if i <= npts,\n        areas(i) = sum(x);\n    else,\n        xareas(xi) = sum(x);\n\n        %\n        % Display sizes\n        %\n\n        disp( sprintf( 'Solution %d:', xi ) );\n        disp( 'Vertical segments:' );\n        reshape( x(1:dim*(dim+1),1), dim, dim+1 )\n        disp( 'Horizontal segments:' );\n        reshape( x(dim*(dim+1)+1:end), dim, dim+1 )\n\n        %\n        % Determine the step responses\n        %\n\n        figure(xi+1);\n        A = -inv(C)*G;\n        B = -A*ones(n,1);\n        T = linspace(0,500,2000);\n        Y = simple_step(A,B,T(2),length(T));\n        indmax = 0;\n        indmin = Inf;\n        for j = 1 : size(Y,1),\n           inds = min(find(Y(j,:) >= 0.5));\n           if ( inds > indmax )\n              indmax = inds;\n              jmax = j;\n           end;\n           if ( inds < indmin )\n              indmin = inds;\n              jmin = j;\n           end;\n        end;\n        tthres = T(indmax);\n        GinvC  = full( G \\ C );\n        tdom   = max(eig(GinvC));\n        elmore = max(sum(GinvC'));\n        hold off; plot(T,Y(jmax,:),'-',T,Y(jmin,:));  hold on;\n        plot( tdom   * [1;1], [0;1], '--', ...\n              elmore * [1;1], [0;1], '--', ...\n              tthres * [1;1], [0;1], '--');\n        axis([0 500 0 1])\n        text(tdom,1,'d');\n        text(elmore,1,'e');\n        text(tthres,1,'t');\n        text( T(600), Y(jmax,600), sprintf( 'v%d', jmax ) );\n        text( T(600), Y(jmin,600), sprintf( 'v%d', jmin ) );\n        title( sprintf( 'Solution %d (Tmax=%g), fastest and slowest step responses', xi, delay ) );\n\n    end\n\nend;\n\n%\n% Plot the tradeoff curve\n%\n\nfigure(1)\nind = isfinite(areas);\nplot(areas(ind), delays(ind));\nxlabel('Area');\nylabel('Tdom');\ntitle('Area-delay tradeoff curve');\nhold on\nfor k = 1 : xnpts,\n    text( xareas(k), xdelays(k), sprintf( '(%d)', k ) );\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/dig_ckt_sizing.m",
    "content": "% Digital circuit sizing example (GP)\n% Boyd, Kim, Patil, and Horowitz, \"Digital circuit optimization\n% via geometric programming\"\n% Written for CVX by Almir Mutapcic 02/08/06\n%\n% Solves the problem of choosing gate scale factors x_i to give\n% minimum ckt delay, subject to limits on the total area and power.\n% Uses max gate arrival time T formulation that avoids evaluation\n% of the delay over all paths in the circuit.\n%\n%   minimize   T_bar\n%       s.t.   T_j <= T_bar      for j an output gate\n%              T_j + d_i <= T_i  for j in FI(i)\n%              P <= Pmax, A <= Amax\n%              x >= 1\n%\n% where variables are x and T.\n%\n% We use the circuit topology presented in figure 1 (page 902),\n% where we take gates 1, 3 and 6 to be inverters (INV),\n% gates 2 and 7 to be three input NANDs (NAND3),\n% and gates 4 and 5 to be two input NORs (NOR2).\n\n%********************************************************************\n% user specified data (specify problem constant and ckt topology)\n%********************************************************************\nm = 7;        % number of gates\nVdd = 5;      % supply voltage\nAmax = 250;   % maximum area spec\n\n% gate specs\nINV   = struct('Cin',3, 'Cint',3, 'Rdrv',0.48, 'A',3,  'Ileak',0.006);\nNAND3 = struct('Cin',4, 'Cint',6, 'Rdrv',0.48, 'A',8,  'Ileak',0.007);\nNOR2  = struct('Cin',5, 'Cint',6, 'Rdrv',0.48, 'A',10, 'Ileak',0.009);\n\nclear gates;\ngates([1 3 6]) = INV;\ngates([2 7])   = NAND3;\ngates([4 5])   = NOR2;\n\n% primary inputs and primary outputs labels (start with m+1)\nprimary_inputs = [8 9 10];\nprimary_outputs = [11 12];\nM = m + length( primary_inputs ) + length( primary_outputs );\n\n% fan-in cell array\nFI = cell(M,1);\nFI{1} = [8];\nFI{2} = [8 9 10];\nFI{3} = [10];\nFI{4} = [1 2];\nFI{5} = [2 3];\nFI{6} = [4];\nFI{7} = [3 4 5];\nFI{8} = [];\nFI{9} = [];\nFI{10} = [];\nFI{11} = [6];\nFI{12} = [7];\n\n% primary output has Cin capacitance (but has no Cload)\nCin_po = sparse(M,1);\nCin_po(primary_outputs) = [10 10];\n\n% primary input has Cload capacitance (but has no Cin)\nCload_pi = sparse(M,1);\nCload_pi(primary_inputs) = [10 10 10];\n\n% activity frequency of gates and primary inputs\nf_gates = 0.001*ones(m,1);\nf_pi = sparse(M,1);\nf_pi(primary_inputs) = 0.001*[10 10 10];\n\n%********************************************************************\n% derived problem data (computed from user inputs)\n%********************************************************************\n% fan-out cell array (compute it from the fan-in cell array)\nFO = cell(M,1);\nfor gate = [1:m primary_outputs]\n  preds = FI{gate};\n  for k = 1:length(preds)\n    FO{preds(k)}(end+1) = gate;\n  end\nend\n\n% input and internal capacitance of gates, and driving resistance\nCin_norm  = [gates.Cin]';\nCint_norm = [gates.Cint]';\nRdrv_norm = [gates.Rdrv]';\n\n% area specification for each gate with unit scaling\nA_norm = [gates.A]';\n\n% leakage current of gate i with unit scaling\nIleak_norm = [gates.Ileak]';\n\n%********************************************************************\n% optimization (with tradeoff curve generation)\n%********************************************************************\n% objective is the upper bound on the overall delay\n% and that is the max of arrival times for output gates\noutput_gates = [FI{primary_outputs}];\n\n% varying parameters for the tradeoff curve\nN = 25;\nPmax = linspace(10,20,N);\nmin_delay = zeros(N,1);\ndisp('Generating the optimal tradeoff curve...')\nfor n = 1:N\n  fprintf('Pmax = %6.2f: ',Pmax(n));\n  cvx_begin gp quiet\n    % optimization variables\n    variable x(m)                 % scale factor\n    variable T(m)                 % arrival times\n\n    % input capacitance is an affine function of sizes\n    Cin  = Cin_norm.*x;\n    Cint = Cint_norm.*x;\n\n    % driving resistance is inversily proportional to sizes\n    R = Rdrv_norm./x;\n\n    % gate delay is the product of its driving resistance and load cap.\n    Cload = cvx( zeros(m,1) );\n    for gate = 1:m\n      if ~ismember( FO{gate}, primary_outputs )\n        Cload(gate) = sum( Cin(FO{gate}) );\n      else\n        Cload(gate) = Cin_po( FO{gate} );\n      end\n    end\n\n    % delay\n    D = 0.69*ones(m,1).*R.*( Cint + Cload );\n\n    % total area\n    area = A_norm'*x;\n\n    % total power calculation\n    Pdyn = Vdd^2*sum( f_pi(primary_inputs).*Cload_pi(primary_inputs) ) + ...\n           Vdd^2*(f_gates'*(Cint + Cload));\n    Pstat = Vdd*Ileak_norm'*x;\n    power = Pdyn + Pstat;\n\n    minimize( max( T(output_gates) ) )\n    subject to\n      % constraints\n      x >= 1;\n      area <= Amax;\n      power <= Pmax(n);\n\n      % create timing constraints\n      for gate = 1:m\n        if ~ismember( FI{gate}, primary_inputs )\n          for j = FI{gate}\n            % enforce T_j + D_j <= T_i over all gates j that drive i\n            D(gate) + T(j) <= T(gate);\n          end\n        else\n          % enforce D_i <= T_i for gates i connected to primary inputs\n          D(gate) <= T(gate);\n        end\n      end\n  cvx_end\n  fprintf( 'delay = %3.2f\\n', cvx_optval );\n  min_delay(n) = cvx_optval;\nend\n\n% plot the tradeoff curve\nfigure, clf\nplot(Pmax,min_delay);\nxlabel('Pmax'); ylabel('Dmin');\ntitle(['Tradeoff curve for Amax = ' num2str(Amax)])\ndisp('Optimal tradeoff curve plotted.')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/elmore_straight_wire.m",
    "content": "% Elmore delay sizing for a straight wire (GP)\n% Boyd, \"Problems in VLSI design\" (Lecture)\n% Written for CVX by Almir Mutapcic 02/08/06\n%\n% We consider the problem of finding optimal width profile\n% for a straight wire segmented into N parts. We want to\n% minimize the Elmore delay, subject to limits on wire width\n% and the total area. We use a pi-model for each wire segment.\n% Problem can be formulated as GP:\n%\n%   minimize   D\n%       s.t.   w_min <= w <= w_max\n%              area  <= Amax\n%\n% where variables are widths w (and arrival times T that are used\n% to formulate the overall delay D expression).\n%\n% Important: We label root node as 1, and all the other nodes as\n%            node_label_in_the_paper + 1 (due to Matlab's convention).\n%            Also label nodes with increasing numbers downstream.\n\n%********************************************************************\n% user supplied data (problem constants and tree topology)\n%********************************************************************\nN = 10+1; % number of segments (including the root node which is labeled as 1)\n\n% parent node array for the straight wire\n% specifies which node is a unique parent for node i (always have a tree)\nparent = [0:N-1];\n\n% problem constants\nRsource = 0.1;\nl = 1*ones(N-1,1);\nalpha = 1*ones(N-1,1);\nbeta  = 1*ones(N-1,1);\ngamma = 1*ones(N-1,1);\n\n% load capacitance at each node\nCload = [0; ones(N-1,1)];\n\n% minimum and maximum width and area specification\nWmin = 1;\nWmax = 10;\nAmax = 50;\n\n%********************************************************************\n% derived data (computed from user's data)\n%********************************************************************\n% compute children cell array (evaluate who are children for each node)\nchildren = cell(N,1);\nleafs = [];\nfor node = [1:N]\n  children{node} = find(parent == node);\n  if isempty(children{node})\n    leafs(end+1) = node; % leafs have no children\n  end\nend\n\n%********************************************************************\n% optimization\n%********************************************************************\n\ndisp('Generating the tradeoff curve...')\nDarray = []; widths = [];\nfor Amax = [10.05 10.5 11 12:2:20 22.5 25:5:60]\n    fprintf( 'Amax = %5.2f: ', Amax );\n    cvx_begin gp quiet\n        % optimization variables\n        variable w(N-1)     % wire width\n        variable T(N)       % arrival time (Elmore delay to node i)\n\n        % objective is the critical Elmore delay\n        minimize( max( T(leafs) ) )\n        subject to\n\n          % wire segment resistance is inversely proportional to widths\n          R = alpha.*l./w;\n          R = [Rsource; R];\n\n          % wire segment capacitance is an affine function of widths\n          C_bar = beta.*l.*w + gamma.*l;\n          C_bar = [0; C_bar];\n\n          % compute common capacitances for each node (C_tilde in GP tutorial)\n          C_tilde = cvx( zeros(N,1) );\n          for node = [1:N]\n            C_tilde(node,1) = Cload(node);\n            for k = parent(node)\n              if k > 0; C_tilde(node,1) = C_tilde(node,1) + C_bar(k); end;\n            end\n            for k = children{node}\n              C_tilde(node,1) = C_tilde(node,1) + C_bar(k);\n            end\n          end\n\n          % now compute total downstream capacitances\n          C_total = C_tilde;\n          for node = N:-1:1\n            for k = children{node}\n              C_total(node,1) = C_total(node,1) + C_total(k,1);\n            end\n          end\n\n        % generate Elmore delay constraints\n        R(1)*C_total(1) <= T(1,1);\n        for node = 2:N\n          R(node)*C_total(node) + T(parent(node),1) <= T(node,1);\n        end\n\n        % collect all the constraints\n        sum(w.*l) <= Amax;\n        Wmin <= w <= Wmax;\n    cvx_end\n    % display and store computed values\n    fprintf('delay = %3.2f\\n',cvx_optval);\n    Darray = [Darray cvx_optval];\n    widths = [widths w];\nend\n\n% indices of four taper designs on the tradeoff curve\nAmax = [10.05 10.5 11 12:2:20 22.5 25:5:60];\nA11ind = find(Amax == 11);\nA20ind = find(Amax == 20);\nA35ind = find(Amax == 35);\nA50ind = find(Amax == 50);\n\n% plot the tradeoff curve\nfigure, clf\nplot(Darray,Amax, ...\n     Darray(A11ind),Amax(A11ind),'ro',...\n     Darray(A20ind),Amax(A20ind),'ro',...\n     Darray(A35ind),Amax(A35ind),'ro',...\n     Darray(A50ind),Amax(A50ind),'ro');\nxlabel('Elmore delay D'); ylabel('Amax');\ndisp('Optimal tradeoff curve plotted.')\n\n% plot four taper designs\nfigure, clf\nw1 = widths(:,A50ind);\nw2 = widths(:,A35ind);\nw3 = widths(:,A20ind);\nw4 = widths(:,A11ind);\nplot_four_tapers(w1,w2,w3,w4);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/inverter_chain_sizing.m",
    "content": "% Digital circuit sizing for an inverter chain (GP)\n% Boyd, Kim, Patil, and Horowitz, \"Digital circuit optimization\n% via geometric programming\"\n% Written for CVX by Almir Mutapcic 02/08/06\n%\n% We consider a chain of N inverters driving a load capacitance CL.\n% The problem is to find optimal scale factors for the inverter\n% that minimize the sum of them (area), while obeying constraints\n% on the maximum delay through the circuit, and minimum and maximum\n% limits on scale factors. There are no limits on the total power.\n% (For more details about the inverter chain see sec. 2.1.11 in the paper.)\n%\n%   minimize   sum(x)\n%       s.t.   T_j <= Dmax          for j an output gate\n%              T_j + d_i <= T_i     for j in FI(i)\n%              x_min <= x <= x_max\n%\n% where variables are x and T.\n% Here we use data structures and digital circuit models from the\n% referenced paper.\n\n%********************************************************************\n% problem data\n%********************************************************************\nN  = 8;      % number of inverters\nCL = 20;     % capacitance load\nDmax = 20;   % maximum delay through the circuit\nx_min = 1;   % minimum scale factor\nx_max = 20;  % maximum scale factor\n\n% circuit labeling convention:\n% label primary input (input to the first inverter in the chain) with N+1\n% label primary output (output of the last inverter in the chain) with N+2\n% label inverters in the chain with 1,2,...,N based on their location\n\n% primary input and primary output labels (start with N+1)\nprimary_inputs  = [N+1];\nprimary_outputs = [N+2];\nM = N + length( primary_inputs ) + length( primary_outputs );\n\n% fan-in cell array for a straight chain of inverters\nFI{1} = [N+1];   % fan-in of the first inverter is the primary input\nfor k = 2:N\n  FI{k} = [k-1]; % fan-in of other inverters is the inverter feeding into them\nend\nFI{N+2} = [N];   % fan-in of the primary output is the last inverter in the chain\n\n% fan-out cell array\n% (will be computed from the fan-in cell array, no need to modify)\nFO = cell(M,1);\nfor gate = [1:N primary_outputs]\n  preds = FI{gate};\n  for k = 1:length(preds)\n    FO{preds(k)}(end+1) = gate;\n  end\nend\n\n% input and internal capacitance of gates and the driving resistance\nCin_norm  = ones(N,1);\nCint_norm = ones(N,1);\nRdrv_norm = ones(N,1);\n\n% place extra capacitance before the input of the 5th inverter\nCin_norm(5) = 80;\n\n% primary output has Cin capacitance (but has no Cload)\nCin_po = sparse(M,1);\nCin_po(primary_outputs) = CL;\n\n% primary input has Cload capacitance (but has no Cin)\nCload_pi = sparse(M,1);\nCload_pi(primary_inputs) = 1;\n\n%********************************************************************\n% optimization\n%********************************************************************\ncvx_begin gp\n  % optimization variables\n  variable x(N)                 % sizes\n  variable T(N)                 % arrival times\n\n  % minimize the sum of scale factors subject to above constraints\n  minimize( sum(x) )\n  subject to\n\n    % input capacitance is an affine function of sizes\n    Cin  = Cin_norm.*x;\n    Cint = Cint_norm.*x;\n\n    % driving resistance is inversily proportional to sizes\n    R = Rdrv_norm./x;\n\n    % gate delay is the product of its driving resistance and load cap.\n    Cload = cvx( zeros(N,1) );\n    for gate = 1:N\n      if ~ismember( FO{gate}, primary_outputs )\n        Cload(gate) = sum( Cin(FO{gate}) );\n      else\n        Cload(gate) = Cin_po( FO{gate} );\n      end\n    end\n\n    % delay\n    D = 0.69*ones(N,1).*R.*( Cint + Cload );\n\n    % create timing constraints\n    for gate = 1:N\n      if ~ismember( FI{gate}, primary_inputs )\n        for j = FI{gate}\n          % enforce T_j + D_j <= T_i over all gates j that drive i\n          D(gate) + T(j) <= T(gate);\n        end\n      else\n        % enforce D_i <= T_i for gates i connected to primary inputs\n        D(gate) <= T(gate);\n      end\n    end\n\n    % circuit delay is the max of arrival times for output gates\n    output_gates = [FI{primary_outputs}];\n    circuit_delay = max( T(output_gates) );\n\n    % collect all the constraints\n    circuit_delay <= Dmax;\n    x_min <= x <= x_max;\ncvx_end\n\n% message about extra capacitance and result display\ndisp(' ')\ndisp(['Note: there is an extra capacitance between the 4th and 5th inverter'...\n     ' in the chain.'])\nfprintf(1,'\\nOptimal scale factors are: \\n'), x\n\n% plot scale factors and maximum delay for inverter i\nclose all;\nsubplot(2,1,1); plot([1:N],T,'g--',[1:N],T,'bo');\nylabel('maximum delay T')\nsubplot(2,1,2); stem([1:N],x);\nylabel('scale factor x')\nxlabel('inverter stage')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/plot_four_tapers.m",
    "content": "function plot_four_tapers(w1,w2,w3,w4)\n% Plots four different taper desings on a single graph.\n% Inputs:\n%      [w1 w2 w3 w4]: an array of taper widths\n%\n% Original code written by Lieven Vandenberghe.\n% Updated by Almir Mutapcic 12/2005\n\nn = size(w1,1);\ncolormap(gray);\nwidth = zeros(2*n,4);\nwidth([1:2:2*n-1],:) =  [w1 w2 w3 w4];\nwidth([2:2:2*n],:)   =  [w1 w2 w3 w4];\nx = zeros(2*n,1);\nx([1:2:2*n-1],:) = [0:n-1]';\nx([2:2:2*n],:)   = [1:n]';\n\n% first solution\nsubplot(411)\nhold off\nplot([x;flipud(x);0], [0.5*(width(1,1)-width(:,1)); ...\n    flipud(0.5*(width(1,1)+width(:,1))); 0]);\nhold on;\nfill([x;flipud(x);0]', [0.5*(width(1,1)-width(:,1)); ...\n  flipud(0.5*(width(1,1)+width(:,1))); 0]', 0.9*ones(size([x;x;0]'))); \ncaxis([-1,1]);\nplot([x;flipud(x);0], [0.5*(width(1,1)-width(:,1)); ...\n    flipud(0.5*(width(1,1)+width(:,1))); 0]);\nylabel('width');\n\n% second solution\nsubplot(412)\nhold off\nplot([x;flipud(x);0], [0.5*(width(1,2)-width(:,2)); ...\n    flipud(0.5*(width(1,2)+width(:,2))); 0]);\nhold on;\nfill([x;flipud(x);0]', [0.5*(width(1,2)-width(:,2)); ...\n   flipud(0.5*(width(1,2)+width(:,2))); 0]', 0.9*ones(size([x;x;0]'))); \ncaxis([-1,1]);\nplot([x;flipud(x);0], [0.5*(width(1,2)-width(:,2)); ...\n    flipud(0.5*(width(1,2)+width(:,2))); 0]);\nylabel('width');\n\n% third solution\nsubplot(413)\nhold off\nplot([x;flipud(x);0], [0.5*(width(1,3)-width(:,3)); ...\n    flipud(0.5*(width(1,3)+width(:,3))); 0]);\nhold on;\nfill([x;flipud(x);0]', [0.5*(width(1,3)-width(:,3)); ...\n  flipud(0.5*(width(1,3)+width(:,3))); 0]', 0.9*ones(size([x;x;0]'))); \ncaxis([-1,1]);\nplot([x;flipud(x);0], [0.5*(width(1,3)-width(:,3)); ...\n    flipud(0.5*(width(1,3)+width(:,3))); 0]);\nylabel('width');\n\n% fourth solution\nsubplot(414)\nhold off\nplot([x;flipud(x);0], [0.5*(width(1,4)-width(:,4)); ...\n    flipud(0.5*(width(1,4)+width(:,4))); 0]);\nhold on;\nfill([x;flipud(x);0]', [0.5*(width(1,4)-width(:,4)); ...\n   flipud(0.5*(width(1,4)+width(:,4))); 0]', 0.9*ones(size([x;x;0]'))); \ncaxis([-1,1]);\nplot([x;flipud(x);0], [0.5*(width(1,4)-width(:,4)); ...\n    flipud(0.5*(width(1,4)+width(:,4))); 0]);\nylabel('width');\nxlabel('segment');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/simple_NAND2_gate_design.m",
    "content": "% Two-input NAND gate sizing (GP)\n% Boyd, Kim, Patil, and Horowitz, \"Digital circuit optimization\n% via geometric programming\"\n% Written for CVX by Almir Mutapcic 02/08/06\n% (a figure is generated)\n%\n% This is an example taken directly from the paper:\n%\n%   Digital circuit optimization via geometrical programming\n%   by Boyd, Kim, Patil, and Horowitz\n%   Operations Research 53(6): 899-932, 2005.\n%\n% Solves the problem of choosing device widths w_i for the given\n% NAND2 gate in order to achive minimum Elmore delay for different\n% gate transitions, subject to limits on the device widths,\n% gate area, power, and so on. The problem is a GP:\n%\n%   minimize   D = max( D_1, ..., D_k )  for k transitions\n%       s.t.   w_min <= w <= w_max\n%              A <= Amax, etc.\n%\n% where variables are widths w.\n%\n% This code is specific to the NAND2 gate shown in figure 19\n% (page 926) of the paper. All the constraints and the objective\n% are hard-coded for this particular circuit.\n\n%********************************************************************\n% problem data and hard-coded GP specs (evaluate all transitions)\n%********************************************************************\nN = 4;       % number of devices\nCload = 12;  % load capacitance\nVdd = 1.5;   % voltage\n\n% device specs\nNMOS = struct('R',0.4831, 'Cdb',0.6, 'Csb',0.6, 'Cgb',1, 'Cgs',1);\nPMOS = struct('R',2*0.4831, 'Cdb',0.6, 'Csb',0.6, 'Cgb',1, 'Cgs',1);\n\n% maximum area and power specification\nAmax = 24;\nwmin = 1;\n\n% varying parameters for the tradeoff curve\nNpoints = 25;\nAmax = linspace(5,45,Npoints);\nDopt = [];\n\ndisp('Generating the optimal tradeoff curve...')\nneed_sedumi = strncmpi(cvx_solver,'sdpt',4);\nif need_sedumi,\n    warning('This model does not converge with SDPT3... switching to SeDuMi.');\nend\nfor k = 1:Npoints\n    fprintf(1,'  Amax = %5.2f:', Amax(k));\n    cvx_begin gp quiet\n        if need_sedumi,\n            cvx_solver sedumi\n        end\n            \n        % device width variables\n        variable w(N)\n\n        % device specs\n        device(1:2) = PMOS; device(3:4) = NMOS;\n\n        for num = 1:N\n            device(num).R   = device(num).R/w(num);\n            device(num).Cdb = device(num).Cdb*w(num);\n            device(num).Csb = device(num).Csb*w(num);\n            device(num).Cgb = device(num).Cgb*w(num);\n            device(num).Cgs = device(num).Cgs*w(num);\n        end\n\n        % capacitances\n        C1 = sum([device(1:3).Cdb]) + Cload;\n        C2 = device(3).Csb + device(4).Cdb;\n\n        % input capacitances\n        Cin_A = sum([ device([2 3]).Cgb ]) + sum([ device([2 3]).Cgs ]);\n        Cin_B = sum([ device([1 4]).Cgb ]) + sum([ device([1 4]).Cgs ]);\n\n        % resistances\n        R = [device.R]';\n\n        % area definition\n        area = sum(w);\n\n        % delays and dissipated energies for all six possible transitions\n        % transition 1 is A: 1->1, B: 1->0, Z: 0->1\n        D1 = R(1)*(C1 + C2);\n        E1 = (C1 + C2)*Vdd^2/2;\n        % transition 2 is A: 1->0, B: 1->1, Z: 0->1\n        D2 = R(2)*C1;\n        E2 = C1*Vdd^2/2;\n        % transition 3 is A: 1->0, B: 1->0, Z: 0->1\n        % D3 = C1*R(1)*R(2)/(R(1) + R(2)); % not a posynomial\n        E3 = C1*Vdd^2/2;\n        % transition 4 is A: 1->1, B: 0->1, Z: 1->0\n        D4 = C1*R(3) + R(4)*(C1 + C2);\n        E4 = (C1 + C2)*Vdd^2/2;\n        % transition 5 is A: 0->1, B: 1->1, Z: 1->0\n        D5 = C1*(R(3) + R(4));\n        E5 = (C1 + C2)*Vdd^2/2;\n        % transition 6 is A: 0->1, B: 0->1, Z: 1->0\n        D6 = C1*R(3) + R(4)*(C1 + C2);\n        E6 = (C1 + C2)*Vdd^2/2;\n\n        % objective is the worst-case delay\n        minimize( max( [D1 D2 D4] ) )\n        subject to\n            area <= Amax(k);\n            w >= wmin;\n    cvx_end\n    % display and store computed values\n    fprintf(1,' delay = %3.2f\\n',cvx_optval);\n    Dopt = [Dopt cvx_optval];\nend\n\n% plot the tradeoff curve\nplot(Dopt,Amax);\nxlabel('Dmin'); ylabel('Amax');\ndisp('Optimal tradeoff curve plotted.')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/simple_step.m",
    "content": "% Computes the step response of a linear system\r\n\r\nfunction X = simple_step(A,B,DT,N)\r\nn  = size(A,1);\r\nAd = expm( full( A * DT ) );\r\nBd = ( Ad - eye(n) ) * B;\r\nBd = A \\ Bd;\r\nX  = zeros(n,N);\r\nfor k = 2 : N,\r\n    X(:,k) = Ad*X(:,k-1)+Bd;\r\nend\r\n\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/tristate_bus_sizing.m",
    "content": "% Tri-state bus sizing and topology design\n% Section 5.4,  L. Vandenberghe, S. Boyd, and A. El Gamal\n% \"Optimizing dominant time constant in RC circuits\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 11/27/05\n% Modified by Michael Grant - 3/8/06\n%\n% We optimize a tri-state bus connecting six nodes ( The model for the bus\n% is shown in the paper, fig.16). The total wire area is sum_{i>j} lij*xij\n% The bus can be driven from any node. When node i drives the bus, the ith\n% switch is closed and the others are all open. Thus we really have six\n% different circuits, each corresponding to a given node driving the bus.\n% we require that the dominant time constant of each of the six drive\n% configuration circuits has dominant time constant less than Tmax.\n% The problem can be formulated with the following SDP:\n%               minimize        sum_{i>j}(x_ij*l_ij)\n%                   s.t.        0 <= xij <= wmax\n%                               Tmax*(G(x) + GE_kk) - C(x) >= 0 , 1 <=k<= 6\n% The matrix E_kk is zero except for the kth diagonal element, which is 1.\n\n%\n% Circuit parameters\n%\n\nn=6;         % number of nodes\nm=15;        % number of wires\nbeta = 0.5;  % capacitance per segment is twice beta times xi*li\nalpha = 1;   % conductance per segment is alpha times xi/li\nG0 = 1;      % source conductance\nC0 = 10;     % load capacitor\nwmax = 1;    % upper bound on x\n\n%\n% Node positions\n%\n\nxpos = [ 0   1   6   8  -4  -1 ;\n         0  -1   4  -2   1   4 ] ;\nX11 = repmat(xpos(1,:),n,1);\nX12 = repmat(xpos(1,:)',1,n);\nX21 = repmat(xpos(2,:),n,1);\nX22 = repmat(xpos(2,:)',1,n);\nLL  = abs(X11-X12) + abs(X21-X22);\nL   = tril(LL);\nL   = L(L>0);\n\n%\n% Construct the capacitance and conductance matrices\n%   C(x) = C0 + w11 * C1 + w21 * C2 + ...\n%   G(x) = G0 + w11 * G1 + w21 * G2 + ...\n% and we assemble the coefficient matrices together as follows:\n%   CC = [ C0(:) C1(:) C2(:) ... ]\n%   GG = [ G0(:) G1(:) G2(:) ... ]\n%\n\nCC = zeros(n,n,m+1);\nGG = zeros(n,n,m+1);\nCC(:,:,1) = C0 * eye(n);\n% segment capacitances and conductances\nk3 = 1;\nfor k1 = 1 : 5,\n    for k2 = k1 + 1 : 6,\n        CC([k1,k2],[k1,k2],k3) = beta *[1, 0; 0,1]*L(k3);\n        GG([k1,k2],[k1,k2],k3) = alpha*[1,-1;-1,1]/L(k3);\n        k3 = k3 + 1;\n    end\nend\nGG = reshape( GG, n*n, m+1 );\nCC = reshape( CC, n*n, m+1 );\n\n%\n% Compute points the tradeoff curve and the two desired points\n%\n\n% points on the tradeoff curve\nnpts    = 50;\ndelays  = linspace( 410, 2000, npts );\nxdelays = [ 410, 2000 ];\nxnpts   = length(xdelays);\nareas   = zeros(1,npts);\nxareas  = zeros(1,xnpts);\nsizes   = zeros(m,xnpts);\nfor i = 1 : npts  + xnpts,\n\n    if i > npts,\n        xi = i - npts;\n        delay = xdelays(xi);\n        disp( sprintf( 'Particular solution %d of %d (Tmax = %g)', xi, xnpts, delay ) );\n    else\n        delay = delays(i);\n        disp( sprintf( 'Point %d of %d on the tradeoff curve (Tmax = %g)', i, npts, delay ) );\n    end\n\n    %\n    % Construct and solve the convex model\n    %\n\n    cvx_begin sdp quiet\n        variable x(m)\n        variable G(n,n) symmetric\n        variable C(n,n) symmetric\n        minimize( L'*x )\n        G == reshape( GG * [ 1 ; x ], n, n );\n        C == reshape( CC * [ 1 ; x ], n, n );\n        for k = 1 : n,\n            delay * G - C + sparse(k,k,delay,n,n) >= 0;\n        end\n        0 <= x <= wmax;\n    cvx_end\n\n    if i <= npts,\n        areas(i) = cvx_optval;\n    else\n        xareas(xi) = cvx_optval;\n        sizes(:,xi) = x;\n\n        %\n        % Plot the step response\n        %\n\n        T = linspace(0,2*delay,1000);\n        for inp = 1 : 6,\n            figure(6*xi-5+inp);\n            GQ = G + sparse(inp,inp,delay,n,n);\n            A = -inv(C)*GQ;\n            B = -A*ones(n,1);\n            Y = simple_step(A,B,T(2),length(T));\n            hold off; plot(T,Y,'-');  hold on;\n            ind=0;\n            for j=1:size(Y,1),\n                ind = max(min(find(Y(j,:)>=0.5)),ind);\n            end\n            tdom   = max(eig(inv(GQ)*C));\n            elmore = max(sum((inv(GQ)*C)'));\n            tthres = T(ind);\n            plot( tdom   * [1;1], [0;1], '--', ...\n                  elmore * [1;1], [0;1], '--', ...\n                  tthres * [1;1], [0;1], '--');\n            text(tdom,  0,'d');\n            text(elmore,0,'e');\n            text(tthres,0,'t');\n            ylabel('Voltage');\n            title(sprintf('Step response for solution %d, Tmax=%d, with switch %d is closed',xi,delay,inp));\n       end\n\n    end\n\nend;\n\n%\n% Plot the tradeoff curve\n%\n\nfigure(1)\nind = isfinite(areas);\nplot(areas(ind), delays(ind));\nxlabel('Area');\nylabel('Tdom');\ntitle('Area-delay tradeoff curve');\nhold on\nfor k = 1 : xnpts,\n    text( xareas(k), xdelays(k), sprintf( '(%d)', k ) );\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/wire_driver_sizing.m",
    "content": "% Combined sizing of drivers, repeaters, and wire\n% Section 5.2,  L. Vandenberghe, S. Boyd, and A. El Gamal\n% \"Optimizing dominant time constant in RC circuits\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 11/25/05\n% Modified by Michael Grant - 3/8/06\n%\n% The first driver drives an interconnect wire, modeled as n RC Pi segments\n% connected to a repeater, which drives a capacitive load through another n\n% segment wires. The problem is to determine the sizes of the wire segments\n% (x1, . . . , x40) and the sizes of the driver & repeater d1 and d2.\n% We want to minimize area subject to bound on the combined delay Tdom1 +\n% Tdom2 of the two stages.\n%               minimize        L(d1 + d2) + sum(xi*li)\n%                   s.t.        0 <= xi <= wmax\n%                               d1 >=0 , d2 >= 0\n%                               (Tmax/2)G1(x, d1, d2) - C1(x,d2) >= 0\n%                               (Tmax/2)G2(x, d1, d2) - C2(x) >= 0\n\n%\n% Circuit parameters\n%\n\nn = 21;        % number of nodes per wire\nm = n-1;       % number of segments per wire\ng = 1.0;       % output conductance is g times driver size\nc0 = 1.0;      % input capacitance of driver is co + c*driver size\nc = 3.0;\nalpha = 10;    % wire segment: two capacitances beta*width\nbeta = 0.5;    % wire segment: conductance alpha*width\nC = 50;        % external load\nL = 10.0;      % area is sum xi + L*(d1+d2)\nwmax = 2.0;    % maximum wire width\ndmax = 100.0;  % maximum driver size\n\n%\n% Construct the capacitance and conductance matrices\n%   C1(x) = C10 + w11 * C11 + w21 * C12 + ...\n%   C2(x) = C20 + w11 * C21 + w21 * C22 + ...\n%   G1(x) = G10 + w11 * G11 + w21 * G12 + ...\n%   G2(x) = G20 + w11 * G21 + w21 * G22 + ...\n% and we assemble the coefficient matrices together as follows:\n%   CC = [ C10(:) C11(:) C12(:) ... ; C20(:) C21(:) C22(:) ... ]\n%   GG = [ G10(:) G11(:) G12(:) ... ; C20(:) C21(:) C22(:) ... ]\n%\n%\n\nCC = zeros(n,n,2,2*m+3);\nGG = zeros(n,n,2,2*m+3);\n% load on first circuit from second driver = c0 + c * d2\nCC(n,n,1,1    ) = c0;\nCC(n,n,1,2*m+3) = c;\n% external load\nCC(n,n,2,1) = C;\n% output conductances of drivers\nGG(1,1,1,2*m+2) = g;\nGG(1,1,2,2*m+3) = g;\n% segment capacitances and conductances\nfor i = 1 : n-1,\n    CC(i:i+1,i:i+1,1,  i+1) =  beta * [1, 0; 0,1];\n    CC(i:i+1,i:i+1,2,m+i+1) =  beta * [1, 0; 0,1];\n    GG(i:i+1,i:i+1,1,  i+1) = alpha * [1,-1;-1,1];\n    GG(i:i+1,i:i+1,2,m+i+1) = alpha * [1,-1;-1,1];\nend\n% reshape for Matlab use\nCC = reshape( CC, n*n*2, 2*m+3 );\nGG = reshape( GG, n*n*2, 2*m+3 );\n\n%\n% Compute points the tradeoff curve and the sample solution\n%\n\nnpts    = 50;\ndelays  = linspace( 150, 500, npts );\nxdelays = 189;\nxnpts   = length( xdelays );\nareas   = zeros( 1, npts );\nxareas  = zeros( 1, xnpts );\nfor i = 1 : npts + xnpts,\n\n    if i > npts,\n        xi = i - npts;\n        delay = xdelays(xi);\n        disp( sprintf( 'Particular solution %d of %d (Tmax = %g)', xi, xnpts, delay ) );\n    else,\n        delay = delays(i);\n        disp( sprintf( 'Point %d of %d on the tradeoff curve (Tmax = %g)', i, npts, delay ) );\n    end\n\n    %\n    % Construct and solve the convex model\n    %\n\n    cvx_begin sdp quiet\n        variables w(m,2) d(1,2)\n        variable G(n,n,2) symmetric\n        variable C(n,n,2) symmetric\n        minimize( L * sum(d) + sum(w(:)) );\n        G == reshape( GG * [ 1 ; w(:) ; d(:) ], n, n, 2 );\n        C == reshape( CC * [ 1 ; w(:) ; d(:) ], n, n, 2 );\n        % This is actually two LMIs, one for each circuit\n        (delay/2) * G - C >= 0;\n        0 <= w(:) <= wmax;\n        d(:) >= 0;\n    cvx_end\n\n    if i <= npts,\n        areas(i) = cvx_optval;\n    else\n        xareas(xi) = cvx_optval;\n\n        %\n        % Draw solution, plotting drivers as a block with width os\n        % and height L/(2*os).\n        %\n\n        figure(2*xi);\n        os = 3;\n        m2 = 2 * m;\n        ss = max( L * max( d ) / os, max( w(:) ) );\n        x  = reshape( [ 1 : m ; 1 : m ], 1, m2 );\n        y  = 0.5 * [ - w(x,:) ; w(x(end:-1:1),:) ; + w(1,:) ];\n        yd = ( 0.5 * L / os ) * [ -d ; -d ; +d ; +d ; -d ];\n        x   = reshape( [ 0 : m - 1 ; 1 : m ], m2, 1 );\n        x   = [ x ; x(end:-1:1,:) ; 0 ];\n        xd  = [ 0 ; os ; os ; 0 ; 0 ];\n        x   = x + os + 0.5;\n        xd  = [ xd, xd + os + m + 1 ];\n        x   = [ x, x + os + m + 1 ];\n        fill( x, y, 0.9 * ones(size(y)), xd, yd, 0.9 * ones(size(yd)) );\n        hold on\n        plot( x, y, '-', xd, yd, '-' );\n        axis( [-0.5, 2*m+2*os+2, -0.5*ss-0.1,0.5*ss+0.1 ] );\n        set( gca, 'XTick', [x(1,1),x(1,1)+m,x(1,2),x(1,2)+m] );\n        set( gca, 'XTicklabel', {'0',num2str(m),'0',num2str(m)} );\n        colormap(gray);\n        caxis([-1,1])\n        title(sprintf('Sample solution (%d), Tmax = %g', xi, delay ));\n\n        %\n        % Build the state space models and plot step responses\n        %\n\n        figure(2*xi+1);\n        T = linspace(0,1000,1000);\n        tdom = []; telm = []; tthresh = []; Y = {};\n        for k = 1 : 2,\n            A = -inv(C(:,:,k))*G(:,:,k);\n            B = -A* ones(n,1);\n            tdom(k) = max(eig(inv(G(:,:,k))*C(:,:,k)));\n            telm(k) = max(sum((inv(G(:,:,k))*C(:,:,k))'));\n            Y{k} = simple_step(A,B,T(2),length(T));\n            Y{k} = Y{k}(n,:);\n            tthresh(k) = min(find(Y{k}>=0.5));\n        end\n        plot( T, Y{1}, '-', T, Y{2}, '-' );\n        axis([0 T(500) 0 1]);\n        xlabel('time');\n        ylabel('v');\n        hold on;\n        text(tdom(1),0,'d1');\n        text(telm(2),0,'e1');\n        text(tthresh(1),0,'t1');\n        text(tdom(1)+tdom(2),0,'d2');\n        text(tdom(1)+telm(2),0,'e2');\n        text(tdom(1)+tthresh(2),0,'t2');\n        plot(tdom(1)*[1;1],[0;1],'--');\n        plot(telm(1)*[1;1],[0;1],'--');\n        plot(tthresh(1)*[1;1],[0;1],'--');\n        plot((tdom(1)+tdom(2))*[1;1],[0;1],'--');\n        plot((tdom(1)+telm(2))*[1;1],[0;1],'--');\n        plot((tdom(1)+tthresh(2))*[1;1],[0;1],'--');\n        title(sprintf('Step responses for sample solution (%d), Tmax = %g', xi, delay ));\n\n     end\n\nend\n\n%\n% Plot tradeoff curve\n%\n\nfigure(1)\nind = isfinite(areas);\nplot(areas(ind), delays(ind));\nxlabel('Area');\nylabel('Tdom');\ntitle('Area-delay tradeoff curve');\nhold on\nfor k = 1 : xnpts,\n    text( xareas(k), xdelays(k), sprintf( '(%d)', k ) );\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/wire_sizing.m",
    "content": "% Optimal interconnect wire sizing\n% Section 5.1, L. Vandenberghe, S. Boyd, and A. El Gamal\n% \"Optimizing dominant time constant in RC circuits\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 11/25/05\n% Modified by Michael Grant - 3/8/06\n%\n% we consider the problem of sizing an interconnect wire that connects\n% a voltage source and conductance G to a capacitive load C. We divide the\n% wire into n segments of length li, and width xi, i = 1,...,n, which is\n% constrained as 0 <= xi <= Wmax. The total area of the interconnect wire\n% is therefore sum(li*xi). We use a pi-model of each wire segment, with\n% capacitors beta_i*xi and conductance alpha_i*xi.\n% To minimize the total area subject to the width bound and a bound Tmax on\n% dominant time constant, we solve the SDP\n%               minimize        sum_{i=1}^20 xi*li\n%                   s.t.        Tmax*G(x) - C(x) >= 0\n%                               0 <= xi <= Wmax\n\n%\n% Circuit parameters\n%\n\nn=21;          % number of nodes; n-1 is number of segments in the wire\nm=n-1;         % number of segments\nbeta = 0.5;    % segment has two capacitances beta*xi\nalpha = 1;     % conductance is alpha*xi per segment\nGo = 1;        % driver conductance\nCo = 10;       % load capacitance\nwmax = 1.0;    % upper bound on x\n\n%\n% Construct the capacitance and conductance matrices\n%   C(x) = C0 + x1 * C1 + x2 * C2 + ... + xn * Cn\n%   G(x) = G0 + x1 * G1 + x2 * G2 + ... + xn * Gn\n% We assemble the coefficient matrices together as follows:\n%   CC = [ C0(:) C1(:) C2(:) ... Cn(:) ]\n%   GG = [ G0(:) G1(:) G2(:) ... Gn(:) ]\n%\n\nCC = zeros(n,n,m+1);\nGG = zeros(n,n,m+1);\n% constant terms\nCC(n,n,1) = Co;\nGG(1,1,1) = Go;\n% segment values\nfor i = 1 : n - 1,\n    CC(i,  i,  i+1) = beta;\n    CC(i+1,i+1,i+1) = beta;\n    GG(i,  i,  i+1) = +alpha;\n    GG(i+1,i,  i+1) = -alpha;\n    GG(i,  i+1,i+1) = -alpha;\n    GG(i+1,i+1,i+1) = +alpha;\nend\n% Reshape for easy Matlab use\nCC = reshape(CC,n*n,m+1);\nGG = reshape(GG,n*n,m+1);\n\n%\n% Compute points the tradeoff curve, and the four sample points\n%\n\nnpts    = 50;\ndelays  = linspace(400,2000,npts);\nxdelays = [ 370, 400, 600, 1800 ];\nxnpts   = length(xdelays);\nareas   = zeros(1,npts);\nxareas  = zeros(1,xnpts);\nsizes   = zeros(m,xnpts);\nfor i = 1 : npts + xnpts,\n\n    if i > npts,\n        xi = i - npts;\n        delay = xdelays(xi);\n        disp( sprintf( 'Particular solution %d of %d (Tmax = %g)', xi, xnpts, delay ) );\n    else,\n        delay = delays(i);\n        disp( sprintf( 'Point %d of %d on the tradeoff curve (Tmax = %g)', i, npts, delay ) );\n    end\n\n    %\n    % Construct and solve the convex model\n    %\n\n    cvx_begin sdp quiet\n        variable x(m)\n        variable G(n,n) symmetric\n        variable C(n,n) symmetric\n        minimize( sum(x) )\n        G == reshape( GG * [ 1 ; x ], n, n );\n        C == reshape( CC * [ 1 ; x ], n, n );\n        delay * G - C >= 0;\n        0 <= x <= wmax;\n    cvx_end\n\n    if i <= npts,\n        areas(i) = cvx_optval;\n    else,\n        xareas(xi) = cvx_optval;\n        sizes(:,xi) = x;\n\n        %\n        % Plot the step response\n        %\n\n        figure(xi+2);\n        A = -inv(C)*G;\n        B = -A*ones(n,1);\n        T = linspace(0,2000,1000);\n        Y = simple_step(A,B,T(2),length(T));\n        hold off; plot(T,Y,'-');  hold on;\n        xlabel('time');\n        ylabel('v');\n\n        % compute threshold delay, elmore delay, dominant time constant\n        tthres=T(min(find(Y(n,:)>0.5)));\n        GinvC=full(G\\C);\n        tdom=max(eig(GinvC));\n        telm=max(sum(GinvC'));\n        plot(tdom*[1;1], [0;1], '--', telm*[1;1], [0;1],'--', ...\n             tthres*[1;1], [0;1], '--');\n        text(tdom,0,'d');\n        text(telm,0,'e');\n        text(tthres,0,'t');\n        title(sprintf('Step responses at the 21 nodes for solution (%d), Tmax=%g', xi, delay ));\n\n    end\n\nend\n\n%\n% Plot the tradeoff curve\n%\n\nfigure(1)\nind = isfinite(areas);\nplot(areas(ind), delays(ind));\nxlabel('Area');\nylabel('Tdom');\ntitle('Area-delay tradeoff curve');\nhold on\nfor k = 1 : xnpts,\n    text( xareas(k), xdelays(k), sprintf( '(%d)', k ) );\nend\n\n\n%\n% Draw wires for the four solutions\n%\n\nfigure(2)\nm2 = 2 * m;\nx1 = reshape( [ 1 : m ; 1 : m ], 1, m2 );\nx2 = x1( 1, end : -1 : 1 );\ny  = [ - 0.5 * sizes(x1,:) ; + 0.5 * sizes(x2,:) ; - 0.5 * sizes(1,:)  ];\nx1 = reshape( [ 0 : m - 1 ; 1 : m ], m2, 1 );\nx2 = x1( end : -1 : 1, 1 );\nx  = [ x1 ; x2 ; 0 ];\nh = fill( x, y, ones(4*m+1,1)*[0.9,0.8,0.7,0.6] );\nhold on\nh2 = plot( x, y, '-' );\naxis([ -0.1, m + 0.1, min(y(:))-0.25, max(y(:))+0.1 ]);\ncolormap(gray);\ncaxis([-1,1]);\ntitle('Solutions at points on the tradeoff curve');\nlegends = {};\nfor k = 1 : xnpts,\n    set( h(k), 'EdgeColor', get( h2(k), 'Color' ) );\n    legends{k} = sprintf( 'Tmax=%g', xdelays(k) );\nend\nlegend(legends{:},4);\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/wire_sizing_spacing.m",
    "content": "% Combined wire sizing and spacing\n% Section 5.5,  L. Vandenberghe, S. Boyd, and A. El Gamal\n% \"Optimizing dominant time constant in RC circuits\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 11/27/05\n% Modified by Michael Grant - 3/8/06\n%\n% The problem is to determine the optimal sizes of interconnect wires and\n% the optimal distances between them. We will consider an example with 3\n% wires, each consisting of 5 segments (see paper, fig.21). The variables\n% are the widths wij , and the distances s1 and s2 between the wires.\n% The difference with the models used in other scripts is that we include a\n% parasitic capacitance between the wires.\n% The objective is to minimize the total width s1+s2.\n% The problem can be formulated with the following SDP:\n%               mimimize    s1 + s2\n%                    s.t.   Tmax*G(w11,..,w35)-C(w11,..,w35,t11,..,t23) >=0\n%                           1/t1j <= s1 - w1j - 0.5*w2j     , j = 1,..,5\n%                           1/t2j <= s2 - w3j - 0.5*w2j     , j = 1,..,5\n%                           0 <= tij <= 1         , i = 1,2 , j = 1,..,5\n%                           t1 >=0, t2 >= 0, s1 >=smin, s2>=smin\n%                           0 <= wij <= wmax\n% the 2nd and 3rd constraints are nonlinear convex constraints that can be\n% cast as 3 x 3-LMIs (Please refer to the paper for more details).\n\n%\n% Circuit parameters\n%\n\nn = 6;           % number of nodes per wire\nN = 3*n;         % total number of nodes\nm = n-1;         % number of segments per wire\nalpha = 1;       % conductance per segment is is alpha*size\nbeta = 0.5;      % capacitance per segment is twice beta*size\ngamma = 2;       % coupling capacitance is twice gamma*distance\nG0 = 100;        % source conductance\nC0 = [10,20,30]; % loads of first, second, third wires\nwmin = 0.1;      % minimum width\nwmax = 2.0;      % maximum width\nsmin = 1.0;      % minimum distance between wires\nsmax = 50;       % upper bound on s1 and s2  (meant to be inactive)\n\n%\n% Construct the capacitance and conductance matrices\n%   C(x) = C0 + w11 * C1 + w21 * C2 + ...\n%   G(x) = G0 + w11 * G1 + w21 * G2 + ...\n% and we assemble the coefficient matrices together as follows:\n%   CC = [ C0(:) C1(:) C2(:) ... ]\n%   GG = [ G0(:) G1(:) G2(:) ... ]\n%\n\nCC = zeros(N,N,5*m+1);\nGG = zeros(N,N,3*m+1);\nfor w = 0 : 2,\n    % Constant terms\n    CC(w*n+n,w*n+n,1) = C0(w+1);\n    GG(w*n+1,w*n+1,1) = G0;\n    for i = 1 : m,\n        % capacitances to ground\n        CC(w*n+[i,i+1],w*n+[i,i+1],w*m+i+1) = beta*[1,0;0,1];\n        if w < 2,\n            % coupling capacitors\n            CC(w*n+[i,  n+i  ],w*n+[i,  n+i  ],(w+3)*m+i+1) = gamma*[1,-1;-1,1];\n            CC(w*n+[i+1,n+i+1],w*n+[i+1,n+i+1],(w+3)*m+i+1) = gamma*[1,-1;-1,1];\n        end\n        % segment conductances\n        GG(w*n+[i,i+1],w*n+[i,i+1],w*m+i+1) = alpha*[1,-1;-1,1];\n    end\nend\n% Reshape for Matlab use\nCC = reshape(CC,N*N,5*m+1);\nGG = reshape(GG,N*N,3*m+1);\n\n%\n% Compute points the tradeoff curve and the two desired points\n%\n\nnpts    = 50;\ndelays  = linspace( 85, 200, npts );\nxdelays = [ 130, 90 ];\nxnpts   = length(xdelays);\nareas   = zeros(1,npts);\nxareas  = zeros(1,xnpts);\nfor j = 1 : npts + xnpts,\n\n    if j > npts,\n        xj = j - npts;\n        delay = xdelays(xj);\n        disp( sprintf( 'Particular solution %d of %d (Tmax = %g)', xj, xnpts, delay ) );\n    else,\n        delay = delays(j);\n        disp( sprintf( 'Point %d of %d on the tradeoff curve (Tmax = %g)', j, npts, delay ) );\n    end\n\n    %\n    % Construct and solve the convex model\n    %\n\n    cvx_begin sdp quiet\n        variables w(m,3) t(m,2) s(1,2)\n        variable G(N,N) symmetric\n        variable C(N,N) symmetric\n        minimize( sum(s) )\n        subject to\n            G == reshape( GG * [ 1 ; w(:) ], N, N );\n            C == reshape( CC * [ 1 ; w(:) ; t(:) ], N, N );\n            delay * G - C >= 0;\n            wmin <= w(:) <= wmax;\n            t( : ) <= 1 / smin;\n            s( : ) <= smax;\n            inv_pos( t(:,1) ) <= s(1) - w(:,1) - 0.5 * w(:,2);\n            inv_pos( t(:,2) ) <= s(2) - w(:,3) - 0.5 * w(:,2);\n    cvx_end\n    ss = cvx_optval;\n\n    if j <= npts,\n        areas(j) = ss;\n    else,\n        xareas(xj) = ss;\n\n        %\n        % Draw the wires\n        %\n\n        figure(4*xj-2);\n        m2 = 2 * m;\n        x1 = reshape( [ 1 : m ; 1 : m ], 1, m2 );\n        x2 = x1( 1, end : -1 : 1 );\n        y  = [ ss*ones(m2,1), s(2) + 0.5*w(x1,2), zeros(m2,1) ; ...\n               ss-w(x2,1),    s(2) - 0.5*w(x2,2), w(x2,3)     ; ...\n               ss,            s(2) + 0.5*w(1,2),  0           ];\n        x1 = reshape( [ 0 : m - 1 ; 1 : m ], m2, 1 );\n        x2 = x1( end : -1 : 1, 1 );\n        x  = [ x1 ; x2 ; 0 ];\n        hold off;\n        fill( x, y, 0.9 * ones(size(y)) );\n        hold on\n        plot( x, y, '-' );\n        axis( [-0.1, m+0.1,-0.1, ss+0.1]);\n        colormap(gray);\n        caxis([-1,1])\n        title(sprintf('Solution (%d), Tmax = %g',xj,delay));\n\n        %\n        % Build the state space models and plot step responses\n        %\n\n        A = -inv(C)*G;\n        T = linspace(0,2*delay,1000);\n        B = -A * kron( eye(3), ones(n,1) );\n        for inp = 1 : 3,\n            figure(4*xj-2+inp);\n            Y1 = simple_step(A,B(:,inp),T(2),length(T));\n            hold off;\n            plot(T,Y1([n,2*n,3*n],:),'-');\n            hold on;\n            text(T(1000),Y1(  n,1000),'v1');\n            text(T(1000),Y1(2*n,1000),'v2');\n            text(T(1000),Y1(3*n,1000),'v3');\n            axis([0 2*delay -0.1 1.1]);\n            % show dominant time constant\n            plot(delay*[1;1], [-0.1;1.1], '--');\n            title(sprintf('Solution (%d), Tmax = %g, step applied to wire %d',xj,delay,inp));\n        end\n\n    end\n\nend\n\n%\n% Plot the tradeoff curve\n%\n\nfigure(1);\nind = isfinite(areas);\nplot(areas(ind), delays(ind));\nxlabel('total width s_1 + s_2');\nylabel('dominant time constant');\ntitle('Width-delay tradeoff curve')\nhold on;\nfor k = 1 : xnpts,\n    text( xareas(k), xdelays(k), sprintf( '(%d)', k ) );\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/circuit_design/wire_sizing_topology.m",
    "content": "% Wire sizing and topology design\n% Section 5.3,  L. Vandenberghe, S. Boyd, and A. El Gamal\n% \"Optimizing dominant time constant in RC circuits\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 11/25/05\n% Modified by Michael Grant - 3/8/06\n%\n% We size the wires for an interconnect circuit with four nodes. The\n% topology of the circuit is more complex; the wires don't even form a tree\n% (refer to Figure 13 in the paper).\n% The problem can be formulated with the following SDP:\n%               minimize        sum(xi*li)\n%                   s.t.        0 <= xi <= wmax\n%                               Tmax*G(x) - C(x) >= 0\n% Please refer to the paper (section 2) to find what G(x) and C(x) are.\n\n%\n% Circuit parameters\n%\n\nn      = 4;    % number of nodes\nm      = 6;    % number of branches\nG      = 0.1;  % resistor between node 1 and 0\nCo     = 10;   % load capacitance\nwmax   = 10.0; % maximum width\n% alpha: conductance per segment\n% 2 * beta: capacitance per segment\nalpha  = [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ];\nbeta   = [ 10,  10,  100, 1,   1,   1   ];\n\n%\n% Build capacitance and conductance matrices\n%\n\nCC = zeros(n,n,m+1);\nGG = zeros(n,n,m+1);\n% constant terms\nCC(3,3,1) = Co;\nGG(1,1,1) = G;\n% branch 1\nCC(1,1,2) = + beta(1);\nCC(2,2,2) = + beta(1);\nGG(1,1,2) = + alpha(1);\nGG(2,1,2) = - alpha(1);\nGG(1,2,2) = - alpha(1);\nGG(2,2,2) = + alpha(1);\n% branch 2\nCC(2,2,3) = + beta(2);\nCC(3,3,3) = + beta(2);\nGG(2,2,3) = + alpha(2);\nGG(3,2,3) = - alpha(2);\nGG(2,3,3) = - alpha(2);\nGG(3,3,3) = + alpha(2);\n% branch 3\nCC(1,1,4) = + beta(3);\nCC(3,3,4) = + beta(3);\nGG(1,1,4) = + alpha(3);\nGG(3,1,4) = - alpha(3);\nGG(1,3,4) = - alpha(3);\nGG(3,3,4) = + alpha(3);\n% branch 4\nCC(1,1,5) = + beta(4);\nCC(4,4,5) = + beta(4);\nGG(1,1,5) = + alpha(4);\nGG(4,1,5) = - alpha(4);\nGG(1,4,5) = - alpha(4);\nGG(4,4,5) = + alpha(4);\n% branch 5\nCC(2,2,6) = + beta(5);\nCC(4,4,6) = + beta(5);\nGG(2,2,6) = + alpha(5);\nGG(2,4,6) = - alpha(5);\nGG(4,2,6) = - alpha(5);\nGG(4,4,6) = + alpha(5);\n% branch 6\nCC(3,3,7) = + beta(6);\nCC(4,4,7) = + beta(6);\nGG(3,3,7) = + alpha(6);\nGG(4,3,7) = - alpha(6);\nGG(3,4,7) = - alpha(6);\nGG(4,4,7) = + alpha(6);\n\n% Reshape for easy Matlab use\nCC = reshape(CC,n*n,m+1);\nGG = reshape(GG,n*n,m+1);\n\n%\n% Compute points the tradeoff curve, and the three sample points\n%\n\nnpts    = 50;\ndelays  = linspace( 180, 800, npts );\nxdelays = [ 200, 400, 600 ];\nxnpts   = length(xdelays);\nareas   = zeros(1,npts);\nsizes   = zeros(6,xnpts);\nfor i = 1 : npts  + xnpts,\n\n    if i > npts,\n        xi = i - npts;\n        delay = xdelays(xi);\n        disp( sprintf( 'Particular solution %d of %d (Tmax = %g)', xi, xnpts, delay ) );\n    else,\n        delay = delays(i);\n        disp( sprintf( 'Point %d of %d on the tradeoff curve (Tmax = %g)', i, npts, delay ) );\n    end\n\n    %\n    % Construct and solve the convex model\n    %\n\n    cvx_begin sdp quiet\n        variable x(6)\n        variable G(n,n) symmetric\n        variable C(n,n) symmetric\n        minimize( sum( x ) )\n        subject to\n            G == reshape( GG * [ 1 ; x ], n, n );\n            C == reshape( CC * [ 1 ; x ], n, n );\n            delay * G - C >= 0;\n            0 <= x <= wmax;\n    cvx_end\n\n    if i <= npts,\n        areas(i) = cvx_optval;\n    else,\n        xareas(xi) = cvx_optval;\n        sizes(:,xi) = x;\n\n        %\n        % Plot the step response\n        %\n\n        figure(xi+1);\n        A = -inv(C)*G;\n        B = -A*ones(n,1);\n        T = linspace(0,1000,1000);\n        Y = simple_step(A,B,T(2),length(T));\n        hold off; plot(T,Y([1,3,4],:),'-');  hold on;\n\n        % compute threshold delay, elmore delay, dominant time constant\n        tthres=T(min(find(Y(3,:)>0.5)));\n        tdom=max(eig(inv(G)*C));\n        telm=max(sum((inv(G)*C)'));\n        plot(tdom*[1;1], [0;1], '--', telm*[1;1], [0;1],'--', ...\n             tthres*[1;1], [0;1], '--');\n        text(tdom,0,'d');\n        text(telm,0,'e');\n        text(tthres,0,'t');\n        title(sprintf('Step response for solution (%d), Tmax=%g', xi, delay ));\n\n    end\n\nend\n\n%\n% Plot the tradeoff curve\n%\n\nfigure(1)\nind = isfinite(areas);\nplot(areas(ind), delays(ind));\nxlabel('Area');\nylabel('Tdom');\ntitle('Area-delay tradeoff curve');\nhold on\nfor k = 1 : xnpts,\n    text( xareas(k), xdelays(k), sprintf( '(%d)', k ) );\nend\n\n%\n% Display sizes for the three solutions\n%\n\ndisp(['Three specific solutions:']);\nsizes\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/closest_toeplitz_psd.m",
    "content": "% Closest Toeplitz SDP search.\n%\n% This script finds a Toeplitz Hermitian PSD matrix that is closest to a\n% given Hermitian matrix, as measured by the Frobenius norm. That is, for\n% a given matrix P, it solves:\n%    minimize   || Z - P ||_F\n%    subject to Z >= 0\n%\n% Adapted from an example provided in the SeDuMi documentation. Notice\n% the use of SDP mode to simplify the semidefinite constraint.\n\n% The data. P is Hermitian, but is neither Toeplitz nor PSD.\nP = [ 4,     1+2*j,     3-j       ; ...\n      1-2*j, 3.5,       0.8+2.3*j ; ...\n      3+j,   0.8-2.3*j, 4         ];\n  \n% Construct and solve the model\nn = size( P, 1 );\ncvx_begin sdp\n    variable Z(n,n) hermitian toeplitz\n    dual variable Q\n    minimize( norm( Z - P, 'fro' ) )\n    Z >= 0 : Q;\ncvx_end\n\n% Display resuls\ndisp( 'The original matrix, P: ' );\ndisp( P )\ndisp( 'The optimal point, Z:' );\ndisp( Z )\ndisp( 'The optimal dual variable, Q:' );\ndisp( Q )\ndisp( 'min( eig( Z ) ), min( eig( Q ) ) (both should be nonnegative, or close):' );\ndisp( sprintf( '   %g   %g\\n', min( eig( Z ) ), min( eig( Q ) ) ) );\ndisp( 'The optimal value, || Z - P ||_F:' );\ndisp( norm( Z - P, 'fro' ) );\ndisp( 'Complementary slackness: Z * Q, should be near zero:' );\ndisp( Z * Q )\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/Contents.m",
    "content": "% Chapter 4: Convex optimization problems\n%\n%  chebyshev_center_2D.m       - Section 4.3.1: Compute and display the Chebyshev center of a 2D polyhedron\n%  chebyshev_center.m          - Section 4.3.1: Compute the Chebyshev center of a polyhedron\n%  cantilever_beam_rec.m       - Section 4.5.4: Design of a cantilever beam: recursive formulation (GP)\n%  frob_norm_diag_scaling.m    - Section 4.5.4: Frobenius norm diagonal scaling (GP)\n%  min_spec_rad_ppl_dynamics.m - Section 4.5.4: Minimum spectral radius via Peron-Frobenius theory (GP)\n%  fastest_mixing_MC.m         - Section 4.6.3: Find the fastest mixing Markov chain on a graph\n%  ex_4_27.m                   - Exercise 4.27: Matrix fractional minimization using second-order cone programming\n%  cantilever_beam.m           - Exercise 4.31: Design of a cantilever beam (GP)\n%  ex_4_38.m                   - Exercise 4.38(b): Linear matrix inequalities with one variable\n%  ex_4_3.m                    - Exercise 4.3: Solve a simple QP with inequality constraints\n%  max_det_psd_completion.m    - Exercise 4.47: Maximum determinant PSD matrix completion\n%  channel_capacity.m          - Exercise 4.57: Capacity of a communication channel\n%  ex_4_5.m                    - Exercise 4.5: Show the equivalence of 3 convex problem formations\n%  logopt_investment.m         - Exercise 4.60: Log-optimal investment strategy\n%  cantilever_beam_plot.m      - Plots a cantilever beam as a 3D figure.\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/cantilever_beam.m",
    "content": "% Exercise 4.31: Design of a cantilever beam (GP)\r\n% Boyd & Vandenberghe \"Convex Optimization\"\r\n% Almir Mutapcic - 01/30/06\r\n% Updated to use GP mode 02/08/06\r\n% (a figure is generated)\r\n%\r\n% We have a segmented cantilever beam with N segments. Each segment\r\n% has a unit length and variable width and height (rectangular profile).\r\n% The goal is minimize the total volume of the beam, over all segment\r\n% widths w_i and heights h_i, subject to constraints on aspect ratios,\r\n% maximum allowable stress in the material, vertical deflection y, etc.\r\n%\r\n% The problem can be posed as a geometric program (posynomial form)\r\n%     minimize    sum( w_i* h_i)\r\n%         s.t.    w_min <= w_i <= w_max,       for all i = 1,...,N\r\n%                 h_min <= h_i <= h_max\r\n%                 S_min <= h_i/w_i <= S_max\r\n%                 6*i*F/(w_i*h_i^2) <= sigma_max\r\n%                 6*F/(E*w_i*h_i^3) == d_i\r\n%                 (2*i - 1)*d_i + v_(i+1) <= v_i\r\n%                 (i - 1/3)*d_i + v_(i+1) + y_(i+1) <= y_i\r\n%                 y_1 <= y_max\r\n%\r\n% with variables w_i, h_i, d_i, (i = 1,...,N) and v_i, y_i (i = 1,...,N+1).\r\n% (Consult the book for other definitions and a recursive formulation of\r\n% this problem.)\r\n\r\n% optimization variables\r\nN = 8;\r\n\r\n% constants\r\nwmin = .1; wmax = 100;\r\nhmin = .1; hmax = 6;\r\nSmin = 1/5; Smax = 5;\r\nsigma_max = 1;\r\nymax = 10;\r\nE = 1; F = 1;\r\n\r\ncvx_begin gp\r\n  % optimization variables\r\n  variables w(N) h(N) v(N+1) y(N+1);\r\n\r\n  % objective is the total volume of the beam\r\n  % obj = sum of (widths*heights*lengths) over each section\r\n  % (recall that the length of each segment is set to be 1)\r\n  minimize( w'*h )\r\n  subject to\r\n    % non-recursive formulation\r\n    d = 6*F*ones(N,1)./(E*ones(N,1).*w.*h.^3);\r\n    for i = 1:N\r\n      (2*i-1)*d(i) + v(i+1) <= v(i);\r\n      (i-1/3)*d(i) + v(i+1) + y(i+1) <= y(i);\r\n    end\r\n\r\n    % constraint set\r\n    wmin <= w    <= wmax;\r\n    hmin <= h    <= hmax;\r\n    Smin <= h./w <= Smax;\r\n    6*F*[1:N]'./(w.*(h.^2)) <= sigma_max;\r\n    y(1) <= ymax;\r\ncvx_end\r\n\r\n% display results\r\ndisp('The optimal widths and heights are: ');\r\nw, h\r\nfprintf(1,'The optimal minimum volume of the beam is %3.4f.\\n', sum(w.*h))\r\n\r\n% plot the 3D model of the optimal cantilever beam\r\nfigure, clf\r\ncantilever_beam_plot([h; w])\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/cantilever_beam_plot.m",
    "content": "% Plots a cantilever beam as a 3D figure.\n% This is a helper function for the optimal cantilever beam example.\n%\n% Inputs:\n%    values: an array of heights and widths of each segment\n%            [h1 h2 ... hN w1 w2 ... wN]\n%\n% Almir Mutapcic 01/25/06\n\nfunction cantilever_beam_plot(values)\n\nN = length(values)/2;\nfor k = 0:N-1\n  [X Y Z] = data_rect3(values(2*N-k),values(N-k),k);\n  plot3(X,Y,Z); hold on;\nend\nhold off;\n\nxlabel('width')\nylabel('height')\nzlabel('length')\nreturn;\n\n%****************************************************************\nfunction [X, Y, Z] = data_rect3(w,h,d)\n%****************************************************************\n% back face\nX = [-w/2 w/2 w/2 -w/2 -w/2];\nY = [-h/2 -h/2 h/2 h/2 -h/2];\nZ = [d d d d d];\n% side face\nX = [X -w/2 -w/2 -w/2 -w/2 -w/2];\nY = [Y -h/2 -h/2 h/2 h/2 -h/2];\nZ = [Z d d+1 d+1 d d];\n% front face\nX = [X -w/2 w/2 w/2 -w/2 -w/2];\nY = [Y -h/2 -h/2 h/2 h/2 -h/2];\nZ = [Z d+1 d+1 d+1 d+1 d+1];\n% back side face\nX = [X w/2 w/2 w/2 w/2 w/2];\nY = [Y -h/2 h/2 h/2 -h/2 -h/2];\nZ = [Z d+1 d+1 d d d+1];\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/cantilever_beam_rec.m",
    "content": "% Section 4.5.4: Design of a cantilever beam: recursive formulation (GP)\n% Boyd & Vandenberghe \"Convex Optimization\"\n% (a figure is generated)\n% Almir Mutapcic 02/08/06\n%\n% We have a segmented cantilever beam with N segments. Each segment\n% has a unit length and variable width and height (rectangular profile).\n% The goal is minimize the total volume of the beam, over all segment\n% widths w_i and heights h_i, subject to constraints on aspect ratios,\n% maximum allowable stress in the material, vertical deflection y, etc.\n%\n% The problem can be posed as a geometric program (posynomial form)\n%     minimize   sum( w_i* h_i)\n%         s.t.   w_min <= w_i <= w_max,       for all i = 1,...,N\n%                h_min <= h_i <= h_max\n%                S_min <= h_i/w_i <= S_max\n%                6*i*F/(w_i*h_i^2) <= sigma_max\n%                y_1 <= y_max\n%\n% with variables w_i and h_i (i = 1,...,N).\n% For other definitions consult the book.\n% (See exercise 4.31 for a non-recursive formulation.)\n\n% optimization variables\nN = 8;\n\n% constants\nwmin = .1; wmax = 100;\nhmin = .1; hmax = 6;\nSmin = 1/5; Smax = 5;\nsigma_max = 1;\nymax = 10;\nE = 1; F = 1;\n\ncvx_begin gp\n  % optimization variables\n  variables w(N) h(N)\n\n  % setting up variables relations\n  % (recursive formulation)\n  v = cvx( zeros(N+1,1) );\n  y = cvx( zeros(N+1,1) );\n  for i = N:-1:1\n    fprintf(1,'Building recursive relations for index: %d\\n',i);\n    v(i) = 12*(i-1/2)*F/(E*w(i)*h(i)^3) + v(i+1);\n    y(i) = 6*(i-1/3)*F/(E*w(i)*h(i)^3)  + v(i+1) + y(i+1);\n  end\n\n  % objective is the total volume of the beam\n  % obj = sum of (widths*heights*lengths) over each section\n  % (recall that the length of each segment is set to be 1)\n  minimize( w'*h )\n  subject to\n    % constraint set\n    wmin <= w    <= wmax;\n    hmin <= h    <= hmax;\n    Smin <= h./w <= Smax;\n    6*F*[1:N]'./(w.*(h.^2)) <= sigma_max;\n    y(1) <= ymax;\ncvx_end\n\n% display results\ndisp('The optimal widths and heights are: ');\nw, h\nfprintf(1,'The optimal minimum volume of the beam is %3.4f.\\n', sum(w.*h))\n\n% plot the 3D model of the optimal cantilever beam\nfigure, clf\ncantilever_beam_plot([h; w])\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/channel_capacity.m",
    "content": "% Exercise 4.57: Capacity of a communication channel \n% Boyd & Vandenberghe \"Convex Optimization\" \n% Joëlle Skaf - 04/24/08 \n%\n% We consider a discrete memoryless communication channel, with input \n% X(t) \\in {1,...,n}, and output Y(t) \\in {1,...,m}, for t = 1,2,...  \n% The relation between the input and output is given statistically: \n%           p_ij = Prob(Y(t)=i|X(t)=j), i=1,...,m,  j=1,...,n\n% The matrix P is called the channel transition matrix.\n% The channel capacity C is given by \n%           C = sup{ I(X;Y) | x >= 0, sum(x) = 1}, \n% I(X;Y) is the mutual information between X and Y, and it can be shown \n% that:     I(X;Y) = c'*x - sum_{i=1}^m y_i*log_2(y_i)\n% where     c_j = sum_{i=1}^m p_ij*log_2(p_ij), j=1,...,m\n\n% Input data \nrand('state', 0); \nn = 15;\nm = 10; \nP = rand(m,n); \nP = P./repmat(sum(P),m,1); \nc = sum(P.*log2(P))';\n\n% Channel capacity \ncvx_begin\n    variable x(n) \n    y = P*x; \n    maximize (c'*x + sum(entr(y))/log(2))\n    x >= 0;\n    sum(x) == 1; \ncvx_end\nC = cvx_optval; \n\n% Results\ndisplay(['The channel capacity is: ' num2str(C) ' bits.'])\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/chebyshev_center.m",
    "content": "% Section 4.3.1: Compute the Chebyshev center of a polyhedron\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Jolle Skaf - 08/16/05\n%\n% The goal is to find the largest Euclidean ball (i.e. its center and\n% radius) that lies in a polyhedron described by linear inequalites in this\n% fashion: P = {x : a_i'*x <= b_i, i=1,...,m}\n\n% Generate the data\nrandn('state',0);\nn = 10; m = 2*n;\nA = randn(m,n);\nb = A*rand(n,1) + 2*rand(m,1);\nnorm_ai = sum(A.^2,2).^(.5);\n\n% Build and execute model\nfprintf(1,'Computing Chebyshev center...');\ncvx_begin\n    variable r(1)\n    variable x_c(n)\n    dual variable y\n    maximize ( r )\n    y: A*x_c + r*norm_ai <= b;\ncvx_end\nfprintf(1,'Done! \\n');\n\n% Display results\nfprintf(1,'The Chebyshev center coordinates are: \\n');\ndisp(x_c);\nfprintf(1,'The radius of the largest Euclidean ball is: \\n');\ndisp(r);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/chebyshev_center_2D.m",
    "content": "% Section 4.3.1: Compute and display the Chebyshev center of a 2D polyhedron\n% Boyd & Vandenberghe, \"Convex Optimization\"\n% Jolle Skaf - 08/16/05\n% (a figure is generated)\n%\n% The goal is to find the largest Euclidean ball (i.e. its center and\n% radius) that lies in a polyhedron described by linear inequalites in this\n% fashion: P = {x : a_i'*x <= b_i, i=1,...,m} where x is in R^2\n\n% Generate the input data\na1 = [ 2;  1];\na2 = [ 2; -1];\na3 = [-1;  2];\na4 = [-1; -2];\nb = ones(4,1);\n\n% Create and solve the model\ncvx_begin\n    variable r(1)\n    variable x_c(2)\n    maximize ( r )\n    a1'*x_c + r*norm(a1,2) <= b(1);\n    a2'*x_c + r*norm(a2,2) <= b(2);\n    a3'*x_c + r*norm(a3,2) <= b(3);\n    a4'*x_c + r*norm(a4,2) <= b(4);\ncvx_end\n\n% Generate the figure\nx = linspace(-2,2);\ntheta = 0:pi/100:2*pi;\nplot( x, -x*a1(1)./a1(2) + b(1)./a1(2),'b-');\nhold on\nplot( x, -x*a2(1)./a2(2) + b(2)./a2(2),'b-');\nplot( x, -x*a3(1)./a3(2) + b(3)./a3(2),'b-');\nplot( x, -x*a4(1)./a4(2) + b(4)./a4(2),'b-');\nplot( x_c(1) + r*cos(theta), x_c(2) + r*sin(theta), 'r');\nplot(x_c(1),x_c(2),'k+')\nxlabel('x_1')\nylabel('x_2')\ntitle('Largest Euclidean ball lying in a 2D polyhedron');\naxis([-1 1 -1 1])\naxis equal\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/ex_4_27.m",
    "content": "% Exercise 4.27: Matrix fractional minimization using second-order cone programming\n% From Boyd & Vandenberghe, \"Convex Optimization\"\n% Jolle Skaf - 09/26/05\n%\n% Shows the equivalence of the following formulations:\n% 1)        minimize    (Ax + b)'*inv(I + B*diag(x)*B')*(Ax + b)\n%               s.t.    x >= 0\n% 2)        minimize    (Ax + b)'*inv(I + B*Y*B')*(Ax + b)\n%               s.t.    x >= 0\n%                       Y = diag(x)\n% 3)        minimize    v'*v + w'*inv(diag(x))*w\n%               s.t.    v + Bw = Ax + b\n%                       x >= 0\n% 4)        minimize    v'*v + w'*inv(Y)*w\n%               s.t.    Y = diag(x)\n%                       v + Bw = Ax + b\n%                       x >= 0\n\n% Generate input data\nrandn('state',0);\nm = 16; n = 8;\nA = randn(m,n);\nb = randn(m,1);\nB = randn(m,n);\n\n% Problem 1: original formulation\ndisp('Computing optimal solution for 1st formulation...');\ncvx_begin\n    variable x1(n)\n    minimize( matrix_frac(A*x1 + b , eye(m) + B*diag(x1)*B') )\n    x1 >= 0;\ncvx_end\nopt1 = cvx_optval;\n\n% Problem 2: original formulation (modified)\ndisp('Computing optimal solution for 2nd formulation...');\ncvx_begin\n    variable x2(n)\n    variable Y(n,n) diagonal\n    minimize( matrix_frac(A*x2 + b , eye(m) + B*Y*B') )\n    x2 >= 0;\n    Y == diag(x2);\ncvx_end\nopt2 = cvx_optval;\n\n% Problem 3: equivalent formulation (as given in the book)\ndisp('Computing optimal solution for 3rd formulation...');\ncvx_begin\n    variables x3(n) w(n) v(m)\n    minimize( square_pos(norm(v)) + matrix_frac(w, diag(x3)) )\n    v + B*w == A*x3 + b;\n    x3 >= 0;\ncvx_end\nopt3 = cvx_optval;\n\n% Problem 4: equivalent formulation (modified)\ndisp('Computing optimal solution for 4th formulation...');\ncvx_begin\n    variables x4(n) w(n) v(m)\n    variable Y(n,n) diagonal\n    minimize( square_pos(norm(v)) + matrix_frac(w, Y) )\n    v + B*w == A*x4 + b;\n    x4 >= 0;\n    Y == diag(x4);\ncvx_end\nopt4 = cvx_optval;\n\n% Display the results\ndisp('------------------------------------------------------------------------');\ndisp('The optimal value for each of the 4 formulations is: ');\n[opt1 opt2 opt3 opt4]\ndisp('They should be equal!')\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/ex_4_3.m",
    "content": "% Exercise 4.3: Solve a simple QP with inequality constraints\n% From Boyd & Vandenberghe, \"Convex Optimization\"\n% Jolle Skaf - 09/26/05\n%\n% Solves the following QP with inequality constraints:\n%           minimize    1/2x'*P*x + q'*x + r\n%               s.t.    -1 <= x_i <= 1      for i = 1,2,3\n% Also shows that the given x_star is indeed optimal\n\n% Generate data\nP = [13 12 -2; 12 17 6; -2 6 12];\nq = [-22; -14.5; 13];\nr = 1;\nn = 3;\nx_star = [1;1/2;-1];\n\n% Construct and solve the model\nfprintf(1,'Computing the optimal solution ...');\ncvx_begin\n    variable x(n)\n    minimize ( (1/2)*quad_form(x,P) + q'*x + r)\n    x >= -1;\n    x <=  1;\ncvx_end\nfprintf(1,'Done! \\n');\n\n% Display results\ndisp('------------------------------------------------------------------------');\ndisp('The computed optimal solution is: ');\ndisp(x);\ndisp('The given optimal solution is: ');\ndisp(x_star);\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/ex_4_38.m",
    "content": "% Exercise 4.38(b): Linear matrix inequalities with one variable\n% From Boyd & Vandenberghe, \"Convex Optimization\"\n% Jolle Skaf - 09/26/05\n%\n% Finds the optimal t that would maximize c*t while still having A - t*B\n% positive semidefinite by solving the following SDP:\n%           minimize    c*t\n%               s.t.    t*B <= A\n% c can either be a positive or negative real number\n\n% Generate input data\nrandn('state',0);\nn = 4;\nA = randn(n); A = 0.5*(A'+A); %A = A'*A;\nB = randn(n); B = B'*B;\n% can modify the value of c (>0 or <0)\nc = -1;\n\n% Create and solve the model\ncvx_begin sdp\n    variable t\n    minimize ( c*t )\n    A >= t * B;\ncvx_end\n\n% Display results\ndisp('------------------------------------------------------------------------');\ndisp('The optimal t obtained is');\ndisp(t);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/ex_4_5.m",
    "content": "% Exercise 4.5: Show the equivalence of 3 convex problem formations\n% From Boyd & Vandenberghe, \"Convex Optimization\"\n% Jolle Skaf - 08/17/05\n%\n% Shows the equivalence of the following 3 problems:\n% 1) Robust least-squares problem\n%           minimize    sum_{i=1}^{m} phi(a_i'*x - bi)\n%    where phi(u) = u^2             for |u| <= M\n%                   M(2|u| - M)     for |u| >  M\n% 2) Least-squares with variable weights\n%           minimize    sum_{i=1}^{m} (a_i'*x - bi)^2/(w_i+1) + M^2*1'*w\n%               s.t.    w >= 0\n% 3) Quadratic program\n%           minimize    sum_{i=1}^{m} (u_i^2 + 2*M*v_i)\n%               s.t.    -u - v <= Ax - b <= u + v\n%                       0 <= u <= M*1\n%                       v >= 0\n\n% Generate input data\nrandn('state',0);\nm = 16; n = 8;\nA = randn(m,n);\nb = randn(m,1);\nM = 2;\n\n% (a) robust least-squares problem\ndisp('Computing the solution of the robust least-squares problem...');\ncvx_begin\n    variable x1(n)\n    minimize( sum(huber(A*x1-b,M)) )\ncvx_end\n\n% (b)least-squares problem with variable weights\ndisp('Computing the solution of the least-squares problem with variable weights...');\ncvx_begin\n    variable x2(n)\n    variable w(m)\n    minimize( sum(quad_over_lin(diag(A*x2-b),w'+1)) + M^2*ones(1,m)*w)\n    w >= 0;\ncvx_end\n\n% (c) quadratic program\ndisp('Computing the solution of the quadratic program...');\ncvx_begin\n    variable x3(n)\n    variable u(m)\n    variable v(m)\n    minimize( sum(square(u) +  2*M*v) )\n    A*x3 - b <= u + v;\n    A*x3 - b >= -u - v;\n    u >= 0;\n    u <= M;\n    v >= 0;\ncvx_end\n\n% Display results\ndisp('------------------------------------------------------------------------');\ndisp('The optimal solutions for problem formulations 1, 2 and 3 are given');\ndisp('respectively as follows (per column): ');\n[x1 x2 x3]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/fastest_mixing_MC.m",
    "content": "% Section 4.6.3: Find the fastest mixing Markov chain on a graph\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Jolle Skaf - 09/26/05\n%\n% The 'fastest mixing Markov chain problem' is to find a transition\n% probability matrix P on a graph E that minimizes the mixing rate r, where\n% r = max{ lambda_2, -lambda_n } with lambda_1>=...>=lambda_n being the\n% eigenvalues of P.\n\n% Generate input data\nn = 5;\nE = [0 1 0 1 1; ...\n     1 0 1 0 1; ...\n     0 1 0 1 1; ...\n     1 0 1 0 1; ...\n     1 1 1 1 0];\n\n% Create and solve model\ncvx_begin\n    variable P(n,n) symmetric\n    minimize(norm(P - (1/n)*ones(n)))\n    P*ones(n,1) == ones(n,1);\n    P >= 0;\n    P(E==0) == 0;\ncvx_end\ne = flipud(eig(P));\nr = max(e(2), -e(n));\n\n% Display results\ndisp('------------------------------------------------------------------------');\ndisp('The transition probability matrix of the optimal Markov chain is: ');\ndisp(P);\ndisp('The optimal mixing rate is: ');\ndisp(r);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/frob_norm_diag_scaling.m",
    "content": "% Section 4.5.4: Frobenius norm diagonal scaling (GP)\r\n% Boyd & Vandenberghe \"Convex Optimization\"\r\n% Joelle Skaf - 01/29/06\r\n% Updated to use GP mode by Almir Mutapcic 02/08/06\r\n%\r\n% Given a square matrix M, the goal is to find a vector (with dii > 0)\r\n% such that ||DMD^{-1}||_F is minimized, where D = diag(d).\r\n% The problem can be cast as an unconstrained geometric program:\r\n%           minimize sqrt( sum_{i,j=1}^{n} Mij^2*di^2/dj^2 )\r\n%\r\n\r\nrs = randn( 'state' );\r\nrandn( 'state', 0 );\r\n\r\n% matrix size (M is an n-by-n matrix)\r\nn = 4;\r\nM = randn(n,n);\r\n\r\n% formulating the problem as a GP\r\ncvx_begin gp\r\n  variable d(n)\r\n  minimize( sqrt( sum( sum( diag(d.^2)*(M.^2)*diag(d.^-2) ) ) ) )\r\n  % Alternate formulation: norm( diag(d)*abs(M)*diag(1./d), 'fro' )\r\ncvx_end\r\n\r\n% displaying results\r\nD = diag(d);\r\ndisp('The matrix D that minimizes ||DMD^{-1}||_F is: ');\r\ndisp(D);\r\ndisp('The minimium Frobenius norm achieved is: ');\r\ndisp(norm(D*M*inv(D),'fro'));\r\ndisp('while the Frobunius norm of the original matrix M is: ');\r\ndisp(norm(M,'fro'));\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/logopt_investment.m",
    "content": "% Exercise 4.60: Log-optimal investment strategy\n% Boyd & Vandenberghe \"Convex Optimization\" \n% Joëlle Skaf - 04/24/08 \n% (a figure is generated) \n% \n% The investment strategy x that maximizes the long term growth rate \n%           R = sum_{j=1}^m pi_j*log(p_j^Tx) \n% is called the log-optimal investment strategy, and can be found by\n% solving the optimization problem \n%           maximize    sum_{j=1}^m pi_j log(p_j^Tx) \n%           subject to  x >= 0, sum(x) = 1,\n% where p_ij is the return of asset i over one period in scenario j and \n% pi_j is the probability of scenario j. There are n assets and m scenarios.\n% We consider the case of equiprobable scenarios. \n%\n% The log-optimal long term growth rate is found and compared to the one\n% obtained with a uniform allocation strategy, i.e., x_i=(1/n). \n% Sample trajectories ofthe accumulated wealth for the optimal strategy and \n% the uniform one are plotted. \n\n\n% Input data \nP = [3.5000    1.1100    1.1100    1.0400    1.0100;\n     0.5000    0.9700    0.9800    1.0500    1.0100;\n     0.5000    0.9900    0.9900    0.9900    1.0100;\n     0.5000    1.0500    1.0600    0.9900    1.0100;\n     0.5000    1.1600    0.9900    1.0700    1.0100;\n     0.5000    0.9900    0.9900    1.0600    1.0100;\n     0.5000    0.9200    1.0800    0.9900    1.0100;\n     0.5000    1.1300    1.1000    0.9900    1.0100;\n     0.5000    0.9300    0.9500    1.0400    1.0100;\n     3.5000    0.9900    0.9700    0.9800    1.0100];\n\n[m,n] = size(P);\nPi = ones(m,1)/m;\nx_unif = ones(n,1)/n; % uniform resource allocation\n\n% Find the log-optimal investment policy \ncvx_begin \n    variable x_opt(n)\n    maximize sum(Pi.*log(P*x_opt))\n    sum(x_opt) == 1\n    x_opt >= 0\ncvx_end\n\n% Long-term growth rates\nR_opt = sum(Pi.*log(P*x_opt));\nR_unif = sum(Pi.*log(P*x_unif));\ndisplay('The long term growth rate of the log-optimal strategy is: '); \ndisp(R_opt); \ndisplay('The long term growth rate of the uniform strategy is: ');\ndisp(R_unif); \n\n% Generate random event sequences\nrand('state',10);\nN = 10;  % number of random trajectories \nT = 200; % time horizon\nw_opt = []; w_unif = [];\nfor i = 1:N\n    events = ceil(rand(1,T)*m);\n    P_event = P(events,:);\n    w_opt = [w_opt [1; cumprod(P_event*x_opt)]];\n    w_unif = [w_unif [1; cumprod(P_event*x_unif)]];\nend\n\n% Plot wealth versus time\nfigure\nsemilogy(w_opt,'g')\nhold on\nsemilogy(w_unif,'r--')\ngrid\naxis tight\nxlabel('time')\nylabel('wealth')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/max_det_psd_completion.m",
    "content": "% Exercise 4.47: Maximum determinant PSD matrix completion\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Almir Mutapcic - Jan 2006\n%\n% Given a symmetric matrix A in R^(n-by-n) with some entries unspecified\n% we find its completion such that A is positive semidefinite and\n% it has a maximum determinant out of all possible completions.\n% This problem can be formulated as a log det (and det_rootn) problem.\n%\n% This is a numerical instance of the specified book exercise.\n\n% problem size\nn = 4;\n\n% create and solve the problem\ncvx_begin sdp\n  % A is a PSD symmetric matrix (n-by-n)\n  variable A(n,n) symmetric;\n  A >= 0;\n\n  % constrained matrix entries.\n  A(1,1) == 3;\n  A(2,2) == 2;\n  A(3,3) == 1;\n  A(4,4) == 5;\n  % Note that because A is symmetric, these off-diagonal\n  % constraints affect the corresponding element on the\n  % opposite side of the diagonal.\n  A(1,2) == .5;\n  A(1,4) == .25;\n  A(2,3) == .75;\n\n  % find the solution to the problem\n  maximize( log_det( A ) )\n  % maximize( det_rootn( A ) )\ncvx_end\n\n% display solution\ndisp(['Matrix A with maximum determinant (' num2str(det(A)) ') is:'])\nA\ndisp(['Its eigenvalues are:'])\neigs = eig(A)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch04_cvx_opt_probs/min_spec_rad_ppl_dynamics.m",
    "content": "% Section 4.5.4: Minimum spectral radius via Peron-Frobenius theory (GP)\r\n% Boyd & Vandenberghe \"Convex Optimization\"\r\n% Joelle Skaf - 01/29/06\r\n% Updated to use CVX mode by Almir Mutapcic 02/08/06\r\n%\r\n% The goal is to minimize the spectral radius of a square matrix A\r\n% which is elementwise nonnegative, Aij >= 0 for all i,j. In this\r\n% case A has a positive real eigenvalue lambda_pf (the Perron-Frobenius\r\n% eigenvalue) which is equal to the spectral radius, and thus gives\r\n% the fastest decay rate or slowest growth rate.\r\n% The problem of minimizing the Perron-Frobenius eigenvalue of A,\r\n% possibly subject to posynomial inequalities in some underlying\r\n% variable x can be posed as a GP (for example):\r\n%\r\n%   minimize   lambda_pf( A(x) )\r\n%       s.t.   f_i(x) <= 1   for i = 1,...,p\r\n%\r\n% where matrix A entries are some posynomial functions of variable x,\r\n% and f_i are posynomials.\r\n%\r\n% We consider a specific example in which we want to find the fastest\r\n% decay or slowest growth rate for the bacteria population governed\r\n% by a simple dynamic model (see page 166). The problem is a GP:\r\n%   minimize   lambda\r\n%       s.t.   b1*v1 + b2*v2 + b3*v3 + b4*v4 <= lambda*v1\r\n%              s1*v1 <= lambda*v2\r\n%              s2*v2 <= lambda*v3\r\n%              s3*v3 <= lambda*v4\r\n%              1/2 <= ci <= 2\r\n%              bi == bi^{nom}*(c1/c1^{nom})^alpha_i*(c2/c2^{nom})^beta_i\r\n%              si == si^{nom}*(c1/c1^{nom})^gamma_i*(c2/c2^{nom})^delta_i\r\n%\r\n% with variables bi, si, ci, vi, lambda.\r\n\r\n% constants\r\nc_nom = [1 1]';\r\nb_nom = [2 3 2 1]';\r\nalpha = [1 1 1 1]'; beta  = [1 1 1 1]';\r\ns_nom = [1 1 3]';\r\ngamma = [1 1 1]'; delta = [1 1 1]';\r\n\r\ncvx_begin gp\r\n  % optimization variables\r\n  variables lambda b(4) s(3) v(4) c(2)\r\n\r\n  % objective is the Perron-Frobenius eigenvalue\r\n  minimize( lambda )\r\n  subject to\r\n    % inequality constraints\r\n    b'*v      <= lambda*v(1);\r\n    s(1)*v(1) <= lambda*v(2);\r\n    s(2)*v(2) <= lambda*v(3);\r\n    s(3)*v(3) <= lambda*v(4);\r\n    [0.5; 0.5] <= c; c <= [2; 2];\r\n    % equality constraints\r\n    b == b_nom.*((ones(4,1)*(c(1)/c_nom(1))).^alpha).*...\r\n                ((ones(4,1)*(c(2)/c_nom(2))).^beta);\r\n    s == s_nom.*((ones(3,1)*(c(1)/c_nom(1))).^gamma).*...\r\n                ((ones(3,1)*(c(2)/c_nom(2))).^delta);\r\ncvx_end\r\n\r\n% displaying results\r\ndisp(' ')\r\nif lambda < 1\r\n  fprintf(1,'The fastest decay rate of the bacteria population is %3.2f.\\n', lambda);\r\nelse\r\n  fprintf(1,'The slowest growth rate of the bacteria population is %3.2f.\\n', lambda);\r\nend\r\ndisp(' ')\r\nfprintf(1,'The concentration of chemical 1 achieving this result is %3.2f.\\n', c(1));\r\nfprintf(1,'The concentration of chemical 2 achieving this result is %3.2f.\\n', c(2));\r\ndisp(' ')\r\n\r\n% construct matrix A\r\nA = zeros(4,4);\r\nA(1,:) = b';\r\nA(2,1) = s(1);\r\nA(3,2) = s(2);\r\nA(4,3) = s(3);\r\n\r\n% eigenvalues of matrix A\r\ndisp('Eigenvalues of matrix A are: ')\r\neigA = eig(A)\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch05_duality/Contents.m",
    "content": "% Chapter 5: Duality\n%\n%  qcqp.m            - Section 5.2.4: Solves a simple QCQP\n%  matrix_games.m    - Section 5.2.5: Mixed strategies for matrix games\n%  matrix_games_LP.m - Section 5.2.5: Mixed strategies for matrix games (LP formulation)\n%  norm_approx.m     - Examples 5.6,5.8: An l_p norm approximation problem\n%  ex_5_19.m         - Exercise 5.19c: Markovitz portfolio optimization w/ diversification constraint\n%  ex_5_1.m          - Exercise 5.1d: Sensitivity analysis for a simple QCQP\n%  ex_5_33.m         - Exercise 5.33: Parametrized l1-norm approximation\n%  ex_5_39.m         - Exercise 5.39: SDP relaxations of the two-way partitioning problem\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch05_duality/ex_5_1.m",
    "content": "% Exercise 5.1d: Sensitivity analysis for a simple QCQP\n% Boyd & Vandenberghe, \"Convex Optimization\"\n% Jolle Skaf - 08/29/05\n% (a figure is generated)\n%\n% Let p_star(u) denote the optimal value of:\n%           minimize    x^2 + 1\n%               s.t.    (x-2)(x-2)<=u\n% Finds p_star(u) and plots it versus u.\n\nfprintf(1,'Computing p_star(u)...\\n ');\n\nu = linspace(-0.9,10,50);\np_star = zeros(1,length(u));\nfor i = 1:length(u)\n    disp(['for u = ' num2str(u(i))]);\n    % perturbed problem\n    cvx_begin quiet\n        variable x(1)\n        minimize ( quad_form(x,1) + 1 )\n        quad_form(x,1) - 6*x + 8 <= u(i);\n    cvx_end\n    % optimal value\n    p_star(i) = cvx_optval;\nend\n\nfprintf(1,'Done! \\n');\n\n% Plots\nplot(u,p_star)\naxis([-2 10 -2 10])\nxlabel('u');\nylabel('p^*(u)')\ntitle('Sensitivity analysis: p^*(u) vs u');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch05_duality/ex_5_19.m",
    "content": "% Exercise 5.19c: Markovitz portfolio optimization w/ diversification constraint\n% Boyd & Vandenberghe, \"Convex Optimization\"\n% Jolle Skaf - 08/29/05\n%\n% Solves an extension of the classical Markovitz portfolio optimization\n% problem:      minimize    x'Sx\n%                   s.t.    p_'*x >= r_min\n%                           1'*x = 1,   x >= 0\n%                           sum_{i=1}^{0.1*n}x[i] <= alpha\n% where p_ and S are the mean and covariance matrix of the price range\n% vector p, x[i] is the ith greatest component in x.\n% The last constraint can be replaced by this equivalent set of constraints\n%                           r*t + sum(u) <= alpha\n%                           t*1 + u >= x\n%                           u >= 0\n\n% Input data\nrandn('state',0);\nn = 25;\np_mean = randn(n,1);\ntemp = randn(n);\nsig = temp'*temp;\nr = floor(0.1*n);\nalpha = 0.8;\nr_min = 1;\n\n% original formulation\nfprintf(1,'Computing the optimal Markovitz portfolio: \\n');\nfprintf(1,'# using the original formulation ... ');\n\ncvx_begin\n    variable x1(n)\n    minimize ( quad_form(x1,sig) )\n    p_mean'*x1 >= r_min;\n    ones(1,n)*x1 == 1;\n    x1 >= 0;\n    sum_largest(x1,r) <= alpha;\ncvx_end\n\nfprintf(1,'Done! \\n');\nopt1 = cvx_optval;\n\n% equivalent formulation\nfprintf(1,'# using an equivalent formulation by replacing the diversification\\n');\nfprintf(1,'  constraint by an equivalent set of linear constraints...');\n\ncvx_begin\n    variables x2(n) u(n) t(1)\n    minimize ( quad_form(x2,sig) )\n    p_mean'*x2 >= r_min;\n    sum(x2) == 1;\n    x2 >= 0;\n    r*t + sum(u) <= alpha;\n    t*ones(n,1) + u >= x2;\n    u >= 0;\ncvx_end\n\nfprintf(1,'Done! \\n');\nopt2 = cvx_optval;\n\n% Displaying results\ndisp('------------------------------------------------------------------------');\ndisp('The optimal portfolios obtained from the original problem formulation and');\ndisp('from the equivalent formulation are respectively: ');\ndisp([x1 x2])\ndisp('They are equal as expected!');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch05_duality/ex_5_33.m",
    "content": "% Exercise 5.33: Parametrized l1-norm approximation\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Jolle Skaf - 08/29/05\n% (a figure is generated)\n%\n% Let p_star(epsilon) be the optimal value of the following problem:\n%               minimize    ||Ax + b + epsilon*d||_1\n% Plots p_star(epsilon) versus epsilon and demonstrates the fact that it's\n% affine on an interval that includes epsilon = 0.\n\n% Input data\nA = [-2  7  1; ...\n     -5 -1  3; ...\n     -7  3 -5; ...\n     -1  4 -4; ...\n      1  5  5; ...\n      2 -5 -1];\nb = [-4 3 9 0 -11 5]';\nd = [-10 -13 -27 -10 -7 14]';\nepsilon = [-1:0.05:1];\np_star = zeros(size(epsilon));\n\nfprintf(1,'Computing p*(epsilon) for -1 <= epsilon <= 1 ...');\n\nfor i=1:length(epsilon)\n    cvx_begin quiet\n        variable x(3);\n        minimize ( norm( A*x + b + epsilon(i)*d, 1) )\n    cvx_end\n    p_star(i)= cvx_optval;\nend\n\nfprintf(1,'Done! \\n');\n\n% Plots\nplot(epsilon, p_star)\nline([-.2 -.2], [2 14], 'LineStyle', '--')\nline([.5 .5], [2 14], 'LineStyle', '--')\nxlabel('\\epsilon');\nylabel('p^*(\\epsilon)');\ntitle('p^*(\\epsilon) vs \\epsilon');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch05_duality/ex_5_39.m",
    "content": "% Exercise 5.39: SDP relaxations of the two-way partitioning problem\n% Boyd & Vandenberghe. \"Convex Optimization\"\n% Jolle Skaf - 09/07/05\n% (a figure is generated)\n%\n% Compares the optimal values of:\n% 1) the Lagrange dual of the two-way partitioning problem\n%               maximize    -sum(nu)\n%                   s.t.    W + diag(nu) >= 0\n% 2) the SDP relaxation of the two-way partitioning problem\n%               minimize    trace(WX)\n%                   s.t.    X >= 0\n%                           X_ii = 1\n\n% Input data\nrandn('state',0);\nn = 10;\nW = randn(n); W = 0.5*(W + W');\n\n% Lagrange dual\nfprintf(1,'Solving the dual of the two-way partitioning problem...');\n\ncvx_begin sdp\n    variable nu(n)\n    maximize ( -sum(nu) )\n    W + diag(nu) >= 0;\ncvx_end\n\nfprintf(1,'Done! \\n');\nopt1 = cvx_optval;\n\n% SDP relaxation\nfprintf(1,'Solving the SDP relaxation of the two-way partitioning problem...');\n\ncvx_begin sdp\n    variable X(n,n) symmetric\n    minimize ( trace(W*X) )\n    diag(X) == 1;\n    X >= 0;\ncvx_end\n\nfprintf(1,'Done! \\n');\nopt2 = cvx_optval;\n\n% Displaying results\ndisp('------------------------------------------------------------------------');\ndisp('The optimal value of the Lagrange dual and the SDP relaxation fo the    ');\ndisp('two-way partitioning problem are, respectively, ');\ndisp([opt1 opt2])\ndisp('They are equal as expected!');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch05_duality/matrix_games.m",
    "content": "% Section 5.2.5: Mixed strategies for matrix games\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Jolle Skaf - 08/24/05\n%\n% Player 1 wishes to choose u to minimize his expected payoff u'Pv, while\n% player 2 wishes to choose v to maximize u'Pv, where P is the payoff\n% matrix, u and v are the probability distributions of the choices of each\n% player (i.e. u>=0, v>=0, sum(u_i)=1, sum(v_i)=1)\n\n% Input data\nrandn('state',0);\nn = 10;\nm = 10;\nP = randn(n,m);\n\n% Optimal strategy for Player 1\nfprintf(1,'Computing the optimal strategy for player 1 ... ');\n\ncvx_begin\n    variable u(n)\n    minimize ( max ( P'*u) )\n    u >= 0;\n    ones(1,n)*u == 1;\ncvx_end\n\nfprintf(1,'Done! \\n');\nobj1 = cvx_optval;\n\n% Optimal strategy for Player 2\nfprintf(1,'Computing the optimal strategy for player 2 ... ');\n\ncvx_begin\n    variable v(m)\n    maximize ( min (P*v) )\n    v >= 0;\n    ones(1,m)*v == 1;\ncvx_end\n\nfprintf(1,'Done! \\n');\nobj2 = cvx_optval;\n\n% Displaying results\ndisp('------------------------------------------------------------------------');\ndisp('The optimal strategies for players 1 and 2 are respectively: ');\ndisp([u v]);\ndisp('The expected payoffs for player 1 and player 2 respectively are: ');\n[obj1 obj2]\ndisp('They are equal as expected!');"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch05_duality/matrix_games_LP.m",
    "content": "% Section 5.2.5: Mixed strategies for matrix games (LP formulation)\n% Boyd & Vandenberghe, \"Convex Optimization\"\n% Jolle Skaf - 08/24/05\n%\n% Player 1 wishes to choose u to minimize his expected payoff u'Pv, while\n% player 2 wishes to choose v to maximize u'Pv, where P is the payoff\n% matrix, u and v are the probability distributions of the choices of each\n% player (i.e. u>=0, v>=0, sum(u_i)=1, sum(v_i)=1)\n% LP formulation:   minimize    t\n%                       s.t.    u >=0 , sum(u) = 1, P'*u <= t*1\n%                   maximize    t\n%                       s.t.    v >=0 , sum(v) = 1, P*v >= t*1\n\n% Input data\nrandn('state',0);\nn = 12;\nm = 12;\nP = randn(n,m);\n\n% Optimal strategy for Player 1\nfprintf(1,'Computing the optimal strategy for player 1 ... ');\n\ncvx_begin\n    variables u(n) t1\n    minimize ( t1 )\n    u >= 0;\n    ones(1,n)*u == 1;\n    P'*u <= t1*ones(m,1);\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Optimal strategy for Player 2\nfprintf(1,'Computing the optimal strategy for player 2 ... ');\n\ncvx_begin\n    variables v(m) t2\n    maximize ( t2 )\n    v >= 0;\n    ones(1,m)*v == 1;\n    P*v >= t2*ones(n,1);\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Displaying results\ndisp('------------------------------------------------------------------------');\ndisp('The optimal strategies for players 1 and 2 are respectively: ');\ndisp([u v]);\ndisp('The expected payoffs for player 1 and player 2 respectively are: ');\n[t1 t2]\ndisp('They are equal as expected!');\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch05_duality/norm_approx.m",
    "content": "% Examples 5.6,5.8: An l_p norm approximation problem\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Jolle Skaf - 08/23/05\n%\n% The goal is to show the following problem formulations give all the same\n% optimal residual norm ||Ax - b||:\n% 1)        minimize    ||Ax - b||\n% 2)        minimize    ||y||\n%               s.t.    Ax - b = y\n% 3)        maximize    b'v\n%               s.t.    ||v||* <= 1  , A'v = 0\n% 4)        minimize    1/2 ||y||^2\n%               s.t.    Ax - b = y\n% 5)        maximize    -1/2||v||*^2 + b'v\n%               s.t.    A'v = 0\n% where ||.||* denotes the dual norm of ||.||\n\n% Input data\nrandn('state',0);\nn = 4;\nm = 2*n;\nA = randn(m,n);\nb = randn(m,1);\np = 2;\nq = p/(p-1);\n\n% Original problem\nfprintf(1,'Computing the optimal solution of problem 1... ');\n\ncvx_begin quiet\n    variable x(n)\n    minimize ( norm ( A*x - b , p) )\ncvx_end\n\nfprintf(1,'Done! \\n');\nopt1 = cvx_optval;\n\n% Reformulation 1\nfprintf(1,'Computing the optimal solution of problem 2... ');\n\ncvx_begin quiet\n    variables x(n) y(m)\n    minimize ( norm ( y , p ) )\n    A*x - b == y;\ncvx_end\n\nfprintf(1,'Done! \\n');\nopt2 = cvx_optval;\n\n% Dual of reformulation 1\nfprintf(1,'Computing the optimal solution of problem 3... ');\n\ncvx_begin quiet\n    variable nu(m)\n    maximize ( b'*nu )\n    norm( nu , q ) <= 1;\n    A'*nu == 0;\ncvx_end\n\nfprintf(1,'Done! \\n');\nopt3 = cvx_optval;\n\n% Reformulation 2\nfprintf(1,'Computing the optimal solution of problem 4... ');\n\ncvx_begin quiet\n    variables x(n) y(m)\n    minimize ( 0.5 * square_pos ( norm ( y , p ) ) )\n    A*x - b == y;\ncvx_end\n\nfprintf(1,'Done! \\n');\nopt4 = (2*cvx_optval).^(.5);\n\n% Dual of reformulation 2\nfprintf(1,'Computing the optimal solution of problem 5... ');\n\ncvx_begin quiet\n    variable nu(m)\n    maximize ( -0.5 * square_pos ( norm ( nu , q ) ) + b'*nu )\n    A'*nu == 0;\ncvx_end\n\nfprintf(1,'Done! \\n');\nopt5 = (2*cvx_optval).^(0.5);\n\n% Displaying results\ndisp('------------------------------------------------------------------------');\ndisp('The optimal residual values for problems 1,2,3,4 and 5 are respectively:');\n[ opt1 opt2 opt3 opt4 opt5 ]'\ndisp('They are equal as expected!');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch05_duality/qcqp.m",
    "content": "% Section 5.2.4: Solves a simple QCQP\n% Boyd & Vandenberghe, \"Convex Optimization\"\n% Jolle Skaf - 08/23/05\n%\n% Solved a QCQP with 3 inequalities:\n%           minimize    1/2 x'*P0*x + q0'*r + r0\n%               s.t.    1/2 x'*Pi*x + qi'*r + ri <= 0   for i=1,2,3\n% and verifies that strong duality holds.\n\n% Input data\nrandn('state',13);\nn = 6;\nP0 = randn(n); P0 = P0'*P0 + eps*eye(n);\nP1 = randn(n); P1 = P1'*P1;\nP2 = randn(n); P2 = P2'*P2;\nP3 = randn(n); P3 = P3'*P3;\nq0 = randn(n,1); q1 = randn(n,1); q2 = randn(n,1); q3 = randn(n,1);\nr0 = randn(1); r1 = randn(1); r2 = randn(1); r3 = randn(1);\n\nfprintf(1,'Computing the optimal value of the QCQP and its dual... ');\n\ncvx_begin\n    variable x(n)\n    dual variables lam1 lam2 lam3\n    minimize( 0.5*quad_form(x,P0) + q0'*x + r0 )\n    lam1: 0.5*quad_form(x,P1) + q1'*x + r1 <= 0;\n    lam2: 0.5*quad_form(x,P2) + q2'*x + r2 <= 0;\n    lam3: 0.5*quad_form(x,P3) + q3'*x + r3 <= 0;\ncvx_end\n\nobj1 = cvx_optval;\nP_lam = P0 + lam1*P1 + lam2*P2 + lam3*P3;\nq_lam = q0 + lam1*q1 + lam2*q2 + lam3*q3;\nr_lam = r0 + lam1*r1 + lam2*r2 + lam3*r3;\nobj2 = -0.5*q_lam'*inv(P_lam)*q_lam + r_lam;\n\nfprintf(1,'Done! \\n');\n\n% Displaying results\ndisp('------------------------------------------------------------------------');\ndisp('The duality gap is equal to ');\ndisp(obj1-obj2)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/Contents.m",
    "content": "% Chapter 6: Approximation and fitting\n%\n%  deadzone.m             - Section 6.1.2: Residual minimization with deadzone penalty\n%  fig6_15.m              - Figure 6.15: A comparison of stochastic and worst-case robust approximation\n%  fig6_19.m              - Figure 6.19: Polynomial fitting\n%  convex_interpolation.m - Figure 6.24: Fitting a convex function to given data\n%  penalty_comp_cvx.m     - Figure 6.2: Penalty function approximation\n%  fig6_9.m               - Figure 6.9: An optimal tradeoff curve\n%  tv_cvx.m               - Figures 6.11-6.14: Total variation reconstruction\n%  basispursuit.m         - Figures 6.21-6.23: Basis pursuit using Gabor functions\n%  smoothrec_cvx.m        - Figures 6.8-6.10: Quadratic smoothing\n%  fig6_5.m               - Example 6.2: Robust regression using the Huber penalty\n%  fig6_6.m               - Example 6.3: Optimal input design\n%  regressor_cvx.m        - Example 6.4: Regressor selection problem\n%  wcrobls.m              - Example 6.6: Comparison of worst-case robust, Tikhonov, and nominal least squares\n%  fig6_20.m              - Example 6.8: Spline fitting\n%  preference_regions.m   - Example 6.9: Bounding consumer preference\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/basispursuit.m",
    "content": "% Figures 6.21-6.23: Basis pursuit using Gabor functions\n% Section 6.5.4\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Argyris Zymnis - 11/27/2005\n%\n% Here we find a sparse basis for a signal y out of\n% a set of Gabor functions. We do this by solving\n%       minimize  ||A*x-y||_2 + ||x||_1\n%\n% where the columns of A are sampled Gabor functions.\n% We then fix the sparsity pattern obtained and solve\n%       minimize  ||A*x-y||_2\n%\n% NOTE: The file takes a while to run\n\nclear\n\n% Problem parameters\nsigma = 0.05;  % Size of Gaussian function\nTinv  = 500;   % Inverse of sample time\nThr   = 0.001; % Basis signal threshold\nkmax  = 30;    % Number of signals are 2*kmax+1\nw0    = 5;     % Base frequency (w0 * kmax should be 150 for good results)\n\n% Build sine/cosine basis\nfprintf(1,'Building dictionary matrix...');\n% Gaussian kernels\nTK = (Tinv+1)*(2*kmax+1);\nt  = (0:Tinv)'/Tinv;\nA  = exp(-t.^2/(sigma^2));\nns = nnz(A>=Thr)-1;\nA  = A([ns+1:-1:1,2:ns+1],:);\nii = (0:2*ns)';\njj = ones(2*ns+1,1)*(1:Tinv+1);\noT = ones(1,Tinv+1);\nA  = sparse(ii(:,oT)+jj,jj,A(:,oT));\nA  = A(ns+1:ns+Tinv+1,:);\n% Sine/Cosine basis\nk  = [ 0, reshape( [ 1 : kmax ; 1 : kmax ], 1, 2 * kmax ) ];\np  = zeros(1,2*kmax+1); p(3:2:end) = -pi/2;\nSC = cos(w0*t*k+ones(Tinv+1,1)*p);\n% Multiply\nii = 1:numel(SC);\njj = rem(ii-1,Tinv+1)+1;\nA  = sparse(ii,jj,SC(:)) * A;\nA  = reshape(A,Tinv+1,(Tinv+1)*(2*kmax+1));\nfprintf(1,'done.\\n');\n\n% Construct example signal\na = 0.5*sin(t*11)+1;\ntheta = sin(5*t)*30;\nb = a.*sin(theta);\n\n% Solve the Basis Pursuit problem\ndisp('Solving Basis Pursuit problem...');\ntic\ncvx_begin\n    variable x(30561)\n    minimize(sum_square(A*x-b)+norm(x,1))\ncvx_end\ndisp('done');\ntoc\n\n% Reoptimize problem over nonzero coefficients\np = find(abs(x) > 1e-5);\nA2 = A(:,p);\nx2 = A2 \\ b;\n\n% Constants\nM = 61; % Number of different Basis signals\nsk = 250; % Index of s = 0.5\n\n% Plot example basis functions;\n%if (0) % to do this, re-run basispursuit.m to create A\nfigure(1); clf;\nsubplot(3,1,1); plot(t,A(:,M*sk+1)); axis([0 1 -1 1]);\ntitle('Basis function 1');\nsubplot(3,1,2); plot(t,A(:,M*sk+31)); axis([0 1 -1 1]);\ntitle('Basis function 2');\nsubplot(3,1,3); plot(t,A(:,M*sk+61)); axis([0 1 -1 1]);\ntitle('Basis function 3');\n%print -deps bp-dict_helv.eps\n\n% Plot reconstructed signal\nfigure(2); clf;\nsubplot(2,1,1);\nplot(t,A2*x2,'--',t,b,'-'); axis([0 1 -1.5 1.5]);\nxlabel('t'); ylabel('y_{hat} and y');\ntitle('Original and Reconstructed signals')\nsubplot(2,1,2);\nplot(t,A2*x2-b); axis([0 1 -0.06 0.06]);\ntitle('Reconstruction error')\nxlabel('t'); ylabel('y - y_{hat}');\n%print -deps bp-approx_helv.eps\n\n% Plot frequency plot\nfigure(3); clf;\n\nsubplot(2,1,1);\nplot(t,b); xlabel('t'); ylabel('y'); axis([0 1 -1.5 1.5]);\ntitle('Original Signal')\nsubplot(2,1,2);\nplot(t,150*abs(cos(w0*t)),'--');\nhold on;\nfor k = 1:length(t);\n  if(abs(x((k-1)*M+1)) > 1e-5), plot(t(k),0,'o'); end;\n  for j = 2:2:kmax*2\n    if((abs(x((k-1)*M+j)) > 1e-5) | (abs(x((k-1)*M+j+1)) > 1e-5)),\n      plot(t(k),w0*j/2,'o');\n    end;\n  end;\nend;\nxlabel('t'); ylabel('w');\ntitle('Instantaneous frequency')\nhold off;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/convex_interpolation.m",
    "content": "% Figure 6.24: Fitting a convex function to given data\n% Section 6.5.5\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Argyris Zymnis - 11/27/2005\n%\n% Here we find the convex function f that best fits\n% some given data in the least squares sense.\n% To do this we solve\n%     minimize    ||yns - yhat||_2\n%     subject to  yhat(j) >= yhat(i) + g(i)*(u(j) - u(i)), for all i,j\n\nclear\n\n% Noise level in percent and random seed.\nrand('state',29);\nnoiseint=.05;\n\n% Generate the data set\nu = [0:0.04:2]';\nm=length(u);\ny = 5*(u-1).^4 + .6*(u-1).^2 + 0.5*u;\nv1=u>=.2;\nv2=u<=.6;\nv3=v1.*v2;\ndipvec=((v3.*u-.4*ones(1,size(v3,2))).^(2)).*v3;\ny=y+40*(dipvec-((.2))^2*v3);\n\n% add perturbation and plots the input data\nrandf=noiseint*(rand(m,1)-.5);\nyns=y+norm(y)*(randf);\nfigure\nplot(u,yns,'o');\n\n% min. ||yns-yhat||_2\n% s.t. yhat(j) >= yhat(i) + g(i)*(u(j) - u(i)), for all i,j\ncvx_begin\n    variables yhat(m) g(m)\n    minimize(norm(yns-yhat))\n    subject to\n        yhat*ones(1,m) >= ones(m,1)*yhat' + (ones(m,1)*g').*(u*ones(1,m)-ones(m,1)*u');\ncvx_end\n\nnopts =1000;\nt = linspace(0,2,nopts);\nf = max(yhat(:,ones(1,nopts)) + ...\n      g(:,ones(1,nopts)).*(t(ones(m,1),:)-u(:,ones(1,nopts))));\nplot(u,yns,'o',t,f,'-');\naxis off\n%print -deps interpol_convex_function2.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/deadzone.m",
    "content": "% Section 6.1.2: Residual minimization with deadzone penalty\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 08/17/05\n%\n% The penalty function approximation problem has the form:\n%               minimize    sum(deadzone(Ax - b))\n% where 'deadzone' is the deadzone penalty function\n%               deadzone(y) = max(abs(y)-1,0)\n\n% Input data\nrandn('state',0);\nm = 16; n = 8;\nA = randn(m,n);\nb = randn(m,1);\n\n% deadzone penalty\n% original formulation\nfprintf(1,'Computing the optimal solution of the deadzone approximation problem: \\n');\n\ncvx_begin\n    variable x(n)\n    minimize( sum(max(abs(A*x-b)-1,0)) )\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Compare\ndisp( sprintf( '\\nResults:\\n--------\\nsum(max(abs(A*x-b)-1,0)): %6.4f\\ncvx_optval: %6.4f\\ncvx_status: %s\\n', sum(max(abs(A*x-b)-1,0)), cvx_optval, cvx_status ) );\ndisp( 'Optimal vector:' );\ndisp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\ndisp( 'Residual vector:' );\ndisp( [ '   A*x-b = [ ', sprintf( '%7.4f ', A*x-b ), ']' ] );\ndisp( ' ' );\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/fig6_15.m",
    "content": "% Figure 6.15: A comparison of stochastic and worst-case robust approximation\n% Section 6.4.2\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/03/05\n%\n% Consider the least-squares problem:\n%       minimize ||(A + tB)x - b||_2\n% where t is an uncertain parameter in [-1,1]\n% Three approximate solutions are found:\n%   1- nominal optimal (i.e. letting t=0)\n%   2- stochastic robust approximation:\n%           minimize E||(A+tB)x - b||_2\n%      assuming u is uniformly distributed on [-1,1] )\n%      (reduces to minimizing E ||(A+tB)x-b||^2 = ||A*x-b||^2  + x^TPx\n%        where P = E(t^2) B^TB = (1/3) B^TB )\n%   3- worst-case robust approximation:\n%           minimize sup{-1<=u<=1} ||(A+tB)x - b||_2)\n%      (reduces to minimizing max{||(A-B)x - b||_2, ||(A+B)x - b||_2} )\n\n% Input Data\nrandn('seed',0);\nm=20;  n=10;\nA = randn(m,n);\n[U,S,V] = svd(A);\nS = diag(logspace(-1,1,n));\nA = U(:,1:n)*S*V';\n\nB = randn(m,n);\nB = B/norm(B);\n\nb = randn(m,1);\n\n% Case 1: Nominal optimal solution\nfprintf(1,'Computing the optimal solution for: \\n');\nfprintf(1,'1) the nominal problem ... ');\n\ncvx_begin quiet\n    variable x_nom(n)\n    minimize ( norm(A*x_nom - b) )\ncvx_end\n%         (reduces to minimizing max{||(A-B)x - b||_2, ||(A+B)x - b||_2}\nfprintf(1,'Done! \\n');\n\n% Case 2: Stochastic robust approximation\n\nfprintf(1,'2) the stochastic robust approximation problem ... ');\n\nP = (1/3)*B'*B;\ncvx_begin quiet\n    variable x_stoch(n)\n    minimize (  square_pos(norm(A*x_stoch - b)) + quad_form(x_stoch,P) )\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Case 3: Worst-case robust approximation\n\nfprintf(1,'3) the worst-case robust approximation problem ... ');\n\ncvx_begin quiet\n    variable x_wc(n)\n    minimize ( max( norm((A-B)*x_wc - b), norm((A+B)*x_wc - b) ) )\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% plot residuals\nnovals = 100;\nparvals = linspace(-2,2,novals);\n\nerrvals_ls = [];\nerrvals_stoch = [];\nerrvals_wc = [];\nfor k=1:novals\n   errvals_ls = [errvals_ls, norm((A+parvals(k)*B)*x_nom - b)];\n   errvals_stoch = [errvals_stoch, norm((A+parvals(k)*B)*x_stoch - b)];\n   errvals_wc = [errvals_wc, norm((A+parvals(k)*B)*x_wc - b)];\nend;\n\nplot(parvals, errvals_ls, '-', parvals, errvals_stoch, '-', ...\n     parvals, errvals_wc, '-', [-1;-1], [0; 12], 'k--', ...\n     [1;1], [0; 12], 'k--');\nxlabel('u');\nylabel('r(u) = ||A(u)x-b||_2');\ntitle('Residual r(u) vs a parameter u for three approximate solutions');\n% print -deps robappr.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/fig6_19.m",
    "content": "% Figure 6.19: Polynomial fitting\n% Section 6.5.3\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/03/05\n% (a figure is generated)\n%\n% Given data u_1,...,u_m and v_1,...,v_m in R, the goal is to fit to the\n% data a polynomial of the form\n% p(u) = x_1 + x_2*u + ... + x_n*u^{n-1}\n% i.e. solve the problem:  minimize ||Ax - v||\n% where A is the Vandermonde matrix s.t. Aij = u_i^{j-1}\n% Two cases are considered: L2-norm and Linfty-norm\n\n% Input data\nn=6;\nm=40;\nrandn('state',0);\n% generate 50 ponts ui, vi\nu = linspace(-1,1,m);\nv = 1./(5+40*u.^2) + 0.1*u.^3 + 0.01*randn(1,m);\n\n\n% LS fit polynomial x_1 + x_2*u + ... + x_n*u^(n-1) to (ui,vi)\nfprintf(1,'Computing optimal polynomial in the case of L2-norm...');\n\nA = vander(u');\nA = A(:,m-n+[1:n]);     % last n columns of A\nx = A\\(v');             % coefficients of the polynomial in the following\n                        % order: x = [x_n x_(n-1) ... x_2 x_1]'\n\nfprintf(1,'Done! \\n');\n\n% L-infty fit\nfprintf(1,'Computing optimal polynomial in the case of Linfty-norm...');\n\ncvx_begin quiet\n    variable x1(n)\n    minimize (norm(A*x1 - v', inf))\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% generates 1000 points in  [-1,1]\nu2 = linspace(-1.1,1.1,1000);\n\n% evaluate the interpolating polynomial using Horner's method\nvpol = x(1)*ones(1,1000);\nvpoll1 = x1(1)*ones(1,1000);\nfor i = 2:n\n  vpol = vpol.*u2 + x(i);\n  vpoll1 = vpoll1.*u2 + x1(i);\nend;\n\nfigure\n% plot function and interpolating polynomial\nplot(u2, vpol,'-', u, v, 'o', u2, vpoll1,'--');\nxlabel('u');\nylabel('p(u)');\ntitle('Fitting of data points with two polynomials of degree 5');\nlegend('L_2 norm','data points','L_{\\infty} norm', 'Location','Best');\n% print -deps polapprox.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/fig6_20.m",
    "content": "% Example 6.8: Spline fitting\n% Section 6.5.3, Figure 6.20\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/03/05\n% (a figure is generated)\n%\n% Given data u_1,...,u_m and v_1,...,v_m in R, the goal is to fit to the\n% data piecewise polynomials with maximum degree 3 (with continuous first\n% and second derivatives).\n% The [0,1] interval is divided into 3 equal intervals: [-1, -1/3],\n% [-1/3,1/3], [1/3,1] with the following polynomials defined on each\n% interval respectively:\n% p1(t) = x11 + x12*t + x13*t^2 + x14*t^3\n% p2(t) = x21 + x22*t + x23*t^2 + x24*t^3\n% p3(t) = x31 + x32*t + x33*t^2 + x34*t^3\n% L2-norm and Linfty-norm cases are considered\n\n% Input Data\nn=4;  % variables per segment\nm=40;\nrandn('state',0);\n% generate 50 points ui, vi\nu = linspace(-1,1,m);\nv = 1./(5+40*u.^2) + 0.1*u.^3 + 0.01*randn(1,m);\n\na = -1/3;  b = 1/3;  % boundary points\nu1 = u(find(u<a)); m1 = length(u1);\nu2 = u(find((u >= a) & (u<b)));  m2 = length(u2);\nu3 = u(find((u >= b)));  m3 = length(u3);\n\nA1 = vander(u1');   A1 = fliplr(A1(:,m1-n+[1:n]));\nA2 = vander(u2');   A2 = fliplr(A2(:,m2-n+[1:n]));\nA3 = vander(u3');   A3 = fliplr(A3(:,m3-n+[1:n]));\n\n%L-2 fit\nfprintf(1,'Computing splines in the case of L2-norm...');\n\ncvx_begin\n    variables x1(n) x2(n) x3(n)\n    minimize ( norm( [A1*x1;A2*x2;A3*x3] - v') )\n    %continuity conditions at point a\n    [1 a a^2   a^3]*x1 == [1 a a^2   a^3]*x2;\n    [0 1 2*a 3*a^2]*x1 == [0 1 2*a 3*a^2]*x2;\n    [0 0   2 6*a  ]*x1 == [0 0   2 6*a  ]*x2;\n    %continuity conditions at point b\n    [1 b b^2   b^3]*x2 == [1 b b^2   b^3]*x3;\n    [0 1 2*b 3*b^2]*x2 == [0 1 2*b 3*b^2]*x3;\n    [0 0   2 6*b  ]*x2 == [0 0   2 6*b  ]*x3;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% L-infty fit\nfprintf(1,'Computing splines in the case of Linfty-norm...');\n\ncvx_begin\n    variables xl1(n) xl2(n) xl3(n)\n    minimize ( norm( [A1*xl1;A2*xl2;A3*xl3] - v', inf) )\n    %continuity conditions at point a\n    [1 a a^2   a^3]*xl1 == [1 a a^2   a^3]*xl2;\n    [0 1 2*a 3*a^2]*xl1 == [0 1 2*a 3*a^2]*xl2;\n    [0 0   2 6*a  ]*xl1 == [0 0   2 6*a  ]*xl2;\n    %continuity conditions at point b\n    [1 b b^2   b^3]*xl2 == [1 b b^2   b^3]*xl3;\n    [0 1 2*b 3*b^2]*xl2 == [0 1 2*b 3*b^2]*xl3;\n    [0 0   2 6*b  ]*xl2 == [0 0   2 6*b  ]*xl3;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% evaluate the interpolating polynomials using Horner's method\nu1s = linspace(-1.0,a,1000)';\np1 = x1(1) + x1(2)*u1s + x1(3)*u1s.^2 + x1(4).*u1s.^3;\np1l1 = xl1(1) + xl1(2)*u1s + xl1(3)*u1s.^2 + xl1(4).*u1s.^3;\n\nu2s = linspace(a,b,1000)';\np2 = x2(1) + x2(2)*u2s + x2(3)*u2s.^2 + x2(4).*u2s.^3;\np2l1 = xl2(1) + xl2(2)*u2s + xl2(3)*u2s.^2 + xl2(4).*u2s.^3;\n\nu3s = linspace(b,1.0,1000)';\np3 = x3(1) + x3(2)*u3s + x3(3)*u3s.^2 + x3(4).*u3s.^3;\np3l1 = xl3(1) + xl3(2)*u3s + xl3(3)*u3s.^2 + xl3(4).*u3s.^3;\n\nus = [u1s;u2s;u3s];\np = [p1;p2;p3];\npl = [p1l1;p2l1;p3l1];\n% plot function and cubic splines\nd = plot(us,p,'b-',u,v,'go', us,pl,'r--',...\n         [-1 -1], [-0.1 0.25], 'k--', [1 1], [-0.1 0.25], 'k--', ...\n         [a a], [-0.1 0.25], 'k--', [b b], [-0.1 0.25], 'k--');\n\ntitle('Approximation using 2 cubic splines');\nxlabel('u');\nylabel('f(u)');\nlegend('L_2 norm','Data points','L_{\\infty} norm', 'Location','Best');\n% print -deps splineapprox.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/fig6_5.m",
    "content": "% Example 6.2: Robust regression using the Huber penalty\n% Section 6.1.2, Figure 6.5\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 09/07/05\n%\n% Compares the solution of regular Least-squares:\n%           minimize    sum(y_i - alpha - beta*t_i)^2\n% to the solution of the following:\n%           minimize    sum( phi_h (y_i - alpha - beta*t_i)^2 )\n% where phi_h is the Huber penalty function, (t_i,y_i) are data points in a\n% plane.\n\n% Input data\nrandn('seed',1);\nrand('seed',1);\n\nm=40;  n=2;    A = randn(m,n);\nxex = [5;1];\npts = -10+20*rand(m,1);\nA = [ones(m,1) pts];\nb = A*xex + .5*randn(m,1);\noutliers = [-9.5; 9];  outvals = [20; -15];\nA = [A; ones(length(outliers),1), outliers];\nb = [b; outvals];\nm = size(A,1);\npts = [pts;outliers];\n\n% Least Squares\nfprintf(1,'Computing the solution of the least-squares problem...');\n\nxls =  A\\b;\n\nfprintf(1,'Done! \\n');\n\n% Huber\nfprintf(1,'Computing the solution of the huber-penalized problem...');\n\ncvx_begin quiet\n    variable xhub(n)\n    minimize(sum(huber(A*xhub-b)))\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Plots\nfigure(1);  hold off\nplot(pts,b,'o', [-11; 11], [1 -11; 1 11]*xhub, '-', ...\n     [-11; 11], [1 -11; 1 11]*xls, '--');\naxis([-11 11 -20 25])\ntitle('Least-square fit vs robust least-squares fit (Huber-penalized)');\nxlabel('x');\nylabel('y');\nlegend('Data points','Huber penalty','Regular LS','Location','Best');\n%print -deps robustls.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/fig6_6.m",
    "content": "% Example 6.3: Optimal input design\n% Section 6.3.2, Figure 6.6\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 09/26/05\n%\n% Consider a dynamical system with scalar input sequence u(0),u(1),...,u(N)\n% and scalar output sequence y(0),y(1),...,y(N) related by the convolution\n% y = h*u where h = [h(0),h(1),...,h(N)] is the impulse response.\n% Our goal is to choose an input sequence to minimize the weighted sum:\n%           minimize J_track + delta*J_der + eta*J_mag\n% where J_track = 1/(N+1) sum_{t=0}^N (y(t) - y_des(t))^2\n%       J_mag   = 1/(N+1) sum_{t=0}^N u(t)^2\n%       J_der   = 1/N sum_{t=0}^{N-1} (u(t+1) - u(t))^2\n\n% Input data\nm = 201;  n = 201;  N=200;\nt = [0:m-1]';\nh = (1/9)*((.9).^t) .* (1 - 0.4*cos(2*t));   % sum(h) is approx. 1\n\nH = toeplitz(h', [h(1) zeros(1,n-1)]);\n% m1 = round(m/6); m2 = round(m/5); m3 = round(m/5);  m4 = m-m1-m2-m3;\nm1 = round(m/5); m2 = round(m/4); m3 = round(m/4);  m4 = m-m1-m2-m3;\ny_des = [zeros(m1,1); ones(m2,1); -ones(m3,1); zeros(m4,1)];\n\nD = [-eye(n-1) zeros(n-1,1)];\nD = D + [zeros(n-1,1) eye(n-1)];\n\ndelta = [0 0 0.3];\neta = [0.005 0.05 0.05];\ndisp('Finding the optimal input for ');\nfor i = 1:length(delta)\n    disp(['* delta = ' num2str(delta(i)) ' and eta = ' num2str(eta(i))]);\n    cvx_begin quiet\n    variable u(N+1)\n    minimize ( square_pos(norm(H*u - y_des))/(N+1) + ...\n               eta(i)*square_pos(norm(u))/(N+1) + ...\n               delta(i)*square_pos(norm(D*u))/N )\n    cvx_end\n    switch(i)\n        case 1\n            figure(1); plot(t,u); xlabel('t'); ylabel('u(t)');\n            title(['Input u(t) for \\delta = ' num2str(delta(i)) ' and  \\eta = ' num2str(eta(i))]);\n            %         print -deps smoothreg1u.eps\n            figure(2); plot(t,H*u); xlabel('t'); ylabel('y(t)');\n            title(['Output y(t) for \\delta = ' num2str(delta(i)) ' and  \\eta = ' num2str(eta(i))]);\n            %         print -deps smoothreg1y.eps\n        case 2\n            figure(3); plot(t,u); xlabel('t'); ylabel('u(t)');\n            title(['Input u(t) for \\delta = ' num2str(delta(i)) ' and  \\eta = ' num2str(eta(i))]);\n            %         print -deps smoothreg2u.eps\n            figure(4); plot(t,H*u); xlabel('t'); ylabel('y(t)');\n            title(['Output y(t) for \\delta = ' num2str(delta(i)) ' and  \\eta = ' num2str(eta(i))]);\n            %         print -deps smoothreg2y.eps\n        case 3\n            figure(5); plot(t,u); xlabel('t'); ylabel('u(t)');\n            title(['Input u(t) for \\delta = ' num2str(delta(i)) ' and  \\eta = ' num2str(eta(i))]);\n            %         print -deps smoothreg3u.eps\n            figure(6); plot(t,H*u); xlabel('t'); ylabel('y(t)');\n            title(['Output y(t) for \\delta = ' num2str(delta(i)) ' and  \\eta = ' num2str(eta(i))]);\n            %         print -deps smoothreg3y.eps\n    end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/fig6_9.m",
    "content": "% Figure 6.9: An optimal tradeoff curve\n% Section 6.3.3\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX Joelle Skaf - 09/29/05\n% (a figure is generated)\n%\n% Plots the optimal trade-off curve between ||Dx||_2 and ||x-x_cor||_2 by\n% solving the following problem for different values of delta:\n%           minimize    ||x - x_cor||^2 + delta*||Dx||^2\n% where x_cor is the a problem parameter, ||Dx|| is a measure of smoothness\n\n%Input data\nrandn('state',0);\nn = 4000;  t = (0:n-1)';\nexact = 0.5*sin((2*pi/n)*t).*sin(0.01*t);\ncorrupt = exact + 0.05*randn(size(exact));\n\ne = ones(n,1);\nD = spdiags([-e e], -1:0, n, n);\n\n% tradeoff curve\nnopts = 50;\nlambdas = logspace(-10,10,nopts);\nobj1 = zeros(1,nopts);\nobj2 = zeros(1,nopts);\n\nfprintf(1,'Generating the optimal trade-off curve for different values of delta...\\n');\nfor i=1:nopts\n    disp(['* delta = ' num2str(lambdas(i))]);\n    cvx_begin quiet\n        variable x(n)\n        minimize ( norm(x - corrupt) + lambdas(i)*norm(D*x) )\n    cvx_end\n    obj1(i) = norm(x - corrupt);\n    obj2(i) = norm(D*x);\nend\nfprintf(1,'Done! \\n');\n\n% Plots\nplot(obj1, obj2)\nxlabel('||x - x_{cor}||_2');\nylabel('||Dx||_2');\ntitle('Optimal trade-off curve');\n% print -deps smoothrec_tradeoff.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/penalty_comp_cvx.m",
    "content": "% Figure 6.2: Penalty function approximation\n% Section 6.1.2\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX Argyris Zymnis - 10/2005\n%\n% Comparison of the ell1, ell2, deadzone-linear and log-barrier\n% penalty functions for the approximation problem:\n%       minimize phi(A*x-b),\n%\n% where phi(x) is the penalty function\n% Log-barrier will be implemented in the future version of CVX\n\n% Generate input data\nrandn('state',0);\nm=100; n=30;\nA = randn(m,n);\nb = randn(m,1);\n\n% ell_1 approximation\n% minimize   ||Ax+b||_1\ndisp('ell-one approximation');\ncvx_begin\n    variable x1(n)\n    minimize(norm(A*x1+b,1))\ncvx_end\n\n% ell_2 approximation\n% minimize ||Ax+b||_2\ndisp('ell-2');\nx2=-A\\b;\n\n% deadzone penalty approximation\n% minimize sum(deadzone(Ax+b,0.5))\n% deadzone(y,z) = max(abs(y)-z,0)\ndz = 0.5;\ndisp('deadzone penalty');\ncvx_begin\n    variable xdz(n)\n    minimize(sum(max(abs(A*xdz+b)-dz,0)))\ncvx_end\n\n\n% log-barrier penalty approximation\n%\n% minimize -sum log(1-(ai'*x+bi)^2)\n\ndisp('log-barrier')\n\n% parameters for Newton Method & line search\nalpha=.01; beta=.5;\n\n% minimize linfty norm to get starting point\ncvx_begin\n    variable xlb(n)\n    minimize norm(A*xlb+b,Inf)\ncvx_end\nlinf = cvx_optval;\nA = A/(1.1*linf);\nb = b/(1.1*linf);\n\nfor iters = 1:50\n\n   yp = 1 - (A*xlb+b);  ym = (A*xlb+b) + 1;\n   f = -sum(log(yp)) - sum(log(ym));\n   g = A'*(1./yp) - A'*(1./ym);\n   H = A'*diag(1./(yp.^2) + 1./(ym.^2))*A;\n   v = -H\\g;\n   fprime = g'*v;\n   ntdecr = sqrt(-fprime);\n   if (ntdecr < 1e-5), break; end;\n\n   t = 1;\n   newx = xlb + t*v;\n   while ((min(1-(A*newx +b)) < 0) | (min((A*newx +b)+1) < 0))\n       t = beta*t;\n       newx = xlb + t*v;\n   end;\n   newf = -sum(log(1 - (A*newx+b))) - sum(log(1+(A*newx+b)));\n   while (newf > f + alpha*t*fprime)\n       t = beta*t;\n       newx = xlb + t*v;\n       newf = -sum(log(1-(A*newx+b))) - sum(log(1+(A*newx+b)));\n   end;\n   xlb = xlb+t*v;\nend\n\n\n% Plot histogram of residuals\n\nss = max(abs([A*x1+b; A*x2+b; A*xdz+b;  A*xlb+b]));\ntt = -ceil(ss):0.05:ceil(ss);  % sets center for each bin\n[N1,hist1] = hist(A*x1+b,tt);\n[N2,hist2] = hist(A*x2+b,tt);\n[N3,hist3] = hist(A*xdz+b,tt);\n[N4,hist4] = hist(A*xlb+b,tt);\n\n\nrange_max=2.0;  rr=-range_max:1e-2:range_max;\n\nfigure(1), clf, hold off\nsubplot(4,1,1),\nbar(hist1,N1);\nhold on\nplot(rr, abs(rr)*40/3, '-');\nylabel('p=1')\naxis([-range_max range_max 0 40]);\nhold off\n\nsubplot(4,1,2),\nbar(hist2,N2);\nhold on;\nplot(rr,2*rr.^2),\nylabel('p=2')\naxis([-range_max range_max 0 11]);\nhold off\n\nsubplot(4,1,3),\nbar(hist3,N3);\nhold on\nplot(rr,30/3*max(0,abs(rr)-dz))\nylabel('Deadzone')\naxis([-range_max range_max 0 25]);\nhold off\n\nsubplot(4,1,4),\nbar(hist4,N4);\nrr_lb=linspace(-1+(1e-6),1-(1e-6),600);\nhold on\nplot(rr_lb, -3*log(1-rr_lb.^2),rr,2*rr.^2,'--')\naxis([-range_max range_max 0 11]);\nylabel('Log barrier'),\nxlabel('r')\nhold off\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/preference_regions.m",
    "content": "% Example 6.9: Bounding consumer preference\n% Section 6.5.5, Figures 6.25-6.26\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX Argyris Zymnis - 11/30/2005\n%\n% We are given a set of consumer preference data for bundles\n% of two goods x_1 and x_2. These points are generated by\n% taking 40 random points and comparing them using the\n% utility function: u(x_1,x_2) = (1.1*sqrt(x_1)+0.8*sqrt(x_2))/1.9\n% Then, if we have u(i) >= u(j) we say that (i,j) is in Pweak.\n%\n% Given this, we wish to compare the point (0.5,0.5) to each\n% of the bundles in the given dataset. I.e. for each point k in the\n% dataset, we wish to decide wether u(k) >= u(0) or u(k) <= u(0),\n% or both, in which case we cannot make any conclusions about\n% consumer preferences.\n%\n% To do this, we have to solve two LPs for each point:\n%       minimize     u(k) - u(0)\n%       subject to   g_i  >= 0\n%                    u(j) <= u(i) + g_i^T(a_j - a_i), for all i,j\n%                    u(i) >= u(j), for all (i,j) in Pweak\n%\n% and:\n%       maximize     u(k) - u(0)\n%       subject to   g_i  >= 0\n%                    u(j) <= u(i) + g_i^T(a_j - a_i), for all i,j\n%                    u(i) >= u(j), for all (i,j) in Pweak\n%\n% If the second LP has a strictly negative solution, we can deduce that\n% u(k) < u(0). If on the other hand the second LP has a nonnegative\n% solution and the first LP has a strictly positive solution, we can\n% deduce that u(k) > u(0). Finally if none of the two previous cases\n% holds, we cannot make a decision between the two bundles.\n%\n% NOTE: This file requires the auxilliary function utilfun.m to run.\n\ndata= [...\n   4.5e-01   9.6e-01\n   2.1e-01   3.4e-01\n   9.6e-01   3.0e-02\n   8.0e-02   9.2e-01\n   2.0e-02   2.2e-01\n   0.0e+00   3.9e-01\n   2.6e-01   6.4e-01\n   3.5e-01   9.7e-01\n   9.1e-01   7.8e-01\n   1.2e-01   1.4e-01\n   5.8e-01   8.4e-01\n   4.9e-01   2.7e-01\n   7.0e-02   8.0e-01\n   9.3e-01   8.7e-01\n   4.4e-01   8.6e-01\n   3.3e-01   4.2e-01\n   8.9e-01   9.0e-01\n   4.9e-01   7.0e-02\n   9.5e-01   3.3e-01\n   6.6e-01   2.6e-01\n   9.5e-01   7.3e-01\n   4.2e-01   9.1e-01\n   6.8e-01   2.0e-01\n   5.2e-01   6.2e-01\n   7.7e-01   6.3e-01\n   2.0e-02   2.9e-01\n   9.8e-01   2.0e-02\n   5.0e-02   7.9e-01\n   7.9e-01   1.9e-01\n   6.2e-01   6.0e-02\n   2.8e-01   8.7e-01\n   6.9e-01   1.0e-01\n   6.9e-01   3.7e-01\n   0.0e+00   7.2e-01\n   8.7e-01   1.7e-01\n   6.3e-01   4.0e-02\n   3.2e-01   7.3e-01\n   4.0e-02   4.6e-01\n   3.6e-01   9.5e-01\n   8.2e-01   6.7e-01 ];\n\n% objective point\nobj=[0.5,0.5];\n\nfigure(1);\n% display the utility function's level sets on some data points.\n\nplot(data(:,1),data(:,2),'o');\nhold on;\n\n[X,Y] = meshgrid(0:.01:1,0:.01:1);\nZ=(1.1*X.^(1/2)+0.8*Y.^(1/2))/1.9;\n\n[C,h] = contour(X,Y,Z,[.1,.2,.3,.4,.5,.6,.7,.8,.9],'--');\nclear X Y Z C\nhold off;\nxlabel('x_1');\nylabel('x_2');\nhold off\n\nm = size(data,1);  % number of baskets, including 0,1\n\n% add preference data\nPweak = zeros(m+1,m+1);\nfor i=1:m,\n   for j=1:m\n      if (i~=j) & (1.1*data(i,1).^(1/2)+0.8*data(i,2).^(1/2))/1.9 >= ...\n             (1.1*data(j,1).^(1/2)+0.8*data(j,2).^(1/2))/1.9,\n         Pweak(i,j) = 1;\n      end;\n   end;\nend;\n\n% Find consumer preferences\ndata = [data; 0.5 0.5];\nbounds = zeros(m,2);\nfor k = 1:m\n    fprintf(1,'Deciding on bundle %d of %d: ',k,m);\n\n    % Check for u(k) >= u(0.5,0.5)\n    cvx_begin quiet\n        variables u(m+1) g_x(m+1) g_y(m+1)\n        minimize(u(k)-u(m+1))\n        subject to\n            g_x >= 0;\n            g_y >= 0;\n            ones(m+1,1)*u' <= u*ones(1,m+1)+(g_x*ones(1,m+1)).*...\n              (ones(m+1,1)*data(:,1)'-data(:,1)*ones(1,m+1))+...\n              (g_y*ones(1,m+1)).*(ones(m+1,1)*data(:,2)'-data(:,2)*ones(1,m+1));\n            (u*ones(1,m+1)).*Pweak >= (ones(m+1,1)*u').*Pweak;\n    cvx_end\n    bounds(k,1) = cvx_optval;\n    fprintf( 1,'%g', round(cvx_optval) );\n\n    % Check for u(0.5,0.5) >= u(k)\n    cvx_begin quiet\n        variables u(m+1) g_x(m+1) g_y(m+1)\n        maximize(u(k)-u(m+1))\n        subject to\n            g_x >= 0;\n            g_y >= 0;\n            ones(m+1,1)*u' <= u*ones(1,m+1) + (g_x*ones(1,m+1)).*...\n              (ones(m+1,1)*data(:,1)'-data(:,1)*ones(1,m+1))+...\n              (g_y*ones(1,m+1)).*(ones(m+1,1)*data(:,2)'-data(:,2)*ones(1,m+1));\n            (u*ones(1,m+1)).*Pweak >= (ones(m+1,1)*u').*Pweak;\n    cvx_end\n    bounds(k,2) = cvx_optval;\n    fprintf( 1,' %g\\n', round(cvx_optval) );\n    \nend\n\nfigure(2);\nhold off\n\n% plot data pt and contour line through it\nval = 1.1*sqrt(0.5)+ 0.8*sqrt(.5);   % value at center\nt = linspace(((val-.8)/1.1)^2, 1, 1000);\ny = ( (val - 1.1*(t.^(1/2)))/.8 ).^2;\nplot(t,y,'--', [.5 .5], [0 1], ':', [0 1], [.5 .5], ':');\naxis([0 1 0 1]);\nhold on\n\nfor k=1:m\n   if bounds(k,2) < 1e-5,  % preferred over (.5,.5)\n      dot = plot(data(k,1),data(k,2),'o');\n      %'MarkerSize',8);\n   elseif bounds(k,1) > -1e-5,  % rejected in favor of (.5,.5)\n      dot = plot(data(k,1),data(k,2),'o','MarkerFaceColor',[0 0 0]);\n   else % no conclusion\n      dot = plot(data(k,1),data(k,2),'square', 'LineWidth',1.0,...\n           'MarkerSize',10);\n   end;\nend;\nxlabel('x_1');  ylabel('x_2');\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/regressor_cvx.m",
    "content": "% Example 6.4: Regressor selection problem\n% Section 6.3.1, Figure 6.7\n% Original by Lieven Vandenberghe\n% Adapted for CVX Argyris Zymnis - 10/2005\n%\n% Solves\n%        minimize   ||A*x-b||_2\n%        subject to card(x) <= k\n%\n% where card(x) denotes the number of nonzero elements in x,\n% by first solving (for some value of alpha close to ||x_ln||_1)\n%        minimize   ||A*x-b||_2\n%        subject to ||x||_1 <= alpha\n%\n% and iteratively decreasing alpha so as to get card(x) = k\n% The sparsity pattern is then fixed in A and b and\n%        minimize   ||A*x-b||_2\n%\n% is solved\n\nrand('state',0);\n\nm = 10;\nn = 20;\n\nA = randn(m,n);\nb = A*[randn(round(m/2),1); zeros(n-round(m/2),1)];\nb = b + 0.1*norm(b)*randn(m,1);\n\nif (1) %%%%%%%%%%%%\n\n% tradeoff curve for heuristic\n%\n% min.  ||Ax-b||_2\n% s.t.  ||x||_1 <= alpha\n\nresiduals_heur = [norm(b)];\nxln = A'*((A*A')\\b);\nlnorm = norm(xln,1);\nnopts = 100;\nalphas = linspace(0,lnorm,nopts);\nresiduals_heur = [norm(b)];\ncard_heur = [0];\n\n\nfor k=2:(nopts-1)\n  alpha = alphas(k);\n\n  cvx_begin quiet\n    variable x(n)\n    minimize(norm(A*x-b))\n    subject to\n        norm(x,1) <= alpha;\n  cvx_end\n\n  x(find(abs(x) < 1e-3*max(abs(x)))) = 0;\n  ind = find(abs(x));\n  sparsity = length(ind);\n  fprintf(1,'Current sparsity pattern k = %d \\n',sparsity);\n  x = zeros(n,1);  x(ind) = A(:,ind)\\b;\n  card_heur = [card_heur, sparsity];\n  residuals_heur = [residuals_heur, norm(A*x-b)];\nend;\n\nobj1 = norm(b)\nobj2 = [0];\n\ni=1;\nfor k=1:m-1\n  if ~isempty(find(card_heur == k))\n     obj2(i+1) = k;\n     obj1(i+1) = min(residuals_heur(find(card_heur ==k)));\n     i=i+1;\n  end;\nend;\nobj2(i) = m;  obj1(i) = 0;\n\nend; %%%%%%%%%%%%%%%%%%%\n\n\n% globally optimal tradeoff\n\n\nif (1) %%%%%%%%%%%%%\n\nbestx = zeros(n,m);\nbestres = zeros(1,m);\n\nfor k=1:m-1\n  k\n  % enumerate sparsity patterns with exactly k nonzeros\n  bestres(k) = Inf;\n  ind = 1:k\n  nocases = 1;\n  done = 0;\n  while ~done\n     done = 1;\n     for i=0:k-1\n       if (ind(k-i) < n-i),\n          ind(k-i:k) = ind(k-i)+[1:i+1];\n          done = 0;\n          break;\n       end;\n     end;\n     if done, break; end;\n     x = zeros(n,1);\n     x(ind) = A(:,ind)\\b;\n     if (norm(A*x-b) < bestres(k)),\n        bestres(k) = norm(A*x-b);\n        bestx(:,k) = x;\n     end;\n     nocases = nocases + 1;\n  end;\n  nocases\n  factorial(n)/(factorial(n-k)*factorial(k))\nend;\n\nx = A\\b;\nbestres(m) = norm(A*x-b);\nbestres = [norm(b) bestres];\n\nend; %%%%%%%%%\n\nfigure\nhold off\nobj1dbl =[];\nobj2dbl =[];\nfor i=1:length(obj1)-1\n  obj1dbl = [obj1dbl, obj1(i), obj1(i)];\n  obj2dbl = [obj2dbl, obj2(i), obj2(i+1)];\nend;\nobj1dbl = [obj1dbl, obj1(length(obj1))];\nobj2dbl = [obj2dbl, obj2(length(obj1))];\n\nbestobj1 = bestres;\nbestobj2 = [0:1:m];\nbestobj1dbl =[];\nbestobj2dbl =[];\nfor i=1:length(bestobj1)-1\n  bestobj1dbl = [bestobj1dbl, bestobj1(i), bestobj1(i)];\n  bestobj2dbl = [bestobj2dbl, bestobj2(i), bestobj2(i+1)];\nend;\nbestobj1dbl = [bestobj1dbl, bestobj1(length(bestobj1))];\nbestobj2dbl = [bestobj2dbl, bestobj2(length(bestobj1))];\n\nplot(obj1dbl,obj2dbl,'-', bestobj1dbl, bestobj2dbl,'--');\nhold on\nplot(obj1,obj2,'o', bestobj1, bestobj2,'o');\naxis([0 ceil(2*norm(b))/2 0 m+1])\nxlabel('x');\nylabel('y');\nhold off\n\n%print -deps sparse_regressor_global_helv.eps\n%save regressor_results\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/smoothrec_cvx.m",
    "content": "% Figures 6.8-6.10: Quadratic smoothing\n% Section 6.3.3\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX Argyris Zymnis - 10/2005\n%\n% Suppose we have a signal x, which does not vary too rapidly\n% and that x is corrupted by some small, rapidly varying noise v,\n% ie. x_cor = x + v. Then if we want to reconstruct x from x_cor\n% we should solve (with x_hat as the parameter)\n%        minimize ||x_hat - x_cor||_2 + lambda*phi_quad(x_hat)\n%\n% where phi_quad(x) = sum(x_(i+1)-x_i)^2 , for i = 1 to n-1.\n% The parameter lambda controls the ''smoothness'' of x_hat.\n%\n% The first figure which is generated shows the original and\n% the corrupted signals. The second figure shows the tradeoff curve\n% obtained when varying lambda and the third figure shows three\n% reconstructed signals.\n%\n% NOTE: This is not a good problem to use CVX on. By exploiting\n% the sparsity in this case, we can solve this problem much more\n% efficiently using least squares.\n\n\nrandn('state',0);\n\nn = 4000;  t = (0:n-1)';\nexact = 0.5*sin((2*pi/n)*t).*sin(0.01*t);\ncorrupt = exact + 0.05*randn(size(exact));\n\nfigure(1)\nsubplot(211)\nplot(t,exact,'-');\naxis([0 n -0.6 0.6])\ntitle('original signal');\nylabel('ya');\n\nsubplot(212)\nplot(t,corrupt,'-');\naxis([0 n -0.6 0.6])\nxlabel('x');\nylabel('yb');\ntitle('corrupted signal');\n%print -deps smoothrec_signals.eps % figure 6.8, page 313\n\nA = sparse(n-1,n);\nA(:,1:n-1) = -speye(n-1,n-1);  A(:,2:n) = A(:,2:n)+speye(n-1,n-1);\n\n% tradeoff curve, figure 6.9, page 313\nnopts = 100;\nlambdas = logspace(-10,10,nopts);\n\nobj1 = [];  obj2 = [];\n\nfprintf('computing 100 points on tradeoff curve ... \\n');\n\nfor i=1:nopts\n\n  lambda = lambdas(i);\n  cvx_begin quiet\n    variable x(n)\n    minimize(norm(x-corrupt)+lambda*norm(x(2:n)-x(1:n-1)))\n  cvx_end\n  obj1 = [obj1, norm(full(A*x))];\n  obj2 = [obj2, norm(full(x-corrupt))];\n\n  fprintf('tradeoff point %d\\n',i);\nend;\n\nfigure(2)\nplot(obj2,obj1,'-');  hold on;\nplot(0,norm(A*corrupt),'o');\nplot(norm(corrupt),0,'o');  hold off;\nxlabel('x');\nylabel('y');\ntitle('||xhat-xcorr||_2 vs. ||D xhat||_2');\n%print -deps smoothrec_tradeoff.eps % figure 6.9, page 313\n\n%three smooth signals, figure 6.10, page 314\nnopts = 3;\nalphas = [8 3 1];\nxrecon = [];\n\nfor i=1:3\n   fprintf(1,'Reconstructed Signals: %d of 3 \\n',i)\n   alpha = alphas(i);\n   cvx_begin quiet\n    variable x(n)\n    minimize(norm(x(2:n)-x(1:n-1)))\n    subject to\n        norm(x-corrupt) <= alpha;\n   cvx_end\n   xrecon = [xrecon, x];\n\nend\n\nfigure(3)\nsubplot(311), plot(xrecon(:,1));\naxis([0 n -0.6 0.6])\nylabel('ya');\ntitle('||xhat-xcorr||_2=8');\nsubplot(312), plot(xrecon(:,2));\naxis([0 n -0.6 0.6])\nylabel('yb');\ntitle('||xhat-xcorr||_2=3');\nsubplot(313), plot(xrecon(:,3));\naxis([0 n -0.6 0.6])\nxlabel('x');\nylabel('yc');\ntitle('||xhat-xcorr||_2=1');\n%print -deps smoothrec_results.eps % figure 6.10, page 314\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/tv_cvx.m",
    "content": "% Figures 6.11-6.14: Total variation reconstruction\n% Section 6.3.3\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX Argyris Zymnis - 10/2005\n%\n% Suppose we have a signal x, which is mostly smooth, but has several\n% rapid variations (or jumps). If we apply quadratic smoothing on\n% this signal (see SMOOTHREC_CVX) then in order to remove the noise\n% we will not be able to preserve the signal's sharp transitions.\n%\n% We can instead apply total variation reconstruction on the signal\n% by solving\n%        minimize ||x_hat - x_cor||_2 + lambda*TV(x_hat)\n%\n% where TV(x) = sum(abs(x_(i+1)-x_i)) , for i = 1 to n-1.\n% The parameter lambda controls the ''smoothness'' of x_hat.\n%\n% Figure 1 shows the original and corrupted signals.\n% Figure 2 shows the tradeoff curve obtained when varying lambda\n% and figure 3 shows three reconstructed signals with different\n% total variation.\n%\n% Figure 4 is a tradeoff curve for quadratic smoothing, while figure 5\n% shows three reconstructed signals with quadratic smoothing.\n% Note how TV reconstruction does a better job of preserving the\n% sharp transitions in the signal while removing the noise.\n\nn = 2000;  % length of signal\nt = (0:n)';\n\nfigure(1)\nsubplot(211)\ntemp = ones(ceil((n+1)/4),1);\nexact= [temp; -temp; temp; -temp];\nexact = exact(1:n+1) + 0.5*sin((2*pi/n)*t);\nplot(t,exact,'-');\naxis([0 n+10 -2 2]);\nylabel('ya');\ntitle('signal');\nexact_variation = sum(abs(exact(2:(n+1)) - exact(1:n)))\n\nsubplot(212)\nnoise = 0.1*randn(size(t));\ncorrupt = exact+noise;\nplot(t,corrupt,'-');\naxis([0 n+10 -2 2]);\nnoisy_variation = sum(abs(corrupt(2:(n+1)) - corrupt(1:n)))\nylabel('yb');\nxlabel('x');\ntitle('corrupted signal');\n%print -deps tv_exact_corrupt.eps % figure 6.11, page 315\n\n% tradeoff curve, total variation vs ||x-xcorr||_2\n% figure 6.13 page 316\nfprintf('computing 100 points on tradeoff curve ... \\n');\nnopts = 100;\nTVs = linspace(0.01,.9*noisy_variation,nopts);\n\n   obj1 = [];  obj2 = [];\n   for i=1:nopts\n     fprintf('tradeoff point %d\\n',i);\n     cvx_begin quiet\n        variable xrec(n+1)\n        minimize(norm(xrec-corrupt))\n        subject to\n            norm(xrec(2:(n+1))-xrec(1:n),1) <= TVs(i);\n     cvx_end\n     obj1 = [obj1, TVs(i)];\n     obj2 = [obj2, norm(full(xrec-corrupt))];\n   end;\n   obj1 = [0 obj1 noisy_variation];\n   obj2 = [norm(corrupt) obj2 0];\n\nfigure(2)\n   plot(obj2,obj1,'-'); hold on\n   plot(0,noisy_variation,'o');\n   plot(norm(corrupt),0,'o');  hold off\n   xlabel('x');\n   ylabel('y');\n   title('||Dxhat||_1 versus ||xhat-x||_2');\n   %print -deps tv_tradeoff.eps % figure 6.13, page 316\n\nfigure(3)\n   subplot(311)\n   % solve total variation problem\n   cvx_begin quiet\n    variable xrec(n+1)\n    minimize(norm(xrec-corrupt))\n    subject to\n        norm(xrec(2:(n+1))-xrec(1:n),1) <= 10;\n   cvx_end\n   plot(t,xrec','-');\n   axis([0 n -2 2]);\n   ylabel('ya');\n   title('xhat with TV=10');\n\n   subplot(312)\n   cvx_begin quiet\n    variable xrec(n+1)\n    minimize(norm(xrec-corrupt))\n    subject to\n        norm(xrec(2:(n+1))-xrec(1:n),1) <= 8;\n   cvx_end\n   plot(t,xrec','-');\n   axis([0 n -2 2]);\n   ylabel('yb');\n   title('xhat with TV=8');\n\n   subplot(313)\n   cvx_begin quiet\n    variable xrec(n+1)\n    minimize(norm(xrec-corrupt))\n    subject to\n        norm(xrec(2:(n+1))-xrec(1:n),1) <= 5;\n   cvx_end\n   plot(t,xrec','-');\n   axis([0 n -2 2]);\n   xlabel('x');\n   ylabel('yc');\n   title('xhat with TV=5');\n\n   %print -deps tv_rec_10_8_5.eps % figure 6.14, page 317\n\n% quadratic smoothing, figure 6.12, page 316\n% In this case it is not a good idea to use CVX\n% as the sparsity in the closed form solution\n% makes it very easy to solve directly\nA = sparse(n,n+1);\nA(:,1:n) = -speye(n,n);  A(:,2:n+1) = A(:,2:n+1)+speye(n,n);\n\n% tradeoff curve with quadratic smoothing\nnopts = 100;\nlambdas = logspace(-10,10,nopts);\nobj1 = [];  obj2 = [];\nfor i=1:nopts\n\n  lambda = lambdas(i);\n  x = (A'*A+lambda*speye(n+1,n+1)) \\ (lambda*corrupt);\n  obj1 = [obj1, norm(full(A*x))];\n  obj2 = [obj2, norm(full(x-corrupt))];\nend;\n\nfigure(4)\nplot(obj2,obj1,'-'); hold on\nplot(0,norm(A*corrupt),'o');\nplot(norm(corrupt),0,'o'); hold off\nxlabel('x');\nylabel('y');\ntitle('||Dxhat||_2 vs ||xhat-xcor||_2');\n%print -deps tv_smooth_tradeoff.eps\n\nnopts = 3;\nalphas = [10 7 4];\nxrecon = [];\n\nfor i=1:3\n   alpha = alphas(i);\n   u = 10;  l = -10;  normx = Inf;\n   while (abs(normx-alpha) > 1e-3)\n      lambda = 10^((u+l)/2);\n      x = (A'*A+lambda*speye(n+1,n+1)) \\ (lambda*corrupt);\n      normx = norm(x-corrupt);\n      if (normx > alpha), l = (u+l)/2; else u = (u+l)/2;  end;\n   end;\n   xrecon = [xrecon, x];\n\nend;\n\nfigure(5)\nsubplot(311), plot(xrecon(:,1));\naxis([0 n -2 2])\nylabel('ya');\ntitle('quadratic smoothing with ||xhat-xcor||_2=10');\nsubplot(312), plot(xrecon(:,2));\naxis([0 n -2 2])\nylabel('yb');\ntitle('quadratic smoothing with ||xhat-xcor||_2=7');\nsubplot(313), plot(xrecon(:,3));\naxis([0 n -2 2])\nxlabel('x');\nylabel('yc');\ntitle('quadratic smoothing with ||xhat-xcor||_2=4');\n%print -deps tv_smooth_tradeoff_examples.eps\n% figure 6.12, page 316\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch06_approx_fitting/wcrobls.m",
    "content": "% Example 6.6: Comparison of worst-case robust, Tikhonov, and nominal least squares\n% Section 6.4.2, Figure 6.16\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX Argyris Zymnis - 11/27/05\n% (a figure is generated)\n%\n% Consider the least-squares problem:\n%       minimize ||(A0 + u1*A1 + u2*A2)x - b||_2\n% where u = [u1 u2]' is an uncertain parameter and ||u||_2 <= 1\n% Three approximate solutions are found:\n%   1- nominal optimal (i.e. letting u=0)\n%   2- Tikhonov Regularized Solution:\n%           minimize ||A0*x - b||_2 + delta*||x||_2\n%      for some delta (in this case we set delta = 0.1)\n%   3- worst-case robust approximation:\n%           minimize sup{||u||_2 <= 1} ||(A0 + u1*A1 + u2*A2)x - b||_2)\n%      (reduces to solving an SDP, see pages 323-324 in the book)\n\nm = 50;\nn = 20;\nrandn('state',0);\nrand('state',0);\n\nA0 = randn(m,n);\n[U,S,V] = svd(A0);\nS= diag(fliplr(logspace(-0.7,1,n)));\nA0 = U(:,1:n)*S*V';\nA1 = randn(m,n);  A1 = A1/norm(A1);\nA2 = randn(m,n);  A2 = A2/norm(A2);\n\nAperb0 = [A1;A2];\np = 2;\n\nb = U(:,1:n)*randn(n,1) + .1*randn(m,1);\n\n% we consider LS problems || (A0 + u1*A1 + u2*A2) x - b||\n% where  ||u|| leq rho\n\n% Nominal Solution\nxnom = A0\\b;\n\n% Tikhonov Regularized Solution\ndelta = .1;\nxtych =  [A0; sqrt(delta)*eye(n)] \\ [b; zeros(n,1)];\n\n% Robust Least Squares solution\ncvx_begin sdp quiet\n    variables t lambda xrob(n)\n    minimize(t+lambda)\n    subject to\n        [eye(m) A1*xrob A2*xrob A0*xrob-b; ...\n         [A1*xrob A2*xrob]' lambda*eye(2) zeros(2,1); ...\n         [A0*xrob-b]' zeros(1,2) t] >= 0;\ncvx_end\n\n% Generate Random Trials\nnotrials=100000;\nr = sqrt(rand(notrials,1));     % random on [0,1] with pdf g(r) = 2r;\ntheta = 2*pi*rand(notrials,1);  % uniform on [0,2pi]\nv = [r.*cos(theta)  r.*sin(theta)];\nls_res = zeros(1,notrials);\nrob2_res = zeros(1,notrials);\nrob_res = zeros(1,notrials);\ntych_res = zeros(1,notrials);\n\nfor i =1:notrials\n\n  A = A0 + v(i,1)*A1 + v(i,2)*A2;\n  ls_res(i) = norm(A*xnom-b);\n  rob_res(i) = norm(A*xrob-b);\n  tych_res(i) = norm(A*xtych-b);\n\nend;\n\n\n% Plot histograms\nfigure\n%subplot(211)\n[N1, hist1] = hist(ls_res,[min(ls_res):.1:max(ls_res)]);\nfreq1 = N1/notrials;\n[N2, hist2] = hist(rob_res,hist1);\nfreq2 = N2/notrials;\n[N3, hist3] = hist(tych_res,hist1);\nfreq3 = N3/notrials;\n\n\n\nh = bar(hist3,freq3);\ntext(3, 0.07, 'Tikhonov');\nset(h,'FaceColor',0.90*[1 1 1]);\nhold on\n\nh = bar(hist2,freq2);\ntext(4.2, 0.05, 'Nominal');\nset(h,'FaceColor',0.80*[1 1 1]);\n\nh = bar(hist2,freq2);\nset(h,'FaceColor','none');\ntext(2.6, 0.2, 'Robust LS');\n\nh = bar(hist3,freq3);\nset(h,'FaceColor','none');\nh = bar(hist1,freq1);\nset(h,'FaceColor','none');\n\nxlabel('||(A0 + u1*A1 + u2*A2)*x - b||_2')\nylabel('Frequency')\nhold off\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/Contents.m",
    "content": "% Chapter 7: Statistical estimation\n%\n%  counting_problem_poisson.m - Section 7.1.1: Counting problems with Poisson distribution\n%  ML_covariance_est.m        - Section 7.1.1: Covariance estimation for Gaussian variables\n%  probbounds.m               - Section 7.4.3: Probability bounds example with Voronoi diagram\n%  expdesign.m                - Section 7.5.2: Experiment design\n%  logistics.m                - Figure 7.1: Logistic regression\n%  logistics_gp.m             - Figure 7.1: Logistic regression (GP version)\n%  maxent.m                   - Example 7.2: Maximum entropy distribution\n%  detector2.m                - Example 7.4: Binary hypothesis testing\n%  cheb.m                     - Computes Chebyshev lower bounds on probability vectors\n%  cher.m                     - Computes Chernoff upper bounds on probability\n%  montecarlo.m               - Probability estimate using Monte Carlo methods\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/ML_covariance_est.m",
    "content": "% Section 7.1.1: Covariance estimation for Gaussian variables\n% Boyd & Vandenberghe \"Convex Optimization\" \n% Joëlle Skaf - 04/24/08 \n% \n% Suppose y \\in\\reals^n is a Gaussian random variable with zero mean and \n% covariance matrix R = \\Expect(yy^T). We want to estimate the covariance \n% matrix R based on N independent samples y1,...,yN drawn from the \n% distribution, and using prior knowledge about R (lower and upper bounds \n% on R) \n%           L <= R <= U \n% Let S be R^{-1}. The maximum likelihood (ML) estimate of S is found \n% by solving the problem \n%           maximize    logdet(S) - tr(SY) \n%           subject to  U^{-1} <= S <= L^{-1} \n% where Y is the sample covariance of y1,...,yN. \n\n% Input data \nrandn('state',0);\nn = 10; \nN = 1000; \ntmp = randn(n); \nL = tmp*tmp'; \ntmp = randn(n);\nU = L + tmp*tmp'; \nR = (L+U)/2; \ny_sample = sqrtm(R)*randn(n,N); \nY = cov(y_sample'); \nUi = inv(U); Ui = 0.5*(Ui+Ui');\nLi = inv(L); Li = 0.5*(Li+Li');\n\n% Maximum likelihood estimate of R^{-1} \ncvx_begin sdp\n    variable S(n,n) symmetric \n    maximize( log_det(S) - trace(S*Y) );\n    S >= Ui;\n    S <= Li;\ncvx_end\nR_hat = inv(S);\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/cheb.m",
    "content": "function [cvx_optval,P,q,r,X,lambda] = cheb(A,b,Sigma);\n\n% Computes Chebyshev lower bounds on probability vectors\n%\n% Calculates a lower bound on the probability that a random vector\n% x with mean zero and covariance Sigma satisfies A x <= b\n%\n% Sigma must be positive definite\n%\n% output arguments:\n% - prob: lower bound on probability\n% - P,q,r: x'*P*x + 2*q'*x + r is a quadratic function\n%   that majorizes the 0-1 indicator function of the complement\n%   of the polyhedron,\n% - X, lambda:  a discrete distribution with mean zero, covariance\n%   Sigma and Prob(X not in C)  >= 1-prob\n\n%\n% maximize  1 - Tr Sigma*P - r\n% s.t.      [ P  q     ]             [ 0      a_i/2 ]\n%           [ q' r - 1 ] >= tau(i) * [ a_i'/2  -b_i ], i=1,...,m\n%           taui >= 0\n%           [ P q  ]\n%           [ q' r ] >= 0\n%\n% variables P in Sn, q in Rn, r in R\n%\n\n[ m, n ] = size( A );\ncvx_begin sdp quiet\n    variable P(n,n) symmetric\n    variables q(n) r tau(m)\n    dual variables Z{m}\n    maximize( 1 - trace( Sigma * P ) - r )\n    subject to\n        for i = 1 : m,\n            qadj = q - 0.5 * tau(i) * A(i,:)';\n            radj = r - 1 + tau(i) * b(i);\n            [ P, qadj ; qadj', radj ] >= 0 : Z{i};\n        end\n        [ P, q ; q', r ] >= 0;\n        tau >= 0;\ncvx_end\n\nif nargout < 4,\n    return\nend\n\nX = [];\nlambda = [];\nfor i=1:m\n   Zi = Z{i};\n   if (abs(Zi(3,3)) > 1e-4)\n      lambda = [lambda; Zi(3,3)];\n      X = [X Zi(1:2,3)/Zi(3,3)];\n   end;\nend;\nmu = 1-sum(lambda);\nif (mu>1e-5)\n   w = (-X*lambda)/mu;\n   W = (Sigma - X*diag(lambda)*X')/mu;\n   [v,d] = eig(W-w*w');\n   d = diag(d);\n   s = sum(d>1e-5);\n   if (d(1) > 1e-5)\n      X = [X w+sqrt(s)*sqrt(d(1))*v(:,1) ...\n            w-sqrt(s)*sqrt(d(1))*v(:,1)];\n      lambda = [lambda; mu/(2*s); mu/(2*s)];\n   elseif (d(2) > 1e-5)\n      X = [X w+sqrt(s)*sqrt(d(2))*v(:,2) ...\n            w-sqrt(s)*sqrt(d(2))*v(:,2)];\n      lambda = [lambda; mu/(2*s); mu/(2*s)];\n   else\n      X = [X w];\n      lambda = [lambda; mu];\n   end;\nend;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/cher.m",
    "content": "function prob = cher( A, b, Sigma );\n\n% Computes Chernoff upper bounds on probability\n%\n% Computes a bound on the probability that a Gaussian random vector\n% N(0,Sigma) satisfies A x <= b, by solving a QP\n%\n\n[ m, n ] = size( A );\ncvx_begin quiet\n    variable u( m )\n    minimize( b' * u + 0.5 * sum_square( chol( Sigma ) * A' * u ) )\n    subject to\n        u >= 0;\ncvx_end\nprob = exp( cvx_optval );\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/counting_problem_poisson.m",
    "content": "% Section 7.1.1: Counting problems with Poisson distribution \n% Boyd & Vandenberghe \"Convex Optimization\" \n% Joëlle Skaf - 04/24/08 \n%\n% The random variable y is nonnegative and integer valued with a Poisson\n% distribution with mean mu > 0. In a simple statistical model, the mean mu\n% is modeled as an affine function of a vector u: mu = a'*u + b.\n% We are given a number of observations which consist of pairs (u_i,y_i), \n% i = 1,..., m, where y_i is the observed value of y for which the value of\n% the explanatory variable is u_i. We find a maximum likelihood estimate of\n% the model parameters a and b from these data by solving the problem \n%           maximize    sum_{i=1}^m (y_i*log(a'*u_i + b) - (a'*u_i + b))\n% where the variables are a and b. \n\n% Input data\nrand('state',0);\nn = 10; \nm = 100; \natrue = rand(n,1); \nbtrue = rand; \n\nu = rand(n,m);\nmu = atrue'*u + btrue; \n\n% Generate random variables y from a Poisson distribution\n% (The distribution is actually truncated at 10*max(mu) for simplicity)\nL  = exp(-mu);\nns = ceil(max(10*mu));\ny  = sum(cumprod(rand(ns,m))>=L(ones(ns,1),:));\n\n% Maximum likelihood estimate of model parameters \ncvx_begin \n    variables a(n) b(1) \n    maximize sum(y.*log(a'*u+b) - (a'*u+b))\ncvx_end    \n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/detector2.m",
    "content": "% Example 7.4: Binary hypothesis testing\n% Figure 7.4\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original version by Lieven Vandenberghe\n% Updated for CVX by Michael Grant, 2005-12-19\n\n% Generate the data\nP = [0.70  0.10\n     0.20  0.10\n     0.05  0.70\n     0.05  0.10];\n[n,m] = size(P);\n\n% Construct the tradeoff curve by finding the\n% the Pareto optimal deterministic detectors,\n% which are the curve's vertices\n\nnopts   = 1000;\nweights = logspace(-5,5,nopts);\nobj     = [0;1];\ninds    = ones(n,1);\n\n% minimize  -t1'*q1 - w*t2'*q2\n% s.t.      t1+t2 = 1,  t1,t2 \\geq 0\n\nnext = 2;\nfor i = 1 : nopts,\n   PW = P * diag( [ 1 ; weights(i) ] );\n   [ maxvals, maxinds ] = max( PW' );  % max elt in each row\n   if (~isequal(maxinds', inds(:,next-1)))\n       inds(:,next) = maxinds';\n       T = zeros(m,n);\n       for j=1:n\n          T(maxinds(1,j),j) = 1;\n       end;\n       obj(:,next) = 1-diag(T*P);\n       next = next+1;\n   end;\nend;\nplot(obj(1,:), obj(2,:),[0 1], [0 1],'--');\ngrid on\nfor i=2:size(obj,2)-1\n   text(obj(1,i),obj(2,i),['a', num2str(i-1)]);\nend;\n\n% Minimax detector: not deterministic\n\ncvx_begin\n    variables T( m, n ) D( m, m )\n    minimize max( D(1,2), D(2,1) )\n    subject to\n        D == T * P;\n        sum( T, 1 ) == 1;\n        T >= 0;\ncvx_end\n\nobjmp = 1 - diag( D );\ntext( objmp(1), objmp(2), 'b' );\nxlabel('P_{fp}'); ylabel('P_{fn}');\n\n%print -deps roc.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/expdesign.m",
    "content": "% Section 7.5.2: Experiment design\n% Boyd & Vandenberghe, \"Convex Optimization\"\n% Original version by Lieven Vandenberghe\n% Updated for CVX by Almir Mutapcic - Jan 2006\n% (a figure is generated)\n%\n% This is an example of D-optimal, A-optimal, and E-optimal\n% experiment designs.\n\n% problem data\nm = 10;\nangles1 = linspace(3*pi/4,pi,m);\nangles2 = linspace(0,-pi/2,m);\n\n% sensor positions\nV = [3.0*[cos(angles1); sin(angles1)], ...\n     1.5*[cos(angles2); sin(angles2)]];\np = size(V,2);\nn = 2;\nnoangles = 5000;\n\n% D-optimal design\n%\n%      maximize    log det V*diag(lambda)*V'\n%      subject to  sum(lambda)=1,  lambda >=0\n%\n\n% setup the problem and solve it\ncvx_begin\n  variable lambda(p)\n  maximize ( det_rootn( V*diag(lambda)*V' ) )\n  subject to\n    sum(lambda) == 1;\n    lambda >= 0;\ncvx_end\nlambdaD = lambda; % save the solution for confidence ellipsoids\n\n% plot results\nfigure(1)\n% draw ellipsoid v'*W*v <= 2\nW = inv(V*diag(lambda)*V');\nangles = linspace(0,2*pi,noangles);\nR = chol(W);  % W = R'*R\nellipsoid = sqrt(2)*(R\\[cos(angles); sin(angles)]);\nd = plot(ellipsoid(1,:), ellipsoid(2,:), '--', 0,0,'+');\nset(d, 'Color', [0 0.5 0]); set(d(2),'MarkerFaceColor',[0 0.5 0]);\nhold on;\n\ndot=plot(V(1,:),V(2,:),'o');\nind = find(lambda > 0.001);\ndots = plot(V(1,ind),V(2,ind),'o');\nset(dots,'MarkerFaceColor','blue');\n\n% print out nonzero lambda\ndisp('Nonzero lambda values for D design:');\nfor i=1:length(ind)\n   text(V(1,ind(i)),V(2,ind(i)), ['l',int2str(ind(i))]);\n   disp(['lambda(',int2str(ind(i)),') = ', num2str(lambda(ind(i)))]);\nend;\n\n%axis([-4.5 4.5 -4.5 4.5])\naxis([-5 5 -5 5])\nset(gca,'Xtick',[]);\nset(gca,'Ytick',[]);\nhold off, axis off\n% print -deps Ddesign.eps\n\n% A-optimal design\n%\n%      minimize    Trace (sum_i lambdai*vi*vi')^{-1}\n%      subject to  lambda >= 0, 1'*lambda = 1\n%\n\n% SDP formulation\ne = eye(2,2);\ncvx_begin sdp\n  variables lambda(p) u(n)\n  minimize ( sum(u) )\n  subject to\n    for k = 1:n\n      [ V*diag(lambda)*V'  e(:,k);\n        e(k,:)             u(k)   ] >= 0;\n    end\n    sum(lambda) == 1;\n    lambda >= 0;\ncvx_end\nlambdaA = lambda; % save the solution for confidence ellipsoids\n\n% plot results\nfigure(2)\n% draw ellipsoid v'*W*v <= mu\nW = inv(V*diag(lambda)*V')^2;\nmu = diag(V'*W*V);\nmu = mean(mu(ind));\nangles = linspace(0,2*pi,noangles);\nR = chol(W);  % W = R'*R\nellipsoid = sqrt(mu)*(R\\[cos(angles); sin(angles)]);\nd = plot(ellipsoid(1,:), ellipsoid(2,:), '--',0,0,'+');\nset(d, 'Color', [0 0.5 0]);\nset(d(2), 'MarkerFaceColor', [0 0.5 0]);\nhold on\n\ndot = plot(V(1,:),V(2,:),'o');\nind = find(lambda > 0.001);\ndots = plot(V(1,ind),V(2,ind),'o');\nset(dots,'MarkerFaceColor','blue');\n\ndisp('Nonzero lambda values for A design:');\nfor i=1:length(ind)\n   text(V(1,ind(i)),V(2,ind(i)), ['l',int2str(ind(i))]);\n   disp(['lambda(',int2str(ind(i)),') = ', num2str(lambda(ind(i)))]);\nend;\n%axis([-4.5 4.5 -4.5 4.5])\naxis([-5 5 -5 5])\nset(gca,'Xtick',[]);\nset(gca,'Ytick',[]);\naxis off, hold off\n% print -deps Adesign.eps\n\n% E-optimal design\n%\n%      minimize    w\n%      subject to  sum_i lambda_i*vi*vi' >= w*I\n%                  lambda >= 0,  1'*lambda = 1;\n%\n\ncvx_begin sdp\n  variables t lambda(p)\n  maximize ( t )\n  subject to\n    V*diag(lambda)*V' >= t*eye(n,n);\n    sum(lambda) == 1;\n    lambda >= 0;\ncvx_end\n\nlambdaE = lambda; % save the solution for confidence ellipsoids\n\nfigure(3)\n% draw ellipsoid v'*W*v <= mu\nmu = diag(V'*W*V);\nmu = mean(mu(ind));\nangles = linspace(0,2*pi,noangles);\nR = chol(W);  % W = R'*R\nellipsoid = sqrt(mu)*(R\\[cos(angles); sin(angles)]);\nd = plot(ellipsoid(1,:), ellipsoid(2,:), '--', 0, 0, '+');\nset(d, 'Color', [0 0.5 0]);\nset(d(2), 'MarkerFaceColor', [0 0.5 0]);\nhold on\n\ndot = plot(V(1,:),V(2,:),'o');\nlambda = lambda(1:p);\nind = find(lambda > 0.001);\ndots = plot(V(1,ind),V(2,ind),'o');\nset(dots,'MarkerFaceColor','blue');\n\ndisp('Nonzero lambda values for E design:');\nfor i=1:length(ind)\n   text(V(1,ind(i)),V(2,ind(i)), ['l',int2str(ind(i))]);\n   disp(['lambda(',int2str(ind(i)),') = ', num2str(lambda(ind(i)))]);\nend;\n%axis([-4.5 4.5 -4.5 4.5])\naxis([-5 5 -5 5])\nset(gca,'Xtick',[]);\nset(gca,'Ytick',[]);\naxis off, hold off\n% print -deps Edesign.eps\n\n\n% confidence ellipsoids\neta = 6.2514; % chi2inv(.9,3) value (command available in stat toolbox)\n% draw 90 percent confidence ellipsoid  for D design\nW = V*diag(lambdaD)*V';\nangles = linspace(0,2*pi,noangles);\nR = chol(W);  % W = R'*R\nellipsoid = sqrt(eta)*(R\\[cos(angles); sin(angles)]);\n\nfigure(4)\nplot(0,0,'ok',ellipsoid(1,:), ellipsoid(2,:), '-');\ntext(ellipsoid(1,1100),ellipsoid(2,1100),'D');\nhold on\n\n% draw 90 percent confidence ellipsoid  for A design\nW = V*diag(lambdaA)*V';\nangles = linspace(0,2*pi,noangles);\nR = chol(W);  % W = R'*R\nellipsoid = sqrt(eta)*(R\\[cos(angles); sin(angles)]);\nplot(0,0,'ok',ellipsoid(1,:), ellipsoid(2,:), '-');\ntext(ellipsoid(1,1),ellipsoid(2,1),'A');\n\n% draw 90 percent confidence ellipsoid  for E design\nW = V*diag(lambdaE)*V';\nangles = linspace(0,2*pi,noangles);\nR = chol(W);  % W = R'*R\nellipsoid = sqrt(eta)*(R\\[cos(angles); sin(angles)]);\nd=plot(0,0,'ok',ellipsoid(1,:), ellipsoid(2,:), '-');\nset(d,'Color',[0 0.5 0]);\ntext(ellipsoid(1,4000),ellipsoid(2,4000),'E');\n\n% draw 90 percent confidence ellipsoid  for uniform design\nW_u = inv(V*V'/p);\nR = chol(W_u);  % W = R'*R\nellipsoid_u = sqrt(eta)*(R\\[cos(angles); sin(angles)]);\nplot(ellipsoid_u(1,:), ellipsoid_u(2,:), '--');\ntext(ellipsoid_u(1),ellipsoid_u(2),'U');\nset(gca,'Xtick',[]);\nset(gca,'Ytick',[]);\naxis off\n% print -deps confidence.eps\nhold off\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/logistics.m",
    "content": "% Figure 7.1: Logistic regression\n% Section 7.1.1\n% Boyd & Vandenberghe, \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Argyris Zymnis - 01/31/06\n%\n% We consider a binary random variable y with prob(y=1) = p and\n% prob(y=0) = 1-p. We assume that that y depends on a vector of\n% explanatory variables u in R^n. The logistic model has the form\n% p = exp(a'*u+b)/(1+exp(a'*u+b)), where a and b are the model parameters.\n% We have m data points (u_1,y_1),...,(u_m,y_m).\n% We can reorder the data so that for u_1,..,u_q the outcome is y = 1\n% and for u_(q+1),...,u_m the outcome is y = 0. Then it can be shown\n% that the ML estimate of a and b can be found by solving\n%\n% minimize sum_{i=1,..,q}(a'*u_i+b) - sum_i(log(1+exp(a'*u_i+b)))\n%\n% In this case we have m = 100 and the u_i are just scalars.\n% The figure shows the data as well as the function\n% f(x) = exp(aml*x+bml)/(1+exp(aml*x+bml)) where aml and bml are the\n% ML estimates of a and b.\n\nrandn('state',0);\nrand('state',0);\n\n% Generate data\na =  1;\nb = -5 ;\nm= 100;\n\nu = 10*rand(m,1);\ny = (rand(m,1) < exp(a*u+b)./(1+exp(a*u+b)));\nplot(u,y,'o')\naxis([-1,11,-0.1, 1.1]);\n\n% Solve problem\n%\n% minimize  -(sum_(y_i=1) ui)*a - b + sum log (1+exp(a*ui+b)\n\nU = [ones(m,1) u];\ncvx_expert true\ncvx_begin\n    variables x(2)\n    maximize(y'*U*x-sum(log_sum_exp([zeros(1,m); x'*U'])))\ncvx_end\n\n% Plot results and logistic function\n\nind1 = find(y==1);\nind2 = find(y==0);\n\naml = x(2);  bml = x(1);\nus = linspace(-1,11,1000)';\nps = exp(aml*us + bml)./(1+exp(aml*us+bml));\n\ndots = plot(us,ps,'-', u(ind1),y(ind1),'o',...\n     u(ind2),y(ind2),'o');\n\naxis([-1, 11,-0.1,1.1]);\nxlabel('x');\nylabel('y');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/logistics_gp.m",
    "content": "% Figure 7.1: Logistic regression (GP version)\n% Section 7.1.1\n% Boyd & Vandenberghe, \"Convex Optimization\"\n% Kim & Mutapcic, \"Logistic regression via geometric programming\"\n% Written for CVX by Almir Mutapcic 02/08/06\n%\n% Solves the logistic regression problem re-formulated as a GP.\n% The original log regression problem is:\n%\n%   minimize   sum_i(theta'*x_i) + sum_i( log(1 + exp(-theta'*x_i)) )\n%\n% where x are explanatory variables and theta are model parameters.\n% The equivalent GP is obtained by the following change of variables:\n% z_i = exp(theta_i). The log regression problem is then a GP:\n%\n%   minimize   prod( prod(z_j^x_j) ) * (prod( 1 + prod(z_j^(-x_j)) ))\n%\n% with variables z and data x (explanatory variables).\n\nrandn('state',0);\nrand('state',0);\n\na =  1;\nb = -5;\n\nm = 100;\nu = 10*rand(m,1);\ny = (rand(m,1) < exp(a*u+b)./(1+exp(a*u+b)));\n\n% order the observation data\nind_false = find( y == 0 );\nind_true  = find( y == 1 );\n\n% X is the sorted design matrix\n% first have true than false observations followed by the bias term\nX = [u(ind_true); u(ind_false)];\nX = [X ones(size(u,1),1)];\n[m,n] = size(X);\nq = length(ind_true);\n\ncvx_begin gp\n  % optimization variables\n  variables z(n) t(q) s(m)\n\n  minimize( prod(t)*prod(s) )\n  subject to\n    for k = 1:q\n      prod( z.^(X(k,:)') ) <= t(k);\n    end\n\n    for k = 1:m\n      1 + prod( z.^(-X(k,:)') ) <= s(k);\n    end\ncvx_end\n\n% retrieve the optimal values and plot the result\ntheta = log(z);\naml = -theta(1);\nbml = -theta(2);\n\nus = linspace(-1,11,1000)';\nps = exp(aml*us + bml)./(1+exp(aml*us+bml));\n\nplot(us,ps,'-', u(ind_true),y(ind_true),'o', ...\n                u(ind_false),y(ind_false),'o');\naxis([-1, 11,-0.1,1.1]);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/maxent.m",
    "content": "% Example 7.2: Maximum entropy distribution\n% Section 7.2, Figures 7.2-7.3\n% Boyd & Vandenberghe, \"Convex Optimization\"\n% Originally by Lieven Vandenberghe\n% Adapted for CVX by Michael Grant 4/11/06\n%\n% We consider a probability distribution on 100 equidistant points in the\n% interval [-1,1]. We impose the following prior assumptions:\n%\n%    -0.1 <= E(X) <= +0.1\n%    +0.5 <= E(X^2) <= +0.6\n%    -0.3 <= E(3*X^3-2*X) <= -0.2\n%    +0.3 <= Pr(X<0) <= 0.4\n%\n% Along with the constraints sum(p) == 1, p >= 0, these constraints\n% describe a polyhedron of probability distrubtions. In the first figure,\n% the distribution that maximizes entropy is computed. In the second\n% figure, we compute upper and lower bounds for Prob(X<=a_i) for each\n% point -1 <= a_i <= +1 in the distribution, as well as the maximum\n% entropy CDF.\n\n%\n% Represent the polyhedron as follows:\n%     A * p <= b\n%     sum( p ) == 1\n%     p >= 0\n%\n\nn  = 100;\na  = linspace(-1,1,n);\na2 = a .^ 2;\na3 = 3 * ( a.^ 3 ) - 2 * a;\nap = +( a < 0 );\nA  = [ a   ; -a  ; a2 ; -a2  ; a3 ; -a3 ; ap ; -ap ];\nb  = [ 0.1 ; 0.1 ;0.5 ; -0.5 ; -0.2 ; 0.3 ; 0.4 ; -0.3 ];\n\n%\n% Compute the maximum entropy distribution\n%\n\ncvx_expert true\ncvx_begin \n    variables pent(n)\n    maximize( sum(entr(pent)) )\n    sum(pent) == 1;\n    A * pent <= b;\ncvx_end\n\n%\n% Compute the bounds on Prob(X<=a_i), i=1,...,n\n%\n\nUbnds = zeros(1,n);\nLbnds = zeros(1,n);\nfor t = 1 : n,\n    cvx_begin quiet\n        variable p( n )\n        minimize sum( p(1:t) )\n        p >= 0; \n        sum( p ) == 1;\n        A * p <= b;\n    cvx_end\n    Lbnds(t) = cvx_optval;\n    cvx_begin quiet\n        variable p( n )\n        maximize sum( p(1:t) )\n        p >= 0; \n        sum( p ) == 1;\n        A * p <= b;\n    cvx_end\n    Ubnds(t) = cvx_optval;\n    disp( sprintf( '%g <= Prob(x<=%g) <= %g', Lbnds(t), a(t), Ubnds(t) ) );\nend\n\n%\n% Generate the figures\n%\n\nfigure( 1 )\nstairs( a, pent );\nxlabel( 'x' );\nylabel( 'PDF( x )' );\n\nfigure( 2 )\nstairs( a, cumsum( pent ) );\ngrid on;\nhold on\nd = stairs(a, Lbnds,'r-');  set(d,'Color',[0 0.5 0]);\nd = stairs(a, Ubnds,'r-');  set(d,'Color',[0 0.5 0]);\nd = plot([-1,-1], [Lbnds(1), Ubnds(1)],'r-');\nset(d,'Color',[0 0.5 0]);\naxis([-1.1 1.1 -0.1 1.1]);\nxlabel( 'x' );\nylabel( 'CDF( x )' );\nhold off\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/montecarlo.m",
    "content": "function prob = montecarlo(A,b,Sigma,notrials);\n\n% Probability estimate using Monte Carlo methods\n%\n% Estimates the probability that a random vector x in R2\n% with mean zero and covariance Sigma satisfies Ax <= b,\n% based on 100 * notrials trials. Sigma must be PSD.\n\nm = size(A,1);\n\nR = chol(Sigma);   % Y = R^{-T}X has covariance I\nX = R'*randn(2,notrials);\nprob = length(find(sum(A*X - b(:,ones(1,notrials)) < 0) == m))/notrials;\n\nfor i=1:99\nX = R'*randn(2,notrials);\nprob = 0.5*(prob + ...\n  length(find(sum(A*X - b(:,ones(1,notrials)) < 0) == m))/notrials);\nend;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch07_statistical_estim/probbounds.m",
    "content": "% Section 7.4.3: Probability bounds example with Voronoi diagram\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Original version by Lieven Vandenberghe\n% Adapted for CVX by Michael Grant, 2005/12/19\n% Generates figures 7.5-7.8\n\n% The constellation points. Feel free to change them, but they must\n% produce a valid Voronoi diagram. Therefore, there must be three or\n% more points, and no three can be collinear. To test your selected\n% points, run VORONOI( Cs(:,1), Cs(:,2) ) and see if a complete diagram\n% is drawn; if so, your points should work.\nCs = [ ...\n    0,    0   ; ...\n    1.2,  2.4 ; ...\n    -3,   +3   ; ...\n    -4,    0   ; ...\n    -1.6, -3.2 ; ...\n    1.84615384615385, -2.76923076923077 ; ...\n    2.35294117647059,  0.58823529411765 ];\nCmax = max(max(abs(Cs))) * 1.25;\n\n% Plot the constellation points and the Voronoi tesselation\nclf\nCx = Cs( :, 1 );\nCy = Cs( :, 2 );\nm  = length( Cx );\nCs = Cs';\n[ Vx, Vy ] = voronoi( Cx, Cy );\nplot( Vx, Vy, 'b-', Cx, Cy, 'o' );\naxis equal\naxis( Cmax * [ -1, 1, -1, 1 ] );\naxis off\nhold on\n\n% Draw unit circles around each constellation point\nnoangles = 200;\nangles   = linspace( 0, 2 * pi, noangles );\ncrcpts   = [ cos(angles) ; sin(angles) ];\nfor i=1 : m,\n    text( Cx(i)+0.25, Cy(i)+0.25, [ 's', int2str(i) ] );\n    ellipse = [ cos(angles) ; sin(angles) ] + Cs(:,i) * ones(1,noangles);\n    plot( ellipse(1,:), ellipse(2,:), ':' );\nend;\n% print -deps chebbnds_example.eps\n\n% Determine the polyhedrons for each Voronoi region by computing the\n% Delaunay triangulation; that is, matrices A and b such that \n%     A * ( x - c ) <= b\n% where c is the constellation point. The faces of a polyhedron for a given\n% point consist of the perpindicular bisectors of edges of the Delaunay\n% triangles to which it belongs.\nm    = size( Cs, 2 );\ntri  = delaunay( Cx, Cy );\nee   = sparse( tri, tri( :, [ 3, 1, 2 ] ), 1, m, m );\nee   = ee + ee';\nfor k = 1 : m,\n    v2 = find( ee( :, k ) );\n    pk = Cs( :, v2 );\n    qk = Cs( :, k  ) * ones( 1, length( v2 ) );\n    Ak = pk - qk;\n    bk = 0.5 * sum( Ak .* Ak, 1 );\n    As{k} = Ak';\n    bs{k} = bk';\nend\n\n% For each polyhedron, compute lower bounds on the probability of\n% correct detection with sigma = 1. Check the results by plotting the\n% ellipsoid x'*P*x + 2*q'*x + r = 1, which should inscribe the polyhedron.\nints = 1 : m;\n% Uncomment to do only the first polyhedron, like the book does\n% ints = 1;\nfor i = ints( : ).',\n    [ cd_cheb, P, q, r, X, lambda ] = cheb( As{i}, bs{i}, eye(2) );\n    ellipse = sqrt(1-r+q'*(P\\q)) * P^(-1/2) * crcpts + ...\n        (-P\\q + Cs(:,i)) * ones(1,noangles);\n    plot( ellipse(1,:), ellipse(2,:), 'r-' );\n    dots = plot( X(1,:)+Cx(i), X(2,:)+Cy(i), 'ro' );\n    set( dots, 'MarkerFaceColor', 'red' );\n    set( dots, 'MarkerSize', 4 );\nend\nhold off\n% print -deps chebbnds_example2.eps\n\n% Compute Chebyshev lower bounds for Prob( As(i) * v <= bs(i) )\n% where v = N(Cs(i),sigma) for varying values of sigma\nnsigma   = 500;\nsigmas   = linspace( 0.001, 6.0, nsigma )';\ncd_cheb  = zeros( nsigma, m );\nfprintf( 'Computing lower bounds' );\n% Uncomment to match the book\nints = 1 : m;\n% ints     = 1 : 3;\nfor i = ints( : ).',\n    for k = 1 : nsigma,\n        cd_cheb(k,i) = cheb( As{i}, bs{i}, sigmas(k) * eye(2) );\n    end;\n    if rem( k, 10 ) == 0,\n        fprintf( '.' );\n    end\nend;\nfprintf( 'done.\\n' );\n\nfigure(2)\nmc = size( cd_cheb, 2 );\nplot(sqrt(sigmas(:,ones(1,mc))), cd_cheb);\nfor i = 1 : mc,\n    text( sqrt(sigmas(nsigma/4)), cd_cheb(nsigma/4,i), ['b',int2str(i)] );\nend;\nxlabel('x');\nylabel('y');\naxis( [ 0, 2.5, 0, 1 ] );\n\n% For the central set, compute Chebyshev lower bounds, Monte Carlo\n% estimates, and Chernoff bounds.\n% for central set, compute cheb lower bounds,  mc estimates,\n% and chernoff bounds\n%\n\nnsigma = 50;\nsigmas = linspace( 0.1, 0.5, nsigma );\ncd1    = zeros( 1, nsigma );   % lower bounds for prob( x in C1 )\nmc1    = zeros( 1, nsigma );   % monte carlo estimates of prob( x in C1 )\ncher1  = zeros( m-1, nsigma ); % chernoff upper bounds on Prob( x in Cj | s = s_1 )\nfprintf( 'Computing lower bounds and Monte Carlo sims' );\nfor i = 1 : nsigma,\n    % Compute the Chebyshev lower bound on Prob( As{1} * v <= bs{1} )\n    % for v in N( 0, Sigma )\n    Sigma  = sigmas(i)^2 * eye(2);\n    cd1(i) = cheb( As{1}, bs{1}, Sigma );\n    mc1(i) = montecarlo( As{1}, bs{1}, Sigma, 10000 );\n    if rem( i, 5 ) == 0, \n        fprintf( '.' );\n    end\nend\nfprintf( 'done.\\nComputing upper bounds' );\nfor j = 2 : m,\n    A = As{j};\n    b = bs{j} - A * ( Cs(:,1) - Cs(:,j) );\n    % Compute the Chernoff upper bound on \n    %     Prob( As{j} * ( v + Cs{1} - Cs{j} ) <= bs{j} )\n    % for v in N( 0, Sigma )\n    for i = 1 : nsigma,\n        cher1( j - 1, i ) = cher( A, b, sigmas(i)^2*eye(2) );\n    end\n    fprintf( '.' );\nend;\nfprintf( 'done.\\n' );\ncher1 = max( 1 - sum( cher1 ), 0 );\nfigure(4)\nplot( sigmas, cher1, '-', sigmas, mc1, '--' );\naxis( [ 0.2 0.5 0.9 1 ] );\nxlabel( 'x' );\nylabel( 'y' );\n%print -deps chernoff_example.eps\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/Contents.m",
    "content": "% Chapter 8: Geometric problems\n%\n%  separate_pt_poly.m           - Section 8.1.1: Separating a point from a polyhedron\n%  separate_poly_2D.m           - Section 8.2.2: Separating polyhedra in 2D\n%  analytic_center.m            - Section 8.5.3: Analytic center of a set of linear inequalities\n%  svm_1.m                      - Figure 8.10: Approximate linear discrimination via linear programming\n%  svm_2.m                      - Figure 8.11: Approximate linear discrimination via support vector classifier\n%  placement_lin.m              - Figure 8.15: Linear placement problem\n%  placement_quad.m             - Figure 8.16: Quadratic placement problem\n%  placement_quar.m             - Figure 8.17: Fourth-order placement problem\n%  linear_discr.m               - Figure 8.8: Simplest linear discrimination\n%  robust_lin_discr.m           - Figure 8.9: Robust linear discrimination problem\n%  ex_8_3.m                     - Example 8.3: Bounding correlation coefficients\n%  ex_8_4.m                     - Example 8.4: One free point localization\n%  test_floorplan.m             - Example 8.7: Floorplan generation test script\n%  eucl_dist_poly.m             - Euclidean distance between polyhedra\n%  eucl_dist_poly_2D.m          - Euclidean distance between polyhedra in 2D\n%  eucl_proj_hlf.m              - Euclidean projection on a halfspace\n%  eucl_proj_hyp.m              - Euclidean projection on a hyperplane\n%  eucl_proj_rect.m             - Euclidean projection on a rectangle\n%  eucl_proj_cone1.m            - Euclidean projection on the nonnegative orthant\n%  eucl_proj_cone2.m            - Euclidean projection on the semidefinite cone\n%  floor_plan.m                 - Floor planning\n%  max_vol_ellip_in_polyhedra.m - Maximum volume inscribed ellipsoid in a polyhedron\n%  min_vol_elp_finite_set.m     - Minimum volume ellipsoid covering a finite set\n%  min_vol_union_ellip.m        - Minimum volume ellipsoid covering union of ellipsoids\n%  ex_8_5.m                     - One free point localization\n%  poly3_discr.m                - Polynomial discrimination\n%  poly4_discr.m                - Polynomial discrimination\n%  quad_discr.m                 - Quadratic discrimination (separating ellipsoid)\n%  separate_ell_2D.m            - Separating ellipsoids in 2D\n%  floor_plan_graphs.m          - Solve a floor planning problem given graphs H & V\n%  floorplan.m                  - Computes a minimum-perimeter bounding box subject to positioning constraints\n%  data_floorplan_32.mat        - (no title)\n%  data_floorplan_60.mat        - (no title)\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/analytic_center.m",
    "content": "% Section 8.5.3: Analytic center of a set of linear inequalities\n% Boyd & Vandenberghe \"Convex Optimization\" \n% Joëlle Skaf - 04/29/08 \n%\n% The analytic center of a set of linear inequalities and equalities:\n%           a_i^Tx <= b_i   i=1,...,m,\n%           Fx = g,\n% is the solution of the unconstrained minimization problem \n%           minimize    -sum_{i=1}^m log(b_i-a_i^Tx).\n\n% Input data \nrandn('state', 0);\nrand('state', 0);\nn = 10;\nm = 50; \np = 5;\ntmp = randn(n,1);\nA = randn(m,n); \nb = A*tmp + 10*rand(m,1); \nF = randn(p,n); \ng = F*tmp; \n\n% Analytic center \ncvx_begin\n    variable x(n)\n    minimize -sum(log(b-A*x))\n    F*x == g\ncvx_end\n\ndisp(['The analytic center of the set of linear inequalities and ' ... \n      'equalities is: ']);\ndisp(x);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/eucl_dist_poly.m",
    "content": "% Euclidean distance between polyhedra\n% Section 8.2.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/09/05\n%\n% Given two polyhedra C = {x | A1*x <= b1} and D = {x | A2*x <= b2}, the\n% distance between them is the optimal value of the problem:\n%           minimize    || x - y ||_2\n%               s.t.    A1*x <= b1\n%                       A2*y <= b2\n\n% Input data\nrandn('state',0);\nrand('state',0);\n\nn  = 5;\nm1 = 2*n;\nm2 = 3*n;\nA1 = randn(m1,n);\nA2 = randn(m2,n);\nb1 = rand(m1,1);\nb2 = rand(m2,1) + A2*randn(n,1);\n\n% Solution via CVX\ncvx_begin\n    variables x(n) y(n)\n    minimize (norm(x - y))\n    A1*x <= b1;\n    A2*y <= b2;\ncvx_end\n\n% Displaying results\ndisp('------------------------------------------------------------------');\ndisp('The distance between the 2 polyhedra C and D is: ' );\ndisp(['dist(C,D) = ' num2str(cvx_optval)]);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/eucl_dist_poly_2D.m",
    "content": "% Euclidean distance between polyhedra in 2D\n% Section 8.2.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/09/05\n% (a figure is generated)\n%\n% Given two polyhedra C = {x | A1*x <= b1} and D = {x | A2*x <= b2}, the\n% distance between them is the optimal value of the problem:\n%           minimize    || x - y ||_2\n%               s.t.    A1*x <= b1\n%                       A2*y <= b2\n% Note: here x is in R^2\n\n% Input data\nrandn('seed',0);\nn = 2;\nm = 2*n;\nA1 = randn(m,n);\nb1 = randn(m,1);\nA2 = randn(m,n);\nb2 = randn(m,1);\n\nfprintf(1,'Computing the distance between the 2 polyhedra...');\n% Solution via CVX\ncvx_begin\n    variables x(n) y(n)\n    minimize (norm(x - y))\n    norm(x,1) <= 2;\n    norm(y-[4;3],inf) <=1;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Displaying results\ndisp('------------------------------------------------------------------');\ndisp('The distance between the 2 polyhedra C and D is: ' );\ndisp(['dist(C,D) = ' num2str(cvx_optval)]);\ndisp('The optimal points are: ')\ndisp('x = '); disp(x);\ndisp('y = '); disp(y);\n\n%Plotting\nfigure;\nfill([-2; 0; 2; 0],[0;2;0;-2],'b', [3;5;5;3],[2;2;4;4],'r')\naxis([-3 6 -3 6])\naxis square\nhold on;\nplot(x(1),x(2),'k.')\nplot(y(1),y(2),'k.')\nplot([x(1) y(1)],[x(2) y(2)])\ntitle('Euclidean distance between 2 polyhedron in R^2');\nxlabel('x_1');\nylabel('x_2');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/eucl_proj_cone1.m",
    "content": "% Euclidean projection on the nonnegative orthant\n% Section 8.1.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/07/05\n%\n% The projection of x0 on the proper cone K = R+^n is given by\n%           minimize || x - x0 ||^2\n%               s.t.    x >= 0\n% It is also given by: P_K(x0)_k = max{x0_k,0}\n\n% Input data\nrandn('seed',0);\nn  = 10;\nx0 = randn(n,1);\n\nfprintf(1,'Computing the analytical solution...');\n\n% Analytical solution\npk_x0 = max(x0,0);\n\nfprintf(1,'Done! \\n');\n\n% Solution via CVX\nfprintf(1,'Computing the solution via a QP...');\n\ncvx_begin quiet\n    variable x(n)\n    minimize ( norm(x - x0) )\n    x >= 0;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Verification\ndisp('-----------------------------------------------------------------');\ndisp('Verifying that the analytical solution and the solution obtained via QP are equal: ');\n[pk_x0 x]\ndisp('They are equal as expected!');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/eucl_proj_cone2.m",
    "content": "% Euclidean projection on the semidefinite cone\n% Sec. 8.1.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/07/05\n%\n% The projection of X0 on the proper cone K = S+^n is given by\n%           minimize    ||X - X0||_F\n%               s.t.    X >=0\n% where X is a nxn matrix and ||.||_F is the Frobenius norm\n% It is also given by: P_K(X0)_k = sum_{i=1}^{n}max{0,lam_i}v_i*v_i'\n% s.t. X0= sum_{i=1}^{n}lam_i*v_i*v_i'is the eigenvalue decomposition of X0\n\n% Input data\nrandn('seed',0);\nn  = 10;\nX0 = randn(n);\nX0 = 0.5 * (X0 + X0');\n[V,lam] = eig(X0);\n\nfprintf(1,'Computing the analytical solution...');\n% Analytical solution\npk_X0 = V*max(lam,0)*V';\nfprintf(1,'Done! \\n');\n\n% Solution via CVX\nfprintf(1,'Computing the optimal solution by solving an SDP...');\n\ncvx_begin sdp quiet\n    variable X(n,n) symmetric\n    minimize ( norm(X-X0,'fro') )\n    X >= 0;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Verification\ndisp('-----------------------------------------------------------------');\ndisp('Verifying that the analytical solution and the solution obtained ');\ndisp('via CVX are equal by computing ||X_star - P_K(X0)||_F: ');\nnorm(X-pk_X0,'fro')\ndisp('Hence X_star and P_K(X0) are equal to working precision.');\n\n\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/eucl_proj_hlf.m",
    "content": "% Euclidean projection on a halfspace\n% Sec. 8.1.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/04/05\n%\n% The projection of x0 on a halfspace C = {x | a'*x <= b} is given by\n%           minimize || x - x0 ||^2\n%               s.t.    a'*x <= b\n% It is also given by P_C(x0) = x0 + (b - a'*x0)*a/||a||^2 if a'*x0 > b\n%                           and x0                         if a'*x0 <=b\n\n% Input data\nrandn('seed',0);\nn  = 10;\na  = randn(n,1);\nb  = randn(1);\nx0 = randn(n,1);    % a'*x0 <=b\nx1 = x0 + a;        % a'*x1 > b\n\n% Analytical solution\nfprintf(1,'Computing the analytical solution for the case where a^T*x0 <=b...');\npc_x0 = x0;\nfprintf(1,'Done! \\n');\nfprintf(1,'Computing the analytical solution for the case where a^T*x0 > b...');\npc_x1 = x1 + (b - a'*x1)*a/norm(a)^2;\nfprintf(1,'Done! \\n');\n\n% Solution via QP\nfprintf(1,'Computing the solution of the QP for the case where a^T*x0 <=b...');\ncvx_begin quiet\n    variable xs0(n)\n    minimize ( square_pos(norm(xs0 - x0)) )\n    a'*xs0 <= b;\ncvx_end\nfprintf(1,'Done! \\n');\n\nfprintf(1,'Computing the solution of the QP for the case where a^T*x0 > b...');\ncvx_begin quiet\n    variable xs1(n)\n    minimize ( square_pos(norm(xs1 - x1)) )\n    a'*xs1 <= b;\ncvx_end\nfprintf(1,'Done! \\n');\n\n% Verification\ndisp('-----------------------------------------------------------------');\ndisp('Verifying that p_C(x0) and x0_star are equal in the case where a^T*x0 <=b');\ndisp(['||p_C(x0) - x0_star|| = ' num2str(norm(xs0 - pc_x0))]);\ndisp('Hence they are equal to working precision');\ndisp('Verifying that p_C(x1) and x1_star are equal in the case where a^T*x1 > b');\ndisp(['||p_C(x1) - x1_star|| = ' num2str(norm(xs1 - pc_x1))]);\ndisp('Hence they are equal to working precision');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/eucl_proj_hyp.m",
    "content": "% Euclidean projection on a hyperplane\n% Section 8.1.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/04/05\n%\n% The projection of x0 on a hyperplane C = {x | a'*x = b} is given by\n%           minimize || x - x0 ||^2\n%               s.t.    a'*x = b\n% It is also given by P_C(x0) = x0 + (b - a'*x0)*a/||a||^2\n\n% Input data\nrandn('seed',0);\nn  = 10;\na  = randn(n,1);\nb  = randn(1);\nx0 = randn(n,1);\n\n% Analytical solution\nfprintf(1,'Computing the analytical solution ...');\npc_x0 = x0 + (b - a'*x0)*a/norm(a)^2;\nfprintf(1,'Done! \\n');\n\n% Solution via QP\nfprintf(1,'Computing the optimal solution by solving a QP ...');\n\ncvx_begin quiet\n    variable x(n)\n    minimize ( square_pos(norm(x - x0)) )\n    a'*x == b;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Verification\ndisp('--------------------------------------------------------------------------------');\ndisp('Verifying that p_C(x0) and x_star belong to the hyperplane C: ');\ndisp(['a^T*p_C(x0) - b = ' num2str(a'*pc_x0 - b)]);\ndisp(['a^T*x_star - b  = ' num2str(a'*x - b)]);\ndisp('Computing the distance between x0 and the hyperplane in each case');\ndisp(['||x0 - p_C(x0)|| = ' num2str(norm(x0 - pc_x0))]);\ndisp(['||x0 - x_star || = ' num2str(norm(x0 - x))]);\ndisp('Verifying that the analytical solution and the solution obtained via QP are equal: ');\n[pc_x0 x]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/eucl_proj_rect.m",
    "content": "% Euclidean projection on a rectangle\n% Section 8.1.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/07/05\n%\n% The projection of x0 on a rectangle C = {x | l <= x <= u} is given by\n%           minimize || x - x0 ||^2\n%               s.t.    l <= x <= u\n% It is also given by P_C(x0)_k = l_k       if  x0_k <= l_k\n%                                 x0_k      if  l_k <= x0_k <= u_k\n%                                 u_k       if  x0_k >= u_k\n\n% Input data: generate vectors l and u such that l < 0 < u\nn  = 10;\nl  = -rand(n,1);\nu  = rand(n,1);\nx0 = randn(n,1);\n\n% Analytical solution\nfprintf(1,'Computing the analytical solution ...');\npc_x0 = x0;\npc_x0(find(x0<=l)) = l(find(x0<=l));\npc_x0(find(x0>=u)) = u(find(x0>=u));\nfprintf(1,'Done! \\n');\n\n% Solution via QP\nfprintf(1,'Computing the optimal solution by solving a QP ...');\n\ncvx_begin quiet\n    variable x(n)\n    minimize ( norm(x-x0) )\n    x <= u;\n    x >= l;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Verification\ndisp('-----------------------------------------------------------------');\ndisp('Verifying that the analytical solution and the solution obtained via QP are equal: ');\n[pc_x0 x]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/ex_8_3.m",
    "content": "% Example 8.3: Bounding correlation coefficients\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/09/05\n%\n% Let C be a correlation matrix. Given lower and upper bounds on\n% some of the angles (or correlation coeff.), find the maximum and minimum\n% possible values of rho_14 by solving 2 SDP's\n%           minimize/maximize   rho_14\n%                        s.t.   C >=0\n%                               0.6 <= rho_12 <=  0.9\n%                               0.8 <= rho_13 <=  0.9\n%                               0.5 <= rho_24 <=  0.7\n%                              -0.8 <= rho_34 <= -0.4\n\nn = 4;\n\n% Upper bound SDP\nfprintf(1,'Solving the upper bound SDP ...');\n\ncvx_begin sdp\n    variable C1(n,n) symmetric\n    maximize ( C1(1,4) )\n    C1 >= 0;\n    diag(C1) == ones(n,1);\n    C1(1,2) >= 0.6;\n    C1(1,2) <= 0.9;\n    C1(1,3) >= 0.8;\n    C1(1,3) <= 0.9;\n    C1(2,4) >= 0.5;\n    C1(2,4) <= 0.7;\n    C1(3,4) >= -0.8;\n    C1(3,4) <= -0.4;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Lower bound SDP\nfprintf(1,'Solving the lower bound SDP ...');\n\ncvx_begin sdp\n    variable C2(n,n) symmetric\n    minimize ( C2(1,4) )\n    C2 >= 0;\n    diag(C2) == ones(n,1);\n    C2(1,2) >= 0.6;\n    C2(1,2) <= 0.9;\n    C2(1,3) >= 0.8;\n    C2(1,3) <= 0.9;\n    C2(2,4) >= 0.5;\n    C2(2,4) <= 0.7;\n    C2(3,4) >= -0.8;\n    C2(3,4) <= -0.4;\ncvx_end\n\nfprintf(1,'Done! \\n');\n% Displaying results\ndisp('--------------------------------------------------------------------------------');\ndisp(['The minimum and maximum values of rho_14 are: ' num2str(C2(1,4)) ' and ' num2str(C1(1,4))]);\ndisp('with corresponding correlation matrices: ');\ndisp(C2)\ndisp(C1)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/ex_8_4.m",
    "content": "% Example 8.4: One free point localization\n% Section 8.7.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/23/05\n%\n% K fixed points (u1,v1),..., (uK,vK) in R^2 are given and the goal is to place\n% one additional point (u,v) such that:\n% 1) the L1-norm is minimized, i.e.\n%           minimize    sum_{i=1}^K ( |u - u_i| + |v - v_i| )\n%    the solution in this case is any median of the fixed points\n% 2) the L2-norm is minimized, i.e.\n%           minimize    sum_{i=1}^K ( |u - u_i|^2 + |v - v_i|^2 )^.5\n%    the solution in this case is the Weber point of the fixed points\n\n% Data generation\nn = 2;\nK = 11;\nrandn('state',0);\nP = randn(n,K);\n\n% L1 - norm\nfprintf(1,'Minimizing the L1-norm of the sum of the distances to fixed points...');\n\ncvx_begin\n    variable x1(2)\n    minimize ( sum(norms(x1*ones(1,K) - P,1)) )\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% L2 - norm\nfprintf(1,'Minimizing the L2-norm of the sum of the distances to fixed points...');\n\ncvx_begin\n    variable x2(2)\n    minimize ( sum(norms(x2*ones(1,K) - P,2)) )\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Displaying results\ndisp('------------------------------------------------------------------');\ndisp('The optimal point location for the L1-norm case is: ');\ndisp(x1);\ndisp('The optimal point location for the L2-norm case is: ');\ndisp(x2);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/ex_8_5.m",
    "content": "% One free point localization\n% Section 8.7.3, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/24/05\n%\n% K fixed points x_1,...,x_K in R^2 are given and the goal is to place\n% one additional point x such that the sum of the squares of the\n% Euclidean distances to fixed points is minimized:\n%           minimize    sum_{i=1}^K  ||x - x_i||^2\n% The optimal point is the average of the given fixed points\n\n% Data generation\nn = 2;\nK = 11;\nrandn('state',0);\nP = randn(n,K);\n\n% minimizing the sum of Euclidean distance\nfprintf(1,'Minimizing the sum of the squares the distances to fixed points...');\n\ncvx_begin\n    variable x(2)\n    minimize ( sum( square_pos( norms(x*ones(1,K) - P,2) ) ) )\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Displaying results\ndisp('------------------------------------------------------------------');\ndisp('The optimal point location is: ');\ndisp(x);\ndisp('The average location of the fixed points is');\ndisp(sum(P,2)/K);\ndisp('They are the same as expected!');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/floor_plan.m",
    "content": "% Floor planning\n% Section 8.8.1/2, Example 8.7, Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 11/13/05\n% (a figure is generated)\n%\n% Rectangles aligned with the axies need to be place in the smallest\n% possible bounding box. No overlap is allowed. Each rectangle to be placed\n% can be reconfigured, within some limits. We are given relative\n% positioning contrainsts on those rectangles, and minimal required areas.\n% In the current problem, 5 rectangles are given\n\n% input data\nn = 5;\nAmin = [100 100 100 100 100; ...\n         20  50  80 150 200; ...\n        180  80  80  80  80; ...\n         20 150  20 200 110];\nr = 1;          % minimum spacing constraints\n\nfor iter = 1:4\n    A = Amin(iter,:);\n    cvx_begin quiet\n        variables x(n) y(n) w(n) h(n) W H\n        minimize ( W + H )\n        x >= r;\n        y >= r;\n        w >= 0;\n        h >= 0;\n        x(5) + w(5) + r <= W;    % No rectangles at the right of Rectangle 5\n        x(1) + w(1) + r <= x(3); % Rectangle 1 is at the left of Rectangle 3\n        x(2) + w(2) + r <= x(3); % Rectangle 2 is at the left of Rectangle 3\n        x(3) + w(3) + r <= x(5); % Rectangle 3 is at the left of Rectangle 5\n        x(4) + w(4) + r <= x(5); % Rectangle 4 is at the left of Rectangle 5\n        y(4) + h(4) + r <= H;    % No rectangles on top of Rectangle 4\n        y(5) + h(5) + r <= H;    % No rectangles on top of Rectangle 5\n        y(2) + h(2) + r <= y(1); % Rectangle 2 is below Rectangle 1\n        y(1) + h(1) + r <= y(4); % Rectangle 1 is below Rectangle 4\n        y(3) + h(3) + r <= y(4); % Rectangle 3 is below Rectangle 4\n        w <= 5*h;                % Aspect ratio constraints\n        h <= 5*w;\n        w' >= quad_over_lin([A.^.5;zeros(1,n)],h');\n    cvx_end\n    % Plotting\n    subplot(2,2,iter)\n    for i=1:n\n        fill([x(i); x(i)+w(i); x(i)+w(i); x(i)],[y(i);y(i);y(i)+h(i);y(i)+h(i)],0.90*[1 1 1]);\n        hold on;\n        text(x(i)+w(i)/2, y(i)+h(i)/2,['B',int2str(i)]);\n    end\n    axis([0 W 0 H]);\n    axis equal; axis off;\nend\n\n% print -deps floorplan-opt.eps\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/floor_plan_graphs.m",
    "content": "% Solve a floor planning problem given graphs H & V\n% Section 8.8.1/2, Example 8.7, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 11/13/05\n% (a figure is generated)\n%\n% Rectangles aligned with the axes need to be place in the smallest\n% possible bounding box. No overlap is allowed. Each rectangle to be placed\n% can be reconfigured, within some limits.\n% In the current problem, 5 rectangles are to be place. We are given 2\n% acyclic graphs H and V (for horizontal and vertical) that specify the\n% relative positioning constraints of those rectangles.\n% We are also given minimal areas for the rectangles.\n\n% Input data\nn = 5;\n% for each entry i, X_tree(i) = parent(i)\nH_tree = [0 0 1 0 0;...\n          0 0 1 0 0;...\n          0 0 0 0 1;...\n          0 0 0 0 1;...\n          0 0 0 0 0];\nV_tree = [0 0 0 1 0;...\n          1 0 0 0 0;...\n          0 0 0 1 0;...\n          0 0 0 0 0;...\n          0 0 0 0 0];\n\nAmin = [100 100 100 100 100; ...\n         20  50  80 150 200; ...\n        180  80  80  80  80; ...\n         20 150  20 200 110];\nrho = 1;          % minimum spacing constraints\n\n% solving the problem by calling the general FLOORPLAN routine\nfor iter = 1:4\n    A = Amin(iter,:);\n    [W, H, w, h, x, y] = floorplan(H_tree, V_tree, rho, A, 1/5*ones(n,1), 5*ones(n,1));\n    % Plotting\n    subplot(2,2,iter)\n    for i=1:n\n        fill([x(i); x(i)+w(i); x(i)+w(i); x(i)],[y(i);y(i);y(i)+h(i);y(i)+h(i)],0.90*[1 1 1]);\n        hold on;\n        text(x(i)+w(i)/2, y(i)+h(i)/2,['B',int2str(i)]);\n    end\n    axis([0 W 0 H]);\n    axis equal; axis off;\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/floorplan.m",
    "content": "function [W, H, w, h, x, y] = floorplan(adj_H, adj_V, rho, Amin, l, u )\n\n% Computes a minimum-perimeter bounding box subject to positioning constraints\n%\n% Inputs:\n%      adj_H,adj_V: adjacency matrices\n%      Amin:        minimum spacing: w_i * h_i >= Amin\n%      rho:         boundaries: rho <= x_i <= W-rho, rho <= y_i <= H-rho\n%      l, u:        aspect ratio constraints: l_i <= h_i/w_i <= u_i\n% Only adj_H and adj_V are required; the rest are optional. If n is the\n% number of cells, then adj_H and adj_V must be nxn matrices, and Amin,\n% l, and u must be vectors of length n. rho must be a scalar. The default\n% values of rho and Amin are 0.\n% Joelle Skaf - 12/04/05\n\nif nargin < 2\n    error('Insufficient number of input arguments');\nend\n\n[n1, n2] = size(adj_H);\n[m1, m2] = size(adj_V);\n\nif n1~=n2\n    error('Input adjacency matrix for horizontal graph must be square');\nend\n\nif m1~=m2\n    error('Input adjacency matrix for horizontal graph must be square');\nend\n\n\nif n1~=m1\n    error('Input adjacency matrices must be of the same size');\nend\n\nn = n1;                     % number of cells\n\nif nargin <3\n    rho = 0;\nend\n\nif nargin <4\n    Amin = zeros(1,n);\nelse\n    if min(size(Amin)) ~=1\n        error('Amin should be a vector');\n    end\n    if max(size(Amin)) ~= n\n        error('Amin should have the same length as the input graphs');\n    end\n    if size(Amin,1)~=1\n        Amin = Amin';\n    end\nend\n\nif nargin == 5\n    if min(size(1)) ~= 1\n        error('l must be a vector');\n    end\n    if max(size(l)) ~= n\n        error('the vector l must have same length as the input graphs');\n    end\n    if size(l,1) == 1\n        l = l';\n    end\nend\n\nif nargin == 6\n    if min(size(1)) ~= 1\n        error('u must be a vector');\n    end\n    if max(size(u)) ~= n\n        error('the vector u must have same length as the input graphs');\n    end\n    if size(u,1) == 1\n        u = u';\n    end\nend\n\nif nargin < 6\n    u = [];\nend\nif nargin < 5\n    l = [];\nend\n\n\n% verifying that there is a directed path between any pair of cells in at\n% least one of the 2 graphs\n\npaths_H = adj_H;\npaths_V = adj_V;\ntemp_H = adj_H^2;\ntemp_V = adj_V^2;\nwhile (sum(temp_H(:))>0)\n    paths_H = paths_H + temp_H;\n    temp_H = temp_H*adj_H;\nend\nwhile (sum(temp_V(:))>0)\n    paths_V = paths_V + temp_V;\n    temp_V = temp_V*adj_V;\nend\n\nhh = paths_H + paths_H';\nvv = paths_V + paths_V';\np = hh+vv+eye(n);\nall_paths = p>0;\nif sum(all_paths(:)) ~= n^2\n    error('There must be a directed graph between every pair of cells in one or the other input graphs');\nend\n\npar_H = sum(adj_H,2);               % number of parents of each node in H\npar_V = sum(adj_V,2);               % number of parents of each node in V\nchi_H = sum(adj_H);                 % number of children of each node in H\nchi_V = sum(adj_V);                 % number of children of each node in V\n\n% find the root(s) for each tree\nroots_H = find(par_H==0);\nroots_V = find(par_V==0);\n\n% find all non-root nodes for each tree\nnodes_H = find(par_H>0);\nnodes_V = find(par_V>0);\n\n% find leaf(s) for each tree\nleafs_H = find(chi_H==0);\nleafs_V = find(chi_V==0);\n\ncvx_begin quiet\n        variables x(n) y(n) w(n) h(n) W H\n        minimize ( W + H )\n        w >= 0;\n        h >= 0;\n        x(leafs_H) >= rho;\n        y(leafs_V) >= rho;\n        x(roots_H) + w(roots_H) + rho <= W;\n        y(roots_V) + h(roots_V) + rho <= H;\n        for i=1:length(nodes_H)\n            node = nodes_H(i);\n            c = adj_H(node,:);\n            prnt = find(c>0)';\n            m = length(prnt);\n            x(node) + w(node) + rho <= x(prnt);\n        end\n\n        for i=1:length(nodes_V)\n            node = nodes_V(i);\n            c = adj_V(node,:);\n            prnt = find(c>0)';\n            m = length(prnt);\n            y(node) + h(node) + rho <= y(prnt);\n        end\n\n        if sum(size(u))~= 0\n            h <= u.*w;\n        end\n        if sum(size(l))~= 0\n            h >= l.*w;\n        end\n        w' >= quad_over_lin([Amin.^.5;zeros(1,n)],h');\ncvx_end\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/linear_discr.m",
    "content": "% Figure 8.8: Simplest linear discrimination\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/16/05\n% (a figure is generated)\n%\n% The goal is to find a function f(x) = a'*x - b that classifies the points\n% {x_1,...,x_N} and {y_1,...,y_M}. a and b can be obtained by solving a\n% feasibility problem:\n%           minimize    0\n%               s.t.    a'*x_i - b >=  1     for i = 1,...,N\n%                       a'*y_i - b <= -1     for i = 1,...,M\n\n% data generation\nn = 2;\nrandn('state',3);\nN = 10; M = 6;\nY = [1.5+1*randn(1,M); 2*randn(1,M)];\nX = [-1.5+1*randn(1,N); 2*randn(1,N)];\nT = [-1 1; 1 1];\nY = T*Y;  X = T*X;\n\n% Solution via CVX\nfprintf('Finding a separating hyperplane...');\n\ncvx_begin\n    variables a(n) b(1)\n    X'*a - b >= 1;\n    Y'*a - b <= -1;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Displaying results\nlinewidth = 0.5;  % for the squares and circles\nt_min = min([X(1,:),Y(1,:)]);\nt_max = max([X(1,:),Y(1,:)]);\nt = linspace(t_min-1,t_max+1,100);\np = -a(1)*t/a(2) + b/a(2);\n\ngraph = plot(X(1,:),X(2,:), 'o', Y(1,:), Y(2,:), 'o');\nset(graph(1),'LineWidth',linewidth);\nset(graph(2),'LineWidth',linewidth);\nset(graph(2),'MarkerFaceColor',[0 0.5 0]);\nhold on;\nplot(t,p, '-r');\naxis equal\ntitle('Simple classification using an affine function');\n% print -deps lin-discr.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/max_vol_ellip_in_polyhedra.m",
    "content": "% Maximum volume inscribed ellipsoid in a polyhedron \n% Section 8.4.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Original version by Lieven Vandenberghe\n% Updated for CVX by Almir Mutapcic - Jan 2006\n% (a figure is generated)\n%\n% We find the ellipsoid E of maximum volume that lies inside of\n% a polyhedra C described by a set of linear inequalities.\n%\n% C = { x | a_i^T x <= b_i, i = 1,...,m } (polyhedra)\n% E = { Bu + d | || u || <= 1 } (ellipsoid) \n%\n% This problem can be formulated as a log det maximization\n% which can then be computed using the det_rootn function, ie,\n%     maximize     log det B\n%     subject to   || B a_i || + a_i^T d <= b,  for i = 1,...,m\n\n% problem data\nn = 2;\npx = [0 .5 2 3 1];\npy = [0 1 1.5 .5 -.5];\nm = size(px,2);\npxint = sum(px)/m; pyint = sum(py)/m;\npx = [px px(1)];\npy = [py py(1)];\n\n% generate A,b\nA = zeros(m,n); b = zeros(m,1);\nfor i=1:m\n  A(i,:) = null([px(i+1)-px(i) py(i+1)-py(i)])';\n  b(i) = A(i,:)*.5*[px(i+1)+px(i); py(i+1)+py(i)];\n  if A(i,:)*[pxint; pyint]-b(i)>0\n    A(i,:) = -A(i,:);\n    b(i) = -b(i);\n  end\nend\n\n% formulate and solve the problem\ncvx_begin\n    variable B(n,n) symmetric\n    variable d(n)\n    maximize( det_rootn( B ) )\n    subject to\n       for i = 1:m\n           norm( B*A(i,:)', 2 ) + A(i,:)*d <= b(i);\n       end\ncvx_end\n\n% make the plots\nnoangles = 200;\nangles   = linspace( 0, 2 * pi, noangles );\nellipse_inner  = B * [ cos(angles) ; sin(angles) ] + d * ones( 1, noangles );\nellipse_outer  = 2*B * [ cos(angles) ; sin(angles) ] + d * ones( 1, noangles );\n\nclf\nplot(px,py)\nhold on\nplot( ellipse_inner(1,:), ellipse_inner(2,:), 'r--' );\nplot( ellipse_outer(1,:), ellipse_outer(2,:), 'r--' );\naxis square\naxis off\nhold off\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/min_vol_elp_finite_set.m",
    "content": "% Minimum volume ellipsoid covering a finite set\n% Section 8.4.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Almir Mutapcic - 10/05\n% (a figure is generated)\n%\n% Given a finite set of points x_i in R^2, we find the minimum volume\n% ellipsoid (described by matrix A and vector b) that covers all of\n% the points by solving the optimization problem:\n%\n%           maximize     log det A\n%           subject to   || A x_i + b || <= 1   for all i\n%\n% CVX cannot yet handle the logdet function, but this problem can be\n% represented in an equivalent way as follows:\n%\n%           maximize     det(A)^(1/n)\n%           subject to   || A x_i + b || <= 1   for all i\n%\n% The expression det(A)^(1/n) is SDP-representable, and is implemented\n% by the MATLAB function det_rootn().\n\n% Generate data\nx = [ 0.55  0.0;\n      0.25  0.35\n     -0.2   0.2\n     -0.25 -0.1\n     -0.0  -0.3\n      0.4  -0.2 ]';\n[n,m] = size(x);\n\n% Create and solve the model\ncvx_begin\n    variable A(n,n) symmetric\n    variable b(n)\n    maximize( det_rootn( A ) )\n    subject to\n        norms( A * x + b * ones( 1, m ), 2 ) <= 1;\ncvx_end\n\n% Plot the results\nclf\nnoangles = 200;\nangles   = linspace( 0, 2 * pi, noangles );\nellipse  = A \\ [ cos(angles) - b(1) ; sin(angles) - b(2) ];\nplot( x(1,:), x(2,:), 'ro', ellipse(1,:), ellipse(2,:), 'b-' );\naxis off\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/min_vol_union_ellip.m",
    "content": "% Minimum volume ellipsoid covering union of ellipsoids\n% Section 8.4.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Original version by Lieven Vandenberghe\n% Updated for CVX by Almir Mutapcic - Jan 2006\n% (a figure is generated)\n%\n% We find a smallest ellipsoid containing m ellipsoids\n% { x'*A_i*x + 2*b_i'*x + c < 0 }, for i = 1,...,m\n%\n% Problem data:\n% As = {A1, A2, ..., Am}:  cell array of m pos. def. matrices\n% bs = {b1, b2, ..., bm}:  cell array of m 2-vectors\n% cs = {c1, c2, ..., cm}:  cell array of m scalars\n\n% ellipse data\nAs = {}; bs = {}; cs = {};\nAs{1} = [ 0.1355    0.1148;  0.1148    0.4398];\nAs{2} = [ 0.6064   -0.1022; -0.1022    0.7344];\nAs{3} = [ 0.7127   -0.0559; -0.0559    0.9253];\nAs{4} = [ 0.2706   -0.1379; -0.1379    0.2515];\nAs{5} = [ 0.4008   -0.1112; -0.1112    0.2107];\nbs{1} = [ -0.2042  0.0264]';\nbs{2} = [  0.8259 -2.1188]';\nbs{3} = [ -0.0256  1.0591]';\nbs{4} = [  0.1827 -0.3844]';\nbs{5} = [  0.3823 -0.8253]';\ncs{1} = 0.2351;\ncs{2} = 5.8250;\ncs{3} = 0.9968;\ncs{4} = -0.2981;\ncs{5} = 2.6735;\n\n% dimensions\nn = 2;\nm = size(bs,2);    % m ellipsoids given\n\n% construct and solve the problem as posed in the book\ncvx_begin sdp\n    variable Asqr(n,n) symmetric\n    variable btilde(n)\n    variable t(m)\n    maximize( det_rootn( Asqr ) )\n    subject to\n        t >= 0;\n        for i = 1:m\n            [ -(Asqr - t(i)*As{i}), -(btilde - t(i)*bs{i}), zeros(n,n);\n              -(btilde - t(i)*bs{i})', -(- 1 - t(i)*cs{i}), -btilde';\n               zeros(n,n), -btilde, Asqr] >= 0;\n        end\ncvx_end\n\n% convert to ellipsoid parametrization E = { x | || Ax + b || <= 1 }\nA = sqrtm(Asqr);\nb = A\\btilde;\n\n% plot ellipsoids using { x | || A_i x + b_i || <= alpha } parametrization\nnoangles = 200;\nangles   = linspace( 0, 2 * pi, noangles );\n\nclf\nfor i=1:m\n  Ai = sqrtm(As{i}); bi = Ai\\bs{i};\n  alpha = bs{i}'*inv(As{i})*bs{i} - cs{i};\n  ellipse  = Ai \\ [ sqrt(alpha)*cos(angles)-bi(1) ; sqrt(alpha)*sin(angles)-bi(2) ];\n  plot( ellipse(1,:), ellipse(2,:), 'b-' );\n  hold on\nend\nellipse  = A \\ [ cos(angles) - b(1) ; sin(angles) - b(2) ];\n\nplot( ellipse(1,:), ellipse(2,:), 'r--' );\naxis square\naxis off\nhold off\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/placement_lin.m",
    "content": "% Figure 8.15: Linear placement problem\n% Section 8.7.3, Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/24/05\n% (a figure is generated)\n%\n% Placement problem with 6 free points, 8 fixed points and 27 links.\n% The coordinates of the free points minimize the sum of the Euclidean\n% lengths of the links, i.e.\n%           minimize    sum_{i<j) h(||x_i - x_j||)\n% where h(z) = z.\n\nlinewidth = 1;      % in points;  width of dotted lines\nmarkersize = 5;    % in points;  marker size\n\n% Input Data\nfixed = [ 1   1  -1 -1    1   -1  -0.2  0.1; % coordinates of fixed points\n          1  -1  -1  1 -0.5 -0.2    -1    1]';\nM = size(fixed,1);  % number of fixed points\nN = 6;              % number of free points\n\n% first N columns of A correspond to free points,\n% last M columns correspond to fixed points\n\nA = [ 1  0  0 -1  0  0    0  0  0  0  0  0  0  0\n      1  0 -1  0  0  0    0  0  0  0  0  0  0  0\n      1  0  0  0 -1  0    0  0  0  0  0  0  0  0\n      1  0  0  0  0  0   -1  0  0  0  0  0  0  0\n      1  0  0  0  0  0    0 -1  0  0  0  0  0  0\n      1  0  0  0  0  0    0  0  0  0 -1  0  0  0\n      1  0  0  0  0  0    0  0  0  0  0  0  0 -1\n      0  1 -1  0  0  0    0  0  0  0  0  0  0  0\n      0  1  0 -1  0  0    0  0  0  0  0  0  0  0\n      0  1  0  0  0 -1    0  0  0  0  0  0  0  0\n      0  1  0  0  0  0    0 -1  0  0  0  0  0  0\n      0  1  0  0  0  0    0  0 -1  0  0  0  0  0\n      0  1  0  0  0  0    0  0  0  0  0  0 -1  0\n      0  0  1 -1  0  0    0  0  0  0  0  0  0  0\n      0  0  1  0  0  0    0 -1  0  0  0  0  0  0\n      0  0  1  0  0  0    0  0  0  0 -1  0  0  0\n      0  0  0  1 -1  0    0  0  0  0  0  0  0  0\n      0  0  0  1  0  0    0  0 -1  0  0  0  0  0\n      0  0  0  1  0  0    0  0  0 -1  0  0  0  0\n      0  0  0  1  0  0    0  0  0  0  0 -1  0  0\n      0  0  0  1  0 -1    0  0  0  0  0 -1  0  0        % error in data!!!\n      0  0  0  0  1 -1    0  0  0  0  0  0  0  0\n      0  0  0  0  1  0   -1  0  0  0  0  0  0  0\n      0  0  0  0  1  0    0  0  0 -1  0  0  0  0\n      0  0  0  0  1  0    0  0  0  0  0  0  0 -1\n      0  0  0  0  0  1    0  0 -1  0  0  0  0  0\n      0  0  0  0  0  1    0  0  0  0 -1  0  0  0 ];\nnolinks = size(A,1);    % number of links\n\nfprintf(1,'Computing the optimal locations of the 6 free points...');\n\ncvx_begin\n    variable x(N+M,2)\n    minimize ( sum(norms( A*x,2,2 )))\n    x(N+[1:M],:) == fixed;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Plots\nfree_sum = x(1:N,:);\nfigure(1);\ndots = plot(free_sum(:,1), free_sum(:,2), 'or', fixed(:,1), fixed(:,2), 'bs');\nset(dots(1),'MarkerFaceColor','red');\nhold on\nlegend('Free points','Fixed points','Location','Best');\nfor i=1:nolinks\n  ind = find(A(i,:));\n  line2 = plot(x(ind,1), x(ind,2), ':k');\n  hold on\n  set(line2,'LineWidth',linewidth);\nend\naxis([-1.1 1.1 -1.1 1.1]) ;\naxis equal;\ntitle('Linear placement problem');\n% print -deps placement-lin.eps\n\nfigure(2)\nall = [free_sum; fixed];\nbins = 0.05:0.1:1.95;\nlengths = sqrt(sum((A*all).^2')');\n[N2,hist2] = hist(lengths,bins);\nbar(hist2,N2);\nhold on;\nxx = linspace(0,2,1000);  yy = 2*xx;\nplot(xx,yy,'--');\naxis([0 2 0 4.5]);\nhold on\nplot([0 2], [0 0 ], 'k-');\ntitle('Distribution of the 27 link lengths');\n% print -deps placement-lin-hist.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/placement_quad.m",
    "content": "% Figure 8.16: Quadratic placement problem\n% Section 8.7.3, Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/24/05\n% (a figure is generated)\n%\n% Placement problem with 6 free points, 8 fixed points and 27 links.\n% The coordinates of the free points minimize the sum of the squares of\n% Euclidean lengths of the links, i.e.\n%           minimize    sum_{i<j) h(||x_i - x_j||)\n% where h(z) = z^2.\n\nlinewidth = 1;      % in points;  width of dotted lines\nmarkersize = 5;    % in points;  marker size\n\n% Input data\nfixed = [ 1   1  -1 -1    1   -1  -0.2  0.1; % coordinates of fixed points\n          1  -1  -1  1 -0.5 -0.2    -1    1]';\nM = size(fixed,1);  % number of fixed points\nN = 6;              % number of free points\n\n% first N columns of A correspond to free points,\n% last M columns correspond to fixed points\n\nA = [ 1  0  0 -1  0  0    0  0  0  0  0  0  0  0\n      1  0 -1  0  0  0    0  0  0  0  0  0  0  0\n      1  0  0  0 -1  0    0  0  0  0  0  0  0  0\n      1  0  0  0  0  0   -1  0  0  0  0  0  0  0\n      1  0  0  0  0  0    0 -1  0  0  0  0  0  0\n      1  0  0  0  0  0    0  0  0  0 -1  0  0  0\n      1  0  0  0  0  0    0  0  0  0  0  0  0 -1\n      0  1 -1  0  0  0    0  0  0  0  0  0  0  0\n      0  1  0 -1  0  0    0  0  0  0  0  0  0  0\n      0  1  0  0  0 -1    0  0  0  0  0  0  0  0\n      0  1  0  0  0  0    0 -1  0  0  0  0  0  0\n      0  1  0  0  0  0    0  0 -1  0  0  0  0  0\n      0  1  0  0  0  0    0  0  0  0  0  0 -1  0\n      0  0  1 -1  0  0    0  0  0  0  0  0  0  0\n      0  0  1  0  0  0    0 -1  0  0  0  0  0  0\n      0  0  1  0  0  0    0  0  0  0 -1  0  0  0\n      0  0  0  1 -1  0    0  0  0  0  0  0  0  0\n      0  0  0  1  0  0    0  0 -1  0  0  0  0  0\n      0  0  0  1  0  0    0  0  0 -1  0  0  0  0\n      0  0  0  1  0  0    0  0  0  0  0 -1  0  0\n      0  0  0  1  0 -1    0  0  0  0  0 -1  0  0        % error in data!!!\n      0  0  0  0  1 -1    0  0  0  0  0  0  0  0\n      0  0  0  0  1  0   -1  0  0  0  0  0  0  0\n      0  0  0  0  1  0    0  0  0 -1  0  0  0  0\n      0  0  0  0  1  0    0  0  0  0  0  0  0 -1\n      0  0  0  0  0  1    0  0 -1  0  0  0  0  0\n      0  0  0  0  0  1    0  0  0  0 -1  0  0  0 ];\nnolinks = size(A,1);    % number of links\n\nfprintf(1,'Computing the optimal locations of the 6 free points...');\n\ncvx_begin\n    variable x(N+M,2)\n    minimize ( sum(square_pos(norms( A*x,2,2 ))))\n    x(N+[1:M],:) == fixed;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Plots\nfree_sum = x(1:N,:);\nfigure(1);\ndots = plot(free_sum(:,1), free_sum(:,2), 'or', fixed(:,1), fixed(:,2), 'bs');\nset(dots(1),'MarkerFaceColor','red');\nhold on\nlegend('Free points','Fixed points','Location','Best');\nfor i=1:nolinks\n  ind = find(A(i,:));\n  line2 = plot(x(ind,1), x(ind,2), ':k');\n  hold on\n  set(line2,'LineWidth',linewidth);\nend\naxis([-1.1 1.1 -1.1 1.1]) ;\naxis equal;\ntitle('Quadratic placement problem');\n% print -deps placement-quadr.eps\n\nfigure(2)\nall = [free_sum; fixed];\nbins = 0.05:0.1:1.95;\nlengths = sqrt(sum((A*all).^2')');\n[N2,hist2] = hist(lengths,bins);\nbar(hist2,N2);\nhold on;\nxx = linspace(0,2,1000); yy = (4/1.5^2)*xx.^2;\nplot(xx,yy,'--');\naxis([0 1.5 0 4.5]);\nhold on\nplot([0 2], [0 0 ], 'k-');\ntitle('Distribution of the 27 link lengths');\n% print -deps placement-quadr-hist.eps\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/placement_quar.m",
    "content": "% Figure 8.17: Fourth-order placement problem\n% Section 8.7.3, Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/24/05\n% (a figure is generated)\n%\n% Placement problem with 6 free points, 8 fixed points and 27 links.\n% The coordinates of the free points minimize the sum of the squares of\n% Euclidean lengths of the links, i.e.\n%           minimize    sum_{i<j) h(||x_i - x_j||)\n% where h(z) = z^4.\n\nlinewidth = 1;      % in points;  width of dotted lines\nmarkersize = 5;    % in points;  marker size\n\nfixed = [ 1   1  -1 -1    1   -1  -0.2  0.1; % coordinates of fixed points\n          1  -1  -1  1 -0.5 -0.2    -1    1]';\nM = size(fixed,1);  % number of fixed points\nN = 6;              % number of free points\n\n% first N columns of A correspond to free points,\n% last M columns correspond to fixed points\n\nA = [ 1  0  0 -1  0  0    0  0  0  0  0  0  0  0\n      1  0 -1  0  0  0    0  0  0  0  0  0  0  0\n      1  0  0  0 -1  0    0  0  0  0  0  0  0  0\n      1  0  0  0  0  0   -1  0  0  0  0  0  0  0\n      1  0  0  0  0  0    0 -1  0  0  0  0  0  0\n      1  0  0  0  0  0    0  0  0  0 -1  0  0  0\n      1  0  0  0  0  0    0  0  0  0  0  0  0 -1\n      0  1 -1  0  0  0    0  0  0  0  0  0  0  0\n      0  1  0 -1  0  0    0  0  0  0  0  0  0  0\n      0  1  0  0  0 -1    0  0  0  0  0  0  0  0\n      0  1  0  0  0  0    0 -1  0  0  0  0  0  0\n      0  1  0  0  0  0    0  0 -1  0  0  0  0  0\n      0  1  0  0  0  0    0  0  0  0  0  0 -1  0\n      0  0  1 -1  0  0    0  0  0  0  0  0  0  0\n      0  0  1  0  0  0    0 -1  0  0  0  0  0  0\n      0  0  1  0  0  0    0  0  0  0 -1  0  0  0\n      0  0  0  1 -1  0    0  0  0  0  0  0  0  0\n      0  0  0  1  0  0    0  0 -1  0  0  0  0  0\n      0  0  0  1  0  0    0  0  0 -1  0  0  0  0\n      0  0  0  1  0  0    0  0  0  0  0 -1  0  0\n      0  0  0  1  0 -1    0  0  0  0  0 -1  0  0        % error in data!!!\n      0  0  0  0  1 -1    0  0  0  0  0  0  0  0\n      0  0  0  0  1  0   -1  0  0  0  0  0  0  0\n      0  0  0  0  1  0    0  0  0 -1  0  0  0  0\n      0  0  0  0  1  0    0  0  0  0  0  0  0 -1\n      0  0  0  0  0  1    0  0 -1  0  0  0  0  0\n      0  0  0  0  0  1    0  0  0  0 -1  0  0  0 ];\nnolinks = size(A,1);    % number of links\n\nfprintf(1,'Computing the optimal locations of the 6 free points...');\n\ncvx_begin\n    variable x(N+M,2)\n    minimize ( sum(square_pos(square_pos(norms( A*x,2,2 )))))\n    x(N+[1:M],:) == fixed;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Plots\nfree_sum = x(1:N,:);\nfigure(1);\ndots = plot(free_sum(:,1), free_sum(:,2), 'or', fixed(:,1), fixed(:,2), 'bs');\nset(dots(1),'MarkerFaceColor','red');\nhold on\nlegend('Free points','Fixed points','Location','Best');\nfor i=1:nolinks\n  ind = find(A(i,:));\n  line2 = plot(x(ind,1), x(ind,2), ':k');\n  hold on\n  set(line2,'LineWidth',linewidth);\nend\naxis([-1.1 1.1 -1.1 1.1]) ;\naxis equal;\ntitle('Fourth-order placement problem');\n% print -deps placement-quartic.eps\n\nfigure(2)\nall = [free_sum; fixed];\nbins = 0.05:0.1:1.95;\nlengths = sqrt(sum((A*all).^2')');\n[N2,hist2] = hist(lengths,bins);\nbar(hist2,N2);\nhold on;\nxx = linspace(0,2,1000);  yy = (6/1.5^4)*xx.^4;\nplot(xx,yy,'--');\naxis([0 1.5 0 4.5]);\nhold on\nplot([0 2], [0 0 ], 'k-');\ntitle('Distribution of the 27 link lengths');\n% print -deps placement-quartic-hist.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/poly3_discr.m",
    "content": "% Polynomial discrimination\n% Section 8.6.2, Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/23/05\n% (a figure is generated)\n%\n% The goal is to find the polynomial of degree 3 on R^n that separates\n% two sets of points {x_1,...,x_N} and {y_1,...,y_N}. We are trying to find\n% the coefficients of an order-3-polynomial P(x) that would satisfy:\n%           minimize    t\n%               s.t.    P(x_i) <= t  for i = 1,...,N\n%                       P(y_i) >= t   for i = 1,...,M\n\n% Data generation\nrand('state',0);\nN = 100;\nM = 120;\n\n% The points X lie within a circle of radius 0.9, with a wedge of points\n% near [1.1,0] removed. The points Y lie outside a circle of radius 1.1,\n% with a wedge of points near [1.1,0] added. The wedges are precisely what\n% makes the separation difficult and interesting.\nX = 2 * rand(2,N) - 1;\nX = X * diag(0.9*rand(1,N)./sqrt(sum(X.^2)));\nY = 2 * rand(2,M) - 1;\nY = Y * diag((1.1+rand(1,M))./sqrt(sum(Y.^2)));\nd = sqrt(sum((X-[1.1;0]*ones(1,N)).^2));\nY = [ Y, X(:,d<0.9) ];\nX = X(:,d>1);\nN = size(X,2);\nM = size(Y,2);\n\n% Construct Vandermonde-style monomial matrices\np1   = [0,0,1,0,1,2,0,1,2,3]';\np2   = [0,1,1,2,2,2,3,3,3,3]'-p1;\nnp   = length(p1);\nop   = ones(np,1);\nmonX = X(op,:) .^ p1(:,ones(1,N)) .* X(2*op,:) .^ p2(:,ones(1,N));\nmonY = Y(op,:) .^ p1(:,ones(1,M)) .* Y(2*op,:) .^ p2(:,ones(1,M));\n\n% Solution via CVX\nfprintf(1,'Finding the optimal polynomial of order 4 that separates the 2 classes...');\n\ncvx_begin\n    variables a(np) t(1)\n    minimize ( t )\n    a'*monX <= t;\n    a'*monY >= -t;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Displaying results\nnopts = 2000;\nangles = linspace(0,2*pi,nopts);\ncont = zeros(2,nopts);\nfor i=1:nopts\n   v = [cos(angles(i)); sin(angles(i))];\n   l = 0;  u = 1;\n   while ( u - l > 1e-3 )\n      s = (u+l)/2;\n      x = s * v;\n      if a' * ( x(op,:) .^ p1 .* x(2*op) .^ p2 ) > 0, \n          u = s; \n      else\n          l = s;\n      end\n   end;\n   s = (u+l)/2;\n   cont(:,i) = s*v;\nend;\n\ngraph=plot(X(1,:),X(2,:),'o', Y(1,:), Y(2,:),'o', cont(1,:), cont(2,:), '-');\nset(graph(2),'MarkerFaceColor',[0 0.5 0]);\ntitle('No cubic polynomial can separate the 2 classes')\n\n% Results\ndisp('-----------------------------------------------------------------');\ndisp('As seen on the figure, the 2 sets of points are not separated.   ');\ndisp('There exists no cubic polynomial that can separate these 2 sets.');\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/poly4_discr.m",
    "content": "% Polynomial discrimination\n% Section 8.6.2, Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/23/05\n% (a figure is generated)\n%\n% The goal is to find the polynomial of degree 4 on R^n that separates\n% two sets of points {x_1,...,x_N} and {y_1,...,y_N}. We are trying to find\n% the coefficients of an order-4-polynomial P(x) that would satisfy:\n%           minimize    t\n%               s.t.    P(x_i) <= t  for i = 1,...,N\n%                       P(y_i) >= t   for i = 1,...,M\n\n% Data generation\nrand('state',0);\nN = 100;\nM = 120;\n\n% The points X lie within a circle of radius 0.9, with a wedge of points\n% near [1.1,0] removed. The points Y lie outside a circle of radius 1.1,\n% with a wedge of points near [1.1,0] added. The wedges are precisely what\n% makes the separation difficult and interesting.\nX = 2 * rand(2,N) - 1;\nX = X * diag(0.9*rand(1,N)./sqrt(sum(X.^2)));\nY = 2 * rand(2,M) - 1;\nY = Y * diag((1.1+rand(1,M))./sqrt(sum(Y.^2)));\nd = sqrt(sum((X-[1.1;0]*ones(1,N)).^2));\nY = [ Y, X(:,d<0.9) ];\nX = X(:,d>1);\nN = size(X,2);\nM = size(Y,2);\n\n% Construct Vandermonde-style monomial matrices\np1   = [0,0,1,0,1,2,0,1,2,3,0,1,2,3,4]';\np2   = [0,1,1,2,2,2,3,3,3,3,4,4,4,4,4]'-p1;\nnp   = length(p1);\nop   = ones(np,1);\nmonX = X(op,:) .^ p1(:,ones(1,N)) .* X(2*op,:) .^ p2(:,ones(1,N));\nmonY = Y(op,:) .^ p1(:,ones(1,M)) .* Y(2*op,:) .^ p2(:,ones(1,M));\n\n% Solution via CVX\nfprintf(1,'Finding the optimal polynomial of order 4 that separates the 2 classes...');\n\ncvx_begin\n    variables a(np) t(1)\n    minimize ( t )\n    a'*monX <= t;\n    a'*monY >= -t;\n    % For normalization purposes only\n    norm(a) <= 1;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Displaying results\nnopts = 2000;\nangles = linspace(0,2*pi,nopts);\ncont = zeros(2,nopts);\nfor i=1:nopts\n   v = [cos(angles(i)); sin(angles(i))];\n   l = 0;  u = 1;\n   while ( u - l > 1e-3 )\n      s = (u+l)/2;\n      x = s * v;\n      if a' * ( x(op,:) .^ p1 .* x(2*op) .^ p2 ) > 0, \n          u = s; \n      else\n          l = s;\n      end\n   end;\n   s = (u+l)/2;\n   cont(:,i) = s*v;\nend;\n\ngraph = plot(X(1,:),X(2,:),'o', Y(1,:), Y(2,:),'o', cont(1,:), cont(2,:), '-');\nset(graph(2),'MarkerFaceColor',[0 0.5 0]);\ntitle('Optimal order-4 polynomial that separates the 2 classes')\n% print -deps min-deg-discr.eps\n\n%%%% Dual infeasible ?????\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/quad_discr.m",
    "content": "% Quadratic discrimination (separating ellipsoid)\n% Section 8.6.2, Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/16/05\n% (a figure is generated)\n%\n% The goal is to find an ellipsoid that contains all the points\n% x_1,...,x_N but none of the points y_1,...,y_M. The equation of the\n% ellipsoidal surface is: z'*P*z + q'*z + r =0\n% P, q and r can be obtained by solving the SDP feasibility problem:\n%           minimize    0\n%               s.t.    x_i'*P*x_i + q'*x_i + r >=  1   for i = 1,...,N\n%                       y_i'*P*y_i + q'*y_i + r <= -1   for i = 1,...,M\n%                       P <= -I\n\n% data generation\nn = 2;\nrand('state',0);  randn('state',0);\nN=50;\nX = randn(2,N);  X = X*diag(0.99*rand(1,N)./sqrt(sum(X.^2)));\nY = randn(2,N);  Y = Y*diag((1.02+rand(1,N))./sqrt(sum(Y.^2)));\nT = [1 -1; 2 1];  X = T*X;  Y = T*Y;\n\n% Solution via CVX\nfprintf(1,'Find the optimal ellipsoid that seperates the 2 classes...');\n\ncvx_begin sdp\n    variable P(n,n) symmetric\n    variables q(n) r(1)\n    P <= -eye(n);\n    sum((X'*P).*X',2) + X'*q + r >= +1;\n    sum((Y'*P).*Y',2) + Y'*q + r <= -1;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Displaying results\nr = -r; P = -P; q = -q;\nc = 0.25*q'*inv(P)*q - r;\nxc = -0.5*inv(P)*q;\nnopts = 1000;\nangles = linspace(0,2*pi,nopts);\nell = inv(sqrtm(P/c))*[cos(angles); sin(angles)] + repmat(xc,1,nopts);\ngraph=plot(X(1,:),X(2,:),'o', Y(1,:), Y(2,:),'o', ell(1,:), ell(2,:),'-');\nset(graph(2),'MarkerFaceColor',[0 0.5 0]);\nset(gca,'XTick',[]); set(gca,'YTick',[]);\ntitle('Quadratic discrimination');\n% print -deps ellips.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/robust_lin_discr.m",
    "content": "% Figure 8.9: Robust linear discrimination problem\n% Section 8.6.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/16/05\n% (a figure is generated)\n%\n% The goal is to find a function f(x) = a'*x - b that classifies the points\n% {x_1,...,x_N} and {y_1,...,y_M} with maximal 'gap'. a and b can be\n% obtained by solving the following problem:\n%           maximize    t\n%               s.t.    a'*x_i - b >=  t     for i = 1,...,N\n%                       a'*y_i - b <= -t     for i = 1,...,M\n%                       ||a||_2 <= 1\n\n% data generation\nn = 2;\nrandn('state',3);\nN = 10; M = 6;\nY = [1.5+1*randn(1,M); 2*randn(1,M)];\nX = [-1.5+1*randn(1,N); 2*randn(1,N)];\nT = [-1 1; 1 1];\nY = T*Y;  X = T*X;\n\n% Solution via CVX\ncvx_begin\n    variables a(n) b(1) t(1)\n    maximize (t)\n    X'*a - b >= t;\n    Y'*a - b <= -t;\n    norm(a) <= 1;\ncvx_end\n\n% Displaying results\nlinewidth = 0.5;  % for the squares and circles\nt_min = min([X(1,:),Y(1,:)]);\nt_max = max([X(1,:),Y(1,:)]);\ntt = linspace(t_min-1,t_max+1,100);\np = -a(1)*tt/a(2) + b/a(2);\np1 = -a(1)*tt/a(2) + (b+t)/a(2);\np2 = -a(1)*tt/a(2) + (b-t)/a(2);\n\ngraph = plot(X(1,:),X(2,:), 'o', Y(1,:), Y(2,:), 'o');\nset(graph(1),'LineWidth',linewidth);\nset(graph(2),'LineWidth',linewidth);\nset(graph(2),'MarkerFaceColor',[0 0.5 0]);\nhold on;\nplot(tt,p, '-r', tt,p1, '--r', tt,p2, '--r');\naxis equal\ntitle('Robust linear discrimination problem');\n% print -deps linsep.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/separate_ell_2D.m",
    "content": "% Separating ellipsoids in 2D\n% Joelle Skaf - 11/06/05\n% (a figure is generated)\n%\n% Finds a separating hyperplane between 2 ellipsoids {x| ||Ax+b||^2<=1} and\n% {y | ||Cy + d||^2 <=1} by solving the following problem and using its\n% dual variables:\n%               minimize    ||w||\n%                   s.t.    ||Ax + b||^2 <= 1       : lambda\n%                           ||Cy + d||^2 <= 1       : mu\n%                           x - y == w              : z\n% the vector z will define a separating hyperplane because z'*(x-y)>0\n\n% input data\nn = 2;\nA = eye(n);\nb = zeros(n,1);\nC = [2 1; -.5 1];\nd = [-3; -3];\n\n% solving for the minimum distance between the 2 ellipsoids and finding\n% the dual variables\ncvx_begin\n    variables x(n) y(n) w(n)\n    dual variables lam muu z\n    minimize ( norm(w,2) )\n    subject to\n    lam:    square_pos( norm (A*x + b) ) <= 1;\n    muu:    square_pos( norm (C*y + d) ) <= 1;\n    z:      x - y == w;\ncvx_end\n\n\nt = (x + y)/2;\np=z;\np(1) = z(2); p(2) = -z(1);\nc = linspace(-2,2,100);\nq = repmat(t,1,length(c)) +p*c;\n\n% figure\nnopts = 1000;\nangles = linspace(0,2*pi,nopts);\n[u,v] = meshgrid([-2:0.01:4]);\nz1 = (A(1,1)*u + A(1,2)*v + b(1)).^2 + (A(2,1)*u + A(2,2)*v + b(2)).^2;\nz2 = (C(1,1)*u + C(1,2)*v + d(1)).^2 + (C(2,1)*u + C(2,2)*v + d(2)).^2;\ncontour(u,v,z1,[1 1]);\nhold on;\ncontour(u,v,z2,[1 1]);\naxis square\nplot(x(1),x(2),'r+');\nplot(y(1),y(2),'b+');\nline([x(1) y(1)],[x(2) y(2)]);\nplot(q(1,:),q(2,:),'k');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/separate_poly_2D.m",
    "content": "% Section 8.2.2: Separating polyhedra in 2D\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/09/05\n% (a figure is generated)\n%\n% If the two polyhedra C = {x | A1*x <= b1} and D = {y | A2*y <= b2} can be\n% separated by a hyperplane, it will be of the  form\n%           z'*x - z'*y >= -lambda'*b1 - mu'*b2 > 0\n% where z, lambda and mu are the optimal variables of the problem:\n%           maximize    -b1'*lambda - b2'*mu\n%               s.t.    A1'*lambda + z = 0\n%                       A2'*mu  - z = 0\n%                       norm*(z) <= 1\n%                       lambda >=0 , mu >= 0\n% Note: here x is in R^2\n\n% Input data\nrandn('seed',0);\nn  = 2;\nm = 2*n;\nA1 = [1 1; 1 -1; -1 1; -1 -1];\nA2 = [1 0; -1 0; 0 1; 0 -1];\nb1 = 2*ones(m,1);\nb2 = [5; -3; 4; -2];\n\n% Solving with CVX\nfprintf(1,'Finding a separating hyperplane between the 2 polyhedra...');\n\ncvx_begin\n    variables lam(m) muu(m) z(n)\n    maximize ( -b1'*lam - b2'*muu)\n    A1'*lam + z == 0;\n    A2'*muu - z == 0;\n    norm(z) <= 1;\n    -lam <=0;\n    -muu <=0;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Displaying results\ndisp('------------------------------------------------------------------');\ndisp('The distance between the 2 polyhedra C and D is: ' );\ndisp(['dist(C,D) = ' num2str(cvx_optval)]);\n\n% Plotting\nt = linspace(-3,6,100);\np = -z(1)*t/z(2) + (muu'*b2 - lam'*b1)/(2*z(2));\nfigure;\nfill([-2; 0; 2; 0],[0;2;0;-2],'b', [3;5;5;3],[2;2;4;4],'r')\naxis([-3 6 -3 6])\naxis square\nhold on;\nplot(t,p)\ntitle('Separating 2 polyhedra by a hyperplane');\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/separate_pt_poly.m",
    "content": "% Section 8.1.1: Separating a point from a polyhedron\n% Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf - 10/09/05\n%\n% The goal is to produce a hyperplane separating x0 and the polyhedron\n% defined as {x | Ax <= b}\n%           minimize    mu'*x0 - b'*lambda\n%                       A'*lambda = mu\n%                       norm(mu)* <= 1\n%                       lambda >= 0\n\n% Input data\nrandn('seed',0);\nn  = 10;\nm  = 2*n;\nx0 = randn(n,1);\nA  = randn(m,n);\nb  = rand(m,1);\n\n% CVX solution\nfprintf(1,'Finding a separating hyperplane between the 2 polyhedra...');\n\ncvx_begin quiet\n    variables muu(n) lambda(m)\n    maximize ( muu'*x0 - b'*lambda )\n    A'*lambda == muu;\n    norm(muu) <= 1;\n    lambda >= 0;\ncvx_end\n\nfprintf(1,'Done! \\n');\n\n% Verification\ndisp('------------------------------------------------------------------');\ndisp('Note that 0 is in {x | Ax <= b} by construction...' );\ndisp('Verifying that x0 is separated from {x | Ax <= b} i.e. mu^T*x0 > 0');\ndisp([' mu^T*x0 = ' num2str(muu'*x0) ]);\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/svm_1.m",
    "content": "% Figure 8.10: Approximate linear discrimination via linear programming\n% Section 8.6.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/16/05\n% (a figure is generated)\n%\n% The goal is to find a function f(x) = a'*x - b that classifies the non-\n% separable points {x_1,...,x_N} and {y_1,...,y_M} by allowing some\n% misclassification. a and b can be obtained by solving the following\n% problem:\n%           minimize    1'*u + 1'*v\n%               s.t.    a'*x_i - b >= 1 - u_i        for i = 1,...,N\n%                       a'*y_i - b <= -(1 - v_i)     for i = 1,...,M\n%                       u >= 0 and v >= 0\n\n% data generation\nn = 2;\nrandn('state',2);\nN = 50; M = 50;\nY = [1.5+0.9*randn(1,0.6*N), 1.5+0.7*randn(1,0.4*N);\n     2*(randn(1,0.6*N)+1), 2*(randn(1,0.4*N)-1)];\nX = [-1.5+0.9*randn(1,0.6*M),  -1.5+0.7*randn(1,0.4*M);\n      2*(randn(1,0.6*M)-1), 2*(randn(1,0.4*M)+1)];\nT = [-1 1; 1 1];\nY = T*Y;  X = T*X;\n\n% Solution via CVX\ncvx_begin\n    variables a(n) b(1) u(N) v(M)\n    minimize (ones(1,N)*u + ones(1,M)*v)\n    X'*a - b >= 1 - u;\n    Y'*a - b <= -(1 - v);\n    u >= 0;\n    v >= 0;\ncvx_end\n\n% Displaying results\nlinewidth = 0.5;  % for the squares and circles\nt_min = min([X(1,:),Y(1,:)]);\nt_max = max([X(1,:),Y(1,:)]);\ntt = linspace(t_min-1,t_max+1,100);\np = -a(1)*tt/a(2) + b/a(2);\np1 = -a(1)*tt/a(2) + (b+1)/a(2);\np2 = -a(1)*tt/a(2) + (b-1)/a(2);\n\ngraph = plot(X(1,:),X(2,:), 'o', Y(1,:), Y(2,:), 'o');\nset(graph(1),'LineWidth',linewidth);\nset(graph(2),'LineWidth',linewidth);\nset(graph(2),'MarkerFaceColor',[0 0.5 0]);\nhold on;\nplot(tt,p, '-r', tt,p1, '--r', tt,p2, '--r');\naxis equal\ntitle('Approximate linear discrimination via linear programming');\n% print -deps svc-discr.eps\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/svm_2.m",
    "content": "% Figure 8.11: Approximate linear discrimination via support vector classifier\n% Section 8.6.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Original by Lieven Vandenberghe\n% Adapted for CVX by Joelle Skaf - 10/16/05\n% (a figure is generated)\n%\n% The goal is to find a function f(x) = a'*x - b that classifies the non-\n% separable points {x_1,...,x_N} and {y_1,...,y_M} by doing a trade-off\n% between the number of misclassifications and the width of the separating\n% slab. a and b can be obtained by solving the following problem:\n%           minimize    ||a||_2 + gamma*(1'*u + 1'*v)\n%               s.t.    a'*x_i - b >= 1 - u_i        for i = 1,...,N\n%                       a'*y_i - b <= -(1 - v_i)     for i = 1,...,M\n%                       u >= 0 and v >= 0\n% where gamma gives the relative weight of the number of misclassified\n% points compared to the width of the slab.\n\n% data generation\nn = 2;\nrandn('state',2);\nN = 50; M = 50;\nY = [1.5+0.9*randn(1,0.6*N), 1.5+0.7*randn(1,0.4*N);\n     2*(randn(1,0.6*N)+1), 2*(randn(1,0.4*N)-1)];\nX = [-1.5+0.9*randn(1,0.6*M),  -1.5+0.7*randn(1,0.4*M);\n      2*(randn(1,0.6*M)-1), 2*(randn(1,0.4*M)+1)];\nT = [-1 1; 1 1];\nY = T*Y;  X = T*X;\ng = 0.1;            % gamma\n\n% Solution via CVX\ncvx_begin\n    variables a(n) b(1) u(N) v(M)\n    minimize (norm(a) + g*(ones(1,N)*u + ones(1,M)*v))\n    X'*a - b >= 1 - u;\n    Y'*a - b <= -(1 - v);\n    u >= 0;\n    v >= 0;\ncvx_end\n\n% Displaying results\nlinewidth = 0.5;  % for the squares and circles\nt_min = min([X(1,:),Y(1,:)]);\nt_max = max([X(1,:),Y(1,:)]);\ntt = linspace(t_min-1,t_max+1,100);\np = -a(1)*tt/a(2) + b/a(2);\np1 = -a(1)*tt/a(2) + (b+1)/a(2);\np2 = -a(1)*tt/a(2) + (b-1)/a(2);\n\ngraph = plot(X(1,:),X(2,:), 'o', Y(1,:), Y(2,:), 'o');\nset(graph(1),'LineWidth',linewidth);\nset(graph(2),'LineWidth',linewidth);\nset(graph(2),'MarkerFaceColor',[0 0.5 0]);\nhold on;\nplot(tt,p, '-r', tt,p1, '--r', tt,p2, '--r');\naxis equal\ntitle('Approximate linear discrimination via support vector classifier');\n% print -deps svc-discr2.eps\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch08_geometric_probs/test_floorplan.m",
    "content": "% Example 8.7: Floorplan generation test script\n% Section 8.8.1/2, Boyd & Vandenberghe \"Convex Optimization\"\n% Joelle Skaf 12/04/05\n%\n% Rectangles aligned with the axes need to be place in the smallest\n% possible bounding box. No overlap is allowed. Each rectangle to be placed\n% can be reconfigured, within some limits.\n% In the current problem, 60 rectangles are to be place. We are given 2\n% acyclic graphs H and V (for horizontal and vertical) that specify the\n% relative positioning constraints of those rectangles.\n% We are also given minimal areas for the rectangles and aspect ratio\n% constraints\n\n% input data\nload data_floorplan_60;\nrho = 1;\nAmin = 100*ones(1,n);\n\n[W, H, w, h, x, y] = floorplan(adj_H, adj_V, rho, Amin,ones(60,1)*0.5,ones(60,1)*2);\nfill([0; W; W; 0],[0;0;H;H],[1 1 1]);           % bounding box\nhold on\nfor i=1:n\n    fill([x(i); x(i)+w(i); x(i)+w(i); x(i)],[y(i);y(i);y(i)+h(i);y(i)+h(i)],0.90*[1 1 1]);\n    hold on;\n    text(x(i)+w(i)/2, y(i)+h(i)/2,[int2str(i)]);\nend\naxis([0 W 0 H]);\naxis equal; axis off;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch11_intpt_methods/Contents.m",
    "content": "% Chapter 11: Interior-point methods\n%\n%  log_utility_flow.m - Section 11.8.4: Network rate optimization\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Ch11_intpt_methods/log_utility_flow.m",
    "content": "% Section 11.8.4: Network rate optimization\n% Boyd & Vandenberghe \"Convex Optimization\" \n% Argyrios Zymnis - 05/03/08\n%\n% We consider a network with n flows and L links. Each flow i,\n% moves along a fixed predetermined path (i.e. a subset of the links)\n% and has an associated rate x_i. Each link j has an associated capacity\n% c_j. The total rate of all flows travelling along a link cannot exceed\n% the link capacity. We can describe these link capacity limits using the\n% flow-link incidence matrix A \\in \\reals^{L \\times n}, where\n% A_{ij} = 1, if flow j passes through link i and 0 otherwise.\n% The link capacity constraints can be expressed as A*x <= c\n% In the network rate problem the variables are the flow rates x. The\n% objective is to choose the flow rates to maximize a separate utility\n% function U, given by\n%           U(x) = U_1(x_1)+U_2(x_2)+...+U_n(x_n)\n% The network rate optimization problem is then\n%           maximize    U(x)\n%           subject to  A*x <= c\n% Here we use U_i(x_i) = log x_i for all i\n\n% Input data\nrand('state',1)\nL = 20;\nn = 10;\nk = 7; %average links per flow\nA = double(rand(L,n) <= k/L);\nc = 0.9*rand(L,1)+0.1;\n\n% Solve network rate problem\ncvx_begin\n    variable x(n);\n    maximize(sum(log(x)))\n    subject to\n        A*x <= c\ncvx_end\nprimal_obj = cvx_optval;\n\n% Solve dual problem to obtain link prices\ncvx_begin\n    variable lambda(L);\n    minimize(c'*lambda-sum(log(A'*lambda))-n)\n    subject to\n        lambda >= 0\ncvx_end\ndual_obj = cvx_optval;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/cvxbook/Contents.m",
    "content": "% Figures, examples, and exercises from the book <a href=\"http://stanford.edu/~boyd/cvxbook\">Convex Optimization</a>\n%\n%  Ch04_cvx_opt_probs/     - Chapter 4: Convex optimization problems\n%  Ch05_duality/           - Chapter 5: Duality\n%  Ch06_approx_fitting/    - Chapter 6: Approximation and fitting\n%  Ch07_statistical_estim/ - Chapter 7: Statistical estimation\n%  Ch08_geometric_probs/   - Chapter 8: Geometric problems\n%  Ch11_intpt_methods/     - Chapter 11: Interior-point methods\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/equality_constr_norm_min.m",
    "content": "% Equality constrained norm minimization.\n%\n% This script constructs a random equality-constrained norm minimization\n% problem and solves it using CVX. You can also change p to +2 or +Inf\n% to produce different results. Alternatively, you an replace\n%     norm( A * x - b, p )\n% with\n%     norm_largest( A * x - b, 'largest', p )\n% for 1 <= p <= 2 * n.\n\n% Generate data\np = 1;\nn = 10; m = 2*n; q=0.5*n;\nA = randn(m,n);\nb = randn(m,1);\nC = randn(q,n);\nd = randn(q,1);\n\n% Create and solve problem\ncvx_begin\n   variable x(n)\n   dual variable y\n   minimize( norm( A * x - b, p ) )\n   subject to\n        y : C * x == d;\ncvx_end\n\n% Display results\ndisp( sprintf( 'norm(A*x-b,%g):', p ) );\ndisp( [ '   ans   =   ', sprintf( '%7.4f', norm(A*x-b,p) ) ] );\ndisp( 'Optimal vector:' );\ndisp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\ndisp( 'Residual vector:' );\ndisp( [ '   A*x-b = [ ', sprintf( '%7.4f ', A*x-b ), ']' ] );\ndisp( 'Equality constraints:' );\ndisp( [ '   C*x   = [ ', sprintf( '%7.4f ', C*x ), ']' ] );\ndisp( [ '   d     = [ ', sprintf( '%7.4f ', d   ), ']' ] );\ndisp( 'Lagrange multiplier for C*x==d:' );\ndisp( [ '   y     = [ ', sprintf( '%7.4f ', y ), ']' ] );\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/Contents.m",
    "content": "% Filter design\n% <a href=\"http://stanford.edu/~boyd/papers/magdes.html\">FIR Filter Design via Spectral Factorization and Convex Optimization</a>\n% <a href=\"http://stanford.edu/class/ee364\">EE364</a> lecture, <a href=\"http://stanford.edu/class/ee364/lectures/filters.pdf\">Filter design and equalization</a>\n%\n%  fir_chebychev_design.m              - Chebychev design of an FIR filter given a desired H(w)\n%  one_over_f_filter.m                 - Design a 1/f spectrum shaping (pink-noise) filter\n%  equalizer_design.m                  - Equalizer design example\n%  iir_mag_design_bandpass_max_atten.m - Maximize stopband attenuation of a bandpass IIR filter\n%  fir_lin_phase_lowpass_max_atten.m   - Maximize stopband attenuation of a linear phase lowpass FIR filter\n%  fir_mag_design_lowpass_max_atten.m  - Maximize stopband attenuation of a lowpass FIR filter (magnitude design)\n%  iir_mag_design_lowpass_max_atten.m  - Maximize stopband attenuation of a lowpass IIR filter\n%  fir_lin_phase_lowpass_min_order.m   - Minimize order of a linear phase lowpass FIR filter\n%  fir_mag_design_lowpass_min_order.m  - Minimize order of a lowpass FIR filter (magnitude design)\n%  fir_lin_phase_lowpass_min_ripple.m  - Minimize stopband ripple of a linear phase lowpass FIR filter\n%  fir_lin_phase_lowpass_min_trans.m   - Minimize transition bandwidth of a linear phase lowpass FIR filter\n%  spectral_fact.m                     - Spectral factorization using Kolmogorov 1939 approach.\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/equalizer_design.m",
    "content": "% Equalizer design example\n% \"Filter design\" lecture notes (EE364) by S. Boyd\n% (figures are generated)\n%\n% Designs a frequency-domain and time-domain FIR equalizer for\n% a single-input single-output (SISO) channel.\n%\n% Frequency-domain equalization uses a Chebychev criteria and\n% is specified in terms of frequency response functions.\n% It is a convex problem (which can be formulated as an SOCP):\n%\n%   minimize   max |G(w)H(w) - G_des(w)|     for w in [0,pi] \n%\n% where H is the frequency response function and our variable\n% is the filter impulse response h. Function G is the unequalized\n% frequency response and G_des is the desired freq response.\n%\n% Time-domain equalization immediately designs the impulse\n% response function by specifying the problem in time (it's an LP):\n%\n%   minimize   max_{t neq D} |g_tilde(t)|\n%       s.t.   g_tilde(D) = 1\n%\n% where g_tilde is the impulse response of equalized system,\n% and D is the delay of the system.\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%********************************************************************\n% problem specs\n%********************************************************************\n% sample channel with impulse response g\ng =.5*[ 0.6526;  0.2157; -0.2639;  1.8024; -0.6430; ...\n        0.1096; -0.7190;  0.4206; -0.0193;  0.6603;];\n\n% problem parameters\nn  = 30;              % filter order\nD  = 10;              % overall delay\n\n%********************************************************************\n% frequency domain equalization\n%********************************************************************\n% number of freq samples (rule-of-thumb)\nm  = 15*(length(g) + n);\n\nw = linspace(0,pi,m)';\nG = exp( -j*kron(w,[0:length(g)-1]) )*g;\nA = exp( -j*kron(w,[0:n-1]) );\n\n% desired frequency response is a pure delay (equalized channel)\nGdes = exp(-j*D*w);\n\n% formulate and solve the Chebyshev design problem\ncvx_begin\n  variable hf(n,1)\n  minimize( max( abs( G.*(A*hf) - Gdes ) ) ) \ncvx_end\n\n% check if problem was successfully solved\ndisp(['Frequency equalization problem is ' cvx_status])\nif ~strfind(cvx_status,'Solved')\n  return\nend\n\n%********************************************************************\n% time-domain equalization\n%********************************************************************\n% define the convolution matrix\nTconv = toeplitz([g; zeros(n-1,1)],[g(1) zeros(1,n-1)]);\n\n% create array of all times without t=D\ntimes_not_D = [1:D D+2:size(Tconv,1)];\n\n% formulate and solve the time equalization problem\ncvx_begin\n  variable t\n  variable ht(n,1)\n\n  minimize( max( abs( Tconv(times_not_D,:)*ht ) ) )\n  subject to\n    Tconv(D+1,:)*ht == 1;\ncvx_end\n\n% check if problem was successfully solved\nif ~strfind(cvx_status,'Solved')\n  disp(['Frequency equalization problem is ' cvx_status])\n  return\nend\n\n%********************************************************************\n% equalizer plots\n%********************************************************************\n% plot g\nfigure(1)\nplot([0:length(g)-1],g,'o',[0:length(g)-1],g,'b:')\nxlabel('t')\nylabel('g(t)')\n\nfigure(2)\nH = exp(-j*kron(w,[0:length(g)-1]))*g;\n% magnitude\nsubplot(2,1,1);\nplot(w,20*log10(abs(H)))\naxis([0,pi,-20,20])\nxlabel('w')\nylabel('mag G(w) in dB')\n% phase\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w')\nylabel('phase G(w)')\n\n% freq equalizer\nfigure(3)\nplot([0:n-1],hf,'o',[0:n-1],hf,'b:')\nxlabel('t')\nylabel('h(t)')\n\n% plot g_tilde\nfigure(4)\ngt=conv(g,hf);\nplot([1:length(gt)]-1,gt,'o',[1:length(gt)]-1,gt,'b:')\nxlabel('t')\nylabel('g tilde(t)')\naxis([0,length(gt)-1,-.2 1.2])\n\nfigure(5)\nH = exp(-j*kron(w,[0:length(gt)-1]))*gt;\n% amplitude\nsubplot(2,1,1)\nplot(w,20*log10(abs(H)))\naxis([0,pi,-20,20])\nxlabel('w')\nylabel('mag G tilde(w) in dB')\n% phase\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w')\nylabel('phase G tilde(w)')\n\n% time equalizer\nfigure(6)\nplot([0:n-1],ht,'o',[0:n-1],ht,'b:')\nxlabel('t')\nylabel('h(t)')\n\n% plot g_tilde\nfigure(7)\ngt=conv(g,ht);\nplot([1:length(gt)]-1,gt,'o',[1:length(gt)]-1,gt,'b:')\nxlabel('t')\nylabel('g tilde(t)')\n\nfigure(8)\nH = exp(-j*kron(w,[0:length(gt)-1]))*gt;\n% magnitude\nsubplot(2,1,1)\nplot(w,20*log10(abs(H)))\naxis([0,pi,-20,20])\nxlabel('w')\nylabel('mag G tilde(w) in dB')\n% phase\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w')\nylabel('phase G tilde(w)')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/fir_chebychev_design.m",
    "content": "% Chebychev design of an FIR filter given a desired H(w)\n% \"Filter design\" lecture notes (EE364) by S. Boyd\n% (figures are generated)\n%\n% Designs an FIR filter given a desired frequency response H_des(w).\n% The design is judged by the maximum absolute error (Chebychev norm).\n% This is a convex problem (after sampling it can be formulated as an SOCP).\n%\n%   minimize   max |H(w) - H_des(w)|     for w in [0,pi]\n%\n% where H is the frequency response function and variable is h\n% (the filter impulse response).\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%********************************************************************\n% problem specs\n%********************************************************************\n% number of FIR coefficients (including the zeroth one)\nn = 20;\n\n% rule-of-thumb frequency discretization (Cheney's Approx. Theory book)\nm = 15*n;\nw = linspace(0,pi,m)'; % omega\n\n%********************************************************************\n% construct the desired filter\n%********************************************************************\n% fractional delay\nD = 8.25;            % delay value\nHdes = exp(-j*D*w);  % desired frequency response\n\n% Gaussian filter with linear phase (uncomment lines below for this design)\n% var = 0.05;\n% Hdes = 1/(sqrt(2*pi*var))*exp(-(w-pi/2).^2/(2*var));\n% Hdes = Hdes.*exp(-j*n/2*w);\n\n%*********************************************************************\n% solve the minimax (Chebychev) design problem\n%*********************************************************************\n% A is the matrix used to compute the frequency response\n% A(w,:) = [1 exp(-j*w) exp(-j*2*w) ... exp(-j*n*w)]\nA = exp( -j*kron(w,[0:n-1]) );\n\n% optimal Chebyshev filter formulation\ncvx_begin\n  variable h(n,1)\n  minimize( max( abs( A*h - Hdes ) ) )\ncvx_end\n\n% check if problem was successfully solved\ndisp(['Problem is ' cvx_status])\nif ~strfind(cvx_status,'Solved')\n  h = [];\nend\n\n%*********************************************************************\n% plotting routines\n%*********************************************************************\n% plot the FIR impulse reponse\nfigure(1)\nstem([0:n-1],h)\nxlabel('n')\nylabel('h(n)')\n\n% plot the frequency response\nH = [exp(-j*kron(w,[0:n-1]))]*h;\nfigure(2)\n% magnitude\nsubplot(2,1,1);\nplot(w,20*log10(abs(H)),w,20*log10(abs(Hdes)),'--')\nxlabel('w')\nylabel('mag H in dB')\naxis([0 pi -30 10])\nlegend('optimized','desired','Location','SouthEast')\n% phase\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w'), ylabel('phase H(w)')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/fir_lin_phase_lowpass_max_atten.m",
    "content": "% Maximize stopband attenuation of a linear phase lowpass FIR filter\n% \"Filter design\" lecture notes (EE364) by S. Boyd\n% (figures are generated)\n%\n% Designs a linear phase FIR lowpass filter such that it:\n% - minimizes maximum stopband attenuation\n% - has a constraint on the maximum passband ripple\n%\n% This is a convex problem (when sampled it can be represented as an LP).\n%\n%   minimize   max |H(w)|                     for w in the stopband\n%       s.t.   1/delta <= |H(w)| <= delta     for w in the passband\n%\n% where H is the frequency response function and variable is\n% h (the filter impulse response). delta is allowed passband ripple.\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%********************************************************************\n% user's filter specifications\n%********************************************************************\n% filter order is 2n+1 (symmetric around the half-point)\nn = 10;\n\nwpass = 0.12*pi;        % passband cutoff freq (in radians)\nwstop = 0.24*pi;        % stopband start freq (in radians)\nripple = 1;    % (delta) max allowed passband ripple in dB\n                        % ideal passband gain is 0 dB\n\n%********************************************************************\n% create optimization parameters\n%********************************************************************\nN = 30*n;                              % freq samples (rule-of-thumb)\nw = linspace(0,pi,N);\nA = [ones(N,1) 2*cos(kron(w',[1:n]))]; % matrix of cosines\n\n% passband 0 <= w <= w_pass\nind = find((0 <= w) & (w <= wpass));    % passband\nAp  = A(ind,:);\n\n% transition band is not constrained (w_pass <= w <= w_stop)\n\n% stopband (w_stop <= w)\nind = find((wstop <= w) & (w <= pi));   % stopband\nAs  = A(ind,:);\n\n%********************************************************************\n% optimization\n%********************************************************************\n% formulate and solve the linear-phase lowpass filter design\ncvx_begin\n  variable h(n+1,1);\n  minimize(norm(As*h,Inf))\n  subject to\n    10^(-ripple/20) <= Ap*h <= 10^(ripple/20);\ncvx_end\n\n% check if problem was successfully solved\ndisp(['Problem is ' cvx_status])\nif ~strfind(cvx_status,'Solved')\n  return\nelse\n  fprintf(1,'The minimum attenuation in the stopband is %3.2f dB.\\n\\n',...\n          20*log10(cvx_optval));\n  % construct the full impulse response\n  h = [flipud(h(2:end)); h];\nend\n\n%********************************************************************\n% plots\n%********************************************************************\nfigure(1)\n% FIR impulse response\nplot(-n:n,h','o',[-n:n;-n:n],[zeros(1,2*n+1);h'],'b:',[-n-1,n+1],[0,0],'k-');\nxlabel('t'), ylabel('h(t)')\nset(gca,'XLim',[-n-1,n+1])\n\nfigure(2)\n% frequency response\nH = exp(-j*kron(w',[0:2*n]))*h;\n% magnitude\nsubplot(2,1,1)\nplot(w,20*log10(abs(H)),...\n     [0 wpass],[ripple ripple],'r--',...\n     [0 wpass],[-ripple -ripple],'r--');\naxis([0,pi,-50,10])\nxlabel('w'), ylabel('mag H(w) in dB')\n% phase\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w'), ylabel('phase H(w)')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/fir_lin_phase_lowpass_min_order.m",
    "content": "% Minimize order of a linear phase lowpass FIR filter\n% \"Filter design\" lecture notes (EE364) by S. Boyd\n% (figures are generated)\n%\n% Designs a linear phase FIR lowpass filter such that it:\n% - minimizes the filter order\n% - has a constraint on the maximum passband ripple\n% - has a constraint on the maximum stopband attenuation\n%\n% This is a quasiconvex problem and can be solved using a bisection.\n%\n%   minimize   filter order n\n%       s.t.   1/delta <= H(w) <= delta     for w in the passband\n%              |H(w)| <= atten_level        for w in the stopband\n%\n% where H is the frequency response function and variable is\n% the filter impulse response h (and its order/length).\n% Data is delta (max passband ripple) and atten_level (max stopband\n% attenuation level).\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%********************************************************************\n% user's filter specifications\n%********************************************************************\n% filter order that is used to start the bisection (has to be feasible)\nmax_order = 20;\n\nwpass = 0.12*pi;        % passband cutoff freq (in radians)\nwstop = 0.24*pi;        % stopband start freq (in radians)\ndelta = 0.5;            % max (+/-) passband ripple in dB\natten = -35;      % stopband attenuation level in dB\n\n%********************************************************************\n% create optimization parameters\n%********************************************************************\nm = 30*max_order; % freq samples (rule-of-thumb)\nw = linspace(0,pi,m);\n\n%*********************************************************************\n% use bisection algorithm to solve the problem\n%*********************************************************************\n\nn_bot = 1;\nn_top = max_order;\nn = Inf;\n\ndisp('Rememeber that we are only considering filters with linear phase, i.e.,')\ndisp('filters that are symmetric around their midpoint and have order 2*n+1.')\ndisp(' ')\n\nwhile( n_top - n_bot > 1)\n    % try to find a feasible design for given specs\n    n_cur = ceil( (n_top + n_bot)/2 );\n    \n    % create optimization matrices (this is cosine matrix)\n    A = [ones(m,1) 2*cos(kron(w',[1:n_cur]))];\n    \n    % passband 0 <= w <= w_pass\n    ind = find((0 <= w) & (w <= wpass));    % passband\n    Ap  = A(ind,:);\n    \n    % transition band is not constrained (w_pass <= w <= w_stop)\n    \n    % stopband (w_stop <= w)\n    ind = find((wstop <= w) & (w <= pi));   % stopband\n    As  = A(ind,:);\n    \n    ptop = 10^(delta/20);\n    \n    % This is the feasibility problem:\n    % cvx_begin\n    %      variable h_cur(n_cur+1,1);\n    %      10^(-delta/20) <= Ap * h_cur <=  10^(+delta/20);\n    %      abs( As * h_cur ) <= +10^(+atten/20);\n    % cvx_end\n    % Unfortunately, the solvers often struggle with this formulation. For\n    % this model, there is a logical optimization problem: minimize the\n    % stopband attenuation. If the minimum attenuation is below the target,\n    % then we know the original problem is feasible.\n    cvx_begin quiet\n         variable h_cur(n_cur+1,1);\n         minimize( max( abs( As * h_cur ) ) );\n         10^(-delta/20) <= Ap * h_cur <=  10^(+delta/20);\n    cvx_end\n    \n    % bisection\n    if isnan( cvx_optval ),\n        fprintf( 1, 'Solver failed for n = %d taps, assuming infeasible\\n', n_cur );\n        n_bot = n_cur;\n    elseif cvx_optval <= 10^(atten/20),\n        fprintf(1,'Problem is feasible for n = %d taps\\n',n_cur);\n        n_top = n_cur;\n        if n > n_cur, \n            n = n_cur;\n            h = h_cur; \n        end\n    else\n        fprintf(1,'Problem not feasible for n = %d taps\\n',n_cur);\n        n_bot = n_cur;\n    end\nend\n\nh = [ h(end:-1:2); h ];\nfprintf(1,'\\nOptimum number of filter taps for given specs is 2n+1 = %d.\\n', length(h));\n\n%********************************************************************\n% plots\n%********************************************************************\nfigure(1)\n% FIR impulse response\nplot([-n:n],h','o',[-n:n],h','b:')\nxlabel('t'), ylabel('h(t)')\n\nfigure(2)\n% frequency response\nH = exp(-j*kron(w',[0:2*n]))*h;\n% magnitude\nsubplot(2,1,1)\nplot(w,20*log10(abs(H)),...\n    [wstop pi],[atten atten],'r--',...\n    [0 wpass],[delta delta],'r--',...\n    [0 wpass],[-delta -delta],'r--');\naxis([0,pi,-50,10])\nxlabel('w'), ylabel('mag H(w) in dB')\n% phase\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w'), ylabel('phase H(w)')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/fir_lin_phase_lowpass_min_ripple.m",
    "content": "% Minimize stopband ripple of a linear phase lowpass FIR filter\n% \"Filter design\" lecture notes (EE364) by S. Boyd\n% (figures are generated)\n%\n% Designs a linear phase FIR lowpass filter such that it:\n% - minimizes the maximum passband ripple\n% - has a constraint on the maximum stopband attenuation\n%\n% This is a convex problem.\n%\n%   minimize   delta\n%       s.t.   1/delta <= H(w) <= delta     for w in the passband\n%              |H(w)| <= atten_level        for w in the stopband\n%\n% where H is the frequency response function and variables are\n% delta and h (the filter impulse response).\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%********************************************************************\n% user's filter specifications\n%********************************************************************\n% filter order is 2n+1 (symmetric around the half-point)\nn = 10;\n\nwpass = 0.12*pi;        % passband cutoff freq (in radians)\nwstop = 0.24*pi;        % stopband start freq (in radians)\natten_level = -30;      % stopband attenuation level in dB\n\n%********************************************************************\n% create optimization parameters\n%********************************************************************\nN = 30*n+1;                            % freq samples (rule-of-thumb)\nw = linspace(0,pi,N);\nA = [ones(N,1) 2*cos(kron(w',[1:n]))]; % matrix of cosines\n\n% passband 0 <= w <= w_pass\nind = find((0 <= w) & (w <= wpass));   % passband\nAp  = A(ind,:);\n\n% transition band is not constrained (w_pass <= w <= w_stop)\n\n% stopband (w_stop <= w)\nind = find((wstop <= w) & (w <= pi));  % stopband\nUs  = 10^(atten_level/20)*ones(length(ind),1);\nAs  = A(ind,:);\n\n%********************************************************************\n% optimization\n%********************************************************************\n% formulate and solve the linear-phase lowpass filter design\ncvx_begin\n  variable delta\n  variable h(n+1,1);\n\n  minimize( delta )\n  subject to\n    % passband bounds\n    Ap*h <= delta;\n    inv_pos(Ap*h) <= delta;\n\n    % stopband bounds\n    abs( As*h ) <= Us;\ncvx_end\n\n% check if problem was successfully solved\ndisp(['Problem is ' cvx_status])\nif ~strfind(cvx_status,'Solved')\n  return\nelse\n  % construct the full impulse response\n  h = [flipud(h(2:end)); h];\n  fprintf(1,'The optimal minimum passband ripple is %4.3f dB.\\n\\n',...\n            20*log10(delta));\nend\n\n%********************************************************************\n% plots\n%********************************************************************\nfigure(1)\n% FIR impulse response\nplot([0:2*n],h','o',[0:2*n],h','b:')\nxlabel('t'), ylabel('h(t)')\n\nfigure(2)\n% frequency response\nH = exp(-j*kron(w',[0:2*n]))*h;\n% magnitude\nsubplot(2,1,1)\nplot(w,20*log10(abs(H)),[wstop pi],[atten_level atten_level],'r--');\naxis([0,pi,-40,10])\nxlabel('w'), ylabel('mag H(w) in dB')\n% phase\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w'), ylabel('phase H(w)')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/fir_lin_phase_lowpass_min_trans.m",
    "content": "% Minimize transition bandwidth of a linear phase lowpass FIR filter\n% \"Filter design\" lecture notes (EE364) by S. Boyd\n% (figures are generated)\n%\n% Designs a linear phase FIR lowpass filter such that it:\n% - minimizes the transition band width (i.e. minimize w_stop)\n% - has a constraint on the maximum passband ripple\n% - has a constraint on the maximum stopband attenuation\n%\n% This is a quasiconvex problem and is solved using a bisection.\n%\n%   minimize   w_stop\n%       s.t.   1/delta <= H(w) <= delta     for w in the passband\n%              |H(w)| <= atten_level        for w in the stopband\n%\n% where H is the frequency response function and variable is\n% the filter impulse response h (and its order/length).\n% Data is delta (max passband ripple) and atten_level (max stopband\n% attenuation level).\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%********************************************************************\n% user's filter specifications\n%********************************************************************\n% starting point for the stopband (needs to be feasible)\nwstop = 0.24*pi;        % stopband start freq (in radians)\nTOL = 1e-3;             % precision to which we should run bisection\n\nn = 10;                 % filter order (2n+1 is the full order)\nwpass = 0.12*pi;        % passband cutoff freq (in radians)\ndelta = 1;              % max (+/-) passband ripple in dB\natten_level = -30;      % stopband attenuation level in dB\n\n%********************************************************************\n% create optimization parameters\n%********************************************************************\nm = 30*n; % freq samples (rule-of-thumb)\nw = linspace(0,pi,m);\n\n%*********************************************************************\n% use bisection algorithm to solve the problem\n%*********************************************************************\n\nwstop_bot = wpass;\nwstop_top  = wstop;\n\nwhile( wstop_top - wstop_bot > TOL)\n  % try to find a feasible design for given specs\n  wstop_cur = (wstop_top + wstop_bot)/2;\n\n  % create optimization matrices (matrix of cosines)\n  A = [ones(m,1) 2*cos(kron(w',[1:n]))];\n\n  % passband 0 <= w <= w_pass\n  ind = find((0 <= w) & (w <= wpass));    % passband\n  Ap  = A(ind,:);\n\n  % transition band is not constrained (w_pass <= w <= w_stop)\n\n  % stopband (w_stop <= w) (this is the changing constraint)\n  ind = find((wstop_cur <= w) & (w <= pi));   % stopband\n  As  = A(ind,:);\n\n  % formulate and solve the feasibility linear-phase lp filter design\n  cvx_begin quiet\n    variable h_cur(n+1,1);\n    % feasibility problem\n    % passband bounds\n    Ap*h_cur <= 10^(delta/20);\n    Ap*h_cur >= 10^(-delta/20);\n    % stopband bounds\n    abs( As*h_cur ) <= 10^(atten_level/20);\n  cvx_end\n\n  % bisection\n  if strfind(cvx_status,'Solved') % feasible\n    fprintf(1,'Problem is feasible for stopband freq = %3.4f rads\\n',wstop_cur);\n    wstop_top = wstop_cur;\n    % construct the full impulse response\n    h = [flipud(h_cur(2:end)); h_cur];\n  else % not feasible\n    fprintf(1,'Problem is not feasible for stopband freq = %3.4f rads\\n',wstop_cur);\n    wstop_bot = wstop_cur;\n  end\nend\n\nwstop = wstop_top;\nfprintf(1,['\\nOptimum stopband frequency for given specs is %3.4f*pi rads\\n' ...\n           'and the minimum transition width is %3.4f*pi radians.\\n'],...\n            wstop/pi, (wstop-wpass)/pi);\n\n\n%********************************************************************\n% plots\n%********************************************************************\nfigure(1)\n% FIR impulse response\nplot([0:2*n],h','o',[0:2*n],h','b:')\nxlabel('t'), ylabel('h(t)')\n\nfigure(2)\n% frequency response\nH = exp(-j*kron(w',[0:2*n]))*h;\n% magnitude\nsubplot(2,1,1)\nplot(w,20*log10(abs(H)),...\n     [wstop pi],[atten_level atten_level],'r--',...\n     [0 wpass],[delta delta],'r--',...\n     [0 wpass],[-delta -delta],'r--');\naxis([0,pi,-40,10])\nxlabel('w'), ylabel('mag H(w) in dB')\n% phase\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w'), ylabel('phase H(w)')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/fir_mag_design_lowpass_max_atten.m",
    "content": "% Maximize stopband attenuation of a lowpass FIR filter (magnitude design)\n% \"FIR Filter Design via Spectral Factorization and Convex Optimization\"\n% by S.-P. Wu, S. Boyd, and L. Vandenberghe\n% (figures are generated)\n%\n% Designs an FIR lowpass filter using spectral factorization method where we:\n% - minimize maximum stopband attenuation\n% - have a constraint on the maximum passband ripple\n%\n%   minimize   max |H(w)|                      for w in the stopband\n%       s.t.   1/delta <= |H(w)| <= delta      for w in the passband\n%\n% We change variables via spectral factorization method and get:\n%\n%   minimize   max R(w)                        for w in the stopband\n%       s.t.   (1/delta)^2 <= R(w) <= delta^2  for w in the passband\n%              R(w) >= 0                       for all w\n%\n% where R(w) is the squared magnited of the frequency response\n% (and the Fourier transform of the autocorrelation coefficients r).\n% Variables are coeffients r. delta is the allowed passband ripple.\n% This is a convex problem (can be formulated as an LP after sampling).\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%*********************************************************************\n% user's filter specs (for a low-pass filter example)\n%*********************************************************************\n% number of FIR coefficients (including the zeroth one)\nn = 20;\n\nwpass = 0.12*pi;   % end of the passband\nwstop = 0.24*pi;   % start of the stopband\ndelta = 1;         % maximum passband ripple in dB (+/- around 0 dB)\n\n%*********************************************************************\n% create optimization parameters\n%*********************************************************************\n% rule-of-thumb discretization (from Cheney's Approx. Theory book)\nm = 15*n;\nw = linspace(0,pi,m)'; % omega\n\n% A is the matrix used to compute the power spectrum\n% A(w,:) = [1 2*cos(w) 2*cos(2*w) ... 2*cos(n*w)]\nA = [ones(m,1) 2*cos(kron(w,[1:n-1]))];\n\n% passband 0 <= w <= w_pass\nind = find((0 <= w) & (w <= wpass));    % passband\nLp  = 10^(-delta/20)*ones(length(ind),1);\nUp  = 10^(+delta/20)*ones(length(ind),1);\nAp  = A(ind,:);\n\n% transition band is not constrained (w_pass <= w <= w_stop)\n\n% stopband (w_stop <= w)\nind = find((wstop <= w) & (w <= pi));   % stopband\nAs  = A(ind,:);\n\n%********************************************************************\n% optimization\n%********************************************************************\n% formulate and solve the magnitude design problem\ncvx_begin\n  variable r(n,1)\n\n  % this is a feasibility problem\n  minimize( max( abs( As*r ) ) )\n  subject to\n    % passband constraints\n    Ap*r >= (Lp.^2);\n    Ap*r <= (Up.^2);\n    % nonnegative-real constraint for all frequencies (a bit redundant)\n    A*r >= 0;\ncvx_end\n\n% check if problem was successfully solved\ndisp(['Problem is ' cvx_status])\nif ~strfind(cvx_status,'Solved')\n  return\nend\n\n% compute the spectral factorization\nh = spectral_fact(r);\n\n% compute the max attenuation in the stopband (convert to original vars)\nUstop = 10*log10(cvx_optval);\nfprintf(1,'The max attenuation in the stopband is %3.2f dB.\\n\\n',Ustop);\n\n%*********************************************************************\n% plotting routines\n%*********************************************************************\n% frequency response of the designed filter, where j = sqrt(-1)\nH = [exp(-j*kron(w,[0:n-1]))]*h;\n\nfigure(1)\n% FIR impulse response\nplot([0:n-1],h','o',[0:n-1],h','b:')\nxlabel('t'), ylabel('h(t)')\n\nfigure(2)\n% magnitude\nsubplot(2,1,1)\nplot(w,20*log10(abs(H)), ...\n     [0 wpass],[delta delta],'r--', ...\n     [0 wpass],[-delta -delta],'r--', ...\n     [wstop pi],[Ustop Ustop],'r--')\nxlabel('w')\nylabel('mag H(w) in dB')\naxis([0 pi -50 5])\n% phase\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w'), ylabel('phase H(w)')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/fir_mag_design_lowpass_min_order.m",
    "content": "% Minimize order of a lowpass FIR filter (magnitude design)\n% \"FIR Filter Design via Spectral Factorization and Convex Optimization\"\n% by S.-P. Wu, S. Boyd, and L. Vandenberghe\n% (figures are generated)\n%\n% Designs an FIR lowpass filter using spectral factorization method where we:\n% - minimize the filter order\n% - have a constraint on the maximum passband ripple\n% - have a constraint on the maximum stopband attenuation\n%\n%   minimize   filter order n\n%       s.t.   1/delta <= |H(w)| <= delta   for w in the passband\n%              |H(w)| <= atten_level        for w in the stopband\n%\n% We change variables via spectral factorization method and get:\n%\n%   minimize   filter order n\n%       s.t.   (1/delta)^2 <= R(w) <= delta^2  for w in the passband\n%              R(w) <= atten_level^2           for w in the stopband\n%              R(w) >= 0                       for all w\n%\n% where R(w) is the squared magnited of the frequency response\n% (and the Fourier transform of the autocorrelation coefficients r).\n% Variables are coeffients r. delta is the allowed passband ripple\n% and atten_level is the max allowed level in the stopband.\n%\n% This is a quasiconvex problem and can be solved using a bisection.\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%*********************************************************************\n% user's filter specs (for a low-pass filter example)\n%*********************************************************************\n% filter order that is used to start the bisection (has to be feasible)\nmax_order = 20;\n\nwpass = 0.12*pi;        % passband cutoff freq (in radians)\nwstop = 0.24*pi;        % stopband start freq (in radians)\ndelta = 1;              % max (+/-) passband ripple in dB\natten = -30;      % stopband attenuation level in dB\n\n%********************************************************************\n% create optimization parameters\n%********************************************************************\nm = 15*(max_order);   % freq samples (rule-of-thumb)\nw = linspace(0,pi,m);\n\n%*********************************************************************\n% use bisection algorithm to solve the problem\n%*********************************************************************\n\nn_bot = 1;\nn_top = max_order;\nn_best = Inf;\n\nwhile( n_top - n_bot > 1)\n    % try to find a feasible design for given specs\n    n_cur = ceil( (n_top + n_bot)/2 );\n    \n    % create optimization matrices\n    % A is the matrix used to compute the power spectrum\n    % A(w,:) = [1 2*cos(w) 2*cos(2*w) ... 2*cos(n*w)]\n    A = [ones(m,1) 2*cos(kron(w',[1:n_cur-1]))];\n    \n    % passband 0 <= w <= w_pass\n    ind = find((0 <= w) & (w <= wpass));    % passband\n    Ap  = A(ind,:);\n    \n    % transition band is not constrained (w_pass <= w <= w_stop)\n    \n    % stopband (w_stop <= w)\n    ind = find((wstop <= w) & (w <= pi));   % stopband\n    As  = A(ind,:);\n    \n    % This is the feasiblity problem:\n    % cvx_begin quiet\n    %     variable r_cur(n_cur+1,1);\n    %     10^(-delta/10) <= Ap * r_cur <=  10^(+delta/10);\n    %     abs( As * r_cur ) <= +10^(+atten/10);\n    %     A * r >= 0;\n    % cvx_end\n    % Unfortunately it seems to be a bit unreliable to solve. So we have\n    % reformulated it as a stopband minimization. If the optimum stopband\n    % attenuation is smaller than 10^(atten/10), then we have feasibility.\n    % formulate and solve the feasibility linear-phase lp filter design\n    cvx_begin quiet\n        variables r_cur(n_cur,1);\n        minimize( max( abs( As * r_cur ) ) );\n        10^(-delta/10) <= Ap * r_cur <= 10^(+delta/10);\n        A * r_cur >= 0;\n    cvx_end\n    \n    % bisection\n    if isnan( cvx_optval ),\n        fprintf( 1, 'Solver failed for n = %d taps, assuming infeasible\\n', n_cur );\n        n_bot = n_cur;\n    elseif cvx_optval <= 10^(atten/10), % strfind(cvx_status,'Solved') % feasible\n        fprintf(1,'Problem is feasible for n = %d taps\\n',n_cur);\n        n_top = n_cur;\n        if n_best > n_cur, r = r_cur; end\n    else % not feasible\n        fprintf(1,'Problem not feasible for n = %d taps\\n',n_cur);\n        n_bot = n_cur;\n    end\nend\n\nh = spectral_fact(r);\nn = length(r);\nfprintf(1,'\\nOptimum number of filter taps for given specs is %d.\\n',n);\n\n\n%********************************************************************\n% plots\n%********************************************************************\nfigure(1)\n% FIR impulse response\nplot([0:n-1],h','o',[0:n-1],h','b:')\nxlabel('t'), ylabel('h(t)')\n\nfigure(2)\n% frequency response\nH = exp(-j*kron(w',[0:n-1]))*h;\n% magnitude\nsubplot(2,1,1)\nplot(w,20*log10(abs(H)),...\n    [wstop pi],[atten atten],'r--',...\n    [0 wpass],[delta delta],'r--',...\n    [0 wpass],[-delta -delta],'r--');\naxis([0,pi,-40,10])\nxlabel('w'), ylabel('mag H(w) in dB')\n% phase\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w'), ylabel('phase H(w)')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/iir_mag_design_bandpass_max_atten.m",
    "content": "% Maximize stopband attenuation of a bandpass IIR filter\n% \"Linear Programming Design of IIR Digital Filters with Arbitrary\n%  Magnitude Functions\" by L.R. Rabiner, N.Y. Graham, and H.D. Helms\n% (figures are generated)\n%\n% Designs a bandpass IIR filter using spectral factorization method where we:\n% - minimize maximum stopband attenuation\n% - have a constraint on the maximum passband ripple\n%\n%   minimize   max |H(w)|                      for w in the stopband\n%       s.t.   1/delta <= |H(w)| <= delta      for w in the passband\n%\n% where we now have a rational frequency response function:\n%\n%   H(w) = sum_{m=0}^{M-1} b_m exp{-jwm} / sum_{n=1}^{N-1} a_n exp{-jwn}\n%\n% We change variables via spectral factorization method and get:\n%\n%   minimize   max R(w)                        for w in the stopband\n%       s.t.   (1/delta)^2 <= R(w) <= delta^2  for w in the passband\n%              R(w) >= 0                       for all w\n%\n% where R(w) is the squared magnited of the frequency response\n% (and the Fourier transform of the autocorrelation coefficients r).\n% We represent R(w) = N_hat(w)/D_hat(w), where now R(w) is a rational\n% function since we deal with IIR filter (see the reference paper).\n%\n% Variables are coeffients of the numerator, denoted as c, and\n% denominator, denoted as d. delta is the allowed passband ripple.\n% This is a quasiconvex problem and can be solved using bisection.\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%*********************************************************************\n% user's filter specs (for a low-pass filter example)\n%*********************************************************************\n% number of coefficients for the IIR filter (including the zeroth one)\n% (also without loss of generality we can assume that d_0 = 1, which\n%  is the zeroth coefficient of the autocorrelation denominator)\nM = 6; % nominator\nN = 6; % denominator\n\n% maximum passband ripple in dB (+/- from the nominal 0 dB value)\ndelta = 1;\n\n% specification of the upper and lower bound functions U(w) and L(w)\n% freq specs\nwstop1 = 0.35*pi;\nwpass1 = 0.4*pi;\nwpass2 = 0.5*pi;\nwstop2 = 0.55*pi;\n\n%*********************************************************************\n% create optimization parameters\n%*********************************************************************\n% rule-of-thumb discretization (from Cheney's Approx. Theory book)\nsample_order = 30;\nm = 15*(sample_order);\nw = linspace(0,pi,m)'; % omega\n\n% A's are matrices used to compute the power spectrum\nAnum = [ones(m,1) 2*cos(kron(w,[1:M-1]))];\nAden = [ones(m,1) 2*cos(kron(w,[1:N-1]))];\n\n% first stopband 0 <= w <= wstop1\nind = find((0 <= w) & (w <= wstop1));\nAs1_num  = Anum(ind,:);\nAs1_den  = Aden(ind,:);\n\n% passband wpass1 <= w <= wpass2\nind = find(wpass1<=w & w<=wpass2);\nAp_num  = Anum(ind,:);\nAp_den  = Aden(ind,:);\n\n% second stopband wstop2 <= w <= pi\nind = find(w >= wstop2);\nAs2_num  = Anum(ind,:);\nAs2_den  = Aden(ind,:);\n\n%********************************************************************\n% optimization\n%********************************************************************\n\n% use bisection (on the log of vars) to solve for the min stopband atten\nUs_top = 1e-0; % 0 dB\nUs_bot = 1e-8; % -80 dB (in original variables)\n\nwhile( 20*log10(Us_top/Us_bot) > 1)\n  % try to find a feasible design for given specs\n  Us_cur = sqrt(Us_top*Us_bot);\n\n  % [b_cur,a_cur] = iir_mag_design_spec_fact(w,L,U,N,M);\n  % formulate and solve the magnitude design problem\n  cvx_begin quiet\n    variable c(M,1)\n    variable d(N-1,1)\n\n    % feasibility problem\n    % passband constraints\n    (Ap_num*c) <= (10^(+delta/20))^2*(Ap_den*[1;d]); % upper constr\n    (Ap_num*c) >= (10^(-delta/20))^2*(Ap_den*[1;d]); % lower constr\n    % stopband constraint\n    (As1_num*c) <= (Us_cur)*(As1_den*[1;d]); % upper constr\n    (As2_num*c) <= (Us_cur)*(As2_den*[1;d]); % upper constr\n    % nonnegative-real constraint\n    Anum*c >= 0;\n    Aden*[1;d] >= 0;\n  cvx_end\n\n  % bisection\n  if strfind(cvx_status,'Solved') % feasible\n    fprintf(1,'Problem is feasible for stopband atten = %3.2f dB\\n', ...\n               10*log10(Us_cur));\n    Us_top = Us_cur;\n    b = spectral_fact(c);\n    a = spectral_fact([1;d]);\n  else % not feasible\n    fprintf(1,'Problem not feasible for stopband atten = %3.2f dB\\n', ...\n               10*log10(Us_cur));\n    Us_bot = Us_cur;\n  end\nend\n\n% display the max attenuation in the stopband (convert to original vars)\nfprintf(1,'\\nOptimum min stopband atten is between %3.2f and %3.2f dB.\\n',...\n        10*log10(Us_bot),10*log10(Us_top));\ndisp('Optimal IIR filter coefficients are: ')\ndisp('Numerator: '), b\ndisp('Denominator: '), a\n\n%*********************************************************************\n% plotting routines\n%*********************************************************************\n% frequency response of the designed filter, where j = sqrt(-1)\nw = linspace(0,pi,5*m)'; % omega\nH = ([exp(-j*kron(w,[0:M-1]))]*b)./([exp(-j*kron(w,[0:N-1]))]*a);\n\n% magnitude plot\nfigure(1)\nsubplot(2,1,1)\nplot(w,20*log10(abs(H)), ...\n     [wpass1 wpass2],[delta delta],'r--', ...\n     [wpass1 wpass2],[-delta -delta],'r--', ...\n     [0 wstop1],[10*log10(Us_top) 10*log10(Us_top)],'r--', ...\n     [wstop2 pi],[10*log10(Us_top) 10*log10(Us_top)],'r--')\nxlabel('w')\nylabel('mag H(w) in dB')\naxis([0 pi -50 10]);\n\n% phase plot\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w'), ylabel('phase H(w)')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/iir_mag_design_lowpass_max_atten.m",
    "content": "% Maximize stopband attenuation of a lowpass IIR filter\n% \"Linear Programming Design of IIR Digital Filters with Arbitrary\n%  Magnitude Functions\" by L.R. Rabiner, N.Y. Graham, and H.D. Helms\n% (figures are generated)\n%\n% Designs a lowpass IIR filter using spectral factorization method where we:\n% - minimize maximum stopband attenuation\n% - have a constraint on the maximum passband ripple\n%\n%   minimize   max |H(w)|                      for w in the stopband\n%       s.t.   1/delta <= |H(w)| <= delta      for w in the passband\n%\n% where we now have a rational frequency response function:\n%\n%   H(w) = sum_{m=0}^{M-1} b_m exp{-jwm} / sum_{n=1}^{N-1} a_n exp{-jwn}\n%\n% We change variables via spectral factorization method and get:\n%\n%   minimize   max R(w)                        for w in the stopband\n%       s.t.   (1/delta)^2 <= R(w) <= delta^2  for w in the passband\n%              R(w) >= 0                       for all w\n%\n% where R(w) is the squared magnited of the frequency response\n% (and the Fourier transform of the autocorrelation coefficients r).\n% We represent R(w) = N_hat(w)/D_hat(w), where now R(w) is a rational\n% function since we deal with IIR filter (see the reference paper).\n%\n% Variables are coeffients of the numerator, denoted as c, and\n% denominator, denoted as d. delta is the allowed passband ripple.\n% This is a quasiconvex problem and can be solved using bisection.\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n%*********************************************************************\n% user's filter specs (for a low-pass filter example)\n%*********************************************************************\n% number of coefficients for the IIR filter (including the zeroth one)\n% (also without loss of generality we can assume that d_0 = 1, which\n%  is the zeroth coefficient of the autocorrelation denominator)\nM = 4; % nominator\nN = 4; % denominator\n\nwpass = 0.12*pi;   % end of the passband\nwstop = 0.24*pi;   % start of the stopband\ndelta = 1;         % maximum passband ripple in dB (+/- around 0 dB)\n\n%*********************************************************************\n% create optimization parameters\n%*********************************************************************\n% rule-of-thumb discretization (from Cheney's Approx. Theory book)\nsample_order = 30;\nm = 15*(sample_order);\nw = linspace(0,pi,m)'; % omega\n\n% A's are matrices used to compute the power spectrum\nAnum = [ones(m,1) 2*cos(kron(w,[1:M-1]))];\nAden = [ones(m,1) 2*cos(kron(w,[1:N-1]))];\n\n% passband 0 <= w <= w_pass\nind = find((0 <= w) & (w <= wpass));    % passband\nAp_num  = Anum(ind,:);\nAp_den  = Aden(ind,:);\n\n% transition band is not constrained (w_pass <= w <= w_stop)\n\n% stopband (w_stop <= w)\nind = find((wstop <= w) & (w <= pi));   % stopband\nAs_num  = Anum(ind,:);\nAs_den  = Aden(ind,:);\n\n%********************************************************************\n% optimization\n%********************************************************************\n\n% use bisection (on the log of vars) to solve for the min stopband atten\nUs_top = 1e-0; % 0 dB\nUs_bot = 1e-6; % -60 dB (in original variables)\n\nwhile( 20*log10(Us_top/Us_bot) > 1)\n  % try to find a feasible design for given specs\n  Us_cur = sqrt(Us_top*Us_bot);\n  \n  % formulate and solve the magnitude design problem\n  cvx_begin quiet\n    variable c(M,1)\n    variable d(N-1,1)\n\n    % feasibility problem\n    % passband constraints\n    (Ap_num*c) <= (10^(+delta/20))^2*(Ap_den*[1;d]); % upper constr\n    (Ap_num*c) >= (10^(-delta/20))^2*(Ap_den*[1;d]); % lower constr\n    % stopband constraint\n    (As_num*c) <= (Us_cur)*(As_den*[1;d]); % upper constr\n    % nonnegative-real constraint\n    Anum*c >= 0;\n    Aden*[1;d] >= 0;\n  cvx_end\n\n  % bisection\n  if ~any(isnan(c)) % feasible\n    fprintf(1,'Problem is feasible for stopband atten = %3.2f dB\\n', ...\n               10*log10(Us_cur));\n    Us_top = Us_cur;\n    b = spectral_fact(c);\n    a = spectral_fact([1;d]);\n  else % not feasible\n    fprintf(1,'Problem not feasible for stopband atten = %3.2f dB\\n', ...\n               10*log10(Us_cur));\n    Us_bot = Us_cur;\n  end\nend\n\n% display the max attenuation in the stopband (convert to original vars)\nfprintf(1,'\\nOptimum min stopband atten is between %3.2f and %3.2f dB.\\n',...\n        10*log10(Us_bot),10*log10(Us_top));\ndisp('Optimal IIR filter coefficients are: ')\ndisp('Numerator: '), b\ndisp('Denominator: '), a\n\n%*********************************************************************\n% plotting routines\n%*********************************************************************\n% frequency response of the designed filter, where j = sqrt(-1)\nH = ([exp(-j*kron(w,[0:M-1]))]*b)./([exp(-j*kron(w,[0:N-1]))]*a);\n\n% magnitude plot\nfigure(1)\nsubplot(2,1,1)\nplot(w,20*log10(abs(H)), ...\n     [0 wpass],[delta delta],'r--', ...\n     [0 wpass],[-delta -delta],'r--', ...\n     [wstop pi],[10*log10(Us_top) 10*log10(Us_top)],'r--')\nxlabel('w')\nylabel('mag H(w) in dB')\naxis([0 pi -55 10]);\n\n% phase plot\nsubplot(2,1,2)\nplot(w,angle(H))\naxis([0,pi,-pi,pi])\nxlabel('w'), ylabel('phase H(w)')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/one_over_f_filter.m",
    "content": "% Design a 1/f spectrum shaping (pink-noise) filter\n% \"Filter design\" lecture notes (EE364) by S. Boyd\n% \"FIR filter design via spectral factorization and convex optimization\"\n% by S.-P. Wu, S. Boyd, and L. Vandenberghe\n% (a figure is generated)\n%\n% Designs a log-Chebychev filter magnitude design given as:\n%\n%   minimize   max| log|H(w)| - log D(w) |   for w in [0,pi]\n%\n% where variables are impulse response coefficients h, and data\n% is the desired frequency response magnitude D(w).\n%\n% We can express and solve the log-Chebychev problem above as\n%\n%   minimize   max( R(w)/D(w)^2, D(w)^2/R(w) )\n%       s.t.   R(w) = |H(w)|^2   for w in [0,pi]\n%\n% where we now use the auto-correlation coeffients r as variables. \n%\n% As an example we consider the 1/sqrt(w) spectrum shaping filter\n% (the so-called pink-noise filter) where D(w) = 1/sqrt(w).\n% Here we use a logarithmically sampled freq range w = [0.01*pi,pi].\n%\n% Written for CVX by Almir Mutapcic 02/02/06\n\n% parameters\nn = 40;      % filter order\nm = 15*n;    % frequency discretization (rule-of-thumb)\n\n% log-space frequency specification\nwa = 0.01*pi; wb = pi;\nwl = logspace(log10(wa),log10(wb),m)';\n\n% desired frequency response (pink-noise filter)\nD = 1./sqrt(wl);\n\n% matrix of cosines to compute the power spectrum\nAl = [ones(m,1) 2*cos(kron(wl,[1:n-1]))];\n\n% solve the problem using cvx\ncvx_begin\n  variable r(n,1)   % auto-correlation coefficients\n  variable R(m,1)   % power spectrum\n\n  % log-chebychev minimax design\n  minimize( max( max( [R./(D.^2)  (D.^2).*inv_pos(R)]' ) ) )\n  subject to\n     % power spectrum constraint\n     R == Al*r;\ncvx_end\n\n% check if problem was successfully solved\ndisp(['Problem is ' cvx_status])\nif ~strfind(cvx_status,'Solved')\n  return\nend\n\n% spectral factorization\nh = spectral_fact(r);\n\n% figures\nfigure(1)\nH = exp(-j*kron(wl,[0:n-1]))*h;\nloglog(wl,abs(H),wl,D,'r--')\nset(gca,'XLim',[wa pi])\nxlabel('freq w')\nylabel('mag H(w) and D(w)')\nlegend('optimized','desired')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/filter_design/spectral_fact.m",
    "content": "% Spectral factorization using Kolmogorov 1939 approach.\n% (code follows pp. 232-233, Signal Analysis, by A. Papoulis)\n%\n% Computes the minimum-phase impulse response which satisfies\n% given auto-correlation.\n%\n% Input:\n%   r: top-half of the auto-correlation coefficients\n%      starts from 0th element to end of the auto-corelation\n%      should be passed in as a column vector\n% Output\n%   h: impulse response that gives the desired auto-correlation\n\nfunction h = spectral_fact(r)\n\n% length of the impulse response sequence\nn = length(r);\n\n% over-sampling factor\nmult_factor = 100;        % should have mult_factor*(n) >> n \nm = mult_factor*n;\n\n% computation method:\n% H(exp(jTw)) = alpha(w) + j*phi(w)\n% where alpha(w) = 1/2*ln(R(w)) and phi(w) = Hilbert_trans(alpha(w))\n\n% compute 1/2*ln(R(w))\nw = 2*pi*[0:m-1]/m;\nR = [ ones(m,1) 2*cos(kron(w',[1:n-1])) ]*r;\nalpha = 1/2*log(R);\n\n% find the Hilbert transform \nalphatmp = fft(alpha);\nalphatmp(floor(m/2)+1:m) = -alphatmp(floor(m/2)+1:m);\nalphatmp(1) = 0;\nalphatmp(floor(m/2)+1) = 0;\nphi = real(ifft(j*alphatmp));\n\n% now retrieve the original sampling \nindex  = find(rem([0:m-1],mult_factor)==0);\nalpha1 = alpha(index);\nphi1   = phi(index);\n\n% compute the impulse response (inverse Fourier transform)\nh = real(ifft(exp(alpha1+j*phi1),n));\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/gp_tutorial/Contents.m",
    "content": "% Examples from <a href=\"http://stanford.edu/~boyd/papers/gp_tutorial.html\">A Tutorial on Geometric Programming</a>\n%\n%  max_volume_box.m             - Box volume maximization\n%  simple_dig_ckt_sizing.m      - Digital circuit sizing\n%  simple_dig_ckt_sizing_vect.m - Digital circuit sizing (vectorized)\n%  elmore_interconnect.m        - Elmore delay sizing for an interconnect network.\n%  floor_planning.m             - Floor planning with an optimal trade-off curve.\n%  basic_odp.m                  - Optimal doping profile optimization\n%  beta_min_odp.m               - Optimal doping profile optimization with current gain constraint.\n%  power_control.m              - Simple power control in communication systems via GP.\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/gp_tutorial/basic_odp.m",
    "content": "% Optimal doping profile optimization\n% Boyd, Kim, Vandenberghe, and Hassibi, \"A tutorial on geometric programming\"\n% Joshi, Boyd, and Dutton, \"Optimal doping profiles via geometric programming\"\n% Written for CVX by Almir Mutapcic 02/08/06\n% (a figure is generated)\n%\n% Determines the optimal doping profile that minimizes base transit\n% time in a (homojunction) bipolar junction transistor.\n% This problem can be posed as a GP:\n%\n%   minimize   tau_B\n%       s.t.   Nmin <= v <= Nmax\n%              y_(i+1) + v_i^const1 <= y_i\n%              w_(i+1) + v_i^const2 <= w_i, etc...\n%\n% where variables are v_i, y_i, and w_i.\n\n% discretization size\nM = 50;\n% M = 1000; % takes a few minutes to process constraints\n\n% problem constants\ng1 = 0.42;\ng2 = 0.69;\nNmax = 5*10^18;\nNmin = 5*10^16;\nNref = 10^17;\nDn0 = 20.72;\nni0 = 1.4*(10^10);\nWB = 10^(-5);\nC =  WB^2/((M^2)*(Nref^g1)*Dn0);\n\n% exponent powers\npwi = g2 -1;\npwj = 1+g1-g2;\n\n% optimization variables\ncvx_begin gp\n  variables v(M) y(M) w(M)\n\n  % objective function is the base transmit time\n  tau_B = C*w(1);\n\n  minimize( tau_B )\n  subject to\n    % problem constraints\n    v >= Nmin;\n    v <= Nmax;\n\n    for i = 1:M-1\n      if( mod(i,100) == 0 ), fprintf(1,'progress counter: %d\\n',i), end;\n      y(i+1) + v(i)^pwj <= y(i);\n      w(i+1) + y(i)*v(i)^pwi <= w(i);\n    end\n\n    y(M) == v(M)^pwj;\n    w(M) == y(M)*v(M)^pwi;\ncvx_end\n\n% plot the basic optimal doping profile\nfigure, clf\nnbw = 0:1/M:1-1/M;\nsemilogy(nbw,v,'LineWidth',2);\naxis([0 1 1e16 1e19]);\nxlabel('base');\nylabel('doping');\ntext(0,Nmin,'Nmin ', 'HorizontalAlignment','right');\ntext(0,Nmax,'Nmax ', 'HorizontalAlignment','right');\ndisp('Optimal doping profile is plotted.')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/gp_tutorial/beta_min_odp.m",
    "content": "% Optimal doping profile optimization with current gain constraint.\n% Boyd, Kim, Vandenberghe, and Hassibi, \"A tutorial on geometric programming\"\n% Joshi, Boyd, and Dutton, \"Optimal doping profiles via geometric programming\"\n% Written for CVX by Almir Mutapcic 02/08/06\n% (a figure is generated)\n%\n% Determines the optimal doping profile that minimizes base transit\n% time subject to a lower bound constraint on the current gain (beta).\n% This problem can be posed as a GP:\n%\n%   minimize   tau_B\n%       s.t.   Nmin <= v <= Nmax\n%              y_(i+1) + v_i^const1 <= y_i\n%              w_(i+1) + v_i^const2 <= w_i, etc...\n%              beta => beta_min\n%\n% where variables are v_i, y_i, and w_i.\n\n% problem size\nM = 20;\n\n% problem constants\ng1 = 0.42;\ng2 = 0.69;\nNmax = 5*10^18;\nNmin = 5*10^16;\nNref = 10^17;\nDn0 = 20.72;\nni0 = 1.4*(10^10);\nWB = 10^(-5);\nC =  WB^2/((M^2)*(Nref^g1)*Dn0);\n\n% minimum current gain values\nbeta_min_GE = [1 1.4 1.8 2.2 2.6 3.0 3.4 3.43]*(1e-11);\n\n% exponent powers\npwi = g2 -1;\npwj = 1+g1-g2;\n\nv_array = [];\nfor k = 1:length(beta_min_GE)\n    fprintf( 'beta_min_GE = %g: ', beta_min_GE(k) );\n    cvx_begin gp quiet\n        % optimization variables\n        variables v(M) y(M) w(M)\n\n        % objective function is the base transmit time\n        tau_B = C*w(1);\n\n        minimize( tau_B )\n        subject to\n        % fixed problem constraints\n        Nmin <= v <= Nmax;\n\n        for i=1:M-1\n            y(i+1) + v(i)^pwj <= y(i);\n            w(i+1) + y(i)*v(i)^pwi <= w(i);\n        end\n\n        % equalities\n        y(M) == v(M)^pwj;\n        w(M) == y(M)*v(M)^pwi;\n\n        % changing constraint\n        (WB*beta_min_GE(k)/(M*Nref^(g1-g2)*Dn0))*y(1) <= 1;\n    cvx_end\n    fprintf( '%s\\n', cvx_status );\n    % keep the optimal solution\n    v_array = [v_array v];\nend\n\n% plot the basic optimal doping profile\nfigure, clf\nnbw = 0:1/M:1-1/M;\nfor k = 1:length(beta_min_GE)\n  semilogy(nbw,v_array(:,k),'LineWidth',2); hold on;\nend\naxis([0 1 1e16 1e19]);\nxlabel('base');\nylabel('doping');\ntext(0,Nmin,'Nmin ', 'HorizontalAlignment','right');\ntext(0,Nmax,'Nmax ', 'HorizontalAlignment','right');\nhold off;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/gp_tutorial/elmore_interconnect.m",
    "content": "% Elmore delay sizing for an interconnect network.\n% Boyd, Kim, Vandenberghe, and Hassibi, \"A Tutorial on Geometric Programming\"\n% Boyd, Kim, Patil, and Horowitz, \"Digital circuit optimization via geometric programming\"\n% Written for CVX by Almir Mutapcic 02/08/06\n% (a figure is generated)\n%\n% We consider the problem of finding optimal wire widths w_i\n% of N wire segments in an interconnect network, which will\n% minimize the critical Elmore delay, subject to limits on\n% wire widths and the total circuit area. We use a pi-model\n% for each wire segment. Problem can be formulated as GP:\n%\n%   minimize   D\n%       s.t.   w_min <= w <= w_max\n%              area  <= Amax\n%\n% where variables are widths w (and arrival times T that are used\n% to formulate the overall delay D expression).\n%\n% Important: We label root node as 1, and all the other nodes as\n%            node_label_in_the_paper + 1 (due to Matlab's convention).\n%            Also label nodes with increasing numbers downstream.\n\n%********************************************************************\n% user supplied data (problem constants and tree topology)\n%********************************************************************\nN = 6; % number of nodes (including the root node which is labeled as 1)\n\n% parent node array\n% specifies which node is a unique parent for node i (always have a tree)\nparent(1) = 0; % root node does not have a valid parent\nparent(2) = 1;\nparent(3) = 2;\nparent(4) = 3;\nparent(5) = 2;\nparent(6) = 5;\n\n% problem constants\nRsource = 0.1;\nl = 1*ones(N-1,1);\nalpha = 1*ones(N-1,1);\nbeta  = 1*ones(N-1,1);\ngamma = 1*ones(N-1,1);\n\n% load capacitance at each node\nC1 = 10; C2 = 10; C3 = 10; C4 = 10; C5 = 10;\nCload = [0 C1 C2 C3 C4 C5];\n\n% minimum and maximum width and area specification\nWmin = 1;\nWmax = 10;\nAmax = 15;\n\n%********************************************************************\n% derived data (computed from user's data)\n%********************************************************************\n% compute children cell array (evaluate who are children for each node)\nchildren = cell(N,1);\nleafs = [];\nfor node = [1:N]\n  children{node} = find(parent == node);\n  if isempty(children{node})\n    leafs(end+1) = node; % leafs have no children\n  end\nend\n\n%********************************************************************\n% optimization (generating optimal tradeoff curve)\n%********************************************************************\ndisp('Generating the tradeoff curve...')\n\nDarray = [];\nfor Amax = [5.05 5.25 5.5 5.75 6:25]\n  % formulate the GP problem and solve it\n  cvx_begin gp quiet\n    % optimization variables\n    variable w(N-1)     % wire width\n    variable T(N)       % arrival time (Elmore delay to node i)\n\n    % area definition\n    area = sum(w.*l);\n\n    % wire segment resistance is inversely proportional to widths\n    R = alpha.*l./w;\n    R = [Rsource; R];\n\n    % wire segment capacitance is an affine function of widths\n    C_bar = beta.*l.*w + gamma.*l;\n    C_bar = [0; C_bar];\n\n    % compute common capacitances for each node (C_tilde in GP tutorial)\n    C_tilde = cvx( zeros(N,1) );\n    for node = [1:N]\n      C_tilde(node,1) = Cload(node);\n      for k = parent(node)\n        if k > 0; C_tilde(node,1) = C_tilde(node,1) + C_bar(k); end;\n      end\n      for k = children{node}\n        C_tilde(node,1) = C_tilde(node,1) + C_bar(k);\n      end\n    end\n\n    % now compute total downstream capacitances\n    C_total = C_tilde;\n    for node = N:-1:1\n      for k = children{node}\n        C_total(node,1) = C_total(node,1) + C_total(k,1);\n      end\n    end\n\n    % objective is the critical Elmore delay\n    minimize( max( T(leafs) ) )\n    subject to\n      % generate Elmore delay constraints\n      R(1)*C_total(1) <= T(1,1);\n      for node = 2:N\n        R(node)*C_total(node) + T(parent(node),1) <= T(node,1);\n      end\n\n      % area and width constraints\n      area <= Amax;\n      w >= Wmin;\n      w <= Wmax;\n  cvx_end\n\n  % display and store computed values\n  fprintf(1,'  Amax = %5.2f   delay = %3.2f\\n',Amax,cvx_optval);\n  Darray = [Darray cvx_optval];\nend\n\n% plot the tradeoff curve\nfigure, clf\nAmax = [5.05 5.25 5.5 5.75 6:25];\nplot(Darray,Amax);\nxlabel('Elmore delay D'); ylabel('Amax');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/gp_tutorial/floor_planning.m",
    "content": "% Floor planning with an optimal trade-off curve.\n% Boyd, Kim, Vandenberghe, and Hassibi, \"A Tutorial on Geometric Programming\"\n% Written for CVX by Almir Mutapcic 02/08/06\n% (a figure is generated)\n%\n% Solves the problem of configuring and placing rectangles such\n% that they do not overlap and that they minimize the area of the\n% bounding box. This code solves the specific instances given\n% in the GP tutorial. We have four rectangles with variable\n% width w_i and height h_i. They need to satisfy area and aspect\n% ration constraints. The GP is formulated as:\n%\n%   minimize   max(wa+wb,wc+wd)*(max(ha,hb)+max(hc,hd))\n%       s.t.   wa*ha == area_a, wb*hb == area_b, ...\n%              1/alpha_max <= ha/wa <= alpha_max, ...\n%\n% where variables are rectangle widths w's and heights h's.\n\n% constants\na = 0.2;\nb = 0.5;\nc = 1.5;\nd = 0.5;\n\n% alpha is the changing parameter\nN = 20;\nalpha = linspace(1.01,4,N);\n\nfprintf(1,'Solving for the optimal tradeoff curve...\\n');\nmin_area = zeros(N,1);\nfor n = 1:N\n  % GP variables\n  fprintf( 'alpha = %.2f ... ', alpha(n) );\n  cvx_begin gp quiet\n    variables wa wb wc wd ha hb hc hd\n    % objective function is the area of the bounding box\n    minimize( max(wa+wb,wc+wd)*(max(ha,hb)+max(hc,hd)) )\n    subject to\n      % constraints (now impose the non-changing constraints)\n      ha*wa == a; hb*wb == b; hc*wc == c; hd*wd == d;\n      1/alpha(n) <= ha/wa <= alpha(n);\n      1/alpha(n) <= hb/wb <= alpha(n);\n      1/alpha(n) <= hc/wc <= alpha(n);\n      1/alpha(n) <= hd/wd <= alpha(n);\n  cvx_end\n  fprintf( 'area = %.2f\\n', cvx_optval );\n  min_area(n) = cvx_optval;\nend\n\nfigure, clf\nplot(alpha,min_area);\nxlabel('alpha'); ylabel('min area');\naxis([1 4 2.5 4]);\ndisp('Optimal tradeoff curve is plotted.')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/gp_tutorial/max_volume_box.m",
    "content": "% Box volume maximization\r\n% Boyd, Kim, Vandenberghe, and Hassibi, \"A Tutorial on Geometric Programming\"\r\n% Written for CVX by Almir Mutapcic 02/08/06\r\n% (a figure is generated)\r\n%\r\n% Maximizes volume of a box-shaped structure which has constraints\r\n% on its total wall area, its total floor area, and which has lower\r\n% and upper bounds on the aspect ratios. This leads to a GP:\r\n%\r\n%   maximize   h*w*d\r\n%       s.t.   2(h*w + h*d) <= Awall, w*d <= Afloor\r\n%              alpha <= h/w <= beta\r\n%              gamma <= d/w <= delta\r\n%\r\n% where variables are the box height h, width w, and depth d.\r\n\r\n% problem constants\r\nalpha = 0.5; beta = 2; gamma = 0.5; delta = 2;\r\n\r\n% varying parameters for an optimal trade-off curve\r\nN = 10;\r\nAfloor = logspace(1,3,N);\r\nAwall  = [100 1000 10000];\r\nopt_volumes = zeros(length(Awall),N);\r\n\r\ndisp('Computing optimal box volume for:')\r\n\r\n% setup various GP problems with varying parameters\r\nfor k = 1:length(Awall)\r\n  Awall_k = Awall(k);\r\n  fprintf( 'Awall = %d:\\n', Awall(k) );\r\n  for n = 1:N\r\n    % resolve the problem with varying parameters\r\n    Afloor_n = Afloor(n);\r\n    fprintf( '    Afloor = %7.2f: ', Afloor(n) );\r\n    cvx_begin gp quiet\r\n      variables h w d\r\n      % objective function is the box volume\r\n      maximize( h*w*d )\r\n      subject to\r\n        2*(h*w + h*d) <= Awall_k;\r\n        w*d <= Afloor_n;\r\n        alpha <= h/w <= beta;\r\n        gamma <= d/w <= delta;\r\n    cvx_end\r\n    fprintf( 'max_volume = %3.2f\\n', cvx_optval );\r\n    opt_volumes(k,n) = cvx_optval;\r\n  end\r\nend\r\n\r\n% plot the tradeoff curve\r\nfigure, clf\r\nloglog(Afloor,opt_volumes(1,:), Afloor,opt_volumes(2,:), Afloor,opt_volumes(3,:));\r\nxlabel('Afloor'); ylabel('V');\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/gp_tutorial/power_control.m",
    "content": "% Simple power control in communication systems via GP.\r\n% Boyd, Kim, Vandenberghe, and Hassibi, \"A Tutorial on Geometric Programming\"\r\n% Written for CVX by Almir Mutapcic 02/08/06\r\n% (a figure is generated)\r\n%\r\n% Solves the power control problem in communication systems, where\r\n% we want to minimize the total transmitter power for n transmitters,\r\n% subject to minimum SINR level, and lower and upper bounds on powers.\r\n% This results in a GP:\r\n%\r\n%   minimize   sum(P)\r\n%       s.t.   Pmin <= P <= Pmax\r\n%              SINR >= SINR_min\r\n%\r\n% where variables are transmitter powers P.\r\n% Numerical data for the specific examples was made up.\r\n\r\n% problem constants\r\nn = 5;                 % number of transmitters and receivers\r\nsigma = 0.5*ones(n,1); % noise power at the receiver i\r\nPmin = 0.1*ones(n,1);  % minimum power at the transmitter i\r\nPmax = 5*ones(n,1);    % maximum power at the transmitter i\r\nSINR_min = 2;          % threshold SINR for each receiver\r\n\r\n% path gain matrix\r\nG = [1.0  0.1  0.2  0.1  0.0\r\n     0.1  1.0  0.1  0.1  0.0\r\n     0.2  0.1  2.0  0.2  0.2\r\n     0.1  0.1  0.2  1.0  0.1\r\n     0.0  0.0  0.2  0.1  1.0];\r\n\r\n% variables are power levels\r\ncvx_begin gp\r\n  variable P(n)\r\n  % objective function is the total transmitter power\r\n  minimize( sum(P) )\r\n  subject to\r\n    % formulate the inverse SINR at each receiver using vectorize features\r\n    Gdiag = diag(G);          % the main diagonal of G matrix\r\n    Gtilde = G - diag(Gdiag); % G matrix without the main diagonal\r\n    % inverse SINR\r\n    inverseSINR = (sigma + Gtilde*P)./(Gdiag.*P);\r\n    % constraints are power limits and minimum SINR level\r\n    Pmin <= P <= Pmax;\r\n    inverseSINR <= (1/SINR_min);\r\ncvx_end\r\n\r\nfprintf(1,'\\nThe minimum total transmitter power is %3.2f.\\n',cvx_optval);\r\ndisp('Optimal power levels are: '), P\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/gp_tutorial/simple_dig_ckt_sizing.m",
    "content": "% Digital circuit sizing\n% Boyd, Kim, Vandenberghe, and Hassibi, \"A Tutorial on Geometric Programming\"\n% Written for CVX by Almir Mutapcic 02/08/06\n% (a figure is generated)\n%\n% Solves the problem of choosing gate scale factors x_i to give\n% minimum ckt delay, subject to limits on the total area and power.\n%\n%   minimize   D\n%       s.t.   P <= Pmax, A <= Amax\n%              x >= 1\n%\n% where variables are scale factors x.\n%\n% This code is specific to the digital circuit shown in figure 4\n% (page 28) of GP tutorial paper. All the constraints and\n% the worst-case delay expression are hard-coded for this\n% particular circuit.\n%\n% A more general code with more precise models for digital cicuit\n% sizing is also available as part of the CVX examples library.\n\n% number of cells\nm = 7;\n\n% problem constants\nf = [1 0.8 1 0.7 0.7 0.5 0.5]';\ne = [1 2 1 1.5 1.5 1 2]';\nCout6 = 10;\nCout7 = 10;\n\na     = ones(m,1);\nalpha = ones(m,1);\nbeta  = ones(m,1);\ngamma = ones(m,1);\n\n% varying parameters for an optimal trade-off curve\nN = 25;\nPmax = linspace(10,100,N);\nAmax = [25 50 100];\nmin_delay = zeros(length(Amax),N);\n\ndisp('Generating the optimal tradeoff curve...')\n\nfor k = 1:length(Amax)\n    fprintf( 'Amax = %d:\\n', Amax(k) );\n    for n = 1:N\n        fprintf( '    Pmax = %6.2f: ', Pmax(n) );\n        cvx_begin gp quiet\n          % optimization variables\n          variable x(m)           % scale factors\n\n          % input capacitance is an affine function of sizes\n          cin = alpha + beta.*x;\n\n          % load capacitance of a gate is the sum of its fan-out c_in's\n          clear cload; % start with a fresh variable\n          cload(1) = cin(4);\n          cload(2) = cin(4) + cin(5);\n          cload(3) = cin(5) + cin(7);\n          cload(4) = cin(6) + cin(7);\n          cload(5) = cin(7);\n          % output gates have their load capacitances\n          cload(6) = Cout6;\n          cload(7) = Cout7;\n\n          % gate delay is the product of its driving res. R = gamma./x and cload\n          d = (cload').*gamma./x;\n\n          power = (f.*e)'*x;         % total power\n          area = a'*x;               % total area\n\n          % evaluate delay over all paths in the given circuit (there are 7 paths)\n          path_delays = [ ...\n            d(1) + d(4) + d(6); % delay of path 1\n            d(1) + d(4) + d(7); % delay of path 2, etc...\n            d(2) + d(4) + d(6);\n            d(2) + d(4) + d(7);\n            d(2) + d(5) + d(7);\n            d(3) + d(5) + d(6);\n            d(3) + d(7) ];\n\n          % overall circuit delay\n          circuit_delay = ( max(path_delays) );\n\n          % objective is the worst-case delay\n          minimize( circuit_delay )\n          subject to\n            % construct the constraints\n            x >= 1;             % all sizes greater than 1 (normalized)\n            power <= Pmax(n);   % power constraint\n            area <= Amax(k);    % area constraint\n        cvx_end\n        fprintf( 'delay = %3.2f\\n', cvx_optval );\n        min_delay(k,n) = cvx_optval;\n    end\nend\n\n% plot the tradeoff curve\nplot(Pmax,min_delay(1,:), Pmax,min_delay(2,:), Pmax,min_delay(3,:));\nxlabel('Pmax'); ylabel('Dmin');\ndisp('Optimal tradeoff curve plotted.')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/gp_tutorial/simple_dig_ckt_sizing_vect.m",
    "content": "% Digital circuit sizing (vectorized)\n% Boyd, Kim, Vandenberghe, and Hassibi, \"A Tutorial on Geometric Programming\"\n% Written for CVX by Almir Mutapcic 02/08/06\n% (a figure is generated)\n%\n% Solves the problem of choosing gate scale factors x_i to give\n% minimum ckt delay, subject to limits on the total area and power.\n%\n%   minimize   D\n%       s.t.   P <= Pmax, A <= Amax\n%              x >= 1\n%\n% where variables are scale factors x.\n%\n% This code uses matrices in order to evaluate signal paths\n% through the circuit (thus, it uses vectorize Matlab features).\n% It is specific to the digital circuit shown in figure 4 (page 28)\n% of GP tutorial paper.\n\n% digital circuit shown in figure 4 (page 28) of GP tutorial paper\nm = 7;  % number of cells\nn = 8;  % number of edges\nA = sparse(m,n);\n\n% A is standard cell-edge incidence matrix of the circuit\n% A_ij = 1 if edge j comes out of cell i, -1 if it comes in, 0 otherwise\n  A(1,1) =     1;\n  A(2,2) =     1;\n  A(2,3) =     1;\n  A(3,4) =     1;\n  A(3,8) =     1;\n  A(4,1) =    -1;\n  A(4,2) =    -1;\n  A(4,5) =     1;\n  A(4,6) =     1;\n  A(5,3) =    -1;\n  A(5,4) =    -1;\n  A(5,7) =     1;\n  A(6,5) =    -1;\n  A(7,6) =    -1;\n  A(7,7) =    -1;\n  A(7,8) =    -1;\n\n% decompose A into edge outgoing and edge-incoming part\nAout = double(A > 0);\nAin = double(A < 0);\n\n% problem constants\nf = [1 0.8 1 0.7 0.7 0.5 0.5]';\ne = [1 2 1 1.5 1.5 1 2]';\nCout6 = 10;\nCout7 = 10;\n\na     = ones(m,1);\nalpha = ones(m,1);\nbeta  = ones(m,1);\ngamma = ones(m,1);\n\n% varying parameters for an optimal trade-off curve\nN = 20;\nPmax = linspace(10,100,N);\nAmax = [25 50 100];\nmin_delay = zeros(length(Amax),N);\n\ndisp('Generating the optimal tradeoff curve...')\n\nfor k = 1:length(Amax)\n    fprintf( 'Amax = %d:\\n', Amax(k) );\n    for n = 1:N\n        fprintf( '    Pmax = %6.2f: ', Pmax(n) );\n        cvx_begin gp quiet\n          % optimization variables\n          variable x(m)                 % scale factors\n          variable t(m)                 % arrival times\n\n          % objective is the upper bound on the overall delay\n          % and that is the max of arrival times for output gates 6 and 7\n          minimize( max( t(6),t(7) ) )\n          subject to\n            % input capacitance is an affine function of sizes\n            cin = alpha + beta.*x;\n\n            % load capacitance is the input capacitance times the fan-out matrix\n            % given by Fout = Aout*Ain'\n            cload = (Aout*Ain')*cin;\n            cload(6) = Cout6;          % load capacitance of the output gate 6\n            cload(7) = Cout7;          % load capacitance of othe utput gate 7\n\n            % delay is the product of its driving resistance R = gamma./x and cload\n            d = cload.*gamma./x;\n\n            % power and area definitions\n            power = (f.*e)'*x;\n            area = a'*x;\n\n            % scale size, power, and area constraints\n            x >= 1;\n            power <= Pmax(n);\n            area <= Amax(k);\n\n            % create timing constraints\n            % these constraints enforce t_j + d_j <= t_i over all gates j that drive gate i\n            Aout'*t + Ain'*d <= Ain'*t;\n\n            % for gates with inputs not connected to other gates we enforce d_i <= t_i\n            d(1:3) <= t(1:3);\n        cvx_end\n        fprintf( 'delay = %3.2f\\n', cvx_optval );\n        min_delay(k,n) = cvx_optval;\n    end\nend\n\n% plot the tradeoff curve\nplot(Pmax,min_delay(1,:), Pmax,min_delay(2,:), Pmax,min_delay(3,:));\nxlabel('Pmax'); ylabel('Dmin');\ndisp('Optimal tradeoff curve plotted.')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/Contents.m",
    "content": "% Graph Laplacian eigenvalue optimization\n% <a href=\"http://stanford.edu/~boyd/cvx_opt_graph_lapl_eigs.html\">Convex Optimization of Graph Laplacian Eigenvalues</a>\n%\n%  larger_example.m   - FDLA and FMMC solutions for a 50-node, 200-edge graph\n%  cut_grid_example.m - FDLA and FMMC solutions for a 64-node, 95-edge cut-grid graph\n%  small_example.m    - FDLA and FMMC solutions for an 8-node, 13-edge graph\n%  fmmc.m             - Computes fastest mixing Markov chain (FMMC) edge weights\n%  mh.m               - Computes the Metropolis-Hastings heuristic edge weights\n%  best_const.m       - Computes the constant edge weight that yields fastest averaging.\n%  fdla.m             - Computes the fastest distributed linear averaging (FDLA) edge weights\n%  max_deg.m          - Computes the maximum-degree heuristic edge weights\n%  cut_grid_data.m    - Generate a cut-grid graph for the ICM 2006 talk example\n%  plotgraph.m        - Plots a graph with each edge width proportional to its weight.\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/best_const.m",
    "content": "function [w,rho] = best_const(A)\n% Computes the constant edge weight that yields fastest averaging.\n%\n% [W,RHO] = BEST_CONST(A) gives a vector of the best constant edge weights\n% for a graph described by the incidence matrix A (NxM). N is the number of\n% nodes, and M is the number of edges. Each column of A has exactly one +1\n% and one -1. \n%\n% The best constant edge weight is the inverse of the average of\n% the second smallest and largest eigenvalues of the unweighted Laplacian:\n%    W = 2/( lambda_2(A*A') + lambda_n(A*A') )\n% RHO is computed from the weights W as follows:\n%    RHO = max(abs(eig( eye(n,n) - (1/n)*ones(n,n) - A*W*A' ))).\n%\n% For more details, see the references:\n% \"Fast linear iterations for distributed averaging\" by L. Xiao and S. Boyd\n% \"Fastest mixing Markov chain on a graph\" by S. Boyd, P. Diaconis, and L. Xiao\n% \"Convex Optimization of Graph Laplacian Eigenvalues\" by S. Boyd\n%\n% Almir Mutapcic 08/29/06\n[n,m] = size(A);\n\n% max degrees of the nodes\nLunw = A*A';                % unweighted Laplacian matrix\neigvals = sort(eig(Lunw));\n\n% max degree weigth allocation\nalpha = 2/(eigvals(2) + eigvals(n));\nw = alpha*ones(m,1);\n\n% compute the norm\nif nargout > 1,\n    rho = norm( eye(n) - A*diag(w)*A' - (1/n)*ones(n) );\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/cut_grid_data.m",
    "content": "function [A,xy]= cut_grid_data\n\n% Generate a cut-grid graph for the ICM 2006 talk example\n%\n% The graph has 64 nodes and 95 edges\n% A is an n x m incidence matrix (n is number of nodes, m is number of edges)\n% xy is the location data\n%\n% Original code by Arpita Ghosh, modified for ICM06 talk by Almir Mutapcic\n\nn  = 8; \nr1 = 2;\ny  = ones(n,1) * [1:n];\nx  = y';\nx  = x(:);\ny  = y(:);\ndx = x * ones(1,n^2);\ndy = y * ones(1,n^2);\nxy = [ x, y ];\n\n% Find the adjacency matrix, manually deleting edges to get down to size\nAdj1 = tril( ( dx - dx' ) .^ 2 + ( dy - dy' ) .^2 < r1, -1 );\nAdj1(49,41) = 0;\nAdj1(50,42) = 0; \nAdj1(16,8)  = 0;\nAdj1(24,16) = 0;\nAdj1(15,7)  = 0;\nAdj1(23,15) = 0;\nAdj1(10,1)  = 0; \nAdj1(21,13) = 0;\nAdj1(13,5)  = 0; \nAdj1(22,14) = 0;\nAdj1(14,6)  = 0; \nAdj1(51,43) = 0; \nAdj1(52,44) = 0; \nAdj1(53,45) = 0; \nAdj1(54,46) = 0; \nAdj1(42,41) = 0;\nAdj1(34,33) = 0;\nAdj1(26,25) = 0;\n\n% Build the incidence matrix\n[i,j,v] = find(Adj1);\nm = length(i);\nA = sparse( [i;j], [1:m,1:m]', [ones(m,1);-ones(m,1)] );\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/cut_grid_example.m",
    "content": "% FDLA and FMMC solutions for a 64-node, 95-edge cut-grid graph\n% S. Boyd, et. al., \"Convex Optimization of Graph Laplacian Eigenvalues\"\n% ICM'06 talk examples (www.stanford.edu/~boyd/cvx_opt_graph_lapl_eigs.html)\n% Written for CVX by Almir Mutapcic 08/29/06\n% (figures are generated)\n%\n% In this example we consider a graph described by the incidence matrix A.\n% Each edge has a weight W_i, and we optimize various functions of the\n% edge weights as described in the referenced paper; in particular,\n%\n% - the fastest distributed linear averaging (FDLA) problem (fdla.m)\n% - the fastest mixing Markov chain (FMMC) problem (fmmc.m)\n%\n% Then we compare these solutions to the heuristics listed below:\n%\n% - maximum-degree heuristic (max_deg.m)\n% - constant weights that yield fastest averaging (best_const.m)\n% - Metropolis-Hastings heuristic (mh.m)\n\n% generate a cut-grid graph example\n[A,xy] = cut_grid_data;\n\n% Compute edge weights: some optimal, some based on heuristics\n[n,m] = size(A);\n\n[ w_fdla, rho_fdla ] = fdla(A);\n[ w_fmmc, rho_fmmc ] = fmmc(A);\n[ w_md,   rho_md   ] = max_deg(A);\n[ w_bc,   rho_bc   ] = best_const(A);\n[ w_mh,   rho_mh   ] = mh(A);\n\ntau_fdla = 1/log(1/rho_fdla);\ntau_fmmc = 1/log(1/rho_fmmc);\ntau_md   = 1/log(1/rho_md);\ntau_bc   = 1/log(1/rho_bc);\ntau_mh   = 1/log(1/rho_mh);\n\nfprintf(1,'\\nResults:\\n');\nfprintf(1,'FDLA weights:\\t\\t rho = %5.4f \\t tau = %5.4f\\n',rho_fdla,tau_fdla);\nfprintf(1,'FMMC weights:\\t\\t rho = %5.4f \\t tau = %5.4f\\n',rho_fmmc,tau_fmmc);\nfprintf(1,'M-H weights:\\t\\t rho = %5.4f \\t tau = %5.4f\\n',rho_mh,tau_mh);\nfprintf(1,'MAX_DEG weights:\\t rho = %5.4f \\t tau = %5.4f\\n',rho_md,tau_md);\nfprintf(1,'BEST_CONST weights:\\t rho = %5.4f \\t tau = %5.4f\\n',rho_bc,tau_bc);\n\n% plot results\nfigure(1), clf\nplotgraph(A,xy,w_fdla);\ntext(0.425,1.05,'FDLA optimal weights')\n\nfigure(2), clf\nplotgraph(A,xy,w_fmmc);\ntext(0.425,1.05,'FMMC optimal weights')\n\nfigure(3), clf\nplotgraph(A,xy,w_md);\ntext(0.375,1.05,'Max degree optimal weights')\n\nfigure(4), clf\nplotgraph(A,xy,w_bc);\ntext(0.375,1.05,'Best constant optimal weights')\n\nfigure(5), clf\nplotgraph(A,xy,w_mh);\ntext(0.3,1.05,'Metropolis-Hastings optimal weights')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/fdla.m",
    "content": "function [ w, cvx_optval ] = fdla( A )\n\n% Computes the fastest distributed linear averaging (FDLA) edge weights\n%\n% [W,S] = FDLA(A) gives a vector of the fastest distributed linear averaging\n% edge weights for a graph described by the incidence matrix A (n x m).\n% Here n is the number of nodes and m is the number of edges in the graph;\n% each column of A has exactly one +1 and one -1.\n%\n% The FDLA edge weights are given by the SDP:\n%\n%   minimize    s\n%   subject to  -s*I <= I - L - (1/n)11' <= s*I\n%\n% where the variables are edge weights w in R^m and s in R.\n% Here L is the weighted Laplacian defined by L = A*diag(w)*A'.\n% The optimal value is s, and is returned in the second output.\n%\n% For more details see the references:\n% \"Fast linear iterations for distributed averaging\" by L. Xiao and S. Boyd\n% \"Convex Optimization of Graph Laplacian Eigenvalues\" by S. Boyd\n%\n% Written for CVX by Almir Mutapcic 08/29/06\n\n[n,m] = size(A);\nI = eye(n,n);\nJ = I - (1/n) * ones(n,n);\ncvx_begin sdp\n    variable w(m,1)   % edge weights\n    variable s        % epigraph variable\n    variable L(n,n) symmetric\n    minimize( s )\n    subject to\n        L == A * diag(w) * A';\n        -s * I <= J - L <= s * I;\ncvx_end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/fmmc.m",
    "content": "function [ w, cvx_optval ] = fmmc(A)\n\n% Computes fastest mixing Markov chain (FMMC) edge weights\n%\n% [W,S] = FMMC(A) gives a vector of the fastest mixing Markov chain\n% edge weights for a graph described by the incidence matrix A (n x m).\n% Here n is the number of nodes and m is the number of edges in the graph;\n% each column of A has exactly one +1 and one -1.\n%\n% The FMMC edge weights are given the SDP:\n%\n%   minimize    s\n%   subject to  -s*I <= I - L - (1/n)11' <= s*I\n%               w >= 0,  diag(L) <= 1\n%\n% where the variables are edge weights w in R^m and s in R.\n% Here L is the weighted Laplacian defined by L = A*diag(w)*A'.\n% The optimal value is s, and is returned in the second output.\n%\n% For more details see references:\n% \"Fastest mixing Markov chain on a graph\" by S. Boyd, P. Diaconis, and L. Xiao\n% \"Convex Optimization of Graph Laplacian Eigenvalues\" by S. Boyd\n%\n% Written for CVX by Almir Mutapcic 08/29/06\n\n[n,m] = size(A);\nI = eye(n,n);\nJ = I - (1/n)*ones(n,n);\ncvx_begin sdp\n    variable w(m,1)   % edge weights\n    variable s        % epigraph variable\n    variable L(n,n) symmetric\n    minimize( s )\n    subject to\n        L == A * diag(w) * A';\n        -s * I <= J - L <= +s * I;\n        w >= 0;\n        diag(L) <= 1;\ncvx_end\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/larger_example.m",
    "content": "% FDLA and FMMC solutions for a 50-node, 200-edge graph\n% S. Boyd, et. al., \"Convex Optimization of Graph Laplacian Eigenvalues\"\n% ICM'06 talk examples (www.stanford.edu/~boyd/cvx_opt_graph_lapl_eigs.html)\n% Written for CVX by Almir Mutapcic 08/29/06\n% (figures are generated)\n%\n% In this example we consider a graph described by the incidence matrix A.\n% Each edge has a weight W_i, and we optimize various functions of the\n% edge weights as described in the referenced paper; in particular,\n%\n% - the fastest distributed linear averaging (FDLA) problem (fdla.m)\n% - the fastest mixing Markov chain (FMMC) problem (fmmc.m)\n%\n% Then we compare these solutions to the heuristics listed below:\n%\n% - maximum-degree heuristic (max_deg.m)\n% - constant weights that yield fastest averaging (best_const.m)\n% - Metropolis-Hastings heuristic (mh.m)\n\n% randomly generate a graph with 50 nodes and 200 edges\n% and make it pretty for plotting\nn = 50; threshold = 0.2529;\nrand('state',209);\nxy = rand(n,2);\n\nangle = 10*pi/180;\nRotate = [ cos(angle) sin(angle); -sin(angle) cos(angle) ];\nxy = (Rotate*xy')';\n\nDist = zeros(n,n);\nfor i=1:(n-1);\n  for j=i+1:n;\n    Dist(i,j) = norm( xy(i,:) - xy(j,:) );\n  end;\nend;\nDist = Dist + Dist';\nAd = Dist < threshold;\nAd = Ad - eye(n);\nm = sum(sum(Ad))/2;\n\n% find the incidence matrix\nA = zeros(n,m);\nl = 0;\nfor i=1:(n-1);\n  for j=i+1:n;\n    if Ad(i,j)>0.5\n      l = l + 1;\n      A(i,l) =  1;\n      A(j,l) = -1;\n    end;\n  end;\nend;\nA = sparse(A);\n\n% Compute edge weights: some optimal, some based on heuristics\n[n,m] = size(A);\n\n[ w_fdla, rho_fdla ] = fdla(A);\n[ w_fmmc, rho_fmmc ] = fmmc(A);\n[ w_md,   rho_md   ] = max_deg(A);\n[ w_bc,   rho_bc   ] = best_const(A);\n[ w_mh,   rho_mh   ] = mh(A);\n\ntau_fdla = 1/log(1/rho_fdla);\ntau_fmmc = 1/log(1/rho_fmmc);\ntau_md   = 1/log(1/rho_md);\ntau_bc   = 1/log(1/rho_bc);\ntau_mh   = 1/log(1/rho_mh);\n\neig_opt  = sort(eig(eye(n) - A * diag(w_fdla) * A'));\neig_fmmc = sort(eig(eye(n) - A * diag(w_fmmc) * A'));\neig_mh   = sort(eig(eye(n) - A * diag(w_mh)   * A'));\neig_md   = sort(eig(eye(n) - A * diag(w_md)   * A'));\neig_bc   = sort(eig(eye(n) - A * diag(w_bc)   * A'));\n\nfprintf(1,'\\nResults:\\n');\nfprintf(1,'FDLA weights:\\t\\t rho = %5.4f \\t tau = %5.4f\\n',rho_fdla,tau_fdla);\nfprintf(1,'FMMC weights:\\t\\t rho = %5.4f \\t tau = %5.4f\\n',rho_fmmc,tau_fmmc);\nfprintf(1,'M-H weights:\\t\\t rho = %5.4f \\t tau = %5.4f\\n',rho_mh,tau_mh);\nfprintf(1,'MAX_DEG weights:\\t rho = %5.4f \\t tau = %5.4f\\n',rho_md,tau_md);\nfprintf(1,'BEST_CONST weights:\\t rho = %5.4f \\t tau = %5.4f\\n',rho_bc,tau_bc);\n\n% plot results\nfigure(1), clf\ngplot(Ad,xy);\nhold on;\nplot(xy(:,1), xy(:,2), 'ko','LineWidth',4, 'MarkerSize',4);\naxis([0.05 1.1 -0.1 0.95]);\ntitle('Graph')\nhold off;\n\nfigure(2), clf\nv_fdla = [w_fdla; diag(eye(n) - A*diag(w_fdla)*A')];\n[ifdla, jfdla, neg_fdla] = find( v_fdla.*(v_fdla < -0.001 ) );\nv_fdla(ifdla) = [];\nwbins = [-0.6:0.012:0.6];\nhist(neg_fdla,wbins); hold on,\nh = findobj(gca,'Type','patch');\nset(h,'FaceColor','r')\nhist(v_fdla,wbins); hold off,\naxis([-0.6 0.6 0 12]);\nxlabel('optimal FDLA weights');\nylabel('histogram');\n\nfigure(3), clf\nxbins = (-1:0.015:1)';\nymax  = 6;\nsubplot(3,1,1)\nhist(eig_md, xbins); hold on;\nmax_md = max(abs(eig_md(1:n-1)));\nplot([-max_md -max_md],[0 ymax], 'b--');\nplot([ max_md  max_md],[0 ymax], 'b--');\naxis([-1 1 0 ymax]);\ntext(0,5,'MAX DEG');\ntitle('Eigenvalue distributions')\nsubplot(3,1,2)\nhist(eig_bc, xbins); hold on;\nmax_opt = max(abs(eig_bc(1:n-1)));\nplot([-max_opt -max_opt],[0 ymax], 'b--');\nplot([ max_opt  max_opt],[0 ymax], 'b--');\naxis([-1 1 0 ymax]);\ntext(0,5,'BEST CONST');\nsubplot(3,1,3)\nhist(eig_opt, xbins); hold on;\nmax_opt = max(abs(eig_opt(1:n-1)));\nplot([-max_opt -max_opt],[0 ymax], 'b--');\nplot([ max_opt  max_opt],[0 ymax], 'b--');\naxis([-1 1 0 ymax]);\ntext(0,5,'FDLA');\n\nfigure(4), clf\nxbins = (-1:0.015:1)';\nymax  = 6;\nsubplot(3,1,1)\nhist(eig_md, xbins); hold on;\nmax_md = max(abs(eig_md(1:n-1)));\nplot([-max_md -max_md],[0 ymax], 'b--');\nplot([ max_md  max_md],[0 ymax], 'b--');\naxis([-1 1 0 ymax]);\ntext(0,5,'MAX DEG');\ntitle('Eigenvalue distributions')\nsubplot(3,1,2)\nhist(eig_mh, xbins); hold on;\nmax_opt = max(abs(eig_mh(1:n-1)));\nplot([-max_opt -max_opt],[0 ymax], 'b--');\nplot([ max_opt  max_opt],[0 ymax], 'b--');\naxis([-1 1 0 ymax]);\ntext(0,5,'MH');\nsubplot(3,1,3)\nhist(eig_fmmc, xbins); hold on;\nmax_opt = max(abs(eig_fmmc(1:n-1)));\nplot([-max_opt -max_opt],[0 ymax], 'b--');\nplot([ max_opt  max_opt],[0 ymax], 'b--');\naxis([-1 1 0 ymax]);\ntext(0,5,'FMMC');\n\nfigure(5), clf\nv_fmmc = [w_fmmc; diag(eye(n) - A*diag(w_fmmc)*A')];\n[ifmmc, jfmmc, nonzero_fmmc] = find( v_fmmc.*(v_fmmc > 0.001 ) );\nhist(nonzero_fmmc,80);\naxis([0 1 0 10]);\nxlabel('optimal positive FMMC weights');\nylabel('histogram');\n\nfigure(6), clf\nAn = abs(A*diag(w_fmmc)*A');\nAn = (An - diag(diag(An))) > 0.0001;\ngplot(An,xy,'b-'); hold on;\nh = findobj(gca,'Type','line');\nset(h,'LineWidth',2.5)\ngplot(Ad,xy,'b:');\nplot(xy(:,1), xy(:,2), 'ko','LineWidth',4, 'MarkerSize',4);\naxis([0.05 1.1 -0.1 0.95]);\ntitle('Subgraph with positive transition prob.')\nhold off;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/max_deg.m",
    "content": "function [w,rho] = max_deg(A)\n\n% Computes the maximum-degree heuristic edge weights\n%\n% [W,RHO] = MAX_DEG(A) gives a vector of maximum-degree edge weights for a\n% graph described by the incidence matrix A (NxM). N is the number of\n% nodes, and M is the number of edges. Each column of A has exactly one +1\n% and one -1. RHO is computed from the weights W as follows:\n%    RHO = max(abs(eig( eye(n,n) - (1/n)*ones(n,n) - A*W*A' ))).\n%\n% Maximum-degree edge weights are all equal to one over the maximum\n% degree of the nodes in the graph.\n%\n% For more details, see the references:\n% \"Fast linear iterations for distributed averaging\" by L. Xiao and S. Boyd\n% \"Fastest mixing Markov chain on a graph\" by S. Boyd, P. Diaconis, and L. Xiao\n% \"Convex Optimization of Graph Laplacian Eigenvalues\" by S. Boyd\n%\n% Almir Mutapcic 08/29/06\n\n% maximum degree solution\n[n,m] = size(A);\n\n% max degrees of the nodes\nLunw = A*A';        % unweighted Laplacian matrix\ndegs = diag(Lunw);\n\n% max degree weight allocation\nmax_deg = max(degs);\nw = (1/max_deg)*ones(m,1);\n\n% compute the norm\nif nargout > 1,\n    rho = norm( eye(n) - A*diag(w)*A' - (1/n)*ones(n) );\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/mh.m",
    "content": "function [w,rho] = mh(A)\n% Computes the Metropolis-Hastings heuristic edge weights\n%\n% [W,RHO] = MH(A) gives a vector of the Metropolis-Hastings edge weights\n% for a graphb described by the incidence matrix A (NxM). N is the number\n% of nodes, and M is the number of edges. Each column of A has exactly one\n% +1 and one -1. RHO is computed from the weights W as follows:\n%    RHO = max(abs(eig( eye(n,n) - (1/n)*ones(n,n) - A*W*A' ))).\n%\n% The M.-H. weight on an edge is one over the maximum of the degrees of the\n% adjacent nodes.\n%\n% For more details, see the references:\n% \"Fast linear iterations for distributed averaging\" by L. Xiao and S. Boyd\n% \"Fastest mixing Markov chain on a graph\" by S. Boyd, P. Diaconis, and L. Xiao\n% \"Convex Optimization of Graph Laplacian Eigenvalues\" by S. Boyd\n%\n% Almir Mutapcic 08/29/06\n\n% degrees of the nodes\n[n,m] = size(A);\nLunw = A*A';          % unweighted Laplacian matrix\ndegs = diag(Lunw);\n\n% Metropolis-Hastings weights\nmh_degs = abs(A)'*diag(degs);\nw = 1./max(mh_degs,[],2);\n\n% compute the norm\nif nargout > 1,\n    rho = norm( eye(n) - A*diag(w)*A' - (1/n)*ones(n) );\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/plotgraph.m",
    "content": "function plotgraph(A,xy,weights)\n% Plots a graph with each edge width proportional to its weight.\n%\n% Edges with positive weights are drawn in blue; negative weights in red.\n%\n% Input parameters:\n% A       --- incidence matrix of the graph (size is n x m)\n%             (n is the number of nodes and m is the number of edges)\n% xy      --- horizontal and vertical positions of the nodes (n x 2 matrix)\n% weights --- m vector giving edge weights\n%\n% Original by Lin Xiao\n% Modified by Almir Mutapcic\n\n% graph size\n[n,m]= size(A);\n\n% set the graph scale and normalize the coordinates to lay in [-1,1] square\nR = max(max(abs(xy))); % maximum abs value of the xy coordinates\nx = xy(:,1)/R; y = xy(:,2)/R;\n\n% normalize weight vector to range between +1 and -1\nweights = weights/max(abs(weights));\n\n% internal parameters (tune these parameters to make the plot look pretty)\n% (note that the graph coordinates and the weights have been rescaled\n% to a common unity scale)\n%rNode = 0.005;     % radius of the node circles\nrNode = 0;          % set the node radius to zero if you do not want the nodes\nwNode = 2;          % line width of the node circles\nPWColor = [0 0 1];  % color of the edges with positive weights\nNWColor = [1 0 0];  % color of the edges with negative weights\nWmin = 0.0001;      % minimum weight value for which we draw an edge\nmax_width = 0.05;   % drawn width of edge with maximum absolute weight\n\n% first draw the edges with patch widths proportional to the weights\nfor i=1:m\n  if ( abs(weights(i)) > Wmin )\n    Isrc = find( sign(weights(i))*A(:,i)>0 );\n    Idst = find( sign(weights(i))*A(:,i)<0 );\n  else\n    Isrc = find( A(:,i)>0 );\n    Idst = find( A(:,i)<0 );\n  end\n\n  % obtain edge patch coordinates\n  xdelta = x(Idst) - x(Isrc); ydelta = y(Idst) - y(Isrc);\n  RotAgl = atan2( ydelta, xdelta );\n  xstart = x(Isrc) + rNode*cos(RotAgl); ystart = y(Isrc) + rNode*sin(RotAgl);\n  xend   = x(Idst) - rNode*cos(RotAgl); yend   = y(Idst) - rNode*sin(RotAgl);\n  L = sqrt( xdelta^2 + ydelta^2 ) - 2*rNode;\n\n  if ( weights(i) > Wmin )\n    W = abs(weights(i))*max_width;\n    drawedge(xstart, ystart, RotAgl, L, W, PWColor);\n    hold on;\n  elseif ( weights(i) < -Wmin )\n    W = abs(weights(i))*max_width;\n    drawedge(xstart, ystart, RotAgl, L, W, NWColor);\n    hold on;\n  else\n    plot([xstart xend],[ystart yend],'k:','LineWidth',2.5);\n  end\nend\n\n% the circle to draw around each node\nangle = linspace(0,2*pi,100);\nxbd = rNode*cos(angle);\nybd = rNode*sin(angle);\n\n% draw the nodes\nfor i=1:n\n  plot( x(i)+xbd, y(i)+ybd, 'k', 'LineWidth', wNode );\nend;\naxis equal;\nset(gca,'Visible','off');\nhold off;\n\n%********************************************************************\n% helper function to draw edges in the graph \n%********************************************************************\nfunction drawedge( x0, y0, RotAngle, L, W, color )\nxp = [     0   L      L    L   L     L     0      0  ];\nyp = [-0.5*W -0.5*W -0.5*W 0 0.5*W 0.5*W 0.5*W -0.5*W];\nRotMat = [cos(RotAngle) -sin(RotAngle); sin(RotAngle) cos(RotAngle)];\n\nDrawCoordinates = RotMat*[ xp; yp ];\nxd = x0 + DrawCoordinates(1,:);\nyd = y0 + DrawCoordinates(2,:);\n\n% draw the edge\npatch( xd, yd, color );\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/graph_laplacian/small_example.m",
    "content": "% FDLA and FMMC solutions for an 8-node, 13-edge graph\n% S. Boyd, et. al., \"Convex Optimization of Graph Laplacian Eigenvalues\"\n% ICM'06 talk examples (www.stanford.edu/~boyd/cvx_opt_graph_lapl_eigs.html)\n% Written for CVX by Almir Mutapcic 08/29/06\n% (figures are generated)\n%\n% In this example we consider a graph described by the incidence matrix A.\n% Each edge has a weight W_i, and we optimize various functions of the\n% edge weights as described in the referenced paper; in particular,\n%\n% - the fastest distributed linear averaging (FDLA) problem (fdla.m)\n% - the fastest mixing Markov chain (FMMC) problem (fmmc.m)\n%\n% Then we compare these solutions to the heuristics listed below:\n%\n% - maximum-degree heuristic (max_deg.m)\n% - constant weights that yield fastest averaging (best_const.m)\n% - Metropolis-Hastings heuristic (mh.m)\n\n% small example (incidence matrix A)\nA = [ 1  0  0  1  0  0  0  0  0  0  0  0  0;\n     -1  1  0  0  1  1  0  0  0  0  0  0  1;\n      0 -1  1  0  0  0  0  0 -1  0  0  0  0;\n      0  0 -1  0  0 -1  0  0  0 -1  0  0  0;\n      0  0  0 -1  0  0 -1  1  0  0  0  0  0;\n      0  0  0  0  0  0  1  0  0  0  1  0  0;\n      0  0  0  0  0  0  0 -1  1  0 -1  1 -1;\n      0  0  0  0 -1  0  0  0  0  1  0 -1  0];\n\n% x and y locations of the graph nodes\nxy = [ 1 2   3 3 1 1 2   3 ; ...\n       3 2.5 3 2 2 1 1.5 1 ]';\n\n% Compute edge weights: some optimal, some based on heuristics\n[n,m] = size(A);\n\n[ w_fdla, rho_fdla ] = fdla(A);\n[ w_fmmc, rho_fmmc ] = fmmc(A);\n[ w_md,   rho_md   ] = max_deg(A);\n[ w_bc,   rho_bc   ] = best_const(A);\n[ w_mh,   rho_mh   ] = mh(A);\n\ntau_fdla = 1/log(1/rho_fdla);\ntau_fmmc = 1/log(1/rho_fmmc);\ntau_md   = 1/log(1/rho_md);\ntau_bc   = 1/log(1/rho_bc);\ntau_mh   = 1/log(1/rho_mh);\n\nfprintf(1,'\\nResults:\\n');\nfprintf(1,'FDLA weights:\\t\\t rho = %5.4f \\t tau = %5.4f\\n',rho_fdla,tau_fdla);\nfprintf(1,'FMMC weights:\\t\\t rho = %5.4f \\t tau = %5.4f\\n',rho_fmmc,tau_fmmc);\nfprintf(1,'M-H weights:\\t\\t rho = %5.4f \\t tau = %5.4f\\n',rho_mh,tau_mh);\nfprintf(1,'MAX_DEG weights:\\t rho = %5.4f \\t tau = %5.4f\\n',rho_md,tau_md);\nfprintf(1,'BEST_CONST weights:\\t rho = %5.4f \\t tau = %5.4f\\n',rho_bc,tau_bc);\n\n% Plot results\nfigure(1), clf\nplotgraph(A,xy,w_fdla);\ntext(0.55,1.05,'FDLA optimal weights')\n\nfigure(2), clf\nplotgraph(A,xy,w_fmmc);\ntext(0.55,1.05,'FMMC optimal weights')\n\nfigure(3), clf\nplotgraph(A,xy,w_md);\ntext(0.5,1.05,'Max degree optimal weights')\n\nfigure(4), clf\nplotgraph(A,xy,w_bc);\ntext(0.5,1.05,'Best constant optimal weights')\n\nfigure(5), clf\nplotgraph(A,xy,w_mh);\ntext(0.46,1.05,'Metropolis-Hastings optimal weights')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/log_exp/Contents.m",
    "content": "% Examples employing logarithms, exponentials, and entropy functions\n%\n%  max_entropy.m                    - Entropy maximization\n%  sparse_covariance_est.m          - Sparse covariance estimation for Gaussian variables\n%  sparse_covariance_est_tradeoff.m - Sparse covariance estimation for Gaussian variables\n%  weighted_analytic_center.m       - Weighted analytic center of a set of linear inequalities\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/log_exp/max_entropy.m",
    "content": "% Entropy maximization \n% Jolle Skaf - 04/24/08\n%\n% Consider the linear inequality constrained entroy maximization problem \n%           maximize    -sum_{i=1}^n x_i*log(x_i) \n%           subject to  sum(x) = 1 \n%                       Fx <= g\n% where the variable is x \\in \\reals^{n} \n\n% Input data \nrandn('state', 0); \nrand('state', 0); \nn = 20; \nm = 10; \np = 5; \n\ntmp = rand(n,1); \nA = randn(m,n); \nb = A*tmp; \nF = randn(p,n); \ng = F*tmp + rand(p,1); \n\n% Entropy maximization \ncvx_begin\n    variable x(n) \n    maximize sum(entr(x)) \n    A*x == b \n    F*x <= g\ncvx_end\n\n% Results \ndisplay('The optimal solution is:' );\ndisp(x); \n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/log_exp/sparse_covariance_est.m",
    "content": "% Sparse covariance estimation for Gaussian variables\n% Joëlle Skaf - 04/24/08 \n% (a figure is generated) \n%\n% Suppose y \\in\\reals^n is a Gaussian random variable with zero mean and \n% covariance matrix R = \\Expect(yy^T), with sparse inverse S = R^{-1} \n% (S_ij = 0 means that y_i and y_j are conditionally independent).\n% We want to estimate the covariance matrix R based on N independent \n% samples y1,...,yN drawn from the distribution, and using prior knowledge \n% that S is sparse\n% A good heuristic for estimating R is to solve the problem \n%           maximize    logdet(S) - tr(SY) \n%           subject to  sum(sum(abs(S))) <= alpha \n%                       S >= 0\n% where Y is the sample covariance of y1,...,yN, and alpha is a sparsity\n% parameter to be chosen or tuned. \n\n% Input data \nrand('state',0);\nrandn('state',0);\nn = 10; \nN = 100; \nStrue = sprandsym(n,0.5,0.01,1);\nR = inv(full(Strue));\ny_sample = sqrtm(R)*randn(n,N); \nY = cov(y_sample'); \nalpha = 50;\n\n% Computing sparse estimate of R^{-1} \ncvx_begin sdp\n    variable S(n,n) symmetric \n    maximize log_det(S) - trace(S*Y)\n    sum(sum(abs(S))) <= alpha\n    S >= 0\ncvx_end\nR_hat = inv(S);\n\nS(find(S<1e-4)) = 0; \nfigure; \nsubplot(121);\nspy(Strue); \ntitle('Inverse of true covariance matrix') \nsubplot(122); \nspy(S)\ntitle('Inverse of estimated covariance matrix')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/log_exp/sparse_covariance_est_tradeoff.m",
    "content": "% Sparse covariance estimation for Gaussian variables\n% Joëlle Skaf - 04/24/08 \n% (a figure is generated)\n% \n% Suppose y \\in\\reals^n is a Gaussian random variable with zero mean and \n% covariance matrix R = \\Expect(yy^T), with sparse inverse S = R^{-1} \n% (S_ij = 0 means that y_i and y_j are conditionally independent).\n% We want to estimate the covariance matrix R based on N independent \n% samples y1,...,yN drawn from the distribution, and using prior knowledge \n% that S is sparse\n% A good heuristic for estimating R is to solve the problem \n%           maximize    logdet(S) - tr(SY) - lambda*sum(sum(abs(S)))\n%           subject to  S >= 0\n% where Y is the sample covariance of y1,...,yN, and lambda is a sparsity\n% parameter to be chosen or tuned. \n% A figure showing the sparsity (number of nonzeros) of S versus lambda \n% is generated.\n\n% Input data \nrandn('state',0);\nn = 10; \nN = 100; \nStrue = sprandsym(n,0.5,0.01,1);\nnnz_true = sum(Strue(:)>1e-4);\nR = inv(full(Strue));\ny_sample = sqrtm(R)*randn(n,N); \nY = cov(y_sample'); \nNlambda = 20;\nlambda = logspace(-2, 3, Nlambda);\nnnz = zeros(1,Nlambda);\n\nfor i=1:Nlambda\n    disp(['i = ' num2str(i) ', lambda(i) = ' num2str(lambda(i))]);        \n    % Maximum likelihood estimate of R^{-1}\n    cvx_begin sdp quiet\n        variable S(n,n) symmetric\n        maximize log_det(S) - trace(S*Y) - lambda(i)*sum(sum(abs(S)))\n        S >= 0\n    cvx_end\n    nnz(i) = sum(S(:)>1e-4);\nend\n\nfigure; \nsemilogx(lambda, nnz); \nhold on; \nsemilogx(lambda, nnz_true*ones(1,Nlambda),'r');\nxlabel('\\lambda');\nlegend('nonzeros in S', 'nonzeros in R^{-1}');  \n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/log_exp/weighted_analytic_center.m",
    "content": "% Weighted analytic center of a set of linear inequalities\n% Joëlle Skaf - 04/29/08 \n%\n% The weighted analytic center of a set of linear inequalities:\n%           a_i^Tx <= b_i   i=1,...,m,\n% is the solution of the unconstrained minimization problem \n%           minimize    -sum_{i=1}^m w_i*log(b_i-a_i^Tx),\n% where w_i>0\n\n% Input data \nrandn('state', 0);\nrand('state', 0);\nn = 10;\nm = 50; \ntmp = randn(n,1);\nA = randn(m,n); \nb = A*tmp + 2*rand(m,1); \nw = rand(m,1);  \n\n% Analytic center \ncvx_begin\n    variable x(n)\n    minimize -sum(w.*log(b-A*x))\ncvx_end\n\ndisp('The weighted analytic center of the set of linear inequalities is: ');\ndisp(x);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/make.m",
    "content": "function make( varargin )\r\n\r\n%\r\n% Determine the base path\r\n%\r\n\r\nodir = pwd;\nbase = mfilename('fullpath');\nbase = fileparts( base );\r\n\r\n%\r\n% Check the force and runonly flags\r\n%\r\n\r\nargs = varargin;\r\nis_octave = exist( 'OCTAVE_VERSION', 'builtin' );\r\nif is_octave,\r\n    force = true;\r\n    runonly = true;\r\n    indexonly = false;\n    page_output_immediately(true);\nelse\n    temp = strcmp( args, '-force' );\r\n    force = any( temp );\r\n    if force, args(temp) = []; end\r\n    temp = strcmp( args, '-runonly' );\r\n    runonly = any( temp );\r\n    if runonly, args(temp) = []; end\r\n    temp = strcmp( args, '-indexonly' );\r\n    indexonly = any( temp );\r\n    if indexonly, args(temp) = []; end\n    if ~runonly,\r\n      close all;\n      fclose all;\n    end\nend\r\nif isempty( args ), \r\n    args = { base }; \r\nend\r\n\r\n%\r\n% Process the arguments\r\n%\r\n\r\nfor k = 1 : length( args ),\r\n    file = args{k};\r\n    if any( file == '*' ),\r\n        files = dir( file );\r\n        files = { files.name };\r\n    else\r\n        files = { file };\r\n    end\r\n    for j = 1 : length( files );\r\n\r\n        %\r\n        % Check the validity of the file or directory\r\n        %\r\n\r\n        file = files{j};\r\n        switch exist( file, 'file' ),\r\n            case 0,\r\n                error( 'Cannot find file or directory: %s', file );\r\n            case 2,\r\n                file = which( file );\r\n                if isempty( file ), \r\n                    file = files{j};\r\n                    if file(1) ~= filesep,\r\n                        file = [ base, filesep, file ];\r\n                    end\r\n                end\r\n                [ mpath, file, ext ] = fileparts( file );\r\n                file = [ file, ext ];\r\n                if ~strcmp( ext, '.m' ),\r\n                    error( 'Must be an m-file: %s' );\r\n                elseif strcmp( file, 'Contents.m' ) && length( files ) > 1,\r\n                    continue;\r\n                elseif strcmp( file, 'make.m' ) && strcmp( mpath, base ),\r\n                    continue;\r\n                end\r\n            case 7,\r\n                cd( file );\r\n                mpath = pwd;\r\n                cd( odir );\r\n                file = '';\r\n            otherwise,\r\n                error( 'Invalid file: %s', file );\r\n        end\r\n        if length( mpath ) < length( base ) || strncmpi( mpath, base, length( base ) ) == 0,\r\n            error( 'Not a valid a subdirectory of cvx/examples/: %s', mpath );\r\n        end\r\n\r\n        %\r\n        % Process the file or directory\r\n        %\r\n\r\n        if ~runonly && isempty( file ) && strcmp( mpath, base ),\r\n            [ fidr, message ] = fopen( 'index.html', 'r' );\r\n            if fidr < 0,\r\n                error( 'Cannot open index.html\\n   %s', message );\r\n            end\r\n            [ fidw, message ] = fopen( 'index.html.new', 'w+' );\r\n            if fidw < 0,\r\n                error( 'Cannot open index.html.new\\n   %s', message );\r\n            end\r\n            while ~feof( fidr ),\r\n                temp = fgetl( fidr );\r\n                fprintf( fidw, '%s\\n', temp );\r\n                if strcmp(temp,'<ul class=\"mktree\" id=\"tree1\">'),\r\n                    while ~feof( fidr ),\r\n                        temp = fgetl( fidr );\r\n                        if strcmp(temp,'</ul>'), break; end\r\n                    end\r\n                    break;\r\n                end\r\n            end\r\n        else\r\n            fidw = -1;\r\n        end\r\n        if isempty( file ),\r\n            generate_directory( mpath, '', force, runonly, indexonly, fidw, base, 0, is_octave );\r\n        else\r\n            cd( mpath );\r\n            generate_file( file, '', force, runonly, indexonly, is_octave );\r\n        end\r\n        cd( odir );\r\n        if fidw >= 0,\r\n            fprintf( fidw, '</ul>\\n' );\r\n            while ~feof( fidr ),\r\n                fprintf( fidw, '%s\\n', fgetl( fidr ) );\r\n            end\r\n            fclose( fidr );\r\n            fclose( fidw );\r\n            cd( mpath )\r\n            compare_and_replace( '', 'index.html' );\r\n        end\r\n    end\r\nend\r\n\r\nfunction [ title, files ] = generate_directory( mpath, prefix, force, runonly, indexonly, fidc, base, depth, is_octave )\r\n\r\nfprintf( 1, '%sDirectory: %s\\n', prefix, mpath );\r\nprefix = [ prefix, '   ' ];\r\ncd( mpath );\r\nmpath = pwd;\r\n\r\n%\r\n% Open Contents.m file and retrieve title and comments\r\n%\r\n\r\ntitle = '';\r\nif ~runonly,\r\n    comments = {};\r\n    fcomments = {};\r\n    [ fidr, message ] = fopen( 'Contents.m', 'r' );\r\n    if fidr >= 0,\r\n        temp = fgetl( fidr );\r\n        if length( temp ) > 2 && temp( 1 ) == '%' && temp( 2 ) == ' ' && temp( 3 ) ~= ' ',\r\n            title = temp( min( find( temp ~= '%' & temp ~= ' ' ) ) : end );\r\n            while ~feof( fidr ),\r\n                temp = fgetl( fidr );\r\n                if isempty(temp) || temp( 1 ) ~= '%' || ~any( temp ~= '%' & temp ~= ' ' ), break; end\r\n                temp = temp( min( find( temp ~= '%' & temp ~= ' ' ) ) : end );\r\n                if strcmp(title(end-2:end),'...'),\r\n                    title = [ title(1:end-3), temp ];\r\n                else\r\n                    if ~isempty(fcomments) && strcmp( fcomments{end}(end-2:end),'...' ),\r\n                        fcomments{end} = [ fcomments{end}(1:end-3), temp ];\r\n                    else\r\n                        fcomments{end+1} = temp;\r\n                    end\r\n                    comments{end+1} = temp;\r\n                end\r\n            end\r\n        end\r\n        fclose( fidr );\r\n    elseif ~isempty( dir( 'Contents.m' ) ),\r\n        error( 'Cannot open Contents.m for reading\\n   %s', message );\r\n    end\r\nend\r\nif isempty(title),\r\n    title = '(no title)';\r\nend\r\n\r\n%\r\n% Read the entries, and process the scripts and functions\r\n%\r\n\r\ndd = dir;\r\nmlen = 0;\r\nfiles = struct( 'name', {}, 'title', {}, 'type', {} );\r\nfor k = 1 : length( dd ),\r\n    name = dd(k).name;\r\n    if dd(k).isdir,\r\n        if name(1) == '.' || strcmp( name, 'eqs' ) || strcmp( name, 'html' ), continue; end\r\n        name(end+1) = '/';\r\n        files( end + 1 ) = struct( 'name', name, 'title', '', 'type', 'dir' );\r\n    elseif length( name ) > 2,\r\n        ndx = max(find(name=='.'));\r\n        if isempty( ndx ), continue; end\r\n        switch name(ndx+1:end),\r\n            case 'm',\r\n                if strcmp( name, 'Contents.m' ) || strcmp( name, 'make.m' ) || name(end-2) == '_', continue; end\r\n                [ temp, isfunc ] = generate_file( name, prefix, force, runonly, indexonly, is_octave );\r\n                if isfunc, type = 'func'; else type = 'script'; end\r\n                files( end + 1 ) = struct( 'name', name, 'title', temp, 'type', type );\r\n            case 'tex',\r\n                temp = generate_doc( name, prefix, force );\r\n                files( end + 1 ) = struct( 'name', name, 'title', temp, 'type', 'tex' );\r\n            case { 'pdf', 'ps' },\r\n                if any( strcmp( { dd.name }, [name(1:ndx+1),'tex'] ) ), continue; end\r\n                files( end + 1 ) = struct( 'name', name, 'title', '', 'type', 'doc' );\r\n            case { 'dat', 'mat', 'txt' },\r\n                if strcmp( name, 'index.dat' ), continue; end\r\n                files( end + 1 ) = struct( 'name', name, 'title', '', 'type', 'dat' );\r\n            otherwise,\r\n                continue;\r\n        end\r\n    end\r\n    mlen = max( mlen, length(name) );\r\nend\r\n\r\n%\r\n% Sort the files\r\n%\r\n\r\nif ~isempty( files ),\r\n    [ fnames, ndxs ] = sort( { files.title } );\r\n    files = files(ndxs);\r\n    ftypes = { files.type };\r\n    tdir  = strcmp( ftypes, 'dir' );\r\n    tfun  = strcmp( ftypes, 'func' );\r\n    tdoc  = strcmp( ftypes, 'doc' ) | strcmp( ftypes, 'tex' );\r\n    tdat  = strcmp( ftypes, 'dat' );\r\n    tscr  = ~( tdir | tfun | tdoc | tdat );\r\n    t1    = strncmp( fnames, 'Exercise', 8 ) & tscr;\r\n    t2    = strncmp( fnames, 'Example',  7 ) & tscr;\r\n    t3    = strncmp( fnames, 'Section',  7 ) & tscr;\r\n    t4    = strncmp( fnames, 'Figure',   6 ) & tscr;\r\n    t5    = ~( t1 | t2 | t3 | t4 ) & tscr;\r\n    tdir  = find(tdir(:));\r\n    tscr  = [ find(t3(:)); find(t4(:)); find(t2(:)); find(t5(:)); find(t1(:)); ];\r\n    tfun  = find(tfun(:));\r\n    tdoc  = find(tdoc(:));\r\n    tdat  = find(tdat(:));\r\n    files = files( [ tdoc ; tdir ; tscr ; tfun ; tdat ] );\r\n    tdoc  = [ 1, length(tdoc) ];\r\n    tdir  = tdoc(end) + [ 1, length(tdir) ];\r\n    tscr  = tdir(end) + [ 1, length(tscr) ];\r\n    tfun  = tscr(end) + [ 1, length(tfun) ];\r\n    tdat  = tfun(end) + [ 1, length(tdat) ];\r\nend\r\n\r\n%\r\n% Fill out the index.jemdoc file\r\n%\r\n\r\nif fidc >= 0,\r\n    \r\n    dots = sprintf('\\t');\r\n    dots = dots(ones(1,depth+1));\r\n    dpath = mpath( length(base) + 2 : end );\r\n    dpath(dpath=='\\') = '/';\r\n    if ~isempty(dpath), dpath(end+1) = '/'; end\r\n    \r\n    % Directory title---skip for the top level\r\n    \r\n    if depth,\r\n        title = regexprep(title,'</?b>','');\r\n        title = regexprep(title,' target=\"_blank\"','');\r\n        title2 = regexprep(title,'<a ([^>]*>)','</b><a target=\"_blank\" $1<b>');\r\n        title2 = regexprep(title2,'</a>','</b></a><b>');\r\n        title2 = regexprep(['<b>',title2,'</b>'],'<b></b>','');\r\n        fprintf( fidc, '%s<li>%s<ul>\\n', dots(1:end-1), title2 );\r\n    end\r\n    \r\n    if tdoc(2) >= tdoc(1) || ~isempty( fcomments ),\r\n        for k = tdoc(1) : tdoc(2),\r\n            name = files( k ).name;\r\n            if strcmp( files(k).type, 'tex' ),\r\n                name = [ name(1:end-4), 'pdf' ];\r\n            end\r\n            temp = files( k ).title;\r\n            if isempty( temp ),\r\n                fprintf( fidc, '%s<li>Reference: <a href=\"%s%s\" target=\"_blank\">%s</a></li>\\n', dots, dpath, name, name );\r\n            else\r\n                fprintf( fidc, '%s<li>Reference: <a href=\"%s%s\" target=\"_blank\">%s (%s)</a></li>\\n', dots, dpath, name, temp, name );\r\n            end\r\n        end\r\n        for k = 1 : length(fcomments),\r\n            fprintf( fidc, '%s<li>Reference: %s</li>\\n', dots, regexprep(fcomments{k},'<a href=','<a target=\"_blank\" href='));\r\n        end\r\n    end\r\n\r\n    for k = tdir(1) : tdir(2),\r\n        files(k).title = generate_directory( files(k).name(1:end-1), prefix, force, runonly, indexonly, fidc, base, depth+1, is_octave );\r\n        cd(mpath);\r\n    end\r\n    \r\n    if tscr(2) >= tscr(1),\r\n        if ~depth,\r\n            fprintf( fidc, '%s<li><b>Miscellaneous examples</b>\\n', dots );\r\n            dots(end+1) = dots(end);\r\n            fprintf( fidc, '%s<ul>\\n', dots );\r\n        end\r\n        for k = tscr(1) : tscr(2),\r\n            name = files( k ).name;\r\n            temp = files( k ).title;\r\n            if isempty( temp ),\r\n                fprintf( fidc, '%s<li><a href=\"%s%s\">%s</a></li>\\n', dots, dpath, name, name );\r\n            else\r\n                fprintf( fidc, '%s<li><a href=\"%shtml/%shtml\">%s</a> (<a href=\"%s%s\">%s</a>)</li>\\n', dots, dpath, name(1:end-1), temp, dpath, name, name );\r\n            end\r\n        end\r\n        if ~depth,\r\n            fprintf( fidc, '%s</ul>\\n', dots );\r\n            dots(end) = [];\r\n            fprintf( fidc, '%s</li>\\n', dots );\r\n        end\r\n    end\r\n\r\n    if tfun(2) >= tfun(1),\r\n        pref = 'Utility: ';\r\n        for k = tfun(1) : tfun(2),\r\n            name = files( k ).name;\r\n            temp = files( k ).title;\r\n            if isempty( temp ),\r\n                fprintf( fidc, '%s<li>Utility: <a href=\"%s%s\">%s</a></li>\\n', dots, dpath, name, name );\r\n            else\r\n                fprintf( fidc, '%s<li>Utility: <a href=\"%shtml/%shtml\">%s</a> (<a href=\"%s%s\">%s</a>)</li>\\n', dots, dpath, name(1:end-1), temp, dpath, name, name );\r\n            end\r\n        end\r\n    end\r\n    \r\n    if tdat(2) >= tdat(1),\r\n        pref = '- Data: ';\r\n        for k = tdat(1) : tdat(2),\r\n            name = files( k ).name;\r\n            temp = files( k ).title;\r\n            if isempty( temp ),\r\n                fprintf( fidc, '%s<li>Data: <a href=\"%s%s\">%s</a></li>\\n', dots, dpath, name, name );\r\n            else\r\n                fprintf( fidc, '%s<li>Data: <a href=\"%s%s\">%s (%s)</a></li>\\n', dots, dpath, name, temp, name );\r\n            end\r\n        end\r\n    end\r\n    \r\n    if depth, \r\n        fprintf( fidc, '%s</ul></li>\\n', dots(1:end-1) );\r\n    end\r\n        \r\nelseif any( tdir ),\r\n    \r\n    for k = 1 : length( files ),\r\n        if strcmp( files(k).type, 'dir' ),\r\n            files(k).title = generate_directory( files(k).name(1:end-1), prefix, force, runonly, indexonly, fidc, base, depth+1, is_octave );\r\n            cd(mpath);\r\n        end\r\n    end\r\n\r\nend\r\n        \r\n\r\n%\r\n% Create Contents.m.new\r\n%\r\n\r\nif ~runonly,\r\n    [ fidw, message ] = fopen( 'Contents.m.new', 'w+' );\r\n    if fidw < 0,\r\n        if fidr >= 0, fclose( fidr ); end\r\n        error( 'Cannot open Contents.m.new\\n   %s', message );\r\n    elseif ~isempty( title ),\r\n        fprintf( fidw, '%% %s\\n', title );\r\n        for k = 1 : length( comments ),\r\n            fprintf( fidw, '%% %s\\n', comments{k} );\r\n        end\r\n        fprintf( fidw, '%%\\n' );\r\n    end\r\n    for k = 1 : length( files ),\r\n        tfile = files(k);\r\n        tfile.name(end+1:mlen) = ' ';\r\n        if isempty( tfile.title ),\r\n            fprintf( fidw, '%%  %s - (no title)\\n', tfile.name );\r\n        else\r\n            fprintf( fidw, '%%  %s - %s\\n', tfile.name, tfile.title );\r\n        end\r\n    end\r\n    fprintf( fidw, 'help Contents\\n' );\r\n    fclose( fidw );\r\nelse\r\n    fidw = -1;\r\nend\r\n\r\n%\r\n% Compare Contents.m and Contents.m.new and update if necessary\r\n%\r\n\r\ncd( mpath )\r\nif fidw >= 0,\r\n    compare_and_replace( prefix, 'Contents.m' );\r\nend\r\n\r\nfunction [ title, isfunc ] = generate_file( name, prefix, force, runonly, indexonly, is_octave )\r\n\r\nif length( name ) < 2 || ~strcmp( name(end-1:end), '.m' ),\r\n    error( 'Not an m-file.' );\r\nelseif strcmp( name, 'Contents.m' ),\r\n    error( 'To generate the Contents.m file, you must run this function on the entire directory.' );\r\nelse\r\n    fprintf( 1, '%s%s: ', prefix, name );\r\nend\r\n\r\ndd = dir( name );\r\nndate = date_convert( dd.date );\r\n[ fidr, message ] = fopen( name, 'r' );\r\nif fidr < 0,\r\n    error( 'Cannot open the source file\\n   %s', message );\r\nend\r\ntitle = '';\r\nisfunc = false;\r\nlasttitle = false;\r\nfounddata = false;\r\nprefixes = {};\r\nwhile ~feof( fidr ) && ( ~founddata || isempty( title ) || lasttitle ),\r\n    temp1 = fgetl( fidr );\r\n    if isempty( temp1 ),\r\n        if lasttitle, continue; end\r\n    else\r\n        temp2 = find( temp1 ~= ' ' );\r\n        if isempty( temp2 ),\r\n            if lasttitle, continue; end\r\n        elseif temp1(temp2(1)) == '%',\r\n            temp2 = temp1(temp2(1):temp2(end));\r\n            temp3 = find( temp2 ~= '%' );\r\n            if isempty( temp3 ),\r\n                if lasttitle, continue; end\r\n            else\r\n                temp3 = temp2( temp3(1) : end );\r\n                temp4 = find( temp3 ~= ' ' );\r\n                if isempty( temp4 ),\r\n                    if lasttitle, continue; end\r\n                elseif isempty( title ),\r\n                    title = temp3(temp4(1):temp4(end));\r\n                    lasttitle = true;\r\n                    continue;\r\n                else\r\n                    lasttitle = false;\r\n                end\r\n            end\r\n        else\r\n            lasttitle = false;\r\n            founddata = true;\r\n            temp2 = temp1(temp2(1):temp2(end));\r\n            if strncmp( temp2, 'function', 8 ) && ( length( temp2 ) == 8 || ~isvarname( temp2( 1 : 9 ) ) ),\r\n                isfunc = true;\r\n            end\r\n        end\r\n    end\r\n    prefixes{end+1} = temp1;\r\nend\r\nif runonly,\r\n    fclose( fidr );\r\n    if isfunc, return; end\r\nend\r\nhfile = [ name(1:end-1), 'html' ];\r\nodir = pwd;\r\nhdir = 'html';\r\nhdate = 0;\r\nif exist( hdir, 'dir' ),\r\n    cd( hdir );\r\n    df = dir( hfile );\r\n    if length( df ) == 1,\r\n        hdate = date_convert( df.date );\r\n    end\r\n    cd( odir );\r\nend\r\nif indexonly,\r\n    fprintf( 1, 'done.\\n' );\r\nelseif force || hdate <= ndate,\r\n    if runonly,\r\n        fprintf( 1, 'running %s ...', name );\r\n    elseif hdate == 0,\r\n        fprintf( 1, 'creating %s ...', hfile );\r\n    else\r\n        fprintf( 1, 'updating %s ...', hfile );\r\n    end\r\n    name = name(1:end-2);\r\n    if ~runonly,\r\n        [ fidw, message ] = fopen( [ name, '_.m' ], 'w+' );\r\n        if fidw < 0,\r\n            error( 'Cannot open the temporary file\\n   %s', message );\r\n        end\r\n        if isempty( title ),\r\n            fprintf( fidw, '%%%% %s\\n\\n', name );\r\n        else\r\n            fprintf( fidw, '%%%% %s\\n\\n', title );\r\n        end\r\n        fprintf( fidw, '%s\\n', prefixes{:} );\r\n        fwrite( fidw, fread( fidr, Inf, 'uint8' ), 'uint8' );\r\n        fclose( fidw );\r\n        fclose( fidr );\r\n    end\r\n    evalin( 'base', 'clear' );\r\n    cvx_clear;\r\n    cvx_quiet( false );\r\n    cvx_precision default;\r\n    success = true;\r\n    try\r\n        out___ = [];\n        if is_octave,\n            run_clean_octave( name );\r\n        elseif runonly,\r\n            out___ = run_clean( name );\r\n            fprintf( 1, ' done.\\n' );\r\n        else\r\n            opts.format = 'html';\r\n            opts.useNewFigure = false;\r\n            opts.createThumbnail =  false;\r\n            opts.evalCode = ~isfunc;\r\n            opts.showCode = true;\r\n            opts.catchError = false;\r\n            publish( [ name, '_' ], opts );\r\n            prefixes = { '<style', '<!--', '<p class=\"footer\"', '<meta name=', '<link rel=' };\r\n            suffixes = { '</style>', '-->', '</p>', '>', '>' };\r\n            suffix = '';\r\n            f_in = fopen( [ 'html', filesep, name, '_.html' ], 'r' );\r\n            data = fread( f_in, Inf, 'uint8=>char' )';\r\n            fclose( f_in );\r\n            backpath = '';\r\n            for k = 1 : 10,\r\n                if exist( [ backpath, filesep, 'examples.css' ], 'file' ), break; end\r\n                backpath = [ '..', filesep, backpath ];\r\n            end\r\n            backpath = [ '..', filesep, backpath ];\r\n            canon = [regexprep(pwd,'.*/cvx/examples','http://cvxr.com/cvx/examples'),'/html/',hfile];\r\n            data = regexprep( data, '<!--.*?-->|<link rel=.*?>|<style.*?</style>|<meta name=.*?>|<p class=\"footer\".*?</p>', '' );\r\n            data = regexprep( data, '</head>', sprintf( '\\n<link rel=\"canonical\" href=\"%s\"/>\\n<link rel=\"stylesheet\" href=\"%sexamples.css\" type=\"text/css\"/>\\n</head>', canon, backpath ) );\r\n            data = regexprep( data, '<div class=\"content\"><h1>(.*?)</h1>','<div id=\"header\">\\n<h1>$1</h1>\\n<!--control--></div><div id=\"content\">' );\r\n            data = regexprep( data, '<pre class=\"codeinput\">\\n?', '\\n<a id=\"source\"></a><pre class=\"codeinput\">\\n' );\r\n            if ~isempty( regexp( data, '<pre class=\"codeoutput\">' ) ),\r\n                control_o = '<a href=\"#output\">Text output</a>\\n';\r\n                data = regexprep( data, '<pre class=\"codeoutput\">\\n?', '\\n<a id=\"output\"></a><pre class=\"codeoutput\">\\n' );\r\n            else\r\n                control_o = 'Text output\\n';\r\n            end\r\n            if ~isempty( regexp( data, '</pre>\\s*<img', 'once' ) ),\r\n                control_p = '<a href=\"#plots\">Plots</a>\\n';\r\n                data = regexprep( data, '</pre>\\s*<img', '</pre>\\n<a id=\"plots\"></a><div id=\"plotoutput\">\\n<img' );\r\n                data = regexprep( data, '</div>\\s*</body>', '</div></div></body>' );\r\n            else\r\n                control_p = 'Plots\\n';\r\n            end\r\n            control = sprintf( 'Jump to:&nbsp;&nbsp;&nbsp;&nbsp;\\n<a href=\"#source\">Source code</a>&nbsp;&nbsp;&nbsp;&nbsp;\\n%s&nbsp;&nbsp;&nbsp;&nbsp;\\n%s&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"%sindex.html\">Library index</a>', control_o, control_p, backpath );\r\n            data = regexprep( data, '<!--control-->', control );\r\n            data = regexprep( data, '<html>', '<html>\\n' );\r\n            data = regexprep( data, '(<div|<pre|</div>|<body>|</body>|</html>)', '\\n$1' );\r\n            data = regexprep( data, '^\\s*<!DOCTYPE.*?>','<!DOCTYPE HTML>' );\r\n            data = regexprep( data, '<meta http-equiv.*?>', '<meta charset=\"UTF-8\">' );\r\n            data = regexprep( data, '\\s*((v|h)space=\\S*)', '' );\r\n            data = regexprep( data, '\\s*(<meta|<title)','\\n$1' );\r\n            data = regexprep( data, '/>', '>' );\r\n            f_out = fopen( [ 'html', filesep, name, '.html' ], 'w' );\r\n            fwrite( f_out, data );\r\n            fclose( f_out );\r\n            delete( [ 'html', filesep, name, '_.html' ] );\r\n            fprintf( 1, ' done.\\n' );\r\n        end\r\n    catch\r\n        err = lasterror;\r\n        fprintf( 1, ' aborted.\\n' );\r\n        cd( odir );\r\n        fprintf( 1, '===> ERROR: %s\\n', err.message );\r\n        success = false;\r\n    end\r\n    if runonly,\r\n        disp( out___ );\r\n    else\r\n        delete( [ name, '_.m' ] );\r\n    end\r\n    cd( odir );\r\n    if ~success && ~runonly && exist( hdir, 'dir' ),\r\n        cd( hdir );\r\n        df = dir( hfile );\r\n        if length( df ) == 1,\r\n            delete( hfile );\r\n        end\r\n        cd( odir );\r\n    end\r\n    close all\r\nelse\r\n    fprintf( 1, 'up to date.\\n' );\r\nend\r\n\r\nfunction title = generate_doc( name, prefix, force )\r\n\r\nif length( name ) < 5 || ~strcmp( name(end-3:end), '.tex' ),\r\n    error( 'Not an valid TeX file.' );\r\nelse\r\n    fprintf( 1, '%s%s: ', prefix, name );\r\nend\r\n\r\ndd = dir( name );\r\nndate = date_convert( dd.date );\r\n[ fidr, message ] = fopen( name, 'r' );\r\nif fidr < 0,\r\n    error( 'Cannot open the source file\\n   %s', message );\r\nend\r\ntitle = '';\r\nwhile ~feof( fidr ),\r\n    temp = strtrim( fgetl( fidr ) );\r\n    kndx = strfind( temp, '\\title{' );\r\n    if isempty( kndx ), continue; end\r\n    knd2 = strfind( temp(kndx(1):end), '}' );\r\n    if isempty( knd2 ), continue; end\r\n    title = strtrim(temp(kndx(1)+7:kndx(1)+kndx(2)-2));\r\n    break;\r\nend\r\npdffile = [ name(1:end-3), 'pdf' ];\r\nhdate = 0;\r\ndf = dir( pdffile );\r\nif length( df ) == 1,\r\n    hdate = date_convert( df.date );\r\nend\r\nif force || hdate < ndate,\r\n    if hdate == 0,\r\n        fprintf( 1, 'creating %s:', hfile );\r\n    else\r\n        fprintf( 1, 'updating %s:', hfile );\r\n    end\r\n    name2 = name(1:end-4);\r\n    eval( sprintf( '!latex %s', name2 ) );\r\n    eval( sprintf( '!latex %s', name2 ) );\r\n    eval( sprintf( '!bibtex %s', name2 ) );\r\n    eval( sprintf( '!latex %s', name2 ) );\r\n    eval( sprintf( '!latex %s', name2 ) );\r\n    eval( sprintf( '!latex %s', name2 ) );\r\n    eval( sprintf( '!dvips %s', name2 ) );\r\n    eval( sprintf( '!ps2pdf %s.ps', name2 ) );\r\nend\r\n\r\nfunction dnum = date_convert( dstr )\r\npersistent mstrs\r\nif isempty( mstrs ),\r\n    mstrs = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' };\r\nend\r\n% DD-MMM-YY HH:MM:SS\r\nS = sscanf( dstr, '%d-%3s-%d %d:%d:%d' );\r\nS = [ S(5), find(strcmp(char(S(2:4)'),mstrs)), S(1), S(6), S(7), S(8) ];\r\ndnum = S(6) + 100 * ( S(5) + 100 * ( S(4) + 100 * ( S(3) + 100 * ( S(2) + 100 * S(1) ) ) ) );\r\n\r\nfunction compare_and_replace( prefix, oldname )\r\n\r\nnames = { oldname, [ oldname, '.new' ] };\r\nfprintf( 1, '%s%s ... ', prefix, oldname );\r\nfids = [];\r\nc = {};\r\nfor k = 1 : 2,\r\n    [ fids(k), message ] = fopen( names{k}, 'r' );\r\n    if fids(k) < 0 && ~isempty( dir( names{k} ) ),\r\n        error( 'Cannot open file %s for reading:\\n   %s', names{k}, message );\r\n    end\r\n    c{k} = fread( fids(k), Inf, 'uint8' );\r\n    fclose( fids(k) );\r\nend\r\nif isempty( c{2} ),\r\n    if fids(k) >= 0,\r\n        fprintf( 1, ' removed.\\n' );\r\n        delete( oldname );\r\n    end\r\n    delete( names{2} );\r\nelseif length( c{1} ) ~= length( c{2} ) || any( c{1} ~= c{2} ),\r\n    [ success, message ] = movefile( names{2}, names{1}, 'f' );\r\n    if ~success,\r\n        error( 'Cannot move %s into place\\n   %s', names{2}, message );\r\n        delete( names{2} )\r\n    end\r\n    if ~isempty( c{1} ),\r\n        fprintf( 1, ' updated.\\n' );\r\n    else\r\n        fprintf( 1, ' created.\\n' );\r\n    end\r\nelse\r\n    delete( names{2} )\r\n    fprintf( 1, ' up to date.\\n' );\r\nend\n\nfunction run_clean_octave( name )\nfeval( name );\r\n\r\nfunction out___ = run_clean( name )\r\nout___ = evalc( name );\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/min_phase_spectral_fact.m",
    "content": "% Minimal phase spectral factorization\n%\n% A PSD matrix is found which minimizes a weighted trace while obtaining\n% fixed sums along the diagonals. Notice the use of a FOR loop to access\n% the diagonals of X. A later version of CVX will eliminate the need for\n% this by allowing the use of the SPDIAGS function in side models.\n% Nevertheless, this example provides an illustration of the use of\n% standard Matlab control statements to build models.\n%\n% Adapted from an example provided in the SeDuMi documentation.\n\n% Generate data\nb = [2; 0.2; -0.3];\nn = length( b );\n\n% Create and solve model\ncvx_begin sdp\n    variable X( n, n ) symmetric\n    dual variable y{n}\n    dual variable Z\n    minimize( ( n - 1 : -1 : 0 ) * diag( X ) );\n    for k = 1 : n,\n        sum( diag( X, k - 1 ) ) == b( k ) : y{k};\n    end\n    X >= 0 : Z;\ncvx_end\ny = [ y{:} ]';\n\n% Display resuls\ndisp( 'The optimal point, X:' );\ndisp( X )\ndisp( 'The diagonal sums:' );\ndisp( sum( spdiags( X, 0:n-1 ), 1 ) );\ndisp( 'min( eig( X ) ) (should be nonnegative):' );\ndisp( min( eig( X ) ) )\ndisp( 'The optimal weighted trace:' );\ndisp( ( n - 1 : -1 : 0 ) * diag( X ) );\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/nonneg_matrix_fact.m",
    "content": "% Nonnegative matrix factorization\r\n% Argyris Zymnis, Joelle Skaf, Stephen Boyd\r\n%\r\n% We are given a matrix A in R^{m*n}\r\n% and are interested in solving the problem:\r\n%\r\n% minimize    ||A - Y*X||_F\r\n% subject to  Y >= 0, X >= 0\r\n%\r\n% where Y in R{m*k} and X in R{k*n}.\r\n% This script generates a random matrix A and obtains an\r\n% *approximate* solution to the above problem by first generating\r\n% a random initial guess for Y and the alternatively minimizing\r\n% over X and Y for a fixed number of iterations.\r\n\r\n% Generate data matrix A\r\nrstate = rand('state');\r\nm = 10; n = 10; k = 5;\r\nA = rand(m,k)*rand(k,n);\r\n\r\n% Initialize Y randomly\r\nY = rand(m,k);\r\n\r\n% Perform alternating minimization\r\nMAX_ITERS = 30;\r\nresidual = zeros(1,MAX_ITERS);\r\nfor iter = 1:MAX_ITERS\r\n    cvx_begin quiet\r\n        if mod(iter,2) == 1\r\n            variable X(k,n)\r\n            X >= 0; \r\n        else\r\n            variable Y(m,k)\r\n            Y >= 0;\r\n        end\r\n        minimize(norm(A - Y*X,'fro'));\r\n    cvx_end\r\n    fprintf(1,'Iteration %d, residual norm %g\\n',iter,cvx_optval);\r\n    residual(iter) = cvx_optval;\r\nend\r\n\r\n% Plot residuals\r\nplot(residual); \r\nxlabel('Iteration Number');\r\nylabel('Residual Norm');\r\n\r\n% Display results\r\ndisp( 'Original matrix:' );\r\ndisp( A );\r\ndisp( 'Left factor Y:' );\r\ndisp( Y );\r\ndisp( 'Right factor X:' );\r\ndisp( X );\r\ndisp( 'Residual A - Y * X:' );\r\ndisp( A - Y * X );\r\nfprintf( 'Residual after %d iterations: %g\\n', iter, cvx_optval );\r\n\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/quickstart.m",
    "content": "% Examples from the CVX Users' guide\n\nhas_quadprog = exist( 'quadprog' );\nhas_quadprog = has_quadprog == 2 | has_quadprog == 3;\nhas_linprog  = exist( 'linprog' );\nhas_linprog  = has_linprog == 2 | has_linprog == 3;\nrnstate = randn( 'state' ); randn( 'state', 1 );\ns_quiet = cvx_quiet(true);\ns_pause = cvx_pause(false);\ncvx_clear; echo on\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% SECTION 2.1: LEAST SQUARES %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n% Input data\nm = 16; n = 8;\nA = randn(m,n);\nb = randn(m,1);\n\n% Matlab version\nx_ls = A \\ b;\n\n% cvx version\ncvx_begin\n    variable x(n)\n    minimize( norm(A*x-b) )\ncvx_end\n\necho off\n\n% Compare\ndisp( sprintf( '\\nResults:\\n--------\\nnorm(A*x_ls-b): %6.4f\\nnorm(A*x-b):    %6.4f\\ncvx_optval:     %6.4f\\ncvx_status:     %s\\n', norm(A*x_ls-b), norm(A*x-b), cvx_optval, cvx_status ) );\ndisp( 'Verify that x_ls == x:' );\ndisp( [ '   x_ls  = [ ', sprintf( '%7.4f ', x_ls ), ']' ] );\ndisp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\ndisp( 'Residual vector:' );\ndisp( [ '   A*x-b = [ ', sprintf( '%7.4f ', A*x-b ), ']' ] );\ndisp( ' ' );\n\ntry input( 'Press Enter/Return for the next example...' ); clc; catch, end\necho on\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% SECTION 2.2: BOUND-CONSTRAINED LEAST SQUARES %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n% More input data\nbnds = randn(n,2);\nl = min( bnds, [] ,2 );\nu = max( bnds, [], 2 );\n\nif has_quadprog,\n    % Quadprog version\n    x_qp = quadprog( 2*A'*A, -2*A'*b, [], [], [], [], l, u );\nelse\n    % quadprog not present on this system.\nend\n\n% cvx version\ncvx_begin\n    variable x(n)\n    minimize( norm(A*x-b) )\n    subject to\n        l <= x <= u\ncvx_end\n\necho off\n\n% Compare\nif has_quadprog,\n    disp( sprintf( '\\nResults:\\n--------\\nnorm(A*x_qp-b): %6.4f\\nnorm(A*x-b):    %6.4f\\ncvx_optval:     %6.4f\\ncvx_status:     %s\\n', norm(A*x_qp-b), norm(A*x-b), cvx_optval, cvx_status ) );\n    disp( 'Verify that l <= x_qp == x <= u:' );\n    disp( [ '   l     = [ ', sprintf( '%7.4f ', l ), ']' ] );\n    disp( [ '   x_qp  = [ ', sprintf( '%7.4f ', x_qp ), ']' ] );\n    disp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\n    disp( [ '   u     = [ ', sprintf( '%7.4f ', u ), ']' ] );\nelse\n    disp( sprintf( '\\nResults:\\n--------\\nnorm(A*x-b): %6.4f\\ncvx_optval:  %6.4f\\ncvx_status:  %s\\n', norm(A*x-b), cvx_optval, cvx_status ) );\n    disp( 'Verify that l <= x <= u:' );\n    disp( [ '   l     = [ ', sprintf( '%7.4f ', l ), ']' ] );\n    disp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\n    disp( [ '   u     = [ ', sprintf( '%7.4f ', u ), ']' ] );\nend\ndisp( 'Residual vector:' );\ndisp( [ '   A*x-b = [ ', sprintf( '%7.4f ', A*x-b ), ']' ] );\ndisp( ' ' );\n\ntry input( 'Press Enter/Return for the next example...' ); clc; catch, end\necho on\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% SECTION 2.3: OTHER NORMS AND FUNCTIONS: INFINITY NORM %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nif has_linprog,\n    % linprog version\n    f    = [ zeros(n,1);  1          ];\n    Ane  = [ +A,          -ones(m,1) ; ...\n             -A,          -ones(m,1) ];\n    bne  = [ +b;          -b         ];\n    xt   = linprog(f,Ane,bne);\n    x_lp = xt(1:n,:);\nelse\n    % linprog not present on this system.\nend\n\n% cvx version\ncvx_begin\n    variable x(n)\n    minimize( norm(A*x-b,Inf) )\ncvx_end\n\necho off\n\n% Compare\nif has_linprog,\n    disp( sprintf( '\\nResults:\\n--------\\nnorm(A*x_lp-b,Inf): %6.4f\\nnorm(A*x-b,Inf):    %6.4f\\ncvx_optval:         %6.4f\\ncvx_status:         %s\\n', norm(A*x_lp-b,Inf), norm(A*x-b,Inf), cvx_optval, cvx_status ) );\n    disp( 'Verify that x_lp == x:' );\n    disp( [ '   x_lp  = [ ', sprintf( '%7.4f ', x_lp ), ']' ] );\n    disp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\nelse\n    disp( sprintf( '\\nResults:\\n--------\\nnorm(A*x-b,Inf): %6.4f\\ncvx_optval:      %6.4f\\ncvx_status:      %s\\n', norm(A*x-b,Inf), cvx_optval, cvx_status ) );\n    disp( 'Optimal vector:' );\n    disp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\nend\ndisp( sprintf( 'Residual vector; verify that the peaks match the objective (%6.4f):', cvx_optval ) );\ndisp( [ '   A*x-b = [ ', sprintf( '%7.4f ', A*x-b ), ']' ] );\ndisp( ' ' );\n\ntry input( 'Press Enter/Return for the next example...' ); clc; catch, end\necho on\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% SECTION 2.3: OTHER NORMS AND FUNCTIONS: ONE NORM %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nif has_linprog,\n    % Matlab version\n    f    = [ zeros(n,1); ones(m,1);  ones(m,1)  ];\n    Aeq  = [ A,          -eye(m),    +eye(m)    ];\n    lb   = [ -Inf*ones(n,1);  zeros(m,1); zeros(m,1) ];\n    xzz  = linprog(f,[],[], Aeq,b,lb,[]);\n    x_lp = xzz(1:n,:) - xzz(n+1:2*n,:);\nelse\n    % linprog not present on this system\nend\n\n% cvx version\ncvx_begin\n    variable x(n)\n    minimize( norm(A*x-b,1) )\ncvx_end\n\necho off\n\n% Compare\nif has_linprog,\n    disp( sprintf( '\\nResults:\\n--------\\nnorm(A*x_lp-b,1): %6.4f\\nnorm(A*x-b,1): %6.4f\\ncvx_optval: %6.4f\\ncvx_status: %s\\n', norm(A*x_lp-b,1), norm(A*x-b,1), cvx_optval, cvx_status ) );\n    disp( 'Verify that x_lp == x:' );\n    disp( [ '   x_lp  = [ ', sprintf( '%7.4f ', x_lp ), ']' ] );\n    disp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\nelse\n    disp( sprintf( '\\nResults:\\n--------\\nnorm(A*x-b,1): %6.4f\\ncvx_optval: %6.4f\\ncvx_status: %s\\n', norm(A*x-b,1), cvx_optval, cvx_status ) );\n    disp( 'Optimal vector:' );\n    disp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\nend\ndisp( 'Residual vector; verify the presence of several zero residuals:' );\ndisp( [ '   A*x-b = [ ', sprintf( '%7.4f ', A*x-b ), ']' ] );\ndisp( ' ' );\n\ntry input( 'Press Enter/Return for the next example...' ); clc; catch, end\necho on\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% SECTION 2.3: OTHER NORMS AND FUNCTIONS: LARGEST-K NORM %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n% cvx specification\nk = 5;\ncvx_begin\n    variable x(n)\n    minimize( norm_largest(A*x-b,k) )\ncvx_end\n\necho off\n\n% Compare\ntemp = sort(abs(A*x-b));\ndisp( sprintf( '\\nResults:\\n--------\\nnorm_largest(A*x-b,k): %6.4f\\ncvx_optval: %6.4f\\ncvx_status: %s\\n', norm_largest(A*x-b,k), cvx_optval, cvx_status ) );\ndisp( 'Optimal vector:' );\ndisp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\ndisp( sprintf( 'Residual vector; verify a tie for %d-th place (%7.4f):', k, temp(end-k+1) ) );\ndisp( [ '   A*x-b = [ ', sprintf( '%7.4f ', A*x-b ), ']' ] );\ndisp( ' ' );\n\ntry input( 'Press Enter/Return for the next example...' ); clc; catch, end\necho on\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% SECTION 2.3: OTHER NORMS AND FUNCTIONS: HUBER PENALTY %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n% cvx specification\ncvx_begin\n    variable x(n)\n    minimize( sum(huber(A*x-b)) )\ncvx_end\n\necho off\n\n% Compare\ndisp( sprintf( '\\nResults:\\n--------\\nsum(huber(A*x-b)): %6.4f\\ncvx_optval: %6.4f\\ncvx_status: %s\\n', sum(huber(A*x-b)), cvx_optval, cvx_status ) );\ndisp( 'Optimal vector:' );\ndisp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\ndisp( 'Residual vector:' );\ndisp( [ '   A*x-b = [ ', sprintf( '%7.4f ', A*x-b ), ']' ] );\ndisp( ' ' );\n\ntry input( 'Press Enter/Return for the next example...' ); clc; catch, end\necho on\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% SECTION 2.4: OTHER CONSTRAINTS %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n% More input data\np = 4;\nC = randn(p,n);\nd = randn(p,1);\n\n% cvx specification\ncvx_begin\n    variable x(n);\n    minimize( norm(A*x-b) )\n    subject to\n        C*x == d\n        norm(x,Inf) <= 1\ncvx_end\n\necho off\n\n% Compare\ndisp( sprintf( '\\nResults:\\n--------\\nnorm(A*x-b): %6.4f\\ncvx_optval: %6.4f\\ncvx_status: %s\\n', norm(A*x-b), cvx_optval, cvx_status ) );\ndisp( 'Optimal vector:' );\ndisp( [ '   x     = [ ', sprintf( '%7.4f ', x ), ']' ] );\ndisp( 'Residual vector:' );\ndisp( [ '   A*x-b = [ ', sprintf( '%7.4f ', A*x-b ), ']' ] );\ndisp( 'Equality constraints:' );\ndisp( [ '   C*x   = [ ', sprintf( '%7.4f ', C*x ), ']' ] );\ndisp( [ '   d     = [ ', sprintf( '%7.4f ', d   ), ']' ] );\n\ntry input( 'Press Enter/Return for the next example...' ); clc; catch, end\necho on\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% SECTION 2.5: AN OPTIMAL TRADEOFF CURVE %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n% The basic problem:\n% cvx_begin\n%     variable x(n)\n%     minimize( norm(A*x-b)+gamma(k)*norm(x,1) )\n% cvx_end\n\necho off\ndisp( ' ' );\ndisp( 'Generating tradeoff curve...' );\ncvx_pause(false);\ngamma = logspace( -2, 2, 20 );\nl2norm = zeros(size(gamma));\nl1norm = zeros(size(gamma));\nfprintf( 1, '   gamma       norm(x,1)    norm(A*x-b)\\n' );\nfprintf( 1, '---------------------------------------\\n' );\nfor k = 1:length(gamma),\n    fprintf( 1, '%8.4e', gamma(k) );\n    cvx_begin\n        variable x(n)\n        minimize( norm(A*x-b)+gamma(k)*norm(x,1) )\n    cvx_end\n    l1norm(k) = norm(x,1);\n    l2norm(k) = norm(A*x-b);\n    fprintf( 1, '   %8.4e   %8.4e\\n', l1norm(k), l2norm(k) );\nend\nplot( l1norm, l2norm );\nxlabel( 'norm(x,1)' );\nylabel( 'norm(A*x-b)' );\ngrid\ndisp( 'Done. (Check out the graph!)' );\nrandn( 'state', rnstate );\ncvx_quiet(s_quiet);\ncvx_pause(s_pause);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/regularized_norm_tradeoff.m",
    "content": "% Builds a norm minimization tradeoff curve\n%\n% This script solves a family of problems of the form\n%     minimize || A*x-b ||_1 + gamma * || x ||_Inf\n% for varying values of gamma. For gamma = 0, this is simply an\n% unconstrained norm minimization; for gamma = Inf, x = 0 and\n% || A x - b || = || b || are optimal. Varying gamma allows us\n% to genreate a tradeoff curve between these extremes.\n\nn = 10;\nA = randn(2*n,n);\nb = randn(2*n,1);\ngamma = logspace( -1, 3 );\nnrms = zeros( size( gamma ) );\nxnrms = zeros( size( gamma ) );\nfprintf( 1, 'Gamma: ' );\nfor k = 1 : length( gamma ),\n   if k > 1 && rem( k, 10 ) == 1, fprintf( 1, '\\n       ' ); end\n   fprintf( 1, '%g ', gamma( k ) );\n   cvx_begin quiet\n      variable x(n)\n      minimize( norm( A * x - b, 1 ) + gamma( k ) * norm( x, Inf ) )\n   cvx_end\n   nrms( k ) = norm( A * x - b, 1 );\n   xnrms( k ) = norm( x, Inf );\nend\nfprintf( 1, 'done.\\n' );\nfigure\nsemilogx( gamma, nrms );\nxlabel( '\\gamma' );\nylabel( '|| A * x - b ||_1' );\nfigure\nplot( xnrms, nrms );\nxlabel( '|| x ||_{\\infty}' );\nylabel( '|| A * x - b ||_1' );\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/simple_LP.m",
    "content": "% Builds and solves a simple linear program\n\necho on\n\nn = 100;\nA = randn(0.5*n,n);\nb = randn(0.5*n,1);\nc = randn(n,1);\nd = randn;\ncvx_begin\n   variable x(n)\n   dual variables y z\n   minimize( c' * x + d )\n   subject to\n      y : A * x == b;\n      z : x >= 0;\ncvx_end\n\necho off\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/simple_LP2.m",
    "content": "% Builds and solves a simple inequality-constrained linear program\n\necho on\n\nn = 10;\nA = randn(2*n,n);\nb = randn(2*n,1);\nc = randn(n,1);\nd = randn;\ncvx_begin\n   variable x(n)\n   dual variables y z\n   minimize( c' * x + d )\n   subject to\n      y : A * x <= b;\ncvx_end\n\necho off\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/simple_LS.m",
    "content": "% Builds and solves a simple least-squares problem using cvx\n\necho on\n\nn = 100;\nA = randn(2*n,n);\nb = randn(2*n,1);\ncvx_begin\n   variable x(n)\n   minimize( norm( A*x-b ) )\ncvx_end\n\necho off\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/sparse_heuristics/Contents.m",
    "content": "% Sparse solution heuristics\n%\n%  sparse_solution.m    - Computing a sparse solution of a set of linear inequalities\n%  sparse_infeas_dual.m - Detecting a small subset of infeasible linear inequalities\n%  sparse_infeas.m      - Finding a point that satisfies many linear inequalities\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/sparse_heuristics/sparse_infeas.m",
    "content": "% Finding a point that satisfies many linear inequalities\n% Section 11.4.1, Boyd & Vandenberghe \"Convex Optimization\"\n% Written for CVX by Almir Mutapcic - 02/18/06\n%\n% We consider a set of linear inequalities A*x <= b which are\n% infeasible. Here A is a matrix in R^(m-by-n) and b belongs\n% to R^m. We apply a heuristic to find a point x that violates\n% only a small number of inequalities.\n%\n% We use the sum of infeasibilities heuristic:\n%\n%   minimize   sum( max( Ax - b ) )\n%\n% which is equivalent to the following LP (book pg. 580):\n%\n%   minimize   sum( s )\n%       s.t.   Ax <= b + s\n%              s >= 0\n%\n% with variables x in R^n and s in R^m.\n\n% problem dimensions (m inequalities in n-dimensional space)\nm = 150;\nn = 10;\n\n% fix random number generator so we can repeat the experiment\nseed = 0;\nrandn('state',seed);\n\n% construct infeasible inequalities\nA = randn(m,n);\nb = randn(m,1);\n\nfprintf(1, ['Starting with an infeasible set of %d inequalities ' ...\n            'in %d variables.\\n'],m,n);\n\n% sum of infeasibilities heuristic\ncvx_begin\n   variable x(n)\n   minimize( sum( max( A*x - b, 0 ) ) )\ncvx_end\n\n% full LP version of the sum of infeasibilities heuristic\n% cvx_begin\n%   variables x(n) s(m)\n%   minimize( sum( s ) )\n%   subject to\n%     A*x <= b + s;\n%     s >= 0;\n% cvx_end\n\n% number of satisfied inequalities\nnv = length( find( A*x > b ) );\nfprintf(1,'\\nFound an x that violates %d out of %d inequalities.\\n',nv,m);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/sparse_heuristics/sparse_infeas_dual.m",
    "content": "% Detecting a small subset of infeasible linear inequalities\n% Section 5.8, Boyd & Vandenberghe \"Convex Optimization\"\n% Written for CVX by Almir Mutapcic - 02/18/06\n%\n% We consider a set of linear inequalities A*x <= b which are\n% infeasible. Here A is a matrix in R^(m-by-n) and b belongs\n% to R^m. We apply a l1-norm heuristic to find a small subset\n% of mutually infeasible inequalities from a larger set of\n% infeasible inequalities. The heuristic finds a sparse solution\n% to the alternative inequality system.\n%\n% Original system is A*x <= b and it alternative ineq. system is:\n%\n%   lambda >= 0,   A'*lambda == 0.   b'*lambda < 0\n%\n% where lambda in R^m. We apply the l1-norm heuristic:\n%\n%   minimize   sum( lambda )\n%       s.t.   A'*lambda == 0\n%              b'*lambda == -1\n%              lambda >= 0\n%\n% Positive lambdas gives us a small subset of inequalities from\n% the original set which are mutually inconsistent.\n\n% problem dimensions (m inequalities in n-dimensional space)\nm = 150;\nn = 10;\n\n% fix random number generator so we can repeat the experiment\nseed = 0;\nrandn('state',seed);\n\n% construct infeasible inequalities\nA = randn(m,n);\nb = randn(m,1);\n\nfprintf(1, ['Starting with an infeasible set of %d inequalities ' ...\n            'in %d variables.\\n'],m,n);\n\n% you can verify that the set is infeasible\n% cvx_begin\n%   variable x(n)\n%   A*x <= b;\n% cvx_end\n\n% solve the l1-norm heuristic problem applied to the alternative system\ncvx_begin\n   variables lambda(m)\n   minimize( sum( lambda ) )\n   subject to\n     A'*lambda == 0;\n     b'*lambda == -1; \n     lambda >= 0;\ncvx_end\n\n% report the smaller set of mutually inconsistent inequalities\ninfeas_set = find( abs(b.*lambda) > sqrt(eps)/n );\ndisp(' ');\nfprintf(1,'Found a smaller set of %d mutually inconsistent inequalities.\\n',...\n        length(infeas_set));\ndisp(' ');\ndisp('A smaller set of mutually inconsistent inequalities are the ones');\ndisp('with row indices:'), infeas_set'\n\n% check that this set is infeasible\n% cvx_begin\n%    variable x_infeas(n)\n%    A(infeas_set,:)*x_infeas <= b(infeas_set);\n% cvx_end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/sparse_heuristics/sparse_solution.m",
    "content": "% Computing a sparse solution of a set of linear inequalities\n% Section 6.2, Boyd & Vandenberghe \"Convex Optimization\"\n% \"Just relax: Convex programming methods for subset selection\n%  and sparse approximation\" by J. A. Tropp\n% Written for CVX by Almir Mutapcic - 02/28/06\n%\n% We consider a set of linear inequalities A*x <= b which are\n% feasible. We apply two heuristics to find a sparse point x that\n% satisfies these inequalities.\n%\n% The (standard) l1-norm heuristic for finding a sparse solution is:\n%\n%   minimize   ||x||_1\n%       s.t.   Ax <= b\n%\n% The log-based heuristic is an iterative method for finding\n% a sparse solution, by finding a local optimal point for the problem:\n%\n%   minimize   sum(log( delta + |x_i| ))\n%       s.t.   Ax <= b\n%\n% where delta is a small threshold value (determines what is close to zero).\n% We cannot solve this problem since it is a minimization of a concave\n% function and thus it is not a convex problem. However, we can apply\n% a heuristic in which we linearize the objective, solve, and re-iterate.\n% This becomes a weighted l1-norm heuristic:\n%\n%   minimize sum( W_i * |x_i| )\n%       s.t. Ax <= b\n%\n% which in each iteration re-adjusts the weights W_i based on the rule:\n%\n%   W_i = 1/(delta + |x_i|), where delta is a small threshold value\n%\n% This algorithm is described in papers:\n% \"An Affine Scaling Methodology for Best Basis Selection\"\n%  by B. D. Rao and K. Kreutz-Delgado\n% \"Portfolio optimization with linear and ?xed transaction costs\"\n%  by M. S. Lobo, M. Fazel, and S. Boyd\n\n% fix random number generator so we can repeat the experiment\nseed = 0;\nrandn('state',seed);\nrand('state',seed);\n\n% the threshold value below which we consider an element to be zero\ndelta = 1e-8;\n\n% problem dimensions (m inequalities in n-dimensional space)\nm = 100;\nn = 50;\n\n% construct a feasible set of inequalities\n% (this system is feasible for the x0 point)\nA  = randn(m,n);\nx0 = randn(n,1);\nb  = A*x0 + rand(m,1); \n\n% l1-norm heuristic for finding a sparse solution\nfprintf(1, 'Finding a sparse feasible point using l1-norm heuristic ...')\ncvx_begin\n  variable x_l1(n)\n  minimize( norm( x_l1, 1 ) )\n  subject to\n    A*x_l1 <= b;\ncvx_end\n\n% number of nonzero elements in the solution (its cardinality or diversity)\nnnz = length(find( abs(x_l1) > delta ));\nfprintf(1,['\\nFound a feasible x in R^%d that has %d nonzeros ' ...\n           'using the l1-norm heuristic.\\n'],n,nnz);\n\n% iterative log heuristic\nNUM_RUNS = 15;\nnnzs = [];\nW = ones(n,1); % initial weights\n\ndisp([char(10) 'Log-based heuristic:']);\nfor k = 1:NUM_RUNS\n  cvx_begin quiet\n    variable x_log(n)\n    minimize( sum( W.*abs(x_log) ) )\n    subject to\n      A*x_log <= b;\n  cvx_end\n\n  % display new number of nonzeros in the solution vector\n  nnz = length(find( abs(x_log) > delta ));\n  nnzs = [nnzs nnz];\n  fprintf(1,'   found a solution with %d nonzeros...\\n', nnz);\n\n  % adjust the weights and re-iterate\n  W = 1./(delta + abs(x_log));\nend\n\n% number of nonzero elements in the solution (its cardinality or diversity)\nnnz = length(find( abs(x_log) > delta ));\nfprintf(1,['\\nFound a feasible x in R^%d that has %d nonzeros ' ...\n           'using the log heuristic.\\n'],n,nnz);\n\n% plot number of nonzeros versus iteration\nplot(1:NUM_RUNS, nnzs, [1 NUM_RUNS],[nnzs(1) nnzs(1)],'--');\naxis([1 NUM_RUNS 0 n])\nxlabel('iteration'), ylabel('number of nonzeros (cardinality)');\nlegend('log heuristic','l1-norm heuristic','Location','SouthEast')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/time_series_analysis/Contents.m",
    "content": "% Example from <a href=\"http://stanford.edu/~boyd/papers/l1_trend_filter.html\">l1 Trend Filtering</a>\n%\n%  l1_trend_filter_snp500.m - l1 trend filtering\n%  snp500.txt               - (no title)\nhelp Contents\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/examples/time_series_analysis/l1_trend_filter_snp500.m",
    "content": "% l1 trend filtering\n% Written for CVX by Kwangmoo Koh - 12/10/07\n%\n% The problem of estimating underlying trends in time series data arises in\n% a variety of disciplines. The l1 trend filtering method produces trend \n% estimates x that are piecewise linear from the time series y.\n%\n% The l1 trend estimation problem can be formulated as\n%\n%    minimize    (1/2)*||y-x||^2+lambda*||Dx||_1,\n%\n% with variable x , and problem data y and lambda, with lambda >0.\n% D is the second difference matrix, with rows [0... -1 2 -1 ...0]\n%\n% CVX is not optimized for the l1 trend filtering problem.\n% For large problems, use l1_tf (www.stanford.edu/~boyd/l1_tf/).\n\n% load time series data\ny = csvread('snp500.txt'); % log price of snp500\nn = length(y);\n\n% form second difference matrix\ne = ones(n,1);\nD = spdiags([e -2*e e], 0:2, n-2, n);\n\n% set regularization parameter\nlambda = 50;\n\n% solve l1 trend filtering problem\ncvx_begin\n    variable x(n)\n    minimize( 0.5*sum_square(y-x)+lambda*norm(D*x,1) )\ncvx_end\n\n% plot estimated trend with original signal\nfigure(1);\nplot(1:n,y,'k:','LineWidth',1.0); hold on;\nplot(1:n,x,'b-','LineWidth',2.0); hold off;\nxlabel('date'); ylabel('log price');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/avg_abs_dev.m",
    "content": "function y = avg_abs_dev( x, dim )\n\n%AVG_ABS_DEV    Internal cvx version.\n\nif ~cvx_isaffine( x ),\n    error( 'Disciplined convex programming error:\\n    ABS_AVG_DEV is convex and nonmonotonic in X, so X must be affine.', 1 ); %#ok\nend\n\ntry\n\tif nargin < 2, dim = []; end\n\t[ x, sx, sy, zx, zy, nx, nv, perm ] = cvx_reduce_size( x, dim ); %#ok\ncatch exc\n\terror( exc.message );\nend\n\nif nx > 1 && nv > 0,\n    % In theory we could just say y = mean(abs(x-mean(x))). However, by\n    % adding an extra variable we preserve sparsity.\n    cvx_begin\n        variable y( 1, nv );\n        y == sum( x ) / nx; %#ok\n        minimize( sum( abs( x - ones(nx,1) * y ) ) / nx );\n    cvx_end\n    y = cvx_optval;\nelseif nx == 0,\n\ty = NaN( sy );\nelse\n\ty = zeros( sy );\nend\n\n%\n% Reverse the reshaping and permutation steps\n%\n\ny = reshape( y, sy );\nif ~isempty( perm ),\n    y = ipermute( y, perm );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/avg_abs_dev_med.m",
    "content": "function y = avg_abs_dev_med( x, dim )\n\n%AVG_ABS_DEV_MED    Internal cvx version.\n\nif ~cvx_isaffine( x ),\n    error( 'Disciplined convex programming error:\\n    ABS_AVG_DEV_MED is convex and nonmonotonic in X, so X must be affine.', 1 ); %#ok\nend\n\ntry\n\tif nargin < 2, dim = []; end\n\t[ x, sx, sy, zx, zy, nx, nv, perm ] = cvx_reduce_size( x, dim ); %#ok\ncatch exc\n\terror( exc.message );\nend\n\nif nx > 1 && nv > 0,\n    cvx_begin\n        variable y( 1, nv );\n        minimize( sum( abs( x - ones(nx,1) * y ) ) / nx ); %#ok\n    cvx_end\n    y = cvx_optval;\nelseif nx == 0,\n\ty = NaN( sy );\nelse\n\ty = zeros( sy );\nend\n\n%\n% Reverse the reshaping and permutation steps\n%\n\ny = reshape( y, sy );\nif ~isempty( perm ),\n    y = ipermute( y, perm );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/berhu.m",
    "content": "function cvx_optval = berhu( x, M, t ) %#ok\n\n%BERHU   Internal cvx version.\n\n%\n% Check arguments\n%\n\nnarginchk(1,3);\nif ~cvx_isaffine( x ),\n    error( 'Disciplined convex programming error:\\n    HUBER is nonmonotonic in X, so X must be affine.', 1 ); %#ok\nend\nif nargin < 2,\n    M = 1;\nelseif isa( M, 'cvx' ),\n    error( 'Second argument must be numeric.' );\nelseif ~isreal( M ) || any( M( : ) <= 0 ),\n    error( 'Second argument must be real and positive.' );\nend\nif nargin < 3,\n    t = 1;\nelseif ~isreal( t ),\n    error( 'Third argument must be real.' );\nelseif cvx_isconstant( t ) && nnz( cvx_constant( t ) <= 0 ),\n    error( 'Third argument must be real and positive.' );\nelseif ~cvx_isconcave( t ),\n    error( 'Disciplined convex programming error:\\n    HUBER is convex and nonincreasing in T, so T must be concave.', 1 ); %#ok\nend\nsz = cvx_size_check( x, M, t );\nif isempty( sz ),\n    error( 'Sizes are incompatible.' );\nend\n\n%\n% Compute result\n%\n\nv = []; w = [];\ncvx_begin separable\n    variables v( sz ) w( sz )\n    minimize( quad_over_lin( w, t, 0 ) ./ (2*M) + v + w )\n    abs( x ) <= w + v; %#ok\n    v <= M * t; %#ok\n    w >= 0; %#ok\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/cvx_recip.m",
    "content": "function y = cvx_recip( x )\r\n\r\n%RECIP   Internal cvx version.\r\n\r\n%\r\n% Determine the expression types\r\n%\r\n\r\nnarginchk(1,1);\r\npersistent remap\r\nif isempty( remap ),\r\n    remap_1 = cvx_remap( 'constant' ) & ~cvx_remap( 'zero' );\r\n    remap_2 = cvx_remap( 'log-valid' ) & ~remap_1;\r\n    remap = remap_1 + 2 * remap_2;\r\nend\r\nvr = remap( cvx_classify( x ) );\r\nvu = sort( vr(:) );\r\nvu = vu([true;diff(vu)~=0]);\r\nnv = length( vu );\r\n\r\n%\r\n% Process each result type one at a time\r\n%\r\n\r\nif nv ~= 1,\r\n    y = cvx( x.size_, [] );\r\nend\r\nfor k = 1 : nv,\r\n\r\n    %\r\n    % Select the category of expression to compute\r\n    %\r\n\r\n    if nv == 1,\r\n        xt = x;\r\n    else\r\n        t = vr == vu( k );\r\n        xt = cvx_subsref( x, t );\r\n    end\r\n\r\n    %\r\n    % Perform the computations\r\n    %\r\n\r\n    switch vu( k ),\r\n        case 0,\r\n            % Invalid\r\n            error( 'Disciplined convex programming error:\\n    Cannot perform the operation recip( {%s} )', cvx_class( x, false, false, true ) );\r\n        case 1,\r\n            % Non-zero constant\r\n            yt = cvx( 1.0 ./ cvx_constant( xt ) );\r\n        case 2,\r\n            % Monomial, posynomial\r\n            yt = exp( -log( xt ) );\r\n        otherwise,\r\n            error( 'Shouldn''t be here.' );\r\n    end\r\n\r\n    %\r\n    % Store the results\r\n    %\r\n\r\n    if nv == 1,\r\n        y = yt;\r\n    else\r\n        y = cvx_subsasgn( y, t, yt );\r\n    end\r\n\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/det_inv.m",
    "content": "function cvx_optval = det_inv( X, p )\n\n%DET_INV   Internal cvx version.\n\nnarginchk(1,2);\nn = size( X, 1 );\nif ndims( X ) > 2, %#ok\n    error( 'N-D arrays are not supported.' );\nelseif size( X, 2 ) ~= n,\n    error( 'Matrix must be square.' );\nelseif nargin < 2,\n    p = 1;\nelseif ~isnumeric( p ) || ~isreal( p ) || numel( p ) ~=  1 || p <= 0,\n    error( 'Second argument must be a positive scalar.' );\nend\n\nw = [ ones(n,1) ; p ];\nif cvx_isconstant( X ),\n    \n    cvx_optval = cvx( det_inv( cvx_constant( X ), p ) );\n\nelseif nnz( X ) <= n && nnz( diag( X ) ) == nnz( X ),\n    \n    y = [];\n    cvx_begin\n        epigraph variable y\n        geo_mean( [ diag(X) ; y ], w ) >= 1; %#ok\n    cvx_end\n\nelseif isreal( X ),\n\n\ty = []; Z = [];\n    cvx_begin\n        epigraph variable y\n        variable Z(n,n) lower_triangular\n        D = diag( Z );\n        [ diag( D ), Z' ; Z, X ] == semidefinite(2*n); %#ok\n        geo_mean( [ D ; y ], [], w ) >= 1; %#ok\n    cvx_end\n\nelse\n\n\ty = []; Z = [];\n    cvx_begin\n        epigraph variable y\n        variable Z(n,n) lower_triangular complex\n        D = diag( Z );\n        [ diag( D ), Z' ; Z, X ] == hermitian_semidefinite(2*n); %#ok\n        geo_mean( [ real( D ) ; y ], [], w ) >= 1; %#ok\n    cvx_end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/det_rootn.m",
    "content": "function cvx_optval = det_rootn( X )\r\n\r\n%DET_ROOTN   Internal cvx version.\r\n\r\nnarginchk(1,1);\r\nn = size( X, 1 );\r\nif ndims( X ) > 2, %#ok\r\n\r\n    error( 'N-D arrays are not supported.' );\r\n\r\nelseif size( X, 2 ) ~= n,\r\n\r\n    error( 'Matrix must be square.' );\r\n\r\nelseif nnz( X ) <= n && nnz( diag( X ) ) == nnz( X ),\r\n\r\n    cvx_optval = geo_mean( diag( X ) );\r\n\r\nelseif cvx_isconstant( X ),\r\n\r\n    cvx_optval = cvx( det_rootn( cvx_constant( X ) ) );\r\n\r\nelseif isreal( X ),\r\n\r\n\tZ = [];\r\n    cvx_begin\r\n        variable Z(n,n) lower_triangular\r\n        D = diag( Z );\r\n        maximize( geo_mean( D ) );\r\n        subject to\r\n            [ diag( D ), Z' ; Z, X ] == semidefinite(2*n); %#ok\r\n    cvx_end\r\n\r\nelse\r\n\r\n\tZ = [];\r\n    cvx_begin\r\n        variable Z(n,n) lower_triangular complex\r\n        D = diag( Z );\r\n        maximize( geo_mean( real( D ) ) );\r\n        subject to\r\n            [ diag( D ), Z' ; Z, X ] == hermitian_semidefinite(2*n); %#ok\r\n    cvx_end\r\n\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/functions.m",
    "content": "% CVX: Additional functions added by CVX.\n%\n%   These functions have been provided to expand the variety of constraints\n%   and objectives that can be specified in CVX models. But in fact, they \n%   can be used with numeric arguments *outside* of CVX as well. The help \n%   text for each of these functions contains general information about the\n%   computations it performs, as well as specific information about its\n%   proper use in CVX models, as dictated by its convexity/concavity and\n%   monotonicity properties.\n%\n%   Those functions marked with a (*), as well as the exponential and \n%   logarithm functions, are supported using a \"successive approximation\"\n%   approach: that is, the solver is called multiple times to refine the \n%   solution to the required accuracy. Thus models using these functions\n%   should be expected to run more slowly than models of comparable size\n%   that do not. See the CVX user guide for details.\n%\n%   A number of Matlab's built-in functions have been extended to provide\n%   CVX support; for example,\n%     abs, exp(*), log (*), max, min, norm, prod, sqrt\n%   For a full list, type \"help cvx/builtins\".\n%\n%   berhu             - Reverse Huber penalty function.\n%   det_inv           - Determinant of the inverse of an SPD matrix.\n%   det_root2n        - 2nth-root of the determinant of an SPD matrix.\n%   det_rootn         - nth-root of the determinant of an SPD matrix.\n%   entr              - Scalar entropy. (*)\n%   geo_mean          - Geometric mean. (*)\n%   huber             - Huber penalty function.\n%   huber_circ        - Circularly symmetric version of the Huber penalty.\n%   huber_pos         - Monotonic Huber-style function.\n%   inv_pos           - Reciprocal of a positive quantity.\n%   kl_div            - Scalar Kullback-Leibler distance. (*)\n%   lambda_max        - Maximum eigenvalue of a symmetric matrix.\n%   lambda_min        - Minimum eigenvalue of a symmetric matrix.\n%   log_det           - Logarithm of the determinant. (*)\n%   log_normcdf       - Logarithm of the normal CDF. (approximation)\n%   log_sum_exp       - log(sum(exp(x))). (*)\n%   logsumexp_sdp     - SDP-based approximation of log(sum(exp(x))).\n%   matrix_frac       - Matrix fractional function.\n%   norm_largest      - Sum of the k largest magnitudes of a vector.\n%   norm_nuc          - Nuclear norm of a matrix.\n%   norms             - Computation of multiple vector norms.\n%   norms_largest     - Computation of multiple norm_largest() norms.\n%   poly_env          - Convex or concave envelope of a polynomial.\n%   polyval_trig      - Evaluate a trigonometric polynomial.\n%   pos               - Positive part.\n%   pow_p             - Nonnegative branches of the power function.\n%   pow_pos           - Convex/concave branches of the power function.\n%   pow_abs           - Absolute value raised to a fixed power.\n%   quad_form         - Quadratic form.\n%   quad_over_lin     - Sum of squares over linear.\n%   quad_pos_over_lin - Sum of squares of positives over linear.\n%   rel_entr          - Scalar relative entropy. (*)\n%   sigma_max         - Maximum singular value.\n%   square            - Square.\n%   square_abs        - Square of absolute value.\n%   square_pos        - Square of positive part.\n%   sum_largest       - Sum of the largest k values of a vector.\n%   sum_smallest      - Sum of the smallest k elements of a vector.\n%   sum_square        - Sum of squares.\n%   sum_square_abs    - sum of squares of absolute values.\n%   sum_square_pos    - Sum of squares of positive parts.\n%   trace_inv         - Trace of the inverse of a PSD matrix.\n%   trace_sqrtm       - Trace of the square root of a PSD matrix.\n%   vec               - Vectorize.\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/geo_mean.m",
    "content": "function y = geo_mean( x, dim, w )\nnarginchk(1,3);\n\n%GEO_MEAN   Internal cvx version.\n\n%\n% Size check\n%\n\ntry\n    if nargin < 2, dim = []; end\n    [ x, sx, sy, zx, zy, nx, nv, perm ] = cvx_reduce_size( x, dim ); %#ok\ncatch exc\n    rethrow( exc )\nend\n    \n%\n% Third argument check\n%\n\nif nargin < 3 || isempty( w ),\n    w = [];\nelseif numel( w ) ~= length( w ) || ~isnumeric( w ) || ~isreal( w ) || any( w < 0 ) || any( w ~= floor( w ) ),\n    error( 'Third argument must be a vector of nonnegative integers.' );\nelseif length( w ) ~= nx,\n    error( 'Third argument must be a vector of length %d', nx );\nend\n\n%\n% Quick exit for simple cases\n%\n\nif isempty( x ) || ~isempty( w ) && ~any( w ),\n    y = ones( zy );\n    return\nend\n\n%\n% Type check\n%\n\npersistent remap_1 remap_2 remap_3 remap_4\nif isempty( remap_4 ),\n    % Constant (postive or negative)\n    remap_1 = cvx_remap( 'real' );\n    remap_2 = cvx_remap( 'concave' );\n    remap_3 = cvx_remap( 'log-convex' );\n    remap_4 = cvx_remap( 'log-concave' );\nend\nvx = cvx_reshape( cvx_classify( x ), sx );\nt1 = all( reshape( remap_1( vx ), sx ) );\nt2 = all( reshape( remap_2( vx ), sx ) );\nt3 = all( reshape( remap_3( vx ), sx ) ) | ...\n     all( reshape( remap_4( vx ), sx ) );\n% Valid combinations with zero or negative entries can be treated as constants\nt1 = t1 | ( ( t2 | t3 ) & any( vx == 1 | vx == 9 ) );\nta = t1 + ( 2 * t2 + 3 * t3 ) .* ~t1;\nnu = sort( ta(:) );\nnu = nu([true;diff(nu)~=0]);\nnk = length( nu );\n\n%\n% Perform the computations\n%\n\nif nk > 1,\n    y = cvx( [ 1, nv ], [] );\nend\nfor k = 1 : nk,\n\n    if nk == 1,\n        xt = x;\n    else\n        tt = ta == nu( k );\n        xt = cvx_subsref( x, ':', tt );\n    end\n\n    switch nu( k ),\n        case 0,\n            error( 'Disciplined convex programming error:\\n   Invalid computation: geo_mean( {%s} )', cvx_class( xt, true, true ) );\n        case 1,\n            yt = cvx( geo_mean( cvx_constant( xt ), 1, w ) );\n        case 2,\n        \tyt = [];\n            cvx_begin\n                hypograph variable yt(1,nv);\n                { cvx_accept_concave(xt), yt } == geo_mean_cone( size(xt), 1,  w, 'func' ); %#ok\n            cvx_end\n        case 3,\n            if nx == 1,\n                yt = xt;\n            elseif isempty( w ),\n                yt = exp( sum( log( xt ), 1 ) * ( 1 / nx ) );\n            else\n                yt = exp( ( w / sum( w ) ) * log( xt ) );\n            end\n        otherwise,\n            error( 'Shouldn''t be here.' );\n    end\n\n    if nk == 1,\n        y = yt;\n    else\n        y = cvx_subsasgn( y, tt, yt );\n    end\n\nend\n\n%\n% Reverse the reshaping and permutation steps\n%\n\ny = reshape( y, sy );\nif ~isempty( perm ),\n    y = ipermute( y, perm );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/huber_pos.m",
    "content": "function cvx_optval = huber_pos( x, M, t ) %#ok\n\n%HUBER   Internal cvx version.\n\n%\n% Check arguments\n%\n\nnarginchk(1,3);\nif ~cvx_isconvex( x ),\n    error( 'Disciplined convex programming error:\\n    HUBER_POS is convex and nondecreasing in X, so X must be convex.', 1 ); %#ok\nend\nif nargin < 2,\n    M = 1;\nelseif isa( M, 'cvx' ),\n    error( 'Second argument must be numeric.' );\nelseif ~isreal( M ) || any( M( : ) <= 0 ),\n    error( 'Second argument must be real and positive.' );\nend\nif nargin < 3,\n    t = 1;\nelseif ~isreal( t ),\n    error( 'Third argument must be real.' );\nelseif cvx_isconstant( t ) && nnz( cvx_constant( t ) <= 0 ),\n    error( 'Third argument must be real and positive.' );\nelseif ~cvx_isconcave( t ),\n    error( 'Disciplined convex programming error:\\n    HUBER_POS is convex and nonincreasing in T, so T must be concave.', 1 ); %#ok\nend\nsz = cvx_size_check( x, M, t );\nif isempty( sz ),\n    error( 'Sizes are incompatible.' );\nend\n\n%\n% Compute result\n%\n\nv = []; w = [];\ncvx_begin separable\n    variables v( sz ) w( sz )\n    minimize( quad_over_lin( w, t, 0 ) + 2 .* M .* v )\n    x <= w + v; %#ok\n    w <= M * t; %#ok\n    v >= 0; %#ok\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/inv_pos.m",
    "content": "function y = inv_pos( x )\n\n%INV_POS   Internal cvx version.\n\ny = pow_cvx( x, -1, 'pow_p' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/lambda_max.m",
    "content": "function cvx_optval = lambda_max( x )\n\n%LAMBDA_MAX   Internal cvx version.\n\nnarginchk(1,1);\nif ndims( x ) > 2 || size( x, 1 ) ~= size( x, 2 ), %#ok\n\n    error( 'Input must be a square matrix.' );\n\nelseif cvx_isconstant( x ),\n\n    cvx_optval = cvx( lambda_max( cvx_constant( x ) ) );\n\nelseif cvx_isaffine( x ),\n\n\tz = [];\n    n = size( x, 1 );\n    cvx_begin\n        epigraph variable z\n        z * eye( n ) - x == semidefinite( n, ~isreal( x ) ); %#ok\n    cvx_end\n\nelse\n\n    error( 'Discipliend convex programming error:\\n    LAMBDA_MAX is convex and nonmonotonic, so its input must be affine.' );\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/lambda_sum_largest.m",
    "content": "function cvx_optval = lambda_sum_largest( x, k )\n\n%LAMBDA_SUM_LARGEST   Internal cvx version.\n\nnarginchk(2,2);\nn = size( x, 1 );\nif ndims( x ) > 2 || n ~= size( x, 2 ), %#ok\n\n    error( 'First input must be a square matrix.' );\n    \nelseif ~isnumeric( k ) || numel( k ) ~= 1 || ~isreal( k ),\n    \n    error( 'Second input must be a constant real scalar.' );\n\nelseif cvx_isconstant( x ),\n\n    cvx_optval = cvx( lambda_max( cvx_constant( x ), k ) );\n    \nelseif ~cvx_isaffine( x ),\n\n    error( 'Discipliend convex programming error:\\n    LAMBDA_SUM_LARGEST is convex and nonmonotonic, so its input must be affine.' );\n    \nelseif k <= 0,\n    \n    cvx_optval = 0;\n    \nelseif k >= size( x, 1 ),\n    \n    cvx_optval = trace( x );\n    \nelse\n    \n    S = [];\n    cvx_begin\n        variable S(n,n) symmetric\n        S == semidefinite(n); %#ok\n        minimize( k * lambda_max( x - S ) + trace( S ) );\n    cvx_end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/log_normcdf.m",
    "content": "function y = log_normcdf( x )\n\n%LOG_NORMCDF   Internal CVX version.\n\nnarginchk(1,1);\nif ~isreal( x ),\n    error( 'Argument must be real.' );\nend\n\npersistent a b nb ob\nif isempty( a ),\n    a =sqrt( [ 0.018102332171520\n               0.011338501342044\n               0.072727608432177\n               0.184816581789135\n               0.189354610912339\n               0.023660365352785 ] );\n    a = sparse(diag(a));\n    b = [3 2.5 2 1 -1 -2]';\n    nb = length(b);\n    ob = ones(nb,1);\nend\n\ncx = cvx_isconstant( x );\nsx = size(x);\nnx = prod(sx);\ny  = a * ( b * ones(1,nx) - ob * reshape( x, 1, nx ) );\nif cx,\n    y = cvx( sum( cvx_constant( max( y, 0 ) ) .^ 2 ) );\nelse\n    y = sum_square_pos( y );\nend\ny = - reshape( y, sx );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/log_sum_exp.m",
    "content": "function y = log_sum_exp( x, dim )\r\n\r\n%LOG_SUM_EXP   CVX internal version.\r\n\r\nnarginchk(1,2);\r\ncvx_expert_check( 'log_sum_exp', x );\r\n\r\nsx = size( x );\r\nif nargin < 2 || isempty( dim ),\r\n    dim = cvx_default_dimension( sx );\r\nelseif ~cvx_check_dimension( dim, true ),\r\n    error( 'Second argument must be a valid dimension.' );\r\nend\r\n\r\n%\r\n% Quick exits\r\n%\r\n\r\nsx( end + 1 : dim ) = 1;\r\nnx = sx( dim );\r\nsy = sx;\r\nsy( dim ) = 1;\r\nif nx == 0,\r\n    sx( dim ) = 1; %#ok\r\n    y = -Inf * ones( sy );\r\n    return\r\nelseif nx == 1,\r\n    y = x;\r\n    return;\r\nelseif any( sx == 0 ),\r\n    y = zeros( sy );\r\n    return\r\nend\r\n\r\n%\r\n% Determine the expression types\r\n%\r\n\r\npersistent remap\r\nif isempty( remap ),\r\n    remap_2 = cvx_remap( 'real' );\r\n    remap_1 = cvx_remap( 'convex' ) & ~remap_2;\r\n    remap = remap_1 + 2 * remap_2;\r\nend\r\nv = reshape( remap( cvx_classify( x ) ), sx );\r\nv = min( v, [], dim );\r\n\r\n%\r\n% Process each type of expression one piece at a time\r\n%\r\n\r\nvu = sort( v(:) );\r\nvu = vu([true;diff(vu)~=0]);\r\nnv = length( vu );\r\nif nv > 1,\r\n    y = cvx( sy, [] );\r\n    if prod(sx(1:dim+1))>1 && prod(sx(dim+1:end))>1,\r\n        perm = [ dim, 1:dim-1, dim+1:length(sx) ];\r\n        x  = permute( x, perm );\r\n        v  = permute( v, perm );\r\n        y  = permute( y, perm );\r\n        dim = 1;\r\n    end\r\nend\r\nfor k = 1 : nv,\r\n\r\n    %\r\n    % Select the category of expression to compute\r\n    %\r\n\r\n    vk = vu( k );\r\n    if nv == 1,\r\n        xt = x;\r\n        sz = sy; %#ok\r\n    else\r\n        t = v == vk;\r\n        xt = cvx_subsref( x, cvx_expand_dim( t, dim, nx ) );\r\n        sx = size( xt );\r\n        sz = sx;\r\n        sz( dim ) = 1; %#ok\r\n    end\r\n\r\n    %\r\n    % Perform the computations\r\n    %\r\n\r\n    switch vk,\r\n        case 0,\r\n            % Invalid\r\n            error( 'Disciplined convex programming error:\\n    Illegal operation: log_sum_exp( {%s} ).', cvx_class( xt ) );\r\n        case 1,\r\n            % Affine, convex\r\n            w = []; z = [];\r\n            cvx_begin\r\n                variable w( sx )\r\n                epigraph variable z( sz )\r\n                { cvx_accept_convex( x ) - cvx_expand_dim( z, dim, nx ), 1, w } == exponential( sx ); %#ok\r\n                sum( w, dim ) == 1; %#ok\r\n            cvx_end\r\n        case 2,\r\n            % Constant\r\n            cvx_optval = cvx( log_sum_exp( cvx_constant( xt ) ) );\r\n        otherwise,\r\n            error( 'Shouldn''t be here.' );\r\n    end\r\n\r\n    %\r\n    % Store the results\r\n    %\r\n\r\n    if nv == 1,\r\n        y = cvx_optval;\r\n    else\r\n        y = cvx_subsasgn( y, t, cvx_optval );\r\n    end\r\n\r\nend\r\n\r\n% Reshape again, just in case\r\ny = reshape( y, sy );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc. \r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/matrix_frac.m",
    "content": "function cvx_optval = matrix_frac( x,Y )\n\n%MATRIX_FRAC   Internal cvx version.\n\nnarginchk(2,2);\nif ndims( Y ) > 2 || size( Y, 1 ) ~= size( Y, 2 ), %#ok\n\n    error( 'Second argument must be a square matrix.' );\n\nelseif ndims( x ) > 2 || size( x, 2 ) > 1, %#ok\n\n    error( 'First argument must be a column vector.' );\n\nelseif size( x, 1 ) ~= size( Y, 1 ),\n\n    error( 'Size of first argument (vector) must match size of second argument (matrix).' );\n\nelseif cvx_isconstant( x ) && cvx_isconstant( Y ),\n\n    cvx_optval = cvx( matrix_frac( cvx_constant( x ), cvx_constant(Y) ) );\n\nelseif cvx_isaffine( x ) && cvx_isaffine( Y ),\n\n    n = size( x, 1 );\n    z = [];\n    cvx_begin\n        epigraph variable z\n        [Y x; x' z] == semidefinite( n+1 ); %#ok\n    cvx_end\n\nelse\n\n    error( 'Disciplined convex programming error:\\n    MATRIX_FRAC is convex and nonmonotonic, so its input must be affine.' );\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/norm_nuc.m",
    "content": "function cvx_optval = norm_nuc( X ) %#ok\n\n%NORM_NUC   Internal cvx version.\n\nnarginchk(1,1);\nif ndims( X ) > 2, %#ok\n    error( 'norm_nuc is not defined for N-D arrays.' );\nelseif ~cvx_isaffine( X ),\n    error( 'Input must be affine.' );\nend\n\n%\n% Construct problem\n% \n\n[ m, n ] = size( X ); %#ok\nW1 = []; W2 = [];\ncvx_begin sdp\n    if isreal(X)\n    \tvariable W1(m,m) symmetric\n    \tvariable W2(n,n) symmetric\n    else\n    \tvariable W1(m,m) hermitian\n    \tvariable W2(n,n) hermitian\n    end\n    minimize(0.5*(trace(W1)+trace(W2)));\n    [W1,X;X',W2] >= 0; %#ok\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/norms.m",
    "content": "function y = norms( x, p, dim )\n\n%NORMS   Internal cvx version.\n\n%\n% Size check\n%\n\nnarginchk(1,3);\ntry\n    if nargin < 3, dim = []; end\n    [ x, sx, sy, zx, zy, nx, nv, perm ] = cvx_reduce_size( x, dim ); %#ok\ncatch exc\n    error( exc.message );\nend\n    \n%\n% Check second argument\n%\n\nif nargin < 2 || isempty( p ),\n    p = 2;\nelseif ~isnumeric( p ) || numel( p ) ~= 1 || ~isreal( p ),\n    error( 'Second argument must be a real number.' );\nelseif p < 1 || isnan( p ),\n    error( 'Second argument must be between 1 and +Inf, inclusive.' );\nend\n\n%\n% Quick exit for empty matrices\n%\n\nif isempty( x ),\n    y = zeros( zy );\n    return\nend\n\n%\n% Type check\n%\n\npersistent remap1 remap2\nif isempty( remap2 ),\n    remap1 = cvx_remap( 'constant', 'log-convex' );\n    remap2 = cvx_remap( 'affine', 'log-convex' );\nend\nxc = reshape( cvx_classify( x ), sx );\nif ~all( remap2( xc( : ) ) ),\n    error( 'Disciplined convex programming error:\\n   Invalid computation: norms( {%s}, ... )', cvx_class( x, true, true ) );\nend\n\n%\n% Compute norms\n%\n\nif nx == 1,\n\tp = 0;\nend\nswitch p,\n\tcase 0,\n\t\ty = abs( x );\n    case 1,\n        y = sum( abs(x) );\n    case Inf,  \n        y = max( abs(x) );\n    otherwise,\n        tt = all( remap1( xc ) );\n        if all( tt( : ) ),\n            y = sum( abs(x) .^ p ) .^ (1/p);\n        elseif any( tt( : ) ),\n            y  = cvx( [ 1, nv ], [] );\n            xt = cvx_subsref( x, ':', tt );\n            y  = cvx_subsasgn( y, tt, norms( xt, p ) );\n            tt = ~tt;\n            xt = cvx_subsref( x, ':', tt );\n            y  = cvx_subsasgn( y, tt, norms( xt, p ) );\n        elseif p == 2,\n        \ty = [];\n            cvx_begin\n                epigraph variable y( 1, nv )\n                { cvx_accept_convex(x), y } == lorentz( [ nx, nv ], 1, ~isreal( x ) ); %#ok\n            cvx_end\n\t\telse\n\t\t\tz = []; y = [];\n            cvx_begin\n                variable z( nx, nv )\n                epigraph variable y( 1, nv )\n                if isreal(x), cmode = 'abs'; else cmode = 'cabs'; end\n                { cat( 3, z, y( ones(nx,1), : ) ), cvx_accept_convex(x) } ...\n                    == geo_mean_cone( sw, 3, [1/p,1-1/p], cmode ); %#ok\n                sum( z ) == y; %#ok\n            cvx_end\n        end\nend\n\n%\n% Reverse the reshaping and permutation steps\n%\n\ny = reshape( y, sy );\nif ~isempty( perm ),\n    y = ipermute( y, perm );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/pow_abs.m",
    "content": "function y = pow_abs( x, p )\n\n%POW_ABS   Internal cvx version.\n\nnarginchk(2,2);\nif ~cvx_isconstant( p ),\n    error( 'Second argument must be constant.' );\nelseif ~isreal( p ),\n    error( 'Second argument must be real.' );\nelseif any( cvx_constant( p(:) ) < 1 ),\n    error( 'Second argument must be greater than or equal to one.' );\nend\ny = pow_cvx( x, p, 'pow_abs' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/pow_cvx.m",
    "content": "function y = pow_cvx( x, p, mode )\n\n%POW_CVX   Internal cvx version.\n\n%\n% Expression type matrices\n%\n\npersistent remap_pos remap_p remap_abs remap_pwr remap_uniq\nif isempty( remap_uniq ),\n    remap_x1  = cvx_remap( 'real' );\n    remap_x1c = cvx_remap( 'complex' );\n    remap_x2  = cvx_remap( 'log-valid' )      & ~remap_x1;\n    remap_x3  = cvx_remap( 'real-affine' )    & ~remap_x1;\n    remap_x3c = cvx_remap( 'complex-affine' ) & ~remap_x1c;\n    remap_x4  = cvx_remap( 'concave' )        & ~( remap_x1 | remap_x3 );\n    remap_x5  = cvx_remap( 'convex'  )        & ~( remap_x1 | remap_x2 | remap_x3 );\n    remap_x6  = cvx_remap( 'valid'   )        & ~( remap_x1 | remap_x2 | remap_x3 | remap_x4 );\n    remap_p   = [1;1;1; 1; 1; 1; 1] * remap_x1  + ...\n                [2;2;2; 2; 2; 2; 2] * remap_x2  + ...\n                [3;5;6; 8;11;11;11] * remap_x3  + ...\n                [3;5;6; 8; 0; 0; 0] * remap_x4; \n    remap_pos = [0;0;0; 1; 1; 1; 1] * remap_x1  + ...\n                [0;0;0; 2; 2; 2; 2] * remap_x2  + ...\n                [0;0;0; 9;11;11;11] * remap_x3  + ...\n                [0;0;0; 9; 0; 0; 0] * remap_x4  + ...\n                [0;0;0; 0;11;11;11] * remap_x5;\n    remap_abs = [0;0;0; 1; 1; 1; 1] * ( remap_x1 | remap_x1c ) + ...\n                [0;0;0; 2; 2; 2; 2] * remap_x2  + ...\n                [0;0;0;10;12;12;12] * remap_x3  + ...\n                [0;0;0;10;13;13;13] * remap_x3c;\n    remap_pwr = [1;1;1; 1; 1; 1; 1] * remap_x1  + ...\n                [2;2;2; 2; 2; 2; 2] * remap_x2  + ...\n                [0;4;6; 7;11; 0;12] * remap_x3  + ...\n                [0;4;6; 7; 0; 0; 0] * remap_x4  + ...\n                [0;0;0; 7; 0; 0; 0] * remap_x6;\n    remap_uniq = logical( [0,0,0,1,0,1,0,0,0,0,1,1,1] );\nend\n\n%\n% Argument check\n%\n\nnarginchk(3,3);\np = cvx_constant( p );\nif nnz( isinf( p ) | isnan( p ) ),\n    error( 'Second argument must be Inf or NaN.' );\nend\nif ~ischar( mode ) || size( mode, 1 ) ~= 1,\n    error( 'Third argument must be a string.' );\nend\nswitch mode,\n    case 'power',\n        cmode  = 'pos';\n        remap  = remap_pwr;\n    case 'pow_p',\n        cmode = 'pos';\n        remap  = remap_p;\n    case 'pow_pos',\n        cmode = 'hypo';\n        remap  = remap_pos;\n    case 'pow_abs',\n        cmode = 'abs';\n        remap  = remap_abs;\n    otherwise\n        error( [ 'Invalid power mode: ', mode ] );\nend\n\n%\n% Check sizes\n%\n\nsx = size( x ); xs = all( sx == 1 );\nsp = size( p ); ps = all( sp == 1 );\nif xs,\n    sy = sp;\nelseif ps || isequal( sx, sp ),\n    sy = sx;\nelse\n    error( 'Matrix dimensions must agree.' );\nend\n\n%\n% Determine the expression types\n%\n\nv = 1 + ( p >= 0 ) + ( p > 0 ) + ( p >= 1 ) + ( p > 1 ) .* ( 1 + ( rem( p, 1 ) == 0 ) + ( rem( p, 2 ) == 0 ) );\nv = remap( v(:)' + size(remap,1) * ( cvx_classify( x ) - 1 ) );\nif ~ps,\n    t = remap_uniq( v + 1 );\n    if any( t ),\n        [ pk, pi, pj ] = unique( p( t ) ); %#ok\n        vt = v( t );\n        v( t ) = vt + ( reshape( pj, size(vt) ) - 1 ) / length( pk );\n    end\nend\n    \n%\n% Process each type of expression one piece at a times\n%\n\nxt = x;\npt = p;\nvu = sort( v(:) );\nvu = vu([true;diff(vu)~=0]);\nnv = length( vu );\nif nv ~= 1,\n    if cvx_isconstant( x ),\n        y = zeros( sy );\n    else\n        y = cvx( sy, [] );\n    end\nend\nfor k = 1 : nv,\n    \n    %\n    % Select the category of expression to compute\n    %\n    \n    vk = vu( k );\n    if nv ~= 1,\n        t = v == vk;\n        if ~xs, xt = cvx_subsref( x, t ); end\n        if ~ps, pt = cvx_subsref( p, t ); end\n    end\n    sz = size(xt);\n    nd = length(sz)+1;\n    sw = sz;\n    sw(nd) = 2;\n    \n    %\n    % Perform the computations\n    %\n    \n    vk = floor(vk);\n    switch vk,\n        case 0,\n            % Invalid\n            pt = sprintf( '%g,', unique(pt) );\n            pt = [ '{', pt(1:end-1), '}' ];\n            if isequal( mode, 'power' ),\n                error( 'Disciplined convex programming error:\\n    Illegal operation: {%s} .^ %s\\n    (Consider POW_P, POW_POS, or POW_ABS instead.)', cvx_class( xt, true, true ), pt ); \n            else\n                error( 'Disciplined convex programming error:\\n    Illegal operation: %s( {%s}, %s )', mode, cvx_class( xt, true, true ), pt ); \n            end\n        case 1,\n            % Constant result\n            yt = cvx( feval( mode, cvx_constant( xt ), pt ) );\n        case 2,\n            % Log-convex/affine/concave\n            yt = exp( log( xt ) .* pt );\n        case 3,\n            % power( concave, p < 0 )\n            % pow_p( concave, p < 0 )\n            yt = [];\n            cvx_begin\n                epigraph variable yt(sz)\n                { cat( nd, cvx_accept_concave(xt), yt ), 1 } == geo_mean_cone( sw, nd, [-pt,1], 'func' ); %#ok\n            cvx_end\n        case 4,\n            % power( valid, 0 )\n            yt = ones(sz);\n        case 5,\n            % pow_p( concave, 0 )\n            yt = ones(sz);\n            cvx_begin\n                xt >= 0; %#ok\n            cvx_end\n        case 6,\n            % pow_p( concave, 0 < p < 1 )\n            yt = [];\n            cvx_begin\n                hypograph variable yt(sz)\n                { cat( nd, cvx_accept_concave(xt), ones(sz) ), yt } == geo_mean_cone( sw, nd, [pt,1-pt], 'func' ); %#ok\n            cvx_end\n        case 7,\n            % power( valid, 1 )\n            yt = xt;\n        case 8,\n            % pow_p( concave, 1 )\n            yt = xt;\n            cvx_begin\n                xt >= 0; %#ok\n            cvx_end\n        case 9,\n            % pow_pos( affine, 1 )\n            yt = max( xt, 0 );\n        case 10,\n            % pow_abs( affine, 1 )\n            yt = abs( xt );\n        case 11,\n            % power( affine, p > 1, p noninteger )\n            % pow_p( affine, p > 1 )\n            % pow_pos( convex, p > 1 )\n            yt = [];\n            cvx_begin\n                epigraph variable yt(sz)\n                { cat( nd, yt, ones(sz) ), cvx_accept_convex(xt) } == geo_mean_cone( sw, nd, [1/pt,1-1/pt], cmode );  %#ok\n            cvx_end\n        case 12,\n            % pow_abs( affine, p > 1 )\n            % power( affine, p even )\n            yt = [];\n            cvx_begin\n                epigraph variable yt(sz)\n                { cat( nd, yt, ones(sz) ), cvx_accept_convex(xt) } == geo_mean_cone( sw, nd, [1/pt,1-1/pt], 'abs' ); %#ok \n            cvx_end\n        case 13,\n            % pow_abs( complex affine, p > 1 )\n            yt = [];\n            cvx_begin\n                epigraph variable yt(sz)\n                { cat( nd, yt, ones(sz) ), xt } == geo_mean_cone( sw, nd, [1/pt,1-1/pt], 'cabs' );  %#ok\n            cvx_end\n    end\n    \n    %\n    % Store the results\n    %\n    \n    if nv ~= 1,\n        y = cvx_subsasgn( y, t, yt );\n    elseif isequal(sz,sy),\n        y = yt;\n    else\n        y = yt * ones(sy);\n    end\n    \nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/pow_p.m",
    "content": "function y = pow_p( x, p )\n\n%POW_P   Internal cvx version.\n\nnarginchk(2,2);\ny = pow_cvx( x, p, 'pow_p' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/pow_pos.m",
    "content": "function y = pow_pos( x, p )\n\n%POW_POS   Internal cvx version.\n\nnarginchk(2,2);\nif ~cvx_isconstant( p ),\n    error( 'Second argument must be constant.' );\nelseif ~isreal( p ),\n    error( 'Second argument must be real.' );\nend\np = cvx_constant( p );\nif nnz( p < 1 ),\n    error( 'Second argument must be greater than or equal to 1.\\n(Use POW_P for exponents less than 1.)', 1 ); %#ok\nend\ny = pow_cvx( x, p, 'pow_pos' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/prod_inv.m",
    "content": "function cvx_optval = prod_inv( x, dim, p )\n\n%DET_INV   Internal cvx version.\n\nnarginchk(1,3);\nif ~isreal( x ), \n    error( 'First argument must be real.' ); \nend\nsx = size( x );\nif nargin < 2 || isempty( dim ),\n    dim = cvx_default_dimension( sx );\nelseif ~cvx_check_dimension( dim ),\n    error( 'Second argument must be a positive integer.' );\nend\nsx( end + 1 : dim ) = 1;\nif nargin < 2,\n    p = 1;\nelseif ~isnumeric( p ) || ~isreal( p ) || numel( p ) ~=  1 || p <= 0,\n    error( 'Third argument must be a positive scalar.' );\nend\n\nif cvx_isconstant( x ),\n    \n    cvx_optval = cvx( prod_inv( cvx_constant( x ), dim, p ) );\n\nelseif sx( dim ) == 1,\n    \n    cvx_optval = inv_pos( x );\n    \nelse\n\n    sy = sx;\n    sy( dim ) = 1;\n    y = [];\n    cvx_begin\n        epigraph variable y( sy )\n        geo_mean( cat( dim, x, y ), dim, [ ones(n,1) ; p ] ) >= 1; %#ok\n    cvx_end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/quad_form.m",
    "content": "function [ cvx_optval, success ] = quad_form( x, Q, v, w )\n\n%QUAD_FORM   Internal cvx version.\n\n%\n% Check sizes and types\n%\n\nnarginchk(2,4);\ntol = 16 * eps;\ntolLDL = 4 * eps;\nif nargin < 4,\n    w = 0;\n    if nargin < 3,\n        v = 0;\n    end\nend\nsx = size( x );\nif length( sx ) ~= 2 || all( sx ~= 1 ),\n    error( 'The first argument must be a vector.' );\nelse\n    sx = prod( sx );\nend\nsQ = size( Q );\nif length( sQ ) ~= 2 || sQ( 1 ) ~= sQ( 2 ),\n    error( 'The second argument must be a scalar or a square matrix.' );\nelseif all( sQ( 1 ) ~= [ 1, sx ] ),\n    error( 'The size of Q is incompatible with the size of x.' );\nend\nsv = size( v );\nif length( sv ) > 2 || all( sv ~= 1 ),\n    error( 'The third argument must be a vector.' );\nelseif all( prod( sv ) ~= [ 1, sx ] ),   \n    error( 'The size of v is incompatible with the size of x.' );\nelse\n    sv = prod( sv );\nend\nif numel( w ) ~= 1,\n    error( 'The fourth argument must be a real scalar.' );\nend\n\nw = real( w );\nv = vec( v );\nx = vec( x );\nsuccess = true;\nif cvx_isconstant( x ),\n    \n    %\n    % Constant x, affine Q\n    %\n\n    x = cvx_constant( x );\n    cvx_optval = real( x' * Q * x ) + sum( real( v' * x ) ) + w;\n    return\n\nelseif ~cvx_isaffine( x ),\n\n    error( 'First argument must be affine.' );\n    \nelseif ~cvx_isconstant( Q ) || ~cvx_isconstant( v ),\n    \n    error( 'Either x or (Q,v) must be constant.' );\n    \nend\nQ = cvx_constant( Q );\nv = cvx_constant( v );\nif nnz( Q ) == 0,\n    \n    %\n    % Zero Q, affine x\n    %\n\n    cvx_optval = sum( real( v' * x ) ) + w;\n    return\n    \nelseif sQ( 1 ) == 1,\n    \n    %\n    % Constant scalar Q, affine x\n    %\n    \n    x = x + 0.5 * ( v / Q );\n    w = w - 0.25 * ( v' * v ) / Q;\n    cvx_optval = real( Q ) * sum_square_abs( x ) + w;\n    return\n    \nelse\n\n    %\n    % Constant matrix Q, affine x\n    %\n\n    if sv < sx, \n        v = v(ones(sx,1),1); \n    end\n    cvx_optval = w;\n    while true,\n        \n        %\n        % Remove zero rows and columns from Q. If a diagonal element of Q is\n        % zero but there are elements on that row or column that are not,\n        % then we know that neither Q nor -Q is PSD.\n        %\n        \n        Q = 0.5 * ( Q + Q' );\n        dQ = diag( Q );\n        trQ = sum( dQ );\n        if ~all( dQ ),\n            nnzQ = nnz( Q );\n            tt = dQ ~= 0;\n            Q = Q( tt, tt );\n            if nnz( Q ) ~= nnzQ,\n                success = false;\n                break\n            end\n            dQ = dQ( tt );\n            if nnz( v ),\n                cvx_optval = cvx_optval + real( v( ~tt, : )' * cvx_subsref( x, ~tt, ':' ) );\n            end\n            v = v( tt, : );\n            x = cvx_subsref( x, tt, ':' );\n            sx = length( x );\n        end\n        \n        %\n        % Determine the sign of the elements of Q. If they are not all of\n        % the same sign, then neither Q nor -Q is PSD. Note that trQ has\n        % preserved the sign of our quadratic form, so setting Q=-Q here\n        % in the concave case does not cause a problem.\n        %\n\n        dQ = dQ > 0;\n        if ~all( dQ ),\n            if any( dQ ),\n                success = false;\n            else\n                Q = -Q;\n            end\n        end\n        \n        %\n        % We've had to modify this portion of the code because MATLAB has\n        % removed support for the CHOLINC function.\n        %\n        % First, try a Cholesky. If it successfully completes its\n        % factorization without fail, we accept it without question. If\n        % it terminates early, we perform a numerical test to see if the\n        % result still approximates the square root to good precision.\n        %\n        % If Cholesky fails, then we assume the matrix is either rank\n        % deficient or indefinite. For sparse matrices, we perform an LDL\n        % factorization, and remove the contributions of any 2x2 blocks,\n        % negative 1x1 blocks, and near-zero 1x1 blocks on the diagonal.\n        % If there are no such blocks, we accept it without question; if\n        % so, we perform the same numerical test. If the test fails, we \n        % assume, for sparse matrices, at least, that the matrix is\n        % indefinite.\n        %\n        % If the matrix is dense, our final test is an eigenvalue\n        % decomposition, the most expensive but the most accurate.\n        %\n\n        spQ = nnz(Q) <= 0.1 * sx * sx;\n        if spQ,\n            Q = sparse( Q );\n            [ R, p, prm ] = chol( Q, 'upper', 'vector' );\n            if any( diff(prm) ~= 1 ),\n                R( :, prm ) = R; %#ok\n            end\n        else\n            Q = full( Q );\n            [ R, p ] = chol( Q, 'upper' );\n            if p > 1, \n                R = [ R , R' \\ Q(1:p-1,p:end) ]; %#ok\n            end\n        end\n        valid = p == 0;\n        if ~valid,\n            tolQ = tol * norm( Q, 'fro' );\n            if p > 1,\n                valid = norm( Q - R' * R, 'fro' ) < tolQ;\n            end\n        end\n        if ~valid && spQ,\n            [ R, DD, prm ] = ldl( sparse( Q ), 'upper', 'vector' );\n            if nnz( R ) > 0.2 * sx * ( sx + 1 ) / 2, spQ = false; end %#ok\n            spQ = cvx_use_sparse( R );\n            tt = diag(DD,1) == 0;\n            tt = [ tt ; true ] & [ true ; tt ] & ( diag(DD) > tolLDL * trQ );\n            DD = diag(DD);\n            R  = bsxfun( @times, sqrt( DD(tt,:) ), R(tt,:) );\n            if any( diff(prm) ~= 1 ), R( :, prm ) = R; end\n            valid = all( tt ) || norm( Q - R' * R, 'fro' ) < tolQ;\n        end\n        if ~valid && ~spQ,\n            [ V, D ] = eig( full( Q ) );\n            if cvx_use_sparse( V ), \n                V = sparse( V ); \n            end\n            D = diag( D );\n            if any( D(2:end) < D(1:end-1) ),\n                [D,ndxs] = sort(D);\n                V = V(:,ndxs);\n            end\n            valid = D(1) > -tol * D(end);\n            if valid,\n                nzero = nnz( cumsum(D) < tol * abs(trQ) );\n                V = V(:,nzero+1:end);\n                D = sqrt(D(nzero+1:end));\n                R = diag(sparse(D)) * V';\n            end\n        end\n        if ~valid,\n            success = false;\n            break;\n        end\n        \n        %\n        % Scale so that the mean eigenvalue of (1/alpha)*R'*R is one. \n        % Hopefully this will minimize scaling issues.\n        %\n       \n        alpha = trQ / size(R,1);\n        cvx_optval = cvx_optval + alpha * sum_square_abs( ( R * x ) / sqrt(alpha) ) + real( v' * x );\n        break;\n        \n    end\n    \n    if ~success,\n        error( 'The second argument must be positive or negative semidefinite.' );\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/quad_over_lin.m",
    "content": "function cvx_optval = quad_over_lin( x, y, dim )\n\n%QUAD_OVER_LIN   Internal cvx version.\n\nnarginchk(2,3);\nsx = size( x );\nsy = size( y );\nnx = length( sx );\nny = length( sy );\nnd = max( nx, ny );\nif nargin < 3 || isempty( dim ),\n    dim = [ find( sx ~= 1 ), 1 ];\n    dim = dim( 1 );\nelseif ~isnumeric( dim ) || dim < 0 || dim ~= floor( dim ),\n    error( 'Third argument must be a dimension.' );\nelseif dim == 0,\n    dim = nd + 1;\n    nd = dim;\nend\n\n%\n% Check sizes\n%\n\nsx = [ sx, ones( 1, nd - nx ) ];\nsy = [ sy, ones( 1, nd - ny ) ];\nsz = sx;\nsz( dim ) = 1;\nif sy( dim ) ~= 1 && any( sx ~= 1 ),\n    error( 'Dimensions are not compatible.' );\nend\nif all( sz == sy ) || all( sy == 1 ),\n    need_contraction = false;\nelseif all( sz == 1 ),\n    sz = sy;\n    need_contraction = sx( dim ) ~= 1;\n    sx = sz;\n    dim = 0;\nelse\n    error( 'Dimensions are not compatible.' );\nend\n\n%\n% Check curvature\n%\n\nif ~cvx_isaffine( x ),\n    error( 'The first argument must be affine.' );\nelseif ~isreal( y ),\n    error( 'The second argument must be real.' );\nelseif ~cvx_isconcave( y ),\n    error( 'The second argument must be concave.' );\nend\n\n%\n% Construct the problem. Note that in order to support the case\n% where y is convex, we actually have to introduce a new inequality\n% y2 <= y, where y2 is a new variable. That is because set membership\n% constraints require affine arguments. So this is an obscure case, then,\n% where automatic curvature checking in epigraph functions breaks down.\n%\n\nif any( sz == 0 ),\n    cvx_optval = cvx( zeros( sz ) );\nelseif any( sx == 0 ),\n    cvx_begin\n        y == nonnegative( sz ); %#ok\n    cvx_end\nelse\n\tz = [];\n    cvx_begin\n        epigraph variable z( sz )\n        y = cvx_accept_concave( y );\n        if need_contraction,\n            x = cvx_accept_convex( norms( x, 2, dim ) );\n        end\n        { x, y, z } == rotated_lorentz( sx, dim, ~isreal( x ) ); %#ok\n    cvx_end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/quad_pos_over_lin.m",
    "content": "function cvx_optval = quad_pos_over_lin( x, y, varargin ) %#ok\n\n%QUAD_POS_OVER_LIN   Internal cvx version.\n\nnarginchk(2,3);\nif ~isreal( x ), \n    error( 'First input must be real.' ); \nend\nx2 = [];\ncvx_begin\n    variable x2( size(x) )\n    minimize quad_over_lin( x2, y, varargin{:} );\n    x2 >= x; %#ok\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/rel_entr.m",
    "content": "function cvx_optval = rel_entr( x, y )\n\n%REL_ENTR   Internal cvx version.\n\ncvx_expert_check( 'rel_entr', x, y );\npersistent remap_x remap_y remap_z\nnarginchk(2,2);\nsx = size( x ); xs = all( sx == 1 );\nsy = size( y ); ys = all( sy == 1 );\nif xs,\n    sz = sy; %#ok \nelseif ys,\n    sz = sx; %#ok\nelseif ~isequal( sx, sy ),\n    error( 'Dimensions are not compatible.' );\nend\n\n% 0 : invalid\n% 1 : negative constant x\n% 2 : zero x\n% 3 : positive constant x\n% 4 : concave x\nif isempty( remap_z ),\n    remap_1 = cvx_remap( 'real' );\n    remap_2 = cvx_remap( 'real-affine' ) & ~remap_1;\n    remap_3 = cvx_remap( 'concave' )     & ~remap_1;\n    remap_x = remap_1 + 2 * remap_2;\n    remap_y = remap_1 + 2 * remap_3;\n    remap_z = ...\n        [ 0, 0, 0 ; ...\n          0, 1, 2 ; ...\n          0, 2, 2 ];\nend\nvx = remap_x( cvx_classify( x ) );\nvy = remap_y( cvx_classify( y ) );\nvr = remap_z( vx + 3 * vy + 1 );\n\n%\n% Perform the computations for each expression type separately\n%\n\nvu = sort( vr(:) );\nvu = vu([true;diff(vu)~=0]);\nnv = length( vu );\nsz = size( x );\nxt = x;\nyt = y;\nif nv ~= 1,\n    y = cvx( sz, [] );\nend\nfor k = 1 : nv,\n\n    %\n    % Select the category of expression to compute\n    %\n\n    vk = vu( k );\n    if nv ~= 1,\n        t = vr == vk;\n        if ~xs, xt = cvx_subsref( x, t ); sz = size( xt ); end\n        if ~ys, yt = cvx_subsref( y, t ); sz = size( yt ); end\n    end\n\n    %\n    % Perform the computations\n    %\n\n    switch vk,\n        case 0,\n            % Invalid\n            error( 'Disciplined convex programming error:\\n    Illegal operation: rel_entr( {%s}, {%s} ).', cvx_class( xt, true, true ), cvx_class( yt, true, true ) );\n        case 1,\n            % Constant\n            cvx_optval = cvx( rel_entr( cvx_constant( xt ), cvx_constant( yt ) ) );\n        case 2,\n            % Real affine\n            q = [];\n            cvx_begin\n                epigraph variable q( sz );\n                { -q, xt, yt } == exponential( sz ); %#ok\n            cvx_end\n        otherwise,\n            error( 'Shouldn''t be here.' );\n    end\n\n    %\n    % Store the results\n    %\n\n    if nv == 1,\n        y = cvx_optval;\n    else\n        y = cvx_subsasgn( y, t, cvx_optval );\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/sigma_max.m",
    "content": "function cvx_optval = sigma_max( x )\n\n%SIGMA_MAX   Internal cvx version.\n\nnarginchk(1,1);\nif ndims( x ) > 2, %#ok\n    error( 'lambda_max is not defined for N-D arrays.' );\nelseif ~cvx_isaffine( x ),\n    error( 'Input must be affine.' );\nend\n\n%\n% Construct problem\n% \n\n[ m, n ] = size( x );\ncvx_optval = lambda_max( [ zeros( m, m ), x ; x', zeros( n, n ) ] );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/square.m",
    "content": "function y = square( x )\n\n%SQUARE   Internal cvx version.\n\n% 0 : all others\n% 1 : constant\n% 2 : real affine\n% 3 : monomial, posynomial\nnarginchk(1,1);\npersistent remap\nif isempty( remap ),\n    remap1 = cvx_remap( 'constant' );\n    remap2 = cvx_remap( 'affine' ) & ~remap1;\n    remap3 = cvx_remap( 'log-valid' ) & ~remap1;\n    remap  = remap1 + 2 * remap2 + 3 * remap3;\nend\nv = remap( cvx_classify( x ) );\n\n%\n% Perform the computations for each expression type separately\n%\n\nvu = sort( v(:) );\nvu = vu([true;diff(vu)~=0]);\nnv = length( vu );\nif nv ~= 1,\n    y = cvx( size( x ), [] );\nend\nfor k = 1 : nv,\n\n    %\n    % Select the category of expression to compute\n    %\n\n    vk = vu( k );\n    if nv == 1,\n        xt = x;\n    else\n        t = v == vk;\n        xt = cvx_subsref( x, t );\n    end\n\n    %\n    % Perform the computations\n    %\n\n    switch vk,\n        case 0,\n            % Invalid\n            error( 'Disciplined convex programming error:\\n    Illegal operation: square( {%s} ).', cvx_class( xt, true, true ) );\n        case 1,\n            % Constant\n            yt = cvx_constant( xt );\n            yt = cvx( yt .* yt );\n        case 2,\n            % Real affine\n            yt = quad_over_lin( xt, 1, 0 );\n        case 3,\n            % Monomial, posynomial\n            yt = exp( 2 * log( xt ) );\n        otherwise,\n            error( 'Shouldn''t be here.' );\n    end\n\n    %\n    % Store the results\n    %\n\n    if nv == 1,\n        y = yt;\n    else\n        y = cvx_subsasgn( y, t, yt );\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/square_abs.m",
    "content": "function cvx_optval = square_abs( x )\n\n%SQUARE_ABS   Internal cvx version.\n\nnarginchk(1,1);\ncvx_optval = pow_abs( x, 2 );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/square_pos.m",
    "content": "function cvx_optval = square_pos( x )\n\n%SQUARE_POS   Internal cvx version.\n\nnarginchk(1,1);\ncvx_optval = pow_pos( x, 2 );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/sum_largest.m",
    "content": "function cvx_optval = sum_largest( x, k, dim )\n\n%SUM_LARGEST   Internal cvx version.\n\nnarginchk(2,3);\nsx = size( x );\nif nargin < 3 || isempty( dim ),\n\tdim = cvx_default_dimension( sx );\nelseif ~cvx_check_dimension( dim ),\n    error( 'Second argument must be a dimension.' );\nelseif ~isnumeric( k ) || ~isreal( k ),\n    error( 'Third argument must be a real scalar.' );\nelseif ~isreal( x ),\n    error( 'First argument must be real.' );\nend\n\n%\n% Quick exit cases\n%\n\nsx( end + 1 : dim ) = 1;\nsy = sx;\nsy( dim ) = 1;\nif k <= 0,\n\n    cvx_optval = zeros( sy );\n\nelseif k <= 1,\n\n    cvx_optval = k * max( x, [], dim );\n\nelseif k >= sx( dim ),\n\n    cvx_optval = sum( x, dim );\n\nelse\n\n\tz = []; xp = []; yp = [];\n    cvx_begin\n        epigraph variable z( sy )\n        variables xp( sx ) yp( sy )\n        z == sum( xp, dim ) - k * yp; %#ok\n        xp >= cvx_expand_dim( yp, dim, sx(dim) ) + x; %#ok\n        xp >= 0; %#ok\n    cvx_end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/sum_log.m",
    "content": "function y = sum_log( x, dim )\n\n%SUM_LOG Internal CVX version.\n\ncvx_expert_check( 'sum_log', x );\nnarginchk(1,2);\nif nargin == 2,\n    y = size( x, dim ) * log( geo_mean( x, dim ) );\nelse\n    y = length( x ) * log( geo_mean( x ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/sum_square.m",
    "content": "function cvx_optval = sum_square( x, varargin )\n\n%SUM_SQUARE   Internal cvx version.\n\nnarginchk(1,2);\nif ~isreal( x ),\n    error( 'Disciplined convex programming error:\\n   The argument to SUM_SQUARE must be real and affine.', 1 ); %#ok\nend\ncvx_optval = quad_over_lin( x, 1, varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/sum_square_abs.m",
    "content": "function cvx_optval = sum_square_abs( x, varargin )\n\n%SUM_SQUARE_ABS   Internal cvx version.\n\nnarginchk(1,2);\ncvx_optval = quad_over_lin( x, 1, varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/sum_square_pos.m",
    "content": "function cvx_optval = sum_square_pos( x, varargin ) %#ok\n\n%SUM_SQUARE_POS   Internal cvx version.\n\nnarginchk(1,2);\nx2 = [];\ncvx_begin\n    variable x2( size( x ) );\n    minimize( sum_square( x2, varargin{:} ) );\n    x2 >= x; %#ok\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/trace_inv.m",
    "content": "function cvx_optval = trace_inv( X ) %#ok\n\n%TRACE_INV   Internal cvx version.\n\nnarginchk(1,1);\nif ndims( X ) > 2, %#ok\n    error( 'trace_inv is not defined for N-D arrays.' );\nelseif ~cvx_isaffine( X ),\n    error( 'Input must be affine.' );\nend\nn = size(X,1);\nif n ~= size( X, 2 ),\n    error( 'Matrix must be square.' );\nend\n\n%\n% Construct problem\n% \n\nY = [];\ncvx_begin sdp\n    if isreal(X),\n        variable Y(n,n) symmetric\n    else\n        variable Y(n,n) Hermitian\n    end\n    minimize(trace(Y));\n    [Y,eye(n);eye(n),X] >= 0; %#ok\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/trace_sqrtm.m",
    "content": "function cvx_optval = trace_sqrtm( X ) %#ok\n\n%TRACE_SQRTM   Internal cvx version.\n\nnarginchk(1,1);\nif ndims( X ) > 2, %#ok\n    error( 'trace_inv is not defined for N-D arrays.' );\nelseif ~cvx_isaffine( X ),\n    error( 'Input must be affine.' );\nend\nn = size(X,1);\nif n ~= size( X, 2 ),\n    error( 'Matrix must be square.' );\nend\n\n%\n% Construct problem\n% \n\nY = [];\ncvx_begin sdp\n    if isreal(X),\n        variable Y(n,n)\n    else\n        variable Y(n,n) complex\n    end\n    maximize(real(trace(Y))); \n    [eye(n),Y;Y',X] >= 0; %#ok\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/@cvx/vec.m",
    "content": "function x = vec( x )\n\n% VEC   CVX implementation of vec\n\nx.size_ = [prod(x.size_),1];\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/Contents.m",
    "content": "% CVX: Additional functions added by CVX.\n%\n%   These functions have been provided to expand the variety of constraints\n%   and objectives that can be specified in CVX models. But in fact, they \n%   can be used with numeric arguments *outside* of CVX as well. The help \n%   text for each of these functions contains general information about the\n%   computations it performs, as well as specific information about its\n%   proper use in CVX models, as dictated by its convexity/concavity and\n%   monotonicity properties.\n%\n%   Those functions marked with a (*), as well as the exponential and \n%   logarithm functions, are supported using a \"successive approximation\"\n%   approach: that is, the solver is called multiple times to refine the \n%   solution to the required accuracy. Thus models using these functions\n%   should be expected to run more slowly than models of comparable size\n%   that do not. See the CVX user guide for details.\n%\n%   A number of Matlab's built-in functions have been extended to provide\n%   CVX support; for example,\n%     abs, exp(*), log (*), max, min, norm, prod, sqrt\n%   For a full list, type \"help cvx/builtins\".\n%\n%   berhu             - Reverse Huber penalty function.\n%   det_inv           - Determinant of the inverse of an SPD matrix.\n%   det_root2n        - 2nth-root of the determinant of an SPD matrix.\n%   det_rootn         - nth-root of the determinant of an SPD matrix.\n%   entr              - Scalar entropy. (*)\n%   geo_mean          - Geometric mean. (*)\n%   huber             - Huber penalty function.\n%   huber_circ        - Circularly symmetric version of the Huber penalty.\n%   huber_pos         - Monotonic Huber-style function.\n%   inv_pos           - Reciprocal of a positive quantity.\n%   kl_div            - Scalar Kullback-Leibler distance. (*)\n%   lambda_max        - Maximum eigenvalue of a symmetric matrix.\n%   lambda_min        - Minimum eigenvalue of a symmetric matrix.\n%   log_det           - Logarithm of the determinant. (*)\n%   log_normcdf       - Logarithm of the normal CDF. (approximation)\n%   log_sum_exp       - log(sum(exp(x))). (*)\n%   logsumexp_sdp     - SDP-based approximation of log(sum(exp(x))).\n%   matrix_frac       - Matrix fractional function.\n%   norm_largest      - Sum of the k largest magnitudes of a vector.\n%   norm_nuc          - Nuclear norm of a matrix.\n%   norms             - Computation of multiple vector norms.\n%   norms_largest     - Computation of multiple norm_largest() norms.\n%   poly_env          - Convex or concave envelope of a polynomial.\n%   polyval_trig      - Evaluate a trigonometric polynomial.\n%   pos               - Positive part.\n%   pow_p             - Nonnegative branches of the power function.\n%   pow_pos           - Convex/concave branches of the power function.\n%   pow_abs           - Absolute value raised to a fixed power.\n%   quad_form         - Quadratic form.\n%   quad_over_lin     - Sum of squares over linear.\n%   quad_pos_over_lin - Sum of squares of positives over linear.\n%   rel_entr          - Scalar relative entropy. (*)\n%   sigma_max         - Maximum singular value.\n%   square            - Square.\n%   square_abs        - Square of absolute value.\n%   square_pos        - Square of positive part.\n%   sum_largest       - Sum of the largest k values of a vector.\n%   sum_smallest      - Sum of the smallest k elements of a vector.\n%   sum_square        - Sum of squares.\n%   sum_square_abs    - sum of squares of absolute values.\n%   sum_square_pos    - Sum of squares of positive parts.\n%   trace_inv         - Trace of the inverse of a PSD matrix.\n%   trace_sqrtm       - Trace of the square root of a PSD matrix.\n%   vec               - Vectorize.\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/avg_abs_dev.m",
    "content": "function y = avg_abs_dev( x, dim )\n\n%AVG_ABS_DEV   Average absolute deviation (about the mean).\n%   For vectors, AVG_ABS_DEV(X) is the average absolute deviation of X\n%   about its mean; that is, AVG_ABS_DEV(X)=MEAN(ABS(X-MEAN(X))). For\n%   matrices, AVG_ABS_DEV(X) is a row vector containing the average\n%   absolute deviation of each column. For N-D arrays, AVG_ABS_DEV(X)\n%   is the average absolute deviation of the elements along the first\n%   non-singleton dimension of X.\n%\n%   AVG_ABS_DEV(X,DIM) performs the computation along the dimension DIM. \n%\n%   See also AVG_ABS_DEV_MED.\n%\n%   Disciplined convex programming information:\n%       AVG_ABS_DEV is convex and nonmontonic in X. \n%       Therefore, X must be affine.\n%      \n\nsx = size( x );\nif nargin < 2 || isempty( dim ),\n    dim = find( sx ~= 1 );\n    if isempty( dim ), dim = 1; else dim = dim( 1 ); end\nend\nnd = length( sx );\nif nd >= dim && sx( dim ) > 1,\n    scale = 1.0 ./ sx( dim );\n    y = sum( abs( x - sum( x, dim ) * scale ), dim ) * scale;\nelseif length( sx ) < dim || sx( dim ) == 1,\n    y = zeros( sx );\nelse\n    sx( end + 1 : nd ) = 1;\n    sx( dim ) = 1;\n    y = NaN( sy );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/avg_abs_dev_med.m",
    "content": "function y = avg_abs_dev_med( x, dim )\n\n%AVG_ABS_DEV_MED   Average absolute deviation about the median.\n%   For vectors, AVG_ABS_DEV_MED(X) is the average absolute deviation of X\n%   about its median; that is, AVG_ABS_DEV_MED(X)=MEAN(ABS(X-MEDIAN(X))).\n%   For matrices, AVG_ABS_DEV_MED(X) is a row vector containing the average\n%   absolute deviation of each column. For N-D arrays, AVG_ABS_DEV_ME(X)\n%   is the average absolute deviation of the elements along the first\n%   non-singleton dimension of X.\n%\n%   AVG_ABS_DEV_MED(X,DIM) performs the computation along the dimension DIM. \n%\n%   See also AVG_ABS_DEV.\n%\n%   Disciplined convex programming information:\n%       AVG_ABS_DEV_MED is convex and nonmontonic in X. \n%       Therefore, X must be affine.\n%      \n\nsx = size( x );\nif nargin < 2 || isempty( dim ),\n    dim = find( sx ~= 1 );\n    if isempty( dim ), dim = 1; else dim = dim( 1 ); end\nend\nnd = length( sx );\nif nd >= dim && sx( dim ) > 1,\n    y = sum( abs( x - median( x, dim ) ), dim ) / sx( dim );\nelseif length( sx ) < dim || sx( dim ) == 1,\n    y = zeros( sx );\nelse\n    sx( end + 1 : nd ) = 1;\n    sx( dim ) = 1;\n    y = NaN( sy );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/berhu.m",
    "content": "function y = berhu( x, M, t )\n\n%BERHU   Reverse Huber penalty function.\n%   BERHU(X) computes the reverse Huber penalty function\n%\n%       BERHU(X) = ABS(X)            if ABS(X)<=1,\n%                  (ABS(X).^2+1)./2  if ABS(X)>=1.\n%\n%   BERHU(X,M) computes the reverse Huber penalty function with halfwidth M,\n%   M.*BERHU(X./M). M must be real and positive.\n%\n%   BERHU(X,M,T) computes the reverse Huber penalty function with halfwidth M\n%   and concomitant scale T: \n%\n%       BERHU(X,M,T) = (M.*T).*BERHU(X./(M.*T))     if T>0\n%                      +Inf                         if T<=0\n%\n%   This form supports the joint estimation of regression coefficients and\n%   scaling; c.f. Art B. Owen, \"A robust hybrid of lasso and ridge regression\",\n%   techincal report, Department of Statistics, Stanford University, 2006: \n%       http://www-stat.stanford.edu/~owen/reports/hhu.pdf\n%\n%   For matrices and N-D arrays, the penalty function is applied to each\n%   element of X independently. M and T must be compatible with X in the same\n%   sense as .*: one must be a scalar, or they must have identical size.\n%\n%   Disciplined convex programming information:\n%       BERHU is jointly convex in X and T. It is nonomonotonic in X and\n%       nonincreasing in T. Therefore, when used in CVX specifications, X\n%       must be affine and T must be concave (or affine). T must be real.\n\n%\n% Check arguments\n%\n\nnarginchk(1,3);\nif nargin < 2,\n    M = 1;\nelseif ~isreal( M ) || any( M( : ) <= 0 ),\n    error( 'Second argument must be real and positive.' );\nend\nif nargin < 3,\n    t = 1;\nelseif ~isreal( t ),\n    error( 'Third argument must be real.' );\nend\nsz = cvx_size_check( x, M, t );\nif isempty( sz ),\n    error( 'Sizes are incompatible.' );\nend\n\n%\n% Compute result\n%\n\ny = abs( x ./ max(t,realmin) );\nz = min( y, M );\ny = t .* ( y + ( y - z ).^2 ./ (2*M) );\nq = t <= 0;\nif nnz( q ),\n    if length(t) == 1, \n        y = Inf * ones( sz );\n    else\n        y( q ) = Inf;\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/det_inv.m",
    "content": "function cvx_optval = det_inv( X, p )\n\n%DET_INV determinant of the inverse of an SPD matrix.\n%   For a square matrix X, DET_INV(X) returns 1.0./DET(X) if X is symmetric\n%   (real) or Hermitian (complex) and positive defininte, and +Inf otherwise.\n%\n%   This function can be used in many convex optimization problems that call\n%   for LOG(DET(X)) instead. For example, if the objective function is\n%      maximize(logdet(X))\n%   then it can be replaced with\n%      maximize(-det_inv(X))\n%   and the same optimal point will be produced.\n%\n%   DET_INV(X,p) computes DET_INV(X)^p. p must be a positive real scalar.\n%\n%   Disciplined convex programming information:\n%       DET_INV(X) is convex and nonmonotonic in X; therefore, when used in\n%       CVX specifications, its argument must be affine.\n\nnarginchk(1,2);\nn = size( X, 1 );\nif ndims( X ) > 2, %#ok\n    error( 'N-D arrays are not supported.' );\nelseif size( X, 2 ) ~= n,\n    error( 'Matrix must be square.' );\nelseif nargin < 2,\n    p = 1;\nelseif ~isnumeric( p ) || ~isreal( p ) || numel( p ) ~=  1 || p <= 0,\n    error( 'Second argument must be a positive scalar.' );\nend\n\nif nnz( X - X' ) ~= 0,\n\n    cvx_optval = +Inf;\n\nelse\n\n    n = size( X, 1 );\n    [ R, q ] = chol( X );\n    if q == 0,\n        cvx_optval = prod(diag(R)).^(-p);\n    else\n        eigs = eig( X );\n        if any( eigs <= 0 ),\n            cvx_optval = +Inf;\n        else\n            cvx_optval = prod(eigs).^(-p);\n        end\n    end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/det_root2n.m",
    "content": "function cvx_optval = det_root2n( X )\n\n%DET_ROOT2N 2nth-root of the determinant of an SPD matrix.\n%     For a square matrix X, DET_ROOT2N(X) returns\n%         POW(DET(X),1/(2*size(X,1))\n%     if X is symmetric (real) or Hermitian (complex) and positive\n%     semidefinite, and -Inf otherwise.\n%\n%     This function has been replaced in significance with DET_ROOTN(X),\n%     and is now simply implemented as SQRT(DET_ROOTN(X)). Please see\n%     DET_ROOTN for more information on its usefulness.\n%\n%     Disciplined convex programming information:\n%         DET_ROOT2N is concave and nonmonotonic; therefore, when used in\n%         CVX specifications, its argument must be affine.\n\nnarginchk(1,1);\ncvx_optval = sqrt(det_rootn(X));\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/det_rootn.m",
    "content": "function cvx_optval = det_rootn( X )\n\n%DET_ROOTN nth-root of the determinant of an SPD matrix.\n%   For a square matrix X, DET_ROOTN(X) returns\n%       POW(DET(X),1/(size(X,1))\n%   if X is symmetric (real) or Hermitian (complex) and positive semidefinite,\n%   and -Inf otherwise.\n%\n%   This function can be used in many convex optimization problems that call for\n%   LOG(DET(X)) instead. For example, if the objective function contains nothing\n%   but LOG(DET(X)), it can be replaced with DET_ROOTN(X), and the same optimal \n%   point will be produced.\n%\n%   Disciplined convex programming information:\n%       DET_ROOTN is concave and nonmonotonic; therefore, when used in\n%       CVX specifications, its argument must be affine.\n\nnarginchk(1,1);\nif ndims( X ) > 2 || size( X, 1 ) ~= size( X, 2 ), %#ok\n    error( 'Second argument must be a square matrix.' );\nend\nerr = X - X';\nX   = 0.5 * ( X + X' );\nif norm( err, 'fro' ) > 8 * eps * norm( X, 'fro' ),\n    cvx_optval = -Inf;\nelse\n    [R,p] = chol(X);\n    if p > 0,\n        cvx_optval = geo_mean(eig(full(X)));\n    else\n        cvx_optval = geo_mean(diag(R)).^2;\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/entr.m",
    "content": "function y = entr( x )\n\n%ENTR   Scalar entropy.\n%   ENTR(X) returns an array of the same size as X with the unnormalized\n%   entropy function applied to each element:\n%                { -X.*LOG(X) if X > 0,\n%      ENTR(X) = { 0          if X == 0,\n%                { -Inf       otherwise.\n%   If X is a vector representing a discrete probability distribution, then\n%   SUM(ENTR(X)) returns its entropy.\n%\n%   Disciplined convex programming information:\n%       ENTR(X) is concave and nonmonotonic in X. Thus when used in CVX\n%       expressions, X must be real and affine. Its use will effectively \n%       constrain X to be nonnegative: there is no need to add an\n%       additional X >= 0 to your model in order to enforce this.\n\nnarginchk(1,1);\ncvx_expert_check( 'entr', x );\ny = -rel_entr( x, 1 );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/geo_mean.m",
    "content": "function y = geo_mean( x, dim, w )\n\n%GEO_MEAN   Geometric mean.\n%   Y=GEO_MEAN(X), where X is a vector, computes the geometrix mean of X. If any\n%   of the elements of X are negative, then Y=-Inf. Otherwise, it is equivalent\n%   to Y=PROD(X).^(1/LENGTH(X)). All elements must be real.\n%\n%   For matrices, GEO_MEAN(X) is a row vector containing the geometric means of\n%   the columns. For N-D arrays, GEO_MEAN(X) is an array of the geometric means\n%   taken along the first non-singleton dimension of X.\n%\n%   GEO_MEAN(X,DIM) takes the geometric mean along the dimension DIM of X.\n%\n%   GEO_MEAN(X,DIM,W), where W is a vector of nonnegative integers, computes a\n%   weighted geometric mean Y = PROD(X.^W)^(1/SUM(W)). This is more efficient\n%   than replicating the values of X W times. Note that W must be a vector,\n%   even if X is a matrix, and its length must be the same as SIZE(X,DIM).\n%\n%   Disciplined convex programming information:\n%       GEO_MEAN is concave  and nondecreasing; therefore, when used in CVX\n%       specifications, its argument must be concave.\n\n%\n% Check arguments\n%\n\nnarginchk(1,3);\nif ~isreal( x ), \n    error( 'First argument must be real.' ); \nelseif nargin < 2,\n    dim = cvx_default_dimension( size( x ) );\nelseif ~cvx_check_dimension( dim ),\n    error( 'Second argument must be a positive integer.' );\nend\nsx = size( x );\nnx = sx( dim );\n\n%\n% Third argument check\n%\n\nif nargin < 3 || isempty( w ),\n    w = [];\nelseif numel( w ) ~= length( w ) || ~isnumeric( w ) || ~isreal( w ) || any( w < 0 ) || any( w ~= floor( w ) ),\n    error( 'Third argument must be a vector of nonnegative integers.' );\nelseif length( w ) ~= nx,\n    error( 'Third argument must be a vector of length %d.', nx );\nelse\n    w = reshape( w, 1, nx );\nend\n\nif nx == 0,\n    sx( dim ) = 1;\n    y = ones( sx );\nelse\n    if nx == 1,\n        y = x;\n    elseif isempty( w ) || ~any( diff( w ) ),\n        y = exp( sum( log( max( x, realmin ) ), dim ) * ( 1 / nx ) );\n    elseif dim == 1,\n        y = exp( w * log( max( x, realmin ) ) * ( 1 / sum( w ) ) );\n    else\n        pvec = [ dim, 1 : dim - 1, dim + 1 : ndims( x ) ];\n        y = ipermute( exp( w * log( max( permute( x, pvec ), realmin ) ) * ( 1 / sum( w ) ) ), pvec );\n    end\n    xmin = min( x, [], dim );\n    y( xmin <  0 ) = -Inf;\n    y( xmin == 0 ) = 0;\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/geomean.m",
    "content": "function y = geomean( varargin )\n\n%GEOMEAN   Geometric mean.\n%   GEOMEAN(X) = GEO_MEAN(X) = PROD(X).^(1/LENGTH(X)). We have replaced this\n%   function with GEO_MEAN to better match our function naming conventions.\n%   Please start using it instead.\n\nwarning( 'CVX:Renamed', [ ...\n    'The function \"geomean\" has been renamed \"geo_mean\". Please start\\n', ...\n    'using the new name. The old name will be removed in a future release.' ], 1 );\n\ny = geo_mean( varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/huber.m",
    "content": "function y = huber( x, varargin )\n\n%HUBER   Huber penalty function.\n%   HUBER(X) computes the Huber penalty function\n%\n%       HUBER(X) = |X|^2   if |X|<=1,\n%                  2|X|-1  if |X|>=1.\n%\n%   HUBER(X,M) is the Huber penalty function of halfwidth M, M.^2.*HUBER(X./M). \n%   M must be real and positive.\n%\n%   HUBER(X,M,T) computes the Huber penalty function with halfwidth M and\n%   concomitant scale T:\n%\n%       HUBER(X,M,T) = T.*HUBER(X./T,M) if T > 0\n%                      +Inf             if T <= 0\n%\n%   This form supports the joint estimation of regression coefficients and\n%   scaling; c.f. Art B. Owen, \"A robust hybrid of lasso and ridge regression\",\n%   techincal report, Department of Statistics, Stanford University, 2006: \n%       http://www-stat.stanford.edu/~owen/reports/hhu.pdf\n%\n%   For matrices and N-D arrays, the penalty function is applied to each\n%   element of X independently. M and T must be compatible with X in the same\n%   sense as .*: one must be a scalar, or they must have identical size.\n%\n%   Disciplined convex programming information:\n%       HUBER is jointly convex in X and T. It is nonomonotonic in X and\n%       nonincreasing in T. Therefore, when used in CVX specifications, X\n%       must be affine and T must be concave (or affine). T must be real.\n\nif ~cvx_isaffine( x ),\n    error( 'Disciplined convex programming error:\\n    HUBER is nonmonotonic in X, so X must be affine.', 1 ); %#ok\nend\ny = huber_pos( abs( x ), varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/huber_circ.m",
    "content": "function y = huber_circ( x, DIM, varargin )\n\n%HUBER_CIRC   Huber penalty function with circular symmetry.\n%   For a vector X, HUBER_CIRC(X) computes the Huber penalty function\n%\n%       HUBER_CIRC(X) =   NORM(X,2)^2 if NORM(X,2)<=1,\n%                       2*NORM(X,2)-1 if NORM(X,2)>=1.\n%\n%   For matrices and N-D arrays, the penalty function is applied to the\n%   first dimens\n%\n%   HUBER_CIRC(X,[],M) computes the penalty function with halfwidth M,\n%   M.^2.*HUBER_CIRC(X./M). M must be real and positive.\n%\n%   HUBER_CIRC(X,[],M,T) computes the penalty function with halfwidth M\n%   and concomitant scale T:\n%\n%       HUBER_CIRC(X,[],M,T) = T.*HUBER_CIRC(X./T,[],M) if T > 0\n%                              +Inf                     if T <= 0\n%\n%   See the help file for HUBER for information about this usage.\n%\n%   If X is a matrix, the penalty function is applied to the columns of the\n%   matrix X, and a row vector is returned. If X is an N-D matrix, the \n%   penalties are computed along the first non-singleton dimension.\n%\n%   HUBER_CIRC(X,DIM), HUBER_CIRC(X,DIM,M), and HUBER_CIRC(X,DIM,M,T) \n%   computes the penalty along the dimension DIM.\n%\n%   Disciplined convex programming information:\n%       HUBER_CIRC is jointly convex in X and T. It is nonomonotonic in X \n%       and nonincreasing in T. Therefore, when used in CVX specifications, \n%       X must be affine and T must be concave (or affine). T must be real.\n%       X, on the other hand, may be real or complex.\n\nif ~cvx_isaffine( x ),\n    error( 'Disciplined convex programming error:\\n    HUBER_CIRC is nonmonotonic in X, so X must be affine.', 1 ); %#ok\nend\nif nargin < 2, DIM = []; end\ny = huber_pos( norms( x, DIM ), varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/huber_pos.m",
    "content": "function y = huber_pos( x, M, t )\n\n%HUBER_POS   Monotonic huber penalty function.\n%   For a vector X, HUBER_POS(X) computes the monotonic Huber-style function\n% \n%                      0     if 0>=X\n%       HUBER_POS(X) = X^2   if 0<=X<=1\n%                      2*X-1 if    X>=1\n%\n%   HUBER_POS(X,M) is the monotonic Huber-style penalty function of\n%   halfwidth M, M.^2.*HUBER_POS(X./M). M must be real and positive.\n%\n%   HUBER_POS(X,M,T) computes the monotonic Huber-style penalty function \n%   with halfwidth M and concomitant scale T:\n%\n%       HUBER_POS(X,M,T) = T.*HUBER_POS(X./T,M) if T > 0\n%                          +Inf                 if T <= 0\n%\n%   See the help file for HUBER for information about this usage.\n%\n%   For matrices and N-D arrays, the penalty function is applied to each\n%   element of X independently. M and T must be compatible with X in the same\n%   sense as .*: one must be a scalar, or they must have identical size.\n%\n%   Disciplined convex programming information:\n%       HUBER_POS is jointly convex in X and T. It is nondecreasing in X and\n%       nonincreasing in T. Therefore, when used in CVX specifications, X\n%       must be convex and T must be concave (or affine). Both must be real.\n\n%\n% Check arguments\n%\n\nnarginchk(1,3);\nif ~isreal( x ),\n    error( 'First argument must be real.' );\nend\nif nargin < 2,\n    M = 1;\nelseif ~isreal( M ) || any( M( : ) <= 0 ),\n    error( 'Second argument must be real and positive.' );\nend\nif nargin < 3,\n    t = 1;\nelseif ~isreal( t ),\n    error( 'Third argument must be real.' );\nend\nsz = cvx_size_check( x, M, t );\nif isempty( sz ),\n    error( 'Sizes are incompatible.' );\nend\n\n%\n% Compute result\n%\n\ny = max( x, 0 );\nz = min( y, M );\ny = t .* z .* ( 2 * y - z );\nq = t <= 0;\nif nnz( q ),\n    if length( t ) == 1,\n        y = Inf * ones( sy );\n    else\n        y( q ) = Inf;\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/inv_pos.m",
    "content": "function y = inv_pos( x )\n\n%INV_POS   Reciprocal of a positive quantity.\n%    INV_POS(X) returns 1./X if X is positive, and +Inf otherwise.\n%    X must be real.\n%\n%    For matrices and N-D arrays, the function is applied to each element.\n%\n%     Disciplined convex programming information:\n%         INV_POS is convex and nonincreasing; therefore, when used in CVX\n%         specifications, its argument must be concave (or affine).\n\nnarginchk(1,1);\nif ~isreal( x ),\n    error( 'Input must be real.' );\nend\ny = 1.0 ./ max( x, 0 );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/kl_div.m",
    "content": "function z = kl_div( x, y )\n\n%KL_DIV   Scalar relative entropy.\n%   KL_DIV(X,Y) returns an array of the same size as X+Y with the Kullback-\n%   Leubler divergence function applied to each element:\n%                    { X.*LOG(X./Y)-X+Y if X >  0 & Y >  0,\n%      KL_DIV(X,Y) = { 0                if X == 0 & Y >= 0,\n%                    { +Inf             otherwise.\n%   X and Y must either be the same size, or one must be a scalar. If X and\n%   Y are vector PDFs, then SUM(KL_DIV(X,Y)) returns their Kullback-Leibler\n%   divergence, which in the case of PDFs is equal to SUM(REL_ENTR(X,Y)).\n%\n%   Disciplined convex programming information:\n%       KL_DIV(X,Y) is convex and nonmonotonic in both X and Y. Thus when\n%       used in CVX expressions, X and Y must be real and affine. The use \n%       of KL_DIV(X,Y) in an objective or constraint will effectively \n%       constrain both X and Y to be nonnegative, hence there is no need to\n%       add additional constraints X >= 0 or Y >= 0 to enforce this.\n\nnarginchk(2,2);\ncvx_expert_check( 'kl_div', x, y );\nz = rel_entr( x, y ) - x + y;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/lambda_max.m",
    "content": "function z = lambda_max( Y )\n\n% LAMBDA_MAX    Maximum eigenvalue of a symmetric matrix.\n%     For square matrix X, LAMBDA_MAX(X) is MAX(EIG(X)) if X is Hermitian\n%     or symmetric and real; and +Inf otherwise. \n%\n%     An error results if X is not a square matrix.\n%\n%     Disciplined convex programming information:\n%         LAMBDA_MAX is convex and nonmonotonic (at least with respect to\n%         elementwise comparison), so its argument must be affine.\n\nnarginchk(1,1);\nif ndims( Y ) > 2 || size( Y, 1 ) ~= size( Y, 2 ), %#ok\n    error( 'Input must be a square matrix.' );\nend\nerr = Y - Y';\nY   = 0.5 * ( Y + Y' );\nif norm( err, 'fro' )  > 8 * eps * norm( Y, 'fro' ),\n    z = Inf;\nelse\n    z = max( eig( full( Y ) ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/lambda_min.m",
    "content": "function z = lambda_min( Y )\n\n% LAMBDA_MIN   Minimum eigenvalue of a symmetric matrix.\n%     For square matrix X, LAMBDA_MIN(X) is MIN(EIG(X)) if X is Hermitian\n%     or symmetric and real; and -Inf otherwise.\n%\n%     An error results if X is not a square matrix.\n%\n%     Disciplined convex programming information:\n%         LAMBDA_MIN is concave and nonmonotonic (at least with respect to\n%         elementwise comparison), so its argument must be affine.\n\nnarginchk(1,1);\nz = - lambda_max( -Y );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/lambda_sum_largest.m",
    "content": "function z = lambda_sum_largest( Y, k )\n\n% LAMBDA_SUM_LARGEST   Sum of the k largest eigenvalues of a symmetric matrix.\n%\n%     For square matrix X, LAMBDA_SUM_LARGEST(X,K) is SUM_LARGEST(EIG(X),k)\n%     if X is Hermitian or symmetric and real; and +Inf otherwise.\n%\n%     An error results if X is not a square matrix.\n%\n%     Disciplined convex programming information:\n%         LAMBDA_SUM_LARGEST is convex and nonmonotonic (at least with \n%         respect to elementwise comparison), so its argument must be affine.\n\nnarginchk(2,2);\nif ndims( Y ) > 2 || size( Y, 1 ) ~= size( Y, 2 ), %#ok\n    error( 'First input must be a square matrix.' );\nelseif ~isnumeric( k ) || numel( k ) ~= 1 || ~isreal( k ),\n    error( 'Second input must be a real scalar.' );\nend\nerr = Y - Y';\nY   = 0.5 * ( Y + Y' );\nif norm( err, 'fro' )  > 8 * eps * norm( Y, 'fro' ),\n    z = Inf;\nelse\n    z = sum_largest( eig( full( Y ) ), k );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/lambda_sum_smallest.m",
    "content": "function z = lambda_sum_smallest( Y, k )\n\n% LAMBDA_SUM_SMALLEST    Sum of the k smallest eigenvalues of a symmetric matrix.\n%     For square matrix X, LAMBDA_SUM_SMALLEST(X,K) is SUM_SMALLEST(EIG(X),k)\n%     if X is Hermitian or symmetric and real; and +Inf otherwise.\n%\n%     An error results if X is not a square matrix.\n%\n%     Disciplined convex programming information:\n%         LAMBDA_SUM_SMALLEST is concave and nonmonotonic (at least with \n%         respect to elementwise comparison), so its argument must be affine.\n\nz = - lambda_sum_largest( - Y, k );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/log_det.m",
    "content": "function cvx_optval = log_det( X )\n\n%LOG_DET   Logarithm of the determinant of an SDP matrix.\n%   For a square matrix X, LOG_DET(X) returns\n%       LOG(DET(X))\n%   if X is symmetric (real) or Hermitian (complex) and positive semidefinite,\n%   and -Inf otherwise.\n%\n%   When used in a CVX model, LOG_DET(X) causes CVX's successive \n%   approximation method to be invoked, producing results exact to within\n%   the tolerance of the solver. Therefore, whenever possible, the use of\n%   DET_ROOTN(X) is to be preferred, because the latter choice can be\n%   represented exactly in an SDP. For example, the objective\n%       MAXIMIZE(LOG_DET(X))\n%   can be (and should be) replaced with\n%       MAXIMIZE(DET_ROOTN(X))\n%   in fact, LOG_DET(X) is implemented simply as N*LOG(DET_ROOTN(X)).\n%\n%   Disciplined convex programming information:\n%       LOG_DET is concave and nonmonotonic; therefore, when used in\n%       CVX specifications, its argument must be affine.\n\nnarginchk(1,1);\ncvx_expert_check( 'log_det', X );\nif ndims( X ) > 2 || size( X, 1 ) ~= size( X, 2 ), %#ok\n    error( 'Argument must be a square matrix.' );\nend\ncvx_optval = size(X,1)*log(det_rootn(X));\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/log_normcdf.m",
    "content": "function y = log_normcdf( x, approx ) %#ok\n\n%LOG_NORMCDF   Logarithm of the cumulative normal distribution.\n%   Y = LOG_NORMCDF(X) is the logarithm of the CDF of the normal\n%   distribution at the point X.\n%\n%                                1    / x\n%       LOG_NORMCDF(X) = LOG( ------- |   exp(-t^2/2) dt )\n%                             sqrt(2) / -Inf\n%\n%   For numeric X, LOG_NORMCDF(X) is computed using the equivalent \n%   expression LOG(0.5*ERFC(-X*SQRT(0.5))). When X is a CVX variable, a \n%   a piecewise quadratic *approximation* is employed instead. This\n%   approximation gives good results when -4 <= x <= 4, and will be\n%   improved in future releases of CVX.\n%\n%   For array values of X, the LOG_NORMCDF returns an array of identical\n%   size with the calculation applied independently to each element.\n%\n%   X must be real.\n%\n%   Disciplined convex programming information:\n%       LOG_NORMCDF is concave and nondecreasing in X. Therefore, when used\n%       in CVX specifications, X must be concave.\n\nnarginchk(1,2);\nif ~isreal( x ),\n    error( 'Argument must be real.' );\nend\nif nargin > 1,\n    % For debugging purposes only\n    y = cvx_constant(log_normcdf(cvx(x)));\nelse\n    y = log(0.5*erfc(-x*sqrt(0.5)));\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/log_prod.m",
    "content": "function cvx_optval = log_prod( X, dim )\n\n%LOG_PROD   Logarithm of the product of a vector.\n%   For a vector X, LOG_PROD(X) returns\n%       LOG(PROD(X))\n%   if all of the elements of X are positive, and -Inf otherwise. Note that\n%       LOG(PROD(X)) = SUM(LOG(X)),\n%   so this is simply a synonym for SUM_LOG(X).\n%\n%   For matrices, LOG_PROD(X) is a row vector containing the application of\n%   LOG_PROD to each column. For N-D arrays, the LOG_PROD is applied to the\n%   first non-singleton dimension of X.\n%\n%   LOG_PROD(X,DIM) takes the product along the dimension DIM of X.\n%\n%   Disciplined convex programming information:\n%       LOG_PROD(X) is concave and nondecreasing in X. Therefore, when used\n%       in CVX expressions, X must be concave. X must be real.\n\nnarginchk(1,2);\nif nargin == 1,\n\tcvx_optval = sum_log( X );\nelse\n\tcvx_optval = sum_log( X, dim );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/log_sum_exp.m",
    "content": "function y = log_sum_exp( x, dim )\n\n%LOG_SUM_EXP    log(sum(exp(x))).\n%   LOG_SUM_EXP(X) = LOG(SUM(EXP(X)).\n%\n%   When used in a CVX model, LOG_SUM_EXP(X) causes CVX's successive\n%   approximation method to be invoked, producing results exact to within\n%   the tolerance of the solver. This is in contrast to LOGSUMEXP_SDP,\n%   which uses a single SDP-representable global approximation.\n%\n%   If X is a matrix, LOGSUMEXP_SDP(X) will perform its computations\n%   along each column of X. If X is an N-D array, LOGSUMEXP_SDP(X)\n%   will perform its computations along the first dimension of size\n%   other than 1. LOGSUMEXP_SDP(X,DIM) will perform its computations\n%   along dimension DIM.\n%\n%   Disciplined convex programming information:\n%       LOG_SUM_EXP(X) is convex and nondecreasing in X; therefore, X\n%       must be convex (or affine).\n\nnarginchk(1,2);\nif ~isreal( x ),\n    error( 'Argument must be real.' );\nend\ny = exp( x );\nif nargin == 1,\n    y = sum( y );\nelse\n    y = sum( y, dim );\nend\ny = log( y );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/logsumexp.m",
    "content": "function y = logsumexp( varargin )\r\n\r\n%LOGSUMEXP    log(sum(exp(x))).\r\n%   LOGSUMEXP(X) = LOG_SUM_EXP(X) = LOG(SUM(EXP(X)). We have replaced this\r\n%   function with LOG_SUM_EXP to better match our function naming\r\n%   conventions. Please start using it instead.\r\n\r\nwarning( 'CVX:Renamed', [ ...\r\n    'The function \"logsumexp\" has been renamed \"log_sum_exp\". Please start\\n', ...\r\n    'using the new name. The old name will be removed in a future release.' ], 1 );\r\n\r\ny = log_sum_exp( varargin{:} );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc. \r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/logsumexp_sdp.m",
    "content": "function cvx_optval = logsumexp_sdp( x, dim, tol )\r\n\r\n%LOGSUMEXP_SDP    SDP-based approximation of log(sum(exp(x))).\r\n%   LOGSUMEXP_SDP(X) computes an approximation of the function\r\n%   LOG(SUM(EXP(X))) using semidefinite programming techniques.\r\n%   The approximation is chosen so that, to within the numerical\r\n%   tolerance of the SDP solver,\r\n%         Y <= LOGSUMEXP_SDP(X) <= Y + TOL\r\n%   where Y = LOG(SUM(EXP(X))).\r\n%\r\n%   Our specific choice of a one-sided, absolute approximation has\r\n%   two important consequences. First of all, the one-sidedness insures\r\n%   that constraints that utilize LOGSUMEXP_SDP are conservative; that\r\n%   is, they are tighter than if they were to use LOGSUMEXP exactly.\r\n%   So if the approximate disciplined convex program is feasible, so\r\n%   is the original.\r\n%\r\n%   Secondly, for geometric programs, the absolute tolerance TOL\r\n%   translates to a *relative* tolerance of EXP(TOL) in a posynomial\r\n%   constraint. That is, given a constraint\r\n%       P(X) <= M(X)\r\n%   where P(X) is posynomial and M(X) is monomial, the approximation\r\n%   has the effect of enforcing a constraint\r\n%       P(X) <= M(X)/(1+E)\r\n%   for some unknown 0 <= E <= TOL, if TOL is sufficiently small.\r\n%\r\n%   If X is a matrix, LOGSUMEXP_SDP(X) will perform its computations\r\n%   along each column of X. If X is an N-D array, LOGSUMEXP_SDP(X)\r\n%   will perform its computations along the first dimension of size\r\n%   other than 1. LOGSUMEXP_SDP(X,DIM) will perform its computations\r\n%   along dimension DIM.\r\n%\r\n%   LOGSUMEXP_SDP(X,[],TOL) and LOGSUMEXP_SDP(X,DIM,TOL) allow you to\r\n%   specify a different tolerance level TOL. The function will attempt\r\n%   to select a polynomial that guarantees that\r\n%         Y <= LOGSUMEXP_SDP(X) <= Y + TOL.\r\n%   where Y = LOG(SUM(EXP(X))). Note that a fixed set of polynomials\r\n%   have been hard-coded into this function. So if TOL is too small, an\r\n%   error will result. In particular, the tightest tolerance currently\r\n%   available is approximately TOL = 2.5E-006 * CEIL(LOG2(SIZE(X,DIM))).\r\n%\r\n%   Disciplined convex programming information:\r\n%       LOGSUMEXP_SDP(X) is convex an nondecreasing in X; therefore, X\r\n%       must be convex (or affine).\r\n\r\nif ~isreal( x ),\r\n    error( 'Input must be real.' );\r\nend\r\nsx = size( x );\r\n\r\nif nargin < 2 || isempty( dim ),\r\n    dim = cvx_default_dimension( sx );\r\nelseif ~cvx_check_dimension( dim, true ),\r\n    error( 'Second argument must be a valid dimension.' );\r\nend\r\n\r\nif nargin < 3 || isempty( tol ),\r\n    tol = 0.01;\r\nelseif ~isnumeric( tol ) || length( tol ) ~= 1 || ~isreal( tol ) || tol <= 0 || tol >= 1,\r\n    error( 'tol must be a number between 0 and 1, exclusuve.' );\r\nend\r\n\r\nif length( sx ) < dim,\r\n    sx( end + 1 : dim ) = 1;\r\nend\r\nnx = sx( dim );\r\nif nx == 0,\r\n    sx( dim ) = 1;\r\n    cvx_optval = -Inf * ones( sx );\r\nelseif any( sx == 0 ),\r\n    cvx_optval = zeros( sx );\r\nend\r\n\r\npersistent polynomials tolerances offsets tols_lse2 xmax_lse2 poly_lse2;\r\nif isempty( offsets ),\r\n    tolerances = [ ...\r\n        +1.097023849927867e-002 ...\r\n        +1.721590099806229e-003 ...\r\n        +2.812158802287952e-004 ...\r\n        +4.429114094399135e-005 ...\r\n        +7.148558948619577e-006 ...\r\n        +1.231310346831937e-006 ...\r\n    ];\r\n    offsets = [ ...\r\n        +4.587509890238436e+000 ...\r\n        +6.416928175755245e+000 ...\r\n        +8.229687874643302e+000 ...\r\n        +1.008049537132034e+001 ...\r\n        +1.191991494339686e+001 ...\r\n        +1.369797783724949e+001 ...\r\n    ];\r\n    polynomials = { ...\r\n        [+1.366158644955694e-001,+2.883850897160668e-001,+2.623847409587327e-001,+2.061297910417373e-001,+1.064845137988183e-001], ...\r\n        [+7.816587775500264e-002,+1.772675324993043e-001,+1.751223611165395e-001,+1.868180367534688e-001,+2.061693656978195e-001,+1.350536359519012e-001,+4.140319049786734e-002], ...\r\n        [+4.488353591809181e-002,+1.104412004313922e-001,+1.079322498484279e-001,+1.211618304290446e-001,+1.915334757023368e-001,+2.021823414978708e-001,+1.393582785497204e-001,+6.607402177632382e-002,+1.643306938125711e-002], ...\r\n        [+2.814490873415288e-002,+7.107594785846445e-002,+6.206052968585951e-002,+6.721607718419953e-002,+1.457271383815143e-001,+1.945852689115283e-001,+1.756342044070035e-001,+1.342590824420419e-001,+8.195601028303283e-002,+3.284154259643590e-002,+6.499356237673634e-003], ...\r\n        [+1.801637612736961e-002,+4.586559423151913e-002,+3.384999962721969e-002,+3.241317603008043e-002,+1.027247814175989e-001,+1.601733028401698e-001,+1.618047203594099e-001,+1.541310400190613e-001,+1.351534667914612e-001,+9.207809085897611e-002,+4.587132947107905e-002,+1.533534861989494e-002,+2.582945905589078e-003], ...\r\n        [+1.120952456372942e-002,+2.878673733676522e-002,+1.745388744605725e-002,+1.257946442836477e-002,+6.862411666662194e-002,+1.212531261391436e-001,+1.280824998847647e-001,+1.379104300046541e-001,+1.513029046523293e-001,+1.356592949614772e-001,+9.740481865550699e-002,+5.653968254890129e-002,+2.486163130624700e-002,+7.270708398065873e-003,+1.061270861357674e-003], ...\r\n    };\r\n    tols_lse2 = [ ...\r\n        +2.604710921123930e-003 ...\r\n        +2.023606501605798e-003 ...\r\n        +7.186272440111206e-004 ...\r\n        +1.650184739680674e-004 ...\r\n        +2.711947820394637e-005 ...\r\n        +6.626536813461173e-006 ...\r\n    ];\r\n    xmax_lse2 = [ ...\r\n        +3.016052268759351e+000 ...\r\n        +3.147392938371973e+000 ...\r\n        +3.646024500530143e+000 ...\r\n        +4.380570181812147e+000 ...\r\n        +5.293529886795310e+000 ...\r\n        +5.988203932237162e+000 ...\r\n    ];\r\n    poly_lse2 = { ...\r\n        [+8.159111798406757e-002,-2.088766265150633e-001,+2.184646092892881e-001,+1.371376204482131e+000,+1.556101674388225e+000], ...\r\n        [+3.334630057313453e-004,-1.060375441845846e-002,+9.715435406796991e-002,-2.096639262924454e-001,+2.088580308017964e-001,+1.447390559617362e+000,+1.615947818063521e+000], ...\r\n        [+6.785143656818839e-003,+2.461201556871129e-002,-3.880975391764840e-002,-8.177792840262915e-002,+1.971962632643551e-001,-1.977691864994194e-001,+1.556732730938031e-001,+1.731373759332839e+000,+1.849459541179112e+000], ...\r\n        [+1.750842286021084e-002,+1.111985771776053e-002,-9.551682490920249e-002,+2.838017966662204e-002,+1.383678902923077e-001,-1.739700557712566e-001,+1.544268632772164e-001,-1.573031365076512e-001,+1.194780681395583e-001,+2.135484657435186e+000,+2.202759265472971e+000], ...\r\n        [+2.654151273601881e-002,-1.332036618151814e-002,-1.163329680305297e-001,+1.166465460844204e-001,+8.891035020671029e-002,-1.666006712102975e-001,+1.126715728840250e-001,-1.311132963495887e-001,+1.602149050147826e-001,-1.258789281605399e-001,+6.955806786045883e-002,+2.620468791080553e+000,+2.651791472377042e+000], ...\r\n        [+4.767691370849323e-002,-6.696121312219248e-002,-1.342731459018708e-001,+2.436059791387181e-001,+4.093723652936038e-002,-2.132048441979625e-001,+6.860071867460910e-002,-3.577798568743423e-002,+1.436202524622697e-001,-1.720098314357508e-001,+1.328392919340422e-001,-8.719393191264979e-002,+4.466662307495772e-002,+2.979073449755230e+000,+2.996611030953293e+000], ...\r\n    };\r\nend\r\n\r\n%\r\n% Determine the computation method.\r\n%\r\n\r\nnlevs  = ceil(log2(nx));\r\ndectol = - nlevs * log( 1 - 2 * tolerances );\r\nlintol = - log( 1 - nx * tolerances );\r\nls2tol = + nlevs * tols_lse2;\r\ndegs = [ min([find(ls2tol<=tol),Inf]), min([find(dectol<=tol),Inf]), min([find(lintol<=tol),Inf]) ];\r\nif all( isinf( degs ) ),\r\n    tmax = min( [ lintol(end), ls2tol(end), dectol(end) ] );\r\n    error( 'A polynomial of required accuracy (%g) has not been supplied.\\nConsider raising the tolerance to %g or greater to proceed.', tol, tmax );\r\nend\r\nnnx = nx;\r\nnpairs = 0;\r\nfor k = 1 : nlevs,\r\n    npairs = npairs + floor( 0.5 * nnx );\r\n    nnx = ceil( 0.5 * nnx );\r\nend\r\ncplx = ( 0.5 .* ( degs + 2 ) .* ( degs + 3 ) + [ 4, 2, 2 ] ) .* [ npairs, 2 * npairs, nx ];\r\n[ cmin, dndx ] = min( cplx ); %#ok\r\nuse_lse2 = dndx == 1;\r\nif use_lse2,\r\n    xoff = xmax_lse2(degs(1));\r\n    p = poly_lse2{degs(1)};\r\nelse\r\n    xoff = offsets(degs(dndx));\r\n    p = polynomials{degs(dndx)};\r\n    if dndx == 3, npairs = 1; end\r\nend\r\n\r\n%\r\n% Quick exits\r\n%\r\n\r\nif nx == 1,\r\n    cvx_optval = x;\r\n    return;\r\nelseif any( sx == 0 ),\r\n    sx( dim ) = 1;\r\n    cvx_optval = -Inf * ones( sx );\r\n    return\r\nend\r\n\r\n%\r\n% Permute the matrix, if needed, so the geometric mean can be taken\r\n% along the first dimension.\r\n%\r\n\r\nif dim > 1 && any( sx( 1 : dim - 1 ) > 1 ),\r\n    perm = [ dim, 1 : dim - 1, dim + 1 : length( sx ) ];\r\n    x = permute( x, perm );\r\n    sx = sx( perm );\r\n    dim = 1;\r\nelse\r\n    perm = [];\r\nend\r\nnv = prod( sx ) / nx;\r\nx = reshape( x, nx, nv );\r\n\r\n%\r\n% Perform the computation.\r\n%\r\n\r\ncvx_begin sdp separable\r\n    epigraph variable y( 1, nv )\r\n    if npairs > 1,\r\n        variable xtemp( npairs - 1, nv );\r\n        xq = reshape( [ x ; xtemp ], 2, npairs * nv );\r\n        yq = reshape( [ xtemp ; y ], 1, npairs * nv );\r\n    else\r\n        xq = x;\r\n        yq = y;\r\n    end\r\n    if use_lse2,\r\n        xq = cvx_accept_convex( xq );\r\n        variables w( 1, npairs * nv ) v( 1, npairs * nv )\r\n        abs( [0.5,-0.5]*xq ) <= w + v; %#ok\r\n        w <= xoff; %#ok\r\n        v >= 0; %#ok\r\n        poly_env( p, w / ( 0.5 * xoff ) - 1 ) + v + [0.5,0.5]*xq <= yq; %#ok\r\n    else\r\n        xy = xq - ones(size(xq,1),1) * yq;\r\n        xy = max( xy, - xoff );\r\n        xy = cvx_accept_convex( xy );\r\n        sum( poly_env( p, xy / ( 0.5 * xoff ) + 1 ), 1 ) <= 1; %#ok\r\n    end\r\ncvx_end\r\n\r\n%\r\n% Reverse the reshaping and permutation steps\r\n%\r\n\r\nsx( dim ) = 1;\r\ncvx_optval = reshape( cvx_optval, sx );\r\nif ~isempty( perm ),\r\n    cvx_optval = ipermute( cvx_optval, perm );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc. \r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/matrix_frac.m",
    "content": "function z = matrix_frac( x,Y )\n\n%MATRIX_FRAC   Matrix fractional function.\n%     MATRIX_FRAC(x,Y), where Y is a square matrix and x is a vector of the\n%     same size, computes x'*(inv(Y)*x) if Y is Hermitian positive definite, and\n%     +Inf otherwise.\n%\n%     An error results if Y is not a square matrix, or the size of\n%     the vector x does not match the size of matrix Y.\n%\n%     Disciplined convex programming information:\n%         MATRIX_FRAC is convex and nonmonotonic (at least with respect to\n%         elementwise comparison), so its argument must be affine.\n\nnarginchk(2,2);\nif ndims( Y ) > 2 || size( Y, 1 ) ~= size( Y, 2 ), %#ok\n    error( 'Second argument must be a square matrix.' );\nend\nerr = Y - Y';\nY   = 0.5 * ( Y + Y' );\nif norm( err, 'fro' ) > 8 * eps * norm( Y, 'fro' ),\n    z = Inf;\nelse\n    [R,p] = chol(Y);\n    if p > 0,\n        [V,D] = eig(full(Y));\n        D = diag(D);\n        if any( D <= 0 )\n            z = Inf;\n        else\n            z = V' * x;\n            z = z' * ( D .\\ z );\n        end\n    else\n        z = R' \\ x;\n        z = z' * z;\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/norm_largest.m",
    "content": "function cvx_optval = norm_largest( x, k )\n\n%NORM_LARGEST Sum of the k largest magnitudes of a vector.\n%   NORM_LARGEST( X, k ) computes the 'largest-k' norm; that is, it computes\n%   the sum of the magnitudes of the k largest elements in X. X must\n%   be a vector, and k must be a real scalar.\n%\n%   Disciplined convex programming information:\n%       NORM_LARGEST is convex and nonmonotonic of X, though it is monotonic for\n%       positive values of X. So when used in CVX expressions, X must be affine,\n%       monomial, or posynomial. k must be a real scalar constant.\n\nnarginchk(2,2);\nif ~any( size( x ) ~= 1 ),\n    error( 'The first argument must be a vector.' );\nelseif ~isnumeric( k ) || ~isreal( k ) || length( k ) ~= 1,\n    error( 'Third argument must be a scalar.' );\nelse\n    cvx_optval = sum_largest( abs( x ), k );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/norm_nuc.m",
    "content": "function z = norm_nuc( x )\n\n%NORM_NUC   Nuclear norm of a matrix.\n%   NORM_NUC(X) = SUM(SVD(X)). X must be a 2-D matrix, real or complex.\n%\n%   Disciplined convex programming information:\n%       NORM_NUC(X) is convex and nonmontonic in X, so X must be affine.\n\nnarginchk(1,1);\nz = sum(svd(x));\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/norms.m",
    "content": "function cvx_optval = norms( x, p, dim )\n\n%NORMS   Computation of multiple vector norms.\n%   NORMS( X ) provides a means to compute the norms of multiple vectors\n%   packed into a matrix or N-D array. This is useful for performing\n%   max-of-norms or sum-of-norms calculations.\n%\n%   All of the vector norms, including the false \"-inf\" norm, supported\n%   by NORM() have been implemented in the NORMS() command.\n%     NORMS(X,P)           = sum(abs(X).^P).^(1/P)\n%     NORMS(X)             = NORMS(X,2).\n%     NORMS(X,inf)         = max(abs(X)).\n%     NORMS(X,-inf)        = min(abs(X)).\n%   If X is a vector, these computations are completely identical to\n%   their NORM equivalents. If X is a matrix, a row vector is returned\n%   of the norms of each column of X. If X is an N-D matrix, the norms\n%   are computed along the first non-singleton dimension.\n%\n%   NORMS( X, [], DIM ) or NORMS( X, 2, DIM ) computes Euclidean norms\n%   along the dimension DIM. NORMS( X, P, DIM ) computes its norms\n%   along the dimension DIM.\n%\n%   Disciplined convex programming information:\n%       NORMS is convex, except when P<1, so an error will result if these\n%       non-convex \"norms\" are used within CVX expressions. NORMS is\n%       nonmonotonic, so its input must be affine.\n\n%\n% Check second argument\n%\n\nnarginchk(1,3);\nif nargin < 2 || isempty( p ),\n    p = 2;\nelseif ~isnumeric( p ) || numel( p ) ~= 1 || ~isreal( p ),\n    error( 'Second argument must be a real number.' );\nelseif p < 1 || isnan( p ),\n    error( 'Second argument must be between 1 and +Inf, inclusive.' );\nend\n    \n%\n% Check third argument\n%\n\nsx = size( x );\nif nargin < 3 || isempty( dim ),\n    dim = cvx_default_dimension( sx );\nelseif ~cvx_check_dimension( dim, false ),\n    error( 'Third argument must be a valid dimension.' );\nelseif isempty( x ) || dim > length( sx ) || sx( dim ) == 1,\n    p = 1;\nend\n\n%\n% Compute the norms\n%\n\nswitch p,\n    case 1,\n        cvx_optval = sum( abs( x ), dim );\n    case 2,\n        cvx_optval = sqrt( sum( x .* conj( x ), dim ) );\n    case Inf,\n        cvx_optval = max( abs( x ), [], dim );\n    otherwise,\n        cvx_optval = sum( abs( x ) .^ p, dim ) .^ ( 1 / p );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/norms_largest.m",
    "content": "function cvx_optval = norms_largest( x, k, dim )\n\n%NORMS_LARGEST Computation of multiple norm_largest() norms.\n%   NORMS_LARGEST( X, K, DIM ) provides a means to compute the largest-k\n%   norms of multiple vectors packed into a matrix or N-D vector. This is\n%   useful for performing max-of-norms or sum-of-norms calculations.\n%\n%   If DIM is omitted, the norms are computed along the first non-singleton\n%   dimension. \n%\n%   See NORM_LARGEST.\n%\n%   Disciplined convex programming information:\n%       NORMS_LARGEST is convex and non-monotonic, so its input must be affine.\n\nnarginchk(2,3);\nsx = size( x );\n\n%\n% Check second argument\n%\n\nif ~isnumeric( k ) || ~isreal( k ) || length( k ) ~= 1,\n    error( 'Second argument must be a real scalar.' );\nend\n\n%\n% Check third argument\n%\n\nif nargin < 3 || isempty( dim ),\n    dim = cvx_default_dimension( sx );\nelseif ~cvx_check_dimension( dim, false ),\n    error( 'Third argument must be a valid dimension.' );\nend\n\n%\n% Perform computation\n%\n\ncvx_optval = sum_largest( abs( x ), k, dim );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/poly_env.m",
    "content": "function y = poly_env( p, x )\n\n%POLY_ENV Evaluate the convex or concave envelope of a polynomial.\n%   POLY_ENV( P, X ) uses a semidefinite program to compute the value of the\n%   convex or concave envelope of the polynomial represented by the vector\n%   P. The format of the vector P is identical to that required by POLYVAL,\n%   with two additional restrictions. First, the elements of P must be real\n%   and finite. Second, the length of P must 0, 2, or odd (1,3,5,...)\n%\n%   If the polynomial described by P is convex or concave, then a call to\n%   POLY_ENV( P, X ) produces the same result as POLYVAL( P, X ).\n%\n%   POLY_ENV looks at the first nonzero element of P (presumably, but not\n%   necessarily, P(1)) to determine if a convex or concave envelope is to\n%   be selected. If P(1)>0, then a convex envelope is produced---i.e., the\n%   function that is the tightest convex lower bound for POLYVAL(P,X).\n%   Otherwise, a concave envelope is produced---the function that is the\n%   tightest concave upper bound for POLYVAL(P,X).\n%\n%   If the degree N of P is odd---except for the special case N==1---no\n%   proper convex/concave envelope exists. Therefore, POLY_ENV returns an\n%   error in such cases.\n%\n%   If X is an array, the result will be computed elementwise.\n%\n%   Disciplined convex programming information:\n%       POLY_ENV(P,X) is convex or concave and nonmotonic in X; therefore,\n%       in CVX expressions, X must be affine, unless the polynomial \n%       described by P has a degree of 0 or 1. P must be constant.\n\n%\n% Check the polynomial\n%\n\nsp = size( p );\nif isempty( p ),\n    p = zeros( 1, 0 );\nelseif ~isa( p, 'double' ) || ~isreal( p ) || length( sp ) > 2 || ~any( sp == 1 ),\n    error( 'First argument must be a non-empty real vector.' );\nelseif any( isnan( p ) | isinf( p ) ),\n    error( 'Inf and NaN not accepted here.' );\nend\nn = prod( sp );\nif n > 2 && rem( n, 2 ) == 0,\n    error( 'The length of the vector p must be odd.' );\nend\n\n%\n% Check the second argument\n%\n\nif n > 1 && ( ~cvx_isaffine( x ) || ~isreal( x ) ),\n    error( 'The second argument must be real and affine.' );\nend\n\n%\n% Handle the special cases\n%\n\nsx = size( x );\nndxs = find( p );\nif isempty( ndxs ),\n    y = zeros( sx );\n    return\nelse\n    for k = ndxs(:)',\n        pt = p( k : end );\n        if ~any( isinf( pt ./ pt(1) ) ),\n            p = pt;\n            break;\n        end\n    end\nend\nn = length( p );\nswitch n,\n    case 0,\n        y = zeros(sx);\n        return\n    case 1,\n        y = p(1) * ones(sx);\n        return\n    case 2,\n        y = p(1) * x + p(2);\n        return\n    case 3,\n        % Quadratic\n        b2a = p(2) ./ ( 2 * p(1) );\n        y = p(1) * ( square( x + b2a ) - b2a * b2a ) + p(3);\n        return\n    otherwise,\n        if all( p(2:end) == 0 ),\n            y = p(1) * ( x .^ (n-1) ) + p(end);\n            return\n        end\nend\n\n%\n% Build and solve the SDP\n%\n\ndegr  = n - 1;\ndeg2  = 0.5 * degr + 1;\nnv    = prod( sx );\npsign = sign(p(1));\np     = psign * reshape( p, 1, n );\ncvx_begin sdp separable\n    epigraph variable y(sx);\n    variable P(deg2,deg2,sx) hankel;\n    P >= 0; %#ok\n    1 == P(1,1,:); %#ok\n    x == reshape( P(2,1,:), sx ); %#ok\n    y == reshape( p(end:-1:1) * [ reshape( P(1,:,:), deg2, nv ) ; reshape( P(2:end,end,:), deg2-1, nv ) ], sx ); %#ok\ncvx_end\n\ny = cvx_optval * psign;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/polyenv.m",
    "content": "function y = polyenv( varargin )\n\n%POLYENV Evaluate the convex or concave envelope of a polynomial.\n%   We have replaced this function with POLY_ENV to better match our\n%   function naming conventions. Please start using it instead.\n\nwarning( 'CVX:Renamed', [ ...\n    'The function \"polyenv\" has been renamed \"poly_env\". Please start using\\n', ...\n    'the new name. The old name will be removed in a future release.' ], 1 ); \n           \ny = poly_env( varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/polyval_trig.m",
    "content": "function y = polyval_trig( p, x )\n\n%POLYVAL_TRIG Evaluate a trigonometric polynomial.\n%   Y = POLYVAL_TRIG(P,X) returns the value of a trigonometric polynomial P\n%   evaluated at X. P is a vector of length N+1 whose elements are the\n%   coefficients of the polynomial in descending powers.\n%\n%       Y = REAL(P(1)*W^N + P(2)*W^(N-1) + ... + P(N)*W + P(N+1))\n% \n%   where W = EXP(-SQRT(-1)*X). For real X, this equals\n%\n%       Y = REAL(P(1))*COS(W*N)+IMAG(P(1))*SIN(W*N) + ...\n%              REAL(P(2))*COS(W*(N-1))+IMAG(P(2))*SIN(W*(N-1)) + ...\n%              ... + REAL(P(N))*COS(W) + IMAG(P(N))*SIN(W) + REAL(P(N+1)).\n%\n%   Note that IMAG(P(N+1)) is ignored. If X is a matrix or vector, the\n%   polynomial is evaluated at all points in X.\n%\n%   Disciplined convex programming information:\n%       POLYVAL_TRIG is linear in P and nonconvex/nonconcave in X.\n%       Therefore, when used in CVX specifications, P must be affine and\n%       X must be constant. Certain values of X may allow P to be convex\n%       or concave as well, but not so for all values of X.\n\nsp = size( p );\nif isempty( p ),\n    p = zeros( 1, 0 );\nelseif length( sp ) > 2 || ~any( sp == 1 ),\n    error( 'First argument must be a vector.' );\nend\nn = length( p );\nsx = size(x);\n\nif ~cvx_isconstant( x ),\n    error( 'Second argument must be constant.' );\nelse\n    x = cvx_constant( x );\nend\n\nnx = numel( x );\nxx = reshape( x, nx, 1 );\n[ ii, jj, vv ] = find( p );\nnv = length( vv );\nvv = reshape( vv, nv, 1 );\nxx = xx * reshape( n - ( ii + jj - 1 ), 1, nv );\nxx = exp( sqrt(-1) * xx );\ny  = real( xx ) * real( vv ) + imag( xx ) * imag( vv );\ny  = reshape( y, sx );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/pos.m",
    "content": "function y = pos( x )\n\n% POS    Positive part.\n%    POS(X) = MAX(X,0). X must be real.\n%\n%    Disciplined convex programming information:\n%        POS(X) is convex and nondecreasing in X. Thus when used in CVX\n%        expressions, X must be convex (or affine).\n\nnarginchk(1,1);\nif ~isreal( x ),\n\n\terror( 'Argument must be real.' );\n\t\nelse\n\n\ty = max( x, 0 );\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/pow_abs.m",
    "content": "function y = pow_abs( x, p )\n\n%POW_POS   Power of absolute value.\n%   POW_POS(X,P) = ABS(X).^P. \n%   P must be real and greater than or equal to one.\n%\n%   Disciplined convex programming information:\n%       POW_ABS(X,P) is convex and nonmonotonic, so X must be affine.\n%       P must be constant, and its elements must be greater than or\n%       equal to one. X may be complex.\n\nnarginchk(2,2);\nif ~isnumeric( x ) || ~isnumeric( p ),\n    error( 'Arguments must be numeric.' );\nelseif ~isreal( p ),\n    error( 'Second argument must be real.' );\nelseif any( p(:) < 1 ),\n    error( 'Second argument must be greater than or equal to one.' );\nend\ny = abs(x).^p;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/pow_p.m",
    "content": "function y = pow_p( x, p )\n\n%POW_P   Positive branch of the power function.\n%   POW_P(X,P) computes a convex or concave branch of the power function:\n%           P < 0: POW_P(X,P) = X.^P if X >  0, +Inf otherwise\n%      0 <= P < 1: POW_P(X,P) = X.^P if X >= 0, -Inf otherwise\n%      1 <= P    : POW_P(X,P) = X.^P if X >= 0, +Inf otherwise\n%   Both P and X must be real.\n%\n%   Disciplined convex programming information:\n%       The geometry of POW_P(X,P) depends on the precise value of P,\n%       which must be a real constant:\n%                P < 0: convex  and nonincreasing; X must be concave.\n%           0 <= P < 1: concave and nondecreasing; X must be concave.\n%           1 <= P    : convex  and nonmonotonic;  X must be affine.\n%       In all cases, X must be real.\n\nnarginchk(2,2);\nif ~isnumeric( x ) || ~isreal( x ) || ~isnumeric( p ) || ~isreal( p ),\n    error( 'Arguments must be real.' );\nend\ny  = x .^ p;\ny( x < 0 & ( p >= 0 & p <  1 ) ) = -Inf;\ny( x < 0 & ( p <  0 | p >= 1 ) ) = +Inf;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/pow_pos.m",
    "content": "function y = pow_pos( x, p )\n\n%POW_POS   Power of positive part.\n%   POW_POS(X,P) = POS(X).^P = MAX(X,0).^P.\n%   Both P and X must be real, and P must be greater than or equal to 1.\n%\n%   Disciplined convex programming information:\n%       POW_POS(X,P) is convex and nondecreasing in X; so when used in CVX\n%       expressions, X must be convex. P must be constant, real, and\n%       greater than or equal to 1.\n\nnarginchk(2,2);\nif ~isnumeric( x ) || ~isreal( x ) || ~isnumeric( p ) || ~isreal( p ),\n    error( 'Arguments must be real.' );\nelseif any( p(:) <= 1 ),\n    error( 'Second argument must be greater than or equal to 1.\\nFor other exponents, use POW_P instead.', 1 ); %#ok\nend\ny = max(x,0).^p;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/prod_inv.m",
    "content": "function cvx_optval = prod_inv( x, dim, p )\n\n%PROD_INV inverse of the product of a positive vector.\n%   For a real vector, matrix, or X, PROD_INV(X) returns 1.0 ./ PROD(X) if\n%   the elements of X are all positive, and +Inf otherwise.\n%\n%   For matrices, PROD_INV(X) is a row vector containing the inverse\n%   product of each column of X. For N-D arrays, PROD_INV(X) is an array of\n%   inverse products taken along the first non-singleton dimension of X.\n%\n%   PROD_INV(X,DIM) takes inverse products along the dimension DIM of X.\n%\n%   PROD_INV(X,DIM,P), where P is a positive real constant, computes\n%   PROD_INV(X).^P. This is slightly more efficient than the equivalent\n%   POW_POS(PROD_INV(X),P).\n%\n%   Disciplined convex programming information:\n%       PROD_INV(X) is convex and nonincreasing in X; therefore, when used\n%       in CVX specifications, its argument must be concave or affine.\n\nnarginchk(1,3);\nif ~isreal( x ), \n    error( 'First argument must be real.' ); \nelseif nargin < 2,\n    dim = cvx_default_dimension( size( x ) );\nelseif ~cvx_check_dimension( dim ),\n    error( 'Second argument must be a positive integer.' );\nend\nif nargin < 2,\n    p = 1;\nelseif ~isnumeric( p ) || ~isreal( p ) || numel( p ) ~=  1 || p <= 0,\n    error( 'Third argument must be a positive scalar.' );\nend\ntt = any( x < 0, dim );\ncvx_optval = prod( x, dim ) .^ (-p);\ncvx_optval(tt) = +Inf;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/quad_form.m",
    "content": "function y = quad_form( x, Q, v, w )\n\n%QUAD_FORM quadratic form.\n%   QUAD_FORM(x,Q) is real(x'*Q*x) = x'*((Q+Q')/2)*x.\n%   QUAD_FORM(x,Q,v,w) is real(x'*(Q*x+v)+w).\n%\n%   x must be a row or column vector, and Q must either be a scalar or\n%   a square matrix with the same number of rows as x. If supplied, v must\n%   be a scalar or a vector of the same size as x, and w must be a scalar.\n%  \n%   NOTE: The use of QUAD_FORM can often be replaced by a call to NORM. For\n%   example, if Q is positive definite, then the constraint\n%       quad_form(x,Q) <= 1\n%   is equivalent to\n%       norm(sqrtm(Q)*x) <= 1\n%   Generally speaking, the NORM version will be more reliable and more\n%   accurate, so we encourage you to make similar conversions whenever\n%   possible. We *strongly* discourage the QP-era practice of converting\n%   NORM expressions into quadratic forms. \n%\n%   Disciplined convex programming information:\n%       QUAD_FORM(x,Q,v,w) is neither convex nor concave in x and (Q,v)\n%       jointly, so at least one of the two must be constant.\n%\n%       If (Q,v) is constant, then QUAD_FORM is convex if Q is positive\n%       semidefinite, and concave if Q is negative semidefinite. An error \n%       is generated if Q is indefinite (unless x is also constant). \n%       QUAD_FORM is nonmonotonic in x, so x must be affine.\n%       \n%       If x is constant, then QUAD_FORM is affine in Q, v, and w. The\n%       signs of x will govern whether the elements of Q, v, and w may\n%       be convex, concave, or affine.\n\nnarginchk(2,4);\nsx = size( x );\nif length( sx ) ~= 2 || all( sx ~= 1 ),\n    error( 'The first argument must be a vector.' );\nelse\n    sx = prod( sx );\nend\nif ndims( Q ) > 2 || size( Q, 1 ) ~= size( Q, 2 ), %#ok\n    error( 'The second argument must be a scalar or a square matrix.' );\nelseif all( size( Q, 1 ) ~= [ 1, sx ] ),\n    error( 'The size of Q is incompatible with the size of x.' );\nend\nif nargin < 3,\n    v = 0;\nelseif ndims( v ) > 2 || all( size( v ) ~= 1 ), %#ok\n    error( 'The third argument must be a vector.' );\nelseif all( numel( v ) ~= [ 1, sx ] ),\n    error( 'The size of v is incompatible with the size of x.' );\nend\nif nargin < 4,\n    w = 0;\nelseif numel( w ) > 1,\n    error( 'The fourth argument must be a real scalar.' );\nend\nif sx == 0,\n    y = real( w );\nelse\n    x = x( : );\n    v = v( : );\n    y = real( x' * ( Q * x + v ) + w );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/quad_over_lin.m",
    "content": "function z = quad_over_lin( x, y, dim )\n\n%QUAD_OVER_LIN Sum of squares over linear.\n%   Z=QUAD_OVER_LIN(X,Y), where X is a vector and Y is a scalar, is equal to\n%   SUM(ABS(X).^2)./Y if Y is positive, and +Inf otherwise. Y must be real.\n%\n%   If X is a matrix, QUAD_OVER_LIN(X,Y) is a row vector containing the values\n%   of QUAD_OVER_LIN applied to each column. If X is an N-D array, the operation\n%   is applied to the first non-singleton dimension of X.\n%\n%   QUAD_OVER_LIN(X,Y,DIM) takes the sum along the dimension DIM of X.\n%   A special value of DIM == 0 is accepted here, which is automatically\n%   replaced with DIM == NDIMS(X) + 1. This has the effect of eliminating\n%   the sum; thus QUAD_OVER_LIN( X, Y, NDIMS(X) + 1 ) = ABS( X ).^2 ./ Y.\n%\n%   In all cases, Y must be compatible in the same sense as ./ with the squared\n%   sum; that is, Y must be a scalar or the same size as SUM(ABS(X).^2,DIM).\n%\n%   Disciplined convex programming information:\n%       QUAD_OVER_LIN is convex, nonmontonic in X, and nonincreasing in Y.\n%       Thus when used with CVX expressions, X must be convex (or affine)\n%       and Y must be concave (or affine).\n\n%\n% Check arguments\n%\n\nnarginchk(2,3);\nif ~isreal( y ),\n    error( 'Second argument must be real.' );\nelseif nargin < 3 || isempty( dim ),\n    dim = cvx_default_dimension( size( x ) );\nelseif ~cvx_check_dimension( dim, true ),\n    error( 'Third argument, if supplied, must be a positive integer.' );\nelseif dim == 0,\n    dim = ndims( x ) + 1;\nend\n\n%\n% Perform calculation\n%\n\nz = sum_square_abs( x, dim );\nif length( y ) ~= 1 && ~isequal( size( z ), size( y ) ),\n    error( 'Input size mismatch.' );\nend\ntemp = y <= 0;\ninf_fix = any( temp );\nif inf_fix,\n    y( temp ) = 1;\nend\nz = z ./ y;\nif inf_fix,\n    z( temp ) = +Inf;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/quad_pos_over_lin.m",
    "content": "function z = quad_pos_over_lin( x, y, dim )\n\n%QUAD_POS_OVER_LIN Sum of squares of positives over linear.\n%   Z=QUAD_POS_OVER_LIN(X,Y), where X is a vector and Y is a scalar, is equal to\n%   SUM(MAX(X,0).^2)./Y if Y is positive, and +Inf otherwise. Both X and Y must\n%   be real.\n%\n%   For matrices, QUAD_POS_OVER_LIN(X,Y) is a row vector containing the \n%   application of QUAD_POS_OVER_LIN to each column. For N-D arrays, the\n%   operation is applied to the first non-singleton dimension of X.\n%\n%   QUAD_POS_OVER_LIN(X,Y,DIM) takes the sum along the dimension DIM of X. \n%   A special value of DIM == 0, is accepted here, which is automatically\n%   replaced with DIM == NDIMS(X) + 1. This has the effect of eliminating\n%   the sum; thus QUAD_POS_OVER_LIN( X, Y, NDIMS(X) + 1 ) = MAX(X,0).^2./Y.\n%\n%   In all cases, both X and Y must be real, and Y must either be a scalar \n%   or a matrix of the same size as SUM(X,DIM).\n%\n%   Disciplined convex programming information:\n%       QUAD_POS_OVER_LIN is convex, nondecreasing in X, and nonincreasing \n%       in Y. Thus when used with CVX expressions, X must be convex (or \n%       affine) and Y must be concave (or affine).\n\n%\n% Check arguments\n%\n\nnarginchk(2,3);\nif ~isreal( x ),\n    error( 'First argument must be real.' ); \nelseif ~isreal( y ),\n    error( 'Second argument must be real.' ); \nelseif nargin < 3 || isempty( dim ),\n    dim = cvx_default_dimension( size( x ) );\nelseif ~cvx_check_dimension( dim ),\n    error( 'Third argument, if supplied, must be a positive integer.' );\nend\n\n%\n% Perform calculation\n%\n\nz = quad_over_lin( max( x, 0 ), y, dim );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/rel_entr.m",
    "content": "function z = rel_entr( x, y )\n\n%REL_ENTR   Scalar relative entropy.\n%   REL_ENTR(X,Y) returns an array of the same size as X+Y with the \n%   relative entropy function applied to each element:\n%                      { X.*LOG(X./Y) if X >  0 & Y >  0,\n%      REL_ENTR(X,Y) = { 0            if X == 0 & Y >= 0,\n%                      { +Inf         otherwise.\n%   X and Y must either be the same size, or one must be a scalar. If X and\n%   Y are vectors, then SUM(REL_ENTR(X,Y)) returns their relative entropy.\n%   If they are PDFs (that is, if X>=0, Y>=0, SUM(X)==1, SUM(Y)==1) then\n%   this is equal to their Kullback-Liebler divergence SUM(KL_DIV(X,Y)).\n%   -SUM(REL_ENTR(X,1)) returns the entropy of X.\n%\n%   Disciplined convex programming information:\n%       REL_ENTR(X,Y) is convex in both X and Y, nonmonotonic in X, and\n%       nonincreasing in Y. Thus when used in CVX expressions, X must be\n%       real and affine and Y must be concave. The use of REL_ENTR(X,Y) in\n%       an objective or constraint will effectively constrain both X and Y \n%       to be nonnegative, hence there is no need to add additional\n%       constraints X >= 0 or Y >= 0 to enforce this.\n\nnarginchk(2,2);\nif ~isreal( x ) || ~isreal( y ),\n    error( 'Arguments must be real.' );\nend\nt1 = x < 0  | y <= 0;\nt2 = x == 0 & y >= 0;\nx  = max( x, realmin );\ny  = max( y, realmin );\nz  = x .* log( x ./ y );\nz( t1 ) = +Inf;\nz( t2 ) = 0;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/sigma_max.m",
    "content": "function z = sigma_max( x )\n\n%SIGMA_MAX    Maximum singular value.\n%   SIGMA_MAX(X) returns the maximum singular value of X. X must be a 2-D\n%   matrix, real or complex. SIGMA_MAX(X) is synonymous with NORM(X).\n%\n%   Disciplined convex programming information:\n%       SIGMA_MAX(X) is convex and nonmontonic in X, so X must be affine.\n\nnarginchk(1,1);\nz = norm( x, 2 );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/square_/square.m",
    "content": "function y = square( x )\n\n%SQUARE    Square.\n%   SQUARE(X) is an array of the same size as X, whose elements are the\n%   squares of the elements of X.\n%\n%   Disciplined convex programming information:\n%       If X is real, then SQUARE(X) is convex and nonmonotonic in X. If X\n%       is complex, then SQUARE(X) is neither convex nor concave. Thus when\n%       when use in CVX expressions, X must be real and affine.\n\nnarginchk(1,1);\ny = x .* x;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/square_abs.m",
    "content": "function y = square_abs( x )\n\n%SQUARE_ABS   Square of absolute value.\n%   For real X, SQUARE_ABS(X) produces the same result as SQUARE(X); that\n%   is, it squares the elements of X. For complex X, SQUARE_ABS(X) returns\n%   a real array whose elements are the squares of the magnitudes of the\n%   elements of X; that is, SQUARE_ABS(X) = CONJ(X).*X.\n%\n%   Disciplined convex programming information:\n%       SQUARE_ABS(X) is convex and nonmonotonic in X. Thus when used in \n%       CVX expressions, X must be affine.\n\nnarginchk(1,1);\ny = conj( x ) .* x;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/square_pos.m",
    "content": "function y = square_pos( x )\n\n%SQUARE_POS    Square of positive part.\n%   SQUARE_POS(X) is the square of the postive parts of the elements of X;\n%   i.e., SQUARE_POS(X)=MAX(X,0).^2. X must be real.\n%\n%   Disciplined convex programming information:\n%       SQUARE_POS(X) is convex and nondecreasing in X. Thus when used in\n%       CVX expressions, X must be convex (or affine).\n\nnarginchk(1,1);\nif ~isreal( x ), \n    error( 'Argument must be real.' ); \nend\n\ny = square( max( x, 0 ) );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/sum_largest.m",
    "content": "function cvx_optval = sum_largest( x, k, dim )\n\n%SUM_LARGEST Sum of the largest k values of a vector.\n%   For a real vector X and an integer k between 1 and length(X) inclusive,\n%   y = SUM_LARGEST(X,k) is the sum of the k largest elements of X; e.g.,\n%       temp = sort( x )\n%       y = sum( temp( 1 : k ) )\n%   If k=1, then SUM_LARGEST(X,k) is equivalent to MAX(X); if k=length(X),\n%   then SUM_LARGEST(X,k) is equivalent to SUM(X).\n%\n%   Both X and k must be real, and k must be a scalar. But k is not, in\n%   fact, constrained to be an integer between 1 and length(X); the\n%   function is extended continuously and logically to all real k. For\n%   example, if k <= 0, then SUM_LARGEST(X,k)=0. If k > length(X), then\n%   SUM_LARGEST(X,k)=SUM(X). Non-integer values of k interpolate linearly\n%   between their integral neighbors.\n%\n%   For matrices, SUM_LARGEST(X,k) is a row vector containing the\n%   application of SUM_LARGEST to each column. For N-D arrays, the\n%   SUM_LARGEST operation is applied to the first non-singleton dimension\n%   of X.\n%\n%   SUM_LARGEST(X,k,DIM) performs the operation along dimension DIM of X.\n%\n%   Disciplined convex programming information:\n%       SUM_LARGEST(X,...) is convex and nondecreasing in X. Thus, when\n%       used in CVX expressions, X must be convex (or affine). k and DIM\n%       must both be constant.\n\n%\n% Check arguments\n%\n\nnarginchk(2,3);\nif ~isreal( x ),\n    error( 'First argument must be real.' );\nelseif ~isnumeric( k ) || ~isreal( k ) || length( k ) ~= 1,\n    error( 'Second argument must be a real scalar.' );\nelseif nargin < 3 || isempty( dim ),\n    dim = cvx_default_dimension( size( x ) );\nelseif ~cvx_check_dimension( dim, false ),\n    error( 'Third argument, if supplied, must be a positive integer.' );\nend\n\n%\n% Determine output size\n%\n\nsx = size( x );\nnd = max( dim, length( sx ) );\nsx = [ sx, ones( 1, dim - nd ) ];\nsy = sx;\nsy( dim ) = 1;\n\n%\n% Compute results\n%\n\nif k <= 0,\n\n    cvx_optval = zeros( sy );\n\nelseif k <= 1,\n\n    cvx_optval = k * max( x, [], dim );\n\nelseif k >= sx( dim ),\n\n    cvx_optval = sum( x, dim );\n\nelse\n\n    ck = ceil( k );\n    x = sort( x, dim );\n    ndxs = cell( 1, nd );\n    [ ndxs{:} ] = deal( ':' );\n    ndxs{ dim } = size( x, dim ) - ( 0 : ck - 1 );\n    x = x( ndxs{ : } );\n    if k ~= ck,\n        ndxs{ dim } = ck;\n        x( ndxs{ : } ) = ( k - floor( k ) ) * x( ndxs{ : } );\n    end\n    cvx_optval = sum( x, dim );\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/sum_log.m",
    "content": "function y = sum_log( x, dim )\n\n%SUM_LOG   Sum of logarithms.\n%   For vectors, SUM_LOG(X) is the sum of the logarithms of the elements of\n%   the vector; i.e., SUM(LOG(X)). If any of the elements of the vector are\n%   nonnegative, then the result is -Inf.\n%\n%   For matrices, SUM_LOG(X) is a row vector containing the application of\n%   SUM_LOG to each column. For N-D arrays, the SUM_LOG is applied to the\n%   first non-singleton dimension of X.\n%\n%   SUM_LOG(X,DIM) takes the sum along the dimension DIM of X.\n%\n%   SUM_LOG(X) could also be written SUM(LOG(X)). However, this version\n%   should be more efficient, because it involves only one logarithm.\n%\n%   Disciplined convex programming information:\n%       SUM_LOG(X) is concave and nondecreasing in X. Therefore, when used\n%       in CVX expressions, X must be concave. X must be real.\n\nnarginchk(1,2);\nif ~isreal( x ),\n    error( 'Argument must be real.' );\nelseif nargin == 2,\n    y = sum( log( max( x, 0 ) ), dim );\nelse\n    y = sum( log( max( x, 0 ) ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/sum_smallest.m",
    "content": "function cvx_optval = sum_smallest( x, varargin )\n\n%SUM_SMALLEST Sum of the smallest k elements of a vector.\n%   For a real vector X and an integer k between 1 and length(X) inclusive,\n%   y = SUM_SMALLEST(X,k) is the sum of the k smallest elements of X; e.g.,\n%       temp = sort( x )\n%       y = sum( temp( 1 : k ) )\n%   If k=1, then SUM_SMALLEST(X,k) is equivalent to MIN(X); if k=length(X),\n%   then SUM_SMALLEST(X,k) is equivalent to SUM(X).\n%\n%   Both X and k must be real, and k must be a scalar. But k is not, in\n%   fact, constrained to be an integer between 1 and length(X); the\n%   function is extended continuously and logically to all real k. For\n%   example, if k <= 0, then SUM_SMALLEST(X,k)=0. If k > length(X), then\n%   SUM_SMALLEST(X,k)=SUM(X). Non-integer values of k interpolate linearly\n%   between their integral neighbors.\n%\n%   For matrices, SUM_SMALLEST(X,k) is a row vector containing the\n%   application of SUM_SMALLEST to each column. For N-D arrays, the\n%   SUM_SMALLEST operation is applied to the first non-singleton dimension\n%   of X.\n%\n%   SUM_SMALLEST(X,k,DIM) performs the operation along dimension DIM of X.\n%\n%   Disciplined convex programming information:\n%       SUM_SMALLEST(X,...) is concave and nondecreasing in X. Thus, when\n%       used in CVX expressions, X must be concave (or affine). k and DIM\n%       must both be constant.\n\nnarginchk(2,3);\ncvx_optval = -sum_largest( -x, varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/sum_square.m",
    "content": "function y = sum_square( x, dim )\n\n%SUM_SQUARE   Sum of squares.\n%   For vectors, SUM_SQUARE(X) is the sum of the squares of the elements of\n%   the vector; i.e., SUM(X.^2).\n%\n%   For matrices, SUM_SQUARE(X) is a row vector containing the application\n%   of SUM_SQUARE to each column. For N-D arrays, the SUM_SQUARE operation\n%   is applied to the first non-singleton dimension of X.\n%\n%   SUM_SQUARE(X,DIM) takes the sum along the dimension DIM of X.\n%\n%   Disciplined convex programming information:\n%       If X is real, then SUM_SQUARE(X,...) is convex and nonmonotonic in\n%       X. If X is complex, then SUM_SQUARE(X,...) is neither convex nor\n%       concave. Thus, when used in CVX expressions, X must be affine. DIM\n%       must be constant.\n\nnarginchk(1,2);\ny = x .* x;\nif nargin == 2,\n    y = sum( y, dim );\nelse\n    y = sum( y );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/sum_square_abs.m",
    "content": "function y = sum_square_abs( x, dim )\n\n%SUM_SQUARE_ABS   Sum of the squares of absolute values.\n%   For real arrays, SUM_SQUARE_ABS(X) computes the same result as\n%   SUM_SQUARE(X). For complex arrays, SUM_SQUARE(X) first computes the\n%   magnitudes of the elements of X, so it compute SUM_SQUARE_ABS(X).\n%\n%   Similarly, SUM_SQUARE_ABS(X,DIM) implements SUM_SQUARE(ABS(X),DIM).\n%\n%   Disciplined convex programming information:\n%       SUM_SQUARE_ABS(X,...) is convex and nonmonotonic in X. Thus, when\n%       used in CVX expressions, X must be affine. DIM must be constant.\n\nnarginchk(1,2);\ny = conj( x ) .* x;\nif nargin == 2,\n    y = sum( y, dim );\nelse\n    y = sum( y );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/sum_square_pos.m",
    "content": "function y = sum_square_pos( x, dim )\n\n%SUM_SQUARE_POS   Sum of squares of the positive parts.\n%   For vectors, SUM_SQUARE(X) is the sum of the squares of the positive\n%   parts of X; i.e., SUM( MAX(X,0)^2 ). X must be real.\n%\n%   For matrices, SUM_SQUARE_POS(X) is a row vector containing the\n%   application of SUM_SQUARE_POS to each column. For N-D arrays, the\n%   SUM_SQUARE_POS operation is applied to the first non-singleton\n%   dimension of X.\n%\n%   SUM_SQUARE_POS(X,DIM) takes the sum along the dimension DIM of X.\n%\n%   Disciplined convex programming information:\n%       SUM_SQUARE_POS(X,...) is convex and nondecreasing in X. Thus, when\n%       used in CVX expressions, X must be convex (or affine). DIM must\n%       always be constant.\n\nnarginchk(1,2);\nif nargin == 2,\n    y = sum( square_pos( x ), dim );\nelse\n    y = sum( square_pos( x ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/sym.m",
    "content": "function x = sym( x )\n\n% SYM   Symmetrize.\n%    SYM(X), where X is a matrix, returns the symmetric or Hermitian part\n%    of X; that is, SYM(X) = 0.5 * ( X + X' ). If X is an array, SYM(X) \n%    symmetrizes each of the submatrices X(:,:,k). X must satisfy \n%    size(X,1) = size(X,2).\n%\n%    SYM(X) is useful in CVX when constructing LMIs. Sometimes, numerical\n%    errors will cause a construct to be slightly non-symmetric, causing \n%    CVX to flag it as an error. If you are sure the asymmetry is solely\n%    due to this effect, SYM(X) will correct it for you.\n\nsx = size(x);\nif sx(1) ~= sx(2),\n    error( 'Argument must be square in its first two dimensions.' );\nelseif sx(1) > 1,\n    x = 0.5 * ( x + conj( permute( x, [2,1,3:length(sx)] ) ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/trace_inv.m",
    "content": "function z = trace_inv( Y )\n\n% TRACE_INV   Trace of the inverse of a PSD matrix.\n%     For square matrix X, TRACE_INV(X) is TRACE(INV(X)) if X is Hermitian\n%     or symmetric and positive definite; and +Inf otherwise. \n%\n%     An error results if X is not a square matrix.\n%\n%     Disciplined convex programming information:\n%         TRACE_INV is convex and nonmonotonic (at least with respect to\n%         elementwise comparison), so its argument must be affine.\n\nnarginchk(1,1);\nif ndims( Y ) > 2 || size( Y, 1 ) ~= size( Y, 2 ), %#ok\n    error( 'Input must be a square matrix.' );\nend\nerr = Y - Y';\nY   = 0.5 * ( Y + Y' );\nif norm( err, 'fro' )  > 8 * eps * norm( Y, 'fro' ),\n    z = Inf;\nelse\n    z = eig( full( Y ) );\n    if any( z <= 0 ),\n        z = Inf;\n    else\n        z = sum(1.0./z);\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/trace_sqrtm.m",
    "content": "function z = trace_sqrtm( Y )\n\n% TRACE_SQRTM   Trace of the square root of a PSD matrix.\n%     For square matrix X, TRACE_SQRTM(X) is TRACE(SQRTM(X)) if X is Hermitian\n%     or symmetric and positive definite; and +Inf otherwise.\n%\n%     An error results if X is not a square matrix.\n%\n%     Disciplined convex programming information:\n%         TRACE_SQRTM is convex and nonmonotonic (at least with respect to\n%         elementwise comparison), so its argument must be affine.\n\nnarginchk(1,1);\nif ndims( Y ) > 2 || size( Y, 1 ) ~= size( Y, 2 ), %#ok\n    error( 'Input must be a square matrix.' );\nend\nerr = Y - Y';\nY   = 0.5 * ( Y + Y' );\nif norm( err, 'fro' )  > 8 * eps * norm( Y, 'fro' ),\n    z = Inf;\nelse\n    z = eig( full( Y ) );\n    if any( z <= 0 ),\n        z = Inf;\n    else\n        z = sum(sqrt(z));\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/functions/vec_/vec.m",
    "content": "function v = vec( x )\n\n% VEC   Vectorize.\n%    VEC(X), where X is a vector, matrix, or N-D array, returns a column vector\n%    containing all of the elements of X; i.e., VEC(X)=X(:).\n\nv = reshape( x, numel( x ), 1 );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/Contents.m",
    "content": "% CVX: Keywords for declaring variables and objectives\n%   dual      - Declares one or more dual variables.\n%   epigraph  - Declares an epigraph variable.\n%   hypograph - Declares a hypograph variable.\n%   maximize  - Specifies a concave (or affine) objective to be maximized.\n%   minimize  - Specifies a convex (or affine) objective to be maximized.\n%   subject   - Implements the \"subject to\" keyword.\n%   variable  - Declares a single CVX variable with optional matrix structure.\n%   variables - Declares one or more CVX variables.\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/In.m",
    "content": "function y = In\ny = cvxin;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/binary.m",
    "content": "function binary( varargin )\n\n%BINARY Declares an binary variable.\n%   BINARY VARIABLE x\n%   where x is a valid MATLAB variable name, declares a scalar variable for\n%   the current CVX problem, and constrains it to the set {0,1}. Put\n%   another way, it is equivalent to\n%       integer variable x\n%       0 <= x <= 1\n%\n%   BINARY VARIABLE x(SZ), where SZ is a size vector, declares an array of\n%   size SZ and constrains each element to be binary. Structure modifiers\n%   such as \"symmetric\", \"toeplitz\", etc. are also permitted.\n%\n%   BINARY VARIABLES x y(SZ) z ... can be used to declare multiple binary \n%   variables. Note however that structure modifiers are not permitted in\n%   this case.\n%\n%   Obviously, binary variables are NOT convex. Problems with binary \n%   variables can only be handled by solvers with explicit support for\n%   them; in particular, neither of the free solvers SeDuMi nor SDPT3\n%   provide binary support.\n%\n%   Examples:\n%      binary variable x\n%      binary variable x(100)\n%\n%   See also INTEGER, VARIABLE, VARIABLES.\n\nif nargin < 2,\n    error( 'Incorrect syntax for BINARY VARIABLE(S). Type HELP BINARY for details.' );\nelseif ~iscellstr( varargin ),\n    error( 'All arguments must be strings.' );\nelseif strcmp( varargin{1}, 'variable' ),\n    evalin( 'caller', sprintf( '%s ', 'variable', varargin{2:end}, 'binary' ) );\nelseif strcmp( varargin{1}, 'variables' ),\n    for k = 2 : nargin,\n        evalin( 'caller', sprintf( '%s ', 'variable', varargin{k}, 'binary' ) );\n    end\nelse\n    error( 'Incorrect syntax for BINARY VARIABLE(S). Type HELP BINARY for details.' );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/dual.m",
    "content": "function varargout = dual( varargin )\n\n%DUAL Declares one or more dual variables.\n%\n%   DUAL VARIABLE x\n%   where x is a valid MATLAB variable name, declares a dual variable\n%   for the current cvx problem. A dual variable with that name is added\n%   to the problem and a cvxdual object with that name is created in\n%   the current worksapce. An error is generated if a cvx problem is not\n%   in the current workspace.\n%\n%   Note that a dual variable initially has no size; i.e., SIZE(x) returns\n%   [0,0]. This is because the size of a dual variable is determined by the\n%   constraint to which it is attached. To attach a dual variable to a\n%   constraint, use the colon notation as follows:\n%\n%      variable x(n)\n%      dual variable z\n%      A * x == b : z\n%\n%   In this example, the dual variable z is attached to the equality\n%   constraint A * x == b. Assuming SIZE(A) = [m,n] and SIZE(B) = [m,1],\n%   the size of z will be set at [m,1] by this operation.\n%\n%   DUAL VARIABLES x1 x2 ... xk\n%   where x1, x2, ..., xk are valid MATLAB variable names, declares\n%   multiple dual variables.\n%\n%   DUAL VARIABLE x{s1,s2,...,sk}\n%   DUAL VARIABLES x1{s1,s2,...,sk} x2{...\n%   creates a cell array of dual variables, of dimension [s1,s2,..,sk].\n%   This is useful if you want to create a sequence of related constraints,\n%   using a FOR loop for example, and assign a separate dual variable to\n%   each one; for example:\n%\n%       variable x(n)\n%       dual variables z{10}\n%       for k = 1 : 10,\n%           A(:,:,k) * x <= b(:,k) : z{k}\n%       end\n%\n%   Assuming SIZE(A) = [m,n,10] and SIZE(B) = [m,10], this loop assigns\n%   each of the dual variables z{k} to a constraint and sets their sizes\n%   to [m,1]. Note that the elements of the dual variable cell array need\n%   not end up the same size.\n%\n%   See also VARIABLE, VARIABLES.\n\nif nargin < 2,\n    error( 'Incorrect syntax for DUAL VARIABLE(S). Type HELP DUAL for details.' );\nelseif nargout && nargout ~= length( varargin ) - 1,\n    error( 'Incorrect number of output arguments.' );\nelseif ~iscellstr( varargin ),\n    error( 'All arguments must be strings.' );\nend\n\nglobal cvx___\nprob = evalin( 'caller', 'cvx_problem', '[]' );\nif ~isa( prob, 'cvxprob' ),\n    error( 'No CVX model exists in this scope.' );\nelseif isempty( cvx___.problems ) || cvx___.problems( end ).self ~= prob,\n    error( 'Internal CVX data corruption. Please CLEAR ALL and rebuild your model.' );\nend\n\nif strcmp( varargin{1}, 'variable' ),\n    if nargin > 2,\n        error( 'Too many input arguments.\\nTrying to declare multiple dual variables? Use the DUAL VARIABLES command instead.', 1 ); %#ok\n    end\nelseif ~strcmp( varargin{1}, 'variables' ),\n    error( 'Incorrect syntax for DUAL VARIABLE(S). Type HELP DUAL for details.' );\nend\n\nfor k = 2 : nargin,\n    arg = varargin{k};\n    toks = regexp( arg, '^\\s*([a-zA-Z]\\w*)\\s*({.*})?\\s*$', 'tokens' );\n    if isempty( toks ),\n        error( 'Invalid dual variable specification: %s', arg );\n    end\n    tok = toks{1};\n    nam = tok{1};\n    if length(tok) < 2,\n        siz = {};\n    else\n        siz = tok{2};\n    end\n    if nam(end) == '_',\n        error( 'Invalid dual variable specification: %s\\n   Variables ending in underscores are reserved for internal use.', arg );\n    end\n    if ~isempty( siz ),\n        try\n            siz = evalin( 'caller', [ '[', siz(2:end-1), ']' ] );\n        catch exc\n            error( exc.identifier, 'Error attempting to determine size of: %s\\n   %s', arg, exc.message );\n        end\n        [ temp, siz ] = cvx_check_dimlist( siz, true );\n        if ~temp,\n            error( 'Invalid dual variable specification: %s\\n   Dimension list must be a vector of finite nonnegative integers.', arg );\n        end\n    end\n    temp = newdual( prob, nam, siz );\n    if nargout,\n        varargout{k-1} = temp; %#ok\n    end\n    assignin( 'caller', nam, temp );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/epigraph.m",
    "content": "function epigraph( varargin )\n\n%EPIGRAPH Declares an epigraph variable.\n%   EPIGRAPH VARIABLE x\n%   where x is a valid MATLAB variable name, declares a scalar\n%   variable for the current cvx problem, and specifies it as\n%   the objective of a minimization. There is no need to declare\n%   a separate MINIMIZE command.\n%\n%   This keyword should be used only when attempting to\n%   create a new function for the CVX library. Suppose you have a\n%   function F(X) whose epigraph {(X,Y)}{F(X)<=Y} can be\n%   described as a CVX feasibiliy problem. Then declaring Y\n%   as an EPIGRAPH turns the model into one that computes the\n%   value of the function itself, minimizing over Y.\n%\n%   Other uses of this keyword are NOT supported and can lead\n%   to numerical errors.\n%\n%   EPIGRAPH VARIABLE x(n1,n2,...,nk)\n%   declares a vector, matrix, or array epigraph variable with\n%   dimensions n1, n2, ..., nk, each of which must be positive\n%   integers.\n%\n%   Structure modifiers such as \"symmetric\", \"toeplitz\", etc.\n%   are permitted with epigraph variables.\n%\n%   Examples:\n%      epigraph variable x\n%      epigraph variable x(100)\n%\n%   See also VARIABLE, HYPOGRAPH.\n\nif nargin < 2,\n    error( 'Incorrect syntax for EPIGRAPH VARIABLE. Type HELP EPIGRAPH for details.' );\nelseif ~iscellstr( varargin ),\n    error( 'All arguments must be strings.' );\nelseif ~strcmp( varargin{1}, 'variable' ),\n    error( 'Incorrect syntax for EPIGRAPH VARIABLE. Type HELP EPIGRAPH for details.' );\nend\nevalin( 'caller', sprintf( '%s ', 'variable', varargin{2:end}, ' epigraph_' ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/expression.m",
    "content": "function varargout = expression( nm, varargin )\n\n%EXPRESSION Declares a single CVX object for storing subexpressions.\n%   EXPRESSION x\n%   where x is a valid MATLAB variable nm, declares a scalar expression \n%   holder for the current cvx model. Like a variable, an expression holder\n%   can be used in constraints and objectives, according to the DCP ruleset.\n%   However, unlike a variable, an expression holder is initialized to\n%   zero, because the intent is for it to hold intermediate computations.\n%\n%   EXPRESSION x(n1,n2,...,nk)\n%   declares a vector, matrix, or array expression holder with dimensions\n%   n1, n2, ..., nk, each of which must be nonnegative integers. The value\n%   of the expression holder is initialized to zero.\n%\n%   Examples:\n%      variable x y\n%      expression z\n%      z = 2 * x - y;\n%\n%   See also EXPRESSIONS.\n\nglobal cvx___\nprob = evalin( 'caller', 'cvx_problem', '[]' );\nif ~isa( prob, 'cvxprob' ),\n    error( 'No CVX model exists in this scope.' );\nelseif isempty( cvx___.problems ) || cvx___.problems( end ).self ~= prob,\n    error( 'Internal CVX data corruption. Please CLEAR ALL and rebuild your model.' );\nelseif nargin > 1,\n    error( 'Too many input arguments.\\nTrying to declare multiple expression holders? Use the EXPRESSIONS keyword instead.', 1 ); %#ok\nend\n\n%\n% Step 1: separate the name from the parenthetical, verify the name\n%\n\ntoks = regexp( nm, '^\\s*([a-zA-Z]\\w*)\\s*(\\(.*\\))?\\s*$', 'tokens' );\nif isempty( toks ),\n    error( 'Invalid variable specification: %s', nm );\nend\ntoks = toks{1};\nx.name = toks{1};\nx.size = toks{2};\nif x.name(end) == '_',\n    error( 'Invalid expression specification: %s\\n   Names ending in underscores are reserved for internal use.', nm );\nend\n\n%\n% Step 2: Parse the size. In effect, all we do here is surround what is\n% replace the surrounding parentheses with square braces and evaluate. All\n% that matters is the result is a valid size vector. In particular, it\n% need to be a simple comma-delimited list.\n%\n\nif isempty( x.size ),\n\tx.size = [1,1];\nelse\n    try\n        x.size = evalin( 'caller', [ '[', x.size(2:end-1), '];' ] );\n    catch exc\n        error( exc.identifier, exc.message );\n    end\n    [ temp, x.size ] = cvx_check_dimlist( x.size, true );\n    if ~temp,\n        error( 'Invalid expression specification: %s\\n   Dimension list must be a vector of finite nonnegative integers.', nm );\n    end\nend\n\n%\n% Step 3. Initialize\n%\n\nv = cvx( x.size, [] );\nif nargout > 0,\n    varargout{1} = v;\nelse\n    assignin( 'caller', x.name, v );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/expressions.m",
    "content": "function expressions( varargin )\n\n%EXPRESSIONS Declares one or more CVX expression holders.\n%   EXPRESSIONS x1 x2 x3 ..., where x1, x2, x3, etc. are valid\n%   variable names, declares multiple cvx expression holders. It is\n%   exactly equivalent to issuing a separate EXPRESSION command\n%   for each x1, x2, x3, ...\n%        \n%   EXPRESSIONS allows the declaration of vector, matrix, and\n%   array variables. \n%\n%   For more information about expression holders, see the help for \n%   EXPRESSION or the CVX user guide.\n%\n%   Examples:\n%      expressions x y z\n%\n%   See also EXPRESSION.\n\nif nargin < 1,\n    error( 'Incorrect syntax for EXPRESSIONS. Type HELP EXPRESSIONS for details.' );\nelseif ~iscellstr( varargin ),\n    error( 'All arguments must be strings.' );\nend\nfor k = 1 : nargin,\n    evalin( 'caller', [ 'expression ', varargin{k} ] );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/hypograph.m",
    "content": "function hypograph( varargin )\r\n\r\n%HYPOGRAPH Declares a hypograph variable.\r\n%   HYPOGRAPH VARIABLE x\r\n%   where x is a valid MATLAB variable name, declares a scalar\r\n%   variable for the current cvx problem, and specifies it as\r\n%   the objective of a maximization. There is no need to declare\r\n%   a separate MAXIMIZE command.\r\n%\r\n%   This keyword should be used only when attempting to\r\n%   create a new function for the CVX library. Suppose you have a\r\n%   function F(X) whose hypograph {(X,Y)}{F(X)>=Y} can be\r\n%   described as a CVX feasibiliy problem. Then declaring Y\r\n%   as an EPIGRAPH turns the model into one that computes the\r\n%   value of the function itself, maximizing over Y.\r\n%\r\n%   Other uses of this keyword are NOT supported and can lead\r\n%   to numerical errors.\r\n%\r\n%   HYPOGRAPH VARIABLE x(n1,n2,...,nk)\r\n%   declares a vector, matrix, or array hypograph variable with\r\n%   dimensions n1, n2, ..., nk, each of which must be positive\r\n%   integers.\r\n%\r\n%   Structure modifiers such as \"symmetric\", \"toeplitz\", etc.\r\n%   are permitted with hypograph variables.\r\n%\r\n%   Examples:\r\n%      hypograph variable x\r\n%      hypograph variable x(100)\r\n%\r\n%   See also VARIABLE, EPIGRAPH.\r\n\r\nif nargin < 2,\r\n    error( 'Incorrect syntax for HYPOGRAPH VARIABLE. Type HELP HYPOGRAPH for details.' );\r\nelseif ~iscellstr( varargin ),\r\n    error( 'All arguments must be strings.' );\r\nelseif ~strcmp( varargin{1}, 'variable' ),\r\n    error( 'Incorrect syntax for HYPOGRAPH VARIABLE. Type HELP HYPOGRAPH for details.' );\r\nend\r\nevalin( 'caller', sprintf( '%s ', 'variable', varargin{2:end}, ' hypograph_' ) );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/integer.m",
    "content": "function integer( varargin )\n\n%INTEGER Declares an integer variable.\n%   INTEGER VARIABLE x\n%   where x is a valid MATLAB variable name, declares a scalar variable for\n%   the current CVX problem, and constraints it so that it can assume only\n%   integral values.\n%\n%   INTEGER VARIABLE x(SZ), where SZ is a size vector, declares an array of\n%   size SZ and constrains each element to be integral. Structure modifiers\n%   such as \"symmetric\", \"toeplitz\", etc. are also permitted.\n%\n%   INTEGER VARIABLES x y(SZ) z ... can be used to declare multiple integer \n%   variables. Note however that structure modifiers are not permitted in\n%   this case.\n%\n%   Obviously, integer variables are NOT convex. Problems with integer \n%   variables can only be handled by solvers with explicit support for\n%   them; in particular, neither of the free solvers SeDuMi nor SDPT3\n%   provide integer support.\n%\n%   Examples:\n%      integer variable x\n%      integer variable x(100)\n%\n%   See also BINARY, VARIABLE, VARIABLES.\n\nif nargin < 2,\n    error( 'Incorrect syntax for INTEGER VARIABLE(S). Type HELP INTEGER for details.' );\nelseif ~iscellstr( varargin ),\n    error( 'All arguments must be strings.' );\nelseif strcmp( varargin{1}, 'variable' ),\n    evalin( 'caller', sprintf( '%s ', 'variable', varargin{2:end}, ' integer' ) );\nelseif strcmp( varargin{1}, 'variables' ),\n    for k = 2 : nargin,\n        evalin( 'caller', sprintf( '%s ', 'variable', varargin{k}, ' integer' ) );\n    end\nelse    \n    error( 'Incorrect syntax for INTEGER VARIABLE(S). Type HELP INTEGER for details.' );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/maximise.m",
    "content": "function maximise( varargin )\n\n%MAXIMISE Specifiies a concave (or affine) objective to be maximized.\n\nglobal cvx___\nprob = evalin( 'caller', 'cvx_problem', '[]' );\nif ~isa( prob, 'cvxprob' ),\n    error( 'No CVX model exists in this scope.' );\nelseif isempty( cvx___.problems ) || cvx___.problems( end ).self ~= prob,\n    error( 'Internal CVX data corruption. Please CLEAR ALL and rebuild your model.' );\nelseif nargin < 1,\n    error( 'Objective expression missing.' );\nelseif iscellstr( varargin ),\n    x = evalin( 'caller', sprintf( '%s ', varargin{:} ) );\nelseif nargin > 1,\n    error( 'Too many input arguments.' );\nelse\n    x = varargin{1};\nend\ntry\n    newobj( prob, 'maximize', x );\ncatch exc\n    rethrow( exc )\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/maximize.m",
    "content": "function maximize( varargin )\n\n%MAXIMIZE Specifiies a concave (or affine) objective to be maximized.\n\nglobal cvx___\nprob = evalin( 'caller', 'cvx_problem', '[]' );\nif ~isa( prob, 'cvxprob' ),\n    error( 'No CVX model exists in this scope.' );\nelseif isempty( cvx___.problems ) || cvx___.problems( end ).self ~= prob,\n    error( 'Internal CVX data corruption. Please CLEAR ALL and rebuild your model.' );\nelseif nargin < 1,\n    error( 'Objective expression missing.' );\nelseif iscellstr( varargin ),\n    x = evalin( 'caller', sprintf( '%s ', varargin{:} ) );\nelseif nargin > 1,\n    error( 'Too many input arguments.' );\nelse\n    x = varargin{1};\nend\ntry\n    newobj( prob, 'maximize', x );\ncatch exc\n    rethrow( exc )\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/minimise.m",
    "content": "function minimise( varargin )\n\n%MINIMISE Specifiies a convex (or affine) objective to be maximized.\n\nglobal cvx___\nprob = evalin( 'caller', 'cvx_problem', '[]' );\nif ~isa( prob, 'cvxprob' ),\n    error( 'No CVX model exists in this scope.' );\nelseif isempty( cvx___.problems ) || cvx___.problems( end ).self ~= prob,\n    error( 'Internal CVX data corruption. Please CLEAR ALL and rebuild your model.' );\nelseif nargin < 1,\n    error( 'Objective expression missing.' );\nelseif iscellstr( varargin ),\n    x = evalin( 'caller', sprintf( '%s ', varargin{:} ) );\nelseif nargin > 1,\n    error( 'Too many input arguments.' );\nelse\n    x = varargin{1};\nend\ntry\n    newobj( prob, 'minimize', x );\ncatch exc\n    rethrow( exc )\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/minimize.m",
    "content": "function minimize( varargin )\n\n%MINIMIZE Specifiies a convex (or affine) objective to be maximized.\n\nglobal cvx___\nprob = evalin( 'caller', 'cvx_problem', '[]' );\nif ~isa( prob, 'cvxprob' ),\n    error( 'No CVX model exists in this scope.' );\nelseif isempty( cvx___.problems ) || cvx___.problems( end ).self ~= prob,\n    error( 'Internal CVX data corruption. Please CLEAR ALL and rebuild your model.' );\nelseif nargin < 1,\n    error( 'Objective expression missing.' );\nelseif iscellstr( varargin ),\n    x = evalin( 'caller', sprintf( '%s ', varargin{:} ) );\nelseif nargin > 1,\n    error( 'Too many input arguments.' );\nelse\n    x = varargin{1};\nend\ntry\n    newobj( prob, 'minimize', x );\ncatch exc\n    rethrow( exc )\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/subject.m",
    "content": "function subject( to )\n\n%SUBJECT Implements the \"subject to\" keyword.\n%   The keyword\n%      SUBJECT TO\n%   is a \"no-op\"---that is, it has no functional value. It is provided\n%   solely to allow CVX models to read more closely to their mathematical\n%   counterparts; e.g.\n%      MINIMIZE( <objective> )\n%      SUBJECT TO\n%           <constraint1>\n%           ...\n%   It may be omitted without altering the model in any way.\n\n% We had some consistency checking code here, but given that this is supposed to be \n% no-op, it seems sensible to remove it all.\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/variable.m",
    "content": "function varargout = variable( varargin )\n\n%VARIABLE Declares a single CVX variable with optional matrix structure.\n%   VARIABLE x\n%   where x is a valid MATLAB variable nm, declares a scalar\n%   variable for the current cvx problem. A variable with that\n%   name is added to the problem, and a cvx object with that\n%   name is created in the current workspace. An error is\n%   generated if a cvx problem isn't in the current workspace.\n%\n%   VARIABLE x(n1,n2,...,nk)\n%   declares a vector, matrix, or array variable with dimensions\n%   n1, n2, ..., nk, each of which must be positive integers.\n%\n%   VARIABLE x(n1,n2,...,nk) mod1 mod2 mod3 ... modp\n%   declares a vector, matrix, or array with structure. The\n%   modifiers mod1, mod2, ... can each be one of the following:\n%       complex   symmetric   skew-symmetric   hermitian\n%       skew-hermitian   toeplitz   hankel   upper-hankel\n%       lower-triangular   upper-triangular   tridiagonal\n%       diagonal   lower-bidiagonal   upper-bidiagonal\n%   Appropriate combinations of these modifiers can be chosen\n%   as well. All except \"complex\" require that the matrix be\n%   square. If an N-D (N>2) array is specified, then the matrix\n%   structure is applied to each 2-D \"slice\" of the array.\n%\n%   Examples:\n%      variable x(100,100) symmetric tridiagonal\n%      variable z(10,10,10)\n%      variable y complex\n%\n%   See also VARIABLES, DUAL, DUALS.\n\nglobal cvx___\nprob = evalin( 'caller', 'cvx_problem', '[]' );\nif ~isa( prob, 'cvxprob' ),\n    error( 'No CVX model exists in this scope.' );\nelseif isempty( cvx___.problems ),\n    error( 'Internal CVX data corruption. Please CLEAR ALL and rebuild your model.' );\nend\npstr = cvx___.problems( end );\nif pstr.self ~= prob,\n    error( 'Internal CVX data corruption. Please CLEAR ALL and rebuild your model.' );\nend\n\n%\n% Parse the text\n%\n\nname = cell( 1, nargin );\nargs = cell( 1, nargin );\ntoks = regexp( varargin, '^([a-zA-Z]\\w*)(\\(.*\\))?$', 'tokens' );\nfor k = 1 : nargin,\n    tok = toks{k};\n    if isempty( tok ),\n        if k == 1, type = 'Variable'; else type = 'Structure'; end\n        error( sprintf('CVX:Invalid%sSpec',type), 'Invalid %s specification: %s', lower(type), varargin{k} );\n    end\n    tok = tok{1};\n    name{k} = tok{1};\n    if length(tok) < 2 || isempty( tok{2} ),\n        args{k} = {};\n    else\n        try\n            args{k} = evalin( 'caller', [ '{', tok{2}(2:end-1), '};' ] );\n        catch exc\n            error( exc.identifier, exc.message );\n        end\n    end\nend\n\n%\n% Get the variable name and size\n%\n\nxname = name{1};\nif ~isvarname( xname ),\n    error( 'CVX:InvalidVariableSpec', 'Invalid variable name: %s', xname );\nelseif xname(end) == '_',\n    error( 'CVX:InvalidVariableSpec', 'Invalid variable name: %s\\n   Variables ending in underscores are reserved for internal use.', xname );\nelseif isfield( cvx___.reswords, xname ),\n    if cvx___.reswords.(xname) == 'S',\n        error( 'CVX:InvalidVariableSpec', 'Invalid variable name: %s\\n   This is a reserved word in CVX.\\n   Trying to declare a structured matrix? Use the VARIABLE keyword instead.', xname );\n    else\n        error( 'CVX:InvalidVariableSpec', 'Invalid variable name: %s\\n   This is a reserved word in CVX.', xname );\n    end\nelseif isfield( pstr.variables, xname ),\n    error( 'CVX:InvalidVariableSpec', 'Duplicate variable name: %s', xname );\nend\nswitch evalin('caller',['exist(''',xname,''')']),\n    case {0,1},\n    case 5,\n        error( 'CVX:InvalidVariableSpec', 'Variable name \"%s\" is the name of a built-in MATLAB function.\\nPlease choose a different name.', xname );\n    case 8,\n        error( 'CVX:InvalidVariableSpec', 'Variable name \"%s\" is the name of an existing MATLAB class.\\nPlease choose a different name.', xname );\n    otherwise,\n        mpath = which( xname );\n        if ~isempty( mpath ),\n            if strncmp( mpath, matlabroot, length(matlabroot) ),\n                error( 'CVX:InvalidVariableSpec', 'Variable name \"%s\" is the name of an existing MATLAB function or directory:\\n    %s\\nPlease choose a different name.', xname, mpath );\n            elseif strncmp( mpath, cvx___.where, length(cvx___.where) ),\n                error( 'CVX:InvalidVariableSpec', 'Variable name \"%s\" matches the name of a CVX function or directory:\\n    %s\\nPlease choose a different name.', xname, mpath );\n            else\n                warning( 'Variable name \"%s\" matches the name of an function or directory:\\n    %s\\nThis may cause unintended behavior with CVX models.\\nPlease consider moving this file or choosing a different variable name.', xname, mpath );\n            end\n        end\nend\ntry\n    xsize = [ args{1}{:} ];\ncatch exc\n    error( exc.identifier, exc.message );\nend\nif ~isempty( xsize ),\n    [ temp, xsize ] = cvx_check_dimlist( xsize, true );\n    if ~temp,\n        error( 'CVX:InvalidDimensions', 'Invalid dimension list: %s\\n   Dimension list must be a vector of finite nonnegative integers.', varargin{1} );\n    end\nend\n\n%\n% Parse the structure\n%\n\nisepi  = false;\nishypo = false;\nisnneg = false;\nissemi = false;\nitype  = '';\nif nargin > 1,\n    try\n        [ str, itypes ] = cvx_create_structure( varargin, name, args );\n    catch exc\n        error( exc.identifier, exc.message );\n    end\n    n_itypes = 0;\n    for k = 1 : length( itypes ),\n        strs = itypes{k};\n        switch strs,\n            case 'epigraph_',    isepi  = true;\n            case 'hypograph_',   ishypo = true;\n            case 'integer',      n_itypes = n_itypes + 1; itype = 'i_integer';\n            case 'binary',       n_itypes = n_itypes + 1; itype = 'i_binary';\n            case 'nonnegative',  isnneg = true;\n            case 'semidefinite', issemi = true;\n        end\n    end\n    if isepi && ishypo,\n        error( 'EPIGRAPH and HYPOGRAPH keywords cannot be used simultaneously.' );\n    end\n    if n_itypes,\n        if pstr.gp,\n            error( 'Integer variables cannot be used in geometric programs.' );\n        elseif isepi || ishypo,\n            error( 'Integer variables cannot be used as epigraphs or hypograph variables.' );\n        elseif issemi,\n            error( 'Integer variables cannot also be declared semidefinite.' );\n        elseif n_itypes > 1,\n            error( 'At most one integer keyword may be specified.' );\n        end\n    end\nelse\n    str = [];\nend\n\n%\n% Create the variables\n%\n\ntry\n    v = newvar( prob, xname, xsize, str, pstr.gp );\ncatch exc\n    error( exc.message );\nend\nif isepi || ishypo,\n    if pstr.gp, vv = log( v ); else vv = v; end\n    if isepi, dir = 'epigraph'; else dir = 'hypograph'; end\n    cvx___.problems( end ).objective = vv;\n    cvx___.problems( end ).direction = dir;\n    cvx___.problems( end ).geometric = pstr.gp;\nend\nif itype,\n    [ tx, dummy ] = find( cvx_basis( v ) ); %#ok\n    newnonl( prob, itype, tx(:)' );\n    cvx___.canslack( tx ) = false;\nend\nif issemi,\n    [ dummy, issemi ] = newcnstr( prob, v, 0, '>=', true ); %#ok\n    if ~issemi, isnneg = false; end\nend\nif isnneg && ~pstr.gp && ~strcmp( itype, 'i_binary' ),\n    newcnstr( prob, v, 0, '>=', false );\nend\nif nargout > 0,\n    varargout{1} = v;\nelse\n    assignin( 'caller', xname, v );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/keywords/variables.m",
    "content": "function variables( varargin )\n\n%VARIABLES Declares one or more CVX variables.\n%   VARIABLES x1 x2 x3 ..., where x1, x2, x3, etc. are valid\n%   variable names, declares multiple cvx variables. It is\n%   exactly equivalent to issuing a separate VARIABLE command\n%   for each x1, x2, x3, ...\n%        \n%   VARIABLES allows the declaration of vector, matrix, and\n%   array variables. However, unlike VARIABLE, structure modifiers\n%   such as \"symmetric\", \"toeplitz\", etc. are NOT permitted. Thus\n%   VARIABLES cannot be used with variables with structure.\n%\n%   Examples:\n%      variables x y z;\n%      variables x(100) y z(100,10);\n%\n%   See also VARIABLE, DUAL, DUALS.\n\nif nargin < 1,\n    error( 'Incorrect syntax for VARIABLES. Type HELP VARIABLES for details.' );\nelseif ~iscellstr( varargin ),\n    error( 'All arguments must be strings.' );\nend\nfor k = 1 : nargin,\n\tevalin( 'caller', [ 'variable ', varargin{k} ] );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cell/cvx_id.m",
    "content": "function y = cvx_id( x )\r\ny = cellfun( @cvx_id, x );\r\nif isempty( y ),\r\n    y = -Inf;\r\nelse\r\n    y = max( y( : ) );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cell/cvx_setdual.m",
    "content": "function x = cvx_setdual( x, y )\r\nx = cvx_setdual( cvxtuple( x ), y );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cell/cvx_value.m",
    "content": "function y = cvx_value( x )\r\nglobal cvx___\r\ny = cellfun( @cvx_value, x, 'UniformOutput', false );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/bcompress.m",
    "content": "function [ xR, x, sx ] = bcompress( x, mode, nsrt )\r\nnarginchk(1,3);\r\n\r\nif nargin < 2 || isempty( mode ),\r\n    mode = 'full';\r\nelseif ~ischar( mode ) || size( mode, 1 ) ~= 1,\r\n    error( 'Second argument must be a string.' );\r\nend\r\n\r\nif nargin < 3 || isempty( nsrt ),\r\n    nsrt = 0;\r\nelseif ~cvx_check_dimension( nsrt, true ),\r\n    error( 'Third argument must be a nonnegative integer.' );\r\nend\r\n\r\nsx = x.size_;\r\nxb = x.basis_;\r\nif nargout <= 1,\r\n    xR = cvx_bcompress( xb, mode, nsrt );\r\nelse\r\n    [ xR, xb ] = cvx_bcompress( xb, mode, nsrt );\r\n    x = cvx( size( xb, 2 ), xb );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/buncompress.m",
    "content": "function x = buncompress( xR, x, sx )\r\nnarginchk(2,3);\r\n\r\nif ~isa( xR, 'double' ) && ~isa( xR, 'sparse' ),\r\n    error( 'First argument must be a structure matrix.' );\r\nelseif size( x.basis_, 2 ) ~= size( xR, 1 ),\r\n    error( 'Structure matrix incompatible with vector.' );\r\nelseif nargin < 3 || isempty( sx ),\r\n    sx = size( xR, 2 );\r\nelseif ~cvx_check_dimlist( sx, false ),\r\n    error( 'Third argument must be a size matrix.' );\r\nelseif prod( sx ) ~= isempty( xR ) * prod( x.size_ ) + ~isempty( xR ) * size( xR, 2 ),\r\n    error( 'Incompatible size matrix.' );\r\nend\r\n\r\nif isempty( xR ),\r\n    x = cvx( sx, x.basis_ );\r\nelse\r\n    x = cvx( sx, x.basis_ * xR );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx.m",
    "content": "function v = cvx( s, b, d, clean )\n\n%CVX   The CVX disciplined convex programming system.\n%   CVX is a modeling framework for building, constructing, and solving\n%   disciplined convex programs. CVX has online help for many functions and\n%   operations, divided into several subsection:\n%      cvx/commands   - Top-level commands to control CVX\n%      cvx/keywords   - Keywords for declaring variables and objectives\n%      cvx/builtins   - Built-in operators and functions supported in CVX models\n%      cvx/functions  - Additional functions added by CVX\n%      cvx/sets       - Definitions of common convex sets\n%      cvx/structures - Matrix structure definitions\n%   CVX also provides an extensive user guide in PDF format, which is found\n%   in its top directory. This directory can be found by typing\n%      cvx_where\n%   at the command prompt.\n\nswitch nargin,\n    case 2,\n        d = [];\n        clean = false;\n    case 3,\n        clean = true;\n    case 1,\n        if isa( s, 'cvx' ),\n            v = s;\n        else\n            v = class( struct( 'size_', size( s ), 'basis_', sparse( s(:).' ), 'dual_', '', 'dof_', [], 'slow_', nnz( isinf( s ) | isnan( s ) ) ~= 0 ), 'cvx', cvxobj );\n        end\n        return\n    case 0,\n        v = class( struct( 'size_', [ 0, 0 ], 'basis_', sparse( 1, 0 ), 'dual_', '', 'dof_', [], 'slow_', false ), 'cvx', cvxobj );\n        return\nend\nslow = false;\nif isempty( b ),\n    b = sparse( 1, prod( s ) );\n%elseif issparse( b ) & ~cvx_use_sparse( b ),\n%    b = full( b );\nend\nswitch length( s ),\n    case 2,\n    case 1,\n        s( 2 ) = 1;\n    case 0,\n        s = [ 0, 0 ];\n    otherwise,\n        while s(end) == 1,\n            s(end) = [];\n            if length( s ) == 2, \n                break; \n            end\n        end\nend\nif ~all( isfinite( nonzeros( b ) ) ),\n    slow = true;\n    tt = any( isnan( b ), 1 ) | sum( isinf( b ), 1 ) > isinf( b( 1, : ) );\n    b( :, tt ) = 0;\n    b( 1, tt ) = NaN;\nend\nif clean,\n    b1 = b( 1, : );\n    if nnz( b ) == nnz( b1 ),\n        v = cvx_reshape( b1, s );\n        return\n    end\nend\n\nv = class( struct( 'size_', s, 'basis_', b, 'dual_', '', 'dof_', d, 'slow_', slow ), 'cvx', cvxobj );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_basis.m",
    "content": "function y = cvx_basis( x )\ny = x.basis_;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_classify.m",
    "content": "function v = cvx_classify( x )\r\n\r\n% Classifications:\r\n% 1  - negative constant\r\n% 2  - zero\r\n% 3  - positive constant\r\n% 4  - complex constant\r\n% 5  - concave\r\n% 6  - real affine\r\n% 7  - convex\r\n% 8  - complex affine\r\n% 9  - log concave\r\n% 10 - log affine\r\n% 11 - log convex monomial\r\n% 12 - log convex posynomial\r\n% 13 - invalid\r\n\r\nglobal cvx___\r\nv = full( cvx_vexity( x ) );\r\nv = reshape( v, 1, prod( x.size_ ) );\r\nif isempty( x ), return; end\r\nb = x.basis_ ~= 0;\r\nq = sum( b, 1 );\r\ns = b( 1, : );\r\n\r\ntt = q == s;\r\nif any( tt ),\r\n    if ~isreal( x.basis_ ),\r\n        ti = any( imag( x.basis_ ), 1 );\r\n        v( tt & ti ) = 4;\r\n        tt = tt & ~ti;\r\n    end\r\n    v( tt ) = sign( x.basis_( 1, tt ) ) + 2;\r\nend\r\n\r\ntt = ~tt & ~isnan( v );\r\nif any( tt ),\r\n    temp = v( tt );\r\n    temp = temp + 6;\r\n    v( tt ) = temp;\r\n    if ~isreal( x.basis_ ),\r\n        ti = any( imag( x.basis_ ), 1 );\r\n        v( tt & ti ) = 8;\r\n    end\r\nend\r\n\r\ntt = isnan( v );\r\nv( tt ) = 13;\r\n\r\nif nnz( cvx___.exp_used ),\r\n    tt = find( ( v == 13 | v == 7 ) & q == 1 );\r\n    if ~isempty( tt ),\r\n        [ rx, cx, vx ] = find( x.basis_( :, tt ) );\r\n        qq = reshape( cvx___.logarithm( rx ), size( vx ) ) & ( vx > 0 );\r\n        v( tt( cx( qq ) ) ) = 10 + cvx___.vexity( cvx___.logarithm( rx( qq ) ) );\r\n    end\r\n    tt = find( v == 7 & q > 1 );\r\n    if ~isempty( tt ),\r\n        [ rx, cx, vx ] = find( x.basis_( :, tt ) );\r\n        qq = ( ~reshape( cvx___.logarithm( rx ), size( vx ) ) & ( rx > 1 ) ) | vx < 0;\r\n        tt( cx( qq ) ) = [];\r\n        v( tt ) = 12;\r\n    end\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_constant.m",
    "content": "function y = cvx_constant( x )\ny = cvx_reshape( x.basis_( 1, : ), x.size_ );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_getdual.m",
    "content": "function z = cvx_getdual( x )\nz = x.dual_;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_isaffine.m",
    "content": "function y = cvx_isaffine( x, full )\nnarginchk(1,2);\ny = cvx_vexity( x );\nif nargin < 2,\n    y = nnz( y ) == 0;\nelse\n    y = cvx_reshape( y == 0, x.size_ );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_isconcave.m",
    "content": "function y = cvx_isconcave( x, full )\nnarginchk(1,2);\ny = cvx_vexity( x );\nif nargin < 2,\n    y = nnz( y > 0 ) == 0;\nelse\n    y = cvx_reshape( y <= 0, x.size_ );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_isconstant.m",
    "content": "function y = cvx_isconstant( x, full )\nnarginchk(1,2);\nb = x.basis_;\nif size( b, 1 ) <= 1,\n    y = true;\n    if nargin == 2 && full,\n        y = y( ones( 1, prod( x.size_ ) ) );\n        y = reshape( y, x.size_ );\n    end\nelseif nargin == 2 && full,\n    bz = b ~= 0;\n    y = cvx_reshape( sum( bz, 1 ) == bz( 1, : ), x.size_ );\nelse\n    y = nnz( b ) == nnz( b( 1, : ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_isconvex.m",
    "content": "function y = cvx_isconvex( x, full )\nnarginchk(1,2);\ny = cvx_vexity( x );\nif nargin < 2,\n    y = nnz( y < 0 ) == 0;\nelse\n    y = cvx_reshape( y >= 0, x.size_ );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_isnonzero.m",
    "content": "function y = cvx_isnonzero( x, full )\r\nnarginchk(1,2);\r\ny = any( x.basis_, 1 );\r\nif nargin < 2,\r\n    y = all( y );\r\nelse\r\n    y = cvx_reshape( y, x.size_ );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_readlevel.m",
    "content": "function y = cvx_readlevel( x )\r\n\r\nglobal cvx___\r\ns = size( x.basis_ );\r\n[ r, c ] = find( x.basis_ );\r\ny = max( sparse( r, c, cvx___.readonly( r ), s(1), s(2) ), [], 1 );\r\ny = cvx_reshape( y, x.size_ );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_setdual.m",
    "content": "function x = cvx_setdual( x, y )\nx.dual_ = y;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_value.m",
    "content": "function v = cvx_value( x )\r\nv = value( x );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/cvx_vexity.m",
    "content": "function v = cvx_vexity( x )\n\nglobal cvx___\ns = x.size_;\nif any( s == 0 ),\n    v = cvx_zeros( s );\n    return\nend\np  = cvx___.vexity;\nb  = x.basis_;\nn  = length( p );\nnb = size( b, 1 );\nif nb < n,\n    p = p( 1 : nb, 1 );\nelseif n < nb,\n    p( nb, 1 ) = 0;\nend\nif ~any( p ),\n    v = cvx_zeros( x.size_ );\n    if x.slow_,\n        v( isnan( x.basis_( 1, : ) ) ) = NaN;\n    end\n    return\nend\nb = b( p ~= 0, : );\np = nonzeros(p).';\nif cvx___.nan_used,\n    b = sparse( b );\nend\nv = full( p * b );\ntt = abs( v ) ~= abs( p ) * abs( b );\nif x.slow_,\n    v( tt | isnan( x.basis_( 1, : ) ) ) = NaN;\nelse\n    v( tt ) = NaN;\nend\nif ~isreal( x ),\n    v( any( imag( x.basis_ ), 1 ) & v ) = NaN;\nend\nv = sign( v );\nv = reshape( v, x.size_ );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/in.m",
    "content": "function a = in( x, y )\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '==' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/keywords.m",
    "content": "% CVX: Keywords for declaring variables and objectives\n%   dual      - Declares one or more dual variables.\n%   epigraph  - Declares an epigraph variable.\n%   hypograph - Declares a hypograph variable.\n%   maximize  - Specifies a concave (or affine) objective to be maximized.\n%   minimize  - Specifies a convex (or affine) objective to be maximized.\n%   subject   - Implements the \"subject to\" keyword.\n%   variable  - Declares a single CVX variable with optional matrix structure.\n%   variables - Declares one or more CVX variables.\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/matlab6.m",
    "content": "%CVX: Matlab 6 compatability functions.\n%   This directory contains definitions for 'true' and 'false'. These\n%   functions are used extensively in CVX, and are built in for MATLAB\n%   6.5 and later. For MATLAB 6.1 we supply these surrogates. It is\n%   *very* important, however, that this directory NOT be placed in\n%   the MATLAB search path for older versions of MATLAB.\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/sets.m",
    "content": "% CVX: Definitions of common convex sets.\n%   complex_lorentz         - Complex second-order cone.                        {(x,y): norm(x)<=y}\n%   convex_poly_coeffs      - Coefficients of convex degree-n polynomials.      {p: p(x) convex}\n%   exp_cone                - The exponential cone.                             {(x,y,z): y>=0, y*exp(x/y) <= z }\n%   hermitian_semidefinite  - Hermitian positive semidefinite matrices.         {X: X==X', min(eig(X))>=0}\n%   lorentz                 - Real second-order cones.                          {(x,y): norm(x)<=y}\n%   nonneg_poly_coeffs      - Coefficients of nonnegative degree-n polynomials. {p: p(x)>=0 for all x}\n%   nonnegative             - The nonnegative orthant.                          {x: x>=0}\n%   norm_ball               - Norm ball.                                        {x: norm(x,p) <= 1}\n%   rotated_complex_lorentz - Rotated complex second-order cone.                {(x,y,z): norm(x)^2 <= y*z, y>=0, z>=0 }\n%   rotated_lorentz         - Rotated real second-order cone.                   {(x,y,z): norm(x)^2 <= y*z, y>=0, z>=0 }\n%   semidefinite            - Real symmetric positive semidefinite matrices     {X: X==X', min(eig(X))>=0}\n%   simplex                 - The unit simplex.                                 {x: x>=0, sum(x)==1}\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/sparsify.m",
    "content": "function x = sparsify( x, mode )\r\n\r\nglobal cvx___\r\nnarginchk(2,2);\r\npersistent remap\r\n\r\n%\r\n% Check mode argument\r\n%\r\n\r\nif ~ischar( mode ) || size( mode, 1 ) ~= 1,\r\n    error( 'Second arugment must be a string.' );\r\nend\r\nisobj = strcmp( mode, 'objective' );\r\n\r\npr = cvx___.problems( end );\r\ntouch( pr.self, x );\r\nbz = x.basis_ ~= 0;\r\nbs = sum( bz, 1 );\r\nbc = bz( 1, : );\r\ntt = bs > bc + 1;\r\nat = any( tt );\r\nif at,\r\n    \r\n    %\r\n    % Replace posynomials with log-convex monomials --- that is, unless\r\n    % we are taking the exponential of one. (Not that I know why we \r\n    % would do that!) In that case, we should just use a standard\r\n    % linear replacement and leave it at that.\r\n    %\r\n    \r\n    if ~isequal( mode, 'exponential' ),\r\n        if isempty( remap ),\r\n            remap = cvx_remap( 'posynomial' );\r\n        end\r\n        t2 = remap( cvx_classify( x ) );\r\n        if any( t2 ),\r\n            if all( t2 ),\r\n                x = exp( log( x ) );\r\n            else\r\n                x = cvx_subsasgn( x, t2, exp( log( cvx_subsref( x, t2 ) ) ) );\r\n            end\r\n            bc( t2 ) = 0;\r\n            tt = tt & ~t2;\r\n            at = any( tt );\r\n        end\r\n    end\r\n    \r\n    %\r\n    % Replace other multivariable forms with single-variable forms\r\n    %\r\n    \r\n    if at,\r\n        abc = any( bc( :, tt ) );\r\n        if abc,\r\n            xc = cvx_constant( x );\r\n            x = x - xc;\r\n        end\r\n        forms = cvx___.linforms;\r\n        repls = cvx___.linrepls;\r\n        [ x, forms, repls ] = replcols( x, tt, 'full', forms, repls, isobj );\r\n        cvx___.linforms = forms;\r\n        cvx___.linrepls = repls;\r\n        if abc,\r\n            x = x + xc;\r\n        end\r\n    end\r\n    \r\nend\r\n\r\n%\r\n% Arguments: no constraints on coefficients or constant values\r\n% Objectives:     all replaced with coefficient > 0, constant terms preserved\r\n% Exponentiation: coefficient == 1, constant terms perserved\r\n% Logarithm:      coefficient >  0, constant terms eliminated\r\n%\r\n\r\nswitch mode,\r\n    case { 'argument', 'constraint' },\r\n        tt = false;\r\n    case 'objective',\r\n        tt = ~tt | sum( x.basis_, 1 ) < x.basis_( 1, : );\r\n        usexc = true;\r\n    case 'logarithm',\r\n        tt = sum( x.basis_, 1 ) < x.basis_( 1, : );\r\n        usexc = false;\r\n    case 'exponential';\r\n        tt = sum( x.basis_, 1 ) ~= x.basis_( 1, : ) + 1;\r\n        usexc = true;\r\n    otherwise,\r\n        error( [ 'Invalid normalization mode: ', mode ] );\r\nend\r\nif any( tt ),\r\n    if usexc,\r\n        abc = any( bc );\r\n        if abc,\r\n            xc = cvx_constant( x );\r\n            x = x - xc;\r\n        end\r\n    else\r\n        abc = false;\r\n    end\r\n    forms = cvx___.uniforms;\r\n    repls = cvx___.unirepls;\r\n    [ x, forms, repls ] = replcols( x, tt, 'none', forms, repls, isobj );\r\n    cvx___.uniforms = forms;\r\n    cvx___.unirepls = repls;\r\n    if abc,\r\n        x = x + xc;\r\n    end\r\nend\r\n\r\nfunction [ x, forms, repls ] = replcols( x, tt, mode, forms, repls, isobj )\r\n\r\n%\r\n% Sift through the forms, removing duplicates\r\n%\r\n\r\nglobal cvx___\r\nbN = vec( cvx_subsref( x, tt ) );\r\nnO = length( forms );\r\nnN = length( bN );\r\nif nO ~= 0,\r\n    bN = [ forms ; bN ];\r\nend\r\n[ bNR, bN ] = bcompress( bN, mode, nO );\r\nbNR = bNR( :, nO + 1 : end );\r\nnB = length( bN ) - nO;\r\n\r\n%\r\n% Create the replacement variables\r\n%\r\n\r\nif nB ~= 0,\r\n    forms   = bN;\r\n    bN      = cvx_subsref( bN, nO + 1 : nO + nB, 1 );\r\n    newrepl = newvar( cvx___.problems( end ).self, '', nB );\r\n    [ ndxs, temp ] = find( newrepl.basis_ ); %#ok\r\n    repls = [ repls ; newrepl ];\r\n    bV = cvx_vexity( bN );\r\n    cvx___.vexity( ndxs ) = bV;\r\n    cvx___.readonly( ndxs ) = vec( cvx_readlevel( bN ) );\r\n    if ~isobj,\r\n        ss = bV == 0;\r\n        if any( ss ),\r\n            temp = cvx_basis( bN );\r\n            temp = any( temp( :, ss ), 2 );\r\n            temp( ndxs( ss ) ) = true;\r\n            cvx___.canslack( temp ) = false;\r\n        end\r\n    end\r\nend\r\n\r\n%\r\n% Re-expand the structure\r\n%\r\n\r\nx = cvx_subsasgn( x, tt, buncompress( bNR, repls, nN ) );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/svec.m",
    "content": "function z = svec( x, nrm )\n\nif nargin < 2 || isempty( nrm ) || isequal( nrm, 'fro' ),\n    nrm = 2;\nelseif ~isnumeric( nrm ) || length( nrm ) ~= 1 || nrm < 1,\n    error( 'Second argument must be a number between 1 and Inf, or ''fro''.' );\nend\n\nif ~isreal( x ) && nrm ~= 2,\n    z = vec( x );\n    return\nelse\n    [ xR, y ] = bcompress( x );\n    if isempty( y ),\n        z = cvx( 0 );\n    else\n        z = y .* norms( xR, nrm, 2 );\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/type.m",
    "content": "function st = type( x, usegeo )\n\ndf  = x.dof_;\nif nargin > 1 && usegeo,\n    geo = any( df < 0 );\nelse\n    geo = false;\nend\ndf  = abs( df );\ns   = x.size_;\nlen = prod( s );\n\nif len == 1,\n    isstruct = 0;\n    nzs = len;\n    st = 'scalar';\nelse\n    isstruct = ~isempty( df ) & ( sum( df ) < ( 2 - isreal( x.basis_ ) ) * len );\n    if ~isstruct,\n        nzs = nnz( any( x.basis_, 1 ) );\n    end\n    nd = length( s );\n    st = sprintf( '%dx', s );\n    st = st( 1 : end - 1 );\n    if nd > 2,\n        st = [ st, ' array' ];\n    elseif any( s == 1 ),\n        st = [ st, ' vector' ];\n    else\n        st = [ st, ' matrix' ];\n    end\nend\n\nif isstruct,\n    st = sprintf( '%s, %d d.o.f.', st, df );\nelseif nzs < len,\n    if nzs > 1,\n        st = sprintf( '%s, %d nonzeros', st, nzs );\n    elseif nzs == 1,\n        st = sprintf( '%s, 1 nonzero', st );\n    end\nend\nif geo,\n    st = [ st, ', geometric' ];\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvx/value.m",
    "content": "function v = value( x, data )\nglobal cvx___\nif nargin == 1,\n    data = cvx___.x;\nend\nnx = size( data, 1 );\nnb = size( x.basis_, 1 );\nif nx < nb,\n    data( end + 1 : nb, : ) = NaN;\nelseif nx > nb,\n    data( nb + 1 : end, : ) = [];\nend\nv = cvx_reshape( data.' * x.basis_, x.size_ );\nif any( x.size_ == 1 ), v = full( v ); end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxcnst/cvxcnst.m",
    "content": "function v = cvxcnst( p, rhs )\nv = class( struct( 'problem', p, 'rhs', rhs ), 'cvxcnst' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxcnst/disp.m",
    "content": "function disp( x )\ndisp( 'Constraint accepted' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxcnst/display.m",
    "content": "function display( x )\nlong = ~isequal(get(0,'FormatSpacing'),'compact');\nif long, disp( ' ' ); end\ndisp(x);\nif long, disp( ' ' ); end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxcnst/double.m",
    "content": "function x = double( v ) %#ok\nerror( 'Disciplined convex programming error:\\n   Constraints may not appear in if/then statements.', 1 ); %#ok\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxcnst/logical.m",
    "content": "function x = logical( v ) %#ok\nerror( 'Disciplined convex programming error:\\n   Constraints may not appear in if/then statements.', 1 ); %#ok\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxcnst/rhs.m",
    "content": "function x = rhs( y )\nx = y.rhs;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/colon.m",
    "content": "function z = colon( x, y )\nif ~isa( x, 'cvxdual' ),\n    z = x; x = y; y = z;\nend\nglobal cvx___\ntry\n    dvars = cvx___.problems( x.problem_ ).dvars;\n    q = builtin( 'subsref', dvars, x.name_ );\ncatch\n    error( 'CVX:Corrupt', 'Internal CVX data corruption. Please CLEAR ALL and rebuild your model.' );\nend\nif q.attached_,\n    nm = cvx_subs2str( x.name_ );\n    error( 'CVX:DualInUse', 'Dual variable \"%s\" has already been assigned.', nm(2:end) );\nend\nq.attached_ = true;\ndvars = builtin( 'subsasgn', dvars, x.name_, q );\ncvx___.problems( x.problem_ ).dvars = dvars;\ntry\n    z = cvx_setdual( y, x.name_ );\ncatch\n    error( 'CVX:CannotAttachDual', 'Cannot attach a dual variable to an object of type %s.', class( y ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/cvx_basis.m",
    "content": "function ans = cvx_basis( x, varargin )\nans = cvx_basis( cvxaff( x ), varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/cvx_value.m",
    "content": "function v = cvx_value( x )\nv = value( x );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/cvxaff.m",
    "content": "function y = cvxaff( x )\nglobal cvx___\ny = subsref( cvx___.problems( x.problem_ ).duals, x.name_ );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/cvxdual.m",
    "content": "function y = cvxdual( prob, name )\n\ny = class( struct( 'problem_', prob, 'name_', name, 'attached_', false ), 'cvxdual', cvxobj );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/disp.m",
    "content": "function disp( x, prefix, iname )\nif nargin < 2, prefix = ''; end\nif nargin < 3, iname = ''; end\nnm = cvx_subs2str( x.name_ );\nnm = nm(2:end);\nif ~isequal( nm, iname ),\n    disp( [ prefix, 'cvx dual variable ', nm, ' (', type( x ), ')' ] );\nelse\n    disp( [ prefix, 'cvx dual variable (', type( x ), ')' ] );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/display.m",
    "content": "function display( x )\nnm = inputname(1);\nlong = ~isequal(get(0,'FormatSpacing'),'compact');\nif long, disp( ' ' ); end\ndisp([nm ' =']);\nif long, disp( ' ' ); end\ndisp(x,'    ',nm);\nif long, disp( ' ' ); end\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/dof.m",
    "content": "function y = dof( x )\ny = size( cvx_basis( cvxaff( x ) ), 2 );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/inuse.m",
    "content": "function y = inuse( x )\ny = ~isempty( x );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/isreal.m",
    "content": "function y = isreal( x )\ny = isreal( cvxaff( x ) );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/name.m",
    "content": "function y = name( x )\ny = x.name_;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/problem.m",
    "content": "function p = problem( x )\r\np = x.problem_;\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/size.m",
    "content": "function y = size( x, varargin )\ny = size( cvxaff( x ), varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/subsref.m",
    "content": "function x = subsref( x, S )\nerror( 'Cannot use subscripting on dual variables.' );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/type.m",
    "content": "function st = type( x )\n\nx = cvxaff( x );\nif isa( x, 'double' ),\n    st = 'unassigned';\n    return\nend\nif iscell( x ),\n    strs = cell(1,numel(x));\n    for k = 1 : numel(x),\n        strs{k} = type(x{k});\n    end\n    strs = sprintf( '%s, ', strs{:} );\n    st = strs(1:end-2);\n    return\nend\ns   = size( x );\nlen = prod( s );\nisr = isreal( x );\nif len == 1,\n    if isr,\n        st = 'scalar';\n    else\n        st = 'complex scalar';\n    end\nelse\n    dof = size( cvx_basis( x ), 2 ) - 1;\n    isstruct = dof < ( 2 - isr ) * len;\n    st = sprintf( '%dx', s );\n    st = st( 1 : end - 1 );\n    if ~isr,\n        st = [ st, ' complex' ];\n    end\n    if length( s ) > 2,\n        st = [ st, ' array' ];\n    elseif any( s == 1 ),\n        st = [ st, ' vector' ];\n    else\n        st = [ st, ' matrix' ];\n    end\n    if isstruct,\n        st = sprintf( '%s (%d d.o.f.)', st, dof );\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxdual/value.m",
    "content": "function v = value( x )\nglobal cvx___\nv = cvxaff( x );\nswitch class( v ),\n    case 'cvx',\n        v = value( v, cvx___.y );\n    case 'cell',\n        for k = 1 : numel( v ),\n            v{k} = value( v{k}, cvx___.y );\n        end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxin/cvxin.m",
    "content": "function v = cvxin\nsuperiorto('cell','struct','cvx','cvxtuple');\nv = class( struct( 'active', false, 'value', [] ), 'cvxin' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxin/cvxtuple.m",
    "content": "function v = cvxtuple( varargin )\n\nif nargin == 1,\n    v = varargin{1};\n    switch class( v ),\n        case 'struct',\n            if numel( v ) ~= 1,\n                error( 'struct arrays not permitted in cvx tuple objects.' );\n            end\n        case 'cell',\n            v = reshape( v, 1, numel( v ) );\n        otherwise,\n            return\n    end\nelse\n    v = varargin;\nend\n\nv = class( struct( 'value_', { v } ), 'cvxtuple', cvxobj );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxin/gt.m",
    "content": "function a = gt( x, y )\n\nif isa(y,'cvxin')||~isa(x,'cvxin')||~x.active,\n    error( 'CVX error: improper use of the <in> pseudo-operator.' );\nend\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x.value, y, '==' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxin/lt.m",
    "content": "function y = lt( x, y )\n\nif isa(x,'cvxin')||~isa(y,'cvxin')||y.active,\n    error( 'CVX error: improper use of the <in> pseudo-operator.' );\nend\ny.active = true;\ny.value  = x;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/cvx_id.m",
    "content": "function y = cvx_id( x )\ny = x.id_;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/cvxobj.m",
    "content": "function y = cvxobj()\nglobal cvx___\nif isempty( cvx___ ),\n    error( 'Internal cvx data corruption' );\nend\ncvx___.id = cvx___.id + 1;\ny = class( struct( 'id_', cvx___.id ), 'cvxobj' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/disp.m",
    "content": "function disp( x, prefix ) %#ok\nif nargin < 2, prefix = ''; end\ndisp( [ prefix, 'cvx base object' ] );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/display.m",
    "content": "function display( x )\nlong = ~isequal(get(0,'FormatSpacing'),'compact');\nif long, disp( ' ' ); end\ndisp([inputname(1) ' =']);\nif long, disp( ' ' ); end\ndisp(x,'    ')\nif long, disp( ' ' ); end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/isempty.m",
    "content": "function y = isempty( x )\ny = any( size( x ) == 0 );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/isequal.m",
    "content": "function z = isequal( x, y )\nz = x.id_ == y.id_;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/length.m",
    "content": "function n = length( x )\ns = size( x );\nif any( s == 0 ),\n   n = 0;\nelse\n   n = max( s );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/ndims.m",
    "content": "function n = ndims( x )\nn = length( size( x ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/numel.m",
    "content": "function n = numel( x, varargin )\nn = prod( size( x ) ); %#ok\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/subsasgn.m",
    "content": "function x = subsasgn( x, S, y )\r\nerror( 'Subscripted assignment not allowed for these objects.' );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxobj/subsref.m",
    "content": "function x = subsref( x, S, cheat )\r\nerror( 'Subscripts not allowed for this object.' );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/cvx_value.m",
    "content": "function v = cvx_value( x )\r\nwarning( 'CVX:IllegalUse', ...\r\n    'CVX error: illegal use of a cvx problem object has been detected.\\n   Please do not copy or manipulate the value of ''cvx_problem'' in any way.', 1 ); %#ok\r\nv = [];\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/cvxprob.m",
    "content": "function z = cvxprob( varargin )\n\nglobal cvx___\ncvx_global\ntstart = tic;\nif ~iscellstr( varargin ),\n    error( 'Arguments must be strings.' );\nend\n\n%\n% Clear out any old problems left at this depth. These will be here due to\n% an error while constructing a CVX model, or due to the user deciding to\n% start over when constructing a model\n%\n\nst = dbstack;\ndepth = length( st ) - 2;\nif length(st) <= 2,\n    name = '';\nelse\n    name = st(3).name;\nend\nif ~isempty( cvx___.problems ),\n    ndx = find( [ cvx___.problems.depth ] >= depth );\n    if ~isempty( ndx ),\n        temp = cvx___.problems(ndx(1));\n        if temp.depth == depth && ( ~isempty(temp.objective) || ~isempty(temp.variables) || ~isempty(temp.duals) || nnz(temp.t_variable) > 1 );\n            warning( 'CVX:Empty', 'A non-empty cvx problem already exists in this scope.\\n   It is being overwritten.', 1 ); %#ok\n        end\n        pop( temp.self, 'reset' );\n    end\nend\n\n%\n% Grab the latest defaults to place in the new problem\n%\n\nif ~isempty( cvx___.problems ),\n    nprec  = cvx___.problems( end ).precision;\n    npflag = cvx___.problems( end ).precflag;\n    nrprec = cvx___.problems( end ).rat_growth;\n    nsolv  = cvx___.problems( end ).solver;\n    nquiet = cvx___.problems( end ).quiet;\nelse\n    nprec  = cvx___.precision;\n    npflag = cvx___.precflag;\n    nrprec = cvx___.rat_growth;\n    selected = cvx___.solvers.selected;\n    if isfield( cvx___.solvers.list, 'settings'  ),\n        nsolv  = struct( 'index', selected, 'settings', cvx___.solvers.list(selected).settings );\n    else\n        nsolv = struct( 'index', selected, 'settings', [] );\n    end\n    nquiet = cvx___.quiet;\nend\n\n%\n% Construct the object\n%\n\nz = class( struct( 'index_', length( cvx___.problems ) + 1 ), 'cvxprob', cvxobj );\ntemp = struct( ...\n    'name',          name,   ...\n    'complete',      true,   ...\n    'sdp',           false,  ...\n    'gp',            false,  ...\n    'separable',     false,  ...\n    'locked',        false,  ...\n    'precision',     nprec,  ...\n    'precflag',      npflag, ...\n    'solver',        nsolv,  ...\n    'quiet',         nquiet, ... \n    'cputime',       cputime, ...\n    'tictime',       tstart, ...\n    'rat_growth',    nrprec, ...\n    't_variable',    logical( sparse( length( cvx___.reserved ), 1 ) ), ...\n    'n_equality',    length(cvx___.equalities), ...\n    'n_linform',     length(cvx___.linforms), ...\n    'n_uniform',     length(cvx___.uniforms), ...\n    'variables',     [],         ...\n    'duals',         [],         ...\n    'dvars',         [],         ...\n    'direction',     '',         ...\n    'geometric',     [],         ...\n    'objective',     [],         ...\n    'status',        'unsolved', ...\n    'result',        [],         ...\n    'bound',         [],         ...\n    'iters',         Inf,        ...\n    'tol',           Inf,        ...\n    'depth',         depth,      ...\n    'self',          z );\ntemp.t_variable( 1 ) = true;\n\n%\n% Process the argument strings\n%\n\nfor k = 1 : nargin,\n    mode = varargin{k};\n    switch lower( mode ),\n        case 'quiet',\n            temp.quiet = true;\n        case 'set',\n            temp.complete  = false;\n            temp.direction = 'find';\n        case 'sdp',\n            if temp.gp,\n                error( 'The GP and SDP modifiers cannot be used together.' );\n            end\n            temp.sdp = true;\n        case 'gp',\n            if temp.sdp,\n                error( 'The GP and SDP modifiers cannot be used together.' );\n            end\n            temp.gp = true;\n            if cvx___.expert == 0,\n                cvx___.expert = -1;\n            end\n        case 'separable',\n            temp.separable = true;\n        otherwise,\n            error( 'Invalid CVX problem modifier: %s', mode );\n    end\nend\n\n%\n% Add the problem to the stack\n%\n\nif isempty( cvx___.problems ),\n    cvx___.problems = temp;\n    cvx_setpath(1);\n    if cvx___.profile,\n        profile resume\n    end\nelse\n    cvx___.problems( end + 1 ) = temp;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/disp.m",
    "content": "function disp( prob, prefix )\n\nif nargin < 2, prefix = ''; end\n\nglobal cvx___\np = cvx___.problems( prob.index_ );\n\nif isempty( p.variables ),\n    nvars = 0;\nelse\n    nvars = length( fieldnames( p.variables ) );\nend\nif isempty( p.duals ),\n    nduls = 0;\nelse\n    nduls = length( fieldnames( p.duals ) );\nend\nneqns = ( length( cvx___.equalities ) - p.n_equality ) + ...\n        ( length( cvx___.linforms )   - p.n_linform  ) + ...\n        ( length( cvx___.uniforms )   - p.n_uniform  );\nnineqs = nnz( cvx___.needslack( p.n_equality + 1 : end ) ) + ...\n         nnz( cvx_vexity( cvx___.linrepls( p.n_linform + 1 : end ) ) ) + ...\n         nnz( cvx_vexity( cvx___.unirepls( p.n_uniform + 1 : end ) ) );\nneqns = neqns - nineqs;     \nif isempty( p.name ) || strcmp( p.name, 'cvx_' ),\n    nm = '';\nelse\n    nm = [ p.name, ': ' ];\nend\n\nrsv = cvx___.reserved;\nnt  = length( rsv );\nfv = length( p.t_variable );\nqv = fv + 1 : nt;\ntt = p.t_variable;\nni = nnz( tt ) - 1;\nndup = sum( rsv ) - nnz( rsv );\nneqns = neqns + ndup;\nnv = nt - fv + ni + ndup;\ntt( qv ) = true;\ngfound = nnz( cvx___.logarithm( tt ) );\ncfound = false;\nfor k = 1 : length( cvx___.cones ),\n    if any( any( tt( cvx___.cones( k ).indices ) ) ),\n        cfound = true;\n        break;\n    end\nend\n\nif all( [ numel( p.objective ), nv, nvars, nduls, neqns, nineqs, cfound, gfound ] == 0 ),\n    disp( [ prefix, nm, 'cvx problem object' ] );\nelse\n    if ( p.gp ),\n        ptype =' geometric ';\n    elseif ( p.sdp ),\n        ptype = ' semidefinite ';\n    else\n        ptype = ' ';\n    end\n    if isempty( p.objective ),\n        tp = 'feasibility';\n    else\n        switch p.direction,\n            case 'minimize',  tp = 'minimization';\n            case 'epigraph',  tp = 'epigraph minimization';\n            case 'hypograph', tp = 'hypograph maximization';\n            case 'maximize',  tp = 'maximization';\n        end\n        if numel( p.objective ) > 1,\n            sz = sprintf( '%dx', size( p.objective ) );\n            tp = [ sz(1:end-1), '-objective ', tp ];\n        end\n    end\n    disp( [ prefix, nm, 'cvx', ptype, tp, ' problem' ] );\n    if nvars > 0,\n        disp( [ prefix, 'variables: ' ] );\n        [ vnam, vsiz ] = dispvar( p.variables, '' );\n        vnam = strvcat( vnam ); %#ok\n        vsiz = strvcat( vsiz ); %#ok\n        for k = 1 : size( vnam ),\n            disp( [ prefix, '   ', vnam( k, : ), '  ', vsiz( k, : ) ] );\n        end\n    end\n    if nduls > 0,\n        disp( [ prefix, 'dual variables: ' ] );\n        [ vnam, vsiz ] = dispvar( p.duals, '' );\n        vnam = strvcat( vnam ); %#ok\n        vsiz = strvcat( vsiz ); %#ok\n        for k = 1 : size( vnam ),\n            disp( [ prefix, '   ', vnam( k, : ), '  ', vsiz( k, : ) ] );\n        end\n    end\n    if neqns > 0 || nineqs > 0,\n        disp( [ prefix, 'linear constraints:' ] );\n        if neqns > 0,\n            if neqns > 1, plural = 'ies'; else plural = 'y'; end\n            fprintf( 1, '%s   %d equalit%s\\n', prefix, neqns, plural );\n        end\n        if nineqs > 0,\n            if nineqs > 1, plural = 'ies'; else plural = 'y'; end\n            fprintf( 1, '%s   %d inequalit%s\\n', prefix, nineqs, plural );\n        end\n    end\n    if cfound || gfound,\n        disp( [ prefix, 'nonlinearities:' ] );\n        if gfound > 0,\n            if gfound > 1, plural = 's'; else plural = ''; end\n            fprintf( 1, '%s   %d exponential pair%s\\n', prefix, gfound, plural );\n        end\n        if cfound,\n            for k = 1 : length( cvx___.cones ),\n                ndxs = cvx___.cones( k ).indices;\n                ndxs = ndxs( :, any( reshape( tt( ndxs ), size( ndxs ) ), 1 ) );\n                if ~isempty( ndxs ),\n                    if isequal( cvx___.cones( k ).type, 'nonnegative' ),\n                        ncones = 1;\n                        csize = numel(  ndxs  );\n                    else\n                        [ csize, ncones ] = size( ndxs );\n                    end\n                    if ncones == 1, plural = ''; else plural = 's'; end\n                    fprintf( 1, '%s   %d order-%d %s cone%s\\n', prefix, ncones, csize, cvx___.cones( k ).type, plural );\n                end\n            end\n        end\n    end\nend\n\nfunction [ names, sizes ] = dispvar( v, name )\n\nswitch class( v ),\n    case 'struct',\n        fn = fieldnames( v );\n        if ~isempty( name ), name( end + 1 ) = '.'; end\n        names = {}; sizes = {};\n        for k = 1 : length( fn ),\n            [ name2, size2 ] = dispvar( subsref(v,struct('type','.','subs',fn{k})), [ name, fn{k} ] );\n            names( end + 1 : end + length( name2 ) ) = name2;\n            sizes( end + 1 : end + length( size2 ) ) = size2;\n            if k == 1 && ~isempty( name ), name( 1 : end - 1 ) = ' '; end\n        end\n    case 'cell',\n        names = {}; sizes = {};\n        for k = 1 : length( v ),\n            [ name2, size2 ] = dispvar( v{k}, sprintf( '%s{%d}', name, k ) );\n            names( end + 1 : end + length( name2 ) ) = name2;\n            sizes( end + 1 : end + length( size2 ) ) = size2;\n            if k == 1, name( 1 : end ) = ' '; end\n        end\n    case 'double',\n        names = { name };\n        sizes = { '(constant)' };\n    otherwise,\n        names = { name };\n        sizes = { [ '(', type( v, true ), ')' ] };\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/eliminate.m",
    "content": "function [ dbCA, cones, dir, Q, P, dualized ] = eliminate( prob, destructive, can_dual )\nif nargin < 3, can_dual = nargout >= 6; end\nif nargin < 2, destructive = false; end\n\n% For the problem\n%\n%    minimize c' * x + d\n%    s.t.     y : A * x + b == 0\n%             x \\in K\n%\n% The Lagrangian is\n%   \n%  L(x,y,z) = c' * x + d - y' * ( A x + b ) - z' * x\n%\n%                            [ - d  b' 0 ]   [ 1 ]\n%            = - [ 1, x' ] * [ - c  A' I ] * [ y ]\n%                                            [ z ]\n%\n% This function provides a smaller [ d, b' ; c, A' ] with no more nonzeros\n% that solves an equivalent problem. The original x and y can be recovered\n% from the reduced xx and yy by Q*[1;xx] and P*[1;-yy], respectively.\n\n[ dbCA, cones, dir, Q, P ] = extract( prob, destructive );\ndualized = false;\nif size( dbCA, 1 ) == 1, \n    return; \nend\n\n%\n% Negate the objective so that the transformation matrices P and Q are\n% properly formed.\n%\n\ndbCA(:,1) = -dbCA(:,1);\nif ~issparse( dbCA ),\n    dbCA = sparse( dbCA );\nend\n\nfor pass = 1 : 2,\n\n    if pass == 1 || dualized,\n        n_tot = 0;\n        nn  = size(dbCA,1);\n        rsv = sparse( 1, 1, 1, nn, 1 );\n        nng = sparse( nn, 1 );\n        for k = 1 : length( cones ),\n            temp = cones(k).indices;\n            n_tot = n_tot + numel(temp);\n            temp = sparse( temp, 1, 1, nn, 1 );\n            rsv = rsv + temp;\n            if isequal( cones(k).type, 'nonnegative' ),\n                nng = nng + temp;\n            elseif can_dual && strncmp( cones(k).type, 'i_', 2 ),\n                can_dual = false;\n            end\n        end\n        rsv   = full( rsv );\n        nng   = full( nng );\n        ndxs  = ( 1 : nn )';\n        nold  = nn;\n    end\n\n    cc   = dbCA( :, 1 );\n    rcnt = sum( dbCA ~= 0, 2 );\n        \n    % In the first pass, we don't eliminate columns which have inequality\n    % structure to them, so that we can make the best decision as to\n    % whether or not to convert the problem to dual standard form. Exempted\n    % from this are columns with trivial xi = xj constraints, where xi is free.\n    if pass == 1,\n        trivs = sum( dbCA(rsv==0,:) ~= 0, 1 ) == 1 & sum( dbCA(rsv~=0,:) ~= 0, 1 ) - ( dbCA( 1, : ) ~= 0 ) == 1;\n        ineqs = full(any(dbCA(rsv~=0&rcnt==1,:),1)) & full(~trivs);\n        ineqs = +ineqs;\n    else % if dualized,\n        ineqs = zeros(1,size(dbCA,2));\n    end\n    ineqs(1) = 1;\n    \n    while true,\n        \n        success = false;\n        \n        %\n        % STEP 1: Look for free or nonnegative variables that do not appear\n        % in any constraints. Unconstrained variables that also appear in\n        % the objective are unbounded, as are nonnegative variables that\n        % appear there with the right sign. Otherwise their values might\n        % as well be zero. If we have multiple unbounded variables, keep\n        % all but one so that the solver can still see this happen.\n        %\n        % Eliminated for now. Frankly, my suspicion is that this happens\n        % very infrequently, and this code seems to have been the source\n        % of bugs in the past.\n        %\n        \n        if 0,\n            rows = ( rcnt == ( cc ~= 0 ) ) & ( ~rsv | nng );\n            nnzr = nnz( rows );\n            if nnzr > 0,\n                csgn = 1 - 2 * dualized;\n                celm = csgn * cc( rows, 1 );\n                celm( nng(rows) & celm < 0 ) = 0;\n                nnzc = nnz( celm );\n                if nnzc > 1 || nnzr > nnzc,\n                    success = true;\n                    if nnzc,\n                        cnrm = norm( celm );\n                        ndxq = find( rows );\n                        ndxq = ndxq( celm ~= 0 );\n                        ndxq = ndxq( 1 );\n                        Q( :, ndxq ) = Q( :, rows ) * ( celm / cnrm );\n                        dbCA( ndxq, 1 ) = csgn * cnrm; %#ok\n                        rows( ndxq ) = 0;\n                    end\n                    rowX = ~rows;\n                    dbCA = dbCA( rowX, : );\n                    rsv  = rsv ( rowX, : );\n                    nng  = nng ( rowX, : );\n                    ndxs = ndxs( rowX, : );\n                    Q    =    Q( :, rowX );\n                end\n            end\n        end\n        \n        %\n        % STEP 2: Look for columns which differ only by a constant factor.\n        % These correspond to redundant equality constraints. These occur\n        % often enough as as consequence of our tranformation method, and\n        % they cause problems in solvers, so we must eliminate them. Of\n        % course, if there are more complex linear dependencies in the\n        % equality constraints, we can't do anything about that.\n        %\n        \n        [ xR, dbCA ] = cvx_bcompress( dbCA, 'full', 1 );\n        if size( xR, 1 ) ~= size( xR, 2 ),\n            success = true;\n            P       = P * cvx_invert_structure( xR );\n            ineqs   = ( xR * ineqs(:) )' ~= 0;\n            ineqs   = +ineqs;\n        end\n        \n        while true,\n            \n            %\n            % STEP 3: Look for variables that we can eliminate without\n            % increasing fill-in. This means looking for rows or columns\n            % with only 1, 2, or (in some cases) 3 nonzeros.\n            %\n            \n            [ rows, cols ] = cvx_eliminate_mex( dbCA, 1, rsv, ineqs );\n            if ~any( rows ), break; end\n            success = true;\n            rows = rows ~= 0;\n            cols = cols ~= 0;\n            rowX = ~rows;\n            colX = ~cols;\n            \n            %\n            % [ x1^T x2^T ] [ C1 A11 A12 ] [ 1  ]\n            %               [ C2 A21 A22 ] [ y1 ] = 0\n            %                              [ y2 ]\n            %\n            % [ x1^T x2^T ] = x1^T [ I -A12*A22i ]\n            %\n            % [ G Y1^T Y2^T ] = [ G Y1^T ] [ I  0  -C2'*A22i'  ]\n            %                              [ 0  I  -A21'*A22i' ]\n            \n            %\n            A11  = dbCA( rowX, colX );\n            A12  = dbCA( rowX, cols );\n            A21  = dbCA( rows, colX );\n            A22  = dbCA( rows, cols );\n            if ( size( A22, 1 ) ~= size( A22, 2 ) || nnz( A22 ) ~= size( A22, 1 ) ),\n                error( 'There seems to be an error in the CVX presolver routine.\\nPlease report this to the authors; and if possible, include the\\ncvx model and data that gave you this error.', 1 ); %#ok\n            end\n            [ ii, jj, vv ] = find( A22 );\n            A22i  = sparse( jj, ii, 1.0 ./ vv );\n            temp  = - A22i * A21;\n            P     = P( :, colX ) + P( :, cols ) * temp;\n            temp  = - A12 * A22i;\n            Q     = Q( :, rowX ) + Q( :, rows ) * temp';\n            dbCA  = A11 + temp * A21;\n            rsv   =   rsv( rowX, : );\n            nng   =   nng( rowX, : );\n            ndxs  =  ndxs( rowX, : );\n            ineqs = ineqs( :, colX );\n            \n        end\n        \n        if ~success,\n            break;\n        end\n        \n        cc   = dbCA( :, 1 );\n        rcnt = sum( dbCA ~= 0, 2 );\n        \n    end\n    \n    if pass == 2 || isempty(cones) || ~can_dual,\n        break;\n    end\n    \n    %\n    % Check to see if dualization will result in smaller problem\n    %\n    ineqs(1) = 0; rsv(1) = 0;\n    n_save = nnz(cvx_eliminate_mex(dbCA,1,rsv,zeros(size(ineqs))));\n    % n_save = nnz(sum(dbCA(:,ineqs~=0)~=0,1)==1+(dbCA(1,ineqs~=0)~=0));\n    n_ineq = nnz(any(dbCA(rsv&rcnt==(cc~=0)+1,:)));\n    rsv(1) = 1; ineqs(1) = 1; %#ok\n    [n1,m1] = size(dbCA);\n    m_pri = m1 - n_save - 1;\n    n_pri = n1 - n_save - 1;\n    m_dua = n1 - n_ineq - 1;\n    n_dua = nnz( rsv ) + m1 - n_ineq - 1;\n    if ( ( m_pri > n_pri ) || ( m_pri * m_pri * n_pri > m_dua * m_dua * n_dua ) ) && ( m_dua <= n_dua ),\n        ndxs = full(sparse(ndxs,1,1:n1));\n        PP = cell(2,length(cones));\n        n_cur = m1;\n        for k = 1 : length(cones),\n            temp = cones(k).indices;\n            [nn,nv] = size(temp);\n            temp = reshape(ndxs(temp),size(temp));\n            switch cones(k).type,\n                case 'semidefinite',\n                    nt = 0.5*(sqrt(8*nn+1)-1);\n                    SS = 'symmetric';\n                case 'hermitian-semidefinite',\n                    nt = sqrt(nn);\n                    SS = 'hermitian';\n                case 'exponential',\n                    SS = sparse(inv([0,-1,0;-1,0,0;0,0,exp(1)]));\n                    SS = cvx_replicate_structure(SS,nv);\n                otherwise,\n                    SS = [];\n            end\n            PP{k} = sparse(1:numel(temp),max(temp,1),temp~=0,numel(temp),n1);\n            if ~isempty(SS),\n                if ischar(SS),\n                    SS = cvx_create_structure([nt,nt,nv],SS);\n                    SS = SS * SS';\n                end\n                PP{k} = SS * PP{k};\n            end\n            cones(k).indices = reshape(n_cur+1:n_cur+nn*nv,nn,nv);\n            n_cur = cones(k).indices(end);\n        end\n        dbCA  = vertcat(dbCA',PP{:});\n        dir   = -dir;\n        tmp   = Q; Q = P; P = tmp;\n        nold  = size(dbCA,1);\n        Q(:,nold) = 0;\n        dualized = true;\n    end\n    \nend\n\n%\n% Return the objective back to normal.\n%\n\nif dualized,\n    P = -P;\n    P(:,1) = -P(:,1);\nelse\n    dbCA(:,1) = -dbCA(:,1);\nend\n\n%\n% Move the cone indices to their new locations\n%\n\nndxs = full( sparse( ndxs, 1, 1 : length( ndxs ), nold, 1 ) );\ntt = zeros(1,length(cones));\nfor k = 1 : length( cones ),\n    temp = ndxs(cones(k).indices);\n    if all(temp),\n        temp = reshape( temp, size(cones(k).indices) );\n    else\n        temp = nonzeros(temp);\n        temp = reshape( temp, 1, length(temp) );\n    end\n    tt(k) = isempty(temp);\n    cones(k).indices = temp;\nend\nif any(tt),\n    cones(tt~=0) = [];\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/eq.m",
    "content": "function z = eq( x, y )\nif ~isa( x, class( y ) )\n    error( 'cvxprob objects may only be compared to each other.' );\nelse\n    z = cvx_id( x ) == cvx_id( y );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/extract.m",
    "content": "function [ dbcA, cones, dir, Q, P, ineqs ] = extract( pp, destructive, doineqs )\r\nif nargin < 3 || nargout < 6, doineqs = true; end\r\nif nargin < 2 || nargout < 5, destructive = false; end\r\n\r\nglobal cvx___\r\np = cvx___.problems( pp.index_ );\r\nn = length( cvx___.reserved );\r\n\r\n%\r\n% Objective\r\n%\r\n\r\ndbcA = p.objective;\r\nif isempty(p.objective),\r\n    dir = 1;\r\n    dbcA = cvx( [ 1, 1 ], [] );\r\nelseif strcmp( p.direction, 'minimize' ) || strcmp( p.direction, 'epigraph' ),\r\n    dbcA = sum( vec( dbcA ) );\r\n    dir = 1;\r\nelse\r\n    dbcA = - sum( vec( dbcA ) );\r\n    dir = -1;\r\nend\r\n\r\n%\r\n% Equality constraints\r\n%\r\n\r\nAA = cvx___.equalities;\r\nineqs = cvx___.needslack;\r\nnpre = p.n_equality;\r\nntot = length( AA );\r\nif p.n_equality > 0,\r\n    AA = AA( p.n_equality + 1 : end, : );\r\n    ineqs = ineqs( p.n_equality + 1 : end, : );\r\n    if destructive,\r\n        cvx___.equalities( p.n_equality + 1 : end ) = [];\r\n        cvx___.needslack( p.n_equality + 1 : end ) = [];\r\n    end\r\nelseif destructive,\r\n    cvx___.equalities = cvx( [ 0, 1 ], [] );\r\n    cvx___.needslack =  false( 0, 1 ) ;\r\nend\r\nif ~isempty( AA ),\r\n    ineqs = [ false ; ineqs ];\r\n    dbcA = [ dbcA ; AA ];\r\n    clear AA\r\nend\r\n\r\n%\r\n% Linear forms\r\n%\r\n\r\nif p.n_linform > 0,\r\n    A1 = cvx___.linforms( p.n_linform + 1 : end, : );\r\n    A2 = cvx___.linrepls( p.n_linform + 1 : end, : );\r\n    if destructive,\r\n        cvx___.linforms( p.n_linform + 1 : end ) = [];\r\n        cvx___.linrepls( p.n_linform + 1 : end ) = [];\r\n    end\r\nelse\r\n    A1 = cvx___.linforms;\r\n    A2 = cvx___.linrepls;\r\n    if destructive,\r\n        cvx___.linforms = cvx( [ 0, 1 ], [] );\r\n        cvx___.linrepls = cvx( [ 0, 1 ], [] );\r\n    end\r\nend\r\nif ~isempty( A1 ),\r\n    zV = cvx_vexity( A2 ); \r\n    zQ = ( zV == 0 ) - zV;\r\n    dbcA = [ dbcA ; minus( zQ .* A1, zQ .* A2, true ) ];\r\n    ineqs( end + 1 : end + length( A1 ), : ) = zV ~= 0;\r\n    clear A1 A2 zV zQ\r\nend\r\n\r\n%\r\n% Univariable forms\r\n%\r\n\r\nif p.n_uniform > 0,\r\n    A1 = cvx___.uniforms( p.n_uniform + 1 : end, : );\r\n    A2 = cvx___.unirepls( p.n_uniform + 1 : end, : );\r\n    if destructive,\r\n        cvx___.uniforms( p.n_uniform + 1 : end ) = [];\r\n        cvx___.unirepls( p.n_uniform + 1 : end ) = [];\r\n    end\r\nelse\r\n    A1 = cvx___.uniforms;\r\n    A2 = cvx___.unirepls;\r\n    if destructive,\r\n        cvx___.uniforms = cvx( [ 0, 1 ], [] );\r\n        cvx___.unirepls = cvx( [ 0, 1 ], [] );\r\n    end\r\nend\r\nif ~isempty( A2 ),\r\n    zV = cvx_vexity( A2 );\r\n    zQ = ( zV == 0 ) - zV;\r\n    dbcA = [ dbcA ; minus( zQ .* A1, zQ .* A2, true ) ];\r\n    ineqs( end + 1 : end + length( A1 ), : ) = zV ~= 0;\r\n    clear A1 A2 zV zQ\r\nend\r\n\r\n%\r\n% Convert to basis\r\n%\r\n\r\ndbcA = cvx_basis( dbcA );\r\nnA = size( dbcA, 1 );\r\nif nA < n,\r\n    dbcA( n, end ) = 0;\r\nelseif n < nA,\r\n    dbcA = dbcA( 1 : n, : );\r\nend\r\n\r\n%\r\n% Determine which inequalities need slack variables. Not all of them do,\r\n% because some may contain variables which themselves can absorb any slack,\r\n% and thus can be converted to equations without sacrificing equivalence.\r\n% We are somewhat conservative in our determinations here: the variable\r\n% must appear *only* in this inequality, and has been identified as free\r\n% to grow without further constraint in the direction of slack. For\r\n% example, consider the inequality\r\n%   x + y <= z\r\n% where y is an epigraph variable of a convex constraint f(w) <= y. If y\r\n% does not *also* appear in the objective coerced against growth, then we\r\n% are free to replace the inequality with the equation\r\n%   x + y == z\r\n% and equivalence is preserved. We attempt to be very conservative here,\r\n% so it is possible that we do not catch all of the cases where\r\n% inequalities may be converted to equations.\r\n%\r\n\r\nif any( ineqs ) && any( cvx___.canslack ),\r\n    slacks = find( cvx___.canslack );\r\n    sterms = dbcA( slacks, : );\r\n    oterms = sterms( :, 1 );\r\n    ecount = sum( sterms( :, ~ineqs ) ~= 0, 2 ) - ( oterms ~= 0 );\r\n    sterms = sterms( :, ineqs );\r\n    icount = sum( sterms ~= 0, 2 );\r\n    sterms = sum( sterms, 2 );\r\n    sdirec = cvx___.vexity( slacks );\r\n    nslack = icount == 1 & ecount == 0 & sterms .* sdirec <= 0 & sterms .* oterms >= 0;\r\n    ineqs( any( dbcA( slacks( nslack ), : ), 1 ) ) = false;\r\nend\r\n\r\n%\r\n% Select the cones used\r\n%\r\n\r\nocones = [];\r\nused = full( any( dbcA, 2 ) );\r\nif all( used ),\r\n    cones = cvx___.cones;\r\nelse\r\n    cones = [];\r\n    for k = 1 : length( cvx___.cones ),\r\n        cone = cvx___.cones( k );\r\n        temp = any( reshape( used( cone.indices ), size( cone.indices ) ), 1 );\r\n        if any( temp ),\r\n            ncone = cone;\r\n            ncone.indices = ncone.indices( :, temp );\r\n            if isempty( cones ),\r\n                cones = ncone;\r\n            else\r\n                cones = [ cones, ncone ];\r\n            end\r\n        end\r\n        if destructive && ~all( temp ),\r\n            cone.indices( :, temp ) = [];\r\n            if isempty( ocones ),\r\n                ocones = cone;\r\n            else\r\n                ocones = [ ocones, cone ];\r\n            end\r\n        end\r\n    end\r\nend\r\nif destructive,\r\n    cvx___.cones = ocones;\r\nend\r\n\r\n%\r\n% Add the slack variables\r\n%\r\n\r\nif doineqs,\r\n    nsl = nnz( ineqs );\r\n    if nsl ~= 0,\r\n        dbcA = [ dbcA ; sparse( 1 : nsl, find( ineqs ), -1, nsl, length( ineqs ) ) ];\r\n        ncone = struct( 'type', 'nonnegative', 'indices', n+1:n+nsl );\r\n        if isempty( cones ),\r\n            cones = ncone;\r\n        else\r\n            tt = find(strcmp({cones.type},'nonnnegative'));\r\n            if ~isempty( tt ),\r\n                cones(tt(1)).indices = [ cones(tt(1)).indices, ncone.indices ];\r\n            else\r\n                cones = [ ncone, cones ];\r\n            end\r\n        end\r\n    end\r\n    ineqs = [];\r\nelse\r\n    ineqs = find(ineqs);\r\nend\r\n\r\n%\r\n% Q and P matrices\r\n%\r\n\r\nused = find( used );\r\nQ = sparse( used, used, 1, n, n + nsl );\r\nP = sparse( [ 1, npre + 2 : ntot + 1 ], 1 : ntot - npre + 1, 1, ntot + 1, size( dbcA, 2 ) );\r\n\r\n%\r\n% Exponential and logarithm indices\r\n%\r\n\r\nif cvx___.exp_used,\r\n    esrc = find( cvx___.exponential );\r\n    edst = full( cvx___.exponential( esrc ) );\r\n    tt   = any(dbcA(esrc,:),2) & any(dbcA(edst,:),2);\r\n    if any( tt ),\r\n        % Determine the indices of the exponentials\r\n        esrc = esrc(tt);\r\n        edst = edst(tt);\r\n        nexp = length(esrc);\r\n        lvar = n + nsl + 3 * nexp;\r\n        % Create the exponential cones\r\n        ncone.type = 'exponential';\r\n        ncone.indices = reshape( n+nsl+1:lvar, 3, nexp );\r\n        % Expand Q, P, dbCA\r\n        Q(end,lvar) = 0;\r\n        P(end,lvar) = 0;\r\n        dbcA(lvar,end) = 0;\r\n        % Add equality consraints to tie the exponential cones to esrc and edst\r\n        % and set the exponential perspective variable to 1\r\n        ndxc = reshape( 1 : 3 * nexp, 3, nexp );\r\n        dbcA = [ dbcA, sparse( ...\r\n            [ esrc(:)' ; ones(1,nexp) ; edst(:)' ; ncone.indices ], ...\r\n            [ ndxc ; ndxc ], ... \r\n            [ ones(3,nexp) ; -ones(3,nexp) ] ) ];\r\n        if isempty( cones ),\r\n            cones = ncone;\r\n        else\r\n            tt = find(strcmp({cones.type},'exponential'));\r\n            if ~isempty( tt ),\r\n                cones(tt(1)).indices = [ cones(tt(1)).indices, ncone.indices ];\r\n            else\r\n                cones = [ cones, ncone ];\r\n            end\r\n        end\r\n    end\r\nend\r\n\r\n%\r\n% Reserved flags\r\n%\r\n\r\nif destructive,\r\n    pop( pp, 'extract' );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/index.m",
    "content": "function y = index( x )\r\ny = x.index_;\r\n\r\n% Copyright 2005-2016 CVX Research, Inc. \r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/ne.m",
    "content": "function z = ne( x, y )\nz = ~eq( x, y );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/newcnstr.m",
    "content": "function [ outp, sdp_mode ] = newcnstr( prob, x, y, op, sdp_mode )\npersistent map_eq map_le map_ge map_ne\n    \n%\n% Check problem\n%\n\nif ~isa( prob, 'cvxprob' ),\n    error( 'A cvx problem must be created first.' );\nend\nglobal cvx___\np = prob.index_;\ny_orig = y;\n\n%\n% Check for a dual reference\n%\n\ndx = cvx_getdual( x );\ndy = cvx_getdual( y );\nif isempty( dx ),\n    dx = dy;\nelseif ~isempty( dy ),\n    error( [ 'Two dual variable references found: \"', dx, '\",\"', dy, '\"' ] );\nend\nif ~isempty( dx ),\n    duals = cvx___.problems( p ).duals;\n    try\n        dual = builtin( 'subsref', duals, dx );\n    catch\n        nm = cvx_subs2str( dx );\n        error( [ 'Dual variable \"', nm(2:end), '\" has not been declared.' ] );\n    end\n    if ~isempty( dual ),\n        nm = cvx_subs2str( dx );\n        error( [ 'Dual variable \"', nm(2:end), '\" already in use.' ] );\n    end\nend\n\n%\n% Check arguments\n%\n\nif isa( x, 'cvxcnst' ), \n    x = rhs( x ); \nend\ncx = isnumeric( x ) | isa( x, 'cvx' );\ncy = isnumeric( y ) | isa( y, 'cvx' );\nif ~cx,\n    x = cvx_collapse( x, false, true );\n    cx = isnumeric( x ) | isa( x, 'cvx' );\nend\nif ~cy,\n    y = cvx_collapse( y, false, true );\n    cy = isnumeric( y ) | isa( y, 'cvx' );\nend\nsx = size( x );\nsy = size( y );\nif ~cx || ~cy,\n    if cx || cy || op(1) ~= '=',\n        error( 'Invalid CVX constraint: {%s} %s {%s}', class( x ), op, class( y ) );\n    elseif ~isequal( sx, sy ),\n        error( 'The left- and right-hand sides have incompatible sizes.' );\n    else\n        if ~isempty( dx ),\n            duals = cvx___.problems( p ).duals;\n            duals = builtin( 'subsasgn', duals, dx, cell(sx) );\n            cvx___.problems( p ).duals = duals;\n        end\n        nx = prod( sx );\n        for k = 1 : nx,\n            newcnstr( prob, x{k}, y{k}, op );\n        end\n        if nargout,\n            outp = cvxcnst( prob, y_orig );\n        end\n        return\n    end\nend\nxs = all( sx == 1 );\nys = all( sy == 1 );\nif xs,\n    sz = sy;\nelseif ys || isequal( sx, sy ),\n    sz = sx;\nelse\n    error( 'Matrix dimensions must agree.' );\nend\n\n%\n% Check readlevel\n%\n\ntx = cvx_readlevel( x );\nty = cvx_readlevel( y );\ntx = any( tx( : ) > p );\nty = any( ty( : ) > p );\nif tx || ty,\n    error( 'Constraints may not involve internal, read-only variables.' );\nend\n\n%\n% Handle the SDP case\n%\n\nif nargin < 5 || ~sdp_mode,\n    sdp_mode = op(1) ~= '='  && cvx___.problems( p ).sdp;\nend\nif sdp_mode,\n    mx = sx( 1 ) > 1 & sx( 2 ) > 1;\n    my = sy( 1 ) > 1 & sy( 2 ) > 1;\n    sdp_mode = mx || my;\nend\nif sdp_mode,\n    \n    if sx( 1 ) ~= sx( 2 ) || sy( 1 ) ~= sy( 2 ),\n        error( 'SDP constraint must be square.' );\n    elseif xs && cvx_isnonzero( x ),\n        error( 'SDP constraint {scalar} %s {matrix} valid only if the scalar is zero.', op );\n    elseif ys && cvx_isnonzero( y ),\n        error( 'SDP constraint {matrix} %s {scalar} valid only if the scalar is zero.', op );\n    elseif ~cvx_isaffine( x ) || ~cvx_isaffine( y ),\n        error( 'Both sides of an SDP constraint must be affine.' );\n    end\n    zq = any( cvx_basis( x ), 1 ) | any( cvx_basis( y ), 1 );\n    qn = bsxfun( @plus, (1:sz(1)+1:sz(1)*sz(2))', 0:sz(1)*sz(2):prod(sz)-1 );\n    if nnz( zq ) == nnz( zq( qn ) ),\n        [ tx, dummy ] = find( cvx_basis( nonnegative( numel(qn) ) ) );\n        z = cvx( sz, sparse( tx, qn, 1, tx(end), prod(sz) ) );\n    else\n        z = semidefinite( sz, ~isreal( x ) || ~isreal( y ) );\n    end\n    if op(1) == '>',\n        z = minus( x, plus( y, z ) );\n    else\n        z = minus( y, plus( x, z ) );\n    end\n    op = '==';\n\nelse\n    \n    sdp_mode = false;\n    if isempty( map_ge ),\n        temp    = cvx_remap( 'constant' );\n        temp    = ~ ( temp' * temp );\n        \n        map_ne  = cvx_remap;\n\n        map_eq2 = cvx_remap( 'log-affine' );\n        map_eq2 = ( map_eq2' * map_eq2 ) & temp;\n        map_eq3 = cvx_remap( 'affine' );\n        map_eq3 = map_eq3' * map_eq3;\n        map_eq  = 2 * map_eq2 + map_eq3;\n\n        % Trivially feasible constraints\n        map_ge1 = ( cvx_remap( 'log-concave' )' * cvx_remap( 'nonpositive' ) ) & temp;\n        % Trivially infeasible constraints\n        map_ge2 = ( cvx_remap( 'nonpositive' )' * cvx_remap( 'log-convex'  ) ) & temp;\n        % Full geometric constraints\n        map_ge3  = ( cvx_remap( 'log-concave' )' * cvx_remap( 'log-convex'  ) ) & temp;\n        % Linear constraints\n        map_ge4 = ( cvx_remap( 'concave' )' * cvx_remap( 'convex' ) ) & ~map_ge3;\n        map_ge = map_ge4 + 2 * map_ge3 + 3 * map_ge2 + 4 * map_ge1;\n\n        map_le = map_ge';\n    end\n    switch op(1),\n        case '<',\n            remap = map_le;\n        case '>',\n            remap = map_ge;\n        case '~',\n            remap = map_ne;\n        otherwise,\n            remap = map_eq;\n    end\n    vx = cvx_classify( x );\n    vy = cvx_classify( y );\n    vm = vx + size( remap, 1 ) * ( vy - 1 );\n    vr = remap( vm );\n    tt = vr( : ) == 0;\n    if any( tt ),\n        [ vu, vi ] = unique( vm );\n        vi = vi( remap( vu ) == 0 );\n        strs = {};\n        xt = x; yt = y;\n        for k = 1 : length( vi ),\n            if any( sx ~= 1 ), xt = x(vi(k)); end\n            if any( sy ~= 1 ), yt = y(vi(k)); end\n            strs{k+1} = sprintf( '\\n   Invalid constraint: {%s} %s {%s}', cvx_class( xt, false, true ), op, cvx_class( yt, false, true ) );\n        end\n        error( [ sprintf( 'Disciplined convex programming error:' ), strs{:} ] );\n    end\n    tt = vr( : ) == 2;\n    if any( tt ),\n        if all( tt ),\n            x = log( x );\n            y = log( y );\n        else\n            if isscalar( x ), x = x * ones(size(y)); end\n            if isscalar( y ), y = y * ones(size(x)); end\n            x( tt ) = log( x( tt ) );\n            y( tt ) = log( y( tt ) );\n        end\n    end\n    tt = vr( : ) == 3;\n    if any( tt ),\n        x( tt ) = 0;\n        y( tt ) = 1 - 2 * ( op(1) == '<' );\n    end\n    tt = vr( : ) == 4;\n    if any( tt ),\n        x( tt ) = 0;\n        y( tt ) = 1 - 2 * ( op(1) == '>' );\n    end\n    if op(1) == '<',\n        z = minus( y, x );\n    else\n        z = minus( x, y );\n    end\n    \nend\n\n%\n% Eliminate lexical redundancies\n%\n\nif op( 1 ) == '=',\n    cmode = 'full';\nelse\n    cmode = 'magnitude';\nend\n[ zR, zL ] = bcompress( z, cmode );\nif sdp_mode,\n    if isreal( zR ),\n        nnq = 0.5 * sz( 1 ) * ( sz( 1 ) + 1 );\n    else\n        nnq = sz( 1 ) * sz( 1 );\n    end\n    if size( zR, 1 ) > nnq * prod( sz( 3 : end ) ),\n        warning( 'CVX:UnsymmetricLMI', [ ...\n            'This linear matrix inequality appears to be unsymmetric. This is\\n', ...\n            'very likely an error that will produce unexpected results. Please check\\n', ...\n            'the LMI; and, if necessary, re-enter the model.' ], 1 );  \n    end\nend\n\n%\n% Add the (in)equalities\n%\n\ntouch( prob, zL, op(1) == '=' );\nmO = length( cvx___.equalities );\nmN = length( zL );\ncvx___.equalities = vertcat( cvx___.equalities, zL );\ncvx___.needslack( end + 1 : end + mN, : ) = op( 1 ) ~= '=';\n\n%\n% Create the dual\n%\n\nif ~isempty( dx ),\n    zI = cvx_invert_structure( zR )';\n    zI = sparse( mO + 1 : mO + mN, 1 : mN, 1 ) * zI;\n    zI = cvx( sz, zI );\n    duals = builtin( 'subsasgn', duals, dx, zI );\n    cvx___.problems( p ).duals = duals;\nend\n\n%\n% Create the output object\n%\n\nif nargout,\n    outp = cvxcnst( prob, y_orig );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/newdual.m",
    "content": "function z = newdual( prob, name, reps )\nnarginchk(2,3);\n\n%\n% Check problem\n%\n\nif ~isa( prob, 'cvxprob' ),\n    error( 'First argument must be a cvxprob object.' );\nend\nglobal cvx___\np = prob.index_;\nvars = cvx___.problems( p ).duals;\n\n%\n% Check name\n%\n\nif isempty( name ),\n    error( 'Anonymous dual variables are not allowed.' );\nelseif ischar( name ),\n    if ~isempty( name ),\n        if size( name, 1 ) ~= 1,\n            error( 'Second argument must be a string or a subscript structure array.' );\n        elseif ~isvarname( name ),\n            error( 'Invalid dual variable name: %s', name );\n        elseif isfield( vars, name ),\n            error( 'Dual variable name conflict: %s', name );\n        elseif isfield( cvx___.problems( p ).variables,name ),\n            error( 'Primal/dual variable name conflict: %s', name );\n        end\n    end\nend\n\n%\n% Check repetition\n%\n\nif nargin < 3,\n    reps = [];\nelseif ~isempty( reps ),\n    [ temp, reps ] = cvx_check_dimlist( reps, true );\n    if ~temp,\n        error( 'Third argument must be a dimension list.' );\n    end\nend\n\n%\n% Add the variable to the problem\n%\n\nnstr = struct( 'type', '.', 'subs', name );\nif ~isempty( reps ),\n    y = cell( reps );\n    [ y{:} ] = deal( cvx );\n    z = cell( reps );\n    q = cell( reps );\n    ndxs = cell( 1, length( reps ) - ( reps(end) == 1 ) );\n    [ ndxs{:} ] = ind2sub( reps, 1 : prod( reps ) );\n    ndxs = vertcat( ndxs{:} );\n    nstr(2).type = '{}';\n    for k = 1 : prod( reps ),\n        nstr(2).subs = sprintf( '%d,', ndxs(:,k) );\n        nstr(2).subs = eval( [ '{', nstr(2).subs(1:end-1), '}' ] );\n        z{k} = cvxdual( p, nstr );\n    end\nelse\n    y = [];\n    z = cvxdual( p, nstr );\nend\nvars = cvx___.problems( p ).dvars;\nvars = builtin( 'subsasgn', vars, nstr(1), z );\ncvx___.problems( p ).dvars = vars;\nvars = cvx___.problems( p ).duals;\nvars = builtin( 'subsasgn', vars, nstr(1), y );\ncvx___.problems( p ).duals = vars;\ncvx___.x = [];\ncvx___.y = [];\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/newnonl.m",
    "content": "function newnonl( prob, ncones, arg ) %#ok\r\nnarginchk(2,3);\r\nglobal cvx___\r\ncones = cvx___.cones;\r\nif nargin == 3,\r\n    ncones = struct( 'type', ncones, 'indices', arg );\r\nend\r\nfor k = 1 : length( ncones ),\r\n    ncone = ncones(k);\r\n    if any( cvx___.reserved( ncone.indices( : ) ) ),\r\n        error( 'Variables placed in nonlinearities must be free.' );\r\n    else\r\n        cvx___.reserved( ncone.indices ) = 1;\r\n    end\r\n    if isequal( ncone.type, 'nonnegative' ),\r\n        ncone.indices = ncone.indices(:)';\r\n    end\r\n    if isempty( cones ),\r\n        cones = ncone;\r\n    else\r\n        match = find( strcmp( { cones.type }, ncone.type ) );\r\n        if ~isempty( match ),\r\n            nlsiz = size( ncone.indices, 1 );\r\n            match = match( cellfun( 'size', { cones(match).indices }, 1 ) == nlsiz );\r\n            if isempty( match ),\r\n                cones = [ cones, ncone ];\r\n            else\r\n                match = match(1);\r\n                cones(match).indices = [ cones(match).indices, ncone.indices ];\r\n            end\r\n        else\r\n            cones = [ cones, ncone ];\r\n        end\r\n    end\r\nend\r\ncvx___.cones = cones;\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/newobj.m",
    "content": "function newobj( prob, dir, x )\nnarginchk(3,3);\n\npersistent remap_min remap_max remap\nif isempty( remap_max ),\n    remap_min = cvx_remap( 'convex', 'log-convex' );\n    remap_max = cvx_remap( 'concave', 'log-concave' );\n    remap = cvx_remap( 'log-valid' ) & ~cvx_remap( 'constant' );\nend\n\n%\n% Check problem\n%\n\nif ~isa( prob, 'cvxprob' ),\n    error( 'First argument must be a cvxprob object.' );\nend\nglobal cvx___\np = prob.index_;\nif ~isempty( cvx___.problems( p ).direction ),\n\tif isequal( dir, 'find' ),\n        error( 'Objective functions cannot be added to sets.' );\n    else\n\t    error( 'An objective has already been supplied for this problem.' );\n\tend\nend\n\n%\n% Check direction\n%\n\nif ~ischar( dir ) || size( dir, 1 ) ~= 1,\n    error( 'The second argument must be a string.' );\nend\n\n%\n% Check objective expression\n%\n\nif ~isa( x, 'cvx' ) && ~isa( x, 'double' ) && ~isa( x, 'sparse' ),\n    error( 'Cannot accept an objective of type ''%s''.', class( x ) );\nelseif ~isreal( x ),\n    error( 'Expressions in objective functions must be real.' );\nelseif isempty( x ),\n    warning( 'CVX:EmptyObjective', 'Empty objective.' );\nend\ncx = cvx_classify( x );\nswitch dir,\n    case 'minimize',\n\t \tvx = remap_min( cx );\n    case 'maximize',\n\t \tvx = remap_max( cx );\n    otherwise,\n        error( 'Invalid objective type: %s', dir );\nend\nif ~all( vx ),\n    error( 'Disciplined convex programming error:\\n   Cannot %s a(n) %s expression.', dir, cvx_class(x(vx==0),false,true) );\nend\n\n%\n% Store the objective\n%\n\nvx = remap( cx );\nif any( vx ),\n    if all( vx ),\n        x = log( x );\n    else\n        x( vx ) = log( x( vx ) );\n    end\nend\nif isa( x, 'cvx' ),\n    zndx = any( cvx_basis( x ), 2 );\n    v = cvx___.problems( p ).t_variable;\n    cvx___.problems( p ).t_variable = v | zndx( 1 : size( v, 1 ), : );\nend\ncvx___.problems( p ).objective = x;\ncvx___.problems( p ).direction = dir;\ncvx___.problems( p ).geometric = vx;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/newtemp.m",
    "content": "function z = newtemp( prob, siz )\n\n% NEWTEMP Creates a temporary variable.\n\nglobal cvx___\nvstr = cvx___.problems( prob.index_ ).variables;\nif isfield( vstr, 'temp_' ),\n    ndx = length( vstr.temp_ );\nelse\n    ndx = 0;\nend\nbase = struct( 'type', { '.', '{}' }, 'subs', { 'temp_', { ndx + 1 } } );\nz = newvar( prob, base, siz );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/newvar.m",
    "content": "function y = newvar( prob, name, siz, str, geo )\nnarginchk(2,5);\n\n%\n% Check problem\n%\n\nif ~isa( prob, 'cvxprob' ),\n    error( 'First argument must be a cvxprob object.' );\nend\np = prob.index_;\nglobal cvx___\n\n%\n% Check name\n%\n\nif isempty( name ),\n    nstr = [];\nelseif ischar( name ),\n    nstr = struct( 'type', '.', 'subs', name );\nelseif ~isstruct( name ),\n    error( 'Second argument must be a string or a subscript structure array.' );\nelse\n    nstr = name;\n    name = cvx_subs2str( name, [ 1, 0, 1 ], 1 );\n    name(1) = [];\n    if ~isequal( nstr(1).type, '.' ),\n        error( 'Invalid subscript structure: first element must be a field reference.' );\n    end\nend\n\n%\n% Retrieve an existing variable, and check for conflicts\n%\n\nvars = cvx___.problems( p ).variables;\nif ~isempty( nstr ),\n    try\n        y = builtin( 'subsref', vars, nstr );\n    catch\n        y = [];\n    end\n    if nargin == 2,\n        if ~isempty( y ), return; end\n        error( [ 'Unknown variable: ', name ] );\n    elseif ~isempty( y ),\n        error( [ 'Duplicate variable name: ', name ] );\n    end\nelseif nargin == 2,\n    error( 'Second argument must be a non-empty string or subscript structure array.' );\nelse\n    y = []; %#ok\nend\n\n%\n% Check for conflict with dual variable\n%\n\nif ~isempty( nstr ) && isfield( cvx___.problems( p ).duals, nstr(1).subs ),\n    error( 'Primal/dual variable name conflict: %s', nstr(1).subs );\nend\n\n%\n% Quick exit for retrieval mode\n%\n\nif nargin == 2,\n    y = cvx___.problems( p ).variables;\n    try\n        y = subsref( y, name );\n        return\n    catch\n        error( [ 'Unknown variable: ', nstr ] );\n    end\nend\n\n%\n% Create the variable\n%\n\nif isa( siz, 'cvx' ),\n\n    %\n    % Out of an existing object\n    %\n\n    y = newsubst( prob, siz );\n\nelse\n\n    %\n    % Check size\n    %\n\n    [ temp, siz ] = cvx_check_dimlist( siz, true );\n    if ~temp,\n        error( 'Invalid size vector.' );\n    end\n\n    %\n    % Check structure\n    %\n\n    len = prod( siz );\n    if nargin < 4 || isempty( str ),\n        dof = len;\n        str = [];\n    elseif ~isnumeric( str ) || ndims( str ) > 2 || size( str, 2 ) ~= len, %#ok\n        error( 'Fourth argument must be a valid structure matrix.' );\n    elseif nnz( str ) == 0,\n        error( 'Structure matrix cannot be identically zero.' );\n    else\n        temp = any( str, 2 );\n        dof = full( sum( temp ) );\n        if dof ~= length( temp ),\n            str = str( temp, : );\n        end\n    end\n\n    %\n    % Geometric flag\n    %\n\n    if nargin < 5 || isempty( geo ),\n        geo = false;\n    elseif ~isnumeric( geo ) && ~islogical( geo ) || length( geo ) ~= 1,\n        error( 'Fifth argument must be true or false.' );\n    end\n\n    %\n    % Allocate the raw variable data\n    %\n\n    geo = any( geo( : ) );\n    ndim = length( cvx___.reserved );\n    ndim = ndim + 1 : ndim + dof;\n    nmel = ( 1 + geo ) * dof;\n    cvx___.reserved( end + nmel, 1 ) = 0;\n    cvx___.vexity( end + dof, 1 ) = 0;\n    cvx___.canslack( end + 1 : end + nmel, 1 ) = true;\n    cvx___.readonly( end + 1 : end + nmel, 1 ) = p;\n    cvx___.logarithm( end + dof, 1 ) = 0;\n    if geo,\n        cvx___.vexity( end + 1 : end + dof, 1 ) = 1;\n        cvx___.logarithm( end + 1 : end + dof, 1 ) = ndim';\n        ndim = ndim(end) + 1 : ndim(end) + dof;\n        cvx___.exponential( end + 1 : end + dof, 1 ) = ndim';\n        cvx___.exp_used = true;\n    end\n    cvx___.exponential( end + dof, 1 ) = 0;\n    cvx___.x = [];\n    cvx___.y = [];\n\n    %\n    % Create the variable object\n    %\n\n    if dof == 0,\n        str2 = sparse( 1, 0 );\n    else\n        str2 = sparse( ndim, 1 : dof, 1 );\n        if ~isempty( str ),\n            str2 = str2 * str;\n        end\n    end\n    y = cvx( siz, str2, dof * ( 1 - 2 * geo ), false );\n\nend\n\n%\n% If the variable is named, save it in the problem structure\n%\n\nif ~isempty( nstr ),\n    try\n        cvx___.problems( p ).variables = builtin( 'subsasgn', vars, nstr, y );\n    catch\n        error( [ 'Invalid variable name: ', name ] );\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/pop.m",
    "content": "function pop( depth, clearmode )\n\n%\n% Determine the index of the problem to be cleaned up\n%\n\nglobal cvx___\nif nargin < 2, \n\tclearmode = 'clear'; \nend\nif isempty( cvx___ ),\n\tcvx_global\n\treturn\nend\np = depth.index_;\nif p > length( cvx___.problems ),\n\treturn\nend\n\n%\n% Determine the indices of the variables, constraints, etc.\n%\n\nif p < 1,\n    p   =  1;\n    pid = -1;\n    nf  =  0;\n    ne  =  1;\n    nl  =  1;\n    nu  =  1;\nelse\n    prob = cvx___.problems( p );\n    pid  = cvx_id( prob.self );\n    nf   = length( prob.t_variable ) + 1;\n    ne   = prob.n_equality + 1;\n    nl   = prob.n_linform + 1;\n    nu   = prob.n_uniform + 1;\nend\n\n%\n% Clear the corresponding and equality constraints and variables\n%\n\nif ~isequal( clearmode, 'none' ),\n    if nf <= 2,\n        cvx___.reserved    = 0;\n        cvx___.vexity      = 0;\n        cvx___.canslack    = false;\n        cvx___.readonly    = 0;\n        cvx___.cones       = struct( 'type', {}, 'indices', {} );\n        if ~isequal( clearmode, 'extract' ),\n            cvx___.exponential = sparse( 1, 1 );\n            cvx___.logarithm   = sparse( 1, 1 );\n            cvx___.exp_used    = false;\n        end\n    elseif length( cvx___.reserved ) >= nf,\n        temp = nf : length( cvx___.reserved );\n        cvx___.reserved(    temp, : ) = [];\n        cvx___.vexity(      temp, : ) = [];\n        cvx___.canslack(    temp, : ) = [];\n        cvx___.readonly(    temp, : ) = [];\n        if ~isempty( cvx___.cones ),\n            tt = true( 1, length( cvx___.cones ) );\n            for k = 1 : length( cvx___.cones ),\n                cvx___.cones( k ).indices( :, any( cvx___.cones( k ).indices >= nf, 1 ) ) = [];\n                if isempty( cvx___.cones( k ).indices ), tt( k ) = false; end\n            end\n            cvx___.cones = cvx___.cones( 1, tt );\n        end\n        if ~isequal( clearmode, 'extract' ),\n            cvx___.exponential( temp, : ) = [];\n            cvx___.logarithm(  temp, : ) = [];\n            cvx___.exp_used = nnz( cvx___.exponential );\n        end\n    end\n    if nf <= 2 || ne <= 1,\n        cvx___.equalities = cvx( [ 0, 1 ], [] );\n        cvx___.needslack = ( false( 0, 1 ) );\n    elseif length( cvx___.equalities ) >= ne,\n        cvx___.equalities( ne : end ) = [];\n        cvx___.needslack( ne : end ) = [];\n    end\n    if nf <= 2 || nl <= 1,\n        cvx___.linforms = cvx( [ 0, 1 ], [] );\n        cvx___.linrepls = cvx( [ 0, 1 ], [] );\n    elseif length( cvx___.linforms ) >= nl,\n        cvx___.linforms( nl : end ) = [];\n        cvx___.linrepls( nl : end ) = [];\n    end\n    if nf <= 2 || nu <= 1,\n        cvx___.uniforms = cvx( [ 0, 1 ], [] );\n        cvx___.unirepls = cvx( [ 0, 1 ], [] );\n    elseif length( cvx___.uniforms ) >= nu,\n        cvx___.uniforms( nu : end ) = [];\n        cvx___.unirepls( nu : end ) = [];\n    end\n    cvx___.nan_used = any( isnan( cvx___.vexity ) );\nend\n\nif ~isequal( clearmode, 'extract' ),\n    \n    %\n    % Clear the workspace\n    %\n\n    if ~isequal( clearmode, 'reset' ),\n        s1 = evalin( 'caller', 'who' );\n        s2 = sprintf( '%s, ', s1{~strcmp(s1,'cvx___')} );\n        s2 = evalin( 'caller', sprintf( 'cellfun( @cvx_id, { %s } )', s2(1:end-2) ) );\n        tt = s2 >= pid;\n        s1 = s1( tt );\n        s2 = s2( tt );\n        if ~isempty( s1 ),\n            switch clearmode,\n                case 'value',\n                    tt = s2 == pid;\n                    if any( tt ),\n                        evalin( 'caller', sprintf( '%s ', 'clear ', s1{tt} ) );\n                        s1(tt) = [];\n                    end\n                    if ~isempty( s1 ),\n                        temp = sprintf( '%s, ', s1{:} );\n                        temp(end-1:end) = [];\n                        evalin( 'caller', sprintf( '[ %s ] = cvx_values( %s );', temp, temp ) );\n                    end\n                case 'clear',\n                    evalin( 'caller', sprintf( '%s ', 'clear', s1{:} ) );\n                case 'none',\n                    tt = find( s2 == pid );\n                    if any( tt ),\n                        evalin( 'caller', sprintf( '%s ', 'clear', s1{tt} ) );\n                    end\n            end\n        end\n        evalin( 'caller', 'clear cvx_problem' );\n    end\n    \n    %\n    % Clear the problem stack and value vectors\n    %\n\n    cvx___.problems( p : end ) = [];\n    cvx___.x = [];\n    cvx___.y = [];\n    if p == 1,\n        cvx_clearpath( 1 );\n    end\n    \nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/solve.m",
    "content": "function solve( prob )\n\nglobal cvx___\np     = prob.index_;\npr    = cvx___.problems( p );\nquiet = pr.quiet;\nobj   = pr.objective;\ngobj  = pr.geometric;\nprec  = pr.precision;\nsolv  = pr.solver;\nndual = ~isempty( pr.duals );\nshim  = cvx___.solvers.list( solv.index );\nif isempty(shim.eargs), eargs = {}; else eargs = shim.eargs; end\nnobj  = numel( obj );\nif nobj > 1 && ~pr.separable,\n    error( 'CVX:NonScalarObjective', 'Your objective function is not a scalar.' );\nend\n[ At, cones, sgn, Q, P, dualized ] = eliminate( prob, true, shim.dualize );\n\nif ndual && any( strncmp( {cones.type}, 'i_', 2 ) ),\n    idual_error = true;\n    ndual = false;\nelse\n    idual_error = false;\nend\n\nc = At( :, 1 );\nAt( :, 1 ) = [];\nd = c( 1, : );\nc( 1, : ) = [];\n[ n1, m ] = size( At );\nif n1 < 1,\n    b = zeros( m, 1 );\nelse\n    b = - At( 1, : ).';\n    At( 1, : ) = [];\nend\nn = n1 - 1;\nfor k = 1 : length( cones ),\n    cones(k).indices = cones(k).indices - 1;\nend\n\nzero_c = false ; % nnz( c ) == 0;\nif zero_c,\n    c = [ c ; 1 ]; %#ok\n    At(end+1,:) = b * sqrt(mean(sum(At.^2))) / norm(b);\n    cones(end+1) = struct( 'type', 'nonnegative', 'indices', n+1 );\n    n = n + 1;\nend\n\n%\n% Ferret out the degenerate and overdetermined problems\n%\n\nx     = NaN * ones(n,1);\ny     = NaN * ones(m,1);\noval  = NaN;\nbval  = NaN;\npval  = NaN;\ndval  = NaN;\ntprec = Inf;\nestruc = [];\n\niters = 0;\ntt = ( b' ~= 0 ) & ~any( At, 1 );\ninfeas = any( tt );\nif m > n && n > 0,\n    \n    %\n    % Overdetermined problem\n    %\n    \n    if dualized,\n        status = 'Underdetermined';\n        estr = sprintf( 'Underdetermined inequality constraints detected.\\n   CVX cannot solve this problem; but it is likely unbounded.' );\n    else\n        status = 'Overdetermined';\n        estr = sprintf( 'Redundant equality constraints detected.\\n   CVX cannot solve this problem; but it is likely infeasible.' );\n    end\n    if ~quiet,\n        disp( estr );\n    else\n        warning( [ 'CVX:', status ], estr );\n    end\n\nelseif n ~= 0 && ~infeas && ( any( b ) || any( c ) ),\n        \n    %\n    % Call solver\n    %\n    \n    if isempty( cones ),\n        texp = [];\n    else\n        texp = find( strcmp( { cones.type }, 'exponential' ) );\n    end\n    need_iter = ~isempty( texp ) && shim.dualize;\n    cvx_setspath;\n    if ~quiet,\n        disp( ' ' );\n        spacer = '-';\n        if need_iter,\n            disp( 'Successive approximation method to be employed.' );\n        else\n            sname = shim.name;\n            if ~isempty( shim.version ), sname = [ sname, ' ', shim.version ]; end\n            fprintf( 'Calling %s: %d variables, %d equality constraints\\n', sname, n, m );\n            spacer = spacer(:,ones(1,60));\n        end\n        if dualized,\n            fprintf( '   For improved efficiency, %s is solving the dual problem.\\n', shim.name );\n        end\n        if need_iter,\n            fprintf( '   %s will be called several times to refine the solution.\\n', shim.name );\n            fprintf( '   Original size: %d variables, %d equality constraints\\n', n, m );\n            spacer = spacer(:,ones(1,65));\n        else\n            disp( spacer );\n        end\n    end\n    if cvx___.profile, profile off; end\n    tstart = tic;\n    if need_iter,\n        \n        %\n        % Cone:\n        %     cl { (x,y,z) | y*exp(x/y) <= z, y > 0 }\n        %   = cl { (x,y,z) | x <= -y*log(y/z), z > 0 }\n        % Approximation: given a shift point x0,\n        %    { (x,y,z) | y*exp(x0)*pos(1+(x/y-x0)/16)^16 <= z, y > 0 }\n        %    { (x,y,z) | y+(x-x0*y)/16 <= exp(-x0/16)*geo_mean([z,y],[],[1,15])\n        % Transformed cone:\n        %   4 semidefinite cones, 1 free, 1 slack\n        %   [ w1    ][ w4    ] [ w7    ] [ w10     ] w13\n        %   [ w2 w3 ][ w5 w6 ] [ w8 w9 ] [ w11 w12 ] w14\n        %   w2 = w4, w5 = w7, w8 = w10\n        %   w3 = w6, w6 = w9, w9 = w12,\n        %   exp(-x0/16) * w11 = w3 ( 1 - x0 / 16 ) + w13 / 16 + w14\n        % Recovery:\n        %   x = w13\n        %   y = w3\n        %   z = w1\n        %\n        \n        ndxs  = cat( 2, cones(texp).indices );\n        nc    = size(ndxs,2);\n        xndxs = ndxs(1,:);\n        yndxs = ndxs(2,:);\n        zndxs = ndxs(3,:);\n        x0    = realmin * ones(nc,1);\n        maxw  = log(realmax);\n        \n        epow = 8;\n        switch epow,\n            case 16,\n                QAi  = [ 2, 4, 3, 6, 5, 7, 6, 9, 8,10, 9,12,3,        11,  13, 14 ]';\n                QAj  = [ 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,7,         7,   7,  7 ]';\n                QAv  = [+1,-1,+1,-1,+1,-1,+1,-1,+1,-1,+1,-1,1.001,-1.002,1/16,  1 ]';\n                QAr  = [3,4,2,5,6,7,8,9,10,11,12,13,1,14];\n                % ewid = 1.75;\n            case 8,\n                QAi  = [ 2, 4, 3, 6, 5, 7, 6, 9,3,         8,  10, 11 ]';\n                QAj  = [ 1, 1, 2, 2, 3, 3, 4, 4,5,         5,   5,  5 ]';\n                QAv  = [+1,-1,+1,-1,+1,-1,+1,-1,1.001,-1.002, 1/8,  1 ]';\n                QAr  = [3,4,2,5,6,7,8,9,10,1,11];\n                % ewid = 1.22;\n            case 4,\n                QAi  = [ 2, 4, 3, 6,3,         5,   7,  8 ]';\n                QAj  = [ 1, 1, 2, 2,3,         3,   3,  3 ]';\n                QAv  = [+1,-1,+1,-1,1.001,-1.002, 1/4,  1 ]';\n                QAr  = [3,4,2,5,6,7,1,8];\n                % ewid = 0.84;\n        end\n        \n        nQA     = max(QAi);\n        mQA     = max(QAj);\n        nc      = size(ndxs,2);\n        new_n   = n + (nQA-3) * nc; % + 1;\n        new_m   = m + mQA * nc;\n        n_ndxs  = [ ndxs ; reshape( n + 1 : new_n, nQA-3, nc  ) ];\n        n_ndxs  = n_ndxs(QAr,:);\n        if ~quiet,\n            fprintf( '   %d exponentials add %d variables, %d equality constraints\\n', nc, new_n - n, new_m - m );\n            disp( spacer );\n        end\n\n        % Stuff free variables into a lorentz cone to preserve warm start\n        % tfree = ones( 1, n );\n        % for k = 1 : length(cones),\n        %     tfree(cones(k).indices) = 0;\n        % end\n        % tfree(xndxs) = 1;\n        % tfree = find(tfree);\n        \n        % Perform (x,y,z) ==> w transformation on A and C\n        c (new_n,end) = 0;\n        At(new_n,end) = 0;\n        \n        % Add new cone constraints\n        lQA   = length(QAi);\n        nc0   = 0:mQA:mQA*(nc-1);\n        nc1   = ones(1,nc);\n        Anew  = sparse( n_ndxs(QAi,:), ...\n                 QAj(:,nc1) + nc0(ones(lQA,1),:), ...\n                 QAv(:,nc1), new_n, mQA * nc );\n        bnew  = zeros( new_m - m, 1 );\n        \n        endxs = n_ndxs(nQA-3,:) + (mQA-1+nc0) * new_n;\n        fndxs = n_ndxs(3,:)     + (mQA-1+nc0) * new_n;\n        \n        ncone.type       = 'semidefinite';\n        ncone.indices    = reshape(n_ndxs(1:nQA-2,:),3,(nQA-2)*nc/3);\n        ncone(2).type    = 'nonnegative';\n        ncone(2).indices = n_ndxs(nQA,:);\n        cones(texp) = [];\n        cones = [ cones, ncone ];\n        \n        arow = size(Anew,2) / nc;\n        orow = ones(arow,1);\n        amult = ones(1,nc);\n        epow_i = 1 / epow;\n\n        oprec = prec;\n        best_x = NaN * ones(n,1);\n        best_y = NaN * ones(m,1);\n        best_prec = Inf;\n        if ~quiet, \n            disp( ' Cones  |             Errors              |' );\n            disp( 'Mov/Act | Centering  Exp cone   Poly cone | Status' );\n            disp( '--------+---------------------------------+---------' );\n        end\n        failed = 0;\n        attempts = 0;\n        last_err = Inf;\n        last_cer = Inf;\n        last_solved = 0;\n        max_eiters = 25;\n        for iter = 1 : max_eiters,\n            % Insert the current centerpoints into the constraints\n            x0e = x0 * epow_i;\n            ex0e = exp( -x0e );\n            Anew(endxs) = - ex0e; %#ok\n            Anew(fndxs) = 1 - x0e; %#ok\n            Anew2 = Anew * diag(sparse(vec(amult(orow,:))));\n            \n            % Solve the approximation\n            [ x, status, tprec, iters2, y, z ] = shim.solve( [ At, Anew2 ], [ b ; bnew ], c, cones, true, prec, solv.settings, eargs{:} );\n            iters = iters + iters2;\n            x_valid = ~any(isnan(x));\n            y_valid = ~any(isnan(y));\n           \n            % The approximate primal cone is a strict subset of the exact\n            % primal cone. A point that is feasible for the approximate \n            % model is guaranteed to be feasible for the exact model only\n            % if x/y == x0. Furthermore, the larger |x/y-x0| is, the weaker\n            % the approximation. So, our goal in these iterations is to\n            % minimize |x/y - x0|. The hope is that we can reduce this gap\n            % to the point that the deviation from exact feasibility is\n            % within our desired numerical tolerance.\n            % Exact:  y .* exp( x ./ y ) <= z\n            % Approx: exp(x0) .* y .* max(0,1+(x./y-x0)/p).^p <= z\n            if x_valid,\n                xxx = x( xndxs, : );\n                yyy = max( realmin, x( yndxs, : ) );\n                zzz = max( realmin, x( zndxs, : ) );\n                nmX = sqrt( xxx .^ 2 + yyy .^ 2 + zzz .^ 2 );\n                xxy = xxx ./ yyy - x0;\n                zzy = zzz ./ yyy;\n                xxz = log( zzy ) - x0;\n                xxc = epow * ( max( 0, zzy .^ epow_i .* ex0e ) - 1 );\n                tlX = max( 0, xxy - xxc );\n                erX = max( 0, xxy - xxz );\n                acX = erX ~= 0;\n                cxX = xxy + 0.5 * ( xxz - xxy ) .* acX;\n                ttt = yyy == realmin;\n                if any( ttt ),\n                    xxy( ttt ) = -2 * ( sign( xxx( ttt ) ) * realmax );\n                    cxX( ttt ) = max( 1 - epow, min( xxy( ttt ), epow - 1 ) );\n                    tlX( ttt ) = 0;\n                    erX( ttt ) = 0;\n                end\n            end\n            \n            % The exact dual cone is a strict subset of the approximate\n            % dual cone. Therefore any point that is dual feasible in the\n            % approximate model is also dual feasible in the exact model.\n            % The further x/y is from x0, the farther away such a point\n            % will be from the boundary of the exact dual cone.\n            % Exact:  -u.*exp(v/u-1)<=w\n            % Approx: -exp(-x0).*u.*(1-(v./u-1+x0)/(p-1)).^(1-p)<=w\n            if y_valid,\n                z = z + Anew2 * y(m+1:end);\n                uuu = min( -realmin, z( xndxs, : ) );\n                vvv = z( yndxs, : );\n                www = max( +realmin, z( zndxs, : ) );\n                nmY = sqrt( uuu .^ 2 + vvv .^ 2 + www .^ 2 );\n                wwu = - www ./ uuu;\n                xxu = 1 - vvv ./ uuu - x0;\n                xxw = - log( wwu ) - x0;\n                xxd = ((exp(x0).*wwu).^(1/(1-epow))-1)*(epow-1);\n                tlY = max( 0, xxd - xxu );\n                erY = max( 0, xxw - xxu );\n                acY = erY ~= 0;\n                cxY = xxu + 0.5 * ( xxw - xxu ) .* acY;\n                ttt = uuu == -realmin;\n                if any( ttt ),\n                    cxY( ttt ) = max( 1 - epow, min( xxu( ttt ), epow - 1 ) );\n                    tlY( ttt ) = 0;\n                    erY( ttt ) = 0;\n                end\n            end\n            \n            if x_valid && y_valid,\n                cxX = ( nmX .* cxX + nmY .* cxY ) ./ ( nmX + nmY );\n                kkt = ( xxx .* uuu + yyy .* vvv + zzz .* www ) ./ ( nmX .* nmY ) < 1e-4;\n                kkX = ( nmX > 1e-3 * nmY ) | kkt;\n                kkY = ( nmY > 1e-3 * nmX ) | kkt;\n                erX = erX .* kkX;\n                tlX = tlX .* kkX;\n                acX = acX .* kkX;\n                acY = acY .* kkY;\n                cer = min( epow, max( max( abs( cxX .* acX ) ), max( abs( cxY .* acY ) ) ) );\n            elseif x_valid,\n                cxX = cxX .* acX;\n                tlX = tlX .* acX;\n                cer  = min( epow, max( max( abs( cxX .* acX ) ) ) );\n            elseif y_valid,\n                cxX = cxY .* acY;\n                tlX = tlY .* acY;\n                erX = erY;\n                cer = min( epow, max( max( abs( cxY .* acY ) ) ) );\n            end\n            if x_valid || y_valid,\n                err  = max( erX );\n                tol  = max( tlX );\n                nmov = nnz( erX > max( prec(2), 1.5 * tlX ) );\n                nact = nnz( erX );\n            else\n                err = 0; tol = 0; cer = 0;\n                nmov = 0; nact = 0;\n            end\n            solved = x_valid * 2 + y_valid;\n            found = nmov == 0 && solved;\n                \n            \n            % Check for stagnation\n            stagc = ' '; stage = ' ';\n            if ~found && last_solved == solved && last_act == nact,\n                if cer >= 0.9 * last_cer, stagc = 's'; end\n                if err >= 0.9 * last_err, stage = 's'; end\n            end\n            if ~quiet,\n                fprintf( '%3d/%3d | %9.3e%c %9.3e%c %9.3e | %s\\n', nmov, nact, cer, stagc, err, stage, tol, status );\n            end\n            \n            % Solution found or no more iterations\n            % In perfect arithmetic, erY should be all zeros---because the\n            % approximate dual should be feasible in the original, too. But\n            % in imperfect arithmetic, it may not be. So, we're using that\n            % error as a threshold to decide when the *primal* point is\n            % sufficiently accurate, too.\n            if found,\n                if tprec(1) < best_prec,\n                    best_x = x;\n                    best_y = y;\n                    best_prec = tprec(1);\n                end\n                if best_prec <= prec(1) || attempts == 2,\n                    break;\n                end\n                attempts = attempts + 1;\n            end\n            if status(1) == 'F',\n                failed = failed + 0.5 * ( 1 + ~x_valid );\n                if failed >= 3, break; end\n                if ~x_valid,\n                    prec(3) = prec(3) * 10;\n                    continue;\n                end\n            else\n                prec(3) = oprec(3);\n                failed = 0;\n            end\n            \n            % Stagnation?\n            if stagc == 's' || stage == 's',\n                if all( amult == 1e5 ), break; end\n                amult = min( amult * 10, 1e5 ); \n            elseif ~failed,\n                boost = ~cxX & erX;\n                if any( boost ),\n                    amult(boost) = min( amult(boost) * 10, 1e5 );\n                end\n            end\n            \n            % Shift centerpoint\n            last_solved = x_valid * 2 + y_valid;\n            last_cer = cer;\n            last_err = err;\n            last_act = nact;\n            if last_solved,\n                x0 = max( min( x0 + max( min( epow, cxX ), -epow ), maxw ), -maxw );\n            end\n            \n        end\n        if isnan( best_x(1) ), \n            status = 'Infeasible';\n        elseif isnan( best_y(1) ), \n            status = 'Unbounded';\n        else\n            status = 'Solved';\n        end\n        if best_prec > prec(3),\n            status = 'Failed';\n        elseif best_prec > prec(2),\n            status = [ 'Inaccurate/', status ];\n        end\n        x = best_x(1:n,:);\n        y = best_y(1:m,:);\n        c = c(1:n,:);\n    elseif ndual || dualized,\n        try\n            [ x, status, tprec, iters, y ] = shim.solve( At, b, c, cones, quiet, prec, solv.settings, eargs{:} );\n        catch estruc\n            status = 'Error';\n        end\n    else\n        try\n            [ x, status, tprec, iters ] = shim.solve( At, b, c, cones, quiet, prec, solv.settings, eargs{:} );\n        catch estruc\n            status = 'Error';\n        end\n    end\n    tfin = tic;\n    if isa( cvx___.timers, 'double' ),\n        cvx___.timers(4) = cvx___.timers(4) + ( double(tfin) - double(tstart) );\n    else\n        cvx___.timers(4) = cvx___.timers(4) + ( tfin - tstart );\n    end\n    if cvx___.profile, \n        profile resume; \n    end\n    if ~cvx___.path.hold, \n        cvx_clearspath; \n    end\n    if zero_c,\n        q = x(end); %#ok\n        x(end) = [];\n        switch status,\n        case { 'Solved', 'Inaccurate/Solved' },\n            if q > prec(3),\n                status = strrep( status, 'Solved', 'Infeasible' );\n                oval = sgn * Inf;\n                bval = oval;\n                y = y / abs( b' * y );\n                x(:) = NaN;\n                dval = 0;\n            else\n                oval = 0;\n                bval = 0;\n                pval = 1;\n                dval = 1;\n            end\n        otherwise,\n            if ~isequal( status, 'Error' ), \n                status = Failed; \n            end\n        end\n    else\n        switch status,\n        case { 'Solved', 'Inaccurate/Solved', 'Suboptimal' },\n            oval = sgn * ( c' * x + d' );\n            if ndual || dualized,\n                bval = sgn * ( b' * y + d' );\n            elseif length(tprec) > 1,\n                bval = sgn * tprec(2) + d';\n            else\n                bval = sgn * -Inf;\n            end\n            pval = 1;\n            dval = 1;\n        case { 'Infeasible', 'Inaccurate/Infeasible' },\n            oval = sgn * Inf;\n            bval = oval;\n            dval = 0;\n        case { 'Unbounded', 'Inaccurate/Unbounded' },\n            oval = -sgn * Inf;\n            bval = oval;\n            pval = 0;\n        otherwise,\n            bval = NaN;\n            if ~isnan( x ), pval = 1; end\n            if ~isnan( y ), dval = 1; end\n        end\n    end\n    if ~quiet,\n        disp( spacer );\n    end\n    \nelseif infeas,\n    \n    %\n    % Infeasible\n    %\n    \n    if ~quiet,\n        disp( 'Trivial infeasibilities detected; solution determined analytically.' );\n    end\n    status = 'Infeasible';\n    tprec = 0;\n    b( ~tt ) = 0;\n    y = - b / ( b' * b );\n    oval = sgn * Inf;\n    bval = oval;\n    dval = 0;\n    \nelse\n    \n    %\n    % The origin is optional\n    %\n    \n    if ~quiet,\n        disp( 'Homogeneous problem detected; solution determined analytically.' );\n    end\n    status = 'Solved';\n    tprec = 0;\n    x = zeros( n, 1 );\n    y = zeros( m, 1 );\n    oval = sgn * d;\n    bval = oval;\n    pval = 1;\n    dval = 1;\n    \nend\n\nif dualized,\n    switch status,\n        case 'Infeasible', status = 'Unbounded';\n        case 'Unbounded',  status = 'Infeasible';\n        case 'Inaccurate/Infeasible', status = 'Inaccurate/Unbounded';\n        case 'Inaccurate/Unbounded',  status = 'Inaccurate/Infeasible';\n    end\nend\n\ntrick = false;\nif gobj,\n    switch status,\n        case 'Unbounded', \n            status = 'Solved';\n            trick = true;\n        case 'Inaccurate/Unbounded', \n            status = 'Inaccurate/Solved';\n            trick = true;\n    end\nend\n\nif ~quiet,\n    fprintf( 1, 'Status: %s\\n', status );\nend\n\ncvx___.problems( p ).status = status;\ncvx___.problems( p ).iters = iters;\ncvx___.problems( p ).tol = tprec(1);\n\n%\n% Push the results into the master CVX workspace\n%\n\nx = full( Q * [ pval ; x ] );\ny = full( P * [ dval ; y ] );\nif dualized,\n    if trick, y = P(:,1) + realmax * sign(y); end\n    cvx___.x = y;\n    cvx___.y = x(2:end);\nelse\n    if trick, x = Q(:,1) + realmax * sign(x); end\n    cvx___.x = x;\n    cvx___.y = y(2:end);\nend\nif cvx___.exp_used,\n    esrc = find( cvx___.exponential );\n    edst = cvx___.exponential( esrc );\n    cvx___.x( edst ) = min( 1e300, exp( cvx___.x( esrc ) ) );\nend\n\n%\n% Compute the objective\n%\n\nif ~isempty( obj ),\n    if isinf( oval ) || isnan( oval ),\n        oval = oval * ones(size(obj));\n    else\n        oval = cvx_value( obj );\n    end\n    oval(gobj) = exp(oval(gobj));\n    bval(gobj) = exp(bval(gobj));\nend\noval = full(oval);\nbval = full(bval);\ncvx___.problems( p ).result = oval;\ncvx___.problems( p ).bound = bval;\nif ~quiet,\n    if length( oval ) == 1,\n        fprintf( 'Optimal value (cvx_optval): %+g\\n', oval );\n    else\n        fprintf( 'Optimal value (cvx_optval): (multiobjective)\\n' );\n    end\nend\n\nif isempty( estruc ) && idual_error,\n    warning( 'CVX:IntegerDual', ...\n[ 'Dual variables are not supported for problems involving integer variables.\\n', ...\n  'All dual variables were set to the value NaN.' ] );\nend\n\nif ~quiet,\n    disp( ' '  );\nend\n\nif ~isempty( estruc ),\n    if strncmp( estruc.identifier, 'CVX:', 4 ),\n        error( estruc.identifier, estruc.message );\n    else\n        rethrow( estruc );\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/spy.m",
    "content": "function spy( prob, reduce )\nif nargin < 2 || ~reduce,\n    A = extract( prob );\nelse\n    A = eliminate( prob );\nend\nspy( A' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/subsasgn.m",
    "content": "function x = subsasgn( x, S, y )\nerror( 'Subscripted assignment not allowed for cvx problem objects.' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/subsref.m",
    "content": "function y = subsref( x, S, cheat )\nglobal cvx___\ny = subsref( cvx___.problems( x.index_ ), S );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxprob/touch.m",
    "content": "function x = touch( p, x, iseq )\r\nglobal cvx___\r\nif nargin < 3, iseq = false; end\r\n\r\nif isa( x, 'cvx' ),\r\n    p  = p.index_;\r\n    b  = cvx_basis( x );\r\n    y  = any( b, 2 );\r\n    if iseq,\r\n    \tcvx___.canslack( y ) = false;\r\n    end\r\n    v  = cvx___.problems( p ).t_variable;\r\n    nv = size( v, 1 );\r\n    ny = length( y );\r\n    if ny < nv, \r\n        y( nv, : ) = 0;\r\n    elseif nv < ny, \r\n        y = y( 1 : nv, : );\r\n    end\r\n    cvx___.problems( p ).t_variable = v | y;\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/apply.m",
    "content": "function y = apply( func, x )\ny = do_apply( func, x.value_ );\n\nfunction y = do_apply( func, x )\nswitch class( x ),\n    case 'struct',\n        y = cell2struct( do_apply( func, struct2cell( x ) ), fieldnames( x ), 1 );\n    case 'cell',\n        y = cellfun( func, x, 'UniformOutput', false );\n    otherwise,\n        y = feval( func, x );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvx_collapse.m",
    "content": "function x = cvx_collapse( x, keeptemp, tocell )\nx = cvx_collapse( x.value_, keeptemp, tocell );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvx_constant.m",
    "content": "function y = cvx_constant( x )\ny = apply( @cvx_constant, x );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvx_getdual.m",
    "content": "function x = cvx_getdual( x )\nx = x.dual_;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvx_id.m",
    "content": "function y = cvx_id( x )\ny = apply( @cvx_id, x );\nswitch class( y ),\n    case 'struct',\n        y = struct2cell( y );\n        y = max( [ -Inf, y{:} ] );\n    case 'cell',\n        y = max( [ -Inf, y{:} ] );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvx_isaffine.m",
    "content": "function y = cvx_isaffine( x )\ny = testall( @cvx_isaffine, x );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvx_isconcave.m",
    "content": "function y = cvx_isconcave( x )\ny = testall( @cvx_isconcave, x );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvx_isconstant.m",
    "content": "function y = cvx_isconstant( x )\ny = testall( @cvx_isconstant, x );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvx_isconvex.m",
    "content": "function y = cvx_isconvex( x )\ny = testall( @cvx_isconvex, x );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvx_setdual.m",
    "content": "function x = setdual( x, y )\nx.dual_ = y;\nx.value_ = do_setdual( x.value_, y );\n\nfunction x = do_setdual( x, y )\nswitch class( x ),\n    case 'struct',\n        nx = numel( x );\n        if nx > 1,\n            error( 'Dual variables may not be attached to struct arrays.' );\n        end\n        f = fieldnames(x);\n        y(end+1).type = '{}';\n        for k = 1 : length(f),\n            y(end).subs = {1,k};\n            x.(f{k}) = do_setdual( x.(f{k}), y );\n        end\n    case 'cell',\n        y(end+1).type = '{}';\n        y(end+1).subs = cell(1,ndims(x));\n        for k = 1 : numel(nx),\n            [ y(end).subs{:} ] = { 1, k };\n            x{k} = do_setdual( x{k}, y );\n        end\n    case 'cvx',\n        x = setdual( x, y );\n    case 'double',\n        x = setdual( cvx( x ), y );\nend\n\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvx_value.m",
    "content": "function y = cvx_value( x )\ny = apply( @cvx_value, x );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/cvxtuple.m",
    "content": "function v = cvxtuple( varargin )\n\nif nargin == 1,\n    v = varargin{1};\n    switch class( v ),\n        case 'struct',\n            if numel( v ) ~= 1,\n                error( 'struct arrays not permitted in cvx tuple objects.' );\n            end\n        case 'cell',\n            v = reshape( v, 1, numel( v ) );\n        otherwise,\n            return\n    end\nelse\n    v = varargin;\nend\n\nv = class( struct( 'value_', { v }, 'dual_', { [] } ), 'cvxtuple', cvxobj );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/disp.m",
    "content": "function disp( x, prefix )\nif nargin < 2,\n    prefix = '';\nend\ndisp( [ prefix, 'cvx tuple object: ' ] );\nprefix = [ prefix, '   ' ];\ndo_disp( x.value_, {}, prefix, prefix, '' );\nif ~isempty( x.dual_ ),\n    dn = cvx_subs2str( x.dual_ );\n    disp( [ prefix, 'dual variable: ', dn(2:end) ] );\nend\n\nfunction do_disp( x, f, fprefix, prefix, suffix )\nswitch class( x ),\n    case 'struct',\n        do_disp( struct2cell(x), fieldnames(x), fprefix, prefix, suffix );\n    case 'cell',\n        fprefix = [ fprefix, '{ ' ];\n        prefix  = [ prefix, '  ' ];\n        nsuffix = '';\n        kend = numel( x );\n        for k = 1 : kend,\n            if k == kend, nsuffix = [ ' }', suffix ]; end\n            if ~isempty( f ),\n                fprefix = sprintf( '%s%s: ', fprefix, f{k} );\n            end\n            do_disp( x{k}, {}, fprefix, prefix, nsuffix );\n            fprefix = prefix;\n        end\n    case 'cvx',\n        dual = cvx_getdual( x );\n        if ~isempty( dual ),\n            suffix = sprintf( ' (dual: %s)%s', dual, suffix );\n        end\n        disp( [ fprefix, cvx_class( x, true, true ), ' ', type( x ), suffix ] );\n    case 'double',\n        fprintf( 1, '%s%g%s\\n', fprefix, x, suffix );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/eq.m",
    "content": "function a = eq( x, y )\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '==' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/ge.m",
    "content": "function a = ge( x, y )\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '>=' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/gt.m",
    "content": "function a = gt( x, y )\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '>' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/in.m",
    "content": "function a = in( x, y )\n\nnarginchk(2,2);\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '==' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/le.m",
    "content": "function a = le( x, y )\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '<=' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/lt.m",
    "content": "function a = lt( x, y )\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '<' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/ne.m",
    "content": "function a = ne( x, y )\n\nb = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '~=' );\nif nargout, a = b; end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/numel.m",
    "content": "function n = numel( x, varargin )\nn = numel( x.value_, varargin{:} );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/subsasgn.m",
    "content": "function y = subsasgn( x, varargin ) %#ok\nerror( 'cvx tuple objects are read-only.' );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/subsref.m",
    "content": "function y = subsref( x, varargin )\ny = cvxtuple( subsref( x.value_, varargin{:} ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/@cvxtuple/testall.m",
    "content": "function y = testall( func, x )\ny = do_test( func, x.value_ );\n\nfunction y = do_test( func, x )\nswitch class( x ),\n    case 'struct',\n        y = do_test( func, struct2cell( x ) );\n    case 'cell',\n        y = all( cellfun( func, x ) );\n    otherwise,\n        y = feval( func, x );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/Contents.m",
    "content": "% CVX: Internal functions and scripts.\n%    This directory contains code that is meant for internal use by\n%    the CVX system itself. Documentation of the functions in this\n%    directory is more sparse and not intended for end users.\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_accept_concave.m",
    "content": "function x = cvx_accept_concave( x )\r\nglobal cvx___\r\nif isa( x, 'cvx' ),\r\n    t = cvx_vexity( x ) < 0;\r\n    if any( t( : ) ),\r\n        prob = cvx___.problems(end).self;\r\n        if all( t ),\r\n            src = x;\r\n            dst = newtemp( prob, size( src ) );\r\n            x = dst;\r\n        else\r\n            src = x( t );\r\n            dst = newtemp( prob, size( src ) );\r\n            x( t ) = dst;\r\n        end\r\n        newcnstr( prob, src(:), dst(:), '>=' );\r\n    end\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_accept_convex.m",
    "content": "function x = cvx_accept_convex( x )\r\nglobal cvx___\r\nif isa( x, 'cvx' ),\r\n    t = cvx_vexity( x ) > 0;\r\n    if any( t( : ) ),\r\n        prob = cvx___.problems(end).self;\r\n        if all( t ),\r\n            src = x;\r\n            dst = newtemp( prob, size( src ) );\r\n            x = dst;\r\n        else\r\n            src = x( t );\r\n            dst = newtemp( prob, size( src ) );\r\n            x( t ) = dst;\r\n        end\r\n        newcnstr( prob, src(:), dst(:), '<=' );\r\n    end\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_basis.m",
    "content": "function y = cvx_basis( x )\n\nif isempty( x )\n    y = sparse( 1, 0 );\nelse\n    y = sparse( reshape( x, 1, numel(  x  ) ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_bcompress.m",
    "content": "function [ xR, x ] = cvx_bcompress( x, mode, num_sorted )\nnarginchk(1,3);\nif nargin < 3 || isempty( num_sorted ),\n    num_sorted = 0;\nend\nif nargin < 2 || isempty( mode ),\n    mode = 0;\nelse\n    switch mode,\n        case 'full',      mode = 0;\n        case 'magnitude', mode = 1;\n        case 'none',      mode = 2;\n        otherwise,        error( [ 'Invalid normalization mode: ', mode ] );\n    end\nend\n\n%\n% Separate the real and imaginary parts. But while we're at it, we need to\n% make sure we we're at it, \n%\n\n[ m, n ] = size( x ); %#ok\niscplx = ~isreal( x );\nif iscplx,\n    x = cvx_c2r( x, 2, 8 * eps );\n    n = n * 2;\nend\n\n[ ndxs, scls ] = cvx_bcompress_mex( sparse( x ), mode, num_sorted );\nxR = sparse( ndxs, 1 : n, scls, n, n );\nt2 = any( xR, 2 );\nxR = xR( t2, : );\n\nif nargout > 1 && ~all( t2 ),\n    x = x( :, t2 );\nend\n\nif iscplx,\n    xR = cvx_r2c( xR, 2 );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_blkdiag.m",
    "content": "function y = cvx_blkdiag( varargin )\n\n% A reimplemenetation of MATLAB's blkdiag function, which is broken in\n% certain versions of MATLAB.\n\nif nargin == 1,\n    y = varargin{1};\nelse\n    isYsparse = false;\n    for k = 1 : nargin,\n        x = varargin{k};\n        [ p2(k+1), m2(k+1) ] = size(x); %#ok\n        if issparse(x), isYsparse = true; end\n    end\n    p1 = cumsum(p2);\n    m1 = cumsum(m2);\n    if isYsparse\n        y = sparse( varargin{1} );\n        for k = 2 : nargin,\n            y = [y sparse(p1(k),m2(k+1)); sparse(p2(k+1),m1(k)) varargin{k}]; %#ok\n        end\n    else\n        y = zeros(p1(end),m1(end));\n        for k=1:nargin\n            y(p1(k)+1:p1(k+1),m1(k)+1:m1(k+1)) = varargin{k};\n        end\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_c2r.m",
    "content": "function x = cvx_c2r( x, dim, cleanup_eps )\n\n%\n% Determine expansion dimension\n%\n\nsx = size( x );\nif nargin < 2,\n    dim = [ find( sx > 1 ), 1 ];\n    dim = dim( 1 );\nelseif ~isnumeric( dim ) || dim <= 0 || dim ~= floor( dim ),\n    error( 'Second argument must be a dimension.' );\nend\nsx = [ sx, ones( 1, dim - length( sx ) ) ];\nnd = length( sx );\n\n%\n% Perform the sparse case differently\n%\n\nif isnumeric( x ) && issparse( x ) && dim <= 2,\n    [ rr, cc, vv ] = find( x );\n    vr = real( vv );\n    vi = imag( vv );\n    if nargin > 2,\n        ndxs = find( vr & vi );\n        if ~isempty( ndxs ),\n            temp = abs( vr(ndxs) ./ vi(ndxs) );\n            vr(ndxs(temp<=cleanup_eps)) = 0;\n            vi(ndxs(temp>=1.0./cleanup_eps)) = 0;\n        end\n    end\n    if dim == 1,\n        rr = 2 * rr; rr = [ rr - 1 ; rr ];\n        cc = [ cc ; cc ];\n        sx( 1 ) = 2 * sx( 1 );\n    else\n        cc = 2 * cc; cc = [ cc - 1 ; cc ];\n        rr = [ rr ; rr ];\n        sx( 2 ) = 2 * sx( 2 );\n    end\n    x = sparse( rr, cc, [ vr ; vi ], sx( 1 ), sx( 2 ) );\n    return\nend\n\n%\n% Permute if necessary\n%\n\nperm = [];\nif any( sx( 1 : dim - 1 ) ~= 1 ),\n    perm = [ dim, 1 : dim - 1, dim + 1 : nd ];\n    x = permute( x, perm );\n    sx = sx( perm );\n    dim = 1;\nend\n\n%\n% Perform expansion and possibly cleanup\n%\n\nx = x( : ).';\nsx( dim ) = 2 * sx( dim );\nxr = real( x );\nxi = imag( x );\nif nargin > 2,\n    ndxs = find( xr & xi );\n    if ~isempty( ndxs ),\n        temp = abs( xr(ndxs) ./ xi(ndxs) );\n        xr(ndxs(temp<=cleanup_eps)) = 0;\n        xi(ndxs(temp>=1.0./cleanup_eps)) = 0;\n    end\nend\nx = reshape( [ xr ; xi ], sx );\n\n%\n% Reverse permute if necessary\n%\n\nif ~isempty( perm ),\n    x = ipermute( x, perm );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_check_dimension.m",
    "content": "function y = cvx_check_dimension( x, zero_ok )\n\n%CVX_CHECK_DIMENSION   Verifies that the input is valid dimension.\n%   CVX_CHECK_DIMENSION( DIM ) verifies that the quantity DIM is valid for use\n%   in commands that call for a dimension; e.g., SUM( X, DIM ). In other words,\n%   it verifies that DIM is a positive integer scalar.\n%\n%   CVX_CHECK_DIMENSION( DIM, ZERO_OK ) allows DIM to be zero if ZERO_OK is\n%   true. If ZERO_OK is false, the default behavior is used.\n\nif isnumeric( x ) && length( x ) == 1 && isreal( x ) && x < Inf && x == floor( x ),\n    if nargin < 2, zero_ok = false; end\n    y = x > 0 | zero_ok;\nelse\n    y = 0;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_check_dimlist.m",
    "content": "function [ y, x ] = cvx_check_dimlist( x, emptyok )\n\n% CVX_CHECK_DIMLIST Verifies the input is a valid dimension list.\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\nif nargin < 2 || emptyok,\n    xmin = 0;\nelse\n    xmin = 1;\nend\nif isa( x, 'cell' ),\n    nel = numel( x );\n    xnew = zeros( 1, nel );\n    fnan = false;\n    y = false;\n    for k = 1 : nel,\n        if isempty( x{k} ),\n            if fnan, return; end\n            xnew( k ) = NaN;\n            fnan = true;\n        elseif isnumeric( x{k} ) && length( x{k} ) == 1,\n            xnew( k ) = x{k};\n        else\n            return;\n        end\n    end\n    x = xnew;\nend\ny = isnumeric( x ) && length( x ) == numel( x ) && isreal( x ) && nnz( isnan( x ) ) <= 1 && ~any( x < xmin ) && nnz( x ~= floor( x ) ) == nnz( isnan( x ) );\nif y && nargout > 1,\n    x = [ x( : )', 1, 1 ];\n    x = x( 1 : max( [ 2, find( x ~= 1 ) ] ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_class.m",
    "content": "function v = cvx_class( x, needsign, needreal, needzero )\r\nif nargin < 2, needsign = false; end\r\nif nargin < 3, needreal = false; end\r\nif nargin < 4, needzero = needsign; end\r\n\r\n% Classifications:\r\n% 1  - negative constant\r\n% 2  - zero\r\n% 3  - positive constant\r\n% 4  - complex constant\r\n% 5  - concave\r\n% 6  - real affine\r\n% 7  - convex\r\n% 8  - complex affine\r\n% 9  - log concave\r\n% 10 - log affine\r\n% 11 - log convex monomial\r\n% 12 - log convex posynomial\r\n% 13 - invalid\r\n% ---\r\n% 14 - constant\r\n% 15 - affine\r\n% 16 - real constant\r\n\r\nif isempty( x ),\r\n    v = 'empty';\r\n    return\r\nend\r\npersistent remap_s remap_r remap_z strs\r\nif isempty( strs ),\r\n    remap_s = [16,2,16,4,5,6,7,8,9,10,11,12,13,14,15,16];\r\n    remap_r = [1,2,3,14,5,15,7,15,9,10,11,12,13,14,15,14];\r\n    remap_z = [1,14,3,4,5,6,7,8,9,10,11,12,13,14,15,16];\r\n    strs = { 'negative constant', 'zero', 'positive constant', 'complex constant', ...\r\n             'concave', 'real affine', 'convex', 'complex affine', ...\r\n             'log-concave', 'log-affine', 'log-convex', 'log-convex', ...\r\n             'invalid', 'constant', 'affine', 'real constant' };\r\nend\r\nx = cvx_classify( x );\r\nif ~needsign,\r\n    x = remap_s( x );\r\nend\r\nif ~needreal,\r\n    x = remap_r( x );\r\nend\r\nif ~needzero,\r\n    x = remap_z( x );\r\nend\r\nv = sparse( x, 1, 1, 16, 1 ) ~= 0;\r\nif nnz( v ) ~= v( 2 ),\r\n    v( 2 ) = false;\r\nend\r\nv = strs( v );\r\nif length( v ) == 1,\r\n    v = v{1};\r\nelse\r\n    v = sprintf( '%s/', v{:} );\r\n    v = [ 'mixed ', v(1:end-1) ];\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_classify.m",
    "content": "function v = cvx_classify( x )\r\n\r\n% Classifications:\r\n% 1  - negative constant\r\n% 2  - zero\r\n% 3  - positive constant\r\n% 4  - complex constant\r\n% 5  - concave\r\n% 6  - real affine\r\n% 7  - convex\r\n% 8  - complex affine\r\n% 9  - log concave\r\n% 10 - log affine\r\n% 11 - log convex monomial\r\n% 12 - log convex posynomial\r\n% 13 - invalid\r\n\r\nv = full( sign( real( x ) ) ) + 2;\r\nif ~isreal( x ),\r\n\tv( imag( x ) ~= 0 ) = 4;\r\nend\r\nv( ~isfinite( x ) ) = 13;\r\nv = reshape( v, 1, numel( x ) );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_clearpath.m",
    "content": "function cvx_clearpath( arg ) %#ok\n\n%CVX_CLEARPATH   Clears the cvx path.\n%   CVX_CLEARPATH removes the internal cvx directories from Matlab's path. CVX\n%   does this automatically when a model is completed (i.e., after CVX_END), in\n%   order to reduce potential naming conflicts with other packages. There is no\n%   need to call this function during the normal use of CVX.\n\nglobal cvx___\ncvx_global\nif nargin == 0,\n    cvx___.path.hold = false;\nend\nif cvx___.path.hold,\n    cvx_setspath;\nelse\n    cvx_clearspath;\n    if ~isempty( cvx___.path.string ),\n        path(strrep(path,cvx___.path.string,''));\n    end\n    cvx___.path.active = false;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_clearspath.m",
    "content": "function cvx_clearspath\n\n%CVX_CLEARSPATH   Clears the cvx solver path.\n%   CVX_CLEARSPATH removes the internal solver directories to the Matlab\n%   path. CVX automatically clears the solver path after completion of a\n%   model computation, so calling this function should not be necessary.\n%   Nevertheless, we provide it for completeness and debugging.\n\nglobal cvx___\nosolv = cvx___.solvers.active;\nif osolv,\n    tstr = cvx___.solvers.list(osolv).path;\n    if ~isempty( tstr ),\n        path(strrep(path,tstr,''));\n    end\n    cvx___.solvers.active = 0;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_collapse.m",
    "content": "function x = cvx_collapse( x, keeptemp, tocell )\nif nargin < 2, keeptemp = false; end\nif nargin < 3, tocell = false; end\n\nwhile true,\n    sx = size( x );\n    nx = prod( sx );\n    switch class( x ),\n        case 'cell',\n            if nx == 1,\n                x = x{1};\n                continue;\n            end\n            x = reshape( x, 1, nx );\n        case 'struct',\n            fx = fieldnames( x );\n            if ~keeptemp,\n                ndxs = horzcat( fx{:} );\n                ndxs = ndxs( cumsum( cellfun( 'length', fx ) ) ) ~= '_';\n                fx   = fx( ndxs );\n            end\n            nfx = length( fx );\n            if nfx == 1 && nx == 1,\n                x = subsref( x, struct( 'type', '.', 'subs', fx{1} ) );\n                continue;\n            end\n            if tocell,\n                if nfx == 1,\n                    sx = [ 1, sx ]; %#ok\n                else\n                    sx = [ 1, nfx, sx ]; %#ok\n                end\n                x = struct2cell( x );\n                if ~keeptemp,\n                    x = x( ndxs, : );\n                end\n                x = reshape( x, sx );\n            end\n    end\n    break;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_constant.m",
    "content": "function y = cvx_constant( x )\nnarginchk(1,1);\ny = x;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_default_dimension.m",
    "content": "function y = cvx_default_dimension( sx )\n\n%CVX_DEFAULT_DIMENSION   Default dimension for SUM, MAX, etc. \n%   DIM = CVX_DEFAULT_DIMENSION( SX ), where SX is a size vector, returns the\n%   first index DIM such that SX(DIM)>1, if one exists; otherwise, DIM=1. This\n%   matches the behavior by functions like SUM, MAX, ANY, ALL, etc. in\n%   selecting the dimension over which to operate if DIM is not supplied.\n%\n%   For example, suppose size(X) = [1,3,4]; then SUM(X) would sum over dimension\n%   2; and DIM=CVX_DEFAULT_DIMENSION([1,3,4]) returns DIM=2.\n%\n%   This is an internal CVX function, and as such no checking is performed to\n%   insure that the arguments are valid.\n\ny = find( sx ~= 1 );\nif isempty( y ), \n    y = 1; \nelse\n    y = y( 1 ); \nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_expand_dim.m",
    "content": "function zx = cvx_expand_dim( z, dim, nx )\r\n\r\n%CVX_EXPAND_DIM   Expands an N-D array along a specified dimension.\r\n%   CVX_EXPAND_DIM( X, DIM, NX ) stacks NX copies of the matrix X along the\r\n%   dimension NX. It is equivalent to CAT( DIM, X, X, ..., X ), where X is\r\n%   repeated NX times.\r\n%\r\n%   This is an internal CVX function, and as such no checking is performed to\r\n%   insure that the arguments are valid.\r\n\r\nzdims = cell( 1, max( ndims(z), dim ) );\r\n[ zdims{:} ] = deal( ':' );\r\nzdims{dim} = ones( 1, nx );\r\nzx = z( zdims{:} );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_expert_check.m",
    "content": "function cvx_expert_check( fname, varargin )\n\nglobal cvx___\nif cvx___.expert, return; end\nif ~isempty( varargin ) && ~any(cellfun('isclass',varargin,'cvx')), return; end\n\nurl = [ 'file:///', cvx___.where, cvx___.fs, 'doc', cvx___.fs, 'advanced.html#the-successive-approximation-method' ];\nfprintf( 1, [ 'CVX Warning:\\n', ...\n'   Models involving \"%s\" or other functions in the log, exp, and entropy\\n', ...\n'   family are solved using an experimental successive approximation method.\\n', ...\n'   This method is slower and less reliable than the method CVX employs for\\n', ...\n'   other models. Please see the section of the user''s guide entitled\\n', ...\n'       <a href=\"%s\">The successive approximation method</a>\\n', ...\n'   for more details about the approach, and for instructions on how to\\n', ...\n'   suppress this warning message in the future.\\n' ], fname, url );\n\ncvx___.expert = true;\n    \n% Note that we do *not* call cvx_save_prefs here. We only save the\n% preferences if an explicit setting of \"cvx_expert true\" is made.\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_getdual.m",
    "content": "function y = cvx_getdual( x )\ny = [];\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_global.m",
    "content": "function cvx_global\r\n\r\n%CVX_GLOBAL   Create CVX's global internal data structure, if needed.\r\n%   CVX_GLOBAL creates a hidden structure CVX needs to do its work. It is\r\n%   harmless for the user to call it, but it is also useless to do so.\r\n\r\nglobal cvx___ \r\nif isfield( cvx___, 'problems' ),\r\n    return\r\nend\r\ntstart = tic;\r\n    \r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n% Initialize the global data structure %\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\ncvx_version(1);\r\n\r\ncommands = { 'cvx_begin', 'cvx_clear', 'cvx_end', 'cvx_expert', ...\r\n    'cvx_pause', 'cvx_power_warning', 'cvx_precision', 'cvx_profile', ...\r\n    'cvx_quiet', 'cvx_save_prefs' };\r\nc_type = cell(1,length(commands));\r\n[ c_type{:} ] = deal('C');\r\nkeywords = { 'in', 'dual', 'epigraph', 'expression', 'expressions', ...\r\n    'hypograph', 'maximize', 'maximise', 'minimize', 'minimise', ...\r\n    'subject', 'variable', 'variables' };\r\nk_type = cell(1,length(keywords)); \r\n[ k_type{:} ] = deal('K');\r\nstructures = { 'banded', 'binary', 'complex', 'diagonal', 'hankel', ...\r\n    'hermitian', 'integer', 'lower_bidiagonal', 'lower_hessenberg', ...\r\n    'lower_triangular', 'nonnegative', 'scaled_identity', ...\r\n    'skew_symmetric', 'semidefinite', 'sparse', 'symmetric', ...\r\n    'toeplitz', 'tridiagonal', 'upper_bidiagonal', 'upper_hankel', ...\r\n    'upper_hessenberg', 'upper_triangular' };\r\ns_type = cell(1,length(structures)); \r\n[ s_type{:} ] = deal('S');\r\nreserved = cell2struct([c_type,k_type,s_type],[commands,keywords,structures],2);\r\n\r\ncvx___.reswords    = reserved;\r\ncvx___.problems    = [];\r\ncvx___.id          = 0;\r\ncvx___.pause       = false;\r\ncvx___.quiet       = false;\r\ncvx___.profile     = false;\r\ncvx___.reserved    = 1;\r\ncvx___.logarithm   = sparse( 1, 1 );\r\ncvx___.exponential = sparse( 1, 1 );\r\ncvx___.vexity      = 0; % sparse( 1, 1 );\r\ncvx___.exp_used    = false;\r\ncvx___.nan_used    = false;\r\ncvx___.canslack    = false;\r\ncvx___.readonly    = 0;\r\ncvx___.needslack   = false(0,1);\r\ncvx___.cones       = struct( 'type', {}, 'indices', {} );\r\ncvx___.x           = zeros( 0, 1 );\r\ncvx___.y           = zeros( 0, 1 );\r\ntemp = cvx( [0,1], [] );\r\ncvx___.equalities  = temp;\r\ncvx___.linforms    = temp;\r\ncvx___.linrepls    = temp;\r\ncvx___.uniforms    = temp;\r\ncvx___.unirepls    = temp;\r\ntry\r\n    cvx___.timers = zeros(1,4,'uint64');\r\n    cvx___.timers(1) = cvx___.timers(1) + tstart;\r\ncatch\r\n    cvx___.timers = [double(tstart),0,0,0];\r\nend\r\ncvx___.increment   = [];\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n% Run each shim to connect/reconnect the solvers %\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\ncur_d = pwd;\r\nosolvers = cvx___.solvers.list;\r\nsolvers = struct( 'name', {}, 'version', {}, 'location', {}, 'fullpath', {}, 'error', {}, 'warning', {}, 'dualize', {}, 'path', {}, 'check', {}, 'solve', {}, 'settings', {}, 'sname', {}, 'spath', {}, 'params', {}, 'eargs', {} );\r\nnsolv = length(osolvers);\r\nnrej = 0;\r\nfor k = 1 : length(osolvers),\r\n    tsolv = osolvers(k);\r\n    try\r\n        cd(tsolv.spath);\r\n        tsolv.warning = '';\r\n        tsolv = feval(tsolv.sname,tsolv);\r\n    catch errmsg\r\n        errmsg = cvx_error( errmsg, 63, false, '    ' );\r\n        if isempty( tsolv.name ),\r\n            tsolv.name = [ tsolv.spath, tsolv.sname ];\r\n        end\r\n        tsolv.error = sprintf( 'unexpected error:\\n%s', errmsg );\r\n    end\r\n    if ~isempty(tsolv.error),\r\n        nrej = nrej + 1;\r\n    end\r\n    try\r\n        solvers(k) = tsolv;\r\n    catch\r\n        for ff = fieldnames(tsolv)',\r\n            solvers(k).(ff{1}) = tsolv.(ff{1});\r\n        end\r\n    end\r\nend\r\nclear osolvers\r\ncvx___.solvers.list = solvers;\r\ncd( cur_d );\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n% If any solvers have errors, force the user to re-run cvx_setup. %\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\nif ~nrej, return; end\r\nreject = {};\r\nreject_lic = {};\r\nreject_java = {};\r\nndefault = 0;\r\nfor k = 1 : nsolv,\r\n    if isempty( solvers(k).error ),\r\n        if ~ndefault, ndefault = k; end\r\n    elseif isequal( solvers(k).error, 'Java support is required.' );\r\n        reject_java{end+1} = solvers.name; %#ok\r\n    elseif isequal( solvers(k).error, 'A CVX Professional license is required.' ),\r\n        reject_lic{end+1} = solvers(k).name; %#ok\r\n    else\r\n        errmsg = [ solvers(k).name, ': ', solvers(k).error ];\r\n        reject{end+1} = cvx_error( errmsg, 67, false, '    ' ); %#ok\r\n    end\r\nend\r\nif ~isempty( reject_java ),\r\n    reject_java = sprintf( '%s ', reject_java{:} );\r\n    warning( 'CVX:SolverErrors', 'The following solvers were disabled due to the disabling of Java: %s', reject_java );\r\nend\r\nif ~isempty( reject_lic ),\r\n    reject_lic = sprintf( '%s ', reject_lic{:} );\r\n    warning( 'CVX:SolverErrors', 'The following solvers are are disabled due to licensing issues: %s', reject_lic );\r\nend\r\nif ~isempty( reject ),\r\n    reject = sprintf( '%s', reject{:} );\r\n    warning( 'CVX:SolverErrors', 'The following errors were issued when initializing the solvers:\\n%sPlease check your installation and re-run CVX_SETUP.\\nThese solvers are unavailable for this session.%s', reject );\r\nend\r\nif nrej == length( solvers ),\r\n    clear global cvx___\r\n    error( 'CVX:SolverErrors', 'All solvers were disabled due to various errors.\\nPlease re-run CVX_SETUP and, if necessary, contact CVX Research for support.' );\r\nelseif ~isempty(solvers(cvx___.solvers.map.default).error),\r\n    cvx___.solvers.map.default = ndefault;\r\n    cvx___.solvers.selected = ndefault;\r\n    warning( 'CVX:SolverErrors', 'The default solver has temporarily been changed to %s.', solvers(ndefault).name );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_id.m",
    "content": "function y = cvx_id( x ) %#ok\r\ny = -Inf;\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_ids.m",
    "content": "function y = cvx_ids( varargin )\r\ny = cellfun( @cvx_id, varargin );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_isaffine.m",
    "content": "function y = cvx_isaffine( x, full ) %#ok\nnarginchk(1,2);\nif nargin == 1,\n    y = true;\nelse\n    y = true( size( x ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_isconcave.m",
    "content": "function y = cvx_isconcave( x, full ) %#ok\nnarginchk(1,2);\nif nargin == 2,\n    y = ~imag( x );\nelseif isreal( x ),\n    y = true;\nelse\n    y = nnz(imag(x)) == 0;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_isconstant.m",
    "content": "function y = cvx_isconstant( x, full ) %#ok\nnarginchk(1,2);\nif nargin == 1,\n    y = true;\nelse\n    y = true( size( x ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_isconvex.m",
    "content": "function y = cvx_isconvex( x, full ) %#ok\nnarginchk(1,2);\nif nargin == 2,\n    y = ~imag( x );\nelseif isreal( x ),\n    y = true;\nelse\n    y = nnz(imag(x)) == 0;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_isnonzero.m",
    "content": "function y = cvx_isnonzero( x, full ) %#ok\r\nnarginchk(1,2);\r\nif nargin == 1,\r\n\ty = nnz( x ) ~= 0;\r\nelse\r\n    y = x ~= 0;\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_r2c.m",
    "content": "function x = cvx_r2c( x, dim )\n\n%\n% Quick exit for complex quantities\n%\n\nif ~isreal( x ),\n    error( 'Matrix must be real.' );\nend\n\n%\n% Determine expansion dimension\n%\n\nsx = size( x );\nif nargin < 2,\n    dim = [ find( sx > 1 ), 1 ];\n    dim = dim( 1 );\nelseif ~isnumeric( dim ) || dim <= 0 || dim ~= floor( dim ),\n    error( 'Second argument must be a dimension.' );\nend\nnd = length( sx );\nif nd < dim || rem( sx( dim ), 2 ) ~= 0,\n    error( 'The size of the array along the key dimension must be even.' );\nend\n\n%\n% Extract the real and imaginary halves\n%\n\n[ ndxs{ 1 : nd } ] = deal( ':' );\nndxs{ dim } = 1 : 2 : sx( dim );\nxr = cvx_subsref( x, ndxs{:} );\nndxs{ dim } = 2 : 2 : sx( dim );\nxi = cvx_subsref( x, ndxs{:} );\n\n%\n% Combine\n%\n\nx = xr + 1i * xi;\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_readlevel.m",
    "content": "function y = cvx_readlevel( x )\nif ndims( x ) <= 2,\n    y = sparse( size( x, 1 ), size( x, 2 ) );\nelse\n    y = zeros( size( x ) );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_reduce_size.m",
    "content": "function [ x, sx, sy, zx, zy, nx, nv, perm ] = cvx_reduce_size( x, dim, do_reduce )\n\n%\n% Reduction dimension\n%\n\nzx = size( x );\nif isempty( dim ),\n    dim = find( zx ~= 1, 1, 'first' );\n    if isempty( dim ), dim = 1; end\nelseif ~isnumeric( dim ) || numel( dim ) ~= 1 || ~isreal( dim ) || dim <= 0 || isinf(dim) || isnan(dim) || dim ~= floor(dim),\n    error( 'Dimension argument must be a positive integer.' );\nend\n\n%\n% Vector size, reduction size, number of vectors\n%\n\nnd = max( dim, length( zx ) );\nzx( end + 1 : nd ) = 1;\nnx = zx( dim );\nzy = zx;\nif nargin < 3 || do_reduce, zy( dim ) = 1; end\nnl = prod( zy( 1 : dim -1  ) );\nnr = prod( zy( dim + 1 : end ) );\nnv = nl * nr;\n\n%\n% Permute if needed\n%\n\nif nl * nx > 1,\n    perm = [ dim, 1 : dim - 1, dim + 1 : nd ];\n    x    = permute( x,  perm );\n    sx   = zx( perm );\n    sy   = zy( perm );\nelse\n    perm = [];\n    sx   = zx;\n    sy   = zy;\nend\n\n%\n% Reshape\n%\n\nx = reshape( x, nx, nv );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_remap.m",
    "content": "function r = cvx_remap( varargin )\r\n\r\n%CVX_REMAP   CVX expression type map generator.\r\n%   This is an internal function used to help filter CVX expressions by type.\r\n\r\n% Classifications:\r\n% 1  - negative constant\r\n% 2  - zero\r\n% 3  - positive constant\r\n% 4  - complex constant\r\n% 5  - concave\r\n% 6  - real affine\r\n% 7  - convex\r\n% 8  - complex affine\r\n% 9  - log concave\r\n% 10 - log affine\r\n% 11 - log convex monomial\r\n% 12 - log convex posynomial\r\n% 13 - invalid\r\n\r\npersistent remap_big remap_str\r\nif isempty( remap_str ),\r\n    remap_str = { ...\r\n        'negative', 'zero', 'positive', 'complex', 'nonnegative', 'nonzero', 'nonpositive', 'real', 'constant', ...\r\n        'non-constant', 'concave', 'affine', 'convex', 'real-affine', 'complex-affine', 'non-affine', ...\r\n        'log-concave', 'log-affine', 'log-convex', 'log-valid', 'monomial', 'posynomial', ...\r\n        'valid', 'invalid' ...\r\n    };\r\n    remap_big = [ ...\r\n        1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; ... % negative\r\n        0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; ... % zero\r\n        0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; ... % positive\r\n        0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0; ... % complex\r\n        0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; ... % nonnegative\r\n        1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; ... % nonzero (real)\r\n        1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; ... % nonpositive\r\n        1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; ... % real\r\n        1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0; ... % constant\r\n        0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0; ... % non-constant\r\n        1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0; ... % concave\r\n        1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0; ... % affine\r\n        1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0; ... % convex\r\n        1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0; ... % real-affine\r\n        0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0; ... % complex-affine\r\n        0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0; ... % non-affine\r\n        0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0; ... % log-concave\r\n        0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0; ... % log-affine\r\n        0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0; ... % log-convex\r\n        0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0; ... % log-valid\r\n        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0; ... % monomial\r\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0; ... % posynomial\r\n        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0; ... % valid\r\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1; ... % invalid\r\n     ];\r\n     remap_str = remap_str(:);\r\n     [ remap_str, ndx ] = sort( remap_str );\r\n     remap_big = remap_big( ndx, : );\r\nend\r\n\r\n[ c, ndx ] = sort( [ remap_str ; varargin(:) ] );\r\nd = strcmp(c(1:end-1),c(2:end));\r\nr = +any( remap_big( ndx(d), : ), 1 );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_reshape.m",
    "content": "function x = cvx_reshape( x, s, rmap, cperm, cperm2 )\r\nsx = size( x );\r\nif nargin < 5,\r\n    cperm2 = [];\r\n    if nargin < 4,\r\n        cperm = [];\r\n        if nargin < 3,\r\n            rmap = [];\r\n            if nargin < 2,\r\n                s = sx;\r\n            end\r\n        end\r\n    end\r\nend\r\nusp = cvx_use_sparse( s, nnz( x ), isreal( x ) );\r\nisp = issparse( x );\r\nif ~usp && isp, \r\n    x = full( x ); \r\nend\r\nif ~isequal( s, sx ) || ~isempty( rmap ) || ~isempty( cperm ) || ~isempty( cperm2 ),\r\n    if usp && ( numel( x ) > 2147483647 || ~isempty( rmap ) || ~isempty( cperm ) ),\r\n        [ ii, jj, x ] = find( x );\r\n        if ~isempty( rmap ),\r\n            sx( 1 ) = length( rmap );\r\n            rmap = find( rmap );\r\n            ii = rmap( ii );\r\n        end\r\n        if ~isempty( cperm ),\r\n            temp = 1 : sx( 2 );\r\n            temp( cperm ) = temp;\r\n            jj = temp( :, jj )';\r\n        end\r\n        ij = ii + ( jj - 1 ) * sx( 1 ) - 1;\r\n        ii = rem( ij, s( 1 ) ) + 1;\r\n        jj = floor( ij / s( 1 ) ) + 1;\r\n        if ~isempty( cperm2 ),\r\n            temp = 1 : s( 2 );\r\n            temp( cperm2 ) = temp;\r\n            jj = temp( :, jj )';\r\n        end\r\n        x = sparse( ii, jj, x, s( 1 ), s( 2 ) );\r\n        clear ii jj ij\r\n        isp = true;\r\n    else\r\n        if ~isempty( cperm ),\r\n            x = x( :, cperm );\r\n        end\r\n        if ~isempty( rmap ),\r\n            x = x( max( 1, cumsum( rmap ) ), : );\r\n            x( ~rmap, : ) = 0;\r\n        end\r\n        x = reshape( x, s );\r\n        if ~isempty( cperm2 ),\r\n            x = x( :, cperm2 );\r\n        end\r\n    end\r\nend\r\nif usp && ~isp,\r\n    x = sparse( x ); \r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_run_solver.m",
    "content": "function varargout = cvx_run_solver( sfunc, varargin )\nglobal cvx___\nsettings_arg = varargin{end};\nsettings     = varargin{end-1};\ninputs       = varargin(1:end-nargout-2);\ndumpfile = '';\ncustom_on = false;\nif isstruct( settings ),\n    for f = fieldnames( settings )',\n        sval = settings.(f{1});\n        if isequal( f{1}, 'dumpfile' ),\n            dumpfile = sval;\n        else\n            custom_on = true;\n            inputs{settings_arg}.(f{1}) = sval;\n        end\n    end\nend\nif custom_on,\n    fprintf( 'NOTE: custom settings have been set for this solver.\\n' );\nend\nif ~isempty( dumpfile ),\n    if ~ischar( dumpfile ) || size( dumpfile, 1 ) > 1,\n        error( 'CVX:Dumpfile', 'Invalid filename for the dumpfile.' );\n    elseif length(dumpfile) < 4 || ~strcmpi(dumpfile(end-3:end),'.mat'),\n        dumpfile = [ dumpfile, '.mat' ];\n    end\n    fprintf( 'Saving output to: %s\\n', dumpfile );\n    fprintf( '------------------------------------------------------------\\n');\n    inp_names = cell(1,length(inputs));\n    for k = 1 : length(inp_names),\n        inp_names{1,k} = inputname(k+1);\n    end\n    dstruct = cell2struct( inputs, inp_names, 2 ); %#ok\n    save( dumpfile, '-struct', 'dstruct' );\n    diaryfile = [ dumpfile, '.txt' ];\n    fid = fopen( diaryfile, 'w+' );\n    if fid ~= 0,\n        fclose( fid );\n        diary( diaryfile );\n    end\nelseif custom_on,\n    fprintf( '------------------------------------------------------------\\n');\nend\nerrmsg = [];\nif cvx___.isoctave,\n    fflush(1);\nend\ntry\n   [ varargout{1:nargout} ] = sfunc( inputs{:} );\ncatch errmsg\n   [ varargout{1:nargout} ] = deal( [] );\nend\nif ~isempty( dumpfile ),\n    if fid ~= 0,\n        diary( 'off' );\n        fid = fopen( diaryfile, 'r' );\n        if fid ~= 0,\n            output = fread( fid, Inf, '*char' )';\n            fclose( fid );\n            delete( diaryfile );\n        end\n    end\n    if fid == 0,\n        output = '<Could not save>';\n    end\n    otp_names = varargin(end-nargout-1:end-2);\n    dstruct = cell2struct( [ inputs, varargout, output ], [ inp_names, otp_names, 'output' ], 2 ); %#ok\n    save( dumpfile, '-struct', 'dstruct' );\nend\nif ~isempty( errmsg ),\n    rethrow( errmsg );\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_setdual.m",
    "content": "function x = cvx_setdual( x, y )\nx = cvx_setdual( cvx( x ), y );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_setpath.m",
    "content": "function cvx_setpath( arg ) %#ok\n\n%CVX_SETPATH   Sets the cvx path.\n%   CVX_SETPATH adds the internal cvx directories to Matlab's path so that the\n%   CVX system can find the functions that they contain. There is no reason to \n%   call this function during normal use of CVX; it is done automatically as\n%   needed. However, if you are debugging CVX, calling this function can help to\n%   insure that breakpoints stay valid.\n\n% Set the hold flag\nglobal cvx___\ncvx_global\nif ~cvx___.path.active,\n    s = warning('off'); %#ok\n    path([cvx___.path.string,path]);\n    warning(s);\n    cvx___.path.active = true;\nend\nif nargin == 0,\n    cvx___.path.hold = true;\nend\nif cvx___.path.hold,\n    cvx_setspath;\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_setspath.m",
    "content": "function cvx_setspath\n\n%CVX_SETSPATH   Sets the cvx solver path.\n%   CVX_SETSPATH adds the internal cvx solver directories to Matlab's path\n%   so that the CVX system can find the functions that they contain. There \n%   is no reason to call this function during normal use of CVX; it is done\n%   automatically as needed. However, if you are debugging CVX, calling\n%   this function can help to insure that breakpoints stay valid.\n\nglobal cvx___\nosolv = cvx___.solvers.active;\nif isempty( cvx___.problems ),\n    nsolv = cvx___.solvers.selected;\nelse\n    nsolv = cvx___.problems(end).solver.index;\nend\nif osolv ~= nsolv,\n    opath = [];\n    npath = [];\n    needupd = false;\n    if osolv,\n        tstr = cvx___.solvers.list(osolv).path;\n        if ~isempty( tstr ),\n            opath = path;\n            npath = strrep(opath,tstr,'');\n            needupd = true;\n        end\n        cvx___.solvers.active = 0;\n    end\n    if nsolv,\n        tstr = cvx___.solvers.list(nsolv).path;\n        if ~isempty( tstr ),\n            if isempty(opath), opath = path; end\n            if isempty(npath), npath = opath; end\n            npath = [ tstr, npath ];\n            needupd = true;\n        end\n        cvx___.solvers.active = nsolv;\n    end\n    if needupd,\n        path(npath);\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_size_check.m",
    "content": "function sz = cvx_size_check( varargin )\n\n%CVX_SIZE_CHECK   Verifies size compatability.\n%   SZ = CVX_SIZE_CHECK( ARG1, ..., ARGN ) verifies that the arguments are\n%   compatible in size in the same sense as required by the + operator.\n%   That is, any arguments that are not scalars must be of the same size.\n%   No type checking is performed. The output SZ is the size encountered\n%   if the arguments are compatible, or an empty array if they are not.\n%   In other words, ISEMPTY(SZ) is true if the arguments are incompatible.\n\nfor k = 1 : nargin,\n    sz = size( varargin{k} );\n    if any( sz ~= 1 ), \n        break; \n    end\nend\nfor j = k+1 : nargin,\n    sx = size(varargin{k});\n    if any( sx ~= 1 ) && any( sx ~= sz ),\n        sz = [];\n        break\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_subs2str.m",
    "content": "function y = cvx_subs2str( x, mask, fieldalt )\nif nargin < 2,\n    mask = [ 1, 1, 1 ];\nend\nif nargin < 3,\n    fieldalt = 0;\nend\nif ~isstruct( x ),\n    error( 'First arugment must be a structure.' );\nend\ny = '';\nneedfield = fieldalt ~= 0;\nfor k = 1 : length( x ),\n    try\n        tp = x(k).type;\n    catch %#ok\n        error( 'Invalid subscript structure: field \"type\" is missing.' );\n    end\n    if ~ischar( tp ) || size( tp, 1 ) ~= 1,\n        error( 'Invalid subscript entry #%d: field \"type\" must be a string', k );\n    end\n    try\n        sb = x(k).subs;\n    catch %#ok\n        error( 'Invalid subscript structure: field \"subs\" is missing.' );\n    end\n    switch tp,\n        case '.',\n            if ~ischar( sb ) || size( sb, 1 ) ~= 1,\n                error( 'Invalid subscript entry #%d: field name must be a string.', k );\n            elseif ~isvarname( sb ),\n                error( 'Invalid subscript entry #%d: invalid field name: %s', k, sb );\n            end\n            y = [ y, '.', sb ]; %#ok\n            needfield = 0;\n        case { '()', '{}' },\n            if ~mask( 2 )&& tp(1) == '(',\n                error( 'Invalid subscript entry #%d: array subscripts not allowed here.', k );\n            elseif ~mask( 3 ) && tp(1) == '{',\n                error( 'Invalid subscript entry #%d: cell subscripts not allowed here.', k );\n            elseif needfield,\n                error( 'Invalid subscript entry #%d: structure field expected here.', k );\n            elseif ~iscell( sb ),\n                error( 'Invalid subscript entry #%d: field \"subs\" must be a cell array.', k );\n            elseif fieldalt,\n                needfield = 1;\n            end\n            for j = 1 : length( sb ),\n                if isnumeric( sb{j} ),\n                    sb{j} = sprintf('%g',sb{j});\n                elseif ~ischar( sb{j} ) || size( sb{j}, 1 ) ~= 1,\n                    error( 'Invalid subscript entry #%d: invalid cell/array subscript', j );\n                end\n            end\n            sb = sprintf( '%s,', sb{:} );\n            y = [ y, tp(1), sb(1:end-1), tp(2) ]; %#ok\n        otherwise,\n            error( 'Invalid subscript entry #%d: invalid subscript tp: %s', k, tp );\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_subsasgn.m",
    "content": "function y = cvx_subsasgn( y, varargin )\ntemp.type = '()';\ntemp.subs = varargin(1:end-1);\ny = subsasgn( y, temp, varargin{end} );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_subsref.m",
    "content": "function y = cvx_subsref( x, varargin )\ntemp.type = '()';\ntemp.subs = varargin;\ny = subsref( x, temp );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_subsref_check.m",
    "content": "function s = cvx_subsref_check( nin, nin_norm, S )\n\nif nin < nin_norm,\n    s = 'Not enough input arguments';\nelseif nin == nin_norm,\n    if ~isa( S, 'struct' ),\n        s = 'Subscript argument to SUBSREF and SUBSASGN must be a structure.';\n    else\n        Sf = fieldnames( S );\n        if length( Sf ) ~= 2,\n            s = 'Subscript argument to SUBSREF and SUBSASGN must have two fields.';\n        elseif ~isempty( setdiff( { 'type', 'subs' }, Sf ) ),\n            s = 'Subscript argument to SUBSREF and SUBSASGN must have two fields whose names are \"type\" and \"subs\".';\n        elseif isempty( S ),\n            s = 'Subscript argument to SUBSREF and SUBSASGN must not be empty.';\n        else\n            s = '';\n        end\n    end\nelse\n    s = '';\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_use_sparse.m",
    "content": "function tf = cvx_use_sparse( sz, nz, isr )\r\n\r\n%CVX_USE_SPARSE   Sparse/dense matrix efficiency test.\r\n%   CVX_USE_SPARSE(SZ,NZ,ISR) is an internal function used by CVX to determine \r\n%   if a matrix of size SZ with NZ nonzeros would require less memory to store \r\n%   in sparse form or dense form. The matrix is assumed to be real if ISR=1 or\r\n%   ISR is omitted, and complex otherwise.\r\n\r\nif nargin == 1,\r\n    ss = size( sz );\r\n    if length( ss ) > 2,\r\n        tf = false;\r\n        return\r\n    end\r\n    isr = isreal( sz );\r\n    if issparse( sz ),\r\n        nz = nzmax( sz );\r\n    else\r\n        nz = nnz( sz );\r\n    end\r\n    sz = ss;\r\nelseif length( sz ) > 2,\r\n    tf = false;\r\n    return\r\nelseif nargin < 3,\r\n    isr = true;\r\nend\r\nif isr,\r\n    tf = 1 + ( 1 - 2 * sz( 1 ) ) * sz( 2 ) + 3 * nz < 0;\r\nelse\r\n    tf = 1 + ( 1 - 4 * sz( 1 ) ) * sz( 2 ) + 5 * nz < 0;\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_value.m",
    "content": "function v = cvx_value( x )\r\nv = x;\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_values.m",
    "content": "function varargout = cvx_values( varargin )\r\nvarargout = cvx_value( varargin );\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_vexity.m",
    "content": "function y = cvx_vexity( x )\nsx = size( x );\nif cvx_use_sparse( sx, 0, true )\n    y = sparse( sx(1), sx(2) );\nelse\n    y = zeros( sx );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/cvx_zeros.m",
    "content": "function x = cvx_zeros( s )\r\nif cvx_use_sparse( s, 0, 1 ),\r\n     x = sparse( s(1), s(2) );\r\nelse\r\n     x = zeros( s );\r\nend\r\n\r\n% Copyright 2005-2016 CVX Research, Inc.\r\n% See the file LICENSE.txt for full copyright information.\r\n% The command 'cvx_where' will show where this file is located.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/lib/narginchk_/narginchk.m",
    "content": "function narginchk(imin, imax)\nnarg = evalin('caller', 'nargin');\nif narg < imin,\n\tme = {'MATLAB:narginchk:notEnoughInputs', 'Not enough input arguments.'};\nelseif narg > imax,\n\tme = {'MATLAB:narginchk:tooManyInputs', 'Too many input arguments.'};\nelse\n\treturn\nend\nthrowAsCaller(MException(me{:}));\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/Contents.m",
    "content": "% CVX: Definitions of common convex sets.\n%   complex_lorentz         - Complex second-order cone.                        {(x,y): norm(x)<=y}\n%   convex_poly_coeffs      - Coefficients of convex degree-n polynomials.      {p: p(x) convex}\n%   exp_cone                - The exponential cone.                             {(x,y,z): y>=0, y*exp(x/y) <= z }\n%   hermitian_semidefinite  - Hermitian positive semidefinite matrices.         {X: X==X', min(eig(X))>=0}\n%   lorentz                 - Real second-order cones.                          {(x,y): norm(x)<=y}\n%   nonneg_poly_coeffs      - Coefficients of nonnegative degree-n polynomials. {p: p(x)>=0 for all x}\n%   nonnegative             - The nonnegative orthant.                          {x: x>=0}\n%   norm_ball               - Norm ball.                                        {x: norm(x,p) <= 1}\n%   rotated_complex_lorentz - Rotated complex second-order cone.                {(x,y,z): norm(x)^2 <= y*z, y>=0, z>=0 }\n%   rotated_lorentz         - Rotated real second-order cone.                   {(x,y,z): norm(x)^2 <= y*z, y>=0, z>=0 }\n%   semidefinite            - Real symmetric positive semidefinite matrices     {X: X==X', min(eig(X))>=0}\n%   simplex                 - The unit simplex.                                 {x: x>=0, sum(x)==1}\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/complex_lorentz.m",
    "content": "function cvx_optpnt = complex_lorentz( sx, dim )\n\n%COMPLEX_LORENTZ   Complex second-order cone.\n%   COMPLEX_LORENTZ(N), where N is a positive integer, creates a column\n%   variable of length N and a scalar variable, and constrains them\n%   to lie in a second-order cone. That is, given the declaration\n%       variable x(n) complex\n%       variable y\n%   the constraint\n%       {x,y} == complex_lorentz(n)\n%   is equivalent to\n%       norm(x,2) <= y\n%   The inequality form is more natural, and preferred in most cases. But\n%   in fact, the COMPLEX_LORENTZ set form is used by CVX itself to convert\n%   complex NORM()-based constraints to solvable form.\n%\n%   COMPLEX_LORENTZ(SX,DIM), where SX is a valid size vector and DIM is a\n%   positive integer, creates an array variable of size SX and an array\n%   variable of size SY (see below) and applies the second-order cone\n%   constraint along dimension DIM. That is, given the declarations\n%       sy = sx; sy(min(dim,length(sx)+1))=1;\n%       variable x(sx) complex\n%       variable y(sy)\n%   the constraint\n%       {x,y} == complex_lorentz(sx,dim)\n%   is equivalent to\n%       norms(x,2,dim) <= y\n%   Again, the inequality form is preferred, but CVX uses the set form\n%   internally. DIM is optional; if it is omitted, the first non-singleton\n%   dimension is used.\n%\n%   LORENTZ(SX,DIM,CPLX) creates real second-order cones if CPLX is FALSE,\n%   and complex second-order cones if CPLX is TRUE. The latter case is\n%   equivalent to COMPLEX_LORENTZ(SX,DIM).\n%\n%   Disciplined convex programming information:\n%       LORENTZ is a cvx set specification. See the user guide for\n%       details on how to use sets.\n\nnarginchk(1,2);\nif nargin == 1,\n    cvx_optpnt = lorentz( sx, [], true );\nelse\n    cvx_optpnt = lorentz( sx, dim, true );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/convex_poly_coeffs.m",
    "content": "function cvx_optpnt = convex_poly_coeffs( deg, mm ) %#ok\n\n%CONVEX_POLY_COEFFS   Coefficients of convex degree-n polynomials. \n%   CONVEX_POLY_COEFFS(DEG), where DEG is a nonnegative integer, creates a\n%   CVX vector variable of length DEG+1 and treats its values as\n%   coefficients of a polynomial (in the same sense as POLYVAL). It then\n%   constraints those coefficients to guarantee that the resulting\n%   polynomial will be convex; that is, its second derivative will be\n%   nonnegative over the entire real line. That is, given the declaration\n%       variable p(deg+1)\n%       p == convex_poly_coeffs(deg)\n%   the value of P that results will satisfy\n%       POLYVAL([DEG:-1:2].*[DEG-1:-1:1].*P(1:END-2),X)>=0\n%   for any real value of X.\n%\n%   CONVEX_POLY_COEFFS(DEG,MM), where MM is a real vector of length 2,\n%   constrains convexity only over the interval MM(1) <= X <= MM(2).\n%   That is, given a declaration\n%       variable p(deg+1)\n%       p == nonneg_poly_coeffs(deg,mm)\n%   the value of P that results will satisfy\n%       POLYVAL([DEG:-1:2].*[DEG-1:-1:1].*P(1:END-2),X)>=0\n%   between MM(1) and MM(2), inclusive. It may be negative outside that\n%   interval. Note that MM(1) must be less than MM(2) for this constraint\n%   to have any effect.\n%\n%   Disciplined convex programming information:\n%       CONVEX_POLY_COEFFS is a cvx set specification. See the user guide\n%       for details on how to use sets.\n\nnarginchk(1,2);\n\n%\n% Check argument\n%\n\nif ~cvx_check_dimension( deg, true ),\n    error( 'Argument must be a nonnegative integer.' );\nelseif rem( deg, 2 ) ~= 0 && deg ~= 1,\n    error( 'Degree must be 0, 1, or even.' );\nend\n\n% Check range argument\n%\n\nif nargin < 2 || isempty( mm ),\n    mm = [ -Inf, +Inf ];\nelse\n    if ~isa( mm, 'double' ) || ~isreal( mm ) || ndims( mm ) > 2 || numel( mm ) ~= 2 && size( mm, 2 ) ~= 2, %#ok\n        error( 'Second argument must be a range [ xmin xmax ] or a matrix of them.' );\n    end\n    mm = reshape( mm, 0.5 * numel( mm ), 2 );\n    m1 = mm(:,1);\n    m2 = mm(:,2);\n    if any( ( m1 == m2 ) & isinf( m1 ) ),\n        error( 'Intervals [-Inf,-Inf] and [+Inf,+Inf] are not accepted.' );\n    end\nend\n\n%\n% Construct set\n%\n\ncvx_begin set\n    variable coeffs(deg+1);\n    if deg >= 2,\n        ((deg:-1:2).*(deg-1:-1:1))'.*coeffs(1:end-2,:) == nonneg_poly_coeffs(deg-2,mm); %#ok\n    end\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/exponential.m",
    "content": "function cvx_optpnt = exponential( sx )\n\n%EXPONENTIAL   Exponential cone.\n%   EXPONENTIAL, called with no arguments, creates three scalar variables X,\n%   Y, and Z and constraints them to lie in an exponetial cone. That is,\n%   given the declaration\n%       variables x y z\n%       {x,y,z} == exp_cone\n%   constraints the variables to satisfy\n%       y*exp(x/y) <= z\n%       y > 0\n%   The inequality form does not obey the disciplined convex programming\n%   ruleset, but a function EXP_P has been created to represent this\n%   computation; so the set declaration above is equivalent to\n%       EXP_P(X,Y) <= Z\n%   EXP_CONE(SX), where SX is a size vector, creates three array variables\n%   X, Y, and Z, each of size SX, which are constrained elementwise to\n%   satisfy EXP_P(X,Y) <= Z. If SX is empty, then SX=[1,1] is assumed.\n\ncvx_expert_check( 'exponential' );\nnarginchk(0,1);\n\n%\n% Check size vector\n%\n\nif nargin == 0 || isempty( sx ),\n    sx = [1,1]; %#ok\nelse\n    [ temp, sx ] = cvx_check_dimlist( sx, true ); %#ok\n    if ~temp,\n        error( 'First argument must be a dimension vector.' );\n    end\nend\n\n\n%\n% Build the cone\n%\n\ncvx_begin set\n    variables x( sx ) y( sx ) z( sx )\n    [ tx, dummy ] = find( cvx_basis( x ) ); %#ok\n    [ ty, dummy ] = find( cvx_basis( y ) ); %#ok\n    [ tz, dummy ] = find( cvx_basis( z ) ); %#ok\n    newnonl( cvx_problem, 'exponential', [ tx(:)' ; ty(:)' ; tz(:)' ] );\n    cvx___.canslack( tx ) = false;\n    cvx___.canslack( ty ) = false;\ncvx_end\n\ncvx_optpnt = cvxtuple( struct( 'x', x, 'y', y, 'z', z ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/geo_mean_cone.m",
    "content": "function [ cvx_optpnt, mode ] = geo_mean_cone( sx, dim, w, mode )\n\n%GEO_MEAN_CONE    Cones involving the geometric mean.\n%   GEO_MEAN_CONE(N), where N is a positive integer, creates a column vector\n%   variable X of length N and a scalar variable Y, and constrains them to\n%   satisfy GEO_MEAN(X) >= Y and X >= 0. That is, given the declaration\n%       variables x(n) y\n%   the constraint\n%       {x,y} == geo_mean_cone(n)\n%   is equivalent to\n%       geo_mean(x) >= y\n%   CVX uses the GEO_MEAN_CONE to implement the GEO_MEAN function and a\n%   variety of others, including POW_POS, POW_P, POW_ABS, and NORM. For\n%   clarity, users should prefer these functions instead of using this cone\n%   directly.\n%\n%   GEO_MEAN_CONE(SY,DIM), where SY is a valid size vector and DIM is a\n%   positive integer, creates an array variable of size SY and and an array\n%   variable of size SX (see below) and applies the geometric mean\n%   constraint along dimension DIM. That is, given the declarations\n%       sy = sx; sy(min(dim,length(sx)+1))=1;\n%       variables x(sx) y(sy)\n%   the constraint\n%       {x,y} == geo_mean_cone(sx,dim)\n%   is equivalent to\n%       geo_mean(x,dim) >= y\n%   Again, the inequality form is preferred, but CVX uses the set form\n%   internally. DIM is optional; if it is omitted or empty, the first\n%   non-singleton dimension is used.\n%\n%   GEO_MEAN_CONE(SX,DIM,W), where W is a vector of nonnegative numbers,\n%   replaces the standard geometric mean with a weighted geometric mean\n%       geo_mean(x,dim,w) >= y\n%   The standard geometric mean is equivalent to W=ones(SX(DIM),1). Due to\n%   the way CVX implements weighted geometric means, it rounds the elements\n%   of W to the \"nearest\" rationals according to the RAT function.\n%\n%   GEO_MEAN_CONE(SX,MODE),\n%   GEO_MEAN_CONE(SX,DIM,MODE), or\n%   GEO_MEAN_CONE(SX,DIM,W,MODE), where MODE is a string, generates a number\n%   of alternative cones:\n%       MODE = 'HYPO': geo_mean(x) >= y\n%       MODE = 'POS' : geo_mean(x) >= y, y >= 0\n%       MODE = 'ABS' : geo_mean(x) >= abs(y) \n%       MODE = 'CABS': geo_mean(x) >= abs(y), y complex\n%       MODE = 'FUNC': select 'POS' or 'ABS', depending on which one is\n%          is cheaper to implement. This is useful when y can be guaranteed\n%          to be nonnegative in some other way; say, through an external\n%          constraint or a maximizing objective. The mode actually used\n%          will be returned as a second output argument.\n%       MODE = '' is the same as MODE = 'HYPO'. GEO_MEAN_CONE is insensitive\n%       to case; e.g., 'pos' is equivalent to 'POS'.\n%\n%   Disciplined convex programming information:\n%       GEO_MEAN_CONE is a CVX set specification. See the user guide for\n%       details on how to use sets. However, it is strongly recommended\n%       that users take advantage of this set by calling the functions that\n%       utilize it; i.e., GEO_MEAN, POW_POS, POW_ABS, POW_P, NORM, etc.\n%       Doing so will produce models that are simpler to understand.\n\n%\n% Check size vector\n%\n\n[ temp, sx ] = cvx_check_dimlist( sx, true );\nif ~temp,\n    error( 'First argument must be a dimension vector.' );\nend\n\n%\n% Check dimension\n%\n\nif nargin < 4,\n    mode = '';\nend\nif nargin == 2 && ischar( dim ),\n    mode = dim;\n    dim = cvx_default_dimension( sx );\nelseif nargin < 2 || isempty( dim ),\n    dim = cvx_default_dimension( sx );\nelseif ~cvx_check_dimension( dim, true ),\n    error( 'Second argument must be a nonnegative integer.' );\nend\nsy = sx;\nnd = length( sx );\nif dim <= 0 || dim > nd || sx( dim ) == 1,\n    nx  = 1;\n    dim = 0;\nelse\n    nx = sx( dim );\n    sy( dim ) = 1;\nend\n\n%\n% Check weight vector\n%\n\nif nargin == 3 && ischar( w ),\n    mode = w;\n    w = [];\nelseif nargin < 3 || isempty( w ),\n    w = [];\nelseif numel( w ) ~= length( w ) || ~isnumeric( w ) || ~isreal( w ) || any( w < 0 ),\n    error( 'Third argument must be a vector of nonnegative real numbers.' );\nelseif length( w ) ~= nx,\n    error( 'Third argument must be a vector of length %d', nx );\nelseif nx ~= 0 && ~any( w ),\n    error( 'At least one of the weights must be nonzero.' );\nend\nif ~isempty( w ) && any( w ~= floor( w ) ),\n    [ nn, dd ] = rat( w );\n    dmax = dd(1);\n    for k = 2 : length(dd), dmax = lcm(dmax,dd(k)); end\n    w = nn .* ( dmax ./ dd );\nend\n\n%\n% Check mode string\n%\n\nif isempty( mode ),\n    mode = 'hypo';\nelseif ~ischar( mode ) || size( mode, 1 ) > 1,\n    error( 'Mode must be a string.' );\nelse\n    lmode = lower(mode);\n    if ~any( strcmp( lmode, { 'hypo', 'pos', 'abs', 'cabs', 'func' } ) ),\n        error( [ 'Invalid mode string: ', mode ] );\n    end\n    mode = lmode;\nend\n\n%\n% Quick exit for empty arrays and degenerate cases\n%\n\nif any( sx == 0 ),\n    cvx_begin set\n        variables x(sx) y(sy)\n    cvx_end\n    return\nelseif nx == 1,\n    cvx_begin set\n        variable x(sx)\n        x >= 0; %#ok\n        switch mode,\n            case { 'hypo', 'func' },\n                variable y(sy)\n                x >= y; %#ok\n            case 'pos',\n                variable y(sy)\n                x >= y;  %#ok\n                y >= 0; %#ok\n            case 'abs',  \n                variable y(sy)\n                x >= abs( y ); %#ok\n            case 'cabs',\n                variable y(sy) complex\n                x >= abs( y ); %#ok\n        end\n    cvx_end\n    return\nend\n\n%\n% Construct the cone.\n% --- For nx == 2, the geo_mean the following equivalency\n%        sqrt( x(1) * x(2) ) >= | y |, x >= 0 <--> [x(1),y;y,x(2)] psd\n% --- For nx == 2^k, we can recursively apply this k times. For example,\n%     for nx = 4, we have\n%        ( x(1) * x(2) * x(3) * x(4) )^(1/4) >= | y |, x >= 0\n%     is equivalent to\n%        sqrt( w(1) * w(2) ) >= |y|,      w(1),w(2) >= 0\n%        sqrt( x(1) * x(2) ) >= | w(1) |, x(1),x(2) >= 0\n%        sqrt( x(3) * x(4) ) >= | w(2) |, x(3),x(4) >= 0\n%     which can be represented by 3 2x2 LMIs.\n% --- For other values of nx, we note that\n%        prod( x )^(1/nx) >= y, x >= 0, y >= 0\n%     is equivalent to\n%        prod( [ x ; y * ones(ny,1) ] )^(1/(nx+ny)) >= y\n%     so by adding extra y's to the left-hand side, we can use the same\n%     recursion for lengths that are not powers of two.\n% --- Note that the power-of-two cone allows y to be negative, while the \n%     non-power-of-two cone does not. Therefore, for consistency, we have\n%     to modify one cone or the other appropriately. For instance, to\n%     recover the absolute value behavior in the latter case, we must\n%     actually construct the cone\n%        prod( x )^(1/nx) >= z >= abs(y), x >= 0, z >= 0\n% --- For integer-weighted geometric means, we must effectively replicate\n%     each x(i) w(i) times. However, because sqrt( x(i) * x(i) ) = x(i),\n%     we can prune away most of the duplicated values very cheaply. The\n%     number of non-trivial appearances of x(i) will be reduced from w(i)\n%     to at most ceil(log2(w(i))), or more precisely the number of 1's in \n%     a binary expansion of w(i). In fact, the number might be lower than\n%     that thanks to savings achieved by grouping terms with common bit\n%     patterns in their w(i) values.\n%\n\n%\n% Construct the map\n%\n\nif isempty( w ) || ~any( diff( w ) ),\n    wbasic = true;\n    wsum = nx;\n    w = ones( 1, nx );\nelse\n    w = w(:)';\n    for k = factor(min(w(w~=0))),\n        if all( rem( w, k ) == 0 ), w = w / k; end\n    end\n    wsum = sum( w );\n    wbasic = false;\nend\nworig = w;\nnq = nextpow2(wsum);\nnw = pow2(nq);\nndxs = 1 : nx;\nif nw > wsum,\n    ndxs(end+1) = 0;\n    w(end+1) = nw - wsum;\nend\n%\n% Look for candidates with common factors that can be\n% extracted to save LMI blocks: e.g.,\n%    ( x1^3 x2^2 x2^3 )^(1/8) =\n%       = ((sqrt(x1 x3))^(1/6) x2^2)^(1/8)\n%\nn3 = nx;\nmap = [];\nif ~wbasic,\n    [ ff, ee ] = log2( w ); %#ok\n    ndx1 = find( ff ~= 0.5 & ff ~= 0 );\n    while length( ndx1 ) > 1,\n        % Build cross matrix\n        nv = length( ndx1 );\n        ww = w( ndx1 );\n        ww = ones( nv, 1 ) * ww;\n        [ wi, wj, ww ] = find( bitand( tril(ww,-1)', triu(ww,1) ) );\n        [ ff, ee ] = log2( ww ); \n        ndx2 = find( ff ~= 0.5 );\n        if isempty( ndx2 ), break; end\n        % Greedy: select the largest overlap\n        ee = ee(ndx2);\n        [ wc_t, wnm ] = max( sum(dec2bin(ww(ndx2))-'0',2)+(1-ee/(max(ee)+1)) ); %#ok\n        % Construct a 2-element geo_mean\n        wi_t     = ndx1(wi(ndx2(wnm)));\n        wj_t     = ndx1(wj(ndx2(wnm)));\n        n3       = n3 + 1;\n        ndxs     = [ ndxs, n3 ]; %#ok\n        map      = [ map, [ ndxs(wi_t) ; ndxs(wj_t) ; n3 ] ]; %#ok\n        % Update the weights\n        wt       = bitand( w(wi_t), w(wj_t) );\n        w(end+1) = 2 * wt; %#ok\n        try\n            wt       = bitcmp( wt, nq );\n            w(wi_t)  = bitand( w(wi_t), wt );\n            w(wj_t)  = bitand( w(wj_t), wt );\n        catch\n            wt       = bitcmp( uint64(wt) );\n            w(wi_t)  = double( bitand( uint64(w(wi_t)), wt ) );\n            w(wj_t)  = double( bitand( uint64(w(wj_t)), wt ) );\n        end\n        % Update the count\n        ndx1 = [ ndx1, length(ndxs) ]; %#ok\n        [ ff, ee ] = log2( w(ndx1) ); %#ok\n        ndx1 = ndx1( ff ~= 0.5 & ff ~= 0 );\n    end\nend\n\n%\n% Now do standard left-to-right combining\n%    x1^3 x2^2 x3^3 = x1 x1 x1 x2 x2 x3 x3 x3\n%       = (x1 x1)(x1 x2)(x2 x3)(x3 x3)\n%\nfor k = 1 : nq,\n    tt  = rem( w, 2 ) ~= 0;\n    w   = floor( 0.5 * w );\n    n12 = ndxs( tt );\n    ntt = 0.5 * length( n12 );\n    if ntt >= 1,\n        n3    = n3(end) + 1 : n3(end) + ntt;\n        map   = [ map, [ reshape( n12, 2, ntt ) ; n3 ] ]; %#ok\n        ndxs  = [ ndxs, n3 ]; %#ok\n        w     = [ w, ones( 1, ntt ) ]; %#ok\n    end\nend\nif ~isempty( map ),\n    map(map==0) = map(end);\nelse\n    map = zeros(3,0);\nend\n\n%\n% Build the cone\n%\n\nnv    = prod( sy );\nnm    = size(map,2);\nmused = nnz( map == nm + nx ) > 1;\ncvx_begin set\n    variable x( nx, nv );\n    if isequal( mode, 'cabs' ),\n        variable y( 1, nv ) complex;\n    else\n        variable y( 1, nv );\n    end\n    variable xw( nm-1, nv );\n    cone = [];\n    xa = [];\n    switch mode,\n        case 'func',\n            if mused,\n                mode = 'pos';\n            else\n                mode = 'abs';\n            end\n        case 'hypo',\n            variable xa( 1, nv );\n            y <= xa; %#ok\n        case 'pos',\n            if ~mused,\n                y >= 0; %#ok\n            end\n        case 'abs',\n            if mused,\n                variable xa( 1, nv );\n                abs( y ) <= xa; %#ok\n            end\n        case 'cabs',\n            if mused,\n                variable xa( 1, nv );\n                abs( y ) <= xa; %#ok\n            else\n                cone = hermitian_semidefinite( [2,2,1,nv] );\n            end\n    end\n    if isempty( xa ),\n        xa = y;\n    end\n    if isempty( cone ),\n        cone = semidefinite( [2,2,nm,nv] );\n    elseif nm > 1,\n        cone = cat( 3, semidefinite( [2,2,nm-1,nv] ), cone );\n    end\n    xt = [ x ; xw ; xa ]; %#ok\n    xt( map(1,:), : ) == reshape( cone(1,1,:,:), [nm,nv] ); %#ok\n    xt( map(2,:), : ) == reshape( cone(2,2,:,:), [nm,nv] ); %#ok\n    xt( map(3,:), : ) == reshape( cone(2,1,:,:), [nm,nv] ); %#ok\n    tt = worig == 0;\n    if any( tt ),\n        x( tt, : ) >= 0; %#ok\n    end\ncvx_end\n\n%\n% Permute and reshape as needed\n%\n\nnleft = prod( sx(1:dim-1) );\nnright = prod( sx(dim+1:end) );\nif nleft > 1,\n    x = reshape( x, [ nx, nleft, nright ] );\n    y = reshape( y, [ 1,  nleft, nright ] );\n    x = permute( x, [ 2, 1, 3 ] );\n    y = permute( y, [ 2, 1, 3 ] );\nend\nx = reshape( x, sx );\ny = reshape( y, sy );\ncvx_optpnt = cvxtuple( struct( 'x', x, 'y', y ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/hermitian_semidefinite.m",
    "content": "function cvx_optpnt = hermitian_semidefinite( n )\n\n%HERMITIAN_SEMIDEFINITE   Complex Hermitian positive semidefinite matrices.\n%    HERMITIAN_SEMIDEFINITE(N), where N is an integer, creates a complex \n%    Hermitian matrix variable of size [N,N] and constrains it to be \n%    positive semidefinite. Therefore, given the declaration\n%       variable x(n,n) Hermitian\n%    the constraint\n%       x == hermitian_semidefinite(n)\n%    is equivalent to\n%       lambda_min(x) >= 0;\n%    In fact, lambda_min is implemented in CVX using HERMITIAN_SEMIDEFINITE\n%    for complex matrices.\n%\n%    HERMITIAN_SEMIDEFINITE(SX), where SX is a valid size vector, creates\n%    an array variable of size SX and constrains each subarray along the \n%    leading two dimensions to be positive semidefinite. SX(1) and SX(2)\n%    must be equal. Therefore, given the declaration\n%       variable x(sx) Hermitian\n%    the constraint\n%       x == hermitian_semidefinite(sx)\n%    is equivalent to\n%       for k = 1:prod(sx(3:end)),\n%          lambda_min(x(:,:,k)) >= 0;\n%       end\n%\n%   Disciplined convex programming information:\n%       SEMIDEFINITE is a cvx set specification. See the user guide for\n%       details on how to use sets.\n\nnarginchk(1,1);\ncvx_optpnt = semidefinite( n, true );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/lorentz.m",
    "content": "function cvx_optpnt = lorentz( sx, dim, iscplx )\n\n%LORENTZ   Real second-order cone.\n%   LORENTZ(N), where N is a positive integer, creates a column\n%   variable of length N and a scalar variable, and constrains them\n%   to lie in a second-order cone. That is, given the declaration\n%       variables x(n) y\n%   the constraint\n%       {x,y} == lorentz(n)\n%   is equivalent to\n%       norm(x,2) <= y\n%   The inequality form is more natural, and preferred in most cases. But\n%   in fact, the LORENTZ set form is used by CVX itself to convert NORM()-\n%   based constraints to solvable form.\n%\n%   LORENTZ(SX,DIM), where SX is a valid size vector and DIM is a positive\n%   integer, creates an array variable of size SX and an array\n%   variable of size SY (see below) and applies the second-order cone\n%   constraint along dimension DIM. That is, given the declarations\n%       sy = sx; sy(min(dim,length(sx)+1))=1;\n%       variables x(sx) y(sy)\n%   the constraint\n%       {x,y} == lorentz(sx,dim)\n%   is equivalent to\n%       norms(x,2,dim) <= y\n%   Again, the inequality form is preferred, but CVX uses the set form\n%   internally. DIM is optional; if it is omitted, the first non-singleton\n%   dimension is used.\n%\n%   LORENTZ(SX,DIM,CPLX) creates real second-order cones if CPLX is FALSE,\n%   and complex second-order cones if CPLX is TRUE. The latter case is\n%   equivalent to COMPLEX_LORENTZ(SX,DIM).\n%\n%   Disciplined convex programming information:\n%       LORENTZ is a cvx set specification. See the user guide for\n%       details on how to use sets.\n\nnarginchk(1,3);\n\n%\n% Check size vector\n%\n\n[ temp, sx ] = cvx_check_dimlist( sx, true );\nif ~temp,\n    error( 'First argument must be a dimension vector.' );\nend\n\n%\n% Check dimension\n%\n\nif nargin < 2 || isempty( dim ),\n    dim = cvx_default_dimension( sx );\nelseif ~cvx_check_dimension( dim, true ),\n    error( 'Second argument must be a dimension (or zero).' );\nend\nsy = sx;\nnd = length( sx );\nif dim <= 0 || dim > nd || sx( dim ) == 1,\n    nv  = 1;\n    dim = 0;\nelse\n    nv = sx( dim );\n    sy( dim ) = 1;\nend\n\n%\n% Check complex flag\n%\n\nif nargin < 3 || isempty( iscplx ),\n    iscplx = false;\nelseif length( iscplx ) ~= 1,\n    error( 'Third argument must be a scalar.' );\nelse\n    iscplx = logical( iscplx );\nend\n\n%\n% Build the cone\n%\n\nny = prod( sy );\nif nv == 0,\n    iscplx = false;\nelseif iscplx,\n    nv = nv * 2;\nend\ncvx_begin set\n    variables x( nv, ny ) y( 1, ny )\n    [ ty, dummy ] = find( cvx_basis( y ) ); %#ok\n    if nv > 0,\n        [ tx, dummy ] = find( cvx_basis( x ) ); %#ok\n        newnonl( cvx_problem, 'lorentz', [ reshape( tx, nv, ny ) ; reshape( ty, 1, ny ) ] );\n        cvx___.canslack( tx ) = false;\n    else\n        newnonl( cvx_problem, 'nonnegative', ty );\n    end\ncvx_end\n\n%\n% Permute and reshape as needed\n%\n\nif iscplx,\n    x = cvx_r2c( x, 1 );\n    nv = nv * 0.5;\nend\nnleft = prod( sx( 1 : dim - 1 ) );\nif nleft > 1,\n    x = reshape( x, [ nv, nleft, ny / nleft ] );\n    y = reshape( y, [ 1,  nleft, ny / nleft ] );\n    x = permute( x, [ 2, 1, 3 ] );\n    y = permute( y, [ 2, 1, 3 ] );\nend\nx = reshape( x, sx );\ny = reshape( y, sy );\ncvx_optpnt = cvxtuple( struct( 'x', x, 'y', y ) );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/nonneg_poly_coeffs.m",
    "content": "function coeffs = nonneg_poly_coeffs( deg, trig, mm ) %#ok\n\n%NONNEG_POLY_COEFFS   Coefficients of nonnegative degree-n polynomials. \n%   NONNEG_POLY_COEFFS(DEG), where DEG is a nonnegative integer, creates a\n%   vector variable of length DEG+1 and treats its values as\n%   coefficients of a polynomial (in the same sense as POLYVAL). It then\n%   constrains those coefficients to guarantee that the resulting\n%   polynomial will be nonnegative over the entire real line. That is, \n%   given a declaration\n%       variable p(deg+1)\n%       p == nonneg_poly_coeffs(deg)\n%   the value of P that results will satisfy POLYVAL(P,X)>=0 for any real\n%   value of X.\n%\n%   NONNEG_POLY_COEFFS(DEG,MM), where MM is a real vector of length 2,\n%   constrains nonnegativity only over the interval MM(1) <= X <= MM(2).\n%   That is, given a declaration\n%       variable p(deg+1)\n%       p == nonneg_poly_coeffs(deg,mm)\n%   the value of P that results will satisfy POLYVAL(P,X)>=0 for any real\n%   value of X between MM(1) and MM(2), inclusive. It may be negative\n%   outside that interval. Note that MM(1) must be less than MM(2) for\n%   this constraint to have any effect.\n%\n%   NONNEG_POLY_COEFFS(DEG,'TRIG') and NONNEG_POLY_COEFFS(DEG,MM,'TRIG')\n%   create sets of coefficients of nonnegative *trigonometric* polynomials.\n%   That is, given the declaration\n%      variable p(deg+1)\n%      p == nonneg_poly_coeffs(deg,true)\n%   the value of P that resutls will satisfy \n%      REAL(POLYVAL(P,EXP(-SQRT(-1)*X)))>=0 \n%   for any value of X.\n%\n%   Disciplined convex programming information:\n%       NONNEG_POLY_COEFFS is a cvx set specification. See the user guide\n%       for details on how to use sets.\n\nnarginchk(1,3);\n\n \n%\n% Check degree argument\n%\n\nif ~cvx_check_dimension( deg, true ),\n    error( 'Argument must be a nonnegative integer.' );\nend\n\n%\n% Check trig argument\n%\n\nswitch nargin,\n    case 1,\n        mm = [];\n        trig = false;\n    case 2,\n        if isequal( trig, 'trig' ),\n            trig = true;\n            mm = [];\n        else\n            mm = trig;\n            trig = false;\n        end\n    case 3,\n        if ~isequal( trig, 'trig' ),\n            error( 'Second argument must be a range, or ''trig''.' );\n        end\n        trig = true;\nend\n\n%\n% Check range argument\n%\n    \nif isempty( mm ),\n    mm = [ -Inf, +Inf ];\nelseif ~isa( mm, 'double' ) || ~isreal( mm ) || numel( mm ) ~= 2,\n    error( 'Second argument, if supplied, must be a range [ xmin xmax ].' );\nelseif any( mm(1) == mm(2) & isinf( mm(1) ) ),\n    error( 'Intervals [-Inf,-Inf] and [Inf,Inf] are not accepted.' );\nend\n\n%\n% Construct set\n%\n\nif trig,\n    \n    %\n    % Trigonometric\n    %\n    \n    cvx_begin set\n        variable coeffs(deg+1) complex;\n        if mm(1) == mm(2),\n            % Positive at a single point\n            polyval_trig( coeffs, mm(1) ) >= 0; %#ok\n        elseif mm(2) > mm(1) + 2 * pi,\n            % Positive over the entire unit circle\n            [ii,jj,vv] = find(hermitian_semidefinite(deg+1));\n            coeffs == sparse( deg+1-abs(ii-jj), 1, vv ); %#ok\n        elseif mm(2) > mm(1),\n            % Positive over a subset of the unit circle\n            a = exp( 1i * ( 0.5 * ( mm(2) + mm(1) ) ) );\n            b = cos( 0.5 * ( mm(2) - mm(1) ) );\n            coeffs1 = nonneg_poly_coeffs(deg,'trig');\n            coeffs2 = nonneg_poly_coeffs(deg-1,'trig');\n            coeffs == coeffs1 ...\n                + [ (0.5*a)*coeffs2 ; 0 ] ...\n                + [ 0 ; 0 ; (0.5*conj(a))*coeffs2(1:end-1) ] ...\n                + [ zeros(deg-1,1) ; (0.5*a)*conj(coeffs2(end)) ; 0 ] ...\n                - [ 0 ; b*coeffs2 ]; %#ok\n        end\n    cvx_end\n    \nelse        \n    \n    %\n    % Non-trigonometric\n    %\n\n    cvx_begin set\n        variable coeffs(deg+1);\n        if mm(1) == mm(2),\n            % Positive at a single point\n            polyval( coeffs, mm(1) ) >= 0; %#ok\n        elseif mm(1) == -Inf,\n            isodd = rem(deg,2);\n            deg2 = floor(0.5*deg) + 1;\n            [ii,jj,vv] = find(semidefinite(deg2));\n            coeffs1 = sparse(ii+jj-1+isodd,1,vv);\n            if mm(2) == +Inf,\n                % [ -Inf, +Inf ]\n                coeffs == coeffs1; %#ok\n            else\n                % [ -Inf, mm(2) ]\n                coeffs2 = nonneg_poly_coeffs(deg-1);\n                coeffs == coeffs1 - [ coeffs2 ; 0 ] + [ 0 ; mm(2) * coeffs2 ]; %#ok\n            end\n        elseif mm(2) == +Inf,\n            % [ mm(1), +Inf ]\n            coefff1 = nonneg_poly_coeffs(deg); %#ok\n            coeffs2 = nonneg_poly_coeffs(deg-1);\n            coeffs == coeffs1 + [ coeffs2 ; 0 ] - [ 0 ; mm(1) * coeffs2 ]; %#ok\n        elseif mm(1) < mm(2),\n            % [ mm(1), mm(2) ]\n            coeffs1 = nonneg_poly_coeffs(deg);\n            coeffs2 = nonneg_poly_coeffs(deg);\n            [ 0 ; coeffs ] == ...\n                + [ coeffs1 ; 0 ] - [ 0 ; mm(1) * coeffs1 ] ...\n                - [ coeffs2 ; 0 ] + [ 0 ; mm(2) * coeffs2 ]; %#ok\n        end\n    cvx_end\n\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/nonnegative.m",
    "content": "function cvx_optpnt = nonnegative( sx ) %#ok\n\n%NONNEGATIVE   The nonnegative orthant.\n%   NONNEGATIVE(SX), where SX is a valid size vector, creates an array\n%   of size SX and constrains each element to be nonnegative. Therefore,\n%   given the declaration\n%      variable x(sx)\n%   the constraint\n%      x == nonnegative(sx);\n%   is equivalent to\n%      x >= 0;\n%   Obviously, the inequality form is simpler and is preferred in most\n%   circumstances.\n%\n%   Disciplined convex programming information:\n%       NONNEGATIVE is a cvx set specification. See the user guide for\n%       details on how to use sets.\n\nnarginchk(1,1);\n\n[ temp, sx ] = cvx_check_dimlist( sx, true );\nif ~temp,\n    error( 'Argument must be a non-empty dimension vector.' );\nend\n    \ncvx_begin set\n    variables x( sx )\n    if all( sx ~= 0 ),\n        [ tx, dummy ] = find( cvx_basis( x ) ); %#ok\n        newnonl( cvx_problem, 'nonnegative', tx(:) );\n    end\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/norm_ball.m",
    "content": "function cvx_optpnt = norm_ball( sz, varargin ) %#ok\n\n%NORM_BALL   Norm ball.\n%   NORM_BALL( sz, ... ) returns a variable of size sz, say 'x', that is\n%   constrained to satisfy NORM( x, ... ) <= 1. Any syntactically valid\n%   and _convex_ use of the NORM() function has a direct analog in\n%   NORM_BALL. The convex requirement specifically excludes, then, all\n%   instances of NORM( x, p ) where p < 1.\n%\n%   See NORM for more detaills.\n%\n%   Disciplined convex programming information:\n%       NORM_BALL is a cvx set specification. See the user guide for\n%       details on how to use sets.\n\nnarginchk(1,Inf);\n[ temp, sz ] = cvx_check_dimlist( sz, false );\nif ~temp,\n    error( 'First argument must be a valid dimension list.' );\nelseif length( sz ) > 2,\n    error( 'N-D arrays not supported.' );\nend\n\ncvx_begin set\n    variable x( sz )\n    norm( x, varargin{:} ) <= 1; %#ok\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/rotated_complex_lorentz.m",
    "content": "function cvx_optpnt = rotated_complex_lorentz( sx, dim )\n\n%ROTATED_COMPLEX_LORENTZ   Rotated complex second-order cone.\n\n%   ROTATED_COMPLEX_LORENTZ is the complex version of ROTATED_LORENTZ.\n%   ROTATED_COMPLEX_LORENTZ(N), where N is a positive integer, creates a \n%   complex column variable of length N and two real scalar \n%   variables, and constrains them to lie in a complex rotated second-order\n%   cone. That is, given the declarations\n%       variable x(n) complex\n%       variables y z\n%   the constraint\n%       {x,y,z} == rotated_complex_lorentz(n)\n%   is equivalent to\n%       norm(x,2) <= geo_mean([y,z])\n%   except that using ROTATED_COMPLEX_LORENTZ is more efficient.\n%\n%   ROTATED_COMPLEX_LORENTZ(SX,DIM), where SX is a valid size vector and\n%   DIM is a positive integer, creates a complex array variable of size\n%   SX and two real array variables of size SY (see below), and applies the\n%   second-order cone constraint along the dimension DIM. That is, given\n%   the declarations\n%       sy = sx; sy(min(dim,length(sx)+1)) = 1;\n%       variable x(sx) complex\n%       variables y(sy) z(sz)\n%   the constraint\n%       {x,y,z} == rotated_complex_lorentz(sx,dim)\n%   is equivalent to\n%       norms(x,2,dim) <= geo_mean(cat(dim,y,z),dim)\n%   except, again, ROTATED_LORENTZ is more efficient. DIM is optional; if\n%   it is omitted, the first non-singleton dimension is used.\n%\n%   Disciplined convex programming information:\n%       ROTATED_COMPLEX_LORENTZ is a cvx set specification. See the user \n%       guide for details on how to use sets.\n\nnarginchk(1,2);\nif nargin == 1,\n    cvx_optpnt = rotated_lorentz( sx, [], true );\nelse\n    cvx_optpnt = rotated_lorentz( sx, dim, true );\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/rotated_lorentz.m",
    "content": "function cvx_optpnt = rotated_lorentz( sx, dim, iscplx )\n\n%ROTATED_LORENTZ   Rotated real second-order cone.\n%   ROTATED_LORENTZ(N), where N is a positive integer, creates a column\n%   variable of length N and two scalar variables, and constrains them\n%   to lie in a rotated second-order cone. That is, given the declaration\n%       variables x(n) y z\n%   the constraint\n%       {x,y,z} == rotated_lorentz(n)\n%   is equivalent to\n%       norm(x,2) <= geo_mean([y,z])\n%   except that using ROTATED_LORENTZ is more efficient.\n%\n%   ROTATED_LORENTZ(SX,DIM), where SX is a valid size vector and DIM is a\n%   positive integer, creates an array variable of size SX and two \n%   array variables of size SY (see below) and applies the second-order cone\n%   constraint along dimension DIM. That is, given the declarations\n%       sy = sx; sy(min(dim,length(sx)+1))=1;\n%       variables x(sx) y(sy) z(sz)\n%   the constraint\n%       {x,y,z} == rotated_lorentz(sx,dim)\n%   is equivalent to\n%       norms(x,2,dim) <= geo_mean(cat(dim,y,z),dim)\n%   except, again, ROTATED_LORENTZ is more efficient. DIM is optional; if\n%   it is omitted, the first non-singleton dimension is used.\n%\n%   ROTATED_LORENTZ(SX,DIM,CPLX) creates real second-order cones if CPLX is\n%   FALSE, and complex second-order cones if CPLX is TRUE. The latter case\n%   is equivalent to COMPLEX_ROTATED_LORENTZ(SX,DIM).\n%\n%   Disciplined convex programming information:\n%       ROTATED_LORENTZ is a cvx set specification. See the user guide for\n%       details on how to use sets.\n\n%\n% Check size vector\n%\n\nnarginchk(1,3);\n[ temp, sx ] = cvx_check_dimlist( sx, true );\nif ~temp,\n    error( 'First argument must be a dimension vector.' );\nend\n\n%\n% Check dimension\n%\n\nnd = length( sx );\nif nargin < 2 || isempty( dim ),\n    dim = cvx_default_dimension( sx );\nelseif ~cvx_check_dimension( dim, true ),\n    error( 'Second argument must be a dimension (or zero).' );\nelseif dim == 0 || dim > nd || sx( dim ) == 1,\n    dim = find( sx == 1 );\n    if isempty( dim ),\n        dim = nd + 1;\n    else\n        dim = dim( 1 );\n    end\nend\nif dim > nd,\n    sx( end + 1 : dim ) = 1;\n    nd = dim;\nend\n\n%\n% Check complex flag\n%\n\nif nargin < 3 || isempty( iscplx ),\n    iscplx = false;\nelseif length( iscplx ) ~= 1,\n    error( 'Third argument must be a scalar.' );\nelse\n    iscplx = logical( iscplx );\nend\n\n%\n% Build the cvx module\n%\n\nif iscplx,\n    sx( dim ) = 2 * sx( dim );\nend\n\nif any( sx == 0 ),\n    cvx_optpnt.x = cvx( sx, [] );\n    sx( dim ) = 1;\n    cvx_optpnt.y = nonnegative( sx );\n    cvx_optpnt.z = nonnegative( sx );\nelseif sx( dim ) == 1,\n    cone = semidefinite( [ 2, 2, sx ] );\n    cvx_optpnt.x = reshape( cone( 2, 1, : ), sx );\n    cvx_optpnt.y = reshape( cone( 1, 1, : ), sx );\n    cvx_optpnt.z = reshape( cone( 2, 2, : ), sx );\nelse\n    sx( dim ) = sx( dim ) + 1;\n    cone = lorentz( sx, dim );\n    ndxs = cell( 1, nd );\n    [ ndxs{:} ] = deal( ':' );\n    ndxs{ dim } = 1 : sx( dim ) - 1;\n    cvx_optpnt.x = cone.x( ndxs{:} );\n    ndxs{ dim } = sx( dim );\n    temp = cone.x( ndxs{:} );\n    cvx_optpnt.y = cone.y + temp;\n    cvx_optpnt.z = cone.y - temp;\nend\n\nif iscplx,\n    cvx_optpnt.x = cvx_r2c( cvx_optpnt.x, dim );\nend\n\ncvx_optpnt = cvxtuple( cvx_optpnt );\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/semidefinite.m",
    "content": "function cvx_optpnt = semidefinite( sz, iscplx ) %#ok\n\n%SEMIDEFINITE   Real symmetric positive semidefinite matrices.\n%    SEMIDEFINITE(N), where N is an integer, creates a symmetric matrix\n%    variable of size [N,N] and constrains it to be positive semidefinite.\n%    Therefore, given the declaration\n%       variable x(n,n) symmetric\n%    the constraint\n%       x == semidefinite(n)\n%    is equivalent to\n%       lambda_min(x) >= 0;\n%    In fact, lambda_min is implemented in CVX using SEMIDEFINITE for\n%    real matrices.\n%\n%    SEMIDEFINITE(SX), where SX is a valid size vector, creates an array\n%    variable of size SX and constrains each subarray along the leading two\n%    dimensions to be positive semidefinite. SX(1) and SX(2) must be equal.\n%    Therefore, given the declaration\n%       variable x(sx) symmetric\n%    the constraint\n%       x == semidefinite(sx)\n%    is equivalent to\n%       for k = 1:prod(sx(3:end)),\n%          lambda_min(x(:,:,k)) >= 0;\n%       end\n%\n%    SEMIDEFINITE(N,CPLX) and SEMIDEFINITE(SX,CPLX) create real semidefinite\n%    sets if CPLX is FALSE, and complex Hermitian semidefinite sets if CPLX\n%    is TRUE. The latter case is equivalent to calling the function\n%    HERMITIAN_SEMIDEFINITE.\n%\n%   Disciplined convex programming information:\n%       SEMIDEFINITE is a cvx set specification. See the user guide for\n%       details on how to use sets.\n\n%\n% Check size vector\n%\n\nnarginchk(1,2);\nif ~isnumeric( sz ) || isempty( sz ) || any( sz < 0 ) || any( sz ~= floor( sz ) ),\n    error( 'First argument must be a nonnegative integer or a valid size vector.' );\nelseif length( sz ) == 1,\n    sz = [ sz, sz ];\nelseif sz( 1 ) ~= sz( 2 ),\n    error( 'If a size vector is supplied, the first two dimensions must be equal.' );\nend\n\n%\n% Check iscplx flag\n%\n\nif nargin < 2,\n    iscplx = false;\nelseif ( ~isnumeric( iscplx ) && ~islogical( iscplx ) ) || length( iscplx ) ~= 1,\n    error( 'Second argument must be a numeric or logical scalar.' );\nend\n\n%\n% Construct the cone\n%\n\ncvx_begin set\n   if any( sz == 0 ) || sz(1) == 1,\n       variable x( sz )\n       s = 'nonnegative';\n   elseif iscplx,\n       variable x( sz ) hermitian\n       s = 'hermitian-semidefinite';\n   else\n       variable x( sz ) symmetric\n       s = 'semidefinite';\n   end\n   if all( sz ),\n       tx = find( any( cvx_basis( x ), 2 ) );\n       nv = prod( sz( 3 : end ) );\n       tx = reshape( tx, numel( tx ) / nv, nv );\n       newnonl( cvx_problem, s, tx );\n       if sz(1) > 1,\n           if iscplx,\n               ndxs = cumsum( [ 1, 2*sz(1)-1 : -2 : 3 ] );\n           else\n               ndxs = cumsum( [ 1, sz(1) : -1 : 2 ] );\n           end\n           tx( ndxs, : ) = [];\n           cvx___.canslack( tx ) = false;\n       end\n   end\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/sets/simplex.m",
    "content": "function cvx_optpnt = simplex( sx, dim ) %#ok\n\n%SIMPLEX   The unit simplex.\n%    SIMPLEX(N), where N is a positive integer, creates a column vector\n%    variable of length N whose elements are constrained to be nonnegative\n%    and whose sum is constrained to be one. That is, given the declaration\n%        variable x(n)\n%    the constraint\n%        x == simplex(n)\n%    is equivalent to\n%        x >= 0;\n%        sum(x) == 1;\n%\n%    SIMPLEX(SX,DIM), where SX is a valid non-empty size vector, creates a\n%    CVX array variable of size SX and DIM is a positive integer, creates\n%    a CVX array of size SX and applies the simplex constraint along the\n%    dimension DIM. That is, given the declaration\n%        variable x(sx)\n%    the constraint\n%        x == simplex(sx,dim)\n%    is equivalent to\n%        x >= 0;\n%        sum(sx,dim) == 1;\n%    If DIM is not supplied, then the first non-singleton dimension of SX\n%    will be chosen.\n%\n%   Disciplined convex programming information:\n%       SIMPLEX is a cvx set specification. See the user guide for\n%       details on how to use sets.\n\n%\n% Check size vector\n%\n\nnarginchk(1,2);\n[ temp, sx ] = cvx_check_dimlist( sx, false );\nif ~temp,\n    error( 'First argument must be a dimension vector.' );\nend\nnd = length( sx );\n\n%\n% Check dimension\n%\n\nif nargin < 2 || isempty( dim ),\n    dim = [ find( sx > 1 ), 1 ];\n    dim = dim( 1 );\nelseif ~isnumeric( dim ) || dim < 0 || dim ~= floor( dim ),\n    error( 'Second argument must be a dimension.' );\nelseif dim > nd,\n    sx( end + 1 : dim ) = 1; %#ok\n    nd = dim; %#ok\nend\n\n%\n% Construct set\n%\n\ncvx_begin set\n   variables x( sx )\n   sum( x, dim ) == 1; %#ok\n   x >= 0; %#ok\ncvx_end\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/shims/cvx_glpk.m",
    "content": "function shim = cvx_glpk( shim )\n\n% CVX_SOLVER_SHIM\tGLPK interface for CVX.\n%   This procedure returns a 'shim': a structure containing the necessary\n%   information CVX needs to use this solver in its modeling framework.\n\nif ~isempty( shim.solve ),\n    return\nend\nif isempty( shim.name ),\n    fname = 'glpk.m';\n    ps = pathsep;\n    shim.name = 'GLPK';\n    shim.dualize = true;\n    flen = length(fname);\n    fpaths = which( fname, '-all' );\n    if ~iscell(fpaths),\n      fpaths = { fpaths };\n    end\n    old_dir = pwd;\n    oshim = shim;\n    shim = [];\n    for k = 1 : length(fpaths),\n        fpath = fpaths{k};\n        if ~exist( fpath, 'file' ) || any( strcmp( fpath, fpaths(1:k-1) ) ),\n            continue\n        end\n        new_dir = fpath(1:end-flen-1);\n        cd( new_dir );\n        tshim = oshim;\n        tshim.fullpath = fpath;\n        tshim.version = 'unknown';\n        tshim.location = new_dir;\n        if isempty( tshim.error ),\n            tshim.check = @check;\n            tshim.solve = @solve;\n            tshim.eargs = {};\n            if k ~= 1,\n                tshim.path = [ new_dir, ps ];\n            end\n        end\n        shim = [ shim, tshim ]; %#ok\n    end\n    cd( old_dir );\n    if isempty( shim ),\n        shim = oshim;\n        shim.error = 'Could not find a GLPK installation.';\n    end\nelse\n    shim.check = @check;\n    shim.solve = @solve;\nend\n    \nfunction found_bad = check( nonls ) %#ok\nfound_bad = false;\n\nfunction [ x, status, tol, iters, y, z ] = solve( At, b, c, nonls, quiet, prec, settings )\n\nn  = length( c );\nm  = length( b );\nlb = -Inf(n,1);\nub = +Inf(n,1);\nvtype = 'C';\nvtype = vtype(ones(n,1));\nctype = 'S';\nctype = ctype(ones(m,1));\nrr = zeros(0,1);\ncc = rr; \nvv = rr;\nzinv = rr;\nis_ip = false;\nfor k = 1 : length( nonls ),\n    temp = nonls( k ).indices;\n    nn = size( temp, 1 );\n    nv = size( temp, 2 );\n    tt = nonls( k ).type;\n    if strncmp( tt, 'i_', 2 ),\n      is_ip = true;\n      vartype(temp) = 'I';\n      if strcmp(tt,'i_binary'),\n        lb(temp) = 0;\n        ub(temp) = 1;\n      end\n    elseif nn == 1 || isequal( tt, 'nonnegative' ),\n        lb(temp) = 0;\n    elseif isequal( tt, 'lorentz' ),\n        if nn == 2,\n            rr2  = [ temp ; temp ];\n            cc2  = reshape( floor( 1 : 0.5 : 2 * nv + 0.5 ), 4, nv );\n            vv2  = [1;1;-1;1]; vv = vv(:,ones(1,nv));\n            rr   = [ rr ; rr(:) ];\n            cc   = [ cc ; cc(:) ];\n            vv   = [ vv ; vv(:) ];\n            zinv = [ zinv ; temp(:) ];\n        else\n            error('GLPK does not support nonlinear constraints.' );\n        end\n    else\n      error('GLPK does not support nonlinear constraints.' );\n    end\nend\nif ~isempty(rr),\n  znorm = [1:n]';\n  znorm(zinv) = [];\n  rr = [ rr ; znorm ];\n  cc = [ cc ; znorm ];\n  vv = [ vv ; ones(size(znorm)) ];\n  reord = sparse( rr, cc, vv, n, n );\n  At = reord' * At;\n  c  = reord' * c;\nend\nif quiet,\n  param.msglev = 0;\nelse\n  param.msglev = 2;\nend\nparam.scale = 128;\nparam.tolbnd = prec(1);\nparam.toldj = prec(1);\nparam.tolobj = prec(1);\n[ xx, fmin, errnum, extra ] = cvx_run_solver( @glpk, c, At', b, lb, ub, ctype, vtype, 1, param, 'xx', 'fmin', 'errnum', 'extra', settings, 9 );\ntol   = [];\niters = [];\nx = full( xx );\ny = full( extra.lambda );\nz = full( extra.redcosts );\nif ~isempty( rr ),\n  x = reord * x;\n  z = reord * z;\n  z(zinv) = z(zinv) * 0.5;\nend\nstatus = 'Failed';\nswitch errnum,\ncase 0,\n  switch extra.status,\n  case 2,\n    if is_ip,\n      status = 'Suboptimal';\n    elseif errnumn == 0,\n      status = 'Solved';\n    else\n      status = 'Inaccurate/Solved';\n    end  \n  case {3,4},\n    status = 'Infeasible';\n  case 5,\n    status = 'Solved';\n  case 6,\n    status = 'Unbounded';\n  end\ncase 10,\n  status = 'Infeasible';\ncase 11,\n  status = 'Unbounded';\ncase {5,17,15,19}\n  status = 'Failed';\ncase {6,7,8,9,13,14},\n  switch extra.status,\n  case {2,5}\n    if is_ip,\n      status = 'Suboptimal';\n    else\n      status = 'Inaccurate/Solved';\n    end  \n  case { 3,4 },\n    status = 'Inaccurate/Infeasible';\n  case 6,\n    status = 'Inaccurate/Unbounded';\n  end\nend\nif strcmp(status,'Failed'),\n  tol = Inf;\nelseif strncmp(status,'Inaccurate/',11),\n  tol = prec(3);\nelse\n  tol = prec(2);\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/shims/cvx_sdpt3.m",
    "content": "function shim = cvx_sdpt3( shim )\n\n% CVX_SOLVER_SHIM\tSDPT3 interface for CVX.\n%   This procedure returns a 'shim': a structure containing the necessary\n%   information CVX needs to use this solver in its modeling framework.\n\nglobal cvx___\nif ~isempty( shim.solve ),\n    return\nend\nif isempty( shim.name ),\n    fname = 'sdpt3.m';\n    ps = cvx___.ps;\n    fs = cvx___.fs;\n    int_path = [ cvx___.where, fs ];\n    int_plen = length( int_path );\n    shim.name = 'SDPT3';\n    shim.dualize = true;\n    flen = length(fname);\n    fpaths = { [ int_path, 'sdpt3', fs, fname ] };\n    fpaths = [ fpaths ; which( fname, '-all' ) ];\n    old_dir = pwd;\n    oshim = shim;\n    shim = [];\n    for k = 1 : length(fpaths),\n        fpath = fpaths{k};\n        if ~exist( fpath, 'file' ) || any( strcmp( fpath, fpaths(1:k-1) ) ),\n            continue\n        end\n        new_dir = fpath(1:end-flen-1);\n        cd( new_dir );\n        tshim = oshim;\n        tshim.fullpath = fpath;\n        tshim.version = 'unknown';\n        is_internal = strncmp( new_dir, int_path, int_plen );\n        if is_internal,\n            tshim.location = [ '{cvx}', new_dir(int_plen:end) ];\n        else\n            tshim.location = new_dir;\n        end\n        try\n            fid = fopen(fname);\n            otp = fread(fid,Inf,'uint8=>char')';\n            fclose(fid);\n        catch errmsg\n            tshim.error = sprintf( 'Unexpected error:\\n%s\\n', errmsg.message );\n        end\n        if isempty( tshim.error ),\n            otp = regexp( otp, 'SDPT3: version \\d+\\.\\d+', 'match' );\n            if ~isempty(otp), tshim.version = otp{1}(16:end); end\n            if k ~= 2,\n                tpath = { new_dir, [ new_dir, fs, 'Solver' ], [ new_dir, fs, 'HSDSolver' ], [ new_dir, fs, 'Solver', fs, 'Mexfun' ] };\n                if ~isempty(cvx___.msub) && exist( [ tpath{end}, fs, cvx___.msub ], 'dir' ),\n                    tpath{end} = [ tpath{end}, fs, cvx___.msub ];\n                end\n                tpath = sprintf( [ '%s', ps ], tpath{:} ) ;\n                tshim.path = tpath;\n            end\n            tshim.check = @check;\n            tshim.solve = @solve;\n            tshim.eargs = {};\n        end\n        shim = [ shim, tshim ]; %#ok\n    end\n    cd( old_dir );\n    if isempty( shim ),\n        shim = oshim;\n        shim.error = 'Could not find a SDPT3 installation.';\n    end\nelse\n    shim.check = @check;\n    shim.solve = @solve;\n    shim.eargs = {};\nend\n\nfunction found_bad = check( nonls ) %#ok\nfound_bad = false;\n\nfunction [ x, status, tol, iters, y, z ] = solve( At, b, c, nonls, quiet, prec, settings )\n[n,m] = size(At);\n\n% SDPT3 cannot handle empty equality constraints or square systems. So\n% add an extra row or column, as needed, to rectify this problem.\n\nmzero = m == 0 | isempty( nonls ) | m == n;\nif mzero,    \n    n = n + 1;\n    c = [ c ; 0 ];\n    if m == 0,\n        azero = true;\n        At = sparse( n, 1, 1 );\n        b  = 1;\n        m  = 1;\n    elseif m + 1 < n,\n        azero = true;\n        At(end+1,end+1) = 1;\n        b(end+1) = 1;\n        m = m + 1;\n    else\n        At(end+1,end) = 0;\n        azero = false;\n    end\n    nonls(end+1).type = 'nonnegative';\n    nonls(end).indices = n;\nelse\n    azero = false;\nend\n\ntypes = { nonls.type };\nindices = { nonls.indices };\nfound = false(1,length(types));\nused = false(1,n);\n\nblk  = cell( 0, 2 );\nAvec = cell( 0, 1 );\nCvec = cell( 0, 1 );\nxvec = cell( 0, 1 );\ntvec = cell( 0, 1 );\nif nargout > 3,\n    need_z = true;\n    zvec = cell( 0, 1 );\nelse\n    need_z = false;\nend\n\n%\n% Reject integer variables\n%\n\nif any( strncmp( types, 'i_', 2 ) ),\n    error( 'SDTP3 does not support integer variables.' );\nend\n\n%\n% Nonnegative variables preserved as-is\n%\n\ntt = find( strcmp( types, 'nonnegative' ) );\nif ~isempty( tt ),\n    for k = tt,\n        ti = indices{k};\n        indices{k} = reshape(ti,1,numel(ti));\n    end\n    ti = cat( 2, indices{tt} );\n    ni = length(ti);\n    blk {end+1,1} = 'l';\n    blk {end,  2} = ni;\n    Avec{end+1,1} = At(ti,:);\n    Cvec{end+1,1} = c(ti);\n    tvec{end+1,1} = ti;\n    xvec{end+1,1} = 1;\n    if need_z,\n        zvec{end+1,1} = 1;\n    end\n    found(tt) = true;\n    used(ti) = true;\nend\n\n%\n% SDTP3 places the epigraph variable of an SOC { (x,y) | ||x||<=y }\n% at the beginning of the vector; CVX places it at the end. So we must \n% reverse our ordering here.\n%\n\ntt = find( strcmp( types, 'lorentz' ) );\nif ~isempty( tt ),\n    blk{end+1,1} = 'q';\n    blk{end,2}   = zeros(1,0);\n    for k = tt,\n        ti = indices{k};\n        ti = ti([end,1:end-1],:);\n        blk{end,2} = [ blk{end,2}, size(ti,1) * ones(1,size(ti,2)) ];\n        indices{k} = reshape(ti,1,numel(ti));\n    end\n    ti = cat( 2, indices{tt} );\n    Avec{end+1,1} = At(ti,:);\n    Cvec{end+1,1} = c(ti);\n    tvec{end+1,1} = ti;\n    xvec{end+1,1} = 1;\n    if need_z,\n        zvec{end+1,1} = 1;\n    end\n    found(tt) = true;\n    used(ti) = true;\nend\n\ntt = find( strcmp( types, 'semidefinite' ) | strcmp( types, 'hermitian-semidefinite' ) );\nif ~isempty( tt ),\n    blk{end+1,1}  = 's';\n    blk{end,2}    = {};\n    Avec{end+1,1} = {};\n    Cvec{end+1,1} = {};\n    tvec{end+1,1} = {};\n    xvec{end+1,1} = {};\n    if need_z,\n        zvec{end+1,1} = {};\n    end\n    nnn = 0;\n    for k = tt,\n        ti = indices{k};\n        [nt,nv] = size(ti);\n        if types{k}(1) == 's',\n            nn = 0.5*(sqrt(8*nt+1)-1);\n        else\n            nn = 2*sqrt(nt);\n        end\n        nnn = nnn + nn*nv;\n    end\n    for k = tt,\n        ti = indices{k};\n        [nt,nv] = size(ti);\n        if types{k}(1) == 's',\n            nn = 0.5 * ( sqrt(8*nt+1) - 1 );\n            nt2 = nt;\n            n2 = nn;\n        else\n            nn = sqrt(nt);\n            n2 = 2 * nn;\n            nt2 = 0.5 * n2 * ( n2 + 1 );\n        end\n        blk{end,2}{end+1} = n2 * ones(1,nv);\n        tvec{end}{end+1} = ti(:);\n        \n        if types{k}(1) == 's',\n            \n            %\n            % CVX stores symmetric matrix variables in packed lower triangle\n            % form; and str_1 is the adjoint of the mapping from packed form to\n            % unpacked form. That is, if x is an n(n+1)/2 by 1 vector, then\n            % str_1' * x is the n x n symmetric matrix. To preserve inner\n            % products we need the inverse operator as well:\n            % <a,x> = <a,str_2'*str_1'*x> = <str_2*a,str_1'*x>\n            %\n\n            str_1 = cvx_create_structure( [nn,nn], 'symmetric' );\n            \n        else\n            \n            %\n            % SDPT3 does not do complex SDP natively. To convert to real SDPs\n            % there are two approaches;\n            %   X >= 0 <==> [ real(X), -imag(X) ; imag(X), real(X) ] >= 0\n            %   X >= 0 <==> exists [ Y1, Y2^T ; Y2, Y3 ] >= 0 s.t.\n            %                        Y1 + Y3 == real(X), Y2 - Y2^T == imag(X)\n            % For primal standard form, this second form is the best choice,\n            % and what we end up using here.\n            %\n        \n            str_1 = cvx_create_structure( [nn,nn], 'hermitian' );\n            [rr,cr,vr] = find(real(str_1));\n            cr = cr + floor((cr-1)/nn)*nn;\n            [ri,ci,vi] = find(imag(str_1));\n            ci = ci + floor((ci-1)/nn)*nn;\n            str_1 = sparse( [rr;ri;ri;rr], [cr;ci+nn;ci+n2*nn;cr+nn*(n2+1)], [vr;vi;-vi;vr], nt, n2^2 );\n            \n        end\n        str_2 = cvx_invert_structure( str_1 );\n        \n        %\n        % SDPT3, on the other hand, stores symmetric matrix variables in\n        % packed upper triangle format, with off-diagonal elements scaled \n        % by sqrt(2) to preserve inner products. The operator is unitary:\n        % <str_2*a,str_1'*x> = <str_3*str_2*a,str_3*str_1'*x>\n        %\n        \n        str_3 = sqrt(0.5) * ones(nt2,1); str_3(cumsum(1:n2)) = 1;\n        str_3 = spdiags( str_3, 0, nt2, nt2 ) * cvx_s_symmetric_ut( n2, n2, true );\n        Avec{end}{end+1} = reshape( ( str_3 * str_2 ) * reshape( At(ti,:), nt, nv * m ), nt2 * nv, m );\n        \n        %\n        % SDPT3 expects C to be in the form of a symmetric matrix, so we\n        % only need to do half the work.\n        % <c,x> == <str_2*c,str_1'*x>\n        %\n        \n        cc = reshape( str_2 * reshape( c(ti,:), nt, nv ), n2, n2 * nv );\n        if nv > 1,\n            % For multiple matrices, SDPT3 expects the blocks to be stacked\n            % along the diagonal, but our calculation above stacks them into\n            % a single row. A simple row offset fixes this.\n            [ rr, cc, vv ] = find( cc );\n            cc = sparse( rr + floor((cc-1)/n2)*n2, cc, vv, n2 * nv, n2 * nv );\n        end\n        Cvec{end}{end+1} = cc;\n        \n        %\n        % SDPT3 presents X in symmetric form. We must extract the lower\n        % triangle for CVX. No scaling is needed. For multiple blocks we\n        % must add row offsets to handle the block diagonal form.\n        %\n        \n        [ rr, cc, vv ] = find( str_2' );\n        cc = cc + floor((cc-1)/n2)*(nnn-n2);\n        if nv > 1,\n            ov = ones(1,nv); sv = 0:nv-1;\n            or = ones(length(rr),1);\n            rr = rr(:,ov) + or*(sv*nt);\n            cc = cc(:,ov) + or*(sv*(n2*(nnn+1)));\n            vv = vv(:,ov);\n        end\n        xvec{end}{end+1} = sparse( cc, rr, vv, n2*nv*(nnn+1), nt*nv );\n        if need_z,\n            [ rr, cc, vv ] = find( str_1 );\n            cc = cc + floor((cc-1)/n2)*(nnn-n2);\n            if nv > 1,\n                ov = ones(1,nv); sv = 0:nv-1;\n                or = ones(length(rr),1);\n                rr = rr(:,ov) + or*(sv*nt);\n                cc = cc(:,ov) + or*(sv*(n2*(nnn+1)));\n                vv = vv(:,ov);\n            end\n            zvec{end}{end+1} = sparse( cc, rr, vv, n2*nv*(nnn+1), nt*nv );\n        end\n        used(ti) = true;\n    end\n    blk{end,2} = horzcat( blk{end,2}{:} );\n    Avec{end}  = vertcat( Avec{end}{:} );\n    Cvec{end}  = cvx_blkdiag( Cvec{end}{:} );\n    tvec{end}  = vertcat( tvec{end}{:} );\n    xvec{end}  = cvx_blkdiag( xvec{end}{:} );\n    xvec{end}(nnn*nnn+1:end,:) = [];\n    if need_z,\n        zvec{end} = cvx_blkdiag( zvec{end}{:} );\n        zvec{end}(nnn*nnn+1:end,:) = [];\n    end\n    found(tt)  = true;\nend\n\nti = find(~found);\nif ~isempty(ti),\n    types = unique( types(ti) );\n    types = sprintf( ' %s', types{:} );\n    error( 'One or more unsupported nonlinearities detected: %s', types );\nend\n\nti = find(~used);\nif ~isempty(ti),\n    ni = numel(ti);\n    ti = reshape( ti, 1, ni );\n    blk {end+1,1} = 'u';\n    blk {end,  2} = ni;\n    Avec{end+1,1} = At(ti,:);\n    Cvec{end+1,1} = c(ti);\n    tvec{end+1,1} = ti;\n    xvec{end+1,1} = 1;\n    if need_z,\n        zvec{end+1,1} = 1;\n    end\n    % found(tt) = true;\n    % used(ti) = true;\nend\n\n%\n% Call SDPT3\n%\n\nb = full(b);\nOPTIONS = sqlparameters;\nOPTIONS.gaptol = prec(1);\nOPTIONS.printlevel = 3 * ~quiet;\nwarn_save = warning;\n[ obj, xx, y, zz, info ] = cvx_run_solver( @sqlp, blk, Avec, Cvec, b, OPTIONS, 'obj', 'x', 'y', 'z', 'info', settings, 5 ); %#ok\nwarning( warn_save );\ntol = max( [ info.relgap, info.pinfeas, info.dinfeas ] );\nif ~quiet, disp(' '); end\n\n%\n% Interpret status codes\n%\n\nx_good = true;\ny_good = true;\nswitch info.termcode,\n    case 0, \n        status = 'Solved';\n        tol = min( prec(2), tol );\n    case 1,\n        status = 'Infeasible';\n        x_good = false;\n        tol = min( info.dinfeas, prec(2) );\n    case 2,\n        status = 'Unbounded';\n        y_good = false;\n        tol = min( info.pinfeas, prec(2) );\n    otherwise,\n        if isnan(tol),\n            tol = Inf;\n            status = 'Failed';\n        elseif tol > prec(3),\n            status = 'Failed';\n        elseif tol <= prec(2),\n            status = 'Solved';\n            info.termcode = 0;\n        else\n            status = 'Inaccurate/Solved';\n            info.termcode = 0;\n        end\nend\n\n% Primal point\n\nif x_good,\n    x = zeros(1,n);\n    for k = 1 : length(xx),\n        x(1,tvec{k}) = x(1,tvec{k}) + xx{k}(:)' * xvec{k};\n    end\nend\nif x_good && all(isfinite(x)),\n    x = full( x )';\nelse\n    x = NaN * ones(n,1);\nend\nif mzero,\n    x(end) = [];\nend\n\n% Lagrange multipliers\n\nif y_good,\n    y = full(y);\nend\nif ~y_good || ~all(isfinite(y)),\n    y = NaN * ones(m,1);\nend\nif azero,\n    y(end,:) = [];\nend\n\n% Iteration count\n\niters = info.iter;\n\n% Dual cone\n\nif need_z,\n    if y_good,\n        z = zeros(1,n);\n        for k = 1 : length(zz),\n            z(1,tvec{k}) = z(1,tvec{k}) + zz{k}(:)' * zvec{k};\n        end\n    end\n    if y_good && all(isfinite(z)),\n        z = full( z )';\n    else\n        z = NaN * ones(n,1);\n    end\n    if mzero,\n        z(end) = [];\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/shims/cvx_sedumi.m",
    "content": "function shim = cvx_sedumi( shim )\n\n% CVX_SOLVER_SHIM\tSeDuMi interface for CVX.\n%   This procedure returns a 'shim': a structure containing the necessary\n%   information CVX needs to use this solver in its modeling framework.\n\nglobal cvx___\nif ~isempty( shim.solve ),\n    return\nend\nif isempty( shim.name ),\n    fname = 'sedumi.m';\n    fs = cvx___.fs;\n    ps = cvx___.ps;\n    int_path = [ cvx___.where, fs ];\n    int_plen = length( int_path );\n    shim.name = 'SeDuMi';\n    shim.dualize = true;\n    flen = length(fname);\n    fpaths = { [ int_path, 'sedumi', fs, fname ] };\n    fpaths = [ fpaths ; which( fname, '-all' ) ];\n    old_dir = pwd;\n    oshim = shim;\n    shim = [];\n    for k = 1 : length(fpaths),\n        fpath = fpaths{k};\n        if ~exist( fpath, 'file' ) || any( strcmp( fpath, fpaths(1:k-1) ) ),\n            continue\n        end\n        new_dir = fpath(1:end-flen-1);\n        cd( new_dir );\n        tshim = oshim;\n        tshim.fullpath = fpath;\n        tshim.version = 'unknown';\n        is_internal = strncmp( new_dir, int_path, int_plen );\n        if is_internal,\n            tshim.location = [ '{cvx}', new_dir(int_plen:end) ];\n        else\n            tshim.location = new_dir;\n        end\n        try\n            fid = fopen(fname);\n            otp = fread(fid,Inf,'uint8=>char')';\n            fclose(fid);\n        catch errmsg\n            tshim.error = sprintf( 'Unexpected error:\\n%s\\n', errmsg.message );\n        end\n        if isempty( tshim.error ),\n            otp = regexp( otp, 'SeDuMi \\d\\S+', 'match' );\n            if ~isempty(otp), tshim.version = otp{end}(8:end); end\n            vnum = str2double( tshim.version );\n            tshim.check = @check;\n            tshim.solve = @solve;\n            tshim.eargs = { vnum >= 1.3 && vnum < 1.32 };\n            if k ~= 2,\n                tshim.path = [ new_dir, ps ];\n                if ~isempty(cvx___.msub) && exist([new_dir,fs,cvx___.msub],'dir'),\n                   tshim.path = [ new_dir, fs, cvx___.msub, ps, tshim.path ];\n                end\n            end\n        end\n        shim = [ shim, tshim ]; %#ok\n    end\n    cd( old_dir );\n    if isempty( shim ),\n        shim = oshim;\n        shim.error = 'Could not find a SeDuMi installation.';\n    end\nelse\n    shim.check = @check;\n    shim.solve = @solve;\n    vnum = str2double( shim.version );\n    shim.eargs = { vnum >= 1.3 && vnum < 1.32 };\nend\n    \nfunction found_bad = check( nonls ) %#ok\nfound_bad = false;\n\nfunction [ x, status, tol, iters, y, z ] = solve( At, b, c, nonls, quiet, prec, settings, nocplx )\n\nn = length( c );\nm = length( b );\nK = struct( 'f', 0, 'l', 0, 'q', [], 'r', [], 's', [], 'scomplex', [], 'ycomplex', [] );\nreord = struct( 'n', 0, 'r', [], 'c', [], 'v', [] );\nreord = struct( 'f', reord, 'l', reord, 'a', reord, 'q', reord, 'r', reord, 's', reord, 'h', reord );\nreord.f.n = n;\nzinv = [];\nfor k = 1 : length( nonls ),\n    temp = nonls( k ).indices;\n    nn = size( temp, 1 );\n    nv = size( temp, 2 );\n    nnv = nn * nv;\n    tt = nonls( k ).type;\n    reord.f.n = reord.f.n - nnv;\n    if strncmp( tt, 'i_', 2 ),\n        error( 'SeDuMi does not support integer variables.' );\n    elseif nn == 1 || isequal( tt, 'nonnegative' ),\n        reord.l.r = [ reord.l.r ; temp(:) ];\n        reord.l.c = [ reord.l.c ; reord.l.n + ( 1 : nnv )' ];\n        reord.l.v = [ reord.l.v ; ones( nnv, 1 ) ];\n        reord.l.n = reord.l.n + nnv;\n    elseif isequal( tt, 'lorentz' ),\n        if nn == 2,\n            rr = [ temp ; temp ];\n            cc = reshape( floor( 1 : 0.5 : 2 * nv + 0.5 ), 4, nv );\n            vv = [1;1;-1;1]; vv = vv(:,ones(1,nv));\n            reord.a.r = [ reord.a.r ; rr(:) ];\n            reord.a.c = [ reord.a.c ; cc(:) + reord.a.n ];\n            reord.a.v = [ reord.a.v ; vv(:) ];\n            reord.a.n = reord.a.n + nnv;\n            zinv = [ zinv ; temp(:) ]; %#ok\n        else\n            temp = temp( [ end, 1 : end - 1 ], : );\n            reord.q.r = [ reord.q.r ; temp(:) ];\n            reord.q.c = [ reord.q.c ; reord.q.n + ( 1 : nnv )' ];\n            reord.q.v = [ reord.q.v ; ones(nnv,1) ];\n            reord.q.n = reord.q.n + nnv;\n            K.q = [ K.q, nn * ones( 1, nv ) ];\n        end\n    elseif isequal( tt, 'semidefinite' ),\n        if nn == 3,\n            temp = temp( [1,3,2], : );\n            tempv = [sqrt(2);sqrt(2);1] * ones(1,nv);\n            reord.r.r = [ reord.r.r ; temp(:) ];\n            reord.r.c = [ reord.r.c ; reord.r.n + ( 1 : nnv )' ];\n            reord.r.v = [ reord.r.v ; tempv(:) ];\n            reord.r.n = reord.r.n + nnv;\n            K.r = [ K.r, 3 * ones( 1, nv ) ];\n            temp = temp(1:2,:);\n            zinv = [ zinv ; temp(:) ]; %#ok\n        else\n            nn = 0.5 * ( sqrt( 8 * nn + 1 ) - 1 );\n            str = cvx_create_structure( [ nn, nn, nv ], 'symmetric' );\n            K.s = [ K.s, nn * ones( 1, nv ) ];\n            [ cc, rr, vv ] = find( cvx_invert_structure( str, 'compact' ) );\n            rr = temp( rr );\n            reord.s.r = [ reord.s.r; rr( : ) ];\n            reord.s.c = [ reord.s.c; cc( : ) + reord.s.n ];\n            reord.s.v = [ reord.s.v; vv( : ) ];\n            reord.s.n = reord.s.n + nn * nn * nv;\n            reord.s.z = reord.s.v;\n        end\n    elseif isequal( tt, 'hermitian-semidefinite' ),\n        if nn == 4,\n            temp = temp( [1,4,2,3], : );\n            tempv = [sqrt(2);sqrt(2);1;1] * ones(1,nv);\n            reord.r.r = [ reord.r.r ; temp(:) ];\n            reord.r.c = [ reord.r.c ; reord.r.n + ( 1 : nnv )' ];\n            reord.r.v = [ reord.r.v ; tempv(:) ];\n            reord.r.n = reord.r.n + nnv;\n            reord.r.z = reord.r.v;\n            K.r = [ K.r, 4 * ones( 1, nv ) ];\n            temp = temp(1:2,:);\n            zinv = [ zinv ; temp(:) ]; %#ok\n        elseif nocplx,\n            % SeDuMi's complex SDP support was broken with the 1.3 update. So\n            % we must use the following complex-to-real SDP conversion to work\n            % around it, at a modest cost of problem size.\n            %   X >= 0 <==> exists [ Y1, Y2^T ; Y2, Y3 ] >= 0 s.t.\n            %               Y1 + Y3 == real(X), Y2 - Y2^T == imag(X)\n            nsq = nn; nn = sqrt( nn );\n            str = cvx_create_structure( [ nn, nn, nv ], 'hermitian' );\n            [ cc, rr, vv ] = find( cvx_invert_structure( str, 'compact' ) );\n            cc = cc - 1;\n            mm = floor( cc / nsq );\n            cc = cc - mm * nsq;\n            jj = floor( cc / nn );\n            ii = cc - jj * nn + 1;\n            jj = jj + 1;\n            mm = mm + 1;\n            vr = real( vv );\n            vi = imag( vv );\n            ii = [ ii + nn * ~vr ; ii + nn * ~vi ];\n            jj = [ jj ; jj + nn ]; %#ok\n            vv = sqrt( 0.5 ) * [ vr + vi ; vr - vi ];\n            rr = [ rr ; rr ]; %#ok\n            mm = [ mm ; mm ]; %#ok\n            [ jj, ii ] = deal( min( ii, jj ), max( ii, jj ) );\n            cc = ii + ( jj - 1 ) * ( 2 * nn ) + ( mm - 1 ) * ( 4 * nsq );\n            K.s = [ K.s, 2 * nn * ones( 1, nv ) ];\n            rr = temp( rr );\n            reord.s.r = [ reord.s.r; rr( : ) ];\n            reord.s.c = [ reord.s.c; cc( : ) + reord.s.n ];\n            reord.s.v = [ reord.s.v; vv( : ) ];\n            reord.s.n = reord.s.n + 4 * nsq * nv;\n            reord.s.z = reord.s.v;\n        else\n            % SeDuMi's complex SDP support was restored in v1.33.\n            K.scomplex = [ K.scomplex, length( K.s ) + ( 1 : nv ) ];\n            nn = sqrt( nn );\n            str = cvx_create_structure( [ nn, nn, nv ], 'hermitian' );\n            K.s = [ K.s, nn * ones( 1, nv ) ];\n            stri = cvx_invert_structure( str, 'compact' )';\n            [ rr, cc, vv ] = find( stri );\n            rr = temp( rr );\n            reord.s.r = [ reord.s.r; rr( : ) ];\n            reord.s.c = [ reord.s.c; cc( : ) + reord.s.n ];\n            reord.s.v = [ reord.s.v; vv( : ) ];\n            reord.s.n = reord.s.n + size( stri, 2 );\n            reord.s.z = reord.s.v;\n        end\n    else\n        error( 'Unsupported nonlinearity: %s', tt );\n    end\nend\nif reord.f.n > 0,\n    reord.f.r = ( 1 : n )';\n    reord.f.r( [ reord.l.r ; reord.a.r ; reord.q.r ; reord.r.r ; reord.s.r ] ) = [];\n    reord.f.c = ( 1 : reord.f.n )';\n    reord.f.v = ones(reord.f.n,1);\nend\nn_d = max( m - n - reord.f.n + 1, isempty( At ) );\nif n_d,\n    reord.l.n = reord.l.n + n_d;\nend\nK.f = reord.f.n;\nK.l = reord.l.n + reord.a.n;\nn_out = reord.f.n;\nreord.l.c = reord.l.c + n_out; n_out = n_out + reord.l.n;\nreord.a.c = reord.a.c + n_out; n_out = n_out + reord.a.n;\nreord.q.c = reord.q.c + n_out; n_out = n_out + reord.q.n;\nreord.r.c = reord.r.c + n_out; n_out = n_out + reord.r.n;\nreord.s.c = reord.s.c + n_out; n_out = n_out + reord.s.n;\nreord = sparse( ...\n    [ reord.f.r ; reord.l.r ; reord.a.r ; reord.q.r ; reord.r.r ; reord.s.r ], ...\n    [ reord.f.c ; reord.l.c ; reord.a.c ; reord.q.c ; reord.r.c ; reord.s.c ], ...\n    [ reord.f.v ; reord.l.v ; reord.a.v ; reord.q.v ; reord.r.v ; reord.s.v ], ...\n    n, n_out );\n\nAt = reord' * At;\nc  = reord' * c;\npars.free = K.f > 1 && nnz( K.q );\npars.eps     = prec(1);\npars.bigeps  = prec(3);\nif quiet,\n    pars.fid = 0;\nend\nadd_row = isempty( At );\nif add_row,\n    K.f = K.f + 1;\n    At = sparse( 1, 1, 1, n_out + 1, 1 );\n    b = 1;\n    c = [ 0 ; c ];\nend\n[ xx, yy, info ] = cvx_run_solver( @sedumi, At, b, c, K, pars, 'xx', 'yy', 'info', settings, 5 );\nif add_row,\n    xx = xx(2:end);\n    yy = zeros(0,1);\n    At = zeros(n_out,0);\n    % b  = zeros(0,1);\n    c  = c(2:end);\nend\nif ~isfield( info, 'r0' ) && info.pinf,\n    info.r0 = 0;\n    info.iter = 0;\n    info.numerr = 0;\nend\ntol = info.r0;\niters = info.iter;\nxx = full( xx );\nyy = full( yy );\nstatus = '';\nif info.pinf ~= 0,\n    status = 'Infeasible';\n    x = NaN * ones( n, 1 );\n    y = yy;\n    z = - real( reord * ( At * yy ) );\n    if add_row, y = zeros( 0, 1 ); end\nelseif info.dinf ~= 0\n    status = 'Unbounded';\n    y = NaN * ones( m, 1 );\n    z = NaN * ones( n, 1 );\n    x = real( reord * xx );\nelse\n    x = real( reord * xx );\n    y = yy;\n    z = real( reord * ( c - At * yy ) );\n    if add_row, y = zeros( 0, 1 ); end\nend\nif ~isempty(zinv),\n    z(zinv) = z(zinv) * 0.5;\nend\nif info.numerr == 2,\n    status = 'Failed';\n    if any( K.q == 2 ),\n        warning( 'CVX:SeDuMi', cvx_error_format( 'This solver failure may possibly be due to a known bug in the SeDuMi solver. Try switching to SDPT3 by inserting \"cvx_solver sdpt3\" into your model.', ...\n            [66,75], false, '' ) );\n    end\nelse\n    if isempty( status ),\n        status = 'Solved';\n    end\n    if info.numerr == 1 && info.r0 > prec(2),\n        status = [ 'Inaccurate/', status ];\n    end\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/@cvx/structures.m",
    "content": "% CVX: Matrix structure definitions and utilities.\n%    CVX provides a keyword-based method for definiting matrices\n%    with one or more types of structure; e.g.\n%        variable X(n,n) symmetric toeplitz tridiagonal;\n%    CVX automatically computes an efficient basis for the requested\n%    structure. The files in this directory implement those computations.\n%\n%    None of these files should be called directly---matrix structure is\n%    selected in the VARIABLE declaration; see VARIABLE for more details.\n%    Below are the keywords that are available, and the structures they\n%    represent. Keywords can be freely combined (see the above example),\n%    but of course some combinations are degenerate, yielding only the \n%    all-zero matrix; e.g.,\n%       variable X(n,n) \n%\n% Structures:\n%   banded            - (U,L)-banded matrices.\n%   complex           - Complex variables of all sizes.\n%   diagonal          - Diagonal matrices.\n%   hankel            - Hankel matrices.\n%   hermitian         - Complex Hermitian matrices.\n%   lower_bidiagonal  - Lower bidiagonal matrices.\n%   lower_hessenberg  - Lower Hessenberg matrices.\n%   lower_triangular  - Lower triangular matrices.\n%   scaled_identity   - Scaled identity: t*eye(n).\n%   skew_symmetric    - Skew-symmetric matrices.\n%   sparse            - Matrices with a fixed sparsity pattern.\n%   symmetric         - Symmetric matrices.\n%   toeplitz          - Toeplitz matrices.\n%   tridiagonal       - Tridiagional matrices.\n%   upper_bidiagonal  - Upper bidiagonal matrices.\n%   upper_hankel      - Upper Hankel matrices.\n%   upper_hessenberg  - Upper Hessenberg matrices.\n%   upper_triangular  - Upper triangular matrices.\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/Contents.m",
    "content": "% CVX: Matrix structure definitions and utilities.\n%    CVX provides a keyword-based method for definiting matrices\n%    with one or more types of structure; e.g.\n%        variable X(n,n) symmetric toeplitz tridiagonal;\n%    CVX automatically computes an efficient basis for the requested\n%    structure. The files in this directory implement those computations.\n%\n%    None of these files should be called directly---matrix structure is\n%    selected in the VARIABLE declaration; see VARIABLE for more details.\n%    Below are the keywords that are available, and the structures they\n%    represent. Keywords can be freely combined (see the above example),\n%    but of course some combinations are degenerate, yielding only the \n%    all-zero matrix; e.g.,\n%       variable X(n,n) \n%\n% Structures:\n%   banded            - (U,L)-banded matrices.\n%   complex           - Complex variables of all sizes.\n%   diagonal          - Diagonal matrices.\n%   hankel            - Hankel matrices.\n%   hermitian         - Complex Hermitian matrices.\n%   lower_bidiagonal  - Lower bidiagonal matrices.\n%   lower_hessenberg  - Lower Hessenberg matrices.\n%   lower_triangular  - Lower triangular matrices.\n%   scaled_identity   - Scaled identity: t*eye(n).\n%   skew_symmetric    - Skew-symmetric matrices.\n%   sparse            - Matrices with a fixed sparsity pattern.\n%   symmetric         - Symmetric matrices.\n%   toeplitz          - Toeplitz matrices.\n%   tridiagonal       - Tridiagional matrices.\n%   upper_bidiagonal  - Upper bidiagonal matrices.\n%   upper_hankel      - Upper Hankel matrices.\n%   upper_hessenberg  - Upper Hessenberg matrices.\n%   upper_triangular  - Upper triangular matrices.\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_create_structure.m",
    "content": "function [ S, itypes ] = cvx_create_structure( varargin )\n\n%CVX_CREATE_STRUCTURE Construct a basis for a structured matrix.\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Parse the arguments, if needed %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nS = [];\nitypes = {};\nif iscell( varargin{1} ),\n    orig = varargin{1};\n    name = varargin{2};\n    args = varargin{3};\n    nargs = numel( orig );\nelse\n    nargs = nargin;\n    orig = varargin;\n    name = orig;\n    args = cell( 1, nargs );\n    if ischar( varargin{1} ),\n        amin = 1;\n    else\n        args{1} = varargin{1};\n        name{1} = '';\n        varargin{1} = '';\n        amin = 2;\n    end\n    toks = regexp( varargin, '^([a-zA-Z]\\w*)(\\(.*\\))?$', 'tokens' );\n    for k = amin : nargs,\n        tok = toks{k};\n        if isempty( tok ),\n            if k == 1, type = 'Variable'; else type = 'Structure'; end\n            error( sprintf('CVX:Invalid%sSpec',type), 'Invalid %s specification: %s', lower(type), varargin{k} );\n        end\n        tok = tok{1};\n        name{k} = tok{1};\n        if length(tok) > 1 && ~isempty( tok{2} ),\n            try\n                args{k} = evalin( 'caller', [ '{', tok{2}(2:end-1), '};' ] );\n            catch exc\n                error( exc.identifier, exc.message );\n            end\n        else\n            args{k} = {};\n        end\n    end\nend\nif nargs == 1 && nargout > 0,\n    return\nend\nsz = args{1};\nif iscell( sz ),\n    sz = [ sz{:} ];\nend\nsz(end+1:2) = 1;\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Scan the structure strings for symmetry and complex cases. We now handle %\n% these cases specially for improved performance.                          %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nuplo = '';\ndo_semi = 0;\ndo_skew = false;\ndo_conj = false;\ndo_comp = false;\ndo_symm = false;\nis_toep = false;\nis_hank = false;\nsflags  = false(1,nargs);\nbflags  = false(1,nargs);\npflags  = false(1,nargs);\nswitch length(sz),\n    case 0, bands = [1,1];\n    case 1, bands = sz * [1,1];\n    otherwise, bands = sz(1:2);\nend\nfor k = 2 : nargs,\n    amin = 0; amax = 0;\n    nm = lower( name{k} );\n    if ~isempty(uplo),\n        nm = [ uplo, '_', nm ]; %#ok\n        name{k} = nm;\n        orig{k} = [ uplo, '_', orig{k} ];\n        uplo = '';\n    end\n    switch nm,\n        case { 'upper', 'lower', 'skew', },\n            uplo = nm;\n            continue;\n        case 'complex',        \n                              do_comp = true;\n            if do_semi, do_conj = true; end\n        case 'symmetric',\n            sflags(k) = true;                 do_symm = true;\n        case 'symmetric_ut',\n            sflags(k) = true;\n            pflags(k) = true;\n        case 'hermitian',      \n            sflags(k) = true; do_comp = true; do_symm = true; do_conj = true;\n        case { 'skew_symmetric', 'skew-symmetric' },\n            sflags(k) = true;                 do_symm = true;                 do_skew = true;\n        case { 'skew_hermitian', 'skew-hermitian' }\n            sflags(k) = true; do_comp = true; do_symm = true; do_conj = true; do_skew = true;\n        case {'hankel','upper_hankel'},\n            pflags(k) = true;\n            sflags(k) = true;\n            is_hank = true;\n        case 'toeplitz',\n            is_toep = true;\n        case 'semidefinite',\n            do_semi = k;                      do_symm = true;\n            if do_comp,                                       do_conj = true; end\n        case 'upper_bidiagonal',\n            bflags(k) = true; sflags(k) = true;\n            bands = min(bands,[0,1]);\n        case 'lower_bidiagonal',\n            bflags(k) = true; sflags(k) = true;\n            bands = min(bands,[1,0]);\n        case 'upper_hessenberg',\n            bflags(k) = true; sflags(k) = true;\n            bands = min(bands,[1,Inf]);\n        case 'lower_hessenberg',\n            bflags(k) = true; sflags(k) = true;\n            bands = min(bands,[Inf,1]);\n        case 'upper_triangular',\n            bflags(k) = true; sflags(k) = true;\n            bands = min(bands,[0,Inf]);\n        case 'lower_triangular',\n            bflags(k) = true; sflags(k) = true;\n            bands = min(bands,[Inf,0]);\n        case 'diagonal',\n            bflags(k) = true;\n            bands = min(bands,[0,0]);\n        case 'tridiagonal',\n            bflags(k) = true;\n            bands = min(bands,[1,1]);\n        case 'scaled_identity',\n            bflags(k) = true; is_toep = true;\n            bands = min(bands,[0,0]);\n        case 'banded',\n            amin = 1; amax = 2;\n            sflags(k) = length(args{k}) == 2 && ~isequal(args{k}{1},args{k}{2});\n            bflags(k) = true;\n            lb = args{k}{1};\n            switch length(args{k}),\n                case 0, error( 'CVX:InvalidStructure', 'Not enough arguments for \"banded()\" structure.' );\n                case 1, ub = args{k}{1};\n                case 2, ub = args{k}{2};\n                otherwise, error( 'Too many arguments for \"banded()\" structure.' );\n            end\n            if ~isnumeric( lb ) || length( lb ) ~= 1 || lb < 0 || lb ~= floor( lb ),\n                error( 'Bandwidth arguments must be nonnegative integers.' );\n            elseif ~isnumeric( ub ) || length( ub ) ~= 1 || ub < 0 || ub ~= floor( ub ),\n                error( 'Bandwidth arguments must be nonnegative integers.' );\n            end\n            bands = min(bands,[lb,ub]);\n        case { 'binary', 'integer', 'nonnegative', 'epigraph_', 'hypograph_', 'geometric_', 'linear_' },\n            itypes{end+1} = nm; %#ok\n        otherwise,\n            pflags(k) = true;\n            if ~exist( [ 'cvx_s_', nm ], 'file' ),\n                error( 'CVX:UnknownStructure', 'Undefined matrix structure type: %s\\nTrying to declare multiple variables? Use the VARIABLES keyword instead.', orig{k} );\n            end\n    end\n    if length( args{k} ) < amin,\n        error( 'CVX:InvalidStructure', 'Not enough arguments: %s', orig{k} );\n    elseif length( args{k} ) > amax,\n        error( 'CVX:InvalidStructure', 'Too many arguments: %s', orig{k} );\n    end\nend\nif ~isempty(uplo),\n    error( 'CVX:InvalidStructure', 'Invalid structure type: %s', orig{end} );\nend    \n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Quick exit for no structure %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nif numel( itypes ) == nargs - 1 && nargout > 0,\n    return\nend\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Verify symmetry consistency %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nif nnz(sflags) > 1 || do_semi && ( do_skew || do_comp && ~do_conj ),\n    if do_semi, sflags = sflags | strcmpi( name, 'semidefinite' ); end\n    error( 'CVX:InvalidStructure', 'These forms of structure may not be specified simultaneously:\\n   %s', sprintf(' %s', orig{sflags} ) );\nelseif is_toep && is_hank,\n    error( 'CVX:InvalidStructure', 'These forms of structure may not be specified simultaneously:\\n   toeplitz hankel' );\nelseif nnz(bflags) > 1,\n    error( 'CVX:InvalidStructure', 'These forms of structure may not be specified simultaneously:\\n   %s', sprintf(' %s', orig{bflags} ) );\nelseif do_symm && sz(1) ~= sz(2),\n    if do_semi, sflags = sflags | strcmpi( name, 'semidefinite' ); end\n    error( 'CVX:InvalidStructure', 'This type of structure requires square matrices:%s', sprintf(' %s', orig{sflags} ) );\nend\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Construct the basis matrices for the remaining structure elements        %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nstrs = {};\nif is_toep || any( bands < sz(1:2) ),\n    [ strs{end+1}, do_symm ] = cvx_s_banded( sz(1), sz(2), [ do_symm, is_toep ], bands(1), bands(2) );\n    do_symm = do_symm(1);\nend\nfor k = 2 : nargs,\n    if pflags(k),\n        try\n            [ strs{end+1}, do_symm ] = feval( [ 'cvx_s_', lower(name{k}) ], sz( 1 ), sz( 2 ), do_symm, args{k}{:} ); %#ok\n        catch exc\n            error( exc.identifier, 'Error constructing structure: %s\\n   %s', orig{k}, exc.message );\n        end\n    end\nend\nif do_symm,\n    [ strs{end+1}, do_symm ] = cvx_s_symmetric( sz(1), sz(2), do_symm ); %#ok\nend\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% If multiple structures have been requested (e.g., toeplitz and banded),  %\n% combine them together by finding bases for their orthogonal complements, %\n% concatenating, and taking the orthogonal complement of that. This should %\n% be used much less frequently than before---if ever---now that we handle  %\n% symmetry as a special case for improved performance.                     %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n    \nswitch length( strs ),\n    case 0,\n        sz(end+1:2) = 1;\n        nel = sz( 1 ) * sz( 2 );\n        S = sparse( 1 : nel, 1 : nel, 1, nel, nel );\n    case 1,\n        S = strs{ 1 };\n    otherwise,\n        for k = 1 : length(strs),\n            strs{k} = cvx_orthog_structure( strs{k} ); %#ok\n        end\n        S = cvx_orthog_structure( vertcat(strs{:}), true );\nend\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Handle complex, skew-symmetric, and Hermitian structures.                %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nif do_comp,\n    S = [ S ; +1j * S ];\n    S = S([1:end/2;end/2+1:end],:);\nend\nif do_skew || do_conj,\n    r = (0:sz(1)-1)'; r = r(:,ones(1,sz(2)));\n    c = 0:sz(2)-1; c = c(ones(1,sz(1)),:);\n    ut = r < c; dg = r == c;\n    if do_skew,\n        S(:,ut) = - S(:,ut);\n        S(:,dg) = 0;\n    end\n    if do_conj,\n        S(:,ut) = conj(S(:,ut));\n        S(:,dg) = real(S(:,dg));\n    end\n    S = S(any(S,2),:);\nend\nif do_semi,\n    itypes{end+1} = 'semidefinite';\nend\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Report an error of the structure is empty                                %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nif isempty( S ),\n    error( 'CVX:InvalidStructure', 'Incompatible structure modifiers:%s', sprintf( ' %s', args.orig ) );\nend    \n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Replicate structure for N-D arrays                                       %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nif length( sz ) > 2,\n    S = cvx_replicate_structure( S, sz( 3 : end ) );\nend\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Display the structure if called with no output arguments                 %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nif nargout == 0,\n    [ii,jj,vv] = find( S );\n    if isempty(sz), sz = [1,1]; end\n    Z = reshape( full( sparse( jj, 1, ii .* vv, prod(sz), 1 ) ), sz );\n    temp = sprintf( ',%d', sz );\n    fprintf( '\\n%s(%s)', name{1}, temp(2:end) );\n    for k = 2 : nargs,\n        if any( strcmp(orig{k},itypes) )\n            fprintf( ' [%s]', orig{k} );\n        else\n            fprintf( ' %s', orig{k} );\n        end\n    end\n    fprintf( '\\n\\n' );\n    fmt = get(0,'format');\n    set(0,'format','rational');\n    disp( Z );\n    set(0,'format',fmt);\n    clear S\nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for orig copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_invert_structure.m",
    "content": "function xi = cvx_invert_structure( x, compact )\nglobal cvx___\nif nargin < 2, compact = false; end\n\n%CVX_INVERT_STRUCTURE Compute a right-inverse of a structure mapping.\n\nif ~isreal( x ),\n\n    x = [ real(x), imag(x) ];\n    x = x(:,[1:end/2;end/2+1:end]);\n    if nargin < 2, compact = false; end\n    xi = cvx_invert_structure( x, compact );\n    xi = xi(1:2:end,:) - sqrt(-1) * xi(2:2:end,:);\n    \nelseif compact,\n\n    if cvx___.isoctave,\n      [LL,UU,PP,QQ] = lu(x);\n      LL = PP' * LL;\n      UU = UU * QQ';\n    else \n      [LL,UU] = lu(x);\n    end\n    [jj,ii] = find(UU');\n    dd = [true;diff(ii)~=0];\n    jj = jj(dd);\n    [i2,j2,vv] = find( inv(UU(:,jj)) / LL );\n    [vn,vd] = rat(vv);\n    xi = sparse(jj(i2),j2,vn./vd,size(x,2),size(x,1));\n    \nelse\n    \n    xi = x'/(x*x');\n    [ii,jj,vv] = find(xi);\n    [vn,vd] = rat(vv);\n    xi = sparse(ii,jj,vn./vd,size(x,2),size(x,1));\n    \nend\n\n% Copyright 2005-2016 CVX Research, Inc.\n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_orthog_structure.m",
    "content": "function [ xi, R ] = cvx_orthog_structure( xi, clean )\n\n%CVX_ORTHOG_STRUCTURE   Constructs an orthogonal structure matrix.\n%    CVX_ORTHOG_STRUCTURE(X), where X is an M x N matrix from CVX's\n%    matrix structure facility, determines an orthogonal structure: that\n%    is, a matrix Z of size (N-rank(X)) x N such that X * Z' = 0. Roughly\n%    speaking, this computes Z = NULL(X,'r')'. However, this should not\n%    be used for more general null space computations, because it does not\n%    employ sufficiently general numerical safeguards.\n\n% Reduce using an LU factorization with full pivoting.\n[LL,xi,pp,qq] = lu(xi,'vector'); %#ok\n[m,n] = size(xi); %#ok\n\nxid = diag(xi);\nrr = nnz(xid);\nif nnz(any(xi,2)) == rr,\n    ii = find(xid);\n    jj = ii;\nelse  \n    % Find the locations of the leading element in each row. To do this we first\n    % find the first element in each row. Transposing xi insures that the\n    % indices are sorted properly to accomplish this.\n    [ii,jj] = find(xi);\n    [ii,indx] = sort(ii);\n    dd = [true;diff(ii)~=0];\n    ii = ii(dd);\n    jj = jj(indx(dd));\n\n    % Sort the rows so that the leftmost nonzero is first. The LU factorization\n    % does this already much of the time; but in rank-degenerate cases, further\n    % sorting is needed. Use this to select a full-rank triangular submatrix.\n    [jj,jndx] = sort(jj);\n    dd = [true;diff(jj)~=0];\n    ii = ii(jndx(dd));\n    jj = jj(dd);\n\n    % Left-divide the full-rank submatrix xi(ii,:) by the full-rank triangle.\n    % We actually only need to handle the columns not in the triangle.\n    rr = length(ii);\nend\nj2 = (1:n)'; j2(jj) = [];\nQ  = xi(ii,jj) \\ xi(ii,j2);\n\n% Use the RAT function to round to a nearby rational number. We know that\n% our structure compositions will always have rational results.\n[ iq, jq, vv ] = find( Q );\nif any( Q ~= round(Q) ),\n    [ vn, vd ] = rat( vv );\n    vv = vn ./ vd;\nend\n\n% This is the reduced row echelon form, returned for debugging purposes only\nif nargout > 1,\n    R = sparse( [ (1:rr)' ; iq ], qq([ jj ; j2(jq) ]), [ ones(rr,1) ; vv ], rr, n );\nend\n\n% For a structure [ I Q ], where I is an identity matrix, the orthogonal\n% structure matrix is just [ -Q' I ]. The result of our efforts above is\n% a matrix of the form [ I Q ] with its columns scrambled, so we simply\n% need to scramble the columns of [ Q' I ] in the same way.\n\nxi = sparse( [ (1:n-rr)' ; jq ], qq([ j2 ; jj(iq) ]), [ ones(n-rr,1) ; - vv ], n - rr, n );\n\n% If we want a clean result, we need to re-sort the rows in order of their\n% first column entry.\n\nif nargin == 2 && clean,\n    [ii,jj] = find(xi); \n    [ii,indx] = sort(ii);\n    dd = [true;diff(ii)~=0];\n    ii = ii(dd);\n    [jj,jndx] = sort(jj(indx(dd))); %#ok\n    xi = xi(ii(jndx),:);\nend\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n\n    \n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_replicate_structure.m",
    "content": "function str = cvx_replicate_structure( str, sz )\n%CVX_REPLICATE_STRUCTURE Apply matrix structure to N-D arrays.\n\nszs  = size( str );\nnmat = prod( sz );\nomat = ones( 1, nmat );\n[ r, c, v ] = find( str );\nnelm = length( r );\noelm = ones( 1, nelm );\nr = r( : );\nnvec = ( 0 : nmat - 1 ) * szs( 1 );    \nr = r( :, omat ) + nvec( oelm, : );\nc = c( : );\nc = c( :, omat );\nnvec = ( 0 : nmat - 1 ) * szs( 2 );\nc = c( :, omat ) + nvec( oelm, : );\nv = v( : );\nv = v( :, omat );\nstr = sparse( r, c, v, nmat * szs( 1 ), nmat * szs( 2 ) );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_s_banded.m",
    "content": "function [ y, symm ] = cvx_s_banded( m, n, symm, lower, upper )\n\n%CVX_S_BANDED (U,L)-banded matrices.\n\nif nargin < 4,\n    error( 'Bandwidth arguments missing.' );\nend\nif ~isnumeric( lower ) || length( lower ) ~= 1 || lower < 0 || lower ~= floor( lower ),\n    error( 'Bandwidth arguments must be nonnegative integers.' );\nelseif nargin < 5, \n    upper = lower;\nelseif ~isnumeric( upper ) || length( upper ) ~= 1 || upper < 0 || upper ~= floor( upper ),\n    error( 'Bandwidth arguments must be nonnegative integers.' );\nend\n\nstflag = length(symm) == 2;\nif stflag,\n    toep = symm(2);\n    symm = symm(1);\nelse\n    toep = false;\nend\n\nif symm,\n    lower = min( lower, upper );\n    upper = 0;\nend\n\nc    = 0 : n - 1;\nc    = c( ones( 1, m ), : );\nr    = ( 0 : m - 1 )';\nr    = r( :, ones( 1, n ) );\ntemp = r - c;\ntemp = temp <= lower & temp >= -upper;\nr    = r( temp );\nc    = c( temp );\nnu   = length( r );\n\nif toep,\n    v = r - c;\n    v = abs( v ) + max( v ) * ( v < 0 ) + 1;\n    nu = max( v );\n    toep = false;\nelse\n    v = ( 1 : nu )';\nend\n\nif symm,\n    tt = r ~= c;\n    r = [ r ; c(tt) ];\n    c = [ c ; r(tt) ];\n    v = [ v ; v(tt) ];\n    symm = false;\nend\n\nif stflag,\n    symm = [ symm, toep ];\nend\n\ny = sparse( v, r + m * c + 1, 1, nu, m * n );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_s_hankel.m",
    "content": "function [ y, symm ] = cvx_s_hankel( m, n, symm )\n\n%CVX_S_HANKEL Hankel matrices.\n\nc  = 0 : n - 1;\nc  = c( ones( 1, m ), : );\nr  = ( 0 : m - 1 )';\nr  = r( :, ones( 1, n ) );\nv  = abs( r + c ) + 1;\ny = sparse( v, r + m * c + 1, 1, m + n + 1, m * n );\nsymm = false;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_s_hermitian.m",
    "content": "function [ y, symm ] = cvx_s_hermitian( m, n, symm ) %#ok\n\n%CVX_S_HERMITIAN Complex Hermitian matrices. This is no longer used by\n%cvx_create_structure, but it is used by cvx_sdpt3.\n\nif m ~= n,\n    error( 'Hermitian structure requires square matrices.' );\nend\n\nnsq = n * n;\nc  = 0 : n - 1;\nc  = c( ones( 1, 2 * n ), : );\nc  = c( : );\nr  = 0 : n - 1;\nr  = r( [ 1, 1 ], : );\nr  = r( : );\nr  = r( :, ones( 1, n ) );\nr  = r( : );\nv  = [ 1 ; 1i ];\nv  = v( :, ones( 1, nsq ) );\nv  = v( : );\ntemp = r < c;\nv( temp ) = conj( v( temp ) );\ntemp = r == c;\nv( temp ) = real( v( temp ) );\nmn = min( r, c );\nmx = max( r, c );\ny  = sparse( 2 * ( mx + mn .* ( n - 0.5 * ( mn + 1 ) ) + 1 ) - ( v == 1 ), r + n * c + 1, v, length( v ), nsq );\ny  = y( any( y, 2 ), : );\nsymm = false;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_s_sparse.m",
    "content": "function [ y, symm ] = cvx_s_sparse( m, n, symm, i, j )\n\n%CVX_S_SPARSE Matrices with a fixed sparsity pattern.\n\nif nargin < 5,\n    error( 'Sparsity structure missing.' );\nelseif ~isnumeric( i ) || ~isnumeric( j ),\n    error( 'Sparsity arguments must be vectors of nonnegative integers.' );\nelseif any( i <= 0 ) || any( j <= 0 ) || any( i ~= floor( i ) ) || any( j ~= floor( j ) ),\n    error( 'Sparsity arguments must be vectors nonnegative integers.' );\nelseif numel( i ) ~= 1 && numel( j ) ~= 1 && numel( i ) ~= numel( j ),\n    error( 'Sparsity arguments have incompatible size.' );\nelseif any( i > m ) || any( j > n ),\n    error( 'One or more indices are out of range.' );\nelseif symm && m ~= n,\n    error( 'Symmetric structure requires a square matrix.' );\nend\ni = i(:); \nj = j(:);\nnz = max( numel(i), numel(j) );\nif symm,\n    t = max(i,j);\n    j = min(i,j);\n    i = t;\nend\n[ c, cndxs ] = sort( i + ( j - 1 ) * m );\ntt = [true;c(2:end)~=c(1:end-1)];\nc = c(tt);\nr = 1 : length(c);\nif symm,\n    if numel(i) > 1,\n        i = i(cndxs(tt));\n    end\n    if numel(j) > 1,\n        j = j(cndxs(tt));\n    end\n    tt = i ~= j;\n    r = [ r , r(tt) ];\n    c = [ c ; j(tt) + ( i(tt) - 1 ) * m ];\nend\ny = min( sparse( r, c, 1, nz, m * n ), 1 );\nsymm = false;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_s_symmetric.m",
    "content": "function [ y, symm ] = cvx_s_symmetric( m, n, symm ) %#ok\n%CVX_S_SYMMETRIC Symmetric matrices (lower triangle storage).\nif m ~= n,\n    error( 'Symmetric structure requires square matrices.' );\nend\nsymm = false;\nnsq = n * n;\nntr = 0.5 * ( nsq + n );\nc  = 0 : n - 1;\nc  = c( ones( 1, n ), : );\nr  = c';\nmn = min( r, c );\nmx = max( r, c );\ny  = mx + mn .* ( n - 0.5 * ( mn + 1 ) ) + 1;\ny  = sparse( y( : ), 1 : nsq, 1, ntr, nsq );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_s_symmetric_ut.m",
    "content": "function [ y, symm ] = cvx_s_symmetric_ut( m, n, symm )\n%CVX_S_SYMMETRIC_UT Symmetric matrices (upper triangle storage).\nif m ~= n,\n    error( 'Symmetric structure requires square matrices.' );\nend\nsymm = false;\nnsq = n * n;\nntr = 0.5 * ( nsq + n );\nc   = 0 : n - 1;\nc   = c( ones( 1, n ), : );\nr   = c';\nmn  = min( r, c );\nmx  = max( r, c );\ny   = mn + 0.5 * mx .* ( mx + 1 ) + 1;\ny   = sparse( y( : ), 1 : nsq, 1, ntr, nsq );\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/CVX/structures/cvx_s_upper_hankel.m",
    "content": "function [ y, symm ] = cvx_s_upper_hankel( m, n, symm )\n\n% CVX_S_UPPER_HANKEL Upper Hankel matrices.\n\nc  = 0 : n - 1;\nc  = c( ones( 1, m ), : );\nr  = ( 0 : m - 1 )';\nr  = r( :, ones( 1, n ) );\nv  = abs( r + c ) + 1;\ntemp = v <= min( m, n );\ny = sparse( v( temp ), r( temp ) + m * c( temp ) + 1, 1, min( m, n ), m * n );\nsymm = false;\n\n% Copyright 2005-2016 CVX Research, Inc. \n% See the file LICENSE.txt for full copyright information.\n% The command 'cvx_where' will show where this file is located.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/Check_plot.m",
    "content": "x_0=linspace(0,100,101);\r\nvx_0=linspace(0,100,101);\r\nz=zeros(101,101);\r\nfor i=1:101\r\n    for j=1:101\r\n        z(i,j)=x_0(i)*vx_0(j);\r\n    end\r\nend\r\n\r\nfigure\r\npcolor(x_0,vx_0,z)\r\nshading flat"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/FTLEH.m",
    "content": "tic\r\nclear all\r\n%% Choice of the mass parameter\r\nmu=0.1;\r\n\r\n%% Computation of Lagrangian Points\r\n[xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu);\r\n\r\n%% Computation of initial total energy\r\nE_L1=-Omega(xl1,yl1,mu);\r\nE=E_L1+0.03715; % Offset as in figure 2.2 \"LCS in the ER3BP\"\r\n\r\n%% Initial conditions range\r\nx_0_min=-0.8;\r\nx_0_max=-0.2;\r\n\r\nvx_0_min=-2;\r\nvx_0_max=2;\r\n\r\ny_0=0;\r\n\r\n% Elements for grid definition\r\nn=200;\r\n\r\n% Dimensionless integrating time\r\nT=2;\r\n\r\n% Grid initializing\r\n[x_0,vx_0]=ndgrid(linspace(x_0_min,x_0_max,n),linspace(vx_0_min,vx_0_max,n));\r\nvy_0=sqrt(2*E+2*Omega(x_0,y_0,mu)-vx_0.^2);\r\n\r\n% Kinetic energy computation\r\nE_cin=E+Omega(x_0,y_0,mu);\r\n\r\n%% Transforming into Hamiltonian variables\r\npx_0=vx_0-y_0;\r\npy_0=vy_0+x_0;\r\n\r\n% Inizializing\r\nx_T=zeros(n,n);\r\ny_T=zeros(n,n);\r\npx_T=zeros(n,n);\r\npy_T=zeros(n,n);\r\nfiltro=ones(n,n);\r\nE_T=zeros(n,n);\r\na=zeros(n,n); % matrix of numbers of integration steps for each integration\r\nnp=0; % number of integrated points\r\n\r\nfprintf(' con n = %i\\n',n)\r\n\r\n%% Energy tolerance setting\r\nenergy_tol=inf;\r\n\r\n%% Computation of the Jacobian of the system\r\noptions=odeset('Jacobian',@cr3bp_jac);\r\n\r\n%% Parallel integration of equations of motion\r\nparfor i=1:n\r\n\tfor j=1:n\r\n\t\tif E_cin(i,j)>0 && isreal(vy_0(i,j)) % Check for real velocity and positive Kinetic energy\r\n\t\t\t[t,Y]=ode45(@fH,[0 T],[x_0(i,j); y_0; px_0(i,j); py_0(i,j)],options);\r\n            % Try to obtain the name of the solver for a following use\r\n%  \t\t\tsol=ode45(@f,[0 T],[x_0(i,j); y_0; vx_0(i,j); vy_0(i,j)],options);\r\n% \t\t\tY=sol.y';\r\n% \t\t\tsolver=sol.solver;\r\n\t\t\ta(i,j)=length(Y);\r\n            %Saving solutions\r\n\t\t\tx_T(i,j)=Y(a(i,j),1); \r\n\t\t\tpx_T(i,j)=Y(a(i,j),3);\r\n\t\t\ty_T(i,j)=Y(a(i,j),2);\r\n\t\t\tpy_T(i,j)=Y(a(i,j),4);\r\n\t\t\t%Computation of final total energy and difference with\r\n\t\t\t%initial one\r\n\t\t\tE_T(i,j)=EnergyH(x_T(i,j),y_T(i,j),px_T(i,j),py_T(i,j),mu);\r\n\t\t\tdelta_E=abs(E_T(i,j)-E);\r\n\t\t\tif  delta_E > energy_tol; %Check of total energy conservation\r\n\t\t\t\tfprintf(' Ouch! Wrong Integration: i,j=(%i,%i)\\n E_T=%.2f \\n delta_E=%.2f\\n\\n',i,j,E_T(i,j),delta_E);\r\n\t\t\t\tfiltro(i,j)=2; %Saving position of the point\r\n            end\r\n\t\t\tnp=np+1;\r\n        else\r\n\t\t\tfiltro(i,j)=0; % 1=interesting point; 0=non-sense point; 2= bad integration point\t\t\r\n\t\tend\r\n\tend\r\nend\r\n\r\nt_integrazione=toc;\r\nfprintf('  n = %i\\n',n)\r\nfprintf(' energy_tol = %.2f\\n',energy_tol)\r\nfprintf('total\t\\t%i\\n',n^2)\r\nfprintf('nunber\t\\t%i\\n',np)\r\nfprintf('time to integrate\t\\t%.2f s\\n',t_integr)\r\n\r\n%% Back to Lagrangian variables\r\nvx_T=px_T+y_T;\r\nvy_T=py_T-x_T;\r\n%% FTLE Computation\r\nfprintf('adesso calcolo ftle\\n')\r\ntic\r\ndphi=zeros(2,2);\r\nftle=zeros(n-2,n-2);\r\n\r\nfor i=2:n-1\r\n\tfor j=2:n-1\r\n\t\tif filtro(i,j) && ... % Check for interesting point\r\n\t\t\t\tfiltro(i,j-1) && ...\r\n\t\t\t\tfiltro(i,j+1) && ...\r\n\t\t\t\tfiltro(i-1,j) && ...\r\n\t\t\t\tfiltro(i+1,j)\r\n\t\t\t\r\n\t\t\tdphi(1,1)=(x_T(i-1,j)-x_T(i+1,j))/(x_0(i-1,j)-x_0(i+1,j));\r\n\t\t\t\r\n\t\t\tdphi(1,2)=(x_T(i,j-1)-x_T(i,j+1))/(vx_0(i,j-1)-vx_0(i,j+1));\r\n\t\t\t\r\n\t\t\tdphi(2,1)=(vx_T(i-1,j)-vx_T(i+1,j))/(x_0(i-1,j)-x_0(i+1,j));\r\n\t\t\t\r\n\t\t\tdphi(2,2)=(vx_T(i,j-1)-vx_T(i,j+1))/(vx_0(i,j-1)-vx_0(i,j+1));\r\n            \r\n\t\t\tif filtro(i,j)==2 % Manual setting to visualize bad integrated points \r\n\t\t\t\tftle(i-1,j-1)=-Inf;\r\n\t\t\telse\r\n\t\t\t\tftle(i-1,j-1)=1/(2*T)*log(max(abs(eig(dphi'*dphi))));\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\n\r\n%% Plotting results\r\n% figure\r\n% plot(t,Y)\r\n% figure\r\n% plot(Y(:,1),Y(:,2))\r\n% figure\r\n\r\nxx=linspace(x_0_min,x_0_max,n);\r\nvvx=linspace(vx_0_min,vx_0_max,n);\r\n[x,vx]=ndgrid(xx(2:n-1),vvx(2:n-1));\r\nfigure\r\npcolor(x,vx,ftle)\r\nshading flat\r\n\r\nt_ftle=toc;\r\nfprintf('tempo per integrare      \\t%.2f s\\n',t_integrazione)\r\nfprintf('tempo per calcolare ftle \\t%.2f s\\n',t_ftle)\r\n\r\n% save(['var_' num2str(n) '_' num2str(clock(4)])\r\n\r\nnome=['var_xvx_', 'ode00', '_n',num2str(n),'_e',num2str(energy_tol),'_H'];\r\nsave(nome)"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/FTLE_reg.m",
    "content": "tic\nclear all\n%% Elements for grid definition\nn=100;\n\n%% Dimensionless integrating time\nT=2;\n\n%% Choice of the mass parameter\nmu=0.1;\n\n%% Computation of Lagrangian Points\n[xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu);\n\n%% Computation of initial total energy\nE_L1=-Omega(xl1,yl1,mu);\nC_L1=-2*E_L1; % C_L1 = 3.6869532299 from Szebehely\nE=E_L1+0.03715; % Offset as in figure 2.2 \"LCS in the ER3BP\"\n\n%% Initial conditions range\nx_0_min=-0.8;\nx_0_max=-0.2;\n\nvx_0_min=-2;\nvx_0_max=2;\n\ny_0=0;\n\n% Grid initializing\n[x_0,vx_0]=ndgrid(linspace(x_0_min,x_0_max,n),linspace(vx_0_min,vx_0_max,n));\nvy_0=sqrt(2*E+2.*Omega(x_0,y_0,mu)-vx_0.^2);\n% Kinetic energy computation\nE_cin=E+Omega(x_0,y_0,mu);\n\n% Inizializing\nx_T=zeros(n,n);\ny_T=zeros(n,n);\nvx_T=zeros(n,n);\nvy_T=zeros(n,n);\nfiltro=ones(n,n);\nE_T=zeros(n,n);\ndelta_E=zeros(n,n);\na=zeros(n,n); % matrix of numbers of integration steps for each integration\nnp=0; % number of integrated points\n\nfprintf('integro con n = %i\\n',n)\n\n%% Energy tolerance setting\nenergy_tol=0.1;\n\n%% Setting the options for the integrator\nRelTol=1e-12;AbsTol=1e-12; % From Short\n% RelTol=1e-13;AbsTol=1e-22; % From JD James Mireles\n% RelTol=3e-14;AbsTol=1e-16; % HIGH accuracy from Ross\noptions=odeset('AbsTol',AbsTol,'RelTol',RelTol);\n%% Parallel integration of equations of motion\nh=waitbar(0,'','Name','Integration in progress, please wait!');\nS=zeros(n,n);\nr1=zeros(n,n);\nr2=zeros(n,n);\ng=zeros(n,n);\nfor i=1:n\n    waitbar(i/n,h,sprintf('Computing i=%i',i));\n\tparfor j=1:n\n        r1(i,j)=sqrt((x_0(i,j)+mu).^2+y_0.^2);\n\t\tr2(i,j)=sqrt((x_0(i,j)-1+mu).^2+y_0.^2);\n\t\tg(i,j)=((1-mu)./(r1(i,j).^3)+mu./(r2(i,j).^3));\n\t\tif E_cin(i,j)>0 && isreal(vy_0(i,j)) % Check for real velocity and positive Kinetic energy\n            S(i,j)=g(i,j)*T;\n            [s,Y]=ode45(@f_reg,[0 S(i,j)],[x_0(i,j); y_0; vx_0(i,j); vy_0(i,j)],options,mu);\n\t\t\ta(i,j)=length(Y);\n%             if s(a(i,j)) < 2\n%                 filtro(i,j)=3;\n%             end\n\t\t\t% Saving solutions\n\t\t\tx_T(i,j)=Y(a(i,j),1);\n\t\t\tvx_T(i,j)=Y(a(i,j),3);\n\t\t\ty_T(i,j)=Y(a(i,j),2);\n\t\t\tvy_T(i,j)=Y(a(i,j),4);\n\n\t\t\t% Computation of final total energy and difference with\n\t\t\t% initial one\n\t\t\tE_T(i,j)=Energy(x_T(i,j),y_T(i,j),vx_T(i,j),vy_T(i,j),mu);\n            delta_E(i,j)=abs(E_T(i,j)-E);\n            if  delta_E(i,j) > energy_tol; % Check of total energy conservation\n                fprintf(' Ouch! Wrong Integration: i,j=(%i,%i)\\n E_T=%.2f \\n delta_E=%f\\n\\n',i,j,E_T(i,j),delta_E(i,j));\n                filtro(i,j)=2; % Saving position of the point\n            end\n            np=np+1;\n        else\n\t\t\tfiltro(i,j)=0; % 1 = interesting point; 0 = non-sense point; 2 = bad integration point\t\t\n\t\tend\n\tend\nend\nclose(h);\nt_integrazione=toc;\n%%\nfiltro_1=filtro;\nfor i=2:n-1\n    for j=2:n-1\n        if filtro(i,j)==2 || filtro (i,j)==3\n            filtro_1(i,j)=2;\n\t\t\tfiltro_1(i+1,j)=2;\n            filtro_1(i-1,j)=2;\n            filtro_1(i,j+1)=2;\n            filtro_1(i,j-1)=2;\n        end\n    end\nend\n\nfprintf('integato con n = %i\\n',n)\nfprintf('integato con energy_tol = %f\\n',energy_tol)\nfprintf('numero punti totali\t\\t%i\\n',n^2)\nfprintf('numero punti integrati\t\\t%i\\n',np)\nfprintf('tempo per integrare\t\\t%.2f s\\n',t_integrazione)\n\n%% FTLE Computation\nfprintf('adesso calcolo ftle\\n')\ntic\ndphi=zeros(2,2);\nftle=zeros(n-2,n-2);\nftle_norm=zeros(n-2,n-2);\n\nds_x=(x_0_max-x_0_min)/(n-1);\nds_vx=(vx_0_max-vx_0_min)/(n-1);\n\nfor i=2:n-1\n\tfor j=2:n-1\n\t\tif filtro_1(i,j) && ... % Check for interesting point\n\t\t\t\tfiltro_1(i,j-1) && ...\n\t\t\t\tfiltro_1(i,j+1) && ...\n\t\t\t\tfiltro_1(i-1,j) && ...\n\t\t\t\tfiltro_1(i+1,j)\n\t\t\t% La direzione dello spostamento la decide il denominatore\n\t\t\t\n\t\t\t% TODO spiegarsi teoricamente come mai la matrice pu�\n\t\t\t% essere ridotta a 2x2\n\t\t\tdphi(1,1)=(x_T(i+1,j)-x_T(i-1,j))/(2*ds_x); %(x_0(i-1,j)-x_0(i+1,j));\n\t\t\t\n\t\t\tdphi(1,2)=(x_T(i,j+1)-x_T(i,j-1))/(2*ds_vx); %(vx_0(i,j-1)-vx_0(i,j+1));\n\t\n\t\t\tdphi(2,1)=(vx_T(i+1,j)-vx_T(i-1,j))/(2*ds_x); %(x_0(i-1,j)-x_0(i+1,j));\n            \n\t\t\tdphi(2,2)=(vx_T(i,j+1)-vx_T(i,j-1))/(2*ds_vx); %(vx_0(i,j-1)-vx_0(i,j+1));\n    \n\t\t\tif filtro_1(i,j)==2 % Manual setting to visualize bad integrated points \n\t\t\t\tftle(i-1,j-1)=0;\n\t\t\telse\n\t\t\t\tftle(i-1,j-1)=(1/abs(T))*log(max(sqrt(abs(eig(dphi*dphi')))));\n                ftle_norm(i-1,j-1)=(1/abs(T))*log(norm(dphi));\n\t\t\tend\n\t\tend\n\tend\nend\n\n%% Plotting results\n% figure\n% plot(t,Y)\n% figure\n% plot(Y(:,1),Y(:,2))\n% figure\n\nxx=linspace(x_0_min,x_0_max,n);\nvvx=linspace(vx_0_min,vx_0_max,n);\n[x,vx]=ndgrid(xx(2:n-1),vvx(2:n-1));\nfigure\npcolor(x,vx,ftle)\nshading flat\n\nt_ftle=toc;\nfprintf('tempo per integrare      \\t%.2f s\\n',t_integrazione)\nfprintf('tempo per calcolare ftle \\t%.2f s\\n',t_ftle)\n\n% ora=fstringf %TODO\n% save(['var_' num2str(n) '_' num2str(clock(4)])\n\nnome=['var_xvx_', 'ode00', '_n',num2str(n)];\nsave(nome)"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/Integrate1.m",
    "content": "function [ x_T, y_T, vx_T, e_T, filter ] = Integrate_FILE( x_0, y_0, vx_0, e_0, T, N, mu, options)\r\n%Integrate\r\n%   This function performs Runge-Kutta-Fehlberg integration for given\r\n%   initial conditions to compute FILE\r\nnx=length(x_0);\r\nny=length(y_0);\r\nnvx=length(vx_0);\r\nne=length(e_0);\r\nvy_0=zeros(nx,ny,nvx,ne);\r\nx_T=zeros(nx,ny,nvx,ne);\r\ny_T=zeros(nx,ny,nvx,ne);\r\nvx_T=zeros(nx,ny,nvx,ne);\r\nvy_T=zeros(nx,ny,nvx,ne);\r\ne_T=zeros(nx,ny,nvx,ne);\r\n%% Look for phisically meaningful points\r\nfilter=zeros(nx,ny,nvx,ne);  %0=meaningless point 1=meaningful point\r\n\r\n%% Integrate only meaningful points\r\nh=waitbar(0,'','Name','Integration in progress, please wait!');\r\nfor i=1:nx\r\n\twaitbar(i/nx,h,sprintf('Computing i=%i',i));\r\n\tfor j=1:ny\r\n\t\tparfor k=1:nvx\r\n\t\t\tfor l=1:ne\r\n\t\t\t\tvy_0(i,j,k,l)=sqrt(2*Potential(x_0(i),y_0(j),mu)+2*e_0(l)-vx_0(k)^2);\r\n\t\t\t\tif isreal(vy_0(i,j,k,l))\r\n\t\t\t\t\tfilter(i,j,k,l)=1;\r\n\t\t\t\t\tci=[x_0(i), y_0(j), vx_0(k), vy_0(i,j,k,l)];\r\n\t\t\t\t\t[t,Y,te,ye,ie]=ode45(@f,[0 T], ci, options, mu);\r\n\t\t\t\t\tx_T(i,j,k,l)=ye(N+1,1);\r\n\t\t\t\t\ty_T(i,j,k,l)=ye(N+1,2);\r\n\t\t\t\t\tvx_T(i,j,k,l)=ye(N+1,3);\r\n\t\t\t\t\tvy_T(i,j,k,l)=ye(N+1,4);\r\n\t\t\t\t\te_T(i,j,k,l)=0.5*(vx_T(i,j,k,l)^2+vy_T(i,j,k,l)^2)-Potential(x_T(i,j,k,l),y_T(i,j,k,l),mu);\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\nclose(h);\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/Integrate2.m",
    "content": "function [ x_T, y_T, vx_T, e_T, filter, delta_e ] = Integrate_FTLE_Gawlick_ell( x_0, y_0, vx_0, e_0, T, mu, ecc, nu, options)\r\n%Integrate\r\n%   This function performs Runge-Kutta-Fehlberg integration for given\r\n%   initial conditions to compute FTLE to obtain the image in the Gawlick's\r\n%   article \"Lagrangian Coherent Structures in the Elliptic Restricted\r\n%   Three-Body Problem\".\r\nnx=length(x_0);\r\nny=length(y_0);\r\nnvx=length(vx_0);\r\nne=length(e_0);\r\nvy_0=zeros(nx,ny,nvx,ne);\r\nx_T=zeros(nx,ny,nvx,ne);\r\ny_T=zeros(nx,ny,nvx,ne);\r\nvx_T=zeros(nx,ny,nvx,ne);\r\nvy_T=zeros(nx,ny,nvx,ne);\r\ne_T=zeros(nx,ny,nvx,ne);\r\ndelta_e=zeros(nx,ny,nvx,ne);\r\n%% Look for phisically meaningful points\r\nfilter=zeros(nx,ny,nvx,ne);  %0=meaningless point 1=meaningful point\r\nuseful=ones(nx,ny,nvx,ne);\r\n%% Integrate only useful points\r\nuseful(:,1,:,1)=0;\r\nuseful(:,1,:,3)=0;\r\nuseful(:,3,:,1)=0;\r\nuseful(:,3,:,3)=0;\r\n\r\n%% Integrate only meaningful points\r\nh=waitbar(0,'','Name','Integration in progress, please wait!');\r\nfor i=1:nx\r\n\twaitbar(i/nx,h,sprintf('Computing i=%i',i));\r\n\tfor j=1:ny\r\n\t\tparfor k=1:nvx\r\n\t\t\tfor l=1:ne\r\n\t\t\t\tif useful(i,j,k,l)\r\n\t\t\t\t\tvy_0(i,j,k,l)=-sqrt(2*(Omega(x_0(i),y_0(j),mu)/(1+ecc*cos(nu)))+2*e_0(l)-vx_0(k)^2);\r\n\t\t\t\t\tif isreal(vy_0(i,j,k,l))\r\n\t\t\t\t\t\tfilter(i,j,k,l)=1;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tci=[x_0(i), y_0(j), vx_0(k), vy_0(i,j,k,l)];\r\n\t\t\t\t\t\t[t,Y]=ode45(@f_ell,[0 T], ci, options, mu, ecc);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif abs(t(end)) < abs(T) % Consider also negative time\r\n\t\t\t\t\t\t\tfilter(i,j,k,l)=3\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tx_T(i,j,k,l)=Y(end,1);\r\n\t\t\t\t\t\ty_T(i,j,k,l)=Y(end,2);\r\n\t\t\t\t\t\tvx_T(i,j,k,l)=Y(end,3);\r\n\t\t\t\t\t\tvy_T(i,j,k,l)=Y(end,4);\r\n\t\t\t\t\t\te_T(i,j,k,l)=0.5*(vx_T(i,j,k,l)^2+vy_T(i,j,k,l)^2)-Omega(x_T(i,j,k,l),y_T(i,j,k,l),mu);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t% Compute the goodness of the integration\r\n\t\t\t\t\t\tdelta_e(i,j,k,l)=abs(e_T(i,j,k,l)-e_0(l));\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\nclose(h);"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/Lagr.m",
    "content": "function [xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu)\r\n% [xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu)\r\n% Lagr This function computes the coordinates of the Lagrangian points,\r\n% given the mass parameter\r\nyl1=0;\r\nyl2=0;\r\nyl3=0;\r\nyl4=sqrt(3)/2;\r\nyl5=-sqrt(3)/2;\r\nc1=roots([1 mu-3 3-2*mu -mu 2*mu -mu]);\r\nc2=roots([1 3-mu 3-2*mu -mu -2*mu -mu]);\r\nc3=roots([1 2+mu 1+2*mu mu-1 2*mu-2 mu-1]);\r\nxl1=0;\r\nxl2=0;\r\nfor i=1:5\r\n    if isreal(c1(i))\r\n        xl1=1-mu-c1(i);\r\n    end\r\n    if isreal(c2(i))\r\n        xl2=1-mu+c2(i);\r\n    end\r\n    if isreal(c3(i))\r\n        xl3=-mu-c3(i);\r\n    end\r\nend\r\nxl4=0.5-mu;\r\nxl5=xl4;\r\nend"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/Lagrangian_points.m",
    "content": "% Plot dei Lagrangian points\r\nn=5;\r\nmu=linspace(0,0.5,n);\r\nfor i=1:n\r\n    [xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu(i));\r\n    figure (1)\r\n    hold all\r\n    plot(xl1, yl1, 's')\r\n    plot(xl2, yl2, 's')\r\n    plot(xl3, yl3, 's')\r\n    plot(xl4, yl4, 's')\r\n    plot(xl5, yl5, 's')\r\n    plot(-mu,0,'o')\r\n    plot(1-mu,0, 'o')\r\n    plot([-mu(i) xl4],[0 yl4])\r\nend"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/Poincare.m",
    "content": "clear\r\n%% Initial Conditions\r\nmu=0.012277471;\r\nT=10;\r\nN=5;\r\nC=3.17;\r\nx_0=0.30910452642073;\r\ny_0=0.07738174525518;\r\nvx_0=-0.72560796964234;\r\nvy_0=sqrt(-C-vx_0^2+2*Potential(x_0,y_0,mu));\r\nk=0;\r\n%% Integration\r\noptions=odeset('AbsTol',1e-22,'RelTol',1e-13,'Events',@cross_y);\r\n[t,y,te,ye,ie]=ode113(@f,[0 T],[x_0; y_0; vx_0; vy_0],options,mu);\r\n\r\nfigure\r\n%plot(ye(:,1),ye(:,3),'rs')\r\nplot(ye(:,1),0,'rs')"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/RK4.m",
    "content": "function x = RK4( fun, tspan, ci, mu )\r\n%RK4 4th-order Runge Kutta integrator\r\n%   Detailed explanation goes here\r\nh=1e-5;\r\nt=tspan(1);\r\nT=tspan(length(tspan));\r\ndim=length(ci);\r\n%x=zeros(l,dim);\r\nx(:,1)=ci;\r\ni=1;\r\nwhile t<T\r\n\tk1=fun(t,x(:,i),mu);\r\n\tk2=fun(t+h/2,x(:,i)+k1*h/2,mu);\r\n\tk3=fun(t+h/2,x(:,i)+k2*h/2,mu);\r\n\tk4=fun(t+h,x(:,i)+h*k3,mu);\r\n\tx(:,i+1)=x(:,i)+(h/6*(k1+2*k2+2*k3+k4));\r\n\tt=t+h;\r\n\ti=i+1;\r\nend\r\nx=x';\r\n% \tfunction events(x)\r\n% \tdist=\r\n% \treturn \r\nend\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@double/tfocs_dot.m",
    "content": "function v = tfocs_dot( x, y )\n% TFOCS_DOT   Dot product <x,y>.  Returns real(x'*y)\n%   For matrices, this is the inner product that induces the Frobenius\n%   norm, i.e. <x,y> = tr(x'*y), and not matrix multiplication.\n\n% Note: this is real(x'*y) and not real(x.'*y)\n\nif isempty( x ) || isempty( y ),\n    v = 0;\n    return;\nend\n\n% Allow scalar times vector multiplies:\nif isscalar(x) && ~isscalar(y)\n    if ~x, \n        v = 0; \n        return;\n    else\n%         x = repmat(x,size(y,1),size(y,2) ); % doesn't work if y is a cell\n        % The above code fails if y is multi-dimensional. Also, not \n        % memory efficient. Switching to this (10/9/2013)\n        % (Thanks to Graham Coleman for finding this bug, btw)\n        if issparse(y)\n            v = real( x * sum(nonzeros(y)) );\n        else\n            v = real( x * sum(y(:)) );\n        end\n        return;\n    end\nelseif isscalar(y) && ~isscalar(x)\n    if ~y\n        v = 0;\n        return;\n    else\n        y = repmat(y,size(x,1),size(x,2) );\n        if issparse(x)\n            v = real( y * sum(nonzeros(x)) );\n        else\n            v = real( y * sum(x(:)) );\n        end\n        return;\n        \n    end\nend\n\nif isreal( x ) || isreal( y ),\n    if issparse( x ) || issparse( y ),\n        v = sum( nonzeros( real(x) .* real(y) ) );\n    else\n        % Split this into two cases (first case could be handled by\n        % second case, but we're trying to make it very fast since\n        % this code is called very often)\n        if ndims(x)==2 && ndims(y)==2 && size(x,2) == 1 && size(y,2) == 1 && isreal(x) && isreal(y)\n            v = sum( x'*y ); % do we really need 'sum' ?\n        else\n            % Take real part first (since one of x and y is real anyhow)\n            %   in order to save some computation:\n            v = real(x(:))' * real(y(:));\n        end\n    end\nelse\n    if issparse( x ) || issparse( y ),\n        v = sum( nonzeros( real(x) .* real(y) ) ) + ...\n            sum( nonzeros( imag(x) .* imag(y) ) );\n    else\n        % SRB: this is very slow:\n%         v = sum( real(x(:))' * real(y(:)) ) + ...\n%             sum( imag(x(:))' * imag(y(:)) );\n        if ndims(x)==2 && ndims(y)==2 && size(x,2) == 1 && size(y,2) == 1\n            v = sum(real( x'*y ) );\n        else\n            % This is the most generic code.\n            v = real( x(:)'*y(:) );\n        end\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information."
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@double/tfocs_size.m",
    "content": "function v = tfocs_size( x )\n\n% SIZE   TFOCS-friendly size operator.\n\nv = { @zeros, m, n };\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@double/vec.m",
    "content": "function v = vec( x )\n\n% VEC\tVectorize.\n\nv = reshape( x, numel(x), 1 );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n    "
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@single/tfocs_dot.m",
    "content": "function v = tfocs_dot( x, y )\n% TFOCS_DOT   Dot product <x,y>.  Returns real(x'*y)\n%   For matrices, this is the inner product that induces the Frobenius\n%   norm, i.e. <x,y> = tr(x'*y), and not matrix multiplication.\n\n% Note: this is real(x'*y) and not real(x.'*y)\n\nif isempty( x ) || isempty( y ),\n    v = 0;\n    return;\nend\n\n% Allow scalar times vector multiplies:\nif isscalar(x) && ~isscalar(y)\n    if ~x, \n        v = 0; \n        return;\n    else\n%         x = repmat(x,size(y,1),size(y,2) ); % doesn't work if y is a cell\n        % The above code fails if y is multi-dimensional. Also, not \n        % memory efficient. Switching to this (10/9/2013)\n        % (Thanks to Graham Coleman for finding this bug, btw)\n        if issparse(y)\n            v = real( x * sum(nonzeros(y)) );\n        else\n            v = real( x * sum(y(:)) );\n        end\n        return;\n    end\nelseif isscalar(y) && ~isscalar(x)\n    if ~y\n        v = 0;\n        return;\n    else\n        y = repmat(y,size(x,1),size(x,2) );\n        if issparse(x)\n            v = real( y * sum(nonzeros(x)) );\n        else\n            v = real( y * sum(x(:)) );\n        end\n        return;\n        \n    end\nend\n\nif isreal( x ) || isreal( y ),\n    if issparse( x ) || issparse( y ),\n        v = sum( nonzeros( real(x) .* real(y) ) );\n    else\n        % Split this into two cases (first case could be handled by\n        % second case, but we're trying to make it very fast since\n        % this code is called very often)\n        if ndims(x)==2 && ndims(y)==2 && size(x,2) == 1 && size(y,2) == 1 && isreal(x) && isreal(y)\n            v = sum( x'*y ); % do we really need 'sum' ?\n        else\n            % Take real part first (since one of x and y is real anyhow)\n            %   in order to save some computation:\n            v = real(x(:))' * real(y(:));\n        end\n    end\nelse\n    if issparse( x ) || issparse( y ),\n        v = sum( nonzeros( real(x) .* real(y) ) ) + ...\n            sum( nonzeros( imag(x) .* imag(y) ) );\n    else\n        % SRB: this is very slow:\n%         v = sum( real(x(:))' * real(y(:)) ) + ...\n%             sum( imag(x(:))' * imag(y(:)) );\n        if ndims(x)==2 && ndims(y)==2 && size(x,2) == 1 && size(y,2) == 1\n            v = sum(real( x'*y ) );\n        else\n            % This is the most generic code.\n            v = real( x(:)'*y(:) );\n        end\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information."
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@single/tfocs_size.m",
    "content": "function v = tfocs_size( x )\n\n% SIZE   TFOCS-friendly size operator.\n\nv = { @zeros, m, n };\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@single/vec.m",
    "content": "function v = vec( x )\n\n% VEC\tVectorize.\n\nv = reshape( x, numel(x), 1 );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n    "
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/abs.m",
    "content": "function x = abs( x )\n\n% ABS   Absolute value.\n\nn = numel( x.value_ );\nfor k = 1 : n,\n    x.value_{k} = abs( x.value_{k} );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/cell.m",
    "content": "function v = cell( x )\n\n% CELL  Conversion to a cell array.\n\nv = x.value_;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/disp.m",
    "content": "function disp( x, prefix, inpname, nohead )\n\n% DISP\tManual display. DISP(x,prefix) adds the string prefix to each\n%       line of the display output.\n\nif nargin < 3, inpname = ''; end\nif nargin < 2, prefix = ''; end\nn = numel( x.value_ );\nif nargin < 4,\n    fprintf( '%stfocs tuple object:\\n', prefix );\n    prefix = [ prefix, '   ' ];\nend\nfor k = 1 : n,\n    ss = x.value_{k};\n    inpname2 = sprintf( '%s{%d}', inpname, k );\n    if isnumeric( ss ),\n        cls = class( ss );\n        sz = size( ss );\n        temp = sprintf( '%dx', sz );\n        if all( sz == 1 ),\n            fprintf( '%s%s: [%g]\\n', prefix, inpname2, ss );\n        elseif isreal(ss),\n            fprintf( '%s%s: [%s %s]\\n', prefix, inpname2, temp(1:end-1), cls );\n        else\n            fprintf( '%s%s: [%s %s complex]\\n', prefix, inpname2, temp(1:end-1), cls );\n        end\n    elseif isa( ss, 'tfocs_tuple' ),\n        fprintf( '%s%s: tfocs tuple object\\n', prefix, inpname2 );\n        disp( ss, [ prefix, inpname2 ], '', 1 );\n    else\n        fprintf( '%s%s: %s\\n', prefix, inpname2, class(ss) );\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/display.m",
    "content": "function display( x )\n\n% DISPLAY\tAutomatic display.\n\nlong = ~isequal(get(0,'FormatSpacing'),'compact');\nif long, disp( ' ' ); end\ndisp([inputname(1) ' =']);\nif long, disp( ' ' ); end\ndisp(x,'    ',inputname(1))\nif long, disp( ' ' ); end\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/get.m",
    "content": "function y = get( x, ndxs )\nif nargin == 0,\n    y = x.value_;\nelseif numel(ndxs) == 1,\n    y = x.value_{ndxs};\nelse\n    y = x.value_(ndxs);\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/max.m",
    "content": "function z = max( x, y )\n\n% MAX   Maximum, z = max(x,y)\n\nif isa(x,'tfocs_tuple')\n    z = x;\n    if isa(y,'tfocs_tuple')\n        z.value_ = cellfun( @max, x.value_, y.value_, 'UniformOutput', false );\n    elseif isscalar(y)\n        z.value_ = cellfun( @max, x.value_, {y}, 'UniformOutput', false );\n    else \n        z.value_ = cellfun( @max, x.value_, {y}, 'UniformOutput', false );\n    end\nelse\n    z = y;\n    if isscalar(x)\n        z.value_ = cellfun( @max, {x}, y.value_, 'UniformOutput', false );\n    else \n        z.value_ = cellfun( @max, {x}, y.value_, 'UniformOutput', false );\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/min.m",
    "content": "function z = min( x, y )\n\n% MAX   Minimum, z = min(x,y)\n\nif isa(x,'tfocs_tuple')\n    z = x;\n    if isa(y,'tfocs_tuple')\n        z.value_ = cellfun( @min, x.value_, y.value_, 'UniformOutput', false );\n    elseif isscalar(y)\n        z.value_ = cellfun( @min, x.value_, {y}, 'UniformOutput', false );\n    else \n        z.value_ = cellfun( @min, x.value_, {y}, 'UniformOutput', false );\n    end\nelse\n    z = y;\n    if isscalar(x)\n        z.value_ = cellfun( @min, {x}, y.value_, 'UniformOutput', false );\n    else \n        z.value_ = cellfun( @min, {x}, y.value_, 'UniformOutput', false );\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/minus.m",
    "content": "function x = minus( x, y )\n\n% MINUS   Subtraction.\n\nif isnumeric( x ) && isscalar( x ) && x == 0,\n    x = -y;\nelseif ~isnumeric( y ) || numel( y ) ~= 1 || y ~= 0\n\tx.value_ = cellfun( @minus, x.value_, y.value_, 'UniformOutput', false );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/mtimes.m",
    "content": "function y = mtimes( x, y )\n\n% MTIMES   Multiplication. TFOCS_TUPLE objects may only be left-multiplied\n%          by real scalars.\n\nfor k = 1 : numel( y.value_ ),\n    y.value_{k} = x * y.value_{k};\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/nnz.m",
    "content": "function ans = nnz( x )\nans = sum( cellfun( @nnz, x.value_ ) );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/numel.m",
    "content": "function v = numel( x, varargin )\n\n% NUMEL   Number of elements.\n\nv = numel( x.value_, varargin{:} );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/plus.m",
    "content": "function x = plus( x, y )\n\n% PLUS   Addition.\n\nif isnumeric( x ) && isscalar( x ) && x == 0,\n    x = y;\nelseif ~isnumeric( y ) || numel( y ) ~= 1 || y ~= 0\n\tx.value_ = cellfun( @plus, x.value_, y.value_, 'UniformOutput', false );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/power.m",
    "content": "function x = power( x, y )\n\n% POWER     Matrix power, z = x.^y\n\nif isa(y,'tfocs_tuple')\n\tx.value_ = cellfun( @power, x.value_, y.value_, 'UniformOutput', false );\nelseif isscalar(y)\n\tx.value_ = cellfun( @power, x.value_, {y}, 'UniformOutput', false );\nelse \n\tx.value_ = cellfun( @power, x.value_, {y}, 'UniformOutput', false );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/size.m",
    "content": "function v = size( x )\n\n% SIZE   Size.\n\nv = cellfun( @size, x.value_, 'UniformOutput', false );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/subsref.m",
    "content": "function varargout = subsref( x, varargin )\n[ varargout{1:nargout} ] = subsref( x.value_, varargin{:} );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/tfocs_dot.m",
    "content": "function v = tfocs_dot( x, y )\n\n% TFOCS_DOT    Dot products.\n\nif isempty( x ) || isempty( y ),\n\tv = 0;\nelse\n\tv = sum( cellfun( @tfocs_dot, x.value_, y.value_ ) );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/tfocs_normsq.m",
    "content": "function v = tfocs_normsq( x )\n\n% TFOCS_NORMSQ    Squared norm. By default, TFOCS_NORMSQ(X) is equal\n%                 to TFOCS_NORMSQ(X,X), and this numerical equivalence\n%                 must be preserved. However, an object may overload\n%                 TFOCS_NORMSQ to compute its value more efficiently.\n\nv = sum( cellfun( @tfocs_normsq, x.value_ ) );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/tfocs_size.m",
    "content": "function v = tfocs_size( x )\n\nv = { @tfocs_tuple, cellfun( @size, x.value_, 'UniformOutput', false ) };\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/tfocs_tuple.m",
    "content": "function v = tfocs_tuple( w )\n\n% TFOCS_TUPLE The TFOCS tuple object.\n%    This object is used to create tuples, which are elements of\n%    vector spaces that are Cartesian products of other vector\n%    spaces. TFOCS assumes that any element in a tfocs_tuple can\n%    perform the following basic operations:\n%        --- addition (plus)\n%        --- subtraction (minus)\n%        --- multiplication by real scalars (times,mtimes)\n%        --- dot products (tfocs_dot)\n%        --- squared norm (tfocs_normsq, optional)\n%        --- size (size; single-argument calls only)\n\nif ~iscell(w) && ~isempty(w)\n    error('tfocs_tuple constructor: input must be a cell array');\nend\nv.value_ = reshape( w, 1, numel(w) );\nv = class( v, 'tfocs_tuple' );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/tfocs_zeros.m",
    "content": "function x = tfocs_zeros( x )\n\n% ABS   Absolute value.\n\nn = numel( x.value_ );\nfor k = 1 : n,\n    x.value_{k} = zeros( size(x.value_{k}) );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/times.m",
    "content": "function v = times( x, y )\n\n% MTIMES   Multiplication.\n\nv = mtimes( x, y );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/@tfocs_tuple/uminus.m",
    "content": "function x = uminus( x )\n\n% UMINUS   Unary minus.\n\nn = numel( x.value_ );\nfor k = 1 : n,\n    x.value_{k} = -x.value_{k};\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/Contents.m",
    "content": "% TFOCS: Templates for First-Order Conic Solvers\n% TFOCS v1.3 \n%10-Oct-2013\n%\n% Main TFOCS program\n%   tfocs                          - Minimize a convex problem using a first-order algorithm.\n%   tfocs_SCD                      - Smoothed conic dual form of TFOCS, for problems with non-trivial linear operators.\n%   continuation                   - Meta-wrapper to run TFOCS_SCD in continuation mode.\n% Miscellaneous functions\n%   tfocs_version                  - Version information.\n%   tfocs_where                    - Returns the location of the TFOCS system.\n% Operator calculus\n%   linop_adjoint                  - Computes the adjoint operator of a TFOCS linear operator\n%   linop_compose                  - Composes two TFOCS linear operators\n%   linop_scale                    - Scaling linear operator.\n%   prox_dualize                   - Define a proximity function by its dual\n%   prox_scale                     - Scaling a proximity/projection function.\n%   tfunc_scale                    - Scaling a function.\n%   tfunc_sum                      - Sum of functions.\n%   tfocs_normsq                   - Squared norm. \n%   linop_normest                  - Estimates the operator norm.\n% Linear operators\n%   linop_matrix                   - Linear operator, assembled from a matrix.\n%   linop_dot                      - Linear operator formed from a dot product.\n%   linop_fft                      - Fast Fourier transform linear operator.\n%   linop_TV                       - 2D Total-Variation (TV) linear operator.\n%   linop_TV3D                     - 3D Total-Variation (TV) linear operator.\n%   linop_handles                  - Linear operator from user-supplied function handles.\n%   linop_spot                     - Linear operator, assembled from a SPOT operator.\n%   linop_reshape                  - Linear operator to perform reshaping of matrices.\n%   linop_subsample                - Subsampling linear operator.\n%   linop_vec                      - Matrix to vector reshape operator\n% Projection operators (proximity operators for indicator functions)\n%   proj_0                         - Projection onto the set {0}\n%   proj_box                       - Projection onto box constraints.\n%   proj_l1                        - Projection onto the scaled 1-norm ball.\n%   proj_l2                        - Projection onto the scaled 2-norm ball.\n%   proj_linf                      - Projection onto the scaled infinity norm ball.\n%   proj_linfl2                    - Projection of each row of a matrix onto the scaled 2-norm ball.\n%   proj_max                       - Projection onto the scaled set of vectors with max entry less than 1\n%   proj_conic                     - Projection onto the second order (aka Lorentz) cone\n%   proj_l2group                   - Projection of each group of coordinates onto the 2-norm ball.\n%   proj_singleAffine              - Projection onto a single affine equality or in-equality constraint.\n%   proj_boxAffine                 - Projection onto a single affine equality along with box constraints.\n%   proj_affine                    - Projection onto a general affine equation, e.g., solutions of linear equations.\n%   proj_nuclear                   - Projection onto the set of matrices with nuclear norm less than or equal to q.\n%   proj_psd                       - Projection onto the positive semidefinite cone.\n%   proj_psdUTrace                 - Projection onto the positive semidefinite cone with fixed trace.\n%   proj_Rn                        - \"Projection\" onto the entire space.\n%   proj_Rplus                     - Projection onto the nonnegative orthant.\n%   proj_simplex                   - Projection onto the simplex.\n%   proj_spectral                  - Projection onto the set of matrices with spectral norm less than or equal to q\n%   proj_maxEig                    - Projection onto the set of symmetric matrices with maximum eigenvalue less than 1\n% Proximity operators of general convex functions\n%   prox_0                         - The zero proximity function:\n%   prox_boxDual                   - Dual function of box indicator function { l <= x <= u }\n%   prox_hinge                     - Hinge-loss function.\n%   prox_hingeDual                 - Dual function of the Hinge-loss function.\n%   prox_l1                        - L1 norm.\n%   prox_Sl1                       - Sorted (aka ordered) L1 norm.\n%   prox_l1l2                      - L1-L2 block norm: sum of L2 norms of rows.\n%   prox_l1linf                    - L1-LInf block norm: sum of L2 norms of rows.\n%   prox_l1pos                     - L1 norm, restricted to x >= 0\n%   prox_l2                        - L2 norm.\n%   prox_linf                      - L-infinity norm.\n%   prox_max                       - Maximum function.\n%   prox_nuclear                   - Nuclear norm.\n%   prox_spectral                  - Spectral norm, i.e. max singular value.\n%   prox_maxEig                    - Maximum eigenvalue of a symmetri matrix.\n%   prox_trace                     - Nuclear norm, for positive semidefinite matrices. Equivalent to trace.\n% Smooth functions\n%   smooth_constant                - Constant function generation.\n%   smooth_entropy                 - The entropy function -sum( x_i log(x_i) )\n%   smooth_handles                 - Smooth function from separate f/g handles.\n%   smooth_huber                   - Huber function generation.\n%   smooth_linear                  - Linear function generation.\n%   smooth_logdet                  - The -log( det( X ) ) function.\n%   smooth_logLLogistic            - Log-likelihood function of a logistic: sum_i( y_i mu_i - log( 1+exp(mu_i) ) )\n%   smooth_logLPoisson             - Log-likelihood of a Poisson: sum_i (-lambda_i + x_i * log( lambda_i) )\n%   smooth_logsumexp               - The function log(sum(exp(x)))\n%   smooth_quad                    - Quadratic function generation.\n% Testing functions\n%   test_nonsmooth                 - Runs diagnostic tests to ensure a non-smooth function conforms to TFOCS conventions\n%   test_proxPair                  - Runs diagnostics on a pair of functions to check if they are Legendre conjugates.\n%   test_smooth                    - Runs diagnostic checks on a TFOCS smooth function object.\n%   linop_test                     - Performs an adjoint test on a linear operator.\n% Premade solvers for specific problems (vector variables)\n%   solver_L1RLS                   - l1-regularized least squares problem, sometimes called the LASSO.\n%   solver_LASSO                   - Minimize residual subject to l1-norm constraints.\n%   solver_SLOPE                   - Sorted L One Penalized Estimation (LASSO using sorted/ordered l1 norm)\n%   solver_sBP                     - Basis pursuit (l1-norm with equality constraints). Uses smoothing.\n%   solver_sBPDN                   - Basis pursuit de-noising. BP with relaxed constraints. Uses smoothing.\n%   solver_sBPDN_W                 - Weighted BPDN problem. Uses smoothing.\n%   solver_sBPDN_WW                - BPDN with two separate (weighted) l1-norm terms. Uses smoothing.\n%   solver_sDantzig                - Dantzig selector problem. Uses smoothing.\n%   solver_sDantzig_W              - Weighted Dantzig selector problem. Uses smoothing.\n%   solver_sLP                     - Generic linear programming in standard form. Uses smoothing.\n%   solver_sLP_box                 - Generic linear programming with box constraints. Uses smoothing.\n% Premade solvers for specific problems (matrix variables)\n%   solver_psdComp                 - Matrix completion for PSD matrices.\n%   solver_psdCompConstrainedTrace - Matrix completion with constrained trace, for PSD matrices.\n%   solver_TraceLS                 - Unconstrained form of trace-regularized least-squares problem.\n%   solver_sNuclearBP              - Nuclear norm basis pursuit problem (i.e. matrix completion). Uses smoothing.\n%   solver_sNuclearBPDN            - Nuclear norm basis pursuit problem with relaxed constraints. Uses smoothing.\n%   solver_sSDP                    - Generic semi-definite programs (SDP). Uses smoothing.\n%   solver_sLMI                    - Generic linear matrix inequality problems (LMI is the dual of a SDP). Uses smoothing.\n% Algorithm variants\n%   tfocs_AT                       - Auslender and Teboulle's accelerated method.\n%   tfocs_GRA                      - Gradient descent.\n%   tfocs_LLM                      - Lan, Lu and Monteiro's accelerated method.\n%   tfocs_N07                      - Nesterov's 2007 accelerated method.\n%   tfocs_N83                      - Nesterov's 1983 accelerated method; also by Beck and Teboulle 2005 (FISTA).\n%   tfocs_TS                       - Tseng's modification of Nesterov's 2007 method.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/continuation.m",
    "content": "function [ x, odata, optsOut ] = continuation( fcn, mu, x0, z0, opts, contOpts )\n% CONTINUATION Meta-wrapper to run TFOCS_SCD in continuation mode.\n% [...] = CONTINUATION( FCN, MU, X0, Z0, OPTS, CONT_OPTS )\n%   is a wrapper to perform continuation on FCN, where\n%   FCN is a function that calls tfocs_SCD or a tfocs solver.\n%   FCN must accept input arguments MU, X0, Z0, and OPTS,\n%       e.g. FCN = @(mu,x0,z0,opts) solver_sBP( A, b, mu, x0, z0, opts )\n%\n%   CONT_OPTS are options that affect how continuation is performed.\n%   To see the default options, call this script with no inputs.\n%\n%   Options for CONT_OPTS:\n%       maxIts      - max # of continuation iterations\n%       accel       - use accelerated continuation or not\n%       betaTol     - every continuation iteration, the tolerance\n%                       is decreased by 'betaTol'\n%       innerTol    - every continuation iteration, except the last one,\n%                       is solved to this tolerance.\n%                       This option overrides 'betaTol'\n%       tol         - the outer loop will stop when either\n%                       'maxIts' is reached, or when the change\n%                       from one step to the next is less than 'tol'.\n%                     If innerTol is not specified, then \"tol\" and \"betaTol\"\n%                       are used to determine the tolerance of intermediate solves.\n%       initialTol  - For use with \"tol\". This overrides betaTol, but in turn is\n%                       overridden by innerTol.  If specified, then the first\n%                       problem is solved to tolerance \"initialTol\" and the final\n%                       problem is solved to tolerance \"tol\", and all problems\n%                       in between are solved to logarithmically interpolated values.\n%                       E.g. if maxits = 3 and initialTol = .1 and tol = .001,\n%                         then the tolerances are .1, .01, .001.\n%       finalTol    - For use with \"tol\".  If \"finalTol\" is set, then \"tol\"\n%                       and \"betaTol\" are used to determine the tolerance of\n%                       intermediate solves, but the last solve is solved\n%                       to the \"finalTol\" tolerance.\n%       innerMaxIts - maximum number of inner iterations during\n%                       every continuation iteration except the last one.\n%       muDecrement - after every iteration, mu <-- mu*muDecrement\n%                       (default: muDecrement = 1, so mu is constant)\n%       verbose     - true  (default) prints out information, false will\n%                        not print out any information\n%\n% As of release 1.1, you do not need to call this file directly. Instead,\n% you can specify the continuation option in TFOCS_SCD.m directly.\n% See also TFOCS_SCD.m\n\nif nargin < 6, contOpts = []; end\nkMax    = setOpts('maxIts',3);\nACCEL   = setOpts('accel',true);\nbetaTol = setOpts('betaTol',2);\ninnerTol= setOpts('innerTol',[] );\nstopTol = setOpts('tol',1e-3);\nfinalTol= setOpts('finalTol',[]);\nverbose = setOpts('verbose',true);\ninnerMaxIts = setOpts('innerMaxIts',[] );\ninitialTol  = setOpts('initialTol',[]);\nmuDecrement = setOpts('muDecrement',1);\nfinalRestart = setOpts('finalRestart',[]); % not yet documented. usefulness?\n\nif nargin == 0\n    if nargout == 0\n        disp('Default options for CONTINUATION are:');\n    end\n    x = contOpts;\n    return;\nend\n\nerror(nargchk(2,6,nargin));\nif nargin < 3, x0   = []; end\nif nargin < 4, z0   = []; end\nif nargin < 5, opts = []; end\n\n% what is the user specified stopping tolerance?\nif ~isfield(opts,'tol')\n    % get the default value:\n    defaultOpts = tfocs_SCD();\n    opts.tol = defaultOpts.tol;\nend\nif isfield(opts,'fid'), fid = opts.fid; else fid = 1; end\n\n\nfinalTol2    = opts.tol;\nif isempty( innerTol ) && ~isempty(initialTol)\n    % calculate the value of betaTol that will\n    betaTol     = exp( log(initialTol/finalTol2)/(kMax-1) );\nend\n% tol         = finalTol2*betaTol^(kMax+1); % bug fixed Feb 2011\ntol         = finalTol2*betaTol^(kMax);\n\nL0   = Inf; % for first round, use default value of stepsize\nxOld = x0;\nodataCumulative      = [];\nodataCumulative.niter= 0;\nextraVerbose = verbose && (isfield(opts,'printEvery') && (opts.printEvery <= 0 ...\n    || opts.printEvery == Inf ) );\nfor k = 1:kMax\n    if kMax > 1 && verbose\n%         fprintf(fid,'--- Continuation step %d of %d ', k, kMax );\n        fprintf(fid,'--- Continuation step %d of %d, mu: %.1e', k, kMax, mu );\n        if extraVerbose\n            fprintf(fid,' ...');\n        else\n            fprintf('\\n');\n        end\n    end\n    \n    optsTemp    = opts;\n    if ~isempty( innerMaxIts ) && k < kMax\n        optsTemp.maxIts     = innerMaxIts;\n    end\n    tol             = tol/betaTol;\n    if ~isempty( innerTol ) && k < kMax\n        optsTemp.tol    = innerTol;\n    else\n        if ~isempty(finalTol) && k == kMax \n            optsTemp.tol = finalTol;\n        else\n            optsTemp.tol    = tol;\n        end\n    end\n    if k == kMax && ~isempty( finalRestart )\n        optsTemp.restart    = finalRestart; \n    end\n    if isfinite(L0)\n        optsTemp.L0     = L0;\n    end\n    \n    % call the solver\n    [x, odata, optsOut ] = fcn( mu, x0, z0, optsTemp );\n    \n    if iscell(x)\n        % Thanks to Graham Coleman for catching this case\n        if isempty(x0)\n            mu2normXX   =   mu/2*sum(cellfun( @(x) norm(x(:))^2, x ));\n        elseif iscell(x0)\n            mu2normXX   =   mu/2*sum(cellfun( @(x) norm(x(:))^2, ...\n                cellfun( @minus, x, x0,'uniformoutput',false ) ));\n        else\n            mu2normXX   =   mu/2*sum(cellfun( @(x) norm(x(:))^2, ...\n                cellfun( @(x) x-x0, x, 'uniformoutput',false ) ));\n        end\n    else\n        if isempty(x0)\n            mu2normXX   = mu/2*norm(x(:))^2;\n        else\n            mu2normXX   = mu/2*norm(x(:)-x0(:))^2;\n        end\n    end\n    \n    % (possibly) decrease mu for next solve\n    mu = mu*muDecrement;\n    \n    % Dec '13, use stepsize estimate\n    L0  = 1/odata.stepsize(end);\n    \n    % update output data\n    fields = { 'f', 'normGrad', 'stepsize','theta','counts','err' };\n    for ff = fields\n        f = ff{1};\n        if isfield(odata,f) \n            if isfield(odataCumulative,f)\n                odata.(f) = [odataCumulative.(f); odata.(f)];\n            end\n            odataCumulative.(f) = odata.(f);\n        end\n        \n    end\n    if isfield(odata,'niter')\n        % include the old iterations in the count\n        odataCumulative.niter = odata.niter + odataCumulative.niter;\n        odata.niter     = odataCumulative.niter;\n        \n        % record at which iterations continuation happened\n        if isfield(odataCumulative,'contLocations')\n            odataCumulative.contLocations = [odataCumulative.contLocations; odata.niter];\n            odata.contLocations = odataCumulative.contLocations;\n        else\n            odata.contLocations = odata.niter;\n            odataCumulative.contLocations = odata.niter;\n        end\n    end\n    \n    if kMax > 1 && extraVerbose\n        fprintf(fid,'\\b\\b\\b\\b'); % remove the \" ...\" from earlier\n    end\n    % if the tfocs solver is set to be quiet, but the continuation\n    % script still has the \"verbose\" flag, then print out\n    %   some information\n    if extraVerbose && isfield( odata, 'err' ) && ~isempty( odata.err )\n        fprintf(fid,', errors: ');\n        fprintf(fid,' %8.2e', odata.err(end,:) );\n    end\n    if verbose\n        if extraVerbose\n            fprintf(fid,', mu/2||x-x_0||^2: %.1e', mu2normXX );\n        else\n            fprintf(fid,'Continuation statistics: mu/2||x-x_0||^2: %.1e', mu2normXX );\n        end\n        \n        if kMax > 1 && extraVerbose\n            fprintf(fid,' ---');\n        end\n        fprintf(fid,'\\n');\n    end\n    \n    \n    if k == kMax, break; end\n    \n    % Update the prox center\n    \n    if ACCEL\n        if iscell(x)\n            if isempty(xOld) || ~iscell(xOld)\n                 xOld = cell( size(x) ); \n            end\n            x0 = cell( size(x) );\n            for nCell = 1:length(x)\n                if isempty(xOld{nCell}), xOld{nCell} = zeros( size(x{nCell}) ); end\n                x0{nCell} = x{nCell} + (k-1)/(k+2)*( x{nCell} - xOld{nCell} );\n            end\n            \n        else\n            if isempty(xOld), xOld = zeros(size(x)); end\n            x0 = x + (k-1)/(k+2)*( x - xOld );\n        end\n    else\n        x0 = x;\n    end\n    \n    if isa( odata.dual, 'tfocs_tuple')\n        z0 = cell( odata.dual );\n    else\n        z0 = odata.dual;\n    end\n    \n    \n    if iscell(x)\n        n1=sqrt(sum(cellfun( @(x) norm(x(:))^2, cellfun( @minus, x, xOld,'uniformoutput',false ) )));\n        n2=sqrt(sum(cellfun( @(x) norm(x(:))^2, xOld )));\n    else\n        n1 = norm(x(:)-xOld(:));\n        n2 = norm(xOld(:));\n    end\n\n    if n1/n2 <= stopTol && verbose\n        fprintf(fid,'Continuation ending, due to convergence\\n');\n        break;\n    end\n    xOld = x;\n    if k == kMax && verbose\n        fprintf(fid,'Continuation ending, due to reaching maximum number of outer iterations\\n');\n    end\nend\n\n\nfunction out = setOpts(fieldName,default)\n    if ~isfield(contOpts,fieldName)\n        contOpts.(fieldName) = default;\n    end\n    out = contOpts.(fieldName);\nend\n\n\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/demos/SIAM_demo.m",
    "content": "%% RPCA demo using TFOCS\n% This is a demo of Robust PCA (RPCA) using <http://tfocs.stanford.edu TFOCS>. Since 2009,\n% there has been much interest in this specific RPCA formulation\n% (RPCA can refer to many different formulations; we will state\n% our formulation precisely below), but most solvers\n% assume equality constraints. One great feature of TFOCS\n% is how easy it is to prototype new formulations, so we show\n% here a formulation using inequality constraints.\n% \n% The basic (equality constraint) RPCA formulation is:\n% ( see <http://perception.csl.uiuc.edu/matrix-rank/references.html here>\n% for references )\n%     \n% $$ \\min_{S,L} \\|L\\|_* + \\lambda \\|S\\|_{\\ell_1} \\quad\\textrm{subject to}\\;L+S = X $$\n% \n% The idea is that some object $X$ can be broken into two components $X=L+S$,\n% where $L$ is low-rank and $S$ is sparse.  To tease out this separation,\n% RPCA penalizes $\\|L\\|_*$ (the nuclear norm of $L$), which is a proxy for\n% the rank of $L$.  We also penalizes $\\|S\\|_{\\ell_1}$ which is just the sum\n% of the absolute value of all the entries of the matrix $S$; this is a proxy\n% for the number of non-zero entries of $S$.\n%\n% The parameter $\\lambda$ is important, as it controls how much weight\n% to put on $S$ relative to $L$.  This parameter is not overly sensitive,\n% and we picked the value used in this demo by a few quick rounds of trial-and-error.\n%\n% _Code by Stephen Becker, May 2011_\n\n%% Inequality constraints\n% In this demo, $X$ is a video. In particular, each column of $X$ is the set\n% of $m n$ pixels from a $m \\times n$ pixel frame of the video, reshaped\n% so that it is now a vector instead of a matrix.\n%\n% The particular video we use is not compressed using a video codec, so\n% each frame of the video is stored. This leads to huge files, so to save\n% a bit of space, the value of each pixel is stored as an 8 bit number,\n% which means we can think of it as a value from $0,1,2,\\ldots,255$.  Now,\n% we may imagine that there is some \"true\" video where each pixel\n% is a _real_ number between $[0,255]$, and that we see a quantized version of it.\n% It would be nice to apply RPCA to this true version instead of applying \n% it to the quantized version.  In particular, it is unlikely that the quantized\n% version can be split nicely into a low-rank and sparse component.\n% To account for this quantization, we will ask that $S+L$ is not exactly equal\n% to $X$, but rather that $S+L$ agrees with $X$ up to the precision\n% of the quantization.  The quantization can induce at most an error of .5 in\n% the pixel value (e.g. true value is 5.6, which is rounded to 6.0, so an error of .4;\n% or a true value of 6.4, which is also rounded to 6.0, so also an error of 0.4).\n% A nice way to capture this is via the $\\ell_\\infty$ norm.\n%\n% So, the inequality constrained version of RPCA uses the same objective\n% function, but instead of the constraints $L+S=X$, the constraints are\n%\n% $$ \\|L+S-X\\|_{\\ell_\\infty} \\le 0.5. $$\n\n%% Numerical demo\n% We demonstrate this on a video clip taken from a surveillance\n% camera in a subway station.  Not only is there a background\n% and a foreground (i.e. people), but there is an escalator\n% with periodic motion.  Conventional background subtraction\n% algorithms would have difficulty with the escalator, but \n% this RPCA formulation easily captures it as part of the low-rank\n%   structure.\n% The clip is taken from the data at this website (after\n% a bit of processing to convert it to grayscale):\n% http://perception.i2r.a-star.edu.sg/bk_model/bk_index.html\n\n% Load the data:\ndisp('Please download the escalator_data.m (3.7 MB) file from:')\ndisp('  http://cvxr.com/tfocs/demos/rpca/escalator_data.mat');\nload escalator_data % contains X (data), m and n (height and width)\nX = double(X);\n\n% addpath ~/Dropbox/TFOCS/   % add TFOCS to your path, so change this to suit your computer\n\n\n%%\nnFrames     = size(X,2);\n\nlambda  = 1e-2;\n\nopts = [];\nopts.stopCrit       = 4;\nopts.printEvery     = 1;\nopts.tol            = 1e-4;\n\nopts.maxIts         = 25;\n\nopts.errFcn{1}      = @(f,d,p) norm(p{1}+p{2}-X,'fro')/norm(X,'fro');\n\nlargescale      = false;\n\nfor inequality_constraints = 0:1\n\n    \n    if inequality_constraints\n        % if we already have equality constraint solution,\n        %   it would make sense to \"warm-start\":\n%         x0      = { LL_0, SS_0 };\n        % but it's more fair to start all over:\n        x0      = { X, zeros(size(X))   };\n        z0      = [];\n    else\n        x0      = { X, zeros(size(X))   };\n        z0      = [];\n    end\n    \n    \n    obj    = { prox_nuclear(1,largescale), prox_l1(lambda) };\n    affine = { 1, 1, -X };\n    \n    mu = 1e-4;\n    if inequality_constraints\n        epsilon  = 0.5;\n        dualProx = prox_l1(epsilon);\n    else\n        dualProx = proj_Rn;\n    end\n    \n    tic\n    % call the TFOCS solver:\n    [x,out,optsOut] = tfocs_SCD( obj, affine, dualProx, mu, x0, z0, opts);\n    toc\n    \n    % save the variables\n    LL =x{1};\n    SS =x{2};\n    if ~inequality_constraints\n        z0      = out.dual;\n        LL_0    = LL;\n        SS_0    = SS;\n    end\n    \nend % end loop over \"inequality_constriants\" variable\n\n%% show all together in movie format\n% If you run this in your own computer, you can see the movie. On the webpage,\n%   we have a youtube version of the video.\n% The top row is using equality constraints, and the bottom row\n% is using inequality constraints.\n%  The first column of both rows is the same (i.e. it is the original image).\nmat  = @(x) reshape( x, m, n );\nfigure();\ncolormap( 'Gray' );\nk = 1;\nfor k = 1:nFrames\n    \n    imagesc( [mat(X(:,k)), mat(LL_0(:,k)),  mat(SS_0(:,k)); ...\n              mat(X(:,k)), mat(LL(:,k)),    mat(SS(:,k))  ] );\n  \n    axis off\n    axis image\n    \n    drawnow;\n    pause(.05); \n    \n    if k == round(nFrames/2)\n        snapnow; % Take a single still snapshot for publishing the m file to html format\n    end\nend\n\n%% Is there a difference between the two versions?\n% Compare the equality constrained version and the inequality\n%   constrained version.  To do this, we can check whether\n%   the \"L\" components are really low rank\n%   and whether the \"S\" components are really sparse.\n% Even if the two versions appear visually similar, the variables\n%   may behave quite differently with respect to low-rankness\n%   and sparsity.\n\nfprintf('\"S\" from equality constrained version has  \\t%.1f%% nonzero entries\\n',...\n    100*nnz(SS_0)/numel(SS_0) );\nfprintf('\"S\" from inequality constrained version has  \\t%.1f%% nonzero entries\\n',...\n    100*nnz(SS)/numel(SS) );\n\ns  = svd(LL);    % inequality constraints\ns0 = svd(LL_0);  % equality constraints\n\nfprintf('\"L\" from equality constrained version has numerical rank\\t %d (of %d possible)\\n',...\n    sum( s0>1e-6), min( m*n, nFrames)  );\nfprintf('\"L\" from inequality constrained version has numerical rank\\t %d (of %d possible)\\n',...\n    sum( s > 1e-6), min( m*n, nFrames)  );\n\nfigure();\nsemilogy( s0 ,'o-') \nhold all;\nsemilogy( s ,'o-')\nlegend('Equality constraints','Inequality constraints');\nxlabel('sorted singular value location');\nylabel('value of singular value');\ntitle('Comparison of RPCA using equality and inequality constraints');\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/demos/callandmap.m",
    "content": "function varargout = callandmap(fcn, ix, varargin)\n%CALLANDMAP Call a function and rearrange its output arguments\n% varargout = callandmap( fcn, ix, varargin )\n%\n% Suggested here:\n%   http://stackoverflow.com/questions/3673392/define-anonymous-function-as-2-of-4-outputs-of-m-file-function\n\ntmp = cell(1,max(ix));        % Capture up to the last argout used\n[tmp{:}] = fcn(varargin{:});  % Call the original function\nvarargout = tmp(ix);          % Remap the outputs\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/demos/demo_MatrixCompletion.m",
    "content": "%% Matrix completion demo\n% This short demo shows how to use TFOCS to perform nuclear norm minimization.\n% Nuclear norm minimization is used for recovering all the entries of \n% a partially observed low-rank matrix.\n\n%% Setup a problem\nrng(234923);    % for reproducible results\nN   = 16;       % the matrix is N x N\nr   = 2;        % the rank of the matrix\ndf  = 2*N*r - r^2;  % degrees of freedom of a N x N rank r matrix\nnSamples    = 3*df; % number of observed entries\n\n% For this demo, we will use a matrix with integer entries\n% because it will make displaying the matrix easier.\niMax    = 5;\nX       = randi(iMax,N,r)*randi(iMax,r,N); % Our target matrix\n\n%%\n% Now suppose we only see a few entries of X. Let \"Omega\" be the set\n% of observed entries\nrPerm   = randperm(N^2); % use \"randsample\" if you have the stats toolbox\nomega   = sort( rPerm(1:nSamples) );\n\n%%\n% Print out the observed matrix in a nice format.\n% The \"NaN\" entries represent unobserved values. The goal\n% of this demo is to find out what those values are!\n\nY = nan(N);\nY(omega) = X(omega);\ndisp('The \"NaN\" entries represent unobserved values');\ndisp(Y)\n\n%% Matrix completion via TFOCS\n% We use nuclear norm relaxation.  There are strong theorems that\n% show this relaxation will usually give you the *exact* original low-rank\n% matrix provided that certain conditions hold. However, these\n% conditions are generally not possible to check 'a priori',\n% so I cannot guarantee that this will work. But by choosing\n% enough measurements, it becomes increasingly likely to work.\n\n% Add TFOCS to your path (modify this line appropriately):\naddpath ~/Dropbox/TFOCS/\n\nobservations = X(omega);    % the observed entries\nmu           = .001;        % smoothing parameter\n\n% The solver runs in seconds\ntic\nXk = solver_sNuclearBP( {N,N,omega}, observations, mu );\ntoc\n\n%%\n% To display the recovered matrix, let's round it to the nearest\n% .0001 so that it displays nicely:\ndisp('Recovered matrix (rounding to nearest .0001):')\ndisp( round(Xk*10000)/10000 )\n\n% and for reference, here is the original matrix:\ndisp('Original matrix:')\ndisp( X )\n\n% The relative error (without the rounding) is quite low:\nfprintf('Relative error, no rounding: %.8f%%\\n', norm(X-Xk,'fro')/norm(X,'fro')*100 );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/demos/demo_SVM.m",
    "content": "%%   Support Vector Machine (SVM) example\n%\n%     We have binary data, and the two classes are labeled +1 and -1.\n%     The data is d-dimensional, and we have n samples\n% \n% \n%     This example show show to solve the standard SVM using the hinge-loss\n%     and l2 penalty. Then it shows how it is easy with TFOCS to generalize\n%     the SVM problem and use the l1 penalty instead of the l2 penalty,\n%     which has the effect of encouraging sparsity.\n% \n%     For a more detailed example, see the /examples/largescale/demo_SVM.m\n%     code in the TFOCS release.\n\n% Before running this, please add the TFOCS base directory to your path\naddpath ~/Dropbox/TFOCS/\n\n%% Generate a new problem\n\nrandn('state',23432);\nrand('state',3454);\n\nn = 30;\nd = 2; % 2D data is nice because it's easy to visualize\n\nn1 = round(.5*n);   % number of -1 (this is data from one \"class\")\nn2 = n - n1;        % number of +1 (this is data from the other \"class\")\n\n% Generate data\nmean1   = [-.5,1];\n% mean2   = [.6,.2]; % can be separated\nmean2   = [.1,.5]; % cannot be separated, so a bit more interesting\ns       = .25;  % standard deviation\nx1  = repmat(mean1,n1,1) + s*randn(n1,2);\nx2  = repmat(mean2,n2,1) + s*randn(n2,2);\n\nX = [x1; x2];\nlabels = [ ones(n1,1); -ones(n2,1) ];\n\n% Plot the data:\nfigure(1); clf;\nhh = {};\nhh{1}=plot(x1(:,1), x1(:,2), 'o' );\nhold all\nhh{2}=plot(x2(:,1), x2(:,2), '*' );\nlegend('Class 1','Class 2');\nxl = get(gca,'xlim');\nyl = get(gca,'ylim');\nlegend([hh{1:2}],'Class 1','Class2');\n%% Introduce the SVM problem formulations\n% The hinge-loss can be defined in Matlab as:\nhinge = @(x) sum(max(0,1-x));\n%%\n% To see what it looks like:\ngrid = linspace(-2,2,30);\nfigure(2); \nplot( grid, max(0,1-grid) )\nylim( [-.5,3] ); set(gcf,'Position',[100,100,350,250] );\n%%\n% Then the standard SVM in primal form is the following:\n%\n% minimize_{m,b} hinge( labels.*( X*m - b ) ) + lambda_A*norm(m,2)\n%\n% where X is the data matrix (dimensions n x d ), m is the slope (dimension d x 1 ),\n% and b is an offset (dimension 1 for our example).\n% \n% To put this in a more amenable format, introduce the variable \"a\"\n% and let a = [m;b], so \"a\" has dimensions (d+1) x 1.\n% Then we can express \"X*m-b\" as \"[X,-ones(n,1)]*a\".\n% For this reason, we introduce the following linear operator:\nlinearF     = diag(labels)*[ X, -ones(n,1) ];\n\n%%\n% So now, the problem is:\n%\n% minimize_{a} hinge( linearF*a ) + lambda_A*norm( [ones(d,1); 0] * a )\n%\n% (in the \"norm\" term, we want a 0 term in front of a(d+1) since we \n% do not wish to penalize the norm of the constant offset).\n%\n% A reasonable value of lambda_A is:\nlambda_A    = 10;\n\n%% Introduce the sparse SVM formulation\n% The sparse SVM is designed to induce sparsity in the slope variable\n% m by replacing the lambda_A*norm(m,2) term with a lambda_B*norm(m,1)\n% term, since the l1 term drives small coefficients to zero.\n% Here's a reasomable value for lambda_B:\nlambda_B    = 4;\n\n%% Solve SVM\nmu          = 1e-2;     % smoothing parameter\n%%\n% Dualize the hinge loss and the l2 terms:\nprox        = { prox_hingeDual(1,1,-1), proj_l2(lambda_A) };\n%%\n% Make the affine operator:\noffset1     = [];\nlinearF2    = diag( [ones(d,1);0] );\noffset2     = [];\naffineF     = { linearF, offset1; linearF2, offset2 };\nak          = tfocs_SCD([],affineF, prox, mu);\n\n%% \n% Plot\nm       = ak(1:2); % slope\nb       = ak(3);   % intercept\ngrid    = linspace(-.5,1,100);\nfigure(1);\nhh{3}   = plot( grid, (b-m(1)*grid)/m(2) );\nxlim(xl); ylim(yl);\nlegend([hh{1:3}],'Class 1','Class2','SVM');\n\n%% Solve Sparse SVM\nPROBLEM     = 2;\nmu          = 1e-2;     % smoothing parameter\nopts        = [];\nopts.tol    = 1e-3;\n%%\n% Dualize the hinge loss to get 'prox_hingeDual'\n% For the hingeDual, scale by -1 since we want polar cone, not dual cone\n% Dualize the l1 term to get the linf term\nprox        = { prox_hingeDual(1,1,-1), proj_linf(lambda_B) };\nlinearF2    = diag( [ones(d,1);0] );\nak          = tfocs_SCD([],{linearF,[];linearF2,[]}, prox, mu,[],[],opts);\n\n%% \n% Plot\nm       = ak(1:2); % slope\nb       = ak(3);   % intercept\ngrid    = linspace(-.5,1,100);\nhh{4}   = plot( grid, (b-m(1)*grid)/m(2) );\nxlim(xl); ylim(yl);\nlegend([hh{:}],'Class 1','Class2','SVM','sparse SVM');\n\n%%\n% You can see that the sparse SVM hyperplane is vertical! This is because\n% only the x-component is zero, and only the y-component is non-zero.\n% So it is \"sparse\" (though in this 2D example, \"sparsity\" doesn't mean\n% much).  For larger dimensional data, the idea is that identifying\n% a hyperplane that only has a few non-zeros will allow you to identify\n% which dimensions are actually important.\n\n%%\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/demos/demo_alternatingProjections.m",
    "content": "%% Projection onto the intersection of two sets \n% Our goal is to find a point in the intersection of two convex sets C1 and C2.\n% A similar goal is to find the projection of an arbitrary point onto the \n% intersection (or if the intersection is empty, find the point(s) in C1\n% that are as close as possible to C2). In this demo, the intersection\n% of C1 and C2 is a singleton, so the concepts are the same.\n%\n% We assume that we know how to project on the sets C1 and C2 individually,\n% but not onto C1 intersect C2.\n%\n% The basic algorithm to solve this problem is the alternating projection method,\n% first studied by John von Neumann for the case where C1 and C2 are affine\n% spaces. This algorithm can be extended to arbitrary convex sets, although\n% you may not converge to the *projection* of the original point.\n%\n% This algorithm is very simple: starting at some point y, and with x <-- y,\n% we update\n%   x <-- Proj_{C1}( Proj_{C2}( x ) )\n% where Proj_{C1} is the projector onto the set C1.\n%\n% Better methods (which actually give you the projection of y onto the intersection)\n% are based on Dykstra's algorithm (not to be confused with the Dijkstra algorithm\n% described here: http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm ).\n%\n% Dykstra's algorithm also uses only Proj_{C1} and Proj_{C2}, but with a few\n% intermediate steps. For an overview, see the 2011 book by Raydan:\n% http://www.amazon.com/Alternating-Projection-Methods-Fundamentals-Algorithms/dp/1611971934\n%\n% Another overview of both alternating projection and Dykstra are in the book chapter\n% \"Proximal splitting methods in signal processing\" by P. L. Combettes and J.-C. Pesquet, \n% in the book 'Fixed-Point Algorithms for Inverse Problems in Science and Engineering',\n% (ed.: H. H. Bauschke, R. S. Burachik, P. L. Combettes, V. Elser, D. R. Luke, and \n% H. Wolkowicz, Editors), pp. 185-212. Springer, New York, 2011.\n% The chapter can be downloaded at http://www.ann.jussieu.fr/~plc/prox.pdf\n%\n% The purpose of this demo is to show the above two methods, and also\n% how to formulate this with TFOCS. The advantage of solving this with TFOCS\n% is that we can use an accelerated solver (Nesterov-style) and use large\n% step-sizes and line search (whereas Dykstra has no step-size parameter).\n% In the first example, it is especially apparent that TFOCS avoids\n% the slow convergence that both the alternating projection and Dykstra\n% algorithms suffer from. In the second example, the performance\n% of alternating projections and TFOCS are quite similar.\n\n%% Mathematical formulation\n% For a given point y, and two convex sets C1 and C2, we wish to find\n% the closest point x to y, such that x is in both C1 and C2. We write this\n% as:\n%\n% $$ \\textrm{minimize}_{x\\in C_1 \\cap C_2} \\,\\, \\mu/2||x\\textrm{--}y||_2^2 $$\n%\n% The parameter $\\mu > 0$ is arbitrary and does not affect the answer.\n%\n% This fits naturally into the TFOCS formulation since the primal\n% problem is already strongly convex.\n\n\n\n%% Demo with two polygon sets in 2D that intersect at (0,0)\n% Set the dimension to 2\nN = 2;  % 2D is best for visualization\n\n%%\n% Define some 2D polygons\n\nmx = 1;\nx1a = [1;.1];\nx1b = [1;.2];\nxx1 = [0,x1a(1),2*mx,x1b(1)];\nyy1 = [0,x1a(2),2*mx,x1b(2)];\n\n\nx2a = [1;.3];\nx2b = [1;.35];\nxx2 = [0,x2a(1),2*mx,x2b(1)];\nyy2 = [0,x2a(2),2*mx,x2b(2)];\n\n%%\n% The solution is at x = (0,0), so our error function is simple\n\nerr = @(x) norm(x);\n%%\n% plot the regions\n\nfigure\nred = [255,153,153]/255;\nblue = [204,204,255]/255;\nfill( xx1, yy1,red); \nhold on\nfill( xx2, yy2,blue); \n\nxlim( [0,mx] ); ylim( [0,.5*mx] ); \naxis equal\ntext(.5,.07,'set C1');\ntext(.5,.22,'set C2');\n\n%%\n% Make some operators that will be used with TFOCS\n\naddpath ~/Dropbox/TFOCS/  % modify this to wherever it is installed on your computer\nop1     = project2DCone(x1a, x1b );\nop2     = project2DCone(x2a, x2b );\n\noffset1 = 0;\noffset2 = 0;\nop1_d   = prox_dualize(op1);\nop2_d   = prox_dualize(op2);\n\n% and some simpler operators that we will use with alternating projections\n%   and with Dykstra\nproj1   = @(x) callandmap( op1, 2, x, 1); % gamma is irrelevant\nproj2   = @(x) callandmap( op2, 2, x, 1 ); % gamma is irrelevant\n\n% for all methods, we need to specify a starting point\n\nx0      = [1; 1/4];\n\n\n%% solve in TFOCS\n% We can pick any mu and should get the same result, although due to \n% some scaling issues in stopping criteria, it does have a small effect.\nmu = 1e-6; \n\nopts    = struct('debug',false,'printEvery',20,'maxIts',200);\nopts.errFcn{1}  = @(f,d,x) err(x);\nopts.errFcn{2}  = @(f,d,x) recordPoints(x);\nrecordPoints(); % zero-out counter. We use this to plot the points later\n\nopts.tol        = 1e-15;\n\naffineOperator  = {eye(N),offset1;eye(N),offset2};\ndualProx        = {op1_d,op2_d};\n% Solve in TFOCS:\n[x,out,optsOut] = tfocs_SCD( [], affineOperator, dualProx , mu, x0, [], opts );\n\n% Record the path:\npath    = recordPoints();\npath    = [x0,path];\n\nfigure\nsubplot(1,2,1);\nfill( xx1, yy1,red); \nhold on\nfill( xx2, yy2,blue); \nxlim( [0,mx] ); ylim( [0,.5*mx] ); \ntext(.5,.07,'set C1');\ntext(.5,.22,'set C2');\nplot( path(1,:), path(2,:),'ko-','linewidth',2 )\ntitle('Path for TFOCS solving the intersection of 2 polygons');\n\nsubplot(1,2,2);\nsemilogy( out.err(:,1) ,'o-'); xlabel('iterations'); ylabel('error');\ntitle('Error for TFOCS method');\nset(gcf, 'Position', [400 200 800 400]);\n%% solve via alternating projection method\nmaxIts  = 500;\nx       = x0;\npath    = [x0];\nerrHist = [];\nfor k = 1:maxIts\n    % basic alternating projection method:\n    x   = proj1(x);\n    path= [path, x];\n    x   = proj2(x);\n    path= [path, x];\n    errHist     = [ errHist; err(x) ];\n    if ~mod(k,50)\n        fprintf('Iter %4d, error is %.2e\\n', k, errHist(end) );\n    end\nend\nfigure\nsubplot(1,2,1);\nfill( xx1, yy1,red); \nhold on\nfill( xx2, yy2,blue); \nxlim( [0,mx] ); ylim( [0,.5*mx] ); \ntext(.5,.07,'set C1');\ntext(.5,.22,'set C2');\nplot( path(1,:), path(2,:),'ko-','linewidth',1 )\ntitle('Path for alternating projection method solving the intersection of 2 polygons');\n\nsubplot(1,2,2);\nsemilogy( errHist, 'o-' ); xlabel('iterations'); ylabel('error');\nerrHist_1 = errHist;\ntitle('Error for alternating projection method');\nset(gcf, 'Position', [400 200 800 400]);\n%% solve via Dykstra's algorithm\n\nmaxIts  = 500;\nx       = x0;\n[p,q]   = deal( 0*x0 );\np       = -.25*[1;1];\npath    = [x0];\nerrHist = [];\nfor k = 1:maxIts\n    % If x + p is feasible, the y = (x+p), so p=x+p-y = 0.\n    y   = proj1( x + p );\n    p   = x + p - y;\n    x   = proj2( y + q );\n    q   = y + q - x;\n    path = [path,y,x];\n    errHist     = [ errHist; err(x) ];\n    if ~mod(k,50)\n        fprintf('Iter %4d, error is %.2e\\n', k, errHist(end) );\n    end\nend\nfigure\nsubplot(1,2,1);\nfill( xx1, yy1,red); \nhold on\nfill( xx2, yy2,blue); \nxlim( [0,mx] ); ylim( [0,.5*mx] ); \ntext(.5,.07,'set C1');\ntext(.5,.22,'set C2');\nplot( path(1,:), path(2,:),'ko-' )\ntitle('Path for Dykstra''s algo solving the intersection of 2 polygons');\n\nsubplot(1,2,2);\nsemilogy( errHist, 'o-' ); xlabel('iterations'); ylabel('error');\ntitle('Error for Dykstra''s method');\nset(gcf, 'Position', [400 200 800 400]);\n\n%%\n% With Dykstra's algo (and alternating projections), we get\n% very slow convergence, because of the very low angle between the\n% two sets. Here is a zoom in on the graph of the iterates:\nfigure\nfill( xx1, yy1,red); \nhold on\nfill( xx2, yy2,blue); \nxlim( [0,mx] ); ylim( [0,.5*mx] ); \ntext(.5,.07,'set C1');\ntext(.5,.22,'set C2');\nplot( path(1,:), path(2,:),'ko-' )\ntitle('Path for Dykstra''s algo solving the intersection of 2 polygons (zoom)');\nxlim( [.25,.4] );\nylim( [.058,.1])\n%% Plot all the errors together\nfigure\nsemilogy( out.err(:,1),'-' ,'linewidth',3);\nhold all\nsemilogy( errHist_1,'-','linewidth',3);\nsemilogy( errHist,'--','linewidth',3);\nlegend('TFOCS','Alternating projection','Dykstra');\nxlabel('iteration'); ylabel('error');\n%% Demo with two circles that intersect at (0,0)\ncenter1     = [0;.5];\nradius1     = .5;\ncenter2     = -center1;\nradius2     = radius1;\n\nfigure\nrectangle('Position',[-radius1,0,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',red)\nrectangle('Position',[-radius1,-2*radius2,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',blue)\naxis equal\nhold on\ntext(0,.5,'set C1');\ntext(0,-.5,'set C2');\n\n\noffset1     = center1;\noffset2     = center2;\n\nop1_d       = prox_l2(radius1);\nop2_d       = prox_l2(radius2);\nx0          = [1; .2];\n\n% and some simpler operators that we will use with alternating projections\n%   and with Dykstra\nproj1   = @(x) radius1*(x-center1)/norm(x-center1) + center1;\nproj2   = @(x) radius2*(x-center2)/norm(x-center2) + center2;\n%% solve in TFOCS\nopts.maxIts     = 300;\naffineOperator  = {eye(N),offset1;eye(N),offset2};\ndualProx        = {op1_d,op2_d};\n% Solve in TFOCS:\n[x,out,optsOut] = tfocs_SCD( [], affineOperator, dualProx , mu, x0, [], opts );\n\n% Record the path:\npath    = recordPoints();\npath    = [x0,path];\n% Plot:\nfigure\nsubplot(1,3,1);\nrectangle('Position',[-radius1,0,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',red)\nrectangle('Position',[-radius1,-2*radius2,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',blue)\nhold on\ntext(0,.5,'set C1');\ntext(0,-.5,'set C2');\nplot( path(1,:), path(2,:),'ko-','linewidth',2 )\ntitle('Path for TFOCS solving the intersection of 2 circles');\n\nsubplot(1,3,2);\nrectangle('Position',[-radius1,0,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',red)\nrectangle('Position',[-radius1,-2*radius2,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',blue)\nhold on\nplot( path(1,:), path(2,:),'ko-','linewidth',2 )\nxlim([0,.15]);\nylim([-.1,.1]);\ntitle('(zoom)');\n\nsubplot(1,3,3);\nsemilogy( out.err,'o-')\ntitle('Error of iterates for TFOCS method');\nset(gcf, 'Position', [400 200 800 400]);\n%% solve via alternating projection method\nmaxIts  = 300;\nx       = x0;\npath    = [x0];\nerrHist = [];\nfor k = 1:maxIts\n    % basic alternating projection method:\n    x   = proj1(x);\n    path= [path, x];\n    x   = proj2(x);\n    path= [path, x];\n    errHist     = [ errHist; err(x) ];\n    if ~mod(k,50)\n        fprintf('Iter %4d, error is %.2e\\n', k, errHist(end) );\n    end\nend\nfigure\nsubplot(1,3,1);\nrectangle('Position',[-radius1,0,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',red)\nrectangle('Position',[-radius1,-2*radius2,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',blue)\nhold on\ntext(0,.5,'set C1');\ntext(0,-.5,'set C2');\nplot( path(1,:), path(2,:),'ko-' )\ntitle('Path for alternating projection method solving the intersection of 2 circles');\n\nsubplot(1,3,2);\nrectangle('Position',[-radius1,0,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',red)\nrectangle('Position',[-radius1,-2*radius2,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',blue)\nhold on\nplot( path(1,:), path(2,:),'ko-','linewidth',2 )\nxlim([0,.15]);\nylim([-.1,.1]);\ntitle('(zoom)');\n\nsubplot(1,3,3);\nsemilogy( errHist,'o-')\nerrHist_1 = errHist;\ntitle('Error of iterates for alternating projection method');\nset(gcf, 'Position', [400 200 800 400]);\n%% solve via Dykstra's algorithm\n\nmaxIts  = 300;\nx       = x0;\n[p,q]   = deal( 0*x0 );\npath    = [x0];\nerrHist = [];\nfor k = 1:maxIts\n    % If x + p is feasible, the y = (x+p), so p=x+p-y = 0.\n    y   = proj1( x + p );\n    p   = x + p - y;\n    x   = proj2( y + q );\n    q   = y + q - x;\n    path = [path,y];\n    path = [path,x];\n    errHist     = [ errHist; err(x) ];\n    if ~mod(k,50)\n        fprintf('Iter %4d, error is %.2e\\n', k, errHist(end) );\n    end\nend\nfigure\nsubplot(1,3,1);\nrectangle('Position',[-radius1,0,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',red)\nrectangle('Position',[-radius1,-2*radius2,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',blue)\nhold on\ntext(0,.5,'set C1');\ntext(0,-.5,'set C2');\nplot( path(1,:), path(2,:),'ko-' )\ntitle('Path for Dykstra''s algo solving the intersection of 2 circles');\n\nsubplot(1,3,2);\nrectangle('Position',[-radius1,0,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',red)\nrectangle('Position',[-radius1,-2*radius2,2*radius1,2*radius1],'Curvature',[1,1],'FaceColor',blue)\nhold on\nplot( path(1,:), path(2,:),'ko-','linewidth',2 )\nxlim([0,.15]);\nylim([-.1,.1]);\ntitle('(zoom)');\n\nsubplot(1,3,3);\nsemilogy( errHist,'o-')\ntitle('Error of iterates for Dykstra''s algo');\nset(gcf, 'Position', [400 200 800 400]);\n\n%% Plot all the errors together\nfigure\nsemilogy( out.err(:,1),'-' ,'linewidth',3);\nhold all\nsemilogy( errHist_1,'-','linewidth',3);\nsemilogy( errHist,'--','linewidth',3);\nlegend('TFOCS','Alternating projection','Dykstra');\nxlabel('iteration'); ylabel('error');\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/demos/project2DCone.m",
    "content": "function op = project2DCone(x1, x2 )\n% OP = project2DCone( y, x1, x2 )\n%   represents the 2D point cone defined\n%   by the vectors x1 and x2. x1 should be \"left\" of x2,\n%   and the cone is defined as the region to the right\n%   of x1 and to the left of x2.\n\nerror(nargchk(1,2,nargin));\nif nargin < 2, u = []; end\n%op = @proj_Rplus_impl;\n% bugfix, March 2011:\nop = @(varargin)proj_cone2(x1,x2,varargin{:});\n\nfunction [v,x] = proj_cone2(x1,x2,y,t)\n% \"t\" doesn't matter, since the only values are 0 and Inf\nv = 0;\nif size(y,2) > 1, y = y.'; end\n\n% Assume that \"x1\" is active\nn1 = [x1(2); -x1(1)]; % the normal direction\nt1 = -y'*n1/(n1'*n1);\n\n\n% Now assume \"x2\" is active:\nn2 = [x2(2); -x2(1)];\nt2 = -y'*n2/(n2'*n2);\n\nswitch nargin,\n    case 3,\n        if nargout == 2,\n            error( 'This function is not differentiable.' );\n        end\n        if ( t1 > 0 ) && ( t2 < 0 )\n            v = 0;\n        else\n            v = Inf;\n        end\n    case 4,\n        if y'*x1 <= 0 && y'*x2 <= 0\n            x = 0*y; v = 0;\n            return;\n        end\n        \n        p1 = y + t1*n1;\n        p2 = y + t2*n2;\n        \n        % now determine which one is active:\n        if p1'*x1 < 0\n            % p1 cannot be active\n            x = p2;\n        elseif p2'*x2 < 0\n            % p2 cannot be active\n            x = p1;\n        elseif ( t1 > 0 ) && ( t2 < 0 )\n            % we are feasible!\n            x = y;\n        else\n            % both could be active, so pick the best:  \n            if norm( p1 - y ) < norm( p2 - y )\n                x = p1;\n            else\n                x = p2;\n            end\n        end\n\n\n\totherwise,\n\t\terror( 'Wrong number of arguments.' );\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/demos/recordPoints.m",
    "content": "function er = recordPoints( x )\n\npersistent history\n\nif nargin == 0\n    er = history;\n    history = [];\n    return;\nend\n\nhistory = [history, x ];\ner  = 0;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/PsiTransposeWFF.m",
    "content": "function y = PsiTransposeWFF(x,w_type,log_length,min_scale,max_scale,shift_redundancy,freq_redundancy, PLOT)\n% Windowed Fourier Frame Analysis\n% y = PsiTransposeWFF( x, w_type, log_length, min_scale, max_scale,...\n%       shift_redundancy, freq_redundancy, plot )\n%   w_type is the type of window.  Currently, this supports 'isine' (iterate sine)\n%   and 'gaussian'.  Default: 'isine' (to use default, set this to [] ).\n%\n% Core code written by Peter Stobbe; modifications by Stephen Becker\nif isempty(w_type), w_type = 'isine'; end\nif nargin < 8 || isempty(PLOT), PLOT = false; end\n\n% w is a is a vector of with the window of the largest scale\n% smaller scale windows are just this subsampled\n[w, window_redundancy] = make_window(max_scale,w_type);\n\ny = [];\nc = ((max_scale - min_scale + 1)*window_redundancy*2.^((1:max_scale)'+freq_redundancy+shift_redundancy)).^-.5;\n  \n    \nfor k = min_scale:max_scale\n    M = 2^(log_length-k) +(2^(log_length-k)+1)*(2^shift_redundancy-1);\n    z = [myRepMat(x,2^shift_redundancy); zeros(2^k - 2^(k-shift_redundancy),2^shift_redundancy)];\n    z = reshape(z,2^k,M);\n    z = z.*myRepMat(w(2^(max_scale-k)*(1:2^k)'),M);\n    z(2^(k+freq_redundancy),M) = 0;\n    z = fft(z);\n    z = [z(1,:)*c(k);       real(z(2:end/2,:))*c(k-1); ...\n        z(end/2+1,:)*c(k); imag(z(end/2+2:end,:))*c(k-1)];\n    y = [y; z(:)];\nend\n\nfunction B = myRepMat(A,n)\nB = A(:,ones(n,1));\n\nfunction [w,window_redundancy] = make_window(max_scale,w_type)\n% [w,window_redundancy] = make_window(max_scale,w_type)\n%   w_type can be\n%       'isine' for iterated sine\n%       'gaussian' for gaussian\n%       'trapezoid' for trapezoidal shape (not a frame)\n\nx = (1:2^max_scale)'/2^(max_scale-1)-1;\nif isequal(w_type,'isine')\n    w = sin(pi/4*(1+cos(pi*x)));\n    window_redundancy = 1/2;\nelseif isequal(w_type,'gaussian')\n    w = exp(-x.^2*8*log(2));\n    window_redundancy = mean(w.^2);\nelseif isequal(w_type,'trapezoid')\n    w = min(1,2*(1-abs(x)));\n    window_redundancy = mean(w.^2);\nelse\n    disp('Error in make_window: unknown window type');\n    disp('Options are: isine, gaussian, trapezoid');\nend\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/PsiWFF.m",
    "content": "function x = PsiWFF(y,w_type,log_length,min_scale,max_scale,shift_redundancy,freq_redundancy);\n% Windowed Fourier Frame Synthesis\n% x = PsiWFF(y,w_type,log_length,min_scale,max_scale,shift_redundancy,freq_redundancy);\n%   w_type is the type of window.  Currently, this supports 'isine' (iterate sine)\n%   and 'gaussian'.  Default: 'isine' (to use default, set this to [] ).\n% written by Peter Stobbe, modified by Stephen Becker\n\nif isempty(w_type), w_type = 'isine'; end\n\n% w is a is a vector of with the window of the largest scale\n% smaller scale windows are just this subsampled\n[w, window_redundancy] = make_window(max_scale,w_type);\n\nx = zeros(2^log_length,1);\nc = ((max_scale - min_scale + 1)*window_redundancy*2.^((1:max_scale)'+freq_redundancy+shift_redundancy)).^-.5;\ncur = 0;\n\n\nfor k = min_scale:max_scale\n    M = 2^(log_length-k) +(2^(log_length-k)+1)*(2^shift_redundancy-1);\n    N = 2^(k+freq_redundancy);\n    z = reshape(y(cur + (1:N*M)),N,M);\n    cur = cur + N*M;\n    z = [z(1,:)*c(k);     z(2:N/2,:)*c(k-1);...\n        z(N/2+1,:)*c(k); -1i*z(N/2+2:N,:)*c(k-1)];\n    z = real(fft(z));\n    z = z(1:2^k,:).*myRepMat(w(2^(max_scale-k)*(1:2^k)),M);\n    z = reshape(z,[],2^shift_redundancy);\n    x = x + sum(z(1:2^log_length,:),2);\nend\n\n\n%---------------\n\nfunction B = myRepMat(A,n)\nB = A(:,ones(n,1));\n\nfunction [w,window_redundancy] = make_window(max_scale,w_type)\n% [w,window_redundancy] = make_window(max_scale,w_type)\n%   w_type can be\n%       'isine' for iterated sine\n%       'gaussian' for gaussian\n%       'trapezoid' for trapezoidal shape (not a frame)\n\nx = (1:2^max_scale)'/2^(max_scale-1)-1;\nif isequal(w_type,'isine')\n    w = sin(pi/4*(1+cos(pi*x)));\n    window_redundancy = 1/2;\nelseif isequal(w_type,'gaussian')\n    w = exp(-x.^2*8*log(2));\n    window_redundancy = mean(w.^2);\nelseif isequal(w_type,'trapezoid')\n    w = min(1,2*(1-abs(x)));\n    window_redundancy = mean(w.^2);\nelse\n    disp('Error in make_window: unknown window type');\n    disp('Options are: isine, gaussian, trapezoid');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/example_quantumTomography.m",
    "content": "%{\n    5/28/09, 10/28/10\n    pauli-matrix tensor measurements\n    Stephen Becker, srbecker@caltech.edu\n\n    See http://arxiv.org/abs/0909.3304\n\nWe seek to find a low-rank matrix X, because X represents the quantum state\nof d atoms (X has dimensions n x n where n = 2^d, due to quantum entanglement).\nX is Hermitian and positive semi-definite, and furthermore trace(X) = 1.\n\nFrom experiments, we have measurements b_i = < A_i, X > where <,> is the \ntrace inner product.    A_i is a Hermitian matrix, and is a tensor product\nof Pauli matrices.  The observations are noisy.\n\nTo recover X, we can consider solving several related variants:\n\nnotation:\nx = vec(X), X = mat(x)\n\n\n        minimize     1/2||A*x - b ||^2\n        subject to\n                    mat(x) >= 0\n                    trace(mat(x)) <= 1\n\n(this variant does not require smoothing)\n\nor\n\n        minimize    trace(mat(x))\n        subject to\n                    mat(x) >= 0\n                    ||A*x - b || <= eps\n(this variant requires smoothing and/or continuation )\n\n%}\n%% Setup a matrix\nrandn('state',2009);\nrand('state',2009);\n\n% -- Generate the state matrix \"M\" (aka rho)\nn1 = 128;  % fast\n% n1 = 256;\n% n1 = 512;  % works, but slow\nn2 = n1; r = 2;\nM = ( randn(n1,r) + 1i*randn(n1,r) )*...\n    ( randn(r,n2) + 1i*randn(r,n2) )/2;\nM=M*M';             % M is Pos. Semidefinite\nM = M / trace(M);   % and has trace 1\n\ndf = r*(n1+n2-r);   % The degrees of freedom\noversampling = 5;   % Information-theoretic limit corresponds\n                    % to oversampling = 1\nm = min(5*df,round(.99*n1*n2) ); \n\nfprintf('%d x %d matrix, %d measurements (%.1f%%, or %.1f oversampling)\\n',...\n    n1,n2,m,100*m/(n1*n2),m/df );\nfprintf('True rank is %d\\n', r);\nif ~isreal(M), fprintf('Matrix is complex\\n'); end\n\nvec = @(x) x(:);\nmat = @(x) reshape(x,n1,n2);\n\n%% make some pauli matrices, to use for observations\n%{\nUsing the convention:\n PX = [0,1;1,0]; PY = [0,-1i;1i,0]; PZ =[1,0;0,-1]; PI = eye(2);\n X will be labelled \"1\", Y labeled \"2\", Z \"3\" and I \"4\"\n%}\nmyRandint = @(M,N,d) ceil(d*rand(M,N));\n\nPAULI_T = sparse([],[],[],n1*n2,m,m*n1 );\nfprintf('Taking measurements...      ');\nfor i=1:m\n    fprintf('\\b\\b\\b\\b\\b\\b%5.1f%%', 100*i/m );\n    % pick from the X, Y, Z and I uniformly at random\n    list = myRandint( log2(n1),1,4 );\n    E_i = explicitPauliTensor( list );\n    % NOTE: with this definition, E_i is Hermitian,\n    % but not positive semidefinite, and not scaled properly.\n    \n    PAULI_T(:,i) = E_i(:);  % access via column is MUCH faster\nend\nfprintf('\\n');\nPAULI = PAULI_T.';      % transpose it, since we were implicitly\nclear PAULI_T           % dealing with transpose earlier\n                        % (since updating the columns of a sparse\n                        % matrix is much more efficient than updating\n                        % the rows )   \n                        \nfprintf('Computing the scaling factor...');\n% scale = 1/normest(PAULI*PAULI',1e-2);\n% scale = 1/my_normest( @(x) PAULI*(PAULI'*x), size(PAULI,1)*[1,1] );\nfprintf(' done.\\n');\n\ndata = PAULI*vec(M);\n% even if measurements are complex, data should still be real\nfprintf('due to roundoff, measurements have %.2e imaginary part\\n',...\n    norm(imag(data))/norm(data) );\ndata = real(data);\n\n%% Add some noise\n%{\n    Physics of noise:\n        in addition to noise from measurement error, we have a dominant\n        source of 'noise' which is because the outcome of our\n        measurements is really the result of measuring a quantum wave\n        function.  Experimentalists will repeat the same\n        measurement many times, so they can estimate the true state,\n        but there is inherent quantum mechanical uncertainty to this.\n        Basically, we have a state that is determined by a Bernoulli\n        parameter 0 < p < 1, but the measurement returns either 0 or 1,\n        so we have to take a lot of measurements to estimate p.\n\n        There's also depolarizing noise, which we don't discuss here.\n\n    For simplicity in this example, we don't worry about that model,\n    and just add in some pseudo-random white noise\n%}\n\nmyAwgn = @(x,snr) x + ...\n    10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\nsnr = 40;\nb = myAwgn( data, snr );\nrms = @(x) norm(x)/sqrt(length(x));\nsnrF = @(sig,noise) 20*log10( rms(sig)/rms(noise) );\nsigma = std( b - data );\nfprintf('SNR of measurements is %.1f dB, and std of noise is %.2f\\n',...\n    snrF(data,data-b), sigma );\n%% Solve in TFOCS\n%{\n\nFormulation:\n        minimize     1/2||PAULI*x - b ||^2\n        subject to\n                    mat(x) >= 0\n                    trace(mat(x)) <= 1\n\nNo smoothing is required, but... it's hard to exploit the low-rank\nstructure of the problem\n\nWe do not expect the \"error\" to go to zero, since the data are noisy\nand we don't have the true answer, so we're not really looking\nat \"error\" of the software, but rather modelling error...\n\n%}\nopts    = [];\nopts.maxIts     = 300;\nopts.printEvery = 25;\nif n1 > 256\n    opts.maxIts     = 50;\n    opts.printEvery = 5;\nend\nopts.errFcn = {@(f,x) norm( vec(x) - vec(M) )/norm(M,'fro')};\n% this may be slow:\n% opts.errFcn{2} = @(f,x) rank(mat(x));\n\ntau     = 1; % constraint on trace\nx0      = [];\n\nA   = linop_matrix( PAULI, 'C2R' );\n[x,out,optsOut] = tfocs(smooth_quad,{A,-b}, proj_psdUTrace(tau) , x0, opts );\nX = mat(x);\n\nfigure(1);\nsemilogy( out.err(:,1) );\nhold all\n%% Solve in TFOCS\n%{\n\nFormulation:\n        minimize    trace(mat(x))   + mu/2*||x-x0||^2\n        subject to\n                    mat(x) >= 0\n                    ||PAULI*x - b || <= eps\n\nWe solve this via a dual method, hence the mu term.\nWe can reduce its effect by using continuation (i.e. updating x0)\n\n%}\nopts    = [];\nopts.maxIts     = 50;\nopts.printEvery = 25;\nopts.errFcn = {@(f,dual,x) norm( vec(x) - vec(M) )/norm(M,'fro')};\n% this may be slow:\n% opts.errFcn{2} = @(f,dual,x) rank(mat(x));\nopts.stopCrit   = 4;\nopts.tol    = 1e-8;\ncontOpts    = [];\ncontOpts.betaTol    = 10;\ncontOpts.maxIts     = 5;\n\nepsilon = norm(b-data);  % cheating a bit...\nx0      = [];\nz0      = [];\nmu = 5;\n\nlargescale  = ( n1*n2 >= 256^2 );\n% obj     = prox_nuclear(1,largescale); % works, but unnecessarily general\nobj     = prox_trace(1,largescale);\n\nprox    = prox_l2(epsilon);\nA   = linop_matrix( PAULI, 'C2R' );\nI   = [];\nIt  = linop_handles({ [n1,n2],[n1*n2,1] }, vec, mat, 'C2C' );\nA   = linop_compose( A, It );\n\n[x,out,opts] = tfocs_SCD( obj,{ A, -b; I, 0 }, {prox, proj_psd}, mu, x0, z0, opts, contOpts );\nX = mat(x);\n\nfprintf('Error is %.2e, error after renormalizing is %.2e\\n',...\n    opts.errFcn{1}(1,1,X), opts.errFcn{1}(1,1,X/trace(X) ) );\nfprintf('Rank of X is %d\\n', rank(X) );\n\nfigure(1);\nsemilogy( out.err(:,1) );\nhold all\nsemilogy(out.contLocations, out.err(out.contLocations,1), 'o' );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/explicitPauliTensor.m",
    "content": "function u = explicitPauliTensor( list )\n% u = explicitPauliTensor( list )\n%   makes the explicit matrix corresponding to the tensor\n%   product of Pauli matrices.\n%   \"list\" should be an ordered vector, where each entry is\n%   either 1, 2, 3 or 4, correspodning to the X, Y, Z and I\n%   Pauli matrices, respectively.\n\nif ~isvector(list) || max(list) > 4 || min(list) < 1\n    error('Error making Pauli matrices');\nend\n\nPX = [0,1;1,0]; PY = [0,-1i;1i,0]; PZ =[1,0;0,-1]; PI = eye(2);\n\nPAULI{1} = PX;\nPAULI{2} = PY;\nPAULI{3} = PZ;\nPAULI{4} = PI;\n\nu=1;\nfor i = 1:length(list)\n    u = kron( u, sparse( PAULI{list(i)} ));\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/findWeights.m",
    "content": "function w = findWeights( coeff, p )\n% weights = findWeights( coefficients, p )\n%   creates a nice vector of reweighting coefficients\n%   for use with re-weighted l1.\n%   The regularization parameter is chosen to be the coefficient\n%   that accounts for p-percent (0<p<1) of the total power.\n\nerror(nargchk(2,2,nargin));\nif ~isscalar(p) || p < 0 || p > 1\n    error('p must be a scalar between [0,1]' );\nend\n\ncoeff     = abs(coeff);\ncoeffSort = sort(coeff,'descend');\nc         = cumsum( coeffSort.^2 );\nindx      = find( c/c(end) > p, 1, 'first' );\nif ~isempty(indx)\n    delta   = coeffSort( indx );\nelse\n    delta   = 1e-15;\nend\n\nw   = delta./( coeff + delta );\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/image_denoising_withSPOT.m",
    "content": "%{\n    Tests total-variation problem and l1 analysis\n        on a large-scale example\n\n    min_x   alpha*||x||_TV + beta*||Wx||_1\ns.t.\n    || A(x) - b || <= eps\n\nwhere W is a wavelet operator.\n\n\nThis requires:\n\n    (1) SPOT            www.cs.ubc.ca/labs/scl/spot/\n    (2) Wavelab         www-stat.stanford.edu/~wavelab/ \nand optionally,\n    (3) CurveLab        www.curvelet.org/\n\n    Also demonstrates how to use SPOT with TFOCS.\n    To install SPOT, please visit:\n    http://www.cs.ubc.ca/labs/scl/spot/\n\n    We use SPOT to call WaveLab and CurveLab,\n    which may need to be installed separately.\n    Please contact the TFOCS and/or SPOT authors if you need help.\n\n    Also, SPOT v1.0 has a typo in its curvelet code:\n        after adding SPOT to your path, edit this file\n            edit spotbox-1.0p/opCurvelet\n        and change all instances of \"fdct_c2v\" and \"fdct_v2c\"\n        to \"spot.utils.fdct_c2v\" and \"spot.utils.fdct_v2c\", resp.\n\n%}\n\n% Setting up the various packages (change this for your computer):\naddpath ~/Dropbox/TFOCS/\naddpath ~/Documents/MATLAB/spotbox-1.0p/\naddpath ~/Documents/MATLAB/CurveLab-2.1.2/fdct_wrapping_cpp/mex/\n\nmyAwgn = @(x,snr) x +10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*...\n    randn(size(x));\n%% Load an image and take noisy measurements\n\n\nn1 = 256;\nn2 = 256;\nN = n1*n2;\nx = phantom(n1);\n\n% Signal-to-noise ratio, in dB\nsnr = 5;\n\n\nx_original = x;\nmat = @(x) reshape(x,n1,n2);\n% vec = @(x) x(:);\n\n% Add noise:\nrandn('state',245); rand('state',245);\nx_noisy = myAwgn( x_original, snr);\n\nmaxI    = max(vec(x_original)); % max pixel value\nPSNR    = @(x) 20*log10(maxI*sqrt(N)/norm(vec(x)-vec(x_original) ) );\n\n% Take measurements\nb   = vec(x_noisy);\nb_original = vec(x_original);\nEPS = .8*norm(b-b_original);\n\nfigure(2); imshow( [x_original, x_noisy] ); drawnow;\nM=N;\nfprintf('Denoising problem, %d x %d, signal has SNR %d dB\\n',M, N, round(snr) );\n\nREWEIGHT    = false; % whether to do one iteration of reweighting or not\n%% Call the TFOCS solver\n\nmu              = 5;\ner              = @(x) norm(x(:)-x_original(:))/norm(x_original(:));\nopts = [];\nopts.errFcn     = @(f,dual,primal) er(primal);\nopts.maxIts     = 100;\nopts.printEvery = 20;\nopts.tol        = 1e-4;\nopts.stopcrit   = 4;\n\nx0 = x_noisy;\nz0  = [];   % we don't have a good guess for the dual\n\n% build operators:\nA           = linop_handles([N,N], @(x)x, @(x) x );\nnormA2      = 1;\nW_wavelet   = linop_spot( opWavelet(n1,n2,'Daubechies') );\nif exist('fdct_wrapping')\n    DO_CURVELETS = true;\n    W_curvelet  = linop_spot( opCurvelet(n1,n2) );\nelse\n    % You either don't have curvelab installed\n    % or you need to add it to the matlab path.\n    DO_CURVELETS = false;\nend\nW_tv        = linop_TV( [n1,n2] );\nnormWavelet      = linop_normest( W_wavelet );\nif DO_CURVELETS, normCurvelet     = linop_normest( W_curvelet ); end\nnormTV           = linop_TV( [n1,n2], [], 'norm' );\n\ncontOpts            = [];\ncontOpts.maxIts     = 4;\n\n%% -- First, solve just via wavelet --\nclc; disp('WAVELETS');\n[x_wavelets,out_wave] = solver_sBPDN_W( A, W_wavelet, b, EPS, mu, ...\n    x0(:), z0, opts, contOpts);\n\nif REWEIGHT\n    % do some re-weighting:\n    coeff   = W_wavelet( x_wavelets, 1 );\n    weights = findWeights( coeff, .85 );\n    W_weights = linop_handles( [length(weights),length(weights)], @(x)weights.*x,...\n        @(y) weights.*y, 'R2R' );\n    [x_wavelets,out_wave] = solver_sBPDN_W( A, ...\n        linop_compose(W_weights,W_wavelet),  ...\n        b, EPS, mu, x_wavelets, out_wave.dual, opts, contOpts);\n    % and of course, you could keep iterating...\nend\n%% -- Second, solve just via curvelets --\nif DO_CURVELETS\n    opts_copy = opts;\n    opts_copy.maxIts    = 10;\n    opts_copy.normA2    = 1;\n    opts_copy.normW2    = normCurvelet^2;\n    clc; disp('CURVELETS');\n    [x_curvelets,out_curve] = solver_sBPDN_W( A, W_curvelet, b, EPS, mu, x0(:), z0, opts_copy);\n    \n    if REWEIGHT\n        % do some re-weighting:\n        coeff   = W_curvelet( x_curvelets, 1 );\n        weights = findWeights( coeff, .85 );\n        W_weights = linop_handles( [length(weights),length(weights)], @(x)weights.*x,...\n            @(y) weights.*y, 'R2R' );\n        % really, we should update the norm of W, since it is changing slightly\n        %   by adding in the weights, but that is a slow calculation, and the norm\n        %   doesn't change too much, so we skip that.\n        [x_curvelets,out_curve] = solver_sBPDN_W( A, ...\n            linop_compose(W_weights,W_curvelet),  ...\n            b, EPS, mu, x_curvelets, out_curve.dual, opts_copy);\n    end\nend\n\n%% -- Third, solve just via TV --\nclc; disp('TV');\nopts_copy = opts;\nopts_copy.normA2     = 1;\nopts_copy.normW2     = normTV^2;\nopts_copy.continuation  = false;\n[x_tv,out_tv] = solver_sBPDN_W( A, W_tv, b, EPS, mu, x0(:), z0, opts_copy, contOpts);\n\nif REWEIGHT\n    % do some re-weighting:\n    coeff   = W_tv( x_tv, 1 );\n    weights = findWeights( coeff, .95 );\n    W_weights = linop_handles( [length(weights),length(weights)], @(x)weights.*x,...\n        @(y) weights.*y, 'C2C' );\n    % really, we should update the norm of W, since it is changing slightly\n    %   by adding in the weights, but that is a slow calculation, and the norm\n    %   doesn't change too much, so we skip that.\n    [x_tv,out_tv] = solver_sBPDN_W( A, ...\n        linop_compose(W_weights,W_tv),  ...\n        b, EPS, mu, x_tv, out_tv.dual, opts_copy);\nend\n%% -- Fourth, combine wavelets (or curvelets) and tv --\nalpha   = 1;    % weight of TV term\nbeta    = .05;   % weight of wavelet term\nnormW12     = normTV^2;\nif DO_CURVELETS, normW22 = normCurvelet^2; beta = .5;\nelse, normW22     = normWavelet^2; end\n\n% x =solver_sBPDN_WW( A, alpha, W_tv, beta, ...\n%       W_wavelet, b, EPS, mu,vec(x0), z0, opts, contOpts);\n\n%  this is what solver_sBPDN_WW is doing:\nW1  = W_tv;\nif DO_CURVELETS\n    W2  = W_curvelet;\nelse\n    W2  = W_wavelet;\nend\nprox       = { prox_l2( EPS ), ...\n               proj_linf( alpha ),...\n               proj_linf( beta ) };\naffine     = { A, -b; W1, 0; W2, 0 };\n\n% x = tfocs_SCD( [], affine, prox, mu, x0(:), z0, opts, contOpts );\n% X_wavelets_tv = mat(x);\n%% try with box constraints\n% Constrain the image pixels to be in the range 0 <= x <= 1\nprox       = { prox_l2( EPS ), ...\n               proj_linf( alpha ),...\n               proj_linf( beta ), ...\n               proj_Rplus , ...\n               proj_Rplus};\n\naffine     = { A, -b; W1, 0; W2, 0 ; 1, 0; -speye(n1*n2), maxI*ones(n1*n2,1) };\n\nx_wavelets_tv = tfocs_SCD( [], affine, prox, mu, x0(:), z0, opts, contOpts );\nfprintf('Min and max entry of recovered image are %.1f and %.1f\\n', min(min(x_wavelets_tv)),...\n    max(max(x_wavelets_tv)) );\n%% another way to use box constraints\n% Instead of thinking of it as two scaled X >= 0 constraints,\n%   we call the special purpose atom\n\nprox       = { prox_l2( EPS ), ...\n               proj_linf( alpha ),...\n               proj_linf( beta ), ...\n               prox_boxDual(0,maxI,-1) };\n           \naffine     = { A, -b; W1, 0; W2, 0 ; 1, 0 };\nopts_copy = opts;\nopts_copy.continuation  = false;\nopts_copy.maxIts        = 30;\n[x_wavelets_tv,out] = tfocs_SCD( [], affine, prox, mu, x0(:), z0, opts_copy, contOpts );\n\nif REWEIGHT\n    % do some re-weighting:\n    weights = findWeights( W1(x_wavelets_tv,1), .95 );\n    W_weights1 = linop_handles( [length(weights),length(weights)], @(x)weights.*x,...\n        @(y) weights.*y, 'C2C' );\n    weights = findWeights( W2(x_wavelets_tv,1), .95 );\n    W_weights2 = linop_handles( [length(weights),length(weights)], @(x)weights.*x,...\n        @(y) weights.*y, 'C2C' );\n\n    affine     = { A, -b; linop_compose(W_weights1,W1), 0; ...\n        linop_compose(W_weights2,W2) , 0 ; -1, 0 }; % Note: we need the \"-1\", not +1\n    [x_wavelets_tv,out] = tfocs_SCD( [], affine, prox, mu, x0(:), out.dual, opts_copy, contOpts );\n\nend\nfprintf('Min and max entry of recovered image are %.1f and %.1f\\n', min(min(x_wavelets_tv)),...\n    max(max(x_wavelets_tv)) );\n%% Plot everything\nfigure(1); clf;\nsplot = @(n) subplot(2,3,n);\n\nsplot(1);\nimshow(x_original);\ntitle(sprintf('Noiseless image,\\nPSNR %.1f dB', Inf ));\n\nsplot(2);\nimshow(x_noisy);\ntitle(sprintf('Noisy image,\\nPSNR %.1f dB', PSNR(x_noisy) ));\n\nif DO_CURVELETS\n    splot(3);\n    imshow(mat(x_curvelets));\n    title(sprintf('Curvelet regularization,\\nPSNR %.1f dB', PSNR(x_curvelets) ));\nend\n\nsplot(4);\nimshow(mat(x_wavelets));\ntitle(sprintf('Wavelet regularization,\\nPSNR %.1f dB', PSNR(x_wavelets) ));\n\nsplot(5);\nimshow(mat(x_tv));\ntitle(sprintf('TV regularization,\\nPSNR %.1f dB', PSNR(x_tv) ));\n\nsplot(6);\nimshow(mat(x_wavelets_tv));\nif DO_CURVELETS\n    title(sprintf('Curvelets + TV, and box constraints,\\nPSNR %.1f dB', PSNR(x_wavelets_tv) ));\nelse\n    title(sprintf('Wavelets + TV, and box constraints,\\nPSNR %.1f dB', PSNR(x_wavelets_tv) ));\nend\n\n%% Bonus: movie.\n% This uses the helper file \"plotNow.m\" to show you the image\n% at every iteration. It slows down the algorithm on purpose\n% so that you have time to watch it.\nfigure(2); clf; plotNow();\ntime_delay = 0.1;\nopts.errFcn = {@(f,d,p) er(p), @(f,d,p) plotNow( mat(p), time_delay) };\nx_tv = solver_sBPDN_W( A, W_tv, b, EPS, .1*mu, vec(x0), z0, opts);\ntitle('THAT''S ALL FOLKS');\n%%\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/plotNow.m",
    "content": "function out = plotNow( x, pause_t , plotFcn )\n% out = plotNow( x, pause_t )\n%   helper function for plotting a movie during\n%   the TFOCS iterations.\n% Call this function with no inputs in order\n%   to reset it.\n% Call this with a matrix and it will plot it using \"imshow\".\n%\n% The input \"pause_t\" controls how long to pause\n%   (this is useful when solving a small problem that would\n%    otherwise progress too fast between iterates).\n% \n% out = plotNow( x, pause_t, plotFcn )\n%   will plot \"x\" using \"plotFcn\" instead of the default \"imshow\"\n\npersistent counter\nif isempty(counter)\n    counter = 0;\nend\nif nargin == 0\n    counter = 0;\n    return;\nend\ncounter = counter + 1;\n\nif nargin < 3 || isempty(plotFcn), plotFcn = @(x) imshow(x); end\n\nplotFcn(x);\ntitle(sprintf('Iteration %2d',counter));\ndrawnow\n\nif nargin > 1 && ~isempty(pause_t)\n    pause(pause_t);\nend\n\nout = 0;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/test_SVM.m",
    "content": "%{\n   Support Vector Machine (SVM) example\n\n    This is not a largescale test but it's neat, so it's in this directory\n\n    We have binary data, and the two classes are labeled +1 and -1\n    The data is d-dimensional, and we have n samples\n\n\n    This example show show to solve the standard SVM using the hinge-loss\n    and l2 penalty. Then it shows how it is easy with TFOCS to generalize\n    the SVM problem and use the l1 penalty instead of the l2 penalty,\n    which has the effect of encouraging sparsity.\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\n\n\n% Generate a new problem\n\nrandn('state',23432);\nrand('state',3454);\n\nn = 30;\nd = 2; % 2D data is nice because it's easy to visualize\n\nn1 = round(.5*n);   % number of -1 (this is data from one \"class\")\nn2 = n - n1;        % number of +1 (this is data from the other \"class\")\n\n% Generate data\nmean1   = [-.5,1];\n% mean2   = [.6,.2]; % can be separated\nmean2   = [.1,.5]; % cannot be separated, so a bit more interesting\ns       = .25;  % standard deviation\nx1  = repmat(mean1,n1,1) + s*randn(n1,2);\nx2  = repmat(mean2,n2,1) + s*randn(n2,2);\n\nX = [x1; x2];\nlabels = [ ones(n1,1); -ones(n2,1) ];\n\nfigure(1); clf;\nhh = {};\nhh{1}=plot(x1(:,1), x1(:,2), 'o' );\nhold all\nhh{2}=plot(x2(:,1), x2(:,2), '*' );\nlegend('Class 1','Class 2');\nxl = get(gca,'xlim');\nyl = get(gca,'ylim');\n\n%% compute a separating hyperplane with SVM\n% First, we use CVX to get a reference solution\n\nhinge = @(x) sum(max(0,1-x));\nlambda_1 = 10;\nlambda_2 = 4;\n\nif exist( 'cvx_begin','file')\n    \n% -- Problem 1: standard SVM in primal form\nPROBLEM     = 1;\ncvx_begin\n    cvx_quiet true\n    cvx_precision best\n    variables a(d) b(1)\n    minimize hinge( labels.*( X*a - b ) ) + lambda_1*norm(a,2)\ncvx_end\nSLOPE{PROBLEM} = a;\nINTERCEPT{PROBLEM} = b;\n\n% -- Problem 2: \"sparse\" SVM (use l1 norm as penalty)\nPROBLEM     = 2;\ncvx_begin\n    cvx_quiet true\n    cvx_precision best\n    variables a(d) b(1)\n    minimize hinge( labels.*( X*a - b ) ) + lambda_2*norm(a,1)\ncvx_end\nSLOPE{PROBLEM} = a;\nINTERCEPT{PROBLEM} = b;\n\n% An equivalent way to solve via method 2:\n% X_aug = [diag(labels)*X, -labels ]; % include the \"b\" variable\n% cvx_begin\n%     variables a(d+1)\n%     minimize hinge( X_aug*a ) + lambda_2*norm(a(1:2),1)\n% cvx_end\n\nelse\n    % load the pre-computed reference solutions\n    lambda_1 = 10;\n    lambda_2 = 4;\n    SLOPE    = { [  -1.084604434515675;   0.783281331181009]; ...\n        [  -2.391008972722243; 0] };\n    INTERCEPT = {   [0.75708813868169] ; [0.260615633092470] };\nend\n\n%% plot the separating hyper-planes\nfor PROBLEM = 1:length(SLOPE)\n    a = SLOPE{PROBLEM}; b = INTERCEPT{PROBLEM};\n    \n    if abs(a(2)/a(1)) < 1e-10\n        % vertical line:\n        hh{PROBLEM+2}=line( [1,1]*b/a(1), [-.3,2] );\n    else\n        grid = linspace(-.5,1,100);\n        hh{PROBLEM+2}=plot( grid, (b-a(1)*grid)/a(2) );\n    end\nend\nlegend([hh{:}],'Class 1','Class2','SVM','sparse SVM');\nxlim(xl); ylim(yl);\n\n%% Solve Problem 2 in TFOCS\nPROBLEM = 2;\nlinearF = diag(labels)*[ X, -ones(n,1) ];\nobjF    = prox_l1(lambda_2*[1,1,0]'); \n% objF    = prox_l1(lambda_2);\nprox    = prox_hingeDual(1,1,-1); % but use -x since we want polar cone, not dual cone\n\nmu      = 1e-2;\nopts    = [];\nopts.maxIts     = 1500;\nopts.continuation = false;\nopts.stopCrit   = 4;\nopts.tol        = 1e-12;\nopts.errFcn     = @(f,d,x) norm( x - [SLOPE{PROBLEM};INTERCEPT{PROBLEM}] );\nx0              = zeros(d+1,1); % i.e. 3 for 2D SVM\ny0              = zeros(n,1);\n[ak,out,optsOut] = tfocs_SCD( objF,linearF, prox, mu,x0,y0,opts); \n% an alternative way to call it:\n% [ak,out,optsOut] = tfocs_SCD( objF,{linearF,[]}, prox, mu,x0,y0,opts);\n\n%% Solve Problem 2 in TFOCS a different way\n% We dualize the l1 term now\nPROBLEM = 2;\nprox2           = { prox, proj_linf(lambda_2) };\nlinearF2        = diag( [ones(d,1);0] );\nopts.errFcn     = @(f,d,x) norm( x - [SLOPE{PROBLEM};INTERCEPT{PROBLEM}] );\n[ak,out,optsOut] = tfocs_SCD([],{linearF,[];linearF2,[]}, prox2, mu,[],[],opts);\n\n\n%% Solve Problem 1 in TFOCS\n% Keep l1 term in primal; this is an \"experimental\" feature\n%   since the l1 proximity operator is not exactly in closed form\n%   (it relies on a 1D linesearch; this should be very fast, but \n%    it could have numerical issues for very high accuract solutions)\nPROBLEM = 1;\nobjF    = prox_l2(lambda_1*[1,1,0]'); \nopts.errFcn     = @(f,d,x) norm( x - [SLOPE{PROBLEM};INTERCEPT{PROBLEM}] );\n% opts.tol        = 1e-16;\nopts.continuation = true;\nmu2             = 10*mu;\n[ak,out,optsOut] = tfocs_SCD( objF,linearF, prox, mu2,[],[],opts); \n\n%% Solve Problem 1 in TFOCS a different way\n% Dualize the l2 term\nPROBLEM = 1;\nprox2           = { prox, proj_l2(lambda_1) };\nlinearF2        = diag( [ones(d,1);0] );\nopts.errFcn     = @(f,d,x) norm( x - [SLOPE{PROBLEM};INTERCEPT{PROBLEM}] );\nopts.tol        = 1e-15;\nopts.continuation = false;\n[ak,out,optsOut] = tfocs_SCD([],{linearF,[];linearF2,[]}, prox2, mu,[],[],opts);\n\n\n\n\n%%\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/test_sBPDN_W_largescale.m",
    "content": "%{\n    Tests the \"analysis\" form of basis pursuit de-noising\n\n    min_x ||Wx||_1\ns.t.\n    || A(x) - b || <= eps\n\nThis version uses a realistic problem\n\nsee also test_sBP.m and test_sBPDN.m and test_sBPDN_W.m\n\nThis example requires PsiTransposeWFF.m and PsiWFF.m (should be included in this directory)\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\n\n\nHANDEL = load('handel');        % This comes with Matlab\nx_original = HANDEL.y;          % It's a clip from Handel's \"Hallelujah\"\nFS = HANDEL.Fs;                 % The sampling frequency in Hz\n\nPLAY = input('Play the original music clip? (y/n) ','s');\nif strcmpi(PLAY,'y') || strcmpi(PLAY,'yes')\n    sound( x_original );\nend\nN = length(x_original);\n% Simplest to use signals of size 2^k for any integer k > 0\n% So, padd the signal with zeros at the end\nk = nextpow2(N);\nk = k-1;\nx_original = [x_original(1:min(N,2^k)); zeros(2^k-N,1) ];\nN_short = N;\nN = 2^k;\n\n% We'll perform denoising.  Measurement is the identity.\nM = N;\nAf = @(x) x;\nAt = Af;\nnormA   = 1;\nA = linop_handles( [M,N], Af, At );\n% linop_test(A)\n\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n\nsnr     = 10;   % in dB\nb_exact = Af(x_original);\nx_noisy = myAwgn(x_original,snr);\nb       = Af(x_noisy);\n\nPLAY = input('Play the noisy music clip? (y/n) ','s');\nif strcmpi(PLAY,'y') || strcmpi(PLAY,'yes')\n    sound( x_noisy );\nend\n\nEPS = norm( b - b_exact );\nfprintf('||b-Ax||/||b|| is %.2f\\n', EPS/norm(b) );\n\n%% SETUP AN ANALYSIS OPERATOR\n% The PsiWFF and PsiTransposeWFF code is a Gabor frame\n% (i.e. a short-time Fourier transform)\n% written by Peter Stobbe\n% \n% PsiWFF is the synthesis operator, and acts on coefficients\n% PsiTransposeWFF is the analysis operator, and acts on signals\ngMax        = 0;\n% gMax        = -8; % 2.6e-1 er with -8\ngLevels     = 1 - gMax;\ntRedundancy = 1;\nfRedundancy = 0;\n\ngWindow = 'isine';\nlogN    = log2(N);\npsi     = @(y) PsiWFF(y,gWindow,logN,logN-gLevels,logN+gMax,tRedundancy,fRedundancy);\npsiT    = @(x) PsiTransposeWFF(x,gWindow,logN,logN-gLevels,logN+gMax,tRedundancy,fRedundancy);\n\nx  = x_original;\ny  = psiT(x);\nx2 = psi(y);\nd  = length(y);\n% The frame is tight, so the psuedo-inverse is just the transpose:\nfprintf('Error in PSI(PSI^* x ) - x is %e; N = %d, d = %d, d/N = %.1f\\n', ...\n    norm(x-x2),N,d,d/N);\n\nnormW   = 1;\nW       = linop_handles([d,N], psiT, psi );\nlinop_test(W)\n%% Call the TFOCS solver\n\nx0  = x_noisy;\nmu  = .5*norm(psiT(x0),Inf);\nnorm_x_orig     = norm(x_original);\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\n\nopts            = [];\nopts.errFcn     = @(f,dual,primal) er_signal(primal);\nopts.maxIts     = 80;\nopts.tol        = 1e-6;\nopts.normA2     = normA^2;\nopts.normW2     = normW^2;  % both of these are 1\nopts.printEvery = 20;\nz0  = [];   % we don't have a good guess for the dual\ntic;\n\nW_weighted  = W;\n% do some reweighting\nfor rw = 1:2\n    \n    % This is the old method of doing continuation.  The current version\n    %   supports a simpler way to make the solver use continuation;\n    %   for an example, see \"example_LinearProgram.m\" in the examples/smallscale directory.\n    solver = @(mu,x0,z0,opts) solver_sBPDN_W( A, W_weighted, b, EPS, mu, x0, z0, opts );\n    contOpts        = [];\n    contOpts.maxIts = 1;\n    [ x, out, optsOut ] = continuation( solver, mu, x0, z0, opts,contOpts );\n    \n    % update weights\n    coeff   = psiT(x);\n    cSort   = sort(abs(coeff),'descend');\n    cutoff  = cSort( find( cumsum(cSort.^2)/sum(cSort.^2) >= .9, 1 ) );\n    weights = 1./( abs(coeff) + cutoff );\n    weightsMatrix   = spdiags(weights,0,d,d);\n    W_weighted      = linop_compose( weightsMatrix , W );\n    opts.normW2     = []; % let the solver estimate it for us\n    \n    x0  = x;\n    z0  = cell( out.dual );\nend\n\n\ntime_TFOCS = toc;\n\nfprintf('Denoised signal has error %.2e, noisy signal has error %.2e\\n',...\n    er_signal(x), er_signal(x_noisy) );\n%%\nPLAY = input('Play the recovered signal music clip? (y/n) ','s');\nif strcmpi(PLAY,'y') || strcmpi(PLAY,'yes')\n    sound( x );\nend\nPLAY = input('Play the noisy music clip? (y/n) ','s');\nif strcmpi(PLAY,'y') || strcmpi(PLAY,'yes')\n    sound( x_noisy );\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/test_sTV_Analysis_largescale.m",
    "content": "%{\n    Tests total-variation problem and l1 analysis\n        on a large-scale example\n\n    min_x alpha*||x||_TV + beta*||Wx||_1\ns.t.\n    || A(x) - b || <= eps\n\nwhere W is a wavelet operator.\nThe solvers solve a regularized version\n\nsee also test_sBP.m and test_sBPDN_W.m and test_sTV.m and test_sTV_largescale.m\n\nThis version has no reference solution.\n\nThis code uses continuation\n\nRequires wavelet toolbox and image processing toolbox\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\n\n\n% Generate a new problem\n\nrandn('state',245);\nrand('state',245);\n\n% image = 'phantom';\nimage = 'bugsbunny';\n\nswitch image\n    case 'phantom'\n        n = 256;\n        n1 = n;\n        n2 = n;\n        % n2 = n-1;           % testing the code with non-square signals\n        N = n1*n2;\n        n = max(n1,n2);\n        x = phantom(n);\n        x = x(1:n1,1:n2);\n        \n%         snr = -5;  % SNR in dB\n        snr = 5;\n    case 'bugsbunny'\n        % Image is from wikimedia commons:\n        % http://commons.wikimedia.org/wiki/File:Falling_hare_bugs.jpg\n        load BugsBunny\n        x = bugs;\n        [n1,n2] = size(x);\n        N = n1*n2;\n        \n        snr = 15;  % SNR in dB\nend\nx_original = x;\n\nmat = @(x) reshape(x,n1,n2);\nvec = @(x) x(:);\n\n% -- Choose what kind of measurements you want:\nmeasurements = 'identity';          % for denoising\n\nswitch measurements\n    case 'identity'\n        M = N;\n        Af = @(x) x;\n        At = @(x) x;\nend\n\n% treat X as n1*n2 x 1 vector?\nVECTOR = true;\n% or treat X as n1 x n2 matrix?\n% VECTOR = false;\n\nif VECTOR\n    A = linop_handles([M,N], Af, At );\n    VEC = vec;\nelse\n    Af = @(x) vec(Af(x));\n    At = @(x) mat(At(x));\n    A = linop_handles({[n1,n2],[M,1]}, Af, At );\n    VEC = @(x) x;\nend\n    \n    \nb_original = Af(vec(x_original));\n\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n\n% Either add white noise:\nx_noisy = myAwgn( x_original, snr );\n% Or add a random mask:\n% x_temp  = myAwgn( x_original, 0);\n% index   = randperm(N);\n% index   = index( 1 : round(.2*N) );\n% x_noisy = x_original;\n% x_noisy(index) = x_temp(index);\n\nb   = Af( vec(x_noisy) );\nEPS = .9*norm(b-b_original);\nfigure(2); imshow( [x_original, x_noisy] );\n\n%% Setup a sparsifying dictionary to use for denoising:\n% Choose an extension mode; see \"dwtmode\".  This makes things square\ndwtmode('per');\nX       = x_original;\nXbp     = x_noisy;\nmaxI    = 1; % max pixel value\nPSNR    = @(x) 20*log10(maxI*sqrt(N)/norm(vec(x)-vec(x_original) ) );\n\n% symmetric 9/7 biothogonal wavelets are what JPEG-2000 uses\nwaveletType = 'bior4.4'; % 9/7 wavelet\nnLevels = min( 1, wmaxlev(size(Xbp),waveletType) );\n[c,s] = wavedec2(Xbp,nLevels,waveletType);  % see 'wfilters' for options. Needs wavelet toolbox\nPLOT = true;\nif PLOT\n    D = detcoef2( 'h', c, s, 1 );\n    D = [D,detcoef2( 'd', c, s, 1 )];\n    a = appcoef2( c, s, 'db3', 1);\n    D = [D;detcoef2( 'v', c, s, 1 ), a];\n    cSort = sort(abs(c),'descend');\n    \n    % Try wavelet hard thresholding to denoise\n    erBest = -Inf;\n    for gamma = .81:.01:.999\n        ind = [find( cumsum(cSort.^2)/sum(cSort.^2) > gamma ),N];\n        cutoff = cSort(ind(1));\n        c2 = c;\n        c2 = c.*( abs(c)>cutoff);\n        X_hat = waverec2(c2,s,waveletType);\n        er = PSNR(X_hat);\n%         fprintf('Gamma is %.3f, PSNR is %.2f\\n',gamma,er );\n        if er > erBest, erBest = er;  gammaBest = gamma; end\n    end\n%     gammaBest = .9;\n    ind = [find( cumsum(cSort.^2)/sum(cSort.^2) > gammaBest ),N];\n    cutoff = cSort(ind(1));\n    c2 = c.*( abs(c)>cutoff);\n    X_hat = waverec2(c2,s,waveletType);\n    \n    figure(2);\n    imshow( [X,Xbp,X_hat] );\n    title(sprintf('Original\\t\\tNoisy (PSNR %.1f dB)\\tOracle Wavelet Thresholding (PNSR %.1f dB)',...\n        PSNR(Xbp), PSNR(X_hat) ) );\nend\n\n% Forward wavelet operator\nWf = @(X) wavedec2(mat(X),nLevels,'bior4.4')';\nW_invF = @(c) vec(waverec2(vec(c),s,'bior4.4') );\npinvW = W_invF;\n\nWt    = @(c) vec(waverec2(vec(c),s,'rbio4.4') );\npinvWt = @(X) wavedec2(mat(X),nLevels,'rbio4.4')';\nd = length(c);\nif d ~= N, disp('warning: wavelet transform not square'); end\n\nW_wavelet       = linop_handles([N,N], Wf, Wt );\nnormWavelet     = linop_test(W_wavelet);\n%%\nmu  = 1e-3*norm( linop_TV(x_original) ,Inf);\nx_ref   = x_original;\n\n% imshow( [x_original, x_noisy] );\n\nsz              = A([],0);\nM               = sz{2}(1);\nN               = sz{1}(1);\n[n1,n2]         = size(x_original);\nnorm_x_ref      = norm(x_ref,'fro');\ner_ref          = @(x) norm(vec(x)-vec(x_ref))/norm_x_ref;\n\nfprintf('\\tA is %s, %d x %d, signal has SNR %d dB\\n', measurements, M, N, round(snr) );\n\n%% Call the TFOCS solver\ner              = er_ref;  \nopts = [];\nopts.restart    = 1000;\nopts.errFcn     = @(f,dual,primal) er(primal);\nopts.maxIts     = 100;\nopts.printEvery = 20;\nopts.tol        = 1e-4;\nif strcmpi(measurements,'identity')\n    x0 = x_noisy;\nelse\n    x0 = At(b);\nend\nz0  = [];   % we don't have a good guess for the dual\nif VECTOR\n    W_tv   = linop_TV( [n1,n2] );\nelse\n    W_tv   = linop_TV( {n1,n2} );\n%     z0  = {zeros(M,1), zeros(n1*n2,1) };\nend\nnormTV           = linop_TV( [n1,n2], [], 'norm' );\nopts.normW12     = normTV^2;\nopts.normW22     = normWavelet^2;\nopts.normA2      = 1; % \"A\" is the identity\n\n\n% Make sure we didn't do anything bad\n% linop_test( A );\n% linop_test( W );\n\ncontOpts            = [];\ncontOpts.maxIts     = 4;\ncontOpts.betaTol    = 2;\n\n\n% -- First, solve just via wavelet --\ndisp('============ WAVELETS ONLY ===============');\nopts.normW2     = normWavelet^2;\nsolver = @(mu,x0,z0,opts) solver_sBPDN_W( A, W_wavelet, b, EPS, mu, x0, z0, opts);\n[ x, out, optsOut ] = continuation(solver,5*mu,VEC(x0),z0,opts, contOpts);\nX_wavelets = mat(x);\n\n% -- Second, solve just via TV --\ndisp('============ TV ONLY =====================');\nopts.normW2     = normTV^2;\nsolver = @(mu,x0,z0,opts) solver_sBPDN_W( A, W_tv, b, EPS, mu, x0, z0, opts);\n[ x, out, optsOut ] = continuation(solver,5*mu,VEC(x0),z0,opts, contOpts);\nX_tv = mat(x);\n\n% -- Third, combine wavelets and tv --\n% -- Here is what we are solving --\n% minimize   alpha*||x||_TV + beta*||W_wavelet(x)||_1\n% subject to    ||x-x_noisy|| <= EPS\nalpha   = 1;\nbeta    = .1;\n\ndisp('============ WAVELETS AND TV =============');\nsolver = @(mu,x0,z0,opts) solver_sBPDN_WW( A, alpha, W_tv, beta, W_wavelet, b, EPS, mu,x0, z0, opts);\n[ x, out, optsOut ] = continuation(solver,5*mu,VEC(x0),z0, opts,contOpts);\nX_wavelets_tv = mat(x);\n\n%%\nfigure(1); clf;\nsplot = @(n) subplot(2,3,n);\n\nsplot(1);\nimshow(x_original);\ntitle(sprintf('Noiseless image, PSNR %.1f dB', Inf ));\n\nsplot(2);\nimshow(x_noisy);\ntitle(sprintf('Noisy image, PSNR %.1f dB', PSNR(x_noisy) ));\n\nsplot(3);\nimshow(X_hat);\ntitle(sprintf('Oracle wavelet thresholding, PSNR %.1f dB', PSNR(X_hat) ));\n\nsplot(4);\nimshow(X_wavelets);\ntitle(sprintf('Wavelet regularization, PSNR %.1f dB', PSNR(X_wavelets) ));\n\nsplot(5);\nimshow(X_tv);\ntitle(sprintf('TV regularization, PSNR %.1f dB', PSNR(X_tv) ));\n\nsplot(6);\nimshow(X_wavelets_tv);\ntitle(sprintf('Wavelet + TV regularization, PSNR %.1f dB', PSNR(X_wavelets_tv) ));\n\n%%\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/largescale/test_sTV_largescale.m",
    "content": "%{\n    Tests total-variation problem on a large-scale example\n\n    min_x ||x||_TV\ns.t.\n    || A(x) - b || <= eps\n\nThe solvers solve a regularized version\n\nsee also test_sBP.m and test_sBPDN_W.m and test_sTV.m\n\nThis version has no reference solution.\nRequires image processing toolbox\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\n\n\n% Generate a new problem\n\nrandn('state',245);\nrand('state',245);\n\nn = 256;\nn1 = n; \nn2 = n;\n% n2 = n-1;           % testing the code with non-square signals\nN = n1*n2;\nn = max(n1,n2);\nx = phantom(n);\nx = x(1:n1,1:n2);\nx_original = x;\n\nmat = @(x) reshape(x,n1,n2);\nvec = @(x) x(:);\n\n% -- Choose what kind of measurements you want:\nmeasurements = 'identity';          % for denoising\n% measurements = 'partialFourier';    % partial 2D DCT\n\nswitch measurements\n    case 'identity'\n        M = N;\n        Af = @(x) x;\n        At = @(x) x;\n    case 'partialFourier'\n\n        M = round( N / 4 );\n        % omega = randsample(N,M);\n        omega = randn(N,1);\n        [temp,omega] = sort(omega);\n        omega = sort( omega(1:M) );\n        downsample = @(x) x(omega);\n        SS.type = '()'; SS.subs{1} = omega; SS.subs{2} = ':';\n        upsample = @(x) subsasgn( zeros(N,size(x,2)),SS,x);\n\n\n        % take partial 2D DCT measurements.  We have Af(At) = identity (not\n        % vice-versa of course). Randomly permuted.\n        rp = randperm(N);\n        [~,rp_inv] = sort(rp);\n        rpF = @(x) x(rp);\n        rp_invF = @(x) x(rp_inv);\n        \n        my_dct2 = @(x) dct(dct(x).').';\n        my_idct2= @(x) idct(idct(x).').';\n        Af = @(x) downsample(vec( my_dct2( mat(rpF(mat(x) )) ) ) );\n        At = @(y) vec( rp_invF( my_idct2( mat( upsample( y ) ) ) ) );\nend\n\n% treat X as n1*n2 x 1 vector?\nVECTOR = true;\n% or treat X as n1 x n2 matrix?\n% VECTOR = false;\n\nif VECTOR\n    A = linop_handles([M,N], Af, At );\n    VEC = vec;\nelse\n    Af = @(x) vec(Af(x));\n    At = @(x) mat(At(x));\n    A = linop_handles({[n1,n2],[M,1]}, Af, At );\n    VEC = @(x) x;\nend\n    \nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n    \nb_original = Af(vec(x_original));\nsnr = 10;  % SNR in dB\nx_noisy = myAwgn( x_original, snr );\nb   = Af( vec(x_noisy) );\nEPS = norm(b-b_original);\n\nmu  = 1e-5*norm( linop_TV(x_original) ,Inf);\nx_ref   = x_original;\n\nimshow( [x_original, x_noisy] );\n\nsz              = A([],0);\nM               = sz{2}(1);\nN               = sz{1}(1);\n[n1,n2]         = size(x_original);\nnorm_x_ref      = norm(x_ref,'fro');\ner_ref          = @(x) norm(vec(x)-vec(x_ref))/norm_x_ref;\n\nfprintf('\\tA is %s, %d x %d, signal has SNR %d dB\\n', measurements, M, N, round(snr) );\n\n%% Call the TFOCS solver\ner              = er_ref;  \nopts = [];\nopts.restart    = 1000;\nopts.errFcn     = @(f,dual,primal) er(primal);\nopts.maxIts     = 250;\nif strcmpi(measurements,'identity')\n    x0 = x_ref;\nelse\n    x0 = At(b);\nend\nz0  = [];   % we don't have a good guess for the dual\nif VECTOR\n    W   = linop_TV( [n1,n2] );\nelse\n    W   = linop_TV( {n1,n2} );\nend\nnormW           = linop_TV( [n1,n2], [], 'norm' );\nopts.normW2     = normW^2;\n\n% Make sure we didn't do anything bad\n% linop_test( A );\n% linop_test( W );\n\n\ntic;\n% [ x, out, optsOut ] = solver_sBPDN_W( A, W, b, EPS, mu, VEC(x0), z0, opts\n% );\nsolver = @(mu,x0,z0,opts) solver_sBPDN_W( A, W, b, EPS, mu, x0, z0, opts);\n[ x, out, optsOut ] = continuation(solver,5*mu,x0(:),z0,opts);\n\ntime_TFOCS = toc;\nfprintf('Solution has %d nonzeros.  Error vs. original solution is %.2e\\n',...\n    nnz(x), er(x) );\n\nx = mat(x);\nimshow( [x_original, x_noisy, x] );\nmaxI    = 1; % max pixel value\nPSNR    = @(x) 20*log10(maxI*sqrt(N)/norm(vec(x)-vec(x_original) ) );\ntitle(sprintf('No denoising, PSNR is %.1f dB; TV denoising, PSNR is %.1f dB',...\n    PSNR( x_noisy ), PSNR( x )) );\n%%\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/eig_backup.m",
    "content": "function [V,D] = eig_backup( X )\n% [V,D] = eig_backup(X)\n%   computes the eigenvalue decomposition of a symmetric matri\n%   using the SVD. This is designed for cases when the main eig()\n%   routine doesn't work due to the bug described at \n%       http://ask.cvxr.com/t/eig-did-not-converge-in-prox-trace/996/4\n%\n% This uses the SVD, so a bit slower sometimes...\n% July 13 2015\n\n[V,D,W] = svd(X);\n\n\nd = diag(D).' .* sign(real(dot(V,W,1)));\n% and sort it to conform to Matlab's order...\n[d,ind]     = sort(d);\nD           = diag(d);\nV           = V(:,ind);\n\n% Another option, but typically slow...\n%   (calls generalized eigenvalue decomp.)/\n% [V,D]   = eig(X,eye(size(X)));"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/linop_identity.m",
    "content": "function y = linop_identity( x, mode )\n\n%LINOP_IDENTITY   Internal TFOCS routine.\n%\t Implements the identity linear operator.\n\ny = x;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/linop_stack.m",
    "content": "function [ op, inp_dims, otp_dims ] = linop_stack( linearF, inp_dims, otp_dims, DO_DEBUG )\n\n%LINOP_STACK    Stacked linear operators.\n%    OP = LINOP_STACK( linearF ), where linearF is a cell vector or cell\n%    matrix, returns a function handle for a linear operator that accepts\n%    TFOCS_TUPLE objects as input or output, as appropriate, and applies\n%    the various linear operators in block matrix fashion.\n%\n%    If linearF has more than one row, then the output in its forward mode\n%    or its input in adjoint mode is a TFOCS_TUPLE object. If linearF has\n%    more than one column, then the output in its adjoint mode or its input\n%    in forward mode is a TFOCS_TUPLE object.\n\nif nargin < 4 || isempty(DO_DEBUG), DO_DEBUG = false; end\n\nif ~isa( linearF, 'cell' ),\n    error( 'First argument must be a cell array.' );\nend\n[ m, n ] = size( linearF );\nif nargin < 2 || isempty( inp_dims ),\n    inp_dims = cell( 1, n );\nend\nif nargin < 3 || isempty( otp_dims ),\n    otp_dims = cell( 1, m );\nend\nrescan = zeros(2,0);\ndebugPrintf('----- DEBUG INFO: Size of linear matrix (and offsets) ---- \\n');\n% debugPrintf('---------------------------------------------------------- \\n');\nfor j = 1 : n, debugPrintf('-----------------------------------+'); end\ndebugPrintf('\\n');\n% old_inp_d   = {};\nfor i = 1 : m,\n    otp_d = otp_dims{i};\n    for j = 1 : n,\n        inp_d = inp_dims{j};\n        lF = linearF{i,j};\n        sZ = [];\n        if isempty(lF),\n        elseif isa( lF, 'function_handle' ),\n            sZ = lF([],0);\n        elseif ~isnumeric( lF ),\n            error( 'Entries should be real matrices or linear operators.'  );\n        elseif ~isreal(lF),  % Why? we now handle A: C --> C\n            error( 'Matrix entries must be real.' );\n        elseif numel(lF) > 1,\n            sZ = size(lF);\n            linearF{i,j} = linop_matrix( lF ); % Jan 2012, check this\n        elseif lF == 0,\n            linearF{i,j} = [];\n        else\n            if lF == 1,\n%                 linearF{i,j} = @(x,mode)x;\n                linearF{i,j} = @linop_identity;\n            else\n                linearF{i,j} = @(x,mode)lF*x;\n            end\n            if ~isempty(otp_d),\n                sZ = { otp_d, otp_d };\n            elseif ~isempty(inp_d),\n                sZ = { inp_d, inp_d };\n            else\n                rescan(:,end+1) = [i;j];\n            end\n        end\n        if isempty( sZ ),\n            printSizes( inp_d , otp_d ); % if DO_DEBUG is true, this will print\n            if j < n, debugPrintf(' |'); end\n            continue;\n        elseif isnumeric( sZ ),  % This should never be triggered, unless offset is empty\n            % June 2011:\n            % If this is the offset term, then we allow for a matrix (rather than vector)\n            %   offset, as long as the size of the linear portion has been specified:\n            if j == n && j > 1\n                sZ_old = linearF{i,j-1}([],0);\n                if ~isempty( sZ_old) && all( sZ_old{2} == sZ )\n                    % We may have a matrix\n                    sZ = { [1,1], sZ };\n                    % So, re-define linearF{i,j} not to be linop_matrix but rather the constant function\n                else\n                    sZ = { [sZ(2),1], [sZ(1),1] };\n                end\n            else\n                sZ = { [sZ(2),1], [sZ(1),1] };\n            end\n        end\n        if isempty(inp_d),\n            inp_d = sZ{1};\n%         elseif ~isequal(inp_d,sZ{1}) && ~isempty( sZ{1} ) % adding Oct 12. Jan 2012, is this right? inp_d was already defined....\n%         elseif ~isempty( old_inp_d ) && ~isempty( sZ{1} ) && ~isequal( old_inp_d, sZ{1} )\n%             if j > 1\n%                 for jj = 1:(j-1)\n%                     sZ_old = linearF{i,jj}([],0);\n%                     if isempty( sZ_old )\n%                         fprintf( 2, ...\n%                             'TFOCS message: About to throw an error: may be because element (%d,%d) of \\n',i,jj);\n%                         fprintf( 2, ...\n%                             '  linear operator matrix does not have an explicit size\\n' );\n%                     end\n%                 end\n%             end\n%             error( 'Incompatible dimensions in element (%d,%d) of the linear operator matrix', i, j );\n        end\n        inp_dims{j} = inp_d;\n%         if ~isempty( inp_d ), old_inp_d   = inp_d; end\n        \n        if isempty(otp_d),\n            otp_d = sZ{2};\n        elseif ~isequal(otp_d,sZ{2}),\n            if isequal( fliplr(otp_d), sZ{2} )\n                fprintf('\\nThe sizes match if you switch some rows/columns. Double-check your offsets are column vectors\\n\\n');\n            end\n            error( 'Incompatible dimensions in element (%d,%d) of the linear operator matrix', i, j );\n        end\n\n        \n        printSizes( inp_d, otp_d ); % if DO_DEBUG is true, this will print\n        if j < n, debugPrintf(' |'); end\n        \n    end\n    otp_dims{i} = otp_d;\n    \n    debugPrintf('\\n');\n    \nend\ndebugPrintf('---------------------------------------------------------- \\n');\n\n%\n% In some cases, we cannot resolve the dimensions on the first pass:\n% specifically, those entries that represent scalar scaling operations.\n% In those cases, we know that the input and output dimensions must be the\n% same, but we may not have yet determined either in the first pass. So\n% we rescan those entries until all ambiguities are resolved or until no\n% further progress is made.\n%\n\nwhile ~isempty(rescan),\n    rescan_o = rescan;\n    rescan = zeros(2,0);\n    for ij = rescan,\n        i = ij(1); j = ij(2);\n        lF = linearF{i,j};\n        if isnumeric(lF) && numel(lF) == 1,\n            if isempty(inp_dims{j}),\n                if isempty(otp_dims{i}),\n                    rescan(:,end+1) = [i;j];\n                    continue;\n                else\n                    inp_dims{j} = otp_dims{i};\n                end\n            elseif isempty(otp_dims{i}),\n                otp_dims{i} = inp_dims{j};\n            elseif ~isequal( inp_dims{i}, otp_dims{j} ),\n                error( 'Incompatible dimensions in element (%d,%d) of the linear operator matrix', i, j );\n            end\n            if DO_DEBUG\n                fprintf('Affine term (%d,%d) has size:', i, j );\n                printSizes( inp_dims{j}, otp_dims{i} );\n            end\n        end\n    end\n    % Prevent infinite loops\n    if numel(rescan) == numel(rescan_o),\n        break;\n    end\nend\ndebugPrintf('---------------------------------------------------------- \\n');\n\nif m == 1 && n == 1,\n    op = linearF{1,1};\n    inp_dims = inp_dims{1};\n    otp_dims = otp_dims{1};\n    if isempty(op),\n        op = @linop_identity;\n    end\nelseif m == 1,\n    otp_dims = otp_dims{1};\n    op = @(x,mode)linop_stack_row( linearF,  n,    { inp_dims, otp_dims }, x, mode );\nelseif n == 1,\n    inp_dims = inp_dims{1};\n    op = @(x,mode)linop_stack_col( linearF,  m,    { inp_dims, otp_dims }, x, mode );\nelse\n    op = @(x,mode)linop_stack_mat( linearF, [m,n], { inp_dims, otp_dims }, x, mode );\nend\n\n\n% ------- Internal subfunctions ------------\n% These functions can see the workspace variables of the main function\nfunction debugPrintf( varargin )\nif DO_DEBUG\n    fprintf( varargin{:} );\nend\nend\n\nfunction printSizes( inp_d, otp_d )\nif DO_DEBUG\n    % Print size of domain\n    if isempty( inp_d )\n        fprintf(' (     ?      )');\n    else\n        if length( inp_d ) == 1, inp_d = [inp_d, 1 ]; end\n        fprintf(' (');\n        for kk = 1:length(inp_d)-1, fprintf('%4d x ', inp_d(kk) ); end\n        fprintf('%4d )', inp_d(end) );\n    end\n    % Print size of range\n    fprintf(' --> ');\n    if isempty( otp_d )\n        fprintf('(     ?      )');\n    else\n        if length( otp_d ) == 1, otp_d = [otp_d, 1 ]; end\n        fprintf('(');\n        for kk = 1:length(otp_d)-1, fprintf('%4d x ', otp_d(kk) ); end\n        fprintf('%4d )', otp_d(end) );\n    end\nend\nend\n\n\nend % end of main program\n\n% ------- External subfunctions ------------\nfunction y = linop_stack_row( linearF, N, dims, x, mode )\nswitch mode,\n    case 0,\n        y = dims;\n    case 1,\n        y = 0;\n        x = cell( x );\n        for j = 1 : N,\n            lF = linearF{j};\n            if ~isempty(lF), y = y + lF(x{j},1); end\n        end\n    case 2,\n        y = cell(1,N);\n        for j = 1 : N,\n            lF = linearF{j};\n            if ~isempty(lF), y{j} = lF(x,2); else y{j} = 0*x; end\n        end\n        y = tfocs_tuple( y );\nend\nend\n\nfunction y = linop_stack_col( linearF, N, dims, x, mode )\nswitch mode,\n    case 0,\n        y = dims;\n    case 1,\n        y = cell(1,N);\n        for j = 1 : N,\n            lF = linearF{j};\n            if ~isempty(lF), y{j} = lF(x,1); else y{j} = 0*x; end\n        end\n        y = tfocs_tuple( y );\n    case 2,\n        y = 0;\n        x = cell( x );\n        for j = 1 : N,\n            lF = linearF{j};\n            if ~isempty(lF), y = y + lF(x{j},2); end\n        end\nend\nend\n\nfunction y = linop_stack_mat( linearF, sZ, dims, x, mode )\nswitch mode,\n    case 0,\n        y = dims;\n    case 1,\n        x = cell( x );\n        y = cell( 1, sZ(1) );\n        for i = 1 : sZ(1),\n            ans = 0;\n            for j = 1 : sZ(2),\n                lF = linearF{i,j};\n                if ~isempty(lF), ans = ans + lF(x{j},1); end\n            end\n            y{i} = ans;\n        end\n        y = tfocs_tuple( y );\n    case 2,\n        x = cell( x );\n        y = cell( 1, sZ(2) );\n        for j = 1 : sZ(2),\n            ans = 0;\n            for i = 1 : sZ(1),\n                lF = linearF{i,j};\n                if ~isempty(lF), ans = ans + lF(x{i},2); end\n            end\n            y{j} = ans;\n        end\n        y = tfocs_tuple( y );\nend\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/print_cell_size.m",
    "content": "function print_cell_size( c , fid, offsetPossible )\n% c should be a cell array\n\nif nargin < 2 || isempty(fid), fid = 1; end\nif nargin < 3 || isempty(offsetPossible), offsetPossible = false; end\n\nif ~iscell(c)\n    fprintf(fid,'\\tcomponent 1: ');\n%     d = size(c);\n    d = c;\n    for k = 1:(length(d)-1)\n        fprintf(fid,'%4d x ',d(k) );\n    end\n    fprintf(fid,'%4d\\n', d(k+1) );\n    fprintf(fid,' (but input to printCellSize should have been a cell array)\\n');\n    return;\nelse\n    for j = 1:length(c)\n        if j == length(c) && offsetPossible && all(size( c{j} ) == [1,2] ) ...\n                && all( c{j} == [1,1] )\n            fprintf(fid,'\\tcomponent %2d is fixed (i.e. an offset)\\n', j );\n        else\n            fprintf(fid,'\\tcomponent %2d: ', j );\n            if isempty( c{j} )\n                fprintf(fid,'size not yet determined\\n');\n            else\n                d = c{j};\n                if length(d) < 2, d = [d,1]; end % this case shouldn't arise...\n                for k = 1:(length(d)-1)\n                    fprintf(fid,'%4d x ',d(k) );\n                end\n                fprintf(fid,'%4d\\n', d(k+1) ); % bug, Feb 29 2012: change d(k) to d(k+1)\n            end\n        end\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information."
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/prox_stack.m",
    "content": "function op = prox_stack( varargin )\n\n% OP = PROJ_STACK( P1, P2, P3, ..., PN )\n%    \"Stacks\" N proximity functions P1, P2, P3, ..., PN together, to create\n%    a single proximity function that operates on an N-tuple. Returns a\n%    function handle ready to be used in \n\nargs = varargin;\nwhile isa( args, 'cell' ) && numel( args ) == 1,\n    args = args{1};\nend\nif isempty( args ),\n    op = @proj_Rn;\nelseif isa( args, 'function_handle' ),\n    op = args;\nelseif ~isa( args, 'cell' ),\n    error( 'Expected one or more projector function handles.' );\nelse\n    op = @(varargin)proj_stack_impl( args, varargin{:} );\nend\n\nfunction [ v, x ] = proj_stack_impl( proj, y, t )\n\nnp = numel(proj);\nno = nargout > 1;\nni = nargin > 2;\ny = cell( y );\nif no,\n    v = zeros( 1, np );\n    x = cell( 1, np );\nelse\n    v = 0;\nend\nif ni && numel(t) == 1,\n    t = t * ones(1,np);\nend\nswitch 2 * no + ni,\ncase 0, % 1 input, 1 output    \n    for k = 1 : np,\n        v = v + proj{k}( y{k} );\n    end\ncase 1, % 2 inputs, 1 output\n    for k = 1 : np,\n        v = v + proj{k}( y{k}, t(k) );\n    end\ncase 2, % 1 input, 2 outputs\n    for k = 1 : np,\n        [ v(k), x{k} ] = proj{k}( y{k} );\n    end\ncase 3, % 2 inputs, 2 outputs\n    v = zeros( 1, np );\n    x = cell( 1, np ); \n    for k = 1 : np,\n        [ v(k), x{k} ] = proj{k}( y{k}, t(k) );\n    end\nend\nif no,\n    v = sum( v );\n    x = tfocs_tuple( x );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/safe_eig.m",
    "content": "function [V,D] = safe_eig(X)\n% [V,D] = safe_eig(X)\n%   calls [V,D] = eig(X) and tests for a common error\n%   (http://ask.cvxr.com/t/eig-did-not-converge-in-prox-trace/996/4)\n%   and if it finds it, runs a replacement algorithm\ntry\n    [V,D]   = eig(X);\ncatch ME\n    if (strcmpi(ME.identifier,'MATLAB:eig:NoConvergence'))\n        [V,D]   = eig_backup(X);\n    else\n        rethrow(ME);\n    end\nend"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/size_ambig.m",
    "content": "function ans = size_ambig( sz )\n\nswitch class( sz ),\n    case 'double',\n        ans = isempty( sz );\n    case 'cell',\n        if isa( sz{1}, 'function_handle' ),\n            ans = false; % it's not ambiguous as long as it's a valid function...\n        elseif isempty( sz ),\n            ans = true;\n        else\n            ans = false;\n            for k = 1 : numel( sz ),\n                if size_ambig( sz{k} ),\n                    ans = true;\n                    break;\n                end\n            end\n        end\n    otherwise,\n        ans = true;\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/size_compat.m",
    "content": "function [ a, sX ] = size_compat( sX, sY )\na = true;\nswitch class( sX ),\n    case 'double',\n        if isempty( sX ) || all( sX == 0 ),\n            sX = sY;\n        elseif isempty( sY ) || all( sY == 0 ),\n        elseif ~isequal( sX, sY ),\n            \n            % Feb 29, 2012. Special case:\n            %   One represents the size a x b x c, where c = 1\n            %   The other is a x b (since Matlab often automatically squeezes\n            %   3D arrays to 2D if the 3rd dimension is a singletone)\n%             if (length(sX) >= 3 && length(sX) == length(sY)+1 && sX(end)==1) || ...\n%                     (length(sY) >= 3 && length(sY) == length(sX)+1 && sY(end)==1)\n                % do nothing\n            % March 2012, a better fix (also due to Graham Coleman)\n            if min( length(sX),length(sY) ) >= 2\n                truncA  = cutTrailingOnes(sX);\n                truncB  = cutTrailingOnes(sY);\n                a = isequal( truncA, truncB );\n            else\n                a = false;\n            end\n        end\n    case 'cell',\n        if ~isa( sY, 'cell' ) || numel( sX ) ~= numel( sY ) || isa( sX{1}, 'function_handle' ) && ~isequal( sX, sY ),\n            a = false;\n        elseif isa( sX{1}, 'function_handle' ),\n            a = isequal( sX, sY );\n        else\n            for k = 1 : numel( sX ),\n                [ ta, sX{k} ] = size_compat( sX{k}, sY{k} );\n                a = a && ta;\n            end\n        end\n    otherwise,\n        a = isequal( sX, sY );\nend\nif ~a,\n    sX = [];\nend\n\nfunction y = cutTrailingOnes( x )\n%cuts the final ones of a vector, and columnize\n\nlastNotOne = find( x(:)~=1, 1, 'last' );\n\n%do not cut before 2nd position\nlastNotOne = max( 2, lastNotOne );\n\ny = x(1:lastNotOne);\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/smooth_stack.m",
    "content": "function op = smooth_stack( varargin )\n\n% OP = SMOOTH_STACK( S1, S2, S3, ..., SN )\n%    \"Stacks\" N smooth functions S1, S2, S3, ..., SN together to create\n%    a single smooth function that operates on an N-tuple. Returns a\n%    function handle ready to be used in TFOCS.\n\nargs = varargin;\nwhile isa( args, 'cell' ) && numel( args ) == 1,\n    args = args{1};\nend\nif isempty( args ),\n    op = @smooth_zero;\nelseif isa( args, 'function_handle' ),\n    op = args;\nelseif ~isa( args, 'cell' ),\n    error( 'Expected one or more smooth function handles.' );\nelse\n    op = @(varargin)smooth_stack_impl( args, varargin{:} );\nend\n\nfunction [ f, g ] = smooth_stack_impl( smooth, x )\n\nnp = numel(smooth);\nx = cell( x );\nif nargout > 1,\n    f = zeros( 1, np );\n    g = cell( 1, np );\n    for k = 1 : np,\n        [ f(k), g{k} ] = smooth{k}( x{k} );\n    end\n    f = sum( f );\n    g = tfocs_tuple( g );\nelse\n    f = 0;\n    for k = 1 : np,\n        f = f + smooth{k}( x{k} );\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/solver_apply.m",
    "content": "function varargout = solver_apply( ndxs, func, varargin )\nglobal tfocs_count___\n\n%SOLVER_APPLY\tInternal TFOCS routine.\n%\tA wrapper function used to facilitate the counting of function calls, and\n%   to standardize the number of output arguments for the algorithms.\n\n[ varargout{1:max(nargout,1)} ] = func( varargin{:} );\ntfocs_count___(ndxs) = tfocs_count___(ndxs) + 1;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/tfocs_backtrack.m",
    "content": "% TFOCS_BACKTRACK\n% Backtracking helper script.\n\ndo_break    = false; % added for compatibility with R2015b\nwhile true\n\n% Quick exit for no backtracking\nif beta >= 1\n    do_break = true;\n    break; \nend % SRB changing == to >=\n\n% Quick exit if no progress made\nxy = x - y;\nxy_sq = tfocs_normsq( xy );\nif xy_sq == 0, localL = Inf; do_break=true; break; end\n%fprintf('xy_sq/x is %.2e\\n', xy_sq/tfocs_normsq(x) );\nif xy_sq/tfocs_normsq(x) < eps, cntr_Ax=Inf; end % force a reset\n\n% Compute Lipschitz estimate\nif backtrack_simple,\n    if isinf( f_x ),\n        f_x = apply_smooth( A_x );\n    end\n    q_x = f_y + tfocs_dot( xy, g_y ) + 0.5 * L * xy_sq;\n    localL = L + 2 * max( f_x - q_x, 0 ) / xy_sq;\n    backtrack_simple = abs( f_y - f_x ) >= backtrack_tol * max( abs( f_x ), abs( f_y ) );\nelse\n    if isempty( g_Ax ),\n        [ f_x, g_Ax ] = apply_smooth( A_x );\n    end\n    localL = 2 * tfocs_dot( A_x - A_y, g_Ax - g_Ay ) / xy_sq;\nend\n\n% Exit if Lipschitz criterion satisfied, or if we hit Lexact\nbacktrack_steps = backtrack_steps + 1;\nif localL <= L || L >= Lexact, do_break=true; break; end\nif ~isinf( localL ), \n    L = min( Lexact, localL );\nelseif isinf( localL )\n    localL = L;\nend\nL = min( Lexact, max( localL, L / beta ) );\n\nbreak;\nend % end of \"while true\"\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/tfocs_cleanup.m",
    "content": "%SOLVER_CLEANUP    TFOCS helper script\n%   Performs the final set of operations for our templated solvers: performs\n%   final calculations, prints final outputs, cleans up unused data.\n\n% This should be called just after tfocs_iterate, so re-use some of that\n%   computation:\n\n% We have two sequences of points, the x and the y sequence\n%   Other things being equal, we will use the x sequence as output\n%   But in some cases, if we use y, there is less computation to do\n%   since we can re-use some older computation. If it is the case that\n%   computing y is cheap, then we will still compute x, but now we will\n%   compare x and y and take whichever is better (ties going toward x)\n\nif exist('cur_dual','var')\n    cur_dual    = get_dual( cur_dual );\nend\nif v_is_y && ~output_always_use_x\n    % We have some free information about y\n    % cur_pri = y\n    if data_collection_always_use_x\n        % f_vy and dual_y have already been saved\n    else\n        f_vy    = f_v;\n        if saddle, dual_y  = cur_dual; end\n    end\nend\nif ~v_is_x\n    if saddle,\n        if isempty(g_Ax),\n            [ f_x, g_Ax ] = apply_smooth(A_x);\n        end\n        cur_dual    = get_dual( g_Ax );\n    elseif isinf(f_x),\n        f_x = apply_smooth(A_x);\n    end\n    if isinf( C_x ),\n        C_x = apply_projector( x );\n    end\n    f_v         = maxmin * ( f_x + C_x );\n    cur_pri     = x;\nend\n% Now, compare x and y if info on y is available, and take whichever is better\nx_or_y_string = 'x';\nif v_is_y && ~output_always_use_x\n    if f_vy < f_v\n        f_v     = f_vy;\n        if saddle, cur_dual= dual_y; end\n        x       = y; % losing information after this point!\n        x_or_y_string = 'y';\n    end\nend\nif saddle\n    if ~exist('cur_dual','var')\n        if isempty(g_Ax),\n            [ f_x, g_Ax ] = apply_smooth(A_x);\n        end\n        cur_dual    = get_dual( g_Ax );\n    end\n    out.dual    = cur_dual;\n    if isa( out.dual, 'tfocs_tuple')\n        out.dual = cell( out.dual );\n    end\nend\nif fid && printEvery,\n\tfprintf( fid, 'Finished: %s\\n', status );\nend\nout.niter = n_iter;\nout.status = status;\nout.x_or_y = x_or_y_string;\nd.niter = 'Number of iterations';\nif saveHist,\n    out.f(n_iter) = f_v;\n    out.f(n_iter+1:end) = [];\n    out.normGrad(n_iter+1:end) = [];\n    out.stepsize(n_iter+1:end) = [];\n    out.theta(n_iter+1:end,:) = [];\n    if countOps,\n        out.counts(n_iter+1:end,:) = [];\n    end\n    if ~isempty(errFcn),\n        out.err(n_iter+1:end,:) = [];\n    end\n    d.f        = 'Objective function history';\n    d.normDecr = 'Decrement norm';\n    d.stepsize = 'Stepsize';\n    d.theta    = 'Acceleration parameter history';\n    if countOps,\n        d.counts   = strvcat(...\n        'k x 4 arry, with columns [F,G,A,P] where',...\n        'F: Number of function evaluations of the smooth function',...\n        'G: Number of gradient evaluations of the smooth function',...\n        'A: Number of calls to the linear operator and its transpose',...\n        'N: Number of calls to the nonsmooth function (w/o projection)',...\n        'P: Number of calls to the projection operator' );\n    end\n    if ~isempty(errFcn)\n        d.err = 'Error, determined by evaluating the user-supplied error function';\n    end\nend\nout.description = d;\nif countOps,\n    clear global tfocs_count___\nend\n    \n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/tfocs_initialize.m",
    "content": "%SOLVER_INITIALIZE\tTFOCS helper script\n%\tPerforms the initializations common to all of the first-order solvers\n\n% Process the options structure and string/value pairs. First, we replace the\n% default values with any values specified by the user in the 'opts' structure.\n% We ignore any fields in the 'opts' structure that do not match ours, so that\n% users can re-use the opts structure for other purposes.\n\nodef = struct( ...\n    'maxIts',     Inf   ,...\n    'maxCounts',  Inf   ,...\n    'countOps',   false ,... % adjusted if maxCounts < Inf\n    'saveHist',   true  ,...\n    'adjoint',    false ,...\n    'saddle',     false ,...\n    'tol',        1e-8  ,...\n    'errFcn',     {{}}  ,...\n    'stopFcn',    {{}}  ,...\n    'printEvery', 100   ,...\n    'maxmin',     1     ,...\n    'beta',       0.5   ,...\n    'alpha',      0.9   ,... % See below for special CG stuff\n    'L0',         1     ,... % See below \n    'Lexact',     Inf   ,...\n    'mu',         0     ,...\n    'fid',        1     ,...\n    'stopCrit',   1     ,... % the TFOCS paper used stopCrit = 2\n    'alg',        'AT'  ,...\n    'restart',    Inf   ,...\n    'printStopCrit', false,...\n    'cntr_reset',  -50   ,... % how often to explicitly recompute A*x and A*y (set to Inf if you want )\n    'cg_restart', Inf   ,... % for CG only\n    'cg_type',    'pr'  ,...  % for CG only\n    'stopping_criteria_always_use_x',   false, ...\n    'data_collection_always_use_x',     false, ...\n    'output_always_use_x',              false,  ...\n    'autoRestart',  'gra', ... % function or gradient\n    'printRestart', true, ...\n    'debug',      false ....\n    );\n\n% Calling the solver with a no arguments returns the default options structure\nif narginn < 1 || ( narginn ==1 && isstruct( smoothF ) )\n    opts = odef;\n    % remove the \"CG\" options for now, since they are undocumented\n    opts    = rmfield(opts,'cg_restart');\n    opts    = rmfield(opts,'cg_type');\n    % if any default options are passed in (e.g. by tfocs_SCD), add those now:\n    if ( narginn ==1 && isstruct( smoothF ) )\n        for f = fieldnames( smoothF )'\n            opts.( f{1} )   = smoothF.( f{1} );\n        end\n    end\n    \n    out = [];\n    x = opts;\n    if nargoutt == 0,\n        disp('====== TFOCS default options =======');\n%         disp('Format is    fieldname: { [default]  ''Usage type.\n%         Description''}');\n        \n        % add some helpful description\n        desc = [];\n        desc.alg    = 'Algorithm, e.g. GRA for gradient descent. Values: AT, GRA, LLM, N07, N83, TS';\n        desc.maxIts = 'Basic. Maximum number of allowed iterations';\n        desc.saveHist   = 'Basic. Record history of all iterations';\n        desc.restart    = 'Basic. Restart parameter. Make negative for \"no-regress\" feature';\n        desc.tol    = 'Basic. Tolerance for stopping criteria';\n        desc.L0     = 'Basic. Initial estimate of Lipschitz constant';\n        desc.Lexact = 'Basic. Known bound of Lipschitz constant';\n        desc.printEvery = 'Basic. How often to print info to the terminal; set to 0 or Inf to suppress output';\n        desc.maxmin = 'Basic. +1 for convex minimization, -1 for concave maximization';\n        \n        desc.errFcn = 'Medium. User-specified error function. See user guide';\n        desc.beta   = 'Medium. Backtracking parameter, in (0,1). No line search if >= 1';\n        desc.alpha  = 'Medium. Line search increase parameter, in (0,1)';\n        desc.autoRestart= 'Medium. Set to ''gra'' or ''fun'' to choose behavior when restart<0';\n\n        \n        desc.maxCounts  = 'Advanced. Vector that fine-tunes various types of iteration limits; same form as countOps';\n        desc.countOps   = 'Advanced. Record number of linear multiplies, etc.; form [fcn, grad, linear, nonsmth, proj]';\n        desc.mu         = 'Advanced. Strong convexity parameter.';\n        desc.fid        = 'Advanced. File id, e.g. via fopen. All output is sent to this file';\n        desc.stopFcn    = 'Advanced. User-supplied stopping criteria. See user guide';\n        desc.stopCrit   = 'Advanced. Controls which stopping criteria to use; 1,2, 3 or 4.';\n        desc.printStopCrit = 'Advanced. Controls whether to display the value used in the stopping criteria';\n        desc.printRestart  = 'Advanced. Whether to signal when a restart happens';\n        desc.cntr_reset = 'Advanced. Controls how often to reset some numerical computations to avoid roundoff';\n        desc.debug = 'Advanced.  Turns on more useful error messages';\n        \n        desc.stopping_criteria_always_use_x = 'Advanced. Forces usage of x, never y, in stopping crit.';\n        desc.data_collection_always_use_x   = 'Advanced. Forces usage of x, nevery y, in recording errors.';\n        desc.output_always_use_x            = 'Advanced. Forces output of x, never y. Default: uses whichever is better';\n        \n        desc.adjoint = 'Internal.';\n        desc.saddle = 'Internal.  Used by TFOCS_SCD';\n        \n        \n        \n        disp( opts );\n        disp('====== Description of TFOCS options =======');\n        disp( desc );\n    end\n    return % from this script only; the calling function does not return\nend\n\n% [smoothF, affineF, projectorF, x0, opts ] = deal(varargin{:});\n% Check for incorrect types\nF_types = {'function_handle','cell','double','single'};\nassert( ismember(class(smoothF),F_types),'smoothF is of wrong type' );\nassert( ismember(class(affineF),F_types),'affineF is of wrong type' );\nassert( ismember(class(projectorF),F_types),'projectorF 3 is of wrong type' );\nif narginn >= 4\n    x0_types = {'cell','double','single','tfocs_tuple'};\n    assert( ismember(class(x0),x0_types),'x0 is of wrong type' );\nend\nif narginn >= 5 && ~isempty(opts)\n    assert( ismember(class(opts),{'struct'}),'opts is of wrong type' );\nend\n\n% Some parameters defaults depend on whether the user supplies other\n% options. These will be updated later\nL0_default  = odef.L0;\nodef.L0     = Inf;\n\nalpha_default    = odef.alpha; % typically 0.9\nalpha_default_CG = 1;\nodef.alpha  = Inf;\n\n\n\n% Process the options structure, merging it with the default options\n%   (merge \"opts\" into \"odef\")\ndef_fields = fieldnames(odef)';              % default options\nif narginn > 4 && ~isempty(opts),\n    use_fields = zeros(size(def_fields));\n    opt_fields = fieldnames(opts)';          % user-supplied options\n    for k = opt_fields,\n        k = k{1};\n        ndx = find(strcmpi(def_fields,k));\n        if ~isempty(ndx)\n            if ~isempty(opts.(k)) && ~use_fields(ndx),\n                odef.(def_fields{ndx}) = opts.(k);\n            end\n            use_fields(ndx) = use_fields(ndx) + 1;\n        else\n            % Warn if the field is not found in our options structure\n            warnState = warning('query','backtrace');\n            warning off backtrace\n            warning('TFOCS:OptionsStructure',' Found extraneous field \"%s\" in options structure', k );\n            warning(warnState);\n        end\n    end\n    % Warn if fields appear twice due to capitalization; e.g., maxIts/maxits\n    if any(use_fields>1),\n        warnState = warning('query','backtrace');\n        warning off backtrace\n        warning('TFOCS:OptionsStructure',' Some fieldnames of the options structure are identical up to capitalization: unpredictable behavior');\n        warning(warnState);\n    end\nend\n\n% Remove unnecessary options\nif ~strcmpi( odef.alg, 'cg' )\n    odef = rmfield( odef, 'cg_restart' );\n    odef = rmfield( odef, 'cg_type' );\n    % update our list of fieldnames\n    def_fields = fieldnames(odef)';\nend\n\n% If opts.alpha wasn't supplied, use a default value:\nif isinf(odef.alpha)\n    if strcmpi( odef.alg, 'cg' )\n        odef.alpha = alpha_default_CG;\n    else\n        odef.alpha = alpha_default;\n    end\nend\n\n% If opts.printEvery is Inf, set it to 0\nif isinf(odef.printEvery)\n    odef.printEvery = 0;\nend\n\n% The default value of L0 is set to Lexact, if it is supplied\nif isinf(odef.L0),\n    if isinf(odef.Lexact),\n        if odef.beta >= 1,\n            error( 'For a fixed step size, L0 or Lexact must be supplied.' );\n        end\n        odef.L0 = L0_default;\n    else\n        odef.L0 = odef.Lexact;\n    end\nend\n% If maxCounts is set, set countOps to true\nif any(odef.maxCounts<Inf),\n    odef.countOps = true;\nend\n% If cntr_reset is not set (signfied by being negative), set to defaults\nif odef.cntr_reset < 0\n    odef.cntr_reset = round(abs(odef.cntr_reset));\n    % and if we requested high precision, change the default\n    if odef.tol < 1e-12\n        odef.cntr_reset = 10; \n    end\nend\n\n% Now move the options into the current workspace\nfor k = def_fields,\n    assignin('caller',k{1},odef.(k{1}));\nend\nopts = odef;\n\n%\n% Smooth function, pass 1\n%\n\nif isempty( smoothF ),\n\terror( 'Must supply a smooth function specification.' );\nelseif isa( smoothF, 'function_handle' ),\n    smoothF = { smoothF };\nelseif ~isa( smoothF, 'cell' ),\n    error( 'smoothF must be a function handle, or a cell array of them.' );\nend\nn_smooth = numel(smoothF);\nsaddle_ndxs = 1 : n_smooth;\n% Adding Feb 2011: a get_dual function (see below)\n\n\n%\n% Projector, pass 1\n%\n\nif isa( projectorF, 'function_handle' ),\n    projectorF = { projectorF };\nelseif ~isa( projectorF, 'cell' ) && ~isempty( projectorF ),\n    error( 'projectorF must be a function handle, or a cell array of them.' );\nend\nn_proj = numel(projectorF);\n\n%\n% Linear functions and affine offsets\n%\n\n% If the affine operator is anything *but* a cell array, convert it to one.\nmaxmin = sign(maxmin);\nif isempty( affineF )\n    affineF = { @linop_identity };\nelseif isnumeric( affineF ),\n    if ndims(affineF) > 1,\n        error( 'Multidimensional arrays are not permitted.' );\n    end\n    if numel(affineF) == 1,\n        identity_linop = affineF == 1;\n        affineF = { linop_scale( affineF ) };\n    else\n        identity_linop = false;\n        affineF = { linop_matrix( affineF ) };\n    end\nelseif isa( affineF, 'function_handle' ),\n    affineF = { affineF };\nelseif ~isa( affineF, 'cell' ),\n    error( 'Invalid affine operator specification.' );\nend\n\n% If adjoint mode is specified, temporarily transpose the affineF cell\n% array so that the rows and columns match the number of smooth functions\n% and projectors, respectively. Then verify size compatibility.\nif adjoint, affineF = affineF'; end\n[ m_aff, n_aff ] = size( affineF );\n% if all( m_aff ~= n_smooth + [0,1] ) || n_proj && all( n_aff ~= n_proj + [0,1] ),\n%     error( 'The affine operation matrix has incompatible dimensions.' );\n% May 16, 2011: making error messages more informative\nif all( m_aff ~= n_smooth + [0,1] )\n    if fid\n        fprintf(fid,'Detected error: inputs are of wrong size\\n');\n        fprintf(fid,'  Found %d smooth functions, so expect that many primal variables\\n',...\n            n_smooth );\n        fprintf(fid,'  So the affine operator should have %d (or %d if there is an offset) entries\\n',...\n            n_smooth, n_smooth+1 );\n        fprintf(fid,'  but instead found %d affine operators\\n', m_aff );\n        fprintf(fid,' Perhaps you need the transpose of the affine operator?\\n');\n    end\n    error( 'The affine operation matrix has incompatible dimensions.' );\nelseif n_proj && all( n_aff ~= n_proj + [0,1] ),\n    if fid\n        fprintf(fid,'Detected error: inputs are of wrong size\\n');\n        fprintf(fid,'  Found %d nonsmooth functions, so expect %d or %d sets of affine operators\\n',...\n            n_proj, n_proj, n_proj + 1 );\n        fprintf(fid,'  but instead found %d affine operators\\n', n_aff );\n    end\n    error( 'The affine operation matrix has incompatible dimensions.' );\nelseif n_proj == 0,\n    n_proj = max( 1, m_aff - 1 );\nend\ninp_dims = cell( 1, n_proj );\notp_dims = cell( 1, n_smooth );\n\n% If an additional affine portion of the objective has been specified,\n% create an additional smooth function to contain it.\nif m_aff == n_smooth + 1,\n    offset          = true; % note: saddle_ndxs is 1:n_smooth\n    otp_dims{end+1} = [1,1];\n    smoothF{end+1}  = smooth_linear( maxmin );\n    n_smooth = n_smooth + 1;\n    for k = 1 : n_proj,\n        offX = affineF{end,k};\n        if isempty(offX),\n            affineF{end,k} = 0;\n        elseif isa(offX,'function_handle'),\n            if adjoint, pos = 'row'; else pos = 'column'; end\n            error( 'The elements in the last %s must be constants.', pos );\n        elseif isnumeric(offX) && numel(offX) == 1 && offX == 0,\n            affineF{end,k} = 0;\n        elseif nnz(offX),\n            affineF{end,k} = linop_dot( affineF{end,k}, adjoint );\n            % add a case if ~nnz(offX)... Jan 2012\n        elseif ~nnz(offX)\n            affineF{end,k} = 0;\n        end\n    end\nelse\n    offset      = false;\nend\n\n% If an affine offset has been specified, integrate those offsets into\n% each smooth function, then remove that portion of the array.\nif n_aff == n_proj + 1,\n    for k = 1 : n_smooth,\n        offX = affineF{k,end};\n        if isempty(offX),\n            continue;\n        elseif isa(offX,'function_handle'),\n            if adjoint, pos = 'column'; else pos = 'row'; end\n            error( 'The elements in the last %s must be constant matrices.', pos );\n        elseif isnumeric(offX) && numel(offX) == 1 && offX == 0,\n            continue;\n        else\n            otp_dims{k} = size(offX);\n            if nnz(offX),\n                smoothF{k} = @(x)smoothF{k}( x + offX );\n            end\n        end\n    end\n    n_aff = n_aff - 1;\n    affineF(:,end) = [];\nend\n\n\n% -- Todo:\n%   If opts.debug = true, then before calling linop_stack,\n%   we should print a message showing the sizes of everything\n%   (this is useful when the linear portion is entered as \"1\" or \"[]\"\n%    and we have automatically determined the size ).\n\n% Transpose back, if necessary; then check dimensions\nif adjoint,\n    affineF = affineF';\n    [ linearF, otp_dims, inp_dims ] = linop_stack( affineF, otp_dims, inp_dims, debug );\n    linearF = linop_adjoint( linearF );\nelse\n    [ linearF, inp_dims, otp_dims ] = linop_stack( affineF, [], [], debug );\nend\nidentity_linop = isequal( linearF, @linop_identity ); % doesn't always catch identities\nsquare_linop = identity_linop || isequal( inp_dims, otp_dims );\nadj_arr = [0,2,1];\nif countOps,\n    apply_linear = @(x,mode)solver_apply( 3, linearF, x, mode );\nelse\n    apply_linear = linearF;\nend\n\n%\n% Smooth function, pass 2: integrate scale, counting\n%\n\nsmoothF = smooth_stack( smoothF );\nif maxmin < 0,\n    smoothF = tfunc_scale( smoothF, -1 );\nend\nif countOps,\n    apply_smooth = @(x)solver_apply( 1:(1+(nargoutt>1)), smoothF, x );\nelse\n    apply_smooth = smoothF;\nend\n\n%\n% Projector, pass 2: supply default, stack it up, etc.\n%\n\nif isempty( projectorF ),\n    n_proj = 0;\n    projectorF = proj_Rn;\nelse\n    projectorF = prox_stack( projectorF );\nend\nif countOps,\n    apply_projector = @(varargin)solver_apply( 4:(4+(nargoutt>1)), projectorF, varargin{:} );\nelse\n    apply_projector = projectorF;\nend\n\n%\n% Initialize the op counts\n%\n\nif countOps,\n    global tfocs_count___\n    tfocs_count___ = [0,0,0,0,0];\n    maxCounts = maxCounts(:)';\nend\n\n%\n% Construct the common initial values\n%\n\nL = L0;\ntheta = Inf;\nf_v_old = Inf;\nx = []; A_x = []; f_x = Inf; C_x = Inf; g_x = []; g_Ax = [];\nrestart_iter = 0;\nwarning_lipschitz = 0;\nbacktrack_simple = true;\nbacktrack_tol = 1e-10;\nbacktrack_steps = 0;\n\n%\n% Try to determine the size of the input, and construct the initial point.\n%\n\n% Attempt 1: From x0 itself\nzero_x0 = true;\nif ~isempty( x0 ),\n    if isa( x0, 'tfocs_tuple' )\n        x0  = cell(x0);\n    end\n    if isa( x0, 'cell' ),\n        n_x0 = numel( x0 );\n        if n_x0 == 1,\n            x0 = x0{1};\n        else\n            x0 = tfocs_tuple( x0 );\n        end\n    else\n        n_x0 = 1;\n    end\n    if n_proj && n_proj ~= n_x0,\n        error( 'Size conflict detected between the projector and x0.' );\n    end\n    zero_x0 = ~nnz(x0);\n% Attempt 2: From the linear operator dimensions\nelseif ~size_ambig( inp_dims ),\n    x0 = tfocs_zeros( inp_dims );\nelseif ~size_ambig( otp_dims ),\n    A_x = tfocs_zeros( otp_dims );\n    x0 = apply_linear( A_x, 2 );\nend\nif isempty( x0 ),\n    error( 'Could not determine the dimensions of the problem. Please supply an explicit value for x0.' );\nend\nx = x0;\nif isinf( C_x ),\n    C_x = apply_projector( x );\n    if isinf( C_x ),\n        zero_x0 = false;\n        [ C_x, x ] = apply_projector( x, 1 );\n    end\nend\nif isempty( A_x ),\n    if identity_linop || zero_x0 && square_linop,\n        A_x = x;\n    elseif ~zero_x0 || size_ambig( otp_dims ),  % Jan 2012: todo: give size_ambig the 'offset' information\n        A_x = apply_linear( x, 1 ); % celldisp( size(A_x) )\n    else\n        A_x = tfocs_zeros( otp_dims );\n    end\nend\n\n% New, Jan 2012\nif debug\n    if ~adjoint, str1 = 'primal'; str2 = 'dual';\n    else, str1 = 'dual'; str2 = 'primal'; \n    end\n    fprintf(fid,'------- DEBUG INFO -----------\\n');\n    offsetPossible  = offset && ~adjoint;\n    fprintf(fid,'Size of %s variable, via method 1\\n', str1);\n    print_cell_size( size(x0), fid, offsetPossible);\n    fprintf(fid,'Size of %s variable, via method 2\\n', str1);\n    print_cell_size( inp_dims, fid, offsetPossible);    \n    \n    offsetPossible  = offset && adjoint;\n    fprintf(fid,'Size of %s variable, via method 1\\n', str2);\n    print_cell_size( size(A_x), fid, offsetPossible);\n    fprintf(fid,'Size of %s variable, via method 2\\n', str2);\n    print_cell_size( otp_dims, fid, offsetPossible); \n    fprintf(fid,'------------------------------\\n');\nend\n% Added Dec 2012, check for bad sizes that are not integers\nif ~isequal( otp_dims, tfocs_round(otp_dims) )\n    error('Output dimensions must be integer valued');\nend\nif ~isequal( inp_dims, tfocs_round(inp_dims) )\n    error('Input dimensions must be integer valued');\nend\n\n% Final size check\n[ isOK1, inp_dims ] = size_compat( size(x0), inp_dims );\n[ isOK2, otp_dims ] = size_compat( size(A_x), otp_dims );\nif ~isOK1 || ~isOK2,\n    if debug\n        if ~isOK1\n            fprintf(fid,'Debug message: size of %s variables did not line up\\n',str1);\n        end\n        if ~isOK2\n            fprintf(fid,'Debug message: size of %s variables did not line up\\n',str2);\n        end\n    end\n    error( 'Could not determine the dimensions of the problem. Please supply an explicit value for x0.' );\nend\n[ f_x, g_Ax ] = apply_smooth( A_x );\nif isinf( f_x ),\n    error( 'The initial point lies outside of the domain of the smooth function.' );\nend\n% Adding Feb 2011: \nif isa(g_Ax,'tfocs_tuple')\n    get_dual = @(g_Ax) get( g_Ax, saddle_ndxs );\nelse\n    get_dual = @(g_Ax) g_Ax;\nend\n\n% Theta advancement function\n% if mu > 0 && Lexact > mu \nif mu > 0 && ~isinf(Lexact) && Lexact > mu, % fixed Dec 2011\n    if ~strcmp(alg,'N83')\n        warnState = warning('query','backtrace');\n        warning off backtrace\n        warning('TFOCS:OptionsStructure',' Lexact and mu>0 specifications only give guaranteed convergence with N83 algorithm');\n        if strcmp(alg,'AT')\n            warning('TFOCS:OptionsStructure',' (With AT algorithm, known to give wrong solutions sometimes when mu>0)');\n        end\n        warning(warnState);\n    end\n    % Note that we have not yet derived theory to adapt this to\n    %   a local Lipschitz constant but that it should be possible\n    theta_scale = sqrt(mu / Lexact);\n    theta_scale = ( 1 - theta_scale ) / ( 1 + theta_scale );\n    advance_theta = @(theta_old,L,L_old) min(1,theta_old*theta_scale);\nelse\n    advance_theta = @(theta_old,L,L_old) 2/(1+sqrt(1+4*(L/L_old)/theta_old.^2));\nend\n\n% Preallocate the arrays for the output structure\nout.alg = alg; \nout.algorithm = algorithm;\nif ~isempty(errFcn) && ~iscell(errFcn),\n   errFcn = { errFcn };\nend\nif ~isempty(stopFcn) && ~iscell(stopFcn),\n   stopFcn = { stopFcn };\nend\nerrs = zeros(1,length(errFcn));\nif nargoutt == 1,\n    saveHist = false;\nend\nif saveHist,\n    [ out.f, out.normGrad, out.stepsize, out.theta ] = deal( zeros(0,1) );\n    if countOps,\n        out.counts = zeros(0,length(tfocs_count___));\n    end\n    if ~isempty(errFcn),\n        out.err = zeros(0,length(errs));\n    end\nend\nif saddle,\n    out.dual = [];\nend\nn_iter = 0;\nstatus = '';\n\n% Initialize the iterate values\ny    = x;    z    = x;\nA_y  = A_x;  A_z  = A_x;\nC_y  = Inf;  C_z  = C_x;\nf_y  = f_x;  f_z  = f_x;\ng_y  = g_x;  g_z  = g_x;\ng_Ay = g_Ax; g_Az = g_Ax;\nnorm_x = sqrt( tfocs_normsq( x ) );\n\n% for recomputing linear operators\ncntr_Ay     = 0;\ncntr_Ax     = 0;\n\n% Special setup for constant step sizes\nif beta >= 1,\n    beta = 1;\n\talpha = 1;\nend\n\n% Print the opening text\nif fid && printEvery,\n\tfprintf(fid,'%s\\n',algorithm);\n\tfprintf(fid,'Iter    Objective   |dx|/|x|    step');\n    if countOps, fprintf( fid, '       F     G     A     N     P' ); end\n    if ~isempty(errFcn)\n        nBlanks = max( [0, length(errFcn)*9 - 9] );\n        fprintf( fid, '      errors%s',repmat(' ',nBlanks,1) ); \n    end\n    if printStopCrit, fprintf( fid, '    stopping criteria' ); end\n    fprintf( fid, '\\n' );\n\tfprintf(fid,'----+----------------------------------' );\n    if countOps, fprintf( fid, '+-------------------------------' ); end\n%     if ~isempty(errFcn), fprintf( fid, '+-------------------' ); end\n    if ~isempty(errFcn)\n        fprintf( fid, '+%s', repmat('-',1+length(errFcn)*9,1) );\n    end\n    \n    \n    if printStopCrit, fprintf( fid, '+%s', repmat('-',19,1) ); end\n    \n    \n    fprintf(fid,'\\n');\nend\n\n% Initialize some variables\njust_restarted = false;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/tfocs_iterate.m",
    "content": "%SOLVER_ITERATE    TFOCS helper script\n%\tPerforms the iterate processing common to all of the first-order solvers\n%\n%   Major inputs: x, x_old, xy , A_x, A_y, g_Ax, g_Ay \n%       (does not need g_x or g_y really)\n\n% Test for positive stopping criteria\nn_iter = n_iter + 1;\nnorm_x = sqrt( tfocs_normsq( x ) );\nnorm_dx = sqrt( tfocs_normsq( x - x_old ) );\n% We also handle legacy stopping criteria used in the paper:\nif stopCrit == 2 && beta >= 1\n    % xy_sq not already computed\n    xy      = x - y;\n    xy_sq   = tfocs_normsq( xy );\nend\nif isnan( f_y ),\n\tstatus = 'NaN found -- aborting';\nelseif (stopCrit == 1) && norm_dx  == 0\n    if n_iter > 1\n        status = 'Step size tolerance reached (||dx||=0)';\n    end\nelseif (stopCrit == 1) && norm_dx < tol * max( norm_x, 1 ),\n    status = 'Step size tolerance reached';\nelseif (stopCrit == 2) && L*sqrt(xy_sq) < tol,\n    status = 'Step size tolerance reached';\nelseif n_iter == maxIts,\n\tstatus = 'Iteration limit reached';\nelseif countOps && any( tfocs_count___ >= maxCounts ),\n\tstatus = 'Function/operator count limit reached';\nelseif backtrack_steps > 0 && xy_sq == 0,\n    status = sprintf('Unexpectedly small stepsize after %d backtrack steps',backtrack_steps);\nend\n\n% for stopCrit 3, we need the new and old dual points\nif stopCrit == 3 || stopCrit == 4\n    if ~saddle, error('stopCrit = {3,4} requires a saddle point problem'); end\n    if exist('cur_dual','var')\n        old_dual = cur_dual;\n    else\n        old_dual = [];\n    end\nend\n\n%\n% For stopping criteria or algorithm control, we assume that the user\n% needs the objective function value, but does not wish to do any more\n% computation than necessary. So we will use the function value for y\n% instead of x if that is cheaper to obtain. So here we determine what\n% the additional computational costs will be, and choose the path that\n% minimizes them, favoring x in the case of a tie.\n%\n\nv_is_x  = false;\nv_is_y  = false;\n% if isempty(status) && ( ~isempty(stopFcn) || restart < 0 || stopCrit == 3 || stopCrit ==4 ),\nif (isempty(status) || ~isempty(findstr(status,'limit')) ) ...\n        && ( ~isempty(stopFcn) || restart < 0 || stopCrit == 3 || stopCrit ==4 ),\n    need_dual   = saddle && (~isempty(stopFcn) || stopCrit == 3 || stopCrit == 4 );\n    comp_x = [ isinf(f_x), need_dual*isempty(g_Ax), isinf(C_x) ];\n    comp_y = [ isinf(f_y), need_dual*isempty(g_Ay), isinf(C_y) ];\n    if sum(comp_x) <= sum(comp_y) || stopping_criteria_always_use_x,\n        if comp_x(2), [f_x,g_Ax] = apply_smooth(A_x);\n        elseif comp_x(1), f_x = apply_smooth(A_x); end\n        if comp_x(3), C_x = apply_projector(x); end\n        cur_pri = x; \n        if saddle, cur_dual = g_Ax; end\n        f_v = maxmin*(f_x+C_x);\n        v_is_x    = true; % 12/18/2013\n    else\n        if comp_y(2), [f_y,g_Ay] = apply_smooth(A_y);\n        elseif comp_y(1), f_y = apply_smooth(A_y); end\n        if comp_y(3), C_y = apply_projector(y); end\n        cur_pri = y; \n        if saddle, cur_dual = g_Ay; end\n        f_v = maxmin*(f_y+C_y);\n        v_is_y    = true;\n        if data_collection_always_use_x\n            % save the data, otherwise it is overwritten\n            f_vy    = f_v;\n            if saddle, dual_y  = cur_dual; end\n        end\n    end\n    for err_j = 1 : numel(stopFcn),\n        if isa(stopFcn{err_j},'function_handle') % added Oct 27 '14; corrected Aug 22 '17\n            if saddle,\n                stop = stopFcn{err_j}(f_v,cur_pri, get_dual(cur_dual) );\n            else\n                stop = stopFcn{err_j}(f_v,cur_pri);\n            end\n            if stop\n                if v_is_x, x_or_y_string = 'x'; else x_or_y_string = 'y'; end\n                status = sprintf('Reached user''s supplied stopping criteria no. %d using %s variable',err_j,x_or_y_string);\n            end\n        end\n    end\nend\n\n% Now we can apply stopCrit 3 if it has been requested:\nif (stopCrit == 3 || stopCrit == 4 ) \n    if ~isempty( old_dual ) && ~isempty( cur_dual )\n        d_dual = sqrt(tfocs_normsq( old_dual - cur_dual ));\n        if isnumeric( cur_dual ),\n             norm_cur = tfocs_normsq( cur_dual );\n             norm_old = tfocs_normsq( old_dual );\n        else\n            norm_cur = 0;\n            norm_old = 0;\n            for j = 1:max( [1, numel(cur_dual)-1] )\n                norm_cur = norm_cur  + tfocs_normsq( cur_dual{j}  );\n                norm_old = norm_old  + tfocs_normsq( old_dual{j}  );\n            end\n        end\n        norm_cur = sqrt(norm_cur);\n        norm_old = sqrt(norm_old);\n    else\n        d_dual   = Inf;\n        norm_cur = 0; \n        norm_old = 0;\n    end\n    \n\t% Note: it is common for the duals to be stuck at zero for quite a few\n    %   iterations at the beginning.  In stopCrit = 4 mode, we will not\n    %   terminate if both the current and old dual are zero.\n    \n    if stopCrit == 4\n        % for \"4\", we look at relative change, not absolute change\n        if norm_cur > 10*eps && norm_old > 10*eps\n            d_dual = d_dual / norm_cur;\n        else\n            % The dual vectors are zero, so do not terminate.\n            % This is equivalent to defining 0/0 = Inf;\n            d_dual = Inf;\n        end\n    end\n    nLargeEnough = (n_iter > 2); % Dec '13\n    if restart > 10\n        nLargeEnough = (n_iter - restart_iter > 2);\n    end\n    if d_dual < tol  && nLargeEnough\n        % Problems when cur_dual is base on x one iteration\n        % and y another iteration\n        status = 'Step size tolerance reached';\n    end\nend\n\n\n\n%\n% Data collection. Since this is used only for algorithm analysis and not\n% for algorithm control, we are free to make additional computations here\n% without adding them to our total algorithm cost. We prefer to track the\n% x sequence in this case, since it is what we will ultimately choose as\n% the solution at the end of the algorithm.\n%\n\nwill_print = fid && printEvery && ...\n    ( ~isempty( status ) || ~mod( n_iter, printEvery ) || (printRestart && just_restarted) );\nif saveHist || will_print,\n    % Which point to collect data at? Dec '13, by default, collect data\n    %   at the same point used to find f_v unless data_collection_always_use_x\n    % There is also the chance that the f_v wasn't calculated at all\n    if ( data_collection_always_use_x && ~v_is_x ) || ( ~v_is_x && ~v_is_y )\n        f_x_save = f_x;\n        g_Ax_save = g_Ax;\n        if ~isempty(errFcn) && saddle,\n            if isempty(g_Ax),\n                [ f_x, g_Ax ] = smoothF( A_x );\n            end\n%             out.dual = get_dual( g_Ax );\n            cur_dual = g_Ax ;\n        end\n        if isinf(f_x),\n            f_x = smoothF( A_x );\n        end\n        if isinf( C_x ),\n            C_x = projectorF( x );\n        end\n        f_v         = maxmin * ( f_x + C_x );\n        cur_pri     = x;\n        v_is_x      = true;\n        % Now undo any calculations\n        f_x         = f_x_save;\n        g_Ax        = g_Ax_save;\n    end\n    % (otherwise, f_v was already calculated)\n    \n    if ~isempty(errFcn) && iscell(errFcn)\n        errs = zeros(1,numel(errFcn));\n        for err_j = 1 : numel(errFcn),\n            if saddle,\n%                 errs(err_j) = errFcn{err_j}(f_w,x,out.dual);\n                % April 14 '14\n                %if isempty( get_dual(cur_dual) )\n                % March 10 '15\n                if isempty(cur_dual) || isempty( get_dual(cur_dual) )\n                    errs(err_j) = errFcn{err_j}(f_v,cur_pri,0);\n                else\n                    errs(err_j) = errFcn{err_j}(f_v,cur_pri,get_dual(cur_dual));\n                end\n            else\n                errs(err_j) = errFcn{err_j}(f_v,cur_pri);\n            end\n        end\n    \n        % Oct 27 '14. If stopFcn is a number, then we stop\n        %   if errFcn(1) is less than or equal to this number\n        if ~isempty(stopFcn)\n            for err_j = 1 : numel(stopFcn),\n                if isnumeric(stopFcn{err_j})\n                    stop = errs(1) <= stopFcn{err_j};\n                    if stop\n                        status = sprintf(...\n                            'Reached user''s supplied stopping criteria of %.2e',stopFcn{err_j});\n                    end\n                end\n            end\n        end\n    \n    end\n    \nend\n\n\n% Register a warning if the step size suggests a Lipschitz violation\nif isempty(status) && ( beta < 1 && backtrack_simple && localL > Lexact ),\n    warning_lipschitz = true;\nend\t\n\n% Print status\nif will_print,\n    if warning_lipschitz,\n        warning_lipschitz = false;\n        bchar = 'L';\n    elseif backtrack_simple,\n        bchar = ' '; \n    else\n        bchar = '*'; \n    end\n\tfprintf( fid, '%-4d| %+12.5e  %8.2e  %8.2e%c', ...\n        n_iter, f_v, norm_dx / max( norm_x, 1 ), 1 / L, bchar );\n    if countOps,\n        fprintf( fid, '|' );\n        fprintf( fid, ' %5d', tfocs_count___ );\n    end\n    if ~isempty(errFcn),\n        if countOps,\n            fprintf( fid, ' ' );\n        end\n    \tfprintf( fid, '|' );\n        fprintf( fid, ' %8.2e', errs );\n    end\n    \n    \n    if printStopCrit\n        % Display the number used to determine stopping\n\n        switch stopCrit\n            case 1\n                if exist('norm_dx','var') && exist('norm_x','var')\n                    stopResid   =  norm_dx/max( norm_x,1);\n                else\n                    stopResid   = Inf;\n                end\n            case 2\n                stopResid   = L*sqrt(xy_sq);\n            case {3,4}\n                if exist('d_dual','var')\n                    stopResid   = d_dual;\n                end\n            case Inf\n                % do nothing\n                stopResid = 0;\n            otherwise\n                error('Bad stopCrit value');\n        end\n    \n        if ~isempty(errFcn) || countOps\n            fprintf( fid, ' ' );\n        end\n        fprintf( fid, '|' );\n        fprintf( fid, ' %8.2e', stopResid );\n    end\n    \n    if printRestart && just_restarted\n        fprintf( fid, ' | restarted');\n    end\n    \n\tfprintf( fid, '\\n');\nend\n\n% Save history, extending arrays if needed\nif saveHist,\n    if length(out.f) < n_iter && isempty(status),\n        csize = min(maxIts,length(out.f)+1000);\n        out.f(end+1:csize,1) = 0;\n        out.theta(end+1:csize,1) = 0;\n        out.stepsize(end+1:csize,1) = 0;\n        out.normGrad(end+1:csize,1) = 0;\n        if countOps,\n            out.counts(end+1:csize,:) = 0;\n        end\n        if ~isempty(errs),\n            out.err(end+1:csize,:) = 0;\n        end\n    end\n    out.f(n_iter) = f_v;\n    out.theta(n_iter) = theta;\n    out.stepsize(n_iter) = 1 / L;\n    out.normGrad(n_iter) = norm_dx;\n    if countOps,\n        out.counts(n_iter,:) = tfocs_count___;\n    end\n    if ~isempty(errFcn),\n        out.err(n_iter,:) = errs;\n    end\nend\n\n% Exit if positive stopping criteria met\n% if ~isempty( status ),\n% \tbreak;\n% end\n\n% for R2015b compatibility:\ndo_break    = false;\nif ~isempty( status )\n    do_break = true;\nelse\n\n% Restart acceleration if necessary\nbacktrack_steps = 0;\n% \"No regress\" feature: test was (maxmin*f_v > f_v_old)\n%   This worked for minimization, but not for maximization! Dec 15 2010.\n% Fixed it.\n% two changes: (1) test is now ( maxmin*f_v > maxmin*f_v_old)\n%              (2) to reset f_v_old, set to maxmin*Inf, not just +Inf\n% Dec 2013, adding gradient-based restarting (see O'Donoghue and Candes '12)\njust_restarted  = false;\ndo_auto_restart = false;\nif restart < 0\n    if strfind(lower(autoRestart),'gra')\n        do_auto_restart = tfocs_dot(g_Ay, A_x - A_x_old ) > 0;\n    elseif any(strfind(lower(autoRestart),'fun')) || any(strfind(lower(autoRestart),'obj'))\n        do_auto_restart = maxmin*f_v > maxmin*f_v_old;\n    else\n        error('bad value for opts.autoRestart. Should be ''gradient'' or ''function''');\n    end\nend\nif n_iter - restart_iter == abs(round(restart)) || do_auto_restart\n    restart_iter = n_iter;\n    backtrack_simple = true;\n\ttheta = Inf;\n    y = x; A_y = A_x; f_y = f_x; g_Ay = g_Ax; g_y = g_x; C_y = C_x;\n    z = x; A_z = A_x; f_z = f_x; g_Az = g_Ax; g_z = g_x; C_z = C_x;\n    f_v_old = maxmin*Inf; % important!\n%     continue;\n    just_restarted = true;\nelseif restart < 0,\n    f_v_old = f_v;\nend\n\nC_y     = Inf;\n\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/tfocs_prox.m",
    "content": "function op = tfocs_prox( f, prox_f, VECTOR_SCALAR )\n% OP = TFOCS_PROX( F, PROX_F )\n%   combines F and PROX_F into the appropriate TFOCS-compatible object.\n%\n%   F is any function (with known proximity operator),\n%   and PROX_F is its proximity operator, defined as:\n%\n%   PROX_F( Y, t ) = argmin_X  F(X) + 1/(2*t)*|| X - Y ||^2\n%\n%   To use this, please see the file PROX_L1 as an example\n%\n%   The basic layout of a file like PROX_L1 is as follows:\n%   ( for the function F(X) = q*||X||_1 )\n%\n%       function op = prox_l1(q)\n%       op = tfocs_prox( @f, @prox_f )\n%\n%         function v = f(x)\n%           ... this function calculates the function f ...\n%         end\n%         function v = prox_f(y,t)\n%           ... this function calculates the prox-function to f ...\n%         end\n%       end\n%\n%   Note: in the above template, the \"end\" statements are very important.\n%\n% OP = TFOCS_PROX( F, PROX_F, 'vector')\n%   will signal the routine that it is OK to allow \"vector\" stepsizes\n%   (this corresponds to solving\n%       PROX_F( Y, T ) = argmin_X F(X) + 1/2( X-Y )'*diag(1./T)*( X-Y )\n%    where T is a vector of the same size as X ).\n% ... = TFOCS_PROX( F, PROX_F, 'scalar' )\n%   will throw an error if a vector stepsize is attempted. This is the default.\n%\n%   Also, users may wish to test their smooth function\n%   with the script TEST_NONSMOOTH\n%\n%   See also prox_l1, test_nonsmooth\n\nif nargin < 3 || isempty(VECTOR_SCALAR)\n    VECTOR_SCALAR = 'scalar';\nend\n\nif strcmpi(VECTOR_SCALAR,'scalar')\n%     op = @fcn_impl; % comment this out and use octave-compatible version below:\n%     op = @(x,t)fcn_impl(f,prox_f,x,t); % this doesn't work: requires 2 inputs always\n    op = @(varargin)fcn_impl(f,prox_f,varargin{:});\nelseif strcmpi(VECTOR_SCALAR,'vector')\n%     op = @fcn_impl_vector; % comment this out and use octave-compatible version below:\n%     op = @(x,t)fcn_impl_vector(f,prox_f,x,t); % this doesn't work: requires 2 inputs always\n    op = @(varargin)fcn_impl_vector(f,prox_f,varargin{:});\nelse\n    error('bad option for VECTOR_SCALAR parameter');\nend\n\nfunction [ v, x ] = fcn_impl(f,prox_f,x, t )\n    if nargin < 3,\n        error( 'Not enough arguments.' );\n    end\n    if nargin == 4,\n        if numel(t) ~= 1, error('The stepsize must be a scalar'); end\n        x  = prox_f(x,t);\n    elseif nargout == 2,\n        error( 'This function is not differentiable.' );\n    end\n    v = f(x);\nend\n\nfunction [ v, x ] = fcn_impl_vector(f,prox_f,x, t )\n    if nargin < 3,\n        error( 'Not enough arguments.' );\n    end\n    if nargin == 4,\n        x  = prox_f(x,t);\n    elseif nargout == 2,\n        error( 'This function is not differentiable.' );\n    end\n    v = f(x);\nend\n\n% - Octave incompatible version: -\n% function [ v, x ] = fcn_impl(x, t )\n%     if nargin < 1,\n%         error( 'Not enough arguments.' );\n%     end\n%     if nargin == 2,\n%         if numel(t) ~= 1, error('The stepsize must be a scalar'); end\n%         x  = prox_f(x,t);\n%     elseif nargout == 2,\n%         error( 'This function is not differentiable.' );\n%     end\n%     v = f(x);\n% end\n% \n% function [ v, x ] = fcn_impl_vector(x, t )\n%     if nargin < 1,\n%         error( 'Not enough arguments.' );\n%     end\n%     if nargin == 2,\n%         x  = prox_f(x,t);\n%     elseif nargout == 2,\n%         error( 'This function is not differentiable.' );\n%     end\n%     v = f(x);\n% end\n\n\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information."
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/tfocs_round.m",
    "content": "function y = tfocs_round(x)\nif iscell( x ),\n    y = cellfun( @tfocs_round, x, 'UniformOutput', false );\nelse\n    y = round( x );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/tfocs_smooth.m",
    "content": "function op = tfocs_smooth( fcn )\n% OP = TFOCS_SMOOTH(FCN)\n%   is a wrapper designed to facilitate users writing their own\n%   smooth functions.\n%\n%   To use this, please see the file SMOOTH_HUBER as an example\n%\n%   The basic layout of a file like SMOOTH_HUBER is as follows:\n%\n%       function op = smooth_huber(mu)\n%       op = tfocs_smooth( @huber_impl )\n%\n%         function [f,g] = huber_impl(x)\n%           ... this function calculates the function, f,\n%               and the gradient, g, of x ...\n%         end\n%       end\n%\n%   Note: in the above template, the \"end\" statements are very important.\n%\n%\n%   Also, users may wish to test their smooth function\n%   with the script TEST_SMOOTH\n%\n%   See also smooth_huber, test_smooth, private/tfocs_smooth, smooth_handles\n\n\nop = @fcn_impl;\n\nfunction [ v, g ] = fcn_impl(x, t )\n  if nargin == 2,\n      error( 'Proximity minimization not supported by this function.' );\n  end\n  if nargout == 2\n      [v,g] = fcn(x);\n  else\n      v = fcn(x);\n  end\nend\n\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information."
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/private/tfocs_zeros.m",
    "content": "function z = tfocs_zeros( y )\nswitch class( y ),\n    case 'double',\n        % SRB: this was the old code.  This function was intended\n        % to be called as   tfocs_zeros( size(y) )\n        % But, for packSVD, I'd prefer to call it as tfocs_zeros(y)\n        %   so that we can look at the type of y and pass it off\n        %   accordingly (see 'packSVD' section below).\n        % This would break old code.  But, it appears that all\n        % calls of this use the { [n1,n2], [m1,m2] } form of sz\n        %   (as opposed to the [m1,n1] convention), so\n        % I don't think this will break anything.\n        \n        % Old code:\n        %     \tz = zeros( y );\n\n        % New code:\n        % Try to catch cases where we thing y = [m,n] is a size:\n%         if numel(y) == 2 && isint(y(1)) && isint(y(2))\n        % March 2011, fixing this to work with 3D arrays\n        % If you want to use 4D arrays, you must modify this in a similar\n        % fasion; we don't do that before hand since it makes it more likely\n        % that the wrong case is picked.\n        if (numel(y) == 2 || numel(y) == 3) && all(isint(y))\n            z = zeros( y );\n        else\n            z = zeros( size(y) );\n        end\n\n    case 'cell',\n        if isa( y{1}, 'function_handle' ),\n            z = y{1}( y{2:end} );\n        else\n            for k = 1 : numel(y),\n                y{k} = tfocs_zeros( y{k} );\n            end\n            z = tfocs_tuple( y );\n        end\n    case 'packSVD'\n        %z = packSVD>tfocs_zeros(y);\n        z = packSVD_zeros(y);\n    otherwise\n        error('TFOCS_ZEROS: cannot handle this type of object');\nend\n\n% do NOT use \"isinteger\" because that tests for the integer data type.\nfunction h = isint(y)\nh = abs( round(y) - y ) < 10*abs(y)*eps;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n \n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/project_WeightedNorm.m",
    "content": "%{\n\nIt is very quick and basically closed-form to project onto ||x||_1\n\ne.g. Proj_x0 = argmin_{ ||x||_1 <= 1 } 1/2|| x - x0 ||^2\n\nbut it is hard to project onto the set ||Wx||_1 <= 1, for general W\n(i.e. non-invertible)\n\nHere we show how to solve the weighted projection with an iterative method\n\n%}\n\nN  = 100;\nx0 = randn(N,1);\nW  = randn(2*N,N);\n%% project x0 onto l1 ball, no weighting (easy: one-step)\ntau     = .8*norm(x0,1);    % make sure x0 isn't already feasibly\nprojection = proj_l1(tau);\n[value,projX]  = projection(x0,1);\nfprintf('tau - ||x||_1 is %.2e\\n', tau - norm(projX,1) );\n\n\n%% project x0 onto l1 ball, with weighting (harder: iterate)\ntau     = .92*norm(W*x0,1);\n\nmu  = 1;                     % any value works\ne   = abs(eig(W'*W)/mu);\nL   = max(e);\nstrngCvxty  = min(e); \nopts = [];\nopts.alg    = 'AT'; \n% opts.alg    = 'N83';\n% opts.alg    = 'GRA';\nopts.tol    = 1e-12;\nopts.maxits = 500;\n\nopts.L0     = L;\nopts.Lexact = L; \nopts.mu     = strngCvxty;\n\n% opts.beta   = 1;  % prevents backtracking\nopts.printEvery = 5;\n\n% opts.restart = 5;\n\np = prox_linf(tau);     % project onto the  ||z||_1 <= tau  ball\n[projWX,outData,optsOut] = tfocs_SCD( [],W,p, mu, x0, [], opts );\n\nfprintf('tau - ||Wx||_1 is %.2e, and x0 and projected version differ by %.2e\\n', ...\n    tau - norm(W*projWX,1), norm(x0-projWX)/norm(x0) );\n\n% Check that we are within allowable bounds\nif abs(tau - norm(W*projWX,1)) < 1e-10\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information."
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_LASSO.m",
    "content": "%{\n    Tests the LASSO ( aka L1 regularized Least Squares) problem\n\n    min_x lambda*||x||_1 + .5||A(x)-b||_2^2\n\nsee also test_sBPDN.m\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n%%\n% Try to load the problem from disk\nfileName = fullfile(tfocs_where,...\n    'examples','smallscale','reference_solutions','lasso_problem1_noisy');\nrandn('state',34324);\nrand('state',34324);\nN = 1024;\nM = round(N/2);\nK = round(M/5);\nA = randn(M,N);\n% give A unit-normed columns\nA = bsxfun(@times,A,1./sqrt(sum(A.^2,1)));\nif exist([fileName,'.mat'],'file') \n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n    x = zeros(N,1);\n    T = randsample(N,K);\n    x(T) = randn(K,1);\n\n    b_original = A*x;\n    snr = 30;  % SNR in dB\n    sigma = 10^( (10*log10(  norm(b_original)^2/N)  - snr)/20 );\n    b   = myAwgn(b_original,snr);\n    x_original = x;\n    \n    lambda = 2*sigma*sqrt(2*log(N)); % for when A has unit-normed columns\n    x0 = zeros(N,1);\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize lambda*norm(xcvx,1) + sum_square( A*xcvx - b)/2\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx;\n    obj_ref = lambda*norm(x_ref,1) + sum_square( A*xcvx - b)/2;\n    \n    save(fileName,'x_ref','b','x_original','lambda',...\n        'sigma','b_original','obj_ref','x0','time_IPM','snr');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\nx_ref           = x_ref.*( abs(x_ref) > 1e-8 );\n[M,N]           = size(A);\nK               = nnz(x_original);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, K );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (lambda = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),lambda );\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from IPM)\nopts = struct('restart',-Inf,'tol',1e-13,'maxits',1000);\nopts.errFcn     = { @(f,primal) er(primal), ...\n                    @(f,primal) f - obj_ref   }; \ntic;\n[ x, out, optsOut ] = solver_L1RLS( A, b, lambda, x0, opts );\ntime_TFOCS = toc;\n\nfprintf('Solution has %d nonzeros.  Error vs. IPM solution is %.2e\\n',...\n    nnz(x), er(x) );\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-7\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_LMI.m",
    "content": "%{\n    Via smoothing, TFOCS can solve Linear Matrix Inequalities (LMI)\n    (these are equivalent to the dual of a SDP in standard form)\n\n    min_y  <b,y>\n    s.t.    A_0 + sum_i=1^M  A_i * y(i) >= 0\n\nwhere \">=\" refers to the positive semi-definite cone.\n\"b\" and \"y\" are vectors of length M,\nand A_i (i = 0, 1, ..., M)\nare symmetric or Hermian matrices of size N x N\n(where M <= N^2 )\n\nTFOCS assumes that all the A_i matrices (i=1,...,M; the A_0 matrix is\nhandled separately) are efficiently stored in one big \"A\" matrix\nso that we can compactly replace the sum_i A_i * y(i)\nwith mat( A'*y ), where mat() is a reshaping operator.\nThe code below shows how we do this.\n\n    See also test_SDP.m\n\n    If we identify A0 with -C, then this is the dual of the SDP in standard form.\n\n%}\n\n% Add TFOCS to your path.\n\nrandn('state',9243); rand('state',23432);\n\nN = 30;\nM = round(N^2/4);\n\nsymmetrize  = @(X) (X+X')/2;\nvec         = @(X) X(:);\nmat         = @(y) reshape(y,N,N);\n\nAcell = cell(M,1);\nfor m = 1:M\n    Acell{m} = symmetrize( randn(N) );\nend\n\n% Put \"Acell\" into a matrix:\nA = zeros(M,N^2);\nfor m = 1:M\n    A(m,:) = vec( Acell{m} );\nend\nnormA = normest(A,1e-2);\n\nb = randn(M,1);\ny = randn(M,1); \nA0 = mat(A'*y); % want A0 in range of A', otherwise infeasible or unbounded\n\nfileName = fullfile('reference_solutions','LMI');\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    cvx_begin\n        variable y(M)\n        minimize( b'*y )\n        subject to\n            A0 + mat(A'*y) >= 0\n    cvx_end\n    y_cvx = y;\n    save(fullfile(pwd,fileName),'y_cvx');\n    fprintf('Saved data to file %s\\n', fileName);\nend\n\n%% solve via TFOCS\nmu = 1e-3;\nopts = [];\nopts.errFcn = @(f,d,y) norm( y - y_cvx)/norm(y_cvx);\n\ny0 = []; z0 = [];\n[yy, out, opts ] = solver_sLMI( A0, A, b, mu, y0, z0, opts );\n\n% Check that we are within allowable bounds\nif out.err(end) < 1e-8\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n%% Version with complex variables:\nrandn('state',9243); rand('state',23432);\nN = 30;\nM = round(N^2/4);\nAcell = cell(M,1);\nfor m = 1:M\n    Acell{m} = symmetrize( randn(N) + 1i*randn(N) );\nend\nA = zeros(M,N^2);\nfor m = 1:M\n    A(m,:) = vec( Acell{m} );\nend\nnormA = normest(A,1e-2);\n\nb = randn(M,1);     % this should always be real\ny = randn(M,1);     % this should always be real\nA0 = mat(A'*y);     % this may be complex\n\nfileName = 'reference_solutions/LMI_complex';\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    cvx_begin\n        variable y(M)\n        minimize( b'*y )\n        subject to\n            A0 + mat(A'*y) == semidefinite(N)\n    cvx_end\n    y_cvx = y;\n    save(fullfile(pwd,fileName),'y_cvx');\n    fprintf('Saved data to file %s\\n', fileName);\nend\n\n% and solve via TFOCS:\nmu = 1e-3;\nopts = [];\nopts.errFcn = @(f,d,y) norm( y - y_cvx)/norm(y_cvx);\ny0 = []; z0 = [];\n[yy, out, opts ] = solver_sLMI( A0, A, b, mu, y0, z0, opts );\n\n% Check that we are within allowable bounds\nif out.err(end) < 1e-8\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_LinearProgram.m",
    "content": "%{\n    Via smoothing, TFOCS can solve a Linear Program (LP) in standard form:\n\n(P)     min c'x s.t. x >= 0, Ax=b\n\n\n    This extends to SDP as well (see test_SDP.m )\n%}\n\n% Add TFOCS to your path.\n\nrandn('state',9243); rand('state',234324');\n\nN = 5000;\nM = round(N/2);\nx = randn(N,1)+10;\nA = sprand(M,N,.01);\nc = randn(N,1);\nb = A*x;\nif issparse(A)\n    normA   = normest(A);\nelse\n    normA = norm(A);\nend\n\nfileName = fullfile('reference_solutions','LP');\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    cvx_begin\n        variable x(N)\n        minimize( c'*x )\n        subject to\n            x >= 0\n            A*x == b\n    cvx_end\n    x_cvx = x;\n    save(fullfile(pwd,fileName),'x_cvx');\n    fprintf('Saved data to file %s\\n', fileName);\nend\n\n%% solve in TFOCS\n\nopts = [];\nopts.errFcn        = {@(f,d,x) norm( x - x_cvx )/norm(x_cvx )};  % optional\n% opts.errFcn{end+1} =  @(f,d,x) norm( A*x - b )/norm(b );  % optional\nopts.restart = 2000;\nopts.continuation = true;\nx0   = [];\nz0   = [];\nmu = 1e-2;\nmu = 1e-3;\n\nopts.stopCrit   = 4;\nopts.tol        = 1e-4;\ncontOpts        = [];       % options for \"continuation\" settings\n%   (to see possible options, type \"continuation()\" )\n%    By changing the options, you can get much better results sometimes,\n%    but here we use default choices for simplicity.\n% contOpts.accel  = false;\n% contOpts.betaTol    = 10;\n% contOpts.finalTol = 1e-10;\ncontOpts.maxIts     = 10;\ncontOpts.initialTol = 1e-3;\n\nopts.normA      = normA; % this will help with scaling\n[x,out,optsOut] = solver_sLP(c,A,b, mu, x0, z0, opts, contOpts);\n% Check that we are within allowable bounds\nif out.err(end) < 7e-2\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% plot\nfigure(2);\nsemilogy( out.err(:,1) );\n\n\n%% == TFOCS can also handle LPs with box constraints ==========\nrandn('state',9243); rand('state',234324');\n\nN = 3000;\nM = round(N/2);\nx = randn(N,1)+10;\nA = sprand(M,N,.01);\nc = randn(N,1);\nb = A*x;\n% There is no longer an automatic x >= 0 bound\n%   (if you want to impose this, incorporate it into the lower bound)\nl = -2*ones(N,1); % lower bound\nu = 13*ones(N,1); % upper bound\nif issparse(A)\n    normA   = normest(A);\nelse\n    normA = norm(A);\nend\n\nfileName = fullfile('reference_solutions','LP_box');\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    cvx_begin\n        variable x(N)\n        cvx_precision best\n        minimize( c'*x )\n        subject to\n            x >= l\n            x <= u\n            A*x == b\n    cvx_end\n    x_cvx = x;\n    save(fullfile(pwd,fileName),'x_cvx');\n    fprintf('Saved data to file %s\\n', fileName);\nend\n\n%% solve box-constrained version in TFOCS\n\nopts = [];\nopts.errFcn        = {@(f,d,x) norm( x - x_cvx )/norm(x_cvx )};  % optional\nopts.restart = 2000;\nopts.continuation = true;\nx0   = [];\nz0   = [];\nmu = 1e-2;\n\nopts.stopCrit   = 4;\nopts.tol        = 1e-5;\ncontOpts        = [];       % options for \"continuation\" settings\ncontOpts.maxIts     = 5;\ncontOpts.muDecrement = .8;\n% contOpts.accel  = false;\n\nopts.normA      = normA; % this will help with scaling\n[x,out,optsOut] = solver_sLP_box(c,A,b,l,u,mu, x0, z0, opts, contOpts);\n\n% Check that we are within allowable bounds\nif out.err(end) < 2e-2\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n%% plot box-constrained version\nfigure(2);\nsemilogy( out.err(:,1) );\n\n%% close figures\nclose all\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_SDP.m",
    "content": "%{\n    Via smoothing, TFOCS can solve a Semi-definite Program (SDP) in standard form:\n\n(P)     min <C,X> s.t. X >= 0, A(X)=b\n\n\n    This extends to LP as well (see test_LinearProgram.m )\n    We can also solve the dual of SDP, which is LMI. See test_LMI.m\n%}\n\n% Add TFOCS to your path.\n\nrandn('state',9243); rand('state',234324');\n\nN = 80;\nM = round(N^2/2);\nX = randn(N); X = X*X';\nA = sprand(M,N^2,.005); \nC = randn(N); C = C + C';\nvec = @(X) X(:);\nmat = @(y) reshape(y,N,N);\n% Important: we want each row of A to be the vectorized form of the\n%   symmetric matrix A_i.  Otherwise, the dual problem makes no sense.\n%  Here, we'll ensure this symmetry.\n% (BTW, due to how Matlab stores sparse arrays, we only want to make\n%  column operations. So we'll operate on A' and then transpose back)\nAt = A';\nfor row = 1:M\n    At(:,row) = vec( mat(At(:,row)) + mat(At(:,row))' )/2;\nend\nA = At'; clear At;\n\nb = A*vec(X);\n\nnormA = normest(A);\n\nfileName = fullfile('reference_solutions','SDP');\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    cvx_begin sdp\n        variable X(N,N) symmetric\n        minimize trace( C*X )\n        subject to\n            X >= 0\n            A*vec(X) == b\n    cvx_end\n    X_cvx = X;\n    save(fullfile(pwd,fileName),'X_cvx');\n    fprintf('Saved data to file %s\\n', fileName);\nend\n\n%% solve in TFOCS\n\nopts = [];\nopts.errFcn        = {@(f,d,X) norm( X - X_cvx,'fro')/norm(X_cvx,'fro' )};  % optional\n% opts.errFcn{end+1} =  @(f,d,X) norm( A*vec(X) - b )/norm(b);  % optional\nopts.restart = 2000;\nopts.continuation = true;\nx0   = [];\nz0   = [];\nmu = 1;\n\nopts.stopCrit   = 4;\nopts.tol        = 1e-4;\ncontOpts        = [];       % options for \"continuation\" settings\n%   (to see possible options, type \"continuation()\" )\n%    By changing the options, you can get much better results sometimes,\n%    but here we use default choices for simplicity.\n% contOpts.accel  = false;\n% contOpts.betaTol    = 10;\n% contOpts.finalTol = 1e-10;\n\nopts.normA      = normA; % this will help with scaling\n[x,out,optsOut] = solver_sSDP(C,A,b, mu, x0, z0, opts, contOpts);\n% Check that we are within allowable bounds\nif out.err(end) < 5e-2\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% Here's another simple example, using complex valued variables\nrandn('state',9243); rand('state',234324');\n\nN = 20;\nM = round(N^2/1.3);\nX = randn(N) + 1i*randn(N); X = X*X';       % ensure Hermitian and pos. semi-def.\nA = sprandn(M,N^2,.01) + 1i*sprandn(M,N^2,.01);\nC = randn(N)+1i*randn(N); C = C + C';       % ensure Hermitian\nvec = @(X) X(:);\nmat = @(y) reshape(y,N,N);\n% Same as before...\nAt = A';\nfor row = 1:M\n    At(:,row) = vec( mat(At(:,row)) + mat(At(:,row))' )/2;\nend\nA = At'; clear At;\n\n% Note: b should be real, but due to round errors it has as small imaginary part\nb = real(A*vec(X));\n\nnormA = linop_normest(A);\nfileName = 'reference_solutions/SDP_complex';\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    cvx_begin sdp\n        variable X(N,N) hermitian % note the change from symmetric to hermitian\n        minimize real(trace( C*X )) % this should be real, but there are rounding errors\n        subject to\n            X >= 0\n            real(A*vec(X)) == b\n    cvx_end\n    X_cvx = X;\n    save(fullfile(pwd,fileName),'X_cvx');\n    fprintf('Saved data to file %s\\n', fileName);\nend\n\n% and solve with TFOCS\nopts = [];\nopts.errFcn        = {@(f,d,X) norm( X - X_cvx,'fro')/norm(X_cvx,'fro' )};\nopts.continuation = true;\nx0   = [];\nz0   = [];\nmu = 1e-3;\n% opts.cmode      = 'C2R'; % explicitly tell it that we are complex. not necessary though\nopts.normA      = normA; % this will help with scaling\nopts.stopCrit   = 4;\nopts.tol        = 1e-4;\n[x,out,optsOut] = solver_sSDP(C,A,b, mu, x0, z0, opts, contOpts);\n\n% Check that we are within allowable bounds\nif out.err(end) < 5e-2\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_SLOPE.m",
    "content": "%{\n    Tests the Sorted/Ordered LASSO ( aka Ordered L1 regularized Least Squares) problem\n    Also known as SLOPE for Sorted L-One Penalized Estimation\n\n    min_x sum(lambda*sort(abs(x),'descend')) + .5||A(x)-b||_2^2\n\n    lambda must be a vector in decreasing order, and all strictly positive\n\n    Like the test_LASSO.m file, we will use the notation (A,b,x)\n    In the paper mentioned below, this corresponds to the notation (X,y,beta)\n\n Reference:\n   \"Statistical Estimation and Testing via the Ordered l1 Norm\"\n   by M. Bogdan, E. van den Berg, W. Su, and E. J. Candès, 2013\n   http://www-stat.stanford.edu/~candes/OrderedL1/\n\nsee also test_sBPDN.m and test_LASSO.m\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n%%\n% Try to load the problem from disk\nfileName = fullfile(tfocs_where,...\n    'examples','smallscale','reference_solutions','ordered_lasso_problem1_noisy');\nrandn('state',34324);\nrand('state',34324);\nN = 1024;\nM = round(N/2);\nK = round(M/5);\nA = randn(M,N);\n% give A unit-normed columns\nA = bsxfun(@times,A,1./sqrt(sum(A.^2,1)));\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n    x = zeros(N,1);\n    T = randsample(N,K);\n    x(T) = randn(K,1);\n\n    b_original = A*x;\n    snr = 30;  % SNR in dB\n    sigma = 10^( (10*log10(  norm(b_original)^2/N)  - snr)/20 );\n    b   = myAwgn(b_original,snr);\n    x_original = x;\n    \n    lambda = 2*sigma*sqrt(2*log(N)); % for when A has unit-normed columns\n    % Now, we diverge from test_LASSO.m, and make lambda a vector\n%     lambda = fliplr( linspace(.5*lambda,2*lambda,N) )';\n    lambda = .5*lambda + 1.5*lambda*rand(N,1); lambda = sort(lambda,'descend')\n    \n    x0 = zeros(N,1);\n\n    % We cannot get the solution via CVX easily, so solve using our method\n    opts = struct('restart',-Inf,'tol',1e-13,'maxits',1000, 'printEvery',10);\n    [ x, out, optsOut ] = solver_SLOPE( A, b, lambda, x0, opts );\n    x_ref       = x;\n    obj_ref     = norm(A*x-b)^2/2 + sum(lambda(:).*sort(abs(x),'descend'));\n    \n    save(fileName,'x_ref','b','x_original','lambda',...\n        'sigma','b_original','obj_ref','x0','time_IPM','snr');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n[M,N]           = size(A);\nK               = nnz(x_original);\nnorm_x_ref      = norm(x_ref) + 1*( norm(x_ref)==0 );\nnorm_x_orig     = norm(x_original) + 1*( norm(x_original)==0 );\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, K );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (mean(lambda) = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mean(lambda) );\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from IPM)\nopts = struct('restart',-Inf,'autoRestart','gradient', ...\n    'tol',1e-13,'maxits',1000, 'printEvery',10);\nopts.errFcn     = { @(f,primal) er(primal), ...\n                    @(f,primal) f - obj_ref   }; \ntic;\n[ x, out, optsOut ] = solver_SLOPE( A, b, lambda, x0, opts );\ntime_TFOCS = toc;\n\nfprintf('Solution has %d nonzeros.  Error vs. reference solution is %.2e\\n',...\n    nnz(x), er(x) );\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-7\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_TraceLS.m",
    "content": "%{\nTest the trace-constrained least-squares problem with positive\nsemi-definite matrix variables\n\n     minimize (1/2)*norm( A * X - b )^2 + lambda * trace( X )\n     with the constraint that X is positive semi-definite ( X >= 0 )\n%}\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','traceLS_problem1_noisy');\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    % Generate a new problem\n\n    randn('state',sum('Trace'));\n    rand('state',sum('Trace2'));\n    \n    N = 30; R = 2;\n    \n    df = R*N;\n    oversample = 5;\n    Left  = randn(M,R);\n    Right = Left;\n    k = round(oversample*df); \n    k = min( k, round(.8*N*N) );\n    omega = randperm(N*N);\n    omega = sort(omega(1:k)).';\n\n    X_original = Left*Right';       % the \"original\" signal -- may not be optimal value\n    b_original = X_original(omega); \n    EPS = .001;        % noise level\n    noise = EPS * randn(k,1);\n    b = b_original + noise;\n    lambda       = 1e-2;\n    objective    = @(X) sum_square( X(omega) - b )/2 + lambda*trace(X);\n    obj_original = objective(X_original);\n\n    % get reference via CVX\n    cvx_begin\n        cvx_precision best\n        cvx_quiet true\n        variable Xcvx(N,N)\n        minimize objective(Xcvx)\n        subject to\n            Xcvx == semidefinite(N)\n    cvx_end\n    X_reference = Xcvx;         % the nuclear norm minimizer\n    obj_reference = objective(X_reference);\n    fprintf('Difference between convex solution and original signal: %.2e\\n', ...\n        norm( Xcvx - X_original, 'fro' ) );\n    save(fileName,'X_original','X_reference','omega','b','obj_original',...\n        'Left','EPS','b_original','R','obj_reference','lambda');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n[M,N]            = size(X_reference);\nnorm_X_reference = norm(X_reference,'fro');\ner_reference     = @(x) norm(x-X_reference,'fro')/norm_X_reference;\nobjective        = @(X) norm( X(omega) - b )^2/2 + lambda*trace(X);\n\n[omegaI,omegaJ] = ind2sub([M,N],omega);\nmat = @(x) reshape(x,M,N);\nvec = @(x) x(:);\n    \nk  = length(omega);\np  = k/(M*N);\ndf = R*(M+N-R);\nfprintf('%d x %d rank %d matrix, observe %d = %.1f x df = %.1f%% entries\\n',...\n    M,N,R,k,k/df,p*100);\nfprintf(' Trace norm solution and original matrix differ by %.2e\\n',...\n    norm(X_reference-X_original,'fro')/norm_X_reference );\n%% Solve. No smoothing is necessary!\nopts = struct('tol',1e-12);\nopts.errFcn = @(f,x) er_reference(x);\nx0          = [];\n% opts.debug  = true;\n\n% we need to tell it how to subsample. One method:\nA = linop_subsample( {[N,N],[k,1]}, omega );\n\n% another method: make a matrix with the correct\n%   sparsity pattern and let solver_TraceLS do it for us\n% A = sparse( omegaI,omegaJ,ones(k,1),N,N);\n\n[x,out] = solver_TraceLS( A, b, lambda, x0, opts );\nepsilon = norm( x(omega) - b );\nh=figure();\nsemilogy(out.err);\n\n% Check that we are within allowable bounds\nif out.err(end) < 1e-5\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% We can solve this via a smoothed nuclear norm formulation\n%  But it will be slower!\n%  Also, it will not enforce the positive semi-definite constraint,\n%  so it is not exactly the same.\n\ntestOptions = {};\nopts = [];\nopts.errFcn = @(f,dual,x) er_reference(x);\nopts.continuation       = true;\nopts.stopCrit   = 4;\nopts.tol        = 1e-6;\n\nmu      = .01;\nX0      = 0; \n\n% [ x, out, opts ] = solver_sNuclearBP( {M,N,omega}, b, mu, X0, [], opts ); \n[ x, out, opts ] = solver_sNuclearBPDN( {M,N,omega}, b, epsilon, mu, X0, [], opts ); \n\n%%\nclose(h)\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_all.m",
    "content": "%{\nRuns all tests in this directory.\n\nRecommended if you want to be sure that TFOCS is working 100% perfectly\non your system.\n\nThe scripts will produce an error message if anything goes wrong.\nSo if you don't seen any error message in red text, then everything\nis working.\n\n%}\nwarning('off','MATLAB:nargchk:deprecated') % narginchk not available prior to R2011b\n\nw   = what;\nfileList    = w.m;\n% and exclude the current file, otherwise we go into an infinite loop:\nfileList    = fileList(  ~strcmpi( fileList, 'test_all.m' ) );\ntm_all = tic;\nfor k = 1:length(fileList)\n    \n    file    = fileList{k}; % this has the .m extension, which we need to remove\n    eval( file(1:end-2) );\n    \nend\nfprintf('\\n\\n\\n-- Success!! --\\n');\n\ntoc( tm_all )\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_blockNorm.m",
    "content": "%{\n    Tests two common block norms\n\n    min_X ||X||_{1,p}\ns.t.\n    || A(X) - b || <= eps\n\nwhere ||X||_{1,p} is sum_{i=1:m} norm(X(i,:),p)\nand X is a m x n matrix.  \"p\" is either 2 or Inf.\nIf n = 1, then for both p = 2 and p = Inf, this reduces\nto the l1 norm.\n\nWe may think of the columns of X as a new signal.  The block\nnorm may be useful when we believe that these columns\nare quite similar, e.g. when their supports overlap significantly.\n\nsee also test_sBPDN.m\n\n%}\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n\n% Before running this, please add the TFOCS base directory to your path\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','blocknorm_smoothed_noisy');\nrandn('state',34324);\nrand('state',34324);\n% N = 1024;\nN = 128;\nM = round(N/2);\nK = round(M/5);\nA = randn(M,N);\nd = 10;  % number of columns of the signal matrix\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n    % Our signal model is the following:\n    %   for each column, half of the support (i.e. K/2 entries)\n    %   is taken from the first 1:K elements, so these will likely\n    %   have a strong overlap.\n    %   The second half of the support is taken from the remaining\n    %   elements, so will have less chance of overlap.\n    % (May not be 1/2, but that's the rough idea)\n    x = zeros(N,d);\n    K2 = round(.6*K);\n    for i = 1:d\n        T1 = randsample(K,K2);\n        T2 = randsample(N-K,K-K2) + K;\n        x(T1,i) = randn(K2,1);\n        x(T2,i) = randn(K-K2,1);\n    end\n\n    b_original = A*x;\n    snr = 10;  % SNR in dB\n    b   = myAwgn(b_original,snr);\n    EPS = norm(b-b_original,'fro');\n    x_original = x;\n    err = @(X) norm(X-x_original,'fro')/norm(x_original,'fro');\n    \n    mu = .01*norm(x,Inf);\n    x0 = zeros(N,d);\n\n    % get reference via CVX\n    \n    % How would we do if we did the estimation separately?\n    Xcvx_separate = zeros(N,d);\n    for i = 1:d\n      cvx_begin\n        cvx_precision best\n        cvx_quiet true\n        variable xcvx(N,1)\n        minimize norm(xcvx,1) + mu/2*sum_square(xcvx-x0(:,i) )\n        subject to\n            norm(A*xcvx - b(:,i) ) <= EPS/sqrt(d)\n      cvx_end\n      Xcvx_separate(:,i) = xcvx;\n    end\n    fprintf('Estimating each column separately, the error is %.2e\\n',...\n        err(Xcvx_separate) );\n    \n    \n    % Now, use p = 2\n    p = 2;\n    dim = 2;\n    cvx_begin\n        cvx_precision best\n        cvx_quiet true\n        variable xcvx(N,d)\n        minimize sum(norms(xcvx,p,dim)) + mu/2*pow_pos( norm(xcvx-x0,'fro'), 2)\n        subject to\n            norm(A*xcvx - b,'fro' ) <= EPS\n    cvx_end\n    Xcvx_p2 = xcvx;\n    fprintf('Estimating using the block 1-2 norm, the error is %.2e\\n',...\n        err(Xcvx_p2) );\n   \n    % Now, use p = Inf\n    p = Inf;\n    dim = 2;\n    cvx_begin\n        cvx_precision best\n        cvx_quiet true\n        variable xcvx(N,d)\n        minimize sum(norms(xcvx,p,dim)) + mu/2*pow_pos( norm(xcvx-x0,'fro'), 2)\n        subject to\n            norm(A*xcvx - b,'fro' ) <= EPS\n    cvx_end\n    Xcvx_pInf = xcvx;\n    fprintf('Estimating using the block 1-Inf norm, the error is %.2e\\n',...\n        err(Xcvx_pInf) );\n    \n    \n    save(fileName,'Xcvx_separate','Xcvx_p2','Xcvx_pInf','b','x_original','mu',...\n        'EPS','b_original','x0','snr');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\nerr = @(X) norm(X-x_original,'fro')/norm(x_original,'fro');\nfprintf('Block norm estimation: the error between cvx solution and orignal signal is...\\n');\nfprintf('  Estimating each column separately, the error is %.2e\\n',...\n    err(Xcvx_separate) );\nfprintf('  Estimating using the block 1-2 norm, the error is %.2e\\n',...\n    err(Xcvx_p2) );\nfprintf('  Estimating using the block 1-Inf norm, the error is %.2e\\n',...\n    err(Xcvx_pInf) );\n\n%% Call the TFOCS solver for each column separately\ndisp('-- Testing TFOCS against the IPM (CVX) solution, each column separately --');\nX_separate = zeros(N,d);\nfor i = 1:d\n    er              = @(x) norm(x-Xcvx_separate(:,i))/norm(Xcvx_separate(:,i));\n    opts = [];\n    opts.restart    = 500;\n    opts.errFcn     = @(f,dual,primal) er(primal);\n    opts.maxIts     = 1000;\n    opts.tol        = 1e-8;\n    opts.printEvery = 500;\n    opts.fid        = 0;\n    opts.restart    = 100;\n    z0  = [];   % we don't have a good guess for the dual\n    \n    [ x, out, optsOut ] = solver_sBPDN( A, b(:,i), EPS/sqrt(d), mu, x0(:,i), z0, opts );\n    \n    fprintf('Error vs. IPM solution is %.2e\\n',er(x) );\n    X_separate(:,i) = x;\n    \n    % Check that we are within allowable bounds\n    if er(x) > 1e-6\n        error('Failed the test');\n    end\nend\nfprintf('Overall error vs. IPM solution is %.2e\\n',...\n    norm(X_separate-Xcvx_separate,'fro')/norm(Xcvx_separate,'fro') );\n\n%% Call the TFOCS solver for p = 2\ndisp('-- Testing TFOCS against the IPM (CVX) solution, block norm, p = 2 --');\ner              = @(x) norm(x-Xcvx_p2,'fro')/norm(Xcvx_p2,'fro');\nopts = [];\nopts.restart    = 200;\nopts.errFcn     = @(f,dual,primal) er(primal);\nopts.maxIts     = 1000;\nopts.tol        = 1e-8;\nopts.printEvery = 50;\nopts.fid        = 1;\nz0  = [];   % we don't have a good guess for the dual\n\nAA = A;  % doesn't work \"out-of-the-box\", because it thnkgs\n         % the domain of A is N x 1 matrices (it's really N x d).\nAA = linop_matrix(A, 'r2r',d );\n[x,out,opts] = tfocs_SCD( prox_l1l2, { AA, -b }, prox_l2( EPS ), mu, x0, z0, opts );\n\nfprintf('Error vs. IPM solution is %.2e\\n',er(x) );\n\n% Check that we are within allowable bounds\nif er(x) < 5e-6\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% Call the TFOCS solver for p = Inf\ndisp('-- Testing TFOCS against the IPM (CVX) solution, block norm, p = Inf --');\ner              = @(x) norm(x-Xcvx_pInf,'fro')/norm(Xcvx_pInf,'fro');\nopts = [];\nopts.restart    = 200;\nopts.errFcn     = @(f,dual,primal) er(primal);\nopts.maxIts     = 1000;\nopts.tol        = 1e-8;\nopts.printEvery = 50;\nopts.fid        = 1;\nz0  = [];   % we don't have a good guess for the dual\n\nAA = A;  % doesn't work \"out-of-the-box\", because it thnkgs\n         % the domain of A is N x 1 matrices (it's really N x d).\nAA = linop_matrix(A, 'r2r',d );\n[x,out,opts] = tfocs_SCD( prox_l1linf(1), { AA, -b }, prox_l2( EPS ), mu, x0, z0, opts );\n\nfprintf('Error vs. IPM solution is %.2e\\n',er(x) );\nif er(x) < 3e-6\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_complicatedUsage.m",
    "content": "%{\nThis file shows an example of using the full power of TFOCS. If you\nare not familiar with basic usage of TFOCS, please see other demos\nfirst.\n\nWe make an example that uses:\n    -several variables (2), and the variables are matrices, not just vectors\n    -several constraints (4)\n    -affine operators (linear plus offset), and two of the operators\n        are matrix --> matrix operators\n    -debug mode\n\n\nFor small complicated examples like this, TFOCS is not necessarily\nfaster than software like CVX, since it takes more iterations than an\ninterior point method and there is some overhead in the TFOCS software\nsince the software is meant for flexibility rather than absolute speed.\n\nHowever, if you take any complicated problem and scale the size by a factor\nof 100, then CVX won't be able to handle it at all. TFOCS will do\njust fine (and it might even be less than 100x as slow, since now the overhead\nis not significant).\n\n\nThe problem we will solve:\n\nmin_{X1, X2} smooth1(X1)+smooth2(X2) +  sum_{i=1}^4  g_i( A1_i*X1 + A2_i*X2 + B_i )\n\nmeaning that we have 2 variables (X1 and X2), both of which are matrices,\nand each variable has its own smooth function.\nFor non-smooth and/or constraint terms (indexed by \"i\"), we have 4 functions\n( i = 1,2,3,4) g_i, and each has it's own affine operator in X1 and X2.\nSo each of the 4 affine operators has three parts: the portion linear in X1,\nthe portion linear in X2, and the constant offset \"B_i\".\n\nTo be explicit, the smooth functions are linear and quadratic, resp.:\n\nsmooth1(X1) = dot( s1, X1 ) + 3.4                  (\"s1\" is a matrix the same size as X1)\nsmooth2(X2) = dot( X2, X2 ) + dot( s2, X2 ) + 4.5  (\"s2\" is a matrix the same size as X2)\n\nand the non-smooth/constraint terms are:\n\ng_1(z)  = indicator set of the positive orthant of R^10\ng_2(z)  = ||z||_2 (usual Euclidean norm) in R^15\ng_3(z)  = ||z||_1 (l1 norm) in R^{10 x 20 }. This views a 10 x 20 matrix as a 200 x 1 vector.\ng_4(z)  = indicator set of positive orthant of R^{20 x 22 }, i.e. each element must be >= 0 coordinate-wise\n\nThe affine operators are picked arbitrary, but some of them (#3 and #4) have a range that\nis a set of matrices, rather than a set of vectors, in order to make \nthis more interesting.\n\n%}\n\nfileName = fullfile('reference_solutions','complicatedProblem1');\nrandn('state',29324);\nrand('state',9332);\n% rng(3481); % this only works on new versions of Matlab\n\n% -- Variables --\n% Two sets of variables, X1 (a matrix of size n1 x n2 ) and X2 (matrix of N1 x N2 )\nn1 = 10; n2 = 20;\nN1 = 12; N2 = 18;\nX1 = zeros( n1, n2 );\nX2 = zeros( N1, N2 );\n\n% -- the smooth terms -- \n%   Note: the inner product used is the matrix inner product\n%       that induces the Frobenius norm.\ns1      = randn(n1,n2);\nsmooth1 = smooth_linear( s1, 3.4 );\ns2      = randn(N1,N2);\nsmooth2 = smooth_quad( 1, s2, 4.5 );\n% and the same thing, but in a format that CVX likes:\nsmoothF = @(X1,X2) vec(X1)'*vec(s1) + 3.4 + vec(X2)'*vec(s2) + 4.5 + ...\n    sum_square(vec(X2))/2;\n\n% -- some proximal terms --\n\nnProx   = 4;\nprox1   = proj_Rplus;\nprox2   = proj_l2;          % primal is norm( , 2)\nprox3   = proj_linf(1);     % this can take matrix varaibles...\nprox4   = proj_Rplus;       % this can take matrix variables...\n% Sizes of proxes (i.e. sizes of dual variables, i.e. size of range of linear terms)\nd1      = [ 10, 1  ];\nd2      = [ 15, 1  ];\nd3      = [ n1, n2 ];\nd4      = [ 20, 22 ];\n\n\n% -- and linear terms --\n\n% for prox1:\nconst1  = randn(d1);\ntemp1   = randn( prod(d1), n1*n2);\nA1_X1   = linop_compose( linop_matrix(temp1), linop_vec([n1,n2]) );\ntemp2   = randn( prod(d1), N1*N2);\nA1_X2   = linop_compose( linop_matrix(temp2), linop_vec([N1,N2]) );\n\nA1      = @(X1,X2) temp1*vec(X1) + temp2*vec(X2) + const1;\n\n% for prox2: (matrix variable)\nconst2  = randn(d2);\ntemp1   = randn( prod(d2), n1*n2);\nA2_X1   = linop_compose( linop_matrix(temp1), linop_vec([n1,n2]) );\ntemp2   = randn( prod(d2), N1*N2);\nA2_X2   = linop_compose( linop_matrix(temp2), linop_vec([N1,N2]) );\n\nA2      = @(X1,X2) temp1*vec(X1) + temp2*vec(X2) + const2;\n\n% for prox3:\nconst3  = 0;\nA3_X1   = 63.4;     % this represents abstract scaling, i.e. any size input\nA3_X2   = 0;        % this reprsents the zero linear operator\n\nA3      = @(X1,X2) A3_X1*X1;\n\n% for prox4: (matrix variable)\nconst4  = randn(d4);\ntemp1   = randn( prod(d4), n1*n2);\nA4_X1   = linop_compose( linop_matrix(temp1), linop_vec([n1,n2]) );\nrs      = linop_adjoint( linop_vec(d4) );\nA4_X1   = linop_compose( rs, A4_X1 );\nmat1    = @(x) reshape( x, d4(1), d4(2) );\n\ntemp2   = randn( prod(d4), N1*N2);\nA4_X2   = linop_compose( linop_matrix(temp2), linop_vec([N1,N2]) );\nrs      = linop_adjoint( linop_vec(d4) );\nA4_X2   = linop_compose( rs, A4_X2 );\n\nA4      = @(X1,X2) mat1( temp1*vec(X1) + temp2*vec(X2) ) + const4;\n\n% -- set the smoothing parameter --\nmu = 1;\n\nif exist([fileName,'.mat'],'file')\n    load(fileName); % contains X_CVX\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    % Get reference solution in CVX\n    % First, get a solution to the smoothed version:\n    cvx_begin\n        variables X1(n1,n2) X2(N1,N2)\n        % it's important that we use norm(vec(...),1) and not just norm(...,1),\n        %   otherwise CVX interprets this with the wrong implicit inner product\n        minimize(     smoothF( X1, X2 ) + ...\n            norm( A2(X1,X2), 2 ) + norm( vec(A3(X1,X2)) , 1 ) + ...\n            mu*( sum_square(vec(X1)) + sum_square(vec(X2)) )/2       )\n        subject to\n            A1(X1,X2) >= 0  % constraint is dual of prox1\n            A4(X1,X2) >= 0  % constraint is dual of prox2\n    cvx_end\n    X_CVX_smoothed{1} = X1;\n    X_CVX_smoothed{2} = X2;\n    \n    % Second, get a solution to the unsmoothed version\n    cvx_begin\n        variables X1(n1,n2) X2(N1,N2)\n        minimize(     smoothF( X1, X2 ) + ...\n            norm( A2(X1,X2), 2 ) + norm( vec(A3(X1,X2)) , 1 ) )\n        subject to\n            A1(X1,X2) >= 0\n            A4(X1,X2) >= 0\n    cvx_end\n    X_CVX{1} = X1;\n    X_CVX{2} = X2;\n    \n    save(fileName,'X_CVX', 'X_CVX_smoothed');\n    fprintf('Saved data to file %s\\n', fileName);\nend\n\n% Verify constraint are satisfied\nfprintf('Is A1(x1,x2) >= 0? The min element is %g\\n', min(    A1(X_CVX{1},X_CVX{2} )) )\nfprintf('Is A2(x1,x2) >= 0? The min element is %g\\n', min(min(A4(X_CVX{1},X_CVX{2}))) )\n%% before running TFOCS, scale the problem perhaps?\n% This is one way to see how big the norms are:\n% nrm11    = linop_test( A1_X1 ); % 15.7\n% nrm12    = linop_test( A1_X2 ); % 16.6\n% \n% nrm21    = linop_test( A2_X1 ); % 17.8\n% nrm22    = linop_test( A2_X2 ); % 18.6\n% \n% nrm31    = linop_test( A3_X1 ); % 63.4\n% nrm32    = linop_test( A3_X2 ); % 0\n% \n% nrm41    = linop_test( A4_X1 ); % 35.6\n% nrm42    = linop_test( A4_X2 ); % 34.6\n\n%% now, run TFOCS. First, try it without continuation\n\nx0 = [];\nz0 = [];\nopts    = struct('continuation',false,'maxits',1500,'debug',true); % using 'debug' mode to print out useful information\nopts.printEvery     = 50;\n\n% Pick a scaling factor \"s\" (optional: set to \"1\" to have no effect)\ns = .5; % helps a little bit\n% (note that if we scale prox3 by \"s\", then we multiply the corresponding\n%  affine part by \"s\", rather than divide them by \"s\", since prox3\n%  is really for the dual and not the primal).\n\nmu  = 1;\nopts.errFcn{1} = @(f,d,p) norm( p{1}-X_CVX_smoothed{1}); % compare to smoothed reference solution\nopts.errFcn{2} = @(f,d,p) norm( p{2}-X_CVX_smoothed{2});\n\n[xAll,outParam,optsOut] = tfocs_SCD( {smooth1,smooth2}, ...\n    { A1_X1, A1_X2, const1; A2_X1, A2_X2, const2; ...\n    A3_X1*s, A3_X2*s, const3*s; A4_X1, A4_X2, const4 }, ...\n    {prox1,prox2,prox_scale(prox3,s),prox4},...\n    mu, x0, z0, opts );\n\nmnConstraint1    = min(min( A1(xAll{1},xAll{2} ) ) );\nmnConstraint2    = min(min( A4(xAll{1},xAll{2} ) ) );\nfprintf('First constraint violated by:   %g\\n', mnConstraint1);\nfprintf('Second constraint violated by:  %g\\n', mnConstraint2 );\n\n% Check that we are within acceptable limits\ner = sqrt(norm( xAll{1} - X_CVX_smoothed{1} )^2 + norm( xAll{2} - X_CVX_smoothed{2} )^2 )/...\n    sqrt( norm(X_CVX_smoothed{1})^2 + norm(X_CVX_smoothed{2})^2 ); % should be about .006\n\nif er > 0.04 || mnConstraint1 < -.01 || mnConstraint2 < -.01\n    error('Failed the test');\nelse\n    disp('This test successfully passed');\nend\n\n%% run TFOCS with continuation\nx0 = [];\nz0 = [];\n% type \"tfocs\" at the command to see possible options\nopts    = struct('continuation',true,'maxits',1500);\nopts.printEvery     = 50;\nopts.tol            = 1e-4;\nopts.stopCrit       = 4;\nopts.printStopCrit  = true;\n\n% type \"continuation\" at the command to see possible options\ncontOpts    = struct( 'maxIts', 8 , 'muDecrement', 0.8 );\n% ask for increased accuracy on the final solve\ncontOpts.finalTol = 1e-5;\n\ns = .5; % helps a little bit\n% (note that if we scale prox3 by \"s\", then we multiply the corresponding\n%  affine part by \"s\", rather than divide them by \"s\", since prox3\n%  is really for the dual and not the primal).\n\nmu  = 10;\nopts.errFcn{1} = @(f,d,p) norm( p{1}-X_CVX{1}); % compare to unsmoothed reference solution\nopts.errFcn{2} = @(f,d,p) norm( p{2}-X_CVX{2});\n\n[xAll,outParam,optsOut] = tfocs_SCD( {smooth1,smooth2}, ...\n    { A1_X1, A1_X2, const1; A2_X1, A2_X2, const2; ...\n    A3_X1*s, A3_X2*s, const3*s; A4_X1, A4_X2, const4 }, ...\n    {prox1,prox2,prox_scale(prox3,s),prox4},...\n    mu, x0, z0, opts, contOpts );\n\nmnConstraint1    = min(min( A1(xAll{1},xAll{2} ) ) );\nmnConstraint2    = min(min( A4(xAll{1},xAll{2} ) ) );\nfprintf('First constraint violated by:   %g\\n', mnConstraint1);\nfprintf('Second constraint violated by:  %g\\n', mnConstraint2 );\n\n% Check that we are within acceptable limits\ner = sqrt(norm( xAll{1} - X_CVX{1} )^2 + norm( xAll{2} - X_CVX{2} )^2 )/...\n    sqrt( norm(X_CVX{1})^2 + norm(X_CVX{2})^2 ); % should be about .006\n\nif er > 0.4 || mnConstraint1 < -.01 || mnConstraint2 < -.01\n    error('Failed the test');\nelse\n    disp('This test successfully passed');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information."
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_nuclearNorm.m",
    "content": "%{\n    Tests nuclear norm minimization,\n\n    min_X ||X||_*\ns.t.\n    P(X) == b, or || P(X) - b || <= eps\n\nwhere X is a M x N matrix, and P is an observation operator\n\nThe solvers solve a regularized version, using\n||X||_* + mu/2*||X-X_0||_F^2\nYou can turn on the continuation feature to reduce the effect of nonzero mu\n\n%}\nnuclear_norm = @(x) sum(svd(x,'econ'));\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','nuclearNorm_problem1_noiseless');\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n\n    randn('state',sum('NuclearNorm'));\n    rand('state',sum('NuclearNorm2'));\n    \n    M = 30; N = 30; R = 2;\n\n    df = R*(M+N-R);\n    oversample = 5;\n    Left  = randn(M,R);\n    Right = randn(N,R);\n    k = round(oversample*df); \n    k = min( k, round(.8*M*N) );\n    omega = randperm(M*N);\n    omega = sort(omega(1:k)).';\n\n    X_original = Left*Right';       % the \"original\" signal -- may not be optimal value\n    b_original = X_original(omega); \n    EPS = 0;        % noise level\n    b = b_original;\n    obj_original = nuclear_norm(X_original);\n\n    % get reference via CVX\n    cvx_begin\n        cvx_precision best\n        variable Xcvx(M,N)\n        minimize norm_nuc(Xcvx)\n        subject to\n            Xcvx(omega) == b\n    cvx_end\n    X_reference = Xcvx;         % the nuclear norm minimizer\n    obj_reference = nuclear_norm(X_reference);\n    \n    save(fileName,'X_original','X_reference','omega','b','obj_original',...\n        'Left','Right','EPS','b_original','R','obj_reference');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n[M,N]           = size(X_reference);\nnorm_X_reference = norm(X_reference,'fro');\ner_reference    = @(x) norm(x-X_reference,'fro')/norm_X_reference;\nresid           = @(x) norm(x(omega)-b)/norm(b);  % change if b is noisy\n\n[omegaI,omegaJ] = ind2sub([M,N],omega);\nmat = @(x) reshape(x,M,N);\nvec = @(x) x(:);\n    \nk  = length(omega);\np  = k/(M*N);\ndf = R*(M+N-R);\nfprintf('%d x %d rank %d matrix, observe %d = %.1f x df = %.1f%% entries\\n',...\n    M,N,R,k,k/df,p*100);\nfprintf(' Nuclear norm solution and original matrix differ by %.2e\\n',...\n    norm(X_reference-X_original,'fro')/norm_X_reference );\n\n%% set some parameters\n\ntestOptions = {};\nopts = [];\nopts.alg    = 'GRA';\nopts.errFcn = @(f,dual,x) norm( x - X_reference,'fro')/norm(X_reference,'fro');\n\nmu      = .001;\nX0      = 0; \n\n% The Lipschitz bound is L = 1/mu\n% opts.L0   = 1/mu;\n[ x, out, opts ] = solver_sNuclearBP( {M,N,omega}, b, mu, X0, [], opts ); \n% Check that we are within allowable bounds\nif out.err(end) < 1e-5\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% test noisy version (just pretend there's a tiny amount of noise)\ndisp('== Noisy variant ==');\nepsilon = 1e-6; % if there really were noise, this should be an estimate of the std\n[ x, out, opts ] = solver_sNuclearBPDN( {M,N,omega}, b, epsilon, mu, X0, [], opts ); \n% Check that we are within allowable bounds\nif out.err(end) < 1e-5\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_psdCompletion.m",
    "content": "%{\nTest the trace-constrained least-squares problem with positive\nsemi-definite matrix variables\n\n     minimize (1/2)*norm( A * X - b )^2 \n     with the constraint that X is positive semi-definite ( X >= 0 )\nand optionally,\n    the constraint trace(X) <= lambda\n\n%}\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','traceLS_problem2_noisy');\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    % Generate a new problem\n    randn('state',sum('Trace')+5);\n    rand('state',sum('Trace2')+5);\n    \n    N = 30; R = 2;\n    \n    df = R*N;\n    oversample = 5;\n    Left  = randn(M,R);\n    Right = Left;\n    k = round(oversample*df); \n    k = min( k, round(.8*N*N) );\n    omega = randperm(N*N);\n    omega = sort(omega(1:k)).';\n\n    X_original = Left*Right';       % the \"original\" signal -- may not be optimal value\n    b_original = X_original(omega); \n    EPS = .001;        % noise level\n    noise = EPS * randn(k,1);  % this destroys symmetry...\n    b = b_original + noise;\n    lambda       = trace( X_original );\n    objective    = @(X) sum_square( X(omega) - b )/2;\n    obj_original = objective(X_original);\n\n    % get references via CVX\n    cvx_begin\n        cvx_precision best\n        cvx_quiet true\n        variable Xcvx(N,N)\n        minimize objective(Xcvx)\n        subject to\n            Xcvx == semidefinite(N)\n    cvx_end\n    X_reference_noTraceConstraint = Xcvx; \n        fprintf('Difference between convex solution (no trace constraint) and original signal: %.2e\\n', ...\n        norm( Xcvx - X_original, 'fro' ) );\n    \n    cvx_begin\n        cvx_precision best\n        cvx_quiet true\n        variable Xcvx(N,N)\n        minimize objective(Xcvx)\n        subject to\n            Xcvx == semidefinite(N)\n            trace(Xcvx) <= lambda\n    cvx_end\n    X_reference = Xcvx;         % the trace norm minimizer   \n    obj_reference = objective(X_reference);\n    fprintf('Difference between convex solution (with trace constraint) and original signal: %.2e\\n', ...\n        norm( Xcvx - X_original, 'fro' ) );\n    save(fileName,'X_original','X_reference','X_reference_noTraceConstraint',...\n        'omega','b','obj_original',...\n        'Left','EPS','b_original','R','obj_reference','lambda');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n[M,N]            = size(X_reference);\nnorm_X_reference = norm(X_reference,'fro');\ner_reference     = @(x) norm(x-X_reference,'fro')/norm_X_reference;\nnorm_X_reference2= norm(X_reference_noTraceConstraint,'fro');\ner_reference2    = @(x) norm(x-X_reference_noTraceConstraint,'fro')/norm_X_reference2;\nobjective        = @(X) norm( X(omega) - b )^2/2;\n\n[omegaI,omegaJ] = ind2sub([M,N],omega);\nmat = @(x) reshape(x,M,N);\nvec = @(x) x(:);\n    \nk  = length(omega);\np  = k/(M*N);\ndf = R*(M+N-R);\nfprintf('%d x %d rank %d matrix, observe %d = %.1f x df = %.1f%% entries\\n',...\n    M,N,R,k,k/df,p*100);\nfprintf(' Trace norm solution and original matrix differ by %.2e\\n',...\n    norm(X_reference-X_original,'fro')/norm_X_reference );\n%% Solve unconstrained version. No smoothing is necessary!\nopts = struct('maxIts',500);\nopts.errFcn{1} = @(f,x) er_reference2(x); % no trace constraint\nopts.errFcn{2} = @(f,x) sum( abs(eig(x)) > 1e-5 ); % numerical rank\n% tell it to use eigs instead of eig\n% opts.largescale = true; % ( but not recommended)\n\n% opts.symmetrize = true; % another option\n\nA = sparse( omegaI,omegaJ,b,N,N);\n[x,out] = solver_psdComp( A, opts );\n% Note: we do not expect to get zero error because there might be more\n%   than one optimal solution for this problem (since there are not\n%   so many constraints)\n% Check that we have a feasible solution\nfprintf('Objective is %.2e, min eigenvalue is %.2e\\n', objective(x),...\n    min(eig(x)) );\n%% Solve trace constrained version. No smoothing necessary!\nopts = struct('maxIts',1500,'tol',1e-9);\nopts.errFcn{1} = @(f,x) er_reference(x); % no trace constraint\nopts.errFcn{2} = @(f,x) trace(x)-lambda;\nopts.errFcn{3} = @(f,x) sum( abs(eig(x)) > 1e-5 ); % numerical rank\n% we can also symmetrize \"omega\", but it makes little difference,\n%   and gives slightly differen value than CVX, since CVX symmetrizes\n%   differently:\n% opts.symmetrize = true;\nA = sparse( omegaI,omegaJ,b,N,N);\n[x,out] = solver_psdCompConstrainedTrace( A,lambda, opts );\n\nh=figure();\nsemilogy(out.err(:,1));\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-5\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n%%\nclose(h)\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_quadratic.m",
    "content": "%% Tests the solvers on a simple unconstrained quadratic function\n\n%{\n    Solve:\n\n    minimize_x  c'x + x'Dx/2\n\n    as an example of using TFOCS without the \"SCD\" interface\n\n%}\n\nrandn( 'state', sum('quadratic test') );\nN       = 100;\nc       = randn(N,1);\nD       = randn(N,N);\nD       = D * D' + .5*eye(N);\nx_star  = - D \\ c;          % the true answer\nx0      = zeros(N,1);\n\n% Here's what you could do...\n% f       = @(x) c'*x + x'*D*x/2;\n% grad_f  = @(x) c + D*x;\n% smoothF = @(x) wrapper_objective( f, grad_f, x );\n\n% Here's a simpler way:\nsmoothF = smooth_quad(D,c);\n\nx_error = @(x) norm(x-x_star,Inf);\n\nopts = [];\nopts.errFcn     = { @(f,x) x_error(x)};\nopts.restart = 100;\n\n[ x, out, optsOut ] = tfocs( smoothF, [], [],x0, opts );\n% Check that we are within allowable bounds\nif out.err(end) < 1e-5\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_quadratic_constrained.m",
    "content": "function test_quadratic_constrained\n%% Tests the solvers on a simple constrained quadratic function\n%{\n    Solve:\n\n    minimize_x  c'x + x'Dx/2\n    subject to  ||x||_1 <= 10\n\n    as an example of using TFOCS without the \"SCD\" interface\n    (since the objective is smooth and we can project, there's \n     no need to smooth and solve the dual)\n\n    It's also an example of using 2 objective functions\n\n%}\n\n%% Now, add in constraints\n\nrandn( 'state', sum('quadratic test') );\nN = 100;\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% CONSTRUCT THE TEST PROBLEM %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nc = randn(N,1);\nD = randn(N,N);\nD = D * D' + .5*eye(N);\ns = svd(D);\n% x_star = - D \\ c;\n% L = max(s); \n% mu = min(s);\n% if mu < eps, disp('WARNING: may have 0 eigenvalues'); end\n% f_star = 0.5 * c' * x_star;\n% n_star = norm( x_star );\nx0 = zeros(N,1);\n\n% f       = @(x) c'*x + x'*D*x/2;\n% grad_f  = @(x) c + D*x;\n% smoothF = @(x) wrapper_objective( f, grad_f, x );\n%   -- or --\n% smoothF = smooth_quad(D,c);\n%   -- or (demonstrating how to use 2 objective functions) --\nf1      = @(x) c'*x;\nf2      = @(x) x'*D*x/2;\ng1      = @(x) c;\ng2      = @(x) D*x;\nsmoothF = { @(x) wrapper_objective(f1,g1,x); @(x) wrapper_objective(f2,g2,x) };\nlinearF = { 1 ; 1 };\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% SET UP THE TEST PARAMETERS %\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\nopts = [];\nopts.tol        = 1e-16;\nopts.maxits     = 3000;\nopts.restart    = 100;\n\n%%%%%%%%%%%%%%%%%%%%%\n% ADD IN CONSTRAINT %\n%%%%%%%%%%%%%%%%%%%%%\n% projectorF      = proj_simplex(10); % x >=0, sum(x) = 10\nprojectorF      = proj_l1(10);  % l1 ball, radius 10 (e.g. norm(x,1) <= 10)\n\n\n%%%%%%%%%%%%%%%%%\n% RUN THE TESTS %\n%%%%%%%%%%%%%%%%%\n[ x, out, optsOut ] = tfocs( smoothF, linearF, projectorF,x0, opts );\n% Check that we are within allowable bounds\n\n\n\nfunction [v,gr] = wrapper_objective(f,g,x)\nv = f(x);\nif nargout > 1\n    gr = g(x);\nend\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sBP.m",
    "content": "%{\n    Tests basis pursuit\n\n    min_x ||X||_1\ns.t.\n    A(X) == b\n\nThe solvers solve a regularized version, using\n||x||_1 + mu/2*||x-x_0||_2^2\n\nThis problem is a linear program, so if mu is sufficiently small,\nthe smoothing has exactly no effect.\n\nAs a reference solution, we use either \"x_ref\" which is the interior-point\nmethod solution, or we use \"x_original\", which is the original signal\nused to generate the measurements b.  In general, \"x_original\" is not\nthe solution to the minimization problem; but under certain circumstances,\nsuch as when \"x_original\" is very sparse, it is the solution to the minimization problem.\nThis is the fundamental result from compressed sensing.\nWhen this situation applies, \"x_original\" is the correct solution to machine precision,\nand will be more accurate than even \"x_ref\".\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','basispursuit_problem1_smoothed_noiseless');\nrandn('state',34324);\n\n% We don't want to store \"A\"\nrand('state',34324);\nN = 1024;\nM = round(N/2);\nK = round(M/5);\nA = randn(M,N);\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    % Generate a new problem\n    x = zeros(N,1);\n    T = randsample(N,K);\n    x(T) = randn(K,1);\n\n    b = A*x;\n    EPS = 0;\n    b_original = b;\n    x_original = x;\n    \n    mu = .01*norm(x,Inf);\n    x0 = zeros(N,1);\n    % Note: with equality constraints, this is an LP, so for mu small\n    % enough (but > 0), we have exact relaxation.\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize norm(xcvx,1) + mu/2*sum_square(xcvx-x0)\n        subject to\n            A*xcvx == b\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx;      \n    obj_ref = norm(x_ref,1) + mu/2*sum_square(x_ref-x0);\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'EPS','b_original','obj_ref','x0','time_IPM');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n\n[M,N]           = size(A);\nK               = nnz(x_original);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, K );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\n%% Call the TFOCS solver\n% er              = er_ref;  % error with reference solution (from IPM)\ner              = er_signal; % error from original signal\n% obj_ref         = norm(x_ref,1) + mu/2*norm(x_ref-x0)^2;\nobj_ref           = norm(x_original,1) + mu/2*norm(x_original-x0)^2;\nopts = [];\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f  }; \nz0  = [];   % we don't have a good guess for the dual\ntic;\n[ x, out, optsOut ] = solver_sBP( A, b, mu, x0, z0, opts );\ntime_TFOCS = toc;\n\nfprintf('--------------------------------------------------------\\n');\nfprintf('Results:\\n-original signal-\\t-IPM solution-  -TFOCS solution-\\n');\nfprintf('---------------------+-----------------+----------------\\n');\nfprintf('Number of nonzeros:\\n\\t%d\\t\\t%d\\t\\t%d\\n',...\n    nnz(x_original),nnz(x_ref), nnz(x) );\nfprintf('Error vs. original, rel. l2 norm:\\n\\tN/A\\t\\t%.2e\\t%.2e\\n',...\n    er_signal(x_ref), er_signal(x) );\ner_signal1 = @(x) norm(x-x_original,Inf);\nfprintf('Error vs. original, lInf norm:\\n\\tN/A\\t\\t%.2e\\t%.2e\\n',...\n    er_signal1(x_ref), er_signal1(x) );\nfprintf('Time to solve:\\n\\tN/A\\t\\t%.1fs\\t\\t%.1fs\\n',...\n    time_IPM, time_TFOCS );\nfprintf('--------------------------------------------------------\\n');\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-8\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% Here is how you can view the error history on a graph\nfigure();\nsemilogy( out.err(:,1) );\nxlabel('iterations'); ylabel('error');\n\n%% Here are some alternative ways to call it\nopts = [];\nopts.maxIts     = 500;\n\nA_TFOCS = linop_matrix( A );    % not necessary, but one way to do it\n[ x, out, optsOut ] = solver_sBP( A_TFOCS, b, mu, x0, z0, opts );\n\n% We can also pass in function handles\nAf  = @(x) A*x;\nAt  = @(y) A'*y;\nA_TFOCS = linop_handles( [M,N], Af, At );\n[ x, out, optsOut ] = solver_sBP( A_TFOCS, b, mu, x0, z0, opts );\n\n%% close plots\nclose all\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sBPDN.m",
    "content": "%{\n    Tests basis pursuit de-noising\n\n    min_x ||x||_1\ns.t.\n    || A(x) - b || <= eps\n\nThe solvers solve a regularized version, using\n    ||x||_1 + mu/2*||x-x_0||_2^2\n\nsee also test_sBP.m\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n%%\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','basispursuit_problem1_smoothed_noisy');\nrandn('state',34324);\nrand('state',34324);\nN = 1024;\nM = round(N/2);\nK = round(M/5);\nA = randn(M,N);\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n    x = zeros(N,1);\n    T = randsample(N,K);\n    x(T) = randn(K,1);\n\n    b_original = A*x;\n    snr = 30;  % SNR in dB\n    b   = myAwgn(b_original,snr);\n    EPS = norm(b-b_original);\n    x_original = x;\n    \n    mu = .01*norm(x,Inf);\n    x0 = zeros(N,1);\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize norm(xcvx,1) + mu/2*sum_square(xcvx-x0)\n        subject to\n            norm(A*xcvx - b ) <= EPS\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx;\n    obj_ref = norm(x_ref,1) + mu/2*sum_square(x_ref-x0);\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'EPS','b_original','obj_ref','x0','time_IPM','snr');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n\n[M,N]           = size(A);\nK               = nnz(x_original);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, K );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from IPM)\nopts = [];\nopts.restart    = 500;\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f  }; \nopts.maxIts     = 1000;\nz0  = [];   % we don't have a good guess for the dual\ntic;\n[ x, out, optsOut ] = solver_sBPDN( A, b, EPS, mu, x0, z0, opts );\ntime_TFOCS = toc;\n\nfprintf('Solution has %d nonzeros.  Error vs. IPM solution is %.2e\\n',...\n    nnz(x), er(x) );\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-6\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sBPDN_W.m",
    "content": "%{\n    Tests the \"analysis\" form of basis pursuit de-noising\n\n    min_x ||Wx||_1\ns.t.\n    || A(x) - b || <= eps\n\nThe solvers solve a regularized version, using\n    ||Wx||_1 + mu/2*||x-x_0||_2^2\n\nsee also test_sBP.m and test_sBPDN.m\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','basispursuit_W_problem1_smoothed_noisy');\nrandn('state',34324);\nrand('state',34324);\n\nN = 512;\nM = round(N/2);\nK = round(M/5);\n\nA = randn(M,N);\nx = zeros(N,1);\n\n% introduce a sparsifying transform \"W\"\nd  = round(4*N);     % redundant\nWf = @(x) dct(x,d);  % zero-padded DCT\ndownsample  = @(x) x(1:N,:);\nWt = @(y) downsample( idct(y) );    % transpose of W\nW  = Wf(eye(N));     % make an explicit matrix for CVX\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\n    \nelse\n    \n    % Generate a new problem\n\n    % the signal x consists of several pure tones at random frequencies\n    for k = 1:K\n        x = x + randn()*sin( rand()*pi*(1:N) + 2*pi*rand() ).';\n    end\n\n\n    b_original = A*x;\n    snr = 40;  % SNR in dB\n    b   = myAwgn(b_original,snr);\n    EPS = norm(b-b_original);\n    x_original = x;\n    \n    mu = .01*norm(Wf(x),Inf);\n    x0 = zeros(N,1);\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize norm(W*xcvx,1) + mu/2*sum_square(xcvx-x0)\n        subject to\n            norm(A*xcvx - b ) <= EPS\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx; \n    obj_ref = norm(W*x_ref,1) + mu/2*sum_square(x_ref-x0);\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'EPS','b_original','obj_ref','x0','time_IPM','snr','d');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n\n[M,N]           = size(A);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d\\n', M, N );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\n%% Call the TFOCS solver\nobjF            = @(x)norm(W*x,1) + mu/2*norm(x-x0).^2;\ninfeasF         = @(x)norm(A*x-b) - EPS;\ner              = er_ref;  % error with reference solution (from IPM)\nopts            = [];\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f, ...\n                    @(f,dual,primal) infeasF(primal) }; \nopts.maxIts     = 1000;\nopts.tol        = 1e-10;\n% opts.normA2     = norm(A*A');\n% opts.normW2     = norm(W'*W);\nz0  = [];   % we don't have a good guess for the dual\ntic;\n[ x, out, optsOut ] = solver_sBPDN_W( A, W, b, EPS, mu, x0, z0, opts );\ntime_TFOCS = toc;\nfprintf('x is sub-optimal by %.2e, and infeasible by %.2e\\n',...\n    objF(x) - obj_ref, infeasF(x) );\n\nfprintf('Solution has %d nonzeros.  Error vs. IPM solution is %.2e\\n',...\n    nnz(x), er(x) );\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-4\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n\n%% Doing it \"by hand\" (for debugging), just for 200 iterations\nobjF            = @(x)norm(W*x,1) + mu/2*norm(x-x0).^2;\ninfeasF         = @(x)norm(A*x-b) - EPS;\ner              = er_ref;  % error with reference solution (from IPM)\n% er              = er_signal;\nopts            = [];\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f, ...\n                    @(f,dual,primal) infeasF(primal) }; \nopts.maxIts     = 200;\nopts.printEvery = 10;\nopts.tol        = 1e-10;\nz0      = [];\nproxScale = sqrt(norm(W'*W)/norm(A*A'));\nscale   = 1;\nprox    = { prox_l2( EPS/scale ), proj_linf(proxScale) };\naffineF = {A/scale,-b/scale;W/proxScale,0};\n[ x, out, optsOut ] = tfocs_SCD( [], affineF, prox, mu, x0, z0, opts );\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-2\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sBPDN_WW.m",
    "content": "%{\n    Tests the extended \"analysis\" form of basis pursuit de-noising\n\n    min_1 alpha*||W_1 x||_1 + beta*|| W_2 x ||_1\ns.t.\n    || A(x) - b || <= eps\n\nThe solvers solve a regularized version\n\nsee also test_sBP.m and test_sBPDN.m and test_sBPDN_W.m\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','basispursuit_WW_problem1_smoothed_noisy');\nrandn('state',34324);\nrand('state',34324);\n\nN = 512;\nM = round(N/2);\nK = round(M/5);\n\nA = randn(M,N);\nx = zeros(N,1);\n\n% introduce a sparsifying transform \"W\"\nd  = round(4*N);     % redundant\nWf = @(x) dct(x,d);  % zero-padded DCT\ndownsample  = @(x) x(1:N,:);\nWt = @(y) downsample( idct(y) );    % transpose of W\nW  = Wf(eye(N));     % make an explicit matrix for CVX\n\n% and add another transform:\nd2 = round(2*N);\nW2 = randn(d2,N);\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n\n    alpha = 1;\n    beta = 2;\n    \n    % the signal x consists of several pure tones at random frequencies\n    for k = 1:K\n        x = x + randn()*sin( rand()*pi*(1:N) + 2*pi*rand() ).';\n    end\n\n\n    b_original = A*x;\n    snr = 40;  % SNR in dB\n    b   = myAwgn(b_original,snr);\n    EPS = norm(b-b_original);\n    x_original = x;\n    \n    mu = .01*norm(Wf(x),Inf);\n    x0 = zeros(N,1);\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision high\n        variable xcvx(N,1)\n        minimize alpha*norm(W*xcvx,1) + beta*norm(W2*xcvx,1) + ...\n            mu/2*sum_square(xcvx-x0)\n        subject to\n            norm(A*xcvx - b ) <= EPS\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx; \n    objF        = @(x)alpha*norm(W*x,1) +beta*norm(W2*x,1)+ mu/2*norm(x-x0).^2;\n    obj_ref     = objF(x_ref);\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'EPS','b_original','obj_ref','x0','time_IPM','snr',...\n        'd','d2','alpha','beta');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n\n[M,N]           = size(A);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d\\n', M, N );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\n%% Call the TFOCS solver\nobjF            = @(x)alpha*norm(W*x,1) +beta*norm(W2*x,1)+ mu/2*norm(x-x0).^2;\ninfeasF         = @(x)norm(A*x-b) - EPS;\ner              = er_ref;  % error with reference solution (from IPM)\nopts            = [];\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f, ...\n                    @(f,dual,primal) infeasF(primal) }; \nopts.maxIts     = 2000;\nopts.tol        = 1e-10;\n% opts.normA2     = norm(A*A');\n% opts.normW2     = norm(W'*W);\nz0  = [];   % we don't have a good guess for the dual\ntic;\n[ x, out, optsOut ] = solver_sBPDN_WW( A, alpha,W,beta,W2,b, EPS, mu, x0, z0, opts );\ntime_TFOCS = toc;\nfprintf('x is sub-optimal by %.2e, and infeasible by %.2e\\n',...\n    objF(x) - obj_ref, infeasF(x) );\n\nfprintf('Solution has %d nonzeros.  Error vs. IPM solution is %.2e\\n',...\n    nnz(x), er(x) );\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-3\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sBPDN_complex.m",
    "content": "%{\n    Tests basis pursuit de-noising\n\n    min_x ||x||_1\ns.t.\n    || A(x) - b || <= eps\n\nThe solvers solve a regularized version, using\n    ||x||_1 + mu/2*||x-x_0||_2^2\n\nThis version allows for complex measurements.\n\nsee also test_sBPDN.m\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','basispursuit_problem1_smoothed_noisy_complex');\nrandn('state',34324);\nrand('state',34324);\n\nN = 1024;\nM = round(N/2);\nK = round(M/5);\n\nA = fft(eye(N));        % A is complex\nrowsA = sort(randsample(N,M));\nA = A(rowsA,:);\n    \nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n    \n    x = zeros(N,1);\n    T = randsample(N,K);\n    x(T) = randn(K,1);\n\n    b_original = A*x;\n    snr = 30;  % SNR in dB\n    b   = myAwgn(b_original,snr);\n    EPS = norm(b-b_original);\n    x_original = x;\n    \n    mu = .01*norm(x,Inf);\n    x0 = zeros(N,1);\n    % Note: with equality constraints, this is an LP, so for mu small\n    % enough (but > 0), we have exact relaxation.\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize norm(xcvx,1) + mu/2*sum_square(xcvx-x0)\n        subject to\n            norm(A*xcvx - b ) <= EPS\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx;\n    obj_ref = norm(x_ref,1) + mu/2*sum_square(x_ref-x0);\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'EPS','b_original','obj_ref','x0','time_IPM','snr');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n\n[M,N]           = size(A);\nK               = nnz(x_original);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, K );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from IPM)\nopts = [];\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f  }; \nopts.maxIts     = 750;\n\n% Option 1:\nmode = 'r2c';\n% mode = 'c2c';     % do NOT use this: it solves a different problem!\nAA = A; bb = b; Ahandles = linop_matrix(AA,mode);\n\n% Option 2:\n% AA = [real(A); imag(A)]; bb = [real(b); imag(b)]; \n% Ahandles = linop_matrix(AA);\n\nz0  = [];   % we don't have a good guess for the dual\ntic;\n[ x, out, optsOut ] = solver_sBPDN( Ahandles, bb, EPS, mu, x0, z0, opts );\ntime_TFOCS = toc;\n\nfprintf('Solution has %d nonzeros.  Error vs. IPM solution is %.2e\\n',...\n    nnz(x), er(x) );\n\nif out.err(end,1) < 1e-3\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sBPDN_complex_2.m",
    "content": "%{\n    Tests basis pursuit de-noising\n\n    min_x ||x||_1\ns.t.\n    || A(x) - b || <= eps\n\nThe solvers solve a regularized version, using\n    ||x||_1 + mu/2*||x-x_0||_2^2\n\nThis version allows for complex measurements.\n\nUnlike test_sBPDN_complex, we also allow x to be complex.\nFor example, suppose we have a signal f that is the superposition\nof a few tones.  Then in the \"synthesis\" formulation, we make the\nchange-of-variables  x = F f, where F is the FFT matrix.\nIf \"PHI\" is the measurement matrix, then the linear operator is\nA = Phi*F', where F' = inv(F) is the IFFT.\n\nsee also test_sBPDN.m, test_sBPDN_complex, test_sBPDN_W\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','basispursuit_problem1_smoothed_noisy_complex_2');\nrandn('state',34324);\nrand('state',34324);\nN = 1024;\nM = round(N/2);\nM = round(M/5);\nPhi = randn(M,N);\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\n    F   = fft(eye(N))/sqrt(N);\n    A   = Phi * F';\nelse\n    \n    % Generate a new problem\n    \n    F   = fft(eye(N))/sqrt(N);\n    A   = Phi * F';\n    \n    % introduce a sparsifying transform \"W\"\n    f = zeros(N,1);\n    % the signal x consists of several pure tones at random frequencies\n    K = 5; %\n    for k = 1:K\n        f = f + randn()*sin( rand()*pi*(1:N) + 2*pi*rand() ).';\n    end\n    x = fft(f)/sqrt(N);\n\n\n    b_original = A*x;\n    snr = 30;  % SNR in dB\n    b   = myAwgn(b_original,snr);\n    EPS = norm(b-b_original);\n    x_original = x;\n    \n    mu = .001*norm(x,Inf);\n    x0 = zeros(N,1);\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1) complex\n        minimize norm(xcvx,1) + mu/2*sum_square_abs(xcvx-x0)\n        subject to\n            norm(A*xcvx - b ) <= EPS\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx;\n    obj_ref = norm(x_ref,1) + mu/2*sum_square_abs(x_ref-x0);\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'EPS','b_original','obj_ref','x0','time_IPM','snr');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n\n[M,N]           = size(A);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, nnz(x_original) );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from IPM)\nopts = [];\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f  }; \nopts.maxIts     = 4500;\nopts.printEvery = 50;\nopts.tol        = 1e-8;\n\nmode = 'c2c';\nAA = A; bb = b; Ahandles = linop_matrix(AA,mode);\n\nz0  = [];   % we don't have a good guess for the dual\ntic;\n[ x, out, optsOut ] = solver_sBPDN( Ahandles, bb, EPS, mu, x0, z0, opts );\ntime_TFOCS = toc;\n\nfprintf('Solution has %d nonzeros.  Error vs. IPM solution is %.2e\\n',...\n    nnz(x), er(x) );\n\nif out.err(end,1) < 1e-5\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sBPDN_nonnegative.m",
    "content": "%{\n    Tests non-negative basis pursuit\n\n    min_x ||X||_1\ns.t.\n    || A(X) - b|| <= eps  and x >= 0\n\nThe solvers solve a regularized version, using\n||x||_1 + mu/2*||x-x_0||_2^2\n\n\nSee also test_sBPDN.m and test_sBP_nonnegative.m\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','basispursuit_problem1_smoothed_noisy_nonnegative');\nrandn('state',25442);\nrand('state',2452);\n\nN = 1024;\nM = round(N/2);\nK = round(M/2);\n\nA = randn(M,N);\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n\n    x = zeros(N,1);\n    T = randsample(N,K);\n    x(T) = .1+rand(K,1);  % x >= 0\n\n    b = A*x;\n    noise   = .1*norm(b)*randn(M,1)/sqrt(M);\n    EPS = .9*norm(noise);\n    b_original = b + noise;\n    x_original = x;\n    \n    mu = .01*norm(x,Inf);\n    x0 = zeros(N,1);\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize norm(xcvx,1) + mu/2*sum_square(xcvx-x0)\n        subject to\n            norm( A*xcvx - b ) <= EPS\n            xcvx >= 0\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx;     \n    obj_ref = norm(x_ref,1) + mu/2*sum_square(x_ref-x0);\n    \n    % get reference via CVX, this time, without the x >= 0 constraing\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize norm(xcvx,1) + mu/2*sum_square(xcvx-x0)\n        subject to\n            norm( A*xcvx - b ) <= EPS\n    cvx_end\n    time_IPM = toc;\n    x_pureBP = xcvx;\n    obj_ref = norm(x_ref,1) + mu/2*sum_square(x_ref-x0);\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'EPS','b_original','obj_ref','x0','time_IPM','x_pureBP');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n\n[M,N]           = size(A);\nK               = nnz(x_original);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\nnorm_x_pureBP   = norm(x_pureBP);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;        % err w.r.t. CVX\ner_pureBP       = @(x) norm(x-x_pureBP)/norm_x_pureBP;  % err w.r.t. CVX w.o. nonneg constraint\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;  % err w.r.t. signal\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, K );\nfprintf('\\tl1-norm solution and original signal differ by:\\t\\t\\t\\t%.2e (mu = %.2e)\\n', ...\n    norm(x_pureBP - x_original)/norm(x_original),mu );\nfprintf('\\tl1-norm solution, with x >=0 constraint, and original signal differ by:\\t%.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\ndisp('Note: because of the noise, we do not expect to get zero error');\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from CVX)\nopts = [];\n% To see all possible options, run \"tfocs()\"\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f, ...\n                    @(f,dual,primal) nnz(primal) }; \nopts.maxIts     = 400;\nz0  = [];   % we don't have a good guess for the dual\n\nopts.nonneg     = true;     % tell it to add the x >= 0 constraint\n\ntic;\nx   = solver_sBPDN( A, b, EPS, mu, x0, z0, opts );\ntime_TFOCS = toc;\n\nfprintf('for (original signal, IPM solution, TFOCS solution),\\n   NNZ:\\n\\t%d\\t\\t%d\\t\\t%d\\n',...\n    nnz(x_original),nnz(x_ref), nnz(x) );\nfprintf('   error vs. original, rel. l2 norm:\\n\\t%.2e\\t%.2e\\t%.2e\\n',...\n    0, er_signal(x_ref), er_signal(x) );\ner_signal1 = @(x) norm(x-x_original,Inf);\nfprintf('   error vs. original, lInf norm:\\n\\t%.2e\\t%.2e\\t%.2e\\n',...\n    0, er_signal1(x_ref), er_signal1(x) );\nfprintf('   time to solve:\\n\\tN/A\\t\\t%.1fs\\t\\t%.1fs\\n',...\n    time_IPM, time_TFOCS );\n\n% Check that we are within allowable bounds\nif er(x) < .01\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sBPDN_withContinuation.m",
    "content": "%{\n    Tests basis pursuit de-noising\n\n    min_x ||x||_1\ns.t.\n    || A(x) - b || <= eps\n\nThe solvers solve a regularized version, using\n    ||x||_1 + mu/2*||x-x_0||_2^2\n\nin this file, we will use continuation to eliminate\nthe effect of the \"mu\" term.\n\nsee also test_sBPDN.m\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','basispursuit_problem1_noisy');\nrandn('state',34324);\nrand('state',34324);\nN = 1024;\nM = round(N/2);\nK = round(M/5);\nA = randn(M,N);\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n    x = zeros(N,1);\n    T = randsample(N,K);\n    x(T) = randn(K,1);\n\n    b_original = A*x;\n    snr = 30;  % SNR in dB\n    b   = myAwgn(b_original,snr);\n    EPS = norm(b-b_original);\n    x_original = x;\n    \n    mu = .01*norm(x,Inf);\n    x0 = zeros(N,1);\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize norm(xcvx,1)\n        subject to\n            norm(A*xcvx - b ) <= EPS\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx;\n    obj_ref = norm(x_ref,1);\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'EPS','b_original','obj_ref','x0','time_IPM','snr');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n\n[M,N]           = size(A);\nK               = nnz(x_original);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, K );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from IPM)\nopts = [];\nopts.restart    = 500;\nopts.errFcn     = { @(f,dual,primal) er(primal) };\nopts.maxIts     = 1000;\nopts.countOps   = true;\n% To see more possible options, run the command \"tfocs\"\n\nz0  = [];   % we don't have a good guess for the dual\ntic;\n\n\n% -- with continuation:\nopts.continuation   = true;\n\n% when using continuation, a good stopping criteria is this one:\nopts.stopCrit   = 4;  opts.tol  = 1e-6;\nopts.printStopcrit = 1; % this will display the value used in the stopping criteria calculation\n[ x, out, optsOut ] = solver_sBPDN( A, b, EPS, mu, x0, z0, opts);\n\n\n\ntime_TFOCS = toc;\n\nfprintf('Solution has %d nonzeros.  Error vs. IPM solution is %.2e\\n',...\n    nnz(x), er(x) );\n% Test we are within bounds:\nif out.err(end,1) < 1e-3\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% Advanced options for continuation\n% To see all possible options, run \"continuation\" with no inputs:\ncontinuation()\n\ncontinuationOptions     = [];\n\n% for example, we can make sure that we only take at most 200\n%   iterations (except for the very last outer iteration):\ncontinuationOptions.innerMaxIts     = 200;\n\n% and instead of just 3 iterations (the default), let's do 5 iterations:\ncontinuationOptions.maxIts          = 5;\n\n% and decrease the tolerance of the outer loop\ncontinuationOptions.tol             = 1e-5;\n\nopts.printEvery                     = Inf;  % to suppress output from inner iterations\ncontinuationOptions.verbose         = true; % \"true\" by default\n\n% if you want mu to decrease:\ncontinuationOptions.muDecrement     = 0.8;\n\n[ x, out, optsOut ] = solver_sBPDN( A, b, EPS, mu, x0, z0, opts, continuationOptions);\n\n% Test we are within bounds:\nif out.err(end,1) < 1e-3\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sBP_nonnegative.m",
    "content": "%{\n    Tests non-negative basis pursuit\n\n    min_x ||X||_1\ns.t.\n    A(X) == b and x >= 0\n\nThe solvers solve a regularized version, using\n||x||_1 + mu/2*||x-x_0||_2^2\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','basispursuit_problem1_smoothed_noiseless_nonnegative');\nrandn('state',34324);\nrand('state',34324);\n\nN = 1024;\nM = round(N/2);\nK = round(M/2);\n\nA = randn(M,N);\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n\n    x = zeros(N,1);\n    T = randsample(N,K);\n    x(T) = .1+rand(K,1);\n\n    b = A*x;\n    EPS = 0;\n    b_original = b;\n    x_original = x;\n    \n    mu = .01*norm(x,Inf);\n    x0 = zeros(N,1);\n    % Note: with equality constraints, this is an LP, so for mu small\n    % enough (but > 0), we have exact relaxation.\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize norm(xcvx,1) + mu/2*sum_square(xcvx-x0)\n        subject to\n            A*xcvx == b\n            xcvx >= 0\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx;     \n    obj_ref = norm(x_ref,1) + mu/2*sum_square(x_ref-x0);\n    \n    % get reference via CVX, this time, without the x >= 0 constraing\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize norm(xcvx,1) + mu/2*sum_square(xcvx-x0)\n        subject to\n            A*xcvx == b\n    cvx_end\n    time_IPM = toc;\n    x_pureBP = xcvx;\n    obj_ref = norm(x_ref,1) + mu/2*sum_square(x_ref-x0);\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'EPS','b_original','obj_ref','x0','time_IPM','x_pureBP');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n\n[M,N]           = size(A);\nK               = nnz(x_original);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\nnorm_x_pureBP   = norm(x_pureBP);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_pureBP       = @(x) norm(x-x_pureBP)/norm_x_pureBP;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, K );\nfprintf('\\tl1-norm solution and original signal differ by:\\t\\t\\t\\t%.2e (mu = %.2e)\\n', ...\n    norm(x_pureBP - x_original)/norm(x_original),mu );\nfprintf('\\tl1-norm solution, with x >=0 constraint, and original signal differ by:\\t%.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from IPM)\n% er              = er_signal; % error from original signal\n% er              = er_pureBP; % the \"pureBP\" solution did not have x>=0\nopts = [];\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f, ...\n                    @(f,dual,primal) nnz(primal) }; \nopts.restart    = 1000;\nz0  = [];   % we don't have a good guess for the dual\ntic;\n\nprojectionF     = {proj_Rn; proj_Rplus };\n\nscaleA = 1/norm(A);\n[x,out,optsOut] = tfocs_SCD( prox_l1, { linop_compose(A,scaleA), -b*scaleA; 1,0 }, projectionF, mu, x0, z0, opts );\n\n\n\ntime_TFOCS = toc;\n\nfprintf('for (original signal, IPM solution, TFOCS solution),\\n   NNZ:\\n\\t%d\\t\\t%d\\t\\t%d\\n',...\n    nnz(x_original),nnz(x_ref), nnz(x) );\nfprintf('   error vs. original, rel. l2 norm:\\n\\t%.2e\\t%.2e\\t%.2e\\n',...\n    0, er_signal(x_ref), er_signal(x) );\ner_signal1 = @(x) norm(x-x_original,Inf);\nfprintf('   error vs. original, lInf norm:\\n\\t%.2e\\t%.2e\\t%.2e\\n',...\n    0, er_signal1(x_ref), er_signal1(x) );\nfprintf('   time to solve:\\n\\tN/A\\t\\t%.1fs\\t\\t%.1fs\\n',...\n    time_IPM, time_TFOCS );\n\n% Test we are within bounds:\nif out.err(end,1) < 1e-6\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% As of version 1.0d, the solver_sBP.m file can handle x >= 0 constraints\n% This version will be more efficient, since it calls a special\n%   l1 + non-negative operator, rather than splitting it up.\n\nopts.nonneg     = true;     % tell it to add the x >= 0 constraint\n[x,out,optsOut]   = solver_sBP( A, b, mu, x0, z0, opts );\n\n% Test we are within bounds:\nif out.err(end,1) < 1e-5\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sDantzig.m",
    "content": "%{\n    Tests the Dantzig Selector\n\n    min_x ||x||_1\ns.t.\n    || D*A'*(A*x - b) || <= delta\n\nThe solvers solve a regularized version, using\n    ||x||_1 + mu/2*||x-x_0||_2^2\n\nsee also test_sBPDN.m\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','dantzig_problem1_smoothed_noisy');\nrandn('state',34324);\nrand('state',34324);\nN = 1024;\nM = round(N/2);\nK = round(M/5);\nA = randn(M,N);\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n\n    normA2 = norm( (A'*A) )^2;\n    x = zeros(N,1);\n    T = randsample(N,K);\n    x(T) = randn(K,1);\n\n\n    b_original = A*x;\n    snr = 30;  % SNR in dB\n    b   = myAwgn(b_original,snr);\n    z   = b - b_original;\n    sigma = std(z);     % estimate of standard deviation\n\n    % compute D and delta so that original signal is\n    %   feasible with probability 1 - alpha\n    alpha   = 0.1;\n    Anorms  = sqrt(sum(A.^2))';\n    nTrials = min(4*N,400);\n    w       = randn(M,nTrials);\n    supAtz  = sort(max( (A'*w) ./Anorms(:,ones(1,nTrials))));\n    thresh  = supAtz(round(nTrials*(1-alpha)));  % empirical\n    d       = thresh*sigma*Anorms;  % a vector, for Dantzig solvers\n    if all(d > 1e-10)\n        delta   = mean(d);\n        D       = delta./d; % watch out for division by 0\n    else\n        D       = 1;\n        delta   = 0;\n    end\n    normA2 = norm( diag(D)*(A'*A) )^2;\n%     clear d alpha w thresh nTrials\n\n    x_original = x;\n    \n    mu = .05*norm(x,Inf);\n    x0 = zeros(N,1);\n    % Note:this is an LP, so for mu small\n    % enough (but > 0), we have exact relaxation.\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(N,1)\n        minimize norm(xcvx,1) + mu/2*sum_square(xcvx-x0)\n        subject to\n            norm(D.*(A'*(A*xcvx - b)),Inf ) <= delta\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx;\n    obj_ref = norm(x_ref,1) + mu/2*sum_square(x_ref-x0);\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'delta','D','b_original','obj_ref','x0','time_IPM','snr');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\n\n[M,N]           = size(A);\nK               = nnz(x_original);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, K );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from IPM)\nopts = [];\nopts.restart    = 500;\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f  }; \nopts.maxIts     = 2000;\nz0  = [];   % we don't have a good guess for the dual\ntic;\n[ x, out, optsOut ] = solver_sDantzig( {A,D}, b, delta, mu, x0, z0, opts );\ntime_TFOCS = toc;\n\nfprintf('Solution has %d nonzeros.  Error vs. IPM solution is %.2e\\n',...\n    nnz(x), er(x) );\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-4\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% plot error\nsemilogy( out.err(:,1) )\nhold all\n\n%% Call the solver with W = I\n%   This is not usually recommended, since it is not necessary\n%   and creates extra dual variables\nopts.restart    = 2000;\nW = linop_scale(1); % identity\n[ x, out, optsOut ] = solver_sDantzig_W( {A,D}, W, b, delta, mu, x0, z0, opts );\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-1\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n%% close all figures\nclose all\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sDantzig_3methods.m",
    "content": "%{\n    Tests the Dantzig Selector\n\n    min_x ||x||_1\ns.t.\n    || D*A'*(A*x - b) || <= delta\n\nThe solvers solve a regularized version, using\n    ||x||_1 + mu/2*||x-x_0||_2^2\n\nsee also test_sDantzig.m\n\nThis demo shows three formulations of the Dantzig selector\nInstead of calling a pre-built solver, we show how to call\ntfocs_SCD directly.\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\n\n% Try to load the problem from disk\nmu = 0;\nfileName = fullfile('reference_solutions','dantzig_problem1_smoothed_noisy');\nrandn('state',34324);\nrand('state',34324);\nN = 1024;\nM = round(N/2);\nK = round(M/5);\nA = randn(M,N);\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    disp('Please run test_sDantzig.m to setup the file');\nend\n\n\n[M,N]           = size(A);\nK               = nnz(x_original);\nnorm_x_ref      = norm(x_ref);\nnorm_x_orig     = norm(x_original);\ner_ref          = @(x) norm(x-x_ref)/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*x-b)/norm(b);  % change if b is noisy\n\nfprintf('\\tA is %d x %d, original signal has %d nonzeros\\n', M, N, K );\nfprintf('\\tl1-norm solution and original signal differ by %.2e (mu = %.2e)\\n', ...\n    norm(x_ref - x_original)/norm(x_original),mu );\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from IPM)\nopts = [];\nopts.restart    = 500;\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f  }; \nopts.maxIts     = 1000;\nopts.printEvery = 100;\nz0  = [];   % we don't have a good guess for the dual\n\n\n%% Method 1: use the epigraph of the l_infinity norm as the cone\n% Note: this is equivalent to calling:\n% [ x, out, optsOut ] = solver_sDantzig( {A,D}, b, delta, mu, x0, z0, opts );\n\nDAtb = D.*(A'*b);\nDD = @(x) D.*(x);\nobjectiveF = prox_l1;\naffineF     = {linop_matrix(diag(D)*(A'*A)), -DAtb };\ndualproxF  = prox_l1( delta );\n[ x, out, opts ] = tfocs_SCD( objectiveF, affineF, dualproxF, mu, x0, z0, opts );\nx1 = x;\nout1 = out;\n\nfprintf('Solution has %d nonzeros.  Error vs. IPM solution is %.2e\\n',...\n    nnz(x), er(x) );\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-3\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% Method 2: use the LP formulation\n% Instead of the constraint ||Ax-b||_infty <= delta\n% (where \"A\" is really DA'A),\n% think of it as\n% -(Ax-b) + delta >= 0\n%  (Ax-b) + delta >= 0\n\nobjectiveF = prox_l1;\naffineF     = {linop_matrix(-diag(D)*(A'*A)),  DAtb + delta;...\n               linop_matrix( diag(D)*(A'*A)), -DAtb + delta; };\n\ndualproxF  = { proj_Rplus; proj_Rplus };\n[ x, out, opts ] = tfocs_SCD( objectiveF, affineF, dualproxF, mu, x0, z0, opts );\nx2 = x;\nout2 = out;\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-3\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% Method 3: put objective into constraint\n% This is the trick we do with solver_sDantzig_W, to deal with ||Wx||_1\n% Instead of minimizing ||x||_1, we minimize t,\n%   with the constraint that ||x||_1 <= t\n% This version has some scaling considerations -- if we \n% are careful about scaling, the dual problem will be solved much faster.\n\n% Note: we still have to deal with the original constraints.  We\n% can use either method 1 or method 2 above.  Here, we'll use\n% method 1.\n\n\nobjectiveF  = [];    % tfocs_SCD recognizes this special objective\nnormA2      = norm( diag(D)*A'*A )^2;\nscale       = 1/sqrt(normA2);\naffineF     = {linop_matrix(diag(D)*(A'*A)), -DAtb; linop_scale(1/scale), 0 };\ndualproxF   = { prox_l1(delta); proj_linf(scale) };\n[ x, out, opts ] = tfocs_SCD( objectiveF, affineF, dualproxF, mu, x0, z0, opts );\nx3 = x;\nout3 = out;\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-2\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n%% plot\nfigure;\nsemilogy( out1.err(:,1) );\nhold all\nsemilogy( out2.err(:,1) );\nsemilogy( out3.err(:,1) );\nlegend('Method 1 (epigraph cone)','Method 2 (LP)','Method 3 (W=I)' );\n\n%% close all plots\nclose all\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information."
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_sTV.m",
    "content": "%{\n    Tests total-variation problem\n\n    min_x ||x||_TV\ns.t.\n    || A(x) - b || <= eps\n\nThe solvers solve a regularized version\n\nsee also test_sBP.m and test_sBPDN_W.m\n\nrequires the image processing toolbox for this demo\n(but the TFOCS solver does not rely on this toolbox)\n\nSee also the TV examples in examples/largescale\n\n%}\n\n% Before running this, please add the TFOCS base directory to your path\n\nmyAwgn = @(x,snr) x + ...\n        10^( (10*log10(sum(abs(x(:)).^2)/length(x(:))) - snr)/20 )*randn(size(x));\n\n% Try to load the problem from disk\nfileName = fullfile('reference_solutions','tv_problem1_smoothed_noisy');\nrandn('state',245);\nrand('state',245);\nn = 32;\nn1 = n;\nn2 = n-1;           % testing the code with non-square signals\nN = n1*n2;\nM = round(N/2);\nA = randn(M,N);\nif exist([fileName,'.mat'],'file')\n    load(fileName);\n    fprintf('Loaded problem from %s\\n', fileName );\nelse\n    \n    % Generate a new problem\n\n    n = max(n1,n2);\n    x = phantom(n); \n    x = x(1:n1,1:n2);\n    x_original = x;\n    \n    mat = @(x) reshape(x,n1,n2);\n    vec = @(x) x(:);\n  \n\n    b_original = A*vec(x_original);\n    snr = 40;  % SNR in dB\n    b   = myAwgn(b_original,snr);\n    EPS = norm(b-b_original);\n    \n    tv = linop_TV( [n1,n2], [], 'cvx' );\n    \n    mu = .005*norm( tv(x_original) ,Inf);\n    x0 = zeros(n1,n2);\n\n    % get reference via CVX\n    tic\n    cvx_begin\n        cvx_precision best\n        variable xcvx(n1,n2)\n        minimize tv(xcvx) + mu/2*sum_square(vec(xcvx)-vec(x0) )\n        subject to\n            norm(A*vec(xcvx) - b ) <= EPS\n    cvx_end\n    time_IPM = toc;\n    x_ref = xcvx;\n    obj_ref = tv(x_ref) + mu/2*sum_square(vec(x_ref)-vec(x0) );\n    \n    save(fileName,'x_ref','b','x_original','mu',...\n        'EPS','b_original','obj_ref','x0','time_IPM','snr');\n    fprintf('Saved data to file %s\\n', fileName);\n    \nend\n\nimshow( [x_original, x_ref] );\n\n[M,N]           = size(A);\n[n1,n2]         = size(x_original);\nnorm_x_ref      = norm(x_ref,'fro');\nnorm_x_orig     = norm(x_original,'fro');\ner_ref          = @(x) norm(vec(x)-vec(x_ref))/norm_x_ref;\ner_signal       = @(x) norm(x-x_original)/norm_x_orig;\nresid           = @(x) norm(A*vec(x)-b)/norm(b);  % change if b is noisy\n\n\n%% Call the TFOCS solver\ner              = er_ref;  % error with reference solution (from IPM)\nopts = [];\nopts.restart    = 1000;\nopts.errFcn     = { @(f,dual,primal) er(primal), ...\n                    @(f,dual,primal) obj_ref - f  }; \nopts.maxIts     = 1000;\n\nW   = linop_TV( [n1,n2] );\nnormW           = linop_TV( [n1,n2], [], 'norm' );\nopts.normW2     = normW^2;\nz0  = [];   % we don't have a good guess for the dual\ntic;\n[ x, out, optsOut ] = solver_sBPDN_W( A, W, b, EPS, mu, vec(x0), z0, opts );\ntime_TFOCS = toc;\n\nfprintf('Solution has %d nonzeros.  Error vs. IPM solution is %.2e\\n',...\n    nnz(x), er(x) );\n\n% Check that we are within allowable bounds\nif out.err(end,1) < 1e-4\n    disp('Everything is working');\nelse\n    error('Failed the test');\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/examples/smallscale/test_variousSolvers.m",
    "content": "%{\nSolves a simple quadratic problem\n(with optimal solution known in closed-form)\nwith all the various solvers\n\n\nthe quadratic problem is:\n\nmin_x  c'x + x'Px/2, P > 0, hence the optimal solution is x = -inv(Q)*c\n\nOn a simple quadratic example like this, when there is no projection,\nall the solver behave similarly. So this script is more useful for debugging\nto make sure that all solvers are working\n\n%}\n\n%% Make a problem\nN   = 100;\nrandn('state',2334);\nP   = randn(N); P = P*P' + .1*eye(N); % ensure P is symmetric positive definite\nc   = randn(N,1);\n\nx_ref   = -P\\c;\n\n%% Solve with TFOCS\nf   = smooth_quad( P, c );\naffine    = [];\nprojector = [];\nx0        = zeros(N,1);\nopts      = [];\nopts.printEvery     = 500;\nopts.tol  = 1e-8;\nopts.printStopCrit  = true;\nopts.restart    = 350;  % use this since the problem is strongly convex\nopts.errFcn     = @(f,x) norm( x-x_ref)/norm(x_ref);\nopts.maxIts     = 750;\n\n% The 'N83' and 'AT' methods can take advantage when you know\n%   the exact value of the strong convexity parameter\n%   (and the Lipschitz constant).  In this case, do not\n%   use restart. But we won't test this right now, \n%   since it is unusual that you have information\n%   about the strong convexity constant.\n% opts.restart    = Inf;\n% opts.mu         = min(eig(P)); % strong convexity parameter. N83 can make use of this\n% opts.Lexact     = max(eig(P));\n\nsolverList = { 'GRA', 'AT', 'LLM', 'N07', 'N83', 'TS' };\n% solverList = { 'GRA', 'AT', 'N83', 'TS' };\n% solverList = { 'LLM','N07'}; % these take two steps per iteration\n\nfigure(1); clf;\n\nfor k = 1:length( solverList )\n    solver  = solverList{k};\n    opts.alg    = solver;\n    fprintf('\\nSolver: %s\\n\\n', solver );\n    [x,out,optsOut] = tfocs( f, affine, projector, x0, opts );\n    semilogy( out.err );\n    hold all\nend\nlegend( solverList );\n\n\n%% close all figures\nclose all\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information."
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_TV.m",
    "content": "function op = linop_TV( sz, variation, action )\n\n%LINOP_TV   2D Total-Variation (TV) linear operator.\n%    OP = LINOP_TV( SZ ) returns a handle to a TFOCS linear operator that\n%      implements the total variation linear operator on an M x N grid;\n%      that is, to be applied to matrices of size [M,N].\n%      By default, it expects to operate on M*N x 1 vectors\n%      but if SZ = {M,N}, then expects to operate on M x N matrices\n%\n%      N.B. In this form, OP does not calculate the TV norm but rather\n%       a vector of size M*N x 1 such that TV(X) = norm( OP(X,1), 1 ).\n%\n%    TV = LINOP_TV( X ) returns ||X||_TV  if X is bigger than 2 x 2\n%\n%    OP = LINOP_TV( SZ, VARIANT ) \n%       if VARIANT is 'regular' (default),\n%           assumes zeros on the boundary (Dirichlet boundary conditions)\n%       if VARIANT is 'circular',\n%           assumes circularity, so x(:,N+1) - x(:,N)\n%           is calculated by x(:,1) - x(:,N) (and similarly\n%           for row differences) [when SZ={M,N}]\n%\n%    [...] = LINOP_TV(SZ, VARIATION, ACTION )\n%       if ACTION is 'handle', returns a TFOCS function handle (default)\n%       if ACTION is 'cvx', returns a function handle suitable for CVX\n%       if ACTION is 'matrix', returns the explicit TV matrix\n%           (real part corresponds to horizontal differences,\n%            imaginary part correspond to vertical differences)\n%       if ACTION is 'norm', returns an estimate of the norm\n%\n%   TODO: check circular case for non-square domains\n%\n\nerror(nargchk(1,3,nargin));\nif nargin < 2 || isempty(variation), variation = 'regular'; end\nif nargin < 3 || isempty(action), action = 'handle'; end\n\nCALCULATE_TV = false;\nif numel(sz) > 4 \n    CALCULATE_TV = true;\n    X   = sz;\n    sz  = size(X);\nend\n\nif iscell(sz)\n    n1 = sz{1};\n    n2 = sz{2};\nelse\n    n1 = sz(1);\n    n2 = sz(2);\nend\n\n% Setup the Total-Variation operators\nmat = @(x) reshape(x,n1,n2);\n\nif strcmpi(action,'matrix') || strcmpi(action,'cvx')\n    switch lower(variation)\n        case 'regular'\n            e = ones(max(n1,n2),1);\n            e2 = e;\n            e2(n2:end) = 0;\n            J = spdiags([-e2,e], 0:1,n2,n2);\n            I = eye(n1);\n            Dh = kron(J,I);  % horizontal differences, sparse matrix\n            % see also blkdiag\n            \n            e2 = e;\n            e2(n1:end) = 0;\n            J = spdiags([-e2,e], 0:1,n1,n1);\n            I = eye(n2);\n            Dv = kron(I,J);  % vertical differences, sparse matrix\n        case 'circular'\n            e = ones(max(n1,n2),1);\n            e2 = e;\n%             e2(n2:end) = 0;\n            J = spdiags([-e2,e], 0:1,n2,n2);\n            J(end,1) = 1;\n            I = eye(n1);\n            Dh = kron(J,I);  % horizontal differences, sparse matrix\n            % see also blkdiag\n            \n            e = ones(max(n1,n2),1);\n            e2 = e;\n%             e2(n1:end) = 0;\n            J = spdiags([-e2,e], 0:1,n1,n1);\n            J(end,1) = 1;\n            I = eye(n2);\n            Dv = kron(I,J);  % vertical differences, sparse matrix\n    end\n    if strcmpi(action,'matrix')\n        op = Dh + 1i*Dv;\n    else\n        % \"norms\" is a CVX function, but we can over-load it (see sub-function below)\n        op = @(X) sum( norms( [Dh*X(:), Dv*X(:)]', 1 ) );\n    end\n    return;\nend\n\nswitch lower(variation)\n    case 'regular'\n        Dh     = @(X) vec( [diff(X,1,2),  zeros(n1,1)] );\n        diff_h = @(X) [zeros(n1,1),X(:,1:end-1)] - [X(:,1:end-1),zeros(n1,1) ];\n        Dv     = @(X) vec( [diff(X,1,1); zeros(1,n2)] );\n        diff_v = @(X) [zeros(1,n2);X(1:end-1,:)] - [X(1:end-1,:);zeros(1,n2) ];\n        % sometimes diff_v is much slower than diff_h\n        % We can exploit data locality by working with transposes\n        diff_v_t = @(Xt) ([zeros(n2,1),Xt(:,1:end-1)] - [Xt(:,1:end-1),zeros(n2,1)])';\n    case 'circular'\n        % For circular version, 2 x 2 case is special.\n%         error('not yet implemented');\n        Dh     = @(X) vec( [diff(X,1,2),  X(:,1) - X(:,end)] );\n        % diff_h needs to be checked\n        diff_h = @(X) [X(:,end),X(:,1:end-1)] - X;\n        % diff_v needs to be checked\n        Dv     = @(X) vec( [diff(X,1,1); X(1,:) - X(end,:) ] );\n        diff_v = @(X) [X(end,:);X(1:end-1,:)] - X;\n        diff_v_t = @(Xt) ([Xt(:,end),Xt(:,1:end-1)] - Xt)';\n    otherwise\n        error('Bad variation parameter');\nend\nif iscell(sz)\n    Dh_transpose = @(X)      diff_h(mat(X))  ;\n%     Dv_transpose = @(X)      diff_v(mat(X))  ;\n    Dv_transpose = @(X)      diff_v_t(mat(X)')  ; % faster\nelse\n    Dh_transpose = @(X) vec( diff_h(mat(X)) );\n%     Dv_transpose = @(X) vec( diff_v(mat(X)) );\n    Dv_transpose = @(X) vec( diff_v_t(mat(X)') ); % faster\nend\n\nTV  = @(x) ( Dh(mat(x)) + 1i*Dv(mat(x)) );     % real to complex\nTVt = @(z) ( Dh_transpose(real(z)) + Dv_transpose(imag(z)) );\n\nif CALCULATE_TV\n    op = norm( TV(X), 1 );\n    return;\nend\n\nif strcmpi(action,'norm')\n    % to compute max eigenvalue, I use a vector\n    % that is very likely to be the max eigenvector:\n    %  matrix with every entry alternating -1 and 1\n    even = @(n) ~( n - 2*round(n/2) );  % returns 1 if even, 0 if odd\n    Y = zeros( n1 + even(n1), n2 + even(n2) );\n    nn = numel(Y);\n    Y(:) = (-1).^(1:nn);\n    Y = Y(1:n1,1:n2);\n    op = norm( TV(Y) )/norm(Y(:));\n    \n    % Nearly equivalent to:\n    % norm(full( [real(tv); imag(tv)] ) ) \n    % where tv is the matrix form\nelse\n    if iscell(sz)\n        szW = { [n1,n2], [n1*n2,1] };\n    else\n        szW = sz(1)*sz(2); % n1 * n2\n        szW = [szW,szW];\n    end\n    op = @(x,mode)linop_tv_r2c(szW,TV,TVt,x,mode);\nend\n\nfunction y = linop_tv_r2c( sz, TV, TVt, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = TV( realcheck( x ) );\n    case 2, y = realcheck( TVt( x ) );\nend\n\nfunction y = realcheck( y )\nif ~isreal( y ), \n    error( 'Unexpected complex value in linear operation.' );\nend\n\n\nfunction y = norms( x, p, dim )\nsx = size(x);\nif nargin < 3, dim = 1; end\nif nargin < 2 || isempty(p), p = 2; end\nif isempty(x) || dim > length(sx) || sx(dim)==1\n    p = 1;\nend\nswitch p,\n    case 1,\n        y = sum( abs( x ), dim );\n    case 2,\n        y = sqrt( sum( x .* conj( x ), dim ) );\n    case Inf,\n        y = max( abs( x ), [], dim );\n    case {'Inf','inf'}\n        y = max( abs( x ), [], dim );\n    otherwise,\n        y = sum( abs( x ) .^ p, dim ) .^ ( 1 / p );\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_TV3D.m",
    "content": "function op = linop_TV3D( sz, variation, action )\r\n\r\n%LINOP_TV3D   3D Total-Variation (TV) linear operator.\r\n%    OP = LINOP_TV3D( SZ ) returns a handle to a TFOCS linear operator that\r\n%      implements the total variation linear operator on an M x N x P grid;\r\n%      that is, to be applied to volume stacks of size [M,N,P].\r\n%      By default, it expects to operate on M*N*P x 1 vectors\r\n%      but if SZ = {M,N,P}, then expects to operate on M x N x P matrices\r\n%\r\n%    TV = LINOP_TV3D( X ) returns ||X||_TV  if X is bigger than 2 x 2 x 2\r\n%\r\n%    OP = LINOP_TV3D( SZ, VARIANT )\r\n%       if VARIANT is 'regular' (default),\r\n%               ... TODO\r\n%       if VARIANT is 'circular',\r\n%               ... TODO\r\n%\r\n%    [...] = LINOP_TV3D(SZ, VARIATION, ACTION )\r\n%       if ACTION is 'handle', returns a TFOCS function handle (default)\r\n%       if ACTION is 'cvx', returns a function handle suitable for CVX\r\n%       if ACTION is 'matrix', returns the explicit TV matrix\r\n%           (real part corresponds to horizontal differences,\r\n%            imaginary part correspond to vertical differences)\r\n%       if ACTION is 'norm', returns an estimate of the norm\r\n%\r\n%   Contributed by  Mahdi Hosseini (mahdi.hosseini@mail.utoronto.ca)\r\n%   Has not been extensively tested\r\n\r\nerror(nargchk(1,3,nargin));\r\nif nargin < 2 || isempty(variation), variation = 'regular'; end\r\nif nargin < 3 || isempty(action), action = 'handle'; end\r\n\r\nCALCULATE_TV = false;\r\nif numel(sz) > 6\r\n    CALCULATE_TV = true;\r\n    X   = sz;\r\n    sz  = size(X);\r\nend\r\nnDim = numel(sz);\r\n\r\nif iscell(sz)\r\n    n1 = sz{1};\r\n    n2 = sz{2};\r\n    n3 = sz{3};\r\nelse\r\n    n1 = sz(1);\r\n    n2 = sz(2);\r\n    n3 = sz(3);\r\nend\r\n\r\n% Setup the Total-Variation operators\r\nmat = @(x) reshape(x,n1,n2,n3);\r\n\r\nif strcmpi(action,'matrix') || strcmpi(action,'cvx')\r\n    I1 = eye(n1);\r\n    I2 = eye(n2);\r\n    I3 = eye(n3);\r\n    switch lower(variation)\r\n        case 'regular'\r\n            e = ones(max([n1,n2,n3]),1);\r\n            e2 = e;\r\n            e2(n2:end) = 0;\r\n            J = spdiags([-e2,e], 0:1,n2,n2);\r\n            Dh = kron(I3,kron(J,I1));  % horizontal differences, sparse matrix\r\n            % see also blkdiag\r\n            \r\n            e2 = e;\r\n            e2(n1:end) = 0;\r\n            J = spdiags([-e2,e], 0:1,n1,n1);\r\n            Dv = kron(I3,kron(I2,J));  % vertical differences, sparse matrix\r\n            \r\n            e2 = e;\r\n            e2(n3:end) = 0;\r\n            J = spdiags([-e2,e], 0:1,n3,n3);\r\n            Dd = kron(J,kron(I2,I1));  % Depth differences, sparse matrix\r\n        case 'circular'\r\n            e = ones(max([n1,n2,n3]),1);\r\n            e2 = e;\r\n            %             e2(n2:end) = 0;\r\n            J = spdiags([-e2,e], 0:1,n2,n2);\r\n            J(end,1) = 1;\r\n            Dh = kron(I3, kron(J,I1));  % horizontal differences, sparse matrix\r\n            % see also blkdiag\r\n            \r\n            e2 = e;\r\n            %             e2(n1:end) = 0;\r\n            J = spdiags([-e2,e], 0:1,n1,n1);\r\n            J(end,1) = 1;\r\n            Dv = kron(I3, kron(I2,J));  % vertical differences, sparse matrix\r\n            \r\n            e2 = e;\r\n            %             e2(n1:end) = 0;\r\n            J = spdiags([-e2,e], 0:1,n3,n3);\r\n            J(end,1) = 1;\r\n            Dd = kron(J, kron(I2,I1));  % vertical differences, sparse matrix\r\n    end\r\n    if strcmpi(action,'matrix')\r\n        op = [Dh;Dv;Dd];\r\n    else\r\n        % \"norms\" is a CVX function\r\n        op = @(X) sum( norms( [Dh*X(:), Dv*X(:), Dd*X(:)]' ) );\r\n    end\r\n    return;\r\nend\r\n\r\nswitch lower(variation)\r\n    case 'regular'\r\n        Dh     = @(X) vec( [diff(X,1,2), zeros(n1,1,n3)] );\r\n        Dv     = @(X) vec( [diff(X,1,1); zeros(1,n2,n3)] );\r\n        Dd     = @(X) [vec(diff(X,1,3)); vec(zeros(n1,n2,1))];\r\n        \r\n        diff_h = @(X) [zeros(n1,1,n3),X(:,1:end-1,:)] - ...\r\n            [X(:,1:end-1,:),zeros(n1,1,n3)];\r\n        diff_v = @(X) [zeros(1,n2,n3);X(1:end-1,:,:)] - ...\r\n            [X(1:end-1,:,:);zeros(1,n2,n3)];\r\n        diff_d = @(X) mat([vec(zeros(n1,n2,1));vec(X(:,:,1:end-1))] - ...\r\n            [vec(X(:,:,1:end-1));vec(zeros(n1,n2,1))]);\r\n    case 'circular'\r\n        % For circular version, 2 x 2 case is special.\r\n        %         error('not yet implemented');\r\n        Dh     = @(X) vec( [diff(X,1,2), X(:,1,:) - X(:,end,:)] );\r\n        Dv     = @(X) vec( [diff(X,1,1); X(1,:,:) - X(end,:,:)] );\r\n        Dd     = @(X) [vec(diff(X,1,3)); vec(X(:,:,1) - X(:,:,end))];\r\n        % diff_h needs to be checked\r\n        diff_h = @(X) [X(:,end,:),X(:,1:end-1,:)] - X;\r\n        % diff_v needs to be checked\r\n        diff_v = @(X) [X(end,:,:);X(1:end-1,:,:)] - X;\r\n        % diff_d needs to be checked\r\n        diff_d = @(X) mat([vec(X(:,:,end));vec(X(:,:,1:end-1))]) - X;\r\n    otherwise\r\n        error('Bad variation parameter');\r\nend\r\nif iscell(sz)\r\n    Dh_transpose = @(X)      diff_h(mat(X))  ;\r\n    Dv_transpose = @(X)      diff_v(mat(X))  ;\r\n    Dd_transpose = @(X)      diff_d(mat(X))  ;\r\nelse\r\n    Dh_transpose = @(X) vec( diff_h(mat(X)) );\r\n    Dv_transpose = @(X) vec( diff_v(mat(X)) );\r\n    Dd_transpose = @(X) vec( diff_d(mat(X)) );\r\nend\r\n\r\n%%  TV & TVt Definitions\r\nTV  = @(x) [Dh(mat(x)); Dv(mat(x)); Dd(mat(x))];\r\n\r\nfirstThird = @(x) x(1: n1*n2*n3);\r\nsecondThird= @(x) x(n1*n2*n3+1: 2*n1*n2*n3);\r\nthirdThird= @(x) x(2*n1*n2*n3+1: 3*n1*n2*n3);\r\nTVt = @(z) ( Dh_transpose(firstThird(z)) +...\r\n    Dv_transpose(secondThird(z)) +...\r\n    Dd_transpose(thirdThird(z)));\r\n\r\n%%\r\nif CALCULATE_TV\r\n    op = norm( TV(X), 1 );\r\n    return;\r\nend\r\n\r\nif strcmpi(action,'norm')\r\n    % to compute max eigenvalue, I use a vector\r\n    % that is very likely to be the max eigenvector:\r\n    %  matrix with every entry alternating -1 and 1\r\n    even = @(n) ~( n - 2*round(n/2) );  % returns 1 if even, 0 if odd\r\n    Y = zeros( n1 + even(n1), n2 + even(n2), n3 + even(n3) );\r\n    nn = numel(Y);\r\n    Y(:) = (-1).^(1:nn);\r\n    Y = Y(1:n1,1:n2,1:n3);\r\n    op = norm( TV(Y) )/norm(Y(:));\r\n    \r\n    % Nearly equivalent to:\r\n    % norm(full( [real(tv); imag(tv)] ) )\r\n    % where tv is the matrix form\r\nelse\r\n    if iscell(sz)\r\n        szW = { [n1,n2,n3], [n1*n2*n3,1] };\r\n    else\r\n        szW = prod(sz); % n1 * n2\r\n        szW = [nDim*szW, nDim*szW];\r\n    end\r\n    op = @(x,mode)linop_tv_r2c(szW,TV,TVt,x,mode);\r\nend\r\n\r\nfunction y = linop_tv_r2c( sz, TV, TVt, x, mode )\r\nswitch mode,\r\n    case 0, y = sz;\r\n    case 1, y = TV( realcheck( x ) );\r\n    case 2, y = realcheck( TVt( x ) );\r\nend\r\n\r\nfunction y = realcheck( y )\r\nif ~isreal( y ),\r\n    error( 'Unexpected complex value in linear operation.' );\r\nend\r\n\r\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\r\n% Copyright 2013 California Institute of Technology and CVX Research.\r\n% See the file LICENSE for full license information.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_adjoint.m",
    "content": "function op = linop_adjoint( A )\n%LINOP_ADJOINT Computes the adjoint operator of a TFOCS linear operator\n%op = LINOP_ADJOINT( A )\n%    Returns a function handle to a linear operator that is the adjoint of\n%    the operator supplied.\n\nop = @(y,mode)linop_adjoint_impl( A, y, mode );\n\nfunction y = linop_adjoint_impl( A, x, mode )\nswitch mode,\n    case 0,\n        y = A(x,0);\n        y([1,2]) = y([2,1]);\n    case 1,\n        y = A(x,2);\n    case 2,\n        y = A(x,1);\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_compose.m",
    "content": "function op = linop_compose( varargin )\n%LINOP_COMPOSE Composes two TFOCS linear operators\n%OP = LINOP_COMPOSE( OP1, OP2, ..., OPN )\n%    Constructs a TFOCS-compatible linear operator from the composition of\n%    two or more linear operators and/or matrices. That is,\n%       OP(x,1) = OP1(OP2(...(OPN(x,1),...,1),1)\n%       OP(x,2) = OPN(...(OP2(OP1(x,2),2)...,2)\n%    If matrices are supplied, they must be real; to include complex\n%    matrices, convert them first to linear operators using LINOP_MATRIX.\n\nif nargin == 0,\n    error( 'Not enough input arguments.' );\nend\nsz = { [], [] };\nfor k = 1 : nargin,\n    tL = varargin{k};\n    if isempty(tL) || ~isa(tL,'function_handle') && ~isnumeric(tL) || ndims(tL) > 2,\n        error( 'Arguments must be linear operators, scalars, or matrices.' );\n    elseif isnumeric(tL),\n        if ~isreal(tL),\n            error( 'S or scalar arguments must be real.' );\n        elseif numel(tL) == 1,\n            tL = linop_scale( tL );\n        else\n            tL = linop_matrix( tL );\n        end\n        varargin{k} = tL;\n    end\n    try\n        tsz = tL([],0);\n    catch\n        error( 'Arguments must be linear operators, scalars, or matrices.' );\n    end\n    if isempty(tsz)     % i.e. output of linop_identity is []\n        tsz = { [], [] };\n    end\n    if isnumeric(tsz),\n        tsz = { [tsz(2),1], [tsz(1),1] };\n    end\n    \n    % convert [n1;n2] to [n1,n2] if necessary:\n    for kk = 1:2\n        %if iscolumn( tsz{kk} )\n            %tsz{kk} = tsz{kk}.';\n        %end\n        tsz{kk} = tsz{kk}(:).';\n    end\n    \n    if ~isempty(sz{1}) && ~isempty(tsz{2}) && ~isequal(tsz{2},sz{1}),\n        for kk = 1:min( numel(tsz{2}), numel( sz{1} ) )\n            fprintf('Found incompatible sizes: %d ~= %d\\n', tsz{2}(kk), sz{1}(kk) );\n        end\n        error( 'Incompatible dimensions in linear operator composition.' );\n    end\n    if ~isempty(tsz{1}),\n        sz{1} = tsz{1};\n    end\n    if isempty(sz{2}),\n        sz{2} = tsz{2};\n    end\nend\n% Explanation of above code:\n% suppose have three inputs, opA, opB, opC; with sizes szA, szB, szC\n%   where opA: szA{1} --> szA{2}\n%   so we need szC{2} == szB{1} and szB{2} = szA{1}\n%\n% so  sz{2} = szA{2}\n% and sz{1} = szC{1}\n\nif nargin == 1,\n    op = varargin{1};\nelse\n    op = @(x,mode)linop_compose_impl( varargin, sz, x, mode );\nend\n\nfunction y = linop_compose_impl( ops, sz, y, mode )\nswitch mode,\n    case 0,\n        y = sz;\n    case 1,\n        for k = numel(ops) : -1 : 1,\n            y = ops{k}( y, 1 );\n        end\n    case 2,\n        for k = 1 : numel(ops),\n            y = ops{k}( y, 2 );\n        end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_dot.m",
    "content": "function op = linop_dot( A, adj )\n%LINOP_DOT  Linear operator formed from a dot product.\n%    OP = LINOP_DOT( A ) returns a handle to a TFOCS linear operator \n%    whose forward operation is OP(X) = TFOCS_DOT( A, X ).\n%    OP = LINOP_DOT( A, 1 ) returns the adjoint of that operator.\n\nswitch class( A ),\n    case 'double',\n        sz = { size(A), [1,1] };\n    case 'cell',\n        A = tfocs_tuple(A);\n        sz = { tfocs_size(A), [1,1] };\n    case 'tfocs_tuple',\n        sz = { tfocs_size(A), [1,1] };\n    otherwise,\n        error( 'First input must be a matrix or cell array of matrices.' );\nend\nif nargin == 2 && adj,\n    sz = { sz{2}, sz{1} };\n    op = @(x,mode)linop_dot_adjoint( sz, A, x, mode ); \nelse\n    op = @(x,mode)linop_dot_forward( sz, A, x, mode ); \nend\n\nfunction y = linop_dot_forward( sz, A, x, mode )\nswitch mode,\n    case 0, \n        y = sz;\n    case 1, \n        y = tfocs_dot( A, x );\n    case 2, \n        if ~isreal(x), error( 'Unexpected complex input.' ); end\n        y = A * x;\nend\n\nfunction y = linop_dot_adjoint( sz, A, x, mode )\nswitch mode,\n    case 0, \n        y = sz;\n    case 1, \n        if ~isreal(x), error( 'Unexpected complex input.' ); end\n        y = A * x;\n    case 2, \n        y = tfocs_dot( A, x );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_explicit.m",
    "content": "function A = linop_explicit( op )\n%LINOP_EXPLICIT Outputs the explicit matrix representation\n%   of a (implicitly defined) linear operator.\n%   Useful for checking correctness of code.\n% A = LINOP_EXPLICIT( OP ) \n%   returns the matrix A such that A*X = OP(X)\n\n% Introduced June 2016\n\nif nargin == 0,\n    error( 'Not enough input arguments.' );\nend\nsz = op([],0);\nif isnumeric(sz),\n    sz = { [sz(2),1], [sz(1),1] };\nend\n% convert [n1;n2] to [n1,n2] if necessary:\nfor kk = 1:2\n    sz{kk} = sz{kk}(:).';\nend\n% If inputs and outputs are not vectors, then we cannot represent\n%   with matrix multiplication\nif sz{1}(2) ~= 1 || sz{2}(2) ~= 1\n    error('Cannot represent this operator as matrix since input/output is not a vector');\nend\nm   = sz{2}(1);\nn   = sz{1}(1);\ne   = zeros(n,1);\nA   = zeros(m,n);\nfor i = 1:n\n    e(i) = 1;\n    A(:,i)  = op( e, 1 );\n    e(i) = 0;\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_fft.m",
    "content": "function op = linop_fft( N, bigN, cmode, width )\n%LINOP_FFT Fast Fourier transform linear operator.\n% OP = LINOP_FFT( N )\n%   returns a function handle that computes the 1D FFT. \n%   If given a matrix, it operates on each column separately (i.e. it \n%   does NOT automatically switch to a 2D FFT).\n%\n% By default, it assumes the input the FFT is real, and the output\n%   is therefore complex and conjugate-symmetric\n%\n% OP = LINOP_FFT( N, M )\n%   will zero-pad the input so that it is size M. Currently, the code\n%   requires M > N, which is typical in applications.\n%   The forward linear operator takes a vector of dimension N and returns a\n%   vector of dimension M; the adjoint takes a M-vector and returns a N-vector.\n%   By default, M = N.\n%\n% OP = LINOP_FFT( N, M, CMODE )\n%   specifies the complex mode of the linear operator. The choices are:\n%       'r2c' (default) : real input and complex (conjugate-symmetric) output\n%       'c2c'           : complex input and outpuyt\n%       'r2r'           : real input and real output. The real output\n%   retains the same number of degrees of freedom because it exploits\n%   the redudancy in the conjugate-symmetry of the complex output of the fft.\n%\n% OP = LINOP_FFT( N, M, CMODE, WIDTH )\n%   specifies that the domain is the space of N x WIDTH matrices\n%   (and the range is M x WIDTH ).\n%\n% new in TFOCS v1.3\n\n% Wed, Jan 4 2011\n\nerror(nargchk(1,4,nargin));\n\n% the naming convention \"bigN\" refers to the fact that we usually\n%   will pad the input with zeros to take an oversampled FFT.\n%   In this case, \"bigN\" is the size of the zero-padded input,\n%   and hence also the size of the output.\nif nargin < 2 || isempty(bigN), bigN = N; end\nif bigN < N, error('cannot yet handle bigN < N, but there is no inherent limitiation'); end\nif nargin < 3 || isempty(cmode), \n    cmode = 'r2c';\n    warning('TFOCS:FFTdefaultMode','In linop_fft, using default ''r2c'' mode for fft; this will take real-part of input only!');\nend\nif nargin < 4 || isempty(width), width = 1; end\nsz = { [N,width], [bigN,width] };\n\n% allow normalization to make it orthogonal? To do so, divide forward mode by sqrt(bigN)\n\nswitch lower(cmode)\n    case 'c2c'\n        op = @(x,mode)linop_fft_c2c( sz, N, bigN, x, mode );\n    case 'r2c'\n        op = @(x,mode)linop_fft_r2c( sz, N, bigN, x, mode );\n    case 'r2r'\n        n2  = bigN/2;\n        even    = (n2 == round(n2) );   % find if n is even or odd\n        if ~even\n            n2 = (bigN+1)/2;\n        end\n        op = @(x,mode)linop_fft_r2r( sz, N, bigN, n2, even, x, mode );\n    otherwise\n        error('bad input for cmode: must be \"c2c\", \"r2c\", or \"r2r\"');\nend\n\nfunction y = linop_fft_c2c(sz, N, bigN, x, mode)\nswitch mode,\n    case 0, y = sz;\n    case 1, y = fft(x,bigN);    % input of size N. Norm is bigN\n    case 2, \n        y = bigN*ifft(x); % do NOT use ifft(x,N) because we want to truncate AFTER the ifft, not before\n        y = y(1:N,:);\nend\n\nfunction y = linop_fft_r2c(sz, N, bigN, x, mode)\nswitch mode,\n    case 0, y = sz;\n    case 1, \n        if ~isreal(x), \n            x = real(x);\n%             x = real(x+conj(x))/2; % another possibility\n        end\n        y = fft(x,bigN);\n    case 2, \n        y = bigN*ifft(x,'symmetric');\n        y = y(1:N,:);\nend\n\n\nfunction y = linop_fft_r2r(sz, N, bigN, n2, even, x, mode)\nswitch mode,\n    case 0, y = sz;\n    case 1, \n        error(sizeCheck( x, mode, sz ));\n        if ~isreal(x), \n            x = real(x);\n        end\n        z   = fft(x,bigN); % output is of size bigN\n        y   = real(z);\n        if even\n            %   y( (n2+2):bigN, : )    = imag( z( 2:n2, : ) ); % convention \"A\" (not orthogonal)\n            y( (n2+2):bigN, : )    = -imag( z( n2:-1:2, : ) ); % convention \"B\" (orthogonal)\n            y( n2+1, :) = y( n2+1, :)/sqrt(2);\n        else\n            %  y( (n2+1):bigN, : )    = imag( z( 2:n2, : ) ); % convention \"A\"\n            y( (n2+1):bigN, : )    = -imag( z( n2:-1:2, : ) );% convention \"B\"\n        end\n        y = sqrt(2)*y;  % the sqrt(2) is so adjoint=inverse\n        y(1,:) = y(1,:)/sqrt(2);\n    case 2, \n        error(sizeCheck( x, mode, sz ));\n        assert( isreal(x) );\n        y   = complex(x);  % reserve the memory for y\n        n   = bigN;\n        if even\n            %  y(2:n2, : )     = x(2:n2, : ) + 1i*x((n2+2):n, : ); % convention \"A\"\n            y(2:n2, : )     = ( x(2:n2, : ) - 1i*x(n:-1:(n2+2), : ) )/sqrt(2); % convention \"B\"\n            \n            % We can skip this (see the \"trick\" mentioned below)\n            %   y(n:-1:n2+2, : )= conj( y(2:n2,:) );\n        else\n            %  y(2:n2, : )   = x(2:n2, : ) + 1i*x((n2+1):n, : ); % convention \"A\"\n            y(2:n2, : )   = ( x(2:n2, : ) - 1i*x(n:-1:(n2+1), : ) )/sqrt(2); % convention \"B\"\n            \n            % We can skip this (see the \"trick\" mentioned below)\n            %   y(n:-1:n2+1, : )= conj( y(2:n2, :) );\n        end\n        % Note: we are using a trick. We have commented out\n        %  the lines that set y(n2+2:n) (or n2+1:n), because\n        %  the ifft, when using the 'symmetric' option,\n        %  will not look at these entries.\n        \n        y = bigN*ifft(y,'symmetric');\n        y = y(1:N,:);\nend\n\nfunction ok = sizeCheck( x, mode, sz )\nszX = size(x);\nszY = sz{mode};\nif numel(szX) == numel(sz{1}) && all( szX == szY )\n    ok = [];\nelse\n    ok = 'Dimensions mismatch in linop_fft; please check your input size. ';\n    if numel(szX) == 2\n        if szX(1) == szY(2) && szX(2) == szY(1)\n            ok = strcat(ok,' Looks like you have a row vector instead of a column vector');\n        end\n    end\nend\n\n%{\nThe conjugate-to-real transformation as a matrix.\n(we design this for conjugate-symmetry, but you must make sure\n that it still does the same operations when the input\n is not conjugate-symmetric)\n\nn       = 10;\neven    = n/2 == round(n/2)\nP       = zeros(n);\nP(1,1)  = 1;            % DC component\nif even, d      = n/2 - 1; \nP(d+2,d+2)      = 1;    % Nyquist component\nelse, d = (n-1)/2; end\n\nI   = eye(d)/sqrt(2);\nJ   = fliplr(I);\n\nfirst=2:d+1;\nif even,     second=d+3:n; else,  second=d+2:n; end\n\n% Convention \"A\"\nP(first, first)  = I;       % upper left block\nP(second,first)  = -1i*I;   % lower left block\n\nP(first, second)  = J;      % upper right block\nP(second,second)  = 1i*J;   % lower right block\n\n% or... this makes P' = inv(P). Convention \"B\"\n\nP(first, first)  = I;       % upper left block\nP(second,first)  = 1i*J;    % lower left block. now, J, not I\n\nP(first, second)  = J;      % upper right block\nP(second,second)  = -1i*I;  % lower right block. now, I, not J\n%}\n\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license informatio\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_handles.m",
    "content": "function op = linop_handles( sz, Af, At, cmode )\n%LINOP_HANDLES Linear operator from user-supplied function handles.\n%OP = LINOP_HANDLES( SZ, AF, AT, CMODE )\n%    Constructs a TFOCS-compatible linear operator from separate function\n%    handles that compute the forward and adjoint operations. The first\n%    argument, SZ, gives the size of the linear operator; and the forward\n%    and adjoint handles are AF and AT, respectively.\n% \n%    If the inputs and outputs are simple vectors, then SZ can take the\n%    standard Matlab form [M,N], where N is the input length and M is the\n%    output length. If the input or output is a matrix or array, then SZ\n%    should take the form { S_in, S_out }, where S_in is the size of the\n%    input and S_out is the size of the output.\n%\n%    If the input or output space of the operator is complex, then the\n%    CMODE string must be supplied, which describes the forward operation:\n%       'R2R': real input and output\n%       'R2C': real input, complex output\n%       'C2R': complex input, real output\n%       'C2C': complex input, complex output\n%    If CMODE is not supplied, then 'R2R' is assumed. If the operator\n%    detects a complex input or output when it is not expected, then an\n%    error results. Therefore, you must make sure that your operators \n%    return real values when they are expected to do so.\n\nerror(nargchk(3,4,nargin));\nif numel( sz ) ~= 2,\n    error( 'Size must have two elements.' );\nelseif isnumeric( sz ),\n    sz = { [sz(2),1], [sz(1),1] };\nelseif ~isa( sz, 'cell' ),\n    error( 'Invalid operator size specification.' );\nend\nif ~isa( Af, 'function_handle' ) || ~isa( At, 'function_handle' ),\n    error( 'Second and third arguments must be function handles.' );\nend\nif nargin < 4 || isempty( cmode ),\n    cmode = 'R2R';\nelseif ~ischar( cmode ) || size( cmode, 1 ) ~= 1,\n    error( 'Fourth argument must be a string.' );\nelse\n    cmode = upper( cmode );\nend\n\nswitch cmode,\n    case 'R2R', op = @(x,mode)linop_handles_r2r( sz, Af, At, x, mode );\n    case {'R2C','R2CC'}, op = @(x,mode)linop_handles_r2c( sz, Af, At, x, mode );\n    case {'C2R','CC2R'}, op = @(x,mode)linop_handles_c2r( sz, Af, At, x, mode );\n    case 'C2C', op = @(x,mode)linop_handles_c2c( sz, Af, At, x, mode );\n    otherwise,\n        error( 'Invalid complex mode: %s', cmode );\nend\n\nfunction y = linop_handles_r2r(sz, Af, At, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = realcheck( Af( realcheck( x ) ) );\n    case 2, y = realcheck( At( realcheck( x ) ) );\nend\n\nfunction y = linop_handles_r2c(sz, Af, At, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = Af( realcheck( x ) );\n    case 2, y = realcheck( At( x ) );\nend\n\nfunction y = linop_handles_c2r(sz, Af, At, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = realcheck( Af( x ) );\n    case 2, y = At( realcheck( x ) );\nend\n\nfunction y = linop_handles_c2c(sz, Af, At, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = Af( x );\n    case 2, y = At( x );\nend\n\nfunction y = realcheck( y )\nif ~isreal( y ), \n    error( 'Unexpected complex value in linear operation.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_horzcat.m",
    "content": "function op = linop_horzcat( varargin )\n%LINOP_HORZCAT Combines two or more TFOCS lienar operators\n%OP = LINOP_HORZCAT( OP1, OP2, ..., OPN )\n%    Defines the linear operator\n%      OP(x,1) = OP1(x1,1) + ... + OPN(xn,1)\n%    which has adjoint\n%       OP(x,2) = [OP1(x,2);\n%                  ...\n%                  OPN(x,2)];\n%\n% See also linop_vertcat.m\n\n% Introduced June 2016\n% Not sure how efficient this implementation is\n\nif nargin == 0,\n    error( 'Not enough input arguments.' );\nend\nfor k = 1 : nargin,\n    varargin{k}     = linop_adjoint( varargin{k} );\nend\nop  = linop_adjoint( linop_vertcat( varargin{:} ) );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_matrix.m",
    "content": "function op = linop_matrix( A, cmode, width )\n\n%LINOP_MATRIX   Linear operator, assembled from a matrix.\n%    If A is a real matrix, OP = LINOP_MATRIX( A ) returns a handle to a\n%    TFOCS linear operator that uses that matrix to implement its size, \n%    forward, and adjoint operations.\n%\n%    If A is a complex matrix, OP = LINOP_MATRIX( A, MODE ) returns a\n%    handle to a TFOCS linear operator that uses A to implement its size,\n%    forward, and linear operator. MODE is a string that tells it how to\n%    handle its complex inputs/outputs:\n%          'R2R': real input, real output (real matrices only)\n%          'R2C': real input, complex output\n%          'C2R': complex input, real output\n%          'C2C': complex input, complex output \n%    If the operator detects complex input when it is not expecting it, it\n%    will issue an error.\n%\n%    OP = LINOP_MATRIX( A, MODE, WIDTH )\n%       further specifies that A operates on matrices with WIDTH number\n%       of columns (and output also has WIDTH columns).  Default is 1.\n%\n%    Typically, end users do not need to call this routine. You may supply\n%    matrices directly to TFOCS, and it will call this as needed.\n\nif ~isnumeric( A ) || ndims( A ) > 2,\n    error( 'First input must be a matrix.' );\nend\nif nargin < 3, width = 1; end\nif numel( A ) == 1,\n    sz = { [], [] };\nelse\n    sz = { [ size(A,2), width ], [ size(A,1), width ] };\nend\nif nargin < 2 || isempty( cmode ),\n    if ~isreal( A ),\n        error( 'A real/complex mode must be supplied for complex matrices.' );\n    end\n    cmode = 'R2R';\nelseif ~ischar( cmode ) || size( cmode, 1 ) ~= 1,\n    error( 'Complex mode must be a string.' );\nelse\n    cmode = upper(cmode);\nend\nswitch cmode,\n    case 'R2R',\n        if ~isreal( A ),\n            error( 'An \"R2R\" operator requires a real matrix.' );\n        end\n        op = @(x,mode)linop_matrix_r2r( sz, A, x, mode );\n    case 'R2C', op = @(x,mode)linop_matrix_r2c( sz, A, x, mode );\n    case 'C2R', op = @(x,mode)linop_matrix_c2r( sz, A, x, mode );\n    case 'C2C', op = @(x,mode)linop_matrix_c2c( sz, A, x, mode );\n    otherwise,\n        error( 'Unexpected complex mode string: %s', op );\nend\n\nfunction y = linop_matrix_r2r( sz, A, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = A  * realcheck( x );\n    case 2, y = A' * realcheck( x );\nend\n\nfunction y = linop_matrix_r2c( sz, A, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = A * realcheck( x );\n    case 2, y = real( A' * x );\nend\n\nfunction y = linop_matrix_c2r( sz, A, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = real( A * x );\n    case 2, y = A' * realcheck( x );\nend\n\nfunction y = linop_matrix_c2c( sz, A, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = A * x;\n    case 2, y = A' * x;\nend\n\nfunction y = realcheck( y )\nif ~isreal( y ), \n    error( 'Unexpected complex value in linear operation.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_normest.m",
    "content": "function [ nxe, cnt ] = linop_normest( op, cmode, tol, maxiter )\n\n%LINOP_NORMEST Estimates the operator norm.\n%    EST = LINOP_NORMEST( OP ) estimates the induced norm of the operator:\n%           || OP || = max_{||x||<=1} ||OP(X)||\n%    using a simple power method similar to the MATLAB NORMEST functon.\n%\n%    When called with a single argument, LINOP_TEST begins with a real\n%    initial vector. To test complex operators, use the two-argument\n%    version LINOP_NORMEST( OP, cmode ), where:\n%        cmode = 'R2R': real input, real output\n%        cmode = 'R2C': real input, complex output\n%        cmode = 'C2R': imag input, imag output\n%        cmode = 'C2C': complex input, complex output\n%\n%    LINOP_NORMEST( OP, CMODE, TOL, MAXITER ) stops the iteration when the\n%    relative change in the estimate is less than TOL, or after MAXITER\n%    iterations, whichever comes first.\n%\n%    [ EST, CNT ] = LINOP_NORMEST( ... returns the estimate and the number\n%    of iterations taken, respectively.\n\nif isnumeric( op ),\n    op = linop_matrix( op, 'C2C' );\nelseif ~isa( op, 'function_handle' ),\n    error( 'Argument must be a function handle or matrix.' );\nend\nx_real = true;\nif nargin >= 2 && ~isempty( cmode ),\n    switch upper( cmode ),\n        case { 'R2R', 'R2C' }, x_real = true;\n        case { 'C2R', 'C2C' }, x_real = false;\n        otherwise, error( 'Invalid cmode: %s', cmode );\n    end\nend\nif nargin < 3 || isempty( tol ),\n    tol = 1e-8;\nend\nif nargin < 4 || isempty( maxiter ),\n    maxiter = 50;\nend\nsz = op([],0);\nif iscell( sz ),\n    sz = sz{1};\nelseif ~isempty(sz)\n    sz = [sz(2),1];\nelse\n    % if the input is the identity, it may not have a size associated with it,\n    % so current behavior is to try an arbitrary size:\n    sz = [50,1];\nend\ncnt = 0;\nnxe = 0;\nwhile true,\n    if nxe == 0,\n        if x_real,\n            xx = randn(sz);\n        else\n            xx = randn(sz) + 1j*randn(sz);\n        end\n        nxe = sqrt( tfocs_normsq( xx ) );\n    end\n    yy = op( xx / max( nxe, realmin ), 1 );\n    nye = sqrt( tfocs_normsq( yy ) );\n    xx = op( yy / max( nye, realmin ), 2 );\n    nxe0 = nxe;\n    nxe = sqrt( tfocs_normsq( xx ) );\n    if abs( nxe - nxe0 ) < tol * max( nxe0, nxe ),\n        break;\n    end\n    cnt = cnt + 1;\n    if cnt >= maxiter,\n        break;\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_reshape.m",
    "content": "function op = linop_reshape( sz_in, sz_out )\r\n\r\n%LINOP_RESHAPE  Linear operator to perform reshaping of matrices.\r\n%    op = linop_reshape( sz_in, sz_out ) creates a linear operator that\r\n%    uses the matlab 'reshape' function to reshape between sz_in and sz_out.\r\n%    Both sz_in and sz_out must be vectors with d elements (for dimension d).\r\n%    Assumes the number of elements does not change.\r\n%\r\n%\r\n% Contributed by Graham Coleman, graham.coleman@upf.edu\r\n%   See also linop_vec\r\nerror( nargchk(nargin,2,2));\r\nif ~isnumeric(sz_in) || ~isnumeric(sz_out)\r\n    error('sz_in and sz_out must be arrays');\r\nelseif numel(sz_in) ~= numel(sz_out)\r\n    error('sz_in and sz_out must have the same number of elements (usually 2)');\r\nelseif prod( sz_in(:) ) ~= prod( sz_out(:) )\r\n    error('The number of elements cannot change from sz_in to sz_out');\r\nend\r\nsz_in  = sz_in(:).';\r\nsz_out = sz_out(:).';\r\n    \r\nop = @(x,mode) gkcop_reshape_impl( sz_in, sz_out, x, mode );\r\n\r\nfunction y = gkcop_reshape_impl( sz_in, sz_out, x, mode )\r\nswitch mode,\r\n    case 0, y = { sz_in, sz_out };\r\n    case 1, y = reshape( x, sz_out );\r\n    case 2, y = reshape( x, sz_in );\r\nend\r\n\r\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\r\n% Copyright 2013 California Institute of Technology and CVX Research.\r\n% See the file LICENSE for full license information.\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_scale.m",
    "content": "function op = linop_scale( scale, sz )\n\n%LINOP_SCALE  Scaling linear operator.\n%    OP = LINOP_SCALE( scale ) returns a handle to a TFOCS linear operator \n%    whose forward and adjoint operators are OP(X) = scale * X.\n%    \"scale\" must be a real scalar\n%\n%    OP = LINOP_SCALE( scale, size ) gives the scaling operator\n%       an explicit size. \"sz\" can be:\n%           - the empty matrix \"[]\" (default), which means the size is not\n%               yet defined; the TFOCS software will attempt to automatically\n%               determine the size later.\n%           - a vector [N1,N2] which implies the domain is the set of N1 x N2 matrices\n%               ( it is also possible to use [N1,N2,N3,....], which\n%                 means the domain is a set of multi-dimensional arrays )\n%           - a scalar N, which is equivalent to [N,1], i.e. the set of N x 1 vectors\n%       Because this is simple scaling, the range will have the same size\n%       as the domain.\n%\n%   July 2016, allowing OP(X) = scale .* X  as well\n%\n%   See also linop_compose\n\nif ~isnumeric( scale ) %&& numel( scale ) ~= 1,\n    error( 'Argument must be numeric.' );\nelseif ~isreal( scale ),\n    error( 'Argument must be real.' );\nend\nif nargin < 2, sz = []; end\nif isempty(sz)\n    szCell = { [], [] };\nelseif isnumeric(sz)\n    if numel(sz) <= 1, sz = [sz, 1 ]; end\n    % ensure that \"sz\" is a row vector\n    sz = sz(:).';\n    szCell = { sz, sz };\nelse\n    error('bad type for size input');\nend\n\nif all(scale(:) == 1 ),\n    op = @linop_identity;\nelse\n    op = @(x,mode)linop_scale_impl( szCell, scale, x, mode );\nend\n\nfunction y = linop_scale_impl( sz, scale, y, mode )\nif mode == 0, \n    y = sz;\nelse\n    y = scale .* y;\nend\n\n% function OK = isSquare( sz )\n% OK = true;\n% for j = 1:length( sz{1} )\n%     if sz{1}(j) ~= sz{2}(j)\n%         OK = false; break;\n%     end\n% end\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_spot.m",
    "content": "function op = linop_spot( A, cmode )\n\n%LINOP_SPOT   Linear operator, assembled from a SPOT operator.\n%    If A is a real operator, OP = LINOP_SPOT( A ) returns a handle to a\n%    TFOCS linear operator that uses that object to implement its size, \n%    forward, and adjoint operations.\n%\n%    If A is a complex operator, OP = LINOP_SPOT( A, MODE ) returns a\n%    handle to a TFOCS linear operator that uses A to implement its size,\n%    forward, and linear operator. MODE is a string that tells it how to\n%    handle its complex inputs/outputs:\n%          'R2R': real input, real output (real matrices only)\n%          'R2C': real input, complex output\n%          'C2R': complex input, real output\n%          'C2C': complex input, complex output \n%    If the operator detects complex input when it is not expecting it, it\n%    will issue an error.\n\nif ~isa( A, 'opSpot' ),\n    error( 'First input must be a SPOT operator.' );\nend\nsz = { [ size(A,2), 1 ], [ size(A,1), 1 ] };\nif nargin < 2 || isempty( cmode ),\n    if ~isreal( A ),\n        error( 'A real/complex mode must be supplied for complex matrices.' );\n    end\n    cmode = 'R2R';\nelseif ~ischar( cmode ) || size( cmode, 1 ) ~= 1,\n    error( 'Complex mode must be a string.' );\nelse\n    cmode = upper(cmode);\nend\nswitch cmode,\n    case 'R2R',\n        if ~isreal( A ),\n            error( 'An \"R2R\" operator requires a real matrix.' );\n        end\n        op = @(x,mode)linop_matrix_r2r( sz, A, x, mode );\n    case 'R2C', op = @(x,mode)linop_matrix_r2c( sz, A, x, mode );\n    case 'C2R', op = @(x,mode)linop_matrix_c2r( sz, A, x, mode );\n    case 'C2C', op = @(x,mode)linop_matrix_c2c( sz, A, x, mode );\n    otherwise,\n        error( 'Unexpected complex mode string: %s', op );\nend\n\nfunction y = linop_matrix_r2r( sz, A, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = A  * realcheck( x );\n    case 2, y = A' * realcheck( x );\nend\n\nfunction y = linop_matrix_r2c( sz, A, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = A * realcheck( x );\n    case 2, y = real( A' * x );\nend\n\nfunction y = linop_matrix_c2r( sz, A, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = real( A * x );\n    case 2, y = A' * realcheck( x );\nend\n\nfunction y = linop_matrix_c2c( sz, A, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = A * x;\n    case 2, y = A' * x;\nend\n\nfunction y = realcheck( y )\nif ~isreal( y ), \n    error( 'Unexpected complex value in linear operation.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_subsample.m",
    "content": "function op = linop_subsample( sz, omega, SYMMETRIC )\n%LINOP_SUBSAMPLE Subsampling linear operator.\n%OP = LINOP_SUBSAMPLE( SZ, OMEGA )\n%   vector and matrix subsampling. Depending on SZ and OMEGA,\n%   this can do row-sampling (e.g. a partial FFT)\n%   or it can sample specific entries of a matrix (e.g. matrix completion)\n%   To specify matrix subsampling, set sz = { [n1,n2], [length(omega),1] }\n%       where the input matrix has size n1 x n2\n%\n%OP = LINOP_SUBSAMPLE( OMEGA )\n%   works if OMEGA is a sparse matrix, whose nonzero entries\n%   specify the entries to sample.\n%\n%OP = LINOP_SUBSAMPLE( ..., SYMMETRIC )\n%   If SYMMETRIC is true, then\n%   forces the domain to be the space of symmetric matrices\n%\n% Example with FFT:\n%   FFT = linop_handles([N,N], @(x)fft(x)/sqrt(N), @(x)sqrt(N)*real(ifft(x)) ,'R2C');\n%   and to make a row sub-sampled FFT (M <= N):\n%   rows = randperm(M);\n%   A   = linop_compose( linop_subsample([M,N], rows ), FFT );\n\n\n% Designed to be used with a fft or dct\n% Do we need a separate oversampling version?\n% Also, make linop_DCT and linop_FFT ?\n%   The reason we might want this is that for linop_FFT,\n%   people will probably use idct as the transpose -- this is not \n%   correct, due to scaling\n\n% Help documentation: TBD\n%    Constructs a TFOCS-compatible linear operator from separate function\n%    handles that compute the forward and adjoint operations. The first\n%    argument, SZ, gives the size of the linear operator; and the forward\n%    and adjoint handles are AF and AT, respectively.\n% \n%    If the inputs and outputs are simple vectors, then SZ can take the\n%    standard Matlab form [N,M], where N is the input length and M is the\n%    output length. If the input or output is a matrix or array, then SZ\n%    should take the form { S_in, S_out }, where S_in is the size of the\n%    input and S_out is the size of the output.\n%\n\nerror(nargchk(1,3,nargin));\nif nargin < 3\n    SYMMETRIC = false;\nend\nif nargin == 1\n    omega = sz;\n    sz = { size(omega), [nnz(omega),1] };\nelseif nargin ==2 && issparse(sz)\n    SYMMETRIC = omega;\n    omega = sz;\n    sz = { size(omega), [nnz(omega),1] };\nend\n\nif numel( sz ) ~= 2,\n    error( 'Size must have two elements.' );\nelseif isnumeric( sz ),\n    sz = { [sz(2),1], [sz(1),1] };\nelseif ~isa( sz, 'cell' ),\n    error( 'Invalid operator size specification.' );\nend\n\ndom = sz{1};\nn1 = dom(1); n2 = dom(2);\nran = sz{2};\n\n% There are several possibilities.  Let x be a point in the domain\n%{\n    x is a vector.  Then omega should be a vector.\n                    We return x(omega), resp.\n\n    x is a matrix.\n        omega is a vector\n            This is ambiguous: does the user want x(omega,:) or x(omega)?\n        omega is a matrix with 2 columns, then assume it is [I,J]\n            We convert it to linear indices.\n        omega is a general matrix, more than 2 columns\n            Not sure what the user means; report an error.\n        omega is a sparse matrix\n            We find it's entries, and use those\n\n%}\n\nif n2 == 1\n    % x is a vector, not a matrix.  Simple.\n%     op = @(x,mode) linop_subsample_vector( sz, omega, x, mode );\n    % Allow it to vectorize along rows:\n    op = @(x,mode) linop_subsample_row( sz, omega, x, mode );\nelse\n    % trickier case.\n    if issparse(omega)\n        ind = find(omega);\n        [I,J] = ind2sub( sz{1}, ind );\n%         op = @(x,mode) linop_subsample_matrix( sz, ind, I, J, SYMMETRIC, x, mode );\n    elseif isvector(omega)\n        ind     = omega;\n        [I,J]   = ind2sub( sz{1}, ind );\n%         op = @(x,mode) linop_subsample_matrix( sz, omega, SYMMETRIC,x, mode );\n    elseif size(omega,2) == 2\n        ind = sub2ind( sz{1}, omega(:,1), omega(:,2) );\n        I   = omega(:,1);\n        J   = omega(:,2);\n%         op = @(x,mode) linop_subsample_matrix( sz, ind, SYMMETRIC,x, mode );\n    else\n        error('omega is not an acceptable size; perhaps you meant it to be sparse?');\n    end\n    % Make sure 'ind' is a column vector\n    ind     = ind(:);\n    op = @(x,mode) linop_subsample_matrix( sz, ind, I, J, SYMMETRIC, x, mode );\n    \nend\n\n\nfunction y = linop_subsample_vector(sz, omega, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, \n        if ~isequal( sz{1}, size(x) ), error('input wrong size for vector subsampling'); end\n        y = x(omega);\n    case 2, \n        y = zeros( sz{1} );\n        y(omega) = x;\nend\nfunction y = linop_subsample_row(sz, omega, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, \n        if ~isequal( sz{1}(1), size(x,1) ), error('input wrong size for vector subsampling'); end\n        y = x(omega,:);\n    case 2, \n        y = zeros( sz{1} );\n        y = zeros( sz{1}(1), size(x,2) );\n        y(omega,:) = x;\nend\nfunction y = linop_subsample_matrix(sz, omega, indI, indJ,SYMMETRIC, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1\n        S = [];\n        S.type = '()';\n        S.subs = {omega};\n        y = subsref(x,S);\n    case 2, \n        dom = sz{1}; n1 = dom(1); n2 = dom(2);\n        y = sparse( indI, indJ, x, n1, n2 );\n        if SYMMETRIC\n            % in future, might update this\n            % e.g. force omega to only refer to lower part of matrx,\n            % and then do the update y = y + tril(y,-1)'\n            y = (y+y')/2;\n        end\nend\n\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_test.m",
    "content": "function varargout = linop_test( op, cmode, maxits )\n\n%LINOP_TEST Performs an adjoint test on a linear operator.\n%    LINOP_TEST( OP ) attempts to verify that a linear operator OP obeys\n%    the inner product test: <A*x,y> = <x,A'*y> for all x, y. OP must be a\n%    TFOCS linear operator with hard-coded size information; that is,\n%    OP([],0) must return valid size info.\n%\n%    When called with a single argument, LINOP_TEST creates real test\n%    vectors for X and Y. To test complex operators, use the two-argument\n%    version LINOP_TEST( OP, cmode ), where:\n%        cmode = 'R2R': real input, real output\n%        cmode = 'R2C': real input, complex output\n%        cmode = 'R2CC': real input, conjugate-symmetric complex output\n%        cmode = 'C2R': complex input, real output\n%        cmode = 'CC2R': conjugate-symmetric complex input, real output\n%        cmode = 'C2C': complex input, complex output\n%\n%    The conjugate-symmetric options follow the symmetry conventions of Matlab's FFT.\n%\n%    LINOP_TEST( OP, CMODE, MAXITS ) performs MAXITS iterations of the\n%    test loop. MAXITS=25 is the default.\n%\n%   myNorm = LINOP_TEST(...) returns an estimate of the myNorm of\n%       the linear operator.\n\nerror(nargchk(1,3,nargin));\nif isnumeric( op ),\n    if nargin < 2 || isempty( cmode )\n        disp('warning: for matrix inputs, this assumes the cmode is ''C2C'' unless you specify otherwise');\n        cmode = 'C2C'; \n    end\n    op = linop_matrix( op, cmode );\nend\ny_conjSymmetric     = false;\nx_conjSymmetric     = false;\nif nargin < 2 || isempty( cmode ),\n    x_real = true;\n    y_real = true;\nelse\n    switch upper( cmode ),\n        case 'R2R', x_real = true; y_real = true;\n        case 'R2C', x_real = true; y_real = false;\n        case 'R2CC', x_real = true; y_real = false;  y_conjSymmetric    = true;\n        case 'C2R', x_real = false; y_real = true;\n        case 'CC2R', x_real = false; y_real = true;  x_conjSymmetric    = true;\n        case 'C2C', x_real = false; y_real = false;\n        case 'CC2CC', x_real = false; y_real = false; \n            x_conjSymmetric    = true;\n            y_conjSymmetric    = true; % this is probably never going to happen though\n        otherwise, error( 'Invalid cmode: %s', cmode );\n    end\nend\nif nargin < 3 || isempty(maxits),\n    maxits = 25;\nend\nsz = op([],0);\nif ~iscell(sz)\n    sz = { [sz(2),1], [sz(1),1] };\nelseif isempty(sz{1})\n    disp('warning: could not detect the size; this often happens when using a scalar input, which represents scaling');\n    if isempty( sz{2} )\n        disp('  Proceeding under the assumption that the domain is 1D');\n        sz{1} = [1,1];\n        sz{2} = [1,1];\n    else\n        disp('  Proceeding under the assumption that the domain equals the range');\n        sz{1}   = sz{2};\n    end\nelseif isempty(sz{2})\n    disp('warning: could not detect the size; this often happens when using a scalar input, which represents scaling');\n    disp('  Proceeding under the assumption that the domain equals the range');\n    sz{2}   = sz{1};\nend\nnf = 0;\nna = 0; \nerrs = zeros(1,maxits+1);\nnxe = 0; nye = 0;\nfor k = 1 : maxits,\n    \n    %\n    % The adjoint test\n    %\n    \n    if x_real,\n        x = randn(sz{1});\n    else\n        x = randn(sz{1})+1j*randn(sz{1});\n        if x_conjSymmetric\n            x = make_conj_symmetrix( x );\n        end\n    end\n    \n    if y_real,\n        y = randn(sz{2});\n    else\n        y = randn(sz{2})+1j*randn(sz{2});\n        if y_conjSymmetric\n            y = make_conj_symmetrix( y );\n        end\n    end\n    \n    nx = myNorm(x);\n    Ax = op(x,1);\n    nf = max( nf, myNorm(Ax)/nx );\n    Ax_y = tfocs_dot( Ax, y ); \n    \n    ny = myNorm(y);\n    Ay = op(y,2);\n    na = max( na, myNorm(Ay) / ny );\n    Ay_x = tfocs_dot( x, Ay ); \n    \n    errs(k) = abs(Ax_y-Ay_x)/(nx*ny);\n    \n    %\n    % The myNorm iteration\n    %\n    \n    if nxe == 0,\n        if x_real,\n            xx = randn(sz{1});\n        else\n            xx = randn(sz{1}) + 1j*randn(sz{1});\n            if x_conjSymmetric\n                xx = make_conj_symmetrix( xx );\n            end\n        end\n        nxe = myNorm(xx);\n    end\n    yy = op(xx/nxe,1);\n    nye = max(realmin,myNorm(yy));\n    xx = op(yy/nye,2);\n    nxe = myNorm(xx);\n    \nend\n\n%\n% Use the estimated singular vectors for a final adjoint est\n%\n\nif nxe > 0,\n    Ax_y = tfocs_dot( op(xx,1), yy );\n    Ay_x = tfocs_dot( op(yy,2), xx );\n    errs(end) = abs(Ax_y-Ay_x) / (nxe*nye);\nend\n\n%\n% Display the output\n% \n\nnmax = max(nye,nxe);\nmyNorm_err = abs(nye-nxe) / nmax;\npeak_err = max(errs) / nmax;\nmean_err = mean(errs) / nmax;\nrc = { 'complex', 'real', 'complex symmetric' };\nfprintf( 'TFOCS linear operator test:\\n' );\nfprintf( '   Input size:  [' ); fprintf( ' %d', sz{1} ); fprintf( ' ], %s\\n', rc{x_real+1+2*x_conjSymmetric} );\nfprintf( '   Output size: [' ); fprintf( ' %d', sz{2} ); fprintf( ' ], %s\\n', rc{y_real+1+2*y_conjSymmetric} );\nfprintf( 'After %d iterations:\\n', maxits  );\nfprintf( '    myNorm estimates (forward/adjoint/error): %g/%g/%g\\n', nye, nxe, myNorm_err );\nfprintf( '       Gains: forward %g, adjoint %g\\n', nf, na );\nfprintf( '    Inner product error:\\n' );\nfprintf( '       Mean (absolute/relative): %g/%g\\n', mean(errs), mean_err );\nfprintf( '       Peak (absolute/relative): %g/%g\\n', max(errs), peak_err );\nfprintf( '       (inner product errors should 1e-10 or smaller)\\n');\n\ngood = true;\nif myNorm_err/max( nye, nxe ) > 1e-4\n    fprintf('  Detected mismatch in forward/adjoint norm estimates. This is potentially a bad sign. Check your implementation\\n');\n    good = false;\nend\nif mean_err > 1e-8\n    fprintf('  The mean error (relative) is high. This is a bad sign. Check your implementation\\n');\n    good = false;\nend\nif good\n    fprintf('  Allowing for some roundoff error, there are no obvious errors. This is good.\\n');\nend\n\nif nargout > 0\n    varargout{1} = mean([nye,nxe]);\nend\n\n\n% Improvement as suggested by Graham Coleman\n% Allows for 3D arrays.\n% This also changes default behavior of 2D arrays\n% to now use the Frobenius norm instead of spectral norm.\n% This is wise, since it's a much quicker computation.\nfunction y = myNorm(x)\ny = norm( x(:) );\n\nfunction y = make_conj_symmetrix( y )\nny = size( y, 1 );\ny(1,:)  = real(y(1,:));         % DC component is 0\nif round(ny/2) == ny/2  % even\n    y(ny/2+1,:)     = real(y(ny/2+1,:));    % Nyquist component is 0\n    y( ny:-1:(ny/2+2) )     = conj( y(2:ny/2) );\nelse                    % odd\n    y( ny:-1:((ny+1)/2+1) ) = conj( y(2:((ny+1)/2)) );\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_vec.m",
    "content": "function op = linop_vec( sz )\n%LINOP_VEC Matrix to vector reshape operator\n%OP = LINOP_VEC( SZ )\n%    Constructs a TFOCS-compatible linear operator that reduces a matrix\n%    variable to a vector version using column-major order.\n%    This is equivalent to X(:)\n%    The transpose operator will reshape a vector into a matrix.\n%\n%    The input SZ should of the form [M,N] where [M,N] describe the\n%    size of the matrix variable.  The ouput vector will be of \n%    length M*N.  If SZ is a single entry, then M = N is assumed.\n%    For advanced usage with multidimensional arrays,\n%    use the more general linop_reshape function instead.\n%\n%   To do the reverse operation (from vector to matrix),\n%   use this function together with linop_adjoint.\n%\n%   See also linop_reshape\n\nif numel(sz) > 2, error('must supply a 2-entry vector'); end\nif numel(sz) == 1, sz = [sz(1),sz(1)]; end\n\n% Switch conventions of the size variable:\nsz = { [sz(1),sz(2)], [sz(1)*sz(2),1] };\n \nop = @(x,mode)linop_handles_vec( sz, x, mode );\n\nfunction y = linop_handles_vec(sz, x, mode )\nswitch mode,\n    case 0, y = sz;\n    case 1, y = x(:);\n    case 2, \n        MN = sz{1}; M = MN(1); N = MN(2);\n        y = reshape( x, M, N );\n        \nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/linop_vertcat.m",
    "content": "function op = linop_vertcat( varargin )\n%LINOP_VERTCAT Combines two or more TFOCS lienar operators\n%OP = LINOP_VERTCAT( OP1, OP2, ..., OPN )\n%    Defines the linear operator\n%       OP(x,1) = [OP1(x,1);\n%                  ...\n%                  OPN(x,1)];\n%   which has adjoint\n%       OP(x,2) = OP1(x1,2) + ... + OPN(xn,2)\n%\n\n% Introduced June 2016\n\nif nargin == 0,\n    error( 'Not enough input arguments.' );\nend\nsz = { [], [] };\nsz_x = [];\nfor k = 1 : nargin,\n    tL = varargin{k}; % current linear operator\n    if isempty(tL) || ~isa(tL,'function_handle') && ~isnumeric(tL) || ndims(tL) > 2,\n        error( 'Arguments must be linear operators, scalars, or matrices.' );\n    elseif isnumeric(tL),\n        if ~isreal(tL),\n            error( 'S or scalar arguments must be real.' );\n        elseif numel(tL) == 1,\n            tL = linop_scale( tL );\n        else\n            tL = linop_matrix( tL );\n        end\n        varargin{k} = tL;\n    end\n    try\n        tsz = tL([],0);\n    catch\n        error( 'Arguments must be linear operators, scalars, or matrices.' );\n    end\n    if isempty(tsz)     % i.e. output of linop_identity is []\n        tsz = { [], [] };\n    end\n    if isnumeric(tsz),\n        tsz = { [tsz(2),1], [tsz(1),1] };\n    end\n    \n    % convert [n1;n2] to [n1,n2] if necessary:\n    for kk = 1:2\n        %if iscolumn( tsz{kk} )\n            %tsz{kk} = tsz{kk}.';\n        %end\n        tsz{kk} = tsz{kk}(:).';\n    end\n    \n    if isempty(tsz{1}),\n        error('For now, each operator must have an explicit output size');\n    end\n    if isempty(sz{1})\n        sz{1} = tsz{1};\n    else\n        % all operators work on the same dimension input\n        if ~isequal( tsz{1}, sz{1} )\n            error('All operators must have the same size input');\n        end\n    end\n    if isempty(sz{2}),\n        sz{2} = tsz{2};\n        sz_x(1) = tsz{2}(1);\n    else\n        % check that others are compatible with # of columns:\n        if numel( sz{2} ) ~= numel( tsz{2} ) || ~isequal( tsz{2}(2:end), sz{2}(2:end) )\n            error('All operators must have outputs with equal number of columns');\n        end\n        sz{2}(1) = sz{2}(1) + tsz{2}(1); % increment first dimension only\n        sz_x = [sz_x, tsz{2}(1)];\n    end\nend\n% Explanation of above code:\n% suppose have three inputs, opA, opB, opC; with sizes szA, szB, szC\n%   where opA: szA{1} --> szA{2}\n%   then we need sz_{1} to be the same no matter what!\n%   Furthermore, output sizes should have same # of columns\n%    (preferably a single column, since least chance for errors)\n\n\n\nif nargin == 1,\n    op = varargin{1};\nelse\n    op = @(x,mode)linop_horzcat_impl( varargin, sz, sz_x, x, mode );\nend\n\nfunction y = linop_horzcat_impl( ops, sz,sz_x, x, mode )\nswitch mode,\n    case 0,\n        y = sz;\n    case 1,\n        y   = [];\n        for k = 1:numel(ops)\n            y = vertcat( y, ops{k}( x, 1 ) );\n        end\n    case 2,\n        % Need to split input up\n        cs = cumsum(sz_x);\n        y = ops{1}( x(1:cs(1)), 2 );\n        for k = 2 : numel(ops),\n            y = y + ops{k}( x( (cs(k-1)+1):cs(k)  ), 2 );\n        end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_0.m",
    "content": "function op = proj_0(offset,A,algo,R)\n%PROJ_0     Projection onto the set {0}\n%    OP = PROJ_0 returns an implementation of the indicator \n%    function for the set including only zero.\n%\n%    OP = PROJ_0( c ) returns an implementation of the\n%    indicator function of the set {c}\n%    If c is a scalar, this is interpreted as c*1\n%    where \"1\" is the all ones object of the appropriate size.\n%\n%    OP = PROJ_0( c , A) returns an implementation of the\n%    indicator function of the set {x : Ax = c}\n%    where A is a matrix. Unlike the previous call, c must now\n%    be a vector of appropriate size, and x must be a matrix\n%    (no support for multi-dimensional arrays).\n%    Note:\n%       This requires computing the Cholesky decomposition of A\n%       which can be expensive. For large dimensions, consider\n%       using TFOCS_SCD.m and explicitly passing in the linear\n%       operator, which will recast the optimization problem to avoid\n%       requiring this function. For small problems, directly\n%       calling this function is fine and may lead to faster convergence.\n%\n%       If A is diagonal, then we can exploit that, but we don't \n%       currently have it implemented. Instead, just rescale c\n%       since if A=di\\ag(d) then { x : Ax=c } = { x : x = c./d }\n%\n%       \"A\" must be an explicit matrix, not a function handle\n%\n%   OP = PROJ_0( c , A, algo)\n%       lets the user select between two algorithms (algo=1 or =2)\n%       Algo. 1 is a bit faster but more prone to numerical roundoff error\n%       which could be significant if A is extremely ill-conditioned\n%\n%   OP = PROJ_0( c , A, algo, R)\n%       uses the pre-computed value R (if algo==1, R=chol(A*A'),\n%       and if algo==2, [~,R] = qr(A',0); ).\n%       This usage is useful if you have already computed R and want\n%       to save time. For algo==1, you can also set\n%       R=alpha to indicate that A*A' = alpha^2*Id\n%\n%   Note: for the set { x : ||Ax-b|| <= eps } where eps > 0, see\n%       proj_l2.m\n%\n% See also proj_l2.m, prox_0.m, proj_Rn.m and smooth_constant.m,\n%   which are the Fenchel conjugates of this function.\n\nif nargin == 0\n    op = @proj_0_impl;\nelseif nargin == 1\n    op = @(varargin) proj_0_impl_q( offset, varargin{:} );\nelseif nargin >= 2 % added June 14 2014\n    if norm(offset)==0\n        error('offset term is 0, so solution is always 0. Are you sure this is what you want?');\n    end\n    \n    % We have two different algorithms, same asymptoptic complexity\n    % but Algo. 1 is faster in practice though less numerically robust\n    %   since it forms the matrix A*A' which has larger condition number\n    % Algo. 2 is a bit more stable but a bit slower\n    if nargin < 3 || isempty(algo), algo = 1; end\n    if nargin < 4, R = []; end\n    if isa(A,'function_handle')\n        if algo ~= 1\n            error('If \"A\" is a function handle, must use algo #1');\n        end\n        %sz  = A([],0);\n        % Now, build AAt using implicit2explicit\n        if isempty(R)\n            fprintf('Now computing explicit representation of A*A''. Please wait...');\n            t1 = tic;\n            AAt_fun     = linop_compose( A, linop_adjoint(A) );\n            AAt         = implicit2explicit(AAt_fun);\n            fprintf('... done (%.1f seconds)\\n', toc(t1));\n        end\n    else\n        if size( A, 1 ) ~= size(offset,1)\n            error('A must have as many rows as c');\n        end\n        if algo == 1 && isempty(R)\n            AAt     = A*A';\n        end\n    end\n    if isempty(R)\n        t2 = tic;\n        if algo == 1\n            fprintf('Now computing Cholesky factorization of A. Please wait...');\n            R = chol(AAt);\n            clear AAt\n        elseif algo==2\n            fprintf('Now computing QR decomposition of A^T. Please wait...');\n            [~,R] = qr(A',0);\n        else\n            error('Bad value for \"algo\". Should be 1 or 2');\n        end\n        fprintf('... done (%.1f seconds)\\n', toc(t2));\n    end\n    op = @(varargin) proj_0_impl_qA( offset, A, R, algo, varargin{:} );\nend\n\nfunction [ v, x ] = proj_0_impl( x, t )\nv = 0;\nswitch nargin,\n\tcase 1,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n        elseif any( x(:) ),\n            v = Inf;\n        end\n\tcase 2,\n        % \"t\" variable has no effect\n\t\tx = 0*x;\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\nfunction [ v, x ] = proj_0_impl_q( c,  x, t )\nv = 0;\nswitch nargin,\n\tcase 2,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n        end\n        if isscalar(c) \n            if any( x(:) - c )\n                v = Inf;\n            end\n        elseif any( x(:)  - c(:) ),\n            v = Inf;\n        end\n\tcase 3,\n        % \"t\" variable has no effect\n        if isscalar(c) && ~isscalar(x)\n            x = c*ones( size(x) );\n        else\n            x = c;\n        end\n\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\n\nfunction [ v, x ] = proj_0_impl_qA( b, A, R, algo, x, t )\nv = 0;\nswitch nargin,\n    case 5,\n        if nargout == 2,\n            error( 'This function is not differentiable.' );\n        end\n        if isa(A,'function_handle')\n            if norm( A(x,1) - b )/norm(b) > 1e-10\n                v = Inf;\n            end\n        else\n            if norm( A*x - b )/norm(b) > 1e-10\n                v = Inf;\n            end\n        end\n    case 6,\n        % \"t\" variable has no effect\n        if algo==1\n            if isnumeric(R)&&isscalar(R)\n                AAtinv = @(x) x/(R^2 );\n            else\n                AAtinv = @(x) R\\( R'\\x );\n            end\n            if isa(A,'function_handle')\n                x = x - A(AAtinv( A(x,1) - b ),2);\n            else\n                x = x - A'*AAtinv( A*x - b );\n            end\n        elseif algo==2\n            bb = (R')\\b;\n            AA = @(x) (R')\\(A*x);  % this is now Q'\n            AAt= @(x) A'*(R\\x);\n            x  = x - AAt( AA(x) - bb );\n        end\n    otherwise,\n        error( 'Not enough arguments.' );\nend\n\n\nfunction A = implicit2explicit(Afun)\n%IMPLICIT2EXPLICIT takes linear function A(x) and builts corresponding matrix\n%   makes an explicit matrix using the linear function\n%   in the function handle \"Afun\", where the domain is R^n\n%   and the range is in R^m\n% Usage: implicit2explicit(Afun)\n%   where Afun is a TFOCS linear operator\n% \n% i.e., Afun([],0) returns \"sz\", \n%   where \"sz\" follows the usual TFOCS size conventions\n% e.g., { [n1,n2], [m1,m2] } for a function \n%             from n1 x n2 --> m1 x m2\n% and the shortcut convention \n%   sz = [m,n] for the common case when\n%   n1 = n and n2 = 1, and m1=m and m2=1\n%\n% Stephen Becker, stephen.beckr@gmail.com, 2009\n% Incorporated into TFOCS June 17 2014\n\nsz = Afun([],0);\n\nif iscell(sz)\n    nn = sz{1};\n    mm = sz{2};\n    n1 = nn(1);\n    n2 = nn(2);\n    m = prod(mm);\nelse\n    m = sz(1);\n    n1 = sz(2);\n    n2 = 1;\nend\n\nA = zeros(m,n1*n2);\ne = zeros(n1,n2);\nvec = @(x) x(:);\nfor j = 1:(n1*n2)\n    e(j) = 1;\n    A(:,j) = vec(Afun(e,1)); % call it in forward mode\n    e(j) = 0;\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_Rn.m",
    "content": "function op = proj_Rn\n\n%PROJ_RN    \"Projection\" onto the entire space.\n%    OP = PROX_RN returns an implementation of the set Rn. Use\n%    this function to specify a model with no nonsmooth component. It is\n%    identical to both PROX_0 and SMOOTH_CONSTANT( 0 ).\n%    The projection onto Rn is just the identity.\n% Dual: proj_0.m\n\nop = smooth_constant( 0 );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_Rplus.m",
    "content": "function op = proj_Rplus( scale )\n\n%PROJ_RPLUS    Projection onto the nonnegative orthant.\n%    OP = PROJ_RPLUS returns an implementation of the indicator \n%    function for the nonnegative orthant.\n%    OP2 = PROJ_RPLUS( scale ) returns the indicator function\n%    of the scaled nonnegative orthant: that is,\n%        OP2( x ) = OP( scale * x ).\n%    Because the nonnegative orthant is a cone, scaling has no\n%    effect if scale > 0. If scale < 0, the result is an \n%    indicator function for the nonpositive orthant, which is\n%    also the conjugate of the original. If scale == 0, then\n%    the result is the zero function.\n% Dual: proj_Rplus(-1)\n%\n% See also proj_psd.m, the matrix-analog of this function\n\nif nargin == 0,\n    op = @proj_Rplus_impl;\nelseif ~isa( scale, 'double' ) || numel( scale ) ~= 1 || ~isreal( scale ),\n    error( 'The argument must be a real scalar.' );\nelseif scale > 0,\n    op = @proj_Rplus_impl;\nelseif scale < 0,\n    op = @proj_Rminus_impl;\nelse\n    op = proj_Rn;\nend\n\nfunction [ v, x ] = proj_Rplus_impl( x, t )\nv = 0;\nswitch nargin,\n\tcase 1,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n        elseif any( x(:) < 0 ),\n            v = Inf;\n        end\n\tcase 2,\n\t\tx = max( x, 0 );\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\n\nfunction [ v, x ] = proj_Rminus_impl( x, t )\nv = 0;\nswitch nargin,\n\tcase 1,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n        elseif any( x(:) > 0 ),\n            v = Inf;\n        end\n\tcase 2,\n\t\tx = min( x, 0 );\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_affine.m",
    "content": "function op = proj_affine( A, b, R )\n%PROJ_AFFINE(A, b)    Projection onto the affine set \n%    { x : A*x == b }\n%\n%   Warning! For large dimensions, this may be costly.\n%   In this case, use proj_0 and explicitly seprate\n%   out the affine term (this is the motivation behind\n%   TFOCS). \n%\n%   For efficiency, this function does a single costly\n%   Cholesky decomposition when instatiated; subsequent\n%   calls are cheap.\n%PROJ_AFFINE(A, b, R)\n%   uses the user-provided R for the Cholesky factorization\n%   of A*A', i.e., R'*R = A*A' and R is upper triangular.\n%\n%   If A is a tight frame, e.g., A*A' = alpha*I for some\n%   scalar alpha>0, then the projection is efficient, but it is\n%   not automatically recognized. The user should\n%   provide R = sqrt(alpha)*eye(m) (where A is m x n)\n%   and then the code will be efficient.\n%\n%  N.B. If the system of equations is overdetermined,\n%   then the set is just a single point.\n%\n% See also proj_boxAffine and proj_singleAffine\n\nerror(nargchk(2,3,nargin));\nif nargin < 3\n    if size(A,1) > 1e4\n        warning('proj_affine:largeSize','Cholesky decomposition might take a large for such large matrices');\n    end\n    [R,p] = chol(A*A');\nelse\n    p = 0;\n    % Assuming that if user provides R, then it is not over-determiend\nend\nif p > 0\n    % A*A' is rank deficient, i.e., system is over-determined\n    % So, there is just a unique point\n    warning('proj_affine:overdetermined','The system is over-determined so the set is a single point');\n    xStar = A\\b;\n    op = @(varargin) proj_point( xStar, varargin{:} );\nelse\n    op = @(varargin) proj_affine_internal( A, R, b, varargin{:} );\nend\n\nfunction [v,x] = proj_point( xStar, y, t )\nv = 0;\nswitch nargin\n    case 2\n        if nargout == 2\n            error('This function is not differentiable.');\n        end\n        % Check if we are feasible\n        if norm( y - xStar ) > 1e-13\n            v = Inf;\n        end\n    case 3\n        % The projection is simple:\n        x   = xStar;\n    otherwise\n        error( 'Wrong number of arguments.' );\nend\n\nfunction [v,x] = proj_affine_internal( A, R, b, y, t )\nv = 0;\nswitch nargin\n    case 4\n        if nargout == 2\n            error('This function is not differentiable.');\n        end\n        % Check if we are feasible\n        if norm( A*y - b ) > 1e-13\n            v = Inf;\n        end\n    case 5\n        x = y + A'*( R\\( R'\\( b - A*y  )) );\n    otherwise\n        error( 'Wrong number of arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_box.m",
    "content": "function op = proj_box(l,u)\n%PROJ_BOX Projection onto box constraints.\n%PROJ_BOX(l,u)    Projection onto the box { l <= x <= u }\n%    If l or u is the empty matrix [], then the constraint is not\n%    enforced (e.g. PROJ_BOX([],1) is the set { x <= 1 },\n%       and PROJ_BOX(0) is the set { 0 <= x }  )\n%    The parameters l and u may also be vectors or matrixes\n%    of the same size as x.\n%\n%    OP = PROJ_BOX returns an implementation of this projection.\n%\n% Dual function: prox_boxDual.m\n% See also prox_boxDual\n\n% warning: doesn't check to ensure l <= u\n\nerror(nargchk(1,2,nargin));\nif nargin < 2, u = []; end\n%op = @proj_Rplus_impl;\n% bugfix, March 2011:\nop = @(varargin)proj_Rplus_impl(l,u,varargin{:});\n\nfunction [ v, x ] = proj_Rplus_impl( l, u, x, t )\nv = 0;\nswitch nargin,\n\tcase 3,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n        end\n        if any( x < l ) || any( x > u )\n            v = Inf;\n        end\n\tcase 4,\n        if ~isempty(l)\n            x = max( x, l );\n        end\n        if ~isempty(u)\n            x = min( x, u );\n        end\n\totherwise,\n\t\terror( 'Wrong number of arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_boxAffine.m",
    "content": "function op = proj_boxAffine( a, l, u, alpha )\n%PROJ_BOXAFFINE(a,l,u,alpha)    Projection onto the box { l <= x <= u } intersected\n%    with the constraint a'*x == alpha\n%    If l or u is the empty matrix [], then the constraint is not\n%    enforced. \"a\" must be included (otherwise, use proj_box.m).\n%    The parameters l and u may also be vectors or matrixes\n%    of the same size as x.\n%    The offset \"alpha\" is optional (default is 0)\n%\n%    OP = PROJ_BOXAFFINE returns an implementation of this projection.\n%\n% See also proj_box, proj_affine, proj_singleAffine, prox_boxDual\nerror(nargchk(3,4,nargin));\nif isempty(l), l = -Inf(size(a)); end\nif isempty(u), u = Inf(size(a)); end\nif nargin < 4 || isempty(alpha), alpha = 0; end\n% % Not the most efficient, but least amount of coding work:\n% if isequal(size(l),[1,1]) && numel(a) > 1\n%     l   = l*ones(size(a));\n% end\n% if isequal(size(u),[1,1]) && numel(a) > 1\n%     u   = u*ones(size(a));\n% end\nop = @(varargin) proj_box_affine(a,l,u, alpha, varargin{:} );\n\n\nfunction [v,x] = proj_box_affine( a, l, u, alpha, y, t )\nv = 0;\nswitch nargin\n    case 5\n        if nargout == 2\n            error('This function is not differentiable.');\n        end\n        % Check if we are feasible\n        if any( y < l ) || any( y > u ) || abs( tfocs_dot(y,a) ) > 1e-13\n            v = Inf;\n        end\n    case 6\n        scalarL = ( numel(l) == 1 );\n        scalarU = ( numel(u) == 1 );\n        \n        n           = length(y);\n        if numel(y) > n\n            % It should work, but no 100% guarantees\n%             warning('TFOC:proj_boxAffine','Not extensively tested for matrix inputs; use at your own risk!'); \n            n   = numel(y);\n        end\n        projBox     = @(x) max( l, min( u, x ) );\n        % Turning points for constraints = l (l for lower)\n        T1 = (y-l)./a;\n        % Turning points for constraints = u (u for upper)\n        T2 = (y-u)./a;\n        T = sort(union(T1(:),T2(:)));\n        lwrBound = 1;\n        uprBound = 2*n;\n        for i = 1:ceil(log2(2*n))\n            indx    = round( (lwrBound+uprBound)/2 );\n            beta    = T(indx);\n            \n            % Our trial solution\n            x       = projBox( y - beta*a );\n            % Refine beta on the support (ignore constraints): see if it satisifies constraints\n            S       = find( x > l & x < u );\n            S1      = x==l;\n            S2      = x==u;\n\n            % Given the fixed points, we subtract these off, and resolve the\n            % plain affine projection problem on the active set\n            % The affine projection solun is always x = y - betaEst*a\n            %   for some betaEst.\n            \n%             betaEst = (a(S)'*y(S) + a(S2)'*u(S2) + a(S1)'*l(S1) )/(a(S)'*a(S));\n            % Or, so that we can allow u and l to be scalars,\n            if scalarL, al = sum(a(S1))*l; else al = a(S1)'*l(S1); end\n            if scalarU, au = sum(a(S2))*u; else au = a(S2)'*u(S2); end\n            betaEst = (a(S)'*y(S) + au + al - alpha )/(a(S)'*a(S));\n            \n            \n            % Check if bestEst is in the admissible range\n            % e.g. if betaEst > beta, is it less than T(indx+1)? and vice-versa\n            if betaEst > beta\n                if indx == 2*n || betaEst < T(indx+1)\n                    break;\n                else\n                    lwrBound = indx + 1; % we need to increase beta\n                end\n            else\n                if indx == 1 || betaEst > T(indx-1)\n                    break;\n                else\n                    uprBound = indx - 1; % we need to decrease beta\n                end\n            end\n        end\n        x       = projBox( y - betaEst*a );\n        S       = find( x > l & x < u );\n        S1      = x==l;\n        S2      = x==u;\n%         betaEst = (a(S)'*y(S) + a(S2)'*u(S2) + a(S1)'*l(S1) )/(a(S)'*a(S));\n        % Or, so that we can allow u and l to be scalars,\n        if scalarL, al = sum(a(S1))*l; else al = a(S1)'*l(S1); end\n        if scalarU, au = sum(a(S2))*u; else au = a(S2)'*u(S2); end\n        betaEst = (a(S)'*y(S) + au + al -alpha )/(a(S)'*a(S));\n        x       = projBox( y - betaEst*a );\n    otherwise\n        error( 'Wrong number of arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_conic.m",
    "content": "function op = proj_conic()\n%PROJ_CONIC\n%   Returns an operator implementing projection onto\n%   the second order cone, aka (real) Lorentz cone\n%   aka ice-cream cone\n%   That is,\n%       { x : norm( x(1:end-1) , 2) <= x(end) }\n%\n%   The cone is often written as\n%       { (x,t) : ||x|| <= t }\n%   so note that in this implementation, \"t\" is\n%   inferred from the final coordinate of x.\n%\n% Contributed by Joself Salmon 2013\n\nop = @proj_conic_impl;\n\nfunction [ v, x ] = proj_conic_impl( x, t )\nv = 0;\n[n,m]=size(x);\nsum_part=sqrt( sum(x(1:n-1).^2) );\nxn=(x(n));\n\nswitch nargin,\n\tcase 1,\n\t\tif nargout == 2\n\t\t\terror( 'This function is not differentiable.' );\n        elseif ( (sum_part)>xn )            \n            v = Inf;        \n        end\n\tcase 2,\n\n        if ( ((sum_part) -abs(xn))> 0 )\n            x=1/2*(1+xn/sum_part)*[x(1:n-1);sum_part];\n        \n        elseif ( (sum_part)<(xn) )\n            x=x;            \n        elseif ( (sum_part)<(-xn) )\n            x=zeros(n,m);\n        \n        end\n                    \n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_l1.m",
    "content": "function op = proj_l1( q, d )\n%PROJ_L1   Projection onto the scaled 1-norm ball.\n%    OP = PROJ_L1( Q ) returns an operator implementing the \n%    indicator function for the 1-norm ball of radius q,\n%    { X | norm( X, 1 ) <= q }. Q is optional; if omitted,\n%    Q=1 is assumed. But if Q is supplied, it must be a positive\n%    real scalar.\n%\n%    OP = PROJ_L1( Q, D ) uses a scaled 1-norm ball of radius q,\n%    { X | norm( D.*X, 1 ) <= 1 }. D should be the same size as X\n%    and non-negative (some zero entries are OK).\n%\n% Dual: prox_linf.m\n% See also: prox_linf, prox_l1, proj_linf\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\nif nargin < 2 || isempty(d) || numel(d)==1\n    if nargin>=2 && ~isempty(d)\n        % d is a scalar, so norm( d*x ) <= q is same as norm(x)<=q/d\n        if d==0\n            error('If d==0 in proj_l1, the set is just {0}, so use proj_0');\n        elseif d < 0\n            error('Require d >= 0');\n        end\n        q = q/d;\n    end\n    op = @(varargin)proj_l1_q(q, varargin{:} );\nelse\n    if any(d<0)\n        error('All entries of d must be non-negative');\n    end\n    op = @(varargin)proj_l1_q_d(q, d, varargin{:} );\nend\n\nfunction [ v, x ] = proj_l1_q( q, x, t )\nv = 0;\nswitch nargin,\ncase 2,\n\tif nargout == 2,\n\t\terror( 'This function is not differentiable.'  );\n\telseif norm( x(:), 1 ) > q,\n\t\tv = Inf;\n\tend\ncase 3,\n    s      = sort(abs(nonzeros(x)),'descend');\n    cs     = cumsum(s);\n    % ndx    = find( cs - (1:numel(s))' .* [ s(2:end) ; 0 ] >= q, 1 );\n    ndx    = find( cs - (1:numel(s))' .* [ s(2:end) ; 0 ] >= q+2*eps(q), 1 ); % For stability\n    if ~isempty( ndx )\n        thresh = ( cs(ndx) - q ) / ndx;\n        x      = x .* ( 1 - thresh ./ max( abs(x), thresh ) ); % May divide very small numbers\n    end\notherwise,\n    error( 'Not enough arguments.' );\nend\n\n% Allows scaling. Added Feb 21 2014\nfunction [ v, x ] = proj_l1_q_d( q, d,  x, t )\nv = 0;\nswitch nargin,\ncase 3,\n\tif nargout == 2,\n\t\terror( 'This function is not differentiable.'  );\n\telseif norm( d(:).*x(:), 1 ) > q,\n\t\tv = Inf;\n\tend\ncase 4,\n    [lambdas,srt]      = sort(abs(nonzeros(x./d)),'descend');\n    s   = abs(x(:).*d(:));  s = s(srt);\n    dd  = d(:).^2;          dd= dd(srt);\n    cs  = cumsum(s);\n    cd  = cumsum(dd);\n    ndx    = find( cs - lambdas.*cd >= q+2*eps(q), 1, 'first');\n    if ~isempty( ndx )\n        ndx     = ndx - 1;\n        lambda  = ( cs(ndx) - q )/cd(ndx);\n        x       = sign(x).*max( 0, abs(x) - lambda*d );\n    end\notherwise,\n    error( 'Not enough arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_l1l2.m",
    "content": "function op = proj_l1l2( q, rowNorms )\n\n%PROJ_L1L2    L1-L2 block norm: sum of L2 norms of rows.\n%    OP = PROJ_L1L2( q ) implements the constraint set\n%        {X | sum_{i=1:m} norm(X(i,:),2) <= 1 }\n%    where X is a m x n matrix.  If n = 1, this is equivalent\n%    to PROJ_L1. If m=1, this is equivalent to PROJ_L2\n%\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be positive and real and a scalar.\n%\n%   OP = PROJ_L1L2( q, rowNorms )\n%     will either do the sum of the l2-norms of rows if rowNorms=true\n%       (the default), or the sum of the l2-norms of columns if\n%       rowNorms = false.\n%\n%   Known issues: doesn't yet work with complex-valued data.\n%       Should be easy to fix, so email developers if this is\n%       needed for your problem.\n%\n% Dual: prox_linfl2.m [not yet available]\n% See also prox_l1l2.m, proj_l1.m, proj_l2.m\n\nif nargin == 0 || isempty(q),\n\tq = 1;\n% elseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\nelseif ~isnumeric( q ) || ~isreal( q ) || any(q <= 0) ||numel(q)>1,\n\terror( 'Argument must be positive and a scalar.' );\nend\n\nif nargin<2 || isempty(rowNorms)\n    rowNorms = true;\nend\n\nif rowNorms\n    op = tfocs_prox( @(x)f_rows(q,x), @(x,t)prox_f_rows(q,x,t) );\nelse\n    op = tfocs_prox( @(x)f_cols(q,x), @(x,t)prox_f_cols(q,x,t) );\nend\n\nfunction v = f_rows(tau,X)\n    nrm = sum( sqrt( sum( X.^2, 2 ) ) );\n    if nrm <= tau + 5*eps(tau)\n        v = 0;\n    else\n        v = Inf;\n    end\nend\nfunction v = f_cols(tau,X)\n    nrm = sum( sqrt( sum( X.^2, 1 ) ) );\n    if nrm <= tau + 5*eps(tau)\n        v = 0;\n    else\n        v = Inf;\n    end\nend\n\n\n\nfunction X = prox_f_rows(tau,X,t) \n  if nargin < 3,\n      error( 'Not enough arguments.' );\n  end\n  \n  nrms    = sqrt( sum( X.^2, 2 ) );\n  % When we include a row of x, corresponding to row y of Y,\n  % its contribution is norm(y)-lambda\n  % So we have sum_{i=1}^m max(0, norm(y_0)-lambda)\n  % So, basically project nrms onto the l1 ball...\n  s      = sort( nrms, 'descend' );\n  cs     = cumsum(s);\n  \n  ndx    = find( cs - (1:numel(s))' .* [ s(2:end) ; 0 ] >= tau+2*eps(tau), 1 ); % For stability\n  \n  if ~isempty( ndx )\n      thresh = ( cs(ndx) - tau ) / ndx;\n      %     x      = x .* ( 1 - thresh ./ max( abs(x), thresh ) ); % May divide very small numbers\n      \n      % Apply to relevant rows\n      d   = max( 0, 1-thresh./nrms );\n      m   = size(X,1);\n      X   = spdiags( d, 0, m, m )*X;\n  end\nend\n\nfunction X = prox_f_cols(tau,X,t) \n  if nargin < 3,\n      error( 'Not enough arguments.' );\n  end\n  \n  nrms    = sqrt( sum( X.^2, 1 ) ).';\n  % When we include a row of x, corresponding to row y of Y,\n  % its contribution is norm(y)-lambda\n  % So we have sum_{i=1}^m max(0, norm(y_0)-lambda)\n  % So, basically project nrms onto the l1 ball...\n  s      = sort( nrms, 'descend' );\n  cs     = cumsum(s);\n  \n  ndx    = find( cs - (1:numel(s))' .* [ s(2:end) ; 0 ] >= tau+2*eps(tau), 1 ); % For stability\n  \n  if ~isempty( ndx )\n      thresh = ( cs(ndx) - tau ) / ndx;\n      %     x      = x .* ( 1 - thresh ./ max( abs(x), thresh ) ); % May divide very small numbers\n      \n      % Apply to relevant rows\n      d   = max( 0, 1-thresh./nrms );\n      n   = size(X,2);\n      X   = X*spdiags( d, 0, n,n );\n  end\nend\n\n\n\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2015 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_l2.m",
    "content": "function op = proj_l2( q, b, A, opts)\n\n%PROJ_L2   Projection onto the scaled 2-norm ball.\n%    OP = PROJ_L2( Q ) returns an operator implementing the \n%    indicator function for the 2-norm ball of size q,\n%    { X | norm( X, 2 ) <= q }. Q is optional; if omitted,\n%    Q=1 is assumed. But if Q is supplied, it must be a positive\n%    real scalar.\n%       (There is experimental support for the case Q=diag(q) with q_i > 0,\n%        which requires a 1-dimensional search. This has not been\n%        carefully tested. In this case, the set is\n%        { X | norm( X./q, 2 ) <= 1  }  )\n%\n%    OP = PROJ_L2( Q, b ) represents the shifted set\n%     { X | norm( X - b, 2 ) <= q }\n%\n%    OP = PROJ_L2( Q, b, A ) represents the shifted-and-scaled set\n%     { X | norm( A*X - b, 2 ) <= q }\n%     Warning: this requires the SVD of A and a one-dimensional\n%     root-finding procedure, so it can be slow for large dimensional\n%     problems. You may want to use TFOCS_SCD.m and explicitly declare\n%     the linear operator (and offset/shift) which will avoid requiring\n%     the SVD (although if you can afford the SVD, calling this function\n%     with \"A\" may be faster since it can lead to fewer iterations in\n%     the overall optimization algorithm).\n%    OP = PROJ_L2( Q, b, A, opts )\n%     allows the user to fine-tine the settings of the 1-D search\n%     by changing parameters in the structure \"opts\"\n%\n%   If q=0, you should use proj_0 instead since it can be more efficient.\n%\n% Dual: prox_l2.m\n% See also: prox_l2.m\n\n% June 16 2014, adding support for offset \"b\" and scaling \"A\"\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q )\n\terror( 'Argument must be a real scalar.' );\nend\nif nargin < 2 || isempty(b)\n    b = 0;\nend\nif numel(q) == 1\n    if q==0, error('Argument \"q\" must be non-zero: use proj_0.m instead'); end\n    if q <= 0, error('Argument \"q\" must be positive'); end\n    if nargin >= 3\n        % Complicated case. We need SVD(A)\n        if nargin < 4, opts = []; end\n        disp('Now computing SVD of A. Please wait...');\n        [U,S,V] = svd(A,0);\n        disp('... done');\n        proj_l2_Aq(); % clear dual variable history\n        op = @(varargin)proj_l2_Aq( q, b, U,S,V,opts,varargin{:} );       \n    else\n        op = @(varargin)proj_l2_q( q, b, varargin{:} );\n    end\nelse\n    if any( abs(q) < 10*eps ), error('Weight \"q\" must be nonzero'); end\n    warning('TFOCS:experimental','Using experimental feature of TFOCS');\n    if nargin>=3\n        error('If q is a vector, cannot also have an arbitrary matrix scaling');\n    end\n    op = @(varargin)proj_l2_qVec( q, b, varargin{:} );\nend\nend% end of sub-routine\n\n% -- Subfunctions --\nfunction [ v, x ] = proj_l2_q( q, b,  x, t )\nv = 0;\nswitch nargin,\n\tcase 3,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n\t\telseif norm( x(:), 'fro' ) > q, % GKC fix 2013 (for > 2D arrays)\n\t\t\tv = Inf;\n\t\tend\n\tcase 4,\n        x   = x - b;\n        nrm = norm(x(:),'fro'); % fixing, Feb '11, and GKC fix 2013\n        if nrm > q\n            x = x .* ( q / nrm );\n        end\n        x   = x + b;\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\nend% end of sub-routine\n\n% -- experimental version for when q is a vector --\nfunction [ v, x ] = proj_l2_qVec( q, b,  x, t )\nv = 0;\nswitch nargin,\n\tcase 3,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n\t\telseif norm( x./q, 'fro' ) > 1,\n\t\t\tv = Inf;\n\t\tend\n\tcase 4,\n        x   = x - b;\n        nrm = norm(x./q,'fro');\n        if nrm > 1\n\n            % We know x is of the form x0./( 1 + lambda*D2 )\n            %   for some lambda > 0, but we don't have an easy\n            %   way to know what lambda is.  So, treat this as\n            %   a 1D minimization problem to find lambda.\n            D = 1./(q);\n            D2 = D.^2;\n            Dx = D.*x;\n            \n%             lMax  = max( abs(x./D2) )*sqrt(numel(x));\n            lMax  = 1.2*norm( abs(x./D2),'fro'); % a tighter bound\n            fmin_opts  = optimset( 'TolX', 1e-12 );\n%             MaxFunEvals: 500\n%                    MaxIter:\n            [lOpt,val,exitflag,output]    = ...\n                fminbnd( @(l) (norm(Dx./(1+l*D2),'fro')-1)^2, 0, lMax,fmin_opts);\n            if val > 1e-3, error('Proj_l2 failed to converge'); end\n            x       = x./( 1 + lOpt*D2 );\n        end\n        x   = x + b;\n        \n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\nend% end of sub-routine\n\nfunction [ v, x ] = proj_l2_Aq( q, b, U,S,V,opts, x, t )\npersistent dualVariable\nif nargin==0, dualVariable = []; return; end\nif isempty(dualVariable), dualVariable = 0; end % should be negative\n\nv = 0;\nswitch nargin,\n\tcase 7,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n\t\telseif norm( x(:), 'fro' ) > q\n\t\t\tv = Inf;\n\t\tend\n\tcase 8\n        opts = struct('lambda0',.999*dualVariable);\n        [x,projIter,dualVariable] = fastProjection(U,S,V,x,b,q,opts);\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\nend% end of sub-routine\n\n\n%% --------- The routine for the scaled case {x: ||Ax-b||<= q}\n\nfunction [x,k,l] = fastProjection( U, S, V, y, b, epsilon, opts )\n% [x,niter,lambda] = fastProjection(U, S, V, y, b, epsilon, opts )\n%\n% minimizes || x - y ||\n%   such that || Ax - b || <= epsilon\n%\n% where USV' = A (i.e the SVD of A)\n%\n% OPTS is a structure with the following (optional) parameters:\n%   .lambda0    Initial guess for the Lagrange parameter (should be negative)\n%   .disp       If true, displays some output. Default: false\n%   .tol        Tolerance. Default is 1e-8*epsilon\n%   .maxit      Maximum number of iterations for Newton's method\n%\n% Warning: for speed, does not calculate A(y) to see if x = y is feasible\n%\n% Algorithm: 1-dimensional line-search\n%\n% Written by Stephen Becker, September 2009, srbecker@caltech.edu\n%   for NESTA Version 1.1\n% Copied to TFOCS by Stephen Becker, June 2014. stephen.beckr@gmail.com\n\n% -- Parameters for Newton's method --\nif nargin < 7, opts = []; end\nif isfield(opts,'lambda0'), lambda0 = opts.lambda0; else lambda0 = 0; end\nif isfield(opts,'maxit'), MAXIT = opts.maxit; else MAXIT = 70; end\nif isfield(opts,'tol'), TOL = opts.tol; else TOL = 1e-8*epsilon; end\nif isfield(opts,'disp'), DISP = opts.disp; else DISP = false; end\n\nm = size(U,1);\nn = size(V,1);\nmn = min([m,n]);\nif numel(S) > mn^2, S = diag(diag(S)); end  % S should be a small square matrix\nr = size(S);\nif size(U,2) > r, U = U(:,1:r); end\nif size(V,2) > r, V = V(:,1:r); end\n\ns = diag(S);\ns2 = s.^2;\n\n% What we want to do:\n%   b = b - A*y;\n%   bb = U'*b;\n\n% if A doesn't have full row rank, then b may not be in the range, so\n%   treat this specially\nif size(U,1) > size(U,2)\n    bRange = U*(U'*b);\n    bNull = b - bRange;\n    epsilon = sqrt( epsilon^2 - norm(bNull)^2 );\nend\nb = U'*b - S*(V'*y);  % parenthesis is very important!  This is expensive.\n    \nb2 = abs(b).^2;  % for complex data\nbs2 = b2.*s2;\nepsilon2 = epsilon^2;\n\n% The following routine need to be fast\n% For efficiency (at cost of transparency), we are writing the calculations\n% in a way that minimize number of operations.  The functions \"f\"\n% and \"fp\" represent f and its derivative.\n\n% f = @(lambda) sum( b2 .*(1-lambda*s2).^(-2) ) - epsilon^2;\n% fp = @(lambda) 2*sum( bs2 .*(1-lambda*s2).^(-3) );\nl = lambda0; oldff = 0;\none = ones(m,1);\nalpha = 1;      % take full Newton steps\nfor k = 1:MAXIT\n    % make f(l) and fp(l) as efficient as possible:\n    ls = one./(one-l*s2);\n    ls2 = ls.^2;\n    ls3 = ls2.*ls;\n    ff = b2.'*ls2; % should be .', not ', even for complex data\n    ff = ff - epsilon2;\n    fpl = 2*( bs2.'*ls3 );  % should be .', not ', even for complex data\n%     ff = f(l);    % this is a little slower\n%     fpl = fp(l);  % this is a little slower\n    d = -ff/fpl;\n    if DISP, fprintf('%2d, lambda is %5.2f, f(lambda) is %.2e, f''(lambda) is %.2e\\n',...\n            k,l,ff,fpl ); end\n    if abs(ff) < TOL, break; end        % stopping criteria\n    l_old = l;\n    if k>2 && ( abs(ff) > 10*abs(oldff+100) )\n        l = 0; alpha = 1/2; \n        oldff = sum(b2); oldff = oldff - epsilon2;\n        if DISP, disp('restarting'); end\n    else\n        if alpha < 1, alpha = (alpha+1)/2; end\n        l = l + alpha*d;\n        oldff = ff;\n        if l > 0\n            l = 0;  % shouldn't be positive\n            oldff = sum(b2);  oldff = oldff - epsilon2;\n        end\n    end\n    if l_old == l && l == 0\n        if DISP, disp('Making no progress; x = y is probably feasible'); end\n        break;\n    end\nend\nif l < 0\n    xhat = -l*s.*b./( 1 - l*s2 );\n    x = V*xhat + y;\nelse\n    % y is already feasible, so no need to project\n    l = 0;\n    x = y;\nend\n\nend % end of sub-routine\n\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_l2group.m",
    "content": "function op = proj_l2group( q,group_indices )\n%PROJ_L2GROUP   Projection onto the intersection of scaled 2-norm balls.\n%    OP = PROJ_L2GROUP( Q, GROUP_INDICES ) returns an operator implementing the \n%    indicator function for the intersection of 2-norm ball of size q_k,\n%    i.e. intersection_k B_k\n%    where B_k = { X |  norm( X(indK) ) <= q(k) }\n%    and indK is indexed by group_indices. Group_indices keeps track\n%    of the last index in each index set.\n%    The index sets must be non-overlapping.\n%    For example, if K=2, and ind1 = 1:10 and ind2 = 11:20,\n%    then group_indices = [10,20].\n%    Q must be a vector of length K or a vector of length N.\n%\n% With contributions from Joseph Salmon\n%\n% See also: proj_l2.m\n\nif isempty(q), q = 1; end\n% Make sure q is a column vector\nif size(q,1) == 1 && size(q,2) > 1, q = q.'; end\nq = expand_q(q,group_indices);\nop = @(varargin)proj_l2_q( q,group_indices, varargin{:} );\nend\n\nfunction [ v, x ] = proj_l2_q( q,group_indices, x, t )\nv = 0;\nnrm=group_norm(x,group_indices);\n\nswitch nargin,\n\tcase 3,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n\t\telseif norm( nrm, 'inf') > q,\n\t\t\tv = Inf;\n\t\tend\n\tcase 4,            \n            x = x .* min(1,( q ./ nrm ));\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\nend\n\n\nfunction y=group_norm(x,group_indices)\n% the groups are indexed by their end point\n    K=length(group_indices);\n    y=zeros(size(x));\n    j=1; % start of the group\n    for k=1:K\n        end_point=group_indices(k);\n        y(j:end_point)=norm(x(j:end_point));\n        j=end_point+1;\n    end\nend\n\nfunction Q = expand_q(q,group_indices)\n% If we have 2 groups, each of size 10\n% (group_indices = [10,20]), then q should\n% be a vector of size 20. But it's more convenient\n% for the user to pass in a vector of size 2, so this function\n% will convert it...\nn = group_indices(end);\nK = length(group_indices);\nif length(q) < n\n    Q = ones(n,1);\n    j=1; % start of the group\n    for k=1:K\n        end_point=group_indices(k);\n        Q(j:end_point) = q(k);\n        j=end_point+1;\n    end\nelse\n    Q = q;\nend\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_linf.m",
    "content": "function op = proj_linf( q )\n\n%PROJ_LINF   Projection onto the scaled infinity norm ball.\n%    OP = PROJ_LINF( Q ) returns an operator implementing the \n%    indicator function for the infinity norm ball of size q,\n%    { X | norm( X, Inf ) <= q }. Q is optional; if omitted,\n%    Q=1 is assumed. But if Q is supplied, it must be a positive\n%    real scalar.\n% Dual: prox_l1.m\n% See also: prox_l1, prox_linf, proj_l1\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\nop = @(varargin)proj_linf_q( q, varargin{:} );\n\nfunction [ v, x ] = proj_linf_q( q, x, t )\nv = 0;\nswitch nargin,\n\tcase 2,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n\t\telseif norm( x(:), Inf ) > q,\n\t\t\tv = Inf;\n\t\tend\n\tcase 3,\t\t\t\n        x = x ./ max( 1, abs( x / q ) );\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_linfl2.m",
    "content": "function op = proj_linfl2( q )\n\n%PROJ_LINFL2   Projection of each row onto the scaled l2 norm ball.\n%    OP = PROJ_LINFL2( Q ) returns an operator implementing the \n%    indicator function for the set of l2 norm ball of size q,\n%    { X | for all rows i, norm( X(i,:),2) <= q }. Q is optional; if omitted,\n%    Q=1 is assumed. But if Q is supplied, it must be a positive\n%    real scalar.\n% Dual: prox_l1l2.m\n% See also: prox_l1, prox_linf, proj_l1\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\n\n% In r2007a and later, we can use bsxfun instead of the spdiags trick\nif exist('OCTAVE_VERSION','builtin')\n    vr = '2000';\nelse\n    vr=version('-release');\nend\nif str2num(vr(1:4)) >= 2007\n    op = @(varargin)proj_linfl2_q_bsxfun( q, varargin{:} );\nelse\n    % the default, using spdiags\n    op = @(varargin)proj_linfl2_q( q, varargin{:} );\nend\n\nfunction [ v, x ] = proj_linfl2_q( q, x, t )\nv = 0;\nswitch nargin,\n\tcase 2,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n\t\telseif norm( x(:), Inf ) > q,\n\t\t\tv = Inf;\n\t\tend\n\tcase 3,\t\t\t\n        % Compute the norms of the rows\n        m = size(x,1);\n        nrms = sqrt( sum( abs(x).^2 , 2 ) );\n        % Scale the rows using left diagonal multiplication\n        x = spdiags( min(1,q./nrms), 0, m, m )*x;\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\n\nfunction [ v, x ] = proj_linfl2_q_bsxfun( q, x, t )\nv = 0;\nswitch nargin,\n\tcase 2,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n\t\telseif norm( x(:), Inf ) > q,\n\t\t\tv = Inf;\n\t\tend\n\tcase 3,\t\t\t\n        nrms = sqrt( sum( abs(x).^2 , 2 ) );\n        bsxfun( @times, x, min(1,q./nrms) );\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_max.m",
    "content": "function op = proj_max( q )\n\n%PROJ_max   Projection onto the scaled max-function ball.\n%    OP = PROJ_MAX( Q ) returns an operator implementing the \n%    indicator function for the max-function ball of size q,\n%    { X | max( X(:) ) <= q }. Q is optional; if omitted,\n%    Q=1 is assumed. But if Q is supplied, it must be a \n%    real scalar (negative is OK).\n% Dual: prox_l1pos.m\n% See also: prox_l1pos, prox_linf, proj_l1, proj_linf\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 \n\terror( 'Argument \"q\" must be a real scalar.' );\nend\nop = @(varargin)proj_linf_q( q, varargin{:} );\n\nfunction [ v, x ] = proj_linf_q( q, x, t )\nv = 0;\nswitch nargin,\n\tcase 2,\n\t\tif nargout == 2,\n\t\t\terror( 'This function is not differentiable.' );\n\t\telseif max( x(:) ) > q,\n\t\t\tv = Inf;\n\t\tend\n\tcase 3,\t\t\t\n        x = min( x, q );\n\totherwise,\n\t\terror( 'Not enough arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_maxEig.m",
    "content": "function op = proj_maxEig( q, LARGESCALE )\n\n%PROJ_MAXEIG Projection onto the set of matrices with max eigenvalue less than or equal to q\n%    OP = PROJ_MAXEIG( q ) returns a function that implements the\n%    indicator for matrices with spectral norm less than q.\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied, \n%    it must be a positive real scalar.\n%    This function is similar proj_spectral.m but assumes that\n%    the input is real symmetric. For positive semi-definite inputs,\n%    this function is equivalent to proj_spectral\n%   OP = PROJ_MAXEIG( ..., largescale) will switch to using\n%    eigs instead of svd or eig, if largescale==true. This is usually\n%    beneficial for large, sparse variables.\n%\n% Dual: prox_trace(q)\n%   (if domain is pos. semidefinite matrices, then prox_trace(q)\n%    is also the dual, and is more efficient than prox_nuclear(q) ).\n%\n% See also prox_trace, prox_nuclear, proj_spectral, prox_spectral\n\n% Sept 1, 2012\nif nargin < 2 || isempty(LARGESCALE)\n    LARGESCALE  = false;\nend\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\n% vectorFunction = proj_linf( q ); % for proj_spectral.m\nvectorFunction = proj_max( q ); \n\nif LARGESCALE\n    % clear the persistent values:\n    proj_maxEig_eigs_q();\n    op = @(varargin)proj_maxEig_eigs_q( q,vectorFunction, varargin{:} );\nelse\n    op = @(varargin)proj_maxEig_eig_q( q,vectorFunction, varargin{:} );\nend\n\n\nfunction [ v, X ] = proj_maxEig_eig_q( q,eproj, X, t )\nSP  = issparse(X);\nv = 0;\nif nargin > 3 && t > 0,\n    if SP, X = full(X); end % svd, eig, and norm require full matrices\n    [V,D]   = safe_eig(X); % just in case X is sparse\n    [dum,D] = eproj(diag(D),q); % not q*t, since we are just projecting...\n    X       = V*diag(D)*V';\n    if SP, X = sparse(X); end\nelse\n    nrm = max(eig(X));\n    if nrm > q\n        v = Inf;\n    end\nend\n\n% --------------- largescale functions: use eigs or svds -----------------------\nfunction [ v, X ] = proj_maxEig_eigs_q( q,eproj, X, t )\npersistent oldRank\npersistent nCalls\npersistent V\nif nargin == 0, oldRank = []; v = nCalls; nCalls = []; V=[]; return; end\nif isempty(nCalls), nCalls = 0; end\nSP  = issparse(X);\nv = 0;\nif nargin > 3 && t > 0,\n    \n    if isempty(oldRank), K = 10;\n    else, K = oldRank + 2;\n    end\n    [M,N]   = size(X);\n    \n    ok = false;\n    opts = [];\n    opts.tol = 1e-10;\n    if isreal(X)\n        opts.issym = true;\n        SIGMA   = 'LA'; % not 'LM' like proj_spectral\n    else\n        SIGMA   = 'LR';\n    end\n    while ~ok\n        K = min( [K,M,N] );\n        if K > min(M,N)/2 || K > (min(M,N)-2) || min(M,N) < 20\n            [V,D]   = safe_eig(full((X+X')/2));\n            ok = true;\n        else\n            [V,D] = eigs( X, K, SIGMA, opts );\n            ok = (min(abs(diag(D))) < q) || ( K == min(M,N) );\n        end\n        if ok, break; end\n        K = 2*K;\n        if K > 10\n            opts.tol = 1e-6;\n        end\n        if K > 40\n            opts.tol = 1e-4;\n        end\n        if K > 100\n            opts.tol = 1e-3;\n        end\n    end\n    oldRank = length(find(diag(D) > q)); % no abs here\n    \n    [dum,D_proj] = eproj(diag(D),q);\n    % we want to keep the singular vectors that we haven't discovered\n    %   small = X - V*D*V'\n    %   large = V*D_proj*V'\n    % and add together to get X - V*(D-Dproj)*V'\n    \n    X       = X - V*diag(diag(D)-D_proj)*V';\n    \n    if SP, X = sparse(X); end\nelse\n%     if SP\n        opts = struct('tol',1e-8);\n        if isreal(X)\n            opts.issym = true;\n            SIGMA   = 'LA'; % not 'LM' like proj_spectral\n        else\n            SIGMA   = 'LR';\n        end\n        K = 1;\n        D = eigs( X, K, SIGMA , opts );\n        nrm = max(D);\n%     else\n%         nrm = max(eig(X));\n%     end\n    if nrm > q\n        v = Inf;\n    end\nend\n\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_nuclear.m",
    "content": "function op = proj_nuclear( q, sz )\n\n%PROJ_NUCLEAR  Projection onto the set of matrices with nuclear norm less than or equal to q.\n%    OP = PROJ_NUCLEAR( q ) returns a function that implements the\n%    indicator for matrices with nuclear norm less than q.\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied, \n%    it must be a positive real scalar.\n%    This function is like proj_psdUTrace.m but does not assume\n%    that inputs are square Hermitian positive semidefinite matrices.\n%\n%    OP = PROJ_NUCLEAR( ..., SZ )\n%    where SZ = [n1,n2], will assume the input has been vectorized\n%    and thus will reshape it into a matrix of size n1 x n2. TFOCS\n%    can handle matrix variables so this form of PROJ_NUCLEAR is not\n%    always necessary, but it can be easier to find bugs if using\n%    only vector variables.\n%\n% This version uses a dense svd decomposition; future versions\n% of TFOCS will take advantage of low-rank and/or sparse structure.\n% Dual function: prox_spectral.m\n% See also prox_spectral, proj_psdUTrace.m, proj_simplex.m, prox_nuclear.m\n\n% June 26, 2012\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\nif nargin < 2, sz = []; end\nq = proj_simplex( q );\nop = @(varargin)proj_nuclear_q( q, sz, varargin{:} );\n\nfunction [ v, X ] = proj_nuclear_q( eproj, sz, X, t )\n\nVECTORIZE = false;\n% Input must be a matrix\n\n% In proj_psdUTrace.m, we allow vector inputs because\n%   we can reshape them (since we have square matrices).\n%   For nuclear norm, inputs can be rectangular matrices,\n%   so we do not know how to correctly reshape a vector in\n%   this case.\n\n% if size(X,1) ~= size(X,2)\n%     n = sqrt(length(X));\n%     X = reshape(X, n, n );\n%     VECTORIZE   = true;\n% end\n\n% Update, Jan 2014, allowing vector variables, as long\n%   as the 'sz' variable has been given\nif ~isempty(sz)\n    if size(X,2) > 1\n        error('proj_nuclear: when using an explicit size value \"sz\", variable should be a vector');\n    end\n    X = reshape(X, sz(1), sz(2) );\n    VECTORIZE   = true;\nelseif size(X,2) == 1\n    warning('proj_nuclear: appears variable is a vector not a matrix. Are you sure you want the SVD of a vector?');\nend\n\nv = 0;\nif nargin > 3 && t > 0,\n    [U,D,V] = svd(X,'econ');\n    [dum,D] = eproj(diag(D),t);\n    tt = D > 0;\n    X  = U(:,tt)*diag(D(tt))*V(:,tt)';\n    if VECTORIZE, X = X(:); end\nelseif any(svd(X)<0),\n    v = Inf;\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_psd.m",
    "content": "function op = proj_psd( LARGESCALE, isReal, K )\n\n% PROJ_PSD  Projection onto the positive semidefinite cone.\n%   OP = PROJ_PSD() returns a function that implements\n%   the projection onto the semidefinite cone:\n%\tX = argmin_{min(eig(X))>=0} norm(X-Y,'fro')\n%\n%   OP = PROJ_PSD( LARGESCALE )\n%     performs the same computation, but in a more efficient\n%     manner for the case of sparse (and low-rank) matrices\n%\n%   OP = PROJ_PSD( LARGESCALE, isReal )\n%     also includes the constraint that X is real-valued if isReal is true.\n%\n% This function is self-dual.\n% See also proj_Rplus.m, the vector analog of this function\n\n% in the future, we might include this nonconvex version:\n%   OP = PROJ_PSD( LARGESCALE, isReal, k )\n%     only returns at most a rank k matrix\n%\n\nif nargin == 0 || isempty(LARGESCALE), LARGESCALE = false; end\nif nargin < 2 || isempty(isReal), isReal = false; end\nif nargin < 3,  K = Inf;  end\n\nif ~LARGESCALE\n    op = @(varargin)proj_psd_impl(isReal, varargin{:} );\nelse\n    proj_psd_largescale();  % reset any counters\n    op = @(varargin)proj_psd_largescale( K, isReal, varargin{:} );\nend\n\n\nfunction [ v, X ] = proj_psd_impl( isReal, X, t )\nif nargin > 2 && t > 0,\n\tv = 0;\n    X = full(X+X'); % divide by 2 later\n    if isReal, X = real(X); end\n    [V,D]=safe_eig(X); % we don't yet take advantage of sparsity here\n    D  = max(0.5*diag(D),0);\n    tt = D > 0;\n    V  = bsxfun(@times,V(:,tt),sqrt(D(tt,:))');\n    X  = V * V';\nelse\n    s = eig(full(X+X'))/2;\n    if min(s) < -8*eps*max(s),\n        v = Inf;\n    else\n    \tv = 0;\n   \tend\nend\n\n\nfunction [ v, X ] = proj_psd_largescale(Kignore,isReal, X, t )\n% Updated Sept 2012. The restriction to rank K \"Kignore\" has not been done yet\n% (that is nonconvex)\npersistent oldRank\npersistent nCalls\npersistent V\nif nargin == 0, oldRank = []; v = nCalls; nCalls = []; V=[]; return; end\nif isempty(nCalls), nCalls = 0; end\nSP  = issparse(X);\n\nif nargin > 3 && t > 0,\n\tv = 0;\n    if isempty(oldRank), K = 10;\n    else, K = oldRank + 2;\n    end\n\n    [M,N]   = size(X);\n    EIG_TOL         = 1e-10;\n    ok = false;\n    opts = [];\n    opts.tol = 1e-10;\n    if isreal(X)\n        opts.issym = true;\n        SIGMA       = 'LA';\n    else\n        SIGMA       = 'LR'; % largest real part\n    end\n    X = (X+X')/2;\n    if isReal, X = real(X); end\n    while ~ok\n        K = min( [K,N] );\n        if K > N/2 || K > N-2 || N < 20\n            [V,D]   = safe_eig(full((X+X')/2));\n            ok = true;\n        else\n            [V,D] = eigs( X, K, SIGMA, opts );\n            ok = (min(real(diag(D))) < EIG_TOL) || ( K == N );\n        end\n        if ok, break; end\n%         opts.v0     = V(:,1); % starting vector\n        K = 2*K;\n%         fprintf('Increasing K from %d to %d\\n', K/2,K );\n        if K > 10\n            opts.tol = 1e-6;\n        end\n        if K > 40\n            opts.tol = 1e-4;\n        end\n        if K > 100\n            opts.tol = 1e-3;\n        end\n    end\n    D   = real( diag(D) );\n    oldRank = length(find( D > EIG_TOL ));\n\n    tt = D > EIG_TOL;\n    V  = bsxfun(@times,V(:,tt),sqrt(D(tt,:))');\n    X  = V * V';\n    if SP, X = sparse(X); end\nelse\n    opts.tol = 1e-10;\n    if isreal(X)\n        opts.issym = true;\n        SIGMA       = 'SA';\n    else\n        SIGMA       = 'SR'; % smallest real part\n    end\n    K = 1; % we only want the smallest\n    X = full(X+X'); % divide by 2 later\n    if isReal, X = real(X); end\n    d = eigs(X, K, SIGMA, opts );\n    d = real(d)/2;\n    \n    if d < -10*eps\n        v = Inf;\n    else\n    \tv = 0;\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_psdUTrace.m",
    "content": "function op = proj_psdUTrace( q, LARGESCALE, force_real, maxK, Sigma )\n\n%PROJ_PSDUTRACE Projection onto the positive semidefinite cone with fixed trace.\n%    OP = PROJ_PSDUTRACE( q ) returns a function that implements the\n%    indicator for the cone of positive semidefinite (PSD) matrices with\n%    fixed trace: { X | min(eig(X+X'))>=0, trace(0.5*(X+X'))<=q\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied, \n%    it must be a positive real scalar. \n%\n%    OP = PROJ_PSDUTRACE( q, LARGESCALE) will use a Lanczos-based Eigenvalue\n%          decomposition if LARGESCALE==true, eitherwise it uses a dense\n%          matrix decomposition\n%\n%    OP = PROJ_PSDUTRACE( q, LARGESCALE, forceReal ) will also include the \n%         constraint that X is a real matrix if forceReal is true.\n%\n%    OP = PROJ_PSDUTRACE( q, LARGESCALE, forceReal, maxK ) will only\n%         use the Lanczos-solver if it expects fewer than maxK eigenvalues\n%\n%    OP = PROJ_PSDUTRACE( q, LARGESCALE, forceReal, maxK, Sigma ) \n%         offsets the objective function by trace(Sigma'*X), that is,\n%         the overall function is trace(Sigma'*X) s.t. X >= 0, tr(X)==q\n%\n%    CALLS = PROJ_PSDUTRACE( 'reset' )\n%         resets the internal counter and returns the number of function calls\n%\n% This version uses a dense eigenvalue decomposition; future versions\n% of TFOCS will take advantage of low-rank and/or sparse structure.\n%\n% If the input to the operator is a vector of size n^2 x 1, it will\n% be automatically reshaped to a n x n matrix. In this case,\n% the output will also be of length n^2 x 1 and not n x n.\n%\n% Note: proj_simplex.m (the vector-analog of this function)\n% Duals: the dual function is prox_maxEig, which also requires\n%   PSD inputs. The function prox_spectral(q,'sym') is also equivalent\n%   to prox_maxEig if given a PSD input.\n% See also prox_maxEig, prox_spectral, proj_simplex, prox_trace\n\n% Feb 15 2013, adding support for eigs calculations\n% Apr 14 2014, adding support for the offset Sigma\n\n\nif nargin == 1 && strcmpi(q,'reset')\n    op = prox_trace_impl;\n    return;\nend\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\nif nargin < 2, LARGESCALE = []; end\nif nargin < 3\n    force_real = false;\nend\nif nargin < 4 || isempty(maxK)\n    maxK    = 100;\nend\nif nargin < 5 \n    Sigma = [];\nend\nif ~isempty( LARGESCALE ) && LARGESCALE\n    op = @(varargin)proj_psdUTrace_q_eigs( q, maxK, force_real, Sigma, varargin{:} );\nelse\n    op = @(varargin)proj_psdUTrace_q( q, force_real, Sigma, varargin{:} );\nend\n\nfunction [ v, X ] = proj_psdUTrace_q_eigs( lambda, maxK, force_real, Sigma, X, t )\npersistent oldRank\npersistent nCalls\npersistent V\nif nargin == 0, oldRank = []; v = nCalls; nCalls = []; V=[]; return; end\nif isempty(nCalls), nCalls = 0; end\nif isempty(maxK), maxK = size(X,1); end\nif isempty(force_real), force_real = false; end\n\nVECTORIZE   = false;\nif size(X,1) ~= size(X,2)\n    %error('proj_psdUTrace requires a square matrix as input');\n    n = sqrt(length(X));\n    X = reshape(X, n, n );\n    VECTORIZE   = true;\nend\nv = 0;\nif ~isempty(Sigma) % added April 14 2014\n    X = X - t*Sigma;\nend\nX = full(0.5*(X+X')); % added 'full' Sept 5 2012\nif force_real % added Nov 23 2012\n    X = real(X);\nelse\n    is_real     = isreal(X);\nend\nif nargin > 5 && t > 0\n    \n    opts = [];\n    opts.tol = 1e-10;\n    if force_real || is_real\n        opts.issym = true; \n        SIGMA       = 'LA'; % get largest eigenvalues (NOT in magnitude)\n    else\n        SIGMA       = 'LR'; % should be real anyhow (to 1e-10). get largest real part\n    end\n    if isempty(oldRank), K = 10;\n    else, K = oldRank + 2;\n    end\n    N  = size(X,1);\n    ok = false;\n    ctr = 0;\n    FEASIBLE = false;\n    while ~ok\n        ctr   = ctr + 1;\n        K     = min( K, N );\n        if K > N/2 || K > maxK\n            [V,D] = safe_eig(X); ok = true;\n            D     = diag(D);\n            break;\n        end\n%         opts.tol = min(max(opts.tol,1e-10),1e-7);\n\n        [V,D] = eigs( X, K,SIGMA, opts );\n        D     = diag(D);\n        delta = ( sum(D) - lambda ) / K;\n        ok    = min(D) < delta;\n        \n        if ok, break; end\n        \n        % Can we do an early return? maybe we are already feasible\n        if sum(D) + (N-K-1)*min(D) < lambda\n%             disp('Point is feasible! exiting');\n            FEASIBLE = true;\n            break;\n        end\n        \n        % otherwise, increase K\n        \n        K = 2*K;\n        if K > 10\n            opts.tol = 1e-6;\n        end\n        if K > 40\n            opts.tol = 1e-4;\n        end\n        if K > 100\n            opts.tol = 1e-3;\n        end\n    end\n    if FEASIBLE\n        oldRank = N;\n    else\n        smplx   = proj_simplex(lambda);\n        [dum,D] = smplx(D,1);\n        spprt   = find(D);\n        D = diag(D(spprt));\n        V = V(:,spprt);\n        X = V*D*V';\n        oldRank     = length(spprt);\n    end\n    \n\n    nCalls = nCalls + 1;\n    if ~isempty(Sigma)\n        v = Sigma(:)'*X(:);\n    end\n    if VECTORIZE, X = X(:); end\nelseif any(eig(X)<0) || trace(X) > lambda\n    v = Inf;\nend\n\n\n\nfunction [ v, X ] = proj_psdUTrace_q( lambda, force_real, Sigma, X, t )\npersistent nCalls\nif nargin == 0, v = nCalls; nCalls = []; return; end\nif isempty(nCalls), nCalls = 0; end\n\neproj = proj_simplex( lambda );\n\nVECTORIZE   = false;\nif size(X,1) ~= size(X,2)\n    %error('proj_psdUTrace requires a square matrix as input');\n    n = sqrt(length(X));\n    X = reshape(X, n, n );\n    VECTORIZE   = true;\nend\nv = 0;\nif ~isempty(Sigma) % added April 14 2014\n    X = X - t*Sigma;\nend\nX = full(0.5*(X+X')); % added 'full' Sept 5 2012\nif force_real % added Nov 23 2012\n    X = real(X);\nend\nif nargin > 4 && t > 0,\n    nCalls = nCalls + 1;\n    [V,D]=safe_eig(X);\n    [dum,D] = eproj(diag(D),t);\n    tt = D > 0;\n    V  = bsxfun(@times,V(:,tt),sqrt(D(tt,:))');\n    X  = V * V';\n    if ~isempty(Sigma)\n        v = Sigma(:)'*X(:);\n    end\n    if VECTORIZE, X = X(:); end\nelseif any(eig(X)<0) || trace(X) > lambda\n    v = Inf;\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_simplex.m",
    "content": "function op = proj_simplex( q, EQ, VECTORIZE )\n\n%PROJ_SIMPLEX\tProjection onto the simplex.\n%    OP = PROJ_SIMPLEX( Q ) returns an nonsmooth function that\n%    represents the scaled simplex { x | x >= 0, sum(x) == q }.\n%    Q is optional; if not supplied, it defaults to 1. If it  is\n%    supplied, it must be a real positive scalar.\n%\n%    OP = PROJ_SIMPLEX( Q, EQ )\n%    controls whether the sum() constraint is an inequality or equality\n%    EQ = true (default) uses { x | x >= 0, sum(x) == q }.\n%    EQ = false          uses { x | x >= 0, sum(x) <= q }.\n%\n%    OP = PROJ_SIMPLEX( Q, EQ, VECTORIZE)\n%    controls how the function behaves if the input X has more than\n%    one column. If VECTORIZE=true (default), then we convert X to a \n%    long vector. If VECTORIZE=false, then we project each column\n%    separately.\n%\n%   See also proj_psdUTrace.m (the matrix-analog of this function)\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\nif nargin < 2 || isempty(EQ) , EQ = true; end % added 1/9/2016\nif nargin < 3 || isempty(VECTORIZE) , VECTORIZE = true; end % added 1/9/2016\nop = @(varargin)proj_simplex_q( q, EQ, VECTORIZE, varargin{:} );\n\nfunction [ v, x ] = proj_simplex_q( q, EQ, VECTORIZE, x, t )\nv = 0;\n\n% We have two options when input x is a matrix:\n%   Does the user want to treat it as x(:), i.e. \"vectorize\" it ?\n%   Or does the user want to treat each column separately?\n% Most other functions (e.g. l1, linf) treat it as x(:)\n% so that will be the default. However, we leave it\n% as a hard-coded option so that the user can change it\n% if they want.\n%  2016, changed to a parameter\n% VECTORIZE = true;\n\nif nargin > 4 && t > 0,\n\tif any( x(:) < 0 ) || any( sum( x ) > q ) || ( EQ && norm( sum( x ) - q)>1e-8/norm(q) ) \n        if VECTORIZE\n            s     = sort( x(:), 'descend' );\n        else\n            s     = sort( x, 'descend' );\n        end\n        if q < eps(s(1))\n            error('Input is scaled so large compared to q that accurate computations are difficult');\n            % since then cs(1) = s(1) - q is  not even guaranteed to be\n            % smaller than q !\n        end\n        if size(x,2) == 1 || VECTORIZE\n            cs    = ( cumsum(s) - q ) ./ ( 1 : numel(s) )';\n            ndx   = nnz( s > cs );\n            tau   = cs(ndx);\n            if ~EQ, tau = max( tau, 0 ); end\n            x     = max( x - tau, 0 );\n        else\n            % vectorized for several columns\n            cs    = diag( 1./( 1 : size(s,1) ) )*( cumsum(s) - q );\n            ndx   = sum( s > cs );\n            ndx   = sub2ind( size(x), ndx, 1:size(x,2)  );\n            tau   = cs(ndx);\n            if ~EQ, tau = max( tau, 0 ); end\n            x     = max( x - repmat(tau,size(x,1),1), 0 );\n        end\n\tend\n% Sept 6 2012, adding factor of 100 in the line below:\nelseif any( x(:) < 0 ) || any( abs( sum(x) / q - 1 ) > sqrt(numel(x)) * 100 *eps )\n    v = Inf;\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_singleAffine.m",
    "content": "function op = proj_singleAffine( a, beta, ineq )\n%PROJ_SINGLEAFFINE(a,beta)    Projection onto the affine set { x : a'*x == beta }\n%    The parameter a may be a vector or matrix\n%    of the same size as x. By default, beta is 0\n%PROJ_SINGLEAFFINE(a,beta,ineq)\n%    Projection onto the affine set { x : a'*x >= beta }\n%       if ineq == 1, and onto { x : a'*x <= beta } if ineq == -1\n%    Setting ineq == 0 (default) uses { x : a'*x == beta }\n%\n% For matrix variables, this interprets a'*x as a(:)'*x(:), e.g.,\n% the standard dot product\n%\n%    OP = PROJ_SINGLEAFFINE returns an implementation of this projection.\n%\n% For more than one affine constraint, see proj_affine.m\n%\n% See also proj_boxAffine and proj_affine\n\nerror(nargchk(1,3,nargin));\nif nargin < 2, beta = 0; end\nif isempty(beta), beta = 0; end\nif nargin < 3 || isempty(ineq), ineq = 0; end\nop = @(varargin) proj_affine_internal(a,beta,ineq, varargin{:} );\n\n\nfunction [v,x] = proj_affine_internal( a, beta, ineq, y, t )\nv = 0;\nswitch nargin\n    case 4\n        if nargout == 2\n            error('This function is not differentiable.');\n        end\n        % Check if we are feasible\n        if abs( tfocs_dot(y,a) - beta ) > 1e-13\n            v = Inf;\n        end\n    case 5\n        dt  = tfocs_dot(a,y);\n        if (ineq==0) || ( ineq==1 && dt < beta ) || (ineq==-1 && dt > beta)\n            x   = y - ( dt - beta )/tfocs_dot(a,a) * a;\n        else\n            x   = y;\n        end\n    otherwise\n        error( 'Wrong number of arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/proj_spectral.m",
    "content": "function op = proj_spectral( q, SYM_FLAG, LARGESCALE )\n\n%PROJ_SPECTRAL Projection onto the set of matrices with spectral norm less than or equal to q\n%    OP = PROJ_SPECTRAL( q ) returns a function that implements the\n%    indicator for matrices with spectral norm less than q.\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied, \n%    it must be a positive real scalar.\n%    This function is like proj_psdUTrace.m but does not assume\n%    that inputs are square Hermitian positive semidefinite matrices.\n%   OP = PROJ_SPECTRAL( q, 'sym' ) or OP = PROJ_SPECTRAL( 'eig' )\n%    will instruct the code that the matrix is Hermitian and \n%    therefore the relations between singular- and eigen-values\n%    are well known, and the code will use the more efficient\n%    eigenvalue decomposition (instead of the SVD).\n%   OP = PROJ_SPECTRAL( ..., largescale) will switch to using\n%    svds (or PROPACK, if installed and in the path) or eigs\n%    instead of svd or eig, if largescale==true. This is usually\n%    beneficial for large, sparse variables.\n%\n% Dual: prox_nuclear(q)\n%   (if domain is pos. semidefinite matrices, then prox_trace(q)\n%    is also the dual, and is more efficient than prox_nuclear(q) ).\n%\n% See also prox_nuclear, proj_linf, proj_nuclear, prox_spectral, proj_maxEig\n\n% Sept 1, 2012\nif nargin < 3 || isempty(LARGESCALE)\n    LARGESCALE  = false;\nend\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\nvectorFunction = proj_linf( q );\nif nargin >= 2 && ( ...\n        ~isempty(strfind(lower(SYM_FLAG),'eig')) || ...\n        ~isempty(strfind(lower(SYM_FLAG),'sym')) )\n    if LARGESCALE\n        % clear the persistent values:\n        proj_spectral_eigs_q();\n        op = @(varargin)proj_spectral_eigs_q( q,vectorFunction, varargin{:} );\n    else\n        op = @(varargin)proj_spectral_eig_q( q,vectorFunction, varargin{:} );\n    end\nelse\n    if LARGESCALE\n        % clear the persistent values:\n        proj_spectral_svds_q();\n        op = @(varargin)proj_spectral_svds_q( q,vectorFunction, varargin{:} );\n    else\n        op = @(varargin)proj_spectral_svd_q( q,vectorFunction, varargin{:} );\n    end\nend\n\nfunction [ v, X ] = proj_spectral_svd_q( q,eproj, X, t )\nsx = size( X );\nSP = issparse(X);\nif length( sx ) > 2,\n    X = reshape( X, prod(sx(1:end-1)), sx(end) );\nend\nv = 0;\nif nargin > 3 && t > 0,\n    if SP, X = full(X); end % svd, eig, and norm require full matrices\n    [U,D,V] = svd( X, 'econ' );\n    [dum,D] = eproj(diag(D),q); % not q*t, since we are just projecting...\n    X       = U*diag(D)*V';\n    if SP, X = sparse(X); end\n    X = reshape( X, sx );\nelse\n    if SP, \n        [nrm,cnt] = normest(X,1e-3);\n    else\n        nrm = norm(X);\n    end\n    if nrm > q\n        v = Inf;\n    end\nend\n\nfunction [ v, X ] = proj_spectral_eig_q( q,eproj, X, t )\nSP  = issparse(X);\nv = 0;\nif nargin > 3 && t > 0,\n    if SP, X = full(X); end % svd, eig, and norm require full matrices\n    [V,D]   = safe_eig(X); % just in case X is sparse\n    [dum,D] = eproj(diag(D),q); % not q*t, since we are just projecting...\n    X       = V*diag(D)*V';\n    if SP, X = sparse(X); end\nelse\n    if SP, [nrm,cnt] = normest(X,1e-3);\n    else nrm = norm(X); \n    end\n    if nrm > q\n        v = Inf;\n    end\nend\n\n% --------------- largescale functions: use eigs or svds -----------------------\nfunction [ v, X ] = proj_spectral_eigs_q( q,eproj, X, t )\npersistent oldRank\npersistent nCalls\npersistent V\nif nargin == 0, oldRank = []; v = nCalls; nCalls = []; V=[]; return; end\nif isempty(nCalls), nCalls = 0; end\nSP  = issparse(X);\nv = 0;\nif nargin > 3 && t > 0,\n    \n    if isempty(oldRank), K = 10;\n    else, K = oldRank + 2;\n    end\n    [M,N]   = size(X);\n    \n    ok = false;\n    opts = [];\n    opts.tol = 1e-10;\n    if isreal(X)\n        opts.issym = true;\n    end\n    while ~ok\n        K = min( [K,M,N] );\n        [V,D] = eigs( X, K, 'LM', opts );\n        ok = (min(abs(diag(D))) < q) || ( K == min(M,N) );\n        if ok, break; end\n        K = 2*K;\n        if K > 10\n            opts.tol = 1e-6;\n        end\n        if K > 40\n            opts.tol = 1e-4;\n        end\n        if K > 100\n            opts.tol = 1e-3;\n        end\n        if K > min(M,N)/2\n            [V,D]   = safe_eig(full((X+X')/2));\n            ok = true;\n        end\n    end\n    oldRank = length(find(abs(diag(D)) > q));\n    \n    [dum,D_proj] = eproj(diag(D),q);\n    % we want to keep the singular vectors that we haven't discovered\n    %   small = X - V*D*V'\n    %   large = V*D_proj*V'\n    % and add together to get X - V*(D-Dproj)*V'\n    \n    X       = X - V*diag(diag(D)-D_proj)*V';\n    \n    if SP, X = sparse(X); end\nelse\n    if SP, [nrm,cnt] = normest(X,1e-3);\n    else nrm = norm(X); \n    end\n    if nrm > q\n        v = Inf;\n    end\nend\n\n\nfunction [ v, X ] = proj_spectral_svds_q( q,eproj, X, t )\npersistent oldRank\npersistent nCalls\npersistent V\nif nargin == 0, oldRank = []; v = nCalls; nCalls = []; V=[]; return; end\nif isempty(nCalls), nCalls = 0; end\nSP  = issparse(X);\nv = 0;\nif nargin > 3 && t > 0,\n    \n    if isempty(oldRank), K = 10;\n    else, K = oldRank + 2;\n    end\n    [M,N]   = size(X);\n    \n    ok = false;\n    opts = [];\n    opts.tol = 1e-10; % the default in svds\n    opt  = [];\n    opt.eta = eps; % makes compute_int slow\n    opt.delta = 10*opt.eta;\n    while ~ok\n        K = min( [K,M,N] );\n        if exist('lansvd','file')\n            [U,D,V] = lansvd(X,K,'L',opt );\n        else\n            [U,D,V] = svds(X,K,'L',opts);\n        end\n        ok = (min(abs(diag(D))) < q) || ( K == min(M,N) );\n        if ok, break; end\n        K = 2*K;\n        if K > 10\n            opts.tol = 1e-6;\n        end\n        if K > 40\n            opts.tol = 1e-4;\n        end\n        if K > 100\n            opts.tol = 1e-3;\n        end\n        if K > min(M,N)/2\n            [U,D,V] = svd( full(X), 'econ' );\n            ok = true;\n        end\n    end\n    oldRank = length(find(abs(diag(D)) > q));\n    \n    [dum,D_proj] = eproj(diag(D),q);\n    X       = X - U*diag(diag(D)-D_proj)*V';\n    \n    if SP, X = sparse(X); end\nelse\n    if SP, [nrm,cnt] = normest(X,1e-3);\n    else nrm = norm(X); \n    end\n    if nrm > q\n        v = Inf;\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_0.m",
    "content": "function op = prox_0\n\n%PROX_0    The zero proximity function:\n%    OP = PROX_0 returns an implementation of the function OP(X) = 0. Use\n%    this function to specify a model with no nonsmooth component. It is\n%    identical to both PROJ_Rn and SMOOTH_CONSTANT( 0 ).\n% Dual: proj_0.m\n\nop = smooth_constant( 0 );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_Sl1.m",
    "content": "function op = prox_Sl1( lambda )\n%PROX_SL1    Sorted/Ordered L1 norm.\n%    OP = PROX_L1( lambda ) implements the nonsmooth function\n%        OP(X) = sum(lambda.*sort(abs(X),'descend'))\n%    where lambda is strictly positive and sorted in decreasing order,\n%    in which case this function is a norm (and hence convex).\n%    If lambda is a scalar, it will be expanded to all elements, but in this\n%    case it is equivalent to the (scaled) usual l1 norm.\n%    \n%    Notice: this function uses mex files. Some pre-compiled binaries\n%       for common systems are included; if these do not work for you,\n%       then please install yourself. In the mexFiles/ subdirectory,\n%       run the file \"makeMex.m\"\n% Reference:\n%  http://www-stat.stanford.edu/~candes/OrderedL1/\n% \"Statistical Estimation and Testing via the Ordered L1 Norm\"\n% by M. Bogdan, E. van den Berg, W. Su, and E. J. Candès\n% 2013\n%\n% See also prox_l1.m, makeMex.m\n\nif nargin == 0,\n\tlambda = 1;\nelseif ~isnumeric( lambda ) || ~isreal( lambda ) ||  any( lambda <= 0 ) \n\terror( 'Argument lambda must have all positive entries.' );\nend\nif ~issorted(flipud(lambda(:)))\n    error( 'Argument lambda must be sorted in decreasing order.');\nend\nif numel(lambda)==1\n    warning('TFOCS:prox_SL1','When lambda is a scalar, we recommend prox_l1.m instead pf prox_SL1.m');\nend\n\n\n% The mex file is in the child directory mexFiles/\n% Check for its existence. First, add the right paths\naddpath(fullfile(tfocs_where,'mexFiles'));\nif 3 ~= exist('proxAdaptiveL1Mex','file')\n    makeMex;\n    % check that it worked\n    if 3 ~= exist('proxAdaptiveL1Mex','file')\n        disp('Compilation of mex files for prox_SL1.m failed; please report this error');\n    end\nend\n\nf       = @(x) sum( lambda(:) .* sort(abs(x(:)), 'descend') );\nprox_f  = @(x,t) proxOrderedL1(x,t.*lambda);\n\nop      = tfocs_prox( f, prox_f , 'vector' ); % Allow vector stepsizes\n\n\nend\n\n% -- subroutines --\nfunction x = proxOrderedL1(y,lambda)\n    % Normalization\n    lambda = lambda(:);\n    y      = y(:);\n    sgn    = sign(y);\n    [y,idx] = sort(abs(y),'descend');\n    \n    % Simplify the problem\n    k = find(y > lambda,1,'last');\n    \n    % Compute solution and re-normalize\n    n = numel(y);\n    x = zeros(n,1);\n    \n    if (~isempty(k))\n        v1 = y(1:k);\n        if numel(lambda) > 1\n            v2 = lambda(1:k);\n        else\n            v2 = lambda*ones(k,1); % if lambda is a scalar, implicity make it lambda*ones(size(y))\n        end\n        v = proxAdaptiveL1Mex(v1,v2);\n        x(idx(1:k)) = v;\n    end\n    \n    % Restore signs\n    x = sgn .* x;\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_boxDual.m",
    "content": "function op = prox_boxDual(l,u,scale)\n%PROX_BOXDUAL    Dual function of box indicator function { l <= x <= u }\n%PROX_BOXDUAL(l,u)    Dual function of box indicator function { l <= x <= u }\n%    If l or u is the empty matrix [], then the constraint is not\n%    enforced (e.g. PROJ_BOXDUAL([],1) is the set { x <= 1 },\n%       and PROJ_BOXDUAL(0) is the set { 0 <= x }  )\n%    The parameters l and u may also be vectors or matrixes\n%    of the same size as x.\n%\n%    OP = PROJ_BOXDUAL returns an implementation of this projection.\n%\n%   ... = PROJ_BOXDUAL( l, u, -1 )\n%       will return an implementation of the projection composed\n%       with the operator x --> -x.  This is the form that TFOCS\n%       expects for the \"conjnegeF\" term.\n%\n%   See also proj_box, proj_Rplus\n\n% the dual itself if g(x) = max( u*x, l*x )\n%                         = { u*x, if x>=0;  v*x if x<0 }\n% so the prox of the dual is\n%   prox_{t*g}(x)   = { x - t*u, (value is u*x), if x >= u*t\n%                     { x - t*l, (value is l*x), if x <= l*t\n%                     { 0, (value is 1/t*x^2), otherwise\n\n\nerror(nargchk(1,3,nargin));\nif nargin < 3, scale = 1;\nelse\n    if ~isscalar(scale) || ( scale ~= 1 && scale ~= -1 )\n        error('\"scale\" must be either +1 or -1');\n    end\nend\nif nargin < 2, u = []; end\n% check that l <= u\nif ~isempty(l) && ~isempty(u)\n    if ~all( l <= u )\n        error('for box constraints, need  l <= u ');\n    end\nend\nif isempty(l), l = -Inf; end\nif isempty(u), u =  Inf; end\n\nop = @(varargin)proj_RplusDual_impl(l,u,scale,varargin{:});\n\nfunction [ v, xOut ] = proj_RplusDual_impl( l, u, scale,  x, t )\n    if scale ~= 1\n        x = scale*x;\n    end\nswitch nargin,\n\tcase 4,\n        if nargout == 2,\n            error( 'This function is not differentiable.' );\n        end\n        v = sum(sum(max( l.*x, u.*x )));\n\tcase 5,\n        xOut    = zeros( size(x) );\n        if ~isempty(l)\n            indx1 = find( x < t*l );\n            if isscalar(l)\n                xOut( indx1 ) = x( indx1 ) - t*l;\n            else\n                xOut( indx1 ) = x( indx1 ) - t*l( indx1 );\n            end\n        end\n        if ~isempty(u)\n            indx2 = find( x > t*u );\n            if isscalar(u)\n                xOut( indx2 ) = x( indx2 ) - t*u;\n            else\n                xOut( indx2 ) = x( indx2 ) - t*u( indx2 );\n            end\n        end\n        % and implicity, if l/t < x < u/t, then xOut is 0\n        \n        v = sum(sum( max( l.*xOut, u.*xOut ) )); \n        \n        % Bug fixed 3/23/2016, thanks to Carl Nettelblad for noticing\n        if scale ~= 1\n            xOut    = scale*xOut;\n        end\n\totherwise,\n\t\terror( 'Wrong number of arguments.' );\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_diag.m",
    "content": "function op = prox_diag( funcF, funcG, n )\n\n%PROX_DIAG Shift a proximity/projection function\n%    PROX_DIAG = PROX_DIAG( funcF, funcG, n )\n%       returns an implementation of the proximity operator\n%       defined by F( x(1:n) ) + G( x(n+1:end) )\n%\n%   For now, both F and G must accept vector inputs (not matrices)\n%   (and this only works for 2 functions; to apply to 3 or more functions,\n%    repeatedly apply this function recursively).\n%\n\n% Introduced June 2016\n\nerror(nargchk(3,3,nargin));\nif ~isa( funcF, 'function_handle' ),\n    error( 'The first argument must be a function handle.' );\nelseif ~isa( funcG, 'function_handle' ), \n    error( 'The second argument must be a function handle.' );\nend\nop = @(varargin)prox_diag_impl( funcF, funcG, n, varargin{:} );\n\n\nfunction [ v, x ] = prox_diag_impl( prox_f, prox_g, n, x, t )\n\n    if nargin < 4,\n        error( 'Not enough arguments.' );\n    end\n    if nargin == 5,\n        if numel(t) ~= 1\n            error('The stepsize must be a scalar'); \n        end\n        [v1,x(1:n)]      = prox_f(x(1:n),t);\n        [v2,x(n+1:end)]  = prox_g(x(n+1:end),t);\n        v      = v1 + v2;\n    elseif nargout == 2,\n        error( 'This function is not differentiable.' );\n    end\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2015 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_dualize.m",
    "content": "function op = prox_dualize( dualProx, NEG )\n%PROX_DUALIZE   Define a proximity function by its dual\n%    OP = PROX_DUALIZE( dualOp ) returns an operator implementing the \n%    dual of the function dualProx. You can verify they are duals\n%    via test_proxPair( dualOp, OP ).\n%\n%    OP = PROX_DUALIZE( dualOp, 'neg' )\n%    OP = PROX_DUALIZE( dualOp, 'negative' )\n%       will return the scaled dual of dualOp; that is,\n%       dualOp(x) and OP(-x) are duals.\n%       The negative is useful because this is the version TFOCS\n%       expects for the SCD formulation.\n%       For 1-homogenous functions (e.g. norms), this has no effect,\n%       since ||x|| = ||-x||.\n%\n% Warning: if you can calculate the dual function explicitly,\n%   it is likely more computationally efficient to do so, rather\n%   than rely on this code. This code requires some tricks, some\n%   of which can sometimes be expensive; also, it will call dualOp\n%   so it is at least as slow as dualOp; and it may require high\n%   precision from dualOp. This code can break down if dualOp\n%   is not numerically stable.\n\nif nargin < 2, NEG = ''; end\nif strcmpi(NEG,'neg') || strcmpi(NEG,'negative')\n    op = @(varargin)dualize(dualProx,-1,varargin{:} );\nelse\n    op = @(varargin)dualize(dualProx,1,varargin{:} );\nend\n\nfunction [ v, x ] = dualize( dualProx, scale, x, t )\nvec     = @(x) x(:);\nmyDot   = @(x,y) x(:)'*y(:);\nif scale == -1\n    x   = -x;\nend\nswitch nargin,\n    case 3\n        if nargout == 2,\n            error( 'This function is not differentiable.'  );\n        else\n            % This case is a bit tricky...\n            %   If the function is non-differentiable, then standard exact\n            %   penalty function results tell us that for a sufficiently\n            %   small stepsize, we can remove the effect of smoothing.\n            %   In other cases, we don't have an exact value, but we hope this\n            %   is a reasonable approximation.\n            \n%             t       = 1e-15;\n%             [~,x2]  = dualProx( x/t, 1/t );\n%             v       = myDot(x,x2) - dualProx( x2 );\n            \n            % However, some functions break down when 1/t is huge\n            % So we will slowly decrease it\n            vOld    = Inf;\n            t       = 1e-5;\n            ok      = false;\n            iter    = 0;\n            while ~ok && t > eps\n                [~,x2]  = dualProx( x/t, 1/t );\n                v       = myDot(x,x2) - dualProx( x2 );\n                if abs(v-vOld)/max( 1e-10, abs(v) ) < 1e-4\n                    % due to exact penalty, we expect that\n                    %   for t < t_cutoff, v=vOld up to machine accuracy\n                    ok = true;\n                else\n                    t   = t/10;\n                    vOld = v;\n                    iter = iter + 1;\n                    %fprintf('%d and v is %.2e\\n', iter, v );\n                end\n            end\n            \n        end\n        \n    case 4\n        % This is exact.\n        [ignore,x2]  = dualProx( x/t, 1/t );\n        x1      = x - t*x2; % Moreau's identity, equation (8.1) in the user guide\n        v       = myDot(x1,x2) - dualProx( x2 );\n        \n        % If we think it is an indicator function, then round down to zero:\n        if abs(v) < 100*eps,\n            v  = 0;\n        end\n        x   = scale*x1;\n        \n    otherwise,\n        error( 'Not enough arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_hinge.m",
    "content": "function op = prox_hinge( q , r, y)\n\n%PROX_HINGE    Hinge-loss function.\n%    OP = PROX_HINGE( q , r, y ) implements the nonsmooth function\n%        OP(X) = q * sum( max( r - y.*x, 0 ) ).\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be a positive real scalar.\n%    R is also optional; if omitted, R = 1 is assumed. R may be any real number.\n%    Y is also optional; if omitted, Y = 1 is assumed. Y may be any scalar\n%       or vector of the same size as X\n% Dual: prox_hingeDual.m\n%\n% See also PROX_HINGEDUAL\n\nif nargin < 3\n    y = [];\nelseif ~isempty(y) && ( ~isnumeric(y) || ~isreal(y) )\n    error( 'Argument 3 must be a real vector');\nend\nif nargin < 2\n\tr = 1;\nelseif ~isnumeric( r ) || ~isreal( r ) %|| numel( r ) ~= 1\n\terror( 'Argument 2 must be real.' );\nend\nif nargin < 1\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument 1 must be positive.' );\nend\n\nif isempty(y) \n    op = tfocs_prox( @(x)hinge(x,r,q), @(x,t)prox_hinge(x,t,r,q) );\nelse\n    ry  = r./y;\n    op = tfocs_prox( @(x)hingeY(x,r,q,y), @(x,t)prox_hingeY(x,t,r,q,ry,y) );\nend\n\n\n% -- the actual functions --\n\nfunction v = hingeY(x,r,q,y)\n    if ~isscalar(r), assert( numel(r) == numel(x),'r is wrong size' ); end\n    if ~isscalar(y), assert( numel(y) == numel(x),'y is wrong size'); end\n    v = q*sum( max( r(:) - y(:).*x(:), 0 ) );\nend\nfunction v = hinge(x,r,q)\n    if ~isscalar(r), assert( numel(r) == numel(x),'r is wrong size' ); end\n    v = q*sum( max( r(:) - x(:), 0 ) );\nend\n\n\n%   PROX_F( Y, t ) = argmin_X  F(X) + 1/(2*t)*|| X - Y ||^2\nfunction x = prox_hinge(x,t,r,q)  \n    tq = t * q;\n    x = r + (x-r).*( x > r ) + (x + tq - r).*( x + tq < r  );\nend\n%{\n    in the q = r = t = 1 case, the prox is:\nprox(x) = {     x, if x > 1\n                1, if x <= 1, and x > 0\n                x + q, if x <= 0\n%}\n\nfunction x = prox_hingeY(x,t,r,q,ry,y)  \n    tq = t * q;\n    x = ry + (x-ry).*( y.*x > r ) + (x + tq*y - ry).*( y.*(x + tq*y) < r );\nend\n\n\nend\n\n% Added Feb, 2011; modified Dec, 2011\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_hingeDual.m",
    "content": "function op = prox_hingeDual( q , r, y)\n\n%PROX_HINGEDUAL    Dual function of the Hinge-loss function.\n%    OP = PROX_HINGEDUAL( q , r , y) implements the nonsmooth function\n%        that is dual to the Hinge-loss function f, where \n%        f(x) = q * sum( max( r - y.*x, 0 ) ).\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be a positive real scalar.\n%    R is also optional; if omitted, R = 1 is assumed. R may be any real scalar.\n%\n%   There is a simple form for the dual and its proximity operator.\n%   In the case q = r = 1, the dual is:\n%       f^*(y) = { +y, if y >= -1 and y <= 0\n%                { +Inf, otherwise\n%\n% See also PROX_HINGE\n%\n%   Note: if the primal is PROX_HINGE( q, r, y )\n%       then TFOCS expects conjnegF to be PROX_HINGEDUAL( q, r, -y)\n%       (the -y is because the conjugate should be composed\n%        with the function x --> -x )\n\nif nargin < 3\n    y = [];\nelseif ~isempty(y) && ( ~isnumeric(y) || ~isreal(y) )\n    error( 'Argument 3 must be a real vector');\nend\nif nargin < 2 || isempty(r)\n\tr = 1;\nelseif ~isnumeric( r ) || ~isreal( r ) %|| numel( r ) ~= 1\n\terror( 'Argument must be real.' );\nend\nif nargin < 1 || isempty(q)\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\n\nif isempty(y)\n    if isscalar(r)\n        sumXR = @(x) r*sum(x);\n    else\n        sumXR = @(x) x'*r;\n    end\n    op = tfocs_prox( @(x)hingeDual(x,q,sumXR), @(x,t)prox_hingeDual(x,t,r,q) );\nelse\n    ry  = r./y;\n    qy  = -q.*abs(y);\n    sy  = sign(y);\n    if isscalar(r) && isscalar( y )\n        sumXR = @(x) ry*sum(x);\n    else\n        sumXR = @(x) x'*ry;\n    end\n    op = tfocs_prox( @(x)hingeDualY(x,sy,qy,sumXR), @(x,t)prox_hingeDualY(x,t,sy,ry,qy) );\nend\n\n\nfunction v = hingeDual(x,q,sumXR)\n    feasible = ( x >= -q & x <= 0 );\n    if any( ~feasible )\n        v = Inf;\n        return;\n    end\n%     v = sum( x*r );\n    v = sumXR( x );\n%     v = sum( x*r.*( feasible ) + Inf.*( ~feasible ) );  % 0*Inf leads to NaN. bad!\nend\n\nfunction v = hingeDualY(x,sy,qy,sumXR)\n%     feasible = ( sign(y).*x >= -q.*abs(y) & sign(y).*x <= 0 );\n    feasible = ( sy.*x >= qy & sy.*x <= 0 ); % using precomputed vectors\n    if any( ~feasible )\n        v = Inf;\n        return;\n    end\n%     v = sum( x.*ry );\n    v = sumXR(x);\nend\n\n\n%   PROX_F( Y, t ) = argmin_X  F(X) + 1/(2*t)*|| X - Y ||^2\nfunction x = prox_hingeDual(x,t,r,q)  \n    x = max( min( x - t*r, 0), -q );\nend\nfunction x = prox_hingeDualY(x,t,sy,ry,qy)  \n    x = sy.*max( min( sy.*(x - t*ry), 0), qy );\nend\n\n\nend\n\n% Added Feb, 2011; support for y added Dec 2011\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_l1.m",
    "content": "function op = prox_l1( q )\n\n%PROX_L1    L1 norm.\n%    OP = PROX_L1( q ) implements the nonsmooth function\n%        OP(X) = norm(q.*X,1).\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be a positive real scalar (or must be same size as X).\n% Dual: proj_linf.m\n\n% Update Feb 2011, allowing q to be a vector\n% Update Mar 2012, allow stepsize to be a vector\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) ||  any( q < 0 ) || all(q==0) %|| numel( q ) ~= 1\n    if q==0\n        op = prox_0;\n        warning('TFOCS:zeroQ','q=0 so returning the proximal operator for the zero function');\n        return;\n    else\n        error( 'Argument must be positive.' );\n    end\nend\n\n% The following commented code works fine in Matlab,\n%   but doesn't work in Octave due to different conventions on nesting\n%   functions. We keep in in the comments since it may be useful\n%   as an example of building a prox function\n\n% op = tfocs_prox( @f, @prox_f , 'vector' ); % Allow vector stepsizes\n% function v = f(x)\n%     v = norm( q(:).*x(:), 1 );\n% end\n% function x = prox_f(x,t)  \n%     tq = t .* q; % March 2012, allowing vectorized stepsizes\n%     s  = 1 - min( tq./abs(x), 1 );\n%     x  = x .* s;\n% end\n% end % end of main file\n\n% This is Matlab and Octave compatible code\nop = tfocs_prox( @(x)f(q,x), @(x,t)prox_f(q,x,t) , 'vector' );\nend\n\n% These are now subroutines, that are NOT in the same scope\nfunction v = f(qq,x)\n    v = norm( qq(:).*x(:), 1 );\nend\n\nfunction x = prox_f(qq,x,t)  \n    tq = t .* qq; % March 2012, allowing vectorized stepsizes\n    s  = 1 - min( tq./abs(x), 1 );\n    x  = x .* s;\nend\n\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_l1_and_sum.m",
    "content": "function op = prox_l1_and_sum( q, b, nColumns, zeroID, useMatricized )\n\n%PROX_L1_AND_SUM    L1 norm with sum(X)=b constraints\n%    OP = PROX_L1_AND_SUM( Q ) implements the nonsmooth function\n%        OP(X) = norm(Q.*X,1) with constraints \n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be a positive real scalar (or must be same size as X).\n%\n%    OP = PROX_L1_AND_SUM( Q, B )\n%       includes the constraints that sum(X(:)) == B\n%       (Default: B=1)\n%\n%    OP = PROX_L1_AND_SUM( Q, B, nColumns )\n%       takes the input vector X and reshapes it to have nColumns\n%       and applies this prox to every column\n%\n%    OP = PROX_L1_AND_SUM( Q, B, nColumns, zeroID )\n%       if zeroID == true (it is false by default)\n%       then after reshaping X, enforces that X(i,i) = 0\n%\n%    OP = PROX_L1_AND_SUM( Q, B, nColumns, zeroID, useMatricized )\n%       toggles between two algorithms if nColumns > 1.\n%       If useMatricized is true (default), runs a variant algorithm\n%       that is a bit faster (output should be the same).\n%\n% Often useful for sparse subpsace clustering (SSC)\n%   See, e.g., https://github.com/stephenbeckr/SSC\n\n% Nov 2017, Stephen.Becker@Colorado.edu\n\nif nargin == 0\n    q = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) ||  any( q < 0 ) || all(q==0) || numel( q ) ~= 1\n    error( 'Argument must be positive.' );\nend\nif nargin < 2 || isempty(b), b = 1; else, assert( numel(b) == 1 ); end\nif nargin < 3 || isempty( nColumns), nColumns = 1;\nelse assert( numel(nColumns) == 1 && nColumns >= 1 ); end\nif nargin < 4 || isempty( zeroID ), zeroID = false; end\nif nargin < 5 || isempty( useMatricized ), useMatricized = true; end\n\nif zeroID && nColumns == 1\n    warning('TFOCS:prox_l1_and_sum:zeroDiag',...\n        'You requested enforcing zero diagonals but did not set nColumns>1 which is probably a mistake');\nend\n\n% This is Matlab and Octave compatible code\nop = tfocs_prox( @(x)f(q,x), @(x,t)prox_f(q,b,nColumns,zeroID,useMatricized,x,t) , 'vector' );\nend\n\n% These are now subroutines, that are NOT in the same scope\nfunction v = f(qq,x)\n    v = norm( qq(:).*x(:), 1 );\nend\n\nfunction x = prox_f(qq,b,nColumns,zeroID,useMatricized,x,t) % stepsize is t\n    tq = t .* qq; % March 2012, allowing vectorized stepsizes\n    \n    % 3/15/18, adding:\n    if 3~=exist('shrink_mex','file')\n        addpath( fullfile( tfocs_where, 'mexFiles' ) );\n    end\n    if 3==exist('shrink_mex','file') \n        shrink  = @(x) shrink_mex(x,tq);\n        shrink_nu = @(x,nu) shrink_mex(x,tq,nu);\n    else\n        % this is fast, but requires more memory\n        shrink  = @(x) sign(x).*max( abs(x) - tq, 0 );\n        shrink_nu = @(x,nu) shrink(x-nu);\n    end\n    \n    if zeroID && nColumns > 1\n        X   = reshape( x, [], nColumns );\n        n   = size(X,1);\n        if nColumns > n\n            error('Cannot zero out the diagonal if columns > rows');\n        end\n        if useMatricized\n            Xsmall = zeros( n-1, nColumns );\n            for col = 1:nColumns\n                ind     = [1:col-1,col+1:size(X,1)];\n                Xsmall(:,col)   = X(ind,col);\n            end\n            Xsmall = prox_l1sum_matricized( Xsmall, tq, b, shrink_nu );\n            for col = 1:nColumns\n                X(col,col)  = 0;\n                ind     = [1:col-1,col+1:size(X,1)];\n                X(ind,col)  = Xsmall(:,col);\n            end\n        else\n            for col = 1:nColumns\n                ind     = [1:col-1,col+1:size(X,1)];\n                x       = X(ind,col);\n                x       = prox_l1sum( x, tq, b, shrink_nu );\n                X(col,col)  = 0;\n                X(ind,col)  = x;\n            end\n        end\n        x   = X(:);\n    else\n        if nColumns > 1\n            X   = reshape( x, [], nColumns );\n            \n            if useMatricized\n                X = prox_l1sum_matricized( X, tq, b, shrink_nu );\n            else\n                for col = 1:nColumns\n                    X(:,col) = prox_l1sum( X(:,col), tq, b, shrink_nu );\n                end\n            end\n            x   = X(:);\n        else\n            x   = prox_l1sum( x, tq, b, shrink_nu );\n        end\n    end\nend\n\n\n\n% Main algorithmic part: if x0 is length n, takes O(n log n) time\nfunction x = prox_l1sum( x0, lambda, b, shrink_nu )\n\n    brk_pts = sort( [x0-lambda;x0+lambda], 'descend' );\n\n    xnu     = @(nu) shrink_nu( x0 , nu );\n    h       = @(x) sum(x) - b; % want to solve h(nu) = 0\n\n    % Bisection\n    lwrBnd       = 0;\n    uprBnd       = length(brk_pts) + 1;\n    iMax         = ceil( log2(length(brk_pts)) ) + 1;\n    PRINT = false; % set to \"true\" for debugging purposes\n    if PRINT\n        dispp = @disp;\n        printf = @fprintf;\n    else\n        dispp = @(varargin) 1;\n        printf = @(varargin) 1;\n    end\n    dispp(' ');\n    for i = 1:iMax\n        if uprBnd - lwrBnd <= 1\n            dispp('Bounds are too close; breaking');\n            break;\n        end\n        j = round( (lwrBnd+uprBnd)/2 );\n        %printf('j is %d (bounds were [%d,%d])\\n', j, lwrBnd,uprBnd ); %\n        if j==lwrBnd\n            dispp('j==lwrBnd, so increasing');\n            j = j+1;\n        elseif j==uprBnd\n            dispp('j==uprBnd, so increasing');\n            j = j-1;\n        end\n        \n        a   = brk_pts(j);\n        x   = xnu(a);  % the prox\n        p   = h(x);\n        \n        if p > 0\n            uprBnd = j;\n        elseif p < 0\n            lwrBnd = j;\n        end\n        if PRINT\n            % Don't rely on redefinition of printf,\n            % since then we would still calculate find(~x)\n            % which is slow\n            printf('i=%2d, a = %6.3f, p = %8.3f, zeros ', i, a, p );\n            if n < 100, printf('%d ', find(~x) ); end\n            printf('\\n');\n        end\n    end\n    \n    % Now, determine linear part, which we infer from two points.\n    % If lwr/upr bounds are infinite, we take special care\n    % e.g., we make a new \"a\" slightly lower/bigger, and use this\n    % to extract linear part.\n    if lwrBnd == 0\n        a2 = brk_pts( uprBnd );\n        a1 = a2 - 10; % arbitrary\n        aBounds = [a1,a2];\n    elseif uprBnd == length(brk_pts) + 1\n        a1 = brk_pts( lwrBnd );\n        a2 = a1 + 10; % arbitrary\n        aBounds = [a1,a2];\n    else\n        % In general case, we can infer linear part from the two break points\n        a1 = brk_pts( lwrBnd );\n        a2 = brk_pts( uprBnd );\n        aBounds = [a1,a2];\n    end\n    \n    % Now we have the support, find exact value\n    x       = xnu(( aBounds(1)+aBounds(2))/2 );  % to find the support\n    supp    = find(x);\n\n    sgn     = sign(x);\n    nu      = ( sum(x0(supp) - lambda*sgn(supp) ) - b )/length(supp);\n    \n    x   = xnu( nu );\n\nend\n\n\n% This variant can handle several columns at once,\n% and it takes exactly log2(n) iterations, as it doesn't stop early\n%   since different columns might stop at different steps and that's\n%   not easy to detect efficiently.\nfunction x = prox_l1sum_matricized( x0, lambda, b, shrink_nu )\n\n    brk_pts = sort( [x0-lambda;x0+lambda], 'descend' );\n    \n    \n    xnu     = @(nu) shrink_nu( x0 , nu );\n    \n    h       = @(x) sum(x) - b; % want to solve h(nu) = 0\n\n    nCols        = size( x0, 2 ); % allow matrices\n    LDA          = size( brk_pts, 1 );\n    offsets      = (0:nCols-1)*LDA;%i.e., [0, LDA, 2*LDA, ... ];\n    \n    lwrBnd       = zeros(1,nCols);\n    uprBnd       = (length(brk_pts) + 1)*ones(1,nCols);\n    iMax         = ceil( log2(length(brk_pts)) ) + 1;\n\n    for i = 1:iMax\n\n        j = round(mean([lwrBnd;uprBnd]));\n        ind = find( j==lwrBnd );\n        j( ind ) = j( ind ) + 1;\n        ind = find( j==uprBnd );\n        j( ind ) = j( ind ) - 1;\n        \n        a   = brk_pts(j+offsets); % need the offsets to correct it here\n        x   = xnu(a);  % the prox\n        p   = h(x);\n        \n        ind = find( p > 0 );\n        uprBnd(ind) = j(ind);\n        ind = find( p < 0 );\n        lwrBnd(ind) = j(ind);\n\n    end\n\n    \n    [a1,a2]     = deal( zeros(1,nCols) );\n    ind = find( lwrBnd == 0 );\n    a2(ind) = brk_pts( uprBnd(ind) + offsets(ind) );\n    a1(ind) = a2(ind) - 10;\n    ind2 = ind;\n    \n    ind = find( uprBnd == size(brk_pts,1) + 1 );\n    a1(ind) = brk_pts( lwrBnd(ind) + offsets(ind) );\n    a2(ind) = a1(ind) + 10;\n    \n    indOther = setdiff( 1:nCols, [ind2,ind] );\n    a1(indOther)    = brk_pts( lwrBnd(indOther) + offsets(indOther) );\n    a2(indOther)    = brk_pts( uprBnd(indOther) + offsets(indOther) );\n    \n    a  = mean( [a1;a2] );\n    x       = xnu( a );\n    \n    nu      = zeros(1,nCols);\n    sgn     = sign(x);\n    for col = 1:nCols\n        supp    = find( sgn(:,col) );\n        nu(col)      = ( sum(x0(supp,col) - lambda*sgn(supp,col) ) - b )/length(supp);\n    end\n    x   = xnu( nu );\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_l1_deadzone.m",
    "content": "function op = prox_l1_deadzone( q, epsilon )\n\n%PROX_L1_DEADZONE    L1 norm with deadzone [-eps,eps]\n%    OP = PROX_L1_DEADZONE( q, eps ) implements the nonsmooth function\n%        OP(X) = q*sum_i max(0,x-eps)+max(0,-x-eps) = q*sum_i\n%        max(0,|x|-eps)\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be a positive real scalar (or must be same size as X).\n%\n\n% New March 2 2016\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) ||  any( q < 0 ) || all(q==0) %|| numel( q ) ~= 1\n    if q==0\n        op = prox_0;\n        warning('TFOCS:zeroQ','q=0 so returning the proximal operator for the zero function');\n        return;\n    else\n        error( 'Argument must be positive.' );\n    end\nend\n\n% This is Matlab and Octave compatible code\nop = tfocs_prox( @(x)f(q, epsilon,x), @(x,t)prox_f(q, epsilon,x,t) , 'vector' );\nend\n\n% These are now subroutines, that are NOT in the same scope\nfunction v = f(qq,epsilon, x)\n    v = sum( qq(:).*max(0,abs(x(:))-epsilon), 1 );\nend\n\nfunction x = prox_f(qq,epsilon, x,t)  \n% p = x if |x|<eps,\n% p = sign(x)*eps if eps < |x| < tq\n% p = sign(x)*( |x| - (eps+tq) ) if |x| > tq\n% i.e., if |x|>eps,  p = sign(x).*max( |x|-tq, eps )\n    tq = t .* qq; \n    x  = sign(x).*( abs(x).*( abs(x)<epsilon ) + max(abs(x)-tq, epsilon).*( abs(x)>= epsilon) );\nend\n\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_l1_mat.m",
    "content": "function op = prox_l1_mat( q, nColumns, zeroID, useMatricized )\n\n%PROX_L1_MAT    L1 norm, matricized in a special way\n%    OP = PROX_L1_MAT( Q ) implements the nonsmooth function\n%        OP(X) = norm(Q.*X,1) with constraints \n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be a positive real scalar (or must be same size as X).\n%\n%    OP = PROX_L1_MAT( Q, nColumns )\n%       takes the input vector X and reshapes it to have nColumns\n%       and applies this prox to every column\n%\n%    OP = PROX_L1_MAT( Q, nColumns, zeroID )\n%       if zeroID == true (it is false by default)\n%       then after reshaping X, enforces that X(i,i) = 0\n%\n%    OP = PROX_L1_MAT( Q, nColumns, zeroID, useMatricized )\n%       toggles between two algorithms if nColumns > 1.\n%       If useMatricized is true (default), runs a variant algorithm\n%       that is a bit faster (output should be the same).\n%\n% Often useful for sparse subpsace clustering (SSC)\n%   See, e.g., https://github.com/stephenbeckr/SSC\n\n% Mar 2018, Stephen.Becker@Colorado.edu\n\nif nargin == 0\n    q = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) ||  any( q < 0 ) || all(q==0) || numel( q ) ~= 1\n    error( 'Argument must be positive.' );\nend\nif nargin < 2 || isempty( nColumns), nColumns = 1;\nelse assert( numel(nColumns) == 1 && nColumns >= 1 ); end\nif nargin < 3 || isempty( zeroID ), zeroID = false; end\nif nargin < 4 || isempty( useMatricized ), useMatricized = true; end\n\nif zeroID && nColumns == 1\n    warning('TFOCS:prox_l1_mat:zeroDiag',...\n        'You requested enforcing zero diagonals but did not set nColumns>1 which is probably a mistake');\nend\n\n% This is Matlab and Octave compatible code\nop = tfocs_prox( @(x)f(q,x), @(x,t)prox_f(q,nColumns,zeroID,useMatricized,x,t) , 'vector' );\nend\n\n% These are now subroutines, that are NOT in the same scope\nfunction v = f(qq,x)\n    v = norm( qq(:).*x(:), 1 );\nend\n\nfunction x = prox_f(qq,nColumns,zeroID,useMatricized,x,t) % stepsize is t\n    tq = t .* qq; % March 2012, allowing vectorized stepsizes\n    \n    % 3/15/18, adding:\n    if 3~=exist('shrink_mex','file')\n        addpath( fullfile( tfocs_where, 'mexFiles' ) );\n    end\n    if 3==exist('shrink_mex','file') \n        shrink  = @(x) shrink_mex(x,tq);\n    else\n        % this is fast, but requires more memory\n        shrink  = @(x) sign(x).*max( abs(x) - tq, 0 );\n    end\n    \n    if zeroID && nColumns > 1\n        X   = reshape( x, [], nColumns );\n        n   = size(X,1);\n        if nColumns > n\n            error('Cannot zero out the diagonal if columns > rows');\n        end\n        if useMatricized\n            Xsmall = zeros( n-1, nColumns );\n            for col = 1:nColumns\n                ind     = [1:col-1,col+1:size(X,1)];\n                Xsmall(:,col)   = X(ind,col);\n            end\n            Xsmall = shrink( Xsmall);\n            for col = 1:nColumns\n                X(col,col)  = 0;\n                ind     = [1:col-1,col+1:size(X,1)];\n                X(ind,col)  = Xsmall(:,col);\n            end\n        else\n            for col = 1:nColumns\n                ind     = [1:col-1,col+1:size(X,1)];\n                x       = X(ind,col);\n                x       = shrink( x);\n                X(col,col)  = 0;\n                X(ind,col)  = x;\n            end\n        end\n        x   = X(:);\n    else\n        if nColumns > 1\n            X   = reshape( x, [], nColumns );\n            \n            if useMatricized\n                X = shrink( X );\n            else\n                for col = 1:nColumns\n                    X(:,col) = shrink( X(:,col));\n                end\n            end\n            x   = X(:);\n        else\n            x   = shrink( x );\n        end\n    end\nend\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_l1l2.m",
    "content": "function op = prox_l1l2( q )\n\n%PROX_L1L2    L1-L2 block norm: sum of L2 norms of rows.\n%    OP = PROX_L1L2( q ) implements the nonsmooth function\n%        OP(X) = q * sum_{i=1:m} norm(X(i,:),2)\n%    where X is a m x n matrix.  If n = 1, this is equivalent\n%    to PROX_L1\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be positive and real.\n%    If Q is a vector, it must be m x 1, and in this case,\n%    the weighted norm OP(X) = sum_{i} Q(i)*norm(X(i,:),2)\n%    is calculated.\n%\n% Dual: proj_linfl2.m\n% See also proj_linfl2.m, proj_l1l2.m\n\nif nargin == 0,\n\tq = 1;\n% elseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\nelseif ~isnumeric( q ) || ~isreal( q ) || any(q <= 0),\n\terror( 'Argument must be positive.' );\nend\n% In r2007a and later, we can use bsxfun instead of the spdiags trick\nif exist('OCTAVE_VERSION','builtin')\n    vr = '2010';\nelse\n    vr=version('-release');\nend\nif str2num(vr(1:4)) >= 2007\n    op = tfocs_prox( @(x)f(q,x), @(x,t)prox_f_bsxfun(q,x,t) );\nelse\n    % the default, using spdiags\n    op = tfocs_prox( @(x)f(q,x), @(x,t)prox_f(q,x,t) );\nend\n\nfunction v = f(q,x)\n    if numel(q) ~= 1 && size(q,1) ~= size(x,1)\n        error('Weight must be a scalar or a column vector');\n    end\n    v = sum( q.* sqrt(sum(x.^2,2)) );\nend\n\nfunction x = prox_f(q,x,t) \n  if nargin < 3,\n      error( 'Not enough arguments.' );\n  end\n  % v = sqrt( tfocs_normsq( x ) );\n  v = sqrt( sum(x.^2,2) );\n  s = 1 - 1 ./ max( v ./ ( t .* q ), 1 );\n  m = length(s);\n  x = spdiags(s,0,m,m)*x;\nend\nfunction x = prox_f_bsxfun(q,x,t)\n  if nargin < 3,\n      error( 'Not enough arguments.' );\n  end\n  v = sqrt( sum(x.^2,2) );\n  s = 1 - 1 ./ max( v ./ ( t .* q ), 1 );\n  x = bsxfun( @times, x, s ); % Apr 24 2013. Should be faster\nend\n\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_l1linf.m",
    "content": "function op = prox_l1linf( q )\n\n%PROX_L1LINF    L1-LInf block norm: sum of L-inf norms of rows.\n%    OP = PROX_L1LINF( q ) implements the nonsmooth function\n%        OP(X) = q * sum_{i=1:m} norm(X(i,:),Inf)\n%    where X is a m x n matrix.  If n = 1, this is equivalent\n%    to PROX_L1\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be positive and real.\n%    If Q is a vector, it must be m x 1, and in this case,\n%    the weighted norm OP(X) = sum_{i} Q(i)*norm(X(i,:),Inf)\n%    is calculated.\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || any(q <= 0),\n\terror( 'Argument must be positive.' );\nend\nop = tfocs_prox( @(x)f(x,q), @(x,t)prox_f(x,t,q), 'vector' );\nend % end of main function\n\nfunction v = f(x,q)\n    if numel(q) ~= 1 && size(q,1) ~= size(x,1)\n        error('Weight must be a scalar or a column vector');\n    end\n    v = sum( q.* max(abs(x),[],2) );\nend\n\nfunction x = prox_f(x,t,q)\n  if nargin < 2,\n      error( 'Not enough arguments.' );\n  end\n  \n  [n,d] = size(x);\n  dim   = 2;\n  \n  % Option 1: explicitly call prox_linf on the rows:\n  % slow, but the chief benefit is that it is low memory\n  % This would probably be faster if the matrix was transposed before and after\n%   for k= 1:n\n%       if isscalar(q), qk = q;\n%       else, qk = q(k);\n%       end \n%       x(k,:) = prox_linf_q( qk, x(k,:).', t ).';\n%   end\n%   return;\n  \n\n  \n% Option 2: vectorize the call.  By far, more efficient than option 1\n\n  %s     = sort( abs(x), dim, 'descend' );\n  %cs    = cumsum(s,dim);\n  % Since Matlab stores matrices in column-major order, this method is more cache friendly:\n  s     = sort( abs(x)', q, 'descend' );\n  cs    = cumsum(s,1)';\n  s     = s';\n\n  s     = [s(:,2:end), zeros(n,1)];\n  \n\n  ndx1 = zeros(n,1);\n  ndx2 = zeros(n,1);\n  \n  if isscalar(q),\n      tq = repmat( t*q, n, d );\n  else\n      tq = repmat( t*q, 1, d );\n  end\n  %Z = cs - s*diag(1:d);\n  % The above may require a lot of memory, so use spdiag or this:\n  Z = cs - bsxfun(@times,s,1:d);\n\n  Z = ( Z >= tq );\n  Z = Z.';\n  % now Z is d x n (typically d is large, n is small) \n  \n  % Not sure how to vectorize the find.\n  % One option is to use the [i,j] = find(...) form,\n  % but that's also extra work, since we can't just find the \"first\".\n  if n > 5\n      % avoid the for-loop\n      ndx1  = (d+1)-sum(Z)'; % this is the first row with Z > 0\n      ndx2  = ndx1;\n      ndx2( ndx2 == d+1 ) = Inf;\n      ndx1( ndx1 == d+1)  = d; % arbitrary, but do this so we don't have a special case later\n  else\n      % this might be slightly less memory, so keep the code\n      for k = 1:n\n          % This is why we transposed Z: due to column-major order,\n          %     find( columnVector ) is faster than find( rowVector )\n          ndxk = find( Z(:,k), 1 );\n          if ~isempty(ndxk)\n              ndx1(k) = ndxk;\n              ndx2(k) = ndxk;\n          else\n              ndx1(k) = 1; % value doesn't matter\n              ndx2(k) = Inf;\n          end\n      end\n  end\n  indx_cs = sub2ind( [n,d], (1:n)', ndx1 );\n  tau = (cs(indx_cs) - tq(:,1))./ndx2;\n  tau = repmat( tau, 1, d );\n  tau_noZeros = tau;\n  tau_noZeros( ~x ) = 1;\n  x   = x .* (  tau ./ max( abs(x), tau_noZeros ) );\n  % Another, but not really better, way is to not do the rempat stuff and do:\n  % x     = sign(x).*bsxfun( @min, tau, abs(x) );\n  \n  \nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_l1pos.m",
    "content": "function op = prox_l1pos( q )\n%PROX_L1POS    L1 norm, restricted to x >= 0\n%    OP = PROX_L1( q ) implements the nonsmooth function\n%        OP(X) = norm(q.*X,1) + indicator_{ X >= 0 }\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be a positive real scalar (or must be same size as X).\n\n% New in v1.0d\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) ||  any( q < 0 ) || all(q==0) %|| numel( q ) ~= 1\n\terror( 'Argument must be positive.' );\nend\n\nop = tfocs_prox( @(x)f(x,q), @(x,t)prox_f(x,t,q), 'vector');\nend\n\nfunction v = f(x,q)\n    if any( x(:) < 0 )\n        v = Inf;\n    elseif isscalar(q)\n        v = q*sum( x(:) );\n    else\n        v = sum( q(:).*x(:) );\n    end\nend\n\n% The proximity operator is a simplified version of shrinkage:\nfunction x = prox_f(x,t,q)  \n    x   = max( 0, x - t*q );\nend\n\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_l2.m",
    "content": "function op = prox_l2( q )\n\n%PROX_L2    L2 norm.\n%    OP = PROX_L2( q ) implements the nonsmooth function\n%        OP(X) = q * norm(X,'fro').\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be a positive real scalar.\n%    If Q is a vector or matrix of the same size and dimensions as X,\n%       then this uses an experimental code to compute the proximity operator\n%       of OP(x) = norm( q.*X, 'fro' )\n%    In the limit q --> 0, this function acts like prox_0 (aka proj_Rn)\n% Dual: proj_l2.m\n% For the proximity operator of the l2 squared norm (that is, norm(X,'fro')^2)\n%   use smooth_quad.m (which can be used in either a smooth gradient-based fashion\n%   but also supports proximity usage). Note smooth_quad() is self-dual.\n% See also proj_l2, prox_0, proj_Rn\n\n% Feb '11, allowing for q to be a vector\n%       This is complicated, so not for certain\n%       A safer method is to use a linear operator to scale the variables\n\nif nargin == 0,\n\tq = 1;\n% elseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\nelseif ~isnumeric( q ) || ~isreal( q ) %||  any( q < 0 ) || all(q==0)\n\terror( 'Argument must be positive.' );\nend\nif isscalar(q)\n    if any( q <= 0 )\n        error('Scaling argument must be positive, real scalar. If q=0, use prox_0 instead');\n    end\n    op = @(varargin)prox_l2_q( q, varargin{:} );\nelse\n    if all(q==0), error('Argument must be nonzero'); end\n    warning('TFOCS:experimental','Using experimental feature of TFOCS');\n    op = @(varargin)prox_l2_vector( q, varargin{:} );\nend\n\nfunction [ v, x ] = prox_l2_q( q, x, t )\nif nargin < 2,\n\terror( 'Not enough arguments.' );\nend\nv = sqrt( tfocs_normsq( x ) ); \nif nargin == 3,\n\ts = 1 - 1 ./ max( v / ( t * q ), 1 ); \n   \n\tx = x * s;\n\tv = v * s; % version A\nelseif nargout == 2,\n\terror( 'This function is not differentiable.' );\nend\nv = q * v; % version A\n\n\n% --------- experimental code -----------------------\nfunction [ v, x ] = prox_l2_vector( q, x, t )\nif nargin < 2,\n\terror( 'Not enough arguments.' );\nend\nv = sqrt( tfocs_normsq( q.*x ) ); % version B\nif nargin == 3,\n%{\n   we need to solve for a scalar variable s = ||q.*x|| \n      (where x is the unknown solution)\n    \n   we have a fixed point equation:\n        s = f(s) := norm( q.*x_k ) where x_k = x_0/( 1 + t*q/s )\n   \n   to solve this, we'll use Matlab's \"fzero\" to find the zero\n    of the function F(s) = f(s) - s\n    \n   Clearly, we need s >= 0, since it is ||q.*x||\n    \n   If q is a scalar, we can solve explicitly: s = q*(norm(x0) - t)\n    \n%}\n    \n    xk = @(s) x./( 1 + t*(q.^2)/s );\n    f = @(s) norm( q.*xk(s) );\n%     F = @(s) f(s) - s;\n    tq2 = t*(q.^2);\n    F = @(s) norm( (q.*x)./( 1 + tq2/s ) ) - s;\n    [s,sVal] = fzero( F, 1);\n    if abs( sVal ) > 1e-4\n        error('cannot find a zero'); \n    end\n    if s <= 0\n        x = 0*x;\n    else\n        x = xk(s);\n    end\n    v = sqrt( tfocs_normsq( q.*x ) ); % version B\nelseif nargout == 2,\n\terror( 'This function is not differentiable.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_linf.m",
    "content": "function op = prox_linf( q )\n\n%PROX_LINF    L-infinity norm.\n%    OP = PROX_LINF( q ) implements the nonsmooth function\n%        OP(X) = q * norm( X(:), Inf ).\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be a positive real scalar.\n% Dual: proj_l1.m\n% See also proj_l1\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\nop = @(varargin)prox_linf_q( q, varargin{:} );\n\nfunction [ v, x ] = prox_linf_q( q, x, t )\nif nargin < 2,\n    error( 'Not enough arguments.' );\nend    \ntau = norm( x(:), Inf );\nif nargin == 3,\n    s   = sort( abs(nonzeros(x)), 'descend' ); % makes one big vector\n    \n    cs  = cumsum(s);\n    ndx = find( cs - (1:numel(s))' .* [s(2:end);0] >= t * q, 1 );\n    if ~isempty( ndx ),\n        tau = ( cs(ndx) - t * q ) / ndx;\n        x   = x .* ( tau ./ max( abs(x), tau ) );\n    else\n        x(:) = 0;  % adding Oct 21\n        tau = 0;\n    end\nelseif nargout == 2,\n    error( 'This function is not differentiable.' );\nend\nv = q * tau;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_max.m",
    "content": "function op = prox_max( q )\n\n%PROX_MAX    Entry-wise maximum element.\n%    OP = PROX_MAX( q ) implements the nonsmooth function\n%        OP(X) = q * max( X(:) ).\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied,\n%    then it must be a positive real scalar.\n% Dual: proj_simplex.m (at least if X is a vector)\n% See also proj_simplex, prox_linf, prox_linf\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\nop = @(varargin)prox_lmax_q( q, varargin{:} );\n\nfunction [ v, x ] = prox_lmax_q( q, x, t )\nif nargin < 2,\n    error( 'Not enough arguments.' );\nend    \n% We have two options when input x is a matrix:\n%   Does the user want to treat it as x(:), \n%   Or does the user want to treat each column separately?\n% Most other functions (e.g. l1, linf) treat it as x(:)\n% so that will be the default. However, we leave it\n% as a hard-coded option so that the user can change it\n% if they want.\n% (Note: the dual function, proj_simplex, vectorizes it)\nVECTORIZE = true;\n% right now, we do not have the non-vectorized version implemented.\n\ntau = max( x(:) );\nif nargin == 3,\n    s   = sort( nonzeros(x), 'descend' );\n%     s   = sort( x, 'descend' ); % 'nonzeros' does a x(:) operation\n    cs  = cumsum(s);\n    ndx = find( cs - (1:numel(s))' .* [s(2:end);0] >= t * q, 1 );\n    if ~isempty( ndx ),\n        tau = ( cs(ndx) - t * q ) / ndx;\n        x   = x .* ( tau ./ max( x, tau ) );\n    else\n        x(:) = 0;  % adding Oct 21\n        tau = 0;\n    end\nelseif nargout == 2,\n    error( 'This function is not differentiable.' );\nend\nv = q * tau;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_maxEig.m",
    "content": "function op = prox_maxEig( q )\n%PROX_MAXEIG    Maximum eigenvalue of a real symmetric matrix\n%    OP = PROX_MAXEIG( q ) implements the nonsmooth function\n%        OP(X) = q * max(eig(X)).\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied, \n%    it must be a real scalar.\n%\n% Note: if X is positive semi-definite, then max(eig(X)) == norm(eig(X),Inf)\n%   and hence prox_maxEig(q) is equivalent to prox_spectral(q,'eig')\n%\n% This implementation uses a naive approach that does not exploit any\n% a priori knowledge that X is low rank or sparse. Future\n% implementations of TFOCS will be able to handle low-rank matrices \n% more effectively.\n%\n% Dual:  proj_psdUTrace.m\n% See also proj_psdUTrace, prox_max, prox_spectral, proj_nuclear\n\n% Note: it would be possible to use eigs for sparse matrices,\n% but that requires a little bit more work than it did for proj_spectral.\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 %|| q <= 0,\n\terror( 'Argument must be a real scalar.' );\nend\nop = @(varargin)prox_spectral_eig_q( q, varargin{:} );\n\nfunction [ v, X ] = prox_spectral_eig_q( q, X, t )\n% Assumes X is square and symmetric\n% Therefore, all singular values are just absolute values\n%   of the eigenvalues.\nif nargin < 2,\n    error( 'Not enough arguments.' );\nend\nif size(X,1) ~= size(X,2)\n    error('prox_spectral: variable must be a square matrix');\nend\nif norm( X - X', 'fro' ) > 1e-10*norm(X,'fro')\n    error('Input must be Hermitian');\nend\nX = (X+X')/2; % Matlab will make it exactly symmetric\n\nif nargin == 3 && t > 0,\n    [V,S]       = safe_eig(full(X));\n%     op          = prox_linf(q); % for prox_spectral\n    op          = prox_max(q);\n    s           = diag(S);\n    [dummy,s]   = op(s,t);\n    tau         = max(s);\n    X = V*diag(s)*V';\nelse\n    if nargout == 2\n        error( 'This function is not differentiable.' );\n    end\n    tau = max(eig(X));\nend\nv = q * tau; \n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_nuclear.m",
    "content": "function op = prox_nuclear( q, SVD_STYLE )\n%PROX_NUCLEAR    Nuclear norm.\n%    OP = PROX_NUCLEAR( q ) implements the nonsmooth function\n%        OP(X) = q * sum(svd(X)).\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied, \n%    it must be a positive real scalar.\n%\n%    OP = PROX_NUCLEAR( q, SVD_STYLE )\n%       uses a Lanczos-based SVD based on PROPACK\n%       if SVD_STYLE == 1 or 'propack',\n%\n%       or Matlab's Lanczos-based SVDS is SVD_STYLE == 2 or 'arpack'\n%       (calls SVDS, which calls EIGS, which uses ARPACK)\n%\n%       or a randomized algorithm based on [1] if SVD_STYLE==3 or \n%       'randomized'\n%\n%       otherwise it uses a dense matrix SVD\n%\n%       (default: dense matrix SVD if X is dense and less than 300^2\n%        elements, otherwise the randomized algorithm)\n%\n%    CALLS = PROX_NUCLEAR( 'reset' )\n%       resets the internal counter and returns the number of function\n%       calls\n%\n% [1] \"Finding Structure with Randomness: Probabilistic Algorithms \n% for Constructing Approximate Matrix Decompositions\"\n% by N. Halko, P. G. Martinsson, and J. A. Tropp. SIAM Review vol 53 2011.\n% http://epubs.siam.org/doi/abs/10.1137/090771806\n%\n% This implementation uses a naive approach that does not exploit any\n% a priori knowledge that X and G are low rank or sparse. Future\n% implementations of TFOCS will be able to handle low-rank matrices \n% more effectively.\n%\n% Dual: proj_spectral.m\n% See also prox_trace.m  and proj_spectral.m\n\nif nargin == 1 && strcmpi(q,'reset')\n    op = prox_nuclear_impl;\n    return;\nend\n\nif nargin == 0\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0\n\terror( 'Argument must be positive.' );\nend\nif nargin < 2, SVD_STYLE = []; end\n\n% clear the persistent values:\nprox_nuclear_impl();\n\nop = @(varargin)prox_nuclear_impl( q, SVD_STYLE, varargin{:} );\n\nend % end of main function\n\nfunction [ v, X ] = prox_nuclear_impl( q, SVD_STYLE, X, t )\npersistent oldRank\npersistent nCalls\npersistent V_save\nif nargin == 0, oldRank = []; v = nCalls; nCalls = []; V_save=[]; return; end\nif isempty(nCalls), nCalls = 0; end\n\nND = (size(X,2) == 1);\n% ND = ~ismatrix(X);\nif ND % X is a vector, not a matrix, so reshape it \n    sx = size(X);\n    X = reshape( X, prod(sx(1:end-1)), sx(end) );\nend\n\n% Determine which SVD we will use:\n% 0 = dense\n% 1 = PROPACK\n% 2 = ARPACK\n% 3 = Randomized\nif isempty(SVD_STYLE)\n    % use a default\n    if numel(X) > 300^2 || issparse(X)\n        SVD_STYLE = 'randomized';\n    else\n        SVD_STYLE = 'dense';\n    end\nend\nSVD_STYLE = lower(SVD_STYLE);\nswitch SVD_STYLE\n    case {1,'propack'}\n        if ~exist('lansvd','file')\n            warning(...\n                'TFOCS:prox_nuclear',...\n                'Cannot find lansvd.m, required by PROPACK; using default SVD_type');\n            SVD_STYLE = 'arpack';\n        end\n    case {3,'randomized'}\n        if ~exist('randomizedSVD','file')\n            warning(...\n                'TFOCS:prox_nuclear',...\n                'Cannot find randomizedSVD.m, required by SVD_TYPE; using default SVD_type');\n            SVD_STYLE = 'arpack';\n        end\nend\n\nopts = struct('tol',1e-10); % 1e-10 is default in svds\n% Define [U,S,V] = svdFcn( X, K, opt )\nswitch SVD_STYLE\n    case {1,'propack'}\n        % These fields are used by lansvd, otherwise are ignored\n        opts.eta = eps; % makes compute_int slow\n        %opt.eta = 0;  % makes reorth slow\n        opts.delta = 10*opts.eta;\n        svdFcn = @(X,K,opt) lansvd( X, K, 'L', opt ); % fixed bug, 3/29/15\n    case {2,'arpack'}\n        svdFcn = @(X,K,opt) svds(X,K,'L',opt);\n    case {3,'randomized'}\n        nPower      = 2; % 2 or 3 is good\n        overSample  = 20;\n        warning('off','randomizedSVD:warmStartLarge');\n        svdFcn = @(X,K,opt) randomizedSVD( X, K, K+overSample, nPower, [], struct( 'warmStart', V_save ) );\nend\n\nif nargin > 3 && t > 0\n    \n    tau = q*t;\n    nCalls = nCalls + 1;\n    \n    if isequal(SVD_STYLE,0) || strcmpi(SVD_STYLE,'dense')\n        [U,S,V] = svd( full(X), 'econ' );\n    else\n        % Guess which singular value will have value near tau:\n        [M,N] = size(X);\n        if isempty(oldRank), K = 10;\n        else K = oldRank + 2;\n        end\n        \n        ok = false;\n\n        while ~ok\n            K = min( [K,M,N] );\n            [U,S,V] = svdFcn(X,K,opts );\n            ok = (min(diag(S)) < tau) || ( K == min(M,N) );\n            if ok, break; end\n%             K = K + 5;\n            K = 2*K;\n            if K > 10\n                opts.tol = 1e-6;\n            end\n            if K > 40\n                opts.tol = 1e-4;\n            end\n            if K > 100\n                opts.tol = 1e-1;\n            end\n            if K > min(M,N)/2\n                [U,S,V] = svd( full(X), 'econ' );\n                ok = true;\n            end\n        end\n        oldRank = length(find(diag(S) > tau));\n    end\n    s  = diag(S) - tau;\n    tt = s > 0;\n    s  = s(tt,:);\n\n    if isempty(s)\n        X = tfocs_zeros(X);\n    else\n        X = U(:,tt) * bsxfun( @times, s, V(:,tt)' );\n    end\n    switch SVD_STYLE\n        case {3,'randomized'}\n            V_save  = V;\n    end\nelse\n    s = svd(full(X)); % could be expensive!\nend\n\nv = q * sum(s);\nif ND\n    X = reshape( X, sx ); \nend\n\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_scale.m",
    "content": "function op = prox_scale( proxF, scale )\n\n%PROX_SCALE   Scaling a proximity/projection function.\n%    PSCALE = PROX_SCALE( PROXF, s ) is the proximity function formed\n%    by multiplying the input by the real value SCALE, then calling the\n%    function PROXF. In other words,\n%        PSCALE( y ) = PROXF( s * y ).\n%    In three-argument form, [v,x]=PSCALE(y,t) finds the minimizer of\n%        PROXF( s * x ) + (0.5/t)*||x-y||_2^2\n%\n%    Why scale the input, and not the output? When the proximity function\n%    is a norm, the two choices are equivalent when SCALE >= 0, since\n%    ||s*x|| = abs(s)*||x||. However, for *indicator* functions, scaling\n%    the output is useless. Scaling the input grows or shrinks the domain\n%    of PSCALE by choosing SCALE<1 or SCALE>1, respectively.\n%\n%    Note that when constructing our equivalence we assume a particular\n%    form for the proximity minimization. More generally, PROJ_SCALE will\n%    preserve equivalence if 0.5*||x-y||^2 is replaced with D(x-y), as\n%    long as D() satisfies the following homogeneity property:\n%        D(s*z) = s^2*D(z)\n%    If this is not the case, you will not be able to use the TFOCS\n%    internal scaling with this function.\n\nif ~isa( proxF, 'function_handle' ),\n    error( 'The first argument must be a function handle.' );\nelseif ~isa( scale, 'double' ) \n    error( 'The second argument must be a nonzero scalar or matrix');\nelseif numel( scale ) == 1 && isreal( scale )\n    % (we could handle complex, but need to work this out)\n    if scale == 0,\n        error( 'The second argument must be a nonzero real scalar.' );\n    elseif scale == 1,\n        op = proxF;\n    else\n        op = @(varargin)prox_scale_impl( proxF, scale, varargin{:} );\n    end\nelse\n    % added Sept 14, allowing matrix scaling with \"scale\" = L\n    % First, we verify that LL^* = nu * Identity\n    % We do this probabilistically in order to avoid potentially\n    % huge matrices:\n    [m,n] = size(scale);\n    seed  = rng;\n    xTest = randn(m,5);\n    rng(seed); % try not to affect the random seed\n    xOut  = scale*(scale'*xTest);\n    if size(xOut,1) ~= m || size(xOut,2) ~= 5\n        % This shouldn't every happen with matrix inputs,\n        %   but if we later allow functions, then it could happen\n        %   if the function doesn't actually do what we think.\n        error('Something is wrong with the linear operator');\n    end\n    ref = xOut./xTest;\n    nu  = mean(ref(:));\n    if norm( ref(:) - nu*ones(5*m,1) )/norm( nu*ones(5*m,1) ) > 1e-10\n        % If we have LL^* = diag(d), this will be compatible\n        %   with some proxes, so issue a warning\n        if mean( std(ref,[],2) )/norm(ref(:)/5) < 1e-10\n            nu = mean(ref,2);\n            warning('TFOCS:proxMustBeSeparable',...\n                'Matrix is not a tight frame but SS'' is diagonal, so this works if the prox is separable');\n        else\n            error('Matrix does not appear to be a tight frame: need S*S'' = nu*I');\n        end\n    else\n        fprintf('Matrix is a tight frame with constant nu = %.2e\\n', nu );\n    end\n    op = @(varargin)prox_scaleMatrix_impl( proxF, scale, nu, varargin{:} );\nend\n    \n    \nfunction varargout = prox_scale_impl( proxF, s, y, t )\nno = max(nargout,1);\nif nargin < 4 || t == 0,\n    [ varargout{1:no} ] = proxF( s * y );\nelse\n    % For three-input mode, we wish to simulate\n    %   x = argmin_x projectorF(s*x) + (0.5/t)*||x-y||^2\n    % Setting z = s * x, we have\n    %   z = argmin_z projectorF(z) + (0.5/(s^2*t))*||z-s*y||^2\n    % Therefore, we have\n    %   [v,z] = projectorF( s * y, t * s^2 ); x = z / s;\n\t[ varargout{1:no} ] = proxF( s * y, abs(s)^2 * t );\nend\nif no > 1,\n    varargout{2} = varargout{2} / s;\nend\n\n\nfunction varargout = prox_scaleMatrix_impl( proxF, L, nu, y, t )\nno  = max(nargout,1);\nLy  = L*y;\nif nargin < 5 || t == 0,\n    [ varargout{1:no} ] = proxF( Ly );\nelse\n    % Proposition 11 in Combettes and Pesquet 2007\n    %\"A Douglas?Rachford Splitting Approach to Nonsmooth Convex Variational\n    % Signal Recovery\"\n    % If L*L'=nu I, then if g(x) = f(L*x), \n    %   prox_g = I + 1/nu L'( prox_{nu f} - I )L\n\t[ varargout{1:no} ] = proxF( Ly, nu * t );\nend\nif no > 1,\n    varargout{2} = y + L'*((varargout{2} - Ly)./ nu);\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_shift.m",
    "content": "function op = prox_shift( funcF, c )\n\n%PROX_SHIFT Shift a proximity/projection function\n%    SHIFTED_OP = PROX_SHIFT( OP, c )\n%       returns an implementation of the proximity operator\n%       defined by f(x) + c'*x\n%       where f is the proximity operator associated with OP.\n%\n%   See also prox_scale\n\nerror(nargchk(2,2,nargin));\nif ~isa( funcF, 'function_handle' ),\n    error( 'The first argument must be a function handle.' );\nelseif ~isnumeric( c ) \n    error( 'The second argument must be a numeric vector.' );\nend\nop = @(varargin)shift_func( funcF, c, varargin{:} );\n\n\nfunction [ v, x ] = shift_func( prox_f, c, x, t )\n\n    if nargin < 3,\n        error( 'Not enough arguments.' );\n    end\n    if nargin == 4,\n        if numel(t) ~= 1\n            error('The stepsize must be a scalar'); \n        end\n        [v,x]  = prox_f(x-t*c,t);\n        v      = v + tfocs_dot(x,c);\n    elseif nargout == 2,\n        error( 'This function is not differentiable.' );\n    end\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2015 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_spectral.m",
    "content": "function op = prox_spectral( q, SYM_FLAG )\n%PROX_SPECTRAL    Spectral norm, i.e. max singular value.\n%    OP = PROX_SPECTRAL( q ) implements the nonsmooth function\n%        OP(X) = q * max(svd(X)).\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied, \n%    it must be a positive real scalar.\n%\n%    OP = PROX_SPECTRAL( q , 'sym' ) or OP = PROX_SPECTRAL( q, 'eig' )\n%    will instruct the code that the matrix is Hermitian and \n%    therefore the relations between singular- and eigen-values\n%    are well known, and the code will use the more efficient\n%    eigenvalue decomposition (instead of the SVD).\n%\n% This implementation uses a naive approach that does not exploit any\n% a priori knowledge that X is low rank or sparse. Future\n% implementations of TFOCS will be able to handle low-rank matrices \n% more effectively.\n%\n% Dual:  proj_nuclear.m\n% See also proj_nuclear, prox_linf, prox_maxEig\n\n% Note: it would be possible to use eigs for sparse matrices,\n% but that requires a little bit more work than it did for proj_spectral.\n\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) || numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nend\nif nargin >= 2 && ( ...\n        ~isempty(strfind(lower(SYM_FLAG),'eig')) || ...\n        ~isempty(strfind(lower(SYM_FLAG),'sym')) )\n    op = @(varargin)prox_spectral_eig_q( q, varargin{:} );\nelse\n    op = @(varargin)prox_spectral_impl( q, varargin{:} );\nend\n\nfunction [ v, X ] = prox_spectral_impl( q, X, t )\nif nargin < 2,\n    error( 'Not enough arguments.' );\nend\n\nif nargin == 3 && t > 0,\n    [U,S,V] = svd( full(X), 'econ' );\n    s = diag(S);\n    tau = s(1);\n\n    cs  = cumsum(s);\n    ndx = find( cs - (1:numel(s))' .* [s(2:end);0] >= t * q, 1 );\n    if ~isempty( ndx ),\n        tau = ( cs(ndx) - t * q ) / ndx;\n        s   = s .* ( tau ./ max( abs(s), tau ) );\n    end\n    X = U*diag(s)*V';\nelse\n    if nargout == 2\n        error( 'This function is not differentiable.' );\n    end\n    if issparse(X)\n        tau = normest(X);\n    else\n        tau = norm(X);\n    end\nend\nv = q * tau; \n\nfunction [ v, X ] = prox_spectral_eig_q( q, X, t )\n% Assumes X is square and symmetric\n% Therefore, all singular values are just absolute values\n%   of the eigenvalues.\nif nargin < 2,\n    error( 'Not enough arguments.' );\nend\nif size(X,1) ~= size(X,2)\n    error('prox_spectral: variable must be a square matrix');\nend\nif norm( X - X', 'fro' ) > 1e-10*norm(X,'fro')\n    error('Input must be Hermitian');\nend\nX = (X+X')/2; % Matlab will make it exactly symmetric\n\nif nargin == 3 && t > 0,\n    [V,S]       = safe_eig(full(X));\n    op          = prox_linf(q);\n    s           = diag(S);\n    [dummy,s]   = op(s,t);\n%     tau         = max(s); % for SVD, s >= 0 so we can do max. Not so for eig.\n    tau         = norm(s,Inf);\n    X = V*diag(s)*V';\nelse\n    if nargout == 2\n        error( 'This function is not differentiable.' );\n    end\n    if issparse(X)\n        tau = normest(X);\n    else\n        tau = norm(X);\n    end\nend\nv = q * tau; \n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/prox_trace.m",
    "content": "function op = prox_trace( q, LARGESCALE, isReal )\n\n%PROX_TRACE     Nuclear norm, for positive semidefinite matrices. Equivalent to trace.\n%    OP = PROX_TRACE( q ) implements the nonsmooth function\n%        OP(X) = q * sum(svd(X)) = q*tr(X) ( X >= 0 assumed )\n%    Q is optional; if omitted, Q=1 is assumed. But if Q is supplied, \n%    it must be a positive real scalar (the positivity is not necessary mathematically,\n%       so if you want q<0, set SIGMA=q*eye(n); see below )\n%    This function is a combination of the proximity function of the trace\n%    and projection onto the set of symmetric/Hermitian matrices.\n%\n%    OP = PROX_TRACE( SIGMA ) represents the function\n%       OP(X) = trace( SIGMA * X ), such that X >= 0\n%       Here, SIGMA should be a symmetric (or Hermitian) matrix, but need not\n%       be positive semidefinite\n%\n%    OP = PROX_TRACE( q/SIGMA, LARGESCALE )\n%       uses a Lanczos-based Eigenvalue decomposition if LARGESCALE == true,\n%       otherwise it uses a dense matrix Eigenvalue decomposition\n%\n%    OP = PROX_TRACE( q/SIGMA, LARGESCALE, isReal )\n%       also projects onto the set of real matrices if isReal=true.\n%\n%    CALLS = PROX_TRACE( 'reset' )\n%       resets the internal counter and returns the number of function\n%       calls\n%\n% This implementation uses a naive approach that does not exploit any\n% a priori knowledge that X and G may be low rank (plus sparse). Future\n% implementations of TFOCS will be able to handle low-rank matrices \n% more effectively.\n% Dual: proj_spectral(q,'symm')\n% See also proj_spectral, prox_nuclear, proj_psdUTrace\n\n% April 4 2014, adding support for nonscalar q, i.e., q=SIGMA\n\nif nargin == 1 && strcmpi(q,'reset')\n    op = prox_trace_impl;\n    return;\nend\n\nif nargin == 0,\n\tq = 1;\nelseif ~isnumeric( q ) || ~isreal( q ) %|| numel( q ) ~= 1 || q <= 0,\n\terror( 'Argument must be positive.' );\nelseif numel(q) ==1 && q<= 0\n    error('For now, argument must be positive. If you need negative, make q=-eye(n)');\n    % April 4, realized that since this is just linear, we do not need to restrict\n    %   q to be positive.\nelseif numel(q) >1 && norm(q-q','fro')/norm(q,'fro') > 1e-5\n    error('When q is a matrix, it must be symmetric/Hermitian');\nend\nif nargin < 2, LARGESCALE = []; end\nif nargin < 3 || isempty(isReal), isReal = false; end\n\n% clear the persistent values:\nprox_trace_impl();\n\nop = @(varargin)prox_trace_impl( q, LARGESCALE, isReal, varargin{:} );\nend\n\nfunction [ v, X ] = prox_trace_impl( q,LARGESCALE, isReal, X, t )\npersistent oldRank\npersistent nCalls\npersistent V\nif nargin == 0, oldRank = []; v = nCalls; nCalls = []; V=[]; return; end\nif isempty(nCalls), nCalls = 0; end\n\nif nargin >= 5 && t > 0,\n    \n    if ~isempty(LARGESCALE) \n        largescale = LARGESCALE;\n    else\n        largescale = ( numel(X) > 100^2 ) && issparse(X);\n    end\n    if numel(q)==1\n        tau = q*t;\n    else\n        % q is really a matrix Sigma\n        % We can absorb this easily\n        X   = X - t*q;\n        tau = 0;\n    end\n    nCalls = nCalls + 1;\n    \n    if ~largescale\n        if isReal\n            % July 10 2015, adding try-catch statement\n            % to deal with bug in eig() sometimes\n            [V,D]   = safe_eig(real(full((X+X')/2)));\n        else\n            [V,D]   = safe_eig(full((X+X')/2));\n        end\n    else\n\n        % Guess which eigenvalue value will have value near tau:\n        [M,N] = size(X);\n        X = (X+X')/2;\n        if isReal, X = real(X); end\n        if isempty(oldRank), K = 10;\n        else, K = oldRank + 2;\n        end\n        \n        ok = false;\n        opts = [];\n        opts.tol = 1e-10; \n        if isreal(X)\n            opts.issym  = true;\n            SIGMA       = 'LA';\n        else\n            SIGMA       = 'LR';\n        end\n        % SIMGA = 'LM' (bug) prior to March 18 2012\n        while ~ok\n            K = min( [K,M,N] );\n            \n            if K > min(M,N)/2\n                [V,D]   = safe_eig(full((X+X')/2));\n                ok = true;\n                break;\n            end\n            \n            [V,D] = eigs( X, K, SIGMA, opts );\n            ok = (min(diag(D)) < tau) || ( K == min(M,N) );\n            if ok, break; end\n            K = 2*K;\n            if K > 10\n                opts.tol = 1e-6;\n            end\n            if K > 40\n                opts.tol = 1e-4;\n            end\n            if K > 100\n                opts.tol = 1e-3;\n            end\n\n        end\n        oldRank = length(find(diag(D) > tau));\n    end\n    s  = diag(D) - tau;\n    tt = s > 0;\n    s  = s(tt,:);\n    \n    if isempty(s),\n        X = tfocs_zeros(X);\n    else\n        X = V(:,tt) * bsxfun( @times, s, V(:,tt)' );\n        % And force it to be symmetric\n        X = (X+X')/2;\n    end\n    if numel(q)==1\n        v = q * sum(s);\n    else\n        % This is what we compute\n        %v   = tr( q'*X );\n        % but here is a faster way:\n        v   = q(:)'*X(:);\n    end\nelse\n    if numel(q)==1\n        v = q* trace( X + X' )/2;\n    else\n        X = (X+X')/2;\n        v   = q(:)'*X(:);\n    end\nend\n\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/randomizedSVD.m",
    "content": "function [U,S,V] = randomizedSVD( X, r, rEst, nPower, seed, opts )\n% [U,S,V] = randomizedSVD( X, r, rEst, nPower, seed, opts )\n%   returns V, S such that X ~ U*S*V' ( a m x n matrix)\n%   where S is a r x r matrix\n%   rEst >= r is the size of the random multiplies (default: ceil(r+log2(r)) )\n%   nPower is number of iterations to do the power method\n%    (should be at least 1, which is the default)\n%   seed can be the empty matrix; otherwise, it will be used to seed\n%       the random number generator (useful if you want reproducible results)\n%   opts is a structure containing further options, including:\n%       opts.warmStart  Set this to a matrix if you have a good estimate\n%           of the row-space of the matrix already. By default,\n%           a random matrix is used.\n%\n%   X can either be a m x n matrix, or it can be a cell array\n%       of the form {@(y)X*y, @(y)X'*y, n }\n%\n% Follows the algorithm from [1]\n%\n% [1] \"Finding Structure with Randomness: Probabilistic Algorithms \n% for Constructing Approximate Matrix Decompositions\"\n% by N. Halko, P. G. Martinsson, and J. A. Tropp. SIAM Review vol 53 2011.\n% http://epubs.siam.org/doi/abs/10.1137/090771806\n%\n\n% added to TFOCS in October 2014\n\nif isnumeric( X )\n    X_forward = @(y) X*y;\n    X_transpose = @(y) X'*y;\n    n   = size(X,2);\nelseif iscell(X)\n    if isa(X{1},'function_handle')\n        X_forward = X{1};\n    else\n        error('X{1} should be a function handle');\n    end\n    if isa(X{2},'function_handle')\n        X_transpose = X{2};\n    else\n        error('X{2} should be a function handle');\n    end\n    if size(X) < 3\n        error('Please specify X in the form {@(y)X*y, @(y)X''*y, n }' );\n    end\n    n = X{3};\nelse\n    error('Unknown type for X: should be matrix or cell/function handle'); \nend\nfunction out = setOpts( field, default )\n    if ~isfield( opts, field )\n        out = default;\n    else\n        out = opts.(field);\n    end\nend\n\n% If you want reproducible results for some reason:\nif nargin >= 6 && ~isempty(seed)\n    % around 2013 or 14 (not sure exactly)\n    %   they start changing .setDefaultStream...\n    if verLessThan('matlab','8.2')\n        RandStream.setDefaultStream(RandStream('mt19937ar', 'seed', seed) );\n    else\n        RandStream.setGlobalStream(RandStream('mt19937ar', 'seed', seed) );\n    end\nend\nif nargin < 3 || isempty( rEst )\n    rEst =  ceil( r + log2(r) ); % for example...\n    rEst = min( rEst, n );\nend\nif nargin < 4 || isempty( nPower )\n    nPower = 1;\nend\nif nPower < 1, error('nPower must be >= 1'); end\nif nargin < 6, opts = []; end\n\nwarmStart   = setOpts('warmStart',[] );\nif isempty( warmStart )\n    Q   = randn( n, rEst );\nelse\n    Q   = warmStart; \n    if size(Q,1) ~= n, error('bad height dimension for warmStart'); end\n    if size(Q,2) > rEst\n        % with Nesterov, we get this a lot, so disable it\n        warning('randomizedSVD:warmStartLarge','Warning: warmStart has more columns than rEst');\n%         disp('Warning: warmStart has more columns than rEst');\n    else\n        Q   = [Q, randn(n,rEst - size(Q,2)  )];\n    end\nend\nQ   = X_forward(Q);\n% Algo 4.4 in \"Structure in randomness\" paper, but we re-arrange a little\nfor j = 1:(nPower-1)\n    [Q,R] = qr(Q,0);\n    Q   = X_transpose(Q);\n    [Q,R] = qr(Q,0);\n    Q   = X_forward(Q);\nend\n[Q,R] = qr(Q,0);\n    \n% We can now approximate:\n%   X ~ QQ'X = QV'\n% Form Q'X, e.g. V = X'Q\nV   = X_transpose(Q);\n\n[V,R] = qr(V,0);\n[U,S,VV] = svd(R','econ');\nU   = Q*U;\nV   = V*VV;\n\n% Now, pick out top r. It's already sorted.\nU   = U(:,1:r);\nV   = V(:,1:r);\nS   = S(1:r,1:r);\n\n\nend % end of function\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/smooth_constant.m",
    "content": "function op = smooth_constant( d )\n\n%SMOOTH_CONSTANT   Constant function generation.\n%   FUNC = SMOOTH_CONSTANT( D ) returns a function handle that provides\n%   a TFOCS-compatible implementation of the constant function F(X) = D.\n%   D must be a real scalar. The function can be used in both a smooth\n%   and a nonsmooth context.\n\nerror(nargchk(1,1,nargin));\nif ~isa( d, 'double' ) || ~isreal( d ) || numel( d ) ~= 1,\n    error( 'Argument must be a real scalar.' );\nend\nop = @(varargin)smooth_constant_impl( d, varargin{:} );\n\nfunction [ v, g ] = smooth_constant_impl( v, x, t )\nswitch nargin,\n    case 2,\n        if nargin > 1,\n            g = 0 * x;\n        end\n    case 3,\n        g = x;\n    otherwise,\n        error( 'Not enough arguments.' );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/smooth_entropy.m",
    "content": "function op = smooth_entropy()\n%SMOOTH_ENTROPY The entropy function -sum( x_i log(x_i) )\nop = @smooth_entropy_impl;\n\nfunction [ v, g ] = smooth_entropy_impl( x )\nif any( x < 0 ),\n    v = -Inf;\n    if nargout > 1,\n        g = NaN * ones(size(x));\n    end\nelse\n    logx = log(max(x,realmin));\n    v = - tfocs_dot( x, logx );\n    if nargout > 1,\n        g = - logx - 1;\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/smooth_handles.m",
    "content": "function op = smooth_handles( func, grad )\n\n%SMOOTH_HANDLES Smooth function from separate f/g handles.\n%    OP = SMOOTH_HANDLES( func, grad ) constructs a TFOCS-compatible\n%    smooth function from separate handles for computing the function\n%    value and gradient.\n%\n%   See also private/tfocs_smooth\n\nop = @(varargin)smooth_handles_impl( func, grad, varargin{:} );\n\nfunction [ f, g ] = smooth_handles_impl( fop, gop, x, t )\nswitch nargin,\n\tcase 3,\n\t\tf = fop( x );\n\t\tif nargout > 1,\n\t\t\tg = gop( x );\n\t\tend\n\tcase 4,\n\t\terror( 'This function does not support proximity minimizaztion.' );\n\tcase { 0, 1, 2 },\n\t\terror( 'Not enough input arguments.' );\nend\t\t\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/smooth_huber.m",
    "content": "function op = smooth_huber(tau,vector)\n\n%SMOOTH_HUBER   Huber function generation.\n%   FUNC = SMOOTH_QUAD( TAU ) returns a function handle that implements\n%\n%        FUNC(X) = sum_i 0.5 *( x_i.^2 )/tau               if |x| <= tau\n%                = sum_i |x_i| - tau/2                     if |x| >  tau\n%\n%   All arguments are optional; the default value is tau = 1.\n%   The Huber function has continuous gradient and is convex.\n%\n%   The function acts component-wise.  TAU may be either a scalar\n%   or a vector/matrix of the same size as X\n%\n%   Does not support nonsmooth usage yet\n%\n%   FUNC = SMOOTH_QUAD( TAU, VECTOR )\n%       is the default behavior if VECTOR is false or [],\n%       and if VECTOR==true, then the output value FUNC\n%       is a vector of the same size as X. The default behavior\n%       would be recovered by taking the sum of FUNC.\n%       Note: the gradient is the same in either case, so make sure\n%        this is what you expect.\n%\n% Modified Jan 16 2015, input from Martin Andersen,\n%   changed default VECTOR behavior, and also compatible with \n%   complex numbers\n\n% Does not yet fully support tfocs_tuples\n\nif nargin == 0,\n    tau = 1;\nend\n% op = @(varargin) smooth_huber_impl(tau, varargin{:} ); % old method\n\nif nargin < 2 || isempty(vector), vector = false; end\n\nop = tfocs_smooth( @(x)smooth_huber_impl(vector,x) );\n\n\n% function [ v, g ] = smooth_huber_impl(tau, x, t ) % old method\nfunction [ v, g ] = smooth_huber_impl(vector,x)\n  if nargin == 4,\n      error( 'Proximity minimization not supported by this function.' );\n  end\n  if ~isscalar(tau) && ~size(tau) == size(x)\n      error('smooth_huber: tau must be a scalar or the same size as the variable');\n  end\n  if any(tau <= 0)\n      error('smooth_huber: tau must be positive')\n  end\n  smallSet    = ( abs(x) <= tau );\n  v           = smallSet.*( 0.5*(abs(x).^2)./tau ) + (~smallSet).*( abs(x) - tau/2) ;\n  if ~vector\n      % This is the default behavior: take the sum\n      v     = sum(v);\n  end\n  if nargout > 1\n%       g   = sign(x).*min( 1, abs(x)./tau );\n      % make more compatible with complex numbers\n      g     = x./max( tau, abs(x) );\n  end\nend % new method\n\nend % new method\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/smooth_linear.m",
    "content": "function op = smooth_linear( c, d )\n\n%SMOOTH_LINEAR   Linear function generation.\n%   FUNC = SMOOTH_LINEAR( C, D ) returns a function handle that provides a\n%   TFOCS-compatible implementation of a linear function: if\n%       [F,G] = FUNC(X),\n%   then F = TFOCS_DOT(C,X)+D and G = C. D is optional; if omitted, then \n%   D == 0 is assumed. But if it is supplied, D must be a real scalar.\n%   If C == 0, then this function is equivalent to SMOOTH_CONSTANT( D ).\n%   This function can be used in both smooth and non-smooth contexts.\n\nerror(nargchk(1,2,nargin));\nif nargin < 2,\n    d = 0;\nelseif ~isa( d, 'double' ) || ~isreal( d ) || numel( d ) ~= 1,\n    error( 'Second argument must be a real scalar.' );\nend\nif nnz(c),\n    op = @(varargin)smooth_linear_impl( c, d, varargin{:} );\nelse\n    op = smooth_constant( d );\nend\n\nfunction [ v, g ] = smooth_linear_impl( c, d, x, t )\nswitch nargin,\n    case 3,\n        g = c;\n    case 4,\n        x = x - t * c;\n        g = x;\n    otherwise,\n        error( 'Not enough arguments.' );\nend\nv = tfocs_dot( c, x ) + d;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/smooth_logLLogistic.m",
    "content": "function op = smooth_logLLogistic(y)\n% SMOOTH_LOGLLOGISTIC Log-likelihood function of a logistic: sum_i( y_i mu_i - log( 1+exp(mu_i) ) )\n%   OP = SMOOTH_LOGLLOGISTIC( Y )\n%   returns a function that computes the log-likelihood function\n%   in a standard logistic regression model with independent entries. There\n%   are two classes y_i = 0 and y_i = 1 with \n% \n%   prob(y_i = 1) = exp(mu_i)/(1 + exp(mu_i)\n% \n%   so that the log-likelihood is given by \n%\n%       log-likelihood(mu) = sum_i ( y_i mu_i - log(1+ exp(mu_i)) ) \n%\n%   where mu is the parameter of the distribution (this is unknown,\n%   so it is the variable), and Y is a vector of observations.\n\nerror(nargchk(1,1,nargin));\nop = tfocs_smooth( @smooth_logLlogistic_impl);\n\nfunction [ v, g ] = smooth_logLlogistic_impl( mu )\n\n  if length(mu) == 1, \n      mu = mu * ones(size(y));\n  elseif size(mu) ~= size(y),\n      error('Parameters and data must be of the same size'),\n  end\n  \n  aux = 1 + exp(-abs(mu));\n  v = tfocs_dot(y-1,mu.*(mu > 0)) ...\n         + tfocs_dot(y,mu.*(mu < 0)) ...\n              - tfocs_dot(ones(size(y)), log(aux));\n  if nargout > 1,\n      g = y - ((mu > 0) + (mu <= 0).*exp(mu))./aux;\n  end\nend\n\nend\n  \n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/smooth_logLPoisson.m",
    "content": "function op = smooth_logLPoisson(x)\n% SMOOTH_LOGLPOISSON Log-likelihood of a Poisson: sum_i (-lambda_i + x_i * log( lambda_i) )\n%   OP = SMOOTH_LOGLPOISSON( X )\n%   returns a function that computes the log-likelihood function\n%   of independent Poisson random variables with parameters lambda_i:\n%\n%       log-likelihood(lambda) = sum_i ( -lambda_i + x_i * log( lambda_i) )\n%\n%   where LAMBDA is the parameter of the distribution (this is unknown,\n%    so it is the variable), and X is a vector of observations.\n%\n%   Note: the constant term in the log-likelihood is omitted.\n\nerror(nargchk(1,1,nargin));\nop = tfocs_smooth( @smooth_llPoisson_impl );\n\nfunction [ v, g ] = smooth_llPoisson_impl( lambda )\n\n  if length(lambda) == 1, \n      lambda = lambda * ones(size(x));\n  elseif size(lambda) ~= size(x),\n      error('Parameters and data must be of the same size'),\n  end\n  \n  if any( lambda < 0 ),\n      v = -Inf;\n      if nargout > 1,\n          g = NaN * ones(size(x));\n      end\n  else\n      loglambda = log(max(lambda,realmin));\n      v = - tfocs_dot(lambda, ones(size(x))) + tfocs_dot( x, loglambda);\n      if nargout > 1,\n          g = -1 + x./lambda;\n      end\n  end\nend\n\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/smooth_logdet.m",
    "content": "function op = smooth_logdet(q,C)\n% SMOOTH_LOGDET   The -log( det( X ) ) function.\n%   (Note the minus sign)\n%   FUNC = SMOOTH_LOGDET( q ) returns a function handle that\n%   provides a TFOCS-compatible implementation of the funciton\n%       -q*log( det( X ) )\n%\n%   FUNC = SMOOTH_LOGDET( q, C ) represents\n%       -q*log( det( X ) ) + < C, X >, where C is symmetric/Hermitian\n%\n%   X must be symmetric/Hermitian and positive definite,\n%   and q must be a positive real number (if not provided,\n%   the default value is q = 1).\n%\n%   N.B. it is the user's responsibility to ensure\n%   that X is Hermitian and pos. def., since\n%   automatically checking is expensive.\n%\n%   This function is differentiable, but the gradient\n%   is not Lipschitz on the domain X > 0\n%\n%   This function does support proximity operations, and so\n%   it may be used as a nonsmooth function.\n%   However, the input must be symmetric positive definite\n%   (and if C is used, then it must also be > tC )\n\n% SRB: have not yet tested this.\n% SRB: I think we CAN compute the proximity operator to logdet.\n%       Will implement this in prox_logdet\nif nargin < 1, q = 1; end\nif nargin < 2, C = []; end\nif ~isreal(q) || q <= 0\n    error('First argument must be real and positive');\nend\n\n%op = @smooth_logdet_impl;\nif isempty(C)\n    op = @(varargin)smooth_logdet_impl( q, varargin{:} );\nelse\n    op = @(varargin)smooth_logdet_impl_C( q, C, varargin{:} );\nend\n\nfunction [ v, g ] = smooth_logdet_impl( q, x, t )\nif size(x,1) ~= size(x,2)\n    error('smooth_logdet: input must be a square matrix');\nend\nswitch nargin\n    case 2\n        % the function is being used in a \"smooth\" fashion\n        %v = -log(det(x));\n        v = -2*q*sum(log(diag(chol(x))));  % chol() takes half the time as det()\n                                 % and it is easier to avoid overflow errors\n                                 % since we sum the logs.\n                                 % Also, chol() will warn if not pos. def.\n        if nargout > 1\n            g = -q*inv(x);\n            % it would be nice to make g a function handle\n            % that calculates g(y) = -x\\y\n        end\n\n\n    case 3\n        % the function is being used in a \"nonsmooth\" fashion\n        % i.e. return g = argmin_g  -q*log(det(g)) + 1/(2t)||g-x||^2\n        x = full(x+x')/2;  % March 2015, project it to be symmetric\n        [V,D]   = safe_eig(x);\n        d       = diag(D);\n        % This is OK: input need not be pos def\n        %if any(d<=0),\n            %v   = Inf;\n            %g   = nan(size(x));\n            %return;\n%%             error('log_det requires a positive definite point'); \n        %end\n        l       = ( d + sqrt( d.^2 + 4*t*q ) )/2;\n        g       = V*diag(l)*V';\n        v       = -q*sum(log(l));\n    otherwise\n        error('Wrong number of arguments');\nend\n\n\nfunction [ v, g ] = smooth_logdet_impl_C( q, C, x, t )\nif size(x,1) ~= size(x,2)\n    error('smooth_logdet: input must be a square matrix');\nend\nif size(C,1) ~= size(C,2)\n    error('smooth_logdet: input must be a square matrix');\nend\nswitch nargin\n    case 3\n        % the function is being used in a \"smooth\" fashion\n        %v = -log(det(x));\n        v = -2*q*sum(log(diag(chol(x))));  % chol() takes half the time as det()\n                                 % and it is easier to avoid overflow errors\n                                 % since we sum the logs.\n                                 % Also, chol() will warn if not pos. def.\n        v = v + tfocs_dot( C, x );\n        if nargout > 1\n            g = -q*inv(x) + C;\n            % it would be nice to make g a function handle\n            % that calculates g(y) = -x\\y\n        end\n\n\n    case 4\n        % the function is being used in a \"nonsmooth\" fashion\n        % i.e. return g = argmin_g  -q*log(det(g)) + 1/(2t)||g-x||^2\n        x       = x - t*C;  \n        x = full(x+x')/2;  % March 2015, project it to be symmetric\n        [V,D]   = safe_eig(x);\n        d       = diag(D);\n        % This is OK: input need not be pos def\n        l       = ( d + sqrt( d.^2 + 4*t*q ) )/2;\n        g       = V*diag(l)*V';\n        v       = -q*sum(log(l));\n        v       = v + tfocs_dot( C, g );\n    otherwise\n        error('Wrong number of arguments');\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/smooth_logsumexp.m",
    "content": "function op = smooth_logsumexp(sigma)\n% SMOOTH_LOGSUMEXP The function log(sum(exp(x)))\n%   returns a smooth function to calculate\n%   log( sum( exp(x) ) )\n%\n% SMOOTH_LOGSUMEXP( SIGMA ) is a scaled version\n%   that calclates sigma*log(sum(exp(x/sigma)), for sigma > 0.\n%   As sigma --> 0, this becomes a good approximation\n%   of max(x).\n%   The Lipschitz constant of the gradient is 1/sigma.\n%   By default, sigma = 1.\n%\n% For a fancier version (with offsets),\n% see also smooth_logLLogistic.m\n\nif nargin < 1 || isempty(sigma), sigma = 1; end\nop = @(x)smooth_logsumexp_impl(x,sigma);\n\nfunction [ v, g ] = smooth_logsumexp_impl( x, sigma )\n\n% Even for moderate values of x/sigma, exp(x/sigma)\n%   will overflow before we have a chance to take\n%   its logarithm. So we subtract off the max value\n%   and treat it separately:\n\nc    = max(x);\nexpx = exp((x-c)/sigma);\nsum_expx = sum(expx(:));\nv = sigma*log(sum_expx) + c;\n\nif nargout > 1,\n    g = expx ./ sum_expx;\n    % (the factor of e^{-c} cancels from both the numerator\n    %  and denominator)\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/smooth_quad.m",
    "content": "function op = smooth_quad( P, q, r, use_eig )\n\n%SMOOTH_QUAD   Quadratic function generation.\n%   FUNC = SMOOTH_QUAD( P, q, r ) returns a function handle that implements\n%\n%        FUNC(X) = 0.5 * TFOCS_DOT( P * x, x ) + TFOCS_DOT( q, x ) + r.\n%\n%   All arguments are optional; the default values are P=I, q=0, r=0. In\n%   particular, calling FUNC = SMOOTH_QUAD with no arguments yields\n%   \n%        FUNC(X) = 0.5 * TFOCS_NORMSQ( X ) = 0.5 * TFOCS_DOT( X, X ).\n%\n%   If supplied, P must be a scalar, square matrix, or symmetric linear\n%   operator. Furthermore, it must be positive semidefinite (convex) or\n%   negative semidefinite (concave). TFOCS does not verify operator \n%   symmetry or definiteness; that is your responsibility.\n%   If P is a vector, then it assumed this is the diagonal part of P.\n%   Note: when P is diagonal, this function can compute a proximity\n%   operator.  If P is zero, then smooth_linear should be called instead.\n%   When P is an explicit matrix, this can also act as a proimity operator\n%   but it may be slow, since it must invert (I+tP). True use_eig mode (see below)\n%\n%   If P is a scaling matrix, like the identity or a multiple of the identity\n%   (say, P*x = 5*x), then specifying the scaling factor is sufficient (in\n%   this example, 5). If P is empty, then P=1 is assumed.\n%\n%   FUNC = SMOOTH_QUAD( P, q, r, use_eig )\n%      will perform a one-time (but expensive) eigenvalue decomposition\n%       of P if use_eig=true, which will speed up future iterations. In general,\n%       this may be significantly faster, especially if you run \n%       an algorithm for many iterations.\n%      This mode is only useful when P is a full matrix and when\n%      smooth_quad is used as a proximity operator; does not affect\n%      it when used as a smooth operator. New in v 1.3.\n%\n%   See also smooth_linear.m\n\nif nargin == 0,\n    op = @smooth_quad_simple;\n    return\nend\nif isa( P, 'function_handle' ),\n    sz = P([],0);\n    if ~isequal( sz{1}, sz{2} ),\n        error( 'P must be square.' );\n    end\nelseif ~isnumeric( P ),\n    error( 'P must be a scalar, matrix, or linear operator.' );\nelseif isempty(P)\n    P = 1;\nelseif ndims( P ) > 2 || (~isvector(P) && size( P, 1 ) ~= size( P, 2 ) ),\n    error( 'P must be a square matrix.' );\nend\nif nargin < 2 || isempty( q ),\n    q = 0;\nelseif numel(P) > 1 && numel(q) > 1 && length(q) ~= size(P,1),\n    error( 'Dimension mismatch between p and q.' );\nend\nif nargin < 3 || isempty( r ),\n    r = 0;\nelseif numel(r) > 1 || ~isreal( r ),\n    error( 'r must be a real scalar.' );\nend\nif nargin < 4, use_eig = false; end\n\nif isnumeric( P ),\n    if isvector( P )\n        if any(P) < 0 && any(P) < 0\n            error(' P must be convex (minimization) or concave (maximization) but cannot be mixed');\n        end\n        P = P(:); % make it a column vector\n        op = @(varargin)smooth_quad_diag_matrix( P, q, r, varargin{:} );\n    else\n        P = 0.5 * ( P + P' );\n        if use_eig\n            [V,DD] = safe_eig(P); dd = diag(DD);\n        else\n            V = []; dd = [];\n        end\n        op = @(varargin)smooth_quad_matrix( P, q, r, V, dd, varargin{:} );\n    end\nelse\n    op = @(varargin)smooth_quad_linop( P, q, r, varargin{:} );\nend\n\nfunction [ v, g ] = smooth_quad_matrix( P, q, r, V, dd, x, t )\nswitch nargin\n    case 6,\n        if size(x,2)>1 && size(q,1)==1\n            % User meant to supply repmat(q,1,size(x,2)) so we do it for\n            % them\n            g = P * x + repmat(q,1,size(x,2));\n            v = 0.5 *  tfocs_dot( x, g + repmat(q,1,size(x,2)) ) + r;\n        else\n            g = P * x + q;\n            v = 0.5 *  tfocs_dot( x, g + q ) + r;\n        end\n    case 7,\n        n = length(x);\n        \n        if ~isempty(V) && ~isempty(dd)\n            % Use the stored eigenvalue decomposition to improve speed\n            x  = V*( (V'*(x-t*q))./(t*dd+ones(n,1)) );\n        else\n            x = (eye(n) + t*P)\\ (x-t*q);\n        end\n        g = x; % for this case, \"g\" is NOT the gradient\n        v = 0.5 * tfocs_dot( P*x + 2*q, x ) + r;\nend\n%if nargin == 5,\n    %error( 'Proximity minimization not supported by this function.' );\n%end\n% Note: we don't support proximity minimization, but there is\n% nothing that prevents it theoretically.  You would need to know P^-1\n% (and ideally calculate it quickly).  \n% In particular, if P is diagonal, then it is easy.\n%g = P * x + q;\n%v = 0.5 *  tfocs_dot( x, g + q ) + r;\n\n\n\n%  Jan 10, 2011: this function isn't correct for case 5\n% function [ v, g ] = smooth_quad_diag_matrix( p, q, r, x, t )\n% switch nargin\n%     case 4,\n%     case 5,\n%         x = (1./(t*p+1)) .* x;\n% end\n% g = p .* x + q;\n% v = 0.5 *  tfocs_dot( x, g + q ) + r;\nfunction [ v, g ] = smooth_quad_diag_matrix( p, q, r, x, t )\nswitch nargin\n    case 4,\n        g = p .* x + q;\n        v = 0.5 *  tfocs_dot( x, g + q ) + r;\n    case 5,\n        x = (1./(t*p+1)) .* (x-t*q);\n        g = x; % for this case, \"g\" is NOT the gradient\n        v = 0.5 * tfocs_dot( p.*x + 2*q, x ) + r;\nend\n\nfunction [ v, g ] = smooth_quad_linop( P, q, r, x, t )\nif nargin == 5,\n    error( 'Proximity minimization not supported by this function.' );\nend\ng = P( x, 1 ) + q;\nv = 0.5 * tfocs_dot( x, g + q ) + r;\n\nfunction [ v, x ] = smooth_quad_simple( x, t )\nswitch nargin,\n    case 1,\n    case 2,\n        x = (1/(t+1)) * x;\nend\nv = 0.5 * tfocs_normsq( x );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_L1RLS.m",
    "content": "function [ x, odata, opts ] = solver_L1RLS( A, b, lambda, x0, opts )\n% SOLVER_L1RLS l1-regularized least squares problem, sometimes called the LASSO.\n% [ x, odata, opts ] = solver_L1RLS( A, b, lambda, x0, opts )\n%    Solves the l1-regularized least squares problem\n%        minimize (1/2)*norm( A * x - b )^2 + lambda * norm( x, 1 )\n%    using the Auslender/Teboulle variant with restart. A must be a matrix\n%    or a linear operator, b must be a vector, and lambda must be a real\n%    positive scalar. The initial point x0 and option structure opts are\n%    both optional.\n%\n%   Note: this formulation is sometimes referred to as \"The Lasso\"\n%\n%    If \"nonneg\" is a field in \"opts\" and opts.nonneg is true,\n%       then the constraint x >= 0 is also imposed\n\nerror(nargchk(3,5,nargin));\nif nargin < 4, x0 = []; end\nif nargin < 5, opts = []; end\nif ~isfield( opts, 'restart' ), \n    opts.restart = 100; \nend\n\nnonneg = false;\nif isfield(opts,'nonneg')\n    nonneg  = opts.nonneg;\n    opts = rmfield(opts,'nonneg');\nend\nif isfield(opts,'nonNeg')\n    nonneg  = opts.nonNeg;\n    opts = rmfield(opts,'nonNeg');\nend\n\nif nonneg\n    prox    = prox_l1pos( lambda );\nelse\n    prox    = prox_l1( lambda );\nend\n\n[x,odata,opts] = tfocs( smooth_quad, { A, -b }, prox, x0, opts );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_LASSO.m",
    "content": "function [ x, out, opts ] = solver_LASSO( A, b, tau, x0, opts )\n% SOLVER_LASSO Minimize residual subject to l1-norm constraints.\n% [ x, out, opts ] = solver_LASSO( A, b, tau, x0, opts )\n%    Solves the LASSO in the standard Tibshirani formulation,\n%        minimize (1/2)*norm(A*x-b)^2\n%        s.t.     norm(x,1) <= tau\n%    A must be a linear operator or matrix, and b must be a vector. The\n%    initial point x0 and the options structure opts are optional.\n%\n%   Note: many people use \"LASSO\" to refer to the problem:\n%       minimize 1/2*norm(A*x-b)^2 + lambda*norm(x,1)\n%   In TFOCS, this version is implemented in \"solver_L1RLS\"\n%   (which stands for \"L1 regularized Least Squares\" )\n%\n%    If \"nonneg\" is a field in \"opts\" and opts.nonneg is true,\n%       then the constraint x >= 0 is also imposed\n%\n% See also solver_L1RLS.m, solver_sBPDN.m\n\n% Supply default values\nerror(nargchk(3,5,nargin));\nif nargin < 4, x0 = []; end\nif nargin < 5, opts = []; end\nif ~isfield( opts, 'restart' ), opts.restart = 100; end\n\nnonneg = false;\nif isfield(opts,'nonneg')\n    nonneg  = opts.nonneg;\n    opts = rmfield(opts,'nonneg');\nend\nif isfield(opts,'nonNeg')\n    nonneg  = opts.nonNeg;\n    opts = rmfield(opts,'nonNeg');\nend\n\nif nonneg\n    proj    = proj_simplex(tau);\nelse\n    proj    = proj_l1(tau);\nend\n\n% Extract the linear operators\n[x,out,opts] = tfocs( smooth_quad, { A, -b }, proj, x0, opts );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_SLOPE.m",
    "content": "function [ x, odata, opts ] = solver_SLOPE( A, b, lambda, x0, opts )\n% SOLVER_SLOPE Sorted l1-regularized least squares problem, \n% [ beta, odata, opts ] = solver_SLOPE( X, y, lambda, beta0, opts )\n%    Solves the l1-regularized least squares problem, using the sorted/ordered l1 norm, \n%        minimize (1/2)*norm( A * x - b )^2 + norm( lasso.*sort(abs(x),'descend'), 1 )\n%    using the Auslender/Teboulle variant with restart. X must be a matrix\n%    or a linear operator, y must be a vector, and lambda must be a real\n%    positive vector in decreasing order. \n%    The initial point beta0 and option structure opts are both optional.\n%\n% SLOPE stands for Sorted L-One Penalized Estimation\n%\n% Reference:\n%   \"Statistical Estimation and Testing via the Ordered l1 Norm\"\n%   by M. Bogdan, E. van den Berg, W. Su, and E. J. Candès, 2013\n%   http://www-stat.stanford.edu/~candes/OrderedL1/\n%\n%   See also solver_L1RLS.m, solver_LASSO.m, prox_Sl1.m\n\nerror(nargchk(3,5,nargin));\nif nargin < 4, x0 = []; end\nif nargin < 5, opts = []; end\nif ~isfield( opts, 'restart' ), \n    opts.restart = 100; \nend\n\n[x,odata,opts] = tfocs( smooth_quad, { A, -b }, prox_Sl1( lambda ), x0, opts );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_TraceLS.m",
    "content": "function [ x, odata, opts ] = solver_TraceLS( A, b, lambda, x0, opts )\n% SOLVER_TRACELS Unconstrained form of trace-regularized least-squares problem.\n% [ x, odata, opts ] = solver_TraceLS( A, b, lambda, x0, opts )\n%    Solves the trace-regularized least squares problem\n%        minimize (1/2)*norm( A * X - b )^2 + lambda * trace( X )\n%        with the constraint that X is positive semi-definite.\n%    A must be a matrix or a linear operator, b must be a vector, \n%    and lambda must be a real positive scalar. \n%    The initial point x0 and option structure opts are\n%    both optional.\n%\n%    If \"A\" is a sparse matrix, and nnz(Z) = length(b), then it is assumed\n%    that the nonzero entries correspond to samples, and then the\n%    corresponding sampling operator is used.\n%\n%    If opts.largescale = true, then uses an iterative method\n%    to compute the eigenvalue decomposition used with prox_trace.\n%\n%   See also solver_L1RLS (aka The Lasso)\n\n\n% Added Feb 7, 2011\nerror(nargchk(3,5,nargin));\nif nargin < 4, x0 = []; end\nif nargin < 5, opts = []; end\nif ~isfield( opts, 'restart' ), \n    opts.restart = 100; \nend\nif issparse(A) && nnz(A) == length(b)\n    A = linop_subsample(A);\nend\nif isfield( opts,'largescale')\n    prx = prox_trace( lambda, opts.largescale );\n    opts = rmfield(opts,'largescale');\nelse\n    prx = prox_trace( lambda );\nend\n% Note: the proximity operator of trace is really a combination\n%  of the proximity operator of trace and the indicator\n%  set of positive semi-definite matrices.\n%  So we do not need to *explicitly* include the positive semi-definite constraint.\n\n[x,odata,opts] = tfocs( smooth_quad, { A, -b }, prx, x0, opts );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_psdComp.m",
    "content": "function [ x, out, opts ] = solver_psdComp( Xinc, opts )\n% SOLVER_PSDCOMP Matrix completion for PSD matrices.\n% [ x, out, opts ] = solver_psdComp( Xinc, opts )\n%    Solves the PSD matrix completion problem\n%        minimize (1/2)*norm(X(ij)-vv).^2\n%        s.t.     X p.s.d\n%    where ij is a vector of indices corresponding to the known elements.\n%    The nonzero values of Xinc are assumed to be the known values; that\n%    is, all zero values are considered unknowns. In order to specify a\n%    known zero value, replace it with a very small value; e.g., 1e-100.\n%\n%   Since X must be symmetric, the ij entries should have symmetry. If they\n%   are not specified symmetrically, then choose opts.symmetrize = true\n%   to force them to become symmetric. This will change the objective\n%   function.\n%\n%   Set opts.largescale=true to use eigs() instead if eig().\n%\n% See also solver_psdCompConstrainedTrace\n\n% Supply default values\nerror(nargchk(1,2,nargin));\nif nargin < 2, opts = []; end\nif ~isfield( opts, 'restart' ), \n    opts.restart = 50; \nend\nif isfield( opts, 'symmetrize' ), \n    symmetrize = opts.symmetrize;\n    opts = rmfield(opts,'symmetrize');\nelse\n    symmetrize = false;\nend\nif isfield( opts, 'largescale' ), \n    largescale = opts.largescale;\n    opts = rmfield(opts,'largescale');\nelse\n    largescale = false;\nend\n[n,m] = size(Xinc);\nif n ~= m, error( 'Input must be square.' ); end\n\nif norm(Xinc-Xinc','fro') > 1e-8*norm(Xinc,'fro') && symmetrize\n    Xinc    = symmetrizeSparseMatrix(Xinc);\n    disp('symmetrizing input');\nend\nlinop = linop_subsample(Xinc);\nvv    = full( Xinc( find(Xinc) ) );\n\n[x,out,opts] = tfocs( smooth_quad, { linop, -vv }, proj_psd(largescale), Xinc, opts );\n\n\nfunction X = symmetrizeSparseMatrix( X )\n    %   Some entries were only specified once, others were\n    %   double-specified, so we don't know if we should\n    %   divide by 1 or 2\n    ind1 = find( tril(X) );\n    ind2 = find( tril(X',-1) );\n    X    = tril(X) + tril( X', -1);\n    ind  = intersect(ind1,ind2);\n    X(ind) = X(ind)/2;\n    X    = X + tril(X,-1)';\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_psdCompConstrainedTrace.m",
    "content": "function [ x, out, opts ] = solver_psdCompConstrainedTrace( Xinc, tr, opts )\n% SOLVER_PSDCOMPCONSTRAINEDTRACE Matrix completion with constrained trace, for PSD matrices.\n% [ x, out, opts ] = solver_psdCompConstrainedTrace( Xinc, tr, opts )\n%    Solves the PSD matrix completion problem\n%        minimize (1/2)*norm(X(ij)-vv).^2\n%        s.t.     X p.s.d and trace(X) = tr\n%    where ij is a vector of indices corresponding to the known elements.\n%    The nonzero values of Xinc are assumed to be the known values; that\n%    is, all zero values are considered unknowns. In order to specify a\n%    known zero value, replace it with a very small value; e.g., 1e-100.\n%\n%   Since X must be symmetric, the ij entries should have symmetry. If they\n%   are not specified symmetrically, then choose opts.symmetrize = true\n%   to force them to become symmetric. This will change the objective\n%   function.\n%\n%   See also solver_psdComp\n\n% Supply default values\nerror(nargchk(1,3,nargin));\nif nargin < 3, opts = []; end\nif ~isfield( opts, 'restart' ), \n    opts.restart = 50; \nend\nif isfield( opts, 'symmetrize' ), \n    symmetrize = opts.symmetrize;\n    opts = rmfield(opts,'symmetrize');\nelse\n    symmetrize = false;\nend\nif nargin < 2 || isempty(tr)\n    tr = 1;\nend\n\n[n,m] = size(Xinc);\nif n ~= m, error( 'Input must be square.' ); end\n% If not symmetric, then make it symmetric\nif norm(Xinc-Xinc','fro') > 1e-8*norm(Xinc,'fro') && symmetrize\n    Xinc = symmetrizeSparseMatrix(Xinc);\n    disp('symmetrizing input');\nend\n\n% -- This doesn't work so well --\n% Xinc = tril(Xinc);\n% [ii,jj,vv] = find(Xinc);\n% ij = sub2ind( [n,n], ii, jj );\n% linop = @(varargin)samp_op( n, ii, jj, ij, varargin{:} );\n% \n% Xinc = Xinc + tril(Xinc,-1)';\n\n% This is better:\nlinop = linop_subsample(Xinc);\nvv    = full( Xinc( find(Xinc) ) );\n\n% Extract the linear operators\n[x,out,opts] = tfocs( smooth_quad, { linop, -vv }, proj_psdUTrace(tr), Xinc, opts );\n\n% we use a special sampling operator to tell it to make it symmetric\nfunction y = samp_op( n, ii, jj, ij, X, mode )\nswitch mode\n    case 0,\n        y = { [n,n], [length(ii),1] };\n    case 1,\n        X = (X+X')/2;\n        y = full(X(ij)); %otherwise it is a sparse vector \n    case 2,\n        y = sparse( ii, jj, X, n, n );\n        y = y + tril(y,-1)';\nend\n\nfunction X = symmetrizeSparseMatrix( X )\n    %   Some entries were only specified once, others were\n    %   double-specified, so we don't know if we should\n    %   divide by 1 or 2\n    ind1 = find( tril(X) );\n    ind2 = find( tril(X',-1) );\n    X    = tril(X) + tril( X', -1);\n    ind  = intersect(ind1,ind2);\n    X(ind) = X(ind)/2;\n    X    = X + tril(X,-1)';\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sBP.m",
    "content": "function varargout = solver_sBP( A, b, mu, x0, z0, opts, varargin )\n% SOLVER_SBP Basis pursuit (l1-norm with equality constraints). Uses smoothing.\n% [ x, out, opts ] = solver_sBP( A, b, mu, x0, z0, opts )\n%    Solves the smoothed basis pursuit problem\n%        minimize norm(x,1) + 0.5*mu*(x-x0).^2\n%        s.t.     A * x == b\n%    by constructing and solving the composite dual\n%        maximize - g_sm(z)\n%    where\n%        g_sm(z) = sup_x <z,Ax-b>-norm(x,1)-(1/2)*mu*norm(x-x0)\n%    A must be a linear operator or matrix, and b must be a vector. The\n%    initial point x0 and the options structure opts are optional.\n%\n%    If \"nonneg\" is a field in \"opts\" and opts.nonneg is true,\n%       then the constraints are   A * x == b   AND  x >= 0\n\n% Supply default values\nerror(nargchk(3,7,nargin));\nif nargin < 4, x0 = []; end\nif nargin < 5, z0 = []; end\nif nargin < 6, opts = []; end\nif ~isfield( opts, 'restart' ), opts.restart = 400; end\n\n\n% -- legacy options from original software --\nif isfield(opts,'lambda0')\n    opts = rmfield(opts,'lambda0');\nend\nif isfield(opts,'xPlug')\n    opts = rmfield(opts,'xPlug');\nend\nif isfield(opts,'solver')\n    svr     = opts.solver;\n    opts    = rmfield(opts,'solver');\n    if isfield(opts,'alg') && ~isempty(opts.alg)\n        disp('Warning: conflictiong options for the algorithm');\n    else\n        % if specified as \"solver_AT\", truncate:\n        s = strfind( svr, '_' );\n        if ~isempty(s), svr = svr(s+1:end); end\n        opts.alg = svr;\n    end\nend\n\n\nnonneg = false;\nif isfield(opts,'nonneg')\n    nonneg  = opts.nonneg;\n    opts = rmfield(opts,'nonneg');\nend\nif isfield(opts,'nonNeg')\n    nonneg  = opts.nonNeg;\n    opts = rmfield(opts,'nonNeg');\nend\n\nif nonneg       \n    % -- case: x >= 0 constraints\n    prox    = prox_l1pos;\nelse\n    % -- case: no x >= 0 constraint\n    prox    = prox_l1;\nend\n[varargout{1:max(nargout,1)}] = ...\n    tfocs_SCD( prox, { A, -b }, proj_Rn, mu, x0, z0, opts, varargin{:} );\n    \n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sBPDN.m",
    "content": "function varargout = solver_sBPDN( A, b, epsilon, mu, x0, z0, opts, varargin )\n% SOLVER_SBPDN Basis pursuit de-noising. BP with relaxed constraints. Uses smoothing.\n% [ x, out, opts ] = solver_sBPDN( A, b, epsilon, mu, x0, z0, opts )\n%    Solves the smoothed basis pursuit denoising problem\n%        minimize norm(x,1) + 0.5*mu*(x-x0).^2\n%        s.t.     norm(A*x-b,2) <= epsilon\n%    by constructing and solving the composite dual\n%        maximize - g_sm(z) - epsilon*norm(z,2)\n%    where\n%        gsm(z) = sup_x <z,Ax-b>-norm(x,1)-(1/2)*mu*norm(x-x0)\n%    A must be a linear operator or matrix, and b must be a vector. The\n%    initial point x0 and the options structure opts are optional.\n%\n%    If \"nonneg\" is a field in \"opts\" and opts.nonneg is true,\n%       then the constraints are     norm(A*x-b,2) <= epsilon   AND  x >= 0\n\n% Supply default values\nerror(nargchk(4,8,nargin));\nif nargin < 5, x0 = []; end\nif nargin < 6, z0 = []; end\nif nargin < 7, opts = []; end\nif ~isfield( opts, 'restart' ), opts.restart = 400; end\n\nif epsilon < 0\n    error('TFOCS error: epsilon is negative');\nend\nif ~epsilon\n    error('TFOCS error: cannot handle epsilon = 0.  Please call solver_sBP instead');\nelseif epsilon < 100*builtin('eps')\n    warning('TFOCS:badConstraint',...\n        'TFOCS warning: epsilon is near zero; consider calling solver_sBP instead');\nend\n\n\n% -- legacy options from original software --\nif isfield(opts,'lambda0')\n    opts = rmfield(opts,'lambda0');\nend\nif isfield(opts,'xPlug')\n    opts = rmfield(opts,'xPlug');\nend\nif isfield(opts,'solver')\n    svr     = opts.solver;\n    opts    = rmfield(opts,'solver');\n    if isfield(opts,'alg') && ~isempty(opts.alg)\n        disp('Warning: conflictiong options for the algorithm');\n    else\n        % if specified as \"solver_AT\", truncate:\n        s = strfind( svr, '_' );\n        if ~isempty(s), svr = svr(s+1:end); end\n        opts.alg = svr;\n    end\nend\n\n\n\n\nnonneg = false;\nif isfield(opts,'nonneg')\n    nonneg  = opts.nonneg;\n    opts = rmfield(opts,'nonneg');\nend\nif isfield(opts,'nonNeg')\n    nonneg  = opts.nonNeg;\n    opts = rmfield(opts,'nonNeg');\nend\n\nif nonneg       \n    % -- case: x >= 0 constraints\n    prox    = prox_l1pos;\nelse\n    % -- case: no x >= 0 constraint\n    prox    = prox_l1;\nend\n[varargout{1:max(nargout,1)}] = ...\n    tfocs_SCD( prox, { A, -b }, prox_l2( epsilon ), mu, x0, z0, opts, varargin{:} );\n\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sBPDN_W.m",
    "content": "function varargout = solver_sBPDN_W( A, W, b, epsilon, mu, x0, z0, opts, varargin )\n% SOLVER_SBPDN_W Weighted BPDN problem. Uses smoothing.\n% [ x, out, opts ] = solver_sBPDN_W( A, W, b, epsilon, mu, x0, z0, opts )\n%    Solves the smoothed basis pursuit denoising problem\n%        minimize norm(Wx,1) + 0.5*mu*(x-x0).^2\n%        s.t.     norm(A*x-b,2) <= epsilon\n%    by constructing and solving the composite dual.\n%    A and W must be a linear operator or matrix, and b must be a vector. The\n%    initial point x0 and the options structure opts are optional.\n%\n%    If \"nonneg\" is a field in \"opts\" and opts.nonneg is true,\n%       then the constraints are     norm(A*x-b,2) <= epsilon   AND  x >= 0\n%    If \"box\" is a field in \"opts\" and opts.box = [l,u]\n%       then the constraints are    norm(A*x-b,2) <= epsilon   AND  l <= x <= u\n%\n%    See also solver_sBPDN\n\n\n% Supply default values\nerror(nargchk(5,9,nargin));\nif nargin < 6, x0 = []; end\nif nargin < 7, z0 = []; end\nif nargin < 8, opts = []; end\nif ~isfield( opts, 'restart' ), opts.restart = 1000; end\n\nif epsilon < 0\n    error('TFOCS error: epsilon is negative');\nend\n% we don't have solver_sBP_W, so am building this into this function:\n%if ~epsilon\n    %error('TFOCS error: cannot handle epsilon = 0.  Please call solver_sBP_W instead');\n%elseif epsilon < 100*builtin('eps')\n    %warning('TFOCS:badConstraint',...\n        %'TFOCS warning: epsilon is near zero; consider calling solver_sBP instead');\n%end\n\n% Need to estimate the norms of A*A' and W*W' in order to be most efficient\nif isfield( opts, 'noscale' ) && opts.noscale,\n    normA2 = 1; normW2 = 1;\nelse\n    normA2 = []; normW2 = [];\n    if isfield( opts, 'normA2' ),\n        normA2 = opts.normA2;\n        opts = rmfield( opts, 'normA2' );\n    end\n    if isfield( opts, 'normW2'  ),\n        normW2 = opts.normW2;\n        opts = rmfield( opts, 'normW2' );\n    end\nend\nif isempty( normA2 ),\n    normA2 = linop_normest( A ).^2;\nend\nif isempty( normW2 ),\n    normW2 = linop_normest( W ).^2;\nend\n\n% if ~isfield(opts,'L0') || isempty(opts.L0)\n%     opts.L0 = normA2/mu;  % is this right? check\n% end\n\nproxScale   = sqrt( normW2 / normA2 );\nif epsilon > 0\n    prox        = { prox_l2( epsilon ), proj_linf(proxScale) };\nelse\n    prox        = { proj_Rn, proj_linf(proxScale) };\nend\nW           = linop_compose( W, 1 / proxScale );\n\n% Adding Jan 2014\nnonneg = false; box = false;\nif isfield(opts,'nonneg')\n    nonneg  = opts.nonneg;\n    opts = rmfield(opts,'nonneg');\nend\nif isfield(opts,'nonNeg')\n    nonneg  = opts.nonNeg;\n    opts = rmfield(opts,'nonNeg');\nend\nif nonneg       \n    % -- case: x >= 0 constraints\n    proxP    = proj_Rplus;\nelse\n    % -- case: no x >= 0 constraint\n    proxP    = [];\nend\nif isfield(opts,'box')\n    box  = opts.box;\n    if length(box)==2\n        if nonneg, error('cannot use box constaints and non-neg constraints simultaneously');\n        end\n        proxP   = proj_box(box(1),box(2));\n    end\n    opts = rmfield(opts,'box');\nend\n\n\n[varargout{1:max(nargout,1)}] = ...\n    tfocs_SCD( proxP, { A, -b; W, 0 }, prox, mu, x0, z0, opts, varargin{:} );\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sBPDN_WW.m",
    "content": "function varargout = solver_sBPDN_WW( A, alpha, W1, beta, W2, b, epsilon, mu, x0, z0, opts, varargin )\n% SOLVER_SBPDN_WW BPDN with two separate (weighted) l1-norm terms. Uses smoothing.\n% [ x, out, opts ] = solver_sBPDN_WW( A, alpha, W_1, beta, W_2, b, epsilon, mu, x0, z0, opts )\n%    Solves the smoothed basis pursuit denoising problem\n%        minimize alpha*norm(W_1 x,1) + beta*norm(W_2 x, 1) + 0.5*mu*(x-x0).^2\n%        s.t.     norm(A*x-b,2) <= epsilon\n%    by constructing and solving the composite dual.\n%    A, W_1 and W_2 must be a linear operator or matrix, and b must be a vector. The\n%    initial points x0, z0 and the options structure opts are optional.\n%    See also solver_sBPDN and solver_sBPDN_W\n\n% Supply default values\nerror(nargchk(8,12,nargin));\nif nargin < 9, x0 = []; end\nif nargin < 10, z0 = []; end\nif nargin < 11, opts = []; end\nif ~isfield( opts, 'restart' ), opts.restart = 5000; end\n\nif epsilon < 0\n    error('TFOCS error: epsilon is negative');\nend\nif ~epsilon\n    error('TFOCS error: cannot handle epsilon = 0.  Please call solver_sBP instead');\nelseif epsilon < 100*builtin('eps')\n    warning('TFOCS:badConstraint',...\n        'TFOCS warning: epsilon is near zero; consider calling solver_sBP instead');\nend\n\n% Need to estimate the norms of A*A' and W*W' in order to be most efficient\nif isfield( opts, 'noscale' ) && opts.noscale,\n    normA2 = 1; normW12 = 1; normW22 = 1;\nelse\n    normA2 = []; normW12 = []; normW22 = [];\n    if isfield( opts, 'normA2'  )\n        normA2 = opts.normA2;\n        opts = rmfield( opts, 'normA2' );\n    end\n    if isfield( opts, 'normW12' )\n        normW12 = opts.normW12;\n        opts = rmfield( opts, 'normW12' );\n    end\n    if isfield( opts, 'normW22' )\n        normW22 = opts.normW22;\n        opts = rmfield( opts, 'normW22' );\n    end\nend\nif isempty( normA2 ),\n    normA2 = linop_normest( A ).^2;\nend\nif isempty( normW12 ),\n    normW12 = linop_normest( W1 ).^2;\nend\nif isempty( normW22 ),\n    normW22 = linop_normest( W2 ).^2;\nend\nif isempty(alpha), \n    alpha = 1; \nend\nif isempty(beta), \n    beta = 1; \nend\n\nproxScale1 = sqrt( normW12 / normA2 );\nproxScale2 = sqrt( normW22 / normA2 );\nprox       = { prox_l2( epsilon ), ...\n               proj_linf( proxScale1 * alpha ),...\n               proj_linf( proxScale2 * beta ) };\nW1         = linop_compose( W1, 1 / proxScale1 );\nW2         = linop_compose( W2, 1 / proxScale2 );\n[varargout{1:max(nargout,1)}] = ...\n    tfocs_SCD( [], { A, -b; W1, 0; W2, 0 }, prox, mu, x0, z0, opts, varargin{:} );\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sDantzig.m",
    "content": "function varargout = solver_sDantzig( A, b, delta, mu, x0, z0, opts, varargin )\n% SOLVER_SDANTZIG Dantzig selector problem. Uses smoothing.\n%[ x, out, opts ] = solver_sDantzig( A, b, delta, mu, x0, z0, opts )\n%    Solves the smoothed Dantzig\n%        minimize norm(x,1) + (1/2)*mu*norm(x-x0).^2\n%        s.t.     norm(D.*(A'*(A*x-b)),Inf) <= delta\n%    by constructing and solving the composite dual\n%        maximize - g_sm(z) - delta*norm(z,1)\n%    where\n%        gsm(z) = sup_x <z,D.*A'*(Ax-b)>-norm(x,1)-(1/2)*mu*norm(x-x0)\n%    A must be a linear operator, b must be a vector, and delta and mu\n%    must be positive scalars. Initial points x0 and z0 are optional.\n%    The standard calling sequence assumes that D=I. To supply a scaling,\n%    pass the cell array { A, D } instead of A. D must either be a scalar,\n%    a vector of weights, or a linear operator.\n\n% Supply default values\nerror(nargchk(4,8,nargin));\nif nargin < 5, x0   = []; end\nif nargin < 6, z0   = []; end\nif nargin < 7, opts = []; end\n\n% -- legacy options from original software --\nif isfield(opts,'lambda0')\n    z0 = opts.lambda0;\n    opts = rmfield(opts,'lambda0');\nend\nif isfield(opts,'xPlug')\n    x0 = opts.xPlug;\n    opts = rmfield(opts,'xPlug');\nend\nif isfield(opts,'solver')\n    svr     = opts.solver;\n    opts    = rmfield(opts,'solver');\n    if isfield(opts,'alg') && ~isempty(opts.alg)\n        disp('Warning: conflictiong options for the algorithm');\n    else\n        % if specified as \"solver_AT\", truncate:\n        s = strfind( svr, '_' );\n        if ~isempty(s), svr = svr(s+1:end); end\n        opts.alg = svr;\n    end\nend\n\n% Extract the linear operators\nD = [];\nif isa( A, 'cell' ),\n    if length(A) > 1, D = A{2}; end\n    A = A{1};\nend\nif isempty(D),\n    D = @(x)x;\nelseif isa( D, 'double' ),\n    D = @(x)D.*x;\nend\nif isa( A, 'double' ),\n    A = linop_matrix(A);\nend\n\n% Call TFOCS\nobjectiveF = prox_l1;\naffineF    = { @(y,mode)linear_DS( D, A, y, mode ), -D(A(b,2)) };\ndualproxF  = prox_l1( delta );\n[varargout{1:max(nargout,1)}] = ...\n    tfocs_SCD( objectiveF, affineF, dualproxF, mu, x0, z0, opts, varargin{:} );\n\n% Implements x -> D*A'*A*x and its adjoint if A is a linop\nfunction y = linear_DS( D, A, y, mode )\nswitch mode,\ncase 0, \n    y = A([],0);\n    if iscell( y ),\n        y = { y{1}, y{1} };\n    else\n        y = { [y(2),1], [y(2),1] };\n    end\ncase 1, y = D(A(A(y,1),2));\ncase 2, y = A(A(D(y),1),2);\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sDantzig_W.m",
    "content": "function varargout = solver_sDantzig_W( A,W, b, delta, mu, x0, z0, opts, varargin )\n% SOLVER_SDANTZIG_W Weighted Dantzig selector problem. Uses smoothing.\n%[ x, out, opts ] = solver_sDantzig_W( A,W, b, delta, mu, x0, z0, opts )\n%    Solves the smoothed Dantzig\n%        minimize norm(W*x,1) + (1/2)*mu*norm(x-x0).^2\n%        s.t.     norm(D.*(A'*(A*x-b)),Inf) <= delta\n%    by constructing and solving the composite dual\n%\n%    A and W must be a linear operator, b must be a vector, and delta and mu\n%    must be positive scalars. Initial points x0 and z0 are optional.\n%    The standard calling sequence assumes that D=I. To supply a scaling,\n%    pass the cell array { A, D } instead of A. D must either be a scalar,\n%    a vector of weights, or a linear operator.\n%\n%   Pass in the options \"normA2\" and \"normW2\" (which are ||A||^2\n%       and ||W||^2 respectively) for best efficiency.\n%\n%   See also solver_sDantzig\n\n% Supply default values\nerror(nargchk(5,9,nargin));\nif nargin < 6, x0   = []; end\nif nargin < 7, z0   = []; end\nif nargin < 8, opts = []; end\n\nif isfield(opts,'solver')\n    svr     = opts.solver;\n    opts    = rmfield(opts,'solver');\n    if isfield(opts,'alg') && ~isempty(opts.alg)\n        disp('Warning: conflictiong options for the algorithm');\n    else\n        % if specified as \"solver_AT\", truncate:\n        s = strfind( svr, '_' );\n        if ~isempty(s), svr = svr(s+1:end); end\n        opts.alg = svr;\n    end\nend\n\n% Extract the linear operators\nD = [];\nif isa( A, 'cell' ),\n    if length(A) > 1, D = A{2}; end\n    A = A{1};\nend\nif isempty(D),\n    D = @(x)x;\nelseif isa( D, 'double' ),\n    D = @(x)D.*x;\nend\nif isa( A, 'double' ),\n    % if \"A\" is not too rectangular, it is probably more efficient\n    %   to compute A'*A once at the beginning and store it.\n    mn  = min(size(A));\n    mx  = max(size(A));\n    if mn >= .7*mx && mx < 1e5\n        AA = @(y,mode)linear_DS_AA( D, A'*A, y, mode );\n        A = linop_matrix(A);\n    else\n        A = linop_matrix(A);\n        AA = @(y,mode)linear_DS( D, A, y, mode );\n    end\nelse\n    AA = @(y,mode)linear_DS( D, A, y, mode );\nend\n\n% Need to estimate the norms of A*A' and W*W' in order to be most efficient\nif isfield( opts, 'noscale' ) && opts.noscale,\n    normA2 = 1; normW2 = 1;\nelse\n    normA2 = []; normW2 = [];\n    if isfield( opts, 'normA2' ),\n        normA2 = opts.normA2;\n        opts = rmfield( opts, 'normA2' );\n    end\n    if isfield( opts, 'normW2'  ),\n        normW2 = opts.normW2;\n        opts = rmfield( opts, 'normW2' );\n    end\nend\nif isempty( normA2 ),\n    normA2 = linop_normest( A ).^2;\nend\nif isempty( normW2 ),\n    normW2 = linop_normest( W ).^2;\nend\n\n% Call TFOCS\nproxScale   = sqrt( normW2 / normA2 );\nprox        = { prox_l1( delta ); proj_linf(proxScale) };\nW           = linop_compose( W, 1/proxScale);\naffineF     = {AA, -D(A(b,2)); W, 0 };\n[varargout{1:max(nargout,1)}] = ...\n    tfocs_SCD( [], affineF, prox, mu, x0, z0, opts, varargin{:} );\n\n\n% Implements x -> D*A'*A*x and its adjoint if A is a linop\nfunction y = linear_DS( D, A, y, mode )\nswitch mode,\ncase 0, \n    y = A([],0);\n    if iscell( y ),\n        y = { y{1}, y{1} };\n    else\n        y = { [y(2),1], [y(2),1] };\n    end\ncase 1, y = D(A(A(y,1),2));\ncase 2, y = A(A(D(y),1),2);\nend\n\nfunction y = linear_DS_AA( D, AA, y, mode )\n% similar to above, but expects AA to be an explicit Hermitian matrix\nswitch mode,\ncase 0, \n    y = size(AA);\n    if iscell( y ),\n        y = { y{1}, y{1} };\n    else\n        y = { [y(2),1], [y(2),1] };\n    end\ncase 1, y = D(AA*y);\ncase 2, y = AA*D(y);\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sLMI.m",
    "content": "function varargout = solver_sLMI( A0, A, b, mu, x0, z0, opts, varargin )\n% SOLVER_SLMI Generic linear matrix inequality problems (LMI is the dual of a SDP). Uses smoothing.\n% [ y, out, opts ] = solver_sLMI( A0, A, b, mu, y0, z0, opts )\n%    Solves the smoothed Linear-Matrix Inequality (LMI) problem\n%\n%        minimize_y   b'*y\n%        s.t.     A0 + sum_i A_i y(i) >= 0\n%          \" >= 0 \" indicates that a matrix is positive semi-definite.\n%    \n%   \"A0\" and must be a symmetric/Hermitian matrix, \"b\" must be a vector, and \n%   \"A\" must be a matrix (dense or sparse)\n%       with the convention that each row of A stores the vectorized symmetric/Hermitian\n%       matrix A_i, so that sum_i A_i y(i) can be written as mat(A'*y)\n%       (where mat() reshapes a vector into a square matrix)\n%   if \"A\" is a function, then in forward mode it should compute A'*y\n%       and in transpose mode it should compute A*X\n%\n%   Note: A0 and A_i must be symmetric/Hermitian, but this function\n%       does not check for it, so the user must check.  If you get\n%       unexpected errors, this may be the culprit.\n%\n%   For maximum efficiency, the user should specify the spectral norm of A,\n%       via opts.normA\n%   (e.g. opts.normA = norm(A) or opts.normA = normest(A))\n%\n%   By default, this assumes variables are real.\n%   To allow y to be complex, either pass in a complex value for y0\n%   or make sure A or A0 is complex,\n%   or specify opts.cmode = 'R2C'\n%       (note: cmode = 'C2C' is not supported)\n%\n%   See also solver_sSDP\n\n% Supply default values\nerror(nargchk(4,8,nargin));\nif nargin < 5, x0 = []; end\nif nargin < 6, z0 = []; end\nif nargin < 7, opts = []; end\nif ~isfield( opts, 'restart' ), opts.restart = 1000; end\n\n% Do we automatically re-scale \"A\"?\n% (there are two dual variables, one corresponding to Ax==b\n%  and one corresponding to I*x >= 0, and the dual problem\n%  is most efficient if  norm(I) = norm(A),\n%  hence we rescale A <-- A/norm(A)   )\nif isfield( opts, 'noscale' ) && opts.noscale\n    % The user has forced us not to automatically rescale\n    normA = 1;\nelse\n    normA = []; \n    if isfield( opts, 'normA' ),\n        normA = opts.normA;\n        opts = rmfield( opts, 'normA' );\n    end\nend\nif isempty( normA ),\n    normA = linop_normest( A );\nend\nif isfield( opts, 'noscale' )\n    opts = rmfield(opts,'noscale');\nend\n\n\nN = size(A0,1); if N ~= size(A0,2), error('\"A0\" must be square and symmetric'); end\nif ~isa(A,'function_handle')\n    % We need to tell TFOCS that we'll be using matrix variables\n    M = size(A,1); if size(A,2) ~= N^2, error('\"A\" has wrong number of columns'); end\n    sz = { [M,1], [N,N] }; % specify dimensions of domain and range of A\n    if isfield( opts, 'cmode' )\n        cmode = opts.cmode;\n    else\n        if ~isempty(x0) && ~isreal(x0)\n            cmode = 'R2C';\n        elseif ~isreal(A) || ~isreal(A0)\n            cmode = 'R2C';  % if A is complex, then X must be, in order to get real output\n        else\n            cmode = 'R2R';  % default assumption\n        end\n    end\n    vec = @(x) x(:);\n    mat = @(y) reshape(y,N,N);\n    A = linop_handles( sz, @(y) mat(A'*y), @(X)real(A*vec(X)), cmode);\nend\n\n\n\n% Perform the re-scaling:\nA      = linop_compose( A, 1 / normA );\nA0     = A0/normA;\n\n\nobj    = smooth_linear(b);\n\n[varargout{1:max(nargout,1)}] = ...\n    tfocs_SCD( obj, {A,A0}, {proj_psd}, mu, x0, z0, opts, varargin{:} );\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sLP.m",
    "content": "function varargout = solver_sLP( c, A, b, mu, x0, z0, opts, varargin )\n% SOLVER_SLP Generic linear programming in standard form. Uses smoothing.\n% [ x, out, opts ] = solver_sLP( c, A, b, mu, x0, z0, opts )\n%    Solves the smoothed standard form Linear Program (LP)\n%        minimize c'*x + 0.5*mu*||x-x0||_2^2\n%        s.t.     A * x == b and x >= 0\n%    \n%   \"c\" and \"b\" must be vectors, and \"A\" must be a matrix (dense or sparse)\n%   or a function that computes A*x and A'*y (see help documentation).\n%\n%   If the constraint \"x >= 0\" is not needed, then specify this by\n%       setting:\n%           opts.nonnegativity = false\n%\n%   For maximum efficiency, the user should specify the spectral norm of A,\n%       via opts.normA\n%   (e.g. opts.normA = norm(A) or opts.normA = normest(A))\n%\n% July 13 2015, algorithm updated for x>=0 case. \n%   Uses many fewer dual variables now,\n%   convergence is faster, and the primal variable is guaranteed\n%   to always be non-negative.\n% Also set to use non-linear CG when available\n\n% Supply default values\nerror(nargchk(4,8,nargin));\nif nargin < 5, x0 = []; end\nif nargin < 6, z0 = []; end\nif nargin < 7, opts = []; end\nif ~isfield( opts, 'restart' ), opts.restart = 1000; end\n\n\n% Do we include the x >= 0 constraint?\nNONNEG = true;\nif isfield(opts,'nonnegativity')\n    if ~opts.nonnegativity\n        NONNEG = false;\n    end\n    opts = rmfield(opts,'nonnegativity');\nend\n\n\n% Do we automatically re-scale \"A\"?\n% (there are two dual variables, one corresponding to Ax==b\n%  and one corresponding to I*x >= 0, and the dual problem\n%  is most efficient if  norm(I) = norm(A),\n%  hence we rescale A <-- A/norm(A)   )\nif isfield( opts, 'noscale' ) && opts.noscale\n    % The user has forced us not to automatically rescale\n    normA = 1;\nelse\n    normA = []; \n    if isfield( opts, 'normA' ),\n        normA = opts.normA;\n        opts = rmfield( opts, 'normA' );\n    end\nend\nif isempty( normA ),\n    normA = linop_normest( A );\nend\nif isfield( opts, 'noscale' )\n    opts = rmfield(opts,'noscale');\nend\n\n% Perform the re-scaling:\nif isnumeric(A), A = A/normA; % do it once\nelse\nA      = linop_compose( A, 1 / normA );\nend\nb      = b/normA;\n\n\nobj    = smooth_linear(c);\n\nif exist('tfocs_CG','file') && exist('wp_ls','file') % wp_ls.m is the linesearch code for the nonliner CG\n    if ~isfield(opts,'alg') || isempty(opts.alg)\n        opts.alg = 'CG';\n        disp('Using non-linear conjugate gradients');\n    end\nend\n\nif ~NONNEG\n    % There is no x >= 0 constraint:\n    % Note: [] after {A,-b} is equivalent to proj_Rn\n    [varargout{1:max(nargout,1)}] = ...\n        tfocs_SCD( obj, { A, -b }, [], mu, x0, z0, opts, varargin{:} );\nelse\n    % There is a x >= 0 constraint:\n%     [varargout{1:max(nargout,1)}] = ...\n%         tfocs_SCD( obj, { 1,0;A,-b}, {proj_Rplus,proj_Rn}, mu, x0, z0, opts, varargin{:} );\n    % New, July 13 2015, exploting new prox_shift function. Much better!\n    obj = prox_shift(proj_Rplus,c);\n    [varargout{1:max(nargout,1)}] = ...\n        tfocs_SCD( obj, { A, -b }, [], mu, x0, z0, opts, varargin{:} );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sLP_box.m",
    "content": "function varargout = solver_sLP_box( c, A, b, l, u, mu, x0, z0, opts, varargin )\n% SOLVER_SLP_BOX Generic linear programming with box constraints. Uses smoothing.\n% [ x, out, opts ] = solver_sLP_box( c, A, b, l, u, mu, x0, z0, opts )\n%    Solves the smoothed standard form Linear Program (LP) with box-constraints\n%        minimize c'*x + 0.5*mu*||x-x0||_2^2\n%        s.t.     A * x == b and  l <= x <= b\n%    \n%   \"c\" and \"b\" must be vectors, and \"A\" must be a matrix (dense or sparse)\n%   or a function that computes A*x and A'*y (see help documentation).\n%   \"l\" and \"u\" are vectors, or scalars (in which case they are a scalar\n%    times the vector of all ones )\n%\n%   If only \"l\" (or only \"u\") is needed, set \"u\" (or \"l\") to the empty matrix [].\n%\n%   For maximum efficiency, the user should specify the spectral norm of A,\n%       via opts.normA\n%   (e.g. opts.normA = norm(A) or opts.normA = normest(A))\n%\n% July 13, 2015, algorithmic change to improve the performance.\n% Also set to use non-linear CG when available\n%\n%   See also solver_sLP\n\n% Supply default values\nerror(nargchk(6,10,nargin));\nif nargin < 7, x0 = []; end\nif nargin < 8, z0 = []; end\nif nargin < 9, opts = []; end\nif ~isfield( opts, 'restart' ), opts.restart = 1000; end\n\n\n\n% Do we automatically re-scale \"A\"?\n% (there are two dual variables, one corresponding to Ax==b\n%  and one corresponding to I*x >= 0, and the dual problem\n%  is most efficient if  norm(I) = norm(A),\n%  hence we rescale A <-- A/norm(A)   )\nif isfield( opts, 'noscale' ) && opts.noscale\n    % The user has forced us not to automatically rescale\n    normA = 1;\nelse\n    normA = []; \n    if isfield( opts, 'normA' ),\n        normA = opts.normA;\n        opts = rmfield( opts, 'normA' );\n    end\nend\nif isempty( normA ),\n    normA = linop_normest( A );\nend\nif isfield( opts, 'noscale' )\n    opts = rmfield(opts,'noscale');\nend\n\n% Perform the re-scaling:\nif isnumeric(A), A = A/normA; % do it once\nelse\nA      = linop_compose( A, 1 / normA );\nend\nb      = b/normA;\n\n\nobj    = smooth_linear(c);\n\nif exist('tfocs_CG','file')&& exist('wp_ls','file') % wp_ls.m is the linesearch code for the nonliner CG\n    opts.alg = 'CG';\n    disp('Using non-linear conjugate gradients');\nend\n\nif isempty(l) && isempty(u)\n    % There is no x >= 0 constraint:\n    [varargout{1:max(nargout,1)}] = ...\n        tfocs_SCD( obj, { A, -b }, [], mu, x0, z0, opts, varargin{:} );\nelse\n    % added Juy 13, 2015\n    % This has fewer dual variables and should be much better!\n    obj = prox_shift( proj_box(l,u), c );\n    \n    [varargout{1:max(nargout,1)}] = ...\n        tfocs_SCD( obj, { A, -b }, [], mu, x0, z0, opts, varargin{:} );\n    \n% elseif isempty(u)\n%     % There is a x >= l constraint, i.e. x - l >= 0\n%     [varargout{1:max(nargout,1)}] = ...\n%         tfocs_SCD( obj, { 1,-l;A,-b}, {proj_Rplus,proj_Rn}, mu, x0, z0, opts, varargin{:} );\n% elseif isempty(l)\n%     % There is a x <= u constraint, i.e. -x + u >= 0\n%     [varargout{1:max(nargout,1)}] = ...\n%         tfocs_SCD( obj, {-1, u;A,-b}, {proj_Rplus,proj_Rn}, mu, x0, z0, opts, varargin{:} );\n% else\n%     % have both upper and lower box constraints\n%     [varargout{1:max(nargout,1)}] = ...\n%         tfocs_SCD( obj, {1,-l;-1, u;A,-b}, {proj_Rplus,proj_Rplus,proj_Rn}, mu, x0, z0, opts, varargin{:} );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sNuclearBP.m",
    "content": "function varargout = solver_sNuclearBP( omega, b, mu, x0, z0, opts, varargin )\n% SOLVER_SNUCLEARBP Nuclear norm basis pursuit problem (i.e. matrix completion). Uses smoothing.\n% [ x, out, opts ] = solver_sNuclearBP( omega, b, mu, X0, Z0, opts )\n%    Solves the smoothed nuclear norm basis pursuit problem\n%        minimize norm_nuc(X) + 0.5*mu*norm(X-X0,'fro').^2\n%        s.t.     A_omega * x == b\n%    by constructing and solving the composite dual\n%        maximize - g_sm(z)\n%    where\n%        g_sm(z) = sup_x <z,Ax-b>-norm(x,1)-(1/2)*mu*norm(x-x0)\n%    A_omega is the restriction to the set omega, and b must be a vector. The\n%    initial point x0 and the options structure opts are optional.\n%\n%   The \"omega\" term may be in one of three forms:\n%       (1) OMEGA, a sparse matrix.  Only the nonzero pattern is important.\n%       (2) {n1,n2,omega}, a cell, where [n1,n2] = size(X), and omega\n%               is the vector of linear indices of the observed set\n%       (3) {n1,n2,omegaI,omegaJ}, a cell.  Similar to (2), except the set\n%               omega is now specified by subscripts. Specifically,\n%               omega = sub2ind( [n1,n2], omegaI, omegaJ) and\n%               [omegaI,omegaJ] = ind2sub( [n1,n2], omega )\n%\n%   If the options field \"largeScale\" is provided and set to true, then uses\n%   a Lanczos-based SVD\n\n% Supply default values\nerror(nargchk(3,7,nargin));\nif nargin < 4, x0 = []; end\nif nargin < 5, z0 = []; end\nif nargin < 6, opts = []; end\nif ~isfield( opts, 'restart' ), \n    opts.restart = 50; \nend\n\nif isempty(omega)\n    error( 'Sampling operator cannot be empty.' );\nelseif issparse(omega)\n    [omegaI,omegaJ] = find(omega);\n    [n1,n2]         = size(omega);\n    omega_lin       = sub2ind( [n1,n2], omegaI, omegaJ );\nelseif iscell(omega)\n    switch length(omega)\n    case 3,\n        [ n1, n2, omega_lin ] = deal( omega{:} );\n        [omegaI,omegaJ]       = ind2sub( [n1,n2], omega_lin );\n    case 4\n        [ n1, n2, omegaI, omegaJ ] = deal( omega{:} );\n        omega_lin = sub2ind( [n1,n2], omegaI, omegaJ );\n    otherwise\n        error( 'Incorrect format for the sampling operator.' );\n    end\nelse\n    error( 'Incorrect format for the sampling operator.' );\nend\nnnz         = numel(omega_lin);\nomega_lin   = omega_lin(:); % make it a column vector\nb           = b(:); % make it a column vector\nif ~isequal( size(b), [ nnz, 1 ] ),\n    error( 'Incorrect size for the sampled data.' );\nend\n\n% automatically do kicking on the dual variable:\nif isempty(z0)\n    z0 = sparse(omegaI,omegaJ,b,n1,n2); \n    nY = linop_normest(z0,'R2R',1e-4,300);\n    z0 = b/nY;\nend\n\npackSVDflag = isa(x0,'packSVD');\n% Note: packSVD is not supported, so has been removed\nA = @(varargin)linop_nuclear( n1, n2, nnz, omega_lin, omegaI, omegaJ,packSVDflag, varargin{:} );\n\nq=1;\nif isfield(opts,'largeScale') && opts.largeScale\n    prox = prox_nuclear(q,true);\nelse\n    prox = prox_nuclear(q);\nend\nif isfield(opts,'largeScale'), opts = rmfield(opts,'largeScale'); end\n\n[varargout{1:max(nargout,1)}] = ...\n    tfocs_SCD( prox, { A, -b }, proj_Rn, mu, x0, z0, opts, varargin{:} );\n\n%\n% Implements the matrix sampling operator: X -> [X_ij]_{i,j\\in\\omega}\n%\nfunction y = linop_nuclear( n1, n2, nnzs, omega, omegaI, omegaJ, packSVDflag, x, mode )\nswitch mode,\n    case 0,\n        y = { [n1,n2], [nnzs,1] };\n    case 1,\n%         y = x(omega);\n        S = [];\n        S.type = '()';\n        S.subs = {omega};\n        y = subsref(x,S);\n    case 2,\n        y = sparse( omegaI, omegaJ, x, n1, n2 );\n        if packSVDflag\n            y = packSVD(y);\n        end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sNuclearBPDN.m",
    "content": "function varargout = solver_sNuclearBPDN( omega, b, epsilon, mu, x0, z0, opts, varargin )\n% SOLVER_SNUCLEARBPDN Nuclear norm basis pursuit problem with relaxed constraints. Uses smoothing.\n% [ x, out, opts ] = solver_sNuclearBPDN( omega, b, epsilon,mu, X0, Z0, opts )\n%    Solves the smoothed nuclear norm basis pursuit problem\n%        minimize norm_nuc(X) + 0.5*mu*norm(X-X0,'fro').^2\n%        s.t.     ||A_omega * x - b || <= epsilon\n%    by constructing and solving the composite dual\n%        maximize - g_sm(z)\n%    where\n%        g_sm(z) = sup_x <z,Ax-b>-norm(x,1)-(1/2)*mu*norm(x-x0)\n%    A_omega is the restriction to the set omega, and b must be a vector. The\n%    initial point x0 and the options structure opts are optional.\n%\n%   The \"omega\" term may be in one of three forms:\n%       (1) OMEGA, a sparse matrix.  Only the nonzero pattern is important.\n%       (2) {n1,n2,omega}, a cell, where [n1,n2] = size(X), and omega\n%               is the vector of linear indices of the observed set\n%       (3) {n1,n2,omegaI,omegaJ}, a cell.  Similar to (2), except the set\n%               omega is now specified by subscripts. Specifically,\n%               omega = sub2ind( [n1,n2], omegaI, omegaJ) and\n%               [omegaI,omegaJ] = ind2sub( [n1,n2], omega )\n\n% Supply default values\nerror(nargchk(4,8,nargin));\nif nargin < 5, x0 = []; end\nif nargin < 6, z0 = []; end\nif nargin < 7, opts = []; end\nif ~isfield( opts, 'restart' ), \n    opts.restart = 50; \nend\n\nif isempty(omega)\n    error( 'Sampling operator cannot be empty.' );\nelseif issparse(omega)\n    [omegaI,omegaJ] = find(omega);\n    [n1,n2]         = size(omega);\n    omega_lin       = sub2ind( [n1,n2], omegaI, omegaJ );\nelseif iscell(omega)\n    switch length(omega)\n    case 3,\n        [ n1, n2, omega_lin ] = deal( omega{:} );\n        [omegaI,omegaJ]       = ind2sub( [n1,n2], omega_lin );\n    case 4\n        [ n1, n2, omegaI, omegaJ ] = deal( omega{:} );\n        omega_lin = sub2ind( [n1,n2], omegaI, omegaJ );\n    otherwise\n        error( 'Incorrect format for the sampling operator.' );\n    end\nelse\n    error( 'Incorrect format for the sampling operator.' );\nend\nnnz = numel(omega_lin);\nif ~isequal( size(b), [ nnz, 1 ] ),\n    error( 'Incorrect size for the sampled data.' );\nend\n\n% TODO: see the new linop_subsample.m file\nA = @(varargin)linop_nuclear( n1, n2, nnz, omega_lin, omegaI, omegaJ, varargin{:} );\n[varargout{1:max(nargout,1)}] = ...\n    tfocs_SCD( prox_nuclear, { A, -b }, prox_l2(epsilon), mu, x0, z0, opts, varargin{:} );\n\n%\n% Implements the matrix sampling operator: X -> [X_ij]_{i,j\\in\\omega}\n%\nfunction y = linop_nuclear( n1, n2, nnz, omega, omegaI, omegaJ, x, mode )\nswitch mode,\n    case 0,\n        y = { [n1,n2], [nnz,1] };\n    case 1,\n        y = x(omega);\n    case 2,\n        y = sparse( omegaI, omegaJ, x, n1, n2 );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/solver_sSDP.m",
    "content": "function varargout = solver_sSDP( c, A, b, mu, x0, z0, opts, varargin )\n% SOLVER_SSDP Generic semi-definite programs (SDP). Uses smoothing.\n% [ x, out, opts ] = solver_sSDP( C, A, b, mu, X0, z0, opts )\n%    Solves the smoothed standard form Semi-Definite Program (SDP)\n%        minimize trace(C'*X) + 0.5*mu*||X-X0||_F^2\n%        s.t.     A * vec(X) == b and X >= 0\n%           where X >= 0 indicates that X is positive semi-definite.\n%    \n%   \"C\" and must be a matrix, \"b\" must be a vector, and \n%   \"A\" must be a matrix (dense or sparse)\n%   or a function that computes A*x and A'*y (see help documentation).\n%   The operation b = A*vec(X) is equivalent to\n%       b_i = trace( A_i'*X ) for i = 1:size(A,1), where A_i is the symmetric\n%       matrix formed by reshaping the ith row of A.\n%\n%\n%   For maximum efficiency, the user should specify the spectral norm of A,\n%       via opts.normA\n%   (e.g. opts.normA = norm(A) or opts.normA = normest(A))\n%\n%   By default, this assumes variables are real.\n%   To allow X to be complex, either pass in a complex value for X0\n%   or make sure A is complex,\n%   or specify opts.cmode = 'C2R'\n%       (note: cmode = 'C2C' is not supported)\n%\n% July 2015, improved model. Fewer dual variables, faster convergence.\n% Also, use non-linear conjugate gradients if available\n%\n%   See also solver_sLMI\n\n% Supply default values\nerror(nargchk(4,8,nargin));\nif nargin < 5, x0 = []; end\nif nargin < 6, z0 = []; end\nif nargin < 7, opts = []; end\nif ~isfield( opts, 'restart' ), opts.restart = 1000; end\n\n% Do we automatically re-scale \"A\"?\n% (there are two dual variables, one corresponding to Ax==b\n%  and one corresponding to I*x >= 0, and the dual problem\n%  is most efficient if  norm(I) = norm(A),\n%  hence we rescale A <-- A/norm(A)   )\nif isfield( opts, 'noscale' ) && opts.noscale\n    % The user has forced us not to automatically rescale\n    normA = 1;\nelse\n    normA = []; \n    if isfield( opts, 'normA' ),\n        normA = opts.normA;\n        opts = rmfield( opts, 'normA' );\n    end\nend\nif isempty( normA ),\n    normA = linop_normest( A );\nend\nif isfield( opts, 'noscale' )\n    opts = rmfield(opts,'noscale');\nend\n\n\nN = size(c,1); if N ~= size(c,2), error('\"C\" must be square and symmetric'); end\nif ~isa(A,'function_handle')\n    % We need to tell TFOCS that we'll be using matrix variables\n    M = size(A,1); if size(A,2) ~= N^2, error('\"A\" has wrong number of columns'); end\n    sz = { [N,N], [M,1] }; % specify dimensions of domain and range of A\n    if isfield( opts, 'cmode' )\n        cmode = opts.cmode;\n    else\n        if ~isempty(x0) && ~isreal(x0)\n            cmode = 'C2R';\n        elseif ~isreal(A) || ~isreal(c) % bug fix, Tue Apr 26, 2011\n            cmode = 'C2R';  % if A is complex, then X must be, in order to get real output\n        else\n            cmode = 'R2R';  % default assumption\n        end\n    end\n    vec = @(x) x(:);\n    mat = @(y) reshape(y,N,N);\n    A = linop_handles( sz, @(X)real(A*vec(X)), @(y) mat(A'*y),cmode);\nend\n\n\n\n% Perform the re-scaling:\nA      = linop_compose( A, 1 / normA );\nb      = b/normA;\n\nif exist('tfocs_CG','file') && exist('wp_ls','file') % wp_ls.m is the linesearch code for the nonliner CG\n    opts.alg = 'CG';\n    disp('Using non-linear conjugate gradients');\nend\n\n% obj    = smooth_linear(c);\n% [varargout{1:max(nargout,1)}] = ...\n%     tfocs_SCD( obj, { 1,0;A,-b}, {proj_psd,proj_Rn}, mu, x0, z0, opts, varargin{:} );\n% ind = 2;\n\n% July 13 2015, better model (fewer dual variables)\nobj     = prox_shift( proj_psd, c );\n[varargout{1:max(nargout,1)}] = ...\n    tfocs_SCD( obj, {A,-b}, [], mu, x0, z0, opts, varargin{:} );\nind = 1;\n\n% and undo the scaling by normA:\nif nargout >= 2 && isfield( varargout{1},'dual' ) && normA ~= 1\n    if isa( varargout{2}.dual,'tfocs_tuple')\n        varargout{2}.dual = tfocs_tuple( {varargout{2}.dual{1},  varargout{2}.dual{2}/normA });\n    else\n        varargout{2}.dual{ind} = varargout{2}.dual{ind}/normA;\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/test_Lipschitz.m",
    "content": "function L = test_Lipschitz( f, N , nRep, Ltest, lb, ub, scale)\n% TEST_LIPSCHITZ Checks that the TFOCS smooth function object \"f\"\n%   has a Lipschitz continuous gradient.\n% L = TEST_LIPSCHITZ( f, N )\n%   outputs an estimated Lipschitz constant\n% L = TEST_LIPSCHITZ( f, N, nRep )\n%   outputs an estimated Lipschitz constant based on nRep points\n%\n% L = TEST_LIPSCHITZ( f, N, nRep, L_guess )\n%   tests is the Lipschitz constant is certainly larger than L_guess\n%\n% ... = TEST_LIPSCHITZ(  ..., lb, ub, scale )\n%   controls how input points are sampled. They are sampled\n%   as scale*randn(), and then thresholded to be bigger (element-wise)\n%   than the lowerbound \"lb\", and less than the upperbound \"ub\"\n%   (leave lb and/or ub at the empty matrix [] to set them\n%    to -Inf and +Inf, resp.)\n%\n% Stephen Becker, 4/3/2017\n\nif numel(N) == 1\n    N(2) = 1;\nend\nif nargin < 3 || isempty( nRep )\n    nRep    = 10;\nend\nif nargin < 4 || isempty(Ltest)\n    Ltest   = Inf;\nend\nif nargin < 5 || isempty(lb), lb = -Inf; end\nif nargin < 6 || isempty(ub), ub = Inf; end\nif nargin < 7 || isempty(scale), scale = 10; end\n\n% Generate a lot of points\nX   = cell( nRep, 1 );\nF   = zeros( nRep, 1 );\ngra = cell( nRep, 1 );\nfor rep = 1:nRep\n    x               = max(  min(scale*randn(N),ub), lb );\n    X{rep}          = x;\n    [F(rep),gra{rep}]    = f( x );\n    \nend\n    \nif nRep <= 20\n    % find all pairs\n    list    = nchoosek( 1:nRep, 2 );\nelse\n    % there are a lot, so just pick some of them\n    list    = zeros( 400, 2 );\n    for i = 1:size(list,1)\n        list(i,:)   = randsample( nRep, 2 )';\n    end\nend\n\nL   = 0;\nfor k = 1:size(list,2)\n    i   = list(k,1);\n    j   = list(k,2);\n    \n    xg  = dot( X{i} - X{j}, gra{i} - gra{j} );\n    dg  = norm( gra{i} - gra{j} );\n    dx  = norm( X{i} - X{j} );\n    \n    % need || gradient_i - gradient_j || <= L * || x_i - x_j ||\n    L   = max( L, dg/dx );\n    if L > Ltest, fprintf(2,'Found L > Ltest from criteria 1\\n'); return; end\n    \n    % need dot( gradient_i - gradient_j, x_i - x_j ) <= L || x_i - x_j ||^2\n    L   = max( L,xg/(dx^2) );\n    if L > Ltest, fprintf(2,'Found L > Ltest from criteria 2\\n'); return; end\n    \n    % need ||gradient_i - gradient_j||^2 <= L*dot( gradient_i - gradient_j, x_i - x_j )\n    L   = max( L, dg^2/xg );\n    if L > Ltest, fprintf(2,'Found L > Ltest from criteria 3\\n'); return; end\n    \n    % need f(i) <= f(j) + dot( gradient_j, x_i-x_j) + L/2||x_i-x_j||^2\n    L   = max( L, ( F(i)-F(j) - dot( gra{j}, X{i} - X{j} ) )/( dx^2/2 ) );\n    if L > Ltest, fprintf(2,'Found L > Ltest from criteria 4\\n'); return; end\nend\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2017 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/test_nonsmooth.m",
    "content": "function varargout = test_nonsmooth( f, N, DOM )\n% TEST_NONSMOOTH Runs diagnostic tests to ensure a non-smooth function conforms to TFOCS conventions\n% TEST_NONSMOOTH( F )\n%   tests whether the function handle F works as a tfocs non-nonsmooth\n%   function object.\n%\n%   Requirements: \n%       f = F(X) must return the value of the function at X.\n%       p = F(X,t) must return the proximity operator of F at X,\n%           i.e. p = argmin_y  F(y) + 1/(2*t)||y-x||^2\n%\n%   For an example, see PROX_L1.M\n%       \n% TEST_NONSMOOTH( F, N )\n%    specifies the size of the domain space.  If N is a scalar,\n%    then the domain space is the set of  N x 1 vectors.\n%    If N is a matrix of the form [n1, n2], the the domain\n%    space is the set of n1 x n2 matrices.\n%\n% TEST_NONSMOOTH( ..., DOM )\n%    specifies the domain of F.  DOM can be of the form [a,b]\n%    which signifies the 1D set (a,b).\n%\n% OK = TEST_NONSMOTH(...)\n%    returns \"true\" if all tests are passed, and \"false\" otherwise.\n%\n% Example:\n%   test_nonsmooth( prox_l1 )\n%\n% See also private/tfocs_prox, prox_l1\n\nOK = false;\nPLOT = true;\n\nerror(nargchk(1,3,nargin));\n\nif ~isa(f,'function_handle')\n    fail('TFOCS nonsmooth function must be a FUNCTION HANDLE');\n    return; \nend\nfprintf('== Testing the nonnonsmooth function %s ==\\n', func2str(f) );\n\nif nargin < 2 || isempty(N),   N = 10;          end\nif nargin < 3 || isempty(DOM), DOM = [-1,1];    end\n\na = DOM(1); b = DOM(2);\n\nx = (a+b)/2;\nfprintf('Testing scalar inputs... \\n');\ntry \n    vi = f(x);\ncatch\n    fail('TFOCS nonsmooth function failed to return a function value');\n    return;\nend\nif isinf(vi)\n    fail('TFOCS nonsmooth function tester: default domain is invalid. Please specify valid domain');\n    return;\nend\nfprintf('\\t\\t\\t\\t...passed. \\n');\n\n% Now, also ask for the prox\nfprintf('Testing proximity operator output... \\n');\nt = 1;\ntry \n    [vi,gi] = f(x,t);\ncatch\n    fail('TFOCS nonsmooth function failed to compute a valid proximity operator');\n    return;\nend\nfprintf('\\t\\t\\t\\t...passed. \\n');\n\n\n% find a reasonable value of t:\nx = a + .9*(b-a);\n[vi,gi] = f(x,t);\ncntr = 0;\n% This is only good for proximity functions: for projections,\n%   the value of \"t\" has no effect:\nif strfind( func2str(f), 'proj' )\n    disp('Looks like this is a projection: this test may not work correctly.');\nelse\n    disp('Looks like this is a proximity operator');\n    while norm(gi - x )/norm(x) > .8 && cntr < 20\n        t = t/2;\n        cntr = cntr + 1;\n        [vi,gi] = f(x,t);\n    end\nend\n% for t = 0, we have gi = x\n% for t = Inf, gi is independent of x (i.e. gi = argmin_x f(x),\n%       which, for f(x) = ||x||, is gi = 0 ).\n\n\n\n% Now, try a vector\nif isscalar(N)\n    x = repmat(x,N,1);\nelse\n    x = repmat(x,N(1),N(2));\n    % if a > 0, assume we want a PSD matrix:\n    if a >= 0\n        x = ones(N(1),N(2)) + eye(N(1),N(2) );\n    end\nend\nfprintf('Testing vector inputs... \\n');\ntry \n    vi = f(x);\ncatch\n    fail('TFOCS nonsmooth function failed to compute f when supplied a vector input');\n    return;\nend\ntry \n    [vi,gi] = f(x,t);\ncatch\n    fail('TFOCS nonsmooth function failed to compute prox_f when supplied a vector input');\n    return;\nend\nif ~isscalar(vi)\n    fail('TFOCS nonsmooth function value must be a scalar');\n    return;\nend\nif ~all( size(gi) == size(x) )\n    fail('TFOCS nonsmooth proximity function value must be same size as input');\n    return;\nend\nfprintf('\\t\\t\\t\\t...passed. \\n');\n\n% gi = prox_{f,t}(x)\n% let's verify that gi is actually a minimizer, by\n% plotting the values for a few nearby points\ns = min(t,.9*x(1,1) );\nx = x + .1/norm(x,Inf)*randn(size(x));\n[vi,gi] = f(x,s);\nobjective = @(y) f(y) + 1/(2*s)*norm(y-x,'fro')^2;\nfprintf('Verifying the validity of the proximity calculation...\\n');\nobjGi = objective(gi);\nfprintf('\\tprox(x) has objective value: %.3e\\n', objGi );\nsc = 1/norm(gi,'inf');\nOK_objective = true;\nfor t = 1:20\n    randPt = gi + .01*sc*randn(size(gi));\n    obj = objective(randPt);\n    fprintf('\\tRandom pt #%2d has larger objective value by %7.2e', t,obj-objGi);\n    if obj < objGi\n        fprintf(' -- SMALLER!! This shouldn''t happen');\n        OK_objective = false;\n    end\n    fprintf('\\n');\nend\nif ~OK_objective\n    fail('TFOCS nonsmooth: incorrect calculation of proximity function');\n    return;\nend\nfprintf('\\t\\t\\t\\t...passed. \\n');\n\n\n% 1D example.  Does not require function to be vectorized\nn   = 200;  % number of grid points\nh   = (b-a)/n;\ngrid = (a+h/2):h:(b-h/2);\n% include \"0\" so things look nice and pointy:\nif a < 0 && b > 0\n    grid = unique( [grid,0] );\nend\n% if isscalar(N)\n%     grid = repmat( grid, N, 1 );\n% %     grid( 2:end, : ) = 0.5*grid( 2:end, : );\n%     grid( 2:end, : ) = 0;\n% end\n\nn    =  size(grid,2);\nv    = zeros(1,n);\ng    = zeros(1,n);\nfor i = 1:length(grid)\n    v(i) = f(grid(1,i) );\n    [vi,gi] = f(grid(:,i), t );\n    g(i) = gi(1);\nend\ngrid = grid(1,:);\nif PLOT\n    figure;\n    clf;\n    plot(grid,v,'-','linewidth',2);\n    hold all\n    plot(grid,g,'-','linewidth',2);\n    Y = get(gca,'ylim');\n    Y(2) = 1.1*Y(2);\n    set(gca,'ylim',Y);\n    \n    legend('function','proximity operator');\n%     title(func2str(f),'interpreter','none');\n    title(sprintf('function, and proximity operator, with parameter t = %.3f',t))\n    line([a,b], 0*[1,1],'color','k' )\n    if a < 0 && b > 0\n        line( 0*[1,1], get(gca,'ylim'),'color','k' );\n    end\n    % show the y = x line\n    line( [a,b], [a,b], 'linestyle','--','color','k');\n    \nend\n\nOK = true;\n\n\ndisp('Test passed succesfully.');\nif nargout > 0\n    varargout{1} = OK;\nend\n\n\n\nfunction fail(str)\n    disp('Test failed.  Reason:');\n    disp(str);\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/test_proxPair.m",
    "content": "function varargout   = test_proxPair( f, g, N, nTrials, force_gama,tol,break_on_bad,negScale )\n% TEST_PROXPAIR Runs diagnostics on a pair of functions to check if they are Legendre conjugates.\n% maxEr   = test_proxPair( f, g )\n%     will run tests to determine if f and g are really\n%     Legendre-Fenchel conjugates.\n%  f and g should be in TFOCS form (see examples below)\n%         which means they not only compute a function value f(x)\n%         but that they can also return the proximity operator. \n%  The test points are assumed to be scalars by default (N=1)\n%\n% ...     = test_proxPair( f, g, N )\n%     Same test, but now the test points will be vectors of length N\n% ...     = test_proxPair( f, g, x0 )\n%     Test points will have the same size as x0. If x0 is a square matrix\n%     other than the zero or identity matrix, the domain will be the set of symmetric\n%     matrices if x0 is symmetric. If x0 is positive semidefinite, domain is taken\n%     to be the set of positive semidefinite matrices.\n% ...     = test_proxPair( f, g, [N or x0], nTrials )\n%     will run \"nTrials\" (default: 10)\n% ...     = test_proxPair( f, g, [N or x0], nTrials, t )\n%     will use the proximity operator:\n%         prox_f(v) = argmin  f(x) + 1/(2t) *||x-v||^2\n% \n%         If the function works for t = 1 but not for other t,\n%         this helps you track down the bug (perhaps there is a t vs 1/t confusion\n%         somewhere...)\n% \n%         (default: t>0 is chosen randomly on every trial )\n%\n% ...   = test_proxPair( f, g, [N or x0], nTrials, t, tol )\n%         sets the tolerance level for considering an inequality to be violated\n%           (default is 1e-8)\n% [x_bad, gamma_bad] = test_proxPair( ..., 'break' )\n%       will return the offending point in the case that one of the the inequalities\n%       has been violated. If no inequalities are violated, then the empty\n%       matrices are returned.\n% \n% Note: TFOCS uses the dual function composed with the negative identity operator,\n%   so you may wish to use prox_scale( g,-1) instead of just g.\n% ... = test_proxPair( f, g, [N or x0], nTrials, t, tol, break, negScale )\n%   will automatically change g to prox_scale(g,-1) if negScale=true \n%   (default: false)\n% \n% Examples of valid pairs (f,g) (where q is any positive scalar, r is any scalar):\n% \n% f   = prox_l1(q); and  g   = proj_linf(q);\n% f   = proj_l1(q); and  g   = prox_linf(q);\n% f   = proj_l2(q); and  g   = prox_l2(q);\n% f   = prox_hinge(q,r); and  g  = prox_hingeDual(q,r);\n% f   = proj_Rn;    and  g   = proj_0;\n% f   = proj_Rplus; and  g   = proj_Rplus(-1); \n% f   = proj_nuclear;  and     g = prox_spectral;\n% f   = prox_nuclear;  and     g = proj_spectral;\n% f   = prox_trace;    and     g = proj_spectral(1,'symm')   for X >= 0\n% f   = proj_psdUTrace;and     g = prox_spectral(1,'symm')   fr  X >= 0\n% \n% Recall the definition of the conjugate function:\n%   g(y) = f^*(y) = sup_x  <x,y> - f(x)\n%   f(x)   = sup_y  <x,y> - f^*(y)\n% We use Moreau's Decomposition to generate identities. See Combettes and Wajs '05,\n% lemma 2.10, http://www.ann.jussieu.fr/~plc/mms1.pdf\n% Moreau's decomposition is:\n%   for all x,  x = prox_( gamma*f )( x ) + gamma*prox_( g/gamma )( x/gamma )\n% \n% and TFOCS uses (since t > 0)\n% prox(f)(t)(x) := argmin   f(v) + 1/(2t)||v-x||^2\n%                = argmin t*f(v) + 1/2  *||v-x||^2 [ N.B. This is NOT 1/t*argmin... ]\n%                = prox_( t*f )( x )\n% \n% so the identity in terms of TFOCS prox is:\n% x = prox(f)(gamma)(x) + gamma*prox(g)(1/gamma)(x/gamma)           ( ID 1 )\n%   = xf + xg\n% \n% We also have the identity:\n%     f(xf) + g(xg/gamma) = <xf,xg> / gamma                         ( ID 2 )\n% where xf and xg defined above.\n%     [ f(xf) + g(xg/gamma) >= <xf,xg> /gamma ] is the Fenchel-Young inequality.\n% \n% The final identity is:\n%   ||x||^2/2 = gamma[   f^(gamma)(x) + g^(1/gamma)(x/gamma)   ]    ( ID 3 )\n% where\n%     f^t(x) = min f(v) + 1/(2t)||v-x||^2\n% \n% These three identities are the three columns of errors output by this test function.\n% See also prox_dualize.m \n\n\nerror(nargchk(2,8,nargin));\nif nargin < 3 || isempty(N), N = 1; end\nif ~isscalar(N)\n    x0 = N;\n    % Check: if x0 is a symmetric matrix, then we assume domain\n    %   is set of symmetric matrices. If it is also positive semidefinite,\n    %   we assume domain is set of symmetric positive semidefinite matrices\n    % (but if x0 is all zeros or the identity, then do not make any assumptions)\n    [m,n] = size(x0);\n    if m == n && norm( x0-x0', 'fro' ) < 1e-10 && ...\n            norm( x0-eye(n),'fro') > 1e-10 && norm(x0,'fro') > 1e-10\n        % it is symmetric\n        if min(eig(x0)) >= -1e-14\n            fprintf('Assuming domain is set of positive semidefinite matrcies\\n');\n            symm    = @(X) X*X';\n        else\n            fprintf('Assuming domain is set of Hermitian matrices\\n');\n            symm    = @(X) (X+X')/2;\n        end\n    else\n        symm = @(x) x; % do not symmetrize\n    end\n    if issparse(x0)\n        fprintf('Assuming domain is set of sparse matrices\\n');\n        newX = @() 100*symm(sprandn( m,n,.01 ));\n    else\n        newX = @() 100*symm(randn( size(N) ));\n    end\n    fprintf('Using a domain of size %d x %d\\n', m, n );\nelse\n    fprintf('Using a domain of size %d x %d\\n', N, 1 );\n    newX = @() 100*randn( N, 1 );\nend\n\nif nargin < 4 || isempty(nTrials), nTrials = 10; end\nif nargin < 5 || isempty(force_gama),  force_gama = false; end\n% Note: \"gamma\" mispelled on purpose, since Matlab's \"gamma\" function\n%   creates problems when variables are named \"gamma\"\nif nargin < 6 || isempty(tol), tol  = 1e-8; end\nif nargin < 7, break_on_bad=[];end\nif strfind( lower(break_on_bad), 'break')\n    break_on_bad = true;\nelse\n    break_on_bad = false;\nend\nif nargin < 8 || isempty(negScale), negScale = false; end\n\n% 3/23/2016. TFOCS actually requires dual composed with -I\n% which has no effect for norms.\n% Use this composition function, or prox_scale(g,-1).\nif negScale\n    g   = @(varargin) composeWithNegative(g,varargin{:});\nend\n\nfprintf('\\n');\nmaxEr = 0;\nFenchelYoungViolation = false;\nvec     = @(x) x(:);\nmyDot   = @(x,y) x(:)'*y(:);\nfor k = 1:nTrials\n    if force_gama\n        gama = double(force_gama);\n    else\n        gama = rand(1);\n    end\n    x  = newX();\n    [vf,xf]     = f(x,gama);\n    [vg,xg]     = g(x/gama,1/gama);\n    if numel(vf) > 1, error('The \"f\" objective function must be scalar valued'); end\n    if numel(vg) > 1, error('The \"g\" objective function must be scalar valued'); end\n    if isinf(vf) || isinf(vg) || isnan(vf) || isnan(vg)\n        error('Found either Inf or Nan values');\n        % it is OK for f(x) to be Inf (i.e. for an indicator function)\n        % but not for f(x,t) to be Inf, since this is a projection\n        % or proximity operator\n    end\n    \n    xg  = xg*gama;\n    \n    er = (xf+xg) - x;\n \n    % Test the scalar identity:\n    %  er1 = f( xf ) + g( xg/gama ) - xf'*xg/gama;  % this can be inaccurate due to finite precision\n    er2 = vf + vg - myDot(xf,xg)/gama;  % should be same as er2\n    % Sept 3 2012, when vf is very large, we lose precision. Need to make\n    %   this have *relative* precision\n    er2 = abs(er2/max( [abs(vf),abs(vg),1e-3] ));\n \n    % And the other scalar identity:\n    %    ||x||^2/2 = gama(   f^(gama)(x) + g^(1/gama)(x/gama)  )\n    rhs = ( vf + 1/(2*gama)*norm(vec(xf-x))^2 ) +  (vg + gama/2*norm(vec(xg/gama-x/gama))^2 );\n    lhs = norm(vec(x) )^2/2/gama;\n    er3 = abs(rhs-lhs)/abs(lhs);\n \n \n    % Another test: does the Fenchel-Young inequality hold? (this test is unlikely to find violations)\n    %    for all x, y,   f(x) + g(y) >=   x'*y\n    y  = newX();\n    vf     = f(x);\n    vg     = g(y);\n    if vf + vg < x'*y\n        FenchelYoungViolation = true;\n    end\n    \n    % when both f and g are projections, xf and xg should be orthogonal\n    fprintf('Random trial #%2d, errors are:\\t%.1e,\\t%.1e,\\t%.1e; stepsize used was %.2e\\n', ...\n        k, norm(er), er2, er3, gama );\n    maxEr = max([norm(er),er2,er3,maxEr] );\n    \n    if break_on_bad && maxEr > tol\n        varargout{1} = x;\n        varargout{2} = gama;\n        disp('Found a bad pair: terminating early');\n        return;\n    end\nend\n\n\nfprintf('Worst error was %.2e\\n', maxEr );\nif maxEr > tol\n    disp('This is a BAD sign -- the functions are either not correctly implemented or there is a lot of roundoff error');\n    disp('  Try running this again forcing t=1\" to help find the source of error (see help file)');\nelse\n    disp('This is a GOOD sign -- the functions are likely implemented correctly');\nend\nif FenchelYoungViolation\n    disp('Found violation of Fenchel-Young inequality; this is BAD');\nend\nif break_on_bad\n    varargout{1} = [];\n    if nargout > 1, varargout{2} = []; end\nelse\n    varargout{1} = maxEr;\nend\n\nend\n\n% March 2016:\nfunction varargout = composeWithNegative( g, varargin )\n% redefine h(x) = g(-x)\n%   so prox_h(x) = -prox_g(-x)\nvarargin{1} = -varargin{1};\nif nargin == 2\n    varargout{1} = g( varargin{:} );\nelse\n    [varargout{1},varargout{2}] = g( varargin{:} );\n    varargout{2} = -varargout{2};\nend\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/test_smooth.m",
    "content": "function varargout = test_smooth( f, N, DOM )\n% TEST_SMOOTH Runs diagnostic checks on a TFOCS smooth function object.\n% TEST_SMOOTH( F )\n%   tests whether the function handle F works as a TFOCS smooth\n%   function object.\n%\n%   Requirements: f = F(X) must return the value of the function at X.\n%       [f,g] = F(X) must return the value, f, and the gradient, g.\n%\n%   For an example, see SMOOTH_QUAD.M\n%       \n% TEST_SMOOTH( F, N )\n%    specifies the size of the domain space.  If N is a scalar,\n%    then the domain space is the set of  N x 1 vectors.\n%    If N is a matrix of the form [n1, n2], the the domain\n%    space is the set of n1 x n2 matrices.\n%\n% TEST_SMOOTH( ..., DOM )\n%    specifies the domain of F.  DOM can be of the form [a,b]\n%    which signifies the 1D set (a,b).\n%\n% OK = TEST_SMOOTH(...)\n%    returns \"true\" if all tests are passed, and \"false\" otherwise.\n%\n% See also private/tfocs_smooth, smooth_huber\n\n\nOK = false;\nPLOT = true;\n\nerror(nargchk(1,3,nargin));\n\nif ~isa(f,'function_handle')\n    fail('TFOCS smooth function must be a FUNCTION HANDLE');\n    return; \nend\nfprintf('== Testing the smooth function %s ==\\n', func2str(f) );\n\nFORCE_N = false;  % always require a vector input\nif nargin < 2 || isempty(N),   N = 10;\nelse FORCE_N = true; \nend\nif nargin < 3 || isempty(DOM), DOM = [-1,1];    end\n\na = DOM(1); b = DOM(2);\n\nx = (a+b)/2;\nfprintf('Testing scalar inputs... \\n');\ntry \n    vi = f(x);\ncatch\n    fail('TFOCS smooth function failed to return a function value');\n    return;\nend\nif isinf(vi)\n    fail('TFOCS smooth function tester: default domain is invalid. Please specify valid domain');\n    return;\nend\nfprintf('\\t\\t\\t\\t...passed. \\n');\n\n% Now, also ask for the gradient\nfprintf('Testing gradient output... \\n');\ntry \n    [vi,gi] = f(x);\ncatch\n    fail('TFOCS smooth function failed to return a derivative value');\n    return;\nend\nfprintf('\\t\\t\\t\\t...passed. \\n');\n\n% Now, try a vector\nif isscalar(N)\n    x = repmat(x,N,1);\nelse\n    x = repmat(x,N(1),N(2));\n    % if a > 0, assume we want a PSD matrix:\n    if a >= 0\n        x = ones(N(1),N(2)) + eye(N(1),N(2) );\n    end\nend\nfprintf('Testing vector inputs... \\n');\ntry \n    [vi,gi] = f(x);\ncatch\n    fail('TFOCS smooth function failed when supplied a vector input');\n    return;\nend\nfprintf('\\t\\t\\t\\t...passed. \\n');\n\n\n\n% 1D example.  Does not require function to be vectorized\nn   = 100;  % number of grid points\nh   = (b-a)/n;\ngrid = (a+h/2):h:(b-h/2);\n\nv    = zeros(size(grid));\ng    = zeros(size(grid));\nfirst = @(x) x(1);\nfor i = 1:length(grid)\n    v(i) = f(grid(i));\n    if isinf(v(i))\n        g(i) = v(i);\n    else\n        [v(i),gi] = f(grid(i));\n        g(i) = first(gi);\n    end\nend\n\nif PLOT\n    figure;\n    clf;\n    plot(grid,v,'.-');\n    hold all\n    plot(grid,g,'.-');\n    legend('function','derivative');\n%     title(func2str(f),'interpreter','none');\n    line([a,b], 0*[1,1],'color','k' )\n    if a < 0 && b > 0\n        line( 0*[1,1], get(gca,'ylim'),'color','k' );\n    end\nend\n\nOK = true;\n\nif nargout > 0\n    varargout{1} = OK;\nend\n\ndisp('Test passed succesfully.');\n\n\n\n\nfunction fail(str)\n    disp('Test failed.  Reason:');\n    disp(str);\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs.m",
    "content": "function varargout = tfocs( smoothF, affineF, projectorF, x0, opts )\n% TFOCS Minimize a convex problem using a first-order algorithm.\n% [ x, out, opts ] = tfocs( smoothF, affineF, projectorF, x0, opts )\n%     Minimizes or maximizes a smooth or composite function using one of\n%     the TFOCS first-order algorithms. The nominal standard form that\n%     TFOCS handles is this:\n%         minimize smoothF(affineF(x))+projectorF(x)\n%     The affineF and projectorF functions are optional; specifically, they\n%     may be omitted by suppling an empty array [] in their place. Thus\n%     TFOCS supports standard forms such as\n%         minimize smoothF(affineF(x))\n%         minimize smoothF(x) + projectorF(x)\n%         minimize smoothF(x)\n%     A variety of more advanced standard forms are supported, but only\n%     this simple form is discussed here. See the TFOCS user guide for\n%     more information on these advanced forms; see also TFOCS_SCD.\n%\n% FUNCTIONS:\n%    smoothF is expected to operate as follows:\n%       [ fx, gx ] = smoothF( x )\n%       fx: the value of the smooth function at x\n%       gx: the gradient of the smooth function at x\n%       TFOCS only asks for the gradient if it needs it, so if they are\n%       significantly more expensive to compute, you should optimize\n%       your function for the 'nargout==1' case.\n%\n%    affineF may take one of many forms:\n%       [] (empty): represents affineF(x) = x.\n%       A, where A is a matrix: represents affineF(x) = A*x.\n%       A, where A is a linear operator function obeying SPARCO conventions:\n%           y = A(x,0) or y = A([],0) returns the size of A.\n%           y = A(x,1) returns the forward operation applied to x.\n%           y = A(x,2) returns the adjoint operation applied to x.\n%       { A, b }, where A is either a matrix or linear operator and b\n%       is a matrix, adds the offset b to the forward operation.\n%    As mentioned above, affineF is optional. However, if the computational\n%    cost of evaluating your objective is dominated by an affine operation,\n%    it is worthwhile to provide it separately, as TFOCS orders its\n%    calculations to reduce the number of times it will be called.\n%\n%    projectorF is the most complex, and has two modes of operation.\n%       Cx = projectorF( x )\n%           Returns the value of the prox function at x. Note that no\n%           projection is taking place, so in many cases this should be\n%           a relatively simple calculation.\n%       [ Cz, z ] = projectorF( x, t )\n%           Computes the minimizer \n%              z = argmin_z projectorF(z) + 1/(2*t)*\\|x-y\\|^2\n%           The norm is Euclidean: \\|z\\| = <z,z>^{1/2}.\n%\n% OTHER INPUTS:\n%   x0: a feasible initial point\n%   opts: a structure containing further options. Please consult the TFOCS\n%         user guide for full details, but key entries include:\n%       opts.alg          the algorithm to use; e.g., 'AT', 'LLM', etc.\n%       opts.maxIts       max number of iterations\n%       opts.maxCounts    max number of counts\n%       opts.tol          tolerance for convergence: relative step length\n%       opts.printEvery   displays output every 'printEvery' iteration\n%       opts.maxmin       +1 to minimize (default), -1 to maximize\n%   Calling the function with no arguments displays the default values of\n%   opts, and returns that default structure in the third output.\n%\n% OUTPUTS\n%   x       optimal point, up to the tolerance\n%   out     contains extra information collected during the run\n%   opts    structure containing the options used\n\n% Nov 17 2016, hack for Matlab R2016b not allowing nargin/nargout in\n% tfocs_initialize:\nnarginn = nargin; nargoutt = nargout;\n\n% User has requested viewing the default values of \"opts\"\nif nargin == 0 || ( nargin==1 && isstruct(smoothF) )\n    if nargout == 0\n        tfocs_initialize;\n    else\n%         opts = tfocs_AT();\n        tfocs_initialize;\n        opts.alg = 'AT';\n        varargout{1} = opts;\n    end\n    return\nelseif nargin == 1 && ischar(smoothF) && ...\n    (strcmpi(smoothF,'v') || strcmpi(smoothF,'version') ...\n    || strcmpi(smoothF,'-v') || strcmpi(smoothF,'-version') )\n    % Display version information\n%     type version.txt \n    disp('TFOCS v1.3, October 2013');\n    return\nend\n\n\nerror(nargchk(1,5,nargin));\nif nargin < 2, affineF = []; end\nif nargin < 3, projectorF = []; end\nif nargin < 4, x0 = []; end\nif nargin < 5, opts = []; end\nif ~isfield( opts, 'alg' ), \n    alg = 'AT';\nelse\n    alg = upper( opts.alg );\nend\n\nif isnumeric(affineF) && ~isempty(affineF)\n    affineF = {affineF};\nend\n\n[ varargout{1:max(nargout,1)} ] = feval( [ 'tfocs_', alg ], smoothF, affineF, projectorF, x0, opts );\nif nargout > 2,\n    varargout{3}.alg = alg;\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs_AT.m",
    "content": "function [ x, out, opts ] = tfocs_AT( smoothF, affineF, projectorF, x0, opts )\n% TFOCS_AT Auslender and Teboulle's accelerated method.\n% [ x, out, opts ] = tfocs_AT( smoothF, affineF, nonsmoothF, x0, opts )\n%   Implements Auslender & Teboulle's method.\n%   A variety of calling sequences are supported; type \n%      help tfocs_help\n%   for a full explanation.\n\n% Nov 17 2016, hack for Matlab R2016b not allowing nargin/nargout in\n% tfocs_initialize:\nnarginn = nargin; nargoutt = nargout;\n\n% Initialization\nalg = 'AT';\nalgorithm = 'Auslender & Teboulle''s single-projection method';\nalpha = 0; beta = 0; mu = 0; L = 0;% Do not remove: necessary because of a MATLAB quirk\ntfocs_initialize\nif nargin == 0,\treturn; end\n\nwhile true,\n    \n      x_old =   x;\n    A_x_old = A_x;\n      z_old =   z;\n    A_z_old = A_z;\n    \n    % The backtracking loop\n    L_old      = L;\n   \tL          = L * alpha;\n    theta_old  = theta;\n    while true,\n        \n        % Acceleration\n        theta = advance_theta( theta_old, L, L_old );\n\n\t\t% Next iterate\n        if theta < 1,\n            y   = ( 1 - theta ) *   x_old + theta *   z_old;\n            if cntr_Ay >= cntr_reset  % change from > to >=, 4/24/14\n                % every so often, we compute this explicitly,\n                %   to avoid roundoff errors that might accumulate\n                A_y = apply_linear( y, 1 );\n                cntr_Ay = 0;\n            else\n                % the efficient way\n                cntr_Ay = cntr_Ay + 1;\n                A_y = ( 1 - theta ) * A_x_old + theta * A_z_old;\n            end\n            f_y = Inf; g_Ay = []; g_y = [];\n        end\n        \n        % Compute the function value if it is not already\n        if isempty( g_y ),\n            if isempty( g_Ay ), [ f_y, g_Ay ] = apply_smooth( A_y ); end\n            g_y = apply_linear( g_Ay, 2 );\n        end\n        \n        % Scaled gradient\n        step = 1 / ( theta * L );\n        [ C_z, z ] = apply_projector( z_old - step * g_y, step );\n        A_z = apply_linear( z, 1 );\n        \n        % New iterate\n        if theta == 1,\n            x   = z; \n            A_x = A_z;\n            C_x = C_z;\n        else\n            x   = ( 1 - theta ) *   x_old + theta *   z;\n            if cntr_Ax >= cntr_reset     % see above comments for cntr_Ay\n                cntr_Ax = 0;\n                A_x = apply_linear( x, 1 );\n            else\n                cntr_Ax = cntr_Ax + 1;\n                A_x = ( 1 - theta ) * A_x_old + theta * A_z;\n            end\n            C_x = Inf;\n        end\n        f_x = Inf; g_Ax = []; g_x = [];\n        \n        % Perform backtracking tests\n        tfocs_backtrack\n        if do_break, break; end % new, for R2015b compatibility\n        \n    end\n    \n    % Collect data, evaluate stopping criteria, and print status\n    tfocs_iterate\n    if do_break, break; end\n    \nend\n\n% Final processing\ntfocs_cleanup\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs_GRA.m",
    "content": "function [ x, out, opts ] = tfocs_GRA( smoothF, affineF, projectorF, x0, opts )\n%TFOCS_GRA Gradient descent.\n% [ x, out, opts ] = tfocs_GRA( smoothF, affineF, nonsmoothF, x0, opts )\n%   Implements a standard gradient method. A variety of calling sequences\n%   are supported; type 'help tfocs_help' for a full explanation.\n\n% Nov 17 2016, hack for Matlab R2016b not allowing nargin/nargout in\n% tfocs_initialize:\nnarginn = nargin; nargoutt = nargout;\n\n% Initialization\nalg = 'GRA';\nalgorithm = 'Proximal gradient descent';\nalpha = 0; beta = 0; mu = 0; L = 0; % Do not remove: necessary because of a MATLAB quirk\ntfocs_initialize\nif nargin==0, return; end\n\n% Unlike the other algorithms, GRA does not use the theta parameter, so it\n% is not subject to restart, and we need not embed the initialization code\n% inside the loop.\n\nwhile true,\n    \n\ty     = x; \n    A_y   = A_x;\n\tf_y   = f_x;\n    x_old = x;\n    \n\tg_Ay = g_Ax;\n\tg_y  = apply_linear( g_Ay, 2 );\n    L    = L * alpha;\n    \n    while true,\n    \n        % Standard gradient\n        [ C_x, x ] = apply_projector( y - (1/L) * g_y, 1/L );\n        A_x = apply_linear( x, 1 );\n   \t\t[ f_x, g_Ax ] = apply_smooth( A_x );\n        \n        % Backtracking\n        tfocs_backtrack\n        if do_break, break; end % new, for R2015b compatibility\n        \n    end\n    \n    % Collect data, evaluate stopping criteria, and print status\n    tfocs_iterate\n    if do_break, break; end % new, for R2015b compatibility\n    \nend\n\n% Final processing\ntfocs_cleanup\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs_LLM.m",
    "content": "function [ x, out, opts ] = tfocs_LLM( smoothF, affineF, projectorF, x0, opts )\n% TFOCS_LLM Lan, Lu and Monteiro's accelerated method.\n% [ x, out, opts ] = tfocs_LLM( smoothF, affineF, nonsmoothF, x0, opts )\n%   Implements Lan, Lu & Monteiro's method.\n%   A variety of calling sequences are supported; type \n%      help tfocs_help\n%   for a full explanation.\n\n% Nov 17 2016, hack for Matlab R2016b not allowing nargin/nargout in\n% tfocs_initialize:\nnarginn = nargin; nargoutt = nargout;\n\n% Initialization\nalg = 'LLM';\nalgorithm = 'Lan/Lu/Monteiro''s two-projection method';\nalpha = 0; beta = 0; mu =0; L = 0; % Do not remove: necessary due to MATLAB quirk\ntfocs_initialize\nif nargin == 0, return; end\n\n\nwhile true,\n    \n      x_old =   x;\n    A_x_old = A_x;\n      z_old =   z;\n    A_z_old = A_z;\n    \n    % The backtracking loop\n    L_old      = L;\n   \tL          = L * alpha;\n    theta_old  = theta;\n    while true,\n    \n        % Acceleration\n        theta = advance_theta( theta_old, L, L_old );\n        \n        % Next iterate\n        if theta < 1,\n              y = ( 1 - theta ) *   x_old + theta *   z_old;\n            A_y = ( 1 - theta ) * A_x_old + theta * A_z_old;\n            f_y = Inf; g_Ay = []; g_y = [];\n        end\n        \n        % Compute the latest function values\n        if isempty( g_y ),\n            if isempty( g_Ay ), [ f_y, g_Ay ] = apply_smooth( A_y ); end\n            g_y = apply_linear( g_Ay, 2 );\n        end\n        \n        % Standard gradient\n        [ C_x, x ] = apply_projector( y - (1/L) * g_y, 1/L );\n        A_x = apply_linear( x, 1 );\n        f_x = Inf; g_Ax = []; g_Ax = [];\n        \n        % Backtracking test\n        tfocs_backtrack\n        if do_break, break; end % new, for R2015b compatibility\n        \n    end\n    \n    % Collect data, evaluate stopping criteria, and print status\n    tfocs_iterate\n    if do_break, break; end % new, for R2015b compatibility\n\t\n\t% Scaled gradient. This step must be skipped if restart occurs\n    if theta == 1 || isinf(theta)\n        z   = x;\n        C_z = C_x;\n        A_z = A_x;\n    else\n    \tstep = 1 / ( theta * L );\n        [ C_z, z ] = apply_projector( z - step * g_y, step );\n        A_z = apply_linear( z, 1 );\n    end\n    \nend\n\n% Final processing\ntfocs_cleanup\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs_N07.m",
    "content": "function [ x, out, opts ] = tfocs_N07( smoothF, affineF, projectorF, x0, opts )\n% TFOCS_N07 Nesterov's 2007 accelerated method.\n% [ x, out, opts ] = tfocs_N07( smoothF, affineF, projectorF, x0, opts )\n%   Implements Nesterov's 2007 two-projection method.\n%   A variety of calling sequences are supported; type \n%      help tfocs_help\n%   for a full explanation.\n\n% Nov 17 2016, hack for Matlab R2016b not allowing nargin/nargout in\n% tfocs_initialize:\nnarginn = nargin; nargoutt = nargout;\n\n% Initialization\nalg = 'N07';\nalgorithm = 'Nesterov''s 2007 two-projection method';\nalpha = 0; beta = 0; mu = 0; L = 0; % Necessary due to MATLAB quirk\ntfocs_initialize\nif nargin == 0,return; end\n\nwhile true,\n    \n    % Initialize the centerpoint and accumulated gradient. We do this here,\n      x_old =   x;\n    A_x_old = A_x;\n      z_old =   z;\n    A_z_old = A_z;\n    \n    % The backtracking loop\n    L_old      = L;\n   \tL          = L * alpha;\n    theta_old  = theta;\n    while true,\n    \n        % Acceleration\n        theta = advance_theta( theta_old, L, L_old );\n        \n        % Next iterate\n        if theta < 1,\n              y = ( 1 - theta ) *   x_old + theta *   z_old;\n            A_y = ( 1 - theta ) * A_x_old + theta * A_z_old;\n            f_y = Inf; g_Ay = []; g_y = [];\n        end\n        \n        % Compute function values\n        if isempty( g_y ),\n            if isempty( g_Ay ), \n                [ f_y, g_Ay ] = apply_smooth( A_y ); \n            end\n            g_y = apply_linear( g_Ay, 2 );\n        end\n\n        % Standard gradient\n        [ C_x, x ] = apply_projector( y - (1/L) * g_y, 1/L );\n        A_x = apply_linear( x, 1 );\n        f_x = Inf; g_Ax = []; g_x = [];\n        \n        % Backtracking test\n        tfocs_backtrack\n        if do_break, break; end % new, for R2015b compatibility\n    end\n    \n    % Collect data, evaluate stopping criteria, and print status\n    tfocs_iterate\n    if do_break, break; end % new, for R2015b compatibility\n\t\n\t% Accumulated gradient. This step must be skipped if restart occurs\n    if theta == 1 || isinf(theta)\n        g_accum = g_y;\n        x_cent  = x_old;\n        z       = x;\n        C_z     = C_x;\n        A_z     = A_x;\n    else\n        g_accum = ( 1 - theta ) * g_accum + theta * g_y;\n        step = 1 / ( theta^2 * L );\n        [ C_z, z ] = apply_projector( x_cent - step * g_accum, step );\n        A_z = apply_linear( z, 1 );\n    end\n    \nend\n\n% Final processing\ntfocs_cleanup\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs_N83.m",
    "content": "function [ x, out, opts ] = tfocs_N83( smoothF, affineF, projectorF, x0, opts )\n% TFOCS_N83 Nesterov's 1983 accelerated method; also by Beck and Teboulle 2005 (FISTA).\n% [ x, out, opts ] = tfocs_N83( smoothF, affineF, nonsmoothF, x0, opts )\n%   Implements Nesterov's 1983 method.\n%   A variety of calling sequences are supported; type \n%      help tfocs_help\n%   for a full explanation.\n\n% Nov 17 2016, hack for Matlab R2016b not allowing nargin/nargout in\n% tfocs_initialize:\nnarginn = nargin; nargoutt = nargout;\n\n% Initialization\nalg = 'N83';\nalgorithm = 'Nesterov''s 1983 single-projection method';\nalpha = 0; beta = 0; mu = 0; L = 0; % Do not remove: necessary because of a MATLAB quirk\ntfocs_initialize\nif nargin == 0, return; end\n\nwhile true,\n    \n      x_old =   x;\n    A_x_old = A_x;\n      z_old =   z;\n    A_z_old = A_z;\n    \n    % The backtracking loop\n    L_old      = L;\n   \tL          = L * alpha;\n    theta_old  = theta;\n    while true,\n        \n        % Acceleration\n        theta = advance_theta( theta_old, L, L_old );\n        \n        % Next iterate\n        if theta < 1,\n            y   = ( 1 - theta ) *   x_old + theta *   z_old;\n            A_y = ( 1 - theta ) * A_x_old + theta * A_z_old;\n            f_y = Inf; g_Ay = []; g_y = [];\n        end\n\n        % Compute function values\n        if isempty( g_y ),\n            if isempty( g_Ay ), \n                [ f_y, g_Ay ] = apply_smooth( A_y ); \n            end\n            g_y = apply_linear( g_Ay, 2 );\n        end\n        \n        % Standard gradient\n        [ C_x, x ] = apply_projector( y - (1/L) * g_y, 1/L );\n        A_x = apply_linear( x, 1 );\n        f_x = Inf; g_Ax = []; g_x = [];\n        \n        % Backtracking test\n        tfocs_backtrack\n        if do_break, break; end % new, for R2015b compatibility\n        \n    end\n    \n    % Collect data, evaluate stopping criteria, and print status\n    tfocs_iterate\n    if do_break, break; end % new, for R2015b compatibility\n\n    % Reversed z update. This step is skipped if restart occurs\n    if theta == 1,\n        z   =   x;\n        A_z = A_x;\n        C_z = C_x;\n    else\n        z   = (1/theta) * x   + ( 1 - 1/theta ) *   x_old;\n        A_z = (1/theta) * A_x + ( 1 - 1/theta ) * A_x_old;\n        C_z = Inf;\n    end\n    \nend\n\n% Final processing\ntfocs_cleanup\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs_SCD.m",
    "content": "function [ x, odata, opts ] = tfocs_SCD( objectiveF, affineF, dualproxF, mu, x0, z0, opts, contOpts )\n% TFOCS_SCD Smoothed conic dual form of TFOCS, for problems with non-trivial linear operators.\n% [ x, out, opts ] = tfocs_SCD( objectiveF, affineF, dualproxF, mu, x0, z0, opts )\n%   Solves a conic problem using the smoothed conic dual approach. The goal\n%   is to solve a problem in the following conic form:\n%       minimize objectiveF(x)+0.5*mu(x-x0).^2\n%       s.t.     affineF(x) \\in \\cK\n%   The user is responsible for constructing the dual proximity function\n%   so that the dual can be described by the saddle point problem\n%        maximize_z inf_x [ objectiveF(x)+0.5*mu(x-x0).^2-<affineF(x),z> ] -dualproxF(z)\n%   If mu = Inf, the method ignores the objective function and solves\n%       minimize 0.5*(x-x0).^2\n%       s.t.     affineF(x) \\in \\cK\n%\n%   dualProxF is also known as conjnegF\n%       It is the Fenchel-Legendre dual up to a -1 scaling of the argument\n%\n%   For general usage instructions, see tfocs.m and the user guide.\n%   In general, setting a variable to [] will set it to its default value.\n%\n%   If opts.continuation is true, then\n% [ x, out, opts ] = tfocs_SCD( objectiveF, affineF, dualproxF, mu, x0, z0, opts )\n%   or\n% [ x, out, opts ] = tfocs_SCD( objectiveF, affineF, dualproxF, mu, x0, z0, opts, continuationOptions )\n%   will update x0 as to eliminate the influence of the mu(x-x0).^2 term\n%   Parameters for the continuation scheme are optionally specified\n%   in the \"continuationOpts\" variable.\n%   Note: if the \"continuationOpts\" variable is given, then the solver\n%     enters continuation mode automatically, unless opts.continuation\n%     is explicitly set to false.\n%   To see options available for continuation, type \"continuation()\"\n%\n%   See also tfocs\n\nif nargin == 0\n    % pass in the SCD specific options:\n    opSCD   = [];\n    opSCD.continuation  = false;\n    opSCD.adjoint       = true;\n    opSCD.saddle        = true;\n    opSCD.maxmin        = -1;\n    if nargout > 0, x = tfocs(opSCD);\n        % and set the continuation options (right now, continuation is off by default)\n         x.continuation  = false;\n         x = rmfield(x,'adjoint'); % x.adjoint       = true;\n         x.saddle        = true;\n         x.maxmin        = -1;\n    else\n        tfocs(opSCD);\n        disp('Warning: we strongly recommend setting opts.continuation=true; see the user guide');\n        disp('Type ''help continuation'' for details');\n    end\n    return;\nend\n\nerror(nargchk(4,8,nargin));\nif nargin < 5, x0 = []; end\nif nargin < 6, z0 = []; end\nif nargin < 7, opts = []; end\n\n% look for continuation options\nDO_CONTINUATION     = false;\nif nargin >= 8\n    DO_CONTINUATION = true; \nelse\n    contOpts        = [];\nend\nif isfield( opts, 'continuation' )\n    if opts.continuation\n        DO_CONTINUATION     = true;\n    else\n        DO_CONTINUATION     = false;\n    end\n    opts    = rmfield(opts,'continuation');\nend\n\n% Handle special cases of zero objective or infinite mu\nif isinf( mu ),\n    mu = 1;\n    objectiveF = prox_0;\nelseif isempty( objectiveF ),\n    objectiveF = prox_0;\nelseif iscell( objectiveF )  % allow the case of {[],[],...,[]}\n    for k = 1:length(objectiveF)\n        if isempty( objectiveF{k} ) || isequal( objectiveF{k}, 0 ),\n            objectiveF{k} = prox_0;\n        elseif isnumeric( objectiveF{k} ),\n            objectiveF{k} = smooth_linear( objectiveF{k} );\n        end\n    end\nend\n\n% The affine quantities will be used in adjoint orientation\nif isfield( opts, 'adjoint'  ),\n    opts.adjoint = ~opts.adjoint;\nelse\n    opts.adjoint = true;\nend\nopts.saddle = true;\nopts.maxmin = -1;\nif isempty( x0 ), x0 = 0; end\nsmoothF = create_smoothF( objectiveF, mu, x0 );\n\nif isempty(dualproxF)\n    dualproxF = proj_Rn;\nelseif iscell(dualproxF)\n    for k = 1:length(dualproxF)\n        dp = dualproxF{k};\n        if isempty( dp ) || isnumeric( dp ) && numel( dp ) == 1 && dp == 0,\n            dualproxF{k} = proj_Rn;\n        end\n    end\nend\n% When tfocs.m finds an error with z0, it says it has an error with \"x0\",\n%   which is confusing for tfocs_SCD users, since their \"x0\" has a different meaning.\n% try  % this is annoying for debugging\n    if DO_CONTINUATION\n        continuation_solver=@(mu,x0,z0,opts)solver(objectiveF,affineF,dualproxF, mu,x0,z0,opts);\n        [ x, odata, opts ] = continuation( continuation_solver, mu, x0, z0, opts,contOpts );\n    else\n        [ z, odata, opts ] = tfocs( smoothF, affineF, dualproxF, z0, opts );\n    end\n% catch err\n%     if strfind( err.message, 'x0' )\n%         fprintf(2,'Error involves z0 (which is referred to as x0 below)\\n');\n%     end\n%     rethrow(err);\n% end\nopts.adjoint = ~opts.adjoint;\nopts = rmfield( opts, { 'saddle', 'maxmin' } );\nif DO_CONTINUATION\n    opts.continuation   = true;\nelse\n    x = odata.dual;\n    odata.dual = z;\nend\n\n\n\n% ----------------------- Subfunctions ----------------------------------------\n\nfunction [ prox, x ] = smooth_dual( objectiveF, mu_i, x0, ATz )\n% Adding 0 to ATz will destroy the sparsity\nif (isscalar(x0) && x0 == 0) || numel(x0) == 0 || nnz(x0) == 0\n    [ v, x ] = objectiveF( mu_i * ATz, mu_i );\nelse\n    [ v, x ] = objectiveF( x0 + mu_i * ATz, mu_i );\nend\nprox = tfocs_dot( ATz, x ) - v - (0.5/mu_i) * tfocs_normsq( x - x0 );\nprox = -prox;\nx = -x;\n\nfunction [ prox, x ] = smooth_dual_vectorMu( objectiveF, mu_i, x0, ATz )\n% Adding 0 to ATz will destroy the sparsity\nif (isscalar(x0) && x0 == 0) || numel(x0) == 0 || nnz(x0) == 0\n    [ v, x ] = objectiveF( mu_i .* ATz, mu_i );\nelse\n    [ v, x ] = objectiveF( x0 + mu_i .* ATz, mu_i ); % Causes a scaling...\nend\nprox = tfocs_dot( ATz, x ) - v - 0.5*tfocs_normsq( x - x0, 1./mu_i );\nprox = -prox;\nx = -x;\n\n\nfunction smoothF = create_smoothF( objectiveF, mu, x0 )\nif iscell(objectiveF)\n    for k = 1 : length(objectiveF)\n        if iscell(x0)\n            if length(mu)>1\n              smoothF{k} = @(varargin)smooth_dual_vectorMu( objectiveF{k}, 1./mu, x0{k}, varargin{:} );\n            else\n              smoothF{k} = @(varargin)smooth_dual( objectiveF{k}, 1./mu, x0{k}, varargin{:} );\n            end\n        else\n            if length(mu)>1\n              smoothF{k} = @(varargin)smooth_dual_vectorMu( objectiveF{k}, 1./mu, x0, varargin{:} );\n            else\n              smoothF{k} = @(varargin)smooth_dual( objectiveF{k}, 1./mu, x0, varargin{:} );\n            end\n        end\n    end\nelse\n    if length(mu)>1\n      smoothF = @(varargin)smooth_dual_vectorMu( objectiveF, 1./mu, x0, varargin{:} );\n    else\n      smoothF = @(varargin)smooth_dual( objectiveF, 1./mu, x0, varargin{:} );\n    end\nend\n\n% For use with continuation:\nfunction [varargout] = solver(objectiveF,affineF,dualproxF, mu,x0,z0,opts)\nsmoothF = create_smoothF( objectiveF, mu, x0 );\n[varargout{1:max(nargout,2)}] = tfocs( smoothF, affineF, dualproxF, z0, opts );\n% The varargout should be [x, odata, opts ]\n% Since we're using the dual, need to switch\ndualVar = varargout{1};\nodata   = varargout{2};\nvarargout{1} = odata.dual;\nodata.dual   = dualVar;\nvarargout{2} = odata;\n\n\n\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs_TS.m",
    "content": "function [ x, out, opts ] = tfocs_TS( smoothF, affineF, projectorF, x0, opts )\n% TFOCS_TS Tseng's modification of Nesterov's 2007 method.\n% [ x, out, opts ] = tfocs_TS( smoothF, affineF, projectorF, x0, opts )\n%   Implements Tseng's modification of the Nesterov 2007 method.\n%   A variety of calling sequences are supported; type \n%      help tfocs_help\n%   for a full explanation.\n\n% Nov 17 2016, hack for Matlab R2016b not allowing nargin/nargout in\n% tfocs_initialize:\nnarginn = nargin; nargoutt = nargout;\n\n% Initialization\nalg = 'TS';\nalgorithm = 'Tseng''s single-projection modification of Nesterov''s 2007 method';\nalpha = 0; beta = 0; mu = 0; L = 0; % Necessary due to MATLAB quirk\ntfocs_initialize\nif nargin == 0, return; end\n\nwhile true,\n\n      x_old =   x;\n    A_x_old = A_x;\n      z_old =   z;\n    A_z_old = A_z;\n    \n    % The backtracking loop\n    L_old      = L;\n   \tL          = L * alpha;\n    theta_old  = theta;\n    while true,\n        \n    \t% Acceleration\n        theta = 2 ./ ( 1 + sqrt( 1 + 4 * L / L_old / theta_old^2 ) );\n        \n        % Next iterate\n        if theta < 1,\n              y = ( 1 - theta ) *   x_old + theta *   z_old;\n            A_y = ( 1 - theta ) * A_x_old + theta * A_z_old;\n            f_y = Inf; g_Ay = []; g_y = []; C_y = Inf;\n        end\n\n        % Compute function values\n        if isempty( g_y ),\n            if isempty( g_Ay ), [ f_y, g_Ay ] = apply_smooth( A_y ); end\n            g_y = apply_linear( g_Ay, 2 );\n        end\n\n        % Accumulated gradient\n        if theta == 1,\n            x_cent = x_old;\n            g_a = g_y;\n        else\n            g_a = ( 1 - theta ) * g_a_old + theta * g_y;\n        end\n        step = 1 / ( theta^2 * L );\n        [ C_z, z ] = apply_projector( x_cent - step * g_a, step );\n        A_z = apply_linear( z, 1 );\n        \n        % New iterate\n        if theta == 1,\n            x   = z; \n            A_x = A_z;\n            C_x = C_z;\n        else\n            x   = ( 1 - theta ) *   x_old + theta *   z;\n            A_x = ( 1 - theta ) * A_x_old + theta * A_z;\n            C_x = Inf;\n        end\n        f_x = Inf; g_Ax = []; g_x = [];\n        \n        % Bactracking test\n        tfocs_backtrack\n        if do_break, break; end % new, for R2015b compatibility\n        \n    end\n    \n    % Collect data, evaluate stopping criteria, and print status\n    tfocs_iterate\n    if do_break, break; end % new, for R2015b compatibility\n    \n    g_a_old = g_a;\n    \nend\n\n% Final processing\ntfocs_cleanup\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs_normsq.m",
    "content": "function v = tfocs_normsq( x, scaling )\n\n% TFOCS_NORMSQ    Squared norm. \n%    By default, TFOCS_NORMSQ(X) = TFOCS_DOT(X,X). However, certain\n%    objects may have more efficient ways of computing this value.\n%    If so, TFOCS_NORMSQ should be overloaded to take advantage of\n%    this. However, the numerical equivalence to TFOCS_DOT(X,X) must\n%    be preserved.\n%\n%   TFOCS_NORMSQ( X, D ) = TFOCS_DOT( X, D.*X ) is a scaled norm\n\nif nargin < 2 || isempty(scaling)\n    v = tfocs_dot( x, x );\nelseif numel(scaling) == 1\n    v = scaling*tfocs_dot( x, x );\nelse\n    v = tfocs_dot( x, scaling.*x );\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs_version.m",
    "content": "function tfocs_ver2 = tfocs_version\n\n%TFOCS_VERSION   Version information.\n%    Prints information about the version of TFOCS being used, and the\n%    system on which it is running. When submitting a bug report, please\n%    run this function and include its output in your report.\n\ntfocs_ver = '1.4';\nif nargout == 0,\n    fprintf( 'TFOCS v%s\\n', tfocs_ver );\n    verd = ver('MATLAB');\n    fprintf( 'MATLAB version %s %s on %s\\n', verd.Version, verd.Release, computer );\nelse\n    tfocs_ver2 = tfocs_ver;\nend\n\n% TFOCS v1.4 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2015 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfocs_where.m",
    "content": "function s = tfocs_where\n\n%TFOCS_WHERE    Returns the location of the TFOCS system.\n%   TFOCS_WHERE returns a string containing the base directory of the \n%   TFOCS solvers. Within that directory are some useful\n%   subdirectories and files:\n%       experiments/     sample TFOCS models\n%       COPYING.txt      copyright information\n%   The proper operation of this function assumes that it has not been\n%   moved from its default position within the TFOCS distribution.\n\ns = mfilename('fullpath');\ntemp = strfind( s, filesep );\ns( temp(end) + 1 : end ) = [];\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfunc_scale.m",
    "content": "function op = tfunc_scale( funcF, s, A, b )\n\n%TFUNC_SCALE Scaling a function.\n%    SSCALE = TFUNC_SCALE( FUNC, s, A, b ) is the function\n%        SSCALE( y ) = s * FUNC( A * y + b ).\n%    s must be a real scalar; A can be a scalar, a matrix, or a linear\n%    operator; and offset must be a vector of compatible size. The third\n%    and fourth arguments are optional; A=I, b=0 are the defaults. If A\n%    is a matrix or a linear operator, then the resulting function cannot\n%    perform proximity minimizations.\n%\n%   See also prox_scale\n\nerror(nargchk(2,4,nargin));\nif ~isa( funcF, 'function_handle' ),\n    error( 'The first argument must be a function handle.' );\nelseif ~isnumeric( s ) || ~isreal( s ) || numel( s ) ~= 1,\n    error( 'The second argument must be a real scalar.' );\nend\nif nargin < 3,\n    A = 1;\nelseif ~isnumeric( A ) && ~isa( A, 'function_handle' ),\n    error( 'The third argument must be a scalar, matrix, or linear operator.' );\nend\nif nargin < 4 || isempty( b ),\n    b = 0;\nelseif ~isnumeric( b ),\n    error( 'The fourth argument must be a vector or matrix.' );\nend\n\n% Determine the best handle for the job\nif s == 0,\n    op = smooth_constant( 0 );\nelseif ~isnumeric( A ),    \n    op = @(varargin)tfunc_scale_linop(  funcF, s, A, b, varargin{:} );\nelseif ~nnz(b) || numel( A ) ~= 1,\n    op = @(varargin)tfunc_scale_matrix( funcF, s, A, b, varargin{:} );\nelseif s ~= 1 || A ~= 1,\n    op = @(varargin)tfunc_scale_scalar( funcF, s, A, b, varargin{:} );\nelse\n    op = funcF;\nend\n\nfunction [ v, g ] = tfunc_scale_scalar( funcF, s, a, b, x, t )\nswitch nargin,\n    case 5,\n        if nargout == 1,\n            v = funcF( a * x + b );\n        else\n            [ v, g ] = funcF( a * x + b );\n            g = ( s * A ) * g;\n        end\n    case 6,\n        [ v, g ] = funcF( a * x + b, s * a * t );\n        g = ( g - b ) / a;\n    otherwise,\n        error( 'Not enough arguments.' );\nend\nv = s * v;\n\nfunction [ v, g ] = tfunc_scale_matrix( funcF, s, A, b, x, t )\nswitch nargin,\n    case 5,\n        if nargout == 1,\n            v = funcF( A * x + b );\n        else\n            [ v, g ] = funcF( A * x + b );\n            g = s * ( A' * g );\n        end\n    case 6,\n        error( 'This function cannot perform proximity minimization.' );\n    otherwise,\n        error( 'Not enough arguments.' );\nend\nv = s * v;\n\nfunction [ v, g ] = tfunc_scale_linop( funcF, s, A, b, x, t )\nswitch nargin,\n    case 5,\n        if nargout == 1,\n            v = funcF( A( x, 1 ) + b );\n        else\n            [ v, g ] = funcF( A( x, 1 ) + b );\n            g = s * A( g, 2 );\n        end\n    case 6,\n        error( 'This function cannot perform proximity minimization.' );\n    otherwise,\n        error( 'Not enough arguments.' );\nend\nv = s * v;\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/TFOCS/tfunc_sum.m",
    "content": "function op = tfunc_sum( varargin )\n\n%TFUNC_SUM Sum of functions.\n%    OP = TFUNC_SUM( F1, F2, ..., FN ) implements\n%        OP( x ) = F1( x ) + F2( x ) + ... + FN( x ).\n%    Each entry must be a real scalar or a function handle. You are\n%    responsible for ensuring that the sum is convex or concave, as\n%    appropriate; TFOCS cannot verify this.\n\nfor k = 1 : nargin,\n    arg = varargin{k};\n    if ~isa( arg, 'function_handle' ) && ( ~isnumeric( arg ) || numel( arg ) ~= 1 || ~isreal( arg ) ),\n        error( 'Arguments must be function handles or real scalars.' );\n    elseif isnumeric( arg ),\n        varargin{k} = smooth_constant( arg );\n    end\nend\nswitch nargin,\n    case 0,\n        op = smooth_constant( 0 );\n    case 1,\n        op = varargin{1};\n    otherwise,\n        op = @(x)tfunc_sum_impl( varargin, x );\nend\n\nfunction [ v, g ] = tfunc_sum_impl( args, x, t )\nif nargin > 2,\n    error( 'This function does not support proximity minimization.' );\nelseif nargout == 1,\n    v = args{1}( x );\n    for k = 2 : numel(args),\n        v = v + args{k}( x );\n    end\nelse\n    [ v, g ] = args{1}( x );\n    for k = 2 : numel(args),\n        [ nv, ng ] = args{k}( x );\n        v = v + nv;\n        g = g + ng;\n    end\nend\n\n% TFOCS v1.3 by Stephen Becker, Emmanuel Candes, and Michael Grant.\n% Copyright 2013 California Institute of Technology and CVX Research.\n% See the file LICENSE for full license information.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/Traj.m",
    "content": "clear all\r\n%mu=0.012151; %Earth-Moon\r\nmu=0.012277471 %Earth-Moon\r\n[xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu);\r\nC=3.17;\r\n%C=2*Potential(xl1,yl1,mu);\r\nx_0=1;\r\ny_0=0;\r\nvx_0=0;\r\nvy_0=sqrt(-C-vx_0^2+2*Potential(x_0,y_0,mu));\r\n%vy_0=0;\r\nT=2;\r\nC_star=2*Potential(x_0,y_0,mu)-(vx_0^2+vy_0^2)\r\n%C=-(vx_0^2+vy_0^2)+2*Omega(x_0,y_0,mu);\r\nE=-C/2;\r\n\r\noptions=odeset('AbsTol',1e-22,'RelTol',1e-13); \r\n\r\n%Integrate first orbit\r\n[t0,Y0]=ode113(@f,[0 T],[x_0; y_0; vx_0; vy_0],options,mu);\r\nx0=Y0(:,1);\r\ny0=Y0(:,2);\r\nvx0=Y0(:,3);\r\nvy0=Y0(:,4);\r\nl0=length(Y0);\r\n\r\n% Precisionfirst orbit\r\ndelta_E0=abs(Energy(x0,y0,vx0,vy0,mu)-E);\r\n\r\n% figure\r\n% plot(delta_E0)\r\n\r\n%Hill's region\r\npoints=500;\r\nbb=3; % Bounding box\r\nx=linspace(-bb,bb,points);\r\ny=linspace(-bb,bb,points);\r\n[x,y]=meshgrid(x,y);\r\nz=(Potential(x,y,mu));\r\n% figure\r\n% surfc(x,y,z,'Edgecolor','none')\r\n\r\n%Plot orbit\r\n%figure\r\nhold on\r\ncontour(x,y,z,[C/2,C/2])\r\nplot(x0,y0)\r\ntext(-2,-2,sprintf('C=%.2f',C))\r\n%plotto actractors\r\nplot(-mu,0,'ok')\r\nplot(1-mu,0,'ok')\r\n% Plot points\r\nplot(x0(1),y0(1),'sg')\r\nplot(x0(l0),y0(l0),'sr')"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/adapting_structural_model.m",
    "content": "function [dx, y] = adapting_structural_model(t, x, u, varargin)\n%\n% Returns the time derivatives of the states and the output of the\n% structural control model with an adapting controller.\n%\n% Parameters\n% ----------\n% t : double\n%   The current time.\n% x : double, size(8, 1)\n%   The current state.\n% u : double, size(1, 1)\n%   The current input.\n% varargin : cell array\n%   m1, m2, m3, m4, b1, b2, b3, b4 : double\n%       The slope of the four gains and the offset of the four gains.\n%   aux : cell array containing a single structure\n%       The structure contains:\n%       pars : double, size(1,9)\n%           The controller parameters.\n%       timeDelay : logical\n%           If true a 1st order Pade approximation of the human's time delay\n%           is included.\n%       plantFirst : integer\n%           The number of the first plant.\n%       plantSecond : integer\n%           The number of the second plant.\n%       m : double, size(2, 1)\n%           The slope of the transfer function adaption function.\n%       b : double, size(2, 1)\n%           The offset of the transfer function adaption function.\n%\n% Returns\n% -------\n% dx : double, size(8, 1)\n%   The derivatives of the states.\n% y : double, size(1, 1)\n%   The output, theta.\n\n% MATLAB SUCKS! This is unbelievable. On the first iteration varargin is 1x2\n% and after that it is 1x9.\n%size(varargin, 2)\n\n% Unpack varargin.\naux = varargin{end}{1};\nm = zeros(4, 1);\nb = zeros(4, 1);\nfor i=1:4\n    if size(varargin, 2) == 2\n        m(i) = varargin{1}(i);\n        b(i) = varargin{1}(i + 4);\n    elseif size(varargin, 2) == 9\n        m(i) = varargin{i};\n        b(i) = varargin{i + 4};\n    else\n        display('Matlab is stupid.')\n    end\nend\n\n% First compute the gains at this time.\naux.pars(1:4) = m .* t + b;\n% Compute the controller.\nYp = human(aux.pars, aux.timeDelay);\n% Compute the plant and this time.\nc1 = aux.m(1) * t + aux.b(1) + 1e-10;\nc2 = aux.m(2) * t + aux.b(2) + 1e-10;\nYc = parallel(c1 * plant(aux.plantFirst), c2 * plant(aux.plantSecond));\n% Compute the closed loop system.\nYs = feedback(Yp * Yc, 1);\n% Convert to state space.\n[A, B, C, D] = tf2ss(Ys.num{1}, Ys.den{1});\n% Compute the derivatives of the states and the outputs.\ndx = A * x + B * u;\ny = C * x + D * u;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/average.m",
    "content": "function y = average(x)\n% AVERAGE Mean of vector elements.\n% AVERAGE(X), where X is a vector, is the mean of vector\n% elements. Nonvector input results in an error.\n[m,n] = size(x);\nif (~((m == 1) | (n == 1)) | (m == 1 & n == 1))\n    error('Input must be a vector')\nend\ny = sum(x)/length(x);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/bicycle_state_space.m",
    "content": "function bicycle = bicycle_state_space(bicycle, speed, varargin)\n% function bicycle = bicycle_state_space(bicycle, speed, varargin)\n%\n% Returns the state space system of the Whipple model linearized about the\n% nominal configuration and the supplied speed.\n%\n% Parameters\n% ----------\n% bicycle : char\n%   The name of a bicycle in the parameters directory.\n% speed : double\n%   The forward speed at which to linearize the model about.\n% varargin : char/cell array pairs, optional\n%   Specify a subset of states, inputs or outputs by setting one of the\n%   following: `states`, `inputs`, `outputs` as a cell array of\n%   chars which include the subset variable names. Beaware that not all\n%   state, input and output combinations are necessarily possible.\n%   Valid state names: 'xP', 'yP', 'psi', 'phi', 'thetaB', 'thetaR', 'delta',\n%       'thetaF', 'phiDot', 'thetaRDot', 'deltaDot'\n%   Valid input names: 'tPhi', 'tDelta', 'fB'\n%   Valid output names: 'xP', 'yP', 'psi', 'phi', 'thetaB', 'thetaR', 'delta',\n%       'thetaF', 'xPDot', 'yPDot', 'psiDot', 'phiDot', 'thetaBDot',\n%       'thetaRDot', 'deltaDot', 'thetaFDot', 'xQ', 'yQ'\n%\n% Returns\n% -------\n% bicycle : ss\n%   The state space model of the bicycle.\n%\n% Notes\n% -----\n% The variable names are defined as in Meijaard2007.\n%\n% Examples\n% --------\n% bicycle = bicycle_state_space('Benchmark', 5.0, ...\n%   'states', {'phi', 'phiDot', 'delta', 'deltaDot'}, ...\n%   'inputs', {'tDelta'}, ...\n%   'outputs', {'delta', 'phi'})\n\n% get the directory which this m-file is in\nS = dbstack('-completenames');\n[CURRENT_DIRECTORY, ~, ~] = fileparts(S(1).file);\n\n% load the paramaters\npar = par_text_to_struct([CURRENT_DIRECTORY filesep 'parameters' ...\n    filesep bicycle 'Par.txt']);\n\n% generate the state space matrices\n[A, B, C, D] = whipple_pull_force_abcd(par, speed);\n\n% name the states, outputs and inputs\nstates = {'xP',\n          'yP',\n          'psi',\n          'phi',\n          'thetaB',\n          'thetaR',\n          'delta',\n          'thetaF',\n          'phiDot',\n          'thetaRDot',\n          'deltaDot'};\n\noutputs = {'xP',\n           'yP',\n           'psi',\n           'phi',\n           'thetaB',\n           'thetaR',\n           'delta',\n           'thetaF',\n           'xPDot',\n           'yPDot',\n           'psiDot',\n           'phiDot',\n           'thetaBDot',\n           'thetaRDot',\n           'deltaDot',\n           'thetaFDot',\n           'xQ',\n           'yQ'};\n\ninputs = {'tPhi',\n          'tDelta',\n          'fB'};\n\ndefaultSettings.states = states;\ndefaultSettings.inputs = inputs;\ndefaultSettings.outputs = outputs;\n% load in user supplied settings\nif size(varargin, 2) >= 1\n    userSettings = varargin_to_structure(varargin);\nelse\n    userSettings = struct();\nend\n% combine the defaults with the user settings\nsettings = overwrite_settings(defaultSettings, userSettings);\n\n% Will the system have the bare minimum states?\nminStates = {'phi', 'delta', 'phiDot', 'deltaDot'};\nif sum(ismember(settings.states, minStates)) < 4\n    error(['You have not specified the minimum set of states. Please ' ...\n        'include at least phi, delta, phiDot, and deltaDot'])\nend\n\n% Have state derivatives been specified that can't be computed with the\n% specified states?\nkeepStates = find(ismember(states, settings.states));\nremoveStates = find(~ismember(states, settings.states));\nfor row = keepStates'\n    for col = removeStates'\n        if abs(A(row, col)) > 1e-10\n            s = sprintf(['It is not possible to compute the derivative ' ...\n                'of state %s because it depends on state %s'], ...\n                states{row}, states{col});\n            error(s)\n        end\n    end\nend\n\nremoveInputs = find(~ismember(inputs, settings.inputs));\n\n% Have outputs been specified that can't be computed with the specified\n% states and inputs?\nkeepOutputs = find(ismember(outputs, settings.outputs));\nfor row = keepOutputs'\n    for col = removeStates'\n        if abs(C(row, col)) > 1e-10\n            s = sprintf(['It is not possible to keep output %s because ' ...\n                'it depends on state %s'], outputs{row}, ...\n                states{col});\n            error(s)\n        end\n    end\n    for col = removeInputs'\n        if abs(D(row, col)) > 1e-10\n            s = sprintf(['It is not possible to keep output %s because ' ...\n                'it depends on input %s'], outputs{row}, ...\n                inputs{col});\n            error(s)\n        end\n    end\nend\n\nremoveOutputs = find(~ismember(outputs, settings.outputs));\n\nA(removeStates, :) = [];\nA(:, removeStates) = [];\n\nB(removeStates, :) = [];\nB(:, removeInputs) = [];\n\nC(removeOutputs, :) = [];\nC(:, removeStates) = [];\n\nD(removeOutputs, :) = [];\nD(:, removeInputs) = [];\n\nstates(removeStates) = [];\ninputs(removeInputs) = [];\noutputs(removeOutputs) = [];\n\n% build the ss structure\nbicycle = ss(A, B, C, D, ...\n             'StateName', states, ...\n             'OutputName', outputs, ...\n             'InputName', inputs);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/convert_variable.m",
    "content": "function [name, order] = convert_variable(variable, output)\n% Returns the name and order of the given variable in the output type.\n%\n% Parameters\n% ----------\n% variable : string\n%   A variable name.\n% output : string.\n%   Either `moore`, `meijaard`, `data`.\n%\n% Returns\n% -------\n% name : string\n%   The variable name in the given output type.\n% order : double\n%   The order of the variable in the list.\n\n[coordinates, speeds, inputs] = get_variables();\n\ncolumns = {'data', 'meijaard', 'moore'};\n\nif find(ismember(coordinates, variable))\n\n    [order, ~] = find(ismember(coordinates, variable));\n    name = coordinates{order, find(ismember(columns, output))};\n\nelseif find(ismember(speeds, variable))\n\n    [order, ~] = find(ismember(speeds, variable));\n    name = speeds{order, find(ismember(columns, output))};\n\nelseif find(ismember(inputs, variable))\n\n    [order, ~] = find(ismember(inputs, variable));\n    name = inputs{order, find(ismember(columns, output))};\n\nelse\n    error('Beep: Done typed yo variable name wrong')\nend\n\nfunction [coordinates, speeds, inputs] = get_variables()\n\ncoordinates = {'LongitudinalRearContact', 'xP', 'q1';\n               'LateralRearContact', 'yP','q2';\n               'YawAngle', 'psi','q3';\n               'RollAngle', 'phi','q4';\n               'PitchAngle', 'thetaB','q5';\n               'RearWheelAngle', 'thetaR','q6';\n               'SteerAngle', 'delta','q7';\n               'FrontWheelAngle', 'thetaF','q8';\n               'LongitudinalFrontContact', 'xQ','q9';\n               'LateralFrontContact', 'yQ', 'q10'};\n\nspeeds = {'LongitudinalRearContactRate', 'xPDot', 'u1';\n          'LateralRearContactRate', 'yPDot', 'u2';\n          'YawRate', 'psiDot', 'u3';\n          'RollRate', 'phiDot', 'u4';\n          'PitchRate', 'thetaDot', 'u5';\n          'RearWheelRate', 'thetaRDot', 'u6';\n          'SteerRate', 'deltaDot', 'u7';\n          'FrontWheelRate', 'thetaFDot','u8';\n          'LongitudinalFrontContactRate', 'xQDot', 'u9';\n          'LateralFrontContactRate', 'yQDot', 'u10'};\n\ninputs = {'RollTorque', 'tPhi', 'T4';\n          'RearWheelTorque', 'tThetaR', 'T6';\n          'SteerTorque', 'tDelta', 'T7';\n          'PullForce', 'fB', 'F'};\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/create_ieee_paper_plots.m",
    "content": "function create_ieee_paper_plots(data, rollData)\n% Creates all of the figures for the IEEE paper.\n%\n% Parameters\n% ----------\n% data : structure\n%   A structure contating the data from generate_data.m for all of the bicycles\n%   and speeds for the IEEE paper.\n% rollData : structure\n%   The data for a single bicycle at a single speed with roll torque as the\n%   input.\n\nglobal goldenRatio\n% used for figure width to height ratio\ngoldenRatio = (1 + sqrt(5)) / 2;\n\n% create a plot directory if one doesn't already exist\nif exist('plots/', 'dir') ~= 7\n    mkdir('plots/')\nend\n\n% Define some linestyles and colors for each of the six bicycles\nlinestyles = {'-', '-', '-.', ...\n              '--', '-.', '--'};\ncolors = {'k', ...\n          [0.5, 0.5, 0.5], ...\n          [0.5, 0.5, 0.5], ...\n          'k', ...\n          'k', ...\n          [0.5, 0.5, 0.5]};\n\nloop_shape_example(data.Benchmark.Medium, 'Steer')\nloop_shape_example(rollData, 'Roll')\nplot_io_roll(rollData, 'Distance')\nplot_io_roll(rollData, 'Time')\nopen_loop_all_bikes(data, linestyles, colors)\nhandling_all_bikes(data, rollData, linestyles, colors)\npath_plots(data, linestyles, colors)\nvar = {'delta', 'phi', 'psi', 'Tdelta'};\nio = {'output', 'output', 'output', 'input'};\ntyp = {'Distance', 'Time'};\nfor i = 1:length(var)\n    for j = 1:length(typ)\n        plot_io(var{i}, io{i}, typ{j}, data, linestyles, colors)\n    end\nend\nphase_portraits(data.Benchmark.Medium)\neigenvalues(data, linestyles, colors)\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction loop_shape_example(bikeData, input)\n% Creates the example loop shaping for the bicycle at medium speed.\n%\n% Parameters\n% ----------\n% bikeData : structure\n%   Contains data for a single bicycle at a single speed.\n% input : string\n%   'Steer' or 'Roll' depending on what input was used to control the bicycle.\n\nglobal goldenRatio\n\n% closed loop bode plots\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'OuterPosition', [424, 305 - 50, 518, 465], ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nfreq = {0.1, 20.0};\n\nhold all\n\nclosedLoops = bikeData.closedLoops;\n\n% make sure all bode plots display 'rad/s' instead of 'rad/sec'\nbops = bodeoptions;\nbops.FreqUnits = 'rad/s';\n\nif strcmp(input, 'Steer')\n    linestyles = {'', '', '-.', '-.', '-', '-.', '-.', '-'};\n    gray = [0.6, 0.6, 0.6];\n    colors = {'k', 'k', 'k', gray, 'k', 'k', gray, 'k'};\n    % the closed delta loop\n    deltaNum = closedLoops.Delta.num;\n    deltaDen = closedLoops.Delta.den;\n    bodeplot(tf(deltaNum, deltaDen), freq, bops);\n    % a typical neuromuscular model\n    neuroNum = 2722.5;\n    neuroDen = [1, 13.96, 311.85, 2722.5];\n    bodeplot(tf(neuroNum, neuroDen), freq, bops);\n    whichLines = 5:-1:3;\nelseif strcmp(input, 'Roll')\n    linestyles = {'', '', '-', '-'};\n    colors = {'k', 'k', 'k', 'k'};\n    whichLines = 4:-1:2;\nelse\n    error('Bad input, use Steer or Roll')\nend\n\n% the closed phi dot loop\nphiDotNum = closedLoops.PhiDot.num;\nphiDotDen = closedLoops.PhiDot.den;\nclosedBode = bodeplot(tf(phiDotNum, phiDotDen), freq, bops);\n\nhold off\n\n% clean it up\nopts = getoptions(closedBode);\nif strcmp(input, 'Steer')\n    opts.YLim = {[-45, 20], [-360, 90]};\nelse\n    opts.YLim = {[-30, 10], [-180, 90]};\nend\nopts.PhaseMatching = 'on';\nopts.PhaseMatchingValue = 0;\nopts.Title.String = '';\nsetoptions(closedBode, opts)\n\n% find all the lines in the current figure\nlines = findobj(gcf, 'type', 'line');\nfor i = 3:length(lines)\n    set(lines(i), 'LineStyle', linestyles{i}, ...\n                  'Color', colors{i}, ...\n                  'LineWidth', 2.0)\nend\n\n% there seems to be a bug such that the xlabel is too low, this is a hack to\n% get it to work\nraise = 0.05;\nplotAxes = findobj(gcf, 'type', 'axes');\nset(plotAxes, 'XColor', 'k', 'YColor', 'k')\ncurPos1 = get(plotAxes(1), 'Position');\ncurPos2 = get(plotAxes(2), 'Position');\nset(plotAxes(1), 'Position', curPos1 + [0, raise, 0, 0])\nset(plotAxes(2), 'Position', curPos2 + [0, raise, 0, 0])\nxLab = get(plotAxes(1), 'Xlabel');\nset(xLab, 'Units', 'normalized')\nset(xLab, 'Position', get(xLab, 'Position') + [0, raise + 0.05, 0])\n\n% make the tick labels smaller\nset(plotAxes, 'Fontsize', 8)\nif strcmp(input, 'Steer')\n    legWords = {'$\\delta$ Loop',\n                'Neuromuscular model from [27]',\n                '$\\dot{\\phi}$ Loop'};\nelseif strcmp(input, 'Roll')\n    legWords = {'$\\dot{\\phi}$ Loop'};\nend\ncloseLeg = legend(lines(whichLines), ...\n                  legWords, ...\n                  'Location', 'Southwest', ...\n                  'Interpreter', 'Latex', ...\n                  'Fontsize', 8);\n\n% add the annotation showing a 10 dB peak\nif strcmp(input, 'Steer')\n    axes(plotAxes(2))\n    db1 = text(2.7, 5.0, '~10dB');\n    db2 = text(2.5, -10.0, '~10dB');\n    set([db1, db2], 'Fontsize', 8)\n    dArrow1 = annotation('doublearrow', ...\n                         [0.7, 0.7], ...\n                         [0.755 + raise, 0.818 + raise]);\n    annotation('line', [0.69, 0.87], [0.818 + raise, 0.818 + raise])\n    dArrow2 = annotation('doublearrow', ...\n                         [0.685, 0.685], ...\n                         [0.665 + raise, 0.725 + raise]);\n    annotation('line', [0.675, 0.87], [0.725 + raise, 0.725 + raise])\n    set([dArrow1, dArrow2], 'Head1width', 3, 'Head1length', 3, ...\n        'Head2width', 3, 'Head2length', 3)\nelse\n    axes(plotAxes(2))\n    db1 = text(0.67, -3.7, '~10dB');\n    set(db1, 'Fontsize', 8)\n    dArrow = annotation('doublearrow', ...\n                        [0.5, 0.5], ...\n                        [0.697 + raise, 0.795 + raise]);\n    set(dArrow, 'Head1width', 3, 'Head1length', 3, ...\n        'Head2width', 3, 'Head2length', 3)\n    annotation('line', [0.49, 0.75], [0.795 + raise, 0.795 + raise])\nend\n\nfilename = ['benchmark' input 'Closed'];\npathToFile = ['plots' filesep filename];\nprint(gcf, '-deps2c', '-loose', [pathToFile '.eps'])\nfix_ps_linestyle([pathToFile '.eps'])\n\n% open loop plots\nfigure()\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nopenLoops = bikeData.openLoops;\n\nhold all\n\nnum = openLoops.Phi.num;\nden = openLoops.Phi.den;\nbodeplot(tf(num, den), freq, bops);\n\nnum = openLoops.Psi.num;\nden = openLoops.Psi.den;\nbodeplot(tf(num, den), freq, bops);\n\nnum = openLoops.Y.num;\nden = openLoops.Y.den;\nopenBode = bodeplot(tf(num, den), freq, bops);\n\nhold off\n\n% clean it up\nopts = getoptions(openBode);\nopts.Title.String = '';\nopts.YLim = {[-80, 20], [-540, -60]};\nopts.PhaseMatching = 'on';\nopts.PhaseMatchingValue = 0;\nsetoptions(openBode, opts)\n\n% find all the lines in the current figure\nlines = findobj(gcf, 'type', 'line');\nlinestyles = {'', '', '-.', '-', '--', '-.', '-', '--'};\nfor i = 3:length(lines)\n    set(lines(i), 'LineStyle', linestyles{i}, ...\n                  'Color', 'k', ...\n                  'LineWidth', 2.0)\nend\n\n\nplotAxes = findobj(gcf, 'type', 'axes');\nset(plotAxes, 'Fontsize', 8, 'XColor', 'k', 'YColor', 'k')\ncloseLeg = legend(lines(8:-1:6), ...\n                  {'$\\phi$ Loop', '$\\psi$ Loop','$y$ Loop'}, ...\n                  'Location', 'Southwest', ...\n                  'Interpreter', 'Latex');\n\n% add zero crossing lines\n%axes(plotAxes(1))\n%line([0.1, 20], [-180, -180], 'Color', 'k')\naxes(plotAxes(2))\nline([0.1, 20], [0, 0], 'Color', 'k')\n\n% add some lines and labels for the cross over frequencies\nif strcmp(input, 'Steer')\n    wc = 2;\n    wShift = [0.42, 0.35, 0.175];\nelse strcmp(input, 'Roll')\n    wc = 1.5;\n    wShift = [0.31, 0.26, 0.1325];\nend\naxes(plotAxes(2))\nhold on\ngray = [0.5, 0.5, 0.5];\n\nline([wc, wc], [-40, 0], 'Color', gray)\ntext(wc - wShift(1), -43, ['$\\omega_c=' num2str(wc) '$'], ...\n     'Interpreter', 'Latex', 'Fontsize', 8)\n\nline([wc / 2, wc / 2], [-30, 0], 'Color', gray)\ntext(wc / 2 - wShift(2), -33, ['$\\omega_c/2=' num2str(wc / 2) '$'], ...\n     'Interpreter', 'Latex', 'Fontsize', 8)\n\nline([wc / 4, wc / 4], [-20, 0], 'Color', gray)\ntext(wc / 4 - wShift(3), -23, ['$\\omega_c/4=' num2str(wc / 4) '$'], ...\n     'Interpreter', 'Latex', 'Fontsize', 8)\n\nhold off\n\ncurPos1 = get(plotAxes(1), 'Position');\ncurPos2 = get(plotAxes(2), 'Position');\nset(plotAxes(1), 'Position', curPos1 + [0, raise, 0, 0])\nset(plotAxes(2), 'Position', curPos2 + [0, raise, 0, 0])\nxLab = get(plotAxes(1), 'Xlabel');\nset(xLab, 'Units', 'normalized')\nset(xLab, 'Position', get(xLab, 'Position') + [0, raise + 0.05, 0])\n\nfilename = ['benchmark' input 'Open.eps'];\npathToFile = ['plots' filesep filename];\nprint(gcf, '-deps2c', '-loose', pathToFile)\nfix_ps_linestyle(pathToFile)\n\n% handling qualities plot\nnum = bikeData.handlingMetric.num;\nden = bikeData.handlingMetric.den;\nw = linspace(0.01, 20, 200);\n[mag, phase, freq] = bode(tf(num, den), w);\nfigure()\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nhold on\n\nmetricLine = plot(freq, mag(:)', 'k-', 'Linewidth', 2.0);\nlevel1 = line([0, 20], [5, 5]);\nlevel2 = line([0, 20], [8, 8]);\nset(level1, 'Color', 'k', 'Linestyle', '--', 'Linewidth', 2.0)\nset(level2, 'Color', 'k', 'Linestyle', '--', 'Linewidth', 2.0)\n\nylim([0, 10]);\n\nylabel('Handling Quality Metric')\nxlabel('Frequency (rad/s)')\ntext(3, 3, 'Level 1')\ntext(3, 6.5, 'Level 2')\ntext(3, 9, 'Level 3')\nbox on\n\nfilename = ['benchmark' input 'Handling.eps'];\npathToFile = ['plots' filesep filename];\nprint(gcf, '-deps2', '-loose', pathToFile)\nfix_ps_linestyle(pathToFile)\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction open_loop_all_bikes(data, linestyles, colors)\n% Creates open loop Bode plots of all the bikes.\n\nglobal goldenRatio\n\nbikes = fieldnames(data);\n\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nfreq = {0.1, 20.0};\n\n% make sure all bode plots display 'rad/s' instead of 'rad/sec'\nbops = bodeoptions;\nbops.FreqUnits = 'rad/s';\n\nhold all\nfor i = 2:length(bikes)\n    num = data.(bikes{i}).Medium.openLoops.Phi.num;\n    den = data.(bikes{i}).Medium.openLoops.Phi.den;\n    openBode = bodeplot(tf(num, den), freq, bops);\nend\nhold off\n\n% clean it up\nopts = getoptions(openBode);\n%opts.Title.String = '$\\phi$ Open Loop Bode Diagrams at 5 m/s';\nopts.Title.String = '';\n%opts.Title.Interpreter = 'Latex';\nopts.YLim = {[-30, 10], [-540, -90]};\nopts.PhaseMatching = 'on';\nopts.PhaseMatchingValue = 0;\nsetoptions(openBode, opts)\n\n% find all the lines in the current figure\nplotAxes = findobj(gcf, 'type', 'axes');\nmagLines = findobj(plotAxes(2), 'type', 'line');\nphaseLines = findobj(plotAxes(1), 'type', 'line');\n\nfor i = 2:length(magLines)\n    set(magLines(i), ...\n        'LineStyle', linestyles{i - 1}, ...\n        'Color', colors{i - 1}, ...\n        'LineWidth', 1.0)\n    set(phaseLines(i), ...\n        'LineStyle', linestyles{i - 1}, ...\n        'Color', colors{i - 1}, ...\n        'LineWidth', 1.0)\nend\n\ncloseLeg = legend(magLines(2:7), ...\n                  {'1', '2', '3', '4', '5', '6'}, ...\n                  'Location', 'Southwest', ...\n                  'Fontsize', 8);\n\nset(plotAxes, 'YColor', 'k', 'XColor', 'k', 'Fontsize', 8)\n\n% add a zero lines\naxes(plotAxes(1))\nline([0.1, 20], [-180, -180], 'Color', 'k')\naxes(plotAxes(2))\nline([0.1, 20], [0, 0], 'Color', 'k')\n\n% raise the axes cause the xlabel is cut off\nraise = 0.05;\ncurPos1 = get(plotAxes(1), 'Position');\ncurPos2 = get(plotAxes(2), 'Position');\nset(plotAxes(1), 'Position', curPos1 + [0, raise, 0, 0])\nset(plotAxes(2), 'Position', curPos2 + [0, raise, 0, 0])\nxLab = get(plotAxes(1), 'Xlabel');\nset(xLab, 'Units', 'normalized')\nset(xLab, 'Position', get(xLab, 'Position') + [0, raise + 0.05, 0])\n\nfilename = 'openBode.eps';\npathToFile = ['plots' filesep filename];\nprint(pathToFile, '-deps2c', '-loose')\nfix_ps_linestyle(pathToFile)\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction handling_all_bikes(data, rollData, linestyles, colors)\n% Creates handling quality metric for all bikes.\n%\n% Parameters\n% ----------\n% data : structure\n%   Contains data for all bikes a the three speeds for steer input.\n% rollData : structure\n%   Contains the data for the benchmark bike with roll input at medium speed.\n% linestyles : cell array\n%   Linestyle strings, one for each of the six bikes.\n% colors : cell array\n%   Colorspecs for each of the six bikes.\n\nglobal goldenRatio\n\nbikes = fieldnames(data);\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nw = linspace(0.01, 20, 200);\nspeedNames = fieldnames(data.Browser);\nfillColors = {[0.82, 0.82, 0.82]\n              [0.68, 0.68, 0.68]\n              [0.95, 0.95, 0.95]};\nhold all\n\n% plot the background area for each family of curves\nfor j = 1:length(speedNames)\n    % get the max values for the set of curves\n    magnitudes = zeros(length(w), length(bikes) - 1);\n    for i = 2:length(bikes)\n        num = data.(bikes{i}).(speedNames{j}).handlingMetric.num;\n        den = data.(bikes{i}).(speedNames{j}).handlingMetric.den;\n        [mag, phase, freq] = bode(tf(num, den), w);\n        magnitudes(:, i - 1) = mag(:)';\n    end\n    maxMag = max(magnitudes, [], 2);\n    % fill the area under the curve\n    area(freq, maxMag, ...\n         'Facecolor', fillColors{j}, ...\n         'Edgecolor', 'none')\nend\n\n% this makes sure that the edges of the fill area don't cover the axes\nset(gca, 'Layer', 'top')\n\n% plot the actual curves\nfor j = 1:length(speedNames)\n    metricLines = zeros(length(bikes) - 1, 1);\n    for i = 2:length(bikes)\n        num = data.(bikes{i}).(speedNames{j}).handlingMetric.num;\n        den = data.(bikes{i}).(speedNames{j}).handlingMetric.den;\n        [mag, phase, freq] = bode(tf(num, den), w);\n        metricLines(i - 1) = plot(freq, mag(:)', ...\n                                 'Color', colors{i - 1}, ...\n                                 'Linestyle', linestyles{i - 1}, ...\n                                 'Linewidth', 2.0);\n    end\nend\n\n% add the roll input bike\nnum = rollData.handlingMetric.num;\nden = rollData.handlingMetric.den;\n[mag, phase, freq] = bode(tf(num, den), w);\nrollLine = plot(freq, mag(:)', 'k', 'Linewidth', 2.0, 'Linestyle', ':');\n\nhold off\n\n% move the roll input line down so it shows on the legend\nchil = get(gca, 'Children');\nlegLines = [chil(end:-1:14)', rollLine];\nlegend(legLines, [{'2.5 m/s', '5.0 m/s', '7.5 m/s'}, ...\n        {'1', '2', '3', '4', '5', '6', 'Hands-free @ 5 m/s'}], ...\n        'Fontsize', 8)\n\nylim([0, 20]);\nlevel1 = line([0, 20], [5, 5]);\nlevel2 = line([0, 20], [8, 8]);\nset(level1, 'Color', 'k', 'Linestyle', '--', 'Linewidth', 1.0)\nset(level2, 'Color', 'k', 'Linestyle', '--', 'Linewidth', 1.0)\nylabel('Handling Quality Metric')\nxlabel('Frequency (rad/s)')\ntext(3.1, 4.3, 'Level 1')\ntext(1.9, 6.5, 'Level 2')\ntext(3, 15, 'Level 3')\nbox on\n\nset(gca, 'YColor', 'k')\n\nfilename = 'handling.eps';\npathToFile = ['plots' filesep filename];\nprint(pathToFile, '-deps2c', '-loose')\nfix_ps_linestyle(pathToFile)\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction path_plots(data, linestyles, colors)\n% Creates a plot of the path tracking for all bikes at all speeds.\n\nglobal goldenRatio\n\nbikes = fieldnames(data);\nspeedNames = fieldnames(data.Browser);\n\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nhold all\n\n% shifts the paths by this many meters\nshift = [0, 15, 35];\nfor j = 1:length(speedNames)\n    time = data.(bikes{2}).(speedNames{j}).time;\n    path = data.(bikes{2}).(speedNames{j}).path;\n    speed = data.(bikes{2}).(speedNames{j}).speed;\n    plot(time * speed + shift(j), -path * j, 'k-')\n    for i = 2:length(bikes)\n        x = data.(bikes{i}).(speedNames{j}).outputs(:, 17);\n        x = x + shift(j);\n        y = data.(bikes{i}).(speedNames{j}).outputs(:, 18);\n        plot(x, -y * j, ...\n             'Linestyle', linestyles{i - 1}, ...\n             'Color', colors{i - 1}, ...\n             'Linewidth', 0.75)\n    end\n    [minPath, minPathI] = min(-path * j);\n    dis = time * speed + shift(j);\n    lab = sprintf('%1.1f m/s', speed);\n    text(dis(minPathI) - 15, minPath - 0.4, lab)\nend\n\nhold off\n\n% change the y tick labels to positive and to reflect the 2 meter width\nset(gca, 'YTick', [-7, -6, -4, -2, 0, 1])\nset(gca, 'YTickLabel', {'', '2', '2', '2', '0', ''})\n\nxlim([30 200])\nbox on\nlegend(['Path', {'1', '2', '3', '4', '5', '6'}], ...\n       'Fontsize', 8, 'Location', 'Southeast')\nxlabel('Distance (m)')\nylabel('Lateral Deviation (m)')\nfilename = 'paths.eps';\npathToFile = ['plots' filesep filename];\nprint(pathToFile, '-deps2c', '-loose')\nfix_ps_linestyle(pathToFile)\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction plot_io(variable, io, xAxis, data, linestyles, colors)\n% Creates a plot of the time histories of a particular output or input variable\n% for three different speeds with either time or distance on the x axis.\n%\n% Parameters\n% ----------\n% variable : string\n%   The name of the variable you'd like to plot.\n% io : string\n%   'input' for input and 'output' for output.\n% data : structure\n%   Data for a set of bicycles, the first being the benchmark bicycle.\n% xAxis : string\n%   'Distance' or 'Time' on the x axis.\n% linestyles : cell array\n%   An array of linestyle types, one for each bicycle.\n% colors : cell array\n%   An array of colors, one for each bicycle.\n\nglobal goldenRatio\n\nif strcmp(io, 'input')\n    names = {'Tphi',\n             'Tdelta',\n             'F'};\n    prettyNames = {'$T_\\phi$',\n                   '$T_\\delta$',\n                   '$F$'};\n    units = {'(N-m)',\n             '(N-m)',\n             '(N)'};\nelseif strcmp(io, 'output')\n    names = {'xP',\n             'yP',\n             'psi',\n             'phi',\n             'thetaP',\n             'thetaR',\n             'delta',\n             'thetaF',\n             'xPDot',\n             'ypDot',\n             'psiDot',\n             'phiDot',\n             'thetaPDot',\n             'thetaRDot',\n             'deltaDot',\n             'thetaFDot',\n             'xQ',\n             'yQ'};\n    prettyNames = {'$x_P$',\n                   '$y_P$',\n                   '$\\psi$',\n                   '$\\phi$',\n                   '$\\theta_P$',\n                   '$\\theta_R$',\n                   '$\\delta$',\n                   '$\\theta_F$',\n                   '$\\dot{x}_P$',\n                   '$\\dot{y}_P$',\n                   '$\\dot{\\psi}$',\n                   '$\\dot{\\phi}$',\n                   '$\\dot{\\theta}_P$',\n                   '$\\dot{\\theta}_R$',\n                   '$\\dot{\\delta}$',\n                   '$\\dot{\\theta}_F$',\n                   '$x_Q$',\n                   '$y_Q$'};\n    units = {'(m)',\n             '(m)',\n             '(rad)',\n             '(rad)',\n             '(rad)',\n             '(rad)',\n             '(rad)',\n             '(rad)',\n             '(m/s)',\n             '(m/s)',\n             '(rad/s)',\n             '(rad/s)',\n             '(rad/s)',\n             '(rad/s)',\n             '(rad/s)',\n             '(rad/s)',\n             '(m)',\n             '(m)'};\nelse\n    error('Please choose i or o')\nend\n\nindex = find(ismember(names, variable) == 1);\n\nbikes = fieldnames(data);\nspeedNames = fieldnames(data.Browser);\n\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\n% find the maximum value of the variable\nmaxValue = 0;\nfor i = 2:length(bikes)\n    for j = 1:length(speedNames)\n        oneSpeed = data.(bikes{i}).(speedNames{j});\n        history = oneSpeed.([io 's'])(:, index);\n        if max(history) > maxValue\n            maxValue = max(history);\n        end\n    end\nend\n\nm = round(maxValue * 100) / 100;\npad = 0.15 * m;\nyShift = [0, 2 * (m + pad), 4 * (m + pad)];\n\n% shifts the paths by this many meters along the x axis\nxShift = [0, 15, 35];\nhold all\nfor j = 1:length(speedNames)\n    for i = 2:length(bikes)\n        oneSpeed = data.(bikes{i}).(speedNames{j});\n        time = oneSpeed.time;\n        speed = oneSpeed.speed;\n        distance = time * speed + xShift(j);\n        % time history of the value\n        history = oneSpeed.([io 's'])(:, index) + yShift(j);\n        if strcmp(xAxis, 'Distance')\n            xData = distance;\n            textX = 165;\n        elseif strcmp(xAxis, 'Time')\n            xData = time;\n            textX = 2;\n        else\n            error('Choose Time or Distance, no other')\n        end\n        plot(xData, history, ...\n             'Linestyle', linestyles{i - 1}, ...\n             'Color', colors{i - 1}, ...\n             'Linewidth', 0.75)\n    end\n    % add labels for the speeds\n    text(textX, yShift(j) + 4 * pad, [num2str(speed) ' m/s'])\nend\n\nylim([-m - pad, yShift(3) + m + pad])\nset(gca, 'YTick', ...\n    [-m, yShift(1), m, ...\n     yShift(2) - m, yShift(2), yShift(2) + m, ...\n     yShift(3) - m, yShift(3), yShift(3) + m])\nticks = {num2str(-m), '0', num2str(m)};\nset(gca, 'YTickLabel', [ticks, ticks ticks])\n\nif strcmp(xAxis, 'Distance')\n    xlabel('Distance (m)')\n    xLimits = [35, 190];\n    xlim(xLimits)\n    loc = 'Northwest';\nelse\n    xlabel('Time (s)')\n    xLimits = [0, 50];\n    xlim(xLimits)\n    loc = 'Northeast';\nend\nl1 = line(xLimits, [yShift(1) + m + pad, yShift(1) + m + pad]);\nl2 = line(xLimits, [yShift(2) + m + pad, yShift(2) + m + pad]);\nset([l1, l2], 'Color', 'k')\nhold off\nset(gca, 'Fontsize', 8)\nfirst = [prettyNames{index} ' ' units{index}];\nylabel(first, 'Interpreter', 'Latex')\nbox on\nlegend({'1', '2', '3', '4', '5', '6'}, 'Fontsize', 8, 'Location', loc)\n\n% if it is the steer angle plot for distance, add a magnifier for the\n% countersteer\nif strcmp(variable, 'delta') && strcmp(xAxis, 'Distance')\n    % Specify the position and the size of the rectangle\n    x_r = 37; y_r = 0; w_r = 4; h_r = 0.01;\n    rectangle('Position', [x_r-w_r/2, y_r-h_r/2, w_r, h_r], ...\n              'EdgeColor', 'k');\n    % Specify the position and the size of the 2. axis\n    x_a = 0.2; y_a = 0.29; w_a = 0.15; h_a = w_a * h_r / w_r * 20 / 0.05;\n    ax = axes('Units', 'Normalized', ...\n              'Position', [x_a, y_a, w_a, h_a], ...\n              'XTick', [], ...\n              'YTick', [], ...\n              'Box', 'on', ...\n              'LineWidth', 0.5, ...\n              'Color', 'w');\n    hold on\n    j = 1;\n    for i = 2:length(bikes)\n        oneSpeed = data.(bikes{i}).(speedNames{j});\n        time = oneSpeed.time;\n        speed = oneSpeed.speed;\n        distance = time * speed + xShift(j);\n        % time history of the value\n        history = oneSpeed.([io 's'])(:, index) + yShift(j);\n        plot(distance, history, ...\n             'Linestyle', linestyles{i - 1}, ...\n             'Color', colors{i - 1}, ...\n             'Linewidth', 0.75)\n    end\n    hold off\n    axis([x_r-w_r/2, x_r+w_r/2, y_r-h_r/2, y_r+h_r/2]);\n    text(35.3, -0.003, 'Countersteer', 'Fontsize', 8)\n    % bottom left\n    annotation('line', [x_a, 0.129], [y_a, 0.235])\n    % top left\n    annotation('line', [x_a, 0.132], [y_a + h_a, 0.26])\n    % bottom right\n    annotation('line', [x_a + w_a, 0.15], [y_a, 0.235])\n    % top right\n    annotation('line', [x_a, 0.15], [y_a + 0.02, 0.26])\nend\n\n% save the file\nfilename = [variable xAxis '.eps'];\nprint(['plots' filesep filename], '-deps2c', '-loose')\nfix_ps_linestyle(['plots' filesep filename])\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction plot_io_roll(rollData, xAxis)\n\nglobal goldenRatio\n\n% closed loop bode plots\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nspeed = rollData.speed;\ntime = rollData.time;\npath = rollData.path;\nfrontWheel = rollData.outputs(:, 18);\nrollAngle = rollData.outputs(:, 4);\nsteerAngle = rollData.outputs(:, 7);\nrollTorque = rollData.inputs(:, 1);\n\n% plot the path\nsubplot(2, 1, 1)\nhold all\nif strcmp(xAxis, 'Distance')\n    plot(speed * time, -path, 'k-', 'Linewidth', 1.0)\n    plot(speed * time, -frontWheel, 'k:', 'Linewidth', 1.0)\n    xlabel('Distance (m)')\n    xlim([30, 150])\nelseif strcmp(xAxis, 'Time')\n    plot(time, -path, 'k-', 'Linewidth', 1.0)\n    plot(time, -frontWheel, 'k:', 'Linewidth', 1.0)\n    xlabel('Time (s)')\n    xlim([30 / speed, 150 / speed])\nelse\n    error('Bad xAxis, choose Distance or Time')\nend\nhold off\nbox on\nylabel('Lateral Deviation (m)')\nylim([-2.2, 0.2])\nset(gca, 'YTickLabel', {'2', '1', '0'})\nlegend({'Path'}, ...\n       'Interpreter', 'Latex', ...\n       'Fontsize', 8, ...\n       'Location', 'Southeast')\n\nsubplot(2, 1, 2)\nhold all\nif strcmp(xAxis, 'Distance')\n    plot(speed * time, rollAngle, 'k-', 'Linewidth', 1.0)\n    [ax, h1, h2] = plotyy(speed * time, steerAngle, speed * time, rollTorque);\n    xlabel('Distance (m)')\n    xlim(ax(1), [30, 150])\n    xlim(ax(2), [30, 150])\nelseif strcmp(xAxis, 'Time')\n    plot(time, rollAngle, 'k-', 'Linewidth', 1.0)\n    [ax, h1, h2] = plotyy(time, steerAngle, time, rollTorque);\n    xlabel('Time (s)')\n    xlim(ax(1), [30 / speed, 150 / speed])\n    xlim(ax(2), [30 / speed, 150 / speed])\nelse\n    error('Bad xAxis, choose Distance or Time')\nend\nhold off\nbox on\n\nset(get(ax(1), 'Ylabel'), ...\n    'String', 'Angle (rad)', ...\n    'Color', 'k')\nset(get(ax(2), 'Ylabel'), ...\n    'String', 'Torque (N-m)', ...\n    'Color', 'k')\nset(ax, 'YColor', 'k', 'Fontsize', 8)\nset(h1, 'Linestyle', '--', 'Color', 'k', 'Linewidth', 1.0)\nset(h2, 'Linestyle', '-.', 'Color', 'k', 'Linewidth', 1.0)\nlegend({'$\\phi$', '$\\delta$', '$T_\\phi$'}, ...\n       'Interpreter', 'Latex', ...\n       'Fontsize', 8, ...\n       'Location', 'Northeast')\n\nif strcmp(xAxis, 'Distance')\n    axes(ax(2))\n    % magnifier rectangle\n    x_r = 38; y_r = 0; w_r = 10; h_r = 0.3;\n    rectangle('Position', [x_r-w_r/2, y_r-h_r/2, w_r, h_r], ...\n              'EdgeColor', 'k');\n    % magnify it\n    x_a = 0.14; y_a = 0.432; w_a = 0.28; h_a = 0.12;\n    inset = axes('Units', 'Normalized', ...\n                 'Position', [x_a, y_a, w_a, h_a], ...\n                 'Box', 'on', ...\n                 'LineWidth', 0.5, ...\n                 'Color', [0.8, 0.8, 0.8]);\n    hold on\n    plot(inset, time, rollAngle, 'k-', 'Linewidth', 1.0)\n    [ax, h1, h2] = plotyy(inset, time, steerAngle, time, rollTorque);\n    set(ax, 'XTick', [], ...\n            'YTick', [], ...\n            'YColor', 'k')\n    set(h1, 'Linestyle', '--', 'Color', 'k', 'Linewidth', 1.0)\n    set(h2, 'Linestyle', '-.', 'Color', 'k', 'Linewidth', 1.0)\n    axis(ax(1), [7, 8.5, -0.0025, 0.0025])\n    axis(ax(2), [7, 8.5, -0.0025 / 0.02, 0.0025 / 0.02])\n\n    % draw some lines connecting the corners\n    annotation('line', [x_a, 0.149], [y_a, 0.287])\n    annotation('line', [x_a + w_a, 0.213], [y_a, 0.287])\n    annotation('textbox', [0.26, 0.47, 0.1, 0.02], ...\n               'String', 'Countersteer', ...\n               'Fontsize', 8, ...\n               'Edgecolor', 'none')\nend\n\nfilename = ['roll' xAxis '.eps'];\nprint(gcf, ['plots' filesep filename], '-deps2c', '-loose')\nfix_ps_linestyle(['plots' filesep filename])\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction phase_portraits(bikeData)\n% Creates four phase portrait plots to demonstrate the effects on the phase\n% portraits when adjusting the gains.\n\nglobal goldenRatio\n\nfigure()\nfigWidth = 6.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'OuterPosition', [424, 305 - 50, 518, 465], ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\n% this is the gain multiplier for the non-nominal plot\ngainChanges = [1.2, 1, 1, 1, 1;\n               1, 1.2, 1, 1, 1;\n               1, 1, 1.2, 1, 1;\n               1, 1, 1.2, 0.8, 0.8];\n\nloopNames = {'kDelta', 'kPhiDot', 'kPhi', 'kPhi'};\n% the x and y indices for each plot\nxy = [7, 15;\n      4, 12;\n      4, 12;\n      4, 12];\n% where to get the x and y data from\nxySource = {'outputs', 'outputsDot', 'outputs', 'outputs'};\n\n% axis labels\nxlabels = {'(a) $\\delta$ (rad)',\n           '(b) $\\dot{\\phi}$ (rad/s)',\n           '(c) $\\phi$ (rad)',\n           '(d) $\\phi$ (rad)'};\nylabels = {'$\\dot{\\delta}$ (rad/s)',\n           '$\\ddot{\\phi}$ (rad/s$^2$)',\n           '$\\dot{\\phi}$ (rad/s)',\n           '$\\dot{\\phi}$ (rad/s)'};\n\n% legend starts\nlegends = {'$k_\\delta$ = ',\n           '$k_{\\dot{\\phi}}$ = ',\n           '$k_\\phi$ = ',\n           '$k_\\phi$ = '};\n% how many decimals to show for each legend\nfloatSpec = {'%1.1f', '%1.3f', '%1.1f', '%1.1f'};\n\nfor i = 1:length(loopNames)\n\n    display(sprintf('Calculating phase portrait %d', i))\n\n    % adjust the gains and get the data\n    twentyPercent = generate_data('Benchmark', 5.0, ...\n                                  'gainMuls', gainChanges(i, :));\n    subplot(2, 2, i)\n    hold on\n\n    if i == 4\n        display('Phase portrait 4 comparison data.')\n        nominalData = generate_data('Benchmark', 5.0, ...\n                                  'gainMuls', [1, 1, 1, 0.8, 0.8]);\n        x = nominalData.(xySource{i})(:, xy(i, 1));\n        y = nominalData.(xySource{i})(:, xy(i, 2));\n    else\n        x = bikeData.(xySource{i})(:, xy(i, 1));\n        y = bikeData.(xySource{i})(:, xy(i, 2));\n    end\n    plot(x, y, 'k-', 'Linewidth', 1.0)\n\n    x = twentyPercent.(xySource{i})(:, xy(i, 1));\n    y = twentyPercent.(xySource{i})(:, xy(i, 2));\n    plot(x, y, 'k--', 'Linewidth', 1.0)\n\n    hold off\n\n    box on\n    axis equal\n    xlabel(xlabels{i}, 'Interpreter', 'Latex', 'Fontsize', 8)\n    ylabel(ylabels{i}, 'Interpreter', 'Latex', 'Fontsize', 8)\n\n    % make the legend\n    leg1 = sprintf(floatSpec{i}, bikeData.modelPar.(loopNames{i}));\n    leg2 = sprintf(floatSpec{i}, twentyPercent.modelPar.(loopNames{i}));\n    legend({[legends{i} leg1], [legends{i} leg2]} , ...\n           'Interpreter', 'Latex', ...\n           'Fontsize', 6)\nend\n\nplotAxes = findobj(gcf, 'Type', 'Axes');\nset(plotAxes, 'Fontsize', 8)\n\n% save the plot\nfilename = 'phasePortraits.eps';\nprint(gcf, ['plots' filesep filename], '-deps2c', '-loose')\nfix_ps_linestyle(['plots' filesep filename])\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction eigenvalues(data, linestyles, colors)\n\nglobal goldenRatio\n\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nbikes = fieldnames(data);\nbikes(1) = [];\nspeeds = 0:0.1:10;\neVals = zeros(length(bikes), length(speeds), 11);\nfor i = 1:length(bikes)\n    % load the bicycle parameters\n    pathToParFile = ['parameters' filesep bikes{i} 'Par.txt'];\n    par = par_text_to_struct(pathToParFile);\n    str = 'Calculating eigenvalues for the %s bicycle and rider.';\n    display(sprintf(str, bikes{i}))\n    for j = 1:length(speeds)\n        % calculate the A, B, C, and D matrices of the bicycle model\n        [A, B, C, D] = whipple_pull_force_abcd(par, speeds(j));\n        eigenValues = eig(A);\n        eVals(i, j, :) = real(eig(A));\n    end\nend\n\n% reduce to the maximum values\nzeroIndices = find(abs(eVals) <= 0.000001);\neVals(zeroIndices) = -100 * ones(size(zeroIndices));\nmaxEvals = max(eVals, [], 3);\n\nlines = plot(speeds, maxEvals);\n\nfor i = 1:length(lines)\n    set(lines(i), ...\n        'Linestyle', linestyles{i}, ...\n        'Color', colors{i}, ...\n        'Linewidth', 1)\nend\n\nlegend({'1', '2', '3', '4', '5', '6'})\nxlabel('Speed (m/s)')\nylabel('Maximum real part of the eigenvalue (1/s)')\n\n% set the tick marks differently\n%set(gca, 'XTick', 0:0.5:10)\n%set(gca, 'XTickLabel', {'0', '', '1', '', ...\n                        %'2', '2.5', '3', '', ...\n                        %'4', '', '5.0', '', ...\n                        %'6', '', '7', '7.5', ...\n                        %'8', '', '9', '', '10'})\n%\n% add some lines and labels for the speeds we looked at\nhold on\nmaxLine = max(maxEvals, [], 1);\nminLine = min(maxEvals, [], 1);\nlines = zeros(4, 1);\nspeedInd = find(speeds == 2.5);\nlines(1) = line([2.5, 2.5], ...\n                [minLine(speedInd) - 0.4, maxLine(speedInd) + 0.4]);\ntext(2, maxLine(speedInd) + 0.7, '2.5 m/s')\nspeedInd = find(speeds == 5.0);\nlines(2) = line([5.0, 5.0], ...\n                [minLine(speedInd) - 0.4, maxLine(speedInd) + 0.4]);\ntext(4.5, maxLine(speedInd) + 0.7, '5.0 m/s')\nspeedInd = find(speeds == 7.5);\nlines(3) = line([7.5, 7.5], ...\n                [minLine(speedInd) - 0.4, maxLine(speedInd) + 0.4]);\ntext(7, maxLine(speedInd) + 0.7, '7.5 m/s')\n\nlines(4) = line([0, 10], [0, 0]);\nhold off\n\nset(lines, 'Color', 'k', 'Linewidth', 2)\n\n% save the plot\nfilename = 'eigenvalues.eps';\nprint(gcf, ['plots' filesep filename], '-deps2c', '-loose')\nfix_ps_linestyle(['plots' filesep filename])\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/cross_validation.m",
    "content": "function [ error ] = cross_validation(x,y,hyper_parameter)\n    \n    num_data = size(x,1);\n\n    K = 10;\n    indices = crossvalind('Kfold', num_data, K);\n\n    errors = zeros(K,1);\n    for i = 1:K\n        % get indices\n        test_idx = (indices == i);\n        train_idx = ~test_idx;\n\n        % get training data\n        x_train = x(train_idx,:);\n        y_train = y(train_idx,:);\n\n        % train\n        w = train(x_train, y_train, hyper_parameter);\n\n        % get test data\n        x_test = x(test_idx,:);\n        y_test = y(test_idx,:);\n        \n        % calculate error\n        errors(i) = calc_cost(x_test, y_test, w, hyper_parameter); %calc_error\n        %errors(i) = calc_error(x_test, y_test, w);\n    end\n    \n    error = mean(errors);\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/distance.m",
    "content": "function [ value,isterminal,direction ] = distance( t,y,mu )\n% DISTANCE compute the distance from the attactors\n%   [ value,terminal,direction ] = distance( t,y )\n\nd=1e-2; % FIXME\n\n% TODO mettere if se tolleranza D-d<tol -> value=0\nD=sqrt((y(1)+mu).^2+y(2).^2); % distance from the largest primary\n\nvalue=d-D;\nisterminal=1;\ndirection=0;\nend"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/double_gyre.m",
    "content": "clear all\ntic\n% initialize integration time T, f(x,t), discretization size n ----------------\nT = 8;\nx_min=0;\nx_max=2;\ny_min=0;\ny_max=1;\nn=50; % how many points per one measure unit (both in x and in y)\nds=1/(n-1);\nx_res=(x_max-x_min)*n;\ny_res=(y_max-y_min)*n;\ngrid_x=linspace(x_min,x_max,x_res);\ngrid_y=linspace(y_min,y_max,y_res);\n\nadvected_x=zeros(x_res,y_res);\nadvected_y=zeros(x_res,y_res);\n% integrate all initial points for t in [0,T] --------------------------------\nparfor i = 1:x_res\n\tfor j = 1:y_res\n\t\t[t,X] = ode45(@dg,[0,T],[grid_x(i),grid_y(j)]);\n\t\t% store advected positions as they would appear in (x,y) coords ------\n\t\tadvected_x(i,j) = X(length(X(:,1)),1);\n\t\tadvected_y(i,j) = X(length(X(:,2)),2);\n\tend\nend\n%% Compute FTLE\nsigma=zeros(x_res,y_res);\n% at each point in interior of grid, store FTLE ------------------------------\nfor i = 2:x_res-1\n\tfor j = 2:y_res-1\n\t\t% compute Jacobian phi -----------------------------------------------\n\t\tphi(1,1) = (advected_x(i+1,j)-advected_x(i-1,j))/(2*ds);\n\t\tphi(1,2) = (advected_x(i,j-1)-advected_x(i,j+1))/(2*ds);\n\t\tphi(2,1) = (advected_y(i+1,j)-advected_y(i-1,j))/(2*ds);\n\t\tphi(2,2) = (advected_y(i,j-1)-advected_y(i,j+1))/(2*ds);\n\t\t% find max eigenvalue of phi'*phi ------------------------------------\n\t\tlambda_max = max(abs(eig(phi'*phi)));\n\t\t% store FTLE ---------------------------------------------------------\n\t\tsigma(i,j) = log(lambda_max)/abs(2*T);\n\tend\nend\ntoc\n%% plot FTLE field ------------------------------------------------------------\nfigure\ncontourf(grid_x,grid_y,sigma');\ncolorbar('location','EastOutside');\naxis equal\nshading flat\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/example.m",
    "content": "clear all\ntic\n% initialize integration time T, f(x,t), discretization size n ----------------\nT = 20;\nf_x_t = inline('[v(2);-sin(v(1))]','t','v');\ngrid_min = -3.4;\ngrid_max = 3.4;\ngrid_width = grid_max-grid_min;\nn = 35;\ngrid_spacing = grid_min:(grid_width/(n-1)):grid_max;\nadvected_x=zeros(n,n);\nadvected_y=zeros(n,n);\n% integrate all initial points for t in [0,T] --------------------------------\nfor i = 1:n\n\tfor j = 1:n\n\t\t[t,x] = ode45(f_x_t,[0,T],[grid_spacing(i),grid_spacing(j)]);\n\t\t% store advected positions as they would appear in (x,y) coords ------\n\t\tadvected_x(n-j+1,i) = x(length(x(:,1)),1);\n\t\tadvected_y(n-j+1,i) = x(length(x(:,2)),2);\n\tend\nend\nsigma=zeros(n,n);\n% at each point in interior of grid, store FTLE ------------------------------\nfor i = 2:n-1\n\tfor j = 2:n-1\n\t\t% compute Jacobian phi -----------------------------------------------\n\t\tphi(1,1) = (advected_x(i,j+1)-advected_x(i,j-1))/(2*grid_width/(n-1));\n\t\tphi(1,2) = (advected_x(i-1,j)-advected_x(i+1,j))/(2*grid_width/(n-1));\n\t\tphi(2,1) = (advected_y(i,j+1)-advected_y(i,j-1))/(2*grid_width/(n-1));\n\t\tphi(2,2) = (advected_y(i-1,j)-advected_y(i+1,j))/(2*grid_width/(n-1));\n\t\t% find max eigenvalue of phi'*phi ------------------------------------\n\t\tlambda_max = max(abs(eig(phi'*phi)));\n\t\t% store FTLE ---------------------------------------------------------\n\t\tsigma(i,j) = log(lambda_max)/abs(T);\n\tend\nend\ntoc\n%% plot FTLE field ------------------------------------------------------------\nfigure\ncontourf(grid_spacing,grid_spacing,sigma);\ncolorbar('location','EastOutside');"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/fit_adapt.m",
    "content": "data = load_data('jason_adapt.mat');\n\nt0 = 0;\nt1 = 30;\nt2 = 60;\nt3 = 90;\n\ndataPlantOne = data(1:t1 / data.Ts);\ndataAdapting = data(t1 / data.Ts:t2 / data.Ts);\ndataPlantTwo = data(t2 / data.Ts:end);\n\n% k1, k2, k3, k4, tau, zetanm, wnm, zetafs, wfs\n\n% ron's guess\nguessPlantOne = [4.85, 1.79, 20, 20, 0.2, 0.707, 10, 0.707, 65];\n% best solution from ron's guess\n%guessPlantOne = [4.1129, 2.1327, 52.3747, 48.6997, 0.2, 0.707, 10, 0.707, 65];\nresultPlantOne = find_structural_gains(dataPlantOne, guessPlantOne, 1);\n[yh, fit, x0] = compare(dataPlantOne, resultPlantOne.fit);\ndisplay(sprintf('The self validation VAF is %f.', fit(1, 1, 1)))\n\n% ron's guess\nguessPlantTwo = [3.36, 9.49, 20, 0, 0.2, 0.707, 10, 0.707, 65];\n% best solution from ron's guess\n%guessPlantTwo = [2.6686, 7.0431, 14.4623, 3.1532, 0.2, 0.707, 10, 0.707, 65];\nresultPlantTwo = find_structural_gains(dataPlantTwo, guessPlantTwo, 5);\n[yh, fit, x0] = compare(dataPlantTwo, resultPlantTwo.fit);\ndisplay(sprintf('The self validation VAF is %f.', fit(1, 1, 1)))\n\n% compute the slope and offset for each gain for initial guesses\nkP1 = resultPlantOne.fit.par(1:4);\nkP2 = resultPlantTwo.fit.par(1:4);\ngainSlopeOffset = [t1 * eye(4), eye(4); t2 * eye(4), eye(4)] \\ [kP1; kP2];\n\naux.pars = guessPlantOne; % this only uses tau through wfs\naux.timeDelay = true;\naux.plantFirst = 1; % 1 / s\naux.plantSecond = 5; % 5 / (s + 10)\n% compute the slope and offset of the plant for t1 < t < t2\nplantOneSlopeOffset = [t1, 1; t2, 1] \\ [1; 0];\nplantTwoSlopeOffset = [t1, 1; t2, 1] \\ [0; 1];\naux.m = [plantOneSlopeOffset(1); plantTwoSlopeOffset(1)];\naux.b = [plantOneSlopeOffset(2); plantTwoSlopeOffset(2)];\n\n%[dx, y] = adapting_structural_model(45, ones(8, 1), 10, gainSlopeOffset, {aux});\n\n% NOTE: 'FileArgument' has to be a cell array, the is why aux is in\n% brackets. Also, if you pass the parameters in as a vector here, as I have,\n% they get mapped to a structure and your ode file/function must accept each\n% parameter as individual arguments.\nmod = idnlgrey('adapting_structural_model', [1, 1, 8], gainSlopeOffset, ...\n    zeros(8, 1), 0, 'FileArgument', {aux}, 'InputName', 'thetac', ...\n    'OutputName', 'theta');\n\nfit = pem(dataAdapting, mod);\n\ncompare(dataAdapting, fit);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/fit_adapt_linear.m",
    "content": "% This file identifies a series of models for a time varying plant.\n\n% k1, k2, k3, k4, tau, zetanm, wnm, zetafs, wfs\n\n%data = load_data('jason_adapt.mat');\n%filename = 'adapt';\n%guess.plantOne = [4.85, 1.79, 20, 20, 0.2, 0.707, 10, 0.707, 65];\n%guess.plantTwo = [3.36, 9.49, 20, 0, 0.2, 0.707, 10, 0.707, 65];\n%plantNum.plantOne = 1;\n%plantNum.plantTwo = 5;\n\ndata = load_data('adapt_hard.mat');\nfilename = 'hard-adapt';\nguess.plantOne = [1.23, 0.354, 0.2, 20.0, 0.2, 0.707, 10, 0.707, 65];\nguess.plantTwo = [4.85, 1.79, 20, 20, 0.2, 0.707, 10, 0.707, 65];\nplantNum.plantOne = 6;\nplantNum.plantTwo = 1;\n\nt = [0, 30, 40, 50, 60, 90];\n\nsections = {'plantOne', 'adaptOne', 'adaptTwo', 'adaptThree', 'plantTwo'};\nfor i = 1:length(sections)\n    secData.(sections{i}) = data(t(i) / data.Ts + 1:t(i + 1) / data.Ts);\nend\n\n% compute the slope and offset for each gain for initial guesses\nkP1 = guess.plantOne(1:4)';\nkP2 = guess.plantTwo(1:4)';\ngainSlopeOffset = [t(2) * eye(4), eye(4); t(5) * eye(4), eye(4)] \\ [kP1; kP2];\nm = gainSlopeOffset(1:4);\nb = gainSlopeOffset(5:8);\n\nfor i = 1:length(sections)\n\n    if strcmp(sections{i}, sections{1}) || strcmp(sections{i}, sections{end})\n        display('boo')\n    else\n        if i > 1\n            % use the best fit gains from the previous section\n            guess.(sections{i}) = result.(sections{i - 1}).fit.par;\n        else\n            currentGuess = m .* (t(i) + t(i + 1)) / 2 + b;\n            guess.(sections{i}) = [currentGuess', guess.plantOne(5:end)];\n        end\n        percent = ((t(i) + t(i + 1)) / 2 - t(2)) / (t(5) - t(2));\n        plantNum.(sections{i}) = {plantNum.plantOne, plantNum.plantTwo, percent};\n    end\n\n    result.(sections{i}) = find_structural_gains(secData.(sections{i}), ...\n        guess.(sections{i}), plantNum.(sections{i}), 'warning', false, ...\n        'randomGuess', true);\n\n    [yh, vaf, x0] = compare(secData.(sections{i}), result.(sections{i}).fit);\n    result.(sections{i}).vaf = vaf(1, 1, 1);\n    display(sprintf('The self validation VAF is %f.', vaf(1, 1, 1)))\n\n    p = plantNum.(sections{i});\n    if size(plantNum.(sections{i}), 2) > 1\n        result.(sections{i}).plant = plant(p{:});\n    else\n        result.(sections{i}).plant = plant(p);\n    end\nend\n\nsave(['data/' filename '-results.mat'], 'sections', 'guess', 'plantNum', 'result')\n\nfor i = 1:length(sections)\n    result.(sections{i}).fig = figure;\n    compare(secData.(sections{i}), result.(sections{i}).fit);\n    saveas(result.(sections{i}).fig, ['plots/' filename '-' sections{i} '.png'])\n    [yh, fit, x0] = compare(secData.(sections{i}), result.(sections{i}).fit);\n    display('-----------------')\n    display('The task plant is:')\n    display(result.(sections{i}).plant)\n    display(sprintf('The order of the closed loop system is %u.', ...\n        size(result.(sections{i}).mod.A, 1)))\n    display(sprintf('The gain guesses: k1=%f, k2=%f, k3=%f, k4=%f', ...\n        result.(sections{i}).mod.par(1:4)))\n    display(sprintf('The identified gains: k1=%f+\\\\-%f, k2=%f+\\\\-%f, k3=%f+\\\\-%f, k4=%f+\\\\-%f', ...\n        result.(sections{i}).fit.par(1), result.(sections{i}).uncert(1), ...\n        result.(sections{i}).fit.par(2), result.(sections{i}).uncert(2), ...\n        result.(sections{i}).fit.par(3), result.(sections{i}).uncert(3), ...\n        result.(sections{i}).fit.par(4), result.(sections{i}).uncert(4)))\n    display(sprintf('The self validation VAF is %f.', ...\n        result.(sections{i}).vaf))\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/gpu_RKF45_FILE.m",
    "content": "tic\r\nclear\r\n%% Range definition\r\nn=200;\r\n\r\nmu=0.1;\r\n[xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5]=Lagr(mu);\r\nC_L1=2*Omega(xl1,yl1,mu);\r\nE_0=-C_L1/2+0.03715;\r\nY_0=0;\r\n\r\nnx=n;\r\nx_0_min=-0.8;\r\nx_0_max=-0.15;\r\nx_0=linspace(x_0_min, x_0_max, nx);\r\ndx=(x_0_max-x_0_min)/(nx-1);\r\n\r\nnvx=n;\r\nvx_0_min=-2;\r\nvx_0_max=2;\r\nvx_0=linspace(vx_0_min, vx_0_max, nvx);\r\ndvx=(vx_0_max-vx_0_min)/(nvx-1);\r\n\r\nny=3;\r\ndy=(dx+dvx)/2;\r\ny_0=[Y_0-dy Y_0 Y_0+dy];\r\n\r\n\r\n\r\nne=3;\r\nde=dy;\r\ne_0=[E_0-de E_0 E_0+de];\r\n\r\n%% Definition of arrays of initial conditions\r\n\r\n%In this approach, only useful pints are stored and integrated\r\n\r\nm=1;\r\n% x=zeros(1,nx*ny*nvx*ne);\r\n% y=zeros(1,nx*ny*nvx*ne);\r\n% vx=zeros(1,nx*ny*nvx*ne);\r\n% e=zeros(1,nx*ny*nvx*ne);\r\n% vy=zeros(1,nx*ny*nvx*ne);\r\nfilter=zeros(nx,3,nvx,3);\r\n\r\nfor i=1:nx\r\n\tfor j=1:ny\r\n\t\tfor k=1:nvx\r\n\t\t\tfor l=1:ne\r\n\t\t\t\tv_y=-sqrt(2*Omega(x_0(i),y_0(j),mu)+2*e_0(l)-vx_0(k)^2);\r\n\t\t\t\tif ~((j~=2) && (l~=2)) && isreal(v_y)\r\n\t\t\t\t\tx(m)=x_0(i);\r\n\t\t\t\t\ty(m)=y_0(j);\r\n\t\t\t\t\tvx(m)=vx_0(k);\r\n\t\t\t\t\te(m)=e_0(l);\r\n\t\t\t\t\tvy(m)=v_y;\r\n\t\t\t\t\tfilter(i,j,k,l)=1;\r\n\t\t\t\t\tm=m+1;\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\n\r\n%% Selection of useful points\r\n\r\n%% Data transfer to GPU\r\nx_gpu=gpuArray(x);\r\ny_gpu=gpuArray(y);\r\nvx_gpu=gpuArray(vx);\r\nvy_gpu=gpuArray(vy);\r\n\r\n%% Integration on GPU\r\nN=1;\r\nt0=0;\r\n\r\n[x_f,y_f,vx_f,vy_f]=arrayfun(@RKF45_FILE_gpu,t0,N,x_gpu,y_gpu,vx_gpu,vy_gpu,mu);\r\n\r\n%% Data back to CPU and GPU memory cleaning\r\nclear x_gpu y_gpu vx_gpu vy_gpu\r\nx_T=gather(x_f);\r\nclear x_f\r\ny_T=gather(y_f);\r\nclear y_f\r\nvx_T=gather(vx_f);\r\nclear vx_f\r\nvy_T=gather(vy_f);\r\nclear vy_f\r\n\r\n%% Construction of matrix for FTLE computation\r\n\r\nX_T=zeros(nx,ny,nvx,ne);\r\nY_T=zeros(nx,ny,nvx,ne);\r\nVX_T=zeros(nx,ny,nvx,ne);\r\nVY_T=zeros(nx,ny,nvx,ne);\r\nE_T=zeros(nx,ny,nvx,ne);\r\nm=1;\r\nfor i=1:nx\r\n    for j=1:ny\r\n        for k=1:nvx\r\n            for l=1:ne\r\n                if filter(i,j,k,l)==1\r\n                    X_T(i,j,k,l)=x_T(m);\r\n                    Y_T(i,j,k,l)=y_T(m);\r\n                    VX_T(i,j,k,l)=vx_T(m);\r\n                    VY_T(i,j,k,l)=vy_T(m);\r\n                    E_T(i,j,k,l)=0.5*(VX_T(i,j,k,l)^2+VY_T(i,j,k,l)^2)-Omega(X_T(i,j,k,l),Y_T(i,j,k,l),mu);\r\n                    m=m+1;\r\n                end\r\n            end\r\n        end\r\n    end\r\nend\r\n\r\n%% Compute filter for FTLE\r\nfilter_ftle=filter;\r\nfor i=2:(nx-1)\r\n\tfor j=2:(ny-1)\r\n\t\tfor k=2:(nvx-1)\r\n\t\t\tfor l=2:(ne-1)\r\n\t\t\t\tif filter(i,j,k,l)==0 || filter (i,j,k,l)==3\r\n\t\t\t\t\tfilter_ftle(i,j,k,l)=0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfilter_ftle(i+1,j,k,l)=0;\r\n\t\t\t\t\tfilter_ftle(i-1,j,k,l)=0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfilter_ftle(i,j+1,k,l)=0;\r\n\t\t\t\t\tfilter_ftle(i,j-1,k,l)=0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfilter_ftle(i,j,k+1,l)=0;\r\n\t\t\t\t\tfilter_ftle(i,j,k-1,l)=0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfilter_ftle(i,j,k,l+1)=0;\r\n\t\t\t\t\tfilter_ftle(i,j,k,l-1)=0;\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\t\t\r\n\t\tend\r\n\tend\r\nend\r\n%% FTLE computation\r\n\r\n[ftle, dphi]=Compute_FILE_gpu( X_T, Y_T, VX_T, E_T, dx, dy, dvx, de, N, filter_ftle);\r\n\r\n%% Plot results\r\nfigure\r\nFTLE=squeeze(ftle(:,2,:,2));\r\nFTLE(1,:)=[];\r\n% FTLE(2,:)=[];\r\nFTLE(:,1)=[];\r\n% FTLE(:,2)=[];\r\nx_0(1)=[];\r\nvx_0(1)=[];\r\npcolor(x_0, vx_0, FTLE')\r\nshading flat\r\ntoc"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/ieee.m",
    "content": "% This script loads in the data used for the IEEE paper and creates the plots.\nclc; close all;\n\nbikes = {'Benchmark', 'Browserins', 'Browser', 'Pista', ...\n         'Fisher', 'Yellow', 'Yellowrev'};\n\ndata = load_bikes(bikes, 'Steer');\n\nrollData = generate_data('Benchmark', 5.0, ...\n                         'input', 'Roll', ...\n                         'gains', [1, 55, 3.76, 0.413, 0.076]);\n\ncreate_ieee_paper_plots(data, rollData)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/lane_change.m",
    "content": "function [x, y, t] = lane_change(start, width, slope, pathLength, speed, num, ...\n                                 type, varargin)\n% Generates the time and coordinates for either a single or double lane change\n% manuever at a particular speed.\n%\n% Parameters\n% ----------\n% start : float\n%   The starting point along the x axis in meters.\n% width : float\n%   The width of the lane deviation.\n% slope : float\n%   The slope of the lane change.\n% pathLength : float\n%   The length of path.\n% speed : float\n%   Speed of travel.\n% num : integer\n%   Number of time steps.\n% type : string\n%   Either 'single' or 'double'. A double lane change return to x = 0.\n% laneLength : float, optional\n%   Length of the lane for a double lane change.\n%\n% Returns\n% -------\n% x : matrix, (num, 1)\n%   The longitudinal path.\n% y : matrix, (num, 1)\n%   The lateral path.\n% t : matrix, (num, 1)\n%   Time.\n\nx = 0:pathLength / num:pathLength;\nx = x';\nt = x / speed;\n\ny = zeros(length(x), 1);\nendOfSlope = width / slope + start;\nslopeInd = find((x > start) & (x <= endOfSlope));\ny(slopeInd) = slope * (x(slopeInd) - start);\nif strcmp(type, 'single')\n    theRest = slopeInd(end) + 1:length(y);\n    y(theRest) = width * ones(length(theRest), 1);\nelseif strcmp(type, 'double');\n    if length(varargin) < 1\n        error('Double lane change needs length of lane.')\n    else\n        laneLength = varargin{1};\n        startOfSlope = start + laneLength - width / slope;\n        lane = find((x > endOfSlope) & (x <= startOfSlope));\n        y(lane) = width * ones(length(lane), 1);\n        downSlope = find((x > startOfSlope) & (x <= start + laneLength));\n        y(downSlope) = slope * (start + laneLength - x(downSlope));\n    end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/load_bikes.m",
    "content": "function data = load_bikes(bikes, input)\n% function data = load_bikes(bikes, input)\n% Returns the data for a set of bicycles at three speeds.\n%\n% Parameters\n% ----------\n% bikes : cell array\n%   A cell array that lists the bicyle short names.\n% input : string\n%   'Steer' or 'Roll'\n%\n% Returns\n% -------\n% data : structure\n%   A structure containg a node for each bicycle and each speed.\n\nspeeds = [2.5, 5.0, 7.5];\nspeedNames = {'Slow', 'Medium', 'Fast'};\n\n% these are the gains that were selected manually by Ron Hess, taken from\n% the paper\ngains.Benchmark.Slow   = [22.0, -0.090, 23.3, 0.058, 0.195]; % place holder\ngains.Browserins.Slow  = [22.0, -0.090, 23.3, 0.058, 0.195];\ngains.Browser.Slow     = [20.5, -0.086, 24.1, 0.053, 0.199];\n% the gains in the paper give an unstable bike, the uncommented one were the ones from his\n% simulink model\ngains.Pista.Slow       = [22.3000,-0.1300,15.6410,0.0645,0.1990]; %[22.3, -0.130, 15.6, 0.662, 0.198];\ngains.Fisher.Slow      = [23.0, -0.120, 17.7, 0.065, 0.198];\ngains.Yellow.Slow      = [18.0, -0.110, 20.2, 0.062, 0.200];\ngains.Yellowrev.Slow   = [48.0, -0.070, 27.9, 0.063, 0.191];\n\ngains.Benchmark.Medium  = [ 46.5, -0.052, 12.8, 0.177, 0.097];\ngains.Browserins.Medium = [ 48.0, -0.080, 9.03, 0.161, 0.097];\ngains.Browser.Medium    = [ 43.0, -0.087, 8.50, 0.173, 0.100];\ngains.Pista.Medium      = [ 49.0, -0.080, 8.06, 0.170, 0.101];\ngains.Fisher.Medium     = [ 50.5, -0.084, 8.26, 0.168, 0.100];\ngains.Yellow.Medium     = [ 39.0, -0.085, 8.61, 0.160, 0.101];\ngains.Yellowrev.Medium  = [105.0, -0.070, 8.90, 0.165, 0.100];\n\ngains.Benchmark.Fast   = [ 74.0, -0.063, 6.31, 0.332, 0.065]; % place holder\ngains.Browserins.Fast  = [ 74.0, -0.063, 6.31, 0.332, 0.065];\ngains.Browser.Fast     = [ 68.0, -0.060, 6.74, 0.330, 0.065];\ngains.Pista.Fast       = [ 80.0, -0.058, 5.82, 0.321, 0.066];\ngains.Fisher.Fast      = [ 82.0, -0.062, 5.83, 0.315, 0.065];\ngains.Yellow.Fast      = [ 61.0, -0.063, 6.34, 0.345, 0.065];\ngains.Yellowrev.Fast   = [170.0, -0.050, 6.45, 0.300, 0.066];\n\n% load the data for all speeds for all the bikes\nfor i = 1:length(bikes)\n    for j = 1:length(speeds)\n        data.(bikes{i}).(speedNames{j}) = ...\n            generate_data(bikes{i}, speeds(j), 'input', input, ...\n                          'gains', gains.(bikes{i}).(speedNames{j}));\n    end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/load_data.m",
    "content": "function data = load_data(filename, varargin)\n% function data = load_data(filename, varargin)\n%\n% Returns an iddata object with the input thetac and output theta for the\n% given file.\n%\n% Parameters\n% ----------\n% filename : char\n%   Filename for the data file.\n% varargin : char value pairs, optional\n%   sampleTime : double, default=0.0005\n%   detread : boolean, default=true\n%   directory : char, default='data'\n\nparser = inputParser;\nparser.addRequired('filename');\nparser.addParamValue('sampleTime', 0.0005);\nparser.addParamValue('detrend', true);\nparser.addParamValue('directory', 'data');\nparser.parse(filename, varargin{:});\nargs = parser.Results;\n\nraw = load([args.directory filesep filename]);\n\ndata = iddata(raw.theta, raw.theta_c, args.sampleTime, ...\n             'InterSample', 'foh', ...\n             'InputName', {'thetac'}, ...\n             'OutputName', {'theta'});\n\nif args.detrend\n    data = detrend(data);\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/make_filter.m",
    "content": "function [filtfcn, statefcn] = makeFilter(b, a)\n%   FILTFCN = MAKEFILTER(B, A) creates an IIR filtering\n%   function and returns it in the form of a function handle,\n%   FILTFCN. Each time you call FILTFCN with a new filter \n%   input value, it computes the corresponding new filter \n%   output value, updating its internal state vector at the\n%   same time.\n%\n%   [FILTFCN, STATEFCN] = MAKEFILTER(B, A) also returns a \n%   function (in the form of a function handle, STATEFCN) \n%   that can return the filter's internal state.  The internal\n%   state vector is in the form of a transposed direct form \n%   II delay line.\n\n%   Initialize state vector. To keep this example a bit \n%   simpler, assume that a and b have the same length.  \n%   Also assume that a(1) is 1.\n\nv = zeros(size(a));\n\nfiltfcn =  @iirFilter;\nstatefcn = @getState;\n\n   function yn = iirFilter(xn)\n      % Update the state vector\n      v(1) = v(2) + b(1) * xn;\n      v(2:end-1) = v(3:end) + b(2:end-1) * xn - ...\n         a(2:end-1) * v(1);\n      v(end) = b(end) * xn - a(end) * v(1);\n      \n      % Output is the first element of the state vector.\n      yn = v(1);\n   end\n\n   function vOut = getState\n      vOut = v;\n   end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/matlab_class.m",
    "content": "classdef matlab_class\n    properties\n        R;\n        G;\n        B;\n    end\n    methods\n        function obj = matlab_class(r,g,b)\n            obj.R = r;\n            obj.G = g;\n            obj.B = b;\n        end\n        function disp(obj)\n            disp(['Red: ' num2str(obj.R) ...\n                ', Green: ' num2str(obj.G) ...\n                ', Blue: ' num2str(obj.B)]);\n        end\n    end\n    enumeration\n        red     (1,0,0)\n        green   (0,1,0)\n        blue    (0,0,1)\n        cyan    (0,1,1)\n        magenta (1,0,1)\n        yellow  (1,1,0)\n        black   (0,0,0)\n        white   (1,1,1)\n    end\nend"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/matlab_function.m",
    "content": "function ret = matlab_function(A,B)\n% Simple function adding two values and displaying the return value\n\nret = A+B;\n% Display the return value\ndisp('Return value in function');\ndisp(ret);\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/matlab_script.m",
    "content": "% Matlab example script\n\n%Call matlab_function function which resides in the same directory\n\nvalue1 = 5 % semicolon at end of line is not mandatory, only suppresses output to command line.\nvalue2 = 3\n\n% Calculate sum of value1 and value2\nresult = matlab_function(value1,value2);\n\ndisp('called from script')\ndisp(result);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/matlab_script2.m",
    "content": "  % Matlab example script 2\n  % Comments precended with arbitrary whitespace (spaces or tabs)\n\n  %Call matlab_function function which resides in the same directory\n\nvalue1 = 5 % semicolon at end of line is not mandatory, only suppresses output to command line.\nvalue2 = 3\n\n  % Calculate sum of value1 and value2\nresult = matlab_function(value1,value2);\n\ndisp('called from script')\ndisp(result);"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/normalize.m",
    "content": "function [ d, d_mean, d_std ] = normalize( d )\n    d_mean = mean(d);\n    d = d - repmat(d_mean, size(d,1), 1);\n    d_std = std(d);\n    d = d./ repmat(d_std, size(d,1), 1);\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/overwrite_settings.m",
    "content": "function settings = overwrite_settings(defaultSettings, overrideSettings)\n% function settings = overwrite_settings(defaultSettings, overrideSettings)\n% Returns the settings based on a combination of the defaults and the override settings.\n%\n% Parameters\n% ----------\n% defaultSettings : structure\n%   A structure with all of the default settings.\n% overrideSettings : structure\n%   Contains any settings that should override the defaults.\n%\n% Returns\n% -------\n% settings : structure\n%   A stucture containing the overrideSettings and any defaults that weren't\n%   supplied in the overrideSettings.\n\n% add the default options if not specified by the user\noverrideNames = fieldnames(overrideSettings);\ndefaultNames = fieldnames(defaultSettings);\nnotGiven = setxor(overrideNames, defaultNames);\nsettings = overrideSettings;\nif length(notGiven) > 0\n    for i = 1:length(notGiven)\n        settings.(notGiven{i}) = defaultSettings.(notGiven{i});\n    end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/par_text_to_struct.m",
    "content": "function par = par_text_to_struct(pathToFile)\n% function par = par_text_to_struct(pathToFile)\n% Returns a structure of the parameters that were stored in a csv text file.\n%\n% Parameters\n% ----------\n% pathToFile : string\n%   Path to a text file containing the benchmark parameters for a single\n%   bicycle. The parameters should be on seperate lines and take this form:\n%\n%   c = 0.08+/-0.01\n%   lam = 0.31\n%\n% Returns\n% -------\n% par : structure\n%   A structure containing the bicycle parameters.\n\nfid = fopen(pathToFile);\ndata = textscan(fid, '%s %s', 'delimiter', '=');\nfclose(fid);\nnames = strtrim(data{1});\nvals = strtrim(regexp(data{2}, '+/-', 'split'));\nfor i = 1:length(names)\n    v = vals{i};\n    par.(names{i}) = str2num(v{1});\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/plant.m",
    "content": "function Yc = plant(varargin)\n% function Yc = plant(varargin)\n%\n% Returns the system plant given a number.\n%\n% Parameters\n% ----------\n% varargin : variable\n%   Either supply a single argument {num} or three arguments {num1, num2,\n%   ratio}. If a single argument is supplied, then one of the six transfer\n%   functions will be chosen from the list. If three arguments are chosen, a\n%   parallel sum of the two plants will be returned.\n%\n%   Option 1\n%   --------\n%   num : integer, {1, 2, 3, 4, 5, 6}\n%       A number between 1 and 6 corresponding to the five plants.\n%   Option 2\n%   --------\n%   num1 : integer, {1, 2, 3, 4, 5, 6}\n%       A number between 1 and 6 corresponding to the five plants.\n%   num2 : integer, {1, 2, 3, 4, 5, 6}\n%       A number between 1 and 6 corresponding to the five plants.\n%   percent : double\n%       The percentage multiplier of the first plant. Should be between 0\n%       and 1. The percentage multiplier of the second plant will be 1 -\n%       percent.\n%\n% Returns\n% -------\n% Either a single plant or a parallel sum of scaled plants.\n%\n% Option 1\n% --------\n% Yc : transfer function\n%   1 : 1 / s\n%   2 : 1 / s(s + 1)\n%   3 : 1 / s(s + 0.2)\n%   4 : 10 / (s + 10)\n%   5 : 5 / (s + 10)\n%   6 : 10 / (s^2 +.2 * s)\n%\n% Option 2\n% --------\n% Yc : transfer function\n%   Yc = percent * Yc1 + (1 - percent) * Yc2, where Yc1 and Yc2 are plants\n%   from the list shown in Option 1.\n\nif size(varargin, 2) > 1\n    if 0 <= varargin{3} & varargin{3} <= 1\n        Yc = parallel(varargin{3} * choose_plant(varargin{1}), ...\n            (1 - varargin{3}) * choose_plant(varargin{2}));\n    else\n        error('Ratio must be between 0 and 1.')\n    end\nelse\n    Yc = choose_plant(varargin{1});\nend\n\nfunction p = choose_plant(num)\nif num == 1;\n    p = tf(1.0, [1.0, 0.0]);\nelseif num == 2;\n    p = tf(1.0, [1.0, 1.0, 0.0]);\nelseif num == 3;\n    p = tf(1.0, [1.0, 0.2, 0.0]);\nelseif num == 4;\n    p = tf(10.0, [1.0, 10.0]);\nelseif num == 5;\n    p = tf(5.0, [1.0, 10.0]);\nelseif num == 6;\n    p = tf(10.0, [1.0, 0.2, 0.0]);\nelse\n    display('Invalid plant number.')\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/test_rk_par.m",
    "content": "clear\nmu=0.1;\nx_0=linspace(-0.8, -0.15, 2)\ny_0=zeros(1,2)\nvx_0=linspace(-2, 2, 2)\nvy_0=zeros(1,2)\nci=[1-mu-0.05 0 0.005 0.5290]\nt0=[0;0]\nT=[2;2]\ntspan=2\narg1={@f;@f}\n%tspan={[0 2],[0 2]};\narg=[mu;mu]\n[X]=arrayfun(RK4_par,t0,T,x_0',y_0',vx_0',vy_0',arg)\n% [X]=arrayfun(@f,[0;1],[ci;ci],[mu;mu]);\n%Y=RK4(@f,tspan,ci,mu);\n% figure\n% plot(Y(:,1),Y(:,2))\n% Y(end,1)"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/test_system_state_space.m",
    "content": "gains = [76.3808, -0.0516, 7.2456, 0.2632, 0.0708];\nwnm = 30;\nzetanm = 0.707;\n\ndata = generate_data('Rigid', 7.0, 'gains', gains, 'neuroFreq', wnm, ...\n    'loopTransfer', 0, 'handlingQuality', 0, 'simulate', 0);\n\nbicycle = ss(data.modelPar.A, data.modelPar.B, data.modelPar.C, ...\n    data.modelPar.D);\n\nbicycle.StateName = {'xP', 'yP', 'psi', 'phi', 'thetaB', 'thetaR', 'delta', ...\n             'thetaF', 'phiDot', 'thetaRDot', 'deltaDot'};\nbicycle.OutputName = {'xP', 'yP', 'psi', 'phi', 'thetaB', 'thetaR', 'delta', ...\n             'thetaF', 'xPDot', 'yPDot', 'psiDot', 'phiDot', ...\n             'thetaBDot', 'thetaRDot', 'deltaDot', 'thetaFDot', 'xQ', 'yQ'};\nbicycle.InputName = {'tPhi', 'tDelta', 'fB'};\n\ninputs = {'fB'};\noutputs = [bicycle.OutputName; 'tDelta'];\n\nanalytic = system_state_space('lateral', bicycle, gains, [wnm, zetanm], inputs, outputs);\n\nnumeric = ss(data.system.A, data.system.B, data.system.C, data.system.D);\n%numeric.StateName = data.bicycle.states;\n%numeric.InputName = data.bicycle.inputs;\n%numeric.OutputName = data.bicycle.outputs;\n\nfigure()\npzplot(analytic, numeric)\n\n% plot the transfer function roll-rate/lateral force for both\nfigure()\nhold all\n% plot my analytic model\n[num, den] = ss2tf(analytic.A, analytic.B, analytic.C, analytic.D, 1);\nmine = tf(num(find(strcmp('phiDot', outputs)), :), den);\nbode(tf(num(find(strcmp('phiDot', outputs)), :), den))\n% plot the data from the simulink model\nbode(tf(data.forceTF.PhiDot.num, data.forceTF.PhiDot.den))\n[num, den] = ss2tf(numeric.A, numeric.B, numeric.C, numeric.D, 1);\nbode(tf(num(12, :), den))\n\ndisplay('Analytic Eigenvalues')\neig(analytic.A)\ndisplay('Numeric Eigenvalues')\neig(numeric.A)\n\n% Now see if the heading tracking works.\ngains = [76.3808, -0.0516, 7.2456, 0.2632];\nwnm = 30;\nzetanm = 0.707;\n\npar = par_text_to_struct('parameters/RigidPar.txt');\n[A, B, C, D] = whipple_pull_force_ABCD(par, 7.0);\nbicycle = ss(A([3, 4, 7, 9, 11], [3, 4, 7, 9, 11]), ...\n    B([3. 4, 7, 9, 11], [2, 3]), eye(5), 0);\nbicycle.StateName = {'psi', 'phi', 'delta', 'phiDot', 'deltaDot'};\nbicycle.OutputName = {'psi', 'phi', 'delta', 'phiDot', 'deltaDot'};\nbicycle.InputName = {'tDelta', 'fB'};\n\ninputs = {'fB'};\noutputs = [bicycle.OutputName; 'tDelta'];\n\nanalytic = system_state_space('heading', bicycle, gains, [wnm, zetanm], inputs, outputs);\n% the following two should be the same\nanalytic.A(end, :)\nbottomRow = [-wnm^2 * prod(gains), -wnm^2 * prod(gains(1:3)), ...\n    -wnm^2 * gains(1), -wnm^2 * prod(gains(1:2)), 0, -wnm^2, ...\n    -2 * wnm * zetanm]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/varargin_to_structure.m",
    "content": "function options = varargin_to_structure(arguments)\n% function options = varargin_to_structure(arguments)\n% Returns a structure from a cell array of pairs.\n%\n% Parameters\n% ----------\n% arguments : cell array (1, n)\n%   A cell array where n is an even number greater than or equal to 2. The odd\n%   cells must be a character string and the even cells can be any data type.\n%\n% Returns\n% -------\n% options : structure\n%   The fields of the structure correspond to the odd cells in the array and\n%   the value for that field corresponds to the even cells.\n%\n% This is useful for functions that have varargin as an input where the\n% variable inputs are keyword pairs.\n\n% make sure there are enough arguments\nif length(arguments) <= 1\n    error('Please supply 2 or more arguments')\nend\n\n% make sure they provided and even number of inputs\nif mod(length(arguments), 2) ~= 0\n    error('There must be an even numbers of arguments')\nend\n\n% store the values in the structure\nfor i = 1:2:length(arguments)\n    % make sure they have character strings as all the odd cells\n    if ~ischar(arguments{i})\n        error('The odd arguments must be character strings.')\n    end\n    options.(arguments{i}) = arguments{i + 1};\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Matlab/write_gains.m",
    "content": "function write_gains(pathToFile, speeds, gains)\n% function write_gains(pathToFile, speeds, gains)\n%\n% Adds the provided gains to the file.\n%\n% Parameters\n% ----------\n% pathToFile : string\n%   The path to a gain file.\n% speeds : matrix(n, 1)\n% gains : matrix (n, 5)\n%   A matrix of gains where each row corresponds to a speed and the columns\n%   correspond to the loops starting at the innermost loop.\n\ncontents = importdata(pathToFile);\n\nspeedsInFile = contents.data(:, 1);\ngainsInFile = contents.data(:, 2:end);\n\n% remove any speeds that are very close to the speeds provided\nsameSpeedIndices = [];\nfor i = 1:length(speedsInFile)\n    for j = 1:length(speeds)\n        if abs(speedsInFile(i) - speeds(j)) < 1e-3\n            sameSpeedIndices = [sameSpeedIndices i];\n        end\n    end\nend\nspeedsInFile(sameSpeedIndices) = [];\ngainsInFile(sameSpeedIndices, :) = [];\n\n% concatenate data\nallGains = [gainsInFile; gains];\nallSpeeds = [speedsInFile; speeds];\n\n% sort the data\n[allSpeeds, order] = sort(allSpeeds);\nallGains = allGains(order, :);\n\n% recombine\nall = [allSpeeds, allGains];\n\n% rewrite the file\nfid = fopen(pathToFile, 'w');\nh = contents.colheaders;\nfprintf(fid, '%s,%s,%s,%s,%s,%s\\n', h{1}, h{2}, h{3}, h{4}, h{5}, h{6});\nfprintf(fid, '%1.3f,%1.4f,%1.4f,%1.4f,%1.4f,%1.4f\\n', all');\nfclose(fid);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Maven POM/filenames/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>renpengben</groupId>\n\t<artifactId>spring4mvc-jpa</artifactId>\n\t<packaging>war</packaging>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<name>spring4mvc-jpa Maven Webapp</name>\n\n\t<url>https://renpengben.github.io</url>\n\n\t<description>spring4mvc-jpa</description>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.7</java.version>\n\t\t<junit.version>4.11</junit.version>\n\t\t<slf4j.version>1.7.7</slf4j.version>\n\t\t<log4j.version>1.2.17</log4j.version>\n\n\t\t<spring.version>4.0.5.RELEASE</spring.version>\n\t\t<spring.data.jpa.version>1.6.0.RELEASE</spring.data.jpa.version>\n\t\t<cglib.version>2.1_3</cglib.version>\n\n\t\t<mysql.version>5.1.31</mysql.version>\n\t\t<hibernate.version>4.3.5.Final</hibernate.version>\n\t\t<hibernate-validator.version>5.1.1.Final</hibernate-validator.version>\n\t\t<druid-version>1.0.6</druid-version>\n\n\t</properties>\n\n\n\t<dependencies>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>${junit.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>log4j</groupId>\n\t\t\t<artifactId>log4j</artifactId>\n\t\t\t<version>${log4j.version}</version>\n\t\t</dependency>\n\n\n\t\t<!-- Spring -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-core</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>commons-logging</groupId>\n\t\t\t\t\t<artifactId>commons-logging</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-beans</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-aop</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-expression</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-tx</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-aspects</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context-support</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-jdbc</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-orm</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-web</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-webmvc</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-test</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.data</groupId>\n\t\t\t<artifactId>spring-data-jpa</artifactId>\n\t\t\t<version>${spring.data.jpa.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<artifactId>junit-dep</artifactId>\n\t\t\t\t\t<groupId>junit</groupId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>cglib</groupId>\n\t\t\t<artifactId>cglib-nodep</artifactId>\n\t\t\t<version>${cglib.version}</version>\n\t\t</dependency>\n\n\n\n\t\t<!-- JPA -->\n\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t<artifactId>hibernate-core</artifactId>\n\t\t\t<version>${hibernate.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t<artifactId>hibernate-entitymanager</artifactId>\n\t\t\t<version>${hibernate.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t<artifactId>hibernate-validator</artifactId>\n\t\t\t<version>${hibernate-validator.version}</version>\n\t\t\t<scope>compile</scope>\n\n\t\t</dependency>\n\n\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<version>${mysql.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t<artifactId>druid</artifactId>\n\t\t\t<version>${druid-version}</version>\n\t\t</dependency>\n\n\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>2.0.2</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>1.7</source>\n\t\t\t\t\t<target>1.7</target>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Max/Hello.maxhelp",
    "content": "{\n\t\"patcher\" : \t{\n\t\t\"fileversion\" : 1,\n\t\t\"appversion\" : \t\t{\n\t\t\t\"major\" : 5,\n\t\t\t\"minor\" : 1,\n\t\t\t\"revision\" : 9\n\t\t}\n,\n\t\t\"rect\" : [ 198.0, 92.0, 365.0, 407.0 ],\n\t\t\"bglocked\" : 0,\n\t\t\"defrect\" : [ 198.0, 92.0, 365.0, 407.0 ],\n\t\t\"openrect\" : [ 0.0, 0.0, 0.0, 0.0 ],\n\t\t\"openinpresentation\" : 0,\n\t\t\"default_fontsize\" : 14.0,\n\t\t\"default_fontface\" : 0,\n\t\t\"default_fontname\" : \"Arial\",\n\t\t\"gridonopen\" : 0,\n\t\t\"gridsize\" : [ 20.0, 20.0 ],\n\t\t\"gridsnaponopen\" : 0,\n\t\t\"toolbarvisible\" : 1,\n\t\t\"boxanimatetime\" : 200,\n\t\t\"imprint\" : 0,\n\t\t\"enablehscroll\" : 1,\n\t\t\"enablevscroll\" : 1,\n\t\t\"devicewidth\" : 0.0,\n\t\t\"boxes\" : [ \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 260.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-22\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 240.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-20\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 220.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-18\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-16\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"route 0 1 2 3\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 220.0, 99.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 5,\n\t\t\t\t\t\"outlettype\" : [ \"\", \"\", \"\", \"\", \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-14\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"r jojo\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 180.0, 41.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 0,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"color\" : [ 0.827451, 0.737255, 0.835294, 1.0 ],\n\t\t\t\t\t\"id\" : \"obj-13\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"s jojo\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 340.0, 43.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 0,\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"color\" : [ 0.827451, 0.737255, 0.835294, 1.0 ],\n\t\t\t\t\t\"id\" : \"obj-12\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"append toto\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 300.0, 84.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-11\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"% 4\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 260.0, 35.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-10\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"counter\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 220.0, 73.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 5,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 4,\n\t\t\t\t\t\"outlettype\" : [ \"int\", \"\", \"\", \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-9\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"metro 250\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 180.0, 74.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-8\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"toggle\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 140.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"id\" : \"obj-7\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"t 0\",\n\t\t\t\t\t\"patching_rect\" : [ 140.0, 80.0, 26.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-5\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"t 1\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 80.0, 26.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-4\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"message\",\n\t\t\t\t\t\"text\" : \"Goodbye World !\",\n\t\t\t\t\t\"patching_rect\" : [ 140.0, 40.0, 115.0, 21.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-3\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"message\",\n\t\t\t\t\t\"text\" : \"Hello World !\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 40.0, 90.0, 21.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-2\"\n\t\t\t\t}\n\n\t\t\t}\n ],\n\t\t\"lines\" : [ \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-2\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-4\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-3\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-5\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-4\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-5\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [ 149.5, 121.0, 29.5, 121.0 ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-8\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-8\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-9\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-9\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-10\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-10\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-11\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-11\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-12\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-13\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-14\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-16\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 1 ],\n\t\t\t\t\t\"destination\" : [ \"obj-18\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 2 ],\n\t\t\t\t\t\"destination\" : [ \"obj-20\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 3 ],\n\t\t\t\t\t\"destination\" : [ \"obj-22\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n ]\n\t}\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Max/Hello.maxpat",
    "content": "{\n\t\"patcher\" : \t{\n\t\t\"fileversion\" : 1,\n\t\t\"appversion\" : \t\t{\n\t\t\t\"major\" : 5,\n\t\t\t\"minor\" : 1,\n\t\t\t\"revision\" : 9\n\t\t}\n,\n\t\t\"rect\" : [ 198.0, 92.0, 365.0, 407.0 ],\n\t\t\"bglocked\" : 0,\n\t\t\"defrect\" : [ 198.0, 92.0, 365.0, 407.0 ],\n\t\t\"openrect\" : [ 0.0, 0.0, 0.0, 0.0 ],\n\t\t\"openinpresentation\" : 0,\n\t\t\"default_fontsize\" : 14.0,\n\t\t\"default_fontface\" : 0,\n\t\t\"default_fontname\" : \"Arial\",\n\t\t\"gridonopen\" : 0,\n\t\t\"gridsize\" : [ 20.0, 20.0 ],\n\t\t\"gridsnaponopen\" : 0,\n\t\t\"toolbarvisible\" : 1,\n\t\t\"boxanimatetime\" : 200,\n\t\t\"imprint\" : 0,\n\t\t\"enablehscroll\" : 1,\n\t\t\"enablevscroll\" : 1,\n\t\t\"devicewidth\" : 0.0,\n\t\t\"boxes\" : [ \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 260.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-22\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 240.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-20\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 220.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-18\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-16\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"route 0 1 2 3\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 220.0, 99.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 5,\n\t\t\t\t\t\"outlettype\" : [ \"\", \"\", \"\", \"\", \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-14\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"r jojo\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 180.0, 41.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 0,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"color\" : [ 0.827451, 0.737255, 0.835294, 1.0 ],\n\t\t\t\t\t\"id\" : \"obj-13\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"s jojo\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 340.0, 43.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 0,\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"color\" : [ 0.827451, 0.737255, 0.835294, 1.0 ],\n\t\t\t\t\t\"id\" : \"obj-12\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"append toto\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 300.0, 84.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-11\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"% 4\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 260.0, 35.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-10\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"counter\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 220.0, 73.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 5,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 4,\n\t\t\t\t\t\"outlettype\" : [ \"int\", \"\", \"\", \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-9\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"metro 250\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 180.0, 74.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-8\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"toggle\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 140.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"id\" : \"obj-7\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"t 0\",\n\t\t\t\t\t\"patching_rect\" : [ 140.0, 80.0, 26.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-5\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"t 1\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 80.0, 26.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-4\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"message\",\n\t\t\t\t\t\"text\" : \"Goodbye World !\",\n\t\t\t\t\t\"patching_rect\" : [ 140.0, 40.0, 115.0, 21.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"presentation_rect\" : [ 137.0, 42.0, 0.0, 0.0 ],\n\t\t\t\t\t\"id\" : \"obj-3\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"message\",\n\t\t\t\t\t\"text\" : \"Hello World !\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 40.0, 90.0, 21.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-2\"\n\t\t\t\t}\n\n\t\t\t}\n ],\n\t\t\"lines\" : [ \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 3 ],\n\t\t\t\t\t\"destination\" : [ \"obj-22\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 2 ],\n\t\t\t\t\t\"destination\" : [ \"obj-20\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 1 ],\n\t\t\t\t\t\"destination\" : [ \"obj-18\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-16\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-13\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-14\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-11\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-12\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-10\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-11\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-9\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-10\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-8\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-9\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-8\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-5\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [ 149.5, 121.0, 29.5, 121.0 ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-4\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-3\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-5\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-2\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-4\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n ]\n\t}\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Max/Hello.mxt",
    "content": "max v2;\r#N vpatcher 109 76 569 534;\r#P toggle 31 168 21 0;\r#P button 360 299 15 0;\r#P button 322 299 15 0;\r#P button 284 299 15 0;\r#P button 246 299 15 0;\r#P window setfont Verdana 12.;\r#P window linecount 1;\r#P newex 246 168 43 472055820 r jojo;\r#B color 5;\r#P newex 31 386 45 472055820 s jojo;\r#B color 5;\r#P newex 246 254 162 472055820 route 0 1 2 3;\r#P newex 31 338 88 472055820 append toto;\r#P newex 31 296 35 472055820 % 4;\r#N counter;\r#X flags 0 0;\r#P newobj 31 251 75 472055820 counter;\r#P newex 31 209 75 472055820 metro 250;\r#P newex 164 96 32 472055820 t 0;\r#P message 164 55 136 472055820 Goodbye World !;\r#P newex 31 96 32 472055820 t 1;\r#P message 31 55 113 472055820 Hello World !;\r#P connect 0 0 1 0;\r#P fasten 3 0 15 0 169 146 36 146;\r#P connect 1 0 15 0;\r#P connect 15 0 4 0;\r#P connect 4 0 5 0;\r#P connect 5 0 6 0;\r#P connect 6 0 7 0;\r#P connect 7 0 9 0;\r#P connect 2 0 3 0;\r#P connect 10 0 8 0;\r#P connect 8 0 11 0;\r#P connect 8 1 12 0;\r#P connect 8 2 13 0;\r#P connect 8 3 14 0;\r#P pop;\r"
  },
  {
    "path": "src/test/resources/samples/langs/MediaWiki/README.wiki",
    "content": "﻿﻿= Name =\n\n'''nginx_tcp_proxy_module''' - support TCP proxy with Nginx\n\n= Installation =\n\nDownload the latest stable version of the release tarball of this module from [http://github.com/yaoweibin/nginx_tcp_proxy_module github]\n\nGrab the nginx source code from [http://nginx.org/ nginx.org], for example, the version 1.2.1 (see nginx compatibility), and then build the source with this module:\n\n<geshi lang=\"bash\">\n    $ wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'\n    $ tar -xzvf nginx-1.2.1.tar.gz\n    $ cd nginx-1.2.1/\n    $ patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch\n\n    $ ./configure --add-module=/path/to/nginx_tcp_proxy_module\n\n    $ make\n    $ make install\n</geshi>\n    \n\n= Synopsis =\n\n<geshi lang=\"nginx\">\nhttp {\n\n    server {\n        listen 80;\n\n        location /status {\n            tcp_check_status;\n        }\n    }\n}\n</geshi>\n\n<geshi lang=\"nginx\">\n\n#You can also include tcp_proxy.conf file individually\n\n#include /path/to/tcp_proxy.conf;\n\ntcp {\n\n    upstream cluster {\n        # simple round-robin\n        server 192.168.0.1:80;\n        server 192.168.0.2:80;\n\n        check interval=3000 rise=2 fall=5 timeout=1000;\n\n        #check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;\n\n        #check interval=3000 rise=2 fall=5 timeout=1000 type=http;\n        #check_http_send \"GET / HTTP/1.0\\r\\n\\r\\n\";\n        #check_http_expect_alive http_2xx http_3xx;\n    }\n\n    server {\n        listen 8888;\n\n        proxy_pass cluster;\n    }\n}\n</geshi>\n\n= Description =\n\nThis module actually include many modules: ngx_tcp_module, ngx_tcp_core_module, ngx_tcp_upstream_module, ngx_tcp_proxy_module, ngx_tcp_websocket_module, ngx_tcp_ssl_module, ngx_tcp_upstream_ip_hash_module. All these modules work together to support TCP proxy with Nginx. I also added other features: ip_hash, upstream server health check, status monitor.\n\nThe motivation of writing these modules is Nginx's high performance and robustness. At first, I developed this module just for general TCP proxy. And now, this module is frequently used in websocket reverse proxying. \n\nNote, You can't use the same listening port with HTTP modules. \n\n= Directives =\n\n== ngx_tcp_moodule ==\n\n=== tcp ===\n\n'''syntax:''' ''tcp {...}''\n\n'''default:''' ''none''\n\n'''context:''' ''main''\n\n'''description:''' All the tcp related directives are contained in the tcp block.\n\n\n'''ngx_tcp_core_moodule'''\n\n=== server ===\n\n'''syntax:''' ''server {...}''\n\n'''default:''' ''none''\n\n'''context:''' ''tcp''\n\n'''description:''' All the specific server directives are contained in the server block.\n\n=== listen ===\n\n'''syntax:''' ''listen address:port [ bind | ssl | default]''\n\n'''default:''' ''none''\n\n'''context:''' ''server''\n\n'''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#listen listen]. The parameter of default means the default server if you have several server blocks with the same port.\n\n=== access_log ===\n\n'''syntax:''' ''access_log path [buffer=size] | off'' \n\n'''default:''' ''access_log logs/tcp_access.log''\n\n'''context:''' ''tcp, server''\n\n'''description:''' Set the access.log. Each record's format is like this:\n\n<pre>\n\nlog_time worker_process_pid client_ip host_ip accept_time upstream_ip bytes_read bytes_write\n\n2011/08/02 06:19:07 [5972] 127.0.0.1 0.0.0.0:1982 2011/08/02 06:18:19 172.19.0.129:80 80 236305\n\n</pre>\n\n* ''log_time'': The current time when writing this log. The log action is called when the proxy session is closed.\n* ''worker_process_pid'': the pid of worker process\n* ''client_ip'': the client ip\n* ''host_ip'': the server ip and port\n* ''accept_time'': the time when the server accepts client's connection\n* ''upstream_ip'': the upstream server's ip\n* ''bytes_read'': the bytes read from client\n* ''bytes_write'': the bytes written to client\n\n=== allow ===\n\n'''syntax:''' ''allow [ address | CIDR | all ]'' \n\n'''default:''' ''none''\n\n'''context:''' ''server''\n\n'''description:''' Directive grants access for the network or addresses indicated.\n\n=== deny ===\n\n'''syntax:''' ''deny [ address | CIDR | all ]''\n\n'''default:''' ''none''\n\n'''context:''' ''server''\n\n'''description:''' Directive grants access for the network or addresses indicated.\n\n=== so_keepalive ===\n\n'''syntax:''' ''so_keepalive on|off''\n\n'''default:''' ''off''\n\n'''context:''' ''main, server''\n\n'''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#so_keepalive so_keepalive].\n\n=== tcp_nodelay ===\n\n'''syntax:''' ''tcp_nodelay on|off''\n\n'''default:''' ''on''\n\n'''context:''' ''main, server''\n\n'''description:''' The same as [http://wiki.nginx.org/NginxHttpCoreModule#tcp_nodelay tcp_nodelay].\n\n=== timeout ===\n\n'''syntax:''' ''timeout milliseconds''\n\n'''default:''' ''60000''\n\n'''context:''' ''main, server''\n\n'''description:''' set the timeout value with clients.\n\n=== server_name ===\n\n'''syntax:''' ''server_name name''\n\n'''default:''' ''The name of the host, obtained through gethostname()''\n\n'''context:''' ''tcp, server''\n\n'''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#server_name server_name]. You can specify several server name in different server block with the same port. They can be used in websocket module.\n\n=== resolver ===\n\n'''syntax:''' ''resolver address''\n\n'''default:''' ''none''\n\n'''context:''' ''tcp, server''\n\n'''description:''' DNS server\n\n=== resolver_timeout ===\n\n'''syntax:''' ''resolver_timeout time''\n\n'''default:''' ''30s''\n\n'''context:''' ''tcp, server''\n\n'''description:''' Resolver timeout in seconds.\n\n\n== ngx_tcp_upstream_module ==\n\n=== upstream ===\n\n'''syntax:''' ''upstream {...}''\n\n'''default:''' ''none''\n\n'''context:''' ''tcp''\n\n'''description:''' All the upstream directives are contained in this  block. The upstream server will be dispatched with round robin by default. \n\n=== server ===\n\n'''syntax:''' ''server name [parameters]''\n\n'''default:''' ''none''\n\n'''context:''' ''upstream''\n\n'''description:''' Most of the parameters are the same as [http://wiki.nginx.org/NginxHttpUpstreamModule#server server]. Default port is 80.  \n\n=== check ===\n\n'''syntax:''' ''check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [type=tcp|ssl_hello|smtp|mysql|pop3|imap]''\n\n'''default:''' ''none, if parameters omitted, default parameters are interval=30000 fall=5 rise=2 timeout=1000''\n\n'''context:''' ''upstream''\n\n'''description:''' Add the health check for the upstream servers. At present, the check method is a simple tcp connect.\n\nThe parameters' meanings are:\n\n* ''interval'': the check request's interval time.\n* ''fall''(fall_count): After fall_count check failures, the server is marked down. \n* ''rise''(rise_count): After rise_count check success, the server is marked up. \n* ''timeout'': the check request's timeout.\n* ''type'': the check protocol type:\n# ''tcp'' is a simple tcp socket connect and peek one byte. \n# ''ssl_hello'' sends a client ssl hello packet and receives the server ssl hello packet.\n# ''http'' sends a http request packet, receives and parses the http response to diagnose if the upstream server is alive.  \n# ''smtp'' sends a smtp request packet, receives and parses the smtp response to diagnose if the upstream server is alive. The response begins with '2' should be an OK response. \n# ''mysql'' connects to the mysql server, receives the greeting response to diagnose if the upstream server is alive.  \n# ''pop3'' receives and parses the pop3 response to diagnose if the upstream server is alive. The response begins with '+' should be an OK response.\n# ''imap'' connects to the imap server, receives the greeting response to diagnose if the upstream server is alive.  \n\n=== check_http_send ===\n\n'''syntax:''' ''check_http_send http_packet''\n\n'''default:''' ''\"GET / HTTP/1.0\\r\\n\\r\\n\"''\n\n'''context:''' ''upstream''\n\n'''description:''' If you set the check type is http, then the check function will sends this http packet to check the upstream server.\n\n=== check_http_expect_alive ===\n\n'''syntax:''' ''check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]''\n\n'''default:''' ''http_2xx | http_3xx''\n\n'''context:''' ''upstream''\n\n'''description:''' These status codes indicate the upstream server's http response is OK, the backend is alive.\n\n=== check_smtp_send ===\n\n'''syntax:''' ''check_smtp_send smtp_packet''\n\n'''default:''' ''\"HELO smtp.localdomain\\r\\n\"''\n\n'''context:''' ''upstream''\n\n'''description:''' If you set the check type is smtp, then the check function will sends this smtp packet to check the upstream server.\n\n=== check_smtp_expect_alive ===\n\n'''syntax:''' ''check_smtp_expect_alive [smtp_2xx | smtp_3xx | smtp_4xx | smtp_5xx]''\n\n'''default:''' ''smtp_2xx''\n\n'''context:''' ''upstream''\n\n'''description:''' These status codes indicate the upstream server's smtp response is OK, the backend is alive.\n\n=== check_shm_size ===\n\n'''syntax:''' ''check_shm_size size''\n\n'''default:''' ''(number_of_checked_upstream_blocks + 1) * pagesize''\n\n'''context:''' ''tcp''\n\n'''description:''' If you store hundreds of servers in one upstream block, the shared memory for health check may be not enough, you can enlarged it by this directive.\n\n=== tcp_check_status ===\n\n'''syntax:''' ''tcp_check_status''\n\n'''default:''' ''none''\n\n'''context:''' ''location''\n\n'''description:''' Display the health checking servers' status by HTTP. This directive is set in the http block.\n\nThe table field meanings are:\n\n* ''Index'': The server index in the check table \n* ''Name'' : The upstream server name\n* ''Status'': The marked status of the server.\n* ''Busyness'': The number of connections which are connecting to the server.\n* ''Rise counts'': Count the successful checking\n* ''Fall counts'': Count the unsuccessful checking\n* ''Access counts'': Count the times accessing to this server\n* ''Check type'': The type of the check packet\n\n\n'''ngx_tcp_upstream_busyness_module'''\n\n=== busyness ===\n\n'''syntax:''' ''busyness''\n\n'''default:''' ''none''\n\n'''context:''' ''upstream''\n\n'''description:''' the upstream server will be dispatched by backend servers' busyness.\n\n\n'''ngx_tcp_upstream_ip_hash_module'''\n\n=== ip_hash ===\n\n'''syntax:''' ''ip_hash''\n\n'''default:''' ''none''\n\n'''context:''' ''upstream''\n\n'''description:''' the upstream server will be dispatched by ip_hash.\n\n\n== ngx_tcp_proxy_module ==\n\n=== proxy_pass ===\n\n'''syntax:''' ''proxy_pass host:port''\n\n'''default:''' ''none''\n\n'''context:''' ''server''\n\n'''description:''' proxy the request to the backend server. Default port is 80.\n\n=== proxy_buffer ===\n\n'''syntax:''' ''proxy_buffer size''\n\n'''default:''' ''4k''\n\n'''context:''' ''tcp, server''\n\n'''description:''' set the size of proxy buffer.\n\n=== proxy_connect_timeout ===\n\n'''syntax:''' ''proxy_connect_timeout miliseconds''\n\n'''default:''' ''60000''\n\n'''context:''' ''tcp, server''\n\n'''description:''' set the timeout value of connection to backends.\n\n=== proxy_read_timeout ===\n\n'''syntax:''' ''proxy_read_timeout miliseconds''\n\n'''default:''' ''60000''\n\n'''context:''' ''tcp, server''\n\n'''description:''' set the timeout value of reading from backends.\n\n=== proxy_send_timeout ===\n\n'''syntax:''' ''proxy_send_timeout miliseconds''\n\n'''default:''' ''60000''\n\n'''context:''' ''tcp, server''\n\n'''description:''' set the timeout value of sending to backends.\n\n\n== ngx_tcp_websocket_module ==\n\n=== websocket_pass ===\n\n'''syntax:''' ''websocket_pass [path] host:port''\n\n'''default:''' ''none''\n\n'''context:''' ''server''\n\n'''description:''' proxy the websocket request to the backend server. Default port is 80. You can specify several different paths in the same server block.\n\n=== websocket_buffer ===\n\n'''syntax:''' ''websocket_buffer size''\n\n'''default:''' ''4k''\n\n'''context:''' ''tcp, server''\n\n'''description:''' set the size of proxy buffer.\n\n=== websocket_connect_timeout ===\n\n'''syntax:''' ''websocket_connect_timeout miliseconds''\n\n'''default:''' ''60000''\n\n'''context:''' ''tcp, server''\n\n'''description:''' set the timeout value of connection to backends.\n\n=== websocket_read_timeout ===\n\n'''syntax:''' ''websocket_read_timeout miliseconds''\n\n'''default:''' ''60000''\n\n'''context:''' ''tcp, server''\n\n'''description:''' set the timeout value of reading from backends. Your timeout will be the minimum of this and the *timeout* parameter, so if you want a long timeout for your websockets, make sure to set both paramaters.\n\n=== websocket_send_timeout ===\n\n'''syntax:''' ''websocket_send_timeout miliseconds''\n\n'''default:''' ''60000''\n\n'''context:''' ''tcp, server''\n\n'''description:''' set the timeout value of sending to backends.\n\n\n== ngx_tcp_ssl_module ==\n\nThe default config file includes this ngx_tcp_ssl_module. If you want to just compile nginx without ngx_tcp_ssl_module, copy the ngx_tcp_proxy_module/config_without_ssl to ngx_tcp_proxy_module/config,  reconfigrure and compile nginx.\n\n=== ssl ===\n\n'''syntax:''' ''ssl [on|off] ''\n\n'''default:''' ''ssl off''\n\n'''context:''' ''tcp, server''\n\nEnables SSL for a server.\n\n=== ssl_certificate ===\n\n'''syntax:''' ''ssl_certificate file''\n\n'''default:''' ''ssl_certificate cert.pem''\n\n'''context:''' ''tcp, server''\n\nThis directive specifies the file containing the certificate, in PEM format. This file can contain also other certificates and the server private key.\n\n=== ssl_certificate_key ===\n\n'''syntax:''' ''ssl_certificate_key file''\n\n'''default:''' ''ssl_certificate_key cert.pem''\n\n'''context:''' ''tcp, server''\n\nThis directive specifies the file containing the private key, in PEM format.\n\n=== ssl_client_certificate ===\n\n'''syntax:''' ''ssl_client_certificate file''\n\n'''default:''' ''none''\n\n'''context:''' ''tcp, server''\n\nThis directive specifies the file containing the CA (root) certificate, in PEM format, that is used for validating client certificates.\n\n=== ssl_dhparam ===\n\n'''syntax:''' ''ssl_dhparam file''\n\n'''default:''' ''none''\n\n'''context:''' ''tcp, server''\n\nThis directive specifies a file containing Diffie-Hellman key agreement protocol cryptographic parameters, in PEM format, utilized for exchanging session keys between server and client.\n\n=== ssl_ciphers ===\n\n'''syntax:''' ''ssl_ciphers openssl_cipherlist_spec''\n\n'''default:''' ''ssl_ciphers HIGH:!aNULL:!MD5''\n\n'''context:''' ''tcp, server''\n\nThis directive describes the list of cipher suites the server supports for establishing a secure connection. Cipher suites are specified in the [http://openssl.org/docs/apps/ciphers.html OpenSSL] cipherlist format, for example:\n\n<geshi lang=\"nginx\">\nssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;\n</geshi>\n\nThe complete cipherlist supported by the currently installed version of OpenSSL in your platform can be obtained by issuing the command:\n<pre>\nopenssl ciphers\n</pre>\n\n=== ssl_crl ===\n\n'''syntax:''' ''ssl_crl file''\n\n'''default:''' ''none''\n\n'''context:''' ''tcp, server''\n\nThis directive specifies the filename of a Certificate Revocation List, in PEM format, which is used to check the revocation status of certificates.\n\n=== ssl_prefer_server_ciphers ===\n\n'''syntax:''' ''ssl_prefer_server_ciphers [on|off] ''\n\n'''default:''' ''ssl_prefer_server_ciphers off''\n\n'''context:''' ''tcp, server''\n\nThe server requires that the cipher suite list for protocols SSLv3 and TLSv1 are to be preferred over the client supported cipher suite list.\n\n=== ssl_protocols ===\n\n'''syntax:''' ''ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]''\n\n'''default:''' ''ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2''\n\n'''context:''' ''tcp, server''\n\nThis directive enables the protocol versions specified.\n\n=== ssl_verify_client ===\n\n'''syntax:''' ''ssl_verify_client on|off|optional''\n\n'''default:''' ''ssl_verify_client off''\n\n'''context:''' ''tcp, server''\n\nThis directive enables the verification of the client identity. Parameter 'optional' checks the client identity using its certificate in case it was made available to the server.\n\n=== ssl_verify_depth ===\n\n'''syntax:''' ''ssl_verify_depth number''\n\n'''default:''' ''ssl_verify_depth 1''\n\n'''context:''' ''tcp, server''\n\nThis directive sets how deep the server should go in the client provided certificate chain in order to verify the client identity.\n\n=== ssl_session_cache ===\n\n'''syntax:''' ''ssl_session_cache off|none|builtin:size and/or shared:name:size''\n\n'''default:''' ''ssl_session_cache off''\n\n'''context:''' ''tcp, server''\n\nThe directive sets the types and sizes of caches to store the SSL sessions.\n\nThe cache types are:\n\n* off -- Hard off: nginx says explicitly to a client that sessions can not reused.\n* none -- Soft off: nginx says to a client that session can be resued, but nginx actually never reuses them. This is workaround for some mail clients as ssl_session_cache may be used in mail proxy as well as in HTTP server.\n* builtin -- the OpenSSL builtin cache, is used inside one worker process only. The cache size is assigned in the number of the sessions. Note: there appears to be a memory fragmentation issue using this method, please take that into consideration when using this. See \"References\" below.\n* shared -- the cache is shared between all worker processes. The size of the cache is assigned in bytes: 1 MB cache can contain roughly 4000 sessions. Each shared cache must be given an arbitrary name. A shared cache with a given name can be used in several virtual hosts.\nIt's possible to use both types of cache &mdash; builtin and shared &mdash; simultaneously, for example:\n\n<geshi lang=\"nginx\">\nssl_session_cache  builtin:1000  shared:SSL:10m;\n</geshi>\n\nBear in mind however, that using only shared cache, i.e., without builtin, should be more effective.\n\n=== ssl_session_timeout ===\n\n'''syntax:''' ''ssl_session_timeout time''\n\n'''default:''' ''ssl_session_timeout 5m''\n\n'''context:''' ''tcp, server''\n\nThis directive defines the maximum time during which the client can re-use the previously negotiated cryptographic parameters of the secure session that is stored in the SSL cache.\n\n= Compatibility =\n\n* My test bed is 0.7.65+\n\n= Notes =\n\nThe http_response_parse.rl and smtp_response_parse.rl are [http://www.complang.org/ragel/ ragel] scripts , you can edit the script and compile it like this:\n\n<geshi lang=\"bash\">\n    $ ragel -G2 http_response_parse.rl\n    $ ragel -G2 smtp_response_parse.rl\n</geshi>\n\n= TODO =\n\n* refact this module, make it more extendable for adding third-party modules\n* manipulate header like http module's proxy_set_header\n* built-in variable support\n* custom log format\n* syslog support\n* FTP/IRC proxying\n\n= Known Issues =\n\n* This module can't use the same listening port with the HTTP module.\n\n= Changelogs =\n\n== v0.2.0 ==\n\n* add ssl proxy module\n* add websocket proxy module\n* add upstream busyness module\n* add tcp access log module\n\n== v0.19 ==\n\n* add many check methods\n\n== v0.1 ==\n\n* first release\n\n= Authors =\n\nWeibin Yao(姚伟斌) ''yaoweibin at gmail dot com''\n\n= Copyright & License =\n\nThis README template copy from [http://github.com/agentzh agentzh].\n\nI borrowed a lot of code from upstream and mail module from the nginx 0.7.* core. This part of code is copyrighted by Igor Sysoev. And the health check part is borrowed the design of Jack Lindamood's healthcheck module [http://github.com/cep21/healthcheck_nginx_upstreams healthcheck_nginx_upstreams];\n\nThis module is licensed under the BSD license.\n\nCopyright (C) 2013 by Weibin Yao <yaoweibin@gmail.com>.\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "src/test/resources/samples/langs/MediaWiki/mediawiki.mediawiki",
    "content": "\n= Overview =\n\nThe GDB Tracepoint Analysis feature is an extension to the Tracing and Monitoring Framework that allows the visualization and analysis of C/C++ tracepoint data collected by GDB and stored to a log file.\n\n= Getting Started =\n\nThe feature can be installed from the Eclipse update site by selecting '''Linux Tools''' > '''GDB Tracepoint Analysis'''.\n\nThe feature requires GDB version 7.2 or later to be installed on the local host. The executable program 'gdb' must be found in the path.\n\n= GDB Trace Perspective =\n\nTo open the perspective, select '''Window''' > '''Open Perspective''' > '''Other...''' > '''GDB Trace'''.\n\nThe perspective includes the following views by default:\n\n* '''Project Explorer''': This view shows the projects in the workspace and is used to create and manage Tracing projects.\n* '''Debug''': This view shows the running C/C++ Postmortem Debugger instances and displays the thread and stack trace associated with a tracepoint.\n* '''Trace Control''': This view shows the status of the debugger and allows navigation of trace records.\n* '''Console''': This view displays console output of the C/C++ Postmortem Debugger.\n\nThe editor area contains the '''Events''' and '''C/C++''' editors when a GDB Trace is opened.\n\n[[Image:images/GDBTracePerspective.png]]\n\n= Collecting Tracepoint Data =\n\nCollecting the C/C++ tracepoint data is outside the scope of this feature. It can be done from the GDB command line or by using the CDT debug component within Eclipse. See the CDT FAQ entry in the [[#References | References]] section.\n\n= Importing Tracepoint Data =\n\nSome information in this section is redundant with the LTTng User Guide. For further details, see the LTTng User Guide entry in the [[#References | References]] section.\n\n== Creating a Tracing Project ==\n\nIn the '''Project Explorer''' view, right-click and select '''New''' > '''Project...''' from the context menu. In the '''New Project''' dialog, select '''Tracing''' > '''Tracing Project''', click '''Next''', name your project and click '''Finish'''.\n\n== Importing a GDB Trace ==\n\nIn your tracing project, right-click on the '''Traces''' folder and select '''Import...'''. Browse to, or enter, a source directory. Select the trace file in the tree. Optionally set the trace type to '''GDB : GDB Trace'''. Click '''Finish'''.\n\nAlternatively, the trace can be drag & dropped to the '''Traces''' folder from any external file manager.\n\n== Selecting the GDB Trace Type ==\n\nRight-click the imported trace in the '''Traces''' folder and choose '''Select Trace Type...''' > '''GDB''' > '''GDB Trace''' from the context menu. This step can be omitted if the trace type was selected at import.\n\nThe trace will be updated with the GDB icon [[Image:images/gdb_icon16.png]].\n\n== Selecting the Trace Executable ==\n\nThe executable file that created the tracepoint data must be identified so that the C/C++ Postmortem Debugger can be launched properly.\n\nRight-click the GDB trace in the '''Traces''' folder and choose '''Select Trace Executable...''' from the context menu. Browse to, or enter, the path of the executable file and press '''OK'''.\n\nThe selected file must be recognized by GDB as an executable.\n\n= Visualizing Tracepoint Data =\n\n== Opening a GDB Trace ==\n\nIn the '''Traces''' folder, double-click the GDB trace or right-click it and select '''Open''' from the context menu.\n\nThe tracepoint data will be opened in an Events editor, and a C/C++ Postmortem Debugger instance will be launched.\n\nIf available in the workspace, the source code corresponding to the first trace record will also be opened in a C/C++ editor.\n\nAt this point it is recommended to relocate the Events editor outside of the default editor area, so that it is not hidden by the C/C++ editor.\n\n== Viewing Trace Data ==\n\nIn the Events editor, a table is shown with one row for each trace record. The '''Trace Frame''' column shows the sequential trace record number. The '''Tracepoint''' column shows the number assigned by GDB at collection time for this tracepoint. The '''File''' column shows the file name, line number and method where the tracepoint was set. The '''Content''' column shows the data collected at run-time by the tracepoint.\n\nSearching and filtering can be done on any column by entering a regular expression in the column header.\n\n== Navigating the GDB Trace ==\n\nTrace records can be selected in the Events editor using the keyboard or mouse. The C/C++ Postmortem Debugger in the '''Debug''' view will be updated to show the stack trace of the current trace record.\n\nThe trace can also be navigated from the '''Trace Control''' view by clicking the '''Next Trace Record''' or '''Previous Trace Record''' buttons. The Events editor and '''Debug''' views will be updated.\n\n= References =\n\n* [http://wiki.eclipse.org/index.php/Linux_Tools_Project/LTTng2/User_Guide LTTng User Guide]\n* [http://wiki.eclipse.org/CDT/User/FAQ#How_can_I_trace_my_application_using_C.2FC.2B.2B_Tracepoints.3F CDT FAQ - How can I trace my application using C/C++ Tracepoints?]\n\n= Updating This Document =\n\nThis document is maintained in a collaborative wiki.  If you wish to update or modify this document please visit [http://wiki.eclipse.org/index.php/Linux_Tools_Project/GDB_Tracepoint_Analysis/User_Guide http://wiki.eclipse.org/Linux_Tools_Project/GDB_Tracepoint_Analysis/User_Guide]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mercury/code_info.m",
    "content": "%---------------------------------------------------------------------------%\n% vim: ft=mercury ts=4 sw=4 et\n%---------------------------------------------------------------------------%\n% Copyright (C) 1994-2012 The University of Melbourne.\n% This file may only be copied under the terms of the GNU General\n% Public License - see the file COPYING in the Mercury distribution.\n%---------------------------------------------------------------------------%\n%\n% File: code_info.m.\n% Main authors: conway, zs.\n%\n% This file defines the code_info type and various operations on it.\n% The code_info structure is the 'state' of the code generator.\n%\n% This file is organized into ten submodules:\n%\n%   - the code_info structure and its access predicates\n%   - simple wrappers around access predicates\n%   - handling branched control structures\n%   - handling failure continuations\n%   - handling liveness issues\n%   - saving and restoring heap pointers, trail tickets etc\n%   - interfacing to var_locn\n%   - managing the info required by garbage collection and value numbering\n%   - managing stack slots\n%   - support for debugging the code generator itself.\n%\n%---------------------------------------------------------------------------%\n\n:- module ll_backend.code_info.\n:- interface.\n\n:- import_module check_hlds.type_util.\n:- import_module hlds.code_model.\n:- import_module hlds.hlds_data.\n:- import_module hlds.hlds_goal.\n:- import_module hlds.hlds_llds.\n:- import_module hlds.hlds_module.\n:- import_module hlds.hlds_pred.\n:- import_module hlds.instmap.\n:- import_module libs.globals.\n:- import_module ll_backend.continuation_info.\n:- import_module ll_backend.global_data.\n:- import_module ll_backend.layout.\n:- import_module ll_backend.llds.\n:- import_module ll_backend.trace_gen.\n:- import_module mdbcomp.prim_data.\n:- import_module mdbcomp.goal_path.\n:- import_module parse_tree.prog_data.\n:- import_module parse_tree.set_of_var.\n\n:- import_module assoc_list.\n:- import_module bool.\n:- import_module counter.\n:- import_module io.\n:- import_module list.\n:- import_module map.\n:- import_module maybe.\n:- import_module set.\n:- import_module set_tree234.\n:- import_module term.\n\n%----------------------------------------------------------------------------%\n%----------------------------------------------------------------------------%\n\n:- implementation.\n\n:- import_module backend_libs.builtin_ops.\n:- import_module backend_libs.proc_label.\n:- import_module hlds.arg_info.\n:- import_module hlds.hlds_desc.\n:- import_module hlds.hlds_rtti.\n:- import_module libs.options.\n:- import_module libs.trace_params.\n:- import_module ll_backend.code_util.\n:- import_module ll_backend.opt_debug.\n:- import_module ll_backend.var_locn.\n:- import_module parse_tree.builtin_lib_types.\n:- import_module parse_tree.prog_type.\n:- import_module parse_tree.mercury_to_mercury.\n\n:- import_module cord.\n:- import_module int.\n:- import_module pair.\n:- import_module require.\n:- import_module set.\n:- import_module stack.\n:- import_module string.\n:- import_module varset.\n\n%---------------------------------------------------------------------------%\n\n    % Submodule for the code_info type and its access predicates.\n    %\n    % This submodule has the following components:\n    %\n    %   declarations for exported access predicates\n    %   declarations for non-exported access predicates\n    %   the definition of the type and the init predicate\n    %   the definition of the get access predicates\n    %   the definition of the set access predicates\n    %\n    % Please keep the order of mention of the various fields\n    % consistent in each of these five components.\n\n:- interface.\n\n:- type code_info.\n\n    % Create a new code_info structure. Also return the\n    % outermost resumption point, and info about the non-fixed\n    % stack slots used for tracing purposes.\n    %\n:- pred code_info_init(bool::in, globals::in, pred_id::in, proc_id::in,\n    pred_info::in, proc_info::in, abs_follow_vars::in, module_info::in,\n    static_cell_info::in, const_struct_map::in, resume_point_info::out,\n    trace_slot_info::out, maybe(containing_goal_map)::in,\n    list(string)::in, int::in, code_info::out) is det.\n\n    % Get the globals table.\n    %\n:- pred get_globals(code_info::in, globals::out) is det.\n\n    % Get the exprn_opts.\n    %\n:- pred get_exprn_opts(code_info::in, exprn_opts::out) is det.\n\n    % Get the HLDS of the entire module.\n    %\n:- pred get_module_info(code_info::in, module_info::out) is det.\n\n    % Get the id of the predicate we are generating code for.\n    %\n:- pred get_pred_id(code_info::in, pred_id::out) is det.\n\n    % Get the id of the procedure we are generating code for.\n    %\n:- pred get_proc_id(code_info::in, proc_id::out) is det.\n\n    % Get the HLDS of the predicate containing the procedure\n    % we are generating code for.\n    %\n:- pred get_pred_info(code_info::in, pred_info::out) is det.\n\n    % Get the HLDS of the procedure we are generating code for.\n    %\n:- pred get_proc_info(code_info::in, proc_info::out) is det.\n\n    % Get the variables for the current procedure.\n    %\n:- pred get_varset(code_info::in, prog_varset::out) is det.\n\n:- func get_var_types(code_info) = vartypes.\n\n:- pred get_maybe_trace_info(code_info::in, maybe(trace_info)::out) is det.\n\n:- pred get_emit_trail_ops(code_info::in, add_trail_ops::out) is det.\n\n:- pred get_emit_region_ops(code_info::in, add_region_ops::out) is det.\n\n    % Get the set of currently forward-live variables.\n    %\n:- pred get_forward_live_vars(code_info::in, set_of_progvar::out) is det.\n\n    % Set the set of currently forward-live variables.\n    %\n:- pred set_forward_live_vars(set_of_progvar::in,\n    code_info::in, code_info::out) is det.\n\n    % Get the table mapping variables to the current\n    % instantiation states.\n    %\n:- pred get_instmap(code_info::in, instmap::out) is det.\n\n    % Set the table mapping variables to the current\n    % instantiation states.\n    %\n:- pred set_instmap(instmap::in, code_info::in, code_info::out) is det.\n\n    % Get the current nesting depth for parallel conjunctions.\n    %\n:- pred get_par_conj_depth(code_info::in, int::out) is det.\n\n    % Set the current nesting depth for parallel conjunctions.\n    %\n:- pred set_par_conj_depth(int::in, code_info::in, code_info::out) is det.\n\n    % The number of the last local label allocated.\n    %\n:- pred get_label_counter(code_info::in, counter::out) is det.\n\n    % Get the flag that indicates whether succip is used or not.\n    %\n:- pred get_succip_used(code_info::in, bool::out) is det.\n\n    % Get the label layout information created by tracing\n    % during code generation.\n    %\n:- pred get_layout_info(code_info::in, proc_label_layout_info::out) is det.\n\n:- pred get_proc_trace_events(code_info::in, bool::out) is det.\n\n:- pred set_proc_trace_events(bool::in, code_info::in, code_info::out) is det.\n\n    % Get the global static data structures that have\n    % been created during code generation for closure layouts.\n    %\n:- pred get_closure_layouts(code_info::in, list(closure_proc_id_data)::out)\n    is det.\n\n:- pred get_max_reg_in_use_at_trace(code_info::in, int::out, int::out) is det.\n\n:- pred set_max_reg_in_use_at_trace(int::in, int::in,\n    code_info::in, code_info::out) is det.\n\n    % Get the flag which is true iff the procedure has so far\n    % emitted code that creates a temporary nondet stack frame.\n    %\n:- pred get_created_temp_frame(code_info::in, bool::out) is det.\n\n:- pred get_static_cell_info(code_info::in, static_cell_info::out) is det.\n\n:- pred set_static_cell_info(static_cell_info::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_alloc_sites(code_info::in, set_tree234(alloc_site_info)::out)\n    is det.\n\n:- pred set_alloc_sites(set_tree234(alloc_site_info)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_used_env_vars(code_info::in, set(string)::out) is det.\n\n:- pred set_used_env_vars(set(string)::in, code_info::in, code_info::out)\n    is det.\n\n:- pred get_opt_trail_ops(code_info::in, bool::out) is det.\n\n:- pred get_opt_region_ops(code_info::in, bool::out) is det.\n\n:- pred get_auto_comments(code_info::in, bool::out) is det.\n\n:- pred get_lcmc_null(code_info::in, bool::out) is det.\n\n:- pred get_containing_goal_map(code_info::in, maybe(containing_goal_map)::out)\n    is det.\n\n:- pred get_containing_goal_map_det(code_info::in, containing_goal_map::out)\n    is det.\n\n:- pred get_const_struct_map(code_info::in, const_struct_map::out) is det.\n\n:- pred add_out_of_line_code(llds_code::in, code_info::in, code_info::out)\n    is det.\n\n:- pred get_out_of_line_code(code_info::in, llds_code::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\n:- pred get_var_slot_count(code_info::in, int::out) is det.\n\n:- pred set_maybe_trace_info(maybe(trace_info)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_opt_no_return_calls(code_info::in, bool::out) is det.\n\n:- pred get_zombies(code_info::in, set_of_progvar::out) is det.\n\n:- pred set_zombies(set_of_progvar::in, code_info::in, code_info::out) is det.\n\n:- pred get_var_locn_info(code_info::in, var_locn_info::out) is det.\n\n:- pred set_var_locn_info(var_locn_info::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_temps_in_use(code_info::in, set(lval)::out) is det.\n\n:- pred set_temps_in_use(set(lval)::in, code_info::in, code_info::out) is det.\n\n:- pred get_fail_info(code_info::in, fail_info::out) is det.\n\n:- pred set_fail_info(fail_info::in, code_info::in, code_info::out) is det.\n\n:- pred set_label_counter(counter::in, code_info::in, code_info::out) is det.\n\n:- pred set_succip_used(bool::in, code_info::in, code_info::out) is det.\n\n:- pred set_layout_info(proc_label_layout_info::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_max_temp_slot_count(code_info::in, int::out) is det.\n\n:- pred set_max_temp_slot_count(int::in, code_info::in, code_info::out) is det.\n\n:- pred get_temp_content_map(code_info::in,\n    map(lval, slot_contents)::out) is det.\n\n:- pred set_temp_content_map(map(lval, slot_contents)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_persistent_temps(code_info::in, set(lval)::out) is det.\n\n:- pred set_persistent_temps(set(lval)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred set_closure_layouts(list(closure_proc_id_data)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_closure_seq_counter(code_info::in, counter::out) is det.\n\n:- pred set_closure_seq_counter(counter::in,\n    code_info::in, code_info::out) is det.\n\n:- pred set_created_temp_frame(bool::in, code_info::in, code_info::out) is det.\n\n%---------------------------------------------------------------------------%\n\n    % The code_info structure has three groups of fields.\n    %\n    % Some fields are static; they are set when the code_info structure\n    % is initialized, and never changed afterwards.\n    %\n    % Some fields record information about the state of the code generator\n    % at a particular location in the HLDS code of the current procedure.\n    % At the start of the branched control structure, the code generator\n    % remembers the values of these fields, and starts generating code\n    % for each branch from the same location-dependent state.\n    %\n    % Some fields record persistent information that does not depend\n    % on a code location. Updates to these fields must remain effective\n    % even when the code generator resets its location-dependent state.\n\n:- type code_info\n    --->    code_info(\n                code_info_static        :: code_info_static,\n                code_info_loc_dep       :: code_info_loc_dep,\n                code_info_persistent    :: code_info_persistent\n            ).\n\n:- type code_info_static\n    --->    code_info_static(\n                % For the code generation options.\n                cis_globals             :: globals,\n                cis_exprn_opts          :: exprn_opts,\n\n                % The module_info structure - you just never know\n                % when you might need it.\n                cis_module_info         :: module_info,\n\n                % The id of the current predicate.\n                cis_pred_id             :: pred_id,\n\n                % The id of the current procedure.\n                cis_proc_id             :: proc_id,\n\n                % The pred_info for the predicate containing this procedure.\n                cis_pred_info           :: pred_info,\n\n                % The proc_info for this procedure.\n                cis_proc_info           :: proc_info,\n\n                % The proc_label for this procedure.\n                cis_proc_label          :: proc_label,\n\n                % The variables in this procedure.\n                cis_varset              :: prog_varset,\n\n                % The number of stack slots allocated. for storing variables.\n                % (Some extra stack slots are used for saving and restoring\n                % registers.)\n                cis_var_slot_count      :: int,\n\n                % Information about which stack slots the call sequence number\n                % and depth are stored in, provided tracing is switched on.\n                cis_maybe_trace_info    :: maybe(trace_info),\n\n                % Should we optimize calls that cannot return?\n                cis_opt_no_resume_calls :: bool,\n\n                % Should we emit trail operations?\n                cis_emit_trail_ops      :: add_trail_ops,\n\n                % Should we try to avoid generating trail operations?\n                cis_opt_trail_ops       :: bool,\n\n                % Should we emit region operations?\n                cis_emit_region_ops     :: add_region_ops,\n\n                % Should we try to avoid generating region operations?\n                cis_opt_region_ops      :: bool,\n\n                % The setting of --auto-comments.\n                cis_auto_comments       :: bool,\n\n                % The setting of --optimize-constructor-last-call-null.\n                cis_lcmc_null           :: bool,\n\n                cis_containing_goal_map :: maybe(containing_goal_map),\n\n                % Maps the number of an entry in the module's const_struct_db\n                % to its rval.\n                cis_const_struct_map    :: const_struct_map\n            ).\n\n:- type code_info_loc_dep\n    --->    code_info_loc_dep(\n                % Variables that are forward live after this goal.\n                cild_forward_live_vars  :: set_of_progvar,\n\n                % Current insts of the live variables.\n                cild_instmap            :: instmap,\n\n                % Zombie variables; variables that are not forward live\n                % but which are protected by an enclosing resume point.\n                cild_zombies            :: set_of_progvar,\n\n                % A map storing the information about the status of each known\n                % variable. (Known vars = forward live vars + zombies.)\n                cild_var_locn_info      :: var_locn_info,\n\n                % The set of temporary locations currently in use. These lvals\n                % must be all be keys in the map of temporary locations ever\n                % used, which is one of the persistent fields below. Any keys\n                % in that map which are not in this set are free for reuse.\n                cild_temps_in_use       :: set(lval),\n\n                % Information about how to manage failures.\n                cild_fail_info          :: fail_info,\n\n                % How deep in a nested parallel conjunction we are.\n                % This is zero at the beginning of a procedure and\n                % is incremented as we enter parallel conjunctions.\n                cild_par_conj_depth     :: int\n            ).\n\n:- type code_info_persistent\n    --->    code_info_persistent(\n                % Counter for the local labels used by this procedure.\n                cip_label_num_src           :: counter,\n\n                % do we need to store succip?\n                cip_store_succip            :: bool,\n\n                % Information on which values are live and where at which\n                % labels, for tracing and/or accurate gc.\n                cip_label_info              :: proc_label_layout_info,\n\n                % Did the procedure have any trace events?\n                cip_proc_trace_events       :: bool,\n\n                % The maximum number of extra temporary stackslots that\n                % have been used during the procedure.\n                cip_stackslot_max           :: int,\n\n                % The temporary locations that have ever been used on the\n                % stack, and what they contain. Once we have used a stack slot\n                % to store e.g. a ticket, we never reuse that slot to hold\n                % something else, e.g. a saved hp. This policy prevents us\n                % from making such conflicting choices in parallel branches,\n                % which would make it impossible to describe to gc what the\n                % slot contains after the end of the branched control\n                % structure.\n                cip_temp_contents           :: map(lval, slot_contents),\n\n                % Stack slot locations that should not be released even when\n                % the code generator resets its location-dependent state.\n                cip_persistent_temps        :: set(lval),\n\n                cip_closure_layout_seq      :: counter,\n\n                % Closure layout structures generated by this procedure.\n                cip_closure_layouts         :: list(closure_proc_id_data),\n\n                % At each call to MR_trace, we compute the highest rN and fN\n                % registers that contain useful values. These slot contain the\n                % maximum of these highest values. Therefore at all calls to\n                % MR_trace in the procedure, we need only save the registers\n                % whose numbers are equal to or smaller than this field.\n                % This slot contains -1 if tracing is not enabled.\n                cip_max_reg_r_used          :: int,\n                cip_max_reg_f_used          :: int,\n\n                % True iff the procedure has created one or more temporary\n                % nondet frames.\n                cip_created_temp_frame      :: bool,\n\n                cip_static_cell_info        :: static_cell_info,\n\n                cip_alloc_sites             :: set_tree234(alloc_site_info),\n\n                cip_used_env_vars           :: set(string),\n\n                % A counter and table for allocating and maintaining slots\n                % where string IDs will be placed at runtime for threadscope\n                % profiling.  The actual string IDs are allocated at runtime\n                % and their IDs are placed in an array slot which can be\n                % referred to statically.\n                cip_ts_string_table_size    :: int,\n                cip_ts_rev_string_table     :: list(string),\n\n                % Code that is part of this procedure, but that can be placed\n                % after the procedure without a cache penalty.  For example,\n                % code that is spawned off by loop control is placed here.\n                cip_out_of_line_code        :: llds_code\n            ).\n\n%---------------------------------------------------------------------------%\n\ncode_info_init(SaveSuccip, Globals, PredId, ProcId, PredInfo, ProcInfo,\n        FollowVars, ModuleInfo, StaticCellInfo, ConstStructMap, ResumePoint,\n        TraceSlotInfo, MaybeContainingGoalMap,\n        TSRevStringTable, TSStringTableSize, CodeInfo) :-\n    ProcLabel = make_proc_label(ModuleInfo, PredId, ProcId),\n    proc_info_get_initial_instmap(ProcInfo, ModuleInfo, InstMap),\n    proc_info_get_liveness_info(ProcInfo, Liveness),\n    CodeModel = proc_info_interface_code_model(ProcInfo),\n    build_input_arg_list(ProcInfo, ArgList),\n    proc_info_get_varset(ProcInfo, VarSet),\n    proc_info_get_vartypes(ProcInfo, VarTypes),\n    proc_info_get_stack_slots(ProcInfo, StackSlots),\n    ExprnOpts = init_exprn_opts(Globals),\n    globals.lookup_bool_option(Globals, use_float_registers, UseFloatRegs),\n    (\n        UseFloatRegs = yes,\n        FloatRegType = reg_f\n    ;\n        UseFloatRegs = no,\n        FloatRegType = reg_r\n    ),\n    globals.get_trace_level(Globals, TraceLevel),\n    (\n        eff_trace_level_is_none(ModuleInfo, PredInfo, ProcInfo, TraceLevel)\n            = no\n    ->\n        trace_fail_vars(ModuleInfo, ProcInfo, FailVars),\n        MaybeFailVars = yes(FailVars),\n        set_of_var.union(Liveness, FailVars, EffLiveness)\n    ;\n        MaybeFailVars = no,\n        EffLiveness = Liveness\n    ),\n    init_var_locn_state(ArgList, EffLiveness, VarSet, VarTypes, FloatRegType,\n        StackSlots, FollowVars, VarLocnInfo),\n    stack.init(ResumePoints),\n    globals.lookup_bool_option(Globals, allow_hijacks, AllowHijack),\n    (\n        AllowHijack = yes,\n        Hijack = allowed\n    ;\n        AllowHijack = no,\n        Hijack = not_allowed\n    ),\n    DummyFailInfo = fail_info(ResumePoints, resume_point_unknown,\n        may_be_different, not_inside_non_condition, Hijack),\n    map.init(TempContentMap),\n    set.init(PersistentTemps),\n    set.init(TempsInUse),\n    Zombies = set_of_var.init,\n    map.init(LayoutMap),\n    max_var_slot(StackSlots, VarSlotMax),\n    trace_reserved_slots(ModuleInfo, PredInfo, ProcInfo, Globals,\n        FixedSlots, _),\n    int.max(VarSlotMax, FixedSlots, SlotMax),\n    globals.lookup_bool_option(Globals, opt_no_return_calls,\n        OptNoReturnCalls),\n    globals.lookup_bool_option(Globals, use_trail, UseTrail),\n    globals.lookup_bool_option(Globals, disable_trail_ops, DisableTrailOps),\n    (\n        UseTrail = yes,\n        DisableTrailOps = no\n    ->\n        EmitTrailOps = add_trail_ops\n    ;\n        EmitTrailOps = do_not_add_trail_ops\n    ),\n    globals.lookup_bool_option(Globals, optimize_trail_usage, OptTrailOps),\n    globals.lookup_bool_option(Globals, optimize_region_ops, OptRegionOps),\n    globals.lookup_bool_option(Globals, region_analysis, UseRegions),\n    (\n        UseRegions = yes,\n        EmitRegionOps = add_region_ops\n    ;\n        UseRegions = no,\n        EmitRegionOps = do_not_add_region_ops\n    ),\n    globals.lookup_bool_option(Globals, auto_comments, AutoComments),\n    globals.lookup_bool_option(Globals, optimize_constructor_last_call_null,\n        LCMCNull),\n    CodeInfo0 = code_info(\n        code_info_static(\n            Globals,\n            ExprnOpts,\n            ModuleInfo,\n            PredId,\n            ProcId,\n            PredInfo,\n            ProcInfo,\n            ProcLabel,\n            VarSet,\n            SlotMax,\n            no,\n            OptNoReturnCalls,\n            EmitTrailOps,\n            OptTrailOps,\n            EmitRegionOps,\n            OptRegionOps,\n            AutoComments,\n            LCMCNull,\n            MaybeContainingGoalMap,\n            ConstStructMap\n        ),\n        code_info_loc_dep(\n            Liveness,\n            InstMap,\n            Zombies,\n            VarLocnInfo,\n            TempsInUse,\n            DummyFailInfo,  % init_fail_info will override this dummy value\n            0               % nested parallel conjunction depth\n        ),\n        code_info_persistent(\n            counter.init(1),\n            SaveSuccip,\n            LayoutMap,\n            no,\n            0,\n            TempContentMap,\n            PersistentTemps,\n            counter.init(1),\n            [],\n            -1,\n            -1,\n            no,\n            StaticCellInfo,\n            set_tree234.init,\n            set.init,\n            TSStringTableSize,\n            TSRevStringTable,\n            cord.empty\n        )\n    ),\n    init_maybe_trace_info(TraceLevel, Globals, ModuleInfo,\n        PredInfo, ProcInfo, TraceSlotInfo, CodeInfo0, CodeInfo1),\n    init_fail_info(CodeModel, MaybeFailVars, ResumePoint,\n        CodeInfo1, CodeInfo).\n\n:- func init_exprn_opts(globals) = exprn_opts.\n\ninit_exprn_opts(Globals) = ExprnOpts :-\n    globals.lookup_bool_option(Globals, gcc_non_local_gotos, OptNLG),\n    (\n        OptNLG = yes,\n        NLG = have_non_local_gotos\n    ;\n        OptNLG = no,\n        NLG = do_not_have_non_local_gotos\n    ),\n    globals.lookup_bool_option(Globals, asm_labels, OptASM),\n    (\n        OptASM = yes,\n        ASM = have_asm_labels\n    ;\n        OptASM = no,\n        ASM = do_not_have_asm_labels\n    ),\n    globals.lookup_bool_option(Globals, static_ground_cells, OptSGCell),\n    (\n        OptSGCell = yes,\n        SGCell = have_static_ground_cells\n    ;\n        OptSGCell = no,\n        SGCell = do_not_have_static_ground_cells\n    ),\n    globals.lookup_bool_option(Globals, unboxed_float, OptUBF),\n    (\n        OptUBF = yes,\n        UBF = have_unboxed_floats\n    ;\n        OptUBF = no,\n        UBF = do_not_have_unboxed_floats\n    ),\n    globals.lookup_bool_option(Globals, use_float_registers, OptFloatRegs),\n    (\n        OptFloatRegs = yes,\n        UseFloatRegs = use_float_registers\n    ;\n        OptFloatRegs = no,\n        UseFloatRegs = do_not_use_float_registers\n    ),\n    globals.lookup_bool_option(Globals, static_ground_floats, OptSGFloat),\n    (\n        OptSGFloat = yes,\n        SGFloat = have_static_ground_floats\n    ;\n        OptSGFloat = no,\n        SGFloat = do_not_have_static_ground_floats\n    ),\n    globals.lookup_bool_option(Globals, static_code_addresses,\n        OptStaticCodeAddr),\n    (\n        OptStaticCodeAddr = yes,\n        StaticCodeAddrs = have_static_code_addresses\n    ;\n        OptStaticCodeAddr = no,\n        StaticCodeAddrs = do_not_have_static_code_addresses\n    ),\n    ExprnOpts = exprn_opts(NLG, ASM, UBF, UseFloatRegs, SGCell, SGFloat,\n        StaticCodeAddrs).\n\n:- pred init_maybe_trace_info(trace_level::in, globals::in,\n    module_info::in, pred_info::in, proc_info::in, trace_slot_info::out,\n    code_info::in, code_info::out) is det.\n\ninit_maybe_trace_info(TraceLevel, Globals, ModuleInfo, PredInfo,\n        ProcInfo, TraceSlotInfo, !CI) :-\n    (\n        eff_trace_level_is_none(ModuleInfo, PredInfo, ProcInfo, TraceLevel)\n            = no\n    ->\n        proc_info_get_has_tail_call_events(ProcInfo, HasTailCallEvents),\n        (\n            HasTailCallEvents = tail_call_events,\n            get_next_label(TailRecLabel, !CI),\n            MaybeTailRecLabel = yes(TailRecLabel)\n        ;\n            HasTailCallEvents = no_tail_call_events,\n            MaybeTailRecLabel = no\n        ),\n        trace_setup(ModuleInfo, PredInfo, ProcInfo, Globals, MaybeTailRecLabel,\n            TraceSlotInfo, TraceInfo, !CI),\n        set_maybe_trace_info(yes(TraceInfo), !CI)\n    ;\n        TraceSlotInfo = trace_slot_info(no, no, no, no, no, no)\n    ).\n\n%---------------------------------------------------------------------------%\n\nget_globals(CI, CI ^ code_info_static ^ cis_globals).\nget_module_info(CI, CI ^ code_info_static ^ cis_module_info).\nget_exprn_opts(CI, CI ^ code_info_static ^ cis_exprn_opts).\nget_pred_id(CI, CI ^ code_info_static ^ cis_pred_id).\nget_proc_id(CI, CI ^ code_info_static ^ cis_proc_id).\nget_pred_info(CI, CI ^ code_info_static ^ cis_pred_info).\nget_proc_info(CI, CI ^ code_info_static ^ cis_proc_info).\nget_varset(CI, CI ^ code_info_static ^ cis_varset).\nget_var_slot_count(CI, CI ^ code_info_static ^ cis_var_slot_count).\nget_maybe_trace_info(CI, CI ^ code_info_static ^ cis_maybe_trace_info).\nget_opt_no_return_calls(CI, CI ^ code_info_static ^ cis_opt_no_resume_calls).\nget_emit_trail_ops(CI, CI ^ code_info_static ^ cis_emit_trail_ops).\nget_opt_trail_ops(CI, CI ^ code_info_static ^ cis_opt_trail_ops).\nget_emit_region_ops(CI, CI ^ code_info_static ^ cis_emit_region_ops).\nget_opt_region_ops(CI, CI ^ code_info_static ^ cis_opt_region_ops).\nget_auto_comments(CI, CI ^ code_info_static ^ cis_auto_comments).\nget_lcmc_null(CI, CI ^ code_info_static ^ cis_lcmc_null).\nget_containing_goal_map(CI, CI ^ code_info_static ^ cis_containing_goal_map).\nget_const_struct_map(CI, CI ^ code_info_static ^ cis_const_struct_map).\nget_forward_live_vars(CI, CI ^ code_info_loc_dep ^ cild_forward_live_vars).\nget_instmap(CI, CI ^ code_info_loc_dep ^ cild_instmap).\nget_zombies(CI, CI ^ code_info_loc_dep ^ cild_zombies).\nget_var_locn_info(CI, CI ^ code_info_loc_dep ^ cild_var_locn_info).\nget_temps_in_use(CI, CI ^ code_info_loc_dep ^ cild_temps_in_use).\nget_fail_info(CI, CI ^ code_info_loc_dep ^ cild_fail_info).\nget_par_conj_depth(CI, CI ^ code_info_loc_dep ^ cild_par_conj_depth).\nget_label_counter(CI, CI ^ code_info_persistent ^ cip_label_num_src).\nget_succip_used(CI, CI ^ code_info_persistent ^ cip_store_succip).\nget_layout_info(CI, CI ^ code_info_persistent ^ cip_label_info).\nget_proc_trace_events(CI, CI ^ code_info_persistent ^ cip_proc_trace_events).\nget_max_temp_slot_count(CI, CI ^ code_info_persistent ^ cip_stackslot_max).\nget_temp_content_map(CI, CI ^ code_info_persistent ^ cip_temp_contents).\nget_persistent_temps(CI, CI ^ code_info_persistent ^ cip_persistent_temps).\nget_closure_seq_counter(CI,\n    CI ^ code_info_persistent ^ cip_closure_layout_seq).\nget_closure_layouts(CI, CI ^ code_info_persistent ^ cip_closure_layouts).\nget_max_reg_in_use_at_trace(CI, MaxRegR, MaxRegF) :-\n    MaxRegR = CI ^ code_info_persistent ^ cip_max_reg_r_used,\n    MaxRegF = CI ^ code_info_persistent ^ cip_max_reg_f_used.\nget_created_temp_frame(CI, CI ^ code_info_persistent ^ cip_created_temp_frame).\nget_static_cell_info(CI, CI ^ code_info_persistent ^ cip_static_cell_info).\nget_alloc_sites(CI, CI ^ code_info_persistent ^ cip_alloc_sites).\nget_used_env_vars(CI, CI ^ code_info_persistent ^ cip_used_env_vars).\n\n%---------------------------------------------------------------------------%\n\nset_maybe_trace_info(TI, CI,\n    CI ^ code_info_static ^ cis_maybe_trace_info := TI).\nset_forward_live_vars(LV, CI,\n    CI ^ code_info_loc_dep ^ cild_forward_live_vars := LV).\nset_instmap(IM, CI, CI ^ code_info_loc_dep ^ cild_instmap := IM).\nset_zombies(Zs, CI, CI ^ code_info_loc_dep ^ cild_zombies := Zs).\nset_var_locn_info(EI, CI, CI ^ code_info_loc_dep ^ cild_var_locn_info := EI).\nset_temps_in_use(TI, CI, CI ^ code_info_loc_dep ^ cild_temps_in_use := TI).\nset_fail_info(FI, CI, CI ^ code_info_loc_dep ^ cild_fail_info := FI).\nset_par_conj_depth(N, CI, CI ^ code_info_loc_dep ^ cild_par_conj_depth := N).\nset_label_counter(LC, CI, CI ^ code_info_persistent ^ cip_label_num_src := LC).\nset_succip_used(SU, CI, CI ^ code_info_persistent ^ cip_store_succip := SU).\nset_layout_info(LI, CI, CI ^ code_info_persistent ^ cip_label_info := LI).\nset_proc_trace_events(PTE, CI,\n    CI ^ code_info_persistent ^ cip_proc_trace_events := PTE).\nset_max_temp_slot_count(TM, CI,\n    CI ^ code_info_persistent ^ cip_stackslot_max := TM).\nset_temp_content_map(CM, CI,\n    CI ^ code_info_persistent ^ cip_temp_contents := CM).\nset_persistent_temps(PT, CI,\n    CI ^ code_info_persistent ^ cip_persistent_temps := PT).\nset_closure_seq_counter(CLS, CI,\n    CI ^ code_info_persistent ^ cip_closure_layout_seq := CLS).\nset_closure_layouts(CG, CI,\n    CI ^ code_info_persistent ^ cip_closure_layouts := CG).\nset_max_reg_in_use_at_trace(MR, MF, !CI) :-\n    !CI ^ code_info_persistent ^ cip_max_reg_r_used := MR,\n    !CI ^ code_info_persistent ^ cip_max_reg_f_used := MF.\nset_created_temp_frame(MR, CI,\n    CI ^ code_info_persistent ^ cip_created_temp_frame := MR).\nset_static_cell_info(SCI, CI,\n    CI ^ code_info_persistent ^ cip_static_cell_info := SCI).\nset_alloc_sites(ASI, CI,\n    CI ^ code_info_persistent ^ cip_alloc_sites := ASI).\nset_used_env_vars(UEV, CI,\n    CI ^ code_info_persistent ^ cip_used_env_vars := UEV).\n\nget_containing_goal_map_det(CI, ContainingGoalMap) :-\n    get_containing_goal_map(CI, MaybeContainingGoalMap),\n    (\n        MaybeContainingGoalMap = yes(ContainingGoalMap)\n    ;\n        MaybeContainingGoalMap = no,\n        unexpected($module, $pred, \"no map\")\n    ).\n\nadd_out_of_line_code(NewCode, !CI) :-\n    Code0 = !.CI ^ code_info_persistent ^ cip_out_of_line_code,\n    Code = Code0 ++ NewCode,\n    !CI ^ code_info_persistent ^ cip_out_of_line_code := Code.\n\nget_out_of_line_code(CI, CI ^ code_info_persistent ^ cip_out_of_line_code).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for simple wrappers around access predicates.\n\n:- interface.\n\n    % Get the hlds mapping from variables to stack slots\n    %\n:- pred get_stack_slots(code_info::in, stack_slots::out) is det.\n\n    % Get the table that contains advice about where\n    % variables should be put.\n    %\n:- pred get_follow_var_map(code_info::in, abs_follow_vars_map::out) is det.\n\n    % Get the integer that gives the number of the next\n    % non-reserved register.\n    %\n:- pred get_next_non_reserved(code_info::in, reg_type::in, int::out) is det.\n\n    % Set the table that contains advice about where\n    % variables should be put.\n:- pred set_follow_vars(abs_follow_vars::in,\n    code_info::in, code_info::out) is det.\n\n    % pre_goal_update(GoalInfo, HasSubGoal, OldCodeInfo, NewCodeInfo)\n    % updates OldCodeInfo to produce NewCodeInfo with the changes\n    % specified by GoalInfo.\n    %\n:- pred pre_goal_update(hlds_goal_info::in, has_subgoals::in,\n    code_info::in, code_info::out) is det.\n\n    % post_goal_update(GoalInfo, OldCodeInfo, NewCodeInfo)\n    % updates OldCodeInfo to produce NewCodeInfo with the changes described\n    % by GoalInfo.\n    %\n:- pred post_goal_update(hlds_goal_info::in,\n    code_info::in, code_info::out) is det.\n\n    % Find out whether the body of the current procedure should use\n    % typeinfo liveness.\n    %\n:- func body_typeinfo_liveness(code_info) = bool.\n\n    % Find out the type of the given variable.\n    %\n:- func variable_type(code_info, prog_var) = mer_type.\n\n:- func variable_is_of_dummy_type(code_info, prog_var) = is_dummy_type.\n\n    % Compute the principal type constructor of the given type, and return the\n    % definition of this type constructor, if it has one (some type\n    % constructors are built in, and some are hidden behind abstraction\n    % barriers).\n    %\n:- pred search_type_defn(code_info::in, mer_type::in, hlds_type_defn::out) is\n    semidet.\n\n    % Compute the principal type constructor of the given type, and return the\n    % definition of this type constructor. Abort if it doesn't have a\n    % definition (e.g. because it is a builtin).\n    %\n:- func lookup_type_defn(code_info, mer_type) = hlds_type_defn.\n\n:- func lookup_cheaper_tag_test(code_info, mer_type) = maybe_cheaper_tag_test.\n\n:- func filter_region_vars(code_info, set_of_progvar) = set_of_progvar.\n\n    % Get the code model of the current procedure.\n    %\n:- func get_proc_model(code_info) = code_model.\n\n    % Get the list of the head variables of the current procedure.\n    %\n:- func get_headvars(code_info) = list(prog_var).\n\n    % Get the call argument information for the current procedure\n    %\n:- func get_arginfo(code_info) = list(arg_info).\n\n    % Get the call argument info for a given mode of a given predicate\n    %\n:- func get_pred_proc_arginfo(code_info, pred_id, proc_id) = list(arg_info).\n\n    % Get the set of variables currently needed by the resume\n    % points of enclosing goals.\n    %\n:- func current_resume_point_vars(code_info) = set_of_progvar.\n\n:- func variable_name(code_info, prog_var) = string.\n\n    % Create a code address which holds the address of the specified\n    % procedure.\n    % The fourth argument should be `no' if the the caller wants the\n    % returned address to be valid from everywhere in the program.\n    % If being valid from within the current procedure is enough,\n    % this argument should be `yes' wrapped around the value of the\n    % --procs-per-c-function option and the current procedure id.\n    % Using an address that is only valid from within the current\n    % procedure may make jumps more efficient.\n    %\n    % If the procs_per_c_function option tells us to put more than one\n    % procedure into each C function, but not all procedures in the module\n    % are in one function, then we would like to be able to use the\n    % fast form of reference to a procedure for references not only from\n    % within the same procedure but also from other procedures within\n    % the same C function. However, at the time of code generation,\n    % we do not yet know which procedures will be put into the same\n    % C functions, and so we cannot do this.\n    %\n:- func make_proc_entry_label(code_info, module_info, pred_id, proc_id, bool)\n    = code_addr.\n\n    % Generate the next local label in sequence.\n    %\n:- pred get_next_label(label::out, code_info::in, code_info::out)\n    is det.\n\n    % Note that the succip slot is used, and thus cannot be optimized away.\n    %\n:- pred succip_is_used(code_info::in, code_info::out) is det.\n\n:- pred add_trace_layout_for_label(label::in, term.context::in, trace_port::in,\n    bool::in, forward_goal_path::in, maybe(user_event_info)::in,\n    layout_label_info::in, code_info::in, code_info::out) is det.\n\n:- pred get_cur_proc_label(code_info::in, proc_label::out) is det.\n\n:- pred get_next_closure_seq_no(int::out,\n    code_info::in, code_info::out) is det.\n\n:- pred add_closure_layout(closure_proc_id_data::in,\n    code_info::in, code_info::out) is det.\n\n:- pred add_threadscope_string(string::in, int::out,\n    code_info::in, code_info::out) is det.\n\n:- pred get_threadscope_rev_string_table(code_info::in,\n    list(string)::out, int::out) is det.\n\n:- pred add_scalar_static_cell(list(typed_rval)::in,\n    data_id::out, code_info::in, code_info::out) is det.\n\n:- pred add_scalar_static_cell_natural_types(list(rval)::in,\n    data_id::out, code_info::in, code_info::out) is det.\n\n:- pred add_vector_static_cell(list(llds_type)::in, list(list(rval))::in,\n    data_id::out, code_info::in, code_info::out) is det.\n\n:- pred add_alloc_site_info(prog_context::in, string::in, int::in,\n    alloc_site_id::out, code_info::in, code_info::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\n:- pred add_resume_layout_for_label(label::in,\n    layout_label_info::in, code_info::in, code_info::out) is det.\n\nget_stack_slots(CI, StackSlots) :-\n    get_var_locn_info(CI, VarLocnInfo),\n    var_locn_get_stack_slots(VarLocnInfo, StackSlots).\n\nget_follow_var_map(CI, FollowVarMap) :-\n    get_var_locn_info(CI, VarLocnInfo),\n    var_locn_get_follow_var_map(VarLocnInfo, FollowVarMap).\n\nget_next_non_reserved(CI, RegType, NextNonReserved) :-\n    get_var_locn_info(CI, VarLocnInfo),\n    var_locn_get_next_non_reserved(VarLocnInfo, RegType, NextNonReserved).\n\nset_follow_vars(FollowVars, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_set_follow_vars(FollowVars, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n%-----------------------------------------------------------------------------%\n\npre_goal_update(GoalInfo, HasSubGoals, !CI) :-\n    % The liveness pass puts resume_point annotations on some kinds\n    % of goals. The parts of the code generator that handle those kinds\n    % of goals should handle the resume point annotation as well;\n    % when they do, they remove the annotation. The following code\n    % is a sanity check to make sure that this has in fact been done.\n    goal_info_get_resume_point(GoalInfo, ResumePoint),\n    (\n        ResumePoint = no_resume_point\n    ;\n        ResumePoint = resume_point(_, _),\n        unexpected($module, $pred, \"pre_goal_update with resume point\")\n    ),\n    goal_info_get_follow_vars(GoalInfo, MaybeFollowVars),\n    (\n        MaybeFollowVars = yes(FollowVars),\n        set_follow_vars(FollowVars, !CI)\n    ;\n        MaybeFollowVars = no\n    ),\n    % NOTE: we must be careful to apply deaths before births\n    goal_info_get_pre_deaths(GoalInfo, PreDeaths),\n    rem_forward_live_vars(PreDeaths, !CI),\n    maybe_make_vars_forward_dead(PreDeaths, no, !CI),\n    goal_info_get_pre_births(GoalInfo, PreBirths),\n    add_forward_live_vars(PreBirths, !CI),\n    (\n        HasSubGoals = does_not_have_subgoals,\n        goal_info_get_post_deaths(GoalInfo, PostDeaths),\n        rem_forward_live_vars(PostDeaths, !CI)\n    ;\n        HasSubGoals = has_subgoals\n    ).\n\npost_goal_update(GoalInfo, !CI) :-\n    % note: we must be careful to apply deaths before births\n    goal_info_get_post_deaths(GoalInfo, PostDeaths),\n    rem_forward_live_vars(PostDeaths, !CI),\n    maybe_make_vars_forward_dead(PostDeaths, no, !CI),\n    goal_info_get_post_births(GoalInfo, PostBirths),\n    add_forward_live_vars(PostBirths, !CI),\n    make_vars_forward_live(PostBirths, !CI),\n    InstMapDelta = goal_info_get_instmap_delta(GoalInfo),\n    get_instmap(!.CI, InstMap0),\n    instmap.apply_instmap_delta(InstMap0, InstMapDelta, InstMap),\n    set_instmap(InstMap, !CI).\n\n%---------------------------------------------------------------------------%\n\nbody_typeinfo_liveness(CI) = TypeInfoLiveness :-\n    get_module_info(CI, ModuleInfo),\n    get_pred_id(CI, PredId),\n    module_info_pred_info(ModuleInfo, PredId, PredInfo),\n    get_globals(CI, Globals),\n    body_should_use_typeinfo_liveness(PredInfo, Globals, TypeInfoLiveness).\n\nget_var_types(CI) = VarTypes :-\n    get_proc_info(CI, ProcInfo),\n    proc_info_get_vartypes(ProcInfo, VarTypes).\n\nvariable_type(CI, Var) = Type :-\n    lookup_var_type(get_var_types(CI), Var, Type).\n\nvariable_is_of_dummy_type(CI, Var) = IsDummy :-\n    VarType = variable_type(CI, Var),\n    get_module_info(CI, ModuleInfo),\n    IsDummy = check_dummy_type(ModuleInfo, VarType).\n\nsearch_type_defn(CI, Type, TypeDefn) :-\n    get_module_info(CI, ModuleInfo),\n    type_to_ctor_det(Type, TypeCtor),\n    module_info_get_type_table(ModuleInfo, TypeTable),\n    search_type_ctor_defn(TypeTable, TypeCtor, TypeDefn).\n\nlookup_type_defn(CI, Type) = TypeDefn :-\n    ( search_type_defn(CI, Type, TypeDefnPrime) ->\n        TypeDefn = TypeDefnPrime\n    ;\n        unexpected($module, $pred, \"type ctor has no definition\")\n    ).\n\nlookup_cheaper_tag_test(CI, Type) = CheaperTagTest :-\n    (\n        search_type_defn(CI, Type, TypeDefn),\n        get_type_defn_body(TypeDefn, TypeBody),\n        TypeBody = hlds_du_type(_, _, CheaperTagTestPrime, _, _, _, _, _, _)\n    ->\n        CheaperTagTest = CheaperTagTestPrime\n    ;\n        CheaperTagTest = no_cheaper_tag_test\n    ).\n\nfilter_region_vars(CI, ForwardLiveVarsBeforeGoal) = RegionVars :-\n    VarTypes = code_info.get_var_types(CI),\n    RegionVars = set_of_var.filter(is_region_var(VarTypes),\n        ForwardLiveVarsBeforeGoal).\n\n%---------------------------------------------------------------------------%\n\nget_proc_model(CI) = CodeModel :-\n    get_proc_info(CI, ProcInfo),\n    CodeModel = proc_info_interface_code_model(ProcInfo).\n\nget_headvars(CI) = HeadVars :-\n    get_module_info(CI, ModuleInfo),\n    get_pred_id(CI, PredId),\n    get_proc_id(CI, ProcId),\n    module_info_pred_proc_info(ModuleInfo, PredId, ProcId, _, ProcInfo),\n    proc_info_get_headvars(ProcInfo, HeadVars).\n\nget_arginfo(CI) = ArgInfo :-\n    get_pred_id(CI, PredId),\n    get_proc_id(CI, ProcId),\n    ArgInfo = get_pred_proc_arginfo(CI, PredId, ProcId).\n\nget_pred_proc_arginfo(CI, PredId, ProcId) = ArgInfo :-\n    get_module_info(CI, ModuleInfo),\n    module_info_pred_proc_info(ModuleInfo, PredId, ProcId, _, ProcInfo),\n    proc_info_arg_info(ProcInfo, ArgInfo).\n\ncurrent_resume_point_vars(CI) = ResumeVars :-\n    get_fail_info(CI, FailInfo),\n    FailInfo = fail_info(ResumePointStack, _, _, _, _),\n    stack.det_top(ResumePointStack, ResumePointInfo),\n    pick_first_resume_point(ResumePointInfo, ResumeMap, _),\n    map.keys(ResumeMap, ResumeMapVarList),\n    ResumeVars = set_of_var.list_to_set(ResumeMapVarList).\n\nvariable_name(CI, Var) = Name :-\n    get_varset(CI, Varset),\n    varset.lookup_name(Varset, Var, Name).\n\n%---------------------------------------------------------------------------%\n\nmake_proc_entry_label(CI, ModuleInfo, PredId, ProcId, Immed0) = CodeAddr :-\n    (\n        Immed0 = no,\n        Immed = no\n    ;\n        Immed0 = yes,\n        get_globals(CI, Globals),\n        globals.lookup_int_option(Globals, procs_per_c_function, ProcsPerFunc),\n        get_pred_id(CI, CurPredId),\n        get_proc_id(CI, CurProcId),\n        Immed = yes(ProcsPerFunc - proc(CurPredId, CurProcId))\n    ),\n    CodeAddr = make_entry_label(ModuleInfo, PredId, ProcId, Immed).\n\nget_next_label(Label, !CI) :-\n    get_cur_proc_label(!.CI, ProcLabel),\n    get_label_counter(!.CI, C0),\n    counter.allocate(N, C0, C),\n    set_label_counter(C, !CI),\n    Label = internal_label(N, ProcLabel).\n\nsuccip_is_used(!CI) :-\n    set_succip_used(yes, !CI).\n\nadd_trace_layout_for_label(Label, Context, Port, IsHidden, GoalPath,\n        MaybeSolverEventInfo, Layout, !CI) :-\n    get_layout_info(!.CI, Internals0),\n    Exec = yes(trace_port_layout_info(Context, Port, IsHidden, GoalPath,\n        MaybeSolverEventInfo, Layout)),\n    (\n        Label = internal_label(LabelNum, _)\n    ;\n        Label = entry_label(_, _),\n        unexpected($module, $pred, \"entry\")\n    ),\n    ( map.search(Internals0, LabelNum, Internal0) ->\n        Internal0 = internal_layout_info(Exec0, Resume, Return),\n        (\n            Exec0 = no\n        ;\n            Exec0 = yes(_),\n            unexpected($module, $pred, \"already known label\")\n        ),\n        Internal = internal_layout_info(Exec, Resume, Return),\n        map.det_update(LabelNum, Internal, Internals0, Internals)\n    ;\n        Internal = internal_layout_info(Exec, no, no),\n        map.det_insert(LabelNum, Internal, Internals0, Internals)\n    ),\n    set_layout_info(Internals, !CI).\n\nadd_resume_layout_for_label(Label, LayoutInfo, !CI) :-\n    get_layout_info(!.CI, Internals0),\n    Resume = yes(LayoutInfo),\n    (\n        Label = internal_label(LabelNum, _)\n    ;\n        Label = entry_label(_, _),\n        unexpected($module, $pred, \"entry\")\n    ),\n    ( map.search(Internals0, LabelNum, Internal0) ->\n        Internal0 = internal_layout_info(Exec, Resume0, Return),\n        (\n            Resume0 = no\n        ;\n            Resume0 = yes(_),\n            unexpected($module, $pred, \"already known label\")\n        ),\n        Internal = internal_layout_info(Exec, Resume, Return),\n        map.det_update(LabelNum, Internal, Internals0, Internals)\n    ;\n        Internal = internal_layout_info(no, Resume, no),\n        map.det_insert(LabelNum, Internal, Internals0, Internals)\n    ),\n    set_layout_info(Internals, !CI).\n\n:- pred get_active_temps_data(code_info::in,\n    assoc_list(lval, slot_contents)::out) is det.\n\nget_active_temps_data(CI, Temps) :-\n    get_temps_in_use(CI, TempsInUse),\n    get_temp_content_map(CI, TempContentMap),\n    map.select(TempContentMap, TempsInUse, TempsInUseContentMap),\n    map.to_assoc_list(TempsInUseContentMap, Temps).\n\nget_cur_proc_label(CI, ProcLabel) :-\n    ProcLabel = CI ^ code_info_static ^ cis_proc_label.\n\nget_next_closure_seq_no(SeqNo, !CI) :-\n    get_closure_seq_counter(!.CI, C0),\n    counter.allocate(SeqNo, C0, C),\n    set_closure_seq_counter(C, !CI).\n\nadd_closure_layout(ClosureLayout, !CI) :-\n    get_closure_layouts(!.CI, ClosureLayouts),\n    set_closure_layouts([ClosureLayout | ClosureLayouts], !CI).\n\nadd_threadscope_string(String, SlotNum, !CI) :-\n    Size0 = !.CI ^ code_info_persistent ^ cip_ts_string_table_size,\n    RevTable0 = !.CI ^ code_info_persistent ^ cip_ts_rev_string_table,\n    SlotNum = Size0,\n    Size = Size0 + 1,\n    RevTable = [String | RevTable0],\n    !CI ^ code_info_persistent ^ cip_ts_string_table_size := Size,\n    !CI ^ code_info_persistent ^ cip_ts_rev_string_table := RevTable.\n\nget_threadscope_rev_string_table(CI, RevTable, TableSize) :-\n    RevTable = CI ^ code_info_persistent ^ cip_ts_rev_string_table,\n    TableSize = CI ^ code_info_persistent ^ cip_ts_string_table_size.\n\nadd_scalar_static_cell(RvalsTypes, DataAddr, !CI) :-\n    get_static_cell_info(!.CI, StaticCellInfo0),\n    global_data.add_scalar_static_cell(RvalsTypes, DataAddr,\n        StaticCellInfo0, StaticCellInfo),\n    set_static_cell_info(StaticCellInfo, !CI).\n\nadd_scalar_static_cell_natural_types(Rvals, DataAddr, !CI) :-\n    get_static_cell_info(!.CI, StaticCellInfo0),\n    global_data.add_scalar_static_cell_natural_types(Rvals, DataAddr,\n        StaticCellInfo0, StaticCellInfo),\n    set_static_cell_info(StaticCellInfo, !CI).\n\nadd_vector_static_cell(Types, Vector, DataAddr, !CI) :-\n    get_static_cell_info(!.CI, StaticCellInfo0),\n    global_data.add_vector_static_cell(Types, Vector, DataAddr,\n        StaticCellInfo0, StaticCellInfo),\n    set_static_cell_info(StaticCellInfo, !CI).\n\nadd_alloc_site_info(Context, Type, Size, AllocId, !CI) :-\n    get_cur_proc_label(!.CI, ProcLabel),\n    AllocSite = alloc_site_info(ProcLabel, Context, Type, Size),\n    AllocId = alloc_site_id(AllocSite),\n    get_alloc_sites(!.CI, AllocSites0),\n    set_tree234.insert(AllocSite, AllocSites0, AllocSites),\n    set_alloc_sites(AllocSites, !CI).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for handling branched control structures.\n\n:- interface.\n\n:- type position_info.\n:- type branch_end_info.\n\n:- type branch_end  ==  maybe(branch_end_info).\n\n:- pred remember_position(code_info::in, position_info::out) is det.\n\n:- pred reset_to_position(position_info::in,\n    code_info::in, code_info::out) is det.\n\n:- pred reset_resume_known(position_info::in,\n    code_info::in, code_info::out) is det.\n\n:- pred generate_branch_end(abs_store_map::in, branch_end::in, branch_end::out,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred after_all_branches(abs_store_map::in, branch_end::in,\n    code_info::in, code_info::out) is det.\n\n:- pred save_hp_in_branch(llds_code::out, lval::out,\n    position_info::in, position_info::out, code_info::in, code_info::out)\n    is det.\n\n:- implementation.\n\n:- type position_info\n    --->    position_info(\n                % The location-dependent part of the code_info\n                % at a given position.\n                code_info_loc_dep\n            ).\n\n:- type branch_end_info\n    --->    branch_end_info(\n                % The code_info at the end of a branch.\n                code_info\n            ).\n\n:- func pos_get_fail_info(position_info) = fail_info.\n\npos_get_fail_info(position_info(LocDep)) = LocDep ^ cild_fail_info.\n\nremember_position(CI, position_info(CI ^ code_info_loc_dep)).\n\nreset_to_position(position_info(LocDep), CurCI, NextCI) :-\n    CurCI   = code_info(Static, _, Persistent),\n    NextCI0 = code_info(Static, LocDep, Persistent),\n\n    get_persistent_temps(NextCI0, PersistentTemps),\n    get_temps_in_use(NextCI0, TempsInUse0),\n    set.union(PersistentTemps, TempsInUse0, TempsInUse),\n    set_temps_in_use(TempsInUse, NextCI0, NextCI).\n\nreset_resume_known(BranchStart, !CI) :-\n    BranchStartFailInfo = pos_get_fail_info(BranchStart),\n    BranchStartFailInfo = fail_info(_, BSResumeKnown, _, _, _),\n    get_fail_info(!.CI, CurFailInfo),\n    CurFailInfo = fail_info(CurFailStack, _, CurCurfMaxfr, CurCondEnv,\n        CurHijack),\n    NewFailInfo = fail_info(CurFailStack, BSResumeKnown, CurCurfMaxfr,\n        CurCondEnv, CurHijack),\n    set_fail_info(NewFailInfo, !CI).\n\ngenerate_branch_end(StoreMap, MaybeEnd0, MaybeEnd, Code, !CI) :-\n    % The code generator generates better code if it knows in advance where\n    % each variable should go. We don't need to reset the follow_vars\n    % afterwards, since every goal following a branched control structure\n    % must in any case be annotated with its own follow_var set.\n    map.to_assoc_list(StoreMap, AbsVarLocs),\n    assoc_list.values(AbsVarLocs, AbsLocs),\n    code_util.max_mentioned_abs_regs(AbsLocs, MaxRegR, MaxRegF),\n    set_follow_vars(abs_follow_vars(StoreMap, MaxRegR + 1, MaxRegF + 1), !CI),\n    get_instmap(!.CI, InstMap),\n    ( instmap_is_reachable(InstMap) ->\n        VarLocs = assoc_list.map_values_only(abs_locn_to_lval, AbsVarLocs),\n        place_vars(VarLocs, Code, !CI)\n    ;\n        % With --opt-no-return-call, the variables that we would have\n        % saved across a call that cannot return have had the last\n        % of their code generation state destroyed, so calling\n        % place_vars would cause a code generator abort. However,\n        % pretending that all the variables are where the store map\n        % says they should be is perfectly fine, since we can never\n        % reach the end of *this* branch anyway.\n        remake_with_store_map(StoreMap, !CI),\n        Code = empty\n    ),\n    EndCodeInfo1 = !.CI,\n    (\n        MaybeEnd0 = no,\n        MaybeEnd = yes(branch_end_info(EndCodeInfo1))\n    ;\n        MaybeEnd0 = yes(branch_end_info(EndCodeInfo0)),\n\n        % Make sure the left context we leave the branched structure with\n        % is valid for all branches.\n        get_fail_info(EndCodeInfo0, FailInfo0),\n        get_fail_info(EndCodeInfo1, FailInfo1),\n        FailInfo0 = fail_info(_, ResumeKnown0, CurfrMaxfr0, CondEnv0, Hijack0),\n        FailInfo1 = fail_info(R, ResumeKnown1, CurfrMaxfr1, CondEnv1, Hijack1),\n        (\n            ResumeKnown0 = resume_point_known(Redoip0),\n            ResumeKnown1 = resume_point_known(Redoip1)\n        ->\n            ResumeKnown = resume_point_known(Redoip0),\n            expect(unify(Redoip0, Redoip1), $module, $pred, \"redoip mismatch\")\n        ;\n            ResumeKnown = resume_point_unknown\n        ),\n        (\n            CurfrMaxfr0 = must_be_equal,\n            CurfrMaxfr1 = must_be_equal\n        ->\n            CurfrMaxfr = must_be_equal\n        ;\n            CurfrMaxfr = may_be_different\n        ),\n        (\n            Hijack0 = allowed,\n            Hijack1 = allowed\n        ->\n            Hijack = allowed\n        ;\n            Hijack = not_allowed\n        ),\n        expect(unify(CondEnv0, CondEnv1), $module, $pred,\n            \"some but not all branches inside a non condition\"),\n        FailInfo = fail_info(R, ResumeKnown, CurfrMaxfr, CondEnv0, Hijack),\n        set_fail_info(FailInfo, EndCodeInfo1, EndCodeInfoA),\n\n        % Make sure the \"temps in use\" set at the end of the branched control\n        % structure includes every slot in use at the end of any branch.\n        get_temps_in_use(EndCodeInfo0, TempsInUse0),\n        get_temps_in_use(EndCodeInfo1, TempsInUse1),\n        set.union(TempsInUse0, TempsInUse1, TempsInUse),\n        set_temps_in_use(TempsInUse, EndCodeInfoA, EndCodeInfo),\n\n        MaybeEnd = yes(branch_end_info(EndCodeInfo))\n    ).\n\nafter_all_branches(StoreMap, MaybeEnd, !CI) :-\n    (\n        MaybeEnd = yes(BranchEnd),\n        BranchEnd = branch_end_info(BranchEndCodeInfo),\n        BranchEndLocDep = BranchEndCodeInfo ^ code_info_loc_dep,\n        reset_to_position(position_info(BranchEndLocDep), !CI),\n        remake_with_store_map(StoreMap, !CI)\n    ;\n        MaybeEnd = no,\n        unexpected($module, $pred, \"no branches in branched control structure\")\n    ).\n\n    % remake_with_store_map throws away the var_info data structure, forgetting\n    % the current locations of all variables, and rebuilds it from scratch\n    % based on the given store map. The new var_info will know about only\n    % the variables present in the store map, and will believe they are\n    % where the store map says they are.\n    %\n:- pred remake_with_store_map(abs_store_map::in,\n    code_info::in, code_info::out) is det.\n\nremake_with_store_map(StoreMap, !CI) :-\n    map.to_assoc_list(StoreMap, VarLocns),\n    VarLvals = assoc_list.map_values_only(abs_locn_to_lval, VarLocns),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    reinit_var_locn_state(VarLvals, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nsave_hp_in_branch(Code, Slot, Pos0, Pos, CI0, CI) :-\n    CI0 = code_info(CIStatic0, CILocDep0, CIPersistent0),\n    Pos0 = position_info(LocDep0),\n    CI1 = code_info(CIStatic0, LocDep0, CIPersistent0),\n    save_hp(Code, Slot, CI1, CI2),\n    CI2 = code_info(CIStatic, LocDep, CIPersistent),\n    Pos = position_info(LocDep),\n    % Reset the location dependent part to the original.\n    CI = code_info(CIStatic, CILocDep0, CIPersistent).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for the handling of failure continuations.\n\n    % The principles underlying this submodule of code_info.m are\n    % documented in the file compiler/notes/failure.html, which also\n    % defines terms such as \"quarter hijack\"). Some parts of the submodule\n    % also require knowledge of compiler/notes/allocation.html.\n\n:- interface.\n\n:- type resume_map.\n\n:- type resume_point_info.\n\n    % `prepare_for_disj_hijack' should be called before entering\n    % a disjunction. It saves the values of any nondet stack slots\n    % the disjunction may hijack, and if necessary, sets the redofr\n    % slot of the top frame to point to this frame. The code at the\n    % start of the individual disjuncts will override the redoip slot.\n    %\n    % `undo_disj_hijack' should be called before entering the last disjunct\n    % of a disjunction. It undoes the effects of `prepare_for_disj_hijack'.\n    %\n:- type disj_hijack_info.\n\n:- pred prepare_for_disj_hijack(code_model::in,\n    disj_hijack_info::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred undo_disj_hijack(disj_hijack_info::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n    % `prepare_for_ite_hijack' should be called before entering\n    % an if-then-else. It saves the values of any nondet stack slots\n    % the if-then-else may hijack, and if necessary, sets the redofr\n    % slot of the top frame to point to this frame. Our caller\n    % will then override the redoip slot to point to the start of\n    % the else part before generating the code of the condition.\n    % The maybe(lval) argument, if set to `yes', specifies the slot\n    % holding the success record to use in deciding whether to execute\n    % a region_ite_nondet_cond_fail operation at the start of the else branch.\n    %\n    % `ite_enter_then', which should be called after generating code for\n    % the condition, sets up the failure state of the code generator\n    % for generating the then-part, and returns the code sequences\n    % to be used at the starts of the then-part and the else-part\n    % to undo the effects of any hijacking.\n    %\n:- type ite_hijack_info.\n\n:- pred prepare_for_ite_hijack(code_model::in,\n    maybe(embedded_stack_frame_id)::in, ite_hijack_info::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred ite_enter_then(ite_hijack_info::in, resume_point_info::in,\n    llds_code::out, llds_code::out, code_info::in, code_info::out) is det.\n\n    % `enter_simple_neg' and `leave_simple_neg' should be called before\n    % and after generating the code for a negated unification, in\n    % situations where failure is a direct branch. We handle this case\n    % specially, because it occurs frequently and should not require\n    % a flushing of the expression cache, whereas the general way of\n    % handling negations does require a flush. These two predicates\n    % handle all aspects of the negation except for the unification itself.\n    %\n:- type simple_neg_info.\n\n:- pred enter_simple_neg(list(prog_var)::in, hlds_goal_info::in,\n    simple_neg_info::out, code_info::in, code_info::out) is det.\n\n:- pred leave_simple_neg(hlds_goal_info::in, simple_neg_info::in,\n    code_info::in, code_info::out) is det.\n\n    % `prepare_for_det_commit' and `generate_det_commit' should be\n    % called before and after generating the code for the multi goal\n    % being cut across. If the goal succeeds, the commit will cut away\n    % any choice points generated in the goal.\n    %\n    % The set_of_progvar should be the set of variables live before\n    % the scope goal.\n    %\n:- type det_commit_info.\n\n:- pred prepare_for_det_commit(add_trail_ops::in, add_region_ops::in,\n    set_of_progvar::in, hlds_goal_info::in, det_commit_info::out,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred generate_det_commit(det_commit_info::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n    % `prepare_for_semi_commit' and `generate_semi_commit' should be\n    % called before and after generating the code for the nondet goal\n    % being cut across. If the goal succeeds, the commit will cut\n    % any choice points generated in the goal.\n    %\n    % The set_of_progvar should be the set of variables live before\n    % the scope goal.\n    %\n:- type semi_commit_info.\n\n:- pred prepare_for_semi_commit(add_trail_ops::in, add_region_ops::in,\n    set_of_progvar::in, hlds_goal_info::in, semi_commit_info::out,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred generate_semi_commit(semi_commit_info::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n    % Put the given resume point into effect, by pushing it on to\n    % the resume point stack, and if necessary generating code to\n    % override the redoip of the top nondet stack frame.\n    %\n:- pred effect_resume_point(resume_point_info::in, code_model::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred pop_resume_point(code_info::in, code_info::out) is det.\n\n    % Return the details of the resume point currently on top of the\n    % failure continuation stack.\n    %\n:- pred top_resume_point(code_info::in, resume_point_info::out) is det.\n\n    % Call this predicate to say \"we have just left a disjunction;\n    % we don't know what address the following code will need to\n    % backtrack to\".\n    %\n:- pred set_resume_point_to_unknown(code_info::in, code_info::out) is det.\n\n    % Call this predicate to say \"we have just returned from a model_non\n    % call; we don't know what address the following code will need to\n    % backtrack to, and there may now be nondet frames on top of ours\n    % that do not have their redofr slots pointing to our frame\".\n    %\n:- pred set_resume_point_and_frame_to_unknown(code_info::in, code_info::out)\n    is det.\n\n    % Generate code for executing a failure that is appropriate for the\n    % current failure environment.\n    %\n:- pred generate_failure(llds_code::out, code_info::in, code_info::out) is det.\n\n    % Generate code that checks if the given rval is false, and if yes,\n    % executes a failure that is appropriate for the current failure\n    % environment.\n    %\n:- pred fail_if_rval_is_false(rval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n    % Checks whether the appropriate code for failure in the current\n    % failure environment is a direct branch.\n    %\n:- pred failure_is_direct_branch(code_info::in, code_addr::out) is semidet.\n\n    % Checks under what circumstances the current failure environment\n    % would allow a model_non call at this point to be turned into a\n    % tail call, provided of course that the return from the call is\n    % followed immediately by succeed().\n    %\n:- pred may_use_nondet_tailcall(code_info::in, nondet_tail_call::out) is det.\n\n    % Materialize the given variables into registers or stack slots.\n    %\n:- pred produce_vars(list(prog_var)::in, resume_map::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n    % Put the variables needed in enclosing failure continuations\n    % into their stack slots.\n    %\n:- pred flush_resume_vars_to_stack(llds_code::out,\n    code_info::in, code_info::out) is det.\n\n    % Set up the resume_point_info structure.\n    % The ResumeVars passed as the first arguments should be a sorted list\n    % without duplicates.\n    %\n:- pred make_resume_point(list(prog_var)::in, resume_locs::in, resume_map::in,\n    resume_point_info::out, code_info::in, code_info::out) is det.\n\n    % Generate the code for a resume point.\n    %\n:- pred generate_resume_point(resume_point_info::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n    % List the variables that need to be preserved for the given resume point.\n    %\n:- pred resume_point_vars(resume_point_info::in, list(prog_var)::out) is det.\n\n    % See whether the given resume point includes a code address that presumes\n    % all the resume point variables to be in their stack slots. If yes,\n    % return that code address; otherwise, abort the compiler.\n    %\n:- pred resume_point_stack_addr(resume_point_info::in, code_addr::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\n    % The part of the code generator state that says how to handle\n    % failures; also called the failure continuation stack.\n\n:- type fail_info\n    --->    fail_info(\n                stack(resume_point_info),\n                resume_point_known,\n                curfr_vs_maxfr,\n                condition_env,\n                hijack_allowed\n            ).\n\n    % A resumption point has one or two labels associated with it.\n    % Backtracking can arrive at either label. The code following\n    % each label will assume that the variables needed at the resumption\n    % point are in the locations given by the resume_map associated with\n    % the given label and nowhere else. Any code that can cause\n    % backtracking to a label must make sure that those variables are\n    % in the positions expected by the label.\n    %\n    % The only time when a code_addr in a resume_point info is not a label\n    % is when the code_addr is do_redo or do_fail, which indicate that\n    % the resumption point is either unknown or not in (this invocation of)\n    % this procedure.\n    %\n:- type resume_point_info\n    --->    orig_only(resume_map, code_addr)\n    ;       stack_only(resume_map, code_addr)\n    ;       orig_and_stack(resume_map, code_addr, resume_map, code_addr)\n    ;       stack_and_orig(resume_map, code_addr, resume_map, code_addr).\n\n    % A resume map maps the variables that will be needed at a resumption\n    % point to the locations in which they will be.\n    %\n:- type resume_map      ==  map(prog_var, set(lval)).\n\n:- type redoip_update\n    --->    has_been_done\n    ;       wont_be_done.\n\n:- type resume_point_known\n    --->    resume_point_known(redoip_update)\n    ;       resume_point_unknown.\n\n:- type curfr_vs_maxfr\n    --->    must_be_equal\n    ;       may_be_different.\n\n:- type condition_env\n    --->    inside_non_condition\n    ;       not_inside_non_condition.\n\n:- type hijack_allowed\n    --->    allowed\n    ;       not_allowed.\n\n%---------------------------------------------------------------------------%\n\n:- type disj_hijack_info\n    --->    disj_no_hijack\n    ;       disj_temp_frame\n    ;       disj_quarter_hijack\n    ;       disj_half_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval\n            )\n    ;       disj_full_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval,\n\n                % The stack slot in which we saved the value\n                % of the hijacked redofr.\n                lval\n            ).\n\nprepare_for_disj_hijack(CodeModel, HijackInfo, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr, CondEnv,\n        Allow),\n    (\n        ( CodeModel = model_det\n        ; CodeModel = model_semi\n        ),\n        HijackInfo = disj_no_hijack,\n        Code = singleton(\n            llds_instr(comment(\"disj no hijack\"), \"\")\n        )\n    ;\n        CodeModel = model_non,\n        (\n            CondEnv = inside_non_condition,\n            HijackInfo = disj_temp_frame,\n            create_temp_frame(do_fail, \"prepare for disjunction\", Code, !CI)\n        ;\n            CondEnv = not_inside_non_condition,\n            (\n                Allow = not_allowed,\n                (\n                    CurfrMaxfr = must_be_equal,\n                    ResumeKnown = resume_point_known(has_been_done),\n                    stack.pop(TopResumePoint, ResumePoints, RestResumePoints),\n                    stack.is_empty(RestResumePoints),\n                    TopResumePoint = stack_only(_, do_fail)\n                ->\n                    HijackInfo = disj_quarter_hijack,\n                    Code = singleton(\n                        llds_instr(comment(\"disj quarter hijack of do_fail\"),\n                            \"\")\n                    )\n                ;\n                    HijackInfo = disj_temp_frame,\n                    create_temp_frame(do_fail, \"prepare for disjunction\", Code,\n                        !CI)\n                )\n            ;\n                Allow = allowed,\n                (\n                    CurfrMaxfr = must_be_equal,\n                    (\n                        ResumeKnown = resume_point_known(has_been_done),\n                        HijackInfo = disj_quarter_hijack,\n                        Code = singleton(\n                            llds_instr(comment(\"disj quarter hijack\"), \"\")\n                        )\n                    ;\n                        ( ResumeKnown = resume_point_known(wont_be_done)\n                        ; ResumeKnown = resume_point_unknown\n                        ),\n                        acquire_temp_slot(slot_lval(redoip_slot(lval(curfr))),\n                            non_persistent_temp_slot, RedoipSlot, !CI),\n                        HijackInfo = disj_half_hijack(RedoipSlot),\n                        Code = singleton(\n                            llds_instr(assign(RedoipSlot,\n                                lval(redoip_slot(lval(curfr)))),\n                                \"prepare for half disj hijack\")\n                        )\n                    )\n                ;\n                    CurfrMaxfr = may_be_different,\n                    acquire_temp_slot(slot_lval(redoip_slot(lval(maxfr))),\n                        non_persistent_temp_slot, RedoipSlot, !CI),\n                    acquire_temp_slot(slot_lval(redofr_slot(lval(maxfr))),\n                        non_persistent_temp_slot, RedofrSlot, !CI),\n                    HijackInfo = disj_full_hijack(RedoipSlot, RedofrSlot),\n                    Code = from_list([\n                        llds_instr(\n                            assign(RedoipSlot, lval(redoip_slot(lval(maxfr)))),\n                            \"prepare for full disj hijack\"),\n                        llds_instr(\n                            assign(RedofrSlot, lval(redofr_slot(lval(maxfr)))),\n                            \"prepare for full disj hijack\"),\n                        llds_instr(\n                            assign(redofr_slot(lval(maxfr)), lval(curfr)),\n                            \"prepare for full disj hijack\")\n                    ])\n                )\n            )\n        )\n    ).\n\nundo_disj_hijack(HijackInfo, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr, CondEnv,\n        Allow),\n    (\n        HijackInfo = disj_no_hijack,\n        Code = empty\n    ;\n        HijackInfo = disj_temp_frame,\n        Code = singleton(\n            llds_instr(assign(maxfr, lval(prevfr_slot(lval(maxfr)))),\n                \"restore maxfr for temp frame disj\")\n        )\n    ;\n        HijackInfo = disj_quarter_hijack,\n        expect(unify(CurfrMaxfr, must_be_equal), $module, $pred,\n            \"maxfr may differ from curfr in disj_quarter_hijack\"),\n        stack.det_top(ResumePoints, ResumePoint),\n        pick_stack_resume_point(ResumePoint, _, StackLabel),\n        LabelConst = const(llconst_code_addr(StackLabel)),\n        % peephole.m looks for the \"curfr==maxfr\" pattern in the comment.\n        Code = singleton(\n            llds_instr(assign(redoip_slot(lval(curfr)), LabelConst),\n                \"restore redoip for quarter disj hijack (curfr==maxfr)\")\n        )\n    ;\n        HijackInfo = disj_half_hijack(RedoipSlot),\n        expect(unify(ResumeKnown, resume_point_unknown), $module, $pred,\n            \"resume point known in disj_half_hijack\"),\n        expect(unify(CurfrMaxfr, must_be_equal), $module, $pred,\n            \"maxfr may differ from curfr in disj_half_hijack\"),\n        % peephole.m looks for the \"curfr==maxfr\" pattern in the comment.\n        Code = singleton(\n            llds_instr(assign(redoip_slot(lval(curfr)), lval(RedoipSlot)),\n                \"restore redoip for half disj hijack (curfr==maxfr)\")\n        )\n    ;\n        HijackInfo = disj_full_hijack(RedoipSlot, RedofrSlot),\n        expect(unify(CurfrMaxfr, may_be_different), $module, $pred,\n            \"maxfr same as curfr in disj_full_hijack\"),\n        Code = from_list([\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for full disj hijack\"),\n            llds_instr(assign(redofr_slot(lval(maxfr)), lval(RedofrSlot)),\n                \"restore redofr for full disj hijack\")\n        ])\n    ),\n    (\n        % HijackInfo \\= disj_no_hijack if and only if the disjunction\n        % is model_non.\n        HijackInfo \\= disj_no_hijack,\n        CondEnv = inside_non_condition\n    ->\n        FailInfo = fail_info(ResumePoints, resume_point_unknown, CurfrMaxfr,\n            CondEnv, Allow),\n        set_fail_info(FailInfo, !CI)\n    ;\n        true\n    ).\n\n%---------------------------------------------------------------------------%\n\n    % For model_non if-then-elses, we need to clean up the embedded stack frame\n    % we create for the if-then-else when the condition fails after succeeding.\n    % For such if-then-elses, we record the id of the embedded frame we need to\n    % clean up, and the id of the slot that is initialized to false, and set to\n    % true each time the condition succeeds.\n:- type ite_region_info\n    --->    ite_region_info(\n                embedded_stack_frame_id,\n                lval\n            ).\n\n:- type ite_hijack_info\n    --->    ite_info(\n                resume_point_known,\n                condition_env,\n                ite_hijack_type,\n                maybe(ite_region_info)\n            ).\n\n:- type ite_hijack_type\n    --->    ite_no_hijack\n    ;       ite_temp_frame(\n                % The stack slot in which we saved the value of maxfr.\n                lval\n            )\n    ;       ite_quarter_hijack\n    ;       ite_half_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval\n            )\n    ;       ite_full_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval,\n\n                % The stack slot in which we saved the value\n                % of the hijacked redofr.\n                lval,\n\n                % The stack slot in which we saved the value of maxfr.\n                lval\n            ).\n\nprepare_for_ite_hijack(CondCodeModel, MaybeEmbeddedFrameId, HijackInfo, Code,\n        !CI) :-\n    get_fail_info(!.CI, FailInfo),\n    FailInfo = fail_info(_, ResumeKnown, CurfrMaxfr, CondEnv, Allow),\n    (\n        % It is possible for a negated goal (which is the \"Condition\" of the\n        % equivalent if-then-else) to be det, if it is also impure.\n        ( CondCodeModel = model_det\n        ; CondCodeModel = model_semi\n        ),\n        expect(unify(MaybeEmbeddedFrameId, no), $module, $pred,\n            \"MaybeEmbeddedFrameId in model_semi\"),\n        HijackType = ite_no_hijack,\n        Code = singleton(\n            llds_instr(comment(\"ite no hijack\"), \"\")\n        ),\n        MaybeRegionInfo = no\n    ;\n        CondCodeModel = model_non,\n        (\n            ( Allow = not_allowed\n            ; CondEnv = inside_non_condition\n            ; MaybeEmbeddedFrameId = yes(_)\n            )\n        ->\n            acquire_temp_slot(slot_lval(maxfr), non_persistent_temp_slot,\n                MaxfrSlot, !CI),\n            HijackType = ite_temp_frame(MaxfrSlot),\n            create_temp_frame(do_fail, \"prepare for ite\", TempFrameCode, !CI),\n            MaxfrCode = singleton(\n                llds_instr(assign(MaxfrSlot, lval(maxfr)), \"prepare for ite\")\n            ),\n            (\n                MaybeEmbeddedFrameId = yes(EmbeddedFrameId),\n                % Note that this slot is intentionally not released anywhere.\n                acquire_temp_slot(slot_success_record, persistent_temp_slot,\n                    SuccessRecordSlot, !CI),\n                InitSuccessCode = singleton(\n                    llds_instr(\n                        assign(SuccessRecordSlot, const(llconst_false)),\n                        \"record no success of the condition yes\")\n                ),\n                MaybeRegionInfo =\n                    yes(ite_region_info(EmbeddedFrameId, SuccessRecordSlot))\n            ;\n                MaybeEmbeddedFrameId = no,\n                InitSuccessCode = empty,\n                MaybeRegionInfo = no\n            ),\n            Code = TempFrameCode ++ MaxfrCode ++ InitSuccessCode\n        ;\n            (\n                CurfrMaxfr = must_be_equal,\n                (\n                    ResumeKnown = resume_point_known(_),\n                    HijackType = ite_quarter_hijack,\n                    Code = singleton(\n                        llds_instr(comment(\"ite quarter hijack\"), \"\")\n                    )\n                ;\n                    ResumeKnown = resume_point_unknown,\n                    acquire_temp_slot(slot_lval(redoip_slot(lval(curfr))),\n                        non_persistent_temp_slot, RedoipSlot, !CI),\n                    HijackType = ite_half_hijack(RedoipSlot),\n                    Code = singleton(\n                        llds_instr(\n                            assign(RedoipSlot, lval(redoip_slot(lval(curfr)))),\n                            \"prepare for half ite hijack\")\n                    )\n                )\n            ;\n                CurfrMaxfr = may_be_different,\n                acquire_temp_slot(slot_lval(redoip_slot(lval(maxfr))),\n                    non_persistent_temp_slot, RedoipSlot, !CI),\n                acquire_temp_slot(slot_lval(redofr_slot(lval(maxfr))),\n                    non_persistent_temp_slot, RedofrSlot, !CI),\n                acquire_temp_slot(slot_lval(maxfr),\n                    non_persistent_temp_slot, MaxfrSlot, !CI),\n                HijackType = ite_full_hijack(RedoipSlot, RedofrSlot,\n                    MaxfrSlot),\n                Code = from_list([\n                    llds_instr(\n                        assign(MaxfrSlot, lval(maxfr)),\n                        \"prepare for full ite hijack\"),\n                    llds_instr(\n                        assign(RedoipSlot, lval(redoip_slot(lval(maxfr)))),\n                        \"prepare for full ite hijack\"),\n                    llds_instr(\n                        assign(RedofrSlot, lval(redofr_slot(lval(maxfr)))),\n                        \"prepare for full ite hijack\"),\n                    llds_instr(\n                        assign(redofr_slot(lval(maxfr)), lval(curfr)),\n                        \"prepare for full ite hijack\")\n                ])\n            ),\n            MaybeRegionInfo = no\n        ),\n        inside_non_condition(!CI)\n    ),\n    HijackInfo = ite_info(ResumeKnown, CondEnv, HijackType, MaybeRegionInfo).\n\nite_enter_then(HijackInfo, ITEResumePoint, ThenCode, ElseCode, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints0, ResumeKnown0, CurfrMaxfr, _, Allow),\n    stack.det_pop(_, ResumePoints0, ResumePoints),\n    HijackInfo = ite_info(HijackResumeKnown, OldCondEnv, HijackType,\n        MaybeRegionInfo),\n    (\n        HijackType = ite_no_hijack,\n        expect(unify(MaybeRegionInfo, no), $module, $pred,\n            \"MaybeRegionInfo ite_no_hijack\"),\n        ThenCode = empty,\n        ElseCode = empty\n    ;\n        HijackType = ite_temp_frame(MaxfrSlot),\n        (\n            MaybeRegionInfo = no,\n            ThenCode = singleton(\n                % We can't remove the frame, it may not be on top.\n                llds_instr(assign(redoip_slot(lval(MaxfrSlot)),\n                    const(llconst_code_addr(do_fail))),\n                    \"soft cut for temp frame ite\")\n            ),\n            ElseCode = singleton(\n                % XXX search for assignments to maxfr\n                llds_instr(assign(maxfr, lval(prevfr_slot(lval(MaxfrSlot)))),\n                    \"restore maxfr for temp frame ite\")\n            )\n        ;\n            MaybeRegionInfo = yes(RegionInfo),\n            RegionInfo = ite_region_info(EmbeddedStackFrameId,\n                SuccessRecordSlot),\n            % XXX replace do_fail with ref to ResumePoint stack label\n            resume_point_stack_addr(ITEResumePoint, ITEStackResumeCodeAddr),\n            ThenCode = from_list([\n                llds_instr(assign(SuccessRecordSlot, const(llconst_true)),\n                    \"record success of the condition\"),\n                llds_instr(assign(redoip_slot(lval(MaxfrSlot)),\n                    const(llconst_code_addr(ITEStackResumeCodeAddr))),\n                    \"redirect to cut for temp frame ite\")\n            ]),\n            get_next_label(AfterRegionOp, !CI),\n            ElseCode = from_list([\n                llds_instr(assign(maxfr, lval(prevfr_slot(lval(MaxfrSlot)))),\n                    \"restore maxfr for temp frame ite\"),\n                llds_instr(if_val(unop(logical_not, lval(SuccessRecordSlot)),\n                    code_label(AfterRegionOp)),\n                    \"jump around if the condition never succeeded\"),\n                llds_instr(use_and_maybe_pop_region_frame(\n                    region_ite_nondet_cond_fail, EmbeddedStackFrameId),\n                    \"cleanup after the post-success failure of the condition\"),\n                llds_instr(goto(do_fail),\n                    \"the condition succeeded, so don't execute else branch\"),\n                llds_instr(label(AfterRegionOp),\n                    \"after region op\")\n            ])\n        )\n    ;\n        HijackType = ite_quarter_hijack,\n        expect(unify(MaybeRegionInfo, no), $module, $pred,\n            \"MaybeRegionInfo ite_quarter_hijack\"),\n        stack.det_top(ResumePoints, ResumePoint),\n        ( maybe_pick_stack_resume_point(ResumePoint, _, StackLabel) ->\n            LabelConst = const(llconst_code_addr(StackLabel)),\n            ThenCode = singleton(\n                llds_instr(assign(redoip_slot(lval(curfr)), LabelConst),\n                    \"restore redoip for quarter ite hijack\")\n            )\n        ;\n            % This can happen only if ResumePoint is unreachable from here.\n            ThenCode = empty\n        ),\n        ElseCode = ThenCode\n    ;\n        HijackType = ite_half_hijack(RedoipSlot),\n        expect(unify(MaybeRegionInfo, no), $module, $pred,\n            \"MaybeRegionInfo ite_half_hijack\"),\n        ThenCode = singleton(\n            llds_instr(assign(redoip_slot(lval(curfr)), lval(RedoipSlot)),\n                \"restore redoip for half ite hijack\")\n        ),\n        ElseCode = ThenCode\n    ;\n        HijackType = ite_full_hijack(RedoipSlot, RedofrSlot, MaxfrSlot),\n        expect(unify(MaybeRegionInfo, no), $module, $pred,\n            \"MaybeRegionInfo ite_full_hijack\"),\n        ThenCode = from_list([\n            llds_instr(assign(redoip_slot(lval(MaxfrSlot)), lval(RedoipSlot)),\n                \"restore redoip for full ite hijack\"),\n            llds_instr(assign(redofr_slot(lval(MaxfrSlot)), lval(RedofrSlot)),\n                \"restore redofr for full ite hijack\")\n        ]),\n        ElseCode = from_list([\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for full ite hijack\"),\n            llds_instr(assign(redofr_slot(lval(maxfr)), lval(RedofrSlot)),\n                \"restore redofr for full ite hijack\")\n        ])\n    ),\n    (\n        ResumeKnown0 = resume_point_unknown,\n        ResumeKnown = resume_point_unknown\n    ;\n        ResumeKnown0 = resume_point_known(_),\n        ResumeKnown = HijackResumeKnown\n    ),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr, OldCondEnv,\n        Allow),\n    set_fail_info(FailInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\n:- type simple_neg_info ==  fail_info.\n\nenter_simple_neg(ResumeVars, GoalInfo, FailInfo0, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    % The only reason why we push a resume point at all is to protect\n    % the variables in ResumeVars from becoming unknown; by including them\n    % in the domain of the resume point, we guarantee that they will become\n    % zombies instead of unknown if they die in the pre- or post-goal updates.\n    % Therefore the only part of ResumePoint that matters is the set of\n    % variables in the resume map; the other parts of ResumePoint\n    % (the locations, the code address) will not be referenced.\n    map.init(ResumeMap0),\n    make_fake_resume_map(ResumeVars, ResumeMap0, ResumeMap),\n    ResumePoint = orig_only(ResumeMap, do_redo),\n    effect_resume_point(ResumePoint, model_semi, Code, !CI),\n    expect(is_empty(Code), $module, $pred, \"nonempty code for simple neg\"),\n    pre_goal_update(GoalInfo, does_not_have_subgoals, !CI).\n\nleave_simple_neg(GoalInfo, FailInfo, !CI) :-\n    post_goal_update(GoalInfo, !CI),\n    set_fail_info(FailInfo, !CI).\n\n:- pred make_fake_resume_map(list(prog_var)::in,\n    map(prog_var, set(lval))::in, map(prog_var, set(lval))::out) is det.\n\nmake_fake_resume_map([], !ResumeMap).\nmake_fake_resume_map([Var | Vars], !ResumeMap) :-\n    % A visibly fake location.\n    Locns = set.make_singleton_set(reg(reg_r, -1)),\n    map.det_insert(Var, Locns, !ResumeMap),\n    make_fake_resume_map(Vars, !ResumeMap).\n\n%---------------------------------------------------------------------------%\n\n:- type det_commit_info\n    --->    det_commit_info(\n                % Location of saved maxfr.\n                maybe(lval),\n\n                % Location of saved ticket % counter and trail pointer.\n                maybe(pair(lval)),\n\n                maybe(region_commit_stack_frame)\n            ).\n\n:- type region_commit_stack_frame\n    --->    region_commit_stack_frame(\n                % The id of the region commit stack frame, which is emdedded\n                % in the current procedure's stack frame, and whose layout is:\n\n                % saved region_commit_stack_pointer\n                % saved region sequence number\n                % number of live nonprotected regions\n                % space reserved for the ids of live nonprotected regions\n\n                embedded_stack_frame_id,\n\n                % The list of temporary slots that constitute\n                % this embedded stack frame.\n                list(lval)\n            ).\n\nprepare_for_det_commit(AddTrailOps, AddRegionOps, ForwardLiveVarsBeforeGoal,\n        CommitGoalInfo, DetCommitInfo, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(_, _, CurfrMaxfr, _, _),\n    (\n        CurfrMaxfr = may_be_different,\n        acquire_temp_slot(slot_lval(maxfr), non_persistent_temp_slot,\n            MaxfrSlot, !CI),\n        SaveMaxfrCode = singleton(\n            llds_instr(save_maxfr(MaxfrSlot), \"save the value of maxfr\")\n        ),\n        MaybeMaxfrSlot = yes(MaxfrSlot)\n    ;\n        CurfrMaxfr = must_be_equal,\n        SaveMaxfrCode = empty,\n        MaybeMaxfrSlot = no\n    ),\n    maybe_save_trail_info(AddTrailOps, MaybeTrailSlots, SaveTrailCode, !CI),\n    maybe_save_region_commit_frame(AddRegionOps, ForwardLiveVarsBeforeGoal,\n        CommitGoalInfo, MaybeRegionCommitFrameInfo, SaveRegionCommitFrameCode,\n        !CI),\n    DetCommitInfo = det_commit_info(MaybeMaxfrSlot, MaybeTrailSlots,\n        MaybeRegionCommitFrameInfo),\n    Code = SaveMaxfrCode ++ SaveTrailCode ++ SaveRegionCommitFrameCode.\n\ngenerate_det_commit(DetCommitInfo, Code, !CI) :-\n    DetCommitInfo = det_commit_info(MaybeMaxfrSlot, MaybeTrailSlots,\n        MaybeRegionCommitFrameInfo),\n    (\n        MaybeMaxfrSlot = yes(MaxfrSlot),\n        RestoreMaxfrCode = singleton(\n            llds_instr(restore_maxfr(MaxfrSlot),\n                \"restore the value of maxfr - perform commit\")\n        ),\n        release_temp_slot(MaxfrSlot, non_persistent_temp_slot, !CI)\n    ;\n        MaybeMaxfrSlot = no,\n        RestoreMaxfrCode = singleton(\n            llds_instr(assign(maxfr, lval(curfr)),\n                \"restore the value of maxfr - perform commit\")\n        )\n    ),\n    maybe_restore_trail_info(MaybeTrailSlots, CommitTrailCode, _, !CI),\n    maybe_restore_region_commit_frame(MaybeRegionCommitFrameInfo,\n        SuccessRegionCode, _FailureRegionCode, !CI),\n    Code = RestoreMaxfrCode ++ CommitTrailCode ++ SuccessRegionCode.\n\n%---------------------------------------------------------------------------%\n\n:- type semi_commit_info\n    --->    semi_commit_info(\n                % Fail_info on entry.\n                fail_info,\n\n                resume_point_info,\n                commit_hijack_info,\n\n                % Location of saved ticket counter and trail pointer.\n                maybe(pair(lval)),\n\n                maybe(region_commit_stack_frame)\n            ).\n\n:- type commit_hijack_info\n    --->    commit_temp_frame(\n                % The stack slot in which we saved the old value of maxfr.\n                lval,\n\n                % Do we bracket the goal with MR_commit_mark and MR_commit_cut?\n                bool\n            )\n    ;       commit_quarter_hijack\n    ;       commit_half_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval\n            )\n    ;       commit_full_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval,\n\n                % The stack slot in which we saved the value\n                % of the hijacked redofr.\n                lval,\n\n                % The stack slot in which we saved the value of maxfr.\n                lval\n            ).\n\nprepare_for_semi_commit(AddTrailOps, AddRegionOps, ForwardLiveVarsBeforeGoal,\n        CommitGoalInfo, SemiCommitInfo, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints0, ResumeKnown, CurfrMaxfr, CondEnv,\n        Allow),\n    stack.det_top(ResumePoints0, TopResumePoint),\n    clone_resume_point(TopResumePoint, NewResumePoint, !CI),\n    stack.push(NewResumePoint, ResumePoints0, ResumePoints),\n    FailInfo = fail_info(ResumePoints, resume_point_known(has_been_done),\n        CurfrMaxfr, CondEnv, Allow),\n    set_fail_info(FailInfo, !CI),\n\n    pick_stack_resume_point(NewResumePoint, _, StackLabel),\n    StackLabelConst = const(llconst_code_addr(StackLabel)),\n    (\n        ( Allow = not_allowed ; CondEnv = inside_non_condition )\n    ->\n        acquire_temp_slot(slot_lval(maxfr), non_persistent_temp_slot,\n            MaxfrSlot, !CI),\n        MaxfrCode = singleton(\n            llds_instr(save_maxfr(MaxfrSlot),\n                \"prepare for temp frame commit\")\n        ),\n        create_temp_frame(StackLabel,\n            \"prepare for temp frame commit\", TempFrameCode, !CI),\n        get_globals(!.CI, Globals),\n        globals.lookup_bool_option(Globals, use_minimal_model_stack_copy_cut,\n            UseMinimalModelStackCopyCut),\n        HijackInfo = commit_temp_frame(MaxfrSlot, UseMinimalModelStackCopyCut),\n        (\n            UseMinimalModelStackCopyCut = yes,\n            % If the code we are committing across starts but does not complete\n            % the evaluation of a tabled subgoal, the cut will remove the\n            % generator's choice point, so that the evaluation of the subgoal\n            % will never be completed. We handle such \"dangling\" generators\n            % by removing them from the subgoal trie of the tabled procedure.\n            % This requires knowing what tabled subgoals are started inside\n            % commits, which is why we wrap the goal being committed across\n            % inside MR_commit_{mark,cut}.\n            Components = [\n                foreign_proc_raw_code(cannot_branch_away,\n                    proc_affects_liveness, live_lvals_info(set.init),\n                    \"\\t\\tMR_save_transient_registers();\\n\"),\n                foreign_proc_raw_code(cannot_branch_away,\n                    proc_does_not_affect_liveness, live_lvals_info(set.init),\n                    \"\\t\\tMR_commit_mark();\\n\"),\n                foreign_proc_raw_code(cannot_branch_away,\n                    proc_affects_liveness, live_lvals_info(set.init),\n                    \"\\t\\tMR_restore_transient_registers();\\n\")\n            ],\n            MD = proc_may_duplicate,\n            MarkCode = singleton(\n                llds_instr(foreign_proc_code([], Components,\n                    proc_will_not_call_mercury, no, no, no, no, no, no, MD),\n                    \"\")\n            )\n        ;\n            UseMinimalModelStackCopyCut = no,\n            MarkCode = empty\n        ),\n        HijackCode = MaxfrCode ++ TempFrameCode ++ MarkCode\n    ;\n        (\n            CurfrMaxfr = must_be_equal,\n            (\n                ResumeKnown = resume_point_known(has_been_done),\n                HijackInfo = commit_quarter_hijack,\n                HijackCode = singleton(\n                    llds_instr(assign(redoip_slot(lval(curfr)),\n                        StackLabelConst),\n                        \"hijack the redofr slot\")\n                )\n            ;\n                ( ResumeKnown = resume_point_known(wont_be_done)\n                ; ResumeKnown = resume_point_unknown\n                ),\n                acquire_temp_slot(slot_lval(redoip_slot(lval(curfr))),\n                    non_persistent_temp_slot, RedoipSlot, !CI),\n                HijackInfo = commit_half_hijack(RedoipSlot),\n                HijackCode = from_list([\n                    llds_instr(assign(RedoipSlot,\n                        lval(redoip_slot(lval(curfr)))),\n                        \"prepare for half commit hijack\"),\n                    llds_instr(assign(redoip_slot(lval(curfr)),\n                        StackLabelConst),\n                        \"hijack the redofr slot\")\n                ])\n            )\n        ;\n            CurfrMaxfr = may_be_different,\n            acquire_temp_slot(slot_lval(redoip_slot(lval(maxfr))),\n                non_persistent_temp_slot, RedoipSlot, !CI),\n            acquire_temp_slot(slot_lval(redofr_slot(lval(maxfr))),\n                non_persistent_temp_slot, RedofrSlot, !CI),\n            acquire_temp_slot(slot_lval(maxfr),\n                non_persistent_temp_slot, MaxfrSlot, !CI),\n            HijackInfo = commit_full_hijack(RedoipSlot, RedofrSlot, MaxfrSlot),\n            HijackCode = from_list([\n                llds_instr(assign(RedoipSlot, lval(redoip_slot(lval(maxfr)))),\n                    \"prepare for full commit hijack\"),\n                llds_instr(assign(RedofrSlot, lval(redofr_slot(lval(maxfr)))),\n                    \"prepare for full commit hijack\"),\n                llds_instr(save_maxfr(MaxfrSlot),\n                    \"prepare for full commit hijack\"),\n                llds_instr(assign(redofr_slot(lval(maxfr)), lval(curfr)),\n                    \"hijack the redofr slot\"),\n                llds_instr(assign(redoip_slot(lval(maxfr)), StackLabelConst),\n                    \"hijack the redoip slot\")\n            ])\n        )\n    ),\n    maybe_save_trail_info(AddTrailOps, MaybeTrailSlots, SaveTrailCode, !CI),\n    maybe_save_region_commit_frame(AddRegionOps, ForwardLiveVarsBeforeGoal,\n        CommitGoalInfo, MaybeRegionCommitFrameInfo, SaveRegionCommitFrameCode,\n        !CI),\n    SemiCommitInfo = semi_commit_info(FailInfo0, NewResumePoint,\n        HijackInfo, MaybeTrailSlots, MaybeRegionCommitFrameInfo),\n    Code = HijackCode ++ SaveTrailCode ++ SaveRegionCommitFrameCode.\n\ngenerate_semi_commit(SemiCommitInfo, Code, !CI) :-\n    SemiCommitInfo = semi_commit_info(FailInfo, ResumePoint,\n        HijackInfo, MaybeTrailSlots, MaybeRegionCommitFrameInfo),\n\n    set_fail_info(FailInfo, !CI),\n    % XXX Should release the temp slots in each arm of the switch.\n    (\n        HijackInfo = commit_temp_frame(MaxfrSlot, UseMinimalModel),\n        MaxfrCode = singleton(\n            llds_instr(restore_maxfr(MaxfrSlot),\n                \"restore maxfr for temp frame hijack\")\n        ),\n        (\n            UseMinimalModel = yes,\n            % See the comment in prepare_for_semi_commit above.\n            Components = [\n                foreign_proc_raw_code(cannot_branch_away,\n                    proc_does_not_affect_liveness, live_lvals_info(set.init),\n                    \"\\t\\tMR_commit_cut();\\n\")\n            ],\n            MD = proc_may_duplicate,\n            CutCode = singleton(\n                llds_instr(foreign_proc_code([], Components,\n                    proc_will_not_call_mercury, no, no, no, no, no, no, MD),\n                    \"commit for temp frame hijack\")\n            )\n        ;\n            UseMinimalModel = no,\n            CutCode = empty\n        ),\n        SuccessUndoCode = MaxfrCode ++ CutCode,\n        FailureUndoCode = MaxfrCode ++ CutCode\n    ;\n        HijackInfo = commit_quarter_hijack,\n        FailInfo = fail_info(ResumePoints, _, _, _, _),\n        stack.det_top(ResumePoints, TopResumePoint),\n        pick_stack_resume_point(TopResumePoint, _, StackLabel),\n        StackLabelConst = const(llconst_code_addr(StackLabel)),\n        SuccessUndoCode = from_list([\n            llds_instr(assign(maxfr, lval(curfr)),\n                \"restore maxfr for quarter commit hijack\"),\n            llds_instr(assign(redoip_slot(lval(maxfr)), StackLabelConst),\n                \"restore redoip for quarter commit hijack\")\n        ]),\n        FailureUndoCode = singleton(\n            llds_instr(assign(redoip_slot(lval(maxfr)), StackLabelConst),\n                \"restore redoip for quarter commit hijack\")\n        )\n    ;\n        HijackInfo = commit_half_hijack(RedoipSlot),\n        SuccessUndoCode = from_list([\n            llds_instr(assign(maxfr, lval(curfr)),\n                \"restore maxfr for half commit hijack\"),\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for half commit hijack\")\n        ]),\n        FailureUndoCode = singleton(\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for half commit hijack\")\n        )\n    ;\n        HijackInfo = commit_full_hijack(RedoipSlot, RedofrSlot, MaxfrSlot),\n        SuccessUndoCode = from_list([\n            llds_instr(restore_maxfr(MaxfrSlot),\n                \"restore maxfr for full commit hijack\"),\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for full commit hijack\"),\n            llds_instr(assign(redofr_slot(lval(maxfr)), lval(RedofrSlot)),\n                \"restore redofr for full commit hijack\")\n        ]),\n        FailureUndoCode = from_list([\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for full commit hijack\"),\n            llds_instr(assign(redofr_slot(lval(maxfr)), lval(RedofrSlot)),\n                \"restore redofr for full commit hijack\")\n        ])\n    ),\n\n    remember_position(!.CI, AfterCommit),\n    generate_resume_point(ResumePoint, ResumePointCode, !CI),\n    generate_failure(FailCode, !CI),\n    reset_to_position(AfterCommit, !CI),\n\n    maybe_restore_trail_info(MaybeTrailSlots, CommitTrailCode,\n        RestoreTrailCode, !CI),\n    maybe_restore_region_commit_frame(MaybeRegionCommitFrameInfo,\n        SuccessRegionCode, FailureRegionCode, !CI),\n\n    get_next_label(SuccLabel, !CI),\n    GotoSuccLabel = singleton(\n        llds_instr(goto(code_label(SuccLabel)), \"Jump to success continuation\")\n    ),\n    SuccLabelCode = singleton(\n        llds_instr(label(SuccLabel), \"Success continuation\")\n    ),\n    SuccessCode = SuccessUndoCode ++ CommitTrailCode ++ SuccessRegionCode,\n    FailureCode = ResumePointCode ++ FailureUndoCode ++ RestoreTrailCode ++\n        FailureRegionCode ++ FailCode,\n    Code = SuccessCode ++ GotoSuccLabel ++ FailureCode ++ SuccLabelCode.\n\n%---------------------------------------------------------------------------%\n\n:- pred maybe_save_region_commit_frame(add_region_ops::in, set_of_progvar::in,\n    hlds_goal_info::in, maybe(region_commit_stack_frame)::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\nmaybe_save_region_commit_frame(AddRegionOps, _ForwardLiveVarsBeforeGoal,\n        CommitGoalInfo, MaybeRegionCommitFrameInfo, Code, !CI) :-\n    (\n        AddRegionOps = do_not_add_region_ops,\n        MaybeRegionCommitFrameInfo = no,\n        Code = empty\n    ;\n        AddRegionOps = add_region_ops,\n        MaybeRbmmInfo = goal_info_get_maybe_rbmm(CommitGoalInfo),\n        (\n            MaybeRbmmInfo = no,\n            MaybeRegionCommitFrameInfo = no,\n            Code = empty\n        ;\n            MaybeRbmmInfo = yes(RbmmInfo),\n            RbmmInfo = rbmm_goal_info(_, CommitRemovedRegionVars, _, _, _),\n\n            RemovedRegionVarList = set.to_sorted_list(CommitRemovedRegionVars),\n\n            NumRemovedRegionVars = list.length(RemovedRegionVarList),\n\n            code_info.get_globals(!.CI, Globals),\n            globals.lookup_int_option(Globals, size_region_commit_fixed,\n                FixedSize),\n            globals.lookup_int_option(Globals, size_region_commit_entry,\n                EntrySize),\n            FrameSize = FixedSize + EntrySize * NumRemovedRegionVars,\n            Items = list.duplicate(FrameSize, slot_region_commit),\n            acquire_several_temp_slots(Items, non_persistent_temp_slot,\n                StackVars, MainStackId, FirstSlotNum, LastSlotNum, !CI),\n            EmbeddedStackFrame = embedded_stack_frame_id(MainStackId,\n                FirstSlotNum, LastSlotNum),\n            FirstSavedRegionAddr = first_nonfixed_embedded_slot_addr(\n                EmbeddedStackFrame, FixedSize),\n            acquire_reg(reg_r, NumRegLval, !CI),\n            acquire_reg(reg_r, AddrRegLval, !CI),\n            PushInitCode = from_list([\n                llds_instr(\n                    push_region_frame(region_stack_commit, EmbeddedStackFrame),\n                    \"Save stack pointer of embedded region commit stack\"),\n                llds_instr(\n                    assign(NumRegLval, const(llconst_int(0))),\n                    \"Initialize number of unprotected live regions\"),\n                llds_instr(\n                    assign(AddrRegLval, FirstSavedRegionAddr),\n                    \"Initialize pointer to the next unprotected live\" ++\n                    \" region slot\")\n            ]),\n            save_unprotected_live_regions(NumRegLval, AddrRegLval,\n                EmbeddedStackFrame, RemovedRegionVarList, FillCode, !CI),\n            SetCode = singleton(\n                llds_instr(\n                    region_set_fixed_slot(region_set_commit_num_entries,\n                        EmbeddedStackFrame, lval(NumRegLval)),\n                    \"Store the number of unprotected live regions\")\n            ),\n            release_reg(NumRegLval, !CI),\n            release_reg(AddrRegLval, !CI),\n\n            RegionCommitFrameInfo =\n                region_commit_stack_frame(EmbeddedStackFrame, StackVars),\n            MaybeRegionCommitFrameInfo = yes(RegionCommitFrameInfo),\n\n            Code = PushInitCode ++ FillCode ++ SetCode\n        )\n    ).\n\n:- pred save_unprotected_live_regions(lval::in, lval::in,\n    embedded_stack_frame_id::in, list(prog_var)::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\nsave_unprotected_live_regions(_, _, _, [], empty, !CI).\nsave_unprotected_live_regions(NumLval, AddrLval, EmbeddedStackFrame,\n        [RegionVar | RegionVars], Code ++ Codes, !CI) :-\n    produce_variable(RegionVar, ProduceVarCode, RegionVarRval, !CI),\n    SaveCode = singleton(\n        llds_instr(\n            region_fill_frame(region_fill_commit, EmbeddedStackFrame,\n                RegionVarRval, NumLval, AddrLval),\n            \"Save the region in the commit stack frame if it is unprotected\")\n    ),\n    Code = ProduceVarCode ++ SaveCode,\n    save_unprotected_live_regions(NumLval, AddrLval, EmbeddedStackFrame,\n        RegionVars, Codes, !CI).\n\n:- pred maybe_restore_region_commit_frame(maybe(region_commit_stack_frame)::in,\n    llds_code::out, llds_code::out, code_info::in, code_info::out) is det.\n\nmaybe_restore_region_commit_frame(MaybeRegionCommitFrameInfo,\n        SuccessCode, FailureCode, !CI) :-\n    (\n        MaybeRegionCommitFrameInfo = no,\n        SuccessCode = empty,\n        FailureCode = empty\n    ;\n        MaybeRegionCommitFrameInfo = yes(RegionCommitFrameInfo),\n        RegionCommitFrameInfo = region_commit_stack_frame(EmbeddedStackFrame,\n            StackVars),\n        SuccessCode = singleton(\n            llds_instr(\n                use_and_maybe_pop_region_frame(region_commit_success,\n                    EmbeddedStackFrame),\n                \"Destroy removed regions protected by cut away disjunctions\")\n        ),\n        FailureCode = singleton(\n            llds_instr(\n                use_and_maybe_pop_region_frame(region_commit_failure,\n                    EmbeddedStackFrame),\n                \"Undo the creation of the commit frame\")\n        ),\n        release_several_temp_slots(StackVars, non_persistent_temp_slot, !CI)\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- pred inside_non_condition(code_info::in, code_info::out) is det.\n\ninside_non_condition(!CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr, _, Allow),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr,\n        inside_non_condition, Allow),\n    set_fail_info(FailInfo, !CI).\n\n:- pred create_temp_frame(code_addr::in, string::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\ncreate_temp_frame(Redoip, Comment, Code, !CI) :-\n    ( get_proc_model(!.CI) = model_non ->\n        Kind = nondet_stack_proc\n    ;\n        Kind = det_stack_proc\n    ),\n    Code = singleton(\n        llds_instr(mkframe(temp_frame(Kind), yes(Redoip)), Comment)\n    ),\n    set_created_temp_frame(yes, !CI),\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints, ResumeKnown, _, CondEnv, Allow),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, may_be_different,\n        CondEnv, Allow),\n    set_fail_info(FailInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\neffect_resume_point(ResumePoint, CodeModel, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints0, _ResumeKnown, CurfrMaxfr,\n        CondEnv, Allow),\n    ( stack.top(ResumePoints0, OldResumePoint) ->\n        pick_first_resume_point(OldResumePoint, OldMap, _),\n        pick_first_resume_point(ResumePoint, NewMap, _),\n        map.keys(OldMap, OldKeys),\n        map.keys(NewMap, NewKeys),\n        set.list_to_set(OldKeys, OldKeySet),\n        set.list_to_set(NewKeys, NewKeySet),\n        expect(set.subset(OldKeySet, NewKeySet), $module, $pred,\n            \"non-nested resume point variable sets\")\n    ;\n        true\n    ),\n    stack.push(ResumePoint, ResumePoints0, ResumePoints),\n    (\n        CodeModel = model_non,\n        pick_stack_resume_point(ResumePoint, _, StackLabel),\n        LabelConst = const(llconst_code_addr(StackLabel)),\n        Code = singleton(\n            llds_instr(assign(redoip_slot(lval(maxfr)), LabelConst),\n                \"hijack redoip to effect resume point\")\n        ),\n        RedoipUpdate = has_been_done\n    ;\n        ( CodeModel = model_det\n        ; CodeModel = model_semi\n        ),\n        Code = empty,\n        RedoipUpdate = wont_be_done\n    ),\n    FailInfo = fail_info(ResumePoints, resume_point_known(RedoipUpdate),\n        CurfrMaxfr, CondEnv, Allow),\n    set_fail_info(FailInfo, !CI).\n\npop_resume_point(!CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints0, ResumeKnown, CurfrMaxfr,\n        CondEnv, Allow),\n    stack.det_pop(_, ResumePoints0, ResumePoints),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr,\n        CondEnv, Allow),\n    set_fail_info(FailInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\ntop_resume_point(CI, ResumePoint) :-\n    get_fail_info(CI, FailInfo),\n    FailInfo = fail_info(ResumePoints, _, _, _, _),\n    stack.det_top(ResumePoints, ResumePoint).\n\nset_resume_point_to_unknown(!CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints, _, CurfrMaxfr, CondEnv, Allow),\n    FailInfo = fail_info(ResumePoints, resume_point_unknown,\n        CurfrMaxfr, CondEnv, Allow),\n    set_fail_info(FailInfo, !CI).\n\nset_resume_point_and_frame_to_unknown(!CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints, _, _, CondEnv, Allow),\n    FailInfo = fail_info(ResumePoints, resume_point_unknown, may_be_different,\n        CondEnv, Allow),\n    set_fail_info(FailInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\ngenerate_failure(Code, !CI) :-\n    get_fail_info(!.CI, FailInfo),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, _, _, _),\n    (\n        ResumeKnown = resume_point_known(_),\n        stack.det_top(ResumePoints, TopResumePoint),\n        ( pick_matching_resume_addr(!.CI, TopResumePoint, FailureAddress0) ->\n            FailureAddress = FailureAddress0,\n            PlaceCode = empty\n        ;\n            pick_first_resume_point(TopResumePoint, Map, FailureAddress),\n            map.to_assoc_list(Map, AssocList),\n            remember_position(!.CI, CurPos),\n            pick_and_place_vars(AssocList, _, PlaceCode, !CI),\n            reset_to_position(CurPos, !CI)\n        ),\n        BranchCode = singleton(llds_instr(goto(FailureAddress), \"fail\")),\n        Code = PlaceCode ++ BranchCode\n    ;\n        ResumeKnown = resume_point_unknown,\n        Code = singleton(llds_instr(goto(do_redo), \"fail\"))\n    ).\n\nfail_if_rval_is_false(Rval0, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, _, _, _),\n    (\n        ResumeKnown = resume_point_known(_),\n        stack.det_top(ResumePoints, TopResumePoint),\n        ( pick_matching_resume_addr(!.CI, TopResumePoint, FailureAddress0) ->\n            % We branch away if the test *fails*\n            code_util.neg_rval(Rval0, Rval),\n            Code = singleton(\n                llds_instr(if_val(Rval, FailureAddress0), \"Test for failure\")\n            )\n        ;\n            pick_first_resume_point(TopResumePoint, Map, FailureAddress),\n            map.to_assoc_list(Map, AssocList),\n            get_next_label(SuccessLabel, !CI),\n            remember_position(!.CI, CurPos),\n            pick_and_place_vars(AssocList, _, PlaceCode, !CI),\n            reset_to_position(CurPos, !CI),\n            SuccessAddress = code_label(SuccessLabel),\n            % We branch away if the test *fails*, therefore if the test\n            % succeeds, we branch around the code that moves variables to\n            % their failure locations and branches away to the failure\n            % continuation.\n            TestCode = singleton(\n                llds_instr(if_val(Rval0, SuccessAddress), \"Test for failure\")\n            ),\n            TailCode = from_list([\n                llds_instr(goto(FailureAddress), \"Goto failure\"),\n                llds_instr(label(SuccessLabel), \"Success continuation\")\n            ]),\n            Code = TestCode ++ PlaceCode ++ TailCode\n        )\n    ;\n        ResumeKnown = resume_point_unknown,\n        % We branch away if the test *fails*\n        code_util.neg_rval(Rval0, Rval),\n        Code = singleton(\n            llds_instr(if_val(Rval, do_redo), \"Test for failure\")\n        )\n    ).\n\n%---------------------------------------------------------------------------%\n\nfailure_is_direct_branch(CI, CodeAddr) :-\n    get_fail_info(CI, FailInfo),\n    FailInfo = fail_info(ResumePoints, resume_point_known(_), _, _, _),\n    stack.top(ResumePoints, TopResumePoint),\n    pick_matching_resume_addr(CI, TopResumePoint, CodeAddr).\n\nmay_use_nondet_tailcall(CI, TailCallStatus) :-\n    get_fail_info(CI, FailInfo),\n    FailInfo = fail_info(ResumePoints0, ResumeKnown, _, _, _),\n    (\n        stack.pop(ResumePoint1, ResumePoints0, ResumePoints1),\n        stack.is_empty(ResumePoints1),\n        ResumePoint1 = stack_only(_, do_fail)\n    ->\n        (\n            ResumeKnown = resume_point_known(_),\n            TailCallStatus = unchecked_tail_call\n        ;\n            ResumeKnown = resume_point_unknown,\n            TailCallStatus = checked_tail_call\n        )\n    ;\n        TailCallStatus = no_tail_call\n    ).\n\n%---------------------------------------------------------------------------%\n\n    % See whether the current locations of variables match the locations\n    % associated with any of the options in the given failure map.\n    % If yes, return the code_addr of that option.\n    %\n:- pred pick_matching_resume_addr(code_info::in,\n    resume_point_info::in, code_addr::out) is semidet.\n\npick_matching_resume_addr(CI, ResumeMaps, Addr) :-\n    variable_locations(CI, CurLocs),\n    (\n        ResumeMaps = orig_only(Map1, Addr1),\n        ( match_resume_loc(Map1, CurLocs) ->\n            Addr = Addr1\n        ;\n            fail\n        )\n    ;\n        ResumeMaps = stack_only(Map1, Addr1),\n        ( match_resume_loc(Map1, CurLocs) ->\n            Addr = Addr1\n        ;\n            fail\n        )\n    ;\n        ResumeMaps = orig_and_stack(Map1, Addr1, Map2, Addr2),\n        ( match_resume_loc(Map1, CurLocs) ->\n            Addr = Addr1\n        ; match_resume_loc(Map2, CurLocs) ->\n            Addr = Addr2\n        ;\n            fail\n        )\n    ;\n        ResumeMaps = stack_and_orig(Map1, Addr1, Map2, Addr2),\n        ( match_resume_loc(Map1, CurLocs) ->\n            Addr = Addr1\n        ; match_resume_loc(Map2, CurLocs) ->\n            Addr = Addr2\n        ;\n            fail\n        )\n    ).\n\n:- pred match_resume_loc(resume_map::in, resume_map::in) is semidet.\n\nmatch_resume_loc(Map, Locations0) :-\n    map.keys(Map, KeyList),\n    set.list_to_set(KeyList, Keys),\n    map.select(Locations0, Keys, Locations),\n    map.to_assoc_list(Locations, List),\n    all_vars_match_resume_map(Map, List).\n\n:- pred all_vars_match_resume_map(resume_map::in,\n    assoc_list(prog_var, set(lval))::in) is semidet.\n\nall_vars_match_resume_map(_Map, []).\nall_vars_match_resume_map(Map, [Var - Actual | VarsActuals]) :-\n    map.search(Map, Var, Lvals),\n    set.subset(Lvals, Actual),\n    all_vars_match_resume_map(Map, VarsActuals).\n\n:- pred pick_first_resume_point(resume_point_info::in,\n    resume_map::out, code_addr::out) is det.\n\npick_first_resume_point(orig_only(Map, Addr), Map, Addr).\npick_first_resume_point(stack_only(Map, Addr), Map, Addr).\npick_first_resume_point(orig_and_stack(Map, Addr, _, _), Map, Addr).\npick_first_resume_point(stack_and_orig(Map, Addr, _, _), Map, Addr).\n\n:- pred pick_stack_resume_point(resume_point_info::in,\n    resume_map::out, code_addr::out) is det.\n\npick_stack_resume_point(ResumePoint, Map, Addr) :-\n    ( maybe_pick_stack_resume_point(ResumePoint, Map1, Addr1) ->\n        Map = Map1,\n        Addr = Addr1\n    ;\n        unexpected($module, $pred, \"no stack resume point\")\n    ).\n\n:- pred maybe_pick_stack_resume_point(resume_point_info::in,\n    resume_map::out, code_addr::out) is semidet.\n\nmaybe_pick_stack_resume_point(stack_only(Map, Addr), Map, Addr).\nmaybe_pick_stack_resume_point(orig_and_stack(_, _, Map, Addr),\n    Map, Addr).\nmaybe_pick_stack_resume_point(stack_and_orig(Map, Addr, _, _),\n    Map, Addr).\n\n%---------------------------------------------------------------------------%\n\nproduce_vars([], Map, empty, !CI) :-\n    map.init(Map).\nproduce_vars([Var | Vars], Map, Code, !CI) :-\n    produce_vars(Vars, Map0, CodeVars, !CI),\n    produce_variable_in_reg_or_stack(Var, CodeVar, Lval, !CI),\n    Lvals = set.make_singleton_set(Lval),\n    map.set(Var, Lvals, Map0, Map),\n    Code = CodeVars ++ CodeVar.\n\nflush_resume_vars_to_stack(Code, !CI) :-\n    compute_resume_var_stack_locs(!.CI, VarLocs),\n    place_vars(VarLocs, Code, !CI).\n\n:- pred compute_resume_var_stack_locs(code_info::in,\n    assoc_list(prog_var, lval)::out) is det.\n\ncompute_resume_var_stack_locs(CI, VarLocs) :-\n    get_fail_info(CI, FailInfo),\n    FailInfo = fail_info(ResumePointStack, _, _, _, _),\n    stack.det_top(ResumePointStack, ResumePoint),\n    pick_stack_resume_point(ResumePoint, StackMap, _),\n    map.to_assoc_list(StackMap, VarLocSets),\n    pick_var_places(VarLocSets, VarLocs).\n\n%---------------------------------------------------------------------------%\n\n:- pred init_fail_info(code_model::in, maybe(set_of_progvar)::in,\n    resume_point_info::out, code_info::in, code_info::out) is det.\n\ninit_fail_info(CodeModel, MaybeFailVars, ResumePoint, !CI) :-\n    (\n        CodeModel = model_det,\n        get_next_label(ResumeLabel, !CI),\n        ResumeAddress = code_label(ResumeLabel),\n        ResumeKnown = resume_point_unknown,\n        CurfrMaxfr = may_be_different\n    ;\n        CodeModel = model_semi,\n        % The resume point for this label will be part of the procedure epilog.\n        get_next_label(ResumeLabel, !CI),\n        ResumeAddress = code_label(ResumeLabel),\n        ResumeKnown = resume_point_known(wont_be_done),\n        CurfrMaxfr = may_be_different\n    ;\n        CodeModel = model_non,\n        (\n            MaybeFailVars = yes(_),\n            get_next_label(ResumeLabel, !CI),\n            ResumeAddress = code_label(ResumeLabel)\n        ;\n            MaybeFailVars = no,\n            ResumeAddress = do_fail\n        ),\n        ResumeKnown = resume_point_known(has_been_done),\n        CurfrMaxfr = must_be_equal\n    ),\n    (\n        MaybeFailVars = yes(FailVars),\n        get_stack_slots(!.CI, StackSlots),\n        map.select_sorted_list(StackSlots, set_of_var.to_sorted_list(FailVars),\n            AbsStackMap),\n        map.to_assoc_list(AbsStackMap, AbsStackList),\n        StackList0 = assoc_list.map_values_only(stack_slot_to_lval,\n            AbsStackList),\n        make_singleton_sets(StackList0, StackList),\n        map.from_sorted_assoc_list(StackList, StackMap)\n    ;\n        MaybeFailVars = no,\n        map.init(StackMap)\n    ),\n    ResumePoint = stack_only(StackMap, ResumeAddress),\n    stack.init(ResumeStack0),\n    stack.push(ResumePoint, ResumeStack0, ResumeStack),\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(_, _, _, _, Allow),\n    FailInfo = fail_info(ResumeStack, ResumeKnown, CurfrMaxfr,\n        not_inside_non_condition, Allow),\n    set_fail_info(FailInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\nmake_resume_point(ResumeVars, ResumeLocs, FullMap, ResumePoint, !CI) :-\n    get_stack_slots(!.CI, StackSlots),\n    map.select_sorted_list(FullMap, ResumeVars, OrigMap),\n    (\n        ResumeLocs = resume_locs_orig_only,\n        get_next_label(OrigLabel, !CI),\n        OrigAddr = code_label(OrigLabel),\n        ResumePoint = orig_only(OrigMap, OrigAddr),\n        trace [compiletime(flag(\"codegen_goal\")), io(!IO)] (\n            ( should_trace_code_gen(!.CI) ->\n                code_info.get_varset(!.CI, VarSet),\n                io.write_string(\"orig_only\\n\", !IO),\n                output_resume_map(VarSet, OrigMap, !IO),\n                io.flush_output(!IO)\n            ;\n                true\n            )\n        )\n    ;\n        ResumeLocs = resume_locs_stack_only,\n        make_stack_resume_map(ResumeVars, StackSlots, StackMap),\n        get_next_label(StackLabel, !CI),\n        StackAddr = code_label(StackLabel),\n        ResumePoint = stack_only(StackMap, StackAddr),\n        trace [compiletime(flag(\"codegen_goal\")), io(!IO)] (\n            ( should_trace_code_gen(!.CI) ->\n                code_info.get_varset(!.CI, VarSet),\n                io.write_string(\"stack_only\\n\", !IO),\n                output_resume_map(VarSet, StackMap, !IO),\n                io.flush_output(!IO)\n            ;\n                true\n            )\n        )\n    ;\n        ResumeLocs = resume_locs_orig_and_stack,\n        make_stack_resume_map(ResumeVars, StackSlots, StackMap),\n        get_next_label(OrigLabel, !CI),\n        OrigAddr = code_label(OrigLabel),\n        get_next_label(StackLabel, !CI),\n        StackAddr = code_label(StackLabel),\n        ResumePoint = orig_and_stack(OrigMap, OrigAddr, StackMap, StackAddr),\n        trace [compiletime(flag(\"codegen_goal\")), io(!IO)] (\n            ( should_trace_code_gen(!.CI) ->\n                code_info.get_varset(!.CI, VarSet),\n                io.write_string(\"stack_and_orig\\n\", !IO),\n                io.write_string(\"orig:\\n\", !IO),\n                output_resume_map(VarSet, OrigMap, !IO),\n                io.write_string(\"stack:\\n\", !IO),\n                output_resume_map(VarSet, StackMap, !IO),\n                io.flush_output(!IO)\n            ;\n                true\n            )\n        )\n    ;\n        ResumeLocs = resume_locs_stack_and_orig,\n        make_stack_resume_map(ResumeVars, StackSlots, StackMap),\n        get_next_label(StackLabel, !CI),\n        StackAddr = code_label(StackLabel),\n        get_next_label(OrigLabel, !CI),\n        OrigAddr = code_label(OrigLabel),\n        ResumePoint = stack_and_orig(StackMap, StackAddr, OrigMap, OrigAddr),\n        trace [compiletime(flag(\"codegen_goal\")), io(!IO)] (\n            ( should_trace_code_gen(!.CI) ->\n                code_info.get_varset(!.CI, VarSet),\n                io.write_string(\"stack_and_orig\\n\", !IO),\n                io.write_string(\"stack:\\n\", !IO),\n                output_resume_map(VarSet, StackMap, !IO),\n                io.write_string(\"orig:\\n\", !IO),\n                output_resume_map(VarSet, OrigMap, !IO),\n                io.flush_output(!IO)\n            ;\n                true\n            )\n        )\n    ).\n\n:- pred make_stack_resume_map(list(prog_var)::in, stack_slots::in,\n    map(prog_var, set(lval))::out) is det.\n\nmake_stack_resume_map(ResumeVars, StackSlots, StackMap) :-\n    map.select_sorted_list(StackSlots, ResumeVars, StackMap0),\n    map.to_assoc_list(StackMap0, AbsStackList),\n    StackList0 = assoc_list.map_values_only(stack_slot_to_lval, AbsStackList),\n    make_singleton_sets(StackList0, StackList),\n    map.from_sorted_assoc_list(StackList, StackMap).\n\n:- pred make_singleton_sets(assoc_list(prog_var, lval)::in,\n    assoc_list(prog_var, set(lval))::out) is det.\n\nmake_singleton_sets([], []).\nmake_singleton_sets([Var - Lval | Tail], [Var - Lvals | SetTail]) :-\n    Lvals = set.make_singleton_set(Lval),\n    make_singleton_sets(Tail, SetTail).\n\n%---------------------------------------------------------------------------%\n\n    % The code we generate for a resumption point looks like this:\n    %\n    % label(StackLabel)\n    % <assume variables are where StackMap says they are>\n    % <copy variables to their locations according to OrigMap>\n    % label(OrigLabel)\n    % <assume variables are where OrigMap says they are>\n    %\n    % Failures at different points may cause control to arrive at\n    % the resumption point via either label, which is why the last\n    % line is necessary.\n    %\n    % The idea is that failures from other procedures will go to\n    % StackLabel, and that failures from this procedure while\n    % everything is in its original place will go to OrigLabel.\n    % Failures from this procedure where not everything is in its\n    % original place can go to either, after moving the resume variables\n    % to the places where the label expects them.\n    %\n    % The above layout (stack, then orig) is the most common. However,\n    % liveness.m may decide that one or other of the two labels will\n    % never be referred to (e.g. because there are no calls inside\n    % the range of effect of the resumption point or because a call\n    % follows immediately after the establishment of the resumption\n    % point), or that it would be more efficient to put the two labels\n    % in the other order (e.g. because the code after the resumption point\n    % needs most of the variables in their stack slots).\n\ngenerate_resume_point(ResumePoint, Code, !CI) :-\n    (\n        ResumePoint = orig_only(Map1, Addr1),\n        extract_label_from_code_addr(Addr1, Label1),\n        Code = singleton(\n            llds_instr(label(Label1), \"orig only failure continuation\")\n        ),\n        set_var_locations(Map1, !CI)\n    ;\n        ResumePoint = stack_only(Map1, Addr1),\n        extract_label_from_code_addr(Addr1, Label1),\n        Code = singleton(\n            llds_instr(label(Label1), \"stack only failure continuation\")\n        ),\n        set_var_locations(Map1, !CI),\n        generate_resume_layout(Label1, Map1, !CI)\n    ;\n        ResumePoint = stack_and_orig(Map1, Addr1, Map2, Addr2),\n        extract_label_from_code_addr(Addr1, Label1),\n        extract_label_from_code_addr(Addr2, Label2),\n        Label1Code = singleton(\n            llds_instr(label(Label1), \"stack failure continuation before orig\")\n        ),\n        set_var_locations(Map1, !CI),\n        generate_resume_layout(Label1, Map1, !CI),\n        map.to_assoc_list(Map2, AssocList2),\n        place_resume_vars(AssocList2, PlaceCode, !CI),\n        Label2Code = singleton(\n            llds_instr(label(Label2), \"orig failure continuation after stack\")\n        ),\n        set_var_locations(Map2, !CI),\n        Code = Label1Code ++ PlaceCode ++ Label2Code\n    ;\n        ResumePoint = orig_and_stack(Map1, Addr1, Map2, Addr2),\n        extract_label_from_code_addr(Addr1, Label1),\n        extract_label_from_code_addr(Addr2, Label2),\n        Label1Code = singleton(\n            llds_instr(label(Label1), \"orig failure continuation before stack\")\n        ),\n        set_var_locations(Map1, !CI),\n        map.to_assoc_list(Map2, AssocList2),\n        place_resume_vars(AssocList2, PlaceCode, !CI),\n        Label2Code = singleton(\n            llds_instr(label(Label2), \"stack failure continuation after orig\")\n        ),\n        set_var_locations(Map2, !CI),\n        generate_resume_layout(Label2, Map2, !CI),\n        Code = Label1Code ++ PlaceCode ++ Label2Code\n    ).\n\n:- pred extract_label_from_code_addr(code_addr::in, label::out) is det.\n\nextract_label_from_code_addr(CodeAddr, Label) :-\n    ( CodeAddr = code_label(Label0) ->\n        Label = Label0\n    ;\n        unexpected($module, $pred, \"non-label\")\n    ).\n\n:- pred place_resume_vars(assoc_list(prog_var, set(lval))::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\nplace_resume_vars([], empty, !CI).\nplace_resume_vars([Var - TargetSet | Rest], Code, !CI) :-\n    set.to_sorted_list(TargetSet, Targets),\n    place_resume_var(Var, Targets, FirstCode, !CI),\n    place_resume_vars(Rest, RestCode, !CI),\n    Code = FirstCode ++ RestCode.\n\n:- pred place_resume_var(prog_var::in, list(lval)::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\nplace_resume_var(_Var, [], empty, !CI).\nplace_resume_var(Var, [Target | Targets], Code, !CI) :-\n    place_var(Var, Target, FirstCode, !CI),\n    place_resume_var(Var, Targets, RestCode, !CI),\n    Code = FirstCode ++ RestCode.\n\n    % Reset the code generator's database of what is where.\n    % Remember that the variables in the map are available in their\n    % associated rvals; forget about all other variables.\n    %\n:- pred set_var_locations(resume_map::in,\n    code_info::in, code_info::out) is det.\n\nset_var_locations(Map, !CI) :-\n    map.to_assoc_list(Map, LvalList0),\n    flatten_varlval_list(LvalList0, LvalList),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    reinit_var_locn_state(LvalList, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n:- pred flatten_varlval_list(assoc_list(prog_var, set(lval))::in,\n    assoc_list(prog_var, lval)::out) is det.\n\nflatten_varlval_list([], []).\nflatten_varlval_list([V - Rvals | Rest0], All) :-\n    flatten_varlval_list(Rest0, Rest),\n    set.to_sorted_list(Rvals, RvalList),\n    flatten_varlval_list_2(RvalList, V, Rest1),\n    list.append(Rest1, Rest, All).\n\n:- pred flatten_varlval_list_2(list(lval)::in, prog_var::in,\n    assoc_list(prog_var, lval)::out) is det.\n\nflatten_varlval_list_2([], _V, []).\nflatten_varlval_list_2([R | Rs], V, [V - R | Rest]) :-\n    flatten_varlval_list_2(Rs, V, Rest).\n\nresume_point_vars(ResumePoint, Vars) :-\n    pick_first_resume_point(ResumePoint, ResumeMap, _),\n    map.keys(ResumeMap, Vars).\n\nresume_point_stack_addr(ResumePoint, StackAddr) :-\n    pick_stack_resume_point(ResumePoint, _, StackAddr).\n\n%---------------------------------------------------------------------------%\n\n:- pred maybe_save_trail_info(add_trail_ops::in, maybe(pair(lval))::out,\n    llds_code::out, code_info::in, code_info::out) is det.\n\nmaybe_save_trail_info(AddTrailOps, MaybeTrailSlots, SaveTrailCode, !CI) :-\n    (\n        AddTrailOps = add_trail_ops,\n        acquire_temp_slot(slot_ticket_counter, non_persistent_temp_slot,\n            CounterSlot, !CI),\n        acquire_temp_slot(slot_ticket, non_persistent_temp_slot,\n            TrailPtrSlot, !CI),\n        MaybeTrailSlots = yes(CounterSlot - TrailPtrSlot),\n        SaveTrailCode = from_list([\n            llds_instr(mark_ticket_stack(CounterSlot),\n                \"save the ticket counter\"),\n            llds_instr(store_ticket(TrailPtrSlot),\n                \"save the trail pointer\")\n        ])\n    ;\n        AddTrailOps = do_not_add_trail_ops,\n        MaybeTrailSlots = no,\n        SaveTrailCode = empty\n    ).\n\n:- pred maybe_restore_trail_info(maybe(pair(lval))::in,\n    llds_code::out, llds_code::out, code_info::in, code_info::out) is det.\n\nmaybe_restore_trail_info(MaybeTrailSlots, CommitCode, RestoreCode, !CI) :-\n    (\n        MaybeTrailSlots = no,\n        CommitCode = empty,\n        RestoreCode = empty\n    ;\n        MaybeTrailSlots = yes(CounterSlot - TrailPtrSlot),\n        CommitCode = from_list([\n            llds_instr(reset_ticket(lval(TrailPtrSlot), reset_reason_commit),\n                \"discard trail entries and restore trail ptr\"),\n            llds_instr(prune_tickets_to(lval(CounterSlot)),\n                \"restore ticket counter (but not high water mark)\")\n        ]),\n        RestoreCode = from_list([\n            llds_instr(reset_ticket(lval(TrailPtrSlot), reset_reason_undo),\n                \"apply trail entries and restore trail ptr\"),\n            llds_instr(discard_ticket,\n                \"restore ticket counter and high water mark\")\n        ]),\n        release_temp_slot(CounterSlot, non_persistent_temp_slot, !CI),\n        release_temp_slot(TrailPtrSlot, non_persistent_temp_slot, !CI)\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- pred clone_resume_point(resume_point_info::in,\n    resume_point_info::out, code_info::in, code_info::out) is det.\n\nclone_resume_point(ResumePoint0, ResumePoint, !CI) :-\n    (\n        ResumePoint0 = orig_only(_, _),\n        unexpected($module, $pred, \"cloning orig_only resume point\")\n    ;\n        ResumePoint0 = stack_only(Map1, _),\n        get_next_label(Label1, !CI),\n        Addr1 = code_label(Label1),\n        ResumePoint = stack_only(Map1, Addr1)\n    ;\n        ResumePoint0 = stack_and_orig(Map1, _, Map2, _),\n        get_next_label(Label1, !CI),\n        Addr1 = code_label(Label1),\n        get_next_label(Label2, !CI),\n        Addr2 = code_label(Label2),\n        ResumePoint = stack_and_orig(Map1, Addr1, Map2, Addr2)\n    ;\n        ResumePoint0 = orig_and_stack(Map1, _, Map2, _),\n        get_next_label(Label2, !CI),\n        Addr2 = code_label(Label2),\n        get_next_label(Label1, !CI),\n        Addr1 = code_label(Label1),\n        ResumePoint = stack_and_orig(Map2, Addr2, Map1, Addr1)\n    ).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule to deal with liveness issues.\n\n    % The principles underlying this submodule of code_info.m are\n    % documented in the file compiler/notes/allocation.html.\n\n:- interface.\n\n:- pred add_forward_live_vars(set_of_progvar::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_known_variables(code_info::in, list(prog_var)::out) is det.\n\n:- pred variable_is_forward_live(code_info::in, prog_var::in) is semidet.\n\n:- pred make_vars_forward_dead(set_of_progvar::in,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_make_vars_forward_dead(set_of_progvar::in, bool::in,\n    code_info::in, code_info::out) is det.\n\n:- pred pickup_zombies(set_of_progvar::out,\n    code_info::in, code_info::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\n:- pred rem_forward_live_vars(set_of_progvar::in,\n    code_info::in, code_info::out) is det.\n\n    % Make these variables appear magically live.\n    % We don't care where they are put.\n    %\n:- pred make_vars_forward_live(set_of_progvar::in,\n    code_info::in, code_info::out) is det.\n\nget_known_variables(CI, VarList) :-\n    get_forward_live_vars(CI, ForwardLiveVars),\n    ResumeVars = current_resume_point_vars(CI),\n    set_of_var.union(ForwardLiveVars, ResumeVars, Vars),\n    VarList = set_of_var.to_sorted_list(Vars).\n\nvariable_is_forward_live(CI, Var) :-\n    get_forward_live_vars(CI, Liveness),\n    set_of_var.member(Liveness, Var).\n\nadd_forward_live_vars(Births, !CI) :-\n    get_forward_live_vars(!.CI, Liveness0),\n    set_of_var.union(Liveness0, Births, Liveness),\n    set_forward_live_vars(Liveness, !CI).\n\nrem_forward_live_vars(Deaths, !CI) :-\n    get_forward_live_vars(!.CI, Liveness0),\n    set_of_var.difference(Liveness0, Deaths, Liveness),\n    set_forward_live_vars(Liveness, !CI).\n\nmake_vars_forward_live(Vars, !CI) :-\n    get_stack_slots(!.CI, StackSlots),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    VarList = set_of_var.to_sorted_list(Vars),\n    make_vars_forward_live_2(VarList, StackSlots, 1,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n:- pred make_vars_forward_live_2(list(prog_var)::in,\n    stack_slots::in, int::in, var_locn_info::in, var_locn_info::out)\n    is det.\n\nmake_vars_forward_live_2([], _, _, !VarLocnInfo).\nmake_vars_forward_live_2([Var | Vars], StackSlots, N0, !VarLocnInfo) :-\n    ( map.search(StackSlots, Var, Slot) ->\n        Lval = stack_slot_to_lval(Slot),\n        N1 = N0\n    ;\n        % reg_r is fine since we don't care where the variables are put.\n        RegType = reg_r,\n        find_unused_reg(!.VarLocnInfo, RegType, N0, N1),\n        Lval = reg(RegType, N1)\n    ),\n    var_locn_set_magic_var_location(Var, Lval, !VarLocnInfo),\n    make_vars_forward_live_2(Vars, StackSlots, N1, !VarLocnInfo).\n\n:- pred find_unused_reg(var_locn_info::in, reg_type::in, int::in, int::out)\n    is det.\n\nfind_unused_reg(VLI, RegType, N0, N) :-\n    ( var_locn_lval_in_use(VLI, reg(RegType, N0)) ->\n        find_unused_reg(VLI, RegType, N0 + 1, N)\n    ;\n        N = N0\n    ).\n\nmake_vars_forward_dead(Vars, !CI) :-\n    maybe_make_vars_forward_dead(Vars, yes, !CI).\n\nmaybe_make_vars_forward_dead(Vars0, FirstTime, !CI) :-\n    ResumeVars = current_resume_point_vars(!.CI),\n    set_of_var.intersect(Vars0, ResumeVars, FlushVars),\n    get_zombies(!.CI, Zombies0),\n    set_of_var.union(Zombies0, FlushVars, Zombies),\n    set_zombies(Zombies, !CI),\n    set_of_var.difference(Vars0, Zombies, Vars),\n    VarList = set_of_var.to_sorted_list(Vars),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    maybe_make_vars_forward_dead_2(VarList, FirstTime,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n:- pred maybe_make_vars_forward_dead_2(list(prog_var)::in, bool::in,\n    var_locn_info::in, var_locn_info::out) is det.\n\nmaybe_make_vars_forward_dead_2([], _, !VLI).\nmaybe_make_vars_forward_dead_2([Var | Vars], FirstTime, !VLI) :-\n    var_locn_var_becomes_dead(Var, FirstTime, !VLI),\n    maybe_make_vars_forward_dead_2(Vars, FirstTime, !VLI).\n\npickup_zombies(Zombies, !CI) :-\n    get_zombies(!.CI, Zombies),\n    set_zombies(set_of_var.init, !CI).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for handling the saving and restoration\n    % of trail tickets, heap pointers, stack pointers etc.\n\n:- interface.\n\n:- pred save_hp(llds_code::out, lval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred restore_hp(lval::in, llds_code::out) is det.\n\n:- pred release_hp(lval::in, code_info::in, code_info::out) is det.\n\n:- pred restore_and_release_hp(lval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_save_hp(bool::in, llds_code::out, maybe(lval)::out,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_restore_hp(maybe(lval)::in, llds_code::out) is det.\n\n:- pred maybe_release_hp(maybe(lval)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_restore_and_release_hp(maybe(lval)::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred save_ticket(llds_code::out, lval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred reset_ticket(lval::in, reset_trail_reason::in, llds_code::out) is det.\n\n:- pred release_ticket(lval::in, code_info::in, code_info::out) is det.\n\n:- pred reset_and_prune_ticket(lval::in, reset_trail_reason::in,\n    llds_code::out) is det.\n\n:- pred reset_prune_and_release_ticket(lval::in, reset_trail_reason::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred reset_and_discard_ticket(lval::in, reset_trail_reason::in,\n    llds_code::out) is det.\n\n:- pred reset_discard_and_release_ticket(lval::in, reset_trail_reason::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred discard_and_release_ticket(lval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_save_ticket(add_trail_ops::in, llds_code::out,\n    maybe(lval)::out, code_info::in, code_info::out) is det.\n\n:- pred maybe_reset_ticket(maybe(lval)::in, reset_trail_reason::in,\n    llds_code::out) is det.\n\n:- pred maybe_release_ticket(maybe(lval)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_reset_and_prune_ticket(maybe(lval)::in,\n    reset_trail_reason::in, llds_code::out) is det.\n\n:- pred maybe_reset_prune_and_release_ticket(maybe(lval)::in,\n    reset_trail_reason::in, llds_code::out, code_info::in, code_info::out)\n    is det.\n\n:- pred maybe_reset_and_discard_ticket(maybe(lval)::in,\n    reset_trail_reason::in, llds_code::out) is det.\n\n:- pred maybe_reset_discard_and_release_ticket(maybe(lval)::in,\n    reset_trail_reason::in, llds_code::out, code_info::in, code_info::out)\n    is det.\n\n:- pred maybe_discard_and_release_ticket(maybe(lval)::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n    % Should we add trail ops to the code we generate for the goal with the\n    % given goal_info.  This will be 'no' unless we are in a trailing grade.\n    %\n:- func should_add_trail_ops(code_info, hlds_goal_info) = add_trail_ops.\n\n    % Should we add region ops to the code we generate for the goal with the\n    % given goal_info.  This will be 'no' unless we are in a rbmm grade.\n    %\n:- func should_add_region_ops(code_info, hlds_goal_info) = add_region_ops.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\nsave_hp(Code, HpSlot, !CI) :-\n    acquire_temp_slot(slot_lval(hp), non_persistent_temp_slot, HpSlot, !CI),\n    Code = singleton(\n        llds_instr(mark_hp(HpSlot), \"Save heap pointer\")\n    ).\n\nrestore_hp(HpSlot, Code) :-\n    Code = singleton(\n        llds_instr(restore_hp(lval(HpSlot)), \"Restore heap pointer\")\n    ).\n\nrelease_hp(HpSlot, !CI) :-\n    release_temp_slot(HpSlot, non_persistent_temp_slot, !CI).\n\nrestore_and_release_hp(HpSlot, Code, !CI) :-\n    restore_hp(HpSlot, Code),\n    release_hp(HpSlot, !CI).\n\n%---------------------------------------------------------------------------%\n\nmaybe_save_hp(Maybe, Code, MaybeHpSlot, !CI) :-\n    (\n        Maybe = yes,\n        save_hp(Code, HpSlot, !CI),\n        MaybeHpSlot = yes(HpSlot)\n    ;\n        Maybe = no,\n        Code = empty,\n        MaybeHpSlot = no\n    ).\n\nmaybe_restore_hp(MaybeHpSlot, Code) :-\n    (\n        MaybeHpSlot = yes(HpSlot),\n        restore_hp(HpSlot, Code)\n    ;\n        MaybeHpSlot = no,\n        Code = empty\n    ).\n\nmaybe_release_hp(MaybeHpSlot, !CI) :-\n    (\n        MaybeHpSlot = yes(HpSlot),\n        release_hp(HpSlot, !CI)\n    ;\n        MaybeHpSlot = no\n    ).\n\nmaybe_restore_and_release_hp(MaybeHpSlot, Code, !CI) :-\n    (\n        MaybeHpSlot = yes(HpSlot),\n        restore_and_release_hp(HpSlot, Code, !CI)\n    ;\n        MaybeHpSlot = no,\n        Code = empty\n    ).\n\n%---------------------------------------------------------------------------%\n\nsave_ticket(Code, TicketSlot, !CI) :-\n    acquire_temp_slot(slot_ticket, non_persistent_temp_slot, TicketSlot, !CI),\n    Code = singleton(\n        llds_instr(store_ticket(TicketSlot), \"Save trail state\")\n    ).\n\nreset_ticket(TicketSlot, Reason, Code) :-\n    Code = singleton(\n        llds_instr(reset_ticket(lval(TicketSlot), Reason), \"Reset trail\")\n    ).\n\nrelease_ticket(TicketSlot, !CI) :-\n    release_temp_slot(TicketSlot, non_persistent_temp_slot, !CI).\n\nreset_and_prune_ticket(TicketSlot, Reason, Code) :-\n    Code = from_list([\n        llds_instr(reset_ticket(lval(TicketSlot), Reason), \"Restore trail\"),\n        llds_instr(prune_ticket, \"Prune ticket stack\")\n    ]).\n\nreset_prune_and_release_ticket(TicketSlot, Reason, Code, !CI) :-\n    Code = from_list([\n        llds_instr(reset_ticket(lval(TicketSlot), Reason), \"Release trail\"),\n        llds_instr(prune_ticket, \"Prune ticket stack\")\n    ]),\n    release_temp_slot(TicketSlot, non_persistent_temp_slot, !CI).\n\nreset_and_discard_ticket(TicketSlot, Reason, Code) :-\n    Code = from_list([\n        llds_instr(reset_ticket(lval(TicketSlot), Reason), \"Restore trail\"),\n        llds_instr(discard_ticket, \"Pop ticket stack\")\n    ]).\n\nreset_discard_and_release_ticket(TicketSlot, Reason, Code, !CI) :-\n    Code = from_list([\n        llds_instr(reset_ticket(lval(TicketSlot), Reason), \"Release trail\"),\n        llds_instr(discard_ticket, \"Pop ticket stack\")\n    ]),\n    release_temp_slot(TicketSlot, non_persistent_temp_slot, !CI).\n\ndiscard_and_release_ticket(TicketSlot, Code, !CI) :-\n    Code = singleton(\n        llds_instr(discard_ticket, \"Pop ticket stack\")\n    ),\n    release_temp_slot(TicketSlot, non_persistent_temp_slot, !CI).\n\n%---------------------------------------------------------------------------%\n\nmaybe_save_ticket(AddTrailOps, Code, MaybeTicketSlot, !CI) :-\n    (\n        AddTrailOps = add_trail_ops,\n        save_ticket(Code, TicketSlot, !CI),\n        MaybeTicketSlot = yes(TicketSlot)\n    ;\n        AddTrailOps = do_not_add_trail_ops,\n        Code = empty,\n        MaybeTicketSlot = no\n    ).\n\nmaybe_reset_ticket(MaybeTicketSlot, Reason, Code) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        reset_ticket(TicketSlot, Reason, Code)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\nmaybe_release_ticket(MaybeTicketSlot, !CI) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        release_ticket(TicketSlot, !CI)\n    ;\n        MaybeTicketSlot = no\n    ).\n\nmaybe_reset_and_prune_ticket(MaybeTicketSlot, Reason, Code) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        reset_and_prune_ticket(TicketSlot, Reason, Code)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\nmaybe_reset_prune_and_release_ticket(MaybeTicketSlot, Reason,\n        Code, !CI) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        reset_prune_and_release_ticket(TicketSlot, Reason,\n            Code, !CI)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\nmaybe_reset_and_discard_ticket(MaybeTicketSlot, Reason, Code) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        reset_and_discard_ticket(TicketSlot, Reason, Code)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\nmaybe_reset_discard_and_release_ticket(MaybeTicketSlot, Reason,\n        Code, !CI) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        reset_discard_and_release_ticket(TicketSlot, Reason,\n            Code, !CI)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\nmaybe_discard_and_release_ticket(MaybeTicketSlot, Code, !CI) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        discard_and_release_ticket(TicketSlot, Code, !CI)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\n    % XXX We will eventually need to make use of GoalInfo here.\n    %\nshould_add_trail_ops(CodeInfo, _GoalInfo) = AddTrailOps :-\n    get_emit_trail_ops(CodeInfo, AddTrailOps).\n\n    % XXX We will eventually need to make use of GoalInfo here.\n    %\nshould_add_region_ops(CodeInfo, _GoalInfo) = AddRegionOps :-\n    get_emit_region_ops(CodeInfo, AddRegionOps).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule to deal with var_locn.\n\n    % Most of these procedures just forward to the var_locn module.\n    % See var_locn for documentation.\n\n:- interface.\n\n:- pred variable_locations(code_info::in,\n    map(prog_var, set(lval))::out) is det.\n\n:- pred set_var_location(prog_var::in, lval::in,\n    code_info::in, code_info::out) is det.\n\n:- pred assign_var_to_var(prog_var::in, prog_var::in,\n    code_info::in, code_info::out) is det.\n\n:- pred assign_lval_to_var(prog_var::in, lval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred assign_const_to_var(prog_var::in, rval::in,\n    code_info::in, code_info::out) is det.\n\n:- pred assign_expr_to_var(prog_var::in, rval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred reassign_mkword_hole_var(prog_var::in, tag::in, rval::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred assign_field_lval_expr_to_var(prog_var::in, list(lval)::in, rval::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n    % assign_cell_to_var(Var, ReserveWordAtStart, Ptag, MaybeRvals,\n    %   AllFilled, MaybeSize, FieldAddrs, TypeMsg, MayUseAtomic, Where,\n    %   Code, !CI).\n    %\n:- pred assign_cell_to_var(prog_var::in, bool::in, tag::in,\n    list(cell_arg)::in, how_to_construct::in, maybe(term_size_value)::in,\n    maybe(alloc_site_id)::in, may_use_atomic_alloc::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred save_reused_cell_fields(prog_var::in, lval::in, llds_code::out,\n    list(lval)::out, code_info::in, code_info::out) is det.\n\n:- pred place_var(prog_var::in, lval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred produce_variable(prog_var::in, llds_code::out, rval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred produce_variable_in_reg(prog_var::in, llds_code::out,\n    lval::out, code_info::in, code_info::out) is det.\n\n:- pred produce_variable_in_reg_or_stack(prog_var::in,\n    llds_code::out, lval::out, code_info::in, code_info::out) is det.\n\n:- pred materialize_vars_in_lval(lval::in, lval::out,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred acquire_reg_for_var(prog_var::in, reg_type::in, lval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred acquire_reg_not_in_storemap(abs_store_map::in, reg_type::in, lval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred acquire_reg(reg_type::in, lval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred release_reg(lval::in, code_info::in, code_info::out) is det.\n\n:- pred reserve_r1(llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred clear_r1(llds_code::out, code_info::in, code_info::out) is det.\n\n:- type call_direction\n    --->    caller\n    ;       callee.\n\n    % Move variables to where they need to be at the time of the call:\n    %\n    % - The variables that need to be saved across the call (either because\n    %   they are forward live after the call or because they are protected\n    %   by an enclosing resumption point) will be saved on the stack.\n    %   Note that if the call cannot succeed and the trace level is none,\n    %   then no variables need to be saved across the call. (If the call\n    %   cannot succeed but the trace level is not none, then we still\n    %   save the usual variables on the stack to make them available\n    %   for up-level printing in the debugger.)\n    %\n    % - The input arguments will be moved to their registers.\n    %\n:- pred setup_call(hlds_goal_info::in, assoc_list(prog_var, arg_info)::in,\n    set(lval)::out, llds_code::out, code_info::in, code_info::out) is det.\n\n    % Move the output arguments of the current procedure to where\n    % they need to be at return.\n    %\n:- pred setup_return(assoc_list(prog_var, arg_info)::in,\n    set(lval)::out, llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred lock_regs(int::in, int::in, assoc_list(prog_var, lval)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred unlock_regs(code_info::in, code_info::out) is det.\n\n    % Record the fact that all the registers have been clobbered (as by a\n    % call). If the bool argument is true, then the call cannot return, and\n    % thus it is OK for this action to delete the last record of the state\n    % of a variable.\n    %\n:- pred clear_all_registers(bool::in, code_info::in, code_info::out) is det.\n\n:- pred clobber_regs(list(lval)::in, code_info::in, code_info::out) is det.\n\n:- pred save_variables(set_of_progvar::in, set(lval)::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred save_variables_on_stack(list(prog_var)::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred max_reg_in_use(code_info::in, int::out, int::out) is det.\n\n:- pred magically_put_var_in_unused_reg(prog_var::in,\n    code_info::in, code_info::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\nvariable_locations(CI, Lvals) :-\n    get_var_locn_info(CI, VarLocnInfo),\n    var_locn_get_var_locations(VarLocnInfo, Lvals).\n\n:- func rval_map_to_lval_map(prog_var, set(rval)) = set(lval).\n\nrval_map_to_lval_map(_Var, Rvals) =\n    set.filter_map(rval_is_lval, Rvals).\n\n:- func rval_is_lval(rval) = lval is semidet.\n\nrval_is_lval(lval(Lval)) = Lval.\n\nset_var_location(Var, Lval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_check_and_set_magic_var_location(Var, Lval,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nassign_var_to_var(Var, AssignedVar, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_assign_var_to_var(Var, AssignedVar, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nassign_lval_to_var(Var, Lval, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_static_cell_info(!.CI, StaticCellInfo),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_assign_lval_to_var(ModuleInfo, Var, Lval,\n        StaticCellInfo, Code, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nassign_const_to_var(Var, ConstRval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_exprn_opts(!.CI, ExprnOpts),\n    var_locn_assign_const_to_var(ExprnOpts, Var, ConstRval,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nassign_expr_to_var(Var, Rval, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    Lvals = lvals_in_rval(Rval),\n    (\n        Lvals = [],\n        var_locn_assign_expr_to_var(Var, Rval, Code,\n            VarLocnInfo0, VarLocnInfo)\n    ;\n        Lvals = [_ | _],\n        unexpected($module, $pred, \"non-var lvals\")\n    ),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nreassign_mkword_hole_var(Var, Ptag, Rval, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    Lvals = lvals_in_rval(Rval),\n    (\n        Lvals = [],\n        var_locn_reassign_mkword_hole_var(Var, Ptag, Rval, Code,\n            VarLocnInfo0, VarLocnInfo)\n    ;\n        Lvals = [_ | _],\n        unexpected($module, $pred, \"non-var lvals\")\n    ),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nassign_field_lval_expr_to_var(Var, FieldLvals, Rval, Code, !CI) :-\n    (\n        FieldLvals = [field(MaybeTag, var(BaseVar), _) | RestFieldLvals],\n        list.all_true(is_var_field(MaybeTag, BaseVar), RestFieldLvals)\n    ->\n        (\n            Lvals = lvals_in_rval(Rval),\n            all [Lval] (\n                list.member(Lval, Lvals)\n            =>\n                list.member(Lval, FieldLvals)\n            )\n        ->\n            get_var_locn_info(!.CI, VarLocnInfo0),\n            var_locn_assign_field_lval_expr_to_var(Var, BaseVar, Rval, Code,\n                VarLocnInfo0, VarLocnInfo),\n            set_var_locn_info(VarLocnInfo, !CI)\n        ;\n            unexpected($module, $pred, \"rval contains unexpected lval\")\n        )\n    ;\n        unexpected($module, $pred,\n            \"FieldLvals not all fields of the same base variable\")\n    ).\n\n:- pred is_var_field(maybe(tag)::in, prog_var::in, lval::in) is semidet.\n\nis_var_field(MaybeTag, Var, field(MaybeTag, var(Var), _)).\n\nassign_cell_to_var(Var, ReserveWordAtStart, Ptag, CellArgs, HowToConstruct,\n        MaybeSize, MaybeAllocId, MayUseAtomic, Code, !CI) :-\n    get_next_label(Label, !CI),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_static_cell_info(!.CI, StaticCellInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    get_exprn_opts(!.CI, ExprnOpts),\n    var_locn_assign_cell_to_var(ModuleInfo, ExprnOpts, Var, ReserveWordAtStart,\n        Ptag, CellArgs, HowToConstruct, MaybeSize, MaybeAllocId, MayUseAtomic,\n        Label, Code, StaticCellInfo0, StaticCellInfo,\n        VarLocnInfo0, VarLocnInfo),\n    set_static_cell_info(StaticCellInfo, !CI),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nsave_reused_cell_fields(Var, Lval, Code, Regs, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_save_cell_fields(ModuleInfo, Var, Lval, Code, Regs,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nplace_var(Var, Lval, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_place_var(ModuleInfo, Var, Lval, Code,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n:- pred pick_and_place_vars(assoc_list(prog_var, set(lval))::in,\n    set(lval)::out, llds_code::out, code_info::in, code_info::out) is det.\n\npick_and_place_vars(VarLocSets, LiveLocs, Code, !CI) :-\n    pick_var_places(VarLocSets, VarLocs),\n    assoc_list.values(VarLocs, Locs),\n    set.list_to_set(Locs, LiveLocs),\n    place_vars(VarLocs, Code, !CI).\n\n:- pred pick_var_places(assoc_list(prog_var, set(lval))::in,\n    assoc_list(prog_var, lval)::out) is det.\n\npick_var_places([], []).\npick_var_places([Var - LvalSet | VarLvalSets], VarLvals) :-\n    pick_var_places(VarLvalSets, VarLvals0),\n    (\n        set.to_sorted_list(LvalSet, LvalList),\n        LvalList = [Lval | _]\n    ->\n        VarLvals = [Var - Lval | VarLvals0]\n    ;\n        VarLvals = VarLvals0\n    ).\n\n:- pred place_vars(assoc_list(prog_var, lval)::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\nplace_vars(VarLocs, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_place_vars(ModuleInfo, VarLocs, Code, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nproduce_variable(Var, Code, Rval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_produce_var(ModuleInfo, Var, Rval, Code,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nproduce_variable_in_reg(Var, Code, Lval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_produce_var_in_reg(ModuleInfo, Var, Lval, Code,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nproduce_variable_in_reg_or_stack(Var, Code, Lval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_produce_var_in_reg_or_stack(ModuleInfo, Var, Lval, Code,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nmaterialize_vars_in_lval(Lval0, Lval, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_materialize_vars_in_lval(ModuleInfo, Lval0, Lval, Code,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nacquire_reg_for_var(Var, RegType, Lval, !CI) :-\n    get_follow_var_map(!.CI, FollowVarsMap),\n    get_next_non_reserved(!.CI, RegType, NextNonReserved),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    (\n        map.search(FollowVarsMap, Var, PrefLocn),\n        PrefLocn = abs_reg(RegType, PrefRegNum),\n        PrefRegNum >= 1\n    ->\n        var_locn_acquire_reg_prefer_given(RegType, PrefRegNum, Lval,\n            VarLocnInfo0, VarLocnInfo)\n    ;\n        % XXX We should only get a register if the map.search succeeded;\n        % otherwise we should put the var in its stack slot.\n        var_locn_acquire_reg_start_at_given(RegType, NextNonReserved, Lval,\n            VarLocnInfo0, VarLocnInfo)\n    ),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nacquire_reg_not_in_storemap(StoreMap, RegType, Lval, !CI) :-\n    map.foldl2(record_highest_used_reg, StoreMap, 0, HighestUsedRegR,\n        0, HighestUsedRegF),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    (\n        RegType = reg_r,\n        NextRegNum = HighestUsedRegR + 1\n    ;\n        RegType = reg_f,\n        NextRegNum = HighestUsedRegF + 1\n    ),\n    var_locn_acquire_reg_start_at_given(RegType, NextRegNum, Lval,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n:- pred record_highest_used_reg(prog_var::in, abs_locn::in, int::in, int::out,\n    int::in, int::out) is det.\n\nrecord_highest_used_reg(_, AbsLocn, !HighestUsedRegR, !HighestUsedRegF) :-\n    (\n        AbsLocn = any_reg\n    ;\n        AbsLocn = abs_reg(reg_r, N),\n        int.max(N, !HighestUsedRegR)\n    ;\n        AbsLocn = abs_reg(reg_f, N),\n        int.max(N, !HighestUsedRegF)\n    ;\n        AbsLocn = abs_stackvar(_, _)\n    ;\n        AbsLocn = abs_parent_stackvar(_, _)\n    ;\n        AbsLocn = abs_framevar(_, _)\n    ).\n\nacquire_reg(Type, Lval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_acquire_reg(Type, Lval, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nrelease_reg(Lval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_release_reg(Lval, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nreserve_r1(Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_clear_r1(ModuleInfo, Code, VarLocnInfo0, VarLocnInfo1),\n    var_locn_acquire_reg_require_given(reg(reg_r, 1),\n        VarLocnInfo1, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nclear_r1(empty, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_release_reg(reg(reg_r, 1), VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\nsetup_return(VarArgInfos, OutLocs, Code, !CI) :-\n    setup_call_args(VarArgInfos, callee, OutLocs, Code, !CI).\n\nsetup_call(GoalInfo, ArgInfos, LiveLocs, Code, !CI) :-\n    partition_args(ArgInfos, InArgInfos, OutArgInfos, _UnusedArgInfos),\n    assoc_list.keys(OutArgInfos, OutVars),\n    set.list_to_set(OutVars, OutVarSet),\n    Detism = goal_info_get_determinism(GoalInfo),\n    get_opt_no_return_calls(!.CI, OptNoReturnCalls),\n    get_module_info(!.CI, ModuleInfo),\n    VarTypes = get_var_types(!.CI),\n    (\n        Detism = detism_erroneous,\n        OptNoReturnCalls = yes\n    ->\n        RealStackVarLocs = [],\n        DummyStackVarLocs = []\n    ;\n        compute_forward_live_var_saves(!.CI, set_to_bitset(OutVarSet),\n            ForwardVarLocs),\n        CodeModel = goal_info_get_code_model(GoalInfo),\n        (\n            CodeModel = model_non,\n            % Save variables protected by the nearest resumption point on the\n            % stack.\n            % XXX This should be unnecessary; with the current setup, the code\n            % that established the resume point should have saved those\n            % variables on the stack already. However, later we should arrange\n            % things so that this saving of the resume vars on the stack\n            % is delayed until the first call after the setup of the\n            % resume point.\n            compute_resume_var_stack_locs(!.CI, ResumeVarLocs),\n            list.append(ResumeVarLocs, ForwardVarLocs, StackVarLocs)\n        ;\n            ( CodeModel = model_det\n            ; CodeModel = model_semi\n            ),\n            StackVarLocs = ForwardVarLocs\n        ),\n        list.filter(valid_stack_slot(ModuleInfo, VarTypes), StackVarLocs,\n            RealStackVarLocs, DummyStackVarLocs)\n    ),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    list.filter(key_var_is_of_non_dummy_type(ModuleInfo, VarTypes),\n        InArgInfos, RealInArgInfos),\n    var_arg_info_to_lval(RealInArgInfos, RealInArgLocs),\n    AllRealLocs = RealStackVarLocs ++ RealInArgLocs,\n    AllLocs = DummyStackVarLocs ++ AllRealLocs,\n    var_locn_place_vars(ModuleInfo, AllLocs, Code, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI),\n    assoc_list.values(AllRealLocs, LiveLocList),\n    set.list_to_set(LiveLocList, LiveLocs).\n\n:- pred key_var_is_of_non_dummy_type(module_info::in, vartypes::in,\n    pair(prog_var, arg_info)::in) is semidet.\n\nkey_var_is_of_non_dummy_type(ModuleInfo, VarTypes, Var - _ArgInfo) :-\n    var_is_of_non_dummy_type(ModuleInfo, VarTypes, Var).\n\n:- pred valid_stack_slot(module_info::in, vartypes::in,\n    pair(prog_var, lval)::in) is semidet.\n\nvalid_stack_slot(ModuleInfo, VarTypes, Var - Lval) :-\n    lookup_var_type(VarTypes, Var, Type),\n    check_dummy_type(ModuleInfo, Type) = is_not_dummy_type,\n    (\n        ( Lval = stackvar(N)\n        ; Lval = parent_stackvar(N)\n        ; Lval = framevar(N)\n        ),\n        N < 0\n    ->\n        unexpected($module, $pred, \"nondummy var in dummy stack slot\")\n    ;\n        true\n    ).\n\n:- pred setup_call_args(assoc_list(prog_var, arg_info)::in,\n    call_direction::in, set(lval)::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\nsetup_call_args(AllArgsInfos, Direction, LiveLocs, Code, !CI) :-\n    list.filter(call_arg_in_selected_dir(Direction), AllArgsInfos, ArgsInfos),\n    var_arg_info_to_lval(ArgsInfos, ArgsLocns),\n    get_module_info(!.CI, ModuleInfo),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_place_vars(ModuleInfo, ArgsLocns, Code,\n        VarLocnInfo0, VarLocnInfo1),\n    set_var_locn_info(VarLocnInfo1, !CI),\n    assoc_list.values(ArgsLocns, LiveLocList),\n    set.list_to_set(LiveLocList, LiveLocs),\n    assoc_list.keys(ArgsLocns, ArgVars),\n    which_variables_are_forward_live(!.CI, ArgVars, set_of_var.init, DeadVars),\n    make_vars_forward_dead(DeadVars, !CI).\n\n:- pred var_arg_info_to_lval(assoc_list(prog_var, arg_info)::in,\n    assoc_list(prog_var, lval)::out) is det.\n\nvar_arg_info_to_lval([], []).\nvar_arg_info_to_lval([Var - ArgInfo | RestInfos], [Var - Lval | RestLvals]) :-\n    ArgInfo = arg_info(Loc, _Mode),\n    code_util.arg_loc_to_register(Loc, Lval),\n    var_arg_info_to_lval(RestInfos, RestLvals).\n\n:- pred which_variables_are_forward_live(code_info::in,\n    list(prog_var)::in, set_of_progvar::in, set_of_progvar::out) is det.\n\nwhich_variables_are_forward_live(_, [], !DeadVars).\nwhich_variables_are_forward_live(CI, [Var | Vars], !DeadVars) :-\n    ( variable_is_forward_live(CI, Var) ->\n        true\n    ;\n        set_of_var.insert(Var, !DeadVars)\n    ),\n    which_variables_are_forward_live(CI, Vars, !DeadVars).\n\n:- pred call_arg_in_selected_dir(call_direction::in,\n    pair(prog_var, arg_info)::in) is semidet.\n\ncall_arg_in_selected_dir(Direction, _ - arg_info(_, Mode)) :-\n    (\n        Mode = top_in,\n        Direction = caller\n    ;\n        Mode = top_out,\n        Direction = callee\n    ).\n\nlock_regs(R, F, Exceptions, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_lock_regs(R, F, Exceptions, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nunlock_regs(!CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_unlock_regs(VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nclear_all_registers(OkToDeleteAny, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_clobber_all_regs(OkToDeleteAny, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nclobber_regs(Regs, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_clobber_regs(Regs, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nsave_variables(OutArgs, SavedLocs, Code, !CI) :-\n    compute_forward_live_var_saves(!.CI, OutArgs, VarLocs),\n    assoc_list.values(VarLocs, SavedLocList),\n    set.list_to_set(SavedLocList, SavedLocs),\n    place_vars(VarLocs, Code, !CI).\n\nsave_variables_on_stack(Vars, Code, !CI) :-\n    list.map(associate_stack_slot(!.CI), Vars, VarLocs),\n    place_vars(VarLocs, Code, !CI).\n\n:- pred compute_forward_live_var_saves(code_info::in,\n    set_of_progvar::in, assoc_list(prog_var, lval)::out) is det.\n\ncompute_forward_live_var_saves(CI, OutArgs, VarLocs) :-\n    get_known_variables(CI, Variables0),\n    Vars0 = set_of_var.list_to_set(Variables0),\n    TypeInfoLiveness = body_typeinfo_liveness(CI),\n    get_proc_info(CI, ProcInfo),\n    proc_info_get_vartypes(ProcInfo, VarTypes),\n    proc_info_get_rtti_varmaps(ProcInfo, RttiVarMaps),\n    maybe_complete_with_typeinfo_vars(Vars0, TypeInfoLiveness, VarTypes,\n        RttiVarMaps, Vars1),\n    set_of_var.difference(Vars1, OutArgs, Vars),\n    Variables = set_of_var.to_sorted_list(Vars),\n    list.map(associate_stack_slot(CI), Variables, VarLocs).\n\n:- pred associate_stack_slot(code_info::in, prog_var::in,\n    pair(prog_var, lval)::out) is det.\n\nassociate_stack_slot(CI, Var, Var - Slot) :-\n    get_variable_slot(CI, Var, Slot).\n\nmax_reg_in_use(CI, MaxR, MaxF) :-\n    get_var_locn_info(CI, VarLocnInfo),\n    var_locn_max_reg_in_use(VarLocnInfo, MaxR, MaxF).\n\nmagically_put_var_in_unused_reg(Var, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    make_vars_forward_live_2([Var], map.init, 1, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for dealing with the recording of variable liveness\n    % information around calls.\n    %\n    % Value numbering needs to know what locations are live before calls;\n    % the garbage collector and the debugger need to know what locations\n    % are live containing what types of values after calls.\n\n:- interface.\n\n:- pred generate_call_vn_livevals(code_info::in, list(arg_loc)::in,\n    set_of_progvar::in, set(lval)::out) is det.\n\n:- pred generate_return_live_lvalues(code_info::in,\n    assoc_list(prog_var, arg_loc)::in, instmap::in, bool::in,\n    list(liveinfo)::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\ngenerate_call_vn_livevals(CI, InputArgLocs, OutputArgs, LiveVals) :-\n    generate_call_stack_vn_livevals(CI, OutputArgs, StackLiveVals),\n    generate_input_var_vn(InputArgLocs, StackLiveVals, LiveVals).\n\n:- pred generate_call_stack_vn_livevals(code_info::in,\n    set_of_progvar::in, set(lval)::out) is det.\n\ngenerate_call_stack_vn_livevals(CI, OutputArgs, LiveVals) :-\n    get_known_variables(CI, KnownVarList0),\n    get_module_info(CI, ModuleInfo),\n    VarTypes = get_var_types(CI),\n    list.filter(var_is_of_non_dummy_type(ModuleInfo, VarTypes),\n        KnownVarList0, KnownVarList),\n    set_of_var.list_to_set(KnownVarList, KnownVars),\n    set_of_var.difference(KnownVars, OutputArgs, LiveVars),\n    set_of_var.to_sorted_list(LiveVars, LiveVarList),\n    generate_stack_var_vn(CI, LiveVarList, set.init, LiveVals1),\n    get_active_temps_data(CI, Temps),\n    generate_call_temp_vn(Temps, LiveVals1, LiveVals).\n\n:- pred generate_stack_var_vn(code_info::in, list(prog_var)::in,\n    set(lval)::in, set(lval)::out) is det.\n\ngenerate_stack_var_vn(_, [], !Vals).\ngenerate_stack_var_vn(CI, [V | Vs], !Vals) :-\n    get_variable_slot(CI, V, Lval),\n    set.insert(Lval, !Vals),\n    generate_stack_var_vn(CI, Vs, !Vals).\n\n:- pred generate_call_temp_vn(assoc_list(lval, slot_contents)::in,\n    set(lval)::in, set(lval)::out) is det.\n\ngenerate_call_temp_vn([], !Vals).\ngenerate_call_temp_vn([Lval - _ | Temps], !Vals) :-\n    set.insert(Lval, !Vals),\n    generate_call_temp_vn(Temps, !Vals).\n\n:- pred generate_input_var_vn(list(arg_loc)::in,\n    set(lval)::in, set(lval)::out) is det.\n\ngenerate_input_var_vn([], !Vals).\ngenerate_input_var_vn([InputArgLoc | InputArgLocs], !Vals) :-\n    code_util.arg_loc_to_register(InputArgLoc, Lval),\n    set.insert(Lval, !Vals),\n    generate_input_var_vn(InputArgLocs, !Vals).\n\n%---------------------------------------------------------------------------%\n\ngenerate_return_live_lvalues(CI, OutputArgLocs, ReturnInstMap,\n        OkToDeleteAny, LiveLvalues) :-\n    variable_locations(CI, VarLocs),\n    get_known_variables(CI, Vars0),\n    get_module_info(CI, ModuleInfo),\n    VarTypes = get_var_types(CI),\n    list.filter(var_is_of_non_dummy_type(ModuleInfo, VarTypes), Vars0, Vars),\n    get_active_temps_data(CI, Temps),\n    get_proc_info(CI, ProcInfo),\n    get_globals(CI, Globals),\n    continuation_info.generate_return_live_lvalues(OutputArgLocs,\n        ReturnInstMap, Vars, VarLocs, Temps, ProcInfo, ModuleInfo,\n        Globals, OkToDeleteAny, LiveLvalues).\n\n:- pred generate_resume_layout(label::in, resume_map::in,\n    code_info::in, code_info::out) is det.\n\ngenerate_resume_layout(Label, ResumeMap, !CI) :-\n    get_globals(!.CI, Globals),\n    globals.lookup_bool_option(Globals, agc_stack_layout, AgcStackLayout),\n    (\n        AgcStackLayout = yes,\n        get_active_temps_data(!.CI, Temps),\n        get_instmap(!.CI, InstMap),\n        get_proc_info(!.CI, ProcInfo),\n        get_module_info(!.CI, ModuleInfo),\n        continuation_info.generate_resume_layout(ResumeMap, Temps, InstMap,\n            ProcInfo, ModuleInfo, Layout),\n        add_resume_layout_for_label(Label, Layout, !CI)\n    ;\n        AgcStackLayout = no\n    ).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for managing stack slots.\n\n    % Det stack frames are organized as follows.\n    %\n    %       ... unused ...\n    %   sp ---> <first unused slot>\n    %       <space for local var 1>\n    %       ... local vars ...\n    %       <space for local var n>\n    %       <space for temporary 1>\n    %       ... temporaries ...\n    %       <space for temporary n>\n    %       <space for saved succip, if needed>\n    %\n    % The stack pointer points to the first free location at the\n    % top of the stack.\n    %\n    % `succip_is_used' determines whether we need a slot to\n    % hold the succip.\n    %\n    % Nondet stack frames also have the local variables above the\n    % temporaries, but contain several fixed slots on top, and the\n    % saved succip is stored in one of these.\n    %\n    % For both kinds of stack frames, the slots holding variables\n    % are allocated during the live_vars pass, while the slots holding\n    % temporaries are acquired (and if possible, released) on demand\n    % during code generation.\n\n:- interface.\n\n    % Returns the total stackslot count, but not including space for\n    % succip. This total can change in the future if this call is\n    % followed by further allocations of temp slots.\n    %\n:- pred get_total_stackslot_count(code_info::in, int::out) is det.\n\n    % If a stack slot is persistent, then the stack slot is not implicitly\n    % released when the code generator resets its location-dependent state,\n    % usually when entering the next arm of a disjunction, switch, etc.\n\n:- type temp_slot_persistence\n    --->    persistent_temp_slot\n    ;       non_persistent_temp_slot.\n\n    % Acquire a stack slot for storing a temporary. The slot_contents\n    % description is for accurate gc.\n    %\n:- pred acquire_temp_slot(slot_contents::in, temp_slot_persistence::in,\n    lval::out, code_info::in, code_info::out) is det.\n\n    % Release a stack slot acquired earlier for a temporary value.\n    % The persistence argument should match the acquire operation.\n    %\n:- pred release_temp_slot(lval::in, temp_slot_persistence::in,\n    code_info::in, code_info::out) is det.\n\n    % acquire_several_temp_slots(Items, Persistence, StackVars,\n    %   StackId, N, M, !Info):\n    %\n    % Perform an acquire_temp_slot operation for each element of the\n    % input list, all with the same persistence.\n    %\n    % The slots will be the ones from stack_slot_num_to_lval(StackId, N)\n    % consecutively to stack_slot_num_to_lval(StackId, M), with N < M.\n    % These will also be returned as StackVars.\n    %\n:- pred acquire_several_temp_slots(list(slot_contents)::in,\n    temp_slot_persistence::in, list(lval)::out,\n    main_stack::out, int::out, int::out, code_info::in, code_info::out) is det.\n\n    % Release the stack slots acquired by an earlier acquire_several_temp_slots\n    % operation. The persistence argument should match the acquire operation.\n    %\n:- pred release_several_temp_slots(list(lval)::in, temp_slot_persistence::in,\n    code_info::in, code_info::out) is det.\n\n    % Return the lval of the stack slot in which the given variable is stored.\n    % Aborts if the variable does not have a stack slot an assigned to it.\n    %\n:- pred get_variable_slot(code_info::in, prog_var::in, lval::out) is det.\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\nacquire_temp_slot(Item, Persistence, StackVar, !CI) :-\n    get_temp_content_map(!.CI, TempContentMap0),\n    map.to_assoc_list(TempContentMap0, TempContentList),\n    get_temps_in_use(!.CI, TempsInUse0),\n    (\n        find_unused_slot_for_item(TempContentList, Item, TempsInUse0,\n            ChosenStackVar, _)\n    ->\n        StackVar = ChosenStackVar\n    ;\n        new_temp_slot(Item, StackVar, !CI)\n    ),\n    set.insert(StackVar, TempsInUse0, TempsInUse),\n    set_temps_in_use(TempsInUse, !CI),\n    (\n        Persistence = persistent_temp_slot,\n        get_persistent_temps(!.CI, PersistentTemps0),\n        set.insert(StackVar, PersistentTemps0, PersistentTemps),\n        set_persistent_temps(PersistentTemps, !CI)\n    ;\n        Persistence = non_persistent_temp_slot\n    ).\n\nacquire_several_temp_slots([], _, _, _, _, _, !CI) :-\n    % We could return an empty list of stack vars for StackVars, but there is\n    % nothing meaningful we can return for the other outputs.\n    unexpected($module, $pred, \"[]\").\nacquire_several_temp_slots([HeadItem | TailItems], Persistence, StackVars,\n        StackId, FirstSlotNum, LastSlotNum, !CI) :-\n    get_temp_content_map(!.CI, TempContentMap0),\n    map.to_assoc_list(TempContentMap0, TempContentList),\n    get_temps_in_use(!.CI, TempsInUse0),\n    (\n        find_unused_slots_for_items(TempContentList, HeadItem, TailItems,\n            TempsInUse0, StackVarsPrime,\n            StackIdPrime, FirstSlotNumPrime, LastSlotNumPrime)\n    ->\n        StackVars = StackVarsPrime,\n        StackId = StackIdPrime,\n        FirstSlotNum = FirstSlotNumPrime,\n        LastSlotNum = LastSlotNumPrime\n    ;\n        new_temp_slots([HeadItem | TailItems], StackVars,\n            StackId, FirstSlotNum, LastSlotNum, !CI)\n    ),\n    set.insert_list(StackVars, TempsInUse0, TempsInUse),\n    set_temps_in_use(TempsInUse, !CI),\n    (\n        Persistence = persistent_temp_slot,\n        get_persistent_temps(!.CI, PersistentTemps0),\n        set.insert_list(StackVars, PersistentTemps0, PersistentTemps),\n        set_persistent_temps(PersistentTemps, !CI)\n    ;\n        Persistence = non_persistent_temp_slot\n    ).\n\n:- pred new_temp_slot(slot_contents::in, lval::out,\n    code_info::in, code_info::out) is det.\n\nnew_temp_slot(Item, StackVar, !CI) :-\n    get_var_slot_count(!.CI, VarSlotCount),\n    get_max_temp_slot_count(!.CI, TempSlotCount0),\n    TempSlotCount = TempSlotCount0 + 1,\n    SlotNum = VarSlotCount + TempSlotCount,\n    CodeModel = get_proc_model(!.CI),\n    StackId = code_model_to_main_stack(CodeModel),\n    StackVar = stack_slot_num_to_lval(StackId, SlotNum),\n    set_max_temp_slot_count(TempSlotCount, !CI),\n\n    get_temp_content_map(!.CI, TempContentMap0),\n    map.det_insert(StackVar, Item, TempContentMap0, TempContentMap),\n    set_temp_content_map(TempContentMap, !CI).\n\n:- pred new_temp_slots(list(slot_contents)::in, list(lval)::out,\n    main_stack::out, int::out, int::out, code_info::in, code_info::out) is det.\n\nnew_temp_slots(Items, StackVars, StackId, FirstSlotNum, LastSlotNum, !CI) :-\n    get_var_slot_count(!.CI, VarSlotCount),\n    get_max_temp_slot_count(!.CI, TempSlotCount0),\n    FirstSlotNum = VarSlotCount + TempSlotCount0 + 1,\n    CodeModel = get_proc_model(!.CI),\n    StackId = code_model_to_main_stack(CodeModel),\n    get_temp_content_map(!.CI, TempContentMap0),\n    record_new_temp_slots(Items, StackId, FirstSlotNum, FirstUnusedSlotNum,\n        TempSlotCount0, TempSlotCount, TempContentMap0, TempContentMap,\n        StackVars),\n    LastSlotNum = FirstUnusedSlotNum - 1,\n    set_max_temp_slot_count(TempSlotCount, !CI),\n    set_temp_content_map(TempContentMap, !CI).\n\n:- pred record_new_temp_slots(list(slot_contents)::in,\n    main_stack::in, int::in, int::out, int::in, int::out,\n    map(lval, slot_contents)::in, map(lval, slot_contents)::out,\n    list(lval)::out) is det.\n\nrecord_new_temp_slots([], _, !CurSlotNum, !TempSlotCount, !TempContentMap, []).\nrecord_new_temp_slots([Item | Items], StackId, !CurSlotNum,\n        !TempSlotCount, !TempContentMap, [StackVar | StackVars]) :-\n    StackVar = stack_slot_num_to_lval(StackId, !.CurSlotNum),\n    map.det_insert(StackVar, Item, !TempContentMap),\n    !:CurSlotNum = !.CurSlotNum + 1,\n    !:TempSlotCount = !.TempSlotCount + 1,\n    record_new_temp_slots(Items, StackId, !CurSlotNum,\n        !TempSlotCount, !TempContentMap, StackVars).\n\n:- pred find_unused_slot_for_item(assoc_list(lval, slot_contents)::in,\n    slot_contents::in, set(lval)::in, lval::out,\n    assoc_list(lval, slot_contents)::out) is semidet.\n\nfind_unused_slot_for_item([Head | Tail], Item, TempsInUse,\n        ChosenStackVar, Remainder) :-\n    Head = HeadStackVar - HeadSlotType,\n    (\n        HeadSlotType = Item,\n        \\+ set.member(HeadStackVar, TempsInUse)\n    ->\n        ChosenStackVar = HeadStackVar,\n        Remainder = Tail\n    ;\n        find_unused_slot_for_item(Tail, Item, TempsInUse,\n            ChosenStackVar, Remainder)\n    ).\n\n:- pred find_unused_slots_for_items(assoc_list(lval, slot_contents)::in,\n    slot_contents::in, list(slot_contents)::in, set(lval)::in, list(lval)::out,\n    main_stack::out, int::out, int::out) is semidet.\n\nfind_unused_slots_for_items([Head | Tail], HeadItem, TailItems, TempsInUse,\n        ChosenStackVars, StackId, FirstSlotNum, LastSlotNum) :-\n    (\n        find_unused_slot_for_item([Head | Tail], HeadItem, TempsInUse,\n            ChosenHeadStackVar, Remainder),\n        ( ChosenHeadStackVar = stackvar(N) ->\n            StackId0 = det_stack,\n            FirstSlotNum0 = N\n        ; ChosenHeadStackVar = framevar(N) ->\n            StackId0 = nondet_stack,\n            FirstSlotNum0 = N\n        ;\n            unexpected($module, $pred, \"not stackvar or framevar\")\n        ),\n        StackId1 = StackId0,\n        FirstSlotNum1 = FirstSlotNum0,\n        find_next_slots_for_items(Remainder, TailItems, TempsInUse,\n            ChosenTailStackVars, StackId1, FirstSlotNum1, LastSlotNum1)\n    ->\n        ChosenStackVars = [ChosenHeadStackVar | ChosenTailStackVars],\n        StackId = StackId1,\n        FirstSlotNum = FirstSlotNum1,\n        LastSlotNum = LastSlotNum1\n    ;\n        find_unused_slots_for_items(Tail, HeadItem, TailItems, TempsInUse,\n            ChosenStackVars, StackId, FirstSlotNum, LastSlotNum)\n    ).\n\n:- pred find_next_slots_for_items(assoc_list(lval, slot_contents)::in,\n    list(slot_contents)::in, set(lval)::in, list(lval)::out,\n    main_stack::in, int::in, int::out) is semidet.\n\nfind_next_slots_for_items([], [], _, [], _, !SlotNum).\nfind_next_slots_for_items([Head | Tail], [HeadItem | TailItems], TempsInUse,\n        [HeadStackVar | TailStackVars], StackId, !SlotNum) :-\n    Head = HeadStackVar - HeadSlotType,\n    !:SlotNum = !.SlotNum + 1,\n    HeadStackVar = stack_slot_num_to_lval(StackId, !.SlotNum),\n    HeadSlotType = HeadItem,\n    \\+ set.member(HeadStackVar, TempsInUse),\n    find_next_slots_for_items(Tail, TailItems, TempsInUse,\n        TailStackVars, StackId, !SlotNum).\n\nrelease_temp_slot(StackVar, Persistence, !CI) :-\n    get_temps_in_use(!.CI, TempsInUse0),\n    set.delete(StackVar, TempsInUse0, TempsInUse),\n    set_temps_in_use(TempsInUse, !CI),\n\n    get_persistent_temps(!.CI, PersistentTemps0),\n    set.is_member(StackVar, PersistentTemps0, IsInPersistentTemps0),\n    (\n        Persistence = persistent_temp_slot,\n        expect(unify(IsInPersistentTemps0, yes),\n            $module, $pred, \"released stack slot should be persistent\"),\n        set.delete(StackVar, PersistentTemps0, PersistentTemps),\n        set_persistent_temps(PersistentTemps, !CI)\n    ;\n        Persistence = non_persistent_temp_slot,\n        expect(unify(IsInPersistentTemps0, no),\n            $module, $pred, \"released stack slot should not be persistent\")\n    ).\n\nrelease_several_temp_slots([], _Persistence, !CI).\nrelease_several_temp_slots([StackVar | StackVars], Persistence, !CI) :-\n    release_temp_slot(StackVar, Persistence, !CI),\n    release_several_temp_slots(StackVars, Persistence, !CI).\n\n%---------------------------------------------------------------------------%\n\nget_variable_slot(CI, Var, Slot) :-\n    get_stack_slots(CI, StackSlots),\n    ( map.search(StackSlots, Var, SlotLocn) ->\n        Slot = stack_slot_to_lval(SlotLocn)\n    ;\n        Name = variable_name(CI, Var),\n        term.var_to_int(Var, Num),\n        string.int_to_string(Num, NumStr),\n        Str = \"variable `\" ++ Name ++ \"' \" ++ \"(\" ++ NumStr ++ \") not found\",\n        unexpected($module, $pred, Str)\n    ).\n\nget_total_stackslot_count(CI, NumSlots) :-\n    get_var_slot_count(CI, SlotsForVars),\n    get_max_temp_slot_count(CI, SlotsForTemps),\n    NumSlots = SlotsForVars + SlotsForTemps.\n\n:- pred max_var_slot(stack_slots::in, int::out) is det.\n\nmax_var_slot(StackSlots, SlotCount) :-\n    map.values(StackSlots, StackSlotList),\n    max_var_slot_2(StackSlotList, 0, SlotCount).\n\n:- pred max_var_slot_2(list(stack_slot)::in, int::in, int::out) is det.\n\nmax_var_slot_2([], !Max).\nmax_var_slot_2([L | Ls], !Max) :-\n    (\n        L = det_slot(N, Width)\n    ;\n        L = parent_det_slot(N, Width)\n    ;\n        L = nondet_slot(N, Width)\n    ),\n    (\n        Width = single_width,\n        int.max(N, !Max)\n    ;\n        Width = double_width,\n        int.max(N + 1, !Max)\n    ),\n    max_var_slot_2(Ls, !Max).\n\n%---------------------------------------------------------------------------%\n\n    % Submodule for debugging the code generator itself.\n\n:- interface.\n\n    % Should we trace the operation of the code generator.\n    %\n:- pred should_trace_code_gen(code_info::in) is semidet.\n\n:- type code_info_component\n    --->    cic_forward_live_vars\n    ;       cic_zombies\n    ;       cic_temps_in_use\n    ;       cic_par_conj_depth.\n\n    % Print the selected parts of the code_info.\n    %\n    % If you need to print a part that is not currently selectable, make it\n    % selectable.\n    %\n:- pred output_code_info(list(code_info_component)::in, code_info::in,\n    io::di, io::uo) is det.\n\n:- implementation.\n\nshould_trace_code_gen(CI) :-\n    code_info.get_pred_id(CI, PredId),\n    pred_id_to_int(PredId, PredIdInt),\n    code_info.get_module_info(CI, ModuleInfo),\n    module_info_get_globals(ModuleInfo, Globals),\n    globals.lookup_int_option(Globals, debug_code_gen_pred_id, DebugPredIdInt),\n    PredIdInt = DebugPredIdInt.\n\noutput_code_info(Components, CI, !IO) :-\n    CI = code_info(Static, LocDep, _Persistent),\n    VarSet = Static ^ cis_varset,\n    LocDep = code_info_loc_dep(ForwardLiveVars, _InstMap, Zombies,\n        _VarLocnInfo, TempsInUse, _FailInfo, ParConjDepth),\n    ( list.member(cic_forward_live_vars, Components) ->\n        io.write_string(\"forward live vars: \", !IO),\n        mercury_output_vars(VarSet, yes,\n            set_of_var.to_sorted_list(ForwardLiveVars), !IO),\n        io.nl(!IO)\n    ;\n        true\n    ),\n    ( list.member(cic_zombies, Components) ->\n        io.write_string(\"zombies: \", !IO),\n        mercury_output_vars(VarSet, yes,\n            set_of_var.to_sorted_list(Zombies), !IO),\n        io.nl(!IO)\n    ;\n        true\n    ),\n    ( list.member(cic_temps_in_use, Components) ->\n        io.write_string(\"temps_in_use: \", !IO),\n        io.write_string(dump_lvals(no, set.to_sorted_list(TempsInUse)), !IO),\n        io.nl(!IO)\n    ;\n        true\n    ),\n    ( list.member(cic_par_conj_depth, Components) ->\n        io.format(\"par_conj_depth: %d\\n\", [i(ParConjDepth)], !IO)\n    ;\n        true\n    ).\n\n:- pred output_resume_map(prog_varset::in, map(prog_var, set(lval))::in,\n    io::di, io::uo) is det.\n\noutput_resume_map(VarSet, ResumeMap, !IO) :-\n    map.to_assoc_list(ResumeMap, ResumeAssocList),\n    list.foldl(output_resume_map_element(VarSet), ResumeAssocList, !IO).\n\n:- pred output_resume_map_element(prog_varset::in,\n    pair(prog_var, set(lval))::in, io::di, io::uo) is det.\n\noutput_resume_map_element(VarSet, Var - LvalSet, !IO) :-\n    io.write_string(describe_var(VarSet, Var), !IO),\n    io.write_string(\": \", !IO),\n    Lvals = set.to_sorted_list(LvalSet),\n    LvalDescs = list.map(dump_lval(no), Lvals),\n    SpaceLvalDescs = list.map(string.append(\" \"), LvalDescs),\n    io.write_string(string.append_list(SpaceLvalDescs), !IO),\n    io.nl(!IO).\n\n%---------------------------------------------------------------------------%\n:- end_module ll_backend.code_info.\n%---------------------------------------------------------------------------%\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mercury/expr.moo",
    "content": ":- module expr.\n\n:- interface.\n\n:- import_module char, int, list.\n\n:- type token\n\t--->\t('+')\n\t;\t('-')\n\t;\t('*')\n\t;\t('/')\n\t;\tnum(int)\n\t;\t('(')\n\t;\t(')')\n\t;\teof\n\t.\n\n:- parse(exprn/1, token, eof, xx, in, out).\n\n:- pred scan(list(char), list(token)).\n:- mode scan(in, out) is det.\n\n:- implementation.\n\n:- import_module string, require.\n\n:- rule exprn(int).\nexprn(Num)\t--->\texprn(A), [+], term(B), { Num = A + B }.\nexprn(Num)\t--->\texprn(A), [-], term(B), { Num = A - B }.\nexprn(Num)\t--->\tterm(Num).\n\n:- rule term(int).\nterm(Num)\t--->\tterm(A), [*], factor(B), { Num = A * B }.\nterm(Num)\t--->\tterm(A), [/], factor(B), { Num = A // B }.\nterm(Num)\t--->\tfactor(Num).\n\n:- rule factor(int).\nfactor(Num)\t--->\t['('], exprn(Num), [')'].\nfactor(Num)\t--->\t[num(Num)].\n\nscan(Chars, Toks) :-\n\tscan(Chars, [], Toks0),\n\tlist__reverse(Toks0, Toks).\n\n:- pred scan(list(char), list(token), list(token)).\n:- mode scan(in, in, out) is det.\n\nscan([], Toks, [eof|Toks]).\nscan([C|Cs], Toks0, Toks) :-\n\t( char__is_whitespace(C) ->\n\t\tscan(Cs, Toks0, Toks)\n\t; char__is_digit(C) ->\n\t\ttakewhile(char__is_digit, [C|Cs], Digits, Rest),\n\t\tstring__from_char_list(Digits, NumStr),\n\t\tNum = string__det_to_int(NumStr),\n\t\tscan(Rest, [num(Num)|Toks0], Toks)\n\t; C = ('+') ->\n\t\tscan(Cs, ['+'|Toks0], Toks)\n\t; C = ('-') ->\n\t\tscan(Cs, ['-'|Toks0], Toks)\n\t; C = ('*') ->\n\t\tscan(Cs, ['*'|Toks0], Toks)\n\t; C = ('/') ->\n\t\tscan(Cs, ['/'|Toks0], Toks)\n\t; C = ('(') ->\n\t\tscan(Cs, ['('|Toks0], Toks)\n\t; C = (')') ->\n\t\tscan(Cs, [')'|Toks0], Toks)\n\t;\n\t\terror(\"expr: syntax error in input\")\n\t).\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mercury/hello.m",
    "content": "% \"Hello World\" in Mercury.\n\n% This source file is hereby placed in the public domain.  -fjh (the author).\n\n:- module hello.\n:- interface.\n:- import_module io.\n\n:- pred main(io::di, io::uo) is det.\n\n:- implementation.\n\nmain(!IO) :-\n\tio.write_string(\"Hello, world\\n\", !IO).\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mercury/options.m",
    "content": "%-----------------------------------------------------------------------------%\n% vim: ft=mercury ts=4 sw=4 et\n%-----------------------------------------------------------------------------%\n% Copyright (C) 1994-2012 The University of Melbourne.\n% This file may only be copied under the terms of the GNU General\n% Public License - see the file COPYING in the Mercury distribution.\n%-----------------------------------------------------------------------------%\n%\n% File: options.m.\n% Main author: fjh.\n%\n% This defines the stuff necessary so that getopt_io.m can parse the\n% command-line options.\n%\n% IMPORTANT NOTE: any changes to the options should be reflected in both the\n% help message produced below, and in the Mercury User's Guide\n% (../doc/user_guide.texi).\n%\n%-----------------------------------------------------------------------------%\n\n:- module libs.options.\n:- interface.\n\n:- import_module char.\n:- import_module getopt_io.\n:- import_module io.\n:- import_module set.\n\n%-----------------------------------------------------------------------------%\n\n:- pred short_option(char::in, option::out) is semidet.\n:- pred long_option(string::in, option::out) is semidet.\n:- pred option_defaults(option::out, option_data::out) is nondet.\n\n    % special_handler(Option, ValueForThatOption, OptionTableIn,\n    %   MaybeOptionTableOut):\n    %\n    % This predicate is invoked whenever getopt finds an option\n    % (long or short) designated as special, with special_data holding\n    % the argument of the option (if any). The predicate can change the\n    % option table in arbitrary ways in the course of handling the option,\n    % or it can return an error message.\n    % The canonical examples of special options are -O options in\n    % compilers, which set many other options at once.\n    % The MaybeOptionTableOut may either be ok(OptionTableOut), or it may\n    % be error(ErrorString).\n    %\n:- pred special_handler(option::in, special_data::in, option_table::in,\n    maybe_option_table::out) is semidet.\n\n    % Return the set of options which are inconsequential as far as the\n    % `--track-flags' option is concerned.  That is, adding or removing such\n    % an option to a module should not force the module to be recompiled.\n    %\n:- pred inconsequential_options(set(option)::out) is det.\n\n:- pred options_help(io::di, io::uo) is det.\n\n:- type option_table == option_table(option).\n:- type maybe_option_table == maybe_option_table(option).\n\n    % Add a directory to search for Mercury libraries. This\n    % adds `--search-directory', `--c-include-directory',\n    % `--erlang-include-directory',\n    % `--library-directory' and `--init-file-directory' options.\n    %\n:- func option_table_add_mercury_library_directory(option_table, string)\n    = option_table.\n\n    % Add a directory using all of the\n    % `--search-directory', `--intermod-directory',\n    % `--library-directory', `--init-file-directory' and\n    % `--c-include-directory', `--erlang-include-directory'\n    % options.\n    %\n:- func option_table_add_search_library_files_directory(option_table,\n    string) = option_table.\n\n    % Quote an argument to a shell command.\n    %\n:- func quote_arg(string) = string.\n\n    % NOTE: ALL OPTIONS SHOULD BE DOCUMENTED!\n    %\n    % Officially supported options should be documented both in the\n    % help message output by options_help/2, and also in the\n    % \"invocation\" chapter of doc/user_guide.texi.\n    %\n    % Options which are not officially supported (e.g. those used\n    % internally by the Mercury implementation, those which are not\n    % sufficiently useful to be worth mentioning in the User Guide,\n    % or options for experimental features that are not yet stable\n    % enough to be officially supported should still be documented.\n    % The documentation can go either next to the option definition\n    % here, or as commented-out code in the appropriate subroutine\n    % of options_help/2.\n:- type option\n\n    % Warning options\n    --->    inhibit_warnings\n    ;       inhibit_accumulator_warnings\n    ;       halt_at_warn\n    ;       halt_at_syntax_errors\n    ;       halt_at_auto_parallel_failure\n    ;       warn_singleton_vars\n    ;       warn_overlapping_scopes\n    ;       warn_det_decls_too_lax\n    ;       warn_inferred_erroneous\n    ;       warn_nothing_exported\n    ;       warn_unused_args\n    ;       warn_interface_imports\n    ;       warn_missing_opt_files\n    ;       warn_missing_trans_opt_files\n    ;       warn_missing_trans_opt_deps\n    ;       warn_non_contiguous_clauses\n    ;       warn_non_contiguous_foreign_procs\n    ;       warn_non_stratification\n    ;       warn_unification_cannot_succeed\n    ;       warn_simple_code\n    ;       warn_duplicate_calls\n    ;       warn_missing_module_name\n    ;       warn_wrong_module_name\n    ;       warn_smart_recompilation\n    ;       warn_undefined_options_variables\n    ;       warn_non_tail_recursion\n    ;       warn_target_code\n    ;       warn_up_to_date\n    ;       warn_stubs\n    ;       warn_dead_procs\n    ;       warn_table_with_inline\n    ;       warn_non_term_special_preds\n    ;       warn_known_bad_format_calls\n    ;       warn_unknown_format_calls\n    ;       warn_obsolete\n    ;       warn_insts_without_matching_type\n    ;       warn_unused_imports\n    ;       inform_ite_instead_of_switch\n    ;       warn_unresolved_polymorphism\n    ;       warn_suspicious_foreign_procs\n    ;       warn_state_var_shadowing\n    ;       inform_inferred\n    ;       inform_inferred_types\n    ;       inform_inferred_modes\n\n    % Verbosity options\n    ;       verbose\n    ;       very_verbose\n    ;       verbose_errors\n    ;       verbose_recompilation\n    ;       find_all_recompilation_reasons\n    ;       verbose_make\n    ;       verbose_commands\n    ;       output_compile_error_lines\n    ;       report_cmd_line_args\n    ;       report_cmd_line_args_in_doterr\n    ;       statistics\n    ;       detailed_statistics\n    ;       proc_size_statistics\n    ;       debug_types\n    ;       debug_modes\n    ;       debug_modes_statistics\n    ;       debug_modes_minimal\n    ;       debug_modes_verbose\n    ;       debug_modes_pred_id\n    ;       debug_dep_par_conj\n    ;       debug_det\n    ;       debug_code_gen_pred_id\n    ;       debug_opt\n    ;       debug_term          % term = constraint termination analysis\n    ;       debug_opt_pred_id\n    ;       debug_opt_pred_name\n    ;       debug_pd            % pd = partial deduction/deforestation\n    ;       debug_il_asm        % il_asm = IL generation via asm\n    ;       debug_liveness\n    ;       debug_stack_opt\n    ;       debug_make\n    ;       debug_closure\n    ;       debug_trail_usage\n    ;       debug_mode_constraints\n    ;       debug_intermodule_analysis\n    ;       debug_mm_tabling_analysis\n    ;       debug_indirect_reuse\n    ;       debug_type_rep\n\n    % Output options\n    ;       make_short_interface\n    ;       make_interface\n    ;       make_private_interface\n    ;       make_optimization_interface\n    ;       make_transitive_opt_interface\n    ;       make_analysis_registry\n    ;       make_xml_documentation\n    ;       generate_source_file_mapping\n    ;       generate_dependency_file\n    ;       generate_dependencies\n    ;       generate_module_order\n    ;       generate_standalone_interface\n    ;       convert_to_mercury\n    ;       typecheck_only\n    ;       errorcheck_only\n    ;       target_code_only\n    ;       compile_only\n    ;       compile_to_shared_lib\n    ;       output_grade_string\n    ;       output_link_command\n    ;       output_shared_lib_link_command\n    ;       output_libgrades\n    ;       output_cc\n    ;       output_c_compiler_type\n    ;       output_csharp_compiler_type\n    ;       output_cflags\n    ;       output_library_link_flags\n    ;       output_grade_defines\n    ;       output_c_include_directory_flags\n\n    % Auxiliary output options\n    ;       smart_recompilation\n            % Even if this option is set to `yes', smart recompilation may\n            % have been disabled with io_set_disable_smart_recompilation.\n            % Before using the value of this option, call\n            % io_get_disable_smart_recompilation to see whether this\n            % has been done.\n\n    ;       generate_item_version_numbers\n            % This option is used to control output of version numbers\n            % in interface files. It is implied by --smart-recompilation,\n            % and cannot be set explicitly by the user.\n\n            % Even if this option is set to `yes', version numbers may have\n            % been disabled with io_set_disable_generate_item_version_numbers.\n            % Before using the value of this option, call\n            % io_get_disable_generate_item_version_numbers to see whether this\n            % has been done.\n\n    ;       generate_mmc_make_module_dependencies\n    ;       assume_gmake\n    ;       trace_level\n    ;       trace_optimized\n    ;       trace_prof\n    ;       trace_table_io\n    ;       trace_table_io_only_retry\n    ;       trace_table_io_states\n    ;       trace_table_io_require\n    ;       trace_table_io_all\n    ;       trace_goal_flags\n    ;       prof_optimized\n    ;       exec_trace_tail_rec\n    ;       suppress_trace\n    ;       force_disable_tracing\n            % Force no tracing, even in .debug grades. This is used to turn off\n            % tracing in the browser directory while still allowing the browser\n            % library to be linked in with an executable compiled in a .debug\n            % grade.\n    ;       delay_death\n    ;       delay_death_max_vars\n\n    ;       stack_trace_higher_order\n    ;       force_disable_ssdebug\n    ;       generate_bytecode\n    ;       line_numbers\n    ;       auto_comments\n    ;       frameopt_comments\n    ;       max_error_line_width\n    ;       show_dependency_graph\n    ;       imports_graph\n    ;       dump_trace_counts\n    ;       dump_hlds\n    ;       dump_hlds_pred_id\n    ;       dump_hlds_pred_name\n    ;       dump_hlds_alias\n    ;       dump_hlds_options\n    ;       dump_hlds_inst_limit\n    ;       dump_hlds_file_suffix\n    ;       dump_same_hlds\n    ;       dump_mlds\n    ;       verbose_dump_mlds\n    ;       mode_constraints\n    ;       simple_mode_constraints\n    ;       prop_mode_constraints\n    ;       benchmark_modes\n    ;       benchmark_modes_repeat\n    ;       sign_assembly\n    ;       separate_assemblies\n\n    % Language semantics options\n    ;       reorder_conj\n    ;       reorder_disj\n    ;       fully_strict\n    ;       strict_sequential\n    ;       allow_stubs\n    ;       infer_types\n    ;       infer_modes\n    ;       infer_det\n    ;       infer_all\n    ;       type_inference_iteration_limit\n    ;       mode_inference_iteration_limit\n    ;       event_set_file_name\n\n    % Compilation Model options\n    ;       grade\n\n    % Target selection options\n    ;       target\n    ;       il                  % target il\n    ;       il_only             % target il + target_code_only\n    ;       compile_to_c        % target c + target_code_only\n    ;       java                % target java\n    ;       java_only           % target java + target_code_only\n    ;       csharp              % target csharp\n    ;       csharp_only         % target csharp + target_code_only\n    % XXX The following options need to be documented.\n    ;       x86_64              % target x86_64\n    ;       x86_64_only         % target x86_64 + target_code_only\n    ;       erlang              % target erlang\n    ;       erlang_only         % target erlang + target_code_only\n\n    % Compilation model options for optional features:\n\n    % (a) Debugging\n    % For documentation of the exec_trace and decl_debug options, see the\n    % documentation for MR_EXEC_TRACE and MR_DECL_DEBUG in\n    % runtime/mercury_conf_param.h.\n    ;       exec_trace\n    ;       decl_debug\n\n    % (b) Profiling\n    ;       profiling           % profile_time + profile_calls\n    ;       time_profiling      % profile_time + profile_calls\n    ;       memory_profiling    % profile_mem + profile_calls\n    ;       deep_profiling      % profile_deep\n    ;       profile_calls\n    ;       profile_time\n    ;       profile_memory\n    ;       profile_deep\n    ;       use_activation_counts\n            % Use_activation_counts is used to determine which mechanism for\n            % cycle detection should be used for deep profiling. Actually,\n            % we only want to use the `yes' value, but we keep support for\n            % the `no' value for benchmarks for the paper.\n\n    ;       pre_prof_transforms_simplify\n            % Run the simplification pass at before profiling (stage 215) this\n            % is implied by some of the profiling settings.  Specifying this\n            % option causes this simplification pass to run even when profiling\n            % is not enabled.\n\n    ;       pre_implicit_parallelism_simplify\n            % Run the simplification pass before the implicit parallelism pass\n            % to ensure that the HLDS more closely matches the feedback data.\n\n            % Perform coverage profiling, this affects only deep profiling\n            % grades.\n    ;       coverage_profiling\n    ;       coverage_profiling_via_calls\n    ;       coverage_profiling_static\n\n            % What types of coverage points to instrument the code with.\n    ;       profile_deep_coverage_after_goal\n    ;       profile_deep_coverage_branch_ite\n    ;       profile_deep_coverage_branch_switch\n    ;       profile_deep_coverage_branch_disj\n\n            % Tunables for the coverage profiling pass.\n            % XXX: Currently both these options are unsupported.\n    ;       profile_deep_coverage_use_portcounts\n    ;       profile_deep_coverage_use_trivial\n\n            % Turn on flags relevant for profiler directed feedback analysis.\n            % Currently the only feedback analysis is automatic parallelism.\n    ;       profile_for_feedback\n\n    ;       use_zeroing_for_ho_cycles\n    ;       use_lots_of_ho_specialization\n\n            % We should always handle tail recursion specially in deep\n            % profiling; the option is only for benchmarks for the paper,\n            % except that this is currently broken, and not supported with\n            % coverage profiling.\n    ;       deep_profile_tail_recursion\n    ;       record_term_sizes_as_words\n    ;       record_term_sizes_as_cells\n    ;       experimental_complexity\n\n    % (c) Miscellaneous\n    ;       gc\n    ;       parallel\n    ;       threadscope\n    ;       use_trail\n    ;       trail_segments\n    ;       use_minimal_model_stack_copy\n    ;       use_minimal_model_own_stacks\n    ;       minimal_model_debug\n    ;       single_prec_float\n    ;       type_layout\n    ;       maybe_thread_safe_opt\n    ;       extend_stacks_when_needed\n    ;       stack_segments\n    ;       use_regions\n    ;       use_alloc_regions\n    ;       use_regions_debug\n    ;       use_regions_profiling\n    ;       source_to_source_debug\n    ;       ssdb_trace_level\n    ;       link_ssdb_libs\n\n    % Data representation compilation model options\n    ;       tags\n    ;       num_tag_bits\n    ;       num_reserved_addresses\n    ;       num_reserved_objects\n    ;       bits_per_word\n    ;       bytes_per_word\n            % The undocumented conf_low_tag_bits option is used by the `mmc'\n            % script to pass the default value for num_tag_bits assuming\n            % --tags low. The reason that `mmc' doesn't just pass a default\n            % value for --num-tag-bits is that we want to be able to give an\n            % error message if the user specifies `--tags high' and doesn't\n            % specify `--num-tag-bits'.\n\n    ;       conf_low_tag_bits\n    ;       unboxed_float\n    ;       unboxed_enums\n    ;       unboxed_no_tag_types\n    ;       sync_term_size % in words\n\n    % LLDS back-end compilation model options\n    ;       gcc_non_local_gotos\n    ;       gcc_global_registers\n    ;       asm_labels\n    ;       pic_reg\n    ;       use_float_registers\n\n    % MLDS back-end compilation model options\n    ;       highlevel_code\n    ;       highlevel_data\n    ;       gcc_nested_functions\n    ;       det_copy_out\n    ;       nondet_copy_out\n    ;       put_commit_in_own_func\n    ;       put_nondet_env_on_heap\n\n    % IL back-end compilation model options\n    ;       verifiable_code\n    ;       il_refany_fields\n    ;       il_funcptr_types\n    ;       il_byref_tailcalls\n            % Currently this is not really a compilation model option, i.e.\n            % it doesn't affect the ABI. In future it might become one, though\n            % -- we should return multiple values in value types, rather than\n            % using byrefs. Also it's nicer to keep it with the other IL\n            % back-end options here.\n\n    % Options for internal use only (the values of these options are implied\n    % by the settings of other options)\n\n    ;       backend_foreign_languages\n            % The foreign programming languages that this backend can\n            % interface to.\n\n    ;       stack_trace\n            % Stack layout information required to do a stack trace.\n\n    ;       basic_stack_layout\n            % Stack layout information required to do accurate GC.\n\n    ;       agc_stack_layout\n            % Stack layout information required to do procedure identification.\n\n    ;       procid_stack_layout\n            % Stack layout information required to do execution tracing.\n\n    ;       trace_stack_layout\n\n    ;       body_typeinfo_liveness\n            % Use an alternate calculation of liveness where the typeinfo\n            % for a type variable must live at any point in the body of the\n            % procedure at which a live variable's type includes that type\n            % variable.\n            %\n            % Although this option governs whether the body of a procedure\n            % uses this liveness calculation, it is not the only consideration\n            % we have to take into account when deciding on the interface\n            % of any procedure whose address may be taken. We must include\n            % typeinfos describing the types of all arguments in the interface\n            % of a procedure if either this option is set *or* the procedure's\n            % address may be taken, otherwise, the layout structure we include\n            % in closures using that procedure may not have all the information\n            % required to reconstruct the types of all the values inside the\n            % closure.\n            %\n            % The only place in the compiler that should look at this option\n            % is the predicate body_should_use_typeinfo_liveness in\n            % hlds_pred.m; everything else, including the predicates deciding\n            % interface typeinfo liveness, should go through there.\n\n    ;       can_compare_constants_as_ints\n            % Should be set to yes if the target back end guarantees that\n            % comparing two values for equality, at least one of which is a\n            % constant, can be done by casting them both to integers and\n            % comparing the integers for equality.\n\n    ;       pretest_equality_cast_pointers\n            % Should be set to yes if the test of whether two input arguments\n            % are object identical should be done by casting the arguments to a\n            % generic pointer type. Otherwise they will be cast to integers.\n\n    ;       can_compare_compound_values\n            % Should be set to yes if the target back end supports comparison\n            % of non-atomic values with builtin operators.\n\n    ;       lexically_order_constructors\n            % Should be set to yes if we need to order functors\n            % lexically when generating comparison predicates,\n            % e.g. to match the natural order that functors will be compared\n            % on the backend.\n\n    ;       mutable_always_boxed\n\n    ;       delay_partial_instantiations\n\n    % Options for internal use only (setting these options to non-default\n    % values can result in programs that do not link, or programs that dump\n    % core)\n    ;       allow_defn_of_builtins\n            % Do not generate errors for definitions of builtin predicates.\n            % When a new builtin is introduced, the installed compiler won't\n            % know about it, and thus when it sees its declaration, it wants a\n            % definition, but when the modified compiler is bootstrapped,\n            % it would normally generate an error when it sees that very same\n            % definition in the library (usually in builtin.m or\n            % private_builtin.m). When this option is set, it allows such\n            % definitions. Once the modified compiler is installed on all\n            % relevant machines, the option can be turned off again.\n\n    ;       special_preds\n            % Generate unify and compare preds. For measurement only.\n            % Code generated with this set to `no' is unlikely to actually\n            % work.\n\n    ;       type_ctor_info\n            % Generate type_ctor_info structures. For measurement only --\n            % if you turn this off, then you're unlikely to be able to link.\n\n    ;       type_ctor_layout\n            % Generate type_ctor_layout structures. For measurement only --\n            % if you turn this off, then you're unlikely to be able to link.\n\n    ;       type_ctor_functors\n            % Generate type_ctor_functors structures. For measurement only --\n            % if you turn this off, then you're unlikely to be able to link.\n\n    ;       new_type_class_rtti\n            % XXX temporary option: enables the generation of new style static\n            % data structures for runtime information about type classes.\n            % These are not yet used. When we add code to generate the matching\n            % dynamic data structures and switch over to use them, we won't\n            % need this option anymore.\n\n    ;       rtti_line_numbers\n            % Generate line number information in the RTTI when debugging is\n            % enabled. For measurement only -- if you turn this off, then the\n            % debugger may dereference garbage pointers.\n\n    ;       disable_minimal_model_stack_copy_pneg\n    ;       disable_minimal_model_stack_copy_cut\n    ;       use_minimal_model_stack_copy_pneg\n    ;       use_minimal_model_stack_copy_cut\n            % These four are used to analyze the performance effects\n            % of minimal model tabling.\n\n    ;       disable_trail_ops\n            % This is used to analyze the performance effects of trailing.\n\n    ;       size_region_ite_fixed\n    ;       size_region_disj_fixed\n    ;       size_region_semi_disj_fixed\n    ;       size_region_commit_fixed\n\n    ;       size_region_ite_protect\n    ;       size_region_ite_snapshot\n    ;       size_region_semi_disj_protect\n    ;       size_region_disj_snapshot\n    ;       size_region_commit_entry\n\n    ;       solver_type_auto_init\n            % Insert calls to solver type initialisation predicates when\n            % the inst of solver type variables changes from free to any.\n\n    ;       allow_multi_arm_switches\n\n    ;       type_check_constraints\n\n    ;       allow_argument_packing\n\n    % Code generation options\n    ;       low_level_debug\n    ;       table_debug\n    ;       trad_passes\n    ;       parallel_liveness\n    ;       parallel_code_gen\n    ;       polymorphism\n    ;       reclaim_heap_on_failure\n    ;       reclaim_heap_on_semidet_failure\n    ;       reclaim_heap_on_nondet_failure\n    ;       have_delay_slot\n    ;       num_real_r_regs\n    ;       num_real_f_regs\n    ;       num_real_r_temps\n    ;       num_real_f_temps\n    ;       max_jump_table_size\n    ;       max_specialized_do_call_closure\n    ;       max_specialized_do_call_class_method\n    ;       compare_specialization\n    ;       should_pretest_equality\n    ;       fact_table_max_array_size\n            % Maximum number of elements in a single fact table data array.\n\n    ;       fact_table_hash_percent_full\n            % How full the fact table hash tables should be allowed to get,\n            % given as an integer percentage.\n\n    ;       gcc_local_labels\n    ;       prefer_switch\n    ;       opt_no_return_calls\n\n    % Optimization Options\n    ;       opt_level\n    ;       opt_level_number\n    ;       opt_space                   % Default is to optimize time.\n    ;       intermodule_optimization\n    ;       read_opt_files_transitively\n    ;       use_opt_files\n    ;       use_trans_opt_files\n    ;       transitive_optimization\n    ;       intermodule_analysis\n    ;       analysis_repeat\n    ;       analysis_file_cache\n\n    %   - HLDS\n    ;       allow_inlining\n    ;       inlining\n    ;       inline_simple\n    ;       inline_builtins\n    ;       inline_single_use\n    ;       inline_call_cost\n    ;       inline_compound_threshold\n    ;       inline_simple_threshold\n    ;       inline_vars_threshold\n    ;       intermod_inline_simple_threshold\n    ;       from_ground_term_threshold\n    ;       enable_const_struct\n    ;       common_struct\n    ;       common_struct_preds\n    ;       common_goal\n    ;       constraint_propagation\n    ;       local_constraint_propagation\n    ;       optimize_unused_args\n    ;       intermod_unused_args\n    ;       optimize_higher_order\n    ;       higher_order_size_limit\n    ;       higher_order_arg_limit\n    ;       unneeded_code\n    ;       unneeded_code_copy_limit\n    ;       unneeded_code_debug\n    ;       unneeded_code_debug_pred_name\n    ;       type_specialization\n    ;       user_guided_type_specialization\n    ;       introduce_accumulators\n    ;       optimize_constructor_last_call_accumulator\n    ;       optimize_constructor_last_call_null\n    ;       optimize_constructor_last_call\n    ;       optimize_duplicate_calls\n    ;       constant_propagation\n    ;       excess_assign\n    ;       optimize_format_calls\n    ;       optimize_saved_vars_const\n    ;       optimize_saved_vars_cell\n    ;       optimize_saved_vars_cell_loop\n    ;       optimize_saved_vars_cell_full_path\n    ;       optimize_saved_vars_cell_on_stack\n    ;       optimize_saved_vars_cell_candidate_headvars\n    ;       optimize_saved_vars_cell_cv_store_cost\n    ;       optimize_saved_vars_cell_cv_load_cost\n    ;       optimize_saved_vars_cell_fv_store_cost\n    ;       optimize_saved_vars_cell_fv_load_cost\n    ;       optimize_saved_vars_cell_op_ratio\n    ;       optimize_saved_vars_cell_node_ratio\n    ;       optimize_saved_vars_cell_all_path_node_ratio\n    ;       optimize_saved_vars_cell_include_all_candidates\n    ;       optimize_saved_vars\n    ;       loop_invariants\n    ;       delay_construct\n    ;       follow_code\n    ;       optimize_dead_procs\n    ;       deforestation\n    ;       deforestation_depth_limit\n    ;       deforestation_cost_factor\n    ;       deforestation_vars_threshold\n    ;       deforestation_size_threshold\n    ;       analyse_trail_usage\n    ;       optimize_trail_usage\n    ;       optimize_region_ops\n    ;       analyse_mm_tabling\n    ;       untuple\n    ;       tuple\n    ;       tuple_trace_counts_file\n    ;       tuple_costs_ratio\n    ;       tuple_min_args\n    ;       inline_par_builtins\n    ;       always_specialize_in_dep_par_conjs\n    ;       allow_some_paths_only_waits\n    ;       region_analysis\n\n    % Stuff for the CTGC system (structure sharing / structure reuse).\n    ;       structure_sharing_analysis\n    ;           structure_sharing_widening\n    ;       structure_reuse_analysis\n    ;           structure_reuse_constraint\n    ;           structure_reuse_constraint_arg\n    ;           structure_reuse_max_conditions\n    ;           structure_reuse_repeat\n    ;           structure_reuse_free_cells\n\n    % Stuff for the old termination analyser.\n    ;       termination\n    ;       termination_check\n    ;       verbose_check_termination\n    ;       termination_single_args\n    ;       termination_norm\n    ;       termination_error_limit\n    ;       termination_path_limit\n\n    % Stuff for the new termination analyser.\n    ;       termination2\n    ;          check_termination2\n    ;          verbose_check_termination2\n    ;          termination2_norm\n    ;          widening_limit\n    ;          arg_size_analysis_only\n    ;          propagate_failure_constrs\n    ;          term2_maximum_matrix_size\n    ;       analyse_exceptions\n    ;       analyse_closures\n\n    %   - HLDS->LLDS\n    ;       smart_indexing\n    ;         dense_switch_req_density\n    ;         lookup_switch_req_density\n    ;         dense_switch_size\n    ;         lookup_switch_size\n    ;         string_hash_switch_size\n    ;         string_binary_switch_size\n    ;         tag_switch_size\n    ;         try_switch_size\n    ;         binary_switch_size\n    ;         switch_single_rec_base_first\n    ;         switch_multi_rec_base_first\n\n    ;       static_ground_cells\n    ;       static_ground_floats\n    ;       static_code_addresses\n\n    ;       use_atomic_cells\n    ;       middle_rec\n    ;       simple_neg\n    ;       allow_hijacks\n\n    %   - MLDS\n    ;       optimize_tailcalls\n    ;       optimize_initializations\n    ;       eliminate_local_vars\n    ;       generate_trail_ops_inline\n\n    %   - LLDS\n    ;       common_data\n    ;       common_layout_data\n    ;       optimize            % Also used for MLDS->MLDS optimizations.\n    ;       optimize_peep\n    ;       optimize_peep_mkword\n    ;       optimize_jumps\n    ;       optimize_fulljumps\n    ;       pessimize_tailcalls\n    ;       checked_nondet_tailcalls\n    ;       use_local_vars\n    ;       local_var_access_threshold\n    ;       standardize_labels\n    ;       optimize_labels\n    ;       optimize_dups\n    ;       optimize_proc_dups\n    ;       optimize_frames\n    ;       optimize_delay_slot\n    ;       optimize_reassign\n    ;       optimize_repeat\n    ;       layout_compression_limit\n\n    %   - C\n    ;       use_macro_for_redo_fail\n    ;       emit_c_loops\n    ;       procs_per_c_function\n    ;       everything_in_one_c_function\n    ;       local_thread_engine_base\n\n    %   - IL\n    %   (none yet)\n\n    %   - Erlang\n    ;       erlang_switch_on_strings_as_atoms\n\n    % Target code compilation options\n    ;       target_debug\n\n    % C\n    ;       cc\n    ;       cflags\n    ;       quoted_cflag\n    ;       c_include_directory\n    ;       c_optimize\n    ;       ansi_c\n    ;       inline_alloc\n\n    % Flags for specific C compilers.\n    ;       gcc_flags\n    ;       quoted_gcc_flag\n    ;       clang_flags\n    ;       quoted_clang_flag\n    ;       msvc_flags\n    ;       quoted_msvc_flag\n\n    % Auto-configured C compilation options.\n    ;       cflags_for_warnings\n    ;       cflags_for_optimization\n    ;       cflags_for_ansi\n    ;       cflags_for_regs\n    ;       cflags_for_gotos\n    ;       cflags_for_threads\n    ;       cflags_for_debug\n    ;       cflags_for_pic\n    ;       c_flag_to_name_object_file\n    ;       object_file_extension\n    ;       pic_object_file_extension\n    ;       link_with_pic_object_file_extension\n    ;       c_compiler_type\n    ;       csharp_compiler_type\n\n    % Java\n    ;       java_compiler\n    ;       java_interpreter\n    ;       java_flags\n    ;       quoted_java_flag\n    ;       java_classpath\n    ;       java_object_file_extension\n\n    % IL\n    ;       il_assembler\n    ;       ilasm_flags\n    ;       quoted_ilasm_flag\n    ;       dotnet_library_version\n    ;       support_ms_clr\n    ;       support_rotor_clr\n\n    % C#\n    ;       csharp_compiler\n    ;       csharp_flags\n    ;       quoted_csharp_flag\n    ;       cli_interpreter\n\n    % Erlang\n    ;       erlang_compiler\n    ;       erlang_interpreter\n    ;       erlang_flags\n    ;       quoted_erlang_flag\n    ;       erlang_include_directory\n    ;       erlang_object_file_extension\n    ;       erlang_native_code\n    ;       erlang_inhibit_trivial_warnings\n\n    % Link options\n    ;       output_file_name\n    ;       ld_flags\n    ;       quoted_ld_flag\n    ;       ld_libflags\n    ;       quoted_ld_libflag\n    ;       link_library_directories\n    ;       runtime_link_library_directories\n    ;       link_libraries\n    ;       link_objects\n    ;       mercury_library_directories\n    ;       mercury_library_directory_special\n    ;       search_library_files_directories\n    ;       search_library_files_directory_special\n    ;       mercury_libraries\n    ;       mercury_library_special\n    ;       mercury_standard_library_directory\n    ;       mercury_standard_library_directory_special\n    ;       init_file_directories\n    ;       init_files\n    ;       trace_init_files\n    ;       linkage\n    ;       linkage_special\n    ;       mercury_linkage\n    ;       mercury_linkage_special\n    ;       strip\n    ;       demangle\n    ;       main\n    ;       allow_undefined\n    ;       use_readline\n    ;       runtime_flags\n    ;       extra_initialization_functions\n    ;       frameworks\n    ;       framework_directories\n\n    % Auto-configured options.\n    ;       shared_library_extension\n    ;       library_extension\n    ;       executable_file_extension\n    ;       link_executable_command\n    ;       link_shared_lib_command\n    ;       create_archive_command\n    ;       create_archive_command_output_flag\n    ;       create_archive_command_flags\n    ;       ranlib_command\n    ;       ranlib_flags\n    ;       mkinit_command\n    ;       mkinit_erl_command\n    ;       demangle_command\n    ;       filtercc_command\n    ;       trace_libs\n    ;       thread_libs\n    ;       hwloc_libs\n    ;       hwloc_static_libs\n    ;       shared_libs\n    ;       math_lib\n    ;       readline_libs\n    ;       linker_opt_separator\n    ;       linker_thread_flags\n    ;       shlib_linker_thread_flags\n    ;       linker_static_flags\n    ;       linker_strip_flag\n    ;       linker_link_lib_flag\n    ;       linker_link_lib_suffix\n    ;       shlib_linker_link_lib_flag\n    ;       shlib_linker_link_lib_suffix\n    ;       linker_debug_flags\n    ;       shlib_linker_debug_flags\n    ;       linker_trace_flags\n    ;       shlib_linker_trace_flags\n    ;       linker_path_flag\n    ;       linker_rpath_flag\n    ;       linker_rpath_separator\n    ;       shlib_linker_rpath_flag\n    ;       shlib_linker_rpath_separator\n    ;       linker_allow_undefined_flag\n    ;       linker_error_undefined_flag\n    ;       shlib_linker_use_install_name\n    ;       shlib_linker_install_name_flag\n    ;       shlib_linker_install_name_path\n    ;       java_archive_command\n\n    % Build system options\n    ;       make\n    ;       keep_going\n    ;       rebuild\n    ;       jobs\n    ;       track_flags\n    ;       invoked_by_mmc_make\n    ;       extra_init_command\n    ;       pre_link_command\n    ;       install_prefix\n    ;       use_symlinks\n    ;       mercury_configuration_directory\n    ;       mercury_configuration_directory_special\n    ;       install_command\n    ;       install_command_dir_option\n    ;       libgrades\n    ;       libgrades_include_components\n    ;       libgrades_exclude_components\n    ;       lib_linkages\n    ;       flags_file\n    ;       options_files\n    ;       config_file\n    ;       options_search_directories\n    ;       use_subdirs\n    ;       use_grade_subdirs\n    ;       search_directories\n    ;       intermod_directories\n    ;       use_search_directories_for_intermod\n    ;       libgrade_install_check\n    ;       order_make_by_timestamp\n    ;       show_make_times\n    ;       extra_library_header\n    ;       restricted_command_line\n    ;       env_type\n    ;       host_env_type\n    ;       target_env_type\n\n    % Miscellaneous Options\n    ;       filenames_from_stdin\n    ;       typecheck_ambiguity_warn_limit\n    ;       typecheck_ambiguity_error_limit\n    ;       help\n    ;       version\n    ;       fullarch\n    ;       cross_compiling\n    ;       local_module_id\n    ;       analysis_file_cache_dir\n    ;       compiler_sufficiently_recent\n            % This option is used to test that the compiler is sufficiently\n            % recent when no other test can easily be constructed in\n            % configure.in.\n\n    ;       experiment\n            % This option is provided for use by implementors who want to\n            % compare a new way of doing something with the old way. The idea\n            % is that the code that switches between the two ways should\n            % consult this option and make its decision accordingly.\n            %\n            % The intention is that all use of this option is within developer\n            % workspaces; no code using this option should be committed.\n            %\n            % Of course, a developer could always create a purpose-specific\n            % option to control their code, but adding an option requires\n            % recompiling most of the modules in the compiler. Having this\n            % option permanently here should reduce the need for that.\n\n    ;       ignore_par_conjunctions\n    ;       control_granularity\n    ;       distance_granularity\n    ;       implicit_parallelism\n    ;       feedback_file\n    ;       par_loop_control\n    ;       par_loop_control_preserve_tail_recursion.\n\n%----------------------------------------------------------------------------%\n%----------------------------------------------------------------------------%\n\n:- implementation.\n\n:- import_module libs.handle_options.\n\n:- import_module assoc_list.\n:- import_module bool.\n:- import_module dir.\n:- import_module int.\n:- import_module list.\n:- import_module map.\n:- import_module maybe.\n:- import_module pair.\n:- import_module require.\n:- import_module string.\n\n%----------------------------------------------------------------------------%\n\n:- type option_category\n    --->    warning_option\n    ;       verbosity_option\n    ;       output_option\n    ;       aux_output_option\n    ;       language_semantics_option\n    ;       compilation_model_option\n    ;       internal_use_option\n    ;       code_gen_option\n    ;       special_optimization_option\n    ;       optimization_option\n    ;       target_code_compilation_option\n    ;       link_option\n    ;       build_system_option\n    ;       miscellaneous_option.\n\noption_defaults(Option, Default) :-\n    option_defaults_2(_Category, OptionsList),\n    list.member(Option - Default, OptionsList).\n\n:- pred option_defaults_2(option_category, list(pair(option, option_data))).\n:- mode option_defaults_2(in, out) is det.\n:- mode option_defaults_2(out, out) is multi.\n\noption_defaults_2(warning_option, [\n    % Warning Options\n    inhibit_warnings                    -   bool_special,\n    inhibit_accumulator_warnings        -   bool(no),\n    halt_at_warn                        -   bool(no),\n    halt_at_syntax_errors               -   bool(no),\n    halt_at_auto_parallel_failure       -   bool(no),\n\n    % IMPORTANT NOTE:\n    % if you add any new warning options, or if you change the default\n    % for an existing warning option to `yes', then you will need to modify\n    % the handling of inhibit_warnings.\n\n    warn_singleton_vars                 -   bool(yes),\n    warn_overlapping_scopes             -   bool(yes),\n    warn_det_decls_too_lax              -   bool(yes),\n    warn_inferred_erroneous             -   bool(yes),\n    warn_nothing_exported               -   bool(yes),\n    warn_unused_args                    -   bool(no),\n    warn_interface_imports              -   bool(yes),\n    warn_non_contiguous_clauses         -   bool(no),   % XXX should be yes\n    warn_non_contiguous_foreign_procs   -   bool(no),\n    warn_non_stratification             -   bool(no),\n    warn_missing_opt_files              -   bool(yes),\n    warn_missing_trans_opt_files        -   bool(no),\n    warn_missing_trans_opt_deps         -   bool(yes),\n    warn_unification_cannot_succeed     -   bool(yes),\n    warn_simple_code                    -   bool(yes),\n    warn_duplicate_calls                -   bool(no),\n    warn_missing_module_name            -   bool(yes),\n    warn_wrong_module_name              -   bool(yes),\n    warn_smart_recompilation            -   bool(yes),\n    warn_undefined_options_variables    -   bool(yes),\n    warn_non_tail_recursion             -   bool(no),\n    warn_target_code                    -   bool(yes),\n    warn_up_to_date                     -   bool(yes),\n    warn_stubs                          -   bool(yes),\n    warn_dead_procs                     -   bool(no),\n    warn_table_with_inline              -   bool(yes),\n    warn_non_term_special_preds         -   bool(yes),\n    warn_known_bad_format_calls         -   bool(yes),\n    warn_unknown_format_calls           -   bool(no),\n    warn_obsolete                       -   bool(yes),\n    warn_insts_without_matching_type    -   bool(yes),\n        % XXX disabled by default until someone\n        % removes all the unused imports from\n        % the compiler itself which is compiled\n        % with --halt-at-warn by default.\n    warn_unused_imports                 -   bool(no),\n    inform_ite_instead_of_switch        -   bool(no),\n    warn_unresolved_polymorphism        -   bool(yes),\n    warn_suspicious_foreign_procs       -   bool(no),\n    warn_state_var_shadowing            -   bool(yes),\n    inform_inferred                     -   bool_special,\n    inform_inferred_types               -   bool(yes),\n    inform_inferred_modes               -   bool(yes)\n]).\noption_defaults_2(verbosity_option, [\n    % Verbosity Options\n    verbose                             -   bool(no),\n    very_verbose                        -   bool(no),\n    verbose_errors                      -   bool(no),\n    verbose_recompilation               -   bool(no),\n    find_all_recompilation_reasons      -   bool(no),\n    verbose_make                        -   bool(yes),\n    verbose_commands                    -   bool(no),\n    output_compile_error_lines          -   int(15),\n    report_cmd_line_args                -   bool(no),\n    report_cmd_line_args_in_doterr      -   bool(no),\n    statistics                          -   bool(no),\n    detailed_statistics                 -   bool(no),\n    proc_size_statistics                -   string(\"\"),\n    debug_types                         -   bool(no),\n    debug_modes                         -   bool(no),\n    debug_modes_statistics              -   bool(no),\n    debug_modes_minimal                 -   bool(no),\n    debug_modes_verbose                 -   bool(no),\n    debug_modes_pred_id                 -   int(-1),\n    debug_dep_par_conj                  -   accumulating([]),\n    debug_det                           -   bool(no),\n    debug_code_gen_pred_id              -   int(-1),\n    debug_term                          -   bool(no),\n    debug_opt                           -   bool(no),\n    debug_opt_pred_id                   -   accumulating([]),\n    debug_opt_pred_name                 -   accumulating([]),\n    debug_pd                            -   bool(no),\n    debug_il_asm                        -   bool(no),\n    debug_liveness                      -   int(-1),\n    debug_stack_opt                     -   int(-1),\n    debug_make                          -   bool(no),\n    debug_closure                       -   bool(no),\n    debug_trail_usage                   -   bool(no),\n    debug_mode_constraints              -   bool(no),\n    debug_intermodule_analysis          -   bool(no),\n    debug_mm_tabling_analysis           -   bool(no),\n    debug_indirect_reuse                -   bool(no),\n    debug_type_rep                      -   bool(no)\n]).\noption_defaults_2(output_option, [\n    % Output Options (mutually exclusive)\n    generate_source_file_mapping        -   bool(no),\n    generate_dependency_file            -   bool(no),\n    generate_dependencies               -   bool(no),\n    generate_module_order               -   bool(no),\n    generate_standalone_interface       -   maybe_string(no),\n    make_short_interface                -   bool(no),\n    make_interface                      -   bool(no),\n    make_private_interface              -   bool(no),\n    make_optimization_interface         -   bool(no),\n    make_transitive_opt_interface       -   bool(no),\n    make_analysis_registry              -   bool(no),\n    make_xml_documentation              -   bool(no),\n    convert_to_mercury                  -   bool(no),\n    typecheck_only                      -   bool(no),\n    errorcheck_only                     -   bool(no),\n    target_code_only                    -   bool(no),\n    compile_only                        -   bool(no),\n    compile_to_shared_lib               -   bool(no),\n    output_grade_string                 -   bool(no),\n    output_link_command                 -   bool(no),\n    output_shared_lib_link_command      -   bool(no),\n    output_libgrades                    -   bool(no),\n    output_cc                           -   bool(no),\n    output_c_compiler_type              -   bool(no),\n    output_csharp_compiler_type         -   bool(no),\n    output_cflags                       -   bool(no),\n    output_library_link_flags           -   bool(no),\n    output_grade_defines                -   bool(no),\n    output_c_include_directory_flags    -   bool(no)\n]).\noption_defaults_2(aux_output_option, [\n    % Auxiliary Output Options\n    smart_recompilation                 -   bool(no),\n    generate_item_version_numbers       -   bool(no),\n    generate_mmc_make_module_dependencies - bool(no),\n    assume_gmake                        -   bool(yes),\n    trace_level                         -   string(\"default\"),\n    trace_optimized                     -   bool(no),\n    trace_prof                          -   bool(no),\n    trace_table_io                      -   bool(no),\n    trace_table_io_only_retry           -   bool(no),\n    trace_table_io_states               -   bool(no),\n    trace_table_io_require              -   bool(no),\n    trace_table_io_all                  -   bool(no),\n    trace_goal_flags                    -   accumulating([]),\n    prof_optimized                      -   bool(no),\n    exec_trace_tail_rec                 -   bool(no),\n    suppress_trace                      -   string(\"\"),\n    force_disable_tracing               -   bool(no),\n    delay_death                         -   bool(yes),\n    delay_death_max_vars                -   int(1000),\n    stack_trace_higher_order            -   bool(no),\n    force_disable_ssdebug               -   bool(no),\n    generate_bytecode                   -   bool(no),\n    line_numbers                        -   bool(yes),\n    auto_comments                       -   bool(no),\n    frameopt_comments                   -   bool(no),\n    max_error_line_width                -   int(79),\n    show_dependency_graph               -   bool(no),\n    imports_graph                       -   bool(no),\n    dump_trace_counts                   -   accumulating([]),\n    dump_hlds                           -   accumulating([]),\n    dump_hlds_pred_id                   -   accumulating([]),\n    dump_hlds_pred_name                 -   accumulating([]),\n    dump_hlds_alias                     -   string(\"\"),\n    dump_hlds_options                   -   string(\"\"),\n    dump_hlds_inst_limit                -   int(100),\n    dump_hlds_file_suffix               -   string(\"\"),\n    dump_same_hlds                      -   bool(no),\n    dump_mlds                           -   accumulating([]),\n    verbose_dump_mlds                   -   accumulating([]),\n    mode_constraints                    -   bool(no),\n    simple_mode_constraints             -   bool(no),\n    prop_mode_constraints               -   bool(no),\n    benchmark_modes                     -   bool(no),\n    benchmark_modes_repeat              -   int(1),\n    sign_assembly                       -   bool(no),\n    % XXX should default to no but currently broken\n    separate_assemblies                 -   bool(yes)\n]).\noption_defaults_2(language_semantics_option, [\n    strict_sequential                   -   special,\n    reorder_conj                        -   bool(yes),\n    reorder_disj                        -   bool(yes),\n    fully_strict                        -   bool(yes),\n    allow_stubs                         -   bool(no),\n    infer_types                         -   bool(no),\n    infer_modes                         -   bool(no),\n    infer_det                           -   bool(yes),\n    infer_all                           -   bool_special,\n    type_inference_iteration_limit      -   int(60),\n    mode_inference_iteration_limit      -   int(30),\n    event_set_file_name                 -   string(\"\")\n]).\noption_defaults_2(compilation_model_option, [\n    % Compilation model options (ones that affect binary compatibility).\n    grade                               -   string_special,\n    % The `mmc' script will pass the default grade determined\n    % at configuration time.\n\n    % Target selection compilation model options\n    target                              -   string(\"c\"),\n    il                                  -   special,\n    il_only                             -   special,\n    compile_to_c                        -   special,\n    csharp                              -   special,\n    csharp_only                         -   special,\n    java                                -   special,\n    java_only                           -   special,\n    x86_64                              -   special,\n    x86_64_only                         -   special,\n    erlang                              -   special,\n    erlang_only                         -   special,\n\n    % Optional feature compilation model options:\n    % (a) Debuggging\n    exec_trace                          -   bool(no),\n    decl_debug                          -   bool(no),\n    % (b) Profiling\n    profiling                           -   bool_special,\n    time_profiling                      -   special,\n    memory_profiling                    -   special,\n    deep_profiling                      -   special,\n    profile_calls                       -   bool(no),\n    profile_time                        -   bool(no),\n    profile_memory                      -   bool(no),\n    profile_deep                        -   bool(no),\n    use_activation_counts               -   bool(no),\n    pre_prof_transforms_simplify        -   bool(no),\n    pre_implicit_parallelism_simplify   -   bool(no),\n    coverage_profiling                  -   bool(yes),\n    coverage_profiling_via_calls        -   bool(no),\n    coverage_profiling_static           -   bool(no),\n    profile_deep_coverage_after_goal    -   bool(yes),\n    profile_deep_coverage_branch_ite    -   bool(yes),\n    profile_deep_coverage_branch_switch -   bool(yes),\n    profile_deep_coverage_branch_disj   -   bool(yes),\n    profile_deep_coverage_use_portcounts -  bool(no),\n    profile_deep_coverage_use_trivial   -   bool(no),\n    profile_for_feedback                -   bool(no),\n    use_zeroing_for_ho_cycles           -   bool(yes),\n    use_lots_of_ho_specialization       -   bool(no),\n    deep_profile_tail_recursion         -   bool(no),\n    record_term_sizes_as_words          -   bool(no),\n    record_term_sizes_as_cells          -   bool(no),\n    experimental_complexity             -   string(\"\"),\n    % (c) Miscellaneous optional features\n    gc                                  -   string(\"boehm\"),\n    parallel                            -   bool(no),\n    threadscope                         -   bool(no),\n    use_trail                           -   bool(no),\n    trail_segments                      -   bool(no),\n    maybe_thread_safe_opt               -   string(\"no\"),\n    extend_stacks_when_needed           -   bool(no),\n    stack_segments                      -   bool(no),\n    use_regions                         -   bool(no),\n    use_alloc_regions                   -   bool(yes),\n    use_regions_debug                   -   bool(no),\n    use_regions_profiling               -   bool(no),\n    use_minimal_model_stack_copy        -   bool(no),\n    use_minimal_model_own_stacks        -   bool(no),\n    minimal_model_debug                 -   bool(no),\n    single_prec_float                   -   bool(no),\n    type_layout                         -   bool(yes),\n    source_to_source_debug              -   bool(no),\n    ssdb_trace_level                    -   string(\"default\"),\n    link_ssdb_libs                      -   bool(no),\n\n    % Data representation compilation model options\n    pic_reg                             -   bool(no),\n    tags                                -   string(\"low\"),\n    num_tag_bits                        -   int(-1),\n                                        % -1 is a special value which means\n                                        % use the value of conf_low_tag_bits\n                                        % instead\n    num_reserved_addresses              -   int(0),\n    num_reserved_objects                -   int(0),\n    bits_per_word                       -   int(32),\n                                        % A good default for the current\n                                        % generation of architectures.\n    bytes_per_word                      -   int(4),\n                                        % A good default for the current\n                                        % generation of architectures.\n    conf_low_tag_bits                   -   int(2),\n                                        % The `mmc' script will override the\n                                        % above default with a value determined\n                                        % at configuration time.\n    sync_term_size                      -   int(8),\n                                        % 8 is the size on linux (at the time\n                                        % of writing) - will usually be\n                                        % overridden by a value from configure.\n    unboxed_float                       -   bool(no),\n    unboxed_enums                       -   bool(yes),\n    unboxed_no_tag_types                -   bool(yes),\n\n    % LLDS back-end compilation model options\n    gcc_non_local_gotos                 -   bool(yes),\n    gcc_global_registers                -   bool(yes),\n    asm_labels                          -   bool(yes),\n    use_float_registers                 -   bool(yes),\n\n    % MLDS back-end compilation model options\n    highlevel_code                      -   bool(no),\n    highlevel_data                      -   bool(no),\n    gcc_nested_functions                -   bool(no),\n    det_copy_out                        -   bool(no),\n    nondet_copy_out                     -   bool(no),\n    put_commit_in_own_func              -   bool(no),\n    put_nondet_env_on_heap              -   bool(no),\n\n    % IL back-end compilation model options\n    verifiable_code                     -   bool(no),\n    il_funcptr_types                    -   bool(no),\n    il_refany_fields                    -   bool(no),\n    il_byref_tailcalls                  -   bool(no)\n]).\noption_defaults_2(internal_use_option, [\n    % Options for internal use only\n    backend_foreign_languages           -  accumulating([]),\n                                        % The backend_foreign_languages option\n                                        % depends on the target and is set in\n                                        % handle_options.\n    stack_trace                         -   bool(no),\n    basic_stack_layout                  -   bool(no),\n    agc_stack_layout                    -   bool(no),\n    procid_stack_layout                 -   bool(no),\n    trace_stack_layout                  -   bool(no),\n    body_typeinfo_liveness              -   bool(no),\n    can_compare_constants_as_ints       -   bool(no),\n    pretest_equality_cast_pointers      -   bool(no),\n    can_compare_compound_values         -   bool(no),\n    lexically_order_constructors        -   bool(no),\n    mutable_always_boxed                -   bool(yes),\n    delay_partial_instantiations        -   bool(no),\n    allow_defn_of_builtins              -   bool(no),\n    special_preds                       -   bool(yes),\n    type_ctor_info                      -   bool(yes),\n    type_ctor_layout                    -   bool(yes),\n    type_ctor_functors                  -   bool(yes),\n    rtti_line_numbers                   -   bool(yes),\n    new_type_class_rtti                 -   bool(no),\n    disable_minimal_model_stack_copy_pneg - bool(no),\n    disable_minimal_model_stack_copy_cut -  bool(no),\n    use_minimal_model_stack_copy_pneg   -   bool(no),\n    use_minimal_model_stack_copy_cut    -   bool(no),\n    disable_trail_ops                   -   bool(no),\n    % The size_* values below *must* be consistent with the corresponding\n    % values or data structures in mercury_region.h.\n    size_region_ite_fixed               -   int(4),\n    size_region_disj_fixed              -   int(4),\n    size_region_commit_fixed            -   int(5),\n    size_region_ite_protect             -   int(1),\n    size_region_ite_snapshot            -   int(3),\n    size_region_semi_disj_protect       -   int(1),\n    size_region_disj_snapshot           -   int(3),\n    size_region_commit_entry            -   int(1),\n    solver_type_auto_init               -   bool(no),\n    allow_multi_arm_switches            -   bool(yes),\n    type_check_constraints              -   bool(no),\n    allow_argument_packing              -   bool(yes)\n]).\noption_defaults_2(code_gen_option, [\n    % Code Generation Options\n    low_level_debug                     -   bool(no),\n    table_debug                         -   bool(no),\n    trad_passes                         -   bool(yes),\n    parallel_liveness                   -   bool(no),\n    parallel_code_gen                   -   bool(no),\n    polymorphism                        -   bool(yes),\n    reclaim_heap_on_failure             -   bool_special,\n    reclaim_heap_on_semidet_failure     -   bool(yes),\n    reclaim_heap_on_nondet_failure      -   bool(yes),\n    have_delay_slot                     -   bool(no),\n                                        % The `mmc' script may override the\n                                        % above default if configure says\n                                        % the machine has branch delay slots.\n    num_real_r_regs                     -   int(5),\n    num_real_f_regs                     -   int(0),\n    num_real_r_temps                    -   int(5),\n    num_real_f_temps                    -   int(0),\n                                        % The `mmc' script will override the\n                                        % above defaults with values determined\n                                        % at configuration time.\n    max_jump_table_size                 -   int(0),\n                                        % 0 indicates any size.\n    max_specialized_do_call_closure     -   int(5),\n                                        % mercury.do_call_closure_N\n                                        % exists for N <= option_value;\n                                        % set to -1 to disable.\n                                        % Should be less than or equal to\n                                        % max_spec_explicit_arg\n                                        % in tools/make_spec_ho_call.\n    max_specialized_do_call_class_method -  int(6),\n                                        % mercury.do_call_class_method_N\n                                        % exists for N <= option_value;\n                                        % set to -1 to disable.\n                                        % Should be less than or equal to\n                                        % max_spec_explicit_arg\n                                        % in tools/make_spec_method_call.\n    compare_specialization              -   int(-1),\n                                        % -1 asks handle_options.m to give\n                                        % the value, which may be grade\n                                        % dependent.\n    should_pretest_equality             -   bool(yes),\n    fact_table_max_array_size           -   int(1024),\n    fact_table_hash_percent_full        -   int(90),\n    gcc_local_labels                    -   bool(no),\n    prefer_switch                       -   bool(yes),\n    opt_no_return_calls                 -   bool(yes)\n]).\noption_defaults_2(special_optimization_option, [\n    % Special optimization options.\n    % These ones are not affected by `-O<n>'.\n    opt_level                           -   int_special,\n    opt_level_number                    -   int(-2),\n    opt_space                           -   special,\n    intermodule_optimization            -   bool(no),\n    read_opt_files_transitively         -   bool(yes),\n    use_opt_files                       -   bool(no),\n    use_trans_opt_files                 -   bool(no),\n    transitive_optimization             -   bool(no),\n    intermodule_analysis                -   bool(no),\n    analysis_repeat                     -   int(0),\n    analysis_file_cache                 -   bool(no),\n    termination_check                   -   bool(no),\n    verbose_check_termination           -   bool(no),\n    structure_sharing_analysis          -   bool(no),\n    structure_sharing_widening          -   int(0),\n    structure_reuse_analysis            -   bool(no),\n    structure_reuse_constraint        -   string(\"within_n_cells_difference\"),\n    structure_reuse_constraint_arg      -   int(0),\n    structure_reuse_max_conditions      -   int(10),\n    structure_reuse_repeat              -   int(0),\n    structure_reuse_free_cells          -   bool(no),\n    termination                         -   bool(no),\n    termination_single_args             -   int(0),\n    termination_norm                    -   string(\"total\"),\n    termination_error_limit             -   int(3),\n    termination_path_limit              -   int(256),\n    termination2                        -   bool(no),\n    termination2_norm                   -   string(\"total\"),\n    check_termination2                  -   bool(no),\n    verbose_check_termination2          -   bool(no),\n    widening_limit                      -   int(4),\n    arg_size_analysis_only              -   bool(no),\n    propagate_failure_constrs           -   bool(yes),\n    % XXX This is just a guess - I'm not sure what sensible\n    % value for this is.\n    term2_maximum_matrix_size           -   int(70),\n    analyse_exceptions                  -   bool(no),\n    analyse_closures                    -   bool(no),\n    analyse_trail_usage                 -   bool(no),\n    optimize_trail_usage                -   bool(no),\n    optimize_region_ops                 -   bool(no),\n    analyse_mm_tabling                  -   bool(no)\n]).\noption_defaults_2(optimization_option, [\n    % Optimization options\n    %\n    % IMPORTANT: the default here should be all optimizations OFF.\n    % Optimizations should be enabled by the appropriate\n    % optimization level in the opt_level table.\n\n    % HLDS\n    allow_inlining                      -   bool(yes),\n    inlining                            -   bool_special,\n    inline_simple                       -   bool(no),\n    inline_builtins                     -   bool(yes),\n    inline_single_use                   -   bool(no),\n    inline_call_cost                    -   int(0),\n    inline_compound_threshold           -   int(0),\n    inline_simple_threshold             -   int(5),\n                                        % Has no effect until\n                                        % --inline-simple is enabled.\n    inline_vars_threshold               -   int(100),\n    intermod_inline_simple_threshold    -   int(5),\n                                        % Has no effect until\n                                        % --intermodule-optimization.\n    from_ground_term_threshold          -   int(5),\n    enable_const_struct                 -   bool(yes),\n    common_struct                       -   bool(no),\n    common_struct_preds                 -   string(\"\"),\n    common_goal                         -   bool(yes),\n                                        % common_goal is not really an\n                                        % optimization, since it affects\n                                        % the semantics.\n\n    constraint_propagation              -   bool(no),\n    local_constraint_propagation        -   bool(no),\n    optimize_duplicate_calls            -   bool(no),\n    constant_propagation                -   bool(no),\n    excess_assign                       -   bool(no),\n    optimize_format_calls               -   bool(yes),\n    loop_invariants                     -   bool(no),\n    optimize_saved_vars_const           -   bool(no),\n    optimize_saved_vars_cell            -   bool(no),\n    optimize_saved_vars_cell_loop       -   bool(yes),\n    optimize_saved_vars_cell_full_path  -   bool(yes),\n    optimize_saved_vars_cell_on_stack   -   bool(yes),\n    optimize_saved_vars_cell_candidate_headvars -   bool(yes),\n    optimize_saved_vars_cell_cv_store_cost - int(3),\n    optimize_saved_vars_cell_cv_load_cost  - int(1),\n    optimize_saved_vars_cell_fv_store_cost - int(1),\n    optimize_saved_vars_cell_fv_load_cost  - int(1),\n    optimize_saved_vars_cell_op_ratio   -   int(100),\n    optimize_saved_vars_cell_node_ratio -   int(100),\n    optimize_saved_vars_cell_all_path_node_ratio    - int(100),\n    optimize_saved_vars_cell_include_all_candidates - bool(yes),\n    optimize_saved_vars                 -   bool_special,\n    delay_construct                     -   bool(no),\n    follow_code                         -   bool(no),\n    optimize_unused_args                -   bool(no),\n    intermod_unused_args                -   bool(no),\n    optimize_higher_order               -   bool(no),\n    higher_order_size_limit             -   int(20),\n    higher_order_arg_limit              -   int(10),\n    unneeded_code                       -   bool(no),\n    unneeded_code_copy_limit            -   int(10),\n    unneeded_code_debug                 -   bool(no),\n    unneeded_code_debug_pred_name       -   accumulating([]),\n    type_specialization                 -   bool(no),\n    user_guided_type_specialization     -   bool(no),\n    introduce_accumulators              -   bool(no),\n    optimize_constructor_last_call_accumulator -    bool(no),\n    optimize_constructor_last_call_null -   bool(no),\n    optimize_constructor_last_call      -   bool(no),\n    optimize_dead_procs                 -   bool(no),\n    deforestation                       -   bool(no),\n    deforestation_depth_limit           -   int(4),\n    deforestation_cost_factor           -   int(1000),\n    deforestation_vars_threshold        -   int(200),\n    deforestation_size_threshold        -   int(15),\n    untuple                             -   bool(no),\n    tuple                               -   bool(no),\n    tuple_trace_counts_file             -   string(\"\"),\n    tuple_costs_ratio                   -   int(100),\n    tuple_min_args                      -   int(4),\n    inline_par_builtins                 -   bool(no),\n    always_specialize_in_dep_par_conjs  -   bool(no),\n    allow_some_paths_only_waits         -   bool(yes),\n    region_analysis                     -   bool(no),\n\n    % HLDS -> LLDS\n    smart_indexing                      -   bool(no),\n    dense_switch_req_density            -   int(25),\n                                        % Minimum density before using\n                                        % a dense switch.\n    lookup_switch_req_density           -   int(25),\n                                        % Minimum density before using\n                                        % a lookup switch.\n    dense_switch_size                   -   int(4),\n    lookup_switch_size                  -   int(4),\n    string_hash_switch_size             -   int(8),\n    string_binary_switch_size           -   int(4),\n    tag_switch_size                     -   int(3),\n    try_switch_size                     -   int(3),\n    binary_switch_size                  -   int(4),\n    switch_single_rec_base_first        -   bool(no),\n    switch_multi_rec_base_first         -   bool(yes),\n    static_ground_cells                 -   bool(no),\n    static_ground_floats                -   bool(no),\n    static_code_addresses               -   bool(no),\n    use_atomic_cells                    -   bool(no),\n    middle_rec                          -   bool(no),\n    simple_neg                          -   bool(no),\n    allow_hijacks                       -   bool(yes),\n\n    % MLDS\n    optimize_tailcalls                  -   bool(no),\n    optimize_initializations            -   bool(no),\n    eliminate_local_vars                -   bool(no),\n    generate_trail_ops_inline           -   bool(yes),\n\n    % LLDS\n    common_data                         -   bool(no),\n    common_layout_data                  -   bool(yes),\n    optimize                            -   bool(no),\n    optimize_peep                       -   bool(no),\n    optimize_peep_mkword                -   bool(no),\n    optimize_jumps                      -   bool(no),\n    optimize_fulljumps                  -   bool(no),\n    pessimize_tailcalls                 -   bool(no),\n    checked_nondet_tailcalls            -   bool(no),\n    use_local_vars                      -   bool(no),\n    local_var_access_threshold          -   int(2),\n    standardize_labels                  -   bool(no),\n    optimize_labels                     -   bool(no),\n    optimize_dups                       -   bool(no),\n    optimize_proc_dups                  -   bool(no),\n    optimize_frames                     -   bool(no),\n    optimize_delay_slot                 -   bool(no),\n    optimize_reassign                   -   bool(no),\n    optimize_repeat                     -   int(0),\n    layout_compression_limit            -   int(4000),\n\n    % LLDS -> C\n    use_macro_for_redo_fail             -   bool(no),\n    emit_c_loops                        -   bool(no),\n    procs_per_c_function                -   int(1),\n    everything_in_one_c_function        -   special,\n    local_thread_engine_base            -   bool(yes),\n\n    % Erlang\n    erlang_switch_on_strings_as_atoms   -   bool(no)\n]).\noption_defaults_2(target_code_compilation_option, [\n    % Target code compilation options\n    target_debug                        -   bool(no),\n\n    % C\n    cc                                  -   string(\"gcc\"),\n                                        % The `mmc' script will override the\n                                        % default with a value determined at\n                                        % configuration time.\n    c_include_directory                 -   accumulating([]),\n                                        % The `mmc' script will override the\n                                        % default with a value determined at\n                                        % configuration time.\n    c_optimize                          -   bool(no),\n    ansi_c                              -   bool(yes),\n    inline_alloc                        -   bool(no),\n    cflags                              -   accumulating([]),\n    quoted_cflag                        -   string_special,\n\n    gcc_flags                           -   accumulating([]),\n    quoted_gcc_flag                     -   string_special,\n    clang_flags                         -   accumulating([]),\n    quoted_clang_flag                   -   string_special,\n    msvc_flags                          -   accumulating([]),\n    quoted_msvc_flag                    -   string_special,\n\n    cflags_for_warnings                 -   string(\"\"),\n                                        % The `mmc' script will override the\n                                        % default with values determined at\n                                        % configuration time.\n    cflags_for_optimization             -   string(\"-O\"),\n    cflags_for_ansi                     -   string(\"\"),\n    cflags_for_regs                     -   string(\"\"),\n    cflags_for_gotos                    -   string(\"\"),\n    cflags_for_threads                  -   string(\"\"),\n    cflags_for_debug                    -   string(\"-g\"),\n    cflags_for_pic                      -   string(\"\"),\n    c_flag_to_name_object_file          -   string(\"-o \"),\n    object_file_extension               -   string(\".o\"),\n    pic_object_file_extension           -   string(\".o\"),\n    link_with_pic_object_file_extension -   string(\".o\"),\n    c_compiler_type                     -   string(\"gcc\"),\n    csharp_compiler_type                -   string(\"mono\"),\n                                        % The `mmc' script will override the\n                                        % default with a value determined at\n                                        % configuration time for the above\n                                        % two options\n    % Java\n    java_compiler                       -   string(\"javac\"),\n    java_interpreter                    -   string(\"java\"),\n    java_flags                          -   accumulating([]),\n    quoted_java_flag                    -   string_special,\n    java_classpath                      -   accumulating([]),\n    java_object_file_extension          -   string(\".class\"),\n\n    % IL\n    il_assembler                        -   string(\"ilasm\"),\n    ilasm_flags                         -   accumulating([]),\n    quoted_ilasm_flag                   -   string_special,\n    dotnet_library_version              -   string(\"1.0.3300.0\"),\n                                        % We default to the version of the\n                                        % library that came with Beta2.\n    support_ms_clr                      -   bool(yes),\n    support_rotor_clr                   -   bool(no),\n\n    % C#\n    csharp_compiler                     -   string(\"csc\"),\n    csharp_flags                        -   accumulating([]),\n    quoted_csharp_flag                  -   string_special,\n    cli_interpreter                     -   string(\"\"),\n\n    % Erlang\n    erlang_compiler                     -   string(\"erlc\"),\n    erlang_interpreter                  -   string(\"erl\"),\n    erlang_flags                        -   accumulating([]),\n    quoted_erlang_flag                  -   string_special,\n    erlang_include_directory            -   accumulating([]),\n    erlang_object_file_extension        -   string(\".beam\"),\n    erlang_native_code                  -   bool(no),\n    erlang_inhibit_trivial_warnings     -   bool(yes)\n]).\noption_defaults_2(link_option, [\n    % Link Options\n    output_file_name                    -   string(\"\"),\n                                        % If the output_file_name is an empty\n                                        % string, we use the name of the first\n                                        % module on the command line.\n    ld_flags                            -   accumulating([]),\n    quoted_ld_flag                      -   string_special,\n    ld_libflags                         -   accumulating([]),\n    quoted_ld_libflag                   -   string_special,\n    link_library_directories            -   accumulating([]),\n    runtime_link_library_directories    -   accumulating([]),\n    link_libraries                      -   accumulating([]),\n    link_objects                        -   accumulating([]),\n    mercury_library_directory_special   -   string_special,\n    mercury_library_directories         -   accumulating([]),\n    search_library_files_directory_special - string_special,\n    search_library_files_directories    -   accumulating([]),\n    mercury_library_special             -   string_special,\n    mercury_libraries                   -   accumulating([]),\n    mercury_standard_library_directory  -   maybe_string(no),\n                                        % The Mercury.config file will set the\n                                        % default standard library directory.\n    mercury_standard_library_directory_special - maybe_string_special,\n    init_file_directories               -   accumulating([]),\n    init_files                          -   accumulating([]),\n    trace_init_files                    -   accumulating([]),\n    linkage                             -   string(\"shared\"),\n    linkage_special                     -   string_special,\n    mercury_linkage                     -   string(\"shared\"),\n    mercury_linkage_special             -   string_special,\n    demangle                            -   bool(yes),\n    strip                               -   bool(yes),\n    main                                -   bool(yes),\n    allow_undefined                     -   bool(yes),\n    use_readline                        -   bool(yes),\n    runtime_flags                       -   accumulating([]),\n    extra_initialization_functions      -   bool(no),\n    frameworks                          -   accumulating([]),\n    framework_directories               -   accumulating([]),\n\n    shared_library_extension            -   string(\".so\"),\n                                        % The `mmc' script will override the\n                                        % default with a value determined at\n                                        % configuration time.\n    library_extension                   -   string(\".a\"),\n    executable_file_extension           -   string(\"\"),\n    link_executable_command             -   string(\"gcc\"),\n    link_shared_lib_command             -   string(\"gcc -shared\"),\n    create_archive_command              -   string(\"ar\"),\n    create_archive_command_output_flag  -   string(\"\"),\n    create_archive_command_flags        -   accumulating([]), % \"cr\"\n    ranlib_command                      -   string(\"\"),\n    ranlib_flags                        -   string(\"\"),\n    mkinit_command                      -   string(\"mkinit\"),\n    mkinit_erl_command                  -   string(\"mkinit_erl\"),\n    demangle_command                    -   string(\"mdemangle\"),\n    filtercc_command                    -   string(\"mfiltercc\"),\n    trace_libs                          -   string(\"\"),\n    thread_libs                         -   string(\"\"),\n    hwloc_libs                          -   string(\"\"),\n    hwloc_static_libs                   -   string(\"\"),\n    shared_libs                         -   string(\"\"),\n    math_lib                            -   string(\"\"),\n    readline_libs                       -   string(\"\"),\n    linker_opt_separator                -   string(\"\"),\n    linker_debug_flags                  -   string(\"-g\"),\n    shlib_linker_debug_flags            -   string(\"-g\"),\n    linker_trace_flags                  -   string(\"-g\"),\n    shlib_linker_trace_flags            -   string(\"-g\"),\n    linker_thread_flags                 -   string(\"\"),\n    shlib_linker_thread_flags           -   string(\"\"),\n    linker_static_flags                 -   string(\"-static\"),\n    linker_strip_flag                   -   string(\"-s\"),\n    linker_link_lib_flag                -   string(\"-l\"),\n    linker_link_lib_suffix              -   string(\"\"),\n    shlib_linker_link_lib_flag          -   string(\"-l\"),\n    shlib_linker_link_lib_suffix        -   string(\"\"),\n    linker_path_flag                    -   string(\"-L\"),\n    linker_rpath_flag                   -   string(\"-Wl,-rpath\"),\n    linker_rpath_separator              -   string(\" -Wl,-rpath\"),\n    shlib_linker_rpath_flag             -   string(\"-Wl,-rpath\"),\n    shlib_linker_rpath_separator        -   string(\" -Wl,-rpath\"),\n    linker_allow_undefined_flag         -   string(\"\"),\n    linker_error_undefined_flag         -   string(\"-Wl,-no-undefined\"),\n    shlib_linker_use_install_name       -   bool(no),\n    shlib_linker_install_name_flag      -   string(\"-install_name \"),\n    shlib_linker_install_name_path      -   string(\"\"),\n    java_archive_command                -   string(\"jar\")\n]).\noption_defaults_2(build_system_option, [\n    % Build System Options\n    make                                -   bool(no),\n    keep_going                          -   bool(no),\n    rebuild                             -   bool(no),\n    jobs                                -   int(1),\n    track_flags                         -   bool(no),\n    invoked_by_mmc_make                 -   bool(no),\n    pre_link_command                    -   maybe_string(no),\n    extra_init_command                  -   maybe_string(no),\n    install_prefix                      -   string(\"/usr/local/\"),\n    use_symlinks                        -   bool(yes),\n\n    % If `--mercury-stdlib-dir' is set, `--mercury-config-dir'\n    % must also be set.  This invariant is maintained by the\n    % `special' variants of the options.\n    mercury_configuration_directory_special - string_special,\n    mercury_configuration_directory     -   maybe_string(no),\n    install_command                     -   string(\"cp\"),\n    install_command_dir_option          -   string(\"-r\"),\n    libgrades                           -   accumulating([]),\n    libgrades_include_components        -   accumulating([]),\n    libgrades_exclude_components        -   accumulating([]),\n    lib_linkages                        -   accumulating([]),\n    flags_file                          -   file_special,\n    options_files                       -   accumulating([\"Mercury.options\"]),\n\n    config_file                         -   maybe_string(yes(\"\")),\n                                        % yes(\"\") means unset.\n    options_search_directories          -   accumulating([\".\"]),\n    use_subdirs                         -   bool(no),\n    use_grade_subdirs                   -   bool(no),\n    search_directories                  -   accumulating([\".\"]),\n    intermod_directories                -   accumulating([]),\n    use_search_directories_for_intermod -   bool(yes),\n    libgrade_install_check              -   bool(yes),\n    order_make_by_timestamp             -   bool(no),\n    show_make_times                     -   bool(no),\n    extra_library_header                -   accumulating([]),\n    restricted_command_line             -   bool(no),\n    env_type                            -   string_special,\n    host_env_type                       -   string(\"posix\"),\n    target_env_type                     -   string(\"posix\")\n]).\noption_defaults_2(miscellaneous_option, [\n    % Miscellaneous Options\n    filenames_from_stdin                -   bool(no),\n    typecheck_ambiguity_warn_limit      -   int(50),\n    typecheck_ambiguity_error_limit     -   int(3000),\n    help                                -   bool(no),\n    version                             -   bool(no),\n    fullarch                            -   string(\"\"),\n    cross_compiling                     -   bool(no),\n    local_module_id                     -   accumulating([]),\n    analysis_file_cache_dir             -   string(\"\"),\n    compiler_sufficiently_recent        -   bool(no),\n    experiment                          -   string(\"\"),\n    ignore_par_conjunctions             -   bool(no),\n    control_granularity                 -   bool(no),\n    distance_granularity                -   int(0),\n    implicit_parallelism                -   bool(no),\n    feedback_file                       -   string(\"\"),\n    par_loop_control                    -   bool(no),\n    par_loop_control_preserve_tail_recursion - bool(no)\n]).\n\n    % please keep this in alphabetic order\nshort_option('c', compile_only).\nshort_option('C', target_code_only).\nshort_option('d', dump_hlds).\nshort_option('D', dump_hlds_alias).\nshort_option('e', errorcheck_only).\nshort_option('E', verbose_errors).\nshort_option('f', generate_source_file_mapping).\nshort_option('F', framework_directories).\nshort_option('h', help).\nshort_option('H', highlevel_code).\nshort_option('i', make_interface).\nshort_option('j', jobs).\nshort_option('I', search_directories).\nshort_option('k', keep_going).\nshort_option('l', link_libraries).\nshort_option('L', link_library_directories).\nshort_option('m', make).\nshort_option('M', generate_dependencies).\nshort_option('n', line_numbers).\nshort_option('N', debug_modes).\nshort_option('o', output_file_name).\nshort_option('O', opt_level).\nshort_option('p', profiling).\nshort_option('P', convert_to_mercury).\nshort_option('r', rebuild).\nshort_option('R', runtime_link_library_directories).\nshort_option('s', grade).\nshort_option('S', statistics).\nshort_option('T', debug_types).\nshort_option('t', typecheck_only).\nshort_option('v', verbose).\nshort_option('V', very_verbose).\nshort_option('w', inhibit_warnings).\nshort_option('x', make_xml_documentation).\nshort_option('?', help).\n\n% warning options\nlong_option(\"inhibit-warnings\",         inhibit_warnings).\nlong_option(\"inhibit-accumulator-warnings\", inhibit_accumulator_warnings).\nlong_option(\"halt-at-warn\",             halt_at_warn).\nlong_option(\"halt-at-syntax-errors\",    halt_at_syntax_errors).\nlong_option(\"halt-at-auto-parallel-failure\", halt_at_auto_parallel_failure).\nlong_option(\"warn-singleton-variables\", warn_singleton_vars).\nlong_option(\"warn-overlapping-scopes\",  warn_overlapping_scopes).\nlong_option(\"warn-det-decls-too-lax\",   warn_det_decls_too_lax).\nlong_option(\"warn-inferred-erroneous\",  warn_inferred_erroneous).\nlong_option(\"warn-nothing-exported\",    warn_nothing_exported).\nlong_option(\"warn-unused-args\",         warn_unused_args).\nlong_option(\"warn-interface-imports\",   warn_interface_imports).\nlong_option(\"warn-non-contiguous-clauses\",  warn_non_contiguous_clauses).\nlong_option(\"warn-non-contiguous-foreign-procs\",\n                                        warn_non_contiguous_foreign_procs).\nlong_option(\"warn-non-stratification\",  warn_non_stratification).\nlong_option(\"warn-missing-opt-files\",   warn_missing_opt_files).\nlong_option(\"warn-missing-trans-opt-files\", warn_missing_trans_opt_files).\nlong_option(\"warn-missing-trans-opt-deps\",  warn_missing_trans_opt_deps).\nlong_option(\"warn-unification-cannot-succeed\",\n                                        warn_unification_cannot_succeed).\nlong_option(\"warn-simple-code\",         warn_simple_code).\nlong_option(\"warn-duplicate-calls\",     warn_duplicate_calls).\nlong_option(\"warn-missing-module-name\", warn_missing_module_name).\nlong_option(\"warn-wrong-module-name\",   warn_wrong_module_name).\nlong_option(\"warn-smart-recompilation\", warn_smart_recompilation).\nlong_option(\"warn-undefined-options-variables\",\n                    warn_undefined_options_variables).\nlong_option(\"warn-non-tail-recursion\",  warn_non_tail_recursion).\nlong_option(\"warn-target-code\",         warn_target_code).\nlong_option(\"warn-up-to-date\",          warn_up_to_date).\nlong_option(\"warn-stubs\",               warn_stubs).\nlong_option(\"warn-dead-procs\",          warn_dead_procs).\nlong_option(\"warn-table-with-inline\",   warn_table_with_inline).\nlong_option(\"warn-non-term-special-preds\", warn_non_term_special_preds).\nlong_option(\"warn-known-bad-format-calls\", warn_known_bad_format_calls).\nlong_option(\"warn-unknown-format-calls\", warn_unknown_format_calls).\nlong_option(\"warn-obsolete\",             warn_obsolete).\nlong_option(\"warn-insts-without-matching-type\",\n                                        warn_insts_without_matching_type).\nlong_option(\"warn-unused-imports\",      warn_unused_imports).\nlong_option(\"inform-ite-instead-of-switch\", inform_ite_instead_of_switch).\nlong_option(\"warn-unresolved-polymorphism\", warn_unresolved_polymorphism).\nlong_option(\"warn-suspicious-foreign-procs\", warn_suspicious_foreign_procs).\nlong_option(\"warn-state-var-shadowing\", warn_state_var_shadowing).\nlong_option(\"inform-inferred\",          inform_inferred).\nlong_option(\"inform-inferred-types\",    inform_inferred_types).\nlong_option(\"inform-inferred-modes\",    inform_inferred_modes).\n\n% verbosity options\nlong_option(\"verbose\",                  verbose).\nlong_option(\"very-verbose\",             very_verbose).\nlong_option(\"verbose-error-messages\",   verbose_errors).\nlong_option(\"verbose-recompilation\",    verbose_recompilation).\nlong_option(\"find-all-recompilation-reasons\",\n                                        find_all_recompilation_reasons).\nlong_option(\"verbose-make\",             verbose_make).\nlong_option(\"verbose-commands\",         verbose_commands).\nlong_option(\"output-compile-error-lines\",   output_compile_error_lines).\nlong_option(\"report-cmd-line-args\",     report_cmd_line_args).\nlong_option(\"report-cmd-line-args-in-doterr\",\n                                        report_cmd_line_args_in_doterr).\nlong_option(\"statistics\",               statistics).\nlong_option(\"detailed-statistics\",      detailed_statistics).\nlong_option(\"proc-size-statistics\",     proc_size_statistics).\nlong_option(\"debug-types\",              debug_types).\nlong_option(\"debug-modes\",              debug_modes).\nlong_option(\"debug-modes-statistics\",   debug_modes_statistics).\nlong_option(\"debug-modes-minimal\",      debug_modes_minimal).\nlong_option(\"debug-modes-verbose\",      debug_modes_verbose).\nlong_option(\"debug-modes-pred-id\",      debug_modes_pred_id).\nlong_option(\"debug-dep-par-conj\",       debug_dep_par_conj).\nlong_option(\"debug-determinism\",        debug_det).\nlong_option(\"debug-det\",                debug_det).\nlong_option(\"debug-code-gen-pred-id\",   debug_code_gen_pred_id).\nlong_option(\"debug-termination\",        debug_term).\nlong_option(\"debug-term\",               debug_term).\nlong_option(\"debug-opt\",                debug_opt).\nlong_option(\"debug-opt-pred-id\",        debug_opt_pred_id).\nlong_option(\"debug-opt-pred-name\",      debug_opt_pred_name).\nlong_option(\"debug-pd\",                 debug_pd).\n    % debug-il-asm does very low-level printf style debugging of\n    % IL assembler.  Each instruction is written on stdout before it\n    % is executed.  It is a temporary measure until the IL debugging\n    % system built into .NET improves.\nlong_option(\"debug-il-asm\",             debug_il_asm).\nlong_option(\"debug-liveness\",           debug_liveness).\nlong_option(\"debug-stack-opt\",          debug_stack_opt).\nlong_option(\"debug-make\",               debug_make).\nlong_option(\"debug-closure\",            debug_closure).\nlong_option(\"debug-trail-usage\",        debug_trail_usage).\nlong_option(\"debug-mode-constraints\",   debug_mode_constraints).\nlong_option(\"debug-intermodule-analysis\",   debug_intermodule_analysis).\nlong_option(\"debug-mm-tabling-analysis\",    debug_mm_tabling_analysis).\nlong_option(\"debug-indirect-reuse\",         debug_indirect_reuse).\nlong_option(\"debug-type-rep\",               debug_type_rep).\n\n% output options (mutually exclusive)\nlong_option(\"generate-source-file-mapping\", generate_source_file_mapping).\nlong_option(\"generate-dependency-file\", generate_dependency_file).\nlong_option(\"generate-dependencies\",    generate_dependencies).\nlong_option(\"generate-module-order\",    generate_module_order).\nlong_option(\"generate-standalone-interface\", generate_standalone_interface).\nlong_option(\"make-short-interface\",     make_short_interface).\nlong_option(\"make-short-int\",           make_short_interface).\nlong_option(\"make-interface\",           make_interface).\nlong_option(\"make-int\",                 make_interface).\nlong_option(\"make-private-interface\",   make_private_interface).\nlong_option(\"make-priv-int\",            make_private_interface).\nlong_option(\"make-optimization-interface\", make_optimization_interface).\nlong_option(\"make-optimisation-interface\", make_optimization_interface).\nlong_option(\"make-opt-int\",             make_optimization_interface).\nlong_option(\"make-transitive-optimization-interface\",\n                                        make_transitive_opt_interface).\nlong_option(\"make-transitive-optimisation-interface\",\n                                        make_transitive_opt_interface).\nlong_option(\"make-trans-opt\",           make_transitive_opt_interface).\nlong_option(\"make-analysis-registry\",   make_analysis_registry).\nlong_option(\"make-xml-doc\",             make_xml_documentation).\nlong_option(\"make-xml-documentation\",   make_xml_documentation).\nlong_option(\"convert-to-mercury\",       convert_to_mercury).\nlong_option(\"convert-to-Mercury\",       convert_to_mercury).\nlong_option(\"pretty-print\",             convert_to_mercury).\nlong_option(\"typecheck-only\",           typecheck_only).\nlong_option(\"errorcheck-only\",          errorcheck_only).\nlong_option(\"target-code-only\",         target_code_only).\nlong_option(\"compile-only\",             compile_only).\nlong_option(\"compile-to-shared-lib\",    compile_to_shared_lib).\nlong_option(\"output-grade-string\",      output_grade_string).\nlong_option(\"output-link-command\",      output_link_command).\nlong_option(\"output-shared-lib-link-command\", output_shared_lib_link_command).\nlong_option(\"output-libgrades\",         output_libgrades).\nlong_option(\"output-cc\",                output_cc).\nlong_option(\"output-cc-type\",           output_c_compiler_type).\nlong_option(\"output-c-compiler-type\",   output_c_compiler_type).\nlong_option(\"output-csharp-compiler-type\", output_csharp_compiler_type).\nlong_option(\"output-cflags\",            output_cflags).\nlong_option(\"output-library-link-flags\",    output_library_link_flags).\nlong_option(\"output-grade-defines\",     output_grade_defines).\nlong_option(\"output-c-include-directory-flags\",\n    output_c_include_directory_flags).\nlong_option(\"output-c-include-dir-flags\",\n    output_c_include_directory_flags).\n\n% aux output options\nlong_option(\"smart-recompilation\",      smart_recompilation).\nlong_option(\"assume-gmake\",             assume_gmake).\nlong_option(\"generate-mmc-make-module-dependencies\",\n                                        generate_mmc_make_module_dependencies).\nlong_option(\"generate-mmc-deps\",        generate_mmc_make_module_dependencies).\nlong_option(\"ssdb-trace\",               ssdb_trace_level).\nlong_option(\"link-ssdb-libs\",           link_ssdb_libs).\nlong_option(\"link-ssdebug-libs\",        link_ssdb_libs).\nlong_option(\"trace\",                    trace_level).\nlong_option(\"trace-optimised\",          trace_optimized).\nlong_option(\"trace-optimized\",          trace_optimized).\nlong_option(\"trace-prof\",               trace_prof).\nlong_option(\"trace-table-io\",           trace_table_io).\nlong_option(\"trace-table-io-only-retry\",    trace_table_io_only_retry).\nlong_option(\"trace-table-io-states\",    trace_table_io_states).\nlong_option(\"trace-table-io-require\",   trace_table_io_require).\nlong_option(\"trace-table-io-all\",       trace_table_io_all).\nlong_option(\"trace-flag\",               trace_goal_flags).\nlong_option(\"profile-optimised\",        prof_optimized).\nlong_option(\"profile-optimized\",        prof_optimized).\nlong_option(\"exec-trace-tail-rec\",      exec_trace_tail_rec).\nlong_option(\"suppress-trace\",           suppress_trace).\nlong_option(\"force-disable-tracing\",    force_disable_tracing).\nlong_option(\"delay-death\",              delay_death).\nlong_option(\"delay-death-max-vars\",     delay_death_max_vars).\nlong_option(\"stack-trace-higher-order\", stack_trace_higher_order).\nlong_option(\"force-disable-ssdebug\",    force_disable_ssdebug).\nlong_option(\"generate-bytecode\",        generate_bytecode).\nlong_option(\"line-numbers\",             line_numbers).\nlong_option(\"auto-comments\",            auto_comments).\nlong_option(\"frameopt-comments\",        frameopt_comments).\nlong_option(\"max-error-line-width\",     max_error_line_width).\nlong_option(\"show-dependency-graph\",    show_dependency_graph).\nlong_option(\"imports-graph\",            imports_graph).\nlong_option(\"dump-trace-counts\",        dump_trace_counts).\nlong_option(\"dump-hlds\",                dump_hlds).\nlong_option(\"hlds-dump\",                dump_hlds).\nlong_option(\"dump-hlds-pred-id\",        dump_hlds_pred_id).\nlong_option(\"dump-hlds-pred-name\",      dump_hlds_pred_name).\nlong_option(\"dump-hlds-alias\",          dump_hlds_alias).\nlong_option(\"dump-hlds-options\",        dump_hlds_options).\nlong_option(\"dump-hlds-inst-limit\",     dump_hlds_inst_limit).\nlong_option(\"dump-hlds-file-suffix\",    dump_hlds_file_suffix).\nlong_option(\"dump-same-hlds\",           dump_same_hlds).\nlong_option(\"dump-mlds\",                dump_mlds).\nlong_option(\"mlds-dump\",                dump_mlds).\nlong_option(\"verbose-dump-mlds\",        verbose_dump_mlds).\nlong_option(\"verbose-mlds-dump\",        verbose_dump_mlds).\nlong_option(\"sign-assembly\",            sign_assembly).\nlong_option(\"separate-assemblies\",      separate_assemblies).\nlong_option(\"mode-constraints\",         mode_constraints).\nlong_option(\"simple-mode-constraints\",  simple_mode_constraints).\nlong_option(\"prop-mode-constraints\",    prop_mode_constraints).\nlong_option(\"propagate-mode-constraints\",   prop_mode_constraints).\nlong_option(\"benchmark-modes\",          benchmark_modes).\nlong_option(\"benchmark-modes-repeat\",   benchmark_modes_repeat).\n\n% language semantics options\nlong_option(\"reorder-conj\",         reorder_conj).\nlong_option(\"reorder-disj\",         reorder_disj).\nlong_option(\"fully-strict\",         fully_strict).\nlong_option(\"strict-sequential\",    strict_sequential).\nlong_option(\"allow-stubs\",          allow_stubs).\nlong_option(\"infer-all\",            infer_all).\nlong_option(\"infer-types\",          infer_types).\nlong_option(\"infer-modes\",          infer_modes).\nlong_option(\"infer-determinism\",    infer_det).\nlong_option(\"infer-det\",            infer_det).\nlong_option(\"type-inference-iteration-limit\", type_inference_iteration_limit).\nlong_option(\"mode-inference-iteration-limit\", mode_inference_iteration_limit).\nlong_option(\"event-set-file-name\",  event_set_file_name).\n\n% compilation model options\nlong_option(\"grade\",                grade).\n% target selection options\nlong_option(\"target\",               target).\nlong_option(\"il\",                   il).\nlong_option(\"il-only\",              il_only).\nlong_option(\"IL-only\",              il_only).\nlong_option(\"compile-to-c\",         compile_to_c).\nlong_option(\"compile-to-C\",         compile_to_c).\nlong_option(\"java\",                 java).\nlong_option(\"Java\",                 java).\nlong_option(\"java-only\",            java_only).\nlong_option(\"Java-only\",            java_only).\nlong_option(\"csharp\",               csharp).\nlong_option(\"C#\",                   csharp).\nlong_option(\"csharp-only\",          csharp_only).\nlong_option(\"C#-only\",              csharp_only).\nlong_option(\"x86_64\",               x86_64).\nlong_option(\"x86-64\",               x86_64).\nlong_option(\"x86_64-only\",          x86_64_only).\nlong_option(\"x86-64-only\",          x86_64_only).\nlong_option(\"erlang\",               erlang).\nlong_option(\"Erlang\",               erlang).\nlong_option(\"erlang-only\",          erlang_only).\nlong_option(\"Erlang-only\",          erlang_only).\n% Optional features compilation model options:\n% (a) debugging\nlong_option(\"debug\",                exec_trace).\nlong_option(\"decl-debug\",           decl_debug).\nlong_option(\"ssdb\",                 source_to_source_debug).\nlong_option(\"ss-debug\",             source_to_source_debug).\nlong_option(\"source-to-source-debug\", source_to_source_debug).\n    % (b) profiling\nlong_option(\"profiling\",            profiling).\nlong_option(\"time-profiling\",       time_profiling).\nlong_option(\"memory-profiling\",     memory_profiling).\nlong_option(\"deep-profiling\",       deep_profiling).\nlong_option(\"profile-calls\",        profile_calls).\nlong_option(\"profile-time\",         profile_time).\nlong_option(\"profile-memory\",       profile_memory).\nlong_option(\"profile-deep\",         profile_deep).\nlong_option(\"use-activation-counts\",    use_activation_counts).\nlong_option(\"pre-prof-transforms-simplify\", pre_prof_transforms_simplify).\nlong_option(\"pre-implicit-parallelism-simplify\",\n    pre_implicit_parallelism_simplify).\nlong_option(\"coverage-profiling\",\n                    coverage_profiling).\nlong_option(\"coverage-profiling-via-calls\",\n                    coverage_profiling_via_calls).\nlong_option(\"coverage-profiling-static\",\n                    coverage_profiling_static).\nlong_option(\"profile-deep-coverage-after-goal\",\n                    profile_deep_coverage_after_goal).\nlong_option(\"profile-deep-coverage-branch-ite\",\n                    profile_deep_coverage_branch_ite).\nlong_option(\"profile-deep-coverage-branch-switch\",\n                    profile_deep_coverage_branch_switch).\nlong_option(\"profile-deep-coverage-branch-disj\",\n                    profile_deep_coverage_branch_disj).\nlong_option(\"profile-deep-coverage-use-portcounts\",\n                    profile_deep_coverage_use_portcounts).\nlong_option(\"profile-deep-coverage-use-trivial\",\n                    profile_deep_coverage_use_trivial).\nlong_option(\"profile-for-implicit-parallelism\",\n                    profile_for_feedback).\nlong_option(\"profile-for-feedback\",\n                    profile_for_feedback).\nlong_option(\"use-zeroing-for-ho-cycles\",\n                    use_zeroing_for_ho_cycles).\nlong_option(\"use-lots-of-ho-specialization\",\n                    use_lots_of_ho_specialization).\nlong_option(\"deep-profile-tail-recursion\",\n                    deep_profile_tail_recursion).\nlong_option(\"record-term-sizes-as-words\", record_term_sizes_as_words).\nlong_option(\"record-term-sizes-as-cells\", record_term_sizes_as_cells).\nlong_option(\"experimental-complexity\",  experimental_complexity).\nlong_option(\"region-analysis\",      region_analysis).\n% (c) miscellaneous optional features\nlong_option(\"gc\",                   gc).\nlong_option(\"garbage-collection\",   gc).\nlong_option(\"parallel\",             parallel).\nlong_option(\"use-trail\",            use_trail).\nlong_option(\"trail-segments\",       trail_segments).\nlong_option(\"type-layout\",          type_layout).\nlong_option(\"maybe-thread-safe\",    maybe_thread_safe_opt).\nlong_option(\"extend-stacks-when-needed\",    extend_stacks_when_needed).\nlong_option(\"stack-segments\",       stack_segments).\nlong_option(\"use-regions\",          use_regions).\nlong_option(\"use-alloc-regions\",    use_alloc_regions).\nlong_option(\"use-regions-debug\",    use_regions_debug).\nlong_option(\"use-regions-profiling\",use_regions_profiling).\n% Data representation options\nlong_option(\"use-minimal-model-stack-copy\", use_minimal_model_stack_copy).\nlong_option(\"use-minimal-model-own-stacks\", use_minimal_model_own_stacks).\nlong_option(\"minimal-model-debug\",  minimal_model_debug).\nlong_option(\"single-prec-float\",    single_prec_float).\nlong_option(\"single-precision-float\",   single_prec_float).\nlong_option(\"pic-reg\",              pic_reg).\nlong_option(\"tags\",                 tags).\nlong_option(\"num-tag-bits\",         num_tag_bits).\nlong_option(\"num-reserved-addresses\",   num_reserved_addresses).\nlong_option(\"num-reserved-objects\", num_reserved_objects).\nlong_option(\"bits-per-word\",        bits_per_word).\nlong_option(\"bytes-per-word\",       bytes_per_word).\nlong_option(\"conf-low-tag-bits\",    conf_low_tag_bits).\nlong_option(\"sync-term-size\",       sync_term_size).\nlong_option(\"unboxed-float\",        unboxed_float).\nlong_option(\"unboxed-enums\",        unboxed_enums).\nlong_option(\"unboxed-no-tag-types\", unboxed_no_tag_types).\nlong_option(\"highlevel-data\",       highlevel_data).\nlong_option(\"high-level-data\",      highlevel_data).\n% LLDS back-end compilation model options\nlong_option(\"gcc-non-local-gotos\",  gcc_non_local_gotos).\nlong_option(\"gcc-global-registers\", gcc_global_registers).\nlong_option(\"asm-labels\",           asm_labels).\nlong_option(\"use-float-registers\",  use_float_registers).\n% MLDS back-end compilation model options\nlong_option(\"highlevel-code\",       highlevel_code).\nlong_option(\"high-level-code\",      highlevel_code).\nlong_option(\"highlevel-C\",          highlevel_code).\nlong_option(\"highlevel-c\",          highlevel_code).\nlong_option(\"high-level-C\",         highlevel_code).\nlong_option(\"high-level-c\",         highlevel_code).\nlong_option(\"gcc-nested-functions\", gcc_nested_functions).\nlong_option(\"det-copy-out\",         det_copy_out).\nlong_option(\"nondet-copy-out\",      nondet_copy_out).\nlong_option(\"put-commit-in-own-func\",   put_commit_in_own_func).\nlong_option(\"put-nondet-env-on-heap\",   put_nondet_env_on_heap).\n% IL back-end compilation model options\nlong_option(\"verifiable-code\",      verifiable_code).\nlong_option(\"verifiable\",           verifiable_code).\nlong_option(\"il-funcptr-types\",     il_funcptr_types).\nlong_option(\"IL-funcptr-types\",     il_funcptr_types).\nlong_option(\"il-refany-fields\",     il_refany_fields).\nlong_option(\"IL-refany-fields\",     il_refany_fields).\nlong_option(\"il-byref-tailcalls\",   il_byref_tailcalls).\nlong_option(\"IL-byref-tailcalls\",   il_byref_tailcalls).\n\n% internal use options\nlong_option(\"backend-foreign-languages\", backend_foreign_languages).\nlong_option(\"agc-stack-layout\",     agc_stack_layout).\nlong_option(\"basic-stack-layout\",   basic_stack_layout).\nlong_option(\"procid-stack-layout\",  procid_stack_layout).\nlong_option(\"trace-stack-layout\",   trace_stack_layout).\nlong_option(\"body-typeinfo-liveness\",   body_typeinfo_liveness).\nlong_option(\"can-compare-constants-as-ints\",    can_compare_constants_as_ints).\nlong_option(\"pretest-equality-cast-pointers\",   pretest_equality_cast_pointers).\nlong_option(\"can-compare-compound-values\",      can_compare_compound_values).\nlong_option(\"lexically-order-constructors\",\n                                    lexically_order_constructors).\nlong_option(\"mutable-always-boxed\", mutable_always_boxed).\nlong_option(\"delay-partial-instantiations\", delay_partial_instantiations).\nlong_option(\"allow-defn-of-builtins\",           allow_defn_of_builtins).\nlong_option(\"special-preds\",        special_preds).\nlong_option(\"type-ctor-info\",       type_ctor_info).\nlong_option(\"type-ctor-layout\",     type_ctor_layout).\nlong_option(\"type-ctor-functors\",   type_ctor_functors).\nlong_option(\"new-type-class-rtti\",  new_type_class_rtti).\nlong_option(\"rtti-line-numbers\",    rtti_line_numbers).\nlong_option(\"disable-mm-pneg\",      disable_minimal_model_stack_copy_pneg).\nlong_option(\"disable-mm-cut\",       disable_minimal_model_stack_copy_cut).\nlong_option(\"disable-trail-ops\",    disable_trail_ops).\nlong_option(\"size-region-ite-fixed\",            size_region_ite_fixed).\nlong_option(\"size-region-disj-fixed\",           size_region_disj_fixed).\nlong_option(\"size-region-commit-fixed\",         size_region_commit_fixed).\nlong_option(\"size-region-ite-protect\",          size_region_ite_protect).\nlong_option(\"size-region-ite-snapshot\",         size_region_ite_snapshot).\nlong_option(\"size-region-semi-disj-protect\",    size_region_semi_disj_protect).\nlong_option(\"size-region-disj-snapshot\",        size_region_disj_snapshot).\nlong_option(\"size-region-commit-entry\",         size_region_commit_entry).\nlong_option(\"solver-type-auto-init\",    solver_type_auto_init).\nlong_option(\"allow-multi-arm-switches\", allow_multi_arm_switches).\nlong_option(\"type-check-constraints\",   type_check_constraints).\nlong_option(\"allow-argument-packing\",   allow_argument_packing).\n\n% code generation options\nlong_option(\"low-level-debug\",      low_level_debug).\nlong_option(\"table-debug\",          table_debug).\nlong_option(\"polymorphism\",         polymorphism).\nlong_option(\"trad-passes\",          trad_passes).\nlong_option(\"parallel-liveness\",    parallel_liveness).\nlong_option(\"parallel-code-gen\",    parallel_code_gen).\nlong_option(\"reclaim-heap-on-failure\",  reclaim_heap_on_failure).\nlong_option(\"reclaim-heap-on-semidet-failure\",\n                                    reclaim_heap_on_semidet_failure).\nlong_option(\"reclaim-heap-on-nondet-failure\",\n                                    reclaim_heap_on_nondet_failure).\nlong_option(\"branch-delay-slot\",    have_delay_slot).\nlong_option(\"have-delay-slot\",      have_delay_slot).\nlong_option(\"num-real-r-regs\",      num_real_r_regs).\nlong_option(\"num-real-f-regs\",      num_real_f_regs).\nlong_option(\"num-real-r-temps\",     num_real_r_temps).\nlong_option(\"num-real-f-temps\",     num_real_f_temps).\nlong_option(\"num-real-temps\",       num_real_r_temps).  % obsolete\nlong_option(\"max-jump-table-size\",  max_jump_table_size).\n% long_option(\"max-spec-do-call-closure\",\n%                   max_specialized_do_call_closure).\n% long_option(\"max-spec-do-call-class-method\",\n%                   max_specialized_do_call_class_method).\nlong_option(\"compare-specialization\",   compare_specialization).\nlong_option(\"should-pretest-equality\",  should_pretest_equality).\nlong_option(\"fact-table-max-array-size\",fact_table_max_array_size).\nlong_option(\"fact-table-hash-percent-full\",\n                    fact_table_hash_percent_full).\nlong_option(\"gcc-local-labels\",     gcc_local_labels).\nlong_option(\"prefer-switch\",        prefer_switch).\nlong_option(\"opt-no-return-calls\",  opt_no_return_calls).\n\n% optimization options\n\nlong_option(\"opt-level\",            opt_level).\nlong_option(\"optimization-level\",   opt_level).\nlong_option(\"optimisation-level\",   opt_level).\nlong_option(\"opt-space\",            opt_space).\nlong_option(\"optimize-space\",       opt_space).\nlong_option(\"optimise-space\",       opt_space).\nlong_option(\"intermod-opt\",        intermodule_optimization).\nlong_option(\"intermodule-optimization\", intermodule_optimization).\nlong_option(\"intermodule-optimisation\", intermodule_optimization).\nlong_option(\"read-opt-files-transitively\", read_opt_files_transitively).\nlong_option(\"use-opt-files\",        use_opt_files).\nlong_option(\"use-trans-opt-files\",  use_trans_opt_files).\nlong_option(\"transitive-intermodule-optimization\",\n                    transitive_optimization).\nlong_option(\"transitive-intermodule-optimisation\",\n                    transitive_optimization).\nlong_option(\"trans-intermod-opt\",   transitive_optimization).\nlong_option(\"intermodule-analysis\", intermodule_analysis).\nlong_option(\"analysis-repeat\",      analysis_repeat).\nlong_option(\"analysis-file-cache\",  analysis_file_cache).\n\n% HLDS->HLDS optimizations\nlong_option(\"inlining\",             inlining).\nlong_option(\"inline-simple\",        inline_simple).\nlong_option(\"inline-builtins\",      inline_builtins).\nlong_option(\"inline-single-use\",    inline_single_use).\nlong_option(\"inline-call-cost\",     inline_call_cost).\nlong_option(\"inline-compound-threshold\",    inline_compound_threshold).\nlong_option(\"inline-simple-threshold\",      inline_simple_threshold).\nlong_option(\"intermod-inline-simple-threshold\",\n                                    intermod_inline_simple_threshold).\nlong_option(\"from-ground-term-threshold\",\n                                    from_ground_term_threshold).\nlong_option(\"inline-vars-threshold\",        inline_vars_threshold).\nlong_option(\"const-struct\",         enable_const_struct).\nlong_option(\"common-struct\",        common_struct).\nlong_option(\"common-struct-preds\",  common_struct_preds).\nlong_option(\"common-goal\",          common_goal).\nlong_option(\"excess-assign\",        excess_assign).\nlong_option(\"optimize-format-calls\",         optimize_format_calls).\nlong_option(\"optimize-duplicate-calls\", optimize_duplicate_calls).\nlong_option(\"optimise-duplicate-calls\", optimize_duplicate_calls).\nlong_option(\"optimise-constant-propagation\", constant_propagation).\nlong_option(\"optimize-constant-propagation\", constant_propagation).\nlong_option(\"optimize-saved-vars\",  optimize_saved_vars).\nlong_option(\"optimise-saved-vars\",  optimize_saved_vars).\nlong_option(\"loop-invariants\",      loop_invariants).\nlong_option(\"optimize-saved-vars-const\",    optimize_saved_vars_const).\nlong_option(\"optimise-saved-vars-const\",    optimize_saved_vars_const).\nlong_option(\"optimize-saved-vars-cell\", optimize_saved_vars_cell).\nlong_option(\"optimise-saved-vars-cell\", optimize_saved_vars_cell).\nlong_option(\"osv-loop\",             optimize_saved_vars_cell_loop).\nlong_option(\"osv-full-path\",        optimize_saved_vars_cell_full_path).\nlong_option(\"osv-on-stack\",         optimize_saved_vars_cell_on_stack).\nlong_option(\"osv-cand-head\",\n                            optimize_saved_vars_cell_candidate_headvars).\n% The next four options are used by tupling.m as well; changes to them\n% may require changes there as well.\nlong_option(\"osv-cvstore-cost\",     optimize_saved_vars_cell_cv_store_cost).\nlong_option(\"osv-cvload-cost\",      optimize_saved_vars_cell_cv_load_cost).\nlong_option(\"osv-fvstore-cost\",     optimize_saved_vars_cell_fv_store_cost).\nlong_option(\"osv-fvload-cost\",      optimize_saved_vars_cell_fv_load_cost).\nlong_option(\"osv-op-ratio\",         optimize_saved_vars_cell_op_ratio).\nlong_option(\"osv-node-ratio\",       optimize_saved_vars_cell_node_ratio).\nlong_option(\"osv-allpath-node-ratio\",\n                            optimize_saved_vars_cell_all_path_node_ratio).\nlong_option(\"osv-all-cand\",\n                            optimize_saved_vars_cell_include_all_candidates).\nlong_option(\"delay-construct\",      delay_construct).\nlong_option(\"delay-constructs\",     delay_construct).\nlong_option(\"follow-code\",          follow_code).\nlong_option(\"constraint-propagation\",   constraint_propagation).\nlong_option(\"local-constraint-propagation\", local_constraint_propagation).\nlong_option(\"optimize-unused-args\", optimize_unused_args).\nlong_option(\"optimise-unused-args\", optimize_unused_args).\nlong_option(\"intermod-unused-args\", intermod_unused_args).\nlong_option(\"optimize-higher-order\",    optimize_higher_order).\nlong_option(\"optimise-higher-order\",    optimize_higher_order).\nlong_option(\"higher-order-size-limit\",  higher_order_size_limit).\nlong_option(\"higher-order-arg-limit\",   higher_order_arg_limit).\nlong_option(\"unneeded-code\",        unneeded_code).\nlong_option(\"unneeded-code-copy-limit\", unneeded_code_copy_limit).\nlong_option(\"unneeded-code-debug\",  unneeded_code_debug).\nlong_option(\"unneeded-code-debug-pred-name\",  unneeded_code_debug_pred_name).\nlong_option(\"type-specialization\",  type_specialization).\nlong_option(\"type-specialisation\",  type_specialization).\nlong_option(\"user-guided-type-specialization\",\n                    user_guided_type_specialization).\nlong_option(\"user-guided-type-specialisation\",\n                    user_guided_type_specialization).\n% This option is for use in configure.in to test for some bug-fixes for\n% type-specialization which are needed to compile the library. It's not\n% documented, and should eventually be removed.\nlong_option(\"fixed-user-guided-type-specialization\",\n                    user_guided_type_specialization).\nlong_option(\"introduce-accumulators\",   introduce_accumulators).\nlong_option(\"optimise-constructor-last-call-accumulator\",\n                    optimize_constructor_last_call_accumulator).\nlong_option(\"optimize-constructor-last-call-accumulator\",\n                    optimize_constructor_last_call_accumulator).\nlong_option(\"optimise-constructor-last-call-null\",\n                    optimize_constructor_last_call_null).\nlong_option(\"optimize-constructor-last-call-null\",\n                    optimize_constructor_last_call_null).\nlong_option(\"optimise-constructor-last-call\",\n                    optimize_constructor_last_call).\nlong_option(\"optimize-constructor-last-call\",\n                    optimize_constructor_last_call).\nlong_option(\"optimize-dead-procs\",  optimize_dead_procs).\nlong_option(\"optimise-dead-procs\",  optimize_dead_procs).\nlong_option(\"deforestation\",        deforestation).\nlong_option(\"deforestation-depth-limit\",    deforestation_depth_limit).\nlong_option(\"deforestation-cost-factor\",    deforestation_cost_factor).\nlong_option(\"deforestation-vars-threshold\", deforestation_vars_threshold).\nlong_option(\"deforestation-size-threshold\", deforestation_size_threshold).\nlong_option(\"enable-termination\",   termination).\nlong_option(\"enable-term\",          termination).\nlong_option(\"check-termination\",    termination_check).\nlong_option(\"check-term\",           termination_check).\nlong_option(\"chk-term\",             termination_check).\nlong_option(\"verbose-check-termination\",verbose_check_termination).\nlong_option(\"verb-check-term\",      verbose_check_termination).\nlong_option(\"verb-chk-term\",        verbose_check_termination).\nlong_option(\"termination-single-argument-analysis\",\n                    termination_single_args).\nlong_option(\"term-single-arg\",      termination_single_args).\nlong_option(\"termination-norm\",     termination_norm).\nlong_option(\"term-norm\",            termination_norm).\nlong_option(\"termination-error-limit\",  termination_error_limit).\nlong_option(\"term-err-limit\",       termination_error_limit).\nlong_option(\"termination-path-limit\",   termination_path_limit).\nlong_option(\"term-path-limit\",      termination_path_limit).\nlong_option(\"enable-termination2\",  termination2).\nlong_option(\"enable-term2\",         termination2).\nlong_option(\"check-termination2\",   check_termination2).\nlong_option(\"check-term2\",          check_termination2).\nlong_option(\"chk-term2\",            check_termination2).\nlong_option(\"verbose-check-termination2\",verbose_check_termination2).\nlong_option(\"verb-check-term2\",     verbose_check_termination2).\nlong_option(\"verb-chk-term2\",       verbose_check_termination2).\nlong_option(\"termination2-widening-limit\", widening_limit).\nlong_option(\"term2-widening-limit\",     widening_limit).\nlong_option(\"arg-size-analysis-only\",   arg_size_analysis_only).\nlong_option(\"termination2-propagate-failure-constraints\",\n                    propagate_failure_constrs).\nlong_option(\"term2-propagate-failure-constraints\",\n                    propagate_failure_constrs).\nlong_option(\"term2-propagate-failure-constrs\", propagate_failure_constrs).\nlong_option(\"termination2-norm\", termination2_norm).\nlong_option(\"term2-norm\", termination2_norm).\nlong_option(\"termination2-maximum-matrix-size\", term2_maximum_matrix_size).\nlong_option(\"term2-max-matrix-size\", term2_maximum_matrix_size).\nlong_option(\"analyse-exceptions\",   analyse_exceptions).\nlong_option(\"analyse-closures\",     analyse_closures).\nlong_option(\"analyse-local-closures\",   analyse_closures).\nlong_option(\"analyse-trail-usage\",  analyse_trail_usage).\nlong_option(\"optimize-trail-usage\", optimize_trail_usage).\nlong_option(\"optimize-region-ops\",  optimize_region_ops).\nlong_option(\"analyse-mm-tabling\",   analyse_mm_tabling).\nlong_option(\"untuple\",              untuple).\nlong_option(\"tuple\",                tuple).\nlong_option(\"tuple-trace-counts-file\",  tuple_trace_counts_file).\nlong_option(\"tuple-costs-ratio\",    tuple_costs_ratio).\nlong_option(\"tuple-min-args\",       tuple_min_args).\nlong_option(\"inline-par-builtins\",  inline_par_builtins).\nlong_option(\"always-specialize-in-dep-par-conjs\",\n                                    always_specialize_in_dep_par_conjs).\nlong_option(\"allow-some-paths-only-waits\",\n                                    allow_some_paths_only_waits).\n\n% CTGC related options.\nlong_option(\"structure-sharing\",    structure_sharing_analysis).\nlong_option(\"structure-sharing-widening\", structure_sharing_widening).\nlong_option(\"structure-reuse\",      structure_reuse_analysis).\nlong_option(\"ctgc\",                 structure_reuse_analysis).\nlong_option(\"structure-reuse-constraint\", structure_reuse_constraint).\nlong_option(\"ctgc-constraint\",      structure_reuse_constraint).\nlong_option(\"structure-reuse-constraint-arg\", structure_reuse_constraint_arg).\nlong_option(\"ctgc-constraint-arg\",  structure_reuse_constraint_arg).\nlong_option(\"structure-reuse-max-conditions\", structure_reuse_max_conditions).\nlong_option(\"structure-reuse-repeat\", structure_reuse_repeat).\nlong_option(\"structure-reuse-free-cells\", structure_reuse_free_cells).\n\n% HLDS->LLDS optimizations\nlong_option(\"smart-indexing\",       smart_indexing).\nlong_option(\"dense-switch-req-density\", dense_switch_req_density).\nlong_option(\"lookup-switch-req-density\",lookup_switch_req_density).\nlong_option(\"dense-switch-size\",    dense_switch_size).\nlong_option(\"lookup-switch-size\",   lookup_switch_size).\nlong_option(\"string-switch-size\",   string_hash_switch_size).\nlong_option(\"string-hash-switch-size\",      string_hash_switch_size).\nlong_option(\"string-binary-switch-size\",    string_binary_switch_size).\nlong_option(\"tag-switch-size\",      tag_switch_size).\nlong_option(\"try-switch-size\",      try_switch_size).\nlong_option(\"binary-switch-size\",   binary_switch_size).\nlong_option(\"switch-single-rec-base-first\", switch_single_rec_base_first).\nlong_option(\"switch-multi-rec-base-first\",  switch_multi_rec_base_first).\nlong_option(\"static-ground-terms\",  static_ground_cells).\n% static_ground_floats should be set only in handle_options.m.\n% long_option(\"static-ground-floats\", static_ground_floats).\n% static_code_addresses should be set only in handle_options.m.\n% long_option(\"static-code-addresses\", static_code_addresses).\nlong_option(\"use-atomic-cells\",     use_atomic_cells).\nlong_option(\"middle-rec\",           middle_rec).\nlong_option(\"simple-neg\",           simple_neg).\nlong_option(\"allow-hijacks\",        allow_hijacks).\n\n% MLDS optimizations\n% Option `optimize' is used for both MLDS and LLDS optimizations, but since\n% you can't use both at the same time it doesn't really matter.\nlong_option(\"mlds-optimize\",        optimize).\nlong_option(\"mlds-optimise\",        optimize).\nlong_option(\"mlds-peephole\",        optimize_peep).\nlong_option(\"optimize-tailcalls\",   optimize_tailcalls).\nlong_option(\"optimise-tailcalls\",   optimize_tailcalls).\nlong_option(\"optimize-initializations\", optimize_initializations).\nlong_option(\"optimise-initializations\", optimize_initializations).\nlong_option(\"eliminate-local-vars\", eliminate_local_vars).\nlong_option(\"generate-trail-ops-inline\", generate_trail_ops_inline).\n\n% LLDS optimizations\nlong_option(\"common-data\",          common_data).\nlong_option(\"common-layout-data\",   common_layout_data).\nlong_option(\"llds-optimize\",        optimize).\nlong_option(\"llds-optimise\",        optimize).\nlong_option(\"optimize-peep\",        optimize_peep).\nlong_option(\"optimise-peep\",        optimize_peep).\nlong_option(\"optimize-peep-mkword\", optimize_peep_mkword).\nlong_option(\"optimise-peep-mkword\", optimize_peep_mkword).\nlong_option(\"optimize-jumps\",       optimize_jumps).\nlong_option(\"optimise-jumps\",       optimize_jumps).\nlong_option(\"optimize-fulljumps\",   optimize_fulljumps).\nlong_option(\"optimise-fulljumps\",   optimize_fulljumps).\nlong_option(\"pessimize-tailcalls\",  pessimize_tailcalls).\nlong_option(\"checked-nondet-tailcalls\", checked_nondet_tailcalls).\nlong_option(\"use-local-vars\",       use_local_vars).\nlong_option(\"local-var-access-threshold\", local_var_access_threshold).\nlong_option(\"standardise-labels\",   standardize_labels).\nlong_option(\"standardize-labels\",   standardize_labels).\nlong_option(\"optimize-labels\",      optimize_labels).\nlong_option(\"optimise-labels\",      optimize_labels).\nlong_option(\"optimize-dups\",        optimize_dups).\nlong_option(\"optimise-dups\",        optimize_dups).\nlong_option(\"optimize-proc-dups\",   optimize_proc_dups).\nlong_option(\"optimise-proc-dups\",   optimize_proc_dups).\n%%% long_option(\"optimize-copyprop\",    optimize_copyprop).\n%%% long_option(\"optimise-copyprop\",    optimize_copyprop).\nlong_option(\"optimize-frames\",      optimize_frames).\nlong_option(\"optimise-frames\",      optimize_frames).\nlong_option(\"optimize-delay-slot\",  optimize_delay_slot).\nlong_option(\"optimise-delay-slot\",  optimize_delay_slot).\nlong_option(\"optimize-reassign\",    optimize_reassign).\nlong_option(\"optimise-reassign\",    optimize_reassign).\nlong_option(\"optimize-repeat\",      optimize_repeat).\nlong_option(\"optimise-repeat\",      optimize_repeat).\nlong_option(\"layout-compression-limit\",      layout_compression_limit).\n\n% LLDS->C optimizations\nlong_option(\"use-macro-for-redo-fail\",  use_macro_for_redo_fail).\nlong_option(\"emit-c-loops\",         emit_c_loops).\nlong_option(\"procs-per-c-function\", procs_per_c_function).\nlong_option(\"procs-per-C-function\", procs_per_c_function).\nlong_option(\"everything-in-one-c-function\", everything_in_one_c_function).\nlong_option(\"everything-in-one-C-function\", everything_in_one_c_function).\nlong_option(\"inline-alloc\",         inline_alloc).\nlong_option(\"local-thread-engine-base\", local_thread_engine_base).\n\n% Erlang\nlong_option(\"erlang-switch-on-strings-as-atoms\",\n                erlang_switch_on_strings_as_atoms).\n\n% Target code compilation options\nlong_option(\"target-debug\",         target_debug).\n\nlong_option(\"cc\",                   cc).\nlong_option(\"c-optimise\",           c_optimize).\nlong_option(\"c-optimize\",           c_optimize).\n% XXX we should consider the relationship between c_debug and target_debug\n% more carefully. Perhaps target_debug could imply C debug if the target is C.\n% However for the moment they are just synonyms.\nlong_option(\"c-debug\",              target_debug).\nlong_option(\"c-include-directory\",  c_include_directory).\nlong_option(\"c-include-dir\",        c_include_directory).\nlong_option(\"ansi-c\",               ansi_c).\nlong_option(\"cflags\",               cflags).\nlong_option(\"cflag\",                quoted_cflag).\n\nlong_option(\"gcc-flags\",            gcc_flags).\nlong_option(\"gcc-flag\",             quoted_gcc_flag).\nlong_option(\"clang-flags\",          clang_flags).\nlong_option(\"clang-flag\",           quoted_clang_flag).\nlong_option(\"msvc-flags\",           msvc_flags).\nlong_option(\"msvc-flag\",            quoted_msvc_flag).\n\nlong_option(\"cflags-for-warnings\",  cflags_for_warnings).\nlong_option(\"cflags-for-optimization\",  cflags_for_optimization).\nlong_option(\"cflags-for-ansi\",      cflags_for_ansi).\nlong_option(\"cflags-for-regs\",      cflags_for_regs).\nlong_option(\"cflags-for-gotos\",     cflags_for_gotos).\nlong_option(\"cflags-for-threads\",   cflags_for_threads).\nlong_option(\"cflags-for-debug\",     cflags_for_debug).\nlong_option(\"cflags-for-pic\",       cflags_for_pic).\nlong_option(\"c-flag-to-name-object-file\", c_flag_to_name_object_file).\nlong_option(\"object-file-extension\",    object_file_extension).\nlong_option(\"pic-object-file-extension\", pic_object_file_extension).\nlong_option(\"link-with-pic-object-file-extension\",\n                    link_with_pic_object_file_extension).\nlong_option(\"c-compiler-type\",      c_compiler_type).\nlong_option(\"csharp-compiler-type\", csharp_compiler_type).\n\n\nlong_option(\"java-compiler\",        java_compiler).\nlong_option(\"javac\",                java_compiler).\nlong_option(\"java-interpreter\",     java_interpreter).\nlong_option(\"java-flags\",           java_flags).\nlong_option(\"java-flag\",            quoted_java_flag).\n% XXX we should consider the relationship between java_debug and target_debug\n% more carefully. Perhaps target_debug could imply Java debug if the target\n% is Java. However for the moment they are just synonyms.\nlong_option(\"java-debug\",           target_debug).\nlong_option(\"java-classpath\",       java_classpath).\nlong_option(\"java-object-file-extension\", java_object_file_extension).\n\nlong_option(\"il-assembler\",         il_assembler).\nlong_option(\"ilasm-flags\",          ilasm_flags).\nlong_option(\"ilasm-flag\",           quoted_ilasm_flag).\nlong_option(\"dotnet-library-version\",   dotnet_library_version).\nlong_option(\"support-ms-clr\",       support_ms_clr).\nlong_option(\"support-rotor-clr\",    support_rotor_clr).\n\nlong_option(\"csharp-compiler\",      csharp_compiler).\nlong_option(\"csharp-flags\",         csharp_flags).\nlong_option(\"csharp-flag\",          quoted_csharp_flag).\nlong_option(\"cli-interpreter\",      cli_interpreter).\n\nlong_option(\"erlang-compiler\",      erlang_compiler).\nlong_option(\"erlang-interpreter\",   erlang_interpreter).\nlong_option(\"erlang-flags\",         erlang_flags).\nlong_option(\"erlang-flag\",          quoted_erlang_flag).\nlong_option(\"erlang-include-directory\", erlang_include_directory).\nlong_option(\"erlang-include-dir\",       erlang_include_directory).\nlong_option(\"erlang-object-file-extension\", erlang_object_file_extension).\nlong_option(\"erlang-native-code\",   erlang_native_code).\nlong_option(\"erlang-inhibit-trivial-warnings\",\n                                    erlang_inhibit_trivial_warnings).\n\n% link options\nlong_option(\"output-file\",          output_file_name).\nlong_option(\"ld-flags\",             ld_flags).\nlong_option(\"ld-flag\",              quoted_ld_flag).\nlong_option(\"ld-libflags\",          ld_libflags).\nlong_option(\"ld-libflag\",           quoted_ld_libflag).\nlong_option(\"library-directory\",    link_library_directories).\nlong_option(\"runtime-library-directory\", runtime_link_library_directories).\nlong_option(\"library\",              link_libraries).\nlong_option(\"link-object\",          link_objects).\nlong_option(\"mercury-library\",      mercury_library_special).\nlong_option(\"ml\",                   mercury_library_special).\nlong_option(\"mercury-library-directory\", mercury_library_directory_special).\nlong_option(\"mld\",                  mercury_library_directory_special).\nlong_option(\"search-library-files-directory\",\n                search_library_files_directory_special).\nlong_option(\"search-lib-files-dir\",\n                search_library_files_directory_special).\nlong_option(\"mercury-standard-library-directory\",\n                mercury_standard_library_directory_special).\nlong_option(\"mercury-stdlib-dir\",\n                mercury_standard_library_directory_special).\nlong_option(\"init-file-directory\",  init_file_directories).\nlong_option(\"init-file\",            init_files).\nlong_option(\"trace-init-file\",      trace_init_files).\nlong_option(\"linkage\",              linkage_special).\nlong_option(\"mercury-linkage\",      mercury_linkage_special).\nlong_option(\"demangle\",             demangle).\nlong_option(\"strip\",                strip).\nlong_option(\"main\",                 main).\nlong_option(\"allow-undefined\",      allow_undefined).\nlong_option(\"use-readline\",         use_readline).\nlong_option(\"runtime-flags\",        runtime_flags).\nlong_option(\"extra-initialization-functions\",\n                    extra_initialization_functions).\nlong_option(\"extra-inits\",      extra_initialization_functions).\nlong_option(\"framework\",        frameworks).\nlong_option(\"framework-directory\", framework_directories).\n\nlong_option(\"shared-library-extension\", shared_library_extension).\nlong_option(\"library-extension\",    library_extension).\nlong_option(\"executable-file-extension\", executable_file_extension).\nlong_option(\"create-archive-command\",   create_archive_command).\nlong_option(\"create-archive-command-output-flag\",\n                    create_archive_command_output_flag).\nlong_option(\"create-archive-command-flags\", create_archive_command_flags).\nlong_option(\"link-executable-command\",  link_executable_command).\nlong_option(\"link-shared-lib-command\",  link_shared_lib_command).\nlong_option(\"ranlib-command\",       ranlib_command).\nlong_option(\"ranlib-flags\",         ranlib_flags).\nlong_option(\"mkinit-command\",       mkinit_command).\nlong_option(\"mkinit-erl-command\",   mkinit_erl_command).\nlong_option(\"demangle-command\",     demangle_command).\nlong_option(\"filtercc-command\",     filtercc_command).\nlong_option(\"trace-libs\",           trace_libs).\nlong_option(\"thread-libs\",          thread_libs).\nlong_option(\"hwloc-libs\",           hwloc_libs).\nlong_option(\"hwloc-static-libs\",    hwloc_static_libs).\nlong_option(\"shared-libs\",          shared_libs).\nlong_option(\"math-lib\",             math_lib).\nlong_option(\"readline-libs\",        readline_libs).\nlong_option(\"linker-opt-separator\", linker_opt_separator).\nlong_option(\"linker-debug-flags\",   linker_debug_flags).\nlong_option(\"shlib-linker-debug-flags\", shlib_linker_debug_flags).\nlong_option(\"linker-trace-flags\",   linker_trace_flags).\nlong_option(\"shlib-linker-trace-flags\", shlib_linker_trace_flags).\nlong_option(\"linker-thread-flags\",  linker_thread_flags).\nlong_option(\"shlib-linker-thread-flags\", shlib_linker_thread_flags).\nlong_option(\"linker-static-flags\",  linker_static_flags).\nlong_option(\"linker-strip-flag\",    linker_strip_flag).\nlong_option(\"linker-link-lib-flag\", linker_link_lib_flag).\nlong_option(\"linker-link-lib-suffix\",   linker_link_lib_suffix).\nlong_option(\"shlib-linker-link-lib-flag\", shlib_linker_link_lib_flag).\nlong_option(\"shlib-linker-link-lib-suffix\", shlib_linker_link_lib_suffix).\nlong_option(\"linker-path-flag\",     linker_path_flag).\nlong_option(\"linker-rpath-flag\",    linker_rpath_flag).\nlong_option(\"linker-rpath-separator\",   linker_rpath_separator).\nlong_option(\"shlib-linker-rpath-flag\",  shlib_linker_rpath_flag).\nlong_option(\"shlib-linker-rpath-separator\", shlib_linker_rpath_separator).\nlong_option(\"linker-allow-undefined-flag\", linker_allow_undefined_flag).\nlong_option(\"linker-error-undefined-flag\", linker_error_undefined_flag).\nlong_option(\"shlib-linker-use-install-name\", shlib_linker_use_install_name).\nlong_option(\"shlib-linker-install-name-flag\", shlib_linker_install_name_flag).\nlong_option(\"shlib-linker-install-name-path\", shlib_linker_install_name_path).\nlong_option(\"java-archive-command\", java_archive_command).\n\n% build system options\nlong_option(\"make\",                 make).\nlong_option(\"keep-going\",           keep_going).\nlong_option(\"rebuild\",              rebuild).\nlong_option(\"jobs\",                 jobs).\nlong_option(\"track-flags\",          track_flags).\nlong_option(\"track-options\",        track_flags).\nlong_option(\"invoked-by-mmc-make\",  invoked_by_mmc_make).\nlong_option(\"pre-link-command\",     pre_link_command).\nlong_option(\"extra-init-command\",   extra_init_command).\nlong_option(\"mercury-configuration-directory\",\n                mercury_configuration_directory_special).\nlong_option(\"mercury-config-dir\",\n                mercury_configuration_directory_special).\nlong_option(\"install-prefix\",       install_prefix).\nlong_option(\"install-command\",      install_command).\nlong_option(\"install-command-dir-option\", install_command_dir_option).\nlong_option(\"use-symlinks\",         use_symlinks).\nlong_option(\"library-grade\",        libgrades).\nlong_option(\"libgrade\",             libgrades).\nlong_option(\"libgrades-include-component\", libgrades_include_components).\nlong_option(\"libgrades-include\",           libgrades_include_components).\nlong_option(\"libgrades-exclude-component\", libgrades_exclude_components).\nlong_option(\"libgrades-exclude\",           libgrades_exclude_components).\nlong_option(\"library-linkage\",      lib_linkages).\nlong_option(\"lib-linkage\",          lib_linkages).\nlong_option(\"flags\",                flags_file).\nlong_option(\"flags-file\",           flags_file).\nlong_option(\"options-file\",         options_files).\nlong_option(\"config-file\",          config_file).\nlong_option(\"options-search-directory\", options_search_directories).\nlong_option(\"use-subdirs\",          use_subdirs).\nlong_option(\"use-grade-subdirs\",    use_grade_subdirs).\nlong_option(\"search-directory\",     search_directories).\nlong_option(\"intermod-directory\",   intermod_directories).\nlong_option(\"use-search-directories-for-intermod\",\n                    use_search_directories_for_intermod).\nlong_option(\"libgrade-install-check\", libgrade_install_check).\nlong_option(\"order-make-by-timestamp\", order_make_by_timestamp).\nlong_option(\"show-make-times\",      show_make_times).\nlong_option(\"extra-lib-header\",     extra_library_header).\nlong_option(\"extra-library-header\", extra_library_header).\nlong_option(\"restricted-command-line\", restricted_command_line).\nlong_option(\"env-type\",                env_type).\nlong_option(\"host-env-type\",           host_env_type).\nlong_option(\"target-env-type\",         target_env_type).\n\n% misc options\nlong_option(\"typecheck-ambiguity-warn-limit\",\n                                    typecheck_ambiguity_warn_limit).\nlong_option(\"typecheck-ambiguity-error-limit\",\n                                    typecheck_ambiguity_error_limit).\nlong_option(\"help\",                 help).\nlong_option(\"version\",              version).\nlong_option(\"filenames-from-stdin\", filenames_from_stdin).\nlong_option(\"fullarch\",             fullarch).\nlong_option(\"cross-compiling\",      cross_compiling).\nlong_option(\"local-module-id\",      local_module_id).\nlong_option(\"analysis-file-cache-dir\",  analysis_file_cache_dir).\nlong_option(\"bug-intermod-2002-06-13\",  compiler_sufficiently_recent).\nlong_option(\"bug-intermod-2006-09-28\",  compiler_sufficiently_recent).\nlong_option(\"bug-foreign_import-2002-08-06\", compiler_sufficiently_recent).\nlong_option(\"install-opt-files-2002-08-30\", compiler_sufficiently_recent).\nlong_option(\"read-config-file-2003-03-01\", compiler_sufficiently_recent).\n% XXX this option won't be recognised because of the \"no-\" prefix,\n% but \"no-no-\" will be recognised.\nlong_option(\"no-noncompact-ho-call-2004-01-15\", compiler_sufficiently_recent).\nlong_option(\"trace-io-builtins-2006-08-14\", compiler_sufficiently_recent).\nlong_option(\"compound-compare-builtins-2007-07-09\",\n                                    compiler_sufficiently_recent).\n% XXX this option won't be recognised because of the \"no-\" prefix,\n% but \"no-no-\" will be recognised.\nlong_option(\"no-det-warning-compound-compare-2007-07-17\",\n                                    compiler_sufficiently_recent).\nlong_option(\"foreign-enum-switch-fix\",\n                                    compiler_sufficiently_recent).\nlong_option(\"failing-disjunct-in-switch-dup-fix\",\n                                    compiler_sufficiently_recent).\nlong_option(\"store-at-ref-impure-2008-09-11\",\n                                    compiler_sufficiently_recent).\nlong_option(\"java-export-ref-out\",  compiler_sufficiently_recent).\nlong_option(\"java-generics-2010-04-13\",\n                                    compiler_sufficiently_recent).\nlong_option(\"experiment\",           experiment).\nlong_option(\"ignore-par-conjunctions\",\n                                    ignore_par_conjunctions).\nlong_option(\"control-granularity\",  control_granularity).\nlong_option(\"distance-granularity\", distance_granularity).\nlong_option(\"implicit-parallelism\", implicit_parallelism).\nlong_option(\"feedback-file\",        feedback_file).\nlong_option(\"par-loop-control\",     par_loop_control).\nlong_option(\"par-loop-control-preserve-tail-recursion\",\n                                    par_loop_control_preserve_tail_recursion).\n\n%-----------------------------------------------------------------------------%\n\nspecial_handler(grade, string(Grade), OptionTable0, Result) :-\n    ( convert_grade_option(Grade, OptionTable0, OptionTable) ->\n        Result = ok(OptionTable)\n    ;\n        Result = error(\"invalid grade `\" ++ Grade ++ \"'\")\n    ).\nspecial_handler(il, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"il\"), !OptionTable).\nspecial_handler(il_only, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"il\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(compile_to_c, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"c\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(java, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"java\"), !OptionTable).\nspecial_handler(java_only, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"java\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(csharp, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"csharp\"), !OptionTable).\nspecial_handler(csharp_only, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"csharp\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(x86_64, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"x86_64\"), !OptionTable).\nspecial_handler(x86_64_only, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"x86_64\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(erlang, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"erlang\"), !OptionTable).\nspecial_handler(erlang_only, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"erlang\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(profiling, bool(Value), !.OptionTable, ok(!:OptionTable)) :-\n    map.set(profile_time, bool(Value), !OptionTable),\n    map.set(profile_calls, bool(Value), !OptionTable),\n    map.set(profile_memory, bool(no), !OptionTable),\n    map.set(profile_deep, bool(no), !OptionTable).\nspecial_handler(time_profiling, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(profile_time, bool(yes), !OptionTable),\n    map.set(profile_calls, bool(yes), !OptionTable),\n    map.set(profile_memory, bool(no), !OptionTable),\n    map.set(profile_deep, bool(no), !OptionTable).\nspecial_handler(memory_profiling, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(profile_time, bool(no), !OptionTable),\n    map.set(profile_calls, bool(yes), !OptionTable),\n    map.set(profile_memory, bool(yes), !OptionTable),\n    map.set(profile_deep, bool(no), !OptionTable).\nspecial_handler(deep_profiling, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(profile_time, bool(no), !OptionTable),\n    map.set(profile_calls, bool(no), !OptionTable),\n    map.set(profile_memory, bool(no), !OptionTable),\n    map.set(profile_deep, bool(yes), !OptionTable).\nspecial_handler(inlining, bool(Value), !.OptionTable, ok(!:OptionTable)) :-\n    map.set(inline_simple, bool(Value), !OptionTable),\n    map.set(inline_builtins, bool(Value), !OptionTable),\n    map.set(inline_single_use, bool(Value), !OptionTable),\n    (\n        Value = yes,\n        map.set(inline_compound_threshold, int(10), !OptionTable)\n    ;\n        Value = no,\n        map.set(inline_compound_threshold, int(0), !OptionTable)\n    ).\nspecial_handler(everything_in_one_c_function, none, !.OptionTable,\n        ok(!:OptionTable)) :-\n    map.set(procs_per_c_function, int(0), !OptionTable).\nspecial_handler(reclaim_heap_on_failure, bool(Value), !.OptionTable,\n            ok(!:OptionTable)) :-\n    map.set(reclaim_heap_on_semidet_failure, bool(Value), !OptionTable),\n    map.set(reclaim_heap_on_nondet_failure, bool(Value), !OptionTable).\nspecial_handler(strict_sequential, none, !.OptionTable, ok(!:OptionTable)) :-\n    override_options([\n            reorder_conj - bool(no),\n            reorder_disj - bool(no),\n            fully_strict - bool(yes)\n        ], !OptionTable).\nspecial_handler(inhibit_warnings, bool(Inhibit), !.OptionTable,\n        ok(!:OptionTable)) :-\n    bool.not(Inhibit, Enable),\n    override_options([\n            inhibit_accumulator_warnings    -   bool(Inhibit),\n            warn_singleton_vars             -   bool(Enable),\n            warn_overlapping_scopes         -   bool(Enable),\n            warn_det_decls_too_lax          -   bool(Enable),\n            warn_inferred_erroneous         -   bool(Enable),\n            warn_nothing_exported           -   bool(Enable),\n            warn_interface_imports          -   bool(Enable),\n            warn_missing_opt_files          -   bool(Enable),\n            warn_missing_trans_opt_files    -   bool(Enable),\n            warn_missing_trans_opt_deps     -   bool(Enable),\n            warn_unification_cannot_succeed -   bool(Enable),\n            warn_simple_code                -   bool(Enable),\n            warn_missing_module_name        -   bool(Enable),\n            warn_wrong_module_name          -   bool(Enable),\n            warn_smart_recompilation        -   bool(Enable),\n            warn_undefined_options_variables -  bool(Enable),\n            warn_target_code                -   bool(Enable),\n            warn_up_to_date                 -   bool(Enable),\n            warn_stubs                      -   bool(Enable),\n            warn_dead_procs                 -   bool(Enable),\n            warn_table_with_inline          -   bool(Enable),\n            warn_non_term_special_preds     -   bool(Enable),\n            warn_insts_without_matching_type -  bool(Enable)\n        ], !OptionTable).\nspecial_handler(infer_all, bool(Infer), !.OptionTable, ok(!:OptionTable)) :-\n    override_options([\n            infer_types                     -   bool(Infer),\n            infer_modes                     -   bool(Infer),\n            infer_det                       -   bool(Infer)\n        ], !OptionTable).\nspecial_handler(opt_space, none, !.OptionTable, ok(!:OptionTable)) :-\n    opt_space(OptionSettingsList),\n    override_options(OptionSettingsList, !OptionTable).\nspecial_handler(opt_level, int(N0), !.OptionTable, ok(!:OptionTable)) :-\n    ( N0 > 6 ->\n        N = 6\n    ; N0 < -1 ->\n        N = -1\n    ;\n        N = N0\n    ),\n    map.set(opt_level_number, int(N), !OptionTable),\n    set_opt_level(N, !OptionTable).\nspecial_handler(optimize_saved_vars, bool(Optimize),\n        !.OptionTable, ok(!:OptionTable)) :-\n    map.set(optimize_saved_vars_const, bool(Optimize), !OptionTable),\n    map.set(optimize_saved_vars_cell, bool(Optimize), !OptionTable).\nspecial_handler(mercury_library_directory_special, string(Dir),\n        !.OptionTable, ok(!:OptionTable)) :-\n    !:OptionTable = option_table_add_mercury_library_directory(\n        !.OptionTable, Dir).\nspecial_handler(search_library_files_directory_special, string(Dir),\n        OptionTable0, ok(OptionTable)) :-\n    OptionTable = option_table_add_search_library_files_directory(\n        OptionTable0, Dir).\nspecial_handler(mercury_library_special, string(Lib),\n        OptionTable0, ok(OptionTable)) :-\n    OptionTable =\n        list.foldl(append_to_accumulating_option, [\n            link_libraries                  - Lib,\n            mercury_libraries               - Lib,\n            init_files                      - (Lib ++ \".init\")\n        ], OptionTable0).\nspecial_handler(mercury_standard_library_directory_special,\n        maybe_string(MaybeStdLibDir), OptionTable0, ok(OptionTable)) :-\n    OptionTable =\n        map.set(map.set(OptionTable0,\n        mercury_standard_library_directory, maybe_string(MaybeStdLibDir)),\n        mercury_configuration_directory, maybe_string(MaybeStdLibDir)).\nspecial_handler(mercury_configuration_directory_special,\n        string(ConfDir), OptionTable0, ok(OptionTable)) :-\n    OptionTable = map.set(OptionTable0, mercury_configuration_directory,\n        maybe_string(yes(ConfDir))).\nspecial_handler(quoted_cflag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(cflags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_gcc_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(gcc_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_clang_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(clang_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_msvc_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(msvc_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_java_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(java_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_ilasm_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(ilasm_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_csharp_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(csharp_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_erlang_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(erlang_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_ld_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(ld_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_ld_libflag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(ld_libflags, Flag, OptionTable0, OptionTable).\nspecial_handler(linkage_special, string(Flag), OptionTable0, Result) :-\n    ( ( Flag = \"shared\" ; Flag = \"static\" ) ->\n        Result = ok(\n            (OptionTable0 ^ elem(mercury_linkage) := string(Flag))\n                ^ elem(linkage) := string(Flag))\n    ;\n        Result = error(\"argument of `--linkage' should be either \" ++\n            \"\"\"shared\"\" or \"\"static\"\".\")\n    ).\nspecial_handler(mercury_linkage_special, string(Flag),\n            OptionTable0, Result) :-\n    ( ( Flag = \"shared\" ; Flag = \"static\" ) ->\n        Result = ok(OptionTable0 ^ elem(mercury_linkage) := string(Flag))\n    ;\n        Result = error(\"argument of `--mercury-linkage' should be either \" ++\n            \"\"\"shared\"\" or \"\"static\"\".\")\n    ).\n\nspecial_handler(env_type, string(EnvTypeStr), OptionTable0, ok(OptionTable)) :-\n    OptionTable =\n        map.set(map.set(OptionTable0,\n        host_env_type, string(EnvTypeStr)),\n        target_env_type, string(EnvTypeStr)).\n\nspecial_handler(inform_inferred, bool(Inform), !.OptionTable,\n        ok(!:OptionTable)) :-\n    override_options([\n            inform_inferred_types -   bool(Inform),\n            inform_inferred_modes -   bool(Inform)\n        ], !OptionTable).\n\n%-----------------------------------------------------------------------------%\n\noption_table_add_mercury_library_directory(OptionTable0, Dir) =\n    % The init_file_directories and link_library_directories for Mercury\n    % libraries are grade dependent, so they need to be handled in\n    % handle_options.m after we know the grade.\n    list.foldl(append_to_accumulating_option, [\n        search_directories          - dir.make_path_name(Dir, \"ints\"),\n        c_include_directory         - dir.make_path_name(Dir, \"inc\"),\n        erlang_include_directory    - dir.make_path_name(Dir, \"inc\"),\n        mercury_library_directories - Dir\n    ], OptionTable0).\n\noption_table_add_search_library_files_directory(OptionTable0, Dir) =\n    % Grade dependent directories need to be handled in handle_options.m\n    % after we know the grade.\n    list.foldl(append_to_accumulating_option, [\n        search_directories          - Dir,\n        c_include_directory         - Dir,\n        erlang_include_directory    - Dir,\n        search_library_files_directories - Dir\n    ], OptionTable0).\n\n:- func append_to_accumulating_option(pair(option, string),\n        option_table) = option_table.\n\nappend_to_accumulating_option(Option - Value, OptionTable0) =\n    OptionTable0 ^ elem(Option) :=\n        accumulating(\n            getopt_io.lookup_accumulating_option(OptionTable0, Option)\n        ++ [Value]).\n\n:- pred set_opt_level(int::in, option_table::in, option_table::out) is det.\n\nset_opt_level(N, !OptionTable) :-\n    % First reset all optimizations to their default\n    % (the default should be all optimizations off).\n    option_defaults_2(optimization_option, OptimizationDefaults),\n    override_options(OptimizationDefaults, !OptionTable),\n\n    % Next enable the optimization levels from 0 up to N.\n    enable_opt_levels(0, N, !OptionTable).\n\n:- pred enable_opt_levels(int::in, int::in,\n    option_table::in, option_table::out) is det.\n\nenable_opt_levels(N0, N, !OptionTable) :-\n    ( N0 > N ->\n        true\n    ; opt_level(N0, !.OptionTable, OptionSettingsList) ->\n        override_options(OptionSettingsList, !OptionTable),\n        N1 = N0 + 1,\n        enable_opt_levels(N1, N, !OptionTable)\n    ;\n        unexpected($module, $pred, \"unknown optimization level\")\n    ).\n\n:- pred override_options(list(pair(option, option_data))::in,\n    option_table::in, option_table::out) is det.\n\noverride_options([], !OptionTable).\noverride_options([Option - Value | Settings], !OptionTable) :-\n    map.set(Option, Value, !OptionTable),\n    override_options(Settings, !OptionTable).\n\n%-----------------------------------------------------------------------------%\n\n:- pred opt_space(list(pair(option, option_data))::out) is det.\n\nopt_space([\n    unneeded_code_copy_limit    -   int(1),\n    optimize_dead_procs         -   bool(yes),\n    optimize_labels             -   bool(yes),\n    optimize_dups               -   bool(yes),\n    optimize_proc_dups          -   bool(yes),\n    optimize_fulljumps          -   bool(no),\n    optimize_reassign           -   bool(yes),\n    inline_alloc                -   bool(no),\n    use_macro_for_redo_fail     -   bool(no),\n    loop_invariants             -   bool(no)\n]).\n\n%-----------------------------------------------------------------------------%\n\n:- pred opt_level(int::in, option_table::in,\n    list(pair(option, option_data))::out) is semidet.\n\n% Optimization level -1:\n% Generate totally unoptimized code; turns off ALL optimizations that\n% can be turned off, including HLDS->HLDS, HLDS->LLDS, LLDS->LLDS, LLDS->C,\n% and C->object optimizations.\n% (However, there are some optimizations that can't be disabled.)\n\n% Optimization level 0: aim to minimize overall compilation time.\n% XXX I just guessed.  We should run lots of experiments.\n\nopt_level(0, _, [\n    common_data                 -   bool(yes),\n    optimize                    -   bool(yes),\n    optimize_repeat             -   int(1),\n    optimize_peep               -   bool(yes),\n    optimize_peep_mkword        -   bool(yes),\n    static_ground_cells         -   bool(yes),\n    smart_indexing              -   bool(yes),\n    optimize_jumps              -   bool(yes),\n    optimize_labels             -   bool(yes),\n    optimize_dead_procs         -   bool(yes),\n    excess_assign               -   bool(yes)   % ???\n]).\n\n% Optimization level 1: apply optimizations which are cheap and\n% have a good payoff while still keeping compilation time small.\n\nopt_level(1, OptionTable, [\n    use_local_vars              -   bool(yes),\n    c_optimize                  -   bool(yes),  % XXX we want `gcc -O1'\n    optimize_frames             -   bool(yes),\n    optimize_delay_slot         -   bool(DelaySlot),\n    middle_rec                  -   bool(yes),\n    emit_c_loops                -   bool(yes),\n    optimize_tailcalls          -   bool(yes)\n    % dups?\n]) :-\n    getopt_io.lookup_bool_option(OptionTable, have_delay_slot, DelaySlot).\n\n% Optimization level 2: apply optimizations which have a good\n% payoff relative to their cost; but include optimizations\n% which are more costly than with -O1.\n\nopt_level(2, _, [\n    optimize_fulljumps          -   bool(yes),\n    optimize_repeat             -   int(3),\n    optimize_dups               -   bool(yes),\n    follow_code                 -   bool(yes),\n    inline_simple               -   bool(yes),\n    inline_single_use           -   bool(yes),\n    inline_compound_threshold   -   int(10),\n    common_struct               -   bool(yes),\n    user_guided_type_specialization -   bool(yes),\n    % XXX While inst `array' is defined as `ground', we can't optimize\n    % duplicate calls (we might combine calls to `array.init').\n    % optimize_duplicate_calls  -   bool(yes),\n    simple_neg                  -   bool(yes),\n\n    optimize_initializations    -  bool(yes)\n]).\n\n% Optimization level 3: apply optimizations which usually have a good\n% payoff even if they increase compilation time quite a bit.\n\nopt_level(3, _, [\n    optimize_saved_vars_const   - bool(yes),\n    optimize_unused_args        -   bool(yes),\n    optimize_higher_order       -   bool(yes),\n    deforestation               -   bool(yes),\n    local_constraint_propagation -  bool(yes),\n    constant_propagation        -   bool(yes),\n    optimize_reassign           -   bool(yes),\n    % Disabled until a bug in extras/trailed_update/var.m is resolved.\n    % introduce_accumulators    -   bool(yes),\n    optimize_repeat             -   int(4)\n]).\n\n% Optimization level 4: apply optimizations which may have some\n% payoff even if they increase compilation time quite a bit.\n\n% Currently this enables the use of local variables\n% and increases the inlining thresholds.\n\nopt_level(4, _, [\n    inline_simple_threshold     -   int(8),\n    inline_compound_threshold   -   int(20),\n    higher_order_size_limit     -   int(30)\n]).\n\n% Optimization level 5: apply optimizations which may have some\n% payoff even if they increase compilation time a lot.\n\n% Currently this enables the search for construction unifications that can be\n% delayed past failing computations, allows more passes of the low-level\n% optimizations, and increases the inlining thresholds still further.\n% We also enable eliminate_local_vars only at this level,\n% because that pass is implemented pretty inefficiently.\n\nopt_level(5, _, [\n    optimize_repeat             -   int(5),\n    delay_construct             -   bool(yes),\n    inline_compound_threshold   -   int(100),\n    higher_order_size_limit     -   int(40),\n    eliminate_local_vars        -   bool(yes),\n    loop_invariants             -   bool(yes)\n]).\n\n% Optimization level 6: apply optimizations which may have any payoff even if\n% they increase compilation time to completely unreasonable levels.\n\n% Currently this sets `everything_in_one_c_function', which causes the compiler\n% to put everything in the one C function and treat calls to predicates in the\n% same module as local. We also enable inlining of GC_malloc(), redo(), and\n% fail().\n\nopt_level(6, _, [\n    procs_per_c_function        -   int(0), % everything in one C function\n    inline_alloc                -   bool(yes),\n    use_macro_for_redo_fail     -   bool(yes)\n]).\n\n% The following optimization options are not enabled at any level:\n%\n%   checked_nondet_tailcalls:\n%       This is deliberate, because the transformation\n%       might make code run slower.\n%\n%   constraint_propagation:\n%       I think this is deliberate, because the transformation\n%       might make code run slower?\n%\n%   unneeded_code:\n%       Because it can cause slowdowns at high optimization levels;\n%       cause unknown\n%   type_specialization:\n%       XXX why not?\n%\n%   introduce_accumulators:\n%       XXX Disabled until a bug in extras/trailed_update/var.m\n%       is resolved.\n%\n%   optimize_constructor_last_call:\n%       Not a speedup in general.\n\n%-----------------------------------------------------------------------------%\n\n:- pred handle_quoted_flag(option::in, string::in,\n    option_table::in, option_table::out) is det.\n\nhandle_quoted_flag(Option, Flag, Table,\n    append_to_accumulating_option(Option - quote_arg(Flag), Table)).\n\nquote_arg(Arg0) = Arg :-\n    % XXX Instead of using dir.use_windows_paths, this should really\n    % test whether we are using a Unix or Windows shell.\n    ( dir.use_windows_paths ->\n        ( ( string_contains_whitespace(Arg0) ; Arg0 = \"\" ) ->\n            Arg = \"\"\"\" ++ Arg0 ++ \"\"\"\"\n        ;\n            Arg = Arg0\n        )\n    ;\n        ArgList = quote_arg_unix(string.to_char_list(Arg0)),\n        (\n            ArgList = [],\n            Arg = \"\"\"\"\"\"\n        ;\n            ArgList = [_ | _],\n            (\n                list.member(Char, ArgList),\n                \\+\n                    ( char.is_alnum_or_underscore(Char)\n                    ; Char = ('-')\n                    ; Char = ('/')\n                    ; Char = ('.')\n                    ; Char = (',')\n                    ; Char = (':')\n                    )\n            ->\n                Arg = \"\"\"\" ++ string.from_char_list(ArgList) ++ \"\"\"\"\n            ;\n                Arg = string.from_char_list(ArgList)\n            )\n        )\n    ).\n\n:- pred string_contains_whitespace(string::in) is semidet.\n\nstring_contains_whitespace(Str) :-\n    Chars = string.to_char_list(Str),\n    some [Char] (\n        list.member(Char, Chars),\n        char.is_whitespace(Char)\n    ).\n\n:- func quote_arg_unix(list(char)) = list(char).\n\nquote_arg_unix([]) = [].\nquote_arg_unix([Char | Chars0]) = Chars :-\n    Chars1 = quote_arg_unix(Chars0),\n    ( quote_char_unix(Char) ->\n        Chars = [('\\\\'), Char | Chars1]\n    ;\n        Chars = [Char | Chars1]\n    ).\n\n:- pred quote_char_unix(char::in) is semidet.\n\nquote_char_unix('\\\\').\nquote_char_unix('\"').\nquote_char_unix('`').\nquote_char_unix('$').\n\n%-----------------------------------------------------------------------------%\n\ninconsequential_options(InconsequentialOptions) :-\n    option_defaults_2(warning_option, WarningOptions),\n    option_defaults_2(verbosity_option, VerbosityOptions),\n    option_defaults_2(internal_use_option, InternalUseOptions),\n    option_defaults_2(build_system_option, BuildSystemOptions),\n    assoc_list.keys(WarningOptions, WarningKeys),\n    assoc_list.keys(VerbosityOptions, VerbosityKeys),\n    assoc_list.keys(InternalUseOptions, InternalUseKeys),\n    assoc_list.keys(BuildSystemOptions, BuildSystemKeys),\n    Keys = WarningKeys ++ VerbosityKeys ++ InternalUseKeys ++ BuildSystemKeys,\n    InconsequentialOptions = set.from_list(Keys).\n\n%-----------------------------------------------------------------------------%\n\noptions_help -->\n    io.write_string(\"\\t-?, -h, --help\\n\"),\n    io.write_string(\"\\t\\tPrint this usage message.\\n\"),\n    options_help_warning,\n    options_help_verbosity,\n    options_help_output,\n    options_help_aux_output,\n    options_help_semantics,\n    options_help_termination,\n    options_help_ctgc,\n    options_help_compilation_model,\n    options_help_code_generation,\n    options_help_optimization,\n    options_help_hlds_hlds_optimization,\n    options_help_hlds_llds_optimization,\n    options_help_llds_llds_optimization,\n    options_help_mlds_mlds_optimization,\n    options_help_hlds_elds_optimization,\n    options_help_output_optimization,\n    options_help_target_code_compilation,\n    options_help_link,\n    options_help_build_system,\n    options_help_misc.\n\n:- pred options_help_warning(io::di, io::uo) is det.\n\noptions_help_warning -->\n    io.write_string(\"\\nWarning Options:\\n\"),\n    write_tabbed_lines([\n        \"-w, --inhibit-warnings\",\n        \"\\tDisable all warning messages.\",\n        \"--halt-at-warn\",\n        \"\\tThis option causes the compiler to treat all \",\n        \"\\twarnings as if they were errors.  This means that\",\n        \"\\tif any warning is issued, the compiler will not\",\n        \"\\tgenerate code --- instead, it will return a\",\n        \"\\tnon-zero exit status.\",\n        \"--halt-at-syntax-errors\",\n        \"\\tThis option causes the compiler to halt immediately\",\n        \"\\tafter syntax checking and not do any semantic checking\",\n        \"\\tif it finds any syntax errors in the program.\",\n%       \"--halt-at-auto-parallel-failure\",\n%       \"\\tThis option causes the compiler to halt if it cannot perform\",\n%       \"\\tan auto-parallelization requested by a feedback file.\",\n        \"--inhibit-accumulator-warnings\",\n        \"\\tDon't warn about argument order rearrangement caused\",\n        \"\\tby --introduce-accumulators.\",\n        \"--no-warn-singleton-variables\",\n        \"\\tDon't warn about variables which only occur once.\",\n        \"--no-warn-overlapping-scopes\",\n        \"\\tDon't warn about variables which occur in overlapping scopes.\",\n        \"--no-warn-det-decls-too-lax\",\n        \"\\tDon't warn about determinism declarations\",\n        \"\\twhich could have been stricter.\",\n        \"--no-warn-inferred-erroneous\",\n        \"\\tDon't warn about procedures whose determinism is inferred\",\n        \"\\terroneous but whose determinism declarations are laxer.\",\n        \"--no-warn-insts-without-matching-type\",\n        \"\\tDon't warn about insts that are not consistent with any\",\n        \"\\tof the types in scope.\",\n        % XXX disabled until compiler unused_imports,\n        % don't forget to update the user_guide.texi\n        % \"--no-warn-unused-imports\",\n        % \"\\tDon't warn about modules that are imported but not used.\",\n        \"--warn-unused-imports\",\n        \"\\tWarn about modules that are imported but not used.\",\n        \"--no-warn-nothing-exported\",\n        \"\\tDon't warn about modules which export nothing.\",\n        \"--warn-unused-args\",\n        \"\\tWarn about predicate arguments which are not used.\",\n        \"--warn-interface-imports\",\n        \"\\tWarn about modules imported in the interface, but\",\n        \"\\twhich are not used in the interface.\",\n        \"--no-warn-missing-opt-files\",\n        \"\\tDisable warnings about `.opt' files which cannot be opened.\",\n        \"--warn-missing-trans-opt-files\",\n        \"\\tEnable warnings about `.trans_opt' files which cannot\",\n        \"\\tbe opened.\",\n        \"--no-warn-missing-trans-opt-deps\",\n        \"\\tDisable warnings produced when the information required\",\n        \"\\tto allow `.trans_opt' files to be read when creating other\",\n        \"\\t`.trans_opt' files has been lost.  The information can be\",\n        \"\\trecreated by running `mmake <mainmodule>.depend'\",\n        \"--no-warn-non-contiguous-clauses\",\n        \"\\tDo not generate a warning if the clauses of a predicate or function\",\n        \"\\tare not contiguous.\",\n        \"--warn-non-contiguous-foreign-procs\",\n        \"\\tGenerate a warning if the clauses and foreign_procs of a predicate\",\n        \"\\tor function are not contiguous.\",\n        \"--warn-non-stratification\",\n        \"\\tWarn about possible non-stratification of the predicates and/or\",\n        \"\\tfunctions in the module.\",\n        \"\\tNon-stratification occurs when a predicate or function can call\",\n        \"\\titself negatively through some path along its call graph.\",\n        \"--no-warn-unification-cannot-succeed\",\n        \"\\tDisable warnings about unifications which cannot succeed.\",\n        \"--no-warn-simple-code\",\n        \"\\tDisable warnings about constructs which are so\",\n        \"\\tsimple that they are likely to be programming errors.\",\n        \"--warn-duplicate-calls\",\n        \"\\tWarn about multiple calls to a predicate with the\",\n        \"\\tsame input arguments.\",\n        \"--no-warn-missing-module-name\",\n        \"\\tDisable warnings for modules that do no start with\",\n        \"\\ta `:- module' declaration.\",\n        \"--no-warn-wrong-module-name\",\n        \"\\tDisable warnings for modules whose `:- module'\",\n        \"\\tdeclaration does not match the module's file name.\",\n        \"--no-warn-smart-recompilation\",\n        \"\\tDisable warnings from the smart recompilation system.\",\n        \"--no-warn-undefined-options-variables\",\n        \"\\tDo not warn about references to undefined variables in\",\n        \"\\toptions files with `--make'.\",\n        \"--warn-non-tail-recursion\",\n        \"\\tWarn about any directly recursive calls that are not tail calls.\",\n        \"--no-warn-up-to-date\",\n        \"\\tDon't warn if targets specified on the command line\",\n        \"\\twith `--make' are already up to date.\",\n        \"--no-warn-stubs\",\n        \"\\tDisable warnings about procedures for which there are no\",\n        \"\\tclauses.  Note that this option only has any effect if\",\n        \"\\tthe `--allow-stubs' option (described in the \"\"Language\",\n        \"\\tSemantics Options\"\" section below) is enabled.\",\n        \"--warn-dead-procs\",\n        \"\\tWarn about procedures which are never called.\",\n        \"--no-warn-target-code\",\n        \"\\tDisable warnings from the compiler used to process the\",\n        \"\\ttarget code (e.g. gcc).\",\n        \"--no-warn-table-with-inline\",\n        \"\\tDisable warnings about tabled procedures that also have\",\n        \"\\ta `pragma inline' declaration.\",\n        \"--no-warn-non-term-special-preds\",\n        \"\\tDo not warn about types that have user-defined equality or\",\n        \"\\tcomparison predicates that cannot be proved to terminate.\",\n        \"\\tThis option is only enabled when termination analysis is enabled.\",\n        \"\\t(See the \"\"Termination Analysis Options\"\" section below).\",\n        \"--no-warn-known-bad-format-calls\",\n        \"\\tDo not warn about calls to string.format or io.format that\",\n        \"\\tthe compiler knows for sure contain mismatches between the\",\n        \"\\tformat string and the supplied values.\",\n        \"--warn-unknown-format-calls\",\n        \"\\tWarn about calls to string.format or io.format for which\",\n        \"\\tthe compiler cannot tell whether there are any mismatches\",\n        \"\\tbetween the format string and the supplied values.\",\n        \"--no-warn-obsolete\",\n        \"\\tDo not warn about calls to predicates or functions that have\",\n        \"\\tbeen marked as obsolete.\",\n        \"--inform-ite-instead-of-switch\",\n        \"\\tGenerate informational messages for if-then-elses that could be\",\n        \"\\treplaced by switches.\",\n        \"--no-warn-unresolved-polymorphism\",\n        \"\\tDo not warn about unresolved polymorphism.\",\n        \"--warn-suspicious-foreign-procs\",\n        \"\\tWarn about possible errors in the bodies of foreign\",\n        \"\\tprocedures.\",\n        \"--no-warn-state-var-shadowing\",\n        \"\\tDo not warn about one state variable shadowing another.\",\n        \"--no-inform-inferred\",\n        \"\\tDo not generate messages about inferred types or modes.\",\n        \"--no-inform-inferred-types\",\n        \"\\tDo not generate messages about inferred types.\",\n        \"--no-inform-inferred-modes\",\n        \"\\tDo not generate messages about inferred modes.\"\n    ]).\n\n:- pred options_help_verbosity(io::di, io::uo) is det.\n\noptions_help_verbosity -->\n    io.write_string(\"\\nVerbosity Options:\\n\"),\n    write_tabbed_lines([\n        \"-v, --verbose\",\n        \"\\tOutput progress messages at each stage in the compilation.\",\n        \"-V, --very-verbose\",\n        \"\\tOutput very verbose progress messages.\",\n        \"-E, --verbose-error-messages\",\n        \"\\tExplain error messages.  Asks the compiler to give you a more\",\n        \"\\tdetailed explanation of any errors it finds in your program.\",\n        \"--no-verbose-make\",\n        \"\\tDisable messages about the progress of builds using\",\n        \"\\tthe `--make' option.\",\n        \"--verbose-commands\",\n        \"\\tOutput each external command before it is run.\",\n        \"\\tNote that some commands will only be printed with `--verbose'.\",\n        \"--verbose-recompilation\",\n        \"\\tWhen using `--smart-recompilation', output messages\",\n        \"\\texplaining why a module needs to be recompiled.\",\n        \"--find-all-recompilation-reasons\",\n        \"\\tFind all the reasons why a module needs to be recompiled,\",\n        \"\\tnot just the first.  Implies `--verbose-recompilation'.\",\n        \"--output-compile-error-lines <n>\",\n        \"\\tWith `--make', output the first <n> lines of the `.err'\",\n        \"\\tfile after compiling a module (default: 15).\",\n        \"--report-cmd-line-args-doterr\",\n        \"\\tReport the command line arguments.\",\n        \"--report-cmd-line-args-in-doterr\",\n        \"\\tReport the command line arguments for compilations whose output\",\n        \"\\tmmake normally redirects to a .err file.\",\n        \"-S, --statistics\",\n        \"\\tOutput messages about the compiler's time/space usage.\",\n        \"\\tAt the moment this option implies `--no-trad-passes', so you get\",\n        \"\\tinformation at the boundaries between phases of the compiler.\",\n% The only sensible way to use --detailed-statistics, based on --very-verbose,\n% is implemented automatically in handle_options, so users shouldn't need to be\n% aware of it.\n%       \"--detailed-statistics\",\n%       \"\\tOutput more detailed messages about the compiler's\",\n%       \"\\ttime/space usage.\",\n        \"--proc-size-statistics <filename>\",\n        \"\\tAppend information about the size of each procedure in the module\",\n        \"\\tin terms of goals and variables to the end of the named file.\",\n% --debug-types works only if the compiler was compiled with\n% \"--trace-flag type_checkpoint\".\n%       \"-T, --debug-types\",\n%       \"\\tOutput detailed debugging traces of the type checking.\",\n        \"-N, --debug-modes\",\n        \"\\tOutput debugging traces of the mode checking.\",\n        \"--debug-modes-statistics\",\n        \"\\tOutput statistics after each step of mode checking.\",\n        \"--debug-modes-minimal\",\n        \"\\tOutput only minimal debugging traces of the mode checking.\",\n        \"--debug-modes-verbose\",\n        \"\\tOutput detailed debugging traces of the mode checking.\",\n        \"--debug-modes-pred-id <n>\",\n        \"\\tWith --debug-modes, restrict the debugging traces to the\",\n        \"\\tmode checking of the predicate or function with the specified\",\n        \"\\tpred id.\",\n% --debug-dep-par-conj <n> is a developer only option,\n% and it is effective only if the compiler was compiled with the right\n% trace flags.\n%       \"--debug-dep-par-conj <n>\",\n%       \"\\tOutput detailed debugging traces during the dependent\",\n%       \"\\tAND-parallelism transformation of the predicate with the\",\n%       \"\\tpredicate id.\",\n        \"--debug-det, --debug-determinism\",\n        \"\\tOutput detailed debugging traces of determinism analysis.\",\n% --debug-code-gen-pred-id <n> is a developer only option,\n% and it is effective only if the compiler was compiled with the right\n% trace flags.\n%       \"--debug-code-gen-pred-id <n>\",\n%       \"\\tOutput detailed debugging traces of code generation for the\",\n%       \"\\tpredicate or function with the given pred id.\",\n% The new termination analyser is currently a work-in-progress.\n%\n        %\"--debug-term, --debug-termination\",\n        %\"\\tOutput detailed debugging traces of the termination2 analysis.\",\n        \"--debug-opt\",\n        \"\\tOutput detailed debugging traces of the optimization process.\",\n        \"--debug-opt-pred-id <n>\",\n        \"\\tOutput detailed debugging traces of the optimization process\",\n        \"\\tonly for the predicate/function with the specified pred id.\",\n        \"--debug-opt-pred-name <name>\",\n        \"\\tOutput detailed debugging traces of the optimization process\",\n        \"\\tonly for the predicate/function with the specified name.\",\n        \"--debug-pd\",\n        \"\\tOutput detailed debugging traces of the partial\",\n        \"\\tdeduction and deforestation process.\",\n        \"--debug-liveness <pred_id>\",\n        \"\\tOutput detailed debugging traces of the liveness analysis\",\n        \"\\tof the predicate with the given predicate id.\",\n        \"--debug-make\",\n        \"\\tOutput detailed debugging traces of the `--make' option.\",\n% This can be uncommented when the '--analyse-closures' option is uncommented.\n% (See below.)\n%       \"--debug-closure\",\n%       \"\\tOutput detailed debugging traces of the closure analysis.\"\n        \"--debug-trail-usage\",\n        \"\\tOutput detailed debugging traces of the `--analyse-trail-usage'\",\n        \"\\toption.\",\n        \"--debug-intermodule-analysis\",\n        \"\\tOutput detailed debugging traces of the `--intermodule-analysis'\",\n        \"\\toption.\",\n        \"--debug-indirect-reuse\",\n        \"\\tOutput detailed debugging traces of the indirect reuse pass of\",\n        \"\\t`--structure-reuse' option.\",\n        \"--debug-type-rep\",\n        \"\\tOutput debugging traces of type representation choices.\"\n% The mode constraints code is still experimental so this option is\n% currently commented out.\n%         \"--debug-mode-constraints\",\n%         \"\\tOutput detailed debugging traces of the `--prop-mode-constraints'\",\n%         \"\\toption.\"\n    ]).\n\n:- pred options_help_output(io::di, io::uo) is det.\n\noptions_help_output -->\n    io.write_string(\"\\nOutput Options:\\n\"),\n    write_tabbed_lines([\n        \"These options are mutually exclusive.\",\n        \"Only the first one specified will apply.\",\n        \"If none of these options are specified, the default action\",\n        \"is to link the named modules to produce an executable.\\n\",\n        \"-f, --generate-source-file-mapping\",\n        \"\\tOutput the module name to file name mapping for the list\",\n        \"\\tof source files given as non-option arguments to mmc\",\n        \"\\tto `Mercury.modules'. This must be done before\",\n        \"\\t`mmc --generate-dependencies' if there are any modules\",\n        \"\\tfor which the file name does not match the module name.\",\n        \"\\tIf there are no such modules the mapping need not be\",\n        \"\\tgenerated.\",\n        \"-M, --generate-dependencies\",\n        \"\\tOutput `Make'-style dependencies for the module\",\n        \"\\tand all of its dependencies to `<module>.dep'.\",\n        \"--generate-dependency-file\",\n        \"\\tOutput `Make'-style dependencies for the module\",\n        \"\\tto `<module>.d'.\",\n        \"--generate-module-order\",\n        \"\\tOutput the strongly connected components of the module\",\n        \"\\tdependency graph in top-down order to `<module>.order'.\",\n        \"\\tImplies --generate-dependencies.\",\n        \"--generate-standalone-interface <basename>\",\n        \"\\tOutput a stand-alone interface.\",\n        \"\\t<basename> is used as the basename of any files generated for\",\n        \"\\tthe stand-alone interface.  (See the Stand-alone Interface\",\n        \"\\tchapter of the Mercury User's Guide for further details.)\",\n        \"-i, --make-int, --make-interface\",\n        \"\\tWrite the module interface to `<module>.int',\",\n        \"\\tand write the short interface to `<module>.int2'\",\n        \"\\tThis option should only be used by mmake.\",\n        \"--make-priv-int, --make-private-interface\",\n        \"\\tWrite the private interface to `<module>.int0'.\",\n        \"\\tThis option should only be used by mmake.\",\n        \"--make-short-int, --make-short-interface\",\n        \"\\tWrite the unqualified short interface to `<module>.int3'.\",\n        \"\\tThis option should only be used by mmake.\",\n        \"--make-opt-int, --make-optimization-interface\",\n        \"\\tWrite inter-module optimization information to\",\n        \"\\t`<module>.opt'.\",\n        \"\\tThis option should only be used by mmake.\",\n        \"--make-trans-opt\",\n        \"--make-transitive-optimization-interface\",\n        \"\\tOutput transitive optimization information\",\n        \"\\tinto the `<module>.trans_opt' file.\",\n        \"\\tThis option should only be used by mmake.\",\n        \"-x,--make-xml-doc,--make-xml-documentation\",\n        \"\\tOutput XML documentation of the module\",\n        \"\\tinto the `<module>.xml' file.\",\n        \"\\tThis option should only be used by mmake.\",\n        \"-P, --convert-to-mercury\",\n        \"\\tConvert to Mercury. Output to file `<module>.ugly'\",\n        \"\\tThis option acts as a Mercury ugly-printer.\",\n        \"-t, --typecheck-only\",\n        \"\\tJust check that the code is syntactically correct and\",\n        \"\\ttype-correct. Don't check modes or determinism,\",\n        \"\\tand don't generate any code.\",\n        \"-e, --errorcheck-only\",\n        \"\\tCheck the module for errors, but do not generate any code.\",\n        \"-C, --target-code-only\",\n        \"\\tGenerate target code (i.e. C code in `<module>.c',\",\n        \"\\tIL code in `<module>.il', or Java code in\",\n        \"\\t`<module>.java'), but not object code.\",\n        \"-c, --compile-only\",\n        \"\\tGenerate C code in `<module>.c' and object code in `<module>.o'\",\n        \"\\tbut do not attempt to link the named modules.\",\n        % --compile-to-shared-lib is intended only for use\n        % by the debugger's interactive query facility,\n        % so it isn't documented.\n        \"--output-grade-string\",\n        \"\\tCompute the grade of the library to link with based on\",\n        \"\\tthe command line options, and print it to the standard\",\n        \"\\toutput.\",\n        \"--output-link-command\",\n        \"\\tPrint the command used to link executables to the\",\n        \"\\tstandard output.\",\n        \"--output-shared-lib-link-command\",\n        \"\\tPrint the command used to link shared libraries to the\",\n        \"\\tstandard output.\",\n        \"--output-libgrades\",\n        \"\\tPrint the list of compilation grades in which a library\",\n        \"\\tto be installed should be built to the standard output.\",\n        \"--output-cc\",\n        \"\\tPrint the command used to invoke the C compiler to the\",\n        \"\\tstandard output.\",\n        \"--output-cc-type, --output-c-compiler-type\",\n        \"\\tPrint the C compiler type to the standard output.\",\n        \"--output-cflags\",\n        \"\\tPrint the flags with which the C compiler will be invoked\",\n        \"\\tto the standard output.\",\n        \"--output-csharp-compiler-type\",\n        \"\\tPrint the C# compiler type to the standard output.\",\n        \"--output-library-link-flags\",\n        \"\\tPrint the flags that are passed to linker in order to link\",\n        \"\\tagainst the current set of libraries.  This includes the\",\n        \"\\tstandard library as well as any other libraries specified\",\n        \"\\tvia the --ml option.  The flags are printed to the standard\",\n        \"\\toutput.\",\n        \"--output-grade-defines\",\n        \"\\tPrint the flags that are passed to the C compiler to define the\",\n        \"\\tmacros used to specify the compilation grade.\",\n        \"\\tThe flags are printed to the standard output.\",\n        \"--output-c-include-dir-flags, --output-c-include-directory-flags\", \n        \"\\tPrint the flags that are passed to the C compiler to specify\",\n        \"\\twhich directories to search for C header files.\",\n        \"\\tThis includes the C header files from the standard library.\",\n        \"\\tThe flags are printed to the standard output.\"\n    ]).\n        \n:- pred options_help_aux_output(io::di, io::uo) is det.\n\noptions_help_aux_output -->\n    io.write_string(\"\\nAuxiliary Output Options:\\n\"),\n    write_tabbed_lines([\n        \"--smart-recompilation\",\n        \"\\tWhen compiling, write program dependency information\",\n        \"\\tto be used to avoid unnecessary recompilations if an\",\n        \"\\timported module's interface changes in a way which does\",\n        \"\\tnot invalidate the compiled code. `--smart-recompilation'\",\n        \"\\tdoes not yet work with `--intermodule-optimization'.\",\n        \"--no-assume-gmake\",\n        \"\\tWhen generating `.dep' files, generate Makefile\",\n        \"\\tfragments that use only the features of standard make;\",\n        \"\\tdo not assume the availability of GNU Make extensions.\",\n        \"\\tWhen generating `.dep' files, generate dependencies\",\n        \"\\tfor use by `mmc --make' in addition to the dependencies\",\n        \"\\tused by mmake.\",\n        \"--generate-mmc-deps\",\n        \"--generate-mmc-make-module-dependencies\",\n        \"\\tGenerate dependencies for use by `mmc --make' even\",\n        \"\\twhen using Mmake. This is recommended when building a\",\n        \"\\tlibrary for installation.\",\n\n% XXX The source-to-source debugging transform is not ready for public\n% consumption.\n        %\"--link-ssdebug-libs\",\n        %\"--link-ssdb-libs\",\n        %\"\\tLink the source to source debugging libraries into the\",\n        %\"\\tthe executable.\",\n        %\"--ss-trace {none, shallow, deep}\",\n        %\"\\tThe trace level to use for source to source debugging of\",\n        %\"\\tthe given module.\",\n\n% \"--trace decl\" is not documented, because it is for backwards\n% compatibility only.  It is now equivalent to `--trace rep'.\n%       \"--trace {minimum, shallow, deep, decl, rep, default}\",\n        \"--trace {minimum, shallow, deep, rep, default}\",\n        \"\\tGenerate code that includes the specified level\",\n        \"\\tof execution tracing.\",\n        \"\\tSee the Debugging chapter of the Mercury User's Guide\",\n        \"\\tfor details.\",\n        \"--exec-trace-tail-rec\",\n        \"\\tGenerate TAIL events for self-tail-recursive calls instead of\",\n        \"\\tEXIT events. This allows these recursive calls to reuse\",\n        \"\\ttheir parent call's stack frame, but it also means that\",\n        \"\\tthe debugger won't have access to the contents of the reused\",\n        \"\\tstack frames\",\n%       \"--suppress-trace <suppress-items>,\",\n%       \"\\tSuppress the named aspects of the execution tracing system.\",\n%       This is a developer-only option:\n%       \"--force-disable-trace\",\n%       \"\\tForce tracing to be set to trace level none.\",\n%       \"\\tThis overrides all other tracing/grade options.\",\n%       \"\\tIts main use is to turn off tracing in the browser\",\n%       \"\\tdirectory, even for .debug and .decldebug grades.\",\n        \"--trace-optimized\",\n        \"\\tDo not disable optimizations that can change the trace.\",\n% \"--trace-prof\" is not documented because if is only intended for developers\n% of the deep profiler.\n%       \"--trace-prof\"\",\n%       \"\\tEnable tracing of deep profiling service predicates.\",\n% I/O tabling is deliberately not documented. It is mean to be switched on,\n% with consistent parameters, in debugging grades, and to be consistently\n% switched off in non-debugging grades. Inconsistent use of the options\n% governing I/O tabling can yield core dumps from the debugger, so these\n% options are for implementors only.\n%       \"--trace-table-io\",\n%       \"\\tEnable the tabling of I/O actions, to allow the debugger\",\n%       \"\\tto execute retry commands across I/O actions.\",\n%       \"--trace-table-io-only-retry\",\n%       \"\\tSet up I/O tabling to support only retries across I/O\",\n%       \"\\tactions, not the printing of actions or declarative\",\n%       \"\\tdebugging. This reduces the size of the I/O action table.\",\n%       \"--trace-table-io-states\",\n%       \"\\tWhen tabling I/O actions, table the io.state arguments\",\n%       \"\\ttogether with the others. This should be required iff\",\n%       \"\\tvalues of type io.state actually contain information.\",\n%       \"--trace-table-io-require\",\n%       \"\\tRequire the tabling of I/O actions, i.e. generate an error\",\n%       \"\\tif an I/O primitive does not have the tabled_for_io\",\n%       \"\\tannotation.\",\n%       \"--trace-table-io-all\",\n%       \"\\tTable all I/O actions even in the absence of annotations.\",\n%       \"\\tIf a primitive has no annotation specifying the type of\",\n%       \"\\ttabling required, deduce it from the values of the other\",\n%       \"\\tannotations.\",\n        \"--trace-flag <keyword>\",\n        \"\\tEnable the trace goals that depend on the <keyword> trace flag.\",\n        \"--profile-optimized\",\n        \"\\tDo not disable optimizations that can distort deep profiles.\",\n        \"--no-delay-death\",\n        \"\\tWhen the trace level is `deep', the compiler normally\",\n        \"\\tpreserves the values of variables as long as possible, even\",\n        \"\\tbeyond the point of their last use, in order to make them\",\n        \"\\taccessible from as many debugger events as possible.\",\n        \"\\tHowever, it will not do this if this option is given.\",\n        \"--delay-death-max-vars <N>\",\n        \"\\tDelay the deaths of variables only when the number of variables\",\n        \"\\tin the procedure is no more than N. The default value is 1000.\",\n        \"--stack-trace-higher-order\",\n        \"\\tEnable stack traces through predicates and functions with\",\n        \"\\thigher-order arguments, even if stack tracing is not\",\n        \"\\tsupported in general.\",\n%       This is a developer-only option:\n%       \"--force-disable-ssdebug\",\n%       \"\\tDisable ssdebug transformation even in ssdebug grades.\",\n%       \"--tabling-via-extra-args\",\n%       \"\\tGenerate output via extra_args in foreign_procs.\",\n%       \"--allow-table-reset\",\n%       \"\\tGenerate C code for resetting tabling data structures.\",\n        \"--generate-bytecode\",\n        \"\\tOutput a bytecode form of the module for use\",\n        \"\\tby an experimental debugger.\",\n        \"-n-, --no-line-numbers\",\n        \"\\tDo not put source line numbers in the generated code.\",\n        \"\\tThe generated code may be in C (the usual case),\",\n        \"\\tor in Mercury (with the option --convert-to-mercury).\",\n        \"--auto-comments\",\n        \"\\tOutput comments in the `<module>.c' file.\",\n% This option is for developers only. Since it can include one C comment inside\n% another, the resulting code is not guaranteed to be valid C.\n%       \"--frameopt-comments\",\n%       \"\\tGet frameopt.m to generate comments describing its operation.\",\n        \"\\t(The code may be easier to understand if you also\",\n        \"\\tuse the `--no-llds-optimize' option.)\",\n        \"--max-error-line-width <n>\",\n        \"\\tSet the maximum width of an error message line to <n> characters\",\n        \"\\t(unless a long single word forces the line over this limit).\",\n        \"--show-dependency-graph\",\n        \"\\tWrite out the dependency graph to `<module>.dependency_graph'.\",\n        \"--imports-graph\",\n        \"\\tWrite out the imports graph to `<module>.imports_graph'.\",\n        \"\\tThe imports graph contains the directed graph module A\",\n        \"\\timports module B.\",\n        \"\\tThe resulting file can be processed by the graphviz tools.\",\n% This option is for developers only.\n%       \"--dump-trace-counts <stage number or name>\",\n%       \"\\tIf the compiler was compiled with debugging enabled and is being\",\n%       \"\\trun with trace counting enabled, write out the trace counts file\",\n%       \"\\tafter the specified stage to `<module>.trace_counts.<num>-<name>'.\",\n%       \"\\tStage numbers range from 1-599.\",\n%       \"\\tMultiple dump options accumulate.\",\n        \"-d <n>, --dump-hlds <stage number or name>\",\n        \"\\tDump the HLDS (high level intermediate representation) after\",\n        \"\\tthe specified stage to `<module>.hlds_dump.<num>-<name>'.\",\n        \"\\tStage numbers range from 1-599.\",\n        \"\\tMultiple dump options accumulate.\",\n        \"--dump-hlds-pred-id <n>\",\n        \"\\tDump the HLDS only of the predicate/function with the given\",\n        \"\\tpred id.\",\n        \"--dump-hlds-pred-name <name>\",\n        \"\\tDump the HLDS only of the predicate/function with the given\",\n        \"\\tname.\",\n% This option is for developers only.\n%       \"-D, --dump-hlds-alias <dump-alias>\",\n%       \"\\tWith `--dump-hlds', include extra detail in the dump.\",\n%       \"\\tEach dump alias is shorthand for a set of option letters.\",\n%       \"\\tThe list of aliases is in handle_options.m\",\n        \"--dump-hlds-options <options>\",\n        \"\\tWith `--dump-hlds', include extra detail in the dump.\",\n        \"\\tEach type of detail is included in the dump if its\",\n        \"\\tcorresponding letter occurs in the option argument\",\n        \"\\t(see the Mercury User's Guide for details).\",\n        \"--dump-hlds-inst-limit <N>\",\n        \"\\tDump at most N insts in each inst table.\",\n        \"--dump-hlds-file-suffix <suffix>\",\n        \"\\tAppend the given suffix to the names of the files created by\",\n        \"\\tthe `--dump-hlds' option.\",\n        \"--dump-same-hlds\",\n        \"\\tCreate a file for a HLDS stage even if the file notes only that\",\n        \"\\tthis stage is identical to the previously dumped HLDS stage.\",\n        \"--dump-mlds <stage number or name>\",\n        \"\\tDump the MLDS (medium level intermediate representation)\",\n        \"\\tafter the specified stage, as C code,\",\n        \"\\tto`<module>.c_dump.<num>-<name>',\",\n        \"\\tand `<module>.h_dump.<num>-<name>'.\",\n        \"\\tStage numbers range from 1-99.\",\n        \"\\tMultiple dump options accumulate.\",\n        \"--verbose-dump-mlds <stage number or name>\",\n        \"\\tDump the internal compiler representation of the MLDS, after\",\n        \"\\tthe specified stage, to `<module>.mlds_dump.<num>-<name>'.\"\n% The mode constraints code is still experimental so these options are\n% currently commented out.\n%       \"--mode-constraints\"\n%       \"\\tRun constraint based mode analysis. The default is to\",\n%       \"\\tuse the robdd solution using the full (subtyping)\",\n%       \"\\tconstraints and dump results.\",\n%       \"--simple-mode-constraints\",\n%       \"\\tUse only the simplified constraint system when running\",\n%       \"\\tthe robdd solver constraints based mode analysis.\",\n%       \"--prop-mode-constraints\",\n%       \"\\tUse the new propagation solver for constraints based\",\n%       \"\\tmode analysis.\",\n% IL options are commented out to reduce confusion.\n%       \"--sign-assembly\",\n%       \"\\tSign the current assembly with the Mercury strong name.\",\n%       \"\\tTo use assemblies created with this command all the Mercury\",\n%       \"\\tmodules must be compiled with this option enabled.\",\n%       \"\\tThis option is specific to the IL backend, and is likely\",\n%       \"\\tto be deprecated at a later date.\"\n\n        /* XXX currently broken.\n        \"--separate-assemblies\",\n        \"\\tPlace sub-modules in separate assemblies.\",\n        \"\\tThis option is specific to the IL backend.\"\n        */\n    ]).\n\n:- pred options_help_semantics(io::di, io::uo) is det.\n\noptions_help_semantics -->\n    io.write_string(\"\\nLanguage semantics options:\\n\"),\n    io.write_string(\"(See the Mercury language reference manual for detailed explanations.)\\n\"),\n    write_tabbed_lines([\n        \"--no-reorder-conj\",\n        \"\\tExecute conjunctions left-to-right except where the modes imply\",\n        \"\\tthat reordering is unavoidable.\",\n        \"--no-reorder-disj\",\n        \"\\tExecute disjunctions strictly left-to-right.\",\n        \"--no-fully-strict\",\n        \"\\tAllow infinite loops or goals with determinism erroneous to be\",\n        \"\\toptimised away.\",\n        \"--allow-stubs\",\n        \"\\tAllow procedures to have no clauses.  Any calls to\",\n        \"\\tsuch procedures will raise an exception at run-time.\",\n        \"\\tThis option is sometimes useful during program development.\",\n        \"\\t(See also the documentation for the `--warn-stubs' option\",\n        \"\\tin the \"\"Warning Options\"\" section.)\",\n        \"--infer-all\",\n        \"\\tAbbreviation for `--infer-types --infer-modes --infer-det'.\",\n        \"--infer-types\",\n        \"\\tIf there is no type declaration for a predicate or function,\",\n        \"\\ttry to infer the type, rather than just reporting an error.\",\n        \"--infer-modes\",\n        \"\\tIf there is no mode declaration for a predicate,\",\n        \"\\ttry to infer the modes, rather than just reporting an error.\",\n\n        \"--no-infer-det, --no-infer-determinism\",\n        \"\\tIf there is no determinism declaration for a procedure,\",\n        \"\\tdon't try to infer the determinism, just report an error.\",\n        \"--type-inference-iteration-limit <n>\",\n        \"\\tPerform at most <n> passes of type inference (default: 60).\",\n        \"--mode-inference-iteration-limit <n>\",\n        \"\\tPerform at most <n> passes of mode inference (default: 30).\",\n        \"--event-set-file-name <filename>\",\n        \"\\tGet the specification of user-defined events from <filename>.\"\n    ]).\n\n\n:- pred options_help_ctgc(io::di, io::uo) is det.\n\noptions_help_ctgc -->\n    io.write_string(\"\\nCompile Time Garbage Collection Options:\\n\"),\n    write_tabbed_lines([\n        \"--structure-sharing\",\n        \"\\tPerform structure sharing analysis.\",\n        \"--structure-sharing-widening <n>\",\n        \"\\tPerform widening when the set of structure sharing pairs becomes\",\n        \"\\tlarger than <n>. When n=0, widening is not enabled.\",\n        \"\\t(default: 0).\",\n        \"--structure-reuse, --ctgc\",\n        \"\\tPerform structure reuse analysis (Compile Time Garbage \",\n        \"\\tCollection).\",\n        \"--structure-reuse-constraint {same_cons_id, \",\n        \"\\twithin_n_cells_difference}, --ctgc-constraint {same_cons_id,\",\n        \"\\twithin_n_cells_difference}\",\n        \"\\tConstraint on the way we allow structure reuse. `same_cons_id'\",\n        \"\\tspecifies that reuse is only allowed between terms of the same\",\n        \"\\ttype and constructor. `within_n_cells_difference' states that\",\n        \"\\treuse is allowed as long as the arities between the reused term\",\n        \"\\tand new term does not exceed a certain threshold. The threshold \",\n        \"\\tneeds to be set using `--structure-reuse-constraint-arg'.\",\n        \"\\t(default: within_n_cells_difference, with threshold 0)\",\n        \"--structure-reuse-constraint-arg, --ctgc-constraint-arg\",\n        \"\\tSpecify the maximum difference in arities between the terms that\",\n        \"\\tcan be reused, and the terms that reuse these terms.\",\n        \"\\t(default: 0)\"\n\n% This option is for developers only.\n%       \"--structure-reuse-max-conditions\",\n%       \"\\tSoft limit on the number of reuse conditions to accumulate\",\n%       \"\\tfor a procedure. (default: 10)\"\n\n% This option is likely to break many optimisations which haven't been updated.\n%       \"--structure-reuse-free-cells\",\n%       \"\\tImmediately free cells which are known to be dead but which\",\n%       \"\\tcannot be reused.\"\n    ]).\n\n:- pred options_help_termination(io::di, io::uo) is det.\n\noptions_help_termination -->\n    io.write_string(\"\\nTermination Analysis Options:\\n\"),\n    write_tabbed_lines([\n        \"--enable-term, --enable-termination\",\n        \"\\tAnalyse each predicate to discover if it terminates.\",\n        \"--chk-term, --check-term, --check-termination\",\n        \"\\tEnable termination analysis, and emit warnings for some\",\n        \"\\tpredicates or functions that cannot be proved to terminate.\",\n        \"\\tIn many cases where the compiler is unable to prove termination\",\n        \"\\tthe problem is either a lack of information about the\",\n        \"\\ttermination properties of other predicates, or because language\",\n        \"\\tconstructs (such as higher order calls) were used which could\",\n        \"\\tnot be analysed.  In these cases the compiler does not emit a\",\n        \"\\twarning of non-termination, as it is likely to be spurious.\",\n        \"--verb-chk-term, --verb-check-term, --verbose-check-termination\",\n        \"\\tEnable termination analysis, and emit warnings for all\",\n        \"\\tpredicates or functions that cannot be proved to terminate.\",\n        \"--term-single-arg <n>, --termination-single-argument-analysis <n>\",\n        \"\\tWhen performing termination analysis, try analyzing\",\n        \"\\trecursion on single arguments in strongly connected\",\n        \"\\tcomponents of the call graph that have up to <n> procedures.\",\n        \"\\tSetting this limit to zero disables single argument analysis.\",\n        \"--termination-norm {simple, total, num-data-elems}\",\n        \"\\tThe norm defines how termination analysis measures the size\",\n        \"\\tof a memory cell. The `simple' norm says that size is always\",\n        \"\\tone.  The `total' norm says that it is the number of words\",\n        \"\\tin the cell.  The `num-data-elems' norm says that it is the\",\n        \"\\tnumber of words in the cell that contain something other\",\n        \"\\tthan pointers to cells of the same type.\",\n        \"--term-err-limit <n>, --termination-error-limit <n>\",\n        \"\\tPrint at most <n> reasons for any single termination error\",\n        \"\\t(default: 3).\",\n        \"--term-path-limit <n>, --termination-path-limit <n>\",\n        \"\\tPerform termination analysis only on predicates\",\n        \"\\twith at most <n> paths (default: 256).\"\n\n% The following options are used to control the new termination analyser.\n% They are currently disabled because that is still a work-in-progress.\n%\n%       \"--enable-term2, --enable-termination2\",\n%       \"\\tAnalyse each predicate to discover if it terminates. \",\n%       \"\\tThis uses an alternative termination analysis based\",\n%       \"\\ton convex constraints.\",\n%       \"--chk-term2, --check-termination2\",\n%       \"\\tEnable the alternative termination analysis, and emit warnings for\",\n%       \"\\tsome predicates or functions that cannot be proved to terminate.  In\",\n%       \"\\tmany cases where the compiler is unable to prove termination\",\n%       \"\\tthe problem is either a lack of information about the\",\n%       \"\\ttermination properties of other predicates, or because language\",\n%       \"\\tconstructs (such as higher order calls) were used which could\",\n%       \"\\tnot be analysed.  In these cases the compiler does not emit a\",\n%       \"\\twarning of non-termination, as it is likely to be spurious.\",\n%       \"--verb-chk-term2, --verb-check-term2, --verbose-check-termination2\",\n%       \"--termination2-norm {simple, total, num-data-elems}\",\n%       \"\\tTell the alternative termination analyser which norm to use.\",\n%       \"\\tSee the description of the `--termination-norm' option for a\",\n%       \"\\tdescription of the different types of norm available.\"\n%       \"--term2-widening-limit <n>, --termination2-widening-limit <n>\",\n%       \"\\tSet the threshold for the number of iterations after which the\",\n%       \"\\targument size analyser invokes widening.\",\n%       \"--term2-propagate-failure-constrs, --termination2-propagate-failure-constraints\",\n%       \"\\tMake the argument analyser infer information about the sizes of any\"\n%       \"\\tinputs to a goal in contexts where that goal fails.\"\n%       \"--term2-max-matrix-size <n>, --termination2-maximum-matrix-size <n>\",\n%       \"\\tLimit the sizes of constraints systems in the analyser to <n>\",\n%       \"\\tconstraints.  Use approximations of some constraint operations,\",\n%       \"\\tsuch as projection, if this threshold is exceeded.  This will\",\n%       \"\\tspeed up the analysis at the cost of reduced precision.\",\n\n% This option is for developers only.\n% It is useful for benchmarking the argument size analysis.\n%       \"--term2-argument-size-analysis-only, --term2-arg-size-analysis-only\",\n%       \"\\tPerform argument size analysis on each SCC but do not\",\n%       \"\\tattempt to infer termination,\"\n    ]).\n\n:- pred options_help_compilation_model(io::di, io::uo) is det.\n\noptions_help_compilation_model -->\n    io.write_string(\"\\nCompilation model options:\\n\"),\n    write_tabbed_lines([\n        \"The following compilation options affect the generated\",\n        \"code in such a way that the entire program must be\",\n        \"compiled with the same setting of these options,\",\n        \"and it must be linked to a version of the Mercury\",\n        \"library which has been compiled with the same setting.\",\n        \"\",\n        \"-s <grade>, --grade <grade>\",\n        \"\\tSelect the compilation model. The <grade> should be one of\",\n        \"\\tthe base grades `none', `reg', `jump', `asm_jump', `fast', \",\n        \"\\t`asm_fast', `hl', `hlc', `il', or `java',\",\n% The hl, hl_nest, and hlc_nest are not yet documented, because\n% the --high-level-data option is not yet supported for C,\n% and the --gcc-nested-functions option is not yet documented.\n% The ilc grade is not documented because it is not useful;\n% it has been superceded by the il grade.\n        \"\\tor one of those with one or more of the grade modifiers\",\n        \"\\t`.gc', `.mps', `.prof', `.memprof', `.profdeep', `.tr',\",\n        \"\\t`.spf', `.stseg', `.debug', `.par' and/or `.pic_reg' appended.\",\n        \"\\tDepending on your particular installation, only a subset\",\n        \"\\tof these possible grades will have been installed.\",\n        \"\\tAttempting to use a grade which has not been installed\",\n        \"\\twill result in an error at link time.\"\n    ]),\n\n    io.write_string(\"\\n    Target selection compilation model options:\\n\"),\n    write_tabbed_lines([\n        \"--target c\\t\\t\\t(grades: none, reg, jump, fast,\",\n        \"\\t\\t\\t\\t\\tasm_jump, asm_fast, hl, hlc)\",\n        \"--target il\\t\\t\\t(grades: il)\",\n        \"--target csharp\\t\\t\\t(grades: csharp)\",\n        \"--target java\\t\\t\\t(grades: java)\",\n        \"--target erlang\\t\\t\\t(grades: erlang)\",\n        \"\\tSpecify the target language: C, IL, C#, Java or Erlang.\",\n        \"\\tThe default is C.  \"\"IL\"\" (also known as \"\"CIL\"\" or \"\"MSIL\"\")\",\n        \"\\tis the Intermediate Language for the .NET Common Language\",\n        \"\\tRuntime.\",\n        \"\\tTargets other than C imply `--high-level-code' (see below).\",\n\n% IL options are commented out to reduce confusion.\n%       \"--il\",\n%       \"\\tAn abbreviation for `--target il'.\",\n%       \"--il-only\",\n%       \"\\tAn abbreviation for `--target il --target-code-only'.\",\n%       \"\\tGenerate IL code in `<module>.il', but do not generate\",\n%       \"\\tobject code.\",\n%\n%       \"--dotnet-library-version <version-number>\",\n%       \"\\tThe version number for the mscorlib assembly distributed\",\n%       \"\\twith the Microsoft .NET SDK.\",\n%\n%       \"--no-support-ms-clr\",\n%       \"\\tDon't use MS CLR specific workarounds in the generated code.\",\n%\n%       \"--support-rotor-clr\",\n%       \"\\tUse specific workarounds for the ROTOR CLR in the generated\",\n%       \"\\tcode.\",\n\n        \"--csharp\",\n        \"\\tAn abbreviation for `--target csharp'.\",\n        \"--csharp-only\",\n        \"\\tAn abbreviation for `--target csharp --target-code-only'.\",\n        \"\\tGenerate C# code in `<module>.cs', but do not generate\",\n        \"\\tobject code.\",\n\n        \"--java\",\n        \"\\tAn abbreviation for `--target java'.\",\n        \"--java-only\",\n        \"\\tAn abbreviation for `--target java --target-code-only'.\",\n        \"\\tGenerate Java code in `<module>.java', but do not generate\",\n        \"\\tobject code.\",\n\n        \"--erlang\",\n        \"\\tAn abbreviation for `--target erlang'.\",\n        \"--erlang-only\",\n        \"\\tAn abbreviation for `--target erlang --target-code-only'.\",\n        \"\\tGenerate Erlang code in `<module>.erl', but do not generate\",\n        \"\\tobject code.\",\n\n        \"--compile-to-c\",\n        \"\\tAn abbreviation for `--target c --target-code-only'.\",\n        \"\\tGenerate C code in `<module>.c', but do not generate object\",\n        \"\\tcode.\"\n    ]),\n\n    io.write_string(\"\\n    Optional feature compilation model options:\\n\"),\n    io.write_string(\"      Debugging\\n\"),\n    write_tabbed_lines([\n        \"--debug\\t\\t\\t\\t(grade modifier: `.debug')\",\n        \"\\tEnable Mercury-level debugging.\",\n        \"\\tSee the Debugging chapter of the Mercury User's Guide\",\n        \"\\tfor details.\",\n        \"\\tThis option is not yet supported for the `--high-level-code'\",\n        \"\\tback-ends.\",\n        \"--decl-debug\\t\\t\\t\\t(grade modifier: `.decldebug')\",\n        \"\\tEnable full support for declarative debugging.\",\n        \"\\tThis allows subterm dependency tracking in the declarative\",\n        \"\\tdebugger.\",\n        \"\\tSee the Debugging chapter of the Mercury User's Guide\",\n        \"\\tfor details.\",\n        \"\\tThis option is not yet supported for the `--high-level-code'\",\n        \"\\tback-ends.\"\n% XXX The source-to-source debugging transform is not ready for public\n% consumption.\n%       \"--ss-debug\\t\\t\\t\\t(grade modifier: `.ssdebug')\",\n%       \"\\tEnable the source-to-source debugging transform.\"\n    ]),\n    io.write_string(\"      Profiling\\n\"),\n    write_tabbed_lines([\n        \"-p, --profiling, --time-profiling\",\n        \"\\t\\t\\t\\t(grade modifier: `.prof')\",\n        \"\\tEnable time and call profiling.  Insert profiling hooks in the\",\n        \"\\tgenerated code, and also output some profiling\",\n        \"\\tinformation (the static call graph) to the file\",\n        \"\\t`<module>.prof'.\",\n        \"\\tThis option is not supported for the IL, C# or Java back-ends.\",\n        \"--memory-profiling\\t\\t(grade modifier: `.memprof')\",\n        \"\\tEnable memory and call profiling.\",\n        \"\\tThis option is not supported for the IL, C# or Java back-ends.\",\n        \"--deep-profiling\\t\\t(grade modifier: `.profdeep')\",\n        \"\\tEnable deep profiling.\",\n        \"\\tThis option is not supported for the high-level C, IL, C#\",\n        \"\\tor Java back-ends.\",\n\n% This option is not documented, it is intended for use by developers only.\n%\n%       \"--pre-prof-transforms-simplify\",\n%       \"\\tForce the pre-profiling simplification pass that is usually\",\n%       \"\\tenabled when building a profiling version of a program.  This\",\n%       \"\\tallows a developer to enable this pass when using a\",\n%       \"\\tnon-profiling build.  It can be used to test that generated code\",\n%       \"\\tintroduced in earlier passes is well-formed before it is\",\n%       \"\\tpotentially removed by the dead procedure elimination pass later\",\n%       \"\\ton.\",\n%\n\n% XXX The following options are not documented,\n% because they are currently not useful.\n% The idea was for you to be able to use --profile-calls\n% and --profile-time separately, but that doesn't work\n% because compiling with --profile-time instead of\n% --profile-calls results in different code addresses,\n% so you can't combine the data from versions of\n% your program compiled with different options.\n%\n%       \"--profile-calls\\t\\t(grade modifier: `.profcalls')\",\n%       \"\\tSimilar to `--profiling', except that only gathers\",\n%       \"\\tcall counts, not timing information.\",\n%       \"\\tUseful on systems where time profiling is not supported,\",\n%       \"\\tbut not as useful as `--memory-profiling'.\",\n%       \"--profile-time\\t\\t(grade modifier: `.proftime')\",\n%       \"\\tSimilar to `--profiling', except that it only gathers\",\n%       \"\\ttiming information, not call counts.\",\n%       \"--profile-memory\\t\\t(grade modifier: `.profmem')\",\n%       \"\\tSimilar to `--memory-profiling', except that it only\",\n%       \"\\tgathers memory usage information, not call counts.\",\n\n        \"--no-coverage-profiling\",\n        \"\\tDisable coverage profiling.\",\n% The following options are for implementors only (intended for experiments).\n%       \"--coverage-profiling-via-calls\",\n%       \"\\tUse calls to implement coverage points, not inline foreign code.\",\n\n%       \"--coverage-profiling-static\",\n%       \"\\tDisable dynamic coverage profiling, this uses less memory and may \",\n%       \"\\tbe faster.\",\n\n%       \"Switches to effect coverage profiling (part of deep profiling). \",\n%       \"they enable different types of coverage points.\",\n\n%       \"--no-profile-deep-coverage-after-goal\",\n%       \"\\tDisable coverage points after goals.\",\n%       \"--no-profile-deep-coverage-branch-ite\",\n%       \"\\tDisable coverage points at the beginning of then and else\",\n%       \"\\tbranches.\",\n%       \"--no-profile-deep-coverage-branch-switch\",\n%       \"\\tDisable coverage points at the beginning of switch branches.\",\n%       \"--no-profile-deep-coverage-branch-disj\",\n%       \"\\tDisable coverage points at the beginning of disjunction branches.\",\n\n%       I beleive these options are broken - pbone.\n%       \"Switches to tune the coverage profiling pass, useful for \",\n%       \"debugging.\",\n%\n%       \"--no-profile-deep-coverage-use-portcounts\",\n%       \"\\tTurn off usage of port counts in the deep profiler to provide\",\n%       \"\\tsome coverage information.\",\n%       \"--no-profile-deep-coverage-use-trivial\",\n%       \"\\tTurn off usage of trivial goal information\",\n\n        \"--profile-for-feedback\",\n        \"\\tSelect deep profiling options suitable for profiler directed\",\n        \"\\timplicit parallelism.\",\n        \"\\t--profile-for-implicit-parallelism is a deprecated synonym for\",\n        \"\\tthis option\",\n\n        \"--record-term-sizes-as-words\\t\\t(grade modifier: `.tsw')\",\n        \"\\tAugment each heap cells with its size in words.\",\n        \"--record-term-sizes-as-cells\\t\\t(grade modifier: `.tsc')\",\n        \"\\tAugment each heap cells with its size in cells.\",\n\n        \"--experimental-complexity=<filename>\\t\\t\",\n        \"\\tEnable experimental complexity analysis for the predicates\",\n        \"\\tlisted in the given file.\",\n        \"\\tThis option is supported for the C back-end, with\",\n        \"\\t--no-highlevel-code.\",\n\n        \"--threadscope\\t\\t(grade modifier: `.threadscope')\",\n        \"\\tEnable support for profiling parallel execution.\",\n        \"\\tThis option is supported by the low-level C back-end parallel\",\n        \"\\tgrades on some processors, See README.ThreadScope for details.\"\n    ]),\n\n    io.write_string(\"      Miscellaneous optional features\\n\"),\n    write_tabbed_lines([\n        \"--gc {none, boehm, hgc, mps, accurate, automatic}\",\n        \"--garbage-collection {none, boehm, hgc, mps, accurate, automatic}\",\n        \"\\t\\t\\t\\t(`java', `csharp', `il' and `erlang'\",\n        \"\\t\\t\\t\\t\\tgrades use `--gc automatic',\",\n        \"\\t\\t\\t\\t`.gc' grades use `--gc boehm',\",\n        \"\\t\\t\\t\\t`.hgc' grades use `--gc hgc',\",\n        \"\\t\\t\\t\\t`.mps' grades use `--gc mps',\",\n        \"\\t\\t\\t\\tother grades use `--gc none'.)\",\n        \"\\tSpecify which method of garbage collection to use\",\n        \"\\t(default: boehm).\",\n        \"\\t`boehm' is Hans Boehm et al's conservative collector.\",\n        \"\\t`hgc' is our own conservative collector;\",\n        \"\\t`accurate' is our own type-accurate copying GC;\",\n        \"\\tit requires `--high-level-code'.\",\n        \"\\t`mps' is a different conservative collector, based on\",\n        \"\\tRavenbrook Limited's MPS (Memory Pool System) kit.\",\n        \"\\t`automatic' means the target language provides it.\",\n        \"\\tThis is the case for the IL, C#, Java and Erlang back-ends,\",\n        \"\\twhich always use the garbage collector of the underlying\",\n        \"\\timplementation.\",\n        \"--use-trail\\t\\t\\t(grade modifier: `.tr')\",\n        \"\\tEnable use of a trail.\",\n        \"\\tThis is necessary for interfacing with constraint solvers,\",\n        \"\\tor for backtrackable destructive update.\",\n        \"\\tThis option is not yet supported for the IL, C# or Java back-ends.\",\n        \"--trail-segments\\t\\t\\t(grade modifier: `.trseg')\",\n        \"\\tAs above, but use a dynamically sized trail that is composed\",\n        \"\\tof small segments.  This can help to avoid trail exhaustion\",\n        \"\\tat the cost of increased execution time.\",\n        \"--parallel\\t\\t(grade modifier: `.par')\",\n        \"\\tEnable parallel execution support for the low-level C grades.\",\n        \"\\tEnable concurrency (via pthreads) for the high-level C grades.\",\n        \"--maybe-thread-safe {yes, no}\",\n        \"\\tSpecify how to treat the `maybe_thread_safe' foreign code\",\n        \"\\tattribute.  `yes' means that a foreign procedure with the\",\n        \"\\t`maybe_thread_safe' option is treated as though it has a\",\n        \"\\t`thread_safe' attribute.  `no' means that the foreign\",\n        \"\\tprocedure is treated as though it has a `not_thread_safe'\",\n        \"\\tattribute.  The default is no.\",\n        \"--single-prec-float\\t\\t(grade modifier: `.spf')\",\n        \"\\tUse single precision floats so that, on 32-bit machines,\",\n        \"\\tfloating point values don't need to be boxed.  Double\",\n        \"\\tprecision floats are used by default.\"\n        % This is commented out as this feature is still experimental.\n        %\"--extend-stacks-when-needed\",\n        %\"\\tSpecify that code that increments a stack pointer must\",\n        %\"\\textend the stack when this is needed.\",\n        % RBMM is undocumented since it is still experimental.\n        % should also document rbmmd rbmmp rbmmdp\n        %\"--use-regions\\t\\t(grade modifier: `.rbmm')\",\n        %\"\\tEnable support for region-based memory managment.\"\n        %\"--use-alloc-regions\",\n        %\"\\tCompute and use the exact set of regions\",\n        %\"\\t that may be allocated into by a call.\"\n    ]),\n\n    io.write_string(\"\\n    LLDS back-end compilation model options:\\n\"),\n    write_tabbed_lines([\n\n        \"--gcc-global-registers\\t\\t(grades: reg, fast, asm_fast)\",\n        \"--no-gcc-global-registers\\t(grades: none, jump, asm_jump)\",\n        \"\\tSpecify whether or not to use GNU C's\",\n        \"\\tglobal register variables extension.\",\n        \"\\tThis option is ignored if the `--high-level-code' option is\",\n        \"\\tenabled.\",\n        \"--gcc-non-local-gotos\\t\\t(grades: jump, fast, asm_jump, asm_fast)\",\n        \"--no-gcc-non-local-gotos\\t(grades: none, reg)\",\n        \"\\tSpecify whether or not to use GNU C's\",\n        \"\\t\"\"labels as values\"\" extension.\",\n        \"\\tThis option is ignored if the `--high-level-code' option is\",\n        \"\\tenabled.\",\n        \"--asm-labels\\t\\t\\t(grades: asm_jump, asm_fast)\",\n        \"--no-asm-labels\\t\\t\\t(grades: none, reg, jump, fast)\",\n        \"\\tSpecify whether or not to use GNU C's\",\n        \"\\tasm extensions for inline assembler labels.\",\n        \"\\tThis option is ignored if the `--high-level-code' option is\",\n        \"\\tenabled.\",\n        \"--pic-reg\\t\\t\\t(grade modifier: `.pic_reg')\",\n        \"[For Unix with intel x86 architecture only]\",\n        \"\\tSelect a register usage convention that is compatible,\",\n        \"\\twith position-independent code (gcc's `-fpic' option).\",\n        \"\\tThis is necessary when using shared libraries on Intel x86\",\n        \"\\tsystems running Unix.  On other systems it has no effect.\",\n        \"--stack-segments\\t\\t(grade modifier: `.stseg')\",\n        \"\\tSpecify whether to use dynamically sized stacks that are\",\n        \"\\tcomposed of small segments.  This can help to avoid stack\",\n        \"\\texhaustion at the cost of increased execution time.\",\n        \"\\tThis option is ignored if the `--high-level-code' option is\",\n        \"\\tenabled.\"\n        % This is a developer only option.\n%       \"--use-float-registers\",\n%       \"(This option is not for general use.)\",\n%       \"\\tUse float registers for argument passing.\"\n    ]),\n\n    io.write_string(\"\\n    MLDS back-end compilation model options:\\n\"),\n    write_tabbed_lines([\n% These grades (hl_nest, and hlc_nest) are not yet documented,\n% because the --gcc-nested-functions option is not yet documented.\n%       \"-H, --high-level-code\\t\\t\\t(grades: hl_nest, hlc_nest)\",\n% The ilc grade is not documented because it is not useful;\n% it has been superceded by the il grade.\n        \"-H, --high-level-code\\t\\t\\t(grades: hl, hlc, il, csharp, java)\",\n        \"\\tUse an alternative back-end that generates high-level code\",\n        \"\\trather than the very low-level code that is generated by our\",\n        \"\\toriginal back-end.\",\n% The hl_nest grade is not yet documented,\n% because the --gcc-nested-functions option is not yet documented.\n% because it is not yet supported\n%       \"--high-level-data\\t\\t\\t(grades: hl, hl_nest, il, csharp, java)\",\n        \"--high-level-data\\t\\t\\t(grades: hl, il, csharp, java)\",\n        \"\\tUse an alternative higher-level data representation.\",\n%       \"--high-level\\t\\t\\t(grades: hl, hl_nest, il, csharp, java)\",\n        \"--high-level\\t\\t\\t(grades: hl, il, csharp, java)\",\n        \"\\tAn abbreviation for `--high-level-code --high-level-data'.\"\n% The --gcc-nested-functions option is not yet documented,\n% because it doesn't pass our test suite, and it is\n% probably not very useful.\n%       \"--gcc-nested-functions\\t\\t(grades: hl_nest, hlc_nest)\",\n%       \"\\tSpecify whether or not to use GNU C's nested functions extension.\",\n%       \"\\tThis option is ignored if the `--high-level-code' option is not enabled.\",\n% The --det-copy-out option is not yet documented,\n% because it is not yet tested much and probably not very useful,\n% except for Java, where it is the default.\n%       \"--det-copy-out\",\n%       \"\\tSpecify whether to handle output arguments for det/semidet\",\n%       \"\\tprocedures using return-by-value rather than pass-by-reference.\",\n%       \"\\tThis option is ignored if the `--high-level-code' option is not enabled.\",\n% The --nondet-copy-out option is not yet documented,\n% because it is probably not very useful except for IL and Java,\n% where it is the default.\n%       \"--nondet-copy-out\\t\\t(grades: il, ilc)\",\n%       \"\\tSpecify whether to handle output arguments for nondet\",\n%       \"\\tprocedures using pass-by-value rather than pass-by-reference.\",\n%       \"\\tThis option is ignored if the `--high-level-code' option is not enabled.\",\n% The --put-commit-in-own-func option is not documented because\n% it is enabled automatically (by handle_options) in the situations\n% where it is needed; the user should never need to set it.\n%       \"--put-commit-in-own-func\",\n%       \"\\tPut each commit in its own C function.\",\n%       \"\\tThis option only affects the MLDS back-ends.\",\n%       \"\\tIt is needed for the high-level C back-end,\",\n%       \"\\twhere commits are implemented via setjmp()/longjmp(),\",\n%       \"\\tsince longjmp() may clobber any non-volatile local vars\",\n%       \"\\tin the function that called setjmp().\",\n% The --put-nondet-env-on-heap option is not documented because\n% it is enabled automatically (by handle_options) in the situations\n% where it is needed; the user should never need to set it.\n%       \"--put-nondet-env-on-heap\",\n%       \"\\tAllocate the environment structures used for\",\n%       \"\\tnondeterministic Mercury procedures on the heap,\",\n%       \"\\trather than on the stack.\"\n%   ]),\n%   io.write_string(\"\\n      IL back-end compilation model options:\\n\"),\n%   write_tabbed_lines([\n%\n% The --verifiable-code option is not yet documented because it is not yet fully\n% implemented.\n%       \"--verifiable, --verifiable-code\\t\\t\\t\",\n%       \"\\tEnsure that the generated IL code is verifiable.\",\n%\n% The --il-refany-fields option is not documented because currently there\n% are no IL implementations for which it is useful.\n%       \"--il-refany-fields\",\n%       \"\\tGenerate IL code that assumes that the CLI implementation\",\n%       \"\\tsupports value types with fields of type `refany'.\",\n%       \"\\tUsing this option could in theory allow more efficient\",\n%       \"\\tverifiable IL code for nondeterministic Mercury procedures,\",\n%       \"\\tif the CLI implementation supported it.\"\n%       \"\\tHowever, the current Microsoft CLR does not support it.\"\n%\n% The --il-byref-tailcalls option is not documented because currently there\n% are no IL implementations for which it is useful.\n%       \"--il-byref-tailcalls\",\n%       \"\\tGenerate IL code that assumes that the CLI verifier\",\n%       \"\\tsupports tail calls with byref arguments.\"\n%\n% The --il-funcptr-types option is not documented because it is not yet\n% implemented.\n%       \"--il-funcptr-types\",\n%       \"\\tGenerate IL code that assumes that the IL assembler\",\n%       \"\\tsupports function pointer types.\"\n%       \"\\tThe ECMA CLI specification allows function pointer types,\"\n%       \"\\tbut some CLR implementations, e.g. the old Beta 2 version of\"\n%       \"\\tthe Microsoft CLR implementation, do not support them.\"\n    ]),\n\n    io.write_string(\"\\n    Developer compilation model options:\\n\"),\n    io.write_string(\"\\n      Data representation\\n\"),\n    write_tabbed_lines([\n        \"--tags {none, low, high}      (This option is not for general use.)\",\n        \"\\tSpecify whether to use the low bits or the high bits of \",\n        \"\\teach word as tag bits (default: low).\",\n    %   \"\\t\\t`--tags none' implies `--num-tag-bits 0'.\",\n        \"--num-tag-bits <n>            (This option is not for general use.)\",\n        \"\\tUse <n> tag bits.\",\n        \"--num-reserved-addresses <n>  (This option is not for general use.)\",\n        \"\\tTreat the integer values from 0 up to <n> - 1 as reserved\",\n        \"\\taddresses that can be used to represent nullary constructors\",\n        \"\\t(constants) of discriminated union types.\",\n        \"--num-reserved-objects <n>    (This option is not for general use.)\",\n        \"\\tAllocate up to <n> global objects per type,\",\n        \"\\tfor representing nullary constructors\",\n        \"\\t(constants) of discriminated union types.\"\n\n        % The --conf-low-tag-bits option is reserved for use\n        % by the `mmc' script; it is deliberately not documented.\n\n        % The --bits-per-word option is intended for use\n        % by the `mmc' script; it is deliberately not documented.\n\n        % The --bytes-per-word option is intended for use\n        % by the `mmc' script; it is deliberately not documented.\n\n        % This is a developer only option.\n%       \"--unboxed-float\",\n%       \"(This option is not for general use.)\",\n%       \"\\tDon't box floating point numbers.\",\n%       \"\\tThis assumes that a Mercury float will fit in a word.\",\n%       \"\\tThe C code needs to be compiled with `-UBOXED_FLOAT'.\",\n%       \"\\tIt may also need to be compiled with\",\n%       \"\\t`-DUSE_SINGLE_PREC_FLOAT', if double precision\",\n%       \"\\tfloats don't fit into a word.\"\n\n        % This is a developer only option.\n%       \"--no-unboxed-enums\",\n%       \"(This option is not for general use.)\",\n%       \"\\tBox enumerations.  This option is disabled by default.\",\n\n        % This is a developer only option.\n%       \"--no-unboxed-no-tag-types\",\n%       \"(This option is not for general use.)\",\n%       \"\\tBox no-tag types.  This option is disabled by default.\"\n\n    ]),\n    io.write_string(\"\\n      Developer optional features\\n\"),\n    write_tabbed_lines([\n        \"--use-minimal-model-stack-copy\",\n        \"(This option is not for general use.)\",\n        \"\\tEnable the use of the standard form of minimal model tabling.\",\n\n        \"--use-minimal-model-own-stacks\",\n        \"(This option is not for general use.)\",\n        \"\\tEnable the use of an experimental form of minimal model tabling.\",\n\n        \"--minimal-model-debug\",\n        \"(This option is not for general use.)\",\n        \"\\tEnables extra data structures that assist in debugging\",\n        \"\\tminimal model tabling.\",\n\n        \"--no-type-layout\",\n        \"(This option is not for general use.)\",\n        \"\\tDon't output type_ctor_layout structures or references\",\n        \"\\tto them. (The C code also needs to be compiled with\",\n        \"\\t`-DNO_TYPE_LAYOUT').\"\n\n        % This is a developer only option.\n%       \"--basic-stack-layout\",\n%       \"(This option is not for general use.)\",\n%       \"\\tGenerate the simple stack_layout structures required\",\n%       \"\\tfor stack traces.\",\n\n        % This is a developer only option.\n%       \"--agc-stack-layout\",\n%       \"(This option is not for general use.)\",\n%       \"\\tGenerate the stack_layout structures required for\",\n%       \"\\taccurate garbage collection.\",\n\n        % This is a developer only option.\n%       \"--procid-stack-layout\",\n%       \"(This option is not for general use.)\",\n%       \"\\tGenerate the stack_layout structures required for\",\n%       \"\\tlooking up procedure identification information.\",\n\n        % This is a developer only option.\n%       \"--trace-stack-layout\",\n%       \"(This option is not for general use.)\",\n%       \"\\tGenerate the stack_layout structures required for\",\n%       \"\\texecution tracing.\",\n\n        % This is a developer only option.\n%       \"--body-typeinfo-liveness\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--can-compare-constants-as-ints\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--pretest-equality-cast-pointers\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--can-compare-compound-values\"\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--lexically-order-constructors\"\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--mutable-always-boxed\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--delay-partial-instantiations\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see delay_partial_inst.m\n\n        % This is a developer only option.\n%       \"--allow-defn-of-builtins\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--special-preds\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % All these are developer only options.\n%       \"(These options are not for general use.)\",\n%       For documentation, see runtime/mercury_region.h.\n%       \"--size-region-ite-fixed\"\n%       \"--size-region-disj-fixed\"\n%       \"--size-region-commit-fixed\"\n%       \"--size-region-ite-protect\"\n%       \"--size-region-ite-snapshot\"\n%       \"--size-region-disj-protect\"\n%       \"--size-region-disj-snapshot\"\n%       \"--size-region-commit-entry\"\n\n        % This is a developer only option.\n%       \"--solver-type-auto-init\",\n%       \"(This option is not for general use.)\",\n%       Allow automatic initialisation of solver types.\n\n        % This is a developer only option.\n%       \"--allow-multi-arm-switches\",\n%       \"(This option is not for general use.)\",\n%       Allow the compiler to generate switches in which one arm handles\n%       more than one cons_id.\n\n        % This is a developer only option.\n%       \"--type-check-constraints\",\n%       \"(This option is not for general use.)\",\n%       Use the constraint based type checker instead of the old one.\n\n        % This is a developer only option.\n%       \"--allow-argument-packing\",\n%       \"(This option is not for general use.)\",\n%       Allow the compiler to pack multiple constructor arguments into\n%       a single field.\n    ]).\n\n:- pred options_help_code_generation(io::di, io::uo) is det.\n\noptions_help_code_generation -->\n    io.write_string(\"\\nCode generation options:\\n\"),\n    write_tabbed_lines([\n%       \"--low-level-debug\",\n%       \"\\tEnables various low-level debugging stuff, that was in\",\n%       \"\\tthe distant past used to debug the low-level code generation.\",\n%       \"\\tYou don't want to use this option unless you are hacking\",\n%       \"\\tthe Mercury compiler itself (and probably not even then).\",\n%       \"\\tCauses the generated code to become VERY big and VERY\",\n%       \"\\tinefficient.  Slows down compilation a LOT.\",\n\n%       \"--table-debug\",\n%       \"\\tEnables the generation of code that helps to debug tabling\",\n%       \"\\tprimitives.\",\n\n        \"--no-trad-passes\",\n        \"\\tThe default `--trad-passes' completely processes each predicate\",\n        \"\\tbefore going on to the next predicate.\",\n        \"\\tThis option tells the compiler\",\n        \"\\tto complete each phase of code generation on all predicates\",\n        \"\\tbefore going on the next phase on all predicates.\",\n    %   \"--parallel-liveness\",\n    %   \"Use multiple threads when computing liveness.\",\n    %   \"At the moment this option implies `--no-trad-passes',\",\n    %   \"and requires the compiler to be built in a\",\n    %   \"low-level parallel grade and running with multiple engines.\",\n    %   \"--parallel-code-gen\",\n    %   \"Use multiple threads when generating code.\",\n    %   \"At the moment this option implies `--no-trad-passes',\",\n    %   \"and requires the compiler to be built in a\",\n    %   \"low-level parallel grade and running with multiple engines.\",\n    %   \"\\t--no-polymorphism\",\n    %   \"\\t\\tDon't handle polymorphic types.\",\n    %   \"\\t\\t(Generates slightly more efficient code, but stops\",\n    %   \"\\t\\tpolymorphism from working except in special cases.)\",\n        \"--no-reclaim-heap-on-nondet-failure\",\n        \"\\tDon't reclaim heap on backtracking in nondet code.\",\n        \"--no-reclaim-heap-on-semidet-failure\",\n        \"\\tDon't reclaim heap on backtracking in semidet code.\",\n        \"--no-reclaim-heap-on-failure\",\n        \"\\tCombines the effect of the two options above.\",\n\n        \"--max-jump-table-size=<n>\",\n        \"\\tThe maximum number of entries a jump table can have.\",\n        \"\\tThe special value 0 indicates the table size is unlimited.\",\n        \"\\tThis option can be useful to avoid exceeding fixed limits\",\n        \"\\timposed by some C compilers.\",\n\n        % This is a developer only option.\n%       \"--compare-specialization=<n>\",\n%       \"\\tGenerate quadratic instead of linear compare predicates for\",\n%       \"\\ttypes with up to n function symbols. Higher values of n lead to\",\n%       \"\\tfaster but also bigger compare predicates.\",\n\n        % This is a developer only option.\n%       \"--no-should-pretest-equality\",\n%       \"\\tIf specified, do not add a test for the two values being equal\",\n%       \"\\tas words to the starts of potentially expensive unify and compare\",\n%       \"\\tpredicates.\"\n\n        \"--fact-table-max-array-size <n>\",\n        \"\\tSpecify the maximum number of elements in a single\",\n        \"\\t`:- pragma fact_table' data array (default: 1024).\",\n        \"--fact-table-hash-percent-full <percentage>\",\n        \"\\tSpecify how full the `:- pragma fact_table' hash tables\",\n        \"\\tshould be allowed to get.  Given as an integer percentage\",\n        \"\\t(valid range: 1 to 100, default: 90).\"\n\n% This option is not yet documented because the `--gcc-nested-functions' option\n% is not documented.\n%       \"--gcc-local-labels\",\n%       \"\\tThis option has no effect unless both the `--high-level-code' option\",\n%       \"\\tand the `--gcc-nested-functions' options are enabled.\",\n%       \"\\tIf this option is enabled, the Mercury compiler will generate\",\n%       \"\\tC code that uses GNU C's local labels extension to allow\",\n%       \"\\tGNU C nested functions to exit into their containing function\",\n%       \"\\tvia a `goto'.\",\n%       \"\\tIf this option is not enabled, the default behaviour is to\",\n%       \"\\tuse the standard ANSI/ISO C setjmp() and longjmp() functions.\"\n\n% This option is not yet documented because it is not yet useful -- currently\n% we don't take advantage of GNU C's computed gotos extension.\n%       \"--no-prefer-switch\",\n%       \"\\tGenerate code using computed gotos rather than switches.\",\n%       \"\\tThis makes the generated code less readable, but potentially\",\n%       \"\\tslightly more efficient.\",\n%       \"\\tThis option has no effect unless the `--high-level-code' option\",\n%       \"\\tis enabled.  It also has no effect if the `--target' option is\",\n%       \"\\tset to `il'.\",\n% This optimization is for implementors only. Turning this option on provides\n% the fairest possible test of --optimize-saved-vars-cell.\n%       \"--no-opt-no-return-calls\",\n%       \"\\tDo not optimize the stack usage of calls that cannot return.\",\n\n    ]),\n\n    io.write_string(\"\\n    Code generation target options:\\n\"),\n    write_tabbed_lines([\n        \"--branch-delay-slot    \\t(This option is not for general use.)\",\n        \"\\tAssume that branch instructions have a delay slot.\",\n        \"--num-real-r-regs <n>  \\t(This option is not for general use.)\",\n        \"\\tAssume registers r1 up to r<n> are real general purpose\",\n        \"\\tregisters.\",\n        \"--num-real-f-regs <n>  \\t(This option is not for general use.)\",\n        \"\\tAssume registers f1 up to f<n> are real floating point\",\n        \"\\tregisters.\",\n        \"--num-real-r-temps <n> \\t(This option is not for general use.)\",\n        \"\\tAssume that <n> non-float temporaries will fit into\",\n        \"\\treal machine registers.\",\n        \"--num-real-f-temps <n> \\t(This option is not for general use.)\",\n        \"\\tAssume that <n> float temporaries will fit into\",\n        \"\\treal machine registers.\"\n    ]).\n\n:- pred options_help_optimization(io::di, io::uo) is det.\n\noptions_help_optimization -->\n    io.write_string(\"\\nOptimization Options:\\n\"),\n    write_tabbed_lines([\n        \"-O <n>, --opt-level <n>, --optimization-level <n>\",\n        \"\\tSet optimization level to <n>.\",\n        \"\\tOptimization level -1 means no optimization\",\n        \"\\twhile optimization level 6 means full optimization.\",\n    %   \"\\t\\tFor a full description of each optimization level,\",\n    %   \"\\t\\tsee the Mercury User's Guide.\",\n        \"--opt-space, --optimize-space\",\n        \"\\tTurn on optimizations that reduce code size\",\n        \"\\tand turn off optimizations that significantly\",\n        \"\\tincrease code size.\",\n        \"--intermod-opt\",\n        \"--intermodule-optimization\",\n        \"\\tPerform inlining and higher-order specialization of\",\n        \"\\tthe code for predicates imported from other modules.\",\n        \"\\tThis option must be set throughout the compilation process.\",\n        \"--trans-intermod-opt\",\n        \"--transitive-intermodule-optimization\",\n        \"\\tImport the transitive intermodule optimization data.\",\n        \"\\tThis data is imported from `<module>.trans_opt' files.\",\n        \"\\tNote that `--transitive-intermodule-optimization' does not\",\n        \"\\twork with `mmc --make'.\",\n        \"--no-read-opt-files-transitively\",\n        \"\\tOnly read the inter-module optimization information\",\n        \"\\tfor directly imported modules, not the transitive\",\n        \"\\tclosure of the imports.\",\n        \"--use-opt-files\",\n        \"\\tPerform inter-module optimization using any\",\n        \"\\t`.opt' files which are already built,\",\n        \"\\te.g. those for the standard library, but do\",\n        \"\\tnot build any others.\",\n        \"--use-trans-opt-files\",\n        \"\\tPerform inter-module optimization using any\",\n        \"\\t`.trans_opt' files which are already built,\",\n        \"\\te.g. those for the standard library, but do\",\n        \"\\tnot build any others.\",\n        \"--intermodule-analysis\",\n        \"\\tPerform analyses such as termination analysis and\",\n        \"\\tunused argument elimination across module boundaries.\",\n        \"\\tThis option is not yet fully implemented.\",\n        \"--analysis-repeat <n>\",\n        \"\\tThe maximum number of times to repeat analyses of\",\n        \"\\tsuboptimal modules with `--intermodule-analysis'\",\n        \"\\t(default: 0).\"\n        % This is commented out as this feature is still experimental.\n%       \"--analysis-file-cache\",\n%       \"\\tEnable caching of parsed analysis files. This may\",\n%       \"\\timprove compile times with `--intermodule-analysis'.\"\n    ]).\n\n:- pred options_help_hlds_hlds_optimization(io::di, io::uo) is det.\n\noptions_help_hlds_hlds_optimization -->\n    io.write_string(\"\\n    High-level (HLDS -> HLDS) optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--no-inlining\",\n        \"\\tDisable all forms of inlining.\",\n        \"--no-inline-simple\",\n        \"\\tDisable the inlining of simple procedures.\",\n        \"--no-inline-builtins\",\n        \"\\tGenerate builtins (e.g. arithmetic operators) as calls to\",\n        \"\\tout of line procedures.  This is done by default when,\",\n        \"\\tdebugging, as without this option the execution of\",\n        \"\\tbuiltins is not traced.\",\n        \"--no-inline-single-use\",\n        \"\\tDisable the inlining of procedures called only once.\",\n        \"--inline-call-cost <cost>\",\n        \"\\tAssume that the cost of a call is the given parameter.\",\n        \"\\tUsed only in conjunction with --inline-compound-threshold.\",\n        \"\\tmultiplied by the number of times it is called,\",\n        \"--inline-compound-threshold <threshold>\",\n        \"\\tInline a procedure if its size (measured roughly\",\n        \"\\tin terms of the number of connectives in its internal form)\",\n        \"\\tless the assumed call cost, multiplied by the number of times\",\n        \"\\tit is called is below the given threshold.\",\n        \"--inline-simple-threshold <threshold>\",\n        \"\\tInline a procedure if its size is less than the\",\n        \"\\tgiven threshold.\",\n        \"--intermod-inline-simple-threshold\",\n        \"\\tSimilar to `--inline-simple-threshold', except used to\",\n        \"\\tdetermine which predicates should be included in\",\n        \"\\t`.opt' files. Note that changing this between writing\",\n        \"\\tthe `.opt' file and compiling to C may cause link errors,\",\n        \"\\tand too high a value may result in reduced performance.\",\n        \"--inline-vars-threshold <threshold>\",\n        \"\\tDon't inline a call if it would result in a procedure\",\n        \"\\tcontaining more than <threshold> variables. Procedures\",\n        \"\\tcontaining large numbers of variables can cause\",\n        \"\\tslow compilation.\",\n%       \"--from-ground-term-threshold <n>\",\n%       \"\\tWrap a from_ground_term scope around the expanded,\",\n%       \"\\tsuperhomogeneous form of a ground term that involves at least.\",\n%       \"\\tthe given number of function symbols.\",\n        \"--no-const-struct\",\n        \"\\tDisable the gathering of constant structures in a separate table.\",\n        \"--no-common-struct\",\n        \"\\tDisable optimization of common term structures.\",\n%       \"--common-struct-preds <predids>\",\n%       \"\\tLimit common struct optimization to the preds with the given ids.\",\n\n%       Common goal optimization should not be turned off, since it can\n%       break programs that would otherwise compile properly (e.g.,\n%       benchmarks/icfp2000). This is kept as a developer-only option.\n%\n%       \"--no-common-goal\",\n%       \"\\tDisable optimization of common goals.\",\n%       \"\\tAt the moment this optimization\",\n%       \"\\tdetects only common deconstruction unifications.\",\n%       \"\\tDisabling this optimization reduces the class of predicates\",\n%       \"\\tthat the compiler considers to be deterministic.\",\n\n        \"--constraint-propagation\",\n        \"\\tEnable the constraint propagation transformation,\",\n        \"\\twhich attempts to transform the code so that goals\",\n        \"\\twhich can fail are executed as early as possible.\",\n        \"--local-constraint-propagation\",\n        \"\\tEnable the constraint propagation transformation,\",\n        \"\\tbut only rearrange goals within each procedure.\",\n        \"\\tSpecialized versions of procedures will not be created.\",\n        \"--prev-code\",\n        \"\\tMigrate into the start of branched goals.\",\n        \"--no-follow-code\",\n        \"\\tDon't migrate into the end of branched goals.\",\n        \"--excess-assign\",\n        \"\\tRemove excess assignment unifications.\",\n        \"--no-optimize-format-calls\",\n        \"\\tDo not attempt to interpret the format string in calls to\",\n        \"\\tstring.format and related predicates at compile time;\",\n        \"\\talways leave this to be done at runtime.\",\n        \"--optimize-duplicate-calls\",\n        \"\\tOptimize away multiple calls to a predicate\",\n        \"\\twith the same input arguments.\",\n        \"--loop-invariants\",\n        \"\\tHoist loop invariants out of loops.\",\n        \"--delay-constructs\",\n        \"\\tReorder goals to move construction unifications after\",\n        \"\\tprimitive goals that can fail.\",\n        % \"--optimize-saved-vars-const\",\n        % \"\\tMinimize the number of variables saved across calls by\",\n        % \"\\tintroducing duplicate copies of variables bound to\",\n        % \"\\tconstants in each interval between flushes where they\",\n        % \"\\tare needed.\",\n        % \"--optimize-saved-vars-cell\",\n        % \"\\tMinimize the number of variables saved across calls by\",\n        % \"\\ttrying to use saved variables pointing to cells to reach\",\n        % \"\\tthe variables stored in those cells.\",\n        \"--optimize-saved-vars\",\n        \"\\tMinimize the number of variables saved across calls.\",\n        \"--optimize-unused-args\",\n        \"\\tRemove unused predicate arguments.\",\n        \"\\tThis will cause the compiler to generate more\",\n        \"\\tefficient code for many polymorphic predicates.\",\n        \"--intermod-unused-args\",\n        \"\\tPerform unused argument removal across module boundaries.\",\n        \"\\tThis option implies `--optimize-unused-args' and\",\n        \"\\t`--intermodule-optimization'.\",\n\n        \"--optimize-higher-order\",\n        \"\\tEnable specialization of higher-order predicates.\",\n        \"--type-specialization\",\n        \"\\tEnable specialization of polymorphic predicates where the\",\n        \"\\tpolymorphic types are known.\",\n        \"--user-guided-type-specialization\",\n        \"\\tEnable specialization of polymorphic predicates for which\",\n        \"\\tthere are `:- pragma type_spec' declarations.\",\n        \"--higher-order-size-limit\",\n        \"\\tSet the maximum goal size of specialized versions created by\",\n        \"\\t`--optimize-higher-order' and `--type-specialization'.\",\n        \"\\tGoal size is measured as the number of calls, unifications\",\n        \"\\tand branched goals.\",\n        \"--higher-order-arg-limit\",\n        \"\\tSet the maximum size of higher-order arguments to\",\n        \"\\tbe specialized by `--optimize-higher-order' and\",\n        \"\\t`--type-specialization'.\",\n        \"--unneeded-code\",\n        \"\\tRemove goals from computation paths where their outputs are\",\n        \"\\tnot needed, provided the semantics options allow the deletion\",\n        \"\\tor movement of the goal.\",\n        \"--unneeded-code-copy-limit\",\n        \"\\tGives the maximum number of places to which a goal may be copied\",\n        \"\\twhen removing it from computation paths on which its outputs are\",\n        \"\\tnot needed. A value of zero forbids goal movement and allows\",\n        \"\\tonly goal deletion; a value of one prevents any increase in the\",\n        \"\\tsize of the code.\",\n%       \"--unneeded-code-debug\",\n%       \"\\tPrint progress messages during the unneeded code elimination\",\n%       \"\\tpasses.\",\n%       \"--unneeded-code-debug-pred-name <predname>\",\n%       \"\\tPrint the definition of <predname> at the start of each pass\",\n%       \"\\tof the unneeded code elimination algorithm.\",\n        \"--introduce-accumulators\",\n        \"\\tAttempt to introduce accumulating variables into\",\n        \"\\tprocedures, so as to make them tail recursive.\",\n%       \"--optimize-constructor-last-call-accumulator\",\n%       \"\\tEnable the optimization via accumulators of \"\"last\"\" calls\",\n%       \"\\tthat are followed by constructor application.\",\n%       \"--optimize-constructor-last-call-null\",\n%       \"\\tWhen --optimize-constructor-last-call is enabled, put NULL in\"\n%       \"\\tuninitialized fields (to prevent the garbage collector from\",\n%       \"\\tlooking at and following a random bit pattern).\",\n        \"--optimize-constructor-last-call\",\n        \"\\tEnable the optimization of \"\"last\"\" calls that are followed by\",\n        \"\\tconstructor application.\",\n        \"--deforestation\",\n        \"\\tEnable deforestation. Deforestation is a program\",\n        \"\\ttransformation whose aim is to avoid the construction of\",\n        \"\\tintermediate data structures and to avoid repeated traversals\",\n        \"\\tover data structures within a conjunction.\",\n        \"--deforestation-depth-limit <limit>\",\n        \"\\tSpecify a depth limit to prevent infinite loops in the\",\n        \"\\tdeforestation algorithm.\",\n        \"\\tA value of -1 specifies no depth limit. The default is 4.\",\n        \"--deforestation-vars-threshold <threshold>\",\n        \"\\tSpecify a rough limit on the number of variables\",\n        \"\\tin a procedure created by deforestation.\",\n        \"\\tA value of -1 specifies no limit. The default is 200.\",\n        \"--deforestation-size-threshold <threshold>\",\n        \"\\tSpecify a rough limit on the size of a goal\",\n        \"\\tto be optimized by deforestation.\",\n        \"\\tA value of -1 specifies no limit. The default is 15.\",\n        \"--analyse-exceptions\",\n        \"\\tEnable exception analysis.  Identify those\",\n        \"\\tprocedures that will not throw an exception.\",\n        \"\\tSome optimizations can make use of this information.\",\n% XXX The options controlling closure analysis are currently\n% commented out because it isn't useful.  It can be uncommented when\n% we actually have something that uses it.\n%       \"--analyse-closures\",\n%       \"\\tEnable closure analysis.  Try to identify the possible\",\n%       \"\\tvalues that higher-order valued variables can take.\",\n%       \"\\tSome optimizations can make use of this information.\",\n        \"--analyse-trail-usage\",\n        \"\\tEnable trail usage analysis.  Identify those\",\n        \"\\tprocedures that will not modify the trail.\",\n        \"\\tThis information is used to reduce the overhead\",\n        \"\\tof trailing.\",\n% `--no-optimize-trail-usage' is a developer-only option.\n% It is intended for the benchmarking of trail usage optimization.\n% Otherwise, it should not be turned off as doing so interferes with\n% the results of the trail usage analysis.\n        % \"--no-optimize-trail-usage\",\n        % \"\\tDo not try and restrict trailing to those parts\",\n        % \"\\tof the program that actually use it.\",\n% `--no-optimize-region-ops' is a developer-only option.\n% It is intended for the benchmarking of region ops optimization.\n        % \"--no-optimize-region-ops\",\n        % \"\\tDo not try and restrict region operations to those parts\",\n        % \"\\tof the program that actually use it.\",\n        \"--analyse-mm-tabling\",\n        \"\\tIdentify those goals that do not call procedures\",\n        \"\\tthat are evaluated using minimal model tabling.\",\n        \"\\tThis information is used to reduce the overhead\",\n        \"\\tof minimal model tabling.\"\n        % \"--untuple\",\n        % \"\\tExpand out procedure arguments when the argument type\",\n        % \"\\tis a tuple or a type with exactly one functor.\",\n        % \"\\tNote: this is almost always a pessimization.\",\n        % \"--tuple\",\n        % \"\\tTry to find opportunities for procedures to pass some\",\n        % \"\\targuments to each other as a tuple rather than as\",\n        % \"\\tindividual arguments.\",\n        % \"\\tNote: so far this has mostly a detrimental effect.\",\n        % \"--tuple-trace-counts-file\",\n        % \"\\tSupply a trace counts summary file for the tupling\",\n        % \"\\ttransformation. The summary should be made from a sample\",\n        % \"\\trun of the program you are compiling, compiled without\",\n        % \"\\toptimizations.\",\n        % \"--tuple-costs-ratio\",\n        % \"\\tA value of 110 for this parameter means the tupling\",\n        % \"\\ttransformation will transform a procedure if it thinks\",\n        % \"\\tthat procedure would be 10% worse, on average, than\",\n        % \"\\twhatever transformed version of the procedure it has in\",\n        % \"\\tmind. The default is 100.\",\n        % \"--tuple-min-args\",\n        % \"\\tThe minimum number of input arguments that the tupling\",\n        % \"\\ttransformation will consider passing together as a\",\n        % \"\\ttuple. This is mostly to speed up the compilation\",\n        % \"\\tprocess by not pursuing (presumably) unfruitful searches.\",\n% This is for measurements by implementors only.\n%       \"--no-inline-par-builtins\",\n%       \"\\tGenerate calls to the predicates of par_builtin.m, instead of\",\n%       \"\\tbodily including their definitions as C code.\",\n%       Actually, this is the default for now.\n% This is for measurements by implementors only.\n%       \"--always-specialize-in-dep-par-conjs\",\n%       \"\\tWhen the transformation for handling dependent parallel conjunctions\",\n%       \"\\tadds waits and/or signals around a call, create a specialized\",\n%       \"\\tversion of the called procedure, even if this is not profitable.\",\n% '--region-analysis' is not documented because it is still experimental.\n%        \"--region-analysis\",\n%        \"\\tEnable the analysis for region-based memory management.\"\n    ]).\n\n:- pred options_help_hlds_llds_optimization(io::di, io::uo) is det.\n\noptions_help_hlds_llds_optimization -->\n    io.write_string(\"\\n    Medium-level (HLDS -> LLDS) optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--no-smart-indexing\",\n        \"\\tGenerate switches as a simple if-then-else chains;\",\n        \"\\tdisable string hashing and integer table-lookup indexing.\",\n        \"--dense-switch-req-density <percentage>\",\n        \"\\tThe jump table generated for an atomic switch\",\n        \"\\tmust have at least this percentage of full slots (default: 25).\",\n        \"--lookup-switch-req-density <percentage>\",\n        \"\\tThe jump table generated for an atomic switch\",\n        \"\\tin which all the outputs are constant terms\",\n        \"\\tmust have at least this percentage of full slots (default: 25).\",\n        \"--dense-switch-size <n>\",\n        \"\\tThe jump table generated for an atomic switch\",\n        \"\\tmust have at least this many entries (default: 4).\",\n        \"--lookup-switch-size <n>\",\n        \"\\tThe lookup table generated for an atomic switch\",\n        \"\\tmust have at least this many entries (default: 4).\",\n        \"--string-hash-switch-size <n>\",\n        \"\\tThe hash table generated for a string switch\",\n        \"\\tmust have at least this many entries (default: 8).\",\n        \"--string-binary-switch-size <n>\",\n        \"\\tThe binary search table generated for a string switch\",\n        \"\\tmust have at least this many entries (default: 4).\",\n        \"--tag-switch-size <n>\",\n        \"\\tThe number of alternatives in a tag switch\",\n        \"\\tmust be at least this number (default: 3).\",\n        \"--try-switch-size <n>\",\n        \"\\tThe number of alternatives in a try/retry chain switch\",\n        \"\\tmust be at least this number (default: 3).\",\n        \"--binary-switch-size <n>\",\n        \"\\tThe number of alternatives in a binary search switch\",\n        \"\\tmust be at least this number (default: 4).\",\n% These options are only for performance tests.\n%       \"--switch-single-rec-base-first\",\n%       \"\\tIn a switch with two arms, one a base case and one with a single\",\n%       \"\\trecursive call, put the base case first.\n%       \"--switch-multi-rec-base-first\",\n%       \"\\tIn a switch with two arms, one a base case and one with multiple\",\n%       \"\\trecursive calls, put the base case first.\n        \"--no-static-ground-terms\",\n        \"\\tDisable the optimization of constructing constant ground terms\",\n        \"\\tat compile time and storing them as static constants.\",\n        \"\\tNote that auxiliary data structures created by the compiler\",\n        \"\\tfor purposes such as debugging will still be created as\",\n        \"\\tstatic constants.\",\n        \"--no-use-atomic-cells\",\n        \"\\tDon't use the atomic variants of the Boehm gc allocator calls,\",\n        \"\\teven when this would otherwise be possible.\",\n        \"--no-middle-rec\",\n        \"\\tDisable the middle recursion optimization.\",\n        \"--no-simple-neg\",\n        \"\\tDon't generate simplified code for simple negations.\"\n%       \"--no-allow-hijacks\",\n%       \"\\tDo not generate code in which a procedure hijacks\",\n%       \"\\ta nondet stack frame that possibly belongs to\",\n%       \"\\tanother procedure invocation\".\n    ]).\n\n:- pred options_help_llds_llds_optimization(io::di, io::uo) is det.\n\noptions_help_llds_llds_optimization -->\n    io.write_string(\"\\n    Low-level (LLDS -> LLDS) optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--no-common-data\",\n        \"\\tDisable optimization of common data structures.\",\n        \"--no-common-layout-data\",\n        \"\\tDisable optimization of common subsequences in layout structures.\",\n        \"--no-llds-optimize\",\n        \"\\tDisable the low-level optimization passes.\",\n        \"--optimize-dead-procs\",\n        \"\\tEnable dead predicate elimination.\",\n        \"--no-optimize-peep\",\n        \"\\tDisable local peephole optimizations.\",\n% This is useful for developers only, to test whether a gcc bug has been fixed.\n%       \"--no-optimize-peep-mkword\",\n%       \"\\tDisable peephole optimizations of words created by mkword.\",\n        \"--no-optimize-jumps\",\n        \"\\tDisable elimination of jumps to jumps.\",\n        \"--no-optimize-fulljumps\",\n        \"\\tDisable elimination of jumps to ordinary code.\",\n        \"--pessimize-tailcalls\",\n        \"\\tDisable the optimization of tailcalls.\",\n        \"--checked-nondet-tailcalls\",\n        \"\\tConvert nondet calls into tail calls whenever possible, even\",\n        \"\\twhen this requires a runtime check. This option tries to\",\n        \"\\tminimize stack consumption, possibly at the expense of speed.\",\n        \"--no-use-local-vars\",\n        \"\\tDisable the transformation to use local variables in C code\",\n        \"\\tblocks wherever possible.\",\n% This is useful for developers only.\n%       \"--standardize-labels\",\n%       \"\\tStandardize internal labels in the generated code.\",\n        \"--no-optimize-labels\",\n        \"\\tDisable elimination of dead labels and code.\",\n        \"--optimize-dups\",\n        \"\\tEnable elimination of duplicate code within procedures.\",\n        \"--optimize-proc-dups\",\n        \"\\tEnable elimination of duplicate procedures.\",\n%%%     \"--optimize-copyprop\",\n%%%     \"\\tEnable the copy propagation optimization.\",\n        \"--no-optimize-frames\",\n        \"\\tDisable stack frame optimizations.\",\n        \"--no-optimize-delay-slot\",\n        \"\\tDisable branch delay slot optimizations.\",\n        \"--optimize-reassign\",\n        \"\\tOptimize away assignments to locations that already hold\",\n        \"\\tthe assigned value.\",\n        \"--optimize-repeat <n>\",\n        \"\\tIterate most optimizations at most <n> times (default: 3).\",\n        \"--layout-compression-limit <n>\",\n        \"\\tAttempt to compress the layout structures used by the debugger\",\n        \"\\tonly as long as the arrays involved have at most <n> elements\",\n        \"\\t(default: 4000).\"\n    ]).\n\n:- pred options_help_mlds_mlds_optimization(io::di, io::uo) is det.\n\noptions_help_mlds_mlds_optimization -->\n    io.write_string(\"\\n    MLDS -> MLDS optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--no-mlds-optimize\",\n        \"\\tDisable the MLDS->MLDS optimization passes.\",\n        \"--no-mlds-peephole\",\n        \"\\tDo not perform peephole optimization of the MLDS.\",\n        \"--no-optimize-tailcalls\",\n        \"\\tTreat tailcalls as ordinary calls, rather than optimizing\",\n        \"\\tby turning self-tailcalls into loops.\",\n        \"--no-optimize-initializations\",\n        \"\\tLeave initializations of local variables as\",\n        \"\\tassignment statements, rather than converting such\",\n        \"\\tassignment statements into initializers.\",\n        \"--eliminate-local-vars\",\n        \"\\tEliminate local variables with known values, where possible,\",\n        \"\\tby replacing occurrences of such variables with their values.\",\n        \"--no-generate-trail-ops-inline\",\n        \"\\tDo not generate trailing operations inline,\",\n        \"\\tbut instead insert calls to the versions of these operations\",\n        \"\\tin the standard library.\"\n]).\n\n:- pred options_help_hlds_elds_optimization(io::di, io::uo) is det.\n\noptions_help_hlds_elds_optimization -->\n    io.write_string(\"\\n    HLDS -> ELDS optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--erlang-switch-on-strings-as-atoms\",\n        \"\\tEnable a workaround for slow HiPE compilation of large string\",\n        \"\\tswitches by converting the string to an atom at runtime and\",\n        \"\\tswitching on atoms. Do not enable if the string switched on\",\n        \"\\tcould be longer than 255 characters at runtime.\"\n    ]).\n\n:- pred options_help_output_optimization(io::di, io::uo) is det.\n\noptions_help_output_optimization -->\n    io.write_string(\"\\n    Output-level (LLDS -> C) optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--use-macro-for-redo-fail\",\n        \"\\tEmit the fail or redo macro instead of a branch\",\n        \"\\tto the fail or redo code in the runtime system.\",\n        \"\\tThis produces slightly bigger but slightly faster code.\",\n        \"--no-emit-c-loops\",\n        \"\\tUse only gotos, don't emit C loop constructs.\",\n        \"--procs-per-c-function <n>\",\n        \"\\tPut the code for up to <n> Mercury\",\n        \"\\tprocedures in a single C function.  The default\",\n        \"\\tvalue of <n> is one.  Increasing <n> can produce\",\n        \"\\tslightly more efficient code, but makes compilation slower.\",\n        \"--everything-in-one-c-function\",\n        \"\\tThis option has the effect of putting the code for all\",\n        \"\\tthe Mercury procedures in a single C function,\",\n        \"\\twhich produces the most efficient code but tends to\",\n        \"\\tseverely stress the C compiler on large modules.\",\n        \"--no-local-thread-engine-base\",\n        \"\\tDon't copy the thread-local Mercury engine base address\",\n        \"\\tinto local variables. This option only affects low-level\",\n        \"\\tparallel grades not using the global register variables\",\n        \"\\textension.\"\n    ]).\n\n:- pred options_help_target_code_compilation(io::di, io::uo) is det.\n\noptions_help_target_code_compilation -->\n    io.write_string(\"\\n    Target code compilation:\\n\"),\n    write_tabbed_lines([\n        \"\\tNote that if you are using Mmake, you need to pass these\",\n        \"\\toptions to the target code compiler (e.g. `mgnuc')\",\n        \"\\trather than to `mmc'.\",\n\n        \"--target-debug\",\n        \"\\tEnable debugging of the generated target code.\",\n        \"\\tIf the target language is C, this has the same effect as\",\n        \"\\t`--c-debug' (see below).\",\n        \"\\tIf the target language is IL or C#, this causes the compiler to\",\n        \"\\tpass `/debug' to the IL assembler or C# compiler.)\",\n\n        \"--cc <compiler-name>\",\n        \"\\tSpecify which C compiler to use.\",\n\n        \"--no-c-optimize\",\n        \"\\tDon't enable the C compiler's optimizations.\",\n\n        \"--no-ansi-c\",\n        \"\\tDon't specify to the C compiler that the ANSI dialect\",\n        \"\\tof C should be used.  Use the full contents of system\",\n        \"\\theaders, rather than the ANSI subset.\",\n\n        \"--c-debug\",\n        \"\\tEnable debugging of the generated C code.\",\n        \"\\t(This has the same effect as `--cflags \"\"-g\"\"'\",\n        \"\\tand disables stripping of the executable.)\",\n\n        \"--c-include-directory <dir>, --c-include-dir <dir>\",\n        \"\\tAppend <dir> to the list of directories to be searched for\",\n        \"\\tC header files.  Note that if you want to override\",\n        \"\\tthis list, rather than append to it, then you can set the\",\n        \"\\t`MERCURY_MC_ALL_C_INCL_DIRS' environment variable to a\",\n        \"\\tsequence of `--c-include-directory' options.\",\n\n        \"--inline-alloc\",\n        \"\\tInline calls to GC_malloc().\",\n        \"\\tThis can improve performance a fair bit,\",\n        \"\\tbut may significantly increase code size.\",\n        \"\\tThis option has no effect if `--gc boehm'\",\n        \"\\tis not set or if the C compiler is not GNU C.\",\n\n        \"--cflags <options>, --cflag <option>\",\n        \"\\tSpecify options to be passed to the C compiler.\",\n        \"\\t`--cflag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n\n        % The --gcc-flags, --gcc-flag, --clang-flags, --clang-flag,\n        % --msvc-flags and --msvc-flag options are an internal\n        % part of the implementation of mmc --make; they are deliberately\n        % not documented.\n\n        % The --cflags-for-regs, --cflags-for-gotos,\n        % --cflags-for-threads, --cflags-for-pic,\n        % --cflags-for-warnings, --cflags-for-ansi,\n        % --cflags-for-optimization, --c-flag-to-name-object-file,\n        % --object-file-extension, --pic-object-file-extension\n        % and --link-with-pic-object-file-extension\n        % options are reserved for use by the `mmc' script;\n        % they are deliberately not documented.\n\n        \"--javac <javac>\",\n        \"--java-compiler <javac>\",\n        \"\\tSpecify which Java compiler to use.  The default is `javac'.\",\n\n        \"--java-interpreter <java>\",\n        \"\\tSpecify which Java interpreter to use.\",\n        \"\\tThe default is `java'\",\n\n        \"--java-flags <options>, --java-flag <option>\",\n        \"\\tSpecify options to be passed to the Java compiler.\",\n        \"\\t`--java-flag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n\n        \"--java-classpath <path>\",\n        \"\\tSet the classpath for the Java compiler.\",\n\n        \"--java-object-file-extension <ext>\",\n        \"\\tSpecify an extension for Java object (bytecode) files\",\n        \"\\tBy default this is `.class'.\",\n\n% IL options are commented out to reduce confusion.\n%       \"--il-assembler <ilasm>\",\n%       \"\\tSpecify the name of the .NET IL Assembler command.\",\n%       \"--ilasm-flags <options>, --ilasm-flag <options>\",\n%       \"\\tSpecify options to be passed to the IL assembler.\",\n%       \"\\t`--ilasm-flag' should be used for single words which need\",\n%       \"\\tto be quoted when passed to the shell.\",\n\n        \"--csharp-compiler <csc>\",\n        \"\\tSpecify the name of the C# Compiler.  The default is `csc'.\",\n        \"--csharp-flags <options>, --csharp-flag <option>\",\n        \"\\tSpecify options to be passed to the C# compiler.\",\n        \"\\t`--csharp-flag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n        \"--cli-interpreter <prog>\",\n        \"\\tSpecify the program that implements the Common Language\",\n        \"\\tInfrastructure (CLI) execution environment, e.g. `mono'.\",\n\n        \"--erlang-compiler <erlc>\",\n        \"\\tSpecify the name of the Erlang compiler.\",\n        \"\\tThe default is `erlc'.\",\n        \"--erlang-interpreter <erl>\",\n        \"\\tSpecify the name of the Erlang interpreter.\",\n        \"\\tThe default is `erl'.\",\n        \"--erlang-flags <options>, --erlang-flag <option>\",\n        \"\\tSpecify options to be passed to the Erlang compiler.\",\n        \"\\t`--erlang-flag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n        \"--erlang-include-directory <dir>, --erlang-include-dir <dir>\",\n        \"\\tAppend <dir> to the list of directories to be searched for\",\n        \"\\tErlang header files (.hrl).\",\n        \"--erlang-native-code\",\n        \"\\tAdd `+native' to the list of flags passed to the\",\n        \"\\tErlang compiler.  Cancelled out by `--no-erlang-native code'\",\n        \"\\tso it is useful when you wish to enable native code\",\n        \"\\tgeneration for all modules except for a select few.\",\n        \"--no-erlang-inhibit-trivial-warnings\",\n        \"\\tDo not add `+nowarn_unused_vars +nowarn_unused_function' to the\",\n        \"\\tlist of flags passed to the Erlang compiler.\"\n\n        % --erlang-object-file-extension is deliberately not documented.\n        % It is not fully implemented and not very useful.\n    ]).\n\n:- pred options_help_link(io::di, io::uo) is det.\n\noptions_help_link -->\n    io.write_string(\"\\nLink Options:\\n\"),\n    write_tabbed_lines([\n        \"-o <filename>, --output-file <filename>\",\n        \"\\tSpecify the name of the final executable.\",\n        \"\\t(The default executable name is the same as the name\",\n        \"\\tof the first module on the command line.)\",\n        \"\\tThis option is ignored by `mmc --make'.\",\n        \"--ld-flags <options>, --ld-flag <option>\",\n        \"\\tSpecify options to be passed to the linker command\",\n        \"\\tinvoked by ml to link an executable.\",\n        \"\\tUse `ml --print-link-command' to find out which\",\n        \"\\tcommand is used.\",\n        \"\\t`--ld-flag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n        \"--ld-libflags <options>, --ld-libflag <option>\",\n        \"\\tSpecify options to be passed to the linker command\",\n        \"\\tinvoked by ml to link a shared library.\",\n        \"\\tUse `ml --print-shared-lib-link-command' to find out\",\n        \"\\twhich command is used.\",\n        \"\\t`--ld-libflag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n        \"-L <directory>, --library-directory <directory>\",\n        \"\\tAppend <directory> to the list of directories in which\",\n        \"\\tto search for libraries.\",\n        \"-R <directory>, --runtime-library-directory <directory>\",\n        \"\\tAppend <directory> to the list of directories in which\",\n        \"\\tto search for shared libraries at runtime.\",\n        \"--shlib-linker-install-name-path <directory>\",\n        \"\\tSpecify the path where a shared library will be installed.\",\n        \"\\tThis option is useful on systems where the runtime search\",\n        \"\\tpath is obtained from the shared library and not via the\",\n        \"\\t-R option above (such as Mac OS X).\",\n        \"-l <library>, --library <library>\",\n        \"\\tLink with the specified library.\",\n        \"--link-object <object-file>\",\n        \"\\tLink with the specified object file.\",\n        \"--search-lib-files-dir <directory>\",\n        \"--search-library-files-directory <directory>\",\n        \"\\tSearch <directory> for Mercury library files have not yet been\",\n        \"\\tinstalled.  Similar to adding <directory> using all of the\",\n        \"\\t`--search-directory', `--intermod-directory',\",\n        \"\\t`--library-directory', `--init-file-directory' and\",\n        \"\\t`--c-include-directory' options.\",\n        \"--mld <directory>, --mercury-library-directory <directory>\",\n        \"\\tAppend <directory> to the list of directories to\",\n        \"\\tbe searched for Mercury libraries. This will add\",\n        \"\\t`--search-directory', `--library-directory',\",\n        \"\\t`--init-file-directory' and `--c-include-directory'\",\n        \"\\toptions as needed.\",\n        \"--mercury-standard-library-directory <directory>\",\n        \"--mercury-stdlib-dir <directory>\",\n        \"\\tSearch <directory> for the Mercury standard library.\",\n        \"\\tImplies `--mercury-library-directory <directory>'\",\n        \"\\tand `--mercury-configuration-directory <directory>'.\",\n        \"--no-mercury-standard-library-directory\",\n        \"--no-mercury-stdlib-dir\",\n        \"\\tDon't use the Mercury standard library.\",\n        \"\\tImplies `--no-mercury-configuration-directory'.\",\n        \"--ml <library>, --mercury-library <library>\",\n        \"\\tLink with the specified Mercury library.\",\n\n        \"--linkage {shared|static}\",\n        \"\\tSpecify whether to use shared or static linking for\",\n        \"\\texecutables.  Shared libraries are always linked\",\n        \"\\twith `--linkage shared'.\",\n        \"--mercury-linkage {shared|static}\",\n        \"\\tSpecify whether to use shared or static linking when\",\n        \"\\tlinking an executable with Mercury libraries.\",\n        \"\\tShared libraries are always linked with\",\n        \"\\t`--mercury-linkage shared'.\",\n\n        \"--init-file-directory <directory>\",\n        \"\\tAppend <directory> to the list of directories to\",\n        \"\\tbe searched for `.init' files by c2init.\",\n        \"--init-file <init-file>\",\n        \"\\tAppend <init-file> to the list of `.init' files to\",\n        \"\\tbe passed to c2init.\",\n        \"--trace-init-file <init-file>\",\n        \"\\tAppend <init-file> to the list of `.init' files to\",\n        \"\\tbe passed to c2init when tracing is enabled.\",\n\n        \"--no-strip\",\n        \"\\tDon't strip executables.\",\n        \"--no-demangle\",\n        \"\\tDon't pipe link errors through the Mercury demangler.\",\n        \"--no-main\",\n        \"\\tDon't generate a C main() function.  The user's code must\",\n        \"\\tprovide a main() function.\",\n        \"--no-allow-undefined\",\n        \"\\tDo not allow undefined symbols in shared libraries.\",\n        \"--no-use-readline\",\n        \"\\tDisable use of the readline library in the debugger.\",\n        \"--runtime-flags <flags>\",\n        \"\\tSpecify flags to pass to the Mercury runtime.\",\n        \"--extra-initialization-functions, --extra-inits\",\n        \"\\tSearch `.c' files for extra initialization functions.\",\n        \"\\t(This may be necessary if the C files contain\",\n        \"\\thand-coded C code with `INIT' comments, rather than\",\n        \"\\tcontaining only C code that was automatically generated\",\n        \"\\tby the Mercury compiler.)\",\n\n        \"--link-executable-command <command>\",\n        \"\\tSpecify the command used to invoke the linker when linking\",\n        \"\\tan executable.\",\n        \"--link-shared-lib-command <command>\",\n        \"\\tSpecify the command used to invoke the linker when linking\",\n        \"\\ta shared library.\",\n\n        \"--java-archive-command <command>\",\n        \"\\tSpecify the command used to produce Java archive (JAR) files.\",\n\n        \"--framework <framework>\",\n        \"\\tBuild and link against the specified framework.\",\n        \"\\t(Mac OS X only.)\",\n        \"-F <directory>, --framework-directory <directory>\",\n        \"\\tAppend the specified directory to the framework search path.\",\n        \"\\t(Mac OS X only.)\"\n\n        % The --shared-library-extension,\n        % --library-extension, --executable-file-extension\n        % --create-archive-command, --create-archive-command-flags\n        % --create-archive-command-output-flag, --ranlib-command,\n        % --ranlib-flags,\n        % --mkinit-command, --demangle-command, --filtercc-command,\n        % --trace-libs,\n        % --thread-libs, --shared-libs, --math-lib, --readline-libs,\n        % --hwloc-libs, --hwloc-static-libs,\n        % --linker-opt-separator,\n        % --linker-debug-flags, --shlib-linker-debug-flags,\n        % --linker-trace-flags, --shlib-linker-trace-flags,\n        % --linker-thread-flags, --shlib-linker-thread-flags,\n        % --linker-static-flags, --linker-strip-flag,\n        % --linker-link-lib-flag, --linker-link-lib-suffix,\n        % --shlib-linker-link-lib-flag, --shlib-linker-link-lib-suffix,\n        % --linker-path-flag, --linker-link-with-lib-flag,\n        % --linker-rpath-flag, --linker-rpath-separator,\n        % --shlib-linker-link-with-lib-flag,\n        % --shlib-linker-rpath-flag, --shlib-linker-rpath-separator,\n        % --linker-allow-undefined-flag and\n        % --linker-error-undefined-flag,\n        % --shlib-linker-install-name-flag,\n        % --shlib-linker-use-install-name,\n        % options are reserved for use by the `Mercury.config' file;\n        % they are deliberately not documented.\n    ]).\n\n:- pred options_help_build_system(io::di, io::uo) is det.\n\noptions_help_build_system -->\n    io.write_string(\"\\nBuild System Options:\\n\"),\n    write_tabbed_lines([\n        % `--invoked-by-mmc-make' is for internal use by the\n        % compiler. `mmc --make' passes it as the first argument\n        % when compiling a module.\n        \"-m, --make\",\n        \"\\tTreat the non-option arguments to `mmc' as files to\",\n        \"\\tmake, rather than source files.  Create the specified\",\n        \"\\tfiles, if they are not already up-to-date.\",\n        \"\\tNote that this option also enables `--use-subdirs'.\",\n        \"-r, --rebuild\",\n        \"\\tSame as `--make', but always rebuild the target files\",\n        \"\\teven if they are up to date.\",\n        \"-k, --keep-going\",\n        \"\\tWith `--make', keep going as far as\",\n        \"\\tpossible even if an error is detected.\",\n        \"-j <n>, --jobs <n>\",\n        \"\\tWith `--make', attempt to perform up to <n> jobs\",\n        \"\\tconcurrently for some tasks.\",\n\n        \"--track-flags\",\n        \"\\tWith `--make', keep track of the options used when compiling\",\n        \"\\teach module.  If an option for a module is added or removed,\",\n        \"\\t`mmc --make' will then know to recompile the module even if the\",\n        \"\\ttimestamp on the file itself has not changed.  Warning,\",\n        \"\\tverbosity and build system options are not tracked.\",\n\n        \"--pre-link-command <command>\",\n        \"\\tSpecify a command to run before linking with `mmc --make'.\",\n        \"\\tThis can be used to compile C source files which rely on\",\n        \"\\theader files generated by the Mercury compiler.\",\n        \"\\tThe command will be passed the names of all of the source\",\n        \"\\tfiles in the program or library, with the source file\",\n        \"\\tcontaining the main module given first.\",\n\n        \"--extra-init-command <command>\",\n        \"\\tSpecify a command to produce extra entries in the `.init'\",\n        \"\\tfile for a library.\",\n        \"\\tThe command will be passed the names of all of the source\",\n        \"\\tfiles in the program or library, with the source file\",\n        \"\\tcontaining the main module given first.\",\n\n        \"--install-prefix <dir>\",\n        \"\\tThe directory under which to install Mercury libraries.\",\n\n        % --use-symlinks is only used by Mercury.config.\n        % It controls whether the build system should attempt\n        % to use symlinks.\n\n        \"--install-command <command>\",\n        \"\\tSpecify the command to use to install the files in\",\n        \"\\tMercury libraries. The given command will be invoked as\",\n        \"\\t`<command> <source> <target>' to install each file\",\n        \"\\tin a Mercury library. The default command is `cp'.\",\n        \"--install-command-dir-option <option>\",\n        \"\\tSpecify the flag to pass to the install command to install\",\n        \"\\ta directory. The given command will be invoked as\",\n        \"\\t`<command> <option> <source> <target>'\",\n        \"\\tto install each directory. The default option is `-r'.\",\n        \"--libgrade <grade>\",\n        \"\\tAdd <grade> to the list of compilation grades in\",\n        \"\\twhich a library to be installed should be built.\",\n        \"--no-libgrade\",\n        \"\\tClear the list of compilation grades in which a library\",\n        \"\\tto be installed should be built.\",\n        \"--libgrades-include-component <component>\",\n        \"--libgrades-include <component>\",\n        \"\\tRemove grades that do not contain the specified component from\",\n        \"\\tthe set of library grades to be installed.\",\n        \"\\t(This option does not work with Mmake, only `mmc --make'.)\",\n        \"--libgrades-exclude-component <component>\",\n        \"--libgrades-exclude <component>\",\n        \"\\tRemove grades that contain the specified component from the\",\n        \"\\tset of library grades to be installed.\",\n        \"\\t(This option does not work with Mmake, only `mmc --make'.)\",\n        \"--lib-linkage {shared|static}\",\n        \"\\tSpecify whether libraries should be installed for shared\",\n        \"\\tor static linking.  This option can be specified multiple\",\n        \"\\ttimes.  By default libraries will be installed for\",\n        \"\\tboth shared and static linking.\",\n        \"--flags <file>\",\n        \"--flags-file <file>\",\n        \"\\tTake options from the specified file, and handle them\",\n        \"\\tas if they were specified on the command line.\",\n        \"--options-file <file>\",\n        \"\\tAdd <file> to the list of options files to be processed.\",\n        \"\\tIf <file> is `-', an options file will be read from the\",\n        \"\\tstandard input.  By default the file `Mercury.options'\",\n        \"\\tin the current directory will be read.\",\n        \"--options-search-directory <dir>\",\n        \"\\tAdd <dir> to the list of directories to be searched for\",\n        \"\\toptions files.\",\n        \"--mercury-configuration-directory <directory>\",\n        \"--mercury-config-dir <directory>\",\n        \"\\tSearch <directory> for Mercury system's configuration files.\",\n        \"--config-file <file>\",\n        \"\\tRead the Mercury compiler's configuration information\",\n        \"\\tfrom <file>.  If the `--config-file' option is not set,\",\n        \"\\ta default configuration will be used, unless\",\n        \"\\t`--no-mercury-stdlib-dir' is passed to mmc.\",\n        \"\\tThe configuration file is just an options file.\",\n        \"-I <dir>, --search-directory <dir>\",\n        \"\\tAppend <dir> to the list of directories to be searched for\",\n        \"\\timported modules.\",\n        \"--intermod-directory <dir>\",\n        \"\\tAdd <dir> to the list of directories to be\",\n        \"\\tsearched for `.opt' files.\",\n        \"--no-use-search-directories-for-intermod\",\n        \"\\tDon't add arguments to `--search-directory' to the list\",\n        \"\\tof directories to search for `.opt' files - use only the\",\n        \"\\tdirectories given by `--intermod-directory'.\",\n        \"--use-subdirs\",\n        \"\\tGenerate intermediate files in a `Mercury' subdirectory,\",\n        \"\\trather than generating them in the current directory.\",\n        \"--use-grade-subdirs\",\n        \"\\tGenerate intermediate files in a `Mercury' subdirectory,\",\n        \"\\tlaid out so that multiple grades can be built simultaneously.\",\n        \"\\tExecutables and libraries will be symlinked or copied into\",\n        \"\\tthe current directory.\",\n        \"\\t`--use-grade-subdirs' does not work with Mmake (it does\",\n        \"\\twork with `mmc --make').\",\n        \"--no-libgrade-install-check\",\n        \"\\tDo not check that libraries have been installed before\",\n        \"\\tattempting to use them.  (This option is only meaningful with\",\n        \"\\t`mmc --make'.)\",\n        \"--order-make-by-timestamp\",\n        \"\\tMake `mmc --make' compile more recently modified source files\",\n        \"\\tfirst.\",\n        \"--show-make-times\",\n        \"\\tReport run times for commands executed by `mmc --make'.\",\n        \"--extra-library-header <file>, --extra-lib-header <file>\",\n        \"\\tInstall the specified C header file with along with\",\n        \"\\ta Mercury library.\",\n        \"\\t(This option is only supported by `mmc --make'.)\",\n        \"--restricted-command-line\",\n        \"\\tEnable this option if your shell doesn't support long command lines.\",\n        \"\\tThis option uses temporary files to pass arguments to sub-commands.\",\n        \"\\t(This option is only supported by `mmc --make'.)\",\n        \"--env-type <type>\",\n        \"\\tSpecify the environment type in which the compiler and generated\",\n        \"\\tprograms will be invoked.\",\n        \"\\tThe <type> should be one of `posix', `cygwin', `msys', or `windows'.\",\n        \"\\tThis option is equivalent to setting both --host-env-type and\",\n        \"\\t--target-env-type to <type>.\",\n        \"--host-env-type <type>\",\n        \"\\tSpecify the environment type in which the compiler will be\",\n        \"\\tinvoked.\",\n        \"--target-env-type <type>\",\n        \"\\tSpecify the environment type in which generated programs will be\",\n        \"\\tinvoked.\"\n    ]).\n\n:- pred options_help_misc(io::di, io::uo) is det.\n\noptions_help_misc -->\n    io.write_string(\"\\nMiscellaneous Options:\\n\"),\n    write_tabbed_lines([\n        \"--filenames-from-stdin\",\n        \"\\tRead then compile a newline terminated module name or\",\n        \"\\tfile name from the standard input. Repeat this until EOF\",\n        \"\\tis reached. (This allows a program or user to interactively\",\n        \"\\tcompile several modules without the overhead of process\",\n        \"\\tcreation for each one.)\",\n        \"--typecheck-ambiguity-warn-limit <n>\",\n        \"\\tSet the number of type assignments required to generate a\",\n        \"\\twarning about highly ambiguous overloading to <n>.\",\n        \"--typecheck-ambiguity-error-limit <n>\",\n        \"\\tSet the number of type assignments required to generate an error\",\n        \"\\tabout excessively ambiguous overloading to <n>. If this limit is\",\n        \"\\treached, the typechecker will not process the predicate or\",\n        \"\\tfunction any further.\",\n        \"--version\",\n        \"\\tDisplay the compiler version.\",\n\n        % The `--fullarch' option is reserved for\n        % use by the `Mercury.config' file.\n\n        \"--cross-compiling\",\n        \"\\tDo not assume that the code being generated is for the\",\n        \"\\tplatform the compiler is running on.\",\n\n        % The `--local-module-id' option is used by `mmc --make'.\n        % The `--analysis-file-cache-dir' option is used by `mmc --make'.\n\n%        \"--ignore-parallel-conjunctions\",\n%        \"\\tReplace parallel conjunctions with plain ones, this is useful\",\n%        \"\\tfor benchmarking.  Note that it does not affect implicit\",\n%        \"\\tparallelism\",\n\n        \"--control-granularity\",\n        \"\\tDon't try to generate more parallelism than the machine can\",\n        \"\\thandle, which may be specified at runtime or detected\",\n        \"\\tautomatically.\",\n        \"--distance-granularity <distance>\",\n        \"\\tControl the granularity of parallel execution using the\",\n        \"\\tspecified distance value.\",\n        \"--implicit-parallelism\",\n        \"\\tIntroduce parallel conjunctions where it could be worthwhile\",\n        \"\\t(implicit parallelism) using information generated by\",\n        \"\\tmdprof_create_feedback.\",\n        \"\\tThe profiling feedback file can be specified using the\",\n        \"\\t--feedback file option.\",\n\n        \"--feedback-file\",\n        \"\\tUse the specified profiling feedback file which may currently\",\n        \"\\tonly be processed for implicit parallelism.\"\n    ]).\n\n:- pred write_tabbed_lines(list(string)::in, io::di, io::uo) is det.\n\nwrite_tabbed_lines([], !IO).\nwrite_tabbed_lines([Str | Strs], !IO) :-\n    io.write_char('\\t', !IO),\n    io.write_string(Str, !IO),\n    io.write_char('\\n', !IO),\n    write_tabbed_lines(Strs, !IO).\n\n%-----------------------------------------------------------------------------%\n:- end_module libs.options.\n%-----------------------------------------------------------------------------%\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mercury/polymorphism.m",
    "content": "%-----------------------------------------------------------------------------%\n% vim: ft=mercury ts=4 sw=4 et\n%-----------------------------------------------------------------------------%\n% Copyright (C) 1995-2012 The University of Melbourne.\n% This file may only be copied under the terms of the GNU General\n% Public License - see the file COPYING in the Mercury distribution.\n%-----------------------------------------------------------------------------%\n%\n% File: polymorphism.m.\n% Main authors: fjh and zs.\n%\n% This module is a pass over the HLDS.\n% It does a syntactic transformation to implement polymorphism, including\n% typeclasses, by passing extra `type_info' and `typeclass_info' arguments.\n% These arguments are structures that contain, amongst other things,\n% higher order predicate terms for the polymorphic procedures or methods.\n%\n% See notes/type_class_transformation.html for a description of the\n% transformation and data structures used to implement type classes.\n%\n% XXX The way the code in this module handles existential type classes\n% and type class constraints is a bit ad hoc, in general; there are\n% definitely parts of this code (marked with XXXs below) that could\n% do with a rewrite to make it more consistent and hence more maintainable.\n%\n%-----------------------------------------------------------------------------%\n%\n% Transformation of polymorphic code:\n%\n% Every polymorphic predicate is transformed so that it takes one additional\n% argument for every type variable in the predicate's type declaration.\n% The argument gives information about the type, including higher order\n% predicate variables for each of the builtin polymorphic operations\n% (currently unify/2, compare/3).\n%\n%-----------------------------------------------------------------------------%\n%\n% Representation of type information:\n%\n% IMPORTANT: ANY CHANGES TO THE DOCUMENTATION HERE MUST BE REFLECTED BY\n% SIMILAR CHANGES TO THE #defines IN \"runtime/mercury_type_info.h\" AND\n% TO THE TYPE SPECIALIZATION CODE IN \"compiler/higher_order.m\".\n%\n% Type information is represented using one or two cells. The cell which\n% is always present is the type_ctor_info structure, whose structure is\n% defined in runtime/mercury_type_info.h. The other cell is the type_info\n% structure, laid out like this:\n%\n%   word 0      <pointer to the type_ctor_info structure>\n%   word 1+     <the type_infos for the type params, at least one>\n%\n%   (but see note below for how variable arity types differ)\n%\n%-----------------------------------------------------------------------------%\n%\n% Optimization of common case (zero arity types):\n%\n% The type_info structure itself is redundant if the type has no type\n% parameters (i.e. its arity is zero). Therefore if the arity is zero,\n% we pass the address of the type_ctor_info structure directly, instead of\n% wrapping it up in another cell. The runtime system will look at the first\n% field of the cell it is passed. If this field is zero, the cell is a\n% type_ctor_info structure for an arity zero type. If this field is not zero,\n% the cell is a new type_info structure, with the first field being the\n% pointer to the type_ctor_info structure.\n%\n%-----------------------------------------------------------------------------%\n%\n% Variable arity types:\n%\n% There is a slight variation on this for variable-arity type constructors, of\n% there are exactly three: pred, func and tuple. Typeinfos of these types\n% always have a pointer to the pred/0, func/0 or tuple/0 type_ctor_info,\n% regardless of their true arity, so we store the real arity in the type_info\n% as well.\n%\n%   word 0      <pointer to the arity 0 type_ctor_info structure>\n%   word 1      <arity of predicate>\n%   word 2+     <the type_infos for the type params, if any>\n%\n%-----------------------------------------------------------------------------%\n%\n% Sharing type_ctor_info structures:\n%\n% For compilation models that can put code addresses in static ground terms,\n% we can arrange to create one copy of the type_ctor_info structure statically,\n% avoiding the need to create other copies at runtime. For compilation models\n% that cannot put code addresses in static ground terms, there are a couple\n% of things we could do:\n%\n%   1. allocate all cells at runtime.\n%   2. use a shared static type_ctor_info, but initialize its code\n%      addresses during startup (that is, during the module\n%      initialization code).\n%\n% We use option 2.\n%\n%-----------------------------------------------------------------------------%\n%\n% Example of transformation:\n%\n% Take the following code as an example, ignoring the requirement for\n% superhomogeneous form for clarity:\n%\n%   :- pred p(T1).\n%   :- pred q(T2).\n%   :- pred r(T3).\n%\n%   p(X) :- q([X]), r(0).\n%\n% We add an extra argument for each type variable:\n%\n%   :- pred p(type_info(T1), T1).\n%   :- pred q(type_info(T2), T2).\n%   :- pred r(type_info(T3), T3).\n%\n% We transform the body of p to this:\n%\n%   p(TypeInfoT1, X) :-\n%       TypeCtorInfoT2 = type_ctor_info(list/1),\n%       TypeInfoT2 = type_info(TypeCtorInfoT2, TypeInfoT1),\n%       q(TypeInfoT2, [X]),\n%       TypeInfoT3 = type_ctor_info(int/0),\n%       r(TypeInfoT3, 0).\n%\n% Note that type_ctor_infos are actually generated as references to a\n% single shared type_ctor_info.\n%\n%-----------------------------------------------------------------------------%\n%-----------------------------------------------------------------------------%\n%\n% Transformation of code using existentially quantified types:\n%\n% The transformation for existential types is similar to the transformation\n% for universally quantified types, except that the type_infos and\n% type_class_infos have mode `out' rather than mode `in'.\n%\n% The argument passing convention is that the new parameters\n% introduced by this pass are placed in the following order:\n%\n%   First the type_infos for unconstrained universally quantified type\n%   variables, in the order that the type variables first appear in the\n%   argument types;\n%\n%   then the type_infos for unconstrained existentially quantified type\n%   variables, in the order that the type variables first appear in the\n%   argument types;\n%\n%   then the typeclass_infos for universally quantified constraints,\n%   in the order that the constraints appear in the class context;\n%\n%   then the typeclass_infos for existentially quantified constraints,\n%   in the order that the constraints appear in the class context;\n%\n%   and finally the original arguments of the predicate.\n%\n% Bear in mind that for the purposes of this (and most other) calculations,\n% the return parameter of a function counts as the _last_ argument.\n%\n% The convention for class method implementations is slightly different\n% to match the order that the type_infos and typeclass_infos are passed\n% in by do_call_class_method (in runtime/mercury_ho_call.c):\n%\n%   First the type_infos for the unconstrained type variables in the\n%   instance declaration, in the order that the type variables first appear\n%   in the instance arguments;\n%\n%   then the typeclass_infos for the class constraints on the instance\n%   declaration, in the order that the constraints appear in the declaration;\n%\n%   then the remainder of the arguments as above.\n%\n%-----------------------------------------------------------------------------%\n%-----------------------------------------------------------------------------%\n\n:- module check_hlds.polymorphism.\n:- interface.\n\n:- import_module hlds.\n:- import_module hlds.hlds_goal.\n:- import_module hlds.hlds_module.\n:- import_module hlds.hlds_pred.\n:- import_module hlds.hlds_rtti.\n:- import_module mdbcomp.\n:- import_module mdbcomp.prim_data.\n:- import_module parse_tree.\n:- import_module parse_tree.prog_data.\n\n:- import_module list.\n:- import_module maybe.\n:- import_module term.\n\n%-----------------------------------------------------------------------------%\n\n    % Run the polymorphism pass over the whole HLDS.\n    %\n:- pred polymorphism_process_module(module_info::in, module_info::out) is det.\n\n    % Run the polymorphism pass over a single pred. This is used to transform\n    % clauses introduced by unify_proc.m for complicated unification predicates\n    % for types for which unification predicates are generated lazily.\n    %\n    % This predicate should be used with caution. polymorphism.m expects that\n    % the argument types of called predicates have not been transformed yet.\n    % This predicate will not work correctly after the original pass of\n    % polymorphism has been run if the predicate to be processed calls\n    % any polymorphic predicates which require type_infos or typeclass_infos\n    % to be added to the argument list.\n    %\n:- pred polymorphism_process_generated_pred(pred_id::in,\n    module_info::in, module_info::out) is det.\n\n    % Add the type_info variables for a complicated unification to\n    % the appropriate fields in the unification and the goal_info.\n    %\n:- pred unification_typeinfos_rtti_varmaps(mer_type::in, rtti_varmaps::in,\n    unification::in, unification::out, hlds_goal_info::in, hlds_goal_info::out)\n    is det.\n\n    % Add the type_info variables for a new call goal. This predicate assumes\n    % that process_module has already been run so the called pred has already\n    % been processed.\n    %\n    % XXX This predicate does not yet handle calls whose arguments include\n    % existentially quantified types or type class constraints.\n    %\n:- pred polymorphism_process_new_call(pred_info::in, proc_info::in,\n    pred_id::in, proc_id::in, list(prog_var)::in, builtin_state::in,\n    maybe(call_unify_context)::in, sym_name::in, hlds_goal_info::in,\n    hlds_goal::out, poly_info::in, poly_info::out) is det.\n\n    % Given a list of types, create a list of variables to hold the type_info\n    % for those types, and create a list of goals to initialize those type_info\n    % variables to the appropriate type_info structures for the types.\n    % Update the varset and vartypes accordingly.\n    %\n:- pred polymorphism_make_type_info_vars(list(mer_type)::in, term.context::in,\n    list(prog_var)::out, list(hlds_goal)::out, poly_info::in, poly_info::out)\n    is det.\n\n    % Likewise, but for a single type.\n    %\n:- pred polymorphism_make_type_info_var(mer_type::in, term.context::in,\n    prog_var::out, list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\n:- type int_or_var\n    --->    iov_int(int)\n    ;       iov_var(prog_var).\n\n    % gen_extract_type_info(ModuleInfo, TypeVar, Kind, TypeClassInfoVar,\n    %   IndexIntOrVar, Goals, TypeInfoVar, ...):\n    %\n    % Generate code to extract a type_info variable from a given slot of a\n    % typeclass_info variable, by calling type_info_from_typeclass_info from\n    % private_builtin. TypeVar is the type variable to which this type_info\n    % variable corresponds. Kind is the kind of the type variable.\n    % TypeClassInfoVar is the variable holding the type_class_info.\n    % Index specifies which slot it is. The procedure returns TypeInfoVar,\n    % which is a fresh variable holding the type_info, and Goals, which is\n    % the code generated to initialize TypeInfoVar.\n    %\n:- pred gen_extract_type_info(module_info::in, tvar::in, kind::in,\n    prog_var::in, int_or_var::in, list(hlds_goal)::out, prog_var::out,\n    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,\n    rtti_varmaps::in, rtti_varmaps::out) is det.\n\n:- type poly_info.\n\n    % Extract some fields from a pred_info and proc_info and use them to\n    % create a poly_info, for use by the polymorphism transformation.\n    %\n:- pred create_poly_info(module_info::in, pred_info::in,\n    proc_info::in, poly_info::out) is det.\n\n    % Update the fields in a pred_info and proc_info with\n    % the values in a poly_info.\n    %\n:- pred poly_info_extract(poly_info::in, pred_info::in, pred_info::out,\n    proc_info::in, proc_info::out, module_info::out) is det.\n\n    % Build the type describing the typeclass_info for the\n    % given prog_constraint.\n    %\n:- pred build_typeclass_info_type(prog_constraint::in, mer_type::out) is det.\n\n    % Check if a type is the `typeclass_info' type introduced by this pass.\n    %\n:- pred type_is_typeclass_info(mer_type::in) is semidet.\n\n    % Check if a type is either the `type_info' type or the\n    % `type_ctor_info' type introduced by this pass.\n    %\n:- pred type_is_type_info_or_ctor_type(mer_type::in) is semidet.\n\n    % Construct the type of the type_info for the given type.\n    %\n:- pred build_type_info_type(mer_type::in, mer_type::out) is det.\n\n    % Look up the pred_id and proc_id for a type specific\n    % unification/comparison/index/initialise predicate.\n    %\n:- pred get_special_proc(mer_type::in, special_pred_id::in,\n    module_info::in, sym_name::out, pred_id::out, proc_id::out) is semidet.\n:- pred get_special_proc_det(mer_type::in, special_pred_id::in,\n    module_info::in, sym_name::out, pred_id::out, proc_id::out) is det.\n\n    % Convert a higher order pred term to a lambda goal.\n    %\n:- pred convert_pred_to_lambda_goal(purity::in, lambda_eval_method::in,\n    prog_var::in, pred_id::in, proc_id::in, list(prog_var)::in,\n    list(mer_type)::in, unify_context::in, hlds_goal_info::in, context::in,\n    module_info::in, unify_rhs::out, prog_varset::in, prog_varset::out,\n    vartypes::in, vartypes::out) is det.\n\n    % fix_undetermined_mode_lambda_goal(ProcId, Functor0, Functor, ModuleInfo)\n    %\n    % This is called by mode checking when it figures out which mode that a\n    % lambda goal converted from a higher order pred term should call.\n    % Functor0 must have been produced by `convert_pred_to_lambda_goal'.\n    %\n:- pred fix_undetermined_mode_lambda_goal(proc_id::in,\n    unify_rhs::in(rhs_lambda_goal), unify_rhs::out(rhs_lambda_goal),\n    module_info::in) is det.\n\n    % init_type_info_var(Type, ArgVars, TypeInfoVar, TypeInfoGoal,\n    %   !VarSet, !VarTypes) :-\n    %\n    % Create the unification the constructs the second cell of a type_info\n    % for Type. ArgVars should contain the arguments of this unification.\n    %\n    % This unification WILL lead to the creation of cells on the heap\n    % at runtime.\n    %\n    % The first variable in ArgVars should be bound to the type_ctor_info\n    % for Type's principal type constructor. If that type constructor is\n    % variable arity, the next variable in ArgVars should be bound to an\n    % integer giving Type's actual arity. The remaining variables in\n    % ArgVars should be bound to the type_infos or type_ctor_infos giving\n    % Type's argument types.\n    %\n:- pred init_type_info_var(mer_type::in, list(prog_var)::in,\n    maybe(prog_var)::in, prog_var::out, hlds_goal::out,\n    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,\n    rtti_varmaps::in, rtti_varmaps::out) is det.\n\n    % init_const_type_ctor_info_var(Type, TypeCtor,\n    %   TypeCtorInfoVar, TypeCtorConsId, TypeCtorInfoGoal,\n    %   !VarSet, !VarTypes, !RttiVarMaps):\n    %\n    % Create the unification (returned as TypeCtorInfoGoal) that binds a\n    % new variable (returned as TypeCtorInfoVar) to the type_ctor_info\n    % representing TypeCtor. This will be the constant represented by\n    % TypeCtorConsId.\n    %\n    % This unification WILL NOT lead to the creation of a cell on the\n    % heap at runtime; it will cause TypeCtorInfoVar to refer to the\n    % statically allocated type_ctor_info cell for the type, allocated\n    % in the module that defines the type.\n    %\n    % We take Type as input for historical reasons: we record Type as\n    % the type whose type constructor TypeCtor is, in the type of\n    % TypeCtorInfoVar.\n    %\n:- pred init_const_type_ctor_info_var(mer_type::in, type_ctor::in,\n    prog_var::out, cons_id::out, hlds_goal::out,\n    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,\n    rtti_varmaps::in, rtti_varmaps::out) is det.\n\n:- type type_info_kind\n    --->    type_info\n    ;       type_ctor_info.\n\n:- pred new_type_info_var_raw(mer_type::in, type_info_kind::in,\n    prog_var::out, prog_varset::in, prog_varset::out,\n    vartypes::in, vartypes::out, rtti_varmaps::in, rtti_varmaps::out) is det.\n\n%-----------------------------------------------------------------------------%\n%-----------------------------------------------------------------------------%\n\n:- implementation.\n\n:- import_module check_hlds.clause_to_proc.\n:- import_module check_hlds.mode_util.\n:- import_module check_hlds.type_util.\n:- import_module hlds.from_ground_term_util.\n:- import_module hlds.const_struct.\n:- import_module hlds.goal_util.\n:- import_module hlds.hlds_args.\n:- import_module hlds.hlds_clauses.\n:- import_module hlds.hlds_code_util.\n:- import_module hlds.hlds_data.\n:- import_module hlds.instmap.\n:- import_module hlds.passes_aux.\n:- import_module hlds.pred_table.\n:- import_module hlds.quantification.\n:- import_module hlds.special_pred.\n:- import_module libs.\n:- import_module libs.globals.\n:- import_module libs.options.\n:- import_module mdbcomp.goal_path.\n:- import_module mdbcomp.prim_data.\n:- import_module mdbcomp.program_representation.\n:- import_module parse_tree.builtin_lib_types.\n:- import_module parse_tree.prog_mode.\n:- import_module parse_tree.prog_type.\n:- import_module parse_tree.prog_type_subst.\n:- import_module parse_tree.set_of_var.\n\n:- import_module assoc_list.\n:- import_module bool.\n:- import_module int.\n:- import_module io.\n:- import_module map.\n:- import_module pair.\n:- import_module require.\n:- import_module set.\n:- import_module solutions.\n:- import_module string.\n:- import_module term.\n:- import_module varset.\n\n%-----------------------------------------------------------------------------%\n%\n% This whole section just traverses the module structure.\n% We do two passes, the first to fix up the clauses_info and proc_infos\n% (and in fact everything except the pred_info argtypes), the second to fix up\n% the pred_info argtypes. The reason we need two passes is that the first pass\n% looks at the argtypes of the called predicates, and so we need to make\n% sure we don't muck them up before we've finished the first pass.\n\npolymorphism_process_module(!ModuleInfo) :-\n    module_info_get_preds(!.ModuleInfo, Preds0),\n    map.keys(Preds0, PredIds0),\n    list.foldl(maybe_polymorphism_process_pred, PredIds0, !ModuleInfo),\n    module_info_get_preds(!.ModuleInfo, Preds1),\n    map.keys(Preds1, PredIds1),\n    list.foldl(fixup_pred_polymorphism, PredIds1, !ModuleInfo),\n    expand_class_method_bodies(!ModuleInfo).\n\n:- pred maybe_polymorphism_process_pred(pred_id::in,\n    module_info::in, module_info::out) is det.\n\nmaybe_polymorphism_process_pred(PredId, !ModuleInfo) :-\n    module_info_pred_info(!.ModuleInfo, PredId, PredInfo),\n    (\n        PredModule = pred_info_module(PredInfo),\n        PredName = pred_info_name(PredInfo),\n        PredArity = pred_info_orig_arity(PredInfo),\n        no_type_info_builtin(PredModule, PredName, PredArity)\n    ->\n        % Just copy the clauses to the proc_infos.\n        copy_module_clauses_to_procs([PredId], !ModuleInfo)\n    ;\n        polymorphism_process_pred_msg(PredId, !ModuleInfo)\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- pred fixup_pred_polymorphism(pred_id::in,\n    module_info::in, module_info::out) is det.\n\nfixup_pred_polymorphism(PredId, !ModuleInfo) :-\n    % Recompute the arg types by finding the headvars and the var->type mapping\n    % (from the clauses_info) and applying the type mapping to the extra\n    % headvars to get the new arg types. Note that we are careful to only apply\n    % the mapping to the extra head vars, not to the originals, because\n    % otherwise we would stuff up the arg types for unification predicates for\n    % equivalence types.\n\n    module_info_get_preds(!.ModuleInfo, PredTable0),\n    map.lookup(PredTable0, PredId, PredInfo0),\n    pred_info_get_clauses_info(PredInfo0, ClausesInfo0),\n    clauses_info_get_vartypes(ClausesInfo0, VarTypes0),\n    clauses_info_get_headvars(ClausesInfo0, HeadVars),\n\n    pred_info_get_arg_types(PredInfo0, TypeVarSet, ExistQVars, ArgTypes0),\n    proc_arg_vector_partition_poly_args(HeadVars, ExtraHeadVarList,\n        OldHeadVarList),\n\n    lookup_var_types(VarTypes0, ExtraHeadVarList, ExtraArgTypes),\n    ArgTypes = ExtraArgTypes ++ ArgTypes0,\n    pred_info_set_arg_types(TypeVarSet, ExistQVars, ArgTypes,\n        PredInfo0, PredInfo1),\n\n    % If the clauses bind some existentially quantified type variables,\n    % introduce exists_casts goals for affected head variables, including\n    % the new type_info and typeclass_info arguments. Make sure the types\n    % of the internal versions of type_infos for those type variables in the\n    % variable types map are as specific as possible.\n\n    (\n        ExistQVars = [_ | _],\n        % This can fail for unification procedures of equivalence types.\n        lookup_var_types(VarTypes0, OldHeadVarList, OldHeadVarTypes),\n        type_list_subsumes(ArgTypes0, OldHeadVarTypes, Subn),\n        \\+ map.is_empty(Subn)\n    ->\n        pred_info_set_existq_tvar_binding(Subn, PredInfo1, PredInfo2),\n        polymorphism_introduce_exists_casts_pred(!.ModuleInfo, PredInfo2,\n            PredInfo)\n    ;\n        PredInfo = PredInfo1\n    ),\n\n    map.det_update(PredId, PredInfo, PredTable0, PredTable),\n    module_info_set_preds(PredTable, !ModuleInfo).\n\n:- pred polymorphism_introduce_exists_casts_pred(module_info::in,\n    pred_info::in, pred_info::out) is det.\n\npolymorphism_introduce_exists_casts_pred(ModuleInfo, !PredInfo) :-\n    pred_info_get_procedures(!.PredInfo, Procs0),\n    map.map_values_only(\n        (pred(!.ProcInfo::in, !:ProcInfo::out) is det :-\n            % Add the extra goals to each procedure.\n            introduce_exists_casts_proc(ModuleInfo, !.PredInfo, !ProcInfo)\n        ), Procs0, Procs),\n    pred_info_set_procedures(Procs, !PredInfo).\n\n%---------------------------------------------------------------------------%\n\n:- pred polymorphism_process_pred_msg(pred_id::in,\n    module_info::in, module_info::out) is det.\n\npolymorphism_process_pred_msg(PredId, !ModuleInfo) :-\n    % Since polymorphism transforms not just the procedures defined\n    % in the module being compiled, but also all the procedures in\n    % all the imported modules, this message can be printed A LOT,\n    % even though it is almost never of interest.\n    % That is why we enable it only when requested.\n\n    trace [compiletime(flag(\"poly_msgs\")), io(!IO)] (\n        write_pred_progress_message(\"% Transforming polymorphism for \",\n            PredId, !.ModuleInfo, !IO)\n    ),\n    polymorphism_process_pred(PredId, !ModuleInfo).\n\npolymorphism_process_generated_pred(PredId, !ModuleInfo) :-\n    polymorphism_process_pred(PredId, !ModuleInfo),\n    fixup_pred_polymorphism(PredId, !ModuleInfo).\n\n:- mutable(selected_pred, bool, no, ground, [untrailed]).\n:- mutable(level, int, 0, ground, [untrailed]).\n\n:- pred polymorphism_process_pred(pred_id::in,\n    module_info::in, module_info::out) is det.\n\npolymorphism_process_pred(PredId, !ModuleInfo) :-\n    trace [compiletime(flag(\"debug_poly_caches\"))] (\n        promise_pure (\n            % Replace 99999 with the id of the predicate you want to debug.\n            ( pred_id_to_int(PredId) = 15 ->\n                impure set_selected_pred(yes)\n            ;\n                true\n            )\n        )\n    ),\n\n    module_info_pred_info(!.ModuleInfo, PredId, PredInfo0),\n\n    % Run the polymorphism pass over the clauses_info, updating the headvars,\n    % goals, varsets, types, etc., and computing some information in the\n    % poly_info.\n\n    pred_info_get_clauses_info(PredInfo0, ClausesInfo0),\n    polymorphism_process_clause_info(!.ModuleInfo, PredInfo0,\n        ClausesInfo0, ClausesInfo, Info, ExtraArgModes),\n    poly_info_get_module_info(Info, !:ModuleInfo),\n    poly_info_get_const_struct_db(Info, ConstStructDb),\n    module_info_set_const_struct_db(ConstStructDb, !ModuleInfo),\n\n    poly_info_get_typevarset(Info, TypeVarSet),\n    pred_info_set_typevarset(TypeVarSet, PredInfo0, PredInfo1),\n    pred_info_set_clauses_info(ClausesInfo, PredInfo1, PredInfo2),\n\n    % Do a pass over the proc_infos, copying the relevant information\n    % from the clauses_info and the poly_info, and updating all the argmodes\n    % with modes for the extra arguments.\n\n    ProcIds = pred_info_procids(PredInfo2),\n    pred_info_get_procedures(PredInfo2, Procs0),\n    list.foldl(polymorphism_process_proc_in_table(PredInfo2, ClausesInfo,\n        ExtraArgModes), ProcIds, Procs0, Procs),\n    pred_info_set_procedures(Procs, PredInfo2, PredInfo),\n\n    trace [compiletime(flag(\"debug_poly_caches\"))] (\n        promise_pure (\n            impure set_selected_pred(no)\n        )\n    ),\n\n    module_info_set_pred_info(PredId, PredInfo, !ModuleInfo).\n\n:- pred polymorphism_process_clause_info(module_info::in, pred_info::in,\n    clauses_info::in, clauses_info::out, poly_info::out,\n    poly_arg_vector(mer_mode)::out) is det.\n\npolymorphism_process_clause_info(ModuleInfo0, PredInfo0, !ClausesInfo, !:Info,\n        ExtraArgModes) :-\n    init_poly_info(ModuleInfo0, PredInfo0, !.ClausesInfo, !:Info),\n    !.ClausesInfo = clauses_info(_VarSet, ExplicitVarTypes, _TVarNameMap,\n        _VarTypes, HeadVars0, ClausesRep0, ItemNumbers,\n        _RttiVarMaps, HaveForeignClauses),\n\n    setup_headvars(PredInfo0, HeadVars0, HeadVars,\n        ExtraArgModes, UnconstrainedTVars,\n        ExtraTypeInfoHeadVars, ExistTypeClassInfoHeadVars, !Info),\n\n    get_clause_list(ClausesRep0, Clauses0),\n    list.map_foldl(\n        polymorphism_process_clause(PredInfo0, HeadVars0, HeadVars,\n            UnconstrainedTVars, ExtraTypeInfoHeadVars,\n            ExistTypeClassInfoHeadVars),\n        Clauses0, Clauses, !Info),\n\n    % Set the new values of the fields in clauses_info.\n    poly_info_get_varset(!.Info, VarSet),\n    poly_info_get_var_types(!.Info, VarTypes),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps),\n    set_clause_list(Clauses, ClausesRep),\n    map.init(TVarNameMap), % This is only used while adding the clauses.\n    !:ClausesInfo = clauses_info(VarSet, ExplicitVarTypes, TVarNameMap,\n        VarTypes, HeadVars, ClausesRep, ItemNumbers,\n        RttiVarMaps, HaveForeignClauses).\n\n:- pred polymorphism_process_clause(pred_info::in,\n    proc_arg_vector(prog_var)::in, proc_arg_vector(prog_var)::in,\n    list(tvar)::in, list(prog_var)::in, list(prog_var)::in,\n    clause::in, clause::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_clause(PredInfo0, OldHeadVars, NewHeadVars,\n        UnconstrainedTVars, ExtraTypeInfoHeadVars,\n        ExistTypeClassInfoHeadVars, !Clause, !Info) :-\n    ( pred_info_is_imported(PredInfo0) ->\n        true\n    ;\n        Goal0 = !.Clause ^ clause_body,\n\n        % Process any polymorphic calls inside the goal.\n        empty_cache_maps(!Info),\n        poly_info_set_num_reuses(0, !Info),\n        polymorphism_process_goal(Goal0, Goal1, !Info),\n\n        % Generate code to construct the typeclass_infos and type_infos\n        % for existentially quantified type vars.\n        produce_existq_tvars(PredInfo0, OldHeadVars,\n            UnconstrainedTVars, ExtraTypeInfoHeadVars,\n            ExistTypeClassInfoHeadVars, Goal1, Goal2, !Info),\n\n        pred_info_get_exist_quant_tvars(PredInfo0, ExistQVars),\n        fixup_quantification(NewHeadVars, ExistQVars, Goal2, Goal, !Info),\n        !Clause ^ clause_body := Goal\n    ).\n\n:- pred polymorphism_process_proc_in_table(pred_info::in, clauses_info::in,\n    poly_arg_vector(mer_mode)::in, proc_id::in,\n    proc_table::in, proc_table::out) is det.\n\npolymorphism_process_proc_in_table(PredInfo, ClausesInfo, ExtraArgModes,\n        ProcId, !ProcTable) :-\n    map.lookup(!.ProcTable, ProcId, ProcInfo0),\n    polymorphism_process_proc(PredInfo, ClausesInfo, ExtraArgModes, ProcId,\n        ProcInfo0, ProcInfo),\n    map.det_update(ProcId, ProcInfo, !ProcTable).\n\n:- pred polymorphism_process_proc(pred_info::in, clauses_info::in,\n    poly_arg_vector(mer_mode)::in, proc_id::in, proc_info::in, proc_info::out)\n    is det.\n\npolymorphism_process_proc(PredInfo, ClausesInfo, ExtraArgModes, ProcId,\n        !ProcInfo) :-\n    % Copy all the information from the clauses_info into the proc_info.\n    (\n        (\n            pred_info_is_imported(PredInfo)\n        ;\n            pred_info_is_pseudo_imported(PredInfo),\n            hlds_pred.in_in_unification_proc_id(ProcId)\n        )\n    ->\n        % We need to set these fields in the proc_info here, because some parts\n        % of the compiler (e.g. unused_args.m) depend on these fields being\n        % valid even for imported procedures.\n\n        % XXX ARGVEC - when the proc_info uses the proc_arg_vector just\n        % pass the headvar vector directly to the proc_info.\n        clauses_info_get_headvars(ClausesInfo, HeadVars),\n        HeadVarList = proc_arg_vector_to_list(HeadVars),\n        clauses_info_get_rtti_varmaps(ClausesInfo, RttiVarMaps),\n        clauses_info_get_varset(ClausesInfo, VarSet),\n        clauses_info_get_vartypes(ClausesInfo, VarTypes),\n        proc_info_set_headvars(HeadVarList, !ProcInfo),\n        proc_info_set_rtti_varmaps(RttiVarMaps, !ProcInfo),\n        proc_info_set_varset(VarSet, !ProcInfo),\n        proc_info_set_vartypes(VarTypes, !ProcInfo)\n    ;\n        copy_clauses_to_proc(ProcId, ClausesInfo, !ProcInfo)\n    ),\n\n    % Add the ExtraArgModes to the proc_info argmodes.\n    % XXX ARGVEC - revisit this when the proc_info uses proc_arg_vectors.\n    proc_info_get_argmodes(!.ProcInfo, ArgModes1),\n    ExtraArgModesList = poly_arg_vector_to_list(ExtraArgModes),\n    ArgModes = ExtraArgModesList ++ ArgModes1,\n    proc_info_set_argmodes(ArgModes, !ProcInfo).\n\n    % XXX document me\n    %\n    % XXX the following code ought to be rewritten to handle\n    % existential/universal type_infos and type_class_infos\n    % in a more consistent manner.\n    %\n:- pred setup_headvars(pred_info::in, proc_arg_vector(prog_var)::in,\n    proc_arg_vector(prog_var)::out, poly_arg_vector(mer_mode)::out,\n    list(tvar)::out, list(prog_var)::out, list(prog_var)::out,\n    poly_info::in, poly_info::out) is det.\n\nsetup_headvars(PredInfo, !HeadVars, ExtraArgModes,\n        UnconstrainedTVars, ExtraHeadTypeInfoVars,\n        ExistHeadTypeClassInfoVars, !Info) :-\n    pred_info_get_origin(PredInfo, Origin),\n    ExtraArgModes0 = poly_arg_vector_init : poly_arg_vector(mer_mode),\n    (\n        Origin = origin_instance_method(_, InstanceMethodConstraints),\n        setup_headvars_instance_method(PredInfo,\n            InstanceMethodConstraints, !HeadVars,\n            UnconstrainedTVars, ExtraHeadTypeInfoVars,\n            ExistHeadTypeClassInfoVars,\n            ExtraArgModes0, ExtraArgModes, !Info)\n    ;\n        ( Origin = origin_special_pred(_)\n        ; Origin = origin_transformed(_, _, _)\n        ; Origin = origin_created(_)\n        ; Origin = origin_assertion(_, _)\n        ; Origin = origin_lambda(_, _, _)\n        ; Origin = origin_user(_)\n        ),\n        pred_info_get_class_context(PredInfo, ClassContext),\n        InstanceTVars = [],\n        InstanceUnconstrainedTVars = [],\n        InstanceUnconstrainedTypeInfoVars = [],\n        setup_headvars_2(PredInfo, ClassContext, InstanceTVars,\n            InstanceUnconstrainedTVars, InstanceUnconstrainedTypeInfoVars,\n            !HeadVars, UnconstrainedTVars,\n            ExtraHeadTypeInfoVars, ExistHeadTypeClassInfoVars,\n            ExtraArgModes0, ExtraArgModes, !Info)\n    ).\n\n    % For class method implementations, do_call_class_method takes the\n    % type_infos and typeclass_infos from the typeclass_info and pastes them\n    % onto the front of the argument list. We need to match that order here.\n    %\n:- pred setup_headvars_instance_method(pred_info::in,\n    instance_method_constraints::in,\n    proc_arg_vector(prog_var)::in, proc_arg_vector(prog_var)::out,\n    list(tvar)::out, list(prog_var)::out, list(prog_var)::out,\n    poly_arg_vector(mer_mode)::in, poly_arg_vector(mer_mode)::out,\n    poly_info::in, poly_info::out) is det.\n\nsetup_headvars_instance_method(PredInfo,\n        InstanceMethodConstraints, !HeadVars,\n        UnconstrainedTVars, ExtraHeadTypeInfoVars,\n        ExistHeadTypeClassInfoVars, !ExtraArgModes, !Info) :-\n\n    InstanceMethodConstraints = instance_method_constraints(_,\n        InstanceTypes, InstanceConstraints, ClassContext),\n\n    type_vars_list(InstanceTypes, InstanceTVars),\n    get_unconstrained_tvars(InstanceTVars, InstanceConstraints,\n        UnconstrainedInstanceTVars),\n    pred_info_get_arg_types(PredInfo, ArgTypeVarSet, _, _),\n    make_head_vars(UnconstrainedInstanceTVars,\n        ArgTypeVarSet, UnconstrainedInstanceTypeInfoVars, !Info),\n    make_typeclass_info_head_vars(do_record_type_info_locns,\n        InstanceConstraints, InstanceHeadTypeClassInfoVars, !Info),\n\n    proc_arg_vector_set_instance_type_infos(UnconstrainedInstanceTypeInfoVars,\n        !HeadVars),\n    proc_arg_vector_set_instance_typeclass_infos(InstanceHeadTypeClassInfoVars,\n         !HeadVars),\n\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    list.foldl(rtti_reuse_typeclass_info_var,\n        InstanceHeadTypeClassInfoVars, RttiVarMaps0, RttiVarMaps),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info),\n\n    in_mode(InMode),\n    list.duplicate(list.length(UnconstrainedInstanceTypeInfoVars),\n        InMode, UnconstrainedInstanceTypeInfoModes),\n    list.duplicate(list.length(InstanceHeadTypeClassInfoVars),\n        InMode, InstanceHeadTypeClassInfoModes),\n    poly_arg_vector_set_instance_type_infos(\n        UnconstrainedInstanceTypeInfoModes, !ExtraArgModes),\n    poly_arg_vector_set_instance_typeclass_infos(\n        InstanceHeadTypeClassInfoModes, !ExtraArgModes),\n\n    setup_headvars_2(PredInfo, ClassContext,\n        InstanceTVars,\n        UnconstrainedInstanceTVars, UnconstrainedInstanceTypeInfoVars,\n        !HeadVars,\n        UnconstrainedTVars, ExtraHeadTypeInfoVars,\n        ExistHeadTypeClassInfoVars, !ExtraArgModes, !Info).\n\n:- pred setup_headvars_2(pred_info::in, prog_constraints::in,\n    list(tvar)::in, list(tvar)::in, list(prog_var)::in,\n    proc_arg_vector(prog_var)::in, proc_arg_vector(prog_var)::out,\n    list(tvar)::out, list(prog_var)::out, list(prog_var)::out,\n    poly_arg_vector(mer_mode)::in, poly_arg_vector(mer_mode)::out,\n    poly_info::in, poly_info::out) is det.\n\nsetup_headvars_2(PredInfo, ClassContext,\n        InstanceTVars, UnconstrainedInstanceTVars,\n        UnconstrainedInstanceTypeInfoVars, HeadVars0,\n        HeadVars, AllUnconstrainedTVars,\n        AllExtraHeadTypeInfoVars, ExistHeadTypeClassInfoVars,\n        !ExtraArgModes, !Info) :-\n\n    % Grab the appropriate fields from the pred_info.\n    pred_info_get_arg_types(PredInfo, ArgTypeVarSet, ExistQVars, ArgTypes),\n\n    % Insert extra head variables to hold the address of the type_infos\n    % and typeclass_infos. We insert one variable for each unconstrained\n    % type variable (for the type_info) and one variable for each\n    % constraint (for the typeclass_info).\n    %\n    % The order of these variables is important, and must match the order\n    % specified at the top of this file.\n\n    % Make a fresh variable for each class constraint, returning a list of\n    % variables that appear in the constraints, along with the location of\n    % the type infos for them. For the existential constraints, we want\n    % the rtti_varmaps to contain the internal view of the types (that is,\n    % with type variables bound) so we may need to look up the actual\n    % constraints in the constraint map. For the universal constraints there\n    % is no distinction between the internal views and the external view, so\n    % we just use the constraints from the class context.\n    ClassContext = constraints(UnivConstraints, ExistConstraints),\n    prog_type.constraint_list_get_tvars(UnivConstraints,\n        UnivConstrainedTVars),\n    prog_type.constraint_list_get_tvars(ExistConstraints,\n        ExistConstrainedTVars),\n    poly_info_get_constraint_map(!.Info, ConstraintMap),\n    get_improved_exists_head_constraints(ConstraintMap, ExistConstraints,\n        ActualExistConstraints),\n    (\n        pred_info_get_markers(PredInfo, PredMarkers),\n        check_marker(PredMarkers, marker_class_method)\n    ->\n        % For class methods we record the type_info_locns even for the\n        % existential constraints. It is easier to do it here than when we\n        % are expanding class method bodies, and we know there won't be any\n        % references to the type_info after the instance method call so\n        % recording them now won't be a problem.\n        RecordExistQLocns = do_record_type_info_locns\n    ;\n        RecordExistQLocns = do_not_record_type_info_locns\n    ),\n    make_typeclass_info_head_vars(RecordExistQLocns, ActualExistConstraints,\n        ExistHeadTypeClassInfoVars, !Info),\n    make_typeclass_info_head_vars(do_record_type_info_locns, UnivConstraints,\n        UnivHeadTypeClassInfoVars, !Info),\n\n    type_vars_list(ArgTypes, HeadTypeVars),\n    list.delete_elems(HeadTypeVars, UnivConstrainedTVars,\n        UnconstrainedTVars0),\n    list.delete_elems(UnconstrainedTVars0, ExistConstrainedTVars,\n        UnconstrainedTVars1),\n\n    % Typeinfos for the instance tvars have already been introduced by\n    % setup_headvars_instance_method.\n    list.delete_elems(UnconstrainedTVars1, InstanceTVars,\n        UnconstrainedTVars2),\n    list.remove_dups(UnconstrainedTVars2, UnconstrainedTVars),\n\n    (\n        ExistQVars = [],\n        % Optimize common case.\n        UnconstrainedUnivTVars = UnconstrainedTVars,\n        UnconstrainedExistTVars = [],\n        ExistHeadTypeInfoVars = []\n    ;\n        ExistQVars = [_ | _],\n        list.delete_elems(UnconstrainedTVars, ExistQVars,\n            UnconstrainedUnivTVars),\n        list.delete_elems(UnconstrainedTVars, UnconstrainedUnivTVars,\n            UnconstrainedExistTVars),\n        make_head_vars(UnconstrainedExistTVars, ArgTypeVarSet,\n            ExistHeadTypeInfoVars, !Info)\n    ),\n\n    make_head_vars(UnconstrainedUnivTVars, ArgTypeVarSet,\n        UnivHeadTypeInfoVars, !Info),\n    ExtraHeadTypeInfoVars = UnivHeadTypeInfoVars ++ ExistHeadTypeInfoVars,\n\n    AllExtraHeadTypeInfoVars = UnconstrainedInstanceTypeInfoVars\n        ++ ExtraHeadTypeInfoVars,\n    list.condense([UnconstrainedInstanceTVars, UnconstrainedUnivTVars,\n        UnconstrainedExistTVars], AllUnconstrainedTVars),\n\n    proc_arg_vector_set_univ_type_infos(UnivHeadTypeInfoVars,\n        HeadVars0, HeadVars1),\n    proc_arg_vector_set_exist_type_infos(ExistHeadTypeInfoVars,\n        HeadVars1, HeadVars2),\n    proc_arg_vector_set_univ_typeclass_infos(UnivHeadTypeClassInfoVars,\n        HeadVars2, HeadVars3),\n    proc_arg_vector_set_exist_typeclass_infos(ExistHeadTypeClassInfoVars,\n        HeadVars3, HeadVars),\n\n    % Figure out the modes of the introduced type_info and typeclass_info\n    % arguments.\n\n    in_mode(In),\n    out_mode(Out),\n    list.length(UnconstrainedUnivTVars, NumUnconstrainedUnivTVars),\n    list.length(UnconstrainedExistTVars, NumUnconstrainedExistTVars),\n    list.length(UnivHeadTypeClassInfoVars, NumUnivClassInfoVars),\n    list.length(ExistHeadTypeClassInfoVars, NumExistClassInfoVars),\n    list.duplicate(NumUnconstrainedUnivTVars, In, UnivTypeInfoModes),\n    list.duplicate(NumUnconstrainedExistTVars, Out, ExistTypeInfoModes),\n    list.duplicate(NumUnivClassInfoVars, In, UnivTypeClassInfoModes),\n    list.duplicate(NumExistClassInfoVars, Out, ExistTypeClassInfoModes),\n    poly_arg_vector_set_univ_type_infos(UnivTypeInfoModes, !ExtraArgModes),\n    poly_arg_vector_set_exist_type_infos(ExistTypeInfoModes, !ExtraArgModes),\n    poly_arg_vector_set_univ_typeclass_infos(UnivTypeClassInfoModes,\n        !ExtraArgModes),\n    poly_arg_vector_set_exist_typeclass_infos(ExistTypeClassInfoModes,\n        !ExtraArgModes),\n\n    % Add the locations of the typeinfos for unconstrained, universally\n    % quantified type variables to the initial rtti_varmaps. Also add the\n    % locations of typeclass_infos.\n    %\n    some [!RttiVarMaps] (\n        poly_info_get_rtti_varmaps(!.Info, !:RttiVarMaps),\n\n        ToLocn = (pred(TheVar::in, TheLocn::out) is det :-\n            TheLocn = type_info(TheVar)),\n\n        list.map(ToLocn, UnivHeadTypeInfoVars, UnivTypeLocns),\n        list.foldl_corresponding(rtti_det_insert_type_info_locn,\n            UnconstrainedUnivTVars, UnivTypeLocns, !RttiVarMaps),\n\n        list.map(ToLocn, ExistHeadTypeInfoVars, ExistTypeLocns),\n        list.foldl_corresponding(rtti_det_insert_type_info_locn,\n            UnconstrainedExistTVars, ExistTypeLocns, !RttiVarMaps),\n\n        list.map(ToLocn, UnconstrainedInstanceTypeInfoVars,\n            UnconstrainedInstanceTypeLocns),\n        list.foldl_corresponding(rtti_det_insert_type_info_locn,\n            UnconstrainedInstanceTVars,\n            UnconstrainedInstanceTypeLocns, !RttiVarMaps),\n\n        list.foldl(rtti_reuse_typeclass_info_var,\n            UnivHeadTypeClassInfoVars, !RttiVarMaps),\n\n        poly_info_set_rtti_varmaps(!.RttiVarMaps, !Info)\n    ).\n\n    % Generate code to produce the values of type_infos and typeclass_infos\n    % for existentially quantified type variables in the head.\n    %\n    % XXX The following code ought to be rewritten to handle\n    % existential/universal type_infos and type_class_infos\n    % in a more consistent manner.\n    %\n:- pred produce_existq_tvars(pred_info::in, proc_arg_vector(prog_var)::in,\n    list(tvar)::in, list(prog_var)::in, list(prog_var)::in,\n    hlds_goal::in, hlds_goal::out, poly_info::in, poly_info::out) is det.\n\nproduce_existq_tvars(PredInfo, HeadVars, UnconstrainedTVars,\n        TypeInfoHeadVars, ExistTypeClassInfoHeadVars, Goal0, Goal, !Info) :-\n    poly_info_get_var_types(!.Info, VarTypes0),\n    poly_info_get_constraint_map(!.Info, ConstraintMap),\n    pred_info_get_arg_types(PredInfo, ArgTypes),\n    pred_info_get_tvar_kinds(PredInfo, KindMap),\n    pred_info_get_class_context(PredInfo, PredClassContext),\n\n    % Generate code to produce values for any existentially quantified\n    % typeclass_info variables in the head.\n\n    PredExistConstraints = PredClassContext ^ exist_constraints,\n    get_improved_exists_head_constraints(ConstraintMap, PredExistConstraints,\n        ActualExistConstraints),\n    ExistQVarsForCall = [],\n    Goal0 = hlds_goal(_, GoalInfo),\n    Context = goal_info_get_context(GoalInfo),\n    make_typeclass_info_vars(ActualExistConstraints, ExistQVarsForCall,\n        Context, ExistTypeClassVarsMCAs, ExtraTypeClassGoals, !Info),\n    assoc_list.keys(ExistTypeClassVarsMCAs, ExistTypeClassVars),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    list.foldl(rtti_reuse_typeclass_info_var, ExistTypeClassVars,\n        RttiVarMaps0, RttiVarMaps),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info),\n    assign_var_list(ExistTypeClassInfoHeadVars,\n        ExistTypeClassVars, ExtraTypeClassUnifyGoals),\n\n    % Figure out the bindings for any unconstrained existentially quantified\n    % type variables in the head.\n\n    ( vartypes_is_empty(VarTypes0) ->\n        % This can happen for compiler generated procedures.\n        map.init(PredToActualTypeSubst)\n    ;\n        HeadVarList = proc_arg_vector_to_list(HeadVars),\n        lookup_var_types(VarTypes0, HeadVarList, ActualArgTypes),\n        type_list_subsumes(ArgTypes, ActualArgTypes, ArgTypeSubst)\n    ->\n        PredToActualTypeSubst = ArgTypeSubst\n    ;\n        % This can happen for unification procedures of equivalence types\n        % error(\"polymorphism.m: type_list_subsumes failed\")\n        map.init(PredToActualTypeSubst)\n    ),\n\n    % Apply the type bindings to the unconstrained type variables to give\n    % the actual types, and then generate code to initialize the type_infos\n    % for those types.\n\n    apply_subst_to_tvar_list(KindMap, PredToActualTypeSubst,\n        UnconstrainedTVars, ActualTypes),\n    polymorphism_do_make_type_info_vars(ActualTypes, Context,\n        TypeInfoVarsMCAs, ExtraTypeInfoGoals, !Info),\n    assoc_list.keys(TypeInfoVarsMCAs, TypeInfoVars),\n    assign_var_list(TypeInfoHeadVars, TypeInfoVars, ExtraTypeInfoUnifyGoals),\n    list.condense([[Goal0 | ExtraTypeClassGoals], ExtraTypeClassUnifyGoals,\n        ExtraTypeInfoGoals, ExtraTypeInfoUnifyGoals], GoalList),\n    conj_list_to_goal(GoalList, GoalInfo, Goal).\n\n:- pred assign_var_list(list(prog_var)::in, list(prog_var)::in,\n    list(hlds_goal)::out) is det.\n\nassign_var_list([], [_ | _], _) :-\n    unexpected($module, $pred, \"length mismatch\").\nassign_var_list([_ | _], [], _) :-\n    unexpected($module, $pred, \"length mismatch\").\nassign_var_list([], [], []).\nassign_var_list([Var1 | Vars1], [Var2 | Vars2], [Goal | Goals]) :-\n    assign_var(Var1, Var2, Goal),\n    assign_var_list(Vars1, Vars2, Goals).\n\n:- pred assign_var(prog_var::in, prog_var::in, hlds_goal::out) is det.\n\nassign_var(Var1, Var2, Goal) :-\n    ( Var1 = Var2 ->\n        Goal = true_goal\n    ;\n        term.context_init(Context),\n        create_pure_atomic_complicated_unification(Var1, rhs_var(Var2),\n            Context, umc_explicit, [], Goal)\n    ).\n\n:- pred get_improved_exists_head_constraints(constraint_map::in,\n    list(prog_constraint)::in, list(prog_constraint)::out) is det.\n\nget_improved_exists_head_constraints(ConstraintMap,  ExistConstraints,\n        ActualExistConstraints) :-\n    list.length(ExistConstraints, NumExistConstraints),\n    (\n        search_hlds_constraint_list(ConstraintMap, unproven, goal_id(0),\n            NumExistConstraints, ActualExistConstraints0)\n    ->\n        ActualExistConstraints = ActualExistConstraints0\n    ;\n        % Some predicates, for example typeclass methods and predicates for\n        % which we inferred the type, don't have constraint map entries for\n        % the head constraints. In these cases we can just use the external\n        % constraints, since there can't be any difference between them and\n        % the internal ones.\n        ActualExistConstraints = ExistConstraints\n    ).\n\n%-----------------------------------------------------------------------------%\n\n:- pred polymorphism_process_goal(hlds_goal::in, hlds_goal::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_goal(Goal0, Goal, !Info) :-\n    Goal0 = hlds_goal(GoalExpr0, GoalInfo0),\n    (\n        % We don't need to add type_infos for higher order calls, since the\n        % type_infos are added when the closures are constructed, not when\n        % they are called.\n        GoalExpr0 = generic_call(_, _, _, _, _),\n        Goal = Goal0\n    ;\n        GoalExpr0 = plain_call(PredId, _, ArgVars0, _, _, _),\n        polymorphism_process_call(PredId, ArgVars0, GoalInfo0, GoalInfo,\n            ExtraVars, ExtraGoals, !Info),\n        ArgVars = ExtraVars ++ ArgVars0,\n        CallExpr = GoalExpr0 ^ call_args := ArgVars,\n        Call = hlds_goal(CallExpr, GoalInfo),\n        GoalList = ExtraGoals ++ [Call],\n        conj_list_to_goal(GoalList, GoalInfo0, Goal)\n    ;\n        GoalExpr0 = call_foreign_proc(_, PredId, _, _, _, _, _),\n        poly_info_get_module_info(!.Info, ModuleInfo),\n        module_info_pred_info(ModuleInfo, PredId, PredInfo),\n        PredModule = pred_info_module(PredInfo),\n        PredName = pred_info_name(PredInfo),\n        PredArity = pred_info_orig_arity(PredInfo),\n\n        ( no_type_info_builtin(PredModule, PredName, PredArity) ->\n            Goal = Goal0\n        ;\n            polymorphism_process_foreign_proc(PredInfo, GoalExpr0, GoalInfo0,\n                Goal, !Info)\n        )\n    ;\n        GoalExpr0 = unify(XVar, Y, Mode, Unification, UnifyContext),\n        polymorphism_process_unify(XVar, Y, Mode, Unification, UnifyContext,\n            GoalInfo0, Goal, !Info)\n    ;\n        % The rest of the cases just process goals recursively.\n        (\n            GoalExpr0 = conj(ConjType, Goals0),\n            (\n                ConjType = plain_conj,\n                polymorphism_process_plain_conj(Goals0, Goals, !Info)\n            ;\n                ConjType = parallel_conj,\n                get_cache_maps_snapshot(\"parconj\", InitialSnapshot, !Info),\n                polymorphism_process_par_conj(Goals0, Goals, InitialSnapshot,\n                    !Info)\n                % Unlike with disjunctions, we do not have to reset to\n                % InitialSnapshot.\n            ),\n            GoalExpr = conj(ConjType, Goals)\n        ;\n            GoalExpr0 = disj(Goals0),\n            get_cache_maps_snapshot(\"disj\", InitialSnapshot, !Info),\n            polymorphism_process_disj(Goals0, Goals, InitialSnapshot, !Info),\n            set_cache_maps_snapshot(\"after disj\", InitialSnapshot, !Info),\n            GoalExpr = disj(Goals)\n        ;\n            GoalExpr0 = if_then_else(Vars, Cond0, Then0, Else0),\n            get_cache_maps_snapshot(\"ite\", InitialSnapshot, !Info),\n            polymorphism_process_goal(Cond0, Cond, !Info),\n            % If we allowed a type_info created inside Cond to be reused\n            % in Then, then we are adding an output variable to Cond.\n            % If Cond scope had no outputs to begin with, this would change\n            % its determinism.\n            set_cache_maps_snapshot(\"before then\", InitialSnapshot, !Info),\n            polymorphism_process_goal(Then0, Then, !Info),\n            set_cache_maps_snapshot(\"before else\", InitialSnapshot, !Info),\n            polymorphism_process_goal(Else0, Else, !Info),\n            set_cache_maps_snapshot(\"after ite\", InitialSnapshot, !Info),\n            GoalExpr = if_then_else(Vars, Cond, Then, Else)\n        ;\n            GoalExpr0 = negation(SubGoal0),\n            get_cache_maps_snapshot(\"neg\", InitialSnapshot, !Info),\n            polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n            set_cache_maps_snapshot(\"after neg\", InitialSnapshot, !Info),\n            GoalExpr = negation(SubGoal)\n        ;\n            GoalExpr0 = switch(Var, CanFail, Cases0),\n            get_cache_maps_snapshot(\"switch\", InitialSnapshot, !Info),\n            polymorphism_process_cases(Cases0, Cases, InitialSnapshot, !Info),\n            set_cache_maps_snapshot(\"after switch\", InitialSnapshot, !Info),\n            GoalExpr = switch(Var, CanFail, Cases)\n        ;\n            GoalExpr0 = scope(Reason0, SubGoal0),\n            (\n                Reason0 = from_ground_term(TermVar, Kind),\n                (\n                    Kind = from_ground_term_initial,\n                    polymorphism_process_from_ground_term_initial(TermVar,\n                        GoalInfo0, SubGoal0, GoalExpr, !Info)\n                ;\n                    ( Kind = from_ground_term_construct\n                    ; Kind = from_ground_term_deconstruct\n                    ; Kind = from_ground_term_other\n                    ),\n                    polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n                    GoalExpr = scope(Reason0, SubGoal)\n                )\n            ;\n                Reason0 = promise_solutions(_, _),\n                % polymorphism_process_goal may cause SubGoal to bind\n                % variables (such as PolyConst variables) that SubGoal0 does\n                % not bind. If we allowed such variables to be reused outside\n                % the scope, that would change the set of variables that the\n                % promise would have to cover. We cannot expect and do not want\n                % user level programmers making promises about variables added\n                % by the compiler.\n                get_cache_maps_snapshot(\"promise_solns\", InitialSnapshot,\n                    !Info),\n                polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n                set_cache_maps_snapshot(\"after promise_solns\", InitialSnapshot,\n                    !Info),\n                GoalExpr = scope(Reason0, SubGoal)\n            ;\n                ( Reason0 = promise_purity(_)\n                ; Reason0 = require_detism(_)\n                ; Reason0 = require_complete_switch(_)\n                ; Reason0 = commit(_)\n                ; Reason0 = barrier(_)\n                ; Reason0 = loop_control(_, _, _)\n                ),\n                polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n                GoalExpr = scope(Reason0, SubGoal)\n            ;\n                Reason0 = exist_quant(_),\n                % If we allowed a type_info created inside SubGoal to be reused\n                % outside GoalExpr, then we are adding an output variable to\n                % the scope. If the scope had no outputs to begin with, this\n                % would change the determinism of the scope.\n                %\n                % However, using a type_info from before the scope in SubGoal\n                % is perfectly ok.\n\n                get_cache_maps_snapshot(\"exists\", InitialSnapshot, !Info),\n                polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n                set_cache_maps_snapshot(\"after exists\", InitialSnapshot,\n                    !Info),\n                GoalExpr = scope(Reason0, SubGoal)\n            ;\n                Reason0 = trace_goal(_, _, _, _, _),\n                % Trace goal scopes will be deleted after semantic analysis\n                % if their compile-time condition turns out to be false.\n                % If we let later code use type_infos introduced inside the\n                % scope, the deletion of the scope would leave those variables\n                % undefined.\n                %\n                % We *could* evaluate the compile-time condition here to know\n                % whether the deletion will happen or not, but doing so would\n                % require breaching the separation between compiler passes.\n\n                get_cache_maps_snapshot(\"trace\", InitialSnapshot, !Info),\n                polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n                set_cache_maps_snapshot(\"after trace\", InitialSnapshot, !Info),\n                GoalExpr = scope(Reason0, SubGoal)\n            )\n        ),\n        Goal = hlds_goal(GoalExpr, GoalInfo0)\n    ;\n        GoalExpr0 = shorthand(ShortHand0),\n        (\n            ShortHand0 = atomic_goal(GoalType, Outer, Inner, Vars,\n                MainGoal0, OrElseGoals0, OrElseInners),\n            get_cache_maps_snapshot(\"atomic\", InitialSnapshot, !Info),\n            polymorphism_process_goal(MainGoal0, MainGoal, !Info),\n            polymorphism_process_disj(OrElseGoals0, OrElseGoals,\n                InitialSnapshot, !Info),\n            set_cache_maps_snapshot(\"after atomic\", InitialSnapshot, !Info),\n            ShortHand = atomic_goal(GoalType, Outer, Inner, Vars,\n                MainGoal, OrElseGoals, OrElseInners)\n        ;\n            ShortHand0 = try_goal(MaybeIO, ResultVar, SubGoal0),\n            % We don't let the code inside and outside the try goal share\n            % type_info variables for the same reason as with lambda\n            % expressions; because those pieces of code will end up\n            % in different procedures. However, for try goals, this is true\n            % even for the first and second conjuncts.\n            get_cache_maps_snapshot(\"try\", InitialSnapshot, !Info),\n            (\n                SubGoal0 = hlds_goal(SubGoalExpr0, SubGoalInfo),\n                SubGoalExpr0 = conj(plain_conj, Conjuncts0),\n                Conjuncts0 = [ConjunctA0, ConjunctB0]\n            ->\n                empty_cache_maps(!Info),\n                polymorphism_process_goal(ConjunctA0, ConjunctA, !Info),\n                empty_cache_maps(!Info),\n                polymorphism_process_goal(ConjunctB0, ConjunctB, !Info),\n\n                Conjuncts = [ConjunctA, ConjunctB],\n                SubGoalExpr = conj(plain_conj, Conjuncts),\n                SubGoal = hlds_goal(SubGoalExpr, SubGoalInfo)\n            ;\n                unexpected($module, $pred, \"malformed try goal\")\n            ),\n            set_cache_maps_snapshot(\"after try\", InitialSnapshot, !Info),\n            ShortHand = try_goal(MaybeIO, ResultVar, SubGoal)\n        ;\n            ShortHand0 = bi_implication(_, _),\n            unexpected($module, $pred, \"bi_implication\")\n        ),\n        GoalExpr = shorthand(ShortHand),\n        Goal = hlds_goal(GoalExpr, GoalInfo0)\n    ).\n\n%-----------------------------------------------------------------------------%\n\n:- pred polymorphism_process_from_ground_term_initial(prog_var::in,\n    hlds_goal_info::in, hlds_goal::in, hlds_goal_expr::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_from_ground_term_initial(TermVar, GoalInfo0, SubGoal0,\n        GoalExpr, !Info) :-\n    SubGoal0 = hlds_goal(SubGoalExpr0, SubGoalInfo0),\n    ( SubGoalExpr0 = conj(plain_conj, SubGoals0Prime) ->\n        SubGoals0 = SubGoals0Prime\n    ;\n        unexpected($module, $pred,\n            \"from_ground_term_initial goal is not plain conj\")\n    ),\n    polymorphism_process_fgti_goals(SubGoals0, [], RevMarkedSubGoals,\n        fgt_invariants_kept, InvariantsStatus, !Info),\n    (\n        InvariantsStatus = fgt_invariants_kept,\n        Reason = from_ground_term(TermVar, from_ground_term_initial),\n        GoalExpr = scope(Reason, SubGoal0)\n    ;\n        InvariantsStatus = fgt_invariants_broken,\n        introduce_partial_fgt_scopes(GoalInfo0, SubGoalInfo0,\n            RevMarkedSubGoals, deconstruct_top_down, SubGoal),\n        % Delete the scope wrapper around SubGoal0.\n        SubGoal = hlds_goal(GoalExpr, _)\n    ).\n\n:- pred polymorphism_process_fgti_goals(list(hlds_goal)::in,\n    list(fgt_marked_goal)::in, list(fgt_marked_goal)::out,\n    fgt_invariants_status::in, fgt_invariants_status::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_fgti_goals([], !RevMarkedGoals, !InvariantsStatus, !Info).\npolymorphism_process_fgti_goals([Goal0 | Goals0], !RevMarkedGoals,\n        !InvariantsStatus, !Info) :-\n    % This is used only if polymorphism_fgt_sanity_tests is enabled.\n    OldInfo = !.Info,\n    Goal0 = hlds_goal(GoalExpr0, GoalInfo0),\n    (\n        GoalExpr0 = unify(XVarPrime, Y, ModePrime, UnificationPrime,\n            UnifyContextPrime),\n        Y = rhs_functor(ConsIdPrime, _, YVarsPrime)\n    ->\n        XVar = XVarPrime,\n        Mode = ModePrime,\n        Unification = UnificationPrime,\n        UnifyContext = UnifyContextPrime,\n        ConsId = ConsIdPrime,\n        YVars = YVarsPrime\n    ;\n        unexpected($module, $pred,\n            \"from_ground_term_initial conjunct is not functor unify\")\n    ),\n    polymorphism_process_unify_functor(XVar, ConsId, YVars, Mode,\n        Unification, UnifyContext, GoalInfo0, Goal, Changed, !Info),\n    (\n        Changed = no,\n        trace [compiletime(flag(\"polymorphism_fgt_sanity_tests\"))] (\n            poly_info_get_varset(OldInfo, VarSetBefore),\n            MaxVarBefore = varset.max_var(VarSetBefore),\n            poly_info_get_num_reuses(OldInfo, NumReusesBefore),\n\n            poly_info_get_varset(!.Info, VarSetAfter),\n            MaxVarAfter = varset.max_var(VarSetAfter),\n            poly_info_get_num_reuses(!.Info, NumReusesAfter),\n\n            expect(unify(MaxVarBefore, MaxVarAfter), $module, $pred,\n                \"MaxVarBefore != MaxVarAfter\"),\n            expect(unify(NumReusesBefore, NumReusesAfter), $module, $pred,\n                \"NumReusesBefore != NumReusesAfter\"),\n            expect(unify(Goal0, Goal), $module, $pred,\n                \"Goal0 != Goal\")\n        ),\n        MarkedGoal = fgt_kept_goal(Goal0, XVar, YVars)\n    ;\n        Changed = yes,\n        MarkedGoal = fgt_broken_goal(Goal, XVar, YVars),\n        !:InvariantsStatus = fgt_invariants_broken\n    ),\n    !:RevMarkedGoals = [MarkedGoal | !.RevMarkedGoals],\n    polymorphism_process_fgti_goals(Goals0, !RevMarkedGoals,\n        !InvariantsStatus, !Info).\n\n%-----------------------------------------------------------------------------%\n\n:- pred polymorphism_process_unify(prog_var::in, unify_rhs::in,\n    unify_mode::in, unification::in, unify_context::in, hlds_goal_info::in,\n    hlds_goal::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_unify(XVar, Y, Mode, Unification0, UnifyContext,\n        GoalInfo0, Goal, !Info) :-\n    (\n        Y = rhs_var(_YVar),\n\n        % Var-var unifications (simple_test, assign, or complicated_unify)\n        % are basically left unchanged. Complicated unifications will\n        % eventually get converted into calls, but that is done later on,\n        % by simplify.m, not now. At this point we just need to figure out\n        % which type_info/typeclass_info variables the unification might need,\n        % and insert them in the nonlocals. We have to do that for all var-var\n        % unifications, because at this point we haven't done mode analysis so\n        % we don't know which ones will become complicated_unifies.\n        % Note that we also store the type_info/typeclass_info variables\n        % in a field in the unification, which quantification.m uses when\n        % requantifying things.\n\n        poly_info_get_var_types(!.Info, VarTypes),\n        lookup_var_type(VarTypes, XVar, Type),\n        unification_typeinfos(Type, Unification0, Unification,\n            GoalInfo0, GoalInfo, _Changed, !Info),\n        Goal = hlds_goal(unify(XVar, Y, Mode, Unification, UnifyContext),\n            GoalInfo)\n    ;\n        Y = rhs_functor(ConsId, _, Args),\n        polymorphism_process_unify_functor(XVar, ConsId, Args, Mode,\n            Unification0, UnifyContext, GoalInfo0, Goal, _Changed, !Info)\n    ;\n        Y = rhs_lambda_goal(Purity, Groundness, PredOrFunc, EvalMethod,\n            ArgVars0, LambdaVars, Modes, Det, LambdaGoal0),\n\n        % For lambda expressions, we must recursively traverse the lambda goal.\n        % Any type_info variables needed by the lambda goal are created in the\n        % lambda goal (not imported from the outside), and any type_info\n        % variables created by the lambda goal are not available outside.\n        % This is because, after lambda expansion, the code inside and outside\n        % the lambda goal will end up in different procedures.\n\n        get_cache_maps_snapshot(\"lambda\", InitialSnapshot, !Info),\n        empty_cache_maps(!Info),\n        polymorphism_process_goal(LambdaGoal0, LambdaGoal1, !Info),\n        set_cache_maps_snapshot(\"after lambda\", InitialSnapshot, !Info),\n\n        % Currently we don't allow lambda goals to be existentially typed.\n        ExistQVars = [],\n        fixup_lambda_quantification(ArgVars0, LambdaVars, ExistQVars,\n            LambdaGoal1, LambdaGoal, NonLocalTypeInfos, !Info),\n        set_of_var.to_sorted_list(NonLocalTypeInfos, NonLocalTypeInfosList),\n        ArgVars = NonLocalTypeInfosList ++ ArgVars0,\n        Y1 = rhs_lambda_goal(Purity, Groundness, PredOrFunc, EvalMethod,\n            ArgVars, LambdaVars, Modes, Det, LambdaGoal),\n        NonLocals0 = goal_info_get_nonlocals(GoalInfo0),\n        set_of_var.union(NonLocals0, NonLocalTypeInfos, NonLocals),\n        goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo),\n\n        % Complicated (in-in) argument unifications are impossible for lambda\n        % expressions, so we don't need to worry about adding the type_infos\n        % that would be required for such unifications.\n        Goal = hlds_goal(unify(XVar, Y1, Mode, Unification0, UnifyContext),\n            GoalInfo)\n    ).\n\n:- pred unification_typeinfos(mer_type::in,\n    unification::in, unification::out, hlds_goal_info::in, hlds_goal_info::out,\n    bool::out, poly_info::in, poly_info::out) is det.\n\nunification_typeinfos(Type, !Unification, !GoalInfo, Changed, !Info) :-\n    % Compute the type_info/type_class_info variables that would be used\n    % if this unification ends up being a complicated_unify.\n    type_vars(Type, TypeVars),\n    (\n        TypeVars = [],\n        Changed = no\n    ;\n        TypeVars = [_ | _],\n        list.map_foldl(get_type_info_locn, TypeVars, TypeInfoLocns, !Info),\n        add_unification_typeinfos(TypeInfoLocns, !Unification, !GoalInfo),\n        Changed = yes\n    ).\n\nunification_typeinfos_rtti_varmaps(Type, RttiVarMaps, !Unification,\n        !GoalInfo) :-\n    % This variant is for use by modecheck_unify.m. During mode checking,\n    % all the type_infos should appear in the type_info_varmap.\n\n    % Compute the type_info/type_class_info variables that would be used\n    % if this unification ends up being a complicated_unify.\n    type_vars(Type, TypeVars),\n    list.map(rtti_lookup_type_info_locn(RttiVarMaps), TypeVars,\n        TypeInfoLocns),\n    add_unification_typeinfos(TypeInfoLocns, !Unification, !GoalInfo).\n\n:- pred add_unification_typeinfos(list(type_info_locn)::in,\n    unification::in, unification::out,\n    hlds_goal_info::in, hlds_goal_info::out) is det.\n\nadd_unification_typeinfos(TypeInfoLocns, !Unification, !GoalInfo) :-\n    list.map(type_info_locn_var, TypeInfoLocns, TypeInfoVars0),\n    list.remove_dups(TypeInfoVars0, TypeInfoVars),\n\n    % Insert the TypeInfoVars into the nonlocals field of the goal_info\n    % for the unification goal.\n    NonLocals0 = goal_info_get_nonlocals(!.GoalInfo),\n    set_of_var.insert_list(TypeInfoVars, NonLocals0, NonLocals),\n    goal_info_set_nonlocals(NonLocals, !GoalInfo),\n\n    % Also save those type_info vars into a field in the complicated_unify,\n    % so that quantification.m can recompute variable scopes properly.\n    % This field is also used by modecheck_unify.m -- for complicated\n    % unifications, it checks that all these variables are ground.\n    (\n        !.Unification = complicated_unify(Modes, CanFail, _),\n        !:Unification = complicated_unify(Modes, CanFail, TypeInfoVars)\n    ;\n        % This can happen if an earlier stage of compilation has already\n        % determined that this unification is particular kind of unification.\n        % In that case, the type_info vars won't be needed.\n        ( !.Unification = construct(_, _, _, _, _, _, _)\n        ; !.Unification = deconstruct(_, _, _, _, _, _)\n        ; !.Unification = assign(_, _)\n        ; !.Unification = simple_test(_, _)\n        )\n    ).\n\n:- pred polymorphism_process_unify_functor(prog_var::in, cons_id::in,\n    list(prog_var)::in, unify_mode::in, unification::in, unify_context::in,\n    hlds_goal_info::in, hlds_goal::out, bool::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_unify_functor(X0, ConsId0, ArgVars0, Mode0, Unification0,\n        UnifyContext, GoalInfo0, Goal, Changed, !Info) :-\n    poly_info_get_module_info(!.Info, ModuleInfo0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    lookup_var_type(VarTypes0, X0, TypeOfX),\n    list.length(ArgVars0, Arity),\n\n    % We replace any unifications with higher order pred constants\n    % by lambda expressions. For example, we replace\n    %\n    %   X = list.append(Y)     % Y::in, X::out\n    %\n    % with\n    %\n    %   X = (pred(A1::in, A2::out) is ... :- list.append(Y, A1, A2))\n    %\n    % We do this because it makes two things easier. First, mode analysis\n    % needs to check that the lambda goal doesn't bind any nonlocal variables\n    % (e.g. `Y' in above example). This would require a bit of moderately\n    % tricky special case code if we didn't expand them here. Second, this pass\n    % (polymorphism.m) is a lot easier if we don't have to handle higher order\n    % constants. If it turns out that the predicate was nonpolymorphic,\n    % lambda.m will turn the lambda expression back into a higher order\n    % constant again.\n    %\n    % Note that this transformation is also done by modecheck_unify.m, in case\n    % we are rerunning mode analysis after lambda.m has already been run;\n    % any changes to the code here will also need to be duplicated there.\n\n    (\n        % Check if variable has a higher order type.\n        ConsId0 = closure_cons(ShroudedPredProcId, _),\n        proc(PredId, ProcId0) = unshroud_pred_proc_id(ShroudedPredProcId),\n        type_is_higher_order_details(TypeOfX, Purity, _PredOrFunc, EvalMethod,\n            CalleeArgTypes)\n    ->\n        % An `invalid_proc_id' means the predicate is multi-moded. We can't\n        % pick the right mode yet. Perform the rest of the transformation with\n        % any mode (the first) but mark the goal with a feature so that mode\n        % checking knows to fix it up later.\n        ( ProcId0 = invalid_proc_id ->\n            module_info_pred_info(ModuleInfo0, PredId, PredInfo),\n            ProcIds = pred_info_procids(PredInfo),\n            (\n                ProcIds = [ProcId | _],\n                goal_info_add_feature(feature_lambda_undetermined_mode,\n                    GoalInfo0, GoalInfo1)\n            ;\n                ProcIds = [],\n                unexpected($module, $pred, \"no modes\")\n            )\n        ;\n            ProcId = ProcId0,\n            GoalInfo1 = GoalInfo0\n        ),\n        % Convert the higher order pred term to a lambda goal.\n        poly_info_get_varset(!.Info, VarSet0),\n        Context = goal_info_get_context(GoalInfo0),\n        convert_pred_to_lambda_goal(Purity, EvalMethod, X0, PredId, ProcId,\n            ArgVars0, CalleeArgTypes, UnifyContext, GoalInfo1, Context,\n            ModuleInfo0, Functor0, VarSet0, VarSet, VarTypes0, VarTypes),\n        poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n        % Process the unification in its new form.\n        polymorphism_process_unify(X0, Functor0, Mode0, Unification0,\n            UnifyContext, GoalInfo1, Goal, !Info),\n        Changed = yes\n    ;\n        % Is this a construction or deconstruction of an existentially\n        % typed data type?\n\n        % Check whether the functor had a \"new \" prefix.\n        % If so, assume it is a construction, and strip off the prefix.\n        % Otherwise, assume it is a deconstruction.\n\n        ConsId0 = cons(Functor0, Arity, ConsTypeCtor),\n        ( remove_new_prefix(Functor0, OrigFunctor) ->\n            ConsId = cons(OrigFunctor, Arity, ConsTypeCtor),\n            IsConstruction = yes\n        ;\n            ConsId = ConsId0,\n            IsConstruction = no\n        ),\n\n        % Check whether the functor (with the \"new \" prefix removed)\n        % is an existentially typed functor.\n        type_util.get_existq_cons_defn(ModuleInfo0, TypeOfX, ConsId, ConsDefn)\n    ->\n        % Add extra arguments to the unification for the\n        % type_info and/or type_class_info variables.\n\n        lookup_var_types(VarTypes0, ArgVars0, ActualArgTypes),\n        polymorphism_process_existq_unify_functor(ConsDefn,\n            IsConstruction, ActualArgTypes, TypeOfX, GoalInfo0,\n            ExtraVars, ExtraGoals, !Info),\n        ArgVars = ExtraVars ++ ArgVars0,\n        NonLocals0 = goal_info_get_nonlocals(GoalInfo0),\n        set_of_var.insert_list(ExtraVars, NonLocals0, NonLocals),\n        goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo1),\n\n        % Some of the argument unifications may be complicated unifications,\n        % which may need type_infos.\n        unification_typeinfos(TypeOfX, Unification0, Unification,\n            GoalInfo1, GoalInfo, _Changed, !Info),\n\n        UnifyExpr = unify(X0, rhs_functor(ConsId, IsConstruction, ArgVars),\n            Mode0, Unification, UnifyContext),\n        Unify = hlds_goal(UnifyExpr, GoalInfo),\n        GoalList = ExtraGoals ++ [Unify],\n        conj_list_to_goal(GoalList, GoalInfo0, Goal),\n        Changed = yes\n    ;\n        % We leave construction/deconstruction unifications alone.\n        % Some of the argument unifications may be complicated unifications,\n        % which may need type_infos.\n\n        % XXX Return original Goal0 if Changed = no.\n        unification_typeinfos(TypeOfX, Unification0, Unification,\n            GoalInfo0, GoalInfo, Changed, !Info),\n        GoalExpr = unify(X0, rhs_functor(ConsId0, no, ArgVars0), Mode0,\n            Unification, UnifyContext),\n        Goal = hlds_goal(GoalExpr, GoalInfo)\n    ).\n\nconvert_pred_to_lambda_goal(Purity, EvalMethod, X0, PredId, ProcId,\n        ArgVars0, PredArgTypes, UnifyContext, GoalInfo0, Context,\n        ModuleInfo0, Functor, !VarSet, !VarTypes) :-\n    % Create the new lambda-quantified variables.\n    create_fresh_vars(PredArgTypes, LambdaVars, !VarSet, !VarTypes),\n    Args = ArgVars0 ++ LambdaVars,\n\n    % Build up the hlds_goal_expr for the call that will form the lambda goal.\n    module_info_pred_proc_info(ModuleInfo0, PredId, ProcId,\n        PredInfo, ProcInfo),\n\n    PredModule = pred_info_module(PredInfo),\n    PredName = pred_info_name(PredInfo),\n    QualifiedPName = qualified(PredModule, PredName),\n\n    % The ConsId's type_ctor shouldn't matter in a call_unify_context.\n    ConsId = cons(QualifiedPName, list.length(ArgVars0),\n        cons_id_dummy_type_ctor),\n    RHS = rhs_functor(ConsId, no, ArgVars0),\n    CallUnifyContext = call_unify_context(X0, RHS, UnifyContext),\n    LambdaGoalExpr = plain_call(PredId, ProcId, Args, not_builtin,\n        yes(CallUnifyContext), QualifiedPName),\n\n    % Construct a goal_info for the lambda goal, making sure to set up\n    % the nonlocals field in the goal_info correctly. The goal_id is needed\n    % to compute constraint_ids correctly.\n\n    NonLocals = goal_info_get_nonlocals(GoalInfo0),\n    set_of_var.insert_list(LambdaVars, NonLocals, OutsideVars),\n    set_of_var.list_to_set(Args, InsideVars),\n    set_of_var.intersect(OutsideVars, InsideVars, LambdaNonLocals),\n    GoalId = goal_info_get_goal_id(GoalInfo0),\n    goal_info_init(LambdaGoalInfo0),\n    goal_info_set_context(Context, LambdaGoalInfo0, LambdaGoalInfo1),\n    goal_info_set_nonlocals(LambdaNonLocals, LambdaGoalInfo1, LambdaGoalInfo2),\n    goal_info_set_purity(Purity, LambdaGoalInfo2, LambdaGoalInfo3),\n    goal_info_set_goal_id(GoalId, LambdaGoalInfo3, LambdaGoalInfo),\n    LambdaGoal = hlds_goal(LambdaGoalExpr, LambdaGoalInfo),\n\n    % Work out the modes of the introduced lambda variables and the determinism\n    % of the lambda goal.\n    lambda_modes_and_det(ProcInfo, LambdaVars, LambdaModes, LambdaDet),\n\n    % Construct the lambda expression.\n\n    PredOrFunc = pred_info_is_pred_or_func(PredInfo),\n    % Higher-order values created in this fashion are always ground.\n    Groundness = ho_ground,\n    Functor = rhs_lambda_goal(Purity, Groundness, PredOrFunc, EvalMethod,\n        ArgVars0, LambdaVars, LambdaModes, LambdaDet, LambdaGoal).\n\nfix_undetermined_mode_lambda_goal(ProcId, Functor0, Functor, ModuleInfo) :-\n    Functor0 = rhs_lambda_goal(Purity, Groundness, PredOrFunc, EvalMethod,\n        ArgVars0, LambdaVars, _LambdaModes0, _LambdaDet0, LambdaGoal0),\n    LambdaGoal0 = hlds_goal(_, LambdaGoalInfo),\n    goal_to_conj_list(LambdaGoal0, LambdaGoalList0),\n    (\n        list.split_last(LambdaGoalList0, LambdaGoalButLast0, LastGoal0),\n        LastGoal0 = hlds_goal(LastGoalExpr0, LastGoalInfo0),\n        LastGoalExpr0 = plain_call(PredId0, _DummyProcId, Args0, not_builtin,\n            MaybeCallUnifyContext0, QualifiedPName0)\n    ->\n        LambdaGoalButLast = LambdaGoalButLast0,\n        LastGoalInfo = LastGoalInfo0,\n        PredId = PredId0,\n        Args = Args0,\n        MaybeCallUnifyContext = MaybeCallUnifyContext0,\n        QualifiedPName = QualifiedPName0\n    ;\n        unexpected($module, $pred, \"unmatched lambda goal\")\n    ),\n\n    module_info_pred_proc_info(ModuleInfo, PredId, ProcId, _, ProcInfo),\n\n    % Build up the lambda goal.\n    LastGoalExpr = plain_call(PredId, ProcId, Args, not_builtin,\n        MaybeCallUnifyContext, QualifiedPName),\n    LastGoal = hlds_goal(LastGoalExpr, LastGoalInfo),\n    conj_list_to_goal(LambdaGoalButLast ++ [LastGoal], LambdaGoalInfo,\n        LambdaGoal),\n\n    % Work out the modes of the introduced lambda variables and the determinism\n    % of the lambda goal.\n    lambda_modes_and_det(ProcInfo, LambdaVars, LambdaModes, LambdaDet),\n\n    % Construct the lambda expression.\n    Functor = rhs_lambda_goal(Purity, Groundness, PredOrFunc, EvalMethod,\n        ArgVars0, LambdaVars, LambdaModes, LambdaDet, LambdaGoal).\n\n:- pred lambda_modes_and_det(proc_info::in, prog_vars::in, list(mer_mode)::out,\n    determinism::out) is det.\n\nlambda_modes_and_det(ProcInfo, LambdaVars, LambdaModes, LambdaDet) :-\n    proc_info_get_argmodes(ProcInfo, ArgModes),\n    list.length(ArgModes, NumArgModes),\n    list.length(LambdaVars, NumLambdaVars),\n    ( list.drop(NumArgModes - NumLambdaVars, ArgModes, LambdaModesPrime) ->\n        LambdaModes = LambdaModesPrime\n    ;\n        unexpected($module, $pred, \"list.drop failed\")\n    ),\n    proc_info_get_declared_determinism(ProcInfo, MaybeDet),\n    (\n        MaybeDet = yes(Det),\n        LambdaDet = Det\n    ;\n        MaybeDet = no,\n        sorry($module, $pred,\n            \"determinism inference for higher order predicate terms.\")\n    ).\n\n:- pred create_fresh_vars(list(mer_type)::in, list(prog_var)::out,\n    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out) is det.\n\ncreate_fresh_vars([], [], !VarSet, !VarTypes).\ncreate_fresh_vars([Type | Types], [Var | Vars], !VarSet, !VarTypes) :-\n    varset.new_var(Var, !VarSet),\n    add_var_type(Var, Type, !VarTypes),\n    create_fresh_vars(Types, Vars, !VarSet, !VarTypes).\n\n%-----------------------------------------------------------------------------%\n\n    % Compute the extra arguments that we need to add to a unification with\n    % an existentially quantified data constructor.\n    %\n:- pred polymorphism_process_existq_unify_functor(ctor_defn::in, bool::in,\n    list(mer_type)::in, mer_type::in, hlds_goal_info::in, list(prog_var)::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_existq_unify_functor(CtorDefn, IsConstruction,\n        ActualArgTypes, ActualRetType, GoalInfo,\n        ExtraVars, ExtraGoals, !Info) :-\n    CtorDefn = ctor_defn(CtorTypeVarSet, CtorExistQVars, CtorKindMap,\n        CtorExistentialConstraints, CtorArgTypes, CtorRetType),\n\n    % Rename apart the type variables in the constructor definition.\n    poly_info_get_typevarset(!.Info, TypeVarSet0),\n    tvarset_merge_renaming(TypeVarSet0, CtorTypeVarSet, TypeVarSet,\n        CtorToParentRenaming),\n    apply_variable_renaming_to_tvar_list(CtorToParentRenaming,\n        CtorExistQVars, ParentExistQVars),\n    apply_variable_renaming_to_tvar_kind_map(CtorToParentRenaming,\n        CtorKindMap, ParentKindMap),\n    apply_variable_renaming_to_prog_constraint_list(CtorToParentRenaming,\n        CtorExistentialConstraints, ParentExistentialConstraints),\n    apply_variable_renaming_to_type_list(CtorToParentRenaming,\n        CtorArgTypes, ParentArgTypes),\n    apply_variable_renaming_to_type(CtorToParentRenaming, CtorRetType,\n        ParentRetType),\n    poly_info_set_typevarset(TypeVarSet, !Info),\n\n    % Compute the type bindings resulting from the functor's actual argument\n    % and return types. These are the ones that might bind the ExistQVars.\n    type_list_subsumes_det([ParentRetType | ParentArgTypes],\n        [ActualRetType | ActualArgTypes], ParentToActualTypeSubst),\n\n    % Create type_class_info variables for the type class constraints.\n    poly_info_get_constraint_map(!.Info, ConstraintMap),\n    GoalId = goal_info_get_goal_id(GoalInfo),\n    list.length(ParentExistentialConstraints, NumExistentialConstraints),\n    Context = goal_info_get_context(GoalInfo),\n    (\n        IsConstruction = yes,\n        % Assume it is a construction.\n        lookup_hlds_constraint_list(ConstraintMap, unproven, GoalId,\n            NumExistentialConstraints, ActualExistentialConstraints),\n        make_typeclass_info_vars(ActualExistentialConstraints, [], Context,\n            ExtraTypeClassVarsMCAs, ExtraTypeClassGoals, !Info),\n        assoc_list.keys(ExtraTypeClassVarsMCAs, ExtraTypeClassVars)\n    ;\n        IsConstruction = no,\n        % Assume it is a deconstruction.\n        lookup_hlds_constraint_list(ConstraintMap, assumed, GoalId,\n            NumExistentialConstraints, ActualExistentialConstraints),\n        make_existq_typeclass_info_vars(ActualExistentialConstraints,\n            ExtraTypeClassVars, ExtraTypeClassGoals, !Info)\n    ),\n\n    % Compute the set of _unconstrained_ existentially quantified type\n    % variables, and then apply the type bindings to those type variables\n    % to figure out what types they are bound to.\n    constraint_list_get_tvars(ParentExistentialConstraints,\n        ParentExistConstrainedTVars),\n    list.delete_elems(ParentExistQVars, ParentExistConstrainedTVars,\n        ParentUnconstrainedExistQVars),\n    apply_rec_subst_to_tvar_list(ParentKindMap, ParentToActualTypeSubst,\n        ParentUnconstrainedExistQVars, ActualExistentialTypes),\n\n    % Create type_info variables for the _unconstrained_ existentially\n    % quantified type variables.\n    polymorphism_do_make_type_info_vars(ActualExistentialTypes, Context,\n        ExtraTypeInfoVarsMCAs, ExtraTypeInfoGoals, !Info),\n    assoc_list.keys(ExtraTypeInfoVarsMCAs, ExtraTypeInfoVars),\n\n    % The type_class_info variables go AFTER the type_info variables\n    % (for consistency with the order for argument passing,\n    % and because the RTTI support in the runtime system relies on it)\n\n    ExtraGoals = ExtraTypeInfoGoals ++ ExtraTypeClassGoals,\n    ExtraVars = ExtraTypeInfoVars ++ ExtraTypeClassVars.\n\n%-----------------------------------------------------------------------------%\n\n:- pred polymorphism_process_foreign_proc(pred_info::in,\n    hlds_goal_expr::in(bound(call_foreign_proc(ground,ground,ground,ground,\n    ground,ground,ground))), hlds_goal_info::in, hlds_goal::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_foreign_proc(PredInfo, GoalExpr0, GoalInfo0,\n        Goal, !Info) :-\n    % Insert the type_info vars into the argname map, so that the foreign_proc\n    % can refer to the type_info variable for type T as `TypeInfo_for_T'.\n    GoalExpr0 = call_foreign_proc(Attributes, PredId, ProcId,\n        Args0, ProcExtraArgs, MaybeTraceRuntimeCond, Impl),\n    ArgVars0 = list.map(foreign_arg_var, Args0),\n    polymorphism_process_call(PredId, ArgVars0, GoalInfo0, GoalInfo,\n        ExtraVars, ExtraGoals, !Info),\n    CanOptAwayUnnamed = yes,\n    polymorphism_process_foreign_proc_args(PredInfo, CanOptAwayUnnamed, Impl,\n        ExtraVars, ExtraArgs),\n    Args = ExtraArgs ++ Args0,\n\n    % Plug it all back together.\n    CallExpr = call_foreign_proc(Attributes, PredId, ProcId,\n        Args, ProcExtraArgs, MaybeTraceRuntimeCond, Impl),\n    Call = hlds_goal(CallExpr, GoalInfo),\n    GoalList = ExtraGoals ++ [Call],\n    conj_list_to_goal(GoalList, GoalInfo0, Goal).\n\n:- pred polymorphism_process_foreign_proc_args(pred_info::in, bool::in,\n    pragma_foreign_code_impl::in, list(prog_var)::in, list(foreign_arg)::out)\n    is det.\n\npolymorphism_process_foreign_proc_args(PredInfo, CanOptAwayUnnamed, Impl, Vars,\n        Args) :-\n    pred_info_get_arg_types(PredInfo, PredTypeVarSet, ExistQVars,\n        PredArgTypes),\n\n    % Find out which variables are constrained (so that we don't add\n    % type_infos for them).\n    pred_info_get_class_context(PredInfo, constraints(UnivCs, ExistCs)),\n    UnivVars0 = list.map(get_constrained_vars, UnivCs),\n    list.condense(UnivVars0, UnivConstrainedVars),\n    ExistVars0 = list.map(get_constrained_vars, ExistCs),\n    list.condense(ExistVars0, ExistConstrainedVars),\n\n    type_vars_list(PredArgTypes, PredTypeVars0),\n    list.remove_dups(PredTypeVars0, PredTypeVars1),\n    list.delete_elems(PredTypeVars1, UnivConstrainedVars, PredTypeVars2),\n    list.delete_elems(PredTypeVars2, ExistConstrainedVars, PredTypeVars),\n\n    % The argument order is described at the top of this file.\n\n    in_mode(In),\n    out_mode(Out),\n\n    list.map(foreign_proc_add_typeclass_info(CanOptAwayUnnamed, Out, Impl,\n        PredTypeVarSet), ExistCs, ExistTypeClassArgInfos),\n    list.map(foreign_proc_add_typeclass_info(CanOptAwayUnnamed, In, Impl,\n        PredTypeVarSet), UnivCs, UnivTypeClassArgInfos),\n    TypeClassArgInfos = UnivTypeClassArgInfos ++ ExistTypeClassArgInfos,\n\n    list.filter((pred(X::in) is semidet :- list.member(X, ExistQVars)),\n        PredTypeVars, ExistUnconstrainedVars, UnivUnconstrainedVars),\n\n    list.map(foreign_proc_add_typeinfo(CanOptAwayUnnamed, Out, Impl,\n        PredTypeVarSet), ExistUnconstrainedVars, ExistTypeArgInfos),\n    list.map(foreign_proc_add_typeinfo(CanOptAwayUnnamed, In, Impl,\n        PredTypeVarSet), UnivUnconstrainedVars, UnivTypeArgInfos),\n    TypeInfoArgInfos = UnivTypeArgInfos ++ ExistTypeArgInfos,\n\n    ArgInfos = TypeInfoArgInfos ++ TypeClassArgInfos,\n\n    % Insert type_info/typeclass_info types for all the inserted\n    % type_info/typeclass_info vars into the argument type list.\n\n    TypeInfoTypes = list.map((func(_) = type_info_type), PredTypeVars),\n    list.map(build_typeclass_info_type, UnivCs, UnivTypes),\n    list.map(build_typeclass_info_type, ExistCs, ExistTypes),\n    OrigArgTypes = TypeInfoTypes ++ UnivTypes ++ ExistTypes,\n\n    make_foreign_args(Vars, ArgInfos, OrigArgTypes, Args).\n\n:- pred foreign_proc_add_typeclass_info(bool::in, mer_mode::in,\n    pragma_foreign_code_impl::in, tvarset::in, prog_constraint::in,\n    pair(maybe(pair(string, mer_mode)), box_policy)::out) is det.\n\nforeign_proc_add_typeclass_info(CanOptAwayUnnamed, Mode, Impl, TypeVarSet,\n        Constraint, MaybeArgName - native_if_possible) :-\n    Constraint = constraint(SymName, Types),\n    Name = sym_name_to_string_sep(SymName, \"__\"),\n    type_vars_list(Types, TypeVars),\n    TypeVarNames = list.map(underscore_and_tvar_name(TypeVarSet), TypeVars),\n    string.append_list([\"TypeClassInfo_for_\", Name | TypeVarNames],\n        ConstraintVarName),\n    % If the variable name corresponding to the typeclass_info isn't mentioned\n    % in the C code fragment, don't pass the variable to the C code at all.\n    (\n        CanOptAwayUnnamed = yes,\n        foreign_code_does_not_use_variable(Impl, ConstraintVarName)\n    ->\n        MaybeArgName = no\n    ;\n        MaybeArgName = yes(ConstraintVarName - Mode)\n    ).\n\n:- pred foreign_proc_add_typeinfo(bool::in, mer_mode::in,\n    pragma_foreign_code_impl::in, tvarset::in, tvar::in,\n    pair(maybe(pair(string, mer_mode)), box_policy)::out) is det.\n\nforeign_proc_add_typeinfo(CanOptAwayUnnamed, Mode, Impl, TypeVarSet, TVar,\n        MaybeArgName - native_if_possible) :-\n    ( varset.search_name(TypeVarSet, TVar, TypeVarName) ->\n        C_VarName = \"TypeInfo_for_\" ++ TypeVarName,\n        % If the variable name corresponding to the type_info isn't mentioned\n        % in the C code fragment, don't pass the variable to the C code at all.\n        (\n            CanOptAwayUnnamed = yes,\n            foreign_code_does_not_use_variable(Impl, C_VarName)\n        ->\n            MaybeArgName = no\n        ;\n            MaybeArgName = yes(C_VarName - Mode)\n        )\n    ;\n        MaybeArgName = no\n    ).\n\n:- pred foreign_code_does_not_use_variable(pragma_foreign_code_impl::in,\n    string::in) is semidet.\n\nforeign_code_does_not_use_variable(Impl, VarName) :-\n    % XXX This test used to be turned off with the semidet_fail, as it caused\n    % the compiler to abort when compiling declarative_execution.m in stage2,\n    % but this is no longer the case.\n    % semidet_fail,\n    \\+ foreign_code_uses_variable(Impl, VarName).\n\n:- func underscore_and_tvar_name(tvarset, tvar) = string.\n\nunderscore_and_tvar_name(TypeVarSet, TVar) = TVarName :-\n    varset.lookup_name(TypeVarSet, TVar, TVarName0),\n    TVarName = \"_\" ++ TVarName0.\n\n:- pred polymorphism_process_plain_conj(list(hlds_goal)::in,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_plain_conj([], [], !Info).\npolymorphism_process_plain_conj([Goal0 | Goals0], [Goal | Goals], !Info) :-\n    polymorphism_process_goal(Goal0, Goal, !Info),\n    polymorphism_process_plain_conj(Goals0, Goals, !Info).\n\n:- pred polymorphism_process_par_conj(list(hlds_goal)::in,\n    list(hlds_goal)::out, cache_maps::in, poly_info::in, poly_info::out)\n    is det.\n\npolymorphism_process_par_conj([], [], _, !Info).\npolymorphism_process_par_conj([Goal0 | Goals0], [Goal | Goals],\n        InitialSnapshot, !Info) :-\n    % Any variable that a later parallel conjunct reuses from an earlier\n    % parallel conjunct (a) will definitely require synchronization, whose\n    % cost will be greater than the cost of building a typeinfo from scratch,\n    % and (b) may drastically reduce the available parallelism, if the earlier\n    % conjunct produces the variable late but the later conjunct requires it\n    % early.\n    set_cache_maps_snapshot(\"par conjunct\", InitialSnapshot, !Info),\n    polymorphism_process_goal(Goal0, Goal, !Info),\n    polymorphism_process_par_conj(Goals0, Goals, InitialSnapshot, !Info).\n\n:- pred polymorphism_process_disj(list(hlds_goal)::in, list(hlds_goal)::out,\n    cache_maps::in, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_disj([], [], _, !Info).\npolymorphism_process_disj([Goal0 | Goals0], [Goal | Goals], InitialSnapshot,\n        !Info) :-\n    set_cache_maps_snapshot(\"disjunct\", InitialSnapshot, !Info),\n    polymorphism_process_goal(Goal0, Goal, !Info),\n    polymorphism_process_disj(Goals0, Goals, InitialSnapshot, !Info).\n\n:- pred polymorphism_process_cases(list(case)::in, list(case)::out,\n    cache_maps::in, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_cases([], [], _, !Info).\npolymorphism_process_cases([Case0 | Cases0], [Case | Cases], InitialSnapshot,\n        !Info) :-\n    Case0 = case(MainConsId, OtherConsIds, Goal0),\n    set_cache_maps_snapshot(\"case\", InitialSnapshot, !Info),\n    polymorphism_process_goal(Goal0, Goal, !Info),\n    Case = case(MainConsId, OtherConsIds, Goal),\n    polymorphism_process_cases(Cases0, Cases, InitialSnapshot, !Info).\n\n%-----------------------------------------------------------------------------%\n\n    % XXX document me\n    %\n    % XXX the following code ought to be rewritten to handle\n    % existential/universal type_infos and type_class_infos\n    % in a more consistent manner.\n    %\n:- pred polymorphism_process_call(pred_id::in, list(prog_var)::in,\n    hlds_goal_info::in, hlds_goal_info::out,\n    list(prog_var)::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_call(PredId, ArgVars0, GoalInfo0, GoalInfo,\n        ExtraVars, ExtraGoals, !Info) :-\n    poly_info_get_var_types(!.Info, VarTypes),\n    poly_info_get_typevarset(!.Info, TypeVarSet0),\n    poly_info_get_module_info(!.Info, ModuleInfo),\n\n    % The order of the added variables is important, and must match the\n    % order specified at the top of this file.\n\n    module_info_pred_info(ModuleInfo, PredId, PredInfo),\n    pred_info_get_arg_types(PredInfo, PredTypeVarSet, PredExistQVars,\n        PredArgTypes),\n    pred_info_get_tvar_kinds(PredInfo, PredKindMap),\n    pred_info_get_class_context(PredInfo, PredClassContext),\n\n    % VarTypes, TypeVarSet* etc come from the caller.\n    % PredTypeVarSet, PredArgTypes, PredExistQVars, etc come\n    % directly from the callee.\n    % ParentArgTypes, ParentExistQVars etc come from a version\n    % of the callee that has been renamed apart from the caller.\n    %\n    % The difference between e.g. PredArgTypes and ParentArgTypes is the\n    % application of PredToParentTypeRenaming, which maps the type variables\n    % in the callee to new type variables in the caller. Adding the new type\n    % variables to TypeVarSet0 yields TypeVarSet.\n\n    ( varset.is_empty(PredTypeVarSet) ->\n        % Optimize a common case.\n        map.init(PredToParentTypeRenaming),\n        TypeVarSet = TypeVarSet0,\n        ParentArgTypes = PredArgTypes,\n        ParentKindMap = PredKindMap,\n        ParentTVars = [],\n        ParentExistQVars = []\n    ;\n        % This merge might be a performance bottleneck?\n        tvarset_merge_renaming(TypeVarSet0, PredTypeVarSet, TypeVarSet,\n            PredToParentTypeRenaming),\n        apply_variable_renaming_to_type_list(PredToParentTypeRenaming,\n            PredArgTypes, ParentArgTypes),\n        type_vars_list(ParentArgTypes, ParentTVars),\n        apply_variable_renaming_to_tvar_kind_map(PredToParentTypeRenaming,\n            PredKindMap, ParentKindMap),\n        apply_variable_renaming_to_tvar_list(PredToParentTypeRenaming,\n            PredExistQVars, ParentExistQVars)\n    ),\n\n    PredModule = pred_info_module(PredInfo),\n    PredName = pred_info_name(PredInfo),\n    PredArity = pred_info_orig_arity(PredInfo),\n    (\n        (\n            % Optimize for the common case of nonpolymorphic call\n            % with no constraints.\n            ParentTVars = [],\n            PredClassContext = constraints([], [])\n        ;\n            % Some builtins don't need or want the type_info.\n            no_type_info_builtin(PredModule, PredName, PredArity)\n        )\n    ->\n        GoalInfo = GoalInfo0,\n        ExtraGoals = [],\n        ExtraVars = []\n    ;\n        poly_info_set_typevarset(TypeVarSet, !Info),\n\n        % Compute which \"parent\" type variables are constrained\n        % by the type class constraints.\n        apply_variable_renaming_to_prog_constraints(PredToParentTypeRenaming,\n            PredClassContext, ParentClassContext),\n        ParentClassContext = constraints(ParentUnivConstraints,\n            ParentExistConstraints),\n        constraint_list_get_tvars(ParentUnivConstraints,\n            ParentUnivConstrainedTVars),\n        constraint_list_get_tvars(ParentExistConstraints,\n            ParentExistConstrainedTVars),\n\n        % Calculate the set of unconstrained type vars. Split these into\n        % existential and universal type vars.\n        list.remove_dups(ParentTVars, ParentUnconstrainedTVars0),\n        list.delete_elems(ParentUnconstrainedTVars0,\n            ParentUnivConstrainedTVars, ParentUnconstrainedTVars1),\n        list.delete_elems(ParentUnconstrainedTVars1,\n            ParentExistConstrainedTVars, ParentUnconstrainedTVars),\n        list.delete_elems(ParentUnconstrainedTVars, ParentExistQVars,\n            ParentUnconstrainedUnivTVars),\n        list.delete_elems(ParentUnconstrainedTVars,\n            ParentUnconstrainedUnivTVars, ParentUnconstrainedExistTVars),\n\n        % Calculate the \"parent to actual\" binding.\n        lookup_var_types(VarTypes, ArgVars0, ActualArgTypes),\n        type_list_subsumes_det(ParentArgTypes, ActualArgTypes,\n            ParentToActualTypeSubst),\n\n        % Make the universally quantified typeclass_infos for the call.\n        poly_info_get_constraint_map(!.Info, ConstraintMap),\n        GoalId = goal_info_get_goal_id(GoalInfo0),\n        list.length(ParentUnivConstraints, NumUnivConstraints),\n        lookup_hlds_constraint_list(ConstraintMap, unproven, GoalId,\n            NumUnivConstraints, ActualUnivConstraints),\n        apply_rec_subst_to_tvar_list(ParentKindMap, ParentToActualTypeSubst,\n            ParentExistQVars, ActualExistQVarTypes),\n        (\n            prog_type.type_list_to_var_list(ActualExistQVarTypes,\n                ActualExistQVars0)\n        ->\n            ActualExistQVars = ActualExistQVars0\n        ;\n            unexpected($module, $pred, \"existq_tvar bound\")\n        ),\n        Context = goal_info_get_context(GoalInfo0),\n        make_typeclass_info_vars(ActualUnivConstraints, ActualExistQVars,\n            Context, ExtraUnivClassVarsMCAs, ExtraUnivClassGoals,\n            !Info),\n        assoc_list.keys(ExtraUnivClassVarsMCAs, ExtraUnivClassVars),\n\n        % Make variables to hold any existentially quantified typeclass_infos\n        % in the call, insert them into the typeclass_info map.\n        list.length(ParentExistConstraints, NumExistConstraints),\n        lookup_hlds_constraint_list(ConstraintMap, assumed, GoalId,\n            NumExistConstraints, ActualExistConstraints),\n        make_existq_typeclass_info_vars(ActualExistConstraints,\n            ExtraExistClassVars, ExtraExistClassGoals, !Info),\n\n        % Make variables to hold typeinfos for unconstrained universal type\n        % vars.\n        apply_rec_subst_to_tvar_list(ParentKindMap, ParentToActualTypeSubst,\n            ParentUnconstrainedUnivTVars, ActualUnconstrainedUnivTypes),\n        polymorphism_do_make_type_info_vars(ActualUnconstrainedUnivTypes,\n            Context, ExtraUnivTypeInfoVarsMCAs,\n            ExtraUnivTypeInfoGoals, !Info),\n        assoc_list.keys(ExtraUnivTypeInfoVarsMCAs,\n            ExtraUnivTypeInfoVars),\n\n        % Make variables to hold typeinfos for unconstrained existential type\n        % vars.\n        apply_rec_subst_to_tvar_list(ParentKindMap, ParentToActualTypeSubst,\n            ParentUnconstrainedExistTVars, ActualUnconstrainedExistTypes),\n        polymorphism_do_make_type_info_vars(ActualUnconstrainedExistTypes,\n            Context, ExtraExistTypeInfoVarsMCAs,\n            ExtraExistTypeInfoGoals, !Info),\n        assoc_list.keys(ExtraExistTypeInfoVarsMCAs,\n            ExtraExistTypeInfoVars),\n\n        % Add up the extra vars and goals.\n        ExtraGoals = ExtraUnivClassGoals ++ ExtraExistClassGoals\n            ++ ExtraUnivTypeInfoGoals ++ ExtraExistTypeInfoGoals,\n        ExtraVars = ExtraUnivTypeInfoVars ++ ExtraExistTypeInfoVars\n            ++ ExtraUnivClassVars ++ ExtraExistClassVars,\n\n        % Update the nonlocals.\n        NonLocals0 = goal_info_get_nonlocals(GoalInfo0),\n        set_of_var.insert_list(ExtraVars, NonLocals0, NonLocals),\n        goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo)\n    ).\n\n%-----------------------------------------------------------------------------%\n\npolymorphism_process_new_call(CalleePredInfo, CalleeProcInfo, PredId, ProcId,\n        CallArgs0, BuiltinState, MaybeCallUnifyContext, SymName,\n        GoalInfo0, Goal, !Info) :-\n    % document me better\n    %\n    poly_info_get_typevarset(!.Info, TVarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    lookup_var_types(VarTypes0, CallArgs0, ActualArgTypes0),\n    pred_info_get_arg_types(CalleePredInfo, PredTVarSet, _PredExistQVars,\n        PredArgTypes),\n    proc_info_get_headvars(CalleeProcInfo, CalleeHeadVars),\n    proc_info_get_rtti_varmaps(CalleeProcInfo, CalleeRttiVarMaps),\n\n    % Work out how many type_info args we need to prepend.\n    NCallArgs0 = list.length(ActualArgTypes0),\n    NPredArgs  = list.length(PredArgTypes),\n    NExtraArgs = NPredArgs - NCallArgs0,\n    (\n        list.drop(NExtraArgs, PredArgTypes, OrigPredArgTypes0),\n        list.take(NExtraArgs, CalleeHeadVars, CalleeExtraHeadVars0)\n    ->\n        OrigPredArgTypes = OrigPredArgTypes0,\n        CalleeExtraHeadVars = CalleeExtraHeadVars0\n    ;\n        unexpected($module, $pred, \"extra args not found\")\n    ),\n\n    % Work out the bindings of type variables in the call.\n    tvarset_merge_renaming(TVarSet0, PredTVarSet, TVarSet,\n        PredToParentRenaming),\n    apply_variable_renaming_to_type_list(PredToParentRenaming,\n        OrigPredArgTypes, OrigParentArgTypes),\n    type_list_subsumes_det(OrigParentArgTypes, ActualArgTypes0,\n        ParentToActualTSubst),\n    poly_info_set_typevarset(TVarSet, !Info),\n\n    % Look up the type variables that the type_infos in the caller are for,\n    % and apply the type bindings to calculate the types that the caller\n    % should pass type_infos for.\n    GetTypeInfoTypes = (pred(ProgVar::in, TypeInfoType::out) is det :-\n        rtti_varmaps_var_info(CalleeRttiVarMaps, ProgVar, VarInfo),\n        (\n            VarInfo = type_info_var(TypeInfoType)\n        ;\n            VarInfo = typeclass_info_var(_),\n            unexpected($module, $pred,\n                \"unsupported: constraints on initialisation preds\")\n        ;\n            VarInfo = non_rtti_var,\n            unexpected($module, $pred,\n                \"missing rtti_var_info for initialisation pred\")\n        )\n    ),\n    list.map(GetTypeInfoTypes, CalleeExtraHeadVars, PredTypeInfoTypes),\n    apply_variable_renaming_to_type_list(PredToParentRenaming,\n        PredTypeInfoTypes, ParentTypeInfoTypes),\n    apply_rec_subst_to_type_list(ParentToActualTSubst, ParentTypeInfoTypes,\n        ActualTypeInfoTypes),\n\n    % Construct goals to make the required type_infos.\n    Ctxt = term.context_init,\n    polymorphism_do_make_type_info_vars(ActualTypeInfoTypes, Ctxt,\n        ExtraArgsConstArgs, ExtraGoals, !Info),\n    assoc_list.keys(ExtraArgsConstArgs, ExtraArgs),\n    CallArgs = ExtraArgs ++ CallArgs0,\n    NonLocals0 = goal_info_get_nonlocals(GoalInfo0),\n    NonLocals1 = set_of_var.list_to_set(ExtraArgs),\n    set_of_var.union(NonLocals0, NonLocals1, NonLocals),\n    goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo),\n    CallGoalExpr = plain_call(PredId, ProcId, CallArgs, BuiltinState,\n        MaybeCallUnifyContext, SymName),\n    CallGoal = hlds_goal(CallGoalExpr, GoalInfo),\n    conj_list_to_goal(ExtraGoals ++ [CallGoal], GoalInfo, Goal).\n\n%-----------------------------------------------------------------------------%\n\n    % If the pred we are processing is a polymorphic predicate, or contains\n    % polymorphically-typed goals, we may need to fix up the quantification\n    % (nonlocal variables) of the goal so that it includes the extra type_info\n    % variables and typeclass_info variables that we added to the headvars\n    % or the arguments of existentially typed predicate calls, function calls\n    % and deconstruction unifications.\n    %\n    % Type(class)-infos added for ground types passed to predicate calls,\n    % function calls and existentially typed construction unifications\n    % do not require requantification because they are local to the conjunction\n    % containing the type(class)-info construction and the goal which uses the\n    % type(class)-info. The nonlocals for those goals are adjusted by\n    % the code which creates/alters them. However, reusing a type_info changes\n    % it from being local to nonlocal.\n    %\n:- pred fixup_quantification(proc_arg_vector(prog_var)::in,\n    existq_tvars::in, hlds_goal::in, hlds_goal::out,\n    poly_info::in, poly_info::out) is det.\n\nfixup_quantification(HeadVars, ExistQVars, Goal0, Goal, !Info) :-\n    (\n        % Optimize common case.\n        ExistQVars = [],\n        rtti_varmaps_no_tvars(!.Info ^ poly_rtti_varmaps),\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        NumReuses = 0\n    ->\n        Goal = Goal0\n    ;\n        poly_info_get_varset(!.Info, VarSet0),\n        poly_info_get_var_types(!.Info, VarTypes0),\n        poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n        OutsideVars = proc_arg_vector_to_set(HeadVars),\n        implicitly_quantify_goal_general(ordinary_nonlocals_maybe_lambda,\n            set_to_bitset(OutsideVars), _Warnings, Goal0, Goal,\n            VarSet0, VarSet, VarTypes0, VarTypes, RttiVarMaps0, RttiVarMaps),\n        poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n        poly_info_set_rtti_varmaps(RttiVarMaps, !Info)\n    ).\n\n    % If the lambda goal we are processing is polymorphically typed, we may\n    % need to fix up the quantification (nonlocal variables) so that it\n    % includes the type_info variables and typeclass_info variables for\n    % any polymorphically typed variables in the nonlocals set or in the\n    % arguments (either the lambda vars or the implicit curried argument\n    % variables). Including typeinfos for arguments which are not in the\n    % nonlocals set of the goal, i.e. unused arguments, is necessary only\n    % if typeinfo_liveness is set, but we do it always, since we don't have\n    % the options available here, and the since cost is pretty minimal.\n    %\n:- pred fixup_lambda_quantification(list(prog_var)::in,\n    list(prog_var)::in, existq_tvars::in, hlds_goal::in, hlds_goal::out,\n    set_of_progvar::out, poly_info::in, poly_info::out) is det.\n\nfixup_lambda_quantification(ArgVars, LambdaVars, ExistQVars, !Goal,\n        NewOutsideVars, !Info) :-\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    ( rtti_varmaps_no_tvars(RttiVarMaps0) ->\n        set_of_var.init(NewOutsideVars)\n    ;\n        poly_info_get_varset(!.Info, VarSet0),\n        poly_info_get_var_types(!.Info, VarTypes0),\n        !.Goal = hlds_goal(_, GoalInfo0),\n        NonLocals = goal_info_get_nonlocals(GoalInfo0),\n        set_of_var.insert_list(ArgVars, NonLocals, NonLocalsPlusArgs0),\n        set_of_var.insert_list(LambdaVars,\n            NonLocalsPlusArgs0, NonLocalsPlusArgs),\n        goal_util.extra_nonlocal_typeinfos(RttiVarMaps0, VarTypes0,\n            ExistQVars, NonLocalsPlusArgs, NewOutsideVars),\n        set_of_var.union(NonLocals, NewOutsideVars, OutsideVars),\n        implicitly_quantify_goal_general(ordinary_nonlocals_maybe_lambda,\n            OutsideVars, _Warnings, !Goal,\n            VarSet0, VarSet, VarTypes0, VarTypes, RttiVarMaps0, RttiVarMaps),\n        poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n        poly_info_set_rtti_varmaps(RttiVarMaps, !Info)\n    ).\n\n%-----------------------------------------------------------------------------%\n\n    % Given the list of constraints for a called predicate, create a list of\n    % variables to hold the typeclass_info for those constraints, and create\n    % a list of goals to initialize those typeclass_info variables to the\n    % appropriate typeclass_info structures for the constraints.\n    %\n    % Constraints should be renamed-apart and actual-to-formal substituted\n    % constraints. Constraints which are already in the rtti_varmaps are\n    % assumed to have already had their typeclass_infos initialized; for them,\n    % we just return the variable in the rtti_varmaps.\n    %\n:- pred make_typeclass_info_vars(list(prog_constraint)::in,\n    existq_tvars::in, prog_context::in,\n    assoc_list(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_vars(Constraints, ExistQVars, Context,\n        TypeClassInfoVarsMCAs, ExtraGoals, !Info) :-\n    SeenInstances = [],\n    make_typeclass_info_vars_2(Constraints, SeenInstances, ExistQVars, Context,\n        TypeClassInfoVarsMCAs, ExtraGoals, !Info).\n\n    % Accumulator version of the above.\n    %\n:- pred make_typeclass_info_vars_2(list(prog_constraint)::in,\n    list(prog_constraint)::in, existq_tvars::in, prog_context::in,\n    assoc_list(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_vars_2([], _Seen, _ExistQVars, _Context,\n        [], [], !Info).\nmake_typeclass_info_vars_2([Constraint | Constraints], Seen, ExistQVars,\n        Context, [TypeClassInfoVarMCA | TypeClassInfoVarsMCAs],\n        ExtraGoals, !Info) :-\n    make_typeclass_info_var(Constraint, [Constraint | Seen],\n        ExistQVars, Context, TypeClassInfoVarMCA, HeadExtraGoals, !Info),\n    make_typeclass_info_vars_2(Constraints, Seen, ExistQVars,\n        Context, TypeClassInfoVarsMCAs, TailExtraGoals, !Info),\n    ExtraGoals = HeadExtraGoals ++ TailExtraGoals.\n\n:- pred make_typeclass_info_var(prog_constraint::in,\n    list(prog_constraint)::in, existq_tvars::in, prog_context::in,\n    pair(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_var(Constraint, Seen, ExistQVars, Context,\n        TypeClassInfoVarMCA, Goals, !Info) :-\n    (\n        poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n        rtti_search_typeclass_info_var(RttiVarMaps0, Constraint,\n            OldTypeClassInfoVar)\n    ->\n        % We already have a typeclass_info for this constraint, either from\n        % a parameter to the pred or from an existentially quantified goal\n        % that we have already processed.\n        TypeClassInfoVar = OldTypeClassInfoVar,\n        TypeClassInfoVarMCA = TypeClassInfoVar - no,\n        Goals = []\n    ;\n        % We don't have the typeclass_info, so we must either have a proof\n        % that tells us how to make it, or ...\n        map.search(!.Info ^ poly_proof_map, Constraint, Proof)\n    ->\n        make_typeclass_info_from_proof(Constraint, Seen, Proof, ExistQVars,\n            Context, TypeClassInfoVarMCA, Goals, !Info)\n    ;\n        % ... it will be produced by an existentially typed goal that\n        % we will process later on.\n        make_typeclass_info_head_var(do_record_type_info_locns, Constraint,\n            TypeClassInfoVar, !Info),\n        poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n        rtti_reuse_typeclass_info_var(TypeClassInfoVar,\n            RttiVarMaps0, RttiVarMaps),\n        poly_info_set_rtti_varmaps(RttiVarMaps, !Info),\n        TypeClassInfoVarMCA = TypeClassInfoVar - no,\n        Goals = []\n    ).\n\n:- pred make_typeclass_info_from_proof(prog_constraint::in,\n    list(prog_constraint)::in, constraint_proof::in, existq_tvars::in,\n    prog_context::in, pair(prog_var, maybe(const_struct_arg))::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_from_proof(Constraint, Seen, Proof,\n        ExistQVars, Context, TypeClassInfoVarMCA, Goals, !Info) :-\n    (\n        % XXX MR_Dictionary should have MR_Dictionaries for superclass\n        % We have to extract the typeclass_info from another one.\n        Proof = superclass(SubClassConstraint),\n        make_typeclass_info_from_subclass(Constraint, Seen, SubClassConstraint,\n            ExistQVars, Context, TypeClassInfoVarMCA, Goals, !Info)\n    ;\n        % We have to construct the typeclass_info using an instance\n        % declaration.\n        Proof = apply_instance(InstanceNum),\n        make_typeclass_info_from_instance(Constraint, Seen, InstanceNum,\n            ExistQVars, Context, TypeClassInfoVarMCA, Goals, !Info)\n    ).\n\n:- pred make_typeclass_info_from_subclass(prog_constraint::in,\n    list(prog_constraint)::in, prog_constraint::in, existq_tvars::in,\n    prog_context::in, pair(prog_var, maybe(const_struct_arg))::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_from_subclass(Constraint, Seen, SubClassConstraint,\n        ExistQVars, Context, TypeClassInfoVar - MaybeTCIConstArg, Goals,\n        !Info) :-\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = no\n                ;\n                    SelectedPred = yes,\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    impure set_level(Level + 1),\n\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"make_typeclass_info_from_subclass\", !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"Constraint: \", !IO),\n                    io.write(Constraint, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"Seen: \", !IO),\n                    ( Seen = [Constraint] ->\n                        io.write_string(\"[Constraint]\\n\", !IO)\n                    ;\n                        io.write(Seen, !IO),\n                        io.nl(!IO)\n                    ),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"SubClassConstraint: \", !IO),\n                    io.write(SubClassConstraint, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"ExistQVars: \", !IO),\n                    io.write(ExistQVars, !IO),\n                    io.nl(!IO),\n                    io.nl(!IO)\n                )\n            )\n        )\n    ),\n\n    % Work out where to extract the typeclass info from.\n    SubClassConstraint = constraint(SubClassName, SubClassTypes),\n    list.length(SubClassTypes, SubClassArity),\n    SubClassId = class_id(SubClassName, SubClassArity),\n\n    % Make the typeclass_info for the subclass.\n    make_typeclass_info_var(SubClassConstraint, Seen, ExistQVars, Context,\n        SubClassVarMCA, SubClassVarGoals, !Info),\n    SubClassVarMCA = SubClassVar - SubClassMCA,\n\n    % Look up the definition of the subclass.\n    poly_info_get_module_info(!.Info, ModuleInfo),\n    module_info_get_class_table(ModuleInfo, ClassTable),\n    map.lookup(ClassTable, SubClassId, SubClassDefn),\n\n    % Work out which superclass typeclass_info to take.\n    map.from_corresponding_lists(SubClassDefn ^ class_vars, SubClassTypes,\n        SubTypeSubst),\n    apply_subst_to_prog_constraint_list(SubTypeSubst,\n        SubClassDefn ^ class_supers, SuperClasses),\n    ( list.nth_member_search(SuperClasses, Constraint, SuperClassIndex0) ->\n        SuperClassIndex0 = SuperClassIndex\n    ;\n        % We shouldn't have got this far if the constraints were not satisfied.\n        unexpected($module, $pred, \"constraint not in constraint list\")\n    ),\n\n    (\n        SubClassMCA = yes(SubClassConstArg),\n        (\n            SubClassConstArg = csa_constant(_, _),\n            unexpected($module, $pred, \"typeclass infos need a cell\")\n        ;\n            SubClassConstArg = csa_const_struct(SubClassConstNum),\n            poly_info_get_const_struct_db(!.Info, ConstStructDb),\n            lookup_const_struct_num(ConstStructDb, SubClassConstNum,\n                SubClassConstStruct),\n            SubClassConstStruct = const_struct(SubClassConsId, SubClassArgs,\n                _, _),\n            (\n                SubClassConsId = typeclass_info_cell_constructor,\n                SubClassArgs = [BTCIArg | OtherArgs],\n                BTCIArg = csa_constant(BTCIConsId, _),\n                BTCIConsId = base_typeclass_info_const(_, SubClassId,\n                    SubInstanceNum, _),\n                module_info_get_instance_table(ModuleInfo, InstanceTable),\n                map.lookup(InstanceTable, SubClassId, SubInstanceDefns),\n                list.index1(SubInstanceDefns, SubInstanceNum, SubInstanceDefn),\n                num_extra_instance_args(SubInstanceDefn, NumExtra),\n                Index = NumExtra + SuperClassIndex,\n                list.det_index1(OtherArgs, Index, SelectedArg),\n                SelectedArg = csa_const_struct(SelectedConstNum)\n            ->\n                materialize_typeclass_info_var(Constraint, SelectedConstNum,\n                    TypeClassInfoVar, Goals, !Info),\n                MaybeTCIConstArg = yes(SelectedArg)\n            ;\n                unexpected($module, $pred,\n                    \"unexpected typeclass info structure\")\n            )\n        ),\n\n        trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n            some [SelectedPred, Level, IndentStr, ResultStr] (\n                promise_pure (\n                    semipure get_selected_pred(SelectedPred),\n                    semipure get_level(Level),\n                    impure set_level(Level - 1),\n                    (\n                        SelectedPred = no\n                    ;\n                        SelectedPred = yes,\n                        IndentStr = string.duplicate_char(' ', (Level-1) * 4),\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"subclass constant result \", !IO),\n                        io.write(TypeClassInfoVar - MaybeTCIConstArg, !IO),\n                        io.nl(!IO),\n                        io.nl(!IO)\n                    )\n                )\n            )\n        )\n    ;\n        SubClassMCA = no,\n        new_typeclass_info_var(Constraint, typeclass_info_kind,\n            TypeClassInfoVar, _TypeClassInfoVarType, !Info),\n        get_poly_const(SuperClassIndex, IndexVar, IndexGoals, !Info),\n\n        % We extract the superclass typeclass_info by inserting a call\n        % to superclass_from_typeclass_info in private_builtin.\n        goal_util.generate_simple_call(mercury_private_builtin_module,\n            \"superclass_from_typeclass_info\",\n            pf_predicate, only_mode, detism_det, purity_pure,\n            [SubClassVar, IndexVar, TypeClassInfoVar], [],\n            instmap_delta_bind_no_var, ModuleInfo, term.context_init,\n            SuperClassGoal),\n        Goals = SubClassVarGoals ++ IndexGoals ++ [SuperClassGoal],\n        MaybeTCIConstArg = no,\n\n        trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n            some [SelectedPred, Level, IndentStr, ResultStr] (\n                promise_pure (\n                    semipure get_selected_pred(SelectedPred),\n                    semipure get_level(Level),\n                    impure set_level(Level - 1),\n                    (\n                        SelectedPred = no\n                    ;\n                        SelectedPred = yes,\n                        IndentStr = string.duplicate_char(' ', (Level-1) * 4),\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"subclass computed result \", !IO),\n                        io.write(TypeClassInfoVar - MaybeTCIConstArg, !IO),\n                        io.nl(!IO),\n                        io.nl(!IO)\n                    )\n                )\n            )\n        )\n    ).\n\n:- pred make_typeclass_info_from_instance(prog_constraint::in,\n    list(prog_constraint)::in, int::in, existq_tvars::in, prog_context::in,\n    pair(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_from_instance(Constraint, Seen, InstanceNum, ExistQVars,\n        Context, TypeClassInfoVarMCA, Goals, !Info) :-\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = no\n                ;\n                    SelectedPred = yes,\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    impure set_level(Level + 1),\n\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"make_typeclass_info_from_instance\", !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"Constraint: \", !IO),\n                    io.write(Constraint, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"Seen: \", !IO),\n                    ( Seen = [Constraint] ->\n                        io.write_string(\"[Constraint]\\n\", !IO)\n                    ;\n                        io.write(Seen, !IO),\n                        io.nl(!IO)\n                    ),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"InstanceNum: \", !IO),\n                    io.write(InstanceNum, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"ExistQVars: \", !IO),\n                    io.write(ExistQVars, !IO),\n                    io.nl(!IO),\n                    io.nl(!IO)\n                )\n            )\n        )\n    ),\n\n    poly_info_get_const_struct_db(!.Info, ConstStructDb0),\n    InstanceId = ciid(InstanceNum, Constraint, Seen),\n    (\n        ExistQVars = [],\n        search_for_constant_instance(ConstStructDb0, InstanceId,\n            InstanceIdConstNum)\n    ->\n        materialize_typeclass_info_var(Constraint, InstanceIdConstNum,\n            TypeClassInfoVar, Goals, !Info),\n        TypeClassInfoVarMCA =\n            TypeClassInfoVar - yes(csa_const_struct(InstanceIdConstNum)),\n\n        trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n            some [SelectedPred, Level, IndentStr, ResultStr] (\n                promise_pure (\n                    semipure get_selected_pred(SelectedPred),\n                    semipure get_level(Level),\n                    impure set_level(Level - 1),\n                    (\n                        SelectedPred = no\n                    ;\n                        SelectedPred = yes,\n                        IndentStr = string.duplicate_char(' ', (Level-1) * 4),\n                        (\n                            Goals = [],\n                            ResultStr = \"instance doubly cached result \"\n                        ;\n                            Goals = [_ | _],\n                            ResultStr = \"instance cached result \"\n                        ),\n\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(ResultStr, !IO),\n                        io.write(TypeClassInfoVarMCA, !IO),\n                        io.nl(!IO),\n                        io.nl(!IO)\n                    )\n                )\n            )\n        )\n    ;\n        do_make_typeclass_info_from_instance(InstanceId, ExistQVars,\n            Context, TypeClassInfoVarMCA, Goals, !Info),\n        trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n            some [SelectedPred, Level, IndentStr] (\n                promise_pure (\n                    semipure get_selected_pred(SelectedPred),\n                    semipure get_level(Level),\n                    impure set_level(Level - 1),\n                    (\n                        SelectedPred = no\n                    ;\n                        SelectedPred = yes,\n                        IndentStr = string.duplicate_char(' ', (Level-1) * 4),\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"instance computed result: \", !IO),\n                        io.write(TypeClassInfoVarMCA, !IO),\n                        io.nl(!IO),\n\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"type_info_var_map \", !IO),\n                        io.write(!.Info ^ poly_type_info_var_map, !IO),\n                        io.nl(!IO),\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"typeclass_info_map \", !IO),\n                        io.write(!.Info ^ poly_typeclass_info_map, !IO),\n                        io.nl(!IO),\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"struct_var_map \", !IO),\n                        io.write(!.Info ^ poly_const_struct_var_map, !IO),\n                        io.nl(!IO),\n                        io.nl(!IO)\n                    )\n                )\n            )\n        )\n    ).\n\n:- pred do_make_typeclass_info_from_instance(const_instance_id::in,\n    existq_tvars::in, prog_context::in,\n    pair(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\ndo_make_typeclass_info_from_instance(InstanceId, ExistQVars, Context,\n        TypeClassInfoVarMCA, Goals, !Info) :-\n    poly_info_get_module_info(!.Info, ModuleInfo),\n    module_info_get_instance_table(ModuleInfo, InstanceTable),\n    module_info_get_class_table(ModuleInfo, ClassTable),\n    poly_info_get_typevarset(!.Info, TypeVarSet),\n    poly_info_get_proofs(!.Info, Proofs0),\n\n    InstanceId = ciid(InstanceNum, Constraint, Seen),\n    Constraint = constraint(ClassName, ConstrainedTypes),\n\n    list.length(ConstrainedTypes, ClassArity),\n    ClassId = class_id(ClassName, ClassArity),\n\n    map.lookup(InstanceTable, ClassId, InstanceList),\n    list.det_index1(InstanceList, InstanceNum, ProofInstanceDefn),\n\n    ProofInstanceDefn = hlds_instance_defn(_, _, _, InstanceConstraints,\n        InstanceTypes, _, _, _, InstanceTVarset, InstanceProofs),\n\n    % XXX kind inference:\n    % we assume all tvars have kind `star'.\n    map.init(KindMap),\n\n    type_vars_list(InstanceTypes, InstanceTvars),\n    get_unconstrained_tvars(InstanceTvars, InstanceConstraints,\n        UnconstrainedTvars),\n\n    % We can ignore the new typevarset because all the type variables\n    % in the instance constraints and superclass proofs must appear\n    % in the arguments of the instance, and all such variables\n    % are bound when we call type_list_subsumes then apply\n    % the resulting bindings.\n    tvarset_merge_renaming(TypeVarSet, InstanceTVarset, _NewTVarset, Renaming),\n    apply_variable_renaming_to_type_list(Renaming, InstanceTypes,\n        RenamedInstanceTypes),\n    type_list_subsumes_det(RenamedInstanceTypes, ConstrainedTypes,\n        InstanceSubst),\n    apply_variable_renaming_to_prog_constraint_list(Renaming,\n        InstanceConstraints, RenamedInstanceConstraints),\n    apply_rec_subst_to_prog_constraint_list(InstanceSubst,\n        RenamedInstanceConstraints, ActualInstanceConstraints0),\n    % XXX document diamond as guess\n    % XXX does anyone know what the preceding line means?\n    list.delete_elems(ActualInstanceConstraints0, Seen,\n        ActualInstanceConstraints),\n    apply_variable_renaming_to_constraint_proofs(Renaming,\n        InstanceProofs, RenamedInstanceProofs),\n    apply_rec_subst_to_constraint_proofs(InstanceSubst,\n        RenamedInstanceProofs, ActualInstanceProofs),\n\n    apply_variable_renaming_to_tvar_list(Renaming, UnconstrainedTvars,\n        RenamedUnconstrainedTvars),\n    apply_variable_renaming_to_tvar_kind_map(Renaming, KindMap,\n        RenamedKindMap),\n    apply_rec_subst_to_tvar_list(RenamedKindMap, InstanceSubst,\n        RenamedUnconstrainedTvars, ActualUnconstrainedTypes),\n\n    map.overlay(Proofs0, ActualInstanceProofs, Proofs),\n\n    get_var_maps_snapshot(\"make_typeclass_info_from_instance\",\n        InitialVarMapsSnapshot, !Info),\n\n    % Make the type_infos for the types that are constrained by this.\n    % These are packaged in the typeclass_info.\n    polymorphism_do_make_type_info_vars(ConstrainedTypes, Context,\n        ArgTypeInfoVarsMCAs, TypeInfoGoals, !Info),\n\n    % Make the typeclass_infos for the constraints from the context of the\n    % instance decl.\n    make_typeclass_info_vars_2(ActualInstanceConstraints, Seen, ExistQVars,\n        Context, ArgTypeClassInfoVarsMCAs, InstanceConstraintGoals, !Info),\n\n    % Make the type_infos for the unconstrained type variables\n    % from the head of the instance declaration.\n    polymorphism_do_make_type_info_vars(ActualUnconstrainedTypes, Context,\n        ArgUnconstrainedTypeInfoVarsMCAs, UnconstrainedTypeInfoGoals, !Info),\n\n    % --------------------- %\n\n    map.lookup(ClassTable, ClassId, ClassDefn),\n\n    get_arg_superclass_vars(ClassDefn, ConstrainedTypes, Proofs,\n        ExistQVars, ArgSuperClassVarsMCAs, SuperClassGoals, !Info),\n\n    PrevGoals = UnconstrainedTypeInfoGoals ++ TypeInfoGoals ++\n        InstanceConstraintGoals ++ SuperClassGoals,\n    % Lay out the argument variables as expected in the typeclass_info.\n    ArgVarsMCAs = ArgUnconstrainedTypeInfoVarsMCAs ++\n        ArgTypeClassInfoVarsMCAs ++\n        ArgSuperClassVarsMCAs ++ ArgTypeInfoVarsMCAs,\n    list.map(make_const_or_var_arg, ArgVarsMCAs, ArgCOVAs),\n\n    Constraint = constraint(ConstraintClassName, ConstraintArgTypes),\n    poly_info_get_typeclass_info_map(!.Info, TypeClassInfoMap0),\n    (\n        map.search(TypeClassInfoMap0, ConstraintClassName, ClassNameMap0),\n        map.search(ClassNameMap0, ConstraintArgTypes, OldEntry0),\n        OldEntry0 = typeclass_info_map_entry(_BaseConsId, ArgsMap0),\n        map.search(ArgsMap0, ArgCOVAs, OldTypeClassInfoVarMCA0)\n    ->\n        TypeClassInfoVarMCA = OldTypeClassInfoVarMCA0,\n        Goals = [],\n        set_var_maps_snapshot(\"make_typeclass_info\",\n            InitialVarMapsSnapshot, !Info),\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 2, !Info)\n    ;\n        BaseConsId = base_typeclass_info_cons_id(InstanceTable,\n            Constraint, InstanceNum, InstanceTypes),\n        materialize_base_typeclass_info_var(Constraint, BaseConsId, BaseVar,\n            BaseGoals, !Info),\n        construct_typeclass_info(Constraint, BaseVar, BaseConsId, ArgVarsMCAs,\n            InitialVarMapsSnapshot, TypeClassInfoVar, TypeClassInfoMCA,\n            BaseGoals ++ PrevGoals, Goals, !Info),\n        TypeClassInfoVarMCA = TypeClassInfoVar - TypeClassInfoMCA,\n\n        % We must start the search from scratch, since construct_typeclass_info\n        % may have reset all the cache maps.\n        poly_info_get_typeclass_info_map(!.Info, TypeClassInfoMap1),\n        ( map.search(TypeClassInfoMap1, ConstraintClassName, ClassNameMap1) ->\n            ( map.search(ClassNameMap1, ConstraintArgTypes, OldEntry1) ->\n                OldEntry1 = typeclass_info_map_entry(BaseConsId1, ArgsMap1),\n                expect(unify(BaseConsId1, BaseConsId), $module, $pred,\n                    \"BaseConsId1 != BaseConsId\"),\n                map.det_insert(ArgCOVAs, TypeClassInfoVarMCA,\n                    ArgsMap1, ArgsMap),\n                Entry = typeclass_info_map_entry(BaseConsId, ArgsMap),\n                map.det_update(ConstraintArgTypes, Entry,\n                    ClassNameMap1, ClassNameMap),\n                map.det_update(ConstraintClassName, ClassNameMap,\n                    TypeClassInfoMap1, TypeClassInfoMap)\n            ;\n                ArgsMap = map.singleton(ArgCOVAs, TypeClassInfoVarMCA),\n                Entry = typeclass_info_map_entry(BaseConsId, ArgsMap),\n                map.det_insert(ConstraintArgTypes, Entry,\n                    ClassNameMap1, ClassNameMap),\n                map.det_update(ConstraintClassName, ClassNameMap,\n                    TypeClassInfoMap1, TypeClassInfoMap)\n            )\n        ;\n            ArgsMap = map.singleton(ArgCOVAs, TypeClassInfoVarMCA),\n            Entry = typeclass_info_map_entry(BaseConsId, ArgsMap),\n            ClassNameMap = map.singleton(ConstraintArgTypes, Entry),\n            map.det_insert(ConstraintClassName, ClassNameMap,\n                TypeClassInfoMap1, TypeClassInfoMap)\n        ),\n        poly_info_set_typeclass_info_map(TypeClassInfoMap, !Info)\n    ),\n\n    (\n        TypeClassInfoVarMCA = _ - yes(TypeClassInfoConstArg),\n        TypeClassInfoConstArg = csa_const_struct(TypeClassInfoConstArgNum)\n    ->\n        poly_info_get_const_struct_db(!.Info, ConstStructDb1),\n        insert_constant_instance(InstanceId, TypeClassInfoConstArgNum,\n            ConstStructDb1, ConstStructDb),\n        poly_info_set_const_struct_db(ConstStructDb, !Info)\n    ;\n        true\n    ).\n\n:- pred construct_typeclass_info(prog_constraint::in,\n    prog_var::in, cons_id::in,\n    assoc_list(prog_var, maybe(const_struct_arg))::in, var_maps::in,\n    prog_var::out, maybe(const_struct_arg)::out,\n    list(hlds_goal)::in, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nconstruct_typeclass_info(Constraint, BaseVar, BaseConsId, ArgVarsMCAs,\n        InitialVarMapsSnapshot, TypeClassInfoVar, TypeClassInfoMCA,\n        PrevGoals, AllGoals, !Info) :-\n    % Build a unification to add the argvars to the base_typeclass_info.\n    ConsId = typeclass_info_cell_constructor,\n\n    poly_info_get_const_struct_db(!.Info, ConstStructDb0),\n    const_struct_db_get_poly_enabled(ConstStructDb0, ConstStructEnabled),\n    (\n        ConstStructEnabled = yes,\n        all_are_const_struct_args(ArgVarsMCAs, VarConstArgs)\n    ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n\n        set_var_maps_snapshot(\"construct_typeclass_info\",\n            InitialVarMapsSnapshot, !Info),\n        new_typeclass_info_var(Constraint, typeclass_info_kind,\n            TypeClassInfoVar, TypeClassInfoVarType, !Info),\n\n        build_typeclass_info_type(Constraint, BaseConstArgType),\n        BaseConstArg = csa_constant(BaseConsId, BaseConstArgType),\n        StructArgs = [BaseConstArg | VarConstArgs],\n        list.map(get_inst_of_const_struct_arg(ConstStructDb0),\n            VarConstArgs, VarInsts),\n        list.length(ArgVarsMCAs, NumArgs),\n        InstConsId = cell_inst_cons_id(typeclass_info_cell, NumArgs),\n        StructInst = bound(shared, inst_test_results_fgtc,\n            [bound_functor(InstConsId, VarInsts)]),\n        ConstStruct = const_struct(ConsId, StructArgs,\n            TypeClassInfoVarType, StructInst),\n        lookup_insert_const_struct(ConstStruct, ConstNum,\n            ConstStructDb0, ConstStructDb),\n        poly_info_set_const_struct_db(ConstStructDb, !Info),\n        TypeClassInfoConstArg = csa_const_struct(ConstNum),\n        TypeClassInfoMCA = yes(TypeClassInfoConstArg),\n\n        % Create the construction unification to initialize the variable.\n        ConstConsId = typeclass_info_const(ConstNum),\n        Unification = construct(TypeClassInfoVar, ConstConsId, [], [],\n            construct_statically, cell_is_shared, no_construct_sub_info),\n        UnifyMode = (free -> ground(shared, none)) -\n            (ground(shared, none) -> ground(shared, none)),\n        % XXX The UnifyContext is wrong.\n        UnifyContext = unify_context(umc_explicit, []),\n        TypeClassInfoRHS = rhs_functor(ConstConsId, no, []),\n        GoalExpr = unify(TypeClassInfoVar, TypeClassInfoRHS, UnifyMode,\n            Unification, UnifyContext),\n\n        % Create a goal_info for the unification.\n        goal_info_init(GoalInfo0),\n        NonLocals = set_of_var.make_singleton(TypeClassInfoVar),\n        goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo1),\n        % Note that we could perhaps be more accurate than `ground(shared)',\n        % but it shouldn't make any difference.\n        InstResults = inst_test_results(inst_result_is_ground,\n            inst_result_does_not_contain_any,\n            inst_result_contains_instnames_known(set.init),\n            inst_result_contains_types_known(set.init)),\n        TypeClassInfoInst = bound(shared, InstResults,\n            [bound_functor(ConsId, [])]),\n        TypeClassInfoVarInst = TypeClassInfoVar - TypeClassInfoInst,\n        InstMapDelta = instmap_delta_from_assoc_list([TypeClassInfoVarInst]),\n        goal_info_set_instmap_delta(InstMapDelta, GoalInfo1, GoalInfo2),\n        goal_info_set_determinism(detism_det, GoalInfo2, GoalInfo),\n\n        Goal = hlds_goal(GoalExpr, GoalInfo),\n        % XXX reset varset and vartypes\n        AllGoals = [Goal]\n    ;\n        TypeClassInfoMCA = no,\n        new_typeclass_info_var(Constraint, typeclass_info_kind,\n            TypeClassInfoVar, _TypeClassInfoVarType, !Info),\n        assoc_list.keys(ArgVarsMCAs, ArgVars),\n        AllArgVars = [BaseVar | ArgVars],\n\n        % Create the construction unification to initialize the variable.\n        TypeClassInfoRHS = rhs_functor(ConsId, no, AllArgVars),\n        UniMode = (free - ground(shared, none) ->\n            ground(shared, none) - ground(shared, none)),\n        list.length(AllArgVars, NumArgs),\n        list.duplicate(NumArgs, UniMode, UniModes),\n        Unification = construct(TypeClassInfoVar, ConsId, AllArgVars, UniModes,\n            construct_dynamically, cell_is_unique, no_construct_sub_info),\n        UnifyMode = (free -> ground(shared, none)) -\n            (ground(shared, none) -> ground(shared, none)),\n        UnifyContext = unify_context(umc_explicit, []),\n        % XXX The UnifyContext is wrong.\n        GoalExpr = unify(TypeClassInfoVar, TypeClassInfoRHS, UnifyMode,\n            Unification, UnifyContext),\n\n        % Create a goal_info for the unification.\n        goal_info_init(GoalInfo0),\n        set_of_var.list_to_set([TypeClassInfoVar | AllArgVars], NonLocals),\n        goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo1),\n        list.duplicate(NumArgs, ground(shared, none), ArgInsts),\n        % Note that we could perhaps be more accurate than `ground(shared)',\n        % but it shouldn't make any difference.\n        InstConsId = cell_inst_cons_id(typeclass_info_cell, NumArgs),\n        InstResults = inst_test_results(inst_result_is_ground,\n            inst_result_does_not_contain_any,\n            inst_result_contains_instnames_known(set.init),\n            inst_result_contains_types_unknown),\n        % XXX that should be inst_result_contains_types_known(set.init),\n        TypeClassInfoInst = bound(unique, InstResults,\n            [bound_functor(InstConsId, ArgInsts)]),\n        TypeClassInfoVarInst = TypeClassInfoVar - TypeClassInfoInst,\n        InstMapDelta = instmap_delta_from_assoc_list([TypeClassInfoVarInst]),\n        goal_info_set_instmap_delta(InstMapDelta, GoalInfo1, GoalInfo2),\n        goal_info_set_determinism(detism_det, GoalInfo2, GoalInfo),\n\n        Goal = hlds_goal(GoalExpr, GoalInfo),\n        AllGoals = PrevGoals ++ [Goal]\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- pred get_arg_superclass_vars(hlds_class_defn::in, list(mer_type)::in,\n    constraint_proof_map::in, existq_tvars::in,\n    assoc_list(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nget_arg_superclass_vars(ClassDefn, InstanceTypes, SuperClassProofs, ExistQVars,\n        SuperClassTypeClassInfoVarsMCAs, SuperClassGoals, !Info) :-\n    poly_info_get_proofs(!.Info, Proofs),\n\n    poly_info_get_typevarset(!.Info, TVarSet0),\n    SuperClasses0 = ClassDefn ^ class_supers,\n    ClassVars0 = ClassDefn ^ class_vars,\n    ClassTVarSet = ClassDefn ^ class_tvarset,\n    tvarset_merge_renaming(TVarSet0, ClassTVarSet, TVarSet1, Renaming),\n    poly_info_set_typevarset(TVarSet1, !Info),\n\n    apply_variable_renaming_to_tvar_list(Renaming, ClassVars0, ClassVars),\n    map.from_corresponding_lists(ClassVars, InstanceTypes, TypeSubst),\n\n    apply_variable_renaming_to_prog_constraint_list(Renaming,\n        SuperClasses0, SuperClasses1),\n    apply_rec_subst_to_prog_constraint_list(TypeSubst,\n        SuperClasses1, SuperClasses),\n\n    poly_info_set_proofs(SuperClassProofs, !Info),\n    make_superclasses_from_proofs(SuperClasses, ExistQVars,\n        SuperClassTypeClassInfoVarsMCAs, SuperClassGoals, !Info),\n    poly_info_set_proofs(Proofs, !Info).\n\n:- pred make_superclasses_from_proofs(list(prog_constraint)::in,\n    existq_tvars::in, assoc_list(prog_var, maybe(const_struct_arg))::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nmake_superclasses_from_proofs([], _, [], [], !Info).\nmake_superclasses_from_proofs([Constraint | Constraints], ExistQVars,\n        [TypeClassInfoVarMCA | TypeClassInfoVarsMCAs], Goals, !Info) :-\n    term.context_init(Context),\n    make_typeclass_info_var(Constraint, [], ExistQVars, Context,\n        TypeClassInfoVarMCA, HeadGoals, !Info),\n    make_superclasses_from_proofs(Constraints, ExistQVars,\n        TypeClassInfoVarsMCAs, TailGoals, !Info),\n    Goals = HeadGoals ++ TailGoals.\n\n%-----------------------------------------------------------------------------%\n\n    % Produce the typeclass_infos for the existential class constraints\n    % for a call or deconstruction unification.\n    %\n:- pred make_existq_typeclass_info_vars(list(prog_constraint)::in,\n    list(prog_var)::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_existq_typeclass_info_vars(ExistentialConstraints, ExtraTypeClassVars,\n        ExtraGoals, !Info) :-\n    poly_info_get_rtti_varmaps(!.Info, OldRttiVarMaps),\n    make_typeclass_info_head_vars(do_record_type_info_locns,\n        ExistentialConstraints, ExtraTypeClassVars, !Info),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    list.foldl(rtti_reuse_typeclass_info_var, ExtraTypeClassVars,\n        RttiVarMaps0, RttiVarMaps),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info),\n\n    constraint_list_get_tvars(ExistentialConstraints, TVars0),\n    list.sort_and_remove_dups(TVars0, TVars),\n    list.foldl2(polymorphism_maybe_extract_type_info(OldRttiVarMaps), TVars,\n        [], ExtraGoals, !Info).\n\n    % For code which requires mode reordering, we may have already seen uses\n    % of some of the type variables produced by this call. At the point of the\n    % use of a type variable that we haven't seen before, we assume that it is\n    % unconstrained. If it turns out that the type variable is constrained,\n    % and the type_info is contained in a typeclass_info, we need to generate\n    % code to extract it here.\n    %\n:- pred polymorphism_maybe_extract_type_info(rtti_varmaps::in, tvar::in,\n    list(hlds_goal)::in, list(hlds_goal)::out, poly_info::in, poly_info::out)\n    is det.\n\npolymorphism_maybe_extract_type_info(OldRttiVarMaps, TVar, !ExtraGoals,\n        !Info) :-\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps),\n    (\n        rtti_search_type_info_locn(OldRttiVarMaps, TVar,\n            type_info(TypeInfoVar0)),\n        rtti_search_type_info_locn(RttiVarMaps, TVar,\n            typeclass_info(TypeClassInfoVar, Index))\n    ->\n        polymorphism_extract_type_info(TVar, TypeClassInfoVar, Index, NewGoals,\n            TypeInfoVar1, !Info),\n        assign_var(TypeInfoVar0, TypeInfoVar1, AssignGoal),\n        !:ExtraGoals = NewGoals ++ [AssignGoal | !.ExtraGoals]\n    ;\n        true\n    ).\n\n%---------------------------------------------------------------------------%\n\npolymorphism_make_type_info_vars(Types, Context, ExtraVars,\n        ExtraGoals, !Info) :-\n    polymorphism_do_make_type_info_vars(Types, Context, ExtraVarsMCAs,\n        ExtraGoals, !Info),\n    assoc_list.keys(ExtraVarsMCAs, ExtraVars).\n\npolymorphism_make_type_info_var(Type, Context, ExtraVar, ExtraGoals, !Info) :-\n    polymorphism_do_make_type_info_var(Type, Context, ExtraVarMCA,\n        ExtraGoals, !Info),\n    ExtraVarMCA = ExtraVar - _.\n\n:- pred polymorphism_do_make_type_info_vars(list(mer_type)::in,\n    term.context::in,\n    assoc_list(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_do_make_type_info_vars([], _, [], [], !Info).\npolymorphism_do_make_type_info_vars([Type | Types], Context,\n        VarsMCAs, Goals, !Info) :-\n    polymorphism_do_make_type_info_var(Type, Context, HeadVarMCA,\n        HeadGoals, !Info),\n    polymorphism_do_make_type_info_vars(Types, Context, TailVarsMCAs,\n        TailGoals, !Info),\n    VarsMCAs = [HeadVarMCA | TailVarsMCAs],\n    Goals = HeadGoals ++ TailGoals.\n\n:- pred polymorphism_do_make_type_info_var(mer_type::in, term.context::in,\n    pair(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_do_make_type_info_var(Type, Context, VarMCA, ExtraGoals, !Info) :-\n    % First handle statically known types (i.e. types which are not\n    % type variables).\n    ( type_has_variable_arity_ctor(Type, TypeCtor, TypeArgs) ->\n        % This occurs for code where a predicate calls a polymorphic predicate\n        % with a type whose type constructor is of variable arity. The\n        % transformation we perform is basically the same as in the usual case\n        % below, except that we map pred types to pred/0, func types to func/0\n        % and tuple types to tuple/0 for the purposes of creating type_infos.\n        % To allow univ_to_type to check the type_infos correctly, the actual\n        % arity is added to the type_info we create.\n        %\n        % XXX FIXME (RTTI for higher order impure code)\n        % we should not ignore the purity of higher order procs;\n        % it should get included in the RTTI.\n        polymorphism_make_type_info(Type, TypeCtor, TypeArgs, yes,\n            Context, VarMCA, ExtraGoals, !Info)\n    ;\n        (\n            ( Type = defined_type(_, _, _)\n            ; Type = builtin_type(_)\n            ; Type = tuple_type(_, _)\n            ; Type = higher_order_type(_,_, _, _)\n            ; Type = apply_n_type(_, _, _)\n            ; Type = kinded_type(_, _)\n            ),\n            type_to_ctor_and_args_det(Type, TypeCtor, TypeArgs),\n            % This occurs for code where a predicate calls a polymorphic\n            % predicate with a known value of the type variable. The\n            % transformation we perform is shown in the comment at the top\n            % of the module.\n            polymorphism_make_type_info(Type, TypeCtor, TypeArgs, no,\n                Context, VarMCA, ExtraGoals, !Info)\n        ;\n            % Now handle the cases of types which are not known statically,\n            % i.e. type variables.\n            Type = type_variable(TypeVar, _),\n            get_type_info_locn(TypeVar, TypeInfoLocn, !Info),\n            get_type_info_from_locn(TypeVar, TypeInfoLocn, Var, ExtraGoals,\n                !Info),\n            VarMCA = Var - no\n        )\n    ).\n\n:- pred polymorphism_make_type_info(mer_type::in, type_ctor::in,\n    list(mer_type)::in, bool::in, prog_context::in,\n    pair(prog_var, maybe(const_struct_arg))::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_make_type_info(Type, TypeCtor, TypeArgs, TypeCtorIsVarArity,\n        Context, TypeInfoVarMCA, ExtraGoals, !Info) :-\n    poly_info_get_type_info_var_map(!.Info, TypeInfoVarMap0),\n    (\n        map.search(TypeInfoVarMap0, TypeCtor, TypeCtorVarMap0),\n        map.search(TypeCtorVarMap0, TypeArgs, OldTypeInfoVarMCA)\n    ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n        TypeInfoVarMCA = OldTypeInfoVarMCA,\n        ExtraGoals = []\n    ;\n        polymorphism_construct_type_info(Type, TypeCtor, TypeArgs,\n            TypeCtorIsVarArity, Context, TypeInfoVar, TypeInfoConstArg,\n            ExtraGoals, !Info),\n        TypeInfoVarMCA = TypeInfoVar - TypeInfoConstArg,\n        % We have to get the type_info_var_map again since the call just above\n        % could have added relevant new entries to it.\n        poly_info_get_type_info_var_map(!.Info, TypeInfoVarMap1),\n        ( map.search(TypeInfoVarMap1, TypeCtor, TypeCtorVarMap1) ->\n            map.det_insert(TypeArgs, TypeInfoVarMCA,\n                TypeCtorVarMap1, TypeCtorVarMap),\n            map.det_update(TypeCtor, TypeCtorVarMap,\n                TypeInfoVarMap1, TypeInfoVarMap)\n        ;\n            TypeCtorVarMap = map.singleton(TypeArgs, TypeInfoVarMCA),\n            map.det_insert(TypeCtor, TypeCtorVarMap,\n                TypeInfoVarMap1, TypeInfoVarMap)\n        ),\n        poly_info_set_type_info_var_map(TypeInfoVarMap, !Info)\n    ).\n\n:- pred polymorphism_construct_type_info(mer_type::in, type_ctor::in,\n    list(mer_type)::in, bool::in, prog_context::in,\n    prog_var::out, maybe(const_struct_arg)::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_construct_type_info(Type, TypeCtor, TypeArgs, TypeCtorIsVarArity,\n        Context, Var, MCA, ExtraGoals, !Info) :-\n    get_var_maps_snapshot(\"polymorphism_construct_type_info\",\n        InitialVarMapsSnapshot, !Info),\n\n    % Create the typeinfo vars for the arguments.\n    polymorphism_do_make_type_info_vars(TypeArgs, Context,\n        ArgTypeInfoVarsMCAs, ArgTypeInfoGoals, !Info),\n\n    poly_info_get_varset(!.Info, VarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n\n    TypeCtorConsId = type_ctor_info_cons_id(TypeCtor),\n    TypeCtorConsIdConstArg = csa_constant(TypeCtorConsId, type_info_type),\n    poly_info_get_const_struct_var_map(!.Info, ConstStructVarMap0),\n    ( map.search(ConstStructVarMap0, TypeCtorConsIdConstArg, OldTypeCtorVar) ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n        TypeCtorVar = OldTypeCtorVar,\n        TypeCtorGoals = [],\n        VarSet1 = VarSet0,\n        VarTypes1 = VarTypes0,\n        RttiVarMaps1 = RttiVarMaps0\n    ;\n        init_const_type_ctor_info_var_from_cons_id(Type, TypeCtorConsId,\n            TypeCtorVar, TypeCtorGoal, VarSet0, VarSet1, VarTypes0, VarTypes1,\n            RttiVarMaps0, RttiVarMaps1),\n        TypeCtorGoals = [TypeCtorGoal],\n        map.det_insert(TypeCtorConsIdConstArg, TypeCtorVar,\n            ConstStructVarMap0, ConstStructVarMap1),\n        poly_info_set_const_struct_var_map(ConstStructVarMap1, !Info)\n    ),\n\n    poly_info_set_varset_and_types(VarSet1, VarTypes1, !Info),\n    poly_info_set_rtti_varmaps(RttiVarMaps1, !Info),\n\n    % The rest of this predicate create code that constructs the second cell\n    % of a type_info for Type if we need a second cell for Type. This cell\n    % will usually be of the form:\n    %\n    %   TypeInfoVar = type_info(TypeCtorVar, ArgTypeInfoVars...)\n    %\n    % However, if TypeCtorIsVarArity is true, then it will be of the form\n    %\n    %   TypeInfoVar = type_info(TypeCtorVar, Arity, ArgTypeInfoVars...)\n    %\n    % TypeCtorVar should be the variable holding the type_ctor_info for the\n    % principal type constructor of Type, and TypeCtorIsVarArity should be\n    % true iff the type constructor it represents has a variable arity.\n    %\n    % ArgTypeInfoVars should be variables holding the type_infos (or\n    % type_ctor_infos for zero-arity types) of the argument types of Type.\n    %\n    % The returned Var will be bound to the type_info cell of Type if such\n    % a cell had to be allocated, and to the type_ctor_info of Type's only\n    % type constructor if it didn't.\n\n    (\n        % Unfortunately, if the type's type constructor has variable arity,\n        % we cannot use a one-cell representation for that type.\n        TypeCtorIsVarArity = no,\n        ArgTypeInfoVarsMCAs = []\n    ->\n        % We do not need a second cell for a separate typeinfo; we will use\n        % the type_ctor_info as the type_info.\n\n        % Since this type_ctor_info is pretending to be a type_info,\n        % we need to adjust its type. We handle type_ctor_info_const cons_ids\n        % specially to make sure that this causes no problems.\n        TypeInfoType = type_info_type,\n        Var = TypeCtorVar,\n        TypeCtorConstArg = csa_constant(TypeCtorConsId, type_info_type),\n        MCA = yes(TypeCtorConstArg),\n        ExtraGoals = ArgTypeInfoGoals ++ TypeCtorGoals,\n        update_var_type(TypeCtorVar, TypeInfoType, VarTypes1, VarTypes),\n        poly_info_set_varset_and_types(VarSet1, VarTypes, !Info)\n    ;\n        % We do need a second cell for a separate typeinfo.\n        Cell = type_info_cell(TypeCtor),\n        ConsId = cell_cons_id(Cell),\n\n        poly_info_get_const_struct_db(!.Info, ConstStructDb0),\n        const_struct_db_get_poly_enabled(ConstStructDb0, Enabled),\n        (\n            Enabled = yes,\n            all_are_const_struct_args(ArgTypeInfoVarsMCAs,\n                ArgTypeInfoConstArgs)\n        ->\n            TypeCtorConstArg = csa_constant(TypeCtorConsId, type_info_type),\n            TypeCtorInst = bound(shared, inst_test_results_fgtc,\n                [bound_functor(TypeCtorConsId, [])]),\n            list.map(get_inst_of_const_struct_arg(ConstStructDb0),\n                ArgTypeInfoConstArgs, ArgTypeInfoInsts),\n            (\n                TypeCtorIsVarArity = yes,\n                list.length(ArgTypeInfoVarsMCAs, ActualArity),\n                ArityConstArg = csa_constant(int_const(ActualArity), int_type),\n                ArityInst = bound(shared, inst_test_results_fgtc,\n                    [bound_functor(int_const(ActualArity), [])]),\n                StructConstArgs =\n                    [TypeCtorConstArg, ArityConstArg | ArgTypeInfoConstArgs],\n                StructArgInsts = [TypeCtorInst, ArityInst | ArgTypeInfoInsts]\n            ;\n                TypeCtorIsVarArity = no,\n                StructConstArgs = [TypeCtorConstArg | ArgTypeInfoConstArgs],\n                StructArgInsts = [TypeCtorInst | ArgTypeInfoInsts]\n            ),\n            StructType = type_info_type,\n            list.length(ArgTypeInfoConstArgs, NumArgs),\n            InstConsId = cell_inst_cons_id(Cell, NumArgs),\n            StructInst = bound(shared, inst_test_results_fgtc,\n                [bound_functor(InstConsId, StructArgInsts)]),\n\n            ConstStruct = const_struct(ConsId, StructConstArgs,\n                StructType, StructInst),\n            lookup_insert_const_struct(ConstStruct, ConstNum,\n                ConstStructDb0, ConstStructDb),\n            MCA = yes(csa_const_struct(ConstNum)),\n            poly_info_set_const_struct_db(ConstStructDb, !Info),\n\n            set_var_maps_snapshot(\"maybe_init_second_cell\",\n                InitialVarMapsSnapshot, !Info),\n\n            new_type_info_var(Type, type_info, Var, !Info),\n            Unification = construct(Var, type_info_const(ConstNum),\n                [], [], construct_statically, cell_is_shared,\n                no_construct_sub_info),\n            UnifyMode = (free -> ground(shared, none)) -\n                (ground(shared, none) -> ground(shared, none)),\n            UnifyContext = unify_context(umc_explicit, []),\n            % XXX The UnifyContext is wrong.\n            TypeInfoRHS = rhs_functor(type_info_const(ConstNum), no, []),\n            Unify = unify(Var, TypeInfoRHS, UnifyMode, Unification,\n                UnifyContext),\n\n            % Create a goal_info for the unification.\n            NonLocals = set_of_var.make_singleton(Var),\n            % Note that we could be more accurate than `ground(shared)',\n            % but it shouldn't make any difference.\n            InstResults = inst_test_results(inst_result_is_ground,\n                inst_result_does_not_contain_any,\n                inst_result_contains_instnames_known(set.init),\n                inst_result_contains_types_known(set.init)),\n            VarInst = bound(shared, InstResults,\n                [bound_functor(InstConsId, [])]),\n            InstMapDelta = instmap_delta_from_assoc_list([Var - VarInst]),\n            goal_info_init(NonLocals, InstMapDelta, detism_det, purity_pure,\n                GoalInfo),\n            TypeInfoGoal = hlds_goal(Unify, GoalInfo),\n            ExtraGoals = [TypeInfoGoal]\n        ;\n            assoc_list.keys(ArgTypeInfoVarsMCAs, ArgTypeInfoVars),\n            (\n                TypeCtorIsVarArity = yes,\n                list.length(ArgTypeInfoVars, ActualArity),\n                get_poly_const(ActualArity, ArityVar, ArityGoals, !Info),\n                % The call get_poly_const may (and probably will) allocate\n                % a variable, so VarSet1, VarTypes1 and RttiVarMaps1 are\n                % all out of date.\n                poly_info_get_varset(!.Info, VarSet2),\n                poly_info_get_var_types(!.Info, VarTypes2),\n                poly_info_get_rtti_varmaps(!.Info, RttiVarMaps2),\n                init_type_info_var(Type,\n                    [TypeCtorVar, ArityVar | ArgTypeInfoVars],\n                    no, Var, TypeInfoGoal,\n                    VarSet2, VarSet, VarTypes2, VarTypes,\n                    RttiVarMaps2, RttiVarMaps),\n                ExtraGoals = TypeCtorGoals ++ ArityGoals ++ ArgTypeInfoGoals\n                    ++ [TypeInfoGoal]\n            ;\n                TypeCtorIsVarArity = no,\n                init_type_info_var(Type, [TypeCtorVar | ArgTypeInfoVars],\n                    no, Var, TypeInfoGoal,\n                    VarSet1, VarSet, VarTypes1, VarTypes,\n                    RttiVarMaps1, RttiVarMaps),\n                ExtraGoals = TypeCtorGoals ++ ArgTypeInfoGoals ++\n                    [TypeInfoGoal]\n            ),\n            poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n            poly_info_set_rtti_varmaps(RttiVarMaps, !Info),\n            MCA = no\n        )\n    ).\n\nget_special_proc(Type, SpecialPredId, ModuleInfo, PredName, PredId, ProcId) :-\n    TypeCategory = classify_type(ModuleInfo, Type),\n    get_category_name(TypeCategory) = MaybeCategoryName,\n    (\n        MaybeCategoryName = no,\n        module_info_get_special_pred_map(ModuleInfo, SpecialPredMap),\n        type_to_ctor_det(Type, TypeCtor),\n        map.search(SpecialPredMap, SpecialPredId - TypeCtor, PredId),\n        module_info_pred_info(ModuleInfo, PredId, PredInfo),\n        Module = pred_info_module(PredInfo),\n        Name = pred_info_name(PredInfo),\n        PredName = qualified(Module, Name),\n        special_pred_mode_num(SpecialPredId, ProcInt),\n        proc_id_to_int(ProcId, ProcInt)\n    ;\n        MaybeCategoryName = yes(CategoryName),\n        special_pred_name_arity(SpecialPredId, SpecialName, _, Arity),\n        Name = \"builtin_\" ++ SpecialName ++ \"_\" ++ CategoryName,\n        lookup_builtin_pred_proc_id(ModuleInfo, mercury_private_builtin_module,\n            Name, pf_predicate, Arity, only_mode, PredId, ProcId),\n        PredName = qualified(mercury_private_builtin_module, Name)\n    ).\n\nget_special_proc_det(Type, SpecialPredId, ModuleInfo, PredName,\n        PredId, ProcId) :-\n    (\n        get_special_proc(Type, SpecialPredId, ModuleInfo,\n            PredNamePrime, PredIdPrime, ProcIdPrime)\n    ->\n        PredName = PredNamePrime,\n        PredId = PredIdPrime,\n        ProcId = ProcIdPrime\n    ;\n        unexpected($module, $pred, \"get_special_proc failed\")\n    ).\n\n:- func get_category_name(type_ctor_category) = maybe(string).\n\nget_category_name(CtorCat) = MaybeName :-\n    (\n        CtorCat = ctor_cat_builtin(cat_builtin_int),\n        MaybeName = yes(\"int\")\n    ;\n        CtorCat = ctor_cat_builtin(cat_builtin_char),\n        MaybeName = yes(\"character\")\n    ;\n        CtorCat = ctor_cat_builtin(cat_builtin_float),\n        MaybeName = yes(\"float\")\n    ;\n        CtorCat = ctor_cat_builtin(cat_builtin_string),\n        MaybeName = yes(\"string\")\n    ;\n        CtorCat = ctor_cat_higher_order,\n        MaybeName = yes(\"pred\")\n    ;\n        CtorCat = ctor_cat_tuple,\n        MaybeName = yes(\"tuple\")\n    ;\n        ( CtorCat = ctor_cat_enum(_)\n        ; CtorCat = ctor_cat_builtin_dummy\n        ; CtorCat = ctor_cat_user(_)\n        ; CtorCat = ctor_cat_system(_)\n        ),\n        MaybeName = no\n    ;\n        CtorCat = ctor_cat_variable,\n        unexpected($module, $pred, \"variable type\")\n    ;\n        CtorCat = ctor_cat_void,\n        unexpected($module, $pred, \"void_type\")\n    ).\n\ninit_type_info_var(Type, ArgVars, MaybePreferredVar, TypeInfoVar, TypeInfoGoal,\n        !VarSet, !VarTypes, !RttiVarMaps) :-\n    type_to_ctor_det(Type, TypeCtor),\n    Cell = type_info_cell(TypeCtor),\n    ConsId = cell_cons_id(Cell),\n    do_init_type_info_var(Type, Cell, ConsId, ArgVars, MaybePreferredVar,\n        TypeInfoVar, TypeInfoGoal, !VarSet, !VarTypes, !RttiVarMaps).\n\n:- pred do_init_type_info_var(mer_type::in, polymorphism_cell::in, cons_id::in,\n    list(prog_var)::in, maybe(prog_var)::in, prog_var::out, hlds_goal::out,\n    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,\n    rtti_varmaps::in, rtti_varmaps::out) is det.\n\ndo_init_type_info_var(Type, Cell, ConsId, ArgVars, MaybePreferredVar,\n        TypeInfoVar, TypeInfoGoal, !VarSet, !VarTypes, !RttiVarMaps) :-\n    TypeInfoRHS = rhs_functor(ConsId, no, ArgVars),\n    % Introduce a new variable.\n    (\n        MaybePreferredVar = yes(TypeInfoVar)\n    ;\n        MaybePreferredVar = no,\n        new_type_info_var_raw(Type, type_info, TypeInfoVar,\n            !VarSet, !VarTypes, !RttiVarMaps)\n    ),\n\n    % Create the construction unification to initialize the variable.\n    UniMode = (free - ground(shared, none) ->\n        ground(shared, none) - ground(shared, none)),\n    list.length(ArgVars, NumArgVars),\n    list.duplicate(NumArgVars, UniMode, UniModes),\n    Unification = construct(TypeInfoVar, ConsId, ArgVars, UniModes,\n        construct_dynamically, cell_is_unique, no_construct_sub_info),\n    UnifyMode = (free -> ground(shared, none)) -\n        (ground(shared, none) -> ground(shared, none)),\n    UnifyContext = unify_context(umc_explicit, []),\n    % XXX The UnifyContext is wrong.\n    Unify = unify(TypeInfoVar, TypeInfoRHS, UnifyMode, Unification,\n        UnifyContext),\n\n    % Create a goal_info for the unification.\n    set_of_var.list_to_set([TypeInfoVar | ArgVars], NonLocals),\n    list.duplicate(NumArgVars, ground(shared, none), ArgInsts),\n    % Note that we could perhaps be more accurate than `ground(shared)',\n    % but it shouldn't make any difference.\n    InstConsId = cell_inst_cons_id(Cell, NumArgVars),\n    InstResults = inst_test_results(inst_result_is_ground,\n        inst_result_does_not_contain_any,\n        inst_result_contains_instnames_known(set.init),\n        inst_result_contains_types_unknown),\n    TypeInfoVarInst = bound(unique, InstResults,\n        [bound_functor(InstConsId, ArgInsts)]),\n    InstMapDelta = instmap_delta_from_assoc_list(\n        [TypeInfoVar - TypeInfoVarInst]),\n    goal_info_init(NonLocals, InstMapDelta, detism_det, purity_pure, GoalInfo),\n    TypeInfoGoal = hlds_goal(Unify, GoalInfo).\n\ninit_const_type_ctor_info_var(Type, TypeCtor, TypeCtorInfoVar,\n        ConsId, TypeCtorInfoGoal, !VarSet, !VarTypes, !RttiVarMaps) :-\n    ConsId = type_ctor_info_cons_id(TypeCtor),\n    init_const_type_ctor_info_var_from_cons_id(Type, ConsId,\n        TypeCtorInfoVar, TypeCtorInfoGoal, !VarSet, !VarTypes, !RttiVarMaps).\n\n:- pred init_const_type_ctor_info_var_from_cons_id(mer_type::in, cons_id::in,\n    prog_var::out, hlds_goal::out, prog_varset::in, prog_varset::out,\n    vartypes::in, vartypes::out, rtti_varmaps::in, rtti_varmaps::out) is det.\n\ninit_const_type_ctor_info_var_from_cons_id(Type, ConsId,\n        TypeCtorInfoVar, TypeCtorInfoGoal, !VarSet, !VarTypes, !RttiVarMaps) :-\n    % Introduce a new variable.\n    new_type_info_var_raw(Type, type_ctor_info, TypeCtorInfoVar,\n        !VarSet, !VarTypes, !RttiVarMaps),\n\n    % Create the construction unification to initialize the variable.\n    TypeInfoRHS = rhs_functor(ConsId, no, []),\n    Unification = construct(TypeCtorInfoVar, ConsId, [], [],\n        construct_dynamically, cell_is_shared, no_construct_sub_info),\n    UnifyMode = (free -> ground(shared, none)) -\n        (ground(shared, none) -> ground(shared, none)),\n    UnifyContext = unify_context(umc_explicit, []),\n    % XXX The UnifyContext is wrong.\n    Unify = unify(TypeCtorInfoVar, TypeInfoRHS, UnifyMode,\n        Unification, UnifyContext),\n\n    % Create a goal_info for the unification.\n    NonLocals = set_of_var.make_singleton(TypeCtorInfoVar),\n    InstmapDelta = instmap_delta_bind_var(TypeCtorInfoVar),\n    goal_info_init(NonLocals, InstmapDelta, detism_det, purity_pure, GoalInfo),\n    TypeCtorInfoGoal = hlds_goal(Unify, GoalInfo).\n\n%---------------------------------------------------------------------------%\n\n:- pred make_head_vars(list(tvar)::in, tvarset::in,\n    list(prog_var)::out, poly_info::in, poly_info::out) is det.\n\nmake_head_vars([], _, [], !Info).\nmake_head_vars([TypeVar | TypeVars], TypeVarSet, TypeInfoVars, !Info) :-\n    get_tvar_kind(!.Info ^ poly_tvar_kinds, TypeVar, Kind),\n    Type = type_variable(TypeVar, Kind),\n    new_type_info_var(Type, type_info, Var, !Info),\n    ( varset.search_name(TypeVarSet, TypeVar, TypeVarName) ->\n        poly_info_get_varset(!.Info, VarSet0),\n        VarName = \"TypeInfo_for_\" ++ TypeVarName,\n        varset.name_var(Var, VarName, VarSet0, VarSet),\n        poly_info_set_varset(VarSet, !Info)\n    ;\n        true\n    ),\n    make_head_vars(TypeVars, TypeVarSet, TypeInfoVars1, !Info),\n    TypeInfoVars = [Var | TypeInfoVars1].\n\n:- pred new_type_info_var(mer_type::in, type_info_kind::in,\n    prog_var::out, poly_info::in, poly_info::out) is det.\n\nnew_type_info_var(Type, Kind, Var, !Info) :-\n    poly_info_get_varset(!.Info, VarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    new_type_info_var_raw(Type, Kind, Var, VarSet0, VarSet,\n        VarTypes0, VarTypes, RttiVarMaps0, RttiVarMaps),\n    poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info).\n\nnew_type_info_var_raw(Type, Kind, Var, !VarSet, !VarTypes, !RttiVarMaps) :-\n    % Introduce new variable.\n    varset.new_var(Var, !VarSet),\n    term.var_to_int(Var, VarNum),\n    string.int_to_string(VarNum, VarNumStr),\n    (\n        Kind = type_info,\n        Prefix = \"TypeInfo_\",\n        rtti_det_insert_type_info_type(Var, Type, !RttiVarMaps)\n    ;\n        Kind = type_ctor_info,\n        Prefix = \"TypeCtorInfo_\"\n\n        % XXX Perhaps we should record the variables holding\n        % type_ctor_infos in the rtti_varmaps somewhere.\n    ),\n    Name = Prefix ++ VarNumStr,\n    varset.name_var(Var, Name, !VarSet),\n    add_var_type(Var, type_info_type, !VarTypes).\n\n%---------------------------------------------------------------------------%\n\n:- pred get_type_info_locn(tvar::in, type_info_locn::out, poly_info::in,\n    poly_info::out) is det.\n\nget_type_info_locn(TypeVar, TypeInfoLocn, !Info) :-\n    % If we have already allocated a location for this type_info, then all\n    % we need to do is to extract the type_info variable from its location.\n    (\n        rtti_search_type_info_locn(!.Info ^ poly_rtti_varmaps, TypeVar,\n            TypeInfoLocnPrime)\n    ->\n        TypeInfoLocn = TypeInfoLocnPrime\n    ;\n        % Otherwise, we need to create a new type_info variable, and set the\n        % location for this type variable to be that type_info variable.\n        %\n        % This is wrong if the type variable is one of the existentially\n        % quantified variables of a called predicate and the variable occurs\n        % in an existential typeclass constraint. In that case the type_info\n        % will be stored in the typeclass_info variable produced by the\n        % predicate, not in a type_info variable. maybe_extract_type_info\n        % will fix this up when the typeclass_info is created.\n\n        get_tvar_kind(!.Info ^ poly_tvar_kinds, TypeVar, Kind),\n        Type = type_variable(TypeVar, Kind),\n        new_type_info_var(Type, type_info, Var, !Info),\n        TypeInfoLocn = type_info(Var),\n        poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n        rtti_det_insert_type_info_locn(TypeVar, TypeInfoLocn,\n            RttiVarMaps0, RttiVarMaps),\n        poly_info_set_rtti_varmaps(RttiVarMaps, !Info)\n    ).\n\n    % Generate code to get the value of a type variable.\n    %\n:- pred get_type_info_from_locn(tvar::in, type_info_locn::in,\n    prog_var::out, list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nget_type_info_from_locn(TypeVar, TypeInfoLocn, Var, ExtraGoals, !Info) :-\n    (\n        % If the typeinfo is available in a variable, just use it.\n        TypeInfoLocn = type_info(TypeInfoVar),\n        Var = TypeInfoVar,\n        ExtraGoals = []\n    ;\n        % If the typeinfo is in a typeclass_info, then we need to extract it\n        % before using it.\n        TypeInfoLocn = typeclass_info(TypeClassInfoVar, Index),\n        polymorphism_extract_type_info(TypeVar, TypeClassInfoVar, Index,\n            ExtraGoals, Var, !Info)\n    ).\n\n:- pred polymorphism_extract_type_info(tvar::in, prog_var::in, int::in,\n    list(hlds_goal)::out, prog_var::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_extract_type_info(TypeVar, TypeClassInfoVar, Index, Goals,\n        TypeInfoVar, !Info) :-\n    get_poly_const(Index, IndexVar, IndexGoals, !Info),\n    poly_info_get_varset(!.Info, VarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    poly_info_get_module_info(!.Info, ModuleInfo),\n    poly_info_get_tvar_kinds(!.Info, TVarKinds),\n    get_tvar_kind(TVarKinds, TypeVar, Kind),\n    IndexIntOrVar = iov_var(IndexVar),\n    gen_extract_type_info(ModuleInfo, TypeVar, Kind, TypeClassInfoVar,\n        IndexIntOrVar, ExtractGoals, TypeInfoVar,\n        VarSet0, VarSet, VarTypes0, VarTypes, RttiVarMaps0, RttiVarMaps),\n    Goals = IndexGoals ++ ExtractGoals,\n    poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info).\n\ngen_extract_type_info(ModuleInfo, TypeVar, Kind, TypeClassInfoVar,\n        IndexIntOrVar, Goals, TypeInfoVar, !VarSet, !VarTypes, !RttiVarMaps) :-\n    (\n        IndexIntOrVar = iov_int(Index),\n        % We cannot call get_poly_const since we don't have a poly_info.\n        make_int_const_construction_alloc(Index, yes(\"TypeInfoIndex\"),\n            IndexGoal, IndexVar, !VarSet, !VarTypes),\n        IndexGoals = [IndexGoal]\n    ;\n        IndexIntOrVar = iov_var(IndexVar),\n        IndexGoals = []\n    ),\n    Type = type_variable(TypeVar, Kind),\n    new_type_info_var_raw(Type, type_info, TypeInfoVar,\n        !VarSet, !VarTypes, !RttiVarMaps),\n    goal_util.generate_simple_call(mercury_private_builtin_module,\n        \"type_info_from_typeclass_info\", pf_predicate, only_mode,\n        detism_det, purity_pure, [TypeClassInfoVar, IndexVar, TypeInfoVar], [],\n        instmap_delta_bind_var(TypeInfoVar), ModuleInfo, term.context_init,\n        CallGoal),\n    Goals = IndexGoals ++ [CallGoal].\n\n:- pred get_poly_const(int::in, prog_var::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nget_poly_const(IntConst, IntVar, Goals, !Info) :-\n    poly_info_get_varset(!.Info, VarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n\n    poly_info_get_int_const_map(!.Info, IntConstMap0),\n    ( map.search(IntConstMap0, IntConst, IntVarPrime) ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n        IntVar = IntVarPrime,\n        Goals = []\n    ;\n        make_int_const_construction_alloc(IntConst,\n            yes(\"PolyConst\" ++ string.int_to_string(IntConst)),\n            Goal, IntVar, VarSet0, VarSet, VarTypes0, VarTypes),\n        map.det_insert(IntConst, IntVar, IntConstMap0, IntConstMap),\n        poly_info_set_int_const_map(IntConstMap, !Info),\n        poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n        Goals = [Goal]\n    ).\n\n%-----------------------------------------------------------------------------%\n\n    % Usually when we call make_typeclass_info_head_var, we want to record\n    % the type_info_locn for each constrained type var so that later goals\n    % will know where to get the type_info from. However, when setting up\n    % head vars for existential constraints on the predicate/function we\n    % are processing, we assume that the type_infos will be produced\n    % somewhere else in the goal. In this case, we don't want to record\n    % the type_info_locns (if we did, then the code to actually produce the\n    % type_info will just try to get it from here, which would be a mode\n    % error).\n    %\n:- type record_type_info_locns\n    --->    do_record_type_info_locns\n    ;       do_not_record_type_info_locns.\n\n    % Create a head var for each class constraint.\n    %\n:- pred make_typeclass_info_head_vars(record_type_info_locns::in,\n    list(prog_constraint)::in, list(prog_var)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_head_vars(RecordLocns, Constraints, ExtraHeadVars,\n        !Info) :-\n    list.map_foldl(make_typeclass_info_head_var(RecordLocns), Constraints,\n        ExtraHeadVars, !Info).\n\n:- pred make_typeclass_info_head_var(record_type_info_locns::in,\n    prog_constraint::in, prog_var::out, poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_head_var(RecordLocns, Constraint, TypeClassInfoVar,\n        !Info) :-\n    (\n        poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n        rtti_search_typeclass_info_var(RttiVarMaps0, Constraint,\n            OldTypeClassInfoVar)\n    ->\n        TypeClassInfoVar = OldTypeClassInfoVar\n    ;\n        % Make a new variable to contain the dictionary for this typeclass\n        % constraint.\n        new_typeclass_info_var(Constraint, typeclass_info_kind,\n            TypeClassInfoVar, _TypeClassInfoVarType, !Info),\n        (\n            RecordLocns = do_record_type_info_locns,\n            record_constraint_type_info_locns(Constraint, TypeClassInfoVar,\n                !Info)\n        ;\n            RecordLocns = do_not_record_type_info_locns\n        )\n    ).\n\n:- pred record_constraint_type_info_locns(prog_constraint::in, prog_var::in,\n    poly_info::in, poly_info::out) is det.\n\nrecord_constraint_type_info_locns(Constraint, ExtraHeadVar, !Info) :-\n    poly_info_get_module_info(!.Info, ModuleInfo),\n\n    % Work out how many superclasses the class has.\n    Constraint = constraint(ClassName, ClassTypes),\n    list.length(ClassTypes, ClassArity),\n    ClassId = class_id(ClassName, ClassArity),\n    module_info_get_class_table(ModuleInfo, ClassTable),\n    map.lookup(ClassTable, ClassId, ClassDefn),\n    SuperClasses = ClassDefn ^ class_supers,\n    list.length(SuperClasses, NumSuperClasses),\n\n    % Find all the type variables in the constraint, and remember what\n    % index they appear in in the typeclass info.\n\n    % The first type_info will be just after the superclass infos.\n    First = NumSuperClasses + 1,\n    Last = NumSuperClasses + ClassArity,\n    assoc_list.from_corresponding_lists(ClassTypes, First `..` Last,\n        IndexedClassTypes),\n\n    % Work out which type variables we haven't seen before, or which we\n    % assumed earlier would be produced in a type_info (this can happen for\n    % code which needs mode reordering and which calls existentially\n    % quantified predicates or deconstructs existentially quantified\n    % terms).\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    NewTVarAndIndex = (pred(TVarAndIndex::out) is nondet :-\n        list.member(Type - Index, IndexedClassTypes),\n        type_vars(Type, TypeVars),\n        list.member(TypeVar, TypeVars),\n        ( rtti_search_type_info_locn(RttiVarMaps0, TypeVar, TypeInfoLocn) ->\n            TypeInfoLocn = type_info(_)\n        ;\n            true\n        ),\n        TVarAndIndex = TypeVar - Index\n    ),\n    solutions(NewTVarAndIndex, NewClassTypeVars),\n\n    % Make an entry in the TypeInfo locations map for each new type variable.\n    % The type variable can be found at the previously calculated offset\n    % with the new typeclass_info.\n    MakeEntry =\n        (pred(IndexedTypeVar::in, R0::in, R::out) is det :-\n            IndexedTypeVar = TheTypeVar - Index,\n            Location = typeclass_info(ExtraHeadVar, Index),\n            rtti_set_type_info_locn(TheTypeVar, Location, R0, R)\n        ),\n    list.foldl(MakeEntry, NewClassTypeVars, RttiVarMaps0, RttiVarMaps),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info).\n\n:- type tci_var_kind\n    --->    base_typeclass_info_kind\n    ;       typeclass_info_kind.\n\n:- pred new_typeclass_info_var(prog_constraint::in, tci_var_kind::in,\n    prog_var::out, mer_type::out, poly_info::in, poly_info::out) is det.\n\nnew_typeclass_info_var(Constraint, VarKind, Var, VarType, !Info) :-\n    poly_info_get_varset(!.Info, VarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n\n    Constraint = constraint(ClassName, _),\n    ClassNameString = unqualify_name(ClassName),\n\n    % Introduce new variable.\n    varset.new_var(Var, VarSet0, VarSet1),\n    (\n        VarKind = base_typeclass_info_kind,\n        Name = \"BaseTypeClassInfo_for_\" ++ ClassNameString\n    ;\n        VarKind = typeclass_info_kind,\n        Name = \"TypeClassInfo_for_\" ++ ClassNameString\n    ),\n    varset.name_var(Var, Name, VarSet1, VarSet),\n    build_typeclass_info_type(Constraint, VarType),\n    add_var_type(Var, VarType, VarTypes0, VarTypes),\n    rtti_det_insert_typeclass_info_var(Constraint, Var,\n        RttiVarMaps0, RttiVarMaps),\n\n    poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info).\n\nbuild_typeclass_info_type(_Constraint, DictionaryType) :-\n    PrivateBuiltin = mercury_private_builtin_module,\n    TypeclassInfoTypeName = qualified(PrivateBuiltin, \"typeclass_info\"),\n    DictionaryType = defined_type(TypeclassInfoTypeName, [], kind_star).\n\n%---------------------------------------------------------------------------%\n\ntype_is_typeclass_info(TypeClassInfoType) :-\n    type_to_ctor(TypeClassInfoType, TypeCtor),\n    TypeCtor = type_ctor(qualified(ModuleName, \"typeclass_info\"), 0),\n    ModuleName = mercury_private_builtin_module.\n\ntype_is_type_info_or_ctor_type(TypeInfoType) :-\n    type_to_ctor_and_args(TypeInfoType, TypeCtor, []),\n    TypeCtor = type_ctor(qualified(ModuleName, TypeName), 0),\n    ModuleName = mercury_private_builtin_module,\n    ( TypeName = \"type_info\"\n    ; TypeName = \"type_ctor_info\"\n    ).\n\nbuild_type_info_type(Type, TypeInfoType) :-\n    % XXX TypeInfoType = type_ctor_info_type.\n    ( type_has_variable_arity_ctor(Type, _, _) ->\n        % We cannot use a plain type_ctor_info because we need to\n        % record the arity.\n        TypeInfoType = type_info_type\n    ; type_to_ctor_and_args(Type, _Ctor, Args) ->\n        (\n            Args = [],\n            TypeInfoType = type_ctor_info_type\n        ;\n            Args = [_ | _],\n            TypeInfoType = type_info_type\n        )\n    ;\n        % The type is variable, which means we have a type_info for it.\n        % That type_info may actually be a type_ctor_info, but the code\n        % of the current predicate won't treat it as such.\n        TypeInfoType = type_info_type\n    ).\n\n%---------------------------------------------------------------------------%\n\n    % Expand the bodies of all class methods. Class methods for imported\n    % classes are only expanded if we are performing type specialization,\n    % so that method lookups for imported classes can be optimized.\n    %\n    % The expansion involves inserting a class_method_call with the appropriate\n    % arguments, which is responsible for extracting the appropriate part\n    % of the dictionary.\n    %\n:- pred expand_class_method_bodies(module_info::in, module_info::out) is det.\n\nexpand_class_method_bodies(!ModuleInfo) :-\n    module_info_get_class_table(!.ModuleInfo, Classes),\n    module_info_get_name(!.ModuleInfo, ModuleName),\n    map.keys(Classes, ClassIds0),\n\n    module_info_get_globals(!.ModuleInfo, Globals),\n    globals.lookup_bool_option(Globals, user_guided_type_specialization,\n        TypeSpec),\n    (\n        TypeSpec = no,\n        % Don't expand classes from other modules.\n        list.filter(class_id_is_from_given_module(ModuleName),\n            ClassIds0, ClassIds)\n    ;\n        TypeSpec = yes,\n        ClassIds = ClassIds0\n    ),\n    map.apply_to_list(ClassIds, Classes, ClassDefns),\n    list.foldl(expand_class_method_bodies_2, ClassDefns, !ModuleInfo).\n\n:- pred class_id_is_from_given_module(module_name::in, class_id::in)\n    is semidet.\n\nclass_id_is_from_given_module(ModuleName, ClassId) :-\n    ClassId = class_id(qualified(ModuleName, _), _).\n\n:- pred expand_class_method_bodies_2(hlds_class_defn::in,\n    module_info::in, module_info::out) is det.\n\nexpand_class_method_bodies_2(ClassDefn, !ModuleInfo) :-\n    Interface = ClassDefn ^ class_hlds_interface,\n    list.foldl2(expand_class_method_body, Interface, 1, _, !ModuleInfo).\n\n:- pred expand_class_method_body(hlds_class_proc::in, int::in, int::out,\n    module_info::in, module_info::out) is det.\n\nexpand_class_method_body(hlds_class_proc(PredId, ProcId), !ProcNum,\n        !ModuleInfo) :-\n    module_info_get_preds(!.ModuleInfo, PredTable0),\n    map.lookup(PredTable0, PredId, PredInfo0),\n    pred_info_get_procedures(PredInfo0, ProcTable0),\n    map.lookup(ProcTable0, ProcId, ProcInfo0),\n\n    % Find which of the constraints on the pred is the one introduced\n    % because it is a class method.\n    pred_info_get_class_context(PredInfo0, ClassContext),\n    ( ClassContext = constraints([Head | _], _) ->\n        InstanceConstraint = Head\n    ;\n        unexpected($module, $pred, \"class method is not constrained\")\n    ),\n\n    proc_info_get_rtti_varmaps(ProcInfo0, RttiVarMaps),\n    rtti_lookup_typeclass_info_var(RttiVarMaps, InstanceConstraint,\n        TypeClassInfoVar),\n\n    proc_info_get_headvars(ProcInfo0, HeadVars0),\n    proc_info_get_argmodes(ProcInfo0, Modes0),\n    proc_info_get_declared_determinism(ProcInfo0, MaybeDetism0),\n    (\n        MaybeDetism0 = yes(Detism)\n    ;\n        MaybeDetism0 = no,\n        % Omitting the determinism for a method is not allowed. But make_hlds\n        % will have already detected and reported the error. So here we can\n        % just pick some value at random; hopefully something that won't cause\n        % flow-on errors. We also mark the predicate as invalid, also to avoid\n        % flow-on errors.\n        Detism = detism_non,\n        module_info_remove_predid(PredId, !ModuleInfo)\n    ),\n\n    % Work out which argument corresponds to the constraint which is introduced\n    % because this is a class method, then delete it from the list of args to\n    % the class_method_call. That variable becomes the \"dictionary\" variable\n    % for the class_method_call. (cf. the closure for a higher order call).\n    (\n        list.nth_member_search(HeadVars0, TypeClassInfoVar, N),\n        delete_nth(HeadVars0, N, HeadVarsPrime),\n        delete_nth(Modes0, N, ModesPrime)\n    ->\n        HeadVars = HeadVarsPrime,\n        Modes = ModesPrime\n    ;\n        unexpected($module, $pred, \"typeclass_info var not found\")\n    ),\n\n    InstanceConstraint = constraint(ClassName, InstanceArgs),\n    list.length(InstanceArgs, InstanceArity),\n    pred_info_get_call_id(PredInfo0, CallId),\n    BodyGoalExpr = generic_call(\n        class_method(TypeClassInfoVar, !.ProcNum,\n            class_id(ClassName, InstanceArity), CallId),\n        HeadVars, Modes, arg_reg_types_unset, Detism),\n\n    % Make the goal info for the call.\n    set_of_var.list_to_set(HeadVars0, NonLocals),\n    instmap_delta_from_mode_list(HeadVars0, Modes0, !.ModuleInfo,\n        InstmapDelta),\n    pred_info_get_purity(PredInfo0, Purity),\n    goal_info_init(NonLocals, InstmapDelta, Detism, Purity, GoalInfo),\n    BodyGoal = hlds_goal(BodyGoalExpr, GoalInfo),\n\n    proc_info_set_goal(BodyGoal, ProcInfo0, ProcInfo),\n    map.det_update(ProcId, ProcInfo, ProcTable0, ProcTable),\n    pred_info_set_procedures(ProcTable, PredInfo0, PredInfo1),\n    ( pred_info_is_imported(PredInfo1) ->\n        pred_info_set_import_status(status_opt_imported, PredInfo1, PredInfo)\n    ;\n        PredInfo = PredInfo1\n    ),\n\n    map.det_update(PredId, PredInfo, PredTable0, PredTable),\n    module_info_set_preds(PredTable, !ModuleInfo),\n\n    !:ProcNum = !.ProcNum + 1.\n\n:- pred delete_nth(list(T)::in, int::in, list(T)::out) is semidet.\n\ndelete_nth([X | Xs], N0, Result) :-\n    ( N0 > 1 ->\n        N = N0 - 1,\n        delete_nth(Xs, N, TheRest),\n        Result = [X | TheRest]\n    ;\n        Result = Xs\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- func get_constrained_vars(prog_constraint) = list(tvar).\n\nget_constrained_vars(Constraint) = CVars :-\n    Constraint = constraint(_, CTypes),\n    type_vars_list(CTypes, CVars).\n\n%---------------------------------------------------------------------------%\n\n:- pred all_are_const_struct_args(\n    assoc_list(prog_var, maybe(const_struct_arg))::in,\n    list(const_struct_arg)::out) is semidet.\n\nall_are_const_struct_args([], []).\nall_are_const_struct_args([VarMCA | VarsMCAs], [ConstArg | ConstArgs]) :-\n    VarMCA = _Var - MCA,\n    MCA = yes(ConstArg),\n    all_are_const_struct_args(VarsMCAs, ConstArgs).\n\n:- pred get_inst_of_const_struct_arg(const_struct_db::in, const_struct_arg::in,\n    mer_inst::out)\n    is det.\n\nget_inst_of_const_struct_arg(ConstStructDb, ConstArg, Inst) :-\n    (\n        ConstArg = csa_constant(ConsId, _),\n        Inst = bound(shared, inst_test_results_fgtc,\n            [bound_functor(ConsId, [])])\n    ;\n        ConstArg = csa_const_struct(StructNum),\n        lookup_const_struct_num(ConstStructDb, StructNum, Struct),\n        Struct = const_struct(_, _, _, Inst)\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- pred materialize_base_typeclass_info_var(prog_constraint::in, cons_id::in,\n    prog_var::out, list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nmaterialize_base_typeclass_info_var(Constraint, ConsId, Var, Goals, !Info) :-\n    poly_info_get_const_struct_var_map(!.Info, ConstStructVarMap0),\n    build_typeclass_info_type(Constraint, ConstArgType),\n    ConstArg = csa_constant(ConsId, ConstArgType),\n    ( map.search(ConstStructVarMap0, ConstArg, OldVar) ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n        Var = OldVar,\n        Goals = []\n    ;\n        new_typeclass_info_var(Constraint, base_typeclass_info_kind, Var,\n            _VarType, !Info),\n\n        % Create the construction unification to initialize the variable.\n        RHS = rhs_functor(ConsId, no, []),\n        Unification = construct(Var, ConsId, [], [],\n            construct_dynamically, cell_is_shared, no_construct_sub_info),\n        UnifyMode = (free -> ground(shared, none)) -\n            (ground(shared, none) -> ground(shared, none)),\n        UnifyContext = unify_context(umc_explicit, []),\n        % XXX The UnifyContext is wrong.\n        Unify = unify(Var, RHS, UnifyMode, Unification, UnifyContext),\n\n        % Create the unification goal.\n        NonLocals = set_of_var.make_singleton(Var),\n        InstmapDelta = instmap_delta_bind_var(Var),\n        goal_info_init(NonLocals, InstmapDelta, detism_det, purity_pure,\n            GoalInfo),\n        Goal = hlds_goal(Unify, GoalInfo),\n        Goals = [Goal]\n    ).\n\n:- pred materialize_typeclass_info_var(prog_constraint::in, int::in,\n    prog_var::out, list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nmaterialize_typeclass_info_var(Constraint, InstanceIdConstNum, Var, Goals,\n        !Info) :-\n    poly_info_get_const_struct_var_map(!.Info, ConstStructVarMap0),\n    InstanceIdConstArg = csa_const_struct(InstanceIdConstNum),\n    ( map.search(ConstStructVarMap0, InstanceIdConstArg, OldVar) ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n        Var = OldVar,\n        Goals = []\n    ;\n        new_typeclass_info_var(Constraint, typeclass_info_kind, Var, _VarType,\n            !Info),\n        map.det_insert(InstanceIdConstArg, Var,\n            ConstStructVarMap0, ConstStructVarMap),\n        poly_info_set_const_struct_var_map(ConstStructVarMap, !Info),\n\n        % Create the construction unification to initialize the variable.\n        ConsId = typeclass_info_const(InstanceIdConstNum),\n        RHS = rhs_functor(ConsId, no, []),\n        Unification = construct(Var, ConsId, [], [],\n            construct_statically, cell_is_shared, no_construct_sub_info),\n        UnifyMode = (free -> ground(shared, none)) -\n            (ground(shared, none) -> ground(shared, none)),\n        UnifyContext = unify_context(umc_explicit, []),\n        % XXX The UnifyContext is wrong.\n        GoalExpr = unify(Var, RHS, UnifyMode, Unification, UnifyContext),\n\n        % Create a goal_info for the unification.\n        NonLocals = set_of_var.make_singleton(Var),\n        InstmapDelta = instmap_delta_bind_var(Var),\n        goal_info_init(NonLocals, InstmapDelta, detism_det, purity_pure,\n            GoalInfo),\n        Goal = hlds_goal(GoalExpr, GoalInfo),\n        Goals = [Goal]\n    ).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n:- type const_or_var_arg\n    --->    cova_const(const_struct_arg)\n    ;       cova_var(prog_var).\n\n:- pred make_const_or_var_arg(pair(prog_var, maybe(const_struct_arg))::in,\n    const_or_var_arg::out) is det.\n\nmake_const_or_var_arg(Var - MCA, ConstOrVarArg) :-\n    (\n        MCA = no,\n        ConstOrVarArg = cova_var(Var)\n    ;\n        MCA = yes(ConstArg),\n        ConstOrVarArg = cova_const(ConstArg)\n    ).\n\n:- type type_info_var_map ==\n    map(type_ctor,\n        map(list(mer_type), pair(prog_var, maybe(const_struct_arg)))).\n\n:- type typeclass_info_map_entry\n    --->    typeclass_info_map_entry(\n                % The cons_id representing the base_typeclass_info.\n                cons_id,\n\n                % Maps the arguments of the typeclass_info_cell_constructor\n                % after the base_typeclass_info to the variable that holds the\n                % typeclass_info for that cell.\n                map(list(const_or_var_arg),\n                    pair(prog_var, maybe(const_struct_arg)))\n            ).\n\n:- type typeclass_info_map ==\n    map(class_name, map(list(mer_type), typeclass_info_map_entry)).\n\n:- type int_const_map == map(int, prog_var).\n\n    % If the value that can be a constant structure argument is currently\n    % available in a variable, give the id of that variable.\n    %\n:- type const_struct_var_map == map(const_struct_arg, prog_var).\n\n:- type poly_info\n    --->    poly_info(\n                % The first two fields are from the proc_info.\n                poly_varset                 :: prog_varset,\n                poly_vartypes               :: vartypes,\n\n                % The next two fields from the pred_info.\n                poly_typevarset             :: tvarset,\n                poly_tvar_kinds             :: tvar_kind_map,\n\n                % Gives information about the locations of type_infos\n                % and typeclass_infos.\n                poly_rtti_varmaps           :: rtti_varmaps,\n\n                % Specifies why each constraint that was eliminated from the\n                % pred was able to be eliminated (this allows us to efficiently\n                % construct the dictionary).\n                % Note that the rtti_varmaps is separate from the\n                % constraint_proof_map, since the second is the information\n                % calculated by typecheck.m, while the first is the information\n                % calculated here in polymorphism.m.\n                poly_proof_map              :: constraint_proof_map,\n\n                % Specifies the constraints at each location in the goal.\n                poly_constraint_map         :: constraint_map,\n\n                % The next four maps hold information about what\n                % type_ctor_infos, type_infos, base_typeclass_infos,\n                % typeclass_infos and ints are guaranteed to be available\n                % (i.e. created by previous code on all execution paths)\n                % at the current point in the code, so they can be reused.\n                % The fifth field counts the number of times that one of these\n                % variables has in fact been reused.\n                %\n                % The type_infos and typeclass_infos are in the first two maps.\n                % The type_ctor_infos and base_typeclass_infos are in the\n                % fourth map. The integers are in the third map.\n                % The fourth map also caches typeclass_infos for instance ids.\n                poly_type_info_var_map      :: type_info_var_map,\n                poly_typeclass_info_map     :: typeclass_info_map,\n                poly_int_const_map          :: int_const_map,\n                poly_const_struct_var_map   :: const_struct_var_map,\n                poly_num_reuses             :: int,\n\n                poly_snapshot_num           :: int,\n\n                % The database of constant structures of the module.\n                % If a type_info or typeclass_info we construct is a constant\n                % term, we allocate it in this database.\n                poly_const_struct_db        :: const_struct_db,\n\n                poly_pred_info              :: pred_info,\n                poly_module_info            :: module_info\n            ).\n\n%---------------------------------------------------------------------------%\n\n    % Init_poly_info initializes a poly_info from a pred_info and clauses_info.\n    % (See also create_poly_info.)\n    %\n:- pred init_poly_info(module_info::in, pred_info::in, clauses_info::in,\n    poly_info::out) is det.\n\ninit_poly_info(ModuleInfo, PredInfo, ClausesInfo, PolyInfo) :-\n    clauses_info_get_varset(ClausesInfo, VarSet),\n    clauses_info_get_vartypes(ClausesInfo, VarTypes),\n    pred_info_get_typevarset(PredInfo, TypeVarSet),\n    pred_info_get_tvar_kinds(PredInfo, TypeVarKinds),\n    pred_info_get_constraint_proofs(PredInfo, Proofs),\n    pred_info_get_constraint_map(PredInfo, ConstraintMap),\n    rtti_varmaps_init(RttiVarMaps),\n    map.init(TypeInfoVarMap),\n    map.init(TypeClassInfoMap),\n    map.init(IntConstMap),\n    map.init(ConstStructVarMap),\n    NumReuses = 0,\n    SnapshotNum = 0,\n    module_info_get_const_struct_db(ModuleInfo, ConstStructDb),\n    PolyInfo = poly_info(VarSet, VarTypes, TypeVarSet, TypeVarKinds,\n        RttiVarMaps, Proofs, ConstraintMap,\n        TypeInfoVarMap, TypeClassInfoMap, IntConstMap, ConstStructVarMap,\n        NumReuses, SnapshotNum, ConstStructDb, PredInfo, ModuleInfo).\n\n    % Create_poly_info creates a poly_info for an existing procedure.\n    % (See also init_poly_info.)\n    %\ncreate_poly_info(ModuleInfo, PredInfo, ProcInfo, PolyInfo) :-\n    pred_info_get_typevarset(PredInfo, TypeVarSet),\n    pred_info_get_tvar_kinds(PredInfo, TypeVarKinds),\n    pred_info_get_constraint_proofs(PredInfo, Proofs),\n    pred_info_get_constraint_map(PredInfo, ConstraintMap),\n    proc_info_get_varset(ProcInfo, VarSet),\n    proc_info_get_vartypes(ProcInfo, VarTypes),\n    proc_info_get_rtti_varmaps(ProcInfo, RttiVarMaps),\n    map.init(TypeInfoVarMap),\n    map.init(TypeClassInfoMap),\n    map.init(IntConstMap),\n    map.init(ConstStructVarMap),\n    NumReuses = 0,\n    SnapshotNum = 0,\n    module_info_get_const_struct_db(ModuleInfo, ConstStructDb),\n    PolyInfo = poly_info(VarSet, VarTypes, TypeVarSet, TypeVarKinds,\n        RttiVarMaps, Proofs, ConstraintMap, TypeInfoVarMap,\n        TypeClassInfoMap, IntConstMap, ConstStructVarMap,\n        NumReuses, SnapshotNum, ConstStructDb, PredInfo, ModuleInfo).\n\npoly_info_extract(Info, !PredInfo, !ProcInfo, !:ModuleInfo) :-\n    Info = poly_info(VarSet, VarTypes, TypeVarSet, TypeVarKinds,\n        RttiVarMaps, _Proofs, _ConstraintMap,\n        _TypeInfoVarMap, _TypeClassInfoMap, _IntConstMap, _ConstStructVarMap,\n        _NumReuses, _SnapshotNum, ConstStructDb, _OldPredInfo, !:ModuleInfo),\n\n    module_info_set_const_struct_db(ConstStructDb, !ModuleInfo),\n\n    % Set the new values of the fields in proc_info and pred_info.\n    proc_info_set_varset(VarSet, !ProcInfo),\n    proc_info_set_vartypes(VarTypes, !ProcInfo),\n    proc_info_set_rtti_varmaps(RttiVarMaps, !ProcInfo),\n    pred_info_set_typevarset(TypeVarSet, !PredInfo),\n    pred_info_set_tvar_kinds(TypeVarKinds, !PredInfo).\n\n%---------------------------------------------------------------------------%\n\n:- pred poly_info_get_varset(poly_info::in, prog_varset::out) is det.\n:- pred poly_info_get_var_types(poly_info::in, vartypes::out) is det.\n:- pred poly_info_get_typevarset(poly_info::in, tvarset::out) is det.\n:- pred poly_info_get_tvar_kinds(poly_info::in, tvar_kind_map::out) is det.\n:- pred poly_info_get_rtti_varmaps(poly_info::in, rtti_varmaps::out) is det.\n:- pred poly_info_get_proofs(poly_info::in, constraint_proof_map::out) is det.\n:- pred poly_info_get_constraint_map(poly_info::in, constraint_map::out)\n    is det.\n:- pred poly_info_get_type_info_var_map(poly_info::in,\n    type_info_var_map::out) is det.\n:- pred poly_info_get_typeclass_info_map(poly_info::in,\n    typeclass_info_map::out) is det.\n:- pred poly_info_get_int_const_map(poly_info::in, int_const_map::out) is det.\n:- pred poly_info_get_num_reuses(poly_info::in, int::out) is det.\n:- pred poly_info_get_const_struct_db(poly_info::in, const_struct_db::out)\n    is det.\n:- pred poly_info_get_const_struct_var_map(poly_info::in,\n    const_struct_var_map::out) is det.\n:- pred poly_info_get_pred_info(poly_info::in, pred_info::out) is det.\n:- pred poly_info_get_module_info(poly_info::in, module_info::out) is det.\n\npoly_info_get_varset(PolyInfo, PolyInfo ^ poly_varset).\npoly_info_get_var_types(PolyInfo, PolyInfo ^ poly_vartypes).\npoly_info_get_typevarset(PolyInfo, PolyInfo ^ poly_typevarset).\npoly_info_get_tvar_kinds(PolyInfo, PolyInfo ^ poly_tvar_kinds).\npoly_info_get_rtti_varmaps(PolyInfo, PolyInfo ^ poly_rtti_varmaps).\npoly_info_get_proofs(PolyInfo, PolyInfo ^ poly_proof_map).\npoly_info_get_constraint_map(PolyInfo, PolyInfo ^ poly_constraint_map).\npoly_info_get_type_info_var_map(PolyInfo, PolyInfo ^ poly_type_info_var_map).\npoly_info_get_typeclass_info_map(PolyInfo, PolyInfo ^ poly_typeclass_info_map).\npoly_info_get_int_const_map(PolyInfo, PolyInfo ^ poly_int_const_map).\npoly_info_get_num_reuses(PolyInfo, PolyInfo ^ poly_num_reuses).\npoly_info_get_const_struct_db(PolyInfo, PolyInfo ^ poly_const_struct_db).\npoly_info_get_const_struct_var_map(PolyInfo,\n    PolyInfo ^ poly_const_struct_var_map).\npoly_info_get_pred_info(PolyInfo, PolyInfo ^ poly_pred_info).\npoly_info_get_module_info(PolyInfo, PolyInfo ^ poly_module_info).\n\n:- pred poly_info_set_varset(prog_varset::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_varset_and_types(prog_varset::in, vartypes::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_typevarset(tvarset::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_tvar_kinds(tvar_kind_map::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_rtti_varmaps(rtti_varmaps::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_proofs(constraint_proof_map::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_type_info_var_map(type_info_var_map::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_typeclass_info_map(typeclass_info_map::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_int_const_map(int_const_map::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_num_reuses(int::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_const_struct_db(const_struct_db::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_const_struct_var_map(const_struct_var_map::in,\n    poly_info::in, poly_info::out) is det.\n\npoly_info_set_varset(VarSet, !PI) :-\n    !PI ^ poly_varset := VarSet.\npoly_info_set_varset_and_types(VarSet, VarTypes, !PI) :-\n    !PI ^ poly_varset := VarSet,\n    !PI ^ poly_vartypes := VarTypes.\npoly_info_set_typevarset(TVarSet, !PI) :-\n    !PI ^ poly_typevarset := TVarSet.\npoly_info_set_tvar_kinds(TVarKinds, !PI) :-\n    !PI ^ poly_tvar_kinds := TVarKinds.\npoly_info_set_rtti_varmaps(RttiVarMaps, !PI) :-\n    !PI ^ poly_rtti_varmaps := RttiVarMaps.\npoly_info_set_proofs(Proofs, !PI) :-\n    !PI ^ poly_proof_map := Proofs.\npoly_info_set_type_info_var_map(TypeInfoVarMap, !PI) :-\n    !PI ^ poly_type_info_var_map := TypeInfoVarMap.\npoly_info_set_typeclass_info_map(TypeClassInfoMap, !PI) :-\n    !PI ^ poly_typeclass_info_map := TypeClassInfoMap.\npoly_info_set_int_const_map(IntConstMap, !PI) :-\n    !PI ^ poly_int_const_map := IntConstMap.\npoly_info_set_num_reuses(NumReuses, !PI) :-\n    !PI ^ poly_num_reuses := NumReuses.\npoly_info_set_const_struct_db(ConstStructDb, !PI) :-\n    !PI ^ poly_const_struct_db := ConstStructDb.\npoly_info_set_const_struct_var_map(ConstStructVarMap, !PI) :-\n    !PI ^ poly_const_struct_var_map := ConstStructVarMap.\n\n%---------------------------------------------------------------------------%\n\n:- type cache_maps\n    --->    cache_maps(\n                cm_snapshot_num             :: int,\n                cm_type_info_var_map        :: type_info_var_map,\n                cm_typeclass_info_map       :: typeclass_info_map,\n                cm_int_const_map            :: int_const_map,\n                cm_const_struct_var_map     :: const_struct_var_map\n            ).\n\n:- pred get_cache_maps_snapshot(string::in, cache_maps::out,\n    poly_info::in, poly_info::out) is det.\n:- pred set_cache_maps_snapshot(string::in, cache_maps::in,\n    poly_info::in, poly_info::out) is det.\n:- pred empty_cache_maps(poly_info::in, poly_info::out) is det.\n\nget_cache_maps_snapshot(Name, CacheMaps, !Info) :-\n    SnapshotNum = !.Info ^ poly_snapshot_num,\n    TypeInfoVarMap = !.Info ^ poly_type_info_var_map,\n    TypeClassInfoMap = !.Info ^ poly_typeclass_info_map,\n    IntConstMap = !.Info ^ poly_int_const_map,\n    ConstStructVarMap = !.Info ^ poly_const_struct_var_map,\n    CacheMaps = cache_maps(SnapshotNum, TypeInfoVarMap, TypeClassInfoMap,\n        IntConstMap, ConstStructVarMap),\n    !Info ^ poly_snapshot_num := SnapshotNum + 1,\n\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = yes,\n                    Name \\= \"\"\n                ->\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    io.write_string(IndentStr, !IO),\n                    io.format(\"get_cache_maps_snapshot %d %s\\n\",\n                        [i(SnapshotNum), s(Name)], !IO),\n                    io.write_string(IndentStr, !IO),\n                    NumVars = varset.num_allocated(!.Info ^ poly_varset),\n                    io.format(\"num_allocated vars: %d\\n\\n\", [i(NumVars)], !IO)\n                ;\n                    true\n                )\n            )\n        )\n    ).\n\nset_cache_maps_snapshot(Name, CacheMaps, !Info) :-\n    CacheMaps = cache_maps(SnapshotNum, TypeInfoVarMap, TypeClassInfoMap,\n        IntConstMap, ConstStructVarMap),\n    !Info ^ poly_type_info_var_map := TypeInfoVarMap,\n    !Info ^ poly_typeclass_info_map := TypeClassInfoMap,\n    !Info ^ poly_int_const_map := IntConstMap,\n    !Info ^ poly_const_struct_var_map := ConstStructVarMap,\n\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = yes,\n                    Name \\= \"\"\n                ->\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    io.write_string(IndentStr, !IO),\n                    io.format(\"set_cache_maps_snapshot %d %s\\n\",\n                        [i(SnapshotNum), s(Name)], !IO),\n                    io.write_string(IndentStr, !IO),\n                    NumVars = varset.num_allocated(!.Info ^ poly_varset),\n                    io.format(\"num_allocated vars: %d\\n\\n\", [i(NumVars)], !IO),\n\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"type_info_var_map \", !IO),\n                    io.write(CacheMaps ^ cm_type_info_var_map, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"typeclass_info_map \", !IO),\n                    io.write(CacheMaps ^ cm_typeclass_info_map, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"struct_var_map \", !IO),\n                    io.write(CacheMaps ^ cm_const_struct_var_map, !IO),\n                    io.nl(!IO),\n                    io.nl(!IO)\n                ;\n                    true\n                )\n            )\n        )\n    ).\n\nempty_cache_maps(!Info) :-\n    !Info ^ poly_type_info_var_map := map.init,\n    !Info ^ poly_typeclass_info_map := map.init,\n    !Info ^ poly_int_const_map := map.init,\n    !Info ^ poly_const_struct_var_map := map.init.\n\n%---------------------------------------------------------------------------%\n\n:- type var_maps\n    --->    var_maps(\n                vm_snapshot_num             :: int,\n                vm_varset                   :: prog_varset,\n                vm_vartypes                 :: vartypes,\n                vm_rtti_varmaps             :: rtti_varmaps,\n                vm_cache_maps               :: cache_maps\n            ).\n\n:- pred get_var_maps_snapshot(string::in, var_maps::out,\n    poly_info::in, poly_info::out) is det.\n\nget_var_maps_snapshot(Name, VarMaps, !Info) :-\n    SnapshotNum = !.Info ^ poly_snapshot_num,\n    VarSet = !.Info ^ poly_varset,\n    VarTypes = !.Info ^ poly_vartypes,\n    RttiVarMaps = !.Info ^ poly_rtti_varmaps,\n\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = no\n                ;\n                    SelectedPred = yes,\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    io.write_string(IndentStr, !IO),\n                    io.format(\"get_var_maps_snapshot %d %s\\n\",\n                        [i(SnapshotNum), s(Name)], !IO),\n                    io.write_string(IndentStr, !IO),\n                    NumVars = varset.num_allocated(VarSet),\n                    io.format(\"num_allocated vars: %d\\n\\n\", [i(NumVars)], !IO)\n                )\n            )\n        )\n    ),\n\n    get_cache_maps_snapshot(\"\", CacheMaps, !Info),\n    VarMaps = var_maps(SnapshotNum, VarSet, VarTypes, RttiVarMaps, CacheMaps).\n\n:- pred set_var_maps_snapshot(string::in, var_maps::in,\n    poly_info::in, poly_info::out) is det.\n\nset_var_maps_snapshot(Name, VarMaps, !Info) :-\n    VarMaps = var_maps(SnapshotNum, VarSet, VarTypes, RttiVarMaps, CacheMaps),\n\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = no\n                ;\n                    SelectedPred = yes,\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    io.write_string(IndentStr, !IO),\n                    io.format(\"set_var_maps_snapshot %d %s\\n\",\n                        [i(SnapshotNum), s(Name)], !IO),\n\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"type_info_var_map \", !IO),\n                    io.write(CacheMaps ^ cm_type_info_var_map, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"typeclass_info_map \", !IO),\n                    io.write(CacheMaps ^ cm_typeclass_info_map, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"struct_var_map \", !IO),\n                    io.write(CacheMaps ^ cm_const_struct_var_map, !IO),\n                    io.nl(!IO),\n                    io.nl(!IO)\n                )\n            )\n        )\n    ),\n\n    !Info ^ poly_varset := VarSet,\n    !Info ^ poly_vartypes := VarTypes,\n    !Info ^ poly_rtti_varmaps := RttiVarMaps,\n    set_cache_maps_snapshot(\"\", CacheMaps, !Info).\n\n%---------------------------------------------------------------------------%\n:- end_module check_hlds.polymorphism.\n%---------------------------------------------------------------------------%\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mercury/rot13_concise.m",
    "content": "% File: rot13_concise.m\n% Main authors: Warwick Harvey <wharvey@cs.monash.edu.au>\n%               Fergus Henderson <fjh@cs.mu.oz.au>\n%\n% rot13_concise:\n%\n% Program to read its input, apply the rot13 algorithm, and write it out\n% again.\n%\n% This version is more concise (but less efficient) than its companion,\n% rot13_verbose.\n%\n% Key features:\n% - is independent of character set (e.g. ASCII, EBCDIC)\n% - has proper error handling\n%\n\n:- module rot13_concise.\n\n:- interface.\n:- import_module io.\n\n:- pred main(state, state).\n:- mode main(di, uo) is det.\n\n:- implementation.\n:- import_module char, int, string.\n\n% The length of `alphabet' should be a multiple of `cycle'.\nalphabet = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\".\ncycle = 26.\n\nrot_n(N, Char) = RotChar :-\n\tchar_to_string(Char, CharString),\n\t( if sub_string_search(alphabet, CharString, Index) then\n\t\tNewIndex = (Index + N) mod cycle + cycle * (Index // cycle),\n\t\tindex_det(alphabet, NewIndex, RotChar)\n\telse\n\t\tRotChar = Char\n\t).\n\nrot13(Char) = rot_n(13, Char).\n\nmain -->\n\tread_char(Res),\n\t( { Res = ok(Char) },\n\t\tprint(rot13(Char)),\n\t\tmain\n\t; { Res = eof }\n\t; { Res = error(ErrorCode) },\n\t\t{ error_message(ErrorCode, ErrorMessage) },\n\t\tstderr_stream(StdErr),\n\t\tprint(StdErr, \"rot13: error reading input: \"),\n\t\tprint(StdErr, ErrorMessage),\n\t\tnl(StdErr)\n\t).\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mercury/rot13_ralph.m",
    "content": "% ---------------------------------------------------------------------------- %\n% rot13_ralph.m\n% Copyright (C) 2001 Ralph Becket <rbeck@microsoft.com>\n% Tue Jan  9 18:10:44 GMT 2001\n% vim: ts=4 sw=4 et tw=0 wm=0 ff=unix ft=mercury\n%\n% Short and sweet.\n%\n% ---------------------------------------------------------------------------- %\n\n:- module rot13_ralph.\n\n:- interface.\n\n:- import_module io.\n\n\n\n:- pred main(io__state::di, io__state::uo) is det.\n\n% ---------------------------------------------------------------------------- %\n% ---------------------------------------------------------------------------- %\n\n:- implementation.\n\n:- import_module int, require.\n\n% ---------------------------------------------------------------------------- %\n\nmain -->\n    io__read_byte(Result),\n    (   { Result = ok(X) },         io__write_byte(rot13(X)), main\n    ;   { Result = eof }\n    ;   { Result = error(ErrNo)},   { error(io__error_message(ErrNo)) }\n    ).\n\n% ---------------------------------------------------------------------------- %\n\n:- func rot13(int) = int.\n\nrot13(X) =\n    (      if 0'a =< X, X =< 0'z then Rot13(X, 0'a)\n      else if 0'A =< X, X =< 0'Z then Rot13(X, 0'A)\n      else X\n    )\n :-\n    Rot13 = ( func(C, A) = ((13 + C - A) `rem` 26) + A ).\n\n% ---------------------------------------------------------------------------- %\n% ---------------------------------------------------------------------------- %\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mercury/rot13_verbose.m",
    "content": "% File: rot13_verbose.m\n% Main author: Warwick Harvey <wharvey@cs.monash.edu.au>\n% Additional input: Fergus Henderson <fjh@cs.mu.oz.au>\n\n%\n% rot13_verbose:\n%\n% Program to read its input, apply the rot13 algorithm, and write it out\n% again.\n%\n% This version is more verbose (and more efficient) than its companion,\n% rot13_concise.\n%\n% Key features:\n% - is independent of character set (e.g. ASCII, EBCDIC)\n% - has proper error handling\n% - reasonably efficient (uses a table to do the rotation)\n%\n\n:- module rot13_verbose.\n\n:- interface.\n:- import_module io.\n\n:- pred main(io__state, io__state).\n:- mode main(di, uo) is det.\n\n:- implementation.\n:- import_module char, int, require.\n\n\t% rot13a/2\n\t% A table to map the alphabetic characters to their rot13 equivalents\n\t% (fails if the input is not alphabetic).\n:- pred rot13a(char, char).\n:- mode rot13a(in, out) is semidet.\n\nrot13a('a', 'n').\nrot13a('b', 'o').\nrot13a('c', 'p').\nrot13a('d', 'q').\nrot13a('e', 'r').\nrot13a('f', 's').\nrot13a('g', 't').\nrot13a('h', 'u').\nrot13a('i', 'v').\nrot13a('j', 'w').\nrot13a('k', 'x').\nrot13a('l', 'y').\nrot13a('m', 'z').\nrot13a('n', 'a').\nrot13a('o', 'b').\nrot13a('p', 'c').\nrot13a('q', 'd').\nrot13a('r', 'e').\nrot13a('s', 'f').\nrot13a('t', 'g').\nrot13a('u', 'h').\nrot13a('v', 'i').\nrot13a('w', 'j').\nrot13a('x', 'k').\nrot13a('y', 'l').\nrot13a('z', 'm').\nrot13a('A', 'N').\nrot13a('B', 'O').\nrot13a('C', 'P').\nrot13a('D', 'Q').\nrot13a('E', 'R').\nrot13a('F', 'S').\nrot13a('G', 'T').\nrot13a('H', 'U').\nrot13a('I', 'V').\nrot13a('J', 'W').\nrot13a('K', 'X').\nrot13a('L', 'Y').\nrot13a('M', 'Z').\nrot13a('N', 'A').\nrot13a('O', 'B').\nrot13a('P', 'C').\nrot13a('Q', 'D').\nrot13a('R', 'E').\nrot13a('S', 'F').\nrot13a('T', 'G').\nrot13a('U', 'H').\nrot13a('V', 'I').\nrot13a('W', 'J').\nrot13a('X', 'K').\nrot13a('Y', 'L').\nrot13a('Z', 'M').\n\n\t% rot13/2\n\t% Applies the rot13 algorithm to a character.\n:- pred rot13(char, char).\n:- mode rot13(in, out) is det.\n\nrot13(Char, RotChar) :-\n\t( if rot13a(Char, TmpChar) then\n\t\tRotChar = TmpChar\n\telse\n\t\tRotChar = Char\n\t).\n\nmain -->\n\tio__read_char(Res),\n\t( { Res = ok(Char) },\n\t\t{ rot13(Char, RotChar) },\n\t\tio__write_char(RotChar),\n\t\tmain\n\t; { Res = eof }\n\t; { Res = error(ErrorCode) },\n\t\t{ io__error_message(ErrorCode, ErrorMessage) },\n\t\tio__stderr_stream(StdErr),\n\t\tio__write_string(StdErr, \"rot13: error reading input: \"),\n\t\tio__write_string(StdErr, ErrorMessage),\n\t\tio__nl(StdErr)\n\t).\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mercury/store.m",
    "content": "%-----------------------------------------------------------------------------%\n% vim: ft=mercury ts=4 sw=4 et wm=0 tw=0\n%-----------------------------------------------------------------------------%\n% Copyright (C) 1994-1997, 2000-2008, 2010-2011 The University of Melbourne.\n% This file may only be copied under the terms of the GNU Library General\n% Public License - see the file COPYING.LIB in the Mercury distribution.\n%-----------------------------------------------------------------------------%\n% \n% File: store.m.\n% Main author: fjh.\n% Stability: low.\n% \n% This file provides facilities for manipulating mutable stores.\n% A store can be considered a mapping from abstract keys to their values.\n% A store holds a set of nodes, each of which may contain a value of any\n% type.\n%\n% Stores may be used to implement cyclic data structures such as circular\n% linked lists, etc.\n%\n% Stores can have two different sorts of keys:\n% mutable variables (mutvars) and references (refs).\n% The difference between mutvars and refs is that mutvars can only be updated\n% atomically, whereas it is possible to update individual fields of a\n% reference one at a time (presuming the reference refers to a structured\n% term).\n% \n%-----------------------------------------------------------------------------%\n%-----------------------------------------------------------------------------%\n\n:- module store.\n:- interface.\n\n:- import_module io.\n\n%-----------------------------------------------------------------------------%\n\n    % Stores and keys are indexed by a type S of typeclass store(S) that\n    % is used to distinguish between different stores.  By using an\n    % existential type declaration for store.new (see below), we use the\n    % type system to ensure at compile time that you never attempt to use\n    % a key from one store to access a different store.\n    %\n:- typeclass store(T) where [].\n:- type store(S).\n\n:- instance store(io.state).\n:- instance store(store(S)).\n\n    % Initialize a new store.\n    %\n:- some [S] pred store.init(store(S)::uo) is det.\n\n%-----------------------------------------------------------------------------%\n%\n% Mutvars\n%\n\n    % generic_mutvar(T, S):\n    % A mutable variable holding a value of type T in store S.\n    %\n:- type generic_mutvar(T, S).\n:- type io_mutvar(T) == generic_mutvar(T, io.state).\n:- type store_mutvar(T, S) == generic_mutvar(T, store(S)).\n\n    % Create a new mutable variable, initialized with the specified value.\n    %\n:- pred store.new_mutvar(T::in, generic_mutvar(T, S)::out, S::di, S::uo)\n    is det <= store(S).\n\n    % copy_mutvar(OldMutvar, NewMutvar, S0, S) is equivalent to the sequence\n    %   get_mutvar(OldMutvar, Value, S0, S1),\n    %   new_mutvar(NewMutvar, Value, S1, S )\n    %\n:- pred store.copy_mutvar(generic_mutvar(T, S)::in, generic_mutvar(T, S)::out,\n    S::di, S::uo) is det <= store(S).\n\n    % Lookup the value stored in a given mutable variable.\n    %\n:- pred store.get_mutvar(generic_mutvar(T, S)::in, T::out,\n    S::di, S::uo) is det <= store(S).\n\n    % Replace the value stored in a given mutable variable.\n    %\n:- pred store.set_mutvar(generic_mutvar(T, S)::in, T::in,\n    S::di, S::uo) is det <= store(S).\n\n    % new_cyclic_mutvar(Func, Mutvar):\n    %\n    % Create a new mutable variable, whose value is initialized\n    % with the value returned from the specified function `Func'.\n    % The argument passed to the function is the mutvar itself,\n    % whose value has not yet been initialized (this is safe\n    % because the function does not get passed the store, so\n    % it can't examine the uninitialized value).\n    %\n    % This predicate is useful for creating self-referential values\n    % such as circular linked lists.\n    % For example:\n    %\n    %   :- type clist(T, S) ---> node(T, mutvar(clist(T, S))).\n    %\n    %   :- pred init_cl(T::in, clist(T, S)::out,\n    %       store(S)::di, store(S)::uo) is det.\n    %\n    %   init_cl(X, CList, !Store) :-\n    %       store.new_cyclic_mutvar(func(CL) = node(X, CL), CList,\n    %       !Store).\n    %\n:- pred store.new_cyclic_mutvar((func(generic_mutvar(T, S)) = T)::in,\n    generic_mutvar(T, S)::out, S::di, S::uo) is det <= store(S).\n\n%-----------------------------------------------------------------------------%\n%\n% References\n%\n\n    % generic_ref(T, S):\n    %\n    % A reference to value of type T in store S.\n    %\n:- type generic_ref(T, S).\n:- type io_ref(T, S) == generic_ref(T, io.state).\n:- type store_ref(T, S) == generic_ref(T, store(S)).\n\n    % new_ref(Val, Ref):\n    %   /* In C: Ref = malloc(...); *Ref = Val; */\n    %\n    % Given a value of any type `T', insert a copy of the term\n    % into the store and return a new reference to that term.\n    % (This does not actually perform a copy, it just returns a view\n    % of the representation of that value.\n    % It does however allocate one cell to hold the reference;\n    % you can use new_arg_ref to avoid that.)\n    %\n:- pred store.new_ref(T::di, generic_ref(T, S)::out,\n    S::di, S::uo) is det <= store(S).\n\n    % ref_functor(Ref, Functor, Arity):\n    %\n    % Given a reference to a term, return the functor and arity\n    % of that term.\n    %\n:- pred store.ref_functor(generic_ref(T, S)::in, string::out, int::out,\n    S::di, S::uo) is det <= store(S).\n\n    % arg_ref(Ref, ArgNum, ArgRef):\n    %   /* Pseudo-C code: ArgRef = &Ref[ArgNum]; */\n    %\n    % Given a reference to a term, return a reference to\n    % the specified argument (field) of that term\n    % (argument numbers start from zero).\n    % It is an error if the argument number is out of range,\n    % or if the argument reference has the wrong type.\n    %\n:- pred store.arg_ref(generic_ref(T, S)::in, int::in,\n    generic_ref(ArgT, S)::out, S::di, S::uo) is det <= store(S).\n\n    % new_arg_ref(Val, ArgNum, ArgRef):\n    %   /* Pseudo-C code: ArgRef = &Val[ArgNum]; */\n    %\n    % Equivalent to `new_ref(Val, Ref), arg_ref(Ref, ArgNum, ArgRef)',\n    % except that it is more efficient.\n    % It is an error if the argument number is out of range,\n    % or if the argument reference has the wrong type.\n    %\n:- pred store.new_arg_ref(T::di, int::in, generic_ref(ArgT, S)::out,\n    S::di, S::uo) is det <= store(S).\n\n    % set_ref(Ref, ValueRef):\n    %   /* Pseudo-C code: *Ref = *ValueRef; */\n    %\n    % Given a reference to a term (Ref),\n    % a reference to another term (ValueRef),\n    % update the store so that the term referred to by Ref\n    % is replaced with the term referenced by ValueRef.\n    %\n:- pred store.set_ref(generic_ref(T, S)::in, generic_ref(T, S)::in,\n    S::di, S::uo) is det <= store(S).\n\n    % set_ref_value(Ref, Value):\n    %   /* Pseudo-C code: *Ref = Value; */\n    %\n    % Given a reference to a term (Ref), and a value (Value),\n    % update the store so that the term referred to by Ref\n    % is replaced with Value.\n    %\n:- pred store.set_ref_value(generic_ref(T, S)::in, T::di,\n    S::di, S::uo) is det <= store(S).\n\n    % Given a reference to a term, return that term.\n    % Note that this requires making a copy, so this pred may\n    % be inefficient if used to return large terms; it\n    % is most efficient with atomic terms.\n    % XXX current implementation buggy (does shallow copy)\n    %\n:- pred store.copy_ref_value(generic_ref(T, S)::in, T::uo,\n    S::di, S::uo) is det <= store(S).\n\n    % Same as above, but without making a copy. Destroys the store.\n    %\n:- pred store.extract_ref_value(S::di, generic_ref(T, S)::in, T::out)\n    is det <= store(S).\n\n%-----------------------------------------------------------------------------%\n%\n% Nasty performance hacks\n%\n% WARNING: use of these procedures is dangerous!\n% Use them only as a last resort, only if performance is critical, and only if\n% profiling shows that using the safe versions is a bottleneck.\n%\n% These procedures may vanish in some future version of Mercury.\n\n    % `unsafe_arg_ref' is the same as `arg_ref',\n    % and `unsafe_new_arg_ref' is the same as `new_arg_ref'\n    % except that they doesn't check for errors,\n    % and they don't work for `no_tag' types (types with\n    % exactly one functor which has exactly one argument),\n    % and they don't work for arguments which occupy a word with other\n    % arguments,\n    % and they don't work for types with >4 functors.\n    % If the argument number is out of range,\n    % or if the argument reference has the wrong type,\n    % or if the argument is a `no_tag' type,\n    % or if the argument uses a packed representation,\n    % then the behaviour is undefined, and probably harmful.\n\n:- pred store.unsafe_arg_ref(generic_ref(T, S)::in, int::in,\n    generic_ref(ArgT, S)::out, S::di, S::uo) is det <= store(S).\n\n:- pred store.unsafe_new_arg_ref(T::di, int::in, generic_ref(ArgT, S)::out,\n    S::di, S::uo) is det <= store(S).\n\n%-----------------------------------------------------------------------------%\n%-----------------------------------------------------------------------------%\n\n:- implementation.\n\n:- import_module deconstruct.\n:- import_module require.\n\n:- instance store(store(S)) where [].\n:- instance store(io.state) where [].\n\n% The store type itself is just a dummy type,\n% with no real representation.\n\n:- type store(S).\n:- pragma foreign_type(\"C\", store(S), \"MR_Word\", [can_pass_as_mercury_type])\n    where equality is store_equal, comparison is store_compare.\n:- pragma foreign_type(\"IL\", store(S), \"int32\", [can_pass_as_mercury_type])\n    where equality is store_equal, comparison is store_compare.\n:- pragma foreign_type(\"C#\", store(S), \"int\", [can_pass_as_mercury_type])\n    where equality is store_equal, comparison is store_compare.\n:- pragma foreign_type(\"Java\", store(S), \"int\", [can_pass_as_mercury_type])\n    where equality is store_equal, comparison is store_compare.\n:- pragma foreign_type(\"Erlang\", store(S), \"\", [can_pass_as_mercury_type])\n    where equality is store_equal, comparison is store_compare.\n\n:- pred store_equal(store(S)::in, store(S)::in) is semidet.\n\nstore_equal(_, _) :-\n    error(\"attempt to unify two stores\").\n\n:- pred store_compare(comparison_result::uo, store(S)::in, store(S)::in)\n    is det.\n\nstore_compare(_, _, _) :-\n    error(\"attempt to compare two stores\").\n\n    % Mutvars and references are each represented as a pointer to a single word\n    % on the heap.\n:- type generic_mutvar(T, S) ---> mutvar(private_builtin.ref(T)).\n:- type generic_ref(T, S) ---> ref(private_builtin.ref(T)).\n\nstore.init(S) :-\n    store.do_init(S).\n\n:- some [S] pred store.do_init(store(S)::uo) is det.\n\n:- pragma foreign_proc(\"C\",\n    store.do_init(_S0::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    TypeInfo_for_S = 0;\n\").\n:- pragma foreign_proc(\"C#\",\n    store.do_init(_S0::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    TypeInfo_for_S = null;\n\").\n:- pragma foreign_proc(\"Java\",\n    store.do_init(_S0::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    TypeInfo_for_S = null;\n\").\n:- pragma foreign_proc(\"Erlang\",\n    store.do_init(_S0::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    TypeInfo_for_S = 'XXX'\n\").\n\n% Note -- the syntax for the operations on stores\n% might be nicer if we used some new operators, e.g.\n%\n%   :- op(.., xfx, ('<-')).\n%   :- op(.., fy, ('!')).\n%   :- op(.., xfx, (':=')).\n%\n% Then we could do something like this:\n%\n%   Ptr <- new(Val)   -->   new_mutvar(Val, Ptr).\n%   Val <- !Ptr       -->   get_mutvar(Ptr, Val).\n%   !Ptr := Val   -->   set_mutvar(Ptr, Val).\n%\n% I wonder whether it is worth it?  Hmm, probably not.\n\n:- pragma foreign_proc(\"C\",\n    new_mutvar(Val::in, Mutvar::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    MR_offset_incr_hp_msg(Mutvar, MR_SIZE_SLOT_SIZE, MR_SIZE_SLOT_SIZE + 1,\n        MR_ALLOC_ID, \"\"store.mutvar/2\"\");\n    MR_define_size_slot(0, Mutvar, 1);\n    * (MR_Word *) Mutvar = Val;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C\",\n    get_mutvar(Mutvar::in, Val::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    Val = * (MR_Word *) Mutvar;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C\",\n    set_mutvar(Mutvar::in, Val::in, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    * (MR_Word *) Mutvar = Val;\n    S = S0;\n\").\n\n:- pragma foreign_type(\"C#\", generic_mutvar(T, S), \"object[]\").\n\n:- pragma foreign_proc(\"C#\",\n    new_mutvar(Val::in, Mutvar::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar = new object[] { Val };\n\").\n\n:- pragma foreign_proc(\"C#\",\n    get_mutvar(Mutvar::in, Val::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Mutvar[0];\n\").\n\n:- pragma foreign_proc(\"C#\",\n    set_mutvar(Mutvar::in, Val::in, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar[0] = Val;\n\").\n\n:- pragma foreign_type(\"Java\", generic_mutvar(T, S), \"mutvar.Mutvar\").\n\n:- pragma foreign_proc(\"Java\",\n    new_mutvar(Val::in, Mutvar::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar = new mutvar.Mutvar(Val);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    get_mutvar(Mutvar::in, Val::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Mutvar.object;\n\").\n\n:- pragma foreign_proc(\"Java\",\n    set_mutvar(Mutvar::in, Val::in, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar.object = Val;\n\").\n\n% XXX ets are not garbage collected\n% but shareable between processes\n\n:- pragma foreign_type(\"Erlang\", generic_mutvar(T, S), \"\").\n\n:- pragma foreign_proc(\"Erlang\",\n    new_mutvar(Val::in, Mutvar::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar = ets:new(mutvar, [set, public]),\n    ets:insert(Mutvar, {value, Val}),\n    S = S0\n\").\n\n:- pragma foreign_proc(\"Erlang\",\n    get_mutvar(Mutvar::in, Val::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    [{value, Val}] = ets:lookup(Mutvar, value),\n    S = S0\n\").\n\n:- pragma foreign_proc(\"Erlang\",\n    set_mutvar(Mutvar::in, Val::in, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    ets:insert(Mutvar, {value, Val}),\n    S = S0\n\").\n\ncopy_mutvar(Mutvar, Copy, !S) :-\n    get_mutvar(Mutvar, Value, !S),\n    new_mutvar(Value, Copy, !S).\n\n:- pred store.unsafe_new_uninitialized_mutvar(generic_mutvar(T, S)::out,\n    S::di, S::uo) is det <= store(S).\n\n:- pragma foreign_proc(\"C\",\n    unsafe_new_uninitialized_mutvar(Mutvar::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    MR_offset_incr_hp_msg(Mutvar, MR_SIZE_SLOT_SIZE, MR_SIZE_SLOT_SIZE + 1,\n        MR_ALLOC_ID, \"\"store.mutvar/2\"\");\n    MR_define_size_slot(0, Mutvar, 1);\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C#\",\n    unsafe_new_uninitialized_mutvar(Mutvar::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar = new object[1];\n\").\n\n:- pragma foreign_proc(\"Java\",\n    unsafe_new_uninitialized_mutvar(Mutvar::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar = new mutvar.Mutvar();\n\").\n\nstore.new_cyclic_mutvar(Func, MutVar, !Store) :-\n    store.unsafe_new_uninitialized_mutvar(MutVar, !Store),\n    Value = apply(Func, MutVar),\n    store.set_mutvar(MutVar, Value, !Store).\n\n%-----------------------------------------------------------------------------%\n\n:- pragma foreign_type(\"C#\", generic_ref(T, S), \"store.Ref\").\n:- pragma foreign_code(\"C#\",\n\"\n    public class Ref {\n        // Object referenced.\n        public object   obj;\n\n        // Specific field of object referenced, or null to\n        // specify the object itself.\n        // XXX GetFields does not return fields in any particular order so\n        // this is not really usable.\n        public System.Reflection.FieldInfo  field;\n\n        // Constructors\n        public Ref(object init) {\n            obj     = init;\n            field   = null;\n        }\n        public Ref(object init, int num) {\n            obj = init;\n            setField(num);\n        }\n\n        // Set the field according to a given index.\n        public void setField(int num) {\n            field = obj.GetType().GetFields()[num];\n        }\n\n        // Return the value of the reference.\n        public object getValue() {\n            if (field == null) {\n                return obj;\n            } else {\n                return field.GetValue(obj);\n            }\n        }\n\n        // Update the value of the reference.\n        public void setValue(object value) {\n            field.SetValue(obj, value);\n        }\n    } // class Ref\n\").\n\n:- pragma foreign_type(java, generic_ref(T, S), \"store.Ref\").\n:- pragma foreign_code(\"Java\",\n\"\n    public static class Ref {\n        // Object referenced.\n        public java.lang.Object         object;\n\n        // Specific field of object referenced, or null to\n        // specify the object itself.\n        // XXX getDeclaredFields does not return fields in any particular\n        // order so this is not really usable.\n        public java.lang.reflect.Field  field;\n\n        // Constructors\n        public Ref(java.lang.Object init) {\n            object  = init;\n            field   = null;\n        }\n        public Ref(java.lang.Object init, int num) {\n            object  = init;\n            setField(num);\n        }\n\n        // Set the field according to a given index.\n        public void setField(int num) {\n            try {\n                field = object.getClass().getDeclaredFields()[num];\n            } catch (java.lang.SecurityException se) {\n                throw new java.lang.RuntimeException(\n                    \"\"Security manager denied access to object fields\"\");\n            } catch (java.lang.ArrayIndexOutOfBoundsException e) {\n                throw new java.lang.RuntimeException(\n                    \"\"No such field in object\"\");\n            } catch (java.lang.Exception e) {\n                throw new java.lang.RuntimeException(\n                    \"\"Unable to set field: \"\" + e.getMessage());\n            }\n        }\n\n        // Return the value of the reference.\n        public java.lang.Object getValue() {\n            if (field == null) {\n                return object;\n            } else {\n                try {\n                    return field.get(object);\n                } catch (java.lang.IllegalAccessException e) {\n                    throw new java.lang.RuntimeException(\n                        \"\"Field inaccessible\"\");\n                } catch (java.lang.IllegalArgumentException e)\n                {\n                    throw new java.lang.RuntimeException(\n                        \"\"Field-object mismatch\"\");\n                } catch (java.lang.NullPointerException e) {\n                    throw new java.lang.RuntimeException(\n                        \"\"Object is null\"\");\n                } catch (java.lang.Exception e) {\n                    throw new java.lang.RuntimeException(\n                        \"\"Unable to access field: \"\" + e.getMessage());\n                }\n            }\n        }\n\n        // Update the value of the reference.\n        public void setValue(java.lang.Object value) {\n            try {\n                field.set(object, value);\n            } catch (java.lang.IllegalAccessException e) {\n                throw new java.lang.RuntimeException(\"\"Field inaccessible\"\");\n            } catch (java.lang.IllegalArgumentException e) {\n                throw new java.lang.RuntimeException(\n                    \"\"Field-object mismatch\"\");\n            } catch (java.lang.NullPointerException e) {\n                throw new java.lang.RuntimeException(\"\"Object is null\"\");\n            } catch (java.lang.Exception e) {\n                throw new java.lang.RuntimeException(\n                        \"\"Unable to access field: \"\" + e.getMessage());\n            }\n        }\n    } // class Ref\n\").\n\n:- pragma foreign_proc(\"C\",\n    new_ref(Val::di, Ref::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    MR_offset_incr_hp_msg(Ref, MR_SIZE_SLOT_SIZE, MR_SIZE_SLOT_SIZE + 1,\n        MR_ALLOC_ID, \"\"store.ref/2\"\");\n    MR_define_size_slot(0, Ref, 1);\n    * (MR_Word *) Ref = Val;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C#\",\n    new_ref(Val::di, Ref::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref = new store.Ref(Val);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    new_ref(Val::di, Ref::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref = new store.Ref(Val);\n\").\n\n:- pragma foreign_proc(\"Erlang\",\n    new_ref(Val::di, Ref::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref = ets:new(mutvar, [set, public]),\n    ets:insert(Ref, {value, Val}),\n    S = S0\n\").\n\ncopy_ref_value(Ref, Val) -->\n    % XXX Need to deep-copy non-atomic types.\n    unsafe_ref_value(Ref, Val).\n\n    % Unsafe_ref_value extracts the value that a reference refers to, without\n    % making a copy; it is unsafe because the store could later be modified,\n    % changing the returned value.\n    %\n:- pred store.unsafe_ref_value(generic_ref(T, S)::in, T::uo,\n    S::di, S::uo) is det <= store(S).\n\n:- pragma foreign_proc(\"C\",\n    unsafe_ref_value(Ref::in, Val::uo, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    Val = * (MR_Word *) Ref;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C#\",\n    unsafe_ref_value(Ref::in, Val::uo, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Ref.getValue();\n\").\n\n:- pragma foreign_proc(\"Java\",\n    unsafe_ref_value(Ref::in, Val::uo, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Ref.getValue();\n\").\n\n:- pragma foreign_proc(\"Erlang\",\n    unsafe_ref_value(Ref::in, Val::uo, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    [{value, Val}] = ets:lookup(Ref, value),\n    S = S0\n\").\n\nref_functor(Ref, Functor, Arity, !Store) :-\n    unsafe_ref_value(Ref, Val, !Store),\n    functor(Val, canonicalize, Functor, Arity).\n\n:- pragma foreign_decl(\"C\",\n\"\n    #include \"\"mercury_type_info.h\"\"\n    #include \"\"mercury_heap.h\"\"\n    #include \"\"mercury_misc.h\"\"         /* for MR_fatal_error() */\n    #include \"\"mercury_deconstruct.h\"\"  /* for MR_arg() */\n\").\n\n:- pragma foreign_proc(\"C\",\n    arg_ref(Ref::in, ArgNum::in, ArgRef::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, may_not_duplicate],\n\"{\n    MR_TypeInfo         type_info;\n    MR_TypeInfo         arg_type_info;\n    MR_TypeInfo         exp_arg_type_info;\n    MR_Word             *arg_ref;\n    const MR_DuArgLocn  *arg_locn;\n\n    type_info = (MR_TypeInfo) TypeInfo_for_T;\n    exp_arg_type_info = (MR_TypeInfo) TypeInfo_for_ArgT;\n\n    MR_save_transient_registers();\n\n    if (!MR_arg(type_info, (MR_Word *) Ref, ArgNum, &arg_type_info,\n        &arg_ref, &arg_locn, MR_NONCANON_ABORT))\n    {\n        MR_fatal_error(\"\"store.arg_ref: argument number out of range\"\");\n    }\n\n    if (MR_compare_type_info(arg_type_info, exp_arg_type_info) !=\n        MR_COMPARE_EQUAL)\n    {\n        MR_fatal_error(\"\"store.arg_ref: argument has wrong type\"\");\n    }\n\n    MR_restore_transient_registers();\n\n    if (arg_locn != NULL && arg_locn->MR_arg_bits != 0) {\n        MR_offset_incr_hp_msg(ArgRef, MR_SIZE_SLOT_SIZE,\n            MR_SIZE_SLOT_SIZE + 1, MR_ALLOC_ID, \"\"store.ref/2\"\");\n        MR_define_size_slot(0, ArgRef, 1);\n        * (MR_Word *) ArgRef = MR_arg_value(arg_ref, arg_locn);\n    } else {\n        ArgRef = (MR_Word) arg_ref;\n    }\n    S = S0;\n}\").\n\n:- pragma foreign_proc(\"C#\",\n    arg_ref(Ref::in, ArgNum::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    /*\n    ** XXX Some dynamic type-checking should be done here to check that\n    ** the type of the specified Arg matches the type supplied by the caller.\n    ** This will require RTTI.\n    */\n\n    ArgRef = new store.Ref(Ref.getValue(), ArgNum);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    arg_ref(Ref::in, ArgNum::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    /*\n    ** XXX Some dynamic type-checking should be done here to check that\n    ** the type of the specified Arg matches the type supplied by the caller.\n    ** This will require RTTI.\n    */\n\n    ArgRef = new store.Ref(Ref.getValue(), ArgNum);\n\").\n\n:- pragma foreign_proc(\"C\",\n    new_arg_ref(Val::di, ArgNum::in, ArgRef::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, may_not_duplicate],\n\"{\n    MR_TypeInfo         type_info;\n    MR_TypeInfo         arg_type_info;\n    MR_TypeInfo         exp_arg_type_info;\n    MR_Word             *arg_ref;\n    const MR_DuArgLocn  *arg_locn;\n\n    type_info = (MR_TypeInfo) TypeInfo_for_T;\n    exp_arg_type_info = (MR_TypeInfo) TypeInfo_for_ArgT;\n\n    MR_save_transient_registers();\n\n    if (!MR_arg(type_info, (MR_Word *) &Val, ArgNum, &arg_type_info,\n        &arg_ref, &arg_locn, MR_NONCANON_ABORT))\n    {\n        MR_fatal_error(\"\"store.new_arg_ref: argument number out of range\"\");\n    }\n\n    if (MR_compare_type_info(arg_type_info, exp_arg_type_info) !=\n        MR_COMPARE_EQUAL)\n    {\n        MR_fatal_error(\"\"store.new_arg_ref: argument has wrong type\"\");\n    }\n\n    MR_restore_transient_registers();\n\n    if (arg_locn != NULL && arg_locn->MR_arg_bits != 0) {\n        MR_offset_incr_hp_msg(ArgRef, MR_SIZE_SLOT_SIZE,\n            MR_SIZE_SLOT_SIZE + 1, MR_ALLOC_ID, \"\"store.ref/2\"\");\n        MR_define_size_slot(0, ArgRef, 1);\n        * (MR_Word *) ArgRef = MR_arg_value(arg_ref, arg_locn);\n    } else if (arg_ref == &Val) {\n        /*\n        ** For no_tag types, the argument may have the same address as the\n        ** term.  Since the term (Val) is currently on the C stack, we can't\n        ** return a pointer to it; so if that is the case, then we need\n        ** to copy it to the heap before returning.\n        */\n\n        MR_offset_incr_hp_msg(ArgRef, MR_SIZE_SLOT_SIZE,\n            MR_SIZE_SLOT_SIZE + 1, MR_ALLOC_ID, \"\"store.ref/2\"\");\n        MR_define_size_slot(0, ArgRef, 1);\n        * (MR_Word *) ArgRef = Val;\n    } else {\n        ArgRef = (MR_Word) arg_ref;\n    }\n    S = S0;\n}\").\n\n:- pragma foreign_proc(\"C#\",\n    new_arg_ref(Val::di, ArgNum::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    /*\n    ** XXX Some dynamic type-checking should be done here to check that\n    ** the type of the specified Arg matches the type supplied by the caller.\n    ** This will require RTTI.\n    */\n\n    ArgRef = new store.Ref(Val, ArgNum);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    new_arg_ref(Val::di, ArgNum::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    /*\n    ** XXX Some dynamic type-checking should be done here to check that\n    ** the type of the specified Arg matches the type supplied by the caller.\n    ** This will require RTTI.\n    */\n\n    ArgRef = new store.Ref(Val, ArgNum);\n\").\n\n:- pragma foreign_proc(\"C\",\n    set_ref(Ref::in, ValRef::in, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    * (MR_Word *) Ref = * (MR_Word *) ValRef;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C#\",\n    set_ref(Ref::in, ValRef::in, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref.setValue(ValRef.getValue());\n\").\n\n:- pragma foreign_proc(\"Java\",\n    set_ref(Ref::in, ValRef::in, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref.setValue(ValRef.getValue());\n\").\n\n:- pragma foreign_proc(\"C\",\n    set_ref_value(Ref::in, Val::di, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    * (MR_Word *) Ref = Val;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"Java\",\n    set_ref_value(Ref::in, Val::di, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref.setValue(Val);\n\").\n\n:- pragma foreign_proc(\"C\",\n    extract_ref_value(_S::di, Ref::in, Val::out),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = * (MR_Word *) Ref;\n\").\n\n:- pragma foreign_proc(\"C#\",\n    extract_ref_value(_S::di, Ref::in, Val::out),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Ref.getValue();\n\").\n\n:- pragma foreign_proc(\"Java\",\n    extract_ref_value(_S::di, Ref::in, Val::out),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Ref.getValue();\n\").\n\n%-----------------------------------------------------------------------------%\n\n:- pragma foreign_proc(\"C\",\n    unsafe_arg_ref(Ref::in, Arg::in, ArgRef::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"{\n    /* unsafe - does not check type & arity, won't handle no_tag types */\n    MR_Word *Ptr;\n\n    Ptr = (MR_Word *) MR_strip_tag((MR_Word) Ref);\n    ArgRef = (MR_Word) &Ptr[Arg];\n    S = S0;\n}\").\n\n:- pragma foreign_proc(\"C#\",\n    unsafe_arg_ref(Ref::in, Arg::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    ArgRef = new store.Ref(Ref.getValue(), Arg);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    unsafe_arg_ref(Ref::in, Arg::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    ArgRef = new store.Ref(Ref.getValue(), Arg);\n\").\n\n:- pragma foreign_proc(\"C\",\n    unsafe_new_arg_ref(Val::di, Arg::in, ArgRef::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"{\n    /* unsafe - does not check type & arity, won't handle no_tag types */\n    MR_Word *Ptr;\n\n    Ptr = (MR_Word *) MR_strip_tag((MR_Word) Val);\n    ArgRef = (MR_Word) &Ptr[Arg];\n    S = S0;\n}\").\n\n:- pragma foreign_proc(\"C#\",\n    unsafe_new_arg_ref(Val::di, Arg::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    ArgRef = new store.Ref(Val, Arg);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    unsafe_new_arg_ref(Val::di, Arg::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    ArgRef = new store.Ref(Val, Arg);\n\").\n"
  },
  {
    "path": "src/test/resources/samples/langs/Mercury/switch_detection_bug.m",
    "content": "% This is a regression test for a bug in switch detection\n% where it was preferring incomplete switches to complete\n% one-case switches, and hence inferring the wrong determinism.\n\n%------------------------------------------------------------------------------%\n\n:- module switch_detection_bug.\n\n:- interface.\n\n:- type note ---> note(rank, modifier, octave).\n\n:- type rank ---> c ; d ; e ; f ; g ; a ; b .\n\n:- type modifier ---> natural ; sharp ; flat .\n\n:- type octave == int.\n\n:- type qualifier ---> maj ; min .\n\n:- pred next_topnote(note, qualifier, note).\n:- mode next_topnote(in, in, out) is multi.\n\n%------------------------------------------------------------------------------%\n\n:- implementation.\n\nnext_topnote(note(c, _, Oct), _, note(d, natural, Oct)).\nnext_topnote(note(d, _, Oct), _, note(c, natural, Oct)).\nnext_topnote(note(d, _, Oct), maj, note(e, natural, Oct)).\nnext_topnote(note(d, _, Oct), min, note(e, flat, Oct)).\nnext_topnote(note(e, _, Oct), _, note(d, natural, Oct)).\nnext_topnote(note(e, _, Oct), _, note(f, natural, Oct)).\nnext_topnote(note(f, _, Oct), maj, note(e, natural, Oct)).\nnext_topnote(note(f, _, Oct), min, note(e, flat, Oct)).\nnext_topnote(note(g, _, Oct), _, note(f, natural, Oct)).\nnext_topnote(note(g, _, Oct), min, note(a, flat, Oct)).\nnext_topnote(note(g, _, Oct), maj, note(a, natural, Oct)).\nnext_topnote(note(a, _, Oct), _, note(g, natural, Oct)).\nnext_topnote(note(a, _, Oct), min, note(b, flat, Oct)).\nnext_topnote(note(a, _, Oct), maj, note(b, natural, Oct)).\nnext_topnote(note(b, _, Oct), maj, note(a, natural, Oct)).\nnext_topnote(note(b, _, Oct), min, note(a, flat, Oct)).\n\n%------------------------------------------------------------------------------%\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Meson/filenames/meson.build",
    "content": "project('test', ['c'],\n  version: '0.1.0'\n)\n\n# This is a comment test('foo')\n\nadd_global_arguments(['-foo'])\nadd_global_link_arguments(['-foo'])\n\ngnome = import('gnome') # As is this\n\ngnome.do_something('test')\n\nmeson.source_root()\n\nforeach foo: bar\n  foreach baz : foo\n    message(baz)\n  endforeach\nendforeach\n\nblah = '''\nafjoakjflajf  # Test\nlflkasjf\ntest\\'test\ntest\\\\\\\\test\ntest\\ntest\n'''\n\nfoo = ''\nfoo = ''''''\nfoo = 'string'\nfoo = '''string2'''\nfoo = 12314\nfoo = 1231.1231\nfoo = true\nfoo = false\nfoo = ['te\\'st', 1, 3.3, '''test''']\nfoo += 1231\nfoo = '@0@'.format('test')\nfoo = include_directories('foo', kwarg: 'bar', include_directories: 'foo')\nfoo = true ? 'true' : 'false'\nfoo = 2 - 1 + 3 % 8 / 4 * 3\n\nif true and false\nelif false or true\nelif true not false\nelif foo == 12\nelif (foo != 124) and (foo <= 200)\nelse\nendif\n"
  },
  {
    "path": "src/test/resources/samples/langs/Meson/filenames/meson_options.txt",
    "content": "option('with-something', type: 'boolean',\n  value: true,\n)"
  },
  {
    "path": "src/test/resources/samples/langs/Metal/ITMVisualisationEngine.metal",
    "content": "// Copyright 2014 Isis Innovation Limited and the authors of InfiniTAM\n\n#include <metal_stdlib>\n\n#include \"../../DeviceAgnostic/ITMSceneReconstructionEngine.h\"\n#include \"../../DeviceAgnostic/ITMVisualisationEngine.h\"\n#include \"ITMVisualisationEngine_Metal.h\"\n\nusing namespace metal;\n\nkernel void genericRaycastVH_device(DEVICEPTR(Vector4f) *pointsRay                                  [[ buffer(0) ]],\n                                    const CONSTPTR(ITMVoxel) *voxelData                             [[ buffer(1) ]],\n                                    const CONSTPTR(typename ITMVoxelIndex::IndexData) *voxelIndex   [[ buffer(2) ]],\n                                    const CONSTPTR(Vector2f) *minmaxdata                            [[ buffer(3) ]],\n                                    const CONSTPTR(CreateICPMaps_Params) *params                    [[ buffer(4) ]],\n                                    uint2 threadIdx                                                 [[ thread_position_in_threadgroup ]],\n                                    uint2 blockIdx                                                  [[ threadgroup_position_in_grid ]],\n                                    uint2 blockDim                                                  [[ threads_per_threadgroup ]])\n{\n    int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y;\n    \n    if (x >= params->imgSize.x || y >= params->imgSize.y) return;\n    \n    int locId = x + y * params->imgSize.x;\n    int locId2 = (int)floor((float)x / minmaximg_subsample) + (int)floor((float)y / minmaximg_subsample) * params->imgSize.x;\n    \n    castRay<ITMVoxel, ITMVoxelIndex>(pointsRay[locId], x, y, voxelData, voxelIndex, params->invM, params->invProjParams,\n                                     params->voxelSizes.y, params->lightSource.w, minmaxdata[locId2]);\n}\n\nkernel void genericRaycastVGMissingPoints_device(DEVICEPTR(Vector4f) *forwardProjection                         [[ buffer(0) ]],\n                                                 const CONSTPTR(int) *fwdProjMissingPoints                      [[ buffer(1) ]],\n                                                 const CONSTPTR(ITMVoxel) *voxelData                            [[ buffer(2) ]],\n                                                 const CONSTPTR(typename ITMVoxelIndex::IndexData) *voxelIndex  [[ buffer(3) ]],\n                                                 const CONSTPTR(Vector2f) *minmaxdata                           [[ buffer(4) ]],\n                                                 const CONSTPTR(CreateICPMaps_Params) *params                   [[ buffer(5) ]],\n                                                 uint2 threadIdx                                                [[ thread_position_in_threadgroup ]],\n                                                 uint2 blockIdx                                                 [[ threadgroup_position_in_grid ]],\n                                                 uint2 blockDim                                                 [[ threads_per_threadgroup ]])\n{\n    int pointId = threadIdx.x + blockIdx.x * blockDim.x;\n    \n    if (pointId >= params->imgSize.z) return;\n    \n    int locId = fwdProjMissingPoints[pointId];\n    int y = locId / params->imgSize.x, x = locId - y * params->imgSize.x;\n    int locId2 = (int)floor((float)x / minmaximg_subsample) + (int)floor((float)y / minmaximg_subsample) * params->imgSize.x;\n    \n    castRay<ITMVoxel, ITMVoxelIndex>(forwardProjection[locId], x, y, voxelData, voxelIndex, params->invM, params->invProjParams,\n                                     params->voxelSizes.y, params->lightSource.w, minmaxdata[locId2]);\n}\n\nkernel void renderICP_device(const CONSTPTR(Vector4f) *pointsRay            [[ buffer(0) ]],\n                             DEVICEPTR(Vector4f) *pointsMap                 [[ buffer(1) ]],\n                             DEVICEPTR(Vector4f) *normalsMap                [[ buffer(2) ]],\n                             DEVICEPTR(Vector4u) *outRendering              [[ buffer(3) ]],\n                             const CONSTPTR(CreateICPMaps_Params) *params   [[ buffer(4) ]],\n                             uint2 threadIdx                                [[ thread_position_in_threadgroup ]],\n                             uint2 blockIdx                                 [[ threadgroup_position_in_grid ]],\n                             uint2 blockDim                                 [[ threads_per_threadgroup ]])\n{\n    int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y;\n    \n    if (x >= params->imgSize.x || y >= params->imgSize.y) return;\n    \n    processPixelICP<false>(outRendering, pointsMap, normalsMap, pointsRay, params->imgSize.xy, x, y, params->voxelSizes.x, TO_VECTOR3(params->lightSource));\n}\n\nkernel void renderForward_device(DEVICEPTR(Vector4u) *outRendering              [[ buffer(0) ]],\n                                 const CONSTPTR(Vector4f) *pointsRay            [[ buffer(1) ]],\n                                 const CONSTPTR(CreateICPMaps_Params) *params   [[ buffer(2) ]],\n                                 uint2 threadIdx                                [[ thread_position_in_threadgroup ]],\n                                 uint2 blockIdx                                 [[ threadgroup_position_in_grid ]],\n                                 uint2 blockDim                                 [[ threads_per_threadgroup ]])\n{\n    int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y;\n    \n    if (x >= params->imgSize.x || y >= params->imgSize.y) return;\n    \n    processPixelForwardRender<false>(outRendering, pointsRay, params->imgSize.xy, x, y, params->voxelSizes.x, TO_VECTOR3(params->lightSource));\n}\n\nkernel void forwardProject_device(DEVICEPTR(Vector4f) *forwardProjection         [[ buffer(0) ]],\n                                  const CONSTPTR(Vector4f) *pointsRay            [[ buffer(1) ]],\n                                  const CONSTPTR(CreateICPMaps_Params) *params   [[ buffer(2) ]],\n                                  uint2 threadIdx                                [[ thread_position_in_threadgroup ]],\n                                  uint2 blockIdx                                 [[ threadgroup_position_in_grid ]],\n                                  uint2 blockDim                                 [[ threads_per_threadgroup ]])\n{\n    int x = (threadIdx.x + blockIdx.x * blockDim.x), y = (threadIdx.y + blockIdx.y * blockDim.y);\n    \n    if (x >= params->imgSize.x || y >= params->imgSize.y) return;\n    \n    int locId = x + y * params->imgSize.x;\n    Vector4f pixel = pointsRay[locId];\n    \n    int locId_new = forwardProjectPixel(pixel * params->voxelSizes.x, params->M, params->projParams, params->imgSize.xy);\n    if (locId_new >= 0) forwardProjection[locId_new] = pixel;\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/NestedPackages.mo",
    "content": "within ModelicaByExample.PackageExamples;\npackage NestedPackages\n  \"An example of how packages can be used to organize things\"\n  package Types\n    type Rabbits = Real(quantity=\"Rabbits\", min=0);\n    type Wolves = Real(quantity=\"Wolves\", min=0);\n    type RabbitReproduction = Real(quantity=\"Rabbit Reproduction\", min=0);\n    type RabbitFatalities = Real(quantity=\"Rabbit Fatalities\", min=0);\n    type WolfReproduction = Real(quantity=\"Wolf Reproduction\", min=0);\n    type WolfFatalities = Real(quantity=\"Wolf Fatalities\", min=0);\n  end Types;\n\n  model LotkaVolterra \"Lotka-Volterra with types\"\n    parameter Types.RabbitReproduction alpha=0.1;\n    parameter Types.RabbitFatalities beta=0.02;\n    parameter Types.WolfReproduction gamma=0.4;\n    parameter Types.WolfFatalities delta=0.02;\n    parameter Types.Rabbits x0=10;\n    parameter Types.Wolves y0=10;\n    Types.Rabbits x(start=x0);\n    Types.Wolves y(start=y0);\n  equation\n    der(x) = x*(alpha-beta*y);\n    der(y) = -y*(gamma-delta*x);\n  end LotkaVolterra;\nend NestedPackages;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/NewtonCooling.mo",
    "content": "within ModelicaByExample.PackageExamples;\nmodel NewtonCooling\n  \"Cooling example importing physical types from the Modelica Standard Library\"\n  import Modelica.SIunits.Temperature;\n  import Modelica.SIunits.Mass;\n  import Modelica.SIunits.Area;\n  import ConvectionCoefficient = Modelica.SIunits.CoefficientOfHeatTransfer;\n  import SpecificHeat = Modelica.SIunits.SpecificHeatCapacity;\n\n  // Parameters\n  parameter Temperature T_inf=300.0 \"Ambient temperature\";\n  parameter Temperature T0=280.0 \"Initial temperature\";\n  parameter ConvectionCoefficient h=0.7 \"Convective cooling coefficient\";\n  parameter Area A=1.0 \"Surface area\";\n  parameter Mass m=0.1 \"Mass of thermal capacitance\";\n  parameter SpecificHeat c_p=1.2 \"Specific heat\";\n\n  // Variables\n  Temperature T \"Temperature\";\ninitial equation\n  T = T0 \"Specify initial value for T\";\nequation\n  m*c_p*der(T) = h*A*(T_inf-T) \"Newton's law of cooling\";\nend NewtonCooling;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/Pendulum.mo",
    "content": "within ModelicaByExample.Subsystems.Pendula;\nmodel Pendulum \"A single individual pendulum\"\n  import Modelica.Mechanics.MultiBody.Parts;\n  import Modelica.Mechanics.MultiBody.Joints;\n\n  parameter Modelica.SIunits.Position x;\n  parameter Modelica.SIunits.Mass m \"Mass of mass point\";\n  parameter Modelica.SIunits.Angle phi \"Initial angle\";\n  parameter Modelica.SIunits.Length L \"String length\";\n  parameter Modelica.SIunits.Diameter d=0.01;\n\n  Parts.Fixed ground(r={0,0,x}, animation=false)\n    annotation (Placement(\n        transformation(\n        extent={{-10,-10},{10,10}},\n        rotation=270, origin={0,60})));\n  Parts.PointMass ball(m=m, sphereDiameter=5*d)\n    annotation (Placement(transformation(extent={{-10,-90},{10,-70}})));\n  Parts.BodyCylinder string(density=0, r={0,L,0}, diameter=d)\n    annotation (Placement(transformation(\n        extent={{-10,-10},{10,10}},\n        rotation=90,\n        origin={0,-30})));\n  Joints.Revolute revolute(phi(fixed=true, start=phi),\n    cylinderDiameter=d/2, animation=false)\n    annotation (Placement(\n        transformation(\n        extent={{-10,-10},{10,10}},\n        rotation=90,\n        origin={0,20})));\nequation\n  connect(string.frame_a, ball.frame_a) annotation (Line(\n      points={{0,-40},{0,-40},{0,-80}},\n      color={95,95,95},\n      thickness=0.5,\n      smooth=Smooth.None));\n  connect(revolute.frame_b, ground.frame_b) annotation (Line(\n      points={{0,30},{0,40},{0,40},{0,50}},\n      color={95,95,95},\n      thickness=0.5,\n      smooth=Smooth.None));\n  connect(revolute.frame_a, string.frame_b) annotation (Line(\n      points={{0,10},{0,10},{0,-20},{0,-20}},\n      color={95,95,95},\n      thickness=0.5,\n      smooth=Smooth.None));\nend Pendulum;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/RLC.mo",
    "content": "within ModelicaByExample.PackageExamples;\nmodel RLC \"An RLC circuit referencing types from the Modelica Standard Library\"\n  parameter Modelica.SIunits.Voltage Vb=24 \"Battery voltage\";\n  parameter Modelica.SIunits.Inductance L = 1;\n  parameter Modelica.SIunits.Resistance R = 100;\n  parameter Modelica.SIunits.Capacitance C = 1e-3;\n  Modelica.SIunits.Voltage V;\n  Modelica.SIunits.Current i_L;\n  Modelica.SIunits.Current i_R;\n  Modelica.SIunits.Current i_C;\nequation\n  i_R = V/R;\n  i_C = C*der(V);\n  i_L=i_R+i_C;\n  L*der(i_L) = (Vb-V);\nend RLC;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/SecondOrderSystem.mo",
    "content": "within ModelicaByExample.PackageExamples;\nmodel SecondOrderSystem\n  \"A second order rotational system importing types from Modelica Standard Library\"\n  import Modelica.SIunits.*;\n  parameter Angle phi1_init = 0;\n  parameter Angle phi2_init = 1;\n  parameter AngularVelocity omega1_init = 0;\n  parameter AngularVelocity omega2_init = 0;\n  parameter Inertia J1=0.4;\n  parameter Inertia J2=1.0;\n  parameter RotationalSpringConstant k1=11;\n  parameter RotationalSpringConstant k2=5;\n  parameter RotationalDampingConstant d1=0.2;\n  parameter RotationalDampingConstant d2=1.0;\n  Angle phi1;\n  Angle phi2;\n  AngularVelocity omega1;\n  AngularVelocity omega2;\ninitial equation\n  phi1 = phi1_init;\n  phi2 = phi2_init;\n  omega1 = omega1_init;\n  omega2 = omega2_init;\nequation\n  omega1 = der(phi1);\n  omega2 = der(phi2);\n  J1*der(omega1) = k1*(phi2-phi1)+d1*der(phi2-phi1);\n  J2*der(omega2) = k1*(phi1-phi2)+d1*der(phi1-phi2)-k2*phi2-d2*der(phi2);\nend SecondOrderSystem;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/System.mo",
    "content": "within ModelicaByExample.Subsystems.Pendula;\nmodel System \"A system of pendula\"\n  import Modelica.Constants.g_n;\n  import Modelica.Constants.pi;\n\n  parameter Integer n=15 \"Number of pendula\";\n  parameter Modelica.SIunits.Position x[n] = linspace(0,(n-1)*0.05,n);\n  parameter Modelica.SIunits.Time T = 54;\n  parameter Modelica.SIunits.Time X = 30;\n  parameter Modelica.SIunits.Length lengths[n] = { g_n*(T/(2*pi*(X+(n-i))))^2 for i in 1:n};\n  parameter Modelica.SIunits.Angle phi0 = 0.5;\n\n  Pendulum pendulum[n](x=x, each m=1, each phi=phi0, L=lengths)\n    annotation (Placement(transformation(extent={{-10,-10},{10,10}})));\n  inner Modelica.Mechanics.MultiBody.World world\n    annotation (Placement(transformation(extent={{-80,-60},{-60,-40}})));\n  annotation (experiment(StopTime=54,\n      Interval=9e-3, Tolerance=1e-008));\nend System;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/Translational.mo",
    "content": "within Modelica.Mechanics;\npackage Translational\n  \"Library to model 1-dimensional, translational mechanical systems\"\n  extends Modelica.Icons.Package;\n  import SI = Modelica.SIunits;\n\n  package Examples \"Demonstration examples of the components of this package\"\n\n    extends Modelica.Icons.ExamplesPackage;\n\n    model SignConvention \"Examples for the used sign conventions.\"\n      extends Modelica.Icons.Example;\n      Translational.Components.Mass mass1(L=1,\n        s(fixed=true),\n        v(fixed=true),\n        m=1)                                      annotation (Placement(\n            transformation(extent={{40,60},{60,80}}, rotation=0)));\n      Translational.Sources.Force force1\n                                 annotation (Placement(transformation(extent={{\n                -4,60},{16,80}}, rotation=0)));\n      Modelica.Blocks.Sources.Constant constant1(k=1)\n                                 annotation (Placement(transformation(extent={{\n                -44,60},{-24,80}}, rotation=0)));\n      Translational.Components.Mass mass2(L=1,\n        s(fixed=true),\n        v(fixed=true),\n        m=1)                                      annotation (Placement(\n            transformation(extent={{40,0},{60,20}}, rotation=0)));\n      Translational.Sources.Force force2\n                                 annotation (Placement(transformation(extent={{\n                -4,20},{16,40}}, rotation=0)));\n      Modelica.Blocks.Sources.Constant constant2(k=1)\n                                 annotation (Placement(transformation(extent={{\n                -44,20},{-24,40}}, rotation=0)));\n      Translational.Components.Mass mass3(L=1,\n        s(fixed=true),\n        v(fixed=true),\n        m=1)                                      annotation (Placement(\n            transformation(extent={{-40,-40},{-20,-20}}, rotation=0)));\n      Translational.Sources.Force force3(useSupport=true)\n                                 annotation (Placement(transformation(extent={{\n                20,-40},{0,-20}}, rotation=0)));\n      Modelica.Blocks.Sources.Constant constant3(k=1)\n                                 annotation (Placement(transformation(extent={{\n                60,-40},{40,-20}}, rotation=0)));\n      Translational.Components.Fixed fixed\n                  annotation (Placement(transformation(extent={{0,-60},{20,-40}})));\n    equation\n      connect(constant1.y,force1. f) annotation (Line(points={{-23,70},{-6,70}},\n            color={0,0,127}));\n      connect(constant2.y,force2. f) annotation (Line(points={{-23,30},{-6,30}},\n            color={0,0,127}));\n      connect(constant3.y,force3. f) annotation (Line(points={{39,-30},{22,-30}},\n            color={0,0,127}));\n      connect(force1.flange, mass1.flange_a)    annotation (Line(\n          points={{16,70},{40,70}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(force2.flange, mass2.flange_b)    annotation (Line(\n          points={{16,30},{70,30},{70,10},{60,10}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass3.flange_b, force3.flange)    annotation (Line(\n          points={{-20,-30},{0,-30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(fixed.flange, force3.support) annotation (Line(\n          points={{10,-50},{10,-40}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (Documentation(info=\"<html>\n<p>\nIf all arrows point in the same direction a positive force\nresults in a positive acceleration a, velocity v and position s.\n</p>\n<p>\nFor a force of 1 N and a mass of 1 Kg this leads to\n</p>\n<pre>\n        a = 1 m/s2\n        v = 1 m/s after 1 s (SlidingMass1.v)\n        s = 0.5 m after 1 s (SlidingMass1.s)\n</pre>\n<p>\nThe acceleration is not available for plotting.\n</p>\n<p>\nSystem 1) and 2) are equivalent. It doesn't matter whether the\nforce pushes at flange_a in system 1 or pulls at flange_b in system 2.\n</p><p>\nIt is of course possible to ignore the arrows and connect the models\nin an arbitrary way. But then it is hard see in what direction the\nforce acts.\n</p><p>\nIn the third system the two arrows are opposed which means that the\nforce acts in the opposite direction (in the same direction as in\nthe two other examples).\n</p>\n</html>\"), Diagram(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},{\n                100,100}}), graphics={\n            Text(\n              extent={{-100,80},{-82,60}},\n              textString=\"1)\",\n              lineColor={0,0,255}),\n            Text(\n              extent={{-100,40},{-82,20}},\n              textString=\"2)\",\n              lineColor={0,0,255}),\n            Text(\n              extent={{-100,-20},{-82,-40}},\n              textString=\"3)\",\n              lineColor={0,0,255})}),\n        experiment(StopTime=1.0, Interval=0.001));\n    end SignConvention;\n\n    model InitialConditions \"Setting of initial conditions\"\n\n      extends Modelica.Icons.Example;\n\n      Translational.Components.Fixed fixed2(        s0=1)\n                                       annotation (Placement(transformation(\n              extent={{-100,60},{-80,80}}, rotation=0)));\n      Translational.Components.Spring s2(        s_rel0=2, c=1e3)\n                                               annotation (Placement(\n            transformation(extent={{-60,60},{-40,80}}, rotation=0)));\n      Translational.Components.Mass m3(           L=3, s(start=4.5, fixed=true),\n        v(fixed=true),\n        m=1)                                          annotation (Placement(\n            transformation(extent={{-20,60},{0,80}}, rotation=0)));\n      Translational.Components.SpringDamper sd2(        s_rel0=4, c=111,\n        d=1)                                          annotation (Placement(\n            transformation(extent={{20,60},{40,80}}, rotation=0)));\n      Translational.Components.Mass m4(           L=5, s(start=12.5, fixed=true),\n        v(fixed=true),\n        m=1)                                           annotation (Placement(\n            transformation(extent={{60,60},{80,80}}, rotation=0)));\n\n      Translational.Components.Fixed fixed1(        s0=-1)\n                                        annotation (Placement(transformation(\n              extent={{-100,-20},{-80,0}}, rotation=0)));\n      Translational.Components.Spring s1(\n        s_rel0=1,\n        c=1e3,\n        s_rel(start=1, fixed=true))\n                        annotation (Placement(transformation(extent={{-58,-20},\n                {-38,0}}, rotation=0)));\n      Translational.Components.Mass m1(           L=1, v(fixed=true),\n        m=1)                            annotation (Placement(transformation(\n              extent={{-20,-20},{0,0}}, rotation=0)));\n      Translational.Components.SpringDamper sd1(\n        s_rel0=1,\n        c=111,\n        s_rel(start=1, fixed=true),\n        v_rel(fixed=true),\n        d=1)            annotation (Placement(transformation(extent={{20,-20},{\n                40,0}}, rotation=0)));\n      Translational.Components.Mass m2(           L=2, m=1)\n                                        annotation (Placement(transformation(\n              extent={{60,-20},{80,0}}, rotation=0)));\n    equation\n      connect(s2.flange_a, fixed2.flange) annotation (Line(\n          points={{-60,70},{-90,70}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(s1.flange_a, fixed1.flange) annotation (Line(\n          points={{-58,-10},{-90,-10}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(m1.flange_a, s1.flange_b) annotation (Line(\n          points={{-20,-10},{-38,-10}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(sd1.flange_a, m1.flange_b) annotation (Line(\n          points={{20,-10},{0,-10}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(m2.flange_a, sd1.flange_b) annotation (Line(\n          points={{60,-10},{40,-10}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(m4.flange_a, sd2.flange_b) annotation (Line(\n          points={{60,70},{40,70}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(sd2.flange_a, m3.flange_b) annotation (Line(\n          points={{20,70},{0,70}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(m3.flange_a, s2.flange_b) annotation (Line(\n          points={{-20,70},{-40,70}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThere are several ways to set initial conditions.\nIn the first system the position of the mass m3 was defined\nby using the modifier s(start=4.5), the position of m4 by s(start=12.5).\nThese positions were chosen such that the system is a rest. To calculate\nthese values start at the left (Fixed1) with a value of 1 m. The spring\nhas an unstretched length of 2 m and m3 an length of 3 m, which leads to\n</p>\n\n<pre>\n        1   m (fixed1)\n      + 2   m (spring s2)\n      + 3/2 m (half of the length of mass m3)\n      -------\n        4,5 m = s(start = 4.5) for m3\n      + 3/2 m (half of the length of mass m3)\n      + 4   m (springDamper 2)\n      + 5/2 m (half of length of mass m4)\n      -------\n       12,5 m = s(start = 12.5) for m4\n</pre>\n\n<p>\nThis selection of initial conditions has the effect that Dymola selects\nthose variables (m3.s and m4.s) as state variables.\nIn the second example the length of the springs are given as start values\nbut they cannot be used as state for pure springs (only for the spring/damper\ncombination). In this case the system is not at rest.\n</p>\n\n<p>\n<IMG src=\\\"modelica://Modelica/Resources/Images/Mechanics/Translational/InitialConditions.png\\\">\n</p>\n\n</html>\"),\n        experiment(StopTime=5.0, Interval=0.001));\n    end InitialConditions;\n\n    model WhyArrows \"Use of arrows in Mechanics.Translational\"\n\n      extends Modelica.Icons.Example;\n\n      Translational.Components.Fixed fixed\n                                 annotation (Placement(transformation(extent={{\n                -20,20},{0,40}}, rotation=0)));\n      Translational.Components.Rod rod1(        L=1)\n                                  annotation (Placement(transformation(extent={\n                {-48,20},{-28,40}}, rotation=0)));\n      Translational.Components.Rod rod2(        L=1)\n                                  annotation (Placement(transformation(extent={\n                {20,20},{40,40}}, rotation=0)));\n      Translational.Components.Rod rod3(        L=1)\n                                  annotation (Placement(transformation(extent={\n                {-30,58},{-50,78}}, rotation=0)));\n      Translational.Sensors.PositionSensor positionSensor2 annotation (Placement(\n            transformation(extent={{60,20},{80,40}}, rotation=0)));\n      Translational.Sensors.PositionSensor positionSensor1 annotation (Placement(\n            transformation(extent={{-60,20},{-80,40}}, rotation=0)));\n      Translational.Sensors.PositionSensor positionSensor3 annotation (Placement(\n            transformation(extent={{-60,58},{-80,78}}, rotation=0)));\n      Translational.Components.Fixed fixed1(        s0=-1.9)\n                                          annotation (Placement(transformation(\n              extent={{-100,-60},{-80,-40}}, rotation=0)));\n      Translational.Components.Spring spring1(        s_rel0=2, c=11)\n                                                   annotation (Placement(\n            transformation(extent={{-80,-60},{-60,-40}}, rotation=0)));\n      Translational.Components.Mass mass1(\n        L=2,\n        s(fixed=true),\n        v(fixed=true),\n        m=1)                                      annotation (Placement(\n            transformation(extent={{-50,-60},{-30,-40}}, rotation=0)));\n      Translational.Components.Fixed fixed2(        s0=-1.9)\n                                          annotation (Placement(transformation(\n              extent={{0,-60},{20,-40}}, rotation=0)));\n      Translational.Components.Spring spring2(        s_rel0=2, c=11)\n                                                   annotation (Placement(\n            transformation(extent={{30,-60},{50,-40}}, rotation=0)));\n      Translational.Components.Mass inertia2(           L=2,\n        m=1,\n        s(fixed=true),\n        v(fixed=true))                            annotation (Placement(\n            transformation(extent={{80,-60},{60,-40}}, rotation=0)));\n    equation\n      connect(spring1.flange_b, mass1.flange_b)        annotation (Line(points={{-60,-50},\n              {-60,-72},{-30,-72},{-30,-50}},            color={0,191,0}));\n      connect(spring2.flange_b, inertia2.flange_b)     annotation (Line(points={{50,-50},\n              {60,-50}},           color={0,191,0}));\n      connect(rod3.flange_b,positionSensor3. flange) annotation (Line(\n          points={{-50,68},{-60,68}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(rod1.flange_a,positionSensor1. flange) annotation (Line(\n          points={{-48,30},{-60,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(rod1.flange_b, fixed.flange)  annotation (Line(\n          points={{-28,30},{-10,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(rod3.flange_a, fixed.flange)  annotation (Line(\n          points={{-30,68},{-10,68},{-10,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(fixed.flange, rod2.flange_a)  annotation (Line(\n          points={{-10,30},{20,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(rod2.flange_b,positionSensor2. flange) annotation (Line(\n          points={{40,30},{60,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(fixed1.flange,spring1. flange_a) annotation (Line(\n          points={{-90,-50},{-80,-50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(fixed2.flange,spring2. flange_a) annotation (Line(\n          points={{10,-50},{30,-50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (\n        Documentation(info=\"<html>\n<p>\nWhen using the models of the translational sublibrary\nit is recommended to make sure that all arrows point in\nthe same direction because then all component have the\nsame reference system.\nIn the example the distance from flange_a of Rod1 to flange_b\nof Rod2 is 2 m. The distance from flange_a of Rod1 to flange_b\nof Rod3 is also 2 m though it is difficult to see that. Without\nthe arrows it would be almost impossible to notice.\nThat all arrows point in the same direction is a sufficient\ncondition for an easy use of the library. There are cases\nwhere horizontally flipped models can be used without\nproblems.\n</p>\n</html>\"),     Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-84,10},{88,2}},\n              lineColor={0,0,255},\n              textString=\"positionSensor2.s = positionSensor3.s\"),\n            Text(\n              extent={{-78,-4},{86,-12}},\n              lineColor={0,0,255},\n              textString=\"positionSensor3.s <>positionSensor1.s\"),\n            Text(\n              extent={{-82,-80},{92,-88}},\n              textString=\"Both systems are equivalent\",\n              lineColor={0,0,255}),\n            Line(\n              points={{-90,-28},{90,-28}},\n              thickness=0.5,\n              color={0,0,255})}),\n        experiment(StopTime=1.0, Interval=0.001));\n    end WhyArrows;\n\n    model Accelerate \"Use of model accelerate.\"\n\n      extends Modelica.Icons.Example;\n      Translational.Sources.Accelerate accelerate\n                                           annotation (Placement(transformation(\n              extent={{-40,20},{-20,40}}, rotation=0)));\n      Translational.Components.Mass mass(L=1, m=1)\n                                                  annotation (Placement(\n            transformation(extent={{0,20},{20,40}},  rotation=0)));\n      Modelica.Blocks.Sources.Constant constantAcc(k=1)\n                                                 annotation (Placement(transformation(extent={{-80,20},\n                {-60,40}},          rotation=0)));\n    equation\n      connect(accelerate.flange, mass.flange_a)    annotation (Line(\n          points={{-20,30},{0,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(constantAcc.y, accelerate.a_ref) annotation (Line(\n          points={{-59,30},{-42,30}},\n          color={0,0,127},\n          smooth=Smooth.None));\n      annotation (Documentation(info=\"<html>\n<p>\nDemonstrate usage of component Sources.Accelerate by moving a massing\nwith a predefined acceleration.\n</p>\n</html>\"),        experiment(StopTime=1.0, Interval=0.001));\n    end Accelerate;\n\n    model Damper \"Use of damper models.\"\n\n      extends Modelica.Icons.Example;\n\n      Translational.Components.Mass mass1(\n        L=1,\n        s(start=3, fixed=true),\n        v(start=10, fixed=true),\n        m=1)        annotation (Placement(transformation(extent={{-80,60},{-60,\n                80}}, rotation=0)));\n      Translational.Components.Damper damper1(        d=25)\n                                         annotation (Placement(transformation(\n              extent={{-20,60},{0,80}}, rotation=0)));\n      Translational.Components.Fixed fixed1(        s0=4.5)\n                                         annotation (Placement(transformation(\n              extent={{22,60},{42,80}}, rotation=0)));\n      Translational.Components.Mass mass2(\n        L=1,\n        s(start=3, fixed=true),\n        v(start=10, fixed=true),\n        m=1)        annotation (Placement(transformation(extent={{-80,0},{-60,\n                20}}, rotation=0)));\n      Translational.Components.Damper damper2(        d=25)\n                                         annotation (Placement(transformation(\n              extent={{-20,0},{0,20}}, rotation=0)));\n      Translational.Components.Fixed fixed2(        s0=4.5)\n                                         annotation (Placement(transformation(\n              extent={{20,0},{40,20}}, rotation=0)));\n      Translational.Components.Mass mass3(\n        L=1,\n        s(start=3, fixed=true),\n        v(start=10, fixed=true),\n        m=1)        annotation (Placement(transformation(extent={{-80,-60},{-60,\n                -40}}, rotation=0)));\n      Translational.Components.Fixed fixed3(        s0=4.5)\n                                         annotation (Placement(transformation(\n              extent={{20,-60},{40,-40}}, rotation=0)));\n      Translational.Components.Spring spring2(        s_rel0=1, c=1)\n                                             annotation (Placement(\n            transformation(extent={{-20,-20},{0,0}}, rotation=0)));\n      Translational.Components.SpringDamper springDamper3(        s_rel0=1, d=25,\n        c=1)                                                   annotation (Placement(\n            transformation(extent={{-20,-60},{0,-40}}, rotation=0)));\n    equation\n      connect(mass1.flange_b, damper1.flange_a)        annotation (Line(points=\n              {{-60,70},{-20,70}}, color={0,191,0}));\n      connect(mass2.flange_b, damper2.flange_a)        annotation (Line(points={{-60,10},\n              {-20,10}},           color={0,191,0}));\n      connect(damper2.flange_b,spring2. flange_b) annotation (Line(points={{0,\n              10},{0,-10}}, color={0,191,0}));\n      connect(damper2.flange_a,spring2. flange_a) annotation (Line(points={{-20,\n              10},{-20,-10}}, color={0,191,0}));\n      connect(mass3.flange_b, springDamper3.flange_a)        annotation (Line(\n            points={{-60,-50},{-20,-50}}, color={0,191,0}));\n      connect(damper1.flange_b, fixed1.flange) annotation (Line(\n          points={{0,70},{32,70}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(damper2.flange_b, fixed2.flange) annotation (Line(\n          points={{0,10},{30,10}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(springDamper3.flange_b, fixed3.flange) annotation (Line(\n          points={{0,-50},{30,-50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (Documentation(info=\"<html>\n<p>\nDemonstrate usage of damper components in different variants.\n</p>\n</html>\"),\n        experiment(StopTime=1.0, Interval=0.001));\n    end Damper;\n\n    model Oscillator \"Oscillator demonstrates the use of initial conditions.\"\n\n      extends Modelica.Icons.Example;\n\n      Translational.Components.Mass mass1(\n        L=1,\n        s(start=-0.5, fixed=true),\n        v(start=0, fixed=true),\n        m=1)          annotation (Placement(transformation(extent={{-20,40},{0,\n                60}}, rotation=0)));\n      Translational.Components.Spring spring1(        s_rel0=1, c=10000)\n                                                      annotation (Placement(\n            transformation(extent={{20,40},{40,60}}, rotation=0)));\n      Translational.Components.Fixed fixed1(        s0=1)\n                                         annotation (Placement(transformation(\n              extent={{60,40},{80,60}}, rotation=0)));\n      Translational.Sources.Force force1\n                                 annotation (Placement(transformation(extent={{\n                -60,40},{-40,60}}, rotation=0)));\n      Modelica.Blocks.Sources.Sine sine1(freqHz=15.9155) annotation (Placement(transformation(\n              extent={{-100,40},{-80,60}}, rotation=0)));\n      Translational.Components.Mass mass2(\n        L=1,\n        s(start=-0.5, fixed=true),\n        v(start=0, fixed=true),\n        m=1)          annotation (Placement(transformation(extent={{-20,-60},{0,\n                -40}}, rotation=0)));\n      Translational.Components.Spring spring2(        s_rel0=1, c=10000)\n                                                      annotation (Placement(\n            transformation(extent={{20,-60},{40,-40}}, rotation=0)));\n      Translational.Components.Fixed fixed2(        s0=1)\n                                         annotation (Placement(transformation(\n              extent={{60,-60},{80,-40}}, rotation=0)));\n      Translational.Sources.Force force2\n                                 annotation (Placement(transformation(extent={{\n                -60,-60},{-40,-40}}, rotation=0)));\n      Modelica.Blocks.Sources.Sine sine2(freqHz=15.9155) annotation (Placement(transformation(\n              extent={{-100,-60},{-80,-40}}, rotation=0)));\n      Translational.Components.Damper damper1(        d=10)\n                                         annotation (Placement(transformation(\n              extent={{20,-36},{40,-16}}, rotation=0)));\n    equation\n      connect(mass1.flange_b, spring1.flange_a)        annotation (Line(points=\n              {{0,50},{20,50}}, color={0,191,0}));\n      connect(spring2.flange_a,damper1. flange_a) annotation (Line(points={{20,\n              -50},{20,-26}}, color={0,191,0}));\n      connect(mass2.flange_b, spring2.flange_a)        annotation (Line(points=\n              {{0,-50},{20,-50}}, color={0,191,0}));\n      connect(damper1.flange_b,spring2. flange_b) annotation (Line(points={{40,\n              -26},{40,-50}}, color={0,191,0}));\n      connect(sine1.y,force1. f) annotation (Line(points={{-79,50},{-62,50}},\n            color={0,0,127}));\n      connect(sine2.y,force2. f) annotation (Line(points={{-79,-50},{-62,-50}},\n            color={0,0,127}));\n      connect(spring1.flange_b, fixed1.flange) annotation (Line(\n          points={{40,50},{70,50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(force2.flange, mass2.flange_a)    annotation (Line(\n          points={{-40,-50},{-20,-50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(force1.flange, mass1.flange_a)    annotation (Line(\n          points={{-40,50},{-20,50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(spring2.flange_b, fixed2.flange) annotation (Line(\n          points={{40,-50},{70,-50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (\n        Documentation(info=\"<html>\n<p>\nA spring - mass system is a mechanical oscillator. If no\ndamping is included and the system is excited at resonance\nfrequency infinite amplitudes will result.\nThe resonant frequency is given by\nomega_res = sqrt(c / m)\nwith:\n</p>\n\n<pre>\n      c spring stiffness\n      m mass\n</pre>\n\n<p>\nTo make sure that the system is initially at rest the initial\nconditions s(start=0) and v(start=0) for the SlidingMass\nare set.\nIf damping is added the amplitudes are bounded.\n</p>\n</html>\"),\n        experiment(StopTime=1.0, Interval=0.001));\n    end Oscillator;\n\n    model Sensors \"Sensors for translational systems.\"\n      import Modelica;\n\n      extends Modelica.Icons.Example;\n\n      Translational.Sensors.ForceSensor forceSensor  annotation (Placement(\n            transformation(extent={{-34,40},{-14,60}},\n                                                     rotation=0)));\n      Translational.Sensors.SpeedSensor speedSensor1 annotation (Placement(\n            transformation(extent={{40,-40},{60,-20}}, rotation=0)));\n      Translational.Sensors.PositionSensor positionSensor1 annotation (Placement(\n            transformation(extent={{40,0},{60,20}}, rotation=0)));\n      Translational.Sensors.AccSensor accSensor1 annotation (Placement(\n            transformation(extent={{40,-80},{60,-60}}, rotation=0)));\n      Translational.Components.Mass mass(L=1,\n        s(fixed=true),\n        v(fixed=true),\n        m=1)                                      annotation (Placement(\n            transformation(extent={{20,40},{40,60}}, rotation=0)));\n      Translational.Sources.Force force\n                                 annotation (Placement(transformation(extent={{-64,40},\n                {-44,60}},         rotation=0)));\n      Modelica.Blocks.Sources.Sine sineForce(amplitude=10, freqHz=4)\n                                                                 annotation (Placement(\n            transformation(extent={{-100,40},{-80,60}}, rotation=0)));\n      Translational.Sensors.PositionSensor positionSensor2 annotation (Placement(\n            transformation(extent={{60,40},{80,60}}, rotation=0)));\n      Modelica.Mechanics.Translational.Sensors.MultiSensor multiSensor\n        annotation (Placement(transformation(extent={{-8,40},{12,60}})));\n    equation\n      connect(sineForce.y, force.f)\n                                 annotation (Line(points={{-79,50},{-66,50}},\n            color={0,0,127}));\n      connect(forceSensor.flange_a, force.flange)   annotation (Line(\n          points={{-34,50},{-44,50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass.flange_a, positionSensor1.flange)         annotation (Line(\n          points={{20,50},{20,10},{40,10}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass.flange_a, speedSensor1.flange)         annotation (Line(\n          points={{20,50},{20,-30},{40,-30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass.flange_a, accSensor1.flange)         annotation (Line(\n          points={{20,50},{20,-70},{40,-70}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass.flange_b, positionSensor2.flange)         annotation (Line(\n          points={{40,50},{60,50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(forceSensor.flange_b, multiSensor.flange_a) annotation (Line(\n          points={{-14,50},{-8,50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(multiSensor.flange_b, mass.flange_a) annotation (Line(\n          points={{12,50},{20,50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThese sensors measure\n</p>\n\n<pre>\n   force f in N\n   position s in m\n   velocity v in m/s\n   acceleration a in m/s2\n</pre>\n\n<p>\nThe measured velocity and acceleration is independent on\nthe flange the sensor is connected to. The position\ndepends on the flange (flange_a or flange_b) and the\nlength L of the component.\nPlot PositionSensor1.s, PositionSensor2.s and SlidingMass1.s\nto see the difference.\n</p>\n</html>\"),\n        experiment(StopTime=1.0, Interval=0.001));\n    end Sensors;\n\n    model Friction \"Use of model Stop\"\n      extends Modelica.Icons.Example;\n      Modelica.Mechanics.Translational.Components.MassWithStopAndFriction stop1(\n                                               L=1,\n        s(fixed=true),\n        v(fixed=true),\n        smax=25,\n        smin=-25,\n        m=1,\n        F_prop=1,\n        F_Coulomb=5,\n        F_Stribeck=10,\n        fexp=2)                     annotation (Placement(transformation(extent={{20,60},\n                {40,80}},         rotation=0)));\n      Translational.Sources.Force force\n                                 annotation (Placement(transformation(extent={{-20,60},\n                {0,80}},         rotation=0)));\n      Modelica.Blocks.Sources.Sine sineForce(amplitude=25, freqHz=0.25)\n                                                                    annotation (Placement(\n            transformation(extent={{-60,60},{-40,80}},\n                                                     rotation=0)));\n      Modelica.Mechanics.Translational.Components.MassWithStopAndFriction stop2(\n        L=1,\n        smax=0.9,\n        smin=-0.9,\n        F_Coulomb=3,\n        F_Stribeck=5,\n        s(start=0, fixed=true),\n        m=1,\n        F_prop=1,\n        fexp=2,\n        v(start=-5, fixed=true))\n                     annotation (Placement(transformation(extent={{42,-60},{62,\n                -40}},\n              rotation=0)));\n      Translational.Components.Spring spring(s_rel0=1, c=500)\n                                                    annotation (Placement(\n            transformation(extent={{2,-60},{22,-40}},\n                                                    rotation=0)));\n      Translational.Components.Fixed fixed2(s0=-1.75)\n                                           annotation (Placement(transformation(\n              extent={{-40,-60},{-20,-40}},\n                                        rotation=0)));\n      Translational.Sources.Force force2\n                                 annotation (Placement(transformation(extent={{-22,0},\n                {-2,20}},        rotation=0)));\n      Components.Mass mass(\n        m=1,\n        L=1,\n        s(fixed=true),\n        v(fixed=true))\n        annotation (Placement(transformation(extent={{10,0},{30,20}})));\n      Components.SupportFriction supportFriction(f_pos=\n            Examples.Utilities.GenerateStribeckFrictionTable(\n                F_prop=1,\n                F_Coulomb=5,\n                F_Stribeck=10,\n                fexp=2,\n                v_max=12,\n                nTable=50))\n        annotation (Placement(transformation(extent={{40,0},{60,20}})));\n    equation\n      connect(spring.flange_b, stop2.flange_a)  annotation (Line(points={{22,-50},\n              {42,-50}},color={0,191,0}));\n      connect(sineForce.y, force.f)\n        annotation (Line(points={{-39,70},{-22,70}},\n                                                  color={0,0,127}));\n      connect(spring.flange_a, fixed2.flange) annotation (Line(\n          points={{2,-50},{-30,-50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(force.flange, stop1.flange_a) annotation (Line(\n          points={{0,70},{20,70}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(force2.flange, mass.flange_a) annotation (Line(\n          points={{-2,10},{10,10}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass.flange_b, supportFriction.flange_a) annotation (Line(\n          points={{30,10},{40,10}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(sineForce.y, force2.f) annotation (Line(\n          points={{-39,70},{-30,70},{-30,10},{-24,10}},\n          color={0,0,127},\n          smooth=Smooth.None));\n      annotation (\n        Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-100,80},{-80,60}},\n              textString=\"1)\",\n              lineColor={0,0,255}),\n            Text(\n              extent={{-100,20},{-80,0}},\n              textString=\"2)\",\n              lineColor={0,0,255}),\n            Text(\n              extent={{-100,-40},{-80,-60}},\n              lineColor={0,0,255},\n              textString=\"3)\")}),\n        Documentation(info=\"<html>\n<ol>\n<li> Simulate and then plot stop1.f as a function of stop1.v\n     This gives the Stribeck curve.</li>\n<li> The same model is also available by modeling the system with a Mass and\n     a SupportFriction model. The SupportFriction model defines the friction characteristic\n     with a table. The table is constructed with function\n     Examples.Utilities.GenerateStribeckFrictionTable(..) to generate the\n     same friction characteristic as with stop1.\n     The simulation results of stop1 and of model mass are therefore identical.</li>\n<li> Model stop2 gives an example for a hard stop. However there\n     can arise some problems with the used modeling approach (use of\n     <b>reinit</b>(..), convergence problems). In this case use the ElastoGap\n     to model a stop (see example Preload).</li>\n</ol>\n</html>\"),\n        experiment(StopTime=5.0, Interval=0.001));\n    end Friction;\n\n    model PreLoad \"Preload of a spool using ElastoGap models.\"\n\n      extends Modelica.Icons.Example;\n\n      Translational.Components.ElastoGap innerContactA(\n        c=1000e3,\n        d=250,\n        s_rel0=0.001)\n               annotation (Placement(transformation(extent={{-70,20},{-50,40}},\n              rotation=0)));\n      Translational.Components.ElastoGap innerContactB(\n        c=1000e3,\n        d=250,\n        s_rel0=0.001)\n               annotation (                                          Placement(\n            transformation(extent={{50,20},{70,40}}, rotation=0)));\n      Translational.Components.Mass spool(\n        L=0.19,\n        m=0.150,\n        s(start=0.01475, fixed=true),\n        v(fixed=true))     annotation (Placement(transformation(extent={{0,-40},\n                {40,0}},  rotation=0)));\n      Translational.Components.Fixed fixedLe(        s0=-0.0955)\n                                               annotation (Placement(\n            transformation(extent={{-10,-10},{10,10}}, rotation=270,\n            origin={-80,90})));\n      Translational.Components.Mass springPlateA(\n        m=10e-3,\n        L=0.002,\n        s(start=-0.093, fixed=true),\n        v(fixed=true))   annotation (Placement(transformation(extent={{-38,60},\n                {-18,80}}, rotation=0)));\n      Translational.Components.Mass springPlateB(\n        m=10e-3,\n        s(start=-0.06925, fixed=true),\n        L=0.002,\n        v(fixed=true))      annotation (\n          Placement(transformation(extent={{20,60},{40,80}}, rotation=0)));\n      Translational.Components.Spring spring(        c=20e3, s_rel0=0.025)\n        annotation (Placement(transformation(extent={{-10,60},{10,80}},rotation=\n               0)));\n      Translational.Components.ElastoGap outerContactA(\n        c=1000e3,\n        d=250,\n        s_rel0=0.0015)\n               annotation (Placement(transformation(extent={{-70,60},{-50,80}},\n              rotation=0)));\n      Translational.Components.ElastoGap outerContactB(\n        c=1000e3,\n        d=250,\n        s_rel0=0.0015) annotation (Placement(transformation(extent={{50,60},{70,\n                80}}, rotation=0)));\n      Translational.Components.Rod rod1(        L=0.007)\n                                     annotation (Placement(transformation(\n              extent={{-40,30},{-20,50}}, rotation=0)));\n      Translational.Components.Damper friction(        d=2500)\n                                            annotation (Placement(\n            transformation(\n            origin={-80,50},\n            extent={{-10,-10},{10,10}},\n            rotation=270)));\n      Translational.Sources.Force force\n                                 annotation (Placement(transformation(extent={{-38,-30},\n                {-18,-10}},          rotation=0)));\n      Translational.Components.Rod housing(        L=0.0305)\n                                           annotation (Placement(transformation(\n              extent={{-10,80},{10,100}},\n                                        rotation=0)));\n      Translational.Components.Rod rod3(        L=0.00575)\n                                        annotation (Placement(transformation(\n              extent={{-40,-2},{-20,18}}, rotation=0)));\n      Translational.Components.Rod rod4(        L=0.00575)\n                                        annotation (Placement(transformation(\n              extent={{20,-2},{40,18}}, rotation=0)));\n      Translational.Components.Rod rod2(        L=0.007)\n                                     annotation (Placement(transformation(\n              extent={{20,30},{40,50}}, rotation=0)));\n      Modelica.Blocks.Sources.Sine sineForce(amplitude=150, freqHz=0.01)\n        annotation (Placement(transformation(extent={{-78,-30},{-58,-10}},\n              rotation=0)));\n    equation\n      connect(outerContactA.flange_b,springPlateA. flange_a) annotation (Line(\n            points={{-50,70},{-38,70}}, color={0,191,0}));\n      connect(springPlateA.flange_b,spring. flange_a) annotation (Line(points={{-18,70},\n              {-18,70},{-10,70}},color={0,191,0}));\n      connect(spring.flange_b,springPlateB. flange_a) annotation (Line(points={{10,70},\n              {20,70}},         color={0,191,0}));\n      connect(springPlateB.flange_b,outerContactB. flange_a) annotation (Line(\n            points={{40,70},{40,70},{50,70}},\n                                      color={0,191,0}));\n      connect(outerContactB.flange_b,housing. flange_b) annotation (Line(points={{70,70},\n              {70,90},{10,90}},         color={0,191,0}));\n      connect(springPlateA.flange_b,rod1. flange_a) annotation (Line(points={{-18,70},\n              {-18,52},{-40,52},{-40,40}},         color={0,191,0}));\n      connect(innerContactA.flange_a,rod3. flange_a) annotation (Line(points={{-70,30},\n              {-80,30},{-80,8},{-40,8}},         color={0,191,0}));\n      connect(innerContactA.flange_b,rod1. flange_b) annotation (Line(points={{-50,30},\n              {-20,30},{-20,40}},                  color={0,191,0}));\n      connect(rod2.flange_a,innerContactB. flange_a) annotation (Line(points={{20,40},\n              {20,30},{50,30}},        color={0,191,0}));\n      connect(rod4.flange_b,innerContactB. flange_b) annotation (Line(points={{40,8},{\n              70,8},{70,30}},                color={0,191,0}));\n      connect(friction.flange_b,rod3. flange_a) annotation (Line(points={{-80,40},\n              {-80,8},{-40,8}},     color={0,191,0}));\n      connect(rod3.flange_b,rod4. flange_a) annotation (Line(points={{-20,8},{\n              20,8}}, color={0,191,0}));\n      connect(rod2.flange_b,springPlateB. flange_a) annotation (Line(points={{40,40},\n              {40,52},{20,52},{20,70}},        color={0,191,0}));\n      connect(spool.flange_a,rod4. flange_a) annotation (Line(points={{0,-20},{\n              0,8},{20,8}}, color={0,191,0}));\n      connect(sineForce.y, force.f)\n                                 annotation (Line(points={{-57,-20},{-46,-20},{\n              -40,-20}},\n            color={0,0,127}));\n      connect(force.flange, spool.flange_a) annotation (Line(\n          points={{-18,-20},{0,-20}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(outerContactA.flange_a, fixedLe.flange) annotation (Line(\n          points={{-70,70},{-80,70},{-80,90}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(housing.flange_a, fixedLe.flange) annotation (Line(\n          points={{-10,90},{-80,90}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(friction.flange_a, fixedLe.flange) annotation (Line(\n          points={{-80,60},{-80,90}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (\n        Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-92,-72},{90,-80}},\n              textString=\"positive force => spool moves in positive direction \",\n              lineColor={0,0,255}),\n            Text(\n              extent={{-48,-52},{42,-60}},\n              textString=\"Simulate for 100 s\",\n              lineColor={0,0,255}),\n            Text(\n              extent={{-100,-62},{88,-70}},\n              lineColor={0,0,255},\n              textString=\"plot spool.s as a function of force.f\")}),\n        Documentation(info=\"<html>\n<p>\nWhen designing hydraulic valves it is often necessary to hold the spool in\na certain position as long as an external force is below a threshold value.\nIf this force exceeds the threshold value a linear relation between force\nand position is desired.\nThere are designs that need only one spring to accomplish this task. Using\nthe ElastoGap elements this design can be modelled easily.\nDrawing of spool.\n</p>\n\n<p>\n<IMG src=\\\"modelica://Modelica/Resources/Images/Mechanics/Translational/PreLoad.png\\\"><br>\n<IMG src=\\\"modelica://Modelica/Resources/Images/Mechanics/Translational/PreLoad3.png\\\"><br>\n<IMG src=\\\"modelica://Modelica/Resources/Images/Mechanics/Translational/PreLoad4.png\\\"><br>\n</p>\n\n<p>\nSpool position s as a function of working force f.\n</p>\n\n<p>\n<IMG src=\\\"modelica://Modelica/Resources/Images/Mechanics/Translational/PreLoad2.png\\\">\n</p>\n</html>\"),\n        experiment(StopTime=100, Interval=0.1));\n    end PreLoad;\n\n    model ElastoGap \"Demonstrate usage of ElastoGap\"\n    extends Modelica.Icons.Example;\n      Components.Fixed fixed\n        annotation (Placement(transformation(extent={{-10,-10},{10,10}})));\n      Components.Rod rod1(L=2)\n        annotation (Placement(transformation(extent={{-40,-10},{-20,10}})));\n      Components.Rod rod2(L=2)\n        annotation (Placement(transformation(extent={{20,-10},{40,10}})));\n      Components.SpringDamper springDamper1(\n        c=10,\n        s_rel0=1,\n        s_rel(fixed=false, start=1),\n        d=1.5)\n        annotation (Placement(transformation(extent={{-40,20},{-20,40}})));\n      Components.SpringDamper springDamper2(\n        c=10,\n        s_rel0=1,\n        s_rel(fixed=false, start=1),\n        d=1.5)\n        annotation (Placement(transformation(extent={{20,20},{40,40}})));\n      Components.Mass mass1(\n        s(fixed=true, start=2),\n        L=0,\n        m=1,\n        v(fixed=true))\n             annotation (Placement(transformation(extent={{-10,20},{10,40}})));\n      Components.ElastoGap elastoGap1(\n        c=10,\n        s_rel(fixed=false, start=1.5),\n        s_rel0=1.5,\n        d=1.5)\n        annotation (Placement(transformation(extent={{-40,-40},{-20,-20}})));\n      Components.ElastoGap elastoGap2(\n        c=10,\n        s_rel(fixed=false, start=1.5),\n        s_rel0=1.5,\n        d=1.5)\n        annotation (Placement(transformation(extent={{20,-40},{40,-20}})));\n      Components.Mass mass2(\n        s(fixed=true, start=2),\n        L=0,\n        m=1,\n        v(fixed=true))\n             annotation (Placement(transformation(extent={{-10,-40},{10,-20}})));\n      parameter SI.TranslationalDampingConstant d=1.5 \"Damping constant\";\n    equation\n\n      connect(rod1.flange_b, fixed.flange) annotation (Line(\n          points={{-20,0},{0,0}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(fixed.flange, rod2.flange_a) annotation (Line(\n          points={{0,0},{20,0}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(springDamper1.flange_a, rod1.flange_a) annotation (Line(\n          points={{-40,30},{-48,30},{-48,0},{-40,0}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(springDamper2.flange_b, rod2.flange_b) annotation (Line(\n          points={{40,30},{50,30},{50,0},{40,0}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(springDamper1.flange_b, mass1.flange_a) annotation (Line(\n          points={{-20,30},{-10,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass1.flange_b, springDamper2.flange_a) annotation (Line(\n          points={{10,30},{20,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(rod1.flange_a, elastoGap1.flange_a) annotation (Line(\n          points={{-40,0},{-48,0},{-48,-30},{-40,-30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(rod2.flange_b, elastoGap2.flange_b) annotation (Line(\n          points={{40,0},{50,0},{50,-30},{40,-30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(elastoGap1.flange_b, mass2.flange_a) annotation (Line(\n          points={{-20,-30},{-10,-30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass2.flange_b, elastoGap2.flange_a) annotation (Line(\n          points={{10,-30},{20,-30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis model demonstrates the effect of ElastoGaps on eigenfrequency:<br>\nPlot mass1.s and mass2.s as well as mass1.v and mass2.v<br><br>\nmass1 is moved by both spring forces all the time.<br>\nSince elastoGap1 lifts off at s &gt; -0.5 m and elastoGap2 lifts off s &lt; +0.5 m,\nmass2 moves freely as long as -0.5 m &lt; s &lt; +0.5 m.\n</p>\n</html>\"),\n        experiment(StopTime=1.0, Interval=0.01));\n    end ElastoGap;\n\n    model Brake \"Demonstrate braking of a translational moving mass\"\n      extends Modelica.Icons.Example;\n\n      Modelica.Mechanics.Translational.Components.Brake brake(fn_max=1, useSupport=\n            false)\n        annotation (Placement(transformation(extent={{6,40},{26,20}})));\n      Modelica.Mechanics.Translational.Components.Mass mass1(m=1,\n        s(fixed=true),\n        v(start=1, fixed=true))\n        annotation (Placement(transformation(extent={{-34,20},{-14,40}})));\n      Modelica.Blocks.Sources.Step step(startTime=0.1, height=2)\n        annotation (Placement(transformation(extent={{-10,-10},{10,10}},\n            rotation=0,\n            origin={-24,-10})));\n      Modelica.Mechanics.Translational.Components.Brake brake1(\n                                                              fn_max=1, useSupport=\n            true)\n        annotation (Placement(transformation(extent={{6,-60},{26,-40}})));\n      Modelica.Mechanics.Translational.Components.Mass mass2(m=1,\n        s(fixed=true),\n        v(start=1, fixed=true))\n        annotation (Placement(transformation(extent={{-34,-60},{-14,-40}})));\n      Modelica.Mechanics.Translational.Components.Fixed fixed\n        annotation (Placement(transformation(extent={{6,-80},{26,-60}})));\n    equation\n      connect(mass1.flange_b, brake.flange_a)\n                                             annotation (Line(\n          points={{-14,30},{6,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(step.y, brake.f_normalized) annotation (Line(\n          points={{-13,-10},{16,-10},{16,19}},\n          color={0,0,127},\n          smooth=Smooth.None));\n      connect(mass2.flange_b, brake1.flange_a)\n                                             annotation (Line(\n          points={{-14,-50},{6,-50}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(step.y, brake1.f_normalized) annotation (Line(\n          points={{-13,-10},{16,-10},{16,-39}},\n          color={0,0,127},\n          smooth=Smooth.None));\n      connect(fixed.flange, brake1.support) annotation (Line(\n          points={{16,-70},{16,-60}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (        Documentation(info=\"<html>\n<p>\nThis model consists of a mass with an initial velocity of 1 m/s.\nAfter 0.1 s, a brake is activated and it is shown that the mass decelerates until\nit arrives at rest and remains at rest. Two versions of this system are present,\none where the brake is implicitly grounded and one where it is explicitly grounded.\n</p>\n</html>\"),\n        experiment(StopTime=2.0, Interval=0.001));\n    end Brake;\n\n    model HeatLosses \"Demonstrate the modeling of heat losses\"\n     extends Modelica.Icons.Example;\n      Components.Mass mass1(\n        m=1,\n        s(fixed=true),\n        L=0.1,\n        v(fixed=true))\n        annotation (Placement(transformation(extent={{-60,20},{-40,40}})));\n      Components.SpringDamper springDamper(\n        s_rel(fixed=true),\n        v_rel(fixed=true),\n        c=100,\n        d=10,\n        useHeatPort=true)\n              annotation (Placement(transformation(extent={{-30,20},{-10,40}})));\n      Components.Damper damper(d=10, useHeatPort=true)\n        annotation (Placement(transformation(extent={{-10,10},{10,-10}},\n            rotation=-90,\n            origin={-60,-10})));\n      Components.ElastoGap elastoGap(\n        c=100,\n        d=20,\n        s_rel0=-0.02,\n        useHeatPort=true)\n        annotation (Placement(transformation(extent={{-90,-10},{-70,10}})));\n      Components.Fixed fixed1\n        annotation (Placement(transformation(extent={{-70,-40},{-50,-20}})));\n      Sources.Force force\n        annotation (Placement(transformation(extent={{-90,20},{-70,40}})));\n      Blocks.Sources.Sine sine1(freqHz=1, amplitude=20)\n        annotation (Placement(transformation(extent={{-120,20},{-100,40}})));\n      Components.Mass mass2(\n        m=1,\n        L=0.1,\n        s(fixed=false),\n        v(fixed=false))\n        annotation (Placement(transformation(extent={{0,20},{20,40}})));\n      Components.SupportFriction supportFriction(useHeatPort=true)\n        annotation (Placement(transformation(extent={{30,20},{50,40}})));\n      Components.Spring spring(c=100, s_rel(fixed=true))\n        annotation (Placement(transformation(extent={{60,20},{80,40}})));\n      Components.Mass mass3(\n        m=1,\n        L=0.1,\n        s(fixed=false),\n        v(fixed=true))\n        annotation (Placement(transformation(extent={{90,20},{110,40}})));\n      Components.Brake brake(fn_max=10, useHeatPort=true)\n        annotation (Placement(transformation(extent={{120,20},{140,40}})));\n      Blocks.Sources.Sine sine2(amplitude=10, freqHz=2)\n        annotation (Placement(transformation(extent={{100,50},{120,70}})));\n      Components.MassWithStopAndFriction massWithStopAndFriction(\n        L=0.1,\n        m=1,\n        F_prop=0.5,\n        F_Coulomb=1,\n        F_Stribeck=2,\n        fexp=2,\n        smin=0,\n        smax=0.4,\n        v(fixed=true),\n        useHeatPort=true)\n        annotation (Placement(transformation(extent={{180,20},{200,40}})));\n      Thermal.HeatTransfer.Components.Convection convection\n        annotation (Placement(transformation(extent={{-10,-40},{10,-60}})));\n      Blocks.Sources.Constant const(k=20)\n        annotation (Placement(transformation(extent={{-30,-90},{-10,-70}})));\n      Thermal.HeatTransfer.Celsius.FixedTemperature TAmbient(T=25)\n        \"Ambient temperature\"\n        annotation (Placement(transformation(extent={{40,-60},{20,-40}})));\n      Components.Fixed fixed2\n        annotation (Placement(transformation(extent={{-120,-10},{-100,10}})));\n      Components.SpringDamper springDamper1(\n        c=10000,\n        d=1000,\n        useHeatPort=true,\n        s_rel(fixed=true))\n        annotation (Placement(transformation(extent={{150,20},{170,40}})));\n    equation\n\n      connect(mass1.flange_b, springDamper.flange_a)\n                                                    annotation (Line(\n          points={{-40,30},{-30,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(sine1.y, force.f) annotation (Line(\n          points={{-99,30},{-92,30}},\n          color={0,0,127},\n          smooth=Smooth.None));\n      connect(force.flange, mass1.flange_a) annotation (Line(\n          points={{-70,30},{-60,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass1.flange_a, damper.flange_a) annotation (Line(\n          points={{-60,30},{-60,0}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(damper.flange_b, fixed1.flange) annotation (Line(\n          points={{-60,-20},{-60,-30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(springDamper.flange_b, mass2.flange_a) annotation (Line(\n          points={{-10,30},{0,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass2.flange_b, supportFriction.flange_a) annotation (Line(\n          points={{20,30},{30,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(supportFriction.flange_b, spring.flange_a) annotation (Line(\n          points={{50,30},{60,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(spring.flange_b, mass3.flange_a) annotation (Line(\n          points={{80,30},{90,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(mass3.flange_b, brake.flange_a) annotation (Line(\n          points={{110,30},{120,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(sine2.y, brake.f_normalized) annotation (Line(\n          points={{121,60},{130,60},{130,41}},\n          color={0,0,127},\n          smooth=Smooth.None));\n      connect(elastoGap.flange_b, mass1.flange_a) annotation (Line(\n          points={{-70,0},{-60,0},{-60,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(const.y,convection. Gc) annotation (Line(\n          points={{-9,-80},{0,-80},{0,-60}},\n          color={0,0,127},\n          smooth=Smooth.None));\n      connect(TAmbient.port,convection. fluid) annotation (Line(\n          points={{20,-50},{10,-50}},\n          color={191,0,0},\n          smooth=Smooth.None));\n      connect(elastoGap.flange_a, fixed2.flange) annotation (Line(\n          points={{-90,0},{-110,0}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(elastoGap.heatPort, convection.solid) annotation (Line(\n          points={{-90,-10},{-90,-50},{-10,-50}},\n          color={191,0,0},\n          smooth=Smooth.None));\n      connect(damper.heatPort, convection.solid) annotation (Line(\n          points={{-50,0},{-50,-50},{-10,-50}},\n          color={191,0,0},\n          smooth=Smooth.None));\n      connect(springDamper.heatPort, convection.solid) annotation (Line(\n          points={{-30,20},{-30,-50},{-10,-50}},\n          color={191,0,0},\n          smooth=Smooth.None));\n      connect(supportFriction.heatPort, convection.solid) annotation (Line(\n          points={{30,20},{30,0},{-30,0},{-30,-50},{-10,-50}},\n          color={191,0,0},\n          smooth=Smooth.None));\n      connect(brake.heatPort, convection.solid) annotation (Line(\n          points={{120,20},{120,0},{-30,0},{-30,-50},{-10,-50}},\n          color={191,0,0},\n          smooth=Smooth.None));\n      connect(massWithStopAndFriction.heatPort, convection.solid) annotation (\n          Line(\n          points={{180,20},{180,0},{-30,0},{-30,-50},{-10,-50}},\n          color={191,0,0},\n          smooth=Smooth.None));\n      connect(brake.flange_b, springDamper1.flange_a) annotation (Line(\n          points={{140,30},{150,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(springDamper1.flange_b, massWithStopAndFriction.flange_a)\n        annotation (Line(\n          points={{170,30},{180,30}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(springDamper1.heatPort, convection.solid) annotation (Line(\n          points={{150,20},{150,0},{-30,0},{-30,-50},{-10,-50}},\n          color={191,0,0},\n          smooth=Smooth.None));\n      annotation (        Documentation(info=\"<html>\n<p>\nThis model demonstrates how to model the dissipated power of a Translational model,\nby enabling the heatPort of all components and connecting these heatPorts via\na convection element to the environment. The total heat flow generated by the\nelements and transported to the environment\nis present in variable convection.fluid.\n</p>\n</html>\"),\n        experiment(StopTime=2.0, Interval=0.001),\n        Diagram(coordinateSystem(extent={{-120,-100},{200,100}},\n              preserveAspectRatio=false)));\n    end HeatLosses;\n\n    package Utilities \"Utility classes used by the Example models\"\n      extends Modelica.Icons.UtilitiesPackage;\n      function GenerateStribeckFrictionTable\n        \"Generate Stribeck friction table for example Friction for the SupportFriction\"\n         extends Modelica.Icons.Function;\n         input Real F_prop(final unit=\"N.s/m\", final min=0)\n          \"Velocity dependent friction coefficient\";\n         input Modelica.SIunits.Force F_Coulomb\n          \"Constant friction: Coulomb force\";\n         input Modelica.SIunits.Force F_Stribeck \"Stribeck effect\";\n         input Real fexp(final unit=\"s/m\", final min=0) \"Exponential decay\";\n         input Real v_max \"Generate table from v=0 ... v_max\";\n         input Integer nTable(min=2)=100 \"Number of table points\";\n         output Real table[nTable,2] \"Friction table\";\n      algorithm\n         for i in 1:nTable loop\n            table[i,1] :=v_max*(i - 1)/(nTable - 1);\n            table[i,2] :=F_Coulomb + F_prop*table[i, 1] +\n                         F_Stribeck*exp(-fexp*table[i, 1]);\n         end for;\n        annotation (Documentation(info=\"<html>\n<p>\nReturns a table with the friction characteristic table[nTable,2] = [0, f1; ....; v_max, fn], where the first\ncolumn is the velocity v in the range 0..v_max and the second column is the friction force\naccording to the Stribeck curve:\n</p>\n<pre>\n  F_Coulomb + F_prop*v + F_Stribeck*exp(-fexp*v);\n</pre>\n\n</html>\"));\n      end GenerateStribeckFrictionTable;\n      annotation (Documentation(info=\"<html>\n<p>Utility models and functions used in the Examples</p>\n</html>\"));\n    end Utilities;\n    annotation (\n      Documentation(info=\"<html>\n<p>\nThis package contains example models to demonstrate the usage of the\nTranslational package. Open the models and\nsimulate them according to the provided description in the models.\n</p>\n\n</html>\"));\n  end Examples;\n\n  package Components \"Components for 1D translational mechanical drive trains\"\n    extends Modelica.Icons.Package;\n\n    model Fixed \"Fixed flange\"\n      parameter SI.Position s0=0 \"Fixed offset position of housing\";\n\n      Interfaces.Flange_b flange   annotation (Placement(transformation(\n            origin={0,0},\n            extent={{-10,10},{10,-10}},\n            rotation=180)));\n    equation\n      flange.s = s0;\n      annotation (\n        Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-80,-40},{80,-40}}, color={0,0,0}),\n            Line(points={{80,-40},{40,-80}}, color={0,0,0}),\n            Line(points={{40,-40},{0,-80}}, color={0,0,0}),\n            Line(points={{0,-40},{-40,-80}}, color={0,0,0}),\n            Line(points={{-40,-40},{-80,-80}}, color={0,0,0}),\n            Line(points={{0,-40},{0,-10}}, color={0,0,0}),\n            Text(\n              extent={{-150,-90},{150,-130}},\n              textString=\"%name\",\n              lineColor={0,0,255})}),\n        Documentation(info=\"<html>\n<p>\nThe <i>flange</i> of a 1D translational mechanical system <i>fixed</i>\nat an position s0 in the <i>housing</i>. May be used:\n</p>\n<ul>\n<li> to connect a compliant element, such as a spring or a damper,\n     between a sliding mass and the housing.\n<li> to fix a rigid element, such as a sliding mass, at a specific\n     position.\n</ul>\n\n</html>\"));\n    end Fixed;\n\n    model Mass \"Sliding mass with inertia\"\n      parameter SI.Mass m(min=0, start=1) \"Mass of the sliding mass\";\n      parameter StateSelect stateSelect=StateSelect.default\n        \"Priority to use s and v as states\" annotation(Dialog(tab=\"Advanced\"));\n      extends Translational.Interfaces.PartialRigid(L=0,s(start=0, stateSelect=stateSelect));\n      SI.Velocity v(start=0, stateSelect=stateSelect)\n        \"Absolute velocity of component\";\n      SI.Acceleration a(start=0) \"Absolute acceleration of component\";\n\n    equation\n      v = der(s);\n      a = der(v);\n      m*a = flange_a.f + flange_b.f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nSliding mass with <i>inertia, without friction</i> and two rigidly connected flanges.\n</p>\n<p>\nThe sliding mass has the length L, the position coordinate s is in the middle.\nSign convention: A positive force at flange flange_a moves the sliding mass in the positive direction.\nA negative force at flange flange_a moves the sliding mass to the negative direction.\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-100,0},{-55,0}}, color={0,127,0}),\n            Line(points={{55,0},{100,0}}, color={0,127,0}),\n            Rectangle(\n              extent={{-55,-30},{56,30}},\n              lineColor={0,0,0},\n              fillPattern=FillPattern.Sphere,\n              fillColor={255,255,255}),\n            Polygon(\n              points={{50,-90},{20,-80},{20,-100},{50,-90}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-60,-90},{20,-90}}, color={0,0,0}),\n            Text(\n              extent={{-150,85},{150,45}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Text(\n              extent={{-150,-45},{150,-75}},\n              lineColor={0,0,0},\n              textString=\"m=%m\")}),\n        Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-100,0},{-55,0}}, color={0,127,0}),\n            Line(points={{55,0},{100,0}}, color={0,127,0}),\n            Rectangle(\n              extent={{-55,-30},{55,30}},\n              lineColor={0,0,0},\n              fillPattern=FillPattern.Sphere,\n              fillColor={255,255,255}),\n            Polygon(\n              points={{50,-90},{20,-80},{20,-100},{50,-90}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-60,-90},{20,-90}}, color={0,0,0}),\n            Line(points={{-100,-29},{-100,-61}}, color={0,0,0}),\n            Line(points={{100,-61},{100,-28}}, color={0,0,0}),\n            Line(points={{-98,-60},{98,-60}}, color={0,0,0}),\n            Polygon(\n              points={{-101,-60},{-96,-59},{-96,-61},{-101,-60}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Polygon(\n              points={{100,-60},{95,-61},{95,-59},{100,-60}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-44,-41},{51,-57}},\n              textString=\"Length L\",\n              lineColor={0,0,255}),\n            Line(points={{0,30},{0,53}}, color={0,0,0}),\n            Line(points={{-72,40},{1,40}}, color={0,0,0}),\n            Polygon(\n              points={{-7,42},{-7,38},{-1,40},{-7,42}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-61,53},{-9,42}},\n              textString=\"Position s\",\n              lineColor={0,0,255})}));\n    end Mass;\n\n    model Rod \"Rod without inertia\"\n      extends Translational.Interfaces.PartialRigid;\n\n    equation\n      0 = flange_a.f + flange_b.f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nRod <i>without inertia</i> and two rigidly connected flanges.\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-100,0},{-55,0}}, color={0,127,0}),\n            Line(points={{53,0},{99,0}}, color={0,127,0}),\n            Polygon(\n              points={{50,-90},{20,-80},{20,-100},{50,-90}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-60,-90},{20,-90}}, color={0,0,0}),\n            Rectangle(\n              extent={{-55,10},{53,-10}},\n              lineColor={160,160,164},\n              fillColor={192,192,192},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-150,80},{150,40}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Text(\n              extent={{-150,-30},{150,-60}},\n              lineColor={0,0,0},\n              textString=\"L=%L\")}),\n        Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-100,0},{-55,0}}, color={0,127,0}),\n            Line(points={{54,0},{100,0}}, color={0,127,0}),\n            Polygon(\n              points={{50,-90},{20,-80},{20,-100},{50,-90}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-60,-90},{20,-90}}, color={0,0,0}),\n            Rectangle(\n              extent={{-55,3},{53,-4}},\n              lineColor={160,160,164},\n              fillColor={192,192,192},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-100,-29},{-100,-61}}, color={0,0,0}),\n            Line(points={{100,-61},{100,-28}}, color={0,0,0}),\n            Line(points={{-98,-60},{98,-60}}, color={0,0,0}),\n            Polygon(\n              points={{-101,-60},{-96,-59},{-96,-61},{-101,-60}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Polygon(\n              points={{100,-60},{95,-61},{95,-59},{100,-60}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-44,-41},{51,-57}},\n              textString=\"Length L\",\n              lineColor={0,0,255})}));\n    end Rod;\n\n    model Spring \"Linear 1D translational spring\"\n      extends Translational.Interfaces.PartialCompliant;\n      parameter SI.TranslationalSpringConstant c(final min=0, start = 1)\n        \"Spring constant\";\n      parameter SI.Distance s_rel0=0 \"Unstretched spring length\";\n\n    equation\n      f = c*(s_rel - s_rel0);\n      annotation (\n        Documentation(info=\"<html>\n<p>\nA <i>linear 1D translational spring</i>. The component can be connected either\nbetween two sliding masses, or between\na sliding mass and the housing (model Fixed), to describe\na coupling of the sliding mass with the housing via a spring.\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-60,-90},{20,-90}}, color={0,0,0}),\n            Polygon(\n              points={{50,-90},{20,-80},{20,-100},{50,-90}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-150,90},{150,50}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Line(points={{-98,0},{-60,0},{-44,-30},{-16,30},{14,-30},{44,30},{\n                  60,0},{100,0}},color={0,0,0}),\n            Text(\n              extent={{-150,-45},{150,-75}},\n              lineColor={0,0,0},\n              textString=\"c=%c\")}),\n        Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-100,0},{-100,65}}, color={128,128,128}),\n            Line(points={{100,0},{100,65}}, color={128,128,128}),\n            Line(points={{-100,60},{100,60}}, color={128,128,128}),\n            Polygon(\n              points={{90,63},{100,60},{90,57},{90,63}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-56,66},{36,81}},\n              lineColor={0,0,255},\n              textString=\"s_rel\"),\n            Line(points={{-86,0},{-60,0},{-44,-30},{-16,30},{14,-30},{44,30},{\n                  60,0},{84,0}}, color={0,0,0})}));\n    end Spring;\n\n    model Damper \"Linear 1D translational damper\"\n      extends Translational.Interfaces.PartialCompliantWithRelativeStates;\n      parameter SI.TranslationalDampingConstant d(final min=0, start = 0)\n        \"Damping constant\";\n      extends\n        Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;\n    equation\n      f = d*v_rel;\n      lossPower = f*v_rel;\n      annotation (\n        Documentation(info=\"<html>\n<p>\n<i>Linear, velocity dependent damper</i> element. It can be either connected\nbetween a sliding mass and the housing (model Fixed), or\nbetween two sliding masses.\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-90,0},{-60,0}}, color={0,0,0}),\n            Line(points={{-60,-30},{-60,30}}, color={0,0,0}),\n            Line(points={{-60,-30},{60,-30}}, color={0,0,0}),\n            Line(points={{-60,30},{60,30}}, color={0,0,0}),\n            Rectangle(\n              extent={{-60,30},{30,-30}},\n              lineColor={0,0,0},\n              fillColor={192,192,192},\n              fillPattern=FillPattern.Solid),\n            Line(points={{30,0},{90,0}}, color={0,0,0}),\n            Polygon(\n              points={{50,-90},{20,-80},{20,-100},{50,-90}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-60,-90},{20,-90}}, color={0,0,0}),\n            Text(\n              extent={{-150,90},{150,50}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Text(\n              extent={{-150,-45},{150,-75}},\n              lineColor={0,0,0},\n              textString=\"d=%d\"),\n            Line(visible=useHeatPort,\n              points={{-100,-100},{-100,-20},{-14,-20}},\n              color={191,0,0},\n              pattern=LinePattern.Dot,\n              smooth=Smooth.None)}),\n        Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-90,0},{-60,0}}, color={0,0,0}),\n            Line(points={{-60,-30},{-60,30}}, color={0,0,0}),\n            Line(points={{-60,-30},{60,-30}}, color={0,0,0}),\n            Line(points={{-60,30},{60,30}}, color={0,0,0}),\n            Rectangle(\n              extent={{-60,30},{30,-30}},\n              lineColor={0,0,0},\n              fillColor={192,192,192},\n              fillPattern=FillPattern.Solid),\n            Line(points={{30,0},{90,0}}, color={0,0,0}),\n            Line(points={{-50,60},{50,60}}, color={128,128,128}),\n            Polygon(\n              points={{50,63},{60,60},{50,57},{50,63}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-58,68},{42,78}},\n              lineColor={128,128,128},\n              textString=\"der(s_rel)\")}));\n    end Damper;\n\n    model SpringDamper \"Linear 1D translational spring and damper in parallel\"\n      extends Translational.Interfaces.PartialCompliantWithRelativeStates;\n      parameter SI.TranslationalSpringConstant c(final min=0, start = 1)\n        \"Spring constant\";\n      parameter SI.TranslationalDampingConstant d(final min=0, start = 1)\n        \"Damping constant\";\n      parameter SI.Position s_rel0=0 \"Unstretched spring length\";\n      extends\n        Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;\n    protected\n      Modelica.SIunits.Force f_c \"Spring force\";\n      Modelica.SIunits.Force f_d \"Damping force\";\n    equation\n      f_c = c*(s_rel - s_rel0);\n      f_d = d*v_rel;\n      f = f_c + f_d;\n      lossPower = f_d*v_rel;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nA <i>spring and damper element connected in parallel</i>.\nThe component can be\nconnected either between two sliding masses to describe the elasticity\nand damping, or between a sliding mass and the housing (model Fixed),\nto describe a coupling of the sliding mass with the housing via a spring/damper.\n</p>\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-80,40},{-60,40},{-45,10},{-15,70},{15,10},{45,70},{\n                  60,40},{80,40}}, color={0,0,0}),\n            Line(points={{-80,40},{-80,-70}}, color={0,0,0}),\n            Line(points={{-80,-70},{-52,-70}}, color={0,0,0}),\n            Rectangle(\n              extent={{-52,-49},{38,-91}},\n              lineColor={0,0,0},\n              fillColor={192,192,192},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-52,-49},{68,-49}}, color={0,0,0}),\n            Line(points={{-51,-91},{69,-91}}, color={0,0,0}),\n            Line(points={{38,-70},{80,-70}}, color={0,0,0}),\n            Line(points={{80,40},{80,-70}}, color={0,0,0}),\n            Line(points={{-90,0},{-80,0}}, color={0,0,0}),\n            Line(points={{80,0},{90,0}}, color={0,0,0}),\n            Polygon(\n              points={{53,-18},{23,-8},{23,-28},{53,-18}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-57,-18},{23,-18}}, color={0,0,0}),\n            Text(\n              extent={{-150,120},{150,80}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Text(\n              extent={{-150,-135},{150,-165}},\n              lineColor={0,0,0},\n              textString=\"d=%d\"),\n            Text(\n              extent={{-150,-100},{150,-130}},\n              lineColor={0,0,0},\n              textString=\"c=%c\"),\n            Line(visible=useHeatPort,\n              points={{-100,-100},{-100,-80},{-5,-80}},\n              color={191,0,0},\n              pattern=LinePattern.Dot,\n              smooth=Smooth.None)}),\n        Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(\n              points={{-80,32},{-58,32},{-43,2},{-13,62},{17,2},{47,62},{62,32},\n                  {80,32}},\n              color={0,0,0},\n              thickness=0.5),\n            Line(points={{-100,31},{-100,96}}, color={128,128,128}),\n            Line(points={{100,29},{100,94}}, color={128,128,128}),\n            Line(points={{-98,82},{100,82}}, color={128,128,128}),\n            Polygon(\n              points={{90,85},{100,82},{90,79},{90,85}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-63,83},{46,103}},\n              lineColor={0,0,255},\n              textString=\"s_rel\"),\n            Rectangle(\n              extent={{-52,-28},{38,-72}},\n              lineColor={0,0,0},\n              fillColor={192,192,192},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-51,-72},{69,-72}}, color={0,0,0}),\n            Line(points={{-52,-28},{68,-28}}, color={0,0,0}),\n            Line(points={{38,-50},{80,-50}}, color={0,0,0}),\n            Line(points={{-80,-50},{-52,-50}}, color={0,0,0}),\n            Line(points={{-80,32},{-80,-50}}, color={0,0,0}),\n            Line(points={{80,32},{80,-50}}, color={0,0,0}),\n            Line(points={{-90,0},{-80,0}}, color={0,0,0}),\n            Line(points={{90,0},{80,0}}, color={0,0,0})}));\n    end SpringDamper;\n\n    model ElastoGap \"1D translational spring damper combination with gap\"\n      extends\n        Modelica.Mechanics.Translational.Interfaces.PartialCompliantWithRelativeStates;\n      parameter SI.TranslationalSpringConstant c(final min=0, start=1)\n        \"Spring constant\";\n      parameter SI.TranslationalDampingConstant d(final min=0, start=1)\n        \"Damping constant\";\n      parameter SI.Position s_rel0=0 \"Unstretched spring length\";\n      parameter Real n(final min=1) = 1\n        \"Exponent of spring force ( f_c = -c*|s_rel-s_rel0|^n )\";\n      extends\n        Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;\n\n    /*\nPlease note that initialization might fail due to the nonlinear spring characteristic\n(spring force is zero for s_rel > s_rel0)\nif a positive force is acting on the element and no other force balances this force\n(e.g., when setting both initial velocity and acceleration to 0)\n*/\n      Boolean contact \"=true, if contact, otherwise no contact\";\n    protected\n      Modelica.SIunits.Force f_c \"Spring force\";\n      Modelica.SIunits.Force f_d2 \"Linear damping force\";\n      Modelica.SIunits.Force f_d\n        \"Linear damping force which is limited by spring force (|f_d| <= |f_c|)\";\n    equation\n      // Modify contact force, so that it is only \"pushing\" and not\n      // \"pulling/sticking\" and that it is continuous\n      contact = s_rel < s_rel0;\n      f_c  = smooth(1, noEvent( if contact then -c*abs(s_rel - s_rel0)^n else 0));\n      f_d2 = if contact then d*v_rel else 0;\n      f_d  = smooth(0, noEvent( if contact then (if f_d2 <  f_c then  f_c else\n                                                 if f_d2 > -f_c then -f_c else f_d2) else 0));\n      f = f_c + f_d;\n      lossPower = f_d*v_rel;\n      annotation (\n         Documentation(info=\"<html>\n<p>\nThis component models a spring damper combination that can lift off.\nIt can be connected between a sliding mass and the housing (model\n<a href=\\\"modelica://Modelica.Mechanics.Translational.Components.Fixed\\\">Fixed</a>),\nto describe the contact of a sliding mass with the housing.\n</p>\n\n<p>\nAs long as s_rel &gt; s_rel0, no force is exerted (s_rel = flange_b.s - flange_a.s).\nIf s_rel &le; s_rel0, the contact force is basically computed with a linear\nspring/damper characteristic. With parameter n&ge;1 (exponent of spring force),\na nonlinear spring force can be modeled:\n</p>\n\n<pre>\n   desiredContactForce = c*|s_rel - s_rel0|^n + d*<b>der</b>(s_rel)\n</pre>\n\n<p>\nNote, Hertzian contact is described by:\n</p>\n<ul>\n<li> Contact between two metallic spheres: n=1.5</li>\n<li> Contact between two metallic plates: n=1</li>\n</ul>\n\n<p>\nThe above force law leads to the following difficulties:\n</p>\n\n<ol>\n<li> If the damper force becomes larger as the spring force and with opposite sign,\n     the contact force would be \\\"pulling/sticking\\\" which is unphysical, since during\n     contact only pushing forces can occur.</li>\n\n<li> When contact occurs with a non-zero relative speed (which is the usual\n     situation), the damping force has a non-zero value and therefore the contact\n     force changes discontinuously at s_rel = s_rel0. Again, this is not physical\n     because the force can only change continuously. (Note, this component is not an\n     idealized model where a steep characteristic is approximated by a discontinuity,\n     but it shall model the steep characteristic.)</li>\n</ol>\n\n<p>\nIn the literature there are several proposals to fix problem (2). Especially, often\nthe following model is used (see, e.g.,\nLankarani, Nikravesh: Continuous Contact Force Models for Impact\nAnalysis in Multibody Systems, Nonlinear Dynamics 5, pp. 193-207, 1994,\n<a href=\\\"http://www.springerlink.com/content/h50x61270q06p65n/fulltext.pdf\\\">pdf-download</a>):\n</p>\n\n<pre>\n   f = c*s_rel^n + (d*s_rel^n)*<b>der</b>(s_rel)\n</pre>\n\n<p>\nHowever, this and other models proposed in literature violate\nissue (1), i.e., unphysical pulling forces can occur (if d*<b>der</b>(s_rel)\nbecomes large enough). Note, if the force law is of the form \\\"f = f_c + f_d\\\", then a\nnecessary condition is that |f_d| &le; |f_c|, otherwise (1) and (2) are violated.\nFor this reason, the most simplest approach is used in the ElastoGap model\nto fix both problems by using this necessary condition in the force law directly.\nIf s_rel0 = 0, the equations are:\n</p>\n\n<pre>\n    <b>if</b> s_rel &ge; 0 <b>then</b>\n       f = 0;    // contact force\n    <b>else</b>\n       f_c  = -c*|s_rel|^n;          // contact spring force (Hertzian contact force)\n       f_d2 = d*<b>der</b>(s_rel);         // linear contact damper force\n       f_d  = <b>if</b> f_d2 &lt;  f_c <b>then</b>  f_c <b>else</b>\n              <b>if</b> f_d2 &gt; -f_c <b>then</b> -f_c <b>else</b> f_d2;  // bounded damper force\n       f    = f_c + f_d;            // contact force\n    <b>end if</b>;\n</pre>\n\n<p>\nNote, since |f_d| &le; |f_c|, pulling forces cannot occur and the contact force\nis always continuous, especially around the start of the penetration at s_rel = s_rel0.\n</p>\n\n<p>\nIn the next figure, a typical simulation with the ElastoGap model is shown\n(<a href=\\\"modelica://Modelica.Mechanics.Translational.Examples.ElastoGap\\\">Examples.ElastoGap</a>)\nwhere the different effects are visualized:\n</p>\n\n<ol>\n<li> Curve 1 (elastoGap1.f) is the unmodified contact force, i.e., the linear spring/damper\n     characteristic. A pulling/sticking force is present at the end of the contact.</li>\n<li> Curve 2 (elastoGap2.f) is the contact force, where the force is explicitly set to\n     zero when pulling/sticking occurs. The contact force is discontinuous when contact starts.</li>\n<li> Curve 3 (elastoGap3.f) is the ElastoGap model of this library. No discontinuity and no\n     pulling/sticking occurs.</li>\n</ol>\n\n<p>\n<img src=\\\"modelica://Modelica/Resources/Images/Mechanics/Translational/ElastoGap1.png\\\">\n</p>\n</html>\"),        Diagram(coordinateSystem(\n          preserveAspectRatio=false,\n          extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-100,0},{-50,0}}, color={0,127,0}),\n            Line(\n              points={{-48,34},{-48,-46}},\n              color={0,0,0},\n              thickness=1),\n            Line(points={{8,40},{8,2}}, color={0,0,0}),\n            Line(points={{-2,0},{38,0},{38,44},{-2,44}}, color={0,0,0}),\n            Line(points={{38,22},{72,22}}, color={0,0,0}),\n            Line(\n              points={{-12,-38},{-12,20}},\n              color={0,0,0},\n              thickness=1),\n            Line(points={{-12,22},{8,22}}, color={0,0,0}),\n            Line(points={{-12,-38},{-2,-38}}, color={0,0,0}),\n            Line(points={{72,0},{100,0}}, color={0,127,0}),\n            Line(points={{72,22},{72,-42}}, color={0,0,0}),\n            Line(points={{-2,-38},{10,-28},{22,-48},{38,-28},{50,-48},{64,-28},\n                  {72,-40}}, color={0,0,0}),\n            Rectangle(\n              extent={{8,44},{38,0}},\n              lineColor={0,0,0},\n              fillColor={192,192,192},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-64,-80},{64,-64}},\n              lineColor={0,0,255},\n              textString=\"s_rel\"),\n            Line(points={{-100,-29},{-100,-61}}, color={0,0,0}),\n            Line(points={{100,-61},{100,-28}}, color={0,0,0}),\n            Line(points={{-98,-60},{98,-60}}, color={0,0,0}),\n            Polygon(\n              points={{-101,-60},{-96,-59},{-96,-61},{-101,-60}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Polygon(\n              points={{100,-60},{95,-61},{95,-59},{100,-60}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid)}),\n        Icon(coordinateSystem(\n          preserveAspectRatio=true,\n          extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-98,0},{-48,0}}, color={0,127,0}),\n            Line(\n              points={{-48,38},{-48,-38}},\n              color={0,0,0},\n              thickness=1),\n            Line(points={{8,-10},{8,-48}},\n                                        color={0,0,0}),\n            Line(points={{-2,-50},{38,-50},{38,-6},{-2,-6}},\n                                                         color={0,0,0}),\n            Line(points={{38,-28},{72,-28}},\n                                           color={0,0,0}),\n            Line(\n              points={{-12,-38},{-12,36}},\n              color={0,0,0},\n              thickness=1),\n            Line(points={{-12,-28},{8,-28}},\n                                           color={0,0,0}),\n            Line(points={{-12,24},{-6,24}},   color={0,0,0}),\n            Line(points={{72,0},{98,0}}, color={0,127,0}),\n            Line(points={{72,22},{72,-42}}, color={0,0,0}),\n            Line(points={{-6,24},{6,34},{18,14},{34,34},{46,14},{60,34},{68,22}},\n                             color={0,0,0}),\n            Rectangle(\n              extent={{8,-6},{38,-50}},\n              lineColor={0,0,0},\n              fillColor={192,192,192},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-52,-70},{28,-70}}, color={0,0,0}),\n            Polygon(\n              points={{58,-70},{28,-60},{28,-80},{58,-70}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-150,100},{150,60}},\n              textString=\"%name\",\n              lineColor={0,0,255},\n              pattern=LinePattern.Dot),\n            Text(\n              extent={{-150,-125},{150,-95}},\n              lineColor={0,0,0},\n              textString=\"c=%c\"),\n            Text(\n              extent={{-150,-160},{150,-130}},\n              lineColor={0,0,0},\n              textString=\"d=%d\"),\n            Line(points={{68,22},{72,22}},    color={0,0,0}),\n            Line(visible=useHeatPort,\n              points={{-100,-100},{-100,-44},{22,-44},{22,-28}},\n              color={191,0,0},\n              pattern=LinePattern.Dot,\n              smooth=Smooth.None)}));\n    end ElastoGap;\n\n    model SupportFriction \"Coulomb friction in support\"\n\n      extends\n        Modelica.Mechanics.Translational.Interfaces.PartialElementaryTwoFlangesAndSupport2;\n      extends\n        Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;\n\n      parameter Real f_pos[:, 2]=[0, 1]\n        \"[v, f] Positive sliding friction characteristic (v>=0)\";\n      parameter Real peak(final min=1) = 1\n        \"peak*f_pos[1,2] = Maximum friction force for v==0\";\n      extends Translational.Interfaces.PartialFriction;\n\n      SI.Position s;\n      SI.Force f \"Friction force\";\n      SI.Velocity v \"Absolute velocity of flange_a and flange_b\";\n      SI.Acceleration a \"Absolute acceleration of flange_a and flange_b\";\n    equation\n      // Constant auxiliary variables\n      f0 = Modelica.Math.tempInterpol1(0, f_pos, 2);\n      f0_max = peak*f0;\n      free = false;\n\n      s = flange_a.s - s_support;\n      flange_a.s = flange_b.s;\n\n    // velocity and acceleration of flanges\n      v = der(s);\n      a = der(v);\n      v_relfric = v;\n      a_relfric = a;\n\n    // Friction force\n      flange_a.f + flange_b.f - f = 0;\n\n    // Friction force\n      f = if locked then sa*unitForce else\n         (if startForward then          Modelica.Math.tempInterpol1( v, f_pos, 2) else\n          if startBackward then        -Modelica.Math.tempInterpol1(-v, f_pos, 2) else\n          if pre(mode) == Forward then  Modelica.Math.tempInterpol1( v, f_pos, 2) else\n                                       -Modelica.Math.tempInterpol1(-v, f_pos, 2));\n\n      lossPower = f*v_relfric;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis element describes <b>Coulomb friction</b> in <b>support</b>,\ni.e., a frictional force acting between a flange and the housing.\nThe positive sliding friction force \\\"f\\\" has to be defined\nby table \\\"f_pos\\\" as function of the absolute velocity \\\"v\\\".\nE.g.\n</p>\n<pre>\n       v |   f\n      ---+-----\n       0 |   0\n       1 |   2\n       2 |   5\n       3 |   8\n</pre>\n<p>\ngives the following table:\n</p>\n<pre>\n   f_pos = [0, 0; 1, 2; 2, 5; 3, 8];\n</pre>\n<p>\nCurrently, only linear interpolation in the table is supported.\nOutside of the table, extrapolation through the last\ntwo table entries is used. It is assumed that the negative\nsliding friction force has the same characteristic with negative\nvalues. Friction is modelled in the following way:\n</p>\n<p>\nWhen the absolute velocity \\\"v\\\" is not zero, the friction force\nis a function of v and of a constant normal force. This dependency\nis defined via table f_pos and can be determined by measurements,\ne.g., by driving the gear with constant velocity and measuring the\nneeded driving force (= friction force).\n</p>\n<p>\nWhen the absolute velocity becomes zero, the elements\nconnected by the friction element become stuck, i.e., the absolute\nposition remains constant. In this phase the friction force is\ncalculated from a force balance due to the requirement, that\nthe absolute acceleration shall be zero.  The elements begin\nto slide when the friction force exceeds a threshold value,\ncalled the maximum static friction force, computed via:\n</p>\n<pre>\n   maximum_static_friction = <b>peak</b> * sliding_friction(v=0)  (<b>peak</b> >= 1)\n</pre>\n<p>\nThis procedure is implemented in a \\\"clean\\\" way by state events and\nleads to continuous/discrete systems of equations if friction elements\nare dynamically coupled which have to be solved by appropriate\nnumerical methods. The method is described in:\n</p>\n<dl>\n<dt>Otter M., Elmqvist H., and Mattsson S.E. (1999):\n<dd><b>Hybrid Modeling in Modelica based on the Synchronous\n    Data Flow Principle</b>. CACSD'99, Aug. 22.-26, Hawaii.\n</dl>\n<p>\nMore precise friction models take into account the elasticity of the\nmaterial when the two elements are \\\"stuck\\\", as well as other effects,\nlike hysteresis. This has the advantage that the friction element can\nbe completely described by a differential equation without events. The\ndrawback is that the system becomes stiff (about 10-20 times slower\nsimulation) and that more material constants have to be supplied which\nrequires more sophisticated identification. For more details, see the\nfollowing references, especially (Armstrong and Canudas de Witt 1996):\n</p>\n<dl>\n<dt>Armstrong B. (1991):\n<dd><b>Control of Machines with Friction</b>. Kluwer Academic\n    Press, Boston MA.<br><br>\n<dt>Armstrong B., and Canudas de Wit C. (1996):\n<dd><b>Friction Modeling and Compensation.</b>\n    The Control Handbook, edited by W.S.Levine, CRC Press,\n    pp. 1369-1382.<br><br>\n<dt>Canudas de Wit C., Olsson H., Astroem K.J., and Lischinsky P. (1995):\n<dd><b>A new model for control of systems with friction.</b>\n    IEEE Transactions on Automatic Control, Vol. 40, No. 3, pp. 419-425.<br><br>\n</dl>\n\n</html>\"), Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}),\n                        graphics={\n            Rectangle(\n              extent={{-90,10},{90,-10}},\n              lineColor={0,127,0},\n              fillColor={215,215,215},\n              fillPattern=FillPattern.Solid),\n            Ellipse(\n              extent={{-48,-10},{-28,-30}},\n              lineColor={95,95,95},\n              fillPattern=FillPattern.Sphere,\n              fillColor={175,175,175}),\n            Ellipse(\n              extent={{-10,-10},{10,-30}},\n              lineColor={95,95,95},\n              fillPattern=FillPattern.Sphere,\n              fillColor={175,175,175}),\n            Ellipse(\n              extent={{30,-10},{50,-30}},\n              lineColor={95,95,95},\n              fillPattern=FillPattern.Sphere,\n              fillColor={175,175,175}),\n            Polygon(\n              points={{-60,-30},{60,-30},{60,-12},{80,-12},{80,-50},{-80,-50},{\n                  -80,-12},{-60,-12},{-60,-30}},\n              lineColor={95,95,95},\n              fillPattern=FillPattern.Solid,\n              smooth=Smooth.None,\n              fillColor={175,175,175}),\n            Text(\n              extent={{-150,100},{150,60}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Line(points={{-10,-85},{-5,-80}}, color={0,0,0}),\n            Line(points={{-5,-90},{5,-80}}, color={0,0,0}),\n            Line(points={{-10,-90},{0,-80}}, color={0,0,0}),\n            Line(points={{0,-90},{10,-80}}, color={0,0,0}),\n            Polygon(\n              points={{-60,-50},{-20,-80},{20,-80},{60,-50},{-60,-50}},\n              lineColor={95,95,95},\n              smooth=Smooth.None,\n              fillColor={175,175,175},\n              fillPattern=FillPattern.Solid),\n            Ellipse(\n              extent={{-50,30},{-30,10}},\n              lineColor={95,95,95},\n              fillPattern=FillPattern.Sphere,\n              fillColor={175,175,175}),\n            Ellipse(\n              extent={{-10,30},{10,10}},\n              lineColor={95,95,95},\n              fillPattern=FillPattern.Sphere,\n              fillColor={175,175,175}),\n            Ellipse(\n              extent={{30,30},{50,10}},\n              lineColor={95,95,95},\n              fillPattern=FillPattern.Sphere,\n              fillColor={175,175,175}),\n            Polygon(\n              points={{-60,30},{60,30},{60,12},{80,12},{80,50},{-80,50},{-80,12},\n                  {-60,12},{-60,30}},\n              lineColor={95,95,95},\n              fillPattern=FillPattern.Solid,\n              smooth=Smooth.None,\n              fillColor={175,175,175}),\n            Line(visible=useHeatPort,\n              points={{-100,-100},{-100,-20},{0,-20}},\n              color={191,0,0},\n              pattern=LinePattern.Dot,\n              smooth=Smooth.None)}));\n    end SupportFriction;\n\n    model Brake \"Brake based on Coulomb friction\"\n\n      extends\n        Modelica.Mechanics.Translational.Interfaces.PartialElementaryTwoFlangesAndSupport2;\n      extends\n        Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;\n      parameter Real mue_pos[:, 2]=[0, 0.5]\n        \"[v, f] Positive sliding friction characteristic (v>=0)\";\n      parameter Real peak(final min=1) = 1\n        \"peak*mue_pos[1,2] = Maximum friction force for v==0\";\n      parameter Real cgeo(final min=0) = 1\n        \"Geometry constant containing friction distribution assumption\";\n      parameter SI.Force fn_max(final min=0, start=1) \"Maximum normal force\";\n      extends Translational.Interfaces.PartialFriction;\n\n      SI.Position s;\n      SI.Force f \"Brake friction force\";\n      SI.Velocity v \"Absolute velocity of flange_a and flange_b\";\n      SI.Acceleration a \"Absolute acceleration of flange_a and flange_b\";\n\n      Real mue0 \"Friction coefficient for v=0 and forward sliding\";\n      SI.Force fn \"Normal force (=fn_max*f_normalized)\";\n\n      // Constant auxiliary variable\n      Modelica.Blocks.Interfaces.RealInput f_normalized\n        \"Normalized force signal 0..1 (normal force = fn_max*f_normalized; brake is active if > 0)\"\n        annotation (Placement(transformation(\n            origin={0,110},\n            extent={{20,-20},{-20,20}},\n            rotation=90)));\n    equation\n      mue0 = Modelica.Math.tempInterpol1(0, mue_pos, 2);\n\n      s = s_a;\n      s = s_b;\n\n      // velocity and acceleration of flanges flange_a and flange_b\n      v = der(s);\n      a = der(v);\n      v_relfric = v;\n      a_relfric = a;\n\n      // Friction force, normal force and friction force for v_rel=0\n      flange_a.f + flange_b.f - f = 0;\n      fn = fn_max*f_normalized;\n      f0 = mue0*cgeo*fn;\n      f0_max = peak*f0;\n      free = fn <= 0;\n\n      // Friction force\n      f = if locked then sa*unitForce else\n          if free then   0 else\n          cgeo*fn*(if startForward then          Modelica.Math.tempInterpol1( v, mue_pos, 2) else\n                   if startBackward then        -Modelica.Math.tempInterpol1(-v, mue_pos, 2) else\n                   if pre(mode) == Forward then  Modelica.Math.tempInterpol1( v, mue_pos, 2) else\n                                                -Modelica.Math.tempInterpol1(-v, mue_pos, 2));\n\n      lossPower = f*v_relfric;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis component models a <b>brake</b>, i.e., a component where a frictional\nforce is acting between the housing and a flange and a controlled normal\nforce presses the flange to the housing in order to increase friction.\nThe normal force fn has to be provided as input signal f_normalized in a normalized form\n(0 &le; f_normalized &le; 1),\nfn = fn_max*f_normalized, where fn_max has to be provided as parameter.\nFriction in the brake is modelled in the following way:\n</p>\n<p>\nWhen the absolute velocity \\\"v\\\" is not zero, the friction force\nis a function of the velocity dependent friction coefficient  mue(v) , of\nthe normal force \\\"fn\\\", and of a geometry constant \\\"cgeo\\\" which takes into\naccount the geometry of the device and the assumptions on the friction\ndistributions:\n</p>\n<pre>\n        frictional_force = <b>cgeo</b> * <b>mue</b>(v) * <b>fn</b>\n</pre>\n<p>\n   Typical values of coefficients of friction:\n</p>\n<pre>\n      dry operation   :  <b>mue</b> = 0.2 .. 0.4\n      operating in oil:  <b>mue</b> = 0.05 .. 0.1\n</pre>\n<p>\n    The positive part of the friction characteristic <b>mue</b>(v),\n    v >= 0, is defined via table mue_pos (first column = v,\n    second column = mue). Currently, only linear interpolation in\n    the table is supported.\n</p>\n<p>\n   When the absolute velocity becomes zero, the elements\n   connected by the friction element become stuck, i.e., the absolute\n   position remains constant. In this phase the friction force is\n   calculated from a force balance due to the requirement, that\n   the absolute acceleration shall be zero.  The elements begin\n   to slide when the friction force exceeds a threshold value,\n   called the  maximum static friction force, computed via:\n</p>\n<pre>\n       frictional_force = <b>peak</b> * <b>cgeo</b> * <b>mue</b>(w=0) * <b>fn</b>   (<b>peak</b> >= 1)\n</pre>\n<p>\nThis procedure is implemented in a \\\"clean\\\" way by state events and\nleads to continuous/discrete systems of equations if friction elements\nare dynamically coupled. The method is described in:\n</p>\n<dl>\n<dt>Otter M., Elmqvist H., and Mattsson S.E. (1999):\n<dd><b>Hybrid Modeling in Modelica based on the Synchronous\n    Data Flow Principle</b>. CACSD'99, Aug. 22.-26, Hawaii.\n</dl>\n<p>\nMore precise friction models take into account the elasticity of the\nmaterial when the two elements are \\\"stuck\\\", as well as other effects,\nlike hysteresis. This has the advantage that the friction element can\nbe completely described by a differential equation without events. The\ndrawback is that the system becomes stiff (about 10-20 times slower\nsimulation) and that more material constants have to be supplied which\nrequires more sophisticated identification. For more details, see the\nfollowing references, especially (Armstrong and Canudas de Witt 1996):\n</p>\n<dl>\n<dt>Armstrong B. (1991):\n<dd><b>Control of Machines with Friction</b>. Kluwer Academic\n    Press, Boston MA.<br><br>\n<dt>Armstrong B., and Canudas de Wit C. (1996):\n<dd><b>Friction Modeling and Compensation.</b>\n    The Control Handbook, edited by W.S.Levine, CRC Press,\n    pp. 1369-1382.<br><br>\n<dt>Canudas de Wit C., Olsson H., Astroem K.J., and Lischinsky P. (1995):\n<dd><b>A new model for control of systems with friction.</b>\n    IEEE Transactions on Automatic Control, Vol. 40, No. 3, pp. 419-425.<br><br>\n</dl>\n</html>\"), Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}),\n                        graphics={\n            Rectangle(\n              extent={{-90,10},{90,-10}},\n              lineColor={0,127,0},\n              fillColor={215,215,215},\n              fillPattern=FillPattern.Solid),\n            Rectangle(\n              extent={{-20,30},{20,20}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Rectangle(\n              extent={{-20,-20},{20,-30}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Polygon(\n              points={{0,-30},{10,-50},{-10,-50},{0,-30}},\n              lineColor={0,0,127},\n              fillColor={0,0,127},\n              fillPattern=FillPattern.Solid),\n            Polygon(\n              points={{10,50},{-10,50},{0,30},{10,50}},\n              lineColor={0,0,127},\n              fillColor={0,0,127},\n              fillPattern=FillPattern.Solid),\n            Line(\n              points={{0,90},{0,50}},\n              color={0,0,0},\n              smooth=Smooth.None),\n            Rectangle(\n              extent={{20,28},{30,22}},\n              lineColor={175,175,175},\n              fillColor={175,175,175},\n              fillPattern=FillPattern.Solid),\n            Rectangle(\n              extent={{20,-22},{30,-28}},\n              lineColor={175,175,175},\n              fillColor={175,175,175},\n              fillPattern=FillPattern.Solid),\n            Rectangle(\n              extent={{30,28},{36,-102}},\n              lineColor={175,175,175},\n              fillColor={175,175,175},\n              fillPattern=FillPattern.Solid),\n            Rectangle(\n              extent={{14,-96},{30,-102}},\n              lineColor={175,175,175},\n              fillColor={175,175,175},\n              fillPattern=FillPattern.Solid),\n            Line(\n              points={{0,-50},{0,-60},{-40,-50},{-40,48},{0,60},{0,90}},\n              color={0,0,0},\n              smooth=Smooth.None),\n            Text(\n              extent={{-150,-120},{150,-160}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Line(visible=useHeatPort,\n              points={{-100,-102},{-100,-16},{0,-16}},\n              color={191,0,0},\n              pattern=LinePattern.Dot,\n              smooth=Smooth.None)}));\n    end Brake;\n\n    model IdealGearR2T\n      \"Gearbox transforming rotational into translational motion\"\n      extends Modelica.Mechanics.Rotational.Components.IdealGearR2T;\n      annotation (Documentation(info=\"<html>\n<p>Couples rotational and translational motion, like a toothed wheel with a toothed rack, specifying the ratio of rotational / translational motion.</p>\n</html>\"));\n    end IdealGearR2T;\n\n    model IdealRollingWheel\n      \"Simple 1-dim. model of an ideal rolling wheel without inertia\"\n      extends Modelica.Mechanics.Rotational.Components.IdealRollingWheel;\n      annotation (Documentation(info=\"<html>\n<p>Couples rotational and translational motion, like an ideal rolling wheel, specifying the wheel radius.</p>\n</html>\"));\n    end IdealRollingWheel;\n\n    model InitializeFlange\n      \"Initializes a flange with pre-defined position, speed and acceleration (usually, this is reference data from a control bus)\"\n      extends Modelica.Blocks.Icons.Block;\n      parameter Boolean use_s_start = true\n        \"= true, if initial position is defined by input s_start, otherwise not initialized\";\n      parameter Boolean use_v_start = true\n        \"= true, if initial speed is defined by input v_start, otherwise not initialized\";\n      parameter Boolean use_a_start = true\n        \"= true, if initial acceleration is defined by input a_start, otherwise not initialized\";\n\n      parameter StateSelect stateSelect=StateSelect.default\n        \"Priority to use flange angle and speed as states\";\n\n      Modelica.Blocks.Interfaces.RealInput s_start(unit=\"m\") if use_s_start\n        \"Initial position of flange\"\n        annotation (Placement(transformation(extent={{-140,40},{-100,80}},\n              rotation=0)));\n      Modelica.Blocks.Interfaces.RealInput v_start(unit=\"m/s\") if use_v_start\n        \"Initial speed of flange\"\n        annotation (Placement(transformation(extent={{-140,-20},{-100,20}},\n              rotation=0)));\n      Modelica.Blocks.Interfaces.RealInput a_start(unit=\"m/s2\") if use_a_start\n        \"Initial angular acceleration of flange\"\n        annotation (Placement(transformation(extent={{-140,-80},{-100,-40}},\n              rotation=0)));\n      Interfaces.Flange_b flange \"Flange that is initialized\" annotation (Placement(\n            transformation(extent={{90,-10},{110,10}}, rotation=0)));\n\n      Modelica.SIunits.Position s_flange(stateSelect=stateSelect)=flange.s\n        \"Flange position\";\n      Modelica.SIunits.Velocity v_flange(stateSelect=stateSelect)= der(s_flange)\n        \"= der(s_flange)\";\n\n    protected\n      encapsulated model Set_s_start \"Set s_start\"\n        import Modelica;\n        extends Modelica.Blocks.Icons.Block;\n        Modelica.Blocks.Interfaces.RealInput s_start(unit=\"m\") \"Start position\"\n        annotation (HideResult=true, Placement(transformation(extent={{-140,-20},{\n                -100,20}}, rotation=0)));\n\n        Modelica.Mechanics.Translational.Interfaces.Flange_b flange\n                                                               annotation (Placement(\n            transformation(extent={{90,-10},{110,10}}, rotation=0)));\n      initial equation\n        flange.s = s_start;\n      equation\n        flange.f = 0;\n\n      end Set_s_start;\n\n      encapsulated model Set_v_start \"Set v_start\"\n        import Modelica;\n        extends Modelica.Blocks.Icons.Block;\n        Modelica.Blocks.Interfaces.RealInput v_start(unit=\"m/s\") \"Start velocity\"\n        annotation (HideResult=true, Placement(transformation(extent={{-140,-20},{\n                -100,20}}, rotation=0)));\n\n        Modelica.Mechanics.Translational.Interfaces.Flange_b flange\n                                                               annotation (Placement(\n            transformation(extent={{90,-10},{110,10}}, rotation=0)));\n      initial equation\n        der(flange.s) = v_start;\n      equation\n        flange.f = 0;\n\n      end Set_v_start;\n\n      encapsulated model Set_a_start \"Set a_start\"\n        import Modelica;\n        extends Modelica.Blocks.Icons.Block;\n        Modelica.Blocks.Interfaces.RealInput a_start(unit=\"m/s2\") \"Start acceleration\"\n        annotation (HideResult=true, Placement(transformation(extent={{-140,-20},{\n                -100,20}}, rotation=0)));\n\n        Modelica.Mechanics.Translational.Interfaces.Flange_b flange(s(stateSelect=StateSelect.avoid))\n            annotation (Placement(\n            transformation(extent={{90,-10},{110,10}}, rotation=0)));\n        Modelica.SIunits.Velocity v = der(flange.s)        annotation(HideResult=true);\n      initial equation\n        der(v) = a_start;\n      equation\n        flange.f = 0;\n\n      end Set_a_start;\n\n      encapsulated model Set_flange_f \"Set flange_f to zero\"\n        import Modelica;\n        extends Modelica.Blocks.Icons.Block;\n        Modelica.Mechanics.Translational.Interfaces.Flange_b flange\n            annotation (Placement(\n            transformation(extent={{90,-10},{110,10}}, rotation=0)));\n      equation\n        flange.f = 0;\n      end Set_flange_f;\n    protected\n      Set_s_start set_s_start if use_s_start annotation (Placement(\n            transformation(extent={{-20,50},{0,70}}, rotation=0)));\n      Set_v_start set_v_start if use_v_start\n                              annotation (Placement(transformation(extent={{-20,\n                -10},{0,10}}, rotation=0)));\n      Set_a_start set_a_start if use_a_start\n                              annotation (Placement(transformation(extent={{-20,\n                -70},{0,-50}}, rotation=0)));\n      Set_flange_f set_flange_f annotation (Placement(transformation(extent={\n                {20,-100},{40,-80}}, rotation=0)));\n    equation\n      connect(set_s_start.flange, flange) annotation (Line(\n          points={{0,60},{60,60},{60,0},{100,0}},\n          color={0,0,0},\n          smooth=Smooth.None));\n      connect(set_v_start.flange, flange) annotation (Line(\n          points={{0,0},{100,0}},\n          color={0,0,0},\n          smooth=Smooth.None));\n      connect(set_a_start.flange, flange) annotation (Line(\n          points={{0,-60},{60,-60},{60,0},{100,0}},\n          color={0,0,0},\n          smooth=Smooth.None));\n      connect(set_flange_f.flange, flange) annotation (Line(\n          points={{40,-90},{60,-90},{60,0},{100,0}},\n          color={0,0,0},\n          smooth=Smooth.None));\n      connect(s_start, set_s_start.s_start) annotation (Line(\n          points={{-120,60},{-22,60}},\n          color={0,0,127},\n          smooth=Smooth.None));\n      connect(v_start, set_v_start.v_start) annotation (Line(\n          points={{-120,0},{-22,0}},\n          color={0,0,127},\n          smooth=Smooth.None));\n      connect(a_start, set_a_start.a_start) annotation (Line(\n          points={{-120,-60},{-22,-60}},\n          color={0,0,127},\n          smooth=Smooth.None));\n      annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,\n                -100},{100,100}}), graphics={\n            Text(\n              extent={{-94,74},{68,46}},\n              lineColor={0,0,0},\n              textString=\"s_start\"),\n            Text(\n              extent={{-94,16},{70,-14}},\n              lineColor={0,0,0},\n              textString=\"v_start\"),\n            Text(\n              extent={{-94,-46},{66,-74}},\n              lineColor={0,0,0},\n              textString=\"a_start\")}),\n        Documentation(info=\"<html>\n<p>\nThis component is used to optionally initialize the position, speed,\nand/or acceleration of the flange to which this component\nis connected. Via parameters use_s_start, use_v_start, use_a_start\nthe corresponding input signals s_start, v_start, a_start are conditionally\nactivated. If an input is activated, the corresponding flange property\nis initialized with the input value at start time.\n</p>\n\n<p>\nFor example, if \\\"use_s_start = true\\\", then flange.s is initialized\nwith the value of the input signal \\\"s_start\\\" at the start time.\n</p>\n\n<p>\nAdditionally, it is optionally possible to define the \\\"StateSelect\\\"\nattribute of the flange position and the flange speed via parameter\n\\\"stateSelection\\\".\n</p>\n\n<p>\nThis component is especially useful when the initial values of a flange\nshall be set according to reference signals of a controller that are\nprovided via a signal bus.\n</p>\n\n</html>\"));\n    end InitializeFlange;\n\n    model MassWithStopAndFriction\n      \"Sliding mass with hard stop and Stribeck friction\"\n      extends PartialFrictionWithStop;\n      SI.Velocity v(start=0, stateSelect = StateSelect.always)\n        \"Absolute velocity of flange_a and flange_b\";\n      SI.Acceleration a(start=0)\n        \"Absolute acceleration of flange_a and flange_b\";\n      parameter Modelica.SIunits.Mass m(start=1) \"Mass\";\n      parameter Real F_prop(final unit=\"N.s/m\", final min=0, start = 1)\n        \"Velocity dependent friction\";\n      parameter Modelica.SIunits.Force F_Coulomb(start=5)\n        \"Constant friction: Coulomb force\";\n      parameter Modelica.SIunits.Force F_Stribeck(start=10) \"Stribeck effect\";\n      parameter Real fexp(final unit=\"s/m\", final min=0, start = 2)\n        \"Exponential decay\";\n    extends\n        Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;\n      Integer stopped;\n    encapsulated partial model PartialFrictionWithStop\n        \"Base model of Coulomb friction elements with stop\"\n\n        import SI = Modelica.SIunits;\n        import Modelica.Mechanics.Translational.Interfaces.PartialRigid;\n      parameter SI.Position smax(start= 25)\n          \"Right stop for (right end of) sliding mass\";\n      parameter SI.Position smin(start=-25)\n          \"Left stop for (left end of) sliding mass\";\n      parameter SI.Velocity v_small=1e-3\n          \"Relative velocity near to zero (see model info text)\"\n         annotation(Dialog(tab=\"Advanced\"));\n    // Equations to define the following variables have to be defined in subclasses\n      SI.Velocity v_relfric \"Relative velocity between frictional surfaces\";\n      SI.Acceleration a_relfric\n          \"Relative acceleration between frictional surfaces\";\n      SI.Force f\n          \"Friction force (positive, if directed in opposite direction of v_rel)\";\n      SI.Force f0 \"Friction force for v=0 and forward sliding\";\n      SI.Force f0_max \"Maximum friction force for v=0 and locked\";\n      Boolean free \"true, if frictional element is not active\";\n    // Equations to define the following variables are given in this class\n      Real sa(unit=\"1\")\n          \"Path parameter of friction characteristic f = f(a_relfric)\";\n      Boolean startForward(start=false, fixed=true)\n          \"= true, if v_rel=0 and start of forward sliding or v_rel > v_small\";\n      Boolean startBackward(start=false, fixed=true)\n          \"= true, if v_rel=0 and start of backward sliding or v_rel < -v_small\";\n      Boolean locked(start=false) \"true, if v_rel=0 and not sliding\";\n      extends PartialRigid(s(start=0, stateSelect = StateSelect.always));\n      constant Integer Unknown=3 \"Value of mode is not known\";\n      constant Integer Free=2 \"Element is not active\";\n      constant Integer Forward=1 \"v_rel > 0 (forward sliding)\";\n      constant Integer Stuck=0\n          \"v_rel = 0 (forward sliding, locked or backward sliding)\";\n      constant Integer Backward=-1 \"v_rel < 0 (backward sliding)\";\n      Integer mode(\n        final min=Backward,\n        final max=Unknown,\n        start=Unknown, fixed=true);\n      protected\n      constant SI.Acceleration unitAcceleration = 1 annotation(HideResult=true);\n      constant SI.Force unitForce = 1 annotation(HideResult=true);\n    equation\n    /* Friction characteristic\n   (locked is introduced to help the Modelica translator determining\n   the different structural configurations,\n   if for each configuration special code shall be generated)\n*/\n      startForward = pre(mode) == Stuck and (sa > f0_max/unitForce and s < (smax - L/2) or\n            pre(startForward) and sa > f0/unitForce and s < (smax - L/2)) or pre(mode)\n         == Backward and v_relfric > v_small or initial() and (v_relfric > 0);\n      startBackward = pre(mode) == Stuck and (sa < -f0_max/unitForce and s > (smin + L/2) or\n            pre(startBackward) and sa < -f0/unitForce and s > (smin + L/2)) or pre(mode)\n         == Forward and v_relfric < -v_small or initial() and (v_relfric < 0);\n      locked = not free and\n        not (pre(mode) == Forward or startForward or pre(mode) == Backward or startBackward);\n\n      a_relfric/unitAcceleration = if locked then               0 else\n                                   if free then                 sa else\n                                   if startForward then         sa - f0_max/unitForce else\n                                   if startBackward then        sa + f0_max/unitForce else\n                                   if pre(mode) == Forward then sa - f0_max/unitForce else\n                                                                sa + f0_max/unitForce;\n\n    /* Friction torque has to be defined in a subclass. Example for a clutch:\n   f = if locked then sa else\n       if free then   0 else\n       cgeo*fn*(if startForward then          Math.tempInterpol1( v_relfric, mue_pos, 2) else\n                if startBackward then        -Math.tempInterpol1(-v_relfric, mue_pos, 2) else\n                if pre(mode) == Forward then  Math.tempInterpol1( v_relfric, mue_pos, 2) else\n                                             -Math.tempInterpol1(-v_relfric, mue_pos, 2));\n*/\n    // finite state machine to determine configuration\n      mode = if free then Free else\n        (if (pre(mode) == Forward  or pre(mode) == Free or startForward)  and v_relfric > 0 and s < (smax - L/2) then\n           Forward else\n         if (pre(mode) == Backward or pre(mode) == Free or startBackward) and v_relfric < 0 and s > (smin + L/2) then\n           Backward else\n           Stuck);\n      annotation (Documentation(info=\"<html>\n<p>\nBasic model for Coulomb friction that models the stuck phase in a reliable way.<br>\nAdditionally, a left and right stop are handled.\n</p>\n</html>\"));\n    end PartialFrictionWithStop;\n    equation\n      // Constant auxiliary variables\n      f0 = (F_Coulomb + F_Stribeck);\n      f0_max = f0*1.001;\n      free = f0 <= 0 and F_prop <= 0 and s > smin + L/2 and s < smax - L/2;\n      // Velocity and acceleration of flanges\n      v = der(s);\n      a = der(v);\n      v_relfric = v;\n      a_relfric = a;\n    // Equilibrium of forces\n      0 = flange_a.f + flange_b.f - f - m*der(v);\n    // Friction force\n      f = if locked then sa*unitForce else\n          if free then   0 else\n                        (if startForward then         F_prop*v + F_Coulomb + F_Stribeck else\n                         if startBackward then        F_prop*v - F_Coulomb - F_Stribeck else\n                         if pre(mode) == Forward then F_prop*v + F_Coulomb + F_Stribeck*exp(-fexp*abs(v)) else\n                                                      F_prop*v - F_Coulomb - F_Stribeck*exp(-fexp*abs(v)));\n      lossPower = f*v_relfric;\n    equation\n      when (initial()) then\n        assert(s > smin + L/2 or s >= smin + L/2 and v >= 0,\n          \"Error in initialization of hard stop. (s - L/2) must be >= smin\\n\"+\n          \"(s=\" + String(s) + \", L=\" + String(L) + \", smin=\" + String(smin) + \")\");\n        assert(s < smax - L/2 or s <= smax - L/2 and v <= 0,\n          \"Error in initialization of hard stop. (s + L/2) must be <= smax\\n\"+\n          \"(s=\" + String(s) + \", L=\" + String(L) + \", smax=\" + String(smax) + \")\");\n      end when;\n\n      // Define events for hard stops and reinitialize the state variables velocity v and position s\n      stopped = if s <= smin + L/2 then -1 else if s >= smax - L/2 then +1 else 0;\n      when stopped <> 0 then\n        reinit(s, if stopped < 0 then smin + L/2 else smax - L/2);\n        reinit(v, 0);\n      end when;\n    /*\nVersion 1:\n\n  when not (s < smax - L/2) then\n    reinit(s, smax - L/2);\n    if (not initial() or v>0) then\n      reinit(v, 0);\n    end if;\n  end when;\n\n  when not (s > smin + L/2) then\n    reinit(s, smin + L/2);\n    if (not initial() or v<0) then\n      reinit(v, 0);\n    end if;\n  end when;\n\nVersion 2:\n        stopped := if s <= smin + L/2 then -1 else if s >= smax - L/2 then +1 else 0;\n      when (initial()) then\n        assert(s > smin + L/2 or s >= smin + L/2 and v >= 0,\n          \"Error in initialization of hard stop. (s - L/2) must be >= smin\\n\"+\n          \"(s=\" + String(s) + \", L=\" + String(L) + \", smin=\" + String(smin) + \")\");\n        assert(s < smax - L/2 or s <= smax - L/2 and v <= 0,\n          \"Error in initialization of hard stop. (s + L/2) must be <= smax\\n\"+\n          \"(s=\" + String(s) + \", L=\" + String(L) + \", smax=\" + String(smax) + \")\");\n      end when;\n      when stopped <> 0 then\n        reinit(s, if stopped < 0 then smin + L/2 else smax - L/2);\n        if (not initial() or stopped*v>0) then\n           reinit(v, 0);\n        end if;\n      end when;\n*/\n      annotation (\n        Documentation(info=\"<html>\n<p>This element describes the <i>Stribeck friction characteristics</i> of a sliding mass,\ni. e. the frictional force acting between the sliding mass and the support. Included is a\n<i>hard stop</i> for the position. </p>\n<p>\nThe surface is fixed and there is friction between sliding mass and surface.\nThe frictional force f is given for positive velocity v by:\n</p>\n<blockquote><pre>\nf = F_Coulomb + F_prop * v + F_Stribeck * exp (-fexp * v)\n</pre></blockquote>\n\n<p>\n<IMG src=\\\"modelica://Modelica/Resources/Images/Mechanics/Translational/Stribeck.png\\\">\n</p>\n\n<p>\nThe distance between the left and the right connector is given by parameter L.\nThe position of the center of gravity, coordinate s, is in the middle between\nthe two flanges.</p>\n<p>\nThere are hard stops at smax and smin, i. e. if\n<i><code>flange_a.s &gt;= smin</code></i> and <i><code>flange_b.s &lt;= xmax </code></i> the sliding mass can move freely.</p>\n<p>When the absolute velocity becomes zero, the sliding mass becomes stuck, i.e., the absolute position remains constant. In this phase the\nfriction force is calculated from a force balance due to the requirement that the\nabsolute acceleration shall be zero. The elements begin to slide when the friction\nforce exceeds a threshold value, called the maximum static friction force, computed via:</p>\n<blockquote><pre>\n   maximum_static_friction =  F_Coulomb + F_Stribeck\n</pre></blockquote>\n<p>\n<font color=\\\"#ff0000\\\"> <b>This requires the states Stop.s and Stop.v</b> </font>. If these states are eliminated during the index reduction\nthe model will not work. To avoid this any inertias should be connected via springs\nto the Stop element, other sliding masses, dampers or hydraulic chambers must be avoided.</p>\n<p>For more details of the used friction model see the following reference: </p>\n\n<dl>\n<dt>Beater P. (1999):</dt>\n<dd><a href=\\\"http://www.springer.de/cgi-bin/search_book.pl?isbn=3-540-65444-5\\\">\nEntwurf hydraulischer Maschinen</a>. Springer Verlag Berlin Heidelberg New York.</dd>\n</dl>\n\n<P>The friction model is implemented in a \\\"clean\\\" way by state events and leads to\ncontinuous/discrete systems of equations which have to be solved by appropriate\nnumerical methods. The method is described in: </P>\n\n<dl>\n<dt>Otter M., Elmqvist H., and Mattsson S.E. (1999):</dt>\n<dd><i>Hybrid Modeling in Modelica based on the Synchronous Data Flow Principle</i>.\n    CACSD'99, Aug. 22.-26, Hawaii. </dd>\n</dl>\n\n<P>More precise friction models take into account the elasticity of the material when\nthe two elements are \\\"stuck\\\", as well as other effects, like hysteresis. This has\nthe advantage that the friction element can be completely described by a differential\nequation without events. The drawback is that the system becomes stiff (about 10-20 times\nslower simulation) and that more material constants have to be supplied which requires more\nsophisticated identification. For more details, see the following references, especially\n(Armstrong and Canudas de Witt 1996): </P>\n<dl>\n<dt>\nArmstrong B. (1991):</dt>\n<DD><i>Control of Machines with Friction</i>. Kluwer Academic Press, Boston MA.<BR>\n</DD>\n<DT>Armstrong B., and Canudas de Wit C. (1996): </DT>\n<DD><i>Friction Modeling and Compensation.</i> The Control Handbook, edited by W.S.Levine, CRC Press, pp. 1369-1382.<BR>\n</DD>\n<DT>Canudas de Wit C., Olsson H., Astroem K.J., and Lischinsky P. (1995): </DT>\n<DD>A<i> new model for control of systems with friction.</i> IEEE Transactions on Automatic Control, Vol. 40, No. 3, pp. 419-425.<BR>\n</DD>\n</DL>\n\n<h4>Optional heatPort</h4>\n<p>\nThe dissipated energy is transported in form of heat to the optional heatPort connector\nthat can be enabled via parameter \\\"useHeatPort\\\". Independently whether the heatPort is\nor is not enabled, the dissipated power is defined with variable \\\"lossPower\\\".\nIf contact occurs at the hard stops, the lossPower is not correctly modelled\nat this time instant, because the hard stop would introduce a Dirac impulse\nin the lossPower due to the discontinuously changing kinetic energy of the mass\n(lossPower is the derivative of the kinetic energy at the time instant of the impact).\n</p>\n\n</html>\",   revisions=\"<html>\n<h4>Release Notes:</h4>\n<ul>\n<li><i>First Version from December 7, 1999 by P. Beater (based on Rotational.BearingFriction)</i> </li>\n<li><i>July 14, 2001 by P. Beater, assert on initialization added, diagram modified </i> </li>\n<li><i>October 11, 2001, by Hans Olsson, Dassault Syst&egrave;mes AB, modified assert to handle start at stops,\nmodified event logic such if you have friction parameters equal to zero you do not get events\nbetween the stops.</i> </li>\n<li><i>June 10, 2002 by P. Beater, StateSelect.always for variables s and v (instead of fixed=true). </i> </li>\n</ul>\n</html>\"),\n        Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Polygon(\n              points={{80,-100},{50,-90},{50,-110},{80,-100}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-30,-100},{50,-100}}, color={0,0,0}),\n            Rectangle(\n              extent={{-30,30},{35,-35}},\n              lineColor={0,0,0},\n              fillPattern=FillPattern.Sphere,\n              fillColor={255,255,255}),\n            Line(points={{-90,0},{-30,0}}, color={0,127,0}),\n            Rectangle(\n              extent={{-70,-45},{74,-60}},\n              lineColor={0,0,0},\n              fillColor={192,192,192},\n              fillPattern=FillPattern.Solid),\n            Rectangle(\n              extent={{-63,-15},{-55,-45}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Rectangle(\n              extent={{60,-16},{69,-45}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Line(points={{35,0},{90,0}}, color={0,127,0}),\n            Text(\n              extent={{-150,80},{150,40}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Line(points={{-50,-90},{-30,-70}}, color={0,0,0}),\n            Line(points={{-30,-70},{30,-70}}, color={0,0,0}),\n            Line(points={{-30,-90},{-10,-70}}, color={0,0,0}),\n            Line(points={{-10,-90},{10,-70}}, color={0,0,0}),\n            Line(points={{10,-90},{30,-70}}, color={0,0,0}),\n            Text(\n              extent={{-150,-110},{150,-140}},\n              lineColor={0,0,0},\n              textString=\"m=%m\"),\n            Line(visible=useHeatPort,\n              points={{-100,-100},{-100,-40},{3,-40}},\n              color={191,0,0},\n              pattern=LinePattern.Dot,\n              smooth=Smooth.None)}),\n        Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Polygon(\n              points={{50,-75},{20,-65},{20,-85},{50,-75}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-60,-75},{20,-75}}, color={0,0,0}),\n            Rectangle(\n              extent={{-30,26},{35,-9}},\n              lineColor={0,0,0},\n              fillPattern=FillPattern.Sphere,\n              fillColor={255,255,255}),\n            Line(points={{-90,0},{-30,0}}, color={0,127,0}),\n            Line(points={{35,0},{90,0}}, color={0,127,0}),\n            Rectangle(\n              extent={{-68,-14},{76,-29}},\n              lineColor={0,0,0},\n              fillColor={192,192,192},\n              fillPattern=FillPattern.Solid),\n            Rectangle(\n              extent={{-119,43},{-111,17}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Line(\n              points={{-111,43},{-111,50}},\n              color={0,0,0},\n              pattern=LinePattern.Solid,\n              thickness=0.25,\n              arrow={Arrow.None,Arrow.None}),\n            Line(\n              points={{-151,49},{-113,49}},\n              color={0,0,0},\n              pattern=LinePattern.Solid,\n              thickness=0.25,\n              arrow={Arrow.None,Arrow.None}),\n            Text(\n              extent={{-149,51},{-126,60}},\n              textString=\"s min\",\n              lineColor={0,0,255}),\n            Polygon(\n              points={{-121,52},{-111,49},{-121,46},{-121,52}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Rectangle(\n              extent={{124,42},{132,17}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Line(\n              points={{124,39},{124,87}},\n              color={0,0,0},\n              pattern=LinePattern.Solid,\n              thickness=0.25,\n              arrow={Arrow.None,Arrow.None}),\n            Line(\n              points={{-19,78},{121,78}},\n              color={0,0,0},\n              pattern=LinePattern.Solid,\n              thickness=0.25,\n              arrow={Arrow.None,Arrow.None}),\n            Text(\n              extent={{-17,83},{6,92}},\n              textString=\"s max\",\n              lineColor={0,0,255}),\n            Polygon(\n              points={{114,81},{124,78},{114,75},{114,81}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Line(\n              points={{5,26},{5,63}},\n              color={0,0,0},\n              pattern=LinePattern.Solid,\n              thickness=0.25,\n              arrow={Arrow.None,Arrow.None}),\n            Line(\n              points={{-77,58},{-1,58}},\n              color={0,0,0},\n              pattern=LinePattern.Solid,\n              thickness=0.25,\n              arrow={Arrow.None,Arrow.None}),\n            Text(\n              extent={{-75,60},{-38,71}},\n              textString=\"Position s\",\n              lineColor={0,0,255}),\n            Polygon(\n              points={{-5,61},{5,58},{-5,55},{-5,61}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-100,-10},{-100,-60}}, color={0,0,0}),\n            Line(points={{100,-10},{100,-60}}, color={0,0,0}),\n            Polygon(\n              points={{90,-47},{100,-50},{90,-53},{90,-47}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Polygon(\n              points={{-90,-47},{-90,-53},{-100,-50},{-90,-47}},\n              lineColor={0,0,0},\n              fillColor={0,0,0},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-90,-50},{92,-50}}, color={0,0,0}),\n            Text(\n              extent={{-11,-46},{26,-36}},\n              textString=\"Length L\",\n              lineColor={0,0,255})}));\n    end MassWithStopAndFriction;\n\n    model RelativeStates \"Definition of relative state variables\"\n      extends Translational.Interfaces.PartialTwoFlanges;\n      parameter StateSelect stateSelect=StateSelect.prefer\n        \"Priority to use the relative angle and relative speed as states\";\n      SI.Position s_rel(start=0, stateSelect=StateSelect.prefer)\n        \"Relative position used as state variable\";\n      SI.Velocity v_rel(start=0, stateSelect=StateSelect.prefer)\n        \"Relative velocity used as state variable\";\n      SI.Acceleration a_rel(start=0) \"Relative angular acceleration\";\n\n    equation\n      s_rel = flange_b.s - flange_a.s;\n      v_rel = der(s_rel);\n      a_rel = der(v_rel);\n      flange_a.f = 0;\n      flange_b.f = 0;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nUsually, the absolute position and the absolute velocity of\nModelica.Mechanics.Translational.Inertia models are used as state variables.\nIn some circumstances, relative quantities are better suited, e.g.,\nbecause it may be easier to supply initial values.\nIn such cases, model <b>RelativeStates</b> allows the definition of state variables\nin the following way:\n</p>\n<ul>\n<li> Connect an instance of this model between two flange connectors.</li>\n<li> The <b>relative position</b> and the <b>relative velocity</b>\n     between the two connectors are used as <b>state variables</b>.\n</ul>\n<p>\nAn example is given in the next figure\n</p>\n\n<p>\n<IMG src=\\\"modelica://Modelica/Resources/Images/Mechanics/Translational/relativeStates2.png\\\" ALT=\\\"relativeStates2\\\">\n</p>\n\n<p>\nHere, the relative position and the relative velocity between\nthe two masses are used as state variables. Additionally, the\nsimulator selects either the absolute position and absolute\nvelocity of model mass1 or of model mass2 as state variables.\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Ellipse(\n              extent={{-40,40},{40,-40}},\n              lineColor={0,255,255},\n              fillColor={0,255,255},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-40,40},{40,-40}},\n              textString=\"S\",\n              lineColor={0,0,255}),\n            Line(\n              points={{-92,0},{-42,0}},\n              color={0,0,0},\n              pattern=LinePattern.Dot),\n            Line(\n              points={{40,0},{90,0}},\n              color={0,0,0},\n              pattern=LinePattern.Dot),\n            Text(\n              extent={{-150,90},{150,50}},\n              textString=\"%name\",\n              lineColor={0,0,255})}),\n        Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Ellipse(\n              extent={{-40,40},{40,-40}},\n              lineColor={0,255,255},\n              fillColor={0,255,255},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-40,40},{40,-40}},\n              textString=\"S\",\n              lineColor={0,0,255}),\n            Line(\n              points={{40,0},{90,0}},\n              color={0,0,0},\n              pattern=LinePattern.Dash),\n            Line(points={{-100,-10},{-100,-80}}, color={160,160,164}),\n            Line(points={{100,-10},{100,-80}}, color={160,160,164}),\n            Polygon(\n              points={{80,-65},{80,-55},{100,-60},{80,-65}},\n              lineColor={160,160,164},\n              fillColor={160,160,164},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-100,-60},{80,-60}}, color={160,160,164}),\n            Text(\n              extent={{-30,-70},{30,-90}},\n              textString=\"w_rel\",\n              lineColor={0,0,255}),\n            Line(points={{-76,80},{-5,80}}, color={128,128,128}),\n            Polygon(\n              points={{14,80},{-6,85},{-6,75},{14,80}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{18,87},{86,74}},\n              lineColor={128,128,128},\n              textString=\"moving direction\"),\n            Line(\n              points={{-90,0},{-40,0}},\n              color={0,0,0},\n              pattern=LinePattern.Dash)}));\n    end RelativeStates;\n    annotation (Icon(coordinateSystem(preserveAspectRatio = true, extent = {{-100,-100},{100,100}}), graphics = {\n        Rectangle(\n          origin = {11.5,31.183},\n          lineColor = {64,64,64},\n          fillColor = {255,255,255},\n          fillPattern = FillPattern.Sphere,\n          extent = {{-67,-66},{44,-6}})}),                     Documentation(info=\"<html>\n<p>\nThis package contains basic components 1D mechanical translational drive trains.\n</p>\n</html>\"));\n  end Components;\n\n  package Sensors \"Sensors for 1-dim. translational mechanical quantities\"\n\n    extends Modelica.Icons.SensorsPackage;\n\n    model PositionSensor \"Ideal sensor to measure the absolute position\"\n      extends Translational.Interfaces.PartialAbsoluteSensor;\n      Modelica.Blocks.Interfaces.RealOutput s(unit=\"m\")\n        \"Absolute position of flange as output signal\"\n                                    annotation (Placement(transformation(extent={{100,-11},\n                {120,9}},            rotation=0), iconTransformation(extent={{100,\n                -10},{120,10}})));\n\n    equation\n      s = flange.s;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nMeasures the <i>absolute position s</i> of a flange in an ideal way and provides the result as\noutput signals (to be further processed with blocks of the\nModelica.Blocks library).\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n              Text(\n              extent={{80,-28},{114,-62}},\n              lineColor={0,0,0},\n              textString=\"s\")}));\n    end PositionSensor;\n\n    model SpeedSensor \"Ideal sensor to measure the absolute velocity\"\n      extends Translational.Interfaces.PartialAbsoluteSensor;\n      Modelica.Blocks.Interfaces.RealOutput v(unit=\"m/s\")\n        \"Absolute velocity of flange as output signal\"\n           annotation (Placement(transformation(extent={{100,-10},{120,10}},\n              rotation=0)));\n\n    equation\n      v = der(flange.s);\n      annotation (\n        Documentation(info=\"<html>\n<p>\nMeasures the <i>absolute velocity v</i> of a flange in an ideal way and provides the result as\noutput signals (to be further processed with blocks of the\nModelica.Blocks library).\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n              Text(\n              extent={{80,-28},{111,-61}},\n              lineColor={0,0,0},\n              textString=\"v\")}));\n    end SpeedSensor;\n\n    model AccSensor \"Ideal sensor to measure the absolute acceleration\"\n      extends Translational.Interfaces.PartialAbsoluteSensor;\n      SI.Velocity v \"Absolute velocity of flange\";\n      Modelica.Blocks.Interfaces.RealOutput a(unit=\"m/s2\")\n        \"Absolute acceleration of flange as output signal\"\n           annotation (Placement(transformation(extent={{100,-10},{120,10}},\n              rotation=0)));\n\n    equation\n      v = der(flange.s);\n      a = der(v);\n      annotation (\n        Documentation(info=\"<html>\n<p>\nMeasures the <i>absolute acceleration a</i>\nof a flange in an ideal way and provides the result as\noutput signals (to be further processed with blocks of the\nModelica.Blocks library).\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n              Text(\n              extent={{80,-28},{115,-60}},\n              lineColor={0,0,0},\n              textString=\"a\")}));\n    end AccSensor;\n\n    model RelPositionSensor \"Ideal sensor to measure the relative position\"\n      extends Translational.Interfaces.PartialRelativeSensor;\n      Modelica.Blocks.Interfaces.RealOutput s_rel(unit=\"m\")\n        \"Distance between two flanges (= flange_b.s - flange_a.s) as output signal\"\n                                    annotation (Placement(transformation(extent={{-10,-10},\n                {10,10}},            rotation=270,\n            origin={0,-110})));\n\n    equation\n      s_rel = flange_b.s - flange_a.s;\n      0 = flange_a.f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nMeasures the <i>relative position s</i> of a flange in an ideal way and provides the result as\noutput signals (to be further processed with blocks of the\nModelica.Blocks library).\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n            Line(points={{70.4,0},{100,0}}, color={0,0,127}),\n            Text(\n              extent={{8,-68},{42,-102}},\n              lineColor={0,0,0},\n              textString=\"s\"),\n            Line(points={{0,-99},{0,-60}}, color={0,0,127})}));\n    end RelPositionSensor;\n\n    model RelSpeedSensor \"Ideal sensor to measure the relative speed\"\n      extends Translational.Interfaces.PartialRelativeSensor;\n      SI.Position s_rel\n        \"Distance between the two flanges (flange_b.s - flange_a.s)\";\n      Modelica.Blocks.Interfaces.RealOutput v_rel(unit=\"m/s\")\n        \"Relative velocity between two flanges (= der(flange_b.s) - der(flange_a.s)) as output signal\"\n                                    annotation (Placement(transformation(extent={{-10,-10},\n                {10,10}},            rotation=270,\n            origin={0,-110})));\n\n    equation\n      s_rel = flange_b.s - flange_a.s;\n      v_rel = der(s_rel);\n      0 = flange_a.f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nMeasures the <i>relative speed v</i> of a flange in an ideal way and provides the result as\noutput signals (to be further processed with blocks of the\nModelica.Blocks library).\n</p>\n\n</html>\",     revisions=\n             \"<html>\n<p><b>Release Notes:</b></p>\n<ul>\n<li><i>First Version from August 26, 1999 by P. Beater</i> </li>\n</ul>\n</html>\"),\n        Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n            Line(points={{70.4,0},{100,0}}, color={0,0,127}),\n            Text(\n              extent={{8,-68},{42,-102}},\n              lineColor={0,0,0},\n              textString=\"v\"),\n            Line(points={{0,-100},{0,-61}}, color={0,0,127})}));\n    end RelSpeedSensor;\n\n    model RelAccSensor \"Ideal sensor to measure the relative acceleration\"\n      extends Translational.Interfaces.PartialRelativeSensor;\n      SI.Position s_rel\n        \"Distance between the two flanges (flange_b.s - flange_a.s)\";\n      SI.Velocity v_rel\n        \"Relative velocity between the two flanges (der(flange_b.s) - der(flange_a.s))\";\n      Modelica.Blocks.Interfaces.RealOutput a_rel(unit=\"m/s2\")\n        \"Relative acceleration between two flanges (= der(v_rel)) as output signal\"\n                                    annotation (Placement(transformation(extent={{-10,-10},\n                {10,10}},            rotation=270,\n            origin={0,-110})));\n\n    equation\n      s_rel = flange_b.s - flange_a.s;\n      v_rel = der(s_rel);\n      a_rel = der(v_rel);\n      0 = flange_a.f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nMeasures the <i>relative acceleration a</i> of a flange in an ideal way and provides the result as\noutput signals (to be further processed with blocks of the\nModelica.Blocks library).\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n            Line(points={{70.4,0},{100,0}}, color={0,0,127}),\n            Text(\n              extent={{7,-68},{41,-102}},\n              lineColor={0,0,0},\n              textString=\"a\"),\n            Line(points={{0,-99},{0,-60}}, color={0,0,127})}));\n    end RelAccSensor;\n\n    model ForceSensor \"Ideal sensor to measure the force between two flanges\"\n      extends Translational.Interfaces.PartialRelativeSensor;\n      Modelica.Blocks.Interfaces.RealOutput f(unit=\"N\")\n        \"Force in flange_a and flange_b (f = flange_a.f = -flange_b.f) as output signal\"\n         annotation (Placement(transformation(\n            origin={-80,-110},\n            extent={{10,-10},{-10,10}},\n            rotation=90)));\n    equation\n      flange_a.s = flange_b.s;\n      flange_a.f = f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nMeasures the <i>cut-force between two flanges</i> in an ideal way\nand provides the result as output signal (to be further processed\nwith blocks of the Modelica.Blocks library).\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-40,-70},{40,-120}},\n              lineColor={0,0,0},\n              textString=\"f\"),\n            Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n            Line(points={{70,0},{90,0}}, color={0,0,0}),\n            Line(points={{-80,-100},{-80,0}}, color={0,0,127})}));\n    end ForceSensor;\n\n    model PowerSensor\n      \"Ideal sensor to measure the power between two flanges (= flange_a.f*der(flange_a.s))\"\n      extends Translational.Interfaces.PartialRelativeSensor;\n      Modelica.Blocks.Interfaces.RealOutput power(unit=\"W\")\n        \"Power in flange flange_a as output signal\"\n         annotation (Placement(transformation(\n            origin={-80,-110},\n            extent={{10,-10},{-10,10}},\n            rotation=90)));\n    equation\n      flange_a.s = flange_b.s;\n      power = flange_a.f*der(flange_a.s);\n      annotation (\n        Documentation(info=\"<html>\n<p>\nMeasures the <b>power between two flanges</b> in an ideal way\nand provides the result as output signal <b>power</b>\n(to be further processed with blocks of the Modelica.Blocks library).\n</p>\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-75,-79},{67,-119}},\n              lineColor={0,0,0},\n              textString=\"power\"),\n            Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n            Line(points={{70,0},{90,0}}, color={0,0,0}),\n            Line(points={{-80,-100},{-80,0}}, color={0,0,127})}));\n    end PowerSensor;\n\n    model MultiSensor\n      \"Ideal sensor to measure the absolute velocity, force and power between two flanges\"\n      extends Translational.Interfaces.PartialRelativeSensor;\n      Modelica.Blocks.Interfaces.RealOutput power(unit=\"W\")\n        \"Power in flange flange_a as output signal\"\n         annotation (Placement(transformation(\n            origin={-60,-110},\n            extent={{10,-10},{-10,10}},\n            rotation=90)));\n      Modelica.Blocks.Interfaces.RealOutput f(unit=\"N\")\n        \"Force in flange_a and flange_b (f = flange_a.f = -flange_b.f) as output signal\"\n         annotation (Placement(transformation(\n            extent={{10,-10},{-10,10}},\n            rotation=90,\n            origin={0,-110})));\n     Modelica.Blocks.Interfaces.RealOutput v(unit=\"m/s\")\n        \"Absolute velocity of flange as output signal as output signal\"\n           annotation (Placement(transformation(\n            extent={{-10,-10},{10,10}},\n            rotation=-90,\n            origin={60,-110})));\n    equation\n      flange_a.s = flange_b.s;\n      f = flange_a.f;\n      v = der(flange_a.s);\n      power = f*v;\n\n      annotation (\n        Documentation(info=\"<html>\n<p>\nMeasures the <b>absolute velocity</b> of a flange_a, the <b>cut-force</b> and <b>power</b> between two flanges in an\nideal way and provides the results as output signals <b>v</b>, <b>f</b> and <b>power</b>, respectively. </p>\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-146,-70},{-56,-100}},\n              lineColor={0,0,0},\n              textString=\"power\"),\n            Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n            Line(points={{70,0},{90,0}}, color={0,0,0}),\n            Line(points={{-60,-100},{-60,-60}},\n                                              color={0,0,127}),\n            Text(\n              extent={{-28,-71},{52,-101}},\n              lineColor={0,0,0},\n              textString=\"f\"),\n            Line(points={{0,-100},{0,-60}},   color={0,0,127}),\n            Line(points={{60,-100},{60,-60}}, color={0,0,127}),\n            Text(\n              extent={{60,-70},{114,-101}},\n              lineColor={0,0,0},\n              textString=\"v\")}));\n    end MultiSensor;\n    annotation (\n      Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,\n              100}}), graphics={\n          Line(points={{-56,-61},{-56,-81}}, color={0,0,0}),\n          Line(points={{-36,-61},{-36,-81}}, color={0,0,0}),\n          Line(points={{-16,-61},{-16,-81}}, color={0,0,0}),\n          Line(points={{4,-61},{4,-81}}, color={0,0,0}),\n          Line(points={{24,-61},{24,-81}}, color={0,0,0}),\n          Line(points={{44,-61},{44,-81}}, color={0,0,0})}),\n      Documentation(info=\"<html>\n<p>\nThis package contains ideal sensor components that provide\nthe connector variables as signals for further processing with the\nModelica.Blocks library.\n</p>\n</html>\"));\n  end Sensors;\n\n  package Sources \"Sources to drive 1D translational mechanical components\"\n    extends Modelica.Icons.SourcesPackage;\n\n    model Position\n      \"Forced movement of a flange according to a reference position\"\n      extends\n        Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport2\n        ( s(stateSelect=if exact then StateSelect.default else StateSelect.prefer));\n      parameter Boolean exact=false\n        \"true/false exact treatment/filtering the input signal\";\n      parameter SI.Frequency f_crit=50\n        \"if exact=false, critical frequency of filter to filter input signal\" annotation(Dialog(enable=not exact));\n      SI.Velocity v(start=0, stateSelect=if exact then StateSelect.default else StateSelect.prefer)\n        \"If exact=false, absolute velocity of flange_b else dummy\";\n      SI.Acceleration a(start=0)\n        \"If exact=false, absolute acceleration of flange_b else dummy\";\n      Modelica.Blocks.Interfaces.RealInput s_ref(unit=\"m\")\n        \"Reference position of flange as input signal\" annotation (Placement(\n            transformation(extent={{-140,-20},{-100,20}}, rotation=0)));\n    protected\n      parameter Modelica.SIunits.AngularFrequency w_crit=2*Modelica.Constants.pi*f_crit\n        \"Critical frequency\";\n      constant Real af=1.3617 \"s coefficient of Bessel filter\";\n      constant Real bf=0.6180 \"s*s coefficient of Bessel filter\";\n\n    initial equation\n      if not exact then\n        s = s_ref;\n      end if;\n    equation\n      if exact then\n        s = s_ref;\n        v = 0;\n        a = 0;\n      else\n        // Filter: a = s_ref*S^2/(1 + (af/w_crit)*S + (bf/w_crit^2)*S^2)\n        v = der(s);\n        a = der(v);\n        a = ((s_ref - s)*w_crit - af*v)*(w_crit/bf);\n      end if;\n      annotation (\n        Documentation(info=\"<HTML>\n<p>\nThe input signal <b>s_ref</b> defines the <b>reference\nposition</b> in [m]. Flange <b>flange_b</b> is <b>forced</b>\nto move relative to the support connector according to this reference motion. According to parameter\n<b>exact</b> (default = <b>false</b>), this is done in the following way:\n<ol>\n<li><b>exact=true</b><br>\n    The reference position is treated <b>exactly</b>. This is only possible, if\n    the input signal is defined by an analytical function which can be\n    differentiated at least twice. If this prerequisite is fulfilled,\n    the Modelica translator will differentiate the input signal twice\n    in order to compute the reference acceleration of the flange.</li>\n<li><b>exact=false</b><br>\n    The reference position is <b>filtered</b> and the second derivative\n    of the filtered curve is used to compute the reference acceleration\n    of the flange. This second derivative is <b>not</b> computed by\n    numerical differentiation but by an appropriate realization of the\n    filter. For filtering, a second order Bessel filter is used.\n    The critical frequency (also called cut-off frequency) of the\n    filter is defined via parameter <b>f_crit</b> in [Hz]. This value\n    should be selected in such a way that it is higher as the essential\n    low frequencies in the signal.</li>\n</ol>\n<p>\nThe input signal can be provided from one of the signal generator\nblocks of the block library Modelica.Blocks.Sources.\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-56,-36},{-178,-66}},\n              lineColor={0,0,0},\n              textString=\"s_ref\"),\n            Rectangle(\n              extent={{-100,20},{100,-20}},\n              lineColor={0,127,0},\n              fillColor={215,215,215},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{150,60},{-150,100}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Line(points={{0,52},{0,32}}, color={0,0,0}),\n            Line(points={{-29,32},{30,32}}, color={0,0,0}),\n            Line(points={{-30,-32},{30,-32}}, color={0,0,0}),\n            Line(points={{0,-32},{0,-100}}, color={0,0,0}),\n            Line(points={{30,-42},{20,-52}}, color={0,0,0}),\n            Line(points={{30,-32},{10,-52}}, color={0,0,0}),\n            Line(points={{20,-32},{0,-52}}, color={0,0,0}),\n            Line(points={{10,-32},{-10,-52}}, color={0,0,0}),\n            Line(points={{0,-32},{-20,-52}}, color={0,0,0}),\n            Line(points={{-10,-32},{-30,-52}}, color={0,0,0}),\n            Line(points={{-20,-32},{-30,-42}}, color={0,0,0}),\n            Text(\n              extent={{144,-30},{30,-60}},\n              lineColor={0,0,0},\n              textString=\"exact=\"),\n            Text(\n              extent={{134,-68},{22,-96}},\n              lineColor={0,0,0},\n              textString=\"%exact\")}));\n    end Position;\n\n    model Speed \"Forced movement of a flange according to a reference speed\"\n      extends\n        Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport2\n        (       s(start=0, fixed=true, stateSelect=StateSelect.prefer));\n      parameter Boolean exact=false\n        \"true/false exact treatment/filtering the input signal\";\n      parameter SI.Frequency f_crit=50\n        \"if exact=false, critical frequency of filter to filter input signal\" annotation(Dialog(enable=not exact));\n      SI.Velocity v(stateSelect=if exact then StateSelect.default else StateSelect.prefer)\n        \"Absolute velocity of flange_b\";\n      SI.Acceleration a\n        \"If exact=false, absolute acceleration of flange_b else dummy\";\n      Modelica.Blocks.Interfaces.RealInput v_ref(unit=\"m/s\")\n        \"Reference speed of flange as input signal\" annotation (Placement(\n            transformation(extent={{-140,-20},{-100,20}}, rotation=0)));\n\n    protected\n      parameter Modelica.SIunits.AngularFrequency w_crit=2*Modelica.Constants.pi*f_crit\n        \"Critical frequency\";\n    initial equation\n      if not exact then\n        v = v_ref;\n      end if;\n    equation\n      v = der(s);\n      if exact then\n        v = v_ref;\n        a = 0;\n      else\n        // Filter: a = v_ref/(1 + (1/w_crit)*s)\n        a = der(v);\n        a = (v_ref - v)*w_crit;\n      end if;\n      annotation (\n        Documentation(info=\"<HTML>\n<p>\nThe input signal <b>v_ref</b> defines the <b>reference\nspeed</b> in [m/s]. Flange <b>flange_b</b> is <b>forced</b>\nto move relative to the support connector  according to this reference motion. According to parameter\n<b>exact</b> (default = <b>false</b>), this is done in the following way:\n<ol>\n<li><b>exact=true</b><br>\n    The reference speed is treated <b>exactly</b>. This is only possible, if\n    the input signal is defined by an analytical function which can be\n    differentiated at least once. If this prerequisite is fulfilled,\n    the Modelica translator will differentiate the input signal once\n    in order to compute the reference acceleration of the flange.</li>\n<li><b>exact=false</b><br>\n    The reference speed is <b>filtered</b> and the first derivative\n    of the filtered curve is used to compute the reference acceleration\n    of the flange. This first derivative is <b>not</b> computed by\n    numerical differentiation but by an appropriate realization of the\n    filter. For filtering, a first order filter is used.\n    The critical frequency (also called cut-off frequency) of the\n    filter is defined via parameter <b>f_crit</b> in [Hz]. This value\n    should be selected in such a way that it is higher as the essential\n    low frequencies in the signal.</li>\n</ol>\n<p>\nThe input signal can be provided from one of the signal generator\nblocks of the block library Modelica.Blocks.Sources.\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-54,-36},{-174,-68}},\n              lineColor={0,0,0},\n              textString=\"v_ref\"),\n            Line(points={{-30,-32},{30,-32}}, color={0,0,0}),\n            Line(points={{0,-32},{0,-100}}, color={0,0,0}),\n            Line(points={{30,-42},{20,-52}}, color={0,0,0}),\n            Line(points={{30,-32},{10,-52}}, color={0,0,0}),\n            Line(points={{20,-32},{0,-52}}, color={0,0,0}),\n            Line(points={{10,-32},{-10,-52}}, color={0,0,0}),\n            Line(points={{0,-32},{-20,-52}}, color={0,0,0}),\n            Line(points={{-10,-32},{-30,-52}}, color={0,0,0}),\n            Line(points={{-20,-32},{-30,-42}}, color={0,0,0}),\n            Rectangle(\n              extent={{-100,20},{100,-20}},\n              lineColor={0,127,0},\n              fillColor={215,215,215},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-29,32},{30,32}}, color={0,0,0}),\n            Line(points={{0,52},{0,32}}, color={0,0,0}),\n            Text(\n              extent={{150,60},{-150,100}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Text(\n              extent={{146,-38},{32,-64}},\n              lineColor={0,0,0},\n              textString=\"exact=\"),\n            Text(\n              extent={{140,-76},{22,-102}},\n              lineColor={0,0,0},\n              textString=\"%exact\")}));\n    end Speed;\n\n    model Accelerate\n      \"Forced movement of a flange according to an acceleration signal\"\n       extends\n        Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport2\n        (s(start=0, fixed=true, stateSelect=StateSelect.prefer));\n      SI.Velocity v(start=0, fixed=true, stateSelect=StateSelect.prefer)\n        \"Absolute velocity of flange_b\";\n      SI.Acceleration a \"Absolute acceleration of flange_b\";\n\n      Modelica.Blocks.Interfaces.RealInput a_ref(unit=\"m/s2\")\n        \"Absolute acceleration of flange as input signal\"\n         annotation (Placement(transformation(extent={{-140,-20},{-100,20}},\n              rotation=0)));\n\n    equation\n      v = der(s);\n      a = der(v);\n      a = a_ref;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThe input signal <b>a</b> in [m/s2] moves the 1D translational flange\nconnector flange_b with a predefined <i>acceleration</i>, i.e., the flange\nis <i>forced</i> to move relative to the support connector  with this acceleration. The velocity and the\nposition of the flange are also predefined and are determined by\nintegration of the acceleration.\n</p>\n<p>\nThe acceleration \\\"a(t)\\\" can be provided from one of the signal generator\nblocks of the block library Modelica.Blocks.Source.\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-56,-40},{-166,-68}},\n              lineColor={0,0,0},\n              textString=\"a_ref\"),\n            Line(points={{-30,-32},{30,-32}}, color={0,0,0}),\n            Line(points={{0,-32},{0,-100}}, color={0,0,0}),\n            Line(points={{30,-42},{20,-52}}, color={0,0,0}),\n            Line(points={{30,-32},{10,-52}}, color={0,0,0}),\n            Line(points={{20,-32},{0,-52}}, color={0,0,0}),\n            Line(points={{10,-32},{-10,-52}}, color={0,0,0}),\n            Line(points={{0,-32},{-20,-52}}, color={0,0,0}),\n            Line(points={{-10,-32},{-30,-52}}, color={0,0,0}),\n            Line(points={{-20,-32},{-30,-42}}, color={0,0,0}),\n            Rectangle(\n              extent={{-100,20},{100,-20}},\n              lineColor={0,127,0},\n              fillColor={215,215,215},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-29,32},{30,32}}, color={0,0,0}),\n            Line(points={{0,52},{0,32}}, color={0,0,0}),\n            Text(\n              extent={{150,60},{-150,100}},\n              textString=\"%name\",\n              lineColor={0,0,255})}));\n    end Accelerate;\n\n    model Move\n      \"Forced movement of a flange according to a position, velocity and acceleration signal\"\n       extends\n        Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport2;\n      Modelica.Blocks.Interfaces.RealInput u[3]\n        \"Position, velocity and acceleration of flange as input signals\"\n        annotation (Placement(transformation(extent={{-140,-20},{-100,20}},\n              rotation=0)));\n    protected\n      function position\n         extends Modelica.Icons.Function;\n         input Real q_qd_qdd[3]\n          \"Required values for position, speed, acceleration\";\n         input Real dummy\n          \"Just to have one input signal that should be differentiated to avoid possible problems in the Modelica tool (is not used)\";\n         output Real q;\n      algorithm\n        q :=q_qd_qdd[1];\n        annotation (derivative(noDerivative=q_qd_qdd) = position_der,\n            InlineAfterIndexReduction=true);\n      end position;\n\n      function position_der\n         extends Modelica.Icons.Function;\n         input Real q_qd_qdd[3]\n          \"Required values for position, speed, acceleration\";\n         input Real dummy\n          \"Just to have one input signal that should be differentiated to avoid possible problems in the Modelica tool (is not used)\";\n         input Real dummy_der;\n         output Real qd;\n      algorithm\n        qd :=q_qd_qdd[2];\n        annotation (derivative(noDerivative=q_qd_qdd, order=2) = position_der2,\n            InlineAfterIndexReduction=true);\n      end position_der;\n\n      function position_der2\n         extends Modelica.Icons.Function;\n         input Real q_qd_qdd[3]\n          \"Required values for position, speed, acceleration\";\n         input Real dummy\n          \"Just to have one input signal that should be differentiated to avoid possible problems in the Modelica tool (is not used)\";\n         input Real dummy_der;\n         input Real dummy_der2;\n         output Real qdd;\n      algorithm\n        qdd :=q_qd_qdd[3];\n      end position_der2;\n    equation\n      s = position(u,time);\n      annotation (\n        Documentation(info=\"<html>\n<p>\nFlange <b>flange_b</b> is <b>forced</b> to move relative to the support connector  with a predefined motion\naccording to the input signals:\n</p>\n<pre>\n    u[1]: position of flange\n    u[2]: velocity of flange\n    u[3]: acceleration of flange\n</pre>\n<p>\nThe user has to guarantee that the input signals are consistent to each other,\ni.e., that u[2] is the derivative of u[1] and that\nu[3] is the derivative of u. There are, however,\nalso applications where by purpose these conditions do not hold. For example,\nif only the position dependent terms of a mechanical system shall be\ncalculated, one may provide position = position(t) and set the velocity\nand the acceleration to zero.\n</p>\n<p>\nThe input signals can be provided from one of the signal generator\nblocks of the block library Modelica.Blocks.Sources.\n</p>\n\n</html>\"),        Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-192,-38},{-32,-70}},\n              lineColor={0,0,0},\n              textString=\"s,v,a\"),\n            Line(points={{-30,-32},{30,-32}}, color={0,0,0}),\n            Line(points={{0,-32},{0,-100}}, color={0,0,0}),\n            Line(points={{30,-42},{20,-52}}, color={0,0,0}),\n            Line(points={{30,-32},{10,-52}}, color={0,0,0}),\n            Line(points={{20,-32},{0,-52}}, color={0,0,0}),\n            Line(points={{10,-32},{-10,-52}}, color={0,0,0}),\n            Line(points={{0,-32},{-20,-52}}, color={0,0,0}),\n            Line(points={{-10,-32},{-30,-52}}, color={0,0,0}),\n            Line(points={{-20,-32},{-30,-42}}, color={0,0,0}),\n            Rectangle(\n              extent={{-100,20},{100,-20}},\n              lineColor={0,127,0},\n              fillColor={215,215,215},\n              fillPattern=FillPattern.Solid),\n            Line(points={{0,52},{0,32}}, color={0,0,0}),\n            Line(points={{-29,32},{30,32}}, color={0,0,0}),\n            Text(\n              extent={{150,60},{-150,100}},\n              textString=\"%name\",\n              lineColor={0,0,255})}));\n    end Move;\n\n    model Force\n      \"External force acting on a drive train element as input signal\"\n      extends\n        Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport2;\n      Modelica.Blocks.Interfaces.RealInput f(unit=\"N\") \"Driving force as input signal\"\n                                        annotation (Placement(transformation(\n              extent={{-140,-20},{-100,20}}, rotation=0)));\n\n    equation\n      flange.f = -f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThe input signal \\\"f\\\" in [N] characterizes an <i>external\nforce</i> which acts (with positive sign) at a flange,\ni.e., the component connected to the flange is driven by force f.\n</p>\n<p>\nInput signal f can be provided from one of the signal generator\nblocks of Modelica.Blocks.Source.\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Polygon(\n              points={{-100,10},{20,10},{20,41},{90,0},{20,-41},{20,-10},{-100,\n                  -10},{-100,10}},\n              lineColor={0,127,0},\n              fillColor={215,215,215},\n              fillPattern=FillPattern.Solid),\n            Text(\n              extent={{-150,-32},{-80,-62}},\n              lineColor={0,0,0},\n              textString=\"f\"),\n            Text(\n              extent={{-150,90},{150,50}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Line(points={{-30,-60},{30,-60}}, color={0,0,0}),\n            Line(points={{0,-60},{0,-101}}, color={0,0,0}),\n            Line(points={{-30,-80},{-10,-60}}, color={0,0,0}),\n            Line(points={{-10,-80},{10,-60}}, color={0,0,0}),\n            Line(points={{10,-80},{30,-60}}, color={0,0,0}),\n            Polygon(\n              points={{-61,-50},{-30,-40},{-30,-60},{-61,-50}},\n              lineColor={0,0,0},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-31,-50},{50,-50}}, color={0,0,0}),\n            Line(points={{-50,-80},{-30,-60}}, color={0,0,0})}));\n    end Force;\n\n    model Force2 \"Input signal acting as torque on two flanges\"\n      extends Translational.Interfaces.PartialTwoFlanges;\n      Modelica.Blocks.Interfaces.RealInput f(unit=\"N\") \"Driving force as input signal\"\n                                        annotation (Placement(transformation(\n              extent={{-20,-20},{20,20}},    rotation=270,\n            origin={0,60}), iconTransformation(\n            extent={{-20,-20},{20,20}},\n            rotation=270,\n            origin={0,40})));\n\n    equation\n      flange_a.f =  f;\n      flange_b.f = -f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThe input signal \\\"f\\\" in [N] characterizes an <i>external\nforce</i> which acts (with positive sign) at both flanges,\ni.e., the components connected to these flanges are driven by force f.\n</p>\n<p>\nInput signal s can be provided from one of the signal generator\nblocks of Modelica.Blocks.Source.\n</p>\n\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Text(\n              extent={{-150,-40},{150,-80}},\n              textString=\"%name\",\n              lineColor={0,0,255}),\n            Polygon(\n              points={{90,0},{60,-30},{60,-10},{10,-10},{10,10},{60,10},{60,31},\n                  {90,0}},\n              lineColor={0,127,0},\n              smooth=Smooth.None,\n              fillColor={215,215,215},\n              fillPattern=FillPattern.Solid),\n            Polygon(\n              points={{-90,0},{-60,30},{-60,10},{-10,10},{-10,-10},{-60,-10},{-60,\n                  -30},{-90,0}},\n              lineColor={0,127,0},\n              smooth=Smooth.None,\n              fillColor={215,215,215},\n              fillPattern=FillPattern.Solid)}));\n    end Force2;\n\n    model LinearSpeedDependentForce \"Linear dependency of force versus speed\"\n      extends Modelica.Mechanics.Translational.Interfaces.PartialForce;\n      parameter Modelica.SIunits.Force f_nominal\n        \"Nominal force (if negative, force is acting as load)\";\n      parameter Boolean ForceDirection=true\n        \"Same direction of force in both directions of movement\";\n      parameter Modelica.SIunits.Velocity v_nominal(min=Modelica.Constants.eps)\n        \"Nominal speed\";\n      Modelica.SIunits.Velocity v\n        \"Velocity of flange with respect to support (= der(s))\";\n\n    equation\n      v = der(s);\n      if ForceDirection then\n        f = -f_nominal*abs(v/v_nominal);\n      else\n        f = -f_nominal*(v/v_nominal);\n      end if;\n      annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,\n                -100},{100,100}}), graphics={Line(points={{-100,-100},{100,100}},\n                color={0,0,255})}), Documentation(info=\"<HTML>\n<p>\nModel of force, linearly dependent on velocity of flange.<br>\nParameter ForceDirection chooses whether direction of force is the same in both directions of movement or not.\n</p>\n</HTML>\"));\n    end LinearSpeedDependentForce;\n\n    model QuadraticSpeedDependentForce\n      \"Quadratic dependency of force versus speed\"\n      extends Modelica.Mechanics.Translational.Interfaces.PartialForce;\n      parameter Modelica.SIunits.Force f_nominal\n        \"Nominal force (if negative, force is acting as load)\";\n      parameter Boolean ForceDirection=true\n        \"Same direction of force in both directions of movement\";\n      parameter Modelica.SIunits.Velocity v_nominal(min=Modelica.Constants.eps)\n        \"Nominal speed\";\n      Modelica.SIunits.Velocity v\n        \"Velocity of flange with respect to support (= der(s))\";\n    equation\n      v = der(s);\n      if ForceDirection then\n        f = -f_nominal*(v/v_nominal)^2;\n      else\n        f = -f_nominal*smooth(1, if v >= 0 then (v/v_nominal)^2 else -(v/v_nominal)^2);\n      end if;\n      annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={\n              Line(points={{-100,-100},{-80,-98},{-60,-92},{-40,-82},{-20,-68},{0,-50},{20,-28},{40,-2},{60,28},{80,62},{100,100}},\n                   color={0,0,127},\n                   smooth=Smooth.Bezier)}),Documentation(info=\"<HTML>\n<p>\nModel of force, quadratic dependent on velocity of flange.<br>\nParameter ForceDirection chooses whether direction of force is the same in both directions of movement or not.\n</p>\n</HTML>\"));\n    end QuadraticSpeedDependentForce;\n\n    model ConstantForce \"Constant force, not dependent on speed\"\n      extends Modelica.Mechanics.Translational.Interfaces.PartialForce;\n      parameter Modelica.SIunits.Force f_constant\n        \"Nominal force (if negative, force is acting as load)\";\n    equation\n      f = -f_constant;\n      annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,\n                -100},{100,100}}), graphics={Line(points={{-100,0},{98,0}},\n                color={0,0,255}), Text(\n              extent={{-118,58},{126,34}},\n              lineColor={0,0,0},\n              textString=\"%f_constant\")}),\n                               Documentation(info=\"<HTML>\n<p>\nModel of constant force, not dependent on velocity of flange.<br>\nPositive force acts accelerating.\n</p>\n</HTML>\"));\n    end ConstantForce;\n\n    model ConstantSpeed \"Constant speed, not dependent on force\"\n      extends Modelica.Mechanics.Translational.Interfaces.PartialForce;\n      parameter Modelica.SIunits.Velocity v_fixed\n        \"Fixed speed (if negative, force is acting as load)\";\n      Modelica.SIunits.Velocity v\n        \"Velocity of flange with respect to support (= der(s))\";\n    equation\n      v = der(s);\n      v = v_fixed;\n      annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,\n                -100},{100,100}}), graphics={Line(points={{0,-100},{0,100}},\n                color={0,0,255}), Text(\n              extent={{-120,60},{124,36}},\n              lineColor={0,0,0},\n              textString=\"%v_fixed\")}),\n                                    Documentation(info=\"<HTML>\n<p>\nModel of <b>fixed</b> velocity of flange, not dependent on force.\n</p>\n</HTML>\"));\n    end ConstantSpeed;\n\n    model ForceStep \"Constant force, not dependent on speed\"\n      extends Modelica.Mechanics.Translational.Interfaces.PartialForce;\n      parameter Modelica.SIunits.Force stepForce(start=1)\n        \"Height of force step (if negative, force is acting as load)\";\n      parameter Modelica.SIunits.Force offsetForce(start=0) \"Offset of force\";\n      parameter Modelica.SIunits.Time startTime=0\n        \"Force = offset for time < startTime\";\n    equation\n      f = -offsetForce - (if time < startTime then 0 else stepForce);\n      annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,\n                -100},{100,100}}), graphics={Line(points={{-80,-60},{0,-60},{0,\n                  60},{80,60}}, color={0,0,255}), Text(\n              extent={{0,-40},{100,-60}},\n              lineColor={0,0,0},\n              textString=\"time\")}), Documentation(info=\"<HTML>\n<p>\nModel of a force step at time .<br>\nPositive force acts accelerating.\n</p>\n</HTML>\"));\n    end ForceStep;\n\n    annotation (                 Documentation(info=\"<html>\n<p>\nThis package contains ideal sources to drive 1D mechanical translational drive trains.\n</p>\n</html>\"));\n  end Sources;\n\n  package Interfaces\n    \"Interfaces for 1-dim. translational mechanical components\"\n      extends Modelica.Icons.InterfacesPackage;\n\n    connector Flange_a\n      \"(left) 1D translational flange (flange axis directed INTO cut plane, e. g. from left to right)\"\n\n      SI.Position s \"Absolute position of flange\";\n      flow SI.Force f \"Cut force directed into flange\";\n      annotation(defaultComponentName = \"flange_a\",\n        Documentation(info=\"<html>\n<p>\nThis is a flange for 1D translational mechanical systems. In the cut plane of\nthe flange a unit vector n, called flange axis, is defined which is directed\nINTO the cut plane, i. e. from left to right. All vectors in the cut plane are\nresolved with respect to\nthis unit vector. E.g. force f characterizes a vector which is directed in\nthe direction of n with value equal to f. When this flange is connected to\nother 1D translational flanges, this means that the axes vectors of the connected\nflanges are identical.\n</p>\n<p>\nThe following variables are transported through this connector:\n</p>\n<pre>\n  s: Absolute position of the flange in [m]. A positive translation\n     means that the flange is translated along the flange axis.\n  f: Cut-force in direction of the flange axis in [N].\n</pre>\n</html>\"),     Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{\n                100,100}}), graphics={Rectangle(\n              extent={{-100,-100},{100,100}},\n              lineColor={0,127,0},\n              fillColor={0,127,0},\n              fillPattern=FillPattern.Solid)}),\n        Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},\n                {100,100}}), graphics={Rectangle(\n              extent={{-40,-40},{40,40}},\n              lineColor={0,127,0},\n              fillColor={0,127,0},\n              fillPattern=FillPattern.Solid), Text(\n              extent={{-160,110},{40,50}},\n              lineColor={0,127,0},\n              textString=\"%name\")}));\n    end Flange_a;\n\n    connector Flange_b\n      \"(right) 1D translational flange (flange axis directed OUT OF cut plane)\"\n\n      SI.Position s \"Absolute position of flange\";\n      flow SI.Force f \"Cut force directed into flange\";\n      annotation(defaultComponentName = \"flange_b\",\n        Documentation(info=\"<html>\n<p>\nThis is a flange for 1D translational mechanical systems. In the cut plane of\nthe flange a unit vector n, called flange axis, is defined which is directed\nOUT OF the cut plane. All vectors in the cut plane are resolved with respect to\nthis unit vector. E.g. force f characterizes a vector which is directed in\nthe direction of n with value equal to f. When this flange is connected to\nother 1D translational flanges, this means that the axes vectors of the connected\nflanges are identical.\n</p>\n<p>\nThe following variables are transported through this connector:\n<pre>\n  s: Absolute position of the flange in [m]. A positive translation\n     means that the flange is translated along the flange axis.\n  f: Cut-force in direction of the flange axis in [N].\n</pre>\n</html>\"),     Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={\n          Rectangle(\n            extent={{-100,-100},{100,100}},\n            lineColor={0,127,0},\n            fillColor={255,255,255},\n            fillPattern=FillPattern.Solid)}),\n        Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={Rectangle(\n              extent={{-40,-40},{40,40}},\n              lineColor={0,127,0},\n              fillColor={255,255,255},\n              fillPattern=FillPattern.Solid), Text(\n              extent={{-40,110},{160,50}},\n              lineColor={0,127,0},\n              textString=\"%name\")}));\n    end Flange_b;\n\n    connector Support \"Support/housing 1D translational flange\"\n\n      SI.Position s \"Absolute position of flange\";\n      flow SI.Force f \"Cut force directed into flange\";\n      annotation (Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,\n                -100},{100,100}}), graphics={\n            Rectangle(\n              extent={{-60,60},{60,-60}},\n              fillColor={175,175,175},\n              fillPattern=FillPattern.Solid,\n              pattern=LinePattern.None),\n            Text(\n              extent={{-160,110},{40,50}},\n              lineColor={0,127,0},\n              textString=\"%name\"),\n            Rectangle(\n              extent={{-40,-40},{40,40}},\n              lineColor={0,127,0},\n              fillColor={0,127,0},\n              fillPattern=FillPattern.Solid)}), Icon(coordinateSystem(\n              preserveAspectRatio=true, extent={{-100,-100},{100,100}}),\n            graphics={Rectangle(\n              extent={{-150,150},{150,-150}},\n              fillColor={175,175,175},\n              fillPattern=FillPattern.Solid,\n              pattern=LinePattern.None), Rectangle(\n              extent={{-90,-90},{90,90}},\n              lineColor={0,127,0},\n              fillColor={0,127,0},\n              fillPattern=FillPattern.Solid)}),\n        Documentation(info=\"<html>\n<p>This is a connector for 1-dim. rotational mechanical systems and models the support or housing of a shaft. The following variables are defined in this connector:</p>\n<table cellspacing=\\\"0\\\" cellpadding=\\\"2\\\" border=\\\"1\\\"><tr>\n<td valign=\\\"top\\\"><h4>s</h4></td>\n<td valign=\\\"top\\\"><p>Absolute position of the support/housing in [m]</p></td>\n</tr>\n<tr>\n<td valign=\\\"top\\\"><h4>f</h4></td>\n<td valign=\\\"top\\\"><p>Reaction force in the support/housing in [N]</p></td>\n</tr>\n</table>\n<p><br/>The support connector is usually defined as conditional connector. It is most convenient to utilize it</p>\n<ul>\n<li>For models to be build graphically (i.e., the model is build up by drag-and-drop from elementary components):<br/><a href=\\\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialOneFlangeAndSupport\\\">PartialOneFlangeAndSupport</a>,<br/><a href=\\\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialTwoFlangesAndSupport\\\">PartialTwoFlangesAndSupport</a>, <br/>&nbsp; </li>\n<li>For models to be build textually (i.e., elementary models):<br/><a href=\\\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport\\\">PartialElementaryOneFlangeAndSupport</a>,<br/><a href=\\\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryTwoFlangesAndSupport\\\">PartialElementaryTwoFlangesAndSupport</a>,<br/><a href=\\\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryRotationalToTranslational\\\">PartialElementaryRotationalToTranslational</a>. </li>\n</ul>\n</html>\"));\n    end Support;\n\n    model InternalSupport\n      \"Adapter model to utilize conditional support connector\"\n      input SI.Force f\n        \"External support force (must be computed via force balance in model where InternalSupport is used; = flange.f)\";\n      SI.Position s \"External support position (= flange.s)\";\n      Flange_a flange\n        \"Internal support flange (must be connected to the conditional support connector for useSupport=true and to conditional fixed model for useSupport=false)\"\n        annotation (Placement(transformation(extent={{-10,-10},{10,10}})));\n    equation\n      flange.f = f;\n      flange.s = s;\n      annotation ( Icon(coordinateSystem(\n              preserveAspectRatio=true, extent={{-100,-100},{100,100}}),\n            graphics={Text(\n              extent={{-200,80},{200,40}},\n              lineColor={0,0,255},\n              textString=\"%name\"), Rectangle(\n              extent={{-20,20},{20,-20}},\n              lineColor={0,127,0},\n              fillColor={175,175,175},\n              fillPattern=FillPattern.Solid)}),\n        Documentation(info=\"<html>\n<p>\nThis is an adapter model to utilize a conditional support connector\nin an elementary component, i.e., where the component equations are\ndefined textually:\n</p>\n\n<ul>\n<li> If <i>useSupport = true</i>, the flange has to be connected to the conditional\n     support connector.</li>\n<li> If <i>useSupport = false</i>, the flange has to be connected to the conditional\n     fixed model.</li>\n</ul>\n\n<p>\nVariable <b>f</b> is defined as <b>input</b> and must be provided when using\nthis component as a modifier (computed via a force balance in\nthe model where InternalSupport is used). Usually, model InternalSupport is\nutilized via the partial models:\n</p>\n\n<blockquote>\n<a href=\\\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport\\\">\nPartialElementaryOneFlangeAndSupport</a>,<br>\n<a href=\\\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryTwoFlangesAndSupport\\\">\nPartialElementaryTwoFlangesAndSupport</a>,<br>\n<a href=\\\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryRotationalToTranslational\\\">\nPartialElementaryRotationalToTranslational</a>.\n</blockquote>\n\n<p>\nNote, the support position can always be accessed as internalSupport.s, and\nthe support force can always be accessed as internalSupport.f.\n</p>\n</html>\"));\n    end InternalSupport;\n\n    partial model PartialTwoFlanges\n      \"Component with two translational 1D flanges\"\n\n      Flange_a flange_a\n        \"(left) driving flange (flange axis directed in to cut plane, e. g. from left to right)\"\n         annotation (Placement(transformation(extent={{-110,-10},{-90,10}},\n              rotation=0)));\n      Flange_b flange_b\n        \"(right) driven flange (flange axis directed out of cut plane)\"\n        annotation (Placement(transformation(extent={{90,-10},{110,10}},\n              rotation=0)));\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis is a 1D translational component with two flanges.\nIt is used e.g., to built up parts of a drive train consisting\nof several base components.\n</p>\n</html>\"));\n    end PartialTwoFlanges;\n\n    partial model PartialOneFlangeAndSupport\n      \"Partial model for a component with one translational 1-dim. shaft flange and a support used for graphical modeling, i.e., the model is build up by drag-and-drop from elementary components\"\n      parameter Boolean useSupport=false\n        \"= true, if support flange enabled, otherwise implicitly grounded\"\n          annotation(Evaluate=true, HideResult=true, choices(checkBox=true));\n      Flange_b flange \"Flange of component\"\n        annotation (Placement(transformation(extent={{90,-10},{110,10}}, rotation=0)));\n      Support support if useSupport \"Support/housing of component\"\n        annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));\n    protected\n      Support internalSupport\n        \"Internal support/housing of component (either connected to support, if useSupport=true, or connected to fixed, if useSupport=false)\"\n        annotation (Placement(transformation(extent={{-3,-83},{3,-77}})));\n      Components.Fixed fixed if not useSupport\n        \"Fixed support/housing, if not useSupport\"\n        annotation (Placement(transformation(extent={{10,-94},{30,-74}})));\n    equation\n      connect(fixed.flange, internalSupport) annotation (Line(\n          points={{20,-84},{20,-80},{0,-80}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(internalSupport, support) annotation (Line(\n          points={{0,-80},{0,-100}},\n          pattern=LinePattern.None,\n          smooth=Smooth.None));\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis is a 1-dim. translational component with one flange and a support/housing.\nIt is used e.g., to build up parts of a drive train graphically consisting\nof several components.\n</p>\n\n<p>\nIf <i>useSupport=true</i>, the support connector is conditionally enabled\nand needs to be connected.<br>\nIf <i>useSupport=false</i>, the support connector is conditionally disabled\nand instead the component is internally fixed to ground.\n</p>\n\n</html>\"),     Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={Text(\n              extent={{-38,-98},{-6,-96}},\n              lineColor={95,95,95},\n              textString=\"(if useSupport)\"), Text(\n              extent={{21,-95},{61,-96}},\n              lineColor={95,95,95},\n              textString=\"(if not useSupport)\")}),\n        Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{\n                100,100}}), graphics={\n            Line(\n              visible=not useSupport,\n              points={{-50,-120},{-30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-120},{-10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-10,-120},{10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{10,-120},{30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-100},{30,-100}},\n              color={0,0,0})}));\n    end PartialOneFlangeAndSupport;\n\n    partial model PartialTwoFlangesAndSupport\n      \"Partial model for a component with two translational 1-dim. shaft flanges and a support used for graphical modeling, i.e., the model is build up by drag-and-drop from elementary components\"\n      parameter Boolean useSupport=false\n        \"= true, if support flange enabled, otherwise implicitly grounded\"\n          annotation(Evaluate=true, HideResult=true, choices(checkBox=true));\n      Flange_a flange_a \"Flange of left end\"\n        annotation (Placement(transformation(extent={{-110,-10}, {-90,10}}, rotation=0)));\n      Flange_b flange_b \"Flange of right end\"\n        annotation (Placement(transformation(extent={{90,-10},{110,10}}, rotation=0)));\n      Support support if useSupport \"Support/housing of component\"\n        annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));\n    protected\n      Support internalSupport\n        \"Internal support/housing of component (either connected to support, if useSupport=true, or connected to fixed, if useSupport=false)\"\n        annotation (Placement(transformation(extent={{-3,-83},{3,-77}})));\n      Components.Fixed fixed if not useSupport\n        \"Fixed support/housing, if not useSupport\"\n        annotation (Placement(transformation(extent={{10,-97},{30,-77}})));\n    equation\n      connect(fixed.flange, internalSupport) annotation (Line(\n          points={{20,-87},{20,-80},{0,-80}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(internalSupport, support) annotation (Line(\n          points={{0,-80},{0,-100}},\n          pattern=LinePattern.None,\n          smooth=Smooth.None));\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis is a 1-dim. translational component with two flanges and a support/housing.\nIt is used e.g., to build up parts of a drive train graphically consisting\nof several components.\n</p>\n\n<p>\nIf <i>useSupport=true</i>, the support connector is conditionally enabled\nand needs to be connected.<br>\nIf <i>useSupport=false</i>, the support connector is conditionally disabled\nand instead the component is internally fixed to ground.\n</p>\n\n</html>\"),     Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={Text(\n              extent={{-38,-98},{-6,-96}},\n              lineColor={95,95,95},\n              textString=\"(if useSupport)\"), Text(\n              extent={{24,-97},{64,-98}},\n              lineColor={95,95,95},\n              textString=\"(if not useSupport)\")}),\n        Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{\n                100,100}}), graphics={\n            Line(\n              visible=not useSupport,\n              points={{-50,-120},{-30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-120},{-10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-10,-120},{10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{10,-120},{30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-100},{30,-100}},\n              color={0,0,0})}));\n    end PartialTwoFlangesAndSupport;\n\n    partial model PartialRigid\n      \"Rigid connection of two translational 1D flanges\"\n      SI.Position s\n        \"Absolute position of center of component (s = flange_a.s + L/2 = flange_b.s - L/2)\";\n      parameter SI.Length L(start=0)\n        \"Length of component, from left flange to right flange (= flange_b.s - flange_a.s)\";\n      Flange_a flange_a \"Left flange of translational component\"\n         annotation (Placement(transformation(extent={{-110,-10},{-90,10}},\n              rotation=0)));\n      Flange_b flange_b \"Right flange of translational component\"\n         annotation (Placement(transformation(extent={{90,-10},{110,10}},\n              rotation=0)));\n    equation\n      flange_a.s = s - L/2;\n      flange_b.s = s + L/2;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis is a 1-dim. translational component with two <i>rigidly</i> connected flanges.\nThe fixed distance between the left and the right flange is defined by parameter \\\"L\\\".\nThe forces at the right and left flange can be different.\nIt is used e.g., to built up sliding masses.\n</p>\n</html>\"));\n    end PartialRigid;\n\n    partial model PartialCompliant\n      \"Compliant connection of two translational 1D flanges\"\n\n      Flange_a flange_a\n        \"Left flange of compliant 1-dim. translational component\"\n         annotation (Placement(transformation(extent={{-110,-10},{-90,10}},\n              rotation=0)));\n      Flange_b flange_b\n        \"Right flange of compliant 1-dim. translational component\"\n        annotation (Placement(transformation(extent={{90,-10},{110,10}},\n              rotation=0)));\n      SI.Position s_rel(start=0)\n        \"Relative distance (= flange_b.s - flange_a.s)\";\n      SI.Force f\n        \"Force between flanges (positive in direction of flange axis R)\";\n\n    equation\n      s_rel = flange_b.s - flange_a.s;\n      flange_b.f = f;\n      flange_a.f = -f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis is a 1D translational component with a <i>compliant </i>connection of two\ntranslational 1D flanges where inertial effects between the two\nflanges are not included. The absolute value of the force at the left and the right\nflange is the same. It is used to built up springs, dampers etc.\n</p>\n\n</html>\"),     Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={Polygon(\n              points={{50,-90},{20,-80},{20,-100},{50,-90}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid), Line(points={{-60,-90},{20,-90}},\n                color={0,0,0})}));\n    end PartialCompliant;\n\n    partial model PartialCompliantWithRelativeStates\n      \"Base model for the compliant connection of two translational 1-dim. shaft flanges where the relative position and relative velocities are used as states\"\n\n      parameter StateSelect stateSelect=StateSelect.prefer\n        \"Priority to use phi_rel and w_rel as states\"\n      annotation(HideResult=true, Dialog(tab=\"Advanced\"));\n      parameter SI.Distance s_nominal=1e-4\n        \"Nominal value of s_rel (used for scaling)\"   annotation(Dialog(tab=\"Advanced\"));\n\n      SI.Position s_rel(start=0, stateSelect=stateSelect, nominal=s_nominal)\n        \"Relative distance (= flange_b.s - flange_a.s)\";\n      SI.Velocity v_rel(start=0, stateSelect=stateSelect)\n        \"Relative velocity (= der(s_rel))\";\n\n      SI.Force f \"Forces between flanges (= flange_b.f)\";\n      Translational.Interfaces.Flange_a flange_a\n        \"Left flange of compliant 1-dim. translational component\"\n        annotation (Placement(transformation(extent={{-110,-10},{-90,10}},\n              rotation=0)));\n      Translational.Interfaces.Flange_b flange_b\n        \"Right flange of compliant 1-dim. translational component\"\n        annotation (Placement(transformation(extent={{90,-10},{110,10}},\n              rotation=0)));\n\n    equation\n      s_rel = flange_b.s - flange_a.s;\n      v_rel = der(s_rel);\n      flange_b.f =  f;\n      flange_a.f = -f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis is a 1-dim. translational component with a compliant connection of two\ntranslational 1-dim. flanges where inertial effects between the two\nflanges are neglected. The basic assumption is that the cut-forces\nof the two flanges sum-up to zero, i.e., they have the same absolute value\nbut opposite sign: flange_a.f + flange_b.f = 0. This base class\nis used to built up force elements such as springs, dampers, friction.\n</p>\n\n<p>\nThe difference to base class \\\"PartialCompliant\\\" is that the relative\ndistance and the relative velocity are defined as preferred states.\nThe reason is that for a large class of drive trains,\nthe absolute position is quickly increasing during operation.\nNumerically, it is better to use relative distances between drive train components\nbecause they remain in a limited size. For this reason, StateSelect.prefer\nis set for the relative distance of this component.\n</p>\n\n<p>\nIn order to improve the numerics, a nominal value for the relative distance\nshould be set, since drive train distances are in a small order and\nthen step size control of the integrator is practically switched off for\nsuch a variable. A default nominal value of s_nominal = 1e-4 is defined.\nThis nominal value might also be computed from other values, such\nas \\\"s_nominal = f_nominal / c\\\" for a spring, if f_nominal\nand c have more meaningful values for the user.\n</p>\n\n</html>\"));\n    end PartialCompliantWithRelativeStates;\n\n    partial model PartialElementaryOneFlangeAndSupport\n      \"Obsolete partial model. Use PartialElementaryOneFlangeAndSupport2.\"\n      extends Modelica.Icons.ObsoleteModel;\n\n      parameter Boolean useSupport=false\n        \"= true, if support flange enabled, otherwise implicitly grounded\"\n          annotation(Evaluate=true, HideResult=true, choices(checkBox=true));\n      Modelica.SIunits.Length s\n        \"Distance between flange and support (= flange.s - support.s)\";\n      Flange_b flange \"Flange of component\"\n        annotation (Placement(transformation(extent={{90,-10},{110,10}},\n              rotation=0)));\n\n    protected\n      InternalSupport internalSupport(f=-flange.f)\n        \"Internal support/housing of component as a model with connector flange (flange is either connected to support, if useSupport=true, or connected to fixed, if useSupport=false)\"\n        annotation (Placement(transformation(extent={{-10,-90},{10,-70}})));\n      Components.Fixed fixed if not useSupport\n        \"Fixed support/housing, if not useSupport\"\n        annotation (Placement(transformation(extent={{10,-97},{30,-77}})));\n    public\n      Support support if useSupport \"Support/housing of component\"\n        annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));\n    equation\n      s = flange.s - internalSupport.s;\n      connect(internalSupport.flange, support) annotation (Line(\n          points={{0,-80},{0,-100}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(fixed.flange, internalSupport.flange) annotation (Line(\n          points={{20,-87},{20,-80},{0,-80}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis is a 1-dim. translational component with one flange and a support/housing.\nIt is used to build up elementary components of a drive train with\nequations in the text layer.\n</p>\n\n<p>\nIf <i>useSupport=true</i>, the support connector is conditionally enabled\nand needs to be connected.<br>\nIf <i>useSupport=false</i>, the support connector is conditionally disabled\nand instead the component is internally fixed to ground.\n</p>\n\n</html>\"),     Diagram(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={Text(\n              extent={{-38,-98},{-6,-96}},\n              lineColor={95,95,95},\n              textString=\"(if useSupport)\"), Text(\n              extent={{24,-97},{64,-98}},\n              lineColor={95,95,95},\n              textString=\"(if not useSupport)\")}),\n        Icon(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},{\n                100,100}}), graphics={\n            Line(\n              visible=not useSupport,\n              points={{-50,-120},{-30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-120},{-10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-10,-120},{10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{10,-120},{30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-100},{30,-100}},\n              color={0,0,0})}));\n    end PartialElementaryOneFlangeAndSupport;\n\n    partial model PartialElementaryOneFlangeAndSupport2\n      \"Partial model for a component with one translational 1-dim. shaft flange and a support used for textual modeling, i.e., for elementary models\"\n      parameter Boolean useSupport=false\n        \"= true, if support flange enabled, otherwise implicitly grounded\"\n          annotation(Evaluate=true, HideResult=true, choices(checkBox=true));\n      Modelica.SIunits.Length s\n        \"Distance between flange and support (= flange.s - support.s)\";\n      Flange_b flange \"Flange of component\"\n        annotation (Placement(transformation(extent={{90,-10},{110,10}},\n              rotation=0)));\n      Support support(s=s_support, f=-flange.f) if useSupport\n        \"Support/housing of component\"\n        annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));\n    protected\n      Modelica.SIunits.Length s_support \"Absolute position of support flange\";\n    equation\n      s = flange.s - s_support;\n      if not useSupport then\n        s_support = 0;\n      end if;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis is a 1-dim. translational component with one flange and a support/housing.\nIt is used to build up elementary components of a drive train with\nequations in the text layer.\n</p>\n\n<p>\nIf <i>useSupport=true</i>, the support connector is conditionally enabled\nand needs to be connected.<br>\nIf <i>useSupport=false</i>, the support connector is conditionally disabled\nand instead the component is internally fixed to ground.\n</p>\n\n</html>\"),        Icon(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},{\n                100,100}}), graphics={\n            Line(\n              visible=not useSupport,\n              points={{-50,-120},{-30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-120},{-10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-10,-120},{10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{10,-120},{30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-100},{30,-100}},\n              color={0,0,0})}));\n    end PartialElementaryOneFlangeAndSupport2;\n\n    partial model PartialElementaryTwoFlangesAndSupport\n      \"Obsolete partial model. Use PartialElementaryTwoFlangesAndSupport2.\"\n      extends Modelica.Icons.ObsoleteModel;\n      parameter Boolean useSupport=false\n        \"= true, if support flange enabled, otherwise implicitly grounded\"\n          annotation(Evaluate=true, HideResult=true, choices(checkBox=true));\n      Flange_a flange_a \"Flange of left shaft\"\n        annotation (Placement(transformation(extent={{-110,-10},{-90,10}}, rotation=0)));\n      Flange_b flange_b \"Flange of right shaft\"\n        annotation (Placement(transformation(extent={{90,-10},{110,10}}, rotation=0)));\n      Modelica.SIunits.Length s_a \"Distance between left flange and support\";\n      Modelica.SIunits.Length s_b \"Distance between right flange and support\";\n    protected\n      InternalSupport internalSupport(f=-flange_a.f - flange_b.f)\n        \"Internal support/housing of component as a model with connector flange (flange is either connected to support, if useSupport=true, or connected to fixed, if useSupport=false)\"\n        annotation (Placement(transformation(extent={{-10,-90},{10,-70}})));\n      Components.Fixed fixed if not useSupport\n        \"Fixed support/housing, if not useSupport\"\n        annotation (Placement(transformation(extent={{10,-97},{30,-77}})));\n    public\n      Support support if useSupport \"Support/housing of component\"\n        annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));\n    equation\n      s_a = flange_a.s - internalSupport.s;\n      s_b = flange_b.s - internalSupport.s;\n      connect(internalSupport.flange, support) annotation (Line(\n          points={{0,-80},{0,-100}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      connect(fixed.flange, internalSupport.flange) annotation (Line(\n          points={{20,-87},{20,-80},{0,-80}},\n          color={0,127,0},\n          smooth=Smooth.None));\n      annotation (Documentation(info=\"<html>\n<p>\nThis is a 1-dim. translational component with two flanges and an additional support.\nIt is used e.g., to build up elementary ideal gear components. The component\ncontains the force balance, i.e., the sum of the forces of the connectors\nis zero (therefore, components that are based on PartialGear cannot have\na mass). The support connector needs to be connected\nto avoid the unphysical behavior that the\nsupport force is required to be zero (= the default value, if the\nconnector is not connected).\n</p>\n\n</html>\"),     Diagram(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},\n                {100,100}}), graphics={Text(\n              extent={{-38,-98},{-6,-96}},\n              lineColor={95,95,95},\n              textString=\"(if useSupport)\"), Text(\n              extent={{24,-97},{64,-98}},\n              lineColor={95,95,95},\n              textString=\"(if not useSupport)\")}),\n        Icon(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},{\n                100,100}}), graphics={\n            Line(\n              visible=not useSupport,\n              points={{-50,-120},{-30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-120},{-10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-10,-120},{10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{10,-120},{30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-100},{30,-100}},\n              color={0,0,0})}));\n    end PartialElementaryTwoFlangesAndSupport;\n\n    partial model PartialElementaryTwoFlangesAndSupport2\n      \"Partial model for a component with one translational 1-dim. shaft flange and a support used for textual modeling, i.e., for elementary models\"\n      parameter Boolean useSupport=false\n        \"= true, if support flange enabled, otherwise implicitly grounded\"\n          annotation(Evaluate=true, HideResult=true, choices(checkBox=true));\n      Flange_a flange_a \"Flange of left shaft\"\n        annotation (Placement(transformation(extent={{-110,-10},{-90,10}}, rotation=0)));\n      Flange_b flange_b \"Flange of right shaft\"\n        annotation (Placement(transformation(extent={{90,-10},{110,10}}, rotation=0)));\n      Support support(s=s_support, f = -flange_a.f - flange_b.f) if useSupport\n        \"Support/housing of component\"\n        annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));\n      Modelica.SIunits.Length s_a \"Distance between left flange and support\";\n      Modelica.SIunits.Length s_b \"Distance between right flange and support\";\n    protected\n      Modelica.SIunits.Length s_support \"Absolute position of support flange\";\n    equation\n      s_a = flange_a.s - s_support;\n      s_b = flange_b.s - s_support;\n      if not useSupport then\n         s_support = 0;\n      end if;\n\n      annotation (Documentation(info=\"<html>\n<p>\nThis is a 1-dim. translational component with two flanges and an additional support.\nIt is used e.g., to build up elementary ideal gear components. The component\ncontains the force balance, i.e., the sum of the forces of the connectors\nis zero (therefore, components that are based on PartialGear cannot have\na mass). The support connector needs to be connected\nto avoid the unphysical behavior that the\nsupport force is required to be zero (= the default value, if the\nconnector is not connected).\n</p>\n\n</html>\"),        Icon(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},{\n                100,100}}), graphics={\n            Line(\n              visible=not useSupport,\n              points={{-50,-120},{-30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-120},{-10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-10,-120},{10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{10,-120},{30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-100},{30,-100}},\n              color={0,0,0})}));\n    end PartialElementaryTwoFlangesAndSupport2;\n\n    partial model PartialElementaryRotationalToTranslational\n      \"Partial model to transform rotational into translational motion\"\n      extends\n        Modelica.Mechanics.Rotational.Interfaces.PartialElementaryRotationalToTranslational;\n      annotation (Documentation(info=\"<html>\n<p>This is a 1-dim. rotational component with</p>\n<ul>\n<li>one rotational flange, </li>\n<li>one rotational support/housing, </li>\n<li>one translational flange, and </li>\n<li>one translational support/housing </li>\n</ul>\n<p>This model is used to build up elementary components of a drive train transforming rotational into translational motion with equations in the text layer.</p>\n<p>If <i>useSupportR=true</i>, the rotational support connector is conditionally enabled and needs to be connected.</p>\n<p>If <i>useSupportR=false</i>, the rotational support connector is conditionally disabled and instead the rotational part is internally fixed to ground.</p>\n<p>If <i>useSupportT=true</i>, the translational support connector is conditionally enabled and needs to be connected.</p>\n<p>If <i>useSupportT=false</i>, the translational support connector is conditionally disabled and instead the translational part is internally fixed to ground.</p>\n</html>\"));\n    end PartialElementaryRotationalToTranslational;\n\n  partial model PartialForce\n      \"Partial model of a force acting at the flange (accelerates the flange)\"\n    extends PartialElementaryOneFlangeAndSupport2;\n    Modelica.SIunits.Force f \"Accelerating force acting at flange (= flange.f)\";\n  equation\n    f = flange.f;\n    annotation (\n      Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,\n                100}}), graphics={\n            Rectangle(\n              extent={{-96,96},{96,-96}},\n              lineColor={255,255,255},\n              fillColor={255,255,255},\n              fillPattern=FillPattern.Solid),\n            Line(points={{0,-60},{0,-100}}, color={0,0,0}),\n            Text(\n              extent={{-150,140},{150,100}},\n              lineColor={0,0,255},\n              textString=\"%name\"),\n            Line(points={{-78,80},{51,80}}, color={0,0,0}),\n            Polygon(\n              points={{81,80},{51,90},{51,70},{81,80}},\n              lineColor={0,0,0},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-52,-60},{77,-60}}, color={0,0,0}),\n            Polygon(\n              points={{-82,-60},{-51,-50},{-51,-70},{-82,-60}},\n              lineColor={0,0,0},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(\n              visible=not useSupport,\n              points={{-50,-120},{-30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-120},{-10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-10,-120},{10,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{10,-120},{30,-100}},\n              color={0,0,0}),\n            Line(\n              visible=not useSupport,\n              points={{-30,-100},{30,-100}},\n              color={0,0,0})}),\n      Documentation(info=\"<HTML>\n<p>\nPartial model of force that accelerates the flange.\n</p>\n\n<p>\nIf <i>useSupport=true</i>, the support connector is conditionally enabled\nand needs to be connected.<br>\nIf <i>useSupport=false</i>, the support connector is conditionally disabled\nand instead the component is internally fixed to ground.\n</p>\n</HTML>\"));\n  end PartialForce;\n\n    partial model PartialAbsoluteSensor\n      \"Device to measure a single absolute flange variable\"\n\n      extends Modelica.Icons.TranslationalSensor;\n\n      Interfaces.Flange_a flange\n        \"Flange to be measured (flange axis directed in to cut plane, e. g. from left to right)\"\n         annotation (Placement(transformation(extent={{-110,-10},{-90,10}},\n              rotation=0)));\n\n    equation\n      0 = flange.f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis is the superclass of a 1D translational component with one flange and one\noutput signal in order to measure an absolute kinematic quantity in the flange\nand to provide the measured signal as output signal for further processing\nwith the Modelica.Blocks blocks.\n</p>\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-100,-90},{-20,-90}}, color={0,0,0}),\n            Polygon(\n              points={{10,-90},{-20,-80},{-20,-100},{10,-90}},\n              lineColor={128,128,128},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n            Line(points={{70,0},{100,0}}, color={0,0,127}),\n            Text(\n              extent={{-150,80},{150,40}},\n              textString=\"%name\",\n              lineColor={0,0,255})}));\n    end PartialAbsoluteSensor;\n\n    partial model PartialRelativeSensor\n      \"Device to measure a single relative variable between two flanges\"\n\n      extends Modelica.Icons.TranslationalSensor;\n\n      Interfaces.Flange_a flange_a\n        \"(left) driving flange (flange axis directed in to cut plane, e. g. from left to right)\"\n         annotation (Placement(transformation(extent={{-110,-10},{-90,10}},\n              rotation=0)));\n      Interfaces.Flange_b flange_b\n        \"(right) driven flange (flange axis directed out of cut plane)\"\n        annotation (Placement(transformation(extent={{90,-10},{110,10}},\n              rotation=0)));\n\n    equation\n      0 = flange_a.f + flange_b.f;\n      annotation (\n        Documentation(info=\"<html>\n<p>\nThis is a superclass for 1D translational components with two rigidly connected\nflanges and one output signal in order to measure relative kinematic quantities\nbetween the two flanges or the cut-force in the flange and\nto provide the measured signal as output signal for further processing\nwith the Modelica.Blocks blocks.\n</p>\n</html>\"),     Icon(coordinateSystem(\n            preserveAspectRatio=true,\n            extent={{-100,-100},{100,100}}), graphics={\n            Line(points={{-51,34},{29,34}}, color={0,0,0}),\n            Polygon(\n              points={{59,34},{29,44},{29,24},{59,34}},\n              lineColor={0,0,0},\n              fillColor={128,128,128},\n              fillPattern=FillPattern.Solid),\n            Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n            Line(points={{70,0},{90,0}}, color={0,0,0}),\n            Text(\n              extent={{-150,100},{150,60}},\n              textString=\"%name\",\n              lineColor={0,0,255})}));\n    end PartialRelativeSensor;\n\n    partial model PartialFriction \"Base model of Coulomb friction elements\"\n\n    //extends Translational.Interfaces.PartialRigid;\n      parameter SI.Velocity v_small=1e-3\n        \"Relative velocity near to zero (see model info text)\"\n         annotation(Dialog(tab=\"Advanced\"));\n    // Equations to define the following variables have to be defined in subclasses\n      SI.Velocity v_relfric \"Relative velocity between frictional surfaces\";\n      SI.Acceleration a_relfric\n        \"Relative acceleration between frictional surfaces\";\n    //SI.Force f \"Friction force (positive, if directed in opposite direction of v_rel)\";\n      SI.Force f0 \"Friction force for v=0 and forward sliding\";\n      SI.Force f0_max \"Maximum friction force for v=0 and locked\";\n      Boolean free \"true, if frictional element is not active\";\n    // Equations to define the following variables are given in this class\n      Real sa(unit=\"1\")\n        \"Path parameter of friction characteristic f = f(a_relfric)\";\n      Boolean startForward(start=false, fixed=true)\n        \"true, if v_rel=0 and start of forward sliding\";\n      Boolean startBackward(start=false, fixed=true)\n        \"true, if v_rel=0 and start of backward sliding\";\n      Boolean locked(start=false) \"true, if v_rel=0 and not sliding\";\n      constant Integer Unknown=3 \"Value of mode is not known\";\n      constant Integer Free=2 \"Element is not active\";\n      constant Integer Forward=1 \"v_rel > 0 (forward sliding)\";\n      constant Integer Stuck=0\n        \"v_rel = 0 (forward sliding, locked or backward sliding)\";\n      constant Integer Backward=-1 \"v_rel < 0 (backward sliding)\";\n      Integer mode(\n        final min=Backward,\n        final max=Unknown,\n        start=Unknown, fixed=true);\n    protected\n      constant SI.Acceleration unitAcceleration = 1 annotation(HideResult=true);\n      constant SI.Force unitForce = 1 annotation(HideResult=true);\n    equation\n    /* Friction characteristic\n   (locked is introduced to help the Modelica translator determining\n   the different structural configurations,\n   if for each configuration special code shall be generated)\n*/\n      startForward = pre(mode) == Stuck and (sa > f0_max/unitForce or pre(startForward)\n         and sa > f0/unitForce) or pre(mode) == Backward and v_relfric > v_small or\n        initial() and (v_relfric > 0);\n      startBackward = pre(mode) == Stuck and (sa < -f0_max/unitForce or pre(\n        startBackward) and sa < -f0/unitForce) or pre(mode) == Forward and v_relfric <\n        -v_small or initial() and (v_relfric < 0);\n      locked = not free and not (pre(mode) == Forward or startForward or pre(\n        mode) == Backward or startBackward);\n\n      a_relfric/unitAcceleration = if locked then               0 else\n                                   if free then                 sa else\n                                   if startForward then         sa - f0_max/unitForce else\n                                   if startBackward then        sa + f0_max/unitForce else\n                                   if pre(mode) == Forward then sa - f0_max/unitForce else\n                                                                sa + f0_max/unitForce;\n\n    /* Friction torque has to be defined in a subclass. Example for a clutch:\n   f = if locked then sa else\n       if free then   0 else\n       cgeo*fn*(if startForward then          Math.tempInterpol1( v_relfric, mue_pos, 2) else\n                if startBackward then        -Math.tempInterpol1(-v_relfric, mue_pos, 2) else\n                if pre(mode) == Forward then  Math.tempInterpol1( v_relfric, mue_pos, 2) else\n                                             -Math.tempInterpol1(-v_relfric, mue_pos, 2));\n*/\n    // finite state machine to determine configuration\n      mode = if free then Free else\n        (if (pre(mode) == Forward  or pre(mode) == Free or startForward)  and v_relfric > 0 then\n           Forward else\n         if (pre(mode) == Backward or pre(mode) == Free or startBackward) and v_relfric < 0 then\n           Backward else\n           Stuck);\n      annotation (Documentation(info=\"<html>\n<p>\nBasic model for Coulomb friction that models the stuck phase in a reliable way.\n</p>\n</html>\"));\n    end PartialFriction;\n\n    annotation (Documentation(info=\"<html>\n<p>\nThis package contains connectors and partial models for 1-dim.\ntranslational mechanical components. The components of this package can\nonly be used as basic building elements for models.\n</p>\n\n</html>\"));\n  end Interfaces;\n\n  annotation (\n    Icon(coordinateSystem(preserveAspectRatio = true, extent = {{-100,-100},{100,100}}), graphics = {\n      Line(\n        origin = {14,53},\n        points = {{-84,-73},{66,-73}}),\n      Rectangle(\n        origin = {14,53},\n        lineColor = {64,64,64},\n        fillColor = {192,192,192},\n        fillPattern = FillPattern.Sphere,\n        extent = {{-81,-65},{-8,-22}}),Line(visible = true,\n        origin = {14,53},\n        points = {{-8,-43},{-1,-43},{6,-64},{17,-23},{29,-65},{40,-23},{50,-44},{61,-44}}),\n      Line(\n        origin = {14,53},\n        points = {{-59,-73},{-84,-93}}),\n      Line(\n        origin = {14,53},\n        points = {{-11,-73},{-36,-93}}),\n      Line(\n        origin = {14,53},\n        points = {{-34,-73},{-59,-93}}),\n      Line(\n        origin = {14,53},\n        points = {{14,-73},{-11,-93}}),\n      Line(\n        origin = {14,53},\n        points = {{39,-73},{14,-93}}),\n      Line(\n        origin = {14,53},\n        points = {{63,-73},{38,-93}})}),\n                                                        Documentation(info=\"<html>\n<p>\nThis package contains components to model <i>1-dimensional translational\nmechanical</i> systems.\n</p>\n<p>\nThe <i>filled</i> and <i>non-filled green squares</i> at the left and\nright side of a component represent <i>mechanical flanges</i>.\nDrawing a line between such squares means that the corresponding\nflanges are <i>rigidly attached</i> to each other. The components of this\nlibrary can be usually connected together in an arbitrary way. E.g. it is\npossible to connect two springs or two sliding masses with inertia directly\ntogether.\n<p> The only <i>connection restriction</i> is that the Coulomb friction\nelements (e.g., MassWithStopAndFriction) should be only connected\ntogether provided a compliant element, such as a spring, is in between.\nThe reason is that otherwise the frictional force is not uniquely\ndefined if the elements are stuck at the same time instant (i.e., there\ndoes not exist a unique solution) and some simulation systems may not be\nable to handle this situation, since this leads to a singularity during\nsimulation. It can only be resolved in a \\\"clean way\\\" by combining the\ntwo connected friction elements into\none component and resolving the ambiguity of the frictional force in the\nstuck mode.\n</p>\n<p> Another restriction arises if the hard stops in model MassWithStopAndFriction are used, i. e.\nthe movement of the mass is limited by a stop at smax or smin.\n<font color=\\\"#ff0000\\\"> <b>This requires the states Stop.s and Stop.v</b> </font>. If these states are eliminated during the index reduction\nthe model will not work. To avoid this any inertias should be connected via springs\nto the Stop element, other sliding masses, dampers or hydraulic chambers must be avoided.</p>\n<p>\nIn the <i>icon</i> of every component an <i>arrow</i> is displayed in grey\ncolor. This arrow characterizes the coordinate system in which the vectors\nof the component are resolved. It is directed into the positive\ntranslational direction (in the mathematical sense).\nIn the flanges of a component, a coordinate system is rigidly attached\nto the flange. It is called <i>flange frame</i> and is directed in parallel\nto the component coordinate system. As a result, e.g., the positive\ncut-force of a \\\"left\\\" flange (flange_a) is directed into the flange, whereas\nthe positive cut-force of a \\\"right\\\" flange (flange_b) is directed out of the\nflange. A flange is described by a Modelica connector containing\nthe following variables:\n</p>\n<pre>\n   Modelica.SIunits.Position s    \\\"Absolute position of flange\\\";\n   <b>flow</b> Modelica.SIunits.Force f  \\\"Cut-force in the flange\\\";\n</pre>\n\n<p>\nThis library is designed in a fully object oriented way in order that\ncomponents can be connected together in every meaningful combination\n(e.g., direct connection of two springs or two shafts with inertia).\nAs a consequence, most models lead to a system of\ndifferential-algebraic equations of <i>index 3</i> (= constraint\nequations have to be differentiated twice in order to arrive at\na state space representation) and the Modelica translator or\nthe simulator has to cope with this system representation.\nAccording to our present knowledge, this requires that the\nModelica translator is able to symbolically differentiate equations\n(otherwise it is e.g., not possible to provide consistent initial\nconditions; even if consistent initial conditions are present, most\nnumerical DAE integrators can cope at most with index 2 DAEs).\n</p>\n\n<p>\nIn version 3.2 of the Modelica Standard Library, all <b>dissipative</b> components\nof the Translational library got an optional <b>heatPort</b> connector to which the\ndissipated energy is transported in form of heat. This connector is enabled\nvia parameter \\\"useHeatPort\\\". If the heatPort connector is enabled,\nit must be connected, and if it is not enabled, it must not be connected.\nIndependently, whether the heatPort is enabled or not,\nthe dissipated power is available from the new variable \\\"<b>lossPower</b>\\\" (which is\npositive if heat is flowing out of the heatPort). For an example, see\n<a href=\\\"modelica://Modelica.Mechanics.Translational.Examples.HeatLosses\\\">Examples.HeatLosses</a>.\n</p>\n\n<dl>\n<dt><b>Library Officer</b>\n<dd><a href=\\\"http://www.robotic.dlr.de/Martin.Otter/\\\">Martin Otter</a> <br>\n    Deutsches Zentrum f&uuml;r Luft und Raumfahrt e.V. (DLR)<br>\n    Institut f&uuml;r Robotik und Mechatronik (DLR-RM)<br>\n    Abteilung Systemdynamik und Regelungstechnik<br>\n    Postfach 1116<br>\n    D-82230 Wessling<br>\n    Germany<br>\n    email: <A HREF=\\\"mailto:Martin.Otter@dlr.de\\\">Martin.Otter@dlr.de</A><br><br>\n</dl>\n\n<p>\n<b>Contributors to this library:</b>\n</p>\n\n<ul>\n<li> Main author until 2006:<br>\n     Peter Beater <br>\n     Universit&auml;t Paderborn, Abteilung Soest<br>\n     Fachbereich Maschinenbau/Automatisierungstechnik<br>\n     L&uuml;becker Ring 2 <br>\n     D 59494 Soest <br>\n     Germany <br>\n     email: <A HREF=\\\"mailto:info@beater.de\\\">info@beater.de</A><br><br>\n     </li>\n\n<li> <a href=\\\"http://www.haumer.at/\\\">Anton Haumer</a><br>\n     Technical Consulting &amp; Electrical Engineering<br>\n     A-3423 St.Andrae-Woerdern, Austria<br>\n     email: <a href=\\\"mailto:a.haumer@haumer.at\\\">a.haumer@haumer.at</a><br><br></li>\n\n<li> <a href=\\\"http://www.robotic.dlr.de/Martin.Otter/\\\">Martin Otter</a> (DLR-RM)</li>\n</ul>\n\n<p>\nCopyright &copy; 1998-2013, Modelica Association, Anton Haumer and Universit&auml;t Paderborn, FB 12.\n</p>\n<p>\n<i>This Modelica package is <u>free</u> software and the use is completely at <u>your own risk</u>; it can be redistributed and/or modified under the terms of the Modelica License 2. For license conditions (including the disclaimer of warranty) see <a href=\\\"modelica://Modelica.UsersGuide.ModelicaLicense2\\\">Modelica.UsersGuide.ModelicaLicense2</a> or visit <a href=\\\"https://www.modelica.org/licenses/ModelicaLicense2\\\"> https://www.modelica.org/licenses/ModelicaLicense2</a>.</i>\n</p>\n</html>\", revisions=\"<html>\n<ul>\n<li><i>Version 1.2.0 2010-07-22</i>\n       by Anton Haumer and Martin Otter<br>\n       heatPort introduced for all dissipative elements, and\n       text in icons improved.\n       <br></li>\n\n<li><i>Version 1.1.0 2007-11-16</i>\n       by Anton Haumer<br>\n       Redesign for Modelica 3.0-compliance<br>\n       Added new components according to Mechanics.Rotational library\n       <br></li>\n\n<li><i>Version 1.01 (July 18, 2001)</i>\n       by Peter Beater <br>\n       Assert statement added to \\\"Stop\\\", small bug fixes in examples.\n       <br></li>\n\n<li><i>Version 1.0 (January 5, 2000)</i>\n       by Peter Beater <br>\n       Realized a first version based on Modelica library Mechanics.Rotational\n       by Martin Otter and an existing Dymola library onedof.lib by Peter Beater.</li>\n</ul>\n</html>\"));\nend Translational;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/modelica.mo",
    "content": "within Modelica.Electrical.Analog;\npackage Sensors \"Potential, voltage, current, and power sensors\"\n\n  extends Modelica.Icons.SensorsPackage;\n\n  model PotentialSensor \"Sensor to measure the potential\"\n    extends Modelica.Icons.RotationalSensor;\n\n    Interfaces.PositivePin p \"pin to be measured\" annotation (Placement(\n          transformation(extent={{-110,-10},{-90,10}}, rotation=0)));\n    Modelica.Blocks.Interfaces.RealOutput phi\n      \"Absolute voltage potential as output signal\"\n        annotation (Placement(transformation(extent={{100,-10},{120,10}},\n            rotation=0)));\n  equation\n    p.i = 0;\n    phi = p.v;\n    annotation (\n      Icon(coordinateSystem(\n          preserveAspectRatio=true,\n          extent={{-100,-100},{100,100}},\n          grid={1,1}), graphics={\n          Text(\n            extent={{-29,-11},{30,-70}},\n            lineColor={0,0,0},\n            textString=\"V\"),\n          Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n          Line(points={{100,0},{70,0}}, color={0,0,255}),\n          Text(\n            extent={{-150,80},{150,120}},\n            textString=\"%name\",\n            lineColor={0,0,255})}),\n      Diagram(coordinateSystem(\n          preserveAspectRatio=true,\n          extent={{-100,-100},{100,100}},\n          grid={1,1}), graphics={Line(points={{-70,0},{-96,0}}, color={0,0,0}),\n            Line(points={{100,0},{70,0}}, color={0,0,255})}),\n      Documentation(revisions=\"<html>\n<ul>\n<li><i> 1998   </i>\n       by Christoph Clauss<br> initially implemented<br>\n       </li>\n</ul>\n</html>\", info=\"<html>\n<p>The potential sensor converts the voltage of a node (with respect to the ground node) into a real valued signal. It does not influence the current sum at the node which voltage is measured, therefore, the electrical behavior is not influenced by the sensor.</p>\n</html>\"));\n  end PotentialSensor;\n\n  model VoltageSensor \"Sensor to measure the voltage between two pins\"\n    extends Modelica.Icons.RotationalSensor;\n\n    Interfaces.PositivePin p \"positive pin\" annotation (Placement(\n          transformation(extent={{-110,-10},{-90,10}}, rotation=0)));\n    Interfaces.NegativePin n \"negative pin\" annotation (Placement(\n          transformation(extent={{90,-10},{110,10}}, rotation=0)));\n    Modelica.Blocks.Interfaces.RealOutput v\n      \"Voltage between pin p and n (= p.v - n.v) as output signal\"\n       annotation (Placement(transformation(\n          origin={0,-100},\n          extent={{10,-10},{-10,10}},\n          rotation=90)));\n\n  equation\n    p.i = 0;\n    n.i = 0;\n    v = p.v - n.v;\n    annotation (\n      Icon(coordinateSystem(\n          preserveAspectRatio=true,\n          extent={{-100,-100},{100,100}},\n          grid={1,1}), graphics={\n          Text(\n            extent={{-29,-11},{30,-70}},\n            lineColor={0,0,0},\n            textString=\"V\"),\n          Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n          Line(points={{70,0},{90,0}}, color={0,0,0}),\n          Line(points={{0,-90},{0,-70}}, color={0,0,255}),\n          Text(\n            extent={{-150,80},{150,120}},\n            textString=\"%name\",\n            lineColor={0,0,255})}),\n      Diagram(coordinateSystem(\n          preserveAspectRatio=true,\n          extent={{-100,-100},{100,100}},\n          grid={1,1}), graphics={\n          Line(points={{-70,0},{-96,0}}, color={0,0,0}),\n          Line(points={{70,0},{96,0}}, color={0,0,0}),\n          Line(points={{0,-90},{0,-70}}, color={0,0,255})}),\n      Documentation(revisions=\"<html>\n<ul>\n<li><i> 1998   </i>\n       by Christoph Clauss<br> initially implemented<br>\n       </li>\n</ul>\n</html>\", info=\"<html>\n<p>The voltage  sensor converts the voltage between the two connectors into a real valued signal. It does not influence the current sum at the nodes in between the voltage is measured, therefore, the electrical behavior is not influenced by the sensor.</p>\n</html>\"));\n  end VoltageSensor;\n\n  model CurrentSensor \"Sensor to measure the current in a branch\"\n    extends Modelica.Icons.RotationalSensor;\n\n    Interfaces.PositivePin p \"positive pin\" annotation (Placement(\n          transformation(extent={{-110,-10},{-90,10}}, rotation=0)));\n    Interfaces.NegativePin n \"negative pin\" annotation (Placement(\n          transformation(extent={{90,-10},{110,10}}, rotation=0)));\n    Modelica.Blocks.Interfaces.RealOutput i\n      \"current in the branch from p to n as output signal\"\n       annotation (Placement(transformation(\n          origin={0,-100},\n          extent={{10,-10},{-10,10}},\n          rotation=90)));\n\n  equation\n    p.v = n.v;\n    p.i = i;\n    n.i = -i;\n    annotation (\n      Icon(coordinateSystem(\n          preserveAspectRatio=true,\n          extent={{-100,-100},{100,100}},\n          grid={1,1}), graphics={\n          Text(\n            extent={{-29,-11},{30,-70}},\n            lineColor={0,0,0},\n            textString=\"A\"),\n          Line(points={{-70,0},{-90,0}}, color={0,0,0}),\n          Text(\n            extent={{-150,80},{150,120}},\n            textString=\"%name\",\n            lineColor={0,0,255}),\n          Line(points={{70,0},{90,0}}, color={0,0,0}),\n          Line(points={{0,-90},{0,-70}}, color={0,0,255})}),\n      Diagram(coordinateSystem(\n          preserveAspectRatio=true,\n          extent={{-100,-100},{100,100}},\n          grid={1,1}), graphics={\n          Text(\n            extent={{-153,79},{147,119}},\n            textString=\"%name\",\n            lineColor={0,0,255}),\n          Line(points={{-70,0},{-96,0}}, color={0,0,0}),\n          Line(points={{70,0},{96,0}}, color={0,0,0}),\n          Line(points={{0,-90},{0,-70}}, color={0,0,255})}),\n      Documentation(revisions=\"<html>\n<ul>\n<li><i> 1998   </i>\n       by Christoph Clauss<br> initially implemented<br>\n       </li>\n</ul>\n</html>\", info=\"<html>\n<p>The current  sensor converts the current flowing between the two connectors into a real valued signal. The two connectors are in the sensor connected like a short cut. The sensor has to be placed within an electrical connection in series.  It does not influence the current sum at the connected nodes. Therefore, the electrical behavior is not influenced by the sensor.</p>\n</html>\"));\n  end CurrentSensor;\n\nmodel PowerSensor \"Sensor to measure the power\"\n\n  Modelica.Electrical.Analog.Interfaces.PositivePin pc\n      \"Positive pin, current path\"\n    annotation (Placement(transformation(extent={{-90,-10},{-110,10}}, rotation=\n             0)));\n  Modelica.Electrical.Analog.Interfaces.NegativePin nc\n      \"Negative pin, current path\"\n    annotation (Placement(transformation(extent={{110,-10},{90,10}}, rotation=0)));\n  Modelica.Electrical.Analog.Interfaces.PositivePin pv\n      \"Positive pin, voltage path\"\n    annotation (Placement(transformation(extent={{-10,110},{10,90}}, rotation=0)));\n  Modelica.Electrical.Analog.Interfaces.NegativePin nv\n      \"Negative pin, voltage path\"\n    annotation (Placement(transformation(extent={{10,-110},{-10,-90}}, rotation=\n             0)));\n  Modelica.Blocks.Interfaces.RealOutput power\n    annotation (Placement(transformation(\n          origin={-80,-110},\n          extent={{-10,10},{10,-10}},\n          rotation=270)));\n  Modelica.Electrical.Analog.Sensors.VoltageSensor voltageSensor\n    annotation (Placement(transformation(\n          origin={0,-30},\n          extent={{10,-10},{-10,10}},\n          rotation=90)));\n  Modelica.Electrical.Analog.Sensors.CurrentSensor currentSensor\n    annotation (Placement(transformation(extent={{-50,-10},{-30,10}}, rotation=\n              0)));\n  Modelica.Blocks.Math.Product product\n    annotation (Placement(transformation(\n          origin={-30,-50},\n          extent={{-10,-10},{10,10}},\n          rotation=270)));\n\nequation\n  connect(pv, voltageSensor.p) annotation (Line(points={{0,100},{0,-20},{\n            6.12323e-016,-20}}, color={0,0,255}));\n  connect(voltageSensor.n, nv) annotation (Line(points={{-6.12323e-016,-40},{\n            -6.12323e-016,-63},{0,-63},{0,-100}}, color={0,0,255}));\n  connect(pc, currentSensor.p)\n    annotation (Line(points={{-100,0},{-50,0}}, color={0,0,255}));\n  connect(currentSensor.n, nc)\n    annotation (Line(points={{-30,0},{100,0}}, color={0,0,255}));\n  connect(currentSensor.i, product.u2) annotation (Line(points={{-40,-10},{-40,\n            -30},{-36,-30},{-36,-38}}, color={0,0,127}));\n  connect(voltageSensor.v, product.u1) annotation (Line(points={{10,-30},{-24,\n          -30},{-24,-38}},   color={0,0,127}));\n  connect(product.y, power) annotation (Line(points={{-30,-61},{-30,-80},{-80,\n            -80},{-80,-110}}, color={0,0,127}));\n  annotation (Icon(coordinateSystem(\n          preserveAspectRatio=true,\n          extent={{-100,-100},{100,100}},\n          grid={2,2}), graphics={\n          Ellipse(\n            extent={{-70,70},{70,-70}},\n            lineColor={0,0,0},\n            fillColor={255,255,255},\n            fillPattern=FillPattern.Solid),\n          Line(points={{0,100},{0,70}}, color={0,0,255}),\n          Line(points={{0,-70},{0,-100}}, color={0,0,255}),\n          Line(points={{-80,-100},{-80,0}}, color={0,0,255}),\n          Line(points={{-100,0},{100,0}}, color={0,0,255}),\n          Text(\n            extent={{150,120},{-150,160}},\n            textString=\"%name\",\n            lineColor={0,0,255}),\n          Line(points={{0,70},{0,40}}, color={0,0,0}),\n          Line(points={{22.9,32.8},{40.2,57.3}}, color={0,0,0}),\n          Line(points={{-22.9,32.8},{-40.2,57.3}}, color={0,0,0}),\n          Line(points={{37.6,13.7},{65.8,23.9}}, color={0,0,0}),\n          Line(points={{-37.6,13.7},{-65.8,23.9}}, color={0,0,0}),\n          Line(points={{0,0},{9.02,28.6}}, color={0,0,0}),\n          Polygon(\n            points={{-0.48,31.6},{18,26},{18,57.2},{-0.48,31.6}},\n            lineColor={0,0,0},\n            fillColor={0,0,0},\n            fillPattern=FillPattern.Solid),\n          Ellipse(\n            extent={{-5,5},{5,-5}},\n            lineColor={0,0,0},\n            fillColor={0,0,0},\n            fillPattern=FillPattern.Solid),\n          Text(\n            extent={{-29,-11},{30,-70}},\n            lineColor={0,0,0},\n            textString=\"P\")}),\n    Diagram(coordinateSystem(\n          preserveAspectRatio=true,\n          extent={{-100,-100},{100,100}},\n          grid={2,2}), graphics),\n    Documentation(info=\"<html>\n<p>This power sensor measures instantaneous electrical power of a singlephase system and has a separated voltage and current path. The pins of the voltage path are pv and nv, the pins of the current path are pc and nc. The internal resistance of the current path is zero, the internal resistance of the voltage path is infinite.</p>\n</html>\", revisions=\"<html>\n<ul>\n<li><i>January 12, 2006</i> by Anton Haumer implemented</li>\n</ul>\n</html>\"));\nend PowerSensor;\n  annotation (\n    Documentation(info=\"<html>\n<p>This package contains potential, voltage, and current sensors. The sensors can be used to convert voltages or currents into real signal values o be connected to components of the Blocks package. The sensors are designed in such a way that they do not influence the electrical behavior.</p>\n</html>\",\n   revisions=\"<html>\n<dl>\n<dt>\n<b>Main Authors:</b>\n<dd>\nChristoph Clau&szlig;\n    &lt;<a href=\\\"mailto:Christoph.Clauss@eas.iis.fraunhofer.de\\\">Christoph.Clauss@eas.iis.fraunhofer.de</a>&gt;<br>\n    Andr&eacute; Schneider\n    &lt;<a href=\\\"mailto:Andre.Schneider@eas.iis.fraunhofer.de\\\">Andre.Schneider@eas.iis.fraunhofer.de</a>&gt;<br>\n    Fraunhofer Institute for Integrated Circuits<br>\n    Design Automation Department<br>\n    Zeunerstra&szlig;e 38<br>\n    D-01069 Dresden<br>\n<p>\n<dt>\n<b>Copyright:</b>\n<dd>\nCopyright &copy; 1998-2010, Modelica Association and Fraunhofer-Gesellschaft.<br>\n<i>The Modelica package is <b>free</b> software; it can be redistributed and/or modified\nunder the terms of the <b>Modelica license</b>, see the license conditions\nand the accompanying <b>disclaimer</b> in the documentation of package\nModelica in file \\\"Modelica/package.mo\\\".</i><br>\n<p>\n</dl>\n</html>\"));\nend Sensors;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/package.mo",
    "content": "within ;\npackage ModelicaByExample\nannotation (uses(Modelica(version=\"3.2.1\")));\nend ModelicaByExample;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/package2.mo",
    "content": "within ModelicaByExample;\npackage PackageExamples \"Examples of using packages\"\nend PackageExamples;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/package3.mo",
    "content": "within ModelicaByExample.Subsystems;\npackage GearSubsystemModel \"Build a subsystem model representing a gear with backlash\"\nend GearSubsystemModel;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modelica/package4.mo",
    "content": "within ModelicaByExample.Subsystems;\npackage Pendula \"Example of using arrays of subsystems to build complete systems\"\nend Pendula;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Modula-2/HuffChan.mod",
    "content": "IMPLEMENTATION MODULE HuffChan;\n\n(*\n This module shows how to redefine standard IO file functions. It provides\n functions for reading and writing packed files opened in Raw mode.\n*)\n\nIMPORT IOChan, IOLink, ChanConsts, IOConsts, SYSTEM, Strings;\nFROM Storage IMPORT ALLOCATE, DEALLOCATE;\n\nCONST\n  rbldFrq = 512;\t(* means: every 512 bytes rebuild table *)\n\nTYPE\n  charTap  = POINTER TO ARRAY [0..MAX(INTEGER)-1] OF CHAR;\n  smbTp = POINTER TO smbT;\n\n  smbT = RECORD\t\t\t(* Huffman's tree *)\n    ch\t\t\t: CHAR;\n    n\t\t\t: CARDINAL; (* frequncy of char ch *)\n    left,right,next\t: smbTp;\n  END;\n\n  tblT = RECORD\t\t(* bit sequence for code *)\n    vl\t\t: CARDINAL;\t(* bit sequence *)\n    cnt\t\t: INTEGER;\t(* it length *)\n  END;\n\n  lclDataT = RECORD\t(* channel's local data *)\n    tRoot \t: smbTp;\n    htbl\t: ARRAY [0..255] OF tblT;     (* code -> bit sequence table *)\n    ftbl  \t: ARRAY [0..255] OF CARDINAL; (* frequncey table *)\n    wBf,rb1,rb2\t: CARDINAL;\n    wbc,rbc,smc\t: INTEGER;\n    chid\t: IOChan.ChanId;\n  END;\n  lclDataTp = POINTER TO lclDataT;\n  charp     = POINTER TO CHAR;\n\nVAR\n  did\t: IOLink.DeviceId;\n  ldt\t: lclDataTp;\n\n\nPROCEDURE Shf(a:CARDINAL; b : INTEGER) : CARDINAL; (* shl a,b (or shr) *)\nBEGIN\n  RETURN SYSTEM.CAST(CARDINAL,SYSTEM.SHIFT(SYSTEM.CAST(BITSET,a),b));\nEND Shf;\n\nPROCEDURE wrDword(a:CARDINAL);\t(* write 4 bytes to file *)\nBEGIN\n  IOChan.RawWrite(ldt^.chid,SYSTEM.ADR(a),4);\nEND wrDword;\n\nPROCEDURE rdDword() : CARDINAL;  (* read 4 bytes from file *)\nVAR\n  a,z : CARDINAL;\nBEGIN\n  a:=0;\n  IOChan.RawRead(ldt^.chid,SYSTEM.ADR(a),4,z);\n  RETURN a;\nEND rdDword;\n\nPROCEDURE wrSmb(ch : CHAR);\t(* write bit sequence for code ch *)\nVAR\n  v,h : CARDINAL;\n  b,c : INTEGER;\nBEGIN\n  WITH ldt^ DO\n    v:=htbl[ORD(ch)].vl;\n    c:=htbl[ORD(ch)].cnt;\n    IF c+wbc<=32 THEN\n      wBf:=Shf(wBf,c);\n      wBf:=wBf+v;\n      wbc:=wbc+c;\n      IF wbc=32 THEN\n\twrDword(wBf);\n\twBf:=0; wbc:=0;\n      END;\n      RETURN;\n    END;\n    b:=c+wbc-32;\n    h:=Shf(v,-b);\n    wBf:=Shf(wBf,32-wbc)+h;\n    wrDword(wBf);\n    wBf:=v-Shf(h,b);\n    wbc:=b;\n  END;\nEND wrSmb;\n\nPROCEDURE flush();\t(* write data in buffer *)\nBEGIN\n  WITH ldt^ DO\n    wBf:=Shf(wBf,32-wbc);\n    wrDword(wBf);\n  END;\nEND flush;\n\nPROCEDURE getSym() : CHAR; (* find code for first bit sequence in buffer *)\nVAR\n  t,i : CARDINAL;\n  b   : INTEGER;\nBEGIN\n  WITH ldt^ DO\n    IF rbc<=32 THEN\n      rb2:=rdDword();\n      t:=Shf(rb2,-rbc);\n      IF rbc=32 THEN t:=0; END;\n      rb1:=rb1+t;\n      rb2:=Shf(rb2,32-rbc);\n      IF rbc=0 THEN rb2:=0; END;\n      rbc:=rbc+32;\n    END;\n    FOR i:=0 TO 255 DO\n      t:=Shf(rb1,htbl[i].cnt-32);\n      IF t=htbl[i].vl THEN\n\trb1:=Shf(rb1,htbl[i].cnt);\n\tb:=32-htbl[i].cnt;\n\tt:=Shf(rb2,-b);\n\trb1:=rb1+t;\n\trb2:=Shf(rb2,32-b);\n\trbc:=rbc+b-32;\n\tRETURN CHR(i);\n      END;\n    END;\n  END;\nEND getSym;\n\nPROCEDURE Insert(s : smbTp); (* insert new character in Huffman's tree *)\nVAR\n  cr : smbTp;\nBEGIN\n  WITH ldt^ DO\n    IF tRoot=NIL THEN\n      cr:=tRoot;\n      tRoot:=s;\n      s^.next:=cr;\n      RETURN;\n    ELSIF tRoot^.n<=s^.n THEN\n      cr:=tRoot;\n      tRoot:=s;\n      s^.next:=cr;\n      RETURN;\n    END;\n    cr:=tRoot;\n    WHILE (cr^.next<>NIL) & (cr^.next^.n>s^.n) DO\n      cr:=cr^.next;\n    END;\n    s^.next:=cr^.next;\n    cr^.next:=s;\n  END;\nEND Insert;\n\nPROCEDURE BuildTree(); (* build Huffman's tree *)\nVAR\n  cr,ocr,ncr : smbTp;\nBEGIN\n  WITH ldt^ DO\n    LOOP\n      ocr:=NIL; cr:=tRoot;\n      WHILE cr^.next^.next<>NIL  DO\n\tocr:=cr; cr:=cr^.next;\n      END;\n      NEW(ncr);\n      ncr^.n:=cr^.n+cr^.next^.n;\n      ncr^.left:=cr;\n      ncr^.right:=cr^.next;\n      IF ocr<>NIL THEN\n\tocr^.next:=NIL;\n\tInsert(ncr);\n      ELSE\n\ttRoot:=NIL;\n\tInsert(ncr);\n\tEXIT;\n      END;\n    END;\n  END;\nEND BuildTree;\n\nPROCEDURE BuildTable(cr: smbTp; vl,n: CARDINAL); (* build table: code -> bit sequence *)\nBEGIN\n  WITH ldt^ DO\n    IF cr^.left=NIL THEN\n      htbl[ORD(cr^.ch)].vl:=vl;\n      htbl[ORD(cr^.ch)].cnt:=n;\n      DISPOSE(cr);\n      RETURN;\n    END;\n    vl:=vl*2;\n    BuildTable(cr^.left,vl,n+1);\n    BuildTable(cr^.right,vl+1,n+1);\n    DISPOSE(cr);\n  END;\nEND BuildTable;\n\nPROCEDURE clcTab(); (* build code/bitseq. table from frequency table *)\nVAR\n  i : CARDINAL;\n  s : smbTp;\nBEGIN\n  WITH ldt^ DO\n    tRoot:=NIL;\n    FOR i:=0 TO 255 DO\n      NEW(s);\n      s^.ch:=CHR(i);\n      s^.n:=ftbl[i];\n      s^.left:=NIL; s^.right:=NIL; s^.next:=NIL;\n      Insert(s);\n    END;\n    BuildTree();\n    BuildTable(tRoot,0,0);\n  END;\nEND clcTab;\n\nPROCEDURE iniHuf();\nVAR\n  i : CARDINAL;\nBEGIN\n  WITH ldt^ DO\n    FOR i:=0 TO 255 DO\n      ftbl[i]:=1;\n    END;\n    wBf:=0; wbc:=0; rb1:=0; rb2:=0; rbc:=0;\n    smc:=0;\n    clcTab();\n  END;\nEND iniHuf;\n\n\nPROCEDURE RawWrite(x: IOLink.DeviceTablePtr; buf: SYSTEM.ADDRESS;\n\t\tlen: CARDINAL);\nVAR\n  i\t: CARDINAL;\n  ch\t: CHAR;\n  cht\t: charTap;\nBEGIN\n  IF len = 0 THEN RETURN; END;\n  ldt:=SYSTEM.CAST(lclDataTp,x^.cd);\n  cht:=SYSTEM.CAST(charTap,buf);\n  WITH ldt^ DO\n    FOR i:=0 TO len-1 DO\n      ch:=cht^[i];\n      wrSmb(ch);\n      IF ch = 377C THEN wrSmb(ch); END;\n      ftbl[ORD(ch)]:=ftbl[ORD(ch)]+1; smc:=smc+1;\n      IF smc=rbldFrq THEN\n\tclcTab();\n\tsmc:=0;\n      END;\n    END;\n  END;\n  x^.result:=IOChan.ReadResult(ldt^.chid);\nEND RawWrite;\n\nPROCEDURE RawRead(x: IOLink.DeviceTablePtr; buf: SYSTEM.ADDRESS;\n\t\tblen: CARDINAL; VAR len: CARDINAL);\nVAR\n  i\t: CARDINAL;\n  cht\t: charTap;\n  ch\t: CHAR;\nBEGIN\n  ldt:=SYSTEM.CAST(lclDataTp,x^.cd);\n  cht:=SYSTEM.CAST(charTap,buf);\n  IF (blen=0) OR (x^.result<>IOConsts.allRight) THEN len:=0; RETURN; END;\n  WITH ldt^ DO\n    FOR i:=0 TO blen-1 DO\n      ch:=getSym();\n      IF ch = 377C THEN\n\tch:=getSym();\n\tIF ch = 0C THEN\n\t  x^.result:=IOConsts.endOfInput;\n\t  len:=i; cht^[i]:=0C;\n\t  RETURN;\n\tEND;\n      END;\n      cht^[i]:=ch;\n      ftbl[ORD(ch)]:=ftbl[ORD(ch)]+1; smc:=smc+1;\n      IF smc=rbldFrq THEN\n\tclcTab();\n\tsmc:=0;\n      END;\n    END;\n    len:=blen;\n  END;\nEND RawRead;\n\nPROCEDURE CreateAlias(VAR cid: ChanId; io: ChanId; VAR res: OpenResults);\nVAR\n  x\t: IOLink.DeviceTablePtr;\nBEGIN\n  IOLink.MakeChan(did,cid);\n  IF cid = IOChan.InvalidChan() THEN\n    res:=ChanConsts.outOfChans\n  ELSE\n    NEW(ldt);\n    IF ldt=NIL THEN\n      IOLink.UnMakeChan(did,cid);\n      res:=ChanConsts.outOfChans;\n      RETURN;\n    END;\n    x:=IOLink.DeviceTablePtrValue(cid,did,IOChan.notAvailable,\"\");\n    ldt^.chid:=io;\n    x^.cd:=ldt;\n    x^.doRawWrite:=RawWrite;\n    x^.doRawRead:=RawRead;\n    res:=ChanConsts.opened;\n    iniHuf();\n    x^.result:=IOConsts.allRight;\n  END;\nEND CreateAlias;\n\nPROCEDURE DeleteAlias(VAR cid: ChanId);\nVAR\n  x\t: IOLink.DeviceTablePtr;\nBEGIN\n  x:=IOLink.DeviceTablePtrValue(cid,did,IOChan.notAvailable,\"\");\n  ldt:=x^.cd;\n  IF ldt^.rbc=0 THEN\n    wrSmb(377C);\n    wrSmb(0C);\n    flush();\n  END;\n  DISPOSE(ldt);\n  IOLink.UnMakeChan(did,cid);\nEND DeleteAlias;\n\nBEGIN\n  IOLink.AllocateDeviceId(did);\nEND HuffChan.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Module Management System/descrip.mms",
    "content": "# DESCRIP.MMS\r\n# Written By:\tRobert Alan Byer / byer@mail.ourservers.net\r\n# Modified By:\tMark Pizzolato / mark@infocomm.com\r\n#\t\tNorman Lastovica / norman.lastovica@oracle.com\r\n#\r\n# This MMS/MMK build script is used to compile the various simulators in\r\n# the SIMH package for OpenVMS using DEC C v6.0-001(AXP), v6.5-001(AXP),\r\n# HP C V7.2-001 (IA64) and v6.4-005(VAX).\r\n#\r\n# Notes:  On VAX, the PDP-10 and Eclipse simulators will not be built \r\n#         due to the fact that INT64 is required for that simulator.\r\n#\r\n# This build script will accept the following build options.\r\n#\r\n#            ALL             Just Build \"Everything\".\r\n#            ALTAIR          Just Build The MITS Altair.\r\n#            ALTAIRZ80       Just Build The MITS Altair Z80.\r\n#            ECLIPSE         Just Build The Data General Eclipse.\r\n#            GRI             Just Build The GRI Corporation GRI-909.\r\n#            LGP             Just Build The Royal-McBee LGP-30.\r\n#            H316            Just Build The Honewell 316/516.\r\n#            HP2100          Just Build The Hewlett-Packard HP-2100. \r\n#            I1401           Just Build The IBM 1401.\r\n#            I1620           Just Build The IBM 1620.\r\n#            IBM1130         Just Build The IBM 1130.\r\n#            ID16            Just Build The Interdata 16-bit CPU.\r\n#            ID32            Just Build The Interdata 32-bit CPU.\r\n#            NOVA            Just Build The Data General Nova.\r\n#            PDP1            Just Build The DEC PDP-1.\r\n#            PDP4            Just Build The DEC PDP-4.\r\n#            PDP7            Just Build The DEC PDP-7.\r\n#            PDP8            Just Build The DEC PDP-8.\r\n#            PDP9            Just Build The DEC PDP-9.\r\n#            PDP10           Just Build The DEC PDP-10.\r\n#            PDP11           Just Build The DEC PDP-11.\r\n#            PDP15           Just Build The DEC PDP-15.\r\n#            S3              Just Build The IBM System 3.\r\n#            SDS             Just Build The SDS 940.\r\n#            VAX             Just Build The DEC VAX.\r\n#            VAX780          Just Build The DEC VAX780.\r\n#            CLEAN           Will Clean Files Back To Base Kit.\r\n#\r\n# To build with debugging enabled (which will also enable traceback \r\n# information) use..\r\n#\r\n#        MMK/MACRO=(DEBUG=1)\r\n#\r\n# This will produce an executable named {Simulator}-{I64|VAX|AXP}-DBG.EXE\r\n#\r\n\r\n# Let's See If We Are Going To Build With DEBUG Enabled.  Always compile\r\n# /DEBUG so that the traceback and debug information is always available\r\n# in the object files.\r\n\r\nCC_DEBUG = /DEBUG\r\n\r\n.IFDEF DEBUG\r\nLINK_DEBUG = /DEBUG/TRACEBACK\r\nCC_OPTIMIZE = /NOOPTIMIZE\r\n\r\n.IFDEF MMSALPHA\r\nALPHA_OR_IA64 = 1\r\nCC_FLAGS = /PREF=ALL\r\nARCH = AXP-DBG\r\nCC_DEFS = \"_LARGEFILE\"\r\n.ENDIF\r\n\r\n.IFDEF MMSIA64\r\nALPHA_OR_IA64 = 1\r\nCC_FLAGS = /PREF=ALL\r\nARCH = I64-DBG\r\nCC_DEFS = \"_LARGEFILE\"\r\n.ENDIF\r\n\r\n.IFDEF MMSVAX\r\nALPHA_OR_IA64 = 0\r\nCC_FLAGS = $(CC_FLAGS)\r\nARCH = VAX-DBG\r\nCC_DEFS = \"__VAX\"\r\n.ENDIF\r\n\r\n.ELSE\r\nLINK_DEBUG = /NODEBUG/NOTRACEBACK\r\n\r\n.IFDEF MMSALPHA\r\nALPHA_OR_IA64 = 1\r\nCC_OPTIMIZE = /OPT=(LEV=5)/ARCH=HOST\r\nCC_FLAGS = /PREF=ALL\r\nARCH = AXP\r\nCC_DEFS = \"_LARGEFILE\"\r\nLINK_SECTION_BINDING = /SECTION_BINDING\r\n.ENDIF\r\n\r\n.IFDEF MMSIA64\r\nALPHA_OR_IA64 = 1\r\nCC_OPTIMIZE = /OPT=(LEV=5)\r\nCC_FLAGS = /PREF=ALL\r\nARCH = I64\r\nCC_DEFS = \"_LARGEFILE\"\r\n.ENDIF\r\n\r\n.IFDEF MMSVAX\r\nALPHA_OR_IA64 = 0\r\nCC_OPTIMIZE = /OPTIMIZE\r\nCC_FLAGS = $(CC_FLAGS)\r\nARCH = VAX\r\nCC_DEFS = \"__VAX\"\r\n.ENDIF\r\n\r\n.ENDIF\r\n\r\n# Define Our Compiler Flags & Define The Compile Command\r\nOUR_CC_FLAGS = $(CC_FLAGS)$(CC_DEBUG)$(CC_OPTIMIZE) \\\r\n\t/NEST=PRIMARY/NAME=(AS_IS,SHORT)\r\nCC = CC/DECC$(OUR_CC_FLAGS)\r\n\r\n# Define The BIN Directory Where The Executables Will Go.\r\n# Define Our Library Directory.\r\n# Define The platform specific Build Directory Where The Objects Will Go.\r\n#\r\nBIN_DIR = SYS$DISK:[.BIN]\r\nLIB_DIR = SYS$DISK:[.LIB]\r\nBLD_DIR = SYS$DISK:[.LIB.BLD-$(ARCH)]\r\n\r\n# Check To Make Sure We Have SYS$DISK:[.BIN] & SYS$DISK:[.LIB] Directory.\r\n#\r\n.FIRST\r\n  @ IF (F$SEARCH(\"SYS$DISK:[]BIN.DIR\").EQS.\"\") THEN CREATE/DIRECTORY $(BIN_DIR)\r\n  @ IF (F$SEARCH(\"SYS$DISK:[]LIB.DIR\").EQS.\"\") THEN CREATE/DIRECTORY $(LIB_DIR)\r\n  @ IF (F$SEARCH(\"SYS$DISK:[.LIB]BLD-$(ARCH).DIR\").EQS.\"\") THEN CREATE/DIRECTORY $(BLD_DIR)\r\n  @ IF (F$SEARCH(\"$(BLD_DIR)*.*\").NES.\"\") THEN DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.*;*\r\n  @ IF \"\".NES.\"''CC'\" THEN DELETE/SYMBOL/GLOBAL CC\r\n\r\n# Core SIMH File Definitions.\r\n#\r\nSIMH_DIR = SYS$DISK:[]\r\nSIMH_LIB = $(LIB_DIR)SIMH-$(ARCH).OLB\r\nSIMH_SOURCE = $(SIMH_DIR)SIM_CONSOLE.C,$(SIMH_DIR)SIM_SOCK.C,\\\r\n              $(SIMH_DIR)SIM_TMXR.C,$(SIMH_DIR)SIM_ETHER.C,\\\r\n              $(SIMH_DIR)SIM_TAPE.C,$(SIMH_DIR)SIM_FIO.C,\\\r\n              $(SIMH_DIR)SIM_TIMER.C\r\n\r\n# VMS PCAP File Definitions.\r\n#\r\nPCAP_DIR = SYS$DISK:[.PCAP-VMS.PCAP-VCI]\r\nPCAP_LIB = $(LIB_DIR)PCAP-$(ARCH).OLB\r\nPCAP_SOURCE = \\\r\n\t$(PCAP_DIR)PCAPVCI.C,$(PCAP_DIR)VCMUTIL.C,\\\r\n\t$(PCAP_DIR)BPF_DUMP.C,$(PCAP_DIR)BPF_FILTER.C,\\\r\n\t$(PCAP_DIR)BPF_IMAGE.C,$(PCAP_DIR)ETHERENT.C,\\\r\n\t$(PCAP_DIR)FAD-GIFC.C,$(PCAP_DIR)GENCODE.C,\\\r\n\t$(PCAP_DIR)GRAMMAR.C,$(PCAP_DIR)INET.C,\\\r\n\t$(PCAP_DIR)NAMETOADDR.C,$(PCAP_DIR)OPTIMIZE.C,\\\r\n\t$(PCAP_DIR)PCAP.C,$(PCAP_DIR)SAVEFILE.C,\\\r\n\t$(PCAP_DIR)SCANNER.C,$(PCAP_DIR)SNPRINTF.C,\\\r\n\t$(PCAP_DIR)PCAP-VMS.C\r\nPCAP_VCMDIR = SYS$DISK:[.PCAP-VMS.PCAPVCM]\r\nPCAP_VCM_SOURCES = $(PCAP_VCMDIR)PCAPVCM.C,$(PCAP_VCMDIR)PCAPVCM_INIT.MAR,\\\r\n\t\t   $(PCAP_VCMDIR)VCI_JACKET.MAR,$(PCAP_VCMDIR)VCMUTIL.C\r\nPCAP_VCI = SYS$COMMON:[SYS$LDR]PCAPVCM.EXE\r\n\r\n# PCAP is not available on OpenVMS VAX or IA64 right now\r\n#\r\n.IFDEF MMSALPHA\r\nPCAP_EXECLET = $(PCAP_VCI)\r\nPCAP_INC = ,$(PCAP_DIR)\r\nPCAP_LIBD = $(PCAP_LIB)\r\nPCAP_LIBR = ,$(PCAP_LIB)/LIB/SYSEXE\r\nPCAP_DEFS = ,\"USE_NETWORK=1\"\r\nPCAP_SIMH_INC = /INCL=($(PCAP_DIR))\r\n.ENDIF\r\n\r\n# MITS Altair Simulator Definitions.\r\n#\r\nALTAIR_DIR = SYS$DISK:[.ALTAIR]\r\nALTAIR_LIB = $(LIB_DIR)ALTAIR-$(ARCH).OLB\r\nALTAIR_SOURCE = $(ALTAIR_DIR)ALTAIR_SIO.C,$(ALTAIR_DIR)ALTAIR_CPU.C,\\\r\n                $(ALTAIR_DIR)ALTAIR_DSK.C,$(ALTAIR_DIR)ALTAIR_SYS.C\r\nALTAIR_OPTIONS = /INCL=($(SIMH_DIR),$(ALTAIR_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# MITS Altair Z80 Simulator Definitions.\r\n#\r\nALTAIRZ80_DIR = SYS$DISK:[.ALTAIRZ80]\r\nALTAIRZ80_LIB = $(LIB_DIR)ALTAIRZ80-$(ARCH).OLB\r\nALTAIRZ80_SOURCE = $(ALTAIRZ80_DIR)/ALTAIRZ80_CPU.C,$(ALTAIRZ80_DIR)/ALTAIRZ80_CPU_NOMMU.C,\\\r\n                   $(ALTAIRZ80_DIR)/ALTAIRZ80_DSK.C,$(ALTAIRZ80_DIR)/DISASM.C,\\\r\n                   $(ALTAIRZ80_DIR)/ALTAIRZ80_SIO.C,$(ALTAIRZ80_DIR)/ALTAIRZ80_SYS.C,\\\r\n                   $(ALTAIRZ80_DIR)/ALTAIRZ80_HDSK.C,$(ALTAIRZ80_DIR)/ALTAIRZ80_NET.C,\\\r\n                   $(ALTAIRZ80_DIR)/FLASHWRITER2.C,$(ALTAIRZ80_DIR)/I86_DECODE.C,\\\r\n                   $(ALTAIRZ80_DIR)/I86_OPS.C,$(ALTAIRZ80_DIR)/I86_PRIM_OPS.C,\\\r\n                   $(ALTAIRZ80_DIR)/I8272.C,$(ALTAIRZ80_DIR)/INSNSA.C,$(ALTAIRZ80_DIR)/INSNSD.C,\\\r\n                   $(ALTAIRZ80_DIR)/MFDC.C,$(ALTAIRZ80_DIR)/N8VEM.C,$(ALTAIRZ80_DIR)/VFDHD.C,\\\r\n                   $(ALTAIRZ80_DIR)/S100_DISK1A.C,$(ALTAIRZ80_DIR)/S100_DISK2.C,\\\r\n                   $(ALTAIRZ80_DIR)/S100_FIF.C,$(ALTAIRZ80_DIR)/S100_MDRIVEH.C,\\\r\n                   $(ALTAIRZ80_DIR)/S100_MDSAD.C,$(ALTAIRZ80_DIR)/S100_SELCHAN.C,\\\r\n                   $(ALTAIRZ80_DIR)/S100_SS1.C,$(ALTAIRZ80_DIR)/S100_64FDC.C,\\\r\n                   $(ALTAIRZ80_DIR)/S100_SCP300F.C,$(ALTAIRZ80_DIR)/SIM_IMD.C,\\\r\n                   $(ALTAIRZ80_DIR)/WD179X.C\r\nALTAIRZ80_OPTIONS = /INCL=($(SIMH_DIR),$(ALTAIRZ80_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Data General Nova Simulator Definitions.\r\n#\r\nNOVA_DIR = SYS$DISK:[.NOVA]\r\nNOVA_LIB = $(LIB_DIR)NOVA-$(ARCH).OLB\r\nNOVA_SOURCE = $(NOVA_DIR)NOVA_SYS.C,$(NOVA_DIR)NOVA_CPU.C,\\\r\n              $(NOVA_DIR)NOVA_DKP.C,$(NOVA_DIR)NOVA_DSK.C,\\\r\n              $(NOVA_DIR)NOVA_LP.C,$(NOVA_DIR)NOVA_MTA.C,\\\r\n              $(NOVA_DIR)NOVA_PLT.C,$(NOVA_DIR)NOVA_PT.C,\\\r\n              $(NOVA_DIR)NOVA_CLK.C,$(NOVA_DIR)NOVA_TT.C,\\\r\n              $(NOVA_DIR)NOVA_TT1.C,$(NOVA_DIR)NOVA_QTY.C\r\nNOVA_OPTIONS = /INCL=($(SIMH_DIR),$(NOVA_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Data General Eclipse Simulator Definitions.\r\n#\r\nECLIPSE_LIB = $(LIB_DIR)ECLIPSE-$(ARCH).OLB\r\nECLIPSE_SOURCE = $(NOVA_DIR)ECLIPSE_CPU.C,$(NOVA_DIR)ECLIPSE_TT.C,\\\r\n                 $(NOVA_DIR)NOVA_SYS.C,$(NOVA_DIR)NOVA_DKP.C,\\\r\n                 $(NOVA_DIR)NOVA_DSK.C,$(NOVA_DIR)NOVA_LP.C,\\\r\n                 $(NOVA_DIR)NOVA_MTA.C,$(NOVA_DIR)NOVA_PLT.C,\\\r\n                 $(NOVA_DIR)NOVA_PT.C,$(NOVA_DIR)NOVA_CLK.C,\\\r\n                 $(NOVA_DIR)NOVA_TT1.C,$(NOVA_DIR)NOVA_QTY.C\r\nECLIPSE_OPTIONS = /INCL=($(SIMH_DIR),$(NOVA_DIR))\\\r\n    \t\t/DEF=($(CC_DEFS),\"USE_INT64=1\",\"ECLIPSE=1\")\r\n\r\n#\r\n# GRI Corporation GRI-909 Simulator Definitions.\r\n#\r\nGRI_DIR = SYS$DISK:[.GRI]\r\nGRI_LIB = $(LIB_DIR)GRI-$(ARCH).OLB\r\nGRI_SOURCE = $(GRI_DIR)GRI_CPU.C,$(GRI_DIR)GRI_STDDEV.C,$(GRI_DIR)GRI_SYS.C\r\nGRI_OPTIONS = /INCL=($(SIMH_DIR),$(GRI_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Royal-McBee LGP-30 Simulator Definitions.\r\n#\r\nLGP_DIR = SYS$DISK:[.LGP]\r\nLGP_LIB = $(LIB_DIR)LGP-$(ARCH).OLB\r\nLGP_SOURCE = $(LGP_DIR)LGP_CPU.C,$(LGP_DIR)LGP_STDDEV.C,$(LGP_DIR)LGP_SYS.C\r\nLGP_OPTIONS = /INCL=($(SIMH_DIR),$(LGP_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Honeywell 316/516 Simulator Definitions.\r\n#\r\nH316_DIR = SYS$DISK:[.H316]\r\nH316_LIB = $(LIB_DIR)H316-$(ARCH).OLB\r\nH316_SOURCE = $(H316_DIR)H316_STDDEV.C,$(H316_DIR)H316_LP.C,\\\r\n              $(H316_DIR)H316_CPU.C,$(H316_DIR)H316_SYS.C,\\\r\n              $(H316_DIR)H316_FHD.C,$(H316_DIR)H316_MT.C,\\\r\n              $(H316_DIR)H316_DP.C\r\nH316_OPTIONS = /INCL=($(SIMH_DIR),$(H316_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Hewlett-Packard HP-2100 Simulator Definitions.\r\n#\r\nHP2100_DIR = SYS$DISK:[.HP2100]\r\nHP2100_LIB = $(LIB_DIR)HP2100-$(ARCH).OLB\r\nHP2100_SOURCE = $(HP2100_DIR)HP2100_STDDEV.C,$(HP2100_DIR)HP2100_DP.C,\\\r\n                $(HP2100_DIR)HP2100_DQ.C,$(HP2100_DIR)HP2100_DR.C,\\\r\n                $(HP2100_DIR)HP2100_LPS.C,$(HP2100_DIR)HP2100_MS.C,\\\r\n                $(HP2100_DIR)HP2100_MT.C,$(HP2100_DIR)HP2100_MUX.C,\\\r\n                $(HP2100_DIR)HP2100_CPU.C,$(HP2100_DIR)HP2100_FP.C,\\\r\n                $(HP2100_DIR)HP2100_SYS.C,$(HP2100_DIR)HP2100_LPT.C,\\\r\n                $(HP2100_DIR)HP2100_IPL.C,$(HP2100_DIR)HP2100_DS.C,\\\r\n                $(HP2100_DIR)HP2100_CPU0.C,$(HP2100_DIR)HP2100_CPU1.C,\\\r\n                $(HP2100_DIR)HP2100_CPU2.C,$(HP2100_DIR)HP2100_CPU3.C,\\\r\n                $(HP2100_DIR)HP2100_CPU4.C,$(HP2100_DIR)HP2100_CPU5.C,\\\r\n                $(HP2100_DIR)HP2100_CPU6.C,$(HP2100_DIR)HP2100_CPU7.C,\\\r\n                $(HP2100_DIR)HP2100_FP1.C,$(HP2100_DIR)HP2100_BACI.C,\\\r\n                $(HP2100_DIR)HP2100_MPX.C,$(HP2100_DIR)HP2100_PIF.C\r\n.IF ALPHA_OR_IA64\r\nHP2100_OPTIONS = /INCL=($(SIMH_DIR),$(HP2100_DIR))\\\r\n    \t\t/DEF=($(CC_DEFS),\"HAVE_INT64=1\")\r\n.ELSE\r\nHP2100_OPTIONS = /INCL=($(SIMH_DIR),$(HP2100_DIR))/DEF=($(CC_DEFS))\r\n.ENDIF\r\n\r\n#\r\n# Interdata 16-bit CPU.\r\n#\r\nID16_DIR = SYS$DISK:[.INTERDATA]\r\nID16_LIB = $(LIB_DIR)ID16-$(ARCH).OLB\r\nID16_SOURCE = $(ID16_DIR)ID16_CPU.C,$(ID16_DIR)ID16_SYS.C,$(ID16_DIR)ID_DP.C,\\\r\n              $(ID16_DIR)ID_FD.C,$(ID16_DIR)ID_FP.C,$(ID16_DIR)ID_IDC.C,\\\r\n              $(ID16_DIR)ID_IO.C,$(ID16_DIR)ID_LP.C,$(ID16_DIR)ID_MT.C,\\\r\n              $(ID16_DIR)ID_PAS.C,$(ID16_DIR)ID_PT.C,$(ID16_DIR)ID_TT.C,\\\r\n              $(ID16_DIR)ID_UVC.C,$(ID16_DIR)ID16_DBOOT.C,$(ID16_DIR)ID_TTP.C\r\nID16_OPTIONS = /INCL=($(SIMH_DIR),$(ID16_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Interdata 32-bit CPU.\r\n#\r\nID32_DIR = SYS$DISK:[.INTERDATA]\r\nID32_LIB = $(LIB_DIR)ID32-$(ARCH).OLB\r\nID32_SOURCE = $(ID32_DIR)ID32_CPU.C,$(ID32_DIR)ID32_SYS.C,$(ID32_DIR)ID_DP.C,\\\r\n              $(ID32_DIR)ID_FD.C,$(ID32_DIR)ID_FP.C,$(ID32_DIR)ID_IDC.C,\\\r\n              $(ID32_DIR)ID_IO.C,$(ID32_DIR)ID_LP.C,$(ID32_DIR)ID_MT.C,\\\r\n              $(ID32_DIR)ID_PAS.C,$(ID32_DIR)ID_PT.C,$(ID32_DIR)ID_TT.C,\\\r\n              $(ID32_DIR)ID_UVC.C,$(ID32_DIR)ID32_DBOOT.C,$(ID32_DIR)ID_TTP.C\r\nID32_OPTIONS = /INCL=($(SIMH_DIR),$(ID32_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# IBM 1130 Simulator Definitions.\r\n#\r\nIBM1130_DIR = SYS$DISK:[.IBM1130]\r\nIBM1130_LIB = $(LIB_DIR)IBM1130-$(ARCH).OLB\r\nIBM1130_SOURCE = $(IBM1130_DIR)IBM1130_CPU.C,$(IBM1130_DIR)IBM1130_CR.C,\\\r\n                 $(IBM1130_DIR)IBM1130_DISK.C,$(IBM1130_DIR)IBM1130_STDDEV.C,\\\r\n                 $(IBM1130_DIR)IBM1130_SYS.C,$(IBM1130_DIR)IBM1130_GDU.C,\\\r\n                 $(IBM1130_DIR)IBM1130_GUI.C,$(IBM1130_DIR)IBM1130_PRT.C,\\\r\n                 $(IBM1130_DIR)IBM1130_FMT.C,$(IBM1130_DIR)IBM1130_PTRP.C,\\\r\n                 $(IBM1130_DIR)IBM1130_PLOT.C,$(IBM1130_DIR)IBM1130_SCA.C,\\\r\n                 $(IBM1130_DIR)IBM1130_T2741.C\r\nIBM1130_OPTIONS = /INCL=($(SIMH_DIR),$(IBM1130_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# IBM 1401 Simulator Definitions.\r\n#\r\nI1401_DIR = SYS$DISK:[.I1401]\r\nI1401_LIB = $(LIB_DIR)I1401-$(ARCH).OLB\r\nI1401_SOURCE = $(I1401_DIR)I1401_LP.C,$(I1401_DIR)I1401_CPU.C,\\\r\n               $(I1401_DIR)I1401_IQ.C,$(I1401_DIR)I1401_CD.C,\\\r\n               $(I1401_DIR)I1401_MT.C,$(I1401_DIR)I1401_DP.C,\\\r\n               $(I1401_DIR)I1401_SYS.C\r\nI1401_OPTIONS = /INCL=($(SIMH_DIR),$(I1401_DIR))/DEF=($(CC_DEFS))\r\n\r\n\r\n#\r\n# IBM 1620 Simulators Definitions.\r\n#\r\nI1620_DIR = SYS$DISK:[.I1620]\r\nI1620_LIB = $(LIB_DIR)I1620-$(ARCH).OLB\r\nI1620_SOURCE = $(I1620_DIR)I1620_CD.C,$(I1620_DIR)I1620_DP.C,\\\r\n               $(I1620_DIR)I1620_PT.C,$(I1620_DIR)I1620_TTY.C,\\\r\n               $(I1620_DIR)I1620_CPU.C,$(I1620_DIR)I1620_LP.C,\\\r\n               $(I1620_DIR)I1620_FP.C,$(I1620_DIR)I1620_SYS.C\r\nI1620_OPTIONS = /INCL=($(SIMH_DIR),$(I1620_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# PDP-1 Simulator Definitions.\r\n#\r\nPDP1_DIR = SYS$DISK:[.PDP1]\r\nPDP1_LIB = $(LIB_DIR)PDP1-$(ARCH).OLB\r\nPDP1_SOURCE = $(PDP1_DIR)PDP1_LP.C,$(PDP1_DIR)PDP1_CPU.C,\\\r\n              $(PDP1_DIR)PDP1_STDDEV.C,$(PDP1_DIR)PDP1_SYS.C,\\\r\n              $(PDP1_DIR)PDP1_DT.C,$(PDP1_DIR)PDP1_DRM.C,\\\r\n              $(PDP1_DIR)PDP1_CLK.C,$(PDP1_DIR)PDP1_DCS.C\r\nPDP1_OPTIONS = /INCL=($(SIMH_DIR),$(PDP1_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Digital Equipment PDP-8 Simulator Definitions.\r\n#\r\nPDP8_DIR = SYS$DISK:[.PDP8]\r\nPDP8_LIB = $(LIB_DIR)PDP8-$(ARCH).OLB\r\nPDP8_SOURCE = $(PDP8_DIR)PDP8_CPU.C,$(PDP8_DIR)PDP8_CLK.C,\\\r\n              $(PDP8_DIR)PDP8_DF.C,$(PDP8_DIR)PDP8_DT.C,\\\r\n              $(PDP8_DIR)PDP8_LP.C,$(PDP8_DIR)PDP8_MT.C,\\\r\n\t      $(PDP8_DIR)PDP8_PT.C,$(PDP8_DIR)PDP8_RF.C,\\\r\n              $(PDP8_DIR)PDP8_RK.C,$(PDP8_DIR)PDP8_RX.C,\\\r\n              $(PDP8_DIR)PDP8_SYS.C,$(PDP8_DIR)PDP8_TT.C,\\\r\n\t      $(PDP8_DIR)PDP8_TTX.C,$(PDP8_DIR)PDP8_RL.C,\\\r\n\t      $(PDP8_DIR)PDP8_TSC.C,$(PDP8_DIR)PDP8_TD.C,\\\r\n\t      $(PDP8_DIR)PDP8_CT.C\r\nPDP8_OPTIONS = /INCL=($(SIMH_DIR),$(PDP8_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Digital Equipment PDP-4, PDP-7, PDP-9 And PDP-15 Simulator Definitions.\r\n#\r\nPDP18B_DIR = SYS$DISK:[.PDP18B]\r\nPDP4_LIB = $(LIB_DIR)PDP4-$(ARCH).OLB\r\nPDP7_LIB = $(LIB_DIR)PDP7-$(ARCH).OLB\r\nPDP9_LIB = $(LIB_DIR)PDP9-$(ARCH).OLB\r\nPDP15_LIB = $(LIB_DIR)PDP15-$(ARCH).OLB\r\nPDP18B_SOURCE = $(PDP18B_DIR)PDP18B_DT.C,$(PDP18B_DIR)PDP18B_DRM.C,\\\r\n                $(PDP18B_DIR)PDP18B_CPU.C,$(PDP18B_DIR)PDP18B_LP.C,\\\r\n                $(PDP18B_DIR)PDP18B_MT.C,$(PDP18B_DIR)PDP18B_RF.C,\\\r\n                $(PDP18B_DIR)PDP18B_RP.C,$(PDP18B_DIR)PDP18B_STDDEV.C,\\\r\n                $(PDP18B_DIR)PDP18B_SYS.C,$(PDP18B_DIR)PDP18B_TT1.C,\\\r\n                $(PDP18B_DIR)PDP18B_RB.C,$(PDP18B_DIR)PDP18B_FPP.C\r\nPDP4_OPTIONS = /INCL=($(SIMH_DIR),$(PDP18B_DIR))/DEF=($(CC_DEFS),\"PDP4=1\")\r\nPDP7_OPTIONS = /INCL=($(SIMH_DIR),$(PDP18B_DIR))/DEF=($(CC_DEFS),\"PDP7=1\")\r\nPDP9_OPTIONS = /INCL=($(SIMH_DIR),$(PDP18B_DIR))/DEF=($(CC_DEFS),\"PDP9=1\")\r\nPDP15_OPTIONS = /INCL=($(SIMH_DIR),$(PDP18B_DIR))/DEF=($(CC_DEFS),\"PDP15=1\")\r\n\r\n#\r\n# Digital Equipment PDP-11 Simulator Definitions.\r\n#\r\nPDP11_DIR = SYS$DISK:[.PDP11]\r\nPDP11_LIB1 = $(LIB_DIR)PDP11L1-$(ARCH).OLB\r\nPDP11_SOURCE1 = $(PDP11_DIR)PDP11_FP.C,$(PDP11_DIR)PDP11_CPU.C,\\\r\n               $(PDP11_DIR)PDP11_DZ.C,$(PDP11_DIR)PDP11_CIS.C,\\\r\n               $(PDP11_DIR)PDP11_LP.C,$(PDP11_DIR)PDP11_RK.C,\\\r\n               $(PDP11_DIR)PDP11_RL.C,$(PDP11_DIR)PDP11_RP.C,\\\r\n               $(PDP11_DIR)PDP11_RX.C,$(PDP11_DIR)PDP11_STDDEV.C,\\\r\n               $(PDP11_DIR)PDP11_SYS.C,$(PDP11_DIR)PDP11_TC.C, \\\r\n               $(PDP11_DIR)PDP11_CPUMOD.C,$(PDP11_DIR)PDP11_CR.C,\\\r\n               $(PDP11_DIR)PDP11_TA.C,$(PDP11_DIR)PDP11_IO_LIB.C\r\nPDP11_LIB2 = $(LIB_DIR)PDP11L2-$(ARCH).OLB\r\nPDP11_SOURCE2 = $(PDP11_DIR)PDP11_TM.C,$(PDP11_DIR)PDP11_TS.C,\\\r\n               $(PDP11_DIR)PDP11_IO.C,$(PDP11_DIR)PDP11_RQ.C,\\\r\n               $(PDP11_DIR)PDP11_TQ.C,$(PDP11_DIR)PDP11_PCLK.C,\\\r\n               $(PDP11_DIR)PDP11_RY.C,$(PDP11_DIR)PDP11_PT.C,\\\r\n               $(PDP11_DIR)PDP11_HK.C,$(PDP11_DIR)PDP11_XQ.C,\\\r\n               $(PDP11_DIR)PDP11_VH.C,$(PDP11_DIR)PDP11_RH.C,\\\r\n               $(PDP11_DIR)PDP11_XU.C,$(PDP11_DIR)PDP11_TU.C,\\\r\n               $(PDP11_DIR)PDP11_DL.C,$(PDP11_DIR)PDP11_RF.C, \\\r\n               $(PDP11_DIR)PDP11_RC.C,$(PDP11_DIR)PDP11_KG.C,\\\r\n               $(PDP11_DIR)PDP11_KE.C,$(PDP11_DIR)PDP11_DC.C\r\nPDP11_OPTIONS = /INCL=($(SIMH_DIR),$(PDP11_DIR)$(PCAP_INC))\\\r\n\t\t/DEF=($(CC_DEFS),\"VM_PDP11=1\"$(PCAP_DEFS))\r\n\r\n#\r\n# Digital Equipment PDP-10 Simulator Definitions.\r\n#\r\nPDP10_DIR = SYS$DISK:[.PDP10]\r\nPDP10_LIB = $(LIB_DIR)PDP10-$(ARCH).OLB\r\nPDP10_SOURCE = $(PDP10_DIR)PDP10_FE.C,\\\r\n               $(PDP10_DIR)PDP10_CPU.C,$(PDP10_DIR)PDP10_KSIO.C,\\\r\n               $(PDP10_DIR)PDP10_LP20.C,$(PDP10_DIR)PDP10_MDFP.C,\\\r\n\t       $(PDP10_DIR)PDP10_PAG.C,$(PDP10_DIR)PDP10_XTND.C,\\\r\n               $(PDP10_DIR)PDP10_RP.C,$(PDP10_DIR)PDP10_SYS.C,\\\r\n               $(PDP10_DIR)PDP10_TIM.C,$(PDP10_DIR)PDP10_TU.C,\\\r\n\t       $(PDP11_DIR)PDP11_PT.C,$(PDP11_DIR)PDP11_DZ.C,\\\r\n               $(PDP11_DIR)PDP11_RY.C,$(PDP11_DIR)PDP11_XU.C,\\\r\n               $(PDP11_DIR)PDP11_CR.C\r\nPDP10_OPTIONS = /INCL=($(SIMH_DIR),$(PDP10_DIR),$(PDP11_DIR))\\\r\n\t\t/DEF=($(CC_DEFS),\"USE_INT64=1\",\"VM_PDP10=1\"$(PCAP_DEFS))\r\n\r\n#\r\n# IBM System 3 Simulator Definitions.\r\n#\r\nS3_DIR = SYS$DISK:[.S3]\r\nS3_LIB = $(LIB_DIR)S3-$(ARCH).OLB\r\nS3_SOURCE = $(S3_DIR)S3_CD.C,$(S3_DIR)S3_CPU.C,$(S3_DIR)S3_DISK.C,\\\r\n            $(S3_DIR)S3_LP.C,$(S3_DIR)S3_PKB.C,$(S3_DIR)S3_SYS.C\r\nS3_OPTIONS = /INCL=($(SIMH_DIR),$(S3_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# SDS 940\r\n#\r\nSDS_DIR = SYS$DISK:[.SDS]\r\nSDS_LIB = $(LIB_DIR)SDS-$(ARCH).OLB\r\nSDS_SOURCE = $(SDS_DIR)SDS_CPU.C,$(SDS_DIR)SDS_DRM.C,$(SDS_DIR)SDS_DSK.C,\\ \r\n             $(SDS_DIR)SDS_IO.C,$(SDS_DIR)SDS_LP.C,$(SDS_DIR)SDS_MT.C,\\\r\n             $(SDS_DIR)SDS_MUX.C,$(SDS_DIR)SDS_RAD.C,$(SDS_DIR)SDS_STDDEV.C,\\\r\n             $(SDS_DIR)SDS_SYS.C\r\nSDS_OPTIONS = /INCL=($(SIMH_DIR),$(SDS_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Digital Equipment VAX Simulator Definitions.\r\n#\r\nVAX_DIR = SYS$DISK:[.VAX]\r\nVAX_LIB = $(LIB_DIR)VAX-$(ARCH).OLB\r\nVAX_SOURCE = $(VAX_DIR)VAX_CIS.C,$(VAX_DIR)VAX_CMODE.C,\\\r\n             $(VAX_DIR)VAX_CPU.C,$(VAX_DIR)VAX_CPU1.C,\\\r\n             $(VAX_DIR)VAX_FPA.C,$(VAX_DIR)VAX_MMU.C,\\\r\n             $(VAX_DIR)VAX_OCTA.C,$(VAX_DIR)VAX_SYS.C,\\\r\n             $(VAX_DIR)VAX_SYSCM.C,$(VAX_DIR)VAX_SYSDEV.C,\\\r\n\t     $(VAX_DIR)VAX_SYSLIST.C,$(VAX_DIR)VAX_IO.C,\\\r\n             $(VAX_DIR)VAX_STDDEV.C,$(PDP11_DIR)PDP11_IO_LIB.C,\\\r\n             $(PDP11_DIR)PDP11_RL.C,$(PDP11_DIR)PDP11_RQ.C,\\\r\n             $(PDP11_DIR)PDP11_TS.C,$(PDP11_DIR)PDP11_DZ.C,\\\r\n             $(PDP11_DIR)PDP11_LP.C,$(PDP11_DIR)PDP11_TQ.C,\\\r\n             $(PDP11_DIR)PDP11_XQ.C,$(PDP11_DIR)PDP11_CR.C,\\\r\n             $(PDP11_DIR)PDP11_RY.C,$(PDP11_DIR)PDP11_VH.C\r\nVAX_OPTIONS = /INCL=($(SIMH_DIR),$(VAX_DIR),$(PDP11_DIR)$(PCAP_INC))\\\r\n\t\t/DEF=($(CC_DEFS),\"VM_VAX=1\"$(PCAP_DEFS))\r\n\r\n# Digital Equipment VAX780 Simulator Definitions.\r\n#\r\nVAX780_DIR = SYS$DISK:[.VAX]\r\nVAX780_LIB1 = $(LIB_DIR)VAX780L1-$(ARCH).OLB\r\nVAX780_SOURCE1 = $(VAX780_DIR)VAX_CPU.C,$(VAX780_DIR)VAX_CPU1.C,\\\r\n\t$(VAX780_DIR)VAX_FPA.C,$(VAX780_DIR)VAX_CIS.C,\\\r\n\t$(VAX780_DIR)VAX_OCTA.C,$(VAX780_DIR)VAX_CMODE.C,\\\r\n\t$(VAX780_DIR)VAX_MMU.C,$(VAX780_DIR)VAX_SYS.C,\\\r\n\t$(VAX780_DIR)VAX_SYSCM.C,$(VAX780_DIR)VAX780_STDDEV.C,\\\r\n\t$(VAX780_DIR)VAX780_SBI.C,$(VAX780_DIR)VAX780_MEM.C,\\\r\n\t$(VAX780_DIR)VAX780_UBA.C,$(VAX780_DIR)VAX780_MBA.C,\\\r\n\t$(VAX780_DIR)VAX780_FLOAD.C,$(VAX780_DIR)VAX780_SYSLIST.C\r\nVAX780_LIB2 = $(LIB_DIR)VAX780L2-$(ARCH).OLB\r\nVAX780_SOURCE2 = $(PDP11_DIR)PDP11_RL.C,$(PDP11_DIR)PDP11_RQ.C,\\\r\n\t$(PDP11_DIR)PDP11_TS.C,$(PDP11_DIR)PDP11_DZ.C,\\\r\n\t$(PDP11_DIR)PDP11_LP.C,$(PDP11_DIR)PDP11_TQ.C,\\\r\n\t$(PDP11_DIR)PDP11_XU.C,$(PDP11_DIR)PDP11_RY.C,\\\r\n\t$(PDP11_DIR)PDP11_CR.C,$(PDP11_DIR)PDP11_RP.C,\\\r\n\t$(PDP11_DIR)PDP11_TU.C,$(PDP11_DIR)PDP11_HK.C,\\\r\n        $(PDP11_DIR)PDP11_IO_LIB.C\r\nVAX780_OPTIONS = /INCL=($(SIMH_DIR),$(VAX780_DIR),$(PDP11_DIR)$(PCAP_INC))\\\r\n\t/DEF=($(CC_DEFS),\"VM_VAX=1\"$(PCAP_DEFS),\"VAX_780=1\")\r\n\r\n# IBM 7094 Simulator Definitions.\r\n#\r\nI7094_DIR = SYS$DISK:[.I7094]\r\nI7094_LIB = $(LIB_DIR)I7094-$(ARCH).OLB\r\nI7094_SOURCE = $(I7094_DIR)I7094_CPU.C,$(I7094_DIR)I7094_CPU1.C,\\\r\n\t$(I7094_DIR)I7094_IO.C,$(I7094_DIR)I7094_CD.C,\\\r\n\t$(I7094_DIR)I7094_CLK.C,$(I7094_DIR)I7094_COM.C,\\\r\n\t$(I7094_DIR)I7094_DRM.C,$(I7094_DIR)I7094_DSK.C,\\\r\n\t$(I7094_DIR)I7094_SYS.C,$(I7094_DIR)I7094_LP.C,\\\r\n\t$(I7094_DIR)I7094_MT.C,$(I7094_DIR)I7094_BINLOADER.C\r\nI7094_OPTIONS = /INCL=($(SIMH_DIR),$(I7094_DIR))/DEF=($(CC_DEFS))\r\n\r\n# If we're not a VAX, Build Everything\r\n#\r\n.IF ALPHA_OR_IA64\r\nALL :\tALTAIR ALTAIRZ80 ECLIPSE GRI LGP H316 HP2100 I1401 I1620 IBM1130 ID16 \\\r\n\tID32 NOVA PDP1 PDP4 PDP7 PDP8 PDP9 PDP10 PDP11 PDP15 S3 VAX VAX780 SDS \\\r\n\tI7094\r\n\t@CONTINUE\r\n.ELSE\r\n#\r\n# Else We Are On VAX And Build Everything EXCEPT the 64b simulators\r\n#\r\nALL :\tALTAIR ALTAIRZ80 GRI H316 HP2100 I1401 I1620 IBM1130 ID16 ID32 \\\r\n\tNOVA PDP1 PDP4 PDP7 PDP8 PDP9 PDP11 PDP15 S3 VAX VAX780 SDS\r\n\t@CONTINUE\r\n.ENDIF\r\n\r\nCLEAN : \r\n\t$!\r\n\t$! Clean out all targets and building Remnants\r\n\t$!\r\n\t$ IF (F$SEARCH(\"$(BIN_DIR)*.EXE;*\").NES.\"\") THEN -\r\n\t     DELETE/NOLOG/NOCONFIRM $(BIN_DIR)*.EXE;*\r\n\t$ IF (F$SEARCH(\"$(LIB_DIR)*.OLB;*\").NES.\"\") THEN -\r\n\t     DELETE/NOLOG/NOCONFIRM $(LIB_DIR)*.OLB;*\r\n\t$ IF (F$SEARCH(\"SYS$DISK:[...]*.OBJ;*\").NES.\"\") THEN -\r\n\t     DELETE/NOLOG/NOCONFIRM SYS$DISK:[...]*.OBJ;*\r\n\t$ IF (F$SEARCH(\"SYS$DISK:[...]*.LIS;*\").NES.\"\") THEN -\r\n\t     DELETE/NOLOG/NOCONFIRM SYS$DISK:[...]*.LIS;*\r\n\t$ IF (F$SEARCH(\"SYS$DISK:[...]*.MAP;*\").NES.\"\") THEN -\r\n\t     DELETE/NOLOG/NOCONFIRM SYS$DISK:[...]*.MAP;*\r\n\r\n#\r\n# Build The Libraries.\r\n#\r\n$(SIMH_LIB) : $(SIMH_SOURCE)\r\n                $!\r\n\t\t$! Building The $(SIMH_LIB) Library.\r\n                $!\r\n                $ $(CC)/DEF=($(CC_DEFS)$(PCAP_DEFS))$(PCAP_SIMH_INC) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(ALTAIR_LIB) : $(ALTAIR_SOURCE)\r\n\t\t$!\r\n\t\t$! Building The $(ALTAIR_LIB) Library.\r\n                $!\r\n                $ $(CC)$(ALTAIR_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(ALTAIRZ80_LIB) : $(ALTAIRZ80_SOURCE)\r\n                $!\r\n\t\t$! Building The $(ALTAIRZ80_LIB) Library.\r\n                $!\r\n                $ $(CC)$(ALTAIRZ80_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n#\r\n# If Not On VAX, Build The Eclipse Library.\r\n#\r\n.IF ALPHA_OR_IA64\r\n$(ECLIPSE_LIB) : $(ECLIPSE_SOURCE)\r\n                $!\r\n\t\t$! Building The $(ECLIPSE_LIB) Library.\r\n                $!\r\n                $ $(CC)$(ECLIPSE_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# We Are On VAX And Due To The Use of INT64 We Can't Build It.\r\n#\r\n$(ECLIPSE_LIB) : \r\n                $!\r\n\t\t$! Due To The Use Of INT64 We Can't Build The\r\n                $! $(LIB_DIR)ECLIPSE-$(ARCH).OLB Library On VAX.\r\n                $!\r\n.ENDIF\r\n\r\n$(GRI_LIB) : $(GRI_SOURCE)\r\n\t\t$!\r\n\t\t$! Building The $(GRI_LIB) Library.\r\n\t\t$!\r\n\t\t$ $(CC)$(GRI_OPTIONS) -\r\n\t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n\t\t$ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n\t\t\tLIBRARY/CREATE $(MMS$TARGET)\r\n\t\t$ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n\t\t$ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(LGP_LIB) : $(LGP_SOURCE)\r\n\t\t$!\r\n\t\t$! Building The $(LGP_LIB) Library.\r\n\t\t$!\r\n\t\t$ $(CC)$(LGP_OPTIONS) -\r\n\t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n\t\t$ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n\t\t\tLIBRARY/CREATE $(MMS$TARGET)\r\n\t\t$ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n\t\t$ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(H316_LIB) : $(H316_SOURCE)\r\n                $!\r\n\t\t$! Building The $(H316_LIB) Library.\r\n                $!\r\n                $ $(CC)$(H316_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(HP2100_LIB) : $(HP2100_SOURCE)\r\n                $!\r\n\t\t$! Building The $(HP2100_LIB) Library.\r\n                $!\r\n                $ $(CC)$(HP2100_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(I1401_LIB) : $(I1401_SOURCE)\r\n                $!\r\n\t\t$! Building The $(I1401_LIB) Library.\r\n                $!\r\n\t        $ $(CC)$(I1401_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(I1620_LIB) : $(I1620_SOURCE)\r\n                $!\r\n\t\t$! Building The $(I1620_LIB) Library.\r\n                $!\r\n\t        $ $(CC)$(I1620_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(IBM1130_LIB) : $(IBM1130_SOURCE)\r\n                $!\r\n\t\t$! Building The $(IBM1130_LIB) Library.\r\n                $!\r\n\t        $ $(CC)$(IBM1130_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(ID16_LIB) : $(ID16_SOURCE)\r\n                $!\r\n\t\t$! Building The $(ID16_LIB) Library.\r\n                $!\r\n\t        $ $(CC)$(ID16_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(ID32_LIB) : $(ID32_SOURCE)\r\n                $!\r\n\t\t$! Building The $(ID32_LIB) Library.\r\n                $!\r\n\t        $ $(CC)$(ID32_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(NOVA_LIB) : $(NOVA_SOURCE)\r\n                $!\r\n\t\t$! Building The $(NOVA_LIB) Library.\r\n                $!\r\n                $ $(CC)$(NOVA_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP1_LIB) : $(PDP1_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP1_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP1_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP4_LIB) : $(PDP18B_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP4_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP4_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP7_LIB) : $(PDP18B_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP7_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP7_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP8_LIB) : $(PDP8_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP8_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP8_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP9_LIB) : $(PDP18B_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP9_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP9_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n#\r\n# If Not On VAX, Build The PDP-10 Library.\r\n#\r\n.IF ALPHA_OR_IA64\r\n$(PDP10_LIB) : $(PDP10_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP10_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP10_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# We Are On VAX And Due To The Use of INT64 We Can't Build It.\r\n#\r\n$(PDP10_LIB) : \r\n\t\t$! Due To The Use Of INT64 We Can't Build The\r\n                $! $(LIB_DIR)PDP10-$(ARCH).OLB Library On VAX.\r\n.ENDIF\r\n\r\n$(PDP11_LIB1) : $(PDP11_SOURCE1)\r\n                $!\r\n\t\t$! Building The $(PDP11_LIB1) Library.\r\n                $!\r\n                $(CC)$(PDP11_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP11_LIB2) : $(PDP11_SOURCE2)\r\n                $!\r\n\t\t$! Building The $(PDP11_LIB2) Library.\r\n                $!\r\n                $(CC)$(PDP11_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP15_LIB) : $(PDP18B_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP15_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP15_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(S3_LIB) : $(S3_SOURCE)\r\n                $!\r\n\t\t$! Building The $(S3_LIB) Library.\r\n                $!\r\n                $ $(CC)$(S3_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(SDS_LIB) : $(SDS_SOURCE)\r\n                $!\r\n\t\t$! Building The $(SDS_LIB) Library.\r\n                $!\r\n                $ $(CC)$(SDS_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(VAX_LIB) : $(VAX_SOURCE)\r\n                $!\r\n\t\t$! Building The $(VAX_LIB) Library.\r\n                $!\r\n                $ $(CC)$(VAX_OPTIONS)/OBJ=$(VAX_DIR) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(VAX780_LIB1) : $(VAX780_SOURCE1)\r\n                $!\r\n\t\t$! Building The $(VAX780_LIB1) Library.\r\n                $!\r\n                $ $(CC)$(VAX780_OPTIONS)/OBJ=$(VAX780_DIR) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(VAX780_LIB2) : $(VAX780_SOURCE2)\r\n                $!\r\n\t\t$! Building The $(VAX780_LIB2) Library.\r\n                $!\r\n                $ $(CC)$(VAX780_OPTIONS)/OBJ=$(VAX780_DIR) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PCAP_LIB) : $(PCAP_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PCAP_LIB) Library.\r\n                $!\r\n\t\t$ SET DEFAULT $(PCAP_DIR)\r\n                $ @VMS_PCAP $(DEBUG)\r\n\t\t$ SET DEFAULT [--]\r\n                $ IF (F$SEARCH(\"$(PCAP_LIB)\").NES.\"\") THEN -\r\n                        DELETE $(PCAP_LIB);\r\n                $ COPY $(PCAP_DIR)PCAP.OLB $(PCAP_LIB)\r\n                $ DELETE/NOLOG/NOCONFIRM $(PCAP_DIR)*.OBJ;*,$(PCAP_DIR)*.OLB;*\r\n\t\t\t     \r\n#\r\n# If Not On VAX, Build The IBM 7094 Library.\r\n#\r\n.IF ALPHA_OR_IA64\r\n$(I7094_LIB) : $(I7094_SOURCE)\r\n                $!\r\n\t\t$! Building The $(I7094_LIB) Library.\r\n                $!\r\n                $ $(CC)$(I7094_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# We Are On VAX And Due To The Use of INT64 We Can't Build It.\r\n#\r\n$(I7094_LIB) : \r\n\t\t$! Due To The Use Of INT64 We Can't Build The\r\n                $! $(LIB_DIR)I7094-$(ARCH).OLB Library On VAX.\r\n.ENDIF\r\n\r\n#\r\n# Individual Simulator Builds.\r\n#\r\nALTAIR : $(SIMH_LIB) $(ALTAIR_LIB)\r\n         $!\r\n         $! Building The $(BIN_DIR)ALTAIR-$(ARCH).EXE Simulator.\r\n         $!\r\n         $ $(CC)$(ALTAIR_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n         $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)ALTAIR-$(ARCH).EXE -\r\n                $(BLD_DIR)SCP.OBJ,$(ALTAIR_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n         $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nALTAIRZ80 : $(SIMH_LIB) $(ALTAIRZ80_LIB)\r\n            $!\r\n            $! Building The $(BIN_DIR)ALTAIRZ80-$(ARCH).EXE Simulator.\r\n            $!\r\n            $ $(CC)$(ALTAIRZ80_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n            $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)ALTAIRZ80-$(ARCH).EXE -\r\n                   $(BLD_DIR)SCP.OBJ,$(ALTAIRZ80_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n            $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n#\r\n# If Not On VAX, Build The PDP-10 Simulator.\r\n#\r\n.IF ALPHA_OR_IA64\r\nECLIPSE : $(SIMH_LIB) $(ECLIPSE_LIB)\r\n          $!\r\n          $! Building The $(BIN_DIR)ECLIPSE-$(ARCH).EXE Simulator.\r\n          $!\r\n          $ $(CC)$(ECLIPSE_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n          $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)ECLIPSE-$(ARCH).EXE -\r\n                 $(BLD_DIR)SCP.OBJ,$(ECLIPSE_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n          $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# Else We Are On VAX And Tell The User We Can't Build On VAX\r\n# Due To The Use Of INT64.\r\n#\r\nECLIPSE : \r\n        $! Sorry, Can't Build $(BIN_DIR)ECLIPSE-$(ARCH).EXE Simulator\r\n        $! Because It Requires The Use Of INT64.\r\n.ENDIF\r\n\r\nGRI : $(SIMH_LIB) $(GRI_LIB)\r\n      $!\r\n      $! Building The $(BIN_DIR)GRI-$(ARCH).EXE Simulator.\r\n      $!\r\n      $ $(CC)$(GRI_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n      $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)GRI-$(ARCH).EXE -\r\n             $(BLD_DIR)SCP.OBJ,$(GRI_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n      $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nLGP : $(SIMH_LIB) $(LGP_LIB)\r\n      $!\r\n      $! Building The $(BIN_DIR)LGP-$(ARCH).EXE Simulator.\r\n      $!\r\n      $ $(CC)$(LGP_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n      $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)LGP-$(ARCH).EXE -\r\n             $(BLD_DIR)SCP.OBJ,$(LGP_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n      $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nH316 : $(SIMH_LIB) $(H316_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)H316-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(H316_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)H316-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(H316_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nHP2100 : $(SIMH_LIB) $(HP2100_LIB)\r\n         $!\r\n         $! Building The $(BIN_DIR)HP2100-$(ARCH).EXE Simulator.\r\n         $!\r\n         $ $(CC)$(HP2100_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n         $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)HP2100-$(ARCH).EXE -\r\n                $(BLD_DIR)SCP.OBJ,$(HP2100_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n         $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nI1401 : $(SIMH_LIB) $(I1401_LIB)\r\n        $!\r\n        $! Building The $(BIN_DIR)I1401-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(I1401_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)I1401-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(I1401_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nI1620 : $(SIMH_LIB) $(I1620_LIB)\r\n        $!\r\n        $! Building The $(BIN_DIR)I1620-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(I1620_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)I1620-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(I1620_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nIBM1130 : $(SIMH_LIB) $(IBM1130_LIB)\r\n          $!\r\n          $! Building The $(BIN_DIR)IBM1130-$(ARCH).EXE Simulator.\r\n          $!\r\n          $ $(CC)$(IBM1130_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n          $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)IBM1130-$(ARCH).EXE -\r\n                 $(BLD_DIR)SCP.OBJ,$(IBM1130_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n          $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nID16 : $(SIMH_LIB) $(ID16_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)ID16-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(ID16_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)ID16-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(ID16_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nID32 : $(SIMH_LIB) $(ID32_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)ID32-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(ID32_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)ID32-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(ID32_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nNOVA : $(SIMH_LIB) $(NOVA_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)NOVA-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(NOVA_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)NOVA-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(NOVA_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP1 : $(SIMH_LIB) $(PDP1_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)PDP1-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(PDP1_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP1-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(PDP1_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP4 : $(SIMH_LIB) $(PDP4_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)PDP4-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(PDP4_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP4-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(PDP4_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP7 : $(SIMH_LIB) $(PDP7_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)PDP7-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(PDP7_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP7-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(PDP7_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP8 : $(SIMH_LIB) $(PDP8_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)PDP8-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(PDP8_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP8-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(PDP8_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP9 : $(SIMH_LIB) $(PDP9_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)PDP9-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(PDP9_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP9-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(PDP9_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n#\r\n# If Not On VAX, Build The PDP-10 Simulator.\r\n#\r\n.IF ALPHA_OR_IA64\r\nPDP10 : $(SIMH_LIB) $(PCAP_LIBD) $(PDP10_LIB) $(PCAP_EXECLET)\r\n        $!\r\n        $! Building The $(BIN_DIR)PDP10-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(PDP10_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP10-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(PDP10_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY$(PCAP_LIBR)\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# Else We Are On VAX And Tell The User We Can't Build On VAX\r\n# Due To The Use Of INT64.\r\n#\r\nPDP10 : \r\n        $! Sorry, Can't Build $(BIN_DIR)PDP10-$(ARCH).EXE Simulator\r\n        $! Because It Requires The Use Of INT64.\r\n.ENDIF\r\n\r\nPDP11 : $(SIMH_LIB) $(PCAP_LIBD) $(PDP11_LIB1) $(PDP11_LIB2) $(PCAP_EXECLET)\r\n        $!\r\n        $! Building The $(BIN_DIR)PDP11-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(PDP11_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP11-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(PDP11_LIB1)/LIBRARY,$(PDP11_LIB2)/LIBRARY,$(SIMH_LIB)/LIBRARY$(PCAP_LIBR)\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP15 : $(SIMH_LIB) $(PDP15_LIB)\r\n        $!\r\n        $! Building The $(BIN_DIR)PDP15-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(PDP15_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP15-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(PDP15_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nS3 : $(SIMH_LIB) $(S3_LIB)\r\n     $!\r\n     $! Building The $(BIN_DIR)S3-$(ARCH).EXE Simulator.\r\n     $!\r\n     $ $(CC)$(S3_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n     $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)S3-$(ARCH).EXE -\r\n            $(BLD_DIR)SCP.OBJ,$(S3_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n     $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nSDS : $(SIMH_LIB) $(SDS_LIB)\r\n      $!\r\n      $! Building The $(BIN_DIR)SDS-$(ARCH).EXE Simulator.\r\n      $!\r\n      $ $(CC)$(SDS_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n      $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)SDS-$(ARCH).EXE -\r\n             $(BLD_DIR)SCP.OBJ,$(SDS_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n      $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nVAX : $(SIMH_LIB) $(PCAP_LIBD) $(VAX_LIB) $(PCAP_EXECLET)\r\n      $!\r\n      $! Building The $(BIN_DIR)VAX-$(ARCH).EXE Simulator.\r\n      $!\r\n      $ $(CC)$(VAX_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n      $ LINK $(LINK_DEBUG)$(LINK_SECTION_BINDING)-\r\n\t     /EXE=$(BIN_DIR)VAX-$(ARCH).EXE -\r\n             $(BLD_DIR)SCP.OBJ,$(VAX_LIB)/LIBRARY,-\r\n\t     $(SIMH_LIB)/LIBRARY$(PCAP_LIBR)\r\n      $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nVAX780 : $(SIMH_LIB) $(PCAP_LIBD) $(VAX780_LIB1) $(VAX780_LIB2) $(PCAP_EXECLET)\r\n      $!\r\n      $! Building The $(BIN_DIR)VAX780-$(ARCH).EXE Simulator.\r\n      $!\r\n      $ $(CC)$(VAX780_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n      $ LINK $(LINK_DEBUG)$(LINK_SECTION_BINDING)-\r\n             /EXE=$(BIN_DIR)VAX780-$(ARCH).EXE -\r\n             $(BLD_DIR)SCP.OBJ,-\r\n             $(VAX780_LIB1)/LIBRARY,$(VAX780_LIB2)/LIBRARY,-\r\n \t     $(SIMH_LIB)/LIBRARY$(PCAP_LIBR)\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n#\r\n# If Not On VAX, Build The IBM 7094 Simulator.\r\n#\r\n.IF ALPHA_OR_IA64\r\nI7094 : $(SIMH_LIB) $(I7094_LIB)\r\n        $!\r\n        $! Building The $(BIN_DIR)I7094-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(I7094_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)I7094-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(I7094_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY$(PCAP_LIBR)\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# Else We Are On VAX And Tell The User We Can't Build On VAX\r\n# Due To The Use Of INT64.\r\n#\r\nI7094 : \r\n        $! Sorry, Can't Build $(BIN_DIR)I7094-$(ARCH).EXE Simulator\r\n        $! Because It Requires The Use Of INT64.\r\n.ENDIF\r\n\r\n#\r\n# PCAP VCI Components\r\n#\r\n$(PCAP_VCI) : $(PCAP_VCMDIR)PCAPVCM.EXE\r\n              $!\r\n              $! Installing the PCAP VCI Execlet in SYS$LOADABLE_IMAGES\r\n              $!\r\n              $ COPY $(PCAP_VCMDIR)PCAPVCM.EXE SYS$COMMON:[SYS$LDR]PCAPVCM.EXE \r\n\r\n$(PCAP_VCMDIR)PCAPVCM.EXE : $(PCAP_VCM_SOURCES) \r\n                            $!\r\n                            $! Building The PCAP VCI Execlet\r\n                            $!\r\n                            $ @SYS$DISK:[.PCAP-VMS.PCAPVCM]BUILD_PCAPVCM\r\n                            $ DELETE/NOLOG/NOCONFIRM $(PCAP_VCMDIR)*.OBJ;*,$(PCAP_VCMDIR)*.MAP;*\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Module Management System/openvms.mmk",
    "content": "#    Copyright (C) 1997, 2000 Aladdin Enterprises. All rights reserved.\n# \n# This software is provided AS-IS with no warranty, either express or\n# implied.\n# \n# This software is distributed under license and may not be copied,\n# modified or distributed except as expressly authorized under the terms\n# of the license contained in the file LICENSE in this distribution.\n# \n# For more information about licensing, please refer to\n# http://www.ghostscript.com/licensing/. For information on\n# commercial licensing, go to http://www.artifex.com/licensing/ or\n# contact Artifex Software, Inc., 101 Lucas Valley Road #110,\n# San Rafael, CA  94903, U.S.A., +1(415)492-9861.\n\n# $Id: openvms.mmk,v 1.31 2004/12/10 23:48:48 giles Exp $\n# makefile for OpenVMS VAX and Alpha using MMK\n#\n# Please contact Jim Dunham (dunham@omtool.com) if you have questions.\n# Addapted for MMK by Jouk Jansen (joukj@hrem.stm.tudelft.nl)\n# Support for VAX C on OpenVMS was removed in release 6.01 by Aladdin:\n# DEC C is now used on both VAX and Alpha platforms.\n#\n# ------------------------------- Options ------------------------------- #\n\n###### This section is the only part of the file you should need to edit.\n\n# on the make command line specify:\n#\tmmk/descrip=[.src]openvms.mmk/macro=(\"DECWINDOWS1_2={0,1}\")\n\n# Define the directory for the final executable, and the\n# source, generated intermediate file, and object directories\n# for the graphics library (GL) and the PostScript/PDF interpreter (PS).\n\nBINDIR=[.bin]\nGLSRCDIR=[.src]\nGLGENDIR=[.obj]\nGLOBJDIR=[.obj]\nPSSRCDIR=[.src]\nPSGENDIR=[.obj]\nPSOBJDIR=[.obj]\nPSLIBDIR=[.lib]\n# Because of OpenVMS syntactic problems, the following redundant definitions\n# are necessary.  If you are using more than one GENDIR and/or OBJDIR,\n# you will have to edit the code below that creates these directories.\nBIN_DIR=BIN.DIR\nOBJ_DIR=OBJ.DIR\n\n# create directories\n.first\n\tif f$search(\"$(BIN_DIR)\") .eqs. \"\" then create/directory/log $(BINDIR)\n\tif f$search(\"$(OBJ_DIR)\") .eqs. \"\" then create/directory/log $(GLOBJDIR)\n\n# Do not edit the next group of lines.\n\n#.include $(COMMONDIR)vmscdefs.mak\n#.include $(COMMONDIR)vmsdefs.mak\n#.include $(COMMONDIR)generic.mak\n.include $(GLSRCDIR)version.mak\nDD=$(GLGENDIR)\nGLD=$(GLGENDIR)\nPSD=$(PSGENDIR)\n\n# ------ Generic options ------ #\n\n# Define the directory that will hold documentation at runtime.\n\nGS_DOCDIR=GS_DOC\n#GS_DOCDIR=SYS$COMMON:[GS]\n\n# Define the default directory/ies for the runtime\n# initialization and font files.  Separate multiple directories with ,.\n\nGS_LIB_DEFAULT=GS_LIB\n#GS_LIB_DEFAULT=SYS$COMMON:[GS],SYS$COMMON:[GS.FONT]\n\n# Define whether or not searching for initialization files should always\n# look in the current directory first.  This leads to well-known security\n# and confusion problems, but users insist on it.\n# NOTE: this also affects searching for files named on the command line:\n# see the \"File searching\" section of Use.htm for full details.\n# Because of this, setting SEARCH_HERE_FIRST to 0 is not recommended.\n\nSEARCH_HERE_FIRST=1\n\n# Define the name of the interpreter initialization file.\n# (There is no reason to change this.)\n\nGS_INIT=GS_INIT.PS\n\n# Choose generic configuration options.\n\n# Setting DEBUG=1 includes debugging features in the code\n\nDEBUG=0\n\n# Setting TDEBUG=1 includes symbol table information for the debugger,\n# and also enables stack tracing on failure.\n\nTDEBUG=\n\n# Setting CDEBUG=1 enables 'C' compiler debugging and turns off optimization\n# Code is substantially slower and larger.\n\nCDEBUG=\n\n# Define the name of the executable file.\n\nGS=GS\n\n# Define the name of a pre-built executable that can be invoked at build\n# time.  Currently, this is only needed for compiled fonts.  The usual\n# alternatives are:\n#   - the standard name of Ghostscript on your system (typically `gs'):\nBUILD_TIME_GS=GS\n#   - the name of the executable you are building now.  If you choose this\n# option, then you must build the executable first without compiled fonts,\n# and then again with compiled fonts.\n#BUILD_TIME_GS=$(BINDIR)$(GS) -I$(PSLIBDIR)\n\n# Define the directory where the IJG JPEG library sources are stored,\n# and the major version of the library that is stored there.\n# You may need to change this if the IJG library version changes.\n# See jpeg.mak for more information.\n\n.ifdef SYSLIB\nJSRCDIR=sys$library:\n.else\nJSRCDIR=[--.jpeg-6b]\n.endif\nJVERSION=6\n\n# Define the directory where the PNG library sources are stored,\n# and the version of the library that is stored there.\n# You may need to change this if the libpng version changes.\n# See libpng.mak for more information.\n\n.ifdef SYSLIB\nPSRCDIR=sys$library:\n.else\nPSRCDIR=[--.libpng-1_2_8]\n.endif\nPVERSION=10208\n\n# Define the directory where the zlib sources are stored.\n# See zlib.mak for more information.\n\n.ifdef SYSLIB\nZSRCDIR=sys$library:\n.else\nZSRCDIR=[--.zlib-1_2_1]\n.endif\n\n# Define the directory where the jbig2dec library sources are stored.\n# See jbig2.mak for more information\n.ifdef SYSLIB\nJBIG2SRCDIR=sys$library:\n.else\nJBIG2SRCDIR=[--.jbig2dec-0_7]\n.endif\n\n# Define the directory where the icclib source are stored.\n# See icclib.mak for more information\n\nICCSRCDIR=[.icclib]\n\n# IJS has not been ported to OpenVMS. If you do the port,\n# you'll need to set these values. You'll also need to\n# include the ijs.mak makefile (right after icclib.mak).\n#\n# Define the directory where the ijs source is stored,\n# and the process forking method to use for the server.\n# See ijs.mak for more information.\n\n#IJSSRCDIR=[.ijs]\n#IJSEXECTYPE=unix\n\n# Note that built-in third-party libraries aren't available.\n\nSHARE_JPEG=0\nSHARE_LIBPNG=0\nSHARE_ZLIB=0\nSHARE_JBIG2=0\n\n# Define the path to X11 include files\n\nX_INCLUDE=DECW$INCLUDE\n\n# ------ Platform-specific options ------ #\n\n# Define the drive, directory, and compiler name for the 'C' compiler.\n# COMP is the full compiler path name.\n\n.ifdef DEBUG\nSW_DEBUG=/DEBUG/NOOPTIMIZE\n.else\n# This should include /OPTIMIZE, but some OpenVMS compilers have an\n# optimizer bug that causes them to generate incorrect code for gdevpsfx.c,\n# so we must disable optimization.  (Eventually we will check for the bug\n# in genarch and enable optimization if it is safe.)\n#SW_DEBUG=/NODEBUG/OPTIMIZE\nSW_DEBUG=/NODEBUG/NOOPTIMIZE\n.endif\n\nSW_PLATFORM=/DECC/PREFIX=ALL/NESTED_INCLUDE=PRIMARY/name=(as_is,short)/nowarn\n\n# Define any other compilation flags. \n# Including defines for A4 paper size\n\n.ifdef A4_PAPER\nSW_PAPER=/DEFINE=(\"A4\",\"HAVE_MKSTEMP\")\n.else\nSW_PAPER=/DEFINE=(\"HAVE_MKSTEMP\")\n.endif\n\n.ifdef IEEE\nSW_IEEE=/float=ieee\n.else\nSW_IEEE=\n.endif\n\nCOMP=CC$(SW_DEBUG)$(SW_PLATFORM)$(SW_PAPER)$(SW_IEEE)\n\n# LINK is the full linker path name\n\n.ifdef TDEBUG\nLINKER=LINK/DEBUG/TRACEBACK\n.else\nLINKER=LINK/NODEBUG/NOTRACEBACK\n.endif\n\n# INCDIR contains the include files\nINCDIR=\n\n# LIBDIR contains the library files\nLIBDIR=\n\n# Define the .dev module that implements thread and synchronization\n# primitives for this platform.  Don't change this unless you really know\n# what you're doing.\n\nSYNC=posync\n\n# ------ Devices and features ------ #\n\n# Choose the device(s) to include.  See devs.mak for details,\n# devs.mak and contrib.mak for the list of available devices.\n\nDEVICE_DEVS=$(DD)x11.dev $(DD)x11alpha.dev $(DD)x11cmyk.dev $(DD)x11gray2.dev $(DD)x11gray4.dev $(DD)x11mono.dev\nDEVICE_DEVS1=\nDEVICE_DEVS2=\nDEVICE_DEVS3=$(DD)deskjet.dev $(DD)djet500.dev $(DD)laserjet.dev $(DD)ljetplus.dev $(DD)ljet2p.dev $(DD)ljet3.dev $(DD)ljet3d.dev $(DD)ljet4.dev $(DD)ljet4d.dev\nDEVICE_DEVS4=$(DD)cdeskjet.dev $(DD)cdjcolor.dev $(DD)cdjmono.dev $(DD)cdj550.dev $(DD)pj.dev $(DD)pjxl.dev $(DD)pjxl300.dev\nDEVICE_DEVS5=$(DD)uniprint.dev\nDEVICE_DEVS6=$(DD)bj10e.dev $(DD)bj200.dev $(DD)bjc600.dev $(DD)bjc800.dev\nDEVICE_DEVS7=$(DD)faxg3.dev $(DD)faxg32d.dev $(DD)faxg4.dev\nDEVICE_DEVS8=$(DD)pcxmono.dev $(DD)pcxgray.dev $(DD)pcx16.dev $(DD)pcx256.dev $(DD)pcx24b.dev $(DD)pcxcmyk.dev\nDEVICE_DEVS9=$(DD)pbm.dev $(DD)pbmraw.dev $(DD)pgm.dev $(DD)pgmraw.dev $(DD)pgnm.dev $(DD)pgnmraw.dev\nDEVICE_DEVS10=$(DD)tiffcrle.dev $(DD)tiffg3.dev $(DD)tiffg32d.dev $(DD)tiffg4.dev $(DD)tifflzw.dev $(DD)tiffpack.dev\nDEVICE_DEVS11=$(DD)tiff12nc.dev $(DD)tiff24nc.dev\nDEVICE_DEVS12=$(DD)psmono.dev $(DD)psgray.dev $(DD)psrgb.dev $(DD)bit.dev $(DD)bitrgb.dev $(DD)bitcmyk.dev\nDEVICE_DEVS13=$(DD)pngmono.dev $(DD)pnggray.dev $(DD)png16.dev $(DD)png256.dev $(DD)png16m.dev $(DD)pngalpha.dev\nDEVICE_DEVS14=$(DD)jpeg.dev $(DD)jpeggray.dev\nDEVICE_DEVS15=$(DD)pdfwrite.dev $(DD)pswrite.dev $(DD)epswrite.dev $(DD)pxlmono.dev $(DD)pxlcolor.dev\nDEVICE_DEVS16=$(DD)bbox.dev\n# Overflow from DEVS9\nDEVICE_DEVS17=$(DD)pnm.dev $(DD)pnmraw.dev $(DD)ppm.dev $(DD)ppmraw.dev $(DD)pkm.dev $(DD)pkmraw.dev $(DD)pksm.dev $(DD)pksmraw.dev\nDEVICE_DEVS18=\nDEVICE_DEVS19=\nDEVICE_DEVS20=\nDEVICE_DEVS21=\nDEVICE_DEVS21=\n\n# Choose the language feature(s) to include.  See gs.mak for details.\n\nFEATURE_DEVS=$(PSD)psl3.dev $(PSD)pdf.dev $(PSD)dpsnext.dev $(PSD)ttfont.dev $(PSD)epsf.dev $(PSD)fapi.dev $(PSD)jbig2.dev\n\n# Choose whether to compile the .ps initialization files into the executable.\n# See gs.mak for details.\n\nCOMPILE_INITS=0\n\n# Choose whether to store band lists on files or in memory.\n# The choices are 'file' or 'memory'.\n\nBAND_LIST_STORAGE=file\n\n# Choose which compression method to use when storing band lists in memory.\n# The choices are 'lzw' or 'zlib'.\n\nBAND_LIST_COMPRESSOR=zlib\n\n# Choose the implementation of file I/O: 'stdio', 'fd', or 'both'.\n# See gs.mak and sfxfd.c for more details.\n\nFILE_IMPLEMENTATION=stdio\n\n# Choose the implementation of stdio: '' for file I/O and 'c' for callouts\n# See gs.mak and ziodevs.c/ziodevsc.c for more details.\n\nSTDIO_IMPLEMENTATION=c\n\n# Define the name table capacity size of 2^(16+n).\n\nEXTEND_NAMES=0\n\n# Define whether the system constants are writable.\n\nSYSTEM_CONSTANTS_ARE_WRITABLE=0\n\n# Define the platform name.\n\nPLATFORM=openvms_\n\n# Define the name of the makefile -- used in dependencies.\n\nMAKEFILE=$(GLSRCDIR)openvms.mmk\nTOP_MAKEFILES=$(MAKEFILE)\n\n# Define the platform options\n\nPLATOPT=\n\n# Patch a couple of PC-specific things that aren't relevant to OpenVMS builds,\n# but that cause `make' to produce warnings.\n\nPCFBASM=\n\n# It is very unlikely that anyone would want to edit the remaining\n#   symbols, but we describe them here for completeness:\n\n# Define the suffix for command files (e.g., null or .bat).\n\nCMD=\n\n# Define the directory separator character (\\ for MS-DOS, / for Unix,\n# nothing for OpenVMS).\n\nD=\n\n# Define the brackets for passing preprocessor definitions to the C compiler.\nNULL=\n\nD_=/DEFINE=\"\n_D_=$(NULL)=\n_D=\"\n\n# Define the syntax of search paths for the C compiler.\n# The OpenVMS compilers uses /INCLUDE=(dir1, dir2, ...dirn),\n# and only a single /INCLUDE switch is allowed in the command line.\n\nI_=/INCLUDE=(\nII=,\n_I=)\n\n# Define the string for specifying the output file from the C compiler.\n\nO_=/OBJECT=\n\n# Define the quoting string for mixed-case arguments.\n# (OpenVMS is the only platform where this isn't an empty string.)\n\nQ=\"\n\n# Define the extension for executable files (e.g., null or .exe).\n\nXE=.exe\n\n# Define the extension for executable files for the auxiliary programs\n# (e.g., null or .exe).\n\nXEAUX=.exe\n\n# Define the list of files that `make clean' removes.\n\nBEGINFILES=$(GLSRCDIR)OPENVMS.OPT $(GLSRCDIR)OPENVMS.COM\n\n# Define the C invocation for auxiliary programs (echogs, genarch).\n# We don't need to define this separately.\n\nCCAUX=\n\n# Define the C invocation for normal compilation.\n\nCC=$(COMP)\n\n# Define the Link invocation.\n\nLINK=$(LINKER)/EXE=$@ $+,$(GLSRCDIR)OPENVMS.OPT/OPTION\n\n# Define the auxiliary program dependency. We don't need this.\n\nAK=\n\n# Define the syntax for command, object, and executable files.\n\nOBJ=obj\n\n# Define the prefix for image invocations.\n\nEXP=MCR $(NULL)\n\n# Define the prefix for shell invocations.\n\nSH=\n\n# Define generic commands.\n\nCP_=@$(GLSRCDIR)COPY_ONE\n\n# Define the command for deleting (a) file(s) (including wild cards)\n\nRM_=@$(GLSRCDIR)RM_ONE\n\n# Define the command for deleting multiple files / patterns.\n\nRMN_=@$(GLSRCDIR)RM_ALL\n\n# Define the arguments for genconf.\n\nCONFILES=-p %s\nCONFLDTR=-o\n\n# Define the generic compilation rules.\n\n.suffixes : .c .obj .exe\n\n.obj.exe :\n\t$(LINK)\n\n# ---------------------------- End of options ---------------------------- #\n\n# Define various incantations of the 'c' compiler.\n\nCC_=$(COMP)\nCC_INT=$(CC_)\nCC_NO_WARN=$(CC_)\n\n# ------------------- Include the generic makefiles ---------------------- #\n\nall : macro [.lib]Fontmap. $(GS_XE)\n\n#.include $(COMMONDIR)/ansidefs.mak\n#.include $(COMMONDIR)/vmsdefs.mak\n#.include $(COMMONDIR)/generic.mak\n.include $(GLSRCDIR)gs.mak\n.include $(GLSRCDIR)lib.mak\n.include $(PSSRCDIR)int.mak\n.include $(PSSRCDIR)cfonts.mak\n.include $(GLSRCDIR)jpeg.mak\n# zlib.mak must precede libpng.mak\n.include $(GLSRCDIR)zlib.mak\n.include $(GLSRCDIR)libpng.mak\nJBIG2_EXTRA_OBJS=$(JBIG2OBJDIR)$(D)snprintf.$(OBJ)\n.include $(GLSRCDIR)jbig2.mak\n.include $(GLSRCDIR)icclib.mak\n.include $(GLSRCDIR)devs.mak\n.include $(GLSRCDIR)contrib.mak\n\n\n# ----------------------------- Main program ------------------------------ \n\nmacro :\n.ifdef A4_PAPER\n\t@ a4p = 1\n.else\n\t@ a4p = 0\n.endif\n.ifdef IEEE\n\t@ i3e = 1\n.else\n\t@ i3e = 0\n.endif\n.ifdef SYSLIB\n\t@ dsl = 1\n.else\n\t@ dsl = 0\n.endif\n\t@ decc = f$search(\"SYS$SYSTEM:DECC$COMPILER.EXE\").nes.\"\"\n\t@ decw12 = f$search(\"SYS$SHARE:DECW$XTLIBSHRR5.EXE\").nes.\"\"\n\t@ macro = \"\"\n\t@ if dsl.or.a4p.or.decc.or.decw12 then macro = \"/MACRO=(\"\n\t@ if decw12 then macro = macro + \"DECWINDOWS1_2=1,\"\n\t@ if a4p then macro = macro + \"A4_PAPER=1,\"\n\t@ if dsl then macro = macro + \"SYSLIB=1,\"\n\t@ if i3e then macro = macro + \"IEEE=1,\"\n\t@ if macro.nes.\"\" then macro = f$extract(0,f$length(macro)-1,macro)+ \")\"\n\t$(MMS)$(MMSQUALIFIERS)'macro' $(GS_XE)\n\n$(GS_XE) : openvms $(GLGEN)arch.h $(GLOBJDIR)gs.$(OBJ) $(INT_ALL) $(LIB_ALL)\n\t$(LINKER)/EXE=$@ $(GLOBJDIR)gs.$(OBJ),$(ld_tr)/OPTIONS,$(GLSRCDIR)OPENVMS.OPT/OPTION\n\t@ Write Sys$Output \"Build of GhostScript is complete!\"\n\n# OpenVMS.dev\n\nopenvms__=$(GLOBJ)gp_getnv.$(OBJ) $(GLOBJ)gp_vms.$(OBJ) $(GLOBJ)gp_stdia.$(OBJ)\n$(GLGEN)openvms_.dev : $(openvms__) $(GLGEN)nosync.dev\n\t$(SETMOD) $(GLGEN)openvms_ $(openvms__) -include $(GLGEN)nosync\n\n$(ECHOGS_XE) :  $(GLOBJDIR)echogs.$(OBJ) \n$(GENARCH_XE) : $(GLOBJDIR)genarch.$(OBJ)\n$(GENCONF_XE) : $(GLOBJDIR)genconf.$(OBJ)\n$(GENDEV_XE) : $(GLOBJDIR)gendev.$(OBJ)\n$(GENHT_XE) : $(GLOBJDIR)genht.$(OBJ)\n$(GENINIT_XE) : $(GLOBJDIR)geninit.$(OBJ)\n\n$(GLOBJDIR)echogs.$(OBJ) : $(GLSRCDIR)echogs.c\n$(GLOBJDIR)genarch.$(OBJ) : $(GLSRCDIR)genarch.c $(GENARCH_DEPS)\n$(GLOBJDIR)genconf.$(OBJ) : $(GLSRCDIR)genconf.c $(GENCONF_DEPS)\n$(GLOBJDIR)gendev.$(OBJ) : $(GLSRCDIR)gendev.c $(GENDEV_DEPS)\n# ****** NEED TO ADD $(GENHT_CFLAGS) HERE ******\n$(GLOBJDIR)genht.$(OBJ) : $(GLSRCDIR)genht.c $(GENHT_DEPS)\n$(GLOBJDIR)geninit.$(OBJ) : $(GLSRCDIR)geninit.c $(GENINIT_DEPS)\n\n$(GLOBJ)gp_vms.$(OBJ) : $(GLSRC)gp_vms.c $(string__h) $(memory__h) $(gx_h) $(gp_h) $(gpmisc_h) $(gsstruct_h)\n\t$(CC_)/include=($(GLGENDIR),$(GLSRCDIR))/obj=$(GLOBJ)gp_vms.$(OBJ) $(GLSRC)gp_vms.c\n\n$(GLOBJ)gp_stdia.$(OBJ) : $(GLSRC)gp_stdia.c $(AK) $(stdio__h) $(time__h) $(unistd__h) $(gx_h) $(gp_h)\n\t$(CC_)/incl=$(GLOBJ)/obj=$(GLOBJ)gp_stdia.$(OBJ) $(GLSRC)gp_stdia.c\n\n# Preliminary definitions\n\nopenvms : $(GLSRCDIR)openvms.com $(GLSRCDIR)openvms.opt\n\t@$(GLSRCDIR)OPENVMS\n\n$(GLSRCDIR)openvms.com : $(GLSRCDIR)append_l.com\n\t@$(GLSRCDIR)APPEND_L $@ \"$ DEFINE/JOB X11 $(X_INCLUDE)\"\n\t@$(GLSRCDIR)APPEND_L $@ \"$ DEFINE/JOB GS_LIB ''F$ENVIRONMENT(\"\"DEFAULT\"\")'\"\n\t@$(GLSRCDIR)APPEND_L $@ \"$ DEFINE/JOB GS_DOC ''F$ENVIRONMENT(\"\"DEFAULT\"\")'\"\n\t@$(GLSRCDIR)APPEND_L $@ \"$ DEFINE/JOB DECC$USER_INCLUDE ''F$ENVIRONMENT(\"\"DEFAULT\"\")', DECW$INCLUDE, DECC$LIBRARY_INCLUDE, SYS$LIBRARY\"\n\t@$(GLSRCDIR)APPEND_L $@ \"$ DEFINE/JOB DECC$SYSTEM_INCLUDE ''F$ENVIRONMENT(\"\"DEFAULT\"\")', DECW$INCLUDE, DECC$LIBRARY_INCLUDE, SYS$LIBRARY\"\n\t@$(GLSRCDIR)APPEND_L $@ \"$ DEFINE/JOB SYS \"DECC$LIBRARY_INCLUDE,SYS$LIBRARY\"\n\n$(GLSRCDIR)openvms.opt :\n.ifdef DECWINDOWS1_2\n\t@$(GLSRCDIR)APPEND_L $@ \"SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE\"\n\t@$(GLSRCDIR)APPEND_L $@ \"SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE\"\n\t@$(GLSRCDIR)APPEND_L $@ \"SYS$SHARE:DECW$XLIBSHR.EXE/SHARE\"\n.else\n\t@$(GLSRCDIR)APPEND_L $@ \"SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE\"\n\t@$(GLSRCDIR)APPEND_L $@ \"SYS$SHARE:DECW$XTSHR.EXE/SHARE\"\n\t@$(GLSRCDIR)APPEND_L $@ \"SYS$SHARE:DECW$XLIBSHR.EXE/SHARE\"\n.endif\n\t@$(GLSRCDIR)APPEND_L $@ \"\"Ident=\"\"\"\"\"GS $(GS_DOT_VERSION)\"\"\"\"\"\n\n# The platform-specific makefiles must also include rules for creating\n# certain dynamically generated files:\n#\tgconfig_.h - this indicates the presence or absence of\n#\t    certain system header files that are located in different\n#\t    places on different systems.  (It could be generated by\n#\t    the GNU `configure' program.)\n#\tgconfigv.h - this indicates the status of certain machine-\n#\t    and configuration-specific features derived from definitions\n#\t    in the platform-specific makefile.\n\n$(gconfig__h) : $(TOP_MAKEFILES) $(ECHOGS_XE)\n\t$(EXP)$(ECHOGS_XE) -w $(gconfig__h) -x 23 define \"HAVE_SYS_TIME_H\"\n\n$(gconfigv_h) : $(TOP_MAKEFILES) $(ECHOGS_XE)\n\t$(EXP)$(ECHOGS_XE) -w $(gconfigv_h) -x 23 define \"USE_ASM\" 0\n\t$(EXP)$(ECHOGS_XE) -a $(gconfigv_h) -x 23 define \"USE_FPU\" 1\n\t$(EXP)$(ECHOGS_XE) -a $(gconfigv_h) -x 23 define \"EXTEND_NAMES\" 0$(EXTEND_NAMES)\n\t$(EXP)$(ECHOGS_XE) -a $(gconfigv_h) -x 23 define \"SYSTEM_CONSTANTS_ARE_WRITABLE\" 0$(SYSTEM_CONSTANTS_ARE_WRITABLE)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Module Management System/simh_descrip.mms",
    "content": "# DESCRIP.MMS\r\n# Written By:\tRobert Alan Byer / byer@mail.ourservers.net\r\n# Modified By:\tMark Pizzolato / mark@infocomm.com\r\n#\t\tNorman Lastovica / norman.lastovica@oracle.com\r\n#\r\n# This MMS/MMK build script is used to compile the various simulators in\r\n# the SIMH package for OpenVMS using DEC C v6.0-001(AXP), v6.5-001(AXP),\r\n# HP C V7.2-001 (IA64) and v6.4-005(VAX).\r\n#\r\n# Notes:  On VAX, the PDP-10 and Eclipse simulators will not be built \r\n#         due to the fact that INT64 is required for that simulator.\r\n#\r\n# This build script will accept the following build options.\r\n#\r\n#            ALL             Just Build \"Everything\".\r\n#            ALTAIR          Just Build The MITS Altair.\r\n#            ALTAIRZ80       Just Build The MITS Altair Z80.\r\n#            ECLIPSE         Just Build The Data General Eclipse.\r\n#            GRI             Just Build The GRI Corporation GRI-909.\r\n#            LGP             Just Build The Royal-McBee LGP-30.\r\n#            H316            Just Build The Honewell 316/516.\r\n#            HP2100          Just Build The Hewlett-Packard HP-2100. \r\n#            I1401           Just Build The IBM 1401.\r\n#            I1620           Just Build The IBM 1620.\r\n#            IBM1130         Just Build The IBM 1130.\r\n#            ID16            Just Build The Interdata 16-bit CPU.\r\n#            ID32            Just Build The Interdata 32-bit CPU.\r\n#            NOVA            Just Build The Data General Nova.\r\n#            PDP1            Just Build The DEC PDP-1.\r\n#            PDP4            Just Build The DEC PDP-4.\r\n#            PDP7            Just Build The DEC PDP-7.\r\n#            PDP8            Just Build The DEC PDP-8.\r\n#            PDP9            Just Build The DEC PDP-9.\r\n#            PDP10           Just Build The DEC PDP-10.\r\n#            PDP11           Just Build The DEC PDP-11.\r\n#            PDP15           Just Build The DEC PDP-15.\r\n#            S3              Just Build The IBM System 3.\r\n#            SDS             Just Build The SDS 940.\r\n#            VAX             Just Build The DEC VAX.\r\n#            VAX780          Just Build The DEC VAX780.\r\n#            CLEAN           Will Clean Files Back To Base Kit.\r\n#\r\n# To build with debugging enabled (which will also enable traceback \r\n# information) use..\r\n#\r\n#        MMK/MACRO=(DEBUG=1)\r\n#\r\n# This will produce an executable named {Simulator}-{I64|VAX|AXP}-DBG.EXE\r\n#\r\n\r\n# Let's See If We Are Going To Build With DEBUG Enabled.  Always compile\r\n# /DEBUG so that the traceback and debug information is always available\r\n# in the object files.\r\n\r\nCC_DEBUG = /DEBUG\r\n\r\n.IFDEF DEBUG\r\nLINK_DEBUG = /DEBUG/TRACEBACK\r\nCC_OPTIMIZE = /NOOPTIMIZE\r\n\r\n.IFDEF MMSALPHA\r\nALPHA_OR_IA64 = 1\r\nCC_FLAGS = /PREF=ALL\r\nARCH = AXP-DBG\r\nCC_DEFS = \"_LARGEFILE\"\r\n.ENDIF\r\n\r\n.IFDEF MMSIA64\r\nALPHA_OR_IA64 = 1\r\nCC_FLAGS = /PREF=ALL\r\nARCH = I64-DBG\r\nCC_DEFS = \"_LARGEFILE\"\r\n.ENDIF\r\n\r\n.IFDEF MMSVAX\r\nALPHA_OR_IA64 = 0\r\nCC_FLAGS = $(CC_FLAGS)\r\nARCH = VAX-DBG\r\nCC_DEFS = \"__VAX\"\r\n.ENDIF\r\n\r\n.ELSE\r\nLINK_DEBUG = /NODEBUG/NOTRACEBACK\r\n\r\n.IFDEF MMSALPHA\r\nALPHA_OR_IA64 = 1\r\nCC_OPTIMIZE = /OPT=(LEV=5)/ARCH=HOST\r\nCC_FLAGS = /PREF=ALL\r\nARCH = AXP\r\nCC_DEFS = \"_LARGEFILE\"\r\nLINK_SECTION_BINDING = /SECTION_BINDING\r\n.ENDIF\r\n\r\n.IFDEF MMSIA64\r\nALPHA_OR_IA64 = 1\r\nCC_OPTIMIZE = /OPT=(LEV=5)\r\nCC_FLAGS = /PREF=ALL\r\nARCH = I64\r\nCC_DEFS = \"_LARGEFILE\"\r\n.ENDIF\r\n\r\n.IFDEF MMSVAX\r\nALPHA_OR_IA64 = 0\r\nCC_OPTIMIZE = /OPTIMIZE\r\nCC_FLAGS = $(CC_FLAGS)\r\nARCH = VAX\r\nCC_DEFS = \"__VAX\"\r\n.ENDIF\r\n\r\n.ENDIF\r\n\r\n# Define Our Compiler Flags & Define The Compile Command\r\nOUR_CC_FLAGS = $(CC_FLAGS)$(CC_DEBUG)$(CC_OPTIMIZE) \\\r\n\t/NEST=PRIMARY/NAME=(AS_IS,SHORT)\r\nCC = CC/DECC$(OUR_CC_FLAGS)\r\n\r\n# Define The BIN Directory Where The Executables Will Go.\r\n# Define Our Library Directory.\r\n# Define The platform specific Build Directory Where The Objects Will Go.\r\n#\r\nBIN_DIR = SYS$DISK:[.BIN]\r\nLIB_DIR = SYS$DISK:[.LIB]\r\nBLD_DIR = SYS$DISK:[.LIB.BLD-$(ARCH)]\r\n\r\n# Check To Make Sure We Have SYS$DISK:[.BIN] & SYS$DISK:[.LIB] Directory.\r\n#\r\n.FIRST\r\n  @ IF (F$SEARCH(\"SYS$DISK:[]BIN.DIR\").EQS.\"\") THEN CREATE/DIRECTORY $(BIN_DIR)\r\n  @ IF (F$SEARCH(\"SYS$DISK:[]LIB.DIR\").EQS.\"\") THEN CREATE/DIRECTORY $(LIB_DIR)\r\n  @ IF (F$SEARCH(\"SYS$DISK:[.LIB]BLD-$(ARCH).DIR\").EQS.\"\") THEN CREATE/DIRECTORY $(BLD_DIR)\r\n  @ IF (F$SEARCH(\"$(BLD_DIR)*.*\").NES.\"\") THEN DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.*;*\r\n  @ IF \"\".NES.\"''CC'\" THEN DELETE/SYMBOL/GLOBAL CC\r\n\r\n# Core SIMH File Definitions.\r\n#\r\nSIMH_DIR = SYS$DISK:[]\r\nSIMH_LIB = $(LIB_DIR)SIMH-$(ARCH).OLB\r\nSIMH_SOURCE = $(SIMH_DIR)SIM_CONSOLE.C,$(SIMH_DIR)SIM_SOCK.C,\\\r\n              $(SIMH_DIR)SIM_TMXR.C,$(SIMH_DIR)SIM_ETHER.C,\\\r\n              $(SIMH_DIR)SIM_TAPE.C,$(SIMH_DIR)SIM_FIO.C,\\\r\n              $(SIMH_DIR)SIM_TIMER.C\r\n\r\n# VMS PCAP File Definitions.\r\n#\r\nPCAP_DIR = SYS$DISK:[.PCAP-VMS.PCAP-VCI]\r\nPCAP_LIB = $(LIB_DIR)PCAP-$(ARCH).OLB\r\nPCAP_SOURCE = \\\r\n\t$(PCAP_DIR)PCAPVCI.C,$(PCAP_DIR)VCMUTIL.C,\\\r\n\t$(PCAP_DIR)BPF_DUMP.C,$(PCAP_DIR)BPF_FILTER.C,\\\r\n\t$(PCAP_DIR)BPF_IMAGE.C,$(PCAP_DIR)ETHERENT.C,\\\r\n\t$(PCAP_DIR)FAD-GIFC.C,$(PCAP_DIR)GENCODE.C,\\\r\n\t$(PCAP_DIR)GRAMMAR.C,$(PCAP_DIR)INET.C,\\\r\n\t$(PCAP_DIR)NAMETOADDR.C,$(PCAP_DIR)OPTIMIZE.C,\\\r\n\t$(PCAP_DIR)PCAP.C,$(PCAP_DIR)SAVEFILE.C,\\\r\n\t$(PCAP_DIR)SCANNER.C,$(PCAP_DIR)SNPRINTF.C,\\\r\n\t$(PCAP_DIR)PCAP-VMS.C\r\nPCAP_VCMDIR = SYS$DISK:[.PCAP-VMS.PCAPVCM]\r\nPCAP_VCM_SOURCES = $(PCAP_VCMDIR)PCAPVCM.C,$(PCAP_VCMDIR)PCAPVCM_INIT.MAR,\\\r\n\t\t   $(PCAP_VCMDIR)VCI_JACKET.MAR,$(PCAP_VCMDIR)VCMUTIL.C\r\nPCAP_VCI = SYS$COMMON:[SYS$LDR]PCAPVCM.EXE\r\n\r\n# PCAP is not available on OpenVMS VAX or IA64 right now\r\n#\r\n.IFDEF MMSALPHA\r\nPCAP_EXECLET = $(PCAP_VCI)\r\nPCAP_INC = ,$(PCAP_DIR)\r\nPCAP_LIBD = $(PCAP_LIB)\r\nPCAP_LIBR = ,$(PCAP_LIB)/LIB/SYSEXE\r\nPCAP_DEFS = ,\"USE_NETWORK=1\"\r\nPCAP_SIMH_INC = /INCL=($(PCAP_DIR))\r\n.ENDIF\r\n\r\n# MITS Altair Simulator Definitions.\r\n#\r\nALTAIR_DIR = SYS$DISK:[.ALTAIR]\r\nALTAIR_LIB = $(LIB_DIR)ALTAIR-$(ARCH).OLB\r\nALTAIR_SOURCE = $(ALTAIR_DIR)ALTAIR_SIO.C,$(ALTAIR_DIR)ALTAIR_CPU.C,\\\r\n                $(ALTAIR_DIR)ALTAIR_DSK.C,$(ALTAIR_DIR)ALTAIR_SYS.C\r\nALTAIR_OPTIONS = /INCL=($(SIMH_DIR),$(ALTAIR_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# MITS Altair Z80 Simulator Definitions.\r\n#\r\nALTAIRZ80_DIR = SYS$DISK:[.ALTAIRZ80]\r\nALTAIRZ80_LIB = $(LIB_DIR)ALTAIRZ80-$(ARCH).OLB\r\nALTAIRZ80_SOURCE = $(ALTAIRZ80_DIR)/ALTAIRZ80_CPU.C,$(ALTAIRZ80_DIR)/ALTAIRZ80_CPU_NOMMU.C,\\\r\n                   $(ALTAIRZ80_DIR)/ALTAIRZ80_DSK.C,$(ALTAIRZ80_DIR)/DISASM.C,\\\r\n                   $(ALTAIRZ80_DIR)/ALTAIRZ80_SIO.C,$(ALTAIRZ80_DIR)/ALTAIRZ80_SYS.C,\\\r\n                   $(ALTAIRZ80_DIR)/ALTAIRZ80_HDSK.C,$(ALTAIRZ80_DIR)/ALTAIRZ80_NET.C,\\\r\n                   $(ALTAIRZ80_DIR)/FLASHWRITER2.C,$(ALTAIRZ80_DIR)/I86_DECODE.C,\\\r\n                   $(ALTAIRZ80_DIR)/I86_OPS.C,$(ALTAIRZ80_DIR)/I86_PRIM_OPS.C,\\\r\n                   $(ALTAIRZ80_DIR)/I8272.C,$(ALTAIRZ80_DIR)/INSNSA.C,$(ALTAIRZ80_DIR)/INSNSD.C,\\\r\n                   $(ALTAIRZ80_DIR)/MFDC.C,$(ALTAIRZ80_DIR)/N8VEM.C,$(ALTAIRZ80_DIR)/VFDHD.C,\\\r\n                   $(ALTAIRZ80_DIR)/S100_DISK1A.C,$(ALTAIRZ80_DIR)/S100_DISK2.C,\\\r\n                   $(ALTAIRZ80_DIR)/S100_FIF.C,$(ALTAIRZ80_DIR)/S100_MDRIVEH.C,\\\r\n                   $(ALTAIRZ80_DIR)/S100_MDSAD.C,$(ALTAIRZ80_DIR)/S100_SELCHAN.C,\\\r\n                   $(ALTAIRZ80_DIR)/S100_SS1.C,$(ALTAIRZ80_DIR)/S100_64FDC.C,\\\r\n                   $(ALTAIRZ80_DIR)/S100_SCP300F.C,$(ALTAIRZ80_DIR)/SIM_IMD.C,\\\r\n                   $(ALTAIRZ80_DIR)/WD179X.C\r\nALTAIRZ80_OPTIONS = /INCL=($(SIMH_DIR),$(ALTAIRZ80_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Data General Nova Simulator Definitions.\r\n#\r\nNOVA_DIR = SYS$DISK:[.NOVA]\r\nNOVA_LIB = $(LIB_DIR)NOVA-$(ARCH).OLB\r\nNOVA_SOURCE = $(NOVA_DIR)NOVA_SYS.C,$(NOVA_DIR)NOVA_CPU.C,\\\r\n              $(NOVA_DIR)NOVA_DKP.C,$(NOVA_DIR)NOVA_DSK.C,\\\r\n              $(NOVA_DIR)NOVA_LP.C,$(NOVA_DIR)NOVA_MTA.C,\\\r\n              $(NOVA_DIR)NOVA_PLT.C,$(NOVA_DIR)NOVA_PT.C,\\\r\n              $(NOVA_DIR)NOVA_CLK.C,$(NOVA_DIR)NOVA_TT.C,\\\r\n              $(NOVA_DIR)NOVA_TT1.C,$(NOVA_DIR)NOVA_QTY.C\r\nNOVA_OPTIONS = /INCL=($(SIMH_DIR),$(NOVA_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Data General Eclipse Simulator Definitions.\r\n#\r\nECLIPSE_LIB = $(LIB_DIR)ECLIPSE-$(ARCH).OLB\r\nECLIPSE_SOURCE = $(NOVA_DIR)ECLIPSE_CPU.C,$(NOVA_DIR)ECLIPSE_TT.C,\\\r\n                 $(NOVA_DIR)NOVA_SYS.C,$(NOVA_DIR)NOVA_DKP.C,\\\r\n                 $(NOVA_DIR)NOVA_DSK.C,$(NOVA_DIR)NOVA_LP.C,\\\r\n                 $(NOVA_DIR)NOVA_MTA.C,$(NOVA_DIR)NOVA_PLT.C,\\\r\n                 $(NOVA_DIR)NOVA_PT.C,$(NOVA_DIR)NOVA_CLK.C,\\\r\n                 $(NOVA_DIR)NOVA_TT1.C,$(NOVA_DIR)NOVA_QTY.C\r\nECLIPSE_OPTIONS = /INCL=($(SIMH_DIR),$(NOVA_DIR))\\\r\n    \t\t/DEF=($(CC_DEFS),\"USE_INT64=1\",\"ECLIPSE=1\")\r\n\r\n#\r\n# GRI Corporation GRI-909 Simulator Definitions.\r\n#\r\nGRI_DIR = SYS$DISK:[.GRI]\r\nGRI_LIB = $(LIB_DIR)GRI-$(ARCH).OLB\r\nGRI_SOURCE = $(GRI_DIR)GRI_CPU.C,$(GRI_DIR)GRI_STDDEV.C,$(GRI_DIR)GRI_SYS.C\r\nGRI_OPTIONS = /INCL=($(SIMH_DIR),$(GRI_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Royal-McBee LGP-30 Simulator Definitions.\r\n#\r\nLGP_DIR = SYS$DISK:[.LGP]\r\nLGP_LIB = $(LIB_DIR)LGP-$(ARCH).OLB\r\nLGP_SOURCE = $(LGP_DIR)LGP_CPU.C,$(LGP_DIR)LGP_STDDEV.C,$(LGP_DIR)LGP_SYS.C\r\nLGP_OPTIONS = /INCL=($(SIMH_DIR),$(LGP_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Honeywell 316/516 Simulator Definitions.\r\n#\r\nH316_DIR = SYS$DISK:[.H316]\r\nH316_LIB = $(LIB_DIR)H316-$(ARCH).OLB\r\nH316_SOURCE = $(H316_DIR)H316_STDDEV.C,$(H316_DIR)H316_LP.C,\\\r\n              $(H316_DIR)H316_CPU.C,$(H316_DIR)H316_SYS.C,\\\r\n              $(H316_DIR)H316_FHD.C,$(H316_DIR)H316_MT.C,\\\r\n              $(H316_DIR)H316_DP.C\r\nH316_OPTIONS = /INCL=($(SIMH_DIR),$(H316_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Hewlett-Packard HP-2100 Simulator Definitions.\r\n#\r\nHP2100_DIR = SYS$DISK:[.HP2100]\r\nHP2100_LIB = $(LIB_DIR)HP2100-$(ARCH).OLB\r\nHP2100_SOURCE = $(HP2100_DIR)HP2100_STDDEV.C,$(HP2100_DIR)HP2100_DP.C,\\\r\n                $(HP2100_DIR)HP2100_DQ.C,$(HP2100_DIR)HP2100_DR.C,\\\r\n                $(HP2100_DIR)HP2100_LPS.C,$(HP2100_DIR)HP2100_MS.C,\\\r\n                $(HP2100_DIR)HP2100_MT.C,$(HP2100_DIR)HP2100_MUX.C,\\\r\n                $(HP2100_DIR)HP2100_CPU.C,$(HP2100_DIR)HP2100_FP.C,\\\r\n                $(HP2100_DIR)HP2100_SYS.C,$(HP2100_DIR)HP2100_LPT.C,\\\r\n                $(HP2100_DIR)HP2100_IPL.C,$(HP2100_DIR)HP2100_DS.C,\\\r\n                $(HP2100_DIR)HP2100_CPU0.C,$(HP2100_DIR)HP2100_CPU1.C,\\\r\n                $(HP2100_DIR)HP2100_CPU2.C,$(HP2100_DIR)HP2100_CPU3.C,\\\r\n                $(HP2100_DIR)HP2100_CPU4.C,$(HP2100_DIR)HP2100_CPU5.C,\\\r\n                $(HP2100_DIR)HP2100_CPU6.C,$(HP2100_DIR)HP2100_CPU7.C,\\\r\n                $(HP2100_DIR)HP2100_FP1.C,$(HP2100_DIR)HP2100_BACI.C,\\\r\n                $(HP2100_DIR)HP2100_MPX.C,$(HP2100_DIR)HP2100_PIF.C\r\n.IF ALPHA_OR_IA64\r\nHP2100_OPTIONS = /INCL=($(SIMH_DIR),$(HP2100_DIR))\\\r\n    \t\t/DEF=($(CC_DEFS),\"HAVE_INT64=1\")\r\n.ELSE\r\nHP2100_OPTIONS = /INCL=($(SIMH_DIR),$(HP2100_DIR))/DEF=($(CC_DEFS))\r\n.ENDIF\r\n\r\n#\r\n# Interdata 16-bit CPU.\r\n#\r\nID16_DIR = SYS$DISK:[.INTERDATA]\r\nID16_LIB = $(LIB_DIR)ID16-$(ARCH).OLB\r\nID16_SOURCE = $(ID16_DIR)ID16_CPU.C,$(ID16_DIR)ID16_SYS.C,$(ID16_DIR)ID_DP.C,\\\r\n              $(ID16_DIR)ID_FD.C,$(ID16_DIR)ID_FP.C,$(ID16_DIR)ID_IDC.C,\\\r\n              $(ID16_DIR)ID_IO.C,$(ID16_DIR)ID_LP.C,$(ID16_DIR)ID_MT.C,\\\r\n              $(ID16_DIR)ID_PAS.C,$(ID16_DIR)ID_PT.C,$(ID16_DIR)ID_TT.C,\\\r\n              $(ID16_DIR)ID_UVC.C,$(ID16_DIR)ID16_DBOOT.C,$(ID16_DIR)ID_TTP.C\r\nID16_OPTIONS = /INCL=($(SIMH_DIR),$(ID16_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Interdata 32-bit CPU.\r\n#\r\nID32_DIR = SYS$DISK:[.INTERDATA]\r\nID32_LIB = $(LIB_DIR)ID32-$(ARCH).OLB\r\nID32_SOURCE = $(ID32_DIR)ID32_CPU.C,$(ID32_DIR)ID32_SYS.C,$(ID32_DIR)ID_DP.C,\\\r\n              $(ID32_DIR)ID_FD.C,$(ID32_DIR)ID_FP.C,$(ID32_DIR)ID_IDC.C,\\\r\n              $(ID32_DIR)ID_IO.C,$(ID32_DIR)ID_LP.C,$(ID32_DIR)ID_MT.C,\\\r\n              $(ID32_DIR)ID_PAS.C,$(ID32_DIR)ID_PT.C,$(ID32_DIR)ID_TT.C,\\\r\n              $(ID32_DIR)ID_UVC.C,$(ID32_DIR)ID32_DBOOT.C,$(ID32_DIR)ID_TTP.C\r\nID32_OPTIONS = /INCL=($(SIMH_DIR),$(ID32_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# IBM 1130 Simulator Definitions.\r\n#\r\nIBM1130_DIR = SYS$DISK:[.IBM1130]\r\nIBM1130_LIB = $(LIB_DIR)IBM1130-$(ARCH).OLB\r\nIBM1130_SOURCE = $(IBM1130_DIR)IBM1130_CPU.C,$(IBM1130_DIR)IBM1130_CR.C,\\\r\n                 $(IBM1130_DIR)IBM1130_DISK.C,$(IBM1130_DIR)IBM1130_STDDEV.C,\\\r\n                 $(IBM1130_DIR)IBM1130_SYS.C,$(IBM1130_DIR)IBM1130_GDU.C,\\\r\n                 $(IBM1130_DIR)IBM1130_GUI.C,$(IBM1130_DIR)IBM1130_PRT.C,\\\r\n                 $(IBM1130_DIR)IBM1130_FMT.C,$(IBM1130_DIR)IBM1130_PTRP.C,\\\r\n                 $(IBM1130_DIR)IBM1130_PLOT.C,$(IBM1130_DIR)IBM1130_SCA.C,\\\r\n                 $(IBM1130_DIR)IBM1130_T2741.C\r\nIBM1130_OPTIONS = /INCL=($(SIMH_DIR),$(IBM1130_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# IBM 1401 Simulator Definitions.\r\n#\r\nI1401_DIR = SYS$DISK:[.I1401]\r\nI1401_LIB = $(LIB_DIR)I1401-$(ARCH).OLB\r\nI1401_SOURCE = $(I1401_DIR)I1401_LP.C,$(I1401_DIR)I1401_CPU.C,\\\r\n               $(I1401_DIR)I1401_IQ.C,$(I1401_DIR)I1401_CD.C,\\\r\n               $(I1401_DIR)I1401_MT.C,$(I1401_DIR)I1401_DP.C,\\\r\n               $(I1401_DIR)I1401_SYS.C\r\nI1401_OPTIONS = /INCL=($(SIMH_DIR),$(I1401_DIR))/DEF=($(CC_DEFS))\r\n\r\n\r\n#\r\n# IBM 1620 Simulators Definitions.\r\n#\r\nI1620_DIR = SYS$DISK:[.I1620]\r\nI1620_LIB = $(LIB_DIR)I1620-$(ARCH).OLB\r\nI1620_SOURCE = $(I1620_DIR)I1620_CD.C,$(I1620_DIR)I1620_DP.C,\\\r\n               $(I1620_DIR)I1620_PT.C,$(I1620_DIR)I1620_TTY.C,\\\r\n               $(I1620_DIR)I1620_CPU.C,$(I1620_DIR)I1620_LP.C,\\\r\n               $(I1620_DIR)I1620_FP.C,$(I1620_DIR)I1620_SYS.C\r\nI1620_OPTIONS = /INCL=($(SIMH_DIR),$(I1620_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# PDP-1 Simulator Definitions.\r\n#\r\nPDP1_DIR = SYS$DISK:[.PDP1]\r\nPDP1_LIB = $(LIB_DIR)PDP1-$(ARCH).OLB\r\nPDP1_SOURCE = $(PDP1_DIR)PDP1_LP.C,$(PDP1_DIR)PDP1_CPU.C,\\\r\n              $(PDP1_DIR)PDP1_STDDEV.C,$(PDP1_DIR)PDP1_SYS.C,\\\r\n              $(PDP1_DIR)PDP1_DT.C,$(PDP1_DIR)PDP1_DRM.C,\\\r\n              $(PDP1_DIR)PDP1_CLK.C,$(PDP1_DIR)PDP1_DCS.C\r\nPDP1_OPTIONS = /INCL=($(SIMH_DIR),$(PDP1_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Digital Equipment PDP-8 Simulator Definitions.\r\n#\r\nPDP8_DIR = SYS$DISK:[.PDP8]\r\nPDP8_LIB = $(LIB_DIR)PDP8-$(ARCH).OLB\r\nPDP8_SOURCE = $(PDP8_DIR)PDP8_CPU.C,$(PDP8_DIR)PDP8_CLK.C,\\\r\n              $(PDP8_DIR)PDP8_DF.C,$(PDP8_DIR)PDP8_DT.C,\\\r\n              $(PDP8_DIR)PDP8_LP.C,$(PDP8_DIR)PDP8_MT.C,\\\r\n\t      $(PDP8_DIR)PDP8_PT.C,$(PDP8_DIR)PDP8_RF.C,\\\r\n              $(PDP8_DIR)PDP8_RK.C,$(PDP8_DIR)PDP8_RX.C,\\\r\n              $(PDP8_DIR)PDP8_SYS.C,$(PDP8_DIR)PDP8_TT.C,\\\r\n\t      $(PDP8_DIR)PDP8_TTX.C,$(PDP8_DIR)PDP8_RL.C,\\\r\n\t      $(PDP8_DIR)PDP8_TSC.C,$(PDP8_DIR)PDP8_TD.C,\\\r\n\t      $(PDP8_DIR)PDP8_CT.C\r\nPDP8_OPTIONS = /INCL=($(SIMH_DIR),$(PDP8_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Digital Equipment PDP-4, PDP-7, PDP-9 And PDP-15 Simulator Definitions.\r\n#\r\nPDP18B_DIR = SYS$DISK:[.PDP18B]\r\nPDP4_LIB = $(LIB_DIR)PDP4-$(ARCH).OLB\r\nPDP7_LIB = $(LIB_DIR)PDP7-$(ARCH).OLB\r\nPDP9_LIB = $(LIB_DIR)PDP9-$(ARCH).OLB\r\nPDP15_LIB = $(LIB_DIR)PDP15-$(ARCH).OLB\r\nPDP18B_SOURCE = $(PDP18B_DIR)PDP18B_DT.C,$(PDP18B_DIR)PDP18B_DRM.C,\\\r\n                $(PDP18B_DIR)PDP18B_CPU.C,$(PDP18B_DIR)PDP18B_LP.C,\\\r\n                $(PDP18B_DIR)PDP18B_MT.C,$(PDP18B_DIR)PDP18B_RF.C,\\\r\n                $(PDP18B_DIR)PDP18B_RP.C,$(PDP18B_DIR)PDP18B_STDDEV.C,\\\r\n                $(PDP18B_DIR)PDP18B_SYS.C,$(PDP18B_DIR)PDP18B_TT1.C,\\\r\n                $(PDP18B_DIR)PDP18B_RB.C,$(PDP18B_DIR)PDP18B_FPP.C\r\nPDP4_OPTIONS = /INCL=($(SIMH_DIR),$(PDP18B_DIR))/DEF=($(CC_DEFS),\"PDP4=1\")\r\nPDP7_OPTIONS = /INCL=($(SIMH_DIR),$(PDP18B_DIR))/DEF=($(CC_DEFS),\"PDP7=1\")\r\nPDP9_OPTIONS = /INCL=($(SIMH_DIR),$(PDP18B_DIR))/DEF=($(CC_DEFS),\"PDP9=1\")\r\nPDP15_OPTIONS = /INCL=($(SIMH_DIR),$(PDP18B_DIR))/DEF=($(CC_DEFS),\"PDP15=1\")\r\n\r\n#\r\n# Digital Equipment PDP-11 Simulator Definitions.\r\n#\r\nPDP11_DIR = SYS$DISK:[.PDP11]\r\nPDP11_LIB1 = $(LIB_DIR)PDP11L1-$(ARCH).OLB\r\nPDP11_SOURCE1 = $(PDP11_DIR)PDP11_FP.C,$(PDP11_DIR)PDP11_CPU.C,\\\r\n               $(PDP11_DIR)PDP11_DZ.C,$(PDP11_DIR)PDP11_CIS.C,\\\r\n               $(PDP11_DIR)PDP11_LP.C,$(PDP11_DIR)PDP11_RK.C,\\\r\n               $(PDP11_DIR)PDP11_RL.C,$(PDP11_DIR)PDP11_RP.C,\\\r\n               $(PDP11_DIR)PDP11_RX.C,$(PDP11_DIR)PDP11_STDDEV.C,\\\r\n               $(PDP11_DIR)PDP11_SYS.C,$(PDP11_DIR)PDP11_TC.C, \\\r\n               $(PDP11_DIR)PDP11_CPUMOD.C,$(PDP11_DIR)PDP11_CR.C,\\\r\n               $(PDP11_DIR)PDP11_TA.C,$(PDP11_DIR)PDP11_IO_LIB.C\r\nPDP11_LIB2 = $(LIB_DIR)PDP11L2-$(ARCH).OLB\r\nPDP11_SOURCE2 = $(PDP11_DIR)PDP11_TM.C,$(PDP11_DIR)PDP11_TS.C,\\\r\n               $(PDP11_DIR)PDP11_IO.C,$(PDP11_DIR)PDP11_RQ.C,\\\r\n               $(PDP11_DIR)PDP11_TQ.C,$(PDP11_DIR)PDP11_PCLK.C,\\\r\n               $(PDP11_DIR)PDP11_RY.C,$(PDP11_DIR)PDP11_PT.C,\\\r\n               $(PDP11_DIR)PDP11_HK.C,$(PDP11_DIR)PDP11_XQ.C,\\\r\n               $(PDP11_DIR)PDP11_VH.C,$(PDP11_DIR)PDP11_RH.C,\\\r\n               $(PDP11_DIR)PDP11_XU.C,$(PDP11_DIR)PDP11_TU.C,\\\r\n               $(PDP11_DIR)PDP11_DL.C,$(PDP11_DIR)PDP11_RF.C, \\\r\n               $(PDP11_DIR)PDP11_RC.C,$(PDP11_DIR)PDP11_KG.C,\\\r\n               $(PDP11_DIR)PDP11_KE.C,$(PDP11_DIR)PDP11_DC.C\r\nPDP11_OPTIONS = /INCL=($(SIMH_DIR),$(PDP11_DIR)$(PCAP_INC))\\\r\n\t\t/DEF=($(CC_DEFS),\"VM_PDP11=1\"$(PCAP_DEFS))\r\n\r\n#\r\n# Digital Equipment PDP-10 Simulator Definitions.\r\n#\r\nPDP10_DIR = SYS$DISK:[.PDP10]\r\nPDP10_LIB = $(LIB_DIR)PDP10-$(ARCH).OLB\r\nPDP10_SOURCE = $(PDP10_DIR)PDP10_FE.C,\\\r\n               $(PDP10_DIR)PDP10_CPU.C,$(PDP10_DIR)PDP10_KSIO.C,\\\r\n               $(PDP10_DIR)PDP10_LP20.C,$(PDP10_DIR)PDP10_MDFP.C,\\\r\n\t       $(PDP10_DIR)PDP10_PAG.C,$(PDP10_DIR)PDP10_XTND.C,\\\r\n               $(PDP10_DIR)PDP10_RP.C,$(PDP10_DIR)PDP10_SYS.C,\\\r\n               $(PDP10_DIR)PDP10_TIM.C,$(PDP10_DIR)PDP10_TU.C,\\\r\n\t       $(PDP11_DIR)PDP11_PT.C,$(PDP11_DIR)PDP11_DZ.C,\\\r\n               $(PDP11_DIR)PDP11_RY.C,$(PDP11_DIR)PDP11_XU.C,\\\r\n               $(PDP11_DIR)PDP11_CR.C\r\nPDP10_OPTIONS = /INCL=($(SIMH_DIR),$(PDP10_DIR),$(PDP11_DIR))\\\r\n\t\t/DEF=($(CC_DEFS),\"USE_INT64=1\",\"VM_PDP10=1\"$(PCAP_DEFS))\r\n\r\n#\r\n# IBM System 3 Simulator Definitions.\r\n#\r\nS3_DIR = SYS$DISK:[.S3]\r\nS3_LIB = $(LIB_DIR)S3-$(ARCH).OLB\r\nS3_SOURCE = $(S3_DIR)S3_CD.C,$(S3_DIR)S3_CPU.C,$(S3_DIR)S3_DISK.C,\\\r\n            $(S3_DIR)S3_LP.C,$(S3_DIR)S3_PKB.C,$(S3_DIR)S3_SYS.C\r\nS3_OPTIONS = /INCL=($(SIMH_DIR),$(S3_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# SDS 940\r\n#\r\nSDS_DIR = SYS$DISK:[.SDS]\r\nSDS_LIB = $(LIB_DIR)SDS-$(ARCH).OLB\r\nSDS_SOURCE = $(SDS_DIR)SDS_CPU.C,$(SDS_DIR)SDS_DRM.C,$(SDS_DIR)SDS_DSK.C,\\ \r\n             $(SDS_DIR)SDS_IO.C,$(SDS_DIR)SDS_LP.C,$(SDS_DIR)SDS_MT.C,\\\r\n             $(SDS_DIR)SDS_MUX.C,$(SDS_DIR)SDS_RAD.C,$(SDS_DIR)SDS_STDDEV.C,\\\r\n             $(SDS_DIR)SDS_SYS.C\r\nSDS_OPTIONS = /INCL=($(SIMH_DIR),$(SDS_DIR))/DEF=($(CC_DEFS))\r\n\r\n#\r\n# Digital Equipment VAX Simulator Definitions.\r\n#\r\nVAX_DIR = SYS$DISK:[.VAX]\r\nVAX_LIB = $(LIB_DIR)VAX-$(ARCH).OLB\r\nVAX_SOURCE = $(VAX_DIR)VAX_CIS.C,$(VAX_DIR)VAX_CMODE.C,\\\r\n             $(VAX_DIR)VAX_CPU.C,$(VAX_DIR)VAX_CPU1.C,\\\r\n             $(VAX_DIR)VAX_FPA.C,$(VAX_DIR)VAX_MMU.C,\\\r\n             $(VAX_DIR)VAX_OCTA.C,$(VAX_DIR)VAX_SYS.C,\\\r\n             $(VAX_DIR)VAX_SYSCM.C,$(VAX_DIR)VAX_SYSDEV.C,\\\r\n\t     $(VAX_DIR)VAX_SYSLIST.C,$(VAX_DIR)VAX_IO.C,\\\r\n             $(VAX_DIR)VAX_STDDEV.C,$(PDP11_DIR)PDP11_IO_LIB.C,\\\r\n             $(PDP11_DIR)PDP11_RL.C,$(PDP11_DIR)PDP11_RQ.C,\\\r\n             $(PDP11_DIR)PDP11_TS.C,$(PDP11_DIR)PDP11_DZ.C,\\\r\n             $(PDP11_DIR)PDP11_LP.C,$(PDP11_DIR)PDP11_TQ.C,\\\r\n             $(PDP11_DIR)PDP11_XQ.C,$(PDP11_DIR)PDP11_CR.C,\\\r\n             $(PDP11_DIR)PDP11_RY.C,$(PDP11_DIR)PDP11_VH.C\r\nVAX_OPTIONS = /INCL=($(SIMH_DIR),$(VAX_DIR),$(PDP11_DIR)$(PCAP_INC))\\\r\n\t\t/DEF=($(CC_DEFS),\"VM_VAX=1\"$(PCAP_DEFS))\r\n\r\n# Digital Equipment VAX780 Simulator Definitions.\r\n#\r\nVAX780_DIR = SYS$DISK:[.VAX]\r\nVAX780_LIB1 = $(LIB_DIR)VAX780L1-$(ARCH).OLB\r\nVAX780_SOURCE1 = $(VAX780_DIR)VAX_CPU.C,$(VAX780_DIR)VAX_CPU1.C,\\\r\n\t$(VAX780_DIR)VAX_FPA.C,$(VAX780_DIR)VAX_CIS.C,\\\r\n\t$(VAX780_DIR)VAX_OCTA.C,$(VAX780_DIR)VAX_CMODE.C,\\\r\n\t$(VAX780_DIR)VAX_MMU.C,$(VAX780_DIR)VAX_SYS.C,\\\r\n\t$(VAX780_DIR)VAX_SYSCM.C,$(VAX780_DIR)VAX780_STDDEV.C,\\\r\n\t$(VAX780_DIR)VAX780_SBI.C,$(VAX780_DIR)VAX780_MEM.C,\\\r\n\t$(VAX780_DIR)VAX780_UBA.C,$(VAX780_DIR)VAX780_MBA.C,\\\r\n\t$(VAX780_DIR)VAX780_FLOAD.C,$(VAX780_DIR)VAX780_SYSLIST.C\r\nVAX780_LIB2 = $(LIB_DIR)VAX780L2-$(ARCH).OLB\r\nVAX780_SOURCE2 = $(PDP11_DIR)PDP11_RL.C,$(PDP11_DIR)PDP11_RQ.C,\\\r\n\t$(PDP11_DIR)PDP11_TS.C,$(PDP11_DIR)PDP11_DZ.C,\\\r\n\t$(PDP11_DIR)PDP11_LP.C,$(PDP11_DIR)PDP11_TQ.C,\\\r\n\t$(PDP11_DIR)PDP11_XU.C,$(PDP11_DIR)PDP11_RY.C,\\\r\n\t$(PDP11_DIR)PDP11_CR.C,$(PDP11_DIR)PDP11_RP.C,\\\r\n\t$(PDP11_DIR)PDP11_TU.C,$(PDP11_DIR)PDP11_HK.C,\\\r\n        $(PDP11_DIR)PDP11_IO_LIB.C\r\nVAX780_OPTIONS = /INCL=($(SIMH_DIR),$(VAX780_DIR),$(PDP11_DIR)$(PCAP_INC))\\\r\n\t/DEF=($(CC_DEFS),\"VM_VAX=1\"$(PCAP_DEFS),\"VAX_780=1\")\r\n\r\n# IBM 7094 Simulator Definitions.\r\n#\r\nI7094_DIR = SYS$DISK:[.I7094]\r\nI7094_LIB = $(LIB_DIR)I7094-$(ARCH).OLB\r\nI7094_SOURCE = $(I7094_DIR)I7094_CPU.C,$(I7094_DIR)I7094_CPU1.C,\\\r\n\t$(I7094_DIR)I7094_IO.C,$(I7094_DIR)I7094_CD.C,\\\r\n\t$(I7094_DIR)I7094_CLK.C,$(I7094_DIR)I7094_COM.C,\\\r\n\t$(I7094_DIR)I7094_DRM.C,$(I7094_DIR)I7094_DSK.C,\\\r\n\t$(I7094_DIR)I7094_SYS.C,$(I7094_DIR)I7094_LP.C,\\\r\n\t$(I7094_DIR)I7094_MT.C,$(I7094_DIR)I7094_BINLOADER.C\r\nI7094_OPTIONS = /INCL=($(SIMH_DIR),$(I7094_DIR))/DEF=($(CC_DEFS))\r\n\r\n# If we're not a VAX, Build Everything\r\n#\r\n.IF ALPHA_OR_IA64\r\nALL :\tALTAIR ALTAIRZ80 ECLIPSE GRI LGP H316 HP2100 I1401 I1620 IBM1130 ID16 \\\r\n\tID32 NOVA PDP1 PDP4 PDP7 PDP8 PDP9 PDP10 PDP11 PDP15 S3 VAX VAX780 SDS \\\r\n\tI7094\r\n\t@CONTINUE\r\n.ELSE\r\n#\r\n# Else We Are On VAX And Build Everything EXCEPT the 64b simulators\r\n#\r\nALL :\tALTAIR ALTAIRZ80 GRI H316 HP2100 I1401 I1620 IBM1130 ID16 ID32 \\\r\n\tNOVA PDP1 PDP4 PDP7 PDP8 PDP9 PDP11 PDP15 S3 VAX VAX780 SDS\r\n\t@CONTINUE\r\n.ENDIF\r\n\r\nCLEAN : \r\n\t$!\r\n\t$! Clean out all targets and building Remnants\r\n\t$!\r\n\t$ IF (F$SEARCH(\"$(BIN_DIR)*.EXE;*\").NES.\"\") THEN -\r\n\t     DELETE/NOLOG/NOCONFIRM $(BIN_DIR)*.EXE;*\r\n\t$ IF (F$SEARCH(\"$(LIB_DIR)*.OLB;*\").NES.\"\") THEN -\r\n\t     DELETE/NOLOG/NOCONFIRM $(LIB_DIR)*.OLB;*\r\n\t$ IF (F$SEARCH(\"SYS$DISK:[...]*.OBJ;*\").NES.\"\") THEN -\r\n\t     DELETE/NOLOG/NOCONFIRM SYS$DISK:[...]*.OBJ;*\r\n\t$ IF (F$SEARCH(\"SYS$DISK:[...]*.LIS;*\").NES.\"\") THEN -\r\n\t     DELETE/NOLOG/NOCONFIRM SYS$DISK:[...]*.LIS;*\r\n\t$ IF (F$SEARCH(\"SYS$DISK:[...]*.MAP;*\").NES.\"\") THEN -\r\n\t     DELETE/NOLOG/NOCONFIRM SYS$DISK:[...]*.MAP;*\r\n\r\n#\r\n# Build The Libraries.\r\n#\r\n$(SIMH_LIB) : $(SIMH_SOURCE)\r\n                $!\r\n\t\t$! Building The $(SIMH_LIB) Library.\r\n                $!\r\n                $ $(CC)/DEF=($(CC_DEFS)$(PCAP_DEFS))$(PCAP_SIMH_INC) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(ALTAIR_LIB) : $(ALTAIR_SOURCE)\r\n\t\t$!\r\n\t\t$! Building The $(ALTAIR_LIB) Library.\r\n                $!\r\n                $ $(CC)$(ALTAIR_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(ALTAIRZ80_LIB) : $(ALTAIRZ80_SOURCE)\r\n                $!\r\n\t\t$! Building The $(ALTAIRZ80_LIB) Library.\r\n                $!\r\n                $ $(CC)$(ALTAIRZ80_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n#\r\n# If Not On VAX, Build The Eclipse Library.\r\n#\r\n.IF ALPHA_OR_IA64\r\n$(ECLIPSE_LIB) : $(ECLIPSE_SOURCE)\r\n                $!\r\n\t\t$! Building The $(ECLIPSE_LIB) Library.\r\n                $!\r\n                $ $(CC)$(ECLIPSE_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# We Are On VAX And Due To The Use of INT64 We Can't Build It.\r\n#\r\n$(ECLIPSE_LIB) : \r\n                $!\r\n\t\t$! Due To The Use Of INT64 We Can't Build The\r\n                $! $(LIB_DIR)ECLIPSE-$(ARCH).OLB Library On VAX.\r\n                $!\r\n.ENDIF\r\n\r\n$(GRI_LIB) : $(GRI_SOURCE)\r\n\t\t$!\r\n\t\t$! Building The $(GRI_LIB) Library.\r\n\t\t$!\r\n\t\t$ $(CC)$(GRI_OPTIONS) -\r\n\t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n\t\t$ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n\t\t\tLIBRARY/CREATE $(MMS$TARGET)\r\n\t\t$ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n\t\t$ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(LGP_LIB) : $(LGP_SOURCE)\r\n\t\t$!\r\n\t\t$! Building The $(LGP_LIB) Library.\r\n\t\t$!\r\n\t\t$ $(CC)$(LGP_OPTIONS) -\r\n\t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n\t\t$ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n\t\t\tLIBRARY/CREATE $(MMS$TARGET)\r\n\t\t$ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n\t\t$ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(H316_LIB) : $(H316_SOURCE)\r\n                $!\r\n\t\t$! Building The $(H316_LIB) Library.\r\n                $!\r\n                $ $(CC)$(H316_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(HP2100_LIB) : $(HP2100_SOURCE)\r\n                $!\r\n\t\t$! Building The $(HP2100_LIB) Library.\r\n                $!\r\n                $ $(CC)$(HP2100_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(I1401_LIB) : $(I1401_SOURCE)\r\n                $!\r\n\t\t$! Building The $(I1401_LIB) Library.\r\n                $!\r\n\t        $ $(CC)$(I1401_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(I1620_LIB) : $(I1620_SOURCE)\r\n                $!\r\n\t\t$! Building The $(I1620_LIB) Library.\r\n                $!\r\n\t        $ $(CC)$(I1620_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(IBM1130_LIB) : $(IBM1130_SOURCE)\r\n                $!\r\n\t\t$! Building The $(IBM1130_LIB) Library.\r\n                $!\r\n\t        $ $(CC)$(IBM1130_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(ID16_LIB) : $(ID16_SOURCE)\r\n                $!\r\n\t\t$! Building The $(ID16_LIB) Library.\r\n                $!\r\n\t        $ $(CC)$(ID16_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(ID32_LIB) : $(ID32_SOURCE)\r\n                $!\r\n\t\t$! Building The $(ID32_LIB) Library.\r\n                $!\r\n\t        $ $(CC)$(ID32_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(NOVA_LIB) : $(NOVA_SOURCE)\r\n                $!\r\n\t\t$! Building The $(NOVA_LIB) Library.\r\n                $!\r\n                $ $(CC)$(NOVA_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP1_LIB) : $(PDP1_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP1_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP1_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP4_LIB) : $(PDP18B_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP4_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP4_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP7_LIB) : $(PDP18B_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP7_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP7_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP8_LIB) : $(PDP8_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP8_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP8_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP9_LIB) : $(PDP18B_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP9_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP9_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n#\r\n# If Not On VAX, Build The PDP-10 Library.\r\n#\r\n.IF ALPHA_OR_IA64\r\n$(PDP10_LIB) : $(PDP10_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP10_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP10_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# We Are On VAX And Due To The Use of INT64 We Can't Build It.\r\n#\r\n$(PDP10_LIB) : \r\n\t\t$! Due To The Use Of INT64 We Can't Build The\r\n                $! $(LIB_DIR)PDP10-$(ARCH).OLB Library On VAX.\r\n.ENDIF\r\n\r\n$(PDP11_LIB1) : $(PDP11_SOURCE1)\r\n                $!\r\n\t\t$! Building The $(PDP11_LIB1) Library.\r\n                $!\r\n                $(CC)$(PDP11_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP11_LIB2) : $(PDP11_SOURCE2)\r\n                $!\r\n\t\t$! Building The $(PDP11_LIB2) Library.\r\n                $!\r\n                $(CC)$(PDP11_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PDP15_LIB) : $(PDP18B_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PDP15_LIB) Library.\r\n                $!\r\n                $ $(CC)$(PDP15_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(S3_LIB) : $(S3_SOURCE)\r\n                $!\r\n\t\t$! Building The $(S3_LIB) Library.\r\n                $!\r\n                $ $(CC)$(S3_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(SDS_LIB) : $(SDS_SOURCE)\r\n                $!\r\n\t\t$! Building The $(SDS_LIB) Library.\r\n                $!\r\n                $ $(CC)$(SDS_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(VAX_LIB) : $(VAX_SOURCE)\r\n                $!\r\n\t\t$! Building The $(VAX_LIB) Library.\r\n                $!\r\n                $ $(CC)$(VAX_OPTIONS)/OBJ=$(VAX_DIR) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(VAX780_LIB1) : $(VAX780_SOURCE1)\r\n                $!\r\n\t\t$! Building The $(VAX780_LIB1) Library.\r\n                $!\r\n                $ $(CC)$(VAX780_OPTIONS)/OBJ=$(VAX780_DIR) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(VAX780_LIB2) : $(VAX780_SOURCE2)\r\n                $!\r\n\t\t$! Building The $(VAX780_LIB2) Library.\r\n                $!\r\n                $ $(CC)$(VAX780_OPTIONS)/OBJ=$(VAX780_DIR) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n$(PCAP_LIB) : $(PCAP_SOURCE)\r\n                $!\r\n\t\t$! Building The $(PCAP_LIB) Library.\r\n                $!\r\n\t\t$ SET DEFAULT $(PCAP_DIR)\r\n                $ @VMS_PCAP $(DEBUG)\r\n\t\t$ SET DEFAULT [--]\r\n                $ IF (F$SEARCH(\"$(PCAP_LIB)\").NES.\"\") THEN -\r\n                        DELETE $(PCAP_LIB);\r\n                $ COPY $(PCAP_DIR)PCAP.OLB $(PCAP_LIB)\r\n                $ DELETE/NOLOG/NOCONFIRM $(PCAP_DIR)*.OBJ;*,$(PCAP_DIR)*.OLB;*\r\n\t\t\t     \r\n#\r\n# If Not On VAX, Build The IBM 7094 Library.\r\n#\r\n.IF ALPHA_OR_IA64\r\n$(I7094_LIB) : $(I7094_SOURCE)\r\n                $!\r\n\t\t$! Building The $(I7094_LIB) Library.\r\n                $!\r\n                $ $(CC)$(I7094_OPTIONS) -\r\n    \t\t\t/OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST)\r\n                $ IF (F$SEARCH(\"$(MMS$TARGET)\").EQS.\"\") THEN -\r\n                        LIBRARY/CREATE $(MMS$TARGET)\r\n                $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ\r\n                $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# We Are On VAX And Due To The Use of INT64 We Can't Build It.\r\n#\r\n$(I7094_LIB) : \r\n\t\t$! Due To The Use Of INT64 We Can't Build The\r\n                $! $(LIB_DIR)I7094-$(ARCH).OLB Library On VAX.\r\n.ENDIF\r\n\r\n#\r\n# Individual Simulator Builds.\r\n#\r\nALTAIR : $(SIMH_LIB) $(ALTAIR_LIB)\r\n         $!\r\n         $! Building The $(BIN_DIR)ALTAIR-$(ARCH).EXE Simulator.\r\n         $!\r\n         $ $(CC)$(ALTAIR_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n         $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)ALTAIR-$(ARCH).EXE -\r\n                $(BLD_DIR)SCP.OBJ,$(ALTAIR_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n         $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nALTAIRZ80 : $(SIMH_LIB) $(ALTAIRZ80_LIB)\r\n            $!\r\n            $! Building The $(BIN_DIR)ALTAIRZ80-$(ARCH).EXE Simulator.\r\n            $!\r\n            $ $(CC)$(ALTAIRZ80_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n            $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)ALTAIRZ80-$(ARCH).EXE -\r\n                   $(BLD_DIR)SCP.OBJ,$(ALTAIRZ80_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n            $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n#\r\n# If Not On VAX, Build The PDP-10 Simulator.\r\n#\r\n.IF ALPHA_OR_IA64\r\nECLIPSE : $(SIMH_LIB) $(ECLIPSE_LIB)\r\n          $!\r\n          $! Building The $(BIN_DIR)ECLIPSE-$(ARCH).EXE Simulator.\r\n          $!\r\n          $ $(CC)$(ECLIPSE_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n          $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)ECLIPSE-$(ARCH).EXE -\r\n                 $(BLD_DIR)SCP.OBJ,$(ECLIPSE_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n          $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# Else We Are On VAX And Tell The User We Can't Build On VAX\r\n# Due To The Use Of INT64.\r\n#\r\nECLIPSE : \r\n        $! Sorry, Can't Build $(BIN_DIR)ECLIPSE-$(ARCH).EXE Simulator\r\n        $! Because It Requires The Use Of INT64.\r\n.ENDIF\r\n\r\nGRI : $(SIMH_LIB) $(GRI_LIB)\r\n      $!\r\n      $! Building The $(BIN_DIR)GRI-$(ARCH).EXE Simulator.\r\n      $!\r\n      $ $(CC)$(GRI_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n      $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)GRI-$(ARCH).EXE -\r\n             $(BLD_DIR)SCP.OBJ,$(GRI_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n      $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nLGP : $(SIMH_LIB) $(LGP_LIB)\r\n      $!\r\n      $! Building The $(BIN_DIR)LGP-$(ARCH).EXE Simulator.\r\n      $!\r\n      $ $(CC)$(LGP_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n      $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)LGP-$(ARCH).EXE -\r\n             $(BLD_DIR)SCP.OBJ,$(LGP_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n      $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nH316 : $(SIMH_LIB) $(H316_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)H316-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(H316_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)H316-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(H316_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nHP2100 : $(SIMH_LIB) $(HP2100_LIB)\r\n         $!\r\n         $! Building The $(BIN_DIR)HP2100-$(ARCH).EXE Simulator.\r\n         $!\r\n         $ $(CC)$(HP2100_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n         $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)HP2100-$(ARCH).EXE -\r\n                $(BLD_DIR)SCP.OBJ,$(HP2100_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n         $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nI1401 : $(SIMH_LIB) $(I1401_LIB)\r\n        $!\r\n        $! Building The $(BIN_DIR)I1401-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(I1401_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)I1401-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(I1401_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nI1620 : $(SIMH_LIB) $(I1620_LIB)\r\n        $!\r\n        $! Building The $(BIN_DIR)I1620-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(I1620_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)I1620-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(I1620_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nIBM1130 : $(SIMH_LIB) $(IBM1130_LIB)\r\n          $!\r\n          $! Building The $(BIN_DIR)IBM1130-$(ARCH).EXE Simulator.\r\n          $!\r\n          $ $(CC)$(IBM1130_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n          $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)IBM1130-$(ARCH).EXE -\r\n                 $(BLD_DIR)SCP.OBJ,$(IBM1130_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n          $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nID16 : $(SIMH_LIB) $(ID16_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)ID16-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(ID16_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)ID16-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(ID16_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nID32 : $(SIMH_LIB) $(ID32_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)ID32-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(ID32_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)ID32-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(ID32_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nNOVA : $(SIMH_LIB) $(NOVA_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)NOVA-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(NOVA_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)NOVA-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(NOVA_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP1 : $(SIMH_LIB) $(PDP1_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)PDP1-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(PDP1_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP1-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(PDP1_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP4 : $(SIMH_LIB) $(PDP4_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)PDP4-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(PDP4_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP4-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(PDP4_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP7 : $(SIMH_LIB) $(PDP7_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)PDP7-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(PDP7_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP7-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(PDP7_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP8 : $(SIMH_LIB) $(PDP8_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)PDP8-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(PDP8_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP8-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(PDP8_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP9 : $(SIMH_LIB) $(PDP9_LIB)\r\n       $!\r\n       $! Building The $(BIN_DIR)PDP9-$(ARCH).EXE Simulator.\r\n       $!\r\n       $ $(CC)$(PDP9_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n       $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP9-$(ARCH).EXE -\r\n              $(BLD_DIR)SCP.OBJ,$(PDP9_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n#\r\n# If Not On VAX, Build The PDP-10 Simulator.\r\n#\r\n.IF ALPHA_OR_IA64\r\nPDP10 : $(SIMH_LIB) $(PCAP_LIBD) $(PDP10_LIB) $(PCAP_EXECLET)\r\n        $!\r\n        $! Building The $(BIN_DIR)PDP10-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(PDP10_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP10-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(PDP10_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY$(PCAP_LIBR)\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# Else We Are On VAX And Tell The User We Can't Build On VAX\r\n# Due To The Use Of INT64.\r\n#\r\nPDP10 : \r\n        $! Sorry, Can't Build $(BIN_DIR)PDP10-$(ARCH).EXE Simulator\r\n        $! Because It Requires The Use Of INT64.\r\n.ENDIF\r\n\r\nPDP11 : $(SIMH_LIB) $(PCAP_LIBD) $(PDP11_LIB1) $(PDP11_LIB2) $(PCAP_EXECLET)\r\n        $!\r\n        $! Building The $(BIN_DIR)PDP11-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(PDP11_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP11-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(PDP11_LIB1)/LIBRARY,$(PDP11_LIB2)/LIBRARY,$(SIMH_LIB)/LIBRARY$(PCAP_LIBR)\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nPDP15 : $(SIMH_LIB) $(PDP15_LIB)\r\n        $!\r\n        $! Building The $(BIN_DIR)PDP15-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(PDP15_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)PDP15-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(PDP15_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nS3 : $(SIMH_LIB) $(S3_LIB)\r\n     $!\r\n     $! Building The $(BIN_DIR)S3-$(ARCH).EXE Simulator.\r\n     $!\r\n     $ $(CC)$(S3_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n     $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)S3-$(ARCH).EXE -\r\n            $(BLD_DIR)SCP.OBJ,$(S3_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n     $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nSDS : $(SIMH_LIB) $(SDS_LIB)\r\n      $!\r\n      $! Building The $(BIN_DIR)SDS-$(ARCH).EXE Simulator.\r\n      $!\r\n      $ $(CC)$(SDS_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n      $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)SDS-$(ARCH).EXE -\r\n             $(BLD_DIR)SCP.OBJ,$(SDS_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY\r\n      $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nVAX : $(SIMH_LIB) $(PCAP_LIBD) $(VAX_LIB) $(PCAP_EXECLET)\r\n      $!\r\n      $! Building The $(BIN_DIR)VAX-$(ARCH).EXE Simulator.\r\n      $!\r\n      $ $(CC)$(VAX_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n      $ LINK $(LINK_DEBUG)$(LINK_SECTION_BINDING)-\r\n\t     /EXE=$(BIN_DIR)VAX-$(ARCH).EXE -\r\n             $(BLD_DIR)SCP.OBJ,$(VAX_LIB)/LIBRARY,-\r\n\t     $(SIMH_LIB)/LIBRARY$(PCAP_LIBR)\r\n      $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\nVAX780 : $(SIMH_LIB) $(PCAP_LIBD) $(VAX780_LIB1) $(VAX780_LIB2) $(PCAP_EXECLET)\r\n      $!\r\n      $! Building The $(BIN_DIR)VAX780-$(ARCH).EXE Simulator.\r\n      $!\r\n      $ $(CC)$(VAX780_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n      $ LINK $(LINK_DEBUG)$(LINK_SECTION_BINDING)-\r\n             /EXE=$(BIN_DIR)VAX780-$(ARCH).EXE -\r\n             $(BLD_DIR)SCP.OBJ,-\r\n             $(VAX780_LIB1)/LIBRARY,$(VAX780_LIB2)/LIBRARY,-\r\n \t     $(SIMH_LIB)/LIBRARY$(PCAP_LIBR)\r\n       $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n\r\n#\r\n# If Not On VAX, Build The IBM 7094 Simulator.\r\n#\r\n.IF ALPHA_OR_IA64\r\nI7094 : $(SIMH_LIB) $(I7094_LIB)\r\n        $!\r\n        $! Building The $(BIN_DIR)I7094-$(ARCH).EXE Simulator.\r\n        $!\r\n        $ $(CC)$(I7094_OPTIONS)/OBJ=$(BLD_DIR) SCP.C\r\n        $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)I7094-$(ARCH).EXE -\r\n               $(BLD_DIR)SCP.OBJ,$(I7094_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY$(PCAP_LIBR)\r\n        $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;*\r\n.ELSE\r\n#\r\n# Else We Are On VAX And Tell The User We Can't Build On VAX\r\n# Due To The Use Of INT64.\r\n#\r\nI7094 : \r\n        $! Sorry, Can't Build $(BIN_DIR)I7094-$(ARCH).EXE Simulator\r\n        $! Because It Requires The Use Of INT64.\r\n.ENDIF\r\n\r\n#\r\n# PCAP VCI Components\r\n#\r\n$(PCAP_VCI) : $(PCAP_VCMDIR)PCAPVCM.EXE\r\n              $!\r\n              $! Installing the PCAP VCI Execlet in SYS$LOADABLE_IMAGES\r\n              $!\r\n              $ COPY $(PCAP_VCMDIR)PCAPVCM.EXE SYS$COMMON:[SYS$LDR]PCAPVCM.EXE \r\n\r\n$(PCAP_VCMDIR)PCAPVCM.EXE : $(PCAP_VCM_SOURCES) \r\n                            $!\r\n                            $! Building The PCAP VCI Execlet\r\n                            $!\r\n                            $ @SYS$DISK:[.PCAP-VMS.PCAPVCM]BUILD_PCAPVCM\r\n                            $ DELETE/NOLOG/NOCONFIRM $(PCAP_VCMDIR)*.OBJ;*,$(PCAP_VCMDIR)*.MAP;*\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Module Management System/spline_descrip.mms",
    "content": "!\n! $Id: descrip.mms 35 2008-01-08 21:37:42Z tmr $\n!\n! Project:  LISP -- The LISP Interpreter\n! Created:  22-DEC-2008 18:35\n! Author:   tmr\n\ncc = cc\ncflags = /define=\"_VMS_=1\" -\n/WARN=DISABLE=(ZERODIV,FLOATOVERFL,NOMAINUFLO) -\n/IEEE_MODE=UNDERFLOW_TO_ZERO/FLOAT=IEEE\ncore = LISP_CORE\nmain = LISP_MAIN\nexec = [.bin]LISP\nclib = SYS$LIBRARY:VAXCRTL\nhead = LISP_CORE\nobjs = $(core).obj, $(main).obj\n\n$(exec) : $(objs)\n        DEFINE/NOLOG LNK$LIBRARY $(clib)\n        LINK/EXEC=$(exec) $(objs)\n        DEASSIGN LNK$LIBRARY\n\n$(core).obj : $(core).c, $(head).h\n\n$(main).obj : $(main).c, $(head).h\n\nclean :\n        del *.obj;*\n        del *.exe;*\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Module Management System/xv_makefile.mms",
    "content": "#\tMMS Description file for xv\n#\tWritten by Rick Dyson (dyson@iowasp.physics.uiowa.edu)\n#\tLast Modified:\t30-APR-1992 for v2.21\n#\t\t\t 5-OCT-1992 for v2.21 (export.lcs.mit.edu version\n#\t\t\t\t    of xv-2.21 seemed to change about\n#\t\t\t\t    25-Sep-1992 without version number\n#\t\t\t\t    changing.\n#\t\t\t 8-FEB-1993 for v2.21b\n#\t\t\t\t    ALPHA support is in ALPHA.MMS\n#\t\t\t 2-MAR-1993 for v3.00\n#\t\t\t15-APR-1993 for v3.00 (DEC C changes)\n#\t\t\t25-MAY-1993 merged ALPHA.MMS and MAKEFILE.MMS\n#                       27-APR-1994 for v3.01\n#\t\t\t23-DEC-1994 for v3.10\n#\n# \tModeled after the original Unix Makefile for xv\n#\tMost of the Unix comments have been left intact to help debug any\n#\tproblems.\n\n\n# BE SURE TO SET THIS TO YOUR SITE'S DESTINATION DIRECTORY...!!!\nBINDIR = Sys$Disk:[]\n\n# your C compiler (and options) of choice\n# Remember:  if you change the C compiler (to gcc, or whatever), be sure to\n# do the same thing to the Makefile in the 'jpeg' and 'tiff' subdirectories\n#\n# For ALPHA/DEC C users, you must add a MACRO qualifier to the\n# command line, i.e.,\n#       MMS /Description = Makefile.mms /Macro = (\"ALPHA=1\")\n#\n# For VAX/DEC C users, you must add a MACRO qualifier to the\n# command line, i.e.,\n#       MMS /Description = Makefile.mms /Macro = (\"DECC=1\")\n#\n# Users still using the non-MOTIF DECWindows (i.e., XUI) should also\n# add another macro of \"DEC_XUI=1\"\n\nCC = cc\n\n\n################ CONFIGURATION OPTIONS #################\n\n# if, for whatever reason, you're unable to get the JPEG library to compile\n# on your machine, *COMMENT OUT* the following lines.\n#\n# Also, comment out the JPEGLIB dependancy below.\n#\n#  VMS MMS USERS!!!\n#\n# \tif you don't use the JPEG package as supplied with XV, you\n# \twill need fill in the complete directory specifications for JPEGDIR.\n#\nJPEG = ,HAVE_JPEG\nJPEGDIR = [.JPEG]\nJPEGLIB = $(JPEGDIR)LIBJPEG.OLB\nJPEGINCLUDE = ,$(JPEGDIR)\n\n\n# if, for whatever reason, you're unable to get the TIFF library to compile\n# on your machine, *COMMENT OUT* the following lines\n#\n# Also, comment out the LIBTIFF dependancy at the end of this Makefile\n#\n# \tif you don't use the TIFF package as supplied with XV, you\n# \twill need to fill in the complete directory specifications for TIFFDIR.\n#\nTIFF = ,HAVE_TIFF\nTIFFDIR = [.TIFF]\nTIFFLIB = $(TIFFDIR)LIBTIFF.OLB\nTIFFINCLUDE = ,$(TIFFDIR)\n\n\n# if, for whatever reason, you're unable to get the PDS/VICAR support\n# to compile (xvpds.c, and vdcomp.c), *COMMENT OUT* the following line,\n# and also remove 'vdcomp' from the 'all:' dependancy\nPDS = ,HAVE_PDS\n\n\n# If you are still using the DECWindows XUI interface, uncomment the\n# next line.  This will help stop the \"window creep\" problem with this\n# window mananager\n.ifdef DEC_XUI\nXUI = ,HAVE_XUI\n.endif\n\nDEFS = /Define = (VMS$(JPEG)$(PDS)$(TIFF)$(TIMERS)$(XUI))\nINCS = /Include = ([]$(JPEGINCLUDE)$(TIFFINCLUDE))\n\n.ifdef ALPHA\nOPTIMIZE = /Optimize /Standard = VAXC\nOPTS = Sys$Disk:[]DECC_OPTIONS.OPT\n.else\n.ifdef DECC\nOPTIMIZE = /Optimize /Standard = VAXC /Warnings = NoInformationals\nOPTS = Sys$Disk:[]DECC_OPTIONS.OPT\n.else\nOPTIMIZE = /Optimize\nOPTS = Sys$Disk:[]VAXC_OPTIONS.OPT\n.endif\n.endif\nDEBUG = /NoDebug\n\nCFLAGS = $(CFLAGS) $(DEFS) $(INCS) $(DEBUG) $(OPTIMIZE)\nLINKFLAGS = $(LINKFLAGS) $(DEBUG)\n\nXVLIB = LIBXV.OLB\n\nOBJS = \txv.obj,xvevent.obj,xvroot.obj,xvmisc.obj,xvimage.obj,xvcolor.obj, \\\n        xvsmooth.obj,xv24to8.obj,xvgif.obj,xvpm.obj,xvinfo.obj,xvctrl.obj, \\\n        xvscrl.obj,xvalg.obj,xvgifwr.obj,xvdir.obj,xvbutt.obj,xvpbm.obj, \\\n        xvxbm.obj,xvgam.obj,xvbmp.obj,xvdial.obj,xvgraf.obj,xvsunras.obj, \\\n        xvjpeg.obj,xvps.obj,xvpopup.obj,xvdflt.obj,xvtiff.obj,xvtiffwr.obj, \\\n        xvpds.obj,xvrle.obj,xviris.obj,xvgrab.obj,xvbrowse.obj,xviff.obj, \\\n        xvtext.obj,xvpcx.obj,xvtarga.obj,xvxpm.obj,xvcut.obj,xvxwd.obj,   \\\n        xvfits.obj,vms.obj\n\n\nBITS = [.Bits]annot.h\n\nMISC = readme. changelog. ideas.\n\n.first\n.ifdef ALPHA\n\t@- Define /NoLog Sys DECC$Library_Include\n.else\n.ifdef DECC\n\t@- Define /NoLog Sys DECC$Library_Include\n.else\n\t@- Define /NoLog Sys Sys$Library\n.endif\n\t@- Define /NoLog X11 DECW$Include\n\t@- XVDIR = F$Environment (\"Default\")\n.endif\n\nall : \t\t$(BITS) $(OPTS) lib xv bggen decompress xcmap xvpictoppm help\n\t! All Finished with the VMS build of XV (v3.10)\n\nlib :   \t$(JPEGLIB) $(TIFFLIB) $(XVLIB)\n\t@ Continue\n\nxv :\t\txv.exe\n\t@ Continue\n\nbggen :\t\tbggen.exe\n\t@ Continue\n\nxcmap :         xcmap.exe\n\t@ Continue\n\nxvpictoppm :\txvpictoppm.exe\n\t@ Continue\n\nhelp :\t\txv.hlb\n\t@ Continue\n\ndecompress :\tdecompress.exe vdcomp.exe\n\t@ Continue\n\nbggen.exe : \tbggen.obj $(XVLIB) $(OPTS)\n\t$(LINK) $(LINKFLAGS) bggen.obj,$(XVLIB)/Library,$(OPTS)/Option\n\nxcmap.exe :     xcmap.obj\n\t$(LINK) $(LINKFLAGS) xcmap.obj,$(XVLIB)/Library,$(OPTS)/Option\n\nxvpictoppm.exe :\txvpictoppm.obj\n\t$(LINK) $(LINKFLAGS) xvpictoppm.obj,$(XVLIB)/Library,$(OPTS)/Option\n\nxv.exe : \txv.obj $(XVLIB) $(JPEGLIB) $(TIFFLIB) $(OPTS) \n\t$(LINK) $(LINKFLAGS) xv.obj,$(XVLIB)/Library,$(JPEGLIB)/Library,$(TIFFLIB)/Library,$(OPTS)/Option\n\n$(JPEGLIB) :\n\tSet Default $(JPEGDIR)\n.ifdef ALPHA\n\t$(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.MMS /Macro = \"ALPHA = 1\" LIBJPEG.OLB\n.else\n\t$(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.MMS LIBJPEG.OLB\n.endif\n\tSet Default 'XVDIR'\n\n$(TIFFLIB) :\n\tSet Default $(TIFFDIR)\n.ifdef ALPHA\n\t$(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.MMS /Macro = \"ALPHA = 1\" LIBTIFF.OLB\n.else\n.ifdef DECC\n\t$(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.MMS /Macro = \"ALPHA = 1\" LIBTIFF.OLB\n.else\n\t$(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.MMS LIBTIFF.OLB\n.endif\n.endif\n\tSet Default 'XVDIR'\n\n$(XVLIB) :\t$(OBJS)\n        If \"''F$Search (\"$(XVLIB)\")'\" .eqs. \"\" Then Library /Create $(XVLIB)\n\tLibrary /Replace $(XVLIB) $(OBJS)\n\ndecompress.exe :\tdecompress.obj\n\t$(LINK) $(LINKFLAGS) decompress.obj,$(OPTS)/Option\n\nvdcomp.exe :\tvdcomp.obj\n\t$(LINK) $(LINKFLAGS) vdcomp.obj,$(OPTS)/Option\n\n[.Bits]annot.h :\t\n\tSet Default [.Bits]\n\tSet Protection = Owner:RWED *.\n\tRename *. *.H\n\tSet Protection = Owner:RWE *.H\n\tSet Default [-]\n\n#\tvarious dependencies\n$(OBJS) :   \t\txv.h config.h\nxv.hlb :\t\txv.hlp\nvms.obj :\t\tincludes.h dirent.h\n\n#\n#  Build the linker options file for OpenVMS VAX and VAX C.\n#\nSys$Disk:[]VAXC_Options.opt :\n        @ Open /Write TMP VAXC_Options.opt\n        @ Write TMP \"! XV (v3.10) Linker Options list for VMS VAX C\"\n        @ Write TMP \"!\"\n        @ Write TMP \"Sys$Disk:[]LibXV.OLB /Library\"\n        @ Write TMP \"Sys$Disk:[.JPEG]LibJPEG.OLB /Library\"\n        @ Write TMP \"Sys$Disk:[.TIFF]LibTIFF.OLB /Library\"\n.ifdef DEC_XUI\n        @ Write TMP \"!\"\n        @ Write TMP \"! These were appropriate for VAX C and XUI in the past.\"\n        @ Write TMP \"Sys$Library:DECW$DWTLibShr.exe /Share\n        @ Write TMP \"Sys$Library:DECW$XLibShr.exe /Share\n        @ Write TMP \"!You may need the next line for VAX C (v3.2-044)\"\n        @ Write TMP \"!But you don't for DEC C (v4.0-000)\"\n        @ Write TMP \"Sys$Library:VAXCRTL.EXE /Share\"\n.else\n        @ Write TMP \"!\"\n        @ Write TMP \"! Some of the following libraries may not be available on\"\n        @ Write TMP \"! older systems, namely XUI or Motif v1.0/1.1\"\n        @ Write TMP \"! I know they are available for OpenVMS v6.1/Motif v1.2.\"\n        @ Write TMP \"! If you get a report that they can't be found,\"\n        @ Write TMP \"! comment them out and try again...\"\n        @ Write TMP \"Sys$Library:DECW$DXMLibShr12.exe /Share\n        @ Write TMP \"Sys$Library:DECW$XMLibShr12.exe /Share\n        @ Write TMP \"Sys$Library:DECW$XTLibShrR5.exe /Share\"\n        @ Write TMP \"Sys$Library:DECW$XLibShr.exe /Share\n.endif\n        @ Close TMP\n\nSys$Disk:[]DECC_Options.opt :\n        @ Open /Write TMP DECC_Options.opt\n        @ Write TMP \"! XV (v3.10) Linker Options list for VMS DEC C\"\n        @ Write TMP \"!\"\n        @ Write TMP \"Sys$Disk:[]LibXV.olb /Library\"\n        @ Write TMP \"Sys$Disk:[.JPEG]LibJPEG.olb /Library\"\n        @ Write TMP \"Sys$Disk:[.TIFF]LibTIFF.olb /Library\"\n        @ Write TMP \"Sys$Library:DECW$XTShr.exe /Share\"\n        @ Write TMP \"Sys$Library:DECW$XLibShr.exe /Share\"\n        @ Close TMP\n\ninstall :\txv.exe vdcomp.exe bggen.exe decompress.exe\n\tCopy *.exe $(BINDIR)\n\nclean :\n\t@- Set Protection = Owner:RWED *.obj,*.*;-1\n\t- Delete /NoConfirm /NoLog *.obj;*,*.exe;*,*.log;*,*.olb;*,*.hlb;*\n\t- Purge /NoConfirm /NoLog\n\tSet Default [.JPEG]\n\t$(MMS) /Description = MAKEFILE.MMS clean\n\t- Delete /NoConfirm /NoLog *.olb;*\n\tSet Default [-.TIFF]\n\t$(MMS) /Description = MAKEFILE.MMS clean\n\tSet Default [-]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Monkey/encodeToPng.monkey2",
    "content": "\n#Import \"<std>\"\nUsing std..\n\n'Set your own path here. Defaults to build folder.\nGlobal path:= AppDir() + \"encodeToPng.png\"\t\t\n\nFunction Main()\n\t\n\t'Write from PixMap\n\tLocal source := New Pixmap( 100, 100 )\n\tFor Local y := 0 Until source.Width\n\t\tFor Local x := 0 Until source.Height\n\t\t\t'Generates random pixels\n\t\t\tsource.SetPixelARGB( x, y, ARGB( 255, Rnd(0, 255), 0, Rnd(0, 255) ) )\n\t\tNext\n\tNext\n\tsource.Save( path )\n\t\n\t'Read from png to PixMap\n\tLocal dest := Pixmap.Load( path )\n\tLocal a :=  \"\"\n\tLocal r :=  \"\"\n\tLocal g :=  \"\"\n\tLocal b :=  \"\"\n\tFor Local y := 0 Until dest.Width\n\t\tFor Local x := 0 Until source.Height\n\t\t\tLocal argb := dest.GetPixelARGB(x,y) \n\t\t\ta += ARGBToAlpha( argb ) + \" \"\n\t\t\tr += ARGBToRed( argb ) + \" \"\n\t\t\tg += ARGBToGreen( argb ) + \" \"\n\t\t\tb += ARGBToBlue( argb ) + \" \"\n\t\tNext\n\t\ta += \"~n\"\n\t\tr += \"~n\"\n\t\tg += \"~n\"\n\t\tb += \"~n\"\n\tNext\n\t\n\t'Print resulting pixels\n\tPrint( \" ~nAlpha:~n\" + a )\n\tPrint( \" ~nRed:~n\" + r )\n\tPrint( \" ~nGreen:~n\" + g )\n\tPrint( \" ~nBlue:~n\" + b )\t\n\t\nEnd\n\n\n'**************** Color Functions **************** \n\n\nFunction ARGB:UInt( a:Float, r:Float, g:Float, b:Float )\n\tAssert ( a<=1.0, \"Alpha max value is 1.0\" )\n\tAssert ( r<=1.0, \"Red max value is 1.0\" )\n\tAssert ( g<=1.0, \"Green max value is 1.0\" )\n\tAssert ( b<=1.0, \"Blue max value is 1.0\" )\n\tReturn UInt(a*255) Shl 24 | UInt(r*255) Shl 16 | UInt(g*255) Shl 8 | UInt(b*255)\nEnd\n\nFunction ARGB:UInt( a:Int, r:Int, g:Int, b:Int )\n\tAssert ( a<256, \"Alpha can't be higher than 255\" )\n\tAssert ( r<256, \"Red can't be higher than 255\" )\n\tAssert ( g<256, \"Green can't be higher than 255\" )\n\tAssert ( b<256, \"Blue can't be higher than 255\" )\n\tReturn( a Shl 24 | r Shl 16 | g Shl 8 | b )\nEnd\n\nFunction ARGBToAlpha:Int( argb:UInt )\n\tReturn argb Shr 24 & $ff\nEnd\n\nFunction ARGBToRed:Int( argb:UInt )\n\tReturn argb Shr 16 & $ff\nEnd\n\nFunction ARGBToGreen:Int( argb:UInt )\n\tReturn argb Shr 8 & $ff\nEnd\n\nFunction ARGBToBlue:Int( argb:UInt )\n\tReturn argb & $ff\nEnd\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Monkey/example.monkey",
    "content": "Strict\n\n' single line comment\n\n#rem\nmulti\nline\ncomment\n#end\n\n#rem\nnested\n#rem\nmulti\nline\n#end\ncomment\n#end\n\nImport mojo\n\nConst ONECONST:Int = 1\nConst TWOCONST := 2\nConst THREECONST := 3, FOURCONST:Int = 4\n\nGlobal someVariable:Int = 4\n\n' sample class from the documentation\nClass Game Extends App\n\n    Function New()\n    End\n\n    Function DrawSpiral(clock)\n        Local w=DeviceWidth/2\n        For Local i#=0 Until w*1.5 Step .2\n            Local x#,y#\n            x=w+i*Sin(i*3+clock)\n            y=w+i*Cos(i*2+clock)\n            DrawRect  x,y,1,1\n        Next\n        hitbox.Collide(event.pos)\n    End\n\n    Field updateCount\n\n    Method OnCreate()\n        Print \"spiral\"\n\n        SetUpdateRate 60\n    End\n\n    Method OnUpdate()\n        updateCount+=1\n    End\n\n    Method OnRender()\n        Cls\n        DrawSpiral updateCount\n        DrawSpiral updateCount*1.1\n    End\n\nEnd\n\nClass Enemy\n  Method Die () Abstract\nEnd\n\n' extending\nClass Hoodlum Extends Enemy\n    ' field\n    Field testField:Bool = True\n\n    ' naming class with modulepath\n    Local currentNode:list.Node<Vector2D>\n\n    Method Die ()\n        Print \"B'oss, he-- he killed me, b'oss!\"\n    End\nEnd\n\n' extending with generics\nClass VectorNode Extends Node<Vector2D>\nEnd\n\n' interfaces\nInterface Computer\n  Method Boot ()\n  Method Process ()\n  Method Display ()\nEnd\n\nClass PC Implements Computer\nEnd\n\n' array syntax\nGlobal listOfStuff:String[42]\nGlobal lessStuff:String[5] = listOfStuff[4..8]\nGlobal oneStuff:String = listOfStuff[23]\n\n'a comma separated sequence\nGlobal scores:Int[]=[10,20,30]\n'a comma separated sequence\nGlobal text:String[]=[\"Hello\",\"There\",\"World\"]\nGlobal worstCase:worst.List<String[]>\n\n' string type\nGlobal string1:String = \"Hello world\"\nGlobal string2$ = \"Hello world\"\n\n' escape characers in strings\nGlobal string3 := \"Hello~zWorld\"\nGlobal string4 := \"~qHello World~q\"\nGlobal string5 := \"~tIndented~n\"\nGlobal string6 := \"tilda is wavey... ~~\"\n\n' string pseudofunctions\nPrint \"  Hello World  ~n\".Trim()    ' prints \"Hello World\"\nPrint \"Hello World\".ToUpper()       ' prints \"HELLO WORLD\"\n\n' Boolean shorttype\nGlobal boolVariable1:Bool = True\nGlobal boolVariable2? = False\n\n' number formats\nGlobal hexNum1:Int = $3d0dead\nGlobal hexNum2% = $CAFEBABE\n\nGlobal floatNum1:Float = 3.141516\nGlobal floatNum2# = 3.141516\nGlobal floatNum3 := .141516\n\n' preprocessor keywords\n#If TARGET = \"android\"\nDoStuff()\n#ElseIf TARGET = \"ios\"\nDoOtherStuff()\n#End\n\n' preprocessor variable\n#SOMETHING = True\n#Print SOMETHING\n#If SOMETHING\n#End\n\n' operators\nGlobal a = 32\nGlobal b = 32 ~ 0\nb ~= 16\nb |= 16\nb &= 16\nGlobal c = a | b\n"
  },
  {
    "path": "src/test/resources/samples/langs/Monkey/example.monkey2",
    "content": "\nNamespace example\n\n#rem\nmulti\nline\ncomment\n#end\n\n#rem\nnested\n#rem\nmulti\nline\n#end\ncomment\n#end\n\n'Importing a module pre-compile in the modules folder\n#Import \"<mojo>\"\n\n'Setting search paths for namespaces\nUsing mojo..\nUsing std..\n\nConst ONECONST:Int = 1\nConst TWOCONST := 2\nConst THREECONST := 3, FOURCONST:Int = 4\n\nGlobal someVariable:Int = 4\n\nFunction Main()\n\t'creating arrays\n\tLocal scores:Int[]= New Int[](10,20,30)\n\tLocal text:String[]= New String[]( \"Hello\",\"There\",\"World\" )\n\t\n\t' string type\n\tLocal string1:String = \"Hello world\"\n\tLocal string2:= \"Hello world\"\n\t\n\t' escape characers in strings\n\tLocal string4 := \"~qHello World~q\"\n\tLocal string5 := \"~tIndented~n\"\n\tLocal string6 := \"tilde is wavey... ~~\"\n\tPrint string4\n\tPrint string5\n\tPrint string6\n\t\n\t' string pseudofunctions\n\tPrint \"       Hello World  ~n\".Trim()    ' prints \"Hello World\" whithout whitespace\n\tPrint \"Hello World\".ToUpper()               ' prints \"HELLO WORLD\"\n\n\t' preprocessor keywords\n\t#If __TARGET__ = \"android\"\n\t'DoStuff()\n\t#ElseIf __TARGET__ = \"ios\"\n\t'DoOtherStuff()\n\t#End\n\t\n\t' operators\n\tLocal a := 32\n\tLocal b := 32 ~ 0\n\tb ~= 16\n\tb |= 16\n\tb &= 16\n\tLocal c := a | b\n\tPrint c\n\t\n\t'Creates a new Window class and starts the main App loop, using the Mojo module\n\tNew AppInstance\n\tNew GameWindow\n\tApp.Run()\nEnd\n\n\n'------------------------------------------ Class Examples ------------------------------------------\n\n\n'You can extend the Window class to customize its behavior\nClass GameWindow Extends Window\n\t\n\tPrivate\n\tField _spiral :Float[]\n\tField _circle :Float[]\n\t\n\tPublic\n\tMethod New()\n\t\tSuper.New( \"Test\", 800, 600, WindowFlags.Resizable )\n\tEnd\n\t\n\t'Properties can be used to create \"read-only\" values\n\tProperty Spiral:Float[]()\n\t\tReturn _spiral\n\tEnd\n\t\n\t'Or to control what happens to a value when assigned\n\tProperty Circle:Float[]()\n\t\tReturn _circle\n\tSetter( values:Float[] )\n\t\tIf( values.Length > 2 ) And\t( values.Length Mod 2 = 0 )\n\t\t\t_circle = values\n\t\tElse\n\t\t\tPrint( \"Circle values need to be an even number larger than 1\" )\t\n\t\tEnd\n\tEnd\n\n\t'Methods require a class instance. The keyword Self is optional when accessing fields and properties\n\t'The method Window.OnRender is virtual, and can be overriden\n\t'Width and Height are Propreties inherited from the Window class\n\tMethod OnRender( canvas:Canvas ) Override\n\t\tRequestRender()\n\t\tcanvas.Clear( Color.DarkGrey )\n\t\tcanvas.Translate( Width/2.0, Height/2.0 )\n\t\tcanvas.Rotate( -Millisecs()/200.0 )\n\t\tcanvas.Color = New Color( 1, 0.8, 0.2 )\n\t\tDrawLines( canvas, Spiral )\n\t\tDrawLines( canvas, Circle, True )\n\tEnd\n\t\n\t'This method is called whenever the window layout changes, like when resizing\n\tMethod OnLayout() Override\n\t\t_spiral = CreateSpiral( 0, 0, Height/1.5, Height/1.5, 100 )\n\t\tCircle = CreateCircle( 0, 0, Height/1.5, Height/1.5, 100 )\t\n\tEnd\n\t\n\t'Functions can be called without a GameWindow instance, like \"Static Functions\" in other languages.\n\tFunction DrawLines( canvas:Canvas, lines:Float[], closedShape:Bool = False )\n\t\tFor Local n := 0 Until lines.Length Step 2\n\t\t\tLocal l := lines.Length - 3\n\t\t\tLocal x0 := lines[n]\n\t\t\tLocal y0 := lines[n+1]\n\t\t\tLocal x1 := n<l? lines[n+2] Else (closedShape? lines[0] Else x0 )    'Conditional assignment, uses the \"?\" symbol to test a condition\n\t\t\tLocal y1 := n<l? lines[n+3] Else (closedShape? lines[1] Else y0 )\n\t\t\tcanvas.DrawLine( x0, y0, x1, y1 )\n\t\tNext\n\tEnd\n\t\n\tFunction CreateSpiral:Float[]( x:Double, y:Double, width:Double, height:Double, sides:Int = 32, turns:Float = 3.0 )\n\t\tLocal stack := New Stack<Float>\n\t\tLocal radStep := (Pi*2.0)/Float(sides)\n\t\tLocal xMult := 0.0\n\t\tLocal yMult := 0.0\n\t\tLocal radiusX:Float = width/2.0\n\t\tLocal radiusY:Float = height/2.0\n\t\tLocal stepX:Float = radiusX / sides\n\t\tLocal stepY:Float = radiusY / sides\n\t\tFor Local a := 0.0 To Pi*2 Step radStep\n\t\t\tstack.Push( ( ( Sin( a*turns ) * radiusX )* xMult ) + x ) \n\t\t\tstack.Push( ( ( Cos( a*turns ) * radiusY )* yMult ) + y )\n\t\t\txMult += stepX/radiusX\n\t\t\tyMult += stepY/radiusY\n\t\tNext\n\t\tReturn stack.ToArray()\n\tEnd\n\t\n\tFunction CreateCircle:Float[]( x:Double, y:Double, width:Double, height:Double, sides:Int = 32 )\n\t\tLocal stack := New Stack<Float>\n\t\tLocal radStep := (Pi*2.0)/Float(sides)\n\t\tLocal radiusX:Float = width/2.0\n\t\tLocal radiusY:Float = height/2.0\n\t\tFor Local a := 0.0 To Pi*2 Step radStep\n\t\t\tstack.Push( ( Sin( a ) * radiusX ) + x )\n\t\t\tstack.Push( ( Cos( a ) * radiusY ) + y )\n\t\tNext\n\t\tReturn stack.ToArray()\n\tEnd\n\nEnd\n\n'--------- extending with generics -----------------------------------------------------------------------------\n\nClass MyList Extends List<Double>\nEnd\n\n'--------- interfaces ------------------------------------------------------------------------------------------\n\nInterface Computer\n  Method Boot ()\n  Method Process ()\n  Method Display ()\nEnd\n'\nClass PC Implements Computer\nEnd\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Monkey/gui.monkey2",
    "content": "#Import \"<mojo>\"\n#Import \"<mojox>\"\n\nUsing std..\nUsing mojo..\nUsing mojox..\n\nFunction Main()\n\tNew AppInstance\n\tNew TestGui\n\tApp.Run()\nEnd\n\n\nClass TestGui Extends Window\n\tField mainDock:DockingView\n\tField rgtDock:ScrollView\n\tField graphView:GraphView\n\t\n\tConst smallFont:Font = Font.Load( \"font::DejaVuSans.ttf\", 10 )\n\t\n\tMethod New()\t\t\t\t\t\n\t\tSuper.New( \"Test\", 1024, 640, WindowFlags.Resizable )\n\t\tmainDock = New MainDock()\n\t\trgtDock = New RightDock()\n\t\tmainDock.AddView( rgtDock, \"right\", \"400\", True  )\n\t\tContentView = mainDock\n\tEnd\nEnd\n\n\nClass MainDock Extends DockingView\n\tMethod New()\n\t\tLayout=\"fill\"\n\t\tLocal newStyle := Style.Copy()\n\t\tnewStyle.BackgroundColor = Color.DarkGrey\n\t\tnewStyle.BorderColor = Color.Black\n\t\tnewStyle.Font = TestGui.smallFont\n\t\tStyle = newStyle\n\tEnd\n\t\n\tMethod OnRender( canvas:Canvas ) Override\n\t\tSuper.OnRender( canvas )\n\t\tcanvas.Color = New Color( Rnd(), Rnd(), Rnd() )\n\t\tcanvas.DrawCircle( Frame.Width/4, Frame.Height/2, Frame.Height/4 )\n\t\tcanvas.Color = Color.Aluminum\n\t\tcanvas.DrawText( \"gameview:\" + App.FPS + \" fps\", 5, 5 )\n\tEnd\nEnd\n\n\n\nClass RightDock Extends ScrollView\n\tPrivate\n\tField _panSpeed := 10.0\n\t\n\tPublic\n\tMethod New()\n\t\tLayout=\"fill\"\n\t\tScrollBarsVisible = True\n\t\t\n\t\tLocal newStyle := Style.Copy()\n\t\tnewStyle.BackgroundColor = Color.Grey\n\t\tnewStyle.BorderColor = Color.Black\n\t\tnewStyle.Font = TestGui.smallFont\n\t\tStyle = newStyle\n\t\t\n\t\tLocal graph:=New GraphView\n\t\tContentView = graph\n\t\t\n\t\tScroll = New Vec2i( graph.Frame.Width/2, graph.Frame.Height/2 )\t'Doesn't work!\n\tEnd\n\t\t\n\tMethod OnRender( canvas:Canvas ) Override\n\t\tSuper.OnRender( canvas )\n\t\tcanvas.Color = Color.Aluminum\n\t\tcanvas.DrawText( \"size:\" + Frame + \" ,scroll:\" + Scroll , 5, 5 )\n\tEnd\n\t\n\tMethod OnMouseEvent( event:MouseEvent ) Override\n\t\tSelect event.Type\n\t\t\tCase EventType.MouseWheel\n\t\t\t\tScroll = New Vec2i( Scroll.X+(event.Wheel.X*_panSpeed), Scroll.Y-(event.Wheel.Y*_panSpeed) )\n\t\t\t\tApp.RequestRender()\n\t\tEnd\n\tEnd\nEnd\n\n\nClass GraphView\tExtends View\n\tPrivate\n\tField _panSpeed := 5.0\n\tField _size := New Vec2i( 1024, 1024 )\n\t\n\tPublic\n\tMethod New()\n\t\tMinSize=New Vec2i( _size.X, _size.Y )\n\tEnd\n\t\n\tMethod OnRender( canvas:Canvas ) Override\n\t\tLocal r:= 20.0\n\t\tFor Local x := 1 Until 10\n\t\t\tFor Local y := 1 Until 10\n\t\t\t\tLocal v :=  (x/10.0) -0.05\n\t\t\t\tcanvas.Color = New Color( v, v, v )\n\t\t\t\tcanvas.DrawCircle( (x*100)+r, (y*100)+r, r )\n\t\t\tNext\n\t\tNext\n\tEnd\nEnd\n\n\n\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Monkey/sorting.monkey2",
    "content": "'Showcases use of Lambda functions and Generics.\n\n#Import \"<std>\"\nUsing std..\n\nFunction Main()\n\n\tLocal testStack := New Stack< MyObject >\n\t\n\tFor Local n := 1 To 20\n\t\tLocal newItem := New MyObject\n\t\tnewItem.depth = Rnd( 0, 100 )\n\t\ttestStack.Push( newItem )\n\tNext\n\t\t\n\ttestStack.Sort( Lambda:Int( x:MyObject,y:MyObject )\n\t\tReturn x.depth<=>y.depth\n\tEnd )\n\t\n\tFor Local n := Eachin testStack\n\t\tPrint( n.depth )\n\tNext\n\t\nEnd\n\n\nStruct MyObject\n\tField depth := 0\nEnd"
  },
  {
    "path": "src/test/resources/samples/langs/Moocode/hello.moo",
    "content": "@program toy:wind\nthis.wound = this.wound + 2;\nplayer:tell(\"You wind up the \", this.name,\".\");\nplayer.location:announce(player.name, \" winds up the \", this.name,\".\");\n.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Moocode/moocode_toolkit.moo",
    "content": ";; while (read(player) != \".\") endwhile\n\nI M P O R T A N T\n=================\n\nThe following code cannot be used as is.  You will need to rewrite\nfunctionality that is not present in your server/core.  The most\nstraight-forward target (other than Stunt/Improvise) is a server/core\nthat provides a map datatype and anonymous objects.\n\nInstallation in my server uses the following object numbers:\n\n#36819 -> MOOcode Experimental Language Package\n  #36820 -> Changelog\n  #36821 -> Dictionary\n  #36822 -> MOOcode Compiler\n  #38128 -> Syntax Tree Pretty Printer\n  #37644 -> Tokenizer Prototype\n  #37645 -> Parser Prototype\n  #37648 -> Symbol Prototype\n  #37649 -> Literal Prototype\n  #37650 -> Statement Prototype\n  #37651 -> Operator Prototype\n  #37652 -> Control Flow Statement Prototype\n  #37653 -> Assignment Operator Prototype\n  #38140 -> Compound Assignment Operator Prototype\n  #38123 -> Prefix Operator Prototype\n  #37654 -> Infix Operator Prototype\n  #37655 -> Name Prototype\n  #37656 -> Bracket Operator Prototype\n  #37657 -> Brace Operator Prototype\n  #37658 -> If Statement Prototype\n  #38119 -> For Statement Prototype\n  #38120 -> Loop Statement Prototype\n  #38126 -> Fork Statement Prototype\n  #38127 -> Try Statement Prototype\n  #37659 -> Invocation Operator Prototype\n  #37660 -> Verb Selector Operator Prototype\n  #37661 -> Property Selector Operator Prototype\n  #38124 -> Error Catching Operator Prototype\n  #38122 -> Positional Symbol Prototype\n  #38141 -> From Statement Prototype\n  #37662 -> Utilities\n#36823 -> MOOcode Experimental Language Package Tests\n  #36824 -> MOOcode Compiler Tests\n  #37646 -> Tokenizer Tests\n  #37647 -> Parser Tests\n.\n\n; /* BASE */\n\n; parent($plastic.tokenizer_proto)\n\n@program _:_ensure_prototype as application/x-moocode\n(typeof(this) == OBJ) || raise(E_INVARG, \"Callable on prototypes only\");\n.\n\n@program _:_ensure_instance as application/x-moocode\n(typeof(this) == ANON) || raise(E_INVARG, \"Callable on instances only\");\n.\n\n; /* COMPILER */\n\n@program $plastic.compiler:_lookup as application/x-moocode\n$private();\n\nthis:_ensure_instance();\n\n{name} = args;\n\nif (`value = this.variable_map[name] ! E_RANGE')\n  return value;\nelseif (name in this.variable_map || name in this.reserved_names)\n  value = name;\n  while (value in this.variable_map || value in this.reserved_names)\n    value = tostr(\"_\", value);\n  endwhile\n  this.variable_map[name] = value;\n  return value;\nelse\n  value = name;\n  this.variable_map[name] = value;\n  return value;\nendif\n.\n\n@program $plastic.compiler:_generate as application/x-moocode\n$private();\n\nthis:_ensure_instance();\n\n{name} = args;\n\nif (`value = this.variable_map[name] ! E_RANGE')\n  return value;\nelse\n  value = tostr(\"_\", random());\n  while (value in this.variable_map || value in this.reserved_names)\n    value = tostr(\"_\", random());\n  endwhile\n  this.variable_map[name] = value;\n  return value;\nendif\n.\n\n@program $plastic.compiler:compile as application/x-moocode\nthis:_ensure_prototype();\n\n{source, ?options = []} = args;\n\ntokenizer = this.plastic.tokenizer_proto:create(source);\nparser = this.plastic.parser_proto:create(tokenizer);\ncompiler = create(this, 1);\n\ntry\n  statements = parser:statements();\nexcept ex (ANY)\n  return {0, {tostr(\"Line \", ex[3].tokenizer.row, \":  \", ex[2])}};\nendtry\n\nsource = {};\n\nfor statement in (statements)\n  if (statement.type != \"statement\")\n    source = {@source, tostr(compiler:p(statement), \";\")};\n  else\n    source = {@source, @compiler:p(statement)};\n  endif\nendfor\n\nreturn {1, source};\n.\n\n@program $plastic.compiler:p as application/x-moocode\nthis:_ensure_instance();\n\n{statement} = args;\n\nticks_left() < 10000 || seconds_left() < 2 && suspend(0);\n\nif (statement.type == \"variable\")\n  return this:_lookup(statement.value);\nelseif (statement.type == \"unique\")\n  return this:_generate(statement.value);\nelseif (isa(statement, this.plastic.sign_operator_proto))\n  if (statement.type == \"unary\")\n    return tostr(statement.value == \"-\" ? \"-\" | \"\", this:p(statement.first));\n  else\n    return tostr(\"(\", this:p(statement.first), \" \", statement.value, \" \", this:p(statement.second), \")\");\n  endif\n\nelseif (isa(statement, this.plastic.control_flow_statement_proto))\n  if ((first = statement.first) != 0)\n    return {tostr(statement.id, \" \" , this:p(first), \";\")};\n  else\n    return {tostr(statement.id, \";\")};\n  endif\n\nelseif (isa(statement, this.plastic.if_statement_proto))\n  value =  statement.value;\n\n  code = {tostr(\"if (\", this:p(value[1]), \")\")};\n\n  for s in (value[2])\n    if (respond_to(s, \"std\"))\n      code = {@code, @this:p(s)};\n    else\n      code = {@code, this:p(s) + \";\"};\n    endif\n  endfor\n\n  i = 3;\n  while (length(value) >= i && typeof(value[i]) != LIST)\n    code = {@code, tostr(\"elseif (\", this:p(value[i]), \")\")};\n\n    i = i + 1;\n\n    for s in (value[i])\n      if (respond_to(s, \"std\"))\n        code = {@code, @this:p(s)};\n      else\n        code = {@code, this:p(s) + \";\"};\n      endif\n    endfor\n\n    i = i + 1;\n  endwhile\n\n  if (length(value) == i)\n    code = {@code, \"else\"};\n\n    for s in (value[i])\n      if (respond_to(s, \"std\"))\n        code = {@code, @this:p(s)};\n      else\n        code = {@code, this:p(s) + \";\"};\n      endif\n    endfor\n  endif\n\n  code = {@code, \"endif\"};\n\n  return code;\n\nelseif (isa(statement, this.plastic.for_statement_proto))\n  value =  statement.value;\n\n  if (statement.subtype == \"range\")\n    code = {tostr(\"for \", this:p(value[1]), \" in [\", this:p(value[2]), \"..\", this:p(value[3]), \"]\")};\n    statements = value[4];\n  elseif (length(value) == 4)\n    code = {tostr(\"for \", this:p(value[1]), \", \", this:p(value[2]), \" in (\", this:p(value[3]), \")\")};\n    statements = value[4];\n  else\n    code = {tostr(\"for \", this:p(value[1]), \" in (\", this:p(value[2]), \")\")};\n    statements = value[3];\n  endif\n\n  for s in (statements)\n    if (respond_to(s, \"std\"))\n      code = {@code, @this:p(s)};\n    else\n      code = {@code, this:p(s) + \";\"};\n    endif\n  endfor\n\n  code = {@code, \"endfor\"};\n\n  return code;\n\nelseif (isa(statement, this.plastic.loop_statement_proto))\n  value =  statement.value;\n\n  i = 0;\n\n  if (length(value) > 2)\n    prefix = tostr(\"while \", this:p(value[i = i + 1]));\n  else\n    prefix = tostr(\"while\");\n  endif\n\n  if (statement.id == \"while\")\n    code = {tostr(prefix, \" (\", this:p(value[i = i + 1]), \")\")};\n  else\n    code = {tostr(prefix, \" (!(\", this:p(value[i = i + 1]), \"))\")};\n  endif\n\n  for s in (value[i = i + 1])\n    if (respond_to(s, \"std\"))\n      code = {@code, @this:p(s)};\n    else\n      code = {@code, this:p(s) + \";\"};\n    endif\n  endfor\n\n  code = {@code, \"endwhile\"};\n\n  return code;\n\nelseif (isa(statement, this.plastic.fork_statement_proto))\n  value =  statement.value;\n\n  i = 0;\n\n  if (length(value) > 2)\n    code = {tostr(\"fork \", this:p(value[i = i + 1]), \" (\", this:p(value[i = i + 1]), \")\")};\n  else\n    code = {tostr(\"fork\", \" (\", this:p(value[i = i + 1]), \")\")};\n  endif\n\n  for s in (value[i = i + 1])\n    if (respond_to(s, \"std\"))\n      code = {@code, @this:p(s)};\n    else\n      code = {@code, this:p(s) + \";\"};\n    endif\n  endfor\n\n  code = {@code, \"endfork\"};\n\n  return code;\n\nelseif (isa(statement, this.plastic.try_statement_proto))\n  value =  statement.value;\n\n  code = {\"try\"};\n\n  for s in (value[1])\n    if (respond_to(s, \"std\"))\n      code = {@code, @this:p(s)};\n    else\n      code = {@code, this:p(s) + \";\"};\n    endif\n  endfor\n\n  if (statement.subtype == \"finally\")\n    code = {@code, \"finally\"};\n\n    for s in (value[2])\n      if (respond_to(s, \"std\"))\n        code = {@code, @this:p(s)};\n      else\n        code = {@code, this:p(s) + \";\"};\n      endif\n    endfor\n\n  else\n    for value in (value[2..$])\n      if (length(value) == 3)\n        x = {};\n        for s in (value[2])\n          x = {@x, this:p(s)};\n        endfor\n\n        code = {@code, tostr(\"except \", this:p(value[1]), \" (\", x:join(\", \"), \")\")};\n        statements = value[3];\n\n      else\n        x = {};\n        for s in (value[1])\n          x = {@x, this:p(s)};\n        endfor\n\n        code = {@code, tostr(\"except (\", x:join(\", \"), \")\")};\n        statements = value[2];\n\n      endif\n\n      for s in (statements)\n        if (respond_to(s, \"std\"))\n          code = {@code, @this:p(s)};\n        else\n          code = {@code, this:p(s) + \";\"};\n        endif\n      endfor\n\n    endfor\n  endif\n\n  code = {@code, \"endtry\"};\n\n  return code;\n\nelseif (isa(statement, this.plastic.assignment_operator_proto))\n  if (statement.first.type == \"pattern\")\n    res = \"{\";\n    rest = 0;\n    for v in (statement.first.value)\n      if (v.type == \"unary\")\n        v = tostr(\"@\", this:p(v.first));\n      elseif (v.type == \"binary\")\n        v = tostr(\"?\", this:p(v.first), \" = \", this:p(v.second));\n      else\n        v = this:p(v);\n      endif\n      res = tostr(res, (rest ? \", \" | \"\"), v);\n      rest = 1;\n    endfor\n    res = tostr(res, \"}\");\n    return tostr(\"(\", res, \" \", statement.value, \" \", this:p(statement.second), \")\");\n  else\n    return tostr(\"(\", this:p(statement.first), \" \", statement.value, \" \", this:p(statement.second), \")\");\n  endif\n\nelseif (isa(statement, this.plastic.bracket_operator_proto))\n  if (statement.type == \"ternary\")\n    return tostr(\"(\", this:p(statement.first), \"[\", this:p(statement.second), \"..\", this:p(statement.third), \"])\");\n  elseif (statement.type == \"binary\")\n    return tostr(\"(\", this:p(statement.first), \"[\", this:p(statement.second), \"])\");\n  else\n    res = \"[\";\n    first = 1;\n    for v in (statement.value)\n      ticks_left() < 10000 || seconds_left() < 2 && suspend(0);\n      res = tostr(res, (first ? \"\" | \", \"), this:p(v[1]), \" -> \", this:p(v[2]));\n      first = 0;\n    endfor\n    res = tostr(res, \"]\");\n    return res;\n    return {res};\n  endif\n\nelseif (isa(statement, this.plastic.brace_operator_proto))\n  res = \"{\";\n  first = 1;\n  for v in (statement.value)\n    ticks_left() < 10000 || seconds_left() < 2 && suspend(0);\n    res = tostr(res, (first ? \"\" | \", \"), this:p(v));\n    first = 0;\n  endfor\n  res = tostr(res, \"}\");\n  return res;\n\nelseif (isa(statement, this.plastic.invocation_operator_proto))\n  if (statement.type == \"ternary\")\n    a = {};\n    for v in (statement.third)\n      a = {@a, this:p(v)};\n    endfor\n    if (statement.second.type == \"identifier\")\n      return tostr(this:p(statement.first), \":\", this:p(statement.second), \"(\", a:join(\", \"), \")\");\n    else\n      return tostr(this:p(statement.first), \":(\", this:p(statement.second), \")(\", a:join(\", \"), \")\");\n    endif\n  elseif (statement.type == \"binary\")\n    a = {};\n    for v in (statement.second)\n      a = {@a, this:p(v)};\n    endfor\n    return tostr(this:p(statement.first), \"(\", a:join(\", \"), \")\");\n  else\n    return tostr(this:p(statement.first));\n  endif\n\nelseif (isa(statement, this.plastic.property_selector_operator_proto))\n  if (statement.second.type == \"identifier\")\n    return tostr(this:p(statement.first), \".\", this:p(statement.second));\n  else\n    return tostr(this:p(statement.first), \".(\", this:p(statement.second) + \")\");\n  endif\n\nelseif (isa(statement, this.plastic.error_catching_operator_proto))\n  if (statement.type == \"unary\")\n    return tostr(statement.value, this:p(statement.first));\n  endif\n\n  x = {};\n  for s in (statement.second)\n    x = {@x, this:p(s)};\n  endfor\n\n  second = x:join(\", \");\n\n  if (statement.type == \"ternary\")\n    return tostr(\"`\", this:p(statement.first), \" ! \", second, \" => \", this:p(statement.third), \"'\");\n  else\n    return tostr(\"`\", this:p(statement.first), \" ! \", second, \"'\");\n  endif\n\nelseif (isa(statement, this.plastic.literal_proto))\n  return toliteral(statement.value);\nelseif (isa(statement, this.plastic.positional_symbol_proto))\n  return statement.value;\nelseif (isa(statement, this.plastic.prefix_operator_proto))\n  return tostr(statement.value, this:p(statement.first));\nelseif (isa(statement, this.plastic.infix_operator_proto))\n  value = statement.value;\n  value = (value != \"**\") ? value | \"^\";\n  return tostr(\"(\", this:p(statement.first), \" \", value, \" \", this:p(statement.second), \")\");\nelseif (isa(statement, this.plastic.traditional_ternary_operator_proto))\n  return tostr(\"(\", this:p(statement.first), \" ? \", this:p(statement.second), \" | \", this:p(statement.third), \")\");\nelseif (isa(statement, this.plastic.name_proto))\n  return statement.value;\nelse\n  raise(E_INVARG);\nendif\n.\n\n; /* PRINTER */\n\n@program $plastic.printer:_print as application/x-moocode\n{statement, ?indent = \"\"} = args;\n\nif (typeof(statement) == LIST)\n  result = {tostr(indent, \"-\")};\n\n  for item in (statement)\n    result = {@result, @this:_print(item, indent + \"  \")};\n  endfor\n\n  return result;\nendif\n\nif (`typeof(statement.value) == LIST ! ANY')\n  result = {tostr(indent, statement.id, \" : \", statement.type)};\n\n  for value in (statement.value)\n    result = {@result, @this:_print(value, indent + \"  \")};\n  endfor\nelse\n  result = {tostr(indent, typeof(statement.value) == ERR ? toliteral(statement.value) | statement.value, \" : \", statement.type)};\n\n  for prop in ({\"first\", \"second\", \"third\"})\n    if (`value = statement.(prop) ! E_PROPNF' != E_PROPNF && value != 0)\n      result = {@result, @this:_print(value, indent + \"  \")};\n    endif\n  endfor\nendif\n\nreturn result;\n.\n\n@program $plastic.printer:print as application/x-moocode\n{source, ?options = []} = args;\n\ntokenizer = this.plastic.tokenizer_proto:create(source);\nparser = this.plastic.parser_proto:create(tokenizer);\n\nstatements = parser:statements();\n\nsource = {};\n\nfor statement in (statements)\n  source = {@source, @this:_print(statement)};\nendfor\n\nreturn source;\n.\n\n; /* TOKENIZER */\n\n@program $plastic.tokenizer_proto:create as application/x-moocode\nthis:_ensure_prototype();\n\ninstance = create(this, 1);\n\ninstance.row = 1;\ninstance.column = 1;\ninstance.source = (length(args) == 1 && typeof(args[1]) == LIST) ? args[1] | args;\n\nreturn instance;\n.\n\n@program $plastic.tokenizer_proto:advance as application/x-moocode\nthis:_ensure_instance();\n\nthis.token = 0;\n\nif (!this.source)\n  return this;\nendif\n\nrow = this.row;\ncolumn = this.column;\nsource = this.source;\n\neol = 0;\nblock_comment = 0;\ninline_comment = 0;\n\nwhile loop (length(source) >= row)\n\n  if (column > (len = length(source[row])))\n    eol = 1;\n    inline_comment = 0;\n    row = row + 1;\n    column = 1;\n    continue loop;\n  endif\n\n  next_two = len > column ? source[row][column..column + 1] | \"\";\n\n  if (block_comment && next_two == \"*/\")\n    block_comment = 0;\n    column = column + 2;\n    continue loop;\n  elseif (next_two == \"/*\")\n    block_comment = 1;\n    column = column + 2;\n    continue loop;\n  elseif (next_two == \"//\")\n    inline_comment = 1;\n    column = column + 2;\n    continue loop;\n  endif\n\n  if (block_comment || inline_comment)\n    column = column + 1;\n    continue loop;\n  endif\n\n  if (len >= column && ((c = source[row][column]) == \"      \" || c == \" \"))\n    column = column + 1;\n    continue loop;\n  endif\n\n  if (this.token)\n    this.token[\"eol\"] = eol;\n    eol = 0;\n    break loop;\n  endif\n\n  if (`c = source[row][column] ! E_RANGE')\n\n    /* name and error */\n    /* MOO error literals look like names but they're not.  Worse, a\n     * valid error like E_PERM is treated like a literal, while an\n     * invalid error like E_FOO is treated like a variable.  Any name\n     * that starts with the characters \"E_\" is *now* an error literal,\n     * but invalid errors are errors.\n     */\n    if ((c >= \"a\" && c <= \"z\") || c == \"_\" || c == \"$\")\n      col1 = column; /* mark the start */\n      column = column + 1;\n      while (`c = source[row][column] ! E_RANGE')\n        if ((c >= \"a\" && c <= \"z\") || (c >= \"0\" && c <= \"9\") || c == \"_\")\n          column = column + 1;\n        else\n          break;\n        endif\n      endwhile\n      col2 = column - 1;\n      chars = source[row][col1..col2];\n      if (index(chars, \"E_\") == 1)\n        try\n          this.token = [\"type\" -> \"error\", \"value\" -> this.errors[chars]];\n        except ex (E_RANGE)\n          this.token = [\"type\" -> \"error\", \"value\" -> chars, \"error\" -> tostr(\"Invalid error: \", chars)];\n        endtry\n      else\n        this.token = [\"type\" -> \"name\", \"value\" -> chars];\n      endif\n      continue loop;\n\n    /* object number */\n    elseif (c == \"#\")\n      col1 = column; /* mark the start */\n      column = column + 1;\n      if (`c = source[row][column] ! E_RANGE')\n        if (c == \"+\" || c == \"-\")\n          column = column + 1;\n        endif\n      endif\n      while (`c = source[row][column] ! E_RANGE')\n        if (c >= \"0\" && c <= \"9\")\n          column = column + 1;\n        else\n          break;\n        endif\n      endwhile\n      col2 = column - 1;\n      chars = source[row][col1..col2];\n      if (chars[$] < \"0\" || chars[$] > \"9\")\n        this.token = [\"type\" -> \"object\", \"value\" -> chars, \"error\" -> \"Bad object number\"];\n      elseif (c >= \"a\" && c <= \"z\")\n        this.token = [\"type\" -> \"object\", \"value\" -> chars + c, \"error\" -> \"Bad object number\"];\n      else\n        this.token = [\"type\" -> \"object\", \"value\" -> toobj(chars)];\n      endif\n      continue loop;\n\n    /* number */\n    elseif (c >= \"0\" && c <= \"9\")\n      float = 0;\n      col1 = column; /* mark the start */\n      column = column + 1;\n      while (`c = source[row][column] ! E_RANGE')\n        if (c >= \"0\" && c <= \"9\")\n          column = column + 1;\n        else\n          break;\n        endif\n      endwhile\n      if (c == \".\" && ((cc = `source[row][column + 1] ! E_RANGE') != \".\")) /* not `..' */\n        float = 1;\n        column = column + 1;\n        while (`c = source[row][column] ! E_RANGE')\n          if (c >= \"0\" && c <= \"9\")\n            column = column + 1;\n          else\n            break;\n          endif\n        endwhile\n      endif\n      if (c == \"e\")\n        float = 1;\n        column = column + 1;\n        if (`c = source[row][column] ! E_RANGE' && c in {\"-\", \"+\"})\n          column = column + 1;\n        endif\n        while (`c = source[row][column] ! E_RANGE')\n          if (c >= \"0\" && c <= \"9\")\n            column = column + 1;\n          else\n            break;\n          endif\n        endwhile\n      endif\n      col2 = column - 1;\n      chars = source[row][col1..col2];\n      if ((chars[$] < \"0\" || chars[$] > \"9\") && chars[$] != \".\")\n        this.token = [\"type\" -> \"number\", \"value\" -> chars, \"error\" -> \"Bad number\"];\n      elseif (c >= \"a\" && c <= \"z\")\n        this.token = [\"type\" -> \"number\", \"value\" -> chars + c, \"error\" -> \"Bad number\"];\n      else\n        this.token = [\"type\" -> \"number\", \"value\" -> float ? tofloat(chars) | toint(chars)];\n      endif\n      continue loop;\n\n    /* string */\n    elseif (c == \"\\\"\" || c == \"'\")\n      esc = 0;\n      chars = \"\";\n      q = c;\n      col1 = column; /* mark the start */\n      column = column + 1;\n      while (`c = source[row][column] ! E_RANGE' && (c != q || esc))\n        column = column + 1;\n        if (c != \"\\\\\" || esc)\n          chars = tostr(chars, c);\n          esc = 0;\n        else\n          esc = 1;\n        endif\n      endwhile\n      column = column + 1;\n      col2 = column - 1;\n      if (c != q)\n        this.token = [\"type\" -> \"string\", \"value\" -> source[row][col1..col2 - 1], \"error\" -> \"Unterminated string\"];\n        continue loop;\n      else\n        this.token = [\"type\" -> \"string\", \"value\" -> chars];\n        continue loop;\n      endif\n\n    /* possible multi-character operator */\n    elseif (index(\"-+<>=*/%!|&.\", c))\n      col1 = column; /* mark the start */\n      column = column + 1;\n      if (`c = source[row][column] ! E_RANGE' && index(\">=*!|&.\", c))\n        column = column + 1;\n        this.token = [\"type\" -> \"operator\", \"value\" -> source[row][col1..column - 1]];\n        continue loop;\n      else\n        this.token = [\"type\" -> \"operator\", \"value\" -> source[row][col1]];\n        continue loop;\n      endif\n\n    /* operator */\n    else\n      column = column + 1;\n      this.token = [\"type\" -> \"operator\", \"value\" -> c];\n      continue loop;\n\n    endif\n\n    column = column + 1;\n  endif\nendwhile\n\nthis.row = row;\nthis.column = column;\nthis.source = source;\n\n/* check for unterminated comment */\nif (block_comment)\n  this.token = [\"type\" -> \"comment\", \"value\" -> \"\", \"error\" -> \"Unterminated comment\"];\nendif\n\n/* dollar sign by itself is not a name */\nif (this.token && this.token[\"type\"] == \"name\" && this.token[\"value\"] == \"$\")\n  this.token[\"type\"] = \"operator\";\nendif\n\n/* catch the last token */\nif (row > length(source) && this.token)\n  this.token[\"eol\"] = 1;\nendif\n\nreturn this;\n.\n\n@program $plastic.tokenizer_proto:token as application/x-moocode\nthis:_ensure_instance();\n\nreturn this.token;\n.\n\n; /* PARSER */\n\n@program $plastic.parser_proto:create as application/x-moocode\nthis:_ensure_prototype();\n\n{tokenizer, @options} = args;\n\ninstance = create(this, 1);\ninstance.tokenizer = tokenizer;\ninstance.symbols = [];\n\nplastic = this.plastic;\n\n/* `(end)' is required */\ninstance:symbol(\"(end)\");\ninstance:symbol(\"(name)\", 0, plastic.name_proto);\ninstance:symbol(\"(literal)\", 0, plastic.literal_proto);\ninstance:symbol(\";\", 0, plastic.operator_proto);\ninstance:symbol(\",\", 0, plastic.operator_proto);\ninstance:symbol(\"]\", 0, plastic.operator_proto);\ninstance:symbol(\"}\", 0, plastic.operator_proto);\ninstance:symbol(\"->\", 0, plastic.operator_proto);\ninstance:symbol(\"=>\", 0, plastic.operator_proto);\ninstance:symbol(\"..\", 0, plastic.operator_proto);\ninstance:symbol(\"|\", 0, plastic.operator_proto);\ninstance:symbol(\"`\", 0, plastic.operator_proto);\ninstance:symbol(\"!\", 0, plastic.prefix_operator_proto);\ninstance:symbol(\"!!\", 50, plastic.error_catching_operator_proto);\ninstance:symbol(\"=\", 100, plastic.assignment_operator_proto);\ninstance:symbol(\"+=\", 100, plastic.compound_assignment_operator_proto);\ninstance:symbol(\"-=\", 100, plastic.compound_assignment_operator_proto);\ninstance:symbol(\"*=\", 100, plastic.compound_assignment_operator_proto);\ninstance:symbol(\"/=\", 100, plastic.compound_assignment_operator_proto);\ninstance:symbol(\"%=\", 100, plastic.compound_assignment_operator_proto);\ninstance:symbol(\"?\", 200, plastic.traditional_ternary_operator_proto);\ninstance:symbol(\"&&\", 300, plastic.infix_operator_proto, [\"right\" -> 1]);\ninstance:symbol(\"||\", 300, plastic.infix_operator_proto, [\"right\" -> 1]);\ninstance:symbol(\"!=\", 400, plastic.infix_operator_proto);\ninstance:symbol(\"==\", 400, plastic.infix_operator_proto);\ninstance:symbol(\"<\", 400, plastic.infix_operator_proto);\ninstance:symbol(\"<=\", 400, plastic.infix_operator_proto);\ninstance:symbol(\">\", 400, plastic.infix_operator_proto);\ninstance:symbol(\">=\", 400, plastic.infix_operator_proto);\ninstance:symbol(\"in\", 400, plastic.infix_operator_proto);\ninstance:symbol(\"+\", 500, plastic.sign_operator_proto);\ninstance:symbol(\"-\", 500, plastic.sign_operator_proto);\ninstance:symbol(\"*\", 600, plastic.infix_operator_proto);\ninstance:symbol(\"/\", 600, plastic.infix_operator_proto);\ninstance:symbol(\"%\", 600, plastic.infix_operator_proto);\ninstance:symbol(\"**\", 650, plastic.infix_operator_proto);\ninstance:symbol(\"[\", 800, plastic.bracket_operator_proto);\ninstance:symbol(\"{\", 0, plastic.brace_operator_proto); /* never bind left */\ninstance:symbol(\"return\", 0, plastic.control_flow_statement_proto);\ninstance:symbol(\"break\", 0, plastic.control_flow_statement_proto);\ninstance:symbol(\"continue\", 0, plastic.control_flow_statement_proto);\ninstance:symbol(\"if\", 0, plastic.if_statement_proto);\ninstance:symbol(\"for\", 0, plastic.for_statement_proto);\ninstance:symbol(\"while\", 0, plastic.loop_statement_proto);\ninstance:symbol(\"until\", 0, plastic.loop_statement_proto);\ninstance:symbol(\"fork\", 0, plastic.fork_statement_proto);\ninstance:symbol(\"try\", 0, plastic.try_statement_proto);\ninstance:symbol(\"from\", 0, plastic.from_statement_proto);\ninstance:symbol(\":\", 800, plastic.verb_selector_operator_proto);\ninstance:symbol(\".\", 800, plastic.property_selector_operator_proto);\n/* the infix form is function/verb invocation */\ninstance:symbol(\"(\", 800, plastic.invocation_operator_proto);\ninstance:symbol(\")\", 0, plastic.operator_proto);\n\nreturn instance;\n.\n\n@program $plastic.parser_proto:symbol as application/x-moocode\nthis:_ensure_instance();\n\n{id, ?bp = 0, ?proto = $nothing, ?options = []} = args;\n\nproto = valid(proto) ? proto | this.plastic.symbol_proto;\n\nif ((symbol = `this.symbols[id] ! E_RANGE') == E_RANGE)\n  symbol = proto:create(id, bp, options);\nendif\n\nthis.symbols[id] = symbol;\n\nreturn symbol;\n.\n\n@program $plastic.parser_proto:reserve_statement as application/x-moocode\nthis:_ensure_instance();\n\n{symbol} = args;\n\nid = symbol.id;\n\n/* raise error if this symbol is not a name, statement or keyword */\nif ((type = this.symbols[id].type) != \"name\" && type != \"statement\" && type != \"keyword\")\n  an_or_a = index(\"aeiou\", type[1]) ? \"an\" | \"a\";\n  raise(\"Syntax error\", tostr(\"`\", id, \"' is \", an_or_a, \" \", type), this);\nendif\n\nsymbol.reserved = 1;\nsymbol.type = verb[9..$];\n\nthis.symbols[id] = symbol;\n.\n\n@program $plastic.parser_proto:make_identifier as application/x-moocode\nthis:_ensure_instance();\n\n{symbol} = args;\n\nid = symbol.id;\n\n/* raise error if this symbol is reserved */\nif (this.symbols[id].reserved)\n  raise(\"Syntax error\", tostr(\"`\", id, \"' is reserved\"), this);\nendif\n\nsymbol.reserved = 0;\nsymbol.type = verb[6..$];\n\nthis.symbols[id] = symbol;\n.\n\n@program $plastic.parser_proto:token as application/x-moocode\nthis:_ensure_instance();\n\n{?ttid = 0} = args;\n\nif (this.token == 0)\n  this.tokenizer:advance();\n  token = this.tokenizer.token;\n  if (token)\n    type = token[\"type\"];\n    value = token[\"value\"];\n    eol = token[\"eol\"];\n    if (`token[\"error\"] ! E_RANGE')\n      raise(\"Syntax error\", token[\"error\"], this);\n    elseif (type == \"number\" || type == \"string\" || type == \"object\" || type == \"error\")\n      symbol = this:symbol(\"(literal)\");\n      this.token = symbol:clone();\n      this.token.type = type;\n      this.token.value = value;\n      this.token.eol = eol;\n    elseif (type == \"operator\")\n      /* Update the symbol table itself and give the operator the\n       * initial type \"operator\" (the type will change to \"unary\",\n       * \"binary\" or \"ternary\" when we learn how this symbol is used in\n       * the program).\n       */\n      /* check the symbol table */\n      if ((symbol = `this.symbols[value] ! E_RANGE') == E_RANGE)\n        raise(\"Syntax error\", tostr(\"Unknown operator:  `\", value, \"'\"), this);\n      endif\n      this.token = symbol:clone();\n      this.token.type = \"operator\";\n      this.token.value = value;\n      this.token.eol = eol;\n    elseif (type == \"name\")\n      /* Update the symbol table itself and give the name the initial\n       * type \"name\" (the type will change to \"variable\", \"identifier\",\n       * \"statement\" or \"keyword\" when we learn how this symbol is used\n       * in the program).\n       */\n      id = value;\n      /* peek into the symbol table */\n      if ((symbol = `this.symbols[id] ! E_RANGE') != E_RANGE)\n        this.token = symbol:clone();\n        this.symbols[id] = this.token;\n        this.token.type = symbol.type || \"name\";\n        this.token.id = id;\n        this.token.value = value;\n        this.token.eol = eol;\n      else\n        symbol = this:symbol(\"(name)\");\n        this.token = symbol:clone();\n        this.symbols[id] = this.token;\n        this.token.type = \"name\";\n        this.token.id = id;\n        this.token.value = value;\n        this.token.eol = eol;\n      endif\n    else\n      raise(\"Syntax error\", \"Unexpected token\", this);\n    endif\n  else\n    symbol = this:symbol(\"(end)\");\n    this.token = symbol:clone();\n  endif\nendif\n\nif (ttid)\n  this:advance(ttid);\nendif\n\nreturn this.token;\n.\n\n@program $plastic.parser_proto:advance as application/x-moocode\nthis:_ensure_instance();\n\n{?id = 0} = args;\n\n/* raise error if token doesn't match expectation */\nif (id && this.token != 0 && this.token.id != id)\n  raise(\"Syntax error\", tostr(\"Expected `\", id, \"'\"), this);\nendif\n\nthis.token = 0;\n\nreturn this;\n.\n\n@program $plastic.parser_proto:expression as application/x-moocode\nthis:_ensure_instance();\n\n{?bp = 0} = args;\n\ntoken = this:token();\nthis:advance();\n\n/* don't call `nud()' and/or `led()' on `(end)' */\nif (token.id == \"(end)\")\n  return token;\nendif\n\nleft = token:nud(this);\n\nwhile (bp < this:token().bp)\n  this.plastic.utilities:suspend_if_necessary();\n\n  token = this:token();\n  this:advance();\n  left = token:led(this, left);\nendwhile\n\nreturn left;\n.\n\n@program $plastic.parser_proto:statement as application/x-moocode\nthis:_ensure_instance();\n\ntoken = this:token();\n\n/* disregarded naked semicolons */\nwhile (token.id == \";\")\n  this:advance();\n  token = this:token();\nendwhile\n\n/* either the beginning of a statement */\n/* or an expression with an optional semicolon */\nif (respond_to(token, \"std\"))\n  this:advance();\n  return token:std(this);\nelse\n  expression = this:expression();\n  if (this:token().id == \";\")\n    this:advance();\n  endif\n  return expression;\nendif\n.\n\n@program $plastic.parser_proto:statements as application/x-moocode\nthis:_ensure_instance();\n\nterminals = args;\n\nstatements = {};\n\nwhile (1)\n  this.plastic.utilities:suspend_if_necessary();\n\n  token = this:token();\n  if (token.id == \"(end)\" || ((token.type in {\"name\", \"statement\", \"keyword\"}) && token.value in terminals))\n    break;\n  endif\n  statement = this:statement();\n  if (statement.id == \"(end)\")\n    break;\n  endif\n  statements = {@statements, statement};\nendwhile\n\nreturn statements;\n.\n\n@program $plastic.parser_proto:parse_all as application/x-moocode\nthis:_ensure_instance();\n\n/* This is the API entry-point for clients that want to turn a\n * stream of tokens into a syntax tree and to return it for further\n * modification, changing ownership to the client in the process.\n * Assumes \"change owner\" permission has been granted by the\n * caller.\n */\n\nstack = statements = this:statements();\n\nwhile (stack)\n  this.plastic.utilities:suspend_if_necessary();\n  {top, @stack} = stack;\n  stack = {@stack, @this.plastic.utilities:children(top)};\n  if (typeof(top) == ANON && isa(top, this.plastic.symbol_proto))\n    this.object_utilities:change_owner(top, caller_perms());\n  endif\nendwhile\n\nreturn statements;\n.\n\n@program $plastic.parser_proto:push as application/x-moocode\nthis:_ensure_instance();\n\ndefinition = args;\n{id, @rest} = definition;\n\nnew = 0;\n\nif (`this.symbols[id] ! E_RANGE' == E_RANGE)\n  this:symbol(@definition);\n  new = 1;\nendif\n\nreturn {new, id};\n.\n\n@program $plastic.parser_proto:pop as application/x-moocode\nthis:_ensure_instance();\n\n{args} = args;\n{new, id} = args;\n\nif (new)\n  this.symbols = this.symbols:delete(id);\nendif\n.\n\n\n; /* UTILITIES */\n\n@program $plastic.utilities:suspend_if_necessary as application/x-moocode\n(ticks_left() < 10000 || seconds_left() < 2) && suspend(0);\n.\n\n@program $plastic.utilities:parse_map_sequence as application/x-moocode\n{parser, separator, infix, terminator, ?symbols = {}} = args;\n\nids = {};\nfor symbol in (symbols)\n  ids = {@ids, parser:push(@symbol)};\nendfor\n\nif (terminator && parser:token().id == terminator)\n  return {};\nendif\n\nkey = parser:expression(0);\nparser:advance(infix);\nvalue = parser:expression(0);\nmap = {{key, value}};\n\nwhile (parser:token().id == separator)\n  this:suspend_if_necessary();\n  map && parser:advance(separator);\n  key = parser:expression(0);\n  parser:advance(infix);\n  value = parser:expression(0);\n  map = {@map, {key, value}};\nendwhile\n\nfor id in (ids)\n  parser:pop(id);\nendfor\n\nreturn map;\n.\n\n@program $plastic.utilities:parse_list_sequence as application/x-moocode\n{parser, separator, terminator, ?symbols = \"defaults\"} = args;\n\n/* enable defaults */\nif (symbols && symbols == \"defaults\")\n  symbols = {{\"@\", 0, this.plastic.prefix_operator_proto}};\nendif\n\nids = {};\nfor symbol in (symbols)\n  ids = {@ids, parser:push(@symbol)};\nendfor\n\nif (terminator && parser:token().id == terminator)\n  return {};\nendif\n\nexpression = parser:expression(0);\nlist = {expression};\n\nwhile (parser:token().id == separator)\n  this:suspend_if_necessary();\n  parser:advance(separator);\n  expression = parser:expression(0);\n  list = {@list, expression};\nendwhile\n\nfor id in (ids)\n  parser:pop(id);\nendfor\n\nreturn list;\n.\n\n@program $plastic.utilities:validate_scattering_pattern as application/x-moocode\n{parser, pattern} = args;\n\nstate = 1;\n\nfor element in (pattern)\n  if (state == 1 && element.type == \"variable\")\n    continue;\n  elseif ((state == 1 || state == 2) && element.type == \"binary\" && element.id == \"=\")\n    if (element.first.type == \"variable\")\n      state = 2;\n      continue;\n    endif\n  elseif ((state == 1 || state == 2) && element.type == \"unary\" && element.id == \"@\")\n    if (element.first.type == \"variable\")\n      state = 3;\n      continue;\n    endif\n  endif\n\n  raise(\"Syntax error\", \"Illegal scattering pattern\", parser);\nendfor\n.\n\n@program $plastic.utilities:children as application/x-moocode\n{node} = args;\n\n/* Intelligently gather children from various places.\n */\n\nif (typeof(node) == LIST)\n  return node;\nelseif (`typeof(value = node.value) == LIST ! ANY')\n  return value;\nelse\n  children = {};\n  for prop in ({\"first\", \"second\", \"third\"})\n    if (`value = node.(prop) ! E_PROPNF => 0' != 0)\n      children = {@children, value};\n    endif\n  endfor\n  return children;\nendif\n.\n\n@program $plastic.utilities:match as application/x-moocode\n{root, pattern} = args;\n\n/* Pattern is a map.  The keys specify the properties (`id', `type',\n * etc.) to match on.  The values specify the property values for the\n * match comparison.  Conducts a depth first search for pattern.\n */\n\nkeys = pattern:keys();\nmatches = {};\nstack = {root};\n\nwhile next (stack)\n  this:suspend_if_necessary();\n  {top, @stack} = stack;\n  stack = {@stack, @this:children(top)};\n  if (typeof(top) == ANON && isa(top, this.plastic.symbol_proto))\n    for key in (keys)\n      if (top.(key) != pattern[key])\n        continue next;\n      endif\n    endfor\n    matches = {@matches, top};\n  endif\nendwhile\n\nreturn matches;\n.\n\n\n@program $plastic.symbol_proto:create as application/x-moocode\n{id, ?bp = 0, ?opts = []} = args;\n(typeof(this) == OBJ) || raise(E_PERM, \"Call not allowed on anonymous object\");\ninstance = create(this, 1);\ninstance.id = id;\ninstance.value = id;\ninstance.bp = bp;\nfor v, k in (opts)\n  if (k in {\"id\", \"type\", \"bp\", \"right\"})\n    instance.(k) = v;\n  endif\nendfor\nreturn instance;\n.\n\n@program $plastic.symbol_proto:clone as application/x-moocode\n(typeof(this) == OBJ) && raise(E_PERM, \"Call not allowed on permanent object\");\nparents = parents(this);\ninstance = create(parents, 1);\nfor ancestor in (ancestors(this))\n  for property in (`properties(ancestor) ! E_PERM => {}')\n    instance.(property) = this.(property);\n  endfor\nendfor\nreturn instance;\n.\n\n@program $plastic.symbol_proto:nud as application/x-moocode\n{parser} = args;\nraise(\"Syntax error\", tostr(\"Undefined: \", this.id), parser);\n.\n\n@program $plastic.symbol_proto:led as application/x-moocode\n{parser, _} = args;\nraise(\"Syntax error\", tostr(\"Missing operator: \", this.id), parser);\n.\n\n\n@program $plastic.literal_proto:nud as application/x-moocode\nreturn this;\n.\n\n\n@program $plastic.positional_symbol_proto:nud as application/x-moocode\nreturn this;\n.\n\n\n@program $plastic.prefix_operator_proto:nud as application/x-moocode\n{parser} = args;\n\nfirst = parser:expression(700);\n\nif (first.id == \"(end)\")\n  raise(\"Syntax error\", \"Expected an expression\", parser);\nendif\n\nthis.type = \"unary\";\nthis.first = first;\n\nreturn this;\n.\n\n\n@program $plastic.infix_operator_proto:led as application/x-moocode\n{parser, first} = args;\n\nright = this.right && 1; /* does this operator associate to the right? */\n\nsecond = parser:expression(this.bp - right);\n\nif (second.id == \"(end)\")\n  raise(\"Syntax error\", \"Expected an expression\", parser);\nendif\n\nthis.type = \"binary\";\nthis.first = first;\nthis.second = second;\n\nreturn this;\n.\n\n\n@program $plastic.sign_operator_proto:nud as application/x-moocode\n{parser} = args;\n\nfirst = parser:expression(700);\n\nif (first.id == \"(end)\")\n  raise(\"Syntax error\", \"Expected an expression\", parser);\nendif\n\nthis.type = \"unary\";\nthis.first = first;\n\nreturn this;\n.\n\n@program $plastic.sign_operator_proto:led as application/x-moocode\n{parser, first} = args;\n\nsecond = parser:expression(this.bp);\n\nif (second.id == \"(end)\")\n  raise(\"Syntax error\", \"Expected an expression\", parser);\nendif\n\nthis.type = \"binary\";\nthis.first = first;\nthis.second = second;\n\nreturn this;\n.\n\n\n@program $plastic.statement_proto:std as application/x-moocode\n{parser} = args;\nraise(\"Syntax error\", \"Undefined\", parser);\n.\n\n\n\n@program $plastic.control_flow_statement_proto:std as application/x-moocode\n{parser} = args;\n\nif (this.id != \"return\" && parser.loop_depth < 1)\n  raise(\"Syntax error\", tostr(\"No enclosing loop for \", this.id), parser);\nendif\n\n/* update the symbol table */\nparser:reserve_statement(this);\n\nif (!this.eol && parser:token().id != \";\")\n  expression = parser:expression(0);\n  this.first = expression;\nendif\n\nif (this.id != \"return\" && this.first != 0)\n  if (this.first.type != \"variable\")\n    raise(\"Syntax error\", \"Loop name must be a name\", parser);\n  endif\n  if (!(this.first.value in parser.loop_variables))\n    raise(\"Syntax error\", tostr(\"Invalid loop name for \", this.id), parser);\n  endif\nendif\n\nif (parser:token().id == \";\")\n  parser:advance(\";\");\nendif\n\nreturn this;\n.\n\n\n@program $plastic.if_statement_proto:std as application/x-moocode\n{parser} = args;\n\n/* update the symbol table */\nparser:reserve_statement(this);\n\na = {};\n\n/* the predicate */\nparser:token(\"(\");\nexpression = parser:expression(0);\na = {@a, expression};\nparser:token(\")\");\n\n/* the consequent */\nstatements = parser:statements(\"elseif\", \"else\", \"endif\", \"end\");\na = {@a, statements};\n\n/* the alternatives */\nwhile (parser:token().id == \"elseif\")\n  parser:advance(\"elseif\");\n\n  /* predicate */\n  parser:token(\"(\");\n  expression = parser:expression(0);\n  a = {@a, expression};\n  parser:token(\")\");\n\n  /* consequent */\n  statements = parser:statements(\"elseif\", \"else\", \"endif\", \"end\");\n  a = {@a, statements};\n\n  /* update the symbol table */\n  symbol = parser.symbols[\"elseif\"];\n  parser:reserve_keyword(symbol);\nendwhile\n\n/* the final alternative */\nif (parser:token().id == \"else\")\n  parser:advance(\"else\");\n\n  statements = parser:statements(\"endif\", \"end\");\n  a = {@a, statements};\n\n  /* update the symbol table */\n  symbol = parser.symbols[\"else\"];\n  parser:reserve_keyword(symbol);\nendif\n\n/* the last token must be \"endif\" or \"end\" */\nif ((id = parser:token().id) == \"endif\")\n  parser:advance(\"endif\");\nelse\n  parser:advance(\"end\");\nendif\n\n/* update the symbol table */\nsymbol = parser.symbols[id];\nparser:reserve_keyword(symbol);\n\n/* store the parts in this token's `value' */\nthis.value = a;\n\nreturn this;\n.\n\n\n@program $plastic.for_statement_proto:std as application/x-moocode\n{parser} = args;\n\n/* update the symbol table */\nparser:reserve_statement(this);\n\na = {};\n\n/* the index(s) */\nvariables = {};\n\nvariable = parser:token();\nparser:make_variable(variable);\nparser:advance();\nvariables = {@variables, variable};\n\nif (parser:token().id == \",\")\n  while (parser:token().id == \",\")\n    parser:advance(\",\");\n    variable = parser:token();\n    parser:make_variable(variable);\n    parser:advance();\n    variables = {@variables, variable};\n  endwhile\nelseif (parser:token().id == \"->\")\n  while (parser:token().id == \"->\")\n    parser:advance(\"->\");\n    variable = parser:token();\n    parser:make_variable(variable);\n    parser:advance();\n    variables = {variable, @variables};\n  endwhile\nendif\n\na = {@a, @variables};\n\nfor _, i in (variables)\n  variables[i] = variables[i].id;\nendfor\n\nparser:token(\"in\");\n\n/* update the symbol table */\nsymbol = parser.symbols[\"in\"];\nparser:reserve_keyword(symbol);\n\n/* could be a range or a collection */\nif (parser:token().id == \"[\")\n  /* range */\n  this.subtype = \"range\";\n  length(a) < 2 || raise(\"Syntax error\", \"Too many loop variables\", parser);\n  parser:token(\"[\");\n  first = parser:expression(0);\n  a = {@a, first};\n  parser:token(\"..\");\n  second = parser:expression(0);\n  a = {@a, second};\n  parser:token(\"]\");\nelse\n  /* collection */\n  this.subtype = \"collection\";\n  length(a) < 3 || raise(\"Syntax error\", \"Too many loop variables\", parser);\n  parser:token(\"(\");\n  expression = parser:expression(0);\n  a = {@a, expression};\n  parser:token(\")\");\nendif\n\n/* the body */\nparser.loop_variables = {@parser.loop_variables, @variables};\nparser.loop_depth = parser.loop_depth + 1;\n\nstatements = parser:statements(\"endfor\", \"end\");\na = {@a, statements};\n\nl = length(variables);\nparser.loop_variables = parser.loop_variables[1..$ - l];\nparser.loop_depth = parser.loop_depth - 1;\n\n/* the last token must be \"endfor\" or \"end\" */\nif ((id = parser:token().id) == \"endfor\")\n  parser:advance(\"endfor\");\nelse\n  parser:advance(\"end\");\nendif\n\n/* update the symbol table */\nsymbol = parser.symbols[id];\nparser:reserve_keyword(symbol);\n\n/* store the parts in this token's `value' */\nthis.value = a;\n\nreturn this;\n.\n\n\n@program $plastic.loop_statement_proto:std as application/x-moocode\n{parser} = args;\n\n/* update the symbol table */\nparser:reserve_statement(this);\n\nend = tostr(\"end\", this.id);\n\na = {};\n\n/* possible, optional loop name */\nvariables = {};\nif ((type = parser:token().type) == \"variable\" || type == \"name\")\n  variable = parser:token();\n  parser:make_variable(variable);\n  parser:advance();\n  variables = {@variables, variable.id};\n  a = {@a, variable};\nendif\n\n/* the condition */\nparser:token(\"(\");\nexpression = parser:expression(0);\na = {@a, expression};\nparser:token(\")\");\n\n/* the body */\nparser.loop_variables = {@parser.loop_variables, @variables};\nparser.loop_depth = parser.loop_depth + 1;\n\nstatements = parser:statements(end, \"end\");\na = {@a, statements};\n\nl = length(variables);\nparser.loop_variables = parser.loop_variables[1..$ - l];\nparser.loop_depth = parser.loop_depth - 1;\n\n/* the last token must be \"endwhile/enduntil\" or \"end\" */\nif ((id = parser:token().id) == end)\n  parser:advance(end);\nelse\n  parser:advance(\"end\");\nendif\n\n/* update the symbol table */\nsymbol = parser.symbols[id];\nparser:reserve_keyword(symbol);\n\n/* store the parts in this token's `value' */\nthis.value = a;\n\nreturn this;\n.\n\n\n@program $plastic.fork_statement_proto:std as application/x-moocode\n{parser} = args;\n\n/* update the symbol table */\nparser:reserve_statement(this);\n\na = {};\n\n/* possible, optional task name */\nif ((type = parser:token().type) == \"variable\" || type == \"name\")\n  variable = parser:token();\n  parser:make_variable(variable);\n  parser:advance();\n  a = {@a, variable};\nendif\n\n/* the expression */\nparser:token(\"(\");\nexpression = parser:expression(0);\na = {@a, expression};\nparser:token(\")\");\n\n/* the body */\nstatements = parser:statements(\"endfork\", \"end\");\na = {@a, statements};\n\n/* the last token must be \"endfork\" or \"end\" */\nif ((id = parser:token().id) == \"endfork\")\n  parser:advance(\"endfork\");\nelse\n  parser:advance(\"end\");\nendif\n\n/* update the symbol table */\nsymbol = parser.symbols[id];\nparser:reserve_keyword(symbol);\n\n/* store the parts in this token's `value' */\nthis.value = a;\n\nreturn this;\n.\n\n\n@program $plastic.try_statement_proto:std as application/x-moocode\n{parser} = args;\n\n/* update the symbol table */\nparser:reserve_statement(this);\n\na = {};\n\n/* the body */\nbody = parser:statements(\"except\", \"finally\", \"endtry\", \"end\");\na = {@a, body};\n\nif (parser:token().id == \"finally\")\n  parser:advance(\"finally\");\n\n  b = parser:statements(\"endtry\", \"end\");\n\n  /* update the symbol table */\n  symbol = parser.symbols[\"finally\"];\n  parser:reserve_keyword(symbol);\n\n  this.subtype = \"finally\";\n\n  a = {@a, b};\n\nelse\n  b = {};\n\n  id = parser:push(\"@\", 0, this.plastic.prefix_operator_proto);\n\n  /* the exceptions */\n  while (parser:token().id == \"except\")\n    parser:advance(\"except\");\n\n    /* variable and codes */\n    if ((variable = parser:token()).id != \"(\")\n      parser:advance();\n\n      if (variable.type != \"name\" && variable.type != \"variable\")\n        raise(\"Syntax error\", \"Variable must be an identifier\", parser);\n      endif\n      parser:make_variable(variable);\n\n      parser:token(\"(\");\n      if ((token = parser:token()).id == \"ANY\")\n        parser:advance(\"ANY\");\n        symbol = parser.symbols[\"ANY\"];\n        parser:reserve_keyword(symbol);\n        codes = {token};\n      else\n        codes = this.plastic.utilities:parse_list_sequence(parser, \",\", \")\");\n      endif\n      parser:token(\")\");\n\n      !codes && raise(\"Syntax error\", \"Codes may not be empty\", parser);\n\n      b = {variable, codes};\n\n    /* just codes */\n    else\n      parser:token(\"(\");\n      if ((token = parser:token()).id == \"ANY\")\n        parser:advance(\"ANY\");\n        symbol = parser.symbols[\"ANY\"];\n        parser:reserve_keyword(symbol);\n        codes = {token};\n      else\n        codes = this.plastic.utilities:parse_list_sequence(parser, \",\", \")\");\n      endif\n      parser:token(\")\");\n\n      !codes && raise(\"Syntax error\", \"Codes may not be empty\", parser);\n\n      b = {codes};\n\n    endif\n\n    /* handler */\n    handler = parser:statements(\"except\", \"finally\", \"endtry\", \"end\");\n    b = {@b, handler};\n\n    /* update the symbol table */\n    symbol = parser.symbols[\"except\"];\n    parser:reserve_keyword(symbol);\n\n    a = {@a, b};\n\n  endwhile\n\n  parser:pop(id);\n\n  if (!b)\n    raise(\"Syntax error\", \"Missing except\", parser);\n  endif\n\n  this.subtype = \"except\";\n\nendif\n\n/* the last token must be \"endtry\" or \"end\" */\nif ((id = parser:token().id) == \"endtry\")\n  parser:advance(\"endtry\");\nelse\n  parser:advance(\"end\");\nendif\n\n/* update the symbol table */\nsymbol = parser.symbols[id];\nparser:reserve_keyword(symbol);\n\n/* store the parts in this token's `value' */\nthis.value = a;\n\nreturn this;\n.\n\n\n@program $plastic.assignment_operator_proto:led as application/x-moocode\n{parser, first} = args;\n\nif (first.type == \"unary\" && first.id == \"{\") /* scattering syntax */\n  this.plastic.utilities:validate_scattering_pattern(parser, first.value);\n  first.type = \"pattern\";\nendif\n\nif (first.type != \"variable\" && first.type != \"pattern\" && first.id != \".\" && first.id != \"[\")\n  raise(\"Syntax error\", \"Illegal expression on left side of assignment\", parser);\nendif\n\nsecond = parser:expression(this.bp - 1);\n\nif (second.id == \"(end)\")\n  raise(\"Syntax error\", \"Expected an expression\", parser);\nendif\n\nthis.type = \"binary\";\nthis.first = first;\nthis.second = second;\n\nreturn this;\n.\n\n\n@program $plastic.compound_assignment_operator_proto:led as application/x-moocode\n{parser, first} = args;\n\nif (first.type != \"variable\" && first.id != \".\" && first.id != \"[\")\n  raise(\"Syntax error\", \"Illegal expression on left side of assignment\", parser);\nendif\n\nsecond = parser:expression(this.bp - 1);\n\nif (second.id == \"(end)\")\n  raise(\"Syntax error\", \"Expected an expression\", parser);\nendif\n\nop = this.id[1];\nbp = parser.symbols[op].bp;\n\ninner = parser.plastic.infix_operator_proto:create(op, bp);\ninner.type = \"binary\";\ninner.first = first;\ninner.second = second;\n\nouter = parser.plastic.assignment_operator_proto:create(\"=\", this.bp);\nouter.type = \"binary\";\nouter.first = first;\nouter.second = inner;\n\nreturn outer;\n.\n\n\n@program $plastic.name_proto:nud as application/x-moocode\n{parser} = args;\n\n/* Assume the name is a variable.  Subsequent usage may modify this\n * assumption.\n */\nparser:make_variable(this);\n\nreturn this;\n.\n\n\n@program $plastic.bracket_operator_proto:nud as application/x-moocode\n{parser} = args;\n\nsequence = this.plastic.utilities:parse_map_sequence(parser, \",\", \"->\", \"]\");\nparser:token(\"]\");\n\nthis.type = \"unary\";\nthis.value = sequence;\nthis.first = this;\n\nreturn this;\n.\n\n@program $plastic.bracket_operator_proto:led as application/x-moocode\n{parser, first} = args;\n\ncaret = parser:push(\"^\", 0, this.plastic.positional_symbol_proto);\ndollar = parser:push(\"$\", 0, this.plastic.positional_symbol_proto);\n\nsecond = parser:expression(0);\n\nif (parser:token().id == \"..\")\n  parser:advance(\"..\");\n  third = parser:expression(0);\n  parser:advance(\"]\");\n  this.type = \"ternary\";\n  this.first = first;\n  this.second = second;\n  this.third = third;\nelse\n  parser:advance(\"]\");\n  this.type = \"binary\";\n  this.first = first;\n  this.second = second;\nendif\n\nparser:pop(caret);\nparser:pop(dollar);\n\nreturn this;\n.\n\n\n@program $plastic.brace_operator_proto:nud as application/x-moocode\n{parser} = args;\n\nsequence = this.plastic.utilities:parse_list_sequence(parser, \",\", \"}\");\nparser:token(\"}\");\n\nthis.type = \"unary\";\nthis.value = sequence;\nthis.first = this;\n\nreturn this;\n.\n\n\n\n@program $plastic.invocation_operator_proto:nud as application/x-moocode\n{parser} = args;\n\nexpression = parser:expression(0);\nparser:token(\")\");\n\nthis.type = \"unary\";\nthis.first = expression;\n\nreturn this;\n.\n\n@program $plastic.invocation_operator_proto:led as application/x-moocode\n{parser, left} = args;\n\nsequence = this.plastic.utilities:parse_list_sequence(parser, \",\", \")\");\nparser:token(\")\");\n\n/* The invocation operator handles function and verb invocation, and\n * guards against use on properties.\n */\nif (left.id == \".\")\n  raise(\"Syntax error\", \"Invalid application of invocation\", parser);\nelseif (left.id == \":\")\n  first = left.first;\n  second = left.second;\n\n  /* the verb selector operator has our back */\n\n  this.type = \"ternary\";\n  this.first = first;\n  this.second = second;\n  this.third = sequence;\nelse\n  if (left.type != \"variable\")\n    raise(\"Syntax error\", \"Expected an identifier\", parser);\n  endif\n\n  parser:make_identifier(left);\n\n  if (`import = parser.imports[left.value] ! E_RANGE' != E_RANGE)\n    this.type = \"ternary\";\n    this.first = import;\n    this.second = left;\n    this.third = sequence;\n  else\n    this.type = \"binary\";\n    this.first = left;\n    this.second = sequence;\n  endif\nendif\n\nreturn this;\n.\n\n\n\n@program $plastic.verb_selector_operator_proto:led as application/x-moocode\n{parser, first} = args;\n\nif (parser:token().id == \"(\")\n  parser:advance(\"(\");\n  second = parser:expression(0);\n  parser:advance(\")\");\nelse\n  second = parser:expression(this.bp);\n  if (second.type != \"variable\")\n    raise(\"Syntax error\", \"Expected an identifier\", parser);\n  endif\n  parser:make_identifier(second);\nendif\n\nif (parser:token().id != \"(\")\n  raise(\"Syntax error\", \"Expected `('\", parser);\nendif\n\nthis.type = \"binary\";\nthis.first = first;\nthis.second = second;\n\nreturn this;\n.\n\n\n@program $plastic.property_selector_operator_proto:led as application/x-moocode\n{parser, first} = args;\n\nif (parser:token().id == \"(\")\n  parser:advance(\"(\");\n  second = parser:expression(0);\n  parser:advance(\")\");\nelse\n  second = parser:expression(this.bp);\n  if (second.type != \"variable\")\n    raise(\"Syntax error\", \"Expected an identifier\", parser);\n  endif\n  parser:make_identifier(second);\nendif\n\nthis.type = \"binary\";\nthis.first = first;\nthis.second = second;\n\nreturn this;\n.\n\n\n@program $plastic.error_catching_operator_proto:nud as application/x-moocode\n{parser} = args;\n\nfirst = parser:expression(700);\n\nif (first.id == \"(end)\")\n  raise(\"Syntax error\", \"Expected an expression\", parser);\nendif\n\nthis.type = \"unary\";\nthis.first = first;\n\nreturn this;\n.\n\n@program $plastic.error_catching_operator_proto:led as application/x-moocode\n{parser, first} = args;\n\n/* Error codes are either the keyword `ANY' or a list of expressions\n * (see 4.1.12 Catching Errors in Expressions).\n */\nid = parser:push(\"@\", 0, this.plastic.prefix_operator_proto);\n\nif ((token = parser:token()).id == \"ANY\")\n  parser:advance(\"ANY\");\n  symbol = parser.symbols[\"ANY\"];\n  parser:reserve_keyword(symbol);\n  second = {token};\nelse\n  second = this.plastic.utilities:parse_list_sequence(parser, \",\", \"\");\n\n  if (second[$].id == \"(end)\")\n    raise(\"Syntax error\", \"Expected `ANY' or a list of expressions\", parser);\n  endif\nendif\n\nparser:pop(id);\n\nif ((token = parser:token()).id == \"=>\")\n  parser:advance(\"=>\");\n  third = parser:expression(0);\n\n  if (third.id == \"(end)\")\n    raise(\"Syntax error\", \"Expected an expression\", parser);\n  endif\n\n  this.type = \"ternary\";\n  this.first = first;\n  this.second = second;\n  this.third = third;\nelse\n  this.type = \"binary\";\n  this.first = first;\n  this.second = second;\nendif\n\nreturn this;\n.\n\n\n@program $plastic.traditional_ternary_operator_proto:led as application/x-moocode\n{parser, first} = args;\n\nsecond = parser:expression(0);\nparser:token(\"|\");\nthird = parser:expression(0);\n\nif (second.id == \"(end)\" || third.id == \"(end)\")\n  raise(\"Syntax error\", \"Expected an expression\", parser);\nendif\n\nthis.type = \"ternary\";\nthis.first = first;\nthis.second = second;\nthis.third = third;\n\nreturn this;\n.\n\n@program $plastic.from_statement_proto:std as application/x-moocode\n{parser} = args;\n\n/* update the symbol table */\nparser:reserve_statement(this);\n\ntypes = {\"name\", \"variable\", \"identifier\"};\n\n/* the reference */\nif ((target = parser:token()).type == \"string\")\n  parser:advance();\nelseif (target.type in types && target.value == \"this\")\n  parser:advance();\nelseif (target.type in types && target.value[1] == \"$\")\n  target = parser:expression();\n  if (target.id == \".\")\n    temp = target;\n    while (temp.id == \".\")\n      if ((temp.first.id != \".\" && !(temp.first.type in types)) && !(temp.second.type in types))\n        raise(\"Syntax error\", tostr(\"Invalid reference: \", target.id), parser);\n      endif\n      temp = temp.first;\n    endwhile\n  elseif (target.value[1] == \"$\")\n    /* ok */\n  else\n    raise(\"Syntax error\", tostr(\"Invalid reference: \", target.id), parser);\n  endif\nelse\n  raise(\"Syntax error\", tostr(\"Invalid reference: \", target.id), parser);\nendif\n\nparser:token(\"use\");\n\n/* update the symbol table */\nsymbol = parser.symbols[\"use\"];\nparser:reserve_keyword(symbol);\n\n/* the import(s) */\nimports = {};\n\nif ((import = parser:token()).id == \"(end)\")\n  raise(\"Syntax error\", \"Expected an identifier\", parser);\nelseif (!(import.type in types))\n  raise(\"Syntax error\", \"Import must be an identifier\", parser);\nendif\nparser:make_identifier(import);\nparser:advance();\nimports = {@imports, import};\n\nwhile (parser:token().id == \",\")\n  parser:advance(\",\");\n  if ((import = parser:token()).id == \"(end)\")\n    raise(\"Syntax error\", \"Expected an identifier\", parser);\n  elseif (!(import.type in types))\n    raise(\"Syntax error\", \"Import must be an identifier\", parser);\n  endif\n  parser:make_identifier(import);\n  parser:advance();\n  imports = {@imports, import};\nendwhile\n\n/* generate code */\nif (target.type == \"string\")\n  temp = parser.plastic.invocation_operator_proto:create(\"(\");\n  temp.type = \"binary\";\n  temp.first = parser.plastic.name_proto:create(\"$lookup\");\n  temp.first.type = \"identifier\";\n  temp.first.value = \"$lookup\";\n  temp.second = {target};\n  target = temp;\nendif\n\nfirst = parser.plastic.name_proto:create(tostr(random()));\nfirst.type = \"unique\";\n\nif (!length(imports))\n  raise(\"Syntax error\", \"Missing imports\", parser);\nendif\n\nfor import in (imports)\n  if (`parser.imports[import.id] ! E_RANGE' != E_RANGE)\n    raise(\"Syntax error\", \"Duplicate imports\", parser);\n  endif\n  parser.imports[import.id] = first;\nendfor\n\nresult = parser.plastic.assignment_operator_proto:create(\"=\");\nresult.type = \"binary\";\nresult.first = first;\nresult.second = target;\n\nreturn result;\n.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Moocode/toy.moo",
    "content": "@verb toy:do_the_work this none this\n@program toy:do_the_work\nif (this.wound)\n  if ($object_utils:isa(this.location,$room))\n    this.location:announce_all(this.name,\" \", this:continue_msg());\n    this.wound = this.wound - 1;\n    if (this.wound)\n      fork (15)\n        this:do_the_work();\n      endfork\n    else\n      this.location:announce_all(this.name, \" \", this:wind_down_msg());\n    endif\n  endif\n  if (this.wound < 0)\n    this.wound = 0;\n  endif\nendif\n.\n"
  },
  {
    "path": "src/test/resources/samples/langs/MoonScript/transform.moon",
    "content": "\ntypes = require \"moonscript.types\"\nutil = require \"moonscript.util\"\ndata = require \"moonscript.data\"\n\nimport reversed, unpack from util\nimport ntype, mtype, build, smart_node, is_slice, value_is_singular from types\nimport insert from table\nimport NameProxy, LocalName from require \"moonscript.transform.names\"\n\ndestructure = require \"moonscript.transform.destructure\"\n\nlocal implicitly_return\n\nclass Run\n  new: (@fn) =>\n    self[1] = \"run\"\n\n  call: (state) =>\n    self.fn state\n\n-- transform the last stm is a list of stms\n-- will puke on group\napply_to_last = (stms, fn) ->\n  -- find last (real) exp\n  last_exp_id = 0\n  for i = #stms, 1, -1\n    stm = stms[i]\n    if stm and mtype(stm) != Run\n      last_exp_id = i\n      break\n\n  return for i, stm in ipairs stms\n    if i == last_exp_id\n      fn stm\n    else\n      stm\n\n-- is a body a sindle expression/statement\nis_singular = (body) ->\n  return false if #body != 1\n  if \"group\" == ntype body\n    is_singular body[2]\n  else\n    true\n\nfind_assigns = (body, out={}) ->\n  for thing in *body\n    switch thing[1]\n      when \"group\"\n        find_assigns thing[2], out\n      when \"assign\"\n        table.insert out, thing[2] -- extract names\n  out\n\nhoist_declarations = (body) ->\n  assigns = {}\n\n  -- hoist the plain old assigns\n  for names in *find_assigns body\n    for name in *names\n      table.insert assigns, name if type(name) == \"string\"\n\n  -- insert after runs\n  idx = 1\n  while mtype(body[idx]) == Run do idx += 1\n\n  table.insert body, idx, {\"declare\", assigns}\n\nexpand_elseif_assign = (ifstm) ->\n  for i = 4, #ifstm\n    case = ifstm[i]\n    if ntype(case) == \"elseif\" and ntype(case[2]) == \"assign\"\n      split = { unpack ifstm, 1, i - 1 }\n      insert split, {\n        \"else\", {\n          {\"if\", case[2], case[3], unpack ifstm, i + 1}\n        }\n      }\n      return split\n\n  ifstm\n\nconstructor_name = \"new\"\n\nwith_continue_listener = (body) ->\n  continue_name = nil\n  {\n    Run =>\n      @listen \"continue\", ->\n        unless continue_name\n          continue_name = NameProxy\"continue\"\n          @put_name continue_name\n        continue_name\n\n    build.group body\n\n    Run =>\n      return unless continue_name\n      @put_name continue_name, nil\n      @splice (lines) -> {\n        {\"assign\", {continue_name}, {\"false\"}}\n        {\"repeat\", \"true\", {\n          lines\n          {\"assign\", {continue_name}, {\"true\"}}\n        }}\n        {\"if\", {\"not\", continue_name}, {\n          {\"break\"}\n        }}\n      }\n  }\n\n\nclass Transformer\n  new: (@transformers) =>\n    @seen_nodes = setmetatable {}, __mode: \"k\"\n\n  transform: (scope, node, ...) =>\n    return node if @seen_nodes[node]\n    @seen_nodes[node] = true\n    while true\n      transformer = @transformers[ntype node]\n      res = if transformer\n        transformer(scope, node, ...) or node\n      else\n        node\n      return node if res == node\n      node = res\n    node\n\n  bind: (scope) =>\n    (...) -> @transform scope, ...\n\n  __call: (...) => @transform ...\n\n  can_transform: (node) =>\n    @transformers[ntype node] != nil\n\nconstruct_comprehension = (inner, clauses) ->\n  current_stms = inner\n  for _, clause in reversed clauses\n    t = clause[1]\n    current_stms = if t == \"for\"\n      _, names, iter = unpack clause\n      {\"foreach\", names, {iter}, current_stms}\n    elseif t == \"when\"\n      _, cond = unpack clause\n      {\"if\", cond, current_stms}\n    else\n      error \"Unknown comprehension clause: \"..t\n    current_stms = {current_stms}\n\n  current_stms[1]\n\nStatement = Transformer {\n  root_stms: (body) =>\n    apply_to_last body, implicitly_return @\n\n  assign: (node) =>\n    names, values = unpack node, 2\n    -- bubble cascading assigns\n    transformed = if #values == 1\n      value = values[1]\n      t = ntype value\n\n      if t == \"decorated\"\n        value = @transform.statement value\n        t = ntype value\n\n      if types.cascading[t]\n        ret = (stm) ->\n          if types.is_value stm\n            {\"assign\", names, {stm}}\n          else\n            stm\n\n        build.group {\n          {\"declare\", names}\n          @transform.statement value, ret, node\n        }\n\n    node = transformed or node\n\n    if destructure.has_destructure names\n      return destructure.split_assign node\n\n    node\n\n  continue: (node) =>\n    continue_name = @send \"continue\"\n    error \"continue must be inside of a loop\" unless continue_name\n    build.group {\n      build.assign_one continue_name, \"true\"\n      {\"break\"}\n    }\n\n  export: (node) =>\n    -- assign values if they are included\n    if #node > 2\n      if node[2] == \"class\"\n        cls = smart_node node[3]\n        build.group {\n          {\"export\", {cls.name}}\n          cls\n        }\n      else\n        build.group {\n          node\n          build.assign {\n            names: node[2]\n            values: node[3]\n          }\n        }\n    else\n      nil\n\n  update: (node) =>\n    _, name, op, exp = unpack node\n    op_final = op\\match \"^(.+)=$\"\n    error \"Unknown op: \"..op if not op_final\n    exp = {\"parens\", exp} unless value_is_singular exp\n    build.assign_one name, {\"exp\", name, op_final, exp}\n\n  import: (node) =>\n    _, names, source = unpack node\n\n    stubs = for name in *names\n      if type(name) == \"table\"\n        name\n      else\n        {\"dot\", name}\n\n    real_names = for name in *names\n      type(name) == \"table\" and name[2] or name\n\n    if type(source) == \"string\"\n      build.assign {\n        names: real_names\n        values: [build.chain { base: source, stub} for stub in *stubs]\n      }\n    else\n      source_name = NameProxy \"table\"\n      build.group {\n        {\"declare\", real_names}\n        build[\"do\"] {\n          build.assign_one source_name, source\n          build.assign {\n            names: real_names\n            values: [build.chain { base: source_name, stub} for stub in *stubs]\n          }\n        }\n      }\n\n  comprehension: (node, action) =>\n    _, exp, clauses = unpack node\n\n    action = action or (exp) -> {exp}\n    construct_comprehension action(exp), clauses\n\n  do: (node, ret) =>\n    node[2] = apply_to_last node[2], ret if ret\n    node\n\n  decorated: (node) =>\n    stm, dec = unpack node, 2\n\n    wrapped = switch dec[1]\n      when \"if\"\n        cond, fail = unpack dec, 2\n        fail = { \"else\", { fail } } if fail\n        { \"if\", cond, { stm }, fail }\n      when \"unless\"\n        { \"unless\", dec[2], { stm } }\n      when \"comprehension\"\n        { \"comprehension\", stm, dec[2] }\n      else\n        error \"Unknown decorator \" .. dec[1]\n\n    if ntype(stm) == \"assign\"\n      wrapped = build.group {\n        build.declare names: [name for name in *stm[2] when type(name) == \"string\"]\n        wrapped\n      }\n\n    wrapped\n\n  unless: (node) =>\n    { \"if\", {\"not\", {\"parens\", node[2]}}, unpack node, 3 }\n\n  if: (node, ret) =>\n    -- expand assign in cond\n    if ntype(node[2]) == \"assign\"\n      _, assign, body = unpack node\n      if destructure.has_destructure assign[2]\n        name = NameProxy \"des\"\n\n        body = {\n          destructure.build_assign assign[2][1], name\n          build.group node[3]\n        }\n\n        return build.do {\n          build.assign_one name, assign[3][1]\n          {\"if\", name, body, unpack node, 4}\n        }\n      else\n        name = assign[2][1]\n        return build[\"do\"] {\n          assign\n          {\"if\", name, unpack node, 3}\n        }\n\n    node = expand_elseif_assign node\n\n    -- apply cascading return decorator\n    if ret\n      smart_node node\n      -- mutate all the bodies\n      node['then'] = apply_to_last node['then'], ret\n      for i = 4, #node\n        case = node[i]\n        body_idx = #node[i]\n        case[body_idx] = apply_to_last case[body_idx], ret\n\n    node\n\n  with: (node, ret) =>\n    _, exp, block = unpack node\n\n    scope_name = NameProxy \"with\"\n\n    named_assign = if ntype(exp) == \"assign\"\n      names, values = unpack exp, 2\n      assign_name = names[1]\n      exp = values[1]\n      values[1] = scope_name\n      {\"assign\", names, values}\n\n    build.do {\n      Run => @set \"scope_var\", scope_name\n      build.assign_one scope_name, exp\n      build.group { named_assign }\n      build.group block\n\n      if ret\n        ret scope_name\n    }\n\n  foreach: (node) =>\n    smart_node node\n    source = unpack node.iter\n\n    destructures = {}\n    node.names = for i, name in ipairs node.names\n      if ntype(name) == \"table\"\n        with proxy = NameProxy \"des\"\n          insert destructures, destructure.build_assign name, proxy\n      else\n        name\n\n    if next destructures\n      insert destructures, build.group node.body\n      node.body = destructures\n\n    if ntype(source) == \"unpack\"\n      list = source[2]\n\n      index_name = NameProxy \"index\"\n      list_name = NameProxy \"list\"\n\n      slice_var = nil\n      bounds = if is_slice list\n        slice = list[#list]\n        table.remove list\n        table.remove slice, 1\n\n        slice[2] = if slice[2] and slice[2] != \"\"\n          max_tmp_name = NameProxy \"max\"\n          slice_var = build.assign_one max_tmp_name, slice[2]\n          {\"exp\", max_tmp_name, \"<\", 0\n            \"and\", {\"length\", list_name}, \"+\", max_tmp_name\n            \"or\", max_tmp_name }\n        else\n          {\"length\", list_name}\n\n        slice\n      else\n        {1, {\"length\", list_name}}\n\n      return build.group {\n        build.assign_one list_name, list\n        slice_var\n        build[\"for\"] {\n          name: index_name\n          bounds: bounds\n          body: {\n            {\"assign\", node.names, {list_name\\index index_name}}\n            build.group node.body\n          }\n        }\n      }\n\n    node.body = with_continue_listener node.body\n\n  while: (node) =>\n    smart_node node\n    node.body = with_continue_listener node.body\n\n  for: (node) =>\n    smart_node node\n    node.body = with_continue_listener node.body\n\n  switch: (node, ret) =>\n    _, exp, conds = unpack node\n    exp_name = NameProxy \"exp\"\n\n    -- convert switch conds into if statment conds\n    convert_cond = (cond) ->\n      t, case_exps, body = unpack cond\n      out = {}\n      insert out, t == \"case\" and \"elseif\" or \"else\"\n      if  t != \"else\"\n        cond_exp = {}\n        for i, case in ipairs case_exps\n          if i == 1\n            insert cond_exp, \"exp\"\n          else\n            insert cond_exp, \"or\"\n\n          case = {\"parens\", case} unless value_is_singular case\n          insert cond_exp, {\"exp\", case, \"==\", exp_name}\n\n        insert out, cond_exp\n      else\n        body = case_exps\n\n      if ret\n        body = apply_to_last body, ret\n\n      insert out, body\n\n      out\n\n    first = true\n    if_stm = {\"if\"}\n    for cond in *conds\n      if_cond = convert_cond cond\n      if first\n        first = false\n        insert if_stm, if_cond[2]\n        insert if_stm, if_cond[3]\n      else\n        insert if_stm, if_cond\n\n    build.group {\n      build.assign_one exp_name, exp\n      if_stm\n    }\n\n  class: (node, ret, parent_assign) =>\n    _, name, parent_val, body = unpack node\n\n    -- split apart properties and statements\n    statements = {}\n    properties = {}\n    for item in *body\n      switch item[1]\n        when \"stm\"\n          insert statements, item[2]\n        when \"props\"\n          for tuple in *item[2,]\n            if ntype(tuple[1]) == \"self\"\n              insert statements, build.assign_one unpack tuple\n            else\n              insert properties, tuple\n\n    -- find constructor\n    constructor = nil\n    properties = for tuple in *properties\n      key = tuple[1]\n      if key[1] == \"key_literal\" and key[2] == constructor_name\n        constructor = tuple[2]\n        nil\n      else\n        tuple\n\n    parent_cls_name = NameProxy \"parent\"\n    base_name = NameProxy \"base\"\n    self_name = NameProxy \"self\"\n    cls_name = NameProxy \"class\"\n\n    if not constructor\n      constructor = build.fndef {\n        args: {{\"...\"}}\n        arrow: \"fat\"\n        body: {\n          build[\"if\"] {\n            cond: parent_cls_name\n            then: {\n              build.chain { base: \"super\", {\"call\", {\"...\"}} }\n            }\n          }\n        }\n      }\n    else\n      smart_node constructor\n      constructor.arrow = \"fat\"\n\n    real_name = name or parent_assign and parent_assign[2][1]\n    real_name = switch ntype real_name\n      when \"chain\"\n        last = real_name[#real_name]\n        switch ntype last\n          when \"dot\"\n            {\"string\", '\"', last[2]}\n          when \"index\"\n            last[2]\n          else\n            \"nil\"\n      when \"nil\"\n        \"nil\"\n      else\n        {\"string\", '\"', real_name}\n\n    cls = build.table {\n      {\"__init\", constructor}\n      {\"__base\", base_name}\n      {\"__name\", real_name} -- \"quote the string\"\n      {\"__parent\", parent_cls_name}\n    }\n\n    -- look up a name in the class object\n    class_lookup = build[\"if\"] {\n      cond: {\"exp\", \"val\", \"==\", \"nil\", \"and\", parent_cls_name}\n      then: {\n        parent_cls_name\\index\"name\"\n      }\n    }\n    insert class_lookup, {\"else\", {\"val\"}}\n\n    cls_mt = build.table {\n      {\"__index\", build.fndef {\n        args: {{\"cls\"}, {\"name\"}}\n        body: {\n          build.assign_one LocalName\"val\", build.chain {\n            base: \"rawget\", {\"call\", {base_name, \"name\"}}\n          }\n          class_lookup\n        }\n      }}\n      {\"__call\", build.fndef {\n        args: {{\"cls\"}, {\"...\"}}\n        body: {\n          build.assign_one self_name, build.chain {\n            base: \"setmetatable\"\n            {\"call\", {\"{}\", base_name}}\n          }\n          build.chain {\n            base: \"cls.__init\"\n            {\"call\", {self_name, \"...\"}}\n          }\n          self_name\n        }\n      }}\n    }\n\n    cls = build.chain {\n      base: \"setmetatable\"\n      {\"call\", {cls, cls_mt}}\n    }\n\n    value = nil\n    with build\n      out_body = {\n        Run =>\n          -- make sure we don't assign the class to a local inside the do\n          @put_name name if name\n\n          @set \"super\", (block, chain) ->\n            if chain\n              slice = [item for item in *chain[3,]]\n              new_chain = {\"chain\", parent_cls_name}\n\n              head = slice[1]\n\n              if head == nil\n                return parent_cls_name\n\n              switch head[1]\n                -- calling super, inject calling name and self into chain\n                when \"call\"\n                  calling_name = block\\get\"current_block\"\n                  slice[1] = {\"call\", {\"self\", unpack head[2]}}\n\n                  if ntype(calling_name) == \"key_literal\"\n                    insert new_chain, {\"dot\", calling_name[2]}\n                  else\n                    insert new_chain, {\"index\", calling_name}\n\n                -- colon call on super, replace class with self as first arg\n                when \"colon\"\n                  call = head[3]\n                  insert new_chain, {\"dot\", head[2]}\n                  slice[1] = { \"call\", { \"self\", unpack call[2] } }\n\n              insert new_chain, item for item in *slice\n\n              new_chain\n            else\n              parent_cls_name\n\n        .assign_one parent_cls_name, parent_val == \"\" and \"nil\" or parent_val\n        .assign_one base_name, {\"table\", properties}\n        .assign_one base_name\\chain\"__index\", base_name\n\n        .if {\n          cond: parent_cls_name\n          then: {\n            .chain {\n              base: \"setmetatable\"\n              {\"call\", {\n                base_name,\n                .chain { base: parent_cls_name,  {\"dot\", \"__base\"}}\n              }}\n            }\n          }\n        }\n\n        .assign_one cls_name, cls\n        .assign_one base_name\\chain\"__class\", cls_name\n\n        .group if #statements > 0 then {\n          .assign_one LocalName\"self\", cls_name\n          .group statements\n        }\n\n        -- run the inherited callback\n        .if {\n          cond: {\"exp\",\n            parent_cls_name, \"and\", parent_cls_name\\chain \"__inherited\"\n          }\n          then: {\n            parent_cls_name\\chain \"__inherited\", {\"call\", {\n              parent_cls_name, cls_name\n            }}\n          }\n        }\n\n        .group if name then {\n          .assign_one name, cls_name\n        }\n\n        if ret\n          ret cls_name\n      }\n\n      hoist_declarations out_body\n\n      value = .group {\n        .group if ntype(name) == \"value\" then {\n          .declare names: {name}\n        }\n\n        .do out_body\n      }\n\n    value\n}\n\nclass Accumulator\n  body_idx: { for: 4, while: 3, foreach: 4 }\n\n  new: =>\n    @accum_name = NameProxy \"accum\"\n    @value_name = NameProxy \"value\"\n    @len_name = NameProxy \"len\"\n\n  -- wraps node and mutates body\n  convert: (node) =>\n    index = @body_idx[ntype node]\n    node[index] = @mutate_body node[index]\n    @wrap node\n\n  -- wrap the node into a block_exp\n  wrap: (node) =>\n    build.block_exp {\n      build.assign_one @accum_name, build.table!\n      build.assign_one @len_name, 0\n      node\n      @accum_name\n    }\n\n  -- mutates the body of a loop construct to save last value into accumulator\n  -- can optionally skip nil results\n  mutate_body: (body, skip_nil=true) =>\n    val = if not skip_nil and is_singular body\n      with body[1]\n        body = {}\n    else\n      body = apply_to_last body, (n) ->\n        if types.is_value n\n          build.assign_one @value_name, n\n        else\n          -- just ignore it\n          build.group {\n            {\"declare\", {@value_name}}\n            n\n          }\n      @value_name\n\n    update = {\n      {\"update\", @len_name, \"+=\", 1}\n      build.assign_one @accum_name\\index(@len_name), val\n    }\n\n    if skip_nil\n      table.insert body, build[\"if\"] {\n        cond: {\"exp\", @value_name, \"!=\", \"nil\"}\n        then: update\n      }\n    else\n      table.insert body, build.group update\n\n    body\n\ndefault_accumulator = (node) =>\n  Accumulator!\\convert node\n\nimplicitly_return = (scope) ->\n  is_top = true\n  fn = (stm) ->\n    t = ntype stm\n\n    -- expand decorated\n    if t == \"decorated\"\n      stm = scope.transform.statement stm\n      t = ntype stm\n\n    if types.cascading[t]\n      is_top = false\n      scope.transform.statement stm, fn\n    elseif types.manual_return[t] or not types.is_value stm\n      -- remove blank return statement\n      if is_top and t == \"return\" and stm[2] == \"\"\n        nil\n      else\n        stm\n    else\n      if t == \"comprehension\" and not types.comprehension_has_value stm\n        stm\n      else\n        {\"return\", stm}\n\n  fn\n\nValue = Transformer {\n  for: default_accumulator\n  while: default_accumulator\n  foreach: default_accumulator\n\n  do: (node) =>\n    build.block_exp node[2]\n\n  decorated: (node) =>\n    @transform.statement node\n\n  class: (node) =>\n    build.block_exp { node }\n\n  string: (node) =>\n    delim = node[2]\n\n    convert_part = (part) ->\n      if type(part) == \"string\" or part == nil\n        {\"string\", delim, part or \"\"}\n      else\n        build.chain { base: \"tostring\", {\"call\", {part[2]}} }\n\n    -- reduced to single item\n    if #node <= 3\n      return if type(node[3]) == \"string\"\n        node\n      else\n        convert_part node[3]\n\n    e = {\"exp\", convert_part node[3]}\n\n    for i=4, #node\n      insert e, \"..\"\n      insert e, convert_part node[i]\n    e\n\n  comprehension: (node) =>\n    a = Accumulator!\n    node = @transform.statement node, (exp) ->\n      a\\mutate_body {exp}, false\n    a\\wrap node\n\n  tblcomprehension: (node) =>\n    _, explist, clauses = unpack node\n    key_exp, value_exp = unpack explist\n\n    accum = NameProxy \"tbl\"\n\n    inner = if value_exp\n      dest = build.chain { base: accum, {\"index\", key_exp} }\n      { build.assign_one dest, value_exp }\n    else\n      -- If we only have single expression then\n      -- unpack the result into key and value\n      key_name, val_name = NameProxy\"key\", NameProxy\"val\"\n      dest = build.chain { base: accum, {\"index\", key_name} }\n      {\n        build.assign names: {key_name, val_name}, values: {key_exp}\n        build.assign_one dest, val_name\n      }\n\n    build.block_exp {\n      build.assign_one accum, build.table!\n      construct_comprehension inner, clauses\n      accum\n    }\n\n  fndef: (node) =>\n    smart_node node\n    node.body = apply_to_last node.body, implicitly_return self\n    node.body = {\n      Run => @listen \"varargs\", -> -- capture event\n      unpack node.body\n    }\n\n    node\n\n  if: (node) => build.block_exp { node }\n  unless: (node) =>build.block_exp { node }\n  with: (node) => build.block_exp { node }\n  switch: (node) =>\n    build.block_exp { node }\n\n  -- pull out colon chain\n  chain: (node) =>\n    stub = node[#node]\n\n    -- escape lua keywords used in dot accessors\n    for i=3,#node\n      part = node[i]\n      if ntype(part) == \"dot\" and data.lua_keywords[part[2]]\n        node[i] = { \"index\", {\"string\", '\"', part[2]} }\n\n    if ntype(node[2]) == \"string\"\n      -- add parens if callee is raw string\n      node[2] = {\"parens\", node[2] }\n    elseif type(stub) == \"table\" and stub[1] == \"colon_stub\"\n      -- convert colon stub into code\n      table.remove node, #node\n\n      base_name = NameProxy \"base\"\n      fn_name = NameProxy \"fn\"\n\n      is_super = node[2] == \"super\"\n      @transform.value build.block_exp {\n        build.assign {\n          names: {base_name}\n          values: {node}\n        }\n\n        build.assign {\n          names: {fn_name}\n          values: {\n            build.chain { base: base_name, {\"dot\", stub[2]} }\n          }\n        }\n\n        build.fndef {\n          args: {{\"...\"}}\n          body: {\n            build.chain {\n              base: fn_name, {\"call\", {is_super and \"self\" or base_name, \"...\"}}\n            }\n          }\n        }\n      }\n\n  block_exp: (node) =>\n    _, body = unpack node\n\n    fn = nil\n    arg_list = {}\n\n    fn = smart_node build.fndef body: {\n      Run =>\n        @listen \"varargs\", ->\n          insert arg_list, \"...\"\n          insert fn.args, {\"...\"}\n          @unlisten \"varargs\"\n\n      unpack body\n    }\n\n    build.chain { base: {\"parens\", fn}, {\"call\", arg_list} }\n}\n\n{ :Statement, :Value, :Run }\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/PrnOscPat_driver.ncl",
    "content": "undef(\"PrnOscPat_driver\")\nfunction PrnOscPat_driver(eof[*][*][*]:numeric, eof_ts[*][*]:numeric, kPOP[1]:integer)\n; =================================================================\n; compute Principal Oscillation Patterns (POPs)\n; =================================================================\nlocal dim_ts, dim_eof, neof, ntim, nlat, mlon, dnam_ts, dnam_eof, neof, j \\\n    , cov0, cov1, cov0_inverse, A, z, Z, pr, pi, zr, zi, mean, stdev      \\\n    , evlr, eigi, eigr   \nbegin\n\n  dim_ts  = dimsizes(eof_ts)        ; (neof,ntim)\n  dim_eof = dimsizes(eof)           ; (neof,nlat,mlon)\n\n  ntim    = dim_ts(1)\n  neof    = dim_eof(0)\n  nlat    = dim_eof(1)\n  mlon    = dim_eof(2)\n\n  dnam_ts = getvardims(eof_ts)      ; dimension names\n  dnam_eof= getvardims(eof)         ; used at end for meta data\n\n; =================================================================\n; lag-0 and lag-1  matrices \n; =================================================================\n\n  if (get_ncl_version().eq.\"6.1.2\") then                ; bug in 6.1.2\n      cov0    = covcorm(eof_ts,(/1,0/))\t\t\t; lag-0 covariance matrix\n  else\n      cov0    = covcorm(eof_ts,(/0,1/))\t\t\t; lag-0 covariance matrix (n x n)\n  end if\n                                                        ; either\n  cov1    = covcorm_xy(eof_ts, eof_ts, (/0,1,0/))       ; lag-1 \n ;cov1    = covcorm_xy(eof_ts(:,0:ntim-2) \\             ; alternative, brute force\n ;                    ,eof_ts(:,1:ntim-1), (/0,0,0/)) \n ;printVarSummary(cov1)\n\n; =================================================================\n; matrix A contains information for evolution of the POP system. \n; POPs are eigenvectors of A.  \n; =================================================================\n\n  cov0_inverse = inverse_matrix(cov0)\n  A = cov1#inverse_matrix(cov0)                         ; [*][*] => neof x neof\n\n; =================================================================\n; NCL 6.1.1 of dgeevx:  evlr(2,2,N,N) ; (left(0)/right(1), real(0)/imag(1),:,:)\n; Eigenvalues are returned as attributes: eigi  = evlr@eigi  ; eigr  = evlr@eigr\n; =================================================================\n\n  evlr  = dgeevx_lapack(A, \"B\", \"V\", \"V\", \"B\", False)  \n\n; =================================================================\n; POP time series from eigenvalues and right eigenvectors \n; ================================================================= \n ;PR   = (/ evlr(1,0,:,:) /)         ; right ev (1), real part (0)\n ;PI   = (/ evlr(1,1,:,:) /)         ; right ev (1), imag part (1)\n                                     ; kPOP is what we want; use righteigenvector\n  pr   = (/ evlr(1,0,kPOP-1,:) /)    ; right ev (1), real part (0), row 'kPOP-1' \n  pi   = (/ evlr(1,1,kPOP-1,:) /)    ; right ev (1), imag part (1), row 'kPOP-1'\n   \n  z    = inverse_matrix( (/ (/sum(pr*pr), sum(pr*pi)/) \\\n                          , (/sum(pr*pi), sum(pi*pi)/) /))#(/pr,pi/)#eof_ts\n   \n                                                        ; complex conjugate\n  z    = (/z(0,:), -z(1,:)/)       \t\t    \t; real & imag series\n  z    = dim_rmvmean_n(z,1)\n  mean = dim_avg_n(z,1)                                 ; calculate mean\n  stdev= dim_stddev_n(z,1)                              ; calculate stdev\n  z    = dim_standardize_n(z,1,1)\t\t\t; standardize time series\n\n  z!0     = \"nPOP\"\t\t\t\t        ; add meta data\n  z!1     = dnam_ts(1)\t\t\n  z&nPOP  = (/0,1/)\n  z&$dnam_ts(1)$ = eof_ts&$dnam_ts(1)$            \n  z@stdev = stdev\t\t\t\t\n  z@mean  = mean\t\t\t\n  z@long_name = \"POP timeseries\"\t\t\t\n ;printVarSummary(z)\n\n; =================================================================\n; POP spatial patterns\n; =================================================================\n\n  zr = pr(0)*eof(0,:,:)\t\t\t; construct POP spatial domain\n  zi = pi(0)*eof(0,:,:)\n  do j=1,neof-1\n     zr = zr + pr(j)*eof(j,:,:)\n     zi = zi + pi(j)*eof(j,:,:)\n  end do\n\n  Z   = (/zr*stdev(0), -zi*stdev(1)/)\t; scale patterns by time series stdev\n\n  Z!0 = \"nPOP\"\t\t\t\t; add meta data\n  Z!1 = dnam_eof(1)\n  Z!2 = dnam_eof(2)\n\n  Z&nPOP          = (/0,1/)                             \n  Z&$dnam_eof(1)$ = eof&$dnam_eof(1)$    \n  Z&$dnam_eof(2)$ = eof&$dnam_eof(2)$    \n  Z@long_name     = \"POP pattern\"\n ;printVarSummary(Z)\n\n; =================================================================\n; return POP time series and POP spatial patterns as a \n; variable of type 'list' which contains 2 variables\n; =================================================================\n\n  return( [/z, Z/] )    ; this is type \"list\"      \nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/WRF_static_2.ncl",
    "content": ";*************************************************\n; WRF static: panel different variables \n;************************************************\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"   \nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\"   \nload \"$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRF_contributed.ncl\"\nbegin\n;************************************************\n; open file and read in data\n;************************************************\n  f     = addfile(\"static.wrfsi.nc\", \"r\")\n;************************************************\n; Read variables\n;************************************************\n  use   = f->use(0,0,:,:)           ; land use dominant category\n  stl   = f->stl(0,0,:,:)           ; top layer (0-30cm) dom cat soiltype\n  sbl   = f->sbl(0,0,:,:)           ; bottom layer (30-90cm) dom cat soiltype\n  lat2d = f->lat(0,0,:,:)\n  lon2d = f->lon(0,0,:,:)\n  lsMask= f->lnd(0,0,:,:)           ; land (1) water (0) mas\n\n;************************************************\n; Use mask function to set all ocean areas to _FillValue\n;************************************************\n  use   = mask(use,lsMask,1)\n  stl   = mask(stl,lsMask,1)\n  sbl   = mask(sbl,lsMask,1)\n\n;************************************************\n; Associate 2D coordinates with variables for plotting\n;************************************************\n  use@lat2d = lat2d\n  use@lon2d = lon2d\n  stl@lat2d = lat2d\n  stl@lon2d = lon2d\n  sbl@lat2d = lat2d\n  sbl@lon2d = lon2d\n\n;************************************************  \n; The file should be examined via: ncdump -v grid_type static.wrsi \n; This will print the print type. then enter below. \n;************************************************  \n  projection = \"mercator\"   \n\n;************************************************\n; create plots  \n;************************************************\n  wks = gsn_open_wks(\"ps\" ,\"WRF_static\")      ; ps,pdf,x11,ncgm,eps\n  gsn_define_colormap(wks ,\"BlAqGrYeOrReVi200\"); choose colormap\n\n  res                       = True             ; plot mods desired\n  res@gsnSpreadColors       = True             ; use full range of colormap\n  res@cnFillOn              = True             ; color plot desired\n  res@cnLinesOn             = False            ; turn off contour lines\n  res@cnLineLabelsOn        = False            ; turn off contour labels\n  res@cnLevelSpacingF       = 1                ; manually specify interval\n  res@cnFillMode            = \"RasterFill\"     ; activate raster mode\n  res@lbLabelAutoStride     = True             ; let NCL figure lb stride\n\n;************************************************\n; Turn on lat / lon labeling\n;************************************************\n;;res@pmTickMarkDisplayMode = \"Always\"         ; turn on tickmarks\n\n  dimll = dimsizes(lat2d)\n  nlat  = dimll(0)\n  mlon  = dimll(1)\n\n  res@mpProjection          = projection\n  res@mpLimitMode           = \"Corners\"  \n  res@mpLeftCornerLatF      = lat2d(0,0)\n  res@mpLeftCornerLonF      = lon2d(0,0)\n  res@mpRightCornerLatF     = lat2d(nlat-1,mlon-1)\n  res@mpRightCornerLonF     = lon2d(nlat-1,mlon-1)\n\n  res@mpCenterLonF          = f->LoV          ; set center logitude         \n                                    \n  if (projection.eq.\"LambertConformal\") then    \n      res@mpLambertParallel1F   = f->Latin1    \n      res@mpLambertParallel2F   = f->Latin2   \n      res@mpLambertMeridianF    = f->LoV     \n  end if\n\n  res@mpFillOn              = False            ; turn off map fill\n  res@mpOutlineDrawOrder    = \"PostDraw\"       ; draw continental outline last\n  res@mpOutlineBoundarySets = \"GeophysicalAndUSStates\" ; state boundaries\n\n;;res@tfDoNDCOverlay        = True             ; True only for 'native' grid\n  res@gsnAddCyclic          = False            ; data are not cyclic\n\n;************************************************\n; allocate array for 3 plots\n;************************************************\n  plts                      = new (3,\"graphic\")   \n\n;************************************************\n; Tell NCL not to draw or advance frame for individual plots\n;************************************************\n  res@gsnDraw               = False            ; (a) do not draw \n  res@gsnFrame              = False            ; (b) do not advance 'frame'\n\n  plts(0)                   = gsn_csm_contour_map(wks,use,res)\n  plts(1)                   = gsn_csm_contour_map(wks,stl,res)\n  plts(2)                   = gsn_csm_contour_map(wks,sbl,res)\n;************************************************\n; create panel: panel plots have their own set of resources\n;************************************************\n  resP                  = True                   ; modify the panel plot\n  resP@txString         = \"Land Use and Soil Type\"     \n  resP@gsnMaximize      = True                   ; maximize panel area\n  resP@gsnPanelRowSpec  = True                   ; specify 1 top, 2 lower level  \n  gsn_panel(wks,plts,(/1,2/),resP)               ; now draw as one plot\n\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/WRF_track_1.ncl",
    "content": ";********************************************************\n; Plot storm stracks from wrfout files.\n;********************************************************\n;\n; JUN-18-2005 \n; So-Young Ha (MMM/NCAR)\n; SEP-01-2006\n; Slightly modified by Mary Haley to add some extra comments.\n; ===========================================\n\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRF_contributed.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl\"\n\n\nbegin\n\n; DATES\n  date = (/1512,1600,1612,1700,1712,1800,1812,1900/)\n  ndate = dimsizes(date)\n\n  sdate = sprinti(\"%4.0i\",date)\n\n; Experiment name (for legend)\n  EXP = (/\"EXP_I\"/)                ; (/\"EXP_I\",\"EXP_II\",\"EXP_III\"/)\n  nexp = dimsizes(EXP)\n\n; To get lat/lon info.\n\n  a = addfile(\"wrfout_d01_2003-07-15_00:00:00.nc\",\"r\")\n\n  lat2d = a->XLAT(0,:,:)\n  lon2d = a->XLONG(0,:,:)\n  dimll = dimsizes(lat2d)\n  nlat  = dimll(0)\n  mlon  = dimll(1)\n\n; Sea Level Pressure\n  slp = wrf_user_getvar(a,\"slp\",0)\n  dims = dimsizes(slp)\n\n; Array for track\n  time = new(ndate,string)\n  imin = new(ndate,integer)\n  jmin = new(ndate,integer)\n  smin = new(ndate,integer)\n\n; =======\n;  ndate\n; =======\n  fs = systemfunc(\"ls wrfout*00\")\n  nfs= dimsizes(fs)\n  if(nfs .ne. ndate) then\n     print(\"Check input data:\"+nfs+\" .ne. \"+ndate)\n  end if\n\n  do ifs=0,nfs-1\n    f = addfile(fs(ifs)+\".nc\",\"r\")\n    time(ifs) = wrf_user_list_times(f)\n;    print(time(ifs))\n    slp2d = wrf_user_getvar(f,\"slp\",0)\n\n; We need to convert 2-D array to 1-D array to find the minima.\n    slp1d     = ndtooned(slp2d)\n    smin(ifs) = minind(slp1d)\n\n; Convert the index for 1-D array back to the indeces for 2-D array.\n    minij     = ind_resolve(ind(slp1d.eq.min(slp2d)),dims)\n    imin(ifs) = minij(0,0)\n    jmin(ifs) = minij(0,1)\n\n;    print(time(ifs)+\" : \"+min(slp2d)+\" (\"+imin(ifs)+\",\"+jmin(ifs)+\")\")\n  end do\n;\n\n; Graphics section\n\n  wks=gsn_open_wks(\"ps\",\"track\")              ; Open PS file.\n  gsn_define_colormap(wks,\"BlGrYeOrReVi200\")  ; Change color map.\n\n  res                     = True\n  res@gsnDraw             = False             ; Turn off draw.\n  res@gsnFrame            = False             ; Turn off frame advance.\n  res@gsnMaximize         = True              ; Maximize plot in frame.\n\n  res@tiMainString = \"Hurricane Isabel\"       ; Main title\n\n  WRF_map_c(a,res,0)                          ; Set up map resources\n                                              ;    (plot options)\n  plot = gsn_csm_map(wks,res)                 ; Create a map.\n\n; Set up resources for polymarkers.\n  gsres                = True\n  gsres@gsMarkerIndex  = 16                  ; filled dot\n  ;gsres@gsMarkerSizeF = 0.005               ; default - 0.007\n  cols                  = (/5,160,40/)\n\n; Set up resources for polylines.\n  res_lines                      = True\n  res_lines@gsLineThicknessF     = 3.           ; 3x as thick\n\n  dot  = new(ndate,graphic)    ; Make sure each gsn_add_polyxxx call\n  line = new(ndate,graphic)    ; is assigned to a unique variable.\n\n; Loop through each date and add polylines to the plot.\n  do i = 0,ndate-2\n     res_lines@gsLineColor           = cols(0)\n     xx=(/lon2d(imin(i),jmin(i)),lon2d(imin(i+1),jmin(i+1))/)\n     yy=(/lat2d(imin(i),jmin(i)),lat2d(imin(i+1),jmin(i+1))/)\n     line(i) = gsn_add_polyline(wks,plot,xx,yy,res_lines)\n  end do\n\n  lon1d = ndtooned(lon2d)\n  lat1d = ndtooned(lat2d)\n\n; Loop through each date and add polymarkers to the plot.\n  do i = 0,ndate-1\n     print(\"dot:\"+lon1d(smin(i))+\",\"+lat1d(smin(i)))\n     gsres@gsMarkerColor  = cols(0)\n     dot(i)=gsn_add_polymarker(wks,plot,lon1d(smin(i)),lat1d(smin(i)),gsres)\n  end do\n\n; Date (Legend)\n  txres               = True\n  txres@txFontHeightF = 0.015\n  txres@txFontColor   = cols(0)\n\n  txid1 = new(ndate,graphic)\n; Loop through each date and draw a text string on the plot.\n  do i = 0, ndate-1\n     txres@txJust = \"CenterRight\"\n     ix = smin(i) - 4\n     print(\"Eye:\"+ix)\n     if(i.eq.1) then\n        txres@txJust = \"CenterLeft\"\n        ix = ix + 8\n     end if\n     txid1(i) = gsn_add_text(wks,plot,sdate(i),lon1d(ix),lat1d(ix),txres)\n  end do\n\n; Add marker and text for legend. (Or you can just use \"pmLegend\" instead.)\n  txres@txJust = \"CenterLeft\"\n\n  txid2 = new(nexp,graphic)\n  pmid2 = new(nexp,graphic)\n  do i = 0,nexp-1\n     gsres@gsMarkerColor  = cols(i)\n     txres@txFontColor    = cols(i)\n     ii = ((/129,119,109/))  ; ilat\n     jj = ((/110,110,110/))  ; jlon\n     ji = ii*mlon+jj         ; col x row\n     pmid2(i) = gsn_add_polymarker(wks,plot,lon1d(ji(i)),lat1d(ji(i)),gsres)\n     txid2(i) = gsn_add_text(wks,plot,EXP(i),lon1d(ji(i)+5),lat1d(ji(i)),txres)\n  end do\n\n  draw(plot)\n  frame(wks)\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/cru_8.ncl",
    "content": ";*****************************************************\n; cru_8.ncl\n;\n; Concepts illustrated:\n;   - Plotting CRU (Climate Research Unit)/ BADC data\n;   - Selecting a sub-period\n;   - calculating a climatology\n;   - Drawing raster contours; very basic graphics\n;\n;*****************************************************\n\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"    ; not needed 6.20 onward \nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\"   \nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl\"\n\n; create references (pointers) to the files\n\n  diri = \"./\"\n  fcld = addfile(diri+\"cru_ts3.21.1901.2012.cld.dat.nc\", \"r\")\n  fdtr = addfile(diri+\"cru_ts3.21.1901.2012.dtr.dat.nc\", \"r\")\n  ffrs = addfile(diri+\"cru_ts3.21.1901.2012.frs.dat.nc\", \"r\")\n  fpet = addfile(diri+\"cru_ts3.21.1901.2012.pet.dat.nc\", \"r\")\n  fpre = addfile(diri+\"cru_ts3.21.1901.2012.pre.dat.nc\", \"r\")\n  ftmn = addfile(diri+\"cru_ts3.21.1901.2012.tmn.dat.nc\", \"r\")\n  ftmp = addfile(diri+\"cru_ts3.21.1901.2012.tmp.dat.nc\", \"r\")\n  ftmx = addfile(diri+\"cru_ts3.21.1901.2012.tmx.dat.nc\", \"r\")\n  fvap = addfile(diri+\"cru_ts3.21.1901.2012.vap.dat.nc\", \"r\")\n  fwet = addfile(diri+\"cru_ts3.21.1901.2012.wet.dat.nc\", \"r\")\n\n; specify start & last dates (arbitrary)\n\n  ymStrt = 199101\n  ymLast = 200012\n  \n; get index values of start/lat dates\n\n  time   = fcld->time\n  yyyymm = cd_calendar(time, -1)\n  \n  ntStrt = ind(yyyymm.eq.ymStrt)   ; index values\n  ntLast = ind(yyyymm.eq.ymLast)\n  \n; read time segment\n\n  cld    = fcld->cld(ntStrt:ntLast,:,:)\n  dtr    = fdtr->dtr(ntStrt:ntLast,:,:)\n  frs    = ffrs->frs(ntStrt:ntLast,:,:) \n  pet    = fpet->pet(ntStrt:ntLast,:,:)  \n  pre    = fpre->pre(ntStrt:ntLast,:,:) \n  tmn    = ftmn->tmn(ntStrt:ntLast,:,:) \n  tmp    = ftmp->tmp(ntStrt:ntLast,:,:)      \n  tmx    = ftmx->tmx(ntStrt:ntLast,:,:)   \n  vap    = fvap->vap(ntStrt:ntLast,:,:) \n  wet    = fwet->wet(ntStrt:ntLast,:,:) \n  \n  printVarSummary(cld)        ;  [time | 120] x [lat | 360] x [lon | 720]\n  \n; calculate monthly climatologies\n\n  cldclm = clmMonTLL(cld)     \n  dtrclm = clmMonTLL(dtr)\n  frsclm = clmMonTLL(frs)\n  petclm = clmMonTLL(pet)\n  preclm = clmMonTLL(pre)\n  tmnclm = clmMonTLL(tmn)\n  tmpclm = clmMonTLL(tmp)\n  tmxclm = clmMonTLL(tmx)\n  vapclm = clmMonTLL(vap)\n  wetclm = clmMonTLL(wet)\n  \n    \n  printVarSummary(cldclm)     ;  [month | 12] x [lat | 360] x [lon | 720]\n \n;************************************\n; create plots ... very simple\n;************************************\n \n  nt     = 6                         \n  month  = \"July\"\n  yrStrt = ymStrt/100\n  yrLast = ymLast/100\n  title  = month+\": \"+yrStrt+\"-\"+yrLast\n\n  wks = gsn_open_wks(\"ps\",\"cru\")          ; open a ps  file\n  gsn_define_colormap(wks,\"ncl_default\")  ; choose colormap; not needed 6.20 onward \n  plot = new(2,graphic)                   ; create graphic array\n\n  res                      = True\n  res@cnFillOn             = True         ; turn on color fill; not needed 6.20 onward \n  res@cnFillMode           = \"RasterFill\" ; Raster Mode\n  res@cnLinesOn            = False        ; Turn off contour lines\n  \n  res@gsnDraw              = False        ; do not draw picture\n  res@gsnFrame             = False        ; do not advance frame\n  res@lbOrientation        = \"Vertical\"   ; vertical label bar\n  \n  resp                     = True\n  resp@gsnMaximize         = True         ; make ps, eps, pdf large\n\n  resp@txString            = title+\": CLD, FRS\"\n  plot(0)=gsn_csm_contour_map_ce(wks,cldclm(nt,:,:),res)\n  plot(1)=gsn_csm_contour_map_ce(wks,frsclm(nt,:,:),res)\n  gsn_panel(wks,plot,(/2,1/),resp)\n  \n  resp@txString            = title+\": PET, VAP\"\n  plot(0)=gsn_csm_contour_map_ce(wks,petclm(nt,:,:),res)\n  plot(1)=gsn_csm_contour_map_ce(wks,vapclm(nt,:,:),res)\n  gsn_panel(wks,plot,(/2,1/),resp)\n\n  resp@txString            = title+\": TMN, TMX\"\n  plot(0)=gsn_csm_contour_map_ce(wks,tmnclm(nt,:,:),res)\n  plot(1)=gsn_csm_contour_map_ce(wks,tmxclm(nt,:,:),res)\n  gsn_panel(wks,plot,(/2,1/),resp)\n\n  resp@txString            = title+\": TMP, DTR\"\n  plot(0)=gsn_csm_contour_map_ce(wks,tmpclm(nt,:,:),res)\n  plot(1)=gsn_csm_contour_map_ce(wks,dtrclm(nt,:,:),res)\n  gsn_panel(wks,plot,(/2,1/),resp)\n\n  resp@txString            = title+\": WET, PRE\"\n  plot(0)=gsn_csm_contour_map_ce(wks,wetclm(nt,:,:),res)\n\n ;colors = (/ ... /)             \n ;res@cnFillPalette    = colors                ; optional: distinct colors for categories\n  res@cnLevelSelectionMode = \"ExplicitLevels\"  ; use unequal spacing\n  res@cnLevels             = (/2.0,10,25,37.5,50,75,100,125,150,175,200,300,400,500,750/) \n\n  plot(1)=gsn_csm_contour_map_ce(wks,preclm(nt,:,:),res)\n  gsn_panel(wks,plot,(/2,1/),resp)\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/gsn_csm_xy2_time_series_inputs.ncl",
    "content": ";******************** Inputs Regarding Input and Output Data  *************************************\r\n\r\n;netCDFFilePath = \"NULL-MYD04_L2.051-MIL2ASAE.0022-AERONET_AOD_L2.2-20112106165049.nc\"\r\n;outputFilePath = \"plot-output\"\r\n\r\n;******************* Inputs Regarding Data Structure ***********************************************\r\n\r\n;lPlotVariablesList = \"mean_AERONET_AOD_L2_2_AOD0558intrp_Ames,mean_MIL2ASAE_0022_AOD0866b_Ames\"\r\n;rPlotVariablesList = \"medn_MYD04_L2_051_AOD0550dpbl_l_Ames\"\r\n\r\n;xDimName = \"time\"\r\n;xDimSize = 365\r\n\r\n;******************* Inputs Regarding the View Annotations ****************************************\r\n\r\n;title = \"MAPSS Time Series\"\r\n;yLAxisLabel = \"Mean AOD\"\r\n;yRAxisLabel = \"Median AOD\"\r\n\r\n;*******************END INPUTS ********************************************************************"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/hdf4sds_7.ncl",
    "content": "load \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\" \nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\" \nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl\" \n;**************************************************************\n; User Input\n;***************************************************************\n                                             ; INPUT\n   diri   = \"./\"                             ; input directory\n   fili   = \"wv_LV3_MET08_20050102_12345678_L00013712E00013712.hdf\"\n\n   pltDir  = \"./\"                        ; directory for plot output\n   sfx     = get_file_suffix(fili,1) \n  ;pltName = sfx@fBase                   ; output graphic name\n   pltName = \"hdf4sds\"\n   pltType = \"ps\"                                            \n\n;***************************************************************\n; End User Input\n;***************************************************************\n\n;***************************************************************\n; Open SEVIRI L3 'wv' HDF file\n;***************************************************************\n; Note the rather unusual data format: flag *prepended* to data value\n;***************************************************************\n;     integer twc_lv3 ( fakeDim0, fakeDim1 )\n;        long_name :    total water vapour column + flag\n;        units :        fmmmm\n;        format :       I4\n;        valid_range :  ( 10000, 38000 )\n;        _FillValue :   -99\n;        legend_01 :    f = flag\n;        legend_02 :    f = 1 averaged level 2 values\n;        legend_03 :    f = 2 interpolated from averaged level 2 values\n;        legend_04 :    f = 3 gaps filled with NVAP climatology\n;        legend_05 :    mmmm = water vapour column in mm * 100. as integer\n;        legend_06 :    Example: 11025 means: flag = 1, 10.25 mm water vapour column\n;        min_lat :      -74.75\n;        max_lat :      61.75\n;        min_lon :      -75.25\n;        max_lon :      75.25\n;        dlat : 0.5\n;        dlon : 0.5\n;---------------------------------------------------------------\n\n   f      = addfile (diri+fili, \"r\")\n   ifx    = f->twc_lv3                  ; fmmmm (integer)                     \n   printVarSummary(ifx)\n\n   flag   = ifx/10000                   ; extract flag\n   ix     = ifx - flag*10000            ; extract mmmm\n   x      = ix*0.01                     ; scale\n\n; create meta data for 'x'\n\n   dimx   = dimsizes(x)\n   nlat   = dimx(0)                     ; grid size x(nlat,mlon)\n   mlon   = dimx(1)\n\n   lat    = fspan(ifx@min_lat, ifx@max_lat, nlat)\n   lat@units = \"degrees_north\"\n   lon    = fspan(ifx@min_lon, ifx@max_lon, mlon)\n   lon@units = \"degrees_east\"\n\n   x!0    = \"lat\"\n   x!1    = \"lon\"\n   x&lat  =  lat\n   x&lon  =  lon\n   x@long_name = \"SEVIRI: Total Water Vapor\"\n   x@units     = \"mm\"\n\n   delete( [/ifx, ix/] )                ; no longer needed\n\n;***************************************************************\n; Create plot \n;***************************************************************\n   wks    = gsn_open_wks(pltType, pltDir+pltName)\n\n   plot   = new (2, \"graphic\")\n   \n   res                      = True     ; plot mods desired\n   res@gsnAddCyclic         = False    ; data noty global\n   res@gsnDraw              = False\n   res@gsnFrame             = False\n     \n   res@cnFillOn             = True     ; turn on color fill\n   res@cnLinesOn            = False    ; turn of contour lines\n   res@cnFillMode           = \"RasterFill\" ; Raster Mode\n   res@cnLinesOn            =  False       ; Turn off contour lines\n   res@cnLineLabelsOn       =  False       ; Turn off contour lines\n   res@cnMissingValFillColor= \"background\" ; \"foreground\"\n   \n   res@mpCenterLonF         = 0.5*(min(x&lon) + max(x&lon))\n   res@mpMinLatF            = min(x&lat)\n   res@mpMaxLatF            = max(x&lat)\n   res@mpMinLonF            = min(x&lon)\n   res@mpMaxLonF            = max(x&lon)\n\n  ;res@lbOrientation        = \"Vertical\"\n\n   plot(0) = gsn_csm_contour_map_ce(wks,x, res)\n\n; plot flag\n\n   copy_VarCoords(x, flag)\n   flag@long_name = \"Flag\"\n   flag@units     = \"1=avg(L2), 2=int(L2), 3=NVAP\"\n   print(flag&lat+\"   \"+flag(:,{30}))\n\n   res@cnLevelSelectionMode = \"ManualLevels\"     ; set manual contour levels\n   res@cnMinLevelValF       =   2                ; set min contour level\n   res@cnMaxLevelValF       =   3                ; one less than max\n   res@cnLevelSpacingF      =   1                ; set contour spacing\n \n   res@lbLabelStrings       = ispan(1,3,1)       ; 1, 2, 3\n   res@lbLabelPosition      = \"Center\"           ; label position\n   res@lbLabelAlignment     = \"BoxCenters\"\n \n   res@gsnLeftString        = \"\"\n   res@gsnRightString       = \"\"\n   res@gsnCenterString      = \"flag: 1=avg(L2), 2=int(L2), 3=NVAP\"\n\n   plot(1) = gsn_csm_contour_map_ce(wks,flag, res)\n\n   resP                     = True                ; modify the panel plot\n   resP@txString            = fili\n   resP@gsnMaximize         = True \n   gsn_panel(wks,plot,(/1,2/),resP)               ; now draw as one plot\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/mask_12.ncl",
    "content": ";----------------------------------------------------------------------\n; mask_12.ncl\n;\n; Concepts illustrated:\n;   - Using a worldwide shapefile to create a land/ocean mask\n;   - Masking a data array based on a geographical area\n;   - Attaching shapefile polylines to a map plot\n;   - Attaching lat/lon points to a map using gsn_coordinates\n;----------------------------------------------------------------------\n; Downloaded GSHHS shapefiles from:\n;\n;  http://www.ngdc.noaa.gov/mgg/shorelines/data/gshhg/latest/\n;\n; Used the \"coarsest\" one: \"GSHHS_shp/c/GSHHS_c_L1.shp\".\n;----------------------------------------------------------------------\n\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl\"\nload \"./shapefile_mask_data.ncl\"\n\n;----------------------------------------------------------------------\n; Main code\n;----------------------------------------------------------------------\nbegin\n  WRITE_MASK = True\n  DEBUG      = False\n\n;---Read data to plot and mask\n  dir        = \"$NCARG_ROOT/lib/ncarg/data/cdf/\"\n  cdf_prefix = \"uv300\"\n  cdf_file   = dir + cdf_prefix + \".nc\"\n  fin        = addfile(cdf_file,\"r\")\n  u          = fin->U(1,:,:)\n;\n; Create a mask array the same size as \"u\", using\n; lat/lon data read off a shapefile.\n;\n  shpfile   = \"GSHHS_shp/c/GSHHS_c_L1.shp\"\n  opt             = True\n  opt@return_mask = True\n\n  land_mask = shapefile_mask_data(u,shpfile,opt)\n\n;---Mask \"u\" against land and ocean.\n  u_land_mask  = where(land_mask.eq.1,u,u@_FillValue)\n  u_ocean_mask = where(land_mask.eq.0,u,u@_FillValue)\n  copy_VarMeta(u,u_land_mask)\n  copy_VarMeta(u,u_ocean_mask)\n\n;---Start the graphics\n  wks = gsn_open_wks(\"ps\",\"mask\")\n\n  res                       = True\n\n  res@gsnMaximize           = True           ; maximize plot in frame\n  res@gsnDraw               = False          ; don't draw plot yet\n  res@gsnFrame              = False          ; don't advance frame yet\n\n  res@cnFillOn              = True\n  res@cnLineLabelsOn        = False\n  res@cnLinesOn             = False\n\n;---Make sure both plots have same contour levels\n  mnmxint                   = nice_mnmxintvl(min(u),max(u),25,False)\n  res@cnLevelSelectionMode  = \"ManualLevels\"\n  res@cnMinLevelValF        = mnmxint(0)\n  res@cnMaxLevelValF        = mnmxint(1)\n  res@cnLevelSpacingF       = mnmxint(2)\n\n  res@lbLabelBarOn          = False\n  res@gsnAddCyclic          = False\n\n  res@mpFillOn              = False\n  res@mpOutlineOn           = False\n\n  res@gsnRightString        = \"\"\n  res@gsnLeftString         = \"\"\n\n;---Create plot of original data and attach shapefile outlines\n  res@tiMainString         = \"Original data with shapefile outlines\"\n  map_data = gsn_csm_contour_map(wks,u,res)\n  dum1     = gsn_add_shapefile_polylines(wks,map_data,shpfile,False)\n\n;---Create plots of masked data\n  res@tiMainString         = \"Original data masked against land\"\n  map_land_mask  = gsn_csm_contour_map(wks,u_land_mask,res)\n  res@tiMainString         = \"Original data masked against ocean\"\n  map_ocean_mask = gsn_csm_contour_map(wks,u_ocean_mask,res)\n\n  if(DEBUG) then\n    mkres                 = True\n;    mkres@gsMarkerSizeF   = 0.007\n    mkres@gsnCoordsAttach = True\n    gsn_coordinates(wks,map_data,u,mkres)\n    mkres@gsnCoordsNonMissingColor = \"yellow\"\n    mkres@gsnCoordsMissingColor    = \"black\"\n    gsn_coordinates(wks,map_land_mask,u_land_mask,mkres)\n    gsn_coordinates(wks,map_ocean_mask,u_ocean_mask,mkres)\n  end if\n\n;---Add shapefile outlines\n  dum2 = gsn_add_shapefile_polylines(wks,map_land_mask,shpfile,False)\n  dum3 = gsn_add_shapefile_polylines(wks,map_ocean_mask,shpfile,False)\n\n;---Draw all three plots on one page\n  pres                  = True\n  pres@gsnMaximize      = True\n  pres@gsnPanelLabelBar = True\n  gsn_panel(wks,(/map_data,map_land_mask,map_ocean_mask/),(/3,1/),pres)\n\n  if(WRITE_MASK) then\n    delete(fin)     ; Close file before we open again.\n;\n; Make copy of file so we don't overwrite original.\n; This is not necessary, but it's safer.\n;\n    new_cdf_file = cdf_prefix + \"_with_mask.nc\"\n    system(\"/bin/cp \" + cdf_file + \" \" + new_cdf_file)\n    finout = addfile(new_cdf_file,\"w\")\n    filevardef(finout, \"land_mask\", typeof(land_mask), (/ \"lat\", \"lon\" /) )\n    finout->land_mask = (/land_mask/)\n  end if\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/mcsst_1.ncl",
    "content": ";*****************************************************\n; mcsst_1.ncl\n;\n; Concepts illustrated:\n;   - Plotting NAVO MCSST data\n;   - Using fbindirread to read in fortran binary data\n;   - Converting \"byte\" data to \"float\"\n;   - Adding meta data (attributes and coordinates) to a variable\n;   - Adding gray to an existing color map\n;   - Spanning all but the last two colors in a color map for contour fill\n;   - Drawing raster contours\n;\n;*****************************************************\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\"\n;***************************************\n; type of data available on file\n;***************************************\n; ipar=0  Weekly Binned Sea Surface Temperature \n; ipar=1  Number of Points in Bin \n; ipar=2  Weekly Binned Sea Surface Temperature Anomaly \n; ipar=3  Interpolated Sea Surface Temperature \n; ipar=4  Interpolated Sea Surface Temperature Anomaly \n;***************************************\nbegin\n  ipar  = 3\n  fname = \"2001311d18N16.dat\"\n  tmp   = fbindirread(fname,ipar,(/1024,2048/),\"byte\")\n;***************************************\n; convert to float and then change to true SST\n;***************************************\n  xslope = 0.15\n  if(ipar.eq.4.or.ipar.eq.2)then               ; anom has different intercept\n    yint = -20.0\n  end if\n  if(ipar.eq.3.or.ipar.eq.0)then\n    yint = -3.0 \n  end if\n  sst  = new((/1024,2048/),\"float\")            ; create float var\n  sst  = tmp*xslope+yint                       ; convert to float\n  delete(tmp)                                  ; delete unecessary array\n;***************************************\n; assign missing values. The original missing value was zero, but since it was\n; not assigned in NCL, it was not recognized. The new missing values are \n; listed below. These will be changed later.\n;***************************************\n  if(ipar.eq.4)then\n     sst@_FillValue = -20                    \n  end if\n  if(ipar.eq.3.or.ipar.eq.0)then\n     sst@_FillValue = -3                     \n  end if\n;***************************************\n;   create coordinate variables\n;***************************************\n  nlat      = 1024\n  dy        = 180./nlat\n  lat       = (90. -(ispan(0,1023,1)*dy))-dy/2\n  lat!0     = \"lat\"\n  lat&lat   = lat\n  lat@units = \"degrees_north\"\n\n  nlon      = 2048\n  dx        = 360./nlon\n  lon       = (ispan(0,2047,1)*dx)+dx/2-180. ; note -180. added by sjm to align\n  lon!0     = \"lon\"\n  lon&lon   = lon\n  lon@units = \"degrees_east\"   \n;***************************************\n;   fill out the netCDF data model\n;***************************************\n  sst!0          = \"lat\"               ; name dimensions\n  sst!1          = \"lon\"               ; ditto\n  sst            = sst(::-1,:)         ; reverse lat orientation\n  sst@long_name  = \"NAVO MCSST\"        ; assign long_name\n  sst@units      = \"deg C\"             ; assign units\n  sst&lat        = lat                 ; assign lat cv\n  sst&lon        = lon\t               ; assign lon cv\n  sst@_FillValue = -999.               ; assign missing value   \n;***************************************\n;   get year and day from filename\n;***************************************\n  res   = True                          ; plot mods desired\n  title = stringtochar(fname)           ; parse file name to get date\n  year  = title(0:3)\n  jday  = title(4:6)\n  res@gsnCenterString = year+\" \"+jday   ; create center string\n;***************************************\n;   create plot\n;***************************************\n  wks  = gsn_open_wks(\"ps\",\"mcsst\")    ; open workstation (plot destination)\n  gsn_define_colormap(wks,\"BlGrYeOrReVi200\") ; choose colormap  \n;\n; This will not be necessary in V6.1.0 and later. Named colors can\n; be used without having to first add them to the color map.\n;\n  d    = NhlNewColor(wks,0.8,0.8,0.8)   ; add gray to colormap\n\n\n  res@cnFillOn             = True        ; turn on color\n  res@gsnSpreadColors      = True        ; use full range of colormap\n  res@gsnSpreadColorStart  = 2           ; start at color 2\n  res@gsnSpreadColorEnd    = -3          ; don't use added gray\n  res@cnLinesOn            = False       ; no contour lines\n  res@cnFillDrawOrder      = \"PreDraw\"   ; draw contours before continents\n  res@gsnMaximize          = True        ; maximize plot\n\n\n; For a grid this size, it is better to use raster mode. It will be \n; significantly faster, and will not go over NCL's 16mb default plot size.\n  res@cnFillMode           = \"RasterFill\"       ; turn on raster mode\n\n  plot = gsn_csm_contour_map_ce(wks,sst,res) ; contour the variable\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/primero.ncl",
    "content": "val=102\na=val/4.\nprint(a)\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/topo_9.ncl",
    "content": ";----------------------------------------------------------------------\n; topo_9.ncl\n;\n; Concepts illustrated:\n;   - Recreating a jpeg topographic image as an NCL map object\n;   - Zooming in on a jpeg image\n;   - Drawing a box around an area of interest on a map\n;   - Attaching polylines to a map\n;   - Using \"overlay\" to overlay multiple contour plots\n;   - Using more than 256 colors per frame\n;   - Using functions for cleaner code\n;----------------------------------------------------------------------\n; NOTE: This example will only work with NCL V6.1.0 and later.\n;\n; This script recreates a JPEG image that was converted to a NetCDF\n; file with color separated bands using the open source tool\n; \"gdal_translate\":\n;\n;  gdal_translate -ot Int16 -of netCDF EarthMap_2500x1250.jpg \\\n;           EarthMap_2500x1250.nc\n;----------------------------------------------------------------------\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"   \nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\"   \n\n;----------------------------------------------------------------------\n; This function imports a JPEG image that's on the whole globe,\n; and recreates it as an NCL map object that is zoomed in on the\n; southern tip of Africa.\n;----------------------------------------------------------------------\nundef(\"recreate_jpeg_image\")\nfunction recreate_jpeg_image(wks,minlat,maxlat,minlon,maxlon)\nbegin\n  orig_jpg_filename = \"EarthMap_2500x1250.jpg\"\n  nc_filename       = \"EarthMap_2500x1250.nc\"\n\n;--You could use a system call to do the NetCDF conversion\n;  cmd = \"gdal_translate -ot Int16 -of netCDF \" + jpeg_filename + \\\n;         \" \" + nc_filename)\n;  system(cmd)\n\n;---Read the three bands of data\n  f     = addfile(nc_filename,\"r\")\n  Band1 = where(f->Band1.gt.255, 255, f->Band1)  ; red channel\n  Band2 = where(f->Band2.gt.255, 255, f->Band2)  ; green channel\n  Band3 = where(f->Band3.gt.255, 255, f->Band3)  ; blue channel\n\n  band_dims = dimsizes(Band3)\n  nlat      = band_dims(0)\n  nlon      = band_dims(1)\n  print(\"dimensions of image = \" + nlat + \" x \" + nlon)\n\n;\n; Add lat/lon data so we can overlay on a map, and/or \n; overlay contours. We know the image is global,\n; cylindrical equidistant, and centered about lon=0.\n;\n  lat       = fspan( -90, 90,nlat)\n  lon       = fspan(-180,180,nlon)\n  lat@units = \"degrees_north\"\n  lon@units = \"degrees_east\"\n\n  Band1!0   = \"lat\"\n  Band1!1   = \"lon\"\n  Band2!0   = \"lat\"\n  Band2!1   = \"lon\"\n  Band3!0   = \"lat\"\n  Band3!1   = \"lon\"\n  Band1&lat = lat\n  Band1&lon = lon\n  Band2&lat = lat\n  Band2&lon = lon\n  Band3&lat = lat\n  Band3&lon = lon\n\n  res                 = True\n\n  res@gsnMaximize     = True\n\n  res@gsnFrame        = False        ; Don't draw or advance\n  res@gsnDraw         = False        ; frame yet.\n\n  res@cnFillOn        = True         \n  res@cnFillMode      = \"RasterFill\" ; Raster fill can be faster\n\n  res@cnLevelSelectionMode  = \"EqualSpacedLevels\"\n  res@cnMaxLevelCount       = 254  \n  res@cnFillBackgroundColor = (/ 1., 1., 1., 1./)\n\n  res@cnLinesOn       = False              ; Turn off contour lines      .\n  res@cnLineLabelsOn  = False              ; Turn off contour labels\n  res@cnInfoLabelOn   = False              ; Turn off info label\n  res@lbLabelBarOn    = False              ; Turn off labelbar\n  res@gsnRightString  = \"\"                 ; Turn off subtitles\n  res@gsnLeftString   = \"\"\n  res@pmTickMarkDisplayMode    = \"Always\"\n\n;---Construct RGBA colormaps...\n  ramp   = fspan(0., 1., 255)\n  reds   = new((/255, 4/), float)\n  greens = new((/255, 4/), float)\n  blues  = new((/255, 4/), float)\n\n  reds   = 0\n  greens = 0\n  blues  = 0\n\n  reds(:,0)   = ramp\n  greens(:,1) = ramp\n  blues(:,2)  = ramp\n\n  ; The red contour map is plotted fully opaque; the green and blue\n  ; are plotted completely transparent. When overlain, the colors \n  ; combine (rather magically).\n  reds(:,3)   = 1.\n  greens(:,3) = 0 \n  blues(:,3)  = 0\n\n  res@cnFillColors = greens \n  greenMap = gsn_csm_contour(wks, Band2, res) \n\n  res@cnFillColors = blues\n  blueMap = gsn_csm_contour(wks, Band3, res) \n \n;---This will be our base, so make it a map plot.\n  res@cnFillColors             = reds \n  res@gsnAddCyclic             = False\n\n  res@mpFillOn                 = False  \n\n;---Zoom in on area of interest\n  res@mpMinLatF                = minlat\n  res@mpMaxLatF                = maxlat\n  res@mpMinLonF                = minlon\n  res@mpMaxLonF                = maxlon\n\n  redMap = gsn_csm_contour_map(wks, Band1, res) \n\n;---Overlay everything to create the topo map\n  overlay(redMap, greenMap)\n  overlay(redMap, blueMap)\n\n  return(redMap)\nend\n\n;----------------------------------------------------------------------\n; Main code\n;----------------------------------------------------------------------\nbegin\n;---Recreating jpeg images only works for X11 and PNG.\n  wks = gsn_open_wks(\"png\",\"topo\")\n\n;---Southern part of Africa\n  minlat = -40\n  maxlat =  5\n  minlon = 10\n  maxlon = 40\n\n  map = recreate_jpeg_image(wks,minlat,maxlat,minlon,maxlon)\n\n;---Overlay a red box\n  lonbox = (/ 15, 35, 35, 15, 15/)\n  latbox = (/-30,-30,-10,-10,-30/)\n\n  lnres                  = True\n  lnres@gsLineColor      = \"red\" ; red box \n  lnres@gsLineThicknessF = 4.0   ; make box thicker\n  box = gsn_add_polyline(wks,map,lonbox,latbox,lnres)\n\n  draw(map)       ; Drawing the map will draw the red box\n  frame(wks)\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/traj_3.ncl",
    "content": ";*************************************************\n; traj_3.ncl\n;*************************************************\nload          \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"\nexternal TRAJ \"./particle.so\"\n;*************************************************\nbegin\n\n  path  = \"./data.asc\"\n  data  = asciiread(path,(/500,6/),\"float\")\n;*************************************************\n; some parameters\n;*************************************************\n  np = 1\n  nq = 500\n  ncor= 8\n  xrot   = new((/np,nq/),float)\n  yrot   = new((/np,nq/),float)\n  xaxis  = new(ncor,float)\n  yaxis  = new(ncor,float)\n;**************************************************\n; convert data into rotated format\n;**************************************************\n  TRAJ::particle(path,xrot,yrot,nq,np,xaxis,yaxis,ncor)\n;**************************************************\n; create plot\n;**************************************************\n  wks = gsn_open_wks(\"ps\",\"traj\")      ; Open an ps file\n\n  xyres = True\n  xyres@gsnFrame     = False      ; don't advance the frame\n  xyres@gsnDraw      = False      ; don't draw indivdual plots\n  xyres@tmXTBorderOn = False      ; don't draw top axis\n  xyres@tmXBBorderOn = False      ; don't draw bottom axis\n  xyres@tmYRBorderOn = False      ; don't draw right axis\n  xyres@tmYLBorderOn = False      ; don't draw left axis\n  xyres@tmXTOn       = False      ; don't draw top-axis tick marks \n  xyres@tmXBOn       = False      ; don't draw bottom-axis tick marks\n  xyres@tmYROn       = False      ; don't draw right-axis tick marks\n  xyres@tmYLOn       = False      ; don't draw left-axis tick marks\n\n  xyres@xyLineColors      = (/\"red\"/)    ; set the line color to red\n  xyres@xyLineThicknessF  = 4.0          ; 4 times the line thickness \n\n  xyres@trXMaxF      =  15000            ; choose range of axis even though\n  xyres@trXMinF      = -10000            ; we don't see them\n  xyres@trYMaxF      =  1000\n  xyres@trYMinF      = -1000\n\n  plot = gsn_xy(wks,xrot,yrot,xyres)     ; Draw trajectory\n;**********************************************\n; create arrays needed for the bounding box\n;**********************************************\n  a1 = new(5,float)\n  b1 = new(5,float)\n  a2 = new(5,float)\n  b2 = new(5,float)\n  a3 = new(2,float)\n  b3 = new(2,float)\n  a4 = new(2,float)\n  b4 = new(2,float)\n  a5 = new(2,float)\n  b5 = new(2,float)\n  a6 = new(2,float)\n  b6 = new(2,float)\n  a0 = new(2,float)\n  b0 = new(2,float)\n;**********************************************\n; determine values of each bounding line from information\n; returned from particle.f\n;**********************************************\n  a1(0:3) = xaxis(:3)             \n  b1(0:3) = yaxis(:3)\n  a1(4)   = xaxis(0)\n  b1(4)   = yaxis(0)\n\n  a2(0:3) = xaxis(4:)\n  b2(0:3) = yaxis(4:) \n  a2(4)   = xaxis(4)\n  b2(4)   = yaxis(4) \n\n  a3      = xaxis(0:4:4)\n  b3      = yaxis(0:4:4) \n  a4      = xaxis(1:5:4)\n  b4      = yaxis(1:5:4)\n \n  a5      = xaxis(2:6:4)\n  b5      = yaxis(2:6:4) \n  a6      = xaxis(3:7:4)\n  b6      = yaxis(3:7:4) \n\n  a0(0)   = xaxis(3)\n  b0(0)   = yaxis(3)\n  a0(1)   = xrot(0,0)\n  b0(1)   = yrot(0,0)\n;*************************************************************** \n; create bounding box by drawing multiple xy plots on top of\n; each other. each with their individual axis turned off.\n;***************************************************************\n  xyres@xyLineColors      =  (/\"black\"/)   ; line color \n  xyres@xyLineThicknessF  = 1.0            ; regular line thickness \n\n  bottom = gsn_xy(wks,a1,b1,xyres) ; Draw the bottom bounding box.\n  top    = gsn_xy(wks,a2,b2,xyres) ; Draw the top bounding box.\n  side1  = gsn_xy(wks,a3,b3,xyres) ; Draw a side line.\n  side2  = gsn_xy(wks,a4,b4,xyres) ; Draw a side line.\n  side3  = gsn_xy(wks,a5,b5,xyres) ; Draw a side line.\n  side4  = gsn_xy(wks,a6,b6,xyres) ; Draw a side line.\n;*************************************************************** \n; now draw a large brown line to represent the chimney\n;***************************************************************\n  xyres@xyLineColors      = (/\"brown\"/)   ; chimney color\n  xyres@xyLineThicknessF  = 9.0           ; thick line \n  xyres@tiMainString      = \"Pollutant Trajectory in a 3D Volume\"\n  chimney = gsn_xy(wks,a0,b0,xyres)       ; Draw the chimney.\n\n  draw(wks)\n  frame(wks)\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/tsdiagram_1.ncl",
    "content": "; Read potential temp (TEMP), salinity (SALT)\n; Compute potential density (PD) for specified range PD(t,s)\n; (use ncl function based on Yeager's algorithm for rho computation)\n; Assumes annual and zonally avgeraged input data set (i.e, one time slice)\n; Used K.Lindsay's \"za\" for zonal avg -- already binned into basins\n; Plots temp vs salt (scatter plot), pd overlay\n\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"  \nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\"  \nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl\"  \nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl\"  \n\nbegin\n; ================================>  ; PARAMETERS\n  case    = \"PHC2_gx1v3\"\n  ocnfile = \"za_PHC2_T_S_gx1v3.nc\"\n\n  depth_min = 14895.82   ; in cm, depth of first layer to be included \n  depth_max =  537499.9\n;\n; plot limits\n;\n  smincn = 32.5 \n  smaxcn = 37.0\n  tmincn = -2.\n  tmaxcn = 22.\n;\n; Choose basin index\n;\n; 0 = global  1 = southern ocean 2 = pacific 3 = indian 6 = atlantic \n; 8 = labrador 9 = GIN 10 = arctic\n;\n  bi = 2 \n\n;=====> basin check \n\n  if(bi.lt.0.or.bi.gt.10) then\n    print(\"basin index \"+ bi + \" not supported\")\n    exit\n  end if\n\n  if(bi.eq.0) then\n    basin = \"Global\"\n    blab = \"global\"\n  end if\n  if(bi.eq.1) then\n      basin = \"Southern Ocean\"\n      blab = \"so\"\n  end if\n  if(bi.eq.2) then\n    basin = \"Pacific Ocean\"\n    blab = \"pacific\"\n  end if\n  if(bi.eq.3) then\n    basin = \"Indian Ocean\"\n    blab = \"indian\"\n  end if\n  if(bi.eq.6) then\n    basin = \"Atlantic Ocean\"\n    blab = \"atlanticn\"\n  end if\n  if(bi.eq.8) then\n    basin = \"Labrador Sea\"\n    blab = \"lab\"\n  end if\n  if(bi.eq.9) then\n    basin = \"GIN Sea\"\n    blab = \"gin\"\n  end if\n  if(bi.eq.10) then\n    basin = \"Arctic Ocean\"\n    blab = \"arctic\"\n  end if\n\n;=====> initial resource settings\n\n  wks = gsn_open_wks(\"ps\",\"tsdiagram\")    ; Open a Postscript file\n\n;===== data \n  focn = addfile(ocnfile, \"r\")\n  salt = focn->SALT(0,:,{depth_min:depth_max},:)   ;(basins, z_t, lat_t)\n  temp = focn->TEMP(0,:,{depth_min:depth_max},:)\n\n;====section out choice basin\n  temp_ba = temp(bi,:,:)\n  salt_ba = salt(bi,:,:)\n\n;===== put into scatter array format\n  tdata_ba = ndtooned(temp_ba)\n  sdata_ba = ndtooned(salt_ba)\n\n  ydata = tdata_ba\n  xdata = sdata_ba\n\n;============== compute potenial density (PD), using rho_mwjf\n;\n; for potential density, depth = 0. (i.e. density as if brought to surface)\n;\n;===========================================================================\n; WARNING: T-S diagrams use POTENTIAL DENSITY... if set depth to something\n; other then 0, then you will be plotting density contours computed for the\n; specified depth layer.\n;===========================================================================\n\n  depth = 0.  ;in meters\n  tspan = fspan(tmincn,tmaxcn,51)\n  sspan = fspan(smincn,smaxcn,51)\n\n  ; the more points the better... using Yeager's numbers\n\n  t_range = conform_dims((/51,51/),tspan,0)\n  s_range = conform_dims((/51,51/),sspan,1)\n\n  pd = rho_mwjf(t_range,s_range,depth)\n\n  pd!0    = \"temp\"\n  pd!1    = \"salt\"\n  pd&temp = tspan\n  pd&salt = sspan\n  pd      = 1000.*(pd-1.)        ; Put into kg/m3 pot den units\n\n;  printVarSummary(pd)\n;  printVarInfo(pd,\"rho_mwjf\")\n\n;=================Graphics\n\n;--- scatter plot\n  res                     = True\n  res@gsnMaximize         = True\n  res@gsnDraw             = False\n  res@gsnFrame            = False\n\n  res@xyMarkLineModes     = \"Markers\"\n  res@xyMarkers           = 16\n  res@xyMarkerColors      = \"black\"\n  res@pmLegendDisplayMode = \"Never\"\n  res@txFontHeightF       = 0.01\n  res@tiMainString        = case + \" ANN AVG:  T-S Diagram\"\n  res@tiXAxisString       = salt@units\n  res@tiXAxisFontHeightF  = 0.02\n  res@tiYAxisString       = temp@units\n  res@tiYAxisFontHeightF  = 0.02\n  res@trXMinF             = smincn\n  res@trXMaxF             = smaxcn\n  res@trYMinF             = tmincn\n  res@trYMaxF             = tmaxcn\n  res@gsnRightString      = depth_min/100. + \"-\"+depth_max/100. +\"m\"\n  res@gsnLeftString       = basin\n\n  plot = gsn_csm_xy(wks,xdata,ydata,res)\n\n;----- pd overlay\n  resov                          = True\n  resov@gsnDraw                  = False\n  resov@gsnFrame                 = False\n  resov@cnLevelSelectionMode     = \"AutomaticLevels\"\n  resov@cnInfoLabelOn            = \"False\"\n  resov@cnLineLabelPlacementMode = \"Constant\"\n  resov@cnLineLabelFontHeightF     = \".02\"\n  \n  plotpd = gsn_csm_contour(wks,pd,resov)\n  overlay(plot,plotpd)\n\n  draw(plot)\n  frame(wks)\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/unique_9.ncl",
    "content": ";************************************\n; unique_9.ncl\n;\n; Concepts illustrated:\n;   - Drawing raster contours over a map\n;   - Creating a topography plot using raster contours\n;   - Reading data from binary files\n;   - Manually creating lat/lon coordinate arrays\n;   - Customizing a labelbar for a contour plot\n;************************************\n; This example generates a topo map over\n; the area of Trinidad, Colorado.\n;************************************\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\"\n\nbegin\n\n wks = gsn_open_wks(\"ps\",\"unique\")\n\n;----------------- read the west binary data -------------------------\n binfile = \"trinidad-w.bin\"\n\n quad_name = fbinrecread(binfile,0,60,\"character\")\n\n map_cornersW = fbinrecread(binfile,1,4,\"double\")\n\n lonW = fbinrecread(binfile,2,(/1201/),\"double\")\n\n latW = fbinrecread(binfile,3,(/1201/),\"double\")\n\n minmax_elevW = fbinrecread(binfile,4,2,\"double\")\n\n tmpW = fbinrecread(binfile,5,(/1201,1201/),\"integer\")\n \n;----------------- read the east binary data -------------------------\n binfile = \"trinidad-e.bin\"\n\n quad_name = fbinrecread(binfile,0,60,\"character\")\n\n map_cornersE = fbinrecread(binfile,1,4,\"double\")\n\n lonE = fbinrecread(binfile,2,(/1201/),\"double\")\n\n latE = fbinrecread(binfile,3,(/1201/),\"double\")\n\n minmax_elevE = fbinrecread(binfile,4,2,\"double\")\n\n tmpE = fbinrecread(binfile,5,(/1201,1201/),\"integer\")\n \n;----------------------------------------------------------------------\n min_elev = min((/minmax_elevW(0),minmax_elevE(0)/))*3.28\n max_elev = max((/minmax_elevW(1),minmax_elevE(1)/))*3.28\n\n lat           = new(1201,\"double\")\n lat           = latW\n lat!0         = \"lat\"\n lat&lat       = latW               ; same as latE\n lat@long_name = \"latitude\"\n lat@units     = \"degrees_north\"\n\n lon            = new(2401,\"double\")\n lon(0:1200)    = lonW\n lon(1201:2400) = lonE(1:1200)\n lon!0          = \"lon\"\n lon&lon        = lon\n lon@long_name  = \"longitude\"\n lon@units      = \"degrees_east\"\n\n data     = new((/1201,2401/),\"float\")  ; (lat,lon)\n data!0   = \"lat\"\n data&lat = lat\n data!1   = \"lon\"\n data&lon = lon\n data(:,0:1200)    = (/tmpW*3.28/)            ; convert to feet\n data(:,1201:2400) = (/tmpE(:,1:1200)*3.28/)  ; convert to feet\n;-------------------------------------------------------------\n\n;\n; Define colormap.\n;\n  cmap = (/(/1.00, 1.00, 1.00/),(/0.00, 0.00, 0.00/), \\\n           (/0.51, 0.13, 0.94/),(/0.00, 0.00, 0.59/), \\\n           (/0.00, 0.00, 0.80/),(/0.25, 0.41, 0.88/), \\\n           (/0.12, 0.56, 1.00/),(/0.00, 0.75, 1.00/), \\\n           (/0.63, 0.82, 1.00/),(/0.82, 0.96, 1.00/), \\\n           (/1.00, 1.00, 0.78/),(/1.00, 0.88, 0.20/), \\\n           (/1.00, 0.67, 0.00/),(/1.00, 0.43, 0.00/), \\\n           (/1.00, 0.00, 0.00/),(/0.78, 0.00, 0.00/), \\\n           (/0.63, 0.14, 0.14/),(/1.00, 0.41, 0.70/)/)\n\n gsn_define_colormap(wks,cmap)\n\n res              = True\n res@gsnMaximize  = True\n res@gsnAddCyclic = False\n\n; map plot resources\n res@mpFillOn              = False\n res@mpLimitMode           = \"Corners\"\n res@mpDataBaseVersion     = \"Ncarg4_1\"\n res@mpOutlineBoundarySets = \"AllBoundaries\"\n res@mpLeftCornerLonF      = map_cornersW(0) \n res@mpLeftCornerLatF      = map_cornersW(1)\n res@mpRightCornerLonF     = map_cornersE(2)\n res@mpRightCornerLatF     = map_cornersE(3)\n\n; contour resources\n res@cnFillOn             = True\n res@cnLinesOn            = False\n res@cnFillMode           = \"RasterFill\"\n res@cnLevelSelectionMode = \"ExplicitLevels\"\n res@cnLevels             = (/ 5000., 6000., 7000., 8000., 8500., 9000., \\\n                               9500.,10000.,10500.,11000.,11500.,12000., \\\n                              12500.,13000.,13500./)\n\n; tickmark resources\n res@pmTickMarkDisplayMode = \"Always\"\n res@tmXBLabelFontHeightF   = 0.010\n\n; labelbar resources\n res@pmLabelBarWidthF         = 0.60\n res@txFontHeightF            = 0.012\n res@lbTitleString            = \"elevation above mean sea level (feet)\"\n res@lbTitleFontHeightF       = 0.012\n res@lbLabelFontHeightF       = 0.008\n res@lbTitleOffsetF           = -0.27\n res@lbBoxMinorExtentF        = 0.15\n res@pmLabelBarOrthogonalPosF = -.05\n\n; title resources\n res@tiMainString      = \"USGS DEM TRINIDAD (1 x 2 degrees)\" \n res@tiMainOffsetYF    = -0.02    ; Move title down towards graphic.\n res@tiMainFontHeightF = 0.015\n res@gsnLeftString     = \"Min Elevation: \"+min_elev\n res@gsnRightString    = \"Max Elevation: \"+max_elev\n res@gsnCenterString   = \"Scale 1:250,000\"\n\n plot = gsn_csm_contour_map(wks,data,res)\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/viewport_4.ncl",
    "content": "; ***********************************************\n; viewport_4.ncl\n;\n; Concepts illustrated:\n;   - Drawing an XY plot with multiple curves\n;   - Using drawNDCGrid to draw a nicely labeled NDC grid\n;   - Changing the size/shape of an XY plot using viewport resources\n;   - Drawing two XY plots on the same page using viewport resources\n;   - Drawing polylines, polymarkers, and text in NDC space\n;   - Using \"getvalues\" to retrieve resource values\n;   - Maximizing plots after they've been created\n; ***********************************************\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl\"\n\n;********************************************************************\n; Draw a box around the viewport of the given object..\n;********************************************************************\nprocedure draw_vp_box(wks,plot)\nlocal vpx, vpy, vpw, vph, xbox, ybox, lnres, mkres, txres\nbegin\n\n; Retrieve the viewport values of the drawable object.\n  getvalues plot\n    \"vpXF\"      : vpx\n    \"vpYF\"      : vpy\n    \"vpWidthF\"  : vpw\n    \"vpHeightF\" : vph\n  end getvalues\n\n; Set up some marker resources.\n  mkres                  = True\n  mkres@gsMarkerIndex    = 16     ; filled dot\n  mkres@gsMarkerSizeF    = 0.02   ; larger than default\n  mkres@gsMarkerColor    = \"Red\"\n\n; Draw a single marker at the vpXF/vpYF location.\n  gsn_polymarker_ndc(wks,vpx,vpy,mkres)\n\n\n; Set up some text resources.\n  txres                       = True  \n  txres@txJust                = \"BottomLeft\"\n  txres@txFontHeightF         = 0.018\n  txres@txFontColor           = \"Blue\"\n  txres@txBackgroundFillColor = \"white\"\n\n  gsn_text_ndc(wks,\"(vpXF=\"+vpx+\", vpYF=\"+vpy+\")\",vpx,vpy+0.02,txres)\n; Set up some line resources.\n  lnres                  = True\n  lnres@gsLineColor      = \"Red\"       ; line color\n  lnres@gsLineThicknessF = 2.0         ; 3.5 times as thick\n\n; Draw lines indicating the width and height\n  xline = (/vpx,     vpx+vpw/)\n  yline = (/vpy-0.05,vpy-0.05/)\n  gsn_polyline_ndc(wks,xline,yline,lnres)\n\n  xline = (/vpx+0.05,vpx+0.05/)\n  yline = (/vpy,vpy-vph/)\n  gsn_polyline_ndc(wks,xline,yline,lnres)\n\n  txres@txJust                = \"CenterCenter\"\n  gsn_text_ndc(wks,\"vpWidthF = \" + vpw,vpx+vpw/2.,vpy-0.05,txres)\n\n  txres@txAngleF              = 90.\n  gsn_text_ndc(wks,\"vpHeightF = \" + vph,vpx+0.05,vpy-vph/2.,txres)\nend\n\n;********************************************************************\n; Main code\n;********************************************************************\nbegin\n;************************************************\n; read in data\n;************************************************\n  f     = addfile (\"$NCARG_ROOT/lib/ncarg/data/cdf/uv300.nc\",\"r\")\n  u     = f->U                                    ; get u data\n;************************************************\n; plotting parameters\n;************************************************\n  wks   = gsn_open_wks (\"ps\",\"viewport\")          ; open workstation\n  \n  res                  = True                     ; plot mods desired\n\n  res@gsnFrame         = False                    ; don't advance frame yet\n\n  res@vpWidthF         = 0.8                      ; set width and height\n  res@vpHeightF        = 0.3\n  \n; First plot  \n  res@tiMainString     = \"Plot 1\"\n\n  res@vpXF             = 0.15\n  res@vpYF             = 0.9        ; Higher on the page\n\n  plot1  = gsn_csm_xy (wks,u&lat,u(0,:,{82}),res) ; create plot\n  \n; Second plot  \n  res@tiMainString     = \"Plot 2\"\n\n  res@vpXF             = 0.15       ; Same X location as first plot\n  res@vpYF             = 0.4        ; Lower on the page\n\n  plot2  = gsn_csm_xy (wks,u&lat,u(0,:,{3}),res) ; create plot\n\n; Advance the frame\n  frame(wks)\n  \n; Now draw the two plots with illustrations.\n\n  drawNDCGrid(wks)   ; Draw helpful grid lines showing NDC square.\n\n  draw(plot1)        ; Draw the two plots\n  draw(plot2)\n\n  draw_vp_box(wks,plot1)  ; Draw boxes around the two viewports.\n  draw_vp_box(wks,plot2)\n\n  frame(wks)              ; Advance the frame.\n\n\n;\n; Uncomment the next two lines if you want to maximize these plots for\n; PS or PDF output.\n;\n;  psres = True                                                               \n;  maximize_output(wks,psres)  ; calls draw and frame for you \nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/weather_sym_6.ncl",
    "content": "load \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"\n\nbegin\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;\n;  Example of plotting station model data over a map \n;  illustrating how the wind barb directions are adjusted\n;  for the map projection.\n;\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;\n;  City names.\n;\n  cities = (/      \"NCAR\",       \"Seattle\", \"San Francisco\",    \\\n            \"Los Angeles\",      \"Billings\",       \"El Paso\",    \\\n                \"Houston\",   \"Kansas City\",   \"Minneapolis\",    \\\n                \"Chicago\",       \"Detroit\",       \"Atlanta\",    \\\n                  \"Miami\",      \"New York\",        \"Eugene\",    \\\n                  \"Boise\",     \"Salt Lake\",       \"Phoenix\",    \\\n            \"Albuquerque\",      \"Bismarck\",         \"Tulsa\",    \\\n                 \"Dallas\",   \"Little Rock\",     \"Lexington\",    \\\n              \"Charlotte\",       \"Norfolk\",        \"Bangor\"     \\\n           /)\n  city_lats = (/     40.0,            47.6,            37.8,    \\\n                     34.1,            45.8,            31.8,    \\\n                     29.8,            39.1,            45.0,    \\\n                     41.9,            42.3,            33.8,    \\\n                     25.8,            40.8,            44.1,    \\\n                     43.6,            40.7,            33.5,    \\\n                     35.1,            46.7,            36.0,    \\\n                     32.8,            34.7,            38.1,    \\\n                     35.2,            36.8,            44.8     \\\n               /)\n  city_lons = (/   -105.0,          -122.3,          -122.4,    \\\n                   -118.3,          -108.5,          -106.5,    \\\n                   -095.3,          -094.1,          -093.8,    \\\n                   -087.6,          -083.1,          -084.4,    \\\n                   -080.2,          -074.0,          -123.1,    \\\n                   -116.2,          -111.9,          -112.1,    \\\n                   -106.6,          -100.8,          -096.0,    \\\n                   -096.8,          -092.3,          -084.1,    \\\n                   -080.8,          -076.3,          -068.8     \\\n              /)\n;\n;  Station model data for the 27 cities.\n;\n  imdat = (/\"11000000751126021360300004955054054600007757087712\",  \\\n            \"11103100011104021080300004959055050600517043080369\",  \\\n            \"11206200031102021040300004963056046601517084081470\",  \\\n            \"11309300061000021020300004967057042602017125082581\",  \\\n            \"11412400091002021010300004971058038602517166083592\",  \\\n            \"11515500121004020000300004975050034603017207084703\",  \\\n            \"11618600151006020030300004979051030603507248085814\",  \\\n            \"11721700181008020050300004983052026604007289086925\",  \\\n            \"11824800211009020070300004987053022604507323087036\",  \\\n            \"11927900241011020110300004991054018605017364088147\",  \\\n            \"11030000271013020130300004995055014605517405089258\",  \\\n            \"11133100301015020170300004999056010606017446080369\",  \\\n            \"11236200331017020200300004000057006606517487081470\",  \\\n            \"11339300361019020230300004004058002607017528082581\",  \\\n            \"11442400391021020250300004008050000607517569083692\",  \\\n            \"11545500421023020270300004012051040608017603084703\",  \\\n            \"11648600451025020290300004017052008608517644085814\",  \\\n            \"11751700481027020310300004021053012609017685086925\",  \\\n            \"11854800511029020330300004025054016609507726087036\",  \\\n            \"11958900541031020360300004029055018610007767088147\",  \\\n            \"11060000571033020380300004033056030610507808089258\",  \\\n            \"11163100601035020410300004037057034611007849080369\",  \\\n            \"11266200631037020430300004041058043611507883081470\",  \\\n            \"11369300661039020470300004045050041612007924082581\",  \\\n            \"11472400691041020500300004048051025612507965083692\",  \\\n            \"11575500721043020530300004051052022613507996084703\",  \\\n            \"11678600751048021580300004055053013614007337085814\"   \\\n          /)\n\n;\n;  Define a color map and open a workstation.\n;\n  cmap = (/                      \\\n            (/ 1., 1., 1. /),    \\  ; color index 0 - white\n            (/ 0., 0., 0. /)     \\  ; color index 1 - black\n         /)\n  wks = gsn_open_wks(\"ps\",\"weather_sym\")\n  gsn_define_colormap(wks,cmap)\n\n;\n;  Draw a world map.\n;\n  mpres = True\n  mpres@gsnFrame     = False\n  mpres@mpSatelliteDistF  = 1.3\n  mpres@mpOutlineBoundarySets  = \"USStates\"\n  mpres@mpCenterLatF =  40.\n  mpres@mpCenterLonF = -97.\n  mpres@mpCenterRotF =  35.\n  map = gsn_map(wks,\"Satellite\",mpres)\n\n;\n;  Scale the station model plot (all aspects of the station\n;  model plots are scaled as per the size of the wind barb).\n;\n  wmsetp(\"wbs\",0.018)\n;\n;  In the middle of Nebraska, draw a wind barb for a north wind\n;  with a magnitude of 15 knots.\n;\n  wmbarbmap(wks,42.,-99.,0.,-15.)\n\n;\n;  Draw the station model data at the selected cities.  The call\n;  to wmsetp informs wmstnm that the wind barbs will be drawn over\n;  a map.  To illustrate the adjustment for plotting the model\n;  data over a map, all winds are from the north.\n;\n  wmsetp(\"ezf\",1)\n  wmstnm(wks,city_lats,city_lons,imdat)\n\n  frame(wks)\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/NCL/xy_29.ncl",
    "content": "; xy_29.ncl\n;\n; Concepts illustrated:\n;   - Reading data from an ASCII file with headers\n;   - Creating a separate procedure to create a specific plot\n;   - Attaching polymarkers to an XY plot\n;\n; This script was originally from Dr. Birgit Hassler (NOAA)\n;****************************************************\n\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl\"\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl\"\n\n;************************************************\n;             Plot Procedure\n;************************************************\nprocedure plotTCOPolym(pltName[1]:string, pltType[1]:string, filName[1]:string \\\n                   ,xTitle[1]:string , yTitle[1]:string \\ \n                   ,year[*]:numeric, y[*]:numeric)\nlocal wks, res, ntim, gsres, MarkerCol, OldYear, i, xmarker, ymarker\n  \nbegin\n  wks = gsn_open_wks(pltType,pltName)\n  gsn_define_colormap(wks,\"default\")\n  \n  res = True\n  res@gsnMaximize    = True            ; make \"ps\", \"eps\", \"pdf\" large\n\n  res@vpHeightF      = 0.5             ; change aspect ratio of plot\n  res@vpWidthF       = 0.75                 \n  res@vpXF           = 0.15            ; start plot at x ndc coord \n  res@tiXAxisString  = xTitle     \n  res@tiYAxisString  = yTitle     \n  res@tiMainString   = filName\n\n  ntim   = dimsizes(year)\n  res@trXMinF = year(0)-1        \n  res@trXMaxF = year(ntim-1)+1        \n\n  res@gsnDraw        = False\n  res@gsnFrame       = False\n  res@xyMarkLineMode = \"markers\"\n  res@xyMarker       = 16\n  res@xyMarkerColor  = \"Background\"                     \n  plot               = gsn_csm_xy (wks,year,y,res) ; create plot frame ork\n  \n                     ; add different color polymarkers for each year \n  gsres     = True\n  MarkerCol = 2\n  OldYear   = year(0)\n  \n  do i=0,ntim-1 \n    xmarker = year(i)\n    ymarker = y(i)\n    \n    if (i.gt.0) then \n      if (year(i).gt.OldYear) then\n        MarkerCol = MarkerCol+1\n      end if\n      OldYear = year(i)\n    end if\n    \n    gsres@gsMarkerColor = MarkerCol\n    gsres@gsMarkerIndex = 16\n   ;gsres@gsMarkerSizeF = 15.0\n                        ; add (attach) polymarkers to existing plot object \n    plot@$unique_string(\"dum\")$ = gsn_add_polymarker(wks,plot,xmarker,ymarker,gsres)\n  end do\n\n  draw(plot)\n  frame(wks)\nend\n\n;***********************************************************\n;                   MAIN\n;***********************************************************\n   pltType = \"ps\"      ; \"ps\", \"eps\", \"png\", \"x11\"\n\n                       ; read multiple ascii file names\n ;;fili = \"Southpole_TCOTimeSeries_11.dat\"\n\n   diri = \"./\"\n   fili = systemfunc(\"cd \"+diri+\" ; ls *TCOT*dat\")\n   print(fili)\n\n   nfil = dimsizes(fili)\n\n   nhead= 4      ; number of header lines on ascii file(s)\n   ncol = 4      ; year, month, day, O3\n\n   do nf=0,nfil-1\n      sfx  = get_file_suffix(fili(nf), 0) ; sfx = \".dat\"\n      filx = sfx@fBase                    ; filx= \"Southpole_TCOTimeSeries_11\"\n                                          ; read ascii files\n      data = readAsciiTable(diri+fili(nf), ncol, \"float\", nhead)\n      dimd = dimsizes(data)\n      ntim = dimd(0)                      ; # rows\n\n      year = toint( data(:,0) )           ; user decision ... convert to integer\n      mon  = toint( data(:,1) )\n      day  = toint( data(:,2) )\n \n      hour = new (ntim, \"integer\", \"No_FillValue\")\n      mn   = new (ntim, \"integer\", \"No_FillValue\")\n      sec  = new (ntim, \"double\" , \"No_FillValue\")\n      hour = 0\n      mn   = 0\n      sec  = 0d0\n                                          ; create COARDS/udunits time variable\n    ;;tunits = \"days since 1900-01-01 00:00:0.0\"\n      tunits = \"days since \"+year(0)+\"-\"+mon(0)+\"-\"+day(0)+\" 00:00:0.0\"\n      time   = cd_inv_calendar(year,mon,day,hour,mn,sec,tunits, 0)\n      time!0 = \"time\"\n      time&time = time\n      ;printVarSummary(time)\n\n                                          ; create a Gregorin 'date' variable\n      date = year*10000 + mon*100 + day\n      date!0 = \"time\"\n      date@units = \"yyyymmdd\"\n      date&time = time\n     ;printVarSummary(date)\n\n      O3   = data(:,3) \n      O3@long_name = \"total column ozone\"\n      O3@units     = \"DU\"\n\n      O3!0         = \"time\"\n      O3&time      = time\n     ;printVarSummary(O3)\n     ;print(\" \")\n     ;print(date+\"  \"+time+\"   \"+O3)\n\n                                          ; plot\n      yTitle = O3@long_name\n      year@long_name = \"YEAR\"\n\n      plotTCOPolym (filx, pltType, fili(nf), year@long_name, yTitle,  year, O3) \n     \n      delete(time) ; delete ... size (# rows) may change in the next file\n      delete(date)\n      delete(year)\n      delete(mon )\n      delete(day )\n      delete(mn  )\n      delete(sec )\n      delete(O3  )\n      delete(data)\n   end do\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/NL/assign0.nl",
    "content": "g3 0 1 0\t# problem assign0\n 9 6 1 0 6\t# vars, constraints, objectives, ranges, eqns\n 0 0\t# nonlinear constraints, objectives\n 0 0\t# network constraints: nonlinear, linear\n 0 0 0\t# nonlinear vars in constraints, objectives, both\n 0 0 0 1\t# linear network variables; functions; arith, flags\n 9 0 0 0 0\t# discrete variables: binary, integer, nonlinear (b,c,o)\n 18 9\t# nonzeros in Jacobian, gradients\n 0 0\t# max name lengths: constraints, variables\n 0 0 0 0 0\t# common exprs: b,c,o,c1,o1\nC0\nn0\nC1\nn0\nC2\nn0\nC3\nn0\nC4\nn0\nC5\nn0\nO0 0\nn0\nr\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\nb\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\nk8\n2\n4\n6\n8\n10\n12\n14\n16\nJ0 3\n0 1\n1 1\n2 1\nJ1 3\n3 1\n4 1\n5 1\nJ2 3\n6 1\n7 1\n8 1\nJ3 3\n0 1\n3 1\n6 1\nJ4 3\n1 1\n4 1\n7 1\nJ5 3\n2 1\n5 1\n8 1\nG0 9\n0 1\n1 3\n2 3\n3 2\n4 3\n5 3\n6 3\n7 3\n8 2\n"
  },
  {
    "path": "src/test/resources/samples/langs/NL/balassign0.nl",
    "content": "g3 2 1 0\t# problem balassign0\n 160 121 1 0 26\t# vars, constraints, objectives, ranges, eqns\n 0 0\t# nonlinear constraints, objectives\n 0 0\t# network constraints: nonlinear, linear\n 0 0 0\t# nonlinear vars in constraints, objectives, both\n 0 0 0 1\t# linear network variables; functions; arith, flags\n 130 30 0 0 0\t# discrete variables: binary, integer, nonlinear (b,c,o)\n 1435 30\t# nonzeros in Jacobian, gradients\n 0 0\t# max name lengths: constraints, variables\n 0 0 0 0 0\t# common exprs: b,c,o,c1,o1\nC0\nn0\nC1\nn0\nC2\nn0\nC3\nn0\nC4\nn0\nC5\nn0\nC6\nn0\nC7\nn0\nC8\nn0\nC9\nn0\nC10\nn0\nC11\nn0\nC12\nn0\nC13\nn0\nC14\nn0\nC15\nn0\nC16\nn0\nC17\nn0\nC18\nn0\nC19\nn0\nC20\nn0\nC21\nn0\nC22\nn0\nC23\nn0\nC24\nn0\nC25\nn0\nC26\nn0\nC27\nn0\nC28\nn0\nC29\nn0\nC30\nn0\nC31\nn0\nC32\nn0\nC33\nn0\nC34\nn0\nC35\nn0\nC36\nn0\nC37\nn0\nC38\nn0\nC39\nn0\nC40\nn0\nC41\nn0\nC42\nn0\nC43\nn0\nC44\nn0\nC45\nn0\nC46\nn0\nC47\nn0\nC48\nn0\nC49\nn0\nC50\nn0\nC51\nn0\nC52\nn0\nC53\nn0\nC54\nn0\nC55\nn0\nC56\nn0\nC57\nn0\nC58\nn0\nC59\nn0\nC60\nn0\nC61\nn0\nC62\nn0\nC63\nn0\nC64\nn0\nC65\nn0\nC66\nn0\nC67\nn0\nC68\nn0\nC69\nn0\nC70\nn0\nC71\nn0\nC72\nn0\nC73\nn0\nC74\nn0\nC75\nn0\nC76\nn0\nC77\nn0\nC78\nn0\nC79\nn0\nC80\nn0\nC81\nn0\nC82\nn0\nC83\nn0\nC84\nn0\nC85\nn0\nC86\nn0\nC87\nn0\nC88\nn0\nC89\nn0\nC90\nn0\nC91\nn0\nC92\nn0\nC93\nn0\nC94\nn0\nC95\nn0\nC96\nn0\nC97\nn0\nC98\nn0\nC99\nn0\nC100\nn0\nC101\nn0\nC102\nn0\nC103\nn0\nC104\nn0\nC105\nn0\nC106\nn0\nC107\nn0\nC108\nn0\nC109\nn0\nC110\nn0\nC111\nn0\nC112\nn0\nC113\nn0\nC114\nn0\nC115\nn0\nC116\nn0\nC117\nn0\nC118\nn0\nC119\nn0\nC120\nn0\nO0 0\nn0\nr\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n4 1\n1 0\n1 0\n1 0\n1 0\n1 0\n2 0\n2 0\n2 0\n2 0\n2 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n1 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\n2 0\nb\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n0 0 1\n1 5\n2 6\n1 4\n1 0\n1 0\n1 0\n1 1\n1 0\n1 2\n1 0\n1 0\n1 4\n1 0\n1 2\n1 2\n1 0\n2 4\n2 1\n2 1\n2 1\n2 2\n2 1\n2 3\n2 1\n2 1\n2 5\n2 1\n2 3\n2 3\n2 1\nk159\n11\n22\n33\n44\n55\n64\n73\n82\n91\n100\n111\n122\n133\n144\n155\n166\n177\n188\n199\n210\n220\n230\n240\n250\n260\n270\n280\n290\n300\n310\n321\n332\n343\n354\n365\n375\n385\n395\n405\n415\n425\n435\n445\n455\n465\n476\n487\n498\n509\n520\n531\n542\n553\n564\n575\n586\n597\n608\n619\n630\n641\n652\n663\n674\n685\n696\n707\n718\n729\n740\n749\n758\n767\n776\n785\n796\n807\n818\n829\n840\n850\n860\n870\n880\n890\n899\n908\n917\n926\n935\n945\n955\n965\n975\n985\n995\n1005\n1015\n1025\n1035\n1046\n1057\n1068\n1079\n1090\n1099\n1108\n1117\n1126\n1135\n1146\n1157\n1168\n1179\n1190\n1201\n1212\n1223\n1234\n1245\n1255\n1265\n1275\n1285\n1295\n1304\n1313\n1322\n1331\n1340\n1345\n1350\n1355\n1355\n1355\n1355\n1360\n1360\n1365\n1365\n1365\n1370\n1370\n1375\n1380\n1380\n1385\n1390\n1390\n1395\n1400\n1400\n1405\n1410\n1410\n1415\n1420\n1425\n1430\nJ0 5\n0 1\n1 1\n2 1\n3 1\n4 1\nJ1 5\n5 1\n6 1\n7 1\n8 1\n9 1\nJ2 5\n10 1\n11 1\n12 1\n13 1\n14 1\nJ3 5\n15 1\n16 1\n17 1\n18 1\n19 1\nJ4 5\n20 1\n21 1\n22 1\n23 1\n24 1\nJ5 5\n25 1\n26 1\n27 1\n28 1\n29 1\nJ6 5\n30 1\n31 1\n32 1\n33 1\n34 1\nJ7 5\n35 1\n36 1\n37 1\n38 1\n39 1\nJ8 5\n40 1\n41 1\n42 1\n43 1\n44 1\nJ9 5\n45 1\n46 1\n47 1\n48 1\n49 1\nJ10 5\n50 1\n51 1\n52 1\n53 1\n54 1\nJ11 5\n55 1\n56 1\n57 1\n58 1\n59 1\nJ12 5\n60 1\n61 1\n62 1\n63 1\n64 1\nJ13 5\n65 1\n66 1\n67 1\n68 1\n69 1\nJ14 5\n70 1\n71 1\n72 1\n73 1\n74 1\nJ15 5\n75 1\n76 1\n77 1\n78 1\n79 1\nJ16 5\n80 1\n81 1\n82 1\n83 1\n84 1\nJ17 5\n85 1\n86 1\n87 1\n88 1\n89 1\nJ18 5\n90 1\n91 1\n92 1\n93 1\n94 1\nJ19 5\n95 1\n96 1\n97 1\n98 1\n99 1\nJ20 5\n100 1\n101 1\n102 1\n103 1\n104 1\nJ21 5\n105 1\n106 1\n107 1\n108 1\n109 1\nJ22 5\n110 1\n111 1\n112 1\n113 1\n114 1\nJ23 5\n115 1\n116 1\n117 1\n118 1\n119 1\nJ24 5\n120 1\n121 1\n122 1\n123 1\n124 1\nJ25 5\n125 1\n126 1\n127 1\n128 1\n129 1\nJ26 27\n0 -1\n5 -1\n10 -1\n15 -1\n20 -1\n25 -1\n30 -1\n35 -1\n40 -1\n45 -1\n50 -1\n55 -1\n60 -1\n65 -1\n70 -1\n75 -1\n80 -1\n85 -1\n90 -1\n95 -1\n100 -1\n105 -1\n110 -1\n115 -1\n120 -1\n125 -1\n130 1\nJ27 27\n1 -1\n6 -1\n11 -1\n16 -1\n21 -1\n26 -1\n31 -1\n36 -1\n41 -1\n46 -1\n51 -1\n56 -1\n61 -1\n66 -1\n71 -1\n76 -1\n81 -1\n86 -1\n91 -1\n96 -1\n101 -1\n106 -1\n111 -1\n116 -1\n121 -1\n126 -1\n130 1\nJ28 27\n2 -1\n7 -1\n12 -1\n17 -1\n22 -1\n27 -1\n32 -1\n37 -1\n42 -1\n47 -1\n52 -1\n57 -1\n62 -1\n67 -1\n72 -1\n77 -1\n82 -1\n87 -1\n92 -1\n97 -1\n102 -1\n107 -1\n112 -1\n117 -1\n122 -1\n127 -1\n130 1\nJ29 27\n3 -1\n8 -1\n13 -1\n18 -1\n23 -1\n28 -1\n33 -1\n38 -1\n43 -1\n48 -1\n53 -1\n58 -1\n63 -1\n68 -1\n73 -1\n78 -1\n83 -1\n88 -1\n93 -1\n98 -1\n103 -1\n108 -1\n113 -1\n118 -1\n123 -1\n128 -1\n130 1\nJ30 27\n4 -1\n9 -1\n14 -1\n19 -1\n24 -1\n29 -1\n34 -1\n39 -1\n44 -1\n49 -1\n54 -1\n59 -1\n64 -1\n69 -1\n74 -1\n79 -1\n84 -1\n89 -1\n94 -1\n99 -1\n104 -1\n109 -1\n114 -1\n119 -1\n124 -1\n129 -1\n130 1\nJ31 27\n0 -1\n5 -1\n10 -1\n15 -1\n20 -1\n25 -1\n30 -1\n35 -1\n40 -1\n45 -1\n50 -1\n55 -1\n60 -1\n65 -1\n70 -1\n75 -1\n80 -1\n85 -1\n90 -1\n95 -1\n100 -1\n105 -1\n110 -1\n115 -1\n120 -1\n125 -1\n131 1\nJ32 27\n1 -1\n6 -1\n11 -1\n16 -1\n21 -1\n26 -1\n31 -1\n36 -1\n41 -1\n46 -1\n51 -1\n56 -1\n61 -1\n66 -1\n71 -1\n76 -1\n81 -1\n86 -1\n91 -1\n96 -1\n101 -1\n106 -1\n111 -1\n116 -1\n121 -1\n126 -1\n131 1\nJ33 27\n2 -1\n7 -1\n12 -1\n17 -1\n22 -1\n27 -1\n32 -1\n37 -1\n42 -1\n47 -1\n52 -1\n57 -1\n62 -1\n67 -1\n72 -1\n77 -1\n82 -1\n87 -1\n92 -1\n97 -1\n102 -1\n107 -1\n112 -1\n117 -1\n122 -1\n127 -1\n131 1\nJ34 27\n3 -1\n8 -1\n13 -1\n18 -1\n23 -1\n28 -1\n33 -1\n38 -1\n43 -1\n48 -1\n53 -1\n58 -1\n63 -1\n68 -1\n73 -1\n78 -1\n83 -1\n88 -1\n93 -1\n98 -1\n103 -1\n108 -1\n113 -1\n118 -1\n123 -1\n128 -1\n131 1\nJ35 27\n4 -1\n9 -1\n14 -1\n19 -1\n24 -1\n29 -1\n34 -1\n39 -1\n44 -1\n49 -1\n54 -1\n59 -1\n64 -1\n69 -1\n74 -1\n79 -1\n84 -1\n89 -1\n94 -1\n99 -1\n104 -1\n109 -1\n114 -1\n119 -1\n124 -1\n129 -1\n131 1\nJ36 21\n0 -1\n5 -1\n10 -1\n15 -1\n20 -1\n25 -1\n30 -1\n35 -1\n45 -1\n50 -1\n55 -1\n60 -1\n65 -1\n75 -1\n100 -1\n105 -1\n110 -1\n115 -1\n120 -1\n125 -1\n132 1\nJ37 9\n0 -1\n10 -1\n45 -1\n70 -1\n75 -1\n90 -1\n95 -1\n100 -1\n136 1\nJ38 15\n15 -1\n20 -1\n25 -1\n30 -1\n35 -1\n40 -1\n50 -1\n55 -1\n60 -1\n65 -1\n80 -1\n110 -1\n115 -1\n120 -1\n138 1\nJ39 25\n0 -1\n5 -1\n10 -1\n15 -1\n25 -1\n30 -1\n40 -1\n45 -1\n50 -1\n55 -1\n60 -1\n65 -1\n70 -1\n75 -1\n80 -1\n85 -1\n90 -1\n95 -1\n100 -1\n105 -1\n110 -1\n115 -1\n120 -1\n125 -1\n141 1\nJ40 13\n0 -1\n10 -1\n20 -1\n30 -1\n35 -1\n40 -1\n45 -1\n70 -1\n75 -1\n85 -1\n100 -1\n125 -1\n143 1\nJ41 12\n5 -1\n15 -1\n50 -1\n55 -1\n60 -1\n65 -1\n80 -1\n90 -1\n95 -1\n110 -1\n115 -1\n144 1\nJ42 21\n1 -1\n6 -1\n11 -1\n16 -1\n21 -1\n26 -1\n31 -1\n36 -1\n46 -1\n51 -1\n56 -1\n61 -1\n66 -1\n76 -1\n101 -1\n106 -1\n111 -1\n116 -1\n121 -1\n126 -1\n132 1\nJ43 9\n1 -1\n11 -1\n46 -1\n71 -1\n76 -1\n91 -1\n96 -1\n101 -1\n136 1\nJ44 15\n16 -1\n21 -1\n26 -1\n31 -1\n36 -1\n41 -1\n51 -1\n56 -1\n61 -1\n66 -1\n81 -1\n111 -1\n116 -1\n121 -1\n138 1\nJ45 25\n1 -1\n6 -1\n11 -1\n16 -1\n26 -1\n31 -1\n41 -1\n46 -1\n51 -1\n56 -1\n61 -1\n66 -1\n71 -1\n76 -1\n81 -1\n86 -1\n91 -1\n96 -1\n101 -1\n106 -1\n111 -1\n116 -1\n121 -1\n126 -1\n141 1\nJ46 13\n1 -1\n11 -1\n21 -1\n31 -1\n36 -1\n41 -1\n46 -1\n71 -1\n76 -1\n86 -1\n101 -1\n126 -1\n143 1\nJ47 12\n6 -1\n16 -1\n51 -1\n56 -1\n61 -1\n66 -1\n81 -1\n91 -1\n96 -1\n111 -1\n116 -1\n144 1\nJ48 21\n2 -1\n7 -1\n12 -1\n17 -1\n22 -1\n27 -1\n32 -1\n37 -1\n47 -1\n52 -1\n57 -1\n62 -1\n67 -1\n77 -1\n102 -1\n107 -1\n112 -1\n117 -1\n122 -1\n127 -1\n132 1\nJ49 9\n2 -1\n12 -1\n47 -1\n72 -1\n77 -1\n92 -1\n97 -1\n102 -1\n136 1\nJ50 15\n17 -1\n22 -1\n27 -1\n32 -1\n37 -1\n42 -1\n52 -1\n57 -1\n62 -1\n67 -1\n82 -1\n112 -1\n117 -1\n122 -1\n138 1\nJ51 25\n2 -1\n7 -1\n12 -1\n17 -1\n27 -1\n32 -1\n42 -1\n47 -1\n52 -1\n57 -1\n62 -1\n67 -1\n72 -1\n77 -1\n82 -1\n87 -1\n92 -1\n97 -1\n102 -1\n107 -1\n112 -1\n117 -1\n122 -1\n127 -1\n141 1\nJ52 13\n2 -1\n12 -1\n22 -1\n32 -1\n37 -1\n42 -1\n47 -1\n72 -1\n77 -1\n87 -1\n102 -1\n127 -1\n143 1\nJ53 12\n7 -1\n17 -1\n52 -1\n57 -1\n62 -1\n67 -1\n82 -1\n92 -1\n97 -1\n112 -1\n117 -1\n144 1\nJ54 21\n3 -1\n8 -1\n13 -1\n18 -1\n23 -1\n28 -1\n33 -1\n38 -1\n48 -1\n53 -1\n58 -1\n63 -1\n68 -1\n78 -1\n103 -1\n108 -1\n113 -1\n118 -1\n123 -1\n128 -1\n132 1\nJ55 9\n3 -1\n13 -1\n48 -1\n73 -1\n78 -1\n93 -1\n98 -1\n103 -1\n136 1\nJ56 15\n18 -1\n23 -1\n28 -1\n33 -1\n38 -1\n43 -1\n53 -1\n58 -1\n63 -1\n68 -1\n83 -1\n113 -1\n118 -1\n123 -1\n138 1\nJ57 25\n3 -1\n8 -1\n13 -1\n18 -1\n28 -1\n33 -1\n43 -1\n48 -1\n53 -1\n58 -1\n63 -1\n68 -1\n73 -1\n78 -1\n83 -1\n88 -1\n93 -1\n98 -1\n103 -1\n108 -1\n113 -1\n118 -1\n123 -1\n128 -1\n141 1\nJ58 13\n3 -1\n13 -1\n23 -1\n33 -1\n38 -1\n43 -1\n48 -1\n73 -1\n78 -1\n88 -1\n103 -1\n128 -1\n143 1\nJ59 12\n8 -1\n18 -1\n53 -1\n58 -1\n63 -1\n68 -1\n83 -1\n93 -1\n98 -1\n113 -1\n118 -1\n144 1\nJ60 21\n4 -1\n9 -1\n14 -1\n19 -1\n24 -1\n29 -1\n34 -1\n39 -1\n49 -1\n54 -1\n59 -1\n64 -1\n69 -1\n79 -1\n104 -1\n109 -1\n114 -1\n119 -1\n124 -1\n129 -1\n132 1\nJ61 9\n4 -1\n14 -1\n49 -1\n74 -1\n79 -1\n94 -1\n99 -1\n104 -1\n136 1\nJ62 15\n19 -1\n24 -1\n29 -1\n34 -1\n39 -1\n44 -1\n54 -1\n59 -1\n64 -1\n69 -1\n84 -1\n114 -1\n119 -1\n124 -1\n138 1\nJ63 25\n4 -1\n9 -1\n14 -1\n19 -1\n29 -1\n34 -1\n44 -1\n49 -1\n54 -1\n59 -1\n64 -1\n69 -1\n74 -1\n79 -1\n84 -1\n89 -1\n94 -1\n99 -1\n104 -1\n109 -1\n114 -1\n119 -1\n124 -1\n129 -1\n141 1\nJ64 13\n4 -1\n14 -1\n24 -1\n34 -1\n39 -1\n44 -1\n49 -1\n74 -1\n79 -1\n89 -1\n104 -1\n129 -1\n143 1\nJ65 12\n9 -1\n19 -1\n54 -1\n59 -1\n64 -1\n69 -1\n84 -1\n94 -1\n99 -1\n114 -1\n119 -1\n144 1\nJ66 21\n0 -1\n5 -1\n10 -1\n15 -1\n20 -1\n25 -1\n30 -1\n35 -1\n45 -1\n50 -1\n55 -1\n60 -1\n65 -1\n75 -1\n100 -1\n105 -1\n110 -1\n115 -1\n120 -1\n125 -1\n146 1\nJ67 4\n40 -1\n85 -1\n90 -1\n147 1\nJ68 3\n80 -1\n95 -1\n149 1\nJ69 9\n0 -1\n10 -1\n45 -1\n70 -1\n75 -1\n90 -1\n95 -1\n100 -1\n150 1\nJ70 15\n15 -1\n20 -1\n25 -1\n30 -1\n35 -1\n40 -1\n50 -1\n55 -1\n60 -1\n65 -1\n80 -1\n110 -1\n115 -1\n120 -1\n152 1\nJ71 3\n85 -1\n105 -1\n153 1\nJ72 25\n0 -1\n5 -1\n10 -1\n15 -1\n25 -1\n30 -1\n40 -1\n45 -1\n50 -1\n55 -1\n60 -1\n65 -1\n70 -1\n75 -1\n80 -1\n85 -1\n90 -1\n95 -1\n100 -1\n105 -1\n110 -1\n115 -1\n120 -1\n125 -1\n155 1\nJ73 3\n20 -1\n35 -1\n156 1\nJ74 13\n0 -1\n10 -1\n20 -1\n30 -1\n35 -1\n40 -1\n45 -1\n70 -1\n75 -1\n85 -1\n100 -1\n125 -1\n157 1\nJ75 12\n5 -1\n15 -1\n50 -1\n55 -1\n60 -1\n65 -1\n80 -1\n90 -1\n95 -1\n110 -1\n115 -1\n158 1\nJ76 4\n25 -1\n105 -1\n120 -1\n159 1\nJ77 21\n1 -1\n6 -1\n11 -1\n16 -1\n21 -1\n26 -1\n31 -1\n36 -1\n46 -1\n51 -1\n56 -1\n61 -1\n66 -1\n76 -1\n101 -1\n106 -1\n111 -1\n116 -1\n121 -1\n126 -1\n146 1\nJ78 4\n41 -1\n86 -1\n91 -1\n147 1\nJ79 3\n81 -1\n96 -1\n149 1\nJ80 9\n1 -1\n11 -1\n46 -1\n71 -1\n76 -1\n91 -1\n96 -1\n101 -1\n150 1\nJ81 15\n16 -1\n21 -1\n26 -1\n31 -1\n36 -1\n41 -1\n51 -1\n56 -1\n61 -1\n66 -1\n81 -1\n111 -1\n116 -1\n121 -1\n152 1\nJ82 3\n86 -1\n106 -1\n153 1\nJ83 25\n1 -1\n6 -1\n11 -1\n16 -1\n26 -1\n31 -1\n41 -1\n46 -1\n51 -1\n56 -1\n61 -1\n66 -1\n71 -1\n76 -1\n81 -1\n86 -1\n91 -1\n96 -1\n101 -1\n106 -1\n111 -1\n116 -1\n121 -1\n126 -1\n155 1\nJ84 3\n21 -1\n36 -1\n156 1\nJ85 13\n1 -1\n11 -1\n21 -1\n31 -1\n36 -1\n41 -1\n46 -1\n71 -1\n76 -1\n86 -1\n101 -1\n126 -1\n157 1\nJ86 12\n6 -1\n16 -1\n51 -1\n56 -1\n61 -1\n66 -1\n81 -1\n91 -1\n96 -1\n111 -1\n116 -1\n158 1\nJ87 4\n26 -1\n106 -1\n121 -1\n159 1\nJ88 21\n2 -1\n7 -1\n12 -1\n17 -1\n22 -1\n27 -1\n32 -1\n37 -1\n47 -1\n52 -1\n57 -1\n62 -1\n67 -1\n77 -1\n102 -1\n107 -1\n112 -1\n117 -1\n122 -1\n127 -1\n146 1\nJ89 4\n42 -1\n87 -1\n92 -1\n147 1\nJ90 3\n82 -1\n97 -1\n149 1\nJ91 9\n2 -1\n12 -1\n47 -1\n72 -1\n77 -1\n92 -1\n97 -1\n102 -1\n150 1\nJ92 15\n17 -1\n22 -1\n27 -1\n32 -1\n37 -1\n42 -1\n52 -1\n57 -1\n62 -1\n67 -1\n82 -1\n112 -1\n117 -1\n122 -1\n152 1\nJ93 3\n87 -1\n107 -1\n153 1\nJ94 25\n2 -1\n7 -1\n12 -1\n17 -1\n27 -1\n32 -1\n42 -1\n47 -1\n52 -1\n57 -1\n62 -1\n67 -1\n72 -1\n77 -1\n82 -1\n87 -1\n92 -1\n97 -1\n102 -1\n107 -1\n112 -1\n117 -1\n122 -1\n127 -1\n155 1\nJ95 3\n22 -1\n37 -1\n156 1\nJ96 13\n2 -1\n12 -1\n22 -1\n32 -1\n37 -1\n42 -1\n47 -1\n72 -1\n77 -1\n87 -1\n102 -1\n127 -1\n157 1\nJ97 12\n7 -1\n17 -1\n52 -1\n57 -1\n62 -1\n67 -1\n82 -1\n92 -1\n97 -1\n112 -1\n117 -1\n158 1\nJ98 4\n27 -1\n107 -1\n122 -1\n159 1\nJ99 21\n3 -1\n8 -1\n13 -1\n18 -1\n23 -1\n28 -1\n33 -1\n38 -1\n48 -1\n53 -1\n58 -1\n63 -1\n68 -1\n78 -1\n103 -1\n108 -1\n113 -1\n118 -1\n123 -1\n128 -1\n146 1\nJ100 4\n43 -1\n88 -1\n93 -1\n147 1\nJ101 3\n83 -1\n98 -1\n149 1\nJ102 9\n3 -1\n13 -1\n48 -1\n73 -1\n78 -1\n93 -1\n98 -1\n103 -1\n150 1\nJ103 15\n18 -1\n23 -1\n28 -1\n33 -1\n38 -1\n43 -1\n53 -1\n58 -1\n63 -1\n68 -1\n83 -1\n113 -1\n118 -1\n123 -1\n152 1\nJ104 3\n88 -1\n108 -1\n153 1\nJ105 25\n3 -1\n8 -1\n13 -1\n18 -1\n28 -1\n33 -1\n43 -1\n48 -1\n53 -1\n58 -1\n63 -1\n68 -1\n73 -1\n78 -1\n83 -1\n88 -1\n93 -1\n98 -1\n103 -1\n108 -1\n113 -1\n118 -1\n123 -1\n128 -1\n155 1\nJ106 3\n23 -1\n38 -1\n156 1\nJ107 13\n3 -1\n13 -1\n23 -1\n33 -1\n38 -1\n43 -1\n48 -1\n73 -1\n78 -1\n88 -1\n103 -1\n128 -1\n157 1\nJ108 12\n8 -1\n18 -1\n53 -1\n58 -1\n63 -1\n68 -1\n83 -1\n93 -1\n98 -1\n113 -1\n118 -1\n158 1\nJ109 4\n28 -1\n108 -1\n123 -1\n159 1\nJ110 21\n4 -1\n9 -1\n14 -1\n19 -1\n24 -1\n29 -1\n34 -1\n39 -1\n49 -1\n54 -1\n59 -1\n64 -1\n69 -1\n79 -1\n104 -1\n109 -1\n114 -1\n119 -1\n124 -1\n129 -1\n146 1\nJ111 4\n44 -1\n89 -1\n94 -1\n147 1\nJ112 3\n84 -1\n99 -1\n149 1\nJ113 9\n4 -1\n14 -1\n49 -1\n74 -1\n79 -1\n94 -1\n99 -1\n104 -1\n150 1\nJ114 15\n19 -1\n24 -1\n29 -1\n34 -1\n39 -1\n44 -1\n54 -1\n59 -1\n64 -1\n69 -1\n84 -1\n114 -1\n119 -1\n124 -1\n152 1\nJ115 3\n89 -1\n109 -1\n153 1\nJ116 25\n4 -1\n9 -1\n14 -1\n19 -1\n29 -1\n34 -1\n44 -1\n49 -1\n54 -1\n59 -1\n64 -1\n69 -1\n74 -1\n79 -1\n84 -1\n89 -1\n94 -1\n99 -1\n104 -1\n109 -1\n114 -1\n119 -1\n124 -1\n129 -1\n155 1\nJ117 3\n24 -1\n39 -1\n156 1\nJ118 13\n4 -1\n14 -1\n24 -1\n34 -1\n39 -1\n44 -1\n49 -1\n74 -1\n79 -1\n89 -1\n104 -1\n129 -1\n157 1\nJ119 12\n9 -1\n19 -1\n54 -1\n59 -1\n64 -1\n69 -1\n84 -1\n94 -1\n99 -1\n114 -1\n119 -1\n158 1\nJ120 4\n29 -1\n109 -1\n124 -1\n159 1\nG0 30\n130 -1\n131 1\n132 -1\n133 -1\n134 -1\n135 -1\n136 -1\n137 -1\n138 -1\n139 -1\n140 -1\n141 -1\n142 -1\n143 -1\n144 -1\n145 -1\n146 1\n147 1\n148 1\n149 1\n150 1\n151 1\n152 1\n153 1\n154 1\n155 1\n156 1\n157 1\n158 1\n159 1\n"
  },
  {
    "path": "src/test/resources/samples/langs/NSIS/bigtest.nsi",
    "content": "; bigtest.nsi\n;\n; This script attempts to test most of the functionality of the NSIS exehead.\n\n;--------------------------------\n\n!ifdef HAVE_UPX\n!packhdr tmp.dat \"upx\\upx -9 tmp.dat\"\n!endif\n\n!ifdef NOCOMPRESS\nSetCompress off\n!endif\n\n;--------------------------------\n\nName \"BigNSISTest\"\nCaption \"NSIS Big Test\"\nIcon \"${NSISDIR}\\Contrib\\Graphics\\Icons\\nsis1-install.ico\"\nOutFile \"bigtest.exe\"\n\nSetDateSave on\nSetDatablockOptimize on\nCRCCheck on\nSilentInstall normal\nBGGradient 000000 800000 FFFFFF\nInstallColors FF8080 000030\nXPStyle on\n\nInstallDir \"$PROGRAMFILES\\NSISTest\\BigNSISTest\"\nInstallDirRegKey HKLM \"Software\\NSISTest\\BigNSISTest\" \"Install_Dir\"\n\nCheckBitmap \"${NSISDIR}\\Contrib\\Graphics\\Checks\\classic-cross.bmp\"\n\nLicenseText \"A test text, make sure it's all there\"\nLicenseData \"bigtest.nsi\"\n\nRequestExecutionLevel admin\n\n;--------------------------------\n\nPage license\nPage components\nPage directory\nPage instfiles\n\nUninstPage uninstConfirm\nUninstPage instfiles\n\n;--------------------------------\n\n!ifndef NOINSTTYPES ; only if not defined\n  InstType \"Most\"\n  InstType \"Full\"\n  InstType \"More\"\n  InstType \"Base\"\n  ;InstType /NOCUSTOM\n  ;InstType /COMPONENTSONLYONCUSTOM\n!endif\n\nAutoCloseWindow false\nShowInstDetails show\n\n;--------------------------------\n\nSection \"\" ; empty string makes it hidden, so would starting with -\n\n  ; write reg info\n  StrCpy $1 \"POOOOOOOOOOOP\"\n  DetailPrint \"I like to be able to see what is going on (debug) $1\"\n  WriteRegStr HKLM SOFTWARE\\NSISTest\\BigNSISTest \"Install_Dir\" \"$INSTDIR\"\n\n  ; write uninstall strings\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\BigNSISTest\" \"DisplayName\" \"BigNSISTest (remove only)\"\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\BigNSISTest\" \"UninstallString\" '\"$INSTDIR\\bt-uninst.exe\"'\n\n  SetOutPath $INSTDIR\n  File /a \"silent.nsi\"\n  CreateDirectory \"$INSTDIR\\MyProjectFamily\\MyProject\" ; 2 recursively create a directory for fun.\n  WriteUninstaller \"bt-uninst.exe\"\n  \n  Nop ; for fun\n\nSectionEnd\n\nSection \"TempTest\"\n\nSectionIn 1 2 3\n  Start: MessageBox MB_OK \"Start:\"\n\n  MessageBox MB_YESNO \"Goto MyLabel\" IDYES MyLabel\n\n  MessageBox MB_OK \"Right before MyLabel:\"\n\n  MyLabel: MessageBox MB_OK \"MyLabel:\"\n  \n  MessageBox MB_OK \"Right after MyLabel:\"\n\n  MessageBox MB_YESNO \"Goto Start:?\" IDYES Start\n\nSectionEnd\n\nSectionGroup /e SectionGroup1\n\nSection \"Test Registry/INI functions\"\n\nSectionIn 1 4 3\n\n  WriteRegStr HKLM SOFTWARE\\NSISTest\\BigNSISTest \"StrTest_INSTDIR\" \"$INSTDIR\"\n  WriteRegDword HKLM SOFTWARE\\NSISTest\\BigNSISTest \"DwordTest_0xDEADBEEF\" 0xdeadbeef\n  WriteRegDword HKLM SOFTWARE\\NSISTest\\BigNSISTest \"DwordTest_123456\" 123456\n  WriteRegDword HKLM SOFTWARE\\NSISTest\\BigNSISTest \"DwordTest_0123\" 0123\n  WriteRegBin HKLM SOFTWARE\\NSISTest\\BigNSISTest \"BinTest_deadbeef01f00dbeef\" \"DEADBEEF01F00DBEEF\"\n  StrCpy $8 \"$SYSDIR\\IniTest\"\n  WriteINIStr \"$INSTDIR\\test.ini\"  \"MySection\" \"Value1\" $8\n  WriteINIStr \"$INSTDIR\\test.ini\"  \"MySectionIni\" \"Value1\" $8\n  WriteINIStr \"$INSTDIR\\test.ini\"  \"MySectionIni\" \"Value2\" $8\n  WriteINIStr \"$INSTDIR\\test.ini\"  \"IniOn\" \"Value1\" $8\n\n  Call MyFunctionTest\n\n  DeleteINIStr \"$INSTDIR\\test.ini\" \"IniOn\" \"Value1\"\n  DeleteINISec \"$INSTDIR\\test.ini\" \"MySectionIni\"\n\n  ReadINIStr $1 \"$INSTDIR\\test.ini\" \"MySectionIni\" \"Value1\"\n  StrCmp $1 \"\" INIDelSuccess\n    MessageBox MB_OK \"DeleteINISec failed\"\n  INIDelSuccess:\n\n  ClearErrors\n  ReadRegStr $1 HKCR \"software\\microsoft\" xyz_cc_does_not_exist\n  IfErrors 0 NoError\n    MessageBox MB_OK \"could not read from HKCR\\software\\microsoft\\xyz_cc_does_not_exist\"\n    Goto ErrorYay\n  NoError:\n    MessageBox MB_OK \"read '$1' from HKCR\\software\\microsoft\\xyz_cc_does_not_exist\"\n  ErrorYay:\n  \nSectionEnd\n\nSection \"Test CreateShortCut\"\n\n  SectionIn 1 2 3\n\n  Call CSCTest\n\nSectionEnd\n\nSectionGroup Group2\n\nSection \"Test Branching\" \n  \n  BeginTestSection:\n  SectionIn 1 2 3\n \n  SetOutPath $INSTDIR\n\n  IfFileExists \"$INSTDIR\\LogicLib.nsi\" 0 BranchTest69\n    \n    MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to overwrite $INSTDIR\\LogicLib.nsi?\" IDNO NoOverwrite ; skipped if file doesn't exist\n\n    BranchTest69:\n  \n    SetOverwrite ifnewer ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS\n\n  NoOverwrite:\n\n  File \"LogicLib.nsi\" ; skipped if answered no\n  SetOverwrite try ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS\n\n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to skip the rest of this section?\" IDYES EndTestBranch\n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to go back to the beginning of this section?\" IDYES BeginTestSection\n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to hide the installer and wait five seconds?\" IDNO NoHide\n\n    HideWindow\n    Sleep 5000\n    BringToFront\n\n  NoHide:\n\n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to call the function 5 times?\" IDNO NoRecurse\n\n    StrCpy $1 \"x\"\n\n  LoopTest: \n      \n    Call myfunc\n    StrCpy $1 \"x$1\"\n    StrCmp $1 \"xxxxxx\" 0 LoopTest\n      \n  NoRecurse:\n\n  EndTestBranch:\n\nSectionEnd\n\nSectionGroupEnd\n\nSection \"Test CopyFiles\"\n\n  SectionIn 1 2 3\n\n  SetOutPath $INSTDIR\\cpdest\n  CopyFiles \"$WINDIR\\*.ini\" \"$INSTDIR\\cpdest\" 0\n\nSectionEnd\n\nSectionGroupEnd\n\nSection \"Test Exec functions\" TESTIDX\n\n  SectionIn 1 2 3\n  \n  SearchPath $1 notepad.exe\n\n  MessageBox MB_OK \"notepad.exe=$1\"\n  Exec '\"$1\"'\n  ExecShell \"open\" '\"$INSTDIR\"'\n  Sleep 500\n  BringToFront\n\nSectionEnd\n\nSection \"Test ActiveX control registration\"\n\n  SectionIn 2\n\n  UnRegDLL \"$SYSDIR\\spin32.ocx\"\n  Sleep 1000\n  RegDLL \"$SYSDIR\\spin32.ocx\"\n  Sleep 1000\n  \nSectionEnd\n\n;--------------------------------\n\nFunction \"CSCTest\"\n  \n  CreateDirectory \"$SMPROGRAMS\\Big NSIS Test\"\n  SetOutPath $INSTDIR ; for working directory\n  CreateShortCut \"$SMPROGRAMS\\Big NSIS Test\\Uninstall BIG NSIS Test.lnk\" \"$INSTDIR\\bt-uninst.exe\" ; use defaults for parameters, icon, etc.\n  ; this one will use notepad's icon, start it minimized, and give it a hotkey (of Ctrl+Shift+Q)\n  CreateShortCut \"$SMPROGRAMS\\Big NSIS Test\\silent.nsi.lnk\" \"$INSTDIR\\silent.nsi\" \"\" \"$WINDIR\\notepad.exe\" 0 SW_SHOWMINIMIZED CONTROL|SHIFT|Q\n  CreateShortCut \"$SMPROGRAMS\\Big NSIS Test\\TheDir.lnk\" \"$INSTDIR\\\" \"\" \"\" 0 SW_SHOWMAXIMIZED CONTROL|SHIFT|Z\n\nFunctionEnd\n\nFunction myfunc\n\n  StrCpy $2 \"MyTestVar=$1\"\n  MessageBox MB_OK \"myfunc: $2\"\n\nFunctionEnd\n\nFunction MyFunctionTest\n\n  ReadINIStr $1 \"$INSTDIR\\test.ini\" \"MySectionIni\" \"Value1\"\n  StrCmp $1 $8 NoFailedMsg\n    MessageBox MB_OK \"WriteINIStr failed\"\n  \n  NoFailedMsg:\n\nFunctionEnd\n\nFunction .onSelChange\n\n  SectionGetText ${TESTIDX} $0\n  StrCmp $0 \"\" e\n    SectionSetText ${TESTIDX} \"\"\n  Goto e2\ne:\n  SectionSetText ${TESTIDX} \"TextInSection\"\ne2:\n\nFunctionEnd\n\n;--------------------------------\n\n; Uninstaller\n\nUninstallText \"This will uninstall example2. Hit next to continue.\"\nUninstallIcon \"${NSISDIR}\\Contrib\\Graphics\\Icons\\nsis1-uninstall.ico\"\n\nSection \"Uninstall\"\n\n  DeleteRegKey HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\BigNSISTest\"\n  DeleteRegKey HKLM \"SOFTWARE\\NSISTest\\BigNSISTest\"\n  Delete \"$INSTDIR\\silent.nsi\"\n  Delete \"$INSTDIR\\LogicLib.nsi\"\n  Delete \"$INSTDIR\\bt-uninst.exe\"\n  Delete \"$INSTDIR\\test.ini\"\n  Delete \"$SMPROGRAMS\\Big NSIS Test\\*.*\"\n  RMDir \"$SMPROGRAMS\\BiG NSIS Test\"\n  \n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to remove the directory $INSTDIR\\cpdest?\" IDNO NoDelete\n    Delete \"$INSTDIR\\cpdest\\*.*\"\n    RMDir \"$INSTDIR\\cpdest\" ; skipped if no\n  NoDelete:\n  \n  RMDir \"$INSTDIR\\MyProjectFamily\\MyProject\"\n  RMDir \"$INSTDIR\\MyProjectFamily\"\n  RMDir \"$INSTDIR\"\n\n  IfFileExists \"$INSTDIR\" 0 NoErrorMsg\n    MessageBox MB_OK \"Note: $INSTDIR could not be removed!\" IDOK 0 ; skipped if file doesn't exist\n  NoErrorMsg:\n\nSectionEnd\n"
  },
  {
    "path": "src/test/resources/samples/langs/NSIS/x64.nsh",
    "content": "; ---------------------\n;       x64.nsh\n; ---------------------\n;\n; A few simple macros to handle installations on x64 machines.\n;\n; RunningX64 checks if the installer is running on x64.\n;\n;   ${If} ${RunningX64}\n;     MessageBox MB_OK \"running on x64\"\n;   ${EndIf}\n;\n; DisableX64FSRedirection disables file system redirection.\n; EnableX64FSRedirection enables file system redirection.\n;\n;   SetOutPath $SYSDIR\n;   ${DisableX64FSRedirection}\n;   File some.dll # extracts to C:\\Windows\\System32\n;   ${EnableX64FSRedirection}\n;   File some.dll # extracts to C:\\Windows\\SysWOW64\n;\n\n!ifndef ___X64__NSH___\n!define ___X64__NSH___\n\n!include LogicLib.nsh\n\n!macro _RunningX64 _a _b _t _f\n  !insertmacro _LOGICLIB_TEMP\n  System::Call kernel32::GetCurrentProcess()i.s\n  System::Call kernel32::IsWow64Process(is,*i.s)\n  Pop $_LOGICLIB_TEMP\n  !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`\n!macroend\n\n!define RunningX64 `\"\" RunningX64 \"\"`\n\n!macro DisableX64FSRedirection\n\n  System::Call kernel32::Wow64EnableWow64FsRedirection(i0)\n\n!macroend\n\n!define DisableX64FSRedirection \"!insertmacro DisableX64FSRedirection\"\n\n!macro EnableX64FSRedirection\n\n  System::Call kernel32::Wow64EnableWow64FsRedirection(i1)\n\n!macroend\n\n!define EnableX64FSRedirection \"!insertmacro EnableX64FSRedirection\"\n\n!endif # !___X64__NSH___\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nearley/nearley-language-bootstrapped.ne",
    "content": "# nearley grammar\n@builtin \"string.ne\"\n\n@{%\n\nfunction insensitive(sl) {\n    var s = sl.literal;\n    result = [];\n    for (var i=0; i<s.length; i++) {\n        var c = s.charAt(i);\n        if (c.toUpperCase() !== c || c.toLowerCase() !== c) {\n            result.push(new RegExp(\"[\" + c.toLowerCase() + c.toUpperCase() + \"]\"));\n        } else {\n            result.push({literal: c});\n        }\n    }\n    return {subexpression: [{tokens: result, postprocess: function(d) {return d.join(\"\"); }}]};\n}\n\n%}\n\nfinal -> whit? prog whit?  {% function(d) { return d[1]; } %}\n\nprog -> prod  {% function(d) { return [d[0]]; } %}\n      | prod whit prog  {% function(d) { return [d[0]].concat(d[2]); } %}\n\nprod -> word whit? (\"-\"|\"=\"):+ \">\" whit? expression+  {% function(d) { return {name: d[0], rules: d[5]}; } %}\n      | word \"[\" wordlist \"]\" whit? (\"-\"|\"=\"):+ \">\" whit? expression+ {% function(d) {return {macro: d[0], args: d[2], exprs: d[8]}} %}\n      | \"@\" whit? js  {% function(d) { return {body: d[2]}; } %}\n      | \"@\" word whit word  {% function(d) { return {config: d[1], value: d[3]}; } %}\n      | \"@include\"  whit? string {% function(d) {return {include: d[2].literal, builtin: false}} %}\n      | \"@builtin\"  whit? string {% function(d) {return {include: d[2].literal, builtin: true }} %}\n\nexpression+ -> completeexpression\n             | expression+ whit? \"|\" whit? completeexpression  {% function(d) { return d[0].concat([d[4]]); } %}\n\nexpressionlist -> completeexpression\n             | expressionlist whit? \",\" whit? completeexpression {% function(d) { return d[0].concat([d[4]]); } %}\n\nwordlist -> word\n            | wordlist whit? \",\" whit? word {% function(d) { return d[0].concat([d[4]]); } %}\n\ncompleteexpression -> expr  {% function(d) { return {tokens: d[0]}; } %}\n                    | expr whit? js  {% function(d) { return {tokens: d[0], postprocess: d[2]}; } %}\n\nexpr_member ->\n      word {% id %}\n    | \"$\" word {% function(d) {return {mixin: d[1]}} %}\n    | word \"[\" expressionlist \"]\" {% function(d) {return {macrocall: d[0], args: d[2]}} %} \n    | string \"i\":? {% function(d) { if (d[1]) {return insensitive(d[0]); } else {return d[0]; } } %}\n    | \"%\" word {% function(d) {return {token: d[1]}} %}\n    | charclass {% id %}\n    | \"(\" whit? expression+ whit? \")\" {% function(d) {return {'subexpression': d[2]} ;} %}\n    | expr_member whit? ebnf_modifier {% function(d) {return {'ebnf': d[0], 'modifier': d[2]}; } %}\n\nebnf_modifier -> \":+\" {% id %} | \":*\" {% id %} | \":?\" {% id %}\n\nexpr -> expr_member\n      | expr whit expr_member  {% function(d){ return d[0].concat([d[2]]); } %}\n\nword -> [\\w\\?\\+]  {% function(d){ return d[0]; } %}\n      | word [\\w\\?\\+]  {% function(d){ return d[0]+d[1]; } %}\n\nstring -> dqstring {% function(d) {return { literal: d[0] }; } %}\n#string -> \"\\\"\" charset \"\\\"\"  {% function(d) { return { literal: d[1].join(\"\") }; } %}\n#\n#charset -> null\n#         | charset char  {% function(d) { return d[0].concat([d[1]]); } %}\n#\n#char -> [^\\\\\"]  {% function(d) { return d[0]; } %}\n#      | \"\\\\\" .  {% function(d) { return JSON.parse(\"\\\"\"+\"\\\\\"+d[1]+\"\\\"\"); } %}\n\ncharclass -> \".\"  {% function(d) { return new RegExp(\".\"); } %}\n           | \"[\" charclassmembers \"]\"  {% function(d) { return new RegExp(\"[\" + d[1].join('') + \"]\"); } %}\n\ncharclassmembers -> null\n                  | charclassmembers charclassmember  {% function(d) { return d[0].concat([d[1]]); } %}\n\ncharclassmember -> [^\\\\\\]]  {% function(d) { return d[0]; } %}\n                 | \"\\\\\" .  {% function(d) { return d[0] + d[1]; } %}\n\njs -> \"{\" \"%\" jscode \"%\" \"}\"  {% function(d) { return d[2]; } %}\n\njscode -> null  {% function() {return \"\";} %}\n        | jscode [^%]  {% function(d) {return d[0] + d[1];} %}\n        | jscode \"%\" [^}] {% function(d) {return d[0] + d[1] + d[2]; } %}\n\n# Whitespace with a comment\nwhit -> whitraw\n      | whitraw? comment whit?\n\n# Optional whitespace with a comment\nwhit? -> null\n       | whit\n\n# Literally a string of whitespace\nwhitraw -> [\\s]\n         | whitraw [\\s]\n\n# A string of whitespace OR the empty string\nwhitraw? -> null\n          | whitraw\n\ncomment -> \"#\" commentchars \"\\n\"\ncommentchars -> null\n              | commentchars [^\\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nemerle/hello.n",
    "content": "using System.Console;\n\nmodule Program\n{\n   Main() : void\n   {\n     WriteLine(\"Hello world\");\n   }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/NetLinx/projector.axi",
    "content": "(***********************************************************\n    Mock Projector\n    \n    For testing syntax highlighting\n************************************************************)\n\n#if_not_defined MOCK_PROJECTOR\n#define MOCK_PROJECTOR 1\n(***********************************************************)\n(* System Type : NetLinx                                   *)\n(***********************************************************)\n(*           DEVICE NUMBER DEFINITIONS GO BELOW            *)\n(***********************************************************)\nDEFINE_DEVICE\n\ndvPROJECTOR = 5001:1:0;\n\n(***********************************************************)\n(*              CONSTANT DEFINITIONS GO BELOW              *)\n(***********************************************************)\nDEFINE_CONSTANT\n\n// Power States\nPOWER_STATE_ON      = 0;\nPOWER_STATE_OFF     = 1;\nPOWER_STATE_WARMING = 2;\nPOWER_STATE_COOLING = 3;\n\n// Inputs\nINPUT_HDMI          = 0;\nINPUT_VGA           = 1;\nINPUT_COMPOSITE     = 2;\nINPUT_SVIDEO        = 3;\n\n(***********************************************************)\n(*                    INCLUDES GO BELOW                    *)\n(***********************************************************)\n\n#include 'amx-lib-log'\n\n(***********************************************************)\n(*              DATA TYPE DEFINITIONS GO BELOW             *)\n(***********************************************************)\nDEFINE_TYPE\n\nstruct projector_t\n{\n    integer power_state;\n    integer input;\n    integer lamp_hours;\n}\n\n(***********************************************************)\n(*              VARIABLE DEFINITIONS GO BELOW              *)\n(***********************************************************)\nDEFINE_VARIABLE\n\nvolatile projector_t proj_1;\n\n(***********************************************************)\n(*         SUBROUTINE/FUNCTION DEFINITIONS GO BELOW        *)\n(***********************************************************)\n\ndefine_function initialize(projector_t self)\n{\n    self.power_state = POWER_STATE_OFF;\n    self.input = INPUT_HDMI;\n    self.lamp_hours = 0;\n}\n\ndefine_function switch_input(projector_t self, integer input)\n{\n    self.input = input;\n    print(LOG_LEVEL_INFO, \"'Projector set to input: ', itoa(input)\");\n}\n\n(***********************************************************)\n(*                 STARTUP CODE GOES BELOW                 *)\n(***********************************************************)\nDEFINE_START\n\ninitialize(proj_1);\n\n(***********************************************************)\n(*                   THE EVENTS GO BELOW                   *)\n(***********************************************************)\nDEFINE_EVENT\n\ndata_event[dvPROJECTOR]\n{\n    string:\n    {\n        parse_message(data.text);\n    }\n    \n    command: {}\n    online:  {}\n    offline: {}\n}\n\nbutton_event[dvTP, BTN_HDMI]\nbutton_event[dvTP, BTN_VGA]\nbutton_event[dvTP, BTN_COMPOSITE]\nbutton_event[dvTP, BTN_SVIDEO]\n{\n    push:\n    {\n        switch (button.input.channel)\n        {\n            case BTN_HDMI:      switch_input(proj_1, INPUT_HDMI);\n            case BTN_VGA:       switch_input(proj_1, INPUT_VGA);\n            case BTN_COMPOSITE: switch_input(proj_1, INPUT_COMPOSITE);\n            case BTN_SVIDEO:    switch_input(proj_1, INPUT_SVIDEO);\n        }\n    }\n    \n    release: {}\n}\n\n(***********************************************************)\n(*                 THE MAINLINE GOES BELOW                 *)\n(***********************************************************)\nDEFINE_PROGRAM\n\n[dvTP, BTN_POWER_ON]  = (proj_1.power_state == POWER_STATE_ON);\n[dvTP, BTN_POWER_OFF] = (proj_1.power_state == POWER_STATE_OFF);\n\n(***********************************************************)\n(*                     END OF PROGRAM                      *)\n(*          DO NOT PUT ANY CODE BELOW THIS COMMENT         *)\n(***********************************************************)\n#end_if\n"
  },
  {
    "path": "src/test/resources/samples/langs/NetLinx/volume-array.axs",
    "content": "(***********************************************************\n    AMX VOLUME CONTROL\n    VOLUME ARRAY EXAMPLE\n    \n    Website: https://sourceforge.net/projects/amx-lib-volume/\n    \n    \n    This application demonstrates the use of volume control\n    arrays using the amx-lib-volume library.\n    \n    Volume control operation can be viewed by watching the\n    master's internal diagnostic output.\n    \n    I/O PORT CONNECTIONS:\n    Ch 1: Volume Up Button\n    Ch 2: Volume Down Button\n************************************************************\nCopyright 2011, 2012, 2014 Alex McLain\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n************************************************************)\n\nPROGRAM_NAME='volume array'\n(***********************************************************)\n(***********************************************************)\n(* System Type : NetLinx                                   *)\n(***********************************************************)\n(* REV HISTORY:                                            *)\n(***********************************************************)\n(*\n    $History: See version control repository.\n*)\n(***********************************************************)\n(*                   INCLUDES GO BELOW                     *)\n(***********************************************************)\n\n// Include the volume control library.\n#include 'amx-lib-volume'\n\n(***********************************************************)\n(*          DEVICE NUMBER DEFINITIONS GO BELOW             *)\n(***********************************************************)\nDEFINE_DEVICE\n\ndvDebug = 0:0:0;        // For debug output.\n\ndvIO    = 36000:1:0;    // Volume up/down button connections.\n\n(***********************************************************)\n(*               CONSTANT DEFINITIONS GO BELOW             *)\n(***********************************************************)\nDEFINE_CONSTANT\n\n// Volume control indexes.\nMIC1    = 1;    // Microphone 1.\nMIC2    = 2;    // Microphone 2.\nMIC3    = 3;    // Microphone 3.\nMIC4    = 4;    // Microphone 4.\nWLS1    = 5;    // Wireless mic 1.\nWLS2    = 6;    // Wireless mic 2.\nIPOD    = 7;    // iPod input.\nCD      = 8;    // CD player input.\n\n(***********************************************************)\n(*              DATA TYPE DEFINITIONS GO BELOW             *)\n(***********************************************************)\nDEFINE_TYPE\n\n(***********************************************************)\n(*               VARIABLE DEFINITIONS GO BELOW             *)\n(***********************************************************)\nDEFINE_VARIABLE\n\n// Define a volume control array for the input devices.\nvolume inputs[8];\n\n(***********************************************************)\n(*               LATCHING DEFINITIONS GO BELOW             *)\n(***********************************************************)\nDEFINE_LATCHING\n\n(***********************************************************)\n(*       MUTUALLY EXCLUSIVE DEFINITIONS GO BELOW           *)\n(***********************************************************)\nDEFINE_MUTUALLY_EXCLUSIVE\n\n(***********************************************************)\n(*        SUBROUTINE/FUNCTION DEFINITIONS GO BELOW         *)\n(***********************************************************)\n(* EXAMPLE: DEFINE_FUNCTION <RETURN_TYPE> <NAME> (<PARAMETERS>) *)\n(* EXAMPLE: DEFINE_CALL '<NAME>' (<PARAMETERS>) *)\n\n(***********************************************************)\n(*                STARTUP CODE GOES BELOW                  *)\n(***********************************************************)\nDEFINE_START\n\n// Initialize the array of volume controls.\nvolArrayInit(inputs, 0, VOL_UNMUTED, 10000, 20000, 5);\n\n(***********************************************************)\n(*                THE EVENTS GO BELOW                      *)\n(***********************************************************)\nDEFINE_EVENT\n\n// Volume Up\nbutton_event[dvIO, 1]\n{\n    PUSH:\n    {\n        volArrayIncrement(inputs); // Increment the volume up a step.\n        send_string dvDebug, \"'Volume Up MIC1: ', itoa(volGetLevel(inputs[MIC1]))\";\n        send_string dvDebug, \"'Volume Up MIC2: ', itoa(volGetLevel(inputs[MIC2]))\";\n        send_string dvDebug, \"'Volume Up MIC3: ', itoa(volGetLevel(inputs[MIC3]))\";\n        send_string dvDebug, \"'Volume Up MIC4: ', itoa(volGetLevel(inputs[MIC4]))\";\n        send_string dvDebug, \"'Volume Up WLS1: ', itoa(volGetLevel(inputs[WLS1]))\";\n        send_string dvDebug, \"'Volume Up WLS2: ', itoa(volGetLevel(inputs[WLS2]))\";\n        send_string dvDebug, \"'Volume Up IPOD: ', itoa(volGetLevel(inputs[IPOD]))\";\n        send_string dvDebug, \"'Volume Up   CD: ', itoa(volGetLevel(inputs[CD]))\";\n    }\n}\n\n// Volume Down\nbutton_event[dvIO, 2]\n{\n    PUSH:\n    {\n        volArrayDecrement(inputs); // Decrement the volume down a step.\n        send_string dvDebug, \"'Volume Dn MIC1: ', itoa(volGetLevel(inputs[MIC1]))\";\n        send_string dvDebug, \"'Volume Dn MIC2: ', itoa(volGetLevel(inputs[MIC2]))\";\n        send_string dvDebug, \"'Volume Dn MIC3: ', itoa(volGetLevel(inputs[MIC3]))\";\n        send_string dvDebug, \"'Volume Dn MIC4: ', itoa(volGetLevel(inputs[MIC4]))\";\n        send_string dvDebug, \"'Volume Dn WLS1: ', itoa(volGetLevel(inputs[WLS1]))\";\n        send_string dvDebug, \"'Volume Dn WLS2: ', itoa(volGetLevel(inputs[WLS2]))\";\n        send_string dvDebug, \"'Volume Dn IPOD: ', itoa(volGetLevel(inputs[IPOD]))\";\n        send_string dvDebug, \"'Volume Dn   CD: ', itoa(volGetLevel(inputs[CD]))\";\n    }\n}\n\n(***********************************************************)\n(*            THE ACTUAL PROGRAM GOES BELOW                *)\n(***********************************************************)\nDEFINE_PROGRAM\n\n(***********************************************************)\n(*                     END OF PROGRAM                      *)\n(*        DO NOT PUT ANY CODE BELOW THIS COMMENT           *)\n(***********************************************************)\n"
  },
  {
    "path": "src/test/resources/samples/langs/NetLinx+ERB/sample.axi.erb",
    "content": "(***********************************************************\n    Sample File\n    \n    For testing syntax highlighting\n************************************************************)\n\n#if_not_defined Sample\n#define Sample 1\n(***********************************************************)\n(* System Type : NetLinx                                   *)\n(***********************************************************)\n(*           DEVICE NUMBER DEFINITIONS GO BELOW            *)\n(***********************************************************)\nDEFINE_DEVICE\n\n(***********************************************************)\n(*              CONSTANT DEFINITIONS GO BELOW              *)\n(***********************************************************)\nDEFINE_CONSTANT\n\n<% global_constant_justify = 20 -%>\n// Video Source Select Buttons\n<%=\n    video_sources = {\n        BTN_VID_FOH_PC:   { btn: 11, input: :VID_SRC_FOH_PC },\n        BTN_VID_STAGE_PC: { btn: 12, input: :VID_SRC_STAGE_PC },\n        BTN_VID_BLURAY:   { btn: 13, input: :VID_SRC_BLURAY },\n    }\n    \n    print_constant_hash video_sources.remap(:btn),\n        justify: global_constant_justify\n%>\n\n(***********************************************************)\n(*                    INCLUDES GO BELOW                    *)\n(***********************************************************)\n\n(***********************************************************)\n(*              DATA TYPE DEFINITIONS GO BELOW             *)\n(***********************************************************)\nDEFINE_TYPE\n\n(***********************************************************)\n(*              VARIABLE DEFINITIONS GO BELOW              *)\n(***********************************************************)\nDEFINE_VARIABLE\n\n(***********************************************************)\n(*         SUBROUTINE/FUNCTION DEFINITIONS GO BELOW        *)\n(***********************************************************)\n\n(***********************************************************)\n(*                 STARTUP CODE GOES BELOW                 *)\n(***********************************************************)\nDEFINE_START\n\n(***********************************************************)\n(*                   THE EVENTS GO BELOW                   *)\n(***********************************************************)\nDEFINE_EVENT\n\n// Video Source Select\n<%=\n    justify group(video_sources.remap :input) { |name, input|\n        \"[#{@dvTP}, #{name}] = (outputs[VID_DEST_PROJECTOR].input == #{input});\"\n    }\n%>\n\n(***********************************************************)\n(*                 THE MAINLINE GOES BELOW                 *)\n(***********************************************************)\nDEFINE_PROGRAM\n\n(***********************************************************)\n(*                     END OF PROGRAM                      *)\n(*          DO NOT PUT ANY CODE BELOW THIS COMMENT         *)\n(***********************************************************)\n#end_if\n"
  },
  {
    "path": "src/test/resources/samples/langs/NetLinx+ERB/sample.axs.erb",
    "content": "(***********************************************************\n    Sample File\n    \n    For testing syntax highlighting\n************************************************************)\n\n#if_not_defined Sample\n#define Sample 1\n(***********************************************************)\n(* System Type : NetLinx                                   *)\n(***********************************************************)\n(*           DEVICE NUMBER DEFINITIONS GO BELOW            *)\n(***********************************************************)\nDEFINE_DEVICE\n\n(***********************************************************)\n(*              CONSTANT DEFINITIONS GO BELOW              *)\n(***********************************************************)\nDEFINE_CONSTANT\n\n<% global_constant_justify = 20 -%>\n// Video Source Select Buttons\n<%=\n    video_sources = {\n        BTN_VID_FOH_PC:   { btn: 11, input: :VID_SRC_FOH_PC },\n        BTN_VID_STAGE_PC: { btn: 12, input: :VID_SRC_STAGE_PC },\n        BTN_VID_BLURAY:   { btn: 13, input: :VID_SRC_BLURAY },\n    }\n    \n    print_constant_hash video_sources.remap(:btn),\n        justify: global_constant_justify\n%>\n\n(***********************************************************)\n(*                    INCLUDES GO BELOW                    *)\n(***********************************************************)\n\n(***********************************************************)\n(*              DATA TYPE DEFINITIONS GO BELOW             *)\n(***********************************************************)\nDEFINE_TYPE\n\n(***********************************************************)\n(*              VARIABLE DEFINITIONS GO BELOW              *)\n(***********************************************************)\nDEFINE_VARIABLE\n\n(***********************************************************)\n(*         SUBROUTINE/FUNCTION DEFINITIONS GO BELOW        *)\n(***********************************************************)\n\n(***********************************************************)\n(*                 STARTUP CODE GOES BELOW                 *)\n(***********************************************************)\nDEFINE_START\n\n(***********************************************************)\n(*                   THE EVENTS GO BELOW                   *)\n(***********************************************************)\nDEFINE_EVENT\n\n// Video Source Select\n<%=\n    justify group(video_sources.remap :input) { |name, input|\n        \"[#{@dvTP}, #{name}] = (outputs[VID_DEST_PROJECTOR].input == #{input});\"\n    }\n%>\n\n(***********************************************************)\n(*                 THE MAINLINE GOES BELOW                 *)\n(***********************************************************)\nDEFINE_PROGRAM\n\n(***********************************************************)\n(*                     END OF PROGRAM                      *)\n(*          DO NOT PUT ANY CODE BELOW THIS COMMENT         *)\n(***********************************************************)\n#end_if\n"
  },
  {
    "path": "src/test/resources/samples/langs/NetLogo/Life.nlogo",
    "content": "patches-own [\n  living?         ;; indicates if the cell is living\n  live-neighbors  ;; counts how many neighboring cells are alive\n]\n\nto setup-blank\n  clear-all\n  ask patches [ cell-death ]\n  reset-ticks\nend\n\nto setup-random\n  clear-all\n  ask patches\n    [ ifelse random-float 100.0 < initial-density\n      [ cell-birth ]\n      [ cell-death ] ]\n  reset-ticks\nend\n\nto cell-birth\n  set living? true\n  set pcolor fgcolor\nend\n\nto cell-death\n  set living? false\n  set pcolor bgcolor\nend\n\nto go\n  ask patches\n    [ set live-neighbors count neighbors with [living?] ]\n  ;; Starting a new \"ask patches\" here ensures that all the patches\n  ;; finish executing the first ask before any of them start executing\n  ;; the second ask.  This keeps all the patches in synch with each other,\n  ;; so the births and deaths at each generation all happen in lockstep.\n  ask patches\n    [ ifelse live-neighbors = 3\n      [ cell-birth ]\n      [ if live-neighbors != 2\n        [ cell-death ] ] ]\n  tick\nend\n\nto draw-cells\n  let erasing? [living?] of patch mouse-xcor mouse-ycor\n  while [mouse-down?]\n    [ ask patch mouse-xcor mouse-ycor\n      [ ifelse erasing?\n        [ cell-death ]\n        [ cell-birth ] ]\n      display ]\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/NewLisp/irc.lsp",
    "content": "#!/usr/bin/env newlisp\n\n;; @module IRC\n;; @description a basic irc library\n;; @version early alpha! 0.1 2013-01-02 20:11:22\n;; @author cormullion\n;; Usage:\n;; (IRC:init \"newlithper\") ; a username/nick (not that one obviously :-)\n;; (IRC:connect \"irc.freenode.net\" 6667) ; irc/server\n;; (IRC:join-channel {#newlisp}) ; join a room\n;; either (IRC:read-irc-loop) ; loop - monitor only, no input\n;; or     (IRC:session)       ; a command-line session, end with /QUIT\n\n(context 'IRC)\n    (define Inickname)\n    (define Ichannels)\n    (define Iserver)\n    (define Iconnected)\n    (define Icallbacks '())\n    (define Idle-time 400) ; seconds\n    (define Itime-stamp)   ; time since last message was processed\n\n(define (register-callback callback-name callback-function)\n    (println {registering callback for } callback-name { : } (sym (term callback-function) (prefix callback-function)))\n    (push (list callback-name (sym (term callback-function) (prefix callback-function))) Icallbacks)) \n\n(define (deregister-callback callback-name)\n    (println {deregistering callback for } callback-name)\n    (setf (assoc \"idle-event\" Icallbacks) nil)\n    (println {current callbacks: } Icallbacks)) \n\n(define (do-callback callback-name data)\n   (when (set 'func (lookup callback-name Icallbacks)) ; find first callback\n         (if-not (catch (apply func (list data)) 'error)\n                 (println {error in callback } callback-name {: } error))))\n\n(define (do-callbacks callback-name data)\n   (dolist (rf (ref-all callback-name Icallbacks))\n        (set 'callback-entry (Icallbacks (first rf)))\n        (when   (set 'func (last callback-entry))\n                (if-not (catch (apply func (list data)) 'error)\n                (println {error in callback } callback-name {: } error)))))\n\n(define (init str)\n   (set 'Inickname str)\n   (set 'Iconnected nil)\n   (set 'Ichannels '())\n   (set 'Itime-stamp (time-of-day)))\n\n(define (connect server port)\n    (set 'Iserver     (net-connect server port))\n    (net-send Iserver (format \"USER %s %s %s :%s\\r\\n\" Inickname Inickname Inickname Inickname))\n    (net-send Iserver (format \"NICK %s \\r\\n\" Inickname))\n    (set 'Iconnected true)\n    (do-callbacks \"connect\" (list (list \"server\" server) (list \"port\" port))))\n\n(define (identify password)\n    (net-send Iserver (format \"PRIVMSG nickserv :identify %s\\r\\n\" password)))\n\n(define (join-channel channel)\n    (when (net-send Iserver (format \"JOIN %s \\r\\n\" channel))\n          (push channel Ichannels)\n          (do-callbacks \"join-channel\" (list (list \"channel\" channel) (list \"nickname\" Inickname)))))\n\n(define (part chan)\n    (if-not (empty? chan)\n        ; leave specified\n        (begin\n            (net-send Iserver (format \"PART %s\\r\\n\" chan))\n            (replace channel Ichannels)\n            (do-callbacks \"part\" (list (list \"channel\" channel))))\n        ; leave all\n        (begin\n            (dolist (channel Ichannels)\n                (net-send Iserver (format \"PART %s\\r\\n\" channel))\n                (replace channel Ichannels)\n                (do-callbacks \"part\" (list (list \"channel\" channel)))))))\n\n(define (do-quit message)\n    (do-callbacks \"quit\" '()) ; chance to do stuff before quit...\n    (net-send Iserver (format \"QUIT :%s\\r\\n\" message))\n    (sleep 1000)\n    (set 'Ichannels '())\n    (close Iserver)\n    (set 'Iconnected nil))\n\n(define (privmsg user message)\n    (net-send Iserver (format \"PRIVMSG %s :%s\\r\\n\" user message)))\n\n(define (notice user message)\n    (net-send Iserver (format \"NOTICE %s :%s\\r\\n\" user message)))\n\n(define (send-to-server message (channel nil))\n    (cond\n        ((starts-with message {/}) ; default command character\n            (set 'the-message (replace \"^/\" (copy message) {} 0)) ; keep original\n            (net-send Iserver (format \"%s \\r\\n\" the-message)) ; send it\n            ; do a quit\n            (if (starts-with (lower-case the-message) \"quit\")\n                (do-quit { enough})))\n        (true \n            (if (nil? channel)\n                ; say to all channels\n                (dolist (c Ichannels)\n                        (net-send Iserver (format \"PRIVMSG %s :%s\\r\\n\" c message)))\n                ; say to specified channel\n                (if (find channel Ichannels)\n                    (net-send Iserver (format \"PRIVMSG %s :%s\\r\\n\" channel message))))))\n    (do-callbacks \"send-to-server\" (list (list \"channel\" channel) (list \"message\" message))))\n\n(define (process-command sender command text)\n    (cond\n        ((= sender \"PING\")\n            (net-send Iserver (format \"PONG %s\\r\\n\" command)))\n        ((or (= command \"NOTICE\") (= command \"PRIVMSG\"))\n            (process-message sender command text))\n        ((= command \"JOIN\")\n            (set 'username (first (clean empty? (parse sender {!|:} 0))))\n            (set 'channel  (last  (clean empty? (parse sender {!|:} 0))))\n            (println {username } username { joined } channel)\n            (do-callbacks \"join\" (list (list \"channel\" channel) (list \"username\" username))))\n        (true\n            nil)))\n\n(define (process-message sender command text)\n    (let ((username {} target {} message {}))\n        (set 'username (first (clean empty? (parse sender {!|:} 0))))\n        (set 'target   (trim  (first (clean empty? (parse text {!|:} 0)))))\n        (set 'message  (slice text (+ (find {:} text) 1)))\n        (cond \n            ((starts-with message \"\\001\")\n                (process-ctcp username target message))\n            ((find target Ichannels)\n                (cond \n                    ((= command {PRIVMSG})\n                        (do-callbacks \"channel-message\" (list (list \"channel\" target) (list \"username\" username) (list \"message\" message))))\n                    ((= command {NOTICE})\n                        (do-callbacks \"channel-notice\"  (list (list \"channel\" target) (list \"username\" username) (list \"message\" message))))))\n            ((= target Inickname)\n                (cond \n                    ((= command {PRIVMSG})\n                        (do-callbacks \"private-message\" (list (list \"username\" username) (list \"message\" message))))\n                    ((= command {NOTICE})\n                        (do-callbacks \"private-notice\"  (list (list \"username\" username) (list \"message\" message))))))\n            (true                \n                nil))))\n  \n(define (process-ctcp username target message)\n    (cond\n        ((starts-with message \"\\001VERSION\\001\")\n            (net-send Iserver (format \"NOTICE %s :\\001VERSION %s\\001\\r\\n\" username message)))\n        ((starts-with message \"\\001PING\")\n            (set 'data (first (rest (clean empty? (parse message { } 0)))))\n            (set 'data (trim data \"\\001\" \"\\001\"))\n            (net-send Iserver  (format \"NOTICE %s :\\001PING %s\\001\\r\\n\" username data)))\n        ((starts-with message \"\\001ACTION\")\n;            (set 'data (first (rest (clean empty? (parse message { } 0)))))\n;            (set 'data (join data { }))\n;            (set 'data (trim data \"\\001\" \"\\001\"))\n            (if (find target Ichannels)\n                (do-callbacks \"channel-action\" (list (list \"username\" username) (list \"message\" message))))\n            (if (= target Inickname)\n                (do-callbacks \"private-action\" (list (list \"username\" username) (list \"message\" message)))))\n        ((starts-with message \"\\001TIME\\001\")\n            (net-send Iserver (format \"NOTICE %s:\\001TIME :%s\\001\\r\\n\" username (date))))))\n\n(define (parse-buffer raw-buffer)\n    (let ((messages (clean empty? (parse raw-buffer \"\\r\\n\" 0)))\n          (sender {} command {} text {}))\n        ; check for elapsed time since last activity    \n        (when (> (sub (time-of-day) Itime-stamp) (mul Idle-time 1000))\n              (do-callbacks \"idle-event\")\n              (set 'Itime-stamp (time-of-day)))\n        (dolist (message messages)\n            (set 'message-parts (parse message { }))           \n            (unless (empty? message-parts)\n                (set 'sender (first message-parts))\n                (catch (set 'command (first (rest message-parts))) 'error)\n                (catch (set 'text (join (rest (rest message-parts)) { })) 'error))\n            (process-command sender command text))))\n\n(define (read-irc)\n    (let ((buffer {}))\n        (when (!= (net-peek Iserver) 0) \n              (net-receive Iserver buffer 8192 \"\\n\")\n              (unless (empty? buffer)\n                (parse-buffer buffer)))))\n\n(define (read-irc-loop) ; monitoring\n    (let ((buffer {}))       \n        (while Iconnected    \n            (read-irc)\n            (sleep 1000))))\n\n(define (print-raw-message data) ; example of using a callback\n    (set 'raw-data (lookup \"message\" data))\n    (set 'channel  (lookup \"channel\" data))\n    (set 'message-text raw-data)\n    (println (date (date-value) 0 {%H:%M:%S }) username {> } message-text))\n\n(define (print-outgoing-message data)\n    (set 'raw-data (lookup \"message\" data))\n    (set 'channel  (lookup \"channel\" data))\n    (set 'message-text raw-data)\n    (println (date (date-value) 0 {%H:%M:%S }) Inickname {> } message-text))\n\n(define (session); interactive terminal\n    ; must add callbacks to display messages\n    (register-callback \"channel-message\" 'print-raw-message)\n    (register-callback \"send-to-server\"  'print-outgoing-message)\n    (while Iconnected\n        (while (zero? (peek 0))\n            (read-irc)\n            (sleep 1000))\n        (send-to-server (string (read-line 0))))\n    (println {finished session } (date))\n    (exit))\n\n; end of IRC code\n\n[text]\n\nsimple bot code:\n(load (string (env {HOME}) {/projects/programming/newlisp-projects/irc.lsp}))\n(context 'BOT)\n(define bot-name \"bot\")\n(define (join-channel data)\n\t\t(println {in BOT:join-channel with data: } data))\n(define (process-message data)\n        ????)\n(IRC:register-callback \"join-channel\"    'join-channel) \n(IRC:register-callback \"channel-message\" 'process-message)\n(IRC:register-callback \"idle-event\"      'do-idle-event)\n(IRC:register-callback \"send-to-server\"  'do-send-event)\n(IRC:init bot-name)\n(IRC:connect \"irc.freenode.net\" 6667)\n(IRC:join-channel {#newlisp})\n(IRC:read-irc-loop)\n[/text]"
  },
  {
    "path": "src/test/resources/samples/langs/NewLisp/log-to-database.lisp",
    "content": "(module \"sqlite3.lsp\") ; loads the SQLite3 database module\r\n\r\n; FUNCTIONS-------------------------------------------------\r\n\r\n(define (displayln str-to-display)\r\n \t(println str-to-display)\t\r\n)\r\n\r\n(define (open-database sql-db-to-open)\r\n\t(if (sql3:open (string sql-db-to-open \".db\"))  \r\n\t\t(displayln \"\")\r\n\t\t(displayln \"There was a problem opening the database \" sql-db-to-open \": \" (sql3:error))))\r\n\r\n(define (close-database)\r\n\t(if (sql3:close)\r\n\t\t(displayln \"\")\r\n\t\t(displayln \"There was a problem closing the database: \" (sql3:error))))\r\n\r\n;====== SAFE-FOR-SQL ===============================================================\r\n; this function makes strings safe for inserting into SQL statements\r\n; to avoid SQL injection issues\r\n; it's simple right now but will add to it later\r\n;===================================================================================\r\n(define (safe-for-sql str-sql-query)\r\n\t(if (string? str-sql-query) (begin\r\n\t\t(replace \"&\" str-sql-query \"&amp;\")\r\n\t\t(replace \"'\" str-sql-query \"&apos;\")\r\n\t\t(replace \"\\\"\" str-sql-query \"&quot;\")\r\n\t\t))\r\n\t\t(set 'result str-sql-query))\r\n\r\n(define (query sql-text)\r\n (set 'sqlarray (sql3:sql sql-text))    ; results of query\r\n (if sqlarray\r\n   (setq query-return sqlarray)\r\n\t\t(if (sql3:error)\r\n\t\t\t(displayln (sql3:error) \" query problem \")\r\n\t\t\t(setq query-return nil))))\r\n\r\n(define-macro (create-record)\r\n\t; first save the values\r\n\t(set 'temp-record-values nil)\r\n\t(set 'temp-table-name (first (args)))\r\n\t;(displayln \"<BR>Arguments: \" (args))\r\n\t(dolist (s (rest (args))) (push (eval s) temp-record-values -1))\r\n\t; now save the arguments as symbols under the context \"DB\"\r\n\t(dolist (s (rest (args)))\r\n\t\t(set 'temp-index-num (string $idx)) ; we need to number the symbols to keep them in the correct order\r\n\t\t(if (= (length temp-index-num) 1) (set 'temp-index-num (string \"0\" temp-index-num))) ; leading 0 keeps the max at 100.\r\n\t\t(sym (string temp-index-num s) 'DB))\r\n\t; now create the sql query \r\n\t(set 'temp-sql-query (string \"INSERT INTO \" temp-table-name \" (\"))\r\n\t;(displayln \"<P>TABLE NAME: \" temp-table-name)\r\n\t;(displayln \"<P>SYMBOLS: \" (symbols DB))\r\n\t;(displayln \"<BR>VALUES: \" temp-record-values)\r\n\t(dolist (d (symbols DB)) (extend temp-sql-query (rest (rest (rest (rest (rest (string d)))))) \", \"))\r\n\t(set 'temp-sql-query (chop (chop temp-sql-query)))\r\n\t(extend temp-sql-query \") VALUES (\")\r\n\t(dolist (q temp-record-values)\r\n\t\t(if (string? q) (extend temp-sql-query \"'\")) ; only quote if value is non-numeric\r\n\t\t(extend temp-sql-query (string (safe-for-sql q)))\r\n\t\t(if (string? q) (extend temp-sql-query \"'\")) ; close quote if value is non-numeric\r\n\t\t(extend temp-sql-query \", \")) ; all values are sanitized to avoid SQL injection\r\n\t(set 'temp-sql-query (chop (chop temp-sql-query)))\r\n\t(extend temp-sql-query \");\")\r\n\t;(displayln \"<p>***** SQL QUERY: \" temp-sql-query)\r\n\t(displayln (query temp-sql-query)) ; actually run the query against the database\r\n\t(delete 'DB) ; we're done, so delete all symbols in the DB context.\r\n)\t\r\n\r\n(define-macro (update-record)\r\n\t; first save the values\r\n\t(set 'temp-record-values nil)\r\n\t(set 'temp-table-name (first (args)))\r\n\t(set 'continue true) ; debugging\r\n\t(dolist (s (rest (args))) (push (eval s) temp-record-values -1))\r\n\t; now save the arguments as symbols under the context \"D2\"\r\n\t(dolist (st (rest (args)))\r\n\t\t(set 'temp-index-num (string $idx)) ; we need to number the symbols to keep them in the correct order\r\n\t\t(if (= (length temp-index-num) 1) (set 'temp-index-num (string \"0\" temp-index-num))) ; leading 0 keeps the max at 100.\r\n\t\t;(displayln \"<br>SYMBOL>>>>\" (string temp-index-num st) \"<<<\") ; debugging\r\n\t\t(sym (string temp-index-num st) 'D2)\r\n\t)\r\n\t(if continue (begin ; --- temporary debugging\r\n\t; now create the sql query \r\n\t(set 'temp-sql-query (string \"UPDATE \" temp-table-name \" SET \"))\r\n\t;(displayln \"<P>TABLE NAME: \" temp-table-name)\r\n\t;(displayln \"<P>SYMBOLS: \" (symbols D2))\r\n\t;(displayln \"<BR>VALUES: \" temp-record-values)\r\n\t(dolist (d (rest (symbols D2))) ; ignore the first argument, as it will be the ConditionColumn for later\r\n\t\t(extend temp-sql-query (rest (rest (rest (rest (rest (string d)))))) \"=\")\r\n\t\t(set 'q (temp-record-values (+ $idx 1)))\r\n\t\t(if (string? q) (extend temp-sql-query \"'\")) ; only quote if value is non-numeric\r\n\t\t(extend temp-sql-query (string (safe-for-sql q)))\r\n\t\t(if (string? q) (extend temp-sql-query \"'\")) ; close quote if value is non-numeric\r\n\t\t(extend temp-sql-query \", \") ; all values are sanitized to avoid SQL injection\r\n\t)\t\r\n\t(set 'temp-sql-query (chop (chop temp-sql-query)))\r\n\t; okay now add the ConditionColumn value\r\n\t(extend temp-sql-query (string \" WHERE \" (rest (rest (rest (rest (rest (string (first (symbols D2)))))))) \"=\"))\r\n\t(if (string? (first temp-record-values)) (extend temp-sql-query \"'\"))\r\n\t(extend temp-sql-query (string (safe-for-sql (first temp-record-values))))\r\n\t(if (string? (first temp-record-values)) (extend temp-sql-query \"'\"))\r\n\t(extend temp-sql-query \";\")\r\n\t;(displayln \"<p>***** SQL QUERY: \" temp-sql-query)\r\n\t(query temp-sql-query) ; actually run the query against the database\r\n\t(delete 'D2) ; we're done, so delete all symbols in the DB context.\r\n\t)) ; --- end temporary debugging\r\n)\t\r\n\r\n(define-macro (delete-record)\r\n\t(set 'temp-table-name (first (args)))\r\n\t(set 'temp-record-values nil)\r\n\t(dolist (s (rest (args))) (push (eval s) temp-record-values -1)) ; only one value for NOW...\r\n\t(sym (first (rest (args))) 'DB) ; put the second argument (for now) into a symbol in the DB context\r\n\t\t\t\t\t\t\t\t\t\t\t\t; this will have to be in a dolist loop of (rest (args)) when I add more\r\n\t(set 'temp-sql-query (string \"DELETE FROM \" temp-table-name \" WHERE \"))\r\n\t(dolist (d (symbols DB)) (extend temp-sql-query (rest (rest (rest (string d))))))\r\n\t(extend temp-sql-query \"=\")\r\n\t; why am I doing a loop here?  There should be only one value, right?  But maybe for future extension...\r\n\t(dolist (q temp-record-values)\r\n\t\t(if (string? q) (extend temp-sql-query \"'\")) ; only quote if value is non-numeric\r\n\t\t(extend temp-sql-query (string (safe-for-sql q)))\r\n\t\t(if (string? q) (extend temp-sql-query \"'\"))) ; close quote if value is non-numeric\r\n\t(extend temp-sql-query \";\")\r\n\t;(displayln \"TEMP-DELETE-QUERY: \" temp-sql-query)\t\r\n\t(query temp-sql-query)\r\n\t(delete 'DB) ; we're done, so delete all symbols in the DB context.\r\n)\r\n\r\n(define-macro (get-record)\r\n\t(set 'temp-table-name (first (args)))\r\n\t; if you have more arguments than just the table name, they become the elements of the WHERE clause\r\n\t(if (> (length (args)) 1) (begin\r\n\t\t(set 'temp-record-values nil)\r\n\t\t(dolist (s (rest (args))) (push (eval s) temp-record-values -1)) ; only one value for NOW...\r\n\t\t(sym (first (rest (args))) 'DB) ; put the second argument (for now) into a symbol in the DB context\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t; this will have to be in a dolist loop of (rest (args)) when I add more\r\n\t\t(set 'temp-sql-query (string \"SELECT * FROM \" temp-table-name \" WHERE \"))\r\n\t\t(dolist (d (symbols DB)) (extend temp-sql-query (rest (rest (rest (string d))))))\r\n\t\t(extend temp-sql-query \"=\")\r\n\t\t; why am I doing a loop here?  There should be only one value, right?  But maybe for future extension...\r\n\t\t(dolist (q temp-record-values)\r\n\t\t\t(if (string? q) (extend temp-sql-query \"'\")) ; only quote if value is non-numeric\r\n\t\t\t(extend temp-sql-query (string (safe-for-sql q)))\r\n\t\t\t(if (string? q) (extend temp-sql-query \"'\"))) ; close quote if value is non-numeric\r\n\t\t(extend temp-sql-query \";\")\r\n\t)\r\n\t\t; otherwise, just get everything in that table\r\n\t\t(set 'temp-sql-query (string \"SELECT * FROM \" temp-table-name \";\"))\r\n\t)\r\n\t;(displayln \"TEMP-GET-QUERY: \" temp-sql-query)\t\r\n\t(delete 'DB) ; we're done, so delete all symbols in the DB context.\r\n\t(set 'return-value (query temp-sql-query)) ; this returns a list of everything in the record\r\n)\r\n\r\n; END FUNCTIONS ===================\r\n\r\n\r\n(open-database \"SERVER-LOGS\")\r\n(query \"CREATE TABLE Logs (Id INTEGER PRIMARY KEY, IP TEXT, UserId TEXT, UserName TEXT, Date DATE, Request TEXT, Result TEXT, Size INTEGER, Referrer TEXT, UserAgent TEXT)\")\r\n;(print (query \"SELECT * from SQLITE_MASTER;\"))\r\n(set 'access-log (read-file \"/var/log/apache2/access.log\"))\r\n(set 'access-list (parse access-log \"\\n\"))\r\n(set 'max-items (integer (first (first (query \"select count(*) from Logs\")))))\r\n(println \"Number of items in database: \" max-items)\r\n(println \"Number of lines in log: \" (length access-list))\r\n(dolist (line access-list)\r\n\t(set 'line-list (parse line))\r\n\t;(println \"Line# \" $idx \" - \" line-list)\r\n\t;(println \"Length of line: \" (length line-list))\r\n\t(if (> (length line-list) 0) (begin\r\n\t\t(++ max-items)\r\n\t\t(set 'Id max-items) (print $idx \"/\" (length access-list))\r\n\t\t(set 'IP (string (line-list 0) (line-list 1) (line-list 2))) \r\n\t\t(set 'UserId (line-list 3))\r\n\t\t(set 'UserName (line-list 4))\r\n\t\t(set 'Date (line-list 5))\r\n\t\t(set 'Date (trim Date \"[\"))\r\n\t\t(set 'Date (trim Date \"]\")) \r\n\t\t;(println \"DATE: \" Date) \r\n\t\t(set 'date-parsed (date-parse Date \"%d/%b/%Y:%H:%M:%S -0700\"))\r\n\t\t;(println \"DATE-PARSED: \" date-parsed)\r\n\t\t(set 'Date (date date-parsed 0 \"%Y-%m-%dT%H:%M:%S\"))\r\n\t\t(println \" \" Date)\r\n\t\t(set 'Request (line-list 6))\r\n\t\t(set 'Result (line-list 7))\r\n\t\t(set 'Size (line-list 8))\r\n\t\t(set 'Referrer (line-list 9))\r\n\t\t(set 'UserAgent (line-list 10)) \r\n\t\t(create-record \"Logs\" Id IP UserId UserName Date Request Result Size Referrer UserAgent)\r\n\t))\r\n)\r\n(close-database)\r\n(exit)"
  },
  {
    "path": "src/test/resources/samples/langs/NewLisp/queens.nl",
    "content": "#!/usr/bin/env newlisp\r\n\r\n(constant 'NUM 8)\r\n\r\n(define (intersects? q1 q2)\r\n\t(or \r\n\t\t(= (q1 0) (q2 0)) \r\n\t\t(= (q1 1) (q2 1))\r\n\t\t(= (abs (- (q1 0) (q2 0))) (abs (- (q1 1) (q2 1))))))\r\n\r\n(define (variant? alist)\r\n\t(set 'logic nil)\r\n\t(cond\r\n\t\t((= (length alist) 1) true)\r\n\t\t((> (length alist) 1)\r\n\t\t\t(while (> (length alist) 1)\r\n\t\t\t\t(set 'q (pop alist -1))\r\n\t\t\t\t(dolist (el alist)\r\n\t\t\t\t\t(push \r\n\t\t\t\t\t\t(intersects? \r\n\t\t\t\t\t\t\t(list q (inc (length alist)))\r\n\t\t\t\t\t\t\t(list el (+ 1 $idx)))\r\n\t\t\t\t\tlogic -1)))\r\n\t\t\t(not (apply or logic)))))\r\n\r\n(define (fork-by-line alist)\r\n\t(let (res '())\r\n\t\t(dolist (i (sequence 1 NUM))\r\n\t\t\t(set 'tmp alist)\r\n\t\t\t(push i tmp -1)\r\n\t\t\t(setf res (push tmp res -1)))\r\n\t\tres))\r\n\r\n(define (find-variants num)\r\n\t(let (res '())\r\n\t\t(cond \r\n\t\t\t((< num 1) \r\n\t\t\t\t(begin (println \"num < 1\") (exit)))\r\n\t\t\t((= num 1) \r\n\t\t\t\t(dolist (i (sequence 1 NUM)) (push (list i) res -1)))\r\n\t\t\t((> num 1) \r\n\t\t\t\t(dolist (v (find-variants (dec num))) \r\n\t\t\t\t\t(set 'passed (filter variant? (fork-by-line v)))\r\n\t\t\t\t\t(if (not (empty? passed)) (extend res passed)))))\r\n\t\tres))\r\n\t\t\r\n(set 'solutions (find-variants NUM))\r\n(println (length solutions))\r\n;;(exit)"
  },
  {
    "path": "src/test/resources/samples/langs/Nextflow/blast.nf",
    "content": "#!/usr/bin/env nextflow\n/*\n * This is free and unencumbered software released into the public domain.\n * \n * Anyone is free to copy, modify, publish, use, compile, sell, or\n * distribute this software, either in source code form or as a compiled\n * binary, for any purpose, commercial or non-commercial, and by any\n * means.\n * \n * In jurisdictions that recognize copyright laws, the author or authors\n * of this software dedicate any and all copyright interest in the\n * software to the public domain. We make this dedication for the benefit\n * of the public at large and to the detriment of our heirs and\n * successors. We intend this dedication to be an overt act of\n * relinquishment in perpetuity of all present and future rights to this\n * software under copyright law.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n * \n * For more information, please refer to <http://unlicense.org/>\n */\n \n/* \n * Author Paolo Di Tommaso <paolo.ditommaso@gmail.com>\n */\n\n\nparams.query = \"$HOME/sample.fa\"\nparams.db = \"$HOME/tools/blast-db/pdb/pdb\"\n\nprocess blast {\n    output:\n     file top_hits\n\n    \"\"\"\n    blastp -query ${params.query} -db ${params.db} -outfmt 6 \\\n    | head -n 10 \\\n    | cut -f 2 > top_hits\n    \"\"\"\n}\n\nprocess extract {\n    input:\n     file top_hits\n    output:\n     file sequences\n\n    \"\"\"\n    blastdbcmd -db ${params.db} -entry_batch $top_hits > sequences\n    \"\"\"\n}\n\nprocess align {\n    input:\n     file sequences\n    echo true\n\n    \"\"\"\n    t_coffee $sequences 2>&- | tee align_result\n    \"\"\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nextflow/callings.nf",
    "content": "#!/usr/bin/env nextflow\n/*\n * This is free and unencumbered software released into the public domain.\n * \n * Anyone is free to copy, modify, publish, use, compile, sell, or\n * distribute this software, either in source code form or as a compiled\n * binary, for any purpose, commercial or non-commercial, and by any\n * means.\n * \n * In jurisdictions that recognize copyright laws, the author or authors\n * of this software dedicate any and all copyright interest in the\n * software to the public domain. We make this dedication for the benefit\n * of the public at large and to the detriment of our heirs and\n * successors. We intend this dedication to be an overt act of\n * relinquishment in perpetuity of all present and future rights to this\n * software under copyright law.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n * \n * For more information, please refer to <http://unlicense.org/>\n */\n  \n  \n/* \n * 'CalliNGS-NF' - A Nextflow pipeline for variant calling with NGS data\n * \n * This pipeline that reproduces steps from the GATK best practics of SNP \n * calling with RNAseq data procedure:\n * https://software.broadinstitute.org/gatk/guide/article?id=3891\n * \n * Anna Vlasova \n * Emilio Palumbo \n * Paolo Di Tommaso\n * Evan Floden \n */\n\n\n/*\n * Define the default parameters\n */ \n\nparams.genome     = \"$baseDir/data/genome.fa\"\nparams.variants   = \"$baseDir/data/known_variants.vcf.gz\"\nparams.blacklist  = \"$baseDir/data/blacklist.bed\" \nparams.reads      = \"$baseDir/data/reads/rep1_{1,2}.fq.gz\"\nparams.results    = \"results\"\nparams.gatk       = '/usr/local/bin/GenomeAnalysisTK.jar'\nparams.gatk_launch = \"java -jar $params.gatk\" \n\nlog.info \"C A L L I N G S  -  N F    v 1.0\" \nlog.info \"================================\"\nlog.info \"genome   : $params.genome\"\nlog.info \"reads    : $params.reads\"\nlog.info \"variants : $params.variants\"\nlog.info \"blacklist: $params.blacklist\"\nlog.info \"results  : $params.results\" \nlog.info \"gatk     : $params.gatk\"\nlog.info \"\"\n\n/*\n *  Parse the input parameters\n */\n\nGATK            = params.gatk_launch\ngenome_file     = file(params.genome)\nvariants_file   = file(params.variants)\nblacklist_file  = file(params.blacklist)\nreads_ch        = Channel.fromFilePairs(params.reads)\n\n\n/**********\n * PART 1: Data preparation\n *\n * Process 1A: Create a FASTA genome index (.fai) with samtools for GATK\n */\n\nprocess '1A_prepare_genome_samtools' { \n  tag \"$genome.baseName\"\n  \n  input: \n      file genome from genome_file \n \n  output: \n      file \"${genome}.fai\" into genome_index_ch  \n  \n  script:\n  \"\"\"\n  samtools faidx ${genome}\n  \"\"\"\n}\n\n\n/*\n * Process 1B: Create a FASTA genome sequence dictionary with Picard for GATK\n */\n\nprocess '1B_prepare_genome_picard' {\n  tag \"$genome.baseName\"\n\n  input:\n      file genome from genome_file\n  output:\n      file \"${genome.baseName}.dict\" into genome_dict_ch\n\n  script:\n  \"\"\"\n  PICARD=`which picard.jar`\n  java -jar \\$PICARD CreateSequenceDictionary R= $genome O= ${genome.baseName}.dict\n  \"\"\"\n}\n\n\n/*\n * Process 1C: Create STAR genome index file.\n */\n\nprocess '1C_prepare_star_genome_index' {\n  tag \"$genome.baseName\"\n\n  input:\n      file genome from genome_file\n  output:\n      file \"genome_dir\" into genome_dir_ch\n\n  script:\n  \"\"\"\n  mkdir genome_dir\n\n  STAR --runMode genomeGenerate \\\n       --genomeDir genome_dir \\\n       --genomeFastaFiles ${genome} \\\n       --runThreadN ${task.cpus}\n  \"\"\"\n}\n\n\n/*\n * Process 1D: Create a file containing the filtered and recoded set of variants\n */\n\nprocess '1D_prepare_vcf_file' {\n  tag \"$variantsFile.baseName\"\n\n  input: \n      file variantsFile from variants_file\n      file blacklisted from blacklist_file\n\n  output:\n      set file(\"${variantsFile.baseName}.filtered.recode.vcf.gz\"), file(\"${variantsFile.baseName}.filtered.recode.vcf.gz.tbi\") into prepared_vcf_ch\n  \n  script:  \n  \"\"\"\n  vcftools --gzvcf $variantsFile -c \\\n           --exclude-bed ${blacklisted} \\\n           --recode | bgzip -c \\\n           > ${variantsFile.baseName}.filtered.recode.vcf.gz\n\n  tabix ${variantsFile.baseName}.filtered.recode.vcf.gz\n  \"\"\"\n}\n\n/*\n *  END OF PART 1\n *********/\n\n\n\n/**********\n * PART 2: STAR RNA-Seq Mapping\n *\n * Process 2: Align RNA-Seq reads to the genome with STAR\n */\n\nprocess '2_rnaseq_mapping_star' {\n  tag \"$replicateId\"\n\n  input: \n      file genome from genome_file \n      file genomeDir from genome_dir_ch\n      set replicateId, file(reads) from reads_ch \n\n  output: \n      set replicateId, file('Aligned.sortedByCoord.out.bam'), file('Aligned.sortedByCoord.out.bam.bai') into aligned_bam_ch\n\n  script:    \n  \"\"\"\n  # ngs-nf-dev Align reads to genome\n  STAR --genomeDir $genomeDir \\\n       --readFilesIn $reads \\\n       --runThreadN ${task.cpus} \\\n       --readFilesCommand zcat \\\n       --outFilterType BySJout \\\n       --alignSJoverhangMin 8 \\\n       --alignSJDBoverhangMin 1 \\\n       --outFilterMismatchNmax 999\n    \n  # 2nd pass (improve alignmets using table of splice junctions and create a new index)  \n  mkdir genomeDir  \n  STAR --runMode genomeGenerate \\\n       --genomeDir genomeDir \\\n       --genomeFastaFiles $genome \\\n       --sjdbFileChrStartEnd SJ.out.tab \\\n       --sjdbOverhang 75 \\\n       --runThreadN ${task.cpus}  \n    \n  # Final read alignments  \n  STAR --genomeDir genomeDir \\\n       --readFilesIn $reads \\\n       --runThreadN ${task.cpus} \\\n       --readFilesCommand zcat \\\n       --outFilterType BySJout \\\n       --alignSJoverhangMin 8 \\\n       --alignSJDBoverhangMin 1 \\\n       --outFilterMismatchNmax 999 \\\n       --outSAMtype BAM SortedByCoordinate \\\n       --outSAMattrRGline ID:$replicateId LB:library PL:illumina PU:machine SM:GM12878\n\n  # Index the BAM file\n  samtools index Aligned.sortedByCoord.out.bam\n  \"\"\"\n}\n\n/*\n *  END OF PART 2\n ******/\n\n\n/**********\n * PART 3: GATK Prepare Mapped Reads\n *\n * Process 3: Split reads that contain Ns in their CIGAR string.\n *            Creates k+1 new reads (where k is the number of N cigar elements) \n *            that correspond to the segments of the original read beside/between \n *            the splicing events represented by the Ns in the original CIGAR.\n */\n\nprocess '3_rnaseq_gatk_splitNcigar' {\n  tag \"$replicateId\"\n  \n  input: \n      file genome from genome_file \n      file index from genome_index_ch\n      file genome_dict from genome_dict_ch\n      set replicateId, file(bam), file(index) from aligned_bam_ch\n\n  output:\n      set replicateId, file('split.bam'), file('split.bai') into splitted_bam_ch\n  \n  script:\n  \"\"\"\n  # SplitNCigarReads and reassign mapping qualities\n  $GATK -T SplitNCigarReads \\\n          -R $genome -I $bam \\\n          -o split.bam \\\n          -rf ReassignOneMappingQuality \\\n          -RMQF 255 -RMQT 60 \\\n          -U ALLOW_N_CIGAR_READS \\\n          --fix_misencoded_quality_scores\n  \"\"\"\n}\n\n/*\n *  END OF PART 3\n ******/\n\n\n/***********\n * PART 4: GATK Base Quality Score Recalibration Workflow\n *\n * Process 4: Base recalibrate to detect systematic errors in base quality scores, \n *            select unique alignments and index\n *             \n */\n\nprocess '4_rnaseq_gatk_recalibrate' {\n  tag \"$replicateId\"\n    \n  input: \n      file genome from genome_file \n      file index from genome_index_ch\n      file dict from genome_dict_ch\n      set replicateId, file(bam), file(index) from splitted_bam_ch\n      set file(variants_file), file(variants_file_index) from prepared_vcf_ch\n\n  output:\n      set sampleId, file(\"${replicateId}.final.uniq.bam\"), file(\"${replicateId}.final.uniq.bam.bai\") into (final_output_ch, bam_for_ASE_ch)\n  \n  script: \n  sampleId = replicateId.replaceAll(/[12]$/,'')\n  \"\"\"\n  # Indel Realignment and Base Recalibration\n  $GATK -T BaseRecalibrator \\\n          --default_platform illumina \\\n          -cov ReadGroupCovariate \\\n          -cov QualityScoreCovariate \\\n          -cov CycleCovariate \\\n          -knownSites ${variants_file} \\\n          -cov ContextCovariate \\\n          -R ${genome} -I ${bam} \\\n          --downsampling_type NONE \\\n          -nct ${task.cpus} \\\n          -o final.rnaseq.grp \n\n  $GATK -T PrintReads \\\n          -R ${genome} -I ${bam} \\\n          -BQSR final.rnaseq.grp \\\n          -nct ${task.cpus} \\\n          -o final.bam\n\n  # Select only unique alignments, no multimaps\n  (samtools view -H final.bam; samtools view final.bam| grep -w 'NH:i:1') \\\n  |samtools view -Sb -  > ${replicateId}.final.uniq.bam\n\n  # Index BAM files\n  samtools index ${replicateId}.final.uniq.bam\n  \"\"\"\n}\n\n/*\n *  END OF PART 4\n ******/\n\n\n\n/***********\n * PART 5: GATK Variant Calling\n *\n * Process 5: Call variants with GATK HaplotypeCaller.\n *            Calls SNPs and indels simultaneously via local de-novo assembly of \n *            haplotypes in an active region.\n *            Filter called variants with GATK VariantFiltration.    \n */\n\n\nprocess '5_rnaseq_call_variants' {\n  tag \"$sampleId\"\n\n  input:\n      file genome from genome_file\n      file index from genome_index_ch\n      file dict from genome_dict_ch\n      set sampleId, file(bam), file(bai) from final_output_ch.groupTuple()\n  \n  output: \n      set sampleId, file('final.vcf') into vcf_files\n\n  script:\n  \"\"\"\n  # fix absolute path in dict file\n  sed -i 's@UR:file:.*${genome}@UR:file:${genome}@g' $dict\n  echo \"${bam.join('\\n')}\" > bam.list\n  \n  # Variant calling\n  $GATK -T HaplotypeCaller \\\n          -R $genome -I bam.list \\\n          -dontUseSoftClippedBases \\\n          -stand_call_conf 20.0 \\\n          -o output.gatk.vcf.gz\n\n  # Variant filtering\n  $GATK -T VariantFiltration \\\n          -R $genome -V output.gatk.vcf.gz \\\n          -window 35 -cluster 3 \\\n          -filterName FS -filter \"FS > 30.0\" \\\n          -filterName QD -filter \"QD < 2.0\" \\\n          -o final.vcf\n  \"\"\"\n}\n\n/*\n *  END OF PART 5\n ******/\n\n\n/***********\n * PART 6: Post-process variants file and prepare for Allele-Specific Expression and RNA Editing Analysis\n *\n * Process 6A: Post-process the VCF result  \n */\n\nprocess '6A_post_process_vcf' {\n  tag \"$sampleId\"\n  publishDir \"$params.results/$sampleId\" \n  \n  input:\n      set sampleId, file('final.vcf') from vcf_files\n      set file('filtered.recode.vcf.gz'), file('filtered.recode.vcf.gz.tbi') from prepared_vcf_ch \n  output: \n      set sampleId, file('final.vcf'), file('commonSNPs.diff.sites_in_files') into vcf_and_snps_ch\n  \n  script:\n  '''\n  grep -v '#' final.vcf | awk '$7~/PASS/' |perl -ne 'chomp($_); ($dp)=$_=~/DP\\\\=(\\\\d+)\\\\;/; if($dp>=8){print $_.\"\\\\n\"};' > result.DP8.vcf\n  \n  vcftools --vcf result.DP8.vcf --gzdiff filtered.recode.vcf.gz  --diff-site --out commonSNPs\n  '''\n}\n\n/* \n * Process 6B: Prepare variants file for allele specific expression (ASE) analysis\n */\n\nprocess '6B_prepare_vcf_for_ase' {\n  tag \"$sampleId\"\n  publishDir \"$params.results/$sampleId\" \n  \n  input: \n      set sampleId, file('final.vcf'), file('commonSNPs.diff.sites_in_files') from vcf_and_snps_ch\n  output: \n      set sampleId, file('known_snps.vcf') into vcf_for_ASE\n      file('AF.histogram.pdf') into gghist_pdfs\n\n  script:\n  '''\n  awk 'BEGIN{OFS=\"\\t\"} $4~/B/{print $1,$2,$3}' commonSNPs.diff.sites_in_files  > test.bed\n    \n  vcftools --vcf final.vcf --bed test.bed --recode --keep-INFO-all --stdout > known_snps.vcf\n\n  grep -v '#'  known_snps.vcf | awk -F '\\\\t' '{print $10}' \\\n               |awk -F ':' '{print $2}'|perl -ne 'chomp($_); \\\n               @v=split(/\\\\,/,$_); if($v[0]!=0 ||$v[1] !=0)\\\n               {print  $v[1]/($v[1]+$v[0]).\"\\\\n\"; }' |awk '$1!=1' \\\n               >AF.4R\n\n  gghist.R -i AF.4R -o AF.histogram.pdf\n  '''\n}\n\n\n/* \n * Group data for allele-specific expression.\n * \n * The `bam_for_ASE_ch` emites tuples having the following structure, holding the final BAM/BAI files:\n *  \n *   ( sample_id, file_bam, file_bai )\n * \n * The `vcf_for_ASE` channel emits tuples having the following structure, holding the VCF file:\n *  \n *   ( sample_id, output.vcf ) \n * \n * The BAMs are grouped together and merged with VCFs having the same sample id. Finally \n * it creates a channel named `grouped_vcf_bam_bai_ch` emitting the following tuples: \n *  \n *   ( sample_id, file_vcf, List[file_bam], List[file_bai] )\n */\n\nbam_for_ASE_ch\n    .groupTuple()\n    .phase(vcf_for_ASE)\n    .map{ left, right -> \n      def sampleId = left[0]\n      def bam = left[1]\n      def bai = left[2]\n      def vcf = right[1]\n      tuple(sampleId, vcf, bam, bai)  \n    }\n    .set { grouped_vcf_bam_bai_ch }\n\n\n/* \n * Process 6C: Allele-Specific Expression analysis with GATK ASEReadCounter.\n *             Calculates allele counts at a set of positions after applying \n *             filters that are tuned for enabling allele-specific expression \n *             (ASE) analysis\n */\n\nprocess '6C_ASE_knownSNPs' {\n  tag \"$sampleId\"\n  publishDir \"$params.results/$sampleId\" \n  \n  input:\n      file genome from genome_file \n      file index from genome_index_ch\n      file dict from genome_dict_ch\n      set sampleId, file(vcf),  file(bam), file(bai) from grouped_vcf_bam_bai_ch\n  \n  output:\n      file \"ASE.tsv\"\n  \n  script:\n  \"\"\"\n  echo \"${bam.join('\\n')}\" > bam.list\n    \n  $GATK -R ${genome} \\\n          -T ASEReadCounter \\\n          -o ASE.tsv \\\n          -I bam.list \\\n          -sites ${vcf}\n  \"\"\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nextflow/filenames/nextflow.config",
    "content": "aws {\n   region = 'eu-west-1'\n}\n\ncloud {\n   autoscale {\n      enabled = true\n      minInstances = 3\n      starvingTimeout = '2 min'\n      terminateWhenIdle = true\n   }\n   imageId = 'ami-78ds78d'\n   instanceProfile = 'MyRole'\n   instanceType = 'r4.large'\n   sharedStorageId = 'fs-76ds76s'\n   spotPrice = 0.06\n   subnetId = 'subnet-8d98d7s'\n}\n\nenv {\n   BAR = 'world'\n   FOO = 'hola'\n}\n\nmail {\n   from = 'paolo.ditommaso@gmail.com'\n   smtp {\n      auth = true\n      host = 'email-smtp.us-east-1.amazonaws.com'\n      password = 'my-secret'\n      port = 587\n      starttls {\n         enable = true\n         required = true\n      }\n      user = 'my-name'\n   }\n}\n\nprocess {\n   executor = 'slurm'\n   queue = 'cn-el7'\n   memory = '16GB'\n   cpus = 8\n   container = 'user/rnaseq-nf:latest'\n}\n\ntrace {\n   fields = 'task_id,name,status,attempt,exit,queue'\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nextflow/rnaseq.nf",
    "content": "#!/usr/bin/env nextflow\n/*\n * This is free and unencumbered software released into the public domain.\n * \n * Anyone is free to copy, modify, publish, use, compile, sell, or\n * distribute this software, either in source code form or as a compiled\n * binary, for any purpose, commercial or non-commercial, and by any\n * means.\n * \n * In jurisdictions that recognize copyright laws, the author or authors\n * of this software dedicate any and all copyright interest in the\n * software to the public domain. We make this dedication for the benefit\n * of the public at large and to the detriment of our heirs and\n * successors. We intend this dedication to be an overt act of\n * relinquishment in perpetuity of all present and future rights to this\n * software under copyright law.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n * \n * For more information, please refer to <http://unlicense.org/>\n */\n \n  \n/* \n * Proof of concept of a RNAseq pipeline implemented with Nextflow\n * \n * Authors:\n * - Paolo Di Tommaso <paolo.ditommaso@gmail.com>\n * - Emilio Palumbo <emiliopalumbo@gmail.com> \n * - Evan Floden <evanfloden@gmail.com> \n */ \n\n \nparams.reads = \"$baseDir/data/ggal/*_{1,2}.fq\"\nparams.transcriptome = \"$baseDir/data/ggal/ggal_1_48850000_49020000.Ggal71.500bpflank.fa\"\nparams.outdir = \".\"\nparams.multiqc = \"$baseDir/multiqc\"\n\nlog.info \"\"\"\\\n         R N A S E Q - N F   P I P E L I N E    \n         ===================================\n         transcriptome: ${params.transcriptome}\n         reads        : ${params.reads}\n         outdir       : ${params.outdir}\n         \"\"\"\n         .stripIndent()\n\n\ntranscriptome_file = file(params.transcriptome)\nmultiqc_file = file(params.multiqc)\n \n\nChannel\n    .fromFilePairs( params.reads )\n    .ifEmpty { error \"Cannot find any reads matching: ${params.reads}\" }\n    .into { read_pairs_ch; read_pairs2_ch } \n \n\nprocess index {\n    tag \"$transcriptome_file.simpleName\"\n    \n    input:\n    file transcriptome from transcriptome_file\n     \n    output:\n    file 'index' into index_ch\n\n    script:       \n    \"\"\"\n    salmon index --threads $task.cpus -t $transcriptome -i index\n    \"\"\"\n}\n \n \nprocess quant {\n    tag \"$pair_id\"\n     \n    input:\n    file index from index_ch\n    set pair_id, file(reads) from read_pairs_ch\n \n    output:\n    file(pair_id) into quant_ch\n \n    script:\n    \"\"\"\n    salmon quant --threads $task.cpus --libType=U -i index -1 ${reads[0]} -2 ${reads[1]} -o $pair_id\n    \"\"\"\n}\n  \nprocess fastqc {\n    tag \"FASTQC on $sample_id\"\n\n    input:\n    set sample_id, file(reads) from read_pairs2_ch\n\n    output:\n    file(\"fastqc_${sample_id}_logs\") into fastqc_ch\n\n\n    script:\n    \"\"\"\n    mkdir fastqc_${sample_id}_logs\n    fastqc -o fastqc_${sample_id}_logs -f fastq -q ${reads}\n    \"\"\"  \n}  \n  \n  \nprocess multiqc {\n    publishDir params.outdir, mode:'copy'\n       \n    input:\n    file('*') from quant_ch.mix(fastqc_ch).collect()\n    file(config) from multiqc_file\n    \n    output:\n    file('multiqc_report.html')  \n     \n    script:\n    \"\"\"\n    cp $config/* .\n    echo \"custom_logo: \\$PWD/logo.png\" >> multiqc_config.yaml\n    multiqc . \n    \"\"\"\n}\n \nworkflow.onComplete { \n\tprintln ( workflow.success ? \"\\nDone! Open the following report in your browser --> $params.outdir/multiqc_report.html\\n\" : \"Oops .. something went wrong\" )\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Nginx/example.com.vhost",
    "content": "# Move the www people to no-www\nserver {\n  listen 80;\n  server_name www.example.com;\n  return 301 $scheme://example.com$request_uri;\n}\n\nserver {\n  listen 80;\n  listen 443 ssl;\n  server_name example.com;\n\n  # Certs sent to the client in SERVER HELLO are concatenated in ssl_certificate\n  ssl_certificate /srv/www/example.com/ssl/example.com.crt;\n  ssl_certificate_key /srv/www/example.com/ssl/example.com.key;\n  \n  # Allow multiple connections to use the same key data\n  ssl_session_timeout 5m;\n  ssl_session_cache shared:SSL:50m;\n  \n  # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits\n  ssl_dhparam /etc/ssl/certs/dhparam.pem;\n\n  # Intermediate configuration. tweak to your needs\n  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n  include snippets/ssl_ciphers_intermediate.conf;\n  ssl_prefer_server_ciphers on;\n\n  # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)\n  #add_header Strict-Transport-Security max-age=15768000;\n\n  # OCSP Stapling - fetch OCSP records from URL in ssl_certificate and cache them\n  ssl_stapling on;\n  ssl_stapling_verify on;\n\n  # Verify chain of trust of OCSP response using Root CA and Intermediate certs\n  ssl_trusted_certificate /srv/www/example.com/ssl/unified-ssl.crt;\n  resolver 8.8.8.8 8.8.4.4;\n  resolver_timeout 10s;\n\n  root /srv/www/example.com/htdocs;\n  index index.php index.html index.htm;\n  charset UTF-8;\n  autoindex off;\n  \n  # Deny access based on HTTP method (set in HTTP level)\n  if ($bad_method = 1) {\n    return 444;\n  }\n\n  # Show \"Not Found\" 404 errors in place of \"Forbidden\" 403 errors, because\n  # forbidden errors allow attackers potential insight into your server's\n  # layout and contents\n  error_page 403 = 404;\n\n  # It's always good to set logs, note however you cannot turn off the error log\n  # setting error_log off; will simply create a file called 'off'.\n  access_log /var/log/nginx/example.com.access.log;\n  error_log /var/log/nginx/example.com.error.log;\n\n  # Add trailing slash to */wp-admin requests.\n  rewrite /wp-admin$ $scheme://$host$uri/ permanent;\n\n  location / {\n    # This try_files directive is used to enable pretty, SEO-friendly URLs\n    # and permalinks for Wordpress. Leave it *off* to start with, and then\n    # turn it on once you've gotten Wordpress configured!\n    try_files $uri $uri/ /index.php?$args;\n  }\n\n  # Option to create password protected directory\n  # http://www.howtoforge.com/basic-http-authentication-with-nginx\n  # location /admin {\n  #   auth_basic \"Administrator Login\";\n  #   auth_basic_user_file /var/www/domain.com/admin/.htpasswd;\n  # }\n\n  # Do not log access to these to keep the logs cleaner\n  location = /favicon.ico {\n    log_not_found off;\n    access_log off;\n  }\n\n  location = /apple-touch-icon.png {\n    log_not_found off;\n    access_log off;\n  }\n\n  location = /apple-touch-icon-precomposed.png {\n    log_not_found off;\n    access_log off;\n  }\n\n  # This block will catch static file requests, such as images, css, js\n  # The ?: prefix is a 'non-capturing' mark, meaning we do not require\n  # the pattern to be captured into $1 which should help improve performance\n  location ~* \\.(?:3gp|gif|jpg|jpe?g|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|html|htm|txt|js|css|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|woff)$ {\n    # Some basic cache-control for static files to be sent to the browser\n    expires max;\n    add_header Pragma public;\n    add_header Cache-Control \"public, must-revalidate, proxy-revalidate\";\n  }\n\n  # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).\n  # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)\n  location ~ /\\. {\n    access_log off;\n    log_not_found off;\n    deny all;\n  }\n\n  location ~ ~$ {\n    access_log off;\n    log_not_found off;\n    deny all;\n  }\n\n  # Common deny or internal locations, to help prevent access to areas of\n  # the site that should not be public\n  location ~* wp-admin/includes {\n    deny all;\n  }\n\n  location ~* wp-includes/theme-compat/ {\n    deny all;\n  }\n\n  location ~* wp-includes/js/tinymce/langs/.*\\.php {\n    deny all;\n  }\n\n  location /wp-content/ {\n    internal;\n  }\n\n  # Deny access to any files with a .php extension in the uploads directory\n  # Works in sub-directory installs and also in multisite network\n  # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)\n  location ~* /(?:uploads|files)/.*\\.php$ {\n    deny all;\n  }\n\n  # Make sure these get through, esp with dynamic WP sitmap plugin\n  location = /robots.txt {\n    try_files $uri /index.php;\n  }\n\n  location = /sitemap.xml {\n    try_files $uri /index.php;\n  }\n\n  location = /sitemap.xml.gz {\n    try_files $uri /index.php;\n  }\n\n  # Fix for Firefox issue with cross site font icons\n  location ~* \\.(eot|otf|ttf|woff)$ {\n    add_header Access-Control-Allow-Origin *;\n  }\n\n  # Redirect server error pages to the static page /50x.html\n  # Make sure 50x.html exists at that location\n  error_page 500 502 503 504 /50x.html;\n    location = /50x.html {\n    root /usr/share/nginx/html;\n    }\n\n  # Cache everything by default\n  set $skip_cache 0;\n\n  # POST requests and urls with a query string should always go to PHP\n  if ($request_method = POST) {\n    set $skip_cache 1;\n  }\n  if ($query_string != \"\") {\n    set $skip_cache 1;\n  }\n\n  # Don't cache uris containing the following segments\n  if ($request_uri ~* \"/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml\") {\n    set $skip_cache 1;\n  }\n\n  # Don't use the cache for logged in users or recent commenters\n  if ($http_cookie ~* \"comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in\") {\n    set $skip_cache 1;\n  }\n\n  # Pass all .php files onto a php-fpm/php-fcgi server.\n  location ~ [^/]\\.php(/|$) {\n    # regex to split $uri to $fastcgi_script_name and $fastcgi_path\n    fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n\n    # Check that the PHP script exists before passing it\n    try_files $fastcgi_script_name =404;\n\n    # Bypass the fact that try_files resets $fastcgi_path_info\n    # see: http://trac.nginx.org/nginx/ticket/321\n    set $path_info $fastcgi_path_info;\n    fastcgi_param PATH_INFO $path_info;\n\n    fastcgi_pass unix:/var/run/example.com.sock;\n    fastcgi_index index.php;\n    # Uncomment if site is HTTPS\n    #fastcgi_param HTTPS on;\n    include fastcgi.conf;\n    \n    fastcgi_cache_bypass $skip_cache;\n    fastcgi_no_cache $skip_cache;\n\n    fastcgi_cache WORDPRESS;\n    fastcgi_cache_valid  60m;\n  }\n\n  location ~ /purge(/.*) {\n    fastcgi_cache_purge WORDPRESS \"$scheme$request_method$host$1\";\n  }\n\n  # Use this block if PHPMyAdmin is enabled for this domain\n  location /phpmyadmin {\n    root /usr/share/;\n    index index.php index.html index.htm;\n\n    location ~ ^/phpmyadmin/(.+\\.php)$ {\n      try_files $uri =404;\n      root /usr/share/;\n      fastcgi_pass unix:/var/run/example.com.sock;\n      fastcgi_index index.php;\n      include fastcgi.conf;\n    }\n\n    location ~* ^/phpmyadmin/(.+\\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {\n      root /usr/share/;\n    }\n  }\n\n  location /phpMyAdmin {\n    rewrite ^/* /phpmyadmin last;\n  }\n  # End PHPMyAdmin block\n\n} # End of server block.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nginx/filenames/nginx.conf",
    "content": "user       www www;\nworker_processes  5;\nerror_log  logs/error.log;\npid        logs/nginx.pid;\nworker_rlimit_nofile 8192;\n\nevents {\n  worker_connections  4096;\n}\n\nhttp {\n  include    conf/mime.types;\n  include    /etc/nginx/proxy.conf;\n  include    /etc/nginx/fastcgi.conf;\n  index    index.html index.htm index.php;\n\n  default_type application/octet-stream;\n  log_format   main '$remote_addr - $remote_user [$time_local]  $status '\n    '\"$request\" $body_bytes_sent \"$http_referer\" '\n    '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n  access_log   logs/access.log  main;\n  sendfile     on;\n  tcp_nopush   on;\n  server_names_hash_bucket_size 128; # this seems to be required for some vhosts\n\n  server { # php/fastcgi\n    listen       80;\n    server_name  domain1.com www.domain1.com;\n    access_log   logs/domain1.access.log  main;\n    root         html;\n\n    location ~ \\.php$ {\n      fastcgi_pass   127.0.0.1:1025;\n    }\n  }\n\n  server { # simple reverse-proxy\n    listen       80;\n    server_name  domain2.com www.domain2.com;\n    access_log   logs/domain2.access.log  main;\n\n    # serve static files\n    location ~ ^/(images|javascript|js|css|flash|media|static)/  {\n      root    /var/www/virtual/big.server.com/htdocs;\n      expires 30d;\n    }\n\n    # pass requests for dynamic content to rails/turbogears/zope, et al\n    location / {\n      proxy_pass      http://127.0.0.1:8080;\n    }\n  }\n\n  upstream big_server_com {\n    server 127.0.0.3:8000 weight=5;\n    server 127.0.0.3:8001 weight=5;\n    server 192.168.0.1:8000;\n    server 192.168.0.1:8001;\n  }\n\n  server { # simple load balancing\n    listen          80;\n    server_name     big.server.com;\n    access_log      logs/big.server.access.log main;\n\n    location / {\n      proxy_pass      http://big_server_com;\n    }\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nim/foo.nim",
    "content": "# Hello world program\n\necho \"Hello world!\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/calculator.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net>\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\nimport gtk\n\nclass CalculatorContext\n\tvar result : nullable Float = null\n\n\tvar last_op : nullable Char = null\n\n\tvar current : nullable Float = null\n\tvar after_point : nullable Int = null\n\n\tfun push_op( op : Char )\n\tdo\n\t\tapply_last_op_if_any\n\t\tif op == 'C' then\n\t\t\tself.result = 0.0\n\t\t\tlast_op = null\n\t\telse\n\t\t\tlast_op = op # store for next push_op\n\t\tend\n\n\t\t# prepare next current\n\t\tafter_point = null\n\t\tcurrent = null\n\tend\n\n\tfun push_digit( digit : Int )\n\tdo\n\t\tvar current = current\n\t\tif current == null then current = 0.0\n\n\t\tvar after_point = after_point\n\t\tif after_point == null then\n\t\t\tcurrent = current * 10.0 + digit.to_f\n\t\telse\n\t\t\tcurrent = current + digit.to_f * 10.0.pow(after_point.to_f)\n\t\t\tself.after_point -= 1\n\t\tend\n\n\t\tself.current = current\n\tend\n\n\tfun switch_to_decimals\n\tdo\n\t\tif self.current == null then current = 0.0\n\t\tif after_point != null then return\n\n\t\tafter_point = -1\n\tend\n\n\tfun apply_last_op_if_any\n\tdo\n\t\tvar op = last_op\n\n\t\tvar result = result\n\t\tif result == null then result = 0.0\n\n\t\tvar current = current\n\t\tif current == null then current = 0.0\n\n\t\tif op == null then\n\t\t\tresult = current\n\t\telse if op == '+' then\n\t\t\tresult = result + current\n\t\telse if op == '-' then\n\t\t\tresult = result - current\n\t\telse if op == '/' then\n\t\t\tresult = result / current\n\t\telse if op == '*' then\n\t\t\tresult = result * current\n\t\tend\n\t\tself.result = result\n\t\tself.current = null\n\tend\nend\n\nclass CalculatorGui\n\tsuper GtkCallable\n\n\tvar win : GtkWindow\n\tvar container : GtkGrid\n\n\tvar lbl_disp : GtkLabel\n\tvar but_eq : GtkButton\n\tvar but_dot : GtkButton\n\n\tvar context = new CalculatorContext\n\n\tredef fun signal( sender, user_data )\n\tdo\n\t\tvar after_point = context.after_point\n\t\tif after_point == null then \n\t\t    after_point = 0\n\t\telse\n\t\t    after_point = (after_point.abs)\n\t\tend\n\t\t\n\t\tif user_data isa Char then # is an operation\n\t\t\tvar c = user_data\n\t\t\tif c == '.' then\n\t\t\t\tbut_dot.sensitive= false\n\t\t\t\tcontext.switch_to_decimals\n\t\t\t\tlbl_disp.text = \"{context.current.to_i}.\"\n\t\t\telse\n\t\t\t\tbut_dot.sensitive= true\n\t\t\t\tcontext.push_op( c )\n\t\t\t\t\n\t\t\t\tvar s = context.result.to_precision_native(6)\n\t\t\t\tvar index : nullable Int = null\n\t\t\t\tfor i in s.length.times do\n\t\t\t\t    var chiffre = s.chars[i]\n\t\t\t\t    if chiffre == '0' and index == null then\n\t\t\t\t\tindex = i\n\t\t\t\t    else if chiffre != '0' then\n\t\t\t\t\tindex = null\n\t\t\t\t    end\n\t\t\t\tend\n\t\t\t\tif index != null then\n\t\t\t\t\ts = s.substring(0, index)\n\t\t\t\t\tif s.chars[s.length-1] == ',' then s = s.substring(0, s.length-1)\n\t\t\t\tend\n\t\t\t\tlbl_disp.text = s\n\t\t\tend\n\t\telse if user_data isa Int then # is a number\n\t\t\tvar n = user_data\n\t\t\tcontext.push_digit( n )\n\t\t\tlbl_disp.text = context.current.to_precision_native(after_point)\n\t\tend\n\tend\n\n\tinit\n\tdo\n\t\tinit_gtk\n\n\t\twin = new GtkWindow( 0 )\n\n\t\tcontainer = new GtkGrid(5,5,true)\n\t\twin.add( container )\n\n\t\tlbl_disp = new GtkLabel( \"_\" )\n\t\tcontainer.attach( lbl_disp, 0, 0, 5, 1 )\n\n\t\t# digits\n\t\tfor n in [0..9] do\n\t\t\tvar but = new GtkButton.with_label( n.to_s )\n\t\t\tbut.request_size( 64, 64 )\n\t\t\tbut.signal_connect( \"clicked\", self, n )\n\t\t\tif n == 0 then\n\t\t\t\tcontainer.attach( but, 0, 4, 1, 1 )\n\t\t\telse container.attach( but, (n-1)%3, 3-(n-1)/3, 1, 1 )\n\t\tend\n\n\t\t# operators\n\t\tvar r = 1\n\t\tfor op in ['+', '-', '*', '/' ] do\n\t\t\tvar but = new GtkButton.with_label( op.to_s )\n\t\t\tbut.request_size( 64, 64 )\n\t\t\tbut.signal_connect( \"clicked\", self, op )\n\t\t\tcontainer.attach( but, 3, r, 1, 1 )\n\t\t\tr+=1\n\t\tend\n\n\t\t# =\n\t\tbut_eq = new GtkButton.with_label( \"=\" )\n\t\tbut_eq.request_size( 64, 64 )\n\t\tbut_eq.signal_connect( \"clicked\", self, '=' )\n\t\tcontainer.attach( but_eq, 4, 3, 1, 2 )\n\n\t\t# .\n\t\tbut_dot = new GtkButton.with_label( \".\" )\n\t\tbut_dot.request_size( 64, 64 )\n\t\tbut_dot.signal_connect( \"clicked\", self, '.' )\n\t\tcontainer.attach( but_dot, 1, 4, 1, 1 )\n\n\t\t#C\n\t\tvar but_c =  new GtkButton.with_label( \"C\" )\n\t\tbut_c.request_size( 64, 64 )\n\t\tbut_c.signal_connect(\"clicked\", self, 'C')\n\t\tcontainer.attach( but_c, 2, 4, 1, 1 )\n\n\t\twin.show_all\n\tend\nend\n\n# context tests\nvar context = new CalculatorContext\ncontext.push_digit( 1 )\ncontext.push_digit( 2 )\ncontext.push_op( '+' )\ncontext.push_digit( 3 )\ncontext.push_op( '*' )\ncontext.push_digit( 2 )\ncontext.push_op( '=' )\nvar r = context.result.to_precision( 2 )\nassert r == \"30.00\" else print r\n\ncontext = new CalculatorContext\ncontext.push_digit( 1 )\ncontext.push_digit( 4 )\ncontext.switch_to_decimals\ncontext.push_digit( 1 )\ncontext.push_op( '*' )\ncontext.push_digit( 3 )\ncontext.push_op( '=' )\nr = context.result.to_precision( 2 )\nassert r == \"42.30\" else print r\n\ncontext.push_op( '+' )\ncontext.push_digit( 1 )\ncontext.push_digit( 1 )\ncontext.push_op( '=' )\nr = context.result.to_precision( 2 )\nassert r == \"53.30\" else print r\n\ncontext = new CalculatorContext\ncontext.push_digit( 4 )\ncontext.push_digit( 2 )\ncontext.switch_to_decimals\ncontext.push_digit( 3 )\ncontext.push_op( '/' )\ncontext.push_digit( 3 )\ncontext.push_op( '=' )\nr = context.result.to_precision( 2 )\nassert r == \"14.10\" else print r\n\n#test multiple decimals\ncontext = new CalculatorContext\ncontext.push_digit( 5 )\ncontext.push_digit( 0 )\ncontext.switch_to_decimals\ncontext.push_digit( 1 )\ncontext.push_digit( 2 )\ncontext.push_digit( 3 )\ncontext.push_op( '+' )\ncontext.push_digit( 1 )\ncontext.push_op( '=' )\nr = context.result.to_precision( 3 )\nassert r == \"51.123\" else print r\n\n#test 'C' button\ncontext = new CalculatorContext\ncontext.push_digit( 1 )\ncontext.push_digit( 0 )\ncontext.push_op( '+' )\ncontext.push_digit( 1 )\ncontext.push_digit( 0 )\ncontext.push_op( '=' )\ncontext.push_op( 'C' )\nr = context.result.to_precision( 1 )\nassert r == \"0.0\" else print r\n\n# graphical application\n\nif \"NIT_TESTING\".environ != \"true\" then\n\tvar app = new CalculatorGui\n\trun_gtk\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/callback_chimpanze.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This sample has been implemented to show you how simple is it to play \n# with native callbacks (C) through an high level with NIT program.\n\nmodule callback_chimpanze\nimport callback_monkey\n\nclass Chimpanze\n\tsuper MonkeyActionCallable\n\n\tfun create\n\tdo\n\t\tvar monkey = new Monkey\n\t\tprint \"Hum, I'm sleeping ...\"\n\t\t# Invoking method which will take some time to compute, and \n\t\t# will be back in wokeUp method with information.\n\t\t# - Callback method defined in MonkeyActionCallable Interface\n\t\tmonkey.wokeUpAction(self, \"Hey, I'm awake.\")\n\tend\n\n\t# Inherit callback method, defined by MonkeyActionCallable interface\n\t# - Back of wokeUpAction method \n\tredef fun wokeUp( sender:Monkey, message:Object )\n\tdo\n\t\tprint message\n\tend\nend\n\nvar m = new Chimpanze\nm.create\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/callback_monkey.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This sample has been implemented to show you how simple is it to play \n# with native callbacks (C) through an high level with NIT program.\n\nmodule callback_monkey\n\nin \"C header\" `{\n\t#include <stdio.h>\n\t#include <stdlib.h>\n\n\ttypedef struct { \n\t\tint id;\n\t\tint age;\n\t} CMonkey;\n\n\ttypedef struct {\n\t\tMonkeyActionCallable toCall;\n\t\tObject message;\n\t} MonkeyAction;\n`}\n\nin \"C body\" `{\n\t// Method which reproduce a callback answer\n\t// Please note that a function pointer is only used to reproduce the callback\n\tvoid cbMonkey(CMonkey *mkey, void callbackFunc(CMonkey*, MonkeyAction*), MonkeyAction *data)\n\t{\n\t\tsleep(2);\n\t\tcallbackFunc( mkey, data );\n\t}\n\n\t// Back of background treatment, will be redirected to callback function\n\tvoid nit_monkey_callback_func( CMonkey *mkey, MonkeyAction *data )\n\t{\n\t\t// To call a your method, the signature must be written like this :\n\t\t// <Interface Name>_<Method>...\n\t\tMonkeyActionCallable_wokeUp( data->toCall, mkey, data->message );\n\t}\n`}\n\n# Implementable interface to get callback in defined methods\ninterface MonkeyActionCallable\n\tfun wokeUp( sender:Monkey, message: Object) is abstract\nend\n\n# Defining my object type Monkey, which is, in a low level, a pointer to a C struct (CMonkey)\nextern class Monkey `{ CMonkey * `}\n\t\n\tnew `{\n\t\tCMonkey *monkey = malloc( sizeof(CMonkey) );\n\t\tmonkey->age = 10;\n\t\tmonkey->id = 1;\n\t\treturn monkey;\n\t`}\n\t\n\t# Object method which will get a callback in wokeUp method, defined in MonkeyActionCallable interface\n\t# Must be defined as Nit/C method because of C call inside\n\tfun wokeUpAction( toCall: MonkeyActionCallable, message: Object ) is extern import MonkeyActionCallable.wokeUp `{\n\n\t\t// Allocating memory to keep reference of received parameters :\n\t\t// - Object receiver\n\t\t// - Message \n\t\tMonkeyAction *data = malloc( sizeof(MonkeyAction) );\n\n\t\t// Incrementing reference counter to prevent from releasing\n\t\tMonkeyActionCallable_incr_ref( toCall );\n\t\tObject_incr_ref( message );\n\t\t\n\t\tdata->toCall = toCall;\n\t\tdata->message = message;\n\t\t\n\t\t// Calling method which reproduce a callback by passing :\n\t\t// - Receiver\n\t\t// - Function pointer to object return method\n\t\t// - Datas\n\t\tcbMonkey( recv, &nit_monkey_callback_func, data );\n\t`}\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/circular_list.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Implementation of circular lists\n# This example shows the usage of generics and somewhat a specialisation of collections.\nmodule circular_list\n\n# Sequences of elements implemented with a double-linked circular list\nclass CircularList[E]\n\t# Like standard Array or LinkedList, CircularList is a Sequence.\n\tsuper Sequence[E]\n\n\t# The first node of the list if any\n\t# The special case of an empty list is handled by a null node\n\tprivate var node: nullable CLNode[E] = null\n\n\tredef fun iterator do return new CircularListIterator[E](self)\n\n\tredef fun first do return self.node.item\n\n\tredef fun push(e)\n\tdo\n\t\tvar new_node = new CLNode[E](e)\n\t\tvar n = self.node\n\t\tif n == null then\n\t\t\t# the first node\n\t\t\tself.node = new_node\n\t\telse\n\t\t\t# not the first one, so attach nodes correctly.\n\t\t\tvar old_last_node = n.prev\n\t\t\tnew_node.next = n\n\t\t\tnew_node.prev = old_last_node\n\t\t\told_last_node.next = new_node\n\t\t\tn.prev = new_node\n\t\tend\n\tend\n\n\tredef fun pop\n\tdo\n\t\tvar n = self.node\n\t\tassert n != null\n\t\tvar prev = n.prev\n\t\tif prev == n then\n\t\t\t# the only node\n\t\t\tself.node = null\n\t\t\treturn n.item\n\t\tend\n\t\t# not the only one do detach nodes correctly.\n\t\tvar prev_prev = prev.prev\n\t\tn.prev = prev_prev\n\t\tprev_prev.next = n\n\t\treturn prev.item\n\tend\n\n\tredef fun unshift(e)\n\tdo\n\t\t# Circularity has benefits.\n\t\tpush(e)\n\t\tself.node = self.node.prev\n\tend\n\n\tredef fun shift\n\tdo\n\t\t# Circularity has benefits.\n\t\tself.node = self.node.next\n\t\treturn self.pop\n\tend\n\n\t# Move the first at the last position, the second at the first, etc.\n\tfun rotate\n\tdo\n\t\tvar n = self.node\n\t\tif n == null then return\n\t\tself.node = n.next\n\tend\n\n\t# Sort the list using the Josephus algorithm.\n\tfun josephus(step: Int)\n\tdo\n\t\tvar res = new CircularList[E]\n\t\twhile not self.is_empty do\n\t\t\t# count 'step'\n\t\t\tfor i in [1..step[ do self.rotate\n\t\t\t# kill\n\t\t\tvar x = self.shift\n\t\t\tres.add(x)\n\t\tend\n\t\tself.node = res.node\n\tend\nend\n\n# Nodes of a CircularList\nprivate class CLNode[E]\n\t# The current item\n\tvar item: E\n\n\t# The next item in the circular list.\n\t# Because of circularity, there is always a next;\n\t# so by default let it be self\n\tvar next: CLNode[E] = self\n\n\t# The previous item in the circular list.\n\t# Coherence between next and previous nodes has to be maintained by the\n\t# circular list.\n\tvar prev: CLNode[E] = self\nend\n\n# An iterator of a CircularList.\nprivate class CircularListIterator[E]\n\tsuper IndexedIterator[E]\n\n\tredef var index: Int\n\n\t# The current node pointed.\n\t# Is null if the list is empty.\n\tvar node: nullable CLNode[E]\n\n\t# The list iterated.\n\tvar list: CircularList[E]\n\n\tredef fun is_ok\n\tdo\n\t\t# Empty lists are not OK.\n\t\t# Pointing again the first node is not OK.\n\t\treturn self.node != null and (self.index == 0 or self.node != self.list.node)\n\tend\n\n\tredef fun next\n\tdo\n\t\tself.node = self.node.next\n\t\tself.index += 1\n\tend\n\n\tredef fun item do return self.node.item\n\n\tinit(list: CircularList[E])\n\tdo\n\t\tself.node = list.node\n\t\tself.list = list\n\t\tself.index = 0\n\tend\nend\n\nvar i = new CircularList[Int]\ni.add_all([1, 2, 3, 4, 5, 6, 7])\nprint i.first\nprint i.join(\":\")\n\ni.push(8)\nprint i.shift\nprint i.pop\ni.unshift(0)\nprint i.join(\":\")\n\ni.josephus(3)\nprint i.join(\":\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/clock.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This module provide a simple wall clock.\n# It is an example of getters and setters.\n# A beefed-up module is available in clock_more\nmodule clock\n\n# A simple wall clock with 60 minutes and 12 hours.\nclass Clock\n\t# total number of minutes from 0 to 719\n\tvar total_minutes: Int\n\t# Note: only the read acces is public, the write access is private.\n\n\t# number of minutes in the current hour (from 0 to 59)\n\tfun minutes: Int do return self.total_minutes % 60\n\t\n\t# set the number of minutes in the current hour.\n\t# if m < 0 or m >= 60, the hour will be changed accordinlgy\n\tfun minutes=(m: Int) do self.total_minutes = self.hours * 60 + m\n\n\t# number of hours (from 0 to 11)\n\tfun hours: Int do return self.total_minutes / 60\n\n\t# set the number of hours\n\t# the minutes will not be updated\n\tfun hours=(h: Int) do self.total_minutes = h * 60 + minutes\n\n\t# the position of the hour arrow in the [0..60[ interval\n\tfun hour_pos: Int do return total_minutes / 12\n\n\t# replace the arrow of hours (from 0 to 59).\n\t# the hours and the minutes will be updated.\n\tfun hour_pos=(h: Int) do self.total_minutes = h * 12\n\n\tredef fun to_s do return \"{hours}:{minutes}\"\n\n\tfun reset(hours, minutes: Int) do self.total_minutes = hours*60 + minutes\n\n\tinit(hours, minutes: Int) do self.reset(hours, minutes)\n\n\tredef fun ==(o)\n\tdo\n\t\t# Note: o is a nullable Object, a type test is required\n\t\t# Thanks to adaptive typing, there is no downcast\n\t\t# i.e. the code is safe!\n\t\treturn o isa Clock and self.total_minutes == o.total_minutes\n\tend\nend\n\nvar c = new Clock(10,50)\nprint \"It's {c} o'clock.\"\n\nc.minutes += 22\nprint \"Now it's {c} o'clock.\"\n\nprint \"The short arrow in on the {c.hour_pos/5} and the long arrow in on the {c.minutes/5}.\"\n\nc.hours -= 2\nprint \"Now it's {c} o'clock.\"\n\nvar c2 = new Clock(9, 11)\nprint \"It's {c2} on the second clock.\"\nprint \"The two clocks are synchronized: {c == c2}.\"\nc2.minutes += 1\nprint \"It's now {c2} on the second clock.\"\nprint \"The two clocks are synchronized: {c == c2}.\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/clock_more.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This module beef up the clock module by allowing a clock to be comparable.\n# It show the usage of class refinement\nmodule clock_more\n\nimport clock\n\nredef class Clock\n\t# Clock are now comparable\n\tsuper Comparable\n\n\t# Comparaison of a clock make only sense with an other clock\n\tredef type OTHER: Clock\n\n\tredef fun <(o)\n\tdo\n\t\t# Note: < is the only abstract method of Comparable.\n\t\t#       All other operators and methods rely on < and ==.\n\t\treturn self.total_minutes < o.total_minutes\n\tend\nend\n\nvar c1 = new Clock(8, 12)\nvar c2 = new Clock(8, 13)\nvar c3 = new Clock(9, 13)\n\nprint \"{c1}<{c2}? {c1<c2}\"\nprint \"{c1}<={c2}? {c1<=c2}\"\nprint \"{c1}>{c2}? {c1>c2}\"\nprint \"{c1}>={c2}? {c1>=c2}\"\nprint \"{c1}<=>{c2}? {c1<=>c2}\"\nprint \"{c1},{c2}? max={c1.max(c2)} min={c1.min(c2)}\"\nprint \"{c1}.is_between({c2}, {c3})? {c1.is_between(c2, c3)}\"\nprint \"{c2}.is_between({c1}, {c3})? {c2.is_between(c1, c3)}\"\n\nprint \"-\"\n\nc1.minutes += 1\n\nprint \"{c1}<{c2}? {c1<c2}\"\nprint \"{c1}<={c2}? {c1<=c2}\"\nprint \"{c1}>{c2}? {c1>c2}\"\nprint \"{c1}>={c2}? {c1>=c2}\"\nprint \"{c1}<=>{c2}? {c1<=>c2}\"\nprint \"{c1},{c2}? max={c1.max(c2)} min={c1.min(c2)}\"\nprint \"{c1}.is_between({c2}, {c3})? {c1.is_between(c2, c3)}\"\nprint \"{c2}.is_between({c1}, {c3})? {c2.is_between(c1, c3)}\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/curl_http.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Sample of the Curl module.\nmodule curl_http\n\nimport curl\n\n# Small class to represent an Http Fetcher\nclass MyHttpFetcher\n\tsuper CurlCallbacks\n\n\tvar curl: Curl\n\tvar our_body: String = \"\"\n\n\tinit(curl: Curl) do self.curl = curl\n\n\t# Release curl object\n\tfun destroy do self.curl.destroy\n\n\t# Header callback\n\tredef fun header_callback(line: String) do\n\t\t# We keep this callback silent for testing purposes\n\t\t#if not line.has_prefix(\"Date:\") then print \"Header_callback : {line}\"\n\tend\n\n\t# Body callback\n\tredef fun body_callback(line: String) do self.our_body = \"{self.our_body}{line}\"\n\n\t# Stream callback - Cf : No one is registered\n\tredef fun stream_callback(buffer: String, size: Int, count: Int) do print \"Stream_callback : {buffer} - {size} - {count}\"\nend\n\n\n# Program\nif args.length < 2 then\n\tprint \"Usage: curl_http <method wished [POST, GET, GET_FILE]> <target url>\"\nelse\n\tvar curl = new Curl\n\tvar url = args[1]\n\tvar request = new CurlHTTPRequest(url, curl)\n\n\t# HTTP Get Request\n\tif args[0] == \"GET\" then\n\t\trequest.verbose = false\n\t\tvar getResponse = request.execute\n\n\t\tif getResponse isa CurlResponseSuccess then\n\t\t\tprint \"Status code : {getResponse.status_code}\"\n\t\t\tprint \"Body : {getResponse.body_str}\"\n\t\telse if getResponse isa CurlResponseFailed then\n\t\t\tprint \"Error code : {getResponse.error_code}\"\n\t\t\tprint \"Error msg : {getResponse.error_msg}\"\n\t\tend\n\n\t# HTTP Post Request\n\telse if args[0] == \"POST\" then\n\t\tvar myHttpFetcher = new MyHttpFetcher(curl)\n\t\trequest.delegate = myHttpFetcher\n\n\t\tvar postDatas = new HeaderMap\n\t\tpostDatas[\"Bugs Bunny\"] = \"Daffy Duck\"\n\t\tpostDatas[\"Batman\"] = \"Robin likes special characters @#ùà!è§'(\\\"é&://,;<>∞~*\"\n\t\tpostDatas[\"Batman\"] = \"Yes you can set multiple identical keys, but APACHE will consider only once, the last one\"\n\t\trequest.datas = postDatas\n\t\trequest.verbose = false\n\t\tvar postResponse = request.execute\n\n\t\tprint \"Our body from the callback : {myHttpFetcher.our_body}\"\n\n\t\tif postResponse isa CurlResponseSuccess then\n\t\t\tprint \"*** Answer ***\"\n\t\t\tprint \"Status code : {postResponse.status_code}\"\n\t\t\tprint \"Body should be empty, because we decided to manage callbacks : {postResponse.body_str.length}\"\n\t\telse if postResponse isa CurlResponseFailed then\n\t\t\tprint \"Error code : {postResponse.error_code}\"\n\t\t\tprint \"Error msg : {postResponse.error_msg}\"\n\t\tend\n\n\t# HTTP Get to file Request\n\telse if args[0] == \"GET_FILE\" then\n\t\tvar headers = new HeaderMap\n\t\theaders[\"Accept\"] = \"Moo\"\n\t\trequest.headers = headers\n\t\trequest.verbose = false\n\t\tvar downloadResponse = request.download_to_file(null)\n\n\t\tif downloadResponse isa CurlFileResponseSuccess then\n\t\t\tprint \"*** Answer ***\"\n\t\t\tprint \"Status code : {downloadResponse.status_code}\"\n\t\t\tprint \"Size downloaded : {downloadResponse.size_download}\"\n\t\telse if downloadResponse isa CurlResponseFailed then\n\t\t\tprint \"Error code : {downloadResponse.error_code}\"\n\t\t\tprint \"Error msg : {downloadResponse.error_msg}\"\n\t\tend\n\t# Program logic\n\telse\n\t\tprint \"Usage : Method[POST, GET, GET_FILE]\"\n\tend\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/curl_mail.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Mail sender sample using the Curl module\nmodule curl_mail\n\nimport curl\n\nvar curl = new Curl\nvar mail_request = new CurlMailRequest(curl)\n\n# Networks\nvar response = mail_request.set_outgoing_server(\"smtps://smtp.example.org:465\", \"user@example.org\", \"mypassword\")\nif response isa CurlResponseFailed then\n\tprint \"Error code : {response.error_code}\"\n\tprint \"Error msg : {response.error_msg}\"\nend\n\n# Headers\nmail_request.from = \"Billy Bob\"\nmail_request.to = [\"user@example.org\"]\nmail_request.cc = [\"bob@example.org\"]\nmail_request.bcc = null\n\nvar headers_body = new HeaderMap\nheaders_body[\"Content-Type:\"] = \"text/html; charset=\\\"UTF-8\\\"\"\nheaders_body[\"Content-Transfer-Encoding:\"] = \"quoted-printable\"\nmail_request.headers_body = headers_body\n\n# Content\nmail_request.body = \"<h1>Here you can write HTML stuff.</h1>\"\nmail_request.subject = \"Hello From My Nit Program\"\n\n# Others\nmail_request.verbose = false\n\n# Send mail\nresponse = mail_request.execute\nif response isa CurlResponseFailed then\n\tprint \"Error code : {response.error_code}\"\n\tprint \"Error msg : {response.error_msg}\"\nelse if response isa CurlMailResponseSuccess then\n\tprint \"Mail Sent\"\nelse\n\tprint \"Unknown Curl Response type\"\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/draw_operation.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Draws an arithmetic operation to the terminal\nmodule draw_operation\n\nredef enum Int\n\tfun n_chars: Int `{\n\t\tint c;\n\t\tif ( abs(recv) >= 10 )\n\t\t\tc = 1+(int)log10f( (float)abs(recv) );\n\t\telse\n\t\t\tc = 1;\n\t\tif ( recv < 0 ) c ++;\n\t\treturn c;\n\t`}\nend\n\nredef enum Char\n\tfun as_operator(a, b: Int): Int\n\tdo\n\t\tif self == '+' then return a + b\n\t\tif self == '-' then return a - b\n\t\tif self == '*' then return a * b\n\t\tif self == '/' then return a / b\n\t\tif self == '%' then return a % b\n\t\tabort\n\tend\n\n\tfun override_dispc: Bool\n\tdo\n\t\treturn self == '+' or self == '-' or self == '*' or self == '/' or self == '%'\n\tend\n\n\tfun lines(s: Int): Array[Line]\n\tdo\n\t\tif self == '+' then\n\t\t\treturn [new Line(new P(0,s/2),1,0,s), new Line(new P(s/2,1),0,1,s-2)]\n\t\telse if self == '-' then\n\t\t\treturn [new Line(new P(0,s/2),1,0,s)]\n\t\telse if self == '*' then\n\t\t\tvar lines = new Array[Line]\n\t\t\tfor y in [1..s-1[ do\n\t\t\t\tlines.add( new Line(new P(1,y), 1,0,s-2) )\n\t\t\tend\n\t\t\treturn lines\n\t\telse if self == '/' then\n\t\t\treturn [new Line(new P(s-1,0), -1,1, s )]\n\t\telse if self == '%' then\n\t\t\tvar q4 = s/4\n\t\t\tvar lines = [new Line(new P(s-1,0),-1,1,s)]\n\t\t\tfor l in [0..q4[ do\n\t\t\t\tlines.append([ new Line( new P(0,l), 1,0,q4), new Line( new P(s-1,s-1-l), -1,0,q4) ])\n\t\t\tend\n\t\t\treturn lines\n\t\telse if self == '1' then\n\t\t\treturn [new Line(new P(s/2,0), 0,1,s),new Line(new P(0,s-1),1,0,s),\n\t\t\t\tnew Line( new P(s/2,0),-1,1,s/2)]\n\t\telse if self == '2' then\n\t\t\treturn [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s/2),\n\t\t\t\tnew Line( new P(0,s-1),1,0,s), new Line( new P(0,s/2), 0,1,s/2),\n\t\t\t\tnew Line( new P(0,s/2), 1,0,s)]\n\t\telse if self == '3' then\n\t\t\treturn [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s),\n\t\t\t\tnew Line( new P(0,s-1),1,0,s), new Line( new P(0,s/2), 1,0,s)]\n\t\telse if self == '4' then\n\t\t\treturn [new Line(new P(s-1,0),0,1,s), new Line( new P(0,0), 0,1,s/2),\n\t\t\t\tnew Line( new P(0,s/2), 1,0,s)]\n\t\telse if self == '5' then\n\t\t\treturn [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,s/2),0,1,s/2),\n\t\t\t\tnew Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s/2),\n\t\t\t\tnew Line( new P(0,s/2), 1,0,s)]\n\t\telse if self == '6' then\n\t\t\treturn [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,s/2),0,1,s/2),\n\t\t\t\tnew Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s),\n\t\t\t\tnew Line( new P(0,s/2), 1,0,s)]\n\t\telse if self == '7' then\n\t\t\tvar tl = new P(0,0)\n\t\t\tvar tr = new P(s-1,0)\n\t\t\treturn [new Line(tl, 1,0,s), new Line(tr,-1,1,s)]\n\t\telse if self == '8' then\n\t\t\treturn [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s),\n\t\t\t\tnew Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s),\n\t\t\t\tnew Line( new P(0,s/2), 1,0,s)]\n\t\telse if self == '9' then\n\t\t\treturn [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s),\n\t\t\t\tnew Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s/2),\n\t\t\t\tnew Line( new P(0,s/2), 1,0,s)]\n\t\telse if self == '0' then\n\t\t\treturn [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s),\n\t\t\t\tnew Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s)]\n\t\tend\n\t\treturn new Array[Line]\n\tend\nend\n\nclass P\n\tvar x : Int\n\tvar y : Int\nend\n\nredef class String\n\t# hack is to support a bug in the evaluation software\n\tfun draw(dispc: Char, size, gap: Int, hack: Bool)\n\tdo\n\t\tvar w = size * length +(length-1)*gap\n\t\tvar h = size\n\t\tvar map = new Array[Array[Char]]\n\t\tfor x in [0..w[ do\n\t\t\tmap[x] = new Array[Char].filled_with( ' ',  h )\n\t\tend\n\n\t\tvar ci = 0\n\t\tfor c in self.chars do\n\t\t\tvar local_dispc\n\t\t\tif c.override_dispc then\n\t\t\t\tlocal_dispc = c\n\t\t\telse\n\t\t\t\tlocal_dispc = dispc\n\t\t\tend\n\n\t\t\tvar lines = c.lines( size )\n\t\t\tfor line in lines do\n\t\t\t\tvar x = line.o.x+ci*size\n\t\t\t\t\tx += ci*gap\n\t\t\t\tvar y = line.o.y\n\t\t\t\tfor s in [0..line.len[ do\n\t\t\t\t\tassert map.length > x and map[x].length > y else print \"setting {x},{y} as {local_dispc}\"\n\t\t\t\t\tmap[x][y] = local_dispc\n\t\t\t\t\tx += line.step_x\n\t\t\t\t\ty += line.step_y\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tci += 1\n\t\tend\n\n\t\tif hack then\n\t\t\tfor c in [0..size[ do\n\t\t\t\tmap[c][0] = map[map.length-size+c][0]\n\t\t\t\tmap[map.length-size+c][0] = ' '\n\t\t\tend\n\t\tend\n\n\t\tfor y in [0..h[ do\n\t\t\tfor x in [0..w[ do\n\t\t\t\tprintn map[x][y]\n\t\t\tend\n\t\t\tprint \"\"\n\t\tend\n\tend\nend\n\nclass Line\n\tvar o : P\n\tvar step_x : Int\n\tvar step_y : Int\n\tvar len : Int\nend\n\nvar a\nvar b\nvar op_char\nvar disp_char\nvar disp_size\nvar disp_gap\n\nif \"NIT_TESTING\".environ == \"true\" then\n\ta = 567\n\tb = 13\n\top_char = '*'\n\tdisp_char = 'O'\n\tdisp_size = 8\n\tdisp_gap = 1\nelse\n\tprintn \"Left operand: \"\n\ta = gets.to_i\n\n\tprintn \"Right operand: \"\n\tb = gets.to_i\n\n\tprintn \"Operator (+, -, *, /, %): \"\n\top_char = gets.chars[0]\n\n\tprintn \"Char to display: \"\n\tdisp_char = gets.chars[0]\n\n\tprintn \"Size of text: \"\n\tdisp_size = gets.to_i\n\n\tprintn \"Space between digits: \"\n\tdisp_gap = gets.to_i\nend\n\nvar result = op_char.as_operator( a, b )\n\nvar len_a = a.n_chars\nvar len_b = b.n_chars\nvar len_res = result.n_chars\nvar max_len = len_a.max( len_b.max( len_res ) ) + 1\n\n# draw first line\nvar d = max_len - len_a\nvar line_a = \"\"\nfor i in [0..d[ do line_a += \" \"\nline_a += a.to_s\nline_a.draw( disp_char, disp_size, disp_gap, false )\n\nprint \"\"\n# draw second line\nd = max_len - len_b-1\nvar line_b = op_char.to_s\nfor i in [0..d[ do line_b += \" \"\nline_b += b.to_s\nline_b.draw( disp_char, disp_size, disp_gap, false )\n\n# draw -----\nprint \"\"\nfor i in [0..disp_size*max_len+(max_len-1)*disp_gap] do\n\tprintn \"_\"\nend\nprint \"\"\nprint \"\"\n\n# draw result\nd = max_len - len_res\nvar line_res = \"\"\nfor i in [0..d[ do line_res += \" \"\nline_res += result.to_s\nline_res.draw( disp_char, disp_size, disp_gap, false )\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/drop_privileges.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Example using the privileges module to drop privileges from root\nmodule drop_privileges\n\nimport privileges\n\n# basic command line options\nvar opts = new OptionContext\nvar opt_ug = new OptionUserAndGroup.for_dropping_privileges\nopt_ug.mandatory = true\nopts.add_option(opt_ug)\n\n# parse and check command line options\nopts.parse(args)\nif not opts.errors.is_empty then\n\tprint opts.errors\n\tprint \"Usage: drop_privileges [options]\"\n\topts.usage\n\texit 1\nend\n\n# original user\nprint \"before {sys.uid}:{sys.gid}\"\n\n# make the switch\nvar user_group = opt_ug.value\nassert user_group != null\nuser_group.drop_privileges\n\n# final user\nprint \"after {sys.uid}:{sys.egid}\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/extern_methods.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This module illustrates some uses of the FFI, specifically\n# how to use extern methods. Which means to implement a Nit method in C.\nmodule extern_methods\n\nredef enum Int\n\t# Returns self'th fibonnaci number\n\t# implemented here in C for optimization purposes\n\tfun fib : Int import fib `{\n\t\tif ( recv < 2 )\n\t\t\treturn recv;\n\t\telse\n\t\t\treturn Int_fib( recv-1 ) + Int_fib( recv-2 );\n\t`}\n\n\t# System call to sleep for \"self\" seconds\n\tfun sleep `{\n\t\tsleep( recv );\n\t`}\n\n\t# Return atan2l( self, x ) from libmath\n\tfun atan_with( x : Int ) : Float `{\n\t\treturn atan2( recv, x );\n\t`}\n\n\t# This method callback to Nit methods from C code\n\t# It will use from C code:\n\t# * the local fib method\n\t# * the + operator, a method of Int\n\t# * to_s, a method of all objects\n\t# * String.to_cstring, a method of String to return an equivalent char*\n\tfun foo import fib, +, to_s, String.to_cstring `{\n\t\tlong recv_fib = Int_fib( recv );\n\t\tlong recv_plus_fib = Int__plus( recv, recv_fib );\n\n\t\tString nit_string = Int_to_s( recv_plus_fib );\n\t\tchar *c_string = String_to_cstring( nit_string );\n\n\t\tprintf( \"from C: self + fib(self) = %s\\n\", c_string );\n\t`}\n\n\t# Equivalent to foo but written in pure Nit\n\tfun bar do print \"from Nit: self + fib(self) = {self+self.fib}\"\nend\n\nprint 12.fib\n\nprint \"sleeping 1 second...\"\n1.sleep\n\nprint 100.atan_with( 200 )\n8.foo\n8.bar\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/fibonacci.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2004-2008 Jean Privat <jean@pryen.org>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# A simple exemple of refinement where a method is added to the integer class.\nmodule fibonacci\n\nredef class Int\n\t# Calculate the self-th element of the fibonacci sequence.\n\tfun fibonacci: Int\n\tdo\n\t\tif self < 2 then\n\t\t\treturn 1\n\t\telse\n\t\t\treturn (self-2).fibonacci + (self-1).fibonacci\n\t\tend\n\tend \nend\n\n# Print usage and exit.\nfun usage\ndo\n\tprint \"Usage: fibonnaci <integer>\" \n\texit 0 \nend\n\n# Main part\nif args.length != 1 then\n\tusage\nend\nprint args.first.to_i.fibonacci\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/file.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2004-2008 Jean Privat <jean@pryen.org>\n# Copyright 2008 Floréal Morandat <morandat@lirmm.fr>\n# Copyright 2008 Jean-Sébastien Gélinas <calestar@gmail.com>\n#\n# This file is free software, which comes along with NIT.  This software is\n# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A \n# PARTICULAR PURPOSE.  You can modify it is you want,  provided this header\n# is kept unaltered, and a notification of the changes is added.\n# You  are  allowed  to  redistribute it and sell it, alone or is a part of\n# another product.\n\n# File manipulations (create, read, write, etc.)\nmodule file\n\nintrude import stream\nintrude import ropes\nimport string_search\nimport time\n\nin \"C Header\" `{\n\t#include <dirent.h>\n\t#include <string.h>\n\t#include <sys/types.h>\n\t#include <sys/stat.h>\n\t#include <unistd.h>\n\t#include <stdio.h>\n\t#include <poll.h>\n\t#include <errno.h>\n`}\n\n# File Abstract Stream\nabstract class FStream\n\tsuper IOS\n\t# The path of the file.\n\tvar path: nullable String = null\n\n\t# The FILE *.\n\tprivate var file: nullable NativeFile = null\n\n\tfun file_stat: FileStat do return _file.file_stat\n\n\t# File descriptor of this file\n\tfun fd: Int do return _file.fileno\nend\n\n# File input stream\nclass IFStream\n\tsuper FStream\n\tsuper BufferedIStream\n\tsuper PollableIStream\n\t# Misc\n\n\t# Open the same file again.\n\t# The original path is reused, therefore the reopened file can be a different file.\n\tfun reopen\n\tdo\n\t\tif not eof and not _file.address_is_null then close\n\t\t_file = new NativeFile.io_open_read(path.to_cstring)\n\t\tif _file.address_is_null then\n\t\t\tlast_error = new IOError(\"Error: Opening file at '{path.as(not null)}' failed with '{sys.errno.strerror}'\")\n\t\t\tend_reached = true\n\t\t\treturn\n\t\tend\n\t\tend_reached = false\n\t\t_buffer_pos = 0\n\t\t_buffer.clear\n\tend\n\n\tredef fun close\n\tdo\n\t\tif _file.address_is_null then return\n\t\tvar i = _file.io_close\n\t\t_buffer.clear\n\t\tend_reached = true\n\tend\n\n\tredef fun fill_buffer\n\tdo\n\t\tvar nb = _file.io_read(_buffer.items, _buffer.capacity)\n\t\tif nb <= 0 then\n\t\t\tend_reached = true\n\t\t\tnb = 0\n\t\tend\n\t\t_buffer.length = nb\n\t\t_buffer_pos = 0\n\tend\n\t# End of file?\n\tredef var end_reached: Bool = false\n\n\t# Open the file at `path` for reading.\n\tinit open(path: String)\n\tdo\n\t\tself.path = path\n\t\tprepare_buffer(10)\n\t\t_file = new NativeFile.io_open_read(path.to_cstring)\n\t\tif _file.address_is_null then\n\t\t\tlast_error = new IOError(\"Error: Opening file at '{path}' failed with '{sys.errno.strerror}'\")\n\t\t\tend_reached = true\n\t\tend\n\tend\n\n\tinit from_fd(fd: Int) do\n\t\tself.path = \"\"\n\t\tprepare_buffer(10)\n\t\t_file = fd_to_stream(fd, read_only)\n\t\tif _file.address_is_null then\n\t\t\tlast_error = new IOError(\"Error: Converting fd {fd} to stream failed with '{sys.errno.strerror}'\")\n\t\t\tend_reached = true\n\t\tend\n\tend\nend\n\n# File output stream\nclass OFStream\n\tsuper FStream\n\tsuper OStream\n\t\n\tredef fun write(s)\n\tdo\n\t\tif last_error != null then return\n\t\tif not _is_writable then\n\t\t\tlast_error = new IOError(\"Cannot write to non-writable stream\")\n\t\t\treturn\n\t\tend\n\t\tif s isa FlatText then\n\t\t\twrite_native(s.to_cstring, s.length)\n\t\telse\n\t\t\tfor i in s.substrings do write_native(i.to_cstring, i.length)\n\t\tend\n\tend\n\n\tredef fun close\n\tdo\n\t\tif _file.address_is_null then\n\t\t\tlast_error = new IOError(\"Cannot close non-existing write stream\")\n\t\t\t_is_writable = false\n\t\t\treturn\n\t\tend\n\t\tvar i = _file.io_close\n\t\t_is_writable = false\n\tend\n\tredef var is_writable = false\n\t\n\t# Write `len` bytes from `native`.\n\tprivate fun write_native(native: NativeString, len: Int)\n\tdo\n\t\tif last_error != null then return\n\t\tif not _is_writable then\n\t\t\tlast_error = new IOError(\"Cannot write to non-writable stream\")\n\t\t\treturn\n\t\tend\n\t\tif _file.address_is_null then\n\t\t\tlast_error = new IOError(\"Writing on a null stream\")\n\t\t\t_is_writable = false\n\t\t\treturn\n\t\tend\n\t\tvar err = _file.io_write(native, len)\n\t\tif err != len then\n\t\t\t# Big problem\n\t\t\tlast_error = new IOError(\"Problem in writing : {err} {len} \\n\")\n\t\tend\n\tend\n\t\n\t# Open the file at `path` for writing.\n\tinit open(path: String)\n\tdo\n\t\t_file = new NativeFile.io_open_write(path.to_cstring)\n\t\tif _file.address_is_null then\n\t\t\tlast_error = new IOError(\"Error: Opening file at '{path}' failed with '{sys.errno.strerror}'\")\n\t\t\tself.path = path\n\t\t\tis_writable = false\n\t\tend\n\t\tself.path = path\n\t\t_is_writable = true\n\tend\n\n\t# Creates a new File stream from a file descriptor\n\tinit from_fd(fd: Int) do\n\t\tself.path = \"\"\n\t\t_file = fd_to_stream(fd, wipe_write)\n\t\t_is_writable = true\n\t\t if _file.address_is_null then\n\t\t\t last_error = new IOError(\"Error: Opening stream from file descriptor {fd} failed with '{sys.errno.strerror}'\")\n\t\t\t_is_writable = false\n\t\tend\n\tend\nend\n\nredef interface Object\n\n\tprivate fun read_only: NativeString do return \"r\".to_cstring\n\n\tprivate fun wipe_write: NativeString do return \"w\".to_cstring\n\n\tprivate fun fd_to_stream(fd: Int, mode: NativeString): NativeFile `{\n\t\treturn fdopen(fd, mode);\n\t`}\n\n\t# returns first available stream to read or write to\n\t# return null on interruption (possibly a signal)\n\tprotected fun poll( streams : Sequence[FStream] ) : nullable FStream\n\tdo\n\t\tvar in_fds = new Array[Int]\n\t\tvar out_fds = new Array[Int]\n\t\tvar fd_to_stream = new HashMap[Int,FStream]\n\t\tfor s in streams do\n\t\t\tvar fd = s.fd\n\t\t\tif s isa IFStream then in_fds.add( fd )\n\t\t\tif s isa OFStream then out_fds.add( fd )\n\n\t\t\tfd_to_stream[fd] = s\n\t\tend\n\n\t\tvar polled_fd = intern_poll( in_fds, out_fds )\n\n\t\tif polled_fd == null then\n\t\t\treturn null\n\t\telse\n\t\t\treturn fd_to_stream[polled_fd]\n\t\tend\n\tend\n\n\tprivate fun intern_poll(in_fds: Array[Int], out_fds: Array[Int]) : nullable Int is extern import Array[Int].length, Array[Int].[], Int.as(nullable Int) `{\n\t\tint in_len, out_len, total_len;\n\t\tstruct pollfd *c_fds;\n\t\tsigset_t sigmask;\n\t\tint i;\n\t\tint first_polled_fd = -1;\n\t\tint result;\n\n\t\tin_len = Array_of_Int_length( in_fds );\n\t\tout_len = Array_of_Int_length( out_fds );\n\t\ttotal_len = in_len + out_len;\n\t\tc_fds = malloc( sizeof(struct pollfd) * total_len );\n\n\t\t/* input streams */\n\t\tfor ( i=0; i<in_len; i ++ ) {\n\t\t\tint fd;\n\t\t\tfd = Array_of_Int__index( in_fds, i );\n\n\t\t\tc_fds[i].fd = fd;\n\t\t\tc_fds[i].events = POLLIN;\n\t\t}\n\n\t\t/* output streams */\n\t\tfor ( i=0; i<out_len; i ++ ) {\n\t\t\tint fd;\n\t\t\tfd = Array_of_Int__index( out_fds, i );\n\n\t\t\tc_fds[i].fd = fd;\n\t\t\tc_fds[i].events = POLLOUT;\n\t\t}\n\n\t\t/* poll all fds, unlimited timeout */\n\t\tresult = poll( c_fds, total_len, -1 );\n\n\t\tif ( result > 0 ) {\n\t\t\t/* analyse results */\n\t\t\tfor ( i=0; i<total_len; i++ )\n\t\t\t\tif ( c_fds[i].revents & c_fds[i].events || /* awaited event */\n\t\t\t\t\t c_fds[i].revents & POLLHUP ) /* closed */\n\t\t\t\t{\n\t\t\t\t\tfirst_polled_fd = c_fds[i].fd;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\treturn Int_as_nullable( first_polled_fd );\n\t\t}\n\t\telse if ( result < 0 )\n\t\t\tfprintf( stderr, \"Error in Stream:poll: %s\\n\", strerror( errno ) );\n\n\t\treturn null_Int();\n\t`}\nend\n\n###############################################################################\n\nclass Stdin\n\tsuper IFStream\n\n\tinit do\n\t\t_file = new NativeFile.native_stdin\n\t\tpath = \"/dev/stdin\"\n\t\tprepare_buffer(1)\n\tend\n\n\tredef fun poll_in: Bool is extern \"file_stdin_poll_in\"\nend\n\nclass Stdout\n\tsuper OFStream\n\tinit do\n\t\t_file = new NativeFile.native_stdout\n\t\tpath = \"/dev/stdout\"\n\t\t_is_writable = true\n\tend\nend\n\nclass Stderr\n\tsuper OFStream\n\tinit do\n\t\t_file = new NativeFile.native_stderr\n\t\tpath = \"/dev/stderr\"\n\t\t_is_writable = true\n\tend\nend\n\n###############################################################################\n\nredef class Streamable\n\t# Like `write_to` but take care of creating the file\n\tfun write_to_file(filepath: String)\n\tdo\n\t\tvar stream = new OFStream.open(filepath)\n\t\twrite_to(stream)\n\t\tstream.close\n\tend\nend\n\nredef class String\n\t# return true if a file with this names exists\n\tfun file_exists: Bool do return to_cstring.file_exists\n\n\t# The status of a file. see POSIX stat(2).\n\tfun file_stat: FileStat do return to_cstring.file_stat\n\n\t# The status of a file or of a symlink. see POSIX lstat(2).\n\tfun file_lstat: FileStat do return to_cstring.file_lstat\n\n\t# Remove a file, return true if success\n\tfun file_delete: Bool do return to_cstring.file_delete\n\n\t# Copy content of file at `self` to `dest`\n\tfun file_copy_to(dest: String)\n\tdo\n\t\tvar input = new IFStream.open(self)\n\t\tvar output = new OFStream.open(dest)\n\n\t\twhile not input.eof do\n\t\t\tvar buffer = input.read(1024)\n\t\t\toutput.write buffer\n\t\tend\n\n\t\tinput.close\n\t\toutput.close\n\tend\n\n\t# Remove the trailing extension `ext`.\n\t#\n\t# `ext` usually starts with a dot but could be anything.\n\t#\n\t#     assert \"file.txt\".strip_extension(\".txt\")  == \"file\"\n\t#     assert \"file.txt\".strip_extension(\"le.txt\")  == \"fi\"\n\t#     assert \"file.txt\".strip_extension(\"xt\")  == \"file.t\"\n\t#\n\t# if `ext` is not present, `self` is returned unmodified.\n\t#\n\t#     assert \"file.txt\".strip_extension(\".tar.gz\")  == \"file.txt\"\n\tfun strip_extension(ext: String): String\n\tdo\n\t\tif has_suffix(ext) then\n\t\t\treturn substring(0, length - ext.length)\n\t\tend\n\t\treturn self\n\tend\n\n\t# Extract the basename of a path and remove the extension\n\t#\n\t#     assert \"/path/to/a_file.ext\".basename(\".ext\")         == \"a_file\"\n\t#     assert \"path/to/a_file.ext\".basename(\".ext\")          == \"a_file\"\n\t#     assert \"path/to\".basename(\".ext\")                     == \"to\"\n\t#     assert \"path/to/\".basename(\".ext\")                    == \"to\"\n\t#     assert \"path\".basename(\"\")                        == \"path\"\n\t#     assert \"/path\".basename(\"\")                       == \"path\"\n\t#     assert \"/\".basename(\"\")                           == \"/\"\n\t#     assert \"\".basename(\"\")                            == \"\"\n\tfun basename(ext: String): String\n\tdo\n\t\tvar l = length - 1 # Index of the last char\n\t\twhile l > 0 and self.chars[l] == '/' do l -= 1 # remove all trailing `/`\n\t\tif l == 0 then return \"/\"\n\t\tvar pos = chars.last_index_of_from('/', l)\n\t\tvar n = self\n\t\tif pos >= 0 then\n\t\t\tn = substring(pos+1, l-pos)\n\t\tend\n\t\treturn n.strip_extension(ext)\n\tend\n\n\t# Extract the dirname of a path\n\t#\n\t#     assert \"/path/to/a_file.ext\".dirname         == \"/path/to\"\n\t#     assert \"path/to/a_file.ext\".dirname          == \"path/to\"\n\t#     assert \"path/to\".dirname                     == \"path\"\n\t#     assert \"path/to/\".dirname                    == \"path\"\n\t#     assert \"path\".dirname                        == \".\"\n\t#     assert \"/path\".dirname                       == \"/\"\n\t#     assert \"/\".dirname                           == \"/\"\n\t#     assert \"\".dirname                            == \".\"\n\tfun dirname: String\n\tdo\n\t\tvar l = length - 1 # Index of the last char\n\t\twhile l > 0 and self.chars[l] == '/' do l -= 1 # remove all trailing `/`\n\t\tvar pos = chars.last_index_of_from('/', l)\n\t\tif pos > 0 then\n\t\t\treturn substring(0, pos)\n\t\telse if pos == 0 then\n\t\t\treturn \"/\"\n\t\telse\n\t\t\treturn \".\"\n\t\tend\n\tend\n\n\t# Return the canonicalized absolute pathname (see POSIX function `realpath`)\n\tfun realpath: String do\n\t\tvar cs = to_cstring.file_realpath\n\t\tvar res = cs.to_s_with_copy\n\t\t# cs.free_malloc # FIXME memory leak\n\t\treturn res\n\tend\n\n\t# Simplify a file path by remove useless \".\", removing \"//\", and resolving \"..\"\n\t# \"..\" are not resolved if they start the path\n\t# starting \"/\" is not removed\n\t# trainling \"/\" is removed\n\t#\n\t# Note that the method only wonrk on the string:\n\t#  * no I/O access is performed\n\t#  * the validity of the path is not checked\n\t#\n\t#     assert \"some/./complex/../../path/from/../to/a////file//\".simplify_path\t     ==  \"path/to/a/file\"\n\t#     assert \"../dir/file\".simplify_path       ==  \"../dir/file\"\n\t#     assert \"dir/../../\".simplify_path        ==  \"..\"\n\t#     assert \"dir/..\".simplify_path            ==  \".\"\n\t#     assert \"//absolute//path/\".simplify_path ==  \"/absolute/path\"\n\t#     assert \"//absolute//../\".simplify_path   ==  \"/\"\n\tfun simplify_path: String\n\tdo\n\t\tvar a = self.split_with(\"/\")\n\t\tvar a2 = new Array[String]\n\t\tfor x in a do\n\t\t\tif x == \".\" then continue\n\t\t\tif x == \"\" and not a2.is_empty then continue\n\t\t\tif x == \"..\" and not a2.is_empty and a2.last != \"..\" then\n\t\t\t\ta2.pop\n\t\t\t\tcontinue\n\t\t\tend\n\t\t\ta2.push(x)\n\t\tend\n\t\tif a2.is_empty then return \".\"\n\t\tif a2.length == 1 and a2.first == \"\" then return \"/\"\n\t\treturn a2.join(\"/\")\n\tend\n\n\t# Correctly join two path using the directory separator.\n\t#\n\t# Using a standard \"{self}/{path}\" does not work in the following cases:\n\t#\n\t# * `self` is empty.\n\t# * `path` ends with `'/'`.\n\t# * `path` starts with `'/'`.\n\t#\n\t# This method ensures that the join is valid.\n\t#\n\t#     assert \"hello\".join_path(\"world\")   == \"hello/world\"\n\t#     assert \"hel/lo\".join_path(\"wor/ld\") == \"hel/lo/wor/ld\"\n\t#     assert \"\".join_path(\"world\")        == \"world\"\n\t#     assert \"hello\".join_path(\"/world\")  == \"/world\"\n\t#     assert \"hello/\".join_path(\"world\")  == \"hello/world\"\n\t#     assert \"hello/\".join_path(\"/world\") == \"/world\"\n\t#\n\t# Note: You may want to use `simplify_path` on the result.\n\t#\n\t# Note: This method works only with POSIX paths.\n\tfun join_path(path: String): String\n\tdo\n\t\tif path.is_empty then return self\n\t\tif self.is_empty then return path\n\t\tif path.chars[0] == '/' then return path\n\t\tif self.last == '/' then return \"{self}{path}\"\n\t\treturn \"{self}/{path}\"\n\tend\n\n\t# Convert the path (`self`) to a program name.\n\t#\n\t# Ensure the path (`self`) will be treated as-is by POSIX shells when it is\n\t# used as a program name. In order to do that, prepend `./` if needed.\n\t#\n\t#     assert \"foo\".to_program_name == \"./foo\"\n\t#     assert \"/foo\".to_program_name == \"/foo\"\n\t#     assert \"\".to_program_name == \"./\" # At least, your shell will detect the error.\n\tfun to_program_name: String do\n\t\tif self.has_prefix(\"/\") then\n\t\t\treturn self\n\t\telse\n\t\t\treturn \"./{self}\"\n\t\tend\n\tend\n\n\t# Alias for `join_path`\n\t#\n\t#     assert \"hello\" / \"world\"      ==  \"hello/world\"\n\t#     assert \"hel/lo\" / \"wor/ld\"    ==  \"hel/lo/wor/ld\"\n\t#     assert \"\" / \"world\"           ==  \"world\"\n\t#     assert \"/hello\" / \"/world\"    ==  \"/world\"\n\t#\n\t# This operator is quite useful for chaining changes of path.\n\t# The next one being relative to the previous one.\n\t#\n\t#     var a = \"foo\"\n\t#     var b = \"/bar\"\n\t#     var c = \"baz/foobar\"\n\t#     assert a/b/c == \"/bar/baz/foobar\"\n\tfun /(path: String): String do return join_path(path)\n\n\t# Returns the relative path needed to go from `self` to `dest`.\n\t#\n\t#     assert \"/foo/bar\".relpath(\"/foo/baz\") == \"../baz\"\n\t#     assert \"/foo/bar\".relpath(\"/baz/bar\") == \"../../baz/bar\"\n\t#\n\t# If `self` or `dest` is relative, they are considered relatively to `getcwd`.\n\t#\n\t# In some cases, the result is still independent of the current directory:\n\t#\n\t#     assert \"foo/bar\".relpath(\"..\") == \"../../..\"\n\t#\n\t# In other cases, parts of the current directory may be exhibited:\n\t#\n\t#     var p = \"../foo/bar\".relpath(\"baz\")\n\t#     var c = getcwd.basename(\"\")\n\t#     assert p == \"../../{c}/baz\"\n\t#\n\t# For path resolution independent of the current directory (eg. for paths in URL),\n\t# or to use an other starting directory than the current directory,\n\t# just force absolute paths:\n\t#\n\t#     var start = \"/a/b/c/d\"\n\t#     var p2 = (start/\"../foo/bar\").relpath(start/\"baz\")\n\t#     assert p2 == \"../../d/baz\"\n\t#\n\t#\n\t# Neither `self` or `dest` has to be real paths or to exist in directories since\n\t# the resolution is only done with string manipulations and without any access to\n\t# the underlying file system.\n\t#\n\t# If `self` and `dest` are the same directory, the empty string is returned:\n\t#\n\t#     assert \"foo\".relpath(\"foo\") == \"\"\n\t#     assert \"foo/../bar\".relpath(\"bar\") == \"\"\n\t#\n\t# The empty string and \".\" designate both the current directory:\n\t#\n\t#     assert \"\".relpath(\"foo/bar\")  == \"foo/bar\"\n\t#     assert \".\".relpath(\"foo/bar\") == \"foo/bar\"\n\t#     assert \"foo/bar\".relpath(\"\")  == \"../..\"\n\t#     assert \"/\" + \"/\".relpath(\".\") == getcwd\n\tfun relpath(dest: String): String\n\tdo\n\t\tvar cwd = getcwd\n\t\tvar from = (cwd/self).simplify_path.split(\"/\")\n\t\tif from.last.is_empty then from.pop # case for the root directory\n\t\tvar to = (cwd/dest).simplify_path.split(\"/\")\n\t\tif to.last.is_empty then to.pop # case for the root directory\n\n\t\t# Remove common prefixes\n\t\twhile not from.is_empty and not to.is_empty and from.first == to.first do\n\t\t\tfrom.shift\n\t\t\tto.shift\n\t\tend\n\n\t\t# Result is going up in `from` with \"..\" then going down following `to`\n\t\tvar from_len = from.length\n\t\tif from_len == 0 then return to.join(\"/\")\n\t\tvar up = \"../\"*(from_len-1) + \"..\"\n\t\tif to.is_empty then return up\n\t\tvar res = up + \"/\" + to.join(\"/\")\n\t\treturn res\n\tend\n\n\t# Create a directory (and all intermediate directories if needed)\n\tfun mkdir\n\tdo\n\t\tvar dirs = self.split_with(\"/\")\n\t\tvar path = new FlatBuffer\n\t\tif dirs.is_empty then return\n\t\tif dirs[0].is_empty then\n\t\t\t# it was a starting /\n\t\t\tpath.add('/')\n\t\tend\n\t\tfor d in dirs do\n\t\t\tif d.is_empty then continue\n\t\t\tpath.append(d)\n\t\t\tpath.add('/')\n\t\t\tpath.to_s.to_cstring.file_mkdir\n\t\tend\n\tend\n\n\t# Delete a directory and all of its content, return `true` on success\n\t#\n\t# Does not go through symbolic links and may get stuck in a cycle if there\n\t# is a cycle in the filesystem.\n\tfun rmdir: Bool\n\tdo\n\t\tvar ok = true\n\t\tfor file in self.files do\n\t\t\tvar file_path = self.join_path(file)\n\t\t\tvar stat = file_path.file_lstat\n\t\t\tif stat.is_dir then\n\t\t\t\tok = file_path.rmdir and ok\n\t\t\telse\n\t\t\t\tok = file_path.file_delete and ok\n\t\t\tend\n\t\t\tstat.free\n\t\tend\n\n\t\t# Delete the directory itself\n\t\tif ok then to_cstring.rmdir\n\n\t\treturn ok\n\tend\n\n\t# Change the current working directory\n\t#\n\t#     \"/etc\".chdir\n\t#     assert getcwd == \"/etc\"\n\t#     \"..\".chdir\n\t#     assert getcwd == \"/\"\n\t#\n\t# TODO: errno\n\tfun chdir do to_cstring.file_chdir\n\n\t# Return right-most extension (without the dot)\n\t#\n\t# Only the last extension is returned.\n\t# There is no special case for combined extensions.\n\t#\n\t#     assert \"file.txt\".file_extension      == \"txt\"\n\t#     assert \"file.tar.gz\".file_extension   == \"gz\"\n\t#\n\t# For file without extension, `null` is returned.\n\t# Hoever, for trailing dot, `\"\"` is returned.\n\t#\n\t#     assert \"file\".file_extension          == null\n\t#     assert \"file.\".file_extension         == \"\"\n\t#\n\t# The starting dot of hidden files is never considered.\n\t#\n\t#     assert \".file.txt\".file_extension     == \"txt\"\n\t#     assert \".file\".file_extension         == null\n\tfun file_extension: nullable String\n\tdo\n\t\tvar last_slash = chars.last_index_of('.')\n\t\tif last_slash > 0 then\n\t\t\treturn substring( last_slash+1, length )\n\t\telse\n\t\t\treturn null\n\t\tend\n\tend\n\n\t# returns files contained within the directory represented by self\n\tfun files : Set[ String ] is extern import HashSet[String], HashSet[String].add, NativeString.to_s, String.to_cstring, HashSet[String].as(Set[String]) `{\n\t\tchar *dir_path;\n\t\tDIR *dir;\n\n\t\tdir_path = String_to_cstring( recv );\n\t\tif ((dir = opendir(dir_path)) == NULL)\n\t\t{\n\t\t\tperror( dir_path );\n\t\t\texit( 1 );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tHashSet_of_String results;\n\t\t\tString file_name;\n\t\t\tstruct dirent *de;\n\n\t\t\tresults = new_HashSet_of_String();\n\n\t\t\twhile ( ( de = readdir( dir ) ) != NULL )\n\t\t\t\tif ( strcmp( de->d_name, \"..\" ) != 0 &&\n\t\t\t\t\tstrcmp( de->d_name, \".\" ) != 0 )\n\t\t\t\t{\n\t\t\t\t\tfile_name = NativeString_to_s( strdup( de->d_name ) );\n\t\t\t\t\tHashSet_of_String_add( results, file_name );\n\t\t\t\t}\n\n\t\t\tclosedir( dir );\n\t\t\treturn HashSet_of_String_as_Set_of_String( results );\n\t\t}\n\t`}\nend\n\nredef class NativeString\n\tprivate fun file_exists: Bool is extern \"string_NativeString_NativeString_file_exists_0\"\n\tprivate fun file_stat: FileStat is extern \"string_NativeString_NativeString_file_stat_0\"\n\tprivate fun file_lstat: FileStat `{\n\t\tstruct stat* stat_element;\n\t\tint res;\n\t\tstat_element = malloc(sizeof(struct stat));\n\t\tres = lstat(recv, stat_element);\n\t\tif (res == -1) return NULL;\n\t\treturn stat_element;\n\t`}\n\tprivate fun file_mkdir: Bool is extern \"string_NativeString_NativeString_file_mkdir_0\"\n\tprivate fun rmdir: Bool `{ return rmdir(recv); `}\n\tprivate fun file_delete: Bool is extern \"string_NativeString_NativeString_file_delete_0\"\n\tprivate fun file_chdir is extern \"string_NativeString_NativeString_file_chdir_0\"\n\tprivate fun file_realpath: NativeString is extern \"file_NativeString_realpath\"\nend\n\n# This class is system dependent ... must reify the vfs\nextern class FileStat `{ struct stat * `}\n\t# Returns the permission bits of file\n\tfun mode: Int is extern \"file_FileStat_FileStat_mode_0\"\n\t# Returns the last access time\n\tfun atime: Int is extern \"file_FileStat_FileStat_atime_0\"\n\t# Returns the last status change time \n\tfun ctime: Int is extern \"file_FileStat_FileStat_ctime_0\"\n\t# Returns the last modification time\n\tfun mtime: Int is extern \"file_FileStat_FileStat_mtime_0\"\n\t# Returns the size\n\tfun size: Int is extern \"file_FileStat_FileStat_size_0\"\n\n\t# Returns true if it is a regular file (not a device file, pipe, sockect, ...)\n\tfun is_reg: Bool `{ return S_ISREG(recv->st_mode); `}\n\t# Returns true if it is a directory\n\tfun is_dir: Bool `{ return S_ISDIR(recv->st_mode); `}\n\t# Returns true if it is a character device\n\tfun is_chr: Bool `{ return S_ISCHR(recv->st_mode); `}\n\t# Returns true if it is a block device\n\tfun is_blk: Bool `{ return S_ISBLK(recv->st_mode); `}\n\t# Returns true if the type is fifo\n\tfun is_fifo: Bool `{ return S_ISFIFO(recv->st_mode); `}\n\t# Returns true if the type is a link\n\tfun is_lnk: Bool `{ return S_ISLNK(recv->st_mode); `}\n\t# Returns true if the type is a socket\n\tfun is_sock: Bool `{ return S_ISSOCK(recv->st_mode); `}\nend\n\n# Instance of this class are standard FILE * pointers\nprivate extern class NativeFile `{ FILE* `}\n\tfun io_read(buf: NativeString, len: Int): Int is extern \"file_NativeFile_NativeFile_io_read_2\"\n\tfun io_write(buf: NativeString, len: Int): Int is extern \"file_NativeFile_NativeFile_io_write_2\"\n\tfun io_close: Int is extern \"file_NativeFile_NativeFile_io_close_0\"\n\tfun file_stat: FileStat is extern \"file_NativeFile_NativeFile_file_stat_0\"\n\tfun fileno: Int `{ return fileno(recv); `}\n\n\tnew io_open_read(path: NativeString) is extern \"file_NativeFileCapable_NativeFileCapable_io_open_read_1\"\n\tnew io_open_write(path: NativeString) is extern \"file_NativeFileCapable_NativeFileCapable_io_open_write_1\"\n\tnew native_stdin is extern \"file_NativeFileCapable_NativeFileCapable_native_stdin_0\"\n\tnew native_stdout is extern \"file_NativeFileCapable_NativeFileCapable_native_stdout_0\"\n\tnew native_stderr is extern \"file_NativeFileCapable_NativeFileCapable_native_stderr_0\"\nend\n\nredef class Sys\n\n\t# Standard input\n\tvar stdin: PollableIStream = new Stdin is protected writable\n\n\t# Standard output\n\tvar stdout: OStream = new Stdout is protected writable\n\n\t# Standard output for errors\n\tvar stderr: OStream = new Stderr is protected writable\n\nend\n\n# Print `objects` on the standard output (`stdout`).\nprotected fun printn(objects: Object...)\ndo\n\tsys.stdout.write(objects.to_s)\nend\n\n# Print an `object` on the standard output (`stdout`) and add a newline.\nprotected fun print(object: Object)\ndo\n\tsys.stdout.write(object.to_s)\n\tsys.stdout.write(\"\\n\")\nend\n\n# Read a character from the standard input (`stdin`).\nprotected fun getc: Char\ndo\n\treturn sys.stdin.read_char.ascii\nend\n\n# Read a line from the standard input (`stdin`).\nprotected fun gets: String\ndo\n\treturn sys.stdin.read_line\nend\n\n# Return the working (current) directory\nprotected fun getcwd: String do return file_getcwd.to_s\nprivate fun file_getcwd: NativeString is extern \"string_NativeString_NativeString_file_getcwd_0\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/hello_world.nit",
    "content": "print \"hello world\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/html_page.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\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\nimport html\n\nclass NitHomepage\n\tsuper HTMLPage\n\n\tredef fun head do\n\t\tadd(\"meta\").attr(\"charset\", \"utf-8\")\n\t\tadd(\"title\").text(\"Nit\")\n\t\tadd(\"link\").attr(\"rel\", \"icon\").attr(\"href\", \"http://nitlanguage.org/favicon.ico\").attr(\"type\", \"image/x-icon\")\n\t\tadd(\"link\").attr(\"rel\", \"stylesheet\").attr(\"href\", \"http://nitlanguage.org/style.css\").attr(\"type\", \"text/css\")\n\t\tadd(\"link\").attr(\"rel\", \"stylesheet\").attr(\"href\", \"http://nitlanguage.org/local.css\").attr(\"type\", \"text/css\")\n\tend\n\n\tredef fun body do\n\t\topen(\"article\").add_class(\"page\")\n\t\t\topen(\"section\").add_class(\"pageheader\")\n\t\t\t\tadd_html(\"<a id='toptitle_first' class='toptitle'>the</a><a id='toptitle_second' class='toptitle' href=''>Nit</a><a id='toptitle_third' class='toptitle' href=''>Programming Language</a>\")\n\t\t\t\topen(\"header\").add_class(\"header\")\n\t\t\t\t\topen(\"div\").add_class(\"topsubtitle\")\n\t\t\t\t\t\tadd(\"p\").text(\"A Fun Language for Serious Programming\")\n\t\t\t\t\tclose(\"div\")\n\t\t\t\tclose(\"header\")\n\t\t\tclose(\"section\")\n\n\t\t\topen(\"div\").attr(\"id\", \"pagebody\")\n\t\t\t\topen(\"section\").attr(\"id\", \"content\")\n\t\t\t\t\tadd(\"h1\").text(\"# What is Nit?\")\n\t\t\t\t\tadd(\"p\").text(\"Nit is an object-oriented programming language. The goal of Nit is to propose a robust statically typed programming language where structure is not a pain.\")\n\t\t\t\t\tadd(\"p\").text(\"So, what does the famous hello world program look like, in Nit?\")\n\t\t\t\t\tadd_html(\"<pre><tt><span class='normal'>print </span><span class='string'>'Hello, World!'</span></tt></pre>\")\n\n\t\t\t\t\tadd(\"h1\").text(\"# Feature Highlights\")\n\t\t\t\t\tadd(\"h2\").text(\"Usability\")\n\t\t\t\t\tadd(\"p\").text(\"Nit's goal is to be usable by real programmers for real projects\")\n\n\t\t\t\t\topen(\"ul\")\n\t\t\t\t\t\topen(\"li\")\n\t\t\t\t\t\tadd(\"a\").attr(\"href\", \"http://en.wikipedia.org/wiki/KISS_principle\").text(\"KISS principle\")\n\t\t\t\t\t\tclose(\"li\")\n\t\t\t\t\t\tadd(\"li\").text(\"Script-like language without verbosity nor cryptic statements\")\n\t\t\t\t\t\tadd(\"li\").text(\"Painless static types: static typing should help programmers\")\n\t\t\t\t\t\tadd(\"li\").text(\"Efficient development, efficient execution, efficient evolution.\")\n\t\t\t\t\tclose(\"ul\")\n\n\t\t\t\t\tadd(\"h2\").text(\"Robustness\")\n\t\t\t\t\tadd(\"p\").text(\"Nit will help you to write bug-free programs\")\n\n\t\t\t\t\topen(\"ul\")\n\t\t\t\t\t\tadd(\"li\").text(\"Strong static typing\")\n\t\t\t\t\t\tadd(\"li\").text(\"No more NullPointerException\")\n\t\t\t\t\tclose(\"ul\")\n\n\t\t\t\t\tadd(\"h2\").text(\"Object-Oriented\")\n\t\t\t\t\tadd(\"p\").text(\"Nit's guideline is to follow the most powerful OO principles\")\n\n\t\t\t\t\topen(\"ul\")\n\t\t\t\t\t\topen(\"li\")\n\t\t\t\t\t\tadd(\"a\").attr(\"href\", \"./everything_is_an_object/\").text(\"Everything is an object\")\n\t\t\t\t\t\tclose(\"li\")\n\t\t\t\t\t\topen(\"li\")\n\t\t\t\t\t\tadd(\"a\").attr(\"href\", \"./multiple_inheritance/\").text(\"Multiple inheritance\")\n\t\t\t\t\t\tclose(\"li\")\n\t\t\t\t\t\topen(\"li\")\n\t\t\t\t\t\tadd(\"a\").attr(\"href\", \"./refinement/\").text(\"Open classes\")\n\t\t\t\t\t\tclose(\"li\")\n\t\t\t\t\t\topen(\"li\")\n\t\t\t\t\t\tadd(\"a\").attr(\"href\", \"./virtual_types/\").text(\"Virtual types\")\n\t\t\t\t\t\tclose(\"li\")\n\t\t\t\t\tclose(\"ul\")\n\n\n\t\t\t\t\tadd(\"h1\").text(\"# Getting Started\")\n\t\t\t\t\tadd(\"p\").text(\"Get Nit from its Git repository:\")\n\n\t\t\t\t\tadd_html(\"<pre><code>$ git clone http://nitlanguage.org/nit.git</code></pre>\")\n\t\t\t\t\tadd(\"p\").text(\"Build the compiler (may be long):\")\n\t\t\t\t\tadd_html(\"<pre><code>$ cd nit\\n\")\n\t\t\t\t\tadd_html(\"$ make</code></pre>\")\n\t\t\t\t\tadd(\"p\").text(\"Compile a program:\")\n\t\t\t\t\tadd_html(\"<pre><code>$ bin/nitc examples/hello_world.nit</code></pre>\")\n\t\t\t\t\tadd(\"p\").text(\"Execute the program:\")\n\t\t\t\t\tadd_html(\"<pre><code>$ ./hello_world</code></pre>\")\n\t\t\t\tclose(\"section\")\n\t\t\tclose(\"div\")\n\t\tclose(\"article\")\n\tend\nend\n\nvar page = new NitHomepage\npage.write_to stdout\npage.write_to_file(\"nit.html\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/int_stack.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# An example that defines and uses stacks of integers.\n# The implementation is done with a simple linked list.\n# It features: free constructors, nullable types and some adaptive typing.\nmodule int_stack\n\n# A stack of integer implemented by a simple linked list.\n# Note that this is only a toy class since a real linked list will gain to use\n# generics and extends interfaces, like Collection, from the standard library.\nclass IntStack\n\t# The head node of the list.\n\t# Null means that the stack is empty.\n\tprivate var head: nullable ISNode = null\n\n\t# Add a new integer in the stack.\n\tfun push(val: Int)\n\tdo\n\t\tself.head = new ISNode(val, self.head)\n\tend\n\n\t# Remove and return the last pushed integer.\n\t# Return null if the stack is empty.\n\tfun pop: nullable Int\n\tdo\n\t\tvar head = self.head\n\t\tif head == null then return null\n\t\t# Note: the followings are statically safe because of the\n\t\t# previous 'if'.\n\t\tvar val = head.val\n\t\tself.head = head.next\n\t\treturn val\n\tend\n\n\t# Return the sum of all integers of the stack.\n\t# Return 0 if the stack is empty.\n\tfun sumall: Int\n\tdo\n\t\tvar sum = 0\n\t\tvar cur = self.head\n\t\twhile cur != null do\n\t\t\t# Note: the followings are statically safe because of\n\t\t\t# the condition of the 'while'.\n\t\t\tsum += cur.val\n\t\t\tcur = cur.next\n\t\tend\n\t\treturn sum\n\tend\n\n\t# Note: Because all attributes have a default value, a free constructor\n\t# \"init()\" is implicitly defined.\nend\n\n# A node of a IntStack\nprivate class ISNode\n\t# The integer value stored in the node.\n\tvar val: Int\n\n\t# The next node, if any.\n\tvar next: nullable ISNode\n\n\t# Note: A free constructor \"init(val: Int, next: nullable ISNode)\" is\n\t# implicitly defined.\nend\n\nvar l = new IntStack\nl.push(1)\nl.push(2)\nl.push(3)\n\nprint l.sumall\n\n# Note: the 'for' control structure cannot be used on IntStack in its current state.\n# It requires a more advanced topic.\n# However, why not using the 'loop' control structure?\nloop\n\tvar i = l.pop\n\tif i == null then break\n\t# The following is statically safe because of the previous 'if'.\n\tprint i * 10\nend\n\n# Note: 'or else' is used to give an alternative of a null expression.\nl.push(5)\nprint l.pop or else 0 # l.pop gives 5, so print 5\nprint l.pop or else 0 # l.pop gives null, so print the alternative: 0\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/meetup.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License\n\n# Shows a meetup and allows to modify its participants\nmodule meetup\n\nimport opportunity_model\nimport boilerplate\nimport welcome\nimport template\n\n# Shows a meetup and allows to modify its participants\nclass OpportunityMeetupPage\n\tsuper OpportunityPage\n\n\t# Meetup the page is supposed to show\n\tvar meetup: nullable Meetup = null\n\t# Answer mode for the meetup\n\tvar mode = 0\n\n\tinit from_id(id: String) do\n\t\tvar db = new OpportunityDB.open(\"opportunity\")\n\t\tmeetup = db.find_meetup_by_id(id)\n\t\tdb.close\n\t\tif meetup != null then mode = meetup.answer_mode\n\t\tinit\n\tend\n\n\tinit do\n\t\theader.page_js = \"mode = {mode};\\n\"\n\t\theader.page_js += \"\"\"\n\t\tfunction update_scores(){\n\t\t\tvar anss = $('.answer');\n\t\t\tvar count = {};\n\t\t\tvar scores = {};\n\t\t\tvar answers = [];\n\t\t\tvar maxscore = 0;\n\t\t\tfor(i=0; i < anss.length; i++){\n\t\t\t\tvar incscore = 0;\n\t\t\t\tvar inccount = 0;\n\t\t\t\tvar idparts = anss[i].id.split(\"_\");\n\t\t\t\tvar ansid = idparts[1];\n\t\t\t\tvar html = anss[i].innerHTML;\n\t\t\t\tif(html === \"<center>✔</center>\"){\n\t\t\t\t\tinccount = 1;\n\t\t\t\t\tincscore = 2;\n\t\t\t\t}else if(html === \"<center>❓</center>\"){\n\t\t\t\t\tincscore = 1;\n\t\t\t\t}\n\t\t\t\tvar intansid = parseInt(ansid)\n\t\t\t\tif(answers.indexOf(intansid) == -1){\n\t\t\t\t\tanswers.push(intansid);\n\t\t\t\t}\n\t\t\t\tif(ansid in count){\n\t\t\t\t\tcount[ansid] += inccount;\n\t\t\t\t}else{\n\t\t\t\t\tcount[ansid] = inccount;\n\t\t\t\t}\n\t\t\t\tif(ansid in scores){\n\t\t\t\t\tscores[ansid] += incscore;\n\t\t\t\t}else{\n\t\t\t\t\tscores[ansid] = incscore;\n\t\t\t\t}\n\t\t\t\tif(scores[ansid] > maxscore){\n\t\t\t\t\tmaxscore = scores[ansid];\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(i=0; i < answers.length; i++){\n\t\t\t\tvar ansid = answers[i].toString();\n\t\t\t\tvar el = $('#total'+ansid)[0];\n\t\t\t\tvar ins = \"<center>\"+count[ansid];\n\t\t\t\tif(scores[ansid] >= maxscore){\n\t\t\t\t\tins += \"<br/><span style=\\\\\"color:blue\\\\\">★</span>\";\n\t\t\t\t}\n\t\t\t\tins += \"</center>\";\n\t\t\t\tel.innerHTML = ins;\n\t\t\t}\n\t\t}\n\t\tfunction change_answer(ele, id){\n\t\t\t// modify only the currently selected entry\n\t\t\tif (in_modification_id != id) return;\n\n\t\t\tvar e = document.getElementById(ele.id);\n\t\t\tvar i = e.innerHTML;\n\t\t\tvar ans = true;\"\"\"\n\t\tif mode == 0 then\n\t\t\theader.page_js += \"\"\"\n\t\t\tif(i === \"<center>✔</center>\"){\n\t\t\t\tans = 0;\n\t\t\t\te.innerHTML = \"<center>✘</center>\"\n\t\t\t\te.style.color = \"red\";\n\t\t\t}else{\n\t\t\t\tans = 1;\n\t\t\t\te.innerHTML = \"<center>✔</center>\";\n\t\t\t\te.style.color = \"green\";\n\t\t\t}\"\"\"\n\n\t\telse\n\t\t\theader.page_js += \"\"\"\n\t\t\tif(i === \"<center>✔</center>\"){\n\t\t\t\tans = 1;\n\t\t\t\te.innerHTML = \"<center>❓</center>\"\n\t\t\t\te.style.color = \"#B8860B\";\n\t\t\t}else if(i === \"<center>❓</center>\"){\n\t\t\t\tans = 0;\n\t\t\t\te.innerHTML = \"<center>✘</center>\"\n\t\t\t\te.style.color = \"red\";\n\t\t\t}else{\n\t\t\t\tans = 2;\n\t\t\t\te.innerHTML = \"<center>✔</center>\";\n\t\t\t\te.style.color = \"green\";\n\t\t\t}\"\"\"\n\t\tend\n\t\theader.page_js += \"\"\"\n\t\t\tvar a = ele.id.split('_')\n\t\t\tvar pid = a[1]\n\t\t\tvar aid = a[2]\n\t\t\tupdate_scores();\n\t\t\t$.ajax({\n\t\t\t\ttype: \"POST\",\n\t\t\t\turl: \"./rest/answer\",\n\t\t\t\tdata: {\n\t\t\t\t\tanswer_id: aid,\n\t\t\t\t\tpers_id: pid,\n\t\t\t\t\tanswer: ans\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tfunction change_temp_answer(ele){\n\t\t\tvar e = document.getElementById(ele.id);\n\t\t\tvar i = e.innerHTML;\"\"\"\n\t\tif mode == 0 then\n\t\t\theader.page_js += \"\"\"\n\t\t\tif(i === \"<center>✔</center>\"){\n\t\t\t\te.innerHTML = \"<center>✘</center>\"\n\t\t\t\te.style.color = \"red\";\n\t\t\t}else{\n\t\t\t\te.innerHTML = \"<center>✔</center>\";\n\t\t\t\te.style.color = \"green\";\n\t\t\t}\n\t\t\t\"\"\"\n\t\telse\n\t\t\theader.page_js += \"\"\"\n\t\t\tif(i === \"<center>✔</center>\"){\n\t\t\t\te.innerHTML = \"<center>❓</center>\";\n\t\t\t\te.style.color = \"#B8860B\";\n\t\t\t}else if(i === \"<center>❓</center>\"){\n\t\t\t\te.innerHTML = \"<center>✘</center>\"\n\t\t\t\te.style.color = \"red\";\n\t\t\t}else{\n\t\t\t\te.innerHTML = \"<center>✔</center>\";\n\t\t\t\te.style.color = \"green\";\n\t\t\t}\n\t\t\t\"\"\"\n\t\tend\n\t\theader.page_js += \"\"\"\n\t\t\tupdate_scores();\n\t\t}\n\t\tfunction add_part(ele){\n\t\t\tvar e = document.getElementById(ele.id);\n\t\t\tvar pname = document.getElementById(\"new_name\").value;\n\t\t\tvar arr = e.id.split(\"_\");\n\t\t\tvar mid = arr[1];\n\t\t\tvar ans = $('#' + ele.id).parent().parent().parent().children(\".answer\");\n\t\t\tansmap = {};\n\t\t\tfor(i=0;i<ans.length;i++){\n\t\t\t\tvar curr = ans.eq(i)\n\t\t\t\"\"\"\n\t\tif mode == 0 then\n\t\t\theader.page_js += \"\"\"\n\t\t\t\tif(curr[0].innerHTML === \"<center>✔</center>\"){\n\t\t\t\t\tansmap[curr.attr('id')] = 1\n\t\t\t\t}else{\n\t\t\t\t\tansmap[curr.attr('id')] = 0\n\t\t\t\t}\"\"\"\n\t\telse\n\t\t\theader.page_js += \"\"\"\n\t\t\t\tif(curr[0].innerHTML === \"<center>✔</center>\"){\n\t\t\t\t\tansmap[curr.attr('id')] = 2\n\t\t\t\t}else if(curr[0].innerHTML === \"<center>❓</center>\"){\n\t\t\t\t\tansmap[curr.attr('id')] = 1\n\t\t\t\t}else{\n\t\t\t\t\tansmap[curr.attr('id')] = 0\n\t\t\t\t}\"\"\"\n\t\tend\n\t\theader.page_js += \"\"\"\n\t\t\t}\n\t\t\t$.ajax({\n\t\t\t\ttype: \"POST\",\n\t\t\t\turl: \"./rest/meetup/new_pers\",\n\t\t\t\tdata: {\n\t\t\t\t\tmeetup_id: mid,\n\t\t\t\t\tpersname: pname,\n\t\t\t\t\tanswers: $.param(ansmap)\n\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.done(function(data){\n\t\t\t\t\tlocation.reload();\n\t\t\t\t})\n\t\t\t\t.fail(function(data){\n\t\t\t\t\t//TODO: Notify of failure\n\t\t\t\t});\n\t\t}\n\t\tfunction remove_people(ele){\n\t\t\tvar arr = ele.id.split(\"_\")\n\t\t\tvar pid = arr[1]\n\t\t\t$('#' + ele.id).parent().parent().parent().remove();\n\t\t\tupdate_scores();\n\t\t\t$.ajax({\n\t\t\t\ttype: \"POST\",\n\t\t\t\turl: \"./rest/people\",\n\t\t\t\tdata: {\n\t\t\t\t\tmethod: \"DELETE\",\n\t\t\t\t\tp_id: pid\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t// ID of line currently open for modification\n\t\tvar in_modification_id = null;\n\t\tfunction modify_people(ele, id){\n\t\t\tif (in_modification_id != null) {\n\t\t\t\t// reset to normal values\n\t\t\t\t$('#modify_'+in_modification_id).text(\"Modify or delete\");\n\t\t\t\t$('#modify_'+in_modification_id).attr(\"class\", \"btn btn-xs btn-warning\");\n\t\t\t\t$('#line_'+in_modification_id).css(\"background-color\", \"\");\n\t\t\t\t$('#delete_'+in_modification_id).css(\"display\", \"none\");\n\t\t\t}\n\t\t\tif (in_modification_id != id) {\n\t\t\t\t// activate modifiable mode\n\t\t\t\t$('#modify_'+id).text(\"Done\");\n\t\t\t\t$('#modify_'+id).attr(\"class\", \"btn btn-xs btn-success\");\n\t\t\t\t$('#line_'+id).css(\"background-color\", \"LightYellow\");\n\t\t\t\t$('#delete_'+id).show();\n\n\t\t\t\tin_modification_id = id;\n\t\t\t} else {\n\t\t\t\tin_modification_id = null;\n\t\t\t}\n\t\t}\n\t\t\"\"\"\n\tend\n\n\tredef fun rendering do\n\t\tif meetup == null then\n\t\t\tadd((new OpportunityHomePage).write_to_string)\n\t\t\treturn\n\t\tend\n\t\tadd header\n\t\tvar db = new OpportunityDB.open(\"opportunity\")\n\t\tadd meetup.to_html(db)\n\t\tdb.close\n\t\tadd footer\n\tend\nend\n\nredef class Meetup\n\t# Build the HTML for `self`\n\tfun to_html(db: OpportunityDB): Streamable do\n\t\tvar t = new Template\n\t\tt.add \"\"\"\n<div class=\"container\">\n<div class=\"page-header\">\n\t<center><h1>{{{name}}}</h1></center>\n\"\"\"\n\t\tif not date.is_empty then t.add \"\"\"\n\t<center><h4>When: {{{date}}}</h4></center>\"\"\"\n\n\t\tif not place.is_empty then t.add \"\"\"\n\t<center><h4>Where: {{{place}}}</h4></center>\"\"\"\n\n\t\tt.add \"\"\"\n</div>\n<table class=\"table\">\n\"\"\"\n\t\tt.add \"<th>Participant name</th>\"\n\t\tfor i in answers(db) do\n\t\t\tt.add \"<th class=\\\"text-center\\\">\"\n\t\t\tt.add i.to_s\n\t\t\tt.add \"</th>\"\n\t\tend\n\t\tt.add \"<th></th>\"\n\t\tt.add \"</tr>\"\n\t\tfor i in participants(db) do\n\t\t\ti.load_answers(db, self)\n\t\t\tt.add \"<tr id=\\\"line_{i.id}\\\">\"\n\t\t\tt.add \"<td>\"\n\t\t\tt.add i.to_s\n\t\t\tt.add \"</td>\"\n\t\t\tfor j, k in i.answers do\n\t\t\t\tvar color\n\t\t\t\tif answer_mode == 0 then\n\t\t\t\t\tif k == 1 then\n\t\t\t\t\t\tcolor = \"green\"\n\t\t\t\t\telse\n\t\t\t\t\t\tcolor = \"red\"\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tif k == 2 then\n\t\t\t\t\t\tcolor = \"green\"\n\t\t\t\t\telse if k == 1 then\n\t\t\t\t\t\tcolor = \"#B8860B\"\n\t\t\t\t\telse\n\t\t\t\t\t\tcolor = \"red\"\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tt.add \"\"\"<td class=\"answer\" onclick=\"change_answer(this, {{{i.id}}})\" id=\"answer_{{{j.id}}}_{{{i.id}}}\" style=\"color:{{{color}}}\">\"\"\"\n\t\t\t\tt.add \"<center>\"\n\t\t\t\tif answer_mode == 0 then\n\t\t\t\t\tif k == 1 then\n\t\t\t\t\t\tt.add \"✔\"\n\t\t\t\t\telse\n\t\t\t\t\t\tt.add \"✘\"\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tif k == 2 then\n\t\t\t\t\t\tt.add \"✔\"\n\t\t\t\t\telse if k == 1 then\n\t\t\t\t\t\tt.add \"❓\"\n\t\t\t\t\telse\n\t\t\t\t\t\tt.add \"✘\"\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tt.add \"</center></td>\"\n\t\t\tend\n\t\t\tt.add \"\"\"<td class=\"opportunity-action\"><center><button class=\"btn btn-xs btn-warning\" type=\"button\" onclick=\"modify_people(this, {{{i.id}}})\" id=\"modify_{{{i.id}}}\">Modify or delete</button>&nbsp;\"\"\"\n\t\t\tt.add \"\"\"<button class=\"btn btn-xs btn-danger\" type=\"button\" onclick=\"remove_people(this)\" id=\"delete_{{{i.id}}}\" style=\"display: none;\">Delete</button></center></td>\"\"\"\n\t\t\tt.add \"</tr>\"\n\t\tend\n\t\tt.add \"\"\"\n<tr id=\"newrow\" style=\"background-color: LightYellow\">\n\t<td><input id=\"new_name\" type=\"text\" placeholder=\"Your name\" class=\"input-large\"></td>\n\t\t\"\"\"\n\t\tfor i in answers(db) do\n\t\t\tt.add \"<td class=\\\"answer\\\" id=\\\"newans_{i.id}\\\" onclick=\\\"change_temp_answer(this)\\\" style=\\\"color:red;\\\"><center>✘</center></td>\"\n\t\tend\n\t\tt.add \"\"\"\n\t<td><center><span id=\"add_{{{id}}}\" onclick=\"add_part(this)\" style=\"color:green;\" class=\"action\"><button class=\"btn btn-xs btn-success\" type=\"button\">Done</button></span></center></td>\"\"\"\n\t\tt.add \"</tr>\"\n\t\t# Compute score for each answer\n\t\tvar scores = new HashMap[Int, Int]\n\t\tvar maxsc = 0\n\t\tfor i in answers(db) do\n\t\t\tscores[i.id] = i.score(db)\n\t\t\tif scores[i.id] > maxsc then maxsc = scores[i.id]\n\t\tend\n\t\tt.add \"\"\"\n<tr id=\"total\">\n\t<th>Total</th>\n\t\t\"\"\"\n\t\tfor i in answers(db) do\n\t\t\tt.add \"\"\"<th id=\"total{{{i.id}}}\"><center>{{{i.count(db)}}}\"\"\"\n\t\t\tif scores.has_key(i.id) and scores[i.id] >= maxsc then\n\t\t\t\tt.add \"\"\"<br/><span style=\"color:blue\">★</span>\"\"\"\n\t\t\tend\n\t\t\tt.add \"</center></th>\"\n\t\tend\n\t\tt.add \"</th>\"\n\t\tt.add \"\"\"\n\t\t<th></th>\n</tr>\"\"\"\n\t\tt.add \"</table>\"\n\t\tt.add \"</div>\"\n\t\treturn t\n\tend\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/opengles2_hello_triangle.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Basic example of OpenGL ES 2.0 usage from the book OpenGL ES 2.0 Programming Guide.\n#\n# Code reference:\n# https://code.google.com/p/opengles-book-samples/source/browse/trunk/LinuxX11/Chapter_2/Hello_Triangle/Hello_Triangle.c \nmodule opengles2_hello_triangle\n\nimport glesv2\nimport egl\nimport mnit_linux # for sdl\nimport x11\n\nif \"NIT_TESTING\".environ == \"true\" then exit(0)\n\nvar window_width = 800\nvar window_height = 600\n\n#\n## SDL\n#\nvar sdl_display = new SDLDisplay(window_width, window_height)\nvar sdl_wm_info = new SDLSystemWindowManagerInfo\nvar x11_window_handle = sdl_wm_info.x11_window_handle\n\n#\n## X11\n#\nvar x_display = x_open_default_display\nassert x_display != 0 else print \"x11 fail\"\n\n#\n## EGL\n#\nvar egl_display = new EGLDisplay(x_display)\nassert egl_display.is_valid else print \"EGL display is not valid\"\negl_display.initialize\n\nprint \"EGL version: {egl_display.version}\"\nprint \"EGL vendor: {egl_display.vendor}\"\nprint \"EGL extensions: {egl_display.extensions.join(\", \")}\"\nprint \"EGL client APIs: {egl_display.client_apis.join(\", \")}\"\n\nassert egl_display.is_valid else print egl_display.error\n\nvar config_chooser = new EGLConfigChooser\n#config_chooser.surface_type_egl\nconfig_chooser.blue_size = 8\nconfig_chooser.green_size = 8\nconfig_chooser.red_size = 8\n#config_chooser.alpha_size = 8\n#config_chooser.depth_size = 8\n#config_chooser.stencil_size = 8\n#config_chooser.sample_buffers = 1\nconfig_chooser.close\n\nvar configs = config_chooser.choose(egl_display)\nassert configs != null else print \"choosing config failed: {egl_display.error}\"\nassert not configs.is_empty else print \"no EGL config\"\n\nprint \"{configs.length} EGL configs available\"\nfor config in configs do\n\tvar attribs = config.attribs(egl_display)\n\tprint \"* caveats: {attribs.caveat}\"\n\tprint \"  conformant to: {attribs.conformant}\"\n\tprint \"  size of RGBA: {attribs.red_size} {attribs.green_size} {attribs.blue_size} {attribs.alpha_size}\"\n\tprint \"  buffer, depth, stencil: {attribs.buffer_size} {attribs.depth_size} {attribs.stencil_size}\"\nend\n\nvar config = configs.first\n\nvar format = config.attribs(egl_display).native_visual_id\n\n# TODO android part\n# Opengles1Display_midway_init(recv, format);\n\nvar surface = egl_display.create_window_surface(config, x11_window_handle, [0])\nassert surface.is_ok else print egl_display.error\n\nvar context = egl_display.create_context(config)\nassert context.is_ok else print egl_display.error\n\nvar make_current_res = egl_display.make_current(surface, surface, context)\nassert make_current_res\n\nvar width = surface.attribs(egl_display).width\nvar height = surface.attribs(egl_display).height\nprint \"Width: {width}\"\nprint \"Height: {height}\"\n\nassert egl_bind_opengl_es_api else print \"eglBingAPI failed: {egl_display.error}\"\n\n#\n## GLESv2\n#\n\nprint \"Can compile shaders? {gl_shader_compiler}\"\nassert_no_gl_error\n\nassert gl_shader_compiler else print \"Cannot compile shaders\"\n\n# gl program\nprint gl_error.to_s\nvar program = new GLProgram\nif not program.is_ok then\n\tprint \"Program is not ok: {gl_error.to_s}\\nLog:\"\n\tprint program.info_log\n\tabort\nend\nassert_no_gl_error\n\n# vertex shader\nvar vertex_shader = new GLVertexShader\nassert vertex_shader.is_ok else print \"Vertex shader is not ok: {gl_error}\"\nvertex_shader.source = \"\"\"\nattribute vec4 vPosition;   \nvoid main()                 \n{                           \n  gl_Position = vPosition;  \n}                           \"\"\"\nvertex_shader.compile\nassert vertex_shader.is_compiled else print \"Vertex shader compilation failed with: {vertex_shader.info_log} {program.info_log}\"\nassert_no_gl_error\n\n# fragment shader\nvar fragment_shader = new GLFragmentShader\nassert fragment_shader.is_ok else print \"Fragment shader is not ok: {gl_error}\"\nfragment_shader.source = \"\"\"\nprecision mediump float;\nvoid main()\n{\n\tgl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n}\n\"\"\"\nfragment_shader.compile\nassert fragment_shader.is_compiled else print \"Fragment shader compilation failed with: {fragment_shader.info_log}\"\nassert_no_gl_error\n\nprogram.attach_shader vertex_shader\nprogram.attach_shader fragment_shader\nprogram.bind_attrib_location(0, \"vPosition\")\nprogram.link\nassert program.is_linked else print \"Linking failed: {program.info_log}\"\nassert_no_gl_error\n\n# draw!\nvar vertices = [0.0, 0.5, 0.0, -0.5, -0.5, 0.0, 0.5, -0.5, 0.0]\nvar vertex_array = new VertexArray(0, 3, vertices)\nvertex_array.attrib_pointer\ngl_clear_color(0.5, 0.0, 0.5, 1.0)\nfor i in [0..10000[ do\n\tprintn \".\"\n\tassert_no_gl_error\n\tgl_viewport(0, 0, width, height)\n\tgl_clear_color_buffer\n\tprogram.use\n\tvertex_array.enable\n\tvertex_array.draw_arrays_triangles\n\tegl_display.swap_buffers(surface)\nend\n\n# delete\nprogram.delete\nvertex_shader.delete\nfragment_shader.delete\n\n#\n## EGL\n#\n# close\negl_display.make_current(new EGLSurface.none, new EGLSurface.none, new EGLContext.none)\negl_display.destroy_context(context)\negl_display.destroy_surface(surface)\n\n#\n## SDL\n#\n# close\nsdl_display.destroy\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/print_arguments.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2004-2008 Jean Privat <jean@pryen.org>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# How to print arguments of the command line.\nmodule print_arguments\n\nfor a in args do\n\tprint a\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/procedural_array.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2004-2008 Jean Privat <jean@pryen.org>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# A procedural program (without explicit class definition).\n# This program manipulates arrays of integers.\nmodule procedural_array\n\n# The sum of the elements of `a'.\n# Uses a 'for' control structure.\nfun array_sum(a: Array[Int]): Int\ndo\n\tvar sum = 0\n\tfor i in a do\n\t\tsum = sum + i\n\tend\n\treturn sum\nend\n\n# The sum of the elements of `a' (alternative version).\n# Uses a 'while' control structure.\nfun array_sum_alt(a: Array[Int]): Int\ndo\n\tvar sum = 0\n\tvar i = 0\n\twhile i < a.length do\n\t\tsum = sum + a[i]\n\t\ti = i + 1\n\tend\n\treturn sum\nend\n\n# The main part of the program.\nvar a = [10, 5, 8, 9]\nprint(array_sum(a))\nprint(array_sum_alt(a))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/socket_client.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Client sample using the Socket module which connect to the server sample.\nmodule socket_client\n\nimport socket\n\nif args.length < 2 then\n\tprint \"Usage : socket_client <host> <port>\"\n\treturn\nend\n\nvar s = new Socket.client(args[0], args[1].to_i)\nprint \"[HOST ADDRESS] : {s.address}\"\nprint \"[HOST] : {s.host}\"\nprint \"[PORT] : {s.port}\"\nprint \"Connecting ... {s.connected}\"\nif s.connected then\n\tprint \"Writing ... Hello server !\"\n\ts.write(\"Hello server !\")\n\tprint \"[Response from server] : {s.read(100)}\"\n\tprint \"Closing ...\"\n\ts.close\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/socket_server.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Server sample using the Socket module which allow client to connect\nmodule socket_server\n\nimport socket\n\nif args.is_empty then\n\tprint \"Usage : socket_server <port>\"\n\treturn\nend\n\nvar socket = new Socket.server(args[0].to_i, 1)\nprint \"[PORT] : {socket.port.to_s}\"\n\nvar clients = new Array[Socket]\nvar max = socket\nloop\n\tvar fs = new SocketObserver(true, true, true)\n\tfs.readset.set(socket)\n\n\tfor c in clients do fs.readset.set(c)\n\n\tif fs.select(max, 4, 0) == 0 then\n\t\tprint \"Error occured in select {sys.errno.strerror}\"\n\t\tbreak\n\tend\n\n\tif fs.readset.is_set(socket) then\n\t\tvar ns = socket.accept\n\t\tprint \"Accepting {ns.address} ... \"\n\t\tprint \"[Message from {ns.address}] : {ns.read(100)}\"\n\t\tns.write(\"Goodbye client.\")\n\t\tprint \"Closing {ns.address} ...\"\n\t\tns.close\n\tend\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/tmpl_composer.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\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\nimport template\n\n### Here, definition of the specific templates\n\n# The root template for composers\nclass TmplComposers\n\tsuper Template\n\n\t# Short list of composers\n\tvar composers = new Array[TmplComposer]\n\n\t# Detailled list of composers\n\tvar composer_details = new Array[TmplComposerDetail]\n\n\t# Add a composer in both lists\n\tfun add_composer(firstname, lastname: String, birth, death: Int)\n\tdo\n\t\tcomposers.add(new TmplComposer(lastname))\n\t\tcomposer_details.add(new TmplComposerDetail(firstname, lastname, birth, death))\n\tend\n\n\tredef fun rendering do\n\t\tadd \"\"\"\nCOMPOSERS\n=========\n\"\"\"\n\t\tadd_all composers\n\t\tadd \"\"\"\n\nDETAILS\n=======\n\"\"\"\n\t\tadd_all composer_details\n\tend\nend\n\n# A composer in the short list of composers\nclass TmplComposer\n\tsuper Template\n\n\t# Short name\n\tvar name: String\n\n\tinit(name: String) do self.name = name\n\n\tredef fun rendering do add \"- {name}\\n\"\nend\n\n# A composer in the detailled list of composers\nclass TmplComposerDetail\n\tsuper Template\n\n\tvar firstname: String\n\tvar lastname: String\n\tvar birth: Int\n\tvar death: Int\n\n\tinit(firstname, lastname: String, birth, death: Int) do\n\t\tself.firstname = firstname\n\t\tself.lastname = lastname\n\t\tself.birth = birth\n\t\tself.death = death\n\tend\n\n\tredef fun rendering do add \"\"\"\n\nCOMPOSER: {{{firstname}}} {{{lastname}}}\nBIRTH...: {{{birth}}}\nDEATH...: {{{death}}}\n\"\"\"\n\nend\n\n### Here a simple usage of the templates\n\nvar f = new TmplComposers\nf.add_composer(\"Johann Sebastian\", \"Bach\", 1685, 1750)\nf.add_composer(\"George Frideric\", \"Handel\", 1685, 1759)\nf.add_composer(\"Wolfgang Amadeus\", \"Mozart\", 1756, 1791)\nf.write_to(stdout)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nit/websocket_server.nit",
    "content": "# This file is part of NIT ( http://www.nitlanguage.org ).\n#\n# Copyright 2014 Lucas Bajolet <r4pass@hotmail.com>\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Sample module for a minimal chat server using Websockets on port 8088\nmodule websocket_server\n\nimport websocket\n\nvar sock = new WebSocket(8088, 1)\n\nvar msg: String\n\nif sock.listener.eof then\n\tprint sys.errno.strerror\nend\n\nsock.accept\n\nwhile not sock.listener.eof do\n\tif not sock.connected then sock.accept\n\tif sys.stdin.poll_in then\n\t\tmsg = gets\n\t\tprintn \"Received message : {msg}\"\n\t\tif msg == \"exit\" then sock.close\n\t\tif msg == \"disconnect\" then sock.disconnect_client\n\t\tsock.write(msg)\n\tend\n\tif sock.can_read(10) then\n\t\tmsg = sock.read_line\n\t\tif msg != \"\" then print msg\n\tend\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nix/nginx.nix",
    "content": "{ stdenv, fetchurl, fetchgit, openssl, zlib, pcre, libxml2, libxslt, expat\n, rtmp ? false\n, fullWebDAV ? false\n, syslog ? false\n, moreheaders ? false, ...}:\n\nlet\n  version = \"1.4.4\";\n  mainSrc = fetchurl {\n    url = \"http://nginx.org/download/nginx-${version}.tar.gz\";\n    sha256 = \"1f82845mpgmhvm151fhn2cnqjggw9w7cvsqbva9rb320wmc9m63w\";\n  };\n\n  rtmp-ext = fetchgit {\n    url = git://github.com/arut/nginx-rtmp-module.git;\n    rev = \"1cfb7aeb582789f3b15a03da5b662d1811e2a3f1\";\n    sha256 = \"03ikfd2l8mzsjwx896l07rdrw5jn7jjfdiyl572yb9jfrnk48fwi\";\n  };\n\n  dav-ext = fetchgit {\n    url = git://github.com/arut/nginx-dav-ext-module.git;\n    rev = \"54cebc1f21fc13391aae692c6cce672fa7986f9d\";\n    sha256 = \"1dvpq1fg5rslnl05z8jc39sgnvh3akam9qxfl033akpczq1bh8nq\";\n  };\n\n  syslog-ext = fetchgit {\n    url = https://github.com/yaoweibin/nginx_syslog_patch.git;\n    rev = \"165affd9741f0e30c4c8225da5e487d33832aca3\";\n    sha256 = \"14dkkafjnbapp6jnvrjg9ip46j00cr8pqc2g7374z9aj7hrvdvhs\";\n  };\n\n  moreheaders-ext = fetchgit {\n    url = https://github.com/agentzh/headers-more-nginx-module.git;\n    rev = \"refs/tags/v0.23\";\n    sha256 = \"12pbjgsxnvcf2ff2i2qdn39q4cm5czlgrng96j8ml4cgxvnbdh39\";\n  };\nin\n\nstdenv.mkDerivation rec {\n  name = \"nginx-${version}\";\n  src = mainSrc;\n\n  buildInputs = [ openssl zlib pcre libxml2 libxslt\n    ] ++ stdenv.lib.optional fullWebDAV expat;\n\n  patches = if syslog then [ \"${syslog-ext}/syslog_1.4.0.patch\" ] else [];\n\n  configureFlags = [\n    \"--with-http_ssl_module\"\n    \"--with-http_spdy_module\"\n    \"--with-http_xslt_module\"\n    \"--with-http_sub_module\"\n    \"--with-http_dav_module\"\n    \"--with-http_gzip_static_module\"\n    \"--with-http_secure_link_module\"\n    \"--with-ipv6\"\n    # Install destination problems\n    # \"--with-http_perl_module\"\n  ] ++ stdenv.lib.optional rtmp \"--add-module=${rtmp-ext}\"\n    ++ stdenv.lib.optional fullWebDAV \"--add-module=${dav-ext}\"\n    ++ stdenv.lib.optional syslog \"--add-module=${syslog-ext}\"\n    ++ stdenv.lib.optional moreheaders \"--add-module=${moreheaders-ext}\";\n\n  preConfigure = ''\n    export NIX_CFLAGS_COMPILE=\"$NIX_CFLAGS_COMPILE -I${libxml2 }/include/libxml2\"\n  '';\n\n  # escape example\n  postInstall = ''\n    mv $out/sbin $out/bin ''' ''${\n   ${ if true then ${ \"\" } else false }\n  '';\n\n  meta = {\n    description = \"A reverse proxy and lightweight webserver\";\n    maintainers = [ stdenv.lib.maintainers.raskin];\n    platforms = stdenv.lib.platforms.all;\n    inherit version;\n  };\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nu/RandomApp.nu",
    "content": ";; main.nu\n;;  Entry point for a Nu program.\n;;\n;;  Copyright (c) 2007 Tim Burks, Neon Design Technology, Inc.\n\n(load \"Nu:nu\")     ;; basics\n(load \"Nu:cocoa\")  ;; cocoa definitions\n(load \"Nu:menu\")   ;; menu generation\n(load \"randomapp\") ;; Aaron Hillegass' famous example\n\n;; define the application delegate class\n(class ApplicationDelegate is NSObject\n     (imethod (void) applicationDidFinishLaunching: (id) sender is\n          (build-menu default-application-menu \"RandomApp\")\n          (set $random ((RandomAppWindowController alloc) init))))\n\n;; install the delegate and keep a reference to it since \n;; the application won't retain it.\n((NSApplication sharedApplication) setDelegate:\n    (set delegate ((ApplicationDelegate alloc) init)))\n\n;; this makes the application window take focus when\n;;  we've started it from the terminal\n((NSApplication sharedApplication) activateIgnoringOtherApps:YES)\n\n;; run the main Cocoa event loop\n(NSApplicationMain 0 nil)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Nu/nu",
    "content": "#!/usr/bin/env nush\n(puts \"Hello\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/OCaml/Foo.ml",
    "content": "(*\n    Copyright © 2011 MLstate\n\n    This file is part of OPA.\n\n    OPA is free software: you can redistribute it and/or modify it under the\n    terms of the GNU Affero General Public License, version 3, as published by\n    the Free Software Foundation.\n\n    OPA is distributed in the hope that it will be useful, but WITHOUT ANY\n    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n    FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for\n    more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with OPA. If not, see <http://www.gnu.org/licenses/>.\n*)\n(*\n    @author Louis Gesbert\n**)\n\ntype 'a t = ('a -> unit) -> unit\n\nmodule Ops = struct\n  let (@>) f k = f k\n  let (|>) x k = k x\nend\nopen Ops\n\nmodule List = struct\n  let rec map f l k = match l with\n    | [] -> [] |> k\n    | hd::tl -> f hd @> fun hd -> map f tl @> fun tl -> hd::tl |> k\n\n  let rec fold f acc l k = match l with\n    | [] -> acc |> k\n    | hd::tl -> f acc hd @> fun acc -> fold f acc tl @> k\nend\n\nmodule Option = struct\n  let rec map f opt k = match opt with\n    | None -> None |> k\n    | Some x -> f x @> fun x -> Some x |> k\nend\n\nmodule Lazy = struct\n  type 'a t = {\n    push : (unit -> unit) -> unit;\n    mutable value : 'a option;\n    mutable waiters : ('a -> unit) list;\n    cps : ('a -> unit) -> unit;\n  }\n\n  let make push cps = {\n    push = push;\n    value = None;\n    waiters = [];\n    cps = cps;\n  }\n\n  let force l k =\n    match l.value with\n    | Some x -> x |> k\n    | None when l.waiters != [] ->\n        l.waiters <- k::l.waiters\n    | None ->\n        l.waiters <- k::l.waiters;\n        l.cps\n        @> function x ->\n          Base.List.iter (fun k -> l.push (fun () -> k x)) l.waiters;\n          l.value <- Some x;\n          l.waiters <- []\n\n  let get_state cps = cps.value\n\n  let lazy_from_val x = {\n    push = (fun _ -> ());\n    value = Some x;\n    waiters = [];\n    cps = fun k -> k x;\n  }\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/OCaml/cmdliner.ml",
    "content": "(*---------------------------------------------------------------------------\n   Copyright (c) 2011 Daniel C. Bünzli. All rights reserved.\n   Distributed under a BSD3 license, see license at the end of the file.\n   %%NAME%% release %%VERSION%%\n  ---------------------------------------------------------------------------*)\n\n(* Invalid_arg strings *)\n\nlet err_argv = \"argv array must have at least one element\"\nlet err_not_opt = \"Option argument without name\"\nlet err_not_pos = \"Positional argument with a name\"\nlet err_help s = \"term error, help requested for unknown command \" ^ s\nlet err_empty_list = \"empty list\"\n\n(* A few useful definitions. *)\n\nlet rev_compare n n' = compare n' n\nlet str = Printf.sprintf\nlet pr = Format.fprintf\nlet pr_str = Format.pp_print_string\nlet pr_char = Format.pp_print_char\nlet str_of_pp pp v = pp Format.str_formatter v; Format.flush_str_formatter ()\nlet quote s = str \"`%s'\" s\nlet alts_str ?(quoted = true) alts =\n  let quote = if quoted then quote else (fun s -> s) in\n  match alts with\n  | [] -> invalid_arg err_empty_list\n  | [a] -> (quote a)\n  | [a; b] -> str \"either %s or %s\" (quote a) (quote b)\n  | alts ->\n      let rev_alts = List.rev alts in\n      str \"one of %s or %s\"\n        (String.concat \", \" (List.rev_map quote (List.tl rev_alts)))\n        (quote (List.hd rev_alts))\n\nlet pr_white_str spaces ppf s =  (* spaces and new lines with Format's funs *)\n  let left = ref 0 and right = ref 0 and len = String.length s in\n  let flush () =\n    Format.pp_print_string ppf (String.sub s !left (!right - !left));\n    incr right; left := !right;\n  in\n  while (!right <> len) do\n    if s.[!right] = '\\n' then (flush (); Format.pp_force_newline ppf ()) else\n    if spaces && s.[!right] = ' ' then (flush (); Format.pp_print_space ppf ())\n    else incr right;\n  done;\n  if !left <> len then flush ()\n\nlet pr_text = pr_white_str true\nlet pr_lines = pr_white_str false\nlet pr_to_temp_file pr v = try\n  let exec = Filename.basename Sys.argv.(0) in\n  let file, oc = Filename.open_temp_file exec \"out\" in\n  let ppf = Format.formatter_of_out_channel oc in\n  pr ppf v; Format.pp_print_flush ppf (); close_out oc;\n  at_exit (fun () -> try Sys.remove file with Sys_error e -> ());\n  Some file\nwith Sys_error _ -> None\n\n(* Levenshtein distance, for making spelling suggestions in case of error. *)\n\nlet levenshtein_distance s t =\n  (* As found here http://rosettacode.org/wiki/Levenshtein_distance#OCaml *)\n  let minimum a b c = min a (min b c) in\n  let m = String.length s in\n  let n = String.length t in\n  (* for all i and j, d.(i).(j) will hold the Levenshtein distance between\n     the first i characters of s and the first j characters of t *)\n  let d = Array.make_matrix (m+1) (n+1) 0 in\n  for i = 0 to m do d.(i).(0) <- i done;\n  for j = 0 to n do d.(0).(j) <- j done;\n  for j = 1 to n do\n    for i = 1 to m do\n      if s.[i-1] = t.[j-1] then\n        d.(i).(j) <- d.(i-1).(j-1)  (* no operation required *)\n      else\n        d.(i).(j) <- minimum\n            (d.(i-1).(j) + 1)   (* a deletion *)\n            (d.(i).(j-1) + 1)   (* an insertion *)\n            (d.(i-1).(j-1) + 1) (* a substitution *)\n    done;\n  done;\n  d.(m).(n)\n\nlet suggest s candidates =\n  let add (min, acc) name =\n    let d = levenshtein_distance s name in\n    if d = min then min, (name :: acc) else\n    if d < min then d, [name] else\n    min, acc\n  in\n  let dist, suggs = List.fold_left add (max_int, []) candidates in\n  if dist < 3 (* suggest only if not too far *) then suggs else []\n\n(* Tries. This implementation also maps any non ambiguous prefix of a\n   key to its value. *)\n\nmodule Trie : sig\n  type 'a t\n  val empty : 'a t\n  val is_empty : 'a t -> bool\n  val add : 'a t -> string -> 'a -> 'a t\n  val find : 'a t -> string -> [ `Ok of 'a | `Ambiguous | `Not_found ]\n  val ambiguities : 'a t -> string -> string list\n  val of_list : (string * 'a) list -> 'a t\nend = struct\n  module Cmap = Map.Make (Char)                           (* character maps. *)\n  type 'a value =                         (* type for holding a bound value. *)\n    | Pre of 'a                    (* value is bound by the prefix of a key. *)\n    | Key of 'a                          (* value is bound by an entire key. *)\n    | Amb                     (* no value bound because of ambiguous prefix. *)\n    | Nil                            (* not bound (only for the empty trie). *)\n\n  type 'a t = { v : 'a value; succs : 'a t Cmap.t }\n  let empty = { v = Nil; succs = Cmap.empty }\n  let is_empty t = t = empty\n\n  (* N.B. If we replace a non-ambiguous key, it becomes ambiguous but it's\n     not important for our use. Also the following is not tail recursive but\n     the stack is bounded by key length. *)\n  let add t k d =\n    let rec aux t k len i d pre_d =\n      if i = len then { v = Key d; succs = t.succs } else\n      let v = match t.v with\n      | Amb | Pre _ -> Amb | Key _ as v -> v | Nil -> pre_d\n      in\n      let succs =\n        let t' = try Cmap.find k.[i] t.succs with Not_found -> empty in\n        Cmap.add k.[i] (aux t' k len (i + 1) d pre_d) t.succs\n      in\n      { v; succs }\n    in\n    aux t k (String.length k) 0 d (Pre d (* allocate less *))\n\n  let find_node t k =\n    let rec aux t k len i =\n      if i = len then t else\n      aux (Cmap.find k.[i] t.succs) k len (i + 1)\n    in\n    aux t k (String.length k) 0\n\n  let find t k =\n    try match (find_node t k).v with\n    | Key v | Pre v -> `Ok v | Amb -> `Ambiguous | Nil -> `Not_found\n    with Not_found -> `Not_found\n\n  let ambiguities t p =                        (* ambiguities of [p] in [t]. *)\n    try\n      let t = find_node t p in\n      match t.v with\n      | Key _ | Pre _ | Nil -> []\n      | Amb ->\n          let add_char s c = s ^ (String.make 1 c) in\n          let rem_char s = String.sub s 0 ((String.length s) - 1) in\n          let to_list m = Cmap.fold (fun k t acc -> (k,t) :: acc) m [] in\n          let rec aux acc p = function\n          | ((c, t) :: succs) :: rest ->\n              let p' = add_char p c in\n              let acc' = match t.v with\n              | Pre _ | Amb -> acc\n              | Key _ -> (p' :: acc)\n              | Nil -> assert false\n              in\n              aux acc' p' ((to_list t.succs) :: succs :: rest)\n          | [] :: [] -> acc\n          | [] :: rest -> aux acc (rem_char p) rest\n          | [] -> assert false\n          in\n          aux [] p (to_list t.succs :: [])\n    with Not_found -> []\n\n  let of_list l = List.fold_left (fun t (s, v) -> add t s v) empty l\nend\n\n(* The following types keep untyped information about arguments and\n   terms. This data is used to parse the command line, report errors\n   and format man page information. *)\n\ntype absence =        (* what happens if the argument is absent from the cl. *)\n  | Error                                           (* an error is reported. *)\n  | Val of string Lazy.t         (* if <> \"\", takes the given default value. *)\n\ntype opt_kind =                              (* kinds of optional arguments. *)\n  | Flag                                      (* just a flag, without value. *)\n  | Opt                                                (* value is required. *)\n  | Opt_vopt of string     (* option value is optional, takes given default. *)\n\ntype pos_kind =                            (* kinds of positional arguments. *)\n  | All                                         (* all positional arguments. *)\n  | Nth of bool * int                                  (* specific position. *)\n  | Left of bool * int                (* all args on the left of a position. *)\n  | Right of bool * int              (* all args on the right of a position. *)\n\ntype arg_info =                (* information about a command line argument. *)\n    { id : int;                               (* unique id for the argument. *)\n      absent : absence;                              (* behaviour if absent. *)\n      doc : string;                                                 (* help. *)\n      docv : string;              (* variable name for the argument in help. *)\n      docs : string;                  (* title of help section where listed. *)\n      p_kind : pos_kind;                             (* positional arg kind. *)\n      o_kind : opt_kind;                               (* optional arg kind. *)\n      o_names : string list;                        (* names (for opt args). *)\n      o_all : bool; }                          (* repeatable (for opt args). *)\n\nlet arg_id =        (* thread-safe UIDs, Oo.id (object end) was used before. *)\n  let c = ref 0 in\n  fun () ->\n    let id = !c in\n    incr c; if id > !c then assert false (* too many ids *) else id\n\nlet is_opt a = a.o_names <> []\nlet is_pos a = a.o_names = []\n\nmodule Amap = Map.Make                                     (* arg info maps. *)\n    (struct type t = arg_info let compare a a' = compare a.id a'.id end)\n\ntype arg =        (* unconverted argument data as found on the command line. *)\n  | O of (int * string * (string option)) list (* (pos, name, value) of opt. *)\n  | P of string list\n\ntype cmdline = arg Amap.t      (* command line, maps arg_infos to arg value. *)\n\ntype man_block = [                                 (* block of manpage text. *)\n  | `S of string | `P of string | `I of string * string | `Noblank ]\n\ntype term_info =\n  { name : string;                                    (* name of the term. *)\n    version : string option;                   (* version (for --version). *)\n    tdoc : string;                        (* one line description of term. *)\n    tdocs : string;       (* title of man section where listed (commands). *)\n    sdocs : string;    (* standard options, title of section where listed. *)\n    man : man_block list; }                              (* man page text. *)\n\ntype eval_info =                (* information about the evaluation context. *)\n  { term : term_info * arg_info list;             (* term being evaluated. *)\n    main : term_info * arg_info list;                        (* main term. *)\n    choices : (term_info * arg_info list) list}       (* all term choices. *)\n\nlet eval_kind ei =                       (* evaluation with multiple terms ? *)\n  if ei.choices = [] then `Simple else\n  if (fst ei.term) == (fst ei.main) then `M_main else `M_choice\n\nmodule Manpage = struct\n  type title = string * int * string * string * string\n  type block = man_block\n  type t = title * block list\n\n  let p_indent = 7                                  (* paragraph indentation. *)\n  let l_indent = 4                                      (* label indentation. *)\n  let escape subst esc buf s =\n    let subst s =\n      let len = String.length s in\n      if not (len > 1 && s.[1] = ',') then (subst s) else\n      if len = 2 then \"\" else\n      esc s.[0] (String.sub s 2 (len - 2))\n    in\n    Buffer.clear buf; Buffer.add_substitute buf subst s;\n    let s = Buffer.contents buf in (* twice for $(i,$(mname)). *)\n    Buffer.clear buf; Buffer.add_substitute buf subst s;\n    Buffer.contents buf\n\n  let pr_tokens ?(groff = false) ppf s =\n    let is_space = function ' ' | '\\n' | '\\r' | '\\t' -> true | _ -> false in\n    let len = String.length s in\n    let i = ref 0 in\n    try while (true) do\n        while (!i < len && is_space s.[!i]) do incr i done;\n        let start = !i in\n        if start = len then raise Exit;\n        while (!i < len && not (is_space s.[!i]) && not (s.[!i] = '-')) do\n          incr i\n        done;\n        pr_str ppf (String.sub s start (!i - start));\n        if !i = len then raise Exit;\n        if s.[!i] = '-' then\n          (incr i; if groff then pr_str ppf \"\\\\-\" else pr_char ppf '-');\n        if (!i < len && is_space s.[!i]) then\n          (if groff then pr_char ppf ' ' else Format.pp_print_space ppf ())\n      done with Exit -> ()\n\n  (* Plain text output *)\n\n  let plain_esc c s = match c with 'g' -> \"\" (* groff specific *) | _ ->  s\n  let pr_indent ppf c = for i = 1 to c do pr_char ppf ' ' done\n  let pr_plain_blocks subst ppf ts =\n    let buf = Buffer.create 1024 in\n    let escape t = escape subst plain_esc buf t in\n    let pr_tokens ppf t = pr_tokens ppf (escape t) in\n    let rec aux = function\n    | [] -> ()\n    | t :: ts ->\n        begin match t with\n        | `Noblank -> ()\n        | `P s -> pr ppf \"%a@[%a@]@,\" pr_indent p_indent pr_tokens s\n        | `S s -> pr ppf \"@[%a@]\" pr_tokens s\n        | `I (label, s) ->\n            let label = escape label in\n            let ll = String.length label in\n            pr ppf \"@[%a@[%a@]\" pr_indent p_indent pr_tokens label;\n            if s = \"\" then () else\n            if ll < l_indent then\n              pr ppf \"%a@[%a@]@]@,\" pr_indent (l_indent - ll) pr_tokens s\n            else\n            pr ppf \"@\\n%a@[%a@]@]@,\"\n              pr_indent (p_indent + l_indent) pr_tokens s\n        end;\n        begin match ts with\n        | `Noblank :: ts -> aux ts\n        | ts -> Format.pp_print_cut ppf (); aux ts\n        end\n    in\n    aux ts\n\n  let pr_plain_page subst ppf (_, text) =\n    pr ppf \"@[<v>%a@]\" (pr_plain_blocks subst) text\n\n  (* Groff output *)\n\n  let groff_esc c s = match c with\n  | 'i' -> (str \"\\\\fI%s\\\\fR\" s)\n  | 'b' -> (str \"\\\\fB%s\\\\fR\" s)\n  | 'p' -> \"\" (* plain text specific *)\n  | _ -> s\n\n  let pr_groff_blocks subst ppf text =\n    let buf = Buffer.create 1024 in\n    let escape t = escape subst groff_esc buf t in\n    let pr_tokens ppf t = pr_tokens ~groff:true ppf (escape t) in\n    let pr_block = function\n    | `P s -> pr ppf \"@\\n.P@\\n%a\" pr_tokens s\n    | `S s -> pr ppf \"@\\n.SH %a\" pr_tokens s\n    | `Noblank -> pr ppf \"@\\n.sp -1\"\n    | `I (l, s) -> pr ppf \"@\\n.TP 4@\\n%a@\\n%a\" pr_tokens l pr_tokens s\n    in\n    List.iter pr_block text\n\n  let pr_groff_page subst ppf ((n, s, a1, a2, a3), t) =\n    pr ppf \".\\\\\\\" Pipe this output to groff -man -Tutf8 | less@\\n\\\n            .\\\\\\\"@\\n\\\n            .TH \\\"%s\\\" %d \\\"%s\\\" \\\"%s\\\" \\\"%s\\\"@\\n\\\n            .\\\\\\\" Disable hyphenantion and ragged-right@\\n\\\n            .nh@\\n\\\n      .ad l\\\n      %a@?\"\n      n s a1 a2 a3 (pr_groff_blocks subst) t\n\n  (* Printing to a pager *)\n\n  let find_cmd cmds =\n    let test, null = match Sys.os_type with\n    | \"Win32\" -> \"where\", \" NUL\"\n    | _ -> \"type\", \"/dev/null\"\n    in\n    let cmd c = Sys.command (str \"%s %s 1>%s 2>%s\" test c null null) = 0 in\n    try Some (List.find cmd cmds) with Not_found -> None\n\n  let pr_to_pager print ppf v =\n    let pager =\n      let cmds = [\"less\"; \"more\"] in\n      let cmds = try (Sys.getenv \"PAGER\") :: cmds with Not_found -> cmds in\n      let cmds = try (Sys.getenv \"MANPAGER\") :: cmds with Not_found -> cmds in\n      find_cmd cmds\n    in\n    match pager with\n    | None -> print `Plain ppf v\n    | Some pager ->\n        let cmd = match (find_cmd [\"groff\"; \"nroff\"]) with\n        | None ->\n            begin match pr_to_temp_file (print `Plain) v with\n            | None -> None\n            | Some f -> Some (str \"%s < %s\" pager f)\n            end\n        | Some c ->\n            begin match pr_to_temp_file (print `Groff) v with\n            | None -> None\n            | Some f ->\n                (* TODO use -Tutf8, but annoyingly maps U+002D to U+2212. *)\n                let xroff = if c = \"groff\" then c ^ \" -Tascii -P-c\" else c in\n                Some (str \"%s -man < %s | %s\" xroff f pager)\n            end\n        in\n        match cmd with\n        | None -> print `Plain ppf v\n        | Some cmd -> if (Sys.command cmd) <> 0 then print `Plain ppf v\n\n  let rec print ?(subst = fun x -> x) fmt ppf page = match fmt with\n  | `Pager -> pr_to_pager (print ~subst) ppf page\n  | `Plain -> pr_plain_page subst ppf page\n  | `Groff -> pr_groff_page subst ppf page\nend\n\nmodule Help = struct\n  let invocation ?(sep = ' ') ei = match eval_kind ei with\n  | `Simple | `M_main -> (fst ei.main).name\n  | `M_choice -> str \"%s%c%s\" (fst ei.main).name sep (fst ei.term).name\n\n  let title ei =\n    let prog = String.capitalize (fst ei.main).name in\n    let name = String.uppercase (invocation ~sep:'-' ei) in\n    let left_footer = prog ^ match (fst ei.main).version with\n      | None -> \"\" | Some v -> str \" %s\" v\n    in\n    let center_header = str \"%s Manual\" prog in\n    name, 1, \"\", left_footer, center_header\n\n  let name_section ei =\n    let tdoc d = if d = \"\" then \"\" else (str \" - %s\" d) in\n    [`S \"NAME\"; `P (str \"%s%s\" (invocation ~sep:'-' ei)\n                      (tdoc (fst ei.term).tdoc)); ]\n\n  let synopsis ei = match eval_kind ei with\n  | `M_main -> str \"$(b,%s) $(i,COMMAND) ...\" (invocation ei)\n  | `Simple | `M_choice ->\n      let rev_cmp (p, _) (p', _) = match p', p with        (* best effort. *)\n      | p, All -> -1 | All, p -> 1\n      | Left _, Right _ -> -1 | Right _, Left _ -> 1\n      | Left (false, k), Nth (false, k')\n      | Nth (false, k), Nth (false, k')\n      | Nth (false, k), Right (false, k') -> if k <= k' then -1 else 1\n      | Nth (false, k), Left (false, k')\n      | Right (false, k), Nth (false, k') -> if k >= k' then 1 else -1\n      | Left (true, k), Nth (true, k')\n      | Nth (true, k), Nth (true, k')\n      | Nth (true, k), Right (true, k') -> if k >= k' then -1 else 1\n      | Nth (true, k), Left (true, k')\n      | Right (true, k), Nth (true, k') -> if k <= k' then 1 else -1\n      | p, p' -> compare p p'\n      in\n      let rec format_pos acc = function\n      | a :: al ->\n          if is_opt a then format_pos acc al else\n          let v = if a.docv = \"\" then \"$(i,ARG)\" else str \"$(i,%s)\" a.docv in\n          let v = if a.absent = Error then str \"%s\" v else str \"[%s]\" v in\n          let v = v ^ match a.p_kind with Nth _ -> \"\" | _ -> \"...\" in\n          format_pos ((a.p_kind, v) :: acc) al\n      | [] -> acc\n      in\n      let args = List.sort rev_cmp (format_pos [] (snd ei.term)) in\n      let args = String.concat \" \" (List.rev_map snd args) in\n      str \"$(b,%s) [$(i,OPTION)]... %s\" (invocation ei) args\n\n  let get_synopsis_section ei =\n    let rec extract_synopsis syn = function\n    | `S _ :: _ as man -> List.rev syn, man\n    |  block :: rest -> extract_synopsis (block :: syn) rest\n    | [] -> List.rev syn, []\n    in\n    match (fst ei.term).man with\n    | `S \"SYNOPSIS\" as s :: rest -> extract_synopsis [s] rest (* user-defined *)\n    | man -> [ `S \"SYNOPSIS\"; `P (synopsis ei); ], man           (* automatic *)\n\n  let make_arg_label a =\n    if is_pos a then str \"$(i,%s)\" a.docv else\n    let fmt_name var = match a.o_kind with\n    | Flag -> fun n -> str \"$(b,%s)\" n\n    | Opt ->\n        fun n ->\n          if String.length n > 2 then str \"$(b,%s)=$(i,%s)\" n var else\n          str \"$(b,%s) $(i,%s)\" n var\n    | Opt_vopt _ ->\n        fun n ->\n          if String.length n > 2 then str \"$(b,%s)[=$(i,%s)]\" n var else\n          str \"$(b,%s) [$(i,%s)]\" n var\n    in\n    let var = if a.docv = \"\" then \"VAL\" else a.docv in\n    let names = List.sort compare a.o_names in\n    let s = String.concat \", \" (List.rev_map (fmt_name var) names) in\n    s\n\n  let make_arg_items ei =\n    let buf = Buffer.create 200 in\n    let subst_docv docv d =\n      let subst = function \"docv\" -> str \"$(i,%s)\" docv | s -> str \"$(%s)\" s in\n      Buffer.clear buf; Buffer.add_substitute buf subst d; Buffer.contents buf\n    in\n    let rev_cmp a' a =\n      let c = compare a.docs a'.docs in\n      if c <> 0 then c else\n      match is_opt a, is_opt a' with\n      | true, true ->\n          let key names =\n            let k = String.lowercase (List.hd (List.sort rev_compare names)) in\n            if k.[1] = '-' then String.sub k 1 (String.length k - 1) else k\n          in\n          compare (key a.o_names) (key a'.o_names)\n      | false, false ->\n          compare (String.lowercase a.docv) (String.lowercase a'.docv)\n      | true, false -> -1\n      | false, true -> 1\n    in\n    let format a =\n      let absent = match a.absent with\n      | Error -> \"\"\n      | Val v -> match Lazy.force v with \"\" -> \"\" | v -> str \"absent=%s\" v\n      in\n      let optvopt = match a.o_kind with\n      | Opt_vopt v -> str \"default=%s\" v\n      | _ -> \"\"\n      in\n      let argvdoc = match absent, optvopt with\n      | \"\", \"\" -> \"\"\n      | s, \"\" | \"\", s -> str \" (%s)\" s\n      | s, s' -> str \" (%s, %s)\" s s'\n      in\n      (a.docs, `I (make_arg_label a ^ argvdoc, (subst_docv a.docv a.doc)))\n    in\n    let is_arg_item a = not (is_pos a && (a.docv = \"\" || a.doc = \"\")) in\n    let l = List.sort rev_cmp (List.filter is_arg_item (snd ei.term)) in\n    List.rev_map format l\n\n  let make_cmd_items ei = match eval_kind ei with\n  | `Simple | `M_choice -> []\n  | `M_main ->\n      let add_cmd acc (ti, _) =\n        (ti.tdocs, `I ((str \"$(b,%s)\" ti.name), ti.tdoc)) :: acc\n      in\n      List.sort rev_compare (List.fold_left add_cmd [] ei.choices)\n\n  let text ei =                  (* man that code is particulary unreadable. *)\n    let rec merge_items acc to_insert mark il = function\n    | `S s as sec :: ts ->\n        let acc = List.rev_append to_insert acc in\n        let acc = if mark then sec :: `Orphan_mark :: acc else sec :: acc in\n        let to_insert, il = List.partition (fun (n, _) -> n = s) il in\n        let to_insert = List.rev_map (fun (_, i) -> i) to_insert in\n        let to_insert = (to_insert :> [ `Orphan_mark | Manpage.block] list) in\n        merge_items acc to_insert (s = \"DESCRIPTION\") il ts\n    | t :: ts ->\n        let t = (t :> [`Orphan_mark | Manpage.block]) in\n        merge_items (t :: acc) to_insert mark il ts\n    | [] ->\n        let acc = List.rev_append to_insert acc in\n        (if mark then `Orphan_mark :: acc else acc), il\n    in\n    let rec merge_orphans acc orphans = function\n    | `Orphan_mark :: ts ->\n        let rec merge acc s = function\n        | [] -> (`S s) :: acc\n        | (s', i) :: ss ->\n            let i = (i :> Manpage.block) in\n            if s = s' then merge (i :: acc) s ss else\n            merge (i :: (`S s) :: acc) s' ss\n        in\n        let acc = match orphans with\n        | [] -> acc | (s, _) :: _ -> merge acc s orphans\n        in\n        merge_orphans acc [] ts\n    | (#Manpage.block as e) :: ts -> merge_orphans (e :: acc) orphans ts\n    | [] -> acc\n    in\n    let cmds = make_cmd_items ei in\n    let args = make_arg_items ei in\n    let cmp (s, _) (s', _) = compare s s' in\n    let items = List.rev (List.stable_sort cmp (List.rev_append cmds args)) in\n    let synopsis, man = get_synopsis_section ei in\n    let rev_text, orphans =\n      merge_items [`Orphan_mark] [] false items man\n    in\n    synopsis @ merge_orphans [] orphans rev_text\n\n  let ei_subst ei = function\n  | \"tname\" -> (fst ei.term).name\n  | \"mname\" -> (fst ei.main).name\n  | s -> s\n\n  let man ei =\n    title ei, (name_section ei) @ (text ei)\n\n  let print fmt ppf ei = Manpage.print ~subst:(ei_subst ei) fmt ppf (man ei)\n  let pr_synopsis ppf ei =\n    pr ppf \"@[%s@]\"\n      (Manpage.escape (ei_subst ei)\n         Manpage.plain_esc (Buffer.create 100) (synopsis ei))\n\n  let pr_version ppf ei = match (fst ei.main).version with\n  | None -> assert false\n  | Some v -> pr ppf \"@[%a@]@.\" pr_text v\nend\n\n(* Errors for the command line user *)\n\nmodule Err = struct\n  let invalid kind s exp = str \"invalid %s %s, %s\" kind (quote s) exp\n  let invalid_val = invalid \"value\"\n  let no kind s = str \"no %s %s\" (quote s) kind\n  let not_dir s = str \"%s is not a directory\" (quote s)\n  let is_dir s = str \"%s is a directory\" (quote s)\n  let element kind s exp = str \"invalid element in %s (`%s'): %s\" kind s exp\n  let sep_miss sep s = invalid_val s (str \"missing a `%c' separator\" sep)\n  let unknown kind ?(hints = []) v =\n    let did_you_mean s = str \", did you mean %s ?\" s in\n    let hints = match hints with [] -> \".\" | hs -> did_you_mean (alts_str hs) in\n    str \"unknown %s %s%s\" kind (quote v) hints\n\n  let ambiguous kind s ambs =\n    str \"%s %s ambiguous and could be %s\" kind (quote s) (alts_str ambs)\n\n  let pos_excess excess =\n    str \"too many arguments, don't know what to do with %s\"\n      (String.concat \", \" (List.map quote excess))\n\n  let flag_value f v =\n    str \"option %s is a flag, it cannot take the argument %s\"\n      (quote f) (quote v)\n\n  let opt_value_missing f = str \"option %s needs an argument\" (quote f)\n  let opt_parse_value f e = str \"option %s: %s\" (quote f) e\n  let opt_repeated f f' =\n    if f = f' then str \"option %s cannot be repeated\" (quote f) else\n    str \"options %s and %s cannot be present at the same time\" (quote f)\n      (quote f')\n\n  let pos_parse_value a e =\n    if a.docv = \"\" then e else match a.p_kind with\n    | Nth _ -> str \"%s argument: %s\" a.docv e\n    | _ -> str \"%s... arguments: %s\" a.docv e\n\n  let arg_missing a =\n    if is_opt a then\n      let rec long_name = function\n      | n :: l -> if (String.length n) > 2 || l = [] then n else long_name l\n      | [] -> assert false\n      in\n      str \"required option %s is missing\" (long_name a.o_names)\n    else\n    if a.docv = \"\" then str \"a required argument is missing\" else\n    str \"required argument %s is missing\" a.docv\n\n  (* Error printers *)\n\n  let print ppf ei e = pr ppf \"%s: @[%a@]@.\" (fst ei.main).name pr_text e\n  let pr_backtrace err ei e bt =\n    let bt =\n      let len = String.length bt in\n      if len > 0 then String.sub bt 0 (len - 1) (* remove final '\\n' *) else bt\n    in\n    pr err\n      \"%s: @[internal error, uncaught exception:@\\n%a@]@.\"\n      (fst ei.main).name pr_lines (str \"%s\\n%s\" (Printexc.to_string e) bt)\n\n  let pr_try_help ppf ei =\n    let exec = Help.invocation ei in\n    let main = (fst ei.main).name in\n    if exec = main then\n      pr ppf \"@[<2>Try `%s --help' for more information.@]\" exec\n    else\n    pr ppf \"@[<2>Try `%s --help' or `%s --help' for more information.@]\"\n      exec main\n\n  let pr_usage ppf ei e =\n    pr ppf \"@[<v>%s: @[%a@]@,@[Usage: @[%a@]@]@,%a@]@.\"\n      (fst ei.main).name pr_text e Help.pr_synopsis ei pr_try_help ei\nend\n\n(* Command lines. A command line stores pre-parsed information about\n   the command line's arguments in a more structured way. Given the\n   [arg_info] values mentionned in a term and Sys.argv (whithout exec\n   name) we parse the command line into a map of [arg_info] values to\n   [arg] values. This map is used by the term's closures to retrieve\n   and convert command line arguments (see the Arg module). *)\n\nmodule Cmdline :sig\n  exception Error of string\n  val choose_term : term_info -> (term_info * 'a) list -> string list ->\n    term_info * string list\n  val create : ?peek_opts:bool -> arg_info list -> string list -> cmdline\n  val opt_arg : cmdline -> arg_info -> (int * string * (string option)) list\n  val pos_arg : cmdline -> arg_info -> string list\nend = struct\n  exception Error of string\n\n  let opt_arg cl a = match try Amap.find a cl with Not_found -> assert false\n  with O l -> l | _ -> assert false\n\n  let pos_arg cl a = match try Amap.find a cl with Not_found -> assert false\n  with P l -> l | _ -> assert false\n\n  let choose_term ti choices = function\n  | [] -> ti, []\n  | maybe :: args' as args ->\n      if String.length maybe > 1 && maybe.[0] = '-' then ti, args else\n      let index =\n        let add acc (choice, _) = Trie.add acc choice.name choice in\n        List.fold_left add Trie.empty choices\n      in\n      match Trie.find index maybe with\n      | `Ok choice -> choice, args'\n      | `Not_found ->\n        let all = Trie.ambiguities index \"\" in\n        let hints = suggest maybe all in\n        raise (Error (Err.unknown \"command\" ~hints maybe))\n      | `Ambiguous ->\n          let ambs = List.sort compare (Trie.ambiguities index maybe) in\n          raise (Error (Err.ambiguous \"command\" maybe ambs))\n\n  let arg_info_indexes al =\n    (* from [al] returns a trie mapping the names of optional arguments to\n       their arg_info, a list with all arg_info for positional arguments and\n       a cmdline mapping each arg_info to an empty [arg]. *)\n    let rec aux opti posi cl = function\n    | a :: l ->\n        if is_pos a then aux opti (a :: posi) (Amap.add a (P []) cl) l else\n        let add t name = Trie.add t name a in\n        aux (List.fold_left add opti a.o_names) posi (Amap.add a (O []) cl) l\n    | [] -> opti, posi, cl\n    in\n    aux Trie.empty [] Amap.empty al\n\n  let parse_opt_arg s =          (* (name,value) of opt arg, assert len > 1. *)\n    let l = String.length s in\n    if s.[1] <> '-' then\n      if l = 2 then s, None else\n      String.sub s 0 2, Some (String.sub s 2 (l - 2))\n    else try\n      let i = String.index s '=' in\n      String.sub s 0 i, Some (String.sub s (i + 1) (l - i - 1))\n    with Not_found -> s, None\n\n  let parse_args ~peek_opts opti cl args =\n    (* returns an updated [cl] cmdline according to the options found in [args]\n       with the trie index [opti]. Positional arguments are returned in order\n       in a list. *)\n    let rec aux k opti cl pargs = function\n    | [] -> cl, (List.rev pargs)\n    | \"--\" :: args -> cl, (List.rev_append pargs args)\n    | s :: args ->\n        let is_opt s = String.length s > 1 && s.[0] = '-' in\n        let is_short_opt s = String.length s = 2 && s.[0] = '-' in\n        if not (is_opt s) then aux (k+1) opti cl (s :: pargs) args else\n        let name, value = parse_opt_arg s in\n        match Trie.find opti name with\n        | `Ok a ->\n            let value, args = match value, a.o_kind with\n            | Some v, Flag when is_short_opt name -> None, (\"-\" ^ v) :: args\n            | Some v, _ -> value, args\n            | None, Flag -> value, args\n            | None, _ ->\n                match args with\n                | v :: rest -> if is_opt v then None, args else Some v, rest\n                | [] -> None, args\n            in\n            let arg = O ((k, name, value) :: opt_arg cl a) in\n            aux (k+1) opti (Amap.add a arg cl) pargs args\n        | `Not_found when peek_opts -> aux (k+1) opti cl pargs args (* skip *)\n        | `Not_found ->\n            let hints =\n              if String.length s <= 2 then [] else\n              let short_opt, long_opt =\n                if s.[1] <> '-'\n                then s, Printf.sprintf \"-%s\" s\n                else String.sub s 1 (String.length s - 1), s\n              in\n              let short_opt, _ = parse_opt_arg short_opt in\n              let long_opt, _ = parse_opt_arg long_opt in\n              let all = Trie.ambiguities opti \"-\" in\n              match List.mem short_opt all, suggest long_opt all with\n              | false, [] -> []\n              | false, l -> l\n              | true, [] -> [short_opt]\n              | true, l -> if List.mem short_opt l then l else short_opt :: l\n            in\n            raise (Error (Err.unknown \"option\" ~hints name))\n        | `Ambiguous ->\n            let ambs = List.sort compare (Trie.ambiguities opti name) in\n            raise (Error (Err.ambiguous \"option\" name ambs))\n    in\n    aux 0 opti cl [] args\n\n  let process_pos_args posi cl pargs =\n    (* returns an updated [cl] cmdline in which each positional arg mentionned\n       in the list index posi, is given a value according the list\n       of positional arguments values [pargs]. *)\n    if pargs = [] then cl else\n    let rec take n acc l =\n      if n = 0 then List.rev acc else\n      take (n - 1) (List.hd l :: acc) (List.tl l)\n    in\n    let rec aux pargs last cl max_spec = function\n    | a :: al ->\n        let arg, max_spec = match a.p_kind with\n        | All -> P pargs, last\n        | Nth (rev, k) ->\n            let k = if rev then last - k else k in\n            let max_spec = max k max_spec in\n            if k < 0 || k > last then P [], max_spec else\n            P ([List.nth pargs k]), max_spec\n        | Left (rev, k) ->\n            let k = if rev then last - k else k in\n            let max_spec = max k max_spec in\n            if k <= 0 || k > last then P [], max_spec else\n            P (take k [] pargs), max_spec\n        | Right (rev, k) ->\n            let k = if rev then last - k else k in\n            if k < 0 || k >= last then P [], last else\n            P (List.rev (take (last - k) [] (List.rev pargs))), last\n        in\n        aux pargs last (Amap.add a arg cl) max_spec al\n    | [] -> cl, max_spec\n    in\n    let last = List.length pargs - 1 in\n    let cl, max_spec = aux pargs last cl (-1) posi in\n    if last <= max_spec then cl else\n    let excess = List.rev (take (last - max_spec) [] (List.rev pargs)) in\n    raise (Error (Err.pos_excess excess))\n\n  let create ?(peek_opts = false) al args =\n    let opti, posi, cl = arg_info_indexes al in\n    let cl, pargs = parse_args ~peek_opts opti cl args in\n    if peek_opts then cl (* skip positional arguments *) else\n    process_pos_args posi cl pargs\nend\n\nmodule Arg = struct\n  type 'a parser = string -> [ `Ok of 'a | `Error of string ]\n  type 'a printer = Format.formatter -> 'a -> unit\n  type 'a converter = 'a parser * 'a printer\n  type 'a arg_converter = (eval_info -> cmdline -> 'a)\n  type 'a t = arg_info list * 'a arg_converter\n  type info = arg_info\n\n  let ( & ) f x = f x\n  let parse_error e = raise (Cmdline.Error e)\n  let some ?(none = \"\") (parse, print) =\n    (fun s -> match parse s with `Ok v -> `Ok (Some v) | `Error _ as e -> e),\n    (fun ppf v -> match v with None -> pr_str ppf none| Some v -> print ppf v)\n\n  let info ?docs ?(docv = \"\") ?(doc = \"\") names =\n    let dash n = if String.length n = 1 then \"-\" ^ n else \"--\" ^ n in\n    let docs = match docs with\n    | None -> if names = [] then \"ARGUMENTS\" else \"OPTIONS\"\n    | Some s -> s\n    in\n    { id = arg_id (); absent = Val (Lazy.from_val \"\");\n      doc = doc; docv = docv; docs = docs;\n      p_kind = All; o_kind = Flag; o_names = List.rev_map dash names;\n      o_all = false; }\n\n  let flag a =\n    if is_pos a then invalid_arg err_not_opt else\n    let convert _ cl = match Cmdline.opt_arg cl a with\n    | [] -> false\n    | [_, _, None] -> true\n    | [_, f, Some v] -> parse_error (Err.flag_value f v)\n    | (_, f, _) :: (_ ,g, _) :: _  -> parse_error (Err.opt_repeated f g)\n    in\n    [a], convert\n\n  let flag_all a =\n    if is_pos a then invalid_arg err_not_opt else\n    let a = { a with o_all = true } in\n    let convert _ cl = match Cmdline.opt_arg cl a with\n    | [] -> []\n    | l ->\n        let truth (_, f, v) = match v with\n        | None -> true | Some v -> parse_error (Err.flag_value f v)\n  in\n  List.rev_map truth l\n    in\n    [a], convert\n\n  let vflag v l =\n    let convert _ cl =\n      let rec aux fv = function\n      | (v, a) :: rest ->\n          begin match Cmdline.opt_arg cl a with\n          | [] -> aux fv rest\n          | [_, f, None] ->\n              begin match fv with\n              | None -> aux (Some (f, v)) rest\n              | Some (g, _) -> parse_error (Err.opt_repeated g f)\n              end\n          | [_, f, Some v] -> parse_error (Err.flag_value f v)\n          | (_, f, _) :: (_, g, _) :: _ -> parse_error (Err.opt_repeated g f)\n          end\n      | [] -> match fv with None -> v | Some (_, v) -> v\n      in\n      aux None l\n    in\n    let flag (_, a) = if is_pos a then invalid_arg err_not_opt else a in\n    List.rev_map flag l, convert\n\n  let vflag_all v l =\n    let convert _ cl =\n      let rec aux acc = function\n      | (fv, a) :: rest ->\n          begin match Cmdline.opt_arg cl a with\n          | [] -> aux acc rest\n          | l ->\n              let fval (k, f, v) = match v with\n              | None -> (k, fv) | Some v -> parse_error (Err.flag_value f v)\n              in\n              aux (List.rev_append (List.rev_map fval l) acc) rest\n          end\n      | [] ->\n          if acc = [] then v else List.rev_map snd (List.sort rev_compare acc)\n      in\n      aux [] l\n    in\n    let flag (_, a) =\n      if is_pos a then invalid_arg err_not_opt else { a with o_all = true }\n    in\n    List.rev_map flag l, convert\n\n  let parse_opt_value parse f v = match parse v with\n  | `Ok v -> v | `Error e -> parse_error (Err.opt_parse_value f e)\n\n  let opt ?vopt (parse, print) v a =\n    if is_pos a then invalid_arg err_not_opt else\n    let a = { a with absent = Val (lazy (str_of_pp print v));\n                     o_kind = match vopt with\n                     | None -> Opt | Some dv -> Opt_vopt (str_of_pp print dv) }\n    in\n    let convert _ cl = match Cmdline.opt_arg cl a with\n    | [] -> v\n    | [_, f, Some v] -> parse_opt_value parse f v\n    | [_, f, None] ->\n        begin match vopt with\n        | None -> parse_error (Err.opt_value_missing f)\n        | Some optv -> optv\n        end\n    | (_, f, _) :: (_, g, _) :: _ -> parse_error (Err.opt_repeated g f)\n    in\n    [a], convert\n\n  let opt_all ?vopt (parse, print) v a =\n    if is_pos a then invalid_arg err_not_opt else\n    let a = { a with absent = Val (Lazy.from_val \"\"); o_all = true;\n                     o_kind = match vopt with\n                     | None -> Opt | Some dv -> Opt_vopt (str_of_pp print dv) }\n    in\n    let convert _ cl = match Cmdline.opt_arg cl a with\n    | [] -> v\n    | l ->\n        let parse (k, f, v) = match v with\n        | Some v -> (k, parse_opt_value parse f v)\n        | None -> match vopt with\n        | None -> parse_error (Err.opt_value_missing f)\n        | Some dv -> (k, dv)\n        in\n        List.rev_map snd (List.sort rev_compare (List.rev_map parse l))\n    in\n    [a], convert\n\n  (* Positional arguments *)\n\n  let parse_pos_value parse a v = match parse v with\n  | `Ok v -> v | `Error e -> parse_error (Err.pos_parse_value a e)\n\n  let pos ?(rev = false) k (parse, print) v a =\n    if is_opt a then invalid_arg err_not_pos else\n    let a = { a with p_kind = Nth (rev, k);\n                     absent = Val (Lazy.from_val (str_of_pp print v)) }\n    in\n    let convert _ cl = match Cmdline.pos_arg cl a with\n    | [] -> v\n    | [v] -> parse_pos_value parse a v\n    | _ -> assert false\n    in\n    [a], convert\n\n  let pos_list kind (parse, _) v a =\n    if is_opt a then invalid_arg err_not_pos else\n    let a = { a with p_kind = kind } in\n    let convert _ cl = match Cmdline.pos_arg cl a with\n    | [] -> v\n    | l -> List.rev (List.rev_map (parse_pos_value parse a) l)\n    in\n    [a], convert\n\n  let pos_all c v a = pos_list All c v a\n  let pos_left ?(rev = false) k = pos_list (Left (rev, k))\n  let pos_right ?(rev = false) k = pos_list (Right (rev, k))\n\n  (* Arguments as terms *)\n\n  let absent_error al = List.rev_map (fun a -> { a with absent = Error }) al\n  let value a = a\n  let required (al, convert) =\n    let al = absent_error al in\n    let convert ei cl = match convert ei cl with\n    | Some v -> v\n    | None -> parse_error (Err.arg_missing (List.hd al))\n    in\n    al, convert\n\n  let non_empty (al, convert) =\n    let al = absent_error al in\n    let convert ei cl = match convert ei cl with\n    | [] -> parse_error (Err.arg_missing (List.hd al))\n    | l -> l\n    in\n    al, convert\n\n  let last (al, convert) =\n    let convert ei cl = match convert ei cl with\n    | [] -> parse_error (Err.arg_missing (List.hd al))\n    | l -> List.hd (List.rev l)\n    in\n    al, convert\n\n  (* Predefined converters. *)\n\n  let bool =\n    (fun s -> try `Ok (bool_of_string s) with Invalid_argument _ ->\n        `Error (Err.invalid_val s (alts_str [\"true\"; \"false\"]))),\n    Format.pp_print_bool\n\n  let char =\n    (fun s -> if String.length s = 1 then `Ok s.[0] else\n      `Error (Err.invalid_val s \"expected a character\")),\n    pr_char\n\n  let parse_with t_of_str exp s =\n    try `Ok (t_of_str s) with Failure _ -> `Error (Err.invalid_val s exp)\n\n  let int =\n    parse_with int_of_string \"expected an integer\", Format.pp_print_int\n\n  let int32 =\n    parse_with Int32.of_string \"expected a 32-bit integer\",\n    (fun ppf -> pr ppf \"%ld\")\n\n  let int64 =\n    parse_with Int64.of_string \"expected a 64-bit integer\",\n    (fun ppf -> pr ppf \"%Ld\")\n\n  let nativeint =\n    parse_with Nativeint.of_string \"expected a processor-native integer\",\n    (fun ppf -> pr ppf \"%nd\")\n\n  let float =\n    parse_with float_of_string \"expected a floating point number\",\n    Format.pp_print_float\n\n  let string = (fun s -> `Ok s), pr_str\n  let enum sl =\n    if sl = [] then invalid_arg err_empty_list else\n    let sl_inv = List.rev_map (fun (s,v) -> (v,s)) sl in\n    let print ppf v = pr_str ppf (List.assoc v sl_inv) in\n    let t = Trie.of_list sl in\n    let parse s = match Trie.find t s with\n    | `Ok _ as r -> r\n    | `Ambiguous ->\n        let ambs = List.sort compare (Trie.ambiguities t s) in\n        `Error (Err.ambiguous \"enum value\" s ambs)\n    | `Not_found ->\n        let alts = List.rev (List.rev_map (fun (s, _) -> s) sl) in\n        `Error (Err.invalid_val s (\"expected \" ^ (alts_str alts)))\n    in\n    parse, print\n\n  let file =\n    (fun s -> if Sys.file_exists s then `Ok s else\n      `Error (Err.no \"file or directory\" s)),\n    pr_str\n\n  let dir =\n    (fun s ->\n       if Sys.file_exists s then\n         if Sys.is_directory s then `Ok s else `Error (Err.not_dir s)\n       else\n       `Error (Err.no \"directory\" s)),\n    pr_str\n\n  let non_dir_file =\n    (fun s ->\n       if Sys.file_exists s then\n         if not (Sys.is_directory s) then `Ok s else `Error (Err.is_dir s)\n       else\n       `Error (Err.no \"file\" s)),\n    pr_str\n\n  let split_and_parse sep parse s =\n    let parse sub = match parse sub with\n    | `Error e -> failwith e | `Ok v -> v in\n    let rec split accum j =\n      let i = try String.rindex_from s j sep with Not_found -> -1 in\n      if (i = -1) then\n        let p = String.sub s 0 (j + 1) in\n        if p <> \"\" then parse p :: accum else accum\n      else\n      let p = String.sub s (i + 1) (j - i) in\n      let accum' = if p <> \"\" then parse p :: accum else accum in\n      split accum' (i - 1)\n    in\n    split [] (String.length s - 1)\n\n  let list ?(sep = ',') (parse, pr_e) =\n    let parse s = try `Ok (split_and_parse sep parse s) with\n    | Failure e -> `Error (Err.element \"list\" s e)\n    in\n    let rec print ppf = function\n    | v :: l -> pr_e ppf v; if (l <> []) then (pr_char ppf sep; print ppf l)\n    | [] -> ()\n    in\n    parse, print\n\n  let array ?(sep = ',') (parse, pr_e) =\n    let parse s = try `Ok (Array.of_list (split_and_parse sep parse s)) with\n    | Failure e -> `Error (Err.element \"array\" s e)\n    in\n    let print ppf v =\n      let max = Array.length v - 1 in\n      for i = 0 to max do pr_e ppf v.(i); if i <> max then pr_char ppf sep done\n    in\n    parse, print\n\n  let split_left sep s =\n    try\n      let i = String.index s sep in\n      let len = String.length s in\n      Some ((String.sub s 0 i), (String.sub s (i + 1) (len - i - 1)))\n    with Not_found -> None\n\n  let pair ?(sep = ',') (pa0, pr0) (pa1, pr1) =\n    let parser s = match split_left sep s with\n    | None -> `Error (Err.sep_miss sep s)\n    | Some (v0, v1) ->\n        match pa0 v0, pa1 v1 with\n        | `Ok v0, `Ok v1 -> `Ok (v0, v1)\n        | `Error e, _ | _, `Error e -> `Error (Err.element \"pair\" s e)\n    in\n    let printer ppf (v0, v1) = pr ppf \"%a%c%a\" pr0 v0 sep pr1 v1 in\n    parser, printer\n\n  let t2 = pair\n  let t3 ?(sep = ',') (pa0, pr0) (pa1, pr1) (pa2, pr2) =\n    let parse s = match split_left sep s with\n    | None -> `Error (Err.sep_miss sep s)\n    | Some (v0, s) ->\n        match split_left sep s with\n        | None -> `Error (Err.sep_miss sep s)\n        | Some (v1, v2) ->\n            match pa0 v0, pa1 v1, pa2 v2 with\n            | `Ok v0, `Ok v1, `Ok v2 -> `Ok (v0, v1, v2)\n            | `Error e, _, _ | _, `Error e, _ | _, _, `Error e ->\n                `Error (Err.element \"triple\" s e)\n    in\n    let print ppf (v0, v1, v2) =\n      pr ppf \"%a%c%a%c%a\" pr0 v0 sep pr1 v1 sep pr2 v2\n    in\n    parse, print\n\n  let t4 ?(sep = ',') (pa0, pr0) (pa1, pr1) (pa2, pr2) (pa3, pr3) =\n    let parse s = match split_left sep s with\n    | None -> `Error (Err.sep_miss sep s)\n    | Some(v0, s) ->\n        match split_left sep s with\n        | None -> `Error (Err.sep_miss sep s)\n        | Some (v1, s) ->\n            match split_left sep s with\n            | None -> `Error (Err.sep_miss sep s)\n            | Some (v2, v3) ->\n                match pa0 v0, pa1 v1, pa2 v2, pa3 v3 with\n                | `Ok v1, `Ok v2, `Ok v3, `Ok v4 -> `Ok (v1, v2, v3, v4)\n                | `Error e, _, _, _ | _, `Error e, _, _ | _, _, `Error e, _\n                | _, _, _, `Error e -> `Error (Err.element \"quadruple\" s e)\n    in\n    let print ppf (v0, v1, v2, v3) =\n      pr ppf \"%a%c%a%c%a%c%a\" pr0 v0 sep pr1 v1 sep pr2 v2 sep pr3 v3\n    in\n    parse, print\n\n  (* Documentation formatting helpers *)\n\n  let doc_quote = quote\n  let doc_alts = alts_str\n  let doc_alts_enum ?quoted enum = alts_str ?quoted (List.map fst enum)\nend\n\nmodule Term = struct\n  type info = term_info\n  type +'a t = arg_info list * (eval_info -> cmdline -> 'a)\n  type 'a result = [\n    | `Ok of 'a | `Error of [`Parse | `Term | `Exn ] | `Version | `Help ]\n\n  exception Term of\n      [ `Help of [`Pager | `Plain | `Groff] * string option\n      | `Error of bool * string ]\n\n  let info  ?(sdocs = \"OPTIONS\") ?(man = []) ?(docs = \"COMMANDS\") ?(doc = \"\")\n      ?version name =\n    { name = name; version = version; tdoc = doc; tdocs = docs; sdocs = sdocs;\n      man = man }\n\n  let name ti = ti.name\n  let pure v = [], (fun _ _ -> v)\n  let app (al, f) (al', v) =\n    List.rev_append al al',\n    fun ei cl -> (f ei cl) (v ei cl)\n\n  let ( $ ) = app\n\n  type 'a ret =\n    [ `Help of [`Pager | `Plain | `Groff] * string option\n    | `Error of (bool * string)\n    | `Ok of 'a ]\n\n  let ret (al, v) =\n    al, fun ei cl -> match v ei cl with\n    | `Ok v -> v\n    | `Error (u,e) -> raise (Term (`Error (u,e)))\n    | `Help h -> raise (Term (`Help h))\n\n  let main_name = [], (fun ei _ -> (fst ei.main).name)\n  let choice_names =\n    [], fun ei _ -> List.rev_map (fun e -> (fst e).name) ei.choices\n\n  let man_format =\n    let fmts = [\"pager\", `Pager; \"groff\", `Groff; \"plain\", `Plain] in\n    let doc = \"Show output in format $(docv) (pager, plain or groff).\"in\n    Arg.(value & opt (enum fmts) `Pager & info [\"man-format\"] ~docv:\"FMT\" ~doc)\n\n  (* Evaluation *)\n\n  let remove_exec argv =\n    try List.tl (Array.to_list argv) with Failure _ -> invalid_arg err_argv\n\n  let add_std_opts ei =\n    let docs = (fst ei.term).sdocs in\n    let args, v_lookup =\n      if (fst ei.main).version = None then [], None else\n      let (a, lookup) =\n        Arg.flag (Arg.info [\"version\"] ~docs ~doc:\"Show version information.\")\n      in\n      a, Some lookup\n    in\n    let args, h_lookup =\n      let (a, lookup) =\n        let fmt = Arg.enum [\"pager\",`Pager; \"groff\",`Groff; \"plain\",`Plain] in\n        let doc = \"Show this help in format $(docv) (pager, plain or groff).\"in\n        let a = Arg.info [\"help\"] ~docv:\"FMT\" ~docs ~doc in\n        Arg.opt ~vopt:(Some `Pager) (Arg.some fmt) None a\n      in\n      List.rev_append a args, lookup\n    in\n    h_lookup, v_lookup,\n    { ei with term = (fst ei.term), List.rev_append args (snd ei.term) }\n\n  let eval_term help err ei f args =\n    let help_arg, vers_arg, ei = add_std_opts ei in\n    try\n      let cl = Cmdline.create (snd ei.term) args in\n      match help_arg ei cl, vers_arg with\n      | Some fmt, _ -> Help.print fmt help ei; `Help\n      | None, Some v_arg when v_arg ei cl -> Help.pr_version help ei; `Version\n      | _ -> `Ok (f ei cl)\n    with\n    | Cmdline.Error e -> Err.pr_usage err ei e; `Error `Parse\n    | Term (`Error (usage, e)) ->\n        if usage then Err.pr_usage err ei e else Err.print err ei e;\n        `Error `Term\n    | Term (`Help (fmt, cmd)) ->\n        let ei = match cmd with\n        | Some cmd ->\n            let cmd =\n              try List.find (fun (i, _) -> i.name = cmd) ei.choices\n              with Not_found -> invalid_arg (err_help cmd)\n            in\n            {ei with term = cmd }\n        | None -> { ei with term = ei.main }\n        in\n        let _, _, ei = add_std_opts ei in\n        Help.print fmt help ei; `Help\n\n  let eval ?(help = Format.std_formatter) ?(err = Format.err_formatter)\n      ?(catch = true) ?(argv = Sys.argv) ((al, f), ti)  =\n    let term = ti, al in\n    let ei = { term = term; main = term; choices = [] } in\n    try eval_term help err ei f (remove_exec argv) with\n    | e when catch ->\n        Err.pr_backtrace err ei e (Printexc.get_backtrace ()); `Error `Exn\n\n  let eval_choice ?(help = Format.std_formatter) ?(err = Format.err_formatter)\n      ?(catch = true) ?(argv = Sys.argv) (((al, f) as t), ti) choices =\n    let ei_choices = List.rev_map (fun ((al, _), ti) -> ti, al) choices in\n    let main = (ti, al) in\n    let ei = { term = main; main = main; choices = ei_choices } in\n    try\n      let chosen, args = Cmdline.choose_term ti ei_choices (remove_exec argv) in\n      let find_chosen (_, ti) = ti = chosen in\n      let (al, f), _ = List.find find_chosen ((t, ti) :: choices) in\n      let ei = { ei with term = (chosen, al) } in\n      eval_term help err ei f args\n    with\n    | Cmdline.Error e ->                    (* may be raised by choose_term. *)\n        Err.pr_usage err ei e; `Error `Parse\n    | e when catch ->\n        Err.pr_backtrace err ei e (Printexc.get_backtrace ()); `Error `Exn\n\n  let eval_peek_opts ?(version_opt = false) ?(argv = Sys.argv) (al, f) =\n    let args = remove_exec argv in\n    let version = if version_opt then Some \"dummy\" else None in\n    let term = info ?version \"dummy\", al in\n    let ei = { term = term; main = term; choices = [] } in\n    let help_arg, vers_arg, ei = add_std_opts ei in\n    try\n      let cl = Cmdline.create ~peek_opts:true (snd ei.term) args in\n      match help_arg ei cl, vers_arg with\n      | Some fmt, _ ->\n          (try (Some (f ei cl), `Help) with e -> None, `Help)\n      | None, Some v_arg when v_arg ei cl ->\n          (try (Some (f ei cl), `Version) with e -> None, `Version)\n      | _ ->\n          let v = f ei cl in\n          Some v, `Ok v\n    with\n    | Cmdline.Error _ -> None, (`Error `Parse)\n    | Term _ -> None, (`Error `Term)\n    | e -> None, (`Error `Exn)\nend\n\n(*---------------------------------------------------------------------------\n   Copyright (c) 2011 Daniel C. Bünzli\n   All rights reserved.\n\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions\n   are met:\n\n   1. Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n\n   3. Neither the name of Daniel C. Bünzli nor the names of\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n  ---------------------------------------------------------------------------*)\n"
  },
  {
    "path": "src/test/resources/samples/langs/OCaml/common.ml",
    "content": "(*\n * Copyright (c) 2013 Jeremy Yallop.\n *\n * This file is distributed under the terms of the MIT License.\n * See the file LICENSE for details.\n *)\n\nlet string_of format v = \n  let buf = Buffer.create 100 in\n  let fmt = Format.formatter_of_buffer buf in begin\n    format fmt v;\n    Format.pp_print_flush fmt ();\n    Buffer.contents buf\n  end\n"
  },
  {
    "path": "src/test/resources/samples/langs/OCaml/date.ml",
    "content": "(*\n * Copyright (c) 2013 Jeremy Yallop.\n *\n * This file is distributed under the terms of the MIT License.\n * See the file LICENSE for details.\n *)\n\nopen Ctypes\nopen PosixTypes\nopen Foreign\n\ntype tm\nlet tm = structure \"tm\"\nlet (-:) ty label = field tm label ty\nlet tm_sec   = int -: \"tm_sec\"   (* seconds *)\nlet tm_min   = int -: \"tm_min\"   (* minutes *)\nlet tm_hour  = int -: \"tm_hour\"  (* hours *)\nlet tm_mday  = int -: \"tm_mday\"  (* day of the month *)\nlet tm_mon   = int -: \"tm_mon\"   (* month *)\nlet tm_year  = int -: \"tm_year\"  (* year *)\nlet tm_wday  = int -: \"tm_wday\"  (* day of the week *)\nlet tm_yday  = int -: \"tm_yday\"  (* day in the year *)\nlet tm_isdst = int -: \"tm_isdst\" (* daylight saving time *)\nlet () = seal (tm : tm structure typ)\n\nlet time = foreign \"time\" ~check_errno:true (ptr time_t @-> returning time_t)\n\nlet asctime = foreign \"asctime\" (ptr tm @-> returning string)\n\nlet localtime = foreign \"localtime\" (ptr time_t @-> returning (ptr tm))\n\nlet () = begin\n  let timep = allocate_n ~count:1 time_t in\n  let time = time timep in\n  assert (time = !@timep);\n  let tm = localtime timep in\n  Printf.printf \"tm.tm_mon  = %d\\n\" (getf !@tm tm_mon);\n  Printf.printf \"tm.tm_year = %d\\n\" (getf !@tm tm_year);\n  print_endline (asctime tm)\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/OCaml/example.eliom",
    "content": "\n{shared{\n\n  open Eliom_content\n  open Html5.D\n  open Eliom_parameter\n\n}}\n\n{server{\n\n  module Example =\n    Eliom_registration.App\n      (struct\n        let application_name = \"example\"\n       end)\n\n  let main =\n    Eliom_service.service\n      ~path:[]\n      ~get_params:unit\n      ()\n\n}}\n\n{client{\n\n  let hello_popup () =\n    Dom_html.window##alert(Js.string (\"Hello Popup!\"))\n\n}}\n\n{server{\n\n  let _ =\n\n    Example.register\n      ~service:main\n      (fun () () ->\n        Lwt.return\n          (html\n             (head (title (pcdata \"Hello World of Ocsigen\")) [])\n             (body [h1 [pcdata \"Hello World!\"];\n                    p [pcdata \"Welcome to my first Ocsigen website.\"];\n                    h2 ~a:[a_onclick {{ hello_popup () }}]\n                      [pcdata \"Click me!\"]])))\n\n}}\n"
  },
  {
    "path": "src/test/resources/samples/langs/OCaml/map.ml",
    "content": "(***********************************************************************)\n(*                                                                     *)\n(*                                OCaml                                *)\n(*                                                                     *)\n(*            Xavier Leroy, projet Cristal, INRIA Rocquencourt         *)\n(*                                                                     *)\n(*  Copyright 1996 Institut National de Recherche en Informatique et   *)\n(*  en Automatique.  All rights reserved.  This file is distributed    *)\n(*  under the terms of the GNU Library General Public License, with    *)\n(*  the special exception on linking described in file ../LICENSE.     *)\n(*                                                                     *)\n(***********************************************************************)\n\nmodule type OrderedType =\n  sig\n    type t\n    val compare: t -> t -> int\n  end\n\nmodule type S =\n  sig\n    type key\n    type +'a t\n    val empty: 'a t\n    val is_empty: 'a t -> bool\n    val mem:  key -> 'a t -> bool\n    val add: key -> 'a -> 'a t -> 'a t\n    val singleton: key -> 'a -> 'a t\n    val remove: key -> 'a t -> 'a t\n    val merge:\n          (key -> 'a option -> 'b option -> 'c option) -> 'a t -> 'b t -> 'c t\n    val compare: ('a -> 'a -> int) -> 'a t -> 'a t -> int\n    val equal: ('a -> 'a -> bool) -> 'a t -> 'a t -> bool\n    val iter: (key -> 'a -> unit) -> 'a t -> unit\n    val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b\n    val for_all: (key -> 'a -> bool) -> 'a t -> bool\n    val exists: (key -> 'a -> bool) -> 'a t -> bool\n    val filter: (key -> 'a -> bool) -> 'a t -> 'a t\n    val partition: (key -> 'a -> bool) -> 'a t -> 'a t * 'a t\n    val cardinal: 'a t -> int\n    val bindings: 'a t -> (key * 'a) list\n    val min_binding: 'a t -> (key * 'a)\n    val max_binding: 'a t -> (key * 'a)\n    val choose: 'a t -> (key * 'a)\n    val split: key -> 'a t -> 'a t * 'a option * 'a t\n    val find: key -> 'a t -> 'a\n    val map: ('a -> 'b) -> 'a t -> 'b t\n    val mapi: (key -> 'a -> 'b) -> 'a t -> 'b t\n  end\n\nmodule Make(Ord: OrderedType) = struct\n\n    type key = Ord.t\n\n    type 'a t =\n        Empty\n      | Node of 'a t * key * 'a * 'a t * int\n\n    let height = function\n        Empty -> 0\n      | Node(_,_,_,_,h) -> h\n\n    let create l x d r =\n      let hl = height l and hr = height r in\n      Node(l, x, d, r, (if hl >= hr then hl + 1 else hr + 1))\n\n    let singleton x d = Node(Empty, x, d, Empty, 1)\n\n    let bal l x d r =\n      let hl = match l with Empty -> 0 | Node(_,_,_,_,h) -> h in\n      let hr = match r with Empty -> 0 | Node(_,_,_,_,h) -> h in\n      if hl > hr + 2 then begin\n        match l with\n          Empty -> invalid_arg \"Map.bal\"\n        | Node(ll, lv, ld, lr, _) ->\n            if height ll >= height lr then\n              create ll lv ld (create lr x d r)\n            else begin\n              match lr with\n                Empty -> invalid_arg \"Map.bal\"\n              | Node(lrl, lrv, lrd, lrr, _)->\n                  create (create ll lv ld lrl) lrv lrd (create lrr x d r)\n            end\n      end else if hr > hl + 2 then begin\n        match r with\n          Empty -> invalid_arg \"Map.bal\"\n        | Node(rl, rv, rd, rr, _) ->\n            if height rr >= height rl then\n              create (create l x d rl) rv rd rr\n            else begin\n              match rl with\n                Empty -> invalid_arg \"Map.bal\"\n              | Node(rll, rlv, rld, rlr, _) ->\n                  create (create l x d rll) rlv rld (create rlr rv rd rr)\n            end\n      end else\n        Node(l, x, d, r, (if hl >= hr then hl + 1 else hr + 1))\n\n    let empty = Empty\n\n    let is_empty = function Empty -> true | _ -> false\n\n    let rec add x data = function\n        Empty ->\n          Node(Empty, x, data, Empty, 1)\n      | Node(l, v, d, r, h) ->\n          let c = Ord.compare x v in\n          if c = 0 then\n            Node(l, x, data, r, h)\n          else if c < 0 then\n            bal (add x data l) v d r\n          else\n            bal l v d (add x data r)\n\n    let rec find x = function\n        Empty ->\n          raise Not_found\n      | Node(l, v, d, r, _) ->\n          let c = Ord.compare x v in\n          if c = 0 then d\n          else find x (if c < 0 then l else r)\n\n    let rec mem x = function\n        Empty ->\n          false\n      | Node(l, v, d, r, _) ->\n          let c = Ord.compare x v in\n          c = 0 || mem x (if c < 0 then l else r)\n\n    let rec min_binding = function\n        Empty -> raise Not_found\n      | Node(Empty, x, d, r, _) -> (x, d)\n      | Node(l, x, d, r, _) -> min_binding l\n\n    let rec max_binding = function\n        Empty -> raise Not_found\n      | Node(l, x, d, Empty, _) -> (x, d)\n      | Node(l, x, d, r, _) -> max_binding r\n\n    let rec remove_min_binding = function\n        Empty -> invalid_arg \"Map.remove_min_elt\"\n      | Node(Empty, x, d, r, _) -> r\n      | Node(l, x, d, r, _) -> bal (remove_min_binding l) x d r\n\n    let merge t1 t2 =\n      match (t1, t2) with\n        (Empty, t) -> t\n      | (t, Empty) -> t\n      | (_, _) ->\n          let (x, d) = min_binding t2 in\n          bal t1 x d (remove_min_binding t2)\n\n    let rec remove x = function\n        Empty ->\n          Empty\n      | Node(l, v, d, r, h) ->\n          let c = Ord.compare x v in\n          if c = 0 then\n            merge l r\n          else if c < 0 then\n            bal (remove x l) v d r\n          else\n            bal l v d (remove x r)\n\n    let rec iter f = function\n        Empty -> ()\n      | Node(l, v, d, r, _) ->\n          iter f l; f v d; iter f r\n\n    let rec map f = function\n        Empty ->\n          Empty\n      | Node(l, v, d, r, h) ->\n          let l' = map f l in\n          let d' = f d in\n          let r' = map f r in\n          Node(l', v, d', r', h)\n\n    let rec mapi f = function\n        Empty ->\n          Empty\n      | Node(l, v, d, r, h) ->\n          let l' = mapi f l in\n          let d' = f v d in\n          let r' = mapi f r in\n          Node(l', v, d', r', h)\n\n    let rec fold f m accu =\n      match m with\n        Empty -> accu\n      | Node(l, v, d, r, _) ->\n          fold f r (f v d (fold f l accu))\n\n    let rec for_all p = function\n        Empty -> true\n      | Node(l, v, d, r, _) -> p v d && for_all p l && for_all p r\n\n    let rec exists p = function\n        Empty -> false\n      | Node(l, v, d, r, _) -> p v d || exists p l || exists p r\n\n    (* Beware: those two functions assume that the added k is *strictly*\n       smaller (or bigger) than all the present keys in the tree; it\n       does not test for equality with the current min (or max) key.\n\n       Indeed, they are only used during the \"join\" operation which\n       respects this precondition.\n    *)\n\n    let rec add_min_binding k v = function\n      | Empty -> singleton k v\n      | Node (l, x, d, r, h) ->\n        bal (add_min_binding k v l) x d r\n\n    let rec add_max_binding k v = function\n      | Empty -> singleton k v\n      | Node (l, x, d, r, h) ->\n        bal l x d (add_max_binding k v r)\n\n    (* Same as create and bal, but no assumptions are made on the\n       relative heights of l and r. *)\n\n    let rec join l v d r =\n      match (l, r) with\n        (Empty, _) -> add_min_binding v d r\n      | (_, Empty) -> add_max_binding v d l\n      | (Node(ll, lv, ld, lr, lh), Node(rl, rv, rd, rr, rh)) ->\n          if lh > rh + 2 then bal ll lv ld (join lr v d r) else\n          if rh > lh + 2 then bal (join l v d rl) rv rd rr else\n          create l v d r\n\n    (* Merge two trees l and r into one.\n       All elements of l must precede the elements of r.\n       No assumption on the heights of l and r. *)\n\n    let concat t1 t2 =\n      match (t1, t2) with\n        (Empty, t) -> t\n      | (t, Empty) -> t\n      | (_, _) ->\n          let (x, d) = min_binding t2 in\n          join t1 x d (remove_min_binding t2)\n\n    let concat_or_join t1 v d t2 =\n      match d with\n      | Some d -> join t1 v d t2\n      | None -> concat t1 t2\n\n    let rec split x = function\n        Empty ->\n          (Empty, None, Empty)\n      | Node(l, v, d, r, _) ->\n          let c = Ord.compare x v in\n          if c = 0 then (l, Some d, r)\n          else if c < 0 then\n            let (ll, pres, rl) = split x l in (ll, pres, join rl v d r)\n          else\n            let (lr, pres, rr) = split x r in (join l v d lr, pres, rr)\n\n    let rec merge f s1 s2 =\n      match (s1, s2) with\n        (Empty, Empty) -> Empty\n      | (Node (l1, v1, d1, r1, h1), _) when h1 >= height s2 ->\n          let (l2, d2, r2) = split v1 s2 in\n          concat_or_join (merge f l1 l2) v1 (f v1 (Some d1) d2) (merge f r1 r2)\n      | (_, Node (l2, v2, d2, r2, h2)) ->\n          let (l1, d1, r1) = split v2 s1 in\n          concat_or_join (merge f l1 l2) v2 (f v2 d1 (Some d2)) (merge f r1 r2)\n      | _ ->\n          assert false\n\n    let rec filter p = function\n        Empty -> Empty\n      | Node(l, v, d, r, _) ->\n          (* call [p] in the expected left-to-right order *)\n          let l' = filter p l in\n          let pvd = p v d in\n          let r' = filter p r in\n          if pvd then join l' v d r' else concat l' r'\n\n    let rec partition p = function\n        Empty -> (Empty, Empty)\n      | Node(l, v, d, r, _) ->\n          (* call [p] in the expected left-to-right order *)\n          let (lt, lf) = partition p l in\n          let pvd = p v d in\n          let (rt, rf) = partition p r in\n          if pvd\n          then (join lt v d rt, concat lf rf)\n          else (concat lt rt, join lf v d rf)\n\n    type 'a enumeration = End | More of key * 'a * 'a t * 'a enumeration\n\n    let rec cons_enum m e =\n      match m with\n        Empty -> e\n      | Node(l, v, d, r, _) -> cons_enum l (More(v, d, r, e))\n\n    let compare cmp m1 m2 =\n      let rec compare_aux e1 e2 =\n          match (e1, e2) with\n          (End, End) -> 0\n        | (End, _)  -> -1\n        | (_, End) -> 1\n        | (More(v1, d1, r1, e1), More(v2, d2, r2, e2)) ->\n            let c = Ord.compare v1 v2 in\n            if c <> 0 then c else\n            let c = cmp d1 d2 in\n            if c <> 0 then c else\n            compare_aux (cons_enum r1 e1) (cons_enum r2 e2)\n      in compare_aux (cons_enum m1 End) (cons_enum m2 End)\n\n    let equal cmp m1 m2 =\n      let rec equal_aux e1 e2 =\n          match (e1, e2) with\n          (End, End) -> true\n        | (End, _)  -> false\n        | (_, End) -> false\n        | (More(v1, d1, r1, e1), More(v2, d2, r2, e2)) ->\n            Ord.compare v1 v2 = 0 && cmp d1 d2 &&\n            equal_aux (cons_enum r1 e1) (cons_enum r2 e2)\n      in equal_aux (cons_enum m1 End) (cons_enum m2 End)\n\n    let rec cardinal = function\n        Empty -> 0\n      | Node(l, _, _, r, _) -> cardinal l + 1 + cardinal r\n\n    let rec bindings_aux accu = function\n        Empty -> accu\n      | Node(l, v, d, r, _) -> bindings_aux ((v, d) :: bindings_aux accu r) l\n\n    let bindings s =\n      bindings_aux [] s\n\n    let choose = min_binding\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/OCaml/mirage.ml",
    "content": "(*\n * Copyright (c) 2013 Thomas Gazagnaire <thomas@gazagnaire.org>\n * Copyright (c) 2013 Anil Madhavapeddy <anil@recoil.org>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *)\n\nopen Mirage_misc\n\nmodule StringSet = struct\n\n  include Set.Make(String)\n\n  let of_list l =\n    let s = ref empty in\n    List.iter (fun e -> s := add e !s) l;\n    !s\n\nend\n\nlet main_ml = ref None\n\nlet append_main fmt =\n  match !main_ml with\n  | None    -> failwith \"main_ml\"\n  | Some oc -> append oc fmt\n\nlet newline_main () =\n  match !main_ml with\n  | None    -> failwith \"main_ml\"\n  | Some oc -> newline oc\n\nlet set_main_ml file =\n  let oc = open_out file in\n  main_ml := Some oc\n\ntype mode = [\n  | `Unix\n  | `Xen\n  | `MacOSX\n]\n\nlet string_of_mode =\n  function\n  | `Unix -> \"Unix\"\n  | `Xen -> \"Xen\"\n  | `MacOSX -> \"MacOS X\"\n\nlet mode : mode ref = ref `Unix\n\nlet set_mode m =\n  mode := m\n\nlet get_mode () =\n  !mode\n\ntype _ typ =\n  | Type: 'a -> 'a typ\n  | Function: 'a typ * 'b typ -> ('a -> 'b) typ\n\nlet (@->) f t =\n  Function (f, t)\n\nmodule type CONFIGURABLE = sig\n  type t\n  val name: t -> string\n  val module_name: t -> string\n  val packages: t -> string list\n  val libraries: t -> string list\n  val configure: t -> unit\n  val clean: t -> unit\n  val update_path: t -> string -> t\nend\n\n\nmodule TODO (N: sig val name: string end) = struct\n\n  let todo str =\n    failwith (Printf.sprintf \"TODO: %s.%s\" N.name str)\n\n  let name _ =\n    todo \"name\"\n\n  let module_name _ =\n    todo \"module_name\"\n\n  let packages _ =\n    todo \"packages\"\n\n  let libraries _ =\n    todo \"libraries\"\n\n  let configure _ =\n    todo \"configure\"\n\n  let clean _ =\n    todo \"clean\"\n\n  let update_path _ =\n    todo \"update_path\"\n\nend\n\ntype ('a, 'b) base = {\n  typ: 'a typ;\n  t: 'b;\n  m: (module CONFIGURABLE with type t = 'b);\n}\n\ntype 'a foreign = {\n  name: string;\n  ty: 'a typ;\n  libraries: string list;\n  packages: string list;\n}\n\ntype _ impl =\n  | Impl: ('a, 'b) base -> 'a impl (* base implementation *)\n  | App: ('a, 'b) app -> 'b impl   (* functor application *)\n  | Foreign: 'a foreign -> 'a impl (* foreign functor implementation *)\n\nand ('a, 'b) app = {\n  f: ('a -> 'b) impl;  (* functor *)\n  x: 'a impl;          (* parameter *)\n}\n\nlet rec string_of_impl: type a. a impl -> string = function\n  | Impl { t; m = (module M) } -> Printf.sprintf \"Impl (%s)\" (M.module_name t)\n  | Foreign { name } -> Printf.sprintf \"Foreign (%s)\" name\n  | App { f; x } -> Printf.sprintf \"App (%s, %s)\" (string_of_impl f) (string_of_impl x)\n\ntype 'a folder = {\n  fn: 'b. 'a -> 'b impl -> 'a\n}\n\nlet rec fold: type a. 'b folder -> a impl -> 'b -> 'b =\n  fun fn t acc ->\n    match t with\n    | Impl _\n    | Foreign _  -> fn.fn acc t\n    | App {f; x} -> fold fn f (fn.fn acc x)\n\ntype iterator = {\n  i: 'b. 'b impl -> unit\n}\n\nlet rec iter: type a. iterator -> a impl -> unit =\n  fun fn t ->\n    match t with\n    | Impl _\n    | Foreign _  -> fn.i t\n    | App {f; x} -> iter fn f; iter fn x; fn.i x\n\nlet driver_initialisation_error name =\n  Printf.sprintf \"fail (Failure %S)\" name\n\nmodule Name = struct\n\n  let ids = Hashtbl.create 1024\n\n  let names = Hashtbl.create 1024\n\n  let create name =\n    let n =\n      try 1 + Hashtbl.find ids name\n      with Not_found -> 1 in\n    Hashtbl.replace ids name n;\n    Printf.sprintf \"%s%d\" name n\n\n  let of_key key ~base =\n    find_or_create names key (fun () -> create base)\n\nend\n\nmodule Impl = struct\n\n  (* get the left-most module name (ie. the name of the functor). *)\n  let rec functor_name: type a. a impl -> string = function\n    | Impl { t; m = (module M) } -> M.module_name t\n    | Foreign { name }           -> name\n    | App { f }                  -> functor_name f\n\n  (* return a unique variable name holding the state of the given\n     module construction. *)\n  let rec name: type a. a impl -> string = function\n    | Impl { t; m = (module M) } -> M.name t\n    | Foreign { name }           -> Name.of_key (\"f\" ^ name) ~base:\"f\"\n    | App _ as t                 -> Name.of_key (module_name t) ~base:\"t\"\n\n  (* return a unique module name holding the implementation of the\n     given module construction. *)\n  and module_name: type a. a impl -> string = function\n    | Impl { t; m = (module M) } -> M.module_name t\n    | Foreign { name }           -> name\n    | App { f; x }   ->\n      let name = match module_names f @ [module_name x] with\n        | []   -> assert false\n        | [m]  -> m\n        | h::t -> h ^ String.concat \"\" (List.map (Printf.sprintf \"(%s)\") t)\n      in\n      Name.of_key name ~base:\"M\"\n\n  and module_names: type a. a impl -> string list =\n    function t ->\n      let fn = {\n        fn = fun acc t -> module_name t :: acc\n      } in\n      fold fn t []\n\n  let rec names: type a. a impl -> string list = function\n    | Foreign _            -> []\n    | Impl _ as t          -> [name t]\n    | App {f=Foreign f; x} -> names x\n    | App {f; x}           -> (names f) @ [name x]\n\n  let configured = Hashtbl.create 31\n\n  let rec configure: type a. a impl -> unit =\n    fun t ->\n      let name = name t in\n      if not (Hashtbl.mem configured name) then (\n        Hashtbl.add configured name true;\n        match t with\n        | Impl { t; m = (module M) } -> M.configure t\n        | Foreign _                  -> ()\n        | App {f; x} as  app         ->\n          configure_app f;\n          configure_app x;\n          iter { i=configure } app;\n          let name = module_name app in\n          let body = cofind Name.names name in\n          append_main \"module %s = %s\" name body;\n          newline_main ();\n      )\n\n  and configure_app: type a. a impl -> unit = function\n    | Impl _\n    | Foreign _  -> ()\n    | App _ as t ->\n      let name = name t in\n      configure t;\n      begin match names t with\n        | [n]   -> append_main \"let %s = %s\" name n\n        | names ->\n          append_main \"let %s () =\" name;\n          List.iter (fun n ->\n              append_main \"  %s () >>= function\" n;\n              append_main \"  | `Error e -> %s\" (driver_initialisation_error n);\n              append_main \"  | `Ok %s ->\" n;\n            ) names;\n          append_main \"  return (`Ok (%s))\" (String.concat \", \" names)\n      end;\n      newline_main ()\n\n  let rec packages: type a. a impl -> string list = function\n    | Impl { t; m = (module M) } -> M.packages t\n    | Foreign { packages }       -> packages\n    | App {f; x}                 -> packages f @ packages x\n\n  let rec libraries: type a. a impl -> string list = function\n    | Impl { t; m = (module M) } -> M.libraries t\n    | Foreign { libraries }      -> libraries\n    | App {f; x}                 -> libraries f @ libraries x\n\n  let rec clean: type a. a impl -> unit = function\n    | Impl { t; m = (module M) } -> M.clean t\n    | Foreign _                  -> ()\n    | App {f; x}                 -> clean f; clean x\n\n  let rec update_path: type a. a impl -> string -> a impl =\n    fun t root -> match t with\n      | Impl b     ->\n        let module M = (val b.m) in Impl { b with t = M.update_path b.t root }\n      | Foreign _  -> t\n      | App {f; x} -> App { f = update_path f root; x = update_path x root }\n\nend\n\nlet impl typ t m =\n  Impl { typ; t; m }\n\nlet implementation typ t m =\n  let typ = Type typ in\n  Impl { typ; t; m }\n\nlet ($) f x =\n  App { f; x }\n\nlet foreign name ?(libraries=[]) ?(packages=[]) ty =\n  Foreign { name; ty; libraries; packages }\n\nlet rec typ: type a. a impl -> a typ = function\n  | Impl { typ } -> typ\n  | Foreign { ty } -> ty\n  | App { f }       -> match typ f with Function (_, b) -> b | _ -> assert false\n\n\nmodule Io_page = struct\n\n  (** Memory allocation interface. *)\n\n  type t = unit\n\n  let name () =\n    \"io_page\"\n\n  let module_name () =\n    \"Io_page\"\n\n  let packages () = [\n    \"io-page\"\n  ]\n\n  let libraries () =\n    match !mode with\n    | `Xen  -> [\"io-page\"]\n    | `Unix | `MacOSX -> [\"io-page\"; \"io-page.unix\"]\n\n  let configure () = ()\n\n  let clean () = ()\n\n  let update_path () _ = ()\n\nend\n\ntype io_page = IO_PAGE\n\nlet io_page = Type IO_PAGE\n\nlet default_io_page: io_page impl =\n  impl io_page () (module Io_page)\n\nmodule Time = struct\n\n  (** OS Timer. *)\n\n  type t = unit\n\n  let name () =\n    \"time\"\n\n  let module_name () =\n    \"OS.Time\"\n\n  let packages () = []\n\n  let libraries () = []\n\n  let configure () = ()\n\n  let clean () = ()\n\n  let update_path () _ = ()\n\nend\n\ntype time = TIME\n\nlet time = Type TIME\n\nlet default_time: time impl =\n  impl time () (module Time)\n\nmodule Clock = struct\n\n  (** Clock operations. *)\n\n  type t = unit\n\n  let name () =\n    \"clock\"\n\n  let module_name () =\n    \"Clock\"\n\n  let packages () = [\n    match !mode with\n    | `Unix | `MacOSX -> \"mirage-clock-unix\"\n    | `Xen  -> \"mirage-clock-xen\"\n  ]\n\n  let libraries () = packages ()\n\n  let configure () =\n    append_main \"let clock () = return (`Ok ())\";\n    newline_main ()\n\n  let clean () = ()\n\n  let update_path () _ = ()\n\nend\n\ntype clock = CLOCK\n\nlet clock = Type CLOCK\n\nlet default_clock: clock impl =\n  impl clock () (module Clock)\n\nmodule Random = struct\n\n  type t = unit\n\n  let name () =\n    \"random\"\n\n  let module_name () =\n    \"Random\"\n\n  let packages () = []\n\n  let libraries () = []\n\n  let configure () =\n    append_main \"let random () = return (`Ok ())\";\n    newline_main ()\n\n  let clean () = ()\n\n  let update_path () _ = ()\n\nend\n\ntype random = RANDOM\n\nlet random = Type RANDOM\n\nlet default_random: random impl =\n  impl random () (module Random)\n\nmodule Entropy = struct\n\n  type t = unit\n\n  let name _ =\n    \"entropy\"\n\n  let module_name () = \"Entropy\"\n\n  let construction () =\n    match !mode with\n    | `Unix | `MacOSX -> \"Entropy_unix.Make (OS.Time)\"\n    | `Xen  -> \"Entropy_xen\"\n\n  let packages () =\n    match !mode with\n    | `Unix | `MacOSX -> [ \"mirage-entropy-unix\" ]\n    | `Xen  -> [ \"mirage-entropy-xen\" ]\n\n  let libraries = packages\n\n  let configure t =\n    append_main \"module %s = %s\" (module_name t) (construction t) ;\n    newline_main () ;\n    append_main \"let %s () =\" (name t);\n    append_main \"  %s.connect ()\" (module_name t);\n    newline_main ()\n\n  let clean () = ()\n\n  let update_path t _ = t\n\nend\n\ntype entropy = ENTROPY\n\nlet entropy = Type ENTROPY\n\nlet default_entropy: entropy impl =\n  impl entropy () (module Entropy)\n\nmodule Console = struct\n\n  type t = string\n\n  let name t =\n    Name.of_key (\"console\" ^ t) ~base:\"console\"\n\n  let module_name t =\n    \"Console\"\n\n  let construction () =\n    match !mode with\n    | `Unix | `MacOSX -> \"Console_unix\"\n    | `Xen  -> \"Console_xen\"\n\n  let packages _ =\n    match !mode with\n    | `Unix | `MacOSX -> [\"mirage-console\"; \"mirage-unix\"]\n    | `Xen  -> [\"mirage-console\"; \"xenstore\"; \"mirage-xen\"; \"xen-gnt\"; \"xen-evtchn\"]\n\n  let libraries _ =\n    match !mode with\n    | `Unix | `MacOSX -> [\"mirage-console.unix\"]\n    | `Xen -> [\"mirage-console.xen\"]\n\n  let configure t =\n    append_main \"module %s = %s\" (module_name t) (construction ());\n    newline_main ();\n    append_main \"let %s () =\" (name t);\n    append_main \"  %s.connect %S\" (module_name t) t;\n    newline_main ()\n\n  let clean _ =\n    ()\n\n  let update_path t _ =\n    t\n\nend\n\ntype console = CONSOLE\n\nlet console = Type CONSOLE\n\nlet default_console: console impl =\n  impl console \"0\" (module Console)\n\nlet custom_console: string -> console impl =\n  fun str ->\n    impl console str (module Console)\n\nmodule Crunch = struct\n\n  type t = string\n\n  let name t =\n    Name.of_key (\"static\" ^ t) ~base:\"static\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages _ = [\n    \"mirage-types\";\n    \"lwt\";\n    \"cstruct\";\n    \"crunch\";\n  ] @ Io_page.packages ()\n\n  let libraries _ = [\n    \"mirage-types\";\n    \"lwt\";\n    \"cstruct\";\n  ] @ Io_page.libraries ()\n\n  let ml t =\n    Printf.sprintf \"%s.ml\" (name t)\n\n  let mli t =\n    Printf.sprintf \"%s.mli\" (name t)\n\n  let configure t =\n    if not (command_exists \"ocaml-crunch\") then\n      error \"ocaml-crunch not found, stopping.\";\n    let file = ml t in\n    if Sys.file_exists t then (\n      info \"%s %s\" (blue_s \"Generating:\") (Sys.getcwd () / file);\n      command \"ocaml-crunch -o %s %s\" file t\n    ) else\n      error \"The directory %s does not exist.\" t;\n    append_main \"let %s () =\" (name t);\n    append_main \"  %s.connect ()\" (module_name t);\n    newline_main ()\n\n  let clean t =\n    remove (ml t);\n    remove (mli t)\n\n  let update_path t root =\n    if Sys.file_exists (root / t) then\n      root / t\n    else\n      t\n\nend\n\ntype kv_ro = KV_RO\n\nlet kv_ro = Type KV_RO\n\nlet crunch dirname =\n  impl kv_ro dirname (module Crunch)\n\nmodule Direct_kv_ro = struct\n\n  include Crunch\n\n  let module_name t =\n    match !mode with\n    | `Xen  -> Crunch.module_name t\n    | `Unix | `MacOSX -> \"Kvro_fs_unix\"\n\n  let packages t =\n    match !mode with\n    | `Xen  -> Crunch.packages t\n    | `Unix | `MacOSX -> \"mirage-fs-unix\" :: Crunch.packages t\n\n  let libraries t =\n    match !mode with\n    | `Xen  -> Crunch.libraries t\n    | `Unix | `MacOSX -> \"mirage-fs-unix\" :: Crunch.libraries t\n\n  let configure t =\n    match !mode with\n    | `Xen  -> Crunch.configure t\n    | `Unix | `MacOSX ->\n      append_main \"let %s () =\" (name t);\n      append_main \"  Kvro_fs_unix.connect %S\" t\n\nend\n\nlet direct_kv_ro dirname =\n  impl kv_ro dirname (module Direct_kv_ro)\n\nmodule Block = struct\n\n  type t = string\n\n  let name t =\n    Name.of_key (\"block\" ^ t) ~base:\"block\"\n\n  let module_name _ =\n    \"Block\"\n\n  let packages _ = [\n    match !mode with\n    | `Unix | `MacOSX -> \"mirage-block-unix\"\n    | `Xen  -> \"mirage-block-xen\"\n  ]\n\n  let libraries _ = [\n    match !mode with\n    | `Unix | `MacOSX -> \"mirage-block-unix\"\n    | `Xen  -> \"mirage-block-xen.front\"\n  ]\n\n  let configure t =\n    append_main \"let %s () =\" (name t);\n    append_main \"  %s.connect %S\" (module_name t) t;\n    newline_main ()\n\n  let clean t =\n    ()\n\n  let update_path t root =\n    if Sys.file_exists (root / t) then\n      root / t\n    else\n      t\n\nend\n\ntype block = BLOCK\n\nlet block = Type BLOCK\n\nlet block_of_file filename =\n  impl block filename (module Block)\n\nmodule Fat = struct\n\n  type t = {\n    io_page: io_page impl;\n    block  : block impl;\n  }\n\n  let name t =\n    let key = \"fat\" ^ Impl.name t.io_page ^ Impl.name t.block in\n    Name.of_key key ~base:\"fat\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages t =\n    \"fat-filesystem\"\n    :: Impl.packages t.io_page\n    @  Impl.packages t.block\n\n  let libraries t =\n    \"fat-filesystem\"\n    :: Impl.libraries t.io_page\n    @  Impl.libraries t.block\n\n  let configure t =\n    Impl.configure t.io_page;\n    Impl.configure t.block;\n    append_main \"module %s = Fat.Fs.Make(%s)(%s)\"\n      (module_name t)\n      (Impl.module_name t.block)\n      (Impl.module_name t.io_page);\n    newline_main ();\n    let name = name t in\n    append_main \"let %s () =\" name;\n    append_main \"  %s () >>= function\" (Impl.name t.block);\n    append_main \"  | `Error _ -> %s\" (driver_initialisation_error name);\n    append_main \"  | `Ok dev  -> %s.connect dev\" (module_name t);\n    newline_main ()\n\n  let clean t =\n    Impl.clean t.block;\n    Impl.clean t.io_page\n\n  let update_path t root =\n    { io_page = Impl.update_path t.io_page root;\n      block  = Impl.update_path t.block root;\n    }\n\nend\n\ntype fs = FS\n\nlet fs = Type FS\n\nlet fat ?(io_page=default_io_page) block: fs impl =\n  let t = { Fat.block; io_page } in\n  impl fs t (module Fat)\n\n(* This would deserve to be in its own lib. *)\nlet kv_ro_of_fs x: kv_ro impl =\n  let dummy_fat = fat (block_of_file \"xx\") in\n  let libraries = Impl.libraries dummy_fat in\n  let packages = Impl.packages dummy_fat in\n  let fn = foreign \"Fat.KV_RO.Make\" ~libraries ~packages (fs @-> kv_ro) in\n  fn $ x\n\nmodule Fat_of_files = struct\n\n  type t = {\n    dir   : string option;\n    regexp: string;\n  }\n\n  let name t =\n    Name.of_key\n      (\"fat\" ^ (match t.dir with None -> \".\" | Some d -> d) ^ \":\" ^ t.regexp)\n      ~base:\"fat\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let block_file t =\n    name t ^ \".img\"\n\n  let block t =\n    block_of_file (block_file t)\n\n  let packages t =\n    Impl.packages (fat (block t))\n\n  let libraries t =\n    Impl.libraries (fat (block t))\n\n  let configure t =\n    let fat = fat (block t) in\n    Impl.configure fat;\n    append_main \"module %s = %s\" (module_name t) (Impl.module_name fat);\n    append_main \"let %s = %s\" (name t) (Impl.name fat);\n    newline_main ();\n    let file = Printf.sprintf \"make-%s-image.sh\" (name t) in\n    let oc = open_out file in\n    append oc \"#!/bin/sh\";\n    append oc \"\";\n    append oc \"echo This uses the 'fat' command-line tool to build a simple FAT\";\n    append oc \"echo filesystem image.\";\n    append oc \"\";\n    append oc \"FAT=$(which fat)\";\n    append oc \"if [ ! -x \\\"${FAT}\\\" ]; then\";\n    append oc \"  echo I couldn\\\\'t find the 'fat' command-line tool.\";\n    append oc \"  echo Try running 'opam install fat-filesystem'\";\n    append oc \"  exit 1\";\n    append oc \"fi\";\n    append oc \"\";\n    append oc \"IMG=$(pwd)/%s\" (block_file t);\n    append oc \"rm -f ${IMG}\";\n    (match t.dir with None -> () | Some d -> append oc \"cd %s/\" d);\n    append oc \"SIZE=$(du -s . | cut -f 1)\";\n    append oc \"${FAT} create ${IMG} ${SIZE}KiB\";\n    append oc \"${FAT} add ${IMG} %s\" t.regexp;\n    append oc \"echo Created '%s'\" (block_file t);\n\n    close_out oc;\n    Unix.chmod file 0o755;\n    command \"./make-%s-image.sh\" (name t)\n\n  let clean t =\n    command \"rm -f make-%s-image.sh %s\" (name t) (block_file t);\n    Impl.clean (block t)\n\n  let update_path t root =\n    match t.dir with\n    | None   -> t\n    | Some d -> { t with dir = Some (root / d) }\n\nend\n\nlet fat_of_files: ?dir:string -> ?regexp:string -> unit -> fs impl =\n  fun ?dir ?regexp () ->\n    let regexp = match regexp with\n      | None   -> \"*\"\n      | Some r -> r in\n    impl fs { Fat_of_files.dir; regexp } (module Fat_of_files)\n\ntype network_config = Tap0 | Custom of string\n\nmodule Network = struct\n\n  type t = network_config\n\n  let name t =\n    \"net_\" ^ match t with\n    | Tap0     -> \"tap0\"\n    | Custom s -> s\n\n  let module_name _ =\n    \"Netif\"\n\n  let packages t =\n    match !mode with\n    | `Unix -> [\"mirage-net-unix\"]\n    | `MacOSX -> [\"mirage-net-macosx\"]\n    | `Xen  -> [\"mirage-net-xen\"]\n\n  let libraries t =\n    packages t\n\n  let configure t =\n    append_main \"let %s () =\" (name t);\n    append_main \"  %s.connect %S\"\n      (module_name t)\n      (match t with Tap0 -> \"tap0\" | Custom s -> s);\n    newline_main ()\n\n  let clean _ =\n    ()\n\n  let update_path t _ =\n    t\n\nend\n\ntype network = NETWORK\n\nlet network = Type NETWORK\n\nlet tap0 =\n  impl network Tap0 (module Network)\n\nlet netif dev =\n  impl network (Custom dev) (module Network)\n\nmodule Ethif = struct\n\n  type t = network impl\n\n  let name t =\n    Name.of_key (\"ethif\" ^ Impl.name t) ~base:\"ethif\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages t =\n    Impl.packages t @ [\"tcpip\"]\n\n  let libraries t =\n    Impl.libraries t @\n    match !mode with\n    | `Unix | `MacOSX -> [ \"tcpip.ethif-unix\" ]\n    | `Xen  -> [ \"tcpip.ethif\" ]\n\n  let configure t =\n    let name = name t in\n    Impl.configure t;\n    append_main \"module %s = Ethif.Make(%s)\" (module_name t) (Impl.module_name t);\n    newline_main ();\n    append_main \"let %s () =\" name;\n    append_main \"   %s () >>= function\" (Impl.name t);\n    append_main \"   | `Error _ -> %s\" (driver_initialisation_error name);\n    append_main \"   | `Ok eth  -> %s.connect eth\" (module_name t);\n    newline_main ()\n\n  let clean t =\n    Impl.clean t\n\n  let update_path t root =\n    Impl.update_path t root\n\nend\n\ntype ethernet = ETHERNET\n\nlet ethernet = Type ETHERNET\n\nlet etif network =\n  impl ethernet network (module Ethif)\n\ntype ('ipaddr, 'prefix) ip_config = {\n  address: 'ipaddr;\n  netmask: 'prefix;\n  gateways: 'ipaddr list;\n}\n\ntype ipv4_config = (Ipaddr.V4.t, Ipaddr.V4.t) ip_config\n\nlet meta_ipv4_config t =\n  Printf.sprintf \"(Ipaddr.V4.of_string_exn %S, Ipaddr.V4.of_string_exn %S, [%s])\"\n    (Ipaddr.V4.to_string t.address)\n    (Ipaddr.V4.to_string t.netmask)\n    (String.concat \"; \"\n       (List.map (Printf.sprintf \"Ipaddr.V4.of_string_exn %S\")\n          (List.map Ipaddr.V4.to_string t.gateways)))\n\nmodule IPV4 = struct\n\n  type t = {\n    ethernet: ethernet impl;\n    config  : ipv4_config;\n  }\n  (* XXX: should the type if ipv4.id be ipv4.t ?\n     N.connect ethif |> N.set_ip up *)\n\n  let name t =\n    let key = \"ipv4\" ^ Impl.name t.ethernet ^ meta_ipv4_config t.config in\n    Name.of_key key ~base:\"ipv4\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages t =\n    \"tcpip\" :: Impl.packages t.ethernet\n\n  let libraries t  =\n    (match !mode with\n     | `Unix | `MacOSX -> [ \"tcpip.ipv4-unix\" ]\n     | `Xen  -> [ \"tcpip.ipv4\" ])\n    @ Impl.libraries t.ethernet\n\n  let configure t =\n    let name = name t in\n    let mname = module_name t in\n    Impl.configure t.ethernet;\n    append_main \"module %s = Ipv4.Make(%s)\"\n      (module_name t) (Impl.module_name t.ethernet);\n    newline_main ();\n    append_main \"let %s () =\" name;\n    append_main \"   %s () >>= function\" (Impl.name t.ethernet);\n    append_main \"   | `Error _ -> %s\" (driver_initialisation_error name);\n    append_main \"   | `Ok eth  ->\";\n    append_main \"   %s.connect eth >>= function\" mname;\n    append_main \"   | `Error _ -> %s\" (driver_initialisation_error \"IPV4\");\n    append_main \"   | `Ok ip   ->\";\n    append_main \"   let i = Ipaddr.V4.of_string_exn in\";\n    append_main \"   %s.set_ip ip (i %S) >>= fun () ->\"\n      mname (Ipaddr.V4.to_string t.config.address);\n    append_main \"   %s.set_ip_netmask ip (i %S) >>= fun () ->\"\n      mname (Ipaddr.V4.to_string t.config.netmask);\n    append_main \"   %s.set_ip_gateways ip [%s] >>= fun () ->\"\n      mname\n      (String.concat \"; \"\n         (List.map\n            (fun n -> Printf.sprintf \"(i %S)\" (Ipaddr.V4.to_string n))\n            t.config.gateways));\n    append_main \"   return (`Ok ip)\";\n    newline_main ()\n\n  let clean t =\n    Impl.clean t.ethernet\n\n  let update_path t root =\n    { t with ethernet = Impl.update_path t.ethernet root }\n\nend\n\ntype ipv6_config = (Ipaddr.V6.t, Ipaddr.V6.Prefix.t list) ip_config\n\nlet meta_ipv6_config t =\n  Printf.sprintf \"(Ipaddr.V6.of_string_exn %S, [%s], [%s])\"\n    (Ipaddr.V6.to_string t.address)\n    (String.concat \"; \"\n       (List.map (Printf.sprintf \"Ipaddr.V6.Prefix.of_string_exn %S\")\n          (List.map Ipaddr.V6.Prefix.to_string t.netmask)))\n    (String.concat \"; \"\n       (List.map (Printf.sprintf \"Ipaddr.V6.of_string_exn %S\")\n          (List.map Ipaddr.V6.to_string t.gateways)))\n\nmodule IPV6 = struct\n\n  type t = {\n    time    : time impl;\n    clock   : clock impl;\n    ethernet: ethernet impl;\n    config  : ipv6_config;\n  }\n  (* XXX: should the type if ipv4.id be ipv4.t ?\n     N.connect ethif |> N.set_ip up *)\n\n  let name t =\n    let key = \"ipv6\" ^ Impl.name t.time ^ Impl.name t.clock ^ Impl.name t.ethernet ^ meta_ipv6_config t.config in\n    Name.of_key key ~base:\"ipv6\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages t =\n    \"tcpip\" :: Impl.packages t.time @ Impl.packages t.clock @ Impl.packages t.ethernet\n\n  let libraries t  =\n    (match !mode with\n     | `Unix | `MacOSX -> [ \"tcpip.ipv6-unix\" ]\n     | `Xen  -> [ \"tcpip.ipv6\" ])\n    @ Impl.libraries t.time @ Impl.libraries t.clock @ Impl.libraries t.ethernet\n\n  let configure t =\n    let name = name t in\n    let mname = module_name t in\n    Impl.configure t.ethernet;\n    append_main \"module %s = Ipv6.Make(%s)(%s)(%s)\"\n      (module_name t) (Impl.module_name t.ethernet) (Impl.module_name t.time) (Impl.module_name t.clock);\n    newline_main ();\n    append_main \"let %s () =\" name;\n    append_main \"   %s () >>= function\" (Impl.name t.ethernet);\n    append_main \"   | `Error _ -> %s\" (driver_initialisation_error name);\n    append_main \"   | `Ok eth  ->\";\n    append_main \"   %s.connect eth >>= function\" mname;\n    append_main \"   | `Error _ -> %s\" (driver_initialisation_error name);\n    append_main \"   | `Ok ip   ->\";\n    append_main \"   let i = Ipaddr.V6.of_string_exn in\";\n    append_main \"   %s.set_ip ip (i %S) >>= fun () ->\"\n      mname (Ipaddr.V6.to_string t.config.address);\n    List.iter begin fun netmask ->\n      append_main \"   %s.set_ip_netmask ip (i %S) >>= fun () ->\"\n        mname (Ipaddr.V6.Prefix.to_string netmask)\n    end t.config.netmask;\n    append_main \"   %s.set_ip_gateways ip [%s] >>= fun () ->\"\n      mname\n      (String.concat \"; \"\n         (List.map\n            (fun n -> Printf.sprintf \"(i %S)\" (Ipaddr.V6.to_string n))\n            t.config.gateways));\n    append_main \"   return (`Ok ip)\";\n    newline_main ()\n\n  let clean t =\n    Impl.clean t.time;\n    Impl.clean t.clock;\n    Impl.clean t.ethernet\n\n  let update_path t root =\n    { t with\n      time = Impl.update_path t.time root;\n      clock = Impl.update_path t.clock root;\n      ethernet = Impl.update_path t.ethernet root }\n\nend\n\ntype v4\ntype v6\n\ntype 'a ip = IP\n\nlet ip = Type IP\n\ntype ipv4 = v4 ip\ntype ipv6 = v6 ip\n\nlet ipv4 : ipv4 typ = ip\nlet ipv6 : ipv6 typ = ip\n\nlet create_ipv4 net config =\n  let etif = etif net in\n  let t = {\n    IPV4.ethernet = etif;\n    config } in\n  impl ipv4 t (module IPV4)\n\nlet default_ipv4_conf =\n  let i = Ipaddr.V4.of_string_exn in\n  {\n    address  = i \"10.0.0.2\";\n    netmask  = i \"255.255.255.0\";\n    gateways = [i \"10.0.0.1\"];\n  }\n\nlet default_ipv4 net =\n  create_ipv4 net default_ipv4_conf\n\nlet create_ipv6\n    ?(time = default_time)\n    ?(clock = default_clock)\n    net config =\n  let etif = etif net in\n  let t = {\n    IPV6.ethernet = etif;\n    time; clock;\n    config\n  } in\n  impl ipv6 t (module IPV6)\n\nmodule UDP_direct (V : sig type t end) = struct\n\n  type t = V.t ip impl\n\n  let name t =\n    Name.of_key (\"udp\" ^ Impl.name t) ~base:\"udp\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages t =\n    Impl.packages t @ [ \"tcpip\" ]\n\n  let libraries t =\n    Impl.libraries t @ [ \"tcpip.udp\" ]\n\n  let configure t =\n    let name = name t in\n    Impl.configure t;\n    append_main \"module %s = Udp.Make(%s)\" (module_name t) (Impl.module_name t);\n    newline_main ();\n    append_main \"let %s () =\" name;\n    append_main \"   %s () >>= function\" (Impl.name t);\n    append_main \"   | `Error _ -> %s\" (driver_initialisation_error name);\n    append_main \"   | `Ok ip   -> %s.connect ip\" (module_name t);\n    newline_main ()\n\n  let clean t =\n    Impl.clean t\n\n  let update_path t root =\n    Impl.update_path t root\n\nend\n\nmodule UDPV4_socket = struct\n\n  type t = Ipaddr.V4.t option\n\n  let name _ = \"udpv4_socket\"\n\n  let module_name _ = \"Udpv4_socket\"\n\n  let packages t = [ \"tcpip\" ]\n\n  let libraries t =\n    match !mode with\n    | `Unix | `MacOSX -> [ \"tcpip.udpv4-socket\" ]\n    | `Xen  -> failwith \"No socket implementation available for Xen\"\n\n  let configure t =\n    append_main \"let %s () =\" (name t);\n    let ip = match t with\n      | None    -> \"None\"\n      | Some ip ->\n        Printf.sprintf \"Some (Ipaddr.V4.of_string_exn %s)\" (Ipaddr.V4.to_string ip)\n    in\n    append_main \" %s.connect %S\" (module_name t) ip;\n    newline_main ()\n\n  let clean t =\n    ()\n\n  let update_path t root =\n    t\n\nend\n\ntype 'a udp = UDP\n\ntype udpv4 = v4 udp\ntype udpv6 = v6 udp\n\nlet udp = Type UDP\nlet udpv4 : udpv4 typ = udp\nlet udpv6 : udpv6 typ = udp\n\nlet direct_udp (type v) (ip : v ip impl) =\n  impl udp ip (module UDP_direct (struct type t = v end))\n\nlet socket_udpv4 ip =\n  impl udpv4 ip (module UDPV4_socket)\n\nmodule TCP_direct (V : sig type t end) = struct\n\n  type t = {\n    clock : clock impl;\n    time  : time impl;\n    ip    : V.t ip impl;\n    random: random impl;\n  }\n\n  let name t =\n    let key = \"tcp\"\n              ^ Impl.name t.clock\n              ^ Impl.name t.time\n              ^ Impl.name t.ip in\n    Name.of_key key ~base:\"tcp\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages t =\n    \"tcpip\"\n    :: Impl.packages t.clock\n    @  Impl.packages t.time\n    @  Impl.packages t.ip\n    @  Impl.packages t.random\n\n  let libraries t =\n    \"tcpip.tcp\"\n    :: Impl.libraries t.clock\n    @  Impl.libraries t.time\n    @  Impl.libraries t.ip\n    @  Impl.libraries t.random\n\n  let configure t =\n    let name = name t in\n    Impl.configure t.clock;\n    Impl.configure t.time;\n    Impl.configure t.ip;\n    Impl.configure t.random;\n    append_main \"module %s = Tcp.Flow.Make(%s)(%s)(%s)(%s)\"\n      (module_name t)\n      (Impl.module_name t.ip)\n      (Impl.module_name t.time)\n      (Impl.module_name t.clock)\n      (Impl.module_name t.random);\n    newline_main ();\n    append_main \"let %s () =\" name;\n    append_main \"   %s () >>= function\" (Impl.name t.ip);\n    append_main \"   | `Error _ -> %s\" (driver_initialisation_error (Impl.name t.ip));\n    append_main \"   | `Ok ip   -> %s.connect ip\" (module_name t);\n    newline_main ()\n\n  let clean t =\n    Impl.clean t.clock;\n    Impl.clean t.time;\n    Impl.clean t.ip;\n    Impl.clean t.random\n\n  let update_path t root =\n    { clock  = Impl.update_path t.clock root;\n      ip     = Impl.update_path t.ip root;\n      time   = Impl.update_path t.time root;\n      random = Impl.update_path t.random root;\n    }\n\nend\n\nmodule TCPV4_socket = struct\n\n  type t = Ipaddr.V4.t option\n\n  let name _ = \"tcpv4_socket\"\n\n  let module_name _ = \"Tcpv4_socket\"\n\n  let packages t = [ \"tcpip\" ]\n\n  let libraries t =\n    match !mode with\n    | `Unix | `MacOSX -> [ \"tcpip.tcpv4-socket\" ]\n    | `Xen  -> failwith \"No socket implementation available for Xen\"\n\n  let configure t =\n    append_main \"let %s () =\" (name t);\n    let ip = match t with\n      | None    -> \"None\"\n      | Some ip ->\n        Printf.sprintf \"Some (Ipaddr.V4.of_string_exn %s)\" (Ipaddr.V4.to_string ip)\n    in\n    append_main \"  %s.connect %S\" (module_name t) ip;\n    newline_main ()\n\n  let clean t =\n    ()\n\n  let update_path t root =\n    t\n\nend\n\ntype 'a tcp = TCP\n\ntype tcpv4 = v4 tcp\ntype tcpv6 = v6 tcp\n\nlet tcp = Type TCP\nlet tcpv4 : tcpv4 typ = tcp\nlet tcpv6 : tcpv6 typ = tcp\n\nlet direct_tcp (type v)\n    ?(clock=default_clock) ?(random=default_random) ?(time=default_time) (ip : v ip impl) =\n  let module TCP_direct = TCP_direct (struct type t = v end) in\n  let t = { TCP_direct.clock; random; time; ip } in\n  impl tcp t (module TCP_direct)\n\nlet socket_tcpv4 ip =\n  impl tcpv4 ip (module TCPV4_socket)\n\nmodule STACKV4_direct = struct\n\n  type t = {\n    clock  : clock impl;\n    time   : time impl;\n    console: console impl;\n    network: network impl;\n    random : random impl;\n    config : [`DHCP | `IPV4 of ipv4_config];\n  }\n\n  let name t =\n    let key = \"stackv4\"\n              ^ Impl.name t.clock\n              ^ Impl.name t.time\n              ^ Impl.name t.console\n              ^ Impl.name t.network\n              ^ Impl.name t.random\n              ^ match t.config with\n              | `DHCP   -> \"dhcp\"\n              | `IPV4 i -> meta_ipv4_config i in\n    Name.of_key key ~base:\"stackv4\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages t =\n    \"tcpip\"\n    :: Impl.packages t.clock\n    @  Impl.packages t.time\n    @  Impl.packages t.console\n    @  Impl.packages t.network\n    @  Impl.packages t.random\n\n  let libraries t =\n    \"tcpip.stack-direct\"\n    :: \"mirage.runtime\"\n    :: Impl.libraries t.clock\n    @  Impl.libraries t.time\n    @  Impl.libraries t.console\n    @  Impl.libraries t.network\n    @  Impl.libraries t.random\n\n  let configure t =\n    let name = name t in\n    Impl.configure t.clock;\n    Impl.configure t.time;\n    Impl.configure t.console;\n    Impl.configure t.network;\n    Impl.configure t.random;\n    append_main \"module %s = struct\" (module_name t);\n    append_main \"  module E = Ethif.Make(%s)\" (Impl.module_name t.network);\n    append_main \"  module I = Ipv4.Make(E)\";\n    append_main \"  module U = Udp.Make(I)\";\n    append_main \"  module T = Tcp.Flow.Make(I)(%s)(%s)(%s)\"\n      (Impl.module_name t.time)\n      (Impl.module_name t.clock)\n      (Impl.module_name t.random);\n    append_main \"  module S = Tcpip_stack_direct.Make(%s)(%s)(%s)(%s)(E)(I)(U)(T)\"\n      (Impl.module_name t.console)\n      (Impl.module_name t.time)\n      (Impl.module_name t.random)\n      (Impl.module_name t.network);\n    append_main \"  include S\";\n    append_main \"end\";\n    newline_main ();\n    append_main \"let %s () =\" name;\n    append_main \"  %s () >>= function\" (Impl.name t.console);\n    append_main \"  | `Error _    -> %s\"\n      (driver_initialisation_error (Impl.name t.console));\n    append_main \"  | `Ok console ->\";\n    append_main \"  %s () >>= function\" (Impl.name t.network);\n    append_main \"  | `Error e      ->\";\n    let net_init_error_msg_fn = \"Mirage_runtime.string_of_network_init_error\" in\n    append_main \"    fail (Failure (%s %S e))\"\n      net_init_error_msg_fn (Impl.name t.network);\n    append_main \"  | `Ok interface ->\";\n    append_main \"  let config = {\";\n    append_main \"    V1_LWT.name = %S;\" name;\n    append_main \"    console; interface;\";\n    begin match t.config with\n      | `DHCP   -> append_main \"    mode = `DHCP;\"\n      | `IPV4 i -> append_main \"    mode = `IPv4 %s;\" (meta_ipv4_config i);\n    end;\n    append_main \"  } in\";\n    append_main \"  %s.connect config\" (module_name t);\n    newline_main ()\n\n  let clean t =\n    Impl.clean t.clock;\n    Impl.clean t.time;\n    Impl.clean t.console;\n    Impl.clean t.network;\n    Impl.clean t.random\n\n  let update_path t root =\n    { t with\n      clock   = Impl.update_path t.clock root;\n      time    = Impl.update_path t.time root;\n      console = Impl.update_path t.console root;\n      network = Impl.update_path t.network root;\n      random  = Impl.update_path t.random root;\n    }\n\nend\n\nmodule STACKV4_socket = struct\n\n  type t = {\n    console: console impl;\n    ipv4s  : Ipaddr.V4.t list;\n  }\n\n  let meta_ips ips =\n    String.concat \"; \"\n      (List.map (fun x ->\n           Printf.sprintf \"Ipaddr.V4.of_string_exn %S\" (Ipaddr.V4.to_string x)\n         ) ips)\n\n  let name t =\n    let key = \"stackv4\" ^ Impl.name t.console ^ meta_ips t.ipv4s in\n    Name.of_key key ~base:\"stackv4\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages t =\n    \"tcpip\" :: Impl.packages t.console\n\n  let libraries t =\n    \"tcpip.stack-socket\" :: Impl.libraries t.console\n\n  let configure t =\n    let name = name t in\n    Impl.configure t.console;\n    append_main \"module %s = Tcpip_stack_socket.Make(%s)\"\n      (module_name t) (Impl.module_name t.console);\n    newline_main ();\n    append_main \"let %s () =\" name;\n    append_main \"  %s () >>= function\" (Impl.name t.console);\n    append_main \"  | `Error _    -> %s\"\n      (driver_initialisation_error (Impl.name t.console));\n    append_main \"  | `Ok console ->\";\n    append_main \"  let config = {\";\n    append_main \"    V1_LWT.name = %S;\" name;\n    append_main \"    console; interface = [%s];\" (meta_ips t.ipv4s);\n    append_main \"    mode = ();\";\n    append_main \"  } in\";\n    append_main \"  %s.connect config\" (module_name t);\n    newline_main ()\n\n  let clean t =\n    Impl.clean t.console\n\n  let update_path t root =\n    { t with console = Impl.update_path t.console root }\n\nend\n\ntype stackv4 = STACKV4\n\nlet stackv4 = Type STACKV4\n\nlet direct_stackv4_with_dhcp\n    ?(clock=default_clock)\n    ?(random=default_random)\n    ?(time=default_time)\n    console network =\n  let t = {\n    STACKV4_direct.console; network; time; clock; random;\n    config = `DHCP } in\n  impl stackv4 t (module STACKV4_direct)\n\nlet direct_stackv4_with_default_ipv4\n    ?(clock=default_clock)\n    ?(random=default_random)\n    ?(time=default_time)\n    console network =\n  let t = {\n    STACKV4_direct.console; network; clock; time; random;\n    config = `IPV4 default_ipv4_conf;\n  } in\n  impl stackv4 t (module STACKV4_direct)\n\nlet direct_stackv4_with_static_ipv4\n    ?(clock=default_clock)\n    ?(random=default_random)\n    ?(time=default_time)\n    console network ipv4 =\n  let t = {\n    STACKV4_direct.console; network; clock; time; random;\n    config = `IPV4 ipv4;\n  } in\n  impl stackv4 t (module STACKV4_direct)\n\nlet socket_stackv4 console ipv4s =\n  impl stackv4 { STACKV4_socket.console; ipv4s } (module STACKV4_socket)\n\nmodule Channel_over_TCP (V : sig type t end) = struct\n\n  type t = V.t tcp impl\n\n  let name t =\n    let key = \"channel\" ^ Impl.name t in\n    Name.of_key key ~base:\"channel\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages _ =\n    [ \"mirage-tcpip\" ]\n\n  let libraries _ =\n    [ \"tcpip.channel\" ]\n\n  let configure t =\n    Impl.configure t;\n    append_main \"module %s = Channel.Make(%s)\" (module_name t) (Impl.module_name t);\n    newline_main ();\n    append_main \"let %s () =\" (name t);\n    append_main \"  %s () >>= function\" (Impl.name t);\n    append_main \"  | `Error _    -> %s\" (driver_initialisation_error (Impl.name t));\n    append_main \"  | `Ok console ->\";\n    append_main \"  let flow = %s.create config in\" (module_name t);\n    append_main \"  return (`Ok flow)\";\n    newline_main ()\n\n  let clean t =\n    Impl.clean t\n\n  let update_path t root =\n    Impl.update_path t root\n\nend\n\ntype channel = CHANNEL\n\nlet channel = Type CHANNEL\n\nlet channel_over_tcp (type v) (flow : v tcp impl) =\n  impl channel flow (module Channel_over_TCP (struct type t = v end))\n\nmodule VCHAN_localhost = struct\n\n  type uuid = string\n  type t = uuid\n\n  let name t =\n    let key = \"in_memory\" in\n    Name.of_key key ~base:\"vchan\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages t =\n    [ \"mirage-conduit\" ]\n\n  let libraries t =\n    [ \"conduit.mirage\" ]\n\n  let configure t =\n    append_main \"module %s = Conduit_localhost\" (module_name t);\n    newline_main ();\n    append_main \"let %s = %s.register %S\" (name t) (module_name t) t;\n    newline_main ()\n\n  let clean t = ()\n\n  let update_path t root = t\n\nend\n\nmodule VCHAN_xenstore = struct\n\n  type uuid = string\n  type t = string\n\n  let name t =\n    let key = \"xen\" in\n    Name.of_key key ~base:\"vchan\"\n\n  let module_name t =\n    String.capitalize (name t)\n\n  let packages t =\n    match !mode with\n    |`Xen -> [ \"vchan\"; \"mirage-xen\"; \"xen-evtchn\"; \"xen-gnt\" ]\n    |`Unix | `MacOSX -> [ \"vchan\"; \"xen-evtchn\"; \"xen-gnt\"]\n    (* TODO: emit a failure on MacOSX? *)\n\n  let libraries t =\n    match !mode with\n    |`Xen -> [ \"conduit.mirage-xen\" ]\n    |`Unix | `MacOSX-> [ \"vchan\" ]\n\n  let configure t =\n    let m =\n      match !mode with\n      |`Xen -> \"Conduit_xenstore\"\n      |`Unix | `MacOSX -> \"Vchan_lwt_unix.M\"\n    in\n    append_main \"module %s = %s\" (module_name t) m;\n    newline_main ();\n    append_main \"let %s = %s.register %S\" (name t) (module_name t) t;\n    newline_main ()\n\n  let clean t = ()\n\n  let update_path t root = t\n\nend\n\ntype vchan = STACK4\n\nlet vchan = Type STACK4\n\nlet vchan_localhost ?(uuid=\"localhost\") () =\n  impl vchan uuid (module VCHAN_localhost)\n\nlet vchan_xen ?(uuid=\"localhost\") () =\n  impl vchan uuid (module VCHAN_xenstore)\n\nlet vchan_default ?uuid () =\n  match !mode with\n  | `Xen -> vchan_xen ?uuid ()\n  | `Unix | `MacOSX -> vchan_localhost ?uuid ()\n\nmodule Conduit = struct\n  type t =\n    [ `Stack of stackv4 impl * vchan impl ]\n\n  let name t =\n    let key = \"conduit\" ^ match t with\n     | `Stack (s,v) ->\n          Printf.sprintf \"%s_%s\" (Impl.name s) (Impl.name v) in\n    Name.of_key key ~base:\"conduit\"\n\n  let module_name_core t =\n    String.capitalize (name t)\n\n  let module_name t =\n    module_name_core t\n\n  let packages t =\n    [ \"conduit\"; \"mirage-types\"; \"vchan\" ] @\n    match t with\n    | `Stack (s,v) -> Impl.packages s @ (Impl.packages v)\n\n  let libraries t =\n    [ \"conduit.mirage\" ] @\n    match t with\n    | `Stack (s,v) -> Impl.libraries s @ (Impl.libraries v)\n\n  let configure t =\n    begin match t with\n      | `Stack (s,v) ->\n        Impl.configure s;\n        Impl.configure v;\n        append_main \"module %s = Conduit_mirage.Make(%s)(%s)\"\n          (module_name_core t) (Impl.module_name s) (Impl.module_name v);\n    end;\n    newline_main ();\n    append_main \"let %s () =\" (name t);\n    let (stack_subname, vchan_subname) = match t with\n      | `Stack (s,v) -> Impl.name s, Impl.name v in\n\n    append_main \"  %s () >>= function\" stack_subname;\n    append_main \"  | `Error _  -> %s\" (driver_initialisation_error stack_subname);\n    append_main \"  | `Ok %s ->\" stack_subname;\n    append_main \"  %s >>= fun %s ->\" vchan_subname vchan_subname;\n    append_main \"  %s.init ~peer:%s ~stack:%s () >>= fun %s ->\"\n      (module_name_core t) vchan_subname stack_subname (name t);\n    append_main \"  return (`Ok %s)\" (name t);\n    newline_main ()\n\n  let clean = function\n    | `Stack (s,v) -> Impl.clean s; Impl.clean v\n\n  let update_path t root =\n    match t with\n    | `Stack (s,v) ->\n        `Stack ((Impl.update_path s root), (Impl.update_path v root))\n\nend\n\ntype conduit = Conduit\n\nlet conduit = Type Conduit\n\nlet conduit_direct ?(vchan=vchan_localhost ()) stack =\n  impl conduit (`Stack (stack,vchan)) (module Conduit)\n\ntype conduit_client = [\n  | `TCP of Ipaddr.t * int\n  | `Vchan of string list\n]\n\ntype conduit_server = [\n  | `TCP of [ `Port of int ]\n  | `Vchan of string list\n]\n\nmodule Resolver_unix = struct\n  type t = unit\n\n  let name t =\n    let key = \"resolver_unix\" in\n    Name.of_key key ~base:\"resolver\"\n\n  let module_name_core t =\n    String.capitalize (name t)\n\n  let module_name t =\n      module_name_core t\n\n  let packages t =\n    match !mode with\n    |`Unix | `MacOSX -> [ \"mirage-conduit\" ]\n    |`Xen -> failwith \"Resolver_unix not supported on Xen\"\n\n  let libraries t =\n    [ \"conduit.mirage\"; \"conduit.lwt-unix\" ]\n\n  let configure t =\n    append_main \"module %s = Resolver_lwt\" (module_name t);\n    append_main \"let %s () =\" (name t);\n    append_main \"  return (`Ok Resolver_lwt_unix.system)\";\n    newline_main ()\n\n  let clean t = ()\n\n  let update_path t root = t\n\nend\n\nmodule Resolver_direct = struct\n  type t =\n    [ `DNS of stackv4 impl * Ipaddr.V4.t option * int option ]\n\n  let name t =\n    let key = \"resolver\" ^ match t with\n     | `DNS (s,_,_) -> Impl.name s in\n    Name.of_key key ~base:\"resolver\"\n\n  let module_name_core t =\n    String.capitalize (name t)\n\n  let module_name t =\n    (module_name_core t) ^ \"_res\"\n\n  let packages t =\n    [ \"dns\"; \"tcpip\" ] @\n    match t with\n    | `DNS (s,_,_) -> Impl.packages s\n\n  let libraries t =\n    [ \"dns.mirage\" ] @\n    match t with\n    | `DNS (s,_,_) -> Impl.libraries s\n\n  let configure t =\n    begin match t with\n      | `DNS (s,_,_) ->\n        Impl.configure s;\n        append_main \"module %s = Resolver_lwt\" (module_name t);\n        append_main \"module %s_dns = Dns_resolver_mirage.Make(OS.Time)(%s)\"\n          (module_name_core t) (Impl.module_name s);\n        append_main \"module %s = Resolver_mirage.Make(%s_dns)\"\n          (module_name_core t) (module_name_core t);\n    end;\n    newline_main ();\n    append_main \"let %s () =\" (name t);\n    let subname = match t with\n      | `DNS (s,_,_) -> Impl.name s in\n    append_main \"  %s () >>= function\" subname;\n    append_main \"  | `Error _  -> %s\" (driver_initialisation_error subname);\n    append_main \"  | `Ok %s ->\" subname;\n    let res_ns = match t with\n     | `DNS (_,None,_) -> \"None\"\n     | `DNS (_,Some ns,_) ->\n         Printf.sprintf \"Ipaddr.V4.of_string %S\" (Ipaddr.V4.to_string ns) in\n    append_main \"  let ns = %s in\" res_ns;\n    let res_ns_port = match t with\n     | `DNS (_,_,None) -> \"None\"\n     | `DNS (_,_,Some ns_port) -> Printf.sprintf \"Some %d\" ns_port in\n    append_main \"  let ns_port = %s in\" res_ns_port;\n    append_main \"  let res = %s.init ?ns ?ns_port ~stack:%s () in\" (module_name_core t) subname;\n    append_main \"  return (`Ok res)\";\n    newline_main ()\n\n  let clean = function\n    | `DNS (s,_,_) -> Impl.clean s\n\n  let update_path t root =\n    match t with\n    | `DNS (s,a,b) -> `DNS (Impl.update_path s root, a, b)\n\nend\n\ntype resolver = Resolver\n\nlet resolver = Type Resolver\n\nlet resolver_dns ?ns ?ns_port stack =\n  impl resolver (`DNS (stack, ns, ns_port)) (module Resolver_direct)\n\nlet resolver_unix_system =\n  impl resolver () (module Resolver_unix)\n\nmodule HTTP = struct\n\n  type t =\n    [ `Channel of channel impl\n    | `Stack of conduit_server * conduit impl ]\n\n  let name t =\n    let key = \"http\" ^ match t with\n      | `Channel c    -> Impl.name c\n      | `Stack (_, c) -> Impl.name c in\n    Name.of_key key ~base:\"http\"\n\n  let module_name_core t =\n    String.capitalize (name t)\n\n  let module_name t =\n    module_name_core t ^ \".Server\"\n\n  let packages t =\n    [ \"mirage-http\" ] @\n    match t with\n    | `Channel c    -> Impl.packages c\n    | `Stack (_, c) -> Impl.packages c\n\n  let libraries t =\n    [ \"mirage-http\" ] @\n    match t with\n    | `Channel c    -> Impl.libraries c\n    | `Stack (_, c) -> Impl.libraries c\n\n  let configure t =\n    begin match t with\n      | `Channel c ->\n        Impl.configure c;\n        append_main \"module %s = HTTP.Make(%s)\" (module_name_core t) (Impl.module_name c)\n      | `Stack (_, c) ->\n        Impl.configure c;\n        append_main \"module %s = HTTP.Make(%s)\" (module_name_core t) (Impl.module_name c)\n    end;\n    newline_main ();\n    let subname = match t with\n      | `Channel c   -> Impl.name c\n      | `Stack (_,c) -> Impl.name c in\n    append_main \"let %s () =\" (name t);\n    append_main \"  %s () >>= function\" subname;\n    append_main \"  | `Error _  -> %s\" (driver_initialisation_error subname);\n    append_main \"  | `Ok %s ->\" subname;\n    begin match t with\n      | `Channel c   -> failwith \"TODO\"\n      | `Stack (m,c) ->\n        append_main \"  let listen spec =\";\n        append_main \"    let ctx = %s in\" (Impl.name c);\n        append_main \"    let mode = %s in\"\n          (match m with\n           |`TCP (`Port port) -> Printf.sprintf \"`TCP (`Port %d)\" port\n           |`Vchan l -> failwith \"Vchan not supported yet in server\"\n          );\n        append_main \"    %s.serve ~ctx ~mode (%s.Server.listen spec)\" (Impl.module_name c) (module_name_core t);\n        append_main \"  in\";\n        append_main \"  return (`Ok listen)\";\n    end;\n    newline_main ()\n\n  let clean = function\n    | `Channel c    -> Impl.clean c\n    | `Stack (_,c) -> Impl.clean c\n\n  let update_path t root =\n    match t with\n    | `Channel c    -> `Channel (Impl.update_path c root)\n    | `Stack (m, c) -> `Stack (m, Impl.update_path c root)\n\nend\n\ntype http = HTTP\n\nlet http = Type HTTP\n\nlet http_server_of_channel chan =\n  impl http (`Channel chan) (module HTTP)\n\nlet http_server mode conduit =\n  impl http (`Stack (mode, conduit)) (module HTTP)\n\ntype job = JOB\n\nlet job = Type JOB\n\nmodule Job = struct\n\n  type t = {\n    name: string;\n    impl: job impl;\n  }\n\n  let create impl =\n    let name = Name.create \"job\" in\n    { name; impl }\n\n  let name t =\n    t.name\n\n  let module_name t =\n    \"Job_\" ^ t.name\n\n  let packages t =\n    Impl.packages t.impl\n\n  let libraries t =\n    Impl.libraries t.impl\n\n  let configure t =\n    Impl.configure t.impl;\n    newline_main ()\n\n  let clean t =\n    Impl.clean t.impl\n\n  let update_path t root =\n    { t with impl = Impl.update_path t.impl root }\n\nend\n\nmodule Tracing = struct\n  type t = {\n    size : int;\n  }\n\n  let unix_trace_file = \"trace.ctf\"\n\n  let packages _ = StringSet.singleton \"mirage-profile\"\n\n  let libraries _ =\n    match !mode with\n    | `Unix | `MacOSX -> StringSet.singleton \"mirage-profile.unix\"\n    | `Xen  -> StringSet.singleton \"mirage-profile.xen\"\n\n  let configure t =\n    if Sys.command \"ocamlfind query lwt.tracing 2>/dev/null\" <> 0 then (\n      flush stdout;\n      error \"lwt.tracing module not found. Hint:\\n\\\n             opam pin add lwt 'https://github.com/mirage/lwt.git#tracing'\"\n    );\n\n    append_main \"let () = \";\n    begin match !mode with\n    | `Unix | `MacOSX ->\n        append_main \"  let buffer = MProf_unix.mmap_buffer ~size:%d %S in\" t.size unix_trace_file;\n        append_main \"  let trace_config = MProf.Trace.Control.make buffer MProf_unix.timestamper in\";\n        append_main \"  MProf.Trace.Control.start trace_config\";\n    | `Xen  ->\n        append_main \"  let trace_pages = MProf_xen.make_shared_buffer ~size:%d in\" t.size;\n        append_main \"  let buffer = trace_pages |> Io_page.to_cstruct |> Cstruct.to_bigarray in\";\n        append_main \"  let trace_config = MProf.Trace.Control.make buffer MProf_xen.timestamper in\";\n        append_main \"  MProf.Trace.Control.start trace_config;\";\n        append_main \"  MProf_xen.share_with (module Gnt.Gntshr) (module OS.Xs) ~domid:0 trace_pages\";\n        append_main \"  |> OS.Main.run\";\n    end;\n    newline_main ()\nend\n\ntype tracing = Tracing.t\n\nlet mprof_trace ~size () =\n  { Tracing.size }\n\ntype t = {\n  name: string;\n  root: string;\n  jobs: job impl list;\n  tracing: tracing option;\n}\n\nlet t = ref None\n\nlet config_file = ref None\n\nlet reset () =\n  config_file := None;\n  t := None\n\nlet set_config_file f =\n  config_file := Some f\n\nlet get_config_file () =\n  match !config_file with\n  | None -> Sys.getcwd () / \"config.ml\"\n  | Some f -> f\n\nlet update_path t root =\n  { t with jobs = List.map (fun j -> Impl.update_path j root) t.jobs }\n\nlet register ?tracing name jobs =\n  let root = match !config_file with\n    | None   -> failwith \"no config file\"\n    | Some f -> Filename.dirname f in\n  t := Some { name; jobs; root; tracing }\n\nlet registered () =\n  match !t with\n  | None   -> { name = \"empty\"; jobs = []; root = Sys.getcwd (); tracing = None }\n  | Some t -> t\n\nlet ps = ref StringSet.empty\n\nlet add_to_opam_packages p =\n  ps := StringSet.union (StringSet.of_list p) !ps\n\nlet packages t =\n  let m = match !mode with\n    | `Unix | `MacOSX -> \"mirage-unix\"\n    | `Xen  -> \"mirage-xen\" in\n  let ps = StringSet.add m !ps in\n  let ps = match t.tracing with\n    | None -> ps\n    | Some tracing -> StringSet.union (Tracing.packages tracing) ps in\n  let ps = List.fold_left (fun set j ->\n      let ps = StringSet.of_list (Impl.packages j) in\n      StringSet.union ps set\n    ) ps t.jobs in\n  StringSet.elements ps\n\nlet ls = ref StringSet.empty\n\nlet add_to_ocamlfind_libraries l =\n  ls := StringSet.union !ls (StringSet.of_list l)\n\nlet libraries t =\n  let m = match !mode with\n    | `Unix | `MacOSX -> \"mirage-types.lwt\"\n    | `Xen  -> \"mirage-types.lwt\" in\n  let ls = StringSet.add m !ls in\n  let ls = match t.tracing with\n    | None -> ls\n    | Some tracing -> StringSet.union (Tracing.libraries tracing) ls in\n  let ls = List.fold_left (fun set j ->\n      let ls = StringSet.of_list (Impl.libraries j) in\n      StringSet.union ls set\n    ) ls t.jobs in\n  StringSet.elements ls\n\nlet configure_myocamlbuild_ml t =\n  let minor, major = ocaml_version () in\n  if minor < 4 || major < 1 then (\n    (* Previous ocamlbuild versions weren't able to understand the\n       --output-obj rules *)\n    let file = t.root / \"myocamlbuild.ml\" in\n    let oc = open_out file in\n    append oc \"(* %s *)\" generated_by_mirage;\n    newline oc;\n    append oc\n      \"open Ocamlbuild_pack;;\\n\\\n       open Ocamlbuild_plugin;;\\n\\\n       open Ocaml_compiler;;\\n\\\n       \\n\\\n       let native_link_gen linker =\\n\\\n      \\  link_gen \\\"cmx\\\" \\\"cmxa\\\" !Options.ext_lib [!Options.ext_obj; \\\"cmi\\\"] linker;;\\n\\\n       \\n\\\n       let native_output_obj x = native_link_gen ocamlopt_link_prog\\n\\\n      \\  (fun tags -> tags++\\\"ocaml\\\"++\\\"link\\\"++\\\"native\\\"++\\\"output_obj\\\") x;;\\n\\\n       \\n\\\n       rule \\\"ocaml: cmx* & o* -> native.o\\\"\\n\\\n      \\  ~tags:[\\\"ocaml\\\"; \\\"native\\\"; \\\"output_obj\\\" ]\\n\\\n      \\  ~prod:\\\"%%.native.o\\\" ~deps:[\\\"%%.cmx\\\"; \\\"%%.o\\\"]\\n\\\n      \\  (native_output_obj \\\"%%.cmx\\\" \\\"%%.native.o\\\");;\\n\\\n       \\n\\\n       \\n\\\n       let byte_link_gen = link_gen \\\"cmo\\\" \\\"cma\\\" \\\"cma\\\" [\\\"cmo\\\"; \\\"cmi\\\"];;\\n\\\n       let byte_output_obj = byte_link_gen ocamlc_link_prog\\n\\\n      \\  (fun tags -> tags++\\\"ocaml\\\"++\\\"link\\\"++\\\"byte\\\"++\\\"output_obj\\\");;\\n\\\n       \\n\\\n       rule \\\"ocaml: cmo* -> byte.o\\\"\\n\\\n      \\  ~tags:[\\\"ocaml\\\"; \\\"byte\\\"; \\\"link\\\"; \\\"output_obj\\\" ]\\n\\\n       ~prod:\\\"%%.byte.o\\\" ~dep:\\\"%%.cmo\\\"\\n\\\n      \\  (byte_output_obj \\\"%%.cmo\\\" \\\"%%.byte.o\\\");;\";\n    close_out oc\n  )\n\nlet clean_myocamlbuild_ml t =\n  remove (t.root / \"myocamlbuild.ml\")\n\nlet configure_main_libvirt_xml t =\n  let file = t.root / t.name ^ \"_libvirt.xml\" in\n  let oc = open_out file in\n  append oc \"<!-- %s -->\" generated_by_mirage;\n  append oc \"<domain type='xen'>\";\n  append oc \"    <name>%s</name>\" t.name;\n  append oc \"    <memory unit='KiB'>262144</memory>\";\n  append oc \"    <currentMemory unit='KiB'>262144</currentMemory>\";\n  append oc \"    <vcpu placement='static'>1</vcpu>\";\n  append oc \"    <os>\";\n  append oc \"        <type arch='armv7l' machine='xenpv'>linux</type>\";\n  append oc \"        <kernel>%s/mir-%s.xen</kernel>\" t.root t.name;\n  append oc \"        <cmdline> </cmdline>\"; (* the libxl driver currently needs an empty cmdline to be able to start the domain on arm - due to this? http://lists.xen.org/archives/html/xen-devel/2014-02/msg02375.html *)\n  append oc \"    </os>\";\n  append oc \"    <clock offset='utc' adjustment='reset'/>\";\n  append oc \"    <on_crash>preserve</on_crash>\";\n  append oc \"    <!-- \";\n  append oc \"    You must define network and block interfaces manually.\";\n  append oc \"    See http://libvirt.org/drvxen.html for information about converting .xl-files to libvirt xml automatically.\";\n  append oc \"    -->\";\n  append oc \"    <devices>\";\n  append oc \"        <!--\";\n  append oc \"        The disk configuration is defined here:\";\n  append oc \"        http://libvirt.org/formatstorage.html.\";\n  append oc \"        An example would look like:\";\n  append oc\"         <disk type='block' device='disk'>\";\n  append oc \"            <driver name='phy'/>\";\n  append oc \"            <source dev='/dev/loop0'/>\";\n  append oc \"            <target dev='' bus='xen'/>\";\n  append oc \"        </disk>\";\n  append oc \"        -->\";\n  append oc \"        <!-- \";\n  append oc \"        The network configuration is defined here:\";\n  append oc \"        http://libvirt.org/formatnetwork.html\";\n  append oc \"        An example would look like:\";\n  append oc \"        <interface type='bridge'>\";\n  append oc \"            <mac address='c0:ff:ee:c0:ff:ee'/>\";\n  append oc \"            <source bridge='br0'/>\";\n  append oc \"        </interface>\";\n  append oc \"        -->\";\n  append oc \"        <console type='pty'>\";\n  append oc \"            <target type='xen' port='0'/>\";\n  append oc \"        </console>\";\n  append oc \"    </devices>\";\n  append oc \"</domain>\";\n  close_out oc\n\nlet clean_main_libvirt_xml t =\n  remove (t.root / t.name ^ \"_libvirt.xml\")\n\nlet configure_main_xl t =\n  let file = t.root / t.name ^ \".xl\" in\n  let oc = open_out file in\n  append oc \"# %s\" generated_by_mirage;\n  newline oc;\n  append oc \"name = '%s'\" t.name;\n  append oc \"kernel = '%s/mir-%s.xen'\" t.root t.name;\n  append oc \"builder = 'linux'\";\n  append oc \"memory = 256\";\n  append oc \"on_crash = 'preserve'\";\n  newline oc;\n  append oc \"# You must define the network and block interfaces manually.\";\n  newline oc;\n  append oc \"# The disk configuration is defined here:\";\n  append oc \"# http://xenbits.xen.org/docs/4.3-testing/misc/xl-disk-configuration.txt\";\n  append oc \"# An example would look like:\";\n  append oc \"# disk = [ '/dev/loop0,,xvda' ]\";\n  newline oc;\n  append oc \"# The network configuration is defined here:\";\n  append oc \"# http://xenbits.xen.org/docs/4.3-testing/misc/xl-network-configuration.html\";\n  append oc \"# An example would look like:\";\n  append oc \"# vif = [ 'mac=c0:ff:ee:c0:ff:ee,bridge=br0' ]\";\n  close_out oc\n\nlet clean_main_xl t =\n  remove (t.root / t.name ^ \".xl\")\n\nlet configure_main_xe t =\n  let file = t.root / t.name ^ \".xe\" in\n  let oc = open_out file in\n  append oc \"#!/bin/sh\";\n  append oc \"# %s\" generated_by_mirage;\n  newline oc;\n  append oc \"set -e\";\n  newline oc;\n  append oc \"# Dependency: xe\";\n  append oc \"command -v xe >/dev/null 2>&1 || { echo >&2 \\\"I require xe but it's not installed.  Aborting.\\\"; exit 1; }\";\n  append oc \"# Dependency: xe-unikernel-upload\";\n  append oc \"command -v xe-unikernel-upload >/dev/null 2>&1 || { echo >&2 \\\"I require xe-unikernel-upload but it's not installed.  Aborting.\\\"; exit 1; }\";\n  append oc \"# Dependency: a $HOME/.xe\";\n  append oc \"if [ ! -e $HOME/.xe ]; then\";\n  append oc \"  echo Please create a config file for xe in $HOME/.xe which contains:\";\n  append oc \"  echo server='<IP or DNS name of the host running xapi>'\";\n  append oc \"  echo username=root\";\n  append oc \"  echo password=password\";\n  append oc \"  exit 1\";\n  append oc \"fi\";\n  newline oc;\n  append oc \"echo Uploading VDI containing unikernel\";\n  append oc \"VDI=$(xe-unikernel-upload --path %s/mir-%s.xen)\" t.root t.name;\n  append oc \"echo VDI=$VDI\";\n  append oc \"echo Creating VM metadata\";\n  append oc \"VM=$(xe vm-create name-label=%s)\" t.name;\n  append oc \"echo VM=$VM\";\n  append oc \"xe vm-param-set uuid=$VM PV-bootloader=pygrub\";\n  append oc \"echo Adding network interface connected to xenbr0\";\n  append oc \"ETH0=$(xe network-list bridge=xenbr0 params=uuid --minimal)\";\n  append oc \"VIF=$(xe vif-create vm-uuid=$VM network-uuid=$ETH0 device=0)\";\n  append oc \"echo Atting block device and making it bootable\";\n  append oc \"VBD=$(xe vbd-create vm-uuid=$VM vdi-uuid=$VDI device=0)\";\n  append oc \"xe vbd-param-set uuid=$VBD bootable=true\";\n  append oc \"xe vbd-param-set uuid=$VBD other-config:owner=true\";\n  append oc \"echo Starting VM\";\n  append oc \"xe vm-start vm=%s\" t.name;\n  close_out oc;\n  Unix.chmod file 0o755\n\nlet clean_main_xe t =\n  remove (t.root / t.name ^ \".xe\")\n\n(* Get the linker flags for any extra C objects we depend on.\n * This is needed when building a Xen image as we do the link manually. *)\nlet get_extra_ld_flags ~filter pkgs =\n  let output = read_command\n    \"ocamlfind query -r -format '%%d\\t%%(xen_linkopts)' -predicates native %s\"\n    (String.concat \" \" pkgs) in\n  split output '\\n'\n  |> List.fold_left (fun acc line ->\n    match cut_at line '\\t' with\n    | None -> acc\n    | Some (dir, ldflags) -> Printf.sprintf \"-L%s %s\" dir ldflags :: acc\n  ) []\n\nlet configure_makefile t =\n  let file = t.root / \"Makefile\" in\n  let pkgs = \"lwt.syntax\" :: libraries t in\n  let libraries_str =\n    match pkgs with\n    | [] -> \"\"\n    | ls -> \"-pkgs \" ^ String.concat \",\" ls in\n  let packages = String.concat \" \" (packages t) in\n  let oc = open_out file in\n  append oc \"# %s\" generated_by_mirage;\n  newline oc;\n  append oc \"LIBS   = %s\" libraries_str;\n  append oc \"PKGS   = %s\" packages;\n  begin match !mode with\n    | `Xen  ->\n      append oc \"SYNTAX = -tags \\\"syntax(camlp4o),annot,bin_annot,strict_sequence,principal\\\"\\n\";\n      append oc \"SYNTAX += -tag-line \\\"<static*.*>: -syntax(camlp4o)\\\"\\n\";\n      append oc \"FLAGS  = -cflag -g -lflags -g,-linkpkg,-dontlink,unix\\n\";\n      append oc \"XENLIB = $(shell ocamlfind query mirage-xen)\\n\"\n    | `Unix ->\n      append oc \"SYNTAX = -tags \\\"syntax(camlp4o),annot,bin_annot,strict_sequence,principal\\\"\\n\";\n      append oc \"SYNTAX += -tag-line \\\"<static*.*>: -syntax(camlp4o)\\\"\\n\";\n      append oc \"FLAGS  = -cflag -g -lflags -g,-linkpkg\\n\"\n    | `MacOSX ->\n      append oc \"SYNTAX = -tags \\\"syntax(camlp4o),annot,bin_annot,strict_sequence,principal,thread\\\"\\n\";\n      append oc \"SYNTAX += -tag-line \\\"<static*.*>: -syntax(camlp4o)\\\"\\n\";\n      append oc \"FLAGS  = -cflag -g -lflags -g,-linkpkg\\n\"\n  end;\n  append oc \"BUILD  = ocamlbuild -use-ocamlfind $(LIBS) $(SYNTAX) $(FLAGS)\\n\\\n             OPAM   = opam\\n\\n\\\n             export PKG_CONFIG_PATH=$(shell opam config var prefix)/lib/pkgconfig\\n\\n\\\n             export OPAMVERBOSE=1\\n\\\n             export OPAMYES=1\";\n  newline oc;\n  append oc \".PHONY: all depend clean build main.native\\n\\\n             all: build\\n\\\n             \\n\\\n             depend:\\n\\\n             \\t$(OPAM) install $(PKGS) --verbose\\n\\\n             \\n\\\n             main.native:\\n\\\n             \\t$(BUILD) main.native\\n\\\n             \\n\\\n             main.native.o:\\n\\\n             \\t$(BUILD) main.native.o\";\n  newline oc;\n\n  (* On ARM, we must convert the ELF image to an ARM boot executable zImage,\n   * while on x86 we leave it as it is. *)\n  let generate_image =\n    let need_zImage =\n      match uname_m () with\n      | Some machine -> String.length machine > 2 && String.sub machine 0 3 = \"arm\"\n      | None -> failwith \"uname -m failed; can't determine target machine type!\" in\n    if need_zImage then (\n      Printf.sprintf \"\\t  -o mir-%s.elf\\n\\\n                      \\tobjcopy -O binary mir-%s.elf mir-%s.xen\"\n                      t.name t.name t.name\n    ) else (\n      Printf.sprintf \"\\t  -o mir-%s.xen\" t.name\n    ) in\n\n  begin match !mode with\n    | `Xen ->\n      let filter = function\n        | \"unix\" | \"bigarray\" |\"shared_memory_ring_stubs\" -> false    (* Provided by mirage-xen instead. *)\n        | _ -> true in\n      let extra_c_archives =\n        get_extra_ld_flags ~filter pkgs\n        |> String.concat \" \\\\\\n\\t  \" in\n\n      append oc \"build: main.native.o\";\n      let pkg_config_deps = \"mirage-xen\" in\n      append oc \"\\tpkg-config --print-errors --exists %s\" pkg_config_deps;\n      append oc \"\\tld -d -static -nostdlib \\\\\\n\\\n                 \\t  _build/main.native.o \\\\\\n\\\n                 \\t  %s \\\\\\n\\\n                 \\t  $$(pkg-config --static --libs %s) \\\\\\n\\\n                 \\t  $(shell gcc -print-libgcc-file-name) \\\\\\n\\\n                 %s\"\n        extra_c_archives pkg_config_deps generate_image;\n    | `Unix | `MacOSX ->\n      append oc \"build: main.native\";\n      append oc \"\\tln -nfs _build/main.native mir-%s\" t.name;\n  end;\n  newline oc;\n  append oc \"run: build\";\n  begin match !mode with\n    | `Xen ->\n      append oc \"\\t@echo %s.xl has been created. Edit it to add VIFs or VBDs\" t.name;\n      append oc \"\\t@echo Then do something similar to: xl create -c %s.xl\\n\" t.name\n    | `Unix | `MacOSX ->\n      append oc \"\\t$(SUDO) ./mir-%s\\n\" t.name\n  end;\n  append oc \"clean:\\n\\\n             \\tocamlbuild -clean\";\n  close_out oc\n\nlet clean_makefile t =\n  remove (t.root / \"Makefile\")\n\nlet no_opam_version_check_ = ref false\nlet no_opam_version_check b = no_opam_version_check_ := b\n\nlet configure_opam t =\n  info \"Installing OPAM packages.\";\n  match packages t with\n  | [] -> ()\n  | ps ->\n    if command_exists \"opam\" then\n      if !no_opam_version_check_ then ()\n      else (\n        let opam_version = read_command \"opam --version\" in\n        let version_error () =\n          error \"Your version of opam: %s is not up-to-date. \\\n                 Please update to (at least) 1.2.\" opam_version\n        in\n        match split opam_version '.' with\n        | major::minor::_ ->\n          let major = try int_of_string major with Failure _ -> 0 in\n          let minor = try int_of_string minor with Failure _ -> 0 in\n          if (major, minor) >= (1, 2) then opam \"install\" ps else version_error ()\n        | _ -> version_error ()\n      )\n    else error \"OPAM is not installed.\"\n\nlet clean_opam t =\n  ()\n(* This is a bit too agressive, disabling for now on.\n   let (++) = StringSet.union in\n   let set mode = StringSet.of_list (packages t mode) in\n   let packages =\n    set (`Unix `Socket) ++ set (`Unix `Direct) ++ set `Xen in\n   match StringSet.elements packages with\n   | [] -> ()\n   | ps ->\n    if cmd_exists \"opam\" then opam \"remove\" ps\n    else error \"OPAM is not installed.\"\n*)\n\nlet manage_opam_packages_ = ref true\nlet manage_opam_packages b = manage_opam_packages_ := b\n\nlet configure_job j =\n  let name = Impl.name j in\n  let module_name = Impl.module_name j in\n  let param_names = Impl.names j in\n  append_main \"let %s () =\" name;\n  List.iter (fun p ->\n      append_main \"  %s () >>= function\" p;\n      append_main \"  | `Error e -> %s\" (driver_initialisation_error p);\n      append_main \"  | `Ok %s ->\" p;\n    ) (dedup param_names);\n  append_main \"  %s.start %s\" module_name (String.concat \" \" param_names);\n  newline_main ()\n\nlet configure_main t =\n  info \"%s main.ml\" (blue_s \"Generating:\");\n  set_main_ml (t.root / \"main.ml\");\n  append_main \"(* %s *)\" generated_by_mirage;\n  newline_main ();\n  append_main \"open Lwt\";\n  newline_main ();\n  append_main \"let _ = Printexc.record_backtrace true\";\n  newline_main ();\n  begin match t.tracing with\n  | None -> ()\n  | Some tracing -> Tracing.configure tracing end;\n  List.iter (fun j -> Impl.configure j) t.jobs;\n  List.iter configure_job t.jobs;\n  let names = List.map (fun j -> Printf.sprintf \"%s ()\" (Impl.name j)) t.jobs in\n  append_main \"let () =\";\n  append_main \"  OS.Main.run (join [%s])\" (String.concat \"; \" names)\n\nlet clean_main t =\n  List.iter Impl.clean t.jobs;\n  remove (t.root / \"main.ml\")\n\nlet configure t =\n  info \"%s %s\" (blue_s \"Using configuration:\") (get_config_file ());\n  info \"%d job%s [%s]\"\n    (List.length t.jobs)\n    (if List.length t.jobs = 1 then \"\" else \"s\")\n    (String.concat \", \" (List.map Impl.functor_name t.jobs));\n  in_dir t.root (fun () ->\n      if !manage_opam_packages_ then configure_opam t;\n      configure_myocamlbuild_ml t;\n      configure_makefile t;\n      configure_main_xl t;\n      configure_main_xe t;\n      configure_main_libvirt_xml t;\n      configure_main t\n    )\n\nlet make () =\n  match uname_s () with\n  | Some (\"FreeBSD\" | \"OpenBSD\" | \"NetBSD\" | \"DragonFly\") -> \"gmake\"\n  | _ -> \"make\"\n\nlet build t =\n  info \"Build: %s\" (blue_s (get_config_file ()));\n  in_dir t.root (fun () ->\n      command \"%s build\" (make ())\n    )\n\nlet run t =\n  info \"Run: %s\" (blue_s (get_config_file ()));\n  in_dir t.root (fun () ->\n      command \"%s run\" (make ())\n    )\n\nlet clean t =\n  info \"Clean: %s\" (blue_s (get_config_file ()));\n  in_dir t.root (fun () ->\n      if !manage_opam_packages_ then clean_opam t;\n      clean_myocamlbuild_ml t;\n      clean_makefile t;\n      clean_main_xl t;\n      clean_main_xe t;\n      clean_main_libvirt_xml t;\n      clean_main t;\n      command \"rm -rf %s/_build\" t.root;\n      command \"rm -rf log %s/main.native.o %s/main.native %s/mir-%s %s/*~\"\n        t.root t.root t.root t.name t.root;\n    )\n\n(* Compile the configuration file and attempt to dynlink it.\n * It is responsible for registering an application via\n * [Mirage_config.register] in order to have an observable\n * side effect to this command. *)\nlet compile_and_dynlink file =\n  info \"%s %s\" (blue_s \"Processing:\") file;\n  let root = Filename.dirname file in\n  let file = Filename.basename file in\n  let file = Dynlink.adapt_filename file in\n  command \"rm -rf %s/_build/%s.*\" root (Filename.chop_extension file);\n  command \"cd %s && ocamlbuild -use-ocamlfind -tags annot,bin_annot -pkg mirage %s\" root file;\n  try Dynlink.loadfile (String.concat \"/\" [root; \"_build\"; file])\n  with Dynlink.Error err -> error \"Error loading config: %s\" (Dynlink.error_message err)\n\n(* If a configuration file is specified, then use that.\n * If not, then scan the curdir for a `config.ml` file.\n * If there is more than one, then error out. *)\nlet scan_conf = function\n  | Some f ->\n    info \"%s %s\" (blue_s \"Using specified config file:\") f;\n    if not (Sys.file_exists f) then error \"%s does not exist, stopping.\" f;\n    realpath f\n  | None   ->\n    let files = Array.to_list (Sys.readdir \".\") in\n    match List.filter ((=) \"config.ml\") files with\n    | [] -> error \"No configuration file config.ml found.\\n\\\n                   You'll need to create one to let Mirage know what to do.\"\n    | [f] ->\n      info \"%s %s\" (blue_s \"Using scanned config file:\") f;\n      realpath f\n    | _   -> error \"There is more than one config.ml in the current working directory.\\n\\\n                    Please specify one explictly on the command-line.\"\n\nlet load file =\n  reset ();\n  let file = scan_conf file in\n  let root = realpath (Filename.dirname file) in\n  let file = root / Filename.basename file in\n  info \"%s %s\" (blue_s \"Compiling for target:\") (string_of_mode !mode);\n  set_config_file file;\n  compile_and_dynlink file;\n  let t = registered () in\n  set_section t.name;\n  update_path t root\n"
  },
  {
    "path": "src/test/resources/samples/langs/OCaml/reload.ml",
    "content": "(***********************************************************************)\n(*                                                                     *)\n(*                                OCaml                                *)\n(*                                                                     *)\n(*            Xavier Leroy, projet Cristal, INRIA Rocquencourt         *)\n(*                                                                     *)\n(*  Copyright 2000 Institut National de Recherche en Informatique et   *)\n(*  en Automatique.  All rights reserved.  This file is distributed    *)\n(*  under the terms of the Q Public License version 1.0.               *)\n(*                                                                     *)\n(***********************************************************************)\n\nopen Cmm\nopen Arch\nopen Reg\nopen Mach\n\n(* Reloading for the AMD64 *)\n\n(* Summary of instruction set constraints:\n   \"S\" means either stack or register, \"R\" means register only.\n   Operation                    Res     Arg1    Arg2\n     Imove                      R       S\n                             or S       R\n     Iconst_int                 S if 32-bit signed, R otherwise\n     Iconst_float               R\n     Iconst_symbol (not PIC)    S\n     Iconst_symbol (PIC)        R\n     Icall_ind                          R\n     Itailcall_ind                      R\n     Iload                      R       R       R\n     Istore                             R       R\n     Iintop(Icomp)              R       R       S\n                            or  S       S       R\n     Iintop(Imul|Idiv|mod)      R       R       S\n     Iintop(shift)              S       S       R\n     Iintop(others)             R       R       S\n                            or  S       S       R\n     Iintop_imm(Iadd, n)/lea    R       R\n     Iintop_imm(others)         S       S\n     Inegf...Idivf              R       R       S\n     Ifloatofint                R       S\n     Iintoffloat                R       S\n     Ispecific(Ilea)            R       R       R\n     Ispecific(Ifloatarithmem)  R       R       R\n\n   Conditional branches:\n     Iinttest                           S       R\n                                    or  R       S\n     Ifloattest                         R       S    (or  S R if swapped test)\n     other tests                        S\n*)\n\nlet stackp r =\n  match r.loc with\n    Stack _ -> true\n  | _ -> false\n\nclass reload = object (self)\n\ninherit Reloadgen.reload_generic as super\n\nmethod! reload_operation op arg res =\n  match op with\n  | Iintop(Iadd|Isub|Iand|Ior|Ixor|Icomp _|Icheckbound) ->\n      (* One of the two arguments can reside in the stack, but not both *)\n      if stackp arg.(0) && stackp arg.(1)\n      then ([|arg.(0); self#makereg arg.(1)|], res)\n      else (arg, res)\n  | Iintop_imm(Iadd, _) when arg.(0).loc <> res.(0).loc ->\n      (* This add will be turned into a lea; args and results must be\n         in registers *)\n      super#reload_operation op arg res\n  | Iintop(Idiv | Imod | Ilsl | Ilsr | Iasr)\n  | Iintop_imm(_, _) ->\n      (* The argument(s) and results can be either in register or on stack *)\n      (* Note: Idiv, Imod: arg(0) and res(0) already forced in regs\n               Ilsl, Ilsr, Iasr: arg(1) already forced in regs *)\n      (arg, res)\n  | Iintop(Imul) | Iaddf | Isubf | Imulf | Idivf ->\n      (* First argument (= result) must be in register, second arg\n         can reside in the stack *)\n      if stackp arg.(0)\n      then (let r = self#makereg arg.(0) in ([|r; arg.(1)|], [|r|]))\n      else (arg, res)\n  | Ifloatofint | Iintoffloat ->\n      (* Result must be in register, but argument can be on stack *)\n      (arg, (if stackp res.(0) then [| self#makereg res.(0) |] else res))\n  | Iconst_int n ->\n      if n <= 0x7FFFFFFFn && n >= -0x80000000n\n      then (arg, res)\n      else super#reload_operation op arg res\n  | Iconst_symbol _ ->\n      if !pic_code || !Clflags.dlcode\n      then super#reload_operation op arg res\n      else (arg, res)\n  | _ -> (* Other operations: all args and results in registers *)\n      super#reload_operation op arg res\n\nmethod! reload_test tst arg =\n  match tst with\n    Iinttest cmp ->\n      (* One of the two arguments can reside on stack *)\n      if stackp arg.(0) && stackp arg.(1)\n      then [| self#makereg arg.(0); arg.(1) |]\n      else arg\n  | Ifloattest((Clt|Cle), _) ->\n      (* Cf. emit.mlp: we swap arguments in this case *)\n      (* First argument can be on stack, second must be in register *)\n      if stackp arg.(1)\n      then [| arg.(0); self#makereg arg.(1) |]\n      else arg\n  | Ifloattest((Ceq|Cne|Cgt|Cge), _) ->\n      (* Second argument can be on stack, first must be in register *)\n      if stackp arg.(0)\n      then [| self#makereg arg.(0); arg.(1) |]\n      else arg\n  | _ ->\n      (* The argument(s) can be either in register or on stack *)\n      arg\n\nend\n\nlet fundecl f =\n  (new reload)#fundecl f\n"
  },
  {
    "path": "src/test/resources/samples/langs/OCaml/sigset.ml",
    "content": "(*\n * Copyright (c) 2013 Jeremy Yallop.\n *\n * This file is distributed under the terms of the MIT License.\n * See the file LICENSE for details.\n *)\n\nopen PosixTypes\nopen Ctypes\nopen Foreign\n\ntype t = sigset_t ptr\n\nlet t = ptr sigset_t\n\n(* This function initializes the signal set set to exclude all of the defined\n   signals. It always returns 0.  *)\nlet sigemptyset = foreign \"sigemptyset\" (ptr sigset_t @-> returning int)\n\nlet empty () =\n  let setp = allocate_n ~count:1 sigset_t in begin\n    ignore (sigemptyset setp);\n    setp\n  end\n\n(* This function initializes the signal set set to include all of the defined\n   signals. Again, the return value is 0. *)\nlet sigfillset = foreign \"sigfillset\" (ptr sigset_t @-> returning int)\n\nlet full () =\n  let setp = allocate_n ~count:1 sigset_t in begin\n    ignore (sigfillset setp);\n    setp\n  end\n\n(* This function adds the signal signum to the signal set set. All sigaddset\n   does is modify set; it does not block or unblock any signals.\n\n   The return value is 0 on success and -1 on failure. The following errno\n   error condition is defined for this function:\n\n   EINVAL The signum argument doesn't specify a valid signal. \n*)\nlet sigaddset = foreign \"sigaddset\" ~check_errno:true\n  (ptr sigset_t @-> int @-> returning int)\n\nlet add set signal = ignore (sigaddset set signal)\n\n(* This function removes the signal signum from the signal set set. All\n   sigdelset does is modify set; it does not block or unblock any signals.\n\n   The return value and error conditions are the same as for\n   sigaddset.  *)\nlet sigdelset = foreign \"sigdelset\" ~check_errno:true\n  (ptr sigset_t @-> int @-> returning int)\n\nlet del set signal = ignore (sigdelset set signal)\n\n(* The sigismember function tests whether the signal signum is a member of the\n   signal set set. It returns 1 if the signal is in the set, 0 if not, and -1 if\n   there is an error.\n\n   The following errno error condition is defined for this function:\n\n   EINVAL The signum argument doesn't specify a valid signal. \n*)\nlet sigismember = foreign \"sigismember\" ~check_errno:true\n  (ptr sigset_t @-> int @-> returning int)\n\nlet mem set signal = sigismember set signal <> 0\n"
  },
  {
    "path": "src/test/resources/samples/langs/OCaml/uutf.ml",
    "content": "(*---------------------------------------------------------------------------\n   Copyright 2012 Daniel C. Bünzli. All rights reserved.\n   Distributed under the BSD3 license, see license at the end of the file.\n   %%NAME%% release %%VERSION%%\n  ---------------------------------------------------------------------------*)\n\nlet io_buffer_size = 65536                           (* IO_BUFFER_SIZE 4.0.0 *)\n\nlet pp = Format.fprintf\nlet invalid_encode () = invalid_arg \"expected `Await encode\"\nlet invalid_bounds j l =\n  invalid_arg (Printf.sprintf \"invalid bounds (index %d, length %d)\" j l)\n\n(* Unsafe string byte manipulations. If you don't believe the author's\n   invariants, replacing with safe versions makes everything safe in\n   the module. He won't be upset. *)\n\nlet unsafe_chr = Char.unsafe_chr\nlet unsafe_blit = String.unsafe_blit\nlet unsafe_array_get = Array.unsafe_get\nlet unsafe_byte s j = Char.code (String.unsafe_get s j)\nlet unsafe_set_byte s j byte = String.unsafe_set s j (Char.unsafe_chr byte)\n\n(* Unicode characters *)\n\ntype uchar = int\nlet u_bom = 0xFEFF                                                   (* BOM. *)\nlet u_rep = 0xFFFD                                 (* replacement character. *)\nlet is_uchar cp =\n  (0x0000 <= cp && cp <= 0xD7FF) || (0xE000 <= cp && cp <= 0x10FFFF)\n\nlet pp_cp ppf cp =\n  if cp < 0 || cp > 0x10FFFF then pp ppf \"U+Invalid(%X)\" cp else\n  if cp <= 0xFFFF then pp ppf \"U+%04X\" cp else\n  pp ppf \"U+%X\" cp\n\nlet cp_to_string cp =                                    (* NOT thread safe. *)\n  pp Format.str_formatter \"%a\" pp_cp cp; Format.flush_str_formatter ()\n\n(* Unicode encoding schemes *)\n\ntype encoding = [ `UTF_8 | `UTF_16 | `UTF_16BE | `UTF_16LE ]\ntype decoder_encoding = [ encoding | `US_ASCII | `ISO_8859_1 ]\n\nlet encoding_of_string s = match String.uppercase s with      (* IANA names. *)\n| \"UTF-8\" -> Some `UTF_8\n| \"UTF-16\" -> Some `UTF_16\n| \"UTF-16LE\" -> Some `UTF_16LE\n| \"UTF-16BE\" -> Some `UTF_16BE\n| \"ANSI_X3.4-1968\" | \"ISO-IR-6\" | \"ANSI_X3.4-1986\" | \"ISO_646.IRV:1991\"\n| \"ASCII\" | \"ISO646-US\" | \"US-ASCII\" | \"US\" | \"IBM367\" | \"CP367\" | \"CSASCII\" ->\n    Some `US_ASCII\n| \"ISO_8859-1:1987\" | \"ISO-IR-100\" | \"ISO_8859-1\" | \"ISO-8859-1\"\n| \"LATIN1\" | \"L1\" | \"IBM819\" | \"CP819\" | \"CSISOLATIN1\" ->\n    Some `ISO_8859_1\n| _ -> None\n\nlet encoding_to_string = function\n| `UTF_8 -> \"UTF-8\" | `UTF_16 -> \"UTF-16\" | `UTF_16BE -> \"UTF-16BE\"\n| `UTF_16LE -> \"UTF-16LE\" | `US_ASCII -> \"US-ASCII\"\n| `ISO_8859_1 -> \"ISO-8859-1\"\n\n(* Base character decoders. They assume enough data. *)\n\nlet malformed s j l = `Malformed (String.sub s j l)\nlet malformed_pair be hi s j l =    (* missing or half low surrogate at eoi. *)\n  let bs1 = String.sub s j l in\n  let bs0 = String.create 2 in\n  let j0, j1 = if be then (0, 1) else (1, 0) in\n  unsafe_set_byte bs0 j0 (hi lsr 8);\n  unsafe_set_byte bs0 j1 (hi land 0xFF);\n  `Malformed (bs0 ^ bs1)\n\nlet r_us_ascii s j =\n  (* assert (0 <= j && j < String.length s); *)\n  let b0 = unsafe_byte s j in\n  if b0 <= 127 then `Uchar b0 else malformed s j 1\n\nlet r_iso_8859_1 s j =\n  (* assert (0 <= j && j < String.length s); *)\n  `Uchar (unsafe_byte s j)\n\nlet utf_8_len = [| (* uchar byte length according to first UTF-8 byte. *)\n  1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;\n  1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;\n  1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;\n  1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;\n  1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;\n  1; 1; 1; 1; 1; 1; 1; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;\n  0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;\n  0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;\n  0; 0; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2;\n  2; 2; 2; 2; 2; 2; 2; 2; 3; 3; 3; 3; 3; 3; 3; 3; 3; 3; 3; 3; 3; 3; 3; 3;\n  4; 4; 4; 4; 4; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0 |]\n\nlet r_utf_8 s j l =\n  (* assert (0 <= j && 0 <= l && j + l <= String.length s); *)\n  match l with\n  | 1 -> `Uchar (unsafe_byte s j)\n  | 2 ->\n      let b0 = unsafe_byte s j in let b1 = unsafe_byte s (j + 1) in\n      if b1 lsr 6 != 0b10 then malformed s j l else\n      `Uchar (((b0 land 0x1F) lsl 6) lor (b1 land 0x3F))\n  | 3 ->\n      let b0 = unsafe_byte s j in let b1 = unsafe_byte s (j + 1) in\n      let b2 = unsafe_byte s (j + 2) in\n      let c = `Uchar (((b0 land 0x0F) lsl 12) lor\n                      ((b1 land 0x3F) lsl 6) lor\n          (b2 land 0x3F))\n      in\n      if b2 lsr 6 != 0b10 then malformed s j l else\n      begin match b0 with\n      | 0xE0 -> if b1 < 0xA0 || 0xBF < b1 then malformed s j l else c\n      | 0xED -> if b1 < 0x80 || 0x9F < b1 then malformed s j l else c\n      | _ -> if b1 lsr 6 != 0b10 then malformed s j l else c\n      end\n  | 4 ->\n      let b0 = unsafe_byte s j in let b1 = unsafe_byte s (j + 1) in\n      let b2 = unsafe_byte s (j + 2) in let b3 = unsafe_byte s (j + 3) in\n      let c = `Uchar (((b0 land 0x07) lsl 18) lor\n                      ((b1 land 0x3F) lsl 12) lor\n          ((b2 land 0x3F) lsl 6) lor\n                      (b3 land 0x3F))\n      in\n      if b3 lsr 6 != 0b10 || b2 lsr 6 != 0b10 then malformed s j l else\n      begin match b0 with\n      | 0xF0 -> if b1 < 0x90 || 0xBF < b1 then malformed s j l else c\n      | 0xF4 -> if b1 < 0x80 || 0x8F < b1 then malformed s j l else c\n      | _ -> if b1 lsr 6 != 0b10 then malformed s j l else c\n      end\n  | _ -> assert false\n\nlet r_utf_16 s j0 j1 =                       (* May return a high surrogate. *)\n  (* assert (0 <= j0 && 0 <= j1 && max j0 j1 < String.length s); *)\n  let b0 = unsafe_byte s j0 in let b1 = unsafe_byte s j1 in\n  let u = (b0 lsl 8) lor b1 in\n  if u < 0xD800 || u > 0xDFFF then `Uchar u else\n  if u > 0xDBFF then malformed s (min j0 j1) 2 else `Hi u\n\nlet r_utf_16_lo hi s j0 j1 =          (* Combines [hi] with a low surrogate. *)\n  (* assert (0 <= j0 && 0 <= j1 && max j0 j1 < String.length s); *)\n  let b0 = unsafe_byte s j0 in\n  let b1 = unsafe_byte s j1 in\n  let lo = (b0 lsl 8) lor b1 in\n  if lo < 0xDC00 || lo > 0xDFFF\n  then malformed_pair (j0 < j1 (* true => be *)) hi s (min j0 j1) 2\n  else `Uchar ((((hi land 0x3FF) lsl 10) lor (lo land 0x3FF)) + 0x10000)\n\nlet r_encoding s j l =                  (* guess encoding with max. 3 bytes. *)\n  (* assert (0 <= j && 0 <= l && j + l <= String.length s) *)\n  let some i = if i < l then Some (unsafe_byte s (j + i)) else None in\n  match (some 0), (some 1), (some 2) with\n  | Some 0xEF, Some 0xBB, Some 0xBF                 -> `UTF_8 `BOM\n  | Some 0xFE, Some 0xFF, _                         -> `UTF_16BE `BOM\n  | Some 0xFF, Some 0xFE, _                         -> `UTF_16LE `BOM\n  | Some 0x00, Some    p, _              when p > 0 -> `UTF_16BE (`ASCII p)\n  | Some    p, Some 0x00, _              when p > 0 -> `UTF_16LE (`ASCII p)\n  | Some    u,         _, _ when utf_8_len.(u) <> 0 -> `UTF_8 `Decode\n  | Some    _, Some    _, _                         -> `UTF_16BE `Decode\n  | Some    _, None     , None                      -> `UTF_8 `Decode\n  | None     , None     , None                      -> `UTF_8 `End\n  | None     , Some    _, _                         -> assert false\n  | Some    _, None     , Some _                    -> assert false\n  | None     , None     , Some _                    -> assert false\n\n(* Decode *)\n\ntype src = [ `Channel of in_channel | `String of string | `Manual ]\ntype nln = [ `ASCII of uchar | `NLF of uchar | `Readline of uchar ]\ntype decode = [ `Await | `End | `Malformed of string | `Uchar of uchar]\n\nlet pp_decode ppf = function\n| `Uchar u -> pp ppf \"@[`Uchar %a@]\" pp_cp u\n| `End -> pp ppf \"`End\"\n| `Await -> pp ppf \"`Await\"\n| `Malformed bs ->\n    let l = String.length bs in\n    pp ppf \"@[`Malformed (\";\n    if l > 0 then pp ppf \"%02X\" (Char.code (bs.[0]));\n    for i = 1 to l - 1 do pp ppf \" %02X\" (Char.code (bs.[i])) done;\n    pp ppf \")@]\"\n\ntype decoder =\n  { src : src;                                              (* input source. *)\n    mutable encoding : decoder_encoding;                (* decoded encoding. *)\n    nln : nln option;                     (* newline normalization (if any). *)\n    nl : int;                            (* newline normalization character. *)\n    mutable i : string;                              (* current input chunk. *)\n    mutable i_pos : int;                          (* input current position. *)\n    mutable i_max : int;                          (* input maximal position. *)\n    t : string;        (* four bytes temporary buffer for overlapping reads. *)\n    mutable t_len : int;                      (* current byte length of [t]. *)\n    mutable t_need : int;                  (* number of bytes needed in [t]. *)\n    mutable removed_bom : bool;     (* [true] if an initial BOM was removed. *)\n    mutable last_cr : bool;                   (* [true] if last char was CR. *)\n    mutable line : int;                                      (* line number. *)\n    mutable col : int;                                     (* column number. *)\n    mutable byte_count : int;                                 (* byte count. *)\n    mutable count : int;                                      (* char count. *)\n    mutable pp :        (* decoder post-processor for BOM, position and nln. *)\n      decoder -> [ `Malformed of string | `Uchar of uchar ] -> decode;\n    mutable k : decoder -> decode }                 (* decoder continuation. *)\n\n(* On decodes that overlap two (or more) [d.i] buffers, we use [t_fill] to copy\n   the input data to [d.t] and decode from there. If the [d.i] buffers are not\n   too small this is faster than continuation based byte per byte writes.\n\n   End of input (eoi) is signalled by [d.i_pos = 0] and [d.i_max = min_int]\n   which implies that [i_rem d < 0] is [true]. *)\n\nlet i_rem d = d.i_max - d.i_pos + 1     (* remaining bytes to read in [d.i]. *)\nlet eoi d = d.i <- \"\"; d.i_pos <- 0; d.i_max <- min_int   (* set eoi in [d]. *)\nlet src d s j l =                                     (* set [d.i] with [s]. *)\n  if (j < 0 || l < 0 || j + l > String.length s) then invalid_bounds j l else\n  if (l = 0) then eoi d else\n  (d.i <- s; d.i_pos <- j; d.i_max <- j + l - 1)\n\nlet refill k d = match d.src with  (* get new input in [d.i] and [k]ontinue. *)\n| `Manual -> d.k <- k; `Await\n| `String _ -> eoi d; k d\n| `Channel ic ->\n    let rc = input ic d.i 0 (String.length d.i) in\n    (src d d.i 0 rc; k d)\n\nlet t_need d need = d.t_len <- 0; d.t_need <- need\nlet rec t_fill k d =      (* get [d.t_need] bytes (or less if eoi) in [i.t]. *)\n  let blit d l =\n    unsafe_blit d.i d.i_pos d.t d.t_len (* write pos. *) l;\n    d.i_pos <- d.i_pos + l; d.t_len <- d.t_len + l;\n  in\n  let rem = i_rem d in\n  if rem < 0 (* eoi *) then k d else\n  let need = d.t_need - d.t_len in\n  if rem < need then (blit d rem; refill (t_fill k) d) else (blit d need; k d)\n\nlet ret k v byte_count d =                     (* return post-processed [v]. *)\n  d.k <- k; d.byte_count <- d.byte_count + byte_count; d.pp d v\n\n(* Decoders. *)\n\nlet rec decode_us_ascii d =\n  let rem = i_rem d in\n  if rem <= 0 then (if rem < 0 then `End else refill decode_us_ascii d) else\n  let j = d.i_pos in\n  d.i_pos <- d.i_pos + 1; ret decode_us_ascii (r_us_ascii d.i j) 1 d\n\nlet rec decode_iso_8859_1 d =\n  let rem = i_rem d in\n  if rem <= 0 then (if rem < 0 then `End else refill decode_iso_8859_1 d) else\n  let j = d.i_pos in\n  d.i_pos <- d.i_pos + 1; ret decode_iso_8859_1 (r_iso_8859_1 d.i j) 1 d\n\n(* UTF-8 decoder *)\n\nlet rec t_decode_utf_8 d =                             (* decode from [d.t]. *)\n  if d.t_len < d.t_need\n  then ret decode_utf_8 (malformed d.t 0 d.t_len) d.t_len d\n  else ret decode_utf_8 (r_utf_8 d.t 0 d.t_len) d.t_len d\n\nand decode_utf_8 d =\n  let rem = i_rem d in\n  if rem <= 0 then (if rem < 0 then `End else refill decode_utf_8 d) else\n  let need = unsafe_array_get utf_8_len (unsafe_byte d.i d.i_pos) in\n  if rem < need then (t_need d need; t_fill t_decode_utf_8 d) else\n  let j = d.i_pos in\n  if need = 0\n  then (d.i_pos <- d.i_pos + 1; ret decode_utf_8 (malformed d.i j 1) 1 d)\n  else (d.i_pos <- d.i_pos + need; ret decode_utf_8 (r_utf_8 d.i j need) need d)\n\n(* UTF-16BE decoder *)\n\nlet rec t_decode_utf_16be_lo hi d =                    (* decode from [d.t]. *)\n  let bcount = d.t_len + 2 (* hi count *) in\n  if d.t_len < d.t_need\n  then ret decode_utf_16be (malformed_pair true hi d.t 0 d.t_len) bcount d\n  else ret decode_utf_16be (r_utf_16_lo hi d.t 0 1) bcount d\n\nand t_decode_utf_16be d =                              (* decode from [d.t]. *)\n  if d.t_len < d.t_need\n  then ret decode_utf_16be (malformed d.t 0 d.t_len) d.t_len d\n  else decode_utf_16be_lo (r_utf_16 d.t 0 1) d\n\nand decode_utf_16be_lo v d = match v with\n| `Uchar _ | `Malformed _ as v -> ret decode_utf_16be v 2 d\n| `Hi hi ->\n    let rem = i_rem d in\n    if rem < 2 then (t_need d 2; t_fill (t_decode_utf_16be_lo hi) d) else\n    let j = d.i_pos in\n    d.i_pos <- d.i_pos + 2;\n    ret decode_utf_16be (r_utf_16_lo hi d.i j (j + 1)) 4 d\n\nand decode_utf_16be d =\n  let rem = i_rem d in\n  if rem <= 0 then (if rem < 0 then `End else refill decode_utf_16be d) else\n  if rem < 2 then (t_need d 2; t_fill t_decode_utf_16be d) else\n  let j = d.i_pos in\n  d.i_pos <- d.i_pos + 2; decode_utf_16be_lo (r_utf_16 d.i j (j + 1)) d\n\n(* UTF-16LE decoder, same as UTF-16BE with byte swapped. *)\n\nlet rec t_decode_utf_16le_lo hi d =                    (* decode from [d.t]. *)\n  let bcount = d.t_len + 2 (* hi count *) in\n  if d.t_len < d.t_need\n  then ret decode_utf_16le (malformed_pair false hi d.t 0 d.t_len) bcount d\n  else ret decode_utf_16le (r_utf_16_lo hi d.t 1 0) bcount d\n\nand t_decode_utf_16le d =                              (* decode from [d.t]. *)\n  if d.t_len < d.t_need\n  then ret decode_utf_16le (malformed d.t 0 d.t_len) d.t_len d\n  else decode_utf_16le_lo (r_utf_16 d.t 1 0) d\n\nand decode_utf_16le_lo v d = match v with\n| `Uchar _ | `Malformed _ as v -> ret decode_utf_16le v 2 d\n| `Hi hi ->\n    let rem = i_rem d in\n    if rem < 2 then (t_need d 2; t_fill (t_decode_utf_16le_lo hi) d) else\n    let j = d.i_pos in\n    d.i_pos <- d.i_pos + 2;\n    ret decode_utf_16le (r_utf_16_lo hi d.i (j + 1) j) 4 d\n\nand decode_utf_16le d =\n  let rem = i_rem d in\n  if rem <= 0 then (if rem < 0 then `End else refill decode_utf_16le d) else\n  if rem < 2 then (t_need d 2; t_fill t_decode_utf_16le d) else\n  let j = d.i_pos in\n  d.i_pos <- d.i_pos + 2; decode_utf_16le_lo (r_utf_16 d.i (j + 1) j) d\n\n(* Encoding guessing. The guess is simple but starting the decoder\n   after is tedious, uutf's decoders are not designed to put bytes\n   back in the stream. *)\n\nlet guessed_utf_8 d =                   (* start decoder after `UTF_8 guess. *)\n  let b3 d =                                 (* handles the third read byte. *)\n    let b3 = unsafe_byte d.t 2 in\n    match utf_8_len.(b3) with\n    | 0 -> ret decode_utf_8 (malformed d.t 2 1) 1 d\n    | n ->\n        d.t_need <- n; d.t_len <- 1; unsafe_set_byte d.t 0 b3;\n        t_fill t_decode_utf_8 d\n  in\n  let b2 d =                                     (* handle second read byte. *)\n    let b2 = unsafe_byte d.t 1 in\n    let b3 = if d.t_len > 2 then b3 else decode_utf_8 (* decodes `End *) in\n    match utf_8_len.(b2) with\n    | 0 -> ret b3 (malformed d.t 1 1) 1 d\n    | 1 -> ret b3 (r_utf_8 d.t 1 1) 1 d\n    | n ->                         (* copy d.t.(1-2) to d.t.(0-1) and decode *)\n        d.t_need <- n;\n        unsafe_set_byte d.t 0 b2;\n        if (d.t_len < 3) then d.t_len <- 1 else\n        (d.t_len <- 2; unsafe_set_byte d.t 1 (unsafe_byte d.t 2); );\n        t_fill t_decode_utf_8 d\n  in\n  let b1 = unsafe_byte d.t 0 in                   (* handle first read byte. *)\n  let b2 = if d.t_len > 1 then b2 else decode_utf_8 (* decodes `End *) in\n  match utf_8_len.(b1) with\n  | 0 -> ret b2 (malformed d.t 0 1) 1 d\n  | 1 -> ret b2 (r_utf_8 d.t 0 1) 1 d\n  | 2 ->\n      if d.t_len < 2 then ret decode_utf_8 (malformed d.t 0 1) 1 d else\n      if d.t_len < 3 then ret decode_utf_8 (r_utf_8 d.t 0 2) 2 d else\n      ret b3 (r_utf_8 d.t 0 2) 2 d\n  | 3 ->\n      if d.t_len < 3\n      then ret decode_utf_8 (malformed d.t 0 d.t_len) d.t_len d\n      else ret decode_utf_8 (r_utf_8 d.t 0 3) 3 d\n  | 4 ->\n      if d.t_len < 3\n      then ret decode_utf_8 (malformed d.t 0 d.t_len) d.t_len d\n      else (d.t_need <- 4; t_fill t_decode_utf_8 d)\n  | n -> assert false\n\nlet guessed_utf_16 d be v =     (* start decoder after `UTF_16{BE,LE} guess. *)\n  let decode_utf_16, t_decode_utf_16, t_decode_utf_16_lo, j0, j1 =\n    if be then decode_utf_16be, t_decode_utf_16be, t_decode_utf_16be_lo, 0, 1\n    else decode_utf_16le, t_decode_utf_16le, t_decode_utf_16le_lo, 1, 0\n  in\n  let b3 k d =\n    if d.t_len < 3 then decode_utf_16 d (* decodes `End *) else\n    begin                             (* copy d.t.(2) to d.t.(0) and decode. *)\n      d.t_need <- 2; d.t_len <- 1;\n      unsafe_set_byte d.t 0 (unsafe_byte d.t 2);\n      t_fill k d\n    end\n  in\n  match v with\n  | `BOM -> ret (b3 t_decode_utf_16) (`Uchar u_bom) 2 d\n  | `ASCII u -> ret (b3 t_decode_utf_16) (`Uchar u) 2 d\n  | `Decode ->\n      match r_utf_16 d.t j0 j1 with\n      | `Malformed _ | `Uchar _ as v -> ret (b3 t_decode_utf_16) v 2 d\n      | `Hi hi ->\n        if d.t_len < 3\n        then ret decode_utf_16 (malformed_pair be hi \"\" 0 0) d.t_len d\n        else (b3 (t_decode_utf_16_lo hi)) d\n\nlet guess_encoding d =                  (* guess encoding and start decoder. *)\n  let setup d = match r_encoding d.t 0 d.t_len with\n  | `UTF_8 r ->\n      d.encoding <- `UTF_8; d.k <- decode_utf_8;\n      begin match r with\n      | `BOM -> ret decode_utf_8 (`Uchar u_bom) 3 d\n      | `Decode -> guessed_utf_8 d\n      | `End -> `End\n      end\n  | `UTF_16BE r ->\n      d.encoding <- `UTF_16BE; d.k <- decode_utf_16be; guessed_utf_16 d true r\n  | `UTF_16LE r ->\n      d.encoding <- `UTF_16LE; d.k <- decode_utf_16le; guessed_utf_16 d false r\n\n  in\n  (t_need d 3; t_fill setup d)\n\n(* Character post-processors. Used for BOM handling, newline\n   normalization and position tracking. The [pp_remove_bom] is only\n   used for the first character to remove a possible initial BOM and\n   handle UTF-16 endianness recognition. *)\n\nlet nline d = d.col <- 0; d.line <- d.line + 1                   (* inlined. *)\nlet ncol d = d.col <- d.col + 1                                  (* inlined. *)\nlet ncount d = d.count <- d.count + 1                            (* inlined. *)\nlet cr d b = d.last_cr <- b                                      (* inlined. *)\n\nlet pp_remove_bom utf16 pp d = function(* removes init. BOM, handles UTF-16. *)\n| `Uchar 0xFEFF (* BOM *) ->\n    if utf16 then (d.encoding <- `UTF_16BE; d.k <- decode_utf_16be);\n    d.removed_bom <- true; d.pp <- pp; d.k d\n| `Uchar 0xFFFE (* BOM reversed from decode_utf_16be *) when utf16 ->\n    d.encoding <- `UTF_16LE; d.k <- decode_utf_16le;\n    d.removed_bom <- true; d.pp <- pp; d.k d\n| `Malformed _ | `Uchar _ as v ->\n    d.removed_bom <- false; d.pp <- pp; d.pp d v\n\nlet pp_nln_none d = function\n| `Uchar 0x000A (* LF *) as v ->\n    let last_cr = d.last_cr in\n    cr d false; ncount d; if last_cr then v else (nline d; v)\n| `Uchar 0x000D (* CR *) as v -> cr d true; ncount d; nline d; v\n| `Uchar (0x0085 | 0x000C | 0x2028 | 0x2029) (* NEL | FF | LS | PS *) as v ->\n    cr d false; ncount d; nline d; v\n| `Uchar _ | `Malformed _ as v -> cr d false; ncount d; ncol d; v\n\nlet pp_nln_readline d = function\n| `Uchar 0x000A (* LF *) ->\n    let last_cr = d.last_cr in\n    cr d false; if last_cr then d.k d else (ncount d; nline d; `Uchar d.nl)\n| `Uchar 0x000D (* CR *) -> cr d true; ncount d; nline d; `Uchar d.nl\n| `Uchar (0x0085 | 0x000C | 0x2028 | 0x2029) (* NEL | FF | LS | PS *) ->\n    cr d false; ncount d; nline d; `Uchar d.nl\n| `Uchar _ | `Malformed _ as v -> cr d false; ncount d; ncol d; v\n\nlet pp_nln_nlf d = function\n| `Uchar 0x000A (* LF *) ->\n    let last_cr = d.last_cr in\n    cr d false; if last_cr then d.k d else (ncount d; nline d; `Uchar d.nl)\n| `Uchar 0x000D (* CR *) -> cr d true; ncount d; nline d; `Uchar d.nl\n| `Uchar 0x0085 (* NEL *) -> cr d false; ncount d; nline d; `Uchar d.nl\n| `Uchar (0x000C | 0x2028 | 0x2029) as v (* FF | LS | PS *) ->\n    cr d false; ncount d; nline d; v\n| `Uchar _ | `Malformed _ as v -> cr d false; ncount d; ncol d; v\n\nlet pp_nln_ascii d = function\n| `Uchar 0x000A (* LF *) ->\n    let last_cr = d.last_cr in\n    cr d false; if last_cr then d.k d else (ncount d; nline d; `Uchar d.nl)\n| `Uchar 0x000D (* CR *) -> cr d true; ncount d; nline d; `Uchar d.nl\n| `Uchar (0x0085 | 0x000C | 0x2028 | 0x2029) as v (* NEL | FF | LS | PS *) ->\n    cr d false; ncount d; nline d; v\n| `Uchar _ | `Malformed _ as v -> cr d false; ncount d; ncol d; v\n\nlet decode_fun = function\n| `UTF_8 -> decode_utf_8\n| `UTF_16 -> decode_utf_16be                         (* see [pp_remove_bom]. *)\n| `UTF_16BE -> decode_utf_16be\n| `UTF_16LE -> decode_utf_16le\n| `US_ASCII -> decode_us_ascii\n| `ISO_8859_1 -> decode_iso_8859_1\n\nlet decoder ?nln ?encoding src =\n  let pp, nl = match nln with\n  | None -> pp_nln_none, 0x000A (* not used. *)\n  | Some (`ASCII nl) -> pp_nln_ascii, nl\n  | Some (`NLF nl) -> pp_nln_nlf, nl\n  | Some (`Readline nl) -> pp_nln_readline, nl\n  in\n  let encoding, k = match encoding with\n  | None -> `UTF_8, guess_encoding\n  | Some e -> (e :> decoder_encoding), decode_fun e\n  in\n  let i, i_pos, i_max = match src with\n  | `Manual -> \"\", 1, 0                            (* implies src_rem d = 0. *)\n  | `Channel _ -> String.create io_buffer_size, 1, 0                (* idem. *)\n  | `String s -> s, 0, String.length s - 1\n  in\n  { src = (src :> src); encoding; nln = (nln :> nln option); nl;\n    i; i_pos; i_max; t = String.create 4; t_len = 0; t_need = 0;\n    removed_bom = false; last_cr = false; line = 1; col = 0;\n    byte_count = 0; count = 0;\n    pp = pp_remove_bom (encoding = `UTF_16) pp; k }\n\nlet decode d = d.k d\nlet decoder_line d = d.line\nlet decoder_col d = d.col\nlet decoder_byte_count d = d.byte_count\nlet decoder_count d = d.count\nlet decoder_removed_bom d = d.removed_bom\nlet decoder_src d = d.src\nlet decoder_nln d = d.nln\nlet decoder_encoding d = d.encoding\nlet set_decoder_encoding d e =\n  d.encoding <- (e :> decoder_encoding); d.k <- decode_fun e\n\n(* Encode *)\n\ntype dst = [ `Channel of out_channel | `Buffer of Buffer.t | `Manual ]\ntype encode = [ `Await | `End | `Uchar of uchar ]\ntype encoder =\n  { dst : dst;                                        (* output destination. *)\n    encoding : encoding;                                (* encoded encoding. *)\n    mutable o : string;                             (* current output chunk. *)\n    mutable o_pos : int;                   (* next output position to write. *)\n    mutable o_max : int;                (* maximal output position to write. *)\n    t : string;                 (* four bytes buffer for overlapping writes. *)\n    mutable t_pos : int;                    (* next position to read in [t]. *)\n    mutable t_max : int;                 (* maximal position to read in [t]. *)\n    mutable k :                                     (* encoder continuation. *)\n      encoder -> encode -> [ `Ok | `Partial ] }\n\n(* On encodes that overlap two (or more) [e.o] buffers, we encode the\n   character to the temporary buffer [o.t] and continue with\n   [tmp_flush] to write this data on the different [e.o] buffers. If\n   the [e.o] buffers are not too small this is faster than\n   continuation based byte per byte writes. *)\n\nlet o_rem e = e.o_max - e.o_pos + 1    (* remaining bytes to write in [e.o]. *)\nlet dst e s j l =                                     (* set [e.o] with [s]. *)\n  if (j < 0 || l < 0 || j + l > String.length s) then invalid_bounds j l;\n  e.o <- s; e.o_pos <- j; e.o_max <- j + l - 1\n\nlet partial k e = function `Await -> k e | `Uchar _ | `End -> invalid_encode ()\nlet flush k e = match e.dst with(* get free storage in [d.o] and [k]ontinue. *)\n| `Manual -> e.k <- partial k; `Partial\n| `Buffer b -> Buffer.add_substring b e.o 0 e.o_pos; e.o_pos <- 0; k e\n| `Channel oc -> output oc e.o 0 e.o_pos; e.o_pos <- 0; k e\n\nlet t_range e max = e.t_pos <- 0; e.t_max <- max\nlet rec t_flush k e =               (* flush [d.t] up to [d.t_max] in [d.i]. *)\n  let blit e l =\n    unsafe_blit e.t e.t_pos e.o e.o_pos l;\n    e.o_pos <- e.o_pos + l; e.t_pos <- e.t_pos + l\n  in\n  let rem = o_rem e in\n  let len = e.t_max - e.t_pos + 1 in\n  if rem < len then (blit e rem; flush (t_flush k) e) else (blit e len; k e)\n\n(* Encoders. *)\n\nlet rec encode_utf_8 e v =\n  let k e = e.k <- encode_utf_8; `Ok in\n  match v with\n  | `Await -> k e\n  | `End -> flush k e\n  | `Uchar u as v ->\n      let rem = o_rem e in\n      if u <= 0x007F then\n      if rem < 1 then flush (fun e -> encode_utf_8 e v) e else\n      (unsafe_set_byte e.o e.o_pos u; e.o_pos <- e.o_pos + 1; k e)\n      else if u <= 0x07FF then\n      begin\n        let s, j, k =\n          if rem < 2 then (t_range e 1; e.t, 0, t_flush k) else\n          let j = e.o_pos in (e.o_pos <- e.o_pos + 2; e.o, j, k)\n        in\n        unsafe_set_byte s j (0xC0 lor (u lsr 6));\n        unsafe_set_byte s (j + 1) (0x80 lor (u land 0x3F));\n        k e\n      end\n      else if u <= 0xFFFF then\n      begin\n        let s, j, k =\n          if rem < 3 then (t_range e 2; e.t, 0, t_flush k) else\n          let j = e.o_pos in (e.o_pos <- e.o_pos + 3; e.o, j, k)\n        in\n        unsafe_set_byte s j (0xE0 lor (u lsr 12));\n        unsafe_set_byte s (j + 1) (0x80 lor ((u lsr 6) land 0x3F));\n        unsafe_set_byte s (j + 2) (0x80 lor (u land 0x3F));\n        k e\n      end\n      else\n      begin\n        let s, j, k =\n          if rem < 4 then (t_range e 3; e.t, 0, t_flush k) else\n          let j = e.o_pos in (e.o_pos <- e.o_pos + 4; e.o, j, k)\n        in\n        unsafe_set_byte s j (0xF0 lor (u lsr 18));\n        unsafe_set_byte s (j + 1) (0x80 lor ((u lsr 12) land 0x3F));\n        unsafe_set_byte s (j + 2) (0x80 lor ((u lsr 6) land 0x3F));\n        unsafe_set_byte s (j + 3) (0x80 lor (u land 0x3F));\n        k e\n      end\n\nlet rec encode_utf_16be e v =\n  let k e = e.k <- encode_utf_16be; `Ok in\n  match v with\n  | `Await -> k e\n  | `End -> flush k e\n  | `Uchar u ->\n      let rem = o_rem e in\n      if u < 0x10000 then\n      begin\n        let s, j, k =\n          if rem < 2 then (t_range e 1; e.t, 0, t_flush k) else\n          let j = e.o_pos in (e.o_pos <- e.o_pos + 2; e.o, j, k)\n        in\n        unsafe_set_byte s j (u lsr 8);\n        unsafe_set_byte s (j + 1) (u land 0xFF);\n        k e\n      end else begin\n        let s, j, k =\n          if rem < 4 then (t_range e 3; e.t, 0, t_flush k) else\n          let j = e.o_pos in (e.o_pos <- e.o_pos + 4; e.o, j, k)\n        in\n        let u' = u - 0x10000 in\n        let hi = (0xD800 lor (u' lsr 10)) in\n        let lo = (0xDC00 lor (u' land 0x3FF)) in\n        unsafe_set_byte s j (hi lsr 8);\n        unsafe_set_byte s (j + 1) (hi land 0xFF);\n        unsafe_set_byte s (j + 2) (lo lsr 8);\n        unsafe_set_byte s (j + 3) (lo land 0xFF);\n        k e\n      end\n\nlet rec encode_utf_16le e v =         (* encode_uft_16be with bytes swapped. *)\n  let k e = e.k <- encode_utf_16le; `Ok in\n  match v with\n  | `Await -> k e\n  | `End -> flush k e\n  | `Uchar u ->\n    let rem = o_rem e in\n    if u < 0x10000 then\n    begin\n      let s, j, k =\n        if rem < 2 then (t_range e 1; e.t, 0, t_flush k) else\n        let j = e.o_pos in (e.o_pos <- e.o_pos + 2; e.o, j, k)\n      in\n      unsafe_set_byte s j (u land 0xFF);\n      unsafe_set_byte s (j + 1) (u lsr 8);\n      k e\n    end\n    else\n    begin\n      let s, j, k =\n        if rem < 4 then (t_range e 3; e.t, 0, t_flush k) else\n        let j = e.o_pos in (e.o_pos <- e.o_pos + 4; e.o, j, k)\n      in\n      let u' = u - 0x10000 in\n      let hi = (0xD800 lor (u' lsr 10)) in\n      let lo = (0xDC00 lor (u' land 0x3FF)) in\n      unsafe_set_byte s j (hi land 0xFF);\n      unsafe_set_byte s (j + 1) (hi lsr 8);\n      unsafe_set_byte s (j + 2) (lo land 0xFF);\n      unsafe_set_byte s (j + 3) (lo lsr 8);\n      k e\n    end\n\nlet encode_fun = function\n| `UTF_8 -> encode_utf_8\n| `UTF_16 -> encode_utf_16be\n| `UTF_16BE -> encode_utf_16be\n| `UTF_16LE -> encode_utf_16le\n\nlet encoder encoding dst =\n  let o, o_pos, o_max = match dst with\n  | `Manual -> \"\", 1, 0                              (* implies o_rem e = 0. *)\n  | `Buffer _\n  | `Channel _ -> String.create io_buffer_size, 0, io_buffer_size - 1\n  in\n  { dst = (dst :> dst); encoding = (encoding :> encoding); o; o_pos; o_max;\n    t = String.create 4; t_pos = 1; t_max = 0; k = encode_fun encoding}\n\nlet encode e v = e.k e (v :> encode)\nlet encoder_encoding e = e.encoding\nlet encoder_dst e = e.dst\n\n(* Manual sources and destinations. *)\n\nmodule Manual = struct\n  let src = src\n  let dst = dst\n  let dst_rem = o_rem\nend\n\n(* Strings folders and Buffer encoders *)\n\nmodule String = struct\n  let encoding_guess s = match r_encoding s 0 (max (String.length s) 3) with\n  | `UTF_8 d -> `UTF_8, (d = `BOM)\n  | `UTF_16BE d -> `UTF_16BE, (d = `BOM)\n  | `UTF_16LE d -> `UTF_16LE, (d = `BOM)\n\n  type 'a folder =\n    'a -> int -> [ `Uchar of uchar | `Malformed of string ] -> 'a\n\n  let fold_utf_8 f acc s =\n    let rec loop acc f s i l =\n      if i = l then acc else\n      let need = unsafe_array_get utf_8_len (unsafe_byte s i) in\n      if need = 0 then loop (f acc i (malformed s i 1)) f s (i + 1) l else\n      let rem = l - i in\n      if rem < need then f acc i (malformed s i rem) else\n      loop (f acc i (r_utf_8 s i need)) f s (i + need) l\n    in\n    loop acc f s 0 (String.length s)\n\n  let fold_utf_16be f acc s =\n    let rec loop acc f s i l =\n      if i = l then acc else\n      let rem = l - i in\n      if rem < 2 then f acc i (malformed s i 1) else\n      match r_utf_16 s i (i + 1) with\n      | `Uchar _ | `Malformed _ as v -> loop (f acc i v) f s (i + 2) l\n      | `Hi hi ->\n          if rem < 4 then f acc i (malformed s i rem)  else\n          loop (f acc i (r_utf_16_lo hi s (i + 2) (i + 3))) f s (i + 4) l\n    in\n    loop acc f s 0 (String.length s)\n\n  let fold_utf_16le f acc s =             (* [fold_utf_16be], bytes swapped. *)\n    let rec loop acc f s i l =\n      if i = l then acc else\n      let rem = l - i in\n      if rem < 2 then f acc i (malformed s i 1) else\n      match r_utf_16 s (i + 1) i with\n      | `Uchar _ | `Malformed _ as v -> loop (f acc i v) f s (i + 2) l\n      | `Hi hi ->\n          if rem < 4 then f acc i (malformed s i rem)  else\n          loop (f acc i (r_utf_16_lo hi s (i + 3) (i + 2))) f s (i + 4) l\n    in\n    loop acc f s 0 (String.length s)\nend\n\nmodule Buffer = struct\n  let add_utf_8 b u =\n    let w byte = Buffer.add_char b (unsafe_chr byte) in          (* inlined. *)\n    if u <= 0x007F then\n    (w u)\n    else if u <= 0x07FF then\n    (w (0xC0 lor (u lsr 6));\n     w (0x80 lor (u land 0x3F)))\n    else if u <= 0xFFFF then\n    (w (0xE0 lor (u lsr 12));\n     w (0x80 lor ((u lsr 6) land 0x3F));\n     w (0x80 lor (u land 0x3F)))\n    else\n    (w (0xF0 lor (u lsr 18));\n     w (0x80 lor ((u lsr 12) land 0x3F));\n     w (0x80 lor ((u lsr 6) land 0x3F));\n     w (0x80 lor (u land 0x3F)))\n\n  let add_utf_16be b u =\n    let w byte = Buffer.add_char b (unsafe_chr byte) in          (* inlined. *)\n    if u < 0x10000 then (w (u lsr 8); w (u land 0xFF)) else\n    let u' = u - 0x10000 in\n    let hi = (0xD800 lor (u' lsr 10)) in\n    let lo = (0xDC00 lor (u' land 0x3FF)) in\n    w (hi lsr 8); w (hi land 0xFF);\n    w (lo lsr 8); w (lo land 0xFF)\n\n  let add_utf_16le b u =                            (* swapped add_utf_16be. *)\n    let w byte = Buffer.add_char b (unsafe_chr byte) in          (* inlined. *)\n    if u < 0x10000 then (w (u land 0xFF); w (u lsr 8)) else\n    let u' = u - 0x10000 in\n    let hi = (0xD800 lor (u' lsr 10)) in\n    let lo = (0xDC00 lor (u' land 0x3FF)) in\n    w (hi land 0xFF); w (hi lsr 8);\n    w (lo land 0xFF); w (lo lsr 8)\nend\n\n(*---------------------------------------------------------------------------\n   Copyright 2012 Daniel C. Bünzli\n   All rights reserved.\n\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions\n   are met:\n\n   1. Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n\n   3. Neither the name of Daniel C. Bünzli nor the names of\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n  ---------------------------------------------------------------------------*)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/ASIHTTPRequest.h",
    "content": "//\n//  ASIHTTPRequest.h\n//\n//  Created by Ben Copsey on 04/10/2007.\n//  Copyright 2007-2011 All-Seeing Interactive. All rights reserved.\n//\n//  A guide to the main features is available at:\n//  http://allseeing-i.com/ASIHTTPRequest\n//\n//  Portions are based on the ImageClient example from Apple:\n//  See: http://developer.apple.com/samplecode/ImageClient/listing37.html\n\n#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n\t#import <CFNetwork/CFNetwork.h>\n\t#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0\n\t#import <UIKit/UIKit.h> // Necessary for background task support\n\t#endif\n#endif\n\n#import <stdio.h>\n#import \"ASIHTTPRequestConfig.h\"\n#import \"ASIHTTPRequestDelegate.h\"\n#import \"ASIProgressDelegate.h\"\n#import \"ASICacheDelegate.h\"\n\n@class ASIDataDecompressor;\n\nextern NSString *ASIHTTPRequestVersion;\n\n// Make targeting different platforms more reliable\n// See: http://www.blumtnwerx.com/blog/2009/06/cross-sdk-code-hygiene-in-xcode/\n#ifndef __IPHONE_3_2\n\t#define __IPHONE_3_2 30200\n#endif\n#ifndef __IPHONE_4_0\n\t#define __IPHONE_4_0 40000\n#endif\n#ifndef __MAC_10_5\n\t#define __MAC_10_5 1050\n#endif\n#ifndef __MAC_10_6\n\t#define __MAC_10_6 1060\n#endif\n\ntypedef enum _ASIAuthenticationState {\n\tASINoAuthenticationNeededYet = 0,\n\tASIHTTPAuthenticationNeeded = 1,\n\tASIProxyAuthenticationNeeded = 2\n} ASIAuthenticationState;\n\ntypedef enum _ASINetworkErrorType {\n    ASIConnectionFailureErrorType = 1,\n    ASIRequestTimedOutErrorType = 2,\n    ASIAuthenticationErrorType = 3,\n    ASIRequestCancelledErrorType = 4,\n    ASIUnableToCreateRequestErrorType = 5,\n    ASIInternalErrorWhileBuildingRequestType  = 6,\n    ASIInternalErrorWhileApplyingCredentialsType  = 7,\n\tASIFileManagementError = 8,\n\tASITooMuchRedirectionErrorType = 9,\n\tASIUnhandledExceptionError = 10,\n\tASICompressionError = 11\n\t\n} ASINetworkErrorType;\n\n\n// The error domain that all errors generated by ASIHTTPRequest use\nextern NSString* const NetworkRequestErrorDomain;\n\n// You can use this number to throttle upload and download bandwidth in iPhone OS apps send or receive a large amount of data\n// This may help apps that might otherwise be rejected for inclusion into the app store for using excessive bandwidth\n// This number is not official, as far as I know there is no officially documented bandwidth limit\nextern unsigned long const ASIWWANBandwidthThrottleAmount;\n\n#if NS_BLOCKS_AVAILABLE\ntypedef void (^ASIBasicBlock)(void);\ntypedef void (^ASIHeadersBlock)(NSDictionary *responseHeaders);\ntypedef void (^ASISizeBlock)(long long size);\ntypedef void (^ASIProgressBlock)(unsigned long long size, unsigned long long total);\ntypedef void (^ASIDataBlock)(NSData *data);\n#endif\n\n@interface ASIHTTPRequest : NSOperation <NSCopying> {\n\t\n\t// The url for this operation, should include GET params in the query string where appropriate\n\tNSURL *url; \n\t\n\t// Will always contain the original url used for making the request (the value of url can change when a request is redirected)\n\tNSURL *originalURL;\n\t\n\t// Temporarily stores the url we are about to redirect to. Will be nil again when we do redirect\n\tNSURL *redirectURL;\n\n\t// The delegate - will be notified of various changes in state via the ASIHTTPRequestDelegate protocol\n\tid <ASIHTTPRequestDelegate> delegate;\n\t\n\t// Another delegate that is also notified of request status changes and progress updates\n\t// Generally, you won't use this directly, but ASINetworkQueue sets itself as the queue so it can proxy updates to its own delegates\n\t// NOTE: WILL BE RETAINED BY THE REQUEST\n\tid <ASIHTTPRequestDelegate, ASIProgressDelegate> queue;\n\t\n\t// HTTP method to use (eg: GET / POST / PUT / DELETE / HEAD etc). Defaults to GET\n\tNSString *requestMethod;\n\t\n\t// Request body - only used when the whole body is stored in memory (shouldStreamPostDataFromDisk is false)\n\tNSMutableData *postBody;\n\t\n\t// gzipped request body used when shouldCompressRequestBody is YES\n\tNSData *compressedPostBody;\n\t\n\t// When true, post body will be streamed from a file on disk, rather than loaded into memory at once (useful for large uploads)\n\t// Automatically set to true in ASIFormDataRequests when using setFile:forKey:\n\tBOOL shouldStreamPostDataFromDisk;\n\t\n\t// Path to file used to store post body (when shouldStreamPostDataFromDisk is true)\n\t// You can set this yourself - useful if you want to PUT a file from local disk \n\tNSString *postBodyFilePath;\n\t\n\t// Path to a temporary file used to store a deflated post body (when shouldCompressPostBody is YES)\n\tNSString *compressedPostBodyFilePath;\n\t\n\t// Set to true when ASIHTTPRequest automatically created a temporary file containing the request body (when true, the file at postBodyFilePath will be deleted at the end of the request)\n\tBOOL didCreateTemporaryPostDataFile;\n\t\n\t// Used when writing to the post body when shouldStreamPostDataFromDisk is true (via appendPostData: or appendPostDataFromFile:)\n\tNSOutputStream *postBodyWriteStream;\n\t\n\t// Used for reading from the post body when sending the request\n\tNSInputStream *postBodyReadStream;\n\t\n\t// Dictionary for custom HTTP request headers\n\tNSMutableDictionary *requestHeaders;\n\t\n\t// Set to YES when the request header dictionary has been populated, used to prevent this happening more than once\n\tBOOL haveBuiltRequestHeaders;\n\t\n\t// Will be populated with HTTP response headers from the server\n\tNSDictionary *responseHeaders;\n\t\n\t// Can be used to manually insert cookie headers to a request, but it's more likely that sessionCookies will do this for you\n\tNSMutableArray *requestCookies;\n\t\n\t// Will be populated with cookies\n\tNSArray *responseCookies;\n\t\n\t// If use useCookiePersistence is true, network requests will present valid cookies from previous requests\n\tBOOL useCookiePersistence;\n\t\n\t// If useKeychainPersistence is true, network requests will attempt to read credentials from the keychain, and will save them in the keychain when they are successfully presented\n\tBOOL useKeychainPersistence;\n\t\n\t// If useSessionPersistence is true, network requests will save credentials and reuse for the duration of the session (until clearSession is called)\n\tBOOL useSessionPersistence;\n\t\n\t// If allowCompressedResponse is true, requests will inform the server they can accept compressed data, and will automatically decompress gzipped responses. Default is true.\n\tBOOL allowCompressedResponse;\n\t\n\t// If shouldCompressRequestBody is true, the request body will be gzipped. Default is false.\n\t// You will probably need to enable this feature on your webserver to make this work. Tested with apache only.\n\tBOOL shouldCompressRequestBody;\n\t\n\t// When downloadDestinationPath is set, the result of this request will be downloaded to the file at this location\n\t// If downloadDestinationPath is not set, download data will be stored in memory\n\tNSString *downloadDestinationPath;\n\t\n\t// The location that files will be downloaded to. Once a download is complete, files will be decompressed (if necessary) and moved to downloadDestinationPath\n\tNSString *temporaryFileDownloadPath;\n\t\n\t// If the response is gzipped and shouldWaitToInflateCompressedResponses is NO, a file will be created at this path containing the inflated response as it comes in\n\tNSString *temporaryUncompressedDataDownloadPath;\n\t\n\t// Used for writing data to a file when downloadDestinationPath is set\n\tNSOutputStream *fileDownloadOutputStream;\n\t\n\tNSOutputStream *inflatedFileDownloadOutputStream;\n\t\n\t// When the request fails or completes successfully, complete will be true\n\tBOOL complete;\n\t\n    // external \"finished\" indicator, subject of KVO notifications; updates after 'complete'\n    BOOL finished;\n    \n    // True if our 'cancel' selector has been called\n    BOOL cancelled;\n    \n\t// If an error occurs, error will contain an NSError\n\t// If error code is = ASIConnectionFailureErrorType (1, Connection failure occurred) - inspect [[error userInfo] objectForKey:NSUnderlyingErrorKey] for more information\n\tNSError *error;\n\t\n\t// Username and password used for authentication\n\tNSString *username;\n\tNSString *password;\n\t\n\t// User-Agent for this request\n\tNSString *userAgentString;\n\t\n\t// Domain used for NTLM authentication\n\tNSString *domain;\n\t\n\t// Username and password used for proxy authentication\n\tNSString *proxyUsername;\n\tNSString *proxyPassword;\n\t\n\t// Domain used for NTLM proxy authentication\n\tNSString *proxyDomain;\n\t\n\t// Delegate for displaying upload progress (usually an NSProgressIndicator, but you can supply a different object and handle this yourself)\n\tid <ASIProgressDelegate> uploadProgressDelegate;\n\t\n\t// Delegate for displaying download progress (usually an NSProgressIndicator, but you can supply a different object and handle this yourself)\n\tid <ASIProgressDelegate> downloadProgressDelegate;\n\t\n\t// Whether we've seen the headers of the response yet\n    BOOL haveExaminedHeaders;\n\t\n\t// Data we receive will be stored here. Data may be compressed unless allowCompressedResponse is false - you should use [request responseData] instead in most cases\n\tNSMutableData *rawResponseData;\n\t\n\t// Used for sending and receiving data\n    CFHTTPMessageRef request;\t\n\tNSInputStream *readStream;\n\t\n\t// Used for authentication\n    CFHTTPAuthenticationRef requestAuthentication; \n\tNSDictionary *requestCredentials;\n\t\n\t// Used during NTLM authentication\n\tint authenticationRetryCount;\n\t\n\t// Authentication scheme (Basic, Digest, NTLM)\n\t// If you are using Basic authentication and want to force ASIHTTPRequest to send an authorization header without waiting for a 401, you must set this to (NSString *)kCFHTTPAuthenticationSchemeBasic\n\tNSString *authenticationScheme;\n\t\n\t// Realm for authentication when credentials are required\n\tNSString *authenticationRealm;\n\t\n\t// When YES, ASIHTTPRequest will present a dialog allowing users to enter credentials when no-matching credentials were found for a server that requires authentication\n\t// The dialog will not be shown if your delegate responds to authenticationNeededForRequest:\n\t// Default is NO.\n\tBOOL shouldPresentAuthenticationDialog;\n\t\n\t// When YES, ASIHTTPRequest will present a dialog allowing users to enter credentials when no-matching credentials were found for a proxy server that requires authentication\n\t// The dialog will not be shown if your delegate responds to proxyAuthenticationNeededForRequest:\n\t// Default is YES (basically, because most people won't want the hassle of adding support for authenticating proxies to their apps)\n\tBOOL shouldPresentProxyAuthenticationDialog;\t\n\t\n\t// Used for proxy authentication\n    CFHTTPAuthenticationRef proxyAuthentication; \n\tNSDictionary *proxyCredentials;\n\t\n\t// Used during authentication with an NTLM proxy\n\tint proxyAuthenticationRetryCount;\n\t\n\t// Authentication scheme for the proxy (Basic, Digest, NTLM)\n\tNSString *proxyAuthenticationScheme;\t\n\t\n\t// Realm for proxy authentication when credentials are required\n\tNSString *proxyAuthenticationRealm;\n\t\n\t// HTTP status code, eg: 200 = OK, 404 = Not found etc\n\tint responseStatusCode;\n\t\n\t// Description of the HTTP status code\n\tNSString *responseStatusMessage;\n\t\n\t// Size of the response\n\tunsigned long long contentLength;\n\t\n\t// Size of the partially downloaded content\n\tunsigned long long partialDownloadSize;\n\t\n\t// Size of the POST payload\n\tunsigned long long postLength;\t\n\t\n\t// The total amount of downloaded data\n\tunsigned long long totalBytesRead;\n\t\n\t// The total amount of uploaded data\n\tunsigned long long totalBytesSent;\n\t\n\t// Last amount of data read (used for incrementing progress)\n\tunsigned long long lastBytesRead;\n\t\n\t// Last amount of data sent (used for incrementing progress)\n\tunsigned long long lastBytesSent;\n\t\n\t// This lock prevents the operation from being cancelled at an inopportune moment\n\tNSRecursiveLock *cancelledLock;\n\t\n\t// Called on the delegate (if implemented) when the request starts. Default is requestStarted:\n\tSEL didStartSelector;\n\t\n\t// Called on the delegate (if implemented) when the request receives response headers. Default is request:didReceiveResponseHeaders:\n\tSEL didReceiveResponseHeadersSelector;\n\n\t// Called on the delegate (if implemented) when the request receives a Location header and shouldRedirect is YES\n\t// The delegate can then change the url if needed, and can restart the request by calling [request redirectToURL:], or simply cancel it\n\tSEL willRedirectSelector;\n\n\t// Called on the delegate (if implemented) when the request completes successfully. Default is requestFinished:\n\tSEL didFinishSelector;\n\t\n\t// Called on the delegate (if implemented) when the request fails. Default is requestFailed:\n\tSEL didFailSelector;\n\t\n\t// Called on the delegate (if implemented) when the request receives data. Default is request:didReceiveData:\n\t// If you set this and implement the method in your delegate, you must handle the data yourself - ASIHTTPRequest will not populate responseData or write the data to downloadDestinationPath\n\tSEL didReceiveDataSelector;\n\t\n\t// Used for recording when something last happened during the request, we will compare this value with the current date to time out requests when appropriate\n\tNSDate *lastActivityTime;\n\t\n\t// Number of seconds to wait before timing out - default is 10\n\tNSTimeInterval timeOutSeconds;\n\t\n\t// Will be YES when a HEAD request will handle the content-length before this request starts\n\tBOOL shouldResetUploadProgress;\n\tBOOL shouldResetDownloadProgress;\n\t\n\t// Used by HEAD requests when showAccurateProgress is YES to preset the content-length for this request\n\tASIHTTPRequest *mainRequest;\n\t\n\t// When NO, this request will only update the progress indicator when it completes\n\t// When YES, this request will update the progress indicator according to how much data it has received so far\n\t// The default for requests is YES\n\t// Also see the comments in ASINetworkQueue.h\n\tBOOL showAccurateProgress;\n\t\n\t// Used to ensure the progress indicator is only incremented once when showAccurateProgress = NO\n\tBOOL updatedProgress;\n\t\n\t// Prevents the body of the post being built more than once (largely for subclasses)\n\tBOOL haveBuiltPostBody;\n\t\n\t// Used internally, may reflect the size of the internal buffer used by CFNetwork\n\t// POST / PUT operations with body sizes greater than uploadBufferSize will not timeout unless more than uploadBufferSize bytes have been sent\n\t// Likely to be 32KB on iPhone 3.0, 128KB on Mac OS X Leopard and iPhone 2.2.x\n\tunsigned long long uploadBufferSize;\n\t\n\t// Text encoding for responses that do not send a Content-Type with a charset value. Defaults to NSISOLatin1StringEncoding\n\tNSStringEncoding defaultResponseEncoding;\n\t\n\t// The text encoding of the response, will be defaultResponseEncoding if the server didn't specify. Can't be set.\n\tNSStringEncoding responseEncoding;\n\t\n\t// Tells ASIHTTPRequest not to delete partial downloads, and allows it to use an existing file to resume a download. Defaults to NO.\n\tBOOL allowResumeForFileDownloads;\n\t\n\t// Custom user information associated with the request (not sent to the server)\n\tNSDictionary *userInfo;\n\tNSInteger tag;\n\t\n\t// Use HTTP 1.0 rather than 1.1 (defaults to false)\n\tBOOL useHTTPVersionOne;\n\t\n\t// When YES, requests will automatically redirect when they get a HTTP 30x header (defaults to YES)\n\tBOOL shouldRedirect;\n\t\n\t// Used internally to tell the main loop we need to stop and retry with a new url\n\tBOOL needsRedirect;\n\t\n\t// Incremented every time this request redirects. When it reaches 5, we give up\n\tint redirectCount;\n\t\n\t// When NO, requests will not check the secure certificate is valid (use for self-signed certificates during development, DO NOT USE IN PRODUCTION) Default is YES\n\tBOOL validatesSecureCertificate;\n    \n    // If not nil and the URL scheme is https, CFNetwork configured to supply a client certificate\n    SecIdentityRef clientCertificateIdentity;\n\tNSArray *clientCertificates;\n\t\n\t// Details on the proxy to use - you could set these yourself, but it's probably best to let ASIHTTPRequest detect the system proxy settings\n\tNSString *proxyHost;\n\tint proxyPort;\n\t\n\t// ASIHTTPRequest will assume kCFProxyTypeHTTP if the proxy type could not be automatically determined\n\t// Set to kCFProxyTypeSOCKS if you are manually configuring a SOCKS proxy\n\tNSString *proxyType;\n\n\t// URL for a PAC (Proxy Auto Configuration) file. If you want to set this yourself, it's probably best if you use a local file\n\tNSURL *PACurl;\n\t\n\t// See ASIAuthenticationState values above. 0 == default == No authentication needed yet\n\tASIAuthenticationState authenticationNeeded;\n\t\n\t// When YES, ASIHTTPRequests will present credentials from the session store for requests to the same server before being asked for them\n\t// This avoids an extra round trip for requests after authentication has succeeded, which is much for efficient for authenticated requests with large bodies, or on slower connections\n\t// Set to NO to only present credentials when explicitly asked for them\n\t// This only affects credentials stored in the session cache when useSessionPersistence is YES. Credentials from the keychain are never presented unless the server asks for them\n\t// Default is YES\n\t// For requests using Basic authentication, set authenticationScheme to (NSString *)kCFHTTPAuthenticationSchemeBasic, and credentials can be sent on the very first request when shouldPresentCredentialsBeforeChallenge is YES\n\tBOOL shouldPresentCredentialsBeforeChallenge;\n\t\n\t// YES when the request hasn't finished yet. Will still be YES even if the request isn't doing anything (eg it's waiting for delegate authentication). READ-ONLY\n\tBOOL inProgress;\n\t\n\t// Used internally to track whether the stream is scheduled on the run loop or not\n\t// Bandwidth throttling can unschedule the stream to slow things down while a request is in progress\n\tBOOL readStreamIsScheduled;\n\t\n\t// Set to allow a request to automatically retry itself on timeout\n\t// Default is zero - timeout will stop the request\n\tint numberOfTimesToRetryOnTimeout;\n\n\t// The number of times this request has retried (when numberOfTimesToRetryOnTimeout > 0)\n\tint retryCount;\n\n\t// Temporarily set to YES when a closed connection forces a retry (internally, this stops ASIHTTPRequest cleaning up a temporary post body)\n\tBOOL willRetryRequest;\n\n\t// When YES, requests will keep the connection to the server alive for a while to allow subsequent requests to re-use it for a substantial speed-boost\n\t// Persistent connections will not be used if the server explicitly closes the connection\n\t// Default is YES\n\tBOOL shouldAttemptPersistentConnection;\n\n\t// Number of seconds to keep an inactive persistent connection open on the client side\n\t// Default is 60\n\t// If we get a keep-alive header, this is this value is replaced with how long the server told us to keep the connection around\n\t// A future date is created from this and used for expiring the connection, this is stored in connectionInfo's expires value\n\tNSTimeInterval persistentConnectionTimeoutSeconds;\n\t\n\t// Set to yes when an appropriate keep-alive header is found\n\tBOOL connectionCanBeReused;\n\t\n\t// Stores information about the persistent connection that is currently in use.\n\t// It may contain:\n\t// * The id we set for a particular connection, incremented every time we want to specify that we need a new connection\n\t// * The date that connection should expire\n\t// * A host, port and scheme for the connection. These are used to determine whether that connection can be reused by a subsequent request (all must match the new request)\n\t// * An id for the request that is currently using the connection. This is used for determining if a connection is available or not (we store a number rather than a reference to the request so we don't need to hang onto a request until the connection expires)\n\t// * A reference to the stream that is currently using the connection. This is necessary because we need to keep the old stream open until we've opened a new one.\n\t//   The stream will be closed + released either when another request comes to use the connection, or when the timer fires to tell the connection to expire\n\tNSMutableDictionary *connectionInfo;\n\t\n\t// When set to YES, 301 and 302 automatic redirects will use the original method and and body, according to the HTTP 1.1 standard\n\t// Default is NO (to follow the behaviour of most browsers)\n\tBOOL shouldUseRFC2616RedirectBehaviour;\n\t\n\t// Used internally to record when a request has finished downloading data\n\tBOOL downloadComplete;\n\t\n\t// An ID that uniquely identifies this request - primarily used for debugging persistent connections\n\tNSNumber *requestID;\n\t\n\t// Will be ASIHTTPRequestRunLoopMode for synchronous requests, NSDefaultRunLoopMode for all other requests\n\tNSString *runLoopMode;\n\t\n\t// This timer checks up on the request every 0.25 seconds, and updates progress\n\tNSTimer *statusTimer;\n\t\n\t// The download cache that will be used for this request (use [ASIHTTPRequest setDefaultCache:cache] to configure a default cache\n\tid <ASICacheDelegate> downloadCache;\n\t\n\t// The cache policy that will be used for this request - See ASICacheDelegate.h for possible values\n\tASICachePolicy cachePolicy;\n\t\n\t// The cache storage policy that will be used for this request - See ASICacheDelegate.h for possible values\n\tASICacheStoragePolicy cacheStoragePolicy;\n\t\n\t// Will be true when the response was pulled from the cache rather than downloaded\n\tBOOL didUseCachedResponse;\n\n\t// Set secondsToCache to use a custom time interval for expiring the response when it is stored in a cache\n\tNSTimeInterval secondsToCache;\n\n\t#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0\n\tBOOL shouldContinueWhenAppEntersBackground;\n\tUIBackgroundTaskIdentifier backgroundTask;\n\t#endif\n\t\n\t// When downloading a gzipped response, the request will use this helper object to inflate the response\n\tASIDataDecompressor *dataDecompressor;\n\t\n\t// Controls how responses with a gzipped encoding are inflated (decompressed)\n\t// When set to YES (This is the default):\n\t// * gzipped responses for requests without a downloadDestinationPath will be inflated only when [request responseData] / [request responseString] is called\n\t// * gzipped responses for requests with a downloadDestinationPath set will be inflated only when the request completes\n\t//\n\t// When set to NO\n\t// All requests will inflate the response as it comes in\n\t// * If the request has no downloadDestinationPath set, the raw (compressed) response is discarded and rawResponseData will contain the decompressed response\n\t// * If the request has a downloadDestinationPath, the raw response will be stored in temporaryFileDownloadPath as normal, the inflated response will be stored in temporaryUncompressedDataDownloadPath\n\t//   Once the request completes successfully, the contents of temporaryUncompressedDataDownloadPath are moved into downloadDestinationPath\n\t//\n\t// Setting this to NO may be especially useful for users using ASIHTTPRequest in conjunction with a streaming parser, as it will allow partial gzipped responses to be inflated and passed on to the parser while the request is still running\n\tBOOL shouldWaitToInflateCompressedResponses;\n\n\t// Will be YES if this is a request created behind the scenes to download a PAC file - these requests do not attempt to configure their own proxies\n\tBOOL isPACFileRequest;\n\n\t// Used for downloading PAC files from http / https webservers\n\tASIHTTPRequest *PACFileRequest;\n\n\t// Used for asynchronously reading PAC files from file:// URLs\n\tNSInputStream *PACFileReadStream;\n\n\t// Used for storing PAC data from file URLs as it is downloaded\n\tNSMutableData *PACFileData;\n\n\t// Set to YES in startSynchronous. Currently used by proxy detection to download PAC files synchronously when appropriate\n\tBOOL isSynchronous;\n\n\t#if NS_BLOCKS_AVAILABLE\n\t//block to execute when request starts\n\tASIBasicBlock startedBlock;\n\n\t//block to execute when headers are received\n\tASIHeadersBlock headersReceivedBlock;\n\n\t//block to execute when request completes successfully\n\tASIBasicBlock completionBlock;\n\n\t//block to execute when request fails\n\tASIBasicBlock failureBlock;\n\n\t//block for when bytes are received\n\tASIProgressBlock bytesReceivedBlock;\n\n\t//block for when bytes are sent\n\tASIProgressBlock bytesSentBlock;\n\n\t//block for when download size is incremented\n\tASISizeBlock downloadSizeIncrementedBlock;\n\n\t//block for when upload size is incremented\n\tASISizeBlock uploadSizeIncrementedBlock;\n\n\t//block for handling raw bytes received\n\tASIDataBlock dataReceivedBlock;\n\n\t//block for handling authentication\n\tASIBasicBlock authenticationNeededBlock;\n\n\t//block for handling proxy authentication\n\tASIBasicBlock proxyAuthenticationNeededBlock;\n\t\n    //block for handling redirections, if you want to\n    ASIBasicBlock requestRedirectedBlock;\n\t#endif\n}\n\n#pragma mark init / dealloc\n\n// Should be an HTTP or HTTPS url, may include username and password if appropriate\n- (id)initWithURL:(NSURL *)newURL;\n\n// Convenience constructor\n+ (id)requestWithURL:(NSURL *)newURL;\n\n+ (id)requestWithURL:(NSURL *)newURL usingCache:(id <ASICacheDelegate>)cache;\n+ (id)requestWithURL:(NSURL *)newURL usingCache:(id <ASICacheDelegate>)cache andCachePolicy:(ASICachePolicy)policy;\n\n#if NS_BLOCKS_AVAILABLE\n- (void)setStartedBlock:(ASIBasicBlock)aStartedBlock;\n- (void)setHeadersReceivedBlock:(ASIHeadersBlock)aReceivedBlock;\n- (void)setCompletionBlock:(ASIBasicBlock)aCompletionBlock;\n- (void)setFailedBlock:(ASIBasicBlock)aFailedBlock;\n- (void)setBytesReceivedBlock:(ASIProgressBlock)aBytesReceivedBlock;\n- (void)setBytesSentBlock:(ASIProgressBlock)aBytesSentBlock;\n- (void)setDownloadSizeIncrementedBlock:(ASISizeBlock) aDownloadSizeIncrementedBlock;\n- (void)setUploadSizeIncrementedBlock:(ASISizeBlock) anUploadSizeIncrementedBlock;\n- (void)setDataReceivedBlock:(ASIDataBlock)aReceivedBlock;\n- (void)setAuthenticationNeededBlock:(ASIBasicBlock)anAuthenticationBlock;\n- (void)setProxyAuthenticationNeededBlock:(ASIBasicBlock)aProxyAuthenticationBlock;\n- (void)setRequestRedirectedBlock:(ASIBasicBlock)aRedirectBlock;\n#endif\n\n#pragma mark setup request\n\n// Add a custom header to the request\n- (void)addRequestHeader:(NSString *)header value:(NSString *)value;\n\n// Called during buildRequestHeaders and after a redirect to create a cookie header from request cookies and the global store\n- (void)applyCookieHeader;\n\n// Populate the request headers dictionary. Called before a request is started, or by a HEAD request that needs to borrow them\n- (void)buildRequestHeaders;\n\n// Used to apply authorization header to a request before it is sent (when shouldPresentCredentialsBeforeChallenge is YES)\n- (void)applyAuthorizationHeader;\n\n\n// Create the post body\n- (void)buildPostBody;\n\n// Called to add data to the post body. Will append to postBody when shouldStreamPostDataFromDisk is false, or write to postBodyWriteStream when true\n- (void)appendPostData:(NSData *)data;\n- (void)appendPostDataFromFile:(NSString *)file;\n\n#pragma mark get information about this request\n\n// Returns the contents of the result as an NSString (not appropriate for binary data - used responseData instead)\n- (NSString *)responseString;\n\n// Response data, automatically uncompressed where appropriate\n- (NSData *)responseData;\n\n// Returns true if the response was gzip compressed\n- (BOOL)isResponseCompressed;\n\n#pragma mark running a request\n\n\n// Run a request synchronously, and return control when the request completes or fails\n- (void)startSynchronous;\n\n// Run request in the background\n- (void)startAsynchronous;\n\n// Clears all delegates and blocks, then cancels the request\n- (void)clearDelegatesAndCancel;\n\n#pragma mark HEAD request\n\n// Used by ASINetworkQueue to create a HEAD request appropriate for this request with the same headers (though you can use it yourself)\n- (ASIHTTPRequest *)HEADRequest;\n\n#pragma mark upload/download progress\n\n// Called approximately every 0.25 seconds to update the progress delegates\n- (void)updateProgressIndicators;\n\n// Updates upload progress (notifies the queue and/or uploadProgressDelegate of this request)\n- (void)updateUploadProgress;\n\n// Updates download progress (notifies the queue and/or uploadProgressDelegate of this request)\n- (void)updateDownloadProgress;\n\n// Called when authorisation is needed, as we only find out we don't have permission to something when the upload is complete\n- (void)removeUploadProgressSoFar;\n\n// Called when we get a content-length header and shouldResetDownloadProgress is true\n- (void)incrementDownloadSizeBy:(long long)length;\n\n// Called when a request starts and shouldResetUploadProgress is true\n// Also called (with a negative length) to remove the size of the underlying buffer used for uploading\n- (void)incrementUploadSizeBy:(long long)length;\n\n// Helper method for interacting with progress indicators to abstract the details of different APIS (NSProgressIndicator and UIProgressView)\n+ (void)updateProgressIndicator:(id *)indicator withProgress:(unsigned long long)progress ofTotal:(unsigned long long)total;\n\n// Helper method used for performing invocations on the main thread (used for progress)\n+ (void)performSelector:(SEL)selector onTarget:(id *)target withObject:(id)object amount:(void *)amount callerToRetain:(id)caller;\n\n#pragma mark talking to delegates\n\n// Called when a request starts, lets the delegate know via didStartSelector\n- (void)requestStarted;\n\n// Called when a request receives response headers, lets the delegate know via didReceiveResponseHeadersSelector\n- (void)requestReceivedResponseHeaders:(NSDictionary *)newHeaders;\n\n// Called when a request completes successfully, lets the delegate know via didFinishSelector\n- (void)requestFinished;\n\n// Called when a request fails, and lets the delegate know via didFailSelector\n- (void)failWithError:(NSError *)theError;\n\n// Called to retry our request when our persistent connection is closed\n// Returns YES if we haven't already retried, and connection will be restarted\n// Otherwise, returns NO, and nothing will happen\n- (BOOL)retryUsingNewConnection;\n\n// Can be called by delegates from inside their willRedirectSelector implementations to restart the request with a new url\n- (void)redirectToURL:(NSURL *)newURL;\n\n#pragma mark parsing HTTP response headers\n\n// Reads the response headers to find the content length, encoding, cookies for the session \n// Also initiates request redirection when shouldRedirect is true\n// And works out if HTTP auth is required\n- (void)readResponseHeaders;\n\n// Attempts to set the correct encoding by looking at the Content-Type header, if this is one\n- (void)parseStringEncodingFromHeaders;\n\n+ (void)parseMimeType:(NSString **)mimeType andResponseEncoding:(NSStringEncoding *)stringEncoding fromContentType:(NSString *)contentType;\n\n#pragma mark http authentication stuff\n\n// Apply credentials to this request\n- (BOOL)applyCredentials:(NSDictionary *)newCredentials;\n- (BOOL)applyProxyCredentials:(NSDictionary *)newCredentials;\n\n// Attempt to obtain credentials for this request from the URL, username and password or keychain\n- (NSMutableDictionary *)findCredentials;\n- (NSMutableDictionary *)findProxyCredentials;\n\n// Unlock (unpause) the request thread so it can resume the request\n// Should be called by delegates when they have populated the authentication information after an authentication challenge\n- (void)retryUsingSuppliedCredentials;\n\n// Should be called by delegates when they wish to cancel authentication and stop\n- (void)cancelAuthentication;\n\n// Apply authentication information and resume the request after an authentication challenge\n- (void)attemptToApplyCredentialsAndResume;\n- (void)attemptToApplyProxyCredentialsAndResume;\n\n// Attempt to show the built-in authentication dialog, returns YES if credentials were supplied, NO if user cancelled dialog / dialog is disabled / running on main thread\n// Currently only used on iPhone OS\n- (BOOL)showProxyAuthenticationDialog;\n- (BOOL)showAuthenticationDialog;\n\n// Construct a basic authentication header from the username and password supplied, and add it to the request headers\n// Used when shouldPresentCredentialsBeforeChallenge is YES\n- (void)addBasicAuthenticationHeaderWithUsername:(NSString *)theUsername andPassword:(NSString *)thePassword;\n\n#pragma mark stream status handlers\n\n// CFnetwork event handlers\n- (void)handleNetworkEvent:(CFStreamEventType)type;\n- (void)handleBytesAvailable;\n- (void)handleStreamComplete;\n- (void)handleStreamError;\n\n#pragma mark cleanup\n\n// Cleans up and lets the queue know this operation is finished.\n// Appears in this header for subclassing only, do not call this method from outside your request!\n- (void)markAsFinished;\n\n// Cleans up temporary files. There's normally no reason to call these yourself, they are called automatically when a request completes or fails\n\n// Clean up the temporary file used to store the downloaded data when it comes in (if downloadDestinationPath is set)\n- (BOOL)removeTemporaryDownloadFile;\n\n// Clean up the temporary file used to store data that is inflated (decompressed) as it comes in\n- (BOOL)removeTemporaryUncompressedDownloadFile;\n\n// Clean up the temporary file used to store the request body (when shouldStreamPostDataFromDisk is YES)\n- (BOOL)removeTemporaryUploadFile;\n\n// Clean up the temporary file used to store a deflated (compressed) request body when shouldStreamPostDataFromDisk is YES\n- (BOOL)removeTemporaryCompressedUploadFile;\n\n// Remove a file on disk, returning NO and populating the passed error pointer if it fails\n+ (BOOL)removeFileAtPath:(NSString *)path error:(NSError **)err;\n\n#pragma mark persistent connections\n\n// Get the ID of the connection this request used (only really useful in tests and debugging)\n- (NSNumber *)connectionID;\n\n// Called automatically when a request is started to clean up any persistent connections that have expired\n+ (void)expirePersistentConnections;\n\n#pragma mark default time out\n\n+ (NSTimeInterval)defaultTimeOutSeconds;\n+ (void)setDefaultTimeOutSeconds:(NSTimeInterval)newTimeOutSeconds;\n\n#pragma mark client certificate\n\n- (void)setClientCertificateIdentity:(SecIdentityRef)anIdentity;\n\n#pragma mark session credentials\n\n+ (NSMutableArray *)sessionProxyCredentialsStore;\n+ (NSMutableArray *)sessionCredentialsStore;\n\n+ (void)storeProxyAuthenticationCredentialsInSessionStore:(NSDictionary *)credentials;\n+ (void)storeAuthenticationCredentialsInSessionStore:(NSDictionary *)credentials;\n\n+ (void)removeProxyAuthenticationCredentialsFromSessionStore:(NSDictionary *)credentials;\n+ (void)removeAuthenticationCredentialsFromSessionStore:(NSDictionary *)credentials;\n\n- (NSDictionary *)findSessionProxyAuthenticationCredentials;\n- (NSDictionary *)findSessionAuthenticationCredentials;\n\n#pragma mark keychain storage\n\n// Save credentials for this request to the keychain\n- (void)saveCredentialsToKeychain:(NSDictionary *)newCredentials;\n\n// Save credentials to the keychain\n+ (void)saveCredentials:(NSURLCredential *)credentials forHost:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm;\n+ (void)saveCredentials:(NSURLCredential *)credentials forProxy:(NSString *)host port:(int)port realm:(NSString *)realm;\n\n// Return credentials from the keychain\n+ (NSURLCredential *)savedCredentialsForHost:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm;\n+ (NSURLCredential *)savedCredentialsForProxy:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm;\n\n// Remove credentials from the keychain\n+ (void)removeCredentialsForHost:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm;\n+ (void)removeCredentialsForProxy:(NSString *)host port:(int)port realm:(NSString *)realm;\n\n// We keep track of any cookies we accept, so that we can remove them from the persistent store later\n+ (void)setSessionCookies:(NSMutableArray *)newSessionCookies;\n+ (NSMutableArray *)sessionCookies;\n\n// Adds a cookie to our list of cookies we've accepted, checking first for an old version of the same cookie and removing that\n+ (void)addSessionCookie:(NSHTTPCookie *)newCookie;\n\n// Dump all session data (authentication and cookies)\n+ (void)clearSession;\n\n#pragma mark get user agent\n\n// Will be used as a user agent if requests do not specify a custom user agent\n// Is only used when you have specified a Bundle Display Name (CFDisplayBundleName) or Bundle Name (CFBundleName) in your plist\n+ (NSString *)defaultUserAgentString;\n+ (void)setDefaultUserAgentString:(NSString *)agent;\n\n#pragma mark mime-type detection\n\n// Return the mime type for a file\n+ (NSString *)mimeTypeForFileAtPath:(NSString *)path;\n\n#pragma mark bandwidth measurement / throttling\n\n// The maximum number of bytes ALL requests can send / receive in a second\n// This is a rough figure. The actual amount used will be slightly more, this does not include HTTP headers\n+ (unsigned long)maxBandwidthPerSecond;\n+ (void)setMaxBandwidthPerSecond:(unsigned long)bytes;\n\n// Get a rough average (for the last 5 seconds) of how much bandwidth is being used, in bytes\n+ (unsigned long)averageBandwidthUsedPerSecond;\n\n- (void)performThrottling;\n\n// Will return YES is bandwidth throttling is currently in use\n+ (BOOL)isBandwidthThrottled;\n\n// Used internally to record bandwidth use, and by ASIInputStreams when uploading. It's probably best if you don't mess with this.\n+ (void)incrementBandwidthUsedInLastSecond:(unsigned long)bytes;\n\n// On iPhone, ASIHTTPRequest can automatically turn throttling on and off as the connection type changes between WWAN and WiFi\n\n#if TARGET_OS_IPHONE\n// Set to YES to automatically turn on throttling when WWAN is connected, and automatically turn it off when it isn't\n+ (void)setShouldThrottleBandwidthForWWAN:(BOOL)throttle;\n\n// Turns on throttling automatically when WWAN is connected using a custom limit, and turns it off automatically when it isn't\n+ (void)throttleBandwidthForWWANUsingLimit:(unsigned long)limit;\n\n#pragma mark reachability\n\n// Returns YES when an iPhone OS device is connected via WWAN, false when connected via WIFI or not connected\n+ (BOOL)isNetworkReachableViaWWAN;\n\n#endif\n\n#pragma mark queue\n\n// Returns the shared queue\n+ (NSOperationQueue *)sharedQueue;\n\n#pragma mark cache\n\n+ (void)setDefaultCache:(id <ASICacheDelegate>)cache;\n+ (id <ASICacheDelegate>)defaultCache;\n\n// Returns the maximum amount of data we can read as part of the current measurement period, and sleeps this thread if our allowance is used up\n+ (unsigned long)maxUploadReadLength;\n\n#pragma mark network activity\n\n+ (BOOL)isNetworkInUse;\n\n+ (void)setShouldUpdateNetworkActivityIndicator:(BOOL)shouldUpdate;\n\n// Shows the network activity spinner thing on iOS. You may wish to override this to do something else in Mac projects\n+ (void)showNetworkActivityIndicator;\n\n// Hides the network activity spinner thing on iOS\n+ (void)hideNetworkActivityIndicator;\n\n#pragma mark miscellany\n\n// Used for generating Authorization header when using basic authentication when shouldPresentCredentialsBeforeChallenge is true\n// And also by ASIS3Request\n+ (NSString *)base64forData:(NSData *)theData;\n\n// Returns the expiration date for the request.\n// Calculated from the Expires response header property, unless maxAge is non-zero or\n// there exists a non-zero max-age property in the Cache-Control response header.\n+ (NSDate *)expiryDateForRequest:(ASIHTTPRequest *)request maxAge:(NSTimeInterval)maxAge;\n\n// Returns a date from a string in RFC1123 format\n+ (NSDate *)dateFromRFC1123String:(NSString *)string;\n\n\n// Used for detecting multitasking support at runtime (for backgrounding requests)\n#if TARGET_OS_IPHONE\n+ (BOOL)isMultitaskingSupported;\n#endif\n\n#pragma mark threading behaviour\n\n// In the default implementation, all requests run in a single background thread\n// Advanced users only: Override this method in a subclass for a different threading behaviour\n// Eg: return [NSThread mainThread] to run all requests in the main thread\n// Alternatively, you can create a thread on demand, or manage a pool of threads\n// Threads returned by this method will need to run the runloop in default mode (eg CFRunLoopRun())\n// Requests will stop the runloop when they complete\n// If you have multiple requests sharing the thread you'll need to restart the runloop when this happens\n+ (NSThread *)threadForRequest:(ASIHTTPRequest *)request;\n\n\n#pragma mark ===\n\n@property (retain) NSString *username;\n@property (retain) NSString *password;\n@property (retain) NSString *userAgentString;\n@property (retain) NSString *domain;\n\n@property (retain) NSString *proxyUsername;\n@property (retain) NSString *proxyPassword;\n@property (retain) NSString *proxyDomain;\n\n@property (retain) NSString *proxyHost;\n@property (assign) int proxyPort;\n@property (retain) NSString *proxyType;\n\n@property (retain,setter=setURL:, nonatomic) NSURL *url;\n@property (retain) NSURL *originalURL;\n@property (assign, nonatomic) id delegate;\n@property (retain, nonatomic) id queue;\n@property (assign, nonatomic) id uploadProgressDelegate;\n@property (assign, nonatomic) id downloadProgressDelegate;\n@property (assign) BOOL useKeychainPersistence;\n@property (assign) BOOL useSessionPersistence;\n@property (retain) NSString *downloadDestinationPath;\n@property (retain) NSString *temporaryFileDownloadPath;\n@property (retain) NSString *temporaryUncompressedDataDownloadPath;\n@property (assign) SEL didStartSelector;\n@property (assign) SEL didReceiveResponseHeadersSelector;\n@property (assign) SEL willRedirectSelector;\n@property (assign) SEL didFinishSelector;\n@property (assign) SEL didFailSelector;\n@property (assign) SEL didReceiveDataSelector;\n@property (retain,readonly) NSString *authenticationRealm;\n@property (retain,readonly) NSString *proxyAuthenticationRealm;\n@property (retain) NSError *error;\n@property (assign,readonly) BOOL complete;\n@property (retain) NSDictionary *responseHeaders;\n@property (retain) NSMutableDictionary *requestHeaders;\n@property (retain) NSMutableArray *requestCookies;\n@property (retain,readonly) NSArray *responseCookies;\n@property (assign) BOOL useCookiePersistence;\n@property (retain) NSDictionary *requestCredentials;\n@property (retain) NSDictionary *proxyCredentials;\n@property (assign,readonly) int responseStatusCode;\n@property (retain,readonly) NSString *responseStatusMessage;\n@property (retain) NSMutableData *rawResponseData;\n@property (assign) NSTimeInterval timeOutSeconds;\n@property (retain, nonatomic) NSString *requestMethod;\n@property (retain) NSMutableData *postBody;\n@property (assign) unsigned long long contentLength;\n@property (assign) unsigned long long postLength;\n@property (assign) BOOL shouldResetDownloadProgress;\n@property (assign) BOOL shouldResetUploadProgress;\n@property (assign) ASIHTTPRequest *mainRequest;\n@property (assign) BOOL showAccurateProgress;\n@property (assign) unsigned long long totalBytesRead;\n@property (assign) unsigned long long totalBytesSent;\n@property (assign) NSStringEncoding defaultResponseEncoding;\n@property (assign) NSStringEncoding responseEncoding;\n@property (assign) BOOL allowCompressedResponse;\n@property (assign) BOOL allowResumeForFileDownloads;\n@property (retain) NSDictionary *userInfo;\n@property (assign) NSInteger tag;\n@property (retain) NSString *postBodyFilePath;\n@property (assign) BOOL shouldStreamPostDataFromDisk;\n@property (assign) BOOL didCreateTemporaryPostDataFile;\n@property (assign) BOOL useHTTPVersionOne;\n@property (assign, readonly) unsigned long long partialDownloadSize;\n@property (assign) BOOL shouldRedirect;\n@property (assign) BOOL validatesSecureCertificate;\n@property (assign) BOOL shouldCompressRequestBody;\n@property (retain) NSURL *PACurl;\n@property (retain) NSString *authenticationScheme;\n@property (retain) NSString *proxyAuthenticationScheme;\n@property (assign) BOOL shouldPresentAuthenticationDialog;\n@property (assign) BOOL shouldPresentProxyAuthenticationDialog;\n@property (assign, readonly) ASIAuthenticationState authenticationNeeded;\n@property (assign) BOOL shouldPresentCredentialsBeforeChallenge;\n@property (assign, readonly) int authenticationRetryCount;\n@property (assign, readonly) int proxyAuthenticationRetryCount;\n@property (assign) BOOL haveBuiltRequestHeaders;\n@property (assign, nonatomic) BOOL haveBuiltPostBody;\n@property (assign, readonly) BOOL inProgress;\n@property (assign) int numberOfTimesToRetryOnTimeout;\n@property (assign, readonly) int retryCount;\n@property (assign) BOOL shouldAttemptPersistentConnection;\n@property (assign) NSTimeInterval persistentConnectionTimeoutSeconds;\n@property (assign) BOOL shouldUseRFC2616RedirectBehaviour;\n@property (assign, readonly) BOOL connectionCanBeReused;\n@property (retain, readonly) NSNumber *requestID;\n@property (assign) id <ASICacheDelegate> downloadCache;\n@property (assign) ASICachePolicy cachePolicy;\n@property (assign) ASICacheStoragePolicy cacheStoragePolicy;\n@property (assign, readonly) BOOL didUseCachedResponse;\n@property (assign) NSTimeInterval secondsToCache;\n@property (retain) NSArray *clientCertificates;\n#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0\n@property (assign) BOOL shouldContinueWhenAppEntersBackground;\n#endif\n@property (retain) ASIDataDecompressor *dataDecompressor;\n@property (assign) BOOL shouldWaitToInflateCompressedResponses;\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/ASIHTTPRequest.m",
    "content": "//\n//  ASIHTTPRequest.m\n//\n//  Created by Ben Copsey on 04/10/2007.\n//  Copyright 2007-2011 All-Seeing Interactive. All rights reserved.\n//\n//  A guide to the main features is available at:\n//  http://allseeing-i.com/ASIHTTPRequest\n//\n//  Portions are based on the ImageClient example from Apple:\n//  See: http://developer.apple.com/samplecode/ImageClient/listing37.html\n\n#import \"ASIHTTPRequest.h\"\n\n#if TARGET_OS_IPHONE\n#import \"Reachability.h\"\n#import \"ASIAuthenticationDialog.h\"\n#import <MobileCoreServices/MobileCoreServices.h>\n#else\n#import <SystemConfiguration/SystemConfiguration.h>\n#endif\n#import \"ASIInputStream.h\"\n#import \"ASIDataDecompressor.h\"\n#import \"ASIDataCompressor.h\"\n\n// Automatically set on build\nNSString *ASIHTTPRequestVersion = @\"v1.8.1-61 2011-09-19\";\n\nstatic NSString *defaultUserAgent = nil;\n\nNSString* const NetworkRequestErrorDomain = @\"ASIHTTPRequestErrorDomain\";\n\nstatic NSString *ASIHTTPRequestRunLoopMode = @\"ASIHTTPRequestRunLoopMode\";\n\nstatic const CFOptionFlags kNetworkEvents =  kCFStreamEventHasBytesAvailable | kCFStreamEventEndEncountered | kCFStreamEventErrorOccurred;\n\n// In memory caches of credentials, used on when useSessionPersistence is YES\nstatic NSMutableArray *sessionCredentialsStore = nil;\nstatic NSMutableArray *sessionProxyCredentialsStore = nil;\n\n// This lock mediates access to session credentials\nstatic NSRecursiveLock *sessionCredentialsLock = nil;\n\n// We keep track of cookies we have received here so we can remove them from the sharedHTTPCookieStorage later\nstatic NSMutableArray *sessionCookies = nil;\n\n// The number of times we will allow requests to redirect before we fail with a redirection error\nconst int RedirectionLimit = 5;\n\n// The default number of seconds to use for a timeout\nstatic NSTimeInterval defaultTimeOutSeconds = 10;\n\nstatic void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventType type, void *clientCallBackInfo) {\n    [((ASIHTTPRequest*)clientCallBackInfo) handleNetworkEvent: type];\n}\n\n// This lock prevents the operation from being cancelled while it is trying to update the progress, and vice versa\nstatic NSRecursiveLock *progressLock;\n\nstatic NSError *ASIRequestCancelledError;\nstatic NSError *ASIRequestTimedOutError;\nstatic NSError *ASIAuthenticationError;\nstatic NSError *ASIUnableToCreateRequestError;\nstatic NSError *ASITooMuchRedirectionError;\n\nstatic NSMutableArray *bandwidthUsageTracker = nil;\nstatic unsigned long averageBandwidthUsedPerSecond = 0;\n\n// These are used for queuing persistent connections on the same connection\n\n// Incremented every time we specify we want a new connection\nstatic unsigned int nextConnectionNumberToCreate = 0;\n\n// An array of connectionInfo dictionaries.\n// When attempting a persistent connection, we look here to try to find an existing connection to the same server that is currently not in use\nstatic NSMutableArray *persistentConnectionsPool = nil;\n\n// Mediates access to the persistent connections pool\nstatic NSRecursiveLock *connectionsLock = nil;\n\n// Each request gets a new id, we store this rather than a ref to the request itself in the connectionInfo dictionary.\n// We do this so we don't have to keep the request around while we wait for the connection to expire\nstatic unsigned int nextRequestID = 0;\n\n// Records how much bandwidth all requests combined have used in the last second\nstatic unsigned long bandwidthUsedInLastSecond = 0; \n\n// A date one second in the future from the time it was created\nstatic NSDate *bandwidthMeasurementDate = nil;\n\n// Since throttling variables are shared among all requests, we'll use a lock to mediate access\nstatic NSLock *bandwidthThrottlingLock = nil;\n\n// the maximum number of bytes that can be transmitted in one second\nstatic unsigned long maxBandwidthPerSecond = 0;\n\n// A default figure for throttling bandwidth on mobile devices\nunsigned long const ASIWWANBandwidthThrottleAmount = 14800;\n\n#if TARGET_OS_IPHONE\n// YES when bandwidth throttling is active\n// This flag does not denote whether throttling is turned on - rather whether it is currently in use\n// It will be set to NO when throttling was turned on with setShouldThrottleBandwidthForWWAN, but a WI-FI connection is active\nstatic BOOL isBandwidthThrottled = NO;\n\n// When YES, bandwidth will be automatically throttled when using WWAN (3G/Edge/GPRS)\n// Wifi will not be throttled\nstatic BOOL shouldThrottleBandwidthForWWANOnly = NO;\n#endif\n\n// Mediates access to the session cookies so requests\nstatic NSRecursiveLock *sessionCookiesLock = nil;\n\n// This lock ensures delegates only receive one notification that authentication is required at once\n// When using ASIAuthenticationDialogs, it also ensures only one dialog is shown at once\n// If a request can't acquire the lock immediately, it means a dialog is being shown or a delegate is handling the authentication challenge\n// Once it gets the lock, it will try to look for existing credentials again rather than showing the dialog / notifying the delegate\n// This is so it can make use of any credentials supplied for the other request, if they are appropriate\nstatic NSRecursiveLock *delegateAuthenticationLock = nil;\n\n// When throttling bandwidth, Set to a date in future that we will allow all requests to wake up and reschedule their streams\nstatic NSDate *throttleWakeUpTime = nil;\n\nstatic id <ASICacheDelegate> defaultCache = nil;\n\n// Used for tracking when requests are using the network\nstatic unsigned int runningRequestCount = 0;\n\n// You can use [ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:NO] if you want to manage it yourself\n// Alternatively, override showNetworkActivityIndicator / hideNetworkActivityIndicator\n// By default this does nothing on Mac OS X, but again override the above methods for a different behaviour\nstatic BOOL shouldUpdateNetworkActivityIndicator = YES;\n\n// The thread all requests will run on\n// Hangs around forever, but will be blocked unless there are requests underway\nstatic NSThread *networkThread = nil;\n\nstatic NSOperationQueue *sharedQueue = nil;\n\n// Private stuff\n@interface ASIHTTPRequest ()\n\n- (void)cancelLoad;\n\n- (void)destroyReadStream;\n- (void)scheduleReadStream;\n- (void)unscheduleReadStream;\n\n- (BOOL)willAskDelegateForCredentials;\n- (BOOL)willAskDelegateForProxyCredentials;\n- (void)askDelegateForProxyCredentials;\n- (void)askDelegateForCredentials;\n- (void)failAuthentication;\n\n+ (void)measureBandwidthUsage;\n+ (void)recordBandwidthUsage;\n\n- (void)startRequest;\n- (void)updateStatus:(NSTimer *)timer;\n- (void)checkRequestStatus;\n- (void)reportFailure;\n- (void)reportFinished;\n- (void)markAsFinished;\n- (void)performRedirect;\n- (BOOL)shouldTimeOut;\n- (BOOL)willRedirect;\n- (BOOL)willAskDelegateToConfirmRedirect;\n\n+ (void)performInvocation:(NSInvocation *)invocation onTarget:(id *)target releasingObject:(id)objectToRelease;\n+ (void)hideNetworkActivityIndicatorAfterDelay;\n+ (void)hideNetworkActivityIndicatorIfNeeeded;\n+ (void)runRequests;\n\n// Handling Proxy autodetection and PAC file downloads\n- (BOOL)configureProxies;\n- (void)fetchPACFile;\n- (void)finishedDownloadingPACFile:(ASIHTTPRequest *)theRequest;\n- (void)runPACScript:(NSString *)script;\n- (void)timeOutPACRead;\n\n- (void)useDataFromCache;\n\n// Called to update the size of a partial download when starting a request, or retrying after a timeout\n- (void)updatePartialDownloadSize;\n\n#if TARGET_OS_IPHONE\n+ (void)registerForNetworkReachabilityNotifications;\n+ (void)unsubscribeFromNetworkReachabilityNotifications;\n// Called when the status of the network changes\n+ (void)reachabilityChanged:(NSNotification *)note;\n#endif\n\n#if NS_BLOCKS_AVAILABLE\n- (void)performBlockOnMainThread:(ASIBasicBlock)block;\n- (void)releaseBlocksOnMainThread;\n+ (void)releaseBlocks:(NSArray *)blocks;\n- (void)callBlock:(ASIBasicBlock)block;\n#endif\n\n\n\n\n\n@property (assign) BOOL complete;\n@property (retain) NSArray *responseCookies;\n@property (assign) int responseStatusCode;\n@property (retain, nonatomic) NSDate *lastActivityTime;\n\n@property (assign) unsigned long long partialDownloadSize;\n@property (assign, nonatomic) unsigned long long uploadBufferSize;\n@property (retain, nonatomic) NSOutputStream *postBodyWriteStream;\n@property (retain, nonatomic) NSInputStream *postBodyReadStream;\n@property (assign, nonatomic) unsigned long long lastBytesRead;\n@property (assign, nonatomic) unsigned long long lastBytesSent;\n@property (retain) NSRecursiveLock *cancelledLock;\n@property (retain, nonatomic) NSOutputStream *fileDownloadOutputStream;\n@property (retain, nonatomic) NSOutputStream *inflatedFileDownloadOutputStream;\n@property (assign) int authenticationRetryCount;\n@property (assign) int proxyAuthenticationRetryCount;\n@property (assign, nonatomic) BOOL updatedProgress;\n@property (assign, nonatomic) BOOL needsRedirect;\n@property (assign, nonatomic) int redirectCount;\n@property (retain, nonatomic) NSData *compressedPostBody;\n@property (retain, nonatomic) NSString *compressedPostBodyFilePath;\n@property (retain) NSString *authenticationRealm;\n@property (retain) NSString *proxyAuthenticationRealm;\n@property (retain) NSString *responseStatusMessage;\n@property (assign) BOOL inProgress;\n@property (assign) int retryCount;\n@property (assign) BOOL willRetryRequest;\n@property (assign) BOOL connectionCanBeReused;\n@property (retain, nonatomic) NSMutableDictionary *connectionInfo;\n@property (retain, nonatomic) NSInputStream *readStream;\n@property (assign) ASIAuthenticationState authenticationNeeded;\n@property (assign, nonatomic) BOOL readStreamIsScheduled;\n@property (assign, nonatomic) BOOL downloadComplete;\n@property (retain) NSNumber *requestID;\n@property (assign, nonatomic) NSString *runLoopMode;\n@property (retain, nonatomic) NSTimer *statusTimer;\n@property (assign) BOOL didUseCachedResponse;\n@property (retain, nonatomic) NSURL *redirectURL;\n\n@property (assign, nonatomic) BOOL isPACFileRequest;\n@property (retain, nonatomic) ASIHTTPRequest *PACFileRequest;\n@property (retain, nonatomic) NSInputStream *PACFileReadStream;\n@property (retain, nonatomic) NSMutableData *PACFileData;\n\n@property (assign, nonatomic, setter=setSynchronous:) BOOL isSynchronous;\n@end\n\n\n@implementation ASIHTTPRequest\n\n#pragma mark init / dealloc\n\n+ (void)initialize\n{\n\tif (self == [ASIHTTPRequest class]) {\n\t\tpersistentConnectionsPool = [[NSMutableArray alloc] init];\n\t\tconnectionsLock = [[NSRecursiveLock alloc] init];\n\t\tprogressLock = [[NSRecursiveLock alloc] init];\n\t\tbandwidthThrottlingLock = [[NSLock alloc] init];\n\t\tsessionCookiesLock = [[NSRecursiveLock alloc] init];\n\t\tsessionCredentialsLock = [[NSRecursiveLock alloc] init];\n\t\tdelegateAuthenticationLock = [[NSRecursiveLock alloc] init];\n\t\tbandwidthUsageTracker = [[NSMutableArray alloc] initWithCapacity:5];\n\t\tASIRequestTimedOutError = [[NSError alloc] initWithDomain:NetworkRequestErrorDomain code:ASIRequestTimedOutErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"The request timed out\",NSLocalizedDescriptionKey,nil]];  \n\t\tASIAuthenticationError = [[NSError alloc] initWithDomain:NetworkRequestErrorDomain code:ASIAuthenticationErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Authentication needed\",NSLocalizedDescriptionKey,nil]];\n\t\tASIRequestCancelledError = [[NSError alloc] initWithDomain:NetworkRequestErrorDomain code:ASIRequestCancelledErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"The request was cancelled\",NSLocalizedDescriptionKey,nil]];\n\t\tASIUnableToCreateRequestError = [[NSError alloc] initWithDomain:NetworkRequestErrorDomain code:ASIUnableToCreateRequestErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Unable to create request (bad url?)\",NSLocalizedDescriptionKey,nil]];\n\t\tASITooMuchRedirectionError = [[NSError alloc] initWithDomain:NetworkRequestErrorDomain code:ASITooMuchRedirectionErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"The request failed because it redirected too many times\",NSLocalizedDescriptionKey,nil]];\n\t\tsharedQueue = [[NSOperationQueue alloc] init];\n\t\t[sharedQueue setMaxConcurrentOperationCount:4];\n\n\t}\n}\n\n\n- (id)initWithURL:(NSURL *)newURL\n{\n\tself = [self init];\n\t[self setRequestMethod:@\"GET\"];\n\n\t[self setRunLoopMode:NSDefaultRunLoopMode];\n\t[self setShouldAttemptPersistentConnection:YES];\n\t[self setPersistentConnectionTimeoutSeconds:60.0];\n\t[self setShouldPresentCredentialsBeforeChallenge:YES];\n\t[self setShouldRedirect:YES];\n\t[self setShowAccurateProgress:YES];\n\t[self setShouldResetDownloadProgress:YES];\n\t[self setShouldResetUploadProgress:YES];\n\t[self setAllowCompressedResponse:YES];\n\t[self setShouldWaitToInflateCompressedResponses:YES];\n\t[self setDefaultResponseEncoding:NSISOLatin1StringEncoding];\n\t[self setShouldPresentProxyAuthenticationDialog:YES];\n\t\n\t[self setTimeOutSeconds:[ASIHTTPRequest defaultTimeOutSeconds]];\n\t[self setUseSessionPersistence:YES];\n\t[self setUseCookiePersistence:YES];\n\t[self setValidatesSecureCertificate:YES];\n\t[self setRequestCookies:[[[NSMutableArray alloc] init] autorelease]];\n\t[self setDidStartSelector:@selector(requestStarted:)];\n\t[self setDidReceiveResponseHeadersSelector:@selector(request:didReceiveResponseHeaders:)];\n\t[self setWillRedirectSelector:@selector(request:willRedirectToURL:)];\n\t[self setDidFinishSelector:@selector(requestFinished:)];\n\t[self setDidFailSelector:@selector(requestFailed:)];\n\t[self setDidReceiveDataSelector:@selector(request:didReceiveData:)];\n\t[self setURL:newURL];\n\t[self setCancelledLock:[[[NSRecursiveLock alloc] init] autorelease]];\n\t[self setDownloadCache:[[self class] defaultCache]];\n\treturn self;\n}\n\n+ (id)requestWithURL:(NSURL *)newURL\n{\n\treturn [[[self alloc] initWithURL:newURL] autorelease];\n}\n\n+ (id)requestWithURL:(NSURL *)newURL usingCache:(id <ASICacheDelegate>)cache\n{\n\treturn [self requestWithURL:newURL usingCache:cache andCachePolicy:ASIUseDefaultCachePolicy];\n}\n\n+ (id)requestWithURL:(NSURL *)newURL usingCache:(id <ASICacheDelegate>)cache andCachePolicy:(ASICachePolicy)policy\n{\n\tASIHTTPRequest *request = [[[self alloc] initWithURL:newURL] autorelease];\n\t[request setDownloadCache:cache];\n\t[request setCachePolicy:policy];\n\treturn request;\n}\n\n- (void)dealloc\n{\n\t[self setAuthenticationNeeded:ASINoAuthenticationNeededYet];\n\tif (requestAuthentication) {\n\t\tCFRelease(requestAuthentication);\n\t}\n\tif (proxyAuthentication) {\n\t\tCFRelease(proxyAuthentication);\n\t}\n\tif (request) {\n\t\tCFRelease(request);\n\t}\n\tif (clientCertificateIdentity) {\n\t\tCFRelease(clientCertificateIdentity);\n\t}\n\t[self cancelLoad];\n\t[redirectURL release];\n\t[statusTimer invalidate];\n\t[statusTimer release];\n\t[queue release];\n\t[userInfo release];\n\t[postBody release];\n\t[compressedPostBody release];\n\t[error release];\n\t[requestHeaders release];\n\t[requestCookies release];\n\t[downloadDestinationPath release];\n\t[temporaryFileDownloadPath release];\n\t[temporaryUncompressedDataDownloadPath release];\n\t[fileDownloadOutputStream release];\n\t[inflatedFileDownloadOutputStream release];\n\t[username release];\n\t[password release];\n\t[domain release];\n\t[authenticationRealm release];\n\t[authenticationScheme release];\n\t[requestCredentials release];\n\t[proxyHost release];\n\t[proxyType release];\n\t[proxyUsername release];\n\t[proxyPassword release];\n\t[proxyDomain release];\n\t[proxyAuthenticationRealm release];\n\t[proxyAuthenticationScheme release];\n\t[proxyCredentials release];\n\t[url release];\n\t[originalURL release];\n\t[lastActivityTime release];\n\t[responseCookies release];\n\t[rawResponseData release];\n\t[responseHeaders release];\n\t[requestMethod release];\n\t[cancelledLock release];\n\t[postBodyFilePath release];\n\t[compressedPostBodyFilePath release];\n\t[postBodyWriteStream release];\n\t[postBodyReadStream release];\n\t[PACurl release];\n\t[clientCertificates release];\n\t[responseStatusMessage release];\n\t[connectionInfo release];\n\t[requestID release];\n\t[dataDecompressor release];\n\t[userAgentString release];\n\n\t#if NS_BLOCKS_AVAILABLE\n\t[self releaseBlocksOnMainThread];\n\t#endif\n\n\t[super dealloc];\n}\n\n#if NS_BLOCKS_AVAILABLE\n- (void)releaseBlocksOnMainThread\n{\n\tNSMutableArray *blocks = [NSMutableArray array];\n\tif (completionBlock) {\n\t\t[blocks addObject:completionBlock];\n\t\t[completionBlock release];\n\t\tcompletionBlock = nil;\n\t}\n\tif (failureBlock) {\n\t\t[blocks addObject:failureBlock];\n\t\t[failureBlock release];\n\t\tfailureBlock = nil;\n\t}\n\tif (startedBlock) {\n\t\t[blocks addObject:startedBlock];\n\t\t[startedBlock release];\n\t\tstartedBlock = nil;\n\t}\n\tif (headersReceivedBlock) {\n\t\t[blocks addObject:headersReceivedBlock];\n\t\t[headersReceivedBlock release];\n\t\theadersReceivedBlock = nil;\n\t}\n\tif (bytesReceivedBlock) {\n\t\t[blocks addObject:bytesReceivedBlock];\n\t\t[bytesReceivedBlock release];\n\t\tbytesReceivedBlock = nil;\n\t}\n\tif (bytesSentBlock) {\n\t\t[blocks addObject:bytesSentBlock];\n\t\t[bytesSentBlock release];\n\t\tbytesSentBlock = nil;\n\t}\n\tif (downloadSizeIncrementedBlock) {\n\t\t[blocks addObject:downloadSizeIncrementedBlock];\n\t\t[downloadSizeIncrementedBlock release];\n\t\tdownloadSizeIncrementedBlock = nil;\n\t}\n\tif (uploadSizeIncrementedBlock) {\n\t\t[blocks addObject:uploadSizeIncrementedBlock];\n\t\t[uploadSizeIncrementedBlock release];\n\t\tuploadSizeIncrementedBlock = nil;\n\t}\n\tif (dataReceivedBlock) {\n\t\t[blocks addObject:dataReceivedBlock];\n\t\t[dataReceivedBlock release];\n\t\tdataReceivedBlock = nil;\n\t}\n\tif (proxyAuthenticationNeededBlock) {\n\t\t[blocks addObject:proxyAuthenticationNeededBlock];\n\t\t[proxyAuthenticationNeededBlock release];\n\t\tproxyAuthenticationNeededBlock = nil;\n\t}\n\tif (authenticationNeededBlock) {\n\t\t[blocks addObject:authenticationNeededBlock];\n\t\t[authenticationNeededBlock release];\n\t\tauthenticationNeededBlock = nil;\n\t}\n\tif (requestRedirectedBlock) {\n\t\t[blocks addObject:requestRedirectedBlock];\n\t\t[requestRedirectedBlock release];\n\t\trequestRedirectedBlock = nil;\n\t}\n\t[[self class] performSelectorOnMainThread:@selector(releaseBlocks:) withObject:blocks waitUntilDone:[NSThread isMainThread]];\n}\n// Always called on main thread\n+ (void)releaseBlocks:(NSArray *)blocks\n{\n\t// Blocks will be released when this method exits\n}\n#endif\n\n\n#pragma mark setup request\n\n- (void)addRequestHeader:(NSString *)header value:(NSString *)value\n{\n\tif (!requestHeaders) {\n\t\t[self setRequestHeaders:[NSMutableDictionary dictionaryWithCapacity:1]];\n\t}\n\t[requestHeaders setObject:value forKey:header];\n}\n\n// This function will be called either just before a request starts, or when postLength is needed, whichever comes first\n// postLength must be set by the time this function is complete\n- (void)buildPostBody\n{\n\n\tif ([self haveBuiltPostBody]) {\n\t\treturn;\n\t}\n\t\n\t// Are we submitting the request body from a file on disk\n\tif ([self postBodyFilePath]) {\n\t\t\n\t\t// If we were writing to the post body via appendPostData or appendPostDataFromFile, close the write stream\n\t\tif ([self postBodyWriteStream]) {\n\t\t\t[[self postBodyWriteStream] close];\n\t\t\t[self setPostBodyWriteStream:nil];\n\t\t}\n\n\t\t\n\t\tNSString *path;\n\t\tif ([self shouldCompressRequestBody]) {\n\t\t\tif (![self compressedPostBodyFilePath]) {\n\t\t\t\t[self setCompressedPostBodyFilePath:[NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]];\n\t\t\t\t\n\t\t\t\tNSError *err = nil;\n\t\t\t\tif (![ASIDataCompressor compressDataFromFile:[self postBodyFilePath] toFile:[self compressedPostBodyFilePath] error:&err]) {\n\t\t\t\t\t[self failWithError:err];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpath = [self compressedPostBodyFilePath];\n\t\t} else {\n\t\t\tpath = [self postBodyFilePath];\n\t\t}\n\t\tNSError *err = nil;\n\t\t[self setPostLength:[[[[[NSFileManager alloc] init] autorelease] attributesOfItemAtPath:path error:&err] fileSize]];\n\t\tif (err) {\n\t\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIFileManagementError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@\"Failed to get attributes for file at path '%@'\",path],NSLocalizedDescriptionKey,error,NSUnderlyingErrorKey,nil]]];\n\t\t\treturn;\n\t\t}\n\t\t\n\t// Otherwise, we have an in-memory request body\n\t} else {\n\t\tif ([self shouldCompressRequestBody]) {\n\t\t\tNSError *err = nil;\n\t\t\tNSData *compressedBody = [ASIDataCompressor compressData:[self postBody] error:&err];\n\t\t\tif (err) {\n\t\t\t\t[self failWithError:err];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t[self setCompressedPostBody:compressedBody];\n\t\t\t[self setPostLength:[[self compressedPostBody] length]];\n\t\t} else {\n\t\t\t[self setPostLength:[[self postBody] length]];\n\t\t}\n\t}\n\t\t\n\tif ([self postLength] > 0) {\n\t\tif ([requestMethod isEqualToString:@\"GET\"] || [requestMethod isEqualToString:@\"DELETE\"] || [requestMethod isEqualToString:@\"HEAD\"]) {\n\t\t\t[self setRequestMethod:@\"POST\"];\n\t\t}\n\t\t[self addRequestHeader:@\"Content-Length\" value:[NSString stringWithFormat:@\"%llu\",[self postLength]]];\n\t}\n\t[self setHaveBuiltPostBody:YES];\n\n}\n\n// Sets up storage for the post body\n- (void)setupPostBody\n{\n\tif ([self shouldStreamPostDataFromDisk]) {\n\t\tif (![self postBodyFilePath]) {\n\t\t\t[self setPostBodyFilePath:[NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]];\n\t\t\t[self setDidCreateTemporaryPostDataFile:YES];\n\t\t}\n\t\tif (![self postBodyWriteStream]) {\n\t\t\t[self setPostBodyWriteStream:[[[NSOutputStream alloc] initToFileAtPath:[self postBodyFilePath] append:NO] autorelease]];\n\t\t\t[[self postBodyWriteStream] open];\n\t\t}\n\t} else {\n\t\tif (![self postBody]) {\n\t\t\t[self setPostBody:[[[NSMutableData alloc] init] autorelease]];\n\t\t}\n\t}\t\n}\n\n- (void)appendPostData:(NSData *)data\n{\n\t[self setupPostBody];\n\tif ([data length] == 0) {\n\t\treturn;\n\t}\n\tif ([self shouldStreamPostDataFromDisk]) {\n\t\t[[self postBodyWriteStream] write:[data bytes] maxLength:[data length]];\n\t} else {\n\t\t[[self postBody] appendData:data];\n\t}\n}\n\n- (void)appendPostDataFromFile:(NSString *)file\n{\n\t[self setupPostBody];\n\tNSInputStream *stream = [[[NSInputStream alloc] initWithFileAtPath:file] autorelease];\n\t[stream open];\n\tNSUInteger bytesRead;\n\twhile ([stream hasBytesAvailable]) {\n\t\t\n\t\tunsigned char buffer[1024*256];\n\t\tbytesRead = [stream read:buffer maxLength:sizeof(buffer)];\n\t\tif (bytesRead == 0) {\n\t\t\tbreak;\n\t\t}\n\t\tif ([self shouldStreamPostDataFromDisk]) {\n\t\t\t[[self postBodyWriteStream] write:buffer maxLength:bytesRead];\n\t\t} else {\n\t\t\t[[self postBody] appendData:[NSData dataWithBytes:buffer length:bytesRead]];\n\t\t}\n\t}\n\t[stream close];\n}\n\n- (NSString *)requestMethod\n{\n\t[[self cancelledLock] lock];\n\tNSString *m = requestMethod;\n\t[[self cancelledLock] unlock];\n\treturn m;\n}\n\n- (void)setRequestMethod:(NSString *)newRequestMethod\n{\n\t[[self cancelledLock] lock];\n\tif (requestMethod != newRequestMethod) {\n\t\t[requestMethod release];\n\t\trequestMethod = [newRequestMethod retain];\n\t\tif ([requestMethod isEqualToString:@\"POST\"] || [requestMethod isEqualToString:@\"PUT\"] || [postBody length] || postBodyFilePath) {\n\t\t\t[self setShouldAttemptPersistentConnection:NO];\n\t\t}\n\t}\n\t[[self cancelledLock] unlock];\n}\n\n- (NSURL *)url\n{\n\t[[self cancelledLock] lock];\n\tNSURL *u = url;\n\t[[self cancelledLock] unlock];\n\treturn u;\n}\n\n\n- (void)setURL:(NSURL *)newURL\n{\n\t[[self cancelledLock] lock];\n\tif ([newURL isEqual:[self url]]) {\n\t\t[[self cancelledLock] unlock];\n\t\treturn;\n\t}\n\t[url release];\n\turl = [newURL retain];\n\tif (requestAuthentication) {\n\t\tCFRelease(requestAuthentication);\n\t\trequestAuthentication = NULL;\n\t}\n\tif (proxyAuthentication) {\n\t\tCFRelease(proxyAuthentication);\n\t\tproxyAuthentication = NULL;\n\t}\n\tif (request) {\n\t\tCFRelease(request);\n\t\trequest = NULL;\n\t}\n\t[self setRedirectURL:nil];\n\t[[self cancelledLock] unlock];\n}\n\n- (id)delegate\n{\n\t[[self cancelledLock] lock];\n\tid d = delegate;\n\t[[self cancelledLock] unlock];\n\treturn d;\n}\n\n- (void)setDelegate:(id)newDelegate\n{\n\t[[self cancelledLock] lock];\n\tdelegate = newDelegate;\n\t[[self cancelledLock] unlock];\n}\n\n- (id)queue\n{\n\t[[self cancelledLock] lock];\n\tid q = queue;\n\t[[self cancelledLock] unlock];\n\treturn q;\n}\n\n\n- (void)setQueue:(id)newQueue\n{\n\t[[self cancelledLock] lock];\n\tif (newQueue != queue) {\n\t\t[queue release];\n\t\tqueue = [newQueue retain];\n\t}\n\t[[self cancelledLock] unlock];\n}\n\n#pragma mark get information about this request\n\n// cancel the request - this must be run on the same thread as the request is running on\n- (void)cancelOnRequestThread\n{\n\t#if DEBUG_REQUEST_STATUS\n\tASI_DEBUG_LOG(@\"[STATUS] Request cancelled: %@\",self);\n\t#endif\n    \n\t[[self cancelledLock] lock];\n\n    if ([self isCancelled] || [self complete]) {\n\t\t[[self cancelledLock] unlock];\n\t\treturn;\n\t}\n\t[self failWithError:ASIRequestCancelledError];\n\t[self setComplete:YES];\n\t[self cancelLoad];\n\t\n\tCFRetain(self);\n    [self willChangeValueForKey:@\"isCancelled\"];\n    cancelled = YES;\n    [self didChangeValueForKey:@\"isCancelled\"];\n    \n\t[[self cancelledLock] unlock];\n\tCFRelease(self);\n}\n\n- (void)cancel\n{\n    [self performSelector:@selector(cancelOnRequestThread) onThread:[[self class] threadForRequest:self] withObject:nil waitUntilDone:NO];    \n}\n\n- (void)clearDelegatesAndCancel\n{\n\t[[self cancelledLock] lock];\n\n\t// Clear delegates\n\t[self setDelegate:nil];\n\t[self setQueue:nil];\n\t[self setDownloadProgressDelegate:nil];\n\t[self setUploadProgressDelegate:nil];\n\n\t#if NS_BLOCKS_AVAILABLE\n\t// Clear blocks\n\t[self releaseBlocksOnMainThread];\n\t#endif\n\n\t[[self cancelledLock] unlock];\n\t[self cancel];\n}\n\n\n- (BOOL)isCancelled\n{\n    BOOL result;\n    \n\t[[self cancelledLock] lock];\n    result = cancelled;\n    [[self cancelledLock] unlock];\n    \n    return result;\n}\n\n// Call this method to get the received data as an NSString. Don't use for binary data!\n- (NSString *)responseString\n{\n\tNSData *data = [self responseData];\n\tif (!data) {\n\t\treturn nil;\n\t}\n\t\n\treturn [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:[self responseEncoding]] autorelease];\n}\n\n- (BOOL)isResponseCompressed\n{\n\tNSString *encoding = [[self responseHeaders] objectForKey:@\"Content-Encoding\"];\n\treturn encoding && [encoding rangeOfString:@\"gzip\"].location != NSNotFound;\n}\n\n- (NSData *)responseData\n{\t\n\tif ([self isResponseCompressed] && [self shouldWaitToInflateCompressedResponses]) {\n\t\treturn [ASIDataDecompressor uncompressData:[self rawResponseData] error:NULL];\n\t} else {\n\t\treturn [self rawResponseData];\n\t}\n\treturn nil;\n}\n\n#pragma mark running a request\n\n- (void)startSynchronous\n{\n#if DEBUG_REQUEST_STATUS || DEBUG_THROTTLING\n\tASI_DEBUG_LOG(@\"[STATUS] Starting synchronous request %@\",self);\n#endif\n\t[self setSynchronous:YES];\n\t[self setRunLoopMode:ASIHTTPRequestRunLoopMode];\n\t[self setInProgress:YES];\n\n\tif (![self isCancelled] && ![self complete]) {\n\t\t[self main];\n\t\twhile (!complete) {\n\t\t\t[[NSRunLoop currentRunLoop] runMode:[self runLoopMode] beforeDate:[NSDate distantFuture]];\n\t\t}\n\t}\n\n\t[self setInProgress:NO];\n}\n\n- (void)start\n{\n\t[self setInProgress:YES];\n\t[self performSelector:@selector(main) onThread:[[self class] threadForRequest:self] withObject:nil waitUntilDone:NO];\n}\n\n- (void)startAsynchronous\n{\n#if DEBUG_REQUEST_STATUS || DEBUG_THROTTLING\n\tASI_DEBUG_LOG(@\"[STATUS] Starting asynchronous request %@\",self);\n#endif\n\t[sharedQueue addOperation:self];\n}\n\n#pragma mark concurrency\n\n- (BOOL)isConcurrent\n{\n    return YES;\n}\n\n- (BOOL)isFinished \n{\n\treturn finished;\n}\n\n- (BOOL)isExecuting {\n\treturn [self inProgress];\n}\n\n#pragma mark request logic\n\n// Create the request\n- (void)main\n{\n\t@try {\n\t\t\n\t\t[[self cancelledLock] lock];\n\t\t\n\t\t#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0\n\t\tif ([ASIHTTPRequest isMultitaskingSupported] && [self shouldContinueWhenAppEntersBackground]) {\n            if (!backgroundTask || backgroundTask == UIBackgroundTaskInvalid) {\n                backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{\n                    // Synchronize the cleanup call on the main thread in case\n                    // the task actually finishes at around the same time.\n                    dispatch_async(dispatch_get_main_queue(), ^{\n                        if (backgroundTask != UIBackgroundTaskInvalid)\n                        {\n                            [[UIApplication sharedApplication] endBackgroundTask:backgroundTask];\n                            backgroundTask = UIBackgroundTaskInvalid;\n                            [self cancel];\n                        }\n                    });\n                }];\n            }\n\t\t}\n\t\t#endif\n\n\n\t\t// A HEAD request generated by an ASINetworkQueue may have set the error already. If so, we should not proceed.\n\t\tif ([self error]) {\n\t\t\t[self setComplete:YES];\n\t\t\t[self markAsFinished];\n\t\t\treturn;\t\t\n\t\t}\n\n\t\t[self setComplete:NO];\n\t\t[self setDidUseCachedResponse:NO];\n\t\t\n\t\tif (![self url]) {\n\t\t\t[self failWithError:ASIUnableToCreateRequestError];\n\t\t\treturn;\t\t\n\t\t}\n\t\t\n\t\t// Must call before we create the request so that the request method can be set if needs be\n\t\tif (![self mainRequest]) {\n\t\t\t[self buildPostBody];\n\t\t}\n\t\t\n\t\tif (![[self requestMethod] isEqualToString:@\"GET\"]) {\n\t\t\t[self setDownloadCache:nil];\n\t\t}\n\t\t\n\t\t\n\t\t// If we're redirecting, we'll already have a CFHTTPMessageRef\n\t\tif (request) {\n\t\t\tCFRelease(request);\n\t\t}\n\n\t\t// Create a new HTTP request.\n\t\trequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, (CFStringRef)[self requestMethod], (CFURLRef)[self url], [self useHTTPVersionOne] ? kCFHTTPVersion1_0 : kCFHTTPVersion1_1);\n\t\tif (!request) {\n\t\t\t[self failWithError:ASIUnableToCreateRequestError];\n\t\t\treturn;\n\t\t}\n\n\t\t//If this is a HEAD request generated by an ASINetworkQueue, we need to let the main request generate its headers first so we can use them\n\t\tif ([self mainRequest]) {\n\t\t\t[[self mainRequest] buildRequestHeaders];\n\t\t}\n\t\t\n\t\t// Even if this is a HEAD request with a mainRequest, we still need to call to give subclasses a chance to add their own to HEAD requests (ASIS3Request does this)\n\t\t[self buildRequestHeaders];\n\t\t\n\t\tif ([self downloadCache]) {\n\n\t\t\t// If this request should use the default policy, set its policy to the download cache's default policy\n\t\t\tif (![self cachePolicy]) {\n\t\t\t\t[self setCachePolicy:[[self downloadCache] defaultCachePolicy]];\n\t\t\t}\n\n\t\t\t// If have have cached data that is valid for this request, use that and stop\n\t\t\tif ([[self downloadCache] canUseCachedDataForRequest:self]) {\n\t\t\t\t[self useDataFromCache];\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If cached data is stale, or we have been told to ask the server if it has been modified anyway, we need to add headers for a conditional GET\n\t\t\tif ([self cachePolicy] & (ASIAskServerIfModifiedWhenStaleCachePolicy|ASIAskServerIfModifiedCachePolicy)) {\n\n\t\t\t\tNSDictionary *cachedHeaders = [[self downloadCache] cachedResponseHeadersForURL:[self url]];\n\t\t\t\tif (cachedHeaders) {\n\t\t\t\t\tNSString *etag = [cachedHeaders objectForKey:@\"Etag\"];\n\t\t\t\t\tif (etag) {\n\t\t\t\t\t\t[[self requestHeaders] setObject:etag forKey:@\"If-None-Match\"];\n\t\t\t\t\t}\n\t\t\t\t\tNSString *lastModified = [cachedHeaders objectForKey:@\"Last-Modified\"];\n\t\t\t\t\tif (lastModified) {\n\t\t\t\t\t\t[[self requestHeaders] setObject:lastModified forKey:@\"If-Modified-Since\"];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t[self applyAuthorizationHeader];\n\t\t\n\t\t\n\t\tNSString *header;\n\t\tfor (header in [self requestHeaders]) {\n\t\t\tCFHTTPMessageSetHeaderFieldValue(request, (CFStringRef)header, (CFStringRef)[[self requestHeaders] objectForKey:header]);\n\t\t}\n\n\t\t// If we immediately have access to proxy settings, start the request\n\t\t// Otherwise, we'll start downloading the proxy PAC file, and call startRequest once that process is complete\n\t\tif ([self configureProxies]) {\n\t\t\t[self startRequest];\n\t\t}\n\n\t} @catch (NSException *exception) {\n\t\tNSError *underlyingError = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASIUnhandledExceptionError userInfo:[exception userInfo]];\n\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIUnhandledExceptionError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[exception name],NSLocalizedDescriptionKey,[exception reason],NSLocalizedFailureReasonErrorKey,underlyingError,NSUnderlyingErrorKey,nil]]];\n\n\t} @finally {\n\t\t[[self cancelledLock] unlock];\n\t}\n}\n\n- (void)applyAuthorizationHeader\n{\n\t// Do we want to send credentials before we are asked for them?\n\tif (![self shouldPresentCredentialsBeforeChallenge]) {\n\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will not send credentials to the server until it asks for them\",self);\n\t\t#endif\n\t\treturn;\n\t}\n\n\tNSDictionary *credentials = nil;\n\n\t// Do we already have an auth header?\n\tif (![[self requestHeaders] objectForKey:@\"Authorization\"]) {\n\n\t\t// If we have basic authentication explicitly set and a username and password set on the request, add a basic auth header\n\t\tif ([self username] && [self password] && [[self authenticationScheme] isEqualToString:(NSString *)kCFHTTPAuthenticationSchemeBasic]) {\n\t\t\t[self addBasicAuthenticationHeaderWithUsername:[self username] andPassword:[self password]];\n\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ has a username and password set, and was manually configured to use BASIC. Will send credentials without waiting for an authentication challenge\",self);\t\n\t\t\t#endif\n\n\t\t} else {\n\n\t\t\t// See if we have any cached credentials we can use in the session store\n\t\t\tif ([self useSessionPersistence]) {\n\t\t\t\tcredentials = [self findSessionAuthenticationCredentials];\n\n\t\t\t\tif (credentials) {\n\n\t\t\t\t\t// When the Authentication key is set, the credentials were stored after an authentication challenge, so we can let CFNetwork apply them\n\t\t\t\t\t// (credentials for Digest and NTLM will always be stored like this)\n\t\t\t\t\tif ([credentials objectForKey:@\"Authentication\"]) {\n\n\t\t\t\t\t\t// If we've already talked to this server and have valid credentials, let's apply them to the request\n\t\t\t\t\t\tif (CFHTTPMessageApplyCredentialDictionary(request, (CFHTTPAuthenticationRef)[credentials objectForKey:@\"Authentication\"], (CFDictionaryRef)[credentials objectForKey:@\"Credentials\"], NULL)) {\n\t\t\t\t\t\t\t[self setAuthenticationScheme:[credentials objectForKey:@\"AuthenticationScheme\"]];\n\t\t\t\t\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\t\t\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ found cached credentials (%@), will reuse without waiting for an authentication challenge\",self,[credentials objectForKey:@\"AuthenticationScheme\"]);\n\t\t\t\t\t\t\t#endif\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t[[self class] removeAuthenticationCredentialsFromSessionStore:[credentials objectForKey:@\"Credentials\"]];\n\t\t\t\t\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\t\t\t\t\tASI_DEBUG_LOG(@\"[AUTH] Failed to apply cached credentials to request %@. These will be removed from the session store, and this request will wait for an authentication challenge\",self);\n\t\t\t\t\t\t\t#endif\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// If the Authentication key is not set, these credentials were stored after a username and password set on a previous request passed basic authentication\n\t\t\t\t\t// When this happens, we'll need to create the Authorization header ourselves\n\t\t\t\t\t} else {\n\t\t\t\t\t\tNSDictionary *usernameAndPassword = [credentials objectForKey:@\"Credentials\"];\n\t\t\t\t\t\t[self addBasicAuthenticationHeaderWithUsername:[usernameAndPassword objectForKey:(NSString *)kCFHTTPAuthenticationUsername] andPassword:[usernameAndPassword objectForKey:(NSString *)kCFHTTPAuthenticationPassword]];\n\t\t\t\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\t\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ found cached BASIC credentials from a previous request. Will send credentials without waiting for an authentication challenge\",self);\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Apply proxy authentication credentials\n\tif ([self useSessionPersistence]) {\n\t\tcredentials = [self findSessionProxyAuthenticationCredentials];\n\t\tif (credentials) {\n\t\t\tif (!CFHTTPMessageApplyCredentialDictionary(request, (CFHTTPAuthenticationRef)[credentials objectForKey:@\"Authentication\"], (CFDictionaryRef)[credentials objectForKey:@\"Credentials\"], NULL)) {\n\t\t\t\t[[self class] removeProxyAuthenticationCredentialsFromSessionStore:[credentials objectForKey:@\"Credentials\"]];\n\t\t\t}\n\t\t}\n\t}\n}\n\n- (void)applyCookieHeader\n{\n\t// Add cookies from the persistent (mac os global) store\n\tif ([self useCookiePersistence]) {\n\t\tNSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[[self url] absoluteURL]];\n\t\tif (cookies) {\n\t\t\t[[self requestCookies] addObjectsFromArray:cookies];\n\t\t}\n\t}\n\t\n\t// Apply request cookies\n\tNSArray *cookies;\n\tif ([self mainRequest]) {\n\t\tcookies = [[self mainRequest] requestCookies];\n\t} else {\n\t\tcookies = [self requestCookies];\n\t}\n\tif ([cookies count] > 0) {\n\t\tNSHTTPCookie *cookie;\n\t\tNSString *cookieHeader = nil;\n\t\tfor (cookie in cookies) {\n\t\t\tif (!cookieHeader) {\n\t\t\t\tcookieHeader = [NSString stringWithFormat: @\"%@=%@\",[cookie name],[cookie value]];\n\t\t\t} else {\n\t\t\t\tcookieHeader = [NSString stringWithFormat: @\"%@; %@=%@\",cookieHeader,[cookie name],[cookie value]];\n\t\t\t}\n\t\t}\n\t\tif (cookieHeader) {\n\t\t\t[self addRequestHeader:@\"Cookie\" value:cookieHeader];\n\t\t}\n\t}\t\n}\n\n- (void)buildRequestHeaders\n{\n\tif ([self haveBuiltRequestHeaders]) {\n\t\treturn;\n\t}\n\t[self setHaveBuiltRequestHeaders:YES];\n\t\n\tif ([self mainRequest]) {\n\t\tfor (NSString *header in [[self mainRequest] requestHeaders]) {\n\t\t\t[self addRequestHeader:header value:[[[self mainRequest] requestHeaders] valueForKey:header]];\n\t\t}\n\t\treturn;\n\t}\n\t\n\t[self applyCookieHeader];\n\t\n\t// Build and set the user agent string if the request does not already have a custom user agent specified\n\tif (![[self requestHeaders] objectForKey:@\"User-Agent\"]) {\n\t\tNSString *tempUserAgentString = [self userAgentString];\n\t\tif (!tempUserAgentString) {\n\t\t\ttempUserAgentString = [ASIHTTPRequest defaultUserAgentString];\n\t\t}\n\t\tif (tempUserAgentString) {\n\t\t\t[self addRequestHeader:@\"User-Agent\" value:tempUserAgentString];\n\t\t}\n\t}\n\t\n\t\n\t// Accept a compressed response\n\tif ([self allowCompressedResponse]) {\n\t\t[self addRequestHeader:@\"Accept-Encoding\" value:@\"gzip\"];\n\t}\n\t\n\t// Configure a compressed request body\n\tif ([self shouldCompressRequestBody]) {\n\t\t[self addRequestHeader:@\"Content-Encoding\" value:@\"gzip\"];\n\t}\n\t\n\t// Should this request resume an existing download?\n\t[self updatePartialDownloadSize];\n\tif ([self partialDownloadSize]) {\n\t\t[self addRequestHeader:@\"Range\" value:[NSString stringWithFormat:@\"bytes=%llu-\",[self partialDownloadSize]]];\n\t}\n}\n\n- (void)updatePartialDownloadSize\n{\n\tNSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];\n\n\tif ([self allowResumeForFileDownloads] && [self downloadDestinationPath] && [self temporaryFileDownloadPath] && [fileManager fileExistsAtPath:[self temporaryFileDownloadPath]]) {\n\t\tNSError *err = nil;\n\t\t[self setPartialDownloadSize:[[fileManager attributesOfItemAtPath:[self temporaryFileDownloadPath] error:&err] fileSize]];\n\t\tif (err) {\n\t\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIFileManagementError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@\"Failed to get attributes for file at path '%@'\",[self temporaryFileDownloadPath]],NSLocalizedDescriptionKey,error,NSUnderlyingErrorKey,nil]]];\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n- (void)startRequest\n{\n\tif ([self isCancelled]) {\n\t\treturn;\n\t}\n\t\n\t[self performSelectorOnMainThread:@selector(requestStarted) withObject:nil waitUntilDone:[NSThread isMainThread]];\n\t\n\t[self setDownloadComplete:NO];\n\t[self setComplete:NO];\n\t[self setTotalBytesRead:0];\n\t[self setLastBytesRead:0];\n\t\n\tif ([self redirectCount] == 0) {\n\t\t[self setOriginalURL:[self url]];\n\t}\n\t\n\t// If we're retrying a request, let's remove any progress we made\n\tif ([self lastBytesSent] > 0) {\n\t\t[self removeUploadProgressSoFar];\n\t}\n\t\n\t[self setLastBytesSent:0];\n\t[self setContentLength:0];\n\t[self setResponseHeaders:nil];\n\tif (![self downloadDestinationPath]) {\n\t\t[self setRawResponseData:[[[NSMutableData alloc] init] autorelease]];\n    }\n\t\n\t\n    //\n\t// Create the stream for the request\n\t//\n\n\tNSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];\n\n\t[self setReadStreamIsScheduled:NO];\n\t\n\t// Do we need to stream the request body from disk\n\tif ([self shouldStreamPostDataFromDisk] && [self postBodyFilePath] && [fileManager fileExistsAtPath:[self postBodyFilePath]]) {\n\t\t\n\t\t// Are we gzipping the request body?\n\t\tif ([self compressedPostBodyFilePath] && [fileManager fileExistsAtPath:[self compressedPostBodyFilePath]]) {\n\t\t\t[self setPostBodyReadStream:[ASIInputStream inputStreamWithFileAtPath:[self compressedPostBodyFilePath] request:self]];\n\t\t} else {\n\t\t\t[self setPostBodyReadStream:[ASIInputStream inputStreamWithFileAtPath:[self postBodyFilePath] request:self]];\n\t\t}\n\t\t[self setReadStream:[NSMakeCollectable(CFReadStreamCreateForStreamedHTTPRequest(kCFAllocatorDefault, request,(CFReadStreamRef)[self postBodyReadStream])) autorelease]];    \n    } else {\n\t\t\n\t\t// If we have a request body, we'll stream it from memory using our custom stream, so that we can measure bandwidth use and it can be bandwidth-throttled if necessary\n\t\tif ([self postBody] && [[self postBody] length] > 0) {\n\t\t\tif ([self shouldCompressRequestBody] && [self compressedPostBody]) {\n\t\t\t\t[self setPostBodyReadStream:[ASIInputStream inputStreamWithData:[self compressedPostBody] request:self]];\n\t\t\t} else if ([self postBody]) {\n\t\t\t\t[self setPostBodyReadStream:[ASIInputStream inputStreamWithData:[self postBody] request:self]];\n\t\t\t}\n\t\t\t[self setReadStream:[NSMakeCollectable(CFReadStreamCreateForStreamedHTTPRequest(kCFAllocatorDefault, request,(CFReadStreamRef)[self postBodyReadStream])) autorelease]];\n\t\t\n\t\t} else {\n\t\t\t[self setReadStream:[NSMakeCollectable(CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request)) autorelease]];\n\t\t}\n\t}\n\n\tif (![self readStream]) {\n\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIInternalErrorWhileBuildingRequestType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Unable to create read stream\",NSLocalizedDescriptionKey,nil]]];\n        return;\n    }\n\n\n    \n    \n    //\n    // Handle SSL certificate settings\n    //\n\n    if([[[[self url] scheme] lowercaseString] isEqualToString:@\"https\"]) {       \n       \n        // Tell CFNetwork not to validate SSL certificates\n        if (![self validatesSecureCertificate]) {\n            // see: http://iphonedevelopment.blogspot.com/2010/05/nsstream-tcp-and-ssl.html\n            \n            NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys:\n                                      [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,\n                                      [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,\n                                      [NSNumber numberWithBool:NO],  kCFStreamSSLValidatesCertificateChain,\n                                      kCFNull,kCFStreamSSLPeerName,\n                                      nil];\n            \n            CFReadStreamSetProperty((CFReadStreamRef)[self readStream], \n                                    kCFStreamPropertySSLSettings, \n                                    (CFTypeRef)sslProperties);\n            [sslProperties release];\n        } \n        \n        // Tell CFNetwork to use a client certificate\n        if (clientCertificateIdentity) {\n            NSMutableDictionary *sslProperties = [NSMutableDictionary dictionaryWithCapacity:1];\n            \n\t\t\tNSMutableArray *certificates = [NSMutableArray arrayWithCapacity:[clientCertificates count]+1];\n\n\t\t\t// The first object in the array is our SecIdentityRef\n\t\t\t[certificates addObject:(id)clientCertificateIdentity];\n\n\t\t\t// If we've added any additional certificates, add them too\n\t\t\tfor (id cert in clientCertificates) {\n\t\t\t\t[certificates addObject:cert];\n\t\t\t}\n            \n            [sslProperties setObject:certificates forKey:(NSString *)kCFStreamSSLCertificates];\n            \n            CFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertySSLSettings, sslProperties);\n        }\n        \n    }\n\n\t//\n\t// Handle proxy settings\n\t//\n\n \tif ([self proxyHost] && [self proxyPort]) {\n\t\tNSString *hostKey;\n\t\tNSString *portKey;\n\n\t\tif (![self proxyType]) {\n\t\t\t[self setProxyType:(NSString *)kCFProxyTypeHTTP];\n\t\t}\n\n\t\tif ([[self proxyType] isEqualToString:(NSString *)kCFProxyTypeSOCKS]) {\n\t\t\thostKey = (NSString *)kCFStreamPropertySOCKSProxyHost;\n\t\t\tportKey = (NSString *)kCFStreamPropertySOCKSProxyPort;\n\t\t} else {\n\t\t\thostKey = (NSString *)kCFStreamPropertyHTTPProxyHost;\n\t\t\tportKey = (NSString *)kCFStreamPropertyHTTPProxyPort;\n\t\t\tif ([[[[self url] scheme] lowercaseString] isEqualToString:@\"https\"]) {\n\t\t\t\thostKey = (NSString *)kCFStreamPropertyHTTPSProxyHost;\n\t\t\t\tportKey = (NSString *)kCFStreamPropertyHTTPSProxyPort;\n\t\t\t}\n\t\t}\n\t\tNSMutableDictionary *proxyToUse = [NSMutableDictionary dictionaryWithObjectsAndKeys:[self proxyHost],hostKey,[NSNumber numberWithInt:[self proxyPort]],portKey,nil];\n\n\t\tif ([[self proxyType] isEqualToString:(NSString *)kCFProxyTypeSOCKS]) {\n\t\t\tCFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertySOCKSProxy, proxyToUse);\n\t\t} else {\n\t\t\tCFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertyHTTPProxy, proxyToUse);\n\t\t}\n\t}\n\n\n\t//\n\t// Handle persistent connections\n\t//\n\t\n\t[ASIHTTPRequest expirePersistentConnections];\n\n\t[connectionsLock lock];\n\t\n\t\n\tif (![[self url] host] || ![[self url] scheme]) {\n\t\t[self setConnectionInfo:nil];\n\t\t[self setShouldAttemptPersistentConnection:NO];\n\t}\n\t\n\t// Will store the old stream that was using this connection (if there was one) so we can clean it up once we've opened our own stream\n\tNSInputStream *oldStream = nil;\n\t\n\t// Use a persistent connection if possible\n\tif ([self shouldAttemptPersistentConnection]) {\n\t\t\n\n\t\t// If we are redirecting, we will re-use the current connection only if we are connecting to the same server\n\t\tif ([self connectionInfo]) {\n\t\t\t\n\t\t\tif (![[[self connectionInfo] objectForKey:@\"host\"] isEqualToString:[[self url] host]] || ![[[self connectionInfo] objectForKey:@\"scheme\"] isEqualToString:[[self url] scheme]] || [(NSNumber *)[[self connectionInfo] objectForKey:@\"port\"] intValue] != [[[self url] port] intValue]) {\n\t\t\t\t[self setConnectionInfo:nil];\n\n\t\t\t// Check if we should have expired this connection\n\t\t\t} else if ([[[self connectionInfo] objectForKey:@\"expires\"] timeIntervalSinceNow] < 0) {\n\t\t\t\t#if DEBUG_PERSISTENT_CONNECTIONS\n\t\t\t\tASI_DEBUG_LOG(@\"[CONNECTION] Not re-using connection #%i because it has expired\",[[[self connectionInfo] objectForKey:@\"id\"] intValue]);\n\t\t\t\t#endif\n\t\t\t\t[persistentConnectionsPool removeObject:[self connectionInfo]];\n\t\t\t\t[self setConnectionInfo:nil];\n\n\t\t\t} else if ([[self connectionInfo] objectForKey:@\"request\"] != nil) {\n                //Some other request reused this connection already - we'll have to create a new one\n\t\t\t\t#if DEBUG_PERSISTENT_CONNECTIONS\n                ASI_DEBUG_LOG(@\"%@ - Not re-using connection #%i for request #%i because it is already used by request #%i\",self,[[[self connectionInfo] objectForKey:@\"id\"] intValue],[[self requestID] intValue],[[[self connectionInfo] objectForKey:@\"request\"] intValue]);\n\t\t\t\t#endif\n                [self setConnectionInfo:nil];\n            }\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\tif (![self connectionInfo] && [[self url] host] && [[self url] scheme]) { // We must have a proper url with a host and scheme, or this will explode\n\t\t\t\n\t\t\t// Look for a connection to the same server in the pool\n\t\t\tfor (NSMutableDictionary *existingConnection in persistentConnectionsPool) {\n\t\t\t\tif (![existingConnection objectForKey:@\"request\"] && [[existingConnection objectForKey:@\"host\"] isEqualToString:[[self url] host]] && [[existingConnection objectForKey:@\"scheme\"] isEqualToString:[[self url] scheme]] && [(NSNumber *)[existingConnection objectForKey:@\"port\"] intValue] == [[[self url] port] intValue]) {\n\t\t\t\t\t[self setConnectionInfo:existingConnection];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif ([[self connectionInfo] objectForKey:@\"stream\"]) {\n\t\t\toldStream = [[[self connectionInfo] objectForKey:@\"stream\"] retain];\n\n\t\t}\n\t\t\n\t\t// No free connection was found in the pool matching the server/scheme/port we're connecting to, we'll need to create a new one\n\t\tif (![self connectionInfo]) {\n\t\t\t[self setConnectionInfo:[NSMutableDictionary dictionary]];\n\t\t\tnextConnectionNumberToCreate++;\n\t\t\t[[self connectionInfo] setObject:[NSNumber numberWithInt:nextConnectionNumberToCreate] forKey:@\"id\"];\n\t\t\t[[self connectionInfo] setObject:[[self url] host] forKey:@\"host\"];\n\t\t\t[[self connectionInfo] setObject:[NSNumber numberWithInt:[[[self url] port] intValue]] forKey:@\"port\"];\n\t\t\t[[self connectionInfo] setObject:[[self url] scheme] forKey:@\"scheme\"];\n\t\t\t[persistentConnectionsPool addObject:[self connectionInfo]];\n\t\t}\n\t\t\n\t\t// If we are retrying this request, it will already have a requestID\n\t\tif (![self requestID]) {\n\t\t\tnextRequestID++;\n\t\t\t[self setRequestID:[NSNumber numberWithUnsignedInt:nextRequestID]];\n\t\t}\n\t\t[[self connectionInfo] setObject:[self requestID] forKey:@\"request\"];\t\t\n\t\t[[self connectionInfo] setObject:[self readStream] forKey:@\"stream\"];\n\t\tCFReadStreamSetProperty((CFReadStreamRef)[self readStream],  kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue);\n\t\t\n\t\t#if DEBUG_PERSISTENT_CONNECTIONS\n\t\tASI_DEBUG_LOG(@\"[CONNECTION] Request #%@ will use connection #%i\",[self requestID],[[[self connectionInfo] objectForKey:@\"id\"] intValue]);\n\t\t#endif\n\t\t\n\t\t\n\t\t// Tag the stream with an id that tells it which connection to use behind the scenes\n\t\t// See http://lists.apple.com/archives/macnetworkprog/2008/Dec/msg00001.html for details on this approach\n\t\t\n\t\tCFReadStreamSetProperty((CFReadStreamRef)[self readStream], CFSTR(\"ASIStreamID\"), [[self connectionInfo] objectForKey:@\"id\"]);\n\t\n\t} else {\n\t\t#if DEBUG_PERSISTENT_CONNECTIONS\n\t\tASI_DEBUG_LOG(@\"[CONNECTION] Request %@ will not use a persistent connection\",self);\n\t\t#endif\n\t}\n\t\n\t[connectionsLock unlock];\n\n\t// Schedule the stream\n\tif (![self readStreamIsScheduled] && (!throttleWakeUpTime || [throttleWakeUpTime timeIntervalSinceDate:[NSDate date]] < 0)) {\n\t\t[self scheduleReadStream];\n\t}\n\t\n\tBOOL streamSuccessfullyOpened = NO;\n\n\n   // Start the HTTP connection\n\tCFStreamClientContext ctxt = {0, self, NULL, NULL, NULL};\n    if (CFReadStreamSetClient((CFReadStreamRef)[self readStream], kNetworkEvents, ReadStreamClientCallBack, &ctxt)) {\n\t\tif (CFReadStreamOpen((CFReadStreamRef)[self readStream])) {\n\t\t\tstreamSuccessfullyOpened = YES;\n\t\t}\n\t}\n\t\n\t// Here, we'll close the stream that was previously using this connection, if there was one\n\t// We've kept it open until now (when we've just opened a new stream) so that the new stream can make use of the old connection\n\t// http://lists.apple.com/archives/Macnetworkprog/2006/Mar/msg00119.html\n\tif (oldStream) {\n\t\t[oldStream close];\n\t\t[oldStream release];\n\t\toldStream = nil;\n\t}\n\n\tif (!streamSuccessfullyOpened) {\n\t\t[self setConnectionCanBeReused:NO];\n\t\t[self destroyReadStream];\n\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIInternalErrorWhileBuildingRequestType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Unable to start HTTP connection\",NSLocalizedDescriptionKey,nil]]];\n\t\treturn;\t\n\t}\n\t\n\tif (![self mainRequest]) {\n\t\tif ([self shouldResetUploadProgress]) {\n\t\t\tif ([self showAccurateProgress]) {\n\t\t\t\t[self incrementUploadSizeBy:[self postLength]];\n\t\t\t} else {\n\t\t\t\t[self incrementUploadSizeBy:1];\t \n\t\t\t}\n\t\t\t[ASIHTTPRequest updateProgressIndicator:&uploadProgressDelegate withProgress:0 ofTotal:1];\n\t\t}\n\t\tif ([self shouldResetDownloadProgress] && ![self partialDownloadSize]) {\n\t\t\t[ASIHTTPRequest updateProgressIndicator:&downloadProgressDelegate withProgress:0 ofTotal:1];\n\t\t}\n\t}\t\n\t\n\t\n\t// Record when the request started, so we can timeout if nothing happens\n\t[self setLastActivityTime:[NSDate date]];\n\t[self setStatusTimer:[NSTimer timerWithTimeInterval:0.25 target:self selector:@selector(updateStatus:) userInfo:nil repeats:YES]];\n\t[[NSRunLoop currentRunLoop] addTimer:[self statusTimer] forMode:[self runLoopMode]];\n}\n\n- (void)setStatusTimer:(NSTimer *)timer\n{\n\tCFRetain(self);\n\t// We must invalidate the old timer here, not before we've created and scheduled a new timer\n\t// This is because the timer may be the only thing retaining an asynchronous request\n\tif (statusTimer && timer != statusTimer) {\n\t\t[statusTimer invalidate];\n\t\t[statusTimer release];\n\t}\n\tstatusTimer = [timer retain];\n\tCFRelease(self);\n}\n\n// This gets fired every 1/4 of a second to update the progress and work out if we need to timeout\n- (void)updateStatus:(NSTimer*)timer\n{\n\t[self checkRequestStatus];\n\tif (![self inProgress]) {\n\t\t[self setStatusTimer:nil];\n\t}\n}\n\n- (void)performRedirect\n{\n\t[self setURL:[self redirectURL]];\n\t[self setComplete:YES];\n\t[self setNeedsRedirect:NO];\n\t[self setRedirectCount:[self redirectCount]+1];\n\n\tif ([self redirectCount] > RedirectionLimit) {\n\t\t// Some naughty / badly coded website is trying to force us into a redirection loop. This is not cool.\n\t\t[self failWithError:ASITooMuchRedirectionError];\n\t\t[self setComplete:YES];\n\t} else {\n\t\t// Go all the way back to the beginning and build the request again, so that we can apply any new cookies\n\t\t[self main];\n\t}\n}\n\n// Called by delegate to resume loading with a new url after the delegate received request:willRedirectToURL:\n- (void)redirectToURL:(NSURL *)newURL\n{\n\t[self setRedirectURL:newURL];\n\t[self performSelector:@selector(performRedirect) onThread:[[self class] threadForRequest:self] withObject:nil waitUntilDone:NO];\n}\n\n- (BOOL)shouldTimeOut\n{\n\tNSTimeInterval secondsSinceLastActivity = [[NSDate date] timeIntervalSinceDate:lastActivityTime];\n\t// See if we need to timeout\n\tif ([self readStream] && [self readStreamIsScheduled] && [self lastActivityTime] && [self timeOutSeconds] > 0 && secondsSinceLastActivity > [self timeOutSeconds]) {\n\t\t\n\t\t// We have no body, or we've sent more than the upload buffer size,so we can safely time out here\n\t\tif ([self postLength] == 0 || ([self uploadBufferSize] > 0 && [self totalBytesSent] > [self uploadBufferSize])) {\n\t\t\treturn YES;\n\t\t\t\n\t\t// ***Black magic warning***\n\t\t// We have a body, but we've taken longer than timeOutSeconds to upload the first small chunk of data\n\t\t// Since there's no reliable way to track upload progress for the first 32KB (iPhone) or 128KB (Mac) with CFNetwork, we'll be slightly more forgiving on the timeout, as there's a strong chance our connection is just very slow.\n\t\t} else if (secondsSinceLastActivity > [self timeOutSeconds]*1.5) {\n\t\t\treturn YES;\n\t\t}\n\t}\n\treturn NO;\n}\n\n- (void)checkRequestStatus\n{\n\t// We won't let the request cancel while we're updating progress / checking for a timeout\n\t[[self cancelledLock] lock];\n\t// See if our NSOperationQueue told us to cancel\n\tif ([self isCancelled] || [self complete]) {\n\t\t[[self cancelledLock] unlock];\n\t\treturn;\n\t}\n\t\n\t[self performThrottling];\n\t\n\tif ([self shouldTimeOut]) {\t\t\t\n\t\t// Do we need to auto-retry this request?\n\t\tif ([self numberOfTimesToRetryOnTimeout] > [self retryCount]) {\n\n\t\t\t// If we are resuming a download, we may need to update the Range header to take account of data we've just downloaded\n\t\t\t[self updatePartialDownloadSize];\n\t\t\tif ([self partialDownloadSize]) {\n\t\t\t\tCFHTTPMessageSetHeaderFieldValue(request, (CFStringRef)@\"Range\", (CFStringRef)[NSString stringWithFormat:@\"bytes=%llu-\",[self partialDownloadSize]]);\n\t\t\t}\n\t\t\t[self setRetryCount:[self retryCount]+1];\n\t\t\t[self unscheduleReadStream];\n\t\t\t[[self cancelledLock] unlock];\n\t\t\t[self startRequest];\n\t\t\treturn;\n\t\t}\n\t\t[self failWithError:ASIRequestTimedOutError];\n\t\t[self cancelLoad];\n\t\t[self setComplete:YES];\n\t\t[[self cancelledLock] unlock];\n\t\treturn;\n\t}\n\n\t// readStream will be null if we aren't currently running (perhaps we're waiting for a delegate to supply credentials)\n\tif ([self readStream]) {\n\t\t\n\t\t// If we have a post body\n\t\tif ([self postLength]) {\n\t\t\n\t\t\t[self setLastBytesSent:totalBytesSent];\t\n\t\t\t\n\t\t\t// Find out how much data we've uploaded so far\n\t\t\t[self setTotalBytesSent:[[NSMakeCollectable(CFReadStreamCopyProperty((CFReadStreamRef)[self readStream], kCFStreamPropertyHTTPRequestBytesWrittenCount)) autorelease] unsignedLongLongValue]];\n\t\t\tif (totalBytesSent > lastBytesSent) {\n\t\t\t\t\n\t\t\t\t// We've uploaded more data,  reset the timeout\n\t\t\t\t[self setLastActivityTime:[NSDate date]];\n\t\t\t\t[ASIHTTPRequest incrementBandwidthUsedInLastSecond:(unsigned long)(totalBytesSent-lastBytesSent)];\t\t\n\t\t\t\t\t\t\n\t\t\t\t#if DEBUG_REQUEST_STATUS\n\t\t\t\tif ([self totalBytesSent] == [self postLength]) {\n\t\t\t\t\tASI_DEBUG_LOG(@\"[STATUS] Request %@ finished uploading data\",self);\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t}\n\t\t}\n\t\t\t\n\t\t[self updateProgressIndicators];\n\n\t}\n\t\n\t[[self cancelledLock] unlock];\n}\n\n\n// Cancel loading and clean up. DO NOT USE THIS TO CANCEL REQUESTS - use [request cancel] instead\n- (void)cancelLoad\n{\n\t// If we're in the middle of downloading a PAC file, let's stop that first\n\tif (PACFileReadStream) {\n\t\t[PACFileReadStream setDelegate:nil];\n\t\t[PACFileReadStream close];\n\t\t[self setPACFileReadStream:nil];\n\t\t[self setPACFileData:nil];\n\t} else if (PACFileRequest) {\n\t\t[PACFileRequest setDelegate:nil];\n\t\t[PACFileRequest cancel];\n\t\t[self setPACFileRequest:nil];\n\t}\n\n    [self destroyReadStream];\n\t\n\t[[self postBodyReadStream] close];\n\t[self setPostBodyReadStream:nil];\n\t\n    if ([self rawResponseData]) {\n\t\tif (![self complete]) {\n\t\t\t[self setRawResponseData:nil];\n\t\t}\n\t// If we were downloading to a file\n\t} else if ([self temporaryFileDownloadPath]) {\n\t\t[[self fileDownloadOutputStream] close];\n\t\t[self setFileDownloadOutputStream:nil];\n\t\t\n\t\t[[self inflatedFileDownloadOutputStream] close];\n\t\t[self setInflatedFileDownloadOutputStream:nil];\n\t\t\n\t\t// If we haven't said we might want to resume, let's remove the temporary file too\n\t\tif (![self complete]) {\n\t\t\tif (![self allowResumeForFileDownloads]) {\n\t\t\t\t[self removeTemporaryDownloadFile];\n\t\t\t}\n\t\t\t[self removeTemporaryUncompressedDownloadFile];\n\t\t}\n\t}\n\t\n\t// Clean up any temporary file used to store request body for streaming\n\tif (![self authenticationNeeded] && ![self willRetryRequest] && [self didCreateTemporaryPostDataFile]) {\n\t\t[self removeTemporaryUploadFile];\n\t\t[self removeTemporaryCompressedUploadFile];\n\t\t[self setDidCreateTemporaryPostDataFile:NO];\n\t}\n}\n\n#pragma mark HEAD request\n\n// Used by ASINetworkQueue to create a HEAD request appropriate for this request with the same headers (though you can use it yourself)\n- (ASIHTTPRequest *)HEADRequest\n{\n\tASIHTTPRequest *headRequest = [[self class] requestWithURL:[self url]];\n\t\n\t// Copy the properties that make sense for a HEAD request\n\t[headRequest setRequestHeaders:[[[self requestHeaders] mutableCopy] autorelease]];\n\t[headRequest setRequestCookies:[[[self requestCookies] mutableCopy] autorelease]];\n\t[headRequest setUseCookiePersistence:[self useCookiePersistence]];\n\t[headRequest setUseKeychainPersistence:[self useKeychainPersistence]];\n\t[headRequest setUseSessionPersistence:[self useSessionPersistence]];\n\t[headRequest setAllowCompressedResponse:[self allowCompressedResponse]];\n\t[headRequest setUsername:[self username]];\n\t[headRequest setPassword:[self password]];\n\t[headRequest setDomain:[self domain]];\n\t[headRequest setProxyUsername:[self proxyUsername]];\n\t[headRequest setProxyPassword:[self proxyPassword]];\n\t[headRequest setProxyDomain:[self proxyDomain]];\n\t[headRequest setProxyHost:[self proxyHost]];\n\t[headRequest setProxyPort:[self proxyPort]];\n\t[headRequest setProxyType:[self proxyType]];\n\t[headRequest setShouldPresentAuthenticationDialog:[self shouldPresentAuthenticationDialog]];\n\t[headRequest setShouldPresentProxyAuthenticationDialog:[self shouldPresentProxyAuthenticationDialog]];\n\t[headRequest setTimeOutSeconds:[self timeOutSeconds]];\n\t[headRequest setUseHTTPVersionOne:[self useHTTPVersionOne]];\n\t[headRequest setValidatesSecureCertificate:[self validatesSecureCertificate]];\n    [headRequest setClientCertificateIdentity:clientCertificateIdentity];\n\t[headRequest setClientCertificates:[[clientCertificates copy] autorelease]];\n\t[headRequest setPACurl:[self PACurl]];\n\t[headRequest setShouldPresentCredentialsBeforeChallenge:[self shouldPresentCredentialsBeforeChallenge]];\n\t[headRequest setNumberOfTimesToRetryOnTimeout:[self numberOfTimesToRetryOnTimeout]];\n\t[headRequest setShouldUseRFC2616RedirectBehaviour:[self shouldUseRFC2616RedirectBehaviour]];\n\t[headRequest setShouldAttemptPersistentConnection:[self shouldAttemptPersistentConnection]];\n\t[headRequest setPersistentConnectionTimeoutSeconds:[self persistentConnectionTimeoutSeconds]];\n\t\n\t[headRequest setMainRequest:self];\n\t[headRequest setRequestMethod:@\"HEAD\"];\n\treturn headRequest;\n}\n\n\n#pragma mark upload/download progress\n\n\n- (void)updateProgressIndicators\n{\n\t//Only update progress if this isn't a HEAD request used to preset the content-length\n\tif (![self mainRequest]) {\n\t\tif ([self showAccurateProgress] || ([self complete] && ![self updatedProgress])) {\n\t\t\t[self updateUploadProgress];\n\t\t\t[self updateDownloadProgress];\n\t\t}\n\t}\n}\n\n- (id)uploadProgressDelegate\n{\n\t[[self cancelledLock] lock];\n\tid d = [[uploadProgressDelegate retain] autorelease];\n\t[[self cancelledLock] unlock];\n\treturn d;\n}\n\n- (void)setUploadProgressDelegate:(id)newDelegate\n{\n\t[[self cancelledLock] lock];\n\tuploadProgressDelegate = newDelegate;\n\n\t#if !TARGET_OS_IPHONE\n\t// If the uploadProgressDelegate is an NSProgressIndicator, we set its MaxValue to 1.0 so we can update it as if it were a UIProgressView\n\tdouble max = 1.0;\n\t[ASIHTTPRequest performSelector:@selector(setMaxValue:) onTarget:&uploadProgressDelegate withObject:nil amount:&max callerToRetain:nil];\n\t#endif\n\t[[self cancelledLock] unlock];\n}\n\n- (id)downloadProgressDelegate\n{\n\t[[self cancelledLock] lock];\n\tid d = [[downloadProgressDelegate retain] autorelease];\n\t[[self cancelledLock] unlock];\n\treturn d;\n}\n\n- (void)setDownloadProgressDelegate:(id)newDelegate\n{\n\t[[self cancelledLock] lock];\n\tdownloadProgressDelegate = newDelegate;\n\n\t#if !TARGET_OS_IPHONE\n\t// If the downloadProgressDelegate is an NSProgressIndicator, we set its MaxValue to 1.0 so we can update it as if it were a UIProgressView\n\tdouble max = 1.0;\n\t[ASIHTTPRequest performSelector:@selector(setMaxValue:) onTarget:&downloadProgressDelegate withObject:nil amount:&max callerToRetain:nil];\t\n\t#endif\n\t[[self cancelledLock] unlock];\n}\n\n\n- (void)updateDownloadProgress\n{\n\t// We won't update download progress until we've examined the headers, since we might need to authenticate\n\tif (![self responseHeaders] || [self needsRedirect] || !([self contentLength] || [self complete])) {\n\t\treturn;\n\t}\n\t\t\n\tunsigned long long bytesReadSoFar = [self totalBytesRead]+[self partialDownloadSize];\n\tunsigned long long value = 0;\n\t\n\tif ([self showAccurateProgress] && [self contentLength]) {\n\t\tvalue = bytesReadSoFar-[self lastBytesRead];\n\t\tif (value == 0) {\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tvalue = 1;\n\t\t[self setUpdatedProgress:YES];\n\t}\n\tif (!value) {\n\t\treturn;\n\t}\n\n\t[ASIHTTPRequest performSelector:@selector(request:didReceiveBytes:) onTarget:&queue withObject:self amount:&value callerToRetain:self];\n\t[ASIHTTPRequest performSelector:@selector(request:didReceiveBytes:) onTarget:&downloadProgressDelegate withObject:self amount:&value callerToRetain:self];\n\n\t[ASIHTTPRequest updateProgressIndicator:&downloadProgressDelegate withProgress:[self totalBytesRead]+[self partialDownloadSize] ofTotal:[self contentLength]+[self partialDownloadSize]];\n\n\t#if NS_BLOCKS_AVAILABLE\n    if (bytesReceivedBlock) {\n\t\tunsigned long long totalSize = [self contentLength] + [self partialDownloadSize];\n\t\t[self performBlockOnMainThread:^{ if (bytesReceivedBlock) { bytesReceivedBlock(value, totalSize); }}];\n    }\n\t#endif\n\t[self setLastBytesRead:bytesReadSoFar];\n}\n\n- (void)updateUploadProgress\n{\n\tif ([self isCancelled] || [self totalBytesSent] == 0) {\n\t\treturn;\n\t}\n\t\n\t// If this is the first time we've written to the buffer, totalBytesSent will be the size of the buffer (currently seems to be 128KB on both Leopard and iPhone 2.2.1, 32KB on iPhone 3.0)\n\t// If request body is less than the buffer size, totalBytesSent will be the total size of the request body\n\t// We will remove this from any progress display, as kCFStreamPropertyHTTPRequestBytesWrittenCount does not tell us how much data has actually be written\n\tif ([self uploadBufferSize] == 0 && [self totalBytesSent] != [self postLength]) {\n\t\t[self setUploadBufferSize:[self totalBytesSent]];\n\t\t[self incrementUploadSizeBy:-[self uploadBufferSize]];\n\t}\n\t\n\tunsigned long long value = 0;\n\t\n\tif ([self showAccurateProgress]) {\n\t\tif ([self totalBytesSent] == [self postLength] || [self lastBytesSent] > 0) {\n\t\t\tvalue = [self totalBytesSent]-[self lastBytesSent];\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tvalue = 1;\n\t\t[self setUpdatedProgress:YES];\n\t}\n\t\n\tif (!value) {\n\t\treturn;\n\t}\n\t\n\t[ASIHTTPRequest performSelector:@selector(request:didSendBytes:) onTarget:&queue withObject:self amount:&value callerToRetain:self];\n\t[ASIHTTPRequest performSelector:@selector(request:didSendBytes:) onTarget:&uploadProgressDelegate withObject:self amount:&value callerToRetain:self];\n\t[ASIHTTPRequest updateProgressIndicator:&uploadProgressDelegate withProgress:[self totalBytesSent]-[self uploadBufferSize] ofTotal:[self postLength]-[self uploadBufferSize]];\n\n\t#if NS_BLOCKS_AVAILABLE\n    if(bytesSentBlock){\n\t\tunsigned long long totalSize = [self postLength];\n\t\t[self performBlockOnMainThread:^{ if (bytesSentBlock) { bytesSentBlock(value, totalSize); }}];\n\t}\n\t#endif\n}\n\n\n- (void)incrementDownloadSizeBy:(long long)length\n{\n\t[ASIHTTPRequest performSelector:@selector(request:incrementDownloadSizeBy:) onTarget:&queue withObject:self amount:&length callerToRetain:self];\n\t[ASIHTTPRequest performSelector:@selector(request:incrementDownloadSizeBy:) onTarget:&downloadProgressDelegate withObject:self amount:&length callerToRetain:self];\n\n\t#if NS_BLOCKS_AVAILABLE\n    if(downloadSizeIncrementedBlock){\n\t\t[self performBlockOnMainThread:^{ if (downloadSizeIncrementedBlock) { downloadSizeIncrementedBlock(length); }}];\n    }\n\t#endif\n}\n\n- (void)incrementUploadSizeBy:(long long)length\n{\n\t[ASIHTTPRequest performSelector:@selector(request:incrementUploadSizeBy:) onTarget:&queue withObject:self amount:&length callerToRetain:self];\n\t[ASIHTTPRequest performSelector:@selector(request:incrementUploadSizeBy:) onTarget:&uploadProgressDelegate withObject:self amount:&length callerToRetain:self];\n\n\t#if NS_BLOCKS_AVAILABLE\n    if(uploadSizeIncrementedBlock) {\n\t\t[self performBlockOnMainThread:^{ if (uploadSizeIncrementedBlock) { uploadSizeIncrementedBlock(length); }}];\n    }\n\t#endif\n}\n\n\n-(void)removeUploadProgressSoFar\n{\n\tlong long progressToRemove = -[self totalBytesSent];\n\t[ASIHTTPRequest performSelector:@selector(request:didSendBytes:) onTarget:&queue withObject:self amount:&progressToRemove callerToRetain:self];\n\t[ASIHTTPRequest performSelector:@selector(request:didSendBytes:) onTarget:&uploadProgressDelegate withObject:self amount:&progressToRemove callerToRetain:self];\n\t[ASIHTTPRequest updateProgressIndicator:&uploadProgressDelegate withProgress:0 ofTotal:[self postLength]];\n\n\t#if NS_BLOCKS_AVAILABLE\n    if(bytesSentBlock){\n\t\tunsigned long long totalSize = [self postLength];\n\t\t[self performBlockOnMainThread:^{  if (bytesSentBlock) { bytesSentBlock(progressToRemove, totalSize); }}];\n\t}\n\t#endif\n}\n\n#if NS_BLOCKS_AVAILABLE\n- (void)performBlockOnMainThread:(ASIBasicBlock)block\n{\n\t[self performSelectorOnMainThread:@selector(callBlock:) withObject:[[block copy] autorelease] waitUntilDone:[NSThread isMainThread]];\n}\n\n- (void)callBlock:(ASIBasicBlock)block\n{\n\tblock();\n}\n#endif\n\n\n+ (void)performSelector:(SEL)selector onTarget:(id *)target withObject:(id)object amount:(void *)amount callerToRetain:(id)callerToRetain\n{\n\tif ([*target respondsToSelector:selector]) {\n\t\tNSMethodSignature *signature = nil;\n\t\tsignature = [*target methodSignatureForSelector:selector];\n\t\tNSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];\n\n\t\t[invocation setSelector:selector];\n\t\t\n\t\tint argumentNumber = 2;\n\t\t\n\t\t// If we got an object parameter, we pass a pointer to the object pointer\n\t\tif (object) {\n\t\t\t[invocation setArgument:&object atIndex:argumentNumber];\n\t\t\targumentNumber++;\n\t\t}\n\t\t\n\t\t// For the amount we'll just pass the pointer directly so NSInvocation will call the method using the number itself rather than a pointer to it\n\t\tif (amount) {\n\t\t\t[invocation setArgument:amount atIndex:argumentNumber];\n\t\t}\n\n        SEL callback = @selector(performInvocation:onTarget:releasingObject:);\n        NSMethodSignature *cbSignature = [ASIHTTPRequest methodSignatureForSelector:callback];\n        NSInvocation *cbInvocation = [NSInvocation invocationWithMethodSignature:cbSignature];\n        [cbInvocation setSelector:callback];\n        [cbInvocation setTarget:self];\n        [cbInvocation setArgument:&invocation atIndex:2];\n        [cbInvocation setArgument:&target atIndex:3];\n\t\tif (callerToRetain) {\n\t\t\t[cbInvocation setArgument:&callerToRetain atIndex:4];\n\t\t}\n\n\t\tCFRetain(invocation);\n\n\t\t// Used to pass in a request that we must retain until after the call\n\t\t// We're using CFRetain rather than [callerToRetain retain] so things to avoid earthquakes when using garbage collection\n\t\tif (callerToRetain) {\n\t\t\tCFRetain(callerToRetain);\n\t\t}\n        [cbInvocation performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:[NSThread isMainThread]];\n    }\n}\n\n+ (void)performInvocation:(NSInvocation *)invocation onTarget:(id *)target releasingObject:(id)objectToRelease\n{\n    if (*target && [*target respondsToSelector:[invocation selector]]) {\n        [invocation invokeWithTarget:*target];\n    }\n\tCFRelease(invocation);\n\tif (objectToRelease) {\n\t\tCFRelease(objectToRelease);\n\t}\n}\n\t\n\t\n+ (void)updateProgressIndicator:(id *)indicator withProgress:(unsigned long long)progress ofTotal:(unsigned long long)total\n{\n\t#if TARGET_OS_IPHONE\n\t\t// Cocoa Touch: UIProgressView\n\t\tSEL selector = @selector(setProgress:);\n\t\tfloat progressAmount = (float)((progress*1.0)/(total*1.0));\n\t\t\n\t#else\n\t\t// Cocoa: NSProgressIndicator\n\t\tdouble progressAmount = progressAmount = (progress*1.0)/(total*1.0);\n\t\tSEL selector = @selector(setDoubleValue:);\n\t#endif\n\t\n\tif (![*indicator respondsToSelector:selector]) {\n\t\treturn;\n\t}\n\t\n\t[progressLock lock];\n\t[ASIHTTPRequest performSelector:selector onTarget:indicator withObject:nil amount:&progressAmount callerToRetain:nil];\n\t[progressLock unlock];\n}\n\n\n#pragma mark talking to delegates / calling blocks\n\n/* ALWAYS CALLED ON MAIN THREAD! */\n- (void)requestStarted\n{\n\tif ([self error] || [self mainRequest]) {\n\t\treturn;\n\t}\n\tif (delegate && [delegate respondsToSelector:didStartSelector]) {\n\t\t[delegate performSelector:didStartSelector withObject:self];\n\t}\n\t#if NS_BLOCKS_AVAILABLE\n\tif(startedBlock){\n\t\tstartedBlock();\n\t}\n\t#endif\n\tif (queue && [queue respondsToSelector:@selector(requestStarted:)]) {\n\t\t[queue performSelector:@selector(requestStarted:) withObject:self];\n\t}\n}\n\n/* ALWAYS CALLED ON MAIN THREAD! */\n- (void)requestRedirected\n{\n\tif ([self error] || [self mainRequest]) {\n\t\treturn;\n\t}\n\n\tif([[self delegate] respondsToSelector:@selector(requestRedirected:)]){\n\t\t[[self delegate] performSelector:@selector(requestRedirected:) withObject:self];\n\t}\n\n\t#if NS_BLOCKS_AVAILABLE\n\tif(requestRedirectedBlock){\n\t\trequestRedirectedBlock();\n\t}\n\t#endif\n}\n\n\n/* ALWAYS CALLED ON MAIN THREAD! */\n- (void)requestReceivedResponseHeaders:(NSMutableDictionary *)newResponseHeaders\n{\n\tif ([self error] || [self mainRequest]) {\n\t\treturn;\n\t}\n\n\tif (delegate && [delegate respondsToSelector:didReceiveResponseHeadersSelector]) {\n\t\t[delegate performSelector:didReceiveResponseHeadersSelector withObject:self withObject:newResponseHeaders];\n\t}\n\n\t#if NS_BLOCKS_AVAILABLE\n\tif(headersReceivedBlock){\n\t\theadersReceivedBlock(newResponseHeaders);\n    }\n\t#endif\n\n\tif (queue && [queue respondsToSelector:@selector(request:didReceiveResponseHeaders:)]) {\n\t\t[queue performSelector:@selector(request:didReceiveResponseHeaders:) withObject:self withObject:newResponseHeaders];\n\t}\n}\n\n/* ALWAYS CALLED ON MAIN THREAD! */\n- (void)requestWillRedirectToURL:(NSURL *)newURL\n{\n\tif ([self error] || [self mainRequest]) {\n\t\treturn;\n\t}\n\tif (delegate && [delegate respondsToSelector:willRedirectSelector]) {\n\t\t[delegate performSelector:willRedirectSelector withObject:self withObject:newURL];\n\t}\n\tif (queue && [queue respondsToSelector:@selector(request:willRedirectToURL:)]) {\n\t\t[queue performSelector:@selector(request:willRedirectToURL:) withObject:self withObject:newURL];\n\t}\n}\n\n// Subclasses might override this method to process the result in the same thread\n// If you do this, don't forget to call [super requestFinished] to let the queue / delegate know we're done\n- (void)requestFinished\n{\n#if DEBUG_REQUEST_STATUS || DEBUG_THROTTLING\n\tASI_DEBUG_LOG(@\"[STATUS] Request finished: %@\",self);\n#endif\n\tif ([self error] || [self mainRequest]) {\n\t\treturn;\n\t}\n\tif ([self isPACFileRequest]) {\n\t\t[self reportFinished];\n\t} else {\n\t\t[self performSelectorOnMainThread:@selector(reportFinished) withObject:nil waitUntilDone:[NSThread isMainThread]];\n\t}\n}\n\n/* ALWAYS CALLED ON MAIN THREAD! */\n- (void)reportFinished\n{\n\tif (delegate && [delegate respondsToSelector:didFinishSelector]) {\n\t\t[delegate performSelector:didFinishSelector withObject:self];\n\t}\n\n\t#if NS_BLOCKS_AVAILABLE\n\tif(completionBlock){\n\t\tcompletionBlock();\n\t}\n\t#endif\n\n\tif (queue && [queue respondsToSelector:@selector(requestFinished:)]) {\n\t\t[queue performSelector:@selector(requestFinished:) withObject:self];\n\t}\n}\n\n/* ALWAYS CALLED ON MAIN THREAD! */\n- (void)reportFailure\n{\n\tif (delegate && [delegate respondsToSelector:didFailSelector]) {\n\t\t[delegate performSelector:didFailSelector withObject:self];\n\t}\n\n\t#if NS_BLOCKS_AVAILABLE\n    if(failureBlock){\n        failureBlock();\n    }\n\t#endif\n\n\tif (queue && [queue respondsToSelector:@selector(requestFailed:)]) {\n\t\t[queue performSelector:@selector(requestFailed:) withObject:self];\n\t}\n}\n\n/* ALWAYS CALLED ON MAIN THREAD! */\n- (void)passOnReceivedData:(NSData *)data\n{\n\tif (delegate && [delegate respondsToSelector:didReceiveDataSelector]) {\n\t\t[delegate performSelector:didReceiveDataSelector withObject:self withObject:data];\n\t}\n\n\t#if NS_BLOCKS_AVAILABLE\n\tif (dataReceivedBlock) {\n\t\tdataReceivedBlock(data);\n\t}\n\t#endif\n}\n\n// Subclasses might override this method to perform error handling in the same thread\n// If you do this, don't forget to call [super failWithError:] to let the queue / delegate know we're done\n- (void)failWithError:(NSError *)theError\n{\n#if DEBUG_REQUEST_STATUS || DEBUG_THROTTLING\n\tASI_DEBUG_LOG(@\"[STATUS] Request %@: %@\",self,(theError == ASIRequestCancelledError ? @\"Cancelled\" : @\"Failed\"));\n#endif\n\t[self setComplete:YES];\n\t\n\t// Invalidate the current connection so subsequent requests don't attempt to reuse it\n\tif (theError && [theError code] != ASIAuthenticationErrorType && [theError code] != ASITooMuchRedirectionErrorType) {\n\t\t[connectionsLock lock];\n\t\t#if DEBUG_PERSISTENT_CONNECTIONS\n\t\tASI_DEBUG_LOG(@\"[CONNECTION] Request #%@ failed and will invalidate connection #%@\",[self requestID],[[self connectionInfo] objectForKey:@\"id\"]);\n\t\t#endif\n\t\t[[self connectionInfo] removeObjectForKey:@\"request\"];\n\t\t[persistentConnectionsPool removeObject:[self connectionInfo]];\n\t\t[connectionsLock unlock];\n\t\t[self destroyReadStream];\n\t}\n\tif ([self connectionCanBeReused]) {\n\t\t[[self connectionInfo] setObject:[NSDate dateWithTimeIntervalSinceNow:[self persistentConnectionTimeoutSeconds]] forKey:@\"expires\"];\n\t}\n\t\n    if ([self isCancelled] || [self error]) {\n\t\treturn;\n\t}\n\t\n\t// If we have cached data, use it and ignore the error when using ASIFallbackToCacheIfLoadFailsCachePolicy\n\tif ([self downloadCache] && ([self cachePolicy] & ASIFallbackToCacheIfLoadFailsCachePolicy)) {\n\t\tif ([[self downloadCache] canUseCachedDataForRequest:self]) {\n\t\t\t[self useDataFromCache];\n\t\t\treturn;\n\t\t}\n\t}\n\t\n\t\n\t[self setError:theError];\n\t\n\tASIHTTPRequest *failedRequest = self;\n\t\n\t// If this is a HEAD request created by an ASINetworkQueue or compatible queue delegate, make the main request fail\n\tif ([self mainRequest]) {\n\t\tfailedRequest = [self mainRequest];\n\t\t[failedRequest setError:theError];\n\t}\n\n\tif ([self isPACFileRequest]) {\n\t\t[failedRequest reportFailure];\n\t} else {\n\t\t[failedRequest performSelectorOnMainThread:@selector(reportFailure) withObject:nil waitUntilDone:[NSThread isMainThread]];\n\t}\n\t\n    if (!inProgress)\n    {\n        // if we're not in progress, we can't notify the queue we've finished (doing so can cause a crash later on)\n        // \"markAsFinished\" will be at the start of main() when we are started\n        return;\n    }\n\t[self markAsFinished];\n}\n\n#pragma mark parsing HTTP response headers\n\n- (void)readResponseHeaders\n{\n\t[self setAuthenticationNeeded:ASINoAuthenticationNeededYet];\n\n\tCFHTTPMessageRef message = (CFHTTPMessageRef)CFReadStreamCopyProperty((CFReadStreamRef)[self readStream], kCFStreamPropertyHTTPResponseHeader);\n\tif (!message) {\n\t\treturn;\n\t}\n\t\n\t// Make sure we've received all the headers\n\tif (!CFHTTPMessageIsHeaderComplete(message)) {\n\t\tCFRelease(message);\n\t\treturn;\n\t}\n\n\t#if DEBUG_REQUEST_STATUS\n\tif ([self totalBytesSent] == [self postLength]) {\n\t\tASI_DEBUG_LOG(@\"[STATUS] Request %@ received response headers\",self);\n\t}\n\t#endif\t\t\n\n\t[self setResponseHeaders:[NSMakeCollectable(CFHTTPMessageCopyAllHeaderFields(message)) autorelease]];\n\t[self setResponseStatusCode:(int)CFHTTPMessageGetResponseStatusCode(message)];\n\t[self setResponseStatusMessage:[NSMakeCollectable(CFHTTPMessageCopyResponseStatusLine(message)) autorelease]];\n\n\tif ([self downloadCache] && ([[self downloadCache] canUseCachedDataForRequest:self])) {\n\n\t\t// Update the expiry date\n\t\t[[self downloadCache] updateExpiryForRequest:self maxAge:[self secondsToCache]];\n\n\t\t// Read the response from the cache\n\t\t[self useDataFromCache];\n\n\t\tCFRelease(message);\n\t\treturn;\n\t}\n\n\t// Is the server response a challenge for credentials?\n\tif ([self responseStatusCode] == 401) {\n\t\t[self setAuthenticationNeeded:ASIHTTPAuthenticationNeeded];\n\t} else if ([self responseStatusCode] == 407) {\n\t\t[self setAuthenticationNeeded:ASIProxyAuthenticationNeeded];\n\t} else {\n\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\tif ([self authenticationScheme]) {\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ has passed %@ authentication\",self,[self authenticationScheme]);\n\t\t}\n\t\t#endif\n\t}\n\t\t\n\t// Authentication succeeded, or no authentication was required\n\tif (![self authenticationNeeded]) {\n\n\t\t// Did we get here without an authentication challenge? (which can happen when shouldPresentCredentialsBeforeChallenge is YES and basic auth was successful)\n\t\tif (!requestAuthentication && [[self authenticationScheme] isEqualToString:(NSString *)kCFHTTPAuthenticationSchemeBasic] && [self username] && [self password] && [self useSessionPersistence]) {\n\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ passed BASIC authentication, and will save credentials in the session store for future use\",self);\n\t\t\t#endif\n\t\t\t\n\t\t\tNSMutableDictionary *newCredentials = [NSMutableDictionary dictionaryWithCapacity:2];\n\t\t\t[newCredentials setObject:[self username] forKey:(NSString *)kCFHTTPAuthenticationUsername];\n\t\t\t[newCredentials setObject:[self password] forKey:(NSString *)kCFHTTPAuthenticationPassword];\n\t\t\t\n\t\t\t// Store the credentials in the session \n\t\t\tNSMutableDictionary *sessionCredentials = [NSMutableDictionary dictionary];\n\t\t\t[sessionCredentials setObject:newCredentials forKey:@\"Credentials\"];\n\t\t\t[sessionCredentials setObject:[self url] forKey:@\"URL\"];\n\t\t\t[sessionCredentials setObject:(NSString *)kCFHTTPAuthenticationSchemeBasic forKey:@\"AuthenticationScheme\"];\n\t\t\t[[self class] storeAuthenticationCredentialsInSessionStore:sessionCredentials];\n\t\t}\n\t}\n\n\t// Read response textEncoding\n\t[self parseStringEncodingFromHeaders];\n\n\t// Handle cookies\n\tNSArray *newCookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[self responseHeaders] forURL:[self url]];\n\t[self setResponseCookies:newCookies];\n\t\n\tif ([self useCookiePersistence]) {\n\t\t\n\t\t// Store cookies in global persistent store\n\t\t[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:newCookies forURL:[self url] mainDocumentURL:nil];\n\t\t\n\t\t// We also keep any cookies in the sessionCookies array, so that we have a reference to them if we need to remove them later\n\t\tNSHTTPCookie *cookie;\n\t\tfor (cookie in newCookies) {\n\t\t\t[ASIHTTPRequest addSessionCookie:cookie];\n\t\t}\n\t}\n\t\n\t// Do we need to redirect?\n\tif (![self willRedirect]) {\n\t\t// See if we got a Content-length header\n\t\tNSString *cLength = [responseHeaders valueForKey:@\"Content-Length\"];\n\t\tASIHTTPRequest *theRequest = self;\n\t\tif ([self mainRequest]) {\n\t\t\ttheRequest = [self mainRequest];\n\t\t}\n\n\t\tif (cLength) {\n\t\t\tunsigned long long length = strtoull([cLength UTF8String], NULL, 0);\n\n\t\t\t// Workaround for Apache HEAD requests for dynamically generated content returning the wrong Content-Length when using gzip\n\t\t\tif ([self mainRequest] && [self allowCompressedResponse] && length == 20 && [self showAccurateProgress] && [self shouldResetDownloadProgress]) {\n\t\t\t\t[[self mainRequest] setShowAccurateProgress:NO];\n\t\t\t\t[[self mainRequest] incrementDownloadSizeBy:1];\n\n\t\t\t} else {\n\t\t\t\t[theRequest setContentLength:length];\n\t\t\t\tif ([self showAccurateProgress] && [self shouldResetDownloadProgress]) {\n\t\t\t\t\t[theRequest incrementDownloadSizeBy:[theRequest contentLength]+[theRequest partialDownloadSize]];\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if ([self showAccurateProgress] && [self shouldResetDownloadProgress]) {\n\t\t\t[theRequest setShowAccurateProgress:NO];\n\t\t\t[theRequest incrementDownloadSizeBy:1];\n\t\t}\n\t}\n\n\t// Handle connection persistence\n\tif ([self shouldAttemptPersistentConnection]) {\n\t\t\n\t\tNSString *connectionHeader = [[[self responseHeaders] objectForKey:@\"Connection\"] lowercaseString];\n\n\t\tNSString *httpVersion = [NSMakeCollectable(CFHTTPMessageCopyVersion(message)) autorelease];\n\t\t\n\t\t// Don't re-use the connection if the server is HTTP 1.0 and didn't send Connection: Keep-Alive\n\t\tif (![httpVersion isEqualToString:(NSString *)kCFHTTPVersion1_0] || [connectionHeader isEqualToString:@\"keep-alive\"]) {\n\n\t\t\t// See if server explicitly told us to close the connection\n\t\t\tif (![connectionHeader isEqualToString:@\"close\"]) {\n\t\t\t\t\n\t\t\t\tNSString *keepAliveHeader = [[self responseHeaders] objectForKey:@\"Keep-Alive\"];\n\t\t\t\t\n\t\t\t\t// If we got a keep alive header, we'll reuse the connection for as long as the server tells us\n\t\t\t\tif (keepAliveHeader) { \n\t\t\t\t\tint timeout = 0;\n\t\t\t\t\tint max = 0;\n\t\t\t\t\tNSScanner *scanner = [NSScanner scannerWithString:keepAliveHeader];\n\t\t\t\t\t[scanner scanString:@\"timeout=\" intoString:NULL];\n\t\t\t\t\t[scanner scanInt:&timeout];\n\t\t\t\t\t[scanner scanUpToString:@\"max=\" intoString:NULL];\n\t\t\t\t\t[scanner scanString:@\"max=\" intoString:NULL];\n\t\t\t\t\t[scanner scanInt:&max];\n\t\t\t\t\tif (max > 5) {\n\t\t\t\t\t\t[self setConnectionCanBeReused:YES];\n\t\t\t\t\t\t[self setPersistentConnectionTimeoutSeconds:timeout];\n\t\t\t\t\t\t#if DEBUG_PERSISTENT_CONNECTIONS\n\t\t\t\t\t\t\tASI_DEBUG_LOG(@\"[CONNECTION] Got a keep-alive header, will keep this connection open for %f seconds\", [self persistentConnectionTimeoutSeconds]);\n\t\t\t\t\t\t#endif\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Otherwise, we'll assume we can keep this connection open\n\t\t\t\t} else {\n\t\t\t\t\t[self setConnectionCanBeReused:YES];\n\t\t\t\t\t#if DEBUG_PERSISTENT_CONNECTIONS\n\t\t\t\t\t\tASI_DEBUG_LOG(@\"[CONNECTION] Got no keep-alive header, will keep this connection open for %f seconds\", [self persistentConnectionTimeoutSeconds]);\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tCFRelease(message);\n\t[self performSelectorOnMainThread:@selector(requestReceivedResponseHeaders:) withObject:[[[self responseHeaders] copy] autorelease] waitUntilDone:[NSThread isMainThread]];\n}\n\n- (BOOL)willRedirect\n{\n\t// Do we need to redirect?\n\tif (![self shouldRedirect] || ![responseHeaders valueForKey:@\"Location\"]) {\n\t\treturn NO;\n\t}\n\n\t// Note that ASIHTTPRequest does not currently support 305 Use Proxy\n\tint responseCode = [self responseStatusCode];\n\tif (responseCode != 301 && responseCode != 302 && responseCode != 303 && responseCode != 307) {\n\t\treturn NO;\n\t}\n\n\t[self performSelectorOnMainThread:@selector(requestRedirected) withObject:nil waitUntilDone:[NSThread isMainThread]];\n\n\t// By default, we redirect 301 and 302 response codes as GET requests\n\t// According to RFC 2616 this is wrong, but this is what most browsers do, so it's probably what you're expecting to happen\n\t// See also:\n\t// http://allseeing-i.lighthouseapp.com/projects/27881/tickets/27-302-redirection-issue\n\n\tif (responseCode != 307 && (![self shouldUseRFC2616RedirectBehaviour] || responseCode == 303)) {\n\t\t[self setRequestMethod:@\"GET\"];\n\t\t[self setPostBody:nil];\n\t\t[self setPostLength:0];\n\n\t\t// Perhaps there are other headers we should be preserving, but it's hard to know what we need to keep and what to throw away.\n\t\tNSString *userAgentHeader = [[self requestHeaders] objectForKey:@\"User-Agent\"];\n\t\tNSString *acceptHeader = [[self requestHeaders] objectForKey:@\"Accept\"];\n\t\t[self setRequestHeaders:nil];\n\t\tif (userAgentHeader) {\n\t\t\t[self addRequestHeader:@\"User-Agent\" value:userAgentHeader];\n\t\t}\n\t\tif (acceptHeader) {\n\t\t\t[self addRequestHeader:@\"Accept\" value:acceptHeader];\n\t\t}\n\t\t[self setHaveBuiltRequestHeaders:NO];\n\n\t} else {\n\t\t// Force rebuild the cookie header incase we got some new cookies from this request\n\t\t// All other request headers will remain as they are for 301 / 302 redirects\n\t\t[self applyCookieHeader];\n\t}\n\n\t// Force the redirected request to rebuild the request headers (if not a 303, it will re-use old ones, and add any new ones)\n\t[self setRedirectURL:[[NSURL URLWithString:[responseHeaders valueForKey:@\"Location\"] relativeToURL:[self url]] absoluteURL]];\n\t[self setNeedsRedirect:YES];\n\n\t// Clear the request cookies\n\t// This means manually added cookies will not be added to the redirect request - only those stored in the global persistent store\n\t// But, this is probably the safest option - we might be redirecting to a different domain\n\t[self setRequestCookies:[NSMutableArray array]];\n\n\t#if DEBUG_REQUEST_STATUS\n\tASI_DEBUG_LOG(@\"[STATUS] Request will redirect (code: %i): %@\",responseCode,self);\n\t#endif\n\n\treturn YES;\n}\n\n- (void)parseStringEncodingFromHeaders\n{\n\t// Handle response text encoding\n\tNSStringEncoding charset = 0;\n\tNSString *mimeType = nil;\n\t[[self class] parseMimeType:&mimeType andResponseEncoding:&charset fromContentType:[[self responseHeaders] valueForKey:@\"Content-Type\"]];\n\tif (charset != 0) {\n\t\t[self setResponseEncoding:charset];\n\t} else {\n\t\t[self setResponseEncoding:[self defaultResponseEncoding]];\n\t}\n}\n\n#pragma mark http authentication\n\n- (void)saveProxyCredentialsToKeychain:(NSDictionary *)newCredentials\n{\n\tNSURLCredential *authenticationCredentials = [NSURLCredential credentialWithUser:[newCredentials objectForKey:(NSString *)kCFHTTPAuthenticationUsername] password:[newCredentials objectForKey:(NSString *)kCFHTTPAuthenticationPassword] persistence:NSURLCredentialPersistencePermanent];\n\tif (authenticationCredentials) {\n\t\t[ASIHTTPRequest saveCredentials:authenticationCredentials forProxy:[self proxyHost] port:[self proxyPort] realm:[self proxyAuthenticationRealm]];\n\t}\t\n}\n\n\n- (void)saveCredentialsToKeychain:(NSDictionary *)newCredentials\n{\n\tNSURLCredential *authenticationCredentials = [NSURLCredential credentialWithUser:[newCredentials objectForKey:(NSString *)kCFHTTPAuthenticationUsername] password:[newCredentials objectForKey:(NSString *)kCFHTTPAuthenticationPassword] persistence:NSURLCredentialPersistencePermanent];\n\t\n\tif (authenticationCredentials) {\n\t\t[ASIHTTPRequest saveCredentials:authenticationCredentials forHost:[[self url] host] port:[[[self url] port] intValue] protocol:[[self url] scheme] realm:[self authenticationRealm]];\n\t}\t\n}\n\n- (BOOL)applyProxyCredentials:(NSDictionary *)newCredentials\n{\n\t[self setProxyAuthenticationRetryCount:[self proxyAuthenticationRetryCount]+1];\n\t\n\tif (newCredentials && proxyAuthentication && request) {\n\n\t\t// Apply whatever credentials we've built up to the old request\n\t\tif (CFHTTPMessageApplyCredentialDictionary(request, proxyAuthentication, (CFMutableDictionaryRef)newCredentials, NULL)) {\n\t\t\t\n\t\t\t//If we have credentials and they're ok, let's save them to the keychain\n\t\t\tif (useKeychainPersistence) {\n\t\t\t\t[self saveProxyCredentialsToKeychain:newCredentials];\n\t\t\t}\n\t\t\tif (useSessionPersistence) {\n\t\t\t\tNSMutableDictionary *sessionProxyCredentials = [NSMutableDictionary dictionary];\n\t\t\t\t[sessionProxyCredentials setObject:(id)proxyAuthentication forKey:@\"Authentication\"];\n\t\t\t\t[sessionProxyCredentials setObject:newCredentials forKey:@\"Credentials\"];\n\t\t\t\t[sessionProxyCredentials setObject:[self proxyHost] forKey:@\"Host\"];\n\t\t\t\t[sessionProxyCredentials setObject:[NSNumber numberWithInt:[self proxyPort]] forKey:@\"Port\"];\n\t\t\t\t[sessionProxyCredentials setObject:[self proxyAuthenticationScheme] forKey:@\"AuthenticationScheme\"];\n\t\t\t\t[[self class] storeProxyAuthenticationCredentialsInSessionStore:sessionProxyCredentials];\n\t\t\t}\n\t\t\t[self setProxyCredentials:newCredentials];\n\t\t\treturn YES;\n\t\t} else {\n\t\t\t[[self class] removeProxyAuthenticationCredentialsFromSessionStore:newCredentials];\n\t\t}\n\t}\n\treturn NO;\n}\n\n- (BOOL)applyCredentials:(NSDictionary *)newCredentials\n{\n\t[self setAuthenticationRetryCount:[self authenticationRetryCount]+1];\n\t\n\tif (newCredentials && requestAuthentication && request) {\n\t\t// Apply whatever credentials we've built up to the old request\n\t\tif (CFHTTPMessageApplyCredentialDictionary(request, requestAuthentication, (CFMutableDictionaryRef)newCredentials, NULL)) {\n\t\t\t\n\t\t\t//If we have credentials and they're ok, let's save them to the keychain\n\t\t\tif (useKeychainPersistence) {\n\t\t\t\t[self saveCredentialsToKeychain:newCredentials];\n\t\t\t}\n\t\t\tif (useSessionPersistence) {\n\t\t\t\t\n\t\t\t\tNSMutableDictionary *sessionCredentials = [NSMutableDictionary dictionary];\n\t\t\t\t[sessionCredentials setObject:(id)requestAuthentication forKey:@\"Authentication\"];\n\t\t\t\t[sessionCredentials setObject:newCredentials forKey:@\"Credentials\"];\n\t\t\t\t[sessionCredentials setObject:[self url] forKey:@\"URL\"];\n\t\t\t\t[sessionCredentials setObject:[self authenticationScheme] forKey:@\"AuthenticationScheme\"];\n\t\t\t\tif ([self authenticationRealm]) {\n\t\t\t\t\t[sessionCredentials setObject:[self authenticationRealm] forKey:@\"AuthenticationRealm\"];\n\t\t\t\t}\n\t\t\t\t[[self class] storeAuthenticationCredentialsInSessionStore:sessionCredentials];\n\n\t\t\t}\n\t\t\t[self setRequestCredentials:newCredentials];\n\t\t\treturn YES;\n\t\t} else {\n\t\t\t[[self class] removeAuthenticationCredentialsFromSessionStore:newCredentials];\n\t\t}\n\t}\n\treturn NO;\n}\n\n- (NSMutableDictionary *)findProxyCredentials\n{\n\tNSMutableDictionary *newCredentials = [[[NSMutableDictionary alloc] init] autorelease];\n\t\n\tNSString *user = nil;\n\tNSString *pass = nil;\n\t\n\tASIHTTPRequest *theRequest = [self mainRequest];\n\t// If this is a HEAD request generated by an ASINetworkQueue, we'll try to use the details from the main request\n\tif ([theRequest proxyUsername] && [theRequest proxyPassword]) {\n\t\tuser = [theRequest proxyUsername];\n\t\tpass = [theRequest proxyPassword];\n\t\t\n\t// Let's try to use the ones set in this object\n\t} else if ([self proxyUsername] && [self proxyPassword]) {\n\t\tuser = [self proxyUsername];\n\t\tpass = [self proxyPassword];\n\t}\n\n\t// When we connect to a website using NTLM via a proxy, we will use the main credentials\n\tif ((!user || !pass) && [self proxyAuthenticationScheme] == (NSString *)kCFHTTPAuthenticationSchemeNTLM) {\n\t\tuser = [self username];\n\t\tpass = [self password];\n\t}\n\n\n\t\n\t// Ok, that didn't work, let's try the keychain\n\t// For authenticating proxies, we'll look in the keychain regardless of the value of useKeychainPersistence\n\tif ((!user || !pass)) {\n\t\tNSURLCredential *authenticationCredentials = [ASIHTTPRequest savedCredentialsForProxy:[self proxyHost] port:[self proxyPort] protocol:[[self url] scheme] realm:[self proxyAuthenticationRealm]];\n\t\tif (authenticationCredentials) {\n\t\t\tuser = [authenticationCredentials user];\n\t\t\tpass = [authenticationCredentials password];\n\t\t}\n\t\t\n\t}\n\n\t// Handle NTLM, which requires a domain to be set too\n\tif (CFHTTPAuthenticationRequiresAccountDomain(proxyAuthentication)) {\n\n\t\tNSString *ntlmDomain = [self proxyDomain];\n\n\t\t// If we have no domain yet\n\t\tif (!ntlmDomain || [ntlmDomain length] == 0) {\n\n\t\t\t// Let's try to extract it from the username\n\t\t\tNSArray* ntlmComponents = [user componentsSeparatedByString:@\"\\\\\"];\n\t\t\tif ([ntlmComponents count] == 2) {\n\t\t\t\tntlmDomain = [ntlmComponents objectAtIndex:0];\n\t\t\t\tuser = [ntlmComponents objectAtIndex:1];\n\n\t\t\t// If we are connecting to a website using NTLM, but we are connecting via a proxy, the string we need may be in the domain property\n\t\t\t} else {\n\t\t\t\tntlmDomain = [self domain];\n\t\t\t}\n\t\t\tif (!ntlmDomain) {\n\t\t\t\tntlmDomain = @\"\";\n\t\t\t}\n\t\t}\n\t\t[newCredentials setObject:ntlmDomain forKey:(NSString *)kCFHTTPAuthenticationAccountDomain];\n\t}\n\n\n\t// If we have a username and password, let's apply them to the request and continue\n\tif (user && pass) {\n\t\t[newCredentials setObject:user forKey:(NSString *)kCFHTTPAuthenticationUsername];\n\t\t[newCredentials setObject:pass forKey:(NSString *)kCFHTTPAuthenticationPassword];\n\t\treturn newCredentials;\n\t}\n\treturn nil;\n}\n\n\n- (NSMutableDictionary *)findCredentials\n{\n\tNSMutableDictionary *newCredentials = [[[NSMutableDictionary alloc] init] autorelease];\n\n\t// First, let's look at the url to see if the username and password were included\n\tNSString *user = [[self url] user];\n\tNSString *pass = [[self url] password];\n\n\tif (user && pass) {\n\n\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will use credentials set on its url\",self);\n\t\t#endif\n\n\t} else {\n\t\t\n\t\t// If this is a HEAD request generated by an ASINetworkQueue, we'll try to use the details from the main request\n\t\tif ([self mainRequest] && [[self mainRequest] username] && [[self mainRequest] password]) {\n\t\t\tuser = [[self mainRequest] username];\n\t\t\tpass = [[self mainRequest] password];\n\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will use credentials from its parent request\",self);\n\t\t\t#endif\n\n\t\t// Let's try to use the ones set in this object\n\t\t} else if ([self username] && [self password]) {\n\t\t\tuser = [self username];\n\t\t\tpass = [self password];\n\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will use username and password properties as credentials\",self);\n\t\t\t#endif\n\t\t}\t\t\n\t}\n\t\n\t// Ok, that didn't work, let's try the keychain\n\tif ((!user || !pass) && useKeychainPersistence) {\n\t\tNSURLCredential *authenticationCredentials = [ASIHTTPRequest savedCredentialsForHost:[[self url] host] port:[[[self url] port] intValue] protocol:[[self url] scheme] realm:[self authenticationRealm]];\n\t\tif (authenticationCredentials) {\n\t\t\tuser = [authenticationCredentials user];\n\t\t\tpass = [authenticationCredentials password];\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tif (user && pass) {\n\t\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will use credentials from the keychain\",self);\n\t\t\t}\n\t\t\t#endif\n\t\t}\n\t}\n\n\t// Handle NTLM, which requires a domain to be set too\n\tif (CFHTTPAuthenticationRequiresAccountDomain(requestAuthentication)) {\n\n\t\tNSString *ntlmDomain = [self domain];\n\n\t\t// If we have no domain yet, let's try to extract it from the username\n\t\tif (!ntlmDomain || [ntlmDomain length] == 0) {\n\t\t\tntlmDomain = @\"\";\n\t\t\tNSArray* ntlmComponents = [user componentsSeparatedByString:@\"\\\\\"];\n\t\t\tif ([ntlmComponents count] == 2) {\n\t\t\t\tntlmDomain = [ntlmComponents objectAtIndex:0];\n\t\t\t\tuser = [ntlmComponents objectAtIndex:1];\n\t\t\t}\n\t\t}\n\t\t[newCredentials setObject:ntlmDomain forKey:(NSString *)kCFHTTPAuthenticationAccountDomain];\n\t}\n\n\t// If we have a username and password, let's apply them to the request and continue\n\tif (user && pass) {\n\t\t[newCredentials setObject:user forKey:(NSString *)kCFHTTPAuthenticationUsername];\n\t\t[newCredentials setObject:pass forKey:(NSString *)kCFHTTPAuthenticationPassword];\n\t\treturn newCredentials;\n\t}\n\treturn nil;\n}\n\n// Called by delegate or authentication dialog to resume loading once authentication info has been populated\n- (void)retryUsingSuppliedCredentials\n{\n\t#if DEBUG_HTTP_AUTHENTICATION\n\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ received credentials from its delegate or an ASIAuthenticationDialog, will retry\",self);\n\t#endif\n\t//If the url was changed by the delegate, our CFHTTPMessageRef will be NULL and we'll go back to the start\n\tif (!request) {\n\t\t[self performSelector:@selector(main) onThread:[[self class] threadForRequest:self] withObject:nil waitUntilDone:NO];\n\t\treturn;\n\t}\n\t[self performSelector:@selector(attemptToApplyCredentialsAndResume) onThread:[[self class] threadForRequest:self] withObject:nil waitUntilDone:NO];\n}\n\n// Called by delegate or authentication dialog to cancel authentication\n- (void)cancelAuthentication\n{\n\t#if DEBUG_HTTP_AUTHENTICATION\n\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ had authentication cancelled by its delegate or an ASIAuthenticationDialog\",self);\n\t#endif\n\t[self performSelector:@selector(failAuthentication) onThread:[[self class] threadForRequest:self] withObject:nil waitUntilDone:NO];\n}\n\n- (void)failAuthentication\n{\n\t[self failWithError:ASIAuthenticationError];\n}\n\n- (BOOL)showProxyAuthenticationDialog\n{\n\tif ([self isSynchronous]) {\n\t\treturn NO;\n\t}\n\n\t// Mac authentication dialog coming soon!\n\t#if TARGET_OS_IPHONE\n\tif ([self shouldPresentProxyAuthenticationDialog]) {\n\t\t[ASIAuthenticationDialog performSelectorOnMainThread:@selector(presentAuthenticationDialogForRequest:) withObject:self waitUntilDone:[NSThread isMainThread]];\n\t\treturn YES;\n\t}\n\treturn NO;\n\t#else\n\treturn NO;\n\t#endif\n}\n\n\n- (BOOL)willAskDelegateForProxyCredentials\n{\n\tif ([self isSynchronous]) {\n\t\treturn NO;\n\t}\n\n\t// If we have a delegate, we'll see if it can handle proxyAuthenticationNeededForRequest:.\n\t// Otherwise, we'll try the queue (if this request is part of one) and it will pass the message on to its own delegate\n\tid authenticationDelegate = [self delegate];\n\tif (!authenticationDelegate) {\n\t\tauthenticationDelegate = [self queue];\n\t}\n\t\n\tBOOL delegateOrBlockWillHandleAuthentication = NO;\n\n\tif ([authenticationDelegate respondsToSelector:@selector(proxyAuthenticationNeededForRequest:)]) {\n\t\tdelegateOrBlockWillHandleAuthentication = YES;\n\t}\n\n\t#if NS_BLOCKS_AVAILABLE\n\tif(proxyAuthenticationNeededBlock){\n\t\tdelegateOrBlockWillHandleAuthentication = YES;\n\t}\n\t#endif\n\n\tif (delegateOrBlockWillHandleAuthentication) {\n\t\t[self performSelectorOnMainThread:@selector(askDelegateForProxyCredentials) withObject:nil waitUntilDone:NO];\n\t}\n\t\n\treturn delegateOrBlockWillHandleAuthentication;\n}\n\n/* ALWAYS CALLED ON MAIN THREAD! */\n- (void)askDelegateForProxyCredentials\n{\n\tid authenticationDelegate = [self delegate];\n\tif (!authenticationDelegate) {\n\t\tauthenticationDelegate = [self queue];\n\t}\n\tif ([authenticationDelegate respondsToSelector:@selector(proxyAuthenticationNeededForRequest:)]) {\n\t\t[authenticationDelegate performSelector:@selector(proxyAuthenticationNeededForRequest:) withObject:self];\n\t\treturn;\n\t}\n\t#if NS_BLOCKS_AVAILABLE\n\tif(proxyAuthenticationNeededBlock){\n\t\tproxyAuthenticationNeededBlock();\n\t}\n\t#endif\n}\n\n\n- (BOOL)willAskDelegateForCredentials\n{\n\tif ([self isSynchronous]) {\n\t\treturn NO;\n\t}\n\n\t// If we have a delegate, we'll see if it can handle proxyAuthenticationNeededForRequest:.\n\t// Otherwise, we'll try the queue (if this request is part of one) and it will pass the message on to its own delegate\n\tid authenticationDelegate = [self delegate];\n\tif (!authenticationDelegate) {\n\t\tauthenticationDelegate = [self queue];\n\t}\n\n\tBOOL delegateOrBlockWillHandleAuthentication = NO;\n\n\tif ([authenticationDelegate respondsToSelector:@selector(authenticationNeededForRequest:)]) {\n\t\tdelegateOrBlockWillHandleAuthentication = YES;\n\t}\n\n\t#if NS_BLOCKS_AVAILABLE\n\tif (authenticationNeededBlock) {\n\t\tdelegateOrBlockWillHandleAuthentication = YES;\n\t}\n\t#endif\n\n\tif (delegateOrBlockWillHandleAuthentication) {\n\t\t[self performSelectorOnMainThread:@selector(askDelegateForCredentials) withObject:nil waitUntilDone:NO];\n\t}\n\treturn delegateOrBlockWillHandleAuthentication;\n}\n\n/* ALWAYS CALLED ON MAIN THREAD! */\n- (void)askDelegateForCredentials\n{\n\tid authenticationDelegate = [self delegate];\n\tif (!authenticationDelegate) {\n\t\tauthenticationDelegate = [self queue];\n\t}\n\t\n\tif ([authenticationDelegate respondsToSelector:@selector(authenticationNeededForRequest:)]) {\n\t\t[authenticationDelegate performSelector:@selector(authenticationNeededForRequest:) withObject:self];\n\t\treturn;\n\t}\n\t\n\t#if NS_BLOCKS_AVAILABLE\n\tif (authenticationNeededBlock) {\n\t\tauthenticationNeededBlock();\n\t}\n\t#endif\t\n}\n\n- (void)attemptToApplyProxyCredentialsAndResume\n{\n\t\n\tif ([self error] || [self isCancelled]) {\n\t\treturn;\n\t}\n\t\n\t// Read authentication data\n\tif (!proxyAuthentication) {\n\t\tCFHTTPMessageRef responseHeader = (CFHTTPMessageRef) CFReadStreamCopyProperty((CFReadStreamRef)[self readStream],kCFStreamPropertyHTTPResponseHeader);\n\t\tproxyAuthentication = CFHTTPAuthenticationCreateFromResponse(NULL, responseHeader);\n\t\tCFRelease(responseHeader);\n\t\t[self setProxyAuthenticationScheme:[NSMakeCollectable(CFHTTPAuthenticationCopyMethod(proxyAuthentication)) autorelease]];\n\t}\n\t\n\t// If we haven't got a CFHTTPAuthenticationRef by now, something is badly wrong, so we'll have to give up\n\tif (!proxyAuthentication) {\n\t\t[self cancelLoad];\n\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIInternalErrorWhileApplyingCredentialsType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Failed to get authentication object from response headers\",NSLocalizedDescriptionKey,nil]]];\n\t\treturn;\n\t}\n\t\n\t// Get the authentication realm\n\t[self setProxyAuthenticationRealm:nil];\n\tif (!CFHTTPAuthenticationRequiresAccountDomain(proxyAuthentication)) {\n\t\t[self setProxyAuthenticationRealm:[NSMakeCollectable(CFHTTPAuthenticationCopyRealm(proxyAuthentication)) autorelease]];\n\t}\n\t\n\t// See if authentication is valid\n\tCFStreamError err;\t\t\n\tif (!CFHTTPAuthenticationIsValid(proxyAuthentication, &err)) {\n\t\t\n\t\tCFRelease(proxyAuthentication);\n\t\tproxyAuthentication = NULL;\n\t\t\n\t\t// check for bad credentials, so we can give the delegate a chance to replace them\n\t\tif (err.domain == kCFStreamErrorDomainHTTP && (err.error == kCFStreamErrorHTTPAuthenticationBadUserName || err.error == kCFStreamErrorHTTPAuthenticationBadPassword)) {\n\t\t\t\n\t\t\t// Prevent more than one request from asking for credentials at once\n\t\t\t[delegateAuthenticationLock lock];\n\t\t\t\n\t\t\t// We know the credentials we just presented are bad, we should remove them from the session store too\n\t\t\t[[self class] removeProxyAuthenticationCredentialsFromSessionStore:proxyCredentials];\n\t\t\t[self setProxyCredentials:nil];\n\t\t\t\n\t\t\t\n\t\t\t// If the user cancelled authentication via a dialog presented by another request, our queue may have cancelled us\n\t\t\tif ([self error] || [self isCancelled]) {\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t// Now we've acquired the lock, it may be that the session contains credentials we can re-use for this request\n\t\t\tif ([self useSessionPersistence]) {\n\t\t\t\tNSDictionary *credentials = [self findSessionProxyAuthenticationCredentials];\n\t\t\t\tif (credentials && [self applyProxyCredentials:[credentials objectForKey:@\"Credentials\"]]) {\n\t\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\t\t[self startRequest];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t[self setLastActivityTime:nil];\n\t\t\t\n\t\t\tif ([self willAskDelegateForProxyCredentials]) {\n\t\t\t\t[self attemptToApplyProxyCredentialsAndResume];\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ([self showProxyAuthenticationDialog]) {\n\t\t\t\t[self attemptToApplyProxyCredentialsAndResume];\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t[delegateAuthenticationLock unlock];\n\t\t}\n\t\t[self cancelLoad];\n\t\t[self failWithError:ASIAuthenticationError];\n\t\treturn;\n\t}\n\n\t[self cancelLoad];\n\t\n\tif (proxyCredentials) {\n\t\t\n\t\t// We use startRequest rather than starting all over again in load request because NTLM requires we reuse the request\n\t\tif ((([self proxyAuthenticationScheme] != (NSString *)kCFHTTPAuthenticationSchemeNTLM) || [self proxyAuthenticationRetryCount] < 2) && [self applyProxyCredentials:proxyCredentials]) {\n\t\t\t[self startRequest];\n\t\t\t\n\t\t// We've failed NTLM authentication twice, we should assume our credentials are wrong\n\t\t} else if ([self proxyAuthenticationScheme] == (NSString *)kCFHTTPAuthenticationSchemeNTLM && [self proxyAuthenticationRetryCount] == 2) {\n\t\t\t[self failWithError:ASIAuthenticationError];\n\t\t\t\n\t\t// Something went wrong, we'll have to give up\n\t\t} else {\n\t\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIInternalErrorWhileApplyingCredentialsType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Failed to apply proxy credentials to request\",NSLocalizedDescriptionKey,nil]]];\n\t\t}\n\t\t\n\t// Are a user name & password needed?\n\t}  else if (CFHTTPAuthenticationRequiresUserNameAndPassword(proxyAuthentication)) {\n\t\t\n\t\t// Prevent more than one request from asking for credentials at once\n\t\t[delegateAuthenticationLock lock];\n\t\t\n\t\t// If the user cancelled authentication via a dialog presented by another request, our queue may have cancelled us\n\t\tif ([self error] || [self isCancelled]) {\n\t\t\t[delegateAuthenticationLock unlock];\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Now we've acquired the lock, it may be that the session contains credentials we can re-use for this request\n\t\tif ([self useSessionPersistence]) {\n\t\t\tNSDictionary *credentials = [self findSessionProxyAuthenticationCredentials];\n\t\t\tif (credentials && [self applyProxyCredentials:[credentials objectForKey:@\"Credentials\"]]) {\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\t[self startRequest];\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tNSMutableDictionary *newCredentials = [self findProxyCredentials];\n\t\t\n\t\t//If we have some credentials to use let's apply them to the request and continue\n\t\tif (newCredentials) {\n\t\t\t\n\t\t\tif ([self applyProxyCredentials:newCredentials]) {\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\t[self startRequest];\n\t\t\t} else {\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIInternalErrorWhileApplyingCredentialsType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Failed to apply proxy credentials to request\",NSLocalizedDescriptionKey,nil]]];\n\t\t\t}\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ([self willAskDelegateForProxyCredentials]) {\n\t\t\t[delegateAuthenticationLock unlock];\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ([self showProxyAuthenticationDialog]) {\n\t\t\t[delegateAuthenticationLock unlock];\n\t\t\treturn;\n\t\t}\n\t\t[delegateAuthenticationLock unlock];\n\t\t\n\t\t// The delegate isn't interested and we aren't showing the authentication dialog, we'll have to give up\n\t\t[self failWithError:ASIAuthenticationError];\n\t\treturn;\n\t}\n\t\n}\n\n- (BOOL)showAuthenticationDialog\n{\n\tif ([self isSynchronous]) {\n\t\treturn NO;\n\t}\n\t// Mac authentication dialog coming soon!\n\t#if TARGET_OS_IPHONE\n\tif ([self shouldPresentAuthenticationDialog]) {\n\t\t[ASIAuthenticationDialog performSelectorOnMainThread:@selector(presentAuthenticationDialogForRequest:) withObject:self waitUntilDone:[NSThread isMainThread]];\n\t\treturn YES;\n\t}\n\treturn NO;\n\t#else\n\treturn NO;\n\t#endif\n}\n\n- (void)attemptToApplyCredentialsAndResume\n{\n\tif ([self error] || [self isCancelled]) {\n\t\treturn;\n\t}\n\t\n\t// Do we actually need to authenticate with a proxy?\n\tif ([self authenticationNeeded] == ASIProxyAuthenticationNeeded) {\n\t\t[self attemptToApplyProxyCredentialsAndResume];\n\t\treturn;\n\t}\n\t\n\t// Read authentication data\n\tif (!requestAuthentication) {\n\t\tCFHTTPMessageRef responseHeader = (CFHTTPMessageRef) CFReadStreamCopyProperty((CFReadStreamRef)[self readStream],kCFStreamPropertyHTTPResponseHeader);\n\t\trequestAuthentication = CFHTTPAuthenticationCreateFromResponse(NULL, responseHeader);\n\t\tCFRelease(responseHeader);\n\t\t[self setAuthenticationScheme:[NSMakeCollectable(CFHTTPAuthenticationCopyMethod(requestAuthentication)) autorelease]];\n\t}\n\t\n\tif (!requestAuthentication) {\n\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ failed to read authentication information from response headers\",self);\n\t\t#endif\n\n\t\t[self cancelLoad];\n\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIInternalErrorWhileApplyingCredentialsType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Failed to get authentication object from response headers\",NSLocalizedDescriptionKey,nil]]];\n\t\treturn;\n\t}\n\t\n\t// Get the authentication realm\n\t[self setAuthenticationRealm:nil];\n\tif (!CFHTTPAuthenticationRequiresAccountDomain(requestAuthentication)) {\n\t\t[self setAuthenticationRealm:[NSMakeCollectable(CFHTTPAuthenticationCopyRealm(requestAuthentication)) autorelease]];\n\t}\n\t\n\t#if DEBUG_HTTP_AUTHENTICATION\n\t\tNSString *realm = [self authenticationRealm];\n\t\tif (realm) {\n\t\t\trealm = [NSString stringWithFormat:@\" (Realm: %@)\",realm];\n\t\t} else {\n\t\t\trealm = @\"\";\n\t\t}\n\t\tif ([self authenticationScheme] != (NSString *)kCFHTTPAuthenticationSchemeNTLM || [self authenticationRetryCount] == 0) {\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ received 401 challenge and must authenticate using %@%@\",self,[self authenticationScheme],realm);\n\t\t} else {\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ NTLM handshake step %i\",self,[self authenticationRetryCount]+1);\n\t\t}\n\t#endif\n\n\t// See if authentication is valid\n\tCFStreamError err;\t\t\n\tif (!CFHTTPAuthenticationIsValid(requestAuthentication, &err)) {\n\t\t\n\t\tCFRelease(requestAuthentication);\n\t\trequestAuthentication = NULL;\n\t\t\n\t\t// check for bad credentials, so we can give the delegate a chance to replace them\n\t\tif (err.domain == kCFStreamErrorDomainHTTP && (err.error == kCFStreamErrorHTTPAuthenticationBadUserName || err.error == kCFStreamErrorHTTPAuthenticationBadPassword)) {\n\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ had bad credentials, will remove them from the session store if they are cached\",self);\n\t\t\t#endif\n\n\t\t\t// Prevent more than one request from asking for credentials at once\n\t\t\t[delegateAuthenticationLock lock];\n\t\t\t\n\t\t\t// We know the credentials we just presented are bad, we should remove them from the session store too\n\t\t\t[[self class] removeAuthenticationCredentialsFromSessionStore:requestCredentials];\n\t\t\t[self setRequestCredentials:nil];\n\t\t\t\n\t\t\t// If the user cancelled authentication via a dialog presented by another request, our queue may have cancelled us\n\t\t\tif ([self error] || [self isCancelled]) {\n\n\t\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ failed or was cancelled while waiting to access credentials\",self);\n\t\t\t\t#endif\n\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Now we've acquired the lock, it may be that the session contains credentials we can re-use for this request\n\t\t\tif ([self useSessionPersistence]) {\n\t\t\t\tNSDictionary *credentials = [self findSessionAuthenticationCredentials];\n\t\t\t\tif (credentials && [self applyCredentials:[credentials objectForKey:@\"Credentials\"]]) {\n\n\t\t\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will reuse cached credentials from the session (%@)\",self,[credentials objectForKey:@\"AuthenticationScheme\"]);\n\t\t\t\t\t#endif\n\n\t\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\t\t[self startRequest];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t[self setLastActivityTime:nil];\n\t\t\t\n\t\t\tif ([self willAskDelegateForCredentials]) {\n\n\t\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will ask its delegate for credentials to use\",self);\n\t\t\t\t#endif\n\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ([self showAuthenticationDialog]) {\n\n\t\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will ask ASIAuthenticationDialog for credentials\",self);\n\t\t\t\t#endif\n\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t[delegateAuthenticationLock unlock];\n\t\t}\n\n\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ has no credentials to present and must give up\",self);\n\t\t#endif\n\n\t\t[self cancelLoad];\n\t\t[self failWithError:ASIAuthenticationError];\n\t\treturn;\n\t}\n\t\n\t[self cancelLoad];\n\t\n\tif (requestCredentials) {\n\t\t\n\t\tif ((([self authenticationScheme] != (NSString *)kCFHTTPAuthenticationSchemeNTLM) || [self authenticationRetryCount] < 2) && [self applyCredentials:requestCredentials]) {\n\t\t\t[self startRequest];\n\t\t\t\n\t\t\t// We've failed NTLM authentication twice, we should assume our credentials are wrong\n\t\t} else if ([self authenticationScheme] == (NSString *)kCFHTTPAuthenticationSchemeNTLM && [self authenticationRetryCount ] == 2) {\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ has failed NTLM authentication\",self);\n\t\t\t#endif\n\n\t\t\t[self failWithError:ASIAuthenticationError];\n\t\t\t\n\t\t} else {\n\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ had credentials and they were not marked as bad, but we got a 401 all the same.\",self);\n\t\t\t#endif\n\n\t\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIInternalErrorWhileApplyingCredentialsType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Failed to apply credentials to request\",NSLocalizedDescriptionKey,nil]]];\n\t\t}\n\t\t\n\t\t// Are a user name & password needed?\n\t}  else if (CFHTTPAuthenticationRequiresUserNameAndPassword(requestAuthentication)) {\n\t\t\n\t\t// Prevent more than one request from asking for credentials at once\n\t\t[delegateAuthenticationLock lock];\n\t\t\n\t\t// If the user cancelled authentication via a dialog presented by another request, our queue may have cancelled us\n\t\tif ([self error] || [self isCancelled]) {\n\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ failed or was cancelled while waiting to access credentials\",self);\n\t\t\t#endif\n\n\t\t\t[delegateAuthenticationLock unlock];\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Now we've acquired the lock, it may be that the session contains credentials we can re-use for this request\n\t\tif ([self useSessionPersistence]) {\n\t\t\tNSDictionary *credentials = [self findSessionAuthenticationCredentials];\n\t\t\tif (credentials && [self applyCredentials:[credentials objectForKey:@\"Credentials\"]]) {\n\n\t\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will reuse cached credentials from the session (%@)\",self,[credentials objectForKey:@\"AuthenticationScheme\"]);\n\t\t\t\t#endif\n\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\t[self startRequest];\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\n\t\tNSMutableDictionary *newCredentials = [self findCredentials];\n\t\t\n\t\t//If we have some credentials to use let's apply them to the request and continue\n\t\tif (newCredentials) {\n\t\t\t\n\t\t\tif ([self applyCredentials:newCredentials]) {\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\t[self startRequest];\n\t\t\t} else {\n\t\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ failed to apply credentials\",self);\n\t\t\t\t#endif\n\t\t\t\t[delegateAuthenticationLock unlock];\n\t\t\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIInternalErrorWhileApplyingCredentialsType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Failed to apply credentials to request\",NSLocalizedDescriptionKey,nil]]];\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif ([self willAskDelegateForCredentials]) {\n\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will ask its delegate for credentials to use\",self);\n\t\t\t#endif\n\n\t\t\t[delegateAuthenticationLock unlock];\n\t\t\treturn;\n\t\t}\n\t\tif ([self showAuthenticationDialog]) {\n\n\t\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ will ask ASIAuthenticationDialog for credentials\",self);\n\t\t\t#endif\n\n\t\t\t[delegateAuthenticationLock unlock];\n\t\t\treturn;\n\t\t}\n\n\t\t#if DEBUG_HTTP_AUTHENTICATION\n\t\tASI_DEBUG_LOG(@\"[AUTH] Request %@ has no credentials to present and must give up\",self);\n\t\t#endif\n\t\t[delegateAuthenticationLock unlock];\n\t\t[self failWithError:ASIAuthenticationError];\n\t\treturn;\n\t}\n\t\n}\n\n- (void)addBasicAuthenticationHeaderWithUsername:(NSString *)theUsername andPassword:(NSString *)thePassword\n{\n\t[self addRequestHeader:@\"Authorization\" value:[NSString stringWithFormat:@\"Basic %@\",[ASIHTTPRequest base64forData:[[NSString stringWithFormat:@\"%@:%@\",theUsername,thePassword] dataUsingEncoding:NSUTF8StringEncoding]]]];\t\n\t[self setAuthenticationScheme:(NSString *)kCFHTTPAuthenticationSchemeBasic];\n\n}\n\n\n#pragma mark stream status handlers\n\n- (void)handleNetworkEvent:(CFStreamEventType)type\n{\t\n\tNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\n\t[[self cancelledLock] lock];\n\t\n\tif ([self complete] || [self isCancelled]) {\n\t\t[[self cancelledLock] unlock];\n\t\t[pool drain];\n\t\treturn;\n\t}\n\n\tCFRetain(self);\n\n    // Dispatch the stream events.\n    switch (type) {\n        case kCFStreamEventHasBytesAvailable:\n            [self handleBytesAvailable];\n            break;\n            \n        case kCFStreamEventEndEncountered:\n            [self handleStreamComplete];\n            break;\n            \n        case kCFStreamEventErrorOccurred:\n            [self handleStreamError];\n            break;\n            \n        default:\n            break;\n    }\n\t\n\t[self performThrottling];\n\t\n\t[[self cancelledLock] unlock];\n\t\n\tif ([self downloadComplete] && [self needsRedirect]) {\n\t\tif (![self willAskDelegateToConfirmRedirect]) {\n\t\t\t[self performRedirect];\n\t\t}\n\t} else if ([self downloadComplete] && [self authenticationNeeded]) {\n\t\t[self attemptToApplyCredentialsAndResume];\n\t}\n\n\tCFRelease(self);\n\t[pool drain];\n}\n\n- (BOOL)willAskDelegateToConfirmRedirect\n{\n\t// We must lock to ensure delegate / queue aren't changed while we check them\n\t[[self cancelledLock] lock];\n\n\t// Here we perform an initial check to see if either the delegate or the queue wants to be asked about the redirect, because if not we should redirect straight away\n\t// We will check again on the main thread later\n\tBOOL needToAskDelegateAboutRedirect = (([self delegate] && [[self delegate] respondsToSelector:[self willRedirectSelector]]) || ([self queue] && [[self queue] respondsToSelector:@selector(request:willRedirectToURL:)]));\n\n\t[[self cancelledLock] unlock];\n\n\t// Either the delegate or the queue's delegate is interested in being told when we are about to redirect\n\tif (needToAskDelegateAboutRedirect) {\n\t\tNSURL *newURL = [[[self redirectURL] copy] autorelease];\n\t\t[self setRedirectURL:nil];\n\t\t[self performSelectorOnMainThread:@selector(requestWillRedirectToURL:) withObject:newURL waitUntilDone:[NSThread isMainThread]];\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n- (void)handleBytesAvailable\n{\n\tif (![self responseHeaders]) {\n\t\t[self readResponseHeaders];\n\t}\n\t\n\t// If we've cancelled the load part way through (for example, after deciding to use a cached version)\n\tif ([self complete]) {\n\t\treturn;\n\t}\n\t\n\t// In certain (presumably very rare) circumstances, handleBytesAvailable seems to be called when there isn't actually any data available\n\t// We'll check that there is actually data available to prevent blocking on CFReadStreamRead()\n\t// So far, I've only seen this in the stress tests, so it might never happen in real-world situations.\n\tif (!CFReadStreamHasBytesAvailable((CFReadStreamRef)[self readStream])) {\n\t\treturn;\n\t}\n\n\tlong long bufferSize = 16384;\n\tif (contentLength > 262144) {\n\t\tbufferSize = 262144;\n\t} else if (contentLength > 65536) {\n\t\tbufferSize = 65536;\n\t}\n\t\n\t// Reduce the buffer size if we're receiving data too quickly when bandwidth throttling is active\n\t// This just augments the throttling done in measureBandwidthUsage to reduce the amount we go over the limit\n\t\n\tif ([[self class] isBandwidthThrottled]) {\n\t\t[bandwidthThrottlingLock lock];\n\t\tif (maxBandwidthPerSecond > 0) {\n\t\t\tlong long maxiumumSize  = (long long)maxBandwidthPerSecond-(long long)bandwidthUsedInLastSecond;\n\t\t\tif (maxiumumSize < 0) {\n\t\t\t\t// We aren't supposed to read any more data right now, but we'll read a single byte anyway so the CFNetwork's buffer isn't full\n\t\t\t\tbufferSize = 1;\n\t\t\t} else if (maxiumumSize/4 < bufferSize) {\n\t\t\t\t// We were going to fetch more data that we should be allowed, so we'll reduce the size of our read\n\t\t\t\tbufferSize = maxiumumSize/4;\n\t\t\t}\n\t\t}\n\t\tif (bufferSize < 1) {\n\t\t\tbufferSize = 1;\n\t\t}\n\t\t[bandwidthThrottlingLock unlock];\n\t}\n\t\n\t\n    UInt8 buffer[bufferSize];\n    NSInteger bytesRead = [[self readStream] read:buffer maxLength:sizeof(buffer)];\n\n    // Less than zero is an error\n    if (bytesRead < 0) {\n        [self handleStreamError];\n\t\t\n\t// If zero bytes were read, wait for the EOF to come.\n    } else if (bytesRead) {\n\n\t\t// If we are inflating the response on the fly\n\t\tNSData *inflatedData = nil;\n\t\tif ([self isResponseCompressed] && ![self shouldWaitToInflateCompressedResponses]) {\n\t\t\tif (![self dataDecompressor]) {\n\t\t\t\t[self setDataDecompressor:[ASIDataDecompressor decompressor]];\n\t\t\t}\n\t\t\tNSError *err = nil;\n\t\t\tinflatedData = [[self dataDecompressor] uncompressBytes:buffer length:bytesRead error:&err];\n\t\t\tif (err) {\n\t\t\t\t[self failWithError:err];\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\t[self setTotalBytesRead:[self totalBytesRead]+bytesRead];\n\t\t[self setLastActivityTime:[NSDate date]];\n\n\t\t// For bandwidth measurement / throttling\n\t\t[ASIHTTPRequest incrementBandwidthUsedInLastSecond:bytesRead];\n\t\t\n\t\t// If we need to redirect, and have automatic redirect on, and might be resuming a download, let's do nothing with the content\n\t\tif ([self needsRedirect] && [self shouldRedirect] && [self allowResumeForFileDownloads]) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tBOOL dataWillBeHandledExternally = NO;\n\t\tif ([[self delegate] respondsToSelector:[self didReceiveDataSelector]]) {\n\t\t\tdataWillBeHandledExternally = YES;\n\t\t}\n\t\t#if NS_BLOCKS_AVAILABLE\n\t\tif (dataReceivedBlock) {\n\t\t\tdataWillBeHandledExternally = YES;\n\t\t}\n\t\t#endif\n\t\t// Does the delegate want to handle the data manually?\n\t\tif (dataWillBeHandledExternally) {\n\n\t\t\tNSData *data = nil;\n\t\t\tif ([self isResponseCompressed] && ![self shouldWaitToInflateCompressedResponses]) {\n\t\t\t\tdata = inflatedData;\n\t\t\t} else {\n\t\t\t\tdata = [NSData dataWithBytes:buffer length:bytesRead];\n\t\t\t}\n\t\t\t[self performSelectorOnMainThread:@selector(passOnReceivedData:) withObject:data waitUntilDone:[NSThread isMainThread]];\n\t\t\t\n\t\t// Are we downloading to a file?\n\t\t} else if ([self downloadDestinationPath]) {\n\t\t\tBOOL append = NO;\n\t\t\tif (![self fileDownloadOutputStream]) {\n\t\t\t\tif (![self temporaryFileDownloadPath]) {\n\t\t\t\t\t[self setTemporaryFileDownloadPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]];\n\t\t\t\t} else if ([self allowResumeForFileDownloads] && [[self requestHeaders] objectForKey:@\"Range\"]) {\n\t\t\t\t\tif ([[self responseHeaders] objectForKey:@\"Content-Range\"]) {\n\t\t\t\t\t\tappend = YES;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t[self incrementDownloadSizeBy:-[self partialDownloadSize]];\n\t\t\t\t\t\t[self setPartialDownloadSize:0];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t[self setFileDownloadOutputStream:[[[NSOutputStream alloc] initToFileAtPath:[self temporaryFileDownloadPath] append:append] autorelease]];\n\t\t\t\t[[self fileDownloadOutputStream] open];\n\n\t\t\t}\n\t\t\t[[self fileDownloadOutputStream] write:buffer maxLength:bytesRead];\n\n\t\t\tif ([self isResponseCompressed] && ![self shouldWaitToInflateCompressedResponses]) {\n\t\t\t\t\n\t\t\t\tif (![self inflatedFileDownloadOutputStream]) {\n\t\t\t\t\tif (![self temporaryUncompressedDataDownloadPath]) {\n\t\t\t\t\t\t[self setTemporaryUncompressedDataDownloadPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t[self setInflatedFileDownloadOutputStream:[[[NSOutputStream alloc] initToFileAtPath:[self temporaryUncompressedDataDownloadPath] append:append] autorelease]];\n\t\t\t\t\t[[self inflatedFileDownloadOutputStream] open];\n\t\t\t\t}\n\n\t\t\t\t[[self inflatedFileDownloadOutputStream] write:[inflatedData bytes] maxLength:[inflatedData length]];\n\t\t\t}\n\n\t\t\t\n\t\t//Otherwise, let's add the data to our in-memory store\n\t\t} else {\n\t\t\tif ([self isResponseCompressed] && ![self shouldWaitToInflateCompressedResponses]) {\n\t\t\t\t[rawResponseData appendData:inflatedData];\n\t\t\t} else {\n\t\t\t\t[rawResponseData appendBytes:buffer length:bytesRead];\n\t\t\t}\n\t\t}\n    }\n}\n\n- (void)handleStreamComplete\n{\t\n\n#if DEBUG_REQUEST_STATUS\n\tASI_DEBUG_LOG(@\"[STATUS] Request %@ finished downloading data (%qu bytes)\",self, [self totalBytesRead]);\n#endif\n\t[self setStatusTimer:nil];\n\t[self setDownloadComplete:YES];\n\t\n\tif (![self responseHeaders]) {\n\t\t[self readResponseHeaders];\n\t}\n\n\t[progressLock lock];\t\n\t// Find out how much data we've uploaded so far\n\t[self setLastBytesSent:totalBytesSent];\t\n\t[self setTotalBytesSent:[[NSMakeCollectable(CFReadStreamCopyProperty((CFReadStreamRef)[self readStream], kCFStreamPropertyHTTPRequestBytesWrittenCount)) autorelease] unsignedLongLongValue]];\n\t[self setComplete:YES];\n\tif (![self contentLength]) {\n\t\t[self setContentLength:[self totalBytesRead]];\n\t}\n\t[self updateProgressIndicators];\n\n\t\n\t[[self postBodyReadStream] close];\n\t[self setPostBodyReadStream:nil];\n\t\n\t[self setDataDecompressor:nil];\n\n\tNSError *fileError = nil;\n\t\n\t// Delete up the request body temporary file, if it exists\n\tif ([self didCreateTemporaryPostDataFile] && ![self authenticationNeeded]) {\n\t\t[self removeTemporaryUploadFile];\n\t\t[self removeTemporaryCompressedUploadFile];\n\t}\n\t\n\t// Close the output stream as we're done writing to the file\n\tif ([self temporaryFileDownloadPath]) {\n\t\t\n\t\t[[self fileDownloadOutputStream] close];\n\t\t[self setFileDownloadOutputStream:nil];\n\n\t\t[[self inflatedFileDownloadOutputStream] close];\n\t\t[self setInflatedFileDownloadOutputStream:nil];\n\n\t\t// If we are going to redirect and we are resuming, let's ignore this download\n\t\tif ([self shouldRedirect] && [self needsRedirect] && [self allowResumeForFileDownloads]) {\n\t\t\n\t\t} else if ([self isResponseCompressed]) {\n\t\t\t\n\t\t\t// Decompress the file directly to the destination path\n\t\t\tif ([self shouldWaitToInflateCompressedResponses]) {\n\t\t\t\t[ASIDataDecompressor uncompressDataFromFile:[self temporaryFileDownloadPath] toFile:[self downloadDestinationPath] error:&fileError];\n\n\t\t\t// Response should already have been inflated, move the temporary file to the destination path\n\t\t\t} else {\n\t\t\t\tNSError *moveError = nil;\n\t\t\t\t[[[[NSFileManager alloc] init] autorelease] moveItemAtPath:[self temporaryUncompressedDataDownloadPath] toPath:[self downloadDestinationPath] error:&moveError];\n\t\t\t\tif (moveError) {\n\t\t\t\t\tfileError = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASIFileManagementError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@\"Failed to move file from '%@' to '%@'\",[self temporaryFileDownloadPath],[self downloadDestinationPath]],NSLocalizedDescriptionKey,moveError,NSUnderlyingErrorKey,nil]];\n\t\t\t\t}\n\t\t\t\t[self setTemporaryUncompressedDataDownloadPath:nil];\n\n\t\t\t}\n\t\t\t[self removeTemporaryDownloadFile];\n\n\t\t} else {\n\t\n\t\t\t//Remove any file at the destination path\n\t\t\tNSError *moveError = nil;\n\t\t\tif (![[self class] removeFileAtPath:[self downloadDestinationPath] error:&moveError]) {\n\t\t\t\tfileError = moveError;\n\n\t\t\t}\n\n\t\t\t//Move the temporary file to the destination path\n\t\t\tif (!fileError) {\n\t\t\t\t[[[[NSFileManager alloc] init] autorelease] moveItemAtPath:[self temporaryFileDownloadPath] toPath:[self downloadDestinationPath] error:&moveError];\n\t\t\t\tif (moveError) {\n\t\t\t\t\tfileError = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASIFileManagementError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@\"Failed to move file from '%@' to '%@'\",[self temporaryFileDownloadPath],[self downloadDestinationPath]],NSLocalizedDescriptionKey,moveError,NSUnderlyingErrorKey,nil]];\n\t\t\t\t}\n\t\t\t\t[self setTemporaryFileDownloadPath:nil];\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n\t\n\t// Save to the cache\n\tif ([self downloadCache] && ![self didUseCachedResponse]) {\n\t\t[[self downloadCache] storeResponseForRequest:self maxAge:[self secondsToCache]];\n\t}\n\t\n\t[progressLock unlock];\n\n\t\n\t[connectionsLock lock];\n\tif (![self connectionCanBeReused]) {\n\t\t[self unscheduleReadStream];\n\t}\n\t#if DEBUG_PERSISTENT_CONNECTIONS\n\tif ([self requestID]) {\n\t\tASI_DEBUG_LOG(@\"[CONNECTION] Request #%@ finished using connection #%@\",[self requestID], [[self connectionInfo] objectForKey:@\"id\"]);\n\t}\n\t#endif\n\t[[self connectionInfo] removeObjectForKey:@\"request\"];\n\t[[self connectionInfo] setObject:[NSDate dateWithTimeIntervalSinceNow:[self persistentConnectionTimeoutSeconds]] forKey:@\"expires\"];\n\t[connectionsLock unlock];\n\t\n\tif (![self authenticationNeeded]) {\n\t\t[self destroyReadStream];\n\t}\n\t\n\n\tif (![self needsRedirect] && ![self authenticationNeeded] && ![self didUseCachedResponse]) {\n\t\t\n\t\tif (fileError) {\n\t\t\t[self failWithError:fileError];\n\t\t} else {\n\t\t\t[self requestFinished];\n\t\t}\n\n\t\t[self markAsFinished];\n\t\t\n\t// If request has asked delegate or ASIAuthenticationDialog for credentials\n\t} else if ([self authenticationNeeded]) {\n        // Do nothing.\n\t}\n\n}\n\n- (void)markAsFinished\n{\n\t// Autoreleased requests may well be dealloced here otherwise\n\tCFRetain(self);\n\n\t// dealloc won't be called when running with GC, so we'll clean these up now\n\tif (request) {\n\t\tCFRelease(request);\n\t\trequest = nil;\n\t}\n\tif (requestAuthentication) {\n\t\tCFRelease(requestAuthentication);\n\t\trequestAuthentication = nil;\n\t}\n\tif (proxyAuthentication) {\n\t\tCFRelease(proxyAuthentication);\n\t\tproxyAuthentication = nil;\n\t}\n\n    BOOL wasInProgress = inProgress;\n    BOOL wasFinished = finished;\n\n    if (!wasFinished)\n        [self willChangeValueForKey:@\"isFinished\"];\n    if (wasInProgress)\n        [self willChangeValueForKey:@\"isExecuting\"];\n\n\t[self setInProgress:NO];\n    finished = YES;\n\n    if (wasInProgress)\n        [self didChangeValueForKey:@\"isExecuting\"];\n    if (!wasFinished)\n        [self didChangeValueForKey:@\"isFinished\"];\n\n\t#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0\n\tif ([ASIHTTPRequest isMultitaskingSupported] && [self shouldContinueWhenAppEntersBackground]) {\n\t\tdispatch_async(dispatch_get_main_queue(), ^{\n\t\t\tif (backgroundTask != UIBackgroundTaskInvalid) {\n\t\t\t\t[[UIApplication sharedApplication] endBackgroundTask:backgroundTask];\n\t\t\t\tbackgroundTask = UIBackgroundTaskInvalid;\n\t\t\t}\n\t\t});\n\t}\n\t#endif\n\tCFRelease(self);\n}\n\n- (void)useDataFromCache\n{\n\tNSDictionary *headers = [[self downloadCache] cachedResponseHeadersForURL:[self url]];\n\tNSString *dataPath = [[self downloadCache] pathToCachedResponseDataForURL:[self url]];\n\n\tASIHTTPRequest *theRequest = self;\n\tif ([self mainRequest]) {\n\t\ttheRequest = [self mainRequest];\n\t}\n\n\tif (headers && dataPath) {\n\n\t\t[self setResponseStatusCode:[[headers objectForKey:@\"X-ASIHTTPRequest-Response-Status-Code\"] intValue]];\n\t\t[self setDidUseCachedResponse:YES];\n\t\t[theRequest setResponseHeaders:headers];\n\n\t\tif ([theRequest downloadDestinationPath]) {\n\t\t\t[theRequest setDownloadDestinationPath:dataPath];\n\t\t} else {\n\t\t\t[theRequest setRawResponseData:[NSMutableData dataWithData:[[self downloadCache] cachedResponseDataForURL:[self url]]]];\n\t\t}\n\t\t[theRequest setContentLength:[[[self responseHeaders] objectForKey:@\"Content-Length\"] longLongValue]];\n\t\t[theRequest setTotalBytesRead:[self contentLength]];\n\n\t\t[theRequest parseStringEncodingFromHeaders];\n\n\t\t[theRequest setResponseCookies:[NSHTTPCookie cookiesWithResponseHeaderFields:headers forURL:[self url]]];\n\n\t\t// See if we need to redirect\n\t\tif ([self willRedirect]) {\n\t\t\tif (![self willAskDelegateToConfirmRedirect]) {\n\t\t\t\t[self performRedirect];\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\n\t[theRequest setComplete:YES];\n\t[theRequest setDownloadComplete:YES];\n\n\t// If we're pulling data from the cache without contacting the server at all, we won't have set originalURL yet\n\tif ([self redirectCount] == 0) {\n\t\t[theRequest setOriginalURL:[theRequest url]];\n\t}\n\n\t[theRequest updateProgressIndicators];\n\t[theRequest requestFinished];\n\t[theRequest markAsFinished];\t\n\tif ([self mainRequest]) {\n\t\t[self markAsFinished];\n\t}\n}\n\n- (BOOL)retryUsingNewConnection\n{\n\tif ([self retryCount] == 0) {\n\n\t\t[self setWillRetryRequest:YES];\n\t\t[self cancelLoad];\n\t\t[self setWillRetryRequest:NO];\n\n\t\t#if DEBUG_PERSISTENT_CONNECTIONS\n\t\t\tASI_DEBUG_LOG(@\"[CONNECTION] Request attempted to use connection #%@, but it has been closed - will retry with a new connection\", [[self connectionInfo] objectForKey:@\"id\"]);\n\t\t#endif\n\t\t[connectionsLock lock];\n\t\t[[self connectionInfo] removeObjectForKey:@\"request\"];\n\t\t[persistentConnectionsPool removeObject:[self connectionInfo]];\n\t\t[self setConnectionInfo:nil];\n\t\t[connectionsLock unlock];\n\t\t[self setRetryCount:[self retryCount]+1];\n\t\t[self startRequest];\n\t\treturn YES;\n\t}\n\t#if DEBUG_PERSISTENT_CONNECTIONS\n\t\tASI_DEBUG_LOG(@\"[CONNECTION] Request attempted to use connection #%@, but it has been closed - we have already retried with a new connection, so we must give up\", [[self connectionInfo] objectForKey:@\"id\"]);\n\t#endif\t\n\treturn NO;\n}\n\n- (void)handleStreamError\n\n{\n\tNSError *underlyingError = [NSMakeCollectable(CFReadStreamCopyError((CFReadStreamRef)[self readStream])) autorelease];\n\n\tif (![self error]) { // We may already have handled this error\n\t\t\n\t\t// First, check for a 'socket not connected', 'broken pipe' or 'connection lost' error\n\t\t// This may occur when we've attempted to reuse a connection that should have been closed\n\t\t// If we get this, we need to retry the request\n\t\t// We'll only do this once - if it happens again on retry, we'll give up\n\t\t// -1005 = kCFURLErrorNetworkConnectionLost - this doesn't seem to be declared on Mac OS 10.5\n\t\tif (([[underlyingError domain] isEqualToString:NSPOSIXErrorDomain] && ([underlyingError code] == ENOTCONN || [underlyingError code] == EPIPE)) \n\t\t\t|| ([[underlyingError domain] isEqualToString:(NSString *)kCFErrorDomainCFNetwork] && [underlyingError code] == -1005)) {\n\t\t\tif ([self retryUsingNewConnection]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tNSString *reason = @\"A connection failure occurred\";\n\t\t\n\t\t// We'll use a custom error message for SSL errors, but you should always check underlying error if you want more details\n\t\t// For some reason SecureTransport.h doesn't seem to be available on iphone, so error codes hard-coded\n\t\t// Also, iPhone seems to handle errors differently from Mac OS X - a self-signed certificate returns a different error code on each platform, so we'll just provide a general error\n\t\tif ([[underlyingError domain] isEqualToString:NSOSStatusErrorDomain]) {\n\t\t\tif ([underlyingError code] <= -9800 && [underlyingError code] >= -9818) {\n\t\t\t\treason = [NSString stringWithFormat:@\"%@: SSL problem (Possible causes may include a bad/expired/self-signed certificate, clock set to wrong date)\",reason];\n\t\t\t}\n\t\t}\n\t\t[self cancelLoad];\n\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIConnectionFailureErrorType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:reason,NSLocalizedDescriptionKey,underlyingError,NSUnderlyingErrorKey,nil]]];\n\t} else {\n\t\t[self cancelLoad];\n\t}\n\t[self checkRequestStatus];\n}\n\n#pragma mark managing the read stream\n\n- (void)destroyReadStream\n{\n    if ([self readStream]) {\n\t\t[self unscheduleReadStream];\n\t\tif (![self connectionCanBeReused]) {\n\t\t\t[[self readStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:[self runLoopMode]];\n\t\t\t[[self readStream] close];\n\t\t}\n\t\t[self setReadStream:nil];\n    }\t\n}\n\n- (void)scheduleReadStream\n{\n\tif ([self readStream] && ![self readStreamIsScheduled]) {\n\n\t\t[connectionsLock lock];\n\t\trunningRequestCount++;\n\t\tif (shouldUpdateNetworkActivityIndicator) {\n\t\t\t[[self class] showNetworkActivityIndicator];\n\t\t}\n\t\t[connectionsLock unlock];\n\n\t\t// Reset the timeout\n\t\t[self setLastActivityTime:[NSDate date]];\n\t\tCFStreamClientContext ctxt = {0, self, NULL, NULL, NULL};\n\t\tCFReadStreamSetClient((CFReadStreamRef)[self readStream], kNetworkEvents, ReadStreamClientCallBack, &ctxt);\n\t\t[[self readStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:[self runLoopMode]];\n\t\t[self setReadStreamIsScheduled:YES];\n\t}\n}\n\n\n- (void)unscheduleReadStream\n{\n\tif ([self readStream] && [self readStreamIsScheduled]) {\n\n\t\t[connectionsLock lock];\n\t\trunningRequestCount--;\n\t\tif (shouldUpdateNetworkActivityIndicator && runningRequestCount == 0) {\n\t\t\t// This call will wait half a second before turning off the indicator\n\t\t\t// This can prevent flicker when you have a single request finish and then immediately start another request\n\t\t\t// We run this on the main thread because we have no guarantee this thread will have a runloop in 0.5 seconds time\n\t\t\t// We don't bother the cancel this call if we start a new request, because we'll check if requests are running before we hide it\n\t\t\t[[self class] performSelectorOnMainThread:@selector(hideNetworkActivityIndicatorAfterDelay) withObject:nil waitUntilDone:[NSThread isMainThread]];\n\t\t}\n\t\t[connectionsLock unlock];\n\n\t\tCFReadStreamSetClient((CFReadStreamRef)[self readStream], kCFStreamEventNone, NULL, NULL);\n\t\t[[self readStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:[self runLoopMode]];\n\t\t[self setReadStreamIsScheduled:NO];\n\t}\n}\n\n#pragma mark cleanup\n\n- (BOOL)removeTemporaryDownloadFile\n{\n\tNSError *err = nil;\n\tif ([self temporaryFileDownloadPath]) {\n\t\tif (![[self class] removeFileAtPath:[self temporaryFileDownloadPath] error:&err]) {\n\t\t\t[self failWithError:err];\n\t\t}\n\t\t[self setTemporaryFileDownloadPath:nil];\n\t}\n\treturn (!err);\n}\n\n- (BOOL)removeTemporaryUncompressedDownloadFile\n{\n\tNSError *err = nil;\n\tif ([self temporaryUncompressedDataDownloadPath]) {\n\t\tif (![[self class] removeFileAtPath:[self temporaryUncompressedDataDownloadPath] error:&err]) {\n\t\t\t[self failWithError:err];\n\t\t}\n\t\t[self setTemporaryUncompressedDataDownloadPath:nil];\n\t}\n\treturn (!err);\n}\n\n- (BOOL)removeTemporaryUploadFile\n{\n\tNSError *err = nil;\n\tif ([self postBodyFilePath]) {\n\t\tif (![[self class] removeFileAtPath:[self postBodyFilePath] error:&err]) {\n\t\t\t[self failWithError:err];\n\t\t}\n\t\t[self setPostBodyFilePath:nil];\n\t}\n\treturn (!err);\n}\n\n- (BOOL)removeTemporaryCompressedUploadFile\n{\n\tNSError *err = nil;\n\tif ([self compressedPostBodyFilePath]) {\n\t\tif (![[self class] removeFileAtPath:[self compressedPostBodyFilePath] error:&err]) {\n\t\t\t[self failWithError:err];\n\t\t}\n\t\t[self setCompressedPostBodyFilePath:nil];\n\t}\n\treturn (!err);\n}\n\n+ (BOOL)removeFileAtPath:(NSString *)path error:(NSError **)err\n{\n\tNSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];\n\n\tif ([fileManager fileExistsAtPath:path]) {\n\t\tNSError *removeError = nil;\n\t\t[fileManager removeItemAtPath:path error:&removeError];\n\t\tif (removeError) {\n\t\t\tif (err) {\n\t\t\t\t*err = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASIFileManagementError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@\"Failed to delete file at path '%@'\",path],NSLocalizedDescriptionKey,removeError,NSUnderlyingErrorKey,nil]];\n\t\t\t}\n\t\t\treturn NO;\n\t\t}\n\t}\n\treturn YES;\n}\n\n#pragma mark Proxies\n\n- (BOOL)configureProxies\n{\n\t// Have details of the proxy been set on this request\n\tif (![self isPACFileRequest] && (![self proxyHost] && ![self proxyPort])) {\n\n\t\t// If not, we need to figure out what they'll be\n\t\tNSArray *proxies = nil;\n\n\t\t// Have we been given a proxy auto config file?\n\t\tif ([self PACurl]) {\n\n\t\t\t// If yes, we'll need to fetch the PAC file asynchronously, so we stop this request to wait until we have the proxy details.\n\t\t\t[self fetchPACFile];\n\t\t\treturn NO;\n\n\t\t\t// Detect proxy settings and apply them\n\t\t} else {\n\n#if TARGET_OS_IPHONE\n\t\t\tNSDictionary *proxySettings = [NSMakeCollectable(CFNetworkCopySystemProxySettings()) autorelease];\n#else\n\t\t\tNSDictionary *proxySettings = [NSMakeCollectable(SCDynamicStoreCopyProxies(NULL)) autorelease];\n#endif\n\n\t\t\tproxies = [NSMakeCollectable(CFNetworkCopyProxiesForURL((CFURLRef)[self url], (CFDictionaryRef)proxySettings)) autorelease];\n\n\t\t\t// Now check to see if the proxy settings contained a PAC url, we need to run the script to get the real list of proxies if so\n\t\t\tNSDictionary *settings = [proxies objectAtIndex:0];\n\t\t\tif ([settings objectForKey:(NSString *)kCFProxyAutoConfigurationURLKey]) {\n\t\t\t\t[self setPACurl:[settings objectForKey:(NSString *)kCFProxyAutoConfigurationURLKey]];\n\t\t\t\t[self fetchPACFile];\n\t\t\t\treturn NO;\n\t\t\t}\n\t\t}\n\n\t\tif (!proxies) {\n\t\t\t[self setReadStream:nil];\n\t\t\t[self failWithError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIInternalErrorWhileBuildingRequestType userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@\"Unable to obtain information on proxy servers needed for request\",NSLocalizedDescriptionKey,nil]]];\n\t\t\treturn NO;\n\t\t}\n\t\t// I don't really understand why the dictionary returned by CFNetworkCopyProxiesForURL uses different key names from CFNetworkCopySystemProxySettings/SCDynamicStoreCopyProxies\n\t\t// and why its key names are documented while those we actually need to use don't seem to be (passing the kCF* keys doesn't seem to work)\n\t\tif ([proxies count] > 0) {\n\t\t\tNSDictionary *settings = [proxies objectAtIndex:0];\n\t\t\t[self setProxyHost:[settings objectForKey:(NSString *)kCFProxyHostNameKey]];\n\t\t\t[self setProxyPort:[[settings objectForKey:(NSString *)kCFProxyPortNumberKey] intValue]];\n\t\t\t[self setProxyType:[settings objectForKey:(NSString *)kCFProxyTypeKey]];\n\t\t}\n\t}\n\treturn YES;\n}\n\n\n\n// Attempts to download a PAC (Proxy Auto-Configuration) file\n// PAC files at file://, http:// and https:// addresses are supported\n- (void)fetchPACFile\n{\n\t// For file:// urls, we'll use an async NSInputStream (ASIHTTPRequest does not support file:// urls)\n\tif ([[self PACurl] isFileURL]) {\n\t\tNSInputStream *stream = [[[NSInputStream alloc] initWithFileAtPath:[[self PACurl] path]] autorelease];\n\t\t[self setPACFileReadStream:stream];\n\t\t[stream setDelegate:(id)self];\n\t\t[stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:[self runLoopMode]];\n\t\t[stream open];\n\t\t// If it takes more than timeOutSeconds to read the PAC, we'll just give up and assume no proxies\n\t\t// We won't bother to handle cases where the first part of the PAC is read within timeOutSeconds, but the whole thing takes longer\n\t\t// Either our PAC file is in easy reach, or it's going to slow things down to the point that it's probably better requests fail\n\t\t[self performSelector:@selector(timeOutPACRead) withObject:nil afterDelay:[self timeOutSeconds]];\n\t\treturn;\n\t}\n\n\tNSString *scheme = [[[self PACurl] scheme] lowercaseString];\n\tif (![scheme isEqualToString:@\"http\"] && ![scheme isEqualToString:@\"https\"]) {\n\t\t// Don't know how to read data from this URL, we'll have to give up\n\t\t// We'll simply assume no proxies, and start the request as normal\n\t\t[self startRequest];\n\t\treturn;\n\t}\n\n\t// Create an ASIHTTPRequest to fetch the PAC file\n\tASIHTTPRequest *PACRequest = [ASIHTTPRequest requestWithURL:[self PACurl]];\n\n\t// Will prevent this request attempting to configure proxy settings for itself\n\t[PACRequest setIsPACFileRequest:YES];\n\n\t[PACRequest setTimeOutSeconds:[self timeOutSeconds]];\n\n\t// If we're a synchronous request, we'll download the PAC file synchronously\n\tif ([self isSynchronous]) {\n\t\t[PACRequest startSynchronous];\n\t\tif (![PACRequest error] && [PACRequest responseString]) {\n\t\t\t[self runPACScript:[PACRequest responseString]];\n\t\t}\n\t\t[self startRequest];\n\t\treturn;\n\t}\n\n\t[self setPACFileRequest:PACRequest];\n\n\t// Force this request to run before others in the shared queue\n\t[PACRequest setQueuePriority:NSOperationQueuePriorityHigh];\n\n\t// We'll treat failure to download the PAC file the same as success - if we were unable to fetch a PAC file, we proceed as if we have no proxy server and let this request fail itself if necessary\n\t[PACRequest setDelegate:self];\n\t[PACRequest setDidFinishSelector:@selector(finishedDownloadingPACFile:)];\n\t[PACRequest setDidFailSelector:@selector(finishedDownloadingPACFile:)];\n\t[PACRequest startAsynchronous];\n\n\t// Temporarily increase the number of operations in the shared queue to give our request a chance to run\n\t[connectionsLock lock];\n\t[sharedQueue setMaxConcurrentOperationCount:[sharedQueue maxConcurrentOperationCount]+1];\n\t[connectionsLock unlock];\n}\n\n// Called as we read the PAC file from a file:// url\n- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode\n{\n\tif (![self PACFileReadStream]) {\n\t\treturn;\n\t}\n\tif (eventCode == NSStreamEventHasBytesAvailable) {\n\n\t\tif (![self PACFileData]) {\n\t\t\t[self setPACFileData:[NSMutableData data]];\n\t\t}\n\t\t// If your PAC file is larger than 16KB, you're just being cruel.\n\t\tuint8_t buf[16384];\n\t\tNSInteger len = [(NSInputStream *)stream read:buf maxLength:16384];\n\t\tif (len) {\n\t\t\t[[self PACFileData] appendBytes:(const void *)buf length:len];\n\t\t}\n\n\t} else if (eventCode == NSStreamEventErrorOccurred || eventCode == NSStreamEventEndEncountered) {\n\n\t\t[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeOutPACRead) object:nil];\n\n\t\t[stream close];\n\t\t[stream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:[self runLoopMode]];\n\t\t[self setPACFileReadStream:nil];\n\n\t\tif (eventCode == NSStreamEventEndEncountered) {\n\t\t\t// It sounds as though we have no idea what encoding a PAC file will use\n\t\t\tstatic NSStringEncoding encodingsToTry[2] = {NSUTF8StringEncoding,NSISOLatin1StringEncoding};\n\t\t\tNSUInteger i;\n\t\t\tfor (i=0; i<2; i++) {\n\t\t\t\tNSString *pacScript =  [[[NSString alloc] initWithBytes:[[self PACFileData] bytes] length:[[self PACFileData] length] encoding:encodingsToTry[i]] autorelease];\n\t\t\t\tif (pacScript) {\n\t\t\t\t\t[self runPACScript:pacScript];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t[self setPACFileData:nil];\n\t\t[self startRequest];\n\t}\n}\n\n// Called if it takes longer than timeOutSeconds to read the whole PAC file (when reading from a file:// url)\n- (void)timeOutPACRead\n{\n\t[self stream:[self PACFileReadStream] handleEvent:NSStreamEventErrorOccurred];\n}\n\n// Runs the downloaded PAC script\n- (void)runPACScript:(NSString *)script\n{\n\tif (script) {\n\t\t// From: http://developer.apple.com/samplecode/CFProxySupportTool/listing1.html\n\t\t// Work around <rdar://problem/5530166>.  This dummy call to \n\t\t// CFNetworkCopyProxiesForURL initialise some state within CFNetwork \n\t\t// that is required by CFNetworkCopyProxiesForAutoConfigurationScript.\n\t\tCFRelease(CFNetworkCopyProxiesForURL((CFURLRef)[self url], NULL));\n\n\t\t// Obtain the list of proxies by running the autoconfiguration script\n\t\tCFErrorRef err = NULL;\n\t\tNSArray *proxies = [NSMakeCollectable(CFNetworkCopyProxiesForAutoConfigurationScript((CFStringRef)script,(CFURLRef)[self url], &err)) autorelease];\n\t\tif (!err && [proxies count] > 0) {\n\t\t\tNSDictionary *settings = [proxies objectAtIndex:0];\n\t\t\t[self setProxyHost:[settings objectForKey:(NSString *)kCFProxyHostNameKey]];\n\t\t\t[self setProxyPort:[[settings objectForKey:(NSString *)kCFProxyPortNumberKey] intValue]];\n\t\t\t[self setProxyType:[settings objectForKey:(NSString *)kCFProxyTypeKey]];\n\t\t}\n\t}\n}\n\n// Called if we successfully downloaded a PAC file from a webserver\n- (void)finishedDownloadingPACFile:(ASIHTTPRequest *)theRequest\n{\n\tif (![theRequest error] && [theRequest responseString]) {\n\t\t[self runPACScript:[theRequest responseString]];\n\t}\n\n\t// Set the shared queue's maxConcurrentOperationCount back to normal\n\t[connectionsLock lock];\n\t[sharedQueue setMaxConcurrentOperationCount:[sharedQueue maxConcurrentOperationCount]-1];\n\t[connectionsLock unlock];\n\n\t// We no longer need our PAC file request\n\t[self setPACFileRequest:nil];\n\n\t// Start the request\n\t[self startRequest];\n}\n\n\n#pragma mark persistent connections\n\n- (NSNumber *)connectionID\n{\n\treturn [[self connectionInfo] objectForKey:@\"id\"];\n}\n\n+ (void)expirePersistentConnections\n{\n\t[connectionsLock lock];\n\tNSUInteger i;\n\tfor (i=0; i<[persistentConnectionsPool count]; i++) {\n\t\tNSDictionary *existingConnection = [persistentConnectionsPool objectAtIndex:i];\n\t\tif (![existingConnection objectForKey:@\"request\"] && [[existingConnection objectForKey:@\"expires\"] timeIntervalSinceNow] <= 0) {\n#if DEBUG_PERSISTENT_CONNECTIONS\n\t\t\tASI_DEBUG_LOG(@\"[CONNECTION] Closing connection #%i because it has expired\",[[existingConnection objectForKey:@\"id\"] intValue]);\n#endif\n\t\t\tNSInputStream *stream = [existingConnection objectForKey:@\"stream\"];\n\t\t\tif (stream) {\n\t\t\t\t[stream close];\n\t\t\t}\n\t\t\t[persistentConnectionsPool removeObject:existingConnection];\n\t\t\ti--;\n\t\t}\n\t}\t\n\t[connectionsLock unlock];\n}\n\n#pragma mark NSCopying\n- (id)copyWithZone:(NSZone *)zone\n{\n\t// Don't forget - this will return a retained copy!\n\tASIHTTPRequest *newRequest = [[[self class] alloc] initWithURL:[self url]];\n\t[newRequest setDelegate:[self delegate]];\n\t[newRequest setRequestMethod:[self requestMethod]];\n\t[newRequest setPostBody:[self postBody]];\n\t[newRequest setShouldStreamPostDataFromDisk:[self shouldStreamPostDataFromDisk]];\n\t[newRequest setPostBodyFilePath:[self postBodyFilePath]];\n\t[newRequest setRequestHeaders:[[[self requestHeaders] mutableCopyWithZone:zone] autorelease]];\n\t[newRequest setRequestCookies:[[[self requestCookies] mutableCopyWithZone:zone] autorelease]];\n\t[newRequest setUseCookiePersistence:[self useCookiePersistence]];\n\t[newRequest setUseKeychainPersistence:[self useKeychainPersistence]];\n\t[newRequest setUseSessionPersistence:[self useSessionPersistence]];\n\t[newRequest setAllowCompressedResponse:[self allowCompressedResponse]];\n\t[newRequest setDownloadDestinationPath:[self downloadDestinationPath]];\n\t[newRequest setTemporaryFileDownloadPath:[self temporaryFileDownloadPath]];\n\t[newRequest setUsername:[self username]];\n\t[newRequest setPassword:[self password]];\n\t[newRequest setDomain:[self domain]];\n\t[newRequest setProxyUsername:[self proxyUsername]];\n\t[newRequest setProxyPassword:[self proxyPassword]];\n\t[newRequest setProxyDomain:[self proxyDomain]];\n\t[newRequest setProxyHost:[self proxyHost]];\n\t[newRequest setProxyPort:[self proxyPort]];\n\t[newRequest setProxyType:[self proxyType]];\n\t[newRequest setUploadProgressDelegate:[self uploadProgressDelegate]];\n\t[newRequest setDownloadProgressDelegate:[self downloadProgressDelegate]];\n\t[newRequest setShouldPresentAuthenticationDialog:[self shouldPresentAuthenticationDialog]];\n\t[newRequest setShouldPresentProxyAuthenticationDialog:[self shouldPresentProxyAuthenticationDialog]];\n\t[newRequest setPostLength:[self postLength]];\n\t[newRequest setHaveBuiltPostBody:[self haveBuiltPostBody]];\n\t[newRequest setDidStartSelector:[self didStartSelector]];\n\t[newRequest setDidFinishSelector:[self didFinishSelector]];\n\t[newRequest setDidFailSelector:[self didFailSelector]];\n\t[newRequest setTimeOutSeconds:[self timeOutSeconds]];\n\t[newRequest setShouldResetDownloadProgress:[self shouldResetDownloadProgress]];\n\t[newRequest setShouldResetUploadProgress:[self shouldResetUploadProgress]];\n\t[newRequest setShowAccurateProgress:[self showAccurateProgress]];\n\t[newRequest setDefaultResponseEncoding:[self defaultResponseEncoding]];\n\t[newRequest setAllowResumeForFileDownloads:[self allowResumeForFileDownloads]];\n\t[newRequest setUserInfo:[[[self userInfo] copyWithZone:zone] autorelease]];\n\t[newRequest setTag:[self tag]];\n\t[newRequest setUseHTTPVersionOne:[self useHTTPVersionOne]];\n\t[newRequest setShouldRedirect:[self shouldRedirect]];\n\t[newRequest setValidatesSecureCertificate:[self validatesSecureCertificate]];\n    [newRequest setClientCertificateIdentity:clientCertificateIdentity];\n\t[newRequest setClientCertificates:[[clientCertificates copy] autorelease]];\n\t[newRequest setPACurl:[self PACurl]];\n\t[newRequest setShouldPresentCredentialsBeforeChallenge:[self shouldPresentCredentialsBeforeChallenge]];\n\t[newRequest setNumberOfTimesToRetryOnTimeout:[self numberOfTimesToRetryOnTimeout]];\n\t[newRequest setShouldUseRFC2616RedirectBehaviour:[self shouldUseRFC2616RedirectBehaviour]];\n\t[newRequest setShouldAttemptPersistentConnection:[self shouldAttemptPersistentConnection]];\n\t[newRequest setPersistentConnectionTimeoutSeconds:[self persistentConnectionTimeoutSeconds]];\n    [newRequest setAuthenticationScheme:[self authenticationScheme]];\n\treturn newRequest;\n}\n\n#pragma mark default time out\n\n+ (NSTimeInterval)defaultTimeOutSeconds\n{\n\treturn defaultTimeOutSeconds;\n}\n\n+ (void)setDefaultTimeOutSeconds:(NSTimeInterval)newTimeOutSeconds\n{\n\tdefaultTimeOutSeconds = newTimeOutSeconds;\n}\n\n\n#pragma mark client certificate\n\n- (void)setClientCertificateIdentity:(SecIdentityRef)anIdentity {\n    if(clientCertificateIdentity) {\n        CFRelease(clientCertificateIdentity);\n    }\n    \n    clientCertificateIdentity = anIdentity;\n    \n\tif (clientCertificateIdentity) {\n\t\tCFRetain(clientCertificateIdentity);\n\t}\n}\n\n\n#pragma mark session credentials\n\n+ (NSMutableArray *)sessionProxyCredentialsStore\n{\n\t[sessionCredentialsLock lock];\n\tif (!sessionProxyCredentialsStore) {\n\t\tsessionProxyCredentialsStore = [[NSMutableArray alloc] init];\n\t}\n\t[sessionCredentialsLock unlock];\n\treturn sessionProxyCredentialsStore;\n}\n\n+ (NSMutableArray *)sessionCredentialsStore\n{\n\t[sessionCredentialsLock lock];\n\tif (!sessionCredentialsStore) {\n\t\tsessionCredentialsStore = [[NSMutableArray alloc] init];\n\t}\n\t[sessionCredentialsLock unlock];\n\treturn sessionCredentialsStore;\n}\n\n+ (void)storeProxyAuthenticationCredentialsInSessionStore:(NSDictionary *)credentials\n{\n\t[sessionCredentialsLock lock];\n\t[self removeProxyAuthenticationCredentialsFromSessionStore:[credentials objectForKey:@\"Credentials\"]];\n\t[[[self class] sessionProxyCredentialsStore] addObject:credentials];\n\t[sessionCredentialsLock unlock];\n}\n\n+ (void)storeAuthenticationCredentialsInSessionStore:(NSDictionary *)credentials\n{\n\t[sessionCredentialsLock lock];\n\t[self removeAuthenticationCredentialsFromSessionStore:[credentials objectForKey:@\"Credentials\"]];\n\t[[[self class] sessionCredentialsStore] addObject:credentials];\n\t[sessionCredentialsLock unlock];\n}\n\n+ (void)removeProxyAuthenticationCredentialsFromSessionStore:(NSDictionary *)credentials\n{\n\t[sessionCredentialsLock lock];\n\tNSMutableArray *sessionCredentialsList = [[self class] sessionProxyCredentialsStore];\n\tNSUInteger i;\n\tfor (i=0; i<[sessionCredentialsList count]; i++) {\n\t\tNSDictionary *theCredentials = [sessionCredentialsList objectAtIndex:i];\n\t\tif ([theCredentials objectForKey:@\"Credentials\"] == credentials) {\n\t\t\t[sessionCredentialsList removeObjectAtIndex:i];\n\t\t\t[sessionCredentialsLock unlock];\n\t\t\treturn;\n\t\t}\n\t}\n\t[sessionCredentialsLock unlock];\n}\n\n+ (void)removeAuthenticationCredentialsFromSessionStore:(NSDictionary *)credentials\n{\n\t[sessionCredentialsLock lock];\n\tNSMutableArray *sessionCredentialsList = [[self class] sessionCredentialsStore];\n\tNSUInteger i;\n\tfor (i=0; i<[sessionCredentialsList count]; i++) {\n\t\tNSDictionary *theCredentials = [sessionCredentialsList objectAtIndex:i];\n\t\tif ([theCredentials objectForKey:@\"Credentials\"] == credentials) {\n\t\t\t[sessionCredentialsList removeObjectAtIndex:i];\n\t\t\t[sessionCredentialsLock unlock];\n\t\t\treturn;\n\t\t}\n\t}\n\t[sessionCredentialsLock unlock];\n}\n\n- (NSDictionary *)findSessionProxyAuthenticationCredentials\n{\n\t[sessionCredentialsLock lock];\n\tNSMutableArray *sessionCredentialsList = [[self class] sessionProxyCredentialsStore];\n\tfor (NSDictionary *theCredentials in sessionCredentialsList) {\n\t\tif ([[theCredentials objectForKey:@\"Host\"] isEqualToString:[self proxyHost]] && [[theCredentials objectForKey:@\"Port\"] intValue] == [self proxyPort]) {\n\t\t\t[sessionCredentialsLock unlock];\n\t\t\treturn theCredentials;\n\t\t}\n\t}\n\t[sessionCredentialsLock unlock];\n\treturn nil;\n}\n\n\n- (NSDictionary *)findSessionAuthenticationCredentials\n{\n\t[sessionCredentialsLock lock];\n\tNSMutableArray *sessionCredentialsList = [[self class] sessionCredentialsStore];\n\tNSURL *requestURL = [self url];\n\n\tBOOL haveFoundExactMatch;\n\tNSDictionary *closeMatch = nil;\n\n\t// Loop through all the cached credentials we have, looking for the best match for this request\n\tfor (NSDictionary *theCredentials in sessionCredentialsList) {\n\t\t\n\t\thaveFoundExactMatch = NO;\n\t\tNSURL *cachedCredentialsURL = [theCredentials objectForKey:@\"URL\"];\n\n\t\t// Find an exact match (same url)\n\t\tif ([cachedCredentialsURL isEqual:[self url]]) {\n\t\t\thaveFoundExactMatch = YES;\n\n\t\t// This is not an exact match for the url, and we already have a close match we can use\n\t\t} else if (closeMatch) {\n\t\t\tcontinue;\n\n\t\t// Find a close match (same host, scheme and port)\n\t\t} else if ([[cachedCredentialsURL host] isEqualToString:[requestURL host]] && ([cachedCredentialsURL port] == [requestURL port] || ([requestURL port] && [[cachedCredentialsURL port] isEqualToNumber:[requestURL port]])) && [[cachedCredentialsURL scheme] isEqualToString:[requestURL scheme]]) {\n\t\t} else {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Just a sanity check to ensure we never choose credentials from a different realm. Can't really do more than that, as either this request or the stored credentials may not have a realm when the other does\n\t\tif ([self authenticationRealm] && ([theCredentials objectForKey:@\"AuthenticationRealm\"] && ![[theCredentials objectForKey:@\"AuthenticationRealm\"] isEqualToString:[self authenticationRealm]])) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If we have a username and password set on the request, check that they are the same as the cached ones\n\t\tif ([self username] && [self password]) {\n\t\t\tNSDictionary *usernameAndPassword = [theCredentials objectForKey:@\"Credentials\"];\n\t\t\tNSString *storedUsername = [usernameAndPassword objectForKey:(NSString *)kCFHTTPAuthenticationUsername];\n\t\t\tNSString *storedPassword = [usernameAndPassword objectForKey:(NSString *)kCFHTTPAuthenticationPassword];\n\t\t\tif (![storedUsername isEqualToString:[self username]] || ![storedPassword isEqualToString:[self password]]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// If we have an exact match for the url, use those credentials\n\t\tif (haveFoundExactMatch) {\n\t\t\t[sessionCredentialsLock unlock];\n\t\t\treturn theCredentials;\n\t\t}\n\n\t\t// We have no exact match, let's remember that we have a good match for this server, and we'll use it at the end if we don't find an exact match\n\t\tcloseMatch = theCredentials;\n\t}\n\t[sessionCredentialsLock unlock];\n\n\t// Return credentials that matched on host, port and scheme, or nil if we didn't find any\n\treturn closeMatch;\n}\n\n#pragma mark keychain storage\n\n+ (void)saveCredentials:(NSURLCredential *)credentials forHost:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm\n{\n\tNSURLProtectionSpace *protectionSpace = [[[NSURLProtectionSpace alloc] initWithHost:host port:port protocol:protocol realm:realm authenticationMethod:NSURLAuthenticationMethodDefault] autorelease];\n\t[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credentials forProtectionSpace:protectionSpace];\n}\n\n+ (void)saveCredentials:(NSURLCredential *)credentials forProxy:(NSString *)host port:(int)port realm:(NSString *)realm\n{\n\tNSURLProtectionSpace *protectionSpace = [[[NSURLProtectionSpace alloc] initWithProxyHost:host port:port type:NSURLProtectionSpaceHTTPProxy realm:realm authenticationMethod:NSURLAuthenticationMethodDefault] autorelease];\n\t[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credentials forProtectionSpace:protectionSpace];\n}\n\n+ (NSURLCredential *)savedCredentialsForHost:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm\n{\n\tNSURLProtectionSpace *protectionSpace = [[[NSURLProtectionSpace alloc] initWithHost:host port:port protocol:protocol realm:realm authenticationMethod:NSURLAuthenticationMethodDefault] autorelease];\n\treturn [[NSURLCredentialStorage sharedCredentialStorage] defaultCredentialForProtectionSpace:protectionSpace];\n}\n\n+ (NSURLCredential *)savedCredentialsForProxy:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm\n{\n\tNSURLProtectionSpace *protectionSpace = [[[NSURLProtectionSpace alloc] initWithProxyHost:host port:port type:NSURLProtectionSpaceHTTPProxy realm:realm authenticationMethod:NSURLAuthenticationMethodDefault] autorelease];\n\treturn [[NSURLCredentialStorage sharedCredentialStorage] defaultCredentialForProtectionSpace:protectionSpace];\n}\n\n+ (void)removeCredentialsForHost:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm\n{\n\tNSURLProtectionSpace *protectionSpace = [[[NSURLProtectionSpace alloc] initWithHost:host port:port protocol:protocol realm:realm authenticationMethod:NSURLAuthenticationMethodDefault] autorelease];\n\tNSURLCredential *credential = [[NSURLCredentialStorage sharedCredentialStorage] defaultCredentialForProtectionSpace:protectionSpace];\n\tif (credential) {\n\t\t[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:credential forProtectionSpace:protectionSpace];\n\t}\n}\n\n+ (void)removeCredentialsForProxy:(NSString *)host port:(int)port realm:(NSString *)realm\n{\n\tNSURLProtectionSpace *protectionSpace = [[[NSURLProtectionSpace alloc] initWithProxyHost:host port:port type:NSURLProtectionSpaceHTTPProxy realm:realm authenticationMethod:NSURLAuthenticationMethodDefault] autorelease];\n\tNSURLCredential *credential = [[NSURLCredentialStorage sharedCredentialStorage] defaultCredentialForProtectionSpace:protectionSpace];\n\tif (credential) {\n\t\t[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:credential forProtectionSpace:protectionSpace];\n\t}\n}\n\n+ (NSMutableArray *)sessionCookies\n{\n\t[sessionCookiesLock lock];\n\tif (!sessionCookies) {\n\t\t[ASIHTTPRequest setSessionCookies:[NSMutableArray array]];\n\t}\n\tNSMutableArray *cookies = [[sessionCookies retain] autorelease];\n\t[sessionCookiesLock unlock];\n\treturn cookies;\n}\n\n+ (void)setSessionCookies:(NSMutableArray *)newSessionCookies\n{\n\t[sessionCookiesLock lock];\n\t// Remove existing cookies from the persistent store\n\tfor (NSHTTPCookie *cookie in sessionCookies) {\n\t\t[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];\n\t}\n\t[sessionCookies release];\n\tsessionCookies = [newSessionCookies retain];\n\t[sessionCookiesLock unlock];\n}\n\n+ (void)addSessionCookie:(NSHTTPCookie *)newCookie\n{\n\t[sessionCookiesLock lock];\n\tNSHTTPCookie *cookie;\n\tNSUInteger i;\n\tNSUInteger max = [[ASIHTTPRequest sessionCookies] count];\n\tfor (i=0; i<max; i++) {\n\t\tcookie = [[ASIHTTPRequest sessionCookies] objectAtIndex:i];\n\t\tif ([[cookie domain] isEqualToString:[newCookie domain]] && [[cookie path] isEqualToString:[newCookie path]] && [[cookie name] isEqualToString:[newCookie name]]) {\n\t\t\t[[ASIHTTPRequest sessionCookies] removeObjectAtIndex:i];\n\t\t\tbreak;\n\t\t}\n\t}\n\t[[ASIHTTPRequest sessionCookies] addObject:newCookie];\n\t[sessionCookiesLock unlock];\n}\n\n// Dump all session data (authentication and cookies)\n+ (void)clearSession\n{\n\t[sessionCredentialsLock lock];\n\t[[[self class] sessionCredentialsStore] removeAllObjects];\n\t[sessionCredentialsLock unlock];\n\t[[self class] setSessionCookies:nil];\n\t[[[self class] defaultCache] clearCachedResponsesForStoragePolicy:ASICacheForSessionDurationCacheStoragePolicy];\n}\n\n#pragma mark get user agent\n\n+ (NSString *)defaultUserAgentString\n{\n\t@synchronized (self) {\n\n\t\tif (!defaultUserAgent) {\n\n\t\t\tNSBundle *bundle = [NSBundle bundleForClass:[self class]];\n\n\t\t\t// Attempt to find a name for this application\n\t\t\tNSString *appName = [bundle objectForInfoDictionaryKey:@\"CFBundleDisplayName\"];\n\t\t\tif (!appName) {\n\t\t\t\tappName = [bundle objectForInfoDictionaryKey:@\"CFBundleName\"];\n\t\t\t}\n\n\t\t\tNSData *latin1Data = [appName dataUsingEncoding:NSUTF8StringEncoding];\n\t\t\tappName = [[[NSString alloc] initWithData:latin1Data encoding:NSISOLatin1StringEncoding] autorelease];\n\n\t\t\t// If we couldn't find one, we'll give up (and ASIHTTPRequest will use the standard CFNetwork user agent)\n\t\t\tif (!appName) {\n\t\t\t\treturn nil;\n\t\t\t}\n\n\t\t\tNSString *appVersion = nil;\n\t\t\tNSString *marketingVersionNumber = [bundle objectForInfoDictionaryKey:@\"CFBundleShortVersionString\"];\n\t\t\tNSString *developmentVersionNumber = [bundle objectForInfoDictionaryKey:@\"CFBundleVersion\"];\n\t\t\tif (marketingVersionNumber && developmentVersionNumber) {\n\t\t\t\tif ([marketingVersionNumber isEqualToString:developmentVersionNumber]) {\n\t\t\t\t\tappVersion = marketingVersionNumber;\n\t\t\t\t} else {\n\t\t\t\t\tappVersion = [NSString stringWithFormat:@\"%@ rv:%@\",marketingVersionNumber,developmentVersionNumber];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tappVersion = (marketingVersionNumber ? marketingVersionNumber : developmentVersionNumber);\n\t\t\t}\n\n\t\t\tNSString *deviceName;\n\t\t\tNSString *OSName;\n\t\t\tNSString *OSVersion;\n\t\t\tNSString *locale = [[NSLocale currentLocale] localeIdentifier];\n\n\t\t\t#if TARGET_OS_IPHONE\n\t\t\t\tUIDevice *device = [UIDevice currentDevice];\n\t\t\t\tdeviceName = [device model];\n\t\t\t\tOSName = [device systemName];\n\t\t\t\tOSVersion = [device systemVersion];\n\n\t\t\t#else\n\t\t\t\tdeviceName = @\"Macintosh\";\n\t\t\t\tOSName = @\"Mac OS X\";\n\n\t\t\t\t// From http://www.cocoadev.com/index.pl?DeterminingOSVersion\n\t\t\t\t// We won't bother to check for systems prior to 10.4, since ASIHTTPRequest only works on 10.5+\n\t\t\t\tOSErr err;\n\t\t\t\tSInt32 versionMajor, versionMinor, versionBugFix;\n\t\t\t\terr = Gestalt(gestaltSystemVersionMajor, &versionMajor);\n\t\t\t\tif (err != noErr) return nil;\n\t\t\t\terr = Gestalt(gestaltSystemVersionMinor, &versionMinor);\n\t\t\t\tif (err != noErr) return nil;\n\t\t\t\terr = Gestalt(gestaltSystemVersionBugFix, &versionBugFix);\n\t\t\t\tif (err != noErr) return nil;\n\t\t\t\tOSVersion = [NSString stringWithFormat:@\"%u.%u.%u\", versionMajor, versionMinor, versionBugFix];\n\t\t\t#endif\n\n\t\t\t// Takes the form \"My Application 1.0 (Macintosh; Mac OS X 10.5.7; en_GB)\"\n\t\t\t[self setDefaultUserAgentString:[NSString stringWithFormat:@\"%@ %@ (%@; %@ %@; %@)\", appName, appVersion, deviceName, OSName, OSVersion, locale]];\t\n\t\t}\n\t\treturn [[defaultUserAgent retain] autorelease];\n\t}\n\treturn nil;\n}\n\n+ (void)setDefaultUserAgentString:(NSString *)agent\n{\n\t@synchronized (self) {\n\t\tif (defaultUserAgent == agent) {\n\t\t\treturn;\n\t\t}\n\t\t[defaultUserAgent release];\n\t\tdefaultUserAgent = [agent copy];\n\t}\n}\n\n\n#pragma mark mime-type detection\n\n+ (NSString *)mimeTypeForFileAtPath:(NSString *)path\n{\n\tif (![[[[NSFileManager alloc] init] autorelease] fileExistsAtPath:path]) {\n\t\treturn nil;\n\t}\n\t// Borrowed from http://stackoverflow.com/questions/2439020/wheres-the-iphone-mime-type-database\n\tCFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (CFStringRef)[path pathExtension], NULL);\n    CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);\n    CFRelease(UTI);\n\tif (!MIMEType) {\n\t\treturn @\"application/octet-stream\";\n\t}\n    return [NSMakeCollectable(MIMEType) autorelease];\n}\n\n#pragma mark bandwidth measurement / throttling\n\n- (void)performThrottling\n{\n\tif (![self readStream]) {\n\t\treturn;\n\t}\n\t[ASIHTTPRequest measureBandwidthUsage];\n\tif ([ASIHTTPRequest isBandwidthThrottled]) {\n\t\t[bandwidthThrottlingLock lock];\n\t\t// Handle throttling\n\t\tif (throttleWakeUpTime) {\n\t\t\tif ([throttleWakeUpTime timeIntervalSinceDate:[NSDate date]] > 0) {\n\t\t\t\tif ([self readStreamIsScheduled]) {\n\t\t\t\t\t[self unscheduleReadStream];\n\t\t\t\t\t#if DEBUG_THROTTLING\n\t\t\t\t\tASI_DEBUG_LOG(@\"[THROTTLING] Sleeping request %@ until after %@\",self,throttleWakeUpTime);\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (![self readStreamIsScheduled]) {\n\t\t\t\t\t[self scheduleReadStream];\n\t\t\t\t\t#if DEBUG_THROTTLING\n\t\t\t\t\tASI_DEBUG_LOG(@\"[THROTTLING] Waking up request %@\",self);\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t}\n\t\t} \n\t\t[bandwidthThrottlingLock unlock];\n\t\t\n\t// Bandwidth throttling must have been turned off since we last looked, let's re-schedule the stream\n\t} else if (![self readStreamIsScheduled]) {\n\t\t[self scheduleReadStream];\t\t\t\n\t}\n}\n\n+ (BOOL)isBandwidthThrottled\n{\n#if TARGET_OS_IPHONE\n\t[bandwidthThrottlingLock lock];\n\n\tBOOL throttle = isBandwidthThrottled || (!shouldThrottleBandwidthForWWANOnly && (maxBandwidthPerSecond > 0));\n\t[bandwidthThrottlingLock unlock];\n\treturn throttle;\n#else\n\t[bandwidthThrottlingLock lock];\n\tBOOL throttle = (maxBandwidthPerSecond > 0);\n\t[bandwidthThrottlingLock unlock];\n\treturn throttle;\n#endif\n}\n\n+ (unsigned long)maxBandwidthPerSecond\n{\n\t[bandwidthThrottlingLock lock];\n\tunsigned long amount = maxBandwidthPerSecond;\n\t[bandwidthThrottlingLock unlock];\n\treturn amount;\n}\n\n+ (void)setMaxBandwidthPerSecond:(unsigned long)bytes\n{\n\t[bandwidthThrottlingLock lock];\n\tmaxBandwidthPerSecond = bytes;\n\t[bandwidthThrottlingLock unlock];\n}\n\n+ (void)incrementBandwidthUsedInLastSecond:(unsigned long)bytes\n{\n\t[bandwidthThrottlingLock lock];\n\tbandwidthUsedInLastSecond += bytes;\n\t[bandwidthThrottlingLock unlock];\n}\n\n+ (void)recordBandwidthUsage\n{\n\tif (bandwidthUsedInLastSecond == 0) {\n\t\t[bandwidthUsageTracker removeAllObjects];\n\t} else {\n\t\tNSTimeInterval interval = [bandwidthMeasurementDate timeIntervalSinceNow];\n\t\twhile ((interval < 0 || [bandwidthUsageTracker count] > 5) && [bandwidthUsageTracker count] > 0) {\n\t\t\t[bandwidthUsageTracker removeObjectAtIndex:0];\n\t\t\tinterval++;\n\t\t}\n\t}\n\t#if DEBUG_THROTTLING\n\tASI_DEBUG_LOG(@\"[THROTTLING] ===Used: %u bytes of bandwidth in last measurement period===\",bandwidthUsedInLastSecond);\n\t#endif\n\t[bandwidthUsageTracker addObject:[NSNumber numberWithUnsignedLong:bandwidthUsedInLastSecond]];\n\t[bandwidthMeasurementDate release];\n\tbandwidthMeasurementDate = [[NSDate dateWithTimeIntervalSinceNow:1] retain];\n\tbandwidthUsedInLastSecond = 0;\n\t\n\tNSUInteger measurements = [bandwidthUsageTracker count];\n\tunsigned long totalBytes = 0;\n\tfor (NSNumber *bytes in bandwidthUsageTracker) {\n\t\ttotalBytes += [bytes unsignedLongValue];\n\t}\n\taverageBandwidthUsedPerSecond = totalBytes/measurements;\t\t\n}\n\n+ (unsigned long)averageBandwidthUsedPerSecond\n{\n\t[bandwidthThrottlingLock lock];\n\tunsigned long amount = \taverageBandwidthUsedPerSecond;\n\t[bandwidthThrottlingLock unlock];\n\treturn amount;\n}\n\n+ (void)measureBandwidthUsage\n{\n\t// Other requests may have to wait for this lock if we're sleeping, but this is fine, since in that case we already know they shouldn't be sending or receiving data\n\t[bandwidthThrottlingLock lock];\n\n\tif (!bandwidthMeasurementDate || [bandwidthMeasurementDate timeIntervalSinceNow] < -0) {\n\t\t[ASIHTTPRequest recordBandwidthUsage];\n\t}\n\t\n\t// Are we performing bandwidth throttling?\n\tif (\n\t#if TARGET_OS_IPHONE\n\tisBandwidthThrottled || (!shouldThrottleBandwidthForWWANOnly && (maxBandwidthPerSecond))\n\t#else\n\tmaxBandwidthPerSecond\n\t#endif\n\t) {\n\t\t// How much data can we still send or receive this second?\n\t\tlong long bytesRemaining = (long long)maxBandwidthPerSecond - (long long)bandwidthUsedInLastSecond;\n\t\t\t\n\t\t// Have we used up our allowance?\n\t\tif (bytesRemaining < 0) {\n\t\t\t\n\t\t\t// Yes, put this request to sleep until a second is up, with extra added punishment sleeping time for being very naughty (we have used more bandwidth than we were allowed)\n\t\t\tdouble extraSleepyTime = (-bytesRemaining/(maxBandwidthPerSecond*1.0));\n\t\t\t[throttleWakeUpTime release];\n\t\t\tthrottleWakeUpTime = [[NSDate alloc] initWithTimeInterval:extraSleepyTime sinceDate:bandwidthMeasurementDate];\n\t\t}\n\t}\n\t[bandwidthThrottlingLock unlock];\n}\n\t\n+ (unsigned long)maxUploadReadLength\n{\n\t[bandwidthThrottlingLock lock];\n\t\n\t// We'll split our bandwidth allowance into 4 (which is the default for an ASINetworkQueue's max concurrent operations count) to give all running requests a fighting chance of reading data this cycle\n\tlong long toRead = maxBandwidthPerSecond/4;\n\tif (maxBandwidthPerSecond > 0 && (bandwidthUsedInLastSecond + toRead > maxBandwidthPerSecond)) {\n\t\ttoRead = (long long)maxBandwidthPerSecond-(long long)bandwidthUsedInLastSecond;\n\t\tif (toRead < 0) {\n\t\t\ttoRead = 0;\n\t\t}\n\t}\n\t\n\tif (toRead == 0 || !bandwidthMeasurementDate || [bandwidthMeasurementDate timeIntervalSinceNow] < -0) {\n\t\t[throttleWakeUpTime release];\n\t\tthrottleWakeUpTime = [bandwidthMeasurementDate retain];\n\t}\n\t[bandwidthThrottlingLock unlock];\t\n\treturn (unsigned long)toRead;\n}\n\t\n\n#if TARGET_OS_IPHONE\n+ (void)setShouldThrottleBandwidthForWWAN:(BOOL)throttle\n{\n\tif (throttle) {\n\t\t[ASIHTTPRequest throttleBandwidthForWWANUsingLimit:ASIWWANBandwidthThrottleAmount];\n\t} else {\n\t\t[ASIHTTPRequest unsubscribeFromNetworkReachabilityNotifications];\n\t\t[ASIHTTPRequest setMaxBandwidthPerSecond:0];\n\t\t[bandwidthThrottlingLock lock];\n\t\tisBandwidthThrottled = NO;\n\t\tshouldThrottleBandwidthForWWANOnly = NO;\n\t\t[bandwidthThrottlingLock unlock];\n\t}\n}\n\n+ (void)throttleBandwidthForWWANUsingLimit:(unsigned long)limit\n{\t\n\t[bandwidthThrottlingLock lock];\n\tshouldThrottleBandwidthForWWANOnly = YES;\n\tmaxBandwidthPerSecond = limit;\n\t[ASIHTTPRequest registerForNetworkReachabilityNotifications];\t\n\t[bandwidthThrottlingLock unlock];\n\t[ASIHTTPRequest reachabilityChanged:nil];\n}\n\n#pragma mark reachability\n\n+ (void)registerForNetworkReachabilityNotifications\n{\n\t[[Reachability reachabilityForInternetConnection] startNotifier];\n\t[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];\n}\n\n\n+ (void)unsubscribeFromNetworkReachabilityNotifications\n{\n\t[[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];\n}\n\n+ (BOOL)isNetworkReachableViaWWAN\n{\n\treturn ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] == ReachableViaWWAN);\t\n}\n\n+ (void)reachabilityChanged:(NSNotification *)note\n{\n\t[bandwidthThrottlingLock lock];\n\tisBandwidthThrottled = [ASIHTTPRequest isNetworkReachableViaWWAN];\n\t[bandwidthThrottlingLock unlock];\n}\n#endif\n\n#pragma mark queue\n\n// Returns the shared queue\n+ (NSOperationQueue *)sharedQueue\n{\n    return [[sharedQueue retain] autorelease];\n}\n\n#pragma mark cache\n\n+ (void)setDefaultCache:(id <ASICacheDelegate>)cache\n{\n\t@synchronized (self) {\n\t\t[cache retain];\n\t\t[defaultCache release];\n\t\tdefaultCache = cache;\n\t}\n}\n\n+ (id <ASICacheDelegate>)defaultCache\n{\n    @synchronized(self) {\n        return [[defaultCache retain] autorelease];\n    }\n\treturn nil;\n}\n\n\n#pragma mark network activity\n\n+ (BOOL)isNetworkInUse\n{\n\t[connectionsLock lock];\n\tBOOL inUse = (runningRequestCount > 0);\n\t[connectionsLock unlock];\n\treturn inUse;\n}\n\n+ (void)setShouldUpdateNetworkActivityIndicator:(BOOL)shouldUpdate\n{\n\t[connectionsLock lock];\n\tshouldUpdateNetworkActivityIndicator = shouldUpdate;\n\t[connectionsLock unlock];\n}\n\n+ (void)showNetworkActivityIndicator\n{\n#if TARGET_OS_IPHONE\n\t[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];\n#endif\n}\n\n+ (void)hideNetworkActivityIndicator\n{\n#if TARGET_OS_IPHONE\n\t[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];\t\n#endif\n}\n\n\n/* Always called on main thread */\n+ (void)hideNetworkActivityIndicatorAfterDelay\n{\n\t[self performSelector:@selector(hideNetworkActivityIndicatorIfNeeeded) withObject:nil afterDelay:0.5];\n}\n\n+ (void)hideNetworkActivityIndicatorIfNeeeded\n{\n\t[connectionsLock lock];\n\tif (runningRequestCount == 0) {\n\t\t[self hideNetworkActivityIndicator];\n\t}\n\t[connectionsLock unlock];\n}\n\n\n#pragma mark threading behaviour\n\n// In the default implementation, all requests run in a single background thread\n// Advanced users only: Override this method in a subclass for a different threading behaviour\n// Eg: return [NSThread mainThread] to run all requests in the main thread\n// Alternatively, you can create a thread on demand, or manage a pool of threads\n// Threads returned by this method will need to run the runloop in default mode (eg CFRunLoopRun())\n// Requests will stop the runloop when they complete\n// If you have multiple requests sharing the thread or you want to re-use the thread, you'll need to restart the runloop\n+ (NSThread *)threadForRequest:(ASIHTTPRequest *)request\n{\n\tif (networkThread == nil) {\n\t\t@synchronized(self) {\n\t\t\tif (networkThread == nil) {\n\t\t\t\tnetworkThread = [[NSThread alloc] initWithTarget:self selector:@selector(runRequests) object:nil];\n\t\t\t\t[networkThread start];\n\t\t\t}\n\t\t}\n\t}\n\treturn networkThread;\n}\n\n+ (void)runRequests\n{\n\t// Should keep the runloop from exiting\n\tCFRunLoopSourceContext context = {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};\n\tCFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);\n\tCFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);\n\n    BOOL runAlways = YES; // Introduced to cheat Static Analyzer\n\twhile (runAlways) {\n\t\tNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n        CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, true);\n\t\t[pool drain];\n\t}\n\n\t// Should never be called, but anyway\n\tCFRunLoopRemoveSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);\n\tCFRelease(source);\n}\n\n#pragma mark miscellany \n\n#if TARGET_OS_IPHONE\n+ (BOOL)isMultitaskingSupported\n{\n\tBOOL multiTaskingSupported = NO;\n\tif ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) {\n\t\tmultiTaskingSupported = [(id)[UIDevice currentDevice] isMultitaskingSupported];\n\t}\n\treturn multiTaskingSupported;\n}\n#endif\n\n// From: http://www.cocoadev.com/index.pl?BaseSixtyFour\n\n+ (NSString*)base64forData:(NSData*)theData {\n\t\n\tconst uint8_t* input = (const uint8_t*)[theData bytes];\n\tNSInteger length = [theData length];\n\t\n    static char table[] = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\t\n    NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];\n    uint8_t* output = (uint8_t*)data.mutableBytes;\n\t\n\tNSInteger i,i2;\n    for (i=0; i < length; i += 3) {\n        NSInteger value = 0;\n\t\tfor (i2=0; i2<3; i2++) {\n            value <<= 8;\n            if (i+i2 < length) {\n                value |= (0xFF & input[i+i2]);\n            }\n        }\n\t\t\n        NSInteger theIndex = (i / 3) * 4;\n        output[theIndex + 0] =                    table[(value >> 18) & 0x3F];\n        output[theIndex + 1] =                    table[(value >> 12) & 0x3F];\n        output[theIndex + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : '=';\n        output[theIndex + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : '=';\n    }\n\t\n    return [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];\n}\n\n+ (NSDate *)expiryDateForRequest:(ASIHTTPRequest *)request maxAge:(NSTimeInterval)maxAge\n{\n\tNSDictionary *responseHeaders = [request responseHeaders];\n  \n\t// If we weren't given a custom max-age, lets look for one in the response headers\n\tif (!maxAge) {\n\t\tNSString *cacheControl = [[responseHeaders objectForKey:@\"Cache-Control\"] lowercaseString];\n\t\tif (cacheControl) {\n\t\t\tNSScanner *scanner = [NSScanner scannerWithString:cacheControl];\n\t\t\t[scanner scanUpToString:@\"max-age\" intoString:NULL];\n\t\t\tif ([scanner scanString:@\"max-age\" intoString:NULL]) {\n\t\t\t\t[scanner scanString:@\"=\" intoString:NULL];\n\t\t\t\t[scanner scanDouble:&maxAge];\n\t\t\t}\n\t\t}\n\t}\n  \n\t// RFC 2612 says max-age must override any Expires header\n\tif (maxAge) {\n\t\treturn [[NSDate date] addTimeInterval:maxAge];\n\t} else {\n\t\tNSString *expires = [responseHeaders objectForKey:@\"Expires\"];\n\t\tif (expires) {\n\t\t\treturn [ASIHTTPRequest dateFromRFC1123String:expires];\n\t\t}\n\t}\n\treturn nil;\n}\n\n// Based on hints from http://stackoverflow.com/questions/1850824/parsing-a-rfc-822-date-with-nsdateformatter\n+ (NSDate *)dateFromRFC1123String:(NSString *)string\n{\n\tNSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];\n\t[formatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@\"en_US_POSIX\"] autorelease]];\n\t// Does the string include a week day?\n\tNSString *day = @\"\";\n\tif ([string rangeOfString:@\",\"].location != NSNotFound) {\n\t\tday = @\"EEE, \";\n\t}\n\t// Does the string include seconds?\n\tNSString *seconds = @\"\";\n\tif ([[string componentsSeparatedByString:@\":\"] count] == 3) {\n\t\tseconds = @\":ss\";\n\t}\n\t[formatter setDateFormat:[NSString stringWithFormat:@\"%@dd MMM yyyy HH:mm%@ z\",day,seconds]];\n\treturn [formatter dateFromString:string];\n}\n\n+ (void)parseMimeType:(NSString **)mimeType andResponseEncoding:(NSStringEncoding *)stringEncoding fromContentType:(NSString *)contentType\n{\n\tif (!contentType) {\n\t\treturn;\n\t}\n\tNSScanner *charsetScanner = [NSScanner scannerWithString: contentType];\n\tif (![charsetScanner scanUpToString:@\";\" intoString:mimeType] || [charsetScanner scanLocation] == [contentType length]) {\n\t\t*mimeType = [contentType stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n\t\treturn;\n\t}\n\t*mimeType = [*mimeType stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n\tNSString *charsetSeparator = @\"charset=\";\n\tNSString *IANAEncoding = nil;\n\n\tif ([charsetScanner scanUpToString: charsetSeparator intoString: NULL] && [charsetScanner scanLocation] < [contentType length]) {\n\t\t[charsetScanner setScanLocation: [charsetScanner scanLocation] + [charsetSeparator length]];\n\t\t[charsetScanner scanUpToString: @\";\" intoString: &IANAEncoding];\n\t}\n\n\tif (IANAEncoding) {\n\t\tCFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)IANAEncoding);\n\t\tif (cfEncoding != kCFStringEncodingInvalidId) {\n\t\t\t*stringEncoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);\n\t\t}\n\t}\n}\n\n#pragma mark -\n#pragma mark blocks\n#if NS_BLOCKS_AVAILABLE\n- (void)setStartedBlock:(ASIBasicBlock)aStartedBlock\n{\n\t[startedBlock release];\n\tstartedBlock = [aStartedBlock copy];\n}\n\n- (void)setHeadersReceivedBlock:(ASIHeadersBlock)aReceivedBlock\n{\n\t[headersReceivedBlock release];\n\theadersReceivedBlock = [aReceivedBlock copy];\n}\n\n- (void)setCompletionBlock:(ASIBasicBlock)aCompletionBlock\n{\n\t[completionBlock release];\n\tcompletionBlock = [aCompletionBlock copy];\n}\n\n- (void)setFailedBlock:(ASIBasicBlock)aFailedBlock\n{\n\t[failureBlock release];\n\tfailureBlock = [aFailedBlock copy];\n}\n\n- (void)setBytesReceivedBlock:(ASIProgressBlock)aBytesReceivedBlock\n{\n\t[bytesReceivedBlock release];\n\tbytesReceivedBlock = [aBytesReceivedBlock copy];\n}\n\n- (void)setBytesSentBlock:(ASIProgressBlock)aBytesSentBlock\n{\n\t[bytesSentBlock release];\n\tbytesSentBlock = [aBytesSentBlock copy];\n}\n\n- (void)setDownloadSizeIncrementedBlock:(ASISizeBlock)aDownloadSizeIncrementedBlock{\n\t[downloadSizeIncrementedBlock release];\n\tdownloadSizeIncrementedBlock = [aDownloadSizeIncrementedBlock copy];\n}\n\n- (void)setUploadSizeIncrementedBlock:(ASISizeBlock)anUploadSizeIncrementedBlock\n{\n\t[uploadSizeIncrementedBlock release];\n\tuploadSizeIncrementedBlock = [anUploadSizeIncrementedBlock copy];\n}\n\n- (void)setDataReceivedBlock:(ASIDataBlock)aReceivedBlock\n{\n\t[dataReceivedBlock release];\n\tdataReceivedBlock = [aReceivedBlock copy];\n}\n\n- (void)setAuthenticationNeededBlock:(ASIBasicBlock)anAuthenticationBlock\n{\n\t[authenticationNeededBlock release];\n\tauthenticationNeededBlock = [anAuthenticationBlock copy];\n}\n- (void)setProxyAuthenticationNeededBlock:(ASIBasicBlock)aProxyAuthenticationBlock\n{\n\t[proxyAuthenticationNeededBlock release];\n\tproxyAuthenticationNeededBlock = [aProxyAuthenticationBlock copy];\n}\n- (void)setRequestRedirectedBlock:(ASIBasicBlock)aRedirectBlock\n{\n\t[requestRedirectedBlock release];\n\trequestRedirectedBlock = [aRedirectBlock copy];\n}\n#endif\n\n#pragma mark ===\n\n@synthesize username;\n@synthesize password;\n@synthesize userAgentString;\n@synthesize domain;\n@synthesize proxyUsername;\n@synthesize proxyPassword;\n@synthesize proxyDomain;\n@synthesize url;\n@synthesize originalURL;\n@synthesize delegate;\n@synthesize queue;\n@synthesize uploadProgressDelegate;\n@synthesize downloadProgressDelegate;\n@synthesize useKeychainPersistence;\n@synthesize useSessionPersistence;\n@synthesize useCookiePersistence;\n@synthesize downloadDestinationPath;\n@synthesize temporaryFileDownloadPath;\n@synthesize temporaryUncompressedDataDownloadPath;\n@synthesize didStartSelector;\n@synthesize didReceiveResponseHeadersSelector;\n@synthesize willRedirectSelector;\n@synthesize didFinishSelector;\n@synthesize didFailSelector;\n@synthesize didReceiveDataSelector;\n@synthesize authenticationRealm;\n@synthesize proxyAuthenticationRealm;\n@synthesize error;\n@synthesize complete;\n@synthesize requestHeaders;\n@synthesize responseHeaders;\n@synthesize responseCookies;\n@synthesize requestCookies;\n@synthesize requestCredentials;\n@synthesize responseStatusCode;\n@synthesize rawResponseData;\n@synthesize lastActivityTime;\n@synthesize timeOutSeconds;\n@synthesize requestMethod;\n@synthesize postBody;\n@synthesize compressedPostBody;\n@synthesize contentLength;\n@synthesize partialDownloadSize;\n@synthesize postLength;\n@synthesize shouldResetDownloadProgress;\n@synthesize shouldResetUploadProgress;\n@synthesize mainRequest;\n@synthesize totalBytesRead;\n@synthesize totalBytesSent;\n@synthesize showAccurateProgress;\n@synthesize uploadBufferSize;\n@synthesize defaultResponseEncoding;\n@synthesize responseEncoding;\n@synthesize allowCompressedResponse;\n@synthesize allowResumeForFileDownloads;\n@synthesize userInfo;\n@synthesize tag;\n@synthesize postBodyFilePath;\n@synthesize compressedPostBodyFilePath;\n@synthesize postBodyWriteStream;\n@synthesize postBodyReadStream;\n@synthesize shouldStreamPostDataFromDisk;\n@synthesize didCreateTemporaryPostDataFile;\n@synthesize useHTTPVersionOne;\n@synthesize lastBytesRead;\n@synthesize lastBytesSent;\n@synthesize cancelledLock;\n@synthesize haveBuiltPostBody;\n@synthesize fileDownloadOutputStream;\n@synthesize inflatedFileDownloadOutputStream;\n@synthesize authenticationRetryCount;\n@synthesize proxyAuthenticationRetryCount;\n@synthesize updatedProgress;\n@synthesize shouldRedirect;\n@synthesize validatesSecureCertificate;\n@synthesize needsRedirect;\n@synthesize redirectCount;\n@synthesize shouldCompressRequestBody;\n@synthesize proxyCredentials;\n@synthesize proxyHost;\n@synthesize proxyPort;\n@synthesize proxyType;\n@synthesize PACurl;\n@synthesize authenticationScheme;\n@synthesize proxyAuthenticationScheme;\n@synthesize shouldPresentAuthenticationDialog;\n@synthesize shouldPresentProxyAuthenticationDialog;\n@synthesize authenticationNeeded;\n@synthesize responseStatusMessage;\n@synthesize shouldPresentCredentialsBeforeChallenge;\n@synthesize haveBuiltRequestHeaders;\n@synthesize inProgress;\n@synthesize numberOfTimesToRetryOnTimeout;\n@synthesize retryCount;\n@synthesize willRetryRequest;\n@synthesize shouldAttemptPersistentConnection;\n@synthesize persistentConnectionTimeoutSeconds;\n@synthesize connectionCanBeReused;\n@synthesize connectionInfo;\n@synthesize readStream;\n@synthesize readStreamIsScheduled;\n@synthesize shouldUseRFC2616RedirectBehaviour;\n@synthesize downloadComplete;\n@synthesize requestID;\n@synthesize runLoopMode;\n@synthesize statusTimer;\n@synthesize downloadCache;\n@synthesize cachePolicy;\n@synthesize cacheStoragePolicy;\n@synthesize didUseCachedResponse;\n@synthesize secondsToCache;\n@synthesize clientCertificates;\n@synthesize redirectURL;\n#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0\n@synthesize shouldContinueWhenAppEntersBackground;\n#endif\n@synthesize dataDecompressor;\n@synthesize shouldWaitToInflateCompressedResponses;\n\n@synthesize isPACFileRequest;\n@synthesize PACFileRequest;\n@synthesize PACFileReadStream;\n@synthesize PACFileData;\n\n@synthesize isSynchronous;\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/Foo.h",
    "content": "#import <Foundation/Foundation.h>\n\n\n@interface Foo : NSObject {\n    \n}\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/Foo.m",
    "content": "#import \"Foo.h\"\n\n\n@implementation Foo\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/FooAppDelegate.h",
    "content": "#import <Cocoa/Cocoa.h>\n\n@interface FooAppDelegate : NSObject <NSApplicationDelegate> {\n@private\n    NSWindow *window;\n}\n\n@property (assign) IBOutlet NSWindow *window;\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/FooAppDelegate.m",
    "content": "#import \"FooAppDelegate.h\"\n\n@implementation FooAppDelegate\n\n@synthesize window;\n\n- (void)applicationDidFinishLaunching:(NSNotification *)aNotification\n{\n    // Insert code here to initialize your application\n}\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/JSONKit.h",
    "content": "//\n//  JSONKit.h\n//  http://github.com/johnezang/JSONKit\n//  Dual licensed under either the terms of the BSD License, or alternatively\n//  under the terms of the Apache License, Version 2.0, as specified below.\n//\n\n/*\n Copyright (c) 2011, John Engelhart\n \n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n \n * Neither the name of the Zang Industries nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/*\n Copyright 2011 John Engelhart\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\n#include <stddef.h>\n#include <stdint.h>\n#include <limits.h>\n#include <TargetConditionals.h>\n#include <AvailabilityMacros.h>\n\n#ifdef    __OBJC__\n#import <Foundation/NSArray.h>\n#import <Foundation/NSData.h>\n#import <Foundation/NSDictionary.h>\n#import <Foundation/NSError.h>\n#import <Foundation/NSObjCRuntime.h>\n#import <Foundation/NSString.h>\n#endif // __OBJC__\n \n#ifdef __cplusplus\nextern \"C\" {\n#endif\n  \n\n// For Mac OS X < 10.5.\n#ifndef   NSINTEGER_DEFINED\n#define   NSINTEGER_DEFINED\n#if       defined(__LP64__) || defined(NS_BUILD_32_LIKE_64)\ntypedef long           NSInteger;\ntypedef unsigned long  NSUInteger;\n#define NSIntegerMin   LONG_MIN\n#define NSIntegerMax   LONG_MAX\n#define NSUIntegerMax  ULONG_MAX\n#else  // defined(__LP64__) || defined(NS_BUILD_32_LIKE_64)\ntypedef int            NSInteger;\ntypedef unsigned int   NSUInteger;\n#define NSIntegerMin   INT_MIN\n#define NSIntegerMax   INT_MAX\n#define NSUIntegerMax  UINT_MAX\n#endif // defined(__LP64__) || defined(NS_BUILD_32_LIKE_64)\n#endif // NSINTEGER_DEFINED\n\n\n#ifndef _JSONKIT_H_\n#define _JSONKIT_H_\n\n#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__APPLE_CC__) && (__APPLE_CC__ >= 5465)\n#define JK_DEPRECATED_ATTRIBUTE __attribute__((deprecated))\n#else\n#define JK_DEPRECATED_ATTRIBUTE\n#endif\n  \n#define JSONKIT_VERSION_MAJOR 1\n#define JSONKIT_VERSION_MINOR 4\n\ntypedef NSUInteger JKFlags;\n\n/*\n  JKParseOptionComments        : Allow C style // and /_* ... *_/ (without a _, obviously) comments in JSON.\n  JKParseOptionUnicodeNewlines : Allow Unicode recommended (?:\\r\\n|[\\n\\v\\f\\r\\x85\\p{Zl}\\p{Zp}]) newlines.\n  JKParseOptionLooseUnicode    : Normally the decoder will stop with an error at any malformed Unicode.\n                                 This option allows JSON with malformed Unicode to be parsed without reporting an error.\n                                 Any malformed Unicode is replaced with \\uFFFD, or \"REPLACEMENT CHARACTER\".\n */\n\nenum {\n  JKParseOptionNone                     = 0,\n  JKParseOptionStrict                   = 0,\n  JKParseOptionComments                 = (1 << 0),\n  JKParseOptionUnicodeNewlines          = (1 << 1),\n  JKParseOptionLooseUnicode             = (1 << 2),\n  JKParseOptionPermitTextAfterValidJSON = (1 << 3),\n  JKParseOptionValidFlags               = (JKParseOptionComments | JKParseOptionUnicodeNewlines | JKParseOptionLooseUnicode | JKParseOptionPermitTextAfterValidJSON),\n};\ntypedef JKFlags JKParseOptionFlags;\n\nenum {\n  JKSerializeOptionNone                 = 0,\n  JKSerializeOptionPretty               = (1 << 0),\n  JKSerializeOptionEscapeUnicode        = (1 << 1),\n  JKSerializeOptionEscapeForwardSlashes = (1 << 4),\n  JKSerializeOptionValidFlags           = (JKSerializeOptionPretty | JKSerializeOptionEscapeUnicode | JKSerializeOptionEscapeForwardSlashes),\n};\ntypedef JKFlags JKSerializeOptionFlags;\n\n#ifdef    __OBJC__\n\ntypedef struct JKParseState JKParseState; // Opaque internal, private type.\n\n// As a general rule of thumb, if you use a method that doesn't accept a JKParseOptionFlags argument, it defaults to JKParseOptionStrict\n\n@interface JSONDecoder : NSObject {\n  JKParseState *parseState;\n}\n+ (id)decoder;\n+ (id)decoderWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (id)initWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (void)clearCache;\n\n// The parse... methods were deprecated in v1.4 in favor of the v1.4 objectWith... methods.\n- (id)parseUTF8String:(const unsigned char *)string length:(size_t)length                         JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4.  Use objectWithUTF8String:length:        instead.\n- (id)parseUTF8String:(const unsigned char *)string length:(size_t)length error:(NSError **)error JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4.  Use objectWithUTF8String:length:error:  instead.\n// The NSData MUST be UTF8 encoded JSON.\n- (id)parseJSONData:(NSData *)jsonData                                                            JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4.  Use objectWithData:                     instead.\n- (id)parseJSONData:(NSData *)jsonData error:(NSError **)error                                    JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4.  Use objectWithData:error:               instead.\n\n// Methods that return immutable collection objects.\n- (id)objectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length;\n- (id)objectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length error:(NSError **)error;\n// The NSData MUST be UTF8 encoded JSON.\n- (id)objectWithData:(NSData *)jsonData;\n- (id)objectWithData:(NSData *)jsonData error:(NSError **)error;\n\n// Methods that return mutable collection objects.\n- (id)mutableObjectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length;\n- (id)mutableObjectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length error:(NSError **)error;\n// The NSData MUST be UTF8 encoded JSON.\n- (id)mutableObjectWithData:(NSData *)jsonData;\n- (id)mutableObjectWithData:(NSData *)jsonData error:(NSError **)error;\n\n@end\n\n////////////\n#pragma mark Deserializing methods\n////////////\n\n@interface NSString (JSONKitDeserializing)\n- (id)objectFromJSONString;\n- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;\n- (id)mutableObjectFromJSONString;\n- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;\n@end\n\n@interface NSData (JSONKitDeserializing)\n// The NSData MUST be UTF8 encoded JSON.\n- (id)objectFromJSONData;\n- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;\n- (id)mutableObjectFromJSONData;\n- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;\n@end\n\n////////////\n#pragma mark Serializing methods\n////////////\n  \n@interface NSString (JSONKitSerializing)\n// Convenience methods for those that need to serialize the receiving NSString (i.e., instead of having to serialize a NSArray with a single NSString, you can \"serialize to JSON\" just the NSString).\n// Normally, a string that is serialized to JSON has quotation marks surrounding it, which you may or may not want when serializing a single string, and can be controlled with includeQuotes:\n// includeQuotes:YES `a \"test\"...` -> `\"a \\\"test\\\"...\"`\n// includeQuotes:NO  `a \"test\"...` -> `a \\\"test\\\"...`\n- (NSData *)JSONData;     // Invokes JSONDataWithOptions:JKSerializeOptionNone   includeQuotes:YES\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error;\n- (NSString *)JSONString; // Invokes JSONStringWithOptions:JKSerializeOptionNone includeQuotes:YES\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error;\n@end\n\n@interface NSArray (JSONKitSerializing)\n- (NSData *)JSONData;\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n- (NSString *)JSONString;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n@end\n\n@interface NSDictionary (JSONKitSerializing)\n- (NSData *)JSONData;\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n- (NSString *)JSONString;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n@end\n\n#ifdef __BLOCKS__\n\n@interface NSArray (JSONKitSerializingBlockAdditions)\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;\n@end\n\n@interface NSDictionary (JSONKitSerializingBlockAdditions)\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;\n@end\n  \n#endif\n\n\n#endif // __OBJC__\n\n#endif // _JSONKIT_H_\n\n#ifdef __cplusplus\n}  // extern \"C\"\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/JSONKit.m",
    "content": "//\n//  JSONKit.m\n//  http://github.com/johnezang/JSONKit\n//  Dual licensed under either the terms of the BSD License, or alternatively\n//  under the terms of the Apache License, Version 2.0, as specified below.\n//\n\n/*\n Copyright (c) 2011, John Engelhart\n \n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n \n * Neither the name of the Zang Industries nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/*\n Copyright 2011 John Engelhart\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\n\n/*\n  Acknowledgments:\n\n  The bulk of the UTF8 / UTF32 conversion and verification comes\n  from ConvertUTF.[hc].  It has been modified from the original sources.\n\n  The original sources were obtained from http://www.unicode.org/.\n  However, the web site no longer seems to host the files.  Instead,\n  the Unicode FAQ http://www.unicode.org/faq//utf_bom.html#gen4\n  points to International Components for Unicode (ICU)\n  http://site.icu-project.org/ as an example of how to write a UTF\n  converter.\n\n  The decision to use the ConvertUTF.[ch] code was made to leverage\n  \"proven\" code.  Hopefully the local modifications are bug free.\n\n  The code in isValidCodePoint() is derived from the ICU code in\n  utf.h for the macros U_IS_UNICODE_NONCHAR and U_IS_UNICODE_CHAR.\n\n  From the original ConvertUTF.[ch]:\n\n * Copyright 2001-2004 Unicode, Inc.\n * \n * Disclaimer\n * \n * This source code is provided as is by Unicode, Inc. No claims are\n * made as to fitness for any particular purpose. No warranties of any\n * kind are expressed or implied. The recipient agrees to determine\n * applicability of information provided. If this file has been\n * purchased on magnetic or optical media from Unicode, Inc., the\n * sole remedy for any claim will be exchange of defective media\n * within 90 days of receipt.\n * \n * Limitations on Rights to Redistribute This Code\n * \n * Unicode, Inc. hereby grants the right to freely use the information\n * supplied in this file in the creation of products supporting the\n * Unicode Standard, and to make copies of this file in any form\n * for internal or external distribution as long as this notice\n * remains attached.\n\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <string.h>\n#include <assert.h>\n#include <sys/errno.h>\n#include <math.h>\n#include <limits.h>\n#include <objc/runtime.h>\n\n#import \"JSONKit.h\"\n\n//#include <CoreFoundation/CoreFoundation.h>\n#include <CoreFoundation/CFString.h>\n#include <CoreFoundation/CFArray.h>\n#include <CoreFoundation/CFDictionary.h>\n#include <CoreFoundation/CFNumber.h>\n\n//#import <Foundation/Foundation.h>\n#import <Foundation/NSArray.h>\n#import <Foundation/NSAutoreleasePool.h>\n#import <Foundation/NSData.h>\n#import <Foundation/NSDictionary.h>\n#import <Foundation/NSException.h>\n#import <Foundation/NSNull.h>\n#import <Foundation/NSObjCRuntime.h>\n\n#ifndef __has_feature\n#define __has_feature(x) 0\n#endif\n\n#ifdef JK_ENABLE_CF_TRANSFER_OWNERSHIP_CALLBACKS\n#warning As of JSONKit v1.4, JK_ENABLE_CF_TRANSFER_OWNERSHIP_CALLBACKS is no longer required.  It is no longer a valid option.\n#endif\n\n#ifdef __OBJC_GC__\n#error JSONKit does not support Objective-C Garbage Collection\n#endif\n\n#if __has_feature(objc_arc)\n#error JSONKit does not support Objective-C Automatic Reference Counting (ARC)\n#endif\n\n// The following checks are really nothing more than sanity checks.\n// JSONKit technically has a few problems from a \"strictly C99 conforming\" standpoint, though they are of the pedantic nitpicking variety.\n// In practice, though, for the compilers and architectures we can reasonably expect this code to be compiled for, these pedantic nitpicks aren't really a problem.\n// Since we're limited as to what we can do with pre-processor #if checks, these checks are not nearly as through as they should be.\n\n#if (UINT_MAX != 0xffffffffU) || (INT_MIN != (-0x7fffffff-1)) || (ULLONG_MAX != 0xffffffffffffffffULL) || (LLONG_MIN != (-0x7fffffffffffffffLL-1LL))\n#error JSONKit requires the C 'int' and 'long long' types to be 32 and 64 bits respectively.\n#endif\n\n#if !defined(__LP64__) && ((UINT_MAX != ULONG_MAX) || (INT_MAX != LONG_MAX) || (INT_MIN != LONG_MIN) || (WORD_BIT != LONG_BIT))\n#error JSONKit requires the C 'int' and 'long' types to be the same on 32-bit architectures.\n#endif\n\n// Cocoa / Foundation uses NS*Integer as the type for a lot of arguments.  We make sure that NS*Integer is something we are expecting and is reasonably compatible with size_t / ssize_t\n\n#if (NSUIntegerMax != ULONG_MAX) || (NSIntegerMax != LONG_MAX) || (NSIntegerMin != LONG_MIN)\n#error JSONKit requires NSInteger and NSUInteger to be the same size as the C 'long' type.\n#endif\n\n#if (NSUIntegerMax != SIZE_MAX) || (NSIntegerMax != SSIZE_MAX)\n#error JSONKit requires NSInteger and NSUInteger to be the same size as the C 'size_t' type.\n#endif\n\n\n// For DJB hash.\n#define JK_HASH_INIT           (1402737925UL)\n\n// Use __builtin_clz() instead of trailingBytesForUTF8[] table lookup.\n#define JK_FAST_TRAILING_BYTES\n\n// JK_CACHE_SLOTS must be a power of 2.  Default size is 1024 slots.\n#define JK_CACHE_SLOTS_BITS    (10)\n#define JK_CACHE_SLOTS         (1UL << JK_CACHE_SLOTS_BITS)\n// JK_CACHE_PROBES is the number of probe attempts.\n#define JK_CACHE_PROBES        (4UL)\n// JK_INIT_CACHE_AGE must be < (1 << AGE) - 1, where AGE is sizeof(typeof(AGE)) * 8.\n#define JK_INIT_CACHE_AGE      (0)\n\n// JK_TOKENBUFFER_SIZE is the default stack size for the temporary buffer used to hold \"non-simple\" strings (i.e., contains \\ escapes)\n#define JK_TOKENBUFFER_SIZE    (1024UL * 2UL)\n\n// JK_STACK_OBJS is the default number of spaces reserved on the stack for temporarily storing pointers to Obj-C objects before they can be transferred to a NSArray / NSDictionary.\n#define JK_STACK_OBJS          (1024UL * 1UL)\n\n#define JK_JSONBUFFER_SIZE     (1024UL * 4UL)\n#define JK_UTF8BUFFER_SIZE     (1024UL * 16UL)\n\n#define JK_ENCODE_CACHE_SLOTS  (1024UL)\n\n\n#if       defined (__GNUC__) && (__GNUC__ >= 4)\n#define JK_ATTRIBUTES(attr, ...)        __attribute__((attr, ##__VA_ARGS__))\n#define JK_EXPECTED(cond, expect)       __builtin_expect((long)(cond), (expect))\n#define JK_EXPECT_T(cond)               JK_EXPECTED(cond, 1U)\n#define JK_EXPECT_F(cond)               JK_EXPECTED(cond, 0U)\n#define JK_PREFETCH(ptr)                __builtin_prefetch(ptr)\n#else  // defined (__GNUC__) && (__GNUC__ >= 4) \n#define JK_ATTRIBUTES(attr, ...)\n#define JK_EXPECTED(cond, expect)       (cond)\n#define JK_EXPECT_T(cond)               (cond)\n#define JK_EXPECT_F(cond)               (cond)\n#define JK_PREFETCH(ptr)\n#endif // defined (__GNUC__) && (__GNUC__ >= 4) \n\n#define JK_STATIC_INLINE                         static __inline__ JK_ATTRIBUTES(always_inline)\n#define JK_ALIGNED(arg)                                            JK_ATTRIBUTES(aligned(arg))\n#define JK_UNUSED_ARG                                              JK_ATTRIBUTES(unused)\n#define JK_WARN_UNUSED                                             JK_ATTRIBUTES(warn_unused_result)\n#define JK_WARN_UNUSED_CONST                                       JK_ATTRIBUTES(warn_unused_result, const)\n#define JK_WARN_UNUSED_PURE                                        JK_ATTRIBUTES(warn_unused_result, pure)\n#define JK_WARN_UNUSED_SENTINEL                                    JK_ATTRIBUTES(warn_unused_result, sentinel)\n#define JK_NONNULL_ARGS(arg, ...)                                  JK_ATTRIBUTES(nonnull(arg, ##__VA_ARGS__))\n#define JK_WARN_UNUSED_NONNULL_ARGS(arg, ...)                      JK_ATTRIBUTES(warn_unused_result, nonnull(arg, ##__VA_ARGS__))\n#define JK_WARN_UNUSED_CONST_NONNULL_ARGS(arg, ...)                JK_ATTRIBUTES(warn_unused_result, const, nonnull(arg, ##__VA_ARGS__))\n#define JK_WARN_UNUSED_PURE_NONNULL_ARGS(arg, ...)                 JK_ATTRIBUTES(warn_unused_result, pure, nonnull(arg, ##__VA_ARGS__))\n\n#if       defined (__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3)\n#define JK_ALLOC_SIZE_NON_NULL_ARGS_WARN_UNUSED(as, nn, ...) JK_ATTRIBUTES(warn_unused_result, nonnull(nn, ##__VA_ARGS__), alloc_size(as))\n#else  // defined (__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3)\n#define JK_ALLOC_SIZE_NON_NULL_ARGS_WARN_UNUSED(as, nn, ...) JK_ATTRIBUTES(warn_unused_result, nonnull(nn, ##__VA_ARGS__))\n#endif // defined (__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3)\n\n\n@class JKArray, JKDictionaryEnumerator, JKDictionary;\n\nenum {\n  JSONNumberStateStart                 = 0,\n  JSONNumberStateFinished              = 1,\n  JSONNumberStateError                 = 2,\n  JSONNumberStateWholeNumberStart      = 3,\n  JSONNumberStateWholeNumberMinus      = 4,\n  JSONNumberStateWholeNumberZero       = 5,\n  JSONNumberStateWholeNumber           = 6,\n  JSONNumberStatePeriod                = 7,\n  JSONNumberStateFractionalNumberStart = 8,\n  JSONNumberStateFractionalNumber      = 9,\n  JSONNumberStateExponentStart         = 10,\n  JSONNumberStateExponentPlusMinus     = 11,\n  JSONNumberStateExponent              = 12,\n};\n\nenum {\n  JSONStringStateStart                           = 0,\n  JSONStringStateParsing                         = 1,\n  JSONStringStateFinished                        = 2,\n  JSONStringStateError                           = 3,\n  JSONStringStateEscape                          = 4,\n  JSONStringStateEscapedUnicode1                 = 5,\n  JSONStringStateEscapedUnicode2                 = 6,\n  JSONStringStateEscapedUnicode3                 = 7,\n  JSONStringStateEscapedUnicode4                 = 8,\n  JSONStringStateEscapedUnicodeSurrogate1        = 9,\n  JSONStringStateEscapedUnicodeSurrogate2        = 10,\n  JSONStringStateEscapedUnicodeSurrogate3        = 11,\n  JSONStringStateEscapedUnicodeSurrogate4        = 12,\n  JSONStringStateEscapedNeedEscapeForSurrogate   = 13,\n  JSONStringStateEscapedNeedEscapedUForSurrogate = 14,\n};\n\nenum {\n  JKParseAcceptValue      = (1 << 0),\n  JKParseAcceptComma      = (1 << 1),\n  JKParseAcceptEnd        = (1 << 2),\n  JKParseAcceptValueOrEnd = (JKParseAcceptValue | JKParseAcceptEnd),\n  JKParseAcceptCommaOrEnd = (JKParseAcceptComma | JKParseAcceptEnd),\n};\n\nenum {\n  JKClassUnknown    = 0,\n  JKClassString     = 1,\n  JKClassNumber     = 2,\n  JKClassArray      = 3,\n  JKClassDictionary = 4,\n  JKClassNull       = 5,\n};\n\nenum {\n  JKManagedBufferOnStack        = 1,\n  JKManagedBufferOnHeap         = 2,\n  JKManagedBufferLocationMask   = (0x3),\n  JKManagedBufferLocationShift  = (0),\n  \n  JKManagedBufferMustFree       = (1 << 2),\n};\ntypedef JKFlags JKManagedBufferFlags;\n\nenum {\n  JKObjectStackOnStack        = 1,\n  JKObjectStackOnHeap         = 2,\n  JKObjectStackLocationMask   = (0x3),\n  JKObjectStackLocationShift  = (0),\n  \n  JKObjectStackMustFree       = (1 << 2),\n};\ntypedef JKFlags JKObjectStackFlags;\n\nenum {\n  JKTokenTypeInvalid     = 0,\n  JKTokenTypeNumber      = 1,\n  JKTokenTypeString      = 2,\n  JKTokenTypeObjectBegin = 3,\n  JKTokenTypeObjectEnd   = 4,\n  JKTokenTypeArrayBegin  = 5,\n  JKTokenTypeArrayEnd    = 6,\n  JKTokenTypeSeparator   = 7,\n  JKTokenTypeComma       = 8,\n  JKTokenTypeTrue        = 9,\n  JKTokenTypeFalse       = 10,\n  JKTokenTypeNull        = 11,\n  JKTokenTypeWhiteSpace  = 12,\n};\ntypedef NSUInteger JKTokenType;\n\n// These are prime numbers to assist with hash slot probing.\nenum {\n  JKValueTypeNone             = 0,\n  JKValueTypeString           = 5,\n  JKValueTypeLongLong         = 7,\n  JKValueTypeUnsignedLongLong = 11,\n  JKValueTypeDouble           = 13,\n};\ntypedef NSUInteger JKValueType;\n\nenum {\n  JKEncodeOptionAsData              = 1,\n  JKEncodeOptionAsString            = 2,\n  JKEncodeOptionAsTypeMask          = 0x7,\n  JKEncodeOptionCollectionObj       = (1 << 3),\n  JKEncodeOptionStringObj           = (1 << 4),\n  JKEncodeOptionStringObjTrimQuotes = (1 << 5),\n  \n};\ntypedef NSUInteger JKEncodeOptionType;\n\ntypedef NSUInteger JKHash;\n\ntypedef struct JKTokenCacheItem  JKTokenCacheItem;\ntypedef struct JKTokenCache      JKTokenCache;\ntypedef struct JKTokenValue      JKTokenValue;\ntypedef struct JKParseToken      JKParseToken;\ntypedef struct JKPtrRange        JKPtrRange;\ntypedef struct JKObjectStack     JKObjectStack;\ntypedef struct JKBuffer          JKBuffer;\ntypedef struct JKConstBuffer     JKConstBuffer;\ntypedef struct JKConstPtrRange   JKConstPtrRange;\ntypedef struct JKRange           JKRange;\ntypedef struct JKManagedBuffer   JKManagedBuffer;\ntypedef struct JKFastClassLookup JKFastClassLookup;\ntypedef struct JKEncodeCache     JKEncodeCache;\ntypedef struct JKEncodeState     JKEncodeState;\ntypedef struct JKObjCImpCache    JKObjCImpCache;\ntypedef struct JKHashTableEntry  JKHashTableEntry;\n\ntypedef id (*NSNumberAllocImp)(id receiver, SEL selector);\ntypedef id (*NSNumberInitWithUnsignedLongLongImp)(id receiver, SEL selector, unsigned long long value);\ntypedef id (*JKClassFormatterIMP)(id receiver, SEL selector, id object);\n#ifdef __BLOCKS__\ntypedef id (^JKClassFormatterBlock)(id formatObject);\n#endif\n\n\nstruct JKPtrRange {\n  unsigned char *ptr;\n  size_t         length;\n};\n\nstruct JKConstPtrRange {\n  const unsigned char *ptr;\n  size_t               length;\n};\n\nstruct JKRange {\n  size_t location, length;\n};\n\nstruct JKManagedBuffer {\n  JKPtrRange           bytes;\n  JKManagedBufferFlags flags;\n  size_t               roundSizeUpToMultipleOf;\n};\n\nstruct JKObjectStack {\n  void               **objects, **keys;\n  CFHashCode          *cfHashes;\n  size_t               count, index, roundSizeUpToMultipleOf;\n  JKObjectStackFlags   flags;\n};\n\nstruct JKBuffer {\n  JKPtrRange bytes;\n};\n\nstruct JKConstBuffer {\n  JKConstPtrRange bytes;\n};\n\nstruct JKTokenValue {\n  JKConstPtrRange   ptrRange;\n  JKValueType       type;\n  JKHash            hash;\n  union {\n    long long          longLongValue;\n    unsigned long long unsignedLongLongValue;\n    double             doubleValue;\n  } number;\n  JKTokenCacheItem *cacheItem;\n};\n\nstruct JKParseToken {\n  JKConstPtrRange tokenPtrRange;\n  JKTokenType     type;\n  JKTokenValue    value;\n  JKManagedBuffer tokenBuffer;\n};\n\nstruct JKTokenCacheItem {\n  void          *object;\n  JKHash         hash;\n  CFHashCode     cfHash;\n  size_t         size;\n  unsigned char *bytes;\n  JKValueType    type;\n};\n\nstruct JKTokenCache {\n  JKTokenCacheItem *items;\n  size_t            count;\n  unsigned int      prng_lfsr;\n  unsigned char     age[JK_CACHE_SLOTS];\n};\n\nstruct JKObjCImpCache {\n  Class                               NSNumberClass;\n  NSNumberAllocImp                    NSNumberAlloc;\n  NSNumberInitWithUnsignedLongLongImp NSNumberInitWithUnsignedLongLong;\n};\n\nstruct JKParseState {\n  JKParseOptionFlags  parseOptionFlags;\n  JKConstBuffer       stringBuffer;\n  size_t              atIndex, lineNumber, lineStartIndex;\n  size_t              prev_atIndex, prev_lineNumber, prev_lineStartIndex;\n  JKParseToken        token;\n  JKObjectStack       objectStack;\n  JKTokenCache        cache;\n  JKObjCImpCache      objCImpCache;\n  NSError            *error;\n  int                 errorIsPrev;\n  BOOL                mutableCollections;\n};\n\nstruct JKFastClassLookup {\n  void *stringClass;\n  void *numberClass;\n  void *arrayClass;\n  void *dictionaryClass;\n  void *nullClass;\n};\n\nstruct JKEncodeCache {\n  id object;\n  size_t offset;\n  size_t length;\n};\n\nstruct JKEncodeState {\n  JKManagedBuffer         utf8ConversionBuffer;\n  JKManagedBuffer         stringBuffer;\n  size_t                  atIndex;\n  JKFastClassLookup       fastClassLookup;\n  JKEncodeCache           cache[JK_ENCODE_CACHE_SLOTS];\n  JKSerializeOptionFlags  serializeOptionFlags;\n  JKEncodeOptionType      encodeOption;\n  size_t                  depth;\n  NSError                *error;\n  id                      classFormatterDelegate;\n  SEL                     classFormatterSelector;\n  JKClassFormatterIMP     classFormatterIMP;\n#ifdef __BLOCKS__\n  JKClassFormatterBlock   classFormatterBlock;\n#endif\n};\n\n// This is a JSONKit private class.\n@interface JKSerializer : NSObject {\n  JKEncodeState *encodeState;\n}\n\n#ifdef __BLOCKS__\n#define JKSERIALIZER_BLOCKS_PROTO id(^)(id object)\n#else\n#define JKSERIALIZER_BLOCKS_PROTO id\n#endif\n\n+ (id)serializeObject:(id)object options:(JKSerializeOptionFlags)optionFlags encodeOption:(JKEncodeOptionType)encodeOption block:(JKSERIALIZER_BLOCKS_PROTO)block delegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n- (id)serializeObject:(id)object options:(JKSerializeOptionFlags)optionFlags encodeOption:(JKEncodeOptionType)encodeOption block:(JKSERIALIZER_BLOCKS_PROTO)block delegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n- (void)releaseState;\n\n@end\n\nstruct JKHashTableEntry {\n  NSUInteger keyHash;\n  id key, object;\n};\n\n\ntypedef uint32_t UTF32; /* at least 32 bits */\ntypedef uint16_t UTF16; /* at least 16 bits */\ntypedef uint8_t  UTF8;  /* typically 8 bits */\n\ntypedef enum {\n  conversionOK,           /* conversion successful */\n  sourceExhausted,        /* partial character in source, but hit end */\n  targetExhausted,        /* insuff. room in target for conversion */\n  sourceIllegal           /* source sequence is illegal/malformed */\n} ConversionResult;\n\n#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD\n#define UNI_MAX_BMP          (UTF32)0x0000FFFF\n#define UNI_MAX_UTF16        (UTF32)0x0010FFFF\n#define UNI_MAX_UTF32        (UTF32)0x7FFFFFFF\n#define UNI_MAX_LEGAL_UTF32  (UTF32)0x0010FFFF\n#define UNI_SUR_HIGH_START   (UTF32)0xD800\n#define UNI_SUR_HIGH_END     (UTF32)0xDBFF\n#define UNI_SUR_LOW_START    (UTF32)0xDC00\n#define UNI_SUR_LOW_END      (UTF32)0xDFFF\n\n\n#if !defined(JK_FAST_TRAILING_BYTES)\nstatic const char trailingBytesForUTF8[256] = {\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5\n};\n#endif\n\nstatic const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 0x03C82080UL, 0xFA082080UL, 0x82082080UL };\nstatic const UTF8  firstByteMark[7]   = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };\n\n#define JK_AT_STRING_PTR(x)  (&((x)->stringBuffer.bytes.ptr[(x)->atIndex]))\n#define JK_END_STRING_PTR(x) (&((x)->stringBuffer.bytes.ptr[(x)->stringBuffer.bytes.length]))\n\n\nstatic JKArray          *_JKArrayCreate(id *objects, NSUInteger count, BOOL mutableCollection);\nstatic void              _JKArrayInsertObjectAtIndex(JKArray *array, id newObject, NSUInteger objectIndex);\nstatic void              _JKArrayReplaceObjectAtIndexWithObject(JKArray *array, NSUInteger objectIndex, id newObject);\nstatic void              _JKArrayRemoveObjectAtIndex(JKArray *array, NSUInteger objectIndex);\n\n\nstatic NSUInteger        _JKDictionaryCapacityForCount(NSUInteger count);\nstatic JKDictionary     *_JKDictionaryCreate(id *keys, NSUInteger *keyHashes, id *objects, NSUInteger count, BOOL mutableCollection);\nstatic JKHashTableEntry *_JKDictionaryHashEntry(JKDictionary *dictionary);\nstatic NSUInteger        _JKDictionaryCapacity(JKDictionary *dictionary);\nstatic void              _JKDictionaryResizeIfNeccessary(JKDictionary *dictionary);\nstatic void              _JKDictionaryRemoveObjectWithEntry(JKDictionary *dictionary, JKHashTableEntry *entry);\nstatic void              _JKDictionaryAddObject(JKDictionary *dictionary, NSUInteger keyHash, id key, id object);\nstatic JKHashTableEntry *_JKDictionaryHashTableEntryForKey(JKDictionary *dictionary, id aKey);\n\n\nstatic void _JSONDecoderCleanup(JSONDecoder *decoder);\n\nstatic id _NSStringObjectFromJSONString(NSString *jsonString, JKParseOptionFlags parseOptionFlags, NSError **error, BOOL mutableCollection);\n\n\nstatic void jk_managedBuffer_release(JKManagedBuffer *managedBuffer);\nstatic void jk_managedBuffer_setToStackBuffer(JKManagedBuffer *managedBuffer, unsigned char *ptr, size_t length);\nstatic unsigned char *jk_managedBuffer_resize(JKManagedBuffer *managedBuffer, size_t newSize);\nstatic void jk_objectStack_release(JKObjectStack *objectStack);\nstatic void jk_objectStack_setToStackBuffer(JKObjectStack *objectStack, void **objects, void **keys, CFHashCode *cfHashes, size_t count);\nstatic int  jk_objectStack_resize(JKObjectStack *objectStack, size_t newCount);\n\nstatic void   jk_error(JKParseState *parseState, NSString *format, ...);\nstatic int    jk_parse_string(JKParseState *parseState);\nstatic int    jk_parse_number(JKParseState *parseState);\nstatic size_t jk_parse_is_newline(JKParseState *parseState, const unsigned char *atCharacterPtr);\nJK_STATIC_INLINE int jk_parse_skip_newline(JKParseState *parseState);\nJK_STATIC_INLINE void jk_parse_skip_whitespace(JKParseState *parseState);\nstatic int    jk_parse_next_token(JKParseState *parseState);\nstatic void   jk_error_parse_accept_or3(JKParseState *parseState, int state, NSString *or1String, NSString *or2String, NSString *or3String);\nstatic void  *jk_create_dictionary(JKParseState *parseState, size_t startingObjectIndex);\nstatic void  *jk_parse_dictionary(JKParseState *parseState);\nstatic void  *jk_parse_array(JKParseState *parseState);\nstatic void  *jk_object_for_token(JKParseState *parseState);\nstatic void  *jk_cachedObjects(JKParseState *parseState);\nJK_STATIC_INLINE void jk_cache_age(JKParseState *parseState);\nJK_STATIC_INLINE void jk_set_parsed_token(JKParseState *parseState, const unsigned char *ptr, size_t length, JKTokenType type, size_t advanceBy);\n\n\nstatic void jk_encode_error(JKEncodeState *encodeState, NSString *format, ...);\nstatic int jk_encode_printf(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format, ...);\nstatic int jk_encode_write(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format);\nstatic int jk_encode_writePrettyPrintWhiteSpace(JKEncodeState *encodeState);\nstatic int jk_encode_write1slow(JKEncodeState *encodeState, ssize_t depthChange, const char *format);\nstatic int jk_encode_write1fast(JKEncodeState *encodeState, ssize_t depthChange JK_UNUSED_ARG, const char *format);\nstatic int jk_encode_writen(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format, size_t length);\nJK_STATIC_INLINE JKHash jk_encode_object_hash(void *objectPtr);\nJK_STATIC_INLINE void jk_encode_updateCache(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object);\nstatic int jk_encode_add_atom_to_buffer(JKEncodeState *encodeState, void *objectPtr);\n\n#define jk_encode_write1(es, dc, f)  (JK_EXPECT_F(_jk_encode_prettyPrint) ? jk_encode_write1slow(es, dc, f) : jk_encode_write1fast(es, dc, f))\n\n\nJK_STATIC_INLINE size_t jk_min(size_t a, size_t b);\nJK_STATIC_INLINE size_t jk_max(size_t a, size_t b);\nJK_STATIC_INLINE JKHash jk_calculateHash(JKHash currentHash, unsigned char c);\n\n// JSONKit v1.4 used both a JKArray : NSArray and JKMutableArray : NSMutableArray, and the same for the dictionary collection type.\n// However, Louis Gerbarg (via cocoa-dev) pointed out that Cocoa / Core Foundation actually implements only a single class that inherits from the \n// mutable version, and keeps an ivar bit for whether or not that instance is mutable.  This means that the immutable versions of the collection\n// classes receive the mutating methods, but this is handled by having those methods throw an exception when the ivar bit is set to immutable.\n// We adopt the same strategy here.  It's both cleaner and gets rid of the method swizzling hackery used in JSONKit v1.4.\n\n\n// This is a workaround for issue #23 https://github.com/johnezang/JSONKit/pull/23\n// Basically, there seem to be a problem with using +load in static libraries on iOS.  However, __attribute__ ((constructor)) does work correctly.\n// Since we do not require anything \"special\" that +load provides, and we can accomplish the same thing using __attribute__ ((constructor)), the +load logic was moved here.\n\nstatic Class                               _JKArrayClass                           = NULL;\nstatic size_t                              _JKArrayInstanceSize                    = 0UL;\nstatic Class                               _JKDictionaryClass                      = NULL;\nstatic size_t                              _JKDictionaryInstanceSize               = 0UL;\n\n// For JSONDecoder...\nstatic Class                               _jk_NSNumberClass                       = NULL;\nstatic NSNumberAllocImp                    _jk_NSNumberAllocImp                    = NULL;\nstatic NSNumberInitWithUnsignedLongLongImp _jk_NSNumberInitWithUnsignedLongLongImp = NULL;\n\nextern void jk_collectionClassLoadTimeInitialization(void) __attribute__ ((constructor));\n\nvoid jk_collectionClassLoadTimeInitialization(void) {\n  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Though technically not required, the run time environment at load time initialization may be less than ideal.\n  \n  _JKArrayClass             = objc_getClass(\"JKArray\");\n  _JKArrayInstanceSize      = jk_max(16UL, class_getInstanceSize(_JKArrayClass));\n  \n  _JKDictionaryClass        = objc_getClass(\"JKDictionary\");\n  _JKDictionaryInstanceSize = jk_max(16UL, class_getInstanceSize(_JKDictionaryClass));\n  \n  // For JSONDecoder...\n  _jk_NSNumberClass = [NSNumber class];\n  _jk_NSNumberAllocImp = (NSNumberAllocImp)[NSNumber methodForSelector:@selector(alloc)];\n  \n  // Hacktacular.  Need to do it this way due to the nature of class clusters.\n  id temp_NSNumber = [NSNumber alloc];\n  _jk_NSNumberInitWithUnsignedLongLongImp = (NSNumberInitWithUnsignedLongLongImp)[temp_NSNumber methodForSelector:@selector(initWithUnsignedLongLong:)];\n  [[temp_NSNumber init] release];\n  temp_NSNumber = NULL;\n  \n  [pool release]; pool = NULL;\n}\n\n\n#pragma mark -\n@interface JKArray : NSMutableArray <NSCopying, NSMutableCopying, NSFastEnumeration> {\n  id         *objects;\n  NSUInteger  count, capacity, mutations;\n}\n@end\n\n@implementation JKArray\n\n+ (id)allocWithZone:(NSZone *)zone\n{\n#pragma unused(zone)\n  [NSException raise:NSInvalidArgumentException format:@\"*** - [%@ %@]: The %@ class is private to JSONKit and should not be used in this fashion.\", NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSStringFromClass([self class])];\n  return(NULL);\n}\n\nstatic JKArray *_JKArrayCreate(id *objects, NSUInteger count, BOOL mutableCollection) {\n  NSCParameterAssert((objects != NULL) && (_JKArrayClass != NULL) && (_JKArrayInstanceSize > 0UL));\n  JKArray *array = NULL;\n  if(JK_EXPECT_T((array = (JKArray *)calloc(1UL, _JKArrayInstanceSize)) != NULL)) { // Directly allocate the JKArray instance via calloc.\n    array->isa      = _JKArrayClass;\n    if((array = [array init]) == NULL) { return(NULL); }\n    array->capacity = count;\n    array->count    = count;\n    if(JK_EXPECT_F((array->objects = (id *)malloc(sizeof(id) * array->capacity)) == NULL)) { [array autorelease]; return(NULL); }\n    memcpy(array->objects, objects, array->capacity * sizeof(id));\n    array->mutations = (mutableCollection == NO) ? 0UL : 1UL;\n  }\n  return(array);\n}\n\n// Note: The caller is responsible for -retaining the object that is to be added.\nstatic void _JKArrayInsertObjectAtIndex(JKArray *array, id newObject, NSUInteger objectIndex) {\n  NSCParameterAssert((array != NULL) && (array->objects != NULL) && (array->count <= array->capacity) && (objectIndex <= array->count) && (newObject != NULL));\n  if(!((array != NULL) && (array->objects != NULL) && (objectIndex <= array->count) && (newObject != NULL))) { [newObject autorelease]; return; }\n  if((array->count + 1UL) >= array->capacity) {\n    id *newObjects = NULL;\n    if((newObjects = (id *)realloc(array->objects, sizeof(id) * (array->capacity + 16UL))) == NULL) { [NSException raise:NSMallocException format:@\"Unable to resize objects array.\"]; }\n    array->objects = newObjects;\n    array->capacity += 16UL;\n    memset(&array->objects[array->count], 0, sizeof(id) * (array->capacity - array->count));\n  }\n  array->count++;\n  if((objectIndex + 1UL) < array->count) { memmove(&array->objects[objectIndex + 1UL], &array->objects[objectIndex], sizeof(id) * ((array->count - 1UL) - objectIndex)); array->objects[objectIndex] = NULL; }\n  array->objects[objectIndex] = newObject;\n}\n\n// Note: The caller is responsible for -retaining the object that is to be added.\nstatic void _JKArrayReplaceObjectAtIndexWithObject(JKArray *array, NSUInteger objectIndex, id newObject) {\n  NSCParameterAssert((array != NULL) && (array->objects != NULL) && (array->count <= array->capacity) && (objectIndex < array->count) && (array->objects[objectIndex] != NULL) && (newObject != NULL));\n  if(!((array != NULL) && (array->objects != NULL) && (objectIndex < array->count) && (array->objects[objectIndex] != NULL) && (newObject != NULL))) { [newObject autorelease]; return; }\n  CFRelease(array->objects[objectIndex]);\n  array->objects[objectIndex] = NULL;\n  array->objects[objectIndex] = newObject;\n}\n\nstatic void _JKArrayRemoveObjectAtIndex(JKArray *array, NSUInteger objectIndex) {\n  NSCParameterAssert((array != NULL) && (array->objects != NULL) && (array->count > 0UL) && (array->count <= array->capacity) && (objectIndex < array->count) && (array->objects[objectIndex] != NULL));\n  if(!((array != NULL) && (array->objects != NULL) && (array->count > 0UL) && (array->count <= array->capacity) && (objectIndex < array->count) && (array->objects[objectIndex] != NULL))) { return; }\n  CFRelease(array->objects[objectIndex]);\n  array->objects[objectIndex] = NULL;\n  if((objectIndex + 1UL) < array->count) { memmove(&array->objects[objectIndex], &array->objects[objectIndex + 1UL], sizeof(id) * ((array->count - 1UL) - objectIndex)); array->objects[array->count - 1UL] = NULL; }\n  array->count--;\n}\n\n- (void)dealloc\n{\n  if(JK_EXPECT_T(objects != NULL)) {\n    NSUInteger atObject = 0UL;\n    for(atObject = 0UL; atObject < count; atObject++) { if(JK_EXPECT_T(objects[atObject] != NULL)) { CFRelease(objects[atObject]); objects[atObject] = NULL; } }\n    free(objects); objects = NULL;\n  }\n  \n  [super dealloc];\n}\n\n- (NSUInteger)count\n{\n  NSParameterAssert((objects != NULL) && (count <= capacity));\n  return(count);\n}\n\n- (void)getObjects:(id *)objectsPtr range:(NSRange)range\n{\n  NSParameterAssert((objects != NULL) && (count <= capacity));\n  if((objectsPtr     == NULL)  && (NSMaxRange(range) > 0UL))   { [NSException raise:NSRangeException format:@\"*** -[%@ %@]: pointer to objects array is NULL but range length is %lu\", NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSMaxRange(range)];        }\n  if((range.location >  count) || (NSMaxRange(range) > count)) { [NSException raise:NSRangeException format:@\"*** -[%@ %@]: index (%lu) beyond bounds (%lu)\",                          NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSMaxRange(range), count]; }\n  memcpy(objectsPtr, objects + range.location, range.length * sizeof(id));\n}\n\n- (id)objectAtIndex:(NSUInteger)objectIndex\n{\n  if(objectIndex >= count) { [NSException raise:NSRangeException format:@\"*** -[%@ %@]: index (%lu) beyond bounds (%lu)\", NSStringFromClass([self class]), NSStringFromSelector(_cmd), objectIndex, count]; }\n  NSParameterAssert((objects != NULL) && (count <= capacity) && (objects[objectIndex] != NULL));\n  return(objects[objectIndex]);\n}\n\n- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len\n{\n  NSParameterAssert((state != NULL) && (stackbuf != NULL) && (len > 0UL) && (objects != NULL) && (count <= capacity));\n  if(JK_EXPECT_F(state->state == 0UL))   { state->mutationsPtr = (unsigned long *)&mutations; state->itemsPtr = stackbuf; }\n  if(JK_EXPECT_F(state->state >= count)) { return(0UL); }\n  \n  NSUInteger enumeratedCount  = 0UL;\n  while(JK_EXPECT_T(enumeratedCount < len) && JK_EXPECT_T(state->state < count)) { NSParameterAssert(objects[state->state] != NULL); stackbuf[enumeratedCount++] = objects[state->state++]; }\n  \n  return(enumeratedCount);\n}\n\n- (void)insertObject:(id)anObject atIndex:(NSUInteger)objectIndex\n{\n  if(mutations   == 0UL)   { [NSException raise:NSInternalInconsistencyException format:@\"*** -[%@ %@]: mutating method sent to immutable object\", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(anObject    == NULL)  { [NSException raise:NSInvalidArgumentException       format:@\"*** -[%@ %@]: attempt to insert nil\",                    NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(objectIndex >  count) { [NSException raise:NSRangeException                 format:@\"*** -[%@ %@]: index (%lu) beyond bounds (%lu)\",          NSStringFromClass([self class]), NSStringFromSelector(_cmd), objectIndex, count + 1UL]; }\n#ifdef __clang_analyzer__\n  [anObject retain]; // Stupid clang analyzer...  Issue #19.\n#else\n  anObject = [anObject retain];\n#endif\n  _JKArrayInsertObjectAtIndex(self, anObject, objectIndex);\n  mutations = (mutations == NSUIntegerMax) ? 1UL : mutations + 1UL;\n}\n\n- (void)removeObjectAtIndex:(NSUInteger)objectIndex\n{\n  if(mutations   == 0UL)   { [NSException raise:NSInternalInconsistencyException format:@\"*** -[%@ %@]: mutating method sent to immutable object\", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(objectIndex >= count) { [NSException raise:NSRangeException                 format:@\"*** -[%@ %@]: index (%lu) beyond bounds (%lu)\",          NSStringFromClass([self class]), NSStringFromSelector(_cmd), objectIndex, count]; }\n  _JKArrayRemoveObjectAtIndex(self, objectIndex);\n  mutations = (mutations == NSUIntegerMax) ? 1UL : mutations + 1UL;\n}\n\n- (void)replaceObjectAtIndex:(NSUInteger)objectIndex withObject:(id)anObject\n{\n  if(mutations   == 0UL)   { [NSException raise:NSInternalInconsistencyException format:@\"*** -[%@ %@]: mutating method sent to immutable object\", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(anObject    == NULL)  { [NSException raise:NSInvalidArgumentException       format:@\"*** -[%@ %@]: attempt to insert nil\",                    NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(objectIndex >= count) { [NSException raise:NSRangeException                 format:@\"*** -[%@ %@]: index (%lu) beyond bounds (%lu)\",          NSStringFromClass([self class]), NSStringFromSelector(_cmd), objectIndex, count]; }\n#ifdef __clang_analyzer__\n  [anObject retain]; // Stupid clang analyzer...  Issue #19.\n#else\n  anObject = [anObject retain];\n#endif\n  _JKArrayReplaceObjectAtIndexWithObject(self, objectIndex, anObject);\n  mutations = (mutations == NSUIntegerMax) ? 1UL : mutations + 1UL;\n}\n\n- (id)copyWithZone:(NSZone *)zone\n{\n  NSParameterAssert((objects != NULL) && (count <= capacity));\n  return((mutations == 0UL) ? [self retain] : [(NSArray *)[NSArray allocWithZone:zone] initWithObjects:objects count:count]);\n}\n\n- (id)mutableCopyWithZone:(NSZone *)zone\n{\n  NSParameterAssert((objects != NULL) && (count <= capacity));\n  return([(NSMutableArray *)[NSMutableArray allocWithZone:zone] initWithObjects:objects count:count]);\n}\n\n@end\n\n\n#pragma mark -\n@interface JKDictionaryEnumerator : NSEnumerator {\n  id         collection;\n  NSUInteger nextObject;\n}\n\n- (id)initWithJKDictionary:(JKDictionary *)initDictionary;\n- (NSArray *)allObjects;\n- (id)nextObject;\n\n@end\n\n@implementation JKDictionaryEnumerator\n\n- (id)initWithJKDictionary:(JKDictionary *)initDictionary\n{\n  NSParameterAssert(initDictionary != NULL);\n  if((self = [super init]) == NULL) { return(NULL); }\n  if((collection = (id)CFRetain(initDictionary)) == NULL) { [self autorelease]; return(NULL); }\n  return(self);\n}\n\n- (void)dealloc\n{\n  if(collection != NULL) { CFRelease(collection); collection = NULL; }\n  [super dealloc];\n}\n\n- (NSArray *)allObjects\n{\n  NSParameterAssert(collection != NULL);\n  NSUInteger count = [(NSDictionary *)collection count], atObject = 0UL;\n  id         objects[count];\n\n  while((objects[atObject] = [self nextObject]) != NULL) { NSParameterAssert(atObject < count); atObject++; }\n\n  return([NSArray arrayWithObjects:objects count:atObject]);\n}\n\n- (id)nextObject\n{\n  NSParameterAssert((collection != NULL) && (_JKDictionaryHashEntry(collection) != NULL));\n  JKHashTableEntry *entry        = _JKDictionaryHashEntry(collection);\n  NSUInteger        capacity     = _JKDictionaryCapacity(collection);\n  id                returnObject = NULL;\n\n  if(entry != NULL) { while((nextObject < capacity) && ((returnObject = entry[nextObject++].key) == NULL)) { /* ... */ } }\n  \n  return(returnObject);\n}\n\n@end\n\n#pragma mark -\n@interface JKDictionary : NSMutableDictionary <NSCopying, NSMutableCopying, NSFastEnumeration> {\n  NSUInteger count, capacity, mutations;\n  JKHashTableEntry *entry;\n}\n@end\n\n@implementation JKDictionary\n\n+ (id)allocWithZone:(NSZone *)zone\n{\n#pragma unused(zone)\n  [NSException raise:NSInvalidArgumentException format:@\"*** - [%@ %@]: The %@ class is private to JSONKit and should not be used in this fashion.\", NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSStringFromClass([self class])];\n  return(NULL);\n}\n\n// These values are taken from Core Foundation CF-550 CFBasicHash.m.  As a bonus, they align very well with our JKHashTableEntry struct too.\nstatic const NSUInteger jk_dictionaryCapacities[] = {\n  0UL, 3UL, 7UL, 13UL, 23UL, 41UL, 71UL, 127UL, 191UL, 251UL, 383UL, 631UL, 1087UL, 1723UL,\n  2803UL, 4523UL, 7351UL, 11959UL, 19447UL, 31231UL, 50683UL, 81919UL, 132607UL,\n  214519UL, 346607UL, 561109UL, 907759UL, 1468927UL, 2376191UL, 3845119UL,\n  6221311UL, 10066421UL, 16287743UL, 26354171UL, 42641881UL, 68996069UL,\n  111638519UL, 180634607UL, 292272623UL, 472907251UL\n};\n\nstatic NSUInteger _JKDictionaryCapacityForCount(NSUInteger count) {\n  NSUInteger bottom = 0UL, top = sizeof(jk_dictionaryCapacities) / sizeof(NSUInteger), mid = 0UL, tableSize = lround(floor((count) * 1.33));\n  while(top > bottom) { mid = (top + bottom) / 2UL; if(jk_dictionaryCapacities[mid] < tableSize) { bottom = mid + 1UL; } else { top = mid; } }\n  return(jk_dictionaryCapacities[bottom]);\n}\n\nstatic void _JKDictionaryResizeIfNeccessary(JKDictionary *dictionary) {\n  NSCParameterAssert((dictionary != NULL) && (dictionary->entry != NULL) && (dictionary->count <= dictionary->capacity));\n\n  NSUInteger capacityForCount = 0UL;\n  if(dictionary->capacity < (capacityForCount = _JKDictionaryCapacityForCount(dictionary->count + 1UL))) { // resize\n    NSUInteger        oldCapacity = dictionary->capacity;\n#ifndef NS_BLOCK_ASSERTIONS\n    NSUInteger oldCount = dictionary->count;\n#endif\n    JKHashTableEntry *oldEntry    = dictionary->entry;\n    if(JK_EXPECT_F((dictionary->entry = (JKHashTableEntry *)calloc(1UL, sizeof(JKHashTableEntry) * capacityForCount)) == NULL)) { [NSException raise:NSMallocException format:@\"Unable to allocate memory for hash table.\"]; }\n    dictionary->capacity = capacityForCount;\n    dictionary->count    = 0UL;\n    \n    NSUInteger idx = 0UL;\n    for(idx = 0UL; idx < oldCapacity; idx++) { if(oldEntry[idx].key != NULL) { _JKDictionaryAddObject(dictionary, oldEntry[idx].keyHash, oldEntry[idx].key, oldEntry[idx].object); oldEntry[idx].keyHash = 0UL; oldEntry[idx].key = NULL; oldEntry[idx].object = NULL; } }\n    NSCParameterAssert((oldCount == dictionary->count));\n    free(oldEntry); oldEntry = NULL;\n  }\n}\n\nstatic JKDictionary *_JKDictionaryCreate(id *keys, NSUInteger *keyHashes, id *objects, NSUInteger count, BOOL mutableCollection) {\n  NSCParameterAssert((keys != NULL) && (keyHashes != NULL) && (objects != NULL) && (_JKDictionaryClass != NULL) && (_JKDictionaryInstanceSize > 0UL));\n  JKDictionary *dictionary = NULL;\n  if(JK_EXPECT_T((dictionary = (JKDictionary *)calloc(1UL, _JKDictionaryInstanceSize)) != NULL)) { // Directly allocate the JKDictionary instance via calloc.\n    dictionary->isa      = _JKDictionaryClass;\n    if((dictionary = [dictionary init]) == NULL) { return(NULL); }\n    dictionary->capacity = _JKDictionaryCapacityForCount(count);\n    dictionary->count    = 0UL;\n    \n    if(JK_EXPECT_F((dictionary->entry = (JKHashTableEntry *)calloc(1UL, sizeof(JKHashTableEntry) * dictionary->capacity)) == NULL)) { [dictionary autorelease]; return(NULL); }\n\n    NSUInteger idx = 0UL;\n    for(idx = 0UL; idx < count; idx++) { _JKDictionaryAddObject(dictionary, keyHashes[idx], keys[idx], objects[idx]); }\n\n    dictionary->mutations = (mutableCollection == NO) ? 0UL : 1UL;\n  }\n  return(dictionary);\n}\n\n- (void)dealloc\n{\n  if(JK_EXPECT_T(entry != NULL)) {\n    NSUInteger atEntry = 0UL;\n    for(atEntry = 0UL; atEntry < capacity; atEntry++) {\n      if(JK_EXPECT_T(entry[atEntry].key    != NULL)) { CFRelease(entry[atEntry].key);    entry[atEntry].key    = NULL; }\n      if(JK_EXPECT_T(entry[atEntry].object != NULL)) { CFRelease(entry[atEntry].object); entry[atEntry].object = NULL; }\n    }\n  \n    free(entry); entry = NULL;\n  }\n\n  [super dealloc];\n}\n\nstatic JKHashTableEntry *_JKDictionaryHashEntry(JKDictionary *dictionary) {\n  NSCParameterAssert(dictionary != NULL);\n  return(dictionary->entry);\n}\n\nstatic NSUInteger _JKDictionaryCapacity(JKDictionary *dictionary) {\n  NSCParameterAssert(dictionary != NULL);\n  return(dictionary->capacity);\n}\n\nstatic void _JKDictionaryRemoveObjectWithEntry(JKDictionary *dictionary, JKHashTableEntry *entry) {\n  NSCParameterAssert((dictionary != NULL) && (entry != NULL) && (entry->key != NULL) && (entry->object != NULL) && (dictionary->count > 0UL) && (dictionary->count <= dictionary->capacity));\n  CFRelease(entry->key);    entry->key    = NULL;\n  CFRelease(entry->object); entry->object = NULL;\n  entry->keyHash = 0UL;\n  dictionary->count--;\n  // In order for certain invariants that are used to speed up the search for a particular key, we need to \"re-add\" all the entries in the hash table following this entry until we hit a NULL entry.\n  NSUInteger removeIdx = entry - dictionary->entry, idx = 0UL;\n  NSCParameterAssert((removeIdx < dictionary->capacity));\n  for(idx = 0UL; idx < dictionary->capacity; idx++) {\n    NSUInteger entryIdx = (removeIdx + idx + 1UL) % dictionary->capacity;\n    JKHashTableEntry *atEntry = &dictionary->entry[entryIdx];\n    if(atEntry->key == NULL) { break; }\n    NSUInteger keyHash = atEntry->keyHash;\n    id key = atEntry->key, object = atEntry->object;\n    NSCParameterAssert(object != NULL);\n    atEntry->keyHash = 0UL;\n    atEntry->key     = NULL;\n    atEntry->object  = NULL;\n    NSUInteger addKeyEntry = keyHash % dictionary->capacity, addIdx = 0UL;\n    for(addIdx = 0UL; addIdx < dictionary->capacity; addIdx++) {\n      JKHashTableEntry *atAddEntry = &dictionary->entry[((addKeyEntry + addIdx) % dictionary->capacity)];\n      if(JK_EXPECT_T(atAddEntry->key == NULL)) { NSCParameterAssert((atAddEntry->keyHash == 0UL) && (atAddEntry->object == NULL)); atAddEntry->key = key; atAddEntry->object = object; atAddEntry->keyHash = keyHash; break; }\n    }\n  }\n}\n\nstatic void _JKDictionaryAddObject(JKDictionary *dictionary, NSUInteger keyHash, id key, id object) {\n  NSCParameterAssert((dictionary != NULL) && (key != NULL) && (object != NULL) && (dictionary->count < dictionary->capacity) && (dictionary->entry != NULL));\n  NSUInteger keyEntry = keyHash % dictionary->capacity, idx = 0UL;\n  for(idx = 0UL; idx < dictionary->capacity; idx++) {\n    NSUInteger entryIdx = (keyEntry + idx) % dictionary->capacity;\n    JKHashTableEntry *atEntry = &dictionary->entry[entryIdx];\n    if(JK_EXPECT_F(atEntry->keyHash == keyHash) && JK_EXPECT_T(atEntry->key != NULL) && (JK_EXPECT_F(key == atEntry->key) || JK_EXPECT_F(CFEqual(atEntry->key, key)))) { _JKDictionaryRemoveObjectWithEntry(dictionary, atEntry); }\n    if(JK_EXPECT_T(atEntry->key == NULL)) { NSCParameterAssert((atEntry->keyHash == 0UL) && (atEntry->object == NULL)); atEntry->key = key; atEntry->object = object; atEntry->keyHash = keyHash; dictionary->count++; return; }\n  }\n\n  // We should never get here.  If we do, we -release the key / object because it's our responsibility.\n  CFRelease(key);\n  CFRelease(object);\n}\n\n- (NSUInteger)count\n{\n  return(count);\n}\n\nstatic JKHashTableEntry *_JKDictionaryHashTableEntryForKey(JKDictionary *dictionary, id aKey) {\n  NSCParameterAssert((dictionary != NULL) && (dictionary->entry != NULL) && (dictionary->count <= dictionary->capacity));\n  if((aKey == NULL) || (dictionary->capacity == 0UL)) { return(NULL); }\n  NSUInteger        keyHash = CFHash(aKey), keyEntry = (keyHash % dictionary->capacity), idx = 0UL;\n  JKHashTableEntry *atEntry = NULL;\n  for(idx = 0UL; idx < dictionary->capacity; idx++) {\n    atEntry = &dictionary->entry[(keyEntry + idx) % dictionary->capacity];\n    if(JK_EXPECT_T(atEntry->keyHash == keyHash) && JK_EXPECT_T(atEntry->key != NULL) && ((atEntry->key == aKey) || CFEqual(atEntry->key, aKey))) { NSCParameterAssert(atEntry->object != NULL); return(atEntry); break; }\n    if(JK_EXPECT_F(atEntry->key == NULL)) { NSCParameterAssert(atEntry->object == NULL); return(NULL); break; } // If the key was in the table, we would have found it by now.\n  }\n  return(NULL);\n}\n\n- (id)objectForKey:(id)aKey\n{\n  NSParameterAssert((entry != NULL) && (count <= capacity));\n  JKHashTableEntry *entryForKey = _JKDictionaryHashTableEntryForKey(self, aKey);\n  return((entryForKey != NULL) ? entryForKey->object : NULL);\n}\n\n- (void)getObjects:(id *)objects andKeys:(id *)keys\n{\n  NSParameterAssert((entry != NULL) && (count <= capacity));\n  NSUInteger atEntry = 0UL; NSUInteger arrayIdx = 0UL;\n  for(atEntry = 0UL; atEntry < capacity; atEntry++) {\n    if(JK_EXPECT_T(entry[atEntry].key != NULL)) {\n      NSCParameterAssert((entry[atEntry].object != NULL) && (arrayIdx < count));\n      if(JK_EXPECT_T(keys    != NULL)) { keys[arrayIdx]    = entry[atEntry].key;    }\n      if(JK_EXPECT_T(objects != NULL)) { objects[arrayIdx] = entry[atEntry].object; }\n      arrayIdx++;\n    }\n  }\n}\n\n- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len\n{\n  NSParameterAssert((state != NULL) && (stackbuf != NULL) && (len > 0UL) && (entry != NULL) && (count <= capacity));\n  if(JK_EXPECT_F(state->state == 0UL))      { state->mutationsPtr = (unsigned long *)&mutations; state->itemsPtr = stackbuf; }\n  if(JK_EXPECT_F(state->state >= capacity)) { return(0UL); }\n  \n  NSUInteger enumeratedCount  = 0UL;\n  while(JK_EXPECT_T(enumeratedCount < len) && JK_EXPECT_T(state->state < capacity)) { if(JK_EXPECT_T(entry[state->state].key != NULL)) { stackbuf[enumeratedCount++] = entry[state->state].key; } state->state++; }\n    \n  return(enumeratedCount);\n}\n\n- (NSEnumerator *)keyEnumerator\n{\n  return([[[JKDictionaryEnumerator alloc] initWithJKDictionary:self] autorelease]);\n}\n\n- (void)setObject:(id)anObject forKey:(id)aKey\n{\n  if(mutations == 0UL)  { [NSException raise:NSInternalInconsistencyException format:@\"*** -[%@ %@]: mutating method sent to immutable object\", NSStringFromClass([self class]), NSStringFromSelector(_cmd)];       }\n  if(aKey      == NULL) { [NSException raise:NSInvalidArgumentException       format:@\"*** -[%@ %@]: attempt to insert nil key\",                NSStringFromClass([self class]), NSStringFromSelector(_cmd)];       }\n  if(anObject  == NULL) { [NSException raise:NSInvalidArgumentException       format:@\"*** -[%@ %@]: attempt to insert nil value (key: %@)\",    NSStringFromClass([self class]), NSStringFromSelector(_cmd), aKey]; }\n  \n  _JKDictionaryResizeIfNeccessary(self);\n#ifndef __clang_analyzer__\n  aKey     = [aKey     copy];   // Why on earth would clang complain that this -copy \"might leak\", \n  anObject = [anObject retain]; // but this -retain doesn't!?\n#endif // __clang_analyzer__\n  _JKDictionaryAddObject(self, CFHash(aKey), aKey, anObject);\n  mutations = (mutations == NSUIntegerMax) ? 1UL : mutations + 1UL;\n}\n\n- (void)removeObjectForKey:(id)aKey\n{\n  if(mutations == 0UL)  { [NSException raise:NSInternalInconsistencyException format:@\"*** -[%@ %@]: mutating method sent to immutable object\", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(aKey      == NULL) { [NSException raise:NSInvalidArgumentException       format:@\"*** -[%@ %@]: attempt to remove nil key\",                NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  JKHashTableEntry *entryForKey = _JKDictionaryHashTableEntryForKey(self, aKey);\n  if(entryForKey != NULL) {\n    _JKDictionaryRemoveObjectWithEntry(self, entryForKey);\n    mutations = (mutations == NSUIntegerMax) ? 1UL : mutations + 1UL;\n  }\n}\n\n- (id)copyWithZone:(NSZone *)zone\n{\n  NSParameterAssert((entry != NULL) && (count <= capacity));\n  return((mutations == 0UL) ? [self retain] : [[NSDictionary allocWithZone:zone] initWithDictionary:self]);\n}\n\n- (id)mutableCopyWithZone:(NSZone *)zone\n{\n  NSParameterAssert((entry != NULL) && (count <= capacity));\n  return([[NSMutableDictionary allocWithZone:zone] initWithDictionary:self]);\n}\n\n@end\n\n\n\n#pragma mark -\n\nJK_STATIC_INLINE size_t jk_min(size_t a, size_t b) { return((a < b) ? a : b); }\nJK_STATIC_INLINE size_t jk_max(size_t a, size_t b) { return((a > b) ? a : b); }\n\nJK_STATIC_INLINE JKHash jk_calculateHash(JKHash currentHash, unsigned char c) { return((((currentHash << 5) + currentHash) + (c - 29)) ^ (currentHash >> 19)); }\n\n\nstatic void jk_error(JKParseState *parseState, NSString *format, ...) {\n  NSCParameterAssert((parseState != NULL) && (format != NULL));\n\n  va_list varArgsList;\n  va_start(varArgsList, format);\n  NSString *formatString = [[[NSString alloc] initWithFormat:format arguments:varArgsList] autorelease];\n  va_end(varArgsList);\n\n#if 0\n  const unsigned char *lineStart      = parseState->stringBuffer.bytes.ptr + parseState->lineStartIndex;\n  const unsigned char *lineEnd        = lineStart;\n  const unsigned char *atCharacterPtr = NULL;\n\n  for(atCharacterPtr = lineStart; atCharacterPtr < JK_END_STRING_PTR(parseState); atCharacterPtr++) { lineEnd = atCharacterPtr; if(jk_parse_is_newline(parseState, atCharacterPtr)) { break; } }\n\n  NSString *lineString = @\"\", *carretString = @\"\";\n  if(lineStart < JK_END_STRING_PTR(parseState)) {\n    lineString   = [[[NSString alloc] initWithBytes:lineStart length:(lineEnd - lineStart) encoding:NSUTF8StringEncoding] autorelease];\n    carretString = [NSString stringWithFormat:@\"%*.*s^\", (int)(parseState->atIndex - parseState->lineStartIndex), (int)(parseState->atIndex - parseState->lineStartIndex), \" \"];\n  }\n#endif\n\n  if(parseState->error == NULL) {\n    parseState->error = [NSError errorWithDomain:@\"JKErrorDomain\" code:-1L userInfo:\n                                   [NSDictionary dictionaryWithObjectsAndKeys:\n                                                                              formatString,                                             NSLocalizedDescriptionKey,\n                                                                              [NSNumber numberWithUnsignedLong:parseState->atIndex],    @\"JKAtIndexKey\",\n                                                                              [NSNumber numberWithUnsignedLong:parseState->lineNumber], @\"JKLineNumberKey\",\n                                                 //lineString,   @\"JKErrorLine0Key\",\n                                                 //carretString, @\"JKErrorLine1Key\",\n                                                                              NULL]];\n  }\n}\n\n#pragma mark -\n#pragma mark Buffer and Object Stack management functions\n\nstatic void jk_managedBuffer_release(JKManagedBuffer *managedBuffer) {\n  if((managedBuffer->flags & JKManagedBufferMustFree)) {\n    if(managedBuffer->bytes.ptr != NULL) { free(managedBuffer->bytes.ptr); managedBuffer->bytes.ptr = NULL; }\n    managedBuffer->flags &= ~JKManagedBufferMustFree;\n  }\n\n  managedBuffer->bytes.ptr     = NULL;\n  managedBuffer->bytes.length  = 0UL;\n  managedBuffer->flags        &= ~JKManagedBufferLocationMask;\n}\n\nstatic void jk_managedBuffer_setToStackBuffer(JKManagedBuffer *managedBuffer, unsigned char *ptr, size_t length) {\n  jk_managedBuffer_release(managedBuffer);\n  managedBuffer->bytes.ptr     = ptr;\n  managedBuffer->bytes.length  = length;\n  managedBuffer->flags         = (managedBuffer->flags & ~JKManagedBufferLocationMask) | JKManagedBufferOnStack;\n}\n\nstatic unsigned char *jk_managedBuffer_resize(JKManagedBuffer *managedBuffer, size_t newSize) {\n  size_t roundedUpNewSize = newSize;\n\n  if(managedBuffer->roundSizeUpToMultipleOf > 0UL) { roundedUpNewSize = newSize + ((managedBuffer->roundSizeUpToMultipleOf - (newSize % managedBuffer->roundSizeUpToMultipleOf)) % managedBuffer->roundSizeUpToMultipleOf); }\n\n  if((roundedUpNewSize != managedBuffer->bytes.length) && (roundedUpNewSize > managedBuffer->bytes.length)) {\n    if((managedBuffer->flags & JKManagedBufferLocationMask) == JKManagedBufferOnStack) {\n      NSCParameterAssert((managedBuffer->flags & JKManagedBufferMustFree) == 0);\n      unsigned char *newBuffer = NULL, *oldBuffer = managedBuffer->bytes.ptr;\n      \n      if((newBuffer = (unsigned char *)malloc(roundedUpNewSize)) == NULL) { return(NULL); }\n      memcpy(newBuffer, oldBuffer, jk_min(managedBuffer->bytes.length, roundedUpNewSize));\n      managedBuffer->flags        = (managedBuffer->flags & ~JKManagedBufferLocationMask) | (JKManagedBufferOnHeap | JKManagedBufferMustFree);\n      managedBuffer->bytes.ptr    = newBuffer;\n      managedBuffer->bytes.length = roundedUpNewSize;\n    } else {\n      NSCParameterAssert(((managedBuffer->flags & JKManagedBufferMustFree) != 0) && ((managedBuffer->flags & JKManagedBufferLocationMask) == JKManagedBufferOnHeap));\n      if((managedBuffer->bytes.ptr = (unsigned char *)reallocf(managedBuffer->bytes.ptr, roundedUpNewSize)) == NULL) { return(NULL); }\n      managedBuffer->bytes.length = roundedUpNewSize;\n    }\n  }\n\n  return(managedBuffer->bytes.ptr);\n}\n\n\n\nstatic void jk_objectStack_release(JKObjectStack *objectStack) {\n  NSCParameterAssert(objectStack != NULL);\n\n  NSCParameterAssert(objectStack->index <= objectStack->count);\n  size_t atIndex = 0UL;\n  for(atIndex = 0UL; atIndex < objectStack->index; atIndex++) {\n    if(objectStack->objects[atIndex] != NULL) { CFRelease(objectStack->objects[atIndex]); objectStack->objects[atIndex] = NULL; }\n    if(objectStack->keys[atIndex]    != NULL) { CFRelease(objectStack->keys[atIndex]);    objectStack->keys[atIndex]    = NULL; }\n  }\n  objectStack->index = 0UL;\n\n  if(objectStack->flags & JKObjectStackMustFree) {\n    NSCParameterAssert((objectStack->flags & JKObjectStackLocationMask) == JKObjectStackOnHeap);\n    if(objectStack->objects  != NULL) { free(objectStack->objects);  objectStack->objects  = NULL; }\n    if(objectStack->keys     != NULL) { free(objectStack->keys);     objectStack->keys     = NULL; }\n    if(objectStack->cfHashes != NULL) { free(objectStack->cfHashes); objectStack->cfHashes = NULL; }\n    objectStack->flags &= ~JKObjectStackMustFree;\n  }\n\n  objectStack->objects  = NULL;\n  objectStack->keys     = NULL;\n  objectStack->cfHashes = NULL;\n\n  objectStack->count    = 0UL;\n  objectStack->flags   &= ~JKObjectStackLocationMask;\n}\n\nstatic void jk_objectStack_setToStackBuffer(JKObjectStack *objectStack, void **objects, void **keys, CFHashCode *cfHashes, size_t count) {\n  NSCParameterAssert((objectStack != NULL) && (objects != NULL) && (keys != NULL) && (cfHashes != NULL) && (count > 0UL));\n  jk_objectStack_release(objectStack);\n  objectStack->objects  = objects;\n  objectStack->keys     = keys;\n  objectStack->cfHashes = cfHashes;\n  objectStack->count    = count;\n  objectStack->flags    = (objectStack->flags & ~JKObjectStackLocationMask) | JKObjectStackOnStack;\n#ifndef NS_BLOCK_ASSERTIONS\n  size_t idx;\n  for(idx = 0UL; idx < objectStack->count; idx++) { objectStack->objects[idx] = NULL; objectStack->keys[idx] = NULL; objectStack->cfHashes[idx] = 0UL; }\n#endif\n}\n\nstatic int jk_objectStack_resize(JKObjectStack *objectStack, size_t newCount) {\n  size_t roundedUpNewCount = newCount;\n  int    returnCode = 0;\n\n  void       **newObjects  = NULL, **newKeys = NULL;\n  CFHashCode  *newCFHashes = NULL;\n\n  if(objectStack->roundSizeUpToMultipleOf > 0UL) { roundedUpNewCount = newCount + ((objectStack->roundSizeUpToMultipleOf - (newCount % objectStack->roundSizeUpToMultipleOf)) % objectStack->roundSizeUpToMultipleOf); }\n\n  if((roundedUpNewCount != objectStack->count) && (roundedUpNewCount > objectStack->count)) {\n    if((objectStack->flags & JKObjectStackLocationMask) == JKObjectStackOnStack) {\n      NSCParameterAssert((objectStack->flags & JKObjectStackMustFree) == 0);\n\n      if((newObjects  = (void **     )calloc(1UL, roundedUpNewCount * sizeof(void *    ))) == NULL) { returnCode = 1; goto errorExit; }\n      memcpy(newObjects, objectStack->objects,   jk_min(objectStack->count, roundedUpNewCount) * sizeof(void *));\n      if((newKeys     = (void **     )calloc(1UL, roundedUpNewCount * sizeof(void *    ))) == NULL) { returnCode = 1; goto errorExit; }\n      memcpy(newKeys,     objectStack->keys,     jk_min(objectStack->count, roundedUpNewCount) * sizeof(void *));\n\n      if((newCFHashes = (CFHashCode *)calloc(1UL, roundedUpNewCount * sizeof(CFHashCode))) == NULL) { returnCode = 1; goto errorExit; }\n      memcpy(newCFHashes, objectStack->cfHashes, jk_min(objectStack->count, roundedUpNewCount) * sizeof(CFHashCode));\n\n      objectStack->flags    = (objectStack->flags & ~JKObjectStackLocationMask) | (JKObjectStackOnHeap | JKObjectStackMustFree);\n      objectStack->objects  = newObjects;  newObjects  = NULL;\n      objectStack->keys     = newKeys;     newKeys     = NULL;\n      objectStack->cfHashes = newCFHashes; newCFHashes = NULL;\n      objectStack->count    = roundedUpNewCount;\n    } else {\n      NSCParameterAssert(((objectStack->flags & JKObjectStackMustFree) != 0) && ((objectStack->flags & JKObjectStackLocationMask) == JKObjectStackOnHeap));\n      if((newObjects  = (void  **    )realloc(objectStack->objects,  roundedUpNewCount * sizeof(void *    ))) != NULL) { objectStack->objects  = newObjects;  newObjects  = NULL; } else { returnCode = 1; goto errorExit; }\n      if((newKeys     = (void  **    )realloc(objectStack->keys,     roundedUpNewCount * sizeof(void *    ))) != NULL) { objectStack->keys     = newKeys;     newKeys     = NULL; } else { returnCode = 1; goto errorExit; }\n      if((newCFHashes = (CFHashCode *)realloc(objectStack->cfHashes, roundedUpNewCount * sizeof(CFHashCode))) != NULL) { objectStack->cfHashes = newCFHashes; newCFHashes = NULL; } else { returnCode = 1; goto errorExit; }\n\n#ifndef NS_BLOCK_ASSERTIONS\n      size_t idx;\n      for(idx = objectStack->count; idx < roundedUpNewCount; idx++) { objectStack->objects[idx] = NULL; objectStack->keys[idx] = NULL; objectStack->cfHashes[idx] = 0UL; }\n#endif\n      objectStack->count = roundedUpNewCount;\n    }\n  }\n\n errorExit:\n  if(newObjects  != NULL) { free(newObjects);  newObjects  = NULL; }\n  if(newKeys     != NULL) { free(newKeys);     newKeys     = NULL; }\n  if(newCFHashes != NULL) { free(newCFHashes); newCFHashes = NULL; }\n\n  return(returnCode);\n}\n\n////////////\n#pragma mark -\n#pragma mark Unicode related functions\n\nJK_STATIC_INLINE ConversionResult isValidCodePoint(UTF32 *u32CodePoint) {\n  ConversionResult result = conversionOK;\n  UTF32            ch     = *u32CodePoint;\n\n  if(JK_EXPECT_F(ch >= UNI_SUR_HIGH_START) && (JK_EXPECT_T(ch <= UNI_SUR_LOW_END)))                                                        { result = sourceIllegal; ch = UNI_REPLACEMENT_CHAR; goto finished; }\n  if(JK_EXPECT_F(ch >= 0xFDD0U) && (JK_EXPECT_F(ch <= 0xFDEFU) || JK_EXPECT_F((ch & 0xFFFEU) == 0xFFFEU)) && JK_EXPECT_T(ch <= 0x10FFFFU)) { result = sourceIllegal; ch = UNI_REPLACEMENT_CHAR; goto finished; }\n  if(JK_EXPECT_F(ch == 0U))                                                                                                                { result = sourceIllegal; ch = UNI_REPLACEMENT_CHAR; goto finished; }\n\n finished:\n  *u32CodePoint = ch;\n  return(result);\n}\n\n\nstatic int isLegalUTF8(const UTF8 *source, size_t length) {\n  const UTF8 *srcptr = source + length;\n  UTF8 a;\n\n  switch(length) {\n    default: return(0); // Everything else falls through when \"true\"...\n    case 4: if(JK_EXPECT_F(((a = (*--srcptr)) < 0x80) || (a > 0xBF))) { return(0); }\n    case 3: if(JK_EXPECT_F(((a = (*--srcptr)) < 0x80) || (a > 0xBF))) { return(0); }\n    case 2: if(JK_EXPECT_F( (a = (*--srcptr)) > 0xBF               )) { return(0); }\n      \n      switch(*source) { // no fall-through in this inner switch\n        case 0xE0: if(JK_EXPECT_F(a < 0xA0)) { return(0); } break;\n        case 0xED: if(JK_EXPECT_F(a > 0x9F)) { return(0); } break;\n        case 0xF0: if(JK_EXPECT_F(a < 0x90)) { return(0); } break;\n        case 0xF4: if(JK_EXPECT_F(a > 0x8F)) { return(0); } break;\n        default:   if(JK_EXPECT_F(a < 0x80)) { return(0); }\n      }\n      \n    case 1: if(JK_EXPECT_F((JK_EXPECT_T(*source < 0xC2)) && JK_EXPECT_F(*source >= 0x80))) { return(0); }\n  }\n\n  if(JK_EXPECT_F(*source > 0xF4)) { return(0); }\n\n  return(1);\n}\n\nstatic ConversionResult ConvertSingleCodePointInUTF8(const UTF8 *sourceStart, const UTF8 *sourceEnd, UTF8 const **nextUTF8, UTF32 *convertedUTF32) {\n  ConversionResult result = conversionOK;\n  const UTF8 *source = sourceStart;\n  UTF32 ch = 0UL;\n\n#if !defined(JK_FAST_TRAILING_BYTES)\n  unsigned short extraBytesToRead = trailingBytesForUTF8[*source];\n#else\n  unsigned short extraBytesToRead = __builtin_clz(((*source)^0xff) << 25);\n#endif\n\n  if(JK_EXPECT_F((source + extraBytesToRead + 1) > sourceEnd) || JK_EXPECT_F(!isLegalUTF8(source, extraBytesToRead + 1))) {\n    source++;\n    while((source < sourceEnd) && (((*source) & 0xc0) == 0x80) && ((source - sourceStart) < (extraBytesToRead + 1))) { source++; } \n    NSCParameterAssert(source <= sourceEnd);\n    result = ((source < sourceEnd) && (((*source) & 0xc0) != 0x80)) ? sourceIllegal : ((sourceStart + extraBytesToRead + 1) > sourceEnd) ? sourceExhausted : sourceIllegal;\n    ch = UNI_REPLACEMENT_CHAR;\n    goto finished;\n  }\n\n  switch(extraBytesToRead) { // The cases all fall through.\n    case 5: ch += *source++; ch <<= 6;\n    case 4: ch += *source++; ch <<= 6;\n    case 3: ch += *source++; ch <<= 6;\n    case 2: ch += *source++; ch <<= 6;\n    case 1: ch += *source++; ch <<= 6;\n    case 0: ch += *source++;\n  }\n  ch -= offsetsFromUTF8[extraBytesToRead];\n\n  result = isValidCodePoint(&ch);\n  \n finished:\n  *nextUTF8       = source;\n  *convertedUTF32 = ch;\n  \n  return(result);\n}\n\n\nstatic ConversionResult ConvertUTF32toUTF8 (UTF32 u32CodePoint, UTF8 **targetStart, UTF8 *targetEnd) {\n  const UTF32       byteMask     = 0xBF, byteMark = 0x80;\n  ConversionResult  result       = conversionOK;\n  UTF8             *target       = *targetStart;\n  UTF32             ch           = u32CodePoint;\n  unsigned short    bytesToWrite = 0;\n\n  result = isValidCodePoint(&ch);\n\n  // Figure out how many bytes the result will require. Turn any illegally large UTF32 things (> Plane 17) into replacement chars.\n       if(ch < (UTF32)0x80)          { bytesToWrite = 1; }\n  else if(ch < (UTF32)0x800)         { bytesToWrite = 2; }\n  else if(ch < (UTF32)0x10000)       { bytesToWrite = 3; }\n  else if(ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; }\n  else {                               bytesToWrite = 3; ch = UNI_REPLACEMENT_CHAR; result = sourceIllegal; }\n        \n  target += bytesToWrite;\n  if (target > targetEnd) { target -= bytesToWrite; result = targetExhausted; goto finished; }\n\n  switch (bytesToWrite) { // note: everything falls through.\n    case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n    case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n    case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n    case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]);\n  }\n\n  target += bytesToWrite;\n\n finished:\n  *targetStart = target;\n  return(result);\n}\n\nJK_STATIC_INLINE int jk_string_add_unicodeCodePoint(JKParseState *parseState, uint32_t unicodeCodePoint, size_t *tokenBufferIdx, JKHash *stringHash) {\n  UTF8             *u8s = &parseState->token.tokenBuffer.bytes.ptr[*tokenBufferIdx];\n  ConversionResult  result;\n\n  if((result = ConvertUTF32toUTF8(unicodeCodePoint, &u8s, (parseState->token.tokenBuffer.bytes.ptr + parseState->token.tokenBuffer.bytes.length))) != conversionOK) { if(result == targetExhausted) { return(1); } }\n  size_t utf8len = u8s - &parseState->token.tokenBuffer.bytes.ptr[*tokenBufferIdx], nextIdx = (*tokenBufferIdx) + utf8len;\n  \n  while(*tokenBufferIdx < nextIdx) { *stringHash = jk_calculateHash(*stringHash, parseState->token.tokenBuffer.bytes.ptr[(*tokenBufferIdx)++]); }\n\n  return(0);\n}\n\n////////////\n#pragma mark -\n#pragma mark Decoding / parsing / deserializing functions\n\nstatic int jk_parse_string(JKParseState *parseState) {\n  NSCParameterAssert((parseState != NULL) && (JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)));\n  const unsigned char *stringStart       = JK_AT_STRING_PTR(parseState) + 1;\n  const unsigned char *endOfBuffer       = JK_END_STRING_PTR(parseState);\n  const unsigned char *atStringCharacter = stringStart;\n  unsigned char       *tokenBuffer       = parseState->token.tokenBuffer.bytes.ptr;\n  size_t               tokenStartIndex   = parseState->atIndex;\n  size_t               tokenBufferIdx    = 0UL;\n\n  int      onlySimpleString        = 1,  stringState     = JSONStringStateStart;\n  uint16_t escapedUnicode1         = 0U, escapedUnicode2 = 0U;\n  uint32_t escapedUnicodeCodePoint = 0U;\n  JKHash   stringHash              = JK_HASH_INIT;\n    \n  while(1) {\n    unsigned long currentChar;\n\n    if(JK_EXPECT_F(atStringCharacter == endOfBuffer)) { /* XXX Add error message */ stringState = JSONStringStateError; goto finishedParsing; }\n    \n    if(JK_EXPECT_F((currentChar = *atStringCharacter++) >= 0x80UL)) {\n      const unsigned char *nextValidCharacter = NULL;\n      UTF32                u32ch              = 0U;\n      ConversionResult     result;\n\n      if(JK_EXPECT_F((result = ConvertSingleCodePointInUTF8(atStringCharacter - 1, endOfBuffer, (UTF8 const **)&nextValidCharacter, &u32ch)) != conversionOK)) { goto switchToSlowPath; }\n      stringHash = jk_calculateHash(stringHash, currentChar);\n      while(atStringCharacter < nextValidCharacter) { NSCParameterAssert(JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)); stringHash = jk_calculateHash(stringHash, *atStringCharacter++); }\n      continue;\n    } else {\n      if(JK_EXPECT_F(currentChar == (unsigned long)'\"')) { stringState = JSONStringStateFinished; goto finishedParsing; }\n\n      if(JK_EXPECT_F(currentChar == (unsigned long)'\\\\')) {\n      switchToSlowPath:\n        onlySimpleString = 0;\n        stringState      = JSONStringStateParsing;\n        tokenBufferIdx   = (atStringCharacter - stringStart) - 1L;\n        if(JK_EXPECT_F((tokenBufferIdx + 16UL) > parseState->token.tokenBuffer.bytes.length)) { if((tokenBuffer = jk_managedBuffer_resize(&parseState->token.tokenBuffer, tokenBufferIdx + 1024UL)) == NULL) { jk_error(parseState, @\"Internal error: Unable to resize temporary buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; } }\n        memcpy(tokenBuffer, stringStart, tokenBufferIdx);\n        goto slowMatch;\n      }\n\n      if(JK_EXPECT_F(currentChar < 0x20UL)) { jk_error(parseState, @\"Invalid character < 0x20 found in string: 0x%2.2x.\", currentChar); stringState = JSONStringStateError; goto finishedParsing; }\n\n      stringHash = jk_calculateHash(stringHash, currentChar);\n    }\n  }\n\n slowMatch:\n\n  for(atStringCharacter = (stringStart + ((atStringCharacter - stringStart) - 1L)); (atStringCharacter < endOfBuffer) && (tokenBufferIdx < parseState->token.tokenBuffer.bytes.length); atStringCharacter++) {\n    if((tokenBufferIdx + 16UL) > parseState->token.tokenBuffer.bytes.length) { if((tokenBuffer = jk_managedBuffer_resize(&parseState->token.tokenBuffer, tokenBufferIdx + 1024UL)) == NULL) { jk_error(parseState, @\"Internal error: Unable to resize temporary buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; } }\n\n    NSCParameterAssert(tokenBufferIdx < parseState->token.tokenBuffer.bytes.length);\n\n    unsigned long currentChar = (*atStringCharacter), escapedChar;\n\n    if(JK_EXPECT_T(stringState == JSONStringStateParsing)) {\n      if(JK_EXPECT_T(currentChar >= 0x20UL)) {\n        if(JK_EXPECT_T(currentChar < (unsigned long)0x80)) { // Not a UTF8 sequence\n          if(JK_EXPECT_F(currentChar == (unsigned long)'\"'))  { stringState = JSONStringStateFinished; atStringCharacter++; goto finishedParsing; }\n          if(JK_EXPECT_F(currentChar == (unsigned long)'\\\\')) { stringState = JSONStringStateEscape; continue; }\n          stringHash = jk_calculateHash(stringHash, currentChar);\n          tokenBuffer[tokenBufferIdx++] = currentChar;\n          continue;\n        } else { // UTF8 sequence\n          const unsigned char *nextValidCharacter = NULL;\n          UTF32                u32ch              = 0U;\n          ConversionResult     result;\n          \n          if(JK_EXPECT_F((result = ConvertSingleCodePointInUTF8(atStringCharacter, endOfBuffer, (UTF8 const **)&nextValidCharacter, &u32ch)) != conversionOK)) {\n            if((result == sourceIllegal) && ((parseState->parseOptionFlags & JKParseOptionLooseUnicode) == 0)) { jk_error(parseState, @\"Illegal UTF8 sequence found in \\\"\\\" string.\");              stringState = JSONStringStateError; goto finishedParsing; }\n            if(result == sourceExhausted)                                                                      { jk_error(parseState, @\"End of buffer reached while parsing UTF8 in \\\"\\\" string.\"); stringState = JSONStringStateError; goto finishedParsing; }\n            if(jk_string_add_unicodeCodePoint(parseState, u32ch, &tokenBufferIdx, &stringHash))                { jk_error(parseState, @\"Internal error: Unable to add UTF8 sequence to internal string buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; }\n            atStringCharacter = nextValidCharacter - 1;\n            continue;\n          } else {\n            while(atStringCharacter < nextValidCharacter) { tokenBuffer[tokenBufferIdx++] = *atStringCharacter; stringHash = jk_calculateHash(stringHash, *atStringCharacter++); }\n            atStringCharacter--;\n            continue;\n          }\n        }\n      } else { // currentChar < 0x20\n        jk_error(parseState, @\"Invalid character < 0x20 found in string: 0x%2.2x.\", currentChar); stringState = JSONStringStateError; goto finishedParsing;\n      }\n\n    } else { // stringState != JSONStringStateParsing\n      int isSurrogate = 1;\n\n      switch(stringState) {\n        case JSONStringStateEscape:\n          switch(currentChar) {\n            case 'u': escapedUnicode1 = 0U; escapedUnicode2 = 0U; escapedUnicodeCodePoint = 0U; stringState = JSONStringStateEscapedUnicode1; break;\n\n            case 'b':  escapedChar = '\\b'; goto parsedEscapedChar;\n            case 'f':  escapedChar = '\\f'; goto parsedEscapedChar;\n            case 'n':  escapedChar = '\\n'; goto parsedEscapedChar;\n            case 'r':  escapedChar = '\\r'; goto parsedEscapedChar;\n            case 't':  escapedChar = '\\t'; goto parsedEscapedChar;\n            case '\\\\': escapedChar = '\\\\'; goto parsedEscapedChar;\n            case '/':  escapedChar = '/';  goto parsedEscapedChar;\n            case '\"':  escapedChar = '\"';  goto parsedEscapedChar;\n              \n            parsedEscapedChar:\n              stringState = JSONStringStateParsing;\n              stringHash  = jk_calculateHash(stringHash, escapedChar);\n              tokenBuffer[tokenBufferIdx++] = escapedChar;\n              break;\n              \n            default: jk_error(parseState, @\"Invalid escape sequence found in \\\"\\\" string.\"); stringState = JSONStringStateError; goto finishedParsing; break;\n          }\n          break;\n\n        case JSONStringStateEscapedUnicode1:\n        case JSONStringStateEscapedUnicode2:\n        case JSONStringStateEscapedUnicode3:\n        case JSONStringStateEscapedUnicode4:           isSurrogate = 0;\n        case JSONStringStateEscapedUnicodeSurrogate1:\n        case JSONStringStateEscapedUnicodeSurrogate2:\n        case JSONStringStateEscapedUnicodeSurrogate3:\n        case JSONStringStateEscapedUnicodeSurrogate4:\n          {\n            uint16_t hexValue = 0U;\n\n            switch(currentChar) {\n              case '0' ... '9': hexValue =  currentChar - '0';        goto parsedHex;\n              case 'a' ... 'f': hexValue = (currentChar - 'a') + 10U; goto parsedHex;\n              case 'A' ... 'F': hexValue = (currentChar - 'A') + 10U; goto parsedHex;\n                \n              parsedHex:\n              if(!isSurrogate) { escapedUnicode1 = (escapedUnicode1 << 4) | hexValue; } else { escapedUnicode2 = (escapedUnicode2 << 4) | hexValue; }\n                \n              if(stringState == JSONStringStateEscapedUnicode4) {\n                if(((escapedUnicode1 >= 0xD800U) && (escapedUnicode1 < 0xE000U))) {\n                  if((escapedUnicode1 >= 0xD800U) && (escapedUnicode1 < 0xDC00U)) { stringState = JSONStringStateEscapedNeedEscapeForSurrogate; }\n                  else if((escapedUnicode1 >= 0xDC00U) && (escapedUnicode1 < 0xE000U)) { \n                    if((parseState->parseOptionFlags & JKParseOptionLooseUnicode)) { escapedUnicodeCodePoint = UNI_REPLACEMENT_CHAR; }\n                    else { jk_error(parseState, @\"Illegal \\\\u Unicode escape sequence.\"); stringState = JSONStringStateError; goto finishedParsing; }\n                  }\n                }\n                else { escapedUnicodeCodePoint = escapedUnicode1; }\n              }\n\n              if(stringState == JSONStringStateEscapedUnicodeSurrogate4) {\n                if((escapedUnicode2 < 0xdc00) || (escapedUnicode2 > 0xdfff)) {\n                  if((parseState->parseOptionFlags & JKParseOptionLooseUnicode)) { escapedUnicodeCodePoint = UNI_REPLACEMENT_CHAR; }\n                  else { jk_error(parseState, @\"Illegal \\\\u Unicode escape sequence.\"); stringState = JSONStringStateError; goto finishedParsing; }\n                }\n                else { escapedUnicodeCodePoint = ((escapedUnicode1 - 0xd800) * 0x400) + (escapedUnicode2 - 0xdc00) + 0x10000; }\n              }\n                \n              if((stringState == JSONStringStateEscapedUnicode4) || (stringState == JSONStringStateEscapedUnicodeSurrogate4)) { \n                if((isValidCodePoint(&escapedUnicodeCodePoint) == sourceIllegal) && ((parseState->parseOptionFlags & JKParseOptionLooseUnicode) == 0)) { jk_error(parseState, @\"Illegal \\\\u Unicode escape sequence.\"); stringState = JSONStringStateError; goto finishedParsing; }\n                stringState = JSONStringStateParsing;\n                if(jk_string_add_unicodeCodePoint(parseState, escapedUnicodeCodePoint, &tokenBufferIdx, &stringHash)) { jk_error(parseState, @\"Internal error: Unable to add UTF8 sequence to internal string buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; }\n              }\n              else if((stringState >= JSONStringStateEscapedUnicode1) && (stringState <= JSONStringStateEscapedUnicodeSurrogate4)) { stringState++; }\n              break;\n\n              default: jk_error(parseState, @\"Unexpected character found in \\\\u Unicode escape sequence.  Found '%c', expected [0-9a-fA-F].\", currentChar); stringState = JSONStringStateError; goto finishedParsing; break;\n            }\n          }\n          break;\n\n        case JSONStringStateEscapedNeedEscapeForSurrogate:\n          if(currentChar == '\\\\') { stringState = JSONStringStateEscapedNeedEscapedUForSurrogate; }\n          else { \n            if((parseState->parseOptionFlags & JKParseOptionLooseUnicode) == 0) { jk_error(parseState, @\"Required a second \\\\u Unicode escape sequence following a surrogate \\\\u Unicode escape sequence.\"); stringState = JSONStringStateError; goto finishedParsing; }\n            else { stringState = JSONStringStateParsing; atStringCharacter--;    if(jk_string_add_unicodeCodePoint(parseState, UNI_REPLACEMENT_CHAR, &tokenBufferIdx, &stringHash)) { jk_error(parseState, @\"Internal error: Unable to add UTF8 sequence to internal string buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; } }\n          }\n          break;\n\n        case JSONStringStateEscapedNeedEscapedUForSurrogate:\n          if(currentChar == 'u') { stringState = JSONStringStateEscapedUnicodeSurrogate1; }\n          else { \n            if((parseState->parseOptionFlags & JKParseOptionLooseUnicode) == 0) { jk_error(parseState, @\"Required a second \\\\u Unicode escape sequence following a surrogate \\\\u Unicode escape sequence.\"); stringState = JSONStringStateError; goto finishedParsing; }\n            else { stringState = JSONStringStateParsing; atStringCharacter -= 2; if(jk_string_add_unicodeCodePoint(parseState, UNI_REPLACEMENT_CHAR, &tokenBufferIdx, &stringHash)) { jk_error(parseState, @\"Internal error: Unable to add UTF8 sequence to internal string buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; } }\n          }\n          break;\n\n        default: jk_error(parseState, @\"Internal error: Unknown stringState. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; break;\n      }\n    }\n  }\n\nfinishedParsing:\n\n  if(JK_EXPECT_T(stringState == JSONStringStateFinished)) {\n    NSCParameterAssert((parseState->stringBuffer.bytes.ptr + tokenStartIndex) < atStringCharacter);\n\n    parseState->token.tokenPtrRange.ptr    = parseState->stringBuffer.bytes.ptr + tokenStartIndex;\n    parseState->token.tokenPtrRange.length = (atStringCharacter - parseState->token.tokenPtrRange.ptr);\n\n    if(JK_EXPECT_T(onlySimpleString)) {\n      NSCParameterAssert(((parseState->token.tokenPtrRange.ptr + 1) < endOfBuffer) && (parseState->token.tokenPtrRange.length >= 2UL) && (((parseState->token.tokenPtrRange.ptr + 1) + (parseState->token.tokenPtrRange.length - 2)) < endOfBuffer));\n      parseState->token.value.ptrRange.ptr    = parseState->token.tokenPtrRange.ptr    + 1;\n      parseState->token.value.ptrRange.length = parseState->token.tokenPtrRange.length - 2UL;\n    } else {\n      parseState->token.value.ptrRange.ptr    = parseState->token.tokenBuffer.bytes.ptr;\n      parseState->token.value.ptrRange.length = tokenBufferIdx;\n    }\n    \n    parseState->token.value.hash = stringHash;\n    parseState->token.value.type = JKValueTypeString;\n    parseState->atIndex          = (atStringCharacter - parseState->stringBuffer.bytes.ptr);\n  }\n\n  if(JK_EXPECT_F(stringState != JSONStringStateFinished)) { jk_error(parseState, @\"Invalid string.\"); }\n  return(JK_EXPECT_T(stringState == JSONStringStateFinished) ? 0 : 1);\n}\n\nstatic int jk_parse_number(JKParseState *parseState) {\n  NSCParameterAssert((parseState != NULL) && (JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)));\n  const unsigned char *numberStart       = JK_AT_STRING_PTR(parseState);\n  const unsigned char *endOfBuffer       = JK_END_STRING_PTR(parseState);\n  const unsigned char *atNumberCharacter = NULL;\n  int                  numberState       = JSONNumberStateWholeNumberStart, isFloatingPoint = 0, isNegative = 0, backup = 0;\n  size_t               startingIndex     = parseState->atIndex;\n  \n  for(atNumberCharacter = numberStart; (JK_EXPECT_T(atNumberCharacter < endOfBuffer)) && (JK_EXPECT_T(!(JK_EXPECT_F(numberState == JSONNumberStateFinished) || JK_EXPECT_F(numberState == JSONNumberStateError)))); atNumberCharacter++) {\n    unsigned long currentChar = (unsigned long)(*atNumberCharacter), lowerCaseCC = currentChar | 0x20UL;\n    \n    switch(numberState) {\n      case JSONNumberStateWholeNumberStart: if   (currentChar == '-')                                                                              { numberState = JSONNumberStateWholeNumberMinus;      isNegative      = 1; break; }\n      case JSONNumberStateWholeNumberMinus: if   (currentChar == '0')                                                                              { numberState = JSONNumberStateWholeNumberZero;                            break; }\n                                       else if(  (currentChar >= '1') && (currentChar <= '9'))                                                     { numberState = JSONNumberStateWholeNumber;                                break; }\n                                       else                                                     { /* XXX Add error message */                        numberState = JSONNumberStateError;                                      break; }\n      case JSONNumberStateExponentStart:    if(  (currentChar == '+') || (currentChar == '-'))                                                     { numberState = JSONNumberStateExponentPlusMinus;                          break; }\n      case JSONNumberStateFractionalNumberStart:\n      case JSONNumberStateExponentPlusMinus:if(!((currentChar >= '0') && (currentChar <= '9'))) { /* XXX Add error message */                        numberState = JSONNumberStateError;                                      break; }\n                                       else {                                              if(numberState == JSONNumberStateFractionalNumberStart) { numberState = JSONNumberStateFractionalNumber; }\n                                                                                           else                                                    { numberState = JSONNumberStateExponent;         }                         break; }\n      case JSONNumberStateWholeNumberZero:\n      case JSONNumberStateWholeNumber:      if   (currentChar == '.')                                                                              { numberState = JSONNumberStateFractionalNumberStart; isFloatingPoint = 1; break; }\n      case JSONNumberStateFractionalNumber: if   (lowerCaseCC == 'e')                                                                              { numberState = JSONNumberStateExponentStart;         isFloatingPoint = 1; break; }\n      case JSONNumberStateExponent:         if(!((currentChar >= '0') && (currentChar <= '9')) || (numberState == JSONNumberStateWholeNumberZero)) { numberState = JSONNumberStateFinished;              backup          = 1; break; }\n        break;\n      default:                                                                                    /* XXX Add error message */                        numberState = JSONNumberStateError;                                      break;\n    }\n  }\n  \n  parseState->token.tokenPtrRange.ptr    = parseState->stringBuffer.bytes.ptr + startingIndex;\n  parseState->token.tokenPtrRange.length = (atNumberCharacter - parseState->token.tokenPtrRange.ptr) - backup;\n  parseState->atIndex                    = (parseState->token.tokenPtrRange.ptr + parseState->token.tokenPtrRange.length) - parseState->stringBuffer.bytes.ptr;\n\n  if(JK_EXPECT_T(numberState == JSONNumberStateFinished)) {\n    unsigned char  numberTempBuf[parseState->token.tokenPtrRange.length + 4UL];\n    unsigned char *endOfNumber = NULL;\n\n    memcpy(numberTempBuf, parseState->token.tokenPtrRange.ptr, parseState->token.tokenPtrRange.length);\n    numberTempBuf[parseState->token.tokenPtrRange.length] = 0;\n\n    errno = 0;\n    \n    // Treat \"-0\" as a floating point number, which is capable of representing negative zeros.\n    if(JK_EXPECT_F(parseState->token.tokenPtrRange.length == 2UL) && JK_EXPECT_F(numberTempBuf[1] == '0') && JK_EXPECT_F(isNegative)) { isFloatingPoint = 1; }\n\n    if(isFloatingPoint) {\n      parseState->token.value.number.doubleValue = strtod((const char *)numberTempBuf, (char **)&endOfNumber); // strtod is documented to return U+2261 (identical to) 0.0 on an underflow error (along with setting errno to ERANGE).\n      parseState->token.value.type               = JKValueTypeDouble;\n      parseState->token.value.ptrRange.ptr       = (const unsigned char *)&parseState->token.value.number.doubleValue;\n      parseState->token.value.ptrRange.length    = sizeof(double);\n      parseState->token.value.hash               = (JK_HASH_INIT + parseState->token.value.type);\n    } else {\n      if(isNegative) {\n        parseState->token.value.number.longLongValue = strtoll((const char *)numberTempBuf, (char **)&endOfNumber, 10);\n        parseState->token.value.type                 = JKValueTypeLongLong;\n        parseState->token.value.ptrRange.ptr         = (const unsigned char *)&parseState->token.value.number.longLongValue;\n        parseState->token.value.ptrRange.length      = sizeof(long long);\n        parseState->token.value.hash                 = (JK_HASH_INIT + parseState->token.value.type) + (JKHash)parseState->token.value.number.longLongValue;\n      } else {\n        parseState->token.value.number.unsignedLongLongValue = strtoull((const char *)numberTempBuf, (char **)&endOfNumber, 10);\n        parseState->token.value.type                         = JKValueTypeUnsignedLongLong;\n        parseState->token.value.ptrRange.ptr                 = (const unsigned char *)&parseState->token.value.number.unsignedLongLongValue;\n        parseState->token.value.ptrRange.length              = sizeof(unsigned long long);\n        parseState->token.value.hash                         = (JK_HASH_INIT + parseState->token.value.type) + (JKHash)parseState->token.value.number.unsignedLongLongValue;\n      }\n    }\n\n    if(JK_EXPECT_F(errno != 0)) {\n      numberState = JSONNumberStateError;\n      if(errno == ERANGE) {\n        switch(parseState->token.value.type) {\n          case JKValueTypeDouble:           jk_error(parseState, @\"The value '%s' could not be represented as a 'double' due to %s.\",           numberTempBuf, (parseState->token.value.number.doubleValue == 0.0) ? \"underflow\" : \"overflow\"); break; // see above for == 0.0.\n          case JKValueTypeLongLong:         jk_error(parseState, @\"The value '%s' exceeded the minimum value that could be represented: %lld.\", numberTempBuf, parseState->token.value.number.longLongValue);                                   break;\n          case JKValueTypeUnsignedLongLong: jk_error(parseState, @\"The value '%s' exceeded the maximum value that could be represented: %llu.\", numberTempBuf, parseState->token.value.number.unsignedLongLongValue);                           break;\n          default:                          jk_error(parseState, @\"Internal error: Unknown token value type. %@ line #%ld\",                     [NSString stringWithUTF8String:__FILE__], (long)__LINE__);                                      break;\n        }\n      }\n    }\n    if(JK_EXPECT_F(endOfNumber != &numberTempBuf[parseState->token.tokenPtrRange.length]) && JK_EXPECT_F(numberState != JSONNumberStateError)) { numberState = JSONNumberStateError; jk_error(parseState, @\"The conversion function did not consume all of the number tokens characters.\"); }\n\n    size_t hashIndex = 0UL;\n    for(hashIndex = 0UL; hashIndex < parseState->token.value.ptrRange.length; hashIndex++) { parseState->token.value.hash = jk_calculateHash(parseState->token.value.hash, parseState->token.value.ptrRange.ptr[hashIndex]); }\n  }\n\n  if(JK_EXPECT_F(numberState != JSONNumberStateFinished)) { jk_error(parseState, @\"Invalid number.\"); }\n  return(JK_EXPECT_T((numberState == JSONNumberStateFinished)) ? 0 : 1);\n}\n\nJK_STATIC_INLINE void jk_set_parsed_token(JKParseState *parseState, const unsigned char *ptr, size_t length, JKTokenType type, size_t advanceBy) {\n  parseState->token.tokenPtrRange.ptr     = ptr;\n  parseState->token.tokenPtrRange.length  = length;\n  parseState->token.type                  = type;\n  parseState->atIndex                    += advanceBy;\n}\n\nstatic size_t jk_parse_is_newline(JKParseState *parseState, const unsigned char *atCharacterPtr) {\n  NSCParameterAssert((parseState != NULL) && (atCharacterPtr != NULL) && (atCharacterPtr >= parseState->stringBuffer.bytes.ptr) && (atCharacterPtr < JK_END_STRING_PTR(parseState)));\n  const unsigned char *endOfStringPtr = JK_END_STRING_PTR(parseState);\n\n  if(JK_EXPECT_F(atCharacterPtr >= endOfStringPtr)) { return(0UL); }\n\n  if(JK_EXPECT_F((*(atCharacterPtr + 0)) == '\\n')) { return(1UL); }\n  if(JK_EXPECT_F((*(atCharacterPtr + 0)) == '\\r')) { if((JK_EXPECT_T((atCharacterPtr + 1) < endOfStringPtr)) && ((*(atCharacterPtr + 1)) == '\\n')) { return(2UL); } return(1UL); }\n  if(parseState->parseOptionFlags & JKParseOptionUnicodeNewlines) {\n    if((JK_EXPECT_F((*(atCharacterPtr + 0)) == 0xc2)) && (((atCharacterPtr + 1) < endOfStringPtr) && ((*(atCharacterPtr + 1)) == 0x85))) { return(2UL); }\n    if((JK_EXPECT_F((*(atCharacterPtr + 0)) == 0xe2)) && (((atCharacterPtr + 2) < endOfStringPtr) && ((*(atCharacterPtr + 1)) == 0x80) && (((*(atCharacterPtr + 2)) == 0xa8) || ((*(atCharacterPtr + 2)) == 0xa9)))) { return(3UL); }\n  }\n\n  return(0UL);\n}\n\nJK_STATIC_INLINE int jk_parse_skip_newline(JKParseState *parseState) {\n  size_t newlineAdvanceAtIndex = 0UL;\n  if(JK_EXPECT_F((newlineAdvanceAtIndex = jk_parse_is_newline(parseState, JK_AT_STRING_PTR(parseState))) > 0UL)) { parseState->lineNumber++; parseState->atIndex += (newlineAdvanceAtIndex - 1UL); parseState->lineStartIndex = parseState->atIndex + 1UL; return(1); }\n  return(0);\n}\n\nJK_STATIC_INLINE void jk_parse_skip_whitespace(JKParseState *parseState) {\n#ifndef __clang_analyzer__\n  NSCParameterAssert((parseState != NULL) && (JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)));\n  const unsigned char *atCharacterPtr   = NULL;\n  const unsigned char *endOfStringPtr   = JK_END_STRING_PTR(parseState);\n\n  for(atCharacterPtr = JK_AT_STRING_PTR(parseState); (JK_EXPECT_T((atCharacterPtr = JK_AT_STRING_PTR(parseState)) < endOfStringPtr)); parseState->atIndex++) {\n    if(((*(atCharacterPtr + 0)) == ' ') || ((*(atCharacterPtr + 0)) == '\\t')) { continue; }\n    if(jk_parse_skip_newline(parseState)) { continue; }\n    if(parseState->parseOptionFlags & JKParseOptionComments) {\n      if((JK_EXPECT_F((*(atCharacterPtr + 0)) == '/')) && (JK_EXPECT_T((atCharacterPtr + 1) < endOfStringPtr))) {\n        if((*(atCharacterPtr + 1)) == '/') {\n          parseState->atIndex++;\n          for(atCharacterPtr = JK_AT_STRING_PTR(parseState); (JK_EXPECT_T((atCharacterPtr = JK_AT_STRING_PTR(parseState)) < endOfStringPtr)); parseState->atIndex++) { if(jk_parse_skip_newline(parseState)) { break; } }\n          continue;\n        }\n        if((*(atCharacterPtr + 1)) == '*') {\n          parseState->atIndex++;\n          for(atCharacterPtr = JK_AT_STRING_PTR(parseState); (JK_EXPECT_T((atCharacterPtr = JK_AT_STRING_PTR(parseState)) < endOfStringPtr)); parseState->atIndex++) {\n            if(jk_parse_skip_newline(parseState)) { continue; }\n            if(((*(atCharacterPtr + 0)) == '*') && (((atCharacterPtr + 1) < endOfStringPtr) && ((*(atCharacterPtr + 1)) == '/'))) { parseState->atIndex++; break; }\n          }\n          continue;\n        }\n      }\n    }\n    break;\n  }\n#endif\n}\n\nstatic int jk_parse_next_token(JKParseState *parseState) {\n  NSCParameterAssert((parseState != NULL) && (JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)));\n  const unsigned char *atCharacterPtr   = NULL;\n  const unsigned char *endOfStringPtr   = JK_END_STRING_PTR(parseState);\n  unsigned char        currentCharacter = 0U;\n  int                  stopParsing      = 0;\n\n  parseState->prev_atIndex        = parseState->atIndex;\n  parseState->prev_lineNumber     = parseState->lineNumber;\n  parseState->prev_lineStartIndex = parseState->lineStartIndex;\n\n  jk_parse_skip_whitespace(parseState);\n\n  if((JK_AT_STRING_PTR(parseState) == endOfStringPtr)) { stopParsing = 1; }\n\n  if((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T((atCharacterPtr = JK_AT_STRING_PTR(parseState)) < endOfStringPtr))) {\n    currentCharacter = *atCharacterPtr;\n\n         if(JK_EXPECT_T(currentCharacter == '\"')) { if(JK_EXPECT_T((stopParsing = jk_parse_string(parseState)) == 0)) { jk_set_parsed_token(parseState, parseState->token.tokenPtrRange.ptr, parseState->token.tokenPtrRange.length, JKTokenTypeString, 0UL); } }\n    else if(JK_EXPECT_T(currentCharacter == ':')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeSeparator,   1UL); }\n    else if(JK_EXPECT_T(currentCharacter == ',')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeComma,       1UL); }\n    else if((JK_EXPECT_T(currentCharacter >= '0') && JK_EXPECT_T(currentCharacter <= '9')) || JK_EXPECT_T(currentCharacter == '-')) { if(JK_EXPECT_T((stopParsing = jk_parse_number(parseState)) == 0)) { jk_set_parsed_token(parseState, parseState->token.tokenPtrRange.ptr, parseState->token.tokenPtrRange.length, JKTokenTypeNumber, 0UL); } }\n    else if(JK_EXPECT_T(currentCharacter == '{')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeObjectBegin, 1UL); }\n    else if(JK_EXPECT_T(currentCharacter == '}')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeObjectEnd,   1UL); }\n    else if(JK_EXPECT_T(currentCharacter == '[')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeArrayBegin,  1UL); }\n    else if(JK_EXPECT_T(currentCharacter == ']')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeArrayEnd,    1UL); }\n    \n    else if(JK_EXPECT_T(currentCharacter == 't')) { if(!((JK_EXPECT_T((atCharacterPtr + 4UL) < endOfStringPtr)) && (JK_EXPECT_T(atCharacterPtr[1] == 'r')) && (JK_EXPECT_T(atCharacterPtr[2] == 'u')) && (JK_EXPECT_T(atCharacterPtr[3] == 'e'))))                                            { stopParsing = 1; /* XXX Add error message */ } else { jk_set_parsed_token(parseState, atCharacterPtr, 4UL, JKTokenTypeTrue,  4UL); } }\n    else if(JK_EXPECT_T(currentCharacter == 'f')) { if(!((JK_EXPECT_T((atCharacterPtr + 5UL) < endOfStringPtr)) && (JK_EXPECT_T(atCharacterPtr[1] == 'a')) && (JK_EXPECT_T(atCharacterPtr[2] == 'l')) && (JK_EXPECT_T(atCharacterPtr[3] == 's')) && (JK_EXPECT_T(atCharacterPtr[4] == 'e')))) { stopParsing = 1; /* XXX Add error message */ } else { jk_set_parsed_token(parseState, atCharacterPtr, 5UL, JKTokenTypeFalse, 5UL); } }\n    else if(JK_EXPECT_T(currentCharacter == 'n')) { if(!((JK_EXPECT_T((atCharacterPtr + 4UL) < endOfStringPtr)) && (JK_EXPECT_T(atCharacterPtr[1] == 'u')) && (JK_EXPECT_T(atCharacterPtr[2] == 'l')) && (JK_EXPECT_T(atCharacterPtr[3] == 'l'))))                                            { stopParsing = 1; /* XXX Add error message */ } else { jk_set_parsed_token(parseState, atCharacterPtr, 4UL, JKTokenTypeNull,  4UL); } }\n    else { stopParsing = 1; /* XXX Add error message */ }    \n  }\n\n  if(JK_EXPECT_F(stopParsing)) { jk_error(parseState, @\"Unexpected token, wanted '{', '}', '[', ']', ',', ':', 'true', 'false', 'null', '\\\"STRING\\\"', 'NUMBER'.\"); }\n  return(stopParsing);\n}\n\nstatic void jk_error_parse_accept_or3(JKParseState *parseState, int state, NSString *or1String, NSString *or2String, NSString *or3String) {\n  NSString *acceptStrings[16];\n  int acceptIdx = 0;\n  if(state & JKParseAcceptValue) { acceptStrings[acceptIdx++] = or1String; }\n  if(state & JKParseAcceptComma) { acceptStrings[acceptIdx++] = or2String; }\n  if(state & JKParseAcceptEnd)   { acceptStrings[acceptIdx++] = or3String; }\n       if(acceptIdx == 1) { jk_error(parseState, @\"Expected %@, not '%*.*s'\",           acceptStrings[0],                                     (int)parseState->token.tokenPtrRange.length, (int)parseState->token.tokenPtrRange.length, parseState->token.tokenPtrRange.ptr); }\n  else if(acceptIdx == 2) { jk_error(parseState, @\"Expected %@ or %@, not '%*.*s'\",     acceptStrings[0], acceptStrings[1],                   (int)parseState->token.tokenPtrRange.length, (int)parseState->token.tokenPtrRange.length, parseState->token.tokenPtrRange.ptr); }\n  else if(acceptIdx == 3) { jk_error(parseState, @\"Expected %@, %@, or %@, not '%*.*s\", acceptStrings[0], acceptStrings[1], acceptStrings[2], (int)parseState->token.tokenPtrRange.length, (int)parseState->token.tokenPtrRange.length, parseState->token.tokenPtrRange.ptr); }\n}\n\nstatic void *jk_parse_array(JKParseState *parseState) {\n  size_t  startingObjectIndex = parseState->objectStack.index;\n  int     arrayState          = JKParseAcceptValueOrEnd, stopParsing = 0;\n  void   *parsedArray         = NULL;\n\n  while(JK_EXPECT_T((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T(parseState->atIndex < parseState->stringBuffer.bytes.length)))) {\n    if(JK_EXPECT_F(parseState->objectStack.index > (parseState->objectStack.count - 4UL))) { if(jk_objectStack_resize(&parseState->objectStack, parseState->objectStack.count + 128UL)) { jk_error(parseState, @\"Internal error: [array] objectsIndex > %zu, resize failed? %@ line %#ld\", (parseState->objectStack.count - 4UL), [NSString stringWithUTF8String:__FILE__], (long)__LINE__); break; } }\n\n    if(JK_EXPECT_T((stopParsing = jk_parse_next_token(parseState)) == 0)) {\n      void *object = NULL;\n#ifndef NS_BLOCK_ASSERTIONS\n      parseState->objectStack.objects[parseState->objectStack.index] = NULL;\n      parseState->objectStack.keys   [parseState->objectStack.index] = NULL;\n#endif\n      switch(parseState->token.type) {\n        case JKTokenTypeNumber:\n        case JKTokenTypeString:\n        case JKTokenTypeTrue:\n        case JKTokenTypeFalse:\n        case JKTokenTypeNull:\n        case JKTokenTypeArrayBegin:\n        case JKTokenTypeObjectBegin:\n          if(JK_EXPECT_F((arrayState & JKParseAcceptValue)          == 0))    { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected value.\");              stopParsing = 1; break; }\n          if(JK_EXPECT_F((object = jk_object_for_token(parseState)) == NULL)) {                              jk_error(parseState, @\"Internal error: Object == NULL\"); stopParsing = 1; break; } else { parseState->objectStack.objects[parseState->objectStack.index++] = object; arrayState = JKParseAcceptCommaOrEnd; }\n          break;\n        case JKTokenTypeArrayEnd: if(JK_EXPECT_T(arrayState & JKParseAcceptEnd)) { NSCParameterAssert(parseState->objectStack.index >= startingObjectIndex); parsedArray = (void *)_JKArrayCreate((id *)&parseState->objectStack.objects[startingObjectIndex], (parseState->objectStack.index - startingObjectIndex), parseState->mutableCollections); } else { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected ']'.\"); } stopParsing = 1; break;\n        case JKTokenTypeComma:    if(JK_EXPECT_T(arrayState & JKParseAcceptComma)) { arrayState = JKParseAcceptValue; } else { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected ','.\"); stopParsing = 1; } break;\n        default: parseState->errorIsPrev = 1; jk_error_parse_accept_or3(parseState, arrayState, @\"a value\", @\"a comma\", @\"a ']'\"); stopParsing = 1; break;\n      }\n    }\n  }\n\n  if(JK_EXPECT_F(parsedArray == NULL)) { size_t idx = 0UL; for(idx = startingObjectIndex; idx < parseState->objectStack.index; idx++) { if(parseState->objectStack.objects[idx] != NULL) { CFRelease(parseState->objectStack.objects[idx]); parseState->objectStack.objects[idx] = NULL; } } }\n#if !defined(NS_BLOCK_ASSERTIONS)\n  else { size_t idx = 0UL; for(idx = startingObjectIndex; idx < parseState->objectStack.index; idx++) { parseState->objectStack.objects[idx] = NULL; parseState->objectStack.keys[idx] = NULL; } }\n#endif\n  \n  parseState->objectStack.index = startingObjectIndex;\n  return(parsedArray);\n}\n\nstatic void *jk_create_dictionary(JKParseState *parseState, size_t startingObjectIndex) {\n  void *parsedDictionary = NULL;\n\n  parseState->objectStack.index--;\n\n  parsedDictionary = _JKDictionaryCreate((id *)&parseState->objectStack.keys[startingObjectIndex], (NSUInteger *)&parseState->objectStack.cfHashes[startingObjectIndex], (id *)&parseState->objectStack.objects[startingObjectIndex], (parseState->objectStack.index - startingObjectIndex), parseState->mutableCollections);\n\n  return(parsedDictionary);\n}\n\nstatic void *jk_parse_dictionary(JKParseState *parseState) {\n  size_t  startingObjectIndex = parseState->objectStack.index;\n  int     dictState           = JKParseAcceptValueOrEnd, stopParsing = 0;\n  void   *parsedDictionary    = NULL;\n\n  while(JK_EXPECT_T((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T(parseState->atIndex < parseState->stringBuffer.bytes.length)))) {\n    if(JK_EXPECT_F(parseState->objectStack.index > (parseState->objectStack.count - 4UL))) { if(jk_objectStack_resize(&parseState->objectStack, parseState->objectStack.count + 128UL)) { jk_error(parseState, @\"Internal error: [dictionary] objectsIndex > %zu, resize failed? %@ line #%ld\", (parseState->objectStack.count - 4UL), [NSString stringWithUTF8String:__FILE__], (long)__LINE__); break; } }\n\n    size_t objectStackIndex = parseState->objectStack.index++;\n    parseState->objectStack.keys[objectStackIndex]    = NULL;\n    parseState->objectStack.objects[objectStackIndex] = NULL;\n    void *key = NULL, *object = NULL;\n\n    if(JK_EXPECT_T((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T((stopParsing = jk_parse_next_token(parseState)) == 0)))) {\n      switch(parseState->token.type) {\n        case JKTokenTypeString:\n          if(JK_EXPECT_F((dictState & JKParseAcceptValue)        == 0))    { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected string.\");           stopParsing = 1; break; }\n          if(JK_EXPECT_F((key = jk_object_for_token(parseState)) == NULL)) {                              jk_error(parseState, @\"Internal error: Key == NULL.\"); stopParsing = 1; break; }\n          else {\n            parseState->objectStack.keys[objectStackIndex] = key;\n            if(JK_EXPECT_T(parseState->token.value.cacheItem != NULL)) { if(JK_EXPECT_F(parseState->token.value.cacheItem->cfHash == 0UL)) { parseState->token.value.cacheItem->cfHash = CFHash(key); } parseState->objectStack.cfHashes[objectStackIndex] = parseState->token.value.cacheItem->cfHash; }\n            else { parseState->objectStack.cfHashes[objectStackIndex] = CFHash(key); }\n          }\n          break;\n\n        case JKTokenTypeObjectEnd: if((JK_EXPECT_T(dictState & JKParseAcceptEnd)))   { NSCParameterAssert(parseState->objectStack.index >= startingObjectIndex); parsedDictionary = jk_create_dictionary(parseState, startingObjectIndex); } else { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected '}'.\"); } stopParsing = 1; break;\n        case JKTokenTypeComma:     if((JK_EXPECT_T(dictState & JKParseAcceptComma))) { dictState = JKParseAcceptValue; parseState->objectStack.index--; continue; } else { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected ','.\"); stopParsing = 1; } break;\n\n        default: parseState->errorIsPrev = 1; jk_error_parse_accept_or3(parseState, dictState, @\"a \\\"STRING\\\"\", @\"a comma\", @\"a '}'\"); stopParsing = 1; break;\n      }\n    }\n\n    if(JK_EXPECT_T(stopParsing == 0)) {\n      if(JK_EXPECT_T((stopParsing = jk_parse_next_token(parseState)) == 0)) { if(JK_EXPECT_F(parseState->token.type != JKTokenTypeSeparator)) { parseState->errorIsPrev = 1; jk_error(parseState, @\"Expected ':'.\"); stopParsing = 1; } }\n    }\n\n    if((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T((stopParsing = jk_parse_next_token(parseState)) == 0))) {\n      switch(parseState->token.type) {\n        case JKTokenTypeNumber:\n        case JKTokenTypeString:\n        case JKTokenTypeTrue:\n        case JKTokenTypeFalse:\n        case JKTokenTypeNull:\n        case JKTokenTypeArrayBegin:\n        case JKTokenTypeObjectBegin:\n          if(JK_EXPECT_F((dictState & JKParseAcceptValue)           == 0))    { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected value.\");               stopParsing = 1; break; }\n          if(JK_EXPECT_F((object = jk_object_for_token(parseState)) == NULL)) {                              jk_error(parseState, @\"Internal error: Object == NULL.\"); stopParsing = 1; break; } else { parseState->objectStack.objects[objectStackIndex] = object; dictState = JKParseAcceptCommaOrEnd; }\n          break;\n        default: parseState->errorIsPrev = 1; jk_error_parse_accept_or3(parseState, dictState, @\"a value\", @\"a comma\", @\"a '}'\"); stopParsing = 1; break;\n      }\n    }\n  }\n\n  if(JK_EXPECT_F(parsedDictionary == NULL)) { size_t idx = 0UL; for(idx = startingObjectIndex; idx < parseState->objectStack.index; idx++) { if(parseState->objectStack.keys[idx] != NULL) { CFRelease(parseState->objectStack.keys[idx]); parseState->objectStack.keys[idx] = NULL; } if(parseState->objectStack.objects[idx] != NULL) { CFRelease(parseState->objectStack.objects[idx]); parseState->objectStack.objects[idx] = NULL; } } }\n#if !defined(NS_BLOCK_ASSERTIONS)\n  else { size_t idx = 0UL; for(idx = startingObjectIndex; idx < parseState->objectStack.index; idx++) { parseState->objectStack.objects[idx] = NULL; parseState->objectStack.keys[idx] = NULL; } }\n#endif\n\n  parseState->objectStack.index = startingObjectIndex;\n  return(parsedDictionary);\n}\n\nstatic id json_parse_it(JKParseState *parseState) {\n  id  parsedObject = NULL;\n  int stopParsing  = 0;\n\n  while((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T(parseState->atIndex < parseState->stringBuffer.bytes.length))) {\n    if((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T((stopParsing = jk_parse_next_token(parseState)) == 0))) {\n      switch(parseState->token.type) {\n        case JKTokenTypeArrayBegin:\n        case JKTokenTypeObjectBegin: parsedObject = [(id)jk_object_for_token(parseState) autorelease]; stopParsing = 1; break;\n        default:                     jk_error(parseState, @\"Expected either '[' or '{'.\");             stopParsing = 1; break;\n      }\n    }\n  }\n\n  NSCParameterAssert((parseState->objectStack.index == 0) && (JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)));\n\n  if((parsedObject == NULL) && (JK_AT_STRING_PTR(parseState) == JK_END_STRING_PTR(parseState))) { jk_error(parseState, @\"Reached the end of the buffer.\"); }\n  if(parsedObject == NULL) { jk_error(parseState, @\"Unable to parse JSON.\"); }\n\n  if((parsedObject != NULL) && (JK_AT_STRING_PTR(parseState) < JK_END_STRING_PTR(parseState))) {\n    jk_parse_skip_whitespace(parseState);\n    if((parsedObject != NULL) && ((parseState->parseOptionFlags & JKParseOptionPermitTextAfterValidJSON) == 0) && (JK_AT_STRING_PTR(parseState) < JK_END_STRING_PTR(parseState))) {\n      jk_error(parseState, @\"A valid JSON object was parsed but there were additional non-white-space characters remaining.\");\n      parsedObject = NULL;\n    }\n  }\n\n  return(parsedObject);\n}\n\n////////////\n#pragma mark -\n#pragma mark Object cache\n\n// This uses a Galois Linear Feedback Shift Register (LFSR) PRNG to pick which item in the cache to age. It has a period of (2^32)-1.\n// NOTE: A LFSR *MUST* be initialized to a non-zero value and must always have a non-zero value. The LFSR is initalized to 1 in -initWithParseOptions:\nJK_STATIC_INLINE void jk_cache_age(JKParseState *parseState) {\n  NSCParameterAssert((parseState != NULL) && (parseState->cache.prng_lfsr != 0U));\n  parseState->cache.prng_lfsr = (parseState->cache.prng_lfsr >> 1) ^ ((0U - (parseState->cache.prng_lfsr & 1U)) & 0x80200003U);\n  parseState->cache.age[parseState->cache.prng_lfsr & (parseState->cache.count - 1UL)] >>= 1;\n}\n\n// The object cache is nothing more than a hash table with open addressing collision resolution that is bounded by JK_CACHE_PROBES attempts.\n//\n// The hash table is a linear C array of JKTokenCacheItem.  The terms \"item\" and \"bucket\" are synonymous with the index in to the cache array, i.e. cache.items[bucket].\n//\n// Items in the cache have an age associated with them.  An items age is incremented using saturating unsigned arithmetic and decremeted using unsigned right shifts.\n// Thus, an items age is managed using an AIMD policy- additive increase, multiplicative decrease.  All age calculations and manipulations are branchless.\n// The primitive C type MUST be unsigned.  It is currently a \"char\", which allows (at a minimum and in practice) 8 bits.\n//\n// A \"useable bucket\" is a bucket that is not in use (never populated), or has an age == 0.\n//\n// When an item is found in the cache, it's age is incremented.\n// If a useable bucket hasn't been found, the current item (bucket) is aged along with two random items.\n//\n// If a value is not found in the cache, and no useable bucket has been found, that value is not added to the cache.\n\nstatic void *jk_cachedObjects(JKParseState *parseState) {\n  unsigned long  bucket     = parseState->token.value.hash & (parseState->cache.count - 1UL), setBucket = 0UL, useableBucket = 0UL, x = 0UL;\n  void          *parsedAtom = NULL;\n    \n  if(JK_EXPECT_F(parseState->token.value.ptrRange.length == 0UL) && JK_EXPECT_T(parseState->token.value.type == JKValueTypeString)) { return(@\"\"); }\n\n  for(x = 0UL; x < JK_CACHE_PROBES; x++) {\n    if(JK_EXPECT_F(parseState->cache.items[bucket].object == NULL)) { setBucket = 1UL; useableBucket = bucket; break; }\n    \n    if((JK_EXPECT_T(parseState->cache.items[bucket].hash == parseState->token.value.hash)) && (JK_EXPECT_T(parseState->cache.items[bucket].size == parseState->token.value.ptrRange.length)) && (JK_EXPECT_T(parseState->cache.items[bucket].type == parseState->token.value.type)) && (JK_EXPECT_T(parseState->cache.items[bucket].bytes != NULL)) && (JK_EXPECT_T(memcmp(parseState->cache.items[bucket].bytes, parseState->token.value.ptrRange.ptr, parseState->token.value.ptrRange.length) == 0U))) {\n      parseState->cache.age[bucket]     = (((uint32_t)parseState->cache.age[bucket]) + 1U) - (((((uint32_t)parseState->cache.age[bucket]) + 1U) >> 31) ^ 1U);\n      parseState->token.value.cacheItem = &parseState->cache.items[bucket];\n      NSCParameterAssert(parseState->cache.items[bucket].object != NULL);\n      return((void *)CFRetain(parseState->cache.items[bucket].object));\n    } else {\n      if(JK_EXPECT_F(setBucket == 0UL) && JK_EXPECT_F(parseState->cache.age[bucket] == 0U)) { setBucket = 1UL; useableBucket = bucket; }\n      if(JK_EXPECT_F(setBucket == 0UL))                                                     { parseState->cache.age[bucket] >>= 1; jk_cache_age(parseState); jk_cache_age(parseState); }\n      // This is the open addressing function.  The values length and type are used as a form of \"double hashing\" to distribute values with the same effective value hash across different object cache buckets.\n      // The values type is a prime number that is relatively coprime to the other primes in the set of value types and the number of hash table buckets.\n      bucket = (parseState->token.value.hash + (parseState->token.value.ptrRange.length * (x + 1UL)) + (parseState->token.value.type * (x + 1UL)) + (3UL * (x + 1UL))) & (parseState->cache.count - 1UL);\n    }\n  }\n  \n  switch(parseState->token.value.type) {\n    case JKValueTypeString:           parsedAtom = (void *)CFStringCreateWithBytes(NULL, parseState->token.value.ptrRange.ptr, parseState->token.value.ptrRange.length, kCFStringEncodingUTF8, 0); break;\n    case JKValueTypeLongLong:         parsedAtom = (void *)CFNumberCreate(NULL, kCFNumberLongLongType, &parseState->token.value.number.longLongValue);                                             break;\n    case JKValueTypeUnsignedLongLong:\n      if(parseState->token.value.number.unsignedLongLongValue <= LLONG_MAX) { parsedAtom = (void *)CFNumberCreate(NULL, kCFNumberLongLongType, &parseState->token.value.number.unsignedLongLongValue); }\n      else { parsedAtom = (void *)parseState->objCImpCache.NSNumberInitWithUnsignedLongLong(parseState->objCImpCache.NSNumberAlloc(parseState->objCImpCache.NSNumberClass, @selector(alloc)), @selector(initWithUnsignedLongLong:), parseState->token.value.number.unsignedLongLongValue); }\n      break;\n    case JKValueTypeDouble:           parsedAtom = (void *)CFNumberCreate(NULL, kCFNumberDoubleType,   &parseState->token.value.number.doubleValue);                                               break;\n    default: jk_error(parseState, @\"Internal error: Unknown token value type. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); break;\n  }\n  \n  if(JK_EXPECT_T(setBucket) && (JK_EXPECT_T(parsedAtom != NULL))) {\n    bucket = useableBucket;\n    if(JK_EXPECT_T((parseState->cache.items[bucket].object != NULL))) { CFRelease(parseState->cache.items[bucket].object); parseState->cache.items[bucket].object = NULL; }\n    \n    if(JK_EXPECT_T((parseState->cache.items[bucket].bytes = (unsigned char *)reallocf(parseState->cache.items[bucket].bytes, parseState->token.value.ptrRange.length)) != NULL)) {\n      memcpy(parseState->cache.items[bucket].bytes, parseState->token.value.ptrRange.ptr, parseState->token.value.ptrRange.length);\n      parseState->cache.items[bucket].object = (void *)CFRetain(parsedAtom);\n      parseState->cache.items[bucket].hash   = parseState->token.value.hash;\n      parseState->cache.items[bucket].cfHash = 0UL;\n      parseState->cache.items[bucket].size   = parseState->token.value.ptrRange.length;\n      parseState->cache.items[bucket].type   = parseState->token.value.type;\n      parseState->token.value.cacheItem      = &parseState->cache.items[bucket];\n      parseState->cache.age[bucket]          = JK_INIT_CACHE_AGE;\n    } else { // The realloc failed, so clear the appropriate fields.\n      parseState->cache.items[bucket].hash   = 0UL;\n      parseState->cache.items[bucket].cfHash = 0UL;\n      parseState->cache.items[bucket].size   = 0UL;\n      parseState->cache.items[bucket].type   = 0UL;\n    }\n  }\n  \n  return(parsedAtom);\n}\n\n\nstatic void *jk_object_for_token(JKParseState *parseState) {\n  void *parsedAtom = NULL;\n  \n  parseState->token.value.cacheItem = NULL;\n  switch(parseState->token.type) {\n    case JKTokenTypeString:      parsedAtom = jk_cachedObjects(parseState);    break;\n    case JKTokenTypeNumber:      parsedAtom = jk_cachedObjects(parseState);    break;\n    case JKTokenTypeObjectBegin: parsedAtom = jk_parse_dictionary(parseState); break;\n    case JKTokenTypeArrayBegin:  parsedAtom = jk_parse_array(parseState);      break;\n    case JKTokenTypeTrue:        parsedAtom = (void *)kCFBooleanTrue;          break;\n    case JKTokenTypeFalse:       parsedAtom = (void *)kCFBooleanFalse;         break;\n    case JKTokenTypeNull:        parsedAtom = (void *)kCFNull;                 break;\n    default: jk_error(parseState, @\"Internal error: Unknown token type. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); break;\n  }\n  \n  return(parsedAtom);\n}\n\n#pragma mark -\n@implementation JSONDecoder\n\n+ (id)decoder\n{\n  return([self decoderWithParseOptions:JKParseOptionStrict]);\n}\n\n+ (id)decoderWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  return([[[self alloc] initWithParseOptions:parseOptionFlags] autorelease]);\n}\n\n- (id)init\n{\n  return([self initWithParseOptions:JKParseOptionStrict]);\n}\n\n- (id)initWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  if((self = [super init]) == NULL) { return(NULL); }\n\n  if(parseOptionFlags & ~JKParseOptionValidFlags) { [self autorelease]; [NSException raise:NSInvalidArgumentException format:@\"Invalid parse options.\"]; }\n\n  if((parseState = (JKParseState *)calloc(1UL, sizeof(JKParseState))) == NULL) { goto errorExit; }\n\n  parseState->parseOptionFlags = parseOptionFlags;\n  \n  parseState->token.tokenBuffer.roundSizeUpToMultipleOf = 4096UL;\n  parseState->objectStack.roundSizeUpToMultipleOf       = 2048UL;\n\n  parseState->objCImpCache.NSNumberClass                    = _jk_NSNumberClass;\n  parseState->objCImpCache.NSNumberAlloc                    = _jk_NSNumberAllocImp;\n  parseState->objCImpCache.NSNumberInitWithUnsignedLongLong = _jk_NSNumberInitWithUnsignedLongLongImp;\n  \n  parseState->cache.prng_lfsr = 1U;\n  parseState->cache.count     = JK_CACHE_SLOTS;\n  if((parseState->cache.items = (JKTokenCacheItem *)calloc(1UL, sizeof(JKTokenCacheItem) * parseState->cache.count)) == NULL) { goto errorExit; }\n\n  return(self);\n\n errorExit:\n  if(self) { [self autorelease]; self = NULL; }\n  return(NULL);\n}\n\n// This is here primarily to support the NSString and NSData convenience functions so the autoreleased JSONDecoder can release most of its resources before the pool pops.\nstatic void _JSONDecoderCleanup(JSONDecoder *decoder) {\n  if((decoder != NULL) && (decoder->parseState != NULL)) {\n    jk_managedBuffer_release(&decoder->parseState->token.tokenBuffer);\n    jk_objectStack_release(&decoder->parseState->objectStack);\n    \n    [decoder clearCache];\n    if(decoder->parseState->cache.items != NULL) { free(decoder->parseState->cache.items); decoder->parseState->cache.items = NULL; }\n    \n    free(decoder->parseState); decoder->parseState = NULL;\n  }\n}\n\n- (void)dealloc\n{\n  _JSONDecoderCleanup(self);\n  [super dealloc];\n}\n\n- (void)clearCache\n{\n  if(JK_EXPECT_T(parseState != NULL)) {\n    if(JK_EXPECT_T(parseState->cache.items != NULL)) {\n      size_t idx = 0UL;\n      for(idx = 0UL; idx < parseState->cache.count; idx++) {\n        if(JK_EXPECT_T(parseState->cache.items[idx].object != NULL)) { CFRelease(parseState->cache.items[idx].object); parseState->cache.items[idx].object = NULL; }\n        if(JK_EXPECT_T(parseState->cache.items[idx].bytes  != NULL)) { free(parseState->cache.items[idx].bytes);       parseState->cache.items[idx].bytes  = NULL; }\n        memset(&parseState->cache.items[idx], 0, sizeof(JKTokenCacheItem));\n        parseState->cache.age[idx] = 0U;\n      }\n    }\n  }\n}\n\n// This needs to be completely rewritten.\nstatic id _JKParseUTF8String(JKParseState *parseState, BOOL mutableCollections, const unsigned char *string, size_t length, NSError **error) {\n  NSCParameterAssert((parseState != NULL) && (string != NULL) && (parseState->cache.prng_lfsr != 0U));\n  parseState->stringBuffer.bytes.ptr    = string;\n  parseState->stringBuffer.bytes.length = length;\n  parseState->atIndex                   = 0UL;\n  parseState->lineNumber                = 1UL;\n  parseState->lineStartIndex            = 0UL;\n  parseState->prev_atIndex              = 0UL;\n  parseState->prev_lineNumber           = 1UL;\n  parseState->prev_lineStartIndex       = 0UL;\n  parseState->error                     = NULL;\n  parseState->errorIsPrev               = 0;\n  parseState->mutableCollections        = (mutableCollections == NO) ? NO : YES;\n  \n  unsigned char stackTokenBuffer[JK_TOKENBUFFER_SIZE] JK_ALIGNED(64);\n  jk_managedBuffer_setToStackBuffer(&parseState->token.tokenBuffer, stackTokenBuffer, sizeof(stackTokenBuffer));\n  \n  void       *stackObjects [JK_STACK_OBJS] JK_ALIGNED(64);\n  void       *stackKeys    [JK_STACK_OBJS] JK_ALIGNED(64);\n  CFHashCode  stackCFHashes[JK_STACK_OBJS] JK_ALIGNED(64);\n  jk_objectStack_setToStackBuffer(&parseState->objectStack, stackObjects, stackKeys, stackCFHashes, JK_STACK_OBJS);\n  \n  id parsedJSON = json_parse_it(parseState);\n  \n  if((error != NULL) && (parseState->error != NULL)) { *error = parseState->error; }\n  \n  jk_managedBuffer_release(&parseState->token.tokenBuffer);\n  jk_objectStack_release(&parseState->objectStack);\n  \n  parseState->stringBuffer.bytes.ptr    = NULL;\n  parseState->stringBuffer.bytes.length = 0UL;\n  parseState->atIndex                   = 0UL;\n  parseState->lineNumber                = 1UL;\n  parseState->lineStartIndex            = 0UL;\n  parseState->prev_atIndex              = 0UL;\n  parseState->prev_lineNumber           = 1UL;\n  parseState->prev_lineStartIndex       = 0UL;\n  parseState->error                     = NULL;\n  parseState->errorIsPrev               = 0;\n  parseState->mutableCollections        = NO;\n  \n  return(parsedJSON);\n}\n\n////////////\n#pragma mark Deprecated as of v1.4\n////////////\n\n// Deprecated in JSONKit v1.4.  Use objectWithUTF8String:length: instead.\n- (id)parseUTF8String:(const unsigned char *)string length:(size_t)length\n{\n  return([self objectWithUTF8String:string length:length error:NULL]);\n}\n\n// Deprecated in JSONKit v1.4.  Use objectWithUTF8String:length:error: instead.\n- (id)parseUTF8String:(const unsigned char *)string length:(size_t)length error:(NSError **)error\n{\n  return([self objectWithUTF8String:string length:length error:error]);\n}\n\n// Deprecated in JSONKit v1.4.  Use objectWithData: instead.\n- (id)parseJSONData:(NSData *)jsonData\n{\n  return([self objectWithData:jsonData error:NULL]);\n}\n\n// Deprecated in JSONKit v1.4.  Use objectWithData:error: instead.\n- (id)parseJSONData:(NSData *)jsonData error:(NSError **)error\n{\n  return([self objectWithData:jsonData error:error]);\n}\n\n////////////\n#pragma mark Methods that return immutable collection objects\n////////////\n\n- (id)objectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length\n{\n  return([self objectWithUTF8String:string length:length error:NULL]);\n}\n\n- (id)objectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length error:(NSError **)error\n{\n  if(parseState == NULL) { [NSException raise:NSInternalInconsistencyException format:@\"parseState is NULL.\"];          }\n  if(string     == NULL) { [NSException raise:NSInvalidArgumentException       format:@\"The string argument is NULL.\"]; }\n  \n  return(_JKParseUTF8String(parseState, NO, string, (size_t)length, error));\n}\n\n- (id)objectWithData:(NSData *)jsonData\n{\n  return([self objectWithData:jsonData error:NULL]);\n}\n\n- (id)objectWithData:(NSData *)jsonData error:(NSError **)error\n{\n  if(jsonData == NULL) { [NSException raise:NSInvalidArgumentException format:@\"The jsonData argument is NULL.\"]; }\n  return([self objectWithUTF8String:(const unsigned char *)[jsonData bytes] length:[jsonData length] error:error]);\n}\n\n////////////\n#pragma mark Methods that return mutable collection objects\n////////////\n\n- (id)mutableObjectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length\n{\n  return([self mutableObjectWithUTF8String:string length:length error:NULL]);\n}\n\n- (id)mutableObjectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length error:(NSError **)error\n{\n  if(parseState == NULL) { [NSException raise:NSInternalInconsistencyException format:@\"parseState is NULL.\"];          }\n  if(string     == NULL) { [NSException raise:NSInvalidArgumentException       format:@\"The string argument is NULL.\"]; }\n  \n  return(_JKParseUTF8String(parseState, YES, string, (size_t)length, error));\n}\n\n- (id)mutableObjectWithData:(NSData *)jsonData\n{\n  return([self mutableObjectWithData:jsonData error:NULL]);\n}\n\n- (id)mutableObjectWithData:(NSData *)jsonData error:(NSError **)error\n{\n  if(jsonData == NULL) { [NSException raise:NSInvalidArgumentException format:@\"The jsonData argument is NULL.\"]; }\n  return([self mutableObjectWithUTF8String:(const unsigned char *)[jsonData bytes] length:[jsonData length] error:error]);\n}\n\n@end\n\n/*\n The NSString and NSData convenience methods need a little bit of explanation.\n \n Prior to JSONKit v1.4, the NSString -objectFromJSONStringWithParseOptions:error: method looked like\n \n const unsigned char *utf8String = (const unsigned char *)[self UTF8String];\n if(utf8String == NULL) { return(NULL); }\n size_t               utf8Length = strlen((const char *)utf8String); \n return([[JSONDecoder decoderWithParseOptions:parseOptionFlags] parseUTF8String:utf8String length:utf8Length error:error]);\n \n This changed with v1.4 to a more complicated method.  The reason for this is to keep the amount of memory that is\n allocated, but not yet freed because it is dependent on the autorelease pool to pop before it can be reclaimed.\n \n In the simpler v1.3 code, this included all the bytes used to store the -UTF8String along with the JSONDecoder and all its overhead.\n \n Now we use an autoreleased CFMutableData that is sized to the UTF8 length of the NSString in question and is used to hold the UTF8\n conversion of said string.\n \n Once parsed, the CFMutableData has its length set to 0.  This should, hopefully, allow the CFMutableData to realloc and/or free\n the buffer.\n \n Another change made was a slight modification to JSONDecoder so that most of the cleanup work that was done in -dealloc was moved\n to a private, internal function.  These convenience routines keep the pointer to the autoreleased JSONDecoder and calls\n _JSONDecoderCleanup() to early release the decoders resources since we already know that particular decoder is not going to be used\n again.  \n \n If everything goes smoothly, this will most likely result in perhaps a few hundred bytes that are allocated but waiting for the\n autorelease pool to pop.  This is compared to the thousands and easily hundreds of thousands of bytes that would have been in\n autorelease limbo.  It's more complicated for us, but a win for the user.\n \n Autorelease objects are used in case things don't go smoothly.  By having them autoreleased, we effectively guarantee that our\n requirement to -release the object is always met, not matter what goes wrong.  The downside is having a an object or two in\n autorelease limbo, but we've done our best to minimize that impact, so it all balances out.\n */\n\n@implementation NSString (JSONKitDeserializing)\n\nstatic id _NSStringObjectFromJSONString(NSString *jsonString, JKParseOptionFlags parseOptionFlags, NSError **error, BOOL mutableCollection) {\n  id                returnObject = NULL;\n  CFMutableDataRef  mutableData  = NULL;\n  JSONDecoder      *decoder      = NULL;\n  \n  CFIndex    stringLength     = CFStringGetLength((CFStringRef)jsonString);\n  NSUInteger stringUTF8Length = [jsonString lengthOfBytesUsingEncoding:NSUTF8StringEncoding];\n  \n  if((mutableData = (CFMutableDataRef)[(id)CFDataCreateMutable(NULL, (NSUInteger)stringUTF8Length) autorelease]) != NULL) {\n    UInt8   *utf8String = CFDataGetMutableBytePtr(mutableData);\n    CFIndex  usedBytes  = 0L, convertedCount = 0L;\n    \n    convertedCount = CFStringGetBytes((CFStringRef)jsonString, CFRangeMake(0L, stringLength), kCFStringEncodingUTF8, '?', NO, utf8String, (NSUInteger)stringUTF8Length, &usedBytes);\n    if(JK_EXPECT_F(convertedCount != stringLength) || JK_EXPECT_F(usedBytes < 0L)) { if(error != NULL) { *error = [NSError errorWithDomain:@\"JKErrorDomain\" code:-1L userInfo:[NSDictionary dictionaryWithObject:@\"An error occurred converting the contents of a NSString to UTF8.\" forKey:NSLocalizedDescriptionKey]]; } goto exitNow; }\n    \n    if(mutableCollection == NO) { returnObject = [(decoder = [JSONDecoder decoderWithParseOptions:parseOptionFlags])        objectWithUTF8String:(const unsigned char *)utf8String length:(size_t)usedBytes error:error]; }\n    else                        { returnObject = [(decoder = [JSONDecoder decoderWithParseOptions:parseOptionFlags]) mutableObjectWithUTF8String:(const unsigned char *)utf8String length:(size_t)usedBytes error:error]; }\n  }\n  \nexitNow:\n  if(mutableData != NULL) { CFDataSetLength(mutableData, 0L); }\n  if(decoder     != NULL) { _JSONDecoderCleanup(decoder);     }\n  return(returnObject);\n}\n\n- (id)objectFromJSONString\n{\n  return([self objectFromJSONStringWithParseOptions:JKParseOptionStrict error:NULL]);\n}\n\n- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  return([self objectFromJSONStringWithParseOptions:parseOptionFlags error:NULL]);\n}\n\n- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error\n{\n  return(_NSStringObjectFromJSONString(self, parseOptionFlags, error, NO));\n}\n\n\n- (id)mutableObjectFromJSONString\n{\n  return([self mutableObjectFromJSONStringWithParseOptions:JKParseOptionStrict error:NULL]);\n}\n\n- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  return([self mutableObjectFromJSONStringWithParseOptions:parseOptionFlags error:NULL]);\n}\n\n- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error\n{\n  return(_NSStringObjectFromJSONString(self, parseOptionFlags, error, YES));\n}\n\n@end\n\n@implementation NSData (JSONKitDeserializing)\n\n- (id)objectFromJSONData\n{\n  return([self objectFromJSONDataWithParseOptions:JKParseOptionStrict error:NULL]);\n}\n\n- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  return([self objectFromJSONDataWithParseOptions:parseOptionFlags error:NULL]);\n}\n\n- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error\n{\n  JSONDecoder *decoder = NULL;\n  id returnObject = [(decoder = [JSONDecoder decoderWithParseOptions:parseOptionFlags]) objectWithData:self error:error];\n  if(decoder != NULL) { _JSONDecoderCleanup(decoder); }\n  return(returnObject);\n}\n\n- (id)mutableObjectFromJSONData\n{\n  return([self mutableObjectFromJSONDataWithParseOptions:JKParseOptionStrict error:NULL]);\n}\n\n- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  return([self mutableObjectFromJSONDataWithParseOptions:parseOptionFlags error:NULL]);\n}\n\n- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error\n{\n  JSONDecoder *decoder = NULL;\n  id returnObject = [(decoder = [JSONDecoder decoderWithParseOptions:parseOptionFlags]) mutableObjectWithData:self error:error];\n  if(decoder != NULL) { _JSONDecoderCleanup(decoder); }\n  return(returnObject);\n}\n\n\n@end\n\n////////////\n#pragma mark -\n#pragma mark Encoding / deserializing functions\n\nstatic void jk_encode_error(JKEncodeState *encodeState, NSString *format, ...) {\n  NSCParameterAssert((encodeState != NULL) && (format != NULL));\n\n  va_list varArgsList;\n  va_start(varArgsList, format);\n  NSString *formatString = [[[NSString alloc] initWithFormat:format arguments:varArgsList] autorelease];\n  va_end(varArgsList);\n\n  if(encodeState->error == NULL) {\n    encodeState->error = [NSError errorWithDomain:@\"JKErrorDomain\" code:-1L userInfo:\n                                   [NSDictionary dictionaryWithObjectsAndKeys:\n                                                                              formatString, NSLocalizedDescriptionKey,\n                                                                              NULL]];\n  }\n}\n\nJK_STATIC_INLINE void jk_encode_updateCache(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object) {\n  NSCParameterAssert(encodeState != NULL);\n  if(JK_EXPECT_T(cacheSlot != NULL)) {\n    NSCParameterAssert((object != NULL) && (startingAtIndex <= encodeState->atIndex));\n    cacheSlot->object = object;\n    cacheSlot->offset = startingAtIndex;\n    cacheSlot->length = (size_t)(encodeState->atIndex - startingAtIndex);  \n  }\n}\n\nstatic int jk_encode_printf(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format, ...) {\n  va_list varArgsList, varArgsListCopy;\n  va_start(varArgsList, format);\n  va_copy(varArgsListCopy, varArgsList);\n\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && (startingAtIndex <= encodeState->atIndex) && (format != NULL));\n\n  ssize_t  formattedStringLength = 0L;\n  int      returnValue           = 0;\n\n  if(JK_EXPECT_T((formattedStringLength = vsnprintf((char *)&encodeState->stringBuffer.bytes.ptr[encodeState->atIndex], (encodeState->stringBuffer.bytes.length - encodeState->atIndex), format, varArgsList)) >= (ssize_t)(encodeState->stringBuffer.bytes.length - encodeState->atIndex))) {\n    NSCParameterAssert(((encodeState->atIndex + (formattedStringLength * 2UL) + 256UL) > encodeState->stringBuffer.bytes.length));\n    if(JK_EXPECT_F(((encodeState->atIndex + (formattedStringLength * 2UL) + 256UL) > encodeState->stringBuffer.bytes.length)) && JK_EXPECT_F((jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + (formattedStringLength * 2UL)+ 4096UL) == NULL))) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); returnValue = 1; goto exitNow; }\n    if(JK_EXPECT_F((formattedStringLength = vsnprintf((char *)&encodeState->stringBuffer.bytes.ptr[encodeState->atIndex], (encodeState->stringBuffer.bytes.length - encodeState->atIndex), format, varArgsListCopy)) >= (ssize_t)(encodeState->stringBuffer.bytes.length - encodeState->atIndex))) { jk_encode_error(encodeState, @\"vsnprintf failed unexpectedly.\"); returnValue = 1; goto exitNow; }\n  }\n  \nexitNow:\n  va_end(varArgsList);\n  va_end(varArgsListCopy);\n  if(JK_EXPECT_T(returnValue == 0)) { encodeState->atIndex += formattedStringLength; jk_encode_updateCache(encodeState, cacheSlot, startingAtIndex, object); }\n  return(returnValue);\n}\n\nstatic int jk_encode_write(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format) {\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && (startingAtIndex <= encodeState->atIndex) && (format != NULL));\n  if(JK_EXPECT_F(((encodeState->atIndex + strlen(format) + 256UL) > encodeState->stringBuffer.bytes.length)) && JK_EXPECT_F((jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + strlen(format) + 1024UL) == NULL))) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n\n  size_t formatIdx = 0UL;\n  for(formatIdx = 0UL; format[formatIdx] != 0; formatIdx++) { NSCParameterAssert(encodeState->atIndex < encodeState->stringBuffer.bytes.length); encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = format[formatIdx]; }\n  jk_encode_updateCache(encodeState, cacheSlot, startingAtIndex, object);\n  return(0);\n}\n\nstatic int jk_encode_writePrettyPrintWhiteSpace(JKEncodeState *encodeState) {\n  NSCParameterAssert((encodeState != NULL) && ((encodeState->serializeOptionFlags & JKSerializeOptionPretty) != 0UL));\n  if(JK_EXPECT_F((encodeState->atIndex + ((encodeState->depth + 1UL) * 2UL) + 16UL) > encodeState->stringBuffer.bytes.length) && JK_EXPECT_T(jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + ((encodeState->depth + 1UL) * 2UL) + 4096UL) == NULL)) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n  encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\n';\n  size_t depthWhiteSpace = 0UL;\n  for(depthWhiteSpace = 0UL; depthWhiteSpace < (encodeState->depth * 2UL); depthWhiteSpace++) { NSCParameterAssert(encodeState->atIndex < encodeState->stringBuffer.bytes.length); encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = ' '; }\n  return(0);\n}  \n\nstatic int jk_encode_write1slow(JKEncodeState *encodeState, ssize_t depthChange, const char *format) {\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && (format != NULL) && ((depthChange >= -1L) && (depthChange <= 1L)) && ((encodeState->depth == 0UL) ? (depthChange >= 0L) : 1) && ((encodeState->serializeOptionFlags & JKSerializeOptionPretty) != 0UL));\n  if(JK_EXPECT_F((encodeState->atIndex + ((encodeState->depth + 1UL) * 2UL) + 16UL) > encodeState->stringBuffer.bytes.length) && JK_EXPECT_F(jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + ((encodeState->depth + 1UL) * 2UL) + 4096UL) == NULL)) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n  encodeState->depth += depthChange;\n  if(JK_EXPECT_T(format[0] == ':')) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = format[0]; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = ' '; }\n  else {\n    if(JK_EXPECT_F(depthChange == -1L)) { if(JK_EXPECT_F(jk_encode_writePrettyPrintWhiteSpace(encodeState))) { return(1); } }\n    encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = format[0];\n    if(JK_EXPECT_T(depthChange != -1L)) { if(JK_EXPECT_F(jk_encode_writePrettyPrintWhiteSpace(encodeState))) { return(1); } }\n  }\n  NSCParameterAssert(encodeState->atIndex < encodeState->stringBuffer.bytes.length);\n  return(0);\n}\n\nstatic int jk_encode_write1fast(JKEncodeState *encodeState, ssize_t depthChange JK_UNUSED_ARG, const char *format) {\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && ((encodeState->serializeOptionFlags & JKSerializeOptionPretty) == 0UL));\n  if(JK_EXPECT_T((encodeState->atIndex + 4UL) < encodeState->stringBuffer.bytes.length)) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = format[0]; }\n  else { return(jk_encode_write(encodeState, NULL, 0UL, NULL, format)); }\n  return(0);\n}\n\nstatic int jk_encode_writen(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format, size_t length) {\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && (startingAtIndex <= encodeState->atIndex));\n  if(JK_EXPECT_F((encodeState->stringBuffer.bytes.length - encodeState->atIndex) < (length + 4UL))) { if(jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + 4096UL + length) == NULL) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); } }\n  memcpy(encodeState->stringBuffer.bytes.ptr + encodeState->atIndex, format, length);\n  encodeState->atIndex += length;\n  jk_encode_updateCache(encodeState, cacheSlot, startingAtIndex, object);\n  return(0);\n}\n\nJK_STATIC_INLINE JKHash jk_encode_object_hash(void *objectPtr) {\n  return( ( (((JKHash)objectPtr) >> 21) ^ (((JKHash)objectPtr) >> 9)   ) + (((JKHash)objectPtr) >> 4) );\n}\n\nstatic int jk_encode_add_atom_to_buffer(JKEncodeState *encodeState, void *objectPtr) {\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && (objectPtr != NULL));\n\n  id     object          = (id)objectPtr, encodeCacheObject = object;\n  int    isClass         = JKClassUnknown;\n  size_t startingAtIndex = encodeState->atIndex;\n\n  JKHash         objectHash = jk_encode_object_hash(objectPtr);\n  JKEncodeCache *cacheSlot  = &encodeState->cache[objectHash % JK_ENCODE_CACHE_SLOTS];\n\n  if(JK_EXPECT_T(cacheSlot->object == object)) {\n    NSCParameterAssert((cacheSlot->object != NULL) &&\n                       (cacheSlot->offset < encodeState->atIndex)                   && ((cacheSlot->offset + cacheSlot->length) < encodeState->atIndex)                                    &&\n                       (cacheSlot->offset < encodeState->stringBuffer.bytes.length) && ((cacheSlot->offset + cacheSlot->length) < encodeState->stringBuffer.bytes.length)                  &&\n                       ((encodeState->stringBuffer.bytes.ptr + encodeState->atIndex)                     < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + cacheSlot->offset)                        < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + cacheSlot->offset + cacheSlot->length)    < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)));\n    if(JK_EXPECT_F(((encodeState->atIndex + cacheSlot->length + 256UL) > encodeState->stringBuffer.bytes.length)) && JK_EXPECT_F((jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + cacheSlot->length + 1024UL) == NULL))) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n    NSCParameterAssert(((encodeState->atIndex + cacheSlot->length) < encodeState->stringBuffer.bytes.length) &&\n                       ((encodeState->stringBuffer.bytes.ptr + encodeState->atIndex)                     < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + encodeState->atIndex + cacheSlot->length) < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + cacheSlot->offset)                        < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + cacheSlot->offset + cacheSlot->length)    < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + cacheSlot->offset + cacheSlot->length)    < (encodeState->stringBuffer.bytes.ptr + encodeState->atIndex)));\n    memcpy(encodeState->stringBuffer.bytes.ptr + encodeState->atIndex, encodeState->stringBuffer.bytes.ptr + cacheSlot->offset, cacheSlot->length);\n    encodeState->atIndex += cacheSlot->length;\n    return(0);\n  }\n\n  // When we encounter a class that we do not handle, and we have either a delegate or block that the user supplied to format unsupported classes,\n  // we \"re-run\" the object check.  However, we re-run the object check exactly ONCE.  If the user supplies an object that isn't one of the\n  // supported classes, we fail the second time (i.e., double fault error).\n  BOOL rerunningAfterClassFormatter = NO;\n rerunAfterClassFormatter:;\n\n  // XXX XXX XXX XXX\n  //     \n  //     We need to work around a bug in 10.7, which breaks ABI compatibility with Objective-C going back not just to 10.0, but OpenStep and even NextStep.\n  //     \n  //     It has long been documented that \"the very first thing that a pointer to an Objective-C object \"points to\" is a pointer to that objects class\".\n  //     \n  //     This is euphemistically called \"tagged pointers\".  There are a number of highly technical problems with this, most involving long passages from\n  //     the C standard(s).  In short, one can make a strong case, couched from the perspective of the C standard(s), that that 10.7 \"tagged pointers\" are\n  //     fundamentally Wrong and Broken, and should have never been implemented.  Assuming those points are glossed over, because the change is very clearly\n  //     breaking ABI compatibility, this should have resulted in a minimum of a \"minimum version required\" bump in various shared libraries to prevent\n  //     causes code that used to work just fine to suddenly break without warning.\n  //\n  //     In fact, the C standard says that the hack below is \"undefined behavior\"- there is no requirement that the 10.7 tagged pointer hack of setting the\n  //     \"lower, unused bits\" must be preserved when casting the result to an integer type, but this \"works\" because for most architectures\n  //     `sizeof(long) == sizeof(void *)` and the compiler uses the same representation for both.  (note: this is informal, not meant to be\n  //     normative or pedantically correct).\n  //     \n  //     In other words, while this \"works\" for now, technically the compiler is not obligated to do \"what we want\", and a later version of the compiler\n  //     is not required in any way to produce the same results or behavior that earlier versions of the compiler did for the statement below.\n  //\n  //     Fan-fucking-tastic.\n  //     \n  //     Why not just use `object_getClass()`?  Because `object->isa` reduces to (typically) a *single* instruction.  Calling `object_getClass()` requires\n  //     that the compiler potentially spill registers, establish a function call frame / environment, and finally execute a \"jump subroutine\" instruction.\n  //     Then, the called subroutine must spend half a dozen instructions in its prolog, however many instructions doing whatever it does, then half a dozen\n  //     instructions in its prolog.  One instruction compared to dozens, maybe a hundred instructions.\n  //     \n  //     Yes, that's one to two orders of magnitude difference.  Which is compelling in its own right.  When going for performance, you're often happy with\n  //     gains in the two to three percent range.\n  //     \n  // XXX XXX XXX XXX\n\n  BOOL workAroundMacOSXABIBreakingBug = NO;\n  if(JK_EXPECT_F(((NSUInteger)object) & 0x1)) { workAroundMacOSXABIBreakingBug = YES; goto slowClassLookup; }\n\n       if(JK_EXPECT_T(object->isa == encodeState->fastClassLookup.stringClass))     { isClass = JKClassString;     }\n  else if(JK_EXPECT_T(object->isa == encodeState->fastClassLookup.numberClass))     { isClass = JKClassNumber;     }\n  else if(JK_EXPECT_T(object->isa == encodeState->fastClassLookup.dictionaryClass)) { isClass = JKClassDictionary; }\n  else if(JK_EXPECT_T(object->isa == encodeState->fastClassLookup.arrayClass))      { isClass = JKClassArray;      }\n  else if(JK_EXPECT_T(object->isa == encodeState->fastClassLookup.nullClass))       { isClass = JKClassNull;       }\n  else {\n  slowClassLookup:\n         if(JK_EXPECT_T([object isKindOfClass:[NSString     class]])) { if(workAroundMacOSXABIBreakingBug == NO) { encodeState->fastClassLookup.stringClass     = object->isa; } isClass = JKClassString;     }\n    else if(JK_EXPECT_T([object isKindOfClass:[NSNumber     class]])) { if(workAroundMacOSXABIBreakingBug == NO) { encodeState->fastClassLookup.numberClass     = object->isa; } isClass = JKClassNumber;     }\n    else if(JK_EXPECT_T([object isKindOfClass:[NSDictionary class]])) { if(workAroundMacOSXABIBreakingBug == NO) { encodeState->fastClassLookup.dictionaryClass = object->isa; } isClass = JKClassDictionary; }\n    else if(JK_EXPECT_T([object isKindOfClass:[NSArray      class]])) { if(workAroundMacOSXABIBreakingBug == NO) { encodeState->fastClassLookup.arrayClass      = object->isa; } isClass = JKClassArray;      }\n    else if(JK_EXPECT_T([object isKindOfClass:[NSNull       class]])) { if(workAroundMacOSXABIBreakingBug == NO) { encodeState->fastClassLookup.nullClass       = object->isa; } isClass = JKClassNull;       }\n    else {\n      if((rerunningAfterClassFormatter == NO) && (\n#ifdef __BLOCKS__\n           ((encodeState->classFormatterBlock) && ((object = encodeState->classFormatterBlock(object))                                                                         != NULL)) ||\n#endif\n           ((encodeState->classFormatterIMP)   && ((object = encodeState->classFormatterIMP(encodeState->classFormatterDelegate, encodeState->classFormatterSelector, object)) != NULL))    )) { rerunningAfterClassFormatter = YES; goto rerunAfterClassFormatter; }\n      \n      if(rerunningAfterClassFormatter == NO) { jk_encode_error(encodeState, @\"Unable to serialize object class %@.\", NSStringFromClass([encodeCacheObject class])); return(1); }\n      else { jk_encode_error(encodeState, @\"Unable to serialize object class %@ that was returned by the unsupported class formatter.  Original object class was %@.\", (object == NULL) ? @\"NULL\" : NSStringFromClass([object class]), NSStringFromClass([encodeCacheObject class])); return(1); }\n    }\n  }\n\n  // This is here for the benefit of the optimizer.  It allows the optimizer to do loop invariant code motion for the JKClassArray\n  // and JKClassDictionary cases when printing simple, single characters via jk_encode_write(), which is actually a macro:\n  // #define jk_encode_write1(es, dc, f) (_jk_encode_prettyPrint ? jk_encode_write1slow(es, dc, f) : jk_encode_write1fast(es, dc, f))\n  int _jk_encode_prettyPrint = JK_EXPECT_T((encodeState->serializeOptionFlags & JKSerializeOptionPretty) == 0) ? 0 : 1;\n  \n  switch(isClass) {\n    case JKClassString:\n      {\n        {\n          const unsigned char *cStringPtr = (const unsigned char *)CFStringGetCStringPtr((CFStringRef)object, kCFStringEncodingMacRoman);\n          if(cStringPtr != NULL) {\n            const unsigned char *utf8String = cStringPtr;\n            size_t               utf8Idx    = 0UL;\n\n            CFIndex stringLength = CFStringGetLength((CFStringRef)object);\n            if(JK_EXPECT_F(((encodeState->atIndex + (stringLength * 2UL) + 256UL) > encodeState->stringBuffer.bytes.length)) && JK_EXPECT_F((jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + (stringLength * 2UL) + 1024UL) == NULL))) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n\n            if(JK_EXPECT_T((encodeState->encodeOption & JKEncodeOptionStringObjTrimQuotes) == 0UL)) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\"'; }\n            for(utf8Idx = 0UL; utf8String[utf8Idx] != 0U; utf8Idx++) {\n              NSCParameterAssert(((&encodeState->stringBuffer.bytes.ptr[encodeState->atIndex]) - encodeState->stringBuffer.bytes.ptr) < (ssize_t)encodeState->stringBuffer.bytes.length);\n              NSCParameterAssert(encodeState->atIndex < encodeState->stringBuffer.bytes.length);\n              if(JK_EXPECT_F(utf8String[utf8Idx] >= 0x80U)) { encodeState->atIndex = startingAtIndex; goto slowUTF8Path; }\n              if(JK_EXPECT_F(utf8String[utf8Idx] <  0x20U)) {\n                switch(utf8String[utf8Idx]) {\n                  case '\\b': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'b'; break;\n                  case '\\f': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'f'; break;\n                  case '\\n': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'n'; break;\n                  case '\\r': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'r'; break;\n                  case '\\t': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 't'; break;\n                  default: if(JK_EXPECT_F(jk_encode_printf(encodeState, NULL, 0UL, NULL, \"\\\\u%4.4x\", utf8String[utf8Idx]))) { return(1); } break;\n                }\n              } else {\n                if(JK_EXPECT_F(utf8String[utf8Idx] == '\\\"') || JK_EXPECT_F(utf8String[utf8Idx] == '\\\\') || (JK_EXPECT_F(encodeState->serializeOptionFlags & JKSerializeOptionEscapeForwardSlashes) && JK_EXPECT_F(utf8String[utf8Idx] == '/'))) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; }\n                encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = utf8String[utf8Idx];\n              }\n            }\n            NSCParameterAssert((encodeState->atIndex + 1UL) < encodeState->stringBuffer.bytes.length);\n            if(JK_EXPECT_T((encodeState->encodeOption & JKEncodeOptionStringObjTrimQuotes) == 0UL)) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\"'; }\n            jk_encode_updateCache(encodeState, cacheSlot, startingAtIndex, encodeCacheObject);\n            return(0);\n          }\n        }\n\n      slowUTF8Path:\n        {\n          CFIndex stringLength        = CFStringGetLength((CFStringRef)object);\n          CFIndex maxStringUTF8Length = CFStringGetMaximumSizeForEncoding(stringLength, kCFStringEncodingUTF8) + 32L;\n        \n          if(JK_EXPECT_F((size_t)maxStringUTF8Length > encodeState->utf8ConversionBuffer.bytes.length) && JK_EXPECT_F(jk_managedBuffer_resize(&encodeState->utf8ConversionBuffer, maxStringUTF8Length + 1024UL) == NULL)) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n        \n          CFIndex usedBytes = 0L, convertedCount = 0L;\n          convertedCount = CFStringGetBytes((CFStringRef)object, CFRangeMake(0L, stringLength), kCFStringEncodingUTF8, '?', NO, encodeState->utf8ConversionBuffer.bytes.ptr, encodeState->utf8ConversionBuffer.bytes.length - 16L, &usedBytes);\n          if(JK_EXPECT_F(convertedCount != stringLength) || JK_EXPECT_F(usedBytes < 0L)) { jk_encode_error(encodeState, @\"An error occurred converting the contents of a NSString to UTF8.\"); return(1); }\n        \n          if(JK_EXPECT_F((encodeState->atIndex + (maxStringUTF8Length * 2UL) + 256UL) > encodeState->stringBuffer.bytes.length) && JK_EXPECT_F(jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + (maxStringUTF8Length * 2UL) + 1024UL) == NULL)) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n        \n          const unsigned char *utf8String = encodeState->utf8ConversionBuffer.bytes.ptr;\n        \n          size_t utf8Idx = 0UL;\n          if(JK_EXPECT_T((encodeState->encodeOption & JKEncodeOptionStringObjTrimQuotes) == 0UL)) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\"'; }\n          for(utf8Idx = 0UL; utf8Idx < (size_t)usedBytes; utf8Idx++) {\n            NSCParameterAssert(((&encodeState->stringBuffer.bytes.ptr[encodeState->atIndex]) - encodeState->stringBuffer.bytes.ptr) < (ssize_t)encodeState->stringBuffer.bytes.length);\n            NSCParameterAssert(encodeState->atIndex < encodeState->stringBuffer.bytes.length);\n            NSCParameterAssert((CFIndex)utf8Idx < usedBytes);\n            if(JK_EXPECT_F(utf8String[utf8Idx] < 0x20U)) {\n              switch(utf8String[utf8Idx]) {\n                case '\\b': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'b'; break;\n                case '\\f': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'f'; break;\n                case '\\n': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'n'; break;\n                case '\\r': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'r'; break;\n                case '\\t': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 't'; break;\n                default: if(JK_EXPECT_F(jk_encode_printf(encodeState, NULL, 0UL, NULL, \"\\\\u%4.4x\", utf8String[utf8Idx]))) { return(1); } break;\n              }\n            } else {\n              if(JK_EXPECT_F(utf8String[utf8Idx] >= 0x80U) && (encodeState->serializeOptionFlags & JKSerializeOptionEscapeUnicode)) {\n                const unsigned char *nextValidCharacter = NULL;\n                UTF32                u32ch              = 0U;\n                ConversionResult     result;\n\n                if(JK_EXPECT_F((result = ConvertSingleCodePointInUTF8(&utf8String[utf8Idx], &utf8String[usedBytes], (UTF8 const **)&nextValidCharacter, &u32ch)) != conversionOK)) { jk_encode_error(encodeState, @\"Error converting UTF8.\"); return(1); }\n                else {\n                  utf8Idx = (nextValidCharacter - utf8String) - 1UL;\n                  if(JK_EXPECT_T(u32ch <= 0xffffU)) { if(JK_EXPECT_F(jk_encode_printf(encodeState, NULL, 0UL, NULL, \"\\\\u%4.4x\", u32ch)))                                                           { return(1); } }\n                  else                              { if(JK_EXPECT_F(jk_encode_printf(encodeState, NULL, 0UL, NULL, \"\\\\u%4.4x\\\\u%4.4x\", (0xd7c0U + (u32ch >> 10)), (0xdc00U + (u32ch & 0x3ffU))))) { return(1); } }\n                }\n              } else {\n                if(JK_EXPECT_F(utf8String[utf8Idx] == '\\\"') || JK_EXPECT_F(utf8String[utf8Idx] == '\\\\') || (JK_EXPECT_F(encodeState->serializeOptionFlags & JKSerializeOptionEscapeForwardSlashes) && JK_EXPECT_F(utf8String[utf8Idx] == '/'))) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; }\n                encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = utf8String[utf8Idx];\n              }\n            }\n          }\n          NSCParameterAssert((encodeState->atIndex + 1UL) < encodeState->stringBuffer.bytes.length);\n          if(JK_EXPECT_T((encodeState->encodeOption & JKEncodeOptionStringObjTrimQuotes) == 0UL)) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\"'; }\n          jk_encode_updateCache(encodeState, cacheSlot, startingAtIndex, encodeCacheObject);\n          return(0);\n        }\n      }\n      break;\n\n    case JKClassNumber:\n      {\n             if(object == (id)kCFBooleanTrue)  { return(jk_encode_writen(encodeState, cacheSlot, startingAtIndex, encodeCacheObject, \"true\",  4UL)); }\n        else if(object == (id)kCFBooleanFalse) { return(jk_encode_writen(encodeState, cacheSlot, startingAtIndex, encodeCacheObject, \"false\", 5UL)); }\n        \n        const char         *objCType = [object objCType];\n        char                anum[256], *aptr = &anum[255];\n        int                 isNegative = 0;\n        unsigned long long  ullv;\n        long long           llv;\n        \n        if(JK_EXPECT_F(objCType == NULL) || JK_EXPECT_F(objCType[0] == 0) || JK_EXPECT_F(objCType[1] != 0)) { jk_encode_error(encodeState, @\"NSNumber conversion error, unknown type.  Type: '%s'\", (objCType == NULL) ? \"<NULL>\" : objCType); return(1); }\n        \n        switch(objCType[0]) {\n          case 'c': case 'i': case 's': case 'l': case 'q':\n            if(JK_EXPECT_T(CFNumberGetValue((CFNumberRef)object, kCFNumberLongLongType, &llv)))  {\n              if(llv < 0LL)  { ullv = -llv; isNegative = 1; } else { ullv = llv; isNegative = 0; }\n              goto convertNumber;\n            } else { jk_encode_error(encodeState, @\"Unable to get scalar value from number object.\"); return(1); }\n            break;\n          case 'C': case 'I': case 'S': case 'L': case 'Q': case 'B':\n            if(JK_EXPECT_T(CFNumberGetValue((CFNumberRef)object, kCFNumberLongLongType, &ullv))) {\n            convertNumber:\n              if(JK_EXPECT_F(ullv < 10ULL)) { *--aptr = ullv + '0'; } else { while(JK_EXPECT_T(ullv > 0ULL)) { *--aptr = (ullv % 10ULL) + '0'; ullv /= 10ULL; NSCParameterAssert(aptr > anum); } }\n              if(isNegative) { *--aptr = '-'; }\n              NSCParameterAssert(aptr > anum);\n              return(jk_encode_writen(encodeState, cacheSlot, startingAtIndex, encodeCacheObject, aptr, &anum[255] - aptr));\n            } else { jk_encode_error(encodeState, @\"Unable to get scalar value from number object.\"); return(1); }\n            break;\n          case 'f': case 'd':\n            {\n              double dv;\n              if(JK_EXPECT_T(CFNumberGetValue((CFNumberRef)object, kCFNumberDoubleType, &dv))) {\n                if(JK_EXPECT_F(!isfinite(dv))) { jk_encode_error(encodeState, @\"Floating point values must be finite.  JSON does not support NaN or Infinity.\"); return(1); }\n                return(jk_encode_printf(encodeState, cacheSlot, startingAtIndex, encodeCacheObject, \"%.17g\", dv));\n              } else { jk_encode_error(encodeState, @\"Unable to get floating point value from number object.\"); return(1); }\n            }\n            break;\n          default: jk_encode_error(encodeState, @\"NSNumber conversion error, unknown type.  Type: '%c' / 0x%2.2x\", objCType[0], objCType[0]); return(1); break;\n        }\n      }\n      break;\n    \n    case JKClassArray:\n      {\n        int     printComma = 0;\n        CFIndex arrayCount = CFArrayGetCount((CFArrayRef)object), idx = 0L;\n        if(JK_EXPECT_F(jk_encode_write1(encodeState, 1L, \"[\"))) { return(1); }\n        if(JK_EXPECT_F(arrayCount > 1020L)) {\n          for(id arrayObject in object)          { if(JK_EXPECT_T(printComma)) { if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \",\"))) { return(1); } } printComma = 1; if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, arrayObject)))  { return(1); } }\n        } else {\n          void *objects[1024];\n          CFArrayGetValues((CFArrayRef)object, CFRangeMake(0L, arrayCount), (const void **)objects);\n          for(idx = 0L; idx < arrayCount; idx++) { if(JK_EXPECT_T(printComma)) { if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \",\"))) { return(1); } } printComma = 1; if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, objects[idx]))) { return(1); } }\n        }\n        return(jk_encode_write1(encodeState, -1L, \"]\"));\n      }\n      break;\n\n    case JKClassDictionary:\n      {\n        int     printComma      = 0;\n        CFIndex dictionaryCount = CFDictionaryGetCount((CFDictionaryRef)object), idx = 0L;\n        id      enumerateObject = JK_EXPECT_F(_jk_encode_prettyPrint) ? [[object allKeys] sortedArrayUsingSelector:@selector(compare:)] : object;\n\n        if(JK_EXPECT_F(jk_encode_write1(encodeState, 1L, \"{\"))) { return(1); }\n        if(JK_EXPECT_F(_jk_encode_prettyPrint) || JK_EXPECT_F(dictionaryCount > 1020L)) {\n          for(id keyObject in enumerateObject) {\n            if(JK_EXPECT_T(printComma)) { if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \",\"))) { return(1); } }\n            printComma = 1;\n            if(JK_EXPECT_F((keyObject->isa      != encodeState->fastClassLookup.stringClass)) && JK_EXPECT_F(([keyObject   isKindOfClass:[NSString class]] == NO))) { jk_encode_error(encodeState, @\"Key must be a string object.\"); return(1); }\n            if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, keyObject)))                                                        { return(1); }\n            if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \":\")))                                                                      { return(1); }\n            if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, (void *)CFDictionaryGetValue((CFDictionaryRef)object, keyObject)))) { return(1); }\n          }\n        } else {\n          void *keys[1024], *objects[1024];\n          CFDictionaryGetKeysAndValues((CFDictionaryRef)object, (const void **)keys, (const void **)objects);\n          for(idx = 0L; idx < dictionaryCount; idx++) {\n            if(JK_EXPECT_T(printComma)) { if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \",\"))) { return(1); } }\n            printComma = 1;\n            if(JK_EXPECT_F(((id)keys[idx])->isa != encodeState->fastClassLookup.stringClass) && JK_EXPECT_F([(id)keys[idx] isKindOfClass:[NSString class]] == NO)) { jk_encode_error(encodeState, @\"Key must be a string object.\"); return(1); }\n            if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, keys[idx])))    { return(1); }\n            if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \":\")))                  { return(1); }\n            if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, objects[idx]))) { return(1); }\n          }\n        }\n        return(jk_encode_write1(encodeState, -1L, \"}\"));\n      }\n      break;\n\n    case JKClassNull: return(jk_encode_writen(encodeState, cacheSlot, startingAtIndex, encodeCacheObject, \"null\", 4UL)); break;\n\n    default: jk_encode_error(encodeState, @\"Unable to serialize object class %@.\", NSStringFromClass([object class])); return(1); break;\n  }\n\n  return(0);\n}\n\n\n@implementation JKSerializer\n\n+ (id)serializeObject:(id)object options:(JKSerializeOptionFlags)optionFlags encodeOption:(JKEncodeOptionType)encodeOption block:(JKSERIALIZER_BLOCKS_PROTO)block delegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n  return([[[[self alloc] init] autorelease] serializeObject:object options:optionFlags encodeOption:encodeOption block:block delegate:delegate selector:selector error:error]);\n}\n\n- (id)serializeObject:(id)object options:(JKSerializeOptionFlags)optionFlags encodeOption:(JKEncodeOptionType)encodeOption block:(JKSERIALIZER_BLOCKS_PROTO)block delegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n#ifndef __BLOCKS__\n#pragma unused(block)\n#endif\n  NSParameterAssert((object != NULL) && (encodeState == NULL) && ((delegate != NULL) ? (block == NULL) : 1) && ((block != NULL) ? (delegate == NULL) : 1) &&\n                    (((encodeOption & JKEncodeOptionCollectionObj) != 0UL) ? (((encodeOption & JKEncodeOptionStringObj)     == 0UL) && ((encodeOption & JKEncodeOptionStringObjTrimQuotes) == 0UL)) : 1) &&\n                    (((encodeOption & JKEncodeOptionStringObj)     != 0UL) ?  ((encodeOption & JKEncodeOptionCollectionObj) == 0UL)                                                                 : 1));\n\n  id returnObject = NULL;\n\n  if(encodeState != NULL) { [self releaseState]; }\n  if((encodeState = (struct JKEncodeState *)calloc(1UL, sizeof(JKEncodeState))) == NULL) { [NSException raise:NSMallocException format:@\"Unable to allocate state structure.\"]; return(NULL); }\n\n  if((error != NULL) && (*error != NULL)) { *error = NULL; }\n\n  if(delegate != NULL) {\n    if(selector                               == NULL) { [NSException raise:NSInvalidArgumentException format:@\"The delegate argument is not NULL, but the selector argument is NULL.\"]; }\n    if([delegate respondsToSelector:selector] == NO)   { [NSException raise:NSInvalidArgumentException format:@\"The serializeUnsupportedClassesUsingDelegate: delegate does not respond to the selector argument.\"]; }\n    encodeState->classFormatterDelegate = delegate;\n    encodeState->classFormatterSelector = selector;\n    encodeState->classFormatterIMP      = (JKClassFormatterIMP)[delegate methodForSelector:selector];\n    NSCParameterAssert(encodeState->classFormatterIMP != NULL);\n  }\n\n#ifdef __BLOCKS__\n  encodeState->classFormatterBlock                          = block;\n#endif\n  encodeState->serializeOptionFlags                         = optionFlags;\n  encodeState->encodeOption                                 = encodeOption;\n  encodeState->stringBuffer.roundSizeUpToMultipleOf         = (1024UL * 32UL);\n  encodeState->utf8ConversionBuffer.roundSizeUpToMultipleOf = 4096UL;\n    \n  unsigned char stackJSONBuffer[JK_JSONBUFFER_SIZE] JK_ALIGNED(64);\n  jk_managedBuffer_setToStackBuffer(&encodeState->stringBuffer,         stackJSONBuffer, sizeof(stackJSONBuffer));\n\n  unsigned char stackUTF8Buffer[JK_UTF8BUFFER_SIZE] JK_ALIGNED(64);\n  jk_managedBuffer_setToStackBuffer(&encodeState->utf8ConversionBuffer, stackUTF8Buffer, sizeof(stackUTF8Buffer));\n\n  if(((encodeOption & JKEncodeOptionCollectionObj) != 0UL) && (([object isKindOfClass:[NSArray  class]] == NO) && ([object isKindOfClass:[NSDictionary class]] == NO))) { jk_encode_error(encodeState, @\"Unable to serialize object class %@, expected a NSArray or NSDictionary.\", NSStringFromClass([object class])); goto errorExit; }\n  if(((encodeOption & JKEncodeOptionStringObj)     != 0UL) &&  ([object isKindOfClass:[NSString class]] == NO))                                                         { jk_encode_error(encodeState, @\"Unable to serialize object class %@, expected a NSString.\", NSStringFromClass([object class])); goto errorExit; }\n\n  if(jk_encode_add_atom_to_buffer(encodeState, object) == 0) {\n    BOOL stackBuffer = ((encodeState->stringBuffer.flags & JKManagedBufferMustFree) == 0UL) ? YES : NO;\n    \n    if((encodeState->atIndex < 2UL))\n    if((stackBuffer == NO) && ((encodeState->stringBuffer.bytes.ptr = (unsigned char *)reallocf(encodeState->stringBuffer.bytes.ptr, encodeState->atIndex + 16UL)) == NULL)) { jk_encode_error(encodeState, @\"Unable to realloc buffer\"); goto errorExit; }\n\n    switch((encodeOption & JKEncodeOptionAsTypeMask)) {\n      case JKEncodeOptionAsData:\n        if(stackBuffer == YES) { if((returnObject = [(id)CFDataCreate(                 NULL,                encodeState->stringBuffer.bytes.ptr, (CFIndex)encodeState->atIndex)                                  autorelease]) == NULL) { jk_encode_error(encodeState, @\"Unable to create NSData object\"); } }\n        else                   { if((returnObject = [(id)CFDataCreateWithBytesNoCopy(  NULL,                encodeState->stringBuffer.bytes.ptr, (CFIndex)encodeState->atIndex, NULL)                            autorelease]) == NULL) { jk_encode_error(encodeState, @\"Unable to create NSData object\"); } }\n        break;\n\n      case JKEncodeOptionAsString:\n        if(stackBuffer == YES) { if((returnObject = [(id)CFStringCreateWithBytes(      NULL, (const UInt8 *)encodeState->stringBuffer.bytes.ptr, (CFIndex)encodeState->atIndex, kCFStringEncodingUTF8, NO)       autorelease]) == NULL) { jk_encode_error(encodeState, @\"Unable to create NSString object\"); } }\n        else                   { if((returnObject = [(id)CFStringCreateWithBytesNoCopy(NULL, (const UInt8 *)encodeState->stringBuffer.bytes.ptr, (CFIndex)encodeState->atIndex, kCFStringEncodingUTF8, NO, NULL) autorelease]) == NULL) { jk_encode_error(encodeState, @\"Unable to create NSString object\"); } }\n        break;\n\n      default: jk_encode_error(encodeState, @\"Unknown encode as type.\"); break;\n    }\n\n    if((returnObject != NULL) && (stackBuffer == NO)) { encodeState->stringBuffer.flags &= ~JKManagedBufferMustFree; encodeState->stringBuffer.bytes.ptr = NULL; encodeState->stringBuffer.bytes.length = 0UL; }\n  }\n\nerrorExit:\n  if((encodeState != NULL) && (error != NULL) && (encodeState->error != NULL)) { *error = encodeState->error; encodeState->error = NULL; }\n  [self releaseState];\n\n  return(returnObject);\n}\n\n- (void)releaseState\n{\n  if(encodeState != NULL) {\n    jk_managedBuffer_release(&encodeState->stringBuffer);\n    jk_managedBuffer_release(&encodeState->utf8ConversionBuffer);\n    free(encodeState); encodeState = NULL;\n  }  \n}\n\n- (void)dealloc\n{\n  [self releaseState];\n  [super dealloc];\n}\n\n@end\n\n@implementation NSString (JSONKitSerializing)\n\n////////////\n#pragma mark Methods for serializing a single NSString.\n////////////\n\n// Useful for those who need to serialize just a NSString.  Otherwise you would have to do something like [NSArray arrayWithObject:stringToBeJSONSerialized], serializing the array, and then chopping of the extra ^\\[.*\\]$ square brackets.\n\n// NSData returning methods...\n\n- (NSData *)JSONData\n{\n  return([self JSONDataWithOptions:JKSerializeOptionNone includeQuotes:YES error:NULL]);\n}\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | ((includeQuotes == NO) ? JKEncodeOptionStringObjTrimQuotes : 0UL) | JKEncodeOptionStringObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n// NSString returning methods...\n\n- (NSString *)JSONString\n{\n  return([self JSONStringWithOptions:JKSerializeOptionNone includeQuotes:YES error:NULL]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | ((includeQuotes == NO) ? JKEncodeOptionStringObjTrimQuotes : 0UL) | JKEncodeOptionStringObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n@end\n\n@implementation NSArray (JSONKitSerializing)\n\n// NSData returning methods...\n\n- (NSData *)JSONData\n{\n  return([JKSerializer serializeObject:self options:JKSerializeOptionNone encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:NULL]);\n}\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:delegate selector:selector error:error]);\n}\n\n// NSString returning methods...\n\n- (NSString *)JSONString\n{\n  return([JKSerializer serializeObject:self options:JKSerializeOptionNone encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:NULL]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:delegate selector:selector error:error]);\n}\n\n@end\n\n@implementation NSDictionary (JSONKitSerializing)\n\n// NSData returning methods...\n\n- (NSData *)JSONData\n{\n  return([JKSerializer serializeObject:self options:JKSerializeOptionNone encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:NULL]);\n}\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:delegate selector:selector error:error]);\n}\n\n// NSString returning methods...\n\n- (NSString *)JSONString\n{\n  return([JKSerializer serializeObject:self options:JKSerializeOptionNone encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:NULL]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:delegate selector:selector error:error]);\n}\n\n@end\n\n\n#ifdef __BLOCKS__\n\n@implementation NSArray (JSONKitSerializingBlockAdditions)\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:block delegate:NULL selector:NULL error:error]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:block delegate:NULL selector:NULL error:error]);\n}\n\n@end\n\n@implementation NSDictionary (JSONKitSerializingBlockAdditions)\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:block delegate:NULL selector:NULL error:error]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:block delegate:NULL selector:NULL error:error]);\n}\n\n@end\n\n#endif // __BLOCKS__\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/MainMenuViewController.h",
    "content": "//\n// Copyright 2009-2011 Facebook\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n@interface MainMenuViewController : TTTableViewController {\n\n}\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/MainMenuViewController.m",
    "content": "//\n// Copyright 2009-2011 Facebook\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n#import \"MainMenuViewController.h\"\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////////////////////////\n@implementation MainMenuViewController\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n  if (self = [super initWithNibName:nil bundle:nil]) {\n    self.title = @\"Style Catalog\";\n    //self.variableHeightRows = YES;\n    self.tableViewStyle = UITableViewStyleGrouped;\n\n    self.dataSource =\n      [TTSectionedDataSource dataSourceWithObjects:\n       @\"Text Styles\",\n       [TTTableTextItem itemWithText:@\"Link Text\"\n                                 URL:@\"tt://styles/linkText:/text\"],\n       [TTTableTextItem itemWithText:@\"Mini Badge\"\n                                 URL:@\"tt://styles/miniBadge/text\"],\n       [TTTableTextItem itemWithText:@\"Badge\"\n                                 URL:@\"tt://styles/badge/text\"],\n       [TTTableTextItem itemWithText:@\"Large Badge\"\n                                 URL:@\"tt://styles/largeBadge/text\"],\n\n       @\"Views\",\n       [TTTableTextItem itemWithText:@\"Post Text Editor\"\n                                 URL:@\"tt://styles/postTextEditor/view\"],\n       [TTTableTextItem itemWithText:@\"Photo Caption\"\n                                 URL:@\"tt://styles/photoCaption/view\"],\n       [TTTableTextItem itemWithText:@\"Photo Status Label\"\n                                 URL:@\"tt://styles/photoStatusLabel/view\"],\n       [TTTableTextItem itemWithText:@\"Page Dot\"\n                                 URL:@\"tt://styles/pageDot:/view\"],\n       [TTTableTextItem itemWithText:@\"Highlighted Link\"\n                                 URL:@\"tt://styles/linkHighlighted/view\"],\n       [TTTableTextItem itemWithText:@\"Table Header\"\n                                 URL:@\"tt://styles/tableHeader/view\"],\n       [TTTableTextItem itemWithText:@\"Picker Cell\"\n                                 URL:@\"tt://styles/pickerCell:/view\"],\n       [TTTableTextItem itemWithText:@\"Search Table Shadow\"\n                                 URL:@\"tt://styles/searchTableShadow/view\"],\n       [TTTableTextItem itemWithText:@\"Black Bezel\"\n                                 URL:@\"tt://styles/blackBezel/view\"],\n       [TTTableTextItem itemWithText:@\"White Bezel\"\n                                 URL:@\"tt://styles/whiteBezel/view\"],\n       [TTTableTextItem itemWithText:@\"Black Banner\"\n                                 URL:@\"tt://styles/blackBanner/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Bar\"\n                                 URL:@\"tt://styles/tabBar/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Strip\"\n                                 URL:@\"tt://styles/tabStrip/view\"],\n\n       @\"Tab Grid\",\n       [TTTableTextItem itemWithText:@\"Tab Grid\"\n                                 URL:@\"tt://styles/tabGrid/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Grid Top Left\"\n                                 URL:@\"tt://styles/tabGridTabTopLeft:/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Grid Top Right\"\n                                 URL:@\"tt://styles/tabGridTabTopRight:/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Grid Bottom Right\"\n                                 URL:@\"tt://styles/tabGridTabBottomRight:/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Grid Bottom Left\"\n                                 URL:@\"tt://styles/tabGridTabBottomLeft:/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Grid Left\"\n                                 URL:@\"tt://styles/tabGridTabLeft:/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Grid Right\"\n                                 URL:@\"tt://styles/tabGridTabRight:/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Grid Center\"\n                                 URL:@\"tt://styles/tabGridTabCenter:/view\"],\n\n       @\"Tabs\",\n       [TTTableTextItem itemWithText:@\"Tab\"\n                                 URL:@\"tt://styles/tab:/view\"],\n       [TTTableTextItem itemWithText:@\"Round Tab\"\n                                 URL:@\"tt://styles/tabRound:/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Left Overflow\"\n                                 URL:@\"tt://styles/tabOverflowLeft/view\"],\n       [TTTableTextItem itemWithText:@\"Tab Right Overflow\"\n                                 URL:@\"tt://styles/tabOverflowRight/view\"],\n\n       @\"Images\",\n       [TTTableTextItem itemWithText:@\"Thumb View\"\n                                 URL:@\"tt://styles/thumbView:/image\"],\n\n       @\"Launcher\",\n       [TTTableTextItem itemWithText:@\"Launcher Button\"\n                                 URL:@\"tt://styles/launcherButton:/image\"],\n       [TTTableTextItem itemWithText:@\"Launcher Close Button\"\n                                 URL:@\"tt://styles/launcherCloseButton:/view\"],\n\n       @\"Text Bar\",\n       [TTTableTextItem itemWithText:@\"Text Bar\"\n                                 URL:@\"tt://styles/textBar/view\"],\n       [TTTableTextItem itemWithText:@\"Text Bar Footer\"\n                                 URL:@\"tt://styles/textBarFooter/view\"],\n       [TTTableTextItem itemWithText:@\"Text Bar Text Field\"\n                                 URL:@\"tt://styles/textBarTextField/view\"],\n       [TTTableTextItem itemWithText:@\"Text Bar Post Button\"\n                                 URL:@\"tt://styles/textBarPostButton:/text\"],\n\n       @\"Toolbars\",\n       [TTTableTextItem itemWithText:@\"Toolbar Button\"\n                                 URL:@\"tt://styles/toolbarButton:/view\"],\n       [TTTableTextItem itemWithText:@\"Toolbar Back Button\"\n                                 URL:@\"tt://styles/toolbarBackButton:/view\"],\n       [TTTableTextItem itemWithText:@\"Toolbar Forward Button\"\n                                 URL:@\"tt://styles/toolbarForwardButton:/view\"],\n       [TTTableTextItem itemWithText:@\"Toolbar Round Button\"\n                                 URL:@\"tt://styles/toolbarRoundButton:/view\"],\n       [TTTableTextItem itemWithText:@\"Black Toolbar Button\"\n                                 URL:@\"tt://styles/blackToolbarButton:/view\"],\n       [TTTableTextItem itemWithText:@\"Gray Toolbar Button\"\n                                 URL:@\"tt://styles/grayToolbarButton:/view\"],\n       [TTTableTextItem itemWithText:@\"Black Toolbar Forward Button\"\n                                 URL:@\"tt://styles/blackToolbarForwardButton:/view\"],\n       [TTTableTextItem itemWithText:@\"Black Toolbar Round Button\"\n                                 URL:@\"tt://styles/blackToolbarRoundButton:/view\"],\n\n       @\"Search\",\n       [TTTableTextItem itemWithText:@\"Search Text Field\"\n                                 URL:@\"tt://styles/searchTextField/view\"],\n       [TTTableTextItem itemWithText:@\"Search Bar\"\n                                 URL:@\"tt://styles/searchBar/view\"],\n       [TTTableTextItem itemWithText:@\"Search Bar Bottom\"\n                                 URL:@\"tt://styles/searchBarBottom/view\"],\n       [TTTableTextItem itemWithText:@\"Black Search Bar\"\n                                 URL:@\"tt://styles/blackSearchBar/view\"],\n\n       nil];\n  }\n\n  return self;\n}\n\n\n@end\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/PlaygroundViewController.h",
    "content": "//\n// Copyright 2009-2011 Facebook\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n\n@interface PlaygroundViewController : UIViewController {\n  UIScrollView* _scrollView;\n}\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/PlaygroundViewController.m",
    "content": "//\n// Copyright 2009-2011 Facebook\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n#import \"PlaygroundViewController.h\"\n\n#import <Three20Core/NSDataAdditions.h>\n\nstatic const CGFloat kFramePadding    = 10;\nstatic const CGFloat kElementSpacing  = 5;\nstatic const CGFloat kGroupSpacing    = 10;\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////////////////////////\n@implementation PlaygroundViewController\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (CGFloat) addHeader:(NSString*)text yOffset:(CGFloat)yOffset {\n  UILabel* label = [[UILabel alloc] initWithFrame:CGRectZero];\n  label.text = text;\n  label.font = [UIFont systemFontOfSize:20];\n  label.numberOfLines = 0;\n\n  CGRect frame = label.frame;\n  frame.origin.x = kFramePadding;\n  frame.origin.y = yOffset;\n  frame.size.width = 320 - kFramePadding * 2;\n  frame.size.height = [text sizeWithFont:label.font\n                       constrainedToSize:CGSizeMake(frame.size.width, 10000)].height;\n  label.frame = frame;\n\n  [_scrollView addSubview:label];\n\n  yOffset += label.frame.size.height + kElementSpacing;\n\n  TT_RELEASE_SAFELY(label);\n\n  return yOffset;\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (CGFloat) addText:(NSString*)text yOffset:(CGFloat)yOffset {\n  UILabel* label = [[UILabel alloc] initWithFrame:CGRectZero];\n  label.text = text;\n  label.numberOfLines = 0;\n\n  CGRect frame = label.frame;\n  frame.origin.x = kFramePadding;\n  frame.origin.y = yOffset;\n  frame.size.width = 320 - kFramePadding * 2;\n  frame.size.height = [text sizeWithFont:label.font\n                       constrainedToSize:CGSizeMake(frame.size.width, 10000)].height;\n  label.frame = frame;\n\n  [_scrollView addSubview:label];\n\n  yOffset += label.frame.size.height + kElementSpacing;\n\n  TT_RELEASE_SAFELY(label);\n\n  return yOffset;\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (void) loadView {\n  [super loadView];\n\n  _scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];\n  _scrollView.autoresizingMask =\n    UIViewAutoresizingFlexibleWidth\n    | UIViewAutoresizingFlexibleHeight;\n\n  [self.view addSubview:_scrollView];\n\n  CGFloat yOffset = kFramePadding;\n\n  yOffset = [self addHeader:NSLocalizedString(@\"TTDebug\", @\"\") yOffset:yOffset];\n\n  {\n    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];\n    [button setTitle:NSLocalizedString(@\"Debug test\", @\"\") forState:UIControlStateNormal];\n    [button addTarget: self\n               action: @selector(debugTestAction)\n     forControlEvents: UIControlEventTouchUpInside];\n    [button sizeToFit];\n\n    CGRect frame = button.frame;\n    frame.origin.x = kFramePadding;\n    frame.origin.y = yOffset;\n    button.frame = frame;\n\n    [_scrollView addSubview:button];\n\n    yOffset += frame.size.height;\n  }\n\n  yOffset += kGroupSpacing;\n\n  yOffset = [self addHeader:NSLocalizedString(@\"TTGlobalCoreLocale\", @\"\") yOffset:yOffset];\n  yOffset = [self addText:[NSString stringWithFormat:NSLocalizedString(@\"Current locale: %@\", @\"\"),\n                           [TTCurrentLocale()\n                            displayNameForKey:NSLocaleIdentifier\n                                        value:[TTCurrentLocale() localeIdentifier]]]\n                  yOffset:yOffset];\n  yOffset += kGroupSpacing;\n\n  yOffset = [self addHeader:NSLocalizedString(@\"TTGlobalCorePaths\", @\"\") yOffset:yOffset];\n  yOffset = [self addText:[NSString stringWithFormat:NSLocalizedString(@\"Bundle path: %@\", @\"\"),\n                           TTPathForBundleResource(@\"Icon.png\")]\n                  yOffset:yOffset];\n  yOffset = [self addText:[NSString stringWithFormat:NSLocalizedString(@\"Document path: %@\", @\"\"),\n                           TTPathForDocumentsResource(@\"document.pdf\")]\n                  yOffset:yOffset];\n  yOffset += kGroupSpacing;\n\n  yOffset = [self addHeader:NSLocalizedString(@\"NSDataAdditions\", @\"\") yOffset:yOffset];\n  yOffset = [self addText:[NSString stringWithFormat:NSLocalizedString(@\"MD5 Hash of \\\"Three20\\\": %@\", @\"\"),\n                           [[@\"Three20\" dataUsingEncoding:NSUTF8StringEncoding] md5Hash]]\n                  yOffset:yOffset];\n  yOffset += kGroupSpacing;\n\n  [_scrollView setContentSize:CGSizeMake(320, yOffset)];\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (void) viewDidUnload {\n  [super viewDidUnload];\n\n  TT_RELEASE_SAFELY(_scrollView);\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (void) viewDidAppear:(BOOL)animated {\n  [super viewDidAppear:animated];\n\n  [_scrollView flashScrollIndicators];\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (void) debugTestAction {\n#ifdef DEBUG\n  NSLog(@\"Three20 debug logging is currently...ON\");\n#else\n  NSLog(@\"Three20 debug logging is currently...OFF\");\n#endif\n\n  // This will print the current method name.\n  TTDPRINTMETHODNAME();\n\n  TTDPRINT(@\"Showing TTDPRINT.\");\n  TTDPRINT(@\"-----------------\");\n  TTDPRINT(@\"Showing TTD log levels <= %d\", TTMAXLOGLEVEL);\n  TTDERROR(@\"This is TTDERROR, level %d.\", TTLOGLEVEL_ERROR);\n  TTDWARNING(@\"This is TTDWARNING, level %d.\", TTLOGLEVEL_WARNING);\n  TTDINFO(@\"This is TTDINFO, level %d.\", TTLOGLEVEL_INFO);\n\n  TTDPRINT(@\"\");\n  TTDPRINT(@\"Showing TTDCONDITIONLOG.\");\n  TTDPRINT(@\"------------------------\");\n  TTDCONDITIONLOG(true, @\"This will always display because the condition is \\\"true\\\"\");\n  TTDCONDITIONLOG(false, @\"This will never display because the condition is \\\"false\\\"\");\n  TTDCONDITIONLOG(rand()%2, @\"This will randomly display because the condition is \\\"rand()%2\\\"\");\n\n  TTDPRINT(@\"\");\n  TTDPRINT(@\"Showing TTDASSERT.\");\n  TTDPRINT(@\"------------------\");\n  // Should do nothing at all.\n  TTDASSERT(true);\n\n  // This will jump you into the debugger in the simulator.\n  // Note that this isn't a crash! Simply the equivalent of setting\n  // a breakpoint in the debugger, but programmatically. These TTDASSERTs\n  // will be completely stripped away from your final product, assuming\n  // you don't declare the DEBUG preprocessor macro (and you shouldn't in\n  // your final product).\n  TTDASSERT(false);\n}\n\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/SBJsonParser.h",
    "content": "/*\n Copyright (C) 2009 Stig Brautaset. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n\n/**\n @brief Parse JSON Strings and NSData objects\n\n This uses SBJsonStreamParser internally.\n\n @see @ref objc2json\n\n */\n\n@interface SBJsonParser : NSObject\n\n/**\n @brief The maximum recursing depth.\n\n Defaults to 32. If the input is nested deeper than this the input will be deemed to be\n malicious and the parser returns nil, signalling an error. (\"Nested too deep\".) You can\n turn off this security feature by setting the maxDepth value to 0.\n */\n@property NSUInteger maxDepth;\n\n/**\n @brief Description of parse error\n\n This method returns the trace of the last method that failed.\n You need to check the return value of the call you're making to figure out\n if the call actually failed, before you know call this method.\n\n @return A string describing the error encountered, or nil if no error occured.\n\n */\n@property(copy) NSString *error;\n\n/**\n @brief Return the object represented by the given NSData object.\n\n The data *must* be UTF8 encoded.\n \n @param data An NSData containing UTF8 encoded data to parse.\n @return The NSArray or NSDictionary represented by the object, or nil if an error occured.\n\n */\n- (id)objectWithData:(NSData*)data;\n\n/**\n @brief Return the object represented by the given string\n\n This method converts its input to an NSData object containing UTF8 and calls -objectWithData: with it.\n\n @return The NSArray or NSDictionary represented by the object, or nil if an error occured.\n */\n- (id)objectWithString:(NSString *)repr;\n\n/**\n @brief Return the object represented by the given string\n\n This method calls objectWithString: internally. If an error occurs, and if @p error\n is not nil, it creates an NSError object and returns this through its second argument.\n\n @param jsonText the json string to parse\n @param error pointer to an NSError object to populate on error\n\n @return The NSArray or NSDictionary represented by the object, or nil if an error occured.\n */\n\n- (id)objectWithString:(NSString*)jsonText\n                 error:(NSError**)error;\n\n@end\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/SBJsonParser.m",
    "content": "/*\n Copyright (C) 2009,2010 Stig Brautaset. All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n \n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n \n * Neither the name of the author nor the names of its contributors may be used\n   to endorse or promote products derived from this software without specific\n   prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"SBJsonParser.h\"\n#import \"SBJsonStreamParser.h\"\n#import \"SBJsonStreamParserAdapter.h\"\n#import \"SBJsonStreamParserAccumulator.h\"\n\n@implementation SBJsonParser\n\n@synthesize maxDepth;\n@synthesize error;\n\n- (id)init {\n    self = [super init];\n    if (self)\n        self.maxDepth = 32u;\n    return self;\n}\n\n\n#pragma mark Methods\n\n- (id)objectWithData:(NSData *)data {\n\n    if (!data) {\n        self.error = @\"Input was 'nil'\";\n        return nil;\n    }\n\n\tSBJsonStreamParserAccumulator *accumulator = [[SBJsonStreamParserAccumulator alloc] init];\n    \n    SBJsonStreamParserAdapter *adapter = [[SBJsonStreamParserAdapter alloc] init];\n    adapter.delegate = accumulator;\n\t\n\tSBJsonStreamParser *parser = [[SBJsonStreamParser alloc] init];\n\tparser.maxDepth = self.maxDepth;\n\tparser.delegate = adapter;\n\t\n\tswitch ([parser parse:data]) {\n\t\tcase SBJsonStreamParserComplete:\n            return accumulator.value;\n\t\t\tbreak;\n\t\t\t\n\t\tcase SBJsonStreamParserWaitingForData:\n\t\t    self.error = @\"Unexpected end of input\";\n\t\t\tbreak;\n\n\t\tcase SBJsonStreamParserError:\n\t\t    self.error = parser.error;\n\t\t\tbreak;\n\t}\n\t\n\treturn nil;\n}\n\n- (id)objectWithString:(NSString *)repr {\n\treturn [self objectWithData:[repr dataUsingEncoding:NSUTF8StringEncoding]];\n}\n\n- (id)objectWithString:(NSString*)repr error:(NSError**)error_ {\n\tid tmp = [self objectWithString:repr];\n    if (tmp)\n        return tmp;\n    \n    if (error_) {\n\t\tNSDictionary *ui = [NSDictionary dictionaryWithObjectsAndKeys:error, NSLocalizedDescriptionKey, nil];\n        *error_ = [NSError errorWithDomain:@\"org.brautaset.SBJsonParser.ErrorDomain\" code:0 userInfo:ui];\n\t}\n\t\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/Siesta.h",
    "content": "//\n//  Siesta.h\n//  Siesta\n//\n//  Created by Paul on 2015/6/14.\n//  Copyright © 2015 Bust Out Solutions. MIT license.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for Siesta.\nFOUNDATION_EXPORT double SiestaVersionNumber;\n\n//! Project version string for Siesta.\nFOUNDATION_EXPORT const unsigned char SiestaVersionString[];\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/StyleViewController.h",
    "content": "//\n// Copyright 2009-2011 Facebook\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n@interface StyleViewController : TTViewController {\n@private\n  TTStyle*  _style;\n  TTStyle*  _styleHighlight;\n  TTStyle*  _styleDisabled;\n  TTStyle*  _styleSelected;\n  NSString* _styleType;\n}\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/StyleViewController.m",
    "content": "//\n// Copyright 2009-2011 Facebook\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n#import \"StyleViewController.h\"\n\n#import \"StyleView.h\"\n\nNSString* kTextStyleType  = @\"text\";\nNSString* kViewStyleType  = @\"view\";\nNSString* kImageStyleType = @\"image\";\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////////////////////////\n@implementation StyleViewController\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (id)initWithStyleName:(NSString*)name styleType:(NSString*)styleType {\n  if (self = [super initWithNibName:nil bundle:nil]) {\n    self.title = name;\n\n    _style = [[[TTStyleSheet globalStyleSheet] styleWithSelector:name] retain];\n    _styleHighlight = [[[TTStyleSheet globalStyleSheet]\n                        styleWithSelector: name\n                        forState: UIControlStateHighlighted] retain];\n    _styleDisabled = [[[TTStyleSheet globalStyleSheet]\n                      styleWithSelector: name\n                       forState: UIControlStateDisabled] retain];\n    _styleSelected = [[[TTStyleSheet globalStyleSheet]\n                       styleWithSelector: name\n                       forState: UIControlStateSelected] retain];\n\n    _styleType = [styleType copy];\n  }\n\n  return self;\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (void)dealloc {\n  TT_RELEASE_SAFELY(_style);\n  TT_RELEASE_SAFELY(_styleHighlight);\n  TT_RELEASE_SAFELY(_styleDisabled);\n  TT_RELEASE_SAFELY(_styleSelected);\n  TT_RELEASE_SAFELY(_styleType);\n\n  [super dealloc];\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n#pragma mark UIViewController\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (void)addTextView:(NSString*)title frame:(CGRect)frame style:(TTStyle*)style {\n  CGRect textFrame = TTRectInset(frame, UIEdgeInsetsMake(20, 20, 20, 20));\n  StyleView* text = [[StyleView alloc]\n                     initWithFrame:textFrame];\n  text.text = title;\n  TTStyleContext* context = [[TTStyleContext alloc] init];\n  context.frame = frame;\n  context.delegate = text;\n  context.font = [UIFont systemFontOfSize:[UIFont systemFontSize]];\n  CGSize size = [style addToSize:CGSizeZero context:context];\n  TT_RELEASE_SAFELY(context);\n\n  size.width += 20;\n  size.height += 20;\n  textFrame.size = size;\n  text.frame = textFrame;\n\n  text.style = style;\n  text.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:1 alpha:1];\n  text.autoresizingMask =\n  UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;\n\n  [self.view addSubview:text];\n  TT_RELEASE_SAFELY(text);\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (void)addView:(CGRect)frame style:(TTStyle*)style {\n  CGRect viewFrame = TTRectInset(frame, UIEdgeInsetsMake(20, 20, 20, 20));\n  StyleView* view = [[StyleView alloc]\n                     initWithFrame:viewFrame];\n\n  view.style = style;\n  view.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:1 alpha:1];\n  view.autoresizingMask =\n  UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;\n\n  [self.view addSubview:view];\n  TT_RELEASE_SAFELY(view);\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (void)addImageView:(CGRect)frame style:(TTStyle*)style {\n  CGRect viewFrame = TTRectInset(frame, UIEdgeInsetsMake(20, 20, 20, 20));\n  TTImageView* view = [[TTImageView alloc]\n                       initWithFrame:viewFrame];\n\n  view.urlPath = @\"bundle://Icon.png\";\n  view.style = style;\n  view.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:1 alpha:1];\n  view.autoresizingMask =\n  UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;\n  CGRect imageFrame = view.frame;\n  imageFrame.size = view.image.size;\n  view.frame = imageFrame;\n\n  [self.view addSubview:view];\n  TT_RELEASE_SAFELY(view);\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n- (void)loadView {\n  [super loadView];\n\n  CGRect frame = self.view.bounds;\n  frame.size.height /= 4;\n\n  if ([_styleType isEqualToString:kTextStyleType]) {\n    [self addTextView:@\"UIControlStateNormal\" frame:frame style:_style];\n\n    frame.origin.y += frame.size.height;\n    [self addTextView:@\"UIControlStateHighlighted\" frame:frame style:_styleHighlight];\n\n    frame.origin.y += frame.size.height;\n    [self addTextView:@\"UIControlStateDisabled\" frame:frame style:_styleDisabled];\n\n    frame.origin.y += frame.size.height;\n    [self addTextView:@\"UIControlStateSelected\" frame:frame style:_styleSelected];\n\n  } else if ([_styleType isEqualToString:kViewStyleType]) {\n    [self addView:frame style:_style];\n\n    frame.origin.y += frame.size.height;\n    [self addView:frame style:_styleHighlight];\n\n    frame.origin.y += frame.size.height;\n    [self addView:frame style:_styleDisabled];\n\n    frame.origin.y += frame.size.height;\n    [self addView:frame style:_styleSelected];\n\n  } else if ([_styleType isEqualToString:kImageStyleType]) {\n    [self addImageView:frame style:_style];\n\n    frame.origin.y += frame.size.height;\n    [self addImageView:frame style:_styleHighlight];\n\n    frame.origin.y += frame.size.height;\n    [self addImageView:frame style:_styleDisabled];\n\n    frame.origin.y += frame.size.height;\n    [self addImageView:frame style:_styleSelected];\n\n  }\n}\n\n\n@end\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/TUITableView.h",
    "content": "/*\n Copyright 2011 Twitter, Inc.\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this work except in compliance with the License.\n You may obtain a copy of the License in the LICENSE file, or at:\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n#import \"TUIScrollView.h\"\n#import \"TUIFastIndexPath.h\"\n\ntypedef enum {\n\tTUITableViewStylePlain,              // regular table view\n\tTUITableViewStyleGrouped, // grouped table view—headers stick to the top of the table view and scroll with it\n} TUITableViewStyle;\n\ntypedef enum {\n\tTUITableViewScrollPositionNone,        \n\tTUITableViewScrollPositionTop,    \n\tTUITableViewScrollPositionMiddle,   \n\tTUITableViewScrollPositionBottom,\n\tTUITableViewScrollPositionToVisible, // currently the only supported arg\n} TUITableViewScrollPosition;\n\ntypedef enum {\n  TUITableViewInsertionMethodBeforeIndex  = NSOrderedAscending,\n  TUITableViewInsertionMethodAtIndex      = NSOrderedSame,\n  TUITableViewInsertionMethodAfterIndex   = NSOrderedDescending\n} TUITableViewInsertionMethod;\n\n@class TUITableViewCell;\n@protocol TUITableViewDataSource;\n\n@class TUITableView;\n\n@protocol TUITableViewDelegate<NSObject, TUIScrollViewDelegate>\n\n- (CGFloat)tableView:(TUITableView *)tableView heightForRowAtIndexPath:(TUIFastIndexPath *)indexPath;\n\n@optional\n\n- (void)tableView:(TUITableView *)tableView willDisplayCell:(TUITableViewCell *)cell forRowAtIndexPath:(TUIFastIndexPath *)indexPath; // called after the cell's frame has been set but before it's added as a subview\n- (void)tableView:(TUITableView *)tableView didSelectRowAtIndexPath:(TUIFastIndexPath *)indexPath; // happens on left/right mouse down, key up/down\n- (void)tableView:(TUITableView *)tableView didDeselectRowAtIndexPath:(TUIFastIndexPath *)indexPath;\n- (void)tableView:(TUITableView *)tableView didClickRowAtIndexPath:(TUIFastIndexPath *)indexPath withEvent:(NSEvent *)event; // happens on left/right mouse up (can look at clickCount)\n\n- (BOOL)tableView:(TUITableView*)tableView shouldSelectRowAtIndexPath:(TUIFastIndexPath*)indexPath forEvent:(NSEvent*)event; // YES, if not implemented\n- (NSMenu *)tableView:(TUITableView *)tableView menuForRowAtIndexPath:(TUIFastIndexPath *)indexPath withEvent:(NSEvent *)event;\n\n// the following are good places to update or restore state (such as selection) when the table data reloads\n- (void)tableViewWillReloadData:(TUITableView *)tableView;\n- (void)tableViewDidReloadData:(TUITableView *)tableView;\n\n// the following is optional for row reordering\n- (TUIFastIndexPath *)tableView:(TUITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(TUIFastIndexPath *)fromPath toProposedIndexPath:(TUIFastIndexPath *)proposedPath;\n\n@end\n\n@interface TUITableView : TUIScrollView\n{\n\tTUITableViewStyle             _style;\n\t__unsafe_unretained id <TUITableViewDataSource>\t_dataSource; // weak\n\tNSArray                     * _sectionInfo;\n\t\n\tTUIView                     * _pullDownView;\n\tTUIView\t\t\t\t\t\t\t        * _headerView;\n\t\n\tCGSize                        _lastSize;\n\tCGFloat                       _contentHeight;\n\t\n\tNSMutableIndexSet           * _visibleSectionHeaders;\n\tNSMutableDictionary         * _visibleItems;\n\tNSMutableDictionary         * _reusableTableCells;\n\t\n\tTUIFastIndexPath            * _selectedIndexPath;\n\tTUIFastIndexPath            * _indexPathShouldBeFirstResponder;\n\tNSInteger                     _futureMakeFirstResponderToken;\n\tTUIFastIndexPath            * _keepVisibleIndexPathForReload;\n\tCGFloat                       _relativeOffsetForReload;\n\t\n\t// drag-to-reorder state\n  TUITableViewCell            * _dragToReorderCell;\n  CGPoint                       _currentDragToReorderLocation;\n  CGPoint                       _currentDragToReorderMouseOffset;\n  TUIFastIndexPath            * _currentDragToReorderIndexPath;\n  TUITableViewInsertionMethod   _currentDragToReorderInsertionMethod;\n  TUIFastIndexPath            * _previousDragToReorderIndexPath;\n  TUITableViewInsertionMethod   _previousDragToReorderInsertionMethod;\n  \n\tstruct {\n\t\tunsigned int animateSelectionChanges:1;\n\t\tunsigned int forceSaveScrollPosition:1;\n\t\tunsigned int derepeaterEnabled:1;\n\t\tunsigned int layoutSubviewsReentrancyGuard:1;\n\t\tunsigned int didFirstLayout:1;\n\t\tunsigned int dataSourceNumberOfSectionsInTableView:1;\n\t\tunsigned int delegateTableViewWillDisplayCellForRowAtIndexPath:1;\n\t\tunsigned int maintainContentOffsetAfterReload:1;\n\t} _tableFlags;\n\t\n}\n\n- (id)initWithFrame:(CGRect)frame style:(TUITableViewStyle)style;                // must specify style at creation. -initWithFrame: calls this with UITableViewStylePlain\n\n@property (nonatomic,unsafe_unretained) id <TUITableViewDataSource>  dataSource;\n@property (nonatomic,unsafe_unretained) id <TUITableViewDelegate>    delegate;\n\n@property (readwrite, assign) BOOL                        animateSelectionChanges;\n@property (nonatomic, assign) BOOL maintainContentOffsetAfterReload;\n\n- (void)reloadData;\n\n/**\n The table view itself has mechanisms for maintaining scroll position. During a live resize the table view should automatically \"do the right thing\".  This method may be useful during a reload if you want to stay in the same spot.  Use it instead of -reloadData.\n */\n- (void)reloadDataMaintainingVisibleIndexPath:(TUIFastIndexPath *)indexPath relativeOffset:(CGFloat)relativeOffset;\n\n// Forces a re-calculation and re-layout of the table. This is most useful for animating the relayout. It is potentially _more_ expensive than -reloadData since it has to allow for animating.\n- (void)reloadLayout;\n\n- (NSInteger)numberOfSections;\n- (NSInteger)numberOfRowsInSection:(NSInteger)section;\n\n- (CGRect)rectForHeaderOfSection:(NSInteger)section;\n- (CGRect)rectForSection:(NSInteger)section;\n- (CGRect)rectForRowAtIndexPath:(TUIFastIndexPath *)indexPath;\n\n- (NSIndexSet *)indexesOfSectionsInRect:(CGRect)rect;\n- (NSIndexSet *)indexesOfSectionHeadersInRect:(CGRect)rect;\n- (TUIFastIndexPath *)indexPathForCell:(TUITableViewCell *)cell;                      // returns nil if cell is not visible\n- (NSArray *)indexPathsForRowsInRect:(CGRect)rect;                                    // returns nil if rect not valid\n- (TUIFastIndexPath *)indexPathForRowAtPoint:(CGPoint)point;\n- (TUIFastIndexPath *)indexPathForRowAtVerticalOffset:(CGFloat)offset;\n- (NSInteger)indexOfSectionWithHeaderAtPoint:(CGPoint)point;\n- (NSInteger)indexOfSectionWithHeaderAtVerticalOffset:(CGFloat)offset;\n\n- (void)enumerateIndexPathsUsingBlock:(void (^)(TUIFastIndexPath *indexPath, BOOL *stop))block;\n- (void)enumerateIndexPathsWithOptions:(NSEnumerationOptions)options usingBlock:(void (^)(TUIFastIndexPath *indexPath, BOOL *stop))block;\n- (void)enumerateIndexPathsFromIndexPath:(TUIFastIndexPath *)fromIndexPath toIndexPath:(TUIFastIndexPath *)toIndexPath withOptions:(NSEnumerationOptions)options usingBlock:(void (^)(TUIFastIndexPath *indexPath, BOOL *stop))block;\n\n- (TUIView *)headerViewForSection:(NSInteger)section;\n- (TUITableViewCell *)cellForRowAtIndexPath:(TUIFastIndexPath *)indexPath;            // returns nil if cell is not visible or index path is out of range\n- (NSArray *)visibleCells; // no particular order\n- (NSArray *)sortedVisibleCells; // top to bottom\n- (NSArray *)indexPathsForVisibleRows;\n\n- (void)scrollToRowAtIndexPath:(TUIFastIndexPath *)indexPath atScrollPosition:(TUITableViewScrollPosition)scrollPosition animated:(BOOL)animated;\n\n- (TUIFastIndexPath *)indexPathForSelectedRow;                                       // return nil or index path representing section and row of selection.\n- (TUIFastIndexPath *)indexPathForFirstRow;\n- (TUIFastIndexPath *)indexPathForLastRow;\n\n- (void)selectRowAtIndexPath:(TUIFastIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(TUITableViewScrollPosition)scrollPosition;\n- (void)deselectRowAtIndexPath:(TUIFastIndexPath *)indexPath animated:(BOOL)animated;\n\n/**\n Above the top cell, only visible if you pull down (if you have scroll bouncing enabled)\n */\n@property (nonatomic, strong) TUIView *pullDownView;\n\n- (BOOL)pullDownViewIsVisible;\n\n@property (nonatomic, strong) TUIView *headerView;\n\n/**\n Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.\n */\n- (TUITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;\n\n@end\n\n@protocol TUITableViewDataSource<NSObject>\n\n@required\n\n- (NSInteger)tableView:(TUITableView *)table numberOfRowsInSection:(NSInteger)section;\n\n- (TUITableViewCell *)tableView:(TUITableView *)tableView cellForRowAtIndexPath:(TUIFastIndexPath *)indexPath;\n\n@optional\n\n- (TUIView *)tableView:(TUITableView *)tableView headerViewForSection:(NSInteger)section;\n\n// the following are required to support row reordering\n- (BOOL)tableView:(TUITableView *)tableView canMoveRowAtIndexPath:(TUIFastIndexPath *)indexPath;\n- (void)tableView:(TUITableView *)tableView moveRowAtIndexPath:(TUIFastIndexPath *)fromIndexPath toIndexPath:(TUIFastIndexPath *)toIndexPath;\n\n// the following are required to support row reordering\n- (BOOL)tableView:(TUITableView *)tableView canMoveRowAtIndexPath:(TUIFastIndexPath *)indexPath;\n- (void)tableView:(TUITableView *)tableView moveRowAtIndexPath:(TUIFastIndexPath *)fromIndexPath toIndexPath:(TUIFastIndexPath *)toIndexPath;\n\n/**\n Default is 1 if not implemented\n */\n- (NSInteger)numberOfSectionsInTableView:(TUITableView *)tableView;\n\n@end\n\n@interface NSIndexPath (TUITableView)\n\n+ (NSIndexPath *)indexPathForRow:(NSUInteger)row inSection:(NSUInteger)section;\n\n@property(nonatomic,readonly) NSUInteger section;\n@property(nonatomic,readonly) NSUInteger row;\n\n@end\n\n#import \"TUITableViewCell.h\"\n#import \"TUITableView+Derepeater.h\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/TUITableView.m",
    "content": "/*\n Copyright 2011 Twitter, Inc.\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this work except in compliance with the License.\n You may obtain a copy of the License in the LICENSE file, or at:\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n#import \"TUITableView.h\"\n#import \"TUITableView+Cell.h\"\n#import \"TUITableViewSectionHeader.h\"\n#import \"TUINSView.h\"\n\n// header views need to be above the cells at all times\n#define HEADER_Z_POSITION 1000 \n\ntypedef struct {\n\tCGFloat offset; // from beginning of section\n\tCGFloat height;\n} TUITableViewRowInfo;\n\n@interface TUITableViewSection : NSObject\n{\n\t__unsafe_unretained TUITableView  *_tableView;   // weak\n\tTUIView              *_headerView;  // Not reusable (similar to UITableView)\n\tNSInteger             sectionIndex;\n\tNSUInteger            numberOfRows;\n\tCGFloat               sectionHeight;\n\tCGFloat               sectionOffset;\n\tTUITableViewRowInfo  *rowInfo;\n}\n\n@property (strong, readonly) TUIView           *headerView;\n@property (nonatomic, assign) CGFloat   sectionOffset;\n@property (readonly) NSInteger          sectionIndex;\n\n@end\n\n@implementation TUITableViewSection\n\n@synthesize sectionOffset;\n@synthesize sectionIndex;\n\n- (id)initWithNumberOfRows:(NSUInteger)n sectionIndex:(NSInteger)s tableView:(TUITableView *)t\n{\n\tif((self = [super init])){\n\t\t_tableView = t;\n\t\tsectionIndex = s;\n\t\tnumberOfRows = n;\n\t\trowInfo = calloc(n, sizeof(TUITableViewRowInfo));\n\t}\n\treturn self;\n}\n\n- (void)dealloc\n{\n\tif(rowInfo) free(rowInfo);\n}\n\n- (NSUInteger)numberOfRows\n{\n\treturn numberOfRows;\n}\n\n- (void)_setupRowHeights\n{\n\tsectionHeight = 0.0;\n\t\n\tTUIView *header;\n\tif((header = self.headerView) != nil) {\n\t\tsectionHeight += roundf(header.frame.size.height);\n\t}\n  \n\tfor(int i = 0; i < numberOfRows; ++i) {\n\t\tCGFloat h = roundf([_tableView.delegate tableView:_tableView heightForRowAtIndexPath:[TUIFastIndexPath indexPathForRow:i inSection:sectionIndex]]);\n\t\trowInfo[i].offset = sectionHeight;\n\t\trowInfo[i].height = h;\n\t\tsectionHeight += h;\n\t}\n\t\n}\n\n- (CGFloat)rowHeight:(NSInteger)i\n{\n\tif(i >= 0 && i < numberOfRows) {\n\t\treturn rowInfo[i].height;\n\t}\n\treturn 0.0;\n}\n\n- (CGFloat)sectionRowOffset:(NSInteger)i\n{\n\tif(i >= 0 && i < numberOfRows){\n\t\treturn rowInfo[i].offset;\n\t}\n\treturn 0.0;\n}\n\n- (CGFloat)tableRowOffset:(NSInteger)i\n{\n\treturn sectionOffset + [self sectionRowOffset:i];\n}\n\n- (CGFloat)sectionHeight\n{\n\treturn sectionHeight;\n}\n\n- (CGFloat)headerHeight\n{\n\treturn (self.headerView != nil) ? self.headerView.frame.size.height : 0;\n}\n\n/**\n * @brief Obtain the section header view.\n * \n * The section header view is created lazily via the data source when this\n * method is first called.\n * \n * @return section header view\n */\n- (TUIView *)headerView\n{\n\tif(_headerView == nil) {\n\t\tif(_tableView.dataSource != nil && [_tableView.dataSource respondsToSelector:@selector(tableView:headerViewForSection:)]){\n\t\t\t_headerView = [_tableView.dataSource tableView:_tableView headerViewForSection:sectionIndex];\n\t\t\t_headerView.autoresizingMask = TUIViewAutoresizingFlexibleWidth;\n\t\t\t_headerView.layer.zPosition = HEADER_Z_POSITION;\n\t\t}\n\t}\n\treturn _headerView;\n}\n\n@end\n\n@interface TUITableView (Private)\n- (void)_updateSectionInfo;\n- (void)_updateDerepeaterViews;\n@end\n\n@implementation TUITableView\n\n@synthesize pullDownView=_pullDownView;\n@synthesize headerView=_headerView;\n\n- (id)initWithFrame:(CGRect)frame style:(TUITableViewStyle)style\n{\n\tif((self = [super initWithFrame:frame])) {\n\t\t_style = style;\n\t\t_reusableTableCells = [[NSMutableDictionary alloc] init];\n\t\t_visibleSectionHeaders = [[NSMutableIndexSet alloc] init];\n\t\t_visibleItems = [[NSMutableDictionary alloc] init];\n\t\t_tableFlags.animateSelectionChanges = 1;\n\t}\n\treturn self;\n}\n\n- (id)initWithFrame:(CGRect)frame\n{\n\treturn [self initWithFrame:frame style:TUITableViewStylePlain];\n}\n\n\n- (id<TUITableViewDelegate>)delegate\n{\n\treturn (id<TUITableViewDelegate>)[super delegate];\n}\n\n- (void)setDelegate:(id<TUITableViewDelegate>)d\n{\n\t_tableFlags.delegateTableViewWillDisplayCellForRowAtIndexPath = [d respondsToSelector:@selector(tableView:willDisplayCell:forRowAtIndexPath:)];\n\t[super setDelegate:d]; // must call super\n}\n\n- (id<TUITableViewDataSource>)dataSource\n{\n\treturn _dataSource;\n}\n\n- (void)setDataSource:(id<TUITableViewDataSource>)d\n{\n\t_dataSource = d;\n\t_tableFlags.dataSourceNumberOfSectionsInTableView = [_dataSource respondsToSelector:@selector(numberOfSectionsInTableView:)];\n}\n\n- (BOOL)animateSelectionChanges\n{\n\treturn _tableFlags.animateSelectionChanges;\n}\n\n- (void)setAnimateSelectionChanges:(BOOL)a\n{\n\t_tableFlags.animateSelectionChanges = a;\n}\n\n- (NSInteger)numberOfSections\n{\n\treturn [_sectionInfo count];\n}\n\n- (NSInteger)numberOfRowsInSection:(NSInteger)section\n{\n\treturn [[_sectionInfo objectAtIndex:section] numberOfRows];\n}\n\n- (CGRect)rectForHeaderOfSection:(NSInteger)section {\n\tif(section >= 0 && section < [_sectionInfo count]){\n\t\tTUITableViewSection *s = [_sectionInfo objectAtIndex:section];\n\t\tCGFloat offset = [s sectionOffset];\n\t\tCGFloat height = [s headerHeight];\n\t\tCGFloat y = _contentHeight - offset - height;\n\t\treturn CGRectMake(0, y, self.bounds.size.width, height);\n\t}\n\treturn CGRectZero;\n}\n\n- (CGRect)rectForSection:(NSInteger)section\n{\n\tif(section >= 0 && section < [_sectionInfo count]){\n\t\tTUITableViewSection *s = [_sectionInfo objectAtIndex:section];\n\t\tCGFloat offset = [s sectionOffset];\n\t\tCGFloat height = [s sectionHeight];\n\t\tCGFloat y = _contentHeight - offset - height;\n\t\treturn CGRectMake(0, y, self.bounds.size.width, height);\n\t}\n\treturn CGRectZero;\n}\n\n- (CGRect)rectForRowAtIndexPath:(TUIFastIndexPath *)indexPath\n{\n\tNSInteger section = indexPath.section;\n\tNSInteger row = indexPath.row;\n\tif(section >= 0 && section < [_sectionInfo count]) {\n\t\tTUITableViewSection *s = [_sectionInfo objectAtIndex:section];\n\t\tCGFloat offset = [s tableRowOffset:row];\n\t\tCGFloat height = [s rowHeight:row];\n\t\tCGFloat y = _contentHeight - offset - height;\n\t\treturn CGRectMake(0, y, self.bounds.size.width, height);\n\t}\n\treturn CGRectZero;\n}\n\n/**\n * @brief Update section info\n * \n * The previous section info is released and new section info is created.\n */\n- (void)_updateSectionInfo {\n  \n  if(_sectionInfo != nil){\n    \n    // remove any visible headers, they should be re-added when the table is laid out\n    for(TUITableViewSection *section in _sectionInfo){\n      TUIView *headerView;\n      if((headerView = [section headerView]) != nil){\n        [headerView removeFromSuperview];\n      }\n    }\n    \n    // clear visible section headers\n    [_visibleSectionHeaders removeAllIndexes];\n    // clear the section info array\n\t_sectionInfo = nil;\n  }\n  \n\tNSInteger numberOfSections = 1;\n\tif(_tableFlags.dataSourceNumberOfSectionsInTableView){\n\t\tnumberOfSections = [_dataSource numberOfSectionsInTableView:self];\n\t}\n\t\n\tNSMutableArray *sections = [[NSMutableArray alloc] initWithCapacity:numberOfSections];\n\t\n\tCGFloat offset = [_headerView bounds].size.height - self.contentInset.top*2;\n\tfor(int s = 0; s < numberOfSections; ++s) {\n\t\tTUITableViewSection *section = [[TUITableViewSection alloc] initWithNumberOfRows:[_dataSource tableView:self numberOfRowsInSection:s] sectionIndex:s tableView:self];\n\t\t[section _setupRowHeights];\n\t\tsection.sectionOffset = offset;\n\t\toffset += [section sectionHeight];\n\t\t[sections addObject:section];\n\t}\n\t\n\t_contentHeight = offset - self.contentInset.bottom;\n\t_sectionInfo = sections;\n\t\n}\n\n- (void)_enqueueReusableCell:(TUITableViewCell *)cell\n{\n\tNSString *identifier = cell.reuseIdentifier;\n\t\n\tif(!identifier)\n\t\treturn;\n\t\n\tNSMutableArray *array = [_reusableTableCells objectForKey:identifier];\n\tif(!array) {\n\t\tarray = [[NSMutableArray alloc] init];\n\t\t[_reusableTableCells setObject:array forKey:identifier];\n\t}\n\t[array addObject:cell];\n}\n\n- (TUITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier\n{\n\tif(!identifier)\n\t\treturn nil;\n\t\n\tNSMutableArray *array = [_reusableTableCells objectForKey:identifier];\n\tif(array) {\n\t\tTUITableViewCell *c = [array lastObject];\n\t\tif(c) {\n\t\t\t[array removeLastObject];\n\t\t\t[c prepareForReuse];\n\t\t\treturn c;\n\t\t}\n\t}\n\treturn nil;\n}\n\n/**\n * @brief Obtain the header view for the specified section\n * \n * If the section has no header, nil is returned.\n * \n * @param section the section\n * @return section header\n */\n- (TUIView *)headerViewForSection:(NSInteger)section {\n  if(section >= 0 && section < [_sectionInfo count]){\n    return [(TUITableViewSection *)[_sectionInfo objectAtIndex:section] headerView];\n  }else{\n    return nil;\n  }\n}\n\n- (TUITableViewCell *)cellForRowAtIndexPath:(TUIFastIndexPath *)indexPath // returns nil if cell is not visible or index path is out of range\n{\n\treturn [_visibleItems objectForKey:indexPath];\n}\n\n- (NSArray *)visibleCells\n{\n\treturn [_visibleItems allValues];\n}\n\nstatic NSInteger SortCells(TUITableViewCell *a, TUITableViewCell *b, void *ctx)\n{\n\tif(a.frame.origin.y > b.frame.origin.y)\n\t\treturn NSOrderedAscending;\n\treturn NSOrderedDescending;\n}\n\n- (NSArray *)sortedVisibleCells\n{\n\tNSArray *v = [self visibleCells];\n\treturn [v sortedArrayUsingComparator:(NSComparator)^NSComparisonResult(TUITableViewCell *a, TUITableViewCell *b) {\n\t\tif(a.frame.origin.y > b.frame.origin.y)\n\t\t\treturn NSOrderedAscending;\n\t\treturn NSOrderedDescending;\n\t}];\n}\n\n#define INDEX_PATHS_FOR_VISIBLE_ROWS [_visibleItems allKeys]\n\n- (NSArray *)indexPathsForVisibleRows\n{\n\treturn INDEX_PATHS_FOR_VISIBLE_ROWS;\n}\n\n- (TUIFastIndexPath *)indexPathForCell:(TUITableViewCell *)c\n{\n\tfor(TUIFastIndexPath *i in _visibleItems) {\n\t\tTUITableViewCell *cell = [_visibleItems objectForKey:i];\n\t\tif(cell == c)\n\t\t\treturn i;\n\t}\n\treturn nil;\n}\n\n/**\n * @brief Obtain the indexes of sections which intersect @p rect.\n * \n * @param rect the rect\n * @return intersecting sections\n */\n- (NSIndexSet *)indexesOfSectionsInRect:(CGRect)rect\n{\n\tNSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init];\n\t\n\tfor(int i = 0; i < [_sectionInfo count]; i++) {\n\t\tif(CGRectIntersectsRect([self rectForSection:i], rect)){\n\t\t\t[indexes addIndex:i];\n\t\t}\n\t}\n\t\n\treturn indexes;\n}\n\n/**\n * @brief Obtain the indexes of sections whose header views intersect @p rect.\n * \n * @param rect the rect\n * @return intersecting sections\n */\n- (NSIndexSet *)indexesOfSectionHeadersInRect:(CGRect)rect\n{\n\tNSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init];\n\t\n\tfor(int i = 0; i < [_sectionInfo count]; i++) {\n\t\tif(CGRectIntersectsRect([self rectForHeaderOfSection:i], rect)){\n\t\t\t[indexes addIndex:i];\n\t\t}\n\t}\n\t\n\treturn indexes;\n}\n\n- (NSArray *)indexPathsForRowsInRect:(CGRect)rect\n{\n\tNSMutableArray *indexPaths = [NSMutableArray arrayWithCapacity:50];\n\tNSInteger sectionIndex = 0;\n\tfor(TUITableViewSection *section in _sectionInfo) {\n\t\tNSInteger numberOfRows = [section numberOfRows];\n\t\tfor(NSInteger row = 0; row < numberOfRows; ++row) {\n\t\t\tTUIFastIndexPath *indexPath = [TUIFastIndexPath indexPathForRow:row inSection:sectionIndex];\n\t\t\tCGRect cellRect = [self rectForRowAtIndexPath:indexPath];\n\t\t\tif(CGRectIntersectsRect(cellRect, rect)) {\n\t\t\t\t[indexPaths addObject:indexPath];\n\t\t\t} else {\n\t\t\t\t// not visible\n\t\t\t}\n\t\t}\n\t\t++sectionIndex;\n\t}\n\treturn indexPaths;\n}\n\n/**\n * @brief Obtain the index path of the row at the specified point\n * \n * If the point is not valid or no row exists at that point, nil is\n * returned.\n * \n * @param point location in the table view\n * @return index path of the row at @p point\n */\n- (TUIFastIndexPath *)indexPathForRowAtPoint:(CGPoint)point {\n  \n\tNSInteger sectionIndex = 0;\n  for(TUITableViewSection *section in _sectionInfo){\n    for(NSInteger row = 0; row < [section numberOfRows]; row++){\n      TUIFastIndexPath *indexPath = [TUIFastIndexPath indexPathForRow:row inSection:sectionIndex];\n      CGRect cellRect = [self rectForRowAtIndexPath:indexPath];\n      if(CGRectContainsPoint(cellRect, point)){\n        return indexPath;\n      }\n    }\n\t\t++sectionIndex;\n  }\n\t\n\treturn nil;\n}\n\n/**\n * @brief Obtain the index path of the row at the specified y-coordinate offset\n * \n * Unlike #indexPathForRowAtPoint:, this method does not consider the x-coordinate.\n * If the offset is not valid or no row exists at that offset, nil is returned.\n * \n * @param offset y-coordinate offset in the table view\n * @return index path of the row at @p offset\n */\n- (TUIFastIndexPath *)indexPathForRowAtVerticalOffset:(CGFloat)offset {\n  \n\tNSInteger sectionIndex = 0;\n  for(TUITableViewSection *section in _sectionInfo){\n    for(NSInteger row = 0; row < [section numberOfRows]; row++){\n      TUIFastIndexPath *indexPath = [TUIFastIndexPath indexPathForRow:row inSection:sectionIndex];\n      CGRect cellRect = [self rectForRowAtIndexPath:indexPath];\n      if(offset >= cellRect.origin.y && offset <= (cellRect.origin.y + cellRect.size.height)){\n        return indexPath;\n      }\n    }\n\t\t++sectionIndex;\n  }\n\t\n\treturn nil;\n}\n\n/**\n * @brief Obtain the index of a section whose header is at the specified point\n * \n * If the point is not valid or no header exists at that point, a negative value\n * is returned.\n * \n * @param point location in the table view\n * @return index of the section whose header is at @p point\n */\n- (NSInteger)indexOfSectionWithHeaderAtPoint:(CGPoint)point {\n  \n\tNSInteger sectionIndex = 0;\n  for(TUITableViewSection *section in _sectionInfo){\n    TUIView *headerView;\n    if((headerView = section.headerView) != nil){\n      CGFloat offset = [section sectionOffset];\n      CGFloat height = [section headerHeight];\n      CGFloat y = _contentHeight - offset - height;\n      CGRect frame = CGRectMake(0, y, self.bounds.size.width, height);\n      if(point.y > frame.origin.y && point.y < (frame.origin.y + frame.size.height)){\n        return sectionIndex;\n      }\n    }\n    sectionIndex++;\n  }\n\t\n\treturn -1;\n}\n\n/**\n * @brief Obtain the index of a section whose header is at the specified y-coordinate offset\n * \n * Unlike #indexOfSectionWithHeaderAtPoint:, this method does not consider the x-coordinate.\n * If the offset is not valid or no header exists at that offset, a negative value\n * is returned.\n * \n * @param offset y-coordinate offset in the table view\n * @return index of the section whose header is at @p offset\n */\n- (NSInteger)indexOfSectionWithHeaderAtVerticalOffset:(CGFloat)offset {\n  \n\tNSInteger sectionIndex = 0;\n  for(TUITableViewSection *section in _sectionInfo){\n    TUIView *headerView;\n    if((headerView = section.headerView) != nil){\n      CGFloat offset = [section sectionOffset];\n      CGFloat height = [section headerHeight];\n      CGFloat y = _contentHeight - offset - height;\n      CGRect frame = CGRectMake(0, y, self.bounds.size.width, height);\n      if(offset >= frame.origin.y && offset <= (frame.origin.y + frame.size.height)){\n        return sectionIndex;\n      }\n    }\n    sectionIndex++;\n  }\n\t\n\treturn -1;\n}\n\n/**\n * @brief Enumerate index paths\n * @see #enumerateIndexPathsFromIndexPath:toIndexPath:withOptions:usingBlock:\n */\n- (void)enumerateIndexPathsUsingBlock:(void (^)(TUIFastIndexPath *indexPath, BOOL *stop))block {\n  [self enumerateIndexPathsFromIndexPath:nil toIndexPath:nil withOptions:0 usingBlock:block];\n}\n\n/**\n * @brief Enumerate index paths\n * @see #enumerateIndexPathsFromIndexPath:toIndexPath:withOptions:usingBlock:\n */\n- (void)enumerateIndexPathsWithOptions:(NSEnumerationOptions)options usingBlock:(void (^)(TUIFastIndexPath *indexPath, BOOL *stop))block {\n  [self enumerateIndexPathsFromIndexPath:nil toIndexPath:nil withOptions:options usingBlock:block];\n}\n\n/**\n * @brief Enumerate index paths\n * \n * The provided block is repeatedly invoked with each valid index path between\n * the specified bounds.  Both bounding index paths are inclusive.\n * \n * @param fromIndexPath the index path to begin enumerating at or nil to begin at the first index path\n * @param toIndexPath the index path to stop enumerating at or nil to stop at the last index path\n * @param options enumeration options (not currently supported; pass 0)\n * @param block the block to enumerate with\n */\n- (void)enumerateIndexPathsFromIndexPath:(TUIFastIndexPath *)fromIndexPath toIndexPath:(TUIFastIndexPath *)toIndexPath withOptions:(NSEnumerationOptions)options usingBlock:(void (^)(TUIFastIndexPath *indexPath, BOOL *stop))block {\n  NSInteger sectionLowerBound = (fromIndexPath != nil) ? fromIndexPath.section : 0;\n  NSInteger sectionUpperBound = (toIndexPath != nil) ? toIndexPath.section : [self numberOfSections] - 1;\n  NSInteger rowLowerBound = (fromIndexPath != nil) ? fromIndexPath.row : 0;\n  NSInteger rowUpperBound = (toIndexPath != nil) ? toIndexPath.row : -1;\n  \n  NSInteger irow = rowLowerBound; // start at the lower bound row for the first iteration...\n  for(NSInteger i = sectionLowerBound; i < [self numberOfSections] && i <= sectionUpperBound /* inclusive */; i++){\n    NSInteger rowCount = [self numberOfRowsInSection:i];\n    for(NSInteger j = irow; j < rowCount && j <= ((rowUpperBound < 0 || i < sectionUpperBound) ? rowCount - 1 : rowUpperBound) /* inclusive */; j++){\n      BOOL stop = FALSE;\n      block([TUIFastIndexPath indexPathForRow:j inSection:i], &stop);\n      if(stop) return;\n    }\n    irow = 0; // ...then use zero for subsequent iterations\n  }\n  \n}\n\n- (TUIFastIndexPath *)_topVisibleIndexPath\n{\n\tTUIFastIndexPath *topVisibleIndex = nil;\n\tNSArray *v = [INDEX_PATHS_FOR_VISIBLE_ROWS sortedArrayUsingSelector:@selector(compare:)];\n\tif([v count])\n\t\ttopVisibleIndex = [v objectAtIndex:0];\n\treturn topVisibleIndex;\n}\n\n- (void)setFrame:(CGRect)f\n{\n\t_tableFlags.forceSaveScrollPosition = 1;\n\t[super setFrame:f];\n}\n\n- (void)setContentOffset:(CGPoint)p\n{\n\t_tableFlags.didFirstLayout = 1; // prevent the auto-scroll-to-top during the first layout\n\t[super setContentOffset:p];\n\t\n\t// if we're currently dragging we need to update the drag operation since the content under\n\t// the mouse has moved; we just call update again with the last mouse location\n  if([self __isDraggingCell]){\n    [self __updateDraggingCell:_dragToReorderCell offset:_currentDragToReorderMouseOffset location:_currentDragToReorderLocation];\n  }\n  \n}\n\n- (void)setPullDownView:(TUIView *)p\n{\n\t[_pullDownView removeFromSuperview];\n\t\n\t_pullDownView = p;\n\t\n\t[self addSubview:_pullDownView];\n\t_pullDownView.hidden = YES;\n}\n\n- (void)setHeaderView:(TUIView *)h\n{\n\t[_headerView removeFromSuperview];\n\t\n\t_headerView = h;\n\t\n\t[self addSubview:_headerView];\n\t_headerView.hidden = YES;\n}\n\n- (BOOL)_preLayoutCells\n{\n\tCGRect bounds = self.bounds;\n\n\tif(!_sectionInfo || !CGSizeEqualToSize(bounds.size, _lastSize)) {\n\t  \n\t\t// save scroll position\n\t\tCGFloat previousOffset = 0.0f;\n\t\tTUIFastIndexPath *savedIndexPath = nil;\n\t\tCGFloat relativeOffset = 0.0;\n\t\tif(_tableFlags.maintainContentOffsetAfterReload) {\n\t\t\tpreviousOffset = self.contentSize.height + self.contentOffset.y;\n\t\t} else {\n\t\t\tif(_tableFlags.forceSaveScrollPosition || [self.nsView inLiveResize]) {\n\t\t\t\t_tableFlags.forceSaveScrollPosition = 0;\n\t\t\t\tNSArray *a = [INDEX_PATHS_FOR_VISIBLE_ROWS sortedArrayUsingSelector:@selector(compare:)];\n\t\t\t\tif([a count]) {\n\t\t\t\t\tsavedIndexPath = [a objectAtIndex:0];\n\t\t\t\t\tCGRect v = [self visibleRect];\n\t\t\t\t\tCGRect r = [self rectForRowAtIndexPath:savedIndexPath];\n\t\t\t\t\trelativeOffset = ((v.origin.y + v.size.height) - (r.origin.y + r.size.height));\n\t\t\t\t\trelativeOffset += (_lastSize.height - bounds.size.height);\n\t\t\t\t}\n\t\t\t} else if(_keepVisibleIndexPathForReload) {\n\t\t\t\tsavedIndexPath = _keepVisibleIndexPathForReload;\n\t\t\t\trelativeOffset = _relativeOffsetForReload;\n\t\t\t\t_keepVisibleIndexPathForReload = nil;\n\t\t\t}\n\t\t}\n\t\t\n\t\t[self _updateSectionInfo]; // clean up any previous section info and recreate it\n\t\tself.contentSize = CGSizeMake(self.bounds.size.width, _contentHeight);\n\t\t\n\t\t_lastSize = bounds.size;\n\t\t\n\t\tif(!_tableFlags.didFirstLayout) {\n\t\t\t_tableFlags.didFirstLayout = 1;\n\t\t\t[self scrollToTopAnimated:NO];\n\t\t}\n\t\t\n\t\t// restore scroll position\n\t\tif(_tableFlags.maintainContentOffsetAfterReload) {\n\t\t\tCGFloat newOffset = previousOffset - self.contentSize.height;\n\t\t\tself.contentOffset = CGPointMake(self.contentOffset.x, newOffset);\n\t\t} else {\n\t\t\tif(savedIndexPath) {\n\t\t\t\tCGRect v = [self visibleRect];\n\t\t\t\tCGRect r = [self rectForRowAtIndexPath:savedIndexPath];\n\t\t\t\tr.origin.y -= (v.size.height - r.size.height);\n\t\t\t\tr.size.height += (v.size.height - r.size.height);\n\t\t\t\t\n\t\t\t\tr.origin.y += relativeOffset;\n\t\t\t\t\n\t\t\t\t[self scrollRectToVisible:r animated:NO];\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn YES; // needs visible cells to be redisplayed\n\t}\n\t\n\treturn NO; // just need to do the recycling\n}\n\n/**\n * @brief Layout header views for sections which have one.\n */\n- (void)_layoutSectionHeaders:(BOOL)visibleHeadersNeedRelayout\n{\n\tCGRect visible = [self visibleRect];\n\tNSIndexSet *oldIndexes = _visibleSectionHeaders;\n\tNSIndexSet *newIndexes = [self indexesOfSectionsInRect:visible];\n\t\n\tNSMutableIndexSet *toRemove = [oldIndexes mutableCopy];\n\t[toRemove removeIndexes:newIndexes];\n\tNSMutableIndexSet *toAdd = [newIndexes mutableCopy];\n\t[toAdd removeIndexes:oldIndexes];\n\t\n\t// update the placement of all visible headers\n\t__block TUIView *pinnedHeader = nil;\n\t[newIndexes enumerateIndexesUsingBlock:^(NSUInteger index, BOOL *stop) {\n\t\tif(index < [_sectionInfo count]) {\n\t\t\tTUITableViewSection *section = [_sectionInfo objectAtIndex:index];\n\t\t\tif(section.headerView != nil) {\n\t\t\t\tCGRect headerFrame = [self rectForHeaderOfSection:index];\n\t\t\t\t\n\t\t\t\tif(_style == TUITableViewStyleGrouped) {\n\t\t\t\t\t// check if this header needs to be pinned\n\t\t\t\t\tif(CGRectGetMaxY(headerFrame) > CGRectGetMaxY(visible)) {\n\t\t\t\t\t\theaderFrame.origin.y = CGRectGetMaxY(visible) - headerFrame.size.height;\n\t\t\t\t\t\tpinnedHeader = section.headerView;\n\t\t\t\t\t\t// if the header is a TUITableViewSectionHeader notify it of it's pinned state\n\t\t\t\t\t\tif([section.headerView isKindOfClass:[TUITableViewSectionHeader class]]){\n\t\t\t\t\t\t\t((TUITableViewSectionHeader *)section.headerView).pinnedToViewport = TRUE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if((pinnedHeader != nil) && (CGRectGetMaxY(headerFrame) > pinnedHeader.frame.origin.y)) {\n\t\t\t\t\t\t// this header is intersecting with the pinned header, so we push the pinned header upwards.\n\t\t\t\t\t\tCGRect pinnedHeaderFrame = pinnedHeader.frame;\n\t\t\t\t\t\tpinnedHeaderFrame.origin.y = CGRectGetMaxY(headerFrame);\n\t\t\t\t\t\tpinnedHeader.frame = pinnedHeaderFrame;\n\t\t\t\t\t\t// if the header is a TUITableViewSectionHeader notify it of it's pinned state\n\t\t\t\t\t\tif([section.headerView isKindOfClass:[TUITableViewSectionHeader class]]){\n\t\t\t\t\t\t\t((TUITableViewSectionHeader *)section.headerView).pinnedToViewport = FALSE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\t// if the header is a TUITableViewSectionHeader notify it of it's pinned state\n\t\t\t\t\t\tif([section.headerView isKindOfClass:[TUITableViewSectionHeader class]]){\n\t\t\t\t\t\t\t((TUITableViewSectionHeader *)section.headerView).pinnedToViewport = FALSE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tsection.headerView.frame = headerFrame;\n\t\t\t\t[section.headerView setNeedsLayout];\n\t\t\t\t\n\t\t\t\tif(section.headerView.superview == nil){\n\t\t\t\t\t[self addSubview:section.headerView];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t[_visibleSectionHeaders addIndex:index];\n\t}];\n\t\n\t// remove offscreen headers\n\t[toRemove enumerateIndexesUsingBlock:^(NSUInteger index, BOOL *stop) {\n\t\tif(index < [_sectionInfo count]) {\n\t\t\tTUITableViewSection *section = [_sectionInfo objectAtIndex:index];\n\t\t\tif(section.headerView != nil) {\n\t\t\t\t[section.headerView removeFromSuperview];\n\t\t\t}\n\t\t}\n\t\t[_visibleSectionHeaders removeIndex:index];\n\t}];\n\t\n}\n\n- (void)_layoutCells:(BOOL)visibleCellsNeedRelayout\n{\n  \n\tif(visibleCellsNeedRelayout) {\n\t\t// update remaining visible cells if needed\n\t\tfor(TUIFastIndexPath *i in _visibleItems) {\n\t\t\tTUITableViewCell *cell = [_visibleItems objectForKey:i];\n\t\t\tcell.frame = [self rectForRowAtIndexPath:i];\n\t\t\tcell.layer.zPosition = 0;\n\t\t\t[cell setNeedsLayout];\n\t\t}\n\t}\n\t\n\tCGRect visible = [self visibleRect];\n\t\n\t// Example:\n\t// old:            0 1 2 3 4 5 6 7\n\t// new:                2 3 4 5 6 7 8 9\n\t// to remove:      0 1\n\t// to add:                         8 9\n\t\n\tNSArray *oldVisibleIndexPaths = INDEX_PATHS_FOR_VISIBLE_ROWS;\n\tNSArray *newVisibleIndexPaths = [self indexPathsForRowsInRect:visible];\n\t\n\tNSMutableArray *indexPathsToRemove = [oldVisibleIndexPaths mutableCopy];\n\t[indexPathsToRemove removeObjectsInArray:newVisibleIndexPaths];\n\t\n\tNSMutableArray *indexPathsToAdd = [newVisibleIndexPaths mutableCopy];\n\t[indexPathsToAdd removeObjectsInArray:oldVisibleIndexPaths];\n\t\n\t// remove offscreen cells\n\tfor(TUIFastIndexPath *i in indexPathsToRemove) {\n\t\tTUITableViewCell *cell = [self cellForRowAtIndexPath:i];\n\t\t// don't reuse the dragged cell\n\t\tif(_dragToReorderCell == nil || ![cell isEqual:_dragToReorderCell]){\n      [self _enqueueReusableCell:cell];\n      [cell removeFromSuperview];\n      [_visibleItems removeObjectForKey:i];\n    }\n\t}\n\t\n\t// add new cells\n\tfor(TUIFastIndexPath *i in indexPathsToAdd) {\n\t\tif([_visibleItems objectForKey:i]) {\n\t\t\tNSLog(@\"!!! Warning: already have a cell in place for index path %@\\n\\n\\n\", i);\n\t\t} else {\n\t\t\tTUITableViewCell *cell = [_dataSource tableView:self cellForRowAtIndexPath:i];\n\t\t\t[self.nsView invalidateHoverForView:cell];\n\t\t\t\n\t\t\tcell.frame = [self rectForRowAtIndexPath:i];\n\t\t\tcell.layer.zPosition = 0;\n\t\t\t\n\t\t\t[cell setNeedsLayout];\n\t\t\t[cell prepareForDisplay];\n\t\t\t\n\t\t\tif([i isEqual:_selectedIndexPath]) {\n\t\t\t\t[cell setSelected:YES animated:NO];\n\t\t\t} else {\n\t\t\t\t[cell setSelected:NO animated:NO];\n\t\t\t}\n\t\t\t\n\t\t\tif(_tableFlags.delegateTableViewWillDisplayCellForRowAtIndexPath) {\n\t\t\t\t[_delegate tableView:self willDisplayCell:cell forRowAtIndexPath:i];\n\t\t\t}\n\t\t\t\n\t\t\t[self addSubview:cell];\n\t\t\t\n\t\t\tif([_indexPathShouldBeFirstResponder isEqual:i]) {\n\t\t\t  // only make cells first responder if they accept it\n\t\t\t  if([cell acceptsFirstResponder]){\n\t\t\t    [self.nsWindow makeFirstResponderIfNotAlreadyInResponderChain:cell withFutureRequestToken:_futureMakeFirstResponderToken];\n\t\t\t  }\n\t\t\t\t_indexPathShouldBeFirstResponder = nil;\n\t\t\t}\n\t\t\t\n\t\t\t[_visibleItems setObject:cell forKey:i];\n\t\t}\n\t}\n\t\n  // if we have a dragged cell, make sure it's on top of the newly added cells\n  if([indexPathsToAdd count] > 0 && _dragToReorderCell != nil){\n    [[_dragToReorderCell superview] bringSubviewToFront:_dragToReorderCell];\n  }\n  \n\tif(_headerView) {\n\t\tCGSize s = self.contentSize;\n\t\tCGRect headerViewRect = CGRectMake(0, s.height - _headerView.frame.size.height, visible.size.width, _headerView.frame.size.height);\n\t\tif(CGRectIntersectsRect(headerViewRect, visible)) {\n\t\t\t_headerView.frame = headerViewRect;\t\t\t\n\t\t\t[_headerView setNeedsLayout];\n\t\t\t\n\t\t\tif(_headerView.hidden) {\n\t\t\t\t// show\n\t\t\t\t_headerView.hidden = NO;\n\t\t\t}\n\t\t} else {\n\t\t\tif(!_headerView.hidden) {\n\t\t\t\t_headerView.hidden = YES;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tif(_pullDownView) {\n\t\tCGSize s = self.contentSize;\n\t\tCGRect pullDownRect = CGRectMake(0, s.height, visible.size.width, _pullDownView.frame.size.height);\n\t\tif([self pullDownViewIsVisible]) {\n\t\t\tif(_pullDownView.hidden) {\n\t\t\t\t// show\n\t\t\t\t_pullDownView.frame = pullDownRect;\n\t\t\t\t_pullDownView.hidden = NO;\n\t\t\t}\n\t\t} else {\n\t\t\tif(!_pullDownView.hidden) {\n\t\t\t\t_pullDownView.hidden = YES;\n\t\t\t}\n\t\t}\n\t}\n}\n\n- (BOOL)pullDownViewIsVisible\n{\n\tif(_pullDownView) {\n\t\tCGSize s = self.contentSize;\n\t\tCGRect visible = [self visibleRect];\n\t\tCGRect pullDownRect = CGRectMake(0, s.height, visible.size.width, _pullDownView.frame.size.height);\n\t\treturn CGRectIntersectsRect(pullDownRect, visible);\n\t}\n\treturn NO;\n}\n\n- (void)reloadDataMaintainingVisibleIndexPath:(TUIFastIndexPath *)indexPath relativeOffset:(CGFloat)relativeOffset\n{\n\t_keepVisibleIndexPathForReload = indexPath;\n\t_relativeOffsetForReload = relativeOffset;\n\t[self reloadData];\n}\n\n- (void)reloadData\n{\n  \n  // notify our delegate we're about to reload the table\n  if(self.delegate != nil && [self.delegate respondsToSelector:@selector(tableViewWillReloadData:)]){\n    [self.delegate tableViewWillReloadData:self];\n  }\n\t\n\t_selectedIndexPath = nil;\n  \n\t// need to recycle all visible cells, have them be regenerated on layoutSubviews\n\t// because the same cells might have different content\n\tfor(TUIFastIndexPath *i in _visibleItems) {\n\t\tTUITableViewCell *cell = [_visibleItems objectForKey:i];\n\t\t[self _enqueueReusableCell:cell];\n\t\t[cell removeFromSuperview];\n\t}\n\t\n\t// if we have a dragged cell, clear it\n\t_dragToReorderCell = nil;\n\t\n\t// clear visible cells\n\t[_visibleItems removeAllObjects];\n\t\n\t// remove any visible headers, they should be re-added when the table is laid out\n\tfor(TUITableViewSection *section in _sectionInfo){\n\t  TUIView *headerView;\n\t  if((headerView = [section headerView]) != nil){\n\t    [headerView removeFromSuperview];\n\t  }\n\t}\n\t\n\t// clear visible section headers\n\t[_visibleSectionHeaders removeAllIndexes];\n\t\n\t_sectionInfo = nil; // will be regenerated on next layout\n\t\n\t[self layoutSubviews];\n\t\n  // notify our delegate the table view has been reloaded\n  if(self.delegate != nil && [self.delegate respondsToSelector:@selector(tableViewDidReloadData:)]){\n    [self.delegate tableViewDidReloadData:self];\n  }\n  \n}\n\n- (void)layoutSubviews\n{\n\tif(!_tableFlags.layoutSubviewsReentrancyGuard) {\n\t\t_tableFlags.layoutSubviewsReentrancyGuard = 1;\n\t\t\n\t\t[TUIView setAnimationsEnabled:NO block:^{\n\t\t\t[CATransaction begin];\n\t\t\t[CATransaction setDisableActions:YES];\n\t\t\t\n\t\t\tBOOL visibleCellsNeedRelayout = [self _preLayoutCells];\n\t\t\t[super layoutSubviews]; // this will munge with the contentOffset\n\t\t\t[self _layoutSectionHeaders:visibleCellsNeedRelayout];\n\t\t\t[self _layoutCells:visibleCellsNeedRelayout];\n\t\t\t\n\t\t\tif(_tableFlags.derepeaterEnabled)\n\t\t\t\t[self _updateDerepeaterViews];\n\t\t\t\n\t\t\t[CATransaction commit];\n\t\t}];\n\t\t\n\t\t_tableFlags.layoutSubviewsReentrancyGuard = 0;\n\t} else {\n//\t\tNSLog(@\"trying to nest...\");\n\t}\n}\n\n- (void)reloadLayout\n{\n\t_sectionInfo = nil; // will be regenerated on next layout\n\t\n\t[self _preLayoutCells];\n\t[super layoutSubviews]; // this will munge with the contentOffset\n\t[self _layoutSectionHeaders:YES];\n\t[self _layoutCells:YES];\n}\n\n- (void)scrollToRowAtIndexPath:(TUIFastIndexPath *)indexPath atScrollPosition:(TUITableViewScrollPosition)scrollPosition animated:(BOOL)animated\n{\n\tCGRect v = [self visibleRect];\n\tCGRect r = [self rectForRowAtIndexPath:indexPath];\n\t\n\t// when the target index path section has a header view, add its height to\n\t// the height of our row to prevent the selected row from being overlapped\n\t// by the pinned header\n  TUIView *headerView;\n  if((headerView = [self headerViewForSection:indexPath.section]) != nil){\n    CGRect headerFrame = [self rectForHeaderOfSection:indexPath.section];\n    r.size.height += headerFrame.size.height;\n  }\n\t\n\tswitch(scrollPosition) {\n\t\tcase TUITableViewScrollPositionNone:\n\t\t\t// do nothing\n\t\t\tbreak;\n\t\tcase TUITableViewScrollPositionTop:\n\t\t\tr.origin.y -= (v.size.height - r.size.height);\n\t\t\tr.size.height += (v.size.height - r.size.height);\n\t\t\t[self scrollRectToVisible:r animated:animated];\n\t\t\tbreak;\n\t\tcase TUITableViewScrollPositionToVisible:\n\t\tdefault:\n\t\t\t[self scrollRectToVisible:r animated:animated];\n\t\t\tbreak;\n\t}\n\t\n}\n\n- (TUIFastIndexPath *)indexPathForSelectedRow\n{\n\treturn _selectedIndexPath;\n}\n\n- (TUIFastIndexPath *)indexPathForFirstRow\n{\n\treturn [TUIFastIndexPath indexPathForRow:0 inSection:0];\n}\n\n- (TUIFastIndexPath *)indexPathForLastRow\n{\n\tNSInteger sec = [self numberOfSections] - 1;\n\tNSInteger row = [self numberOfRowsInSection:sec] - 1;\n\treturn [TUIFastIndexPath indexPathForRow:row inSection:sec];\n}\n\n- (void)_makeRowAtIndexPathFirstResponder:(TUIFastIndexPath *)indexPath\n{\n\tTUITableViewCell *cell = [self cellForRowAtIndexPath:indexPath];\n\t// only cells that accept first responder should be made first responder\n\tif(cell && [cell acceptsFirstResponder]) {\n\t\t[self.nsWindow makeFirstResponderIfNotAlreadyInResponderChain:cell];\n\t} else {\n\t\t_indexPathShouldBeFirstResponder = indexPath;\n\t\t_futureMakeFirstResponderToken = [self.nsWindow futureMakeFirstResponderRequestToken];\n\t}\n}\n\n- (void)selectRowAtIndexPath:(TUIFastIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(TUITableViewScrollPosition)scrollPosition\n{\n\tTUIFastIndexPath *oldIndexPath = [self indexPathForSelectedRow];\n//\tif([indexPath isEqual:oldIndexPath]) {\n//\t\t// just scroll to visible\n//\t} else {\n\t\t[self deselectRowAtIndexPath:[self indexPathForSelectedRow] animated:animated];\n\t\t\n\t\tTUITableViewCell *cell = [self cellForRowAtIndexPath:indexPath]; // may be nil\n\t\t[cell setSelected:YES animated:animated];\n\t\t // should already be nil\n\t\t_selectedIndexPath = indexPath;\n\t\t[cell setNeedsDisplay];\n\t\t\n\t\t// only notify when the selection actually changes\n\t\tif([self.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)]){\n\t\t\t[self.delegate tableView:self didSelectRowAtIndexPath:indexPath];\n\t\t}\n//\t}\n\n  NSResponder *firstResponder = [self.nsWindow firstResponder];\n  if(firstResponder == self || firstResponder == [self cellForRowAtIndexPath:oldIndexPath]) {\n    // only make cell first responder if the table view already is first responder\n    [self _makeRowAtIndexPathFirstResponder:indexPath];\n  }\n\t[self scrollToRowAtIndexPath:indexPath atScrollPosition:scrollPosition animated:animated];\n}\n\n- (void)deselectRowAtIndexPath:(TUIFastIndexPath *)indexPath animated:(BOOL)animated\n{\n  \n\tif([indexPath isEqual:_selectedIndexPath]) {\n\t\tTUITableViewCell *cell = [self cellForRowAtIndexPath:indexPath]; // may be nil\n\t\t\n\t\t[cell setSelected:NO animated:animated];\n\t\t_selectedIndexPath = nil;\n\t\t[cell setNeedsDisplay];\n\t\t\n\t\t// only notify when the selection actually changes\n    if([self.delegate respondsToSelector:@selector(tableView:didDeselectRowAtIndexPath:)]){\n      [self.delegate tableView:self didDeselectRowAtIndexPath:indexPath];\n    }\n    \n\t}\n\t\n}\n\n- (TUIFastIndexPath *)indexPathForFirstVisibleRow \n{\n\tTUIFastIndexPath *firstIndexPath = nil;\n\tfor(TUIFastIndexPath *indexPath in _visibleItems) {\n\t\tif(firstIndexPath == nil || [indexPath compare:firstIndexPath] == NSOrderedAscending) {\n\t\t\tfirstIndexPath = indexPath;\n\t\t}\n\t}\n\treturn firstIndexPath;\n}\n\n- (TUIFastIndexPath *)indexPathForLastVisibleRow \n{\n\tTUIFastIndexPath *lastIndexPath = nil;\n\tfor(TUIFastIndexPath *indexPath in _visibleItems) {\n\t\tif(lastIndexPath == nil || [indexPath compare:lastIndexPath] == NSOrderedDescending) {\n\t\t\tlastIndexPath = indexPath;\n\t\t}\n\t}\n\treturn lastIndexPath;\n}\n\n- (BOOL)performKeyAction:(NSEvent *)event\n{\n\t// no selection or selected cell not visible and this is not repeative key press\n\tBOOL noCurrentSelection = (_selectedIndexPath == nil || ([self cellForRowAtIndexPath:_selectedIndexPath] == nil && ![event isARepeat]));;\n\t\n\ttypedef TUIFastIndexPath * (^TUITableViewCalculateNextIndexPathBlock)(TUIFastIndexPath *lastIndexPath);\n\tvoid (^selectValidIndexPath)(TUIFastIndexPath *startForNoSelection, TUITableViewCalculateNextIndexPathBlock calculateNextIndexPath) = ^(TUIFastIndexPath *startForNoSelection, TUITableViewCalculateNextIndexPathBlock calculateNextIndexPath) {\n\t\tNSParameterAssert(calculateNextIndexPath != nil);\n\t\t\n\t\tBOOL foundValidNextRow = NO;\n\t\tTUIFastIndexPath *lastIndexPath = _selectedIndexPath;\n\t\twhile(!foundValidNextRow) {\n\t\t\tTUIFastIndexPath *newIndexPath;\n\t\t\tif(noCurrentSelection && lastIndexPath == nil) {\n\t\t\t\tnewIndexPath = startForNoSelection;\n\t\t\t} else {\n\t\t\t\tnewIndexPath = calculateNextIndexPath(lastIndexPath);\n\t\t\t}\n\t\t\t\n\t\t\tif(![_delegate respondsToSelector:@selector(tableView:shouldSelectRowAtIndexPath:forEvent:)] || [_delegate tableView:self shouldSelectRowAtIndexPath:newIndexPath forEvent:event]){\n\t\t\t\t[self selectRowAtIndexPath:newIndexPath animated:self.animateSelectionChanges scrollPosition:TUITableViewScrollPositionToVisible];\n\t\t\t\tfoundValidNextRow = YES;\n\t\t\t}\n\t\t\t\n\t\t\tif([lastIndexPath isEqual:newIndexPath]) foundValidNextRow = YES;\n\t\t\t\n\t\t\tlastIndexPath = newIndexPath;\n\t\t}\n\t};\n\t\n\tswitch([[event charactersIgnoringModifiers] characterAtIndex:0]) {\n\t\tcase NSUpArrowFunctionKey: {\n\t\t\tselectValidIndexPath([self indexPathForLastVisibleRow], ^(TUIFastIndexPath *lastIndexPath) {\n\t\t\t\tNSUInteger section = lastIndexPath.section;\n\t\t\t\tNSUInteger row = lastIndexPath.row;\n\t\t\t\tif(row > 0) {\n\t\t\t\t\trow--;\n\t\t\t\t} else {\n\t\t\t\t\twhile(section > 0) {\n\t\t\t\t\t\tsection--;\n\t\t\t\t\t\tNSUInteger rowsInSection = [self numberOfRowsInSection:section];\n\t\t\t\t\t\tif(rowsInSection > 0) {\n\t\t\t\t\t\t\trow = rowsInSection - 1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn [TUIFastIndexPath indexPathForRow:row inSection:section];\n\t\t\t});\n\t\t\t\n\t\t\treturn YES;\n\t\t}\n\t\n\t\tcase NSDownArrowFunctionKey:  {\n\t\t\tselectValidIndexPath([self indexPathForFirstVisibleRow], ^(TUIFastIndexPath *lastIndexPath) {\n\t\t\t\tNSUInteger section = lastIndexPath.section;\n\t\t\t\tNSUInteger row = lastIndexPath.row;\n\t\t\t\tNSUInteger rowsInSection = [self numberOfRowsInSection:section];\n\t\t\t\tif(row + 1 < rowsInSection) {\n\t\t\t\t\trow++;\n\t\t\t\t} else {\n\t\t\t\t\tNSUInteger sections = [self numberOfSections];\n\t\t\t\t\twhile(section + 1 < sections) {\n\t\t\t\t\t\tsection++;\n\t\t\t\t\t\tNSUInteger rowsInSection = [self numberOfRowsInSection:section];\n\t\t\t\t\t\tif(rowsInSection > 0) {\n\t\t\t\t\t\t\trow = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn [TUIFastIndexPath indexPathForRow:row inSection:section];\n\t\t\t});\n\n\t\t\treturn YES;\n\t\t}\n\t}\n\t\n\treturn [super performKeyAction:event];\n}\n\n- (BOOL)maintainContentOffsetAfterReload\n{\n\treturn _tableFlags.maintainContentOffsetAfterReload;\n}\n\n- (void)setMaintainContentOffsetAfterReload:(BOOL)newValue\n{\n\t_tableFlags.maintainContentOffsetAfterReload = newValue;\n}\n\n@end\n\n\n@implementation NSIndexPath (TUITableView)\n\n+ (NSIndexPath *)indexPathForRow:(NSUInteger)row inSection:(NSUInteger)section\n{\n\tNSUInteger i[] = {section, row};\n\treturn [NSIndexPath indexPathWithIndexes:i length:2];\n}\n\n- (NSUInteger)section\n{\n\treturn [self indexAtPosition:0];\n}\n\n- (NSUInteger)row\n{\n\treturn [self indexAtPosition:1];\n}\n\n@end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/cocoa_monitor.m",
    "content": "//========================================================================\n// GLFW 3.3 OS X - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <stdlib.h>\n#include <limits.h>\n\n#include <IOKit/graphics/IOGraphicsLib.h>\n#include <CoreVideo/CVBase.h>\n#include <CoreVideo/CVDisplayLink.h>\n#include <ApplicationServices/ApplicationServices.h>\n\n\n// Get the name of the specified display\n//\nstatic char* getDisplayName(CGDirectDisplayID displayID)\n{\n    char* name;\n    CFDictionaryRef info, names;\n    CFStringRef value;\n    CFIndex size;\n\n    // NOTE: This uses a deprecated function because Apple has\n    //       (as of January 2015) not provided any alternative\n    info = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID),\n                                         kIODisplayOnlyPreferredName);\n    names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName));\n\n    if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR(\"en_US\"),\n                                                 (const void**) &value))\n    {\n        // This may happen if a desktop Mac is running headless\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to retrieve display name\");\n\n        CFRelease(info);\n        return strdup(\"Unknown\");\n    }\n\n    size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value),\n                                             kCFStringEncodingUTF8);\n    name = calloc(size + 1, 1);\n    CFStringGetCString(value, name, size, kCFStringEncodingUTF8);\n\n    CFRelease(info);\n\n    return name;\n}\n\n// Check whether the display mode should be included in enumeration\n//\nstatic GLFWbool modeIsGood(CGDisplayModeRef mode)\n{\n    uint32_t flags = CGDisplayModeGetIOFlags(mode);\n    if (!(flags & kDisplayModeValidFlag) || !(flags & kDisplayModeSafeFlag))\n        return GLFW_FALSE;\n\n    if (flags & kDisplayModeInterlacedFlag)\n        return GLFW_FALSE;\n\n    if (flags & kDisplayModeStretchedFlag)\n        return GLFW_FALSE;\n\n    CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);\n    if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) &&\n        CFStringCompare(format, CFSTR(IO32BitDirectPixels), 0))\n    {\n        CFRelease(format);\n        return GLFW_FALSE;\n    }\n\n    CFRelease(format);\n    return GLFW_TRUE;\n}\n\n// Convert Core Graphics display mode to GLFW video mode\n//\nstatic GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode,\n                                            CVDisplayLinkRef link)\n{\n    GLFWvidmode result;\n    result.width = (int) CGDisplayModeGetWidth(mode);\n    result.height = (int) CGDisplayModeGetHeight(mode);\n    result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode);\n\n    if (result.refreshRate == 0)\n    {\n        const CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link);\n        if (!(time.flags & kCVTimeIsIndefinite))\n            result.refreshRate = (int) (time.timeScale / (double) time.timeValue);\n    }\n\n    CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);\n\n    if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0)\n    {\n        result.redBits = 5;\n        result.greenBits = 5;\n        result.blueBits = 5;\n    }\n    else\n    {\n        result.redBits = 8;\n        result.greenBits = 8;\n        result.blueBits = 8;\n    }\n\n    CFRelease(format);\n    return result;\n}\n\n// Starts reservation for display fading\n//\nstatic CGDisplayFadeReservationToken beginFadeReservation(void)\n{\n    CGDisplayFadeReservationToken token = kCGDisplayFadeReservationInvalidToken;\n\n    if (CGAcquireDisplayFadeReservation(5, &token) == kCGErrorSuccess)\n        CGDisplayFade(token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE);\n\n    return token;\n}\n\n// Ends reservation for display fading\n//\nstatic void endFadeReservation(CGDisplayFadeReservationToken token)\n{\n    if (token != kCGDisplayFadeReservationInvalidToken)\n    {\n        CGDisplayFade(token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE);\n        CGReleaseDisplayFadeReservation(token);\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Change the current video mode\n//\nGLFWbool _glfwSetVideoModeNS(_GLFWmonitor* monitor, const GLFWvidmode* desired)\n{\n    CFArrayRef modes;\n    CFIndex count, i;\n    CVDisplayLinkRef link;\n    CGDisplayModeRef native = NULL;\n    GLFWvidmode current;\n    const GLFWvidmode* best;\n\n    best = _glfwChooseVideoMode(monitor, desired);\n    _glfwPlatformGetVideoMode(monitor, &current);\n    if (_glfwCompareVideoModes(&current, best) == 0)\n        return GLFW_TRUE;\n\n    CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);\n\n    modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);\n    count = CFArrayGetCount(modes);\n\n    for (i = 0;  i < count;  i++)\n    {\n        CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);\n        if (!modeIsGood(dm))\n            continue;\n\n        const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link);\n        if (_glfwCompareVideoModes(best, &mode) == 0)\n        {\n            native = dm;\n            break;\n        }\n    }\n\n    if (native)\n    {\n        if (monitor->ns.previousMode == NULL)\n            monitor->ns.previousMode = CGDisplayCopyDisplayMode(monitor->ns.displayID);\n\n        CGDisplayFadeReservationToken token = beginFadeReservation();\n        CGDisplaySetDisplayMode(monitor->ns.displayID, native, NULL);\n        endFadeReservation(token);\n    }\n\n    CFRelease(modes);\n    CVDisplayLinkRelease(link);\n\n    if (!native)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Monitor mode list changed\");\n        return GLFW_FALSE;\n    }\n\n    return GLFW_TRUE;\n}\n\n// Restore the previously saved (original) video mode\n//\nvoid _glfwRestoreVideoModeNS(_GLFWmonitor* monitor)\n{\n    if (monitor->ns.previousMode)\n    {\n        CGDisplayFadeReservationToken token = beginFadeReservation();\n        CGDisplaySetDisplayMode(monitor->ns.displayID,\n                                monitor->ns.previousMode, NULL);\n        endFadeReservation(token);\n\n        CGDisplayModeRelease(monitor->ns.previousMode);\n        monitor->ns.previousMode = NULL;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n_GLFWmonitor** _glfwPlatformGetMonitors(int* count)\n{\n    uint32_t i, found = 0, displayCount;\n    _GLFWmonitor** monitors;\n    CGDirectDisplayID* displays;\n\n    *count = 0;\n\n    CGGetOnlineDisplayList(0, NULL, &displayCount);\n    displays = calloc(displayCount, sizeof(CGDirectDisplayID));\n    monitors = calloc(displayCount, sizeof(_GLFWmonitor*));\n\n    CGGetOnlineDisplayList(displayCount, displays, &displayCount);\n\n    for (i = 0;  i < displayCount;  i++)\n    {\n        _GLFWmonitor* monitor;\n\n        if (CGDisplayIsAsleep(displays[i]))\n            continue;\n\n        const CGSize size = CGDisplayScreenSize(displays[i]);\n        char* name = getDisplayName(displays[i]);\n\n        monitor = _glfwAllocMonitor(name, size.width, size.height);\n        monitor->ns.displayID  = displays[i];\n        monitor->ns.unitNumber = CGDisplayUnitNumber(displays[i]);\n\n        free(name);\n\n        found++;\n        monitors[found - 1] = monitor;\n    }\n\n    free(displays);\n\n    *count = found;\n    return monitors;\n}\n\nGLFWbool _glfwPlatformIsSameMonitor(_GLFWmonitor* first, _GLFWmonitor* second)\n{\n    // HACK: Compare unit numbers instead of display IDs to work around display\n    //       replacement on machines with automatic graphics switching\n    return first->ns.unitNumber == second->ns.unitNumber;\n}\n\nvoid _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)\n{\n    const CGRect bounds = CGDisplayBounds(monitor->ns.displayID);\n\n    if (xpos)\n        *xpos = (int) bounds.origin.x;\n    if (ypos)\n        *ypos = (int) bounds.origin.y;\n}\n\nGLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count)\n{\n    CFArrayRef modes;\n    CFIndex found, i, j;\n    GLFWvidmode* result;\n    CVDisplayLinkRef link;\n\n    *count = 0;\n\n    CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);\n\n    modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);\n    found = CFArrayGetCount(modes);\n    result = calloc(found, sizeof(GLFWvidmode));\n\n    for (i = 0;  i < found;  i++)\n    {\n        CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);\n        if (!modeIsGood(dm))\n            continue;\n\n        const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link);\n\n        for (j = 0;  j < *count;  j++)\n        {\n            if (_glfwCompareVideoModes(result + j, &mode) == 0)\n                break;\n        }\n\n        // Skip duplicate modes\n        if (i < *count)\n            continue;\n\n        (*count)++;\n        result[*count - 1] = mode;\n    }\n\n    CFRelease(modes);\n    CVDisplayLinkRelease(link);\n    return result;\n}\n\nvoid _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode)\n{\n    CGDisplayModeRef displayMode;\n    CVDisplayLinkRef link;\n\n    CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);\n\n    displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID);\n    *mode = vidmodeFromCGDisplayMode(displayMode, link);\n    CGDisplayModeRelease(displayMode);\n\n    CVDisplayLinkRelease(link);\n}\n\nvoid _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)\n{\n    uint32_t i, size = CGDisplayGammaTableCapacity(monitor->ns.displayID);\n    CGGammaValue* values = calloc(size * 3, sizeof(CGGammaValue));\n\n    CGGetDisplayTransferByTable(monitor->ns.displayID,\n                                size,\n                                values,\n                                values + size,\n                                values + size * 2,\n                                &size);\n\n    _glfwAllocGammaArrays(ramp, size);\n\n    for (i = 0; i < size; i++)\n    {\n        ramp->red[i]   = (unsigned short) (values[i] * 65535);\n        ramp->green[i] = (unsigned short) (values[i + size] * 65535);\n        ramp->blue[i]  = (unsigned short) (values[i + size * 2] * 65535);\n    }\n\n    free(values);\n}\n\nvoid _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)\n{\n    int i;\n    CGGammaValue* values = calloc(ramp->size * 3, sizeof(CGGammaValue));\n\n    for (i = 0;  i < ramp->size;  i++)\n    {\n        values[i]                  = ramp->red[i] / 65535.f;\n        values[i + ramp->size]     = ramp->green[i] / 65535.f;\n        values[i + ramp->size * 2] = ramp->blue[i] / 65535.f;\n    }\n\n    CGSetDisplayTransferByTable(monitor->ns.displayID,\n                                ramp->size,\n                                values,\n                                values + ramp->size,\n                                values + ramp->size * 2);\n\n    free(values);\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(kCGNullDirectDisplay);\n    return monitor->ns.displayID;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/gen-cocoa-linguist-thrift.m",
    "content": "/**\n * Autogenerated by Thrift Compiler (1.0.0-dev)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"TProtocol.h\"\n#import \"TApplicationException.h\"\n#import \"TProtocolException.h\"\n#import \"TProtocolUtil.h\"\n#import \"TProcessor.h\"\n#import \"TObjective-C.h\"\n#import \"TBase.h\"\n\n\n#import \"linguist.h\"\n\n@implementation PullRequest\n\n- (id) init\n{\n  self = [super init];\n#if TARGET_OS_IPHONE || (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)\n#endif\n  return self;\n}\n\n- (id) initWithTitle: (NSString *) title\n{\n  self = [super init];\n  __title = [title retain_stub];\n  __title_isset = YES;\n  return self;\n}\n\n- (id) initWithCoder: (NSCoder *) decoder\n{\n  self = [super init];\n  if ([decoder containsValueForKey: @\"title\"])\n  {\n    __title = [[decoder decodeObjectForKey: @\"title\"] retain_stub];\n    __title_isset = YES;\n  }\n  return self;\n}\n\n- (void) encodeWithCoder: (NSCoder *) encoder\n{\n  if (__title_isset)\n  {\n    [encoder encodeObject: __title forKey: @\"title\"];\n  }\n}\n\n- (NSUInteger) hash\n{\n  NSUInteger hash = 17;\n  hash = (hash * 31) ^ __title_isset ? 2654435761 : 0;\n  if (__title_isset)\n  {\n    hash = (hash * 31) ^ [__title hash];\n  }\n  return hash;\n}\n\n- (BOOL) isEqual: (id) anObject\n{\n  if (self == anObject) {\n    return YES;\n  }\n  if (![anObject isKindOfClass:[PullRequest class]]) {\n    return NO;\n  }\n  PullRequest *other = (PullRequest *)anObject;\n  if ((__title_isset != other->__title_isset) ||\n      (__title_isset && ((__title || other->__title) && ![__title isEqual:other->__title]))) {\n    return NO;\n  }\n  return YES;\n}\n\n- (void) dealloc\n{\n  [__title release_stub];\n  [super dealloc_stub];\n}\n\n- (NSString *) title {\n  return [[__title retain_stub] autorelease_stub];\n}\n\n- (void) setTitle: (NSString *) title {\n  [title retain_stub];\n  [__title release_stub];\n  __title = title;\n  __title_isset = YES;\n}\n\n- (BOOL) titleIsSet {\n  return __title_isset;\n}\n\n- (void) unsetTitle {\n  [__title release_stub];\n  __title = nil;\n  __title_isset = NO;\n}\n\n- (void) read: (id <TProtocol>) inProtocol\n{\n  NSString * fieldName;\n  int fieldType;\n  int fieldID;\n\n  [inProtocol readStructBeginReturningName: NULL];\n  while (true)\n  {\n    [inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];\n    if (fieldType == TType_STOP) { \n      break;\n    }\n    switch (fieldID)\n    {\n      case 1:\n        if (fieldType == TType_STRING) {\n          NSString * fieldValue = [inProtocol readString];\n          [self setTitle: fieldValue];\n        } else { \n          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];\n        }\n        break;\n      default:\n        [TProtocolUtil skipType: fieldType onProtocol: inProtocol];\n        break;\n    }\n    [inProtocol readFieldEnd];\n  }\n  [inProtocol readStructEnd];\n}\n\n- (void) write: (id <TProtocol>) outProtocol {\n  [outProtocol writeStructBeginWithName: @\"PullRequest\"];\n  if (__title_isset) {\n    if (__title != nil) {\n      [outProtocol writeFieldBeginWithName: @\"title\" type: TType_STRING fieldID: 1];\n      [outProtocol writeString: __title];\n      [outProtocol writeFieldEnd];\n    }\n  }\n  [outProtocol writeFieldStop];\n  [outProtocol writeStructEnd];\n}\n\n- (void) validate {\n  // check for required fields\n}\n\n- (NSString *) description {\n  NSMutableString * ms = [NSMutableString stringWithString: @\"PullRequest(\"];\n  [ms appendString: @\"title:\"];\n  [ms appendFormat: @\"\\\"%@\\\"\", __title];\n  [ms appendString: @\")\"];\n  return [NSString stringWithString: ms];\n}\n\n@end\n\n\n@implementation linguistConstants\n+ (void) initialize {\n}\n@end\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C/hello.m",
    "content": "#import <Cocoa/Cocoa.h>\n\nint main(int argc, char *argv[])\n{\n    NSLog(@\"Hello, World!\\n\");\n    return 0;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C++/EventHandlerMac.mm",
    "content": "// grabbed from https://raw.github.com/AOKP/external_webkit/61b2fb934bdd3a5fea253e2de0bcf8a47a552333/Source/WebCore/page/mac/EventHandlerMac.mm\n\n/*\n * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"config.h\"\n#include \"EventHandler.h\"\n\n#include \"AXObjectCache.h\"\n#include \"BlockExceptions.h\"\n#include \"Chrome.h\"\n#include \"ChromeClient.h\"\n#include \"ClipboardMac.h\"\n#include \"DragController.h\"\n#include \"EventNames.h\"\n#include \"FocusController.h\"\n#include \"Frame.h\"\n#include \"FrameLoader.h\"\n#include \"FrameView.h\"\n#include \"KeyboardEvent.h\"\n#include \"MouseEventWithHitTestResults.h\"\n#include \"NotImplemented.h\"\n#include \"Page.h\"\n#include \"PlatformKeyboardEvent.h\"\n#include \"PlatformWheelEvent.h\"\n#include \"RenderWidget.h\"\n#include \"RuntimeApplicationChecks.h\"\n#include \"Scrollbar.h\"\n#include \"Settings.h\"\n#include \"WebCoreSystemInterface.h\"\n#include <objc/objc-runtime.h>\n#include <wtf/StdLibExtras.h>\n\n#if !(defined(OBJC_API_VERSION) && OBJC_API_VERSION > 0)\nstatic inline IMP method_setImplementation(Method m, IMP i)\n{\n    IMP oi = m->method_imp;\n    m->method_imp = i;\n    return oi;\n}\n#endif\n\nnamespace WebCore {\n\n#if ENABLE(DRAG_SUPPORT)\nconst double EventHandler::TextDragDelay = 0.15;\n#endif\n\nstatic RetainPtr<NSEvent>& currentNSEventSlot()\n{\n    DEFINE_STATIC_LOCAL(RetainPtr<NSEvent>, event, ());\n    return event;\n}\n\nNSEvent *EventHandler::currentNSEvent()\n{\n    return currentNSEventSlot().get();\n}\n\nclass CurrentEventScope {\n     WTF_MAKE_NONCOPYABLE(CurrentEventScope);\npublic:\n    CurrentEventScope(NSEvent *);\n    ~CurrentEventScope();\n\nprivate:\n    RetainPtr<NSEvent> m_savedCurrentEvent;\n#ifndef NDEBUG\n    RetainPtr<NSEvent> m_event;\n#endif\n};\n\ninline CurrentEventScope::CurrentEventScope(NSEvent *event)\n    : m_savedCurrentEvent(currentNSEventSlot())\n#ifndef NDEBUG\n    , m_event(event)\n#endif\n{\n    currentNSEventSlot() = event;\n}\n\ninline CurrentEventScope::~CurrentEventScope()\n{\n    ASSERT(currentNSEventSlot() == m_event);\n    currentNSEventSlot() = m_savedCurrentEvent;\n}\n\nbool EventHandler::wheelEvent(NSEvent *event)\n{\n    Page* page = m_frame->page();\n    if (!page)\n        return false;\n\n    CurrentEventScope scope(event);\n\n    PlatformWheelEvent wheelEvent(event, page->chrome()->platformPageClient());\n    handleWheelEvent(wheelEvent);\n\n    return wheelEvent.isAccepted();\n}\n\nPassRefPtr<KeyboardEvent> EventHandler::currentKeyboardEvent() const\n{\n    NSEvent *event = [NSApp currentEvent];\n    if (!event)\n        return 0;\n    switch ([event type]) {\n        case NSKeyDown: {\n            PlatformKeyboardEvent platformEvent(event);\n            platformEvent.disambiguateKeyDownEvent(PlatformKeyboardEvent::RawKeyDown);\n            return KeyboardEvent::create(platformEvent, m_frame->document()->defaultView());\n        }\n        case NSKeyUp:\n            return KeyboardEvent::create(event, m_frame->document()->defaultView());\n        default:\n            return 0;\n    }\n}\n\nbool EventHandler::keyEvent(NSEvent *event)\n{\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n\n    ASSERT([event type] == NSKeyDown || [event type] == NSKeyUp);\n\n    CurrentEventScope scope(event);\n    return keyEvent(PlatformKeyboardEvent(event));\n\n    END_BLOCK_OBJC_EXCEPTIONS;\n\n    return false;\n}\n\nvoid EventHandler::focusDocumentView()\n{\n    Page* page = m_frame->page();\n    if (!page)\n        return;\n\n    if (FrameView* frameView = m_frame->view()) {\n        if (NSView *documentView = frameView->documentView())\n            page->chrome()->focusNSView(documentView);\n    }\n\n    page->focusController()->setFocusedFrame(m_frame);\n}\n\nbool EventHandler::passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults& event)\n{\n    // Figure out which view to send the event to.\n    RenderObject* target = targetNode(event) ? targetNode(event)->renderer() : 0;\n    if (!target || !target->isWidget())\n        return false;\n\n    // Double-click events don't exist in Cocoa. Since passWidgetMouseDownEventToWidget will\n    // just pass currentEvent down to the widget, we don't want to call it for events that\n    // don't correspond to Cocoa events.  The mousedown/ups will have already been passed on as\n    // part of the pressed/released handling.\n    return passMouseDownEventToWidget(toRenderWidget(target)->widget());\n}\n\nbool EventHandler::passWidgetMouseDownEventToWidget(RenderWidget* renderWidget)\n{\n    return passMouseDownEventToWidget(renderWidget->widget());\n}\n\nstatic bool lastEventIsMouseUp()\n{\n    // Many AppKit widgets run their own event loops and consume events while the mouse is down.\n    // When they finish, currentEvent is the mouseUp that they exited on. We need to update\n    // the WebCore state with this mouseUp, which we never saw. This method lets us detect\n    // that state. Handling this was critical when we used AppKit widgets for form elements.\n    // It's not clear in what cases this is helpful now -- it's possible it can be removed.\n\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n    NSEvent *currentEventAfterHandlingMouseDown = [NSApp currentEvent];\n    return EventHandler::currentNSEvent() != currentEventAfterHandlingMouseDown\n        && [currentEventAfterHandlingMouseDown type] == NSLeftMouseUp\n        && [currentEventAfterHandlingMouseDown timestamp] >= [EventHandler::currentNSEvent() timestamp];\n    END_BLOCK_OBJC_EXCEPTIONS;\n\n    return false;\n}\n\nbool EventHandler::passMouseDownEventToWidget(Widget* pWidget)\n{\n    // FIXME: This function always returns true. It should be changed either to return\n    // false in some cases or the return value should be removed.\n\n    RefPtr<Widget> widget = pWidget;\n\n    if (!widget) {\n        LOG_ERROR(\"hit a RenderWidget without a corresponding Widget, means a frame is half-constructed\");\n        return true;\n    }\n\n    // In WebKit2 we will never have an NSView. Just return early and let the regular event handler machinery take care of\n    // dispatching the event.\n    if (!widget->platformWidget())\n        return false;\n\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n\n    NSView *nodeView = widget->platformWidget();\n    ASSERT([nodeView superview]);\n    NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]];\n    if (!view) {\n        // We probably hit the border of a RenderWidget\n        return true;\n    }\n\n    Page* page = m_frame->page();\n    if (!page)\n        return true;\n\n    if (page->chrome()->client()->firstResponder() != view) {\n        // Normally [NSWindow sendEvent:] handles setting the first responder.\n        // But in our case, the event was sent to the view representing the entire web page.\n        if ([currentNSEvent() clickCount] <= 1 && [view acceptsFirstResponder] && [view needsPanelToBecomeKey])\n            page->chrome()->client()->makeFirstResponder(view);\n    }\n\n    // We need to \"defer loading\" while tracking the mouse, because tearing down the\n    // page while an AppKit control is tracking the mouse can cause a crash.\n\n    // FIXME: In theory, WebCore now tolerates tear-down while tracking the\n    // mouse. We should confirm that, and then remove the deferrsLoading\n    // hack entirely.\n\n    bool wasDeferringLoading = page->defersLoading();\n    if (!wasDeferringLoading)\n        page->setDefersLoading(true);\n\n    ASSERT(!m_sendingEventToSubview);\n    m_sendingEventToSubview = true;\n    NSView *outerView = widget->getOuterView();\n    widget->beforeMouseDown(outerView, widget.get());\n    [view mouseDown:currentNSEvent()];\n    widget->afterMouseDown(outerView, widget.get());\n    m_sendingEventToSubview = false;\n\n    if (!wasDeferringLoading)\n        page->setDefersLoading(false);\n\n    // Remember which view we sent the event to, so we can direct the release event properly.\n    m_mouseDownView = view;\n    m_mouseDownWasInSubframe = false;\n\n    // Many AppKit widgets run their own event loops and consume events while the mouse is down.\n    // When they finish, currentEvent is the mouseUp that they exited on.  We need to update\n    // the EventHandler state with this mouseUp, which we never saw.\n    // If this event isn't a mouseUp, we assume that the mouseUp will be coming later.  There\n    // is a hole here if the widget consumes both the mouseUp and subsequent events.\n    if (lastEventIsMouseUp())\n        m_mousePressed = false;\n\n    END_BLOCK_OBJC_EXCEPTIONS;\n\n    return true;\n}\n\n// Note that this does the same kind of check as [target isDescendantOf:superview].\n// There are two differences: This is a lot slower because it has to walk the whole\n// tree, and this works in cases where the target has already been deallocated.\nstatic bool findViewInSubviews(NSView *superview, NSView *target)\n{\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n    NSEnumerator *e = [[superview subviews] objectEnumerator];\n    NSView *subview;\n    while ((subview = [e nextObject])) {\n        if (subview == target || findViewInSubviews(subview, target)) {\n            return true;\n        }\n    }\n    END_BLOCK_OBJC_EXCEPTIONS;\n\n    return false;\n}\n\nNSView *EventHandler::mouseDownViewIfStillGood()\n{\n    // Since we have no way of tracking the lifetime of m_mouseDownView, we have to assume that\n    // it could be deallocated already. We search for it in our subview tree; if we don't find\n    // it, we set it to nil.\n    NSView *mouseDownView = m_mouseDownView;\n    if (!mouseDownView) {\n        return nil;\n    }\n    FrameView* topFrameView = m_frame->view();\n    NSView *topView = topFrameView ? topFrameView->platformWidget() : nil;\n    if (!topView || !findViewInSubviews(topView, mouseDownView)) {\n        m_mouseDownView = nil;\n        return nil;\n    }\n    return mouseDownView;\n}\n\n#if ENABLE(DRAG_SUPPORT)\nbool EventHandler::eventLoopHandleMouseDragged(const MouseEventWithHitTestResults&)\n{\n    NSView *view = mouseDownViewIfStillGood();\n\n    if (!view)\n        return false;\n\n    if (!m_mouseDownWasInSubframe) {\n        ASSERT(!m_sendingEventToSubview);\n        m_sendingEventToSubview = true;\n        BEGIN_BLOCK_OBJC_EXCEPTIONS;\n        [view mouseDragged:currentNSEvent()];\n        END_BLOCK_OBJC_EXCEPTIONS;\n        m_sendingEventToSubview = false;\n    }\n\n    return true;\n}\n#endif // ENABLE(DRAG_SUPPORT)\n\nbool EventHandler::eventLoopHandleMouseUp(const MouseEventWithHitTestResults&)\n{\n    NSView *view = mouseDownViewIfStillGood();\n    if (!view)\n        return false;\n\n    if (!m_mouseDownWasInSubframe) {\n        ASSERT(!m_sendingEventToSubview);\n        m_sendingEventToSubview = true;\n        BEGIN_BLOCK_OBJC_EXCEPTIONS;\n        [view mouseUp:currentNSEvent()];\n        END_BLOCK_OBJC_EXCEPTIONS;\n        m_sendingEventToSubview = false;\n    }\n\n    return true;\n}\n\nbool EventHandler::passSubframeEventToSubframe(MouseEventWithHitTestResults& event, Frame* subframe, HitTestResult* hoveredNode)\n{\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n\n    switch ([currentNSEvent() type]) {\n        case NSLeftMouseDragged:\n        case NSOtherMouseDragged:\n        case NSRightMouseDragged:\n            // This check is bogus and results in <rdar://6813830>, but removing it breaks a number of\n            // layout tests.\n            if (!m_mouseDownWasInSubframe)\n                return false;\n#if ENABLE(DRAG_SUPPORT)\n            if (subframe->page()->dragController()->didInitiateDrag())\n                return false;\n#endif\n        case NSMouseMoved:\n            // Since we're passing in currentNSEvent() here, we can call\n            // handleMouseMoveEvent() directly, since the save/restore of\n            // currentNSEvent() that mouseMoved() does would have no effect.\n            ASSERT(!m_sendingEventToSubview);\n            m_sendingEventToSubview = true;\n            subframe->eventHandler()->handleMouseMoveEvent(currentPlatformMouseEvent(), hoveredNode);\n            m_sendingEventToSubview = false;\n            return true;\n\n        case NSLeftMouseDown: {\n            Node* node = targetNode(event);\n            if (!node)\n                return false;\n            RenderObject* renderer = node->renderer();\n            if (!renderer || !renderer->isWidget())\n                return false;\n            Widget* widget = toRenderWidget(renderer)->widget();\n            if (!widget || !widget->isFrameView())\n                return false;\n            if (!passWidgetMouseDownEventToWidget(toRenderWidget(renderer)))\n                return false;\n            m_mouseDownWasInSubframe = true;\n            return true;\n        }\n        case NSLeftMouseUp: {\n            if (!m_mouseDownWasInSubframe)\n                return false;\n            ASSERT(!m_sendingEventToSubview);\n            m_sendingEventToSubview = true;\n            subframe->eventHandler()->handleMouseReleaseEvent(currentPlatformMouseEvent());\n            m_sendingEventToSubview = false;\n            return true;\n        }\n        default:\n            return false;\n    }\n    END_BLOCK_OBJC_EXCEPTIONS;\n\n    return false;\n}\n\nstatic IMP originalNSScrollViewScrollWheel;\nstatic bool _nsScrollViewScrollWheelShouldRetainSelf;\nstatic void selfRetainingNSScrollViewScrollWheel(NSScrollView *, SEL, NSEvent *);\n\nstatic bool nsScrollViewScrollWheelShouldRetainSelf()\n{\n    ASSERT(isMainThread());\n\n    return _nsScrollViewScrollWheelShouldRetainSelf;\n}\n\nstatic void setNSScrollViewScrollWheelShouldRetainSelf(bool shouldRetain)\n{\n    ASSERT(isMainThread());\n\n    if (!originalNSScrollViewScrollWheel) {\n        Method method = class_getInstanceMethod(objc_getRequiredClass(\"NSScrollView\"), @selector(scrollWheel:));\n        originalNSScrollViewScrollWheel = method_setImplementation(method, reinterpret_cast<IMP>(selfRetainingNSScrollViewScrollWheel));\n    }\n\n    _nsScrollViewScrollWheelShouldRetainSelf = shouldRetain;\n}\n\nstatic void selfRetainingNSScrollViewScrollWheel(NSScrollView *self, SEL selector, NSEvent *event)\n{\n    bool shouldRetainSelf = isMainThread() && nsScrollViewScrollWheelShouldRetainSelf();\n\n    if (shouldRetainSelf)\n        [self retain];\n    originalNSScrollViewScrollWheel(self, selector, event);\n    if (shouldRetainSelf)\n        [self release];\n}\n\nbool EventHandler::passWheelEventToWidget(PlatformWheelEvent& wheelEvent, Widget* widget)\n{\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n\n    if (!widget)\n        return false;\n\n    NSView* nodeView = widget->platformWidget();\n    if (!nodeView) {\n        // WebKit2 code path.\n        if (!widget->isFrameView())\n            return false;\n\n        return static_cast<FrameView*>(widget)->frame()->eventHandler()->handleWheelEvent(wheelEvent);\n    }\n\n    if ([currentNSEvent() type] != NSScrollWheel || m_sendingEventToSubview)\n        return false;\n\n    ASSERT(nodeView);\n    ASSERT([nodeView superview]);\n    NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]];\n    if (!view)\n        // We probably hit the border of a RenderWidget\n        return false;\n\n    ASSERT(!m_sendingEventToSubview);\n    m_sendingEventToSubview = true;\n    // Work around <rdar://problem/6806810> which can cause -[NSScrollView scrollWheel:] to\n    // crash if the NSScrollView is released during timer or network callback dispatch\n    // in the nested tracking runloop that -[NSScrollView scrollWheel:] runs.\n    setNSScrollViewScrollWheelShouldRetainSelf(true);\n    [view scrollWheel:currentNSEvent()];\n    setNSScrollViewScrollWheelShouldRetainSelf(false);\n    m_sendingEventToSubview = false;\n    return true;\n\n    END_BLOCK_OBJC_EXCEPTIONS;\n    return false;\n}\n\nvoid EventHandler::mouseDown(NSEvent *event)\n{\n    FrameView* v = m_frame->view();\n    if (!v || m_sendingEventToSubview)\n        return;\n\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n\n    m_frame->loader()->resetMultipleFormSubmissionProtection();\n\n    m_mouseDownView = nil;\n\n    CurrentEventScope scope(event);\n\n    handleMousePressEvent(currentPlatformMouseEvent());\n\n    END_BLOCK_OBJC_EXCEPTIONS;\n}\n\nvoid EventHandler::mouseDragged(NSEvent *event)\n{\n    FrameView* v = m_frame->view();\n    if (!v || m_sendingEventToSubview)\n        return;\n\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n\n    CurrentEventScope scope(event);\n    handleMouseMoveEvent(currentPlatformMouseEvent());\n\n    END_BLOCK_OBJC_EXCEPTIONS;\n}\n\nvoid EventHandler::mouseUp(NSEvent *event)\n{\n    FrameView* v = m_frame->view();\n    if (!v || m_sendingEventToSubview)\n        return;\n\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n\n    CurrentEventScope scope(event);\n\n    // Our behavior here is a little different that Qt. Qt always sends\n    // a mouse release event, even for a double click. To correct problems\n    // in khtml's DOM click event handling we do not send a release here\n    // for a double click. Instead we send that event from FrameView's\n    // handleMouseDoubleClickEvent. Note also that the third click of\n    // a triple click is treated as a single click, but the fourth is then\n    // treated as another double click. Hence the \"% 2\" below.\n    int clickCount = [event clickCount];\n    if (clickCount > 0 && clickCount % 2 == 0)\n        handleMouseDoubleClickEvent(currentPlatformMouseEvent());\n    else\n        handleMouseReleaseEvent(currentPlatformMouseEvent());\n\n    m_mouseDownView = nil;\n\n    END_BLOCK_OBJC_EXCEPTIONS;\n}\n\n/*\n A hack for the benefit of AK's PopUpButton, which uses the Carbon menu manager, which thus\n eats all subsequent events after it is starts its modal tracking loop.  After the interaction\n is done, this routine is used to fix things up.  When a mouse down started us tracking in\n the widget, we post a fake mouse up to balance the mouse down we started with. When a\n key down started us tracking in the widget, we post a fake key up to balance things out.\n In addition, we post a fake mouseMoved to get the cursor in sync with whatever we happen to\n be over after the tracking is done.\n */\nvoid EventHandler::sendFakeEventsAfterWidgetTracking(NSEvent *initiatingEvent)\n{\n    FrameView* view = m_frame->view();\n    if (!view)\n        return;\n\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n\n    m_sendingEventToSubview = false;\n    int eventType = [initiatingEvent type];\n    if (eventType == NSLeftMouseDown || eventType == NSKeyDown) {\n        NSEvent *fakeEvent = nil;\n        if (eventType == NSLeftMouseDown) {\n            fakeEvent = [NSEvent mouseEventWithType:NSLeftMouseUp\n                                           location:[initiatingEvent locationInWindow]\n                                      modifierFlags:[initiatingEvent modifierFlags]\n                                          timestamp:[initiatingEvent timestamp]\n                                       windowNumber:[initiatingEvent windowNumber]\n                                            context:[initiatingEvent context]\n                                        eventNumber:[initiatingEvent eventNumber]\n                                         clickCount:[initiatingEvent clickCount]\n                                           pressure:[initiatingEvent pressure]];\n\n            [NSApp postEvent:fakeEvent atStart:YES];\n        } else { // eventType == NSKeyDown\n            fakeEvent = [NSEvent keyEventWithType:NSKeyUp\n                                         location:[initiatingEvent locationInWindow]\n                                    modifierFlags:[initiatingEvent modifierFlags]\n                                        timestamp:[initiatingEvent timestamp]\n                                     windowNumber:[initiatingEvent windowNumber]\n                                          context:[initiatingEvent context]\n                                       characters:[initiatingEvent characters]\n                      charactersIgnoringModifiers:[initiatingEvent charactersIgnoringModifiers]\n                                        isARepeat:[initiatingEvent isARepeat]\n                                          keyCode:[initiatingEvent keyCode]];\n            [NSApp postEvent:fakeEvent atStart:YES];\n        }\n        // FIXME: We should really get the current modifierFlags here, but there's no way to poll\n        // them in Cocoa, and because the event stream was stolen by the Carbon menu code we have\n        // no up-to-date cache of them anywhere.\n        fakeEvent = [NSEvent mouseEventWithType:NSMouseMoved\n                                       location:[[view->platformWidget() window] convertScreenToBase:[NSEvent mouseLocation]]\n                                  modifierFlags:[initiatingEvent modifierFlags]\n                                      timestamp:[initiatingEvent timestamp]\n                                   windowNumber:[initiatingEvent windowNumber]\n                                        context:[initiatingEvent context]\n                                    eventNumber:0\n                                     clickCount:0\n                                       pressure:0];\n        [NSApp postEvent:fakeEvent atStart:YES];\n    }\n\n    END_BLOCK_OBJC_EXCEPTIONS;\n}\n\nvoid EventHandler::mouseMoved(NSEvent *event)\n{\n    // Reject a mouse moved if the button is down - screws up tracking during autoscroll\n    // These happen because WebKit sometimes has to fake up moved events.\n    if (!m_frame->view() || m_mousePressed || m_sendingEventToSubview)\n        return;\n\n    BEGIN_BLOCK_OBJC_EXCEPTIONS;\n    CurrentEventScope scope(event);\n    mouseMoved(currentPlatformMouseEvent());\n    END_BLOCK_OBJC_EXCEPTIONS;\n}\n\nstatic bool frameHasPlatformWidget(Frame* frame)\n{\n    if (FrameView* frameView = frame->view()) {\n        if (frameView->platformWidget())\n            return true;\n    }\n\n    return false;\n}\n\nbool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)\n{\n    // WebKit1 code path.\n    if (frameHasPlatformWidget(m_frame))\n        return passSubframeEventToSubframe(mev, subframe);\n\n    // WebKit2 code path.\n    subframe->eventHandler()->handleMousePressEvent(mev.event());\n    return true;\n}\n\nbool EventHandler::passMouseMoveEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe, HitTestResult* hoveredNode)\n{\n    // WebKit1 code path.\n    if (frameHasPlatformWidget(m_frame))\n        return passSubframeEventToSubframe(mev, subframe, hoveredNode);\n\n    // WebKit2 code path.\n    if (m_mouseDownMayStartDrag && !m_mouseDownWasInSubframe)\n        return false;\n    subframe->eventHandler()->handleMouseMoveEvent(mev.event(), hoveredNode);\n    return true;\n}\n\nbool EventHandler::passMouseReleaseEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)\n{\n    // WebKit1 code path.\n    if (frameHasPlatformWidget(m_frame))\n        return passSubframeEventToSubframe(mev, subframe);\n\n    // WebKit2 code path.\n    subframe->eventHandler()->handleMouseReleaseEvent(mev.event());\n    return true;\n}\n\nPlatformMouseEvent EventHandler::currentPlatformMouseEvent() const\n{\n    NSView *windowView = nil;\n    if (Page* page = m_frame->page())\n        windowView = page->chrome()->platformPageClient();\n    return PlatformMouseEvent(currentNSEvent(), windowView);\n}\n\n#if ENABLE(CONTEXT_MENUS)\nbool EventHandler::sendContextMenuEvent(NSEvent *event)\n{\n    Page* page = m_frame->page();\n    if (!page)\n        return false;\n    return sendContextMenuEvent(PlatformMouseEvent(event, page->chrome()->platformPageClient()));\n}\n#endif // ENABLE(CONTEXT_MENUS)\n\n#if ENABLE(DRAG_SUPPORT)\nbool EventHandler::eventMayStartDrag(NSEvent *event)\n{\n    Page* page = m_frame->page();\n    if (!page)\n        return false;\n    return eventMayStartDrag(PlatformMouseEvent(event, page->chrome()->platformPageClient()));\n}\n#endif // ENABLE(DRAG_SUPPORT)\n\nbool EventHandler::eventActivatedView(const PlatformMouseEvent& event) const\n{\n    return m_activationEventNumber == event.eventNumber();\n}\n\n#if ENABLE(DRAG_SUPPORT)\n\nPassRefPtr<Clipboard> EventHandler::createDraggingClipboard() const\n{\n    NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:NSDragPboard];\n    // Must be done before ondragstart adds types and data to the pboard,\n    // also done for security, as it erases data from the last drag\n    [pasteboard declareTypes:[NSArray array] owner:nil];\n    return ClipboardMac::create(Clipboard::DragAndDrop, pasteboard, ClipboardWritable, m_frame);\n}\n\n#endif\n\nbool EventHandler::tabsToAllFormControls(KeyboardEvent* event) const\n{\n    Page* page = m_frame->page();\n    if (!page)\n        return false;\n\n    KeyboardUIMode keyboardUIMode = page->chrome()->client()->keyboardUIMode();\n    bool handlingOptionTab = isKeyboardOptionTab(event);\n\n    // If tab-to-links is off, option-tab always highlights all controls\n    if ((keyboardUIMode & KeyboardAccessTabsToLinks) == 0 && handlingOptionTab)\n        return true;\n\n    // If system preferences say to include all controls, we always include all controls\n    if (keyboardUIMode & KeyboardAccessFull)\n        return true;\n\n    // Otherwise tab-to-links includes all controls, unless the sense is flipped via option-tab.\n    if (keyboardUIMode & KeyboardAccessTabsToLinks)\n        return !handlingOptionTab;\n\n    return handlingOptionTab;\n}\n\nbool EventHandler::needsKeyboardEventDisambiguationQuirks() const\n{\n    Document* document = m_frame->document();\n\n    // RSS view needs arrow key keypress events.\n    if (applicationIsSafari() && (document->url().protocolIs(\"feed\") || document->url().protocolIs(\"feeds\")))\n        return true;\n    Settings* settings = m_frame->settings();\n    if (!settings)\n        return false;\n\n#if ENABLE(DASHBOARD_SUPPORT)\n    if (settings->usesDashboardBackwardCompatibilityMode())\n        return true;\n#endif\n\n    if (settings->needsKeyboardEventDisambiguationQuirks())\n        return true;\n\n    return false;\n}\n\nunsigned EventHandler::accessKeyModifiers()\n{\n    // Control+Option key combinations are usually unused on Mac OS X, but not when VoiceOver is enabled.\n    // So, we use Control in this case, even though it conflicts with Emacs-style key bindings.\n    // See <https://bugs.webkit.org/show_bug.cgi?id=21107> for more detail.\n    if (AXObjectCache::accessibilityEnhancedUserInterfaceEnabled())\n        return PlatformKeyboardEvent::CtrlKey;\n\n    return PlatformKeyboardEvent::CtrlKey | PlatformKeyboardEvent::AltKey;\n}\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-C++/objsql.mm",
    "content": "/*\n *  objsql.m - implementaion simple persistence layer using objcpp.h\n *  ========\n *\n *  Created by John Holdsworth on 01/04/2009.\n *  Copyright 2009 John Holdsworth.\n *\n *  $Id: //depot/4.4/ObjCpp/objsql.mm#11 $\n *  $DateTime: 2012/09/05 00:20:47 $\n *\n *  C++ classes to wrap up XCode classes for operator overload of\n *  useful operations such as access to NSArrays and NSDictionary\n *  by subscript or NSString operators such as + for concatenation.\n *\n *  This works as the Apple Objective-C compiler supports source\n *  which mixes C++ with objective C. To enable this: for each\n *  source file which will include/import this header file, select\n *  it in Xcode and open it's \"Info\". To enable mixed compilation,\n *  for the file's \"File Type\" select: \"sourcecode.cpp.objcpp\".\n *\n *  For bugs or ommisions please email objcpp@johnholdsworth.com\n *\n *  Home page for updates and docs: http://objcpp.johnholdsworth.com\n *\n *  You may make commercial use of this source in applications without\n *  charge but not sell it as source nor can you remove this notice from\n *  this source if you redistribute. You can make any changes you like\n *  to this code before redistribution but please annotate them below.\n *\n *  If you find it useful please send a donation via paypal to account\n *  objcpp@johnholdsworth.com. Thanks.\n *\n *  THIS CODE IS PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND EITHER\n *  EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n *  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n *\n *  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n *  WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\n *  THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING\n *  ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT\n *  OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n *  TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED \n *  BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH \n *  ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN\n *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n *\n */\n\n#import <objc/runtime.h>\n#import <sqlite3.h>\n\n#import \"objsql.h\"\n\n#if 0\n#ifdef OODEBUG\n#define OODEBUG_SQL  1\n#endif\n#endif\n\nOOOODatabase OODB;\n\nstatic NSString *kOOObject = @\"__OOOBJECT__\", *kOOInsert = @\"__ISINSERT__\", *kOOUpdate = @\"__ISUPDATE__\", *kOOExecSQL = @\"__OOEXEC__\";\n\n#pragma mark OORecord abstract superclass for records\n\n@implementation OORecord\n\n+ (id)record OO_AUTORETURNS {\n\treturn OO_AUTORELEASE( [[self alloc] init] );\n}\n\n+ (id)insert OO_AUTORETURNS { \n\tOORecord *record = [self record];\n\t[record insert];\n\treturn record;\n}\n\n+ (id)insertWithParent:(id)parent {\n\treturn [[OODatabase sharedInstance] copyJoinKeysFrom:parent to:[self insert]];\n}\n\n- (id)insert { [[OODatabase sharedInstance] insert:self]; return self; }\n- (id)delete { [[OODatabase sharedInstance] delete:self]; return self; }\n\n- (void)update { [[OODatabase sharedInstance] update:self]; }\n- (void)indate { [[OODatabase sharedInstance] indate:self]; }\n- (void)upsert { [[OODatabase sharedInstance] upsert:self]; }\n\n- (int)commit { return [[OODatabase sharedInstance] commit]; }\n- (int)rollback { return [[OODatabase sharedInstance] rollback]; }\n\n// to handle null values for ints, floats etc.\n- (void)setNilValueForKey:(NSString *)key {\n\tstatic OOReference<NSValue *> zeroForNull;\n\tif ( !zeroForNull )\n\t\tzeroForNull = [NSNumber numberWithInt:0];\n\t[self setValue:zeroForNull forKey:key];\n}\n\n+ (OOArray<id>)select {\n\treturn [[OODatabase sharedInstance] select:nil intoClass:self joinFrom:nil];\n}\n\n+ (OOArray<id>)select:(cOOString)sql {\n\treturn [[OODatabase sharedInstance] select:sql intoClass:self joinFrom:nil];\n}\n\n+ (OOArray<id>)selectRecordsRelatedTo:(id)parent {\n\treturn [[OODatabase sharedInstance] select:nil intoClass:self joinFrom:parent];\n}\n\n- (OOArray<id>)select {\n\treturn [[OODatabase sharedInstance] select:nil intoClass:[self class] joinFrom:self];\n}\n\n/**\n import a flat file with column values separated by the delimiter specified into \n the table associated with this class.\n */\n\n+ (int)importFrom:(OOFile &)file delimiter:(cOOString)delim {\n\tOOArray<id> rows = [OOMetaData import:file.string() intoClass:self delimiter:delim];\n\t[[OODatabase sharedInstance] insertArray:rows];\n\treturn [OODatabase commit];\n}\n\n/**\n Export a flat file with all rows in the table associated with the record subclass.\n */\n\n+ (BOOL)exportTo:(OOFile &)file delimiter:(cOOString)delim {\n\treturn file.save( [OOMetaData export:[self select] delimiter:delim] );\n}\n\n/**\n populate a view with the string values taken from the ivars of the record\n */\n\n- (void)bindToView:(OOView *)view delegate:(id)delegate {\n\t[OOMetaData bindRecord:self toView:view delegate:delegate];\n}\n\n/**\n When the delegate method os sent use this method to update the record's values\n */\n\n- (void)updateFromView:(OOView *)view {\n\t[OOMetaData updateRecord:self fromView:view];\n}\n\n/**\n Default description is dictionary containing values of all ivars\n */\n\n- (NSString *)description {\n\tOOMetaData *metaData = [OOMetaData metaDataForClass:[self class]];\n\t// hack required where record contains a field \"description\" to avoid recursion\n\tOOStringArray ivars; ivars <<= *metaData->ivars; ivars -= \"description\";\n\treturn [*[metaData encode:[self dictionaryWithValuesForKeys:ivars]] description];\n}\n\n@end\n\n#pragma mark OOAdaptor - all methods required by objsql to access a database\n\n/**\n An internal class representing the interface to a particular database, in this case sqlite3.\n */\n\n@interface OOAdaptor : NSObject {\n\tsqlite3 *db;\n\tsqlite3_stmt *stmt;\n\tstruct _str_link { \n\t\tstruct _str_link *next; char str[1]; \n\t} *strs;\n\tOO_UNSAFE OODatabase *owner;\n}\n\n- initPath:(cOOString)path database:(OODatabase *)database;\n- (BOOL)prepare:(cOOString)sql;\n\n- (BOOL)bindCols:(cOOStringArray)columns values:(cOOValueDictionary)values startingAt:(int)pno bindNulls:(BOOL)bindNulls;\n- (OOArray<id>)bindResultsIntoInstancesOfClass:(Class)recordClass metaData:(OOMetaData *)metaData;\n- (sqlite_int64)lastInsertRowID;\n\n@end\n\n@interface NSData(OOExtras)\n- initWithDescription:(NSString *)description;\n@end\n\n#pragma mark OODatabase is the low level interface to a particular database\n\n@implementation OODatabase\n\nstatic OOReference<OODatabase *> sharedInstance;\n\n/**\n By default database file is \"objsql.db\" in the user/application's \"Documents\" directory\n and a single shared OODatabase instance used for all db operations.\n */\n\n+ (OODatabase *)sharedInstance {\n    if ( !sharedInstance )\n        [self sharedInstanceForPath:OODocument(\"objsql.db\").path()]; \n\treturn sharedInstance;\n}\n\n/**\n Shared instance can be switched between any file paths.\n */\n \n + (OODatabase *)sharedInstanceForPath:(cOOString)path {\n     if ( !!sharedInstance )\n         sharedInstance = OONil;\n     if ( !!path )\n         OO_RELEASE( sharedInstance = [[OODatabase alloc] initPath:path] );\n\t return sharedInstance;\n}\n\n+ (BOOL)exec:(cOOString)fmt, ... {\n\tva_list argp; va_start(argp, fmt);\n\tNSString *sql = [[NSString alloc] initWithFormat:fmt arguments:argp];\n\tva_end( argp );\n\treturn [[self sharedInstance] exec:OO_AUTORELEASE( sql )];\n}\n\n+ (OOArray<id>)select:(cOOString)select intoClass:(Class)recordClass joinFrom:(id)parent {\n\treturn [[self sharedInstance] select:select intoClass:recordClass joinFrom:parent];\n}\n+ (OOArray<id>)select:(cOOString)select intoClass:(Class)recordClass {\n\treturn [[self sharedInstance] select:select intoClass:recordClass joinFrom:nil];\n}\n+ (OOArray<id>)select:(cOOString)select {\n\treturn [[self sharedInstance] select:select intoClass:nil joinFrom:nil];\n}\n\n+ (int)insertArray:(const OOArray<id> &)objects { return [[self sharedInstance] insertArray:objects]; }\n+ (int)deleteArray:(const OOArray<id> &)objects { return [[self sharedInstance] deleteArray:objects]; }\n\n+ (int)insert:(id)object { return [[self sharedInstance] insert:object]; }\n+ (int)delete:(id)object { return [[self sharedInstance] delete:object]; }\n+ (int)update:(id)object { return [[self sharedInstance] update:object]; }\n\n+ (int)indate:(id)object { return [[self sharedInstance] indate:object]; }\n+ (int)upsert:(id)object { return [[self sharedInstance] upsert:object]; }\n\n+ (int)commit { return [[self sharedInstance] commit]; }\n+ (int)rollback { return [[self sharedInstance] rollback]; }\n+ (int)commitTransaction { return [[OODatabase sharedInstance] commitTransaction]; }\n\n/**\n Designated initialiser for OODatabase instances. Generally only the shared instance is used\n and the OODatabase class object is messaged instead.\n */\n\n- initPath:(cOOString)path {\n\tif ( self = [super init] )\n\t\tOO_RELEASE( adaptor = [[OOAdaptor alloc] initPath:path database:self] );\n\treturn self;\n}\n\n/**\n Automatically register all classes which are subclasses of a record abstract superclass (e.g. OORecord).\n */\n\n- (OOStringArray)registerSubclassesOf:(Class)recordSuperClass {\n\tint numClasses = objc_getClassList( NULL, 0 );\n\tClass *classes = (Class *)malloc( sizeof *classes * numClasses );\n\tOOArray<Class> viewClasses;\n\tOOStringArray classNames;\n\n\t// scan all registered classes for relevant subclasses\n\tnumClasses = objc_getClassList( classes, numClasses );\n\tfor ( int c=0 ; c<numClasses ; c++ ) {\n\t\tClass superClass = classes[c];\n        if ( class_getName( superClass )[0] != '_' )\n            while ( (superClass = class_getSuperclass( superClass )) )\n                if ( superClass == recordSuperClass ) {\n                    if ( [classes[c] respondsToSelector:@selector(ooTableSql)] )\n                        viewClasses += classes[c];\n                    else {\n                        [[OODatabase sharedInstance] tableMetaDataForClass:classes[c]];\n                        classNames += class_getName( classes[c] );\n                    }\n                    break;\n                }\n\t}\n\n\t// delay creation views until after tables\n\tfor ( int c=0 ; c<viewClasses ; c++ ) {\n\t\t[[OODatabase sharedInstance] tableMetaDataForClass:viewClasses[c]];\n\t\tclassNames += class_getName( viewClasses[c] );\n\t}\n\n\t// return classes in order registered\n\tfree( classes );\n\treturn classNames;\n}\n\n/**\n Register a list of classes before using them so OODatabase can determine the relationships between them.\n */\n\n- (void)registerTableClassesNamed:(cOOStringArray)classes {\n\tfor ( NSString *tableClass in *classes )\n\t\t[self tableMetaDataForClass:[[NSBundle mainBundle] classNamed:tableClass]];\n}\n\n/**\n Send any SQL to the database. Sql is a format string so escape any '%' characters using '%%'.\n Any results returned are placed as an array of dictionary values in the database->results.\n */\n \n- (BOOL)exec:(cOOString)fmt, ... {\n\tva_list argp; va_start(argp, fmt);\n\tNSString *sql = [[NSString alloc] initWithFormat:fmt arguments:argp];\n\tva_end( argp );\n\tresults = [self select:sql intoClass:NULL joinFrom:nil];\n\tOO_RELEASE( sql );\n\treturn !errcode;\n}\n\n/**\n Return a single value from row 1, column one from sql sent to the database as a string.\n */\n\n- (OOString)stringForSql:(cOOString)fmt, ... {\n\tva_list argp; va_start(argp, fmt);\n\tNSString *sql = OO_AUTORELEASE( [[NSString alloc] initWithFormat:fmt arguments:argp] );\n\tva_end( argp );\n\tif( [self exec:\"%@\", sql] && results > 0 ) {\n\t\tNSString *aColumnName = [[**results[0] allKeys] objectAtIndex:0];\n\t\treturn [(NSNumber *)(*results[0])[aColumnName] stringValue];\n\t}\n\telse\n\t\treturn nil;\n}\n\n/**\n Used to initialise new child records automatically from parent in relation.\n */\n\n- (id)copyJoinKeysFrom:(id)parent to:(id)newChild {\n\tOOMetaData *parentMetaData = [self tableMetaDataForClass:[parent class]],\n\t\t\t*childMetaData = [self tableMetaDataForClass:[newChild class]];\n\tOOStringArray commonColumns = [parentMetaData naturalJoinTo:childMetaData->columns]; ////\n\tOOValueDictionary keyValues = [parentMetaData encode:[parent dictionaryWithValuesForKeys:commonColumns]];\n\t[newChild setValuesForKeysWithDictionary:[childMetaData decode:keyValues]];\n\treturn newChild;\n}\n\n/**\n Build a where clause for the columns specified.\n */\n\n- (OOString)whereClauseFor:(cOOStringArray)columns values:(cOOValueDictionary)values qualifyNulls:(BOOL)qualifyNulls {\n\tOOString out;\n\tfor ( int i=0 ; i<columns ; i++ ) {\n\t\tNSString *name = *columns[i];\n\t\tconst char *prefix = i==0 ?\"\\nwhere\":\" and\";\n\n\t\tid value = values[name];\n\t\tif ( value == OONull )\n\t\t\tout += qualifyNulls ? OOFormat( @\"%s\\n\\t%@ is NULL\", prefix, name ) : @\"\";\n\t\telse if ( !qualifyNulls && [value isKindOfClass:[NSString class]] &&\n                 [value rangeOfString:@\"%\"].location != NSNotFound )\n\t\t\tout += OOFormat( @\"%s\\n\\t%@ LIKE ?\", prefix, name );\n\t\telse\n\t\t\tout += OOFormat( @\"%s\\n\\t%@ = ?\", prefix, name );\n\t}\n\treturn out;\n}\n\n/**\n Prepare the sql passed in adding a where clause with bindings for a join to values taken from the parent record.\n */\n\n- (BOOL)prepareSql:(OOString &)sql joinFrom:(id)parent toTable:(OOMetaData *)metaData {\n\tOOValueDictionary joinValues;\n\tOOStringArray sharedColumns;\n\n\tif ( parent ) {\n\t\tOOMetaData *parentMetaData = [self tableMetaDataForClass:[parent class]];\n\t\tsharedColumns = [parentMetaData naturalJoinTo:metaData->joinableColumns];\n\t\tjoinValues = [parentMetaData encode:[parent dictionaryWithValuesForKeys:sharedColumns]];\n\n\t\tsql += [self whereClauseFor:sharedColumns values:joinValues qualifyNulls:NO];\n\t}\n\n\tif ( [metaData->recordClass respondsToSelector:@selector(ooOrderBy)] )\n\t\tsql += OOFormat( @\"\\norder by %@\", [metaData->recordClass ooOrderBy] );\n\n#ifdef OODEBUG_SQL\n\tNSLog( @\"-[OOMetaData prepareSql:] %@\\n%@\", *sql, *joinValues );\n#endif\n\n\tif ( ![*adaptor prepare:sql] )\n\t\treturn NO;\n\n\treturn !parent || [*adaptor bindCols:sharedColumns values:joinValues startingAt:1 bindNulls:NO];\n}\n\n/**\n Determine a list of the tables which have a natural join to the record passed in.\n If the record is a specific instance of from a table this should determine if\n there are any record which exist using the join.\n */\n\n- (OOArray<OOMetaData *>)tablesRelatedByNaturalJoinFrom:(id)record {\n\tOOMetaData *metaData = [record class] == [OOMetaData class] ? \n        record : [self tableMetaDataForClass:[record class]];\n\n\tOOStringArray tablesWithNaturalJoin;\n\ttablesWithNaturalJoin <<= metaData->tablesWithNaturalJoin;\n\n\tif ( record && record != metaData )\n\t\tfor ( int i=0 ; i<tablesWithNaturalJoin ; i++ ) {\n\t\t\tOOString sql = OOFormat( @\"select count(*) as result from %@\", **tablesWithNaturalJoin[i] );\n\t\t\tOOMetaData *childMetaData = tableMetaDataByClassName[tablesWithNaturalJoin[i]];\n\n\t\t\t[self prepareSql:sql joinFrom:record toTable:childMetaData];\n\t\t\tOOArray<OODictionary<NSNumber *> > tmpResults = [*adaptor bindResultsIntoInstancesOfClass:NULL metaData:nil];\n\n\t\t\tif ( ![(*tmpResults[0])[\"result\"] intValue] )\n\t\t\t\t~tablesWithNaturalJoin[i--];\n\t\t}\n\n\treturn tableMetaDataByClassName[+tablesWithNaturalJoin];\n}\n\n/**\n Perform a select from a table on the database using either the sql specified \n orselect all columns from the table associated with the record class passed in.\n If a parent is passed in make a natural join from that record.\n */\n\n- (OOArray<id>)select:(cOOString)select intoClass:(Class)recordClass joinFrom:(id)parent {\n\tOOMetaData *metaData = [self tableMetaDataForClass:recordClass ? recordClass : [parent class]];\n\tOOString sql = !select ?\n        OOFormat( @\"select %@\\nfrom %@\", *(metaData->outcols/\", \"), *metaData->tableName ) : *select;\n\n\tif ( ![self prepareSql:sql joinFrom:parent toTable:metaData] )\n\t\treturn nil;\n\n\treturn [*adaptor bindResultsIntoInstancesOfClass:recordClass metaData:metaData];\n}\n\n- (OOArray<id>)select:(cOOString)select intoClass:(Class)recordClass {\n\treturn [self select:select intoClass:recordClass joinFrom:nil];\n}\n\n- (OOArray<id>)select:(cOOString)select {\n\treturn [self select:select intoClass:nil joinFrom:nil];\n}\n\n/**\n Returns sqlite3 row identifier for a record instance.\n */\n\n- (long long)rowIDForRecord:(id)record {\n\tOOMetaData *metaData = [self tableMetaDataForClass:[record class]];\n\tOOString sql = OOFormat( @\"select ROWID from %@\", *metaData->tableName );\n\tOOArray<OODictionary<NSNumber *> > idResults = [self select:sql intoClass:nil joinFrom:record];\n\treturn [*(*idResults[0])[@\"rowid\"] longLongValue];\n}\n\n/**\n Returns sqlite3 row identifier for last inserted record.\n */\n\n- (long long)lastInsertRowID {\n\treturn [*adaptor lastInsertRowID];\n}\n\n/**\n Insert an array of record objects into the database. This needs to be commited to take effect.\n */\n\n- (int)insertArray:(const OOArray<id> &)objects {\n\tint count = 0;\n\tfor ( id object in *objects )\n\t\tcount = [self insert:object];\n\treturn count;\n}\n\n/**\n Delete an array of record objects from the database. This needs to be commited to take effect.\n */\n\n- (int)deleteArray:(const OOArray<id> &)objects {\n\tint count = 0;\n\tfor ( id object in *objects )\n\t\tif ( ![object respondsToSelector:@selector(delete)] )\n\t\t\tcount = [self delete:object];\n\t\telse {\n\t\t\t[object delete];\n\t\t\tcount++;\n\t\t}\n\treturn count;\n}\n\n/**\n Insert the values of the record class instance at the time this method was called into the db.\n (must be commited to take effect). Returns the total number of outstanding inserts/updates/deletes.\n */\n\n- (int)insert:(id)record {\n\treturn transaction += OOValueDictionary( kOOObject, record, kOOInsert, kCFNull, nil );\n}\n\n/**\n Use the values of the record instance at the time this method is called in a where clause to \n delete from the database when commit is called. Returns the total number of outstanding\n inserts/updates/deletes.\n */\n\n- (int)delete:(id)record {\n\treturn transaction += OOValueDictionary( kOOObject, record, nil );\n}\n\n/**\n Call this method if you intend to make changes to the record object and save them to the database.\n This takes a snapshot of the previous values to use as a key for the update operation when \"commit\"\n is called. Returns the total number of outstanding inserts/updates/deletes.\n */\n\n- (int)update:(id)record {\n\tOOMetaData *metaData = [self tableMetaDataForClass:[record class]];\n\tOOValueDictionary oldValues = [metaData encode:[record dictionaryWithValuesForKeys:metaData->columns]];\n\tfor ( NSString *key in *metaData->tocopy )\n\t\tOO_RELEASE( oldValues[key] = [oldValues[key] copy] );\n\toldValues[kOOUpdate] = OONull;\n\toldValues[kOOObject] = record;\n\treturn transaction += oldValues;\n}\n\n/**\n Inserts a record into the database the deletes any previous record with the same key.\n This ensures the record's rowid changes if this is used by child records.\n */\n\n- (int)indate:(id)record {\n\tOOMetaData *metaData = [self tableMetaDataForClass:[record class]];\n\tOOString sql = OOFormat( @\"select rowid from %@\", *metaData->tableName );\n\tOOArray<id> existing = [self select:sql intoClass:nil joinFrom:record];\n\tint count = [self insert:record];\n\tfor ( NSDictionary *exist in *existing ) {\n\t\tOOString sql = OOFormat( @\"delete from %@ where rowid = %ld\", *metaData->tableName, \n\t\t\t\t\t\t\t\t(long)[[exist objectForKey:@\"rowid\"] longLongValue] );\n\t\ttransaction += OOValueDictionary( kOOExecSQL, *sql, nil );\n\t}\n\treturn count;\n}\n\n/**\n Inserts a record into the database unless another record with the same key column values\n exists in which case it will do an update of the previous record (preserving the ROWID.)\n */\n\n- (int)upsert:(id)record {\n\tOOArray<id> existing = [self select:nil intoClass:[record class] joinFrom:record];\n\tif ( existing > 1 )\n\t\tOOWarn( @\"-[ODatabase upsert:] Duplicate record for upsert: %@\", record );\n\tif ( existing > 0 ) {\n\t\t[self update:existing[0]];\n\t\t(*transaction[-1])[kOOObject] = record;\n\t\treturn transaction;\n\t}\n\telse\n\t\treturn [self insert:record];\n}\n\n/**\n Commit all pending inserts, updates and deletes to the database. Use commitTransaction to perform \n this inside a database transaction.\n */\n\n- (int)commit {\n\tint commited = 0;\n\n\tfor ( int i=0 ; i<transaction ; i++ ) {\n\t\tOOValueDictionary values = transaction[i];\n\t\tOOString exec = (NSMutableString *)~values[kOOExecSQL];\n\t\tif ( !!exec ) {\n\t\t\tif ( ![self exec:@\"%@\", *exec] )\n\t\t\t\tOOWarn( @\"-[ODatabase commit] Error in transaction exec: %@ - %s\", *exec, errmsg );\n\t\t\tcontinue;\n\t\t}\n\n\t\tOORef<NSObject *> object = *values[kOOObject]; values -= kOOObject;\n\t\tBOOL isInsert = !!~values[kOOInsert], isUpdate = !!~values[kOOUpdate];\n\n\t\tOOMetaData *metaData = [self tableMetaDataForClass:[object class]];\n\t\tOOValueDictionary newValues = [metaData encode:[object dictionaryWithValuesForKeys:metaData->columns]];\n\t\tOOStringArray changedCols;\n\n\t\tif ( isUpdate ) {\n\t\t\tfor ( NSString *name in *metaData->columns )\n\t\t\t\tif ( ![*newValues[name] isEqual:values[name]] )\n\t\t\t\t\tchangedCols += name;\n\t\t}\n\t\telse \n\t\t\tvalues = newValues;\n\n\t\tOOString sql = isInsert ? \n\t\tOOFormat( @\"insert into %@ (%@) values (\", *metaData->tableName, *(metaData->columns/\", \") ) :\n\t\tOOFormat( isUpdate ? @\"update %@ set\" : @\"delete from %@\", *metaData->tableName );\n\n\t\tint nchanged = changedCols;\n\t\tif ( isUpdate && nchanged == 0 ) {\n\t\t\tOOWarn( @\"%s %@ (%@)\", errmsg = (char *)\"-[ODatabase commit:] Update of unchanged record\", *object, *(lastSQL = sql) );\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor ( int i=0 ; i<nchanged ; i++ )\n\t\t\tsql += OOFormat( @\"%s\\n\\t%@ = ?\", i==0 ? \"\" : \",\", **changedCols[i] );\n\n\t\tif ( isInsert ) {\n\t\t\tOOString quote = \"?\", commaQuote = \", ?\";\n\t\t\tfor ( int i=0 ; i<metaData->columns ; i++ )\n\t\t\t\tsql += i==0 ? quote : commaQuote;\n\t\t\tsql += \")\";\n\t\t}\n\t\telse\n\t\t\tsql += [self whereClauseFor:metaData->columns values:values qualifyNulls:YES];\n\n#ifdef OODEBUG_SQL\n\t\tNSLog( @\"-[OODatabase commit]: %@ %@\", *sql, *values );\n#endif\n\n\t\tif ( ![*adaptor prepare:sql] )\n\t\t\tcontinue;\n\n\t\tif ( isUpdate )\n\t\t\t[*adaptor bindCols:changedCols values:newValues startingAt:1 bindNulls:YES];\n\t\t[*adaptor bindCols:metaData->columns values:values startingAt:1+nchanged bindNulls:isInsert];\n\n\t\t[*adaptor bindResultsIntoInstancesOfClass:nil metaData:metaData];\n\t\tcommited += updateCount;\n\t}\n\n\ttransaction = nil;\n\treturn commited;\n}\n\n/**\n Commit all pending inserts, updates, deletes to the database inside a transaction.\n */\n\n- (int)commitTransaction {\n\t[self exec:\"BEGIN TRANSACTION\"];\n\tint updated = [self commit];\n\treturn [self exec:\"COMMIT\"] ? updated : 0;\n}\n\n/**\n Rollback any outstanding inserts, updates, or deletes. Please note updated values \n are also rolled back inside the actual record in the application as well.\n */\n\n- (int)rollback {\n\tfor ( NSMutableDictionary *d in *transaction ) {\n\t\tOODictionary<id> values = d;\n\n\t\tif ( !!~values[kOOUpdate] ) {\n\t\t\tOORef<OORecord *> record = ~values[kOOObject];\n\t\t\tOOMetaData *metaData = [self tableMetaDataForClass:[*record class]];\n\n#ifndef OO_ARC\n\t\t\tfor ( NSString *name in *metaData->boxed )\n                OO_RELEASE( (id)[[*record valueForKey:name] pointerValue] );\n#endif\n\n\t\t\t[*record setValuesForKeysWithDictionary:[metaData decode:values]];\n\t\t}\n\t}\n\treturn (int)[*~transaction count];\n}\n\n/**\n Find/create an instance of the OOMetaData class which describes a record class and its associated table.\n If the table does not exist it will be created along with indexes for columns/ivars which have \n upper case names for use in joins. Details of the tables parameters can be controlled by using\n methods in the OOTableCustomisation protool. If it does not exist a meta table class which\n prepresents OOMetaData records themselves is also created from which the list of all registered\n tables can be selected.\n */\n \n- (OOMetaData *)tableMetaDataForClass:(Class)recordClass {\n\tif ( !recordClass || recordClass == [OOMetaData class] )\n\t\treturn [OOMetaData metaDataForClass:[OOMetaData class]];\n\n\tOOString className = class_getName( recordClass );\n\tOOMetaData *metaData = tableMetaDataByClassName[className];\n\n\tif ( !metaData ) {\n\t\tmetaData = [OOMetaData metaDataForClass:recordClass];\n\n#ifdef OODEBUG_SQL\n\t\tNSLog(@\"\\n%@\", *metaData->createTableSQL);\n#endif\n\n\t\tif ( metaData->tableName[0] != '_' && \n\t\t\t[self stringForSql:\"select count(*) from sqlite_master where name = '%@'\",\n             *metaData->tableName] == \"0\" )\n\t\t\tif ( [self exec:\"%@\", *metaData->createTableSQL] )\n\t\t\t\tfor ( NSString *idx in *metaData->indexes )\n\t\t\t\t\tif ( ![self exec:idx] )\n\t\t\t\t\t\tOOWarn( @\"-[OOMetaData tableMetaDataForClass:] Error creating index: %@\", idx );\n\n\t\ttableMetaDataByClassName[className] = metaData;\n\t}\n\n\treturn metaData;\n}\n\n@end\n\n#pragma mark OOAdaptor - implements all access to a particular database \n\n@implementation OOAdaptor \n\n/**\n Connect to/create sqlite3 database\n */\n\n- (OOAdaptor *)initPath:(cOOString)path database:(OODatabase *)database {\n    if ( self = [super init] ) {\n        owner = database;\n        OOFile( OOFile( path ).directory() ).mkdir();\n        if ( (owner->errcode = sqlite3_open( path, &db )) != SQLITE_OK ) {\n            OOWarn( @\"-[OOAdaptor initPath:database:] Error opening database at path: %@\", *path );\n            return nil;\n        }\n    }\n\treturn self;\n}\n\n/**\n Prepare a sql statement after which values can be bound and results returned.\n */\n\n- (BOOL)prepare:(cOOString)sql {\n\tif ( (owner->errcode = sqlite3_prepare_v2( db, owner->lastSQL = sql, -1, &stmt, 0 )) != SQLITE_OK )\n\t\tOOWarn(@\"-[OOAdaptor prepare:] Could not prepare sql: \\\"%@\\\" - %s\", *owner->lastSQL, owner->errmsg = (char *)sqlite3_errmsg( db ) );\n\treturn owner->errcode == SQLITE_OK;\n}\n\n- (int)bindValue:(id)value asParameter:(int)pno {\n#ifdef OODEBUG_BIND\n\tNSLog( @\"-[OOAdaptor bindValue:bindValue:] bind parameter #%d as: %@\", pno, value );\n#endif\n\tif ( !value || value == OONull )\n\t\treturn sqlite3_bind_null( stmt, pno );\n#if OOSQL_THREAD_SAFE_BUT_USES_MORE_MEMORY\n\telse if ( [value isKindOfClass:[NSString class]] )\n\t\treturn sqlite3_bind_text( stmt, pno, [value UTF8String], -1, SQLITE_STATIC );\n#else\n\telse if ( [value isKindOfClass:[NSString class]] ) {\n\t\tint len = (int)[value lengthOfBytesUsingEncoding:NSUTF8StringEncoding];\n\t\tstruct _str_link *str = (struct _str_link *)malloc( sizeof *str + len );\n\t\tstr->next = strs;\n\t\tstrs = str;\n\t\t[value getCString:str->str maxLength:len+1 encoding:NSUTF8StringEncoding];\n\t\treturn sqlite3_bind_text( stmt, pno, str->str, len, SQLITE_STATIC );\n\t}\n#endif\n\telse if ( [value isKindOfClass:[NSData class]] )\n\t\treturn sqlite3_bind_blob( stmt, pno, [value bytes], (int)[value length], SQLITE_STATIC );\n\n\tconst char *type = [value objCType];\n\tif ( type )\n\t\tswitch ( type[0] ) {\n\t\t\tcase 'c': case 's': case 'i': case 'l':\n\t\t\tcase 'C': case 'S': case 'I': case 'L':\n\t\t\t\treturn sqlite3_bind_int( stmt, pno, [value intValue] );\n\t\t\tcase 'q': case 'Q':\n\t\t\t\treturn sqlite3_bind_int64( stmt, pno, [value longLongValue] );\n\t\t\tcase 'f': case 'd':\n\t\t\t\treturn sqlite3_bind_double( stmt, pno, [value doubleValue] );\n\t\t}\n\n\tOOWarn( @\"-[OOAdaptor bindValue:bindValue:] Undefined type in bind of parameter #%d: %s, value: %@\", pno, type, value );\n\treturn -1;\n}\n\n/**\n Bind parameters from a prepared SQL statement. The \"objCType\" method is used to determine the type to bind.\n */\n\n- (BOOL)bindCols:(cOOStringArray)columns values:(cOOValueDictionary)values startingAt:(int)pno bindNulls:(BOOL)bindNulls {\n\tint errcode;\n\tfor ( NSString *name in *columns )\n\t\tif ( bindNulls || *values[name] != OONull )\n\t\t\tif ( (errcode = [self bindValue:values[name] asParameter:pno++]) != SQLITE_OK )\n\t\t\t\tOOWarn( @\"-[OOAdaptor bindCols:...] Bind failed column: %@ - %s (%d)\", name, owner->errmsg = (char *)sqlite3_errmsg( db ), owner->errcode = errcode );\n\treturn owner->errcode == SQLITE_OK;\n}\n\n/**\n Return a dictionary containing the values for a row returned by the database from a select.\n These values need to be decoded using a classes metadata to set the ivar values later.\n */\n\n- (OOValueDictionary)valuesForNextRow {\n\tint ncols = sqlite3_column_count( stmt );\n\tOOValueDictionary values;\n\n\tfor ( int i=0 ; i<ncols ; i++ ) {\n\t\tOOString name = sqlite3_column_name( stmt, i );\n\t\tid value = nil;\n\n\t\tswitch ( sqlite3_column_type( stmt, i ) ) {\n\t\t\tcase SQLITE_NULL:\n\t\t\t\tvalue = OONull;\n\t\t\t\tbreak;\n\t\t\tcase SQLITE_INTEGER:\n\t\t\t\tvalue = [[NSNumber alloc] initWithLongLong:sqlite3_column_int64( stmt, i )]; \n\t\t\t\tbreak;\n\t\t\tcase SQLITE_FLOAT:\n\t\t\t\tvalue = [[NSNumber alloc] initWithDouble:sqlite3_column_double( stmt, i )]; \n\t\t\t\tbreak;\n\t\t\tcase SQLITE_TEXT: {\n\t\t\t\tconst unsigned char *bytes = sqlite3_column_text( stmt, i );\n\t\t\t\tvalue = [[NSMutableString alloc] initWithBytes:bytes\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlength:sqlite3_column_bytes( stmt, i) \n\t\t\t\t\t\t\t\t\t\t\t\t\t  encoding:NSUTF8StringEncoding];\n\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SQLITE_BLOB: {\n\t\t\t\tconst void *bytes = sqlite3_column_blob( stmt, i );\n\t\t\t\tvalue = [[NSData alloc] initWithBytes:bytes length:sqlite3_column_bytes( stmt, i )];\n\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tOOWarn( @\"-[OOAdaptor valuesForNextRow:] Invalid type on bind of ivar %@: %d\", *name, sqlite3_column_type( stmt, i ) );\n\t\t}\n\n\t\tvalues[name] = value;\n\t\tOO_RELEASE( value );\n\t}\n\n\treturn values;\n}\n\n/**\n Create instances of the recordClass to store results from a database select or if the record\n class is not present return a list of dictionary objects with the raw results.\n */\n\n- (OOArray<id>)bindResultsIntoInstancesOfClass:(Class)recordClass metaData:(OOMetaData *)metaData {\n\tOOArray<id> out;\n\tBOOL awakeFromDB = [recordClass instancesRespondToSelector:@selector(awakeFromDB)];\n\n\twhile( (owner->errcode = sqlite3_step( stmt )) == SQLITE_ROW ) {\n\t\tOOValueDictionary values = [self valuesForNextRow];\n\t\tif ( recordClass ) {\n\t\t\tid record = [[recordClass alloc] init];\n\t\t\t[record setValuesForKeysWithDictionary:[metaData decode:values]];\n\n\t\t\tif ( awakeFromDB )\n\t\t\t\t[record awakeFromDB];\n\n\t\t\tout += record;\n\t\t\tOO_RELEASE( record );\n\t\t}\n\t\telse\n\t\t\tout += values;\n\t}\n\n\tif ( owner->errcode != SQLITE_DONE )\n\t\tOOWarn(@\"-[OOAdaptor bindResultsIntoInstancesOfClass:metaData:] Not done (bind) stmt: %@ - %s\", *owner->lastSQL, owner->errmsg = (char *)sqlite3_errmsg( db ) );\n\telse {\n\t\towner->errcode = SQLITE_OK;\n\t\tout.alloc();\n\t}\n\n\twhile ( strs != NULL ) {\n\t\tstruct _str_link *next = strs->next;\n\t\tfree( strs );\n\t\tstrs = next;\n\t}\n\towner->updateCount = sqlite3_changes( db );\n\tsqlite3_finalize( stmt );\n\treturn out;\n}\n\n- (sqlite_int64)lastInsertRowID {\n\treturn sqlite3_last_insert_rowid( db );\n}\n\n- (void) dealloc {\n\tsqlite3_close( db );\n\tOO_DEALLOC( super );\n}\n\n@end\n\n#pragma mark OOMetaData instances represent a table in the database and it's record class\n\n@implementation OOMetaData\n\nstatic OODictionary<OOMetaData *> metaDataByClass;\nstatic OOMetaData *tableOfTables;\n\n+ (NSString *)ooTableTitle { return @\"Table MetaData\"; }\n\n+ (OOMetaData *)metaDataForClass:(Class)recordClass OO_RETURNS {\n\tif ( !tableOfTables )\n\t\tOO_RELEASE( tableOfTables = [[OOMetaData alloc] initClass:[OOMetaData class]] );\n\tOOMetaData *metaData = metaDataByClass[recordClass];\n\tif ( !metaData )\n\t\tOO_RELEASE( metaData = [[OOMetaData alloc] initClass:recordClass] );\n\treturn metaData;\n}\n\n+ (OOArray<id>)selectRecordsRelatedTo:(id)record {\n\treturn [[OODatabase sharedInstance] tablesRelatedByNaturalJoinFrom:record];\n}\n\n- initClass:(Class)aClass {\n    if ( !(self = [super init]) )\n        return self;\n    recordClass = aClass;\n    metaDataByClass[recordClass] = self;\n\trecordClassName = class_getName( recordClass );\n\ttableTitle = [recordClass respondsToSelector:@selector(ooTableTitle)] ?\n        [recordClass ooTableTitle] : *recordClassName;\n\ttableName = [recordClass respondsToSelector:@selector(ooTableName)] ?\n        [recordClass ooTableName] : *recordClassName;\n  \n\tif ( aClass == [OOMetaData class] ) {\n\t\tivars = columns = outcols = boxed = unbox =\n            \"tableTitle tableName recordClassName keyColumns ivars columns outcols\";\n\t\treturn self;\n\t}\n\n\tcreateTableSQL = OOFormat( @\"create table %@ (\", *tableName );\n\n\tOOArray<Class> hierarchy;\n\tdo\n\t\thierarchy += aClass;\n\twhile ( (aClass = [aClass superclass]) && aClass != [NSObject class] );\n\n\tfor ( int h=(int)hierarchy-1 ; h>=0 ; h-- ) {\n\t\taClass = (Class)hierarchy[h]; ///\n        Ivar *ivarInfo = class_copyIvarList( aClass, NULL );\n\t\tif ( !ivarInfo )\n\t\t\tcontinue;\n\n\t\tfor ( int in=0 ; ivarInfo[in] ; in++ ) {\n\t\t\tOOString columnName = ivar_getName( ivarInfo[in] );\n\t\t\tivars += columnName;\n\n\t\t\tOOString type = types[columnName] = ivar_getTypeEncoding( ivarInfo[in] ), dbtype = \"\";\n\n            SEL columnSel = sel_getUid(columnName);\n\t\t\tswitch ( type[0] ) {\n\t\t\t\tcase 'c': case 's': case 'i': case 'l':\n\t\t\t\tcase 'C': case 'S': case 'I': case 'L':\n\t\t\t\tcase 'q': case 'Q':\n\t\t\t\t\tdbtype = @\"int\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'f': case 'd':\n\t\t\t\t\tdbtype = @\"real\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase '{':\n                    static OOPattern isOORef( \"=\\\"ref\\\"@\\\"NS\" );\n\t\t\t\t\tif( !(type & isOORef) )\n\t\t\t\t\t\tOOWarn( @\"-[OOMetaData initClass:] Invalid structure type for ivar %@ in class %@: %@\", *columnName, *recordClassName, *type );\n\t\t\t\t\tboxed += columnName;\n\t\t\t\t\tif ( ![recordClass instancesRespondToSelector:columnSel] ) {\n\t\t\t\t\t\tunbox += columnName;\n\t\t\t\t\t\tif ( [[recordClass superclass] instancesRespondToSelector:columnSel] )\n\t\t\t\t\t\t\tOOWarn( @\"-[OOMetaData initClass:] Superclass of class %@ is providing method for column: %@\", *recordClassName, *columnName );\n\t\t\t\t\t}\n\t\t\t\tcase '@':\n                    static OOPattern isNSString( \"NS(Mutable)?String\\\"\" ),\n                        isNSDate( \"\\\"NSDate\\\"\" ), isNSData( \"NS(Mutable)?Data\\\"\" );\n\t\t\t\t\tif ( type & isNSString )\n\t\t\t\t\t\tdbtype = @\"text\";\n\t\t\t\t\telse if ( type & isNSDate ) {\n\t\t\t\t\t\tdbtype = @\"real\";\n\t\t\t\t\t\tdates += columnName;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif ( !(type & isNSData) )\n\t\t\t\t\t\t\tarchived += columnName;\n\t\t\t\t\t\tblobs += columnName;\n\t\t\t\t\t\tdbtype = @\"blob\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tOOWarn( @\"-[OOMetaData initClass:] Unknown data type '%@' in class %@\", *type, *tableName );\n\t\t\t\t\tarchived += columnName;\n\t\t\t\t\tblobs += columnName;\n\t\t\t\t\tdbtype = @\"blob\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif ( dbtype == @\"text\" )\n\t\t\t\ttocopy += columnName;\n\n\t\t\tif ( columnName == @\"rowid\" || columnName == @\"ROWID\" ||\n                columnName == @\"OID\" || columnName == @\"_ROWID_\" ) {\n\t\t\t\toutcols += columnName;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcreateTableSQL += OOFormat(@\"%s\\n\\t%@ %@ /* %@ */\",\n                                       !columns?\"\":\",\", *columnName, *dbtype, *type );\n\n\t\t\tif ( iswupper( columnName[columnName[0] != '_' ? 0 : 1] ) )\n\t\t\t\tindexes += OOFormat(@\"create index %@_%@ on %@ (%@)\\n\",\n\t\t\t\t\t\t\t\t\t*tableName, *columnName,\n\t\t\t\t\t\t\t\t\t*tableName, *columnName);\n\n            if ( class_getName( [aClass superclass] )[0] != '_' ) {\n                columns += columnName;\n                outcols += columnName;\n                joinableColumns += columnName;\n            }\n        }\n\n        free( ivarInfo );\n    }\n\n\tif ( [recordClass respondsToSelector:@selector(ooTableKey)] )\n\t\tcreateTableSQL += OOFormat( @\",\\n\\tprimary key (%@)\",\n                                   *(keyColumns = [recordClass ooTableKey]) );\n\n\tif ( [recordClass respondsToSelector:@selector(ooConstraints)] )\n\t\tcreateTableSQL += OOFormat( @\",\\n\\t%@\", [recordClass ooConstraints] );\n\n\tcreateTableSQL += \"\\n)\\n\";\n\n\tif ( [recordClass respondsToSelector:@selector(ooTableSql)] ) {\n\t\tcreateTableSQL = [recordClass ooTableSql];\n\t\tindexes = nil;\n\t}\n\n\ttableOfTables->tablesWithNaturalJoin += recordClassName;\n\ttablesWithNaturalJoin += recordClassName;\n\n\tfor( Class other in [*metaDataByClass allKeys] ) {\n\t\tOOMetaData *otherMetaData = metaDataByClass[other];\n\t\tif ( other == recordClass || otherMetaData == tableOfTables )\n\t\t\tcontinue;\n\n\t\tif ( [self naturalJoinTo:otherMetaData->joinableColumns] > 0 )\n\t\t\ttablesWithNaturalJoin += otherMetaData->recordClassName;\n\t\tif ( [otherMetaData naturalJoinTo:joinableColumns] > 0 )\n\t\t\totherMetaData->tablesWithNaturalJoin += recordClassName;\n\t}\n\n\treturn self;\n}\n\n/**\n Find the columns shared between two classes and that have upper case names (are indexed).\n */\n\n- (OOStringArray)naturalJoinTo:(cOOStringArray)to {\n    //NSLog( @\"%@ -- %@\", *columns, *to );\n\tOOStringArray commonColumns = columns & to;\n\tfor ( int i=0 ; i<commonColumns ; i++ )\n\t\tif ( islower( (*commonColumns[i])[0] ) )\n\t\t\t~commonColumns[i--];\n\treturn commonColumns;\n}\n\n/**\n Encode values ready for insertion into the database (convert OOString to NSString etc.)\n */\n\n- (cOOValueDictionary)encode:(cOOValueDictionary)values {\n    //NSLog( @\"%@ - unbox: %@, dates: %@, archived: %@\", *values, *unbox, *dates, *archived );\n\tfor ( NSString *key in *unbox ) {\n\t\tid value = (id)[*values[key] pointerValue];\n\t\tvalues[key] = value ? value : OONull;\n\t}\n\tfor ( NSString *key in *dates )\n\t\tvalues[key] = [NSNumber numberWithDouble:[(id)values[key] timeIntervalSince1970]];\n\tfor ( NSString *key in *archived )\n\t\tvalues[key] = (NSValue *)[NSKeyedArchiver archivedDataWithRootObject:values[key]];\n\treturn values;\n}\n\n/**\n Decode values taken from the database for use in [record setValuesForKeysWithDictionary:values];\n */\n\n#ifdef OO_ARC\nvoid ooArcRetain( id value ) {\n    // hack to retain value encoded as pointer\n    if ( value && value != OONull ) {\n        static IMP retainIMP;\n        static SEL retainSEL;\n        if ( !retainIMP ) {\n            retainSEL = sel_getUid( \"retain\" );\n            Method method = class_getInstanceMethod( [value class], retainSEL );\n            retainIMP = method_getImplementation( method );\n        }\n        retainIMP( value, retainSEL );\n    }\n}\n#endif\n\n- (cOOValueDictionary)decode:(cOOValueDictionary)values {\n\tid value;\n\tfor ( NSString *key in *archived )\n\t\tif ( (value = values[key]) )\n\t\t\tvalues[key] = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)value];\n\tfor ( NSString *key in *dates )\n\t\tif ( (value = values[key]) )\n\t\t\tvalues[key] = [NSDate dateWithTimeIntervalSince1970:[value doubleValue]];\n\tfor ( NSString *key in *boxed ) {\n\t\tif ( (value = values[key]) ) {\n\t\t\tvalue = value != OONull ? OO_RETAIN( value ) : nil;\n#ifdef OO_ARC\n            ooArcRetain( value );\n#endif\n\t\t\tOO_RELEASE( values[key] = [[NSValue alloc] initWithBytes:&value objCType:@encode(id)] );\n\t\t}\n\t}\n\treturn values;\n}\n\n/**\n import values for a list of nodes selected from an XML document.\n */\n\n+ (OOArray<id>)import:(const OOArray<OODictionary<OOString> > &)nodes intoClass:(Class)recordClass {\n\tOOMetaData *metaData = [self metaDataForClass:recordClass];\n\tOOArray<id> out;\n\n\tfor ( NSMutableDictionary *dict in *nodes ) {\n\t\tOOStringDictionary node = dict, values;\n\t\tfor ( NSString *ivar in *metaData->columns )\n\t\t\tvalues[ivar] = node[ivar];\n\n\t\tid record = [[recordClass alloc] init];\n\t\t[record setValuesForKeysWithDictionary:[metaData decode:values]];\n\t\tout += record;\n\t\tOO_RELEASE( record );\n\t}\n\n\treturn out;\n}\n\n/**\n Convert a string taken from a flat file into record instances which can be inserted into the database.\n */\n\n+ (OOArray<id>)import:(cOOString)string intoClass:(Class)recordClass delimiter:(cOOString)delim {\n\tOOMetaData *metaData = [self metaDataForClass:recordClass];\n\t// remove escaped newlines then split by newline\n\tOOStringArray lines = (string - @\"\\\\\\\\\\n\") / @\"\\n\";\n\tlines--; // pop last empty line\n\n\tOOArray<id> out;\n\tfor ( int l=0 ; l<lines ; l++ ) {\n\t\tOODictionary<NSString *> values;\n\t\tvalues[metaData->columns] = *lines[l] / delim;\n\n\t\t// empty columns are taken as null values\n\t\tfor ( NSString *key in *metaData->columns )\n\t\t\tif ( [*values[key] isEqualToString:@\"\"] )\n\t\t\t\tvalues[key] = OONull;\n\n\t\t// convert description strings to NSData\n\t\tfor ( NSString *key in *metaData->blobs )\n\t\t\tOO_RELEASE( values[key] = (NSString *)[[NSData alloc] initWithDescription:values[key]] );\n\n\t\tid record = [[recordClass alloc] init];\n\t\t[record setValuesForKeysWithDictionary:[metaData decode:values]];\n\t\tout += record;\n\t\tOO_RELEASE( record );\n\t}\n\n\treturn out;\n}\n\n/**\n Convert a set of records selected from the database into a string which can be saved to disk.\n */\n\n+ (OOString)export:(const OOArray<id> &)array delimiter:(cOOString)delim {\n\tOOMetaData *metaData = nil;\n\tOOString out;\n\n\tfor ( id record in *array ) {\n\t\tif ( !metaData )\n\t\t\tmetaData = [record isKindOfClass:[NSDictionary class]] ?\n                OONull : [self metaDataForClass:[record class]];\n\n\t\tOODictionary<NSNumber *> values = metaData == OONull ? record : \n\t\t*[metaData encode:[record dictionaryWithValuesForKeys:metaData->columns]];\n\n\t\tOOStringArray line;\n\t\tNSString *blank = @\"\";\n\t\tfor ( NSString *key in *metaData->columns )\n\t\t\tline += *values[key] != OONull ? [values[key] stringValue] : blank;\n\n\t\tout += line/delim+\"\\n\";\n\t}\n\n\treturn out;\n}\n\n/**\n Bind a record to a view containing elements which are to display values from the record.\n The ivar number is selected by the subview's tag value and it's \".text\" property if set to\n the value returned record value \"stringValue\" for the ivar. Supports images stored as\n NSData objects, UISwitches bound to boolean valuea and UITextField for alll other values.\n */\n\n+ (void)bindRecord:(id)record toView:(OOView *)view delegate:(id)delegate {\n#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED\n\tOOMetaData *metaData = [self metaDataForClass:[record class]];\n\tOOValueDictionary values = [metaData encode:[record dictionaryWithValuesForKeys:metaData->ivars]];\n\n\tfor ( int i=0 ; i<metaData->ivars ; i++ ) {\n\t\tUILabel *label = (UILabel *)[view viewWithTag:1+i];\n\t\tid value = values[metaData->ivars[i]];\n\n        if ( [label isKindOfClass:[UIImageView class]] )\n\t\t\t((UIImageView *)label).image = value != OONull ? [UIImage imageWithData:(NSData *)value] : nil;\n\t\telse if ( [label isKindOfClass:[UISwitch class]] ) {\n\t\t\tUISwitch *uiSwitch = (UISwitch *)label;\n\t\t\tuiSwitch.on = value != OONull ? [value charValue] : 0;\n\t\t\tif ( delegate )\n\t\t\t\t[uiSwitch addTarget:delegate action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged];\n\t\t}\n\t\telse if ( [label isKindOfClass:[UIWebView class]] )\n\t\t\t[(UIWebView *)label loadHTMLString:value != OONull ? value : @\"\" baseURL:nil];\n\t\telse if ( label ) {\n\t\t\tlabel.text = value != OONull ? [value stringValue] : @\"\";\n\t\t\tif ( [label isKindOfClass:[UITextView class]] ) {\n\t\t\t\t[(UITextView *)label setContentOffset:CGPointMake(0,0) animated:NO];\n\t\t\t\t[(UITextView *)label scrollRangeToVisible:NSMakeRange(0,0)];\n\t\t\t}\n\t\t}\n\n\t\tif ( [label respondsToSelector:@selector(delegate)] )\n\t\t\t((UITextField *)label).delegate = delegate;\n\t\tlabel.hidden = NO;\n\n\t\tif ( (label = (UILabel *)[view viewWithTag:-1-i]) ) {\n\t\t\tlabel.text = **metaData->ivars[i];\n\t\t\tlabel.hidden = NO;\n\t\t}\n\t}\n\n\tOOView *subView;\n\tfor ( int i=metaData->ivars ; (subView = [view viewWithTag:1+i]) ; i++ ) {\n\t\tsubView.hidden = YES;\n\t\tif ( (subView = [view viewWithTag:-1-i]) )\n\t\t\tsubView.hidden =YES;\n\t}\n#endif\n}\n\n/**\n When the delegate method fires this method should be called to update\n the record with the modified value before updating the database.\n */\n\n+ (void)updateRecord:(id)record fromView:(OOView *)view {\n#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED\n\tif ( view.tag > 0 && [view respondsToSelector:@selector(text)] ) {\n\t\tOOMetaData *metaData = [self metaDataForClass:[record class]];\n\t\tNSString *name = *metaData->ivars[view.tag-1];\n\t\tOOString type = metaData->types[name];\n\t\tid value = OO_RETAIN(((UITextField *)view).text );\n\n\t\tif ( type[0] == '{' ) {\n#ifdef OO_ARC\n            ooArcRetain( value );\n#endif\n\t\t\tvalue = [[NSValue alloc] initWithBytes:&value objCType:@encode(id)];\n#ifndef OO_ARC\n\t\t\tOO_RELEASE( (id)[[record valueForKey:name] pointerValue] );\n#endif\n\t\t}\n\n\t\t[record setValue:value forKey:name];\n\t\tOO_RELEASE( value );\n\t}\n\tfor ( OOView *subview in [view subviews] )\n\t\t[self updateRecord:record fromView:subview];\n#endif\n}\n\n@end\n\n@implementation OOView(OOExtras)\n\n- copyView {\n    NSData *archived = [NSKeyedArchiver archivedDataWithRootObject:self];\n    OOView *copy = [NSKeyedUnarchiver unarchiveObjectWithData:archived];\n#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED\n    copy.frame = CGRectMake(0.0, 0.0, self.frame.size.width, self.frame.size.height);\n#else\n    copy.frame = NSMakeRect(0.0, 0.0, self.frame.size.width, self.frame.size.height);\n#endif\n    return copy;\n}\n\n@end\n\n@implementation NSData(OOExtras)\n\nstatic int unhex ( unsigned char ch ) {\n\treturn ch >= 'a' ? 10 + ch - 'a'  : ch >= 'A' ? 10 + ch - 'A' : ch - '0';\n}\n\n- initWithDescription:(NSString *)description {\n\tNSInteger len = [description length]/2, lin = [description lengthOfBytesUsingEncoding:NSUTF8StringEncoding];\n\tchar *bytes = (char *)malloc( len ), *optr = bytes, *hex = (char *)malloc( lin+1 );\n\t[description getCString:hex maxLength:lin+1 encoding:NSUTF8StringEncoding];\n\n\tfor ( char *iptr = hex ; *iptr ; iptr+=2 ) {\n\t\tif ( *iptr == '<' || *iptr == ' ' || *iptr == '>' )\n\t\t\tiptr--;\n\t\telse\n\t\t\t*optr++ = unhex( *iptr )*16 + unhex( *(iptr+1) );\n\t}\n\n\tfree( hex );\n\treturn [self initWithBytesNoCopy:bytes length:optr-bytes freeWhenDone:YES];\n}\n\n- (NSString *)stringValue { return [self description]; }\n\n@end\n\n@interface NSString(OOExtras)\n@end\n@implementation NSString(OOExtras)\n- (char)charValue { return [self intValue]; }\n- (char)shortValue { return [self intValue]; }\n- (NSString *)stringValue { return self; }\n@end\n\n@interface NSArray(OOExtras)\n@end\n@implementation NSArray(OOExtras)\n- (NSString *)stringValue { \n\tstatic OOReplace reformat( \"/(\\\\s)\\\\s+|^\\\\(|\\\\)$|\\\"/$1/\" );\n\treturn &([self description] | reformat);\n}\n@end\n\n@interface NSDictionary(OOExtras)\n@end\n@implementation NSDictionary(OOExtras)\n- (NSString *)stringValue { \n\tstatic OOReplace reformat( \"/(\\\\s)\\\\s+|^\\\\{|\\\\}$|\\\"/$1/\" );\n\treturn &([self description] | reformat);\n}\n@end\n\n#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED\n@interface UISwitch(OOExtras)\n@end\n@implementation UISwitch(OOExtras)\n- (NSString *)text { return self.on ? @\"1\" : @\"0\"; }\n@end\n#endif\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-J/AppController.j",
    "content": "//\n// AppController.j\n// FlickrPhoto\n//\n// Created by Ross Boucher.\n// Copyright 2008 - 2010, 280 North, Inc. All rights reserved.\n\n@import <Foundation/Foundation.j>\n@import <AppKit/AppKit.j>\n\nvar SliderToolbarItemIdentifier = \"SliderToolbarItemIdentifier\",\n    AddToolbarItemIdentifier = \"AddToolbarItemIdentifier\",\n    RemoveToolbarItemIdentifier = \"RemoveToolbarItemIdentifier\";\n\n/*\n    Important note about CPJSONPConnection: CPJSONPConnection is ONLY for JSONP APIs.\n    If aren't sure you NEED JSONP (see http://ajaxian.com/archives/jsonp-json-with-padding ),\n    you most likely don't want to use CPJSONPConnection, but rather the more standard\n    CPURLConnection. CPJSONPConnection is designed for cross-domain\n    connections, and if you are making requests to the same domain (as most web\n    applications do), you do not need it.\n*/\n\n@implementation AppController : CPObject\n{\n    CPString                lastIdentifier;\n    CPDictionary            photosets;\n\n    CPCollectionView        listCollectionView;\n    CPCollectionView        photosCollectionView;\n}\n\n- (void)applicationDidFinishLaunching:(CPNotification)aNotification\n{\n    //the first thing we need to do is create a window to take up the full screen\n    //we'll also create a toolbar to go with it, and grab its size for future reference\n\n    var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],\n        contentView = [theWindow contentView],\n        toolbar = [[CPToolbar alloc] initWithIdentifier:\"Photos\"],\n        bounds = [contentView bounds];\n\n    //we tell the toolbar that we want to be its delegate and attach it to theWindow\n    [toolbar setDelegate:self];\n    [toolbar setVisible:true];\n    [theWindow setToolbar:toolbar];\n\n    photosets = [CPDictionary dictionary]; //storage for our sets of photos return from Flickr\n\n    //now we create a scroll view to contain the list of collections of photos (photosets)\n    //inside the scroll view, we'll place our collection view, which manages a collection of \"cells\"\n    //each cell will represent one photo collection, and choosing cells will select that collection\n\n    var listScrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0, 0, 200, CGRectGetHeight(bounds) - 58)];\n    [listScrollView setAutohidesScrollers:YES];\n    [listScrollView setAutoresizingMask:CPViewHeightSizable];\n    [[listScrollView contentView] setBackgroundColor:[CPColor colorWithRed:213.0 / 255.0 green:221.0 / 255.0 blue:230.0 / 255.0 alpha:1.0]];\n\n    //we create the collection view cells by creating a single prototype (CPCollectionViewItem) and setting its view.\n    //the CPCollectionView class will then duplicate this item as many times as it needs\n\n    var photosListItem = [[CPCollectionViewItem alloc] init];\n    [photosListItem setView:[[PhotosListCell alloc] initWithFrame:CGRectMakeZero()]];\n\n    listCollectionView = [[CPCollectionView alloc] initWithFrame:CGRectMake(0, 0, 200, 0)];\n\n    [listCollectionView setDelegate:self]; //we want delegate methods\n    [listCollectionView setItemPrototype:photosListItem]; //set the item prototype\n\n    [listCollectionView setMinItemSize:CGSizeMake(20.0, 45.0)];\n    [listCollectionView setMaxItemSize:CGSizeMake(1000.0, 45.0)];\n    [listCollectionView setMaxNumberOfColumns:1]; //setting a single column will make this appear as a vertical list\n\n    [listCollectionView setVerticalMargin:0.0];\n    [listCollectionView setAutoresizingMask:CPViewWidthSizable];\n\n    //finally, we put our collection view inside the scroll view as it's document view, so it can be scrolled\n    [listScrollView setDocumentView:listCollectionView];\n\n    //and we add it to the window's content view, so it will show up on the screen\n    [contentView addSubview:listScrollView];\n\n    //repeat the process with another collection view for the actual photos\n    //this time we'll use a different view for the prototype (PhotoCell)\n\n    var photoItem = [[CPCollectionViewItem alloc] init];\n    [photoItem setView:[[PhotoCell alloc] initWithFrame:CGRectMake(0, 0, 150, 150)]];\n\n    var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(200, 0, CGRectGetWidth(bounds) - 200, CGRectGetHeight(bounds) - 58)];\n\n    photosCollectionView = [[CPCollectionView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(bounds) - 200, 0)];\n\n    [photosCollectionView setDelegate:self];\n    [photosCollectionView setItemPrototype:photoItem];\n\n    [photosCollectionView setMinItemSize:CGSizeMake(150, 150)];\n    [photosCollectionView setMaxItemSize:CGSizeMake(150, 150)];\n    [photosCollectionView setAutoresizingMask:CPViewWidthSizable];\n\n    [scrollView setAutoresizingMask:CPViewHeightSizable | CPViewWidthSizable];\n    [scrollView setDocumentView:photosCollectionView];\n    [scrollView setAutohidesScrollers:YES];\n\n    [[scrollView contentView] setBackgroundColor:[CPColor colorWithCalibratedWhite:0.25 alpha:1.0]];\n\n    [contentView addSubview:scrollView];\n\n    //bring forward the window to display it\n    [theWindow orderFront:self];\n\n    //get the most interesting photos on flickr\n    var request = [CPURLRequest requestWithURL:\"http://www.flickr.com/services/rest/?method=flickr.interestingness.getList&per_page=20&format=json&api_key=ca4dd89d3dfaeaf075144c3fdec76756\"];\n\n    // see important note about CPJSONPConnection above\n    var connection = [CPJSONPConnection sendRequest:request callback:\"jsoncallback\" delegate:self];\n\n    lastIdentifier = \"Interesting Photos\";\n}\n\n- (void)add:(id)sender\n{\n    var string = prompt(\"Enter a tag to search Flickr for photos.\");\n\n    if (string)\n    {\n        //create a new request for the photos with the tag returned from the javascript prompt\n        var request = [CPURLRequest requestWithURL:\"http://www.flickr.com/services/rest/?\"+\n                                                    \"method=flickr.photos.search&tags=\"+encodeURIComponent(string)+\n                                                    \"&media=photos&machine_tag_mode=any&per_page=20&format=json&api_key=ca4dd89d3dfaeaf075144c3fdec76756\"];\n\n        // see important note about CPJSONPConnection above\n        [CPJSONPConnection sendRequest:request callback:\"jsoncallback\" delegate:self];\n\n        lastIdentifier = string;\n    }\n}\n\n- (void)remove:(id)sender\n{\n    //remove this photo\n    [self removeImageListWithIdentifier:[[photosets allKeys] objectAtIndex:[[listCollectionView selectionIndexes] firstIndex]]];\n}\n\n- (void)addImageList:(CPArray)images withIdentifier:(CPString)aString\n{\n    [photosets setObject:images forKey:aString];\n\n    [listCollectionView setContent:[[photosets allKeys] copy]];\n    [listCollectionView setSelectionIndexes:[CPIndexSet indexSetWithIndex:[[photosets allKeys] indexOfObject:aString]]];\n}\n\n- (void)removeImageListWithIdentifier:(CPString)aString\n{\n    var nextIndex = MAX([[listCollectionView content] indexOfObject:aString] - 1, 0);\n\n    [photosets removeObjectForKey:aString];\n\n    [listCollectionView setContent:[[photosets allKeys] copy]];\n    [listCollectionView setSelectionIndexes:[CPIndexSet indexSetWithIndex:nextIndex]];\n}\n\n- (void)adjustImageSize:(id)sender\n{\n    var newSize = [sender value];\n\n    [photosCollectionView setMinItemSize:CGSizeMake(newSize, newSize)];\n    [photosCollectionView setMaxItemSize:CGSizeMake(newSize, newSize)];\n}\n\n- (void)collectionViewDidChangeSelection:(CPCollectionView)aCollectionView\n{\n    if (aCollectionView == listCollectionView)\n    {\n        var listIndex = [[listCollectionView selectionIndexes] firstIndex];\n\n        if (listIndex === CPNotFound)\n            return;\n\n        var key = [listCollectionView content][listIndex];\n\n        [photosCollectionView setContent:[photosets objectForKey:key]];\n        [photosCollectionView setSelectionIndexes:[CPIndexSet indexSet]];\n    }\n}\n\n- (void)connection:(CPJSONPConnection)aConnection didReceiveData:(CPString)data\n{\n    //this method is called when the network request returns. the data is the returned\n    //information from flickr. we set the array of photo urls as the data to our collection view\n\n    [self addImageList:data.photos.photo withIdentifier:lastIdentifier];\n}\n\n- (void)connection:(CPJSONPConnection)aConnection didFailWithError:(CPString)error\n{\n    alert(error); //a network error occurred\n}\n\n//these two methods are the toolbar delegate methods, and tell the toolbar what it should display to the user\n\n- (CPArray)toolbarAllowedItemIdentifiers:(CPToolbar)aToolbar\n{\n   return [self toolbarDefaultItemIdentifiers:aToolbar];\n}\n\n- (CPArray)toolbarDefaultItemIdentifiers:(CPToolbar)aToolbar\n{\n   return [AddToolbarItemIdentifier, RemoveToolbarItemIdentifier, CPToolbarFlexibleSpaceItemIdentifier, SliderToolbarItemIdentifier];\n}\n\n//this delegate method returns the actual toolbar item for the given identifier\n\n- (CPToolbarItem)toolbar:(CPToolbar)aToolbar itemForItemIdentifier:(CPString)anItemIdentifier willBeInsertedIntoToolbar:(BOOL)aFlag\n{\n    var toolbarItem = [[CPToolbarItem alloc] initWithItemIdentifier:anItemIdentifier];\n\n    if (anItemIdentifier == SliderToolbarItemIdentifier)\n    {\n        [toolbarItem setView:[[PhotoResizeView alloc] initWithFrame:CGRectMake(0, 0, 180, 32)]];\n        [toolbarItem setMinSize:CGSizeMake(180, 32)];\n        [toolbarItem setMaxSize:CGSizeMake(180, 32)];\n        [toolbarItem setLabel:\"Scale\"];\n    }\n    else if (anItemIdentifier == AddToolbarItemIdentifier)\n    {\n        var image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:\"add.png\"] size:CPSizeMake(30, 25)],\n            highlighted = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:\"addHighlighted.png\"] size:CPSizeMake(30, 25)];\n\n        [toolbarItem setImage:image];\n        [toolbarItem setAlternateImage:highlighted];\n\n        [toolbarItem setTarget:self];\n        [toolbarItem setAction:@selector(add:)];\n        [toolbarItem setLabel:\"Add Photo List\"];\n\n        [toolbarItem setMinSize:CGSizeMake(32, 32)];\n        [toolbarItem setMaxSize:CGSizeMake(32, 32)];\n    }\n    else if (anItemIdentifier == RemoveToolbarItemIdentifier)\n    {\n        var image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:\"remove.png\"] size:CPSizeMake(30, 25)],\n            highlighted = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:\"removeHighlighted.png\"] size:CPSizeMake(30, 25)];\n\n        [toolbarItem setImage:image];\n        [toolbarItem setAlternateImage:highlighted];\n\n        [toolbarItem setTarget:self];\n        [toolbarItem setAction:@selector(remove:)];\n        [toolbarItem setLabel:\"Remove Photo List\"];\n\n        [toolbarItem setMinSize:CGSizeMake(32, 32)];\n        [toolbarItem setMaxSize:CGSizeMake(32, 32)];\n    }\n\n    return toolbarItem;\n}\n\n@end\n\n/*\n    This code demonstrates how to add a category to an existing class.\n    In this case, we are adding the class method +flickr_labelWithText: to\n    the CPTextField class. Later on, we can call [CPTextField flickr_labelWithText:\"foo\"]\n    to return a new text field with the string foo.\n    Best practices suggest prefixing category methods with your unique prefix, to prevent collisions.\n*/\n\n@implementation CPTextField (CreateLabel)\n\n+ (CPTextField)flickr_labelWithText:(CPString)aString\n{\n    var label = [[CPTextField alloc] initWithFrame:CGRectMakeZero()];\n\n    [label setStringValue:aString];\n    [label sizeToFit];\n    [label setTextShadowColor:[CPColor whiteColor]];\n    [label setTextShadowOffset:CGSizeMake(0, 1)];\n\n    return label;\n}\n\n@end\n\n// This class wraps our slider + labels combo\n\n@implementation PhotoResizeView : CPView\n{\n}\n\n- (id)initWithFrame:(CGRect)aFrame\n{\n    self = [super initWithFrame:aFrame];\n\n    var slider = [[CPSlider alloc] initWithFrame:CGRectMake(30, CGRectGetHeight(aFrame) / 2.0 - 8, CGRectGetWidth(aFrame) - 65, 24)];\n\n    [slider setMinValue:50.0];\n    [slider setMaxValue:250.0];\n    [slider setIntValue:150.0];\n    [slider setAction:@selector(adjustImageSize:)];\n\n    [self addSubview:slider];\n\n    var label = [CPTextField flickr_labelWithText:\"50\"];\n    [label setFrameOrigin:CGPointMake(0, CGRectGetHeight(aFrame) / 2.0 - 4.0)];\n    [self addSubview:label];\n\n    label = [CPTextField flickr_labelWithText:\"250\"];\n    [label setFrameOrigin:CGPointMake(CGRectGetWidth(aFrame) - CGRectGetWidth([label frame]), CGRectGetHeight(aFrame) / 2.0 - 4.0)];\n    [self addSubview:label];\n\n    return self;\n}\n\n@end\n\n// This class displays a single photo collection inside our list of photo collecitions\n\n@implementation PhotosListCell : CPView\n{\n    CPTextField     label;\n    CPView          highlightView;\n}\n\n- (void)setRepresentedObject:(JSObject)anObject\n{\n    if (!label)\n    {\n        label = [[CPTextField alloc] initWithFrame:CGRectInset([self bounds], 4, 4)];\n\n        [label setFont:[CPFont systemFontOfSize:16.0]];\n        [label setTextShadowColor:[CPColor whiteColor]];\n        [label setTextShadowOffset:CGSizeMake(0, 1)];\n\n        [self addSubview:label];\n    }\n\n    [label setStringValue:anObject];\n    [label sizeToFit];\n\n    [label setFrameOrigin:CGPointMake(10,CGRectGetHeight([label bounds]) / 2.0)];\n}\n\n- (void)setSelected:(BOOL)flag\n{\n    if (!highlightView)\n    {\n        highlightView = [[CPView alloc] initWithFrame:CGRectCreateCopy([self bounds])];\n        [highlightView setBackgroundColor:[CPColor blueColor]];\n    }\n\n    if (flag)\n    {\n        [self addSubview:highlightView positioned:CPWindowBelow relativeTo:label];\n        [label setTextColor:[CPColor whiteColor]];\n        [label setTextShadowColor:[CPColor blackColor]];\n    }\n    else\n    {\n        [highlightView removeFromSuperview];\n        [label setTextColor:[CPColor blackColor]];\n        [label setTextShadowColor:[CPColor whiteColor]];\n    }\n}\n\n@end\n\n// This class displays a single photo from our collection\n\n@implementation PhotoCell : CPView\n{\n    CPImage         image;\n    CPImageView     imageView;\n    CPView          highlightView;\n}\n\n- (void)setRepresentedObject:(JSObject)anObject\n{\n    if (!imageView)\n    {\n        imageView = [[CPImageView alloc] initWithFrame:CGRectMakeCopy([self bounds])];\n        [imageView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];\n        [imageView setImageScaling:CPScaleProportionally];\n        [imageView setHasShadow:YES];\n        [self addSubview:imageView];\n    }\n\n    [image setDelegate:nil];\n\n    image = [[CPImage alloc] initWithContentsOfFile:thumbForFlickrPhoto(anObject)];\n\n    [image setDelegate:self];\n\n    if ([image loadStatus] == CPImageLoadStatusCompleted)\n        [imageView setImage:image];\n    else\n        [imageView setImage:nil];\n}\n\n- (void)imageDidLoad:(CPImage)anImage\n{\n    [imageView setImage:anImage];\n}\n\n- (void)setSelected:(BOOL)flag\n{\n    if (!highlightView)\n    {\n        highlightView = [[CPView alloc] initWithFrame:[self bounds]];\n        [highlightView setBackgroundColor:[CPColor colorWithCalibratedWhite:0.8 alpha:0.6]];\n        [highlightView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];\n    }\n\n    if (flag)\n    {\n        [highlightView setFrame:[self bounds]];\n        [self addSubview:highlightView positioned:CPWindowBelow relativeTo:imageView];\n    }\n    else\n        [highlightView removeFromSuperview];\n}\n\n@end\n\n// helper javascript functions for turning a Flickr photo object into a URL for getting the image\n\nfunction urlForFlickrPhoto(photo)\n{\n    return \"http://farm\" + photo.farm + \".static.flickr.com/\" + photo.server + \"/\" + photo.id+\"_\" + photo.secret + \".jpg\";\n}\n\nfunction thumbForFlickrPhoto(photo)\n{\n    return \"http://farm\" + photo.farm + \".static.flickr.com/\" + photo.server + \"/\" + photo.id + \"_\" + photo.secret + \"_m.jpg\";\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-J/LightsOff.j",
    "content": "@import <Foundation/CPObject.j>\n@import <AppKit/CPView.j>\n@import <AppKit/CPButton.j>\n@import <AppKit/CPWebView.j>\n@import \"LOBoard.j\"\n\n@implementation LOInfoView : CPView\n{\n}\n\n- (void)drawRect:(CGRect)r\n{\n    [[CPColor whiteColor] setFill]\n    var path = [CPBezierPath bezierPath];\n    [path appendBezierPathWithRoundedRect:CGRectMake(5, 0, CGRectGetWidth([self bounds]) - 10.0, CGRectGetHeight([self bounds])) xRadius:10 yRadius:10];\n    [path fill];\n}\n\n@end\n\n@implementation AppController : CPObject\n{\n}\n\n- (CPPanel)initInfoWindow\n{\n    var infoWindow = [[CPPanel alloc] initWithContentRect:CGRectMake(400, 50, 320, 480) styleMask:CPHUDBackgroundWindowMask | CPResizableWindowMask];\n    [infoWindow setFloatingPanel:YES];\n\n    var _infoContent = [infoWindow contentView],\n        _iconImage = [[CPImage alloc] initWithContentsOfFile:\"Resources/icon.png\" size:CPSizeMake(59, 60)],\n        _iconView = [[CPImageView alloc] initWithFrame:CGRectMake(125, 0, 59, 60)];\n\n    [_iconView setImage:_iconImage];\n    [_infoContent addSubview:_iconView];\n\n    var _infoView = [[LOInfoView alloc] initWithFrame:CGRectMake(0, 65, 320, 395)],\n        _webView = [[CPWebView alloc] initWithFrame:CGRectMake(20, 0, 270, 370)];\n\n    [_webView loadHTMLString:@\"<center><h3>Lights Off</h3></center> <p>Lights Off is a fantastic game exclusively for iPhone and iPod touch and inspired by Tiger Electronic's 'Lights Out'.</p> <p>The goal of the game is simply to switch all of the lights off, but it's harder than it looks! Give the first few levels a try in the playable demo to the left.</p><center><img src='Resources/avail_on_app_store.png'></center>\"];\n\n    [_infoView addSubview:_webView];\n\n    [_infoContent addSubview:_infoView];\n\n    return infoWindow;\n}\n\n- (void)applicationDidFinishLaunching:(CPNotification)aNotification\n{\n    /* Enable Logging (DEBUG) */\n    // CPLogRegister(CPLogPopup);\n\n    var rootWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask];\n    [rootWindow setBackgroundColor:[CPColor grayColor]];\n    [rootWindow orderFront:self];\n\n    var infoWindow = [self initInfoWindow],\n        gameWindow = [[CPPanel alloc] initWithContentRect:CGRectMake(50, 50, 324, 482) styleMask:CPHUDBackgroundWindowMask];\n    [gameWindow setFloatingPanel:YES];\n    [gameWindow setTitle:@\"Lights Off\"];\n\n    contentView = [gameWindow contentView];\n\n    var _board = [[LOBoard alloc] initWithFrame:CGRectMake(2, 0, 320, 480)],\n        _bgImage = [[CPImage alloc] initWithContentsOfFile:\"Resources/lo-background.png\" size:CPSizeMake(320, 480)];\n    [_board setImage:_bgImage];\n    [_board resetBoard];\n\n    var _buttonImage = [[CPImage alloc] initWithContentsOfFile:\"Resources/button-reset.png\" size:CPSizeMake(90, 28)],\n        _buttonPressImage = [[CPImage alloc] initWithContentsOfFile:\"Resources/button-reset-press.png\" size:CPSizeMake(90, 28)],\n        _resetButton = [[CPButton alloc] initWithFrame:CGRectMake(195, 422, 90, 28)];\n\n    [_resetButton setImage:_buttonImage];\n    [_resetButton setAlternateImage:_buttonPressImage];\n    [_resetButton setBordered:NO];\n\n    [contentView addSubview:_board];\n    [contentView addSubview:_resetButton];\n\n    [_resetButton setTarget:_board];\n    [_resetButton setAction:@selector(resetBoard)];\n\n    [gameWindow orderFront:self];\n    [infoWindow orderFront:self];\n}\n\n@end"
  },
  {
    "path": "src/test/resources/samples/langs/Objective-J/iTunesLayout.j",
    "content": "\n@import <Foundation/CPObject.j>\n\n\n@implementation AppController : CPObject\n{\n}\n\n- (void)applicationDidFinishLaunching:(CPNotification)aNotification\n{\n    // The end result of this layout will be the kind of master/detail/auxilliary view\n    // found in iTunes, Mail, and many other apps.\n\n    var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],\n        contentView = [theWindow contentView];\n\n    var navigationArea = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 150.0, CGRectGetHeight([contentView bounds]) - 150.0)];\n\n    [navigationArea setBackgroundColor:[CPColor redColor]];\n\n    // This view will grow in height, but stay fixed width attached to the left side of the screen.\n    [navigationArea setAutoresizingMask:CPViewHeightSizable | CPViewMaxXMargin];\n\n    [contentView addSubview:navigationArea];\n\n    var metaDataArea = [[CPView alloc] initWithFrame:CGRectMake(0.0, CGRectGetMaxY([navigationArea frame]), 150.0, 150.0)];\n\n    [metaDataArea setBackgroundColor:[CPColor greenColor]];\n\n    // This view will stay the same size in both directions, and fixed to the lower left corner.\n    [metaDataArea setAutoresizingMask:CPViewMinYMargin | CPViewMaxXMargin];\n\n    [contentView addSubview:metaDataArea];\n\n    var contentArea = [[CPView alloc] initWithFrame:CGRectMake(150.0, 0.0, CGRectGetWidth([contentView bounds]) - 150.0, CGRectGetHeight([contentView bounds]))];\n\n    [contentArea setBackgroundColor:[CPColor blueColor]];\n\n    // This view will grow in both height an width.\n    [contentArea setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];\n\n    [contentView addSubview:contentArea];\n\n    [theWindow orderFront:self];\n}\n\n@end"
  },
  {
    "path": "src/test/resources/samples/langs/Omgrofl/hello.omgrofl",
    "content": "lol iz 71\nwtf lol iz liek 71\n    lmao lol\nbrb\nw00t Hello, World!\nrofl lol\nlol iz 101\nrofl lol\nlol iz 108\nrofl lol\nrofl lol\nlool iz 111\nrofl lool\nloool iz 44\nrofl loool\nloool iz 32\nrofl loool\nloool iz 87\nrofl loool\nrofl lool\nlool iz 114\nrofl lool\nrofl lol\nlol iz 100\nrofl lol\nlol iz 33\nrofl lol\nstfu\n"
  },
  {
    "path": "src/test/resources/samples/langs/Opa/hello_syntax1.opa",
    "content": "/**\n * To compile & run on port 8080:\n * opa hello_syntax1.opa --\n */\nserver = Server.one_page_server(\n   \"Hello, world\",\n   -> (<h1>Hello, world</h1>)\n)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Opa/hello_syntax2.opa",
    "content": "/**\n * To compile & run on port 8080:\n * opa --parser js-like hello_syntax2.opa --\n */\nServer.start(\n   Server.http,\n   {\n     page: function() { <h1>Hello, world</h1> },\n     title: \"Hello, world\"\n   }\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Opal/DeepakChopra.opal",
    "content": "-- Deepak Chopra nonsense text generator\n-- see https://github.com/StoneCypher/DeepakChopra_Opal/\n\nstarts = [\"Experiential truth \", \"The physical world \", \"Non-judgment \", \"Quantum physics \"]\nmiddles = [\"nurtures an \", \"projects onto \", \"imparts reality to \", \"constructs with \"]\nqualifiers = [\"abundance of \", \"the barrier of \", \"self-righteous \", \"potential \"]\nfinishes = [\"marvel.\", \"choices.\", \"creativity.\", \"actions.\"]\n\nalert starts.sample + middles.sample + qualifiers.sample + finishes.sample"
  },
  {
    "path": "src/test/resources/samples/langs/OpenCL/fft.cl",
    "content": "double run_fftw(int n,const float * x,float * y)\n{\n  fftwf_plan p1 = fftwf_plan_dft_1d(n,(fftwf_complex *)x,(fftwf_complex *)y,\n                      FFTW_FORWARD,FFTW_ESTIMATE);\n  const int nops = 10;\n  double t = cl::realTime();\n  for (int op = 0;op < nops;op++) {\n    fftwf_execute(p1);\n  }\n  t = (cl::realTime() - t)/(double)nops;\n  fftwf_destroy_plan(p1);\n  return t;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/OpenCL/sample.cl",
    "content": "/* Old-style comment. */\n\n// New-style comment.\n\ntypedef float foo_t;\n\n#ifndef ZERO\n#define ZERO (0.0)\n#endif\n\n#define FOO(x) ((x) + \\\n  ZERO)\n\n__kernel\nvoid foo(__global const foo_t * x, __local foo_t y, const uint n)\n{\n  barrier(CLK_LOCAL_MEM_FENCE);\n\n  if (n > 42) {\n    *x += y;\n  }\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/OpenEdge ABL/Email.cls",
    "content": "\n /*------------------------------------------------------------------------\n    File        : Email\n    Purpose     : Abstraction of an Email message\n    Description : Holds information needed for an email message - senders,\n                  recipients, subject, a message body, attachment files, and\n                  other extra information such as importance, priority,\n                  sensitivity, custom reply-to addresses, delivery receipts,\n                  read receipts, custom sent date, reply-by date, and expire date.\n    Author(s)   : Abe Voelker\n    Created     : Sat Jul 17 16:27:05 CDT 2010\n  ----------------------------------------------------------------------*/\n\nUSING Progress.Lang.*.\n\n\nCLASS email.Email  USE-WIDGET-POOL:\n\n    &SCOPED-DEFINE QUOTES                \"\"\"\"\n    &SCOPED-DEFINE CR                    CHR(13)\n    &SCOPED-DEFINE LF                    CHR(10)\n    &SCOPED-DEFINE DEFAULT_MIME_BOUNDARY \"!@#$%^&*+-._MIME_BOUNDARY_.-+*&^%$#@!\"\n\n    /*------------------------------------------------------------------------------\n            Purpose:\n            Notes:\n    ------------------------------------------------------------------------------*/\n\n    DEFINE PRIVATE VARIABLE objSendEmailAlgorithm AS email.SendEmailAlgorithm NO-UNDO.\n\n    DEFINE PRIVATE TEMP-TABLE ttSenders NO-UNDO\n      FIELD cEmailAddress AS CHARACTER\n      FIELD cRealName     AS CHARACTER INITIAL ?\n      INDEX IXPK_ttSenders cEmailAddress.\n\n    DEFINE PRIVATE TEMP-TABLE ttToRecipients NO-UNDO\n      FIELD cEmailAddress AS CHARACTER\n      FIELD cRealName     AS CHARACTER INITIAL ?\n      INDEX IXPK_ttToRecipients cEmailAddress.\n\n    DEFINE PRIVATE TEMP-TABLE ttCCRecipients NO-UNDO\n      FIELD cEmailAddress AS CHARACTER\n      FIELD cRealName     AS CHARACTER INITIAL ?\n      INDEX IXPK_ttCCRecipients cEmailAddress.\n\n    DEFINE PRIVATE TEMP-TABLE ttBCCRecipients NO-UNDO\n      FIELD cEmailAddress AS CHARACTER\n      FIELD cRealName     AS CHARACTER INITIAL ?\n      INDEX IXPK_ttBCCRecipients cEmailAddress.\n\n    DEFINE PRIVATE TEMP-TABLE ttReplyToRecipients NO-UNDO\n      FIELD cEmailAddress AS CHARACTER\n      FIELD cRealName     AS CHARACTER INITIAL ?\n      INDEX IXPK_ttReplyToRecipients cEmailAddress.\n\n    DEFINE PRIVATE TEMP-TABLE ttReadReceiptRecipients NO-UNDO\n      FIELD cEmailAddress AS CHARACTER\n      FIELD cRealName     AS CHARACTER INITIAL ?\n      INDEX IXPK_ttReadReceiptRecipients cEmailAddress.\n\n    DEFINE PRIVATE TEMP-TABLE ttDeliveryReceiptRecipients NO-UNDO\n      FIELD cEmailAddress AS CHARACTER\n      FIELD cRealName     AS CHARACTER INITIAL ?\n      INDEX IXPK_ttDeliveryReceiptRecipients cEmailAddress.\n\n    DEFINE PRIVATE TEMP-TABLE ttAttachments NO-UNDO\n      FIELD cFileName     AS CHARACTER\n      FIELD lcData        AS Object    /* Longchar object */\n      FIELD lBase64Encode AS LOGICAL.\n\n    DEFINE PRIVATE VARIABLE cMimeBoundary     AS CHARACTER   NO-UNDO.\n    DEFINE PRIVATE VARIABLE lcBody            AS LONGCHAR    NO-UNDO.\n    DEFINE PRIVATE VARIABLE lBodyIsBase64     AS LOGICAL     NO-UNDO.\n    DEFINE PRIVATE VARIABLE cSubject          AS CHARACTER   NO-UNDO.\n    DEFINE PRIVATE VARIABLE mptrAttachments   AS MEMPTR      NO-UNDO.\n    DEFINE PRIVATE VARIABLE cImportance       AS CHARACTER   NO-UNDO.\n    DEFINE PRIVATE VARIABLE cSensitivity      AS CHARACTER   NO-UNDO.\n    DEFINE PRIVATE VARIABLE cPriority         AS CHARACTER   NO-UNDO.\n    DEFINE PRIVATE VARIABLE dttmtzSentDate    AS DATETIME-TZ INITIAL ? NO-UNDO.\n    DEFINE PRIVATE VARIABLE dttmtzReplyByDate AS DATETIME-TZ INITIAL ? NO-UNDO.\n    DEFINE PRIVATE VARIABLE dttmtzExpireDate  AS DATETIME-TZ INITIAL ? NO-UNDO.\n\n    DEFINE PRIVATE VARIABLE cNewLine          AS CHARACTER   NO-UNDO.\n\n    /* Other email headers: */\n\n    CONSTRUCTOR PUBLIC Email (INPUT ipobjSendEmailAlgorithm AS email.SendEmailAlgorithm):\n        SUPER ().\n        ASSIGN objSendEmailAlgorithm = ipobjSendEmailAlgorithm\n               cMimeBoundary         = {&DEFAULT_MIME_BOUNDARY}\n               lBodyIsBase64         = TRUE.\n        IF (OPSYS BEGINS \"WIN\") THEN\n            ASSIGN cNewLine          = {&CR} + {&LF}.\n        ELSE\n            ASSIGN cNewLine          = {&LF}.\n    END CONSTRUCTOR.\n\n    DESTRUCTOR PUBLIC Email ():\n        FOR EACH ttAttachments:\n            IF VALID-OBJECT(ttAttachments.lcData) THEN\n                DELETE OBJECT ttAttachments.lcData NO-ERROR.\n        END. /* FOR EACH ttAttachments */\n    END DESTRUCTOR.\n\n    /* Add a sender (\"From:\" address) to the email */\n    METHOD PUBLIC VOID addSender(INPUT ipcEmailAddress AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttSenders\n                        WHERE ttSenders.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttSenders.\n            ASSIGN ttSenders.cEmailAddress = ipcEmailAddress.\n        END.\n    END METHOD.\n\n    /* Add a sender (\"From:\" address) (with Real Name) to the email */\n    METHOD PUBLIC VOID addSender(INPUT ipcEmailAddress AS CHARACTER,\n                                 INPUT ipcRealName     AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttSenders\n                        WHERE ttSenders.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttSenders.\n            ASSIGN ttSenders.cEmailAddress = ipcEmailAddress\n                   ttSenders.cRealName     = ipcRealName.\n        END.\n    END METHOD.\n\n    /* Add a \"To:\" recipient to the email */\n    METHOD PUBLIC VOID addToRecipient(INPUT ipcEmailAddress AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttToRecipients\n                        WHERE ttToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttToRecipients.\n            ASSIGN ttToRecipients.cEmailAddress = ipcEmailAddress.\n        END.\n    END METHOD.\n\n    /* Add a \"To:\" recipient (with Real Name) to the email */\n    METHOD PUBLIC VOID addToRecipient(INPUT ipcEmailAddress AS CHARACTER,\n                                      INPUT ipcRealName     AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttToRecipients\n                        WHERE ttToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttToRecipients.\n            ASSIGN ttToRecipients.cEmailAddress = ipcEmailAddress\n                   ttToRecipients.cRealName     = ipcRealName.\n        END.\n    END METHOD.\n\n    /* Add a \"CC:\" recipient to the email */\n    METHOD PUBLIC VOID addCCRecipient(INPUT ipcEmailAddress AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttCCRecipients\n                        WHERE ttCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttCCRecipients.\n            ASSIGN ttCCRecipients.cEmailAddress = ipcEmailAddress.\n        END.\n    END METHOD.\n\n    /* Add a \"CC:\" recipient (with Real Name) to the email */\n    METHOD PUBLIC VOID addCCRecipient(INPUT ipcEmailAddress AS CHARACTER,\n                                      INPUT ipcRealName     AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttCCRecipients\n                        WHERE ttCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttCCRecipients.\n            ASSIGN ttCCRecipients.cEmailAddress = ipcEmailAddress\n                   ttToRecipients.cRealName     = ipcRealName.\n        END.\n    END METHOD.\n\n    /* Add a \"BCC:\" recipient to the email */\n    METHOD PUBLIC VOID addBCCRecipient(INPUT ipcEmailAddress AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttBCCRecipients\n                        WHERE ttBCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttBCCRecipients.\n            ASSIGN ttBCCRecipients.cEmailAddress = ipcEmailAddress.\n        END.\n    END METHOD.\n\n    /* Add a \"BCC:\" recipient (with Real Name) to the email */\n    METHOD PUBLIC VOID addBCCRecipient(INPUT ipcEmailAddress AS CHARACTER,\n                                       INPUT ipcRealName     AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttBCCRecipients\n                        WHERE ttBCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttBCCRecipients.\n            ASSIGN ttBCCRecipients.cEmailAddress = ipcEmailAddress\n                   ttToRecipients.cRealName      = ipcRealName.\n        END.\n    END METHOD.\n\n    /* Add a reply-to recipient to the email */\n    METHOD PUBLIC VOID addReplyToRecipient(INPUT ipcEmailAddress AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttReplyToRecipients\n                        WHERE ttReplyToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttReplyToRecipients.\n            ASSIGN ttReplyToRecipients.cEmailAddress = ipcEmailAddress.\n        END.\n    END METHOD.\n\n    /* Add a  reply-to recipient (with Real Name) to the email */\n    METHOD PUBLIC VOID addReplyToRecipient(INPUT ipcEmailAddress AS CHARACTER,\n                                           INPUT ipcRealName     AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttReplyToRecipients\n                        WHERE ttReplyToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttReplyToRecipients.\n            ASSIGN ttReplyToRecipients.cEmailAddress = ipcEmailAddress\n                   ttReplyToRecipients.cRealName     = ipcRealName.\n        END.\n    END METHOD.\n\n    /* Add a delivery receipt recipient to the email */\n    METHOD PUBLIC VOID addDeliveryReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttDeliveryReceiptRecipients\n                        WHERE ttDeliveryReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttDeliveryReceiptRecipients.\n            ASSIGN ttDeliveryReceiptRecipients.cEmailAddress = ipcEmailAddress.\n        END.\n    END METHOD.\n\n    /* Add a delivery receipt recipient (with Real Name) to the email */\n    METHOD PUBLIC VOID addDeliveryReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER,\n                                                   INPUT ipcRealName     AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttDeliveryReceiptRecipients\n                        WHERE ttDeliveryReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttDeliveryReceiptRecipients.\n            ASSIGN ttDeliveryReceiptRecipients.cEmailAddress = ipcEmailAddress\n                   ttDeliveryReceiptRecipients.cRealName     = ipcRealName.\n        END.\n    END METHOD.\n\n    /* Add a read receipt recipient to the email */\n    METHOD PUBLIC VOID addReadReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttReadReceiptRecipients\n                        WHERE ttReadReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttReadReceiptRecipients.\n            ASSIGN ttReadReceiptRecipients.cEmailAddress = ipcEmailAddress.\n        END.\n    END METHOD.\n\n    /* Add a read receipt recipient (with Real Name) to the email */\n    METHOD PUBLIC VOID addReadReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER,\n                                               INPUT ipcRealName     AS CHARACTER):\n        IF NOT CAN-FIND(FIRST ttReadReceiptRecipients\n                        WHERE ttReadReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:\n            CREATE ttReadReceiptRecipients.\n            ASSIGN ttReadReceiptRecipients.cEmailAddress = ipcEmailAddress\n                   ttReadReceiptRecipients.cRealName     = ipcRealName.\n        END.\n    END METHOD.\n\n    /* Set the subject of the email */\n    METHOD PUBLIC VOID setSubject(INPUT ipcSubject AS CHARACTER):\n        ASSIGN cSubject = ipcSubject.\n    END METHOD.\n\n    /* Set the importance of the email. H = High, L = Low, anything else = Medium/None */\n    METHOD PUBLIC VOID setImportance(INPUT ipcImportance AS CHARACTER):\n        ASSIGN cImportance = ipcImportance.\n    END METHOD.\n\n    /* Set the sensitivity of the email. */\n    /* Possible values (from RFC 2156): \"Personal\", \"Private\", or \"Company confidential\" (\"Company-confidential\") */\n    METHOD PUBLIC VOID setSensitivity(INPUT ipcSensitivity AS CHARACTER):\n        ASSIGN cSensitivity = ipcSensitivity.\n    END METHOD.\n\n    /* Set the priority of the email (to affect transmission speed and delivery) */\n    /* Possible values (from RFC 2156): \"normal\", \"urgent\", or \"non-urgent\" */\n    METHOD PUBLIC VOID setPriority(INPUT ipcPriority AS CHARACTER):\n        ASSIGN cPriority = ipcPriority.\n    END METHOD.\n\n    /* Set the date/time the email was sent */\n    METHOD PUBLIC VOID setSentDate(INPUT ipdttmtzSentDate AS DATETIME-TZ):\n        ASSIGN dttmtzSentDate = ipdttmtzSentDate.\n    END METHOD.\n\n    /* Set the date/time recipient(s) should reply by */\n    METHOD PUBLIC VOID setReplyByDate(INPUT ipdttmtzReplyByDate AS DATETIME-TZ):\n        ASSIGN dttmtzReplyByDate = ipdttmtzReplyByDate.\n    END METHOD.\n\n    /* Set the date/time the message expires */\n    METHOD PUBLIC VOID setExpireDate(INPUT ipdttmtzExpireDate AS DATETIME-TZ):\n        ASSIGN dttmtzExpireDate = ipdttmtzExpireDate.\n    END METHOD.\n\n    /* If send email algorithm not set in constructor, you must set it using this method before the email can be sent */\n    METHOD PUBLIC VOID setSendEmailAlgorithm(INPUT ipobjSendEmailAlgorithm AS email.SendEmailAlgorithm):\n        ASSIGN objSendEmailAlgorithm = ipobjSendEmailAlgorithm.\n    END METHOD.\n\n    METHOD PUBLIC VOID setBodyText(INPUT ipcBodyText AS CHARACTER):\n        ASSIGN lcBody = ipcBodyText.\n    END METHOD.\n\n    METHOD PUBLIC VOID setBodyText(INPUT iplcBodyText AS LONGCHAR):\n        ASSIGN lcBody = iplcBodyText.\n    END METHOD.\n\n    /* Set the body by reading in an external file */\n    METHOD PUBLIC CHARACTER setBodyFile(INPUT ipcBodyFile AS CHARACTER):\n        FILE-INFO:FILE-NAME = ipcBodyFile.\n        IF FILE-INFO:FULL-PATHNAME EQ ? THEN\n            RETURN \"Cannot locate file '\" + ipcBodyFile + \"' in the filesystem!\".\n        IF INDEX(FILE-INFO:FILE-TYPE, \"R\") EQ 0 THEN\n            RETURN \"File '\" + FILE-INFO:FULL-PATHNAME + \"' exists but is not readable!\".\n        COPY-LOB FROM FILE FILE-INFO:FULL-PATHNAME TO OBJECT lcBody NO-ERROR.\n        IF ERROR-STATUS:ERROR THEN\n            RETURN \"Error copying from file: \" + ERROR-STATUS:GET-MESSAGE(1).\n        RETURN \"\". /* Success */\n    END METHOD.\n\n    /* Body defaults to base64 encoding, but can be manually disabled */\n    METHOD PUBLIC VOID setBodyEncoding(INPUT iplBase64Encode AS LOGICAL):\n        ASSIGN lBodyIsBase64 = iplBase64Encode.\n    END METHOD.\n\n    /* Add a non-encoded file attachment to the email */\n    METHOD PUBLIC CHARACTER addTextAttachment(INPUT ipcFileName AS CHARACTER):\n        DEFINE VARIABLE lcTemp AS LONGCHAR NO-UNDO.\n        FILE-INFO:FILE-NAME = ipcFileName.\n        IF FILE-INFO:FULL-PATHNAME EQ ? THEN\n            RETURN \"Cannot locate file '\" + ipcFileName + \"' in the filesystem!\".\n        IF INDEX(FILE-INFO:FILE-TYPE, \"R\") EQ 0 THEN\n            RETURN \"File '\" + FILE-INFO:FULL-PATHNAME + \"' exists but is not readable!\".\n        /* Load file into memory */\n        COPY-LOB FROM FILE FILE-INFO:FULL-PATHNAME TO OBJECT lcTemp NO-ERROR.\n        IF ERROR-STATUS:ERROR THEN\n            RETURN \"Error copying from file: \" + ERROR-STATUS:GET-MESSAGE(1).\n        CREATE ttAttachments.\n        ASSIGN ttAttachments.cFileName     = ipcFileName\n               ttAttachments.lcData        = NEW email.LongcharWrapper(lcTemp)\n               ttAttachments.lBase64Encode = FALSE.\n        RETURN \"\". /* Success */\n    END.\n\n    /* Add a file attachment to the email; it defaults to base-64 encoding */\n    METHOD PUBLIC CHARACTER addAttachment(INPUT ipcFileName AS CHARACTER):\n        DEFINE VARIABLE lcTemp AS LONGCHAR NO-UNDO.\n        FILE-INFO:FILE-NAME = ipcFileName.\n        IF FILE-INFO:FULL-PATHNAME EQ ? THEN\n            RETURN \"Cannot locate file '\" + ipcFileName + \"' in the filesystem!\".\n        IF INDEX(FILE-INFO:FILE-TYPE, \"R\") EQ 0 THEN\n            RETURN \"File '\" + FILE-INFO:FULL-PATHNAME + \"' exists but is not readable!\".\n        /* Load file into memory */\n        COPY-LOB FROM FILE FILE-INFO:FULL-PATHNAME TO OBJECT lcTemp NO-ERROR.\n        IF ERROR-STATUS:ERROR THEN\n            RETURN \"Error copying from file: \" + ERROR-STATUS:GET-MESSAGE(1).\n        CREATE ttAttachments.\n        ASSIGN ttAttachments.cFileName     = ipcFileName\n               ttAttachments.lcData        = NEW email.LongcharWrapper(EmailClient.Util:ConvertDataToBase64(lcTemp))\n               ttAttachments.lBase64Encode = TRUE.\n        RETURN \"\". /* Success */\n    END.\n\n    /* Override default MIME boundary */\n    METHOD PUBLIC VOID setMimeBoundary(INPUT ipcMimeBoundary AS CHARACTER):\n        ASSIGN cMimeBoundary = ipcMimeBoundary.\n    END METHOD.\n\n    /* Return a concatenated list of To:, CC:, and BCC: recipients */\n    METHOD PUBLIC CHARACTER getRecipients():\n        DEFINE VARIABLE cRecipients AS CHARACTER NO-UNDO.\n\n        FOR EACH ttToRecipients\n          BREAK BY ttToRecipients.cEmailAddress:\n            ASSIGN cRecipients = cRecipients + ttToRecipients.cEmailAddress.\n            IF NOT LAST(ttToRecipients.cEmailAddress) THEN DO:\n                ASSIGN cRecipients = cRecipients + \", \".\n            END.\n        END.\n        FOR EACH ttCCRecipients\n          BREAK BY ttCCRecipients.cEmailAddress:\n            IF FIRST(ttCCRecipients.cEmailAddress) AND\n               cRecipients NE \"\" THEN\n                ASSIGN cRecipients = cRecipients + \", \".\n            ASSIGN cRecipients = cRecipients + ttCCRecipients.cEmailAddress.\n            IF NOT LAST(ttCCRecipients.cEmailAddress) THEN\n                ASSIGN cRecipients = cRecipients + ttCCRecipients.cEmailAddress.\n        END.\n        FOR EACH ttBCCRecipients\n          BREAK BY ttBCCRecipients.cEmailAddress:\n            IF FIRST(ttBCCRecipients.cEmailAddress) AND\n               cRecipients NE \"\" THEN\n                ASSIGN cRecipients = cRecipients + \", \".\n            ASSIGN cRecipients = cRecipients + ttBCCRecipients.cEmailAddress.\n            IF NOT LAST(ttBCCRecipients.cEmailAddress) THEN\n                ASSIGN cRecipients = cRecipients + ttBCCRecipients.cEmailAddress.\n        END.\n        RETURN cRecipients.\n    END METHOD.\n\n    /* Dumps all email message headers to CHAR */\n    METHOD PUBLIC CHARACTER getHeaders():\n        DEFINE VARIABLE cReturnData AS CHARACTER NO-UNDO.\n\n        /* Write the \"From:\" header */\n        ASSIGN cReturnData = cReturnData + {&QUOTES} + \"From:\".\n        FOR EACH ttSenders\n          BREAK BY ttSenders.cEmailAddress:\n            IF ttSenders.cRealName NE ? THEN\n                ASSIGN cReturnData = cReturnData + ttSenders.cRealName + \" <\" + ttSenders.cEmailAddress + \">\".\n            ELSE\n                ASSIGN cReturnData = cReturnData + ttSenders.cEmailAddress.\n            IF NOT LAST(ttSenders.cEmailAddress) THEN\n                ASSIGN cReturnData = cReturnData + \", \".\n        END.\n        ASSIGN cReturnData = cReturnData + {&QUOTES} + \"\\n\".\n        /* Write the \"To:\" header */\n        ASSIGN cReturnData = cReturnData + {&QUOTES} + \"To:\".\n        FOR EACH ttToRecipients\n          BREAK BY ttToRecipients.cEmailAddress:\n            IF ttToRecipients.cRealName NE ? THEN\n                ASSIGN cReturnData = cReturnData + ttToRecipients.cRealName + \" <\" + ttToRecipients.cEmailAddress + \">\".\n            ELSE\n                ASSIGN cReturnData = cReturnData + ttToRecipients.cEmailAddress.\n            IF NOT LAST(ttToRecipients.cEmailAddress) THEN\n                ASSIGN cReturnData = cReturnData + \", \".\n        END.\n        ASSIGN cReturnData = cReturnData + {&QUOTES} + \"\\n\".\n        /* Write the \"Reply-To:\" header */\n        ASSIGN cReturnData = cReturnData + {&QUOTES} + \"Reply-To:\".\n        IF TEMP-TABLE ttReplyToRecipients:HAS-RECORDS THEN DO:\n            /* Use manually-overridden reply-to addresses */\n            FOR EACH ttReplyToRecipients\n              BREAK BY ttReplyToRecipients.cEmailAddress:\n                IF ttReplyToRecipients.cRealName NE ? THEN\n                    ASSIGN cReturnData = cReturnData + ttReplyToRecipients.cRealName + \" <\" + ttReplyToRecipients.cEmailAddress + \">\".\n                ELSE\n                    ASSIGN cReturnData = cReturnData + ttReplyToRecipients.cEmailAddress.\n                IF NOT LAST(ttReplyToRecipients.cEmailAddress) THEN\n                    ASSIGN cReturnData = cReturnData + \", \".\n            END. /* FOR EACH ttReplyToRecipients ... */\n        END. /* IF TEMP-TABLE ttReplyToRecipients:HAS-RECORDS */\n        ELSE DO:\n            /* Write reply-to using sender addresses if reply-to addresses not manually overriddden */\n            FOR EACH ttSenders\n              BREAK BY ttSenders.cEmailAddress:\n                IF ttSenders.cRealName NE ? THEN\n                    ASSIGN cReturnData = cReturnData + ttSenders.cRealName + \" <\" + ttSenders.cEmailAddress + \">\".\n                ELSE\n                    ASSIGN cReturnData = cReturnData + ttSenders.cEmailAddress.\n                IF NOT LAST(ttSenders.cEmailAddress) THEN\n                    ASSIGN cReturnData = cReturnData + \", \".\n            END.\n        END. /* ELSE / IF TEMP-TABLE ttReplyToRecipients:HAS-RECORDS */\n        ASSIGN cReturnData = cReturnData + {&QUOTES} + \"\\n\".\n        /* Write the \"Cc:\" header */\n        ASSIGN cReturnData = cReturnData + {&QUOTES} + \"Cc:\".\n        FOR EACH ttCCRecipients\n          BREAK BY ttCCRecipients.cEmailAddress:\n            IF ttCCRecipients.cRealName NE ? THEN\n                ASSIGN cReturnData = cReturnData + ttCCRecipients.cRealName + \" <\" + ttCCRecipients.cEmailAddress + \">\".\n            ELSE\n                ASSIGN cReturnData = cReturnData + ttCCRecipients.cEmailAddress.\n            IF NOT LAST(ttCCRecipients.cEmailAddress) THEN\n                ASSIGN cReturnData = cReturnData + \", \".\n        END.\n        ASSIGN cReturnData = cReturnData + {&QUOTES} + \"\\n\".\n        /* Write the \"Bcc:\" header */\n        ASSIGN cReturnData = cReturnData + {&QUOTES} + \"Bcc:\".\n        FOR EACH ttBCCRecipients\n          BREAK BY ttBCCRecipients.cEmailAddress:\n            IF ttBCCRecipients.cRealName NE ? THEN\n                ASSIGN cReturnData = cReturnData + ttBCCRecipients.cRealName + \" <\" + ttBCCRecipients.cEmailAddress + \">\".\n            ELSE\n                ASSIGN cReturnData = cReturnData + ttBCCRecipients.cEmailAddress.\n            IF NOT LAST(ttBCCRecipients.cEmailAddress) THEN\n                ASSIGN cReturnData = cReturnData + \", \".\n        END.\n        ASSIGN cReturnData = cReturnData + {&QUOTES} + \"\\n\".\n        /* If delivery recipients specified, write each recipient out */\n        IF TEMP-TABLE ttDeliveryReceiptRecipients:HAS-RECORDS THEN DO:\n            ASSIGN cReturnData = cReturnData + {&QUOTES} + \"Return-Receipt-To:\".\n            FOR EACH ttDeliveryReceiptRecipients\n              BREAK BY ttDeliveryReceiptRecipients.cEmailAddress:\n                IF ttDeliveryReceiptRecipients.cRealName NE ? THEN\n                    ASSIGN cReturnData = cReturnData + ttDeliveryReceiptRecipients.cRealName + \" <\" + ttDeliveryReceiptRecipients.cEmailAddress + \">\".\n                ELSE\n                    ASSIGN cReturnData = cReturnData + ttDeliveryReceiptRecipients.cEmailAddress.\n                IF NOT LAST(ttDeliveryReceiptRecipients.cEmailAddress) THEN\n                    ASSIGN cReturnData = cReturnData + \", \".\n            END. /* FOR EACH ttDeliveryReceiptRecipients */\n            ASSIGN cReturnData = cReturnData + {&QUOTES}.\n        END. /* IF TEMP-TABLE ttDeliveryReceiptRecipients:HAS-RECORDS */\n        /* If read recipients specified, write each recipient out */\n        IF TEMP-TABLE ttReadReceiptRecipients:HAS-RECORDS THEN DO:\n            ASSIGN cReturnData = cReturnData + {&QUOTES} + \"Disposition-Notification-To:\".\n            FOR EACH ttReadReceiptRecipients\n              BREAK BY ttReadReceiptRecipients.cEmailAddress:\n                IF ttReadReceiptRecipients.cRealName NE ? THEN\n                    ASSIGN cReturnData = cReturnData + ttReadReceiptRecipients.cRealName + \" <\" + ttReadReceiptRecipients.cEmailAddress + \">\".\n                ELSE\n                    ASSIGN cReturnData = cReturnData + ttReadReceiptRecipients.cEmailAddress.\n                IF NOT LAST(ttReadReceiptRecipients.cEmailAddress) THEN\n                    ASSIGN cReturnData = cReturnData + \", \".\n            END. /* FOR EACH ttReadReceiptRecipients */\n            ASSIGN cReturnData = cReturnData + {&QUOTES}.\n        END. /* IF TEMP-TABLE ttReadReceiptRecipients:HAS-RECORDS */\n        /* Write the \"Subject:\" header */\n        ASSIGN cReturnData = cReturnData + \"\\n\" + {&QUOTES} + \"Subject:\" + cSubject + {&QUOTES}.\n        /* Write the \"Importance:\" header */\n        IF cImportance BEGINS \"H\" THEN\n            ASSIGN cReturnData = cReturnData + \"\\n\" + {&QUOTES} + \"Importance:High\" + {&QUOTES}.\n        ELSE IF cImportance BEGINS \"L\" THEN\n            ASSIGN cReturnData = cReturnData + \"\\n\" + {&QUOTES} + \"Importance:Low\" + {&QUOTES}.\n        /* Write the \"Sensitivity\" header */\n        IF cSensitivity NE \"\" THEN\n            ASSIGN cReturnData = cReturnData + \"\\n\" + {&QUOTES} + \"Sensitivity:\" + cSensitivity + {&QUOTES}.\n        /* Write the \"Priority\" header */\n        IF cPriority NE \"\" THEN\n            ASSIGN cReturnData = cReturnData + \"\\n\" + {&QUOTES} + \"Priority:\" + cPriority + {&QUOTES}.\n        /* Write the \"Date\" (sent date) header */\n        IF dttmtzSentDate NE ? THEN\n            ASSIGN cReturnData = cReturnData + \"\\n\" + {&QUOTES} + \"Date:\" + email.Util:ABLDateTimeToEmail(dttmtzSentDate) + {&QUOTES}.\n        IF dttmtzReplyByDate NE ? THEN\n            ASSIGN cReturnData = cReturnData + \"\\n\" + {&QUOTES} + \"Reply-By:\" + email.Util:ABLDateTimeToEmail(dttmtzReplyByDate) + {&QUOTES}.\n        /* Write the \"Expiry-Date\" header */\n        IF dttmtzExpireDate NE ? THEN\n            ASSIGN cReturnData = cReturnData + \"\\n\" + {&QUOTES} + \"Expiry-Date:\" + email.Util:ABLDateTimeToEmail(dttmtzExpireDate) + {&QUOTES}.\n        RETURN cReturnData.\n    END METHOD.\n\n    /* Dumps all email message payload data (body and attachments) to LONGCHAR */\n    METHOD PUBLIC LONGCHAR getPayload():\n        DEFINE VARIABLE lcReturnData AS LONGCHAR NO-UNDO.\n\n        /* If no body and no text, then return empty string (\"\") */\n        IF lcBody EQ \"\" AND NOT TEMP-TABLE ttAttachments:HAS-RECORDS THEN\n            RETURN lcReturnData.\n\n        /* Write payload header */\n        ASSIGN lcReturnData = \"Mime-Version: 1.0\" + cNewLine +\n                              \"Content-Type: multipart/mixed; boundary=\" + cMimeBoundary + cNewLine + cNewLine.\n\n        /* Write out the email body, if it exists */\n        IF lcBody NE \"\" THEN DO:\n            ASSIGN lcReturnData = lcReturnData + \"--\" + cMimeBoundary + cNewLine +\n                                  \"Content-Type: text/plain; charset=~\"us-ascii~\"\" + cNewLine.\n            IF lBodyIsBase64 THEN DO:\n                ASSIGN lcReturnData = lcReturnData + \"Content-Transfer-Encoding: base64\" + cNewLine +\n                                      cNewLine +\n                                      email.Util:ConvertDataToBase64(lcBody) + cNewLine.\n            END.\n            ELSE DO:\n                ASSIGN lcReturnData = lcReturnData + \"Content-Transfer-Encoding: 7bit\"   + cNewLine +\n                                      cNewLine +\n                                      lcBody + cNewLine.\n            END.\n        END.\n\n        /* Write out each email attachment */\n        FOR EACH ttAttachments:\n            ASSIGN lcReturnData = lcReturnData + \"--\" + cMimeBoundary + cNewLine.\n            IF ttAttachments.lBase64Encode THEN DO:\n                ASSIGN lcReturnData = lcReturnData + \"Content-Type: application/octet-stream\" + cNewLine +\n                                      \"Content-Disposition: attachment; filename=~\"\" + ttAttachments.cFileName + \"~\"\" + cNewLine +\n                                      \"Content-Transfer-Encoding: base64\" + cNewLine + cNewLine +\n                                      CAST(ttAttachments.lcData, email.LongcharWrapper):getLongchar() + cNewLine.\n            END.\n            ELSE DO:\n                ASSIGN lcReturnData = lcReturnData + \"Content-Type: text/plain; charset=~\"us-ascii~\"\" + cNewLine +\n                                      \"Content-Disposition: attachment; filename=~\"\" + ttAttachments.cFileName + \"~\"\" + cNewLine +\n                                      \"Content-Transfer-Encoding: 7bit\" + cNewLine + cNewLine +\n                                      CAST(ttAttachments.lcData, email.LongcharWrapper):getLongchar() + cNewLine.\n            END.\n        END.\n\n        /* Write payload footer */\n        ASSIGN lcReturnData = lcReturnData + \"--\" + cMimeBoundary + \"--\" + cNewLine.\n\n        RETURN lcReturnData.\n    END METHOD.\n\n    METHOD PUBLIC CHARACTER send():\n        RETURN objSendEmailAlgorithm:sendEmail(INPUT THIS-OBJECT).\n    END METHOD.\n\nEND CLASS.\n"
  },
  {
    "path": "src/test/resources/samples/langs/OpenEdge ABL/SendEmailAlgorithm.cls",
    "content": "\n/*------------------------------------------------------------------------\n    File        : SendEmailAlgorithm\n    Purpose     :\n    Syntax      :\n    Description : Uses object-oriented Strategy Pattern to abstract away the\n                  algorithm for sending an email by encapsulating it\n                  into a data structure.\n    Author(s)   : Abe Voelker\n    Created     : Sat Jul 17 17:11:18 CDT 2010\n    Notes       :\n  ----------------------------------------------------------------------*/\n\nUSING Progress.Lang.*.\n\nINTERFACE email.SendEmailAlgorithm:\n\n    /* Returns: */\n    /* SUCCESS = empty return string */\n    /* FAILURE = error message in return string */\n    METHOD PUBLIC CHARACTER sendEmail(INPUT ipobjEmail AS email.Email).\n\nEND INTERFACE.\n"
  },
  {
    "path": "src/test/resources/samples/langs/OpenEdge ABL/SocketReader.p",
    "content": "\n/*------------------------------------------------------------------------\n    File        : SocketReader.p\n    Purpose     :\n    Author(s)   : Abe Voelker\n    Created     : Sat Aug 21 08:31:38 CDT 2010\n    Notes       : Based on code from smtpmail.p\n  ----------------------------------------------------------------------*/\n\n/* ***************************  Definitions  ************************** */\nDEFINE INPUT PARAMETER objSendEmailAlg    AS email.SendEmailSocket NO-UNDO.\nDEFINE VARIABLE vbuffer AS MEMPTR  NO-UNDO.\nDEFINE VARIABLE vstatus AS LOGICAL NO-UNDO.\nDEFINE VARIABLE vState  AS INTEGER NO-UNDO.\n\n\nASSIGN vstate = 1.\n\n/* ********************  Preprocessor Definitions  ******************** */\n\n\n/* ***************************  Main Block  *************************** */\n\nFUNCTION getHostname RETURNS CHARACTER():\n    DEFINE VARIABLE cHostname AS CHARACTER NO-UNDO.\n    INPUT THROUGH hostname NO-ECHO.\n      IMPORT UNFORMATTED cHostname.\n    INPUT CLOSE.\n    RETURN cHostname.\nEND FUNCTION.\n\n/*\n  Status:\n        0 - No Connection to the server\n        1 - Waiting for 220 connection to SMTP server\n        2 - Waiting for 250 OK status to start sending email\n        3 - Waiting for 250 OK status for sender\n        4 - Waiting for 250 OK status for recipient\n        5 - Waiting for 354 OK status to send data\n        6 - Waiting for 250 OK status for message received\n        7 - Quiting\n*/\n\nPROCEDURE newState:\n    DEFINE INPUT PARAMETER newState AS INTEGER.\n    DEFINE INPUT PARAMETER pstring  AS CHARACTER.\n    vState = newState.\n    IF pstring = \"\" THEN\n        RETURN.\n    SET-SIZE(vbuffer) = LENGTH(pstring) + 1.\n    PUT-STRING(vbuffer,1) = pstring.\n    SELF:WRITE(vbuffer, 1, LENGTH(pstring)).\n    SET-SIZE(vbuffer) = 0.\nEND PROCEDURE.\n\nPROCEDURE ReadSocketResponse:\n    DEFINE VARIABLE vlength AS INTEGER NO-UNDO.\n    DEFINE VARIABLE str AS CHARACTER NO-UNDO.\n    DEFINE VARIABLE v AS INTEGER NO-UNDO.\n\n    MESSAGE SELF:GET-BYTES-AVAILABLE() VIEW-AS ALERT-BOX.\n    vlength = SELF:GET-BYTES-AVAILABLE().\n    IF vlength > 0 THEN DO:\n        SET-SIZE(vbuffer) = vlength + 1.\n        SELF:READ(vbuffer, 1, vlength, 1).\n        str = GET-STRING(vbuffer,1).\n        SET-SIZE(vbuffer) = 0.\n        objSendEmailAlg:handleResponse(str).\n        /*\n        v = INTEGER(ENTRY(1, str,\" \")).\n        CASE vState:\n            WHEN 1 THEN\n                IF v = 220 THEN\n                    RUN newState(2, \"HELO \" + getHostname() + \"~r~n\").\n                ELSE\n                    vState = -1.\n            WHEN 2 THEN\n                IF v = 250 THEN\n                    RUN newState(3, \"MAIL From: \" + \"hardcoded@gmail.com\" + \"~r~n\").\n                ELSE\n                    vState = -1.\n            WHEN 3 THEN\n                IF v = 250 THEN\n                    RUN newState(4, \"RCPT TO: \" + \"hardcoded@gmail.com\" + \"~r~n\").\n                ELSE\n                    vState = -1.\n            WHEN 4 THEN\n                IF v = 250 THEN\n                    RUN newState(5, \"DATA ~r~n\").\n                ELSE\n                    vState = -1.\n            WHEN 5 THEN\n                IF v = 354 THEN\n                    RUN newState(6, \"From: \" + \"hardcoded@gmail.com\" + \"~r~n\" +\n                                \"To: \" + \"hardcoded@gmail.com\" + \" ~r~n\" +\n                          \"Subject: \" + \"Test Subject\" +\n                           \" ~r~n~r~n\" +\n                           \"Test Body\" + \"~r~n\" +\n                           \".~r~n\").\n                ELSE\n                    vState = -1.\n\n            WHEN 6 THEN\n                IF v = 250 THEN\n                    RUN newState(7,\"QUIT~r~n\").\n                ELSE\n                    vState = -1.\n        END CASE.\n        */\n    END.\n    /*\n    IF vState = 7 THEN\n       MESSAGE \"Email has been accepted for delivery.\".\n    IF vState < 0 THEN\n        MESSAGE \"Email has been aborted\".\n    */\nEND PROCEDURE.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/OpenEdge ABL/Util.cls",
    "content": "\n /*------------------------------------------------------------------------\n    File        : Util.cls\n    Description : Utility class for various methods that do not fit neatly into\n                  existing class structures.\n    Author(s)   : Abe Voelker\n    Created     : Sat Jun 26 16:05:14 CDT 2010\n    Notes       :\n  ----------------------------------------------------------------------*/\n\nUSING Progress.Lang.*.\n\n\nCLASS email.Util USE-WIDGET-POOL FINAL:\n\n    DEFINE PRIVATE STATIC VARIABLE cMonthMap AS CHARACTER EXTENT 12 INITIAL\n      [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"].\n\n    /* Converts ABL DateTime-TZ default string format (07/21/2010 21:16:47.141-05:00) */\n    /* to Email standard format (21 Jul 2010 21:16:47 -0500) */\n    METHOD PUBLIC STATIC CHARACTER ABLDateTimeToEmail(INPUT ipdttzDateTime AS DATETIME-TZ):\n        RETURN STRING(DAY(ipdttzDateTime))  + \" \" + cMonthMap[MONTH(ipdttzDateTime)] + \" \" +\n               STRING(YEAR(ipdttzDateTime)) + \" \" +\n               STRING( INTEGER( TRUNCATE( MTIME( ipdttzDateTime ) / 1000, 0 ) ), \"HH:MM:SS\" ) + \" \" +\n               ABLTimeZoneToString(TIMEZONE(ipdttzDateTime)).\n    END METHOD.\n\n    METHOD PUBLIC STATIC CHARACTER ABLDateTimeToEmail(INPUT ipdtDateTime AS DATETIME):\n        RETURN ABLDateTimeToEmail(DATETIME-TZ(ipdtDateTime)). /* Time zone will be session value */\n    END METHOD.\n\n    /* Note: ABL MODULO function returns incorrect values for negative numbers! */\n    METHOD PUBLIC STATIC CHARACTER ABLTimeZoneToString(INPUT ipiTimeZone AS INTEGER):\n        RETURN STRING(TRUNCATE(ipiTimeZone / 60, 0), \"-99\") + STRING(ABSOLUTE(ipiTimeZone) MODULO 60, \"99\").\n    END METHOD.\n\n    /* Converts input plain text into base64-encoded, email-standard width string data */\n    METHOD PUBLIC STATIC LONGCHAR ConvertDataToBase64(INPUT iplcNonEncodedData AS LONGCHAR):\n        DEFINE VARIABLE lcPreBase64Data    AS LONGCHAR NO-UNDO.\n        DEFINE VARIABLE lcPostBase64Data   AS LONGCHAR NO-UNDO.\n        DEFINE VARIABLE mptrPostBase64Data AS MEMPTR   NO-UNDO.\n        DEFINE VARIABLE i                  AS INTEGER  NO-UNDO.\n\n        /* Read file into MEMPTR and convert it to base-64 */\n        COPY-LOB FROM OBJECT iplcNonEncodedData TO mptrPostBase64Data.\n        lcPreBase64Data = BASE64-ENCODE(mptrPostBase64Data).\n        SET-SIZE(mptrPostBase64Data) = 0. /* Free memory */\n\n        /* Convert base-64 data into 77-char width lines (for email standard) */\n        DO i=1 TO LENGTH(lcPreBase64Data) BY 77:\n            ASSIGN lcPostBase64Data = lcPostBase64Data + SUBSTRING(lcPreBase64Data, i, 77) + CHR(13) + CHR(10).\n        END.\n\n        RETURN lcPostBase64Data.\n    END METHOD.\n\nEND CLASS."
  },
  {
    "path": "src/test/resources/samples/langs/OpenEdge ABL/openedge.p",
    "content": "MESSAGE \"Hello, world!\".\n"
  },
  {
    "path": "src/test/resources/samples/langs/OpenEdge ABL/test-win.w",
    "content": "&ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 GUI\r\n&ANALYZE-RESUME\r\n&Scoped-define WINDOW-NAME C-Win\r\n&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS C-Win \r\n/*------------------------------------------------------------------------\r\n\r\n  File: \r\n\r\n  Description: \r\n\r\n  Input Parameters:\r\n      <none>\r\n\r\n  Output Parameters:\r\n      <none>\r\n\r\n  Author: \r\n\r\n  Created: \r\n\r\n------------------------------------------------------------------------*/\r\n/*          This .W file was created with the Progress AppBuilder.      */\r\n/*----------------------------------------------------------------------*/\r\n\r\n/* Create an unnamed pool to store all the widgets created \r\n     by this procedure. This is a good default which assures\r\n     that this procedure's triggers and internal procedures \r\n     will execute in this procedure's storage, and that proper\r\n     cleanup will occur on deletion of the procedure. */\r\n\r\nCREATE WIDGET-POOL.\r\n\r\n/* ***************************  Definitions  ************************** */\r\n\r\n/* Parameters Definitions ---                                           */\r\n\r\n/* Local Variable Definitions ---                                       */\r\n\r\n/* _UIB-CODE-BLOCK-END */\r\n&ANALYZE-RESUME\r\n\r\n\r\n&ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK \r\n\r\n/* ********************  Preprocessor Definitions  ******************** */\r\n\r\n&Scoped-define PROCEDURE-TYPE Window\r\n&Scoped-define DB-AWARE no\r\n\r\n/* Name of designated FRAME-NAME and/or first browse and/or first query */\r\n&Scoped-define FRAME-NAME DEFAULT-FRAME\r\n\r\n/* Custom List Definitions                                              */\r\n/* List-1,List-2,List-3,List-4,List-5,List-6                            */\r\n\r\n/* _UIB-PREPROCESSOR-BLOCK-END */\r\n&ANALYZE-RESUME\r\n\r\n\r\n\r\n/* ***********************  Control Definitions  ********************** */\r\n\r\n/* Define the widget handle for the window                              */\r\nDEFINE VAR C-Win AS WIDGET-HANDLE NO-UNDO.\r\n\r\n/* ************************  Frame Definitions  *********************** */\r\n\r\nDEFINE FRAME DEFAULT-FRAME\r\n    WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY \r\n         SIDE-LABELS NO-UNDERLINE THREE-D \r\n         AT COL 1 ROW 1\r\n         SIZE 80 BY 16 WIDGET-ID 100.\r\n\r\n\r\n/* *********************** Procedure Settings ************************ */\r\n\r\n&ANALYZE-SUSPEND _PROCEDURE-SETTINGS\r\n/* Settings for THIS-PROCEDURE\r\n   Type: Window\r\n   Allow: Basic,Browse,DB-Fields,Window,Query\r\n   Other Settings: COMPILE\r\n */\r\n&ANALYZE-RESUME _END-PROCEDURE-SETTINGS\r\n\r\n/* *************************  Create Window  ************************** */\r\n\r\n&ANALYZE-SUSPEND _CREATE-WINDOW\r\nIF SESSION:DISPLAY-TYPE = \"GUI\":U THEN\r\n  CREATE WINDOW C-Win ASSIGN\r\n         HIDDEN             = YES\r\n         TITLE              = \"<insert window title>\"\r\n         HEIGHT             = 16\r\n         WIDTH              = 80\r\n         MAX-HEIGHT         = 16\r\n         MAX-WIDTH          = 80\r\n         VIRTUAL-HEIGHT     = 16\r\n         VIRTUAL-WIDTH      = 80\r\n         RESIZE             = yes\r\n         SCROLL-BARS        = no\r\n         STATUS-AREA        = no\r\n         BGCOLOR            = ?\r\n         FGCOLOR            = ?\r\n         KEEP-FRAME-Z-ORDER = yes\r\n         THREE-D            = yes\r\n         MESSAGE-AREA       = no\r\n         SENSITIVE          = yes.\r\nELSE {&WINDOW-NAME} = CURRENT-WINDOW.\r\n/* END WINDOW DEFINITION                                                */\r\n&ANALYZE-RESUME\r\n\r\n\r\n\r\n/* ***********  Runtime Attributes and AppBuilder Settings  *********** */\r\n\r\n&ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES\r\n/* SETTINGS FOR WINDOW C-Win\r\n  VISIBLE,,RUN-PERSISTENT                                               */\r\n/* SETTINGS FOR FRAME DEFAULT-FRAME\r\n   FRAME-NAME                                                           */\r\nIF SESSION:DISPLAY-TYPE = \"GUI\":U AND VALID-HANDLE(C-Win)\r\nTHEN C-Win:HIDDEN = no.\r\n\r\n/* _RUN-TIME-ATTRIBUTES-END */\r\n&ANALYZE-RESUME\r\n\r\n \r\n\r\n\r\n\r\n/* ************************  Control Triggers  ************************ */\r\n\r\n&Scoped-define SELF-NAME C-Win\r\n&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win\r\nON END-ERROR OF C-Win /* <insert window title> */\r\nOR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO:\r\n  /* This case occurs when the user presses the \"Esc\" key.\r\n     In a persistently run window, just ignore this.  If we did not, the\r\n     application would exit. */\r\n  IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY.\r\nEND.\r\n\r\n/* _UIB-CODE-BLOCK-END */\r\n&ANALYZE-RESUME\r\n\r\n\r\n&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win\r\nON WINDOW-CLOSE OF C-Win /* <insert window title> */\r\nDO:\r\n  /* This event will close the window and terminate the procedure.  */\r\n  APPLY \"CLOSE\":U TO THIS-PROCEDURE.\r\n  RETURN NO-APPLY.\r\nEND.\r\n\r\n/* _UIB-CODE-BLOCK-END */\r\n&ANALYZE-RESUME\r\n\r\n\r\n&UNDEFINE SELF-NAME\r\n\r\n&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK C-Win \r\n\r\n\r\n/* ***************************  Main Block  *************************** */\r\n\r\n/* Set CURRENT-WINDOW: this will parent dialog-boxes and frames.        */\r\nASSIGN CURRENT-WINDOW                = {&WINDOW-NAME} \r\n       THIS-PROCEDURE:CURRENT-WINDOW = {&WINDOW-NAME}.\r\n\r\n/* The CLOSE event can be used from inside or outside the procedure to  */\r\n/* terminate it.                                                        */\r\nON CLOSE OF THIS-PROCEDURE \r\n   RUN disable_UI.\r\n\r\n/* Best default for GUI applications is...                              */\r\nPAUSE 0 BEFORE-HIDE.\r\n\r\n/* Now enable the interface and wait for the exit condition.            */\r\n/* (NOTE: handle ERROR and END-KEY so cleanup code will always fire.    */\r\nMAIN-BLOCK:\r\nDO ON ERROR   UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK\r\n   ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK:\r\n  RUN enable_UI.\r\n  IF NOT THIS-PROCEDURE:PERSISTENT THEN\r\n    WAIT-FOR CLOSE OF THIS-PROCEDURE.\r\nEND.\r\n\r\n/* _UIB-CODE-BLOCK-END */\r\n&ANALYZE-RESUME\r\n\r\n\r\n/* **********************  Internal Procedures  *********************** */\r\n\r\n&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI C-Win  _DEFAULT-DISABLE\r\nPROCEDURE disable_UI :\r\n/*------------------------------------------------------------------------------\r\n  Purpose:     DISABLE the User Interface\r\n  Parameters:  <none>\r\n  Notes:       Here we clean-up the user-interface by deleting\r\n               dynamic widgets we have created and/or hide \r\n               frames.  This procedure is usually called when\r\n               we are ready to \"clean-up\" after running.\r\n------------------------------------------------------------------------------*/\r\n  /* Delete the WINDOW we created */\r\n  IF SESSION:DISPLAY-TYPE = \"GUI\":U AND VALID-HANDLE(C-Win)\r\n  THEN DELETE WIDGET C-Win.\r\n  IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE.\r\nEND PROCEDURE.\r\n\r\n/* _UIB-CODE-BLOCK-END */\r\n&ANALYZE-RESUME\r\n\r\n&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI C-Win  _DEFAULT-ENABLE\r\nPROCEDURE enable_UI :\r\n/*------------------------------------------------------------------------------\r\n  Purpose:     ENABLE the User Interface\r\n  Parameters:  <none>\r\n  Notes:       Here we display/view/enable the widgets in the\r\n               user-interface.  In addition, OPEN all queries\r\n               associated with each FRAME and BROWSE.\r\n               These statements here are based on the \"Other \r\n               Settings\" section of the widget Property Sheets.\r\n------------------------------------------------------------------------------*/\r\n  VIEW FRAME DEFAULT-FRAME IN WINDOW C-Win.\r\n  {&OPEN-BROWSERS-IN-QUERY-DEFAULT-FRAME}\r\n  VIEW C-Win.\r\nEND PROCEDURE.\r\n\r\n/* _UIB-CODE-BLOCK-END */\r\n&ANALYZE-RESUME\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/OpenRC runscript/acpid",
    "content": "#!/sbin/openrc-run\n\ndescription=\"Daemon for Advanced Configuration and Power Interface\"\n\nextra_started_commands=\"reload\"\ncommand=\"/usr/sbin/acpid\"\ncommand_args=\"$ACPID_ARGS\"\nstart_stop_daemon_args=\"--quiet\"\n\ndepend() {\n\tneed localmount\n\tuse logger\n}\n\nreload() {\n\tebegin \"Reloading acpid configuration\"\n\tstart-stop-daemon --exec $command --signal HUP\n\teend $?\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/OpenSCAD/not_simple.scad",
    "content": "// A more complicated 3D shape in OpenSCAD\n$fn=32;\n\ndifference() {\n    // main shape\n    union() {\n        translate( [ 0, 0,  2 ] ) cube( [ 15, 15, 4 ], center=true );\n        translate( [ 0, 0, 13 ] ) cylinder( h=25, r1=5, r2=3, center=true );\n        translate( [ 0, 0, 28 ] ) sphere( r=6 );\n    }\n    // hole through center\n    translate( [ 0, 0, 17 ] ) cylinder( h=35, r=2, center=true );\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/OpenSCAD/simple.scad",
    "content": "// Simple sphere in OpenSCAD\n\nsphere( r=10 );\n"
  },
  {
    "path": "src/test/resources/samples/langs/Org/org.org",
    "content": "#+OPTIONS:    H:3 num:nil toc:nil \\n:nil @:t ::t |:t ^:t -:t f:t *:t TeX:t LaTeX:t skip:nil d:(HIDE) tags:not-in-toc\n#+STARTUP:    align fold nodlcheck hidestars oddeven lognotestate\n#+SEQ_TODO:   TODO(t) INPROGRESS(i) WAITING(w@) | DONE(d) CANCELED(c@)\n#+TAGS:       Write(w) Update(u) Fix(f) Check(c)\n#+TITLE:      org-ruby\n#+AUTHOR:     Brian Dewey\n#+EMAIL:      bdewey@gmail.com\n#+LANGUAGE:   en\n#+PRIORITIES: A C B\n#+CATEGORY:   worg\n\n{Back to Worg's index}\n\n* Motivation\n\n  The dominant simple plain-text markup languages for the web are\n  Textile and Markdown. A factor for the popularity of those markup\n  formats is the widespread availability of simple, free packages for\n  converting the formats to HTML. For example, the world of\n  Ruby-powered websites has settled on RedCloth for converting Textile\n  to HTML.\n\n  The default way to convert org-mode files to HTML is the powerful\n  publishing functionality provided by =emacs=. However, =emacs= does\n  not easiliy integrate into many existing website frameworks.\n\n  =Org-ruby= tries to make it easier to use org-mode files in both\n  dyanmic and static website generation tools written in\n  Ruby. =Org-ruby= is a simple Ruby gem to convert org-mode files to\n  HTML.\n\n* Using Org-ruby\n\n  =Org-ruby= follows the same model as other Ruby markup\n  libraries. You install the gem:\n\n  #+BEGIN_EXAMPLE\n  sudo gem install org-ruby\n  #+END_EXAMPLE\n\n  Then, to convert an org-file to HTML in your Ruby code:\n\n  #+BEGIN_EXAMPLE\n  require 'rubygems'\n  require 'org-ruby'\n\n  data = IO.read(filename)\n  puts Orgmode::Parser.new(data).to_html\n  #+END_EXAMPLE\n\n* Walkthrough: Using org-ruby with Webby\n\n  Here is an example of how to integrate =org-ruby= into Webby, a\n  static website generation tool written in Ruby.\n\n  Webby follows a similar pattern to other static site generation\n  tools (like nanoc, Jekyll, and webgen):\n\n  - You author website content in text with simple markup\n  - Each page is fed through one or more /filters/ to produce HTML\n  - The HTML is mixed in with layouts to produce the final pages\n\n  For a Webby site, a the source for a page may look like this:\n\n  #+BEGIN_EXAMPLE\n  ---\n  title:           Special Directories\n  created_at:      2009-12-17\n  status:          Complete\n  filter:\n    - erb\n    - maruku\n  tags:\n    - powershell\n  ---\n  <%= @page.title %>\n  ==================\n\n  Special Directories are a set of directories, each of which has a\n  function that will navigate you to the appropriate directory using\n  the push-location cmdlet. For example, the function `home` might\n  navigate to `c:\\users\\bdewey.`\n\n  Install\n  -------\n\n  Copy the module to somewhere in `ENV:PSModulePath`. Then,\n\n      InstallModule SpecialDirectories\n  #+END_EXAMPLE\n\n  In the above example, the text is written in Markdown. At the top of\n  the file, metadata informs Webby to pass the text through two\n  /filters/ to produce HTML. The first filter, =erb=, handles embedded\n  Ruby. In this case, it will replace ~<%= @page.title %>~ with the\n  page title (=Special Directories=). The second filter uses Maruku to\n  translate Markdown into HTML.\n\n  You can use the exact same pattern to include org-mode files in a\n  Webby site. For this walkthrough, I assume you already have Webby\n  installed, and that you've already created a site.\n\n  1. Make sure you have =org-ruby= installed: =sudo gem install\n     org-ruby=.\n  2. You need to register a new Webby filter to handle org-mode\n     content. Webby makes this easy. In the =lib/= folder of your\n     site, create a file =orgmode.rb=:\n\n     #+BEGIN_EXAMPLE\n     require 'org-ruby'\n\n     Webby::Filters.register :org do |input|\n       Orgmode::Parser.new(input).to_html\n     end\n     #+END_EXAMPLE\n\n     This code creates a new filter, =org=, that will use the\n     =org-ruby= parser to translate org-mode input into HTML.\n  3. Create your content. For example:\n\n     #+BEGIN_EXAMPLE\n---\ntitle:              Orgmode Parser\ncreated_at:         2009-12-21\nstatus:             Under development\nfilter:\n  - erb\n  - org\ntags:\n  - orgmode\n  - ruby\n---\n<%= @page.title %>\n\n  Status: <%= @page.status %>\n\n* Description\n\n  Helpful Ruby routines for parsing orgmode files. The most\n  significant thing this library does today is convert orgmode files\n  to textile. Currently, you cannot do much to customize the\n  conversion. The supplied textile conversion is optimized for\n  extracting \"content\" from the orgfile as opposed to \"metadata.\"\n\n\n* History\n\n** 2009-12-29: Version 0.4\n\n   - The first thing output in HTML gets the class \"title\"\n   - HTML output is now indented\n   - Proper support for multi-paragraph list items.\n\n     See? This paragraph is part of the last bullet.\n\n   - Fixed bugs:\n     - \"rake spec\" wouldn't work on Linux. Needed \"require 'rubygems'\".\n       #+END_EXAMPLE\n\n     This file will go through the =erb= and =org= filters; as defined\n     in the previous step, the =org= filter will use =org-ruby= to\n     generate HTML.\n\n  That's all there is to it!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ox/IJCEmet2009.oxh",
    "content": "/** Replicate Imai, Jain and Ching Econometrica 2009 (incomplete).\n\n**/\n#include \"IJCEmet2009.h\"\n\nKapital::Kapital(L,const N,const entrant,const exit,const KP){\n\tStateVariable(L,N);\n\tthis.entrant = entrant;\n\tthis.exit = exit;\n\tthis.KP = KP;\n\tactual = Kbar*vals/(N-1);\n\tupper = log(actual~.Inf);\n\t}\n\nKapital::Transit(FeasA) {\n\tdecl ent =CV(entrant), stayout = FeasA[][exit.pos], tprob, sigu = CV(KP[SigU]);\n\tif (!v && !ent) return { <0>, ones(stayout) };\n\ttprob = ent ? probn( (upper-CV(KP[Kbe]))/sigu )\n\t           : probn( (upper-(CV(KP[Kb0])+CV(KP[Kb2])*upper[v])) / sigu );\n\ttprob = tprob[1:] - tprob[:N-1];\n\treturn { vals, tprob.*(1-stayout)+(1.0~zeros(1,N-1)).*stayout };\n\t}\n\nFirmEntry::Run() {\n\tInitialize();\n\tGenerateSample();\n\tBDP->BayesianDP();\n\t}\n\nFirmEntry::Initialize() {\n\tRust::Initialize(Reachable,0);\n\tsige = new StDeviations(\"sige\",<0.3,0.3>,0);\n\tentrant = new LaggedAction(\"entrant\",d);\n\tKP = new array[Kparams];\n\t\tKP[Kbe] = new Positive(\"be\",0.5);\n\t\tKP[Kb0] = new Free(\"b0\",0.0);\n\t\tKP[Kb1] = new Determined(\"b1\",0.0);\n\t\tKP[Kb2] = new Positive(\"b2\",0.4);\n\t\tKP[SigU] = new Positive(\"sigu\",0.4);\n\tEndogenousStates(K = new Kapital(\"K\",KN,entrant,d,KP),entrant);\n\tSetDelta(new Probability(\"delta\",0.85));\n\tkcoef = new Positive(\"kcoef\",0.1);\n\tecost = new Negative(\"ec\",-0.4);\n\tCreateSpaces();\n\t}\n\nFirmEntry::GenerateSample() {\n\tVolume = LOUD;\n\tEM = new ValueIteration(0);\n//\tEM -> Solve(0,0);\n\tdata = new DataSet(0,EM);\n\tdata->Simulate(DataN,DataT,0,FALSE);\n\tdata->Print(\"firmentry.xls\");\n\tBDP = new ImaiJainChing(\"FMH\",data,EM,ecost,sige,kcoef,KP,delta);\n\t}\n\n/** Capital stock can be positive only for incumbents.\n**/\nFirmEntry::Reachable()\t{ return CV(entrant)*CV(K) ? 0 : new FirmEntry() ;\t}\n\n/** The one period return.\n<DD>\n<pre>U = </pre>\n</DD>\n**/\nFirmEntry::Utility()  {\n\tdecl ent = CV(entrant),\n\t\t u =\n\t\t     ent*CV(ecost)+(1-ent)*CV(kcoef)*AV(K)\n\t\t   | 0.0;\n\treturn u;\n\t}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ox/ParallelObjective.ox",
    "content": "/** Client and Server classes for parallel optimization using CFMPI.**/\n#include \"ParallelObjective.h\"\n\n/** Set up MPI Client-Server support for objective optimization.\n@param obj `Objective' to parallelize\n@param DONOTUSECLIENT TRUE (default): client node does no object evaluation<br>FALSE after putting servers to work Client node does one evaluation.\n**/\nParallelObjective(obj,DONOTUSECLIENT) {\n\tif (isclass(obj.p2p)) {oxwarning(\"P2P object already exists for \"+obj.L+\". Nothing changed\"); return;}\n\tobj.p2p = new P2P(DONOTUSECLIENT,new ObjClient(obj),new ObjServer(obj));\n\t}\n\nObjClient::ObjClient(obj) { this.obj = obj;    }\n\nObjClient::Execute() {    }\n\nObjServer::ObjServer(obj) {\n    this.obj = obj;\n    basetag = P2P::STOP_TAG+1;\n    iml = obj.NvfuncTerms;\n    Nparams = obj.nstruct;\n    }\n\n/** Wait on the objective client.\n**/\nObjServer::Loop(nxtmsgsz) {\n    Nparams = nxtmsgsz;   //free param length is no greater than Nparams\n    if (Volume>QUIET) println(\"ObjServer server \",ID,\" Nparams \",Nparams);\n    Server::Loop(Nparams);\n    Recv(ANY_TAG);                      //receive the ending parameter vector\n    obj->Encode(Buffer[:Nparams-1]);   //encode it.\n    }\n\n/** Do the objective evaluation.\nReceive structural parameter vector and `Objective::Encode`() it.\nCall `Objective::vfunc`().\n@return Nparams (max. length of next expected message);\n**/\nObjServer::Execute() {\n\tobj->Decode(Buffer[:obj.nfree-1]);\n\tBuffer = obj.cur.V[] = obj->vfunc();\n    if (Volume>QUIET) println(\"Server Executive: \",ID,\" vfunc[0]= \",Buffer[0]);\n\treturn obj.nstruct;\n\t}\n\nCstrServer::CstrServer(obj) { ObjServer(obj);\t}\n\nSepServer::SepServer(obj) { ObjServer(obj);\t}\n\nCstrServer::Execute() {\n\tobj->Encode(Buffer);\n\tobj->Lagrangian(0);\n\treturn rows(Buffer = obj.cur->Vec());\n\t}\n\n/** Separable objective evaluations.\n**/\nSepServer::Execute() {\n\tobj.Kvar.v = imod(Tag-basetag,obj.K);\n\tobj->Encode(Buffer,TRUE);\n\tBuffer = obj.Kvar->PDF() * obj->vfunc();\n\treturn obj.NvfuncTerms;\n\t}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ox/particle.oxo",
    "content": "nldge::ParticleLogLikeli()\n{\tdecl it, ip,\n\t\t mss, mbas, ms, my, mx, vw, vwi, dws,\n\t\t mhi, mhdet, loglikeli, mData,\n\t\t vxm, vxs, mxm=<>, mxsu=<>, mxsl=<>,\n\t\t time, timeall, timeran=0, timelik=0, timefun=0, timeint=0, timeres=0;\n\n\tmData = GetData(m_asY);\n\tmhdet = sqrt((2*M_PI)^m_cY * determinant(m_mMSbE.^2));\t\t// covariance determinant\n\tmhi   = invert(m_mMSbE.^2);\t\t\t\t\t// invert covariance of measurement shocks\n\n\tms \t  = m_vSss + zeros(m_cPar, m_cS);\t\t\t// start particles\n\tmx \t  = m_vXss + zeros(m_cPar, m_cX);\t\t\t// steady state of state and policy\n\n\tloglikeli = 0;\t\t\t\t\t\t\t// init likelihood\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//timeall=timer();\n\tfor(it = 0; it < sizer(mData); it++)\n\t{\n\t\tmss = rann(m_cPar, m_cSS) * m_mSSbE;\t\t\t// state noise\n\t\tfg(&ms, ms, mx, mss);\t\t\t\t\t// transition prior as proposal\n\t\tmx = m_oApprox.FastInterpolate(ms); \t\t\t// interpolate\n\t\tfy(&my, ms, mx, zeros(m_cPar, m_cMS));\t\t\t// evaluate importance weights\n\t\tmy -= mData[it][];\t\t\t\t\t// observation error\n\n\t\tvw = exp(-0.5 * outer(my,mhi,'d')' )/mhdet;\t\t// vw = exp(-0.5 * sumr(my*mhi .*my ) )/mhdet;\n\n\t\tvw = vw .== .NaN .? 0 .: vw;\t\t\t\t// no policy can happen for extrem particles\n\t\tdws = sumc(vw);\n\t\tif(dws==0) return -.Inf;\t\t\t\t// or extremely wrong parameters\n\t\tloglikeli += log(dws/m_cPar)\t;\t\t\t// loglikelihood contribution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//timelik += (timer()-time)/100;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//time=timer();\n\t\tvwi = resample(vw/dws)-1;\t\t\t\t// selection step in c++\n\t\tms = ms[vwi][];\t\t\t\t\t\t// on normalized weights\n\t\tmx = mx[vwi][];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\treturn loglikeli;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Oxygene/Loops.oxygene",
    "content": "<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <RootNamespace>Loops</RootNamespace>\n    <OutputType>exe</OutputType>\n    <AssemblyName>Loops</AssemblyName>\n    <AllowGlobals>False</AllowGlobals>\n    <AllowLegacyOutParams>False</AllowLegacyOutParams>\n    <AllowLegacyCreate>False</AllowLegacyCreate>\n    <ApplicationIcon>Properties\\App.ico</ApplicationIcon>\n    <Configuration Condition=\"'$(Configuration)' == ''\">Release</Configuration>\n    <ProjectGuid>{916BD89C-B610-4CEE-9CAF-C515D88E2C94}</ProjectGuid>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Debug' \">\n    <DefineConstants>DEBUG;TRACE;</DefineConstants>\n    <OutputPath>.\\bin\\Debug</OutputPath>\n    <GeneratePDB>True</GeneratePDB>\n    <GenerateMDB>True</GenerateMDB>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Release' \">\n    <OutputPath>.\\bin\\Release</OutputPath>\n    <EnableAsserts>False</EnableAsserts>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\RemObjects Software\\Oxygene\\RemObjects.Oxygene.targets\" />\n  <ItemGroup>\n    <Reference Include=\"mscorlib\">\n      <HintPath>$(Framework)\\mscorlib.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\">\n      <HintPath>$(Framework)\\System.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Core\">\n      <HintPath>$(ProgramFiles)\\Reference Assemblies\\Microsoft\\Framework\\v3.5\\System.Core.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Data\">\n      <HintPath>$(Framework)\\System.Data.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml\">\n      <HintPath>$(Framework)\\System.Xml.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.pas\" />\n    <Content Include=\"Properties\\App.ico\" />\n    <Compile Include=\"Properties\\AssemblyInfo.pas\" />\n    <EmbeddResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n    </EmbeddResource>\n    <Compile Include=\"Properties\\Resources.Designer.pas\" />\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n    </None>\n    <Compile Include=\"Properties\\Settings.Designer.pas\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/test/resources/samples/langs/Oz/example.oz",
    "content": "% You can get a lot of information about Oz by following theses links  :\n% - http://mozart.github.io/\n% - http://en.wikipedia.org/wiki/Oz_(programming_language)\n% There is also a well known book that uses Oz for pedagogical reason :\n% - http://mitpress.mit.edu/books/concepts-techniques-and-models-computer-programming\n% And there are two courses on edX about 'Paradigms of Computer Programming' that also uses Oz for pedagogical reason :\n% - https://www.edx.org/node/2751#.VHijtfl5OSo\n% - https://www.edx.org/node/4436#.VHijzfl5OSo\n%\n% Here is an example of some code written with Oz.\n\ndeclare\n% Computes the sum of square of the N first integers.\nfun {Sum N}\n  local SumAux in\n    fun {SumAux N Acc}\n      if N==0 then Acc\n      else\n        {Sum N-1 Acc}\n      end\n    end\n    {SumAux N 0}\n  end\nend\n\n% Returns true if N is a prime and false otherwize\nfun {Prime N}\n  local PrimeAcc in\n    fun {PrimeAcc N Acc}\n\t    if(N == 1) then false\n\t    elseif(Acc == 1) then true\n\t    else\n\t      if (N mod Acc) == 0 then false\n\t      else\n\t       {PrimeAcc N Acc-1}\n\t      end\n\t   end\n    end\n  {PrimeAcc N (N div 2)}\n  end\nend\n\n% Reverse a list using cells and for loop (instead of recursivity)\nfun {Reverse L}\n  local RevList in\n    RevList = {NewCell nil}\n    for E in L do\n      RevList := E|@RevList\n    end\n    @RevList\n  end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/P4/l2.p4",
    "content": "/*\nCopyright 2013-present Barefoot Networks, Inc. \n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/*\n * Layer-2 processing\n */\n\nheader_type l2_metadata_t {\n    fields {\n        lkp_pkt_type : 3;\n        lkp_mac_sa : 48;\n        lkp_mac_da : 48;\n        lkp_mac_type : 16;\n\n        l2_nexthop : 16;                       /* next hop from l2 */\n        l2_nexthop_type : 1;                   /* ecmp or nexthop */\n        l2_redirect : 1;                       /* l2 redirect action */\n        l2_src_miss : 1;                       /* l2 source miss */\n        l2_src_move : IFINDEX_BIT_WIDTH;       /* l2 source interface mis-match */\n        stp_group: 10;                         /* spanning tree group id */\n        stp_state : 3;                         /* spanning tree port state */\n        bd_stats_idx : 16;                     /* ingress BD stats index */\n        learning_enabled : 1;                  /* is learning enabled */\n        port_vlan_mapping_miss : 1;            /* port vlan mapping miss */\n        same_if_check : IFINDEX_BIT_WIDTH;     /* same interface check */\n    }\n}\n\nmetadata l2_metadata_t l2_metadata;\n\n#ifndef L2_DISABLE\n/*****************************************************************************/\n/* Spanning tree lookup                                                      */\n/*****************************************************************************/\naction set_stp_state(stp_state) {\n    modify_field(l2_metadata.stp_state, stp_state);\n}\n\ntable spanning_tree {\n    reads {\n        ingress_metadata.ifindex : exact;\n        l2_metadata.stp_group: exact;\n    }\n    actions {\n        set_stp_state;\n    }\n    size : SPANNING_TREE_TABLE_SIZE;\n}\n#endif /* L2_DISABLE */\n\ncontrol process_spanning_tree {\n#ifndef L2_DISABLE\n    if (l2_metadata.stp_group != STP_GROUP_NONE) {\n        apply(spanning_tree);\n    }\n#endif /* L2_DISABLE */\n}\n\n#ifndef L2_DISABLE\n/*****************************************************************************/\n/* Source MAC lookup                                                         */\n/*****************************************************************************/\naction smac_miss() {\n    modify_field(l2_metadata.l2_src_miss, TRUE);\n}\n\naction smac_hit(ifindex) {\n    bit_xor(l2_metadata.l2_src_move, ingress_metadata.ifindex, ifindex);\n}\n\ntable smac {\n    reads {\n        ingress_metadata.bd : exact;\n        l2_metadata.lkp_mac_sa : exact;\n    }\n    actions {\n        nop;\n        smac_miss;\n        smac_hit;\n    }\n    size : MAC_TABLE_SIZE;\n}\n\n/*****************************************************************************/\n/* Destination MAC lookup                                                    */\n/*****************************************************************************/\naction dmac_hit(ifindex) {\n    modify_field(ingress_metadata.egress_ifindex, ifindex);\n    bit_xor(l2_metadata.same_if_check, l2_metadata.same_if_check, ifindex);\n}\n\naction dmac_multicast_hit(mc_index) {\n    modify_field(intrinsic_metadata.mcast_grp, mc_index);\n#ifdef FABRIC_ENABLE\n    modify_field(fabric_metadata.dst_device, FABRIC_DEVICE_MULTICAST);\n#endif /* FABRIC_ENABLE */\n}\n\naction dmac_miss() {\n    modify_field(ingress_metadata.egress_ifindex, IFINDEX_FLOOD);\n#ifdef FABRIC_ENABLE\n    modify_field(fabric_metadata.dst_device, FABRIC_DEVICE_MULTICAST);\n#endif /* FABRIC_ENABLE */\n}\n\naction dmac_redirect_nexthop(nexthop_index) {\n    modify_field(l2_metadata.l2_redirect, TRUE);\n    modify_field(l2_metadata.l2_nexthop, nexthop_index);\n    modify_field(l2_metadata.l2_nexthop_type, NEXTHOP_TYPE_SIMPLE);\n}\n\naction dmac_redirect_ecmp(ecmp_index) {\n    modify_field(l2_metadata.l2_redirect, TRUE);\n    modify_field(l2_metadata.l2_nexthop, ecmp_index);\n    modify_field(l2_metadata.l2_nexthop_type, NEXTHOP_TYPE_ECMP);\n}\n\naction dmac_drop() {\n    drop();\n}\n\ntable dmac {\n    reads {\n        ingress_metadata.bd : exact;\n        l2_metadata.lkp_mac_da : exact;\n    }\n    actions {\n#ifdef OPENFLOW_ENABLE\n        openflow_apply;\n        openflow_miss;\n#endif /* OPENFLOW_ENABLE */\n        nop;\n        dmac_hit;\n        dmac_multicast_hit;\n        dmac_miss;\n        dmac_redirect_nexthop;\n        dmac_redirect_ecmp;\n        dmac_drop;\n    }\n    size : MAC_TABLE_SIZE;\n    support_timeout: true;\n}\n#endif /* L2_DISABLE */\n\ncontrol process_mac {\n#ifndef L2_DISABLE\n    apply(smac);\n    apply(dmac);\n#endif /* L2_DISABLE */\n}\n\n#ifndef L2_DISABLE\n/*****************************************************************************/\n/* MAC learn notification                                                    */\n/*****************************************************************************/\nfield_list mac_learn_digest {\n    ingress_metadata.bd;\n    l2_metadata.lkp_mac_sa;\n    ingress_metadata.ifindex;\n}\n\naction generate_learn_notify() {\n    generate_digest(MAC_LEARN_RECEIVER, mac_learn_digest);\n}\n\ntable learn_notify {\n    reads {\n        l2_metadata.l2_src_miss : ternary;\n        l2_metadata.l2_src_move : ternary;\n        l2_metadata.stp_state : ternary;\n    }\n    actions {\n        nop;\n        generate_learn_notify;\n    }\n    size : LEARN_NOTIFY_TABLE_SIZE;\n}\n#endif /* L2_DISABLE */\n\ncontrol process_mac_learning {\n#ifndef L2_DISABLE\n    if (l2_metadata.learning_enabled == TRUE) {\n        apply(learn_notify);\n    }\n#endif /* L2_DISABLE */\n}\n\n\n/*****************************************************************************/\n/* Validate packet                                                           */\n/*****************************************************************************/\naction set_unicast() {\n    modify_field(l2_metadata.lkp_pkt_type, L2_UNICAST);\n}\n\naction set_unicast_and_ipv6_src_is_link_local() {\n    modify_field(l2_metadata.lkp_pkt_type, L2_UNICAST);\n    modify_field(ipv6_metadata.ipv6_src_is_link_local, TRUE);\n}\n\naction set_multicast() {\n    modify_field(l2_metadata.lkp_pkt_type, L2_MULTICAST);\n    add_to_field(l2_metadata.bd_stats_idx, 1);\n}\n\naction set_multicast_and_ipv6_src_is_link_local() {\n    modify_field(l2_metadata.lkp_pkt_type, L2_MULTICAST);\n    modify_field(ipv6_metadata.ipv6_src_is_link_local, TRUE);\n    add_to_field(l2_metadata.bd_stats_idx, 1);\n}\n\naction set_broadcast() {\n    modify_field(l2_metadata.lkp_pkt_type, L2_BROADCAST);\n    add_to_field(l2_metadata.bd_stats_idx, 2);\n}\n\naction set_malformed_packet(drop_reason) {\n    modify_field(ingress_metadata.drop_flag, TRUE);\n    modify_field(ingress_metadata.drop_reason, drop_reason);\n}\n\ntable validate_packet {\n    reads {\n#ifndef __TARGET_BMV2__\n        l2_metadata.lkp_mac_sa mask 0x010000000000 : ternary;\n#else\n        l2_metadata.lkp_mac_sa : ternary;\n#endif\n        l2_metadata.lkp_mac_da : ternary;\n        l3_metadata.lkp_ip_type : ternary;\n        l3_metadata.lkp_ip_ttl : ternary;\n        l3_metadata.lkp_ip_version : ternary;\n#ifndef __TARGET_BMV2__\n        ipv4_metadata.lkp_ipv4_sa mask 0xFF000000 : ternary;\n#else\n        ipv4_metadata.lkp_ipv4_sa : ternary;\n#endif\n#ifndef IPV6_DISABLE\n#ifndef __TARGET_BMV2__\n        ipv6_metadata.lkp_ipv6_sa mask 0xFFFF0000000000000000000000000000 : ternary;\n#else\n        ipv6_metadata.lkp_ipv6_sa : ternary;\n#endif\n#endif /* IPV6_DISABLE */\n    }\n    actions {\n        nop;\n        set_unicast;\n        set_unicast_and_ipv6_src_is_link_local;\n        set_multicast;\n        set_multicast_and_ipv6_src_is_link_local;\n        set_broadcast;\n        set_malformed_packet;\n    }\n    size : VALIDATE_PACKET_TABLE_SIZE;\n}\n\ncontrol process_validate_packet {\n    if (ingress_metadata.drop_flag == FALSE) {\n        apply(validate_packet);\n    }\n}\n\n\n/*****************************************************************************/\n/* Egress BD lookup                                                          */\n/*****************************************************************************/\naction set_egress_bd_properties() {\n}\n\ntable egress_bd_map {\n    reads {\n        egress_metadata.bd : exact;\n    }\n    actions {\n        nop;\n        set_egress_bd_properties;\n    }\n    size : EGRESS_BD_MAPPING_TABLE_SIZE;\n}\n\ncontrol process_egress_bd {\n    apply(egress_bd_map);\n}\n\n\n/*****************************************************************************/\n/* Egress VLAN decap                                                         */\n/*****************************************************************************/\naction remove_vlan_single_tagged() {\n    modify_field(ethernet.etherType, vlan_tag_[0].etherType);\n    remove_header(vlan_tag_[0]);\n}\n\naction remove_vlan_double_tagged() {\n    modify_field(ethernet.etherType, vlan_tag_[1].etherType);\n    remove_header(vlan_tag_[0]);\n    remove_header(vlan_tag_[1]);\n}\n\ntable vlan_decap {\n    reads {\n        vlan_tag_[0] : valid;\n        vlan_tag_[1] : valid;\n    }\n    actions {\n        nop;\n        remove_vlan_single_tagged;\n        remove_vlan_double_tagged;\n    }\n    size: VLAN_DECAP_TABLE_SIZE;\n}\n\ncontrol process_vlan_decap {\n    apply(vlan_decap);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/P4/mirror_acl.p4",
    "content": "// Copyright 2015, Barefoot Networks, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\naction set_mirror_id(session_id) {\n    clone_ingress_pkt_to_egress(session_id);\n}\n\ntable mirror_acl {\n    reads {\n        ingress_metadata.if_label : ternary;\n        ingress_metadata.bd_label : ternary;\n\n        /* ip acl */\n        ingress_metadata.lkp_ipv4_sa : ternary;\n        ingress_metadata.lkp_ipv4_da : ternary;\n        ingress_metadata.lkp_ip_proto : ternary;\n\n        /* mac acl */\n        ingress_metadata.lkp_mac_sa : ternary;\n        ingress_metadata.lkp_mac_da : ternary;\n        ingress_metadata.lkp_mac_type : ternary;\n    }\n    actions {\n        nop;\n        set_mirror_id;\n    }\n    size : INGRESS_MIRROR_ACL_TABLE_SIZE;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PAWN/fixes.inc",
    "content": "/* \r\n * ===============\r\n *  INTRODUCTION: \r\n * ===============\r\n * \r\n * fixes.inc - Community patch for buggy SA:MP functions.\r\n * \r\n * ================\r\n *  LIST OF FIXES: \r\n * ================\r\n * \r\n * FIX:      GetPlayerColor\r\n * PROBLEM:  Returns \"0\" if \"SetPlayerColor\" has never been called.\r\n * SOLUTION: Call \"SetPlayerColor\" in \"OnPlayerConnect\".\r\n * SEE:      \"OnPlayerConnect\".\r\n * AUTHOR:   KoczkaHUN\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1486048\r\n * \r\n * FIX:      FILTERSCRIPT\r\n * PROBLEM:  Despite the fact that is in every new script, many people don't\r\n *           define \"FILTERSCRIPT\" where appropriate.\r\n * SOLUTION: Provide an \"IS_FILTERSCRIPT\" variable (note the naming to match\r\n *           the original macro).\r\n * AUTHOR:   Y_Less\r\n * SEE:      \"OnFilterScriptInit\" and \"OnGameModeInit\".\r\n * \r\n * FIX:      SpawnPlayer\r\n * PROBLEM:  Kills the player if they are in a vehicle.\r\n * SOLUTION: Remove the from the vehicle.\r\n * SEE:      \"FIXES_SpawnPlayer\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      SetPlayerName\r\n * PROBLEM:  Using \"SetPlayerName\" when the new name only differs from the old\r\n *           name in case does not alter the name at all.\r\n * SOLUTION: Change their name twice - once to \"_FIXES TEMP NAME\" and then to\r\n *           the actual required name.\r\n * SEE:      \"OnPlayerConnect\" and \"FIXES_SetPlayerName\".\r\n * AUTHOR:   Y_Less/Slice/xX_Simon_Xx\r\n * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/3\r\n * \r\n * FIX:      GetPlayerSkin\r\n * PROBLEM:  Returns the new skin after \"SetSpawnInfo\" is called but before the\r\n *           player actually respawns to get the new skin.\r\n * SOLUTION: Record the skin in \"OnPlayerSpawn\" and always return that one.\r\n * SEE:      \"OnPlayerSpawn\", \"FIXES_GetPlayerSkin\" and \"FIXES_SetPlayerSkin\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      GetWeaponName\r\n * PROBLEM:  Returns nothing for 18, 44, and 45.\r\n * SOLUTION: Return the correct names (\"Molotov Cocktail\", \"Thermal Goggles\",\r\n *           and \"Night vision Goggles\").\r\n * SEE:      \"FIXES_GetWeaponName\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      SetPlayerWorldBounds\r\n * PROBLEM:  Aiming can bypass the edge.\r\n * SOLUTION: Check for the player leaving the area and reset them to their last\r\n *           good position if they leave the area (aiming or not).\r\n * SEE:      \"OnPlayerUpdate\" and \"FIXES_SetPlayerWorldBounds\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      TogglePlayerControllable\r\n * PROBLEM:  Other players see you moving on the spot.\r\n * SOLUTION: Return 0 in OnPlayerUpdate.\r\n * SEE:      \"FIXES_TogglePlayerControllable\" and \"OnPlayerUpdate\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=876854\r\n * \r\n * FIX:      HydraSniper\r\n * PROBLEM:  Entering military aircraft with a sniper rifle messes up views.\r\n * SOLUTION: Set their armed weapon to fists.\r\n * SEE:      \"OnPlayerStateChange\", \"FIXES_GivePlayerWeapon\",\r\n *           \"FIXES_SetPlayerArmedWeapon\".\r\n * AUTHOR:   funky1234\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=965644\r\n * \r\n * FIX:      IsPlayerInCheckpoint\r\n * PROBLEM:  Function returns an undefined value if it is called before any\r\n *           other checkpoint functions are called to initialise the value.\r\n * SOLUTION: Call \"DisablePlayerCheckpoint\" when they connect.\r\n * SEE:      \"OnPlayerConnect\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      IsPlayerInRaceCheckpoint\r\n * PROBLEM:  Function returns an undefined value if it is called before any\r\n *           other race checkpoint functions are called to initialise the value.\r\n * SOLUTION: Call \"DisablePlayerRaceCheckpoint\" when they connect.\r\n * SEE:      \"OnPlayerConnect\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      GetPlayerWeapon\r\n * PROBLEM:  Returns the old value after using \"SetPlayerArmedWeapon\" when they\r\n *           are in a vehicle.\r\n * SOLUTION: If \"SetPlayerArmedWeapon\" is called in a vehicle, store the new\r\n *           value and return that instead.\r\n * SEE:      \"OnPlayerStateChange\", \"FIXES_SetPlayerArmedWeapon\", and\r\n *           \"FIXES_GetPlayerWeapon\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      PutPlayerInVehicle\r\n * PROBLEM:  If this is used on a passenger the driver of their old vehicle\r\n *           doesn't see them in their new vehicle.\r\n * SOLUTION: Remove them from the vehicle first.\r\n * SEE:      \"OnPlayerStateChange\" and \"FIXES_PutPlayerInVehicle\".\r\n * AUTHOR:   leong124/Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1265965\r\n * \r\n * FIX:      KEY_AIM\r\n * PROBLEM:  \"KEY_AIM\" isn't defined by default.\r\n * SOLUTION: Define it.\r\n * SEE:      N/A.\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      SetPlayerCheckpoint\r\n * PROBLEM:  If a checkpoint is already set it will use the size of that\r\n *           checkpoint instead of the new one.\r\n * SOLUTION: Call \"DisablePlayerCheckpoint\" before setting the checkpoint.\r\n * SEE:      \"FIXES_SetPlayerCheckpoint\".\r\n * AUTHOR:   KoczkaHUN\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1482401\r\n * \r\n * FIX:      SetPlayerRaceCheckpoint\r\n * PROBLEM:  If a checkpoint is already set it will use the size of that\r\n *           checkpoint instead of the new one.\r\n * SOLUTION: Call \"DisablePlayerRaceCheckpoint\" before setting the checkpoint.\r\n * SEE:      \"FIXES_SetPlayerRaceCheckpoint\".\r\n * AUTHOR:   KoczkaHUN\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1482401\r\n * \r\n * FIX:      TextDrawCreate\r\n * PROBLEM:  Crashes on a blank string.\r\n * SOLUTION: Intercept blank strings.\r\n * SEE:      \"FIXES_TextDrawCreate\".\r\n * AUTHOR:   wups\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1484008\r\n * \r\n * FIX:      TextDrawSetString\r\n * PROBLEM:  Crashes on a blank string and size greater than 1024.\r\n * SOLUTION: Intercept blank strings and truncate long strings.\r\n * SEE:      \"FIXES_TextDrawSetString\".\r\n * AUTHOR:   TomTrox\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1487870\r\n * \r\n * FIX:      CreatePlayerTextDraw\r\n * PROBLEM:  Crashes on a blank string.\r\n * SOLUTION: Intercept blank strings.\r\n * SEE:      \"FIXES_CreatePlayerTextDraw\".\r\n * AUTHOR:   wups/Y_Less\r\n * \r\n * FIX:      PlayerTextDrawSetString\r\n * PROBLEM:  Crashes on a blank string and size greater than 1024.\r\n * SOLUTION: Intercept blank strings and truncate long strings.\r\n * SEE:      \"FIXES_PlayerTextDrawSetString\".\r\n * AUTHOR:   TomTrox/Y_Less\r\n * \r\n * FIX:      AllowInteriorWeapons\r\n * PROBLEM:  Does nothing.\r\n * SOLUTION: Set the player's weapon to fists in an interior.\r\n * SEE:      \"FIXES_AllowInteriorWeapons\", \"OnGameModeInit\" and\r\n *           \"OnPlayerUpdate\".\r\n * AUTHOR:   KoczkaHUN\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1502696\r\n * \r\n * FIX:      OnPlayerEnterVehicle\r\n * PROBLEM:  Crashes other players when people enter an invalid seat.\r\n * SOLUTION: Desync the people with invalid seats.\r\n * SEE:      \"OnPlayerStateChange\" and \"OnPlayerUpdate\".\r\n * AUTHOR:   RyDeR`/Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1410296\r\n * \r\n * FIX:      OnPlayerEnterVehicle_2\r\n * PROBLEM:  Crashes the server when hacks enter an invalid vehicle.\r\n * SOLUTION: Desync the people with invalid vehicles.\r\n * SEE:      \"OnPlayerEnterVehicle\".\r\n * AUTHOR:   im/Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=2340900\r\n * \r\n * FIX:      AllowTeleport\r\n * PROBLEM:  0.3dRC9 removed \"AllowPlayerTeleport\" and \"AllowAdminTeleport\" in\r\n *           favour of \"OnPlayerClickMap\".  Some scripts used the old code and.\r\n * SOLUTION: Teleport the player in \"OnPlayerClickMap\".\r\n * SEE:      \"OnPlayerClickMap\", \"FIXES_AllowPlayerTeleport\", and\r\n *           \"FIXES_AllowAdminTeleport\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      SetPlayerSpecialAction\r\n * PROBLEM:  Removing jetpacks from players by setting their special action to 0\r\n *           causes the sound to stay until death.\r\n * SOLUTION: Call \"ClearAnimations\" before \"SetPlayerSpecialAction\".\r\n * SEE:      \"FIXES_SetPlayerSpecialAction\".\r\n * AUTHOR:   MP2\r\n * POST:     Private message from MP2.\r\n * \r\n * FIX:      OnDialogResponse\r\n * PROBLEM:  Cheaters can spoof the dialogid they are using to respond to ones\r\n *           they can't actually see.\r\n * SOLUTION: Store the displayed dialogid and use that instead.\r\n * SEE:      \"FIXES_OnDialogResponse\", \"FIXES_ShowPlayerDialog\".\r\n * AUTHOR:   Y_Less\r\n * FIXED IN: 0.3e RC6\r\n * \r\n * FIX:      GetPlayerDialog\r\n * PROBLEM:  This function doesn't exist.  Fixed for hidden dialogs.\r\n * SOLUTION: Add it.  DEFAULTS TO FALSE!\r\n * SEE:      \"FIXES_GetPlayerDialog\".\r\n * AUTHOR:   Y_Less/xX_Simon_Xx\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=2141254\r\n * \r\n * FIX:      PlayerDialogResponse\r\n * PROBLEM:  A player's dialog doesn't hide when the gamemode restarts, causing\r\n *           the server to print \"Warning: PlayerDialogResponse PlayerId: 0\r\n *           dialog ID doesn't match last sent dialog ID\".\r\n * SOLUTION: Hide it.\r\n * SEE:      \"OnPlayerConnect\", \"OnGameModeExit\".\r\n * AUTHOR:   xX_Simon_Xx\r\n * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/2\r\n * \r\n * FIX:      SetSpawnInfo\r\n * PROBLEM:  Kicks the player if \"SpawnPlayer\" is called before \"SetSpawnInfo\".\r\n * SOLUTION: Call \"SetSpawnInfo\" at least once.\r\n * SEE:      \"OnPlayerConnect\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      SetPlayerSkin\r\n * PROBLEM:  Breaks sitting on bikes.\r\n * SOLUTION: Put them back in the vehicle after setting their skin.\r\n * SEE:      \"FIXES_SetPlayerSkin\".\r\n * AUTHOR:   CyNiC\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1756094\r\n * \r\n * FIX:      HideMenuForPlayer\r\n * PROBLEM:  Crashes when passed an invalid menu ID.\r\n * SOLUTION: Don't hide it when passed an invalid menu.\r\n * SEE:      \"FIXES_HideMenuForPlayer\".\r\n * AUTHOR:   Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1787297\r\n * \r\n * FIX:      valstr\r\n * PROBLEM:  Crashes on large numbers.\r\n * SOLUTION: Use \"format\" instead.\r\n * SEE:      \"FIXES_valstr\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1790300\r\n * \r\n * FIX:      fclose\r\n * PROBLEM:  Crashes on an invalid handle.\r\n * SOLUTION: Check for an invalid handle.\r\n * SEE:      \"FIXES_fclose\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1790300\r\n * \r\n * FIX:      fwrite\r\n * PROBLEM:  Crashes on an invalid handle.\r\n * SOLUTION: Check for an invalid handle.\r\n * SEE:      \"FIXES_fwrite\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1790300\r\n * \r\n * FIX:      fread\r\n * PROBLEM:  Crashes on an invalid handle.\r\n * SOLUTION: Check for an invalid handle.\r\n * SEE:      \"FIXES_fread\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1790300\r\n * \r\n * FIX:      fputchar\r\n * PROBLEM:  Crashes on an invalid handle.\r\n * SOLUTION: Check for an invalid handle.\r\n * SEE:      \"FIXES_fputchar\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1790300\r\n * \r\n * FIX:      fgetchar\r\n * PROBLEM:  Crashes on an invalid handle.\r\n * SOLUTION: Check for an invalid handle.\r\n * SEE:      \"FIXES_fgetchar\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1790300\r\n * \r\n * FIX:      fblockwrite\r\n * PROBLEM:  Crashes on an invalid handle.\r\n * SOLUTION: Check for an invalid handle.\r\n * SEE:      \"FIXES_fblockwrite\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1790300\r\n * \r\n * FIX:      fblockread\r\n * PROBLEM:  Crashes on an invalid handle.\r\n * SOLUTION: Check for an invalid handle.\r\n * SEE:      \"FIXES_fblockread\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1790300\r\n * \r\n * FIX:      fseek\r\n * PROBLEM:  Crashes on an invalid handle.\r\n * SOLUTION: Check for an invalid handle.\r\n * SEE:      \"FIXES_fseek\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1790300\r\n * \r\n * FIX:      flength\r\n * PROBLEM:  Crashes on an invalid handle.\r\n * SOLUTION: Check for an invalid handle.\r\n * SEE:      \"FIXES_flength\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1790300\r\n * \r\n * FIX:      file_inc\r\n * PROBLEM:  Includes or excludes all the file function fixes together (can\r\n *           cause major overhead).\r\n * SOLUTION: Optionally group them all under one define.  DEFAULTS TO FALSE!\r\n * SEE:      \"FIX_file_inc\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      IsPlayerAttachedObjectSlotUsed\r\n * PROBLEM:  Doesn't work in OnPlayerDisconnect.\r\n * SOLUTION: Maintain an internal record of slots used.\r\n * SEE:      \"FIXES_SetPlayerAttachedObject\",\r\n *           \"FIXES_RemovePlayerAttachedObject\",\r\n *           \"FIXES_IsPAttachedObjectSlotUsed\", and\r\n *           \"OnPlayerDisconnect\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      SetPlayerAttachedObject\r\n * PROBLEM:  Doesn't remove objects when the mode ends.\r\n * SOLUTION: Remove them.\r\n * SEE:      \"FIXES_SetPlayerAttachedObject\",\r\n *           \"FIXES_RemovePlayerAttachedObject\", and\r\n *           \"OnPlayerDisconnect\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      OnPlayerDeath\r\n * PROBLEM:  Clients get stuck when they die with an animation applied.\r\n * SOLUTION: Clear their animations.\r\n * SEE:      \"OnPlayerDeath\" and \"OnPlayerUpdate\".\r\n * AUTHOR:   h02\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1641144\r\n * \r\n * FIX:      strins\r\n * PROBLEM:  Ignores the \"maxlength\" parameter causing possible crashes.\r\n * SOLUTION: Manually check the length.\r\n * SEE:      \"FIXES_strins\".\r\n * AUTHOR:   Slice/Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1860495\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1864706\r\n * \r\n * FIX:      IsPlayerConnected\r\n * PROBLEM:  Only uses the lower two bytes of a passed ID.\r\n * SOLUTION: Mask the numbers.\r\n * SEE:      \"FIXES_IsPlayerConnected\".\r\n * AUTHOR:   Slice\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1860464\r\n * \r\n * FIX:      OnPlayerCommandText\r\n * PROBLEM:  Can crash ZCMD when passed a null string.\r\n * SOLUTION: Pass NULL if invalid inputs given.\r\n * SEE:      \"OnPlayerCommandText\".\r\n * AUTHOR:   Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1909511\r\n * \r\n * FIX:      TrainExit\r\n * PROBLEM:  When getting out of a train entered by \"PutPlayerInVehicle\", the\r\n *           camera does not reset properly.\r\n * SOLUTION: Reset the camera.\r\n * SEE:      \"FIXES_PutPlayerInVehicle\", \"FIXES_OnPlayerStateChange\".\r\n * AUTHOR:   Terminator3/Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1980214\r\n * \r\n * FIX:      Kick\r\n * PROBLEM:  Calling \"Kick\" in \"OnPlayerConnect\" doesn't work properly.\r\n * SOLUTION: Defer it.\r\n * SEE:      \"OnPlayerConnect\", \"FIXES_Kick\".\r\n * AUTHOR:   Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1989453\r\n * FIXED IN: 0.3x\r\n * \r\n * FIX:      OnVehicleMod\r\n * PROBLEM:  Crashes other players when invalid mods are applied.\r\n * SOLUTION: Desync the player.\r\n * SEE:      \"OnVehicleMod\".\r\n * AUTHOR:   JernejL/Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1671500\r\n * \r\n * FIX:      random\r\n * PROBLEM:  Doesn't work with negative numbers.\r\n * SOLUTION: Invert then reinvert.  DEFAULTS TO FALSE!\r\n * SEE:      \"FIXES_random\".\r\n * AUTHOR:   xX_Simon_Xx\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=2141254\r\n * \r\n * FIX:      sleep\r\n * PROBLEM:  Leaks bytes from the stack.\r\n * SOLUTION: Call a function to store the correct value.\r\n * SEE:      \"FIXES_sleep\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      AddMenuItem\r\n * PROBLEM:  Crashes when passed an invalid menu ID.\r\n * SOLUTION: Don't hide it when passed an invalid menu.\r\n * SEE:      \"FIXES_AddMenuItem\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      SetMenuColumnHeader\r\n * PROBLEM:  Crashes when passed an invalid menu ID.\r\n * SOLUTION: Don't hide it when passed an invalid menu.\r\n * SEE:      \"FIXES_SetMenuColumnHeader\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      ShowMenuForPlayer\r\n * PROBLEM:  Crashes when passed an invalid menu ID.\r\n * SOLUTION: Don't hide it when passed an invalid menu.\r\n * SEE:      \"FIXES_ShowMenuForPlayer\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      HideMenuForPlayer\r\n * PROBLEM:  Crashes when passed an invalid menu ID.\r\n * SOLUTION: Don't hide it when passed an invalid menu.\r\n * SEE:      \"FIXES_HideMenuForPlayer\".\r\n * AUTHOR:   Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1787297\r\n * \r\n * FIX:      HideMenuForPlayer_2\r\n * PROBLEM:  Ignores the \"menuid\" parameter.\r\n * SOLUTION: Only hide the correct menu.  DEFAULTS TO FALSE!\r\n * SEE:      \"FIXES_HideMenuForPlayer\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      DisableMenu\r\n * PROBLEM:  Crashes when passed an invalid menu ID.\r\n * SOLUTION: Don't hide it when passed an invalid menu.\r\n * SEE:      \"FIXES_DisableMenu\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      DisableMenuRow\r\n * PROBLEM:  Crashes when passed an invalid menu ID.\r\n * SOLUTION: Don't hide it when passed an invalid menu.\r\n * SEE:      \"FIXES_DisableMenuRow\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      Menus\r\n * PROBLEM:  All menu function fixes are included separately for major overhead.\r\n * SOLUTION: Optionally group them all under one define.\r\n * SEE:      \"FIX_Menus\", \"_FIX_Menus\"\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      GetPlayerMenu\r\n * PROBLEM:  Returns previous menu when none is displayed.\r\n * SOLUTION: Return the correct value.\r\n * SEE:      \"FIXES_GetPlayerMenu\", \"OnPlayerSelectedMenuRow\".\r\n * AUTHOR:   Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=2295867\r\n * \r\n * FIX:      GetPlayerInterior\r\n * PROBLEM:  Always returns 0 for NPCs.\r\n * SOLUTION: Return the correct value.\r\n * SEE:      \"FIXES_GetPlayerInterior\", \"FIXES_SetPlayerInterior\".\r\n * AUTHOR:   Y_Less/xX_Simon_Xx\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=2309246\r\n * \r\n * FIX:      ClearAnimations\r\n * PROBLEM:  Use ClearAnimation while you are in a vehicle cause the player exit\r\n *           from it.\r\n * SOLUTION: Apply an animation instead of clear animation.\r\n * SEE:      \"FIXES_ClearAnimations\".\r\n * AUTHOR:   xX_Simon_Xx\r\n * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/4\r\n * \r\n * FIX:      ClearAnimations_2\r\n * PROBLEM:  ClearAnimations doesn't do anything when the animation ends if we\r\n *           pass 1 for the freeze parameter in ApplyAnimation.\r\n * SOLUTION: Apply an idle animation for stop and then use ClearAnimation.\r\n * SEE:      \"FIXES_ClearAnimations\".\r\n * AUTHOR:   xX_Simon_Xx\r\n * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/4\r\n * \r\n * FIX:      DriveBy\r\n * PROBLEM:  If you press KEY_CROUCH while you're passenger and if you are\r\n *           armed, the player start to aim; if you repress KEY_CROUCH the\r\n *           player don't return in vehicle.\r\n * SOLUTION: Apply the animation to return the player in the vehicle.\r\n * SEE:      \"OnPlayerKeyStateChange\".\r\n * AUTHOR:   xX_Simon_Xx\r\n * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/13\r\n * \r\n * FIX:      GangZoneCreate\r\n * PROBLEM:  Gang zones bug on the main map for players at certain angles\r\n *           relative to them.\r\n * SOLUTION: Set a non floating value for the gang zone co-ordinate.\r\n * SEE:      \"FIXES_GangZoneCreate\".\r\n * AUTHOR:   xX_Simon_Xx/Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=2144109\r\n * \r\n * FIX:      SPECIAL_ACTION_PISSING\r\n * PROBLEM:  \"SPECIAL_ACTION_PISSING\" isn't defined by default.\r\n * SOLUTION: Define it.\r\n * SEE:      N/A.\r\n * AUTHOR:   xX_Simon_Xx\r\n * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/6\r\n * \r\n * FIX:      IsValidVehicle\r\n * PROBLEM:  \"IsValidVehicle\" isn't defined by default.\r\n * SOLUTION: Define it.\r\n * SEE:      N/A.\r\n * AUTHOR:   xX_Simon_Xx\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=2693650\r\n * \r\n * FIX:      ApplyAnimation\r\n * PROBLEM:  Passing an invalid animation library in ApplyAnimation causes a\r\n *           client crash for streamed in players.\r\n * SOLUTION: Block ApplyAnimation when an invalid library is passed.\r\n * SEE:      \"FIXES_ApplyAnimation\".\r\n * AUTHOR:   xX_Simon_Xx\r\n * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/5\r\n * \r\n * FIX:      ApplyAnimation_2\r\n * PROBLEM:  First time a library is used, it does nothing.\r\n * SOLUTION: Apply animations twice when first using a library.\r\n * SEE:      \"FIXES_ApplyAnimation\".\r\n * AUTHOR:   xX_Simon_Xx/Lordzy/Y_Less\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=3052627\r\n * \r\n * FIX:      OnPlayerSpawn\r\n * PROBLEM:  San Andreas deducts $100 from players.\r\n * SOLUTION: Give them it back.\r\n * SEE:      \"OnPlayerSpawn\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      GetGravity\r\n * PROBLEM:  \"GetGravity\" isn't defined by default.\r\n * SOLUTION: Define it.\r\n * SEE:      N/A.\r\n * AUTHOR:   Whitetiger\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1706447\r\n * \r\n * FIX:      gpci\r\n * PROBLEM:  \"gpci\" isn't defined by default.\r\n * SOLUTION: Define it.\r\n * SEE:      N/A.\r\n * AUTHOR:   xX_Simon_Xx\r\n * POST:     http://pastebin.com/VQSGpbSm\r\n * \r\n * FIX:      Natives\r\n * PROBLEM:  Several natives are included by default, this enables or disables\r\n *           them all.  Therefore this is an umbrella fix for several fixes.\r\n * SOLUTION: Define them.\r\n * SEE:      \"FIX_GetGravity\", \"FIX_gpci\", \"FIX_IsValidVehicle\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      OnPlayerConnect\r\n * PROBLEM:  This function isn't called for players when a filterscript starts.\r\n * SOLUTION: Call it for all connected players.\r\n * SEE:      \"FIXES_OnFilterScriptInit\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      OnPlayerDisconnect\r\n * PROBLEM:  This function isn't called for players when a filterscript ends.\r\n * SOLUTION: Call it for all connected players.\r\n * SEE:      \"FIXES_OnFilterScriptExit\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      GameText\r\n * PROBLEM:  Several styles do not display for the time specified.\r\n * SOLUTION: Recreate the styles in Text Draws and use those instead.\r\n * SEE:      \"FIXES_GameTextForAll\", \"FIXES_GameTextForPlayer\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      GameTextStyles\r\n * PROBLEM:  San Andreas has fixed styles for area and vehicle names, but they\r\n *           are not included in the GameText styles list.\r\n * SOLUTION: Add them.  DEFAULTS TO FALSE.\r\n * SEE:      \"FIXES_GameTextForAll\", \"FIXES_GameTextForPlayer\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      HideGameText\r\n * PROBLEM:  There is no \"HideGameTextForXYZ\" function.\r\n * SOLUTION: Show a single space for a game text.  DEFAULTS TO FALSE.\r\n * SEE:      \"FIXES_HideGameTextForAll\", \"FIXES_HideGameTextForPlayer\".\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      BODYPARTS\r\n * PROBLEM:  The bodyparts to be used in OnPlayer(Take/Give)Damage are not\r\n *           defined by default\r\n * SOLUTION: Define it.\r\n * SEE:      N/A.\r\n * AUTHOR:   Whitetiger\r\n * \r\n * FIX:      CAMERAMODES\r\n * PROBLEM:  The camera modes for GetPlayerCameraMode are not defined by\r\n *           default.\r\n * SOLUTION: Define it.\r\n * SEE:      N/A.\r\n * AUTHOR:   Whitetiger\r\n * POST:     http://forum.sa-mp.com/showpost.php?p=1309730\r\n * \r\n * FIX:      SetPlayerCamera\r\n * PROBLEM:  Using the camera functions directly after enabling spectator mode\r\n *           doesn't work.\r\n * SOLUTION: Defer them.\r\n * SEE:      \"FIXES_SetPlayerCameraPos\", \"FIXES_SetPlayerCameraLookAt\",\r\n *           \"FIXES_TogglePlayerSpectating\".\r\n * AUTHOR:   Emmet_\r\n * \r\n * FIX:      SetPlayerTime\r\n * PROBLEM:  Using this function under \"OnPlayerConnect\" doesn't work.\r\n * SOLUTION: Defer it.\r\n * SEE:      \"FIXES_SetPlayerTime\"\r\n * AUTHOR:   Emmet_\r\n * \r\n * FIX:      OnPlayerRequestClass\r\n * PROBLEM:  Random blunts and bottles sometimes appear in class selection.\r\n * SOLUTION: Call \"RemoveBuildingForPlayer\".\r\n * SEE:      \"OnPlayerRequestClass\"\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      SetPlayerColor\r\n * PROBLEM:  If used under OnPlayerConnect, the affecting player will not\r\n *           see the color in the TAB menu.\r\n * SOLUTION: Defer it.\r\n * SEE:      \"FIXES_SetPlayerColor\"\r\n * AUTHOR:   Emmet_\r\n * POST:     http://forum.sa-mp.com/showthread.php?t=452407  \r\n * \r\n * FIX:      FileMaths\r\n * PROBLEM:  You can write gibberish like \"File:a; ++a;\".\r\n * SOLUTION: Remove the operators.\r\n * SEE:      \"File:operator\"\r\n * AUTHOR:   Y_Less\r\n * \r\n * FIX:      GetPlayerWeaponData\r\n * PROBLEM:  Old weapons with no ammo left are still returned.\r\n * SOLUTION: Set \"weapons\" to 0.  DEFAULTS TO FALSE!\r\n * SEE:      \"FIXES_GetPlayerWeaponData\"\r\n * AUTHOR:   Y_Less\r\n * POST:     http://forum.sa-mp.com/showthread.php?t=567400\r\n * \r\n * ==============\r\n *  STYLE RULES: \r\n * ==============\r\n * \r\n * All globals should be \"static stock\" whenever possible (so they can only be\r\n *     accessed from this one file).\r\n * \r\n * Statics must start with \"FIXES_gs\", and all other globals with \"FIXES_g\".\r\n * \r\n * All functions not overriding existing functions must start with \"FIXES_\".\r\n * \r\n * Macros must be upper case, use underscores, and start \"FIXES_\":\r\n *     \"FIXES_LIKE_THIS\".\r\n * \r\n * Functions should be upper camel case (as the original functions are)\r\n *     \"FIXES_LikeThis\".\r\n * \r\n * Globals (after the prefix) should be upper camel case \"LikeThis\", and locals\r\n *     lower camel case \"likeThis\".\r\n * \r\n * ALS should be used to hook functions and callbacks.  See this topic for more\r\n *    details:\r\n *    \r\n *        http://forum.sa-mp.com/showthread.php?t=441293\r\n * \r\n * The ALS prefix for chaining is \"FIXES_\".\r\n * \r\n * When redefining a native, add a \"BAD_\" external name declaration with the\r\n *     \"_ALS_\" definition so that others may use the original native if they so\r\n *     desire (with the caveat that it may break all fixes).  Note the \"BAD_\"\r\n *     name is meant to indicate the possibility of breaking the fix, not a\r\n *     comment on the original native function.\r\n * \r\n * The ALS hook defines used here are a little different to the normal ones as\r\n *     this file assumes that it is always first.  The pattern is:\r\n *     \r\n *         #if defined _ALS_NameOfFixHere\r\n *             #error _ALS_NameOfFixHere defined\r\n *         #endif\r\n *         native BAD_NameOfFixHere(params) = NameOfFixHere;\r\n *         \r\n *         #if FIX_NameOfFixHere\r\n *             stock FIXES_NameOfFixHere(params)\r\n *             {\r\n *                 return 0;\r\n *             }\r\n *             \r\n *             #define _ALS_NameOfFixHere\r\n *             #define NameOfFixHere FIXES_NameOfFixHere\r\n *         #endif\r\n *    \r\n *    A copyable version of this pattern is at the end of the file.\r\n * \r\n * Enums start with \"E_\" or \"e_\" depending on type, then follow rules for\r\n *     macros.\r\n * \r\n * NO libraries should be included - not even the default SA:MP ones.  Let the\r\n *     user do it.\r\n * \r\n * Due to the above rule, you cannot assume any third party libraries AT ALL, so\r\n *     do not use them.  This can lead to some code duplication, but also means\r\n *     that the version of the code used here can be tailored for optimisations.\r\n * \r\n * Certain terms may be shortened when dealing with long callback names to avoid\r\n *     compile truncation warnings (max symbol length is 31).  Current list:\r\n *     \r\n *         \"Checkpoint\" -> \"CP\"\r\n *         \"Update\"     -> \"Upd\"\r\n *         \"TextDraw\"   -> \"TD\"\r\n *         \"Object\"     -> \"Obj\"\r\n *         \"Player\"     -> \"P\"\r\n * \r\n * Document all fixes at the top of the file, and highlight code.\r\n * \r\n * 4 space TABS - do not edit this file in PAWNO unless you know how to correct\r\n *     the indentation.\r\n * \r\n * All rules have exceptions, but they must be justifiable.  For example\r\n *     \"IS_FILTERSCRIPT\" is a global variable, but is not called\r\n *     \"FIXES_gIsFilterscript\" to better match the \"FILTERSCRIPT\" macro it\r\n *     replaces.  Now a macro for \"_FIXES_gIsFilterscript\".\r\n * \r\n * Variables which need to be fully global (i.e. not \"static\"), but should not\r\n *     actually be used by other people (e.g. appear inside a macro) should be\r\n *     prefixed with \"_FIXES\" instead of \"FIXES\" to indicate their private use.\r\n * \r\n * No comments beyond the end of column 80 (where the line in \"PAWNO\" is).\r\n * \r\n * If a bug is fixed in some version of the server it can be conditionally\r\n *     included here.  This is done by checking for the existance of a native\r\n *     function introduced in the same server version.  For example\r\n *     \"TogglePlayerControllable\" was fixed in 0.3eRC6, the same time as the\r\n *     \"SetObjectMaterial\" native was introduced, thus the inclusion becomes:\r\n *     \r\n *         #if !defined FIX_TogglePlayerControllable\r\n *             #if defined SetObjectMaterial\r\n *                 #define FIX_TogglePlayerControllable (0)\r\n *             #else\r\n *                 #define FIX_TogglePlayerControllable (1)\r\n *             #endif\r\n *         #elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable)\r\n *             #undef FIX_TogglePlayerControllable\r\n *             #define FIX_TogglePlayerControllable     (2)\r\n *         #endif\r\n *     \r\n *     This only includes this fix if that native doesn't exist.  A copyable\r\n *     version of this pattern is at the end of the file.\r\n * \r\n * To reduce general memory consumption, strings in this include are stored\r\n *     globally in constant arrays and referenced.  This is EXACTLY as fast as\r\n *     using the string constants directly, but means that strings are not\r\n *     stored in the assembly multiple times (unless the string is only used\r\n *     once, in which case it's more work for no gain).  See this post for more\r\n *     details:\r\n *     \r\n *         http://forum.sa-mp.com/showpost.php?p=1795601\r\n * \r\n * DO NOT EDIT THIS FILE IN PAWNO OR ON GITHUB.  Both mess up the spacing -\r\n *     GitHub in an almost irreversible way (except for the fact that nothing is\r\n *     irreversible in source control.  Pawno spacing is less tricky to solve,\r\n *     and can be worked around if you know when it uses spaces and tabs - in\r\n *     short, always write code first THEN indent and you won't have a problem\r\n *     (in that editor at least, that is normally a bad way to write code).\r\n * \r\n * Documentation explanation:\r\n *     \r\n *         FIX:      <Short name>\r\n *         PROBLEM:  <Description of problem>\r\n *         SOLUTION: <Description of solution>\r\n *         SEE:      <List of relevant functions>\r\n *         AUTHOR:   <Person who wrote the fix>\r\n *         POST:     <Optional link to the original post where applicable>\r\n *         FIXED IN: <Optional server version of official fix where applicable>\r\n * \r\n */\r\n\r\n#if defined _INC_SAMP_Community_fixes\r\n\t#endinput\r\n#endif\r\n#define _INC_SAMP_Community_fixes\r\n\r\n#if !defined _inc_fixes\r\n\t#define _inc_fixes\r\n#endif\r\n\r\n#define _FIXES_IS_UNSET(%0) ((2*%0-1+1)==-1)\r\n\r\n// We can add server version compiler code here to only compile fixes that apply\r\n// to the version of the includes for which the user is compiling.\r\n#if !defined FIX_GetPlayerColour\r\n\t#if defined FIX_GetPlayerColor\r\n\t\t#if _FIXES_IS_UNSET(FIX_GetPlayerColor)\r\n\t\t\t#define FIX_GetPlayerColour   (2)\r\n\t\t#else\r\n\t\t\t#define FIX_GetPlayerColour   (FIX_GetPlayerColor)\r\n\t\t#endif\r\n\t#else\r\n\t\t#define FIX_GetPlayerColour       (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_GetPlayerColour)\r\n\t#undef FIX_GetPlayerColour\r\n\t#define FIX_GetPlayerColour           (2)\r\n#endif\r\n\r\n#if !defined FIX_FILTERSCRIPT\r\n\t#define FIX_FILTERSCRIPT             (1)\r\n#elseif _FIXES_IS_UNSET(FIX_FILTERSCRIPT)\r\n\t#undef FIX_FILTERSCRIPT\r\n\t#define FIX_FILTERSCRIPT             (2)\r\n#endif\r\n\r\n#if !defined FIX_SpawnPlayer\r\n\t#define FIX_SpawnPlayer              (1)\r\n#elseif _FIXES_IS_UNSET(FIX_SpawnPlayer)\r\n\t#undef FIX_SpawnPlayer\r\n\t#define FIX_SpawnPlayer              (2)\r\n#endif\r\n\r\n#if !defined FIX_SetPlayerName\r\n\t#define FIX_SetPlayerName            (1)\r\n#elseif _FIXES_IS_UNSET(FIX_SetPlayerName)\r\n\t#undef FIX_SetPlayerName\r\n\t#define FIX_SetPlayerName            (2)\r\n#endif\r\n\r\n#if !defined FIX_GetPlayerSkin\r\n\t#define FIX_GetPlayerSkin            (1)\r\n#elseif _FIXES_IS_UNSET(FIX_GetPlayerSkin)\r\n\t#undef FIX_GetPlayerSkin\r\n\t#define FIX_GetPlayerSkin            (2)\r\n#endif\r\n\r\n#if !defined FIX_GetWeaponName\r\n\t#define FIX_GetWeaponName            (1)\r\n#elseif _FIXES_IS_UNSET(FIX_GetWeaponName)\r\n\t#undef FIX_GetWeaponName\r\n\t#define FIX_GetWeaponName            (2)\r\n#endif\r\n\r\n#if !defined FIX_SetPlayerWorldBounds\r\n\t#define FIX_SetPlayerWorldBounds     (1)\r\n#elseif _FIXES_IS_UNSET(FIX_SetPlayerWorldBounds)\r\n\t#undef FIX_SetPlayerWorldBounds\r\n\t#define FIX_SetPlayerWorldBounds     (2)\r\n#endif\r\n\r\n#if !defined FIX_TogglePlayerControllable\r\n\t#if defined SetObjectMaterial\r\n\t\t#define FIX_TogglePlayerControllable (0)\r\n\t#else\r\n\t\t#define FIX_TogglePlayerControllable (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable)\r\n\t#undef FIX_TogglePlayerControllable\r\n\t#define FIX_TogglePlayerControllable (2)\r\n#endif\r\n\r\n#if !defined FIX_HydraSniper\r\n\t#define FIX_HydraSniper              (1)\r\n#elseif _FIXES_IS_UNSET(FIX_HydraSniper)\r\n\t#undef FIX_HydraSniper\r\n\t#define FIX_HydraSniper              (2)\r\n#endif\r\n\r\n#if !defined FIX_IsPlayerInCheckpoint\r\n\t#define FIX_IsPlayerInCheckpoint     (1)\r\n#elseif _FIXES_IS_UNSET(FIX_IsPlayerInCheckpoint)\r\n\t#undef FIX_IsPlayerInCheckpoint\r\n\t#define FIX_IsPlayerInCheckpoint     (2)\r\n#endif\r\n\r\n#if !defined FIX_IsPlayerInRaceCheckpoint\r\n\t#define FIX_IsPlayerInRaceCheckpoint (1)\r\n#elseif _FIXES_IS_UNSET(FIX_IsPlayerInRaceCheckpoint)\r\n\t#undef FIX_IsPlayerInRaceCheckpoint\r\n\t#define FIX_IsPlayerInRaceCheckpoint (2)\r\n#endif\r\n\r\n#if !defined FIX_GetPlayerWeapon\r\n\t#define FIX_GetPlayerWeapon          (1)\r\n#elseif _FIXES_IS_UNSET(FIX_GetPlayerWeapon)\r\n\t#undef FIX_GetPlayerWeapon\r\n\t#define FIX_GetPlayerWeapon          (2)\r\n#endif\r\n\r\n#if !defined FIX_PutPlayerInVehicle\r\n\t#define FIX_PutPlayerInVehicle       (1)\r\n#elseif _FIXES_IS_UNSET(FIX_PutPlayerInVehicle)\r\n\t#undef FIX_PutPlayerInVehicle\r\n\t#define FIX_PutPlayerInVehicle       (2)\r\n#endif\r\n\r\n#if !defined FIX_KEY_AIM\r\n\t#if defined KEY_AIM\r\n\t\t#define FIX_KEY_AIM              (0)\r\n\t#else\r\n\t\t#define FIX_KEY_AIM              (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_KEY_AIM)\r\n\t#undef FIX_KEY_AIM\r\n\t#define FIX_KEY_AIM                  (2)\r\n#endif\r\n\r\n#if !defined FIX_SPECIAL_ACTION_PISSING\r\n\t#if defined SPECIAL_ACTION_PISSING\r\n\t\t#define FIX_SPECIAL_ACTION_PISSING (0)\r\n\t#else\r\n\t\t#define FIX_SPECIAL_ACTION_PISSING (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_SPECIAL_ACTION_PISSING)\r\n\t#undef FIX_SPECIAL_ACTION_PISSING\r\n\t#define FIX_SPECIAL_ACTION_PISSING   (2)\r\n#endif\r\n\r\n#if !defined FIX_Natives\r\n\t#define FIX_Natives                  (1)\r\n#elseif _FIXES_IS_UNSET(FIX_Natives)\r\n\t#undef FIX_Natives\r\n\t#define FIX_Natives                  (2)\r\n#endif\r\n\r\n#if !defined FIX_IsValidVehicle\r\n\t#if defined IsValidVehicle\r\n\t\t#define FIX_IsValidVehicle       (0)\r\n\t#else\r\n\t\t#define FIX_IsValidVehicle       (FIX_Natives)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_IsValidVehicle)\r\n\t#undef FIX_IsValidVehicle\r\n\t#define FIX_IsValidVehicle           (2)\r\n#endif\r\n\r\n#if !defined FIX_GetGravity\r\n\t#if defined GetGravity\r\n\t\t#define FIX_GetGravity           (0)\r\n\t#else\r\n\t\t#define FIX_GetGravity           (FIX_Natives)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_GetGravity)\r\n\t#undef FIX_GetGravity\r\n\t#define FIX_GetGravity               (2)\r\n#endif\r\n\r\n#if !defined FIX_gpci\r\n\t#if defined gpci\r\n\t\t#define FIX_gpci                 (0)\r\n\t#else\r\n\t\t#define FIX_gpci                 (FIX_Natives)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_gpci)\r\n\t#undef FIX_gpci\r\n\t#define FIX_gpci                     (2)\r\n#endif\r\n\r\n#if !defined FIX_BODYPARTS\r\n\t#if defined BODY_PART_TORSO\r\n\t\t#define FIX_BODYPARTS            (0)\r\n\t#else\r\n\t\t#define FIX_BODYPARTS            (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_BODYPARTS)\r\n\t#undef FIX_BODYPARTS\r\n\t#define FIX_BODYPARTS                (2)\r\n#endif\r\n\r\n#if !defined FIX_CAMERAMODES\r\n\t#if defined CAM_MODE_NONE\r\n\t\t#define FIX_CAMERAMODES          (0)\r\n\t#else\r\n\t\t#define FIX_CAMERAMODES          (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_CAMERAMODES)\r\n\t#undef FIX_CAMERAMODES\r\n\t#define FIX_CAMERAMODES              (2)\r\n#endif\r\n\r\n#if !defined FIX_DriveBy\r\n\t#define FIX_DriveBy                  (1)\r\n#elseif _FIXES_IS_UNSET(FIX_DriveBy)\r\n\t#undef FIX_DriveBy\r\n\t#define FIX_DriveBy                  (2)\r\n#endif\r\n\r\n#if !defined FIX_SetPlayerCheckpoint\r\n\t#define FIX_SetPlayerCheckpoint      (1)\r\n#elseif _FIXES_IS_UNSET(FIX_SetPlayerCheckpoint)\r\n\t#undef FIX_SetPlayerCheckpoint\r\n\t#define FIX_SetPlayerCheckpoint      (2)\r\n#endif\r\n\r\n#if !defined FIX_SetPlayerRaceCheckpoint\r\n\t#define FIX_SetPlayerRaceCheckpoint  (1)\r\n#elseif _FIXES_IS_UNSET(FIX_SetPlayerRaceCheckpoint)\r\n\t#undef FIX_SetPlayerRaceCheckpoint\r\n\t#define FIX_SetPlayerRaceCheckpoint  (2)\r\n#endif\r\n\r\n#if !defined FIX_TextDrawCreate\r\n\t#define FIX_TextDrawCreate           (1)\r\n#elseif _FIXES_IS_UNSET(FIX_TextDrawCreate)\r\n\t#undef FIX_TextDrawCreate\r\n\t#define FIX_TextDrawCreate           (2)\r\n#endif\r\n\r\n#if !defined FIX_TextDrawSetString\r\n\t#define FIX_TextDrawSetString        (1)\r\n#elseif _FIXES_IS_UNSET(FIX_TextDrawSetString)\r\n\t#undef FIX_TextDrawSetString\r\n\t#define FIX_TextDrawSetString        (2)\r\n#endif\r\n\r\n#if !defined FIX_AllowInteriorWeapons\r\n\t#define FIX_AllowInteriorWeapons     (1)\r\n#elseif _FIXES_IS_UNSET(FIX_AllowInteriorWeapons)\r\n\t#undef FIX_AllowInteriorWeapons\r\n\t#define FIX_AllowInteriorWeapons     (2)\r\n#endif\r\n\r\n#if !defined FIX_OnPlayerEnterVehicle\r\n\t#if defined OnPlayerClickMap\r\n\t\t#define FIX_OnPlayerEnterVehicle (0)\r\n\t#else\r\n\t\t#define FIX_OnPlayerEnterVehicle (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle)\r\n\t#undef FIX_OnPlayerEnterVehicle\r\n\t#define FIX_OnPlayerEnterVehicle     (2)\r\n#endif\r\n\r\n#if !defined FIX_OnPlayerEnterVehicle_2\r\n\t#define FIX_OnPlayerEnterVehicle_2   (1)\r\n#elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle)\r\n\t#undef FIX_OnPlayerEnterVehicle_2\r\n\t#define FIX_OnPlayerEnterVehicle_2   (2)\r\n#endif\r\n\r\n#if !defined FIX_AllowTeleport\r\n\t#if defined OnPlayerClickMap\r\n\t\t#define FIX_AllowTeleport        (1)\r\n\t#else\r\n\t\t#define FIX_AllowTeleport        (0)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_AllowTeleport)\r\n\t#undef FIX_AllowTeleport\r\n\t#define FIX_AllowTeleport            (2)\r\n#endif\r\n\r\n#if !defined FIX_SetPlayerSpecialAction\r\n\t#define FIX_SetPlayerSpecialAction   (1)\r\n#elseif _FIXES_IS_UNSET(FIX_SetPlayerSpecialAction)\r\n\t#undef FIX_SetPlayerSpecialAction\r\n\t#define FIX_SetPlayerSpecialAction   (2)\r\n#endif\r\n\r\n#if !defined FIX_ClearAnimations\r\n\t#define FIX_ClearAnimations          (1)\r\n#elseif _FIXES_IS_UNSET(FIX_ClearAnimations)\r\n\t#undef FIX_ClearAnimations\r\n\t#define FIX_ClearAnimations          (2)\r\n#endif\r\n\r\n#if !defined FIX_ClearAnimations_2\r\n\t#define FIX_ClearAnimations_2        (1)\r\n#elseif _FIXES_IS_UNSET(FIX_ClearAnimations_2)\r\n\t#undef FIX_ClearAnimations_2\r\n\t#define FIX_ClearAnimations_2        (2)\r\n#endif\r\n\r\n#if !defined FIX_GangZoneCreate\r\n\t#define FIX_GangZoneCreate           (1)\r\n#elseif _FIXES_IS_UNSET(FIX_GangZoneCreate)\r\n\t#undef FIX_GangZoneCreate\r\n\t#define FIX_GangZoneCreate           (2)\r\n#endif\r\n\r\n#if !defined FIX_OnDialogResponse\r\n\t#if defined GetVehicleModelInfo\r\n\t\t#define FIX_OnDialogResponse     (0)\r\n\t#else\r\n\t\t#define FIX_OnDialogResponse     (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_OnDialogResponse)\r\n\t#undef FIX_OnDialogResponse\r\n\t#define FIX_OnDialogResponse         (2)\r\n#endif\r\n\r\n#if !defined FIX_GetPlayerDialog\r\n\t#define FIX_GetPlayerDialog          (0)\r\n#elseif _FIXES_IS_UNSET(FIX_GetPlayerDialog)\r\n\t#undef FIX_GetPlayerDialog\r\n\t#define FIX_GetPlayerDialog          (2)\r\n#endif\r\n\r\n#if !defined FIX_PlayerDialogResponse\r\n\t#define FIX_PlayerDialogResponse     (1)\r\n#elseif _FIXES_IS_UNSET(FIX_PlayerDialogResponse)\r\n\t#undef FIX_PlayerDialogResponse\r\n\t#define FIX_PlayerDialogResponse     (2)\r\n#endif\r\n\r\n#if !defined FIX_SetSpawnInfo\r\n\t#if defined GetPlayerVersion\r\n\t\t#define FIX_SetSpawnInfo         (0)\r\n\t#else\r\n\t\t#define FIX_SetSpawnInfo         (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_SetSpawnInfo)\r\n\t#undef FIX_SetSpawnInfo\r\n\t#define FIX_SetSpawnInfo             (2)\r\n#endif\r\n\r\n#if !defined FIX_SetPlayerSkin\r\n\t#define FIX_SetPlayerSkin            (1)\r\n#elseif _FIXES_IS_UNSET(FIX_SetPlayerSkin)\r\n\t#undef FIX_SetPlayerSkin\r\n\t#define FIX_SetPlayerSkin            (2)\r\n#endif\r\n\r\n#if !defined FIX_HideMenuForPlayer\r\n\t#define FIX_HideMenuForPlayer        (1)\r\n#elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer)\r\n\t#undef FIX_HideMenuForPlayer\r\n\t#define FIX_HideMenuForPlayer        (2)\r\n#endif\r\n\r\n#if !defined FIX_valstr\r\n\t#define FIX_valstr                   (1)\r\n#elseif _FIXES_IS_UNSET(FIX_valstr)\r\n\t#undef FIX_valstr\r\n\t#define FIX_valstr                   (2)\r\n#endif\r\n\r\n#if !defined FIX_file_inc\r\n\t#define FIX_file_inc                 (0)\r\n#elseif _FIXES_IS_UNSET(FIX_file_inc)\r\n\t#undef FIX_file_inc\r\n\t#define FIX_file_inc                 (2)\r\n#endif\r\n\r\n#if !defined FIX_fclose\r\n\t#define FIX_fclose                   (FIX_file_inc)\r\n#elseif _FIXES_IS_UNSET(FIX_fclose)\r\n\t#undef FIX_fclose\r\n\t#define FIX_fclose                   (2)\r\n#endif\r\n\r\n#if !defined FIX_fwrite\r\n\t#define FIX_fwrite                   (FIX_file_inc)\r\n#elseif _FIXES_IS_UNSET(FIX_fwrite)\r\n\t#undef FIX_fwrite\r\n\t#define FIX_fwrite                   (2)\r\n#endif\r\n\r\n#if !defined FIX_fread\r\n\t#define FIX_fread                    (FIX_file_inc)\r\n#elseif _FIXES_IS_UNSET(FIX_fread)\r\n\t#undef FIX_fread\r\n\t#define FIX_fread                    (2)\r\n#endif\r\n\r\n#if !defined FIX_fputchar\r\n\t#define FIX_fputchar                 (FIX_file_inc)\r\n#elseif _FIXES_IS_UNSET(FIX_fputchar)\r\n\t#undef FIX_fputchar\r\n\t#define FIX_fputchar                 (2)\r\n#endif\r\n\r\n#if !defined FIX_fgetchar\r\n\t#define FIX_fgetchar                 (FIX_file_inc)\r\n#elseif _FIXES_IS_UNSET(FIX_fgetchar)\r\n\t#undef FIX_fgetchar\r\n\t#define FIX_fgetchar                 (2)\r\n#endif\r\n\r\n#if !defined FIX_fblockwrite\r\n\t#define FIX_fblockwrite              (FIX_file_inc)\r\n#elseif _FIXES_IS_UNSET(FIX_fblockwrite)\r\n\t#undef FIX_fblockwrite\r\n\t#define FIX_fblockwrite              (2)\r\n#endif\r\n\r\n#if !defined FIX_fblockread\r\n\t#define FIX_fblockread               (FIX_file_inc)\r\n#elseif _FIXES_IS_UNSET(FIX_fblockread)\r\n\t#undef FIX_fblockread\r\n\t#define FIX_fblockread               (2)\r\n#endif\r\n\r\n#if !defined FIX_fseek\r\n\t#define FIX_fseek                    (FIX_file_inc)\r\n#elseif _FIXES_IS_UNSET(FIX_fseek)\r\n\t#undef FIX_fseek\r\n\t#define FIX_fseek                    (2)\r\n#endif\r\n\r\n#if !defined FIX_flength\r\n\t#define FIX_flength                  (FIX_file_inc)\r\n#elseif _FIXES_IS_UNSET(FIX_flength)\r\n\t#undef FIX_flength\r\n\t#define FIX_flength                  (2)\r\n#endif\r\n\r\n#if !defined FIX_IsPlayerAttachedObjSlotUsed\r\n\t#define FIX_IsPlayerAttachedObjSlotUsed (1)\r\n#elseif _FIXES_IS_UNSET(FIX_IsPlayerAttachedObjSlotUsed)\r\n\t#undef FIX_IsPlayerAttachedObjSlotUsed\r\n\t#define FIX_IsPlayerAttachedObjSlotUsed (2)\r\n#endif\r\n\r\n#if !defined FIX_SetPlayerAttachedObject\r\n\t#define FIX_SetPlayerAttachedObject  (1)\r\n#elseif _FIXES_IS_UNSET(FIX_SetPlayerAttachedObject)\r\n\t#undef FIX_SetPlayerAttachedObject\r\n\t#define FIX_SetPlayerAttachedObject  (2)\r\n#endif\r\n\r\n#if !defined FIX_OnPlayerDeath\r\n\t#define FIX_OnPlayerDeath            (1)\r\n#elseif _FIXES_IS_UNSET(FIX_OnPlayerDeath)\r\n\t#undef FIX_OnPlayerDeath\r\n\t#define FIX_OnPlayerDeath            (2)\r\n#endif\r\n\r\n#if !defined FIX_strins\r\n\t#define FIX_strins                   (1)\r\n#elseif _FIXES_IS_UNSET(FIX_strins)\r\n\t#undef FIX_strins\r\n\t#define FIX_strins                   (2)\r\n#endif\r\n\r\n#if !defined FIX_IsPlayerConnected\r\n\t#define FIX_IsPlayerConnected        (1)\r\n#elseif _FIXES_IS_UNSET(FIX_IsPlayerConnected)\r\n\t#undef FIX_IsPlayerConnected\r\n\t#define FIX_IsPlayerConnected        (2)\r\n#endif\r\n\r\n#if !defined FIX_OnPlayerCommandText\r\n\t#define FIX_OnPlayerCommandText      (1)\r\n#elseif _FIXES_IS_UNSET(FIX_OnPlayerCommandText)\r\n\t#undef FIX_OnPlayerCommandText\r\n\t#define FIX_OnPlayerCommandText      (2)\r\n#endif\r\n\r\n#if !defined FIX_TrainExit\r\n\t#define FIX_TrainExit                (1)\r\n#elseif _FIXES_IS_UNSET(FIX_TrainExit)\r\n\t#undef FIX_TrainExit\r\n\t#define FIX_TrainExit                (2)\r\n#endif\r\n\r\n#if !defined FIX_Kick\r\n\t#if defined EnableVehicleFriendlyFire\r\n\t\t#define FIX_Kick                 (0)\r\n\t#else\r\n\t\t#define FIX_Kick                 (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_Kick)\r\n\t#undef FIX_Kick\r\n\t#define FIX_Kick                     (2)\r\n#endif\r\n\r\n#if !defined FIX_OnVehicleMod\r\n\t#define FIX_OnVehicleMod             (1)\r\n#elseif _FIXES_IS_UNSET(FIX_OnVehicleMod)\r\n\t#undef FIX_OnVehicleMod\r\n\t#define FIX_OnVehicleMod             (2)\r\n#endif\r\n\r\n#if !defined FIX_random\r\n\t#define FIX_random                   (0)\r\n#elseif _FIXES_IS_UNSET(FIX_random)\r\n\t#undef FIX_random\r\n\t#define FIX_random                   (2)\r\n#endif\r\n\r\n#if !defined FIX_sleep\r\n\t#define FIX_sleep                    (1)\r\n#elseif _FIXES_IS_UNSET(FIX_sleep)\r\n\t#undef FIX_sleep\r\n\t#define FIX_sleep                    (2)\r\n#endif\r\n\r\n#if !defined FIX_Menus\r\n\t#define FIX_Menus                    (1)\r\n#elseif _FIXES_IS_UNSET(FIX_Menus)\r\n\t#undef FIX_Menus\r\n\t#define FIX_Menus                    (2)\r\n#endif\r\n\r\n#if !defined FIX_AddMenuItem\r\n\t#define FIX_AddMenuItem              (FIX_Menus)\r\n#elseif _FIXES_IS_UNSET(FIX_AddMenuItem)\r\n\t#undef FIX_AddMenuItem\r\n\t#define FIX_AddMenuItem              (2)\r\n#endif\r\n\r\n#if !defined FIX_SetMenuColumnHeader\r\n\t#define FIX_SetMenuColumnHeader      (FIX_Menus)\r\n#elseif _FIXES_IS_UNSET(FIX_SetMenuColumnHeader)\r\n\t#undef FIX_SetMenuColumnHeader\r\n\t#define FIX_SetMenuColumnHeader      (2)\r\n#endif\r\n\r\n#if !defined FIX_ShowMenuForPlayer\r\n\t#define FIX_ShowMenuForPlayer        (FIX_Menus)\r\n#elseif _FIXES_IS_UNSET(FIX_ShowMenuForPlayer)\r\n\t#undef FIX_ShowMenuForPlayer\r\n\t#define FIX_ShowMenuForPlayer        (2)\r\n#endif\r\n\r\n#if !defined FIX_HideMenuForPlayer\r\n\t#define FIX_HideMenuForPlayer        (FIX_Menus)\r\n#elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer)\r\n\t#undef FIX_HideMenuForPlayer\r\n\t#define FIX_HideMenuForPlayer        (2)\r\n#endif\r\n\r\n#if !defined FIX_GetPlayerMenu\r\n\t#define FIX_GetPlayerMenu            (1)\r\n#elseif _FIXES_IS_UNSET(FIX_GetPlayerMenu)\r\n\t#undef FIX_GetPlayerMenu\r\n\t#define FIX_GetPlayerMenu            (2)\r\n#endif\r\n\r\n#if !defined FIX_HideMenuForPlayer_2\r\n\t#define FIX_HideMenuForPlayer_2      (0)\r\n#elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer_2)\r\n\t#undef FIX_HideMenuForPlayer_2\r\n\t#define FIX_HideMenuForPlayer_2      (2)\r\n#elseif FIX_HideMenuForPlayer_2 && !FIX_GetPlayerMenu\r\n\t#error FIX_HideMenuForPlayer_2 requires FIX_GetPlayerMenu\r\n#endif\r\n\r\n#if !defined FIX_DisableMenu\r\n\t#define FIX_DisableMenu              (FIX_Menus)\r\n#elseif _FIXES_IS_UNSET(FIX_DisableMenu)\r\n\t#undef FIX_DisableMenu\r\n\t#define FIX_DisableMenu              (2)\r\n#endif\r\n\r\n#if !defined FIX_DisableMenuRow\r\n\t#define FIX_DisableMenuRow           (FIX_Menus)\r\n#elseif _FIXES_IS_UNSET(FIX_DisableMenuRow)\r\n\t#undef FIX_DisableMenuRow\r\n\t#define FIX_DisableMenuRow           (2)\r\n#endif\r\n\r\n#if FIX_Menus || FIX_AddMenuItem || FIX_SetMenuColumnHeader || FIX_ShowMenuForPlayer || FIX_HideMenuForPlayer || FIX_DisableMenu || FIX_DisableMenuRow\r\n\t#define _FIX_Menus                   (1)\r\n#else\r\n\t#define _FIX_Menus                   (2)\r\n#endif\r\n\r\n#if !defined FIX_GetPlayerInterior\r\n\t#define FIX_GetPlayerInterior        (1)\r\n#elseif _FIXES_IS_UNSET(FIX_GetPlayerInterior)\r\n\t#undef FIX_GetPlayerInterior\r\n\t#define FIX_GetPlayerInterior        (2)\r\n#endif\r\n\r\n#if !defined FIX_ApplyAnimation\r\n\t#define FIX_ApplyAnimation           (1)\r\n#elseif _FIXES_IS_UNSET(FIX_ApplyAnimation)\r\n\t#undef FIX_ApplyAnimation\r\n\t#define FIX_ApplyAnimation           (2)\r\n#endif\r\n\r\n#if !defined FIX_ApplyAnimation_2\r\n\t#define FIX_ApplyAnimation_2         (1)\r\n#elseif _FIXES_IS_UNSET(FIX_ApplyAnimation_2)\r\n\t#undef FIX_ApplyAnimation_2\r\n\t#define FIX_ApplyAnimation_2         (2)\r\n#endif\r\n\r\n#if !defined FIX_OnPlayerSpawn\r\n\t#define FIX_OnPlayerSpawn            (1)\r\n#elseif _FIXES_IS_UNSET(FIX_OnPlayerSpawn)\r\n\t#undef FIX_OnPlayerSpawn\r\n\t#define FIX_OnPlayerSpawn            (2)\r\n#endif\r\n\r\n#if !defined FIX_GameText\r\n\t#define FIX_GameText                 (1)\r\n#elseif _FIXES_IS_UNSET(FIX_GameText)\r\n\t#undef FIX_GameText\r\n\t#define FIX_GameText                 (2)\r\n#endif\r\n\r\n#if !defined FIX_HideGameText\r\n\t#define FIX_HideGameText             (0)\r\n#elseif _FIXES_IS_UNSET(FIX_HideGameText)\r\n\t#undef FIX_HideGameText\r\n\t#define FIX_HideGameText             (2)\r\n#endif\r\n\r\n#if !defined FIX_GameTextStyles\r\n\t#define FIX_GameTextStyles           (0)\r\n#elseif _FIXES_IS_UNSET(FIX_GameTextStyles)\r\n\t#undef FIX_GameTextStyles\r\n\t#define FIX_GameTextStyles           (2)\r\n#elseif FIX_GameTextStyles && !FIX_GameText\r\n\t#error FIX_GameTextStyles requires FIX_GameText\r\n#endif\r\n\r\n#if !defined FIX_OnPlayerConnect\r\n\t#define FIX_OnPlayerConnect          (1)\r\n#elseif _FIXES_IS_UNSET(FIX_OnPlayerConnect)\r\n\t#undef FIX_OnPlayerConnect\r\n\t#define FIX_OnPlayerConnect          (2)\r\n#endif\r\n\r\n#if !defined FIX_OnPlayerDisconnect\r\n\t#define FIX_OnPlayerDisconnect       (1)\r\n#elseif _FIXES_IS_UNSET(FIX_OnPlayerDisconnect)\r\n\t#undef FIX_OnPlayerDisconnect\r\n\t#define FIX_OnPlayerDisconnect       (2)\r\n#endif\r\n\r\n#if !defined FIX_CreatePlayerTextDraw\r\n\t#define FIX_CreatePlayerTextDraw     (1)\r\n#elseif _FIXES_IS_UNSET(FIX_CreatePlayerTextDraw)\r\n\t#undef FIX_CreatePlayerTextDraw\r\n\t#define FIX_CreatePlayerTextDraw     (2)\r\n#endif\r\n\r\n#if !defined FIX_PlayerTextDrawSetString\r\n\t#define FIX_PlayerTextDrawSetString  (1)\r\n#elseif _FIXES_IS_UNSET(FIX_PlayerTextDrawSetString)\r\n\t#undef FIX_PlayerTextDrawSetString\r\n\t#define FIX_PlayerTextDrawSetString  (2)\r\n#endif\r\n\r\n#if !defined FIX_SetPlayerCamera\r\n\t#define FIX_SetPlayerCamera          (1)\r\n#elseif _FIXES_IS_UNSET(FIX_SetPlayerCamera)\r\n\t#undef FIX_SetPlayerCamera\r\n\t#define FIX_SetPlayerCamera          (2)\r\n#endif\r\n\r\n#if !defined FIX_SetPlayerTime\r\n\t#define FIX_SetPlayerTime            (1)\r\n#elseif _FIXES_IS_UNSET(FIX_SetPlayerTime)\r\n\t#undef FIX_SetPlayerTime\r\n\t#define FIX_SetPlayerTime            (2)\r\n#endif\r\n\r\n#if !defined FIX_OnPlayerRequestClass\r\n\t#define FIX_OnPlayerRequestClass     (1)\r\n#elseif _FIXES_IS_UNSET(FIX_OnPlayerRequestClass)\r\n\t#undef FIX_OnPlayerRequestClass\r\n\t#define FIX_OnPlayerRequestClass     (2)\r\n#endif\r\n\r\n#if !defined FIX_SetPlayerColour\r\n\t#if defined FIX_SetPlayerColor\r\n\t\t#if _FIXES_IS_UNSET(FIX_SetPlayerColor)\r\n\t\t\t#define FIX_SetPlayerColour  (2)\r\n\t\t#else\r\n\t\t\t#define FIX_SetPlayerColour   (FIX_SetPlayerColor)\r\n\t\t#endif\r\n\t#else\r\n\t\t#define FIX_SetPlayerColour      (1)\r\n\t#endif\r\n#elseif _FIXES_IS_UNSET(FIX_SetPlayerColour)\r\n\t#undef FIX_SetPlayerColour\r\n\t#define FIX_SetPlayerColour          (2)\r\n#endif\r\n\r\n#if !defined FIX_FileMaths\r\n\t#define FIX_FileMaths                (1)\r\n#elseif _FIXES_IS_UNSET(FIX_FileMaths)\r\n\t#undef FIX_FileMaths\r\n\t#define FIX_FileMaths                (2)\r\n#endif\r\n\r\n#if !defined FIX_GetPlayerWeaponData\r\n\t#define FIX_GetPlayerWeaponData      (0)\r\n#elseif _FIXES_IS_UNSET(FIX_GetPlayerWeaponData)\r\n\t#undef FIX_GetPlayerWeaponData\r\n\t#define FIX_GetPlayerWeaponData      (2)\r\n#endif\r\n\r\n/* \r\n * CHAIN_ORDER\r\n * \r\n * Allows y_hooks to call things in the correct order when it exists.\r\n */\r\n\r\n#if !defined CHAIN_ORDER\r\n\t#define CHAIN_ORDER() 0\r\n#endif\r\n\r\n/* \r\n * PRE_HOOK\r\n * \r\n * A method of pre-hooking callbacks to still have them called before any ones\r\n * re-written by y_hooks.\r\n */\r\n\r\n#define PRE_HOOK(%0) forward @CO_%0();public @CO_%0(){return CHAIN_ORDER()+1;}\r\n\r\nPRE_HOOK(FIXES)\r\n#undef CHAIN_ORDER\r\n#define CHAIN_ORDER @CO_FIXES\r\n\r\n/* \r\n * _FIXES_IncludeStates\r\n * \r\n * Define the \"_ALS\" states used by hooks.\r\n */\r\n\r\nstatic stock _FIXES_IncludeStates() <_ALS : _ALS_x0, _ALS : _ALS_x1, _ALS : _ALS_x2, _ALS : _ALS_x3>\r\n{\r\n}\r\n\r\nstatic stock _FIXES_IncludeStates() <_ALS : _ALS_go>\r\n{\r\n}\r\n\r\n/* \r\n * FIXES_GT_STYLE_COUNT\r\n * \r\n * The number of GameText styles recreated using TextDraw functions.  This is 4\r\n * by default, but can be extended to 6 if you want location and vehicle styles.\r\n */\r\n\r\n#if FIX_GameText\r\n\t#if FIX_GameTextStyles\r\n\t\t#define FIXES_GT_STYLE_COUNT (14)\r\n\t#else\r\n\t\t#define FIXES_GT_STYLE_COUNT (7)\r\n\t#endif\r\n#endif\r\n\r\n/* \r\n * FIXES_SilentKick\r\n * \r\n * If this define is set to 1, then players will not be given a message when\r\n * they are kicked for cheats, instead they will just loose connection to the\r\n * server.\r\n */\r\n\r\n#if !defined FIXES_SilentKick\r\n\t#define FIXES_SilentKick 0\r\n#elseif _FIXES_IS_UNSET(FIXES_SilentKick)\r\n\t#undef FIXES_SilentKick\r\n\t#define FIXES_SilentKick 2\r\n#endif\r\n\r\n/* \r\n * FIXES_Debug\r\n * \r\n * If this define is set to 1, then debug printing is turned on for any\r\n * functions which may use it.  Otherwise, the compiler entirely removes the\r\n * code to print anything, leaving 0 run-time overhead.\r\n */\r\n\r\n#if defined FIXES_Debug\r\n\t#if _FIXES_IS_UNSET(FIXES_Debug)\r\n\t\t#undef FIXES_Debug\r\n\t#elseif FIXES_Debug == 1\r\n\t\t#define FIXES_PRINTF(%0); print(_FIXES_gIsFilterscript ? (\"* FIXES_PRINTF (FS):\") : (\"* FIXES_PRINTF (GM):\")),printf(\"*** \" %0);\r\n\t#else\r\n\t\t#undef FIXES_Debug\r\n\t#endif\r\n#endif\r\n\r\n/* \r\n * FIXES_UseStateHooks\r\n * \r\n * A marker to indicate that this version of fixes.inc uses state-based hooks.\r\n */\r\n#define FIXES_UseStateHooks\r\n\r\n/* \r\n * FIXES_PRINTF\r\n * \r\n * A special \"printf\" function only compiled when \"FIXES_Debug\" is set.\r\n */\r\n\r\n#if !defined FIXES_PRINTF\r\n\t#define FIXES_Debug 0\r\n\t#define FIXES_PRINTF(%0);\r\n#endif\r\n\r\n/* \r\n * INVALID_DIALOG_ID\r\n * \r\n * Set when a player can't see a dialog.\r\n */\r\n\r\n#if !defined INVALID_DIALOG_ID\r\n\t#define INVALID_DIALOG_ID (-1)\r\n#endif\r\n\r\n/* \r\n * FIXES_Single\r\n * \r\n * If this define is set to 1, then the old style include is used, with no\r\n * support for multiple scripts running at the same time on the server (i.e. no\r\n * gamemodes and filter scripts at the same time).  You can only have one or the\r\n * other or bugs.\r\n */\r\n\r\n#if !defined FIXES_Single\r\n\t#define FIXES_Single (1)\r\n#elseif _FIXES_IS_UNSET(FIXES_Single)\r\n\t#undef FIXES_Single\r\n\t#define FIXES_Single (2)\r\n#endif\r\n\r\n/* \r\n * _FIXES_IS_IN_CHARGE\r\n * \r\n * Test to see if this script is in command or not (master).\r\n */\r\n\r\n#if FIXES_Single\r\n\t#define _FIXES_IS_IN_CHARGE(%0)\r\n#else\r\n\t#define _FIXES_IS_IN_CHARGE(%0) if (%0(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))\r\n#endif\r\n\r\n/* \r\n * E_FIXES_WORLDBOUND_DATA\r\n * \r\n * Store data for each player on their worldbound data.\r\n */\r\nenum E_FIXES_WORLDBOUND_DATA\r\n{\r\n\t// \"Previous\".\r\n\tFloat:E_FIXES_WORLDBOUND_DATA_PX,\r\n\tFloat:E_FIXES_WORLDBOUND_DATA_PY,\r\n\tFloat:E_FIXES_WORLDBOUND_DATA_PZ,\r\n\t// \"Lower\".\r\n\tFloat:E_FIXES_WORLDBOUND_DATA_LX,\r\n\tFloat:E_FIXES_WORLDBOUND_DATA_LY,\r\n\t// \"Upper\".\r\n\tFloat:E_FIXES_WORLDBOUND_DATA_UX,\r\n\tFloat:E_FIXES_WORLDBOUND_DATA_UY\r\n}\r\n\r\n/* \r\n * e_FIXES_BOOLS\r\n * \r\n * Collection of boolean values for players, designed to collect multiple checks\r\n * in to one variable to reduce memory consumption.\r\n */\r\nenum e_FIXES_BOOLS (<<= 1)\r\n{\r\n\t// Handy definition for nothing set.\r\n\te_FIXES_BOOLS_NONE = 0,\r\n\t// Does this player have worldbounds enabled?\r\n\te_FIXES_BOOLS_WORLDBOUNDS = 1,\r\n\te_FIXES_BOOLS_UNCONTROLLABLE,\r\n\te_FIXES_BOOLS_PUT_IN_VEHICLE,\r\n\te_FIXES_BOOLS_BLOCK,\r\n\te_FIXES_BOOLS_TELEPORT,\r\n\te_FIXES_BOOLS_CONNECTED,\r\n\te_FIXES_BOOLS_INTERIOR,\r\n\te_FIXES_BOOLS_PUT_IN_TRAIN,\r\n\te_FIXES_BOOLS_KICKED,\r\n\te_FIXES_BOOLS_ON_PLAYER_CONNECT,\r\n\te_FIXES_BOOLS_DRIVE_BY,\r\n\te_FIXES_BOOLS_FIRST_SPAWN,\r\n\te_FIXES_BOOLS_FIRST_CLASS,\r\n\te_FIXES_BOOLS_SPECTATING,\r\n\te_FIXES_BOOLS_CP_DELAYED,\r\n\te_FIXES_BOOLS_RACE_CP_DELAYED\r\n}\r\n\r\n/* \r\n * e_FIXES_SETTINGS\r\n * \r\n * Collection of boolean values for the script as a whole.  Stores a variety of\r\n * settings that are true/false.\r\n */\r\nenum e_FIXES_SETTINGS (<<= 1)\r\n{\r\n\t// Handy definition for nothing set.\r\n\te_FIXES_SETTINGS_NONE = 0,\r\n\te_FIXES_SETTINGS_INTERIOR = 1,\r\n\te_FIXES_SETTINGS_ADMIN_TELEPORT,\r\n\te_FIXES_SETTINGS_IN_CHARGE,\r\n\te_FIXES_SETTINGS_DROP_ALL_DATA,\r\n\te_FIXES_SETTINGS_MENU_SET,\r\n\te_FIXES_SETTINGS_ENDING,\r\n\te_FIXES_SETTINGS_ENDED,\r\n\te_FIXES_SETTINGS_NO_GAME_TEXT,\r\n\te_FIXES_SETTINGS_SECOND_USE\r\n}\r\n\r\n/* \r\n * _FIXES_CEILDIV\r\n * \r\n * Do a ceiling division of the first number by the second number.\r\n */\r\n#define _FIXES_CEILDIV(%0,%1) (((%0) + (%1) - 1) / (%1))\r\n\r\n/* \r\n * _FIXES_INFINITY\r\n * \r\n * IEEE 754 definition of infinity.\r\n */\r\n#define _FIXES_INFINITY (Float:0x7F800000)\r\n\r\n/* \r\n * _FIXES_N_INFINITY\r\n * \r\n * IEEE 754 definition of negative infinity.\r\n */\r\n#define _FIXES_N_INFINITY (Float:0xFF800000)\r\n\r\n/* \r\n * _FIXES_ATTACHMENTS\r\n * \r\n * The number of players whose attachment data (10-bits) can be stored in one\r\n * cell.\r\n */\r\n#define _FIXES_ATTACHMENTS (cellbits / MAX_PLAYER_ATTACHED_OBJECTS)\r\n\r\n/* \r\n * _FIXES_FOREACH\r\n * \r\n * A new version of \"foreach\", but just for this library.\r\n */\r\n#define _FIXES_FOREACH(%1,%0) for (new %0 = MAX_PLAYERS; (%0 = %1[%0]) != MAX_PLAYERS; )\r\n\r\n/* \r\n * _FIXES_IN_RANGE\r\n * \r\n * Checks if the first parameter is between the other two: %1 <= %0 < %2 (but\r\n * faster).\r\n */\r\n#define _FIXES_IN_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) < ((%2) - ((%1) + cellmin)))\r\n\r\n/* \r\n * _FIXES_NO_RANGE\r\n * \r\n * Checks if the first parameter is not between the other two: !(%1 <= %0 < %2)\r\n * (but faster).\r\n */\r\n#define _FIXES_NO_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) >= ((%2) - ((%1) + cellmin)))\r\n\r\n/* \r\n * _FIXES_FORWARD\r\n * \r\n * Forwards a hooked callbacks, and defines the default state implementations.\r\n */\r\n#define _FIXES_FORWARD%0(%1); \\\r\n\tforward%0(%1); \\\r\n\tpublic%0(%1) <_ALS : _ALS_x0, _ALS : _ALS_x1> { return 1; } \\\r\n\tpublic%0(%1) <> { return 1; }\r\n\r\n/* \r\n * _FIXES_IS_PLAYER_CONNECTED\r\n * \r\n * Always valid \"IsPlayerConnected\" check.\r\n */\r\n#define _FIXES_IS_PLAYER_CONNECTED(%0) (_FIXES_IN_RANGE((%0), 0, MAX_PLAYERS) && IsPlayerConnected((%0)))\r\n\r\n// These varaibles are NOT pre-processor dependent as they are stock.  It's just\r\n// simpler than trying to figure out when or if a semi-colon is needed.\r\n#if !FIX_FILTERSCRIPT\r\nstatic\r\n#endif\r\nstock\r\n\t/* \r\n\t * bool:_FIXES_gIsFilterscript\r\n\t * \r\n\t * Runtime equivalent of \"FILTERSCRIPT\" for when it is not set by the user.\r\n\t */\r\n\tbool:_FIXES_gIsFilterscript;\r\n\r\nstock\r\n\t/* \r\n\t * FIXES_gscSpace[]\r\n\t * \r\n\t * A single re-usable space.\r\n\t */\r\n\tFIXES_gscSpace[] = \" \";\r\n\r\n#if FIXES_Debug\r\nnew\r\n#else\r\nstatic stock\r\n#endif\r\n\t/* \r\n\t * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)]\r\n\t * \r\n\t * A record of which menus have and haven't been shown yet.  We ensure that\r\n\t * this only exists when required, since it depends on add and remove\r\n\t * functions to be called at the right time.\r\n\t */\r\n#if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable\r\n\tFIXES_gsPlayersIterator[MAX_PLAYERS + 1] = {0, 1, ...},\r\n#endif\r\n\t/* \r\n\t * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)]\r\n\t * \r\n\t * A record of which menus have and haven't been shown yet.\r\n\t */\r\n\tFIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)],\r\n\t/* \r\n\t * FIXES_gsPlayerIP[MAX_PLAYERS]\r\n\t * \r\n\t * A player's IP as a 32-bit integer.\r\n\t */\r\n\tFIXES_gsPlayerIP[MAX_PLAYERS] = {-1, ...},\r\n\t/* \r\n\t * FIXES_gsPlayerSkin[MAX_PLAYERS]\r\n\t * \r\n\t * The skin the player is currently using.\r\n\t */\r\n\tFIXES_gsPlayerSkin[MAX_PLAYERS],\r\n\t/* \r\n\t * e_FIXES_BOOLEAN_DATA:FIXES_gsPlayerBools[MAX_PLAYERS]\r\n\t * \r\n\t * Collection of boolean values for players.\r\n\t */\r\n\te_FIXES_BOOLS:FIXES_gsPlayerBools[MAX_PLAYERS],\r\n\t/* \r\n\t * FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA]\r\n\t * \r\n\t * All data for players on where their worldbounds are and where they last\r\n\t * were before they went through the bounds by crouching.\r\n\t */\r\n#if FIX_SetPlayerWorldBounds\r\n\tFIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA],\r\n#endif\r\n\t/* \r\n\t * FIXES_gsPlayerWeapon[MAX_PLAYERS]\r\n\t * \r\n\t * Stores the weapon set by \"SetPlayerArmedWeapon\" when in a vehicle.\r\n\t */\r\n\tFIXES_gsPlayerWeapon[MAX_PLAYERS],\r\n\t/* \r\n\t * FIXES_gsVehicleSeatData[MAX_PLAYERS]\r\n\t * \r\n\t * What vehicle the player is due to go in.\r\n\t */\r\n\tFIXES_gsVehicleSeatData[MAX_PLAYERS],\r\n\t/* \r\n\t * FIXES_gsVehicleLocked[(MAX_PLAYERS * MAX_VEHICLES + cellbits - 1) / cellbits]\r\n\t * \r\n\t * Is this vehicle locked for a player.  This is a compressed 2D binary\r\n\t * array, made by concatenating many bits together (saves 1kb-3kb)!  Is\r\n\t * there a reason this array exists?\r\n\t */\r\n\t//FIXES_gsVehicleLocked[_FIXES_CEILDIV(MAX_PLAYERS * MAX_VEHICLES, cellbits)],\r\n\t/* \r\n\t * FIXES_gsDialogID[MAX_PLAYERS]\r\n\t * \r\n\t * Stores the true ID of the dialog the player is looking at to prevent\r\n\t * spoofing.\r\n\t */\r\n\tFIXES_gsDialogID[MAX_PLAYERS] = {-1, ...},\r\n\t/* \r\n\t * FIXES_gsInterior[MAX_PLAYERS]\r\n\t * \r\n\t * The player's current interior.\r\n\t */\r\n\tFIXES_gsInterior[MAX_PLAYERS],\r\n\t/* \r\n\t * e_FIXES_SETTINGS:FIXES_gsSettings\r\n\t * \r\n\t * A collection of 1-bit options, compressed together to save space.\r\n\t */\r\n\te_FIXES_SETTINGS:FIXES_gsSettings = e_FIXES_SETTINGS_SECOND_USE,\r\n\t/* \r\n\t * FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)]\r\n\t * \r\n\t * A record of which attached object slots a player has used.\r\n\t */\r\n\tFIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)],\r\n\t/* \r\n\t * FIXES_gsLastAnimation[MAX_PLAYERS]\r\n\t * \r\n\t * The last animation a player used.\r\n\t */\r\n\tFIXES_gsLastAnimation[MAX_PLAYERS],\r\n\t/* \r\n\t * FIXES_gsLastCash[MAX_PLAYERS]\r\n\t * \r\n\t * A player's cash before dying.\r\n\t */\r\n\tFIXES_gsLastCash[MAX_PLAYERS],\r\n\t/* \r\n\t * FIXES_gsDriveByWeapon[MAX_PLAYERS]\r\n\t * \r\n\t * The weapon to set after re-enter to vehicle.\r\n\t */\r\n\tFIXES_gsDriveByWeapon[MAX_PLAYERS],\r\n\t/* \r\n\t * FIXES_gsCurrentMenu[MAX_PLAYERS]\r\n\t * \r\n\t * The menu the player can currently see.\r\n\t */\r\n\tMenu:FIXES_gsCurrentMenu[MAX_PLAYERS] = {Menu:INVALID_MENU, ...},\r\n\t/* \r\n\t * Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT]\r\n\t * \r\n\t * The pre-defined TextDraw styles used to recreate the bugged GameText\r\n\t * styles for GameTextForAll.\r\n\t */\r\n#if FIX_GameText\r\n\tText:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT],\r\n#endif\r\n\t/* \r\n\t * FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1]\r\n\t * \r\n\t * A linked list of which players can see a certain GameText style.\r\n\t */\r\n#if FIX_GameText\r\n\tFIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1],\r\n#endif\r\n\t/* \r\n\t * PlayerText:FIXES_gsPGTStyle[FIXES_GT_STYLE_COUNT][MAX_PLAYERS]\r\n\t * \r\n\t * The predefined TextDraw styles used to recreate the bugged GameText\r\n\t * styles for GameTextForPlayer.\r\n\t */\r\n#if FIX_GameText\r\n\tPlayerText:FIXES_gsPGTStyle[MAX_PLAYERS][FIXES_GT_STYLE_COUNT],\r\n#endif\r\n\t/* \r\n\t * FIXES_gsPGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS]\r\n\t * \r\n\t * The timers used to hide per-player GameText messages.\r\n\t */\r\n#if FIX_GameText\r\n\tFIXES_gsGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1],\r\n#endif\r\n\t/* \r\n\t * FIXES_gsClassAnimTimer[MAX_PLAYERS],\r\n\t * \r\n\t * Used for storing the timer ID for deferring class selection animation\r\n\t * application.\r\n\t */\r\n\tFIXES_gsAnimTimer[MAX_PLAYERS],\r\n\t/* \r\n\t * FIXES_gsClassAnimName[MAX_PLAYERS][60],\r\n\t * \r\n\t * Used for storing the animation name.\r\n\t */\r\n#if FIX_ApplyAnimation_2\r\n\tFIXES_gsClassAnimName[MAX_PLAYERS][60],\r\n#endif\r\n\t/* \r\n\t * FIXES_gsPlayerAnimLibs[MAX_PLAYERS][_FIXES_CEILDIV(135, cellbits)],\r\n\t * \r\n\t * Which animation libraries the player has synced.\r\n\t */\r\n#if FIX_ApplyAnimation_2\r\n\tFIXES_gsPlayerAnimLibs[MAX_PLAYERS][_FIXES_CEILDIV(135, cellbits)],\r\n#endif\r\n\t/* \r\n\t * FIXES_pvarNotNewPlayer[]\r\n\t * \r\n\t * This variable records wether or not this player is brand new to the\r\n\t * server, and not just having \"OnPlayerConnect\" called due to a script\r\n\t * load.  There are certain functions that need applying only the very first\r\n\t * time they connect, then this gets set.\r\n\t */\r\n\tFIXES_pvarNotNewPlayer[] = \"FIXES_pvarNotNewPlayer\",\r\n\t/* \r\n\t * FIXES_pvarPlayerWeapon[]\r\n\t * \r\n\t * Name of the pvar in which to store the player's current weapon.\r\n\t */\r\n\tFIXES_pvarPlayerWeapon[] = \"FIXES_pvarPlayerWeapon\",\r\n\t/* \r\n\t * FIXES_pvarPlayerSkin[]\r\n\t * \r\n\t * Name of the pvar in which to store the player's current skin.\r\n\t */\r\n\tFIXES_pvarPlayerSkin[] = \"FIXES_pvarPlayerSkin\",\r\n\t/* \r\n\t * FIXES_pvarPlayerSpectate[]\r\n\t * \r\n\t * Name of the pvar in which to store the player's spectator mode.\r\n\t */\r\n\tFIXES_pvarPlayerSpectate[] = \"FIXES_pvarPlayerSpectate\",\r\n\t/* \r\n\t * FIXES_gscKick[]\r\n\t * \r\n\t * Name of the kick timer function.\r\n\t */\r\n\tFIXES_gscKick[] = \"_FIXES_Kick\",\r\n\t/* \r\n\t * FIXES_pvarKick[]\r\n\t * \r\n\t * Name of the pvar in which to store a player's kick timer.\r\n\t */\r\n\tFIXES_pvarKick[] = \"FIXES_pvarKick\",\r\n\t/* \r\n\t * FIXES_pvarPlayerDialog[]\r\n\t * \r\n\t * Name of the pvar in which to store the player's current dialogid.\r\n\t */\r\n\tFIXES_pvarPlayerDialog[] = \"FIXES_pvarPlayerDialog\",\r\n\t/* \r\n\t * FIXES_pvarPlayerInterior[]\r\n\t * \r\n\t * A player's current interior.\r\n\t */\r\n\tFIXES_pvarPlayerInterior[] = \"FIXES_pvarPlayerInterior\",\r\n\t/* \r\n\t * FIXES_pvarCurrentDialog[]\r\n\t * \r\n\t * Used in OnDialogResponse to be able to get the correct ID in multiple\r\n\t * scripts while still correctly resetting the ID for future use.\r\n\t */\r\n\tFIXES_pvarCurrentDialog[] = \"FIXES_pvarCurrentDialog\",\r\n\t/* \r\n\t * FIXES_pvarPlayerLastCash[]\r\n\t * \r\n\t * Used in OnPlayerDeath to save a player's cash before death.\r\n\t */\r\n\tFIXES_pvarPlayerLastCash[] = \"FIXES_pvarPlayerLastCash\",\r\n\t/* \r\n\t * FIXES_gscHideGameTextTimer[]\r\n\t * \r\n\t * Name of the GameText hide timer function.\r\n\t */\r\n\tFIXES_gscHideGameTextTimer[] = \"_FIXES_HideGameTextTimer\",\r\n\t/* \r\n\t * FIXES_gscDriveBy[]\r\n\t * \r\n\t * Name of the Drive-By timer function.\r\n\t */\r\n\tFIXES_gscDriveBy[] = \"_FIXES_DriveBy\",\r\n\t/* \r\n\t * FIXES_gscSetCamera[]\r\n\t * \r\n\t * Name of the SetCamera timer function.\r\n\t */\r\n\tFIXES_gscSetCamera[] = \"_FIXES_SetCamera\",\r\n\t/* \r\n\t * FIXES_gscSetTime[]\r\n\t * \r\n\t * Name of the SetTime timer function.\r\n\t */\r\n\tFIXES_gscSetTime[] = \"_FIXES_SetTime\",\r\n\t/* \r\n\t * FIXES_gscSetColor[]\r\n\t * \r\n\t * Name of the SetColor timer function.\r\n\t */\r\n\tFIXES_gscSetColor[] = \"_FIXES_SetColor\",\r\n\t/* \r\n\t * FIXES_gscSetCheckpoint[]\r\n\t * \r\n\t * Name of the SetCheckpoint timer function.\r\n\t */\r\n\tFIXES_gscSetCheckpoint[] = \"_FIXES_SetCheckpoint\",\r\n\t/* \r\n\t * FIXES_pvarPlayerCheckpoint[]\r\n\t * \r\n\t * Name of the pvar in which to store the player's checkpoint state.\r\n\t */\r\n\tFIXES_pvarPlayerCheckpoint[] = \"FIXES_pvarPlayerCheckpoint\",\r\n\t/* \r\n\t * FIXES_gscSetRaceCheckpoint[]\r\n\t * \r\n\t * Name of the SetRaceCheckpoint timer function.\r\n\t */\r\n\tFIXES_gscSetRaceCheckpoint[] = \"_FIXES_SetRaceCheckpoint\",\r\n\t/* \r\n\t * FIXES_pvarPlayerRaceCheckpoint[]\r\n\t * \r\n\t * Name of the pvar in which to store the player's race checkpoint state.\r\n\t */\r\n\tFIXES_pvarPlayerRaceCheckpoint[] = \"FIXES_pvarPlayerRaceCheckpoint\",\r\n\t/* \r\n\t * FIXES_gscNULL[]\r\n\t * \r\n\t * NULL.  This is stored as a global string to reduce memory usage.\r\n\t */\r\n\tFIXES_gscNULL[] = \"\\1\";\r\n\r\nstatic stock const\r\n\t/* \r\n\t * FIXES_gscPlayerColours[100]\r\n\t * \r\n\t * There are only 100 colours used by default, with SA:MP looping through\r\n\t * them repeatedly.\r\n\t */\r\n#if FIX_GetPlayerColour\r\n\tFIXES_gscPlayerColours[100] =\r\n\t\t{\r\n\t\t\t0xFF8C13FF, 0xC715FFFF, 0x20B2AAFF, 0xDC143CFF, 0x6495EDFF,\r\n\t\t\t0xF0E68CFF, 0x778899FF, 0xFF1493FF, 0xF4A460FF, 0xEE82EEFF,\r\n\t\t\t0xFFD720FF, 0x8B4513FF, 0x4949A0FF, 0x148B8BFF, 0x14FF7FFF,\r\n\t\t\t0x556B2FFF, 0x0FD9FAFF, 0x10DC29FF, 0x534081FF, 0x0495CDFF,\r\n\t\t\t0xEF6CE8FF, 0xBD34DAFF, 0x247C1BFF, 0x0C8E5DFF, 0x635B03FF,\r\n\t\t\t0xCB7ED3FF, 0x65ADEBFF, 0x5C1ACCFF, 0xF2F853FF, 0x11F891FF,\r\n\t\t\t0x7B39AAFF, 0x53EB10FF, 0x54137DFF, 0x275222FF, 0xF09F5BFF,\r\n\t\t\t0x3D0A4FFF, 0x22F767FF, 0xD63034FF, 0x9A6980FF, 0xDFB935FF,\r\n\t\t\t0x3793FAFF, 0x90239DFF, 0xE9AB2FFF, 0xAF2FF3FF, 0x057F94FF,\r\n\t\t\t0xB98519FF, 0x388EEAFF, 0x028151FF, 0xA55043FF, 0x0DE018FF,\r\n\t\t\t0x93AB1CFF, 0x95BAF0FF, 0x369976FF, 0x18F71FFF, 0x4B8987FF,\r\n\t\t\t0x491B9EFF, 0x829DC7FF, 0xBCE635FF, 0xCEA6DFFF, 0x20D4ADFF,\r\n\t\t\t0x2D74FDFF, 0x3C1C0DFF, 0x12D6D4FF, 0x48C000FF, 0x2A51E2FF,\r\n\t\t\t0xE3AC12FF, 0xFC42A8FF, 0x2FC827FF, 0x1A30BFFF, 0xB740C2FF,\r\n\t\t\t0x42ACF5FF, 0x2FD9DEFF, 0xFAFB71FF, 0x05D1CDFF, 0xC471BDFF,\r\n\t\t\t0x94436EFF, 0xC1F7ECFF, 0xCE79EEFF, 0xBD1EF2FF, 0x93B7E4FF,\r\n\t\t\t0x3214AAFF, 0x184D3BFF, 0xAE4B99FF, 0x7E49D7FF, 0x4C436EFF,\r\n\t\t\t0xFA24CCFF, 0xCE76BEFF, 0xA04E0AFF, 0x9F945CFF, 0xDCDE3DFF,\r\n\t\t\t0x10C9C5FF, 0x70524DFF, 0x0BE472FF, 0x8A2CD7FF, 0x6152C2FF,\r\n\t\t\t0xCF72A9FF, 0xE59338FF, 0xEEDC2DFF, 0xD8C762FF, 0xD8C762FF\r\n\t\t},\r\n#endif\r\n\t/* \r\n\t * FIXES_gscMaxPassengers[]\r\n\t * \r\n\t * This is a compressed (4-bit) list of the maximum number of passengers in\r\n\t * any vehicle, confirmed by a number of sources. \"F\" (15) means invalid\r\n\t * vehicle.\r\n\t */\r\n#if FIX_OnPlayerEnterVehicle\r\n\tFIXES_gscMaxPassengers[] =\r\n\t\t{\r\n\t\t\t0x10331113, 0x11311131, 0x11331313, 0x80133301, 0x1381F110, 0x10311103, 0x10001F10, 0x11113311, 0x13113311,\r\n\t\t\t0x31101100, 0x30001301, 0x11031311, 0x11111331, 0x10013111, 0x01131100, 0x11111110, 0x11100031, 0x11130221,\r\n\t\t\t0x33113311, 0x11111101, 0x33101133, 0x101001F0, 0x03133111, 0xFF11113F, 0x13330111, 0xFF131111, 0x0000FF3F\r\n\t\t},\r\n#endif\r\n\t/* \r\n\t * FIXES_gscVehicleMods[]\r\n\t * \r\n\t * This is a bit array of all the valid mods (-1000) for all vehicles (-400)\r\n\t * EXCEPT for vehicle 576 (Tornado), which has just TWO extra mods on it,\r\n\t * that should spill over in to an extra cell of data (requiring an extra\r\n\t * 848 bytes of data total to make the array work).  Instead this (hopefully\r\n\t * rare) case is handled explicitly in \"OnVehicleMod\".  It seems that most\r\n\t * vehicles are:\r\n\t * \r\n\t *   0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t * \r\n\t * I don't know yet if this can be used to our advantage to improve the code\r\n\t * somehow - it seems like that would require more explicit model handling.\r\n\t */\r\n#if FIX_OnVehicleMod\r\n\tFIXES_gscVehicleMods[] =\r\n\t\t{\r\n\t\t\t0x033C2700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x021A27FA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x023B2785, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02BC4703, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x03BA278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x028E078A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02310744, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x0228073A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02BD4701, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x023A2780, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x0228077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x027A27CA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x0282278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x023E07C0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x03703730, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x031D2775, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02BE4788, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x02010771, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x029A0FCE, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x03382700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x023F8795, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x029F078C, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x029627EA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x0236C782, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x029E1FCA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0xFC000437, 0x00000000, 0x021C0000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x03FE6007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00001B87, 0x00000001, 0x01E00000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x039E07D2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x023CC700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x038E07D6, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x023D0709, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x029E1F8A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x029C077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x02BD076C, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0xFFFFFE00, 0x00000007, 0x00000000, 0x000001F8,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFFFE, 0x00000007, 0xC0000000, 0x00002007,\r\n\t\t\t0xFE000700, 0x00000003, 0x00FFFE00, 0x00000007, 0x00003C00, 0x00000600,\r\n\t\t\t0xCE000700, 0xFF800000, 0x00FFFE01, 0x00000007, 0x3C000000, 0x00000000,\r\n\t\t\t0x02000700, 0x000003FC, 0x00FFFE00, 0x00000007, 0x003C0000, 0x00001800,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x007FE000, 0x00FFFE00, 0x00000007, 0x03C00000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000047, 0x0000003E, 0x3C000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00001C00, 0x00FFFE00, 0x0000000F, 0x00000000, 0x0003C000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x000003C0, 0xC0000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x029607C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x03FFE7CD, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x031727F1, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x025627F0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x039E07C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,\r\n\t\t\t0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000\r\n\t\t},\r\n#endif\r\n\t/* \r\n\t * FIXES_gscAnimIndexes[]\r\n\t * \r\n\t * Which index each letter starts at.  Sometimes crashes the compiler...\r\n\t */\r\n#if FIX_ApplyAnimation || FIX_ApplyAnimation_2\r\n\tFIXES_gscAnimIndexes[24] =\r\n\t\t{\r\n\t\t\t0, 2, 21, 35, 42, 42, 53, 62, 64, 67, 68, 71, 75, 81, 82, 84, 94, 96, 104, 122, 127, 128, 131, 135\r\n\t\t},\r\n#endif\r\n\t/* \r\n\t * FIXES_gscAnimLib[]\r\n\t * \r\n\t * List of valid animation libraries.\r\n\t */\r\n#if FIX_ApplyAnimation || FIX_ApplyAnimation_2\r\n\tFIXES_gscAnimLib[135][] =\r\n\t\t{\r\n\t\t\t\"AIRPORT\",      \"ATTRACTORS\",   \"BAR\",          \"BASEBALL\",     \"BD_FIRE\",\r\n\t\t\t\"BEACH\",        \"BENCHPRESS\",   \"BF_INJECTION\", \"BIKE_DBZ\",     \"BIKED\",\r\n\t\t\t\"BIKEH\",        \"BIKELEAP\",     \"BIKES\",        \"BIKEV\",        \"BLOWJOBZ\",\r\n\t\t\t\"BMX\",          \"BOMBER\",       \"BOX\",          \"BSKTBALL\",     \"BUDDY\",\r\n\t\t\t\"BUS\",          \"CAMERA\",       \"CAR\",          \"CAR_CHAT\",     \"CARRY\",\r\n\t\t\t\"CASINO\",       \"CHAINSAW\",     \"CHOPPA\",       \"CLOTHES\",      \"COACH\",\r\n\t\t\t\"COLT45\",       \"COP_AMBIENT\",  \"COP_DVBYZ\",    \"CRACK\",        \"CRIB\",\r\n\t\t\t\"DAM_JUMP\",     \"DANCING\",      \"DEALER\",       \"DILDO\",        \"DODGE\",\r\n\t\t\t\"DOZER\",        \"DRIVEBYS\",     \"FAT\",          \"FIGHT_B\",      \"FIGHT_C\",\r\n\t\t\t\"FIGHT_D\",      \"FIGHT_E\",      \"FINALE\",       \"FINALE2\",      \"FLAME\",\r\n\t\t\t\"FLOWERS\",      \"FOOD\",         \"FREEWEIGHTS\",  \"GANGS\",        \"GFUNK\",\r\n\t\t\t\"GHANDS\",       \"GHETTO_DB\",    \"GOGGLES\",      \"GRAFFITI\",     \"GRAVEYARD\",\r\n\t\t\t\"GRENADE\",      \"GYMNASIUM\",    \"HAIRCUTS\",     \"HEIST9\",       \"INT_HOUSE\",\r\n\t\t\t\"INT_OFFICE\",   \"INT_SHOP\",     \"JST_BUISNESS\", \"KART\",         \"KISSING\",\r\n\t\t\t\"KNIFE\",        \"LAPDAN1\",      \"LAPDAN2\",      \"LAPDAN3\",      \"LOWRIDER\",\r\n\t\t\t\"MD_CHASE\",     \"MD_END\",       \"MEDIC\",        \"MISC\",         \"MTB\",\r\n\t\t\t\"MUSCULAR\",     \"NEVADA\",       \"ON_LOOKERS\",   \"OTB\",          \"PARACHUTE\",\r\n\t\t\t\"PARK\",         \"PAULNMAC\",     \"PED\",          \"PLAYER_DVBYS\", \"PLAYIDLES\",\r\n\t\t\t\"POLICE\",       \"POOL\",         \"POOR\",         \"PYTHON\",       \"QUAD\",\r\n\t\t\t\"QUAD_DBZ\",     \"RAPPING\",      \"RIFLE\",        \"RIOT\",         \"ROB_BANK\",\r\n\t\t\t\"ROCKET\",       \"RUNNINGMAN\",   \"RUSTLER\",      \"RYDER\",        \"SAMP\",\r\n\t\t\t\"SCRATCHING\",   \"SEX\",          \"SHAMAL\",       \"SHOP\",         \"SHOTGUN\",\r\n\t\t\t\"SILENCED\",     \"SKATE\",        \"SMOKING\",      \"SNIPER\",       \"SNM\",\r\n\t\t\t\"SPRAYCAN\",     \"STRIP\",        \"SUNBATHE\",     \"SWAT\",         \"SWEET\",\r\n\t\t\t\"SWIM\",         \"SWORD\",        \"TANK\",         \"TATTOOS\",      \"TEC\",\r\n\t\t\t\"TRAIN\",        \"TRUCK\",        \"UZI\",          \"VAN\",          \"VENDING\",\r\n\t\t\t\"VORTEX\",       \"WAYFARER\",     \"WEAPONS\",      \"WOP\",          \"WUZI\"\r\n\t\t},\r\n#endif\r\n\t/* \r\n\t * FIXES_gscDot[]\r\n\t * \r\n\t * \".\".\r\n\t */\r\n\tFIXES_gscDot[] = \".\",\r\n\t/* \r\n\t * FIXES_gscSpec@[]\r\n\t * \r\n\t * Specifier \"\".\r\n\t */\r\n\tFIXES_gscSpec@[] = \"\",\r\n\t/* \r\n\t * FIXES_gscSpec@i[]\r\n\t * \r\n\t * Specifier \"i\".\r\n\t */\r\n\tFIXES_gscSpec@i[] = \"i\",\r\n\t/* \r\n\t * FIXES_gscSpec@ii[]\r\n\t * \r\n\t * Specifier \"ii\".\r\n\t */\r\n\tFIXES_gscSpec@ii[] = \"ii\",\r\n\t/* \r\n\t * FIXES_gscSpec@ai[]\r\n\t * \r\n\t * Specifier \"ai\".\r\n\t */\r\n\tFIXES_gscSpec@ai[] = \"ai\",\r\n\t/* \r\n\t * FIXES_gscSpec@is[]\r\n\t * \r\n\t * Specifier \"is\".\r\n\t */\r\n\tFIXES_gscSpec@is[] = \"is\",\r\n\t/* \r\n\t * FIXES_gscSpec@iii[]\r\n\t * \r\n\t * Specifier \"iii\".\r\n\t */\r\n\tFIXES_gscSpec@iii[] = \"iii\",\r\n\t/* \r\n\t * FIXES_gscSpec@isii[]\r\n\t * \r\n\t * Specifier \"isii\".\r\n\t */\r\n\tFIXES_gscSpec@isii[] = \"isii\",\r\n\t/* \r\n\t * FIXES_gscSpec@ifff[]\r\n\t * \r\n\t * Specifier \"ifff\".\r\n\t */\r\n\tFIXES_gscSpec@ifff[] = \"ifff\",\r\n\t/* \r\n\t * FIXES_gscSpec@iifff[]\r\n\t * \r\n\t * Specifier \"iifff\".\r\n\t */\r\n\tFIXES_gscSpec@iifff[] = \"iifff\",\r\n\t/* \r\n\t * FIXES_gscSpec@iifffffff[]\r\n\t * \r\n\t * Specifier \"iifffffff\".\r\n\t */\r\n\tFIXES_gscSpec@iifffffff[] = \"iifffffff\",\r\n\t/* \r\n\t * FIXES_gscSpec@iffff[]\r\n\t * \r\n\t * Specifier \"iffff\".\r\n\t */\r\n\tFIXES_gscSpec@iffff[] = \"iffff\",\r\n\t/* \r\n\t * FIXES_gscSpec@iiiis[]\r\n\t * \r\n\t * Specifier \"iiiis\".\r\n\t */\r\n\tFIXES_gscSpec@iiiis[] = \"iiiis\",\r\n\t/* \r\n\t * FIXES_gscSpec@iiiii[]\r\n\t * \r\n\t * Specifier \"iiiii\".\r\n\t */\r\n\tFIXES_gscSpec@iiiii[] = \"iiiii\",\r\n\t/* \r\n\t * FIXES_gscSpec@iiiiii[]\r\n\t * \r\n\t * Specifier \"iiiiii\".\r\n\t */\r\n\tFIXES_gscSpec@iiiiii[] = \"iiiiii\",\r\n\t/* \r\n\t * FIXES_gscTempName[]\r\n\t * \r\n\t * The temporary name to give when renaming people.\r\n\t */\r\n\tFIXES_gscTempName[] = \"FIXES_TEMP_NAME\",\r\n\t/* \r\n\t * FIXES_gscOrderProperty[]\r\n\t * \r\n\t * The property to check for script ordering.\r\n\t */\r\n\tFIXES_gscOrderProperty[] = \"FIXES_gscOrderProperty\",\r\n\t/* \r\n\t * FIXES_gscNoGMProperty[]\r\n\t * \r\n\t * Call \"_FIXES_DetermineOrder\" in the GM or not?\r\n\t */\r\n\tFIXES_gscNoGMProperty[] = \"FIXES_gscNoGMProperty\",\r\n\t/* \r\n\t * FIXES_gscDetermineOrder[]\r\n\t * \r\n\t * Name of the ordering callback.\r\n\t */\r\n\tFIXES_gscDetermineOrder[] = \"_FIXES_DetermineOrder\",\r\n\t/* \r\n\t * FIXES_gscSetPlayerMenu[]\r\n\t * \r\n\t * Name of the remote set player menu function.\r\n\t */\r\n\tFIXES_gscSetPlayerMenu[] = \"_FIXES_SetPlayerMenu\",\r\n\t/* \r\n\t * FIXES_gscClearPlayerMenu[]\r\n\t * \r\n\t * Name of the remote function to clear a player's menu set.\r\n\t */\r\n\tFIXES_gscClearPlayerMenu[] = \"_FIXES_ClearPlayerMenu\",\r\n\t/* \r\n\t * FIXES_gscAllowTeleport[]\r\n\t * \r\n\t * Name of the remote allow teleport function.\r\n\t */\r\n\tFIXES_gscAllowTeleport[] = \"_FIXES_AllowTeleport\",\r\n\t/* \r\n\t * FIXES_gscPutPlayerInVehicle[]\r\n\t * \r\n\t * Name of the remote vehicle entry function.\r\n\t */\r\n\tFIXES_gscPutPlayerInVehicle[] = \"_FIXES_PutPlayerInVehicle\",\r\n\t/* \r\n\t * FIXES_gscAllowInteriorWeapons[]\r\n\t * \r\n\t * Name of the remote interior weapons function.\r\n\t */\r\n\tFIXES_gscAllowInteriorWeapons[] = \"_FIXES_AllowInteriorWeapons\",\r\n\t/* \r\n\t * FIXES_gscSetPlayerAttachedObj[]\r\n\t * \r\n\t * Name of the remote attache object function.\r\n\t */\r\n\tFIXES_gscSetPlayerAttachedObj[] = \"_FIXES_SetPlayerAttachedObject\",\r\n\t/* \r\n\t * FIXES_gscTogglePlayerControl[]\r\n\t * \r\n\t * Name of the remote player toggle function.\r\n\t */\r\n\tFIXES_gscTogglePlayerControl[] = \"_FIXES_TogglePlayerControllable\",\r\n\t/* \r\n\t * FIXES_gscSetPlayerWorldBounds[]\r\n\t * \r\n\t * Name of the remote world bounds function.\r\n\t */\r\n\tFIXES_gscSetPlayerWorldBounds[] = \"_FIXES_SetPlayerWorldBounds\",\r\n\t/* \r\n\t * FIXES_gscGameTextShow[]\r\n\t * \r\n\t * Name of the remote GameText show function.\r\n\t */\r\n\tFIXES_gscGameTextShow[] = \"_FIXES_GameTextShow\",\r\n\t/* \r\n\t * FIXES_gscReturnProperty[]\r\n\t * \r\n\t * The property for accurate returns.\r\n\t */\r\n\tFIXES_gscReturnProperty[] = \"FIXES_gscReturnProperty\",\r\n\t/* \r\n\t * FIXES_gscSingleProperty[]\r\n\t * \r\n\t * The property for checking this is the only running script with fixes in.\r\n\t */\r\n\tFIXES_gscSingleProperty[] = \"FIXES_gscSingleProperty\",\r\n\t/* \r\n\t * FIXES_gscMenuProperty[]\r\n\t * \r\n\t * The property for a player's current menu.\r\n\t */\r\n\tFIXES_gscMenuProperty[] = \"FIXES_gscMenuProperty\",\r\n\t/* \r\n\t * FIXES_gscFixesError[]\r\n\t * \r\n\t * Error shown when multiple scripts are detected.\r\n\t */\r\n\tFIXES_gscFixesError[] = \"\\7\\7\\7\\7\\7\"                                                     \"\\n\"   \\\r\n\t\t\"*** fixes.inc error: Running multiple scripts compiled with \\\"fixes.inc\\\"...\"       \"\\n\"   \\\r\n\t\t\"***     Please compile your modes with \\\"#define FIXES_Single 0\\\" at the top, as\"   \"\\n\"   \\\r\n\t\t\"***     this setting is no longer the default (to improve the more common case).\"          ;\r\n\r\n/* \r\n * _FIXES_KEY_AIM\r\n * KEY_AIM\r\n * \r\n * Because the default SA:MP includes missed this one.\r\n */\r\n\r\n#define _FIXES_KEY_AIM                   (128)\r\n#if FIX_KEY_AIM\r\n\t#define KEY_AIM                      _FIXES_KEY_AIM\r\n#endif\r\n\r\n/* \r\n * _FIXES_SPECIAL_ACTION_PISSING\r\n * SPECIAL_ACTION_PISSING\r\n * \r\n * Because the default SA:MP includes missed this one.\r\n */\r\n\r\n#define _FIXES_SPECIAL_ACTION_PISSING    (68)\r\n#if FIX_SPECIAL_ACTION_PISSING\r\n\t#define SPECIAL_ACTION_PISSING       _FIXES_SPECIAL_ACTION_PISSING\r\n#endif\r\n\r\n/* \r\n * IsValidVehicle\r\n * \r\n * Because the default SA:MP includes missed this one.\r\n */\r\n\r\n#if FIX_IsValidVehicle\r\n\tnative IsValidVehicle(vehicleid);\r\n#endif\r\n\r\n/* \r\n * GetGravity\r\n * \r\n * Because the default SA:MP includes missed this one.\r\n */\r\n\r\n#if FIX_GetGravity\r\n\tnative Float:GetGravity();\r\n#endif\r\n\r\n/* \r\n * gpci\r\n * \r\n * Because the default SA:MP includes missed this one.\r\n */\r\n\r\n#if FIX_gpci\r\n\tnative gpci(playerid, serial[], maxlen);\r\n#endif\r\n\r\n/* \r\n * BODYPARTS\r\n * \r\n * Because the default SA:MP includes missed these.\r\n */\r\n\r\n#if FIX_BODYPARTS\r\n\t#define BODY_PART_TORSO                     (3)\r\n\t#define BODY_PART_GROIN                     (4)\r\n\t#define BODY_PART_LEFT_ARM                  (5)\r\n\t#define BODY_PART_RIGHT_ARM                 (6)\r\n\t#define BODY_PART_LEFT_LEG                  (7)\r\n\t#define BODY_PART_RIGHT_LEG                 (8)\r\n\t#define BODY_PART_HEAD                      (9)\r\n#endif\r\n\r\n/* \r\n * CAMERAMODES\r\n * \r\n * Because the default SA:MP includes missed these.\r\n */\r\n\r\n#if FIX_CAMERAMODES\r\n\t#define CAM_MODE_DISCONNECTED               (-1)\r\n\t#define CAM_MODE_NONE                       (0)\r\n\t#define CAM_MODE_BEHINDCAR                  (3)\r\n\t#define CAM_MODE_FOLLOWPED                  (4)\r\n\t#define CAM_MODE_SNIPER                     (7)\r\n\t#define CAM_MODE_ROCKETLAUNCHER             (8)\r\n\t#define CAM_MODE_FIXED                      (15)\r\n\t#define CAM_MODE_1STPERSON                  (16)\r\n\t#define CAM_MODE_CAM_ON_A_STRING            (18)\r\n\t#define CAM_MODE_BEHINDBOAT                 (22)\r\n\t#define CAM_MODE_CAMERA                     (46)\r\n\t#define CAM_MODE_ROCKETLAUNCHER_HS          (51)\r\n\t#define CAM_MODE_AIMWEAPON                  (53)\r\n\t#define CAM_MODE_AIMWEAPON_FROMCAR          (55)\r\n\t#define CAM_MODE_DW_HELI_CHASE              (56)\r\n#endif\r\n\r\n/* \r\n * IS_FILTERSCRIPT\r\n * \r\n * \"FILTERSCRIPT\" can't always be relied on to be set.  This is not a pre-\r\n * processor macro, but may be better than nothing (also used internally).\r\n */\r\n\r\n#if FIX_FILTERSCRIPT\r\n\t#define IS_FILTERSCRIPT _FIXES_gIsFilterscript\r\n#endif\r\n\r\n/* \r\n * File operators\r\n * \r\n * Forwards for operators that shouldn't exist, so they won't exist.\r\n */\r\n\r\n#if FIX_FileMaths\r\n\tforward File:operator++(File:a);\r\n\tforward File:operator--(File:a);\r\n\tforward File:operator-(File:a);\r\n\tforward File:operator+(File:a, File:b);\r\n\tforward File:operator+(File:a, _:b);\r\n\tforward File:operator-(File:a, File:b);\r\n\tforward File:operator-(_:a, File:b);\r\n\tforward File:operator-(File:a, _:b);\r\n\tforward File:operator*(File:a, File:b);\r\n\tforward File:operator*(File:a, _:b);\r\n\tforward File:operator/(File:a, File:b);\r\n\tforward File:operator/(_:a, File:b);\r\n\tforward File:operator/(File:a, _:b);\r\n\tforward File:operator%(File:a, File:b);\r\n\tforward File:operator%(_:a, File:b);\r\n\tforward File:operator%(File:a, _:b);\r\n\tforward bool:operator<(File:a, File:b);\r\n\tforward bool:operator<(_:a, File:b);\r\n\tforward bool:operator<(File:a, _:b);\r\n\tforward bool:operator<=(File:a, File:b);\r\n\tforward bool:operator<=(_:a, File:b);\r\n\tforward bool:operator<=(File:a, _:b);\r\n\tforward bool:operator>(File:a, File:b);\r\n\tforward bool:operator>(_:a, File:b);\r\n\tforward bool:operator>(File:a, _:b);\r\n\tforward bool:operator>=(File:a, File:b);\r\n\tforward bool:operator>=(_:a, File:b);\r\n\tforward bool:operator>=(File:a, _:b);\r\n#endif\r\n\r\n/* \r\n * FIXES_DetermineOrder()\r\n * \r\n * Figure out which script is called first by callbacks.\r\n */\r\n\r\n#if !FIXES_Single\r\n\tforward _FIXES_DetermineOrder();\r\n\t\r\n\tstatic FIXES_DetermineOrder()\r\n\t{\r\n\t\tdeleteproperty(5, FIXES_gscOrderProperty),\r\n\t\t// Called in the Game Mode first (thus needs correcting).\r\n\t\tsetproperty(5, FIXES_gscNoGMProperty, 1),\r\n\t\tCallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@),\r\n\t\tdeleteproperty(5, FIXES_gscNoGMProperty),\r\n\t\tCallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@);\r\n\t}\r\n#endif\r\n\r\n/* \r\n * FIXES_IsPlayerConnected(playerid)\r\n * \r\n * FIXES:\r\n *     IsPlayerConnected\r\n */\r\n\r\n#if defined _ALS_IsPlayerConnected\r\n\t#error _ALS_IsPlayerConnected defined\r\n#endif\r\nnative BAD_IsPlayerConnected(playerid) = IsPlayerConnected;\r\n\r\n#if FIX_IsPlayerConnected\r\n\tstock FIXES_IsPlayerConnected(playerid)\r\n\t{\r\n\t\treturn _FIXES_IS_PLAYER_CONNECTED(playerid);\r\n\t}\r\n\t\r\n\t#define _ALS_IsPlayerConnected\r\n\t#define IsPlayerConnected FIXES_IsPlayerConnected\r\n#endif\r\n\r\n/* \r\n * _FIXES_CreateGameTextDraws(playerid, test)\r\n * \r\n * Create the text draws used to replicate game texts.\r\n * \r\n * FIXES:\r\n *     GameText\r\n */\r\n\r\n#if FIX_GameText\r\n\tstatic _FIXES_CreateGameTextDraws(const playerid)\r\n\t{\r\n\t\tif (playerid == INVALID_PLAYER_ID)\r\n\t\t{\r\n\t\t\t\tnew\r\n\t\t\t\t\tText:t;\r\n\t\t\t\t\r\n\t\t\t#if FIX_GameTextStyles\r\n\t\t\t\t\r\n\t\t\t\t// Global style 7 (vehicle name).\r\n\t\t\t\tt = FIXES_gsGTStyle[7] = TextDrawCreate(608.000000, 344.000000, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 1.000000, 3.000000),\r\n\t\t\t\tTextDrawAlignment(t, 3),\r\n\t\t\t\tTextDrawColor(t, 0x36682CFF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 2),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 2),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 10.0, 200.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 8 (location name).\r\n\t\t\t\tt = FIXES_gsGTStyle[8] = TextDrawCreate(608.000000, 386.500000, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 1.200000, 3.799998),\r\n\t\t\t\tTextDrawAlignment(t, 3),\r\n\t\t\t\tTextDrawColor(t, 0xACCBF1FF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 2),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 0),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 10.0, 200.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 9 (radio name).\r\n\t\t\t\tt = FIXES_gsGTStyle[9] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 0.600000, 1.899999),\r\n\t\t\t\tTextDrawAlignment(t, 2),\r\n\t\t\t\tTextDrawColor(t, 0x906210FF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 1),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 2),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 10 (radio switch).\r\n\t\t\t\tt = FIXES_gsGTStyle[10] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 0.600000, 1.899999),\r\n\t\t\t\tTextDrawAlignment(t, 2),\r\n\t\t\t\tTextDrawColor(t, 0x969696FF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 1),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 2),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 11 (positive money).\r\n\t\t\t\tt = FIXES_gsGTStyle[11] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 0.550000, 2.150000),\r\n\t\t\t\tTextDrawAlignment(t, 3),\r\n\t\t\t\tTextDrawColor(t, 0x36682CFF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 2),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000FF),\r\n\t\t\t\tTextDrawFont(t, 3),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 10.0, 200.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 12 (negative money).\r\n\t\t\t\tt = FIXES_gsGTStyle[12] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 0.550000, 2.150000),\r\n\t\t\t\tTextDrawAlignment(t, 3),\r\n\t\t\t\tTextDrawColor(t, 0xB4191DFF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 2),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000FF),\r\n\t\t\t\tTextDrawFont(t, 3),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 10.0, 200.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 13 (stunt).\r\n\t\t\t\tt = FIXES_gsGTStyle[13] = TextDrawCreate(380.000000, 341.000000, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 0.579999, 2.400000),\r\n\t\t\t\tTextDrawTextSize(t, 40.000000, 460.000000),\r\n\t\t\t\tTextDrawAlignment(t, 2),\r\n\t\t\t\tTextDrawColor(t, 0xD7D3CCFF),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0),\r\n\t\t\t\tTextDrawSetShadow(t, 2),\r\n\t\t\t\tTextDrawSetOutline(t, 0),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 1),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\t\r\n\t\t\t#endif\r\n\t\t\t\t\r\n\t\t\t\t// Global style 0.\r\n\t\t\t\tt = FIXES_gsGTStyle[0] = TextDrawCreate(320.0, 214.0, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 1.3, 3.6),\r\n\t\t\t\tTextDrawAlignment(t, 2),\r\n\t\t\t\tTextDrawColor(t, 0x906210FF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 2),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 3),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 1.\r\n\t\t\t\tt = FIXES_gsGTStyle[1] = TextDrawCreate(620.0, 310.0, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 1.0, 2.6),\r\n\t\t\t\tTextDrawAlignment(t, 3),\r\n\t\t\t\tTextDrawColor(t, 0x906210FF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 2),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 3),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 10.0, 200.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 2.\r\n\t\t\t\tt = FIXES_gsGTStyle[2] = TextDrawCreate(320.0, 156.0, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 2.1, 4.2),\r\n\t\t\t\tTextDrawAlignment(t, 2),\r\n\t\t\t\tTextDrawColor(t, 0xE1E1E1FF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 3),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 0),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 3.\r\n\t\t\t\tt = FIXES_gsGTStyle[3] = TextDrawCreate(320.000000, 154.500000, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 0.600000, 2.750000),\r\n\t\t\t\tTextDrawAlignment(t, 2),\r\n\t\t\t\tTextDrawColor(t, 0x906210FF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 2),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 2),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 4.\r\n\t\t\t\tt = FIXES_gsGTStyle[4] = TextDrawCreate(320.000000, 115.500000, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 0.600000, 2.750000),\r\n\t\t\t\tTextDrawAlignment(t, 2),\r\n\t\t\t\tTextDrawColor(t, 0x906210FF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 2),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 2),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 5.\r\n\t\t\t\tt = FIXES_gsGTStyle[5] = TextDrawCreate(320.0, 217.0, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 0.6, 2.75),\r\n\t\t\t\tTextDrawAlignment(t, 2),\r\n\t\t\t\tTextDrawColor(t, 0xE1E1E1FF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 2),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 2),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 6.\r\n\t\t\t\tt = FIXES_gsGTStyle[6] = TextDrawCreate(320.000000, 60.000000, FIXES_gscSpace),\r\n\t\t\t\tTextDrawLetterSize(t, 1.000000, 3.599998),\r\n\t\t\t\tTextDrawAlignment(t, 2),\r\n\t\t\t\tTextDrawColor(t, 0xACCBF1FF),\r\n\t\t\t\tTextDrawSetShadow(t, 0),\r\n\t\t\t\tTextDrawSetOutline(t, 2),\r\n\t\t\t\tTextDrawBackgroundColor(t, 0x000000AA),\r\n\t\t\t\tTextDrawFont(t, 3),\r\n\t\t\t\tTextDrawSetProportional(t, 1),\r\n\t\t\t\tTextDrawUseBox(t, true),\r\n\t\t\t\tTextDrawBoxColor(t, 0x00000000),\r\n\t\t\t\tTextDrawTextSize(t, 200.0, 620.0);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t\tnew\r\n\t\t\t\t\tPlayerText:t;\r\n\t\t\t\t\r\n\t\t\t#if FIX_GameTextStyles\r\n\t\t\t\t\r\n\t\t\t\t// Global style 7 (playerid, vehicle name).\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][7] = CreatePlayerTextDraw(playerid, 608.000000, 344.000000, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 1.000000, 3.000000),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0x36682CFF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 10.0, 200.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 8 (playerid, location name).\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][8] = CreatePlayerTextDraw(playerid, 608.000000, 386.500000, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 1.200000, 3.799998),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0xACCBF1FF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 10.0, 200.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 9 (playerid, radio name).\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][9] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0x906210FF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 170),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 10 (playerid, radio switch).\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][10] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0x969696FF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 170),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 11 (playerid, positive money).\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][11] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0x36682CFF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000FF),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 10.0, 200.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 12 (playerid, negative money).\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][12] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0xB4191DFF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000FF),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 10.0, 200.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 13 (playerid, stunt).\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][13] = CreatePlayerTextDraw(playerid, 380.000000, 341.000000, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 0.579999, 2.400000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 40.000000, 460.000000),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0xD7D3CCFF),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 170),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1);\r\n\t\t\t\t\r\n\t\t\t#endif\r\n\t\t\t\t\r\n\t\t\t\t// Global style 0.\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][0] = CreatePlayerTextDraw(playerid, 320.0, 214.0, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 1.3, 3.6),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0x906210FF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 1.\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][1] = CreatePlayerTextDraw(playerid, 620.0, 310.0, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 1.0, 2.6),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0x906210FF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 10.0, 200.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 2.\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][2] = CreatePlayerTextDraw(playerid, 320.0, 156.0, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 2.1, 4.2),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0xE1E1E1FF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 3.\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][3] = CreatePlayerTextDraw(playerid, 320.000000, 154.500000, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0x906210FF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 4.\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][4] = CreatePlayerTextDraw(playerid, 320.000000, 115.500000, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0x906210FF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 5.\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][5] = CreatePlayerTextDraw(playerid, 320.0, 217.0, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 0.6, 2.75),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0xE1E1E1FF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 200.0, 620.0);\r\n\t\t\t\t\r\n\t\t\t\t// Global style 6.\r\n\t\t\t\tt = FIXES_gsPGTStyle[playerid][6] = CreatePlayerTextDraw(playerid, 320.000000, 60.000000, FIXES_gscSpace),\r\n\t\t\t\tPlayerTextDrawLetterSize(playerid, t, 1.000000, 3.599998),\r\n\t\t\t\tPlayerTextDrawAlignment(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawColor(playerid, t, 0xACCBF1FF),\r\n\t\t\t\tPlayerTextDrawSetShadow(playerid, t, 0),\r\n\t\t\t\tPlayerTextDrawSetOutline(playerid, t, 2),\r\n\t\t\t\tPlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),\r\n\t\t\t\tPlayerTextDrawFont(playerid, t, 3),\r\n\t\t\t\tPlayerTextDrawSetProportional(playerid, t, 1),\r\n\t\t\t\tPlayerTextDrawUseBox(playerid, t, true),\r\n\t\t\t\tPlayerTextDrawBoxColor(playerid, t, 0x00000000),\r\n\t\t\t\tPlayerTextDrawTextSize(playerid, t, 200.0, 620.0);\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n/* \r\n * OnFilterScriptInit()\r\n * \r\n * Set \"IS_FILTERSCRIPT\" to true as this callback is ONLY called if this script\r\n * is actually a FilterScript.  Then call \"FIXES_OnScriptInit\".\r\n * \r\n * FIXES:\r\n *     IS_FILTERSCRIPT\r\n *     OnPlayerConnect\r\n *     GameText\r\n */\r\n\r\npublic OnFilterScriptInit()\r\n{\r\n\t// It is possible for this to be the only thing done in this function!\r\n\t_FIXES_gIsFilterscript = true;\r\n\t\r\n\tstate _ALS : _ALS_go;\r\n\t\r\n\t#if FIXES_Single\r\n\t\t// Check this really IS the only script running.\r\n\t\tif (existproperty(5, FIXES_gscSingleProperty))\r\n\t\t{\r\n\t\t\tprint(FIXES_gscFixesError);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_SECOND_USE,\r\n\t\t\tsetproperty(5, FIXES_gscSingleProperty, 1);\r\n\t\t}\r\n\t#endif\r\n\t\r\n\t// =================\r\n\t//  BEGIN: GameText \r\n\t// =================\r\n\t#if FIX_GameText\r\n\t\tfor (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i)\r\n\t\t{\r\n\t\t\tFIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS;\r\n\t\t}\r\n\t#endif\r\n\t#if FIXES_Single\r\n\t\t#if FIX_GameText\r\n\t\t\t_FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);\r\n\t\t#endif\r\n\t\t// =================\r\n\t\t//  END:   GameText \r\n\t\t// =================\r\n\t#else\r\n\t\tFIXES_DetermineOrder(),\r\n\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;\r\n\t#endif\r\n\t\r\n\t#if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect\r\n\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_NO_GAME_TEXT;\r\n\t#endif\r\n\t// These are all the fixes that use \"_FIXES_FOREACH\".\r\n\t#if FIX_OnPlayerConnect || _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable\r\n\t\tfor (new playerid = 0; playerid != MAX_PLAYERS; ++playerid)\r\n\t\t{\r\n\t\t\tif (BAD_IsPlayerConnected(playerid))\r\n\t\t\t{\r\n\t\t\t\t// No \"defined\" checks - if you don't want this fix because\r\n\t\t\t\t// you don't have an \"OnPlayerConnect\", just don't use it!\r\n\t\t\t\t// Of course, it helps that the copy of \"OnPlayerConnect\"\r\n\t\t\t\t// in this include is almost always called!\r\n\t\t\t\t#if FIX_OnPlayerConnect\r\n\t\t\t\t\t// ========================\r\n\t\t\t\t\t//  BEGIN: OnPlayerConnect \r\n\t\t\t\t\t// ========================\r\n\t\t\t\t\tOnPlayerConnect(playerid);\r\n\t\t\t\t\t// ========================\r\n\t\t\t\t\t//  END:   OnPlayerConnect \r\n\t\t\t\t\t// ========================\r\n\t\t\t\t#else\r\n\t\t\t\t\t_FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);\r\n\t\t\t\t\t\r\n\t\t\t\t\t#if FIX_GameText\r\n\t\t\t\t\t\t// =================\r\n\t\t\t\t\t\t//  BEGIN: GameText \r\n\t\t\t\t\t\t// =================\r\n\t\t\t\t\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t_FIXES_CreateGameTextDraws(playerid);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// =================\r\n\t\t\t\t\t\t//  END:   GameText \r\n\t\t\t\t\t\t// =================\r\n\t\t\t\t\t#endif\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t}\r\n\t#endif\r\n\t#if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect\r\n\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_NO_GAME_TEXT;\r\n\t#endif\r\n\t\r\n\treturn FIXES_OnFilterScriptInit();\r\n}\r\n\r\n#if defined _ALS_OnFilterScriptInit\r\n\t#error _ALS_OnFilterScriptInit defined\r\n#endif\r\n#define _ALS_OnFilterScriptInit\r\n#define OnFilterScriptInit(%0) FIXES_OnFilterScriptInit(%0) <_ALS : _ALS_go>\r\n\r\n_FIXES_FORWARD FIXES_OnFilterScriptInit();\r\n\r\n/* \r\n * OnGameModeInit()\r\n * \r\n * Call \"FIXES_OnScriptInit\" if this is not a FilterScript.\r\n * \r\n * FIXES:\r\n *     IS_FILTERSCRIPT\r\n *     AllowInteriorWeapons\r\n *     AllowTeleport\r\n */\r\n\r\npublic OnGameModeInit()\r\n{\r\n\tstate _ALS : _ALS_go;\r\n\t\r\n\t#if FIXES_Single\r\n\t\t// Check this really IS the only script running.  Properties reset when\r\n\t\t// a gamemode restarts, so we don't have to worry about filterscipts\r\n\t\t// detecting themselves.\r\n\t\tif (FIXES_gsSettings & e_FIXES_SETTINGS_SECOND_USE)\r\n\t\t{\r\n\t\t\tif (existproperty(5, FIXES_gscSingleProperty))\r\n\t\t\t{\r\n\t\t\t\tprint(FIXES_gscFixesError);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tsetproperty(5, FIXES_gscSingleProperty, 1);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// When the server starts, we need to allow an FS to load with a GM\r\n\t\t\t// that doesn't use fixes.inc.  This is the only case where a\r\n\t\t\t// property can be set while a ganemode isn't running.  This will\r\n\t\t\t// mean that the FS won't complain if they are both using fixes, but\r\n\t\t\t// the GM still will, so all is good.\r\n\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_SECOND_USE;\r\n\t\t}\r\n\t#endif\r\n\t\r\n\t// =============================\r\n\t//  BEGIN: AllowInteriorWeapons \r\n\t// =============================\r\n\t// ======================\r\n\t//  BEGIN: AllowTeleport \r\n\t// ======================\r\n\t#if FIX_AllowInteriorWeapons && FIX_AllowTeleport && !defined FILTERSCRIPT\r\n\t\tFIXES_gsSettings &= ~(e_FIXES_SETTINGS_INTERIOR | e_FIXES_SETTINGS_ADMIN_TELEPORT);\r\n\t#elseif FIX_AllowInteriorWeapons\r\n\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;\r\n\t#elseif FIX_AllowTeleport && !defined FILTERSCRIPT\r\n\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;\r\n\t#endif\r\n\t// ======================\r\n\t//  END:   AllowTeleport \r\n\t// ======================\r\n\t// ===========================\r\n\t//  END: AllowInteriorWeapons \r\n\t// ===========================\r\n\t\r\n\t#if FIX_GameText || !FIXES_Single\r\n\t\tif (!_FIXES_gIsFilterscript)\r\n\t\t{\r\n\t\t\t// =================\r\n\t\t\t//  BEGIN: GameText \r\n\t\t\t// =================\r\n\t\t\t#if FIX_GameText\r\n\t\t\t\t\tfor (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS;\r\n\t\t\t\t\t}\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t_FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);\r\n\t\t\t\t#endif\r\n\t\t\t#endif\r\n\t\t\t// =================\r\n\t\t\t//  END:   GameText \r\n\t\t\t// =================\r\n\t\t\t#if !FIXES_Single\r\n\t\t\t\tFIXES_DetermineOrder();\r\n\t\t\t#endif\r\n\t\t}\r\n\t#endif\r\n\t#if !FIXES_Single\r\n\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;\r\n\t#endif\r\n\t\r\n\treturn FIXES_OnGameModeInit();\r\n}\r\n\r\n#if defined _ALS_OnGameModeInit\r\n\t#error _ALS_OnGameModeInit defined\r\n#endif\r\n#define _ALS_OnGameModeInit\r\n#define OnGameModeInit(%0) FIXES_OnGameModeInit(%0) <_ALS : _ALS_go>\r\n\r\n_FIXES_FORWARD FIXES_OnGameModeInit();\r\n\r\n/* \r\n * OnGameModeExit()\r\n * \r\n * Fast way of detecting not to retain any data.\r\n */\r\n\r\n#if !FIXES_Single || FIX_PlayerDialogResponse\r\n\tpublic OnGameModeExit()\r\n\t{\r\n\t\t#if !FIXES_Single\r\n\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_DROP_ALL_DATA;\r\n\t\t\tif (!_FIXES_gIsFilterscript && FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_ENDING,\r\n\t\t\t\tFIXES_DetermineOrder();\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t\r\n\t\t// =============================\r\n\t\t//  BEGIN: PlayerDialogResponse \r\n\t\t// =============================\r\n\t\t#if FIX_PlayerDialogResponse\r\n\t\t\tfor (new playerid = 0; playerid != MAX_PLAYERS; ++playerid)\r\n\t\t\t{\r\n\t\t\t\tShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace);\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// =============================\r\n\t\t//  END:   PlayerDialogResponse \r\n\t\t// =============================\r\n\t\t\r\n\t\treturn FIXES_OnGameModeExit();\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnGameModeExit\r\n\t\t#error _ALS_OnGameModeExit defined\r\n\t#endif\r\n\t#define _ALS_OnGameModeExit\r\n\t#define OnGameModeExit(%0) FIXES_OnGameModeExit(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnGameModeExit();\r\n#endif\r\n\r\n/* \r\n * OnFilterScriptExit()\r\n * \r\n * Fast way of detecting not to retain any data.\r\n */\r\n\r\n#if !FIXES_Single || FIX_GameText || FIX_OnPlayerDisconnect\r\n\tpublic OnFilterScriptExit()\r\n\t{\r\n\t\t#if FIX_OnPlayerDisconnect\r\n\t\t\t// Removal safe loop.\r\n\t\t\tfor (new next, playerid = FIXES_gsPlayersIterator[MAX_PLAYERS]; playerid != MAX_PLAYERS; playerid = next)\r\n\t\t\t{\r\n\t\t\t\tnext = FIXES_gsPlayersIterator[playerid],\r\n\t\t\t\tOnPlayerDisconnect(playerid, 4);\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t// =================\r\n\t\t\t\t\t//  BEGIN: GameText \r\n\t\t\t\t\t// =================\r\n\t\t\t\t\t#if FIX_GameText\r\n\t\t\t\t\t\t#if FIX_GameTextStyles\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);\r\n\t\t\t\t\t#endif\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t#if FIXES_Single\r\n\t\t\t// =================\r\n\t\t\t//  BEGIN: GameText \r\n\t\t\t// =================\r\n\t\t\t#if FIX_GameText\r\n\t\t\t\t#if defined FIXES_OnFilterScriptExit\r\n\t\t\t\t\tFIXES_OnFilterScriptExit();\r\n\t\t\t\t#endif\r\n\t\t\t\t#if !FIX_OnPlayerDisconnect\r\n\t\t\t\t\t_FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t#if FIX_GameTextStyles\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);\r\n\t\t\t\t\t}\r\n\t\t\t\t#endif\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\t#if FIX_GameTextStyles\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[13]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[12]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[11]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[10]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[9]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[8]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[7]),\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[6]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[5]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[4]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[3]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[2]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[1]),\r\n\t\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[0]);\r\n\t\t\t#else\r\n\t\t\t\t\treturn FIXES_OnFilterScriptExit();\r\n\t\t\t#endif\r\n\t\t\t// =================\r\n\t\t\t//  END:   GameText \r\n\t\t\t// =================\r\n\t\t#else\r\n\t\t\tif (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_ENDING,\r\n\t\t\t\tFIXES_DetermineOrder();\r\n\t\t\t}\r\n\t\t\treturn FIXES_OnFilterScriptExit();\r\n\t\t#endif\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnFilterScriptExit\r\n\t\t#error _ALS_OnFilterScriptExit defined\r\n\t#endif\r\n\t#define _ALS_OnFilterScriptExit\r\n\t#define OnFilterScriptExit(%0) FIXES_OnFilterScriptExit(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnFilterScriptExit();\r\n#endif\r\n\r\n/* \r\n * OnPlayerCommandText(playerid, cmdtext[])\r\n * \r\n * FIXES:\r\n *     OnPlayerCommandText\r\n */\r\n\r\n#if FIX_OnPlayerCommandText\r\n\tpublic OnPlayerCommandText(playerid, cmdtext[])\r\n\t{\r\n\t\t// ============================\r\n\t\t//  BEGIN: OnPlayerCommandText \r\n\t\t// ============================\r\n\t\t#if FIX_OnPlayerCommandText\r\n\t\t\t// If this \"#if\" is around the whole function, it doesn't always\r\n\t\t\t// compile properly.\r\n\t\t\treturn FIXES_OnPlayerCommandText(playerid, (cmdtext[0] <= '\\1') ? FIXES_gscNULL : cmdtext);\r\n\t\t#endif\r\n\t\t// ============================\r\n\t\t//  END: OnPlayerCommandText \r\n\t\t// ============================\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerCommandText\r\n\t\t#error _ALS_OnPlayerCommandText defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerCommandText\r\n\t#define OnPlayerCommandText(%0) FIXES_OnPlayerCommandText(%0) <_ALS : _ALS_go>\r\n\t\r\n\tforward FIXES_OnPlayerCommandText(playerid, cmdtext[]);\r\n\tpublic FIXES_OnPlayerCommandText(playerid, cmdtext[]) <_ALS : _ALS_x0, _ALS : _ALS_x1> { return 0; }\r\n\tpublic FIXES_OnPlayerCommandText(playerid, cmdtext[]) <> { return 0; }\r\n#endif\r\n\r\n/* \r\n * OnPlayerConnect(playerid)\r\n * \r\n * Almost every fix uses this callback for initialisation.  It is only\r\n * explicitly referenced for those fixes where this is all the code.  The\r\n * inclusion code was approaching the 512 line length limit, so I shrank it.\r\n * \r\n * FIXES:\r\n *     TogglePlayerControllable\r\n *     SetPlayerWorldBounds\r\n *     GetPlayerColor\r\n *     SetPlayerName\r\n *     GetPlayerSkin\r\n *     IsPlayerInCheckpoint\r\n *     IsPlayerInRaceCheckpoint\r\n *     GetPlayerWeapon\r\n *     PutPlayerInVehicle\r\n *     OnPlayerEnterVehicle\r\n *     AllowTeleport\r\n *     OnDialogResponse\r\n *     SetSpawnInfo\r\n *     AllowInteriorWeapons\r\n *     TrainExit\r\n *     Kick\r\n *     OnPlayerEnterVehicle_2\r\n *     PlayerDialogResponse\r\n *     OnPlayerSpawn\r\n *     ApplyAnimation_2\r\n */\r\n\r\n#if     FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_SetPlayerName            || FIX_GetPlayerColour\r\n\t#define _FIXES_ON_PLAYER_CONNECT\r\n#elseif FIX_GetPlayerSkin        || FIX_IsPlayerInCheckpoint     || FIX_IsPlayerInRaceCheckpoint || FIX_GetPlayerWeapon\r\n\t#define _FIXES_ON_PLAYER_CONNECT\r\n#elseif FIX_PutPlayerInVehicle   || FIX_OnPlayerEnterVehicle     || FIX_AllowTeleport            || FIX_OnDialogResponse\r\n\t#define _FIXES_ON_PLAYER_CONNECT\r\n#elseif FIX_GetPlayerDialog      || FIX_SetSpawnInfo             || FIX_AllowInteriorWeapons     || FIX_TrainExit\r\n\t#define _FIXES_ON_PLAYER_CONNECT\r\n#elseif FIX_Kick                 || FIX_OnPlayerEnterVehicle_2   || FIX_PlayerDialogResponse     || FIX_GetPlayerInterior\r\n\t#define _FIXES_ON_PLAYER_CONNECT\r\n#elseif FIX_OnPlayerSpawn        || FIX_ApplyAnimation_2         || FIX_GameText                 || _FIX_Menus\r\n\t#define _FIXES_ON_PLAYER_CONNECT\r\n#elseif FIX_GetPlayerMenu        || FIX_OnPlayerDisconnect       || FIX_OnPlayerConnect          || FIX_SetPlayerTime\r\n\t#define _FIXES_ON_PLAYER_CONNECT\r\n#elseif FIX_SetPlayerColour\r\n\t#define _FIXES_ON_PLAYER_CONNECT\r\n#endif\r\n\r\n#if defined _FIXES_ON_PLAYER_CONNECT\r\n\tpublic OnPlayerConnect(playerid)\r\n\t{\r\n\t\t// =========================\r\n\t\t//  BEGIN: ApplyAnimation_2 \r\n\t\t// =========================\r\n\t\t#if FIX_ApplyAnimation_2\r\n\t\t\tFIXES_gsPlayerAnimLibs[playerid][0] =\r\n\t\t\t\tFIXES_gsPlayerAnimLibs[playerid][1] =\r\n\t\t\t\t\tFIXES_gsPlayerAnimLibs[playerid][2] =\r\n\t\t\t\t\t\tFIXES_gsPlayerAnimLibs[playerid][3] =\r\n\t\t\t\t\t\t\tFIXES_gsPlayerAnimLibs[playerid][4] = -1;\r\n\t\t#endif\r\n\t\t// =======================\r\n\t\t//  END: ApplyAnimation_2 \r\n\t\t// =======================\r\n\t\t\r\n\t\t#if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable\r\n\t\t\t_FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);\r\n\t\t#endif\r\n\t\t\r\n\t\tFIXES_PRINTF(\"FIXES_OnPlayerConnect: %d\", playerid);\r\n\t\t\t// This is only reset when the Game Mode changes or when a new\r\n\t\t#if FIX_Kick || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_AllowInteriorWeapons || FIX_TrainExit || FIX_OnPlayerEnterVehicle_2 || FIX_SetPlayerColour\r\n\t\t\t// player connects, which is what we want.  The other items are the\r\n\t\t\t// same, but must be done only once.  This variable will tend to\r\n\t\t\t// hold data relevant only in the master script (the first\r\n\t\t\t// filterscript).\r\n\t\t\t#if FIX_Kick || FIX_SetPlayerTime || FIX_SetPlayerColour\r\n\t\t\t\tFIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_ON_PLAYER_CONNECT;\r\n\t\t\t#else\r\n\t\t\t\tFIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_NONE;\r\n\t\t\t#endif\r\n\t\t#endif\r\n\t\t\r\n\t\t// =================\r\n\t\t//  BEGIN: GameText \r\n\t\t// =================\r\n\t\t#if FIX_GameText\r\n\t\t\t#if !FIXES_Single\r\n\t\t\t\tif (FIXES_gsSettings & (e_FIXES_SETTINGS_NO_GAME_TEXT | e_FIXES_SETTINGS_IN_CHARGE) == e_FIXES_SETTINGS_IN_CHARGE)\r\n\t\t\t#endif\r\n\t\t\t\t{\r\n\t\t\t\t\t_FIXES_CreateGameTextDraws(playerid);\r\n\t\t\t\t}\r\n\t\t#endif\r\n\t\t// =================\r\n\t\t//  END:   GameText \r\n\t\t// =================\r\n\t\t\r\n\t\t#if !FIXES_Single\r\n\t\t\tif (!GetPVarInt(playerid, FIXES_pvarNotNewPlayer))\r\n\t\t#endif\r\n\t\t\t{\r\n\t\t\t\tFIXES_PRINTF(\"FIXES_OnPlayerConnect: First (%d)\", FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE);\r\n\t\t\t\t// ======================\r\n\t\t\t\t//  BEGIN: SetPlayerName \r\n\t\t\t\t// ======================\r\n\t\t\t\t#if FIX_SetPlayerName\r\n\t\t\t\t\tnew\r\n\t\t\t\t\t\tname[MAX_PLAYER_NAME];\r\n\t\t\t\t\tGetPlayerName(playerid, name, MAX_PLAYER_NAME);\r\n\t\t\t\t\tif (strcmp(name, FIXES_gscTempName) == 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tKick(playerid);\r\n\t\t\t\t\t}\r\n\t\t\t\t#endif\r\n\t\t\t\t// ======================\r\n\t\t\t\t//  END:   SetPlayerName \r\n\t\t\t\t// ======================\r\n\t\t\t\t\r\n\t\t\t\t// =============================\r\n\t\t\t\t//  BEGIN: SetPlayerWorldBounds \r\n\t\t\t\t// =============================\r\n\t\t\t\t#if FIX_SetPlayerWorldBounds && !FIXES_Single\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] =\r\n\t\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] =\r\n\t\t\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] =\r\n\t\t\t\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] =\r\n\t\t\t\t\t\t\t\t\t0.0;\r\n\t\t\t\t#endif\r\n\t\t\t\t// =============================\r\n\t\t\t\t//  END:   SetPlayerWorldBounds \r\n\t\t\t\t// =============================\r\n\t\t\t\t\r\n\t\t\t\t// =======================\r\n\t\t\t\t//  BEGIN: GetPlayerColor \r\n\t\t\t\t// =======================\r\n\t\t\t\t#if FIX_GetPlayerColour\r\n\t\t\t\t\tSetPlayerColor(playerid, FIXES_gscPlayerColours[playerid % 100]);\r\n\t\t\t\t#endif\r\n\t\t\t\t// =======================\r\n\t\t\t\t//  END:   GetPlayerColor \r\n\t\t\t\t// =======================\r\n\t\t\t\t\r\n\t\t\t\t// ======================\r\n\t\t\t\t//  BEGIN: GetPlayerSkin \r\n\t\t\t\t// ======================\r\n\t\t\t\t#if FIX_GetPlayerSkin\r\n\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\tFIXES_gsPlayerSkin[playerid] = 0;\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerSkin, 0);\r\n\t\t\t\t\t#endif\r\n\t\t\t\t#endif\r\n\t\t\t\t// ======================\r\n\t\t\t\t//  END:   GetPlayerSkin \r\n\t\t\t\t// ======================\r\n\t\t\t\t\r\n\t\t\t\t// =============================\r\n\t\t\t\t//  BEGIN: IsPlayerInCheckpoint \r\n\t\t\t\t// =============================\r\n\t\t\t\t#if FIX_IsPlayerInCheckpoint\r\n\t\t\t\t\tDisablePlayerCheckpoint(playerid);\r\n\t\t\t\t#endif\r\n\t\t\t\t// =============================\r\n\t\t\t\t//  END:   IsPlayerInCheckpoint \r\n\t\t\t\t// =============================\r\n\t\t\t\t\r\n\t\t\t\t// =================================\r\n\t\t\t\t//  BEGIN: IsPlayerInRaceCheckpoint \r\n\t\t\t\t// =================================\r\n\t\t\t\t#if FIX_IsPlayerInRaceCheckpoint\r\n\t\t\t\t\tDisablePlayerRaceCheckpoint(playerid);\r\n\t\t\t\t#endif\r\n\t\t\t\t// =================================\r\n\t\t\t\t//  END:   IsPlayerInRaceCheckpoint \r\n\t\t\t\t// =================================\r\n\t\t\t\t\r\n\t\t\t\t// ========================\r\n\t\t\t\t//  BEGIN: GetPlayerWeapon \r\n\t\t\t\t// ========================\r\n\t\t\t\t#if FIX_GetPlayerWeapon\r\n\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\tFIXES_gsPlayerWeapon[playerid] = -1;\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);\r\n\t\t\t\t\t#endif\r\n\t\t\t\t#endif\r\n\t\t\t\t// ========================\r\n\t\t\t\t//  END:   GetPlayerWeapon \r\n\t\t\t\t// ========================\r\n\t\t\t\t\r\n\t\t\t\t// ==========================\r\n\t\t\t\t//  BEGIN: GetPlayerInterior \r\n\t\t\t\t// ==========================\r\n\t\t\t\t#if FIX_GetPlayerInterior\r\n\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\tFIXES_gsInterior[playerid] = 0;\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerInterior, 0);\r\n\t\t\t\t\t#endif\r\n\t\t\t\t#endif\r\n\t\t\t\t// ==========================\r\n\t\t\t\t//  END:   GetPlayerInterior \r\n\t\t\t\t// ==========================\r\n\t\t\t\t\r\n\t\t\t\t// =========================\r\n\t\t\t\t//  BEGIN: OnDialogResponse \r\n\t\t\t\t// =========================\r\n\t\t\t\t#if FIX_OnDialogResponse || FIX_GetPlayerDialog\r\n\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\tFIXES_gsDialogID[playerid] = INVALID_DIALOG_ID;\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);\r\n\t\t\t\t\t#endif\r\n\t\t\t\t#endif\r\n\t\t\t\t// =========================\r\n\t\t\t\t//  END:   OnDialogResponse \r\n\t\t\t\t// =========================\r\n\t\t\t\t\r\n\t\t\t\t// =============================\r\n\t\t\t\t//  BEGIN: PlayerDialogResponse \r\n\t\t\t\t// =============================\r\n\t\t\t\t#if FIX_PlayerDialogResponse\r\n\t\t\t\t\tShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace);\r\n\t\t\t\t#endif\r\n\t\t\t\t// =============================\r\n\t\t\t\t//  END:   PlayerDialogResponse \r\n\t\t\t\t// =============================\r\n\t\t\t\t\r\n\t\t\t\t// =====================\r\n\t\t\t\t//  BEGIN: SetSpawnInfo \r\n\t\t\t\t// =====================\r\n\t\t\t\t#if FIX_SetSpawnInfo\r\n\t\t\t\t\tSetSpawnInfo(playerid, NO_TEAM, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);\r\n\t\t\t\t#endif\r\n\t\t\t\t// =====================\r\n\t\t\t\t//  END:   SetSpawnInfo \r\n\t\t\t\t// =====================\r\n\t\t\t\t\r\n\t\t\t\t// ======================\r\n\t\t\t\t//  BEGIN: OnPlayerSpawn \r\n\t\t\t\t// ======================\r\n\t\t\t\t#if FIX_OnPlayerSpawn\r\n\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\tFIXES_gsLastCash[playerid] = 0;\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0);\r\n\t\t\t\t\t#endif\r\n\t\t\t\t#endif\r\n\t\t\t\t// ======================\r\n\t\t\t\t//  END:   OnPlayerSpawn \r\n\t\t\t\t// ======================\r\n\t\t\t\t\r\n\t\t\t\t#if !FIXES_Single\r\n\t\t\t\t\t// No longer their first time.\r\n\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarNotNewPlayer, 1);\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t// =============\r\n\t\t//  BEGIN: Kick \r\n\t\t// =============\r\n\t\t#if FIX_Kick || FIX_SetPlayerTime || FIX_SetPlayerColour\r\n\t\t\tnew\r\n\t\t\t\tret = FIXES_OnPlayerConnect(playerid);\r\n\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_ON_PLAYER_CONNECT;\r\n\t\t\treturn ret;\r\n\t\t#else\r\n\t\t\treturn FIXES_OnPlayerConnect(playerid);\r\n\t\t#endif\r\n\t\t// =============\r\n\t\t//  END:   Kick \r\n\t\t// =============\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerConnect\r\n\t\t#error _ALS_OnPlayerConnect defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerConnect\r\n\t#define OnPlayerConnect(%0) FIXES_OnPlayerConnect(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerConnect(playerid);\r\n#endif\r\n\r\n/* \r\n * OnPlayerDisconnect(playerid, reason)\r\n * \r\n * FIXES:\r\n *     SetPlayerAttachedObject\r\n *     IsPlayerAttachedObjectSlotUsed\r\n *     Kick\r\n *     GetPlayerMenu\r\n */\r\n\r\n#if FIX_SetPlayerAttachedObject || FIX_IsPlayerAttachedObjSlotUsed || FIX_Kick || (FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2)) || FIX_GetPlayerMenu || _FIX_Menus || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_ApplyAnimation_2\r\n\tpublic OnPlayerDisconnect(playerid, reason)\r\n\t{\r\n\t\tnew\r\n\t\t\tret = FIXES_OnPlayerDisconnect(playerid, reason);\r\n\t\t\r\n\t\t// =========================\r\n\t\t//  BEGIN: ApplyAnimation_2 \r\n\t\t// =========================\r\n\t\t#if FIX_ApplyAnimation_2\r\n\t\t\tif (FIXES_gsAnimTimer[playerid])\r\n\t\t\t{\r\n\t\t\t\tKillTimer(FIXES_gsAnimTimer[playerid]),\r\n\t\t\t\tFIXES_gsAnimTimer[playerid] = 0;\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// =======================\r\n\t\t//  END: ApplyAnimation_2 \r\n\t\t// =======================\r\n\t\t\r\n\t\t// ======================\r\n\t\t//  BEGIN: GetPlayerMenu \r\n\t\t// ======================\r\n\t\t#if FIX_GetPlayerMenu\r\n\t\t\tFIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;\r\n\t\t#endif\r\n\t\t// ======================\r\n\t\t//  END:   GetPlayerMenu \r\n\t\t// ======================\r\n\t\t\r\n\t\t// ==========================\r\n\t\t//  BEGIN: FIXES_SilentKick \r\n\t\t// ==========================\r\n\t\t#if FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2)\r\n\t\t\tnew\r\n\t\t\t\tshift = FIXES_gsPlayerIP[playerid];\r\n\t\t\tif (shift != -1)\r\n\t\t\t{\r\n\t\t\t\t// Unban the IP (timed out).\r\n\t\t\t\tnew\r\n\t\t\t\t\tip[16];\r\n\t\t\t\tformat(ip, sizeof (ip), \"unbanip %d.%d.%d.%d\", shift >>> 24, (shift >>> 16) & 0xFF, (shift >>> 8) & 0xFF, shift & 0xFF),\r\n\t\t\t\tFIXES_gsPlayerIP[playerid] = -1;\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// ==========================\r\n\t\t//  END:   FIXES_SilentKick \r\n\t\t// ==========================\r\n\t\t\r\n\t\t// ================================\r\n\t\t//  BEGIN: SetPlayerAttachedObject \r\n\t\t// ================================\r\n\t\t#if FIX_SetPlayerAttachedObject\r\n\t\t\t#if !(FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2))\r\n\t\t\t\tnew\r\n\t\t\t#endif\r\n\t\t\t\t\tshift = playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS;\r\n\t\t\t#pragma tabsize 4\r\n\t\t\tnew\r\n\t\t\t\tslot = playerid / _FIXES_ATTACHMENTS;\r\n\t\t\t#if !FIXES_Single\r\n\t\t\t\tif (!_FIXES_gIsFilterscript)\r\n\t\t\t#endif\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (new i = 0; i != MAX_PLAYER_ATTACHED_OBJECTS; ++i)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (FIXES_gsObjectSlots[slot] & 1 << shift + i)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tRemovePlayerAttachedObject(playerid, i);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t#pragma tabsize 4\r\n\t\t\tFIXES_gsObjectSlots[slot] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << shift);\r\n\t\t#endif\r\n\t\t// ================================\r\n\t\t//  END:   SetPlayerAttachedObject \r\n\t\t// ================================\r\n\t\t\r\n\t\t// =======================================\r\n\t\t//  BEGIN: IsPlayerAttachedObjectSlotUsed \r\n\t\t// =======================================\r\n\t\t#if FIX_IsPlayerAttachedObjSlotUsed && !FIX_SetPlayerAttachedObject\r\n\t\t\tFIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS);\r\n\t\t#endif\r\n\t\t// =======================================\r\n\t\t//  END:   IsPlayerAttachedObjectSlotUsed \r\n\t\t// =======================================\r\n\t\t\r\n\t\t// =============\r\n\t\t//  BEGIN: Kick \r\n\t\t// =============\r\n\t\t#if FIX_Kick\r\n\t\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_KICKED)\r\n\t\t\t{\r\n\t\t\t\t// Stop the timer if it is still running.\r\n\t\t\t\tKillTimer(GetPVarInt(playerid, FIXES_pvarKick));\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// =============\r\n\t\t//  END:   Kick \r\n\t\t// =============\r\n\t\t\r\n\t\t#if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable\r\n\t\t\t_FIXES_RemoveInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);\r\n\t\t#endif\r\n\t\t\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerDisconnect\r\n\t\t#error _ALS_OnPlayerDisconnect defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerDisconnect\r\n\t#define OnPlayerDisconnect(%0) FIXES_OnPlayerDisconnect(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerDisconnect(playerid, reason);\r\n#endif\r\n\r\n/* \r\n * OnPlayerDeath(playerid, killerid, reason)\r\n * \r\n * FIXES:\r\n *     OnPlayerDeath\r\n *     OnPlayerSpawn\r\n */\r\n\r\n#if FIX_OnPlayerDeath || FIX_OnPlayerSpawn\r\n\tpublic OnPlayerDeath(playerid, killerid, reason)\r\n\t{\r\n\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t{\r\n\t\t\t// ======================\r\n\t\t\t//  BEGIN: OnPlayerDeath \r\n\t\t\t// ======================\r\n\t\t\t#if FIX_OnPlayerDeath\r\n\t\t\t\tstatic\r\n\t\t\t\t\tsAnimlib[32],\r\n\t\t\t\t\tsAnimname[32];\r\n\t\t\t\tGetAnimationName(FIXES_gsLastAnimation[playerid], sAnimlib, sizeof (sAnimlib), sAnimname, sizeof (sAnimname));\r\n\t\t\t\tif (strcmp(sAnimlib, \"PED\", true))\r\n\t\t\t\t{\r\n\t\t\t\t\tClearAnimations(playerid);\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t\t// ======================\r\n\t\t\t//  END:   OnPlayerDeath \r\n\t\t\t// ======================\r\n\t\t}\r\n\t\t\r\n\t\t// ======================\r\n\t\t//  BEGIN: OnPlayerSpawn \r\n\t\t// ======================\r\n\t\t#if FIX_OnPlayerSpawn\r\n\t\t\tnew\r\n\t\t\t\tret = FIXES_OnPlayerDeath(playerid, killerid, reason);\r\n\t\t\t\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsLastCash[playerid] = GetPlayerMoney(playerid);\r\n\t\t\t#else\r\n\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerLastCash, GetPlayerMoney(playerid));\r\n\t\t\t#endif\r\n\t\t\t\r\n\t\t\treturn ret;\r\n\t\t#else\r\n\t\t\treturn FIXES_OnPlayerDeath(playerid, killerid, reason);\r\n\t\t#endif\r\n\t\t// ======================\r\n\t\t//  END:   OnPlayerSpawn \r\n\t\t// ======================\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerDeath\r\n\t\t#error _ALS_OnPlayerDeath defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerDeath\r\n\t#define OnPlayerDeath(%0) FIXES_OnPlayerDeath(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerDeath(playerid, killerid, reason);\r\n#endif\r\n\r\n/* \r\n * FIXES_SpawnPlayer(playerid)\r\n * \r\n * FIXES:\r\n *     SpawnPlayer\r\n */\r\n\r\n#if defined _ALS_SpawnPlayer\r\n\t#error _ALS_SpawnPlayer defined\r\n#endif\r\nnative BAD_SpawnPlayer(playerid) = SpawnPlayer;\r\n\r\n#if FIX_SpawnPlayer\r\n\tstock FIXES_SpawnPlayer(playerid)\r\n\t{\r\n\t\t// Valid \"playerid\" check inside \"GetPlayerVehicleID\".\r\n\t\tnew\r\n\t\t\tvid = GetPlayerVehicleID(playerid);\r\n\t\tif (vid)\r\n\t\t{\r\n\t\t\tnew\r\n\t\t\t\tFloat:x,\r\n\t\t\t\tFloat:y,\r\n\t\t\t\tFloat:z;\r\n\t\t\t// Remove them without the animation.\r\n\t\t\tGetVehiclePos(vid, x, y, z),\r\n\t\t\tSetPlayerPos(playerid, x, y, z);\r\n\t\t}\r\n\t\treturn SpawnPlayer(playerid);\r\n\t}\r\n\t\r\n\t#define _ALS_SpawnPlayer\r\n\t#define SpawnPlayer FIXES_SpawnPlayer\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerName(playerid, name[])\r\n * \r\n * FIXES:\r\n *     SetPlayerName\r\n */\r\n\r\n#if defined _ALS_SetPlayerName\r\n\t#error _ALS_SetPlayerName defined\r\n#endif\r\nnative BAD_SetPlayerName(playerid, const name[]) = SetPlayerName;\r\n\r\n#if FIX_SetPlayerName\r\n\tstock FIXES_SetPlayerName(playerid, name[])\r\n\t{\r\n\t\tstatic\r\n\t\t\tsOldName[MAX_PLAYER_NAME];\r\n\t\tGetPlayerName(playerid, sOldName, sizeof (sOldName));\r\n\t\tif (!strcmp(name, sOldName, true))\r\n\t\t{\r\n\t\t\tif(strcmp(name, sOldName, false))\r\n\t\t\t{\r\n\t\t\t\tSetPlayerName(playerid, FIXES_gscTempName);\r\n\t\t\t\tif(SetPlayerName(playerid, name) == -1)\r\n\t\t\t\t{\r\n\t\t\t\t\tSetPlayerName(playerid, sOldName);\r\n\t\t\t\t\treturn -1;\r\n\t\t\t\t}\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn SetPlayerName(playerid, name);\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerName\r\n\t#define SetPlayerName FIXES_SetPlayerName\r\n#endif\r\n\r\n/* \r\n * OnPlayerRequestClass(playerid, classid)\r\n * \r\n * FIXES:\r\n *      OnPlayerRequestClass\r\n */\r\n\r\n#if FIX_OnPlayerRequestClass\r\n\tpublic OnPlayerRequestClass(playerid, classid)\r\n\t{\r\n\t\t// =============================\r\n\t\t//  BEGIN: OnPlayerRequestClass \r\n\t\t// =============================\r\n\t\t#if FIX_OnPlayerRequestClass\r\n\t\t\tnew\r\n\t\t\t\tFloat:x,\r\n\t\t\t\tFloat:y,\r\n\t\t\t\tFloat:z;\r\n\t\t\tGetPlayerPos(playerid, x, y, z),\r\n\t\t\tRemoveBuildingForPlayer(playerid, 1484, x, y, z, 10.0),\r\n\t\t\tRemoveBuildingForPlayer(playerid, 1485, x, y, z, 10.0),\r\n\t\t\tRemoveBuildingForPlayer(playerid, 1486, x, y, z, 10.0);\r\n\t\t#endif\r\n\t\t// ===========================\r\n\t\t//  END: OnPlayerRequestClass \r\n\t\t// ===========================\r\n\t\treturn FIXES_OnPlayerRequestClass(playerid, classid);\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerRequestClass\r\n\t\t#error _ALS_OnPlayerRequestClass defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerRequestClass\r\n\t#define OnPlayerRequestClass(%0) FIXES_OnPlayerRequestClass(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerRequestClass(playerid, classid);\r\n#endif\r\n\r\n/* \r\n * OnPlayerSpawn(playerid)\r\n * \r\n * FIXES:\r\n *     GetPlayerSkin\r\n *     TogglePlayerControllable\r\n *     GetPlayerInterior\r\n *     OnPlayerSpawn\r\n *     GameText\r\n */\r\n\r\n#if FIX_GetPlayerSkin || FIX_TogglePlayerControllable || FIX_GetPlayerInterior || FIX_OnPlayerSpawn || FIX_GameText\r\n\tpublic OnPlayerSpawn(playerid)\r\n\t{\r\n\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t{\r\n\t\t\t// ======================\r\n\t\t\t//  BEGIN: OnPlayerSpawn \r\n\t\t\t// ======================\r\n\t\t\t#if FIX_OnPlayerSpawn\r\n\t\t\t\tResetPlayerMoney(playerid);\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\tGivePlayerMoney(playerid, FIXES_gsLastCash[playerid]);\r\n\t\t\t\t\tFIXES_gsLastCash[playerid] = 0;\r\n\t\t\t\t#else\r\n\t\t\t\t\tGivePlayerMoney(playerid, GetPVarInt(playerid, FIXES_pvarPlayerLastCash));\r\n\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0);\r\n\t\t\t\t#endif\r\n\t\t\t#endif\r\n\t\t\t// ======================\r\n\t\t\t//  END:   OnPlayerSpawn \r\n\t\t\t// ======================\r\n\t\t\t\r\n\t\t\t// ==========================\r\n\t\t\t//  BEGIN: GetPlayerInterior \r\n\t\t\t// ==========================\r\n\t\t\t#if FIX_GetPlayerInterior\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\tFIXES_gsInterior[playerid] = 0;\r\n\t\t\t\t#else\r\n\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerInterior, 0);\r\n\t\t\t\t#endif\r\n\t\t\t#endif\r\n\t\t\t// ==========================\r\n\t\t\t//  END:   GetPlayerInterior \r\n\t\t\t// ==========================\r\n\t\t\t\r\n\t\t\t// =================\r\n\t\t\t//  BEGIN: GameText \r\n\t\t\t// =================\r\n\t\t\t#if FIX_GameText\r\n\t\t\t\t// Per-player GTs.\r\n\t\t\t\t\r\n\t\t\t\t#define _FIXES_PER_PLAYER_GT(%0) if (FIXES_gsPlayerPGTShown[%0][playerid] > playerid) PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][%0]), _FIXES_RemoveInternal(FIXES_gsPlayerPGTShown[%0], playerid, MAX_PLAYERS)\r\n\t\t\t\t\r\n\t\t\t\t#if FIX_GameTextStyles\r\n\t\t\t\t\t_FIXES_PER_PLAYER_GT(13);\r\n\t\t\t\t\t_FIXES_PER_PLAYER_GT(12);\r\n\t\t\t\t\t_FIXES_PER_PLAYER_GT(11);\r\n\t\t\t\t\t_FIXES_PER_PLAYER_GT(10);\r\n\t\t\t\t\t_FIXES_PER_PLAYER_GT(9);\r\n\t\t\t\t\t_FIXES_PER_PLAYER_GT(8);\r\n\t\t\t\t\t_FIXES_PER_PLAYER_GT(7);\r\n\t\t\t\t#endif\r\n\t\t\t\t_FIXES_PER_PLAYER_GT(6);\r\n\t\t\t\t_FIXES_PER_PLAYER_GT(5);\r\n\t\t\t\t_FIXES_PER_PLAYER_GT(4);\r\n\t\t\t\t_FIXES_PER_PLAYER_GT(3);\r\n\t\t\t\t_FIXES_PER_PLAYER_GT(2);\r\n\t\t\t\t_FIXES_PER_PLAYER_GT(1);\r\n\t\t\t\t_FIXES_PER_PLAYER_GT(0);\r\n\t\t\t\t\r\n\t\t\t\t#undef _FIXES_PER_PLAYER_GT\r\n\t\t\t\t\r\n\t\t\t\t// Global GTs.\r\n\t\t\t\t#if FIX_GameTextStyles\r\n\t\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[13]),\r\n\t\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[12]),\r\n\t\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[11]),\r\n\t\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[10]),\r\n\t\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[9]),\r\n\t\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[8]),\r\n\t\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[7]);\r\n\t\t\t\t#endif\r\n\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[6]),\r\n\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[5]),\r\n\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[4]),\r\n\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[3]),\r\n\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[2]),\r\n\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[1]),\r\n\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[0]);\r\n\t\t\t\t\r\n\t\t\t#endif\r\n\t\t\t// =================\r\n\t\t\t//  END:   GameText \r\n\t\t\t// =================\r\n\t\t}\r\n\t\t\r\n\t\t// ======================\r\n\t\t//  BEGIN: GetPlayerSkin \r\n\t\t// ======================\r\n\t\t#if FIX_GetPlayerSkin\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsPlayerSkin[playerid] = GetPlayerSkin(playerid);\r\n\t\t\t#else\r\n\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerSkin, GetPlayerSkin(playerid));\r\n\t\t\t#endif\r\n\t\t#endif\r\n\t\t// ======================\r\n\t\t//  END:   GetPlayerSkin \r\n\t\t// ======================\r\n\t\t\r\n\t\t// =================================\r\n\t\t//  BEGIN: TogglePlayerControllable \r\n\t\t// =================================\r\n\t\t#if FIX_TogglePlayerControllable\r\n\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;\r\n\t\t#endif\r\n\t\t// =================================\r\n\t\t//  END:   TogglePlayerControllable \r\n\t\t// =================================\r\n\t\t\r\n\t\treturn FIXES_OnPlayerSpawn(playerid);\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerSpawn\r\n\t\t#error _ALS_OnPlayerSpawn defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerSpawn\r\n\t#define OnPlayerSpawn(%0) FIXES_OnPlayerSpawn(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerSpawn(playerid);\r\n#endif\r\n\r\n/* \r\n * OnVehicleMod(playerid, vehicleid, componentid)\r\n * \r\n * FIXES:\r\n *     OnVehicleMod\r\n */\r\n\r\n#if FIX_OnVehicleMod\r\n\tpublic OnVehicleMod(playerid, vehicleid, componentid)\r\n\t{\r\n\t\t#if !FIXES_Single\r\n\t\t\tif (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))\r\n\t\t\t{\r\n\t\t\t\treturn FIXES_OnVehicleMod(playerid, vehicleid, componentid);\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t\r\n\t\t// =====================\r\n\t\t//  BEGIN: OnVehicleMod \r\n\t\t// =====================\r\n\t\tnew\r\n\t\t\tmodelid = GetVehicleModel(vehicleid);\r\n\t\tif (_FIXES_IN_RANGE(modelid, 400, 611 + 1))\r\n\t\t{\r\n\t\t\tswitch (componentid)\r\n\t\t\t{\r\n\t\t\t\tcase 1000 .. 1191:\r\n\t\t\t\t{\r\n\t\t\t\t\tif (FIXES_gscVehicleMods[(modelid - 400) * 6 + (componentid - 1000 >>> 5)] & 1 << (componentid - 1000 & 0b00011111))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn FIXES_OnVehicleMod(playerid, vehicleid, componentid);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcase 1192, 1193:\r\n\t\t\t\t{\r\n\t\t\t\t\tif (modelid == 576)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// This save a whole cell off EVERY other vehicle!  This\r\n\t\t\t\t\t\t// is the ONLY vehicle with any mods over \"6 * 32 + 999\"\r\n\t\t\t\t\t\t// (1191), the highest value you can fit in 6 cells of a\r\n\t\t\t\t\t\t// bit array (minus 1000).\r\n\t\t\t\t\t\treturn FIXES_OnVehicleMod(playerid, vehicleid, componentid);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Desync the player entirely.\r\n\t\tFIXES_BlockUpdate(playerid, true);\r\n\t\treturn 0;\r\n\t\t// =====================\r\n\t\t//  END:   OnVehicleMod \r\n\t\t// =====================\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnVehicleMod\r\n\t\t#error _ALS_OnVehicleMod defined\r\n\t#endif\r\n\t#define _ALS_OnVehicleMod\r\n\t#define OnVehicleMod(%0) FIXES_OnVehicleMod(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnVehicleMod(playerid, vehicleid, componentid);\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerSkin(playerid, skinid)\r\n * \r\n * FIXES:\r\n *     GetPlayerSkin\r\n *     SetPlayerSkin\r\n */\r\n\r\n#if defined _ALS_SetPlayerSkin\r\n\t#error _ALS_SetPlayerSkin defined\r\n#endif\r\nnative BAD_SetPlayerSkin(playerid, skinid) = SetPlayerSkin;\r\n\r\n#if FIX_GetPlayerSkin || FIX_SetPlayerSkin\r\n\tstock FIXES_SetPlayerSkin(playerid, skinid)\r\n\t{\r\n\t\t// ======================\r\n\t\t//  BEGIN: SetPlayerSkin \r\n\t\t// ======================\r\n\t\t#if FIX_SetPlayerSkin\r\n\t\t\tnew\r\n\t\t\t\tvehicleid = GetPlayerVehicleID(playerid);\r\n\t\t\tif (vehicleid)\r\n\t\t\t{\r\n\t\t\t\tnew\r\n\t\t\t\t\tseat = GetPlayerVehicleSeat(playerid);\r\n\t\t\t\tClearAnimations(playerid);\r\n\t\t\t\tnew\r\n\t\t\t\t\tret = SetPlayerSkin(playerid, skinid);\r\n\t\t\t\tPutPlayerInVehicle(playerid, vehicleid, seat);\r\n\t\t\t\t\r\n\t\t\t\t// ======================\r\n\t\t\t\t//  BEGIN: GetPlayerSkin \r\n\t\t\t\t// ======================\r\n\t\t\t\t#if FIX_GetPlayerSkin\r\n\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\tFIXES_gsPlayerSkin[playerid] = skinid;\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);\r\n\t\t\t\t\t#endif\r\n\t\t\t\t#endif\r\n\t\t\t\t// ======================\r\n\t\t\t\t//  END:   GetPlayerSkin \r\n\t\t\t\t// ======================\r\n\t\t\t\t\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// ======================\r\n\t\t\t//  BEGIN: GetPlayerSkin \r\n\t\t\t// ======================\r\n\t\t\t#if FIX_GetPlayerSkin\r\n\t\t\t\telse\r\n\t\t\t#endif\r\n\t\t\t// ======================\r\n\t\t\t//  END:   GetPlayerSkin \r\n\t\t\t// ======================\r\n\t\t#endif\r\n\t\t// ======================\r\n\t\t//  END:   SetPlayerSkin \r\n\t\t// ======================\r\n\t\t\r\n\t\t// ======================\r\n\t\t//  BEGIN: GetPlayerSkin \r\n\t\t// ======================\r\n\t\t#if FIX_GetPlayerSkin\r\n\t\t\t// Watch fot the \"else\" above if this code ever changes.\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsPlayerSkin[playerid] = skinid;\r\n\t\t\t#else\r\n\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);\r\n\t\t\t#endif\r\n\t\t#endif\r\n\t\t// ======================\r\n\t\t//  END:   GetPlayerSkin \r\n\t\t// ======================\r\n\t\t\r\n\t\treturn SetPlayerSkin(playerid, skinid);\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerSkin\r\n\t#define SetPlayerSkin FIXES_SetPlayerSkin\r\n#endif\r\n\r\n/* \r\n * FIXES_GetPlayerSkin(playerid, skinid)\r\n * \r\n * FIXES:\r\n *     GetPlayerSkin\r\n */\r\n\r\n#if defined _ALS_GetPlayerSkin\r\n\t#error _ALS_GetPlayerSkin defined\r\n#endif\r\nnative BAD_GetPlayerSkin(playerid) = GetPlayerSkin;\r\n\r\n#if FIX_GetPlayerSkin\r\n\tstock FIXES_GetPlayerSkin(playerid)\r\n\t{\r\n\t\t#if FIXES_Single\r\n\t\t\treturn FIXES_gsPlayerSkin[playerid];\r\n\t\t#else\r\n\t\t\treturn GetPVarInt(playerid, FIXES_pvarPlayerSkin);\r\n\t\t#endif\r\n\t}\r\n\t\r\n\t#define _ALS_GetPlayerSkin\r\n\t#define GetPlayerSkin FIXES_GetPlayerSkin\r\n#endif\r\n\r\n/* \r\n * FIXES_GetWeaponName(weaponid, weapon[], len)\r\n * \r\n * FIXES:\r\n *     GetWeaponName\r\n */\r\n\r\n#if defined _ALS_GetWeaponName\r\n\t#error _ALS_GetWeaponName defined\r\n#endif\r\nnative BAD_GetWeaponName(weaponid, weapon[], len) = GetWeaponName;\r\n\r\n#if FIX_GetWeaponName\r\n\tstock FIXES_GetWeaponName(weaponid, weapon[], len)\r\n\t{\r\n\t\tswitch (weaponid)\r\n\t\t{\r\n\t\t\tcase 18:\r\n\t\t\t{\r\n\t\t\t\treturn\r\n\t\t\t\t\tweapon[0] = 0,\r\n\t\t\t\t\tstrcat(weapon, \"Molotov Cocktail\", len),\r\n\t\t\t\t\t1;\r\n\t\t\t}\r\n\t\t\tcase 44:\r\n\t\t\t{\r\n\t\t\t\treturn\r\n\t\t\t\t\tweapon[0] = 0,\r\n\t\t\t\t\tstrcat(weapon, \"Night Vision Goggles\", len),\r\n\t\t\t\t\t1;\r\n\t\t\t}\r\n\t\t\tcase 45:\r\n\t\t\t{\r\n\t\t\t\treturn\r\n\t\t\t\t\tweapon[0] = 0,\r\n\t\t\t\t\tstrcat(weapon, \"Thermal Goggles\", len),\r\n\t\t\t\t\t1;\r\n\t\t\t}\r\n\t\t\tdefault:\r\n\t\t\t{\r\n\t\t\t\treturn GetWeaponName(weaponid, weapon, len);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_GetWeaponName\r\n\t#define GetWeaponName FIXES_GetWeaponName\r\n#endif\r\n\r\n/* \r\n * OnPlayerUpdate(playerid)\r\n * \r\n * FIXES:\r\n *     SetPlayerWorldBounds\r\n *     TogglePlayerControllable\r\n *     AllowInteriorWeapons\r\n *     OnPlayerDeath\r\n *     Kick\r\n *     OnVehicleMod\r\n *     OnPlayerEnterVehicle\r\n *     OnPlayerEnterVehicle_2\r\n */\r\n\r\n#if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_AllowInteriorWeapons || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_OnPlayerDeath || FIX_Kick || FIX_OnVehicleMod\r\n\tpublic OnPlayerUpdate(playerid)\r\n\t{\r\n\t\t// =============================\r\n\t\t//  BEGIN: OnPlayerEnterVehicle \r\n\t\t// =============================\r\n\t\t#if FIX_OnPlayerEnterVehicle || FIX_Kick || FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle_2\r\n\t\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_BLOCK)\r\n\t\t\t{\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// =============================\r\n\t\t//  END:   OnPlayerEnterVehicle \r\n\t\t// =============================\r\n\t\t\r\n\t\t#if !FIXES_Single\r\n\t\t\tif (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))\r\n\t\t\t{\r\n\t\t\t\treturn FIXES_OnPlayerUpdate(playerid);\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t\r\n\t\t#if FIX_OnPlayerEnterVehicle || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable\r\n\t\t\tnew\r\n\t\t\t\te_FIXES_BOOLS:pbools = FIXES_gsPlayerBools[playerid];\r\n\t\t#endif\r\n\t\t\r\n\t\t// =============================\r\n\t\t//  BEGIN: AllowInteriorWeapons \r\n\t\t// =============================\r\n\t\t#if FIX_AllowInteriorWeapons\r\n\t\t\tif (pbools & e_FIXES_BOOLS_INTERIOR)\r\n\t\t\t{\r\n\t\t\t\t// DONE: May need integration with \"FIX_GetPlayerWeapon\".\r\n\t\t\t\tSetPlayerArmedWeapon(playerid, 0);\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// ============================\r\n\t\t//  END: AllowInteriorWeapons \r\n\t\t// ============================\r\n\t\t\r\n\t\t#if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable\r\n\t\t\tnew\r\n\t\t\t\tud,\r\n\t\t\t\tlr,\r\n\t\t\t\tkeys;\r\n\t\t\tGetPlayerKeys(playerid, keys, ud, lr);\r\n\t\t#endif\r\n\t\t\r\n\t\t#if FIX_SetPlayerWorldBounds && !FIX_TogglePlayerControllable\r\n\t\t\t#pragma unused ud, lr\r\n\t\t#endif\r\n\t\t\r\n\t\t// =============================\r\n\t\t//  BEGIN: SetPlayerWorldBounds \r\n\t\t// =============================\r\n\t\t#if FIX_SetPlayerWorldBounds\r\n\t\t\tif (pbools & e_FIXES_BOOLS_WORLDBOUNDS && keys & _FIXES_KEY_AIM)\r\n\t\t\t{\r\n\t\t\t\tnew\r\n\t\t\t\t\tFloat:x,\r\n\t\t\t\t\tFloat:y,\r\n\t\t\t\t\tFloat:z;\r\n\t\t\t\tGetPlayerPos(playerid, x, y, z);\r\n\t\t\t\tif (FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] < x < FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] && FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] < y < FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY])\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = x,\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = y,\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = z;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tSetPlayerPos(playerid, FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX], FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY], FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// =============================\r\n\t\t//  END:   SetPlayerWorldBounds \r\n\t\t// =============================\r\n\t\t\r\n\t\t// ======================\r\n\t\t//  BEGIN: OnPlayerDeath \r\n\t\t// ======================\r\n\t\t#if FIX_OnPlayerDeath\r\n\t\t\tFIXES_gsLastAnimation[playerid] = GetPlayerAnimationIndex(playerid);\r\n\t\t#endif\r\n\t\t// ======================\r\n\t\t//  END:   OnPlayerDeath \r\n\t\t// ======================\r\n\t\t\r\n\t\t// =================================\r\n\t\t//  BEGIN: TogglePlayerControllable \r\n\t\t// =================================\r\n\t\t#if FIX_TogglePlayerControllable\r\n\t\t\t// MUST come last.\r\n\t\t\tif (pbools & e_FIXES_BOOLS_UNCONTROLLABLE)\r\n\t\t\t{\r\n\t\t\t\t// Keys based sync blocking, modified based on a post by Slice:\r\n\t\t\t\t// http://forum.sa-mp.com/showpost.php?p=876854  Use \"playerid\"\r\n\t\t\t\t// here as it's a variable that already exists, but note that\r\n\t\t\t\t// after this point, you CANNOT use \"playerid\" as it has been\r\n\t\t\t\t// \"clobbered\" (and yes, that's the technical term).  This is\r\n\t\t\t\t// just to avoid \"statement has no effect\" warnings.  ALWAYS\r\n\t\t\t\t// return 0 in this case, regardless of what other callbacks\r\n\t\t\t\t// return.\r\n\t\t\t\tplayerid = FIXES_OnPlayerUpdate(playerid);\r\n\t\t\t\tif (keys || ud || lr)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\treturn playerid;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// =================================\r\n\t\t//  END:   TogglePlayerControllable \r\n\t\t// =================================\r\n\t\t\r\n\t\treturn FIXES_OnPlayerUpdate(playerid);\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerUpdate\r\n\t\t#error _ALS_OnPlayerUpdate defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerUpdate\r\n\t#define OnPlayerUpdate(%0) FIXES_OnPlayerUpdate(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerUpdate(playerid);\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)\r\n * \r\n * TODO: Modify this to remove aim animations when they get to the boundaries.\r\n * \r\n * FIXES:\r\n *     SetPlayerWorldBounds\r\n */\r\n\r\n#if defined _ALS_SetPlayerWorldBounds\r\n\t#error _ALS_SetPlayerWorldBounds defined\r\n#endif\r\nnative BAD_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) = SetPlayerWorldBounds;\r\n\r\n#if FIX_SetPlayerWorldBounds\r\n\t#if FIXES_Single\r\n\t\tstock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)\r\n\t\t{\r\n\t\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t\t{\r\n\t\t\t\tFIXES_PRINTF(\"Call SetPlayerWorldBounds\");\r\n\t\t\t\tif (x_max == x_min || y_max == y_min)\r\n\t\t\t\t{\r\n\t\t\t\t\t// Impossibly small area, disable checks entirely.\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS,\r\n\t\t\t\t\t\tSetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY);\r\n\t\t\t\t}\r\n\t\t\t\t// This code could do with a way to mostly remove the checks.  Maybe\r\n\t\t\t\t// when setting everything to FIXES_INFINITY (with default\r\n\t\t\t\t// parameters).\r\n\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;\r\n\t\t\t\tnew\r\n\t\t\t\t\tFloat:tmp;\r\n\t\t\t\tif (x_max < x_min)\r\n\t\t\t\t{\r\n\t\t\t\t\ttmp = x_min,\r\n\t\t\t\t\tx_min = x_max,\r\n\t\t\t\t\tx_max = tmp;\r\n\t\t\t\t}\r\n\t\t\t\tif (y_max < y_min)\r\n\t\t\t\t{\r\n\t\t\t\t\ttmp = y_min,\r\n\t\t\t\t\ty_min = y_max,\r\n\t\t\t\t\ty_max = tmp;\r\n\t\t\t\t}\r\n\t\t\t\t// Give a little leway so this fix isn't noticed if you're not\r\n\t\t\t\t// trying to break through the world bounds.  Leway removed in\r\n\t\t\t\t// favour of keys.\r\n\t\t\t\treturn\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min,\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max,\r\n\t\t\t\t\t\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min,\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max,\r\n\t\t\t\t\t\r\n\t\t\t\t\tGetPlayerPos(playerid, tmp, tmp, tmp),\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min,\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min,\r\n\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp,\r\n\t\t\t\t\t\r\n\t\t\t\t\tSetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min);\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t#else\r\n\t\tforward _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min);\r\n\t\t\r\n\t\tstock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)\r\n\t\t{\r\n\t\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t\t{\r\n\t\t\t\tFIXES_PRINTF(\"Call SetPlayerWorldBounds\");\r\n\t\t\t\treturn\r\n\t\t\t\t\tCallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@iffff, playerid, x_max, x_min, y_max, y_min),\r\n\t\t\t\t\tgetproperty(5, FIXES_gscReturnProperty);\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\tpublic _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)\r\n\t\t{\r\n\t\t\tFIXES_PRINTF(\"_FIXES_SetPlayerWorldBounds: %d %.2f %.2f %.2f %.2f\", playerid, x_max, x_min, y_max, y_min);\r\n\t\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t\t{\r\n\t\t\t\tFIXES_PRINTF(\"SetPlayerWorldBounds\");\r\n\t\t\t\t//if (x_max == _FIXES_INFINITY && x_min == _FIXES_INFINITY && y_max == _FIXES_INFINITY && y_min == _FIXES_INFINITY)\r\n\t\t\t\tif (x_max == x_min || y_max == y_min)\r\n\t\t\t\t{\r\n\t\t\t\t\t// Impossibly small area, disable checks entirely.\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS,\r\n\t\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] =\r\n\t\t\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] =\r\n\t\t\t\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] =\r\n\t\t\t\t\t\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] =\r\n\t\t\t\t\t\t\t\t\t\t0.0,\r\n\t\t\t\t\t\tsetproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY)),\r\n\t\t\t\t\t\t-1;\r\n\t\t\t\t}\r\n\t\t\t\t// This code could do with a way to mostly remove the checks.  Maybe\r\n\t\t\t\t// when setting everything to FIXES_INFINITY (with default\r\n\t\t\t\t// parameters).\r\n\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;\r\n\t\t\t\tnew\r\n\t\t\t\t\tFloat:tmp;\r\n\t\t\t\tif (x_max < x_min)\r\n\t\t\t\t{\r\n\t\t\t\t\ttmp = x_min,\r\n\t\t\t\t\tx_min = x_max,\r\n\t\t\t\t\tx_max = tmp;\r\n\t\t\t\t}\r\n\t\t\t\tif (y_max < y_min)\r\n\t\t\t\t{\r\n\t\t\t\t\ttmp = y_min,\r\n\t\t\t\t\ty_min = y_max,\r\n\t\t\t\t\ty_max = tmp;\r\n\t\t\t\t}\r\n\t\t\t\t// Give a little leway so this fix isn't noticed if you're not\r\n\t\t\t\t// trying to break through the world bounds.  Leway removed in\r\n\t\t\t\t// favour of keys.\r\n\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min,\r\n\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max,\r\n\t\t\t\t\r\n\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min,\r\n\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max,\r\n\t\t\t\t\r\n\t\t\t\tGetPlayerPos(playerid, tmp, tmp, tmp),\r\n\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min,\r\n\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min,\r\n\t\t\t\tFIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp,\r\n\t\t\t\t\r\n\t\t\t\tsetproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min));\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t#endif\r\n\t\r\n\t#define _ALS_SetPlayerWorldBounds\r\n\t#define SetPlayerWorldBounds FIXES_SetPlayerWorldBounds\r\n#endif\r\n\r\n/* \r\n * FIXES_TogglePlayerControllable(playerid, toggle)\r\n * \r\n * FIXES:\r\n *     TogglePlayerControllable\r\n */\r\n\r\n#if defined _ALS_TogglePlayerControllable\r\n\t#error _ALS_TogglePlayerControllable defined\r\n#endif\r\nnative BAD_TogglePlayerControllable(playerid, toggle) = TogglePlayerControllable;\r\n\r\n#if FIX_TogglePlayerControllable\r\n\t#if FIXES_Single\r\n\t\tstock FIXES_TogglePlayerControllable(playerid, toggle)\r\n\t\t{\r\n\t\t\tif (TogglePlayerControllable(playerid, toggle))\r\n\t\t\t{\r\n\t\t\t\tif (toggle)\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;\r\n\t\t\t\t}\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t#else\r\n\t\tforward _FIXES_TogglePlayerControllable(playerid, toggle);\r\n\t\t\r\n\t\tstock FIXES_TogglePlayerControllable(playerid, toggle)\r\n\t\t{\r\n\t\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t\t{\r\n\t\t\t\treturn\r\n\t\t\t\t\tCallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, playerid, toggle),\r\n\t\t\t\t\tgetproperty(5, FIXES_gscReturnProperty);\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\tpublic _FIXES_TogglePlayerControllable(playerid, toggle)\r\n\t\t{\r\n\t\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t\t{\r\n\t\t\t\tif (toggle)\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;\r\n\t\t\t\t}\r\n\t\t\t\tsetproperty(5, FIXES_gscReturnProperty, TogglePlayerControllable(playerid, toggle));\r\n\t\t\t}\r\n\t\t}\r\n\t#endif\r\n\t\r\n\t#define _ALS_TogglePlayerControllable\r\n\t#define TogglePlayerControllable FIXES_TogglePlayerControllable\r\n#endif\r\n\r\n/* \r\n * OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)\r\n * \r\n * FIXES:\r\n *     AllowInteriorWeapons\r\n *     GetPlayerInterior\r\n */\r\n\r\n#if FIX_AllowInteriorWeapons || FIX_GetPlayerInterior\r\n\tpublic OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)\r\n\t{\r\n\t\t// ==========================\r\n\t\t//  BEGIN: GetPlayerInterior \r\n\t\t// ==========================\r\n\t\t#if FIX_GetPlayerInterior\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsInterior[playerid] = newinteriorid;\r\n\t\t\t#else\r\n\t\t\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t\t\t{\r\n\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerInterior, newinteriorid);\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t#endif\r\n\t\t// ==========================\r\n\t\t//  END:   GetPlayerInterior \r\n\t\t// ==========================\r\n\t\t\r\n\t\t// =============================\r\n\t\t//  BEGIN: AllowInteriorWeapons \r\n\t\t// =============================\r\n\t\t#if FIX_AllowInteriorWeapons\r\n\t\t\tif (newinteriorid)\r\n\t\t\t{\r\n\t\t\t\tif (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR)\r\n\t\t\t\t{\r\n\t\t\t\t\t// This only needs doing here if \"GetPlayerWeapon\" is set.\r\n\t\t\t\t\t// If it isn't, even though \"AllowInteriorWeapons\" can use\r\n\t\t\t\t\t// this code on its own, it doesn't as \"OnPlayerUpdate\"\r\n\t\t\t\t\t// takes care of it all.\r\n\t\t\t\t\t// TODO: Rewrite this code to use a single bit to indicate\r\n\t\t\t\t\t// if a player can have a weapon or not, and just use the in\r\n\t\t\t\t\t// the \"OnPlayerUpdate\" callback, instead of several checks.\r\n\t\t\t\t\t// DONE!\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_INTERIOR;\r\n\t\t\t\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSetPlayerArmedWeapon(playerid, 0);\r\n\t\t\t\t\t\t#if FIX_GetPlayerWeapon\r\n\t\t\t\t\t\t\tif (IsPlayerInAnyVehicle(playerid))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\t\t\t\tFIXES_gsPlayerWeapon[playerid] = 0;\r\n\t\t\t\t\t\t\t\t#else\r\n\t\t\t\t\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);\r\n\t\t\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_INTERIOR;\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// ===========================\r\n\t\t//  END: AllowInteriorWeapons \r\n\t\t// ===========================\r\n\t\treturn FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerInteriorChange\r\n\t\t#error _ALS_OnPlayerInteriorChange defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerInteriorChange\r\n\t#define OnPlayerInteriorChange(%0) FIXES_OnPlayerInteriorChange(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);\r\n#endif\r\n\r\n/* \r\n * _FIXES_DriveBy(playerid)\r\n * \r\n * FIXES:\r\n *     DriveBy\r\n */\r\n\r\n#if FIX_DriveBy\r\n\tforward _FIXES_DriveBy(playerid);\r\n\t\r\n\tpublic  _FIXES_DriveBy(playerid)\r\n\t{\r\n\t\tif (GetPlayerState(playerid) == PLAYER_STATE_PASSENGER)\r\n\t\t{\r\n\t\t\tSetPlayerArmedWeapon(playerid, FIXES_gsDriveByWeapon[playerid]);\r\n\t\t}\r\n\t\treturn FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_DRIVE_BY;\r\n\t}\r\n#endif\r\n\r\n/* \r\n * OnPlayerKeyStateChange(playerid, newkeys, oldkeys)\r\n * \r\n * FIXES:\r\n *     DriveBy\r\n */\r\n\r\n#if FIX_DriveBy\r\n\tpublic OnPlayerKeyStateChange(playerid, newkeys, oldkeys)\r\n\t{\r\n\t\t// ===============================\r\n\t\t//  BEGIN: DriveBy \r\n\t\t// ===============================\r\n\t\t#if FIX_DriveBy\r\n\t\t\t#if !FIXES_Single\r\n\t\t\t\tif (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)\r\n\t\t\t#endif\r\n\t\t\t\t{\r\n\t\t\t\t\tif ((newkeys & KEY_CROUCH) && !(oldkeys & KEY_CROUCH) && GetPlayerState(playerid) == PLAYER_STATE_PASSENGER && GetPlayerCameraMode(playerid) == 55 && !(FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_DRIVE_BY))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFIXES_gsDriveByWeapon[playerid] = GetPlayerWeapon(playerid),\r\n\t\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_DRIVE_BY,\r\n\t\t\t\t\t\tSetPlayerArmedWeapon(playerid, 0),\r\n\t\t\t\t\t\tApplyAnimation(playerid, \"PED\", \"CAR_GETIN_RHS\", 4.1, 0, 0, 0, 0, 1, 1),\r\n\t\t\t\t\t\tSetTimerEx(FIXES_gscDriveBy, 500, 0, FIXES_gscSpec@i, playerid);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t#endif\r\n\t\t// =============================\r\n\t\t//  END: DriveBy \r\n\t\t// =============================\r\n\t\t\r\n\t\treturn FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerKeyStateChange\r\n\t\t#error _ALS_OnPlayerKeyStateChange defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerKeyStateChange\r\n\t#define OnPlayerKeyStateChange(%0) FIXES_OnPlayerKeyStateChange(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);\r\n#endif\r\n\r\n/* \r\n * OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)\r\n * \r\n * FIXES:\r\n *     OnPlayerEnterVehicle_2\r\n */\r\n\r\n#if FIX_OnPlayerEnterVehicle_2\r\n\tpublic OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)\r\n\t{\r\n\t\t// ===============================\r\n\t\t//  BEGIN: OnPlayerEnterVehicle_2 \r\n\t\t// ===============================\r\n\t\t#if FIX_OnPlayerEnterVehicle_2\r\n\t\t\tif (0 < vehicleid < MAX_VEHICLES)\r\n\t\t\t{\r\n\t\t\t\treturn FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);\r\n\t\t\t}\r\n\t\t\tFIXES_BlockUpdate(playerid, true);\r\n\t\t\treturn 0;\r\n\t\t#endif\r\n\t\t// =============================\r\n\t\t//  END: OnPlayerEnterVehicle_2 \r\n\t\t// =============================\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerEnterVehicle\r\n\t\t#error _ALS_OnPlayerEnterVehicle defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerEnterVehicle\r\n\t#define OnPlayerEnterVehicle(%0) FIXES_OnPlayerEnterVehicle(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);\r\n#endif\r\n\r\n/* \r\n * OnPlayerExitVehicle(playerid, vehicleid)\r\n * \r\n * FIXES:\r\n *     OnPlayerEnterVehicle_2\r\n */\r\n\r\n#if FIX_OnPlayerEnterVehicle_2\r\n\tpublic OnPlayerExitVehicle(playerid, vehicleid)\r\n\t{\r\n\t\t// ===============================\r\n\t\t//  BEGIN: OnPlayerEnterVehicle_2 \r\n\t\t// ===============================\r\n\t\t#if FIX_OnPlayerEnterVehicle_2\r\n\t\t\tif (0 < vehicleid < MAX_VEHICLES)\r\n\t\t\t{\r\n\t\t\t\treturn FIXES_OnPlayerExitVehicle(playerid, vehicleid);\r\n\t\t\t}\r\n\t\t\tFIXES_BlockUpdate(playerid, true);\r\n\t\t\treturn 0;\r\n\t\t#endif\r\n\t\t// =============================\r\n\t\t//  END: OnPlayerEnterVehicle_2 \r\n\t\t// =============================\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerExitVehicle\r\n\t\t#error _ALS_OnPlayerExitVehicle defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerExitVehicle\r\n\t#define OnPlayerExitVehicle(%0) FIXES_OnPlayerExitVehicle(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerExitVehicle(playerid, vehicleid);\r\n#endif\r\n\r\n/* \r\n * FIXES_BlockUpdate(playerid, bool:block)\r\n * \r\n * Block a player from using OnPlayerUpdate at all.\r\n */\r\n\r\n#if FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_Kick || FIX_OnVehicleMod\r\n\tstatic stock FIXES_BlockUpdate(playerid, bool:block, kick = 6)\r\n\t{\r\n\t\tif (kick)\r\n\t\t{\r\n\t\t\t#if FIXES_SilentKick\r\n\t\t\t\tnew\r\n\t\t\t\t\tip[22];\r\n\t\t\t\tGetPlayerIp(playerid, ip, sizeof (ip)),\r\n\t\t\t\tformat(ip, sizeof (ip), \"banip %s\", ip),\r\n\t\t\t\tSendRconCommand(ip),\r\n\t\t\t\tFIXES_gsPlayerIP[playerid] = strval(ip[kick]) << 24,\r\n\t\t\t\tkick = strfind(ip, FIXES_gscDot, false, kick) + 1,\r\n\t\t\t\tFIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 16,\r\n\t\t\t\tkick = strfind(ip, FIXES_gscDot, false, kick) + 1,\r\n\t\t\t\tFIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 8,\r\n\t\t\t\tkick = strfind(ip, FIXES_gscDot, false, kick) + 1,\r\n\t\t\t\tFIXES_gsPlayerIP[playerid] |= strval(ip[kick]);\r\n\t\t\t#else\r\n\t\t\t\tKick(playerid);\r\n\t\t\t#endif\r\n\t\t}\r\n\t\tif (block)\r\n\t\t{\r\n\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_BLOCK;\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_BLOCK;\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n/* \r\n * OnPlayerSelectedMenuRow(playerid, row)\r\n * \r\n * FIXES:\r\n *     GetPlayerMenu\r\n */\r\n\r\n#if FIX_GetPlayerMenu\r\n\tpublic OnPlayerSelectedMenuRow(playerid, row)\r\n\t{\r\n\t\t// ======================\r\n\t\t//  BEGIN: GetPlayerMenu \r\n\t\t// ======================\r\n\t\t#if FIXES_Single\r\n\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;\r\n\t\t\tnew\r\n\t\t\t\tret = FIXES_OnPlayerSelectedMenuRow(playerid, row);\r\n\t\t\tif (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;\r\n\t\t\t}\r\n\t\t\treturn ret;\r\n\t\t#else\r\n\t\t\tnew\r\n\t\t\t\tMenu:cur = FIXES_gsCurrentMenu[playerid];\r\n\t\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t\t{\r\n\t\t\t\tsetproperty(5, FIXES_gscMenuProperty, _:cur);\r\n\t\t\t\tCallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid);\r\n\t\t\t\tFIXES_gsCurrentMenu[playerid] = cur;\r\n\t\t\t\tnew\r\n\t\t\t\t\tret = FIXES_OnPlayerSelectedMenuRow(playerid, row);\r\n\t\t\t\tif (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty);\r\n\t\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;\r\n\t\t\t\tnew\r\n\t\t\t\t\tret = FIXES_OnPlayerSelectedMenuRow(playerid, row);\r\n\t\t\t\tif (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsCurrentMenu[playerid] = cur;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// ======================\r\n\t\t//  END:   GetPlayerMenu \r\n\t\t// ======================\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerSelectedMenuRow\r\n\t\t#error _ALS_OnPlayerSelectedMenuRow defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerSelectedMenuRow\r\n\t#define OnPlayerSelectedMenuRow(%0) FIXES_OnPlayerSelectedMenuRow(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerSelectedMenuRow(playerid, row);\r\n#endif\r\n\r\n/* \r\n * OnPlayerExitedMenu(playerid)\r\n * \r\n * FIXES:\r\n *     GetPlayerMenu\r\n */\r\n\r\n#if FIX_GetPlayerMenu\r\n\tpublic OnPlayerExitedMenu(playerid)\r\n\t{\r\n\t\t// ======================\r\n\t\t//  BEGIN: GetPlayerMenu \r\n\t\t// ======================\r\n\t\t#if FIXES_Single\r\n\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;\r\n\t\t\tnew\r\n\t\t\t\tret = FIXES_OnPlayerExitedMenu(playerid);\r\n\t\t\tif (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;\r\n\t\t\t}\r\n\t\t\treturn ret;\r\n\t\t#else\r\n\t\t\tnew\r\n\t\t\t\tMenu:cur = FIXES_gsCurrentMenu[playerid];\r\n\t\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t\t{\r\n\t\t\t\tsetproperty(5, FIXES_gscMenuProperty, _:cur);\r\n\t\t\t\tCallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid);\r\n\t\t\t\tFIXES_gsCurrentMenu[playerid] = cur;\r\n\t\t\t\tnew\r\n\t\t\t\t\tret = FIXES_OnPlayerExitedMenu(playerid);\r\n\t\t\t\tif (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty);\r\n\t\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;\r\n\t\t\t\tnew\r\n\t\t\t\t\tret = FIXES_OnPlayerExitedMenu(playerid);\r\n\t\t\t\tif (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsCurrentMenu[playerid] = cur;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// ======================\r\n\t\t//  END:   GetPlayerMenu \r\n\t\t// ======================\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerExitedMenu\r\n\t\t#error _ALS_OnPlayerExitedMenu defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerExitedMenu\r\n\t#define OnPlayerExitedMenu(%0) FIXES_OnPlayerExitedMenu(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerExitedMenu(playerid);\r\n#endif\r\n\r\n/* \r\n * FIXES_IS_VALID_MENU(Menu:menuid)\r\n * \r\n * FIXES:\r\n *     Menus\r\n */\r\n\r\n#if _FIX_Menus\r\n\t#define FIXES_IS_VALID_MENU(%0) (_FIXES_IN_RANGE(_:(%0), 0, MAX_MENUS) && (FIXES_gsValidMenus[_:(%0) >>> 5] & (1 << (_:(%0) & 0x1F))))\r\n#endif\r\n\r\n/* \r\n * Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0)\r\n * \r\n * FIXES:\r\n *     Menus\r\n */\r\n\r\n#if defined _ALS_CreateMenu\r\n\t#error _ALS_CreateMenu defined\r\n#endif\r\nnative Menu:BAD_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0) = CreateMenu;\r\n\r\n#if _FIX_Menus\r\n\t#if !FIXES_Single\r\n\t\tforward _FIXES_CreateMenu(ret);\r\n\t\t\r\n\t\tpublic _FIXES_CreateMenu(ret)\r\n\t\t{\r\n\t\t\tFIXES_gsValidMenus[ret >>> 5] |= 1 << (ret & 0x1F);\r\n\t\t}\r\n\t#endif\r\n\t\r\n\tstock Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0)\r\n\t{\r\n\t\tnew\r\n\t\t\tMenu:ret = CreateMenu(title, columns, x, y, col1width, col2width);\r\n\t\tif (_FIXES_IN_RANGE(_:ret, 0, MAX_MENUS))\r\n\t\t{\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsValidMenus[_:ret >>> 5] |= 1 << (_:ret & 0x1F);\r\n\t\t\t#else\r\n\t\t\t\tCallRemoteFunction(\"_FIXES_CreateMenu\", FIXES_gscSpec@i, _:ret);\r\n\t\t\t#endif\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\t#define _ALS_CreateMenu\r\n\t#define CreateMenu FIXES_CreateMenu\r\n#endif\r\n\r\n/* \r\n * _FIXES_SetPlayerMenu(playerid, Menu:menuid)\r\n * \r\n * FIXES:\r\n *     GetPlayerMenu\r\n */\r\n\r\n#if FIX_GetPlayerMenu && !FIXES_Single\r\n\tforward _FIXES_SetPlayerMenu(playerid, Menu:menuid);\r\n\t\r\n\tpublic _FIXES_SetPlayerMenu(playerid, Menu:menuid)\r\n\t{\r\n\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET;\r\n\t\tFIXES_gsCurrentMenu[playerid] = menuid;\r\n\t}\r\n#endif\r\n\r\n/* \r\n * _FIXES_ClearPlayerMenu(playerid)\r\n * \r\n * FIXES:\r\n *     GetPlayerMenu\r\n */\r\n\r\n#if FIX_GetPlayerMenu && !FIXES_Single\r\n\tforward _FIXES_ClearPlayerMenu(playerid);\r\n\t\r\n\tpublic _FIXES_ClearPlayerMenu(playerid)\r\n\t{\r\n\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;\r\n\t\tFIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;\r\n\t}\r\n#endif\r\n\r\n/* \r\n * Menu:FIXES_DestroyMenu(Menu:menuid)\r\n * \r\n * FIXES:\r\n *     GetPlayerMenu\r\n */\r\n\r\n#if defined _ALS_DestroyMenu\r\n\t#error _ALS_DestroyMenu defined\r\n#endif\r\nnative BAD_DestroyMenu(Menu:menuid) = DestroyMenu;\r\n\r\n#if _FIX_Menus || FIX_GetPlayerMenu\r\n\t#if _FIX_Menus && !FIXES_Single\r\n\t\tforward _FIXES_DestroyMenu(ret);\r\n\t\t\r\n\t\tpublic _FIXES_DestroyMenu(ret)\r\n\t\t{\r\n\t\t\tFIXES_gsValidMenus[ret >>> 5] &= ~(1 << (ret & 0x1F));\r\n\t\t}\r\n\t#endif\r\n\t\r\n\tstock FIXES_DestroyMenu(Menu:menuid)\r\n\t{\r\n\t\t#if _FIX_Menus\r\n\t\t\tif (FIXES_IS_VALID_MENU(menuid))\r\n\t\t#endif\r\n\t\t\t{\r\n\t\t\t\tif (DestroyMenu(Menu:menuid))\r\n\t\t\t\t{\r\n\t\t\t\t\t#if _FIX_Menus\r\n\t\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\t\tFIXES_gsValidMenus[_:menuid >>> 5] &= ~(1 << (_:menuid & 0x1F));\r\n\t\t\t\t\t\t#else\r\n\t\t\t\t\t\t\tCallRemoteFunction(\"_FIXES_DestroyMenu\", FIXES_gscSpec@i, _:menuid);\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t#endif\r\n\t\t\t\t\t_FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (FIXES_gsCurrentMenu[playerid] == menuid)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (HideMenuForPlayer(menuid, playerid))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\t\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;\r\n\t\t\t\t\t\t\t\t\tFIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;\r\n\t\t\t\t\t\t\t\t#else\r\n\t\t\t\t\t\t\t\t\tCallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU);\r\n\t\t\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_DestroyMenu\r\n\t#define DestroyMenu FIXES_DestroyMenu\r\n#endif\r\n\r\n/* \r\n * FIXES_AddMenuItem(Menu:menuid, column, const menutext[])\r\n * \r\n * FIXES:\r\n *     AddMenuItem\r\n */\r\n\r\n#if defined _ALS_AddMenuItem\r\n\t#error _ALS_AddMenuItem defined\r\n#endif\r\nnative BAD_AddMenuItem(Menu:menuid, column, const menutext[]) = AddMenuItem;\r\n\r\n#if FIX_AddMenuItem\r\n\tstock FIXES_AddMenuItem(Menu:menuid, column, const menutext[])\r\n\t{\r\n\t\tif (FIXES_IS_VALID_MENU(menuid))\r\n\t\t{\r\n\t\t\treturn AddMenuItem(menuid, column, menutext);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_AddMenuItem\r\n\t#define AddMenuItem FIXES_AddMenuItem\r\n#endif\r\n\r\n/* \r\n * FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[])\r\n * \r\n * FIXES:\r\n *     SetMenuColumnHeader\r\n */\r\n\r\n#if defined _ALS_SetMenuColumnHeader\r\n\t#error _ALS_SetMenuColumnHeader defined\r\n#endif\r\nnative BAD_SetMenuColumnHeader(Menu:menuid, column, const columnheader[]) = SetMenuColumnHeader;\r\n\r\n#if FIX_SetMenuColumnHeader\r\n\tstock FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[])\r\n\t{\r\n\t\tif (FIXES_IS_VALID_MENU(menuid))\r\n\t\t{\r\n\t\t\treturn SetMenuColumnHeader(menuid, column, columnheader);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_SetMenuColumnHeader\r\n\t#define SetMenuColumnHeader FIXES_SetMenuColumnHeader\r\n#endif\r\n\r\n/* \r\n * FIXES_ShowMenuForPlayer(Menu:menuid, playerid)\r\n * \r\n * FIXES:\r\n *     ShowMenuForPlayer\r\n *     GetPlayerMenu\r\n */\r\n\r\n#if defined _ALS_ShowMenuForPlayer\r\n\t#error _ALS_ShowMenuForPlayer defined\r\n#endif\r\nnative BAD_ShowMenuForPlayer(Menu:menuid, playerid) = ShowMenuForPlayer;\r\n\r\n#if FIX_ShowMenuForPlayer || FIX_GetPlayerMenu\r\n\tstock FIXES_ShowMenuForPlayer(Menu:menuid, playerid)\r\n\t{\r\n\t\t#if FIX_ShowMenuForPlayer\r\n\t\t\tif (FIXES_IS_VALID_MENU(menuid))\r\n\t\t#endif\r\n\t\t\t{\r\n\t\t\t\t#if FIX_GetPlayerMenu\r\n\t\t\t\t\tif (ShowMenuForPlayer(menuid, playerid))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET;\r\n\t\t\t\t\t\t\tFIXES_gsCurrentMenu[playerid] = menuid;\r\n\t\t\t\t\t\t#else\r\n\t\t\t\t\t\t\tCallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, _:menuid);\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t#else\r\n\t\t\t\t\treturn ShowMenuForPlayer(menuid, playerid);\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_ShowMenuForPlayer\r\n\t#define ShowMenuForPlayer FIXES_ShowMenuForPlayer\r\n#endif\r\n\r\n/* \r\n * FIXES_HideMenuForPlayer(Menu:menuid, playerid)\r\n * \r\n * FIXES:\r\n *     HideMenuForPlayer\r\n *     HideMenuForPlayer_2\r\n *     GetPlayerMenu\r\n */\r\n\r\n#if defined _ALS_HideMenuForPlayer\r\n\t#error _ALS_HideMenuForPlayer defined\r\n#endif\r\nnative BAD_HideMenuForPlayer(Menu:menuid, playerid) = HideMenuForPlayer;\r\n\r\n#if FIX_HideMenuForPlayer || FIX_GetPlayerMenu\r\n\tstock FIXES_HideMenuForPlayer(Menu:menuid, playerid)\r\n\t{\r\n\t\t#if FIX_HideMenuForPlayer\r\n\t\t\tif (FIXES_IS_VALID_MENU(menuid))\r\n\t\t#endif\r\n\t\t\t{\r\n\t\t\t\t#if FIX_GetPlayerMenu\r\n\t\t\t\t\t#if FIX_HideMenuForPlayer_2\r\n\t\t\t\t\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS) && FIXES_gsCurrentMenu[playerid] == menuid)\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tif (FIXES_gsCurrentMenu[playerid] == menuid && HideMenuForPlayer(menuid, playerid))\r\n\t\t\t\t\t#endif\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;\r\n\t\t\t\t\t\t\t\tFIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;\r\n\t\t\t\t\t\t\t#else\r\n\t\t\t\t\t\t\t\tCallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU);\r\n\t\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t\t#if FIX_HideMenuForPlayer_2\r\n\t\t\t\t\t\t\t\treturn HideMenuForPlayer(menuid, playerid);\r\n\t\t\t\t\t\t\t#else\r\n\t\t\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t}\r\n\t\t\t\t#else\r\n\t\t\t\t\treturn HideMenuForPlayer(menuid, playerid);\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_HideMenuForPlayer\r\n\t#define HideMenuForPlayer FIXES_HideMenuForPlayer\r\n#endif\r\n\r\n/* \r\n * FIXES_DisableMenu(Menu:menuid)\r\n * \r\n * FIXES:\r\n *     DisableMenu\r\n */\r\n\r\n#if defined _ALS_DisableMenu\r\n\t#error _ALS_DisableMenu defined\r\n#endif\r\nnative BAD_DisableMenu(Menu:menuid) = DisableMenu;\r\n\r\n#if FIX_DisableMenu\r\n\tstock FIXES_DisableMenu(Menu:menuid)\r\n\t{\r\n\t\tif (FIXES_IS_VALID_MENU(menuid))\r\n\t\t{\r\n\t\t\treturn DisableMenu(menuid);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_DisableMenu\r\n\t#define DisableMenu FIXES_DisableMenu\r\n#endif\r\n\r\n/* \r\n * FIXES_DisableMenuRow(Menu:menuid, row)\r\n * \r\n * FIXES:\r\n *     DisableMenuRow\r\n */\r\n\r\n#if defined _ALS_DisableMenuRow\r\n\t#error _ALS_DisableMenuRow defined\r\n#endif\r\nnative BAD_DisableMenuRow(Menu:menuid, row) = DisableMenuRow;\r\n\r\n#if FIX_DisableMenuRow\r\n\tstock FIXES_DisableMenuRow(Menu:menuid, row)\r\n\t{\r\n\t\tif (FIXES_IS_VALID_MENU(menuid))\r\n\t\t{\r\n\t\t\treturn DisableMenuRow(menuid, row);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_DisableMenuRow\r\n\t#define DisableMenuRow FIXES_DisableMenuRow\r\n#endif\r\n\r\n/* \r\n * Menu:FIXES_GetPlayerMenu(playerid)\r\n * \r\n * FIXES:\r\n *     GetPlayerMenu\r\n */\r\n\r\n#if defined _ALS_GetPlayerMenu\r\n\t#error _ALS_GetPlayerMenu defined\r\n#endif\r\nnative BAD_GetPlayerMenu(playerid) = GetPlayerMenu;\r\n\r\n#if FIX_GetPlayerMenu\r\n\tstock Menu:FIXES_GetPlayerMenu(playerid)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t{\r\n\t\t\treturn FIXES_gsCurrentMenu[playerid];\r\n\t\t}\r\n\t\treturn Menu:INVALID_MENU;\r\n\t}\r\n\t\r\n\t#define _ALS_GetPlayerMenu\r\n\t#define GetPlayerMenu FIXES_GetPlayerMenu\r\n#endif\r\n\r\n/* \r\n * OnPlayerStateChange(playerid, newstate, oldstate)\r\n * \r\n * FIXES:\r\n *     HydraSniper\r\n *     GetPlayerWeapon\r\n *     PutPlayerInVehicle\r\n *     TrainExit\r\n */\r\n\r\n#if FIX_HydraSniper || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_TrainExit\r\n\tpublic OnPlayerStateChange(playerid, newstate, oldstate)\r\n\t{\r\n\t\t#if !FIXES_Single\r\n\t\t\tif (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))\r\n\t\t\t{\r\n\t\t\t\treturn FIXES_OnPlayerStateChange(playerid, newstate, oldstate);\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t\r\n\t\t// =============================\r\n\t\t//  BEGIN: OnPlayerEnterVehicle \r\n\t\t// =============================\r\n\t\t#if FIX_OnPlayerEnterVehicle\r\n\t\t\t\tif (newstate == PLAYER_STATE_PASSENGER)\r\n\t\t\t\t{\r\n\t\t\t\t\tnew\r\n\t\t\t\t\t\tmodel = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400;\r\n\t\t\t\t\tif (_FIXES_IN_RANGE(model, 0, 211 + 1))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tnew\r\n\t\t\t\t\t\t\tseat = GetPlayerVehicleSeat(playerid);\r\n\t\t\t\t\t\tif (seat != 128)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tmodel = (FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2)) & 0xF;\r\n\t\t\t\t\t\t\tif (model == 0 || model == 15)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t// Shouldn't be in this vehicle at all.\r\n\t\t\t\t\t\t\t\tFIXES_BlockUpdate(playerid, true);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (!(0 < seat <= model)) // Slower with \"_FIXES_NO_RANGE\".\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t// In an out of range seat.\r\n\t\t\t\t\t\t\t\tFIXES_BlockUpdate(playerid, true);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFIXES_BlockUpdate(playerid, true);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (newstate == PLAYER_STATE_DRIVER)\r\n\t\t\t\t{\r\n\t\t\t\t\t\tnew\r\n\t\t\t\t\t\t\tmodel = GetPlayerVehicleSeat(playerid);\r\n\t\t\t\t\t\tif (model != 128)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (model == 0)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tmodel = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400;\r\n\t\t\t\t\t\t\t\tif (_FIXES_NO_RANGE(model, 0, 211 + 1) || FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2) & 0xF == 15)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t// In an invalid vehicle (one you can't drive).\r\n\t\t\t\t\t\t\t\t\tFIXES_BlockUpdate(playerid, true);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t// They are a driver, but not in the driver's seat.\r\n\t\t\t\t\t\t\t\tFIXES_BlockUpdate(playerid, true);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t#if FIX_HydraSniper\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tmodel = GetVehicleModel(GetPlayerVehicleID(playerid));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t#endif\r\n\t\t\t#if !FIX_HydraSniper\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t#endif\r\n\t\t// =============================\r\n\t\t//  END:   OnPlayerEnterVehicle \r\n\t\t// =============================\r\n\t\t\r\n\t\t// ====================\r\n\t\t//  BEGIN: HydraSniper \r\n\t\t// ====================\r\n\t\t#if FIX_HydraSniper\r\n\t\t\t#if !FIX_OnPlayerEnterVehicle\r\n\t\t\t\t// Only called if the same check above isn't called.\r\n\t\t\t\tif (newstate == PLAYER_STATE_DRIVER)\r\n\t\t\t\t{\r\n\t\t\t\t\tnew\r\n\t\t\t\t\t\tmodel = GetVehicleModel(GetPlayerVehicleID(playerid));\r\n\t\t\t#endif\r\n\t\t\t\t\tif (GetPlayerWeapon(playerid) == 34 && (model == 520 || model == 425))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSetPlayerArmedWeapon(playerid, 0);\r\n\t\t\t\t\t\t#if FIX_GetPlayerWeapon\r\n\t\t\t\t\t\t\t// This is the first cross-dependednt fix.\r\n\t\t\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\t\t\tFIXES_gsPlayerWeapon[playerid] = 0;\r\n\t\t\t\t\t\t\t#else\r\n\t\t\t\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);\r\n\t\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t#endif\r\n\t\t// ====================\r\n\t\t//  END:   HydraSniper \r\n\t\t// ====================\r\n\t\t\r\n\t\t#if FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_TrainExit\r\n\t\t\t#if PLAYER_STATE_PASSENGER != PLAYER_STATE_DRIVER + 1\r\n\t\t\t\t#error FIX_GetPlayerWeapon/FIX_PutPlayerInVehicle state assertation failed.\r\n\t\t\t#endif\r\n\t\t\tif (_FIXES_IN_RANGE(oldstate, PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER + 1))\r\n\t\t\t{\r\n\t\t\t\t#if FIX_PutPlayerInVehicle || FIX_TrainExit\r\n\t\t\t\t\tnew\r\n\t\t\t\t\t\te_FIXES_BOOLS:bools = FIXES_gsPlayerBools[playerid];\r\n\t\t\t\t#endif\r\n\t\t\t\t\r\n\t\t\t\t// ========================\r\n\t\t\t\t//  BEGIN: GetPlayerWeapon \r\n\t\t\t\t// ========================\r\n\t\t\t\t#if FIX_GetPlayerWeapon\r\n\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\tFIXES_gsPlayerWeapon[playerid] = -1;\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);\r\n\t\t\t\t\t#endif\r\n\t\t\t\t#endif\r\n\t\t\t\t// ========================\r\n\t\t\t\t//  END:   GetPlayerWeapon \r\n\t\t\t\t// ========================\r\n\t\t\t\t\r\n\t\t\t\t// ==================\r\n\t\t\t\t//  BEGIN: TrainExit\r\n\t\t\t\t// ==================\r\n\t\t\t\t#if FIX_TrainExit\r\n\t\t\t\t\tFIXES_PRINTF(\"train exit\");\r\n\t\t\t\t\tif (bools & e_FIXES_BOOLS_PUT_IN_TRAIN)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFIXES_PRINTF(\"OK\");\r\n\t\t\t\t\t\tSetCameraBehindPlayer(playerid),\r\n\t\t\t\t\t\tbools &= ~e_FIXES_BOOLS_PUT_IN_TRAIN;\r\n\t\t\t\t\t}\r\n\t\t\t\t#endif\r\n\t\t\t\t// ==================\r\n\t\t\t\t//  END:   TrainExit\r\n\t\t\t\t// ==================\r\n\t\t\t\t\r\n\t\t\t\t// ===========================\r\n\t\t\t\t//  BEGIN: PutPlayerInVehicle \r\n\t\t\t\t// ===========================\r\n\t\t\t\t#if FIX_PutPlayerInVehicle\r\n\t\t\t\t\t// Update their vehicle once we KNOW the client has done the\r\n\t\t\t\t\t// removal from the vehicle.\r\n\t\t\t\t\tif (bools & e_FIXES_BOOLS_PUT_IN_VEHICLE)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tnew\r\n\t\t\t\t\t\t\tvid = FIXES_gsVehicleSeatData[playerid] & 0x00FFFFFF;\r\n\t\t\t\t\t\t// Limited to \"only\" 16777216 vehicles and 256 seats.\r\n\t\t\t\t\t\tPutPlayerInVehicle(playerid, vid, FIXES_gsVehicleSeatData[playerid] >>> 24),\r\n\t\t\t\t\t\tbools &= ~e_FIXES_BOOLS_PUT_IN_VEHICLE;\r\n\t\t\t\t\t\t#if FIX_TrainExit\r\n\t\t\t\t\t\t\tswitch (GetVehicleModel(vid))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcase 449, 537, 538:\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tbools |= e_FIXES_BOOLS_PUT_IN_TRAIN;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t}\r\n\t\t\t\t#endif\r\n\t\t\t\t// ===========================\r\n\t\t\t\t//  END:   PutPlayerInVehicle \r\n\t\t\t\t// ===========================\r\n\t\t\t\t\r\n\t\t\t\t#if FIX_PutPlayerInVehicle || FIX_TrainExit\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] = bools;\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t\r\n\t\treturn FIXES_OnPlayerStateChange(playerid, newstate, oldstate);\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerStateChange\r\n\t\t#error _ALS_OnPlayerStateChange defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerStateChange\r\n\t#define OnPlayerStateChange(%0) FIXES_OnPlayerStateChange(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerStateChange(playerid, newstate, oldstate);\r\n#endif\r\n\r\n/* \r\n * FIXES_GivePlayerWeapon(playerid, weaponid, ammo)\r\n * \r\n * FIXES:\r\n *     HydraSniper\r\n */\r\n\r\n#if defined _ALS_GivePlayerWeapon\r\n\t#error _ALS_GivePlayerWeapon defined\r\n#endif\r\nnative BAD_GivePlayerWeapon(playerid, weaponid, ammo) = GivePlayerWeapon;\r\n\r\n#if FIX_HydraSniper\r\n\tstock FIXES_GivePlayerWeapon(playerid, weaponid, ammo)\r\n\t{\r\n\t\tnew\r\n\t\t\tvid = GetPlayerVehicleID(playerid);\r\n\t\tif (vid)\r\n\t\t{\r\n\t\t\tvid = GetVehicleModel(vid);\r\n\t\t\tif (weaponid == 34 && (vid == 520 || vid == 425))\r\n\t\t\t{\r\n\t\t\t\tvid = GivePlayerWeapon(playerid, weaponid, ammo),\r\n\t\t\t\tSetPlayerArmedWeapon(playerid, 0);\r\n\t\t\t\t#if FIX_GetPlayerWeapon\r\n\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\tFIXES_gsPlayerWeapon[playerid] = 0;\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);\r\n\t\t\t\t\t#endif\r\n\t\t\t\t#endif\r\n\t\t\t\treturn vid;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn GivePlayerWeapon(playerid, weaponid, ammo);\r\n\t}\r\n\t\r\n\t#define _ALS_GivePlayerWeapon\r\n\t#define GivePlayerWeapon FIXES_GivePlayerWeapon\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerArmedWeapon(playerid, weaponid)\r\n * \r\n * FIXES:\r\n *     GetPlayerWeapon\r\n */\r\n\r\n#if defined _ALS_SetPlayerArmedWeapon\r\n\t#error _ALS_SetPlayerArmedWeapon defined\r\n#endif\r\nnative BAD_SetPlayerArmedWeapon(playerid, weaponid) = SetPlayerArmedWeapon;\r\n\r\n#if FIX_GetPlayerWeapon\r\n\tstock FIXES_SetPlayerArmedWeapon(playerid, weaponid)\r\n\t{\r\n\t\t#if FIX_AllowInteriorWeapons\r\n\t\t\tif (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR && GetPlayerInterior(playerid))\r\n\t\t\t{\r\n\t\t\t\t// Not allowed weapons.\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t#endif\r\n\t\tnew\r\n\t\t\tvid = GetPlayerVehicleID(playerid);\r\n\t\tif (vid)\r\n\t\t{\r\n\t\t\t#if FIX_HydraSniper\r\n\t\t\t\tvid = GetVehicleModel(vid);\r\n\t\t\t\tif (weaponid == 34 && (vid == 520 || vid == 425))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t\t//FIXES_gsPlayerWeapon[playerid] = weaponid;\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsPlayerWeapon[playerid] = weaponid;\r\n\t\t\t#else\r\n\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerWeapon, weaponid);\r\n\t\t\t#endif\r\n\t\t}\r\n\t\treturn SetPlayerArmedWeapon(playerid, weaponid);\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerArmedWeapon\r\n\t#define SetPlayerArmedWeapon FIXES_SetPlayerArmedWeapon\r\n#endif\r\n\r\n/* \r\n * FIXES_GetPlayerWeapon(playerid)\r\n * \r\n * FIXES:\r\n *     GetPlayerWeapon\r\n */\r\n\r\n#if defined _ALS_GetPlayerWeapon\r\n\t#error _ALS_GetPlayerWeapon defined\r\n#endif\r\nnative BAD_GetPlayerWeapon(playerid) = GetPlayerWeapon;\r\n\r\n#if FIX_GetPlayerWeapon\r\n\tstock FIXES_GetPlayerWeapon(playerid)\r\n\t{\r\n\t\t#if FIXES_Single\r\n\t\t\tnew\r\n\t\t\t\tret = FIXES_gsPlayerWeapon[playerid];\r\n\t\t#else\r\n\t\t\tnew\r\n\t\t\t\tret = GetPVarInt(playerid, FIXES_pvarPlayerWeapon);\r\n\t\t#endif\r\n\t\tif (ret == -1)\r\n\t\t{\r\n\t\t\treturn GetPlayerWeapon(playerid);\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\t#define _ALS_GetPlayerWeapon\r\n\t#define GetPlayerWeapon FIXES_GetPlayerWeapon\r\n#endif\r\n\r\n/* \r\n * FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)\r\n * \r\n * FIXES:\r\n *     PutPlayerInVehicle\r\n */\r\n\r\n#if defined _ALS_PutPlayerInVehicle\r\n\t#error _ALS_PutPlayerInVehicle defined\r\n#endif\r\nnative BAD_PutPlayerInVehicle(playerid, vehicleid, seatid) = PutPlayerInVehicle;\r\n\r\n#if FIX_PutPlayerInVehicle || FIX_TrainExit\r\n\t#if FIXES_Single\r\n\t\tstock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)\r\n\t\t{\r\n\t\t\t// ==================\r\n\t\t\t//  BEGIN: TrainExit\r\n\t\t\t// ==================\r\n\t\t\t#if FIX_TrainExit\r\n\t\t\t\tFIXES_PRINTF(\"TrainExit %d\", GetVehicleModel(vehicleid));\r\n\t\t\t\tswitch (GetVehicleModel(vehicleid))\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 449, 537, 538:\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t\t// ==================\r\n\t\t\t//  END:   TrainExit\r\n\t\t\t// ==================\r\n\t\t\t\r\n\t\t\t// ===========================\r\n\t\t\t//  BEGIN: PutPlayerInVehicle \r\n\t\t\t// ===========================\r\n\t\t\t#if FIX_PutPlayerInVehicle\r\n\t\t\t\tnew\r\n\t\t\t\t\tvid = GetPlayerVehicleID(playerid);\r\n\t\t\t\tif (vid)\r\n\t\t\t\t{\r\n\t\t\t\t\tnew\r\n\t\t\t\t\t\tFloat:x,\r\n\t\t\t\t\t\tFloat:y,\r\n\t\t\t\t\t\tFloat:z;\r\n\t\t\t\t\t// Remove them without the animation.\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\tGetVehiclePos(vid, x, y, z),\r\n\t\t\t\t\t\tSetPlayerPos(playerid, x, y, z),\r\n\t\t\t\t\t\tFIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid,\r\n\t\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE,\r\n\t\t\t\t\t\t1;\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t\t// ===========================\r\n\t\t\t//  END:   PutPlayerInVehicle \r\n\t\t\t// ===========================\r\n\t\t\treturn PutPlayerInVehicle(playerid, vehicleid, seatid);\r\n\t\t}\r\n\t#else\r\n\t\tforward _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data);\r\n\t\t\r\n\t\tstock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)\r\n\t\t{\r\n\t\t\tFIXES_PRINTF(\"NOT SINGLE\");\r\n\t\t\t// ===========================\r\n\t\t\t//  BEGIN: PutPlayerInVehicle \r\n\t\t\t// ===========================\r\n\t\t\t#if FIX_PutPlayerInVehicle\r\n\t\t\t\tnew\r\n\t\t\t\t\tvid = GetPlayerVehicleID(playerid);\r\n\t\t\t\tif (vid)\r\n\t\t\t\t{\r\n\t\t\t\t\tnew\r\n\t\t\t\t\t\tFloat:x,\r\n\t\t\t\t\t\tFloat:y,\r\n\t\t\t\t\t\tFloat:z;\r\n\t\t\t\t\t// Remove them without the animation.\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\tGetVehiclePos(vid, x, y, z),\r\n\t\t\t\t\t\tSetPlayerPos(playerid, x, y, z),\r\n\t\t\t\t\t\tCallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 1, vid),\r\n\t\t\t\t\t\t1;\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t\t// ===========================\r\n\t\t\t//  END:   PutPlayerInVehicle \r\n\t\t\t// ===========================\r\n\t\t\t\r\n\t\t\t// ==================\r\n\t\t\t//  BEGIN: TrainExit\r\n\t\t\t// ==================\r\n\t\t\t#if FIX_TrainExit\r\n\t\t\t\tnew\r\n\t\t\t\t\tmodel = GetVehicleModel(vehicleid);\r\n\t\t\t\tswitch (model)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 449, 537, 538:\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tCallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 0, model);\r\n\t\t\t\t\t\t//FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t\t// ==================\r\n\t\t\t//  END:   TrainExit\r\n\t\t\t// ==================\r\n\t\t\treturn PutPlayerInVehicle(playerid, vehicleid, seatid);\r\n\t\t}\r\n\t\t\r\n\t\tpublic _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data)\r\n\t\t{\r\n\t\t\tFIXES_PRINTF(\"IN CHARGE: %d\", (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE));\r\n\t\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t\t{\r\n\t\t\t\t// ===========================\r\n\t\t\t\t//  BEGIN: PutPlayerInVehicle \r\n\t\t\t\t// ===========================\r\n\t\t\t\t#if FIX_PutPlayerInVehicle\r\n\t\t\t\t\tif (from)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid,\r\n\t\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE;\r\n\t\t\t\t\t}\r\n\t\t\t\t#endif\r\n\t\t\t\t// ===========================\r\n\t\t\t\t//  END:   PutPlayerInVehicle \r\n\t\t\t\t// ===========================\r\n\t\t\t\t\r\n\t\t\t\t// ==================\r\n\t\t\t\t//  BEGIN: TrainExit\r\n\t\t\t\t// ==================\r\n\t\t\t\t#if FIX_TrainExit\r\n\t\t\t\t\t#if FIX_PutPlayerInVehicle\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tif (!from)\r\n\t\t\t\t\t#endif\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tswitch (data)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcase 449, 537, 538:\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t#endif\r\n\t\t\t\t// ==================\r\n\t\t\t\t//  END:   TrainExit\r\n\t\t\t\t// ==================\r\n\t\t\t}\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t#endif\r\n\t\r\n\t#define _ALS_PutPlayerInVehicle\r\n\t#define PutPlayerInVehicle FIXES_PutPlayerInVehicle\r\n#endif\r\n\r\n/* \r\n * _FIXES_SetCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)\r\n * \r\n * FIXES:\r\n *     SetPlayerCheckpoint\r\n */\r\n\r\n#if FIX_SetPlayerCheckpoint\r\n\tforward _FIXES_SetCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size);\r\n\t\r\n\tpublic _FIXES_SetCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)\r\n\t{\r\n\t\t#if FIXES_Single\r\n\t\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_CP_DELAYED)\r\n\t\t#else\r\n\t\t\tif (GetPVarInt(playerid, FIXES_pvarPlayerCheckpoint))\r\n\t\t#endif\r\n\t\t\t{\r\n\t\t\t\treturn\r\n\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_CP_DELAYED,\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tDeletePVar(playerid, FIXES_pvarPlayerCheckpoint),\r\n\t\t\t\t\t#endif\r\n\t\t\t\t\t\tSetPlayerCheckpoint(playerid, x, y, z, size);\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t}\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)\r\n * \r\n * FIXES:\r\n *     SetPlayerCheckpoint\r\n */\r\n\r\n#if defined _ALS_SetPlayerCheckpoint\r\n\t#error _ALS_SetPlayerCheckpoint defined\r\n#endif\r\nnative BAD_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) = SetPlayerCheckpoint;\r\n\r\n#if FIX_SetPlayerCheckpoint\r\n\tstock FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)\r\n\t{\r\n\t\treturn\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_CP_DELAYED,\r\n\t\t\t#else\r\n\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerCheckpoint, 1),\r\n\t\t\t#endif\r\n\t\t\t\tDisablePlayerCheckpoint(playerid),\r\n\t\t\t\tSetTimerEx(FIXES_gscSetCheckpoint, 50, 0, FIXES_gscSpec@iffff, playerid, x, y, z, size),\r\n\t\t\t\t1;\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerCheckpoint\r\n\t#define SetPlayerCheckpoint FIXES_SetPlayerCheckpoint\r\n#endif\r\n\r\n/* \r\n * FIXES_DisablePlayerCheckpoint(playerid)\r\n * \r\n * FIXES:\r\n *     SetPlayerCheckpoint\r\n */\r\n\r\n#if defined _ALS_DisablePlayerCheckpoint\r\n\t#error _ALS_DisablePlayerCheckpoint defined\r\n#endif\r\nnative BAD_DisablePlayerCheckpoint(playerid) = DisablePlayerCheckpoint;\r\n\r\n#if FIX_SetPlayerCheckpoint\r\n\tstock FIXES_DisablePlayerCheckpoint(playerid)\r\n\t{\r\n\t\treturn\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_CP_DELAYED,\r\n\t\t\t#else\r\n\t\t\t\tDeletePVar(playerid, FIXES_pvarPlayerCheckpoint),\r\n\t\t\t#endif\r\n\t\t\t\tDisablePlayerCheckpoint(playerid);\r\n\t}\r\n\t\r\n\t#define _ALS_DisablePlayerCheckpoint\r\n\t#define DisablePlayerCheckpoint FIXES_DisablePlayerCheckpoint\r\n#endif\r\n\r\n/* \r\n * _FIXES_SetRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)\r\n * \r\n * FIXES:\r\n *     SetPlayerRaceCheckpoint\r\n */\r\n\r\n#if FIX_SetPlayerRaceCheckpoint\r\n\tforward _FIXES_SetRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size);\r\n\t\r\n\tpublic _FIXES_SetRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)\r\n\t{\r\n\t\t#if FIXES_Single\r\n\t\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_RACE_CP_DELAYED)\r\n\t\t#else\r\n\t\t\tif (GetPVarInt(playerid, FIXES_pvarPlayerRaceCheckpoint))\r\n\t\t#endif\r\n\t\t\t{\r\n\t\t\t\treturn\r\n\t\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_RACE_CP_DELAYED,\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\tDeletePVar(playerid, FIXES_pvarPlayerRaceCheckpoint),\r\n\t\t\t\t\t#endif\r\n\t\t\t\t\t\tSetPlayerRaceCheckpoint(playerid, type, x, y, z, nextx, nexty, nextz, size);\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t}\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)\r\n * \r\n * FIXES:\r\n *     SetPlayerRaceCheckpoint\r\n */\r\n\r\n#if defined _ALS_SetPlayerRaceCheckpoint\r\n\t#error _ALS_SetPlayerRaceCheckpoint defined\r\n#endif\r\nnative BAD_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) = SetPlayerRaceCheckpoint;\r\n\r\n#if FIX_SetPlayerRaceCheckpoint\r\n\tstock FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)\r\n\t{\r\n\t\treturn\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_RACE_CP_DELAYED,\r\n\t\t\t#else\r\n\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerRaceCheckpoint, 1),\r\n\t\t\t#endif\r\n\t\t\t\tDisablePlayerRaceCheckpoint(playerid),\r\n\t\t\t\tSetTimerEx(FIXES_gscSetRaceCheckpoint, 50, 0, FIXES_gscSpec@iifffffff, playerid, type, x, y, z, nextx, nexty, nextz, size),\r\n\t\t\t\t1;\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerRaceCheckpoint\r\n\t#define SetPlayerRaceCheckpoint FIXES_SetPlayerRaceCheckpoint\r\n#endif\r\n\r\n/* \r\n * FIXES_DisablePlayerRaceCheckpoint(playerid)\r\n * \r\n * FIXES:\r\n *     SetPlayerRaceCheckpoint\r\n */\r\n\r\n#if defined _ALS_DisablePlayerRaceCP\r\n\t#error _ALS_DisablePlayerRaceCP defined\r\n#endif\r\nnative BAD_DisablePlayerRaceCheckpoint(playerid) = DisablePlayerRaceCheckpoint;\r\n\r\n#if FIX_SetPlayerRaceCheckpoint\r\n\tstock FIXES_DisablePlayerRaceCP(playerid)\r\n\t{\r\n\t\treturn\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_RACE_CP_DELAYED,\r\n\t\t\t#else\r\n\t\t\t\tDeletePVar(playerid, FIXES_pvarPlayerRaceCheckpoint),\r\n\t\t\t#endif\r\n\t\t\t\tDisablePlayerRaceCheckpoint(playerid);\r\n\t}\r\n\t\r\n\t#define _ALS_DisablePlayerRaceCP\r\n\t#define DisablePlayerRaceCheckpoint FIXES_DisablePlayerRaceCP\r\n#endif\r\n\r\n/* \r\n * _FIXES_HideGameTextForPlayer(playerid, style, parr[])\r\n * \r\n * Hides a GameText style for one or more players, and accounts for the fact\r\n * that they may have different messages being shown.\r\n * \r\n * FIXES:\r\n *     GameText\r\n */\r\n\r\n#if FIX_GameText\r\n\tstatic stock _FIXES_HideGameTextForPlayer(playerid, style, parr[])\r\n\t{\r\n\t\tswitch (playerid)\r\n\t\t{\r\n\t\t\tcase MAX_PLAYERS:\r\n\t\t\t{\r\n\t\t\t\t// Remove the global GameText for everyone that can see it.\r\n\t\t\t\tTextDrawHideForAll(FIXES_gsGTStyle[style]);\r\n\t\t\t}\r\n\t\t\tcase INVALID_PLAYER_ID:\r\n\t\t\t{\r\n\t\t\t\t// Hide any player-local ones.  This is similar to \"foreach\".\r\n\t\t\t\tplayerid = parr[MAX_PLAYERS],\r\n\t\t\t\tparr[MAX_PLAYERS] = MAX_PLAYERS;\r\n\t\t\t\tfor (new next; playerid != MAX_PLAYERS; playerid = next)\r\n\t\t\t\t{\r\n\t\t\t\t\tPlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]),\r\n\t\t\t\t\tnext = parr[playerid],\r\n\t\t\t\t\tparr[playerid] = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdefault:\r\n\t\t\t{\r\n\t\t\t\t// Remove.\r\n\t\t\t\tPlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]),\r\n\t\t\t\t_FIXES_RemoveInternal(parr, playerid, MAX_PLAYERS);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n/* \r\n * _FIXES_HideGameTextTimer(playerid, style)\r\n * \r\n * FIXES:\r\n *     GameText\r\n */\r\n\r\n#if FIX_GameText\r\n\tforward _FIXES_HideGameTextTimer(playerid, style);\r\n\t\r\n\tpublic _FIXES_HideGameTextTimer(playerid, style)\r\n\t{\r\n\t\tif (GetTickCount() >= FIXES_gsGTTimer[style][playerid])\r\n\t\t{\r\n\t\t\t// Only hide it if it hasn't been re-shown in the interim.\r\n\t\t\t_FIXES_HideGameTextForPlayer(playerid, style, FIXES_gsPlayerPGTShown[style]);\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n/* \r\n * _FIXES_GameTextShow(playerid, string[], time, style)\r\n * \r\n * FIXES:\r\n *     GameText\r\n */\r\n\r\n#if FIX_GameText\r\n\tforward _FIXES_GameTextShow(playerid, string[], time, style);\r\n\t\r\n\tpublic _FIXES_GameTextShow(playerid, string[], time, style)\r\n\t{\r\n\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t{\r\n\t\t\tif (playerid == MAX_PLAYERS)\r\n\t\t\t{\r\n\t\t\t\t_FIXES_HideGameTextForPlayer(INVALID_PLAYER_ID, style, FIXES_gsPlayerPGTShown[style]),\r\n\t\t\t\tTextDrawSetString(FIXES_gsGTStyle[style], string),\r\n\t\t\t\tTextDrawShowForAll(FIXES_gsGTStyle[style]);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tTextDrawHideForPlayer(playerid, FIXES_gsGTStyle[style]),\r\n\t\t\t\tPlayerTextDrawSetString(playerid, FIXES_gsPGTStyle[playerid][style], string),\r\n\t\t\t\tPlayerTextDrawShow(playerid, FIXES_gsPGTStyle[playerid][style]),\r\n\t\t\t\t_FIXES_AddInternal(FIXES_gsPlayerPGTShown[style], playerid, MAX_PLAYERS);\r\n\t\t\t}\r\n\t\t\tif (time)\r\n\t\t\t{\r\n\t\t\t\t// Tiny offset because timers are inaccurate.\r\n\t\t\t\tFIXES_gsGTTimer[style][playerid] = GetTickCount() + time - 10,\r\n\t\t\t\t// Don't need to save the timer's ID.\r\n\t\t\t\tSetTimerEx(FIXES_gscHideGameTextTimer, time, false, FIXES_gscSpec@ii, playerid, style);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 1;\r\n\t}\r\n#endif\r\n\r\n/* \r\n * FIXES_GameTextForAll(string[], time, style)\r\n * \r\n * FIXES:\r\n *     GameText\r\n */\r\n\r\n#if defined _ALS_GameTextForAll\r\n\t#error _ALS_GameTextForAll defined\r\n#endif\r\nnative BAD_GameTextForAll(const string[], time, style) = GameTextForAll;\r\n\r\n#if FIX_GameText\r\n\tstock FIXES_GameTextForAll(string[], time, style)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT))\r\n\t\t{\r\n\t\t\tif ((string[0] == '\\0') || (string[0] == '\\1' && string[1] == '\\0'))\r\n\t\t\t{\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\treturn _FIXES_GameTextShow(MAX_PLAYERS, FIXES_gscSpace, time, style);\r\n\t\t\t\t#else\r\n\t\t\t\t\treturn CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, FIXES_gscSpace, time, style);\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\treturn _FIXES_GameTextShow(MAX_PLAYERS, string, time, style);\r\n\t\t\t\t#else\r\n\t\t\t\t\treturn CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, string, time, style);\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_GameTextForAll\r\n\t\r\n\t#define GameTextForAll FIXES_GameTextForAll\r\n#endif\r\n\r\n/* \r\n * FIXES_GameTextForPlayer(playerid, string[], time, style)\r\n * \r\n * FIXES:\r\n *     GameText\r\n */\r\n\r\n#if defined _ALS_GameTextForPlayer\r\n\t#error _ALS_GameTextForPlayer defined\r\n#endif\r\nnative BAD_GameTextForPlayer(playerid, const string[], time, style) = GameTextForPlayer;\r\n\r\n#if FIX_GameText\r\n\tstock FIXES_GameTextForPlayer(playerid, string[], time, style)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT) && _FIXES_IS_PLAYER_CONNECTED(playerid))\r\n\t\t{\r\n\t\t\tif ((string[0] <= '\\0') || (string[0] == '\\1' && string[1] == '\\0'))\r\n\t\t\t{\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\treturn _FIXES_GameTextShow(playerid, FIXES_gscSpace, time, style);\r\n\t\t\t\t#else\r\n\t\t\t\t\treturn CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, FIXES_gscSpace, time, style);\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\treturn _FIXES_GameTextShow(playerid, string, time, style);\r\n\t\t\t\t#else\r\n\t\t\t\t\treturn CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, string, time, style);\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_GameTextForPlayer\r\n\t\r\n\t#define GameTextForPlayer FIXES_GameTextForPlayer\r\n#endif\r\n\r\n/* \r\n * HideGameTextForAll(style)\r\n * \r\n * FIXES:\r\n *     HideGameText\r\n */\r\n\r\n#if defined _ALS_HideGameTextForAll\r\n\t#error _ALS_HideGameTextForAll defined\r\n#endif\r\nnative BAD_HideGameTextForAll(style) = HideGameTextForAll;\r\n\r\n#if FIX_HideGameText\r\n\t#define _ALS_HideGameTextForAll\r\n\t\r\n\t#define HideGameTextForAll(%0) GameTextForAll(FIXES_gscSpace, 0, (%0))\r\n#endif\r\n\r\n/* \r\n * HideGameTextForPlayer(playerid, style)\r\n * \r\n * FIXES:\r\n *     HideGameText\r\n */\r\n\r\n#if defined _ALS_HideGameTextForPlayer\r\n\t#error _ALS_HideGameTextForPlayer defined\r\n#endif\r\nnative BAD_HideGameTextForPlayer(playerid, style) = HideGameTextForPlayer;\r\n\r\n#if FIX_HideGameText\r\n\t#define _ALS_HideGameTextForPlayer\r\n\t\r\n\t#define HideGameTextForPlayer(%1,%0) GameTextForPlayer((%1), FIXES_gscSpace, 0, (%0))\r\n#endif\r\n\r\n/* \r\n * PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])\r\n * \r\n * FIXES:\r\n *     CreatePlayerTextDraw\r\n */\r\n\r\n#if defined _ALS_CreatePlayerTextDraw\r\n\t#error _ALS_CreatePlayerTextDraw defined\r\n#endif\r\nnative Text:BAD_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[]) = CreatePlayerTextDraw;\r\n\r\n#if FIX_CreatePlayerTextDraw\r\n\tstock PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])\r\n\t{\r\n\t\tif ((text[0] == '\\0') || (text[0] == '\\1' && text[1] == '\\0'))\r\n\t\t{\r\n\t\t\treturn CreatePlayerTextDraw(playerid, x, y, FIXES_gscSpace);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn CreatePlayerTextDraw(playerid, x, y, text);\r\n\t\t}\r\n\t}\r\n\t\r\n\t#define _ALS_CreatePlayerTextDraw\r\n\t#define CreatePlayerTextDraw FIXES_CreatePlayerTextDraw\r\n#endif\r\n\r\n/* \r\n * FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[])\r\n * \r\n * FIXES:\r\n *     PlayerTextDrawSetString\r\n */\r\n\r\n#if defined _ALS_PlayerTextDrawSetString\r\n\t#error _ALS_PlayerTextDrawSetString defined\r\n#endif\r\nnative BAD_PlayerTextDrawSetString(playerid, PlayerText:text, string[]) = PlayerTextDrawSetString;\r\n\r\n#if FIX_PlayerTextDrawSetString\r\n\tstock FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[])\r\n\t{\r\n\t\tif ((string[0] == '\\0') || (string[0] == '\\1' && string[1] == '\\0'))\r\n\t\t{\r\n\t\t\treturn PlayerTextDrawSetString(playerid, text, FIXES_gscSpace);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn PlayerTextDrawSetString(playerid, text, string);\r\n\t\t}\r\n\t}\r\n\t\r\n\t#define _ALS_PlayerTextDrawSetString\r\n\t#define PlayerTextDrawSetString FIXES_PlayerTextDrawSetString\r\n#endif\r\n\r\n/* \r\n * Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])\r\n * \r\n * FIXES:\r\n *     TextDrawCreate\r\n */\r\n\r\n\t#if defined _ALS_TextDrawCreate\r\n\t\t#error _ALS_TextDrawCreate defined\r\nnative Text:BAD_TextDrawCreate(Float:x, Float:y, text[]) = TextDrawCreate;\r\n\r\n#if FIX_TextDrawCreate\r\n\tstock Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])\r\n\t{\r\n\t\tif ((text[0] == '\\0') || (text[0] == '\\1' && text[1] == '\\0'))\r\n\t\t{\r\n\t\t\treturn TextDrawCreate(x, y, FIXES_gscSpace);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn TextDrawCreate(x, y, text);\r\n\t\t}\r\n\t}\r\n\t\r\n\t#endif\r\n\t#define _ALS_TextDrawCreate\r\n\t#define TextDrawCreate FIXES_TextDrawCreate\r\n#endif\r\n\r\n/* \r\n * FIXES_TextDrawSetString(Text:text, string[])\r\n * \r\n * FIXES:\r\n *     TextDrawSetString\r\n */\r\n\r\n#if defined _ALS_TextDrawSetString\r\n\t#error _ALS_TextDrawSetString defined\r\n#endif\r\nnative BAD_TextDrawSetString(Text:text, string[]) = TextDrawSetString;\r\n\r\n#if FIX_TextDrawSetString\r\n\tstock FIXES_TextDrawSetString(Text:text, string[])\r\n\t{\r\n\t\tif ((string[0] == '\\0') || (string[0] == '\\1' && string[1] == '\\0'))\r\n\t\t{\r\n\t\t\treturn TextDrawSetString(text, FIXES_gscSpace);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn TextDrawSetString(text, string);\r\n\t\t}\r\n\t}\r\n\t\r\n\t#define _ALS_TextDrawSetString\r\n\t#define TextDrawSetString FIXES_TextDrawSetString\r\n#endif\r\n\r\n/* \r\n * FIXES_AllowInteriorWeapons(allow)\r\n * \r\n * FIXES:\r\n *     AllowInteriorWeapons\r\n */\r\n\r\n#if defined _ALS_AllowInteriorWeapons\r\n\t#error _ALS_AllowInteriorWeapons defined\r\n#endif\r\nnative BAD_AllowInteriorWeapons(allow) = AllowInteriorWeapons;\r\n\r\n#if FIX_AllowInteriorWeapons\r\n\t#if FIXES_Single\r\n\t\tstock FIXES_AllowInteriorWeapons(allow)\r\n\t\t{\r\n\t\t\tif (allow)\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;\r\n\t\t\t\t_FIXES_FOREACH(FIXES_gsPlayersIterator, i)\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;\r\n\t\t\t\t_FIXES_FOREACH(FIXES_gsPlayersIterator, i)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (GetPlayerInterior(i))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn allow;\r\n\t\t}\r\n\t#else\r\n\t\tforward _FIXES_AllowInteriorWeapons(allow);\r\n\t\t\r\n\t\tstock FIXES_AllowInteriorWeapons(allow)\r\n\t\t{\r\n\t\t\tCallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, allow);\r\n\t\t\treturn allow;\r\n\t\t}\r\n\t\t\r\n\t\tpublic _FIXES_AllowInteriorWeapons(allow)\r\n\t\t{\r\n\t\t\tif (allow)\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;\r\n\t\t\t\t_FIXES_FOREACH(FIXES_gsPlayersIterator, i)\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;\r\n\t\t\t\t_FIXES_FOREACH(FIXES_gsPlayersIterator, i)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (GetPlayerInterior(i))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn allow;\r\n\t\t}\r\n\t#endif\r\n\t\r\n\t#define _ALS_AllowInteriorWeapons\r\n\t#define AllowInteriorWeapons FIXES_AllowInteriorWeapons\r\n#endif\r\n\r\n/* \r\n * FIXES_GetPlayerInterior(playerid)\r\n * \r\n * FIXES:\r\n *     GetPlayerInterior\r\n */\r\n\r\n#if defined _ALS_GetPlayerInterior\r\n\t#error _ALS_GetPlayerInterior defined\r\n#endif\r\nnative BAD_GetPlayerInterior(playerid) = GetPlayerInterior;\r\n\r\n#if FIX_GetPlayerInterior\r\n\tstock FIXES_GetPlayerInterior(playerid)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t{\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\treturn FIXES_gsInterior[playerid];\r\n\t\t\t#else\r\n\t\t\t\treturn GetPVarInt(playerid, FIXES_pvarPlayerInterior);\r\n\t\t\t#endif\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_GetPlayerInterior\r\n\t#define GetPlayerInterior FIXES_GetPlayerInterior\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerInterior(playerid, interiorid)\r\n * \r\n * FIXES:\r\n *     GetPlayerInterior\r\n */\r\n\r\n#if defined _ALS_SetPlayerInterior\r\n\t#error _ALS_SetPlayerInterior defined\r\n#endif\r\nnative BAD_SetPlayerInterior(playerid, interiorid) = SetPlayerInterior;\r\n\r\n#if FIX_GetPlayerInterior\r\n\tstock FIXES_SetPlayerInterior(playerid, interiorid)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t{\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsInterior[playerid] = interiorid;\r\n\t\t\t#else\r\n\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerInterior, interiorid);\r\n\t\t\t#endif\r\n\t\t\treturn SetPlayerInterior(playerid, interiorid);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerInterior\r\n\t#define SetPlayerInterior FIXES_SetPlayerInterior\r\n#endif\r\n\r\n/* \r\n * OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)\r\n * \r\n * FIXES:\r\n *     AllowTeleport\r\n */\r\n\r\n#if FIX_AllowTeleport && !defined FILTERSCRIPT\r\n\tforward _FIXES_AllowTeleport(playerid, allow);\r\n\t\r\n\tpublic OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)\r\n\t{\r\n\t\t// ======================\r\n\t\t//  BEGIN: AllowTeleport \r\n\t\t// ======================\r\n\t\t#if FIX_AllowTeleport\r\n\t\t\tif (!_FIXES_gIsFilterscript)\r\n\t\t\t{\r\n\t\t\t\t// Unusually, the call order here is always Game Mode first -\r\n\t\t\t\t// most callbacks are Filter Script first.\r\n\t\t\t\tif ((FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_TELEPORT) || ((FIXES_gsSettings & e_FIXES_SETTINGS_ADMIN_TELEPORT) && (IsPlayerAdmin(playerid))))\r\n\t\t\t\t{\r\n\t\t\t\t\tSetPlayerPosFindZ(playerid, fX, fY, fZ);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// ======================\r\n\t\t//  END:   AllowTeleport \r\n\t\t// ======================\r\n\t\treturn FIXES_OnPlayerClickMap(playerid, fX, fY, fZ);\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnPlayerClickMap\r\n\t\t#error _ALS_OnPlayerClickMap defined\r\n\t#endif\r\n\t#define _ALS_OnPlayerClickMap\r\n\t#define OnPlayerClickMap(%0) FIXES_OnPlayerClickMap(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ);\r\n#endif\r\n\r\n/* \r\n * FIXES_AllowPlayerTeleport(playerid, allow)\r\n * \r\n * FIXES:\r\n *     AllowTeleport\r\n */\r\n\r\n#if defined _ALS_AllowPlayerTeleport\r\n\t#error _ALS_AllowPlayerTeleport defined\r\n#endif\r\nnative BAD_AllowPlayerTeleport(playerid, allow) = AllowPlayerTeleport;\r\n\r\n#if FIX_AllowTeleport\r\n\t#if FIXES_Single\r\n\t\tstock FIXES_AllowPlayerTeleport(playerid, allow)\r\n\t\t{\r\n\t\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t\t{\r\n\t\t\t\tif (allow)\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t#else\r\n\t\tstock FIXES_AllowPlayerTeleport(playerid, allow)\r\n\t\t{\r\n\t\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t\t{\r\n\t\t\t\tCallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, playerid, allow);\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t#endif\r\n\t\r\n\t#define _ALS_AllowPlayerTeleport\r\n\t#define AllowPlayerTeleport FIXES_AllowPlayerTeleport\r\n#endif\r\n\r\n/* \r\n * FIXES_AllowAdminTeleport(allow)\r\n * \r\n * FIXES:\r\n *     AllowTeleport\r\n */\r\n\r\n#if defined _ALS_AllowAdminTeleport\r\n\t#error _ALS_AllowAdminTeleport defined\r\n#endif\r\nnative BAD_AllowAdminTeleport(allow) = AllowAdminTeleport;\r\n\r\n#if FIX_AllowTeleport\r\n\t#if FIXES_Single\r\n\t\tstock FIXES_AllowAdminTeleport(allow)\r\n\t\t{\r\n\t\t\tif (allow)\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;\r\n\t\t\t}\r\n\t\t\treturn allow;\r\n\t\t}\r\n\t#else\r\n\t\tstock FIXES_AllowAdminTeleport(allow)\r\n\t\t{\r\n\t\t\treturn\r\n\t\t\t\tCallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, INVALID_PLAYER_ID, allow),\r\n\t\t\t\tallow;\r\n\t\t}\r\n\t#endif\r\n\t\r\n\t#define _ALS_AllowAdminTeleport\r\n\t#define AllowAdminTeleport FIXES_AllowAdminTeleport\r\n#endif\r\n\r\n/* \r\n * FIXES_AllowAdminTeleport(allow)\r\n * \r\n * FIXES:\r\n *     AllowTeleport\r\n */\r\n\r\n#if FIX_AllowTeleport && !defined FILTERSCRIPT && !FIXES_Single\r\n\tpublic _FIXES_AllowTeleport(playerid, allow)\r\n\t{\r\n\t\tif (!_FIXES_gIsFilterscript)\r\n\t\t{\r\n\t\t\tif (playerid == INVALID_PLAYER_ID)\r\n\t\t\t{\r\n\t\t\t\tif (allow)\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (allow)\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerSpecialAction(playerid, actionid)\r\n * \r\n * FIXES:\r\n *     SetPlayerSpecialAction\r\n */\r\n\r\n#if defined _ALS_SetPlayerSpecialAction\r\n\t#error _ALS_SetPlayerSpecialAction defined\r\n#endif\r\nnative BAD_SetPlayerSpecialAction(playerid, actionid) = SetPlayerSpecialAction;\r\n\r\n#if FIX_SetPlayerSpecialAction\r\n\tstock FIXES_SetPlayerSpecialAction(playerid, actionid)\r\n\t{\r\n\t\tif (GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)\r\n\t\t{\r\n\t\t\tClearAnimations(playerid);\r\n\t\t}\r\n\t\tSetPlayerSpecialAction(playerid, actionid);\r\n\t\treturn 1;\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerSpecialAction\r\n\t#define SetPlayerSpecialAction FIXES_SetPlayerSpecialAction\r\n#endif\r\n\r\n/* \r\n * FIXES_ClearAnimations(playerid, forcesync = 0)\r\n * \r\n * FIXES:\r\n *     ClearAnimations\r\n */\r\n\r\n#if defined _ALS_ClearAnimations\r\n\t#error _ALS_ClearAnimations defined\r\n#endif\r\nnative BAD_ClearAnimations(playerid, forcesync = 0) = ClearAnimations;\r\n\r\n#if FIX_ClearAnimations || FIX_ClearAnimations_2\r\n\tstock FIXES_ClearAnimations(playerid, forcesync = 0)\r\n\t{\r\n\t\t#if FIX_ClearAnimations || FIX_ClearAnimations_2\r\n\t\t\tif (IsPlayerInAnyVehicle(playerid))\r\n\t\t#endif\r\n\t\t#if FIX_ClearAnimations\r\n\t\t\t{\r\n\t\t\t\treturn ApplyAnimation(playerid, \"PED\", \"CAR_SIT\", 4.0, 0, 0, 0, 0, 1, forcesync);\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t#if FIX_ClearAnimations + FIX_ClearAnimations_2 == 1 // XOR\r\n\t\t\t{\r\n\t\t\t\treturn ClearAnimations(playerid, forcesync);\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t#if FIX_ClearAnimations_2\r\n\t\t\tnew\r\n\t\t\t\tret = ClearAnimations(playerid, forcesync);\r\n\t\t\tApplyAnimation(playerid, \"PED\", \"IDLE_STANCE\", 4.0, 0, 0, 0, 0, 1, forcesync);\r\n\t\t\tApplyAnimation(playerid, \"PED\", \"IDLE_CHAT\", 4.0, 0, 0, 0, 0, 1, forcesync);\r\n\t\t\tApplyAnimation(playerid, \"PED\", \"WALK_PLAYER\", 4.0, 0, 0, 0, 0, 1, forcesync);\r\n\t\t\treturn ret;\r\n\t\t#endif\r\n\t}\r\n\t\r\n\t#define _ALS_ClearAnimations\r\n\t#define ClearAnimations FIXES_ClearAnimations\r\n#endif\r\n\r\n/* \r\n * FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy)\r\n * \r\n * FIXES:\r\n *     GangZoneCreate\r\n */\r\n\r\n#if defined _ALS_GangZoneCreate\r\n\t#error _ALS_GangZoneCreate defined\r\n#endif\r\nnative BAD_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy) = GangZoneCreate;\r\n\r\n#if FIX_GangZoneCreate\r\n\tstock FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy)\r\n\t{\r\n\t\treturn GangZoneCreate(floatsub(minx, floatfract(minx)), floatsub(miny, floatfract(miny)), floatsub(maxx, floatfract(maxx)), floatsub(maxy, floatfract(maxy)));\r\n\t}\r\n\t\r\n\t#define _ALS_GangZoneCreate\r\n\t#define GangZoneCreate FIXES_GangZoneCreate\r\n#endif\r\n\r\n/* \r\n * FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])\r\n * \r\n * FIXES:\r\n *     OnDialogResponse\r\n *     GetPlayerDialog\r\n */\r\n\r\n#if defined _ALS_ShowPlayerDialog\r\n\t#error _ALS_ShowPlayerDialog defined\r\n#endif\r\nnative BAD_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) = ShowPlayerDialog;\r\n\r\n#if FIX_OnDialogResponse || FIX_GetPlayerDialog\r\n\tstock FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t{\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsDialogID[playerid] = dialog;\r\n\t\t\t#else\r\n\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerDialog, dialog);\r\n\t\t\t#endif\r\n\t\t\treturn ShowPlayerDialog(playerid, dialog, style, title, caption, button1, button2);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_ShowPlayerDialog\r\n\t#define ShowPlayerDialog FIXES_ShowPlayerDialog\r\n#endif\r\n\r\n/* \r\n * OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])\r\n * \r\n * FIXES:\r\n *     OnDialogResponse\r\n *     GetPlayerDialog\r\n */\r\n\r\n#if FIX_OnDialogResponse || FIX_GetPlayerDialog\r\n\tpublic OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])\r\n\t{\r\n\t\t// =========================\r\n\t\t//  BEGIN: OnDialogResponse \r\n\t\t// =========================\r\n\t\t#if FIX_OnDialogResponse || FIX_GetPlayerDialog\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\t#if FIX_OnDialogResponse\r\n\t\t\t\t\tdialogid = FIXES_gsDialogID[playerid];\r\n\t\t\t\t#endif\r\n\t\t\t\tFIXES_gsDialogID[playerid] = INVALID_DIALOG_ID;\r\n\t\t\t#elseif FIX_OnDialogResponse\r\n\t\t\t\t_FIXES_IS_IN_CHARGE()\r\n\t\t\t\t{\r\n\t\t\t\t\t// If there are multiple scripts, we can't just wipe the\r\n\t\t\t\t\t// current dialog data or subsequent scripts will display\r\n\t\t\t\t\t// the wrong value.\r\n\t\t\t\t\tdialogid = GetPVarInt(playerid, FIXES_pvarPlayerDialog),\r\n\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarCurrentDialog, dialogid),\r\n\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tdialogid = GetPVarInt(playerid, FIXES_pvarCurrentDialog);\r\n\t\t\t\t}\r\n\t\t\t#else\r\n\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);\r\n\t\t\t#endif\r\n\t\t\tif (inputtext[0])\r\n\t\t\t{\r\n\t\t\t\treturn FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\treturn FIXES_OnDialogResponse(playerid, dialogid, response, listitem, FIXES_gscNULL);\r\n\t\t\t}\r\n\t\t#endif\r\n\t\t// =========================\r\n\t\t//  END:   OnDialogResponse \r\n\t\t// =========================\r\n\t}\r\n\t\r\n\t#if defined _ALS_OnDialogResponse\r\n\t\t#error _ALS_OnDialogResponse defined\r\n\t#endif\r\n\t#define _ALS_OnDialogResponse\r\n\t#define OnDialogResponse(%0) FIXES_OnDialogResponse(%0) <_ALS : _ALS_go>\r\n\t\r\n\t_FIXES_FORWARD FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);\r\n#endif\r\n\r\n/* \r\n * FIXES_GetPlayerDialog(playerid)\r\n * \r\n * FIXES:\r\n *     GetPlayerDialog\r\n */\r\n\r\n#if defined _ALS_GetPlayerDialog\r\n\t#error _ALS_GetPlayerDialog defined\r\n#endif\r\nnative BAD_GetPlayerDialog(playerid) = GetPlayerDialog;\r\n\r\n#if FIX_GetPlayerDialog\r\n\tstock FIXES_GetPlayerDialog(playerid)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t{\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\treturn FIXES_gsDialogID[playerid];\r\n\t\t\t#else\r\n\t\t\t\treturn GetPVarInt(playerid, FIXES_pvarPlayerDialog);\r\n\t\t\t#endif\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\t\r\n\t#define _ALS_GetPlayerDialog\r\n\t#define GetPlayerDialog FIXES_GetPlayerDialog\r\n#endif\r\n\r\n/* \r\n * FIXES_valstr(dest[], value, bool:pack = false)\r\n * \r\n * FIXES:\r\n *     valstr\r\n */\r\n\r\n#if defined _ALS_valstr\r\n\t#error _ALS_valstr defined\r\n#endif\r\nnative BAD_valstr(dest[], value, bool:pack = false) = valstr;\r\n\r\n#if FIX_valstr\r\n\tstock FIXES_valstr(dest[], value, bool:pack = false)\r\n\t{\r\n\t\t// \"format\" can't handle cellmin properly.\r\n\t\tstatic const\r\n\t\t\tsc_szCellmin[] = !\"-2147483648\";\r\n\t\tif (value == cellmin)\r\n\t\t{\r\n\t\t\tpack && strpack(dest, sc_szCellmin, 12) || strunpack(dest, sc_szCellmin, 12);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tformat(dest, 12, \"%d\", value),\r\n\t\t\tpack && strpack(dest, dest, 12);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_valstr\r\n\t#define valstr FIXES_valstr\r\n#endif\r\n\r\n/* \r\n * FIXES_fclose(File:handle)\r\n * \r\n * FIXES:\r\n *     fclose\r\n */\r\n\r\n#if defined _ALS_fclose\r\n\t#error _ALS_fclose defined\r\n#endif\r\nnative BAD_fclose(File:handle) = fclose;\r\n\r\n#if FIX_fclose\r\n\tstock bool:FIXES_fclose(File:handle)\r\n\t{\r\n\t\treturn handle && fclose(handle);\r\n\t}\r\n\t\r\n\t#define _ALS_fclose\r\n\t#define fclose FIXES_fclose\r\n#endif\r\n\r\n/* \r\n * FIXES_fwrite(File:handle, const string[])\r\n * \r\n * FIXES:\r\n *     fwrite\r\n */\r\n\r\n#if defined _ALS_fwrite\r\n\t#error _ALS_fwrite defined\r\n#endif\r\nnative BAD_fwrite(File:handle, const string[]) = fwrite;\r\n\r\n#if FIX_fwrite\r\n\tstock FIXES_fwrite(File:handle, const string[])\r\n\t{\r\n\t\treturn handle && fwrite(handle, string);\r\n\t}\r\n\t\r\n\t#define _ALS_fwrite\r\n\t#define fwrite FIXES_fwrite\r\n#endif\r\n\r\n/* \r\n * FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)\r\n * \r\n * FIXES:\r\n *     fread\r\n */\r\n\r\n#if defined _ALS_fread\r\n\t#error _ALS_fread defined\r\n#endif\r\nnative BAD_fread(File:handle, string[], size = sizeof (string), bool:pack = false) = fread;\r\n\r\n#if FIX_fread\r\n\tstock FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)\r\n\t{\r\n\t\treturn handle && fread(handle, string, size, pack);\r\n\t}\r\n\t\r\n\t#define _ALS_fread\r\n\t#define fread FIXES_fread\r\n#endif\r\n\r\n/* \r\n * FIXES_fputchar(File:handle, value, bool:utf8 = true)\r\n * \r\n * FIXES:\r\n *     fputchar\r\n */\r\n\r\n#if defined _ALS_fputchar\r\n\t#error _ALS_fputchar defined\r\n#endif\r\nnative BAD_fputchar(File:handle, value, bool:utf8 = true) = fputchar;\r\n\r\n#if FIX_fputchar\r\n\tstock bool:FIXES_fputchar(File:handle, value, bool:utf8 = true)\r\n\t{\r\n\t\treturn handle && fputchar(handle, value, utf8);\r\n\t}\r\n\t\r\n\t#define _ALS_fputchar\r\n\t#define fputchar FIXES_fputchar\r\n#endif\r\n\r\n/* \r\n * FIXES_fgetchar(File:handle, value, bool:utf8 = true)\r\n * \r\n * FIXES:\r\n *     fgetchar\r\n */\r\n\r\n#if defined _ALS_fgetchar\r\n\t#error _ALS_fgetchar defined\r\n#endif\r\nnative BAD_fgetchar(File:handle, value, bool:utf8 = true) = fgetchar;\r\n\r\n#if FIX_fgetchar\r\n\tstock FIXES_fgetchar(File:handle, value, bool:utf8 = true)\r\n\t{\r\n\t\treturn handle && fgetchar(handle, value, utf8);\r\n\t}\r\n\t\r\n\t#define _ALS_fgetchar\r\n\t#define fgetchar FIXES_fgetchar\r\n#endif\r\n\r\n/* \r\n * FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))\r\n * \r\n * FIXES:\r\n *     fblockwrite\r\n */\r\n\r\n#if defined _ALS_fblockwrite\r\n\t#error _ALS_fblockwrite defined\r\n#endif\r\nnative BAD_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) = fblockwrite;\r\n\r\n#if FIX_fblockwrite\r\n\tstock FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))\r\n\t{\r\n\t\treturn handle && fblockwrite(handle, buffer, size);\r\n\t}\r\n\t\r\n\t#define _ALS_fblockwrite\r\n\t#define fblockwrite FIXES_fblockwrite\r\n#endif\r\n\r\n/* \r\n * FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))\r\n * \r\n * FIXES:\r\n *     fblockread\r\n */\r\n\r\n#if defined _ALS_fblockread\r\n\t#error _ALS_fblockread defined\r\n#endif\r\nnative BAD_fblockread(File:handle, buffer[], size = sizeof (buffer)) = fblockread;\r\n\r\n#if FIX_fblockread\r\n\tstock FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))\r\n\t{\r\n\t\treturn handle && fblockread(handle, buffer, size);\r\n\t}\r\n\t\r\n\t#define _ALS_fblockread\r\n\t#define fblockread FIXES_fblockread\r\n#endif\r\n\r\n/* \r\n * FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)\r\n * \r\n * FIXES:\r\n *     fseek\r\n */\r\n\r\n#if defined _ALS_fseek\r\n\t#error _ALS_fseek defined\r\n#endif\r\nnative BAD_fseek(File:handle, position = 0, seek_whence:whence = seek_start) = fseek;\r\n\r\n#if FIX_fseek\r\n\tstock FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)\r\n\t{\r\n\t\treturn handle && fseek(handle, position, whence);\r\n\t}\r\n\t\r\n\t#define _ALS_fseek\r\n\t#define fseek FIXES_fseek\r\n#endif\r\n\r\n/* \r\n * FIXES_flength(File:handle)\r\n * \r\n * FIXES:\r\n *     flength\r\n */\r\n\r\n#if defined _ALS_flength\r\n\t#error _ALS_flength defined\r\n#endif\r\nnative BAD_flength(File:handle) = flength;\r\n\r\n#if FIX_flength\r\n\tstock FIXES_flength(File:handle)\r\n\t{\r\n\t\treturn handle && flength(handle);\r\n\t}\r\n\t\r\n\t#define _ALS_flength\r\n\t#define flength FIXES_flength\r\n#endif\r\n\r\n/* \r\n * FIXES_Kick(playerid)\r\n * \r\n * FIXES:\r\n *     Kick\r\n */\r\n\r\n#if defined _ALS_Kick\r\n\t#error _ALS_Kick defined\r\n#endif\r\nnative BAD_Kick(playerid) = Kick;\r\n\r\n#if FIX_Kick\r\n\tforward _FIXES_Kick(playerid);\r\n\t\r\n\tpublic _FIXES_Kick(playerid)\r\n\t{\r\n\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_KICKED,\r\n\t\tKick(playerid);\r\n\t}\r\n\t\r\n\t#if !FIXES_Single\r\n\t\tforward @FIXES_Kick(playerid);\r\n\t\t\r\n\t\tpublic @FIXES_Kick(playerid)\r\n\t\t{\r\n\t\t\tFIXES_BlockUpdate(playerid, true, 0);\r\n\t\t}\r\n\t#endif\r\n\t\r\n\tstock FIXES_Kick(playerid)\r\n\t{\r\n\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)\r\n\t\t{\r\n\t\t\t// Disable as much of the server as possible quickly.\r\n\t\t\treturn\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\tFIXES_BlockUpdate(playerid, true, 0),\r\n\t\t\t\t#else\r\n\t\t\t\t\tCallRemoteFunction(\"@FIXES_Kick\", \"i\", playerid),\r\n\t\t\t\t#endif\r\n\t\t\t\t\tTogglePlayerSpectating(playerid, true),\r\n\t\t\t\t\tTogglePlayerControllable(playerid, false),\r\n\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarKick, SetTimerEx(FIXES_gscKick, 1000, 0, FIXES_gscSpec@i, playerid)),\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_KICKED,\r\n\t\t\t\t\t1;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn Kick(playerid);\r\n\t\t}\r\n\t}\r\n\t\r\n\t#define _ALS_Kick\r\n\t#define Kick FIXES_Kick\r\n#endif\r\n\r\n/* \r\n * FIXES_IsPAttachedObjectSlotUsed(playerid, index)\r\n * \r\n * FIXES:\r\n *     IsPlayerAttachedObjectSlotUsed\r\n */\r\n\r\n#if defined _ALS_IsPAttachedObjSlotUsed\r\n\t#error _ALS_IsPAttachedObjSlotUsed defined\r\n#endif\r\nnative BAD_IsPlayerAttachedObjSlotUsed(playerid, index) = IsPlayerAttachedObjectSlotUsed;\r\n\r\n#if FIX_IsPlayerAttachedObjSlotUsed\r\n\tstock FIXES_IsPAttachedObjectSlotUsed(playerid, index)\r\n\t{\r\n\t\tif (_FIXES_IS_PLAYER_CONNECTED(playerid))\r\n\t\t{\r\n\t\t\treturn FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] & 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_IsPAttachedObjSlotUsed\r\n\t#define IsPlayerAttachedObjectSlotUsed FIXES_IsPAttachedObjectSlotUsed\r\n#endif\r\n\r\n/* \r\n * _FIXES_SetPlayerAttachedObject(slot, to)\r\n * \r\n * FIXES:\r\n *     IsPlayerAttachedObjectSlotUsed\r\n */\r\n\r\n#if (FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject) && !FIXES_Single\r\n\tforward _FIXES_SetPlayerAttachedObject(slot, to);\r\n\t\r\n\tpublic _FIXES_SetPlayerAttachedObject(slot, to)\r\n\t{\r\n\t\tFIXES_gsObjectSlots[slot] = to;\r\n\t}\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0)\r\n * \r\n * FIXES:\r\n *     IsPlayerAttachedObjectSlotUsed\r\n *     SetPlayerAttachedObject\r\n */\r\n\r\n#if defined _ALS_SetPlayerAttachedObject\r\n\t#error _ALS_SetPlayerAttachedObject defined\r\n#endif\r\nnative BAD_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0, materialcolor1 = 0, materialcolor2 = 0) = SetPlayerAttachedObject;\r\n\r\n#if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject\r\n\tstock FIXES_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0, materialcolor1 = 0, materialcolor2 = 0)\r\n\t{\r\n\t\tif (SetPlayerAttachedObject(playerid, index, modelid, bone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ, materialcolor1, materialcolor2))\r\n\t\t{\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] |= (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index);\r\n\t\t\t#else\r\n\t\t\t\tnew\r\n\t\t\t\t\tslot = playerid / _FIXES_ATTACHMENTS;\r\n\t\t\t\tCallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] | (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));\r\n\t\t\t#endif\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerAttachedObject\r\n\t#define SetPlayerAttachedObject FIXES_SetPlayerAttachedObject\r\n#endif\r\n\r\n/* \r\n * FIXES_RemovePlayerAttachedObj(playerid, index)\r\n * \r\n * FIXES:\r\n *     IsPlayerAttachedObjectSlotUsed\r\n */\r\n\r\n#if defined _ALS_RemovePlayerAttachedObject\r\n\t#error _ALS_RemovePlayerAttachedObject defined\r\n#endif\r\nnative BAD_RemovePlayerAttachedObject(playerid, index) = RemovePlayerAttachedObject;\r\n\r\n#if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject\r\n\tstock FIXES_RemovePlayerAttachedObj(playerid, index)\r\n\t{\r\n\t\tif (RemovePlayerAttachedObject(playerid, index))\r\n\t\t{\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tFIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index);\r\n\t\t\t#else\r\n\t\t\t\tnew\r\n\t\t\t\t\tslot = playerid / _FIXES_ATTACHMENTS;\r\n\t\t\t\tCallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] & ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));\r\n\t\t\t#endif\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_RemovePlayerAttachedObject\r\n\t#define RemovePlayerAttachedObject FIXES_RemovePlayerAttachedObj\r\n#endif\r\n\r\n/* \r\n * _FIXES_DetermineOrder()\r\n * \r\n * Figure out which the first filterscript to be called is so that it can do the\r\n * majority of the work.  More detail:  Several pieces of code for some fixes\r\n * rely on things like blocking \"OnPlayerUpdate\".  This should be done in the\r\n * first script in which \"OnPlayerUpdate\" is called only, so we need to find out\r\n * in advance which script will be called first (at least out of all the fixed\r\n * scripts).\r\n */\r\n\r\n#if !FIXES_Single\r\n\tpublic _FIXES_DetermineOrder()\r\n\t{\r\n\t\t// TODO: Graceful handoff.  I thought I was past all this rubbish!\r\n\t\tif (!_FIXES_gIsFilterscript)\r\n\t\t{\r\n\t\t\tif (existproperty(5, FIXES_gscNoGMProperty))\r\n\t\t\t{\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\t// Make sure certain data is synced with what the GM thinks it is.\r\n\t\t\t// =============================\r\n\t\t\t//  BEGIN: AllowInteriorWeapons \r\n\t\t\t// =============================\r\n\t\t\t#if FIX_AllowInteriorWeapons\r\n\t\t\t\tCallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, !(FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR));\r\n\t\t\t#endif\r\n\t\t\t// =============================\r\n\t\t\t//  END: AllowInteriorWeapons \r\n\t\t\t// =============================\r\n\t\t\t\r\n\t\t\t// ================================\r\n\t\t\t//  BEGIN: SetPlayerAttachedObject \r\n\t\t\t// ================================\r\n\t\t\t#if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject\r\n\t\t\t\tfor (new i = 0; i != _FIXES_ATTACHMENTS; ++i)\r\n\t\t\t\t{\r\n\t\t\t\t\tCallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, i, FIXES_gsObjectSlots[i]);\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t\t// ==============================\r\n\t\t\t//  END: SetPlayerAttachedObject \r\n\t\t\t// ==============================\r\n\t\t}\r\n\t\tif (existproperty(5, FIXES_gscOrderProperty))\r\n\t\t{\r\n\t\t\t// Either this is a Filter Script (1) and we don't want gamemodes\r\n\t\t\t// (1) or this isn't a filterscript (0) and we do want gamemodes\r\n\t\t\t// (0).  All other cases return here due to a logic mismatch.  This\r\n\t\t\t// is to rectify the difference in call orders between\r\n\t\t\t// \"CallRemoteFunction\" and normal callbacks.  Now DOESN'T end on\r\n\t\t\t// the second time round for filterscripts to correctly pass on the\r\n\t\t\t// data to GameModes.\r\n\t\t\tif (!existproperty(5, FIXES_gscNoGMProperty) && _FIXES_gIsFilterscript == bool:getproperty(5, FIXES_gscOrderProperty))\r\n\t\t\t{\r\n\t\t\t\t// The game mode is not in charge, which means we are checking\r\n\t\t\t\t// the filterscripts a second time and shouldn't be.\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\t// If this script was previously the owner, and we are not ending\r\n\t\t\t// the game mode (in which case discard all data), and if we are\r\n\t\t\t// only dealing with filterscripts or the gamemode is now the\r\n\t\t\t// master.\r\n\t\t\tif (FIXES_gsSettings & (e_FIXES_SETTINGS_IN_CHARGE | e_FIXES_SETTINGS_DROP_ALL_DATA) == e_FIXES_SETTINGS_IN_CHARGE)\r\n\t\t\t{\r\n\t\t\t\tFIXES_PRINTF(\"_FIXES_DetermineOrder: Was in charge\");\r\n\t\t\t\t// This script is currently in charge, but a new script has\r\n\t\t\t\t// usurped it!  Pass all relevant data over to the new script.\r\n\t\t\t\t// Also, this wasn't triggered by a game mode change (where we\r\n\t\t\t\t// just want to dump and reset all data).  There is no need to\r\n\t\t\t\t// reset the admin teleport data as that is always handled by\r\n\t\t\t\t// the Game Mode, so it will either be correct, or it will be\r\n\t\t\t\t// blank.\r\n\t\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;\r\n\t\t\t\t#if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable\r\n\t\t\t\t\t_FIXES_FOREACH(FIXES_gsPlayersIterator, i)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// =================\r\n\t\t\t\t\t\t//  BEGIN: GameText \r\n\t\t\t\t\t\t// =================\r\n\t\t\t\t\t\t#if FIX_GameText\r\n\t\t\t\t\t\t\tfor (new j = 0; j != FIXES_GT_STYLE_COUNT; ++j)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tPlayerTextDrawDestroy(i, FIXES_gsPGTStyle[i][j]);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t// =================\r\n\t\t\t\t\t\t//  END:   GameText \r\n\t\t\t\t\t\t// =================\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// =============================\r\n\t\t\t\t\t\t//  BEGIN: SetPlayerWorldBounds \r\n\t\t\t\t\t\t// =============================\r\n\t\t\t\t\t\t#if FIX_SetPlayerWorldBounds\r\n\t\t\t\t\t\t\t// I realised that you could have the GM in charge,\r\n\t\t\t\t\t\t\t// set their bounds, load an FS, remove their bounds\r\n\t\t\t\t\t\t\t// then unload the FS again and it would result in\r\n\t\t\t\t\t\t\t// the old GM setting of them HAVING bounds being\r\n\t\t\t\t\t\t\t// re-applied, so the check is removed.\r\n\t\t\t\t\t\t\tCallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@iffff, i, FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_UX], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_LX], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_UY], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_LY]);\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t// =============================\r\n\t\t\t\t\t\t//  END:   SetPlayerWorldBounds \r\n\t\t\t\t\t\t// =============================\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// =================================\r\n\t\t\t\t\t\t//  BEGIN: TogglePlayerControllable \r\n\t\t\t\t\t\t// =================================\r\n\t\t\t\t\t\t#if FIX_TogglePlayerControllable\r\n\t\t\t\t\t\t\tCallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, i, !(FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_UNCONTROLLABLE));\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t// =================================\r\n\t\t\t\t\t\t//  END:   TogglePlayerControllable \r\n\t\t\t\t\t\t// =================================\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// ===========================\r\n\t\t\t\t\t\t//  BEGIN: PutPlayerInVehicle \r\n\t\t\t\t\t\t// ===========================\r\n\t\t\t\t\t\t#if FIX_PutPlayerInVehicle\r\n\t\t\t\t\t\t\tif (FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_PUT_IN_VEHICLE)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tCallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iii, i, FIXES_gsVehicleSeatData[i] & 0x00FFFFFF, FIXES_gsVehicleSeatData[i] >>> 24);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t// ===========================\r\n\t\t\t\t\t\t//  END:   PutPlayerInVehicle \r\n\t\t\t\t\t\t// ===========================\r\n\t\t\t\t\t}\r\n\t\t\t\t#endif\r\n\t\t\t\t\r\n\t\t\t\t// =================\r\n\t\t\t\t//  BEGIN: GameText \r\n\t\t\t\t// =================\r\n\t\t\t\t#if FIX_GameText\r\n\t\t\t\t\t#if FIX_GameTextStyles\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[13]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[12]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[11]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[10]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[9]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[8]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[7]),\r\n\t\t\t\t\t#endif\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[6]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[5]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[4]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[3]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[2]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[1]),\r\n\t\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[0]);\r\n\t\t\t\t#endif\r\n\t\t\t\t// =================\r\n\t\t\t\t//  END:   GameText \r\n\t\t\t\t// =================\r\n\t\t\t\t\r\n\t\t\t\tFIXES_PRINTF(\"_FIXES_DetermineOrder: Not in charge\");\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tFIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;\r\n\t\t\t\tFIXES_PRINTF(\"_FIXES_DetermineOrder: Not in charge\");\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDING))\r\n\t\t{\r\n\t\t\tsetproperty(5, FIXES_gscOrderProperty, _FIXES_gIsFilterscript);\r\n\t\t\t#if FIXES_Debug\r\n\t\t\t\tif (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)\r\n\t\t\t\t{\r\n\t\t\t\t\tFIXES_PRINTF(\"_FIXES_DetermineOrder: Already in charge\");\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_IN_CHARGE;\r\n\t\t\tFIXES_PRINTF(\"_FIXES_DetermineOrder: Now in charge\");\r\n\t\t\t\r\n\t\t\t// =================\r\n\t\t\t//  BEGIN: GameText \r\n\t\t\t// =================\r\n\t\t\t#if FIX_GameText\r\n\t\t\t\t// Create all the relevant TextDraws.\r\n\t\t\t\t_FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)\r\n\t\t\t\t{\r\n\t\t\t\t\t_FIXES_CreateGameTextDraws(playerid);\r\n\t\t\t\t}\r\n\t\t\t\t_FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);\r\n\t\t\t#endif\r\n\t\t\t// =================\r\n\t\t\t//  END:   GameText \r\n\t\t\t// =================\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\telse if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDED))\r\n\t\t{\r\n\t\t\t// Only called when a filterscript that is currently master (and\r\n\t\t\t// thus called first by \"CallRemoteFunction\") ends.  This doesn't\r\n\t\t\t// get triggered when a gamemode is master, but that doesn't matter\r\n\t\t\t// because in that case all the textdraws are destroyed anyway.\r\n\t\t\t\r\n\t\t\t// =================\r\n\t\t\t//  BEGIN: GameText \r\n\t\t\t// =================\r\n\t\t\t#if FIX_GameText\r\n\t\t\t\t\t// Destroy all the relevant TextDraws.\r\n\t\t\t\t\t_FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t#if FIX_GameTextStyles\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),\r\n\t\t\t\t\t\t\tPlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);\r\n\t\t\t\t\t}\r\n\t\t\t\t#if FIX_GameTextStyles\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[13]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[12]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[11]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[10]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[9]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[8]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[7]),\r\n\t\t\t\t#endif\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[6]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[5]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[4]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[3]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[2]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[1]),\r\n\t\t\t\t\tTextDrawDestroy(FIXES_gsGTStyle[0]);\r\n\t\t\t#endif\r\n\t\t\t// =================\r\n\t\t\t//  END:   GameText \r\n\t\t\t// =================\r\n\t\t\t\r\n\t\t\t#if FIXES_Debug\r\n\t\t\t\tFIXES_PRINTF(\"_FIXES_DetermineOrder: Ending\");\r\n\t\t\t#endif\r\n\t\t\t\r\n\t\t\tFIXES_gsSettings |= e_FIXES_SETTINGS_ENDED;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n#endif\r\n\r\n/* \r\n * FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)\r\n * \r\n * FIXES:\r\n *     strins\r\n */\r\n\r\n#if defined _ALS_strins\r\n\t#error _ALS_strins defined\r\n#endif\r\nnative BAD_strins(string[], const substr[], pos, maxlength = sizeof string) = strins;\r\n\r\n#if FIX_strins\r\n\tstock FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)\r\n\t{\r\n\t\tif (string[0] > 255)\r\n\t\t{\r\n\t\t\tnew\r\n\t\t\t\tstrlength = strlen(string),\r\n\t\t\t\tsublength = strlen(substr),\r\n\t\t\t\tm4 = maxlength * 4;\r\n\t\t\t// Packed - format doesn't like these strings.\r\n\t\t\tif (strlength + sublength >= m4)\r\n\t\t\t{\r\n\t\t\t\tif (pos + sublength >= m4)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\tstring{pos} = '\\0',\r\n\t\t\t\t\t\t// Hopefully this doesn't ignore maxlength and does packed.\r\n\t\t\t\t\t\tstrcat(string, substr, maxlength);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t// pos + sublength is less than maxlength, so this sum MUST\r\n\t\t\t\t\t// be positive and gte than \"pos\", so there's no need for\r\n\t\t\t\t\t// additional checks.\r\n\t\t\t\t\tstring{maxlength - sublength - 1} = '\\0';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn strins(string, substr, pos, maxlength);\r\n\t\t}\r\n\t\telse if (substr[0] > 255)\r\n\t\t{\r\n\t\t\tnew\r\n\t\t\t\tstrlength = strlen(string),\r\n\t\t\t\tsublength = strlen(substr);\r\n\t\t\t// Packed - format doesn't like these strings.\r\n\t\t\tif (strlength + sublength >= maxlength)\r\n\t\t\t{\r\n\t\t\t\tif (pos + sublength >= maxlength)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\tstring[pos] = '\\0',\r\n\t\t\t\t\t\t// Hopefully this doesn't ignore maxlength and does packed.\r\n\t\t\t\t\t\tstrcat(string, substr, maxlength);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t// pos + sublength is less than maxlength, so this sum MUST\r\n\t\t\t\t\t// be positive and gte than \"pos\", so there's no need for\r\n\t\t\t\t\t// additional checks.\r\n\t\t\t\t\tstring[maxlength - sublength - 1] = '\\0';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn strins(string, substr, pos, maxlength);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn format(string, maxlength, \"%.*s%s%s\", pos, string, substr, string[pos]);\r\n\t\t}\r\n\t}\r\n\t\r\n\t#define _ALS_strins\r\n\t#define strins FIXES_strins\r\n#endif\r\n\r\n/* \r\n * _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync)\r\n * \r\n * FIXES:\r\n *     ApplyAnimation_2\r\n */\r\n\r\n#if FIX_ApplyAnimation_2\r\n\tforward _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync);\r\n\t\r\n\tpublic _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync)\r\n\t{\r\n\t\tApplyAnimation(playerid, FIXES_gscAnimLib[animlib], FIXES_gsClassAnimName[playerid], fDelta, loop, lockx, locky, freeze, time, forcesync),\r\n\t\tFIXES_gsAnimTimer[playerid] = 0;\r\n\t}\r\n#endif\r\n\r\n/* \r\n * FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)\r\n * \r\n * FIXES:\r\n *     ApplyAnimation\r\n *     ApplyAnimation_2\r\n */\r\n\r\n#if defined _ALS_ApplyAnimation\r\n\t#error _ALS_ApplyAnimation defined\r\n#endif\r\nnative BAD_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0) = ApplyAnimation;\r\n\r\n#if FIX_ApplyAnimation || FIX_ApplyAnimation_2\r\n\tstock FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)\r\n\t{\r\n\t\tnew\r\n\t\t\tdiff,\r\n\t\t\tidx = animlib[0] & ~0x20;\r\n\t\t// Uses a sort of optimised binary search.  The code first identifies the area in the array\r\n\t\t// in which libraries with this first letter are, then does a binary search using only that\r\n\t\t// subset of the array.  This used to use an N-ary search that just went linearly through\r\n\t\t// the identified subset of the array, and that was 5x faster than a simple linear loop over\r\n\t\t// the whole array.  This new version is 50% faster than even that was.  \"E\" has no\r\n\t\t// libraries, but we don't check for that explicitly as it would slow down the more common\r\n\t\t// code path - and it ends fairly quickly anyway as \"upper == lower\".\r\n\t\tif (_FIXES_IN_RANGE(idx, 'A', 'W' + 1))\r\n\t\t{\r\n\t\t\tnew\r\n\t\t\t\tupper = FIXES_gscAnimIndexes[idx - ('A' - 1)],\r\n\t\t\t\tlower = FIXES_gscAnimIndexes[idx - 'A'];\r\n\t\t\twhile (upper != lower)\r\n\t\t\t{\r\n\t\t\t\tidx = (upper - lower) / 2 + lower;\r\n\t\t\t\tif ((diff = strcmp(FIXES_gscAnimLib[idx], animlib, true)))\r\n\t\t\t\t{\r\n\t\t\t\t\tif (diff > 0) upper = idx;\r\n\t\t\t\t\telse lower = idx + 1;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t// If we hit the \"else\" branch, we have found the correct\r\n\t\t\t\t\t// animation library from the n-ary search.\r\n\t\t\t\t\t#if FIX_ApplyAnimation_2\r\n\t\t\t\t\t\tif (FIXES_gsAnimTimer[playerid])\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tKillTimer(FIXES_gsAnimTimer[playerid]),\r\n\t\t\t\t\t\t\tFIXES_gsAnimTimer[playerid] = 0;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (FIXES_gsPlayerAnimLibs[playerid][idx >>> 5] & (1 << (idx & 0x1F)))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tFIXES_gsPlayerAnimLibs[playerid][idx >>> 5] &= ~(1 << (idx & 0x1F)),\r\n\t\t\t\t\t\t\tFIXES_gsClassAnimName[playerid][0] = '\\0',\r\n\t\t\t\t\t\t\tstrcat(FIXES_gsClassAnimName[playerid], animname),\r\n\t\t\t\t\t\t\tFIXES_gsAnimTimer[playerid] = SetTimerEx(\"_FIXES_ApplyAnimation\", 350, false, \"ddfdddddd\", playerid, idx, fDelta, loop, lockx, locky, freeze, time, forcesync);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t#endif\r\n\t\t\t\t\t\treturn ApplyAnimation(playerid, animlib, animname, fDelta, loop, lockx, locky, freeze, time, forcesync);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_ApplyAnimation\r\n\t#define ApplyAnimation FIXES_ApplyAnimation\r\n#endif\r\n\r\n/* \r\n * FIXES_random(max)\r\n * \r\n * FIXES:\r\n *     random\r\n */\r\n\r\n#if defined _ALS_random\r\n\t#error _ALS_random defined\r\n#endif\r\nnative BAD_random(max) = random;\r\n\r\n#if FIX_random\r\n\tstock FIXES_random(max)\r\n\t{\r\n\t\tif (max < 0)\r\n\t\t{\r\n\t\t\treturn -random(-max);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn random(max);\r\n\t\t}\r\n\t}\r\n\t\r\n\t#define _ALS_random\r\n\t#define random FIXES_random\r\n#endif\r\n\r\n/* \r\n * _FIXES_SetCamera\r\n * \r\n * FIXES:\r\n *     SetPlayerCamera\r\n */\r\n\r\n#if FIX_SetPlayerCamera\r\n\tforward _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z);\r\n\r\n\tpublic _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z)\r\n\t{\r\n\t\tif (type)\r\n\t\t{\r\n\t\t\tSetPlayerCameraPos(playerid, x, y, z);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tSetPlayerCameraLookAt(playerid, x, y, z);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)\r\n * \r\n * FIXES:\r\n *     SetPlayerCamera\r\n */\r\n\r\n#if defined _ALS_SetPlayerCameraPos\r\n\t#error _ALS_SetPlayerCameraPos defined\r\n#endif\r\nnative BAD_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraPos;\r\n\r\n#if FIX_SetPlayerCamera\r\n\tstock FIXES_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t{\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)\r\n\t\t\t#else\r\n\t\t\t\tif (GetPVarInt(playerid, FIXES_pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)\r\n\t\t\t#endif\r\n\t\t\t\t{\r\n\t\t\t\t\tSetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 1, x, y, z);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tSetPlayerCameraPos(playerid, x, y, z);\r\n\t\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerCameraPos\r\n\t#define SetPlayerCameraPos FIXES_SetPlayerCameraPos\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)\r\n * \r\n * FIXES:\r\n *     SetPlayerCamera\r\n */\r\n\r\n#if defined _ALS_SetPlayerCameraLookAt\r\n\t#error _ALS_SetPlayerCameraLookAt defined\r\n#endif\r\nnative BAD_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraLookAt;\r\n\r\n#if FIX_SetPlayerCamera\r\n\tstock FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t{\r\n\t\t\t#if FIXES_Single\r\n\t\t\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)\r\n\t\t\t#else\r\n\t\t\t\tif (GetPVarInt(playerid, FIXES_pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)\r\n\t\t\t#endif\r\n\t\t\t\t{\r\n\t\t\t\t\tSetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 0, x, y, z);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tSetPlayerCameraLookAt(playerid, x, y, z);\r\n\t\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerCameraLookAt\r\n\t#define SetPlayerCameraLookAt FIXES_SetPlayerCameraLookAt\r\n#endif\r\n\r\n/* \r\n * FIXES_TogglePlayerSpectating(playerid, toggle)\r\n * \r\n * FIXES:\r\n *     SetPlayerCamera\r\n */\r\n\r\n#if defined _ALS_TogglePlayerSpectating\r\n\t#error _ALS_TogglePlayerSpectating defined\r\n#endif\r\nnative BAD_TogglePlayerSpectating(playerid, toggle) = TogglePlayerSpectating;\r\n\r\n#if FIX_SetPlayerCamera\r\n\tstock FIXES_TogglePlayerSpectating(playerid, toggle)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t{\r\n\t\t\tif (toggle)\r\n\t\t\t{\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_SPECTATING;\r\n\t\t\t\t#else\r\n\t\t\t\t\tSetPVarInt(playerid, FIXES_pvarPlayerSpectate, 1);\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t#if FIXES_Single\r\n\t\t\t\t\tFIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_SPECTATING;\r\n\t\t\t\t#else\r\n\t\t\t\t\tDeletePVar(playerid, FIXES_pvarPlayerSpectate);\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t\treturn TogglePlayerSpectating(playerid, toggle);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_TogglePlayerSpectating\r\n\t#define TogglePlayerSpectating FIXES_TogglePlayerSpectating\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerTime(playerid, hour, minute)\r\n * \r\n * FIXES:\r\n *     SetPlayerTime\r\n */\r\n\r\n#if defined _ALS_SetPlayerTime\r\n\t#error _ALS_SetPlayerTime defined\r\n#endif\r\nnative BAD_SetPlayerTime(playerid, hour, minute) = SetPlayerTime;\r\n\r\n#if FIX_SetPlayerTime\r\n\tforward _FIXES_SetTime(playerid, hour, minute);\r\n\t\r\n\tpublic _FIXES_SetTime(playerid, hour, minute)\r\n\t{\r\n\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)\r\n\t\t{\r\n\t\t\treturn SetPlayerTime(playerid, hour, minute);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\tstock FIXES_SetPlayerTime(playerid, hour, minute)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t{\r\n\t\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)\r\n\t\t\t{\r\n\t\t\t\treturn SetTimerEx(FIXES_gscSetTime, 250, 0, FIXES_gscSpec@iii, playerid, hour, minute);\r\n\t\t\t}\r\n\t\t\treturn SetPlayerTime(playerid, hour, minute);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerTime\r\n\t#define SetPlayerTime FIXES_SetPlayerTime\r\n#endif\r\n\r\n/* \r\n * FIXES_SetPlayerColor(playerid, color)\r\n * \r\n * FIXES:\r\n *     SetPlayerColor\r\n */\r\n\r\n#if defined _ALS_SetPlayerColor\r\n\t#error _ALS_SetPlayerColor defined\r\n#endif\r\nnative BAD_SetPlayerColor(playerid, color) = SetPlayerColor;\r\n\r\n#if FIX_SetPlayerColour\r\n\tforward _FIXES_SetColor(playerid, color);\r\n\t\r\n\tpublic _FIXES_SetColor(playerid, color)\r\n\t{\r\n\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)\r\n\t\t{\r\n\t\t\treturn SetPlayerColor(playerid, color);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\tstock FIXES_SetPlayerColor(playerid, color)\r\n\t{\r\n\t\tif (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))\r\n\t\t{\r\n\t\t\tif (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)\r\n\t\t\t{\r\n\t\t\t\treturn SetTimerEx(FIXES_gscSetColor, 300, 0, FIXES_gscSpec@ii, playerid, color);\r\n\t\t\t}\r\n\t\t\treturn SetPlayerColor(playerid, color);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_SetPlayerColor\r\n\t#define SetPlayerColor FIXES_SetPlayerColor\r\n#endif\r\n\r\n/* \r\n * FIXES_GetPlayerWeaponData(playerid, slot, &weapons, &ammo)\r\n * \r\n * FIXES:\r\n *     GetPlayerWeaponData\r\n */\r\n\r\n#if defined _ALS_GetPlayerWeaponData\r\n\t#error _ALS_GetPlayerWeaponData defined\r\n#endif\r\nnative BAD_GetPlayerWeaponData(playerid, slot, &weapons, &ammo) = GetPlayerWeaponData;\r\n\r\n#if FIX_GetPlayerWeaponData\r\n\tstock FIXES_GetPlayerWeaponData(playerid, slot, &weapons, &ammo)\r\n\t{\r\n\t\t// This reuses the \"slot\" variable so we don't have to declare a new one\r\n\t\t// and can put all the code in a single statement.\r\n\t\treturn\r\n\t\t\tslot = GetPlayerWeaponData(playerid, slot, weapons, ammo),\r\n\t\t\tweapons = ammo ? weapons : 0,\r\n\t\t\tslot;\r\n\t}\r\n\t\r\n\t#define _ALS_GetPlayerWeaponData\r\n\t#define GetPlayerWeaponData FIXES_GetPlayerWeaponData\r\n#endif\r\n\r\n/* \r\n * FIXES_sleep(const time)\r\n * \r\n * FIXES:\r\n *     sleep\r\n */\r\n\r\n// Uses a little trick to consume part of the line and thus not match\r\n// our hooked version.\r\n#if defined _ALS_sleep\r\n\t#error _ALS_sleep defined\r\n#endif\r\n#define BAD_sleep%0\\n%9 sleep%0\r\n\r\n#if FIX_sleep\r\n\tstock FIXES_sleep(ms)\r\n\t{\r\n\t\t// Call a native function that does very little, but saves the current\r\n\t\t// heap pointer.  Then return to save the accurate stack pointer.\r\n\t\treturn heapspace(), ms;\r\n\t}\r\n\t\r\n\t#define _ALS_sleep\r\n\t\r\n\t#define sleep%0\\n%9 sleep FIXES_sleep(%0)\r\n\t// This fixes another BIZZARE bug.  Just doing:\r\n\t//\r\n\t//  #define FIXES_sleep(%0;) FIXES_sleep(%0)\r\n\t//\r\n\t// Results in:\r\n\t//\r\n\t//  FIXES_sleep(n));\r\n\t//\r\n\t// Which clearly it shouldn't.  I've stepped through the compilation and that\r\n\t// extra bracket comes from nowhere!\r\n\t#define FIXES_sleep(%0;) FIXES_sleep _FIXES_SLEEP_BRACKET %0);\r\n\t#define _FIXES_SLEEP_BRACKET (\r\n#endif\r\n\r\n/* \r\n * _FIXES_AddInternal(array[], value, size)\r\n * \r\n * Add something to an internal linked list.\r\n */\r\n\r\nstatic stock _FIXES_AddInternal(array[], value, size)\r\n{\r\n\tif (array[value] <= value)\r\n\t{\r\n\t\tnew\r\n\t\t\tlast = size,\r\n\t\t\tnext = array[last];\r\n\t\twhile (next < value)\r\n\t\t{\r\n\t\t\tlast = next,\r\n\t\t\tnext = array[last];\r\n\t\t}\r\n\t\tarray[next - 1] = value + 1,\r\n\t\tarray[(value - 1) % (size + 1)] = (last + 1) % (size + 1),\r\n\t\tarray[last] = value,\r\n\t\tarray[value] = next;\r\n\t}\r\n}\r\n\r\n/* \r\n * _FIXES_RemoveInternal(array[], value, size)\r\n * \r\n * Remove something from an internal linked list.\r\n */\r\n\r\nstatic stock _FIXES_RemoveInternal(array[], value, size)\r\n{\r\n\tif (array[value] > value)\r\n\t{\r\n\t\tstatic\r\n\t\t\tlast;\r\n\t\t// Adjustment for easier \"mod\"ing.\r\n\t\t++size,\r\n\t\tlast = (array[(value - 1) % size] - 1) % size,\r\n\t\t// Store the reverse value here as well as in the previous slot.\r\n\t\tarray[value] =\r\n\t\t\t// Copy the next value to the last value.\r\n\t\t\tarray[(array[last] = array[value]) - 1] =\r\n\t\t\t\t// Set the reverse iterator value.\r\n\t\t\t\t(last + 1) % size;\r\n\t}\r\n}\r\n\r\n#undef _FIXES_CEILDIV\r\n#undef _FIXES_INFINITY\r\n#undef _FIXES_N_INFINITY\r\n#undef _FIXES_ATTACHMENTS\r\n#undef _FIXES_FOREACH\r\n#undef _FIXES_IS_UNSET\r\n#undef _FIXES_IS_IN_CHARGE\r\n#undef _FIXES_IN_RANGE\r\n#undef _FIXES_NO_RANGE\r\n#undef _FIXES_FORWARD\r\n#undef _FIXES_IS_PLAYER_CONNECTED\r\n#undef FIXES_PRINTF\r\n\r\n#endinput\r\n\r\n// Fix inclusion template.\r\n\r\n#if !defined FIX_NameOfFixHere\r\n\t#define FIX_NameOfFixHere            (1)\r\n#elseif _FIXES_IS_UNSET(FIX_NameOfFixHere)\r\n\t#undef FIX_NameOfFixHere\r\n\t#define FIX_NameOfFixHere            (2)\r\n#endif\r\n\r\n// Fix function template.\r\n\r\n/* \r\n * FIXES_NameOfFixHere\r\n * \r\n * FIXES:\r\n *     NameOfFixHere\r\n */\r\n\r\n#if defined _ALS_NameOfFixHere\r\n\t#error _ALS_NameOfFixHere defined\r\n#endif\r\nnative BAD_NameOfFixHere(params) = NameOfFixHere;\r\n\r\n#if FIX_NameOfFixHere\r\n\tstock FIXES_NameOfFixHere(params)\r\n\t{\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\t#define _ALS_NameOfFixHere\r\n\t#define NameOfFixHere FIXES_NameOfFixHere\r\n#endif\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/PAWN/timertest.pwn",
    "content": "#include <a_samp>\r\n\r\nforward OneSecTimer();\r\n\r\nnew lasttick = 0;\r\n\r\nmain()\r\n{\r\n\tprint(\"\\n----------------------------------\");\r\n\tprint(\"  This is a blank GameModeScript\");\r\n\tprint(\"----------------------------------\\n\");\r\n}\r\n\r\npublic OnGameModeInit()\r\n{\r\n\t// Set timer of 1 second.\r\n\tSetTimer(\"OneSecTimer\", 1000, 1);\r\n\tprint(\"GameModeInit()\");\r\n\tSetGameModeText(\"Timer Test\");\r\n\tAddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);\r\n\treturn 1;\r\n}\r\n\r\npublic OneSecTimer() {\r\n\r\n\tif(lasttick == 0) {\r\n     \tlasttick = GetTickCount();\r\n\t\treturn;\r\n\t}\r\n\tnew sText[256];\r\n\tformat(sText,sizeof(sText),\"GetTickCountOffset = %d\",GetTickCount() - lasttick);\r\n\tprint(sText);\r\n\tSendClientMessageToAll(0xFF0000, sText);\r\n\tlasttick = GetTickCount();\r\n}\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console;\n\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\ArgvInput;\nuse Symfony\\Component\\Console\\Input\\ArrayInput;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Console\\Output\\Output;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutput;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Command\\HelpCommand;\nuse Symfony\\Component\\Console\\Command\\ListCommand;\nuse Symfony\\Component\\Console\\Helper\\HelperSet;\nuse Symfony\\Component\\Console\\Helper\\FormatterHelper;\nuse Symfony\\Component\\Console\\Helper\\DialogHelper;\n\n/**\n * An Application is the container for a collection of commands.\n *\n * It is the main entry point of a Console application.\n *\n * This class is optimized for a standard CLI environment.\n *\n * Usage:\n *\n *     $app = new Application('myapp', '1.0 (stable)');\n *     $app->add(new SimpleCommand());\n *     $app->run();\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @api\n */\nclass Application\n{\n    private $commands;\n    private $wantHelps = false;\n    private $runningCommand;\n    private $name;\n    private $version;\n    private $catchExceptions;\n    private $autoExit;\n    private $definition;\n    private $helperSet;\n\n    /**\n     * Constructor.\n     *\n     * @param string $name    The name of the application\n     * @param string $version The version of the application\n     *\n     * @api\n     */\n    public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN')\n    {\n        $this->name = $name;\n        $this->version = $version;\n        $this->catchExceptions = true;\n        $this->autoExit = true;\n        $this->commands = array();\n        $this->helperSet = $this->getDefaultHelperSet();\n        $this->definition = $this->getDefaultInputDefinition();\n\n        foreach ($this->getDefaultCommands() as $command) {\n            $this->add($command);\n        }\n    }\n\n    /**\n     * Runs the current application.\n     *\n     * @param InputInterface  $input  An Input instance\n     * @param OutputInterface $output An Output instance\n     *\n     * @return integer 0 if everything went fine, or an error code\n     *\n     * @throws \\Exception When doRun returns Exception\n     *\n     * @api\n     */\n    public function run(InputInterface $input = null, OutputInterface $output = null)\n    {\n        if (null === $input) {\n            $input = new ArgvInput();\n        }\n\n        if (null === $output) {\n            $output = new ConsoleOutput();\n        }\n\n        try {\n            $statusCode = $this->doRun($input, $output);\n        } catch (\\Exception $e) {\n            if (!$this->catchExceptions) {\n                throw $e;\n            }\n\n            if ($output instanceof ConsoleOutputInterface) {\n                $this->renderException($e, $output->getErrorOutput());\n            } else {\n                $this->renderException($e, $output);\n            }\n            $statusCode = $e->getCode();\n\n            $statusCode = is_numeric($statusCode) && $statusCode ? $statusCode : 1;\n        }\n\n        if ($this->autoExit) {\n            if ($statusCode > 255) {\n                $statusCode = 255;\n            }\n            // @codeCoverageIgnoreStart\n            exit($statusCode);\n            // @codeCoverageIgnoreEnd\n        }\n\n        return $statusCode;\n    }\n\n    /**\n     * Runs the current application.\n     *\n     * @param InputInterface  $input  An Input instance\n     * @param OutputInterface $output An Output instance\n     *\n     * @return integer 0 if everything went fine, or an error code\n     */\n    public function doRun(InputInterface $input, OutputInterface $output)\n    {\n        $name = $this->getCommandName($input);\n\n        if (true === $input->hasParameterOption(array('--ansi'))) {\n            $output->setDecorated(true);\n        } elseif (true === $input->hasParameterOption(array('--no-ansi'))) {\n            $output->setDecorated(false);\n        }\n\n        if (true === $input->hasParameterOption(array('--help', '-h'))) {\n            if (!$name) {\n                $name = 'help';\n                $input = new ArrayInput(array('command' => 'help'));\n            } else {\n                $this->wantHelps = true;\n            }\n        }\n\n        if (true === $input->hasParameterOption(array('--no-interaction', '-n'))) {\n            $input->setInteractive(false);\n        }\n\n        if (function_exists('posix_isatty') && $this->getHelperSet()->has('dialog')) {\n            $inputStream = $this->getHelperSet()->get('dialog')->getInputStream();\n            if (!posix_isatty($inputStream)) {\n                $input->setInteractive(false);\n            }\n        }\n\n        if (true === $input->hasParameterOption(array('--quiet', '-q'))) {\n            $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);\n        } elseif (true === $input->hasParameterOption(array('--verbose', '-v'))) {\n            $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);\n        }\n\n        if (true === $input->hasParameterOption(array('--version', '-V'))) {\n            $output->writeln($this->getLongVersion());\n\n            return 0;\n        }\n\n        if (!$name) {\n            $name = 'list';\n            $input = new ArrayInput(array('command' => 'list'));\n        }\n\n        // the command name MUST be the first element of the input\n        $command = $this->find($name);\n\n        $this->runningCommand = $command;\n        $statusCode = $command->run($input, $output);\n        $this->runningCommand = null;\n\n        return is_numeric($statusCode) ? $statusCode : 0;\n    }\n\n    /**\n     * Set a helper set to be used with the command.\n     *\n     * @param HelperSet $helperSet The helper set\n     *\n     * @api\n     */\n    public function setHelperSet(HelperSet $helperSet)\n    {\n        $this->helperSet = $helperSet;\n    }\n\n    /**\n     * Get the helper set associated with the command.\n     *\n     * @return HelperSet The HelperSet instance associated with this command\n     *\n     * @api\n     */\n    public function getHelperSet()\n    {\n        return $this->helperSet;\n    }\n\n    /**\n     * Gets the InputDefinition related to this Application.\n     *\n     * @return InputDefinition The InputDefinition instance\n     */\n    public function getDefinition()\n    {\n        return $this->definition;\n    }\n\n    /**\n     * Gets the help message.\n     *\n     * @return string A help message.\n     */\n    public function getHelp()\n    {\n        $messages = array(\n            $this->getLongVersion(),\n            '',\n            '<comment>Usage:</comment>',\n            sprintf(\"  [options] command [arguments]\\n\"),\n            '<comment>Options:</comment>',\n        );\n\n        foreach ($this->getDefinition()->getOptions() as $option) {\n            $messages[] = sprintf('  %-29s %s %s',\n                '<info>--'.$option->getName().'</info>',\n                $option->getShortcut() ? '<info>-'.$option->getShortcut().'</info>' : '  ',\n                $option->getDescription()\n            );\n        }\n\n        return implode(PHP_EOL, $messages);\n    }\n\n    /**\n     * Sets whether to catch exceptions or not during commands execution.\n     *\n     * @param Boolean $boolean Whether to catch exceptions or not during commands execution\n     *\n     * @api\n     */\n    public function setCatchExceptions($boolean)\n    {\n        $this->catchExceptions = (Boolean) $boolean;\n    }\n\n    /**\n     * Sets whether to automatically exit after a command execution or not.\n     *\n     * @param Boolean $boolean Whether to automatically exit after a command execution or not\n     *\n     * @api\n     */\n    public function setAutoExit($boolean)\n    {\n        $this->autoExit = (Boolean) $boolean;\n    }\n\n    /**\n     * Gets the name of the application.\n     *\n     * @return string The application name\n     *\n     * @api\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * Sets the application name.\n     *\n     * @param string $name The application name\n     *\n     * @api\n     */\n    public function setName($name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * Gets the application version.\n     *\n     * @return string The application version\n     *\n     * @api\n     */\n    public function getVersion()\n    {\n        return $this->version;\n    }\n\n    /**\n     * Sets the application version.\n     *\n     * @param string $version The application version\n     *\n     * @api\n     */\n    public function setVersion($version)\n    {\n        $this->version = $version;\n    }\n\n    /**\n     * Returns the long version of the application.\n     *\n     * @return string The long application version\n     *\n     * @api\n     */\n    public function getLongVersion()\n    {\n        if ('UNKNOWN' !== $this->getName() && 'UNKNOWN' !== $this->getVersion()) {\n            return sprintf('<info>%s</info> version <comment>%s</comment>', $this->getName(), $this->getVersion());\n        }\n\n        return '<info>Console Tool</info>';\n    }\n\n    /**\n     * Registers a new command.\n     *\n     * @param string $name The command name\n     *\n     * @return Command The newly created command\n     *\n     * @api\n     */\n    public function register($name)\n    {\n        return $this->add(new Command($name));\n    }\n\n    /**\n     * Adds an array of command objects.\n     *\n     * @param Command[] $commands An array of commands\n     *\n     * @api\n     */\n    public function addCommands(array $commands)\n    {\n        foreach ($commands as $command) {\n            $this->add($command);\n        }\n    }\n\n    /**\n     * Adds a command object.\n     *\n     * If a command with the same name already exists, it will be overridden.\n     *\n     * @param Command $command A Command object\n     *\n     * @return Command The registered command\n     *\n     * @api\n     */\n    public function add(Command $command)\n    {\n        $command->setApplication($this);\n\n        if (!$command->isEnabled()) {\n            $command->setApplication(null);\n\n            return;\n        }\n\n        $this->commands[$command->getName()] = $command;\n\n        foreach ($command->getAliases() as $alias) {\n            $this->commands[$alias] = $command;\n        }\n\n        return $command;\n    }\n\n    /**\n     * Returns a registered command by name or alias.\n     *\n     * @param string $name The command name or alias\n     *\n     * @return Command A Command object\n     *\n     * @throws \\InvalidArgumentException When command name given does not exist\n     *\n     * @api\n     */\n    public function get($name)\n    {\n        if (!isset($this->commands[$name])) {\n            throw new \\InvalidArgumentException(sprintf('The command \"%s\" does not exist.', $name));\n        }\n\n        $command = $this->commands[$name];\n\n        if ($this->wantHelps) {\n            $this->wantHelps = false;\n\n            $helpCommand = $this->get('help');\n            $helpCommand->setCommand($command);\n\n            return $helpCommand;\n        }\n\n        return $command;\n    }\n\n    /**\n     * Returns true if the command exists, false otherwise.\n     *\n     * @param string $name The command name or alias\n     *\n     * @return Boolean true if the command exists, false otherwise\n     *\n     * @api\n     */\n    public function has($name)\n    {\n        return isset($this->commands[$name]);\n    }\n\n    /**\n     * Returns an array of all unique namespaces used by currently registered commands.\n     *\n     * It does not returns the global namespace which always exists.\n     *\n     * @return array An array of namespaces\n     */\n    public function getNamespaces()\n    {\n        $namespaces = array();\n        foreach ($this->commands as $command) {\n            $namespaces[] = $this->extractNamespace($command->getName());\n\n            foreach ($command->getAliases() as $alias) {\n                $namespaces[] = $this->extractNamespace($alias);\n            }\n        }\n\n        return array_values(array_unique(array_filter($namespaces)));\n    }\n\n    /**\n     * Finds a registered namespace by a name or an abbreviation.\n     *\n     * @param string $namespace A namespace or abbreviation to search for\n     *\n     * @return string A registered namespace\n     *\n     * @throws \\InvalidArgumentException When namespace is incorrect or ambiguous\n     */\n    public function findNamespace($namespace)\n    {\n        $allNamespaces = array();\n        foreach ($this->getNamespaces() as $n) {\n            $allNamespaces[$n] = explode(':', $n);\n        }\n\n        $found = array();\n        foreach (explode(':', $namespace) as $i => $part) {\n            $abbrevs = static::getAbbreviations(array_unique(array_values(array_filter(array_map(function ($p) use ($i) { return isset($p[$i]) ? $p[$i] : ''; }, $allNamespaces)))));\n\n            if (!isset($abbrevs[$part])) {\n                $message = sprintf('There are no commands defined in the \"%s\" namespace.', $namespace);\n\n                if (1 <= $i) {\n                    $part = implode(':', $found).':'.$part;\n                }\n\n                if ($alternatives = $this->findAlternativeNamespace($part, $abbrevs)) {\n                    $message .= \"\\n\\nDid you mean one of these?\\n    \";\n                    $message .= implode(\"\\n    \", $alternatives);\n                }\n\n                throw new \\InvalidArgumentException($message);\n            }\n\n            if (count($abbrevs[$part]) > 1) {\n                throw new \\InvalidArgumentException(sprintf('The namespace \"%s\" is ambiguous (%s).', $namespace, $this->getAbbreviationSuggestions($abbrevs[$part])));\n            }\n\n            $found[] = $abbrevs[$part][0];\n        }\n\n        return implode(':', $found);\n    }\n\n    /**\n     * Finds a command by name or alias.\n     *\n     * Contrary to get, this command tries to find the best\n     * match if you give it an abbreviation of a name or alias.\n     *\n     * @param string $name A command name or a command alias\n     *\n     * @return Command A Command instance\n     *\n     * @throws \\InvalidArgumentException When command name is incorrect or ambiguous\n     *\n     * @api\n     */\n    public function find($name)\n    {\n        // namespace\n        $namespace = '';\n        $searchName = $name;\n        if (false !== $pos = strrpos($name, ':')) {\n            $namespace = $this->findNamespace(substr($name, 0, $pos));\n            $searchName = $namespace.substr($name, $pos);\n        }\n\n        // name\n        $commands = array();\n        foreach ($this->commands as $command) {\n            if ($this->extractNamespace($command->getName()) == $namespace) {\n                $commands[] = $command->getName();\n            }\n        }\n\n        $abbrevs = static::getAbbreviations(array_unique($commands));\n        if (isset($abbrevs[$searchName]) && 1 == count($abbrevs[$searchName])) {\n            return $this->get($abbrevs[$searchName][0]);\n        }\n\n        if (isset($abbrevs[$searchName]) && count($abbrevs[$searchName]) > 1) {\n            $suggestions = $this->getAbbreviationSuggestions($abbrevs[$searchName]);\n\n            throw new \\InvalidArgumentException(sprintf('Command \"%s\" is ambiguous (%s).', $name, $suggestions));\n        }\n\n        // aliases\n        $aliases = array();\n        foreach ($this->commands as $command) {\n            foreach ($command->getAliases() as $alias) {\n                if ($this->extractNamespace($alias) == $namespace) {\n                    $aliases[] = $alias;\n                }\n            }\n        }\n\n        $aliases = static::getAbbreviations(array_unique($aliases));\n        if (!isset($aliases[$searchName])) {\n            $message = sprintf('Command \"%s\" is not defined.', $name);\n\n            if ($alternatives = $this->findAlternativeCommands($searchName, $abbrevs)) {\n                $message .= \"\\n\\nDid you mean one of these?\\n    \";\n                $message .= implode(\"\\n    \", $alternatives);\n            }\n\n            throw new \\InvalidArgumentException($message);\n        }\n\n        if (count($aliases[$searchName]) > 1) {\n            throw new \\InvalidArgumentException(sprintf('Command \"%s\" is ambiguous (%s).', $name, $this->getAbbreviationSuggestions($aliases[$searchName])));\n        }\n\n        return $this->get($aliases[$searchName][0]);\n    }\n\n    /**\n     * Gets the commands (registered in the given namespace if provided).\n     *\n     * The array keys are the full names and the values the command instances.\n     *\n     * @param string $namespace A namespace name\n     *\n     * @return array An array of Command instances\n     *\n     * @api\n     */\n    public function all($namespace = null)\n    {\n        if (null === $namespace) {\n            return $this->commands;\n        }\n\n        $commands = array();\n        foreach ($this->commands as $name => $command) {\n            if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) {\n                $commands[$name] = $command;\n            }\n        }\n\n        return $commands;\n    }\n\n    /**\n     * Returns an array of possible abbreviations given a set of names.\n     *\n     * @param array $names An array of names\n     *\n     * @return array An array of abbreviations\n     */\n    static public function getAbbreviations($names)\n    {\n        $abbrevs = array();\n        foreach ($names as $name) {\n            for ($len = strlen($name) - 1; $len > 0; --$len) {\n                $abbrev = substr($name, 0, $len);\n                if (!isset($abbrevs[$abbrev])) {\n                    $abbrevs[$abbrev] = array($name);\n                } else {\n                    $abbrevs[$abbrev][] = $name;\n                }\n            }\n        }\n\n        // Non-abbreviations always get entered, even if they aren't unique\n        foreach ($names as $name) {\n            $abbrevs[$name] = array($name);\n        }\n\n        return $abbrevs;\n    }\n\n    /**\n     * Returns a text representation of the Application.\n     *\n     * @param string  $namespace An optional namespace name\n     * @param boolean $raw       Whether to return raw command list\n     *\n     * @return string A string representing the Application\n     */\n    public function asText($namespace = null, $raw = false)\n    {\n        $commands = $namespace ? $this->all($this->findNamespace($namespace)) : $this->commands;\n\n        $width = 0;\n        foreach ($commands as $command) {\n            $width = strlen($command->getName()) > $width ? strlen($command->getName()) : $width;\n        }\n        $width += 2;\n\n        if ($raw) {\n            $messages = array();\n            foreach ($this->sortCommands($commands) as $space => $commands) {\n                foreach ($commands as $name => $command) {\n                    $messages[] = sprintf(\"%-${width}s %s\", $name, $command->getDescription());\n                }\n            }\n\n            return implode(PHP_EOL, $messages);\n        }\n\n        $messages = array($this->getHelp(), '');\n        if ($namespace) {\n            $messages[] = sprintf(\"<comment>Available commands for the \\\"%s\\\" namespace:</comment>\", $namespace);\n        } else {\n            $messages[] = '<comment>Available commands:</comment>';\n        }\n\n        // add commands by namespace\n        foreach ($this->sortCommands($commands) as $space => $commands) {\n            if (!$namespace && '_global' !== $space) {\n                $messages[] = '<comment>'.$space.'</comment>';\n            }\n\n            foreach ($commands as $name => $command) {\n                $messages[] = sprintf(\"  <info>%-${width}s</info> %s\", $name, $command->getDescription());\n            }\n        }\n\n        return implode(PHP_EOL, $messages);\n    }\n\n    /**\n     * Returns an XML representation of the Application.\n     *\n     * @param string  $namespace An optional namespace name\n     * @param Boolean $asDom     Whether to return a DOM or an XML string\n     *\n     * @return string|DOMDocument An XML string representing the Application\n     */\n    public function asXml($namespace = null, $asDom = false)\n    {\n        $commands = $namespace ? $this->all($this->findNamespace($namespace)) : $this->commands;\n\n        $dom = new \\DOMDocument('1.0', 'UTF-8');\n        $dom->formatOutput = true;\n        $dom->appendChild($xml = $dom->createElement('symfony'));\n\n        $xml->appendChild($commandsXML = $dom->createElement('commands'));\n\n        if ($namespace) {\n            $commandsXML->setAttribute('namespace', $namespace);\n        } else {\n            $namespacesXML = $dom->createElement('namespaces');\n            $xml->appendChild($namespacesXML);\n        }\n\n        // add commands by namespace\n        foreach ($this->sortCommands($commands) as $space => $commands) {\n            if (!$namespace) {\n                $namespaceArrayXML = $dom->createElement('namespace');\n                $namespacesXML->appendChild($namespaceArrayXML);\n                $namespaceArrayXML->setAttribute('id', $space);\n            }\n\n            foreach ($commands as $name => $command) {\n                if ($name !== $command->getName()) {\n                    continue;\n                }\n\n                if (!$namespace) {\n                    $commandXML = $dom->createElement('command');\n                    $namespaceArrayXML->appendChild($commandXML);\n                    $commandXML->appendChild($dom->createTextNode($name));\n                }\n\n                $node = $command->asXml(true)->getElementsByTagName('command')->item(0);\n                $node = $dom->importNode($node, true);\n\n                $commandsXML->appendChild($node);\n            }\n        }\n\n        return $asDom ? $dom : $dom->saveXml();\n    }\n\n    /**\n     * Renders a caught exception.\n     *\n     * @param Exception       $e      An exception instance\n     * @param OutputInterface $output An OutputInterface instance\n     */\n    public function renderException($e, $output)\n    {\n        $strlen = function ($string) {\n            if (!function_exists('mb_strlen')) {\n                return strlen($string);\n            }\n\n            if (false === $encoding = mb_detect_encoding($string)) {\n                return strlen($string);\n            }\n\n            return mb_strlen($string, $encoding);\n        };\n\n        do {\n            $title = sprintf('  [%s]  ', get_class($e));\n            $len = $strlen($title);\n            $width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : PHP_INT_MAX;\n            $lines = array();\n            foreach (preg_split(\"{\\r?\\n}\", $e->getMessage()) as $line) {\n                foreach (str_split($line, $width - 4) as $line) {\n                    $lines[] = sprintf('  %s  ', $line);\n                    $len = max($strlen($line) + 4, $len);\n                }\n            }\n\n            $messages = array(str_repeat(' ', $len), $title.str_repeat(' ', max(0, $len - $strlen($title))));\n\n            foreach ($lines as $line) {\n                $messages[] = $line.str_repeat(' ', $len - $strlen($line));\n            }\n\n            $messages[] = str_repeat(' ', $len);\n\n            $output->writeln(\"\");\n            $output->writeln(\"\");\n            foreach ($messages as $message) {\n                $output->writeln('<error>'.$message.'</error>');\n            }\n            $output->writeln(\"\");\n            $output->writeln(\"\");\n\n            if (OutputInterface::VERBOSITY_VERBOSE === $output->getVerbosity()) {\n                $output->writeln('<comment>Exception trace:</comment>');\n\n                // exception related properties\n                $trace = $e->getTrace();\n                array_unshift($trace, array(\n                    'function' => '',\n                    'file'     => $e->getFile() != null ? $e->getFile() : 'n/a',\n                    'line'     => $e->getLine() != null ? $e->getLine() : 'n/a',\n                    'args'     => array(),\n                ));\n\n                for ($i = 0, $count = count($trace); $i < $count; $i++) {\n                    $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';\n                    $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';\n                    $function = $trace[$i]['function'];\n                    $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a';\n                    $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a';\n\n                    $output->writeln(sprintf(' %s%s%s() at <info>%s:%s</info>', $class, $type, $function, $file, $line));\n                }\n\n                $output->writeln(\"\");\n                $output->writeln(\"\");\n            }\n        } while ($e = $e->getPrevious());\n\n        if (null !== $this->runningCommand) {\n            $output->writeln(sprintf('<info>%s</info>', sprintf($this->runningCommand->getSynopsis(), $this->getName())));\n            $output->writeln(\"\");\n            $output->writeln(\"\");\n        }\n    }\n\n    /**\n     * Tries to figure out the terminal width in which this application runs\n     *\n     * @return int|null\n     */\n    protected function getTerminalWidth()\n    {\n        if (defined('PHP_WINDOWS_VERSION_BUILD') && $ansicon = getenv('ANSICON')) {\n            return preg_replace('{^(\\d+)x.*$}', '$1', $ansicon);\n        }\n\n        if (preg_match(\"{rows.(\\d+);.columns.(\\d+);}i\", $this->getSttyColumns(), $match)) {\n            return $match[2];\n        }\n    }\n\n    /**\n     * Tries to figure out the terminal height in which this application runs\n     *\n     * @return int|null\n     */\n    protected function getTerminalHeight()\n    {\n        if (defined('PHP_WINDOWS_VERSION_BUILD') && $ansicon = getenv('ANSICON')) {\n            return preg_replace('{^\\d+x\\d+ \\(\\d+x(\\d+)\\)$}', '$1', trim($ansicon));\n        }\n\n        if (preg_match(\"{rows.(\\d+);.columns.(\\d+);}i\", $this->getSttyColumns(), $match)) {\n            return $match[1];\n        }\n    }\n\n    /**\n     * Gets the name of the command based on input.\n     *\n     * @param InputInterface $input The input interface\n     *\n     * @return string The command name\n     */\n    protected function getCommandName(InputInterface $input)\n    {\n        return $input->getFirstArgument('command');\n    }\n\n    /**\n     * Gets the default input definition.\n     *\n     * @return InputDefinition An InputDefinition instance\n     */\n    protected function getDefaultInputDefinition()\n    {\n        return new InputDefinition(array(\n            new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'),\n\n            new InputOption('--help',           '-h', InputOption::VALUE_NONE, 'Display this help message.'),\n            new InputOption('--quiet',          '-q', InputOption::VALUE_NONE, 'Do not output any message.'),\n            new InputOption('--verbose',        '-v', InputOption::VALUE_NONE, 'Increase verbosity of messages.'),\n            new InputOption('--version',        '-V', InputOption::VALUE_NONE, 'Display this application version.'),\n            new InputOption('--ansi',           '',   InputOption::VALUE_NONE, 'Force ANSI output.'),\n            new InputOption('--no-ansi',        '',   InputOption::VALUE_NONE, 'Disable ANSI output.'),\n            new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question.'),\n        ));\n    }\n\n    /**\n     * Gets the default commands that should always be available.\n     *\n     * @return array An array of default Command instances\n     */\n    protected function getDefaultCommands()\n    {\n        return array(new HelpCommand(), new ListCommand());\n    }\n\n    /**\n     * Gets the default helper set with the helpers that should always be available.\n     *\n     * @return HelperSet A HelperSet instance\n     */\n    protected function getDefaultHelperSet()\n    {\n        return new HelperSet(array(\n            new FormatterHelper(),\n            new DialogHelper(),\n        ));\n    }\n\n    /**\n     * Runs and parses stty -a if it's available, suppressing any error output\n     *\n     * @return string\n     */\n    private function getSttyColumns()\n    {\n        if (!function_exists('proc_open')) {\n            return;\n        }\n\n        $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w'));\n        $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, array('suppress_errors' => true));\n        if (is_resource($process)) {\n            $info = stream_get_contents($pipes[1]);\n            fclose($pipes[1]);\n            fclose($pipes[2]);\n            proc_close($process);\n\n            return $info;\n        }\n    }\n\n    /**\n     * Sorts commands in alphabetical order.\n     *\n     * @param array $commands An associative array of commands to sort\n     *\n     * @return array A sorted array of commands\n     */\n    private function sortCommands($commands)\n    {\n        $namespacedCommands = array();\n        foreach ($commands as $name => $command) {\n            $key = $this->extractNamespace($name, 1);\n            if (!$key) {\n                $key = '_global';\n            }\n\n            $namespacedCommands[$key][$name] = $command;\n        }\n        ksort($namespacedCommands);\n\n        foreach ($namespacedCommands as &$commands) {\n            ksort($commands);\n        }\n\n        return $namespacedCommands;\n    }\n\n    /**\n     * Returns abbreviated suggestions in string format.\n     *\n     * @param array $abbrevs Abbreviated suggestions to convert\n     *\n     * @return string A formatted string of abbreviated suggestions\n     */\n    private function getAbbreviationSuggestions($abbrevs)\n    {\n        return sprintf('%s, %s%s', $abbrevs[0], $abbrevs[1], count($abbrevs) > 2 ? sprintf(' and %d more', count($abbrevs) - 2) : '');\n    }\n\n    /**\n     * Returns the namespace part of the command name.\n     *\n     * @param string $name  The full name of the command\n     * @param string $limit The maximum number of parts of the namespace\n     *\n     * @return string The namespace of the command\n     */\n    private function extractNamespace($name, $limit = null)\n    {\n        $parts = explode(':', $name);\n        array_pop($parts);\n\n        return implode(':', null === $limit ? $parts : array_slice($parts, 0, $limit));\n    }\n\n    /**\n     * Finds alternative commands of $name\n     *\n     * @param string $name    The full name of the command\n     * @param array  $abbrevs The abbreviations\n     *\n     * @return array A sorted array of similar commands\n     */\n    private function findAlternativeCommands($name, $abbrevs)\n    {\n        $callback = function($item) {\n            return $item->getName();\n        };\n\n        return $this->findAlternatives($name, $this->commands, $abbrevs, $callback);\n    }\n\n    /**\n     * Finds alternative namespace of $name\n     *\n     * @param string $name    The full name of the namespace\n     * @param array  $abbrevs The abbreviations\n     *\n     * @return array A sorted array of similar namespace\n     */\n    private function findAlternativeNamespace($name, $abbrevs)\n    {\n        return $this->findAlternatives($name, $this->getNamespaces(), $abbrevs);\n    }\n\n    /**\n     * Finds alternative of $name among $collection,\n     * if nothing is found in $collection, try in $abbrevs\n     *\n     * @param string               $name       The string\n     * @param array|Traversable    $collection The collecion\n     * @param array                $abbrevs    The abbreviations\n     * @param Closure|string|array $callback   The callable to transform collection item before comparison\n     *\n     * @return array A sorted array of similar string\n     */\n    private function findAlternatives($name, $collection, $abbrevs, $callback = null)\n    {\n        $alternatives = array();\n\n        foreach ($collection as $item) {\n            if (null !== $callback) {\n                $item = call_user_func($callback, $item);\n            }\n\n            $lev = levenshtein($name, $item);\n            if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) {\n                $alternatives[$item] = $lev;\n            }\n        }\n\n        if (!$alternatives) {\n            foreach ($abbrevs as $key => $values) {\n                $lev = levenshtein($name, $key);\n                if ($lev <= strlen($name) / 3 || false !== strpos($key, $name)) {\n                    foreach ($values as $value) {\n                        $alternatives[$value] = $lev;\n                    }\n                }\n            }\n        }\n\n        asort($alternatives);\n\n        return array_keys($alternatives);\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\BrowserKit;\n\nuse Symfony\\Component\\DomCrawler\\Crawler;\nuse Symfony\\Component\\DomCrawler\\Link;\nuse Symfony\\Component\\DomCrawler\\Form;\nuse Symfony\\Component\\Process\\PhpProcess;\n\n/**\n * Client simulates a browser.\n *\n * To make the actual request, you need to implement the doRequest() method.\n *\n * If you want to be able to run requests in their own process (insulated flag),\n * you need to also implement the getScript() method.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @api\n */\nabstract class Client\n{\n    protected $history;\n    protected $cookieJar;\n    protected $server;\n    protected $request;\n    protected $response;\n    protected $crawler;\n    protected $insulated;\n    protected $redirect;\n    protected $followRedirects;\n\n    /**\n     * Constructor.\n     *\n     * @param array     $server    The server parameters (equivalent of $_SERVER)\n     * @param History   $history   A History instance to store the browser history\n     * @param CookieJar $cookieJar A CookieJar instance to store the cookies\n     *\n     * @api\n     */\n    public function __construct(array $server = array(), History $history = null, CookieJar $cookieJar = null)\n    {\n        $this->setServerParameters($server);\n        $this->history = null === $history ? new History() : $history;\n        $this->cookieJar = null === $cookieJar ? new CookieJar() : $cookieJar;\n        $this->insulated = false;\n        $this->followRedirects = true;\n    }\n\n    /**\n     * Sets whether to automatically follow redirects or not.\n     *\n     * @param Boolean $followRedirect Whether to follow redirects\n     *\n     * @api\n     */\n    public function followRedirects($followRedirect = true)\n    {\n        $this->followRedirects = (Boolean) $followRedirect;\n    }\n\n    /**\n     * Sets the insulated flag.\n     *\n     * @param Boolean $insulated Whether to insulate the requests or not\n     *\n     * @throws \\RuntimeException When Symfony Process Component is not installed\n     *\n     * @api\n     */\n    public function insulate($insulated = true)\n    {\n        if ($insulated && !class_exists('Symfony\\\\Component\\\\Process\\\\Process')) {\n            // @codeCoverageIgnoreStart\n            throw new \\RuntimeException('Unable to isolate requests as the Symfony Process Component is not installed.');\n            // @codeCoverageIgnoreEnd\n        }\n\n        $this->insulated = (Boolean) $insulated;\n    }\n\n    /**\n     * Sets server parameters.\n     *\n     * @param array $server An array of server parameters\n     *\n     * @api\n     */\n    public function setServerParameters(array $server)\n    {\n        $this->server = array_merge(array(\n            'HTTP_HOST'       => 'localhost',\n            'HTTP_USER_AGENT' => 'Symfony2 BrowserKit',\n        ), $server);\n    }\n\n    /**\n     * Sets single server parameter.\n     *\n     * @param string $key   A key of the parameter\n     * @param string $value A value of the parameter\n     */\n    public function setServerParameter($key, $value)\n    {\n        $this->server[$key] = $value;\n    }\n\n    /**\n     * Gets single server parameter for specified key.\n     *\n     * @param string $key     A key of the parameter to get\n     * @param string $default A default value when key is undefined\n     *\n     * @return string A value of the parameter\n     */\n    public function getServerParameter($key, $default = '')\n    {\n        return (isset($this->server[$key])) ? $this->server[$key] : $default;\n    }\n\n    /**\n     * Returns the History instance.\n     *\n     * @return History A History instance\n     *\n     * @api\n     */\n    public function getHistory()\n    {\n        return $this->history;\n    }\n\n    /**\n     * Returns the CookieJar instance.\n     *\n     * @return CookieJar A CookieJar instance\n     *\n     * @api\n     */\n    public function getCookieJar()\n    {\n        return $this->cookieJar;\n    }\n\n    /**\n     * Returns the current Crawler instance.\n     *\n     * @return Crawler A Crawler instance\n     *\n     * @api\n     */\n    public function getCrawler()\n    {\n        return $this->crawler;\n    }\n\n    /**\n     * Returns the current Response instance.\n     *\n     * @return Response A Response instance\n     *\n     * @api\n     */\n    public function getResponse()\n    {\n        return $this->response;\n    }\n\n    /**\n     * Returns the current Request instance.\n     *\n     * @return Request A Request instance\n     *\n     * @api\n     */\n    public function getRequest()\n    {\n        return $this->request;\n    }\n\n    /**\n     * Clicks on a given link.\n     *\n     * @param Link $link A Link instance\n     *\n     * @return Crawler\n     *\n     * @api\n     */\n    public function click(Link $link)\n    {\n        if ($link instanceof Form) {\n            return $this->submit($link);\n        }\n\n        return $this->request($link->getMethod(), $link->getUri());\n    }\n\n    /**\n     * Submits a form.\n     *\n     * @param Form  $form   A Form instance\n     * @param array $values An array of form field values\n     *\n     * @return Crawler\n     *\n     * @api\n     */\n    public function submit(Form $form, array $values = array())\n    {\n        $form->setValues($values);\n\n        return $this->request($form->getMethod(), $form->getUri(), $form->getPhpValues(), $form->getPhpFiles());\n    }\n\n    /**\n     * Calls a URI.\n     *\n     * @param string  $method        The request method\n     * @param string  $uri           The URI to fetch\n     * @param array   $parameters    The Request parameters\n     * @param array   $files         The files\n     * @param array   $server        The server parameters (HTTP headers are referenced with a HTTP_ prefix as PHP does)\n     * @param string  $content       The raw body data\n     * @param Boolean $changeHistory Whether to update the history or not (only used internally for back(), forward(), and reload())\n     *\n     * @return Crawler\n     *\n     * @api\n     */\n    public function request($method, $uri, array $parameters = array(), array $files = array(), array $server = array(), $content = null, $changeHistory = true)\n    {\n        $uri = $this->getAbsoluteUri($uri);\n\n        $server = array_merge($this->server, $server);\n        if (!$this->history->isEmpty()) {\n            $server['HTTP_REFERER'] = $this->history->current()->getUri();\n        }\n        $server['HTTP_HOST'] = parse_url($uri, PHP_URL_HOST);\n        $server['HTTPS'] = 'https' == parse_url($uri, PHP_URL_SCHEME);\n\n        $request = new Request($uri, $method, $parameters, $files, $this->cookieJar->allValues($uri), $server, $content);\n\n        $this->request = $this->filterRequest($request);\n\n        if (true === $changeHistory) {\n            $this->history->add($request);\n        }\n\n        if ($this->insulated) {\n            $this->response = $this->doRequestInProcess($this->request);\n        } else {\n            $this->response = $this->doRequest($this->request);\n        }\n\n        $response = $this->filterResponse($this->response);\n\n        $this->cookieJar->updateFromResponse($response);\n\n        $this->redirect = $response->getHeader('Location');\n\n        if ($this->followRedirects && $this->redirect) {\n            return $this->crawler = $this->followRedirect();\n        }\n\n        return $this->crawler = $this->createCrawlerFromContent($request->getUri(), $response->getContent(), $response->getHeader('Content-Type'));\n    }\n\n    /**\n     * Makes a request in another process.\n     *\n     * @param Request $request A Request instance\n     *\n     * @return Response A Response instance\n     *\n     * @throws \\RuntimeException When processing returns exit code\n     */\n    protected function doRequestInProcess($request)\n    {\n        // We set the TMPDIR (for Macs) and TEMP (for Windows), because on these platforms the temp directory changes based on the user.\n        $process = new PhpProcess($this->getScript($request), null, array('TMPDIR' => sys_get_temp_dir(), 'TEMP' => sys_get_temp_dir()));\n        $process->run();\n\n        if (!$process->isSuccessful() || !preg_match('/^O\\:\\d+\\:/', $process->getOutput())) {\n            throw new \\RuntimeException('OUTPUT: '.$process->getOutput().' ERROR OUTPUT: '.$process->getErrorOutput());\n        }\n\n        return unserialize($process->getOutput());\n    }\n\n    /**\n     * Makes a request.\n     *\n     * @param Request $request A Request instance\n     *\n     * @return Response A Response instance\n     */\n    abstract protected function doRequest($request);\n\n    /**\n     * Returns the script to execute when the request must be insulated.\n     *\n     * @param Request $request A Request instance\n     *\n     * @throws \\LogicException When this abstract class is not implemented\n     */\n    protected function getScript($request)\n    {\n        // @codeCoverageIgnoreStart\n        throw new \\LogicException('To insulate requests, you need to override the getScript() method.');\n        // @codeCoverageIgnoreEnd\n    }\n\n    /**\n     * Filters the request.\n     *\n     * @param Request $request The request to filter\n     *\n     * @return Request\n     */\n    protected function filterRequest(Request $request)\n    {\n        return $request;\n    }\n\n    /**\n     * Filters the Response.\n     *\n     * @param Response $response The Response to filter\n     *\n     * @return Response\n     */\n    protected function filterResponse($response)\n    {\n        return $response;\n    }\n\n    /**\n     * Creates a crawler.\n     *\n     * This method returns null if the DomCrawler component is not available.\n     *\n     * @param string $uri     A uri\n     * @param string $content Content for the crawler to use\n     * @param string $type    Content type\n     *\n     * @return Crawler|null\n     */\n    protected function createCrawlerFromContent($uri, $content, $type)\n    {\n        if (!class_exists('Symfony\\Component\\DomCrawler\\Crawler')) {\n            return null;\n        }\n\n        $crawler = new Crawler(null, $uri);\n        $crawler->addContent($content, $type);\n\n        return $crawler;\n    }\n\n    /**\n     * Goes back in the browser history.\n     *\n     * @return Crawler\n     *\n     * @api\n     */\n    public function back()\n    {\n        return $this->requestFromRequest($this->history->back(), false);\n    }\n\n    /**\n     * Goes forward in the browser history.\n     *\n     * @return Crawler\n     *\n     * @api\n     */\n    public function forward()\n    {\n        return $this->requestFromRequest($this->history->forward(), false);\n    }\n\n    /**\n     * Reloads the current browser.\n     *\n     * @return Crawler\n     *\n     * @api\n     */\n    public function reload()\n    {\n        return $this->requestFromRequest($this->history->current(), false);\n    }\n\n    /**\n     * Follow redirects?\n     *\n     * @return Crawler\n     *\n     * @throws \\LogicException If request was not a redirect\n     *\n     * @api\n     */\n    public function followRedirect()\n    {\n        if (empty($this->redirect)) {\n            throw new \\LogicException('The request was not redirected.');\n        }\n\n        return $this->request('get', $this->redirect);\n    }\n\n    /**\n     * Restarts the client.\n     *\n     * It flushes history and all cookies.\n     *\n     * @api\n     */\n    public function restart()\n    {\n        $this->cookieJar->clear();\n        $this->history->clear();\n    }\n\n    /**\n     * Takes a URI and converts it to absolute if it is not already absolute.\n     *\n     * @param string $uri A uri\n     *\n     * @return string An absolute uri\n     */\n    protected function getAbsoluteUri($uri)\n    {\n        // already absolute?\n        if (0 === strpos($uri, 'http')) {\n            return $uri;\n        }\n\n        if (!$this->history->isEmpty()) {\n            $currentUri = $this->history->current()->getUri();\n        } else {\n            $currentUri = sprintf('http%s://%s/',\n                isset($this->server['HTTPS']) ? 's' : '',\n                isset($this->server['HTTP_HOST']) ? $this->server['HTTP_HOST'] : 'localhost'\n            );\n        }\n\n        // anchor?\n        if (!$uri || '#' == $uri[0]) {\n            return preg_replace('/#.*?$/', '', $currentUri).$uri;\n        }\n\n        if ('/' !== $uri[0]) {\n            $path = parse_url($currentUri, PHP_URL_PATH);\n\n            if ('/' !== substr($path, -1)) {\n                $path = substr($path, 0, strrpos($path, '/') + 1);\n            }\n\n            $uri = $path.$uri;\n        }\n\n        return preg_replace('#^(.*?//[^/]+)\\/.*$#', '$1', $currentUri).$uri;\n    }\n\n    /**\n     * Makes a request from a Request object directly.\n     *\n     * @param Request $request       A Request instance\n     * @param Boolean $changeHistory Whether to update the history or not (only used internally for back(), forward(), and reload())\n     *\n     * @return Crawler\n     */\n    protected function requestFromRequest(Request $request, $changeHistory = true)\n    {\n        return $this->request($request->getMethod(), $request->getUri(), $request->getParameters(), $request->getFiles(), $request->getServer(), $request->getContent(), $changeHistory);\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/Controller.php",
    "content": "<?php\n/**\n * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)\n * Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)\n *\n * Licensed under The MIT License\n * Redistributions of files must retain the above copyright notice.\n *\n * @copyright     Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)\n * @link          http://cakephp.org CakePHP(tm) Project\n * @package       Cake.Controller\n * @since         CakePHP(tm) v 0.2.9\n * @license       MIT License (http://www.opensource.org/licenses/mit-license.php)\n */\n\nApp::uses('CakeResponse', 'Network');\nApp::uses('ClassRegistry', 'Utility');\nApp::uses('ComponentCollection', 'Controller');\nApp::uses('View', 'View');\nApp::uses('CakeEvent', 'Event');\nApp::uses('CakeEventListener', 'Event');\nApp::uses('CakeEventManager', 'Event');\n\n/**\n * Application controller class for organization of business logic.\n * Provides basic functionality, such as rendering views inside layouts,\n * automatic model availability, redirection, callbacks, and more.\n *\n * Controllers should provide a number of 'action' methods.  These are public methods on the controller\n * that are not prefixed with a '_' and not part of Controller.  Each action serves as an endpoint for\n * performing a specific action on a resource or collection of resources.  For example adding or editing a new\n * object, or listing a set of objects.\n *\n * You can access request parameters, using `$this->request`.  The request object contains all the POST, GET and FILES\n * that were part of the request.\n *\n * After performing the required actions, controllers are responsible for creating a response.  This usually\n * takes the form of a generated View, or possibly a redirection to another controller action.  In either case\n * `$this->response` allows you to manipulate all aspects of the response.\n *\n * Controllers are created by Dispatcher based on request parameters and routing. By default controllers and actions\n * use conventional names.  For example `/posts/index` maps to `PostsController::index()`.  You can re-map urls\n * using Router::connect().\n *\n * @package       Cake.Controller\n * @property      AclComponent $Acl\n * @property      AuthComponent $Auth\n * @property      CookieComponent $Cookie\n * @property      EmailComponent $Email\n * @property      PaginatorComponent $Paginator\n * @property      RequestHandlerComponent $RequestHandler\n * @property      SecurityComponent $Security\n * @property      SessionComponent $Session\n * @link          http://book.cakephp.org/2.0/en/controllers.html\n */\nclass Controller extends Object implements CakeEventListener {\n\n/**\n * The name of this controller. Controller names are plural, named after the model they manipulate.\n *\n * @var string\n * @link http://book.cakephp.org/2.0/en/controllers.html#controller-attributes\n */\n\tpublic $name = null;\n\n/**\n * An array containing the class names of models this controller uses.\n *\n * Example: `public $uses = array('Product', 'Post', 'Comment');`\n *\n * Can be set to several values to express different options:\n *\n * - `true` Use the default inflected model name.\n * - `array()` Use only models defined in the parent class.\n * - `false` Use no models at all, do not merge with parent class either.\n * - `array('Post', 'Comment')` Use only the Post and Comment models. Models\n *   Will also be merged with the parent class.\n *\n * The default value is `true`.\n *\n * @var mixed A single name as a string or a list of names as an array.\n * @link http://book.cakephp.org/2.0/en/controllers.html#components-helpers-and-uses\n */\n\tpublic $uses = true;\n\n/**\n * An array containing the names of helpers this controller uses. The array elements should\n * not contain the \"Helper\" part of the classname.\n *\n * Example: `public $helpers = array('Html', 'Javascript', 'Time', 'Ajax');`\n *\n * @var mixed A single name as a string or a list of names as an array.\n * @link http://book.cakephp.org/2.0/en/controllers.html#components-helpers-and-uses\n */\n\tpublic $helpers = array('Session', 'Html', 'Form');\n\n/**\n * An instance of a CakeRequest object that contains information about the current request.\n * This object contains all the information about a request and several methods for reading\n * additional information about the request.\n *\n * @var CakeRequest\n * @link http://book.cakephp.org/2.0/en/controllers/request-response.html#cakerequest\n */\n\tpublic $request;\n\n/**\n * An instance of a CakeResponse object that contains information about the impending response\n *\n * @var CakeResponse\n * @link http://book.cakephp.org/2.0/en/controllers/request-response.html#cakeresponse\n */\n\tpublic $response;\n\n/**\n * The classname to use for creating the response object.\n *\n * @var string\n */\n\tprotected $_responseClass = 'CakeResponse';\n\n/**\n * The name of the views subfolder containing views for this controller.\n *\n * @var string\n */\n\tpublic $viewPath = null;\n\n/**\n * The name of the layouts subfolder containing layouts for this controller.\n *\n * @var string\n */\n\tpublic $layoutPath = null;\n\n/**\n * Contains variables to be handed to the view.\n *\n * @var array\n */\n\tpublic $viewVars = array();\n\n/**\n * The name of the view file to render. The name specified\n * is the filename in /app/View/<SubFolder> without the .ctp extension.\n *\n * @var string\n */\n\tpublic $view = null;\n\n/**\n * The name of the layout file to render the view inside of. The name specified\n * is the filename of the layout in /app/View/Layouts without the .ctp\n * extension.\n *\n * @var string\n */\n\tpublic $layout = 'default';\n\n/**\n * Set to true to automatically render the view\n * after action logic.\n *\n * @var boolean\n */\n\tpublic $autoRender = true;\n\n/**\n * Set to true to automatically render the layout around views.\n *\n * @var boolean\n */\n\tpublic $autoLayout = true;\n\n/**\n * Instance of ComponentCollection used to handle callbacks.\n *\n * @var ComponentCollection\n */\n\tpublic $Components = null;\n\n/**\n * Array containing the names of components this controller uses. Component names\n * should not contain the \"Component\" portion of the classname.\n *\n * Example: `public $components = array('Session', 'RequestHandler', 'Acl');`\n *\n * @var array\n * @link http://book.cakephp.org/2.0/en/controllers/components.html\n */\n\tpublic $components = array('Session');\n\n/**\n * The name of the View class this controller sends output to.\n *\n * @var string\n */\n\tpublic $viewClass = 'View';\n\n/**\n * Instance of the View created during rendering. Won't be set until after\n * Controller::render() is called.\n *\n * @var View\n */\n\tpublic $View;\n\n/**\n * File extension for view templates. Defaults to Cake's conventional \".ctp\".\n *\n * @var string\n */\n\tpublic $ext = '.ctp';\n\n/**\n * Automatically set to the name of a plugin.\n *\n * @var string\n */\n\tpublic $plugin = null;\n\n/**\n * Used to define methods a controller that will be cached. To cache a\n * single action, the value is set to an array containing keys that match\n * action names and values that denote cache expiration times (in seconds).\n *\n * Example:\n *\n * {{{\n * public $cacheAction = array(\n *\t\t'view/23/' => 21600,\n *\t\t'recalled/' => 86400\n *\t);\n * }}}\n *\n * $cacheAction can also be set to a strtotime() compatible string. This\n * marks all the actions in the controller for view caching.\n *\n * @var mixed\n * @link http://book.cakephp.org/2.0/en/core-libraries/helpers/cache.html#additional-configuration-options\n */\n\tpublic $cacheAction = false;\n\n/**\n * Holds all params passed and named.\n *\n * @var mixed\n */\n\tpublic $passedArgs = array();\n\n/**\n * Triggers Scaffolding\n *\n * @var mixed\n * @link http://book.cakephp.org/2.0/en/controllers/scaffolding.html\n */\n\tpublic $scaffold = false;\n\n/**\n * Holds current methods of the controller. This is a list of all the methods reachable\n * via url. Modifying this array, will allow you to change which methods can be reached.\n *\n * @var array\n */\n\tpublic $methods = array();\n\n/**\n * This controller's primary model class name, the Inflector::singularize()'ed version of\n * the controller's $name property.\n *\n * Example: For a controller named 'Comments', the modelClass would be 'Comment'\n *\n * @var string\n */\n\tpublic $modelClass = null;\n\n/**\n * This controller's model key name, an underscored version of the controller's $modelClass property.\n *\n * Example: For a controller named 'ArticleComments', the modelKey would be 'article_comment'\n *\n * @var string\n */\n\tpublic $modelKey = null;\n\n/**\n * Holds any validation errors produced by the last call of the validateErrors() method/\n *\n * @var array Validation errors, or false if none\n */\n\tpublic $validationErrors = null;\n\n/**\n * The class name of the parent class you wish to merge with.\n * Typically this is AppController, but you may wish to merge vars with a different\n * parent class.\n *\n * @var string\n */\n\tprotected $_mergeParent = 'AppController';\n\n/**\n * Instance of the CakeEventManager this controller is using\n * to dispatch inner events.\n *\n * @var CakeEventManager\n */\n\tprotected $_eventManager = null;\n\n/**\n * Constructor.\n *\n * @param CakeRequest $request Request object for this controller. Can be null for testing,\n *  but expect that features that use the request parameters will not work.\n * @param CakeResponse $response Response object for this controller.\n */\n\tpublic function __construct($request = null, $response = null) {\n\t\tif ($this->name === null) {\n\t\t\t$this->name = substr(get_class($this), 0, -10);\n\t\t}\n\n\t\tif ($this->viewPath == null) {\n\t\t\t$this->viewPath = $this->name;\n\t\t}\n\n\t\t$this->modelClass = Inflector::singularize($this->name);\n\t\t$this->modelKey = Inflector::underscore($this->modelClass);\n\t\t$this->Components = new ComponentCollection();\n\n\t\t$childMethods = get_class_methods($this);\n\t\t$parentMethods = get_class_methods('Controller');\n\n\t\t$this->methods = array_diff($childMethods, $parentMethods);\n\n\t\tif ($request instanceof CakeRequest) {\n\t\t\t$this->setRequest($request);\n\t\t}\n\t\tif ($response instanceof CakeResponse) {\n\t\t\t$this->response = $response;\n\t\t}\n\t\tparent::__construct();\n\t}\n\n/**\n * Provides backwards compatibility to avoid problems with empty and isset to alias properties.\n * Lazy loads models using the loadModel() method if declared in $uses\n *\n * @param string $name\n * @return void\n */\n\tpublic function __isset($name) {\n\t\tswitch ($name) {\n\t\t\tcase 'base':\n\t\t\tcase 'here':\n\t\t\tcase 'webroot':\n\t\t\tcase 'data':\n\t\t\tcase 'action':\n\t\t\tcase 'params':\n\t\t\t\treturn true;\n\t\t}\n\n\t\tif (is_array($this->uses)) {\n\t\t\tforeach ($this->uses as $modelClass) {\n\t\t\t\tlist($plugin, $class) = pluginSplit($modelClass, true);\n\t\t\t\tif ($name === $class) {\n\t\t\t\t\treturn $this->loadModel($modelClass);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ($name === $this->modelClass) {\n\t\t\tlist($plugin, $class) = pluginSplit($name, true);\n\t\t\tif (!$plugin) {\n\t\t\t\t$plugin = $this->plugin ? $this->plugin . '.' : null;\n\t\t\t}\n\t\t\treturn $this->loadModel($plugin . $this->modelClass);\n\t\t}\n\n\t\treturn false;\n\t}\n\n/**\n * Provides backwards compatibility access to the request object properties.\n * Also provides the params alias.\n *\n * @param string $name\n * @return void\n */\n\tpublic function __get($name) {\n\t\tswitch ($name) {\n\t\t\tcase 'base':\n\t\t\tcase 'here':\n\t\t\tcase 'webroot':\n\t\t\tcase 'data':\n\t\t\t\treturn $this->request->{$name};\n\t\t\tcase 'action':\n\t\t\t\treturn isset($this->request->params['action']) ? $this->request->params['action'] : '';\n\t\t\tcase 'params':\n\t\t\t\treturn $this->request;\n\t\t\tcase 'paginate':\n\t\t\t\treturn $this->Components->load('Paginator')->settings;\n\t\t}\n\n\t\tif (isset($this->{$name})) {\n\t\t\treturn $this->{$name};\n\t\t}\n\n\t\treturn null;\n\t}\n\n/**\n * Provides backwards compatibility access for setting values to the request object.\n *\n * @param string $name\n * @param mixed $value\n * @return void\n */\n\tpublic function __set($name, $value) {\n\t\tswitch ($name) {\n\t\t\tcase 'base':\n\t\t\tcase 'here':\n\t\t\tcase 'webroot':\n\t\t\tcase 'data':\n\t\t\t\treturn $this->request->{$name} = $value;\n\t\t\tcase 'action':\n\t\t\t\treturn $this->request->params['action'] = $value;\n\t\t\tcase 'params':\n\t\t\t\treturn $this->request->params = $value;\n\t\t\tcase 'paginate':\n\t\t\t\treturn $this->Components->load('Paginator')->settings = $value;\n\t\t}\n\t\treturn $this->{$name} = $value;\n\t}\n\n/**\n * Sets the request objects and configures a number of controller properties\n * based on the contents of the request.  The properties that get set are\n *\n * - $this->request - To the $request parameter\n * - $this->plugin - To the $request->params['plugin']\n * - $this->view - To the $request->params['action']\n * - $this->autoLayout - To the false if $request->params['bare']; is set.\n * - $this->autoRender - To false if $request->params['return'] == 1\n * - $this->passedArgs - The the combined results of params['named'] and params['pass]\n *\n * @param CakeRequest $request\n * @return void\n */\n\tpublic function setRequest(CakeRequest $request) {\n\t\t$this->request = $request;\n\t\t$this->plugin = isset($request->params['plugin']) ? Inflector::camelize($request->params['plugin']) : null;\n\t\t$this->view = isset($request->params['action']) ? $request->params['action'] : null;\n\t\tif (isset($request->params['pass']) && isset($request->params['named'])) {\n\t\t\t$this->passedArgs = array_merge($request->params['pass'], $request->params['named']);\n\t\t}\n\n\t\tif (array_key_exists('return', $request->params) && $request->params['return'] == 1) {\n\t\t\t$this->autoRender = false;\n\t\t}\n\t\tif (!empty($request->params['bare'])) {\n\t\t\t$this->autoLayout = false;\n\t\t}\n\t}\n\n/**\n * Dispatches the controller action.  Checks that the action\n * exists and isn't private.\n *\n * @param CakeRequest $request\n * @return mixed The resulting response.\n * @throws PrivateActionException When actions are not public or prefixed by _\n * @throws MissingActionException When actions are not defined and scaffolding is\n *    not enabled.\n */\n\tpublic function invokeAction(CakeRequest $request) {\n\t\ttry {\n\t\t\t$method = new ReflectionMethod($this, $request->params['action']);\n\n\t\t\tif ($this->_isPrivateAction($method, $request)) {\n\t\t\t\tthrow new PrivateActionException(array(\n\t\t\t\t\t'controller' => $this->name . \"Controller\",\n\t\t\t\t\t'action' => $request->params['action']\n\t\t\t\t));\n\t\t\t}\n\t\t\treturn $method->invokeArgs($this, $request->params['pass']);\n\n\t\t} catch (ReflectionException $e) {\n\t\t\tif ($this->scaffold !== false) {\n\t\t\t\treturn $this->_getScaffold($request);\n\t\t\t}\n\t\t\tthrow new MissingActionException(array(\n\t\t\t\t'controller' => $this->name . \"Controller\",\n\t\t\t\t'action' => $request->params['action']\n\t\t\t));\n\t\t}\n\t}\n\n/**\n * Check if the request's action is marked as private, with an underscore,\n * or if the request is attempting to directly accessing a prefixed action.\n *\n * @param ReflectionMethod $method The method to be invoked.\n * @param CakeRequest $request The request to check.\n * @return boolean\n */\n\tprotected function _isPrivateAction(ReflectionMethod $method, CakeRequest $request) {\n\t\t$privateAction = (\n\t\t\t$method->name[0] === '_' ||\n\t\t\t!$method->isPublic() ||\n\t\t\t!in_array($method->name,  $this->methods)\n\t\t);\n\t\t$prefixes = Router::prefixes();\n\n\t\tif (!$privateAction && !empty($prefixes)) {\n\t\t\tif (empty($request->params['prefix']) && strpos($request->params['action'], '_') > 0) {\n\t\t\t\tlist($prefix) = explode('_', $request->params['action']);\n\t\t\t\t$privateAction = in_array($prefix, $prefixes);\n\t\t\t}\n\t\t}\n\t\treturn $privateAction;\n\t}\n\n/**\n * Returns a scaffold object to use for dynamically scaffolded controllers.\n *\n * @param CakeRequest $request\n * @return Scaffold\n */\n\tprotected function _getScaffold(CakeRequest $request) {\n\t\treturn new Scaffold($this, $request);\n\t}\n\n/**\n * Merge components, helpers, and uses vars from\n * Controller::$_mergeParent and PluginAppController.\n *\n * @return void\n */\n\tprotected function _mergeControllerVars() {\n\t\t$pluginController = $pluginDot = null;\n\t\t$mergeParent = is_subclass_of($this, $this->_mergeParent);\n\t\t$pluginVars = array();\n\t\t$appVars = array();\n\n\t\tif (!empty($this->plugin)) {\n\t\t\t$pluginController = $this->plugin . 'AppController';\n\t\t\tif (!is_subclass_of($this, $pluginController)) {\n\t\t\t\t$pluginController = null;\n\t\t\t}\n\t\t\t$pluginDot = $this->plugin . '.';\n\t\t}\n\n\t\tif ($pluginController) {\n\t\t\t$merge = array('components', 'helpers');\n\t\t\t$this->_mergeVars($merge, $pluginController);\n\t\t}\n\n\t\tif ($mergeParent || !empty($pluginController)) {\n\t\t\t$appVars = get_class_vars($this->_mergeParent);\n\t\t\t$uses = $appVars['uses'];\n\t\t\t$merge = array('components', 'helpers');\n\t\t\t$this->_mergeVars($merge, $this->_mergeParent, true);\n\t\t}\n\n\t\tif ($this->uses === null) {\n\t\t\t$this->uses = false;\n\t\t}\n\t\tif ($this->uses === true) {\n\t\t\t$this->uses = array($pluginDot . $this->modelClass);\n\t\t}\n\t\tif (isset($appVars['uses']) && $appVars['uses'] === $this->uses) {\n\t\t\tarray_unshift($this->uses, $pluginDot . $this->modelClass);\n\t\t}\n\t\tif ($pluginController) {\n\t\t\t$pluginVars = get_class_vars($pluginController);\n\t\t}\n\t\tif ($this->uses !== false) {\n\t\t\t$this->_mergeUses($pluginVars);\n\t\t\t$this->_mergeUses($appVars);\n\t\t} else {\n\t\t\t$this->uses = array();\n\t\t\t$this->modelClass = '';\n\t\t}\n\t}\n\n/**\n * Helper method for merging the $uses property together.\n *\n * Merges the elements not already in $this->uses into\n * $this->uses.\n *\n * @param mixed $merge The data to merge in.\n * @return void\n */\n\tprotected function _mergeUses($merge) {\n\t\tif (!isset($merge['uses'])) {\n\t\t\treturn;\n\t\t}\n\t\tif ($merge['uses'] === true) {\n\t\t\treturn;\n\t\t}\n\t\t$this->uses = array_merge(\n\t\t\t$this->uses,\n\t\t\tarray_diff($merge['uses'], $this->uses)\n\t\t);\n\t}\n\n/**\n * Returns a list of all events that will fire in the controller during it's lifecycle.\n * You can override this function to add you own listener callbacks\n *\n * @return array\n */\n\tpublic function implementedEvents() {\n\t\treturn array(\n\t\t\t'Controller.initialize' => 'beforeFilter',\n\t\t\t'Controller.beforeRender' => 'beforeRender',\n\t\t\t'Controller.beforeRedirect' => array('callable' => 'beforeRedirect', 'passParams' => true),\n\t\t\t'Controller.shutdown' => 'afterFilter'\n\t\t);\n\t}\n\n/**\n * Loads Model classes based on the uses property\n * see Controller::loadModel(); for more info.\n * Loads Components and prepares them for initialization.\n *\n * @return mixed true if models found and instance created.\n * @see Controller::loadModel()\n * @link http://book.cakephp.org/2.0/en/controllers.html#Controller::constructClasses\n * @throws MissingModelException\n */\n\tpublic function constructClasses() {\n\t\t$this->_mergeControllerVars();\n\t\t$this->Components->init($this);\n\t\tif ($this->uses) {\n\t\t\t$this->uses = (array)$this->uses;\n\t\t\tlist(, $this->modelClass) = pluginSplit(current($this->uses));\n\t\t}\n\t\treturn true;\n\t}\n\n/**\n * Returns the CakeEventManager manager instance that is handling any callbacks.\n * You can use this instance to register any new listeners or callbacks to the\n * controller events, or create your own events and trigger them at will.\n *\n * @return CakeEventManager\n */\n\tpublic function getEventManager() {\n\t\tif (empty($this->_eventManager)) {\n\t\t\t$this->_eventManager = new CakeEventManager();\n\t\t\t$this->_eventManager->attach($this->Components);\n\t\t\t$this->_eventManager->attach($this);\n\t\t}\n\t\treturn $this->_eventManager;\n\t}\n\n/**\n * Perform the startup process for this controller.\n * Fire the Components and Controller callbacks in the correct order.\n *\n * - Initializes components, which fires their `initialize` callback\n * - Calls the controller `beforeFilter`.\n * - triggers Component `startup` methods.\n *\n * @return void\n */\n\tpublic function startupProcess() {\n\t\t$this->getEventManager()->dispatch(new CakeEvent('Controller.initialize', $this));\n\t\t$this->getEventManager()->dispatch(new CakeEvent('Controller.startup', $this));\n\t}\n\n/**\n * Perform the various shutdown processes for this controller.\n * Fire the Components and Controller callbacks in the correct order.\n *\n * - triggers the component `shutdown` callback.\n * - calls the Controller's `afterFilter` method.\n *\n * @return void\n */\n\tpublic function shutdownProcess() {\n\t\t$this->getEventManager()->dispatch(new CakeEvent('Controller.shutdown', $this));\n\t}\n\n/**\n * Queries & sets valid HTTP response codes & messages.\n *\n * @param mixed $code If $code is an integer, then the corresponding code/message is\n *        returned if it exists, null if it does not exist. If $code is an array,\n *        then the 'code' and 'message' keys of each nested array are added to the default\n *        HTTP codes. Example:\n *\n *        httpCodes(404); // returns array(404 => 'Not Found')\n *\n *        httpCodes(array(\n *            701 => 'Unicorn Moved',\n *            800 => 'Unexpected Minotaur'\n *        )); // sets these new values, and returns true\n *\n * @return mixed Associative array of the HTTP codes as keys, and the message\n *    strings as values, or null of the given $code does not exist.\n * @deprecated Use CakeResponse::httpCodes();\n */\n\tpublic function httpCodes($code = null) {\n\t\treturn $this->response->httpCodes($code);\n\t}\n\n/**\n * Loads and instantiates models required by this controller.\n * If the model is non existent, it will throw a missing database table error, as Cake generates\n * dynamic models for the time being.\n *\n * @param string $modelClass Name of model class to load\n * @param mixed $id Initial ID the instanced model class should have\n * @return mixed true when single model found and instance created, error returned if model not found.\n * @throws MissingModelException if the model class cannot be found.\n */\n\tpublic function loadModel($modelClass = null, $id = null) {\n\t\tif ($modelClass === null) {\n\t\t\t$modelClass = $this->modelClass;\n\t\t}\n\n\t\t$this->uses = ($this->uses) ? (array)$this->uses : array();\n\t\tif (!in_array($modelClass, $this->uses)) {\n\t\t\t$this->uses[] = $modelClass;\n\t\t}\n\n\t\tlist($plugin, $modelClass) = pluginSplit($modelClass, true);\n\n\t\t$this->{$modelClass} = ClassRegistry::init(array(\n\t\t\t'class' => $plugin . $modelClass, 'alias' => $modelClass, 'id' => $id\n\t\t));\n\t\tif (!$this->{$modelClass}) {\n\t\t\tthrow new MissingModelException($modelClass);\n\t\t}\n\t\treturn true;\n\t}\n\n/**\n * Redirects to given $url, after turning off $this->autoRender.\n * Script execution is halted after the redirect.\n *\n * @param mixed $url A string or array-based URL pointing to another location within the app,\n *     or an absolute URL\n * @param integer $status Optional HTTP status code (eg: 404)\n * @param boolean $exit If true, exit() will be called after the redirect\n * @return mixed void if $exit = false. Terminates script if $exit = true\n * @link http://book.cakephp.org/2.0/en/controllers.html#Controller::redirect\n */\n\tpublic function redirect($url, $status = null, $exit = true) {\n\t\t$this->autoRender = false;\n\n\t\tif (is_array($status)) {\n\t\t\textract($status, EXTR_OVERWRITE);\n\t\t}\n\t\t$event = new CakeEvent('Controller.beforeRedirect', $this, array($url, $status, $exit));\n\t\t//TODO: Remove the following line when the events are fully migrated to the CakeEventManager\n\t\tlist($event->break, $event->breakOn, $event->collectReturn) = array(true, false, true);\n\t\t$this->getEventManager()->dispatch($event);\n\n\t\tif ($event->isStopped()) {\n\t\t\treturn;\n\t\t}\n\t\t$response = $event->result;\n\t\textract($this->_parseBeforeRedirect($response, $url, $status, $exit), EXTR_OVERWRITE);\n\n\t\tif (function_exists('session_write_close')) {\n\t\t\tsession_write_close();\n\t\t}\n\n\t\tif ($url !== null) {\n\t\t\t$this->response->header('Location', Router::url($url, true));\n\t\t}\n\n\t\tif (is_string($status)) {\n\t\t\t$codes = array_flip($this->response->httpCodes());\n\t\t\tif (isset($codes[$status])) {\n\t\t\t\t$status = $codes[$status];\n\t\t\t}\n\t\t}\n\n\t\tif ($status) {\n\t\t\t$this->response->statusCode($status);\n\t\t}\n\n\t\tif ($exit) {\n\t\t\t$this->response->send();\n\t\t\t$this->_stop();\n\t\t}\n\t}\n\n/**\n * Parse beforeRedirect Response\n *\n * @param mixed $response Response from beforeRedirect callback\n * @param mixed $url The same value of beforeRedirect\n * @param integer $status The same value of beforeRedirect\n * @param boolean $exit The same value of beforeRedirect\n * @return array Array with keys url, status and exit\n */\n\tprotected function _parseBeforeRedirect($response, $url, $status, $exit) {\n\t\tif (is_array($response)) {\n\t\t\tforeach ($response as $resp) {\n\t\t\t\tif (is_array($resp) && isset($resp['url'])) {\n\t\t\t\t\textract($resp, EXTR_OVERWRITE);\n\t\t\t\t} elseif ($resp !== null) {\n\t\t\t\t\t$url = $resp;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn compact('url', 'status', 'exit');\n\t}\n\n/**\n * Convenience and object wrapper method for CakeResponse::header().\n *\n * @param string $status The header message that is being set.\n * @return void\n * @deprecated Use CakeResponse::header()\n */\n\tpublic function header($status) {\n\t\t$this->response->header($status);\n\t}\n\n/**\n * Saves a variable for use inside a view template.\n *\n * @param mixed $one A string or an array of data.\n * @param mixed $two Value in case $one is a string (which then works as the key).\n *   Unused if $one is an associative array, otherwise serves as the values to $one's keys.\n * @return void\n * @link http://book.cakephp.org/2.0/en/controllers.html#interacting-with-views\n */\n\tpublic function set($one, $two = null) {\n\t\tif (is_array($one)) {\n\t\t\tif (is_array($two)) {\n\t\t\t\t$data = array_combine($one, $two);\n\t\t\t} else {\n\t\t\t\t$data = $one;\n\t\t\t}\n\t\t} else {\n\t\t\t$data = array($one => $two);\n\t\t}\n\t\t$this->viewVars = $data + $this->viewVars;\n\t}\n\n/**\n * Internally redirects one action to another. Does not perform another HTTP request unlike Controller::redirect()\n *\n * Examples:\n *\n * {{{\n * setAction('another_action');\n * setAction('action_with_parameters', $parameter1);\n * }}}\n *\n * @param string $action The new action to be 'redirected' to\n * @param mixed  Any other parameters passed to this method will be passed as\n *    parameters to the new action.\n * @return mixed Returns the return value of the called action\n */\n\tpublic function setAction($action) {\n\t\t$this->request->params['action'] = $action;\n\t\t$this->view = $action;\n\t\t$args = func_get_args();\n\t\tunset($args[0]);\n\t\treturn call_user_func_array(array(&$this, $action), $args);\n\t}\n\n/**\n * Returns number of errors in a submitted FORM.\n *\n * @return integer Number of errors\n */\n\tpublic function validate() {\n\t\t$args = func_get_args();\n\t\t$errors = call_user_func_array(array(&$this, 'validateErrors'), $args);\n\n\t\tif ($errors === false) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn count($errors);\n\t}\n\n/**\n * Validates models passed by parameters. Example:\n *\n * `$errors = $this->validateErrors($this->Article, $this->User);`\n *\n * @param mixed A list of models as a variable argument\n * @return array Validation errors, or false if none\n */\n\tpublic function validateErrors() {\n\t\t$objects = func_get_args();\n\n\t\tif (empty($objects)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$errors = array();\n\t\tforeach ($objects as $object) {\n\t\t\tif (isset($this->{$object->alias})) {\n\t\t\t\t$object = $this->{$object->alias};\n\t\t\t}\n\t\t\t$object->set($object->data);\n\t\t\t$errors = array_merge($errors, $object->invalidFields());\n\t\t}\n\n\t\treturn $this->validationErrors = (!empty($errors) ? $errors : false);\n\t}\n\n/**\n * Instantiates the correct view class, hands it its data, and uses it to render the view output.\n *\n * @param string $view View to use for rendering\n * @param string $layout Layout to use\n * @return CakeResponse A response object containing the rendered view.\n * @link http://book.cakephp.org/2.0/en/controllers.html#Controller::render\n */\n\tpublic function render($view = null, $layout = null) {\n\t\t$event = new CakeEvent('Controller.beforeRender', $this);\n\t\t$this->getEventManager()->dispatch($event);\n\t\tif ($event->isStopped()) {\n\t\t\t$this->autoRender = false;\n\t\t\treturn $this->response;\n\t\t}\n\n\t\tif (!empty($this->uses) && is_array($this->uses)) {\n\t\t\tforeach ($this->uses as $model) {\n\t\t\t\tlist($plugin, $className) = pluginSplit($model);\n\t\t\t\t$this->request->params['models'][$className] = compact('plugin', 'className');\n\t\t\t}\n\t\t}\n\n\t\t$viewClass = $this->viewClass;\n\t\tif ($this->viewClass != 'View') {\n\t\t\tlist($plugin, $viewClass) = pluginSplit($viewClass, true);\n\t\t\t$viewClass = $viewClass . 'View';\n\t\t\tApp::uses($viewClass, $plugin . 'View');\n\t\t}\n\n\t\t$View = new $viewClass($this);\n\n\t\t$models = ClassRegistry::keys();\n\t\tforeach ($models as $currentModel) {\n\t\t\t$currentObject = ClassRegistry::getObject($currentModel);\n\t\t\tif (is_a($currentObject, 'Model')) {\n\t\t\t\t$className = get_class($currentObject);\n\t\t\t\tlist($plugin) = pluginSplit(App::location($className));\n\t\t\t\t$this->request->params['models'][$currentObject->alias] = compact('plugin', 'className');\n\t\t\t\t$View->validationErrors[$currentObject->alias] =& $currentObject->validationErrors;\n\t\t\t}\n\t\t}\n\n\t\t$this->autoRender = false;\n\t\t$this->View = $View;\n\t\t$this->response->body($View->render($view, $layout));\n\t\treturn $this->response;\n\t}\n\n/**\n * Returns the referring URL for this request.\n *\n * @param string $default Default URL to use if HTTP_REFERER cannot be read from headers\n * @param boolean $local If true, restrict referring URLs to local server\n * @return string Referring URL\n * @link http://book.cakephp.org/2.0/en/controllers.html#Controller::referer\n */\n\tpublic function referer($default = null, $local = false) {\n\t\tif ($this->request) {\n\t\t\t$referer = $this->request->referer($local);\n\t\t\tif ($referer == '/' && $default != null) {\n\t\t\t\treturn Router::url($default, true);\n\t\t\t}\n\t\t\treturn $referer;\n\t\t}\n\t\treturn '/';\n\t}\n\n/**\n * Forces the user's browser not to cache the results of the current request.\n *\n * @return void\n * @link http://book.cakephp.org/2.0/en/controllers.html#Controller::disableCache\n * @deprecated Use CakeResponse::disableCache()\n */\n\tpublic function disableCache() {\n\t\t$this->response->disableCache();\n\t}\n\n/**\n * Shows a message to the user for $pause seconds, then redirects to $url.\n * Uses flash.ctp as the default layout for the message.\n * Does not work if the current debug level is higher than 0.\n *\n * @param string $message Message to display to the user\n * @param mixed $url Relative string or array-based URL to redirect to after the time expires\n * @param integer $pause Time to show the message\n * @param string $layout Layout you want to use, defaults to 'flash'\n * @return void Renders flash layout\n * @link http://book.cakephp.org/2.0/en/controllers.html#Controller::flash\n */\n\tpublic function flash($message, $url, $pause = 1, $layout = 'flash') {\n\t\t$this->autoRender = false;\n\t\t$this->set('url', Router::url($url));\n\t\t$this->set('message', $message);\n\t\t$this->set('pause', $pause);\n\t\t$this->set('page_title', $message);\n\t\t$this->render(false, $layout);\n\t}\n\n/**\n * Converts POST'ed form data to a model conditions array, suitable for use in a Model::find() call.\n *\n * @param array $data POST'ed data organized by model and field\n * @param mixed $op A string containing an SQL comparison operator, or an array matching operators\n *        to fields\n * @param string $bool SQL boolean operator: AND, OR, XOR, etc.\n * @param boolean $exclusive If true, and $op is an array, fields not included in $op will not be\n *        included in the returned conditions\n * @return array An array of model conditions\n * @deprecated\n */\n\tpublic function postConditions($data = array(), $op = null, $bool = 'AND', $exclusive = false) {\n\t\tif (!is_array($data) || empty($data)) {\n\t\t\tif (!empty($this->request->data)) {\n\t\t\t\t$data = $this->request->data;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t$cond = array();\n\n\t\tif ($op === null) {\n\t\t\t$op = '';\n\t\t}\n\n\t\t$arrayOp = is_array($op);\n\t\tforeach ($data as $model => $fields) {\n\t\t\tforeach ($fields as $field => $value) {\n\t\t\t\t$key = $model . '.' . $field;\n\t\t\t\t$fieldOp = $op;\n\t\t\t\tif ($arrayOp) {\n\t\t\t\t\tif (array_key_exists($key, $op)) {\n\t\t\t\t\t\t$fieldOp = $op[$key];\n\t\t\t\t\t} elseif (array_key_exists($field, $op)) {\n\t\t\t\t\t\t$fieldOp = $op[$field];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$fieldOp = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ($exclusive && $fieldOp === false) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t$fieldOp = strtoupper(trim($fieldOp));\n\t\t\t\tif ($fieldOp === 'LIKE') {\n\t\t\t\t\t$key = $key . ' LIKE';\n\t\t\t\t\t$value = '%' . $value . '%';\n\t\t\t\t} elseif ($fieldOp && $fieldOp != '=') {\n\t\t\t\t\t$key = $key . ' ' . $fieldOp;\n\t\t\t\t}\n\t\t\t\t$cond[$key] = $value;\n\t\t\t}\n\t\t}\n\t\tif ($bool != null && strtoupper($bool) != 'AND') {\n\t\t\t$cond = array($bool => $cond);\n\t\t}\n\t\treturn $cond;\n\t}\n\n/**\n * Handles automatic pagination of model records.\n *\n * @param mixed $object Model to paginate (e.g: model instance, or 'Model', or 'Model.InnerModel')\n * @param mixed $scope Conditions to use while paginating\n * @param array $whitelist List of allowed options for paging\n * @return array Model query results\n * @link http://book.cakephp.org/2.0/en/controllers.html#Controller::paginate\n * @deprecated Use PaginatorComponent instead\n */\n\tpublic function paginate($object = null, $scope = array(), $whitelist = array()) {\n\t\treturn $this->Components->load('Paginator', $this->paginate)->paginate($object, $scope, $whitelist);\n\t}\n\n/**\n * Called before the controller action.  You can use this method to configure and customize components\n * or perform logic that needs to happen before each controller action.\n *\n * @return void\n * @link http://book.cakephp.org/2.0/en/controllers.html#request-life-cycle-callbacks\n */\n\tpublic function beforeFilter() {\n\t}\n\n/**\n * Called after the controller action is run, but before the view is rendered. You can use this method\n * to perform logic or set view variables that are required on every request.\n *\n * @return void\n * @link http://book.cakephp.org/2.0/en/controllers.html#request-life-cycle-callbacks\n */\n\tpublic function beforeRender() {\n\t}\n\n/**\n * The beforeRedirect method is invoked when the controller's redirect method is called but before any\n * further action. If this method returns false the controller will not continue on to redirect the request.\n * The $url, $status and $exit variables have same meaning as for the controller's method. You can also\n * return a string which will be interpreted as the url to redirect to or return associative array with\n * key 'url' and optionally 'status' and 'exit'.\n *\n * @param mixed $url A string or array-based URL pointing to another location within the app,\n *     or an absolute URL\n * @param integer $status Optional HTTP status code (eg: 404)\n * @param boolean $exit If true, exit() will be called after the redirect\n * @return mixed\n *   false to stop redirection event,\n *   string controllers a new redirection url or\n *   array with the keys url, status and exit to be used by the redirect method.\n * @link http://book.cakephp.org/2.0/en/controllers.html#request-life-cycle-callbacks\n */\n\tpublic function beforeRedirect($url, $status = null, $exit = true) {\n\t}\n\n/**\n * Called after the controller action is run and rendered.\n *\n * @return void\n * @link http://book.cakephp.org/2.0/en/controllers.html#request-life-cycle-callbacks\n */\n\tpublic function afterFilter() {\n\t}\n\n/**\n * This method should be overridden in child classes.\n *\n * @param string $method name of method called example index, edit, etc.\n * @return boolean Success\n * @link http://book.cakephp.org/2.0/en/controllers.html#callbacks\n */\n\tpublic function beforeScaffold($method) {\n\t\treturn true;\n\t}\n\n/**\n * Alias to beforeScaffold()\n *\n * @param string $method\n * @return boolean\n * @see Controller::beforeScaffold()\n * @deprecated\n */\n\tprotected function _beforeScaffold($method) {\n\t\treturn $this->beforeScaffold($method);\n\t}\n\n/**\n * This method should be overridden in child classes.\n *\n * @param string $method name of method called either edit or update.\n * @return boolean Success\n * @link http://book.cakephp.org/2.0/en/controllers.html#callbacks\n */\n\tpublic function afterScaffoldSave($method) {\n\t\treturn true;\n\t}\n\n/**\n * Alias to afterScaffoldSave()\n *\n * @param string $method\n * @return boolean\n * @see Controller::afterScaffoldSave()\n * @deprecated\n */\n\tprotected function _afterScaffoldSave($method) {\n\t\treturn $this->afterScaffoldSave($method);\n\t}\n\n/**\n * This method should be overridden in child classes.\n *\n * @param string $method name of method called either edit or update.\n * @return boolean Success\n * @link http://book.cakephp.org/2.0/en/controllers.html#callbacks\n */\n\tpublic function afterScaffoldSaveError($method) {\n\t\treturn true;\n\t}\n\n/**\n * Alias to afterScaffoldSaveError()\n *\n * @param string $method\n * @return boolean\n * @see Controller::afterScaffoldSaveError()\n * @deprecated\n */\n\tprotected function _afterScaffoldSaveError($method) {\n\t\treturn $this->afterScaffoldSaveError($method);\n\t}\n\n/**\n * This method should be overridden in child classes.\n * If not it will render a scaffold error.\n * Method MUST return true in child classes\n *\n * @param string $method name of method called example index, edit, etc.\n * @return boolean Success\n * @link http://book.cakephp.org/2.0/en/controllers.html#callbacks\n */\n\tpublic function scaffoldError($method) {\n\t\treturn false;\n\t}\n\n/**\n * Alias to scaffoldError()\n *\n * @param string $method\n * @return boolean\n * @see Controller::scaffoldError()\n * @deprecated\n */\n\tprotected function _scaffoldError($method) {\n\t\treturn $this->scaffoldError($method);\n\t}\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/Form.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\DomCrawler;\n\nuse Symfony\\Component\\DomCrawler\\Field\\FormField;\n\n/**\n * Form represents an HTML form.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @api\n */\nclass Form extends Link implements \\ArrayAccess\n{\n    /**\n     * @var \\DOMNode\n     */\n    private $button;\n    /**\n     * @var Field\\FormField[]\n     */\n    private $fields;\n\n    /**\n     * Constructor.\n     *\n     * @param \\DOMNode $node       A \\DOMNode instance\n     * @param string   $currentUri The URI of the page where the form is embedded\n     * @param string   $method     The method to use for the link (if null, it defaults to the method defined by the form)\n     *\n     * @throws \\LogicException if the node is not a button inside a form tag\n     *\n     * @api\n     */\n    public function __construct(\\DOMNode $node, $currentUri, $method = null)\n    {\n        parent::__construct($node, $currentUri, $method);\n\n        $this->initialize();\n    }\n\n    /**\n     * Gets the form node associated with this form.\n     *\n     * @return \\DOMNode A \\DOMNode instance\n     */\n    public function getFormNode()\n    {\n        return $this->node;\n    }\n\n    /**\n     * Sets the value of the fields.\n     *\n     * @param array $values An array of field values\n     *\n     * @return Form\n     *\n     * @api\n     */\n    public function setValues(array $values)\n    {\n        foreach ($values as $name => $value) {\n            $this->fields->set($name, $value);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Gets the field values.\n     *\n     * The returned array does not include file fields (@see getFiles).\n     *\n     * @return array An array of field values.\n     *\n     * @api\n     */\n    public function getValues()\n    {\n        $values = array();\n        foreach ($this->fields->all() as $name => $field) {\n            if ($field->isDisabled()) {\n                continue;\n            }\n\n            if (!$field instanceof Field\\FileFormField && $field->hasValue()) {\n                $values[$name] = $field->getValue();\n            }\n        }\n\n        return $values;\n    }\n\n    /**\n     * Gets the file field values.\n     *\n     * @return array An array of file field values.\n     *\n     * @api\n     */\n    public function getFiles()\n    {\n        if (!in_array($this->getMethod(), array('POST', 'PUT', 'DELETE', 'PATCH'))) {\n            return array();\n        }\n\n        $files = array();\n\n        foreach ($this->fields->all() as $name => $field) {\n            if ($field->isDisabled()) {\n                continue;\n            }\n\n            if ($field instanceof Field\\FileFormField) {\n                $files[$name] = $field->getValue();\n            }\n        }\n\n        return $files;\n    }\n\n    /**\n     * Gets the field values as PHP.\n     *\n     * This method converts fields with the array notation\n     * (like foo[bar] to arrays) like PHP does.\n     *\n     * @return array An array of field values.\n     *\n     * @api\n     */\n    public function getPhpValues()\n    {\n        $qs = http_build_query($this->getValues(), '', '&');\n        parse_str($qs, $values);\n\n        return $values;\n    }\n\n    /**\n     * Gets the file field values as PHP.\n     *\n     * This method converts fields with the array notation\n     * (like foo[bar] to arrays) like PHP does.\n     *\n     * @return array An array of field values.\n     *\n     * @api\n     */\n    public function getPhpFiles()\n    {\n        $qs = http_build_query($this->getFiles(), '', '&');\n        parse_str($qs, $values);\n\n        return $values;\n    }\n\n    /**\n     * Gets the URI of the form.\n     *\n     * The returned URI is not the same as the form \"action\" attribute.\n     * This method merges the value if the method is GET to mimics\n     * browser behavior.\n     *\n     * @return string The URI\n     *\n     * @api\n     */\n    public function getUri()\n    {\n        $uri = parent::getUri();\n\n        if (!in_array($this->getMethod(), array('POST', 'PUT', 'DELETE', 'PATCH')) && $queryString = http_build_query($this->getValues(), null, '&')) {\n            $sep = false === strpos($uri, '?') ? '?' : '&';\n            $uri .= $sep.$queryString;\n        }\n\n        return $uri;\n    }\n\n    protected function getRawUri()\n    {\n        return $this->node->getAttribute('action');\n    }\n\n    /**\n     * Gets the form method.\n     *\n     * If no method is defined in the form, GET is returned.\n     *\n     * @return string The method\n     *\n     * @api\n     */\n    public function getMethod()\n    {\n        if (null !== $this->method) {\n            return $this->method;\n        }\n\n        return $this->node->getAttribute('method') ? strtoupper($this->node->getAttribute('method')) : 'GET';\n    }\n\n    /**\n     * Returns true if the named field exists.\n     *\n     * @param string $name The field name\n     *\n     * @return Boolean true if the field exists, false otherwise\n     *\n     * @api\n     */\n    public function has($name)\n    {\n        return $this->fields->has($name);\n    }\n\n    /**\n     * Removes a field from the form.\n     *\n     * @param string $name The field name\n     *\n     * @throws \\InvalidArgumentException when the name is malformed\n     *\n     * @api\n     */\n    public function remove($name)\n    {\n        $this->fields->remove($name);\n    }\n\n    /**\n     * Gets a named field.\n     *\n     * @param string $name The field name\n     *\n     * @return FormField The field instance\n     *\n     * @throws \\InvalidArgumentException When field is not present in this form\n     *\n     * @api\n     */\n    public function get($name)\n    {\n        return $this->fields->get($name);\n    }\n\n    /**\n     * Sets a named field.\n     *\n     * @param FormField $field The field\n     *\n     * @api\n     */\n    public function set(FormField $field)\n    {\n        $this->fields->add($field);\n    }\n\n    /**\n     * Gets all fields.\n     *\n     * @return array An array of fields\n     *\n     * @api\n     */\n    public function all()\n    {\n        return $this->fields->all();\n    }\n\n    /**\n     * Returns true if the named field exists.\n     *\n     * @param string $name The field name\n     *\n     * @return Boolean true if the field exists, false otherwise\n     */\n    public function offsetExists($name)\n    {\n        return $this->has($name);\n    }\n\n    /**\n     * Gets the value of a field.\n     *\n     * @param string $name The field name\n     *\n     * @return FormField The associated Field instance\n     *\n     * @throws \\InvalidArgumentException if the field does not exist\n     */\n    public function offsetGet($name)\n    {\n        return $this->fields->get($name);\n    }\n\n    /**\n     * Sets the value of a field.\n     *\n     * @param string       $name  The field name\n     * @param string|array $value The value of the field\n     *\n     * @throws \\InvalidArgumentException if the field does not exist\n     */\n    public function offsetSet($name, $value)\n    {\n        $this->fields->set($name, $value);\n    }\n\n    /**\n     * Removes a field from the form.\n     *\n     * @param string $name The field name\n     */\n    public function offsetUnset($name)\n    {\n        $this->fields->remove($name);\n    }\n\n    protected function setNode(\\DOMNode $node)\n    {\n        $this->button = $node;\n        if ('button' == $node->nodeName || ('input' == $node->nodeName && in_array($node->getAttribute('type'), array('submit', 'button', 'image')))) {\n            do {\n                // use the ancestor form element\n                if (null === $node = $node->parentNode) {\n                    throw new \\LogicException('The selected node does not have a form ancestor.');\n                }\n            } while ('form' != $node->nodeName);\n        } elseif ('form' != $node->nodeName) {\n            throw new \\LogicException(sprintf('Unable to submit on a \"%s\" tag.', $node->nodeName));\n        }\n\n        $this->node = $node;\n    }\n\n    private function initialize()\n    {\n        $this->fields = new FormFieldRegistry();\n\n        $document = new \\DOMDocument('1.0', 'UTF-8');\n        $node = $document->importNode($this->node, true);\n        $button = $document->importNode($this->button, true);\n        $root = $document->appendChild($document->createElement('_root'));\n        $root->appendChild($node);\n        $root->appendChild($button);\n        $xpath = new \\DOMXPath($document);\n\n        foreach ($xpath->query('descendant::input | descendant::textarea | descendant::select', $root) as $node) {\n            if (!$node->hasAttribute('name')) {\n                continue;\n            }\n\n            $nodeName = $node->nodeName;\n\n            if ($node === $button) {\n                $this->set(new Field\\InputFormField($node));\n            } elseif ('select' == $nodeName || 'input' == $nodeName && 'checkbox' == $node->getAttribute('type')) {\n                $this->set(new Field\\ChoiceFormField($node));\n            } elseif ('input' == $nodeName && 'radio' == $node->getAttribute('type')) {\n                if ($this->has($node->getAttribute('name'))) {\n                    $this->get($node->getAttribute('name'))->addChoice($node);\n                } else {\n                    $this->set(new Field\\ChoiceFormField($node));\n                }\n            } elseif ('input' == $nodeName && 'file' == $node->getAttribute('type')) {\n                $this->set(new Field\\FileFormField($node));\n            } elseif ('input' == $nodeName && !in_array($node->getAttribute('type'), array('submit', 'button', 'image'))) {\n                $this->set(new Field\\InputFormField($node));\n            } elseif ('textarea' == $nodeName) {\n                $this->set(new Field\\TextareaFormField($node));\n            }\n        }\n    }\n}\n\nclass FormFieldRegistry\n{\n    private $fields = array();\n\n    private $base;\n\n    /**\n     * Adds a field to the registry.\n     *\n     * @param FormField $field The field\n     *\n     * @throws \\InvalidArgumentException when the name is malformed\n     */\n    public function add(FormField $field)\n    {\n        $segments = $this->getSegments($field->getName());\n\n        $target =& $this->fields;\n        while ($segments) {\n            if (!is_array($target)) {\n                $target = array();\n            }\n            $path = array_shift($segments);\n            if ('' === $path) {\n                $target =& $target[];\n            } else {\n                $target =& $target[$path];\n            }\n        }\n        $target = $field;\n    }\n\n    /**\n     * Removes a field and its children from the registry.\n     *\n     * @param string $name The fully qualified name of the base field\n     *\n     * @throws \\InvalidArgumentException when the name is malformed\n     */\n    public function remove($name)\n    {\n        $segments = $this->getSegments($name);\n        $target =& $this->fields;\n        while (count($segments) > 1) {\n            $path = array_shift($segments);\n            if (!array_key_exists($path, $target)) {\n                return;\n            }\n            $target =& $target[$path];\n        }\n        unset($target[array_shift($segments)]);\n    }\n\n    /**\n     * Returns the value of the field and its children.\n     *\n     * @param string $name The fully qualified name of the field\n     *\n     * @return mixed The value of the field\n     *\n     * @throws \\InvalidArgumentException when the name is malformed\n     * @throws \\InvalidArgumentException if the field does not exist\n     */\n    public function &get($name)\n    {\n        $segments = $this->getSegments($name);\n        $target =& $this->fields;\n        while ($segments) {\n            $path = array_shift($segments);\n            if (!array_key_exists($path, $target)) {\n                throw new \\InvalidArgumentException(sprintf('Unreachable field \"%s\"', $path));\n            }\n            $target =& $target[$path];\n        }\n\n        return $target;\n    }\n\n    /**\n     * Tests whether the form has the given field.\n     *\n     * @param string $name The fully qualified name of the field\n     *\n     * @return Boolean Whether the form has the given field\n     */\n    public function has($name)\n    {\n        try {\n            $this->get($name);\n\n            return true;\n        } catch (\\InvalidArgumentException $e) {\n            return false;\n        }\n    }\n\n    /**\n     * Set the value of a field and its children.\n     *\n     * @param string $name  The fully qualified name of the field\n     * @param mixed  $value The value\n     *\n     * @throws \\InvalidArgumentException when the name is malformed\n     * @throws \\InvalidArgumentException if the field does not exist\n     */\n    public function set($name, $value)\n    {\n        $target =& $this->get($name);\n        if (is_array($value)) {\n            $fields = self::create($name, $value);\n            foreach ($fields->all() as $k => $v) {\n                $this->set($k, $v);\n            }\n        } else {\n            $target->setValue($value);\n        }\n    }\n\n    /**\n     * Returns the list of field with their value.\n     *\n     * @return array The list of fields as array((string) Fully qualified name => (mixed) value)\n     */\n    public function all()\n    {\n        return $this->walk($this->fields, $this->base);\n    }\n\n    /**\n     * Creates an instance of the class.\n     *\n     * This function is made private because it allows overriding the $base and\n     * the $values properties without any type checking.\n     *\n     * @param string $base   The fully qualified name of the base field\n     * @param array  $values The values of the fields\n     *\n     * @return FormFieldRegistry\n     */\n    static private function create($base, array $values)\n    {\n        $registry = new static();\n        $registry->base = $base;\n        $registry->fields = $values;\n\n        return $registry;\n    }\n\n    /**\n     * Transforms a PHP array in a list of fully qualified name / value.\n     *\n     * @param array  $array  The PHP array\n     * @param string $base   The name of the base field\n     * @param array  $output The initial values\n     *\n     * @return array The list of fields as array((string) Fully qualified name => (mixed) value)\n     */\n    private function walk(array $array, $base = '', array &$output = array())\n    {\n        foreach ($array as $k => $v) {\n            $path = empty($base) ? $k : sprintf(\"%s[%s]\", $base, $k);\n            if (is_array($v)) {\n                $this->walk($v, $path, $output);\n            } else {\n                $output[$path] = $v;\n            }\n        }\n\n        return $output;\n    }\n\n    /**\n     * Splits a field name into segments as a web browser would do.\n     *\n     * <code>\n     *     getSegments('base[foo][3][]') = array('base', 'foo, '3', '');\n     * </code>\n     *\n     * @param string $name The name of the field\n     *\n     * @return array The list of segments\n     *\n     * @throws \\InvalidArgumentException when the name is malformed\n     */\n    private function getSegments($name)\n    {\n        if (preg_match('/^(?P<base>[^[]+)(?P<extra>(\\[.*)|$)/', $name, $m)) {\n            $segments = array($m['base']);\n            while (preg_match('/^\\[(?P<segment>.*?)\\](?P<extra>.*)$/', $m['extra'], $m)) {\n                $segments[] = $m['segment'];\n            }\n\n            return $segments;\n        }\n\n        throw new \\InvalidArgumentException(sprintf('Malformed field path \"%s\"', $name));\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/Model.php",
    "content": "<?php\n/**\n * Object-relational mapper.\n *\n * DBO-backed object data model, for mapping database tables to Cake objects.\n *\n * PHP versions 5\n *\n * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)\n * Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)\n *\n * Licensed under The MIT License\n * Redistributions of files must retain the above copyright notice.\n *\n * @copyright     Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)\n * @link          http://cakephp.org CakePHP(tm) Project\n * @package       Cake.Model\n * @since         CakePHP(tm) v 0.10.0.0\n * @license       MIT License (http://www.opensource.org/licenses/mit-license.php)\n */\n\nApp::uses('ClassRegistry', 'Utility');\nApp::uses('Validation', 'Utility');\nApp::uses('String', 'Utility');\nApp::uses('Set', 'Utility');\nApp::uses('BehaviorCollection', 'Model');\nApp::uses('ModelBehavior', 'Model');\nApp::uses('ConnectionManager', 'Model');\nApp::uses('Xml', 'Utility');\nApp::uses('CakeEvent', 'Event');\nApp::uses('CakeEventListener', 'Event');\nApp::uses('CakeEventManager', 'Event');\n\n/**\n * Object-relational mapper.\n *\n * DBO-backed object data model.\n * Automatically selects a database table name based on a pluralized lowercase object class name\n * (i.e. class 'User' => table 'users'; class 'Man' => table 'men')\n * The table is required to have at least 'id auto_increment' primary key.\n *\n * @package       Cake.Model\n * @link          http://book.cakephp.org/2.0/en/models.html\n */\nclass Model extends Object implements CakeEventListener {\n\n/**\n * The name of the DataSource connection that this Model uses\n *\n * The value must be an attribute name that you defined in `app/Config/database.php`\n * or created using `ConnectionManager::create()`.\n *\n * @var string\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#usedbconfig\n */\n\tpublic $useDbConfig = 'default';\n\n/**\n * Custom database table name, or null/false if no table association is desired.\n *\n * @var string\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#useTable\n */\n\tpublic $useTable = null;\n\n/**\n * Custom display field name. Display fields are used by Scaffold, in SELECT boxes' OPTION elements.\n *\n * This field is also used in `find('list')` when called with no extra parameters in the fields list\n *\n * @var string\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#displayField\n */\n\tpublic $displayField = null;\n\n/**\n * Value of the primary key ID of the record that this model is currently pointing to.\n * Automatically set after database insertions.\n *\n * @var mixed\n */\n\tpublic $id = false;\n\n/**\n * Container for the data that this model gets from persistent storage (usually, a database).\n *\n * @var array\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#data\n */\n\tpublic $data = array();\n\n/**\n * Holds physical schema/database name for this model.  Automatically set during Model creation.\n *\n * @var string\n * @access public\n */\n\tpublic $schemaName = null;\n\n/**\n * Table name for this Model.\n *\n * @var string\n */\n\tpublic $table = false;\n\n/**\n * The name of the primary key field for this model.\n *\n * @var string\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#primaryKey\n */\n\tpublic $primaryKey = null;\n\n/**\n * Field-by-field table metadata.\n *\n * @var array\n */\n\tprotected $_schema = null;\n\n/**\n * List of validation rules. It must be an array with the field name as key and using\n * as value one of the following possibilities\n *\n * ### Validating using regular expressions\n *\n * {{{\n * public $validate = array(\n *     'name' => '/^[a-z].+$/i'\n * );\n * }}}\n *\n * ### Validating using methods (no parameters)\n *\n * {{{\n * public $validate = array(\n *     'name' => 'notEmpty'\n * );\n * }}}\n *\n * ### Validating using methods (with parameters)\n *\n * {{{\n * public $validate = array(\n *     'age' => array(\n *         'rule' => array('between', 5, 25)\n *     )\n * );\n * }}}\n *\n * ### Validating using custom method\n *\n * {{{\n * public $validate = array(\n *     'password' => array(\n *         'rule' => array('customValidation')\n *     )\n * );\n * public function customValidation($data) {\n *     // $data will contain array('password' => 'value')\n *     if (isset($this->data[$this->alias]['password2'])) {\n *         return $this->data[$this->alias]['password2'] === current($data);\n *     }\n *     return true;\n * }\n * }}}\n *\n * ### Validations with messages\n *\n * The messages will be used in Model::$validationErrors and can be used in the FormHelper\n *\n * {{{\n * public $validate = array(\n *     'age' => array(\n *         'rule' => array('between', 5, 25),\n *         'message' => array('The age must be between %d and %d.')\n *     )\n * );\n * }}}\n *\n * ### Multiple validations to the same field\n *\n * {{{\n * public $validate = array(\n *     'login' => array(\n *         array(\n *             'rule' => 'alphaNumeric',\n *             'message' => 'Only alphabets and numbers allowed',\n *             'last' => true\n *         ),\n *         array(\n *             'rule' => array('minLength', 8),\n *             'message' => array('Minimum length of %d characters')\n *         )\n *     )\n * );\n * }}}\n *\n * ### Valid keys in validations\n *\n * - `rule`: String with method name, regular expression (started by slash) or array with method and parameters\n * - `message`: String with the message or array if have multiple parameters. See http://php.net/sprintf\n * - `last`: Boolean value to indicate if continue validating the others rules if the current fail [Default: true]\n * - `required`: Boolean value to indicate if the field must be present on save\n * - `allowEmpty`: Boolean value to indicate if the field can be empty\n * - `on`: Possible values: `update`, `create`. Indicate to apply this rule only on update or create\n *\n * @var array\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#validate\n * @link http://book.cakephp.org/2.0/en/models/data-validation.html\n */\n\tpublic $validate = array();\n\n/**\n * List of validation errors.\n *\n * @var array\n */\n\tpublic $validationErrors = array();\n\n/**\n * Name of the validation string domain to use when translating validation errors.\n *\n * @var string\n */\n\tpublic $validationDomain = null;\n\n/**\n * Database table prefix for tables in model.\n *\n * @var string\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#tableprefix\n */\n\tpublic $tablePrefix = null;\n\n/**\n * Name of the model.\n *\n * @var string\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#name\n */\n\tpublic $name = null;\n\n/**\n * Alias name for model.\n *\n * @var string\n */\n\tpublic $alias = null;\n\n/**\n * List of table names included in the model description. Used for associations.\n *\n * @var array\n */\n\tpublic $tableToModel = array();\n\n/**\n * Whether or not to cache queries for this model.  This enables in-memory\n * caching only, the results are not stored beyond the current request.\n *\n * @var boolean\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#cacheQueries\n */\n\tpublic $cacheQueries = false;\n\n/**\n * Detailed list of belongsTo associations.\n *\n * ### Basic usage\n *\n * `public $belongsTo = array('Group', 'Department');`\n *\n * ### Detailed configuration\n *\n * {{{\n * public $belongsTo = array(\n *     'Group',\n *     'Department' => array(\n *         'className' => 'Department',\n *         'foreignKey' => 'department_id'\n *     )\n * );\n * }}}\n *\n * ### Possible keys in association\n *\n * - `className`: the classname of the model being associated to the current model.\n *   If you're defining a 'Profile belongsTo User' relationship, the className key should equal 'User.'\n * - `foreignKey`: the name of the foreign key found in the current model. This is\n *   especially handy if you need to define multiple belongsTo relationships. The default\n *   value for this key is the underscored, singular name of the other model, suffixed with '_id'.\n * - `conditions`: An SQL fragment used to filter related model records. It's good\n *   practice to use model names in SQL fragments: 'User.active = 1' is always\n *   better than just 'active = 1.'\n * - `type`: the type of the join to use in the SQL query, default is LEFT which\n *   may not fit your needs in all situations, INNER may be helpful when you want\n *   everything from your main and associated models or nothing at all!(effective\n *   when used with some conditions of course). (NB: type value is in lower case - i.e. left, inner)\n * - `fields`: A list of fields to be retrieved when the associated model data is\n *   fetched. Returns all fields by default.\n * - `order`: An SQL fragment that defines the sorting order for the returned associated rows.\n * - `counterCache`: If set to true the associated Model will automatically increase or\n *   decrease the \"[singular_model_name]_count\" field in the foreign table whenever you do\n *   a save() or delete(). If its a string then its the field name to use. The value in the\n *   counter field represents the number of related rows.\n * - `counterScope`: Optional conditions array to use for updating counter cache field.\n *\n * @var array\n * @link http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#belongsto\n */\n\tpublic $belongsTo = array();\n\n/**\n * Detailed list of hasOne associations.\n *\n * ### Basic usage\n *\n * `public $hasOne = array('Profile', 'Address');`\n *\n * ### Detailed configuration\n *\n * {{{\n * public $hasOne = array(\n *     'Profile',\n *     'Address' => array(\n *         'className' => 'Address',\n *         'foreignKey' => 'user_id'\n *     )\n * );\n * }}}\n *\n * ### Possible keys in association\n *\n * - `className`: the classname of the model being associated to the current model.\n *   If you're defining a 'User hasOne Profile' relationship, the className key should equal 'Profile.'\n * - `foreignKey`: the name of the foreign key found in the other model. This is\n *   especially handy if you need to define multiple hasOne relationships.\n *   The default value for this key is the underscored, singular name of the\n *   current model, suffixed with '_id'. In the example above it would default to 'user_id'.\n * - `conditions`: An SQL fragment used to filter related model records. It's good\n *   practice to use model names in SQL fragments: \"Profile.approved = 1\" is\n *   always better than just \"approved = 1.\"\n * - `fields`: A list of fields to be retrieved when the associated model data is\n *   fetched. Returns all fields by default.\n * - `order`: An SQL fragment that defines the sorting order for the returned associated rows.\n * - `dependent`: When the dependent key is set to true, and the model's delete()\n *   method is called with the cascade parameter set to true, associated model\n *   records are also deleted. In this case we set it true so that deleting a\n *   User will also delete her associated Profile.\n *\n * @var array\n * @link http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasone\n */\n\tpublic $hasOne = array();\n\n/**\n * Detailed list of hasMany associations.\n *\n * ### Basic usage\n *\n * `public $hasMany = array('Comment', 'Task');`\n *\n * ### Detailed configuration\n *\n * {{{\n * public $hasMany = array(\n *     'Comment',\n *     'Task' => array(\n *         'className' => 'Task',\n *         'foreignKey' => 'user_id'\n *     )\n * );\n * }}}\n *\n * ### Possible keys in association\n *\n * - `className`: the classname of the model being associated to the current model.\n *   If you're defining a 'User hasMany Comment' relationship, the className key should equal 'Comment.'\n * - `foreignKey`: the name of the foreign key found in the other model. This is\n *   especially handy if you need to define multiple hasMany relationships. The default\n *   value for this key is the underscored, singular name of the actual model, suffixed with '_id'.\n * - `conditions`: An SQL fragment used to filter related model records. It's good\n *   practice to use model names in SQL fragments: \"Comment.status = 1\" is always\n *   better than just \"status = 1.\"\n * - `fields`: A list of fields to be retrieved when the associated model data is\n *   fetched. Returns all fields by default.\n * - `order`: An SQL fragment that defines the sorting order for the returned associated rows.\n * - `limit`: The maximum number of associated rows you want returned.\n * - `offset`: The number of associated rows to skip over (given the current\n *   conditions and order) before fetching and associating.\n * - `dependent`: When dependent is set to true, recursive model deletion is\n *   possible. In this example, Comment records will be deleted when their\n *   associated User record has been deleted.\n * - `exclusive`: When exclusive is set to true, recursive model deletion does\n *   the delete with a deleteAll() call, instead of deleting each entity separately.\n *   This greatly improves performance, but may not be ideal for all circumstances.\n * - `finderQuery`: A complete SQL query CakePHP can use to fetch associated model\n *   records. This should be used in situations that require very custom results.\n *\n * @var array\n * @link http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany\n */\n\tpublic $hasMany = array();\n\n/**\n * Detailed list of hasAndBelongsToMany associations.\n *\n * ### Basic usage\n *\n * `public $hasAndBelongsToMany = array('Role', 'Address');`\n *\n * ### Detailed configuration\n *\n * {{{\n * public $hasAndBelongsToMany = array(\n *     'Role',\n *     'Address' => array(\n *         'className' => 'Address',\n *         'foreignKey' => 'user_id',\n *         'associationForeignKey' => 'address_id',\n *         'joinTable' => 'addresses_users'\n *     )\n * );\n * }}}\n *\n * ### Possible keys in association\n *\n * - `className`: the classname of the model being associated to the current model.\n *   If you're defining a 'Recipe HABTM Tag' relationship, the className key should equal 'Tag.'\n * - `joinTable`: The name of the join table used in this association (if the\n *   current table doesn't adhere to the naming convention for HABTM join tables).\n * - `with`: Defines the name of the model for the join table. By default CakePHP\n *   will auto-create a model for you. Using the example above it would be called\n *   RecipesTag. By using this key you can override this default name. The join\n *   table model can be used just like any \"regular\" model to access the join table directly.\n * - `foreignKey`: the name of the foreign key found in the current model.\n *   This is especially handy if you need to define multiple HABTM relationships.\n *   The default value for this key is the underscored, singular name of the\n *   current model, suffixed with '_id'.\n * - `associationForeignKey`: the name of the foreign key found in the other model.\n *   This is especially handy if you need to define multiple HABTM relationships.\n *   The default value for this key is the underscored, singular name of the other\n *   model, suffixed with '_id'.\n * - `unique`: If true (default value) cake will first delete existing relationship\n *   records in the foreign keys table before inserting new ones, when updating a\n *   record. So existing associations need to be passed again when updating.\n *   To prevent deletion of existing relationship records, set this key to a string 'keepExisting'.\n * - `conditions`: An SQL fragment used to filter related model records. It's good\n *   practice to use model names in SQL fragments: \"Comment.status = 1\" is always\n *   better than just \"status = 1.\"\n * - `fields`: A list of fields to be retrieved when the associated model data is\n *   fetched. Returns all fields by default.\n * - `order`: An SQL fragment that defines the sorting order for the returned associated rows.\n * - `limit`: The maximum number of associated rows you want returned.\n * - `offset`: The number of associated rows to skip over (given the current\n *   conditions and order) before fetching and associating.\n * - `finderQuery`, `deleteQuery`, `insertQuery`: A complete SQL query CakePHP\n *   can use to fetch, delete, or create new associated model records. This should\n *   be used in situations that require very custom results.\n *\n * @var array\n * @link http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm\n */\n\tpublic $hasAndBelongsToMany = array();\n\n/**\n * List of behaviors to load when the model object is initialized. Settings can be\n * passed to behaviors by using the behavior name as index. Eg:\n *\n * public $actsAs = array('Translate', 'MyBehavior' => array('setting1' => 'value1'))\n *\n * @var array\n * @link http://book.cakephp.org/2.0/en/models/behaviors.html#using-behaviors\n */\n\tpublic $actsAs = null;\n\n/**\n * Holds the Behavior objects currently bound to this model.\n *\n * @var BehaviorCollection\n */\n\tpublic $Behaviors = null;\n\n/**\n * Whitelist of fields allowed to be saved.\n *\n * @var array\n */\n\tpublic $whitelist = array();\n\n/**\n * Whether or not to cache sources for this model.\n *\n * @var boolean\n */\n\tpublic $cacheSources = true;\n\n/**\n * Type of find query currently executing.\n *\n * @var string\n */\n\tpublic $findQueryType = null;\n\n/**\n * Number of associations to recurse through during find calls. Fetches only\n * the first level by default.\n *\n * @var integer\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#recursive\n */\n\tpublic $recursive = 1;\n\n/**\n * The column name(s) and direction(s) to order find results by default.\n *\n * public $order = \"Post.created DESC\";\n * public $order = array(\"Post.view_count DESC\", \"Post.rating DESC\");\n *\n * @var string\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#order\n */\n\tpublic $order = null;\n\n/**\n * Array of virtual fields this model has.  Virtual fields are aliased\n * SQL expressions. Fields added to this property will be read as other fields in a model\n * but will not be saveable.\n *\n * `public $virtualFields = array('two' => '1 + 1');`\n *\n * Is a simplistic example of how to set virtualFields\n *\n * @var array\n * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#virtualfields\n */\n\tpublic $virtualFields = array();\n\n/**\n * Default list of association keys.\n *\n * @var array\n */\n\tprotected $_associationKeys = array(\n\t\t'belongsTo' => array('className', 'foreignKey', 'conditions', 'fields', 'order', 'counterCache'),\n\t\t'hasOne' => array('className', 'foreignKey', 'conditions', 'fields', 'order', 'dependent'),\n\t\t'hasMany' => array('className', 'foreignKey', 'conditions', 'fields', 'order', 'limit', 'offset', 'dependent', 'exclusive', 'finderQuery', 'counterQuery'),\n\t\t'hasAndBelongsToMany' => array('className', 'joinTable', 'with', 'foreignKey', 'associationForeignKey', 'conditions', 'fields', 'order', 'limit', 'offset', 'unique', 'finderQuery', 'deleteQuery', 'insertQuery')\n\t);\n\n/**\n * Holds provided/generated association key names and other data for all associations.\n *\n * @var array\n */\n\tprotected $_associations = array('belongsTo', 'hasOne', 'hasMany', 'hasAndBelongsToMany');\n\n/**\n * Holds model associations temporarily to allow for dynamic (un)binding.\n *\n * @var array\n */\n\tpublic $__backAssociation = array();\n\n/**\n * Back inner association\n *\n * @var array\n */\n\tpublic $__backInnerAssociation = array();\n\n/**\n * Back original association\n *\n * @var array\n */\n\tpublic $__backOriginalAssociation = array();\n\n/**\n * Back containable association\n *\n * @var array\n */\n\tpublic $__backContainableAssociation = array();\n\n/**\n * The ID of the model record that was last inserted.\n *\n * @var integer\n */\n\tprotected $_insertID = null;\n\n/**\n * Has the datasource been configured.\n *\n * @var boolean\n * @see Model::getDataSource\n */\n\tprotected $_sourceConfigured = false;\n\n/**\n * List of valid finder method options, supplied as the first parameter to find().\n *\n * @var array\n */\n\tpublic $findMethods = array(\n\t\t'all' => true, 'first' => true, 'count' => true,\n\t\t'neighbors' => true, 'list' => true, 'threaded' => true\n\t);\n\n/**\n * Instance of the CakeEventManager this model is using\n * to dispatch inner events.\n *\n * @var CakeEventManager\n */\n\tprotected $_eventManager = null;\n\n/**\n * Constructor. Binds the model's database table to the object.\n *\n * If `$id` is an array it can be used to pass several options into the model.\n *\n * - id - The id to start the model on.\n * - table - The table to use for this model.\n * - ds - The connection name this model is connected to.\n * - name - The name of the model eg. Post.\n * - alias - The alias of the model, this is used for registering the instance in the `ClassRegistry`.\n *   eg. `ParentThread`\n *\n * ### Overriding Model's __construct method.\n *\n * When overriding Model::__construct() be careful to include and pass in all 3 of the\n * arguments to `parent::__construct($id, $table, $ds);`\n *\n * ### Dynamically creating models\n *\n * You can dynamically create model instances using the $id array syntax.\n *\n * {{{\n * $Post = new Model(array('table' => 'posts', 'name' => 'Post', 'ds' => 'connection2'));\n * }}}\n *\n * Would create a model attached to the posts table on connection2.  Dynamic model creation is useful\n * when you want a model object that contains no associations or attached behaviors.\n *\n * @param mixed $id Set this ID for this model on startup, can also be an array of options, see above.\n * @param string $table Name of database table to use.\n * @param string $ds DataSource connection name.\n */\n\tpublic function __construct($id = false, $table = null, $ds = null) {\n\t\tparent::__construct();\n\n\t\tif (is_array($id)) {\n\t\t\textract(array_merge(\n\t\t\t\tarray(\n\t\t\t\t\t'id' => $this->id, 'table' => $this->useTable, 'ds' => $this->useDbConfig,\n\t\t\t\t\t'name' => $this->name, 'alias' => $this->alias\n\t\t\t\t),\n\t\t\t\t$id\n\t\t\t));\n\t\t}\n\n\t\tif ($this->name === null) {\n\t\t\t$this->name = (isset($name) ? $name : get_class($this));\n\t\t}\n\n\t\tif ($this->alias === null) {\n\t\t\t$this->alias = (isset($alias) ? $alias : $this->name);\n\t\t}\n\n\t\tif ($this->primaryKey === null) {\n\t\t\t$this->primaryKey = 'id';\n\t\t}\n\n\t\tClassRegistry::addObject($this->alias, $this);\n\n\t\t$this->id = $id;\n\t\tunset($id);\n\n\t\tif ($table === false) {\n\t\t\t$this->useTable = false;\n\t\t} elseif ($table) {\n\t\t\t$this->useTable = $table;\n\t\t}\n\n\t\tif ($ds !== null) {\n\t\t\t$this->useDbConfig = $ds;\n\t\t}\n\n\t\tif (is_subclass_of($this, 'AppModel')) {\n\t\t\t$merge = array('actsAs', 'findMethods');\n\t\t\t$parentClass = get_parent_class($this);\n\t\t\tif ($parentClass !== 'AppModel') {\n\t\t\t\t$this->_mergeVars($merge, $parentClass);\n\t\t\t}\n\t\t\t$this->_mergeVars($merge, 'AppModel');\n\t\t}\n\t\t$this->_mergeVars(array('findMethods'), 'Model');\n\n\t\t$this->Behaviors = new BehaviorCollection();\n\n\t\tif ($this->useTable !== false) {\n\n\t\t\tif ($this->useTable === null) {\n\t\t\t\t$this->useTable = Inflector::tableize($this->name);\n\t\t\t}\n\n\t\t\tif ($this->displayField == null) {\n\t\t\t\tunset($this->displayField);\n\t\t\t}\n\t\t\t$this->table = $this->useTable;\n\t\t\t$this->tableToModel[$this->table] = $this->alias;\n\t\t} elseif ($this->table === false) {\n\t\t\t$this->table = Inflector::tableize($this->name);\n\t\t}\n\n\t\tif ($this->tablePrefix === null) {\n\t\t\tunset($this->tablePrefix);\n\t\t}\n\n\t\t$this->_createLinks();\n\t\t$this->Behaviors->init($this->alias, $this->actsAs);\n\t}\n\n/**\n * Returns a list of all events that will fire in the model during it's lifecycle.\n * You can override this function to add you own listener callbacks\n *\n * @return array\n */\n\tpublic function implementedEvents() {\n\t\treturn array(\n\t\t\t'Model.beforeFind' => array('callable' => 'beforeFind', 'passParams' => true),\n\t\t\t'Model.afterFind' => array('callable' => 'afterFind', 'passParams' => true),\n\t\t\t'Model.beforeValidate' => array('callable' => 'beforeValidate', 'passParams' => true),\n\t\t\t'Model.beforeSave' => array('callable' => 'beforeSave', 'passParams' => true),\n\t\t\t'Model.afterSave' => array('callable' => 'afterSave', 'passParams' => true),\n\t\t\t'Model.beforeDelete' => array('callable' => 'beforeDelete', 'passParams' => true),\n\t\t\t'Model.afterDelete' => array('callable' => 'afterDelete'),\n\t\t);\n\t}\n\n/**\n * Returns the CakeEventManager manager instance that is handling any callbacks.\n * You can use this instance to register any new listeners or callbacks to the\n * model events, or create your own events and trigger them at will.\n *\n * @return CakeEventManager\n */\n\tpublic function getEventManager() {\n\t\tif (empty($this->_eventManager)) {\n\t\t\t$this->_eventManager = new CakeEventManager();\n\t\t\t$this->_eventManager->attach($this->Behaviors);\n\t\t\t$this->_eventManager->attach($this);\n\t\t}\n\t\treturn $this->_eventManager;\n\t}\n\n/**\n * Handles custom method calls, like findBy<field> for DB models,\n * and custom RPC calls for remote data sources.\n *\n * @param string $method Name of method to call.\n * @param array $params Parameters for the method.\n * @return mixed Whatever is returned by called method\n */\n\tpublic function __call($method, $params) {\n\t\t$result = $this->Behaviors->dispatchMethod($this, $method, $params);\n\t\tif ($result !== array('unhandled')) {\n\t\t\treturn $result;\n\t\t}\n\t\t$return = $this->getDataSource()->query($method, $params, $this);\n\t\treturn $return;\n\t}\n\n/**\n * Handles the lazy loading of model associations by looking in the association arrays for the requested variable\n *\n * @param string $name variable tested for existence in class\n * @return boolean true if the variable exists (if is a not loaded model association it will be created), false otherwise\n */\n\tpublic function __isset($name) {\n\t\t$className = false;\n\n\t\tforeach ($this->_associations as $type) {\n\t\t\tif (isset($name, $this->{$type}[$name])) {\n\t\t\t\t$className = empty($this->{$type}[$name]['className']) ? $name : $this->{$type}[$name]['className'];\n\t\t\t\tbreak;\n\t\t\t} elseif (isset($name, $this->__backAssociation[$type][$name])) {\n\t\t\t\t$className = empty($this->__backAssociation[$type][$name]['className']) ?\n\t\t\t\t\t$name : $this->__backAssociation[$type][$name]['className'];\n\t\t\t\tbreak;\n\t\t\t} elseif ($type == 'hasAndBelongsToMany') {\n\t\t\t\tforeach ($this->{$type} as $k => $relation) {\n\t\t\t\t\tif (empty($relation['with'])) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (is_array($relation['with'])) {\n\t\t\t\t\t\tif (key($relation['with']) === $name) {\n\t\t\t\t\t\t\t$className = $name;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlist($plugin, $class) = pluginSplit($relation['with']);\n\t\t\t\t\t\tif ($class === $name) {\n\t\t\t\t\t\t\t$className = $relation['with'];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ($className) {\n\t\t\t\t\t\t$assocKey = $k;\n\t\t\t\t\t\t$dynamic = !empty($relation['dynamicWith']);\n\t\t\t\t\t\tbreak(2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!$className) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlist($plugin, $className) = pluginSplit($className);\n\n\t\tif (!ClassRegistry::isKeySet($className) && !empty($dynamic)) {\n\t\t\t$this->{$className} = new AppModel(array(\n\t\t\t\t'name' => $className,\n\t\t\t\t'table' => $this->hasAndBelongsToMany[$assocKey]['joinTable'],\n\t\t\t\t'ds' => $this->useDbConfig\n\t\t\t));\n\t\t} else {\n\t\t\t$this->_constructLinkedModel($name, $className, $plugin);\n\t\t}\n\n\t\tif (!empty($assocKey)) {\n\t\t\t$this->hasAndBelongsToMany[$assocKey]['joinTable'] = $this->{$name}->table;\n\t\t\tif (count($this->{$name}->schema()) <= 2 && $this->{$name}->primaryKey !== false) {\n\t\t\t\t$this->{$name}->primaryKey = $this->hasAndBelongsToMany[$assocKey]['foreignKey'];\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n/**\n * Returns the value of the requested variable if it can be set by __isset()\n *\n * @param string $name variable requested for it's value or reference\n * @return mixed value of requested variable if it is set\n */\n\tpublic function __get($name) {\n\t\tif ($name === 'displayField') {\n\t\t\treturn $this->displayField = $this->hasField(array('title', 'name', $this->primaryKey));\n\t\t}\n\t\tif ($name === 'tablePrefix') {\n\t\t\t$this->setDataSource();\n\t\t\tif (property_exists($this, 'tablePrefix') && !empty($this->tablePrefix)) {\n\t\t\t\treturn $this->tablePrefix;\n\t\t\t}\n\t\t\treturn $this->tablePrefix = null;\n\t\t}\n\t\tif (isset($this->{$name})) {\n\t\t\treturn $this->{$name};\n\t\t}\n\t}\n\n/**\n * Bind model associations on the fly.\n *\n * If `$reset` is false, association will not be reset\n * to the originals defined in the model\n *\n * Example: Add a new hasOne binding to the Profile model not\n * defined in the model source code:\n *\n * `$this->User->bindModel( array('hasOne' => array('Profile')) );`\n *\n * Bindings that are not made permanent will be reset by the next Model::find() call on this\n * model.\n *\n * @param array $params Set of bindings (indexed by binding type)\n * @param boolean $reset Set to false to make the binding permanent\n * @return boolean Success\n * @link http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#creating-and-destroying-associations-on-the-fly\n */\n\tpublic function bindModel($params, $reset = true) {\n\t\tforeach ($params as $assoc => $model) {\n\t\t\tif ($reset === true && !isset($this->__backAssociation[$assoc])) {\n\t\t\t\t$this->__backAssociation[$assoc] = $this->{$assoc};\n\t\t\t}\n\t\t\tforeach ($model as $key => $value) {\n\t\t\t\t$assocName = $key;\n\n\t\t\t\tif (is_numeric($key)) {\n\t\t\t\t\t$assocName = $value;\n\t\t\t\t\t$value = array();\n\t\t\t\t}\n\t\t\t\t$this->{$assoc}[$assocName] = $value;\n\t\t\t\tif (property_exists($this, $assocName)) {\n\t\t\t\t\tunset($this->{$assocName});\n\t\t\t\t}\n\t\t\t\tif ($reset === false && isset($this->__backAssociation[$assoc])) {\n\t\t\t\t\t$this->__backAssociation[$assoc][$assocName] = $value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$this->_createLinks();\n\t\treturn true;\n\t}\n\n/**\n * Turn off associations on the fly.\n *\n * If $reset is false, association will not be reset\n * to the originals defined in the model\n *\n * Example: Turn off the associated Model Support request,\n * to temporarily lighten the User model:\n *\n * `$this->User->unbindModel( array('hasMany' => array('Supportrequest')) );`\n *\n * unbound models that are not made permanent will reset with the next call to Model::find()\n *\n * @param array $params Set of bindings to unbind (indexed by binding type)\n * @param boolean $reset  Set to false to make the unbinding permanent\n * @return boolean Success\n * @link http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#creating-and-destroying-associations-on-the-fly\n */\n\tpublic function unbindModel($params, $reset = true) {\n\t\tforeach ($params as $assoc => $models) {\n\t\t\tif ($reset === true && !isset($this->__backAssociation[$assoc])) {\n\t\t\t\t$this->__backAssociation[$assoc] = $this->{$assoc};\n\t\t\t}\n\t\t\tforeach ($models as $model) {\n\t\t\t\tif ($reset === false && isset($this->__backAssociation[$assoc][$model])) {\n\t\t\t\t\tunset($this->__backAssociation[$assoc][$model]);\n\t\t\t\t}\n\t\t\t\tunset($this->{$assoc}[$model]);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n/**\n * Create a set of associations.\n *\n * @return void\n */\n\tprotected function _createLinks() {\n\t\tforeach ($this->_associations as $type) {\n\t\t\tif (!is_array($this->{$type})) {\n\t\t\t\t$this->{$type} = explode(',', $this->{$type});\n\n\t\t\t\tforeach ($this->{$type} as $i => $className) {\n\t\t\t\t\t$className = trim($className);\n\t\t\t\t\tunset ($this->{$type}[$i]);\n\t\t\t\t\t$this->{$type}[$className] = array();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!empty($this->{$type})) {\n\t\t\t\tforeach ($this->{$type} as $assoc => $value) {\n\t\t\t\t\t$plugin = null;\n\n\t\t\t\t\tif (is_numeric($assoc)) {\n\t\t\t\t\t\tunset ($this->{$type}[$assoc]);\n\t\t\t\t\t\t$assoc = $value;\n\t\t\t\t\t\t$value = array();\n\n\t\t\t\t\t\tif (strpos($assoc, '.') !== false) {\n\t\t\t\t\t\t\tlist($plugin, $assoc) = pluginSplit($assoc);\n\t\t\t\t\t\t\t$this->{$type}[$assoc] = array('className' => $plugin . '.' . $assoc);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this->{$type}[$assoc] = $value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$this->_generateAssociation($type, $assoc);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n/**\n * Protected helper method to create associated models of a given class.\n *\n * @param string $assoc Association name\n * @param string $className Class name\n * @param string $plugin name of the plugin where $className is located\n * \texamples: public $hasMany = array('Assoc' => array('className' => 'ModelName'));\n * \t\t\t\t\tusage: $this->Assoc->modelMethods();\n *\n * \t\t\t\tpublic $hasMany = array('ModelName');\n * \t\t\t\t\tusage: $this->ModelName->modelMethods();\n * @return void\n */\n\tprotected function _constructLinkedModel($assoc, $className = null, $plugin = null) {\n\t\tif (empty($className)) {\n\t\t\t$className = $assoc;\n\t\t}\n\n\t\tif (!isset($this->{$assoc}) || $this->{$assoc}->name !== $className) {\n\t\t\tif ($plugin) {\n\t\t\t\t$plugin .= '.';\n\t\t\t}\n\t\t\t$model = array('class' => $plugin . $className, 'alias' => $assoc);\n\t\t\t$this->{$assoc} = ClassRegistry::init($model);\n\t\t\tif ($plugin) {\n\t\t\t\tClassRegistry::addObject($plugin . $className, $this->{$assoc});\n\t\t\t}\n\t\t\tif ($assoc) {\n\t\t\t\t$this->tableToModel[$this->{$assoc}->table] = $assoc;\n\t\t\t}\n\t\t}\n\t}\n\n/**\n * Build an array-based association from string.\n *\n * @param string $type 'belongsTo', 'hasOne', 'hasMany', 'hasAndBelongsToMany'\n * @param string $assocKey\n * @return void\n */\n\tprotected function _generateAssociation($type, $assocKey) {\n\t\t$class = $assocKey;\n\t\t$dynamicWith = false;\n\n\t\tforeach ($this->_associationKeys[$type] as $key) {\n\n\t\t\tif (!isset($this->{$type}[$assocKey][$key]) || $this->{$type}[$assocKey][$key] === null) {\n\t\t\t\t$data = '';\n\n\t\t\t\tswitch ($key) {\n\t\t\t\t\tcase 'fields':\n\t\t\t\t\t\t$data = '';\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'foreignKey':\n\t\t\t\t\t\t$data = (($type == 'belongsTo') ? Inflector::underscore($assocKey) : Inflector::singularize($this->table)) . '_id';\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'associationForeignKey':\n\t\t\t\t\t\t$data = Inflector::singularize($this->{$class}->table) . '_id';\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'with':\n\t\t\t\t\t\t$data = Inflector::camelize(Inflector::singularize($this->{$type}[$assocKey]['joinTable']));\n\t\t\t\t\t\t$dynamicWith = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'joinTable':\n\t\t\t\t\t\t$tables = array($this->table, $this->{$class}->table);\n\t\t\t\t\t\tsort ($tables);\n\t\t\t\t\t\t$data = $tables[0] . '_' . $tables[1];\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'className':\n\t\t\t\t\t\t$data = $class;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'unique':\n\t\t\t\t\t\t$data = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t$this->{$type}[$assocKey][$key] = $data;\n\t\t\t}\n\n\t\t\tif ($dynamicWith) {\n\t\t\t\t$this->{$type}[$assocKey]['dynamicWith'] = true;\n\t\t\t}\n\n\t\t}\n\t}\n\n/**\n * Sets a custom table for your controller class. Used by your controller to select a database table.\n *\n * @param string $tableName Name of the custom table\n * @throws MissingTableException when database table $tableName is not found on data source\n * @return void\n */\n\tpublic function setSource($tableName) {\n\t\t$this->setDataSource($this->useDbConfig);\n\t\t$db = ConnectionManager::getDataSource($this->useDbConfig);\n\t\t$db->cacheSources = ($this->cacheSources && $db->cacheSources);\n\n\t\tif (method_exists($db, 'listSources')) {\n\t\t\t$sources = $db->listSources();\n\t\t\tif (is_array($sources) && !in_array(strtolower($this->tablePrefix . $tableName), array_map('strtolower', $sources))) {\n\t\t\t\tthrow new MissingTableException(array(\n\t\t\t\t\t'table' => $this->tablePrefix . $tableName,\n\t\t\t\t\t'class' => $this->alias,\n\t\t\t\t\t'ds' => $this->useDbConfig,\n\t\t\t\t));\n\t\t\t}\n\t\t\t$this->_schema = null;\n\t\t}\n\t\t$this->table = $this->useTable = $tableName;\n\t\t$this->tableToModel[$this->table] = $this->alias;\n\t}\n\n/**\n * This function does two things:\n *\n * 1. it scans the array $one for the primary key,\n * and if that's found, it sets the current id to the value of $one[id].\n * For all other keys than 'id' the keys and values of $one are copied to the 'data' property of this object.\n * 2. Returns an array with all of $one's keys and values.\n * (Alternative indata: two strings, which are mangled to\n * a one-item, two-dimensional array using $one for a key and $two as its value.)\n *\n * @param mixed $one Array or string of data\n * @param string $two Value string for the alternative indata method\n * @return array Data with all of $one's keys and values\n * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html\n */\n\tpublic function set($one, $two = null) {\n\t\tif (!$one) {\n\t\t\treturn;\n\t\t}\n\t\tif (is_object($one)) {\n\t\t\tif ($one instanceof SimpleXMLElement || $one instanceof DOMNode) {\n\t\t\t\t$one = $this->_normalizeXmlData(Xml::toArray($one));\n\t\t\t} else {\n\t\t\t\t$one = Set::reverse($one);\n\t\t\t}\n\t\t}\n\n\t\tif (is_array($one)) {\n\t\t\t$data = $one;\n\t\t\tif (empty($one[$this->alias])) {\n\t\t\t\t$data = $this->_setAliasData($one);\n\t\t\t}\n\t\t} else {\n\t\t\t$data = array($this->alias => array($one => $two));\n\t\t}\n\n\t\tforeach ($data as $modelName => $fieldSet) {\n\t\t\tif (is_array($fieldSet)) {\n\n\t\t\t\tforeach ($fieldSet as $fieldName => $fieldValue) {\n\t\t\t\t\tif (isset($this->validationErrors[$fieldName])) {\n\t\t\t\t\t\tunset ($this->validationErrors[$fieldName]);\n\t\t\t\t\t}\n\n\t\t\t\t\tif ($modelName === $this->alias) {\n\t\t\t\t\t\tif ($fieldName === $this->primaryKey) {\n\t\t\t\t\t\t\t$this->id = $fieldValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (is_array($fieldValue) || is_object($fieldValue)) {\n\t\t\t\t\t\t$fieldValue = $this->deconstruct($fieldName, $fieldValue);\n\t\t\t\t\t}\n\t\t\t\t\t$this->data[$modelName][$fieldName] = $fieldValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn $data;\n\t}\n\n/**\n * Move values to alias\n *\n * @param array $data\n * @return array\n */\n\tprotected function _setAliasData($data) {\n\t\t$models = array_keys($this->getAssociated());\n\t\t$schema = array_keys($this->schema());\n\t\tforeach ($data as $field => $value) {\n\t\t\tif (in_array($field, $schema) || !in_array($field, $models)) {\n\t\t\t\t$data[$this->alias][$field] = $value;\n\t\t\t\tunset($data[$field]);\n\t\t\t}\n\t\t}\n\t\treturn $data;\n\t}\n\n/**\n * Normalize Xml::toArray() to use in Model::save()\n *\n * @param array $xml XML as array\n * @return array\n */\n\tprotected function _normalizeXmlData(array $xml) {\n\t\t$return = array();\n\t\tforeach ($xml as $key => $value) {\n\t\t\tif (is_array($value)) {\n\t\t\t\t$return[Inflector::camelize($key)] = $this->_normalizeXmlData($value);\n\t\t\t} elseif ($key[0] === '@') {\n\t\t\t\t$return[substr($key, 1)] = $value;\n\t\t\t} else {\n\t\t\t\t$return[$key] = $value;\n\t\t\t}\n\t\t}\n\t\treturn $return;\n\t}\n\n/**\n * Deconstructs a complex data type (array or object) into a single field value.\n *\n * @param string $field The name of the field to be deconstructed\n * @param mixed $data An array or object to be deconstructed into a field\n * @return mixed The resulting data that should be assigned to a field\n */\n\tpublic function deconstruct($field, $data) {\n\t\tif (!is_array($data)) {\n\t\t\treturn $data;\n\t\t}\n\n\t\t$type = $this->getColumnType($field);\n\n\t\tif (in_array($type, array('datetime', 'timestamp', 'date', 'time'))) {\n\t\t\t$useNewDate = (isset($data['year']) || isset($data['month']) ||\n\t\t\t\tisset($data['day']) || isset($data['hour']) || isset($data['minute']));\n\n\t\t\t$dateFields = array('Y' => 'year', 'm' => 'month', 'd' => 'day', 'H' => 'hour', 'i' => 'min', 's' => 'sec');\n\t\t\t$timeFields = array('H' => 'hour', 'i' => 'min', 's' => 'sec');\n\t\t\t$date = array();\n\n\t\t\tif (isset($data['meridian']) && empty($data['meridian'])) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tisset($data['hour']) &&\n\t\t\t\tisset($data['meridian']) &&\n\t\t\t\t!empty($data['hour']) &&\n\t\t\t\t$data['hour'] != 12 &&\n\t\t\t\t'pm' == $data['meridian']\n\t\t\t) {\n\t\t\t\t$data['hour'] = $data['hour'] + 12;\n\t\t\t}\n\t\t\tif (isset($data['hour']) && isset($data['meridian']) && $data['hour'] == 12 && 'am' == $data['meridian']) {\n\t\t\t\t$data['hour'] = '00';\n\t\t\t}\n\t\t\tif ($type == 'time') {\n\t\t\t\tforeach ($timeFields as $key => $val) {\n\t\t\t\t\tif (!isset($data[$val]) || $data[$val] === '0' || $data[$val] === '00') {\n\t\t\t\t\t\t$data[$val] = '00';\n\t\t\t\t\t} elseif ($data[$val] !== '') {\n\t\t\t\t\t\t$data[$val] = sprintf('%02d', $data[$val]);\n\t\t\t\t\t}\n\t\t\t\t\tif (!empty($data[$val])) {\n\t\t\t\t\t\t$date[$key] = $data[$val];\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($type == 'datetime' || $type == 'timestamp' || $type == 'date') {\n\t\t\t\tforeach ($dateFields as $key => $val) {\n\t\t\t\t\tif ($val == 'hour' || $val == 'min' || $val == 'sec') {\n\t\t\t\t\t\tif (!isset($data[$val]) || $data[$val] === '0' || $data[$val] === '00') {\n\t\t\t\t\t\t\t$data[$val] = '00';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$data[$val] = sprintf('%02d', $data[$val]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!isset($data[$val]) || isset($data[$val]) && (empty($data[$val]) || $data[$val][0] === '-')) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($data[$val]) && !empty($data[$val])) {\n\t\t\t\t\t\t$date[$key] = $data[$val];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($useNewDate && !empty($date)) {\n\t\t\t\t$format = $this->getDataSource()->columns[$type]['format'];\n\t\t\t\tforeach (array('m', 'd', 'H', 'i', 's') as $index) {\n\t\t\t\t\tif (isset($date[$index])) {\n\t\t\t\t\t\t$date[$index] = sprintf('%02d', $date[$index]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn str_replace(array_keys($date), array_values($date), $format);\n\t\t\t}\n\t\t}\n\t\treturn $data;\n\t}\n\n/**\n * Returns an array of table metadata (column names and types) from the database.\n * $field => keys(type, null, default, key, length, extra)\n *\n * @param mixed $field Set to true to reload schema, or a string to return a specific field\n * @return array Array of table metadata\n */\n\tpublic function schema($field = false) {\n\t\tif ($this->useTable !== false && (!is_array($this->_schema) || $field === true)) {\n\t\t\t$db = $this->getDataSource();\n\t\t\t$db->cacheSources = ($this->cacheSources && $db->cacheSources);\n\t\t\tif (method_exists($db, 'describe') && $this->useTable !== false) {\n\t\t\t\t$this->_schema = $db->describe($this);\n\t\t\t} elseif ($this->useTable === false) {\n\t\t\t\t$this->_schema = array();\n\t\t\t}\n\t\t}\n\t\tif (is_string($field)) {\n\t\t\tif (isset($this->_schema[$field])) {\n\t\t\t\treturn $this->_schema[$field];\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\treturn $this->_schema;\n\t}\n\n/**\n * Returns an associative array of field names and column types.\n *\n * @return array Field types indexed by field name\n */\n\tpublic function getColumnTypes() {\n\t\t$columns = $this->schema();\n\t\tif (empty($columns)) {\n\t\t\ttrigger_error(__d('cake_dev', '(Model::getColumnTypes) Unable to build model field data. If you are using a model without a database table, try implementing schema()'), E_USER_WARNING);\n\t\t}\n\t\t$cols = array();\n\t\tforeach ($columns as $field => $values) {\n\t\t\t$cols[$field] = $values['type'];\n\t\t}\n\t\treturn $cols;\n\t}\n\n/**\n * Returns the column type of a column in the model.\n *\n * @param string $column The name of the model column\n * @return string Column type\n */\n\tpublic function getColumnType($column) {\n\t\t$db = $this->getDataSource();\n\t\t$cols = $this->schema();\n\t\t$model = null;\n\n\t\t$startQuote = isset($db->startQuote) ? $db->startQuote : null;\n\t\t$endQuote = isset($db->endQuote) ? $db->endQuote : null;\n\t\t$column = str_replace(array($startQuote, $endQuote), '', $column);\n\n\t\tif (strpos($column, '.')) {\n\t\t\tlist($model, $column) = explode('.', $column);\n\t\t}\n\t\tif ($model != $this->alias && isset($this->{$model})) {\n\t\t\treturn $this->{$model}->getColumnType($column);\n\t\t}\n\t\tif (isset($cols[$column]) && isset($cols[$column]['type'])) {\n\t\t\treturn $cols[$column]['type'];\n\t\t}\n\t\treturn null;\n\t}\n\n/**\n * Returns true if the supplied field exists in the model's database table.\n *\n * @param mixed $name Name of field to look for, or an array of names\n * @param boolean $checkVirtual checks if the field is declared as virtual\n * @return mixed If $name is a string, returns a boolean indicating whether the field exists.\n *               If $name is an array of field names, returns the first field that exists,\n *               or false if none exist.\n */\n\tpublic function hasField($name, $checkVirtual = false) {\n\t\tif (is_array($name)) {\n\t\t\tforeach ($name as $n) {\n\t\t\t\tif ($this->hasField($n, $checkVirtual)) {\n\t\t\t\t\treturn $n;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tif ($checkVirtual && !empty($this->virtualFields)) {\n\t\t\tif ($this->isVirtualField($name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (empty($this->_schema)) {\n\t\t\t$this->schema();\n\t\t}\n\n\t\tif ($this->_schema != null) {\n\t\t\treturn isset($this->_schema[$name]);\n\t\t}\n\t\treturn false;\n\t}\n\n/**\n * Check that a method is callable on a model.  This will check both the model's own methods, its\n * inherited methods and methods that could be callable through behaviors.\n *\n * @param string $method The method to be called.\n * @return boolean True on method being callable.\n */\n\tpublic function hasMethod($method) {\n\t\tif (method_exists($this, $method)) {\n\t\t\treturn true;\n\t\t}\n\t\tif ($this->Behaviors->hasMethod($method)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n/**\n * Returns true if the supplied field is a model Virtual Field\n *\n * @param string $field Name of field to look for\n * @return boolean indicating whether the field exists as a model virtual field.\n */\n\tpublic function isVirtualField($field) {\n\t\tif (empty($this->virtualFields) || !is_string($field)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (isset($this->virtualFields[$field])) {\n\t\t\treturn true;\n\t\t}\n\t\tif (strpos($field, '.') !== false) {\n\t\t\tlist($model, $field) = explode('.', $field);\n\t\t\tif ($model == $this->alias && isset($this->virtualFields[$field])) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n/**\n * Returns the expression for a model virtual field\n *\n * @param string $field Name of field to look for\n * @return mixed If $field is string expression bound to virtual field $field\n *    If $field is null, returns an array of all model virtual fields\n *    or false if none $field exist.\n */\n\tpublic function getVirtualField($field = null) {\n\t\tif ($field == null) {\n\t\t\treturn empty($this->virtualFields) ? false : $this->virtualFields;\n\t\t}\n\t\tif ($this->isVirtualField($field)) {\n\t\t\tif (strpos($field, '.') !== false) {\n\t\t\t\tlist($model, $field) = explode('.', $field);\n\t\t\t}\n\t\t\treturn $this->virtualFields[$field];\n\t\t}\n\t\treturn false;\n\t}\n\n/**\n * Initializes the model for writing a new record, loading the default values\n * for those fields that are not defined in $data, and clearing previous validation errors.\n * Especially helpful for saving data in loops.\n *\n * @param mixed $data Optional data array to assign to the model after it is created.  If null or false,\n *   schema data defaults are not merged.\n * @param boolean $filterKey If true, overwrites any primary key input with an empty value\n * @return array The current Model::data; after merging $data and/or defaults from database\n * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-create-array-data-array\n */\n\tpublic function create($data = array(), $filterKey = false) {\n\t\t$defaults = array();\n\t\t$this->id = false;\n\t\t$this->data = array();\n\t\t$this->validationErrors = array();\n\n\t\tif ($data !== null && $data !== false) {\n\t\t\tforeach ($this->schema() as $field => $properties) {\n\t\t\t\tif ($this->primaryKey !== $field && isset($properties['default']) && $properties['default'] !== '') {\n\t\t\t\t\t$defaults[$field] = $properties['default'];\n\t\t\t\t}\n\t\t\t}\n\t\t\t$this->set($defaults);\n\t\t\t$this->set($data);\n\t\t}\n\t\tif ($filterKey) {\n\t\t\t$this->set($this->primaryKey, false);\n\t\t}\n\t\treturn $this->data;\n\t}\n\n/**\n * Returns a list of fields from the database, and sets the current model\n * data (Model::$data) with the record found.\n *\n * @param mixed $fields String of single field name, or an array of field names.\n * @param mixed $id The ID of the record to read\n * @return array Array of database fields, or false if not found\n * @link http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#model-read\n */\n\tpublic function read($fields = null, $id = null) {\n\t\t$this->validationErrors = array();\n\n\t\tif ($id != null) {\n\t\t\t$this->id = $id;\n\t\t}\n\n\t\t$id = $this->id;\n\n\t\tif (is_array($this->id)) {\n\t\t\t$id = $this->id[0];\n\t\t}\n\n\t\tif ($id !== null && $id !== false) {\n\t\t\t$this->data = $this->find('first', array(\n\t\t\t\t'conditions' => array($this->alias . '.' . $this->primaryKey => $id),\n\t\t\t\t'fields' => $fields\n\t\t\t));\n\t\t\treturn $this->data;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n/**\n * Returns the contents of a single field given the supplied conditions, in the\n * supplied order.\n *\n * @param string $name Name of field to get\n * @param array $conditions SQL conditions (defaults to NULL)\n * @param string $order SQL ORDER BY fragment\n * @return string field contents, or false if not found\n * @link http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#model-field\n */\n\tpublic function field($name, $conditions = null, $order = null) {\n\t\tif ($conditions === null && $this->id !== false) {\n\t\t\t$conditions = array($this->alias . '.' . $this->primaryKey => $this->id);\n\t\t}\n\t\tif ($this->recursive >= 1) {\n\t\t\t$recursive = -1;\n\t\t} else {\n\t\t\t$recursive = $this->recursive;\n\t\t}\n\t\t$fields = $name;\n\t\tif ($data = $this->find('first', compact('conditions', 'fields', 'order', 'recursive'))) {\n\t\t\tif (strpos($name, '.') === false) {\n\t\t\t\tif (isset($data[$this->alias][$name])) {\n\t\t\t\t\treturn $data[$this->alias][$name];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$name = explode('.', $name);\n\t\t\t\tif (isset($data[$name[0]][$name[1]])) {\n\t\t\t\t\treturn $data[$name[0]][$name[1]];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isset($data[0]) && count($data[0]) > 0) {\n\t\t\t\treturn array_shift($data[0]);\n\t\t\t}\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n/**\n * Saves the value of a single field to the database, based on the current\n * model ID.\n *\n * @param string $name Name of the table field\n * @param mixed $value Value of the field\n * @param array $validate See $options param in Model::save(). Does not respect 'fieldList' key if passed\n * @return boolean See Model::save()\n * @see Model::save()\n * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-savefield-string-fieldname-string-fieldvalue-validate-false\n */\n\tpublic function saveField($name, $value, $validate = false) {\n\t\t$id = $this->id;\n\t\t$this->create(false);\n\n\t\tif (is_array($validate)) {\n\t\t\t$options = array_merge(array('validate' => false, 'fieldList' => array($name)), $validate);\n\t\t} else {\n\t\t\t$options = array('validate' => $validate, 'fieldList' => array($name));\n\t\t}\n\t\treturn $this->save(array($this->alias => array($this->primaryKey => $id, $name => $value)), $options);\n\t}\n\n/**\n * Saves model data (based on white-list, if supplied) to the database. By\n * default, validation occurs before save.\n *\n * @param array $data Data to save.\n * @param mixed $validate Either a boolean, or an array.\n *   If a boolean, indicates whether or not to validate before saving.\n *   If an array, allows control of validate, callbacks, and fieldList\n * @param array $fieldList List of fields to allow to be written\n * @return mixed On success Model::$data if its not empty or true, false on failure\n * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html\n */\n\tpublic function save($data = null, $validate = true, $fieldList = array()) {\n\t\t$defaults = array('validate' => true, 'fieldList' => array(), 'callbacks' => true);\n\t\t$_whitelist = $this->whitelist;\n\t\t$fields = array();\n\n\t\tif (!is_array($validate)) {\n\t\t\t$options = array_merge($defaults, compact('validate', 'fieldList', 'callbacks'));\n\t\t} else {\n\t\t\t$options = array_merge($defaults, $validate);\n\t\t}\n\n\t\tif (!empty($options['fieldList'])) {\n\t\t\tif (!empty($options['fieldList'][$this->alias]) && is_array($options['fieldList'][$this->alias])) {\n\t\t\t\t$this->whitelist = $options['fieldList'][$this->alias];\n\t\t\t} else {\n\t\t\t\t$this->whitelist = $options['fieldList'];\n\t\t\t}\n\t\t} elseif ($options['fieldList'] === null) {\n\t\t\t$this->whitelist = array();\n\t\t}\n\t\t$this->set($data);\n\n\t\tif (empty($this->data) && !$this->hasField(array('created', 'updated', 'modified'))) {\n\t\t\treturn false;\n\t\t}\n\n\t\tforeach (array('created', 'updated', 'modified') as $field) {\n\t\t\t$keyPresentAndEmpty = (\n\t\t\t\tisset($this->data[$this->alias]) &&\n\t\t\t\tarray_key_exists($field, $this->data[$this->alias]) &&\n\t\t\t\t$this->data[$this->alias][$field] === null\n\t\t\t);\n\t\t\tif ($keyPresentAndEmpty) {\n\t\t\t\tunset($this->data[$this->alias][$field]);\n\t\t\t}\n\t\t}\n\n\t\t$exists = $this->exists();\n\t\t$dateFields = array('modified', 'updated');\n\n\t\tif (!$exists) {\n\t\t\t$dateFields[] = 'created';\n\t\t}\n\t\tif (isset($this->data[$this->alias])) {\n\t\t\t$fields = array_keys($this->data[$this->alias]);\n\t\t}\n\t\tif ($options['validate'] && !$this->validates($options)) {\n\t\t\t$this->whitelist = $_whitelist;\n\t\t\treturn false;\n\t\t}\n\n\t\t$db = $this->getDataSource();\n\n\t\tforeach ($dateFields as $updateCol) {\n\t\t\tif ($this->hasField($updateCol) && !in_array($updateCol, $fields)) {\n\t\t\t\t$default = array('formatter' => 'date');\n\t\t\t\t$colType = array_merge($default, $db->columns[$this->getColumnType($updateCol)]);\n\t\t\t\tif (!array_key_exists('format', $colType)) {\n\t\t\t\t\t$time = strtotime('now');\n\t\t\t\t} else {\n\t\t\t\t\t$time = call_user_func($colType['formatter'], $colType['format']);\n\t\t\t\t}\n\t\t\t\tif (!empty($this->whitelist)) {\n\t\t\t\t\t$this->whitelist[] = $updateCol;\n\t\t\t\t}\n\t\t\t\t$this->set($updateCol, $time);\n\t\t\t}\n\t\t}\n\n\t\tif ($options['callbacks'] === true || $options['callbacks'] === 'before') {\n\t\t\t$event = new CakeEvent('Model.beforeSave', $this, array($options));\n\t\t\tlist($event->break, $event->breakOn) = array(true, array(false, null));\n\t\t\t$this->getEventManager()->dispatch($event);\n\t\t\tif (!$event->result) {\n\t\t\t\t$this->whitelist = $_whitelist;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (empty($this->data[$this->alias][$this->primaryKey])) {\n\t\t\tunset($this->data[$this->alias][$this->primaryKey]);\n\t\t}\n\t\t$fields = $values = array();\n\n\t\tforeach ($this->data as $n => $v) {\n\t\t\tif (isset($this->hasAndBelongsToMany[$n])) {\n\t\t\t\tif (isset($v[$n])) {\n\t\t\t\t\t$v = $v[$n];\n\t\t\t\t}\n\t\t\t\t$joined[$n] = $v;\n\t\t\t} else {\n\t\t\t\tif ($n === $this->alias) {\n\t\t\t\t\tforeach (array('created', 'updated', 'modified') as $field) {\n\t\t\t\t\t\tif (array_key_exists($field, $v) && empty($v[$field])) {\n\t\t\t\t\t\t\tunset($v[$field]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tforeach ($v as $x => $y) {\n\t\t\t\t\t\tif ($this->hasField($x) && (empty($this->whitelist) || in_array($x, $this->whitelist))) {\n\t\t\t\t\t\t\tlist($fields[], $values[]) = array($x, $y);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$count = count($fields);\n\n\t\tif (!$exists && $count > 0) {\n\t\t\t$this->id = false;\n\t\t}\n\t\t$success = true;\n\t\t$created = false;\n\n\t\tif ($count > 0) {\n\t\t\t$cache = $this->_prepareUpdateFields(array_combine($fields, $values));\n\n\t\t\tif (!empty($this->id)) {\n\t\t\t\t$success = (bool)$db->update($this, $fields, $values);\n\t\t\t} else {\n\t\t\t\t$fInfo = $this->schema($this->primaryKey);\n\t\t\t\t$isUUID = ($fInfo['length'] == 36 &&\n\t\t\t\t\t($fInfo['type'] === 'string' || $fInfo['type'] === 'binary')\n\t\t\t\t);\n\t\t\t\tif (empty($this->data[$this->alias][$this->primaryKey]) && $isUUID) {\n\t\t\t\t\tif (array_key_exists($this->primaryKey, $this->data[$this->alias])) {\n\t\t\t\t\t\t$j = array_search($this->primaryKey, $fields);\n\t\t\t\t\t\t$values[$j] = String::uuid();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlist($fields[], $values[]) = array($this->primaryKey, String::uuid());\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!$db->create($this, $fields, $values)) {\n\t\t\t\t\t$success = $created = false;\n\t\t\t\t} else {\n\t\t\t\t\t$created = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($success && !empty($this->belongsTo)) {\n\t\t\t\t$this->updateCounterCache($cache, $created);\n\t\t\t}\n\t\t}\n\n\t\tif (!empty($joined) && $success === true) {\n\t\t\t$this->_saveMulti($joined, $this->id, $db);\n\t\t}\n\n\t\tif ($success && $count > 0) {\n\t\t\tif (!empty($this->data)) {\n\t\t\t\t$success = $this->data;\n\t\t\t\tif ($created) {\n\t\t\t\t\t$this->data[$this->alias][$this->primaryKey] = $this->id;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($options['callbacks'] === true || $options['callbacks'] === 'after') {\n\t\t\t\t$event = new CakeEvent('Model.afterSave', $this, array($created, $options));\n\t\t\t\t$this->getEventManager()->dispatch($event);\n\t\t\t}\n\t\t\tif (!empty($this->data)) {\n\t\t\t\t$success = Set::merge($success, $this->data);\n\t\t\t}\n\t\t\t$this->data = false;\n\t\t\t$this->_clearCache();\n\t\t\t$this->validationErrors = array();\n\t\t}\n\t\t$this->whitelist = $_whitelist;\n\t\treturn $success;\n\t}\n\n/**\n * Saves model hasAndBelongsToMany data to the database.\n *\n * @param array $joined Data to save\n * @param mixed $id ID of record in this model\n * @param DataSource $db\n * @return void\n */\n\tprotected function _saveMulti($joined, $id, $db) {\n\t\tforeach ($joined as $assoc => $data) {\n\n\t\t\tif (isset($this->hasAndBelongsToMany[$assoc])) {\n\t\t\t\tlist($join) = $this->joinModel($this->hasAndBelongsToMany[$assoc]['with']);\n\n\t\t\t\t$keyInfo = $this->{$join}->schema($this->{$join}->primaryKey);\n\t\t\t\tif ($with = $this->hasAndBelongsToMany[$assoc]['with']) {\n\t\t\t\t\t$withModel = is_array($with) ? key($with) : $with;\n\t\t\t\t\tlist($pluginName, $withModel) = pluginSplit($withModel);\n\t\t\t\t\t$dbMulti = $this->{$withModel}->getDataSource();\n\t\t\t\t} else {\n\t\t\t\t\t$dbMulti = $db;\n\t\t\t\t}\n\n\t\t\t\t$isUUID = !empty($this->{$join}->primaryKey) && (\n\t\t\t\t\t\t$keyInfo['length'] == 36 && (\n\t\t\t\t\t\t$keyInfo['type'] === 'string' ||\n\t\t\t\t\t\t$keyInfo['type'] === 'binary'\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t$newData = $newValues = $newJoins = array();\n\t\t\t\t$primaryAdded = false;\n\n\t\t\t\t$fields = array(\n\t\t\t\t\t$dbMulti->name($this->hasAndBelongsToMany[$assoc]['foreignKey']),\n\t\t\t\t\t$dbMulti->name($this->hasAndBelongsToMany[$assoc]['associationForeignKey'])\n\t\t\t\t);\n\n\t\t\t\t$idField = $db->name($this->{$join}->primaryKey);\n\t\t\t\tif ($isUUID && !in_array($idField, $fields)) {\n\t\t\t\t\t$fields[] = $idField;\n\t\t\t\t\t$primaryAdded = true;\n\t\t\t\t}\n\n\t\t\t\tforeach ((array)$data as $row) {\n\t\t\t\t\tif ((is_string($row) && (strlen($row) == 36 || strlen($row) == 16)) || is_numeric($row)) {\n\t\t\t\t\t\t$newJoins[] = $row;\n\t\t\t\t\t\t$values = array($id, $row);\n\t\t\t\t\t\tif ($isUUID && $primaryAdded) {\n\t\t\t\t\t\t\t$values[] = String::uuid();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$newValues[$row] = $values;\n\t\t\t\t\t\tunset($values);\n\t\t\t\t\t} elseif (isset($row[$this->hasAndBelongsToMany[$assoc]['associationForeignKey']])) {\n\t\t\t\t\t\tif (!empty($row[$this->{$join}->primaryKey])) {\n\t\t\t\t\t\t\t$newJoins[] = $row[$this->hasAndBelongsToMany[$assoc]['associationForeignKey']];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$newData[] = $row;\n\t\t\t\t\t} elseif (isset($row[$join]) && isset($row[$join][$this->hasAndBelongsToMany[$assoc]['associationForeignKey']])) {\n\t\t\t\t\t\tif (!empty($row[$join][$this->{$join}->primaryKey])) {\n\t\t\t\t\t\t\t$newJoins[] = $row[$join][$this->hasAndBelongsToMany[$assoc]['associationForeignKey']];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$newData[] = $row[$join];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$keepExisting = $this->hasAndBelongsToMany[$assoc]['unique'] === 'keepExisting';\n\t\t\t\tif ($this->hasAndBelongsToMany[$assoc]['unique']) {\n\t\t\t\t\t$conditions = array(\n\t\t\t\t\t\t$join . '.' . $this->hasAndBelongsToMany[$assoc]['foreignKey'] => $id\n\t\t\t\t\t);\n\t\t\t\t\tif (!empty($this->hasAndBelongsToMany[$assoc]['conditions'])) {\n\t\t\t\t\t\t$conditions = array_merge($conditions, (array)$this->hasAndBelongsToMany[$assoc]['conditions']);\n\t\t\t\t\t}\n\t\t\t\t\t$associationForeignKey = $this->{$join}->alias . '.' . $this->hasAndBelongsToMany[$assoc]['associationForeignKey'];\n\t\t\t\t\t$links = $this->{$join}->find('all', array(\n\t\t\t\t\t\t'conditions' => $conditions,\n\t\t\t\t\t\t'recursive' => empty($this->hasAndBelongsToMany[$assoc]['conditions']) ? -1 : 0,\n\t\t\t\t\t\t'fields' => $associationForeignKey,\n\t\t\t\t\t));\n\n\t\t\t\t\t$oldLinks = Set::extract($links, \"{n}.{$associationForeignKey}\");\n\t\t\t\t\tif (!empty($oldLinks)) {\n\t\t\t\t\t\tif ($keepExisting && !empty($newJoins)) {\n\t\t\t\t\t\t\t$conditions[$associationForeignKey] = array_diff($oldLinks, $newJoins);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$conditions[$associationForeignKey] = $oldLinks;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$dbMulti->delete($this->{$join}, $conditions);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!empty($newData)) {\n\t\t\t\t\tforeach ($newData as $data) {\n\t\t\t\t\t\t$data[$this->hasAndBelongsToMany[$assoc]['foreignKey']] = $id;\n\t\t\t\t\t\tif (empty($data[$this->{$join}->primaryKey])) {\n\t\t\t\t\t\t\t$this->{$join}->create();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$this->{$join}->save($data);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!empty($newValues)) {\n\t\t\t\t\tif ($keepExisting && !empty($links)) {\n\t\t\t\t\t\tforeach ($links as $link) {\n\t\t\t\t\t\t\t$oldJoin = $link[$join][$this->hasAndBelongsToMany[$assoc]['associationForeignKey']];\n\t\t\t\t\t\t\tif (! in_array($oldJoin, $newJoins) ) {\n\t\t\t\t\t\t\t\t$conditions[$associationForeignKey] = $oldJoin;\n\t\t\t\t\t\t\t\t$db->delete($this->{$join}, $conditions);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tunset($newValues[$oldJoin]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$newValues = array_values($newValues);\n\t\t\t\t\t}\n\t\t\t\t\tif (!empty($newValues)) {\n\t\t\t\t\t\t$dbMulti->insertMulti($this->{$join}, $fields, $newValues);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n/**\n * Updates the counter cache of belongsTo associations after a save or delete operation\n *\n * @param array $keys Optional foreign key data, defaults to the information $this->data\n * @param boolean $created True if a new record was created, otherwise only associations with\n *   'counterScope' defined get updated\n * @return void\n */\n\tpublic function updateCounterCache($keys = array(), $created = false) {\n\t\t$keys = empty($keys) ? $this->data[$this->alias] : $keys;\n\t\t$keys['old'] = isset($keys['old']) ? $keys['old'] : array();\n\n\t\tforeach ($this->belongsTo as $parent => $assoc) {\n\t\t\tif (!empty($assoc['counterCache'])) {\n\t\t\t\tif (!is_array($assoc['counterCache'])) {\n\t\t\t\t\tif (isset($assoc['counterScope'])) {\n\t\t\t\t\t\t$assoc['counterCache'] = array($assoc['counterCache'] => $assoc['counterScope']);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$assoc['counterCache'] = array($assoc['counterCache'] => array());\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$foreignKey = $assoc['foreignKey'];\n\t\t\t\t$fkQuoted = $this->escapeField($assoc['foreignKey']);\n\n\t\t\t\tforeach ($assoc['counterCache'] as $field => $conditions) {\n\t\t\t\t\tif (!is_string($field)) {\n\t\t\t\t\t\t$field = Inflector::underscore($this->alias) . '_count';\n\t\t\t\t\t}\n\t\t\t\t\tif (!$this->{$parent}->hasField($field)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif ($conditions === true) {\n\t\t\t\t\t\t$conditions = array();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$conditions = (array)$conditions;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!array_key_exists($foreignKey, $keys)) {\n\t\t\t\t\t\t$keys[$foreignKey] = $this->field($foreignKey);\n\t\t\t\t\t}\n\t\t\t\t\t$recursive = (empty($conditions) ? -1 : 0);\n\n\t\t\t\t\tif (isset($keys['old'][$foreignKey])) {\n\t\t\t\t\t\tif ($keys['old'][$foreignKey] != $keys[$foreignKey]) {\n\t\t\t\t\t\t\t$conditions[$fkQuoted] = $keys['old'][$foreignKey];\n\t\t\t\t\t\t\t$count = intval($this->find('count', compact('conditions', 'recursive')));\n\n\t\t\t\t\t\t\t$this->{$parent}->updateAll(\n\t\t\t\t\t\t\t\tarray($field => $count),\n\t\t\t\t\t\t\t\tarray($this->{$parent}->escapeField() => $keys['old'][$foreignKey])\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$conditions[$fkQuoted] = $keys[$foreignKey];\n\n\t\t\t\t\tif ($recursive === 0) {\n\t\t\t\t\t\t$conditions = array_merge($conditions, (array)$conditions);\n\t\t\t\t\t}\n\t\t\t\t\t$count = intval($this->find('count', compact('conditions', 'recursive')));\n\n\t\t\t\t\t$this->{$parent}->updateAll(\n\t\t\t\t\t\tarray($field => $count),\n\t\t\t\t\t\tarray($this->{$parent}->escapeField() => $keys[$foreignKey])\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n/**\n * Helper method for Model::updateCounterCache().  Checks the fields to be updated for\n *\n * @param array $data The fields of the record that will be updated\n * @return array Returns updated foreign key values, along with an 'old' key containing the old\n *     values, or empty if no foreign keys are updated.\n */\n\tprotected function _prepareUpdateFields($data) {\n\t\t$foreignKeys = array();\n\t\tforeach ($this->belongsTo as $assoc => $info) {\n\t\t\tif ($info['counterCache']) {\n\t\t\t\t$foreignKeys[$assoc] = $info['foreignKey'];\n\t\t\t}\n\t\t}\n\t\t$included = array_intersect($foreignKeys, array_keys($data));\n\n\t\tif (empty($included) || empty($this->id)) {\n\t\t\treturn array();\n\t\t}\n\t\t$old = $this->find('first', array(\n\t\t\t'conditions' => array($this->alias . '.' . $this->primaryKey => $this->id),\n\t\t\t'fields' => array_values($included),\n\t\t\t'recursive' => -1\n\t\t));\n\t\treturn array_merge($data, array('old' => $old[$this->alias]));\n\t}\n\n/**\n * Backwards compatible passthrough method for:\n * saveMany(), validateMany(), saveAssociated() and validateAssociated()\n *\n * Saves multiple individual records for a single model; Also works with a single record, as well as\n * all its associated records.\n *\n * #### Options\n *\n * - validate: Set to false to disable validation, true to validate each record before saving,\n *   'first' to validate *all* records before any are saved (default),\n *   or 'only' to only validate the records, but not save them.\n * - atomic: If true (default), will attempt to save all records in a single transaction.\n *   Should be set to false if database/table does not support transactions.\n * - fieldList: Equivalent to the $fieldList parameter in Model::save().\n *   It should be an associate array with model name as key and array of fields as value. Eg.\n *   {{{\n *   array(\n *       'SomeModel' => array('field'),\n *       'AssociatedModel' => array('field', 'otherfield')\n *   )\n *   }}}\n * - deep: see saveMany/saveAssociated\n *\n * @param array $data Record data to save. This can be either a numerically-indexed array (for saving multiple\n *     records of the same type), or an array indexed by association name.\n * @param array $options Options to use when saving record data, See $options above.\n * @return mixed If atomic: True on success, or false on failure.\n *    Otherwise: array similar to the $data array passed, but values are set to true/false\n *    depending on whether each record saved successfully.\n * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-saveassociated-array-data-null-array-options-array\n * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-saveall-array-data-null-array-options-array\n */\n\tpublic function saveAll($data = null, $options = array()) {\n\t\t$options = array_merge(array('validate' => 'first'), $options);\n\t\tif (Set::numeric(array_keys($data))) {\n\t\t\tif ($options['validate'] === 'only') {\n\t\t\t\treturn $this->validateMany($data, $options);\n\t\t\t}\n\t\t\treturn $this->saveMany($data, $options);\n\t\t}\n\t\tif ($options['validate'] === 'only') {\n\t\t\treturn $this->validateAssociated($data, $options);\n\t\t}\n\t\treturn $this->saveAssociated($data, $options);\n\t}\n\n/**\n * Saves multiple individual records for a single model\n *\n * #### Options\n *\n * - validate: Set to false to disable validation, true to validate each record before saving,\n *   'first' to validate *all* records before any are saved (default),\n * - atomic: If true (default), will attempt to save all records in a single transaction.\n *   Should be set to false if database/table does not support transactions.\n * - fieldList: Equivalent to the $fieldList parameter in Model::save()\n * - deep: If set to true, all associated data will be saved as well.\n *\n * @param array $data Record data to save. This should be a numerically-indexed array\n * @param array $options Options to use when saving record data, See $options above.\n * @return mixed If atomic: True on success, or false on failure.\n *    Otherwise: array similar to the $data array passed, but values are set to true/false\n *    depending on whether each record saved successfully.\n * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-savemany-array-data-null-array-options-array\n */\n\tpublic function saveMany($data = null, $options = array()) {\n\t\tif (empty($data)) {\n\t\t\t$data = $this->data;\n\t\t}\n\n\t\t$options = array_merge(array('validate' => 'first', 'atomic' => true, 'deep' => false), $options);\n\t\t$this->validationErrors = $validationErrors = array();\n\n\t\tif (empty($data) && $options['validate'] !== false) {\n\t\t\t$result = $this->save($data, $options);\n\t\t\tif (!$options['atomic']) {\n\t\t\t\treturn array(!empty($result));\n\t\t\t}\n\t\t\treturn !empty($result);\n\t\t}\n\n\t\tif ($options['validate'] === 'first') {\n\t\t\t$validates = $this->validateMany($data, $options);\n\t\t\tif ((!$validates && $options['atomic']) || (!$options['atomic'] && in_array(false, $validates, true))) {\n\t\t\t\treturn $validates;\n\t\t\t}\n\t\t\t$options['validate'] = false;\n\t\t}\n\n\t\tif ($options['atomic']) {\n\t\t\t$db = $this->getDataSource();\n\t\t\t$transactionBegun = $db->begin();\n\t\t}\n\t\t$return = array();\n\t\tforeach ($data as $key => $record) {\n\t\t\t$validates = $this->create(null) !== null;\n\t\t\t$saved = false;\n\t\t\tif ($validates) {\n\t\t\t\tif ($options['deep']) {\n\t\t\t\t\t$saved = $this->saveAssociated($record, array_merge($options, array('atomic' => false)));\n\t\t\t\t} else {\n\t\t\t\t\t$saved = $this->save($record, $options);\n\t\t\t\t}\n\t\t\t}\n\t\t\t$validates = ($validates && ($saved === true || (is_array($saved) && !in_array(false, $saved, true))));\n\t\t\tif (!$validates) {\n\t\t\t\t$validationErrors[$key] = $this->validationErrors;\n\t\t\t}\n\t\t\tif (!$options['atomic']) {\n\t\t\t\t$return[$key] = $validates;\n\t\t\t} elseif (!$validates) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t$this->validationErrors = $validationErrors;\n\n\t\tif (!$options['atomic']) {\n\t\t\treturn $return;\n\t\t}\n\t\tif ($validates) {\n\t\t\tif ($transactionBegun) {\n\t\t\t\treturn $db->commit() !== false;\n\t\t\t} else {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t$db->rollback();\n\t\treturn false;\n\t}\n\n/**\n * Validates multiple individual records for a single model\n *\n * #### Options\n *\n * - atomic: If true (default), returns boolean. If false returns array.\n * - fieldList: Equivalent to the $fieldList parameter in Model::save()\n * - deep: If set to true, all associated data will be validated as well.\n *\n * Warning: This method could potentially change the passed argument `$data`,\n * If you do not want this to happen, make a copy of `$data` before passing it\n * to this method\n *\n * @param array $data Record data to validate. This should be a numerically-indexed array\n * @param array $options Options to use when validating record data (see above), See also $options of validates().\n * @return boolean True on success, or false on failure.\n * @return mixed If atomic: True on success, or false on failure.\n *    Otherwise: array similar to the $data array passed, but values are set to true/false\n *    depending on whether each record validated successfully.\n */\n\tpublic function validateMany(&$data, $options = array()) {\n\t\t$options = array_merge(array('atomic' => true, 'deep' => false), $options);\n\t\t$this->validationErrors = $validationErrors = $return = array();\n\t\tforeach ($data as $key => &$record) {\n\t\t\tif ($options['deep']) {\n\t\t\t\t$validates = $this->validateAssociated($record, $options);\n\t\t\t} else {\n\t\t\t\t$this->create(null);\n\t\t\t\t$validates = $this->set($record) && $this->validates($options);\n\t\t\t\t$data[$key] = $this->data;\n\t\t\t}\n\t\t\tif ($validates === false || (is_array($validates) && in_array(false, $validates, true))) {\n\t\t\t\t$validationErrors[$key] = $this->validationErrors;\n\t\t\t\t$validates = false;\n\t\t\t} else {\n\t\t\t\t$validates = true;\n\t\t\t}\n\t\t\t$return[$key] = $validates;\n\t\t}\n\t\t$this->validationErrors = $validationErrors;\n\t\tif (!$options['atomic']) {\n\t\t\treturn $return;\n\t\t}\n\t\tif (empty($this->validationErrors)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n/**\n * Saves a single record, as well as all its directly associated records.\n *\n * #### Options\n *\n * - `validate` Set to `false` to disable validation, `true` to validate each record before saving,\n *   'first' to validate *all* records before any are saved(default),\n * - `atomic` If true (default), will attempt to save all records in a single transaction.\n *   Should be set to false if database/table does not support transactions.\n * - fieldList: Equivalent to the $fieldList parameter in Model::save().\n *   It should be an associate array with model name as key and array of fields as value. Eg.\n *   {{{\n *   array(\n *       'SomeModel' => array('field'),\n *       'AssociatedModel' => array('field', 'otherfield')\n *   )\n *   }}}\n * - deep: If set to true, not only directly associated data is saved, but deeper nested associated data as well.\n *\n * @param array $data Record data to save. This should be an array indexed by association name.\n * @param array $options Options to use when saving record data, See $options above.\n * @return mixed If atomic: True on success, or false on failure.\n *    Otherwise: array similar to the $data array passed, but values are set to true/false\n *    depending on whether each record saved successfully.\n * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-saveassociated-array-data-null-array-options-array\n */\n\tpublic function saveAssociated($data = null, $options = array()) {\n\t\tif (empty($data)) {\n\t\t\t$data = $this->data;\n\t\t}\n\n\t\t$options = array_merge(array('validate' => 'first', 'atomic' => true, 'deep' => false), $options);\n\t\t$this->validationErrors = $validationErrors = array();\n\n\t\tif (empty($data) && $options['validate'] !== false) {\n\t\t\t$result = $this->save($data, $options);\n\t\t\tif (!$options['atomic']) {\n\t\t\t\treturn array(!empty($result));\n\t\t\t}\n\t\t\treturn !empty($result);\n\t\t}\n\n\t\tif ($options['validate'] === 'first') {\n\t\t\t$validates = $this->validateAssociated($data, $options);\n\t\t\tif ((!$validates && $options['atomic']) || (!$options['atomic'] && in_array(false, $validates, true))) {\n\t\t\t\treturn $validates;\n\t\t\t}\n\t\t\t$options['validate'] = false;\n\t\t}\n\t\tif ($options['atomic']) {\n\t\t\t$db = $this->getDataSource();\n\t\t\t$transactionBegun = $db->begin();\n\t\t}\n\n\t\t$associations = $this->getAssociated();\n\t\t$return = array();\n\t\t$validates = true;\n\t\tforeach ($data as $association => $values) {\n\t\t\t$notEmpty = !empty($values[$association]) || (!isset($values[$association]) && !empty($values));\n\t\t\tif (isset($associations[$association]) && $associations[$association] === 'belongsTo' && $notEmpty) {\n\t\t\t\t$validates = $this->{$association}->create(null) !== null;\n\t\t\t\t$saved = false;\n\t\t\t\tif ($validates) {\n\t\t\t\t\tif ($options['deep']) {\n\t\t\t\t\t\t$saved = $this->{$association}->saveAssociated($values, array_merge($options, array('atomic' => false)));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$saved = $this->{$association}->save($values, array_merge($options, array('atomic' => false)));\n\t\t\t\t\t}\n\t\t\t\t\t$validates = ($saved === true || (is_array($saved) && !in_array(false, $saved, true)));\n\t\t\t\t}\n\t\t\t\tif ($validates) {\n\t\t\t\t\t$key = $this->belongsTo[$association]['foreignKey'];\n\t\t\t\t\tif (isset($data[$this->alias])) {\n\t\t\t\t\t\t$data[$this->alias][$key] = $this->{$association}->id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$data = array_merge(array($key => $this->{$association}->id), $data, array($key => $this->{$association}->id));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$validationErrors[$association] = $this->{$association}->validationErrors;\n\t\t\t\t}\n\t\t\t\t$return[$association] = $validates;\n\t\t\t}\n\t\t}\n\t\tif ($validates && !($this->create(null) !== null && $this->save($data, $options))) {\n\t\t\t$validationErrors[$this->alias] = $this->validationErrors;\n\t\t\t$validates = false;\n\t\t}\n\t\t$return[$this->alias] = $validates;\n\n\t\tforeach ($data as $association => $values) {\n\t\t\tif (!$validates) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$notEmpty = !empty($values[$association]) || (!isset($values[$association]) && !empty($values));\n\t\t\tif (isset($associations[$association]) && $notEmpty) {\n\t\t\t\t$type = $associations[$association];\n\t\t\t\t$key = $this->{$type}[$association]['foreignKey'];\n\t\t\t\tswitch ($type) {\n\t\t\t\t\tcase 'hasOne':\n\t\t\t\t\t\tif (isset($values[$association])) {\n\t\t\t\t\t\t\t$values[$association][$key] = $this->id;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$values = array_merge(array($key => $this->id), $values, array($key => $this->id));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$validates = $this->{$association}->create(null) !== null;\n\t\t\t\t\t\t$saved = false;\n\t\t\t\t\t\tif ($validates) {\n\t\t\t\t\t\t\tif ($options['deep']) {\n\t\t\t\t\t\t\t\t$saved = $this->{$association}->saveAssociated($values, array_merge($options, array('atomic' => false)));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$saved = $this->{$association}->save($values, $options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$validates = ($validates && ($saved === true || (is_array($saved) && !in_array(false, $saved, true))));\n\t\t\t\t\t\tif (!$validates) {\n\t\t\t\t\t\t\t$validationErrors[$association] = $this->{$association}->validationErrors;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$return[$association] = $validates;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'hasMany':\n\t\t\t\t\t\tforeach ($values as $i => $value) {\n\t\t\t\t\t\t\tif (isset($values[$i][$association])) {\n\t\t\t\t\t\t\t\t$values[$i][$association][$key] = $this->id;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$values[$i] = array_merge(array($key => $this->id), $value, array($key => $this->id));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$_return = $this->{$association}->saveMany($values, array_merge($options, array('atomic' => false)));\n\t\t\t\t\t\tif (in_array(false, $_return, true)) {\n\t\t\t\t\t\t\t$validationErrors[$association] = $this->{$association}->validationErrors;\n\t\t\t\t\t\t\t$validates = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$return[$association] = $_return;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$this->validationErrors = $validationErrors;\n\n\t\tif (isset($validationErrors[$this->alias])) {\n\t\t\t$this->validationErrors = $validationErrors[$this->alias];\n\t\t}\n\n\t\tif (!$options['atomic']) {\n\t\t\treturn $return;\n\t\t}\n\t\tif ($validates) {\n\t\t\tif ($transactionBegun) {\n\t\t\t\treturn $db->commit() !== false;\n\t\t\t} else {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t$db->rollback();\n\t\treturn false;\n\t}\n\n/**\n * Validates a single record, as well as all its directly associated records.\n *\n * #### Options\n *\n * - atomic: If true (default), returns boolean. If false returns array.\n * - fieldList: Equivalent to the $fieldList parameter in Model::save()\n * - deep: If set to true, not only directly associated data , but deeper nested associated data is validated as well.\n *\n * Warning: This method could potentially change the passed argument `$data`,\n * If you do not want this to happen, make a copy of `$data` before passing it\n * to this method\n *\n * @param array $data Record data to validate. This should be an array indexed by association name.\n * @param array $options Options to use when validating record data (see above), See also $options of validates().\n * @return array|boolean If atomic: True on success, or false on failure.\n *    Otherwise: array similar to the $data array passed, but values are set to true/false\n *    depending on whether each record validated successfully.\n */\n\tpublic function validateAssociated(&$data, $options = array()) {\n\t\t$options = array_merge(array('atomic' => true, 'deep' => false), $options);\n\t\t$this->validationErrors = $validationErrors = $return = array();\n\t\t$this->create(null);\n\t\tif (!($this->set($data) && $this->validates($options))) {\n\t\t\t$validationErrors[$this->alias] = $this->validationErrors;\n\t\t\t$return[$this->alias] = false;\n\t\t} else {\n\t\t\t$return[$this->alias] = true;\n\t\t}\n\t\t$data = $this->data;\n\t\tif (!empty($options['deep']) && isset($data[$this->alias])) {\n\t\t\t$recordData = $data[$this->alias];\n\t\t\tunset($data[$this->alias]);\n\t\t\t$data = array_merge($data, $recordData);\n\t\t}\n\n\t\t$associations = $this->getAssociated();\n\t\tforeach ($data as $association => &$values) {\n\t\t\t$validates = true;\n\t\t\tif (isset($associations[$association])) {\n\t\t\t\tif (in_array($associations[$association], array('belongsTo', 'hasOne'))) {\n\t\t\t\t\tif ($options['deep']) {\n\t\t\t\t\t\t$validates = $this->{$association}->validateAssociated($values, $options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$validates = $this->{$association}->create($values) !== null && $this->{$association}->validates($options);\n\t\t\t\t\t}\n\t\t\t\t\tif (is_array($validates)) {\n\t\t\t\t\t\tif (in_array(false, $validates, true)) {\n\t\t\t\t\t\t\t$validates = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$validates = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$return[$association] = $validates;\n\t\t\t\t} elseif ($associations[$association] === 'hasMany') {\n\t\t\t\t\t$validates = $this->{$association}->validateMany($values, $options);\n\t\t\t\t\t$return[$association] = $validates;\n\t\t\t\t}\n\t\t\t\tif (!$validates || (is_array($validates) && in_array(false, $validates, true))) {\n\t\t\t\t\t$validationErrors[$association] = $this->{$association}->validationErrors;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$this->validationErrors = $validationErrors;\n\t\tif (isset($validationErrors[$this->alias])) {\n\t\t\t$this->validationErrors = $validationErrors[$this->alias];\n\t\t}\n\t\tif (!$options['atomic']) {\n\t\t\treturn $return;\n\t\t}\n\t\tif ($return[$this->alias] === false || !empty($this->validationErrors)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n/**\n * Updates multiple model records based on a set of conditions.\n *\n * @param array $fields Set of fields and values, indexed by fields.\n *    Fields are treated as SQL snippets, to insert literal values manually escape your data.\n * @param mixed $conditions Conditions to match, true for all records\n * @return boolean True on success, false on failure\n * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-updateall-array-fields-array-conditions\n */\n\tpublic function updateAll($fields, $conditions = true) {\n\t\treturn $this->getDataSource()->update($this, $fields, null, $conditions);\n\t}\n\n/**\n * Removes record for given ID. If no ID is given, the current ID is used. Returns true on success.\n *\n * @param mixed $id ID of record to delete\n * @param boolean $cascade Set to true to delete records that depend on this record\n * @return boolean True on success\n * @link http://book.cakephp.org/2.0/en/models/deleting-data.html\n */\n\tpublic function delete($id = null, $cascade = true) {\n\t\tif (!empty($id)) {\n\t\t\t$this->id = $id;\n\t\t}\n\t\t$id = $this->id;\n\n\t\t$event = new CakeEvent('Model.beforeDelete', $this, array($cascade));\n\t\tlist($event->break, $event->breakOn) = array(true, array(false, null));\n\t\t$this->getEventManager()->dispatch($event);\n\t\tif (!$event->isStopped()) {\n\t\t\tif (!$this->exists()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t$db = $this->getDataSource();\n\n\t\t\t$this->_deleteDependent($id, $cascade);\n\t\t\t$this->_deleteLinks($id);\n\t\t\t$this->id = $id;\n\n\t\t\t$updateCounterCache = false;\n\t\t\tif (!empty($this->belongsTo)) {\n\t\t\t\tforeach ($this->belongsTo as $parent => $assoc) {\n\t\t\t\t\tif (!empty($assoc['counterCache'])) {\n\t\t\t\t\t\t$updateCounterCache = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$keys = $this->find('first', array(\n\t\t\t\t\t'fields' => $this->_collectForeignKeys(),\n\t\t\t\t\t'conditions' => array($this->alias . '.' . $this->primaryKey => $id),\n\t\t\t\t\t'recursive' => -1,\n\t\t\t\t\t'callbacks' => false\n\t\t\t\t));\n\t\t\t}\n\n\t\t\tif ($db->delete($this, array($this->alias . '.' . $this->primaryKey => $id))) {\n\t\t\t\tif ($updateCounterCache) {\n\t\t\t\t\t$this->updateCounterCache($keys[$this->alias]);\n\t\t\t\t}\n\t\t\t\t$this->getEventManager()->dispatch(new CakeEvent('Model.afterDelete', $this));\n\t\t\t\t$this->_clearCache();\n\t\t\t\t$this->id = false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n/**\n * Cascades model deletes through associated hasMany and hasOne child records.\n *\n * @param string $id ID of record that was deleted\n * @param boolean $cascade Set to true to delete records that depend on this record\n * @return void\n */\n\tprotected function _deleteDependent($id, $cascade) {\n\t\tif (!empty($this->__backAssociation)) {\n\t\t\t$savedAssociatons = $this->__backAssociation;\n\t\t\t$this->__backAssociation = array();\n\t\t}\n\t\tif ($cascade === true) {\n\t\t\tforeach (array_merge($this->hasMany, $this->hasOne) as $assoc => $data) {\n\t\t\t\tif ($data['dependent'] === true) {\n\n\t\t\t\t\t$model = $this->{$assoc};\n\n\t\t\t\t\tif ($data['foreignKey'] === false && $data['conditions'] && in_array($this->name, $model->getAssociated('belongsTo'))) {\n\t\t\t\t\t\t$model->recursive = 0;\n\t\t\t\t\t\t$conditions = array($this->escapeField(null, $this->name) => $id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$model->recursive = -1;\n\t\t\t\t\t\t$conditions = array($model->escapeField($data['foreignKey']) => $id);\n\t\t\t\t\t\tif ($data['conditions']) {\n\t\t\t\t\t\t\t$conditions = array_merge((array)$data['conditions'], $conditions);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isset($data['exclusive']) && $data['exclusive']) {\n\t\t\t\t\t\t$model->deleteAll($conditions);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$records = $model->find('all', array(\n\t\t\t\t\t\t\t'conditions' => $conditions, 'fields' => $model->primaryKey\n\t\t\t\t\t\t));\n\n\t\t\t\t\t\tif (!empty($records)) {\n\t\t\t\t\t\t\tforeach ($records as $record) {\n\t\t\t\t\t\t\t\t$model->delete($record[$model->alias][$model->primaryKey]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isset($savedAssociatons)) {\n\t\t\t$this->__backAssociation = $savedAssociatons;\n\t\t}\n\t}\n\n/**\n * Cascades model deletes through HABTM join keys.\n *\n * @param string $id ID of record that was deleted\n * @return void\n */\n\tprotected function _deleteLinks($id) {\n\t\tforeach ($this->hasAndBelongsToMany as $assoc => $data) {\n\t\t\tlist($plugin, $joinModel) = pluginSplit($data['with']);\n\t\t\t$records = $this->{$joinModel}->find('all', array(\n\t\t\t\t'conditions' => array($this->{$joinModel}->escapeField($data['foreignKey']) => $id),\n\t\t\t\t'fields' => $this->{$joinModel}->primaryKey,\n\t\t\t\t'recursive' => -1,\n\t\t\t\t'callbacks' => false\n\t\t\t));\n\t\t\tif (!empty($records)) {\n\t\t\t\tforeach ($records as $record) {\n\t\t\t\t\t$this->{$joinModel}->delete($record[$this->{$joinModel}->alias][$this->{$joinModel}->primaryKey]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n/**\n * Deletes multiple model records based on a set of conditions.\n *\n * @param mixed $conditions Conditions to match\n * @param boolean $cascade Set to true to delete records that depend on this record\n * @param boolean $callbacks Run callbacks\n * @return boolean True on success, false on failure\n * @link http://book.cakephp.org/2.0/en/models/deleting-data.html#deleteall\n */\n\tpublic function deleteAll($conditions, $cascade = true, $callbacks = false) {\n\t\tif (empty($conditions)) {\n\t\t\treturn false;\n\t\t}\n\t\t$db = $this->getDataSource();\n\n\t\tif (!$cascade && !$callbacks) {\n\t\t\treturn $db->delete($this, $conditions);\n\t\t} else {\n\t\t\t$ids = $this->find('all', array_merge(array(\n\t\t\t\t'fields' => \"{$this->alias}.{$this->primaryKey}\",\n\t\t\t\t'recursive' => 0), compact('conditions'))\n\t\t\t);\n\t\t\tif ($ids === false) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t$ids = Set::extract($ids, \"{n}.{$this->alias}.{$this->primaryKey}\");\n\t\t\tif (empty($ids)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif ($callbacks) {\n\t\t\t\t$_id = $this->id;\n\t\t\t\t$result = true;\n\t\t\t\tforeach ($ids as $id) {\n\t\t\t\t\t$result = ($result && $this->delete($id, $cascade));\n\t\t\t\t}\n\t\t\t\t$this->id = $_id;\n\t\t\t\treturn $result;\n\t\t\t} else {\n\t\t\t\tforeach ($ids as $id) {\n\t\t\t\t\t$this->_deleteLinks($id);\n\t\t\t\t\tif ($cascade) {\n\t\t\t\t\t\t$this->_deleteDependent($id, $cascade);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn $db->delete($this, array($this->alias . '.' . $this->primaryKey => $ids));\n\t\t\t}\n\t\t}\n\t}\n\n/**\n * Collects foreign keys from associations.\n *\n * @param string $type\n * @return array\n */\n\tprotected function _collectForeignKeys($type = 'belongsTo') {\n\t\t$result = array();\n\n\t\tforeach ($this->{$type} as $assoc => $data) {\n\t\t\tif (isset($data['foreignKey']) && is_string($data['foreignKey'])) {\n\t\t\t\t$result[$assoc] = $data['foreignKey'];\n\t\t\t}\n\t\t}\n\t\treturn $result;\n\t}\n\n/**\n * Returns true if a record with particular ID exists.\n *\n * If $id is not passed it calls Model::getID() to obtain the current record ID,\n * and then performs a Model::find('count') on the currently configured datasource\n * to ascertain the existence of the record in persistent storage.\n *\n * @param mixed $id ID of record to check for existence\n * @return boolean True if such a record exists\n */\n\tpublic function exists($id = null) {\n\t\tif ($id === null) {\n\t\t\t$id = $this->getID();\n\t\t}\n\t\tif ($id === false) {\n\t\t\treturn false;\n\t\t}\n\t\t$conditions = array($this->alias . '.' . $this->primaryKey => $id);\n\t\t$query = array('conditions' => $conditions, 'recursive' => -1, 'callbacks' => false);\n\t\treturn ($this->find('count', $query) > 0);\n\t}\n\n/**\n * Returns true if a record that meets given conditions exists.\n *\n * @param array $conditions SQL conditions array\n * @return boolean True if such a record exists\n */\n\tpublic function hasAny($conditions = null) {\n\t\treturn ($this->find('count', array('conditions' => $conditions, 'recursive' => -1)) != false);\n\t}\n\n/**\n * Queries the datasource and returns a result set array.\n *\n * Also used to perform notation finds, where the first argument is type of find operation to perform\n * (all / first / count / neighbors / list / threaded),\n * second parameter options for finding ( indexed array, including: 'conditions', 'limit',\n * 'recursive', 'page', 'fields', 'offset', 'order')\n *\n * Eg:\n * {{{\n * \tfind('all', array(\n * \t\t'conditions' => array('name' => 'Thomas Anderson'),\n * \t\t'fields' => array('name', 'email'),\n * \t\t'order' => 'field3 DESC',\n * \t\t'recursive' => 2,\n * \t\t'group' => 'type'\n * ));\n * }}}\n *\n * In addition to the standard query keys above, you can provide Datasource, and behavior specific\n * keys.  For example, when using a SQL based datasource you can use the joins key to specify additional\n * joins that should be part of the query.\n *\n * {{{\n * find('all', array(\n * \t\t'conditions' => array('name' => 'Thomas Anderson'),\n * \t\t'joins' => array(\n *\t\t\tarray(\n * \t\t\t\t'alias' => 'Thought',\n * \t\t\t\t'table' => 'thoughts',\n * \t\t\t\t'type' => 'LEFT',\n * \t\t\t\t'conditions' => '`Thought`.`person_id` = `Person`.`id`'\n *\t\t\t)\n * \t\t)\n * ));\n * }}}\n *\n * Behaviors and find types can also define custom finder keys which are passed into find().\n *\n * Specifying 'fields' for notation 'list':\n *\n *  - If no fields are specified, then 'id' is used for key and 'model->displayField' is used for value.\n *  - If a single field is specified, 'id' is used for key and specified field is used for value.\n *  - If three fields are specified, they are used (in order) for key, value and group.\n *  - Otherwise, first and second fields are used for key and value.\n *\n *  Note: find(list) + database views have issues with MySQL 5.0. Try upgrading to MySQL 5.1 if you\n *  have issues with database views.\n * @param string $type Type of find operation (all / first / count / neighbors / list / threaded)\n * @param array $query Option fields (conditions / fields / joins / limit / offset / order / page / group / callbacks)\n * @return array Array of records\n * @link http://book.cakephp.org/2.0/en/models/deleting-data.html#deleteall\n */\n\tpublic function find($type = 'first', $query = array()) {\n\t\t$this->findQueryType = $type;\n\t\t$this->id = $this->getID();\n\n\t\t$query = $this->buildQuery($type, $query);\n\t\tif (is_null($query)) {\n\t\t\treturn null;\n\t\t}\n\n\t\t$results = $this->getDataSource()->read($this, $query);\n\t\t$this->resetAssociations();\n\n\t\tif ($query['callbacks'] === true || $query['callbacks'] === 'after') {\n\t\t\t$results = $this->_filterResults($results);\n\t\t}\n\n\t\t$this->findQueryType = null;\n\n\t\tif ($type === 'all') {\n\t\t\treturn $results;\n\t\t} else {\n\t\t\tif ($this->findMethods[$type] === true) {\n\t\t\t\treturn $this->{'_find' . ucfirst($type)}('after', $query, $results);\n\t\t\t}\n\t\t}\n\t}\n\n/**\n * Builds the query array that is used by the data source to generate the query to fetch the data.\n *\n * @param string $type Type of find operation (all / first / count / neighbors / list / threaded)\n * @param array $query Option fields (conditions / fields / joins / limit / offset / order / page / group / callbacks)\n * @return array Query array or null if it could not be build for some reasons\n * @see Model::find()\n */\n\tpublic function buildQuery($type = 'first', $query = array()) {\n\t\t$query = array_merge(\n\t\t\tarray(\n\t\t\t\t'conditions' => null, 'fields' => null, 'joins' => array(), 'limit' => null,\n\t\t\t\t'offset' => null, 'order' => null, 'page' => 1, 'group' => null, 'callbacks' => true,\n\t\t\t),\n\t\t\t(array)$query\n\t\t);\n\n\t\tif ($type !== 'all') {\n\t\t\tif ($this->findMethods[$type] === true) {\n\t\t\t\t$query = $this->{'_find' . ucfirst($type)}('before', $query);\n\t\t\t}\n\t\t}\n\n\t\tif (!is_numeric($query['page']) || intval($query['page']) < 1) {\n\t\t\t$query['page'] = 1;\n\t\t}\n\t\tif ($query['page'] > 1 && !empty($query['limit'])) {\n\t\t\t$query['offset'] = ($query['page'] - 1) * $query['limit'];\n\t\t}\n\t\tif ($query['order'] === null && $this->order !== null) {\n\t\t\t$query['order'] = $this->order;\n\t\t}\n\t\t$query['order'] = array($query['order']);\n\n\t\tif ($query['callbacks'] === true || $query['callbacks'] === 'before') {\n\t\t\t$event = new CakeEvent('Model.beforeFind', $this, array($query));\n\t\t\tlist($event->break, $event->breakOn, $event->modParams) = array(true, array(false, null), 0);\n\t\t\t$this->getEventManager()->dispatch($event);\n\t\t\tif ($event->isStopped()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t$query = $event->result === true ? $event->data[0] : $event->result;\n\t\t}\n\n\t\treturn $query;\n\t}\n\n/**\n * Handles the before/after filter logic for find('first') operations.  Only called by Model::find().\n *\n * @param string $state Either \"before\" or \"after\"\n * @param array $query\n * @param array $results\n * @return array\n * @see Model::find()\n */\n\tprotected function _findFirst($state, $query, $results = array()) {\n\t\tif ($state === 'before') {\n\t\t\t$query['limit'] = 1;\n\t\t\treturn $query;\n\t\t} elseif ($state === 'after') {\n\t\t\tif (empty($results[0])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn $results[0];\n\t\t}\n\t}\n\n/**\n * Handles the before/after filter logic for find('count') operations.  Only called by Model::find().\n *\n * @param string $state Either \"before\" or \"after\"\n * @param array $query\n * @param array $results\n * @return integer The number of records found, or false\n * @see Model::find()\n */\n\tprotected function _findCount($state, $query, $results = array()) {\n\t\tif ($state === 'before') {\n\t\t\t$db = $this->getDataSource();\n\t\t\t$query['order'] = false;\n\t\t\tif (!method_exists($db, 'calculate')) {\n\t\t\t\treturn $query;\n\t\t\t}\n\t\t\tif (empty($query['fields'])) {\n\t\t\t\t$query['fields'] = $db->calculate($this, 'count');\n\t\t\t} elseif (method_exists($db, 'expression') && is_string($query['fields']) && !preg_match('/count/i', $query['fields'])) {\n\t\t\t\t$query['fields'] = $db->calculate($this, 'count', array(\n\t\t\t\t\t$db->expression($query['fields']), 'count'\n\t\t\t\t));\n\t\t\t}\n\t\t\treturn $query;\n\t\t} elseif ($state === 'after') {\n\t\t\tforeach (array(0, $this->alias) as $key) {\n\t\t\t\tif (isset($results[0][$key]['count'])) {\n\t\t\t\t\tif (($count = count($results)) > 1) {\n\t\t\t\t\t\treturn $count;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn intval($results[0][$key]['count']);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\n/**\n * Handles the before/after filter logic for find('list') operations.  Only called by Model::find().\n *\n * @param string $state Either \"before\" or \"after\"\n * @param array $query\n * @param array $results\n * @return array Key/value pairs of primary keys/display field values of all records found\n * @see Model::find()\n */\n\tprotected function _findList($state, $query, $results = array()) {\n\t\tif ($state === 'before') {\n\t\t\tif (empty($query['fields'])) {\n\t\t\t\t$query['fields'] = array(\"{$this->alias}.{$this->primaryKey}\", \"{$this->alias}.{$this->displayField}\");\n\t\t\t\t$list = array(\"{n}.{$this->alias}.{$this->primaryKey}\", \"{n}.{$this->alias}.{$this->displayField}\", null);\n\t\t\t} else {\n\t\t\t\tif (!is_array($query['fields'])) {\n\t\t\t\t\t$query['fields'] = String::tokenize($query['fields']);\n\t\t\t\t}\n\n\t\t\t\tif (count($query['fields']) === 1) {\n\t\t\t\t\tif (strpos($query['fields'][0], '.') === false) {\n\t\t\t\t\t\t$query['fields'][0] = $this->alias . '.' . $query['fields'][0];\n\t\t\t\t\t}\n\n\t\t\t\t\t$list = array(\"{n}.{$this->alias}.{$this->primaryKey}\", '{n}.' . $query['fields'][0], null);\n\t\t\t\t\t$query['fields'] = array(\"{$this->alias}.{$this->primaryKey}\", $query['fields'][0]);\n\t\t\t\t} elseif (count($query['fields']) === 3) {\n\t\t\t\t\tfor ($i = 0; $i < 3; $i++) {\n\t\t\t\t\t\tif (strpos($query['fields'][$i], '.') === false) {\n\t\t\t\t\t\t\t$query['fields'][$i] = $this->alias . '.' . $query['fields'][$i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$list = array('{n}.' . $query['fields'][0], '{n}.' . $query['fields'][1], '{n}.' . $query['fields'][2]);\n\t\t\t\t} else {\n\t\t\t\t\tfor ($i = 0; $i < 2; $i++) {\n\t\t\t\t\t\tif (strpos($query['fields'][$i], '.') === false) {\n\t\t\t\t\t\t\t$query['fields'][$i] = $this->alias . '.' . $query['fields'][$i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$list = array('{n}.' . $query['fields'][0], '{n}.' . $query['fields'][1], null);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!isset($query['recursive']) || $query['recursive'] === null) {\n\t\t\t\t$query['recursive'] = -1;\n\t\t\t}\n\t\t\tlist($query['list']['keyPath'], $query['list']['valuePath'], $query['list']['groupPath']) = $list;\n\t\t\treturn $query;\n\t\t} elseif ($state === 'after') {\n\t\t\tif (empty($results)) {\n\t\t\t\treturn array();\n\t\t\t}\n\t\t\t$lst = $query['list'];\n\t\t\treturn Set::combine($results, $lst['keyPath'], $lst['valuePath'], $lst['groupPath']);\n\t\t}\n\t}\n\n/**\n * Detects the previous field's value, then uses logic to find the 'wrapping'\n * rows and return them.\n *\n * @param string $state Either \"before\" or \"after\"\n * @param mixed $query\n * @param array $results\n * @return array\n */\n\tprotected function _findNeighbors($state, $query, $results = array()) {\n\t\tif ($state === 'before') {\n\t\t\textract($query);\n\t\t\t$conditions = (array)$conditions;\n\t\t\tif (isset($field) && isset($value)) {\n\t\t\t\tif (strpos($field, '.') === false) {\n\t\t\t\t\t$field = $this->alias . '.' . $field;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$field = $this->alias . '.' . $this->primaryKey;\n\t\t\t\t$value = $this->id;\n\t\t\t}\n\t\t\t$query['conditions'] = array_merge($conditions, array($field . ' <' => $value));\n\t\t\t$query['order'] = $field . ' DESC';\n\t\t\t$query['limit'] = 1;\n\t\t\t$query['field'] = $field;\n\t\t\t$query['value'] = $value;\n\t\t\treturn $query;\n\t\t} elseif ($state === 'after') {\n\t\t\textract($query);\n\t\t\tunset($query['conditions'][$field . ' <']);\n\t\t\t$return = array();\n\t\t\tif (isset($results[0])) {\n\t\t\t\t$prevVal = Set::extract('/' . str_replace('.', '/', $field), $results[0]);\n\t\t\t\t$query['conditions'][$field . ' >='] = $prevVal[0];\n\t\t\t\t$query['conditions'][$field . ' !='] = $value;\n\t\t\t\t$query['limit'] = 2;\n\t\t\t} else {\n\t\t\t\t$return['prev'] = null;\n\t\t\t\t$query['conditions'][$field . ' >'] = $value;\n\t\t\t\t$query['limit'] = 1;\n\t\t\t}\n\t\t\t$query['order'] = $field . ' ASC';\n\t\t\t$return2 = $this->find('all', $query);\n\t\t\tif (!array_key_exists('prev', $return)) {\n\t\t\t\t$return['prev'] = $return2[0];\n\t\t\t}\n\t\t\tif (count($return2) === 2) {\n\t\t\t\t$return['next'] = $return2[1];\n\t\t\t} elseif (count($return2) === 1 && !$return['prev']) {\n\t\t\t\t$return['next'] = $return2[0];\n\t\t\t} else {\n\t\t\t\t$return['next'] = null;\n\t\t\t}\n\t\t\treturn $return;\n\t\t}\n\t}\n\n/**\n * In the event of ambiguous results returned (multiple top level results, with different parent_ids)\n * top level results with different parent_ids to the first result will be dropped\n *\n * @param mixed $state\n * @param mixed $query\n * @param array $results\n * @return array Threaded results\n */\n\tprotected function _findThreaded($state, $query, $results = array()) {\n\t\tif ($state === 'before') {\n\t\t\treturn $query;\n\t\t} elseif ($state === 'after') {\n\t\t\t$parent = 'parent_id';\n\t\t\tif (isset($query['parent'])) {\n\t\t\t\t$parent = $query['parent'];\n\t\t\t}\n\t\t\treturn Set::nest($results, array(\n\t\t\t\t'idPath' => '/' . $this->alias . '/' . $this->primaryKey,\n\t\t\t\t'parentPath' => '/' . $this->alias . '/' . $parent\n\t\t\t));\n\t\t}\n\t}\n\n/**\n * Passes query results through model and behavior afterFilter() methods.\n *\n * @param array $results Results to filter\n * @param boolean $primary If this is the primary model results (results from model where the find operation was performed)\n * @return array Set of filtered results\n */\n\tprotected function _filterResults($results, $primary = true) {\n\t\t$event = new CakeEvent('Model.afterFind', $this, array($results, $primary));\n\t\t$event->modParams = 0;\n\t\t$this->getEventManager()->dispatch($event);\n\t\treturn $event->result;\n\t}\n\n/**\n * This resets the association arrays for the model back\n * to those originally defined in the model. Normally called at the end\n * of each call to Model::find()\n *\n * @return boolean Success\n */\n\tpublic function resetAssociations() {\n\t\tif (!empty($this->__backAssociation)) {\n\t\t\tforeach ($this->_associations as $type) {\n\t\t\t\tif (isset($this->__backAssociation[$type])) {\n\t\t\t\t\t$this->{$type} = $this->__backAssociation[$type];\n\t\t\t\t}\n\t\t\t}\n\t\t\t$this->__backAssociation = array();\n\t\t}\n\n\t\tforeach ($this->_associations as $type) {\n\t\t\tforeach ($this->{$type} as $key => $name) {\n\t\t\t\tif (property_exists($this, $key) && !empty($this->{$key}->__backAssociation)) {\n\t\t\t\t\t$this->{$key}->resetAssociations();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$this->__backAssociation = array();\n\t\treturn true;\n\t}\n\n/**\n * Returns false if any fields passed match any (by default, all if $or = false) of their matching values.\n *\n * @param array $fields Field/value pairs to search (if no values specified, they are pulled from $this->data)\n * @param boolean $or If false, all fields specified must match in order for a false return value\n * @return boolean False if any records matching any fields are found\n */\n\tpublic function isUnique($fields, $or = true) {\n\t\tif (!is_array($fields)) {\n\t\t\t$fields = func_get_args();\n\t\t\tif (is_bool($fields[count($fields) - 1])) {\n\t\t\t\t$or = $fields[count($fields) - 1];\n\t\t\t\tunset($fields[count($fields) - 1]);\n\t\t\t}\n\t\t}\n\n\t\tforeach ($fields as $field => $value) {\n\t\t\tif (is_numeric($field)) {\n\t\t\t\tunset($fields[$field]);\n\n\t\t\t\t$field = $value;\n\t\t\t\tif (isset($this->data[$this->alias][$field])) {\n\t\t\t\t\t$value = $this->data[$this->alias][$field];\n\t\t\t\t} else {\n\t\t\t\t\t$value = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strpos($field, '.') === false) {\n\t\t\t\tunset($fields[$field]);\n\t\t\t\t$fields[$this->alias . '.' . $field] = $value;\n\t\t\t}\n\t\t}\n\t\tif ($or) {\n\t\t\t$fields = array('or' => $fields);\n\t\t}\n\t\tif (!empty($this->id)) {\n\t\t\t$fields[$this->alias . '.' . $this->primaryKey . ' !='] = $this->id;\n\t\t}\n\t\treturn ($this->find('count', array('conditions' => $fields, 'recursive' => -1)) == 0);\n\t}\n\n/**\n * Returns a resultset for a given SQL statement. Custom SQL queries should be performed with this method.\n *\n * @param string $sql,... SQL statement\n * @return mixed Resultset array or boolean indicating success / failure depending on the query executed\n * @link http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#model-query\n */\n\tpublic function query($sql) {\n\t\t$params = func_get_args();\n\t\t$db = $this->getDataSource();\n\t\treturn call_user_func_array(array(&$db, 'query'), $params);\n\t}\n\n/**\n * Returns true if all fields pass validation. Will validate hasAndBelongsToMany associations\n * that use the 'with' key as well. Since _saveMulti is incapable of exiting a save operation.\n *\n * Will validate the currently set data.  Use Model::set() or Model::create() to set the active data.\n *\n * @param array $options An optional array of custom options to be made available in the beforeValidate callback\n * @return boolean True if there are no errors\n */\n\tpublic function validates($options = array()) {\n\t\t$errors = $this->invalidFields($options);\n\t\tif (empty($errors) && $errors !== false) {\n\t\t\t$errors = $this->_validateWithModels($options);\n\t\t}\n\t\tif (is_array($errors)) {\n\t\t\treturn count($errors) === 0;\n\t\t}\n\t\treturn $errors;\n\t}\n\n/**\n * Returns an array of fields that have failed validation. On the current model.\n *\n * @param string $options An optional array of custom options to be made available in the beforeValidate callback\n * @return array Array of invalid fields\n * @see Model::validates()\n */\n\tpublic function invalidFields($options = array()) {\n\t\t$event = new CakeEvent('Model.beforeValidate', $this, array($options));\n\t\tlist($event->break, $event->breakOn) = array(true, false);\n\t\t$this->getEventManager()->dispatch($event);\n\t\tif ($event->isStopped()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!isset($this->validate) || empty($this->validate)) {\n\t\t\treturn $this->validationErrors;\n\t\t}\n\n\t\t$data = $this->data;\n\t\t$methods = array_map('strtolower', get_class_methods($this));\n\t\t$behaviorMethods = array_keys($this->Behaviors->methods());\n\n\t\tif (isset($data[$this->alias])) {\n\t\t\t$data = $data[$this->alias];\n\t\t} elseif (!is_array($data)) {\n\t\t\t$data = array();\n\t\t}\n\n\t\t$exists = null;\n\n\t\t$_validate = $this->validate;\n\t\t$whitelist = $this->whitelist;\n\n\t\tif (!empty($options['fieldList'])) {\n\t\t\tif (!empty($options['fieldList'][$this->alias]) && is_array($options['fieldList'][$this->alias])) {\n\t\t\t\t$whitelist = $options['fieldList'][$this->alias];\n\t\t\t} else {\n\t\t\t\t$whitelist = $options['fieldList'];\n\t\t\t}\n\t\t}\n\n\t\tif (!empty($whitelist)) {\n\t\t\t$validate = array();\n\t\t\tforeach ((array)$whitelist as $f) {\n\t\t\t\tif (!empty($this->validate[$f])) {\n\t\t\t\t\t$validate[$f] = $this->validate[$f];\n\t\t\t\t}\n\t\t\t}\n\t\t\t$this->validate = $validate;\n\t\t}\n\n\t\t$validationDomain = $this->validationDomain;\n\t\tif (empty($validationDomain)) {\n\t\t\t$validationDomain = 'default';\n\t\t}\n\n\t\tforeach ($this->validate as $fieldName => $ruleSet) {\n\t\t\tif (!is_array($ruleSet) || (is_array($ruleSet) && isset($ruleSet['rule']))) {\n\t\t\t\t$ruleSet = array($ruleSet);\n\t\t\t}\n\t\t\t$default = array(\n\t\t\t\t'allowEmpty' => null,\n\t\t\t\t'required' => null,\n\t\t\t\t'rule' => 'blank',\n\t\t\t\t'last' => true,\n\t\t\t\t'on' => null\n\t\t\t);\n\n\t\t\tforeach ($ruleSet as $index => $validator) {\n\t\t\t\tif (!is_array($validator)) {\n\t\t\t\t\t$validator = array('rule' => $validator);\n\t\t\t\t}\n\t\t\t\t$validator = array_merge($default, $validator);\n\n\t\t\t\tif (!empty($validator['on']) || in_array($validator['required'], array('create', 'update'), true)) {\n\t\t\t\t\tif ($exists === null) {\n\t\t\t\t\t\t$exists = $this->exists();\n\t\t\t\t\t}\n\t\t\t\t\tif ($validator['on'] == 'create' && $exists || $validator['on'] == 'update' && !$exists) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif ($validator['required'] === 'create' && !$exists || $validator['required'] === 'update' && $exists) {\n\t\t\t\t\t\t$validator['required'] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$valid = true;\n\t\t\t\t$requiredFail = (\n\t\t\t\t\t(!isset($data[$fieldName]) && $validator['required'] === true) ||\n\t\t\t\t\t(\n\t\t\t\t\t\tisset($data[$fieldName]) && (empty($data[$fieldName]) &&\n\t\t\t\t\t\t!is_numeric($data[$fieldName])) && $validator['allowEmpty'] === false\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\tif (!$requiredFail && array_key_exists($fieldName, $data)) {\n\t\t\t\t\tif (empty($data[$fieldName]) && $data[$fieldName] != '0' && $validator['allowEmpty'] === true) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (is_array($validator['rule'])) {\n\t\t\t\t\t\t$rule = $validator['rule'][0];\n\t\t\t\t\t\tunset($validator['rule'][0]);\n\t\t\t\t\t\t$ruleParams = array_merge(array($data[$fieldName]), array_values($validator['rule']));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$rule = $validator['rule'];\n\t\t\t\t\t\t$ruleParams = array($data[$fieldName]);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (in_array(strtolower($rule), $methods)) {\n\t\t\t\t\t\t$ruleParams[] = $validator;\n\t\t\t\t\t\t$ruleParams[0] = array($fieldName => $ruleParams[0]);\n\t\t\t\t\t\t$valid = $this->dispatchMethod($rule, $ruleParams);\n\t\t\t\t\t} elseif (in_array($rule, $behaviorMethods) || in_array(strtolower($rule), $behaviorMethods)) {\n\t\t\t\t\t\t$ruleParams[] = $validator;\n\t\t\t\t\t\t$ruleParams[0] = array($fieldName => $ruleParams[0]);\n\t\t\t\t\t\t$valid = $this->Behaviors->dispatchMethod($this, $rule, $ruleParams);\n\t\t\t\t\t} elseif (method_exists('Validation', $rule)) {\n\t\t\t\t\t\t$valid = call_user_func_array(array('Validation', $rule), $ruleParams);\n\t\t\t\t\t} elseif (!is_array($validator['rule'])) {\n\t\t\t\t\t\t$valid = preg_match($rule, $data[$fieldName]);\n\t\t\t\t\t} elseif (Configure::read('debug') > 0) {\n\t\t\t\t\t\ttrigger_error(__d('cake_dev', 'Could not find validation handler %s for %s', $rule, $fieldName), E_USER_WARNING);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ($requiredFail || !$valid || (is_string($valid) && strlen($valid) > 0)) {\n\t\t\t\t\tif (is_string($valid)) {\n\t\t\t\t\t\t$message = $valid;\n\t\t\t\t\t} elseif (isset($validator['message'])) {\n\t\t\t\t\t\t$args = null;\n\t\t\t\t\t\tif (is_array($validator['message'])) {\n\t\t\t\t\t\t\t$message = $validator['message'][0];\n\t\t\t\t\t\t\t$args = array_slice($validator['message'], 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$message = $validator['message'];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (is_array($validator['rule']) && $args === null) {\n\t\t\t\t\t\t\t$args = array_slice($ruleSet[$index]['rule'], 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$message = __d($validationDomain, $message, $args);\n\t\t\t\t\t} elseif (is_string($index)) {\n\t\t\t\t\t\tif (is_array($validator['rule'])) {\n\t\t\t\t\t\t\t$args = array_slice($ruleSet[$index]['rule'], 1);\n\t\t\t\t\t\t\t$message = __d($validationDomain, $index, $args);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$message = __d($validationDomain, $index);\n\t\t\t\t\t\t}\n\t\t\t\t\t} elseif (!$requiredFail && is_numeric($index) && count($ruleSet) > 1) {\n\t\t\t\t\t\t$message = $index + 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$message = __d('cake_dev', 'This field cannot be left blank');\n\t\t\t\t\t}\n\n\t\t\t\t\t$this->invalidate($fieldName, $message);\n\t\t\t\t\tif ($validator['last']) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$this->validate = $_validate;\n\t\treturn $this->validationErrors;\n\t}\n\n/**\n * Runs validation for hasAndBelongsToMany associations that have 'with' keys\n * set. And data in the set() data set.\n *\n * @param array $options Array of options to use on Validation of with models\n * @return boolean Failure of validation on with models.\n * @see Model::validates()\n */\n\tprotected function _validateWithModels($options) {\n\t\t$valid = true;\n\t\tforeach ($this->hasAndBelongsToMany as $assoc => $association) {\n\t\t\tif (empty($association['with']) || !isset($this->data[$assoc])) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlist($join) = $this->joinModel($this->hasAndBelongsToMany[$assoc]['with']);\n\t\t\t$data = $this->data[$assoc];\n\n\t\t\t$newData = array();\n\t\t\tforeach ((array)$data as $row) {\n\t\t\t\tif (isset($row[$this->hasAndBelongsToMany[$assoc]['associationForeignKey']])) {\n\t\t\t\t\t$newData[] = $row;\n\t\t\t\t} elseif (isset($row[$join]) && isset($row[$join][$this->hasAndBelongsToMany[$assoc]['associationForeignKey']])) {\n\t\t\t\t\t$newData[] = $row[$join];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (empty($newData)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tforeach ($newData as $data) {\n\t\t\t\t$data[$this->hasAndBelongsToMany[$assoc]['foreignKey']] = $this->id;\n\t\t\t\t$this->{$join}->create($data);\n\t\t\t\t$valid = ($valid && $this->{$join}->validates($options));\n\t\t\t}\n\t\t}\n\t\treturn $valid;\n\t}\n\n/**\n * Marks a field as invalid, optionally setting the name of validation\n * rule (in case of multiple validation for field) that was broken.\n *\n * @param string $field The name of the field to invalidate\n * @param mixed $value Name of validation rule that was not failed, or validation message to\n *    be returned. If no validation key is provided, defaults to true.\n * @return void\n */\n\tpublic function invalidate($field, $value = true) {\n\t\tif (!is_array($this->validationErrors)) {\n\t\t\t$this->validationErrors = array();\n\t\t}\n\t\t$this->validationErrors[$field][] = $value;\n\t}\n\n/**\n * Returns true if given field name is a foreign key in this model.\n *\n * @param string $field Returns true if the input string ends in \"_id\"\n * @return boolean True if the field is a foreign key listed in the belongsTo array.\n */\n\tpublic function isForeignKey($field) {\n\t\t$foreignKeys = array();\n\t\tif (!empty($this->belongsTo)) {\n\t\t\tforeach ($this->belongsTo as $assoc => $data) {\n\t\t\t\t$foreignKeys[] = $data['foreignKey'];\n\t\t\t}\n\t\t}\n\t\treturn in_array($field, $foreignKeys);\n\t}\n\n/**\n * Escapes the field name and prepends the model name. Escaping is done according to the\n * current database driver's rules.\n *\n * @param string $field Field to escape (e.g: id)\n * @param string $alias Alias for the model (e.g: Post)\n * @return string The name of the escaped field for this Model (i.e. id becomes `Post`.`id`).\n */\n\tpublic function escapeField($field = null, $alias = null) {\n\t\tif (empty($alias)) {\n\t\t\t$alias = $this->alias;\n\t\t}\n\t\tif (empty($field)) {\n\t\t\t$field = $this->primaryKey;\n\t\t}\n\t\t$db = $this->getDataSource();\n\t\tif (strpos($field, $db->name($alias) . '.') === 0) {\n\t\t\treturn $field;\n\t\t}\n\t\treturn $db->name($alias . '.' . $field);\n\t}\n\n/**\n * Returns the current record's ID\n *\n * @param integer $list Index on which the composed ID is located\n * @return mixed The ID of the current record, false if no ID\n */\n\tpublic function getID($list = 0) {\n\t\tif (empty($this->id) || (is_array($this->id) && isset($this->id[0]) && empty($this->id[0]))) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!is_array($this->id)) {\n\t\t\treturn $this->id;\n\t\t}\n\n\t\tif (isset($this->id[$list]) && !empty($this->id[$list])) {\n\t\t\treturn $this->id[$list];\n\t\t} elseif (isset($this->id[$list])) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn current($this->id);\n\t}\n\n/**\n * Returns the ID of the last record this model inserted.\n *\n * @return mixed Last inserted ID\n */\n\tpublic function getLastInsertID() {\n\t\treturn $this->getInsertID();\n\t}\n\n/**\n * Returns the ID of the last record this model inserted.\n *\n * @return mixed Last inserted ID\n */\n\tpublic function getInsertID() {\n\t\treturn $this->_insertID;\n\t}\n\n/**\n * Sets the ID of the last record this model inserted\n *\n * @param mixed $id Last inserted ID\n * @return void\n */\n\tpublic function setInsertID($id) {\n\t\t$this->_insertID = $id;\n\t}\n\n/**\n * Returns the number of rows returned from the last query.\n *\n * @return integer Number of rows\n */\n\tpublic function getNumRows() {\n\t\treturn $this->getDataSource()->lastNumRows();\n\t}\n\n/**\n * Returns the number of rows affected by the last query.\n *\n * @return integer Number of rows\n */\n\tpublic function getAffectedRows() {\n\t\treturn $this->getDataSource()->lastAffected();\n\t}\n\n/**\n * Sets the DataSource to which this model is bound.\n *\n * @param string $dataSource The name of the DataSource, as defined in app/Config/database.php\n * @return void\n * @throws MissingConnectionException\n */\n\tpublic function setDataSource($dataSource = null) {\n\t\t$oldConfig = $this->useDbConfig;\n\n\t\tif ($dataSource != null) {\n\t\t\t$this->useDbConfig = $dataSource;\n\t\t}\n\t\t$db = ConnectionManager::getDataSource($this->useDbConfig);\n\t\tif (!empty($oldConfig) && isset($db->config['prefix'])) {\n\t\t\t$oldDb = ConnectionManager::getDataSource($oldConfig);\n\n\t\t\tif (!isset($this->tablePrefix) || (!isset($oldDb->config['prefix']) || $this->tablePrefix == $oldDb->config['prefix'])) {\n\t\t\t\t$this->tablePrefix = $db->config['prefix'];\n\t\t\t}\n\t\t} elseif (isset($db->config['prefix'])) {\n\t\t\t$this->tablePrefix = $db->config['prefix'];\n\t\t}\n\n\t\t$this->schemaName = $db->getSchemaName();\n\n\t\tif (empty($db) || !is_object($db)) {\n\t\t\tthrow new MissingConnectionException(array('class' => $this->name));\n\t\t}\n\t}\n\n/**\n * Gets the DataSource to which this model is bound.\n *\n * @return DataSource A DataSource object\n */\n\tpublic function getDataSource() {\n\t\tif (!$this->_sourceConfigured && $this->useTable !== false) {\n\t\t\t$this->_sourceConfigured = true;\n\t\t\t$this->setSource($this->useTable);\n\t\t}\n\t\treturn ConnectionManager::getDataSource($this->useDbConfig);\n\t}\n\n/**\n * Get associations\n *\n * @return array\n */\n\tpublic function associations() {\n\t\treturn $this->_associations;\n\t}\n\n/**\n * Gets all the models with which this model is associated.\n *\n * @param string $type Only result associations of this type\n * @return array Associations\n */\n\tpublic function getAssociated($type = null) {\n\t\tif ($type == null) {\n\t\t\t$associated = array();\n\t\t\tforeach ($this->_associations as $assoc) {\n\t\t\t\tif (!empty($this->{$assoc})) {\n\t\t\t\t\t$models = array_keys($this->{$assoc});\n\t\t\t\t\tforeach ($models as $m) {\n\t\t\t\t\t\t$associated[$m] = $assoc;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn $associated;\n\t\t} elseif (in_array($type, $this->_associations)) {\n\t\t\tif (empty($this->{$type})) {\n\t\t\t\treturn array();\n\t\t\t}\n\t\t\treturn array_keys($this->{$type});\n\t\t} else {\n\t\t\t$assoc = array_merge(\n\t\t\t\t$this->hasOne,\n\t\t\t\t$this->hasMany,\n\t\t\t\t$this->belongsTo,\n\t\t\t\t$this->hasAndBelongsToMany\n\t\t\t);\n\t\t\tif (array_key_exists($type, $assoc)) {\n\t\t\t\tforeach ($this->_associations as $a) {\n\t\t\t\t\tif (isset($this->{$a}[$type])) {\n\t\t\t\t\t\t$assoc[$type]['association'] = $a;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn $assoc[$type];\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\n/**\n * Gets the name and fields to be used by a join model.  This allows specifying join fields\n * in the association definition.\n *\n * @param string|array $assoc The model to be joined\n * @param array $keys Any join keys which must be merged with the keys queried\n * @return array\n */\n\tpublic function joinModel($assoc, $keys = array()) {\n\t\tif (is_string($assoc)) {\n\t\t\tlist(, $assoc) = pluginSplit($assoc);\n\t\t\treturn array($assoc, array_keys($this->{$assoc}->schema()));\n\t\t} elseif (is_array($assoc)) {\n\t\t\t$with = key($assoc);\n\t\t\treturn array($with, array_unique(array_merge($assoc[$with], $keys)));\n\t\t}\n\t\ttrigger_error(\n\t\t\t__d('cake_dev', 'Invalid join model settings in %s', $model->alias),\n\t\t\tE_USER_WARNING\n\t\t);\n\t}\n\n/**\n * Called before each find operation. Return false if you want to halt the find\n * call, otherwise return the (modified) query data.\n *\n * @param array $queryData Data used to execute this query, i.e. conditions, order, etc.\n * @return mixed true if the operation should continue, false if it should abort; or, modified\n *               $queryData to continue with new $queryData\n * @link http://book.cakephp.org/2.0/en/models/callback-methods.html#beforefind\n */\n\tpublic function beforeFind($queryData) {\n\t\treturn true;\n\t}\n\n/**\n * Called after each find operation. Can be used to modify any results returned by find().\n * Return value should be the (modified) results.\n *\n * @param mixed $results The results of the find operation\n * @param boolean $primary Whether this model is being queried directly (vs. being queried as an association)\n * @return mixed Result of the find operation\n * @link http://book.cakephp.org/2.0/en/models/callback-methods.html#afterfind\n */\n\tpublic function afterFind($results, $primary = false) {\n\t\treturn $results;\n\t}\n\n/**\n * Called before each save operation, after validation. Return a non-true result\n * to halt the save.\n *\n * @param array $options\n * @return boolean True if the operation should continue, false if it should abort\n * @link http://book.cakephp.org/2.0/en/models/callback-methods.html#beforesave\n */\n\tpublic function beforeSave($options = array()) {\n\t\treturn true;\n\t}\n\n/**\n * Called after each successful save operation.\n *\n * @param boolean $created True if this save created a new record\n * @return void\n * @link http://book.cakephp.org/2.0/en/models/callback-methods.html#aftersave\n */\n\tpublic function afterSave($created) {\n\t}\n\n/**\n * Called before every deletion operation.\n *\n * @param boolean $cascade If true records that depend on this record will also be deleted\n * @return boolean True if the operation should continue, false if it should abort\n * @link http://book.cakephp.org/2.0/en/models/callback-methods.html#beforedelete\n */\n\tpublic function beforeDelete($cascade = true) {\n\t\treturn true;\n\t}\n\n/**\n * Called after every deletion operation.\n *\n * @return void\n * @link http://book.cakephp.org/2.0/en/models/callback-methods.html#afterdelete\n */\n\tpublic function afterDelete() {\n\t}\n\n/**\n * Called during validation operations, before validation. Please note that custom\n * validation rules can be defined in $validate.\n *\n * @param array $options Options passed from model::save(), see $options of model::save().\n * @return boolean True if validate operation should continue, false to abort\n * @link http://book.cakephp.org/2.0/en/models/callback-methods.html#beforevalidate\n */\n\tpublic function beforeValidate($options = array()) {\n\t\treturn true;\n\t}\n\n/**\n * Called when a DataSource-level error occurs.\n *\n * @return void\n * @link http://book.cakephp.org/2.0/en/models/callback-methods.html#onerror\n */\n\tpublic function onError() {\n\t}\n\n/**\n * Clears cache for this model.\n *\n * @param string $type If null this deletes cached views if Cache.check is true\n *     Will be used to allow deleting query cache also\n * @return boolean true on delete\n */\n\tprotected function _clearCache($type = null) {\n\t\tif ($type === null) {\n\t\t\tif (Configure::read('Cache.check') === true) {\n\t\t\t\t$assoc[] = strtolower(Inflector::pluralize($this->alias));\n\t\t\t\t$assoc[] = strtolower(Inflector::underscore(Inflector::pluralize($this->alias)));\n\t\t\t\tforeach ($this->_associations as $key => $association) {\n\t\t\t\t\tforeach ($this->$association as $key => $className) {\n\t\t\t\t\t\t$check = strtolower(Inflector::pluralize($className['className']));\n\t\t\t\t\t\tif (!in_array($check, $assoc)) {\n\t\t\t\t\t\t\t$assoc[] = strtolower(Inflector::pluralize($className['className']));\n\t\t\t\t\t\t\t$assoc[] = strtolower(Inflector::underscore(Inflector::pluralize($className['className'])));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tclearCache($assoc);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else {\n\t\t\t//Will use for query cache deleting\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/ThriftGenerated.php",
    "content": "<?php\nnamespace github\\com;\n\n/**\n * Autogenerated by Thrift Compiler (0.9.3)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\nuse Thrift\\Base\\TBase;\nuse Thrift\\Type\\TType;\nuse Thrift\\Type\\TMessageType;\nuse Thrift\\Exception\\TException;\nuse Thrift\\Exception\\TProtocolException;\nuse Thrift\\Protocol\\TProtocol;\nuse Thrift\\Protocol\\TBinaryProtocolAccelerated;\nuse Thrift\\Exception\\TApplicationException;\n\n\nclass PullRequest {\n  static $_TSPEC;\n\n  /**\n   * @var string\n   */\n  public $title = null;\n\n  public function __construct($vals=null) {\n    if (!isset(self::$_TSPEC)) {\n      self::$_TSPEC = array(\n        1 => array(\n          'var' => 'title',\n          'type' => TType::STRING,\n          ),\n        );\n    }\n    if (is_array($vals)) {\n      if (isset($vals['title'])) {\n        $this->title = $vals['title'];\n      }\n    }\n  }\n\n  public function getName() {\n    return 'PullRequest';\n  }\n\n  public function read($input)\n  {\n    $xfer = 0;\n    $fname = null;\n    $ftype = 0;\n    $fid = 0;\n    $xfer += $input->readStructBegin($fname);\n    while (true)\n    {\n      $xfer += $input->readFieldBegin($fname, $ftype, $fid);\n      if ($ftype == TType::STOP) {\n        break;\n      }\n      switch ($fid)\n      {\n        case 1:\n          if ($ftype == TType::STRING) {\n            $xfer += $input->readString($this->title);\n          } else {\n            $xfer += $input->skip($ftype);\n          }\n          break;\n        default:\n          $xfer += $input->skip($ftype);\n          break;\n      }\n      $xfer += $input->readFieldEnd();\n    }\n    $xfer += $input->readStructEnd();\n    return $xfer;\n  }\n\n  public function write($output) {\n    $xfer = 0;\n    $xfer += $output->writeStructBegin('PullRequest');\n    if ($this->title !== null) {\n      $xfer += $output->writeFieldBegin('title', TType::STRING, 1);\n      $xfer += $output->writeString($this->title);\n      $xfer += $output->writeFieldEnd();\n    }\n    $xfer += $output->writeFieldStop();\n    $xfer += $output->writeStructEnd();\n    return $xfer;\n  }\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/drupal.php",
    "content": "<?php\n\n/**\n * @file\n * Additional filter for PHP input.\n */\n\n/**\n * Implements hook_help().\n */\nfunction php_help($path, $arg) {\n  switch ($path) {\n    case 'admin/help#php':\n      $output = '';\n      $output .= '<h3>' . t('About') . '</h3>';\n      $output .= '<p>' . t('The PHP filter module adds a PHP filter to your site, for use with <a href=\"@filter\">text formats</a>. This filter adds the ability to execute PHP code in any text field that uses a text format (such as the body of a content item or the text of a comment). <a href=\"@php-net\">PHP</a> is a general-purpose scripting language widely-used for web development, and is the language with which Drupal has been developed. For more information, see the online handbook entry for the <a href=\"@php\">PHP filter module</a>.', array('@filter' => url('admin/help/filter'), '@php-net' => 'http://www.php.net', '@php' => 'http://drupal.org/handbook/modules/php/')) . '</p>';\n      $output .= '<h3>' . t('Uses') . '</h3>';\n      $output .= '<dl>';\n      $output .= '<dt>' . t('Enabling execution of PHP in text fields') . '</dt>';\n      $output .= '<dd>' . t('The PHP filter module allows users with the proper permissions to include custom PHP code that will get executed when pages of your site are processed. While this is a powerful and flexible feature if used by a trusted user with PHP experience, it is a significant and dangerous security risk in the hands of a malicious or inexperienced user. Even a trusted user may accidentally compromise the site by entering malformed or incorrect PHP code. Only the most trusted users should be granted permission to use the PHP filter, and all PHP code added through the PHP filter should be carefully examined before use. <a href=\"@php-snippets\">Example PHP snippets</a> can be found on Drupal.org.', array('@php-snippets' => url('http://drupal.org/handbook/customization/php-snippets'))) . '</dd>';\n      $output .= '</dl>';\n      return $output;\n  }\n}\n\n/**\n * Implements hook_permission().\n */\nfunction php_permission() {\n  return array(\n    'use PHP for settings' => array(\n      'title' => t('Use PHP for settings'),\n      'restrict access' => TRUE,\n    ),\n  );\n}\n\n/**\n * Evaluate a string of PHP code.\n *\n * This is a wrapper around PHP's eval(). It uses output buffering to capture both\n * returned and printed text. Unlike eval(), we require code to be surrounded by\n * <?php ?> tags; in other words, we evaluate the code as if it were a stand-alone\n * PHP file.\n *\n * Using this wrapper also ensures that the PHP code which is evaluated can not\n * overwrite any variables in the calling code, unlike a regular eval() call.\n *\n * @param $code\n *   The code to evaluate.\n * @return\n *   A string containing the printed output of the code, followed by the returned\n *   output of the code.\n *\n * @ingroup php_wrappers\n */\nfunction php_eval($code) {\n  global $theme_path, $theme_info, $conf;\n\n  // Store current theme path.\n  $old_theme_path = $theme_path;\n\n  // Restore theme_path to the theme, as long as php_eval() executes,\n  // so code evaluated will not see the caller module as the current theme.\n  // If theme info is not initialized get the path from theme_default.\n  if (!isset($theme_info)) {\n    $theme_path = drupal_get_path('theme', $conf['theme_default']);\n  }\n  else {\n    $theme_path = dirname($theme_info->filename);\n  }\n\n  ob_start();\n  print eval('?>' . $code);\n  $output = ob_get_contents();\n  ob_end_clean();\n\n  // Recover original theme path.\n  $theme_path = $old_theme_path;\n\n  return $output;\n}\n\n/**\n * Tips callback for php filter.\n */\nfunction _php_filter_tips($filter, $format, $long = FALSE) {\n  global $base_url;\n  if ($long) {\n    $output = '<h4>' . t('Using custom PHP code') . '</h4>';\n    $output .= '<p>' . t('Custom PHP code may be embedded in some types of site content, including posts and blocks. While embedding PHP code inside a post or block is a powerful and flexible feature when used by a trusted user with PHP experience, it is a significant and dangerous security risk when used improperly. Even a small mistake when posting PHP code may accidentally compromise your site.') . '</p>';\n    $output .= '<p>' . t('If you are unfamiliar with PHP, SQL, or Drupal, avoid using custom PHP code within posts. Experimenting with PHP may corrupt your database, render your site inoperable, or significantly compromise security.') . '</p>';\n    $output .= '<p>' . t('Notes:') . '</p>';\n    $output .= '<ul><li>' . t('Remember to double-check each line for syntax and logic errors <strong>before</strong> saving.') . '</li>';\n    $output .= '<li>' . t('Statements must be correctly terminated with semicolons.') . '</li>';\n    $output .= '<li>' . t('Global variables used within your PHP code retain their values after your script executes.') . '</li>';\n    $output .= '<li>' . t('<code>register_globals</code> is <strong>turned off</strong>. If you need to use forms, understand and use the functions in <a href=\"@formapi\">the Drupal Form API</a>.', array('@formapi' => url('http://api.drupal.org/api/group/form_api/7'))) . '</li>';\n    $output .= '<li>' . t('Use a <code>print</code> or <code>return</code> statement in your code to output content.') . '</li>';\n    $output .= '<li>' . t('Develop and test your PHP code using a separate test script and sample database before deploying on a production site.') . '</li>';\n    $output .= '<li>' . t('Consider including your custom PHP code within a site-specific module or <code>template.php</code> file rather than embedding it directly into a post or block.') . '</li>';\n    $output .= '<li>' . t('Be aware that the ability to embed PHP code within content is provided by the PHP Filter module. If this module is disabled or deleted, then blocks and posts with embedded PHP may display, rather than execute, the PHP code.') . '</li></ul>';\n    $output .= '<p>' . t('A basic example: <em>Creating a \"Welcome\" block that greets visitors with a simple message.</em>') . '</p>';\n    $output .= '<ul><li>' . t('<p>Add a custom block to your site, named \"Welcome\" . With its text format set to \"PHP code\" (or another format supporting PHP input), add the following in the Block body:</p>\n<pre>\nprint t(\\'Welcome visitor! Thank you for visiting.\\');\n</pre>') . '</li>';\n    $output .= '<li>' . t('<p>To display the name of a registered user, use this instead:</p>\n<pre>\nglobal $user;\nif ($user->uid) {\n  print t(\\'Welcome @name! Thank you for visiting.\\', array(\\'@name\\' => format_username($user)));\n}\nelse {\n  print t(\\'Welcome visitor! Thank you for visiting.\\');\n}\n</pre>') . '</li></ul>';\n    $output .= '<p>' . t('<a href=\"@drupal\">Drupal.org</a> offers <a href=\"@php-snippets\">some example PHP snippets</a>, or you can create your own with some PHP experience and knowledge of the Drupal system.', array('@drupal' => url('http://drupal.org'), '@php-snippets' => url('http://drupal.org/handbook/customization/php-snippets'))) . '</p>';\n    return $output;\n  }\n  else {\n    return t('You may post PHP code. You should include &lt;?php ?&gt; tags.');\n  }\n}\n\n/**\n * Implements hook_filter_info().\n *\n * Provide PHP code filter. Use with care.\n */\nfunction php_filter_info() {\n  $filters['php_code'] = array(\n    'title' => t('PHP evaluator'),\n    'description' => t('Executes a piece of PHP code. The usage of this filter should be restricted to administrators only!'),\n    'process callback' => 'php_eval',\n    'tips callback' => '_php_filter_tips',\n    'cache' => FALSE,\n  );\n  return $filters;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/exception.zep.php",
    "content": "<?php\n\nnamespace Test\\Router;\n\nclass Exception extends \\Exception\n{\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/file_display.inc",
    "content": "<?php\n\n/**\n * Plugins are described by creating a $plugin array which will be used\n * by the system that includes this file.\n */\n$plugin = array(\n  'single' => TRUE,\n  'title' => t('File display'),\n  'description' => t('Displays the file with a configurable style.'),\n  'required context' => new ctools_context_required(t('File'), 'entity:file'),\n  'category' => t('File'),\n  'defaults' => array(\n    'displays' => array(),\n  ),\n);\n\n/**\n * Render the node content.\n */\nfunction file_entity_file_display_content_type_render($subtype, $conf, $panel_args, $context) {\n  if (!empty($context) && empty($context->data)) {\n    return;\n  }\n  $file = isset($context->data) ? clone($context->data) : NULL;\n  $block = new stdClass();\n  $block->module = 'file_entity';\n  $block->delta  = $file->fid;\n\n  if (empty($file)) {\n    $block->delta   = 'placeholder';\n    $block->title = t('File display');\n    $block->content = t('File display goes here.');\n  }\n  else {\n    if (!empty($conf['identifier'])) {\n      $file->ctools_template_identifier = $conf['identifier'];\n    }\n\n    $block->title = $file->filename;\n    $block->content = file_view_file($file, $conf['displays']);\n  }\n\n  if (!empty($conf['link']) && $file) {\n    $block->title_link = entity_uri('file', $file);\n  }\n\n  return $block;\n}\n\n/**\n * Edit form for this plugin.\n */\nfunction file_entity_file_display_content_type_edit_form($form, &$form_state) {\n  $conf = $form_state['conf'];\n  $form['#tree'] = TRUE;\n  $form['#attached']['js'][] = drupal_get_path('module', 'file_entity') . '/file_entity.admin.js';\n\n  // Retrieve available formatters for this file. We can load all file types\n  // since we don't know which type the file is at this point.\n  $formatters = file_info_formatter_types();\n\n  // Formatter status.\n  $form['displays']['status'] = array(\n    '#type' => 'item',\n    '#title' => t('Enabled displays'),\n    '#prefix' => '<div id=\"file-displays-status-wrapper\">',\n    '#suffix' => '</div>',\n  );\n  $i=0;\n  foreach ($formatters as $name => $formatter) {\n    $form['displays']['status'][$name] = array(\n      '#type' => 'checkbox',\n      '#title' => check_plain($formatter['label']),\n      '#default_value' => !empty($conf['displays'][$name]['status']),\n      '#description' => isset($formatter['description']) ? filter_xss($formatter['description']) : NULL,\n      '#parents' => array('displays', $name, 'status'),\n      '#weight' => (isset($formatter['weight']) ? $formatter['weight'] : 0) + ($i / 1000),\n    );\n    $i++;\n  }\n  // Formatter order (tabledrag).\n  $form['displays']['order'] = array(\n    '#type' => 'item',\n    '#title' => t('Display precedence order'),\n    '#theme' => 'file_entity_file_display_order',\n  );\n  foreach ($formatters as $name => $formatter) {\n    $form['displays']['order'][$name]['label'] = array(\n      '#markup' => check_plain($formatter['label']),\n    );\n    $form['displays']['order'][$name]['weight'] = array(\n      '#type' => 'weight',\n      '#title' => t('Weight for @title', array('@title' => $formatter['label'])),\n      '#title_display' => 'invisible',\n      '#delta' => 50,\n      '#default_value' => isset($conf['displays'][$name]['weight']) ? $conf['displays'][$name]['weight'] : 0,\n      '#parents' => array('displays', $name, 'weight'),\n    );\n    $form['displays']['order'][$name]['#weight'] = $form['displays']['order'][$name]['weight']['#default_value'];\n  }\n\n  // Formatter settings.\n  $form['display_settings_title'] = array(\n    '#type' => 'item',\n    '#title' => t('Display settings'),\n  );\n  $form['display_settings'] = array(\n    '#type' => 'vertical_tabs',\n  );\n  $i=0;\n  foreach ($formatters as $name => $formatter) {\n    if (isset($formatter['settings callback']) && ($function = $formatter['settings callback']) && function_exists($function)) {\n      $defaults = !empty($formatter['default settings']) ? $formatter['default settings'] : array();\n      $settings = !empty($conf['displays'][$name]['settings']) ? $conf['displays'][$name]['settings'] : array();\n      $settings += $defaults;\n      $settings_form = $function($form, $form_state, $settings, $name, $file_type, $view_mode);\n      if (!empty($settings_form)) {\n        $form['displays']['settings'][$name] = array(\n          '#type' => 'fieldset',\n          '#title' => check_plain($formatter['label']),\n          '#parents' => array('displays', $name, 'settings'),\n          '#group' => 'display_settings',\n          '#weight' => (isset($formatter['weight']) ? $formatter['weight'] : 0) + ($i / 1000),\n        ) + $settings_form;\n      }\n    }\n    $i++;\n  }\n  return $form;\n}\n\nfunction file_entity_file_display_content_type_edit_form_submit($form, &$form_state) {\n  // Copy everything from our defaults.\n  foreach (array_keys($form_state['plugin']['defaults']) as $key) {\n    $form_state['conf'][$key] = $form_state['values'][$key];\n  }\n}\n\nfunction file_entity_file_display_content_type_admin_title($subtype, $conf, $context) {\n  return t('\"@s\" content', array('@s' => $context->identifier));\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/filenames/.php",
    "content": "#!/usr/bin/env php\n<?\n$aMenuLinks = Array(\n\tArray(\n\t\t\"Blog\", \n\t\tSITE_DIR, \n\t\tArray(), \n\t\tArray(), \n\t\t\"\" \n\t),\n\tArray(\n\t\t\"Photos\", \n\t\tSITE_DIR.\"photo/\", \n\t\tArray(), \n\t\tArray(), \n\t\t\"\" \n\t),\n\tArray(\n\t\t\"About me\", \n\t\tSITE_DIR.\"about.php\", \n\t\tArray(), \n\t\tArray(), \n\t\t\"\" \n\t),\n\tArray(\n\t\t\"Contact\", \n\t\tSITE_DIR.\"contacts.php\", \n\t\tArray(), \n\t\tArray(), \n\t\t\"\" \n\t),\n\n);\n?>\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/filenames/.php_cs",
    "content": "<?php\n\n$header = <<<'EOF'\nThis file is part of PHP CS Fixer.\n\n(c) Fabien Potencier <fabien@symfony.com>\n    Dariusz Rumiński <dariusz.ruminski@gmail.com>\n\nThis source file is subject to the MIT license that is bundled\nwith this source code in the file LICENSE.\nEOF;\n\nreturn PhpCsFixer\\Config::create()\n    ->setRiskyAllowed(true)\n    ->setRules(array(\n        '@Symfony' => true,\n        '@Symfony:risky' => true,\n        'combine_consecutive_unsets' => true,\n        'header_comment' => array('header' => $header),\n        'array_syntax' => array('syntax' => 'long'),\n        'no_extra_consecutive_blank_lines' => array('break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'),\n        'no_useless_else' => true,\n        'no_useless_return' => true,\n        'ordered_class_elements' => true,\n        'ordered_imports' => true,\n        'php_unit_strict' => true,\n        'phpdoc_add_missing_param_annotation' => true,\n        'psr4' => true,\n        'strict_comparison' => true,\n        'strict_param' => true,\n    ))\n    ->setFinder(\n        PhpCsFixer\\Finder::create()\n            ->exclude('tests/Fixtures')\n            ->in(__DIR__)\n    )\n;\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/filenames/.php_cs.dist",
    "content": "<?php\n\n$header = <<<'EOF'\nThis file is part of PHP CS Fixer.\n\n(c) Fabien Potencier <fabien@symfony.com>\n    Dariusz Rumiński <dariusz.ruminski@gmail.com>\n\nThis source file is subject to the MIT license that is bundled\nwith this source code in the file LICENSE.\nEOF;\n\nreturn PhpCsFixer\\Config::create()\n    ->setRiskyAllowed(true)\n    ->setRules(array(\n        '@Symfony' => true,\n        '@Symfony:risky' => true,\n        'combine_consecutive_unsets' => true,\n        'header_comment' => array('header' => $header),\n        'array_syntax' => array('syntax' => 'long'),\n        'no_extra_consecutive_blank_lines' => array('break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'),\n        'no_useless_else' => true,\n        'no_useless_return' => true,\n        'ordered_class_elements' => true,\n        'ordered_imports' => true,\n        'php_unit_strict' => true,\n        'phpdoc_add_missing_param_annotation' => true,\n        'psr4' => true,\n        'strict_comparison' => true,\n        'strict_param' => true,\n    ))\n    ->setFinder(\n        PhpCsFixer\\Finder::create()\n            ->exclude('tests/Fixtures')\n            ->in(__DIR__)\n    )\n;\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/mail.phps",
    "content": "<?php\n/**\n * This example shows sending a message using PHP's mail() function.\n */\n\nrequire '../PHPMailerAutoload.php';\n\n//Create a new PHPMailer instance\n$mail = new PHPMailer;\n//Set who the message is to be sent from\n$mail->setFrom('from@example.com', 'First Last');\n//Set an alternative reply-to address\n$mail->addReplyTo('replyto@example.com', 'First Last');\n//Set who the message is to be sent to\n$mail->addAddress('whoto@example.com', 'John Doe');\n//Set the subject line\n$mail->Subject = 'PHPMailer mail() test';\n//Read an HTML message body from an external file, convert referenced images to embedded,\n//convert HTML into a basic plain-text alternative body\n$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n//Replace the plain text body with one created manually\n$mail->AltBody = 'This is a plain-text message body';\n//Attach an image file\n$mail->addAttachment('images/phpmailer_mini.png');\n\n//send the message, check for errors\nif (!$mail->send()) {\n    echo \"Mailer Error: \" . $mail->ErrorInfo;\n} else {\n    echo \"Message sent!\";\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/php",
    "content": "#!/usr/bin/env php\n<?php\n\necho \"PHP\\n\";"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/php-script",
    "content": "#!/usr/bin/php\n<?php\n\necho \"PHP\\n\";"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/php2",
    "content": "#!/usr/bin/env php\n<?php\n/**\n * Yii console bootstrap file.\n *\n * @link http://www.yiiframework.com/\n * @copyright Copyright (c) 2008 Yii Software LLC\n * @license http://www.yiiframework.com/license/\n */\n\ndefined('YII_DEBUG') or define('YII_DEBUG', true);\n\n// fcgi doesn't have STDIN defined by default\ndefined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));\n\nrequire(__DIR__ . '/vendor/yiisoft/yii2/yii/Yii.php');\nrequire(__DIR__ . '/vendor/autoload.php');\n\n$config = require(__DIR__ . '/config/console.php');\n\n$application = new yii\\console\\Application($config);\n$application->run();\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/prefix.fcgi",
    "content": "<?php\necho $_SERVER[$_GET[\"var\"]];\n?>\n"
  },
  {
    "path": "src/test/resources/samples/langs/PHP/root.php",
    "content": "<?php\n  ////////////////////////////////////\n  // I am not Isabelle ROOT         //\n  ////////////////////////////////////\n\n?>\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLSQL/myobject.sql",
    "content": "create or replace type myobject\nAUTHID DEFINER\nAS OBJECT\n(\n        m_name varchar2(200),\n        member function toString RETURN VARCHAR2,\n        map member function Compare return varchar2\n\n)\nnot instantiable not final;\n/\n\nprompt create type myarray\ncreate or replace type myarray as table of myobject;\n/\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLSQL/packagebody.pkb",
    "content": "CREATE OR REPLACE PACKAGE BODY linguistpackage\nAS\n  /*\n  * Package:     linguist pacakage body\n  * Purpose:     a sample PLSQL file for linguist to work with\n  *\n  * Date:        03/03/2014\n  * Author:      david pyke le brun\n  * Comments:    initial version\n  */\n\nPROCEDURE proc_1\nIS\nBEGIN\nNULL;\nEND;\n\n-- functions with 1 arg\nFUNCTION function1( param1 VARCHAR2 ) RETURN VARCHAR2\nIS\nCURSOR c IS\nselect * from dual;\nv c%ROWTYPE;\nBEGIN\n open c;\n fetch c into v;\n close c;\n\n return v;\nend;\n\nFUNCTION function2( param1 NUMBER ) RETURN DATE\nIS\nBEGIN\n return SYSDATE;\nend;\n\n--a few more to use all basic SQL types\nFUNCTION function3( param1 TIMESTAMP ) RETURN CHAR\nIS\nBEGIN\nIF 1 = 2 THEN\nreturn 'Y';\nELSE\nreturn 'N';\nEND IF;\nreturn NULL;\nEND;\n\n\nFUNCTION function4( param1 CLOB ) RETURN BLOB\nIS\nBEGIN\n\treturn null;\nEND;\n\nEND linguistpackage;\n/\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLSQL/packageheader.pks",
    "content": "CREATE OR REPLACE PACKAGE linguistpackage\nAUTHID DEFINER\nAS\n  /*\n  * Package:     linguist pacakage\n  * Purpose:     a sample PLSQL file for linguist to work with\n  *\n  * Date:        03/03/2014\n  * Author:      david pyke le brun\n  * Comments:    initial version\n  */\n\nk_constant CONSTANT NUMBER(10,2) := 3.14;\n\n--basic procedure\nPROCEDURE proc_1;\n\n-- functions with 1 arg\nFUNCTION function1( param1 VARCHAR2 ) RETURN VARCHAR2;\nFUNCTION function2( param1 NUMBER ) RETURN DATE;\n\n--a few more to use all basic SQL types\nFUNCTION function3( param1 TIMESTAMP ) RETURN CHAR;\nFUNCTION function4( param1 CLOB ) RETURN BLOB;\n  \nEND linguistpackage;\n/\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLSQL/plsqlguide.pck",
    "content": "create or replace package plsqlguide is\n\n-- Author  : Jared Petersen\n-- Created : 9/22/2015 12:26:22 AM\n-- Purpose : Basic PLSQL template/guide\n\n/* Procedures */\nprocedure p_main;\n\nend plsqlguide;\n/\ncreate or replace package body plsqlguide is\n\n/* Main entry point (homepage) */\nprocedure p_main\n\tis\nbegin\n\nhtp.prn('\n\t<!DOCTYPE html>\n\t\t<html lang=\"en\">\n\t\t<head>\n\t\t\t<meta charset=\"utf-8\">\n\t\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n\t\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\t\t\t<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->\n\t\t\t<title>PL/SQL Sample Application</title>\n\n\t\t\t<!-- Bootstrap -->\n\t\t\t<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css\">\n\n\t\t\t<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->\n\t\t\t<!--[if lt IE 9]>\n\t\t\t\t<script src=\"https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js\"></script>\n\t\t\t\t<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n\t\t\t<![endif]-->\n\t\t</head>\n\t\t<body>\n\t\t\t<!-- Static navbar -->\n\t\t\t<nav class=\"navbar navbar-default navbar-static-top\">\n\t\t\t\t<div class=\"container\">\n\t\t\t\t\t<div class=\"navbar-header\">\n\t\t\t\t\t\t<a class=\"navbar-brand\" href=\"#\">PL/SQL Sample Application</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</nav>\n\n\t\t\t<div class=\"container\">\n\t\t\t\t<table class=\"table table-bordered\">\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th>#</th>\n\t\t\t\t\t\t<th>Name</th>\n\t\t\t\t\t\t<th>Description</th>\n\t\t\t\t\t\t<th>Quantity</th>\n\t\t\t\t\t\t<th>Price</th>\n\t\t\t\t\t</tr>\n');\n\n-- Fill out the parts table\nfor row in (select * from parts) loop\n\thtp.prn('\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td>'||row.pid||'</td>\n\t\t\t\t\t\t<td>'||row.name||'</td>\n\t\t\t\t\t\t<td>'||row.description||'</td>\n\t\t\t\t\t\t<td>'||row.quantity||'</td>\n\t\t\t\t\t\t<td>'||row.price||'</td>\n\t\t\t\t\t</tr>\n\t');\nend loop;\n\nhtp.prn('\n    \t\t</table>\n\t\t\t</div> <!-- /container -->\n\n\t\t\t<!-- jQuery (necessary for Bootstrap''s JavaScript plugins) -->\n\t\t\t<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js\"></script>\n\t\t\t<!-- Include all compiled plugins (below), or include individual files as needed -->\n\t\t\t<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js\"></script>\n\t\t</body>\n\t</html>\n');\n\nend p_main;\n\nbegin\n  -- Initialization\n  null;\nend plsqlguide;\n/\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLSQL/prime#.plsql",
    "content": "create or replace package prime#\nis\n  invalid_argument_error                          exception;\n\n  function nth (\n    i_num                                         pls_integer\n  ) return number;\nend prime#;\n/\n\ncreate or replace package body prime#\nis\n  type t_primes is table of number index by pls_integer;\n  b_primes                                       t_primes;\n\n  function is_prime(\n    i_candidate                                   number\n  ) return boolean\n  is\n    l_num                           number := 1;\n    l_prime                         number;\n    l_result                        number;\n  begin\n  \tif i_candidate < 2 then\n  \t  return false;\n  \tend if;\n\n    loop\n      l_prime := nth(l_num);\n      if l_prime = i_candidate then\n        return true;\n      end if;\n\n      l_result := i_candidate / l_prime;\n    \tif l_result = ceil(l_result) then\n    \t  return false;\n    \tend if;\n\n    \tl_num := l_num + 1;\n    \texit when l_result <= l_prime;\n    end loop;\n\n    return true;\n  end is_prime;\n\n  function next (\n    i_prime                                       pls_integer\n  ) return number\n  is\n    l_next                          number;\n  begin\n    l_next := i_prime + case mod(i_prime, 2) when 0 then 1 else 2 end;\n\n    while not is_prime(l_next) loop\n      l_next := l_next + 2;\n    end loop;\n    return l_next;\n  end next;\n\t\n  function nth (\n    i_num                                         pls_integer\n  ) return number\n  is\n    l_index                         number := 2;\n    l_prime                         number := 3;\n  begin\n    if   i_num < 1\n      or ceil(i_num) != i_num\n    then\n      raise invalid_argument_error;\n    end if;\n\n    case i_num\n      when 1 then return 2;\n      else\n        if b_primes.exists(i_num) then\n          return b_primes(i_num);\n        end if;\n        while l_index < i_num loop\n          l_index := l_index + 1;\n          if b_primes.exists(l_index) then\n            l_prime := b_primes(l_index);\n          else\n            l_prime := next(l_prime);\n            b_primes(l_index) := l_prime;\n          end if;\n        end loop;\n        return l_prime;\n    end case;\n  end nth;\n\nend prime#;\n/"
  },
  {
    "path": "src/test/resources/samples/langs/PLSQL/print_bool.prc",
    "content": "create or replace procedure print_bool(\n    p_bool in BOOLEAN,\n    p_true_value in varchar2 default 'TRUE',\n    p_false_value in varchar2 := 'FALSE'\n)\nas\nbegin\n\n    dbms_output.put_line(case when p_bool then p_true_value else p_false_value end);\n\nend print_bool;\n/\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLSQL/videodb.ddl",
    "content": "CREATE TABLE users (\n   user_name varchar2(40),\n   first_name varchar2(40),\n   last_name varchar2(40),\n   email varchar2(40),\n   password varchar2(40),\n   created_date DATE,\n   total_credits NUMBER,\n   credit_change_date DATE,\n   PRIMARY KEY (user_name)\n);\n/\n\nCREATE TABLE users_videos (\n   video_id NUMBER,\n   video_name varchar2(40),\n   user_name varchar2(40),\n   description varchar2(512),\n   upload_date DATE,\n   PRIMARY KEY (video_id),\n   CONSTRAINT \"USERS_VIDEOS_FK1\" FOREIGN KEY (\"USER_NAME\") REFERENCES \"USERS\"(\"USER_NAME\")\n);\n/\n\ncreate or replace procedure print_user_videos(\n    p_user_name in users.user_name%type\n)\nAUTHID DEFINER\nas\n    type t_user_videos is table of users_videos%rowtype\n        index by pls_integer;\n    l_videos t_user_videos;\nbegin\n\n    select *\n    bulk collect into l_videos\n    from users_videos\n    where user_name = p_user_name;\n\n    for i in 1..l_videos.COUNT\n    loop\n\n        dbms_output.put_line(l_videos(i).video_name);\n\n    end loop;\n\nend print_user_videos;\n/\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLSQL/who_called_me.sql",
    "content": "CREATE OR REPLACE PROCEDURE who_called_me\n( owner      OUT VARCHAR2,\n  name       OUT VARCHAR2,\n  lineno     OUT NUMBER,\n  caller_t   OUT VARCHAR2 ,\n  depth          NUMBER DEFAULT 1\n)\nAUTHID DEFINER\nAS\n--depth based version of who_called_me from asktom\n   call_stack  VARCHAR2(4096) default dbms_utility.format_call_stack;\n   n           NUMBER;\n   found_stack BOOLEAN DEFAULT FALSE;\n   line        VARCHAR2(255);\n   cnt         NUMBER := 0;\nBEGIN\n   LOOP\n       n := instr( call_stack, chr(10) );\n       exit when ( n is NULL or n = 0 );\n--\n       line := substr( call_stack, 1, n-1 );\n       call_stack := substr( call_stack, n+1 );\n--\n       if ( NOT found_stack ) then\n           if ( line like '%handle%number%name%' ) then\n               found_stack := TRUE;\n           end if;\n       else\n           cnt := cnt + 1;\n           -- cnt = 1 is ME\n           -- cnt = 2 is MY Caller\n           -- cnt = 3 is Their Caller\n           if ( cnt = (2+depth) ) then\n               lineno := to_number(substr( line, 13, 8 ));\n               line   := substr( line, 23 ); --set to rest of line .. change from 21 to 23\n               if ( line like 'pr%' ) then\n                   n := length( 'procedure ' );\n               elsif ( line like 'fun%' ) then\n                   n := length( 'function ' );\n               elsif ( line like 'package body%' ) then\n                   n := length( 'package body ' );\n               elsif ( line like 'pack%' ) then\n                   n := length( 'package ' );\n               elsif ( line like 'anonymous%' ) then\n                   n := length( 'anonymous block ' );\n               else\n                   n := null;\n               end if;\n               if ( n is not null ) then\n                  caller_t := ltrim(rtrim(upper(substr( line, 1, n-1 ))));\n               else\n                  caller_t := 'TRIGGER';\n               end if;\n\n               line := substr( line, nvl(n,1) );\n               n := instr( line, '.' );\n               owner := ltrim(rtrim(substr( line, 1, n-1 )));\n               name  := LTRIM(RTRIM(SUBSTR( LINE, N+1 )));\n               exit;\n           END IF;\n       END IF;\n   END LOOP;\nEND;\n/\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLpgSQL/plpgsql_lint-8.4.sql",
    "content": "load 'plpgsql';\nload 'plpgsql_lint';\n\ncreate table t1(a int, b int);\n\ncreate function f1()\nreturns void as $$\nbegin\n  if false then\n    update t1 set c = 30;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate function g1(out a int, out b int)\nas $$\n  select 10,20;\n$$ language sql;\n\ncreate function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  r := g1();\n  if false then \n    raise notice '%', r.c;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\ndrop function g1();\n\ncreate function g1(out a int, out b int)\nreturns setof record as $$\nselect * from t1;\n$$ language sql;\n\ncreate function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  for r in select * from g1()\n  loop\n    raise notice '%', r.c;\n  end loop;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  for r in select * from g1()\n  loop\n    r.c := 20;\n  end loop;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\ndrop function g1();\n\ncreate function f1()\nreturns int as $$\ndeclare r int;\nbegin\n  if false then\n    r := a + b;\n  end if;\n  return r;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\nbegin\n  if false then\n    raise notice '%', 1, 2;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\nbegin\n  if false then\n    raise notice '% %';\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r int[];\nbegin\n  if false then\n    r[c+10] := 20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r int;\nbegin\n  if false then\n    r[10] := 20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate type diagnostic_info_type as (\n  status text,\n  message text,\n  detail text,\n  row_count int);\n\ncreate or replace function f1()\nreturns void as $$\ndeclare\n  dg record;\nbegin\n  dg := NULL::diagnostic_info_type;\n  if false then\n    dg.status := '00000';\n    dg.mistake := 'hello';\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLpgSQL/plpgsql_lint-9.0.sql",
    "content": "load 'plpgsql';\nload 'plpgsql_lint';\n\ncreate table t1(a int, b int);\n\ncreate function f1()\nreturns void as $$\nbegin\n  if false then\n    update t1 set c = 30;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate function g1(out a int, out b int)\nas $$\n  select 10,20;\n$$ language sql;\n\ncreate function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  r := g1();\n  if false then \n    raise notice '%', r.c;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\ndrop function g1();\n\ncreate function g1(out a int, out b int)\nreturns setof record as $$\nselect * from t1;\n$$ language sql;\n\ncreate function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  for r in select * from g1()\n  loop\n    raise notice '%', r.c;\n  end loop;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  for r in select * from g1()\n  loop\n    r.c := 20;\n  end loop;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\ndrop function g1();\n\ncreate function f1()\nreturns int as $$\ndeclare r int;\nbegin\n  if false then\n    r := a + b;\n  end if;\n  return r;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\nbegin\n  if false then\n    raise notice '%', 1, 2;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\nbegin\n  if false then\n    raise notice '% %';\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r int[];\nbegin\n  if false then\n    r[c+10] := 20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r int;\nbegin\n  if false then\n    r[10] := 20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate type diagnostic_info_type as (\n  status text,\n  message text,\n  detail text,\n  row_count int);\n\ncreate or replace function f1()\nreturns void as $$\ndeclare\n  dg record;\nbegin\n  dg := NULL::diagnostic_info_type;\n  if false then\n    dg.status := '00000';\n    dg.mistake := 'hello';\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLpgSQL/plpgsql_lint-9.1.sql",
    "content": "load 'plpgsql';\nload 'plpgsql_lint';\n\ncreate table t1(a int, b int);\n\ncreate function f1()\nreturns void as $$\nbegin\n  if false then\n    update t1 set c = 30;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate function g1(out a int, out b int)\nas $$\n  select 10,20;\n$$ language sql;\n\ncreate function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  r := g1();\n  if false then \n    raise notice '%', r.c;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\ndrop function g1();\n\ncreate function g1(out a int, out b int)\nreturns setof record as $$\nselect * from t1;\n$$ language sql;\n\ncreate function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  for r in select * from g1()\n  loop\n    raise notice '%', r.c;\n  end loop;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  for r in select * from g1()\n  loop\n    r.c := 20;\n  end loop;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\ndrop function g1();\n\ncreate function f1()\nreturns int as $$\ndeclare r int;\nbegin\n  if false then\n    r := a + b;\n  end if;\n  return r;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\nbegin\n  if false then\n    raise notice '%', 1, 2;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\nbegin\n  if false then\n    raise notice '% %';\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r int[];\nbegin\n  if false then\n    r[c+10] := 20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r int;\nbegin\n  if false then\n    r[10] := 20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate type diagnostic_info_type as (\n  status text,\n  message text,\n  detail text,\n  row_count int);\n\ncreate or replace function f1()\nreturns void as $$\ndeclare  dg record;\nbegin\n  dg := NULL::diagnostic_info_type;\n  if false then\n    dg.status := '00000';\n    dg.mistake := 'hello';\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare  dg record;\nbegin\n  if false then\n    dg := 10,20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLpgSQL/plpgsql_lint-9.2.sql",
    "content": "load 'plpgsql';\nload 'plpgsql_lint';\n\ncreate table t1(a int, b int);\n\ncreate function f1()\nreturns void as $$\nbegin\n  if false then\n    update t1 set c = 30;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate function g1(out a int, out b int)\nas $$\n  select 10,20;\n$$ language sql;\n\ncreate function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  r := g1();\n  if false then \n    raise notice '%', r.c;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\ndrop function g1();\n\ncreate function g1(out a int, out b int)\nreturns setof record as $$\nselect * from t1;\n$$ language sql;\n\ncreate function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  for r in select * from g1()\n  loop\n    raise notice '%', r.c;\n  end loop;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  for r in select * from g1()\n  loop\n    r.c := 20;\n  end loop;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\ndrop function g1();\n\ncreate function f1()\nreturns int as $$\ndeclare r int;\nbegin\n  if false then\n    r := a + b;\n  end if;\n  return r;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\nbegin\n  if false then\n    raise notice '%', 1, 2;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\nbegin\n  if false then\n    raise notice '% %';\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r int[];\nbegin\n  if false then\n    r[c+10] := 20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r int;\nbegin\n  if false then\n    r[10] := 20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate type _exception_type as (\n  state text,\n  message text,\n  detail text);\n\ncreate or replace function f1()\nreturns void as $$\ndeclare\n  _exception record;\nbegin\n  _exception := NULL::_exception_type;\nexception when others then\n  get stacked diagnostics\n        _exception.state = RETURNED_SQLSTATE,\n        _exception.message = MESSAGE_TEXT,\n        _exception.detail = PG_EXCEPTION_DETAIL,\n        _exception.hint = PG_EXCEPTION_HINT;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLpgSQL/plpgsql_lint-9.3.sql",
    "content": "load 'plpgsql';\nload 'plpgsql_lint';\n\ncreate table t1(a int, b int);\n\ncreate function f1()\nreturns void as $$\nbegin\n  if false then\n    update t1 set c = 30;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate function g1(out a int, out b int)\nas $$\n  select 10,20;\n$$ language sql;\n\ncreate function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  r := g1();\n  if false then \n    raise notice '%', r.c;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\ndrop function g1();\n\ncreate function g1(out a int, out b int)\nreturns setof record as $$\nselect * from t1;\n$$ language sql;\n\ncreate function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  for r in select * from g1()\n  loop\n    raise notice '%', r.c;\n  end loop;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r record;\nbegin\n  for r in select * from g1()\n  loop\n    r.c := 20;\n  end loop;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\ndrop function g1();\n\ncreate function f1()\nreturns int as $$\ndeclare r int;\nbegin\n  if false then\n    r := a + b;\n  end if;\n  return r;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\nbegin\n  if false then\n    raise notice '%', 1, 2;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\nbegin\n  if false then\n    raise notice '% %';\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r int[];\nbegin\n  if false then\n    r[c+10] := 20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\n\ncreate or replace function f1()\nreturns void as $$\ndeclare r int;\nbegin\n  if false then\n    r[10] := 20;\n  end if;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n\ncreate type _exception_type as (\n  state text,\n  message text,\n  detail text);\n\ncreate or replace function f1()\nreturns void as $$\ndeclare\n  _exception record;\nbegin\n  _exception := NULL::_exception_type;\nexception when others then\n  get stacked diagnostics\n        _exception.state = RETURNED_SQLSTATE,\n        _exception.message = MESSAGE_TEXT,\n        _exception.detail = PG_EXCEPTION_DETAIL,\n        _exception.hint = PG_EXCEPTION_HINT;\nend;\n$$ language plpgsql;\n\nselect f1();\n\ndrop function f1();\n"
  },
  {
    "path": "src/test/resources/samples/langs/PLpgSQL/procedures.sql",
    "content": "load 'plpgsql';\nload 'plpgsql_lint';\n\nDROP FUNCTION IF EXISTS list_sites();\nCREATE OR REPLACE FUNCTION list_sites() RETURNS TABLE (fc json) AS\n$func$\nBEGIN\nRETURN QUERY SELECT row_to_json(feat_col) FROM (\n    SELECT 'FeatureCollection' AS type, array_to_json(array_agg(feat)) AS features FROM (\n            SELECT DISTINCT ON (new_id) 'Feature' AS type, ST_ASGeoJSON(loc.geom)::json AS geometry, row_to_json(\n                (SELECT prop FROM (SELECT new_id) AS prop)) AS properties FROM location loc) AS feat) AS feat_col;\nEND;\n$func$ LANGUAGE plpgsql;\n\n\nDROP FUNCTION IF EXISTS get_observations(character varying, integer);\nCREATE OR REPLACE FUNCTION get_observations(kind varchar, site_id integer) RETURNS TABLE (fc json) AS\n$func$\nBEGIN\n    IF kind = 'o2_abs' THEN\n        RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM (\n            SELECT observation_date AS date, o2_abs AS value FROM oxygen WHERE new_id = site_id) AS obs;\n    ELSIF kind = 'o2_rel' THEN\n        RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM (\n            SELECT observation_date AS date, o2_rel AS value FROM oxygen WHERE new_id = site_id) AS obs;\n    ELSIF kind = 'temp' THEN\n        RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM (\n            SELECT observation_date AS date, temp AS value FROM oxygen WHERE new_id = site_id) AS obs;\n    END IF;\nEND;\n$func$ LANGUAGE plpgsql;\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/balcony.pov",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Persistence Of Vision Ray Tracer Scene Description File\r\n// File: balcony.pov\r\n// Desc: Povray demonstration scene\r\n// Date: July/August 2001\r\n// Auth: Christoph Hormann\r\n//\r\n// ***********************************************************************\r\n//\r\n// -------------------- 'balcony' demonstration scene --------------------\r\n//\r\n// written July-August 2001 by Christoph Hormann <chris_hormann@gmx.de>\r\n//\r\n// demonstrates use of various new or changed features:\r\n//\r\n//    - isosurface (for the rail columns)\r\n//    - mesh2 object (table cloth)\r\n//    - uv-mapping (table cloth)\r\n//    - pattern image type (background heightfield)\r\n//    - slope pattern (background heightfield)\r\n//    - variable reflection (water & glass)\r\n//    - metallic reflection\r\n//    - conserve_energy\r\n//    - function pattern (water)\r\n//    - fading interior (water, drink)\r\n//    - 'circular' and 'orient' area_light\r\n//    - radiosity\r\n//    - photons (objects on the table)\r\n//\r\n// ***********************************************************************\r\n// \r\n// Command line options:\r\n//\r\n// -w240 -h320\r\n// -w480 -h640 +a0.3\r\n// -w600 -h800 +a0.3\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#version 3.6;\r\n\r\n#include \"functions.inc\"\r\n#include \"colors.inc\"\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#declare AreaLight=on;\r\n#declare Radiosity=on;\r\n#declare Photons=on;\r\n#declare TestLight=off;\r\n#declare show_Fog=true;\r\n#declare show_Water=true;\r\n#declare show_Terrain=true;\r\n#declare show_Building=true;\r\n#declare show_Table=true;\r\n#declare show_TableCloth=true;\r\n#declare show_Chair=true;\r\n#declare show_Table_Stuff=true;\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\nglobal_settings{\r\n  max_trace_level 15\r\n  assumed_gamma 1\r\n    \r\n  #if (Radiosity=on)\r\n    radiosity{\r\n      pretrace_start 0.08\r\n      pretrace_end   0.01\r\n      count 130\r\n      nearest_count 5\r\n      error_bound 0.3\r\n\r\n      recursion_limit 1\r\n      low_error_factor 0.5\r\n      gray_threshold 0.0\r\n      minimum_reuse 0.015\r\n      brightness 1.0\r\n      adc_bailout 0.01/2\r\n      normal on\r\n    }\r\n  #end\r\n\r\n  #if (Photons=on)\r\n    photons {\r\n      spacing 0.002\r\n    }\r\n  #end\r\n\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n// This scene uses a non-standard camera set-up. \r\n// (See CAMERA in the included documentation for details.) \r\n// If you are new to POV-Ray, you might want to try a different demo scene.\r\n\r\ncamera {\r\n  location    <0.5, 0.5, 1.2>\r\n  direction   y\r\n  sky         z\r\n  up          z\r\n  right x*image_width/image_height // keep propotions with any aspect ratio\r\n  look_at     <5, 4.3, 0.9>\r\n  angle       36\r\n}\r\n\r\n/*\r\ncamera {                          // table detail camera\r\n  location    <1.5, 1.5, 1.0>\r\n  direction   y\r\n  sky         z\r\n  up          z\r\n  right x*image_width/image_height // keep propotions with any aspect ratio\r\n  look_at     <3.3,2.52,0.5>\r\n  angle       30\r\n}\r\n*/\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n\r\n#if (TestLight=on)\r\n  light_source {\r\n    <2, 2, 2>\r\n    color rgb 0.7\r\n  }\r\n#end\r\n\r\n\r\nlight_source {\r\n  <3.0, -2.5, 2.6>*10000\r\n  color rgb <3.43,2.87,1.95>\r\n  #if (AreaLight=on)\r\n    area_light 400*x 400*y  4,4\r\n    jitter\r\n    circular\r\n    orient\r\n  #end\r\n\r\n  photons {\r\n    reflection on\r\n    refraction on\r\n  }\r\n}\r\n\r\n\r\n#if (show_Fog)\r\n\r\nfog{\r\n   fog_type 2\r\n   fog_alt 1.2\r\n   fog_offset 0\r\n   color rgbt <0.60, 0.68, 0.82, 0.0>\r\n   distance 700\r\n   up z\r\n}\r\n\r\n#end\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#include \"sky.inc\"\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (show_Water)\r\n  #include \"water.inc\"\r\n#end\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (show_Building)\r\n  #include \"building.inc\"\r\n#end\r\n\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (show_Terrain)\r\n  #include \"terrain.inc\"\r\n#end\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (show_Table)\r\n  #include \"table.inc\"\r\n#end\r\n\r\n#if (show_TableCloth)\r\n  #include \"table_cloth.inc\"\r\n#end\r\n\r\n#if (show_Table_Stuff)\r\n  #include \"table_stuff.inc\"\r\n#end\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (show_Chair)\r\n  #include \"chair.inc\"\r\n#end\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/bglass.inc",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Persistence Of Vision Ray Tracer Include File\r\n// File: bglass.inc\r\n// Desc: drinking glass for 'balcony.pov' demonstration scene\r\n// Date: July/August 2001\r\n// Auth: Christoph Hormann\r\n\r\n// Updated: 09Aug2008 (jh) for v3.7 distribution\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (version < 3.7)\r\n  #version 3.5;\r\n#end\r\n\r\n#declare Mat_Glass=\r\nmaterial {\r\n  texture {\r\n    pigment { color rgbt 1 }\r\n    finish {\r\n      ambient 0.0\r\n      diffuse 0.1\r\n      specular 0.5\r\n      roughness 0.05\r\n\r\n      reflection {\r\n        0.0, 1.0\r\n        fresnel on\r\n      }\r\n\r\n      conserve_energy\r\n    }\r\n  }\r\n  interior {\r\n    ior 1.5\r\n    fade_distance 0.1\r\n    fade_power 1001\r\n    fade_color <0.4,0.4,0.4>\r\n  }\r\n}\r\n\r\n#declare Mat_Liquid=\r\nmaterial {\r\n  texture {\r\n    pigment { color rgbt 1 }\r\n    finish {\r\n      ambient 0.0\r\n      diffuse 0.1\r\n      specular 0.5\r\n      roughness 0.01\r\n\r\n      reflection {\r\n        0.0, 1.0\r\n        fresnel on\r\n      }\r\n\r\n      conserve_energy\r\n    }\r\n  }\r\n  interior {\r\n    ior 1.3\r\n    fade_distance 0.03\r\n    fade_power 1001\r\n    fade_color <0.8,0.3,0.4>\r\n  }\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#include \"shapes.inc\"\r\n\r\n#local Content_Shape=\r\nmerge {\r\n  cylinder {\r\n    0*z, 5*z, 3.0\r\n  }\r\n\r\n  object { Round_Cylinder_Merge (2*z, -3*z, 3.0, 0.25) }\r\n\r\n  material { Mat_Liquid }\r\n}\r\n\r\n#declare Glass=\r\nunion {\r\n  merge {\r\n    difference {\r\n      cylinder {\r\n        0.01*z, 14*z, 3.2\r\n      }\r\n\r\n      cylinder {\r\n        0*z, 10*z, 3.0\r\n        translate 4.6*z\r\n      }\r\n\r\n      object { Round_Cylinder_Merge (2*z, -3*z, 3.0, 0.25) translate 4.6*z }\r\n    }\r\n    torus {\r\n      3.1, 0.1\r\n      rotate 90*x\r\n      translate 14*z\r\n    }\r\n\r\n    material { Mat_Glass }\r\n  }\r\n\r\n  object { Content_Shape scale 0.99 translate 4.6*z }\r\n\r\n  scale 1.1\r\n  scale 0.01\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/building.inc",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Persistence Of Vision Ray Tracer Include File\r\n// File: building.inc\r\n// Desc: building for 'balcony.pov' demonstration scene\r\n// Date: July/August 2001\r\n// Auth: Christoph Hormann\r\n\r\n// Updated: 09Aug2008 (jh) for v3.7 distribution\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (version < 3.7)\r\n  #version 3.5;\r\n#end\r\n\r\n#declare Tex_Stone=\r\ntexture {\r\n  pigment {\r\n\r\n    agate\r\n    color_map {\r\n      [0.7 color rgb <0.6,0.6,0.6> ]\r\n      [1.0 color rgb 0.46 ]\r\n    }\r\n    warp { turbulence <0.7,0.4,0.4> }\r\n    scale <0.3,1.2,1.2>*0.25\r\n    rotate -60*y\r\n    rotate 70*z\r\n  }\r\n  finish {\r\n    ambient 0.0//0.1\r\n    diffuse 0.5\r\n    specular 0.15\r\n  }\r\n  normal {\r\n    granite 0.2\r\n    warp {turbulence 1}\r\n    scale 0.1\r\n  }\r\n}\r\n\r\n#declare Tex_Floor_A=\r\ntexture {\r\n  pigment {\r\n    color rgb <0.6,0.6,0.6>\r\n  }\r\n  finish {\r\n    ambient 0.0\r\n    diffuse 0.5\r\n    specular 0.15\r\n  }\r\n  normal {\r\n    granite 0.2\r\n    warp {turbulence 1}\r\n    scale 0.25\r\n    translate 2\r\n  }\r\n}\r\n\r\n#declare Tex_Floor_B=\r\ntexture {\r\n  pigment {\r\n    color rgb <0.18,0.18,0.22>\r\n  }\r\n  finish {\r\n    ambient 0.0\r\n    diffuse 0.5\r\n    specular 0.15\r\n  }\r\n  normal {\r\n    granite 0.2\r\n    warp {turbulence 1}\r\n    scale 0.25\r\n  }\r\n}\r\n\r\n#declare Tex_Floor=\r\ntexture {\r\n  checker\r\n  texture { Tex_Floor_A },\r\n  texture { Tex_Floor_B }\r\n  scale 0.4\r\n  rotate 45*z\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#include \"shapes.inc\"\r\n\r\n#declare fn_Rad=\r\nfunction {\r\n  sin(pow(abs(z*0.4),1.8))+0.4\r\n}\r\n\r\n#declare Small_Column_part1=\r\nisosurface {\r\n  function { min(sqrt( x*x + y*y ) - fn_Rad(x, y, z), sqrt( x*x + y*y + pow(abs(z*2),1.4)) - 1.0) }\r\n  max_gradient 1.8\r\n  //eval\r\n  accuracy 0.001\r\n  contained_by { box { -4, 4 } }\r\n  translate 4*z\r\n  scale 6\r\n\r\n  texture { Tex_Stone }\r\n}\r\n\r\n#declare Small_Column=\r\nunion {\r\n  object { Small_Column_part1 translate 3*z }\r\n  object { Round_Cylinder_Union (0, 3*z, 10, 1) }\r\n  object { Round_Cylinder_Union (51*z, 54*z, 10, 1) }\r\n\r\n  scale 0.01\r\n\r\n  translate 0.1*z\r\n  texture { Tex_Stone }\r\n}\r\n\r\n#declare Large_Column=\r\nunion {\r\n  object { Round_Cylinder_Merge (0.7*z, 0.8*z, 0.22, 0.02) }\r\n\r\n  cylinder { 0.75*z, 3*z, 0.2 }\r\n  object { Round_Box_Union (<-0.23,-0.23,-0.1>, <0.23,0.23,0.15>, 0.02) }\r\n  object { Round_Box_Union (<-0.20,-0.20,0.00>, <0.20,0.20,0.70>, 0.02) }\r\n  object { Round_Box_Union (<-0.23,-0.23,0.58>, <0.23,0.23,0.70>, 0.02) }\r\n  object { Round_Box_Union (<-0.26,-0.26,0.64>, <0.26,0.26,0.74>, 0.02) }\r\n\r\n  torus { 0.2, 0.06 rotate 90*x translate 2.74*z }\r\n\r\n  object { Round_Box_Union (<-0.26,-0.26,2.80>, <0.26,0.26,2.88>, 0.01) }\r\n\r\n  texture { Tex_Stone }\r\n}\r\n\r\n#declare Balustrade=\r\nunion {\r\n  object { Round_Box_Union (<0.0,-0.15,0>, <5,0.15,0.1>, 0.02) }\r\n  object { Round_Box_Union (<0.0,-0.15,0.64>, <5,0.15,0.74>, 0.02) }\r\n\r\n  #declare Cnt=0;\r\n\r\n  #while (Cnt<10)\r\n    object { Small_Column translate(Cnt*0.5+0.6)*x }\r\n    #declare Cnt=Cnt+1;\r\n  #end\r\n\r\n  texture { Tex_Stone }\r\n}\r\n\r\n#declare Walls=\r\nunion {\r\n  box { <-0.5,-0.5,-1>, <-2,5.5,3.2> }\r\n  box { <-0.5,-0.5,-1>, <5.5,-2,3.2> }\r\n\r\n  texture { Tex_Stone }\r\n}\r\n\r\n#declare Ceiling_Segment=\r\nunion {\r\n  box { <-0.20,-0.20,2.94>, <0.20,0.20,2.98> }\r\n  box { <-0.14,-0.14,2.94>, <0.14,0.14,3.01> }\r\n}\r\n\r\n#declare Ceiling=\r\nunion {\r\n  box { <5.6,5.6,3.04>, <-2,-2,3.5> }\r\n\r\n  union {\r\n    object { Round_Box_Union (<0.0,-0.26,3.1>, <6,0.26,2.88>, 0.02) rotate 180*z }\r\n    object { Round_Box_Union (<0.0,-0.26,3.1>, <6,0.26,2.88>, 0.02) rotate -90*z }\r\n    translate <5,5,0>\r\n  }\r\n\r\n  difference {\r\n    box { <5.0,5.0,2.95>, <-2,-2,3.5> }\r\n    object { Ceiling_Segment translate <4.44,4.44,0> }\r\n    object { Ceiling_Segment translate <4.44,3.94,0> }\r\n    object { Ceiling_Segment translate <3.94,4.44,0> }\r\n    object { Ceiling_Segment translate <3.94,3.94,0> }\r\n    object { Ceiling_Segment translate <4.44,3.44,0> }\r\n    object { Ceiling_Segment translate <3.44,4.44,0> }\r\n    object { Ceiling_Segment translate <3.94,3.44,0> }\r\n    object { Ceiling_Segment translate <3.44,3.94,0> }\r\n    object { Ceiling_Segment translate <4.44,2.94,0> }\r\n    object { Ceiling_Segment translate <2.94,4.44,0> }\r\n  }\r\n\r\n  texture { Tex_Stone }\r\n}\r\n\r\n#declare Base=\r\nunion {\r\n  box { <5.4,5.4,0>, <0,0,-1> texture { Tex_Floor } }\r\n  box { <6,6,-1>, <0,0,-2> }\r\n\r\n  texture { Tex_Stone }\r\n}\r\n\r\nobject { Balustrade rotate 180*z translate <5,5,0> }\r\nobject { Balustrade rotate -90*z translate <5,5,0> }\r\nobject { Large_Column translate <5,5,0> }\r\nobject { Base }\r\nobject { Walls }\r\nobject { Ceiling }\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/chair.inc",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Persistence Of Vision Ray Tracer Include File\r\n// File: chair.inc\r\n// Desc: chair for 'balcony.pov' demonstration scene\r\n// Date: July/August 2001\r\n// Auth: Christoph Hormann\r\n\r\n// Updated: 09Aug2008 (jh) for v3.7 distribution\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (version < 3.7)\r\n  #version 3.5;\r\n#end\r\n\r\n#declare Tex_Table_Foot=\r\ntexture {\r\n  pigment {\r\n    color rgb 0.4\r\n  }\r\n  finish {\r\n    ambient 0.0\r\n    diffuse 0.3\r\n    specular 0.4\r\n    roughness 0.01\r\n    metallic\r\n\r\n    reflection {\r\n      0.8\r\n      metallic\r\n    }\r\n  }\r\n}\r\n\r\n#declare Tex_Table_Foot_Bottom=\r\ntexture {\r\n  pigment {\r\n    color rgb 0.2\r\n  }\r\n  finish {\r\n    ambient 0.0\r\n    diffuse 0.3\r\n    specular 0.4\r\n    roughness 0.02\r\n  }\r\n}\r\n\r\n#declare Tex_Dark_Wood=\r\ntexture {\r\n  pigment {\r\n    bozo\r\n    color_map {\r\n      [0.3 color rgb <0.0,0.0,0.16> ]\r\n      [0.5 color rgb <0.0,0.0,0.08> ]\r\n      [0.7 color rgb <0.0,0.0,0.0> ]\r\n    }\r\n    scale <4,1,1>*0.036\r\n  }\r\n  finish {\r\n    ambient 0.09\r\n    diffuse 0.3\r\n    specular 0.5\r\n    roughness 0.025\r\n\r\n    reflection {\r\n      0.15\r\n      metallic\r\n    }\r\n  }\r\n  normal {\r\n    granite 0.1\r\n    scale 0.03\r\n    accuracy 0.007\r\n  }\r\n}\r\n\r\n\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#include \"shapes.inc\"\r\n\r\n#local Chair_Tube_Rad=0.01;\r\n#local Chair_Tube_Curve_Rad=0.045;\r\n#local Chair_Leg_Angle=7;\r\n#local Chair_Leg_AngleA=4;\r\n#local Chair_Leg_Depth=0.13;\r\n\r\n#local Chair_Plate_Curve_Rad=0.03;\r\n#local Chair_Plate_Thickness=0.008;\r\n#local Chair_Plate_Width=0.48;\r\n#local Chair_Plate_UWidth=0.22;\r\n#local Chair_Plate_Height=0.45;\r\n#local Chair_Plate_UAngle=5;\r\n#local Chair_Plate_Depth=0.26;\r\n\r\n#local Chair_Leg=\r\nunion {\r\n\r\n  intersection {\r\n    torus { Chair_Tube_Curve_Rad, Chair_Tube_Rad }\r\n    plane { x, 0 }\r\n    plane { -x, 0 rotate (-90+Chair_Leg_Angle)*y }\r\n  }\r\n\r\n  cylinder {\r\n    <-Chair_Tube_Curve_Rad,0,0>,\r\n    <-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height+0.01>, Chair_Tube_Rad\r\n    rotate Chair_Leg_Angle*y\r\n  }\r\n  cylinder {\r\n    <0,0,Chair_Tube_Curve_Rad>,\r\n    <Chair_Leg_Depth,0,Chair_Tube_Curve_Rad>, Chair_Tube_Rad\r\n  }\r\n\r\n  object { Round_Cylinder_Merge (\r\n    <-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height-0.003>,\r\n    <-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height+0.025>, Chair_Tube_Rad+0.001, 0.005)\r\n    rotate Chair_Leg_Angle*y\r\n    texture { Tex_Table_Foot_Bottom }\r\n  }\r\n\r\n  translate -Chair_Leg_Depth*x\r\n\r\n  translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z\r\n\r\n}\r\n\r\n#macro Chair_Back(Rotate)\r\nunion {\r\n\r\n  intersection {\r\n    torus { Chair_Tube_Curve_Rad, Chair_Tube_Rad }\r\n    plane { x, 0 }\r\n    plane { z, 0 }\r\n\r\n    translate <-Chair_Leg_Depth, 0.0,Chair_Tube_Curve_Rad*2>\r\n  }\r\n\r\n  cylinder {\r\n    <-0.08, 0.0,Chair_Tube_Curve_Rad>,\r\n    < 0.05, 0.0,Chair_Tube_Curve_Rad>, Chair_Tube_Rad\r\n  }\r\n\r\n  intersection {\r\n    torus { 4, Chair_Tube_Rad }\r\n    plane { z, 0.4 }\r\n    plane { -z, 0 }\r\n\r\n    translate <-4-Chair_Leg_Depth-Chair_Tube_Curve_Rad, 0.0,Chair_Tube_Curve_Rad*2>\r\n  }\r\n\r\n  translate -Chair_Tube_Curve_Rad*z\r\n\r\n  rotate 3*y\r\n  rotate Rotate*x\r\n\r\n  translate Chair_Tube_Curve_Rad*z\r\n\r\n  translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z\r\n\r\n\r\n}\r\n#end\r\n\r\n#local Chair_Base=\r\nunion {\r\n\r\n  union {\r\n    object { Chair_Back(-0.25) translate  Chair_Tube_Rad*2*y }\r\n\r\n    object { Chair_Leg }\r\n    object { Chair_Leg rotate 180*z }\r\n    rotate -Chair_Leg_AngleA*x\r\n    translate -0.23*y\r\n  }\r\n  union {\r\n    object { Chair_Back( 0.25) translate -Chair_Tube_Rad*2*y }\r\n\r\n    object { Chair_Leg }\r\n    object { Chair_Leg rotate 180*z }\r\n    rotate Chair_Leg_AngleA*x\r\n    translate 0.23*y\r\n  }\r\n\r\n  texture { Tex_Table_Foot }\r\n}\r\n\r\n#local Chair_Plate=\r\nunion {\r\n\r\n  intersection {\r\n    merge {\r\n      torus { Chair_Plate_Curve_Rad, Chair_Plate_Thickness translate  (Chair_Plate_Width/2)*y }\r\n      torus { Chair_Plate_Curve_Rad, Chair_Plate_Thickness translate -(Chair_Plate_Width/2)*y }\r\n\r\n      difference {\r\n        cylinder {\r\n          -(Chair_Plate_Width/2)*y, (Chair_Plate_Width/2)*y,\r\n          Chair_Plate_Curve_Rad+Chair_Plate_Thickness\r\n        }\r\n        cylinder {\r\n          -(Chair_Plate_Width/1.8)*y, (Chair_Plate_Width/1.8)*y,\r\n          Chair_Plate_Curve_Rad-Chair_Plate_Thickness\r\n        }\r\n      }\r\n    }\r\n\r\n    plane { -z, 0 rotate -20*y}\r\n    plane { -x, 0 }\r\n  }\r\n\r\n\r\n  merge {\r\n    cylinder {\r\n      <0.0, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>\r\n      <0.0,  Chair_Plate_Width/2, Chair_Plate_Curve_Rad>,\r\n      Chair_Plate_Thickness\r\n    }\r\n\r\n    sphere { <0.0, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, Chair_Plate_Thickness }\r\n    sphere { <0.0,  Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, Chair_Plate_Thickness }\r\n\r\n    rotate 70*y\r\n  }\r\n\r\n  box {\r\n    < 0.00, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad-Chair_Plate_Thickness>,\r\n    <-Chair_Plate_Depth,  Chair_Plate_Width/2, Chair_Plate_Curve_Rad+Chair_Plate_Thickness>\r\n  }\r\n  cylinder {\r\n    < 0.00, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>\r\n    <-Chair_Plate_Depth, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>,\r\n    Chair_Plate_Thickness\r\n  }\r\n  cylinder {\r\n    < 0.00,  Chair_Plate_Width/2, Chair_Plate_Curve_Rad>\r\n    <-Chair_Plate_Depth,  Chair_Plate_Width/2, Chair_Plate_Curve_Rad>,\r\n    Chair_Plate_Thickness\r\n  }\r\n\r\n  box {\r\n    <-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad,\r\n      Chair_Plate_Curve_Rad-Chair_Plate_Thickness>,\r\n    <-Chair_Plate_Depth-Chair_Plate_Curve_Rad,  Chair_Plate_Width/2-Chair_Plate_Curve_Rad,\r\n      Chair_Plate_Curve_Rad+Chair_Plate_Thickness>\r\n  }\r\n\r\n  cylinder {\r\n    <-Chair_Plate_Depth,  Chair_Plate_Width/2-Chair_Plate_Curve_Rad,\r\n      Chair_Plate_Curve_Rad-Chair_Plate_Thickness>\r\n    <-Chair_Plate_Depth,  Chair_Plate_Width/2-Chair_Plate_Curve_Rad,\r\n      Chair_Plate_Curve_Rad+Chair_Plate_Thickness>,\r\n    Chair_Plate_Curve_Rad\r\n  }\r\n  cylinder {\r\n    <-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad,\r\n      Chair_Plate_Curve_Rad-Chair_Plate_Thickness>\r\n    <-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad,\r\n      Chair_Plate_Curve_Rad+Chair_Plate_Thickness>,\r\n    Chair_Plate_Curve_Rad\r\n  }\r\n  torus {\r\n    Chair_Plate_Curve_Rad, Chair_Plate_Thickness\r\n    rotate 90*x\r\n    translate <-Chair_Plate_Depth,\r\n               -Chair_Plate_Width/2+Chair_Plate_Curve_Rad, Chair_Plate_Curve_Rad>\r\n  }\r\n  torus {\r\n    Chair_Plate_Curve_Rad, Chair_Plate_Thickness\r\n    rotate 90*x\r\n    translate <-Chair_Plate_Depth,\r\n                Chair_Plate_Width/2-Chair_Plate_Curve_Rad, Chair_Plate_Curve_Rad>\r\n  }\r\n\r\n  translate (Chair_Plate_Height+0.03)*z\r\n  translate 0.18*x\r\n}\r\n\r\n#local Chair_Back_Plate=\r\nunion {\r\n  intersection {\r\n    union {\r\n      intersection {\r\n        difference {\r\n          cylinder { <0.0, -0.30, 0.0>, <0.0,  0.30, 0.0>, 4+2*Chair_Plate_Thickness }\r\n          cylinder { <0.0, -0.40, 0.0>, <0.0,  0.40, 0.0>, 4 }\r\n        }\r\n        plane {  y, Chair_Plate_UWidth rotate  Chair_Plate_UAngle*x }\r\n        plane { -y, Chair_Plate_UWidth rotate -Chair_Plate_UAngle*x }\r\n      }\r\n\r\n      torus {\r\n        4+Chair_Plate_Thickness, Chair_Plate_Thickness\r\n        scale <1, 1, 1/cos(radians(Chair_Plate_UAngle))>\r\n        rotate  Chair_Plate_UAngle*x\r\n        translate  Chair_Plate_UWidth*y\r\n      }\r\n\r\n      torus {\r\n        4+Chair_Plate_Thickness, Chair_Plate_Thickness\r\n        scale <1, 1, 1/cos(radians(Chair_Plate_UAngle))>\r\n        rotate -Chair_Plate_UAngle*x\r\n        translate -Chair_Plate_UWidth*y\r\n      }\r\n    }\r\n\r\n    plane { z, 0 rotate -8*y }\r\n    plane { -z, 0 rotate -0.2*y }\r\n  }\r\n\r\n  intersection {\r\n    union {\r\n      cylinder {\r\n        <4+Chair_Plate_Thickness,  0.3, 0.0>,\r\n        <4+Chair_Plate_Thickness, -0.3, 0.0>,\r\n        Chair_Plate_Thickness\r\n        rotate -0.2*y\r\n      }\r\n      cylinder {\r\n        <4+Chair_Plate_Thickness,  0.3, 0.0>,\r\n        <4+Chair_Plate_Thickness, -0.3, 0.0>,\r\n        Chair_Plate_Thickness\r\n        rotate -8*y\r\n      }\r\n    }\r\n    plane {  y, Chair_Plate_UWidth rotate  Chair_Plate_UAngle*x }\r\n    plane { -y, Chair_Plate_UWidth rotate -Chair_Plate_UAngle*x }\r\n  }\r\n  sphere {\r\n    <4+Chair_Plate_Thickness,  Chair_Plate_UWidth, 0.0>,\r\n    Chair_Plate_Thickness\r\n    rotate -0.2*y\r\n  }\r\n  sphere {\r\n    <4+Chair_Plate_Thickness, -Chair_Plate_UWidth, 0.0>,\r\n    Chair_Plate_Thickness\r\n    rotate -0.2*y\r\n  }\r\n\r\n  sphere {\r\n    <4+Chair_Plate_Thickness,\r\n     Chair_Plate_UWidth-4*sin(radians(Chair_Plate_UAngle))*sin(radians(8)), 0.0>,\r\n    Chair_Plate_Thickness\r\n    rotate -8*y\r\n  }\r\n  sphere {\r\n    <4+Chair_Plate_Thickness,\r\n    -Chair_Plate_UWidth+4*sin(radians(Chair_Plate_UAngle))*sin(radians(8)), 0.0>,\r\n    Chair_Plate_Thickness\r\n    rotate -8*y\r\n  }\r\n\r\n\r\n  translate <-4-Chair_Leg_Depth-Chair_Tube_Curve_Rad+Chair_Tube_Rad,\r\n             0.0, Chair_Tube_Curve_Rad*2>\r\n\r\n  translate -Chair_Tube_Curve_Rad*z\r\n\r\n  rotate 3*y\r\n\r\n  translate Chair_Tube_Curve_Rad*z\r\n\r\n  translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z\r\n\r\n}\r\n\r\n\r\nunion {\r\n  object { Chair_Back_Plate texture { Tex_Dark_Wood rotate 90*y } }\r\n  object { Chair_Plate texture { Tex_Dark_Wood } }\r\n\r\n  object { Chair_Base }\r\n  scale 0.92\r\n  rotate -60*z\r\n  translate <2.68,3.35,0>\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/cloth.inc",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Updated: 09Aug2008 (jh) for v3.7 distribution\r\n\r\n#if (version < 3.7)\r\n  #version 3.5;\r\n#end\r\n\r\n#local nx=90;\r\n#local ny=90;\r\n#local ZP=0.66003;\r\n\r\n#macro ZS(Nbr)\r\n  #local Cnt=0;\r\n  #while (Cnt<Nbr)\r\n     z,\r\n     #local Cnt=Cnt+1;\r\n  #end\r\n#end\r\n\r\nvertex_vectors {\r\nnx*ny,\r\n\r\n<-0.35592,-0.35616,0.31541>,\r\n<-0.36168,-0.34964,0.32452>,\r\n<-0.36685,-0.34249,0.33361>,\r\n<-0.37122,-0.33488,0.34282>,\r\n<-0.37518,-0.32706,0.35207>,\r\n<-0.37935,-0.31939,0.36145>,\r\n<-0.38404,-0.31214,0.37091>,\r\n<-0.38958,-0.30556,0.38035>,\r\n<-0.39618,-0.30007,0.38972>,\r\n<-0.40374,-0.29602,0.39905>,\r\n<-0.41187,-0.29331,0.40832>,\r\n<-0.42017,-0.29123,0.41751>,\r\n<-0.42787,-0.28740,0.42664>,\r\n<-0.43451,-0.28169,0.43565>,\r\n<-0.43902,-0.27389,0.44448>,\r\n<-0.44053,-0.26456,0.45305>,\r\n<-0.43874,-0.25480,0.46126>,\r\n<-0.43422,-0.24574,0.46908>,\r\n<-0.42958,-0.23699,0.47696>,\r\n<-0.42909,-0.22709,0.48490>,\r\n<-0.43330,-0.21774,0.49266>,\r\n<-0.44198,-0.21156,0.49979>,\r\n<-0.45268,-0.20913,0.50633>,\r\n<-0.46379,-0.20937,0.51260>,\r\n<-0.47348,-0.20478,0.51937>,\r\n<-0.47923,-0.19545,0.52581>,\r\n<-0.47799,-0.18406,0.53132>,\r\n<-0.47180,-0.17392,0.53610>,\r\n<-0.46550,-0.16443,0.54096>,\r\n<-0.46576,-0.15265,0.54656>,\r\n<-0.47382,-0.14354,0.55147>,\r\n<-0.48558,-0.14027,0.55515>,\r\n<-0.49547,-0.13422,0.55978>,\r\n<-0.49992,-0.12291,0.56422>,\r\n<-0.49618,-0.11116,0.56725>,\r\n<-0.48742,-0.10196,0.56967>,\r\n<-0.48660,-0.08936,0.57326>,\r\n<-0.49360,-0.07884,0.57589>,\r\n<-0.50537,-0.07381,0.57824>,\r\n<-0.51092,-0.06250,0.58087>,\r\n<-0.50818,-0.05001,0.58201>,\r\n<-0.49857,-0.04125,0.58244>,\r\n<-0.49585,-0.02897,0.58362>,\r\n<-0.49991,-0.01714,0.58411>,\r\n<-0.50878,-0.00811,0.58500>,\r\n<-0.50917,0.00496,0.58493>,\r\n<-0.50100,0.01463,0.58383>,\r\n<-0.49548,0.02603,0.58338>,\r\n<-0.49750,0.03889,0.58227>,\r\n<-0.50716,0.04766,0.58171>,\r\n<-0.51053,0.05988,0.58096>,\r\n<-0.50521,0.07163,0.57825>,\r\n<-0.49371,0.07717,0.57564>,\r\n<-0.48643,0.08741,0.57312>,\r\n<-0.48711,0.10021,0.56953>,\r\n<-0.49587,0.10962,0.56689>,\r\n<-0.49897,0.12189,0.56376>,\r\n<-0.49345,0.13317,0.55935>,\r\n<-0.48310,0.13851,0.55496>,\r\n<-0.47196,0.14338,0.55117>,\r\n<-0.46530,0.15343,0.54635>,\r\n<-0.46665,0.16501,0.54102>,\r\n<-0.47450,0.17393,0.53636>,\r\n<-0.48025,0.18446,0.53164>,\r\n<-0.48041,0.19606,0.52600>,\r\n<-0.47361,0.20474,0.51912>,\r\n<-0.46355,0.20815,0.51218>,\r\n<-0.45236,0.20747,0.50617>,\r\n<-0.44162,0.21032,0.49972>,\r\n<-0.43343,0.21707,0.49262>,\r\n<-0.42989,0.22650,0.48483>,\r\n<-0.43100,0.23616,0.47688>,\r\n<-0.43592,0.24474,0.46926>,\r\n<-0.43998,0.25391,0.46163>,\r\n<-0.44131,0.26365,0.45360>,\r\n<-0.43940,0.27286,0.44510>,\r\n<-0.43452,0.28036,0.43621>,\r\n<-0.42766,0.28572,0.42710>,\r\n<-0.41980,0.28916,0.41798>,\r\n<-0.41135,0.29122,0.40887>,\r\n<-0.40325,0.29439,0.39964>,\r\n<-0.39597,0.29900,0.39029>,\r\n<-0.38976,0.30491,0.38085>,\r\n<-0.38464,0.31181,0.37140>,\r\n<-0.38026,0.31928,0.36195>,\r\n<-0.37639,0.32705,0.35261>,\r\n<-0.37252,0.33490,0.34333>,\r\n<-0.36800,0.34258,0.33412>,\r\n<-0.36256,0.34969,0.32503>,\r\n<-0.35644,0.35623,0.31592>\r\n<-0.34951,-0.36255,0.32437>,\r\n<-0.35616,-0.35667,0.33347>,\r\n<-0.36217,-0.35018,0.34242>,\r\n<-0.36724,-0.34300,0.35158>,\r\n<-0.37135,-0.33528,0.36079>,\r\n<-0.37493,-0.32734,0.37012>,\r\n<-0.37875,-0.31957,0.37952>,\r\n<-0.38332,-0.31225,0.38898>,\r\n<-0.38892,-0.30576,0.39837>,\r\n<-0.39566,-0.30046,0.40774>,\r\n<-0.40332,-0.29654,0.41707>,\r\n<-0.41155,-0.29406,0.42634>,\r\n<-0.41984,-0.29171,0.43558>,\r\n<-0.42752,-0.28755,0.44477>,\r\n<-0.43384,-0.28119,0.45377>,\r\n<-0.43771,-0.27270,0.46250>,\r\n<-0.43849,-0.26305,0.47086>,\r\n<-0.43626,-0.25346,0.47882>,\r\n<-0.43118,-0.24476,0.48650>,\r\n<-0.42872,-0.23532,0.49448>,\r\n<-0.43053,-0.22537,0.50249>,\r\n<-0.43699,-0.21724,0.51004>,\r\n<-0.44664,-0.21267,0.51695>,\r\n<-0.45761,-0.21208,0.52323>,\r\n<-0.46787,-0.20924,0.53001>,\r\n<-0.47545,-0.20104,0.53687>,\r\n<-0.47675,-0.18970,0.54295>,\r\n<-0.47289,-0.17914,0.54830>,\r\n<-0.46580,-0.16986,0.55309>,\r\n<-0.46484,-0.15823,0.55854>,\r\n<-0.47140,-0.14822,0.56338>,\r\n<-0.48206,-0.14310,0.56739>,\r\n<-0.49252,-0.13769,0.57189>,\r\n<-0.49772,-0.12671,0.57641>,\r\n<-0.49530,-0.11471,0.57950>,\r\n<-0.48749,-0.10482,0.58198>,\r\n<-0.48644,-0.09237,0.58557>,\r\n<-0.49302,-0.08196,0.58825>,\r\n<-0.50350,-0.07541,0.59079>,\r\n<-0.50862,-0.06395,0.59347>,\r\n<-0.50716,-0.05131,0.59468>,\r\n<-0.49825,-0.04184,0.59509>,\r\n<-0.49560,-0.02952,0.59642>,\r\n<-0.49957,-0.01796,0.59711>,\r\n<-0.50831,-0.00793,0.59824>,\r\n<-0.50783,0.00469,0.59826>,\r\n<-0.50020,0.01487,0.59715>,\r\n<-0.49605,0.02666,0.59635>,\r\n<-0.49758,0.03948,0.59513>,\r\n<-0.50585,0.04934,0.59452>,\r\n<-0.50824,0.06187,0.59357>,\r\n<-0.50304,0.07327,0.59056>,\r\n<-0.49258,0.08023,0.58806>,\r\n<-0.48645,0.09137,0.58532>,\r\n<-0.48756,0.10360,0.58180>,\r\n<-0.49512,0.11356,0.57919>,\r\n<-0.49676,0.12578,0.57588>,\r\n<-0.49075,0.13636,0.57134>,\r\n<-0.47986,0.14129,0.56728>,\r\n<-0.47009,0.14791,0.56301>,\r\n<-0.46512,0.15882,0.55784>,\r\n<-0.46722,0.17017,0.55245>,\r\n<-0.47505,0.17930,0.54805>,\r\n<-0.47838,0.19036,0.54290>,\r\n<-0.47590,0.20144,0.53690>,\r\n<-0.46778,0.20873,0.53011>,\r\n<-0.45733,0.21038,0.52357>,\r\n<-0.44644,0.21122,0.51737>,\r\n<-0.43674,0.21619,0.51046>,\r\n<-0.43089,0.22472,0.50288>,\r\n<-0.42962,0.23461,0.49482>,\r\n<-0.43269,0.24385,0.48689>,\r\n<-0.43745,0.25266,0.47921>,\r\n<-0.43928,0.26218,0.47122>,\r\n<-0.43811,0.27162,0.46283>,\r\n<-0.43389,0.27980,0.45414>,\r\n<-0.42734,0.28590,0.44514>,\r\n<-0.41956,0.28983,0.43601>,\r\n<-0.41119,0.29195,0.42691>,\r\n<-0.40303,0.29486,0.41769>,\r\n<-0.39551,0.29922,0.40836>,\r\n<-0.38903,0.30504,0.39894>,\r\n<-0.38384,0.31193,0.38952>,\r\n<-0.37968,0.31950,0.38011>,\r\n<-0.37614,0.32737,0.37067>,\r\n<-0.37274,0.33533,0.36132>,\r\n<-0.36853,0.34299,0.35201>,\r\n<-0.36322,0.35010,0.34286>,\r\n<-0.35692,0.35650,0.33392>,\r\n<-0.34999,0.36226,0.32517>\r\n<-0.34261,-0.36819,0.33344>,\r\n<-0.34999,-0.36317,0.34233>,\r\n<-0.35691,-0.35745,0.35134>,\r\n<-0.36285,-0.35089,0.36045>,\r\n<-0.36768,-0.34356,0.36965>,\r\n<-0.37132,-0.33566,0.37897>,\r\n<-0.37430,-0.32757,0.38829>,\r\n<-0.37789,-0.31970,0.39772>,\r\n<-0.38240,-0.31235,0.40708>,\r\n<-0.38819,-0.30587,0.41653>,\r\n<-0.39522,-0.30073,0.42593>,\r\n<-0.40306,-0.29706,0.43530>,\r\n<-0.41157,-0.29511,0.44455>,\r\n<-0.41989,-0.29237,0.45378>,\r\n<-0.42745,-0.28751,0.46289>,\r\n<-0.43338,-0.28039,0.47186>,\r\n<-0.43652,-0.27140,0.48047>,\r\n<-0.43645,-0.26166,0.48866>,\r\n<-0.43369,-0.25232,0.49657>,\r\n<-0.42918,-0.24343,0.50452>,\r\n<-0.42894,-0.23361,0.51260>,\r\n<-0.43291,-0.22414,0.52048>,\r\n<-0.44114,-0.21740,0.52754>,\r\n<-0.45119,-0.21408,0.53434>,\r\n<-0.46216,-0.21313,0.54076>,\r\n<-0.47069,-0.20674,0.54753>,\r\n<-0.47482,-0.19633,0.55383>,\r\n<-0.47303,-0.18494,0.55937>,\r\n<-0.46655,-0.17517,0.56424>,\r\n<-0.46449,-0.16404,0.56984>,\r\n<-0.46955,-0.15341,0.57492>,\r\n<-0.47854,-0.14614,0.57937>,\r\n<-0.48915,-0.14087,0.58374>,\r\n<-0.49505,-0.13057,0.58827>,\r\n<-0.49414,-0.11839,0.59170>,\r\n<-0.48767,-0.10792,0.59446>,\r\n<-0.48676,-0.09573,0.59819>,\r\n<-0.49271,-0.08515,0.60082>,\r\n<-0.50072,-0.07676,0.60323>,\r\n<-0.50605,-0.06558,0.60627>,\r\n<-0.50390,-0.05321,0.60722>,\r\n<-0.49833,-0.04262,0.60817>,\r\n<-0.49911,-0.03043,0.60923>,\r\n<-0.49970,-0.01837,0.60969>,\r\n<-0.50570,-0.00748,0.61113>,\r\n<-0.50550,0.00491,0.61133>,\r\n<-0.50004,0.01559,0.61021>,\r\n<-0.49925,0.02806,0.60906>,\r\n<-0.49839,0.04022,0.60791>,\r\n<-0.50348,0.05149,0.60709>,\r\n<-0.50549,0.06367,0.60583>,\r\n<-0.50052,0.07469,0.60313>,\r\n<-0.49294,0.08381,0.60054>,\r\n<-0.48687,0.09441,0.59780>,\r\n<-0.48811,0.10674,0.59440>,\r\n<-0.49384,0.11744,0.59178>,\r\n<-0.49403,0.12957,0.58870>,\r\n<-0.48777,0.13955,0.58376>,\r\n<-0.47735,0.14504,0.57932>,\r\n<-0.46857,0.15297,0.57461>,\r\n<-0.46506,0.16416,0.56962>,\r\n<-0.46802,0.17507,0.56412>,\r\n<-0.47457,0.18458,0.55944>,\r\n<-0.47593,0.19613,0.55392>,\r\n<-0.47114,0.20616,0.54762>,\r\n<-0.46212,0.21205,0.54065>,\r\n<-0.45105,0.21251,0.53462>,\r\n<-0.44100,0.21610,0.52796>,\r\n<-0.43299,0.22317,0.52069>,\r\n<-0.42947,0.23270,0.51285>,\r\n<-0.43016,0.24258,0.50482>,\r\n<-0.43502,0.25152,0.49701>,\r\n<-0.43738,0.26094,0.48898>,\r\n<-0.43697,0.27062,0.48079>,\r\n<-0.43342,0.27929,0.47210>,\r\n<-0.42735,0.28603,0.46332>,\r\n<-0.41968,0.29054,0.45416>,\r\n<-0.41123,0.29303,0.44510>,\r\n<-0.40283,0.29544,0.43586>,\r\n<-0.39512,0.29954,0.42649>,\r\n<-0.38838,0.30511,0.41705>,\r\n<-0.38301,0.31195,0.40760>,\r\n<-0.37888,0.31956,0.39823>,\r\n<-0.37569,0.32757,0.38884>,\r\n<-0.37286,0.33581,0.37947>,\r\n<-0.36906,0.34362,0.37012>,\r\n<-0.36398,0.35086,0.36085>,\r\n<-0.35773,0.35728,0.35181>,\r\n<-0.35060,0.36276,0.34299>,\r\n<-0.34300,0.36758,0.33433>\r\n<-0.33512,-0.37291,0.34274>,\r\n<-0.34307,-0.36875,0.35143>,\r\n<-0.35075,-0.36391,0.36039>,\r\n<-0.35762,-0.35821,0.36947>,\r\n<-0.36345,-0.35150,0.37862>,\r\n<-0.36804,-0.34399,0.38793>,\r\n<-0.37130,-0.33596,0.39728>,\r\n<-0.37398,-0.32773,0.40673>,\r\n<-0.37734,-0.31980,0.41617>,\r\n<-0.38190,-0.31239,0.42559>,\r\n<-0.38785,-0.30598,0.43500>,\r\n<-0.39507,-0.30098,0.44441>,\r\n<-0.40310,-0.29753,0.45376>,\r\n<-0.41171,-0.29555,0.46302>,\r\n<-0.41998,-0.29227,0.47214>,\r\n<-0.42730,-0.28684,0.48116>,\r\n<-0.43265,-0.27918,0.49005>,\r\n<-0.43500,-0.26993,0.49849>,\r\n<-0.43458,-0.26024,0.50672>,\r\n<-0.43133,-0.25103,0.51467>,\r\n<-0.42878,-0.24164,0.52270>,\r\n<-0.43030,-0.23180,0.53073>,\r\n<-0.43620,-0.22318,0.53822>,\r\n<-0.44535,-0.21761,0.54516>,\r\n<-0.45603,-0.21582,0.55156>,\r\n<-0.46540,-0.21132,0.55836>,\r\n<-0.47150,-0.20236,0.56486>,\r\n<-0.47213,-0.19092,0.57077>,\r\n<-0.46801,-0.18031,0.57589>,\r\n<-0.46492,-0.16960,0.58145>,\r\n<-0.46839,-0.15875,0.58699>,\r\n<-0.47571,-0.14994,0.59158>,\r\n<-0.48568,-0.14380,0.59596>,\r\n<-0.49176,-0.13401,0.60062>,\r\n<-0.49228,-0.12212,0.60420>,\r\n<-0.48767,-0.11098,0.60713>,\r\n<-0.49001,-0.09966,0.61069>,\r\n<-0.49217,-0.08821,0.61352>,\r\n<-0.49897,-0.07872,0.61652>,\r\n<-0.50307,-0.06720,0.61914>,\r\n<-0.50192,-0.05495,0.62052>,\r\n<-0.49817,-0.04339,0.62116>,\r\n<-0.49904,-0.03132,0.62245>,\r\n<-0.49963,-0.01942,0.62313>,\r\n<-0.50295,-0.00757,0.62359>,\r\n<-0.50341,0.00465,0.62328>,\r\n<-0.49998,0.01627,0.62218>,\r\n<-0.49918,0.02890,0.62208>,\r\n<-0.49852,0.04114,0.62081>,\r\n<-0.50117,0.05310,0.62000>,\r\n<-0.50216,0.06529,0.61862>,\r\n<-0.49776,0.07642,0.61594>,\r\n<-0.49242,0.08679,0.61323>,\r\n<-0.49029,0.09827,0.61038>,\r\n<-0.48829,0.10945,0.60656>,\r\n<-0.49185,0.12070,0.60345>,\r\n<-0.49116,0.13260,0.59979>,\r\n<-0.48414,0.14236,0.59485>,\r\n<-0.47498,0.14909,0.59100>,\r\n<-0.46766,0.15835,0.58656>,\r\n<-0.46545,0.16965,0.58137>,\r\n<-0.46976,0.18012,0.57638>,\r\n<-0.47337,0.19069,0.57140>,\r\n<-0.47231,0.20186,0.56568>,\r\n<-0.46553,0.21044,0.55901>,\r\n<-0.45570,0.21443,0.55214>,\r\n<-0.44516,0.21641,0.54563>,\r\n<-0.43625,0.22227,0.53857>,\r\n<-0.43073,0.23098,0.53104>,\r\n<-0.42948,0.24076,0.52301>,\r\n<-0.43256,0.25006,0.51513>,\r\n<-0.43559,0.25945,0.50714>,\r\n<-0.43575,0.26924,0.49895>,\r\n<-0.43286,0.27839,0.49030>,\r\n<-0.42711,0.28562,0.48149>,\r\n<-0.41973,0.29068,0.47253>,\r\n<-0.41139,0.29357,0.46336>,\r\n<-0.40290,0.29585,0.45423>,\r\n<-0.39505,0.29979,0.44488>,\r\n<-0.38809,0.30522,0.43545>,\r\n<-0.38253,0.31205,0.42601>,\r\n<-0.37837,0.31971,0.41660>,\r\n<-0.37535,0.32789,0.40722>,\r\n<-0.37290,0.33619,0.39777>,\r\n<-0.36944,0.34422,0.38838>,\r\n<-0.36465,0.35157,0.37903>,\r\n<-0.35855,0.35807,0.36988>,\r\n<-0.35139,0.36355,0.36096>,\r\n<-0.34358,0.36805,0.35220>,\r\n<-0.33543,0.37201,0.34358>\r\n<-0.32728,-0.37687,0.35198>,\r\n<-0.33557,-0.37325,0.36075>,\r\n<-0.34379,-0.36928,0.36963>,\r\n<-0.35146,-0.36458,0.37861>,\r\n<-0.35834,-0.35881,0.38772>,\r\n<-0.36399,-0.35196,0.39702>,\r\n<-0.36826,-0.34433,0.40643>,\r\n<-0.37122,-0.33622,0.41588>,\r\n<-0.37365,-0.32794,0.42539>,\r\n<-0.37698,-0.31993,0.43481>,\r\n<-0.38158,-0.31250,0.44426>,\r\n<-0.38773,-0.30613,0.45374>,\r\n<-0.39511,-0.30125,0.46311>,\r\n<-0.40327,-0.29794,0.47244>,\r\n<-0.41187,-0.29572,0.48161>,\r\n<-0.41992,-0.29192,0.49074>,\r\n<-0.42680,-0.28586,0.49978>,\r\n<-0.43155,-0.27783,0.50855>,\r\n<-0.43340,-0.26841,0.51692>,\r\n<-0.43289,-0.25874,0.52505>,\r\n<-0.42990,-0.24938,0.53310>,\r\n<-0.42938,-0.23972,0.54111>,\r\n<-0.43278,-0.23030,0.54887>,\r\n<-0.44008,-0.22275,0.55610>,\r\n<-0.44943,-0.21815,0.56289>,\r\n<-0.45959,-0.21486,0.56970>,\r\n<-0.46713,-0.20748,0.57648>,\r\n<-0.46975,-0.19661,0.58254>,\r\n<-0.46868,-0.18556,0.58789>,\r\n<-0.46551,-0.17475,0.59334>,\r\n<-0.46777,-0.16401,0.59895>,\r\n<-0.47524,-0.15545,0.60359>,\r\n<-0.48160,-0.14664,0.60830>,\r\n<-0.48819,-0.13744,0.61308>,\r\n<-0.48955,-0.12583,0.61673>,\r\n<-0.48769,-0.11412,0.61988>,\r\n<-0.48937,-0.10262,0.62355>,\r\n<-0.49165,-0.09106,0.62656>,\r\n<-0.49498,-0.07998,0.62922>,\r\n<-0.49804,-0.06868,0.63165>,\r\n<-0.49678,-0.05687,0.63279>,\r\n<-0.49805,-0.04438,0.63452>,\r\n<-0.49900,-0.03229,0.63572>,\r\n<-0.49964,-0.02002,0.63617>,\r\n<-0.49997,-0.00761,0.63642>,\r\n<-0.49999,0.00504,0.63623>,\r\n<-0.49972,0.01746,0.63585>,\r\n<-0.49914,0.02987,0.63526>,\r\n<-0.49824,0.04216,0.63430>,\r\n<-0.49704,0.05433,0.63288>,\r\n<-0.49726,0.06649,0.63117>,\r\n<-0.49456,0.07809,0.62870>,\r\n<-0.49191,0.08962,0.62627>,\r\n<-0.48966,0.10123,0.62323>,\r\n<-0.48858,0.11276,0.61936>,\r\n<-0.48925,0.12393,0.61591>,\r\n<-0.48731,0.13563,0.61191>,\r\n<-0.48060,0.14553,0.60724>,\r\n<-0.47539,0.15501,0.60327>,\r\n<-0.46748,0.16362,0.59874>,\r\n<-0.46614,0.17470,0.59324>,\r\n<-0.47010,0.18544,0.58830>,\r\n<-0.47086,0.19670,0.58293>,\r\n<-0.46740,0.20722,0.57712>,\r\n<-0.45966,0.21413,0.57031>,\r\n<-0.44939,0.21670,0.56346>,\r\n<-0.44027,0.22170,0.55655>,\r\n<-0.43311,0.22931,0.54922>,\r\n<-0.42991,0.23887,0.54161>,\r\n<-0.43089,0.24857,0.53346>,\r\n<-0.43387,0.25782,0.52553>,\r\n<-0.43428,0.26750,0.51732>,\r\n<-0.43213,0.27696,0.50886>,\r\n<-0.42693,0.28486,0.49990>,\r\n<-0.41979,0.29049,0.49097>,\r\n<-0.41160,0.29388,0.48185>,\r\n<-0.40306,0.29631,0.47269>,\r\n<-0.39506,0.30012,0.46347>,\r\n<-0.38797,0.30542,0.45408>,\r\n<-0.38225,0.31216,0.44460>,\r\n<-0.37804,0.31989,0.43508>,\r\n<-0.37511,0.32800,0.42570>,\r\n<-0.37283,0.33642,0.41628>,\r\n<-0.36970,0.34451,0.40683>,\r\n<-0.36517,0.35211,0.39748>,\r\n<-0.35926,0.35878,0.38820>,\r\n<-0.35211,0.36426,0.37915>,\r\n<-0.34420,0.36869,0.37026>,\r\n<-0.33595,0.37227,0.36152>,\r\n<-0.32759,0.37569,0.35283>\r\n<-0.31944,-0.38059,0.36139>,\r\n<-0.32767,-0.37680,0.37009>,\r\n<-0.33616,-0.37349,0.37897>,\r\n<-0.34436,-0.36975,0.38787>,\r\n<-0.35210,-0.36508,0.39696>,\r\n<-0.35885,-0.35926,0.40623>,\r\n<-0.36430,-0.35228,0.41566>,\r\n<-0.36834,-0.34457,0.42510>,\r\n<-0.37111,-0.33637,0.43466>,\r\n<-0.37346,-0.32803,0.44413>,\r\n<-0.37678,-0.31999,0.45357>,\r\n<-0.38155,-0.31251,0.46313>,\r\n<-0.38782,-0.30630,0.47258>,\r\n<-0.39530,-0.30156,0.48195>,\r\n<-0.40354,-0.29820,0.49120>,\r\n<-0.41202,-0.29552,0.50032>,\r\n<-0.41982,-0.29104,0.50947>,\r\n<-0.42620,-0.28453,0.51850>,\r\n<-0.43033,-0.27615,0.52718>,\r\n<-0.43199,-0.26671,0.53553>,\r\n<-0.43151,-0.25709,0.54357>,\r\n<-0.42961,-0.24747,0.55160>,\r\n<-0.43097,-0.23786,0.55946>,\r\n<-0.43621,-0.22911,0.56707>,\r\n<-0.44403,-0.22246,0.57391>,\r\n<-0.45340,-0.21803,0.58053>,\r\n<-0.46165,-0.21181,0.58753>,\r\n<-0.46631,-0.20182,0.59395>,\r\n<-0.46698,-0.19066,0.59966>,\r\n<-0.46632,-0.18044,0.60555>,\r\n<-0.47011,-0.17039,0.61095>,\r\n<-0.47368,-0.16015,0.61598>,\r\n<-0.47807,-0.15001,0.62072>,\r\n<-0.48348,-0.14020,0.62552>,\r\n<-0.48513,-0.12888,0.62946>,\r\n<-0.48604,-0.11736,0.63289>,\r\n<-0.48868,-0.10585,0.63620>,\r\n<-0.49108,-0.09405,0.63907>,\r\n<-0.49338,-0.08213,0.64161>,\r\n<-0.49508,-0.07000,0.64416>,\r\n<-0.49570,-0.05812,0.64582>,\r\n<-0.49799,-0.04567,0.64752>,\r\n<-0.49547,-0.03807,0.65000>,\r\n<-0.49974,-0.02057,0.64931>,\r\n<-0.50010,-0.00779,0.64950>,\r\n<-0.50011,0.00525,0.64938>,\r\n<-0.49980,0.01800,0.64897>,\r\n<-0.49916,0.03069,0.64825>,\r\n<-0.49818,0.04328,0.64717>,\r\n<-0.49690,0.05578,0.64570>,\r\n<-0.49533,0.06821,0.64377>,\r\n<-0.49370,0.08053,0.64134>,\r\n<-0.49135,0.09261,0.63880>,\r\n<-0.48898,0.10449,0.63593>,\r\n<-0.48648,0.11559,0.63249>,\r\n<-0.48455,0.12688,0.62886>,\r\n<-0.48232,0.13815,0.62461>,\r\n<-0.47751,0.14887,0.62014>,\r\n<-0.47388,0.15956,0.61564>,\r\n<-0.47032,0.16979,0.61092>,\r\n<-0.46643,0.18016,0.60584>,\r\n<-0.46840,0.19125,0.60053>,\r\n<-0.46700,0.20186,0.59495>,\r\n<-0.46205,0.21119,0.58844>,\r\n<-0.45356,0.21692,0.58132>,\r\n<-0.44430,0.22127,0.57473>,\r\n<-0.43658,0.22817,0.56740>,\r\n<-0.43142,0.23695,0.55987>,\r\n<-0.43042,0.24661,0.55198>,\r\n<-0.43246,0.25614,0.54397>,\r\n<-0.43281,0.26578,0.53587>,\r\n<-0.43107,0.27522,0.52755>,\r\n<-0.42657,0.28359,0.51879>,\r\n<-0.41978,0.28989,0.50966>,\r\n<-0.41179,0.29396,0.50053>,\r\n<-0.40334,0.29666,0.49133>,\r\n<-0.39532,0.30039,0.48214>,\r\n<-0.38809,0.30562,0.47281>,\r\n<-0.38222,0.31223,0.46336>,\r\n<-0.37791,0.31991,0.45387>,\r\n<-0.37488,0.32820,0.44433>,\r\n<-0.37269,0.33658,0.43495>,\r\n<-0.36972,0.34478,0.42547>,\r\n<-0.36546,0.35238,0.41606>,\r\n<-0.35976,0.35917,0.40673>,\r\n<-0.35271,0.36477,0.39751>,\r\n<-0.34481,0.36913,0.38854>,\r\n<-0.33639,0.37255,0.37965>,\r\n<-0.32791,0.37562,0.37089>,\r\n<-0.31970,0.37926,0.36216>\r\n<-0.31193,-0.38467,0.37085>,\r\n<-0.31982,-0.38014,0.37948>,\r\n<-0.32812,-0.37651,0.38827>,\r\n<-0.33663,-0.37360,0.39721>,\r\n<-0.34486,-0.37003,0.40634>,\r\n<-0.35247,-0.36542,0.41559>,\r\n<-0.35912,-0.35951,0.42498>,\r\n<-0.36438,-0.35251,0.43438>,\r\n<-0.36829,-0.34471,0.44397>,\r\n<-0.37095,-0.33649,0.45357>,\r\n<-0.37332,-0.32814,0.46303>,\r\n<-0.37682,-0.32001,0.47263>,\r\n<-0.38171,-0.31273,0.48217>,\r\n<-0.38813,-0.30666,0.49162>,\r\n<-0.39574,-0.30189,0.50104>,\r\n<-0.40389,-0.29836,0.51022>,\r\n<-0.41208,-0.29505,0.51935>,\r\n<-0.41941,-0.28995,0.52848>,\r\n<-0.42528,-0.28292,0.53748>,\r\n<-0.42901,-0.27436,0.54607>,\r\n<-0.43064,-0.26491,0.55430>,\r\n<-0.43057,-0.25519,0.56235>,\r\n<-0.43060,-0.24564,0.57031>,\r\n<-0.43382,-0.23644,0.57824>,\r\n<-0.44009,-0.22847,0.58541>,\r\n<-0.44768,-0.22193,0.59193>,\r\n<-0.45573,-0.21548,0.59873>,\r\n<-0.46129,-0.20670,0.60562>,\r\n<-0.46406,-0.19639,0.61173>,\r\n<-0.46535,-0.18531,0.61752>,\r\n<-0.46832,-0.17520,0.62348>,\r\n<-0.47205,-0.16491,0.62860>,\r\n<-0.47561,-0.15429,0.63332>,\r\n<-0.47918,-0.14345,0.63764>,\r\n<-0.48222,-0.13217,0.64168>,\r\n<-0.48528,-0.12059,0.64552>,\r\n<-0.48816,-0.10875,0.64905>,\r\n<-0.49046,-0.09663,0.65269>,\r\n<-0.49114,-0.08409,0.65612>,\r\n<-0.49066,-0.07126,0.65851>,\r\n<-0.48965,-0.05870,0.65975>,\r\n<-0.48898,-0.04581,0.66014>,\r\n<-0.48896,-0.03290,0.66019>,\r\n<-0.48919,-0.02023,0.66019>,\r\n<-0.48936,-0.00753,0.66019>,\r\n<-0.48948,0.00537,0.66018>,\r\n<-0.48959,0.01813,0.66019>,\r\n<-0.48984,0.03092,0.66018>,\r\n<-0.49029,0.04375,ZP>,\r\n<-0.49093,0.05665,0.65939>,\r\n<-0.49161,0.06961,0.65799>,\r\n<-0.49181,0.08251,0.65554>,\r\n<-0.49085,0.09518,0.65221>,\r\n<-0.48845,0.10742,0.64873>,\r\n<-0.48561,0.11928,0.64526>,\r\n<-0.48261,0.13076,0.64137>,\r\n<-0.47937,0.14226,0.63656>,\r\n<-0.47591,0.15338,0.63304>,\r\n<-0.47234,0.16407,0.62844>,\r\n<-0.46860,0.17444,0.62347>,\r\n<-0.46625,0.18520,0.61812>,\r\n<-0.46513,0.19620,0.61269>,\r\n<-0.46213,0.20645,0.60688>,\r\n<-0.45612,0.21477,0.60006>,\r\n<-0.44800,0.22092,0.59290>,\r\n<-0.44044,0.22758,0.58602>,\r\n<-0.43433,0.23564,0.57858>,\r\n<-0.43135,0.24466,0.57063>,\r\n<-0.43151,0.25414,0.56266>,\r\n<-0.43148,0.26380,0.55456>,\r\n<-0.42976,0.27336,0.54629>,\r\n<-0.42593,0.28193,0.53763>,\r\n<-0.41975,0.28875,0.52860>,\r\n<-0.41213,0.29354,0.51940>,\r\n<-0.40375,0.29686,0.51027>,\r\n<-0.39566,0.30074,0.50109>,\r\n<-0.38834,0.30592,0.49181>,\r\n<-0.38233,0.31244,0.48234>,\r\n<-0.37790,0.31996,0.47280>,\r\n<-0.37484,0.32806,0.46327>,\r\n<-0.37255,0.33652,0.45377>,\r\n<-0.36969,0.34475,0.44440>,\r\n<-0.36551,0.35253,0.43488>,\r\n<-0.35995,0.35939,0.42547>,\r\n<-0.35308,0.36502,0.41615>,\r\n<-0.34520,0.36939,0.40698>,\r\n<-0.33685,0.37264,0.39800>,\r\n<-0.32815,0.37522,0.38906>,\r\n<-0.31986,0.37882,0.38029>,\r\n<-0.31202,0.38330,0.37156>\r\n<-0.30487,-0.38940,0.38033>,\r\n<-0.31217,-0.38402,0.38890>,\r\n<-0.32003,-0.37941,0.39770>,\r\n<-0.32843,-0.37627,0.40667>,\r\n<-0.33695,-0.37364,0.41583>,\r\n<-0.34507,-0.37022,0.42505>,\r\n<-0.35264,-0.36560,0.43445>,\r\n<-0.35913,-0.35971,0.44387>,\r\n<-0.36434,-0.35260,0.45347>,\r\n<-0.36814,-0.34477,0.46310>,\r\n<-0.37081,-0.33652,0.47256>,\r\n<-0.37340,-0.32810,0.48220>,\r\n<-0.37704,-0.32021,0.49187>,\r\n<-0.38215,-0.31306,0.50140>,\r\n<-0.38874,-0.30702,0.51085>,\r\n<-0.39630,-0.30219,0.52021>,\r\n<-0.40420,-0.29836,0.52941>,\r\n<-0.41196,-0.29428,0.53860>,\r\n<-0.41885,-0.28849,0.54776>,\r\n<-0.42415,-0.28111,0.55658>,\r\n<-0.42757,-0.27235,0.56503>,\r\n<-0.42952,-0.26278,0.57330>,\r\n<-0.43053,-0.25325,0.58133>,\r\n<-0.43263,-0.24384,0.58930>,\r\n<-0.43724,-0.23519,0.59686>,\r\n<-0.44490,-0.22823,0.60407>,\r\n<-0.45040,-0.21970,0.61035>,\r\n<-0.45563,-0.21098,0.61733>,\r\n<-0.45915,-0.20089,0.62353>,\r\n<-0.46247,-0.19014,0.62959>,\r\n<-0.46640,-0.18024,0.63556>,\r\n<-0.47035,-0.16971,0.64072>,\r\n<-0.47423,-0.15868,0.64568>,\r\n<-0.47802,-0.14731,0.65053>,\r\n<-0.47989,-0.13516,0.65581>,\r\n<-0.47905,-0.12225,0.65935>,\r\n<-0.47762,-0.10922,0.66021>,\r\n<-0.47707,-0.09643,0.66009>,\r\n<-0.47658,-0.08380,ZP>,\r\n<-0.47617,-0.07110,ZP>,\r\n<-0.47550,-0.05853,0.66008>,\r\n<-0.47542,-0.04559,ZP>,\r\n<-0.47567,-0.03261,ZP>,\r\n<-0.47599,-0.01988,ZP>,\r\n<-0.47619,-0.00722,ZP>,\r\n<-0.47630,0.00553,ZP>,\r\n<-0.47637,0.01826,ZP>,\r\n<-0.47645,0.03102,ZP>,\r\n<-0.47658,0.04382,ZP>,\r\n<-0.47681,0.05665,ZP>,\r\n<-0.47711,0.06947,ZP>,\r\n<-0.47743,0.08226,ZP>,\r\n<-0.47778,0.09507,0.66011>,\r\n<-0.47822,0.10798,0.66024>,\r\n<-0.47954,0.12114,0.65932>,\r\n<-0.48039,0.13420,0.65562>,\r\n<-0.47423,0.14634,0.65034>,\r\n<-0.47463,0.15756,0.64558>,\r\n<-0.47072,0.16870,0.64073>,\r\n<-0.46679,0.17931,0.63557>,\r\n<-0.46280,0.18946,0.62975>,\r\n<-0.46054,0.20014,0.62408>,\r\n<-0.45696,0.21031,0.61802>,\r\n<-0.45072,0.21858,0.61144>,\r\n<-0.44534,0.22738,0.60439>,\r\n<-0.43768,0.23448,0.59757>,\r\n<-0.43321,0.24304,0.58974>,\r\n<-0.43140,0.25231,0.58156>,\r\n<-0.43038,0.26166,0.57338>,\r\n<-0.42840,0.27113,0.56527>,\r\n<-0.42480,0.28005,0.55669>,\r\n<-0.41925,0.28738,0.54781>,\r\n<-0.41216,0.29288,0.53870>,\r\n<-0.40419,0.29690,0.52945>,\r\n<-0.39631,0.30100,0.52022>,\r\n<-0.38896,0.30617,0.51092>,\r\n<-0.38273,0.31258,0.50158>,\r\n<-0.37804,0.32002,0.49211>,\r\n<-0.37478,0.32807,0.48253>,\r\n<-0.37239,0.33643,0.47293>,\r\n<-0.36953,0.34470,0.46340>,\r\n<-0.36548,0.35246,0.45397>,\r\n<-0.35999,0.35943,0.44444>,\r\n<-0.35322,0.36511,0.43499>,\r\n<-0.34551,0.36944,0.42567>,\r\n<-0.33715,0.37260,0.41647>,\r\n<-0.32855,0.37496,0.40745>,\r\n<-0.31999,0.37798,0.39846>,\r\n<-0.31208,0.38259,0.38969>,\r\n<-0.30480,0.38814,0.38100>\r\n<-0.29858,-0.39519,0.38977>,\r\n<-0.30503,-0.38876,0.39832>,\r\n<-0.31225,-0.38314,0.40710>,\r\n<-0.32023,-0.37891,0.41612>,\r\n<-0.32864,-0.37605,0.42530>,\r\n<-0.33709,-0.37361,0.43449>,\r\n<-0.34525,-0.37021,0.44390>,\r\n<-0.35270,-0.36561,0.45342>,\r\n<-0.35912,-0.35962,0.46303>,\r\n<-0.36420,-0.35249,0.47273>,\r\n<-0.36796,-0.34463,0.48229>,\r\n<-0.37078,-0.33634,0.49195>,\r\n<-0.37362,-0.32814,0.50164>,\r\n<-0.37756,-0.32039,0.51121>,\r\n<-0.38290,-0.31341,0.52071>,\r\n<-0.38958,-0.30742,0.53024>,\r\n<-0.39691,-0.30250,0.53958>,\r\n<-0.40446,-0.29816,0.54882>,\r\n<-0.41173,-0.29317,0.55807>,\r\n<-0.41797,-0.28675,0.56712>,\r\n<-0.42286,-0.27885,0.57587>,\r\n<-0.42631,-0.26981,0.58428>,\r\n<-0.42873,-0.26052,0.59236>,\r\n<-0.43215,-0.25152,0.60053>,\r\n<-0.43697,-0.24308,0.60818>,\r\n<-0.44177,-0.23424,0.61565>,\r\n<-0.44657,-0.22492,0.62255>,\r\n<-0.45173,-0.21437,0.62884>,\r\n<-0.45603,-0.20511,0.63477>,\r\n<-0.46011,-0.19582,0.64202>,\r\n<-0.46462,-0.18520,0.64785>,\r\n<-0.46822,-0.17383,0.65431>,\r\n<-0.46738,-0.16076,0.65947>,\r\n<-0.46582,-0.14751,0.66019>,\r\n<-0.46519,-0.13460,0.66007>,\r\n<-0.46474,-0.12182,ZP>,\r\n<-0.46441,-0.10907,ZP>,\r\n<-0.46417,-0.09639,ZP>,\r\n<-0.46393,-0.08381,ZP>,\r\n<-0.46366,-0.07118,ZP>,\r\n<-0.46337,-0.05837,ZP>,\r\n<-0.46318,-0.04549,ZP>,\r\n<-0.46310,-0.03262,ZP>,\r\n<-0.46313,-0.01977,ZP>,\r\n<-0.46323,-0.00700,ZP>,\r\n<-0.46336,0.00574,ZP>,\r\n<-0.46351,0.01851,ZP>,\r\n<-0.46370,0.03132,ZP>,\r\n<-0.46396,0.04414,ZP>,\r\n<-0.46426,0.05695,ZP>,\r\n<-0.46454,0.06970,ZP>,\r\n<-0.46473,0.08238,ZP>,\r\n<-0.46484,0.09507,ZP>,\r\n<-0.46497,0.10785,ZP>,\r\n<-0.46512,0.12061,ZP>,\r\n<-0.46543,0.13347,0.66012>,\r\n<-0.46597,0.14643,0.66028>,\r\n<-0.46768,0.15969,0.65958>,\r\n<-0.46861,0.17279,0.65439>,\r\n<-0.46496,0.18439,0.64801>,\r\n<-0.46055,0.19486,0.64220>,\r\n<-0.45612,0.20487,0.63608>,\r\n<-0.45167,0.21451,0.62958>,\r\n<-0.44692,0.22426,0.62343>,\r\n<-0.44229,0.23330,0.61633>,\r\n<-0.43758,0.24205,0.60874>,\r\n<-0.43264,0.25067,0.60072>,\r\n<-0.42949,0.25948,0.59262>,\r\n<-0.42697,0.26882,0.58433>,\r\n<-0.42357,0.27772,0.57604>,\r\n<-0.41857,0.28550,0.56721>,\r\n<-0.41209,0.29182,0.55812>,\r\n<-0.40465,0.29669,0.54895>,\r\n<-0.39703,0.30128,0.53960>,\r\n<-0.38981,0.30649,0.53030>,\r\n<-0.38342,0.31281,0.52093>,\r\n<-0.37842,0.32008,0.51153>,\r\n<-0.37483,0.32803,0.50200>,\r\n<-0.37220,0.33628,0.49237>,\r\n<-0.36932,0.34446,0.48276>,\r\n<-0.36533,0.35226,0.47313>,\r\n<-0.36001,0.35922,0.46359>,\r\n<-0.35328,0.36502,0.45402>,\r\n<-0.34561,0.36941,0.44451>,\r\n<-0.33740,0.37249,0.43516>,\r\n<-0.32880,0.37472,0.42587>,\r\n<-0.32031,0.37749,0.41681>,\r\n<-0.31219,0.38167,0.40785>,\r\n<-0.30492,0.38740,0.39916>,\r\n<-0.29852,0.39412,0.39046>\r\n<-0.29348,-0.40212,0.39912>,\r\n<-0.29880,-0.39471,0.40772>,\r\n<-0.30508,-0.38798,0.41650>,\r\n<-0.31236,-0.38257,0.42551>,\r\n<-0.32035,-0.37859,0.43469>,\r\n<-0.32872,-0.37591,0.44394>,\r\n<-0.33714,-0.37351,0.45342>,\r\n<-0.34515,-0.37019,0.46301>,\r\n<-0.35250,-0.36552,0.47262>,\r\n<-0.35884,-0.35944,0.48237>,\r\n<-0.36388,-0.35225,0.49209>,\r\n<-0.36771,-0.34439,0.50180>,\r\n<-0.37076,-0.33623,0.51155>,\r\n<-0.37399,-0.32820,0.52122>,\r\n<-0.37825,-0.32072,0.53085>,\r\n<-0.38385,-0.31390,0.54050>,\r\n<-0.39046,-0.30797,0.55000>,\r\n<-0.39756,-0.30271,0.55926>,\r\n<-0.40471,-0.29754,0.56847>,\r\n<-0.41140,-0.29156,0.57769>,\r\n<-0.41705,-0.28438,0.58662>,\r\n<-0.42157,-0.27610,0.59526>,\r\n<-0.42522,-0.26720,0.60358>,\r\n<-0.42882,-0.25803,0.61172>,\r\n<-0.43352,-0.24917,0.61990>,\r\n<-0.43851,-0.24030,0.62746>,\r\n<-0.44349,-0.23098,0.63425>,\r\n<-0.44845,-0.22126,0.64144>,\r\n<-0.45198,-0.20979,0.64438>,\r\n<-0.45676,-0.20021,0.65595>,\r\n<-0.45455,-0.18638,0.66033>,\r\n<-0.45365,-0.17321,0.66013>,\r\n<-0.45310,-0.16020,ZP>,\r\n<-0.45271,-0.14743,ZP>,\r\n<-0.45234,-0.13472,ZP>,\r\n<-0.45197,-0.12207,ZP>,\r\n<-0.45152,-0.10936,ZP>,\r\n<-0.45105,-0.09656,ZP>,\r\n<-0.45067,-0.08378,ZP>,\r\n<-0.45041,-0.07099,ZP>,\r\n<-0.45025,-0.05817,ZP>,\r\n<-0.45017,-0.04532,ZP>,\r\n<-0.45015,-0.03247,ZP>,\r\n<-0.45017,-0.01965,ZP>,\r\n<-0.45025,-0.00687,ZP>,\r\n<-0.45035,0.00589,ZP>,\r\n<-0.45048,0.01865,ZP>,\r\n<-0.45063,0.03143,ZP>,\r\n<-0.45080,0.04421,ZP>,\r\n<-0.45099,0.05699,ZP>,\r\n<-0.45118,0.06975,ZP>,\r\n<-0.45140,0.08253,ZP>,\r\n<-0.45169,0.09534,ZP>,\r\n<-0.45205,0.10818,ZP>,\r\n<-0.45227,0.12085,ZP>,\r\n<-0.45251,0.13361,ZP>,\r\n<-0.45281,0.14647,0.66008>,\r\n<-0.45325,0.15936,0.66009>,\r\n<-0.45388,0.17235,0.66015>,\r\n<-0.45472,0.18560,0.66030>,\r\n<-0.45687,0.19945,0.65618>,\r\n<-0.44697,0.21331,0.65000>,\r\n<-0.44894,0.22039,0.64059>,\r\n<-0.44397,0.23014,0.63521>,\r\n<-0.43914,0.23923,0.62801>,\r\n<-0.43414,0.24815,0.62027>,\r\n<-0.42946,0.25718,0.61210>,\r\n<-0.42591,0.26612,0.60381>,\r\n<-0.42220,0.27498,0.59532>,\r\n<-0.41763,0.28314,0.58668>,\r\n<-0.41175,0.29036,0.57764>,\r\n<-0.40495,0.29627,0.56854>,\r\n<-0.39779,0.30152,0.55944>,\r\n<-0.39074,0.30701,0.55003>,\r\n<-0.38440,0.31313,0.54062>,\r\n<-0.37910,0.32018,0.53110>,\r\n<-0.37508,0.32788,0.52154>,\r\n<-0.37200,0.33607,0.51191>,\r\n<-0.36892,0.34426,0.50230>,\r\n<-0.36496,0.35203,0.49265>,\r\n<-0.35972,0.35905,0.48286>,\r\n<-0.35323,0.36482,0.47325>,\r\n<-0.34564,0.36928,0.46361>,\r\n<-0.33748,0.37239,0.45408>,\r\n<-0.32904,0.37453,0.44469>,\r\n<-0.32057,0.37717,0.43533>,\r\n<-0.31248,0.38118,0.42622>,\r\n<-0.30508,0.38664,0.41727>,\r\n<-0.29886,0.39352,0.40858>,\r\n<-0.29364,0.40125,0.39986>\r\n<-0.28986,-0.41003,0.40835>,\r\n<-0.29396,-0.40187,0.41702>,\r\n<-0.29898,-0.39423,0.42587>,\r\n<-0.30514,-0.38756,0.43487>,\r\n<-0.31238,-0.38228,0.44408>,\r\n<-0.32033,-0.37845,0.45340>,\r\n<-0.32865,-0.37583,0.46295>,\r\n<-0.33695,-0.37345,0.47257>,\r\n<-0.34489,-0.37000,0.48220>,\r\n<-0.35223,-0.36513,0.49204>,\r\n<-0.35847,-0.35894,0.50188>,\r\n<-0.36342,-0.35179,0.51165>,\r\n<-0.36738,-0.34401,0.52148>,\r\n<-0.37081,-0.33601,0.53128>,\r\n<-0.37454,-0.32827,0.54102>,\r\n<-0.37926,-0.32097,0.55074>,\r\n<-0.38506,-0.31440,0.56040>,\r\n<-0.39151,-0.30841,0.56984>,\r\n<-0.39819,-0.30267,0.57912>,\r\n<-0.40478,-0.29657,0.58843>,\r\n<-0.41085,-0.28965,0.59748>,\r\n<-0.41619,-0.28189,0.60622>,\r\n<-0.42090,-0.27324,0.61489>,\r\n<-0.42461,-0.26402,0.62313>,\r\n<-0.42994,-0.25533,0.63119>,\r\n<-0.43524,-0.24627,0.63882>,\r\n<-0.43089,-0.24321,0.65079>,\r\n<-0.44502,-0.22663,0.65483>,\r\n<-0.44230,-0.21242,0.66048>,\r\n<-0.44145,-0.19901,0.66019>,\r\n<-0.44092,-0.18589,0.66008>,\r\n<-0.44062,-0.17323,ZP>,\r\n<-0.44018,-0.16044,ZP>,\r\n<-0.43970,-0.14771,ZP>,\r\n<-0.43914,-0.13483,ZP>,\r\n<-0.43869,-0.12199,ZP>,\r\n<-0.43834,-0.10920,ZP>,\r\n<-0.43804,-0.09643,ZP>,\r\n<-0.43780,-0.08364,ZP>,\r\n<-0.43761,-0.07084,ZP>,\r\n<-0.43748,-0.05803,ZP>,\r\n<-0.43739,-0.04521,ZP>,\r\n<-0.43734,-0.03239,ZP>,\r\n<-0.43733,-0.01957,ZP>,\r\n<-0.43737,-0.00677,ZP>,\r\n<-0.43745,0.00601,ZP>,\r\n<-0.43757,0.01878,ZP>,\r\n<-0.43771,0.03156,ZP>,\r\n<-0.43788,0.04432,ZP>,\r\n<-0.43804,0.05708,ZP>,\r\n<-0.43822,0.06983,ZP>,\r\n<-0.43840,0.08259,ZP>,\r\n<-0.43859,0.09535,ZP>,\r\n<-0.43880,0.10812,ZP>,\r\n<-0.43904,0.12096,ZP>,\r\n<-0.43942,0.13388,ZP>,\r\n<-0.43993,0.14685,ZP>,\r\n<-0.44038,0.15967,ZP>,\r\n<-0.44080,0.17249,ZP>,\r\n<-0.44110,0.18520,ZP>,\r\n<-0.44161,0.19823,0.66014>,\r\n<-0.44223,0.21058,0.66026>,\r\n<-0.44499,0.22556,0.65552>,\r\n<-0.44101,0.22268,0.65000>,\r\n<-0.43576,0.24548,0.63883>,\r\n<-0.43050,0.25447,0.63139>,\r\n<-0.42523,0.26302,0.62332>,\r\n<-0.42162,0.27226,0.61514>,\r\n<-0.41667,0.28099,0.60636>,\r\n<-0.41136,0.28845,0.59752>,\r\n<-0.40532,0.29529,0.58833>,\r\n<-0.39871,0.30147,0.57915>,\r\n<-0.39200,0.30738,0.57000>,\r\n<-0.38552,0.31369,0.56052>,\r\n<-0.37992,0.32046,0.55099>,\r\n<-0.37543,0.32793,0.54136>,\r\n<-0.37188,0.33576,0.53167>,\r\n<-0.36850,0.34381,0.52190>,\r\n<-0.36446,0.35160,0.51219>,\r\n<-0.35932,0.35863,0.50244>,\r\n<-0.35289,0.36459,0.49255>,\r\n<-0.34551,0.36909,0.48291>,\r\n<-0.33740,0.37229,0.47322>,\r\n<-0.32902,0.37448,0.46365>,\r\n<-0.32073,0.37704,0.45420>,\r\n<-0.31267,0.38091,0.44479>,\r\n<-0.30537,0.38627,0.43564>,\r\n<-0.29922,0.39307,0.42662>,\r\n<-0.29430,0.40085,0.41792>,\r\n<-0.29047,0.40932,0.40913>\r\n<-0.28770,-0.41850,0.41745>,\r\n<-0.29057,-0.40992,0.42630>,\r\n<-0.29437,-0.40167,0.43520>,\r\n<-0.29918,-0.39407,0.44424>,\r\n<-0.30521,-0.38748,0.45347>,\r\n<-0.31239,-0.38226,0.46285>,\r\n<-0.32033,-0.37847,0.47239>,\r\n<-0.32858,-0.37580,0.48204>,\r\n<-0.33679,-0.37324,0.49178>,\r\n<-0.34465,-0.36955,0.50167>,\r\n<-0.35175,-0.36455,0.51162>,\r\n<-0.35775,-0.35837,0.52155>,\r\n<-0.36275,-0.35119,0.53154>,\r\n<-0.36695,-0.34353,0.54144>,\r\n<-0.37087,-0.33578,0.55126>,\r\n<-0.37520,-0.32834,0.56105>,\r\n<-0.38040,-0.32136,0.57084>,\r\n<-0.38629,-0.31484,0.58046>,\r\n<-0.39254,-0.30853,0.58985>,\r\n<-0.39885,-0.30202,0.59915>,\r\n<-0.40511,-0.29501,0.60828>,\r\n<-0.41043,-0.28716,0.61736>,\r\n<-0.41518,-0.27862,0.62601>,\r\n<-0.42067,-0.27033,0.63429>,\r\n<-0.42629,-0.26156,0.64230>,\r\n<-0.43215,-0.25239,0.65049>,\r\n<-0.43161,-0.23929,ZP>,\r\n<-0.42973,-0.22550,0.66023>,\r\n<-0.42882,-0.21215,0.66009>,\r\n<-0.42835,-0.19912,ZP>,\r\n<-0.42784,-0.18610,ZP>,\r\n<-0.42747,-0.17337,ZP>,\r\n<-0.42688,-0.16039,ZP>,\r\n<-0.42645,-0.14757,ZP>,\r\n<-0.42605,-0.13474,ZP>,\r\n<-0.42569,-0.12195,ZP>,\r\n<-0.42537,-0.10915,ZP>,\r\n<-0.42509,-0.09635,ZP>,\r\n<-0.42485,-0.08354,ZP>,\r\n<-0.42468,-0.07072,ZP>,\r\n<-0.42456,-0.05790,ZP>,\r\n<-0.42449,-0.04508,ZP>,\r\n<-0.42445,-0.03228,ZP>,\r\n<-0.42444,-0.01948,ZP>,\r\n<-0.42447,-0.00669,ZP>,\r\n<-0.42453,0.00609,ZP>,\r\n<-0.42462,0.01886,ZP>,\r\n<-0.42474,0.03162,ZP>,\r\n<-0.42486,0.04437,ZP>,\r\n<-0.42501,0.05713,ZP>,\r\n<-0.42516,0.06989,ZP>,\r\n<-0.42535,0.08266,ZP>,\r\n<-0.42555,0.09544,ZP>,\r\n<-0.42577,0.10823,ZP>,\r\n<-0.42603,0.12106,ZP>,\r\n<-0.42634,0.13391,ZP>,\r\n<-0.42669,0.14680,ZP>,\r\n<-0.42708,0.15969,ZP>,\r\n<-0.42762,0.17270,ZP>,\r\n<-0.42796,0.18538,ZP>,\r\n<-0.42840,0.19831,ZP>,\r\n<-0.43050,0.21190,0.66100>,\r\n<-0.42933,0.22461,0.66010>,\r\n<-0.43171,0.23802,0.66012>,\r\n<-0.43294,0.25103,0.65107>,\r\n<-0.42707,0.26033,0.64280>,\r\n<-0.42121,0.26949,0.63462>,\r\n<-0.41572,0.27782,0.62628>,\r\n<-0.41086,0.28626,0.61749>,\r\n<-0.40551,0.29414,0.60842>,\r\n<-0.39943,0.30094,0.59926>,\r\n<-0.39313,0.30751,0.58999>,\r\n<-0.38685,0.31405,0.58068>,\r\n<-0.38099,0.32083,0.57105>,\r\n<-0.37596,0.32790,0.56134>,\r\n<-0.37178,0.33549,0.55156>,\r\n<-0.36798,0.34331,0.54178>,\r\n<-0.36379,0.35098,0.53197>,\r\n<-0.35866,0.35809,0.52209>,\r\n<-0.35245,0.36411,0.51225>,\r\n<-0.34519,0.36883,0.50222>,\r\n<-0.33732,0.37214,0.49249>,\r\n<-0.32900,0.37450,0.48276>,\r\n<-0.32075,0.37710,0.47317>,\r\n<-0.31290,0.38085,0.46367>,\r\n<-0.30566,0.38612,0.45423>,\r\n<-0.29962,0.39285,0.44501>,\r\n<-0.29490,0.40063,0.43594>,\r\n<-0.29132,0.40896,0.42710>,\r\n<-0.28893,0.41786,0.41824>\r\n<-0.28507,-0.42679,0.42657>,\r\n<-0.28860,-0.41851,0.43554>,\r\n<-0.29143,-0.40998,0.44454>,\r\n<-0.29476,-0.40177,0.45363>,\r\n<-0.29939,-0.39426,0.46293>,\r\n<-0.30535,-0.38766,0.47239>,\r\n<-0.31251,-0.38243,0.48194>,\r\n<-0.32040,-0.37863,0.49164>,\r\n<-0.32852,-0.37581,0.50146>,\r\n<-0.33659,-0.37292,0.51141>,\r\n<-0.34426,-0.36897,0.52144>,\r\n<-0.35109,-0.36381,0.53146>,\r\n<-0.35698,-0.35749,0.54159>,\r\n<-0.36200,-0.35041,0.55161>,\r\n<-0.36651,-0.34294,0.56156>,\r\n<-0.37094,-0.33559,0.57148>,\r\n<-0.37588,-0.32842,0.58135>,\r\n<-0.38142,-0.32154,0.59121>,\r\n<-0.38802,-0.31537,0.60080>,\r\n<-0.39375,-0.30817,0.61015>,\r\n<-0.39948,-0.30072,0.61950>,\r\n<-0.40520,-0.29301,0.62847>,\r\n<-0.41091,-0.28500,0.63703>,\r\n<-0.41677,-0.27664,0.64555>,\r\n<-0.42156,-0.26689,0.65581>,\r\n<-0.41835,-0.25215,0.66042>,\r\n<-0.41726,-0.23865,0.66015>,\r\n<-0.41663,-0.22542,0.66007>,\r\n<-0.41599,-0.21232,ZP>,\r\n<-0.41544,-0.19937,ZP>,\r\n<-0.41472,-0.18621,ZP>,\r\n<-0.41421,-0.17324,ZP>,\r\n<-0.41378,-0.16035,ZP>,\r\n<-0.41340,-0.14752,ZP>,\r\n<-0.41302,-0.13468,ZP>,\r\n<-0.41269,-0.12186,ZP>,\r\n<-0.41239,-0.10903,ZP>,\r\n<-0.41215,-0.09621,ZP>,\r\n<-0.41196,-0.08340,ZP>,\r\n<-0.41182,-0.07058,ZP>,\r\n<-0.41171,-0.05778,ZP>,\r\n<-0.41164,-0.04498,ZP>,\r\n<-0.41160,-0.03218,ZP>,\r\n<-0.41159,-0.01940,ZP>,\r\n<-0.41160,-0.00662,ZP>,\r\n<-0.41165,0.00615,ZP>,\r\n<-0.41172,0.01892,ZP>,\r\n<-0.41181,0.03167,ZP>,\r\n<-0.41192,0.04442,ZP>,\r\n<-0.41205,0.05717,ZP>,\r\n<-0.41219,0.06992,ZP>,\r\n<-0.41235,0.08269,ZP>,\r\n<-0.41253,0.09547,ZP>,\r\n<-0.41275,0.10828,ZP>,\r\n<-0.41302,0.12112,ZP>,\r\n<-0.41332,0.13397,ZP>,\r\n<-0.41365,0.14685,ZP>,\r\n<-0.41399,0.15970,ZP>,\r\n<-0.41435,0.17259,ZP>,\r\n<-0.41472,0.18545,ZP>,\r\n<-0.41536,0.19859,ZP>,\r\n<-0.41542,0.21137,ZP>,\r\n<-0.41663,0.22466,ZP>,\r\n<-0.41773,0.23768,0.66013>,\r\n<-0.41889,0.25091,0.66040>,\r\n<-0.42207,0.26547,0.65632>,\r\n<-0.41733,0.27580,0.64589>,\r\n<-0.41146,0.28420,0.63733>,\r\n<-0.40576,0.29223,0.62869>,\r\n<-0.40007,0.29994,0.61968>,\r\n<-0.39435,0.30741,0.61033>,\r\n<-0.38862,0.31463,0.60096>,\r\n<-0.38213,0.32078,0.59126>,\r\n<-0.37658,0.32790,0.58158>,\r\n<-0.37172,0.33516,0.57178>,\r\n<-0.36737,0.34272,0.56185>,\r\n<-0.36293,0.35021,0.55197>,\r\n<-0.35784,0.35727,0.54203>,\r\n<-0.35177,0.36346,0.53204>,\r\n<-0.34480,0.36839,0.52208>,\r\n<-0.33706,0.37202,0.51195>,\r\n<-0.32897,0.37460,0.50210>,\r\n<-0.32078,0.37733,0.49230>,\r\n<-0.31294,0.38111,0.48265>,\r\n<-0.30590,0.38627,0.47310>,\r\n<-0.29999,0.39291,0.46355>,\r\n<-0.29543,0.40055,0.45426>,\r\n<-0.29223,0.40889,0.44509>,\r\n<-0.28986,0.41757,0.43618>,\r\n<-0.28700,0.42623,0.42733>\r\n<-0.28036,-0.43422,0.43566>,\r\n<-0.28543,-0.42667,0.44478>,\r\n<-0.28960,-0.41868,0.45366>,\r\n<-0.29208,-0.41013,0.46282>,\r\n<-0.29518,-0.40201,0.47221>,\r\n<-0.29973,-0.39451,0.48184>,\r\n<-0.30564,-0.38798,0.49147>,\r\n<-0.31276,-0.38278,0.50127>,\r\n<-0.32053,-0.37893,0.51113>,\r\n<-0.32854,-0.37585,0.52108>,\r\n<-0.33647,-0.37253,0.53124>,\r\n<-0.34374,-0.36831,0.54140>,\r\n<-0.35026,-0.36293,0.55160>,\r\n<-0.35606,-0.35654,0.56174>,\r\n<-0.36123,-0.34955,0.57186>,\r\n<-0.36606,-0.34245,0.58194>,\r\n<-0.37105,-0.33532,0.59189>,\r\n<-0.37686,-0.32863,0.60194>,\r\n<-0.38275,-0.32175,0.61167>,\r\n<-0.38866,-0.31461,0.62120>,\r\n<-0.39457,-0.30721,0.63035>,\r\n<-0.40054,-0.29949,0.63927>,\r\n<-0.40674,-0.29147,0.64823>,\r\n<-0.40821,-0.27973,0.65952>,\r\n<-0.40599,-0.26530,0.66025>,\r\n<-0.40514,-0.25198,0.66009>,\r\n<-0.40443,-0.23884,ZP>,\r\n<-0.40366,-0.22563,ZP>,\r\n<-0.40286,-0.21237,ZP>,\r\n<-0.40221,-0.19922,ZP>,\r\n<-0.40166,-0.18619,ZP>,\r\n<-0.40117,-0.17322,ZP>,\r\n<-0.40074,-0.16030,ZP>,\r\n<-0.40036,-0.14743,ZP>,\r\n<-0.40002,-0.13457,ZP>,\r\n<-0.39972,-0.12173,ZP>,\r\n<-0.39947,-0.10891,ZP>,\r\n<-0.39925,-0.09609,ZP>,\r\n<-0.39908,-0.08327,ZP>,\r\n<-0.39895,-0.07047,ZP>,\r\n<-0.39885,-0.05767,ZP>,\r\n<-0.39878,-0.04488,ZP>,\r\n<-0.39874,-0.03210,ZP>,\r\n<-0.39872,-0.01932,ZP>,\r\n<-0.39873,-0.00656,ZP>,\r\n<-0.39877,0.00620,ZP>,\r\n<-0.39882,0.01895,ZP>,\r\n<-0.39890,0.03170,ZP>,\r\n<-0.39899,0.04444,ZP>,\r\n<-0.39911,0.05719,ZP>,\r\n<-0.39924,0.06994,ZP>,\r\n<-0.39939,0.08271,ZP>,\r\n<-0.39957,0.09549,ZP>,\r\n<-0.39978,0.10830,ZP>,\r\n<-0.40002,0.12112,ZP>,\r\n<-0.40028,0.13396,ZP>,\r\n<-0.40059,0.14683,ZP>,\r\n<-0.40091,0.15970,ZP>,\r\n<-0.40127,0.17262,ZP>,\r\n<-0.40164,0.18552,ZP>,\r\n<-0.40211,0.19855,ZP>,\r\n<-0.40276,0.21173,ZP>,\r\n<-0.40366,0.22499,ZP>,\r\n<-0.40455,0.23813,ZP>,\r\n<-0.40537,0.25119,0.66009>,\r\n<-0.40631,0.26441,0.66023>,\r\n<-0.40846,0.27872,0.65969>,\r\n<-0.40731,0.29070,0.64847>,\r\n<-0.40108,0.29878,0.63948>,\r\n<-0.39515,0.30647,0.63051>,\r\n<-0.38926,0.31388,0.62135>,\r\n<-0.38337,0.32102,0.61186>,\r\n<-0.37749,0.32790,0.60219>,\r\n<-0.37180,0.33471,0.59216>,\r\n<-0.36679,0.34202,0.58224>,\r\n<-0.36202,0.34928,0.57221>,\r\n<-0.35691,0.35622,0.56222>,\r\n<-0.35097,0.36255,0.55205>,\r\n<-0.34421,0.36782,0.54191>,\r\n<-0.33678,0.37181,0.53179>,\r\n<-0.32888,0.37481,0.52169>,\r\n<-0.32089,0.37775,0.51173>,\r\n<-0.31314,0.38159,0.50177>,\r\n<-0.30609,0.38677,0.49201>,\r\n<-0.30027,0.39328,0.48241>,\r\n<-0.29584,0.40086,0.47281>,\r\n<-0.29291,0.40907,0.46345>,\r\n<-0.29092,0.41772,0.45420>,\r\n<-0.28726,0.42587,0.44529>,\r\n<-0.28275,0.43384,0.43636>\r\n<-0.27341,-0.43997,0.44465>,\r\n<-0.28006,-0.43378,0.45387>,\r\n<-0.28575,-0.42669,0.46277>,\r\n<-0.28982,-0.41873,0.47197>,\r\n<-0.29254,-0.41044,0.48143>,\r\n<-0.29555,-0.40233,0.49118>,\r\n<-0.30005,-0.39497,0.50084>,\r\n<-0.30600,-0.38852,0.51076>,\r\n<-0.31305,-0.38340,0.52078>,\r\n<-0.32065,-0.37949,0.53084>,\r\n<-0.32847,-0.37605,0.54098>,\r\n<-0.33602,-0.37230,0.55117>,\r\n<-0.34301,-0.36764,0.56147>,\r\n<-0.34943,-0.36193,0.57177>,\r\n<-0.35510,-0.35557,0.58212>,\r\n<-0.36042,-0.34880,0.59236>,\r\n<-0.36575,-0.34186,0.60241>,\r\n<-0.37125,-0.33494,0.61267>,\r\n<-0.37731,-0.32814,0.62254>,\r\n<-0.38337,-0.32109,0.63192>,\r\n<-0.38954,-0.31373,0.64102>,\r\n<-0.39608,-0.30607,0.65060>,\r\n<-0.39441,-0.29201,0.66060>,\r\n<-0.39341,-0.27837,0.66018>,\r\n<-0.39270,-0.26510,0.66008>,\r\n<-0.39204,-0.25198,ZP>,\r\n<-0.39128,-0.23875,ZP>,\r\n<-0.39042,-0.22541,ZP>,\r\n<-0.38977,-0.21226,ZP>,\r\n<-0.38919,-0.19917,ZP>,\r\n<-0.38866,-0.18614,ZP>,\r\n<-0.38818,-0.17316,ZP>,\r\n<-0.38774,-0.16021,ZP>,\r\n<-0.38738,-0.14731,ZP>,\r\n<-0.38707,-0.13445,ZP>,\r\n<-0.38680,-0.12160,ZP>,\r\n<-0.38657,-0.10877,ZP>,\r\n<-0.38638,-0.09596,ZP>,\r\n<-0.38622,-0.08315,ZP>,\r\n<-0.38610,-0.07035,ZP>,\r\n<-0.38600,-0.05757,ZP>,\r\n<-0.38594,-0.04479,ZP>,\r\n<-0.38590,-0.03202,ZP>,\r\n<-0.38588,-0.01926,ZP>,\r\n<-0.38588,-0.00651,ZP>,\r\n<-0.38591,0.00624,ZP>,\r\n<-0.38595,0.01898,ZP>,\r\n<-0.38602,0.03171,ZP>,\r\n<-0.38610,0.04445,ZP>,\r\n<-0.38620,0.05720,ZP>,\r\n<-0.38632,0.06995,ZP>,\r\n<-0.38646,0.08271,ZP>,\r\n<-0.38663,0.09549,ZP>,\r\n<-0.38683,0.10829,ZP>,\r\n<-0.38705,0.12111,ZP>,\r\n<-0.38730,0.13394,ZP>,\r\n<-0.38758,0.14680,ZP>,\r\n<-0.38788,0.15968,ZP>,\r\n<-0.38825,0.17261,ZP>,\r\n<-0.38865,0.18558,ZP>,\r\n<-0.38914,0.19863,ZP>,\r\n<-0.38974,0.21175,ZP>,\r\n<-0.39044,0.22491,ZP>,\r\n<-0.39136,0.23819,ZP>,\r\n<-0.39221,0.25134,ZP>,\r\n<-0.39295,0.26438,0.66008>,\r\n<-0.39372,0.27759,0.66018>,\r\n<-0.39469,0.29116,0.66060>,\r\n<-0.39659,0.30542,0.65082>,\r\n<-0.39012,0.31304,0.64102>,\r\n<-0.38398,0.32037,0.63213>,\r\n<-0.37795,0.32741,0.62278>,\r\n<-0.37190,0.33421,0.61297>,\r\n<-0.36647,0.34126,0.60274>,\r\n<-0.36119,0.34831,0.59267>,\r\n<-0.35580,0.35520,0.58257>,\r\n<-0.35008,0.36152,0.57233>,\r\n<-0.34356,0.36707,0.56204>,\r\n<-0.33640,0.37158,0.55183>,\r\n<-0.32876,0.37513,0.54149>,\r\n<-0.32094,0.37842,0.53133>,\r\n<-0.31336,0.38235,0.52131>,\r\n<-0.30643,0.38749,0.51124>,\r\n<-0.30062,0.39391,0.50132>,\r\n<-0.29621,0.40131,0.49161>,\r\n<-0.29338,0.40945,0.48199>,\r\n<-0.29114,0.41787,0.47259>,\r\n<-0.28754,0.42594,0.46326>,\r\n<-0.28239,0.43329,0.45431>,\r\n<-0.27624,0.44000,0.44521>\r\n<-0.26447,-0.44277,0.45329>,\r\n<-0.27239,-0.43878,0.46270>,\r\n<-0.27955,-0.43341,0.47180>,\r\n<-0.28533,-0.42658,0.48109>,\r\n<-0.28968,-0.41892,0.49055>,\r\n<-0.29267,-0.41081,0.50030>,\r\n<-0.29579,-0.40287,0.51004>,\r\n<-0.30044,-0.39555,0.52008>,\r\n<-0.30646,-0.38929,0.53023>,\r\n<-0.31337,-0.38432,0.54046>,\r\n<-0.32080,-0.38022,0.55075>,\r\n<-0.32831,-0.37638,0.56101>,\r\n<-0.33551,-0.37206,0.57141>,\r\n<-0.34217,-0.36698,0.58192>,\r\n<-0.34832,-0.36119,0.59231>,\r\n<-0.35423,-0.35479,0.60265>,\r\n<-0.35979,-0.34814,0.61297>,\r\n<-0.36547,-0.34126,0.62331>,\r\n<-0.37168,-0.33455,0.63301>,\r\n<-0.37506,-0.32554,0.64251>,\r\n<-0.38437,-0.32002,0.65340>,\r\n<-0.38162,-0.30489,0.66049>,\r\n<-0.38082,-0.29145,0.66016>,\r\n<-0.38018,-0.27814,0.66008>,\r\n<-0.37951,-0.26494,ZP>,\r\n<-0.37877,-0.25169,ZP>,\r\n<-0.37802,-0.23842,ZP>,\r\n<-0.37738,-0.22527,ZP>,\r\n<-0.37675,-0.21215,ZP>,\r\n<-0.37617,-0.19906,ZP>,\r\n<-0.37566,-0.18602,ZP>,\r\n<-0.37520,-0.17304,ZP>,\r\n<-0.37480,-0.16010,ZP>,\r\n<-0.37446,-0.14719,ZP>,\r\n<-0.37416,-0.13432,ZP>,\r\n<-0.37391,-0.12147,ZP>,\r\n<-0.37370,-0.10864,ZP>,\r\n<-0.37352,-0.09583,ZP>,\r\n<-0.37338,-0.08303,ZP>,\r\n<-0.37326,-0.07025,ZP>,\r\n<-0.37317,-0.05747,ZP>,\r\n<-0.37311,-0.04471,ZP>,\r\n<-0.37307,-0.03196,ZP>,\r\n<-0.37305,-0.01921,ZP>,\r\n<-0.37305,-0.00647,ZP>,\r\n<-0.37306,0.00626,ZP>,\r\n<-0.37310,0.01899,ZP>,\r\n<-0.37315,0.03172,ZP>,\r\n<-0.37322,0.04445,ZP>,\r\n<-0.37332,0.05719,ZP>,\r\n<-0.37343,0.06994,ZP>,\r\n<-0.37356,0.08270,ZP>,\r\n<-0.37372,0.09547,ZP>,\r\n<-0.37390,0.10826,ZP>,\r\n<-0.37411,0.12107,ZP>,\r\n<-0.37435,0.13390,ZP>,\r\n<-0.37461,0.14675,ZP>,\r\n<-0.37491,0.15964,ZP>,\r\n<-0.37526,0.17257,ZP>,\r\n<-0.37567,0.18556,ZP>,\r\n<-0.37617,0.19861,ZP>,\r\n<-0.37674,0.21171,ZP>,\r\n<-0.37738,0.22483,ZP>,\r\n<-0.37805,0.23796,ZP>,\r\n<-0.37884,0.25117,ZP>,\r\n<-0.37965,0.26437,ZP>,\r\n<-0.38038,0.27751,0.66008>,\r\n<-0.38110,0.29075,0.66016>,\r\n<-0.38194,0.30411,0.66049>,\r\n<-0.38486,0.31927,0.65377>,\r\n<-0.37518,0.32507,0.64232>,\r\n<-0.37233,0.33383,0.63332>,\r\n<-0.36614,0.34054,0.62368>,\r\n<-0.36045,0.34747,0.61338>,\r\n<-0.35492,0.35422,0.60306>,\r\n<-0.34911,0.36057,0.59282>,\r\n<-0.34287,0.36638,0.58239>,\r\n<-0.33598,0.37138,0.57199>,\r\n<-0.32868,0.37555,0.56162>,\r\n<-0.32106,0.37932,0.55117>,\r\n<-0.31366,0.38340,0.54093>,\r\n<-0.30682,0.38845,0.53073>,\r\n<-0.30101,0.39468,0.52054>,\r\n<-0.29655,0.40191,0.51051>,\r\n<-0.29359,0.40989,0.50070>,\r\n<-0.29102,0.41811,0.49107>,\r\n<-0.28715,0.42597,0.48164>,\r\n<-0.28183,0.43310,0.47222>,\r\n<-0.27511,0.43886,0.46311>,\r\n<-0.26748,0.44338,0.45376>\r\n<-0.25475,-0.44219,0.46150>,\r\n<-0.26312,-0.44078,0.47113>,\r\n<-0.27127,-0.43776,0.48053>,\r\n<-0.27857,-0.43289,0.49009>,\r\n<-0.28464,-0.42640,0.49960>,\r\n<-0.28925,-0.41900,0.50930>,\r\n<-0.29263,-0.41111,0.51909>,\r\n<-0.29609,-0.40327,0.52922>,\r\n<-0.30090,-0.39627,0.53947>,\r\n<-0.30688,-0.39038,0.54982>,\r\n<-0.31376,-0.38550,0.56031>,\r\n<-0.32100,-0.38117,0.57078>,\r\n<-0.32817,-0.37678,0.58134>,\r\n<-0.33494,-0.37194,0.59188>,\r\n<-0.34137,-0.36655,0.60232>,\r\n<-0.34753,-0.36053,0.61300>,\r\n<-0.35320,-0.35393,0.62351>,\r\n<-0.35948,-0.34762,0.63352>,\r\n<-0.36594,-0.34104,0.64339>,\r\n<-0.37170,-0.33326,0.65556>,\r\n<-0.36879,-0.31779,0.66039>,\r\n<-0.36810,-0.30431,0.66012>,\r\n<-0.36759,-0.29118,0.66008>,\r\n<-0.36690,-0.27787,ZP>,\r\n<-0.36612,-0.26452,ZP>,\r\n<-0.36549,-0.25131,ZP>,\r\n<-0.36488,-0.23816,ZP>,\r\n<-0.36428,-0.22504,ZP>,\r\n<-0.36370,-0.21194,ZP>,\r\n<-0.36317,-0.19888,ZP>,\r\n<-0.36269,-0.18587,ZP>,\r\n<-0.36227,-0.17290,ZP>,\r\n<-0.36189,-0.15996,ZP>,\r\n<-0.36156,-0.14706,ZP>,\r\n<-0.36128,-0.13418,ZP>,\r\n<-0.36104,-0.12134,ZP>,\r\n<-0.36085,-0.10851,ZP>,\r\n<-0.36068,-0.09571,ZP>,\r\n<-0.36055,-0.08292,ZP>,\r\n<-0.36044,-0.07015,ZP>,\r\n<-0.36036,-0.05739,ZP>,\r\n<-0.36029,-0.04464,ZP>,\r\n<-0.36025,-0.03190,ZP>,\r\n<-0.36023,-0.01917,ZP>,\r\n<-0.36022,-0.00644,ZP>,\r\n<-0.36024,0.00628,ZP>,\r\n<-0.36027,0.01900,ZP>,\r\n<-0.36031,0.03172,ZP>,\r\n<-0.36038,0.04445,ZP>,\r\n<-0.36046,0.05718,ZP>,\r\n<-0.36057,0.06992,ZP>,\r\n<-0.36069,0.08267,ZP>,\r\n<-0.36084,0.09543,ZP>,\r\n<-0.36101,0.10821,ZP>,\r\n<-0.36120,0.12102,ZP>,\r\n<-0.36143,0.13384,ZP>,\r\n<-0.36168,0.14669,ZP>,\r\n<-0.36198,0.15958,ZP>,\r\n<-0.36232,0.17251,ZP>,\r\n<-0.36272,0.18549,ZP>,\r\n<-0.36318,0.19851,ZP>,\r\n<-0.36370,0.21157,ZP>,\r\n<-0.36428,0.22466,ZP>,\r\n<-0.36489,0.23776,ZP>,\r\n<-0.36553,0.25088,ZP>,\r\n<-0.36620,0.26403,ZP>,\r\n<-0.36703,0.27731,ZP>,\r\n<-0.36780,0.29054,0.66008>,\r\n<-0.36838,0.30358,0.66013>,\r\n<-0.36911,0.31692,0.66038>,\r\n<-0.37208,0.33229,0.65615>,\r\n<-0.36663,0.34030,0.64383>,\r\n<-0.36019,0.34688,0.63398>,\r\n<-0.35396,0.35317,0.62403>,\r\n<-0.34824,0.35982,0.61341>,\r\n<-0.34213,0.36583,0.60290>,\r\n<-0.33554,0.37127,0.59238>,\r\n<-0.32865,0.37604,0.58178>,\r\n<-0.32148,0.38035,0.57128>,\r\n<-0.31414,0.38469,0.56080>,\r\n<-0.30724,0.38966,0.55035>,\r\n<-0.30140,0.39561,0.54000>,\r\n<-0.29677,0.40258,0.52973>,\r\n<-0.29353,0.41034,0.51967>,\r\n<-0.29049,0.41828,0.50982>,\r\n<-0.28629,0.42585,0.50014>,\r\n<-0.28071,0.43266,0.49055>,\r\n<-0.27380,0.43804,0.48092>,\r\n<-0.26594,0.44150,0.47152>,\r\n<-0.25768,0.44339,0.46189>\r\n<-0.24546,-0.43859,0.46927>,\r\n<-0.25343,-0.43953,0.47904>,\r\n<-0.26171,-0.43882,0.48892>,\r\n<-0.26979,-0.43655,0.49880>,\r\n<-0.27740,-0.43222,0.50855>,\r\n<-0.28361,-0.42612,0.51833>,\r\n<-0.28844,-0.41900,0.52827>,\r\n<-0.29226,-0.41135,0.53843>,\r\n<-0.29615,-0.40386,0.54873>,\r\n<-0.30124,-0.39718,0.55914>,\r\n<-0.30748,-0.39154,0.56975>,\r\n<-0.31424,-0.38668,0.58039>,\r\n<-0.32104,-0.38207,0.59103>,\r\n<-0.32788,-0.37750,0.60183>,\r\n<-0.33419,-0.37191,0.61252>,\r\n<-0.34051,-0.36617,0.62326>,\r\n<-0.34685,-0.36022,0.63350>,\r\n<-0.35332,-0.35410,0.64365>,\r\n<-0.35872,-0.34639,0.65641>,\r\n<-0.35595,-0.33081,0.66034>,\r\n<-0.35529,-0.31730,0.66010>,\r\n<-0.35478,-0.30396,ZP>,\r\n<-0.35426,-0.29075,ZP>,\r\n<-0.35349,-0.27735,ZP>,\r\n<-0.35290,-0.26415,ZP>,\r\n<-0.35231,-0.25097,ZP>,\r\n<-0.35174,-0.23785,ZP>,\r\n<-0.35119,-0.22476,ZP>,\r\n<-0.35068,-0.21170,ZP>,\r\n<-0.35020,-0.19868,ZP>,\r\n<-0.34975,-0.18569,ZP>,\r\n<-0.34935,-0.17273,ZP>,\r\n<-0.34900,-0.15980,ZP>,\r\n<-0.34869,-0.14691,ZP>,\r\n<-0.34843,-0.13404,ZP>,\r\n<-0.34821,-0.12121,ZP>,\r\n<-0.34802,-0.10839,ZP>,\r\n<-0.34786,-0.09560,ZP>,\r\n<-0.34774,-0.08282,ZP>,\r\n<-0.34763,-0.07006,ZP>,\r\n<-0.34755,-0.05731,ZP>,\r\n<-0.34749,-0.04458,ZP>,\r\n<-0.34745,-0.03185,ZP>,\r\n<-0.34743,-0.01913,ZP>,\r\n<-0.34742,-0.00642,ZP>,\r\n<-0.34743,0.00629,ZP>,\r\n<-0.34745,0.01900,ZP>,\r\n<-0.34749,0.03172,ZP>,\r\n<-0.34755,0.04443,ZP>,\r\n<-0.34763,0.05715,ZP>,\r\n<-0.34773,0.06988,ZP>,\r\n<-0.34784,0.08263,ZP>,\r\n<-0.34798,0.09538,ZP>,\r\n<-0.34814,0.10816,ZP>,\r\n<-0.34833,0.12095,ZP>,\r\n<-0.34854,0.13377,ZP>,\r\n<-0.34879,0.14661,ZP>,\r\n<-0.34907,0.15950,ZP>,\r\n<-0.34940,0.17241,ZP>,\r\n<-0.34978,0.18537,ZP>,\r\n<-0.35021,0.19836,ZP>,\r\n<-0.35068,0.21138,ZP>,\r\n<-0.35119,0.22443,ZP>,\r\n<-0.35173,0.23750,ZP>,\r\n<-0.35231,0.25059,ZP>,\r\n<-0.35292,0.26371,ZP>,\r\n<-0.35355,0.27684,ZP>,\r\n<-0.35436,0.29015,ZP>,\r\n<-0.35494,0.30325,ZP>,\r\n<-0.35551,0.31648,0.66010>,\r\n<-0.35623,0.32985,0.66032>,\r\n<-0.35900,0.34528,0.65713>,\r\n<-0.35407,0.35337,0.64421>,\r\n<-0.34765,0.35945,0.63409>,\r\n<-0.34132,0.36541,0.62386>,\r\n<-0.33501,0.37118,0.61310>,\r\n<-0.32870,0.37679,0.60234>,\r\n<-0.32172,0.38127,0.59156>,\r\n<-0.31472,0.38597,0.58074>,\r\n<-0.30792,0.39083,0.57015>,\r\n<-0.30175,0.39654,0.55959>,\r\n<-0.29683,0.40322,0.54924>,\r\n<-0.29308,0.41073,0.53886>,\r\n<-0.28949,0.41840,0.52881>,\r\n<-0.28501,0.42562,0.51884>,\r\n<-0.27927,0.43203,0.50894>,\r\n<-0.27219,0.43689,0.49912>,\r\n<-0.26426,0.43975,0.48927>,\r\n<-0.25612,0.44082,0.47947>,\r\n<-0.24807,0.44025,0.46958>\r\n<-0.23696,-0.43304,0.47686>,\r\n<-0.24435,-0.43550,0.48667>,\r\n<-0.25217,-0.43712,0.49696>,\r\n<-0.26010,-0.43704,0.50701>,\r\n<-0.26840,-0.43519,0.51706>,\r\n<-0.27594,-0.43131,0.52711>,\r\n<-0.28224,-0.42558,0.53730>,\r\n<-0.28727,-0.41870,0.54755>,\r\n<-0.29153,-0.41136,0.55785>,\r\n<-0.29601,-0.40429,0.56828>,\r\n<-0.30145,-0.39816,0.57902>,\r\n<-0.30761,-0.39283,0.58987>,\r\n<-0.31463,-0.38863,0.60070>,\r\n<-0.32100,-0.38337,0.61156>,\r\n<-0.32740,-0.37795,0.62244>,\r\n<-0.33380,-0.37236,0.63295>,\r\n<-0.34028,-0.36664,0.64335>,\r\n<-0.34569,-0.35943,0.65638>,\r\n<-0.34318,-0.34378,0.66034>,\r\n<-0.34266,-0.33030,0.66011>,\r\n<-0.34218,-0.31701,ZP>,\r\n<-0.34154,-0.30361,ZP>,\r\n<-0.34081,-0.29016,ZP>,\r\n<-0.34025,-0.27693,ZP>,\r\n<-0.33969,-0.26375,ZP>,\r\n<-0.33914,-0.25060,ZP>,\r\n<-0.33862,-0.23751,ZP>,\r\n<-0.33813,-0.22445,ZP>,\r\n<-0.33767,-0.21143,ZP>,\r\n<-0.33723,-0.19844,ZP>,\r\n<-0.33683,-0.18548,ZP>,\r\n<-0.33646,-0.17254,ZP>,\r\n<-0.33613,-0.15963,ZP>,\r\n<-0.33585,-0.14676,ZP>,\r\n<-0.33560,-0.13390,ZP>,\r\n<-0.33539,-0.12108,ZP>,\r\n<-0.33521,-0.10827,ZP>,\r\n<-0.33506,-0.09549,ZP>,\r\n<-0.33494,-0.08273,ZP>,\r\n<-0.33484,-0.06998,ZP>,\r\n<-0.33477,-0.05724,ZP>,\r\n<-0.33471,-0.04452,ZP>,\r\n<-0.33467,-0.03181,ZP>,\r\n<-0.33464,-0.01910,ZP>,\r\n<-0.33463,-0.00640,ZP>,\r\n<-0.33464,0.00630,ZP>,\r\n<-0.33466,0.01900,ZP>,\r\n<-0.33470,0.03171,ZP>,\r\n<-0.33475,0.04441,ZP>,\r\n<-0.33482,0.05712,ZP>,\r\n<-0.33491,0.06985,ZP>,\r\n<-0.33502,0.08258,ZP>,\r\n<-0.33515,0.09533,ZP>,\r\n<-0.33530,0.10809,ZP>,\r\n<-0.33548,0.12088,ZP>,\r\n<-0.33568,0.13368,ZP>,\r\n<-0.33592,0.14652,ZP>,\r\n<-0.33619,0.15939,ZP>,\r\n<-0.33650,0.17229,ZP>,\r\n<-0.33685,0.18522,ZP>,\r\n<-0.33724,0.19817,ZP>,\r\n<-0.33767,0.21116,ZP>,\r\n<-0.33812,0.22416,ZP>,\r\n<-0.33860,0.23719,ZP>,\r\n<-0.33912,0.25025,ZP>,\r\n<-0.33967,0.26335,ZP>,\r\n<-0.34025,0.27646,ZP>,\r\n<-0.34084,0.28961,ZP>,\r\n<-0.34163,0.30296,ZP>,\r\n<-0.34233,0.31625,ZP>,\r\n<-0.34288,0.32943,0.66011>,\r\n<-0.34346,0.34277,0.66031>,\r\n<-0.34596,0.35822,0.65724>,\r\n<-0.34112,0.36588,0.64404>,\r\n<-0.33472,0.37153,0.63360>,\r\n<-0.32835,0.37713,0.62290>,\r\n<-0.32189,0.38263,0.61188>,\r\n<-0.31548,0.38794,0.60098>,\r\n<-0.30819,0.39211,0.59025>,\r\n<-0.30194,0.39754,0.57949>,\r\n<-0.29657,0.40376,0.56880>,\r\n<-0.29226,0.41084,0.55831>,\r\n<-0.28812,0.41823,0.54789>,\r\n<-0.28330,0.42519,0.53771>,\r\n<-0.27736,0.43114,0.52757>,\r\n<-0.27017,0.43548,0.51739>,\r\n<-0.26234,0.43786,0.50728>,\r\n<-0.25439,0.43839,0.49719>,\r\n<-0.24666,0.43735,0.48723>,\r\n<-0.23936,0.43482,0.47700>\r\n<-0.22746,-0.43075,0.48474>,\r\n<-0.23544,-0.43110,0.49424>,\r\n<-0.24337,-0.43221,0.50462>,\r\n<-0.25062,-0.43489,0.51479>,\r\n<-0.25865,-0.43536,0.52516>,\r\n<-0.26652,-0.43382,0.53552>,\r\n<-0.27397,-0.43018,0.54604>,\r\n<-0.28035,-0.42473,0.55650>,\r\n<-0.28561,-0.41813,0.56691>,\r\n<-0.29031,-0.41124,0.57735>,\r\n<-0.29532,-0.40479,0.58816>,\r\n<-0.30098,-0.39910,0.59912>,\r\n<-0.30744,-0.39433,0.61008>,\r\n<-0.31387,-0.38926,0.62108>,\r\n<-0.32035,-0.38399,0.63181>,\r\n<-0.32412,-0.37573,0.64215>,\r\n<-0.33258,-0.37236,0.65551>,\r\n<-0.33019,-0.35654,0.66035>,\r\n<-0.32978,-0.34317,0.66011>,\r\n<-0.32940,-0.32986,ZP>,\r\n<-0.32883,-0.31645,ZP>,\r\n<-0.32813,-0.30298,ZP>,\r\n<-0.32758,-0.28971,ZP>,\r\n<-0.32704,-0.27649,ZP>,\r\n<-0.32652,-0.26333,ZP>,\r\n<-0.32602,-0.25022,ZP>,\r\n<-0.32555,-0.23716,ZP>,\r\n<-0.32510,-0.22414,ZP>,\r\n<-0.32468,-0.21115,ZP>,\r\n<-0.32428,-0.19819,ZP>,\r\n<-0.32392,-0.18525,ZP>,\r\n<-0.32358,-0.17234,ZP>,\r\n<-0.32328,-0.15946,ZP>,\r\n<-0.32302,-0.14660,ZP>,\r\n<-0.32279,-0.13376,ZP>,\r\n<-0.32259,-0.12095,ZP>,\r\n<-0.32242,-0.10816,ZP>,\r\n<-0.32228,-0.09539,ZP>,\r\n<-0.32216,-0.08264,ZP>,\r\n<-0.32207,-0.06990,ZP>,\r\n<-0.32200,-0.05718,ZP>,\r\n<-0.32194,-0.04447,ZP>,\r\n<-0.32190,-0.03177,ZP>,\r\n<-0.32187,-0.01907,ZP>,\r\n<-0.32186,-0.00638,ZP>,\r\n<-0.32187,0.00631,ZP>,\r\n<-0.32189,0.01900,ZP>,\r\n<-0.32192,0.03169,ZP>,\r\n<-0.32197,0.04439,ZP>,\r\n<-0.32204,0.05709,ZP>,\r\n<-0.32212,0.06980,ZP>,\r\n<-0.32222,0.08253,ZP>,\r\n<-0.32234,0.09526,ZP>,\r\n<-0.32249,0.10802,ZP>,\r\n<-0.32265,0.12079,ZP>,\r\n<-0.32285,0.13359,ZP>,\r\n<-0.32307,0.14641,ZP>,\r\n<-0.32333,0.15926,ZP>,\r\n<-0.32362,0.17213,ZP>,\r\n<-0.32394,0.18504,ZP>,\r\n<-0.32429,0.19796,ZP>,\r\n<-0.32467,0.21091,ZP>,\r\n<-0.32508,0.22388,ZP>,\r\n<-0.32551,0.23688,ZP>,\r\n<-0.32597,0.24990,ZP>,\r\n<-0.32647,0.26297,ZP>,\r\n<-0.32700,0.27607,ZP>,\r\n<-0.32756,0.28922,ZP>,\r\n<-0.32815,0.30240,ZP>,\r\n<-0.32890,0.31577,ZP>,\r\n<-0.32954,0.32906,ZP>,\r\n<-0.32997,0.34226,0.66010>,\r\n<-0.33042,0.35548,0.66032>,\r\n<-0.33287,0.37120,0.65654>,\r\n<-0.32521,0.37512,0.64236>,\r\n<-0.32132,0.38319,0.63231>,\r\n<-0.31471,0.38858,0.62140>,\r\n<-0.30826,0.39369,0.61041>,\r\n<-0.30161,0.39838,0.59930>,\r\n<-0.29592,0.40423,0.58872>,\r\n<-0.29100,0.41072,0.57789>,\r\n<-0.28642,0.41766,0.56726>,\r\n<-0.28132,0.42433,0.55680>,\r\n<-0.27525,0.42996,0.54640>,\r\n<-0.26814,0.43395,0.53594>,\r\n<-0.26036,0.43601,0.52540>,\r\n<-0.25259,0.43622,0.51514>,\r\n<-0.24529,0.43403,0.50495>,\r\n<-0.23792,0.43213,0.49476>,\r\n<-0.23018,0.43121,0.48473>\r\n<-0.21762,-0.43293,0.49253>,\r\n<-0.22556,-0.43124,0.50214>,\r\n<-0.23374,-0.43032,0.51237>,\r\n<-0.24134,-0.43085,0.52240>,\r\n<-0.24906,-0.43278,0.53306>,\r\n<-0.25668,-0.43385,0.54360>,\r\n<-0.26451,-0.43234,0.55437>,\r\n<-0.27173,-0.42879,0.56503>,\r\n<-0.27807,-0.42353,0.57575>,\r\n<-0.28343,-0.41732,0.58641>,\r\n<-0.28859,-0.41102,0.59722>,\r\n<-0.29409,-0.40530,0.60814>,\r\n<-0.29999,-0.40003,0.61944>,\r\n<-0.30647,-0.39515,0.63026>,\r\n<-0.31301,-0.39012,0.64095>,\r\n<-0.31936,-0.38496,0.65332>,\r\n<-0.31718,-0.36933,0.66040>,\r\n<-0.31676,-0.35577,0.66010>,\r\n<-0.31654,-0.34262,ZP>,\r\n<-0.31606,-0.32921,ZP>,\r\n<-0.31544,-0.31577,ZP>,\r\n<-0.31493,-0.30250,ZP>,\r\n<-0.31440,-0.28926,ZP>,\r\n<-0.31388,-0.27606,ZP>,\r\n<-0.31339,-0.26293,ZP>,\r\n<-0.31294,-0.24985,ZP>,\r\n<-0.31251,-0.23682,ZP>,\r\n<-0.31210,-0.22383,ZP>,\r\n<-0.31172,-0.21087,ZP>,\r\n<-0.31136,-0.19793,ZP>,\r\n<-0.31103,-0.18503,ZP>,\r\n<-0.31072,-0.17214,ZP>,\r\n<-0.31045,-0.15928,ZP>,\r\n<-0.31021,-0.14644,ZP>,\r\n<-0.30999,-0.13362,ZP>,\r\n<-0.30981,-0.12082,ZP>,\r\n<-0.30965,-0.10805,ZP>,\r\n<-0.30951,-0.09529,ZP>,\r\n<-0.30940,-0.08256,ZP>,\r\n<-0.30931,-0.06983,ZP>,\r\n<-0.30924,-0.05712,ZP>,\r\n<-0.30919,-0.04442,ZP>,\r\n<-0.30915,-0.03173,ZP>,\r\n<-0.30912,-0.01905,ZP>,\r\n<-0.30911,-0.00637,ZP>,\r\n<-0.30912,0.00631,ZP>,\r\n<-0.30913,0.01899,ZP>,\r\n<-0.30916,0.03167,ZP>,\r\n<-0.30921,0.04436,ZP>,\r\n<-0.30927,0.05706,ZP>,\r\n<-0.30935,0.06976,ZP>,\r\n<-0.30944,0.08247,ZP>,\r\n<-0.30956,0.09520,ZP>,\r\n<-0.30969,0.10794,ZP>,\r\n<-0.30985,0.12070,ZP>,\r\n<-0.31003,0.13348,ZP>,\r\n<-0.31024,0.14629,ZP>,\r\n<-0.31048,0.15912,ZP>,\r\n<-0.31075,0.17197,ZP>,\r\n<-0.31104,0.18484,ZP>,\r\n<-0.31136,0.19773,ZP>,\r\n<-0.31170,0.21065,ZP>,\r\n<-0.31207,0.22359,ZP>,\r\n<-0.31246,0.23656,ZP>,\r\n<-0.31288,0.24956,ZP>,\r\n<-0.31333,0.26259,ZP>,\r\n<-0.31382,0.27568,ZP>,\r\n<-0.31435,0.28882,ZP>,\r\n<-0.31491,0.30198,ZP>,\r\n<-0.31546,0.31517,ZP>,\r\n<-0.31612,0.32849,ZP>,\r\n<-0.31666,0.34179,ZP>,\r\n<-0.31694,0.35483,0.66010>,\r\n<-0.31744,0.36832,0.66038>,\r\n<-0.31995,0.38408,0.65421>,\r\n<-0.31424,0.38921,0.64029>,\r\n<-0.30735,0.39447,0.63069>,\r\n<-0.30084,0.39940,0.61983>,\r\n<-0.29485,0.40469,0.60863>,\r\n<-0.28933,0.41052,0.59773>,\r\n<-0.28430,0.41681,0.58686>,\r\n<-0.27909,0.42311,0.57604>,\r\n<-0.27301,0.42853,0.56532>,\r\n<-0.26602,0.43240,0.55466>,\r\n<-0.25841,0.43442,0.54401>,\r\n<-0.25075,0.43432,0.53334>,\r\n<-0.24339,0.43217,0.52278>,\r\n<-0.23586,0.43087,0.51248>,\r\n<-0.22802,0.43085,0.50267>,\r\n<-0.22010,0.43168,0.49251>\r\n<-0.21001,-0.44028,0.49977>,\r\n<-0.21646,-0.43604,0.50977>,\r\n<-0.22380,-0.43279,0.52012>,\r\n<-0.23135,-0.43107,0.53039>,\r\n<-0.23945,-0.43073,0.54104>,\r\n<-0.24711,-0.43164,0.55148>,\r\n<-0.25484,-0.43253,0.56231>,\r\n<-0.26226,-0.43098,0.57317>,\r\n<-0.26925,-0.42727,0.58417>,\r\n<-0.27530,-0.42220,0.59514>,\r\n<-0.28099,-0.41660,0.60607>,\r\n<-0.28626,-0.41076,0.61728>,\r\n<-0.29229,-0.40572,0.62843>,\r\n<-0.29876,-0.40108,0.63920>,\r\n<-0.30539,-0.39661,0.65050>,\r\n<-0.30427,-0.38213,0.66050>,\r\n<-0.30375,-0.36855,0.66012>,\r\n<-0.30347,-0.35517,ZP>,\r\n<-0.30319,-0.34191,ZP>,\r\n<-0.30264,-0.32845,ZP>,\r\n<-0.30220,-0.31521,ZP>,\r\n<-0.30173,-0.30198,ZP>,\r\n<-0.30124,-0.28878,ZP>,\r\n<-0.30077,-0.27564,ZP>,\r\n<-0.30032,-0.26254,ZP>,\r\n<-0.29990,-0.24949,ZP>,\r\n<-0.29950,-0.23649,ZP>,\r\n<-0.29913,-0.22352,ZP>,\r\n<-0.29878,-0.21059,ZP>,\r\n<-0.29846,-0.19768,ZP>,\r\n<-0.29816,-0.18480,ZP>,\r\n<-0.29788,-0.17194,ZP>,\r\n<-0.29763,-0.15910,ZP>,\r\n<-0.29741,-0.14628,ZP>,\r\n<-0.29721,-0.13348,ZP>,\r\n<-0.29704,-0.12070,ZP>,\r\n<-0.29689,-0.10794,ZP>,\r\n<-0.29676,-0.09520,ZP>,\r\n<-0.29666,-0.08248,ZP>,\r\n<-0.29657,-0.06977,ZP>,\r\n<-0.29650,-0.05707,ZP>,\r\n<-0.29645,-0.04438,ZP>,\r\n<-0.29641,-0.03170,ZP>,\r\n<-0.29639,-0.01903,ZP>,\r\n<-0.29638,-0.00636,ZP>,\r\n<-0.29638,0.00631,ZP>,\r\n<-0.29640,0.01898,ZP>,\r\n<-0.29642,0.03166,ZP>,\r\n<-0.29647,0.04433,ZP>,\r\n<-0.29652,0.05702,ZP>,\r\n<-0.29660,0.06971,ZP>,\r\n<-0.29668,0.08241,ZP>,\r\n<-0.29679,0.09513,ZP>,\r\n<-0.29692,0.10786,ZP>,\r\n<-0.29707,0.12061,ZP>,\r\n<-0.29724,0.13337,ZP>,\r\n<-0.29743,0.14616,ZP>,\r\n<-0.29765,0.15896,ZP>,\r\n<-0.29789,0.17179,ZP>,\r\n<-0.29816,0.18464,ZP>,\r\n<-0.29844,0.19750,ZP>,\r\n<-0.29876,0.21039,ZP>,\r\n<-0.29909,0.22330,ZP>,\r\n<-0.29944,0.23625,ZP>,\r\n<-0.29983,0.24922,ZP>,\r\n<-0.30025,0.26223,ZP>,\r\n<-0.30069,0.27529,ZP>,\r\n<-0.30117,0.28838,ZP>,\r\n<-0.30168,0.30151,ZP>,\r\n<-0.30218,0.31467,ZP>,\r\n<-0.30264,0.32782,ZP>,\r\n<-0.30324,0.34117,ZP>,\r\n<-0.30359,0.35438,ZP>,\r\n<-0.30404,0.36775,0.66013>,\r\n<-0.30471,0.38121,0.66049>,\r\n<-0.30628,0.39590,0.65106>,\r\n<-0.29970,0.40039,0.63965>,\r\n<-0.29316,0.40509,0.62885>,\r\n<-0.28711,0.41017,0.61768>,\r\n<-0.28190,0.41616,0.60645>,\r\n<-0.27633,0.42183,0.59547>,\r\n<-0.27037,0.42706,0.58449>,\r\n<-0.26370,0.43096,0.57356>,\r\n<-0.25638,0.43309,0.56269>,\r\n<-0.24884,0.43299,0.55187>,\r\n<-0.24125,0.43165,0.54119>,\r\n<-0.23361,0.43129,0.53080>,\r\n<-0.22578,0.43201,0.52045>,\r\n<-0.21821,0.43392,0.51025>,\r\n<-0.21125,0.43717,0.49986>\r\n<-0.20638,-0.45062,0.50626>,\r\n<-0.21059,-0.44502,0.51674>,\r\n<-0.21590,-0.43994,0.52739>,\r\n<-0.22224,-0.43578,0.53789>,\r\n<-0.22971,-0.43286,0.54872>,\r\n<-0.23737,-0.43173,0.55938>,\r\n<-0.24519,-0.43194,0.57031>,\r\n<-0.25269,-0.43198,0.58118>,\r\n<-0.25998,-0.42983,0.59238>,\r\n<-0.26652,-0.42603,0.60351>,\r\n<-0.27256,-0.42142,0.61477>,\r\n<-0.27787,-0.41569,0.62603>,\r\n<-0.28429,-0.41140,0.63701>,\r\n<-0.29080,-0.40722,0.64818>,\r\n<-0.29145,-0.39493,0.66059>,\r\n<-0.29092,-0.38127,0.66016>,\r\n<-0.29069,-0.36800,0.66008>,\r\n<-0.29033,-0.35462,ZP>,\r\n<-0.28979,-0.34112,ZP>,\r\n<-0.28941,-0.32786,ZP>,\r\n<-0.28900,-0.31465,ZP>,\r\n<-0.28856,-0.30146,ZP>,\r\n<-0.28813,-0.28832,ZP>,\r\n<-0.28770,-0.27522,ZP>,\r\n<-0.28729,-0.26217,ZP>,\r\n<-0.28690,-0.24915,ZP>,\r\n<-0.28654,-0.23617,ZP>,\r\n<-0.28619,-0.22323,ZP>,\r\n<-0.28587,-0.21032,ZP>,\r\n<-0.28558,-0.19743,ZP>,\r\n<-0.28531,-0.18457,ZP>,\r\n<-0.28506,-0.17174,ZP>,\r\n<-0.28483,-0.15892,ZP>,\r\n<-0.28462,-0.14612,ZP>,\r\n<-0.28444,-0.13334,ZP>,\r\n<-0.28428,-0.12058,ZP>,\r\n<-0.28414,-0.10784,ZP>,\r\n<-0.28403,-0.09511,ZP>,\r\n<-0.28393,-0.08240,ZP>,\r\n<-0.28385,-0.06970,ZP>,\r\n<-0.28378,-0.05702,ZP>,\r\n<-0.28373,-0.04434,ZP>,\r\n<-0.28369,-0.03167,ZP>,\r\n<-0.28367,-0.01901,ZP>,\r\n<-0.28366,-0.00635,ZP>,\r\n<-0.28366,0.00631,ZP>,\r\n<-0.28368,0.01897,ZP>,\r\n<-0.28370,0.03164,ZP>,\r\n<-0.28374,0.04430,ZP>,\r\n<-0.28379,0.05698,ZP>,\r\n<-0.28386,0.06966,ZP>,\r\n<-0.28394,0.08235,ZP>,\r\n<-0.28404,0.09506,ZP>,\r\n<-0.28416,0.10777,ZP>,\r\n<-0.28430,0.12051,ZP>,\r\n<-0.28446,0.13326,ZP>,\r\n<-0.28463,0.14602,ZP>,\r\n<-0.28483,0.15881,ZP>,\r\n<-0.28505,0.17161,ZP>,\r\n<-0.28529,0.18443,ZP>,\r\n<-0.28556,0.19728,ZP>,\r\n<-0.28584,0.21014,ZP>,\r\n<-0.28614,0.22303,ZP>,\r\n<-0.28647,0.23595,ZP>,\r\n<-0.28683,0.24890,ZP>,\r\n<-0.28721,0.26188,ZP>,\r\n<-0.28762,0.27490,ZP>,\r\n<-0.28805,0.28796,ZP>,\r\n<-0.28849,0.30104,ZP>,\r\n<-0.28895,0.31416,ZP>,\r\n<-0.28938,0.32730,ZP>,\r\n<-0.28981,0.34050,ZP>,\r\n<-0.29042,0.35393,ZP>,\r\n<-0.29098,0.36733,0.66009>,\r\n<-0.29136,0.38053,0.66017>,\r\n<-0.29194,0.39394,0.66061>,\r\n<-0.29172,0.40659,0.64852>,\r\n<-0.28521,0.41077,0.63737>,\r\n<-0.27874,0.41510,0.62631>,\r\n<-0.27346,0.42101,0.61505>,\r\n<-0.26756,0.42576,0.60372>,\r\n<-0.26115,0.42977,0.59271>,\r\n<-0.25411,0.43229,0.58153>,\r\n<-0.24670,0.43265,0.57067>,\r\n<-0.23920,0.43222,0.55980>,\r\n<-0.23159,0.43264,0.54914>,\r\n<-0.22398,0.43417,0.53841>,\r\n<-0.21681,0.43728,0.52765>,\r\n<-0.21073,0.44153,0.51728>,\r\n<-0.20571,0.44654,0.50655>\r\n<-0.20649,-0.46182,0.51226>,\r\n<-0.20843,-0.45560,0.52312>,\r\n<-0.21150,-0.44961,0.53422>,\r\n<-0.21586,-0.44409,0.54499>,\r\n<-0.22156,-0.43946,0.55601>,\r\n<-0.22824,-0.43615,0.56710>,\r\n<-0.23576,-0.43433,0.57834>,\r\n<-0.24315,-0.43353,0.58911>,\r\n<-0.25074,-0.43260,0.60058>,\r\n<-0.25742,-0.42959,0.61170>,\r\n<-0.26326,-0.42511,0.62307>,\r\n<-0.26959,-0.42114,0.63432>,\r\n<-0.27594,-0.41723,0.64555>,\r\n<-0.27912,-0.40869,0.65949>,\r\n<-0.27782,-0.39385,0.66018>,\r\n<-0.27765,-0.38058,0.66008>,\r\n<-0.27744,-0.36726,ZP>,\r\n<-0.27697,-0.35381,ZP>,\r\n<-0.27660,-0.34053,ZP>,\r\n<-0.27622,-0.32729,ZP>,\r\n<-0.27583,-0.31410,ZP>,\r\n<-0.27544,-0.30097,ZP>,\r\n<-0.27506,-0.28788,ZP>,\r\n<-0.27467,-0.27482,ZP>,\r\n<-0.27430,-0.26180,ZP>,\r\n<-0.27394,-0.24882,ZP>,\r\n<-0.27360,-0.23587,ZP>,\r\n<-0.27329,-0.22295,ZP>,\r\n<-0.27299,-0.21006,ZP>,\r\n<-0.27272,-0.19720,ZP>,\r\n<-0.27247,-0.18436,ZP>,\r\n<-0.27225,-0.17155,ZP>,\r\n<-0.27204,-0.15875,ZP>,\r\n<-0.27185,-0.14597,ZP>,\r\n<-0.27169,-0.13321,ZP>,\r\n<-0.27154,-0.12047,ZP>,\r\n<-0.27141,-0.10774,ZP>,\r\n<-0.27130,-0.09503,ZP>,\r\n<-0.27121,-0.08233,ZP>,\r\n<-0.27113,-0.06965,ZP>,\r\n<-0.27107,-0.05697,ZP>,\r\n<-0.27102,-0.04430,ZP>,\r\n<-0.27099,-0.03164,ZP>,\r\n<-0.27097,-0.01899,ZP>,\r\n<-0.27096,-0.00634,ZP>,\r\n<-0.27096,0.00631,ZP>,\r\n<-0.27097,0.01896,ZP>,\r\n<-0.27100,0.03162,ZP>,\r\n<-0.27103,0.04428,ZP>,\r\n<-0.27108,0.05694,ZP>,\r\n<-0.27114,0.06961,ZP>,\r\n<-0.27122,0.08229,ZP>,\r\n<-0.27131,0.09498,ZP>,\r\n<-0.27142,0.10769,ZP>,\r\n<-0.27155,0.12041,ZP>,\r\n<-0.27169,0.13314,ZP>,\r\n<-0.27185,0.14589,ZP>,\r\n<-0.27204,0.15865,ZP>,\r\n<-0.27224,0.17143,ZP>,\r\n<-0.27245,0.18423,ZP>,\r\n<-0.27269,0.19705,ZP>,\r\n<-0.27295,0.20990,ZP>,\r\n<-0.27323,0.22276,ZP>,\r\n<-0.27353,0.23566,ZP>,\r\n<-0.27386,0.24858,ZP>,\r\n<-0.27421,0.26154,ZP>,\r\n<-0.27458,0.27453,ZP>,\r\n<-0.27497,0.28754,ZP>,\r\n<-0.27536,0.30059,ZP>,\r\n<-0.27577,0.31367,ZP>,\r\n<-0.27618,0.32680,ZP>,\r\n<-0.27661,0.33999,ZP>,\r\n<-0.27705,0.35324,ZP>,\r\n<-0.27762,0.36665,ZP>,\r\n<-0.27795,0.37993,0.66008>,\r\n<-0.27824,0.39312,0.66018>,\r\n<-0.27955,0.40774,0.65974>,\r\n<-0.27675,0.41671,0.64585>,\r\n<-0.27042,0.42060,0.63456>,\r\n<-0.26425,0.42470,0.62331>,\r\n<-0.25841,0.42930,0.61191>,\r\n<-0.25172,0.43207,0.60076>,\r\n<-0.24452,0.43366,0.58963>,\r\n<-0.23715,0.43425,0.57852>,\r\n<-0.22968,0.43521,0.56746>,\r\n<-0.22256,0.43749,0.55652>,\r\n<-0.21620,0.44125,0.54553>,\r\n<-0.21084,0.44622,0.53461>,\r\n<-0.20664,0.45162,0.52373>,\r\n<-0.20376,0.45753,0.51261>\r\n<-0.20368,-0.47191,0.51881>,\r\n<-0.20749,-0.46663,0.52958>,\r\n<-0.21101,-0.46066,0.54042>,\r\n<-0.21306,-0.45433,0.55151>,\r\n<-0.21586,-0.44857,0.56284>,\r\n<-0.22101,-0.44372,0.57434>,\r\n<-0.22740,-0.44016,0.58567>,\r\n<-0.23425,-0.43767,0.59660>,\r\n<-0.24230,-0.43742,0.60824>,\r\n<-0.24842,-0.43396,0.61997>,\r\n<-0.25463,-0.43034,0.63124>,\r\n<-0.26093,-0.42664,0.64236>,\r\n<-0.26631,-0.42184,0.65582>,\r\n<-0.26471,-0.40640,0.66024>,\r\n<-0.26458,-0.39310,0.66008>,\r\n<-0.26449,-0.37987,ZP>,\r\n<-0.26413,-0.36646,ZP>,\r\n<-0.26381,-0.35320,ZP>,\r\n<-0.26346,-0.33996,ZP>,\r\n<-0.26309,-0.32675,ZP>,\r\n<-0.26272,-0.31360,ZP>,\r\n<-0.26237,-0.30051,ZP>,\r\n<-0.26202,-0.28745,ZP>,\r\n<-0.26167,-0.27443,ZP>,\r\n<-0.26133,-0.26145,ZP>,\r\n<-0.26100,-0.24850,ZP>,\r\n<-0.26070,-0.23557,ZP>,\r\n<-0.26041,-0.22268,ZP>,\r\n<-0.26014,-0.20982,ZP>,\r\n<-0.25989,-0.19698,ZP>,\r\n<-0.25966,-0.18416,ZP>,\r\n<-0.25946,-0.17136,ZP>,\r\n<-0.25927,-0.15859,ZP>,\r\n<-0.25910,-0.14583,ZP>,\r\n<-0.25895,-0.13309,ZP>,\r\n<-0.25881,-0.12036,ZP>,\r\n<-0.25869,-0.10765,ZP>,\r\n<-0.25859,-0.09495,ZP>,\r\n<-0.25851,-0.08226,ZP>,\r\n<-0.25844,-0.06959,ZP>,\r\n<-0.25838,-0.05693,ZP>,\r\n<-0.25833,-0.04427,ZP>,\r\n<-0.25830,-0.03162,ZP>,\r\n<-0.25828,-0.01897,ZP>,\r\n<-0.25827,-0.00633,ZP>,\r\n<-0.25827,0.00631,ZP>,\r\n<-0.25828,0.01895,ZP>,\r\n<-0.25830,0.03160,ZP>,\r\n<-0.25834,0.04425,ZP>,\r\n<-0.25838,0.05690,ZP>,\r\n<-0.25844,0.06956,ZP>,\r\n<-0.25851,0.08223,ZP>,\r\n<-0.25860,0.09491,ZP>,\r\n<-0.25870,0.10760,ZP>,\r\n<-0.25881,0.12031,ZP>,\r\n<-0.25894,0.13302,ZP>,\r\n<-0.25909,0.14576,ZP>,\r\n<-0.25926,0.15850,ZP>,\r\n<-0.25944,0.17126,ZP>,\r\n<-0.25964,0.18404,ZP>,\r\n<-0.25985,0.19684,ZP>,\r\n<-0.26009,0.20967,ZP>,\r\n<-0.26035,0.22251,ZP>,\r\n<-0.26062,0.23538,ZP>,\r\n<-0.26092,0.24828,ZP>,\r\n<-0.26124,0.26121,ZP>,\r\n<-0.26158,0.27416,ZP>,\r\n<-0.26193,0.28715,ZP>,\r\n<-0.26229,0.30016,ZP>,\r\n<-0.26266,0.31321,ZP>,\r\n<-0.26305,0.32632,ZP>,\r\n<-0.26347,0.33949,ZP>,\r\n<-0.26389,0.35270,ZP>,\r\n<-0.26430,0.36592,ZP>,\r\n<-0.26475,0.37931,ZP>,\r\n<-0.26496,0.39246,0.66008>,\r\n<-0.26518,0.40573,0.66023>,\r\n<-0.26717,0.42107,0.65627>,\r\n<-0.26198,0.42607,0.64239>,\r\n<-0.25551,0.42985,0.63125>,\r\n<-0.24919,0.43351,0.62019>,\r\n<-0.24312,0.43695,0.60857>,\r\n<-0.23538,0.43721,0.59729>,\r\n<-0.22830,0.43904,0.58608>,\r\n<-0.22150,0.44163,0.57461>,\r\n<-0.21565,0.44549,0.56332>,\r\n<-0.21115,0.45045,0.55208>,\r\n<-0.20829,0.45650,0.54088>,\r\n<-0.20623,0.46274,0.52973>,\r\n<-0.20333,0.46859,0.51872>\r\n<-0.19556,-0.47939,0.52551>,\r\n<-0.20067,-0.47522,0.53661>,\r\n<-0.20579,-0.46996,0.54717>,\r\n<-0.20993,-0.46447,0.55807>,\r\n<-0.21300,-0.45891,0.56953>,\r\n<-0.21604,-0.45267,0.58144>,\r\n<-0.22041,-0.44786,0.59257>,\r\n<-0.22741,-0.44532,0.60387>,\r\n<-0.23347,-0.44220,0.61568>,\r\n<-0.23952,-0.43897,0.62752>,\r\n<-0.24554,-0.43564,0.63887>,\r\n<-0.25174,-0.43244,0.65064>,\r\n<-0.25161,-0.41865,0.66031>,\r\n<-0.25140,-0.40552,0.66009>,\r\n<-0.25148,-0.39240,ZP>,\r\n<-0.25126,-0.37910,ZP>,\r\n<-0.25094,-0.36580,ZP>,\r\n<-0.25066,-0.35259,ZP>,\r\n<-0.25034,-0.33939,ZP>,\r\n<-0.25000,-0.32624,ZP>,\r\n<-0.24967,-0.31313,ZP>,\r\n<-0.24934,-0.30007,ZP>,\r\n<-0.24902,-0.28705,ZP>,\r\n<-0.24870,-0.27407,ZP>,\r\n<-0.24839,-0.26112,ZP>,\r\n<-0.24810,-0.24819,ZP>,\r\n<-0.24782,-0.23530,ZP>,\r\n<-0.24755,-0.22243,ZP>,\r\n<-0.24731,-0.20959,ZP>,\r\n<-0.24708,-0.19677,ZP>,\r\n<-0.24687,-0.18397,ZP>,\r\n<-0.24668,-0.17119,ZP>,\r\n<-0.24651,-0.15843,ZP>,\r\n<-0.24636,-0.14569,ZP>,\r\n<-0.24622,-0.13297,ZP>,\r\n<-0.24610,-0.12026,ZP>,\r\n<-0.24599,-0.10756,ZP>,\r\n<-0.24590,-0.09488,ZP>,\r\n<-0.24582,-0.08220,ZP>,\r\n<-0.24575,-0.06954,ZP>,\r\n<-0.24570,-0.05688,ZP>,\r\n<-0.24566,-0.04424,ZP>,\r\n<-0.24563,-0.03160,ZP>,\r\n<-0.24561,-0.01896,ZP>,\r\n<-0.24560,-0.00632,ZP>,\r\n<-0.24560,0.00631,ZP>,\r\n<-0.24561,0.01894,ZP>,\r\n<-0.24563,0.03158,ZP>,\r\n<-0.24566,0.04422,ZP>,\r\n<-0.24570,0.05686,ZP>,\r\n<-0.24575,0.06952,ZP>,\r\n<-0.24582,0.08217,ZP>,\r\n<-0.24590,0.09484,ZP>,\r\n<-0.24599,0.10752,ZP>,\r\n<-0.24609,0.12021,ZP>,\r\n<-0.24621,0.13291,ZP>,\r\n<-0.24634,0.14563,ZP>,\r\n<-0.24649,0.15836,ZP>,\r\n<-0.24666,0.17110,ZP>,\r\n<-0.24684,0.18386,ZP>,\r\n<-0.24704,0.19665,ZP>,\r\n<-0.24725,0.20945,ZP>,\r\n<-0.24749,0.22227,ZP>,\r\n<-0.24774,0.23512,ZP>,\r\n<-0.24802,0.24799,ZP>,\r\n<-0.24831,0.26089,ZP>,\r\n<-0.24861,0.27382,ZP>,\r\n<-0.24893,0.28677,ZP>,\r\n<-0.24927,0.29976,ZP>,\r\n<-0.24962,0.31279,ZP>,\r\n<-0.24998,0.32586,ZP>,\r\n<-0.25036,0.33898,ZP>,\r\n<-0.25074,0.35215,ZP>,\r\n<-0.25110,0.36533,ZP>,\r\n<-0.25148,0.37859,ZP>,\r\n<-0.25180,0.39184,ZP>,\r\n<-0.25182,0.40495,0.66009>,\r\n<-0.25225,0.41773,0.66047>,\r\n<-0.25269,0.43200,0.65084>,\r\n<-0.24637,0.43520,0.63904>,\r\n<-0.24037,0.43848,0.62784>,\r\n<-0.23434,0.44172,0.61598>,\r\n<-0.22829,0.44488,0.60422>,\r\n<-0.22091,0.44580,0.59287>,\r\n<-0.21513,0.44977,0.58120>,\r\n<-0.21110,0.45508,0.56991>,\r\n<-0.20888,0.46102,0.55861>,\r\n<-0.20574,0.46687,0.54733>,\r\n<-0.20198,0.47247,0.53634>,\r\n<-0.19770,0.47800,0.52537>\r\n<-0.18403,-0.48026,0.53136>,\r\n<-0.18991,-0.47865,0.54301>,\r\n<-0.19614,-0.47567,0.55376>,\r\n<-0.20165,-0.47168,0.56470>,\r\n<-0.20643,-0.46684,0.57624>,\r\n<-0.21061,-0.46118,0.58823>,\r\n<-0.21386,-0.45546,0.59919>,\r\n<-0.21835,-0.45047,0.61159>,\r\n<-0.22428,-0.44697,0.62236>,\r\n<-0.23041,-0.44390,0.63415>,\r\n<-0.23863,-0.43351,0.65005>,\r\n<-0.23838,-0.43185,0.65998>,\r\n<-0.23804,-0.41742,ZP>,\r\n<-0.23826,-0.40479,ZP>,\r\n<-0.23826,-0.39162,ZP>,\r\n<-0.23800,-0.37834,ZP>,\r\n<-0.23781,-0.36517,ZP>,\r\n<-0.23755,-0.35201,ZP>,\r\n<-0.23726,-0.33887,ZP>,\r\n<-0.23696,-0.32577,ZP>,\r\n<-0.23666,-0.31270,ZP>,\r\n<-0.23635,-0.29967,ZP>,\r\n<-0.23606,-0.28668,ZP>,\r\n<-0.23577,-0.27373,ZP>,\r\n<-0.23549,-0.26080,ZP>,\r\n<-0.23522,-0.24791,ZP>,\r\n<-0.23496,-0.23504,ZP>,\r\n<-0.23472,-0.22219,ZP>,\r\n<-0.23450,-0.20937,ZP>,\r\n<-0.23429,-0.19657,ZP>,\r\n<-0.23410,-0.18379,ZP>,\r\n<-0.23393,-0.17103,ZP>,\r\n<-0.23377,-0.15829,ZP>,\r\n<-0.23363,-0.14557,ZP>,\r\n<-0.23351,-0.13286,ZP>,\r\n<-0.23339,-0.12016,ZP>,\r\n<-0.23330,-0.10748,ZP>,\r\n<-0.23321,-0.09480,ZP>,\r\n<-0.23314,-0.08214,ZP>,\r\n<-0.23308,-0.06949,ZP>,\r\n<-0.23303,-0.05684,ZP>,\r\n<-0.23299,-0.04421,ZP>,\r\n<-0.23296,-0.03157,ZP>,\r\n<-0.23294,-0.01894,ZP>,\r\n<-0.23294,-0.00632,ZP>,\r\n<-0.23294,0.00631,ZP>,\r\n<-0.23295,0.01893,ZP>,\r\n<-0.23296,0.03156,ZP>,\r\n<-0.23299,0.04419,ZP>,\r\n<-0.23303,0.05683,ZP>,\r\n<-0.23308,0.06947,ZP>,\r\n<-0.23314,0.08212,ZP>,\r\n<-0.23321,0.09478,ZP>,\r\n<-0.23329,0.10744,ZP>,\r\n<-0.23339,0.12012,ZP>,\r\n<-0.23349,0.13281,ZP>,\r\n<-0.23361,0.14551,ZP>,\r\n<-0.23375,0.15822,ZP>,\r\n<-0.23390,0.17095,ZP>,\r\n<-0.23406,0.18370,ZP>,\r\n<-0.23424,0.19646,ZP>,\r\n<-0.23444,0.20924,ZP>,\r\n<-0.23466,0.22205,ZP>,\r\n<-0.23489,0.23487,ZP>,\r\n<-0.23514,0.24772,ZP>,\r\n<-0.23540,0.26060,ZP>,\r\n<-0.23568,0.27350,ZP>,\r\n<-0.23598,0.28643,ZP>,\r\n<-0.23629,0.29939,ZP>,\r\n<-0.23661,0.31239,ZP>,\r\n<-0.23695,0.32543,ZP>,\r\n<-0.23729,0.33850,ZP>,\r\n<-0.23764,0.35161,ZP>,\r\n<-0.23796,0.36474,ZP>,\r\n<-0.23823,0.37789,ZP>,\r\n<-0.23857,0.39111,ZP>,\r\n<-0.23869,0.40428,ZP>,\r\n<-0.23835,0.41669,0.66022>,\r\n<-0.23912,0.43123,0.66017>,\r\n<-0.22965,0.44030,0.64230>,\r\n<-0.23254,0.44296,0.63281>,\r\n<-0.22525,0.44652,0.62038>,\r\n<-0.21923,0.44940,0.61111>,\r\n<-0.21374,0.45302,0.59985>,\r\n<-0.20986,0.45842,0.58797>,\r\n<-0.20649,0.46433,0.57654>,\r\n<-0.20276,0.46981,0.56524>,\r\n<-0.19823,0.47490,0.55392>,\r\n<-0.19311,0.47903,0.54276>,\r\n<-0.18760,0.48307,0.53155>\r\n<-0.17340,-0.47535,0.53624>,\r\n<-0.17864,-0.47567,0.54829>,\r\n<-0.18447,-0.47522,0.55947>,\r\n<-0.19046,-0.47378,0.57074>,\r\n<-0.19631,-0.47083,0.58247>,\r\n<-0.20152,-0.46662,0.59459>,\r\n<-0.20578,-0.46185,0.60594>,\r\n<-0.21011,-0.45623,0.61821>,\r\n<-0.21454,-0.45174,0.62898>,\r\n<-0.22083,-0.44876,0.64137>,\r\n<-0.22574,-0.44548,0.65492>,\r\n<-0.22460,-0.43014,0.66019>,\r\n<-0.22467,-0.41687,ZP>,\r\n<-0.22505,-0.40400,ZP>,\r\n<-0.22493,-0.39075,ZP>,\r\n<-0.22486,-0.37768,ZP>,\r\n<-0.22469,-0.36457,ZP>,\r\n<-0.22447,-0.35146,ZP>,\r\n<-0.22422,-0.33837,ZP>,\r\n<-0.22395,-0.32532,ZP>,\r\n<-0.22367,-0.31229,ZP>,\r\n<-0.22340,-0.29930,ZP>,\r\n<-0.22313,-0.28634,ZP>,\r\n<-0.22286,-0.27341,ZP>,\r\n<-0.22261,-0.26051,ZP>,\r\n<-0.22236,-0.24764,ZP>,\r\n<-0.22213,-0.23479,ZP>,\r\n<-0.22191,-0.22197,ZP>,\r\n<-0.22171,-0.20917,ZP>,\r\n<-0.22152,-0.19639,ZP>,\r\n<-0.22135,-0.18363,ZP>,\r\n<-0.22119,-0.17089,ZP>,\r\n<-0.22105,-0.15816,ZP>,\r\n<-0.22092,-0.14545,ZP>,\r\n<-0.22081,-0.13275,ZP>,\r\n<-0.22070,-0.12007,ZP>,\r\n<-0.22062,-0.10740,ZP>,\r\n<-0.22054,-0.09474,ZP>,\r\n<-0.22047,-0.08209,ZP>,\r\n<-0.22042,-0.06944,ZP>,\r\n<-0.22037,-0.05681,ZP>,\r\n<-0.22034,-0.04418,ZP>,\r\n<-0.22031,-0.03155,ZP>,\r\n<-0.22029,-0.01893,ZP>,\r\n<-0.22029,-0.00631,ZP>,\r\n<-0.22029,0.00630,ZP>,\r\n<-0.22030,0.01892,ZP>,\r\n<-0.22031,0.03154,ZP>,\r\n<-0.22034,0.04417,ZP>,\r\n<-0.22037,0.05679,ZP>,\r\n<-0.22042,0.06943,ZP>,\r\n<-0.22047,0.08207,ZP>,\r\n<-0.22053,0.09471,ZP>,\r\n<-0.22061,0.10737,ZP>,\r\n<-0.22069,0.12003,ZP>,\r\n<-0.22079,0.13271,ZP>,\r\n<-0.22090,0.14540,ZP>,\r\n<-0.22102,0.15810,ZP>,\r\n<-0.22116,0.17081,ZP>,\r\n<-0.22131,0.18354,ZP>,\r\n<-0.22147,0.19629,ZP>,\r\n<-0.22165,0.20905,ZP>,\r\n<-0.22185,0.22184,ZP>,\r\n<-0.22206,0.23464,ZP>,\r\n<-0.22229,0.24747,ZP>,\r\n<-0.22253,0.26032,ZP>,\r\n<-0.22279,0.27320,ZP>,\r\n<-0.22306,0.28610,ZP>,\r\n<-0.22334,0.29904,ZP>,\r\n<-0.22364,0.31201,ZP>,\r\n<-0.22395,0.32501,ZP>,\r\n<-0.22426,0.33804,ZP>,\r\n<-0.22456,0.35109,ZP>,\r\n<-0.22485,0.36417,ZP>,\r\n<-0.22509,0.37727,ZP>,\r\n<-0.22523,0.39029,ZP>,\r\n<-0.22545,0.40353,ZP>,\r\n<-0.22517,0.41642,0.66010>,\r\n<-0.22543,0.42960,0.66019>,\r\n<-0.22676,0.44471,0.65512>,\r\n<-0.22111,0.44888,0.64111>,\r\n<-0.21432,0.45214,0.62776>,\r\n<-0.21055,0.45457,0.61739>,\r\n<-0.20643,0.46030,0.60643>,\r\n<-0.20267,0.46581,0.59457>,\r\n<-0.19853,0.47089,0.58297>,\r\n<-0.19309,0.47519,0.57143>,\r\n<-0.18737,0.47814,0.55990>,\r\n<-0.18176,0.47995,0.54833>,\r\n<-0.17603,0.48133,0.53667>\r\n<-0.16437,-0.46739,0.54093>,\r\n<-0.16960,-0.46787,0.55281>,\r\n<-0.17448,-0.46911,0.56429>,\r\n<-0.17939,-0.47086,0.57611>,\r\n<-0.18511,-0.47061,0.58782>,\r\n<-0.19072,-0.46832,0.59991>,\r\n<-0.19554,-0.46489,0.61184>,\r\n<-0.20005,-0.45988,0.62421>,\r\n<-0.20510,-0.45608,0.63591>,\r\n<-0.20216,-0.45179,0.65001>,\r\n<-0.21162,-0.44279,0.66045>,\r\n<-0.21138,-0.42933,0.66007>,\r\n<-0.21161,-0.41634,ZP>,\r\n<-0.21178,-0.40320,ZP>,\r\n<-0.21176,-0.39010,ZP>,\r\n<-0.21173,-0.37706,ZP>,\r\n<-0.21159,-0.36399,ZP>,\r\n<-0.21142,-0.35094,ZP>,\r\n<-0.21120,-0.33791,ZP>,\r\n<-0.21097,-0.32490,ZP>,\r\n<-0.21072,-0.31191,ZP>,\r\n<-0.21047,-0.29895,ZP>,\r\n<-0.21023,-0.28602,ZP>,\r\n<-0.20999,-0.27312,ZP>,\r\n<-0.20975,-0.26024,ZP>,\r\n<-0.20953,-0.24739,ZP>,\r\n<-0.20932,-0.23457,ZP>,\r\n<-0.20912,-0.22177,ZP>,\r\n<-0.20894,-0.20898,ZP>,\r\n<-0.20877,-0.19622,ZP>,\r\n<-0.20861,-0.18348,ZP>,\r\n<-0.20847,-0.17075,ZP>,\r\n<-0.20834,-0.15804,ZP>,\r\n<-0.20822,-0.14534,ZP>,\r\n<-0.20812,-0.13266,ZP>,\r\n<-0.20803,-0.11999,ZP>,\r\n<-0.20795,-0.10733,ZP>,\r\n<-0.20788,-0.09468,ZP>,\r\n<-0.20782,-0.08204,ZP>,\r\n<-0.20777,-0.06940,ZP>,\r\n<-0.20773,-0.05677,ZP>,\r\n<-0.20770,-0.04415,ZP>,\r\n<-0.20767,-0.03154,ZP>,\r\n<-0.20766,-0.01892,ZP>,\r\n<-0.20765,-0.00631,ZP>,\r\n<-0.20765,0.00630,ZP>,\r\n<-0.20766,0.01891,ZP>,\r\n<-0.20767,0.03153,ZP>,\r\n<-0.20769,0.04414,ZP>,\r\n<-0.20773,0.05676,ZP>,\r\n<-0.20777,0.06939,ZP>,\r\n<-0.20781,0.08202,ZP>,\r\n<-0.20787,0.09465,ZP>,\r\n<-0.20794,0.10730,ZP>,\r\n<-0.20801,0.11995,ZP>,\r\n<-0.20810,0.13262,ZP>,\r\n<-0.20820,0.14529,ZP>,\r\n<-0.20831,0.15798,ZP>,\r\n<-0.20843,0.17068,ZP>,\r\n<-0.20857,0.18339,ZP>,\r\n<-0.20872,0.19613,ZP>,\r\n<-0.20888,0.20887,ZP>,\r\n<-0.20906,0.22164,ZP>,\r\n<-0.20925,0.23443,ZP>,\r\n<-0.20946,0.24724,ZP>,\r\n<-0.20968,0.26007,ZP>,\r\n<-0.20992,0.27292,ZP>,\r\n<-0.21017,0.28580,ZP>,\r\n<-0.21043,0.29871,ZP>,\r\n<-0.21070,0.31165,ZP>,\r\n<-0.21098,0.32461,ZP>,\r\n<-0.21126,0.33760,ZP>,\r\n<-0.21152,0.35060,ZP>,\r\n<-0.21176,0.36363,ZP>,\r\n<-0.21197,0.37667,ZP>,\r\n<-0.21207,0.38968,ZP>,\r\n<-0.21218,0.40277,ZP>,\r\n<-0.21218,0.41593,ZP>,\r\n<-0.21214,0.42881,ZP>,\r\n<-0.21249,0.44208,0.66040>,\r\n<-0.21545,0.44928,0.64426>,\r\n<-0.20408,0.45660,0.63599>,\r\n<-0.20099,0.45922,0.62433>,\r\n<-0.19694,0.46516,0.61266>,\r\n<-0.19250,0.46959,0.60076>,\r\n<-0.18772,0.47300,0.58873>,\r\n<-0.18189,0.47529,0.57694>,\r\n<-0.17611,0.47622,0.56501>,\r\n<-0.17091,0.47612,0.55317>,\r\n<-0.16608,0.47511,0.54122>\r\n<-0.15269,-0.46565,0.54660>,\r\n<-0.15835,-0.46527,0.55807>,\r\n<-0.16378,-0.46553,0.56966>,\r\n<-0.16896,-0.46611,0.58143>,\r\n<-0.17444,-0.46687,0.59310>,\r\n<-0.17963,-0.46697,0.60494>,\r\n<-0.18481,-0.46626,0.61739>,\r\n<-0.18924,-0.46305,0.62951>,\r\n<-0.19473,-0.46058,0.64154>,\r\n<-0.19926,-0.45712,0.65587>,\r\n<-0.19825,-0.44179,0.66010>,\r\n<-0.19843,-0.42874,ZP>,\r\n<-0.19868,-0.41581,ZP>,\r\n<-0.19863,-0.40256,ZP>,\r\n<-0.19866,-0.38953,ZP>,\r\n<-0.19863,-0.37650,ZP>,\r\n<-0.19853,-0.36347,ZP>,\r\n<-0.19840,-0.35047,ZP>,\r\n<-0.19822,-0.33748,ZP>,\r\n<-0.19802,-0.32450,ZP>,\r\n<-0.19780,-0.31155,ZP>,\r\n<-0.19758,-0.29862,ZP>,\r\n<-0.19735,-0.28572,ZP>,\r\n<-0.19714,-0.27284,ZP>,\r\n<-0.19693,-0.25999,ZP>,\r\n<-0.19672,-0.24716,ZP>,\r\n<-0.19653,-0.23436,ZP>,\r\n<-0.19635,-0.22158,ZP>,\r\n<-0.19619,-0.20881,ZP>,\r\n<-0.19603,-0.19607,ZP>,\r\n<-0.19589,-0.18334,ZP>,\r\n<-0.19576,-0.17062,ZP>,\r\n<-0.19564,-0.15793,ZP>,\r\n<-0.19554,-0.14524,ZP>,\r\n<-0.19545,-0.13257,ZP>,\r\n<-0.19536,-0.11991,ZP>,\r\n<-0.19529,-0.10726,ZP>,\r\n<-0.19523,-0.09462,ZP>,\r\n<-0.19517,-0.08199,ZP>,\r\n<-0.19513,-0.06936,ZP>,\r\n<-0.19509,-0.05674,ZP>,\r\n<-0.19506,-0.04413,ZP>,\r\n<-0.19504,-0.03152,ZP>,\r\n<-0.19503,-0.01891,ZP>,\r\n<-0.19502,-0.00631,ZP>,\r\n<-0.19502,0.00630,ZP>,\r\n<-0.19503,0.01891,ZP>,\r\n<-0.19504,0.03151,ZP>,\r\n<-0.19506,0.04412,ZP>,\r\n<-0.19509,0.05673,ZP>,\r\n<-0.19512,0.06935,ZP>,\r\n<-0.19517,0.08197,ZP>,\r\n<-0.19522,0.09460,ZP>,\r\n<-0.19528,0.10724,ZP>,\r\n<-0.19535,0.11988,ZP>,\r\n<-0.19543,0.13253,ZP>,\r\n<-0.19552,0.14520,ZP>,\r\n<-0.19562,0.15787,ZP>,\r\n<-0.19573,0.17056,ZP>,\r\n<-0.19585,0.18326,ZP>,\r\n<-0.19598,0.19598,ZP>,\r\n<-0.19613,0.20871,ZP>,\r\n<-0.19629,0.22146,ZP>,\r\n<-0.19647,0.23423,ZP>,\r\n<-0.19666,0.24702,ZP>,\r\n<-0.19686,0.25983,ZP>,\r\n<-0.19707,0.27266,ZP>,\r\n<-0.19730,0.28552,ZP>,\r\n<-0.19754,0.29840,ZP>,\r\n<-0.19779,0.31131,ZP>,\r\n<-0.19803,0.32423,ZP>,\r\n<-0.19828,0.33718,ZP>,\r\n<-0.19851,0.35015,ZP>,\r\n<-0.19870,0.36312,ZP>,\r\n<-0.19887,0.37612,ZP>,\r\n<-0.19899,0.38914,ZP>,\r\n<-0.19905,0.40217,ZP>,\r\n<-0.19921,0.41540,ZP>,\r\n<-0.19896,0.42823,0.66009>,\r\n<-0.19877,0.44128,0.66020>,\r\n<-0.19990,0.45665,0.65627>,\r\n<-0.19568,0.46019,0.64221>,\r\n<-0.19129,0.46244,0.63073>,\r\n<-0.18640,0.46744,0.61833>,\r\n<-0.18165,0.46998,0.60577>,\r\n<-0.17674,0.47137,0.59359>,\r\n<-0.17150,0.47109,0.58173>,\r\n<-0.16629,0.47007,0.56968>,\r\n<-0.16132,0.46933,0.55779>,\r\n<-0.15653,0.46872,0.54611>\r\n<-0.14237,-0.47192,0.55161>,\r\n<-0.14710,-0.47008,0.56314>,\r\n<-0.15232,-0.46873,0.57486>,\r\n<-0.15769,-0.46799,0.58681>,\r\n<-0.16320,-0.46787,0.59881>,\r\n<-0.16950,-0.47043,0.61094>,\r\n<-0.17429,-0.46865,0.62344>,\r\n<-0.17862,-0.46702,0.63500>,\r\n<-0.18411,-0.46503,0.64774>,\r\n<-0.18533,-0.45502,0.66027>,\r\n<-0.18425,-0.44097,ZP>,\r\n<-0.18495,-0.42772,ZP>,\r\n<-0.18551,-0.41512,ZP>,\r\n<-0.18558,-0.40204,ZP>,\r\n<-0.18561,-0.38902,ZP>,\r\n<-0.18559,-0.37600,ZP>,\r\n<-0.18552,-0.36301,ZP>,\r\n<-0.18541,-0.35004,ZP>,\r\n<-0.18526,-0.33708,ZP>,\r\n<-0.18509,-0.32414,ZP>,\r\n<-0.18490,-0.31122,ZP>,\r\n<-0.18470,-0.29832,ZP>,\r\n<-0.18450,-0.28545,ZP>,\r\n<-0.18431,-0.27259,ZP>,\r\n<-0.18412,-0.25976,ZP>,\r\n<-0.18394,-0.24696,ZP>,\r\n<-0.18376,-0.23417,ZP>,\r\n<-0.18360,-0.22140,ZP>,\r\n<-0.18345,-0.20865,ZP>,\r\n<-0.18331,-0.19592,ZP>,\r\n<-0.18318,-0.18321,ZP>,\r\n<-0.18307,-0.17051,ZP>,\r\n<-0.18296,-0.15782,ZP>,\r\n<-0.18287,-0.14515,ZP>,\r\n<-0.18278,-0.13249,ZP>,\r\n<-0.18271,-0.11984,ZP>,\r\n<-0.18264,-0.10720,ZP>,\r\n<-0.18259,-0.09457,ZP>,\r\n<-0.18254,-0.08195,ZP>,\r\n<-0.18250,-0.06933,ZP>,\r\n<-0.18247,-0.05672,ZP>,\r\n<-0.18244,-0.04411,ZP>,\r\n<-0.18242,-0.03150,ZP>,\r\n<-0.18241,-0.01890,ZP>,\r\n<-0.18240,-0.00630,ZP>,\r\n<-0.18240,0.00630,ZP>,\r\n<-0.18241,0.01890,ZP>,\r\n<-0.18242,0.03150,ZP>,\r\n<-0.18244,0.04410,ZP>,\r\n<-0.18246,0.05671,ZP>,\r\n<-0.18249,0.06932,ZP>,\r\n<-0.18253,0.08193,ZP>,\r\n<-0.18258,0.09455,ZP>,\r\n<-0.18263,0.10718,ZP>,\r\n<-0.18269,0.11981,ZP>,\r\n<-0.18276,0.13246,ZP>,\r\n<-0.18284,0.14511,ZP>,\r\n<-0.18293,0.15777,ZP>,\r\n<-0.18303,0.17045,ZP>,\r\n<-0.18314,0.18314,ZP>,\r\n<-0.18327,0.19584,ZP>,\r\n<-0.18340,0.20856,ZP>,\r\n<-0.18355,0.22130,ZP>,\r\n<-0.18370,0.23405,ZP>,\r\n<-0.18387,0.24682,ZP>,\r\n<-0.18406,0.25961,ZP>,\r\n<-0.18425,0.27243,ZP>,\r\n<-0.18446,0.28526,ZP>,\r\n<-0.18467,0.29812,ZP>,\r\n<-0.18489,0.31099,ZP>,\r\n<-0.18511,0.32389,ZP>,\r\n<-0.18532,0.33680,ZP>,\r\n<-0.18552,0.34973,ZP>,\r\n<-0.18569,0.36267,ZP>,\r\n<-0.18584,0.37564,ZP>,\r\n<-0.18595,0.38864,ZP>,\r\n<-0.18600,0.40164,ZP>,\r\n<-0.18602,0.41468,ZP>,\r\n<-0.18581,0.42766,0.66008>,\r\n<-0.18548,0.44075,0.66012>,\r\n<-0.18602,0.45441,0.66039>,\r\n<-0.18499,0.46473,0.64800>,\r\n<-0.18004,0.46648,0.63559>,\r\n<-0.17551,0.46852,0.62367>,\r\n<-0.17055,0.47002,0.61107>,\r\n<-0.16555,0.46924,0.59882>,\r\n<-0.16055,0.46900,0.58695>,\r\n<-0.15523,0.46860,0.57486>,\r\n<-0.14980,0.46824,0.56311>,\r\n<-0.14478,0.46853,0.55140>\r\n<-0.13729,-0.48276,0.55536>,\r\n<-0.14016,-0.47973,0.56729>,\r\n<-0.14414,-0.47704,0.57931>,\r\n<-0.14851,-0.47503,0.59131>,\r\n<-0.15466,-0.47551,0.60347>,\r\n<-0.15922,-0.47399,0.61590>,\r\n<-0.16387,-0.47241,0.62854>,\r\n<-0.16866,-0.47072,0.64067>,\r\n<-0.17282,-0.46865,0.65422>,\r\n<-0.17227,-0.45413,0.66015>,\r\n<-0.17233,-0.44110,ZP>,\r\n<-0.17256,-0.42794,ZP>,\r\n<-0.17251,-0.41465,ZP>,\r\n<-0.17259,-0.40160,ZP>,\r\n<-0.17262,-0.38857,ZP>,\r\n<-0.17260,-0.37557,ZP>,\r\n<-0.17254,-0.36260,ZP>,\r\n<-0.17245,-0.34965,ZP>,\r\n<-0.17233,-0.33672,ZP>,\r\n<-0.17219,-0.32381,ZP>,\r\n<-0.17202,-0.31092,ZP>,\r\n<-0.17185,-0.29804,ZP>,\r\n<-0.17168,-0.28519,ZP>,\r\n<-0.17150,-0.27236,ZP>,\r\n<-0.17133,-0.25955,ZP>,\r\n<-0.17117,-0.24676,ZP>,\r\n<-0.17101,-0.23399,ZP>,\r\n<-0.17087,-0.22124,ZP>,\r\n<-0.17073,-0.20851,ZP>,\r\n<-0.17061,-0.19579,ZP>,\r\n<-0.17049,-0.18309,ZP>,\r\n<-0.17039,-0.17041,ZP>,\r\n<-0.17029,-0.15773,ZP>,\r\n<-0.17021,-0.14507,ZP>,\r\n<-0.17013,-0.13242,ZP>,\r\n<-0.17007,-0.11978,ZP>,\r\n<-0.17001,-0.10715,ZP>,\r\n<-0.16996,-0.09452,ZP>,\r\n<-0.16991,-0.08191,ZP>,\r\n<-0.16988,-0.06930,ZP>,\r\n<-0.16985,-0.05669,ZP>,\r\n<-0.16982,-0.04409,ZP>,\r\n<-0.16981,-0.03149,ZP>,\r\n<-0.16980,-0.01889,ZP>,\r\n<-0.16979,-0.00630,ZP>,\r\n<-0.16979,0.00629,ZP>,\r\n<-0.16980,0.01889,ZP>,\r\n<-0.16981,0.03148,ZP>,\r\n<-0.16982,0.04408,ZP>,\r\n<-0.16984,0.05668,ZP>,\r\n<-0.16987,0.06928,ZP>,\r\n<-0.16991,0.08189,ZP>,\r\n<-0.16995,0.09451,ZP>,\r\n<-0.17000,0.10713,ZP>,\r\n<-0.17005,0.11975,ZP>,\r\n<-0.17011,0.13239,ZP>,\r\n<-0.17018,0.14503,ZP>,\r\n<-0.17026,0.15769,ZP>,\r\n<-0.17035,0.17035,ZP>,\r\n<-0.17045,0.18303,ZP>,\r\n<-0.17056,0.19572,ZP>,\r\n<-0.17068,0.20843,ZP>,\r\n<-0.17081,0.22115,ZP>,\r\n<-0.17096,0.23389,ZP>,\r\n<-0.17111,0.24664,ZP>,\r\n<-0.17128,0.25941,ZP>,\r\n<-0.17145,0.27221,ZP>,\r\n<-0.17164,0.28502,ZP>,\r\n<-0.17183,0.29785,ZP>,\r\n<-0.17202,0.31070,ZP>,\r\n<-0.17222,0.32357,ZP>,\r\n<-0.17240,0.33645,ZP>,\r\n<-0.17257,0.34935,ZP>,\r\n<-0.17272,0.36227,ZP>,\r\n<-0.17285,0.37521,ZP>,\r\n<-0.17296,0.38819,ZP>,\r\n<-0.17301,0.40118,ZP>,\r\n<-0.17300,0.41420,ZP>,\r\n<-0.17310,0.42744,ZP>,\r\n<-0.17294,0.44058,ZP>,\r\n<-0.17292,0.45362,0.66013>,\r\n<-0.17356,0.46824,0.65449>,\r\n<-0.16947,0.47043,0.64086>,\r\n<-0.16473,0.47210,0.62875>,\r\n<-0.16010,0.47369,0.61617>,\r\n<-0.15562,0.47521,0.60372>,\r\n<-0.14946,0.47174,0.59192>,\r\n<-0.14434,0.47241,0.57970>,\r\n<-0.13930,0.47365,0.56791>,\r\n<-0.13483,0.47561,0.55594>\r\n<-0.13307,-0.49386,0.55957>,\r\n<-0.13621,-0.49110,0.57141>,\r\n<-0.13929,-0.48800,0.58343>,\r\n<-0.14198,-0.48444,0.59560>,\r\n<-0.14488,-0.48060,0.60806>,\r\n<-0.14844,-0.47781,0.62050>,\r\n<-0.15316,-0.47598,0.63321>,\r\n<-0.15752,-0.47461,0.64557>,\r\n<-0.15969,-0.46795,0.65939>,\r\n<-0.15918,-0.45364,ZP>,\r\n<-0.15949,-0.44072,ZP>,\r\n<-0.15953,-0.42740,ZP>,\r\n<-0.15958,-0.41427,ZP>,\r\n<-0.15965,-0.40120,ZP>,\r\n<-0.15967,-0.38818,ZP>,\r\n<-0.15966,-0.37519,ZP>,\r\n<-0.15961,-0.36223,ZP>,\r\n<-0.15953,-0.34930,ZP>,\r\n<-0.15943,-0.33639,ZP>,\r\n<-0.15931,-0.32351,ZP>,\r\n<-0.15917,-0.31064,ZP>,\r\n<-0.15902,-0.29779,ZP>,\r\n<-0.15887,-0.28496,ZP>,\r\n<-0.15871,-0.27215,ZP>,\r\n<-0.15856,-0.25936,ZP>,\r\n<-0.15842,-0.24659,ZP>,\r\n<-0.15828,-0.23384,ZP>,\r\n<-0.15815,-0.22110,ZP>,\r\n<-0.15803,-0.20838,ZP>,\r\n<-0.15792,-0.19568,ZP>,\r\n<-0.15781,-0.18299,ZP>,\r\n<-0.15772,-0.17031,ZP>,\r\n<-0.15764,-0.15765,ZP>,\r\n<-0.15756,-0.14500,ZP>,\r\n<-0.15749,-0.13235,ZP>,\r\n<-0.15743,-0.11972,ZP>,\r\n<-0.15738,-0.10710,ZP>,\r\n<-0.15734,-0.09448,ZP>,\r\n<-0.15730,-0.08187,ZP>,\r\n<-0.15726,-0.06927,ZP>,\r\n<-0.15724,-0.05667,ZP>,\r\n<-0.15722,-0.04407,ZP>,\r\n<-0.15720,-0.03148,ZP>,\r\n<-0.15719,-0.01889,ZP>,\r\n<-0.15719,-0.00630,ZP>,\r\n<-0.15719,0.00629,ZP>,\r\n<-0.15719,0.01888,ZP>,\r\n<-0.15720,0.03147,ZP>,\r\n<-0.15721,0.04406,ZP>,\r\n<-0.15723,0.05666,ZP>,\r\n<-0.15726,0.06926,ZP>,\r\n<-0.15729,0.08186,ZP>,\r\n<-0.15733,0.09447,ZP>,\r\n<-0.15737,0.10708,ZP>,\r\n<-0.15742,0.11970,ZP>,\r\n<-0.15747,0.13232,ZP>,\r\n<-0.15754,0.14496,ZP>,\r\n<-0.15761,0.15761,ZP>,\r\n<-0.15769,0.17026,ZP>,\r\n<-0.15778,0.18293,ZP>,\r\n<-0.15787,0.19561,ZP>,\r\n<-0.15798,0.20830,ZP>,\r\n<-0.15810,0.22101,ZP>,\r\n<-0.15823,0.23374,ZP>,\r\n<-0.15837,0.24648,ZP>,\r\n<-0.15851,0.25923,ZP>,\r\n<-0.15867,0.27201,ZP>,\r\n<-0.15883,0.28480,ZP>,\r\n<-0.15900,0.29761,ZP>,\r\n<-0.15917,0.31043,ZP>,\r\n<-0.15934,0.32328,ZP>,\r\n<-0.15950,0.33614,ZP>,\r\n<-0.15965,0.34901,ZP>,\r\n<-0.15979,0.36192,ZP>,\r\n<-0.15991,0.37484,ZP>,\r\n<-0.15999,0.38779,ZP>,\r\n<-0.16005,0.40078,ZP>,\r\n<-0.16007,0.41381,ZP>,\r\n<-0.16009,0.42690,ZP>,\r\n<-0.16012,0.44019,ZP>,\r\n<-0.15987,0.45311,ZP>,\r\n<-0.16042,0.46733,0.65954>,\r\n<-0.15838,0.47434,0.64581>,\r\n<-0.15406,0.47569,0.63346>,\r\n<-0.14954,0.47713,0.62101>,\r\n<-0.14520,0.47848,0.60841>,\r\n<-0.13990,0.47825,0.59627>,\r\n<-0.13560,0.48029,0.58394>,\r\n<-0.13203,0.48286,0.57211>,\r\n<-0.12903,0.48610,0.55971>\r\n<-0.12189,-0.49974,0.56405>,\r\n<-0.12582,-0.49750,0.57604>,\r\n<-0.12954,-0.49467,0.58806>,\r\n<-0.13281,-0.49131,0.60037>,\r\n<-0.13594,-0.48755,0.61272>,\r\n<-0.13875,-0.48309,0.62516>,\r\n<-0.14217,-0.47938,0.63742>,\r\n<-0.14606,-0.47841,0.65028>,\r\n<-0.14637,-0.46643,0.66019>,\r\n<-0.14634,-0.45331,ZP>,\r\n<-0.14672,-0.44030,ZP>,\r\n<-0.14668,-0.42703,ZP>,\r\n<-0.14675,-0.41395,ZP>,\r\n<-0.14677,-0.40087,ZP>,\r\n<-0.14677,-0.38784,ZP>,\r\n<-0.14676,-0.37486,ZP>,\r\n<-0.14672,-0.36191,ZP>,\r\n<-0.14665,-0.34900,ZP>,\r\n<-0.14657,-0.33611,ZP>,\r\n<-0.14646,-0.32324,ZP>,\r\n<-0.14634,-0.31039,ZP>,\r\n<-0.14621,-0.29756,ZP>,\r\n<-0.14608,-0.28475,ZP>,\r\n<-0.14594,-0.27196,ZP>,\r\n<-0.14581,-0.25919,ZP>,\r\n<-0.14568,-0.24643,ZP>,\r\n<-0.14556,-0.23369,ZP>,\r\n<-0.14544,-0.22097,ZP>,\r\n<-0.14534,-0.20826,ZP>,\r\n<-0.14524,-0.19557,ZP>,\r\n<-0.14515,-0.18289,ZP>,\r\n<-0.14506,-0.17023,ZP>,\r\n<-0.14499,-0.15757,ZP>,\r\n<-0.14492,-0.14493,ZP>,\r\n<-0.14486,-0.13230,ZP>,\r\n<-0.14481,-0.11967,ZP>,\r\n<-0.14476,-0.10705,ZP>,\r\n<-0.14472,-0.09444,ZP>,\r\n<-0.14469,-0.08184,ZP>,\r\n<-0.14466,-0.06924,ZP>,\r\n<-0.14464,-0.05664,ZP>,\r\n<-0.14462,-0.04405,ZP>,\r\n<-0.14460,-0.03147,ZP>,\r\n<-0.14459,-0.01888,ZP>,\r\n<-0.14459,-0.00629,ZP>,\r\n<-0.14459,0.00629,ZP>,\r\n<-0.14459,0.01888,ZP>,\r\n<-0.14460,0.03146,ZP>,\r\n<-0.14461,0.04405,ZP>,\r\n<-0.14463,0.05664,ZP>,\r\n<-0.14465,0.06923,ZP>,\r\n<-0.14468,0.08183,ZP>,\r\n<-0.14471,0.09443,ZP>,\r\n<-0.14475,0.10704,ZP>,\r\n<-0.14479,0.11965,ZP>,\r\n<-0.14484,0.13227,ZP>,\r\n<-0.14490,0.14490,ZP>,\r\n<-0.14496,0.15753,ZP>,\r\n<-0.14503,0.17018,ZP>,\r\n<-0.14511,0.18284,ZP>,\r\n<-0.14520,0.19551,ZP>,\r\n<-0.14529,0.20819,ZP>,\r\n<-0.14540,0.22089,ZP>,\r\n<-0.14551,0.23360,ZP>,\r\n<-0.14564,0.24633,ZP>,\r\n<-0.14577,0.25907,ZP>,\r\n<-0.14591,0.27183,ZP>,\r\n<-0.14605,0.28460,ZP>,\r\n<-0.14620,0.29739,ZP>,\r\n<-0.14635,0.31020,ZP>,\r\n<-0.14650,0.32302,ZP>,\r\n<-0.14664,0.33586,ZP>,\r\n<-0.14677,0.34872,ZP>,\r\n<-0.14689,0.36160,ZP>,\r\n<-0.14700,0.37451,ZP>,\r\n<-0.14709,0.38745,ZP>,\r\n<-0.14717,0.40044,ZP>,\r\n<-0.14723,0.41348,ZP>,\r\n<-0.14724,0.42653,ZP>,\r\n<-0.14736,0.43977,ZP>,\r\n<-0.14707,0.45276,ZP>,\r\n<-0.14714,0.46584,0.66018>,\r\n<-0.14694,0.47813,0.65069>,\r\n<-0.14304,0.47911,0.63785>,\r\n<-0.13865,0.48040,0.62551>,\r\n<-0.13500,0.48300,0.61272>,\r\n<-0.13206,0.48659,0.60047>,\r\n<-0.12998,0.49073,0.58807>,\r\n<-0.12754,0.49396,0.57616>,\r\n<-0.12467,0.49711,0.56386>\r\n<-0.10977,-0.49675,0.56702>,\r\n<-0.11346,-0.49585,0.57922>,\r\n<-0.11724,-0.49441,0.59144>,\r\n<-0.12098,-0.49223,0.60397>,\r\n<-0.12445,-0.48948,0.61650>,\r\n<-0.12748,-0.48518,0.62915>,\r\n<-0.13079,-0.48259,0.64149>,\r\n<-0.13386,-0.48047,0.65549>,\r\n<-0.13338,-0.46586,0.66007>,\r\n<-0.13356,-0.45302,ZP>,\r\n<-0.13378,-0.43980,ZP>,\r\n<-0.13382,-0.42668,ZP>,\r\n<-0.13389,-0.41361,ZP>,\r\n<-0.13391,-0.40055,ZP>,\r\n<-0.13391,-0.38754,ZP>,\r\n<-0.13390,-0.37457,ZP>,\r\n<-0.13386,-0.36163,ZP>,\r\n<-0.13380,-0.34873,ZP>,\r\n<-0.13373,-0.33585,ZP>,\r\n<-0.13364,-0.32300,ZP>,\r\n<-0.13354,-0.31017,ZP>,\r\n<-0.13343,-0.29736,ZP>,\r\n<-0.13331,-0.28456,ZP>,\r\n<-0.13319,-0.27179,ZP>,\r\n<-0.13308,-0.25903,ZP>,\r\n<-0.13296,-0.24629,ZP>,\r\n<-0.13285,-0.23356,ZP>,\r\n<-0.13275,-0.22085,ZP>,\r\n<-0.13266,-0.20816,ZP>,\r\n<-0.13257,-0.19548,ZP>,\r\n<-0.13249,-0.18281,ZP>,\r\n<-0.13242,-0.17015,ZP>,\r\n<-0.13235,-0.15751,ZP>,\r\n<-0.13229,-0.14487,ZP>,\r\n<-0.13224,-0.13224,ZP>,\r\n<-0.13219,-0.11963,ZP>,\r\n<-0.13215,-0.10701,ZP>,\r\n<-0.13211,-0.09441,ZP>,\r\n<-0.13208,-0.08181,ZP>,\r\n<-0.13206,-0.06922,ZP>,\r\n<-0.13204,-0.05663,ZP>,\r\n<-0.13202,-0.04404,ZP>,\r\n<-0.13201,-0.03146,ZP>,\r\n<-0.13200,-0.01887,ZP>,\r\n<-0.13200,-0.00629,ZP>,\r\n<-0.13200,0.00629,ZP>,\r\n<-0.13200,0.01887,ZP>,\r\n<-0.13201,0.03145,ZP>,\r\n<-0.13202,0.04403,ZP>,\r\n<-0.13204,0.05662,ZP>,\r\n<-0.13205,0.06921,ZP>,\r\n<-0.13208,0.08180,ZP>,\r\n<-0.13211,0.09440,ZP>,\r\n<-0.13214,0.10700,ZP>,\r\n<-0.13218,0.11961,ZP>,\r\n<-0.13222,0.13222,ZP>,\r\n<-0.13227,0.14484,ZP>,\r\n<-0.13233,0.15747,ZP>,\r\n<-0.13239,0.17011,ZP>,\r\n<-0.13246,0.18276,ZP>,\r\n<-0.13253,0.19542,ZP>,\r\n<-0.13262,0.20809,ZP>,\r\n<-0.13271,0.22078,ZP>,\r\n<-0.13281,0.23348,ZP>,\r\n<-0.13292,0.24619,ZP>,\r\n<-0.13304,0.25892,ZP>,\r\n<-0.13316,0.27166,ZP>,\r\n<-0.13328,0.28442,ZP>,\r\n<-0.13341,0.29720,ZP>,\r\n<-0.13354,0.30999,ZP>,\r\n<-0.13367,0.32279,ZP>,\r\n<-0.13380,0.33562,ZP>,\r\n<-0.13392,0.34847,ZP>,\r\n<-0.13403,0.36134,ZP>,\r\n<-0.13413,0.37423,ZP>,\r\n<-0.13422,0.38716,ZP>,\r\n<-0.13429,0.40013,ZP>,\r\n<-0.13436,0.41315,ZP>,\r\n<-0.13438,0.42619,ZP>,\r\n<-0.13442,0.43927,ZP>,\r\n<-0.13429,0.45246,ZP>,\r\n<-0.13415,0.46525,ZP>,\r\n<-0.13468,0.47990,0.65599>,\r\n<-0.13169,0.48235,0.64192>,\r\n<-0.12831,0.48492,0.62976>,\r\n<-0.12617,0.49024,0.61725>,\r\n<-0.12349,0.49427,0.60499>,\r\n<-0.12072,0.49793,0.59254>,\r\n<-0.11756,0.50096,0.58043>,\r\n<-0.11446,0.50365,0.56814>\r\n<-0.10045,-0.48797,0.56933>,\r\n<-0.10351,-0.48794,0.58166>,\r\n<-0.10657,-0.48820,0.59413>,\r\n<-0.10959,-0.48816,0.60680>,\r\n<-0.11266,-0.48814,0.61963>,\r\n<-0.11587,-0.48640,0.63260>,\r\n<-0.11909,-0.48565,0.64519>,\r\n<-0.12089,-0.47984,0.65914>,\r\n<-0.12051,-0.46547,ZP>,\r\n<-0.12084,-0.45272,ZP>,\r\n<-0.12089,-0.43941,ZP>,\r\n<-0.12100,-0.42637,ZP>,\r\n<-0.12106,-0.41330,ZP>,\r\n<-0.12108,-0.40026,ZP>,\r\n<-0.12109,-0.38727,ZP>,\r\n<-0.12107,-0.37431,ZP>,\r\n<-0.12103,-0.36139,ZP>,\r\n<-0.12098,-0.34849,ZP>,\r\n<-0.12092,-0.33563,ZP>,\r\n<-0.12084,-0.32279,ZP>,\r\n<-0.12075,-0.30997,ZP>,\r\n<-0.12066,-0.29718,ZP>,\r\n<-0.12056,-0.28440,ZP>,\r\n<-0.12046,-0.27164,ZP>,\r\n<-0.12035,-0.25889,ZP>,\r\n<-0.12026,-0.24616,ZP>,\r\n<-0.12016,-0.23345,ZP>,\r\n<-0.12007,-0.22075,ZP>,\r\n<-0.11999,-0.20807,ZP>,\r\n<-0.11991,-0.19539,ZP>,\r\n<-0.11984,-0.18273,ZP>,\r\n<-0.11978,-0.17008,ZP>,\r\n<-0.11972,-0.15745,ZP>,\r\n<-0.11967,-0.14482,ZP>,\r\n<-0.11962,-0.13220,ZP>,\r\n<-0.11958,-0.11959,ZP>,\r\n<-0.11955,-0.10698,ZP>,\r\n<-0.11951,-0.09438,ZP>,\r\n<-0.11949,-0.08179,ZP>,\r\n<-0.11947,-0.06920,ZP>,\r\n<-0.11945,-0.05661,ZP>,\r\n<-0.11943,-0.04403,ZP>,\r\n<-0.11942,-0.03145,ZP>,\r\n<-0.11942,-0.01887,ZP>,\r\n<-0.11941,-0.00629,ZP>,\r\n<-0.11941,0.00629,ZP>,\r\n<-0.11942,0.01886,ZP>,\r\n<-0.11942,0.03144,ZP>,\r\n<-0.11943,0.04402,ZP>,\r\n<-0.11944,0.05660,ZP>,\r\n<-0.11946,0.06919,ZP>,\r\n<-0.11948,0.08178,ZP>,\r\n<-0.11951,0.09437,ZP>,\r\n<-0.11953,0.10697,ZP>,\r\n<-0.11957,0.11957,ZP>,\r\n<-0.11961,0.13218,ZP>,\r\n<-0.11965,0.14479,ZP>,\r\n<-0.11970,0.15742,ZP>,\r\n<-0.11975,0.17005,ZP>,\r\n<-0.11981,0.18269,ZP>,\r\n<-0.11988,0.19534,ZP>,\r\n<-0.11995,0.20801,ZP>,\r\n<-0.12004,0.22068,ZP>,\r\n<-0.12012,0.23337,ZP>,\r\n<-0.12022,0.24607,ZP>,\r\n<-0.12032,0.25879,ZP>,\r\n<-0.12043,0.27152,ZP>,\r\n<-0.12054,0.28427,ZP>,\r\n<-0.12065,0.29703,ZP>,\r\n<-0.12076,0.30980,ZP>,\r\n<-0.12088,0.32260,ZP>,\r\n<-0.12099,0.33541,ZP>,\r\n<-0.12109,0.34825,ZP>,\r\n<-0.12120,0.36111,ZP>,\r\n<-0.12129,0.37399,ZP>,\r\n<-0.12138,0.38691,ZP>,\r\n<-0.12146,0.39987,ZP>,\r\n<-0.12153,0.41286,ZP>,\r\n<-0.12156,0.42588,ZP>,\r\n<-0.12153,0.43888,ZP>,\r\n<-0.12157,0.45214,ZP>,\r\n<-0.12128,0.46487,ZP>,\r\n<-0.12165,0.47907,0.65940>,\r\n<-0.12003,0.48541,0.64570>,\r\n<-0.11709,0.48758,0.63325>,\r\n<-0.11468,0.49275,0.62090>,\r\n<-0.11168,0.49599,0.60835>,\r\n<-0.10848,0.49865,0.59572>,\r\n<-0.10510,0.50048,0.58333>,\r\n<-0.10187,0.50179,0.57086>\r\n<-0.08792,-0.48681,0.57271>,\r\n<-0.09128,-0.48675,0.58514>,\r\n<-0.09458,-0.48710,0.59758>,\r\n<-0.09820,-0.49030,0.61025>,\r\n<-0.10111,-0.48968,0.62310>,\r\n<-0.10428,-0.48902,0.63580>,\r\n<-0.10715,-0.48850,0.64860>,\r\n<-0.10775,-0.47852,0.66022>,\r\n<-0.10767,-0.46521,ZP>,\r\n<-0.10807,-0.45234,ZP>,\r\n<-0.10806,-0.43911,ZP>,\r\n<-0.10819,-0.42607,ZP>,\r\n<-0.10824,-0.41301,ZP>,\r\n<-0.10827,-0.40000,ZP>,\r\n<-0.10828,-0.38703,ZP>,\r\n<-0.10826,-0.37408,ZP>,\r\n<-0.10823,-0.36117,ZP>,\r\n<-0.10819,-0.34829,ZP>,\r\n<-0.10813,-0.33544,ZP>,\r\n<-0.10806,-0.32261,ZP>,\r\n<-0.10799,-0.30980,ZP>,\r\n<-0.10791,-0.29702,ZP>,\r\n<-0.10782,-0.28425,ZP>,\r\n<-0.10773,-0.27150,ZP>,\r\n<-0.10765,-0.25877,ZP>,\r\n<-0.10756,-0.24605,ZP>,\r\n<-0.10748,-0.23335,ZP>,\r\n<-0.10740,-0.22066,ZP>,\r\n<-0.10733,-0.20798,ZP>,\r\n<-0.10727,-0.19532,ZP>,\r\n<-0.10720,-0.18267,ZP>,\r\n<-0.10715,-0.17003,ZP>,\r\n<-0.10710,-0.15739,ZP>,\r\n<-0.10705,-0.14477,ZP>,\r\n<-0.10701,-0.13216,ZP>,\r\n<-0.10698,-0.11955,ZP>,\r\n<-0.10695,-0.10695,ZP>,\r\n<-0.10692,-0.09435,ZP>,\r\n<-0.10690,-0.08176,ZP>,\r\n<-0.10688,-0.06918,ZP>,\r\n<-0.10686,-0.05660,ZP>,\r\n<-0.10685,-0.04402,ZP>,\r\n<-0.10684,-0.03144,ZP>,\r\n<-0.10684,-0.01886,ZP>,\r\n<-0.10683,-0.00629,ZP>,\r\n<-0.10683,0.00629,ZP>,\r\n<-0.10683,0.01886,ZP>,\r\n<-0.10684,0.03144,ZP>,\r\n<-0.10685,0.04401,ZP>,\r\n<-0.10686,0.05659,ZP>,\r\n<-0.10687,0.06917,ZP>,\r\n<-0.10689,0.08176,ZP>,\r\n<-0.10691,0.09434,ZP>,\r\n<-0.10694,0.10694,ZP>,\r\n<-0.10697,0.11953,ZP>,\r\n<-0.10700,0.13214,ZP>,\r\n<-0.10704,0.14475,ZP>,\r\n<-0.10708,0.15737,ZP>,\r\n<-0.10713,0.16999,ZP>,\r\n<-0.10718,0.18263,ZP>,\r\n<-0.10724,0.19527,ZP>,\r\n<-0.10730,0.20793,ZP>,\r\n<-0.10737,0.22060,ZP>,\r\n<-0.10745,0.23328,ZP>,\r\n<-0.10753,0.24597,ZP>,\r\n<-0.10762,0.25867,ZP>,\r\n<-0.10771,0.27139,ZP>,\r\n<-0.10780,0.28413,ZP>,\r\n<-0.10790,0.29688,ZP>,\r\n<-0.10800,0.30964,ZP>,\r\n<-0.10810,0.32243,ZP>,\r\n<-0.10820,0.33523,ZP>,\r\n<-0.10830,0.34806,ZP>,\r\n<-0.10839,0.36091,ZP>,\r\n<-0.10848,0.37379,ZP>,\r\n<-0.10856,0.38669,ZP>,\r\n<-0.10864,0.39963,ZP>,\r\n<-0.10869,0.41259,ZP>,\r\n<-0.10873,0.42560,ZP>,\r\n<-0.10870,0.43859,ZP>,\r\n<-0.10878,0.45177,ZP>,\r\n<-0.10845,0.46463,ZP>,\r\n<-0.10858,0.47784,0.66021>,\r\n<-0.10813,0.48829,0.64909>,\r\n<-0.10539,0.48883,0.63611>,\r\n<-0.10271,0.49207,0.62360>,\r\n<-0.10003,0.49254,0.61067>,\r\n<-0.09754,0.49280,0.59791>,\r\n<-0.09505,0.49278,0.58522>,\r\n<-0.09251,0.49295,0.57263>\r\n<-0.07733,-0.49349,0.57531>,\r\n<-0.08025,-0.49249,0.58781>,\r\n<-0.08379,-0.49294,0.60031>,\r\n<-0.08671,-0.49244,0.61302>,\r\n<-0.08948,-0.49194,0.62605>,\r\n<-0.09242,-0.49139,0.63860>,\r\n<-0.09496,-0.49093,0.65199>,\r\n<-0.09487,-0.47800,0.66011>,\r\n<-0.09490,-0.46505,ZP>,\r\n<-0.09523,-0.45193,ZP>,\r\n<-0.09528,-0.43883,ZP>,\r\n<-0.09540,-0.42579,ZP>,\r\n<-0.09544,-0.41275,ZP>,\r\n<-0.09548,-0.39976,ZP>,\r\n<-0.09549,-0.38680,ZP>,\r\n<-0.09548,-0.37388,ZP>,\r\n<-0.09545,-0.36098,ZP>,\r\n<-0.09541,-0.34811,ZP>,\r\n<-0.09536,-0.33527,ZP>,\r\n<-0.09530,-0.32245,ZP>,\r\n<-0.09524,-0.30966,ZP>,\r\n<-0.09517,-0.29688,ZP>,\r\n<-0.09510,-0.28413,ZP>,\r\n<-0.09503,-0.27139,ZP>,\r\n<-0.09495,-0.25866,ZP>,\r\n<-0.09488,-0.24595,ZP>,\r\n<-0.09481,-0.23326,ZP>,\r\n<-0.09475,-0.22058,ZP>,\r\n<-0.09468,-0.20791,ZP>,\r\n<-0.09463,-0.19526,ZP>,\r\n<-0.09457,-0.18261,ZP>,\r\n<-0.09453,-0.16997,ZP>,\r\n<-0.09448,-0.15735,ZP>,\r\n<-0.09444,-0.14473,ZP>,\r\n<-0.09441,-0.13212,ZP>,\r\n<-0.09438,-0.11952,ZP>,\r\n<-0.09435,-0.10692,ZP>,\r\n<-0.09433,-0.09433,ZP>,\r\n<-0.09431,-0.08175,ZP>,\r\n<-0.09429,-0.06916,ZP>,\r\n<-0.09428,-0.05658,ZP>,\r\n<-0.09427,-0.04401,ZP>,\r\n<-0.09426,-0.03143,ZP>,\r\n<-0.09426,-0.01886,ZP>,\r\n<-0.09426,-0.00629,ZP>,\r\n<-0.09426,0.00628,ZP>,\r\n<-0.09426,0.01886,ZP>,\r\n<-0.09426,0.03143,ZP>,\r\n<-0.09427,0.04400,ZP>,\r\n<-0.09428,0.05658,ZP>,\r\n<-0.09429,0.06916,ZP>,\r\n<-0.09431,0.08174,ZP>,\r\n<-0.09432,0.09432,ZP>,\r\n<-0.09434,0.10691,ZP>,\r\n<-0.09437,0.11951,ZP>,\r\n<-0.09440,0.13210,ZP>,\r\n<-0.09443,0.14471,ZP>,\r\n<-0.09446,0.15732,ZP>,\r\n<-0.09451,0.16994,ZP>,\r\n<-0.09455,0.18257,ZP>,\r\n<-0.09460,0.19521,ZP>,\r\n<-0.09466,0.20786,ZP>,\r\n<-0.09472,0.22052,ZP>,\r\n<-0.09478,0.23319,ZP>,\r\n<-0.09485,0.24588,ZP>,\r\n<-0.09492,0.25858,ZP>,\r\n<-0.09500,0.27129,ZP>,\r\n<-0.09508,0.28401,ZP>,\r\n<-0.09517,0.29675,ZP>,\r\n<-0.09526,0.30951,ZP>,\r\n<-0.09534,0.32228,ZP>,\r\n<-0.09543,0.33508,ZP>,\r\n<-0.09552,0.34790,ZP>,\r\n<-0.09561,0.36074,ZP>,\r\n<-0.09569,0.37361,ZP>,\r\n<-0.09577,0.38650,ZP>,\r\n<-0.09583,0.39942,ZP>,\r\n<-0.09588,0.41237,ZP>,\r\n<-0.09593,0.42535,ZP>,\r\n<-0.09590,0.43835,ZP>,\r\n<-0.09593,0.45139,ZP>,\r\n<-0.09570,0.46450,ZP>,\r\n<-0.09575,0.47741,0.66010>,\r\n<-0.09591,0.49063,0.65253>,\r\n<-0.09346,0.49119,0.63894>,\r\n<-0.09073,0.49170,0.62649>,\r\n<-0.08832,0.49216,0.61347>,\r\n<-0.08582,0.49262,0.60077>,\r\n<-0.08302,0.49016,0.58815>,\r\n<-0.08042,0.49019,0.57560>\r\n<-0.07158,-0.50487,0.57772>,\r\n<-0.07319,-0.50292,0.59029>,\r\n<-0.07455,-0.50042,0.60294>,\r\n<-0.07613,-0.49768,0.61566>,\r\n<-0.07786,-0.49459,0.62870>,\r\n<-0.08035,-0.49372,0.64118>,\r\n<-0.08235,-0.49198,0.65530>,\r\n<-0.08210,-0.47764,ZP>,\r\n<-0.08223,-0.46491,ZP>,\r\n<-0.08242,-0.45159,ZP>,\r\n<-0.08251,-0.43858,ZP>,\r\n<-0.08262,-0.42553,ZP>,\r\n<-0.08267,-0.41252,ZP>,\r\n<-0.08270,-0.39955,ZP>,\r\n<-0.08271,-0.38661,ZP>,\r\n<-0.08271,-0.37369,ZP>,\r\n<-0.08269,-0.36081,ZP>,\r\n<-0.08265,-0.34796,ZP>,\r\n<-0.08261,-0.33513,ZP>,\r\n<-0.08256,-0.32232,ZP>,\r\n<-0.08251,-0.30953,ZP>,\r\n<-0.08245,-0.29677,ZP>,\r\n<-0.08239,-0.28402,ZP>,\r\n<-0.08233,-0.27129,ZP>,\r\n<-0.08227,-0.25857,ZP>,\r\n<-0.08221,-0.24587,ZP>,\r\n<-0.08215,-0.23318,ZP>,\r\n<-0.08210,-0.22051,ZP>,\r\n<-0.08204,-0.20785,ZP>,\r\n<-0.08200,-0.19520,ZP>,\r\n<-0.08195,-0.18256,ZP>,\r\n<-0.08191,-0.16993,ZP>,\r\n<-0.08187,-0.15731,ZP>,\r\n<-0.08184,-0.14470,ZP>,\r\n<-0.08181,-0.13209,ZP>,\r\n<-0.08179,-0.11949,ZP>,\r\n<-0.08176,-0.10690,ZP>,\r\n<-0.08175,-0.09431,ZP>,\r\n<-0.08173,-0.08173,ZP>,\r\n<-0.08172,-0.06915,ZP>,\r\n<-0.08170,-0.05657,ZP>,\r\n<-0.08170,-0.04400,ZP>,\r\n<-0.08169,-0.03143,ZP>,\r\n<-0.08168,-0.01886,ZP>,\r\n<-0.08168,-0.00629,ZP>,\r\n<-0.08168,0.00628,ZP>,\r\n<-0.08168,0.01885,ZP>,\r\n<-0.08169,0.03142,ZP>,\r\n<-0.08169,0.04400,ZP>,\r\n<-0.08170,0.05657,ZP>,\r\n<-0.08171,0.06914,ZP>,\r\n<-0.08172,0.08172,ZP>,\r\n<-0.08174,0.09430,ZP>,\r\n<-0.08176,0.10689,ZP>,\r\n<-0.08178,0.11948,ZP>,\r\n<-0.08180,0.13208,ZP>,\r\n<-0.08183,0.14468,ZP>,\r\n<-0.08186,0.15729,ZP>,\r\n<-0.08189,0.16990,ZP>,\r\n<-0.08193,0.18253,ZP>,\r\n<-0.08197,0.19516,ZP>,\r\n<-0.08202,0.20780,ZP>,\r\n<-0.08207,0.22046,ZP>,\r\n<-0.08212,0.23312,ZP>,\r\n<-0.08218,0.24580,ZP>,\r\n<-0.08225,0.25849,ZP>,\r\n<-0.08231,0.27119,ZP>,\r\n<-0.08238,0.28391,ZP>,\r\n<-0.08245,0.29664,ZP>,\r\n<-0.08253,0.30939,ZP>,\r\n<-0.08260,0.32216,ZP>,\r\n<-0.08268,0.33495,ZP>,\r\n<-0.08276,0.34776,ZP>,\r\n<-0.08284,0.36059,ZP>,\r\n<-0.08291,0.37345,ZP>,\r\n<-0.08298,0.38633,ZP>,\r\n<-0.08304,0.39924,ZP>,\r\n<-0.08309,0.41218,ZP>,\r\n<-0.08313,0.42513,ZP>,\r\n<-0.08311,0.43814,ZP>,\r\n<-0.08311,0.45110,ZP>,\r\n<-0.08303,0.46439,ZP>,\r\n<-0.08298,0.47706,ZP>,\r\n<-0.08331,0.49152,0.65578>,\r\n<-0.08139,0.49333,0.64152>,\r\n<-0.07893,0.49374,0.62913>,\r\n<-0.07653,0.49412,0.61592>,\r\n<-0.07398,0.49451,0.60312>,\r\n<-0.07116,0.49430,0.59049>,\r\n<-0.06864,0.49515,0.57801>\r\n<-0.06005,-0.51011,0.58040>,\r\n<-0.06180,-0.50799,0.59308>,\r\n<-0.06346,-0.50522,0.60567>,\r\n<-0.06500,-0.50207,0.61834>,\r\n<-0.06631,-0.49748,0.63115>,\r\n<-0.06809,-0.49543,0.64350>,\r\n<-0.06950,-0.49185,0.65780>,\r\n<-0.06936,-0.47730,ZP>,\r\n<-0.06959,-0.46470,ZP>,\r\n<-0.06967,-0.45132,ZP>,\r\n<-0.06977,-0.43835,ZP>,\r\n<-0.06985,-0.42529,ZP>,\r\n<-0.06991,-0.41231,ZP>,\r\n<-0.06994,-0.39936,ZP>,\r\n<-0.06995,-0.38643,ZP>,\r\n<-0.06995,-0.37354,ZP>,\r\n<-0.06993,-0.36067,ZP>,\r\n<-0.06991,-0.34782,ZP>,\r\n<-0.06987,-0.33500,ZP>,\r\n<-0.06983,-0.32221,ZP>,\r\n<-0.06979,-0.30943,ZP>,\r\n<-0.06974,-0.29667,ZP>,\r\n<-0.06970,-0.28393,ZP>,\r\n<-0.06965,-0.27120,ZP>,\r\n<-0.06960,-0.25850,ZP>,\r\n<-0.06955,-0.24580,ZP>,\r\n<-0.06950,-0.23312,ZP>,\r\n<-0.06945,-0.22045,ZP>,\r\n<-0.06941,-0.20780,ZP>,\r\n<-0.06937,-0.19515,ZP>,\r\n<-0.06933,-0.18252,ZP>,\r\n<-0.06930,-0.16989,ZP>,\r\n<-0.06927,-0.15728,ZP>,\r\n<-0.06924,-0.14467,ZP>,\r\n<-0.06922,-0.13207,ZP>,\r\n<-0.06920,-0.11947,ZP>,\r\n<-0.06918,-0.10688,ZP>,\r\n<-0.06916,-0.09430,ZP>,\r\n<-0.06915,-0.08172,ZP>,\r\n<-0.06914,-0.06914,ZP>,\r\n<-0.06913,-0.05656,ZP>,\r\n<-0.06912,-0.04399,ZP>,\r\n<-0.06912,-0.03142,ZP>,\r\n<-0.06911,-0.01885,ZP>,\r\n<-0.06911,-0.00628,ZP>,\r\n<-0.06911,0.00628,ZP>,\r\n<-0.06911,0.01885,ZP>,\r\n<-0.06912,0.03142,ZP>,\r\n<-0.06912,0.04399,ZP>,\r\n<-0.06913,0.05656,ZP>,\r\n<-0.06913,0.06913,ZP>,\r\n<-0.06915,0.08171,ZP>,\r\n<-0.06916,0.09429,ZP>,\r\n<-0.06917,0.10687,ZP>,\r\n<-0.06919,0.11946,ZP>,\r\n<-0.06921,0.13205,ZP>,\r\n<-0.06923,0.14465,ZP>,\r\n<-0.06926,0.15726,ZP>,\r\n<-0.06928,0.16987,ZP>,\r\n<-0.06932,0.18249,ZP>,\r\n<-0.06935,0.19512,ZP>,\r\n<-0.06939,0.20776,ZP>,\r\n<-0.06943,0.22041,ZP>,\r\n<-0.06947,0.23306,ZP>,\r\n<-0.06952,0.24574,ZP>,\r\n<-0.06958,0.25842,ZP>,\r\n<-0.06963,0.27112,ZP>,\r\n<-0.06969,0.28383,ZP>,\r\n<-0.06975,0.29656,ZP>,\r\n<-0.06981,0.30930,ZP>,\r\n<-0.06988,0.32206,ZP>,\r\n<-0.06995,0.33484,ZP>,\r\n<-0.07002,0.34765,ZP>,\r\n<-0.07009,0.36047,ZP>,\r\n<-0.07015,0.37332,ZP>,\r\n<-0.07021,0.38619,ZP>,\r\n<-0.07027,0.39909,ZP>,\r\n<-0.07031,0.41201,ZP>,\r\n<-0.07034,0.42495,ZP>,\r\n<-0.07034,0.43796,ZP>,\r\n<-0.07033,0.45090,ZP>,\r\n<-0.07037,0.46422,ZP>,\r\n<-0.07021,0.47676,ZP>,\r\n<-0.07043,0.49122,0.65820>,\r\n<-0.06911,0.49521,0.64394>,\r\n<-0.06704,0.49549,0.63133>,\r\n<-0.06562,0.49876,0.61825>,\r\n<-0.06433,0.50151,0.60544>,\r\n<-0.06323,0.50431,0.59277>,\r\n<-0.06192,0.50622,0.58018>\r\n<-0.04767,-0.50707,0.58132>,\r\n<-0.04941,-0.50584,0.59413>,\r\n<-0.05125,-0.50372,0.60685>,\r\n<-0.05286,-0.50148,0.61976>,\r\n<-0.05426,-0.49706,0.63267>,\r\n<-0.05571,-0.49691,0.64547>,\r\n<-0.05661,-0.49117,0.65928>,\r\n<-0.05659,-0.47696,ZP>,\r\n<-0.05689,-0.46439,ZP>,\r\n<-0.05693,-0.45108,ZP>,\r\n<-0.05704,-0.43813,ZP>,\r\n<-0.05710,-0.42508,ZP>,\r\n<-0.05715,-0.41213,ZP>,\r\n<-0.05719,-0.39919,ZP>,\r\n<-0.05720,-0.38628,ZP>,\r\n<-0.05720,-0.37340,ZP>,\r\n<-0.05719,-0.36054,ZP>,\r\n<-0.05717,-0.34771,ZP>,\r\n<-0.05715,-0.33490,ZP>,\r\n<-0.05712,-0.32211,ZP>,\r\n<-0.05708,-0.30934,ZP>,\r\n<-0.05705,-0.29659,ZP>,\r\n<-0.05701,-0.28385,ZP>,\r\n<-0.05697,-0.27114,ZP>,\r\n<-0.05693,-0.25843,ZP>,\r\n<-0.05689,-0.24574,ZP>,\r\n<-0.05686,-0.23307,ZP>,\r\n<-0.05682,-0.22040,ZP>,\r\n<-0.05678,-0.20775,ZP>,\r\n<-0.05675,-0.19511,ZP>,\r\n<-0.05672,-0.18248,ZP>,\r\n<-0.05670,-0.16986,ZP>,\r\n<-0.05667,-0.15725,ZP>,\r\n<-0.05665,-0.14464,ZP>,\r\n<-0.05663,-0.13205,ZP>,\r\n<-0.05661,-0.11945,ZP>,\r\n<-0.05660,-0.10687,ZP>,\r\n<-0.05659,-0.09428,ZP>,\r\n<-0.05657,-0.08170,ZP>,\r\n<-0.05656,-0.06913,ZP>,\r\n<-0.05656,-0.05656,ZP>,\r\n<-0.05655,-0.04399,ZP>,\r\n<-0.05655,-0.03142,ZP>,\r\n<-0.05654,-0.01885,ZP>,\r\n<-0.05654,-0.00628,ZP>,\r\n<-0.05654,0.00628,ZP>,\r\n<-0.05654,0.01885,ZP>,\r\n<-0.05655,0.03142,ZP>,\r\n<-0.05655,0.04398,ZP>,\r\n<-0.05656,0.05655,ZP>,\r\n<-0.05656,0.06912,ZP>,\r\n<-0.05657,0.08170,ZP>,\r\n<-0.05658,0.09428,ZP>,\r\n<-0.05659,0.10686,ZP>,\r\n<-0.05660,0.11944,ZP>,\r\n<-0.05662,0.13203,ZP>,\r\n<-0.05664,0.14463,ZP>,\r\n<-0.05666,0.15723,ZP>,\r\n<-0.05668,0.16984,ZP>,\r\n<-0.05671,0.18246,ZP>,\r\n<-0.05673,0.19508,ZP>,\r\n<-0.05676,0.20772,ZP>,\r\n<-0.05680,0.22036,ZP>,\r\n<-0.05683,0.23302,ZP>,\r\n<-0.05687,0.24568,ZP>,\r\n<-0.05691,0.25836,ZP>,\r\n<-0.05696,0.27106,ZP>,\r\n<-0.05701,0.28376,ZP>,\r\n<-0.05706,0.29649,ZP>,\r\n<-0.05711,0.30923,ZP>,\r\n<-0.05717,0.32198,ZP>,\r\n<-0.05723,0.33476,ZP>,\r\n<-0.05728,0.34755,ZP>,\r\n<-0.05734,0.36037,ZP>,\r\n<-0.05740,0.37321,ZP>,\r\n<-0.05746,0.38607,ZP>,\r\n<-0.05750,0.39896,ZP>,\r\n<-0.05754,0.41188,ZP>,\r\n<-0.05757,0.42480,ZP>,\r\n<-0.05759,0.43781,ZP>,\r\n<-0.05757,0.45073,ZP>,\r\n<-0.05762,0.46397,ZP>,\r\n<-0.05740,0.47651,ZP>,\r\n<-0.05749,0.49054,0.65950>,\r\n<-0.05674,0.49679,0.64593>,\r\n<-0.05531,0.49765,0.63325>,\r\n<-0.05435,0.50279,0.62055>,\r\n<-0.05314,0.50619,0.60793>,\r\n<-0.05174,0.50898,0.59521>,\r\n<-0.05021,0.51123,0.58267>\r\n<-0.03844,-0.49817,0.58190>,\r\n<-0.03935,-0.49806,0.59474>,\r\n<-0.04014,-0.49839,0.60765>,\r\n<-0.04102,-0.49835,0.62070>,\r\n<-0.04216,-0.49824,0.63407>,\r\n<-0.04328,-0.49818,0.64697>,\r\n<-0.04377,-0.49047,0.65996>,\r\n<-0.04383,-0.47669,ZP>,\r\n<-0.04414,-0.46405,ZP>,\r\n<-0.04420,-0.45085,ZP>,\r\n<-0.04431,-0.43792,ZP>,\r\n<-0.04436,-0.42490,ZP>,\r\n<-0.04441,-0.41197,ZP>,\r\n<-0.04444,-0.39904,ZP>,\r\n<-0.04445,-0.38615,ZP>,\r\n<-0.04446,-0.37329,ZP>,\r\n<-0.04445,-0.36044,ZP>,\r\n<-0.04444,-0.34762,ZP>,\r\n<-0.04443,-0.33482,ZP>,\r\n<-0.04441,-0.32204,ZP>,\r\n<-0.04439,-0.30927,ZP>,\r\n<-0.04436,-0.29652,ZP>,\r\n<-0.04433,-0.28379,ZP>,\r\n<-0.04430,-0.27108,ZP>,\r\n<-0.04428,-0.25838,ZP>,\r\n<-0.04425,-0.24570,ZP>,\r\n<-0.04422,-0.23303,ZP>,\r\n<-0.04419,-0.22037,ZP>,\r\n<-0.04416,-0.20772,ZP>,\r\n<-0.04414,-0.19508,ZP>,\r\n<-0.04412,-0.18246,ZP>,\r\n<-0.04409,-0.16984,ZP>,\r\n<-0.04408,-0.15723,ZP>,\r\n<-0.04406,-0.14463,ZP>,\r\n<-0.04404,-0.13203,ZP>,\r\n<-0.04403,-0.11944,ZP>,\r\n<-0.04402,-0.10685,ZP>,\r\n<-0.04401,-0.09427,ZP>,\r\n<-0.04400,-0.08170,ZP>,\r\n<-0.04399,-0.06912,ZP>,\r\n<-0.04399,-0.05655,ZP>,\r\n<-0.04398,-0.04398,ZP>,\r\n<-0.04398,-0.03141,ZP>,\r\n<-0.04398,-0.01885,ZP>,\r\n<-0.04398,-0.00628,ZP>,\r\n<-0.04398,0.00628,ZP>,\r\n<-0.04398,0.01885,ZP>,\r\n<-0.04398,0.03141,ZP>,\r\n<-0.04398,0.04398,ZP>,\r\n<-0.04399,0.05655,ZP>,\r\n<-0.04399,0.06912,ZP>,\r\n<-0.04400,0.08169,ZP>,\r\n<-0.04400,0.09427,ZP>,\r\n<-0.04401,0.10685,ZP>,\r\n<-0.04402,0.11943,ZP>,\r\n<-0.04404,0.13202,ZP>,\r\n<-0.04405,0.14461,ZP>,\r\n<-0.04406,0.15721,ZP>,\r\n<-0.04408,0.16982,ZP>,\r\n<-0.04410,0.18243,ZP>,\r\n<-0.04412,0.19505,ZP>,\r\n<-0.04414,0.20769,ZP>,\r\n<-0.04417,0.22033,ZP>,\r\n<-0.04420,0.23298,ZP>,\r\n<-0.04423,0.24564,ZP>,\r\n<-0.04426,0.25832,ZP>,\r\n<-0.04429,0.27101,ZP>,\r\n<-0.04433,0.28371,ZP>,\r\n<-0.04437,0.29643,ZP>,\r\n<-0.04442,0.30917,ZP>,\r\n<-0.04446,0.32192,ZP>,\r\n<-0.04451,0.33469,ZP>,\r\n<-0.04456,0.34748,ZP>,\r\n<-0.04461,0.36029,ZP>,\r\n<-0.04466,0.37312,ZP>,\r\n<-0.04471,0.38598,ZP>,\r\n<-0.04475,0.39886,ZP>,\r\n<-0.04479,0.41177,ZP>,\r\n<-0.04481,0.42469,ZP>,\r\n<-0.04483,0.43768,ZP>,\r\n<-0.04479,0.45058,ZP>,\r\n<-0.04481,0.46372,ZP>,\r\n<-0.04459,0.47635,ZP>,\r\n<-0.04460,0.48998,ZP>,\r\n<-0.04424,0.49810,0.64739>,\r\n<-0.04320,0.49814,0.63445>,\r\n<-0.04217,0.50208,0.62155>,\r\n<-0.04093,0.50432,0.60874>,\r\n<-0.03955,0.50663,0.59592>,\r\n<-0.03808,0.50788,0.58309>\r\n<-0.02601,-0.49535,0.58313>,\r\n<-0.02699,-0.49568,0.59601>,\r\n<-0.02811,-0.49925,0.60882>,\r\n<-0.02900,-0.49917,0.62188>,\r\n<-0.02996,-0.49913,0.63509>,\r\n<-0.03078,-0.49915,0.64809>,\r\n<-0.03100,-0.48995,0.66017>,\r\n<-0.03109,-0.47649,ZP>,\r\n<-0.03137,-0.46374,ZP>,\r\n<-0.03145,-0.45065,ZP>,\r\n<-0.03156,-0.43773,ZP>,\r\n<-0.03161,-0.42475,ZP>,\r\n<-0.03166,-0.41183,ZP>,\r\n<-0.03169,-0.39893,ZP>,\r\n<-0.03170,-0.38605,ZP>,\r\n<-0.03172,-0.37320,ZP>,\r\n<-0.03172,-0.36037,ZP>,\r\n<-0.03172,-0.34755,ZP>,\r\n<-0.03171,-0.33476,ZP>,\r\n<-0.03171,-0.32198,ZP>,\r\n<-0.03169,-0.30922,ZP>,\r\n<-0.03168,-0.29648,ZP>,\r\n<-0.03166,-0.28375,ZP>,\r\n<-0.03164,-0.27104,ZP>,\r\n<-0.03162,-0.25834,ZP>,\r\n<-0.03160,-0.24566,ZP>,\r\n<-0.03158,-0.23299,ZP>,\r\n<-0.03156,-0.22034,ZP>,\r\n<-0.03155,-0.20769,ZP>,\r\n<-0.03153,-0.19506,ZP>,\r\n<-0.03151,-0.18243,ZP>,\r\n<-0.03150,-0.16982,ZP>,\r\n<-0.03148,-0.15721,ZP>,\r\n<-0.03147,-0.14461,ZP>,\r\n<-0.03146,-0.13202,ZP>,\r\n<-0.03145,-0.11943,ZP>,\r\n<-0.03144,-0.10684,ZP>,\r\n<-0.03143,-0.09427,ZP>,\r\n<-0.03143,-0.08169,ZP>,\r\n<-0.03142,-0.06912,ZP>,\r\n<-0.03142,-0.05655,ZP>,\r\n<-0.03142,-0.04398,ZP>,\r\n<-0.03141,-0.03141,ZP>,\r\n<-0.03141,-0.01885,ZP>,\r\n<-0.03141,-0.00628,ZP>,\r\n<-0.03141,0.00628,ZP>,\r\n<-0.03141,0.01885,ZP>,\r\n<-0.03141,0.03141,ZP>,\r\n<-0.03141,0.04398,ZP>,\r\n<-0.03142,0.05654,ZP>,\r\n<-0.03142,0.06911,ZP>,\r\n<-0.03143,0.08168,ZP>,\r\n<-0.03143,0.09426,ZP>,\r\n<-0.03144,0.10684,ZP>,\r\n<-0.03144,0.11942,ZP>,\r\n<-0.03145,0.13201,ZP>,\r\n<-0.03146,0.14460,ZP>,\r\n<-0.03147,0.15720,ZP>,\r\n<-0.03148,0.16980,ZP>,\r\n<-0.03150,0.18241,ZP>,\r\n<-0.03151,0.19503,ZP>,\r\n<-0.03153,0.20766,ZP>,\r\n<-0.03155,0.22030,ZP>,\r\n<-0.03157,0.23295,ZP>,\r\n<-0.03159,0.24561,ZP>,\r\n<-0.03161,0.25829,ZP>,\r\n<-0.03164,0.27097,ZP>,\r\n<-0.03166,0.28368,ZP>,\r\n<-0.03169,0.29639,ZP>,\r\n<-0.03173,0.30912,ZP>,\r\n<-0.03176,0.32187,ZP>,\r\n<-0.03180,0.33464,ZP>,\r\n<-0.03184,0.34743,ZP>,\r\n<-0.03188,0.36023,ZP>,\r\n<-0.03193,0.37306,ZP>,\r\n<-0.03197,0.38591,ZP>,\r\n<-0.03200,0.39878,ZP>,\r\n<-0.03204,0.41168,ZP>,\r\n<-0.03205,0.42459,ZP>,\r\n<-0.03206,0.43756,ZP>,\r\n<-0.03202,0.45047,ZP>,\r\n<-0.03199,0.46353,ZP>,\r\n<-0.03180,0.47629,ZP>,\r\n<-0.03180,0.48965,0.66018>,\r\n<-0.03166,0.49909,0.64839>,\r\n<-0.03096,0.49906,0.63536>,\r\n<-0.03027,0.49909,0.62214>,\r\n<-0.02983,0.49913,0.60907>,\r\n<-0.02961,0.49822,0.59628>,\r\n<-0.02903,0.49811,0.58361>\r\n<-0.01411,-0.49971,0.58374>,\r\n<-0.01486,-0.49942,0.59653>,\r\n<-0.01604,-0.49975,0.60942>,\r\n<-0.01691,-0.49972,0.62250>,\r\n<-0.01768,-0.49971,0.63571>,\r\n<-0.01823,-0.49979,0.64885>,\r\n<-0.01832,-0.48964,0.66019>,\r\n<-0.01840,-0.47637,ZP>,\r\n<-0.01861,-0.46351,ZP>,\r\n<-0.01870,-0.45047,ZP>,\r\n<-0.01880,-0.43756,ZP>,\r\n<-0.01886,-0.42462,ZP>,\r\n<-0.01890,-0.41172,ZP>,\r\n<-0.01893,-0.39884,ZP>,\r\n<-0.01896,-0.38598,ZP>,\r\n<-0.01897,-0.37313,ZP>,\r\n<-0.01899,-0.36031,ZP>,\r\n<-0.01900,-0.34750,ZP>,\r\n<-0.01901,-0.33471,ZP>,\r\n<-0.01901,-0.32194,ZP>,\r\n<-0.01901,-0.30918,ZP>,\r\n<-0.01900,-0.29644,ZP>,\r\n<-0.01900,-0.28372,ZP>,\r\n<-0.01899,-0.27101,ZP>,\r\n<-0.01898,-0.25831,ZP>,\r\n<-0.01897,-0.24564,ZP>,\r\n<-0.01895,-0.23297,ZP>,\r\n<-0.01894,-0.22032,ZP>,\r\n<-0.01893,-0.20767,ZP>,\r\n<-0.01892,-0.19504,ZP>,\r\n<-0.01891,-0.18242,ZP>,\r\n<-0.01890,-0.16981,ZP>,\r\n<-0.01889,-0.15720,ZP>,\r\n<-0.01888,-0.14460,ZP>,\r\n<-0.01888,-0.13201,ZP>,\r\n<-0.01887,-0.11942,ZP>,\r\n<-0.01887,-0.10684,ZP>,\r\n<-0.01886,-0.09426,ZP>,\r\n<-0.01886,-0.08168,ZP>,\r\n<-0.01885,-0.06911,ZP>,\r\n<-0.01885,-0.05654,ZP>,\r\n<-0.01885,-0.04398,ZP>,\r\n<-0.01885,-0.03141,ZP>,\r\n<-0.01885,-0.01885,ZP>,\r\n<-0.01885,-0.00628,ZP>,\r\n<-0.01885,0.00628,ZP>,\r\n<-0.01885,0.01884,ZP>,\r\n<-0.01885,0.03141,ZP>,\r\n<-0.01885,0.04397,ZP>,\r\n<-0.01885,0.05654,ZP>,\r\n<-0.01885,0.06911,ZP>,\r\n<-0.01886,0.08168,ZP>,\r\n<-0.01886,0.09425,ZP>,\r\n<-0.01886,0.10683,ZP>,\r\n<-0.01887,0.11941,ZP>,\r\n<-0.01887,0.13200,ZP>,\r\n<-0.01888,0.14459,ZP>,\r\n<-0.01888,0.15719,ZP>,\r\n<-0.01889,0.16979,ZP>,\r\n<-0.01890,0.18240,ZP>,\r\n<-0.01891,0.19502,ZP>,\r\n<-0.01892,0.20765,ZP>,\r\n<-0.01893,0.22029,ZP>,\r\n<-0.01894,0.23293,ZP>,\r\n<-0.01895,0.24559,ZP>,\r\n<-0.01897,0.25827,ZP>,\r\n<-0.01898,0.27095,ZP>,\r\n<-0.01900,0.28365,ZP>,\r\n<-0.01902,0.29637,ZP>,\r\n<-0.01904,0.30910,ZP>,\r\n<-0.01907,0.32184,ZP>,\r\n<-0.01910,0.33461,ZP>,\r\n<-0.01913,0.34739,ZP>,\r\n<-0.01916,0.36019,ZP>,\r\n<-0.01919,0.37301,ZP>,\r\n<-0.01923,0.38586,ZP>,\r\n<-0.01926,0.39872,ZP>,\r\n<-0.01929,0.41161,ZP>,\r\n<-0.01930,0.42451,ZP>,\r\n<-0.01930,0.43746,ZP>,\r\n<-0.01926,0.45038,ZP>,\r\n<-0.01921,0.46341,ZP>,\r\n<-0.01906,0.47629,ZP>,\r\n<-0.01903,0.48951,0.66019>,\r\n<-0.01899,0.49976,0.64900>,\r\n<-0.01854,0.49968,0.63589>,\r\n<-0.01797,0.49968,0.62275>,\r\n<-0.01743,0.49972,0.60968>,\r\n<-0.01679,0.49795,0.59688>,\r\n<-0.01614,0.49854,0.58421>\r\n<-0.00578,-0.50942,0.58454>,\r\n<-0.00567,-0.50798,0.59742>,\r\n<-0.00532,-0.50580,0.61026>,\r\n<-0.00528,-0.50333,0.62318>,\r\n<-0.00533,-0.49998,0.63607>,\r\n<-0.00560,-0.50010,0.64929>,\r\n<-0.00567,-0.48952,0.66017>,\r\n<-0.00574,-0.47629,ZP>,\r\n<-0.00587,-0.46336,ZP>,\r\n<-0.00596,-0.45035,ZP>,\r\n<-0.00604,-0.43745,ZP>,\r\n<-0.00609,-0.42453,ZP>,\r\n<-0.00614,-0.41165,ZP>,\r\n<-0.00617,-0.39878,ZP>,\r\n<-0.00620,-0.38593,ZP>,\r\n<-0.00623,-0.37309,ZP>,\r\n<-0.00626,-0.36027,ZP>,\r\n<-0.00628,-0.34747,ZP>,\r\n<-0.00630,-0.33468,ZP>,\r\n<-0.00631,-0.32191,ZP>,\r\n<-0.00632,-0.30916,ZP>,\r\n<-0.00633,-0.29642,ZP>,\r\n<-0.00633,-0.28370,ZP>,\r\n<-0.00633,-0.27099,ZP>,\r\n<-0.00633,-0.25830,ZP>,\r\n<-0.00633,-0.24562,ZP>,\r\n<-0.00633,-0.23296,ZP>,\r\n<-0.00632,-0.22030,ZP>,\r\n<-0.00632,-0.20766,ZP>,\r\n<-0.00631,-0.19503,ZP>,\r\n<-0.00631,-0.18241,ZP>,\r\n<-0.00631,-0.16980,ZP>,\r\n<-0.00630,-0.15719,ZP>,\r\n<-0.00630,-0.14460,ZP>,\r\n<-0.00630,-0.13200,ZP>,\r\n<-0.00629,-0.11942,ZP>,\r\n<-0.00629,-0.10683,ZP>,\r\n<-0.00629,-0.09426,ZP>,\r\n<-0.00629,-0.08168,ZP>,\r\n<-0.00629,-0.06911,ZP>,\r\n<-0.00629,-0.05654,ZP>,\r\n<-0.00629,-0.04398,ZP>,\r\n<-0.00628,-0.03141,ZP>,\r\n<-0.00628,-0.01885,ZP>,\r\n<-0.00628,-0.00628,ZP>,\r\n<-0.00628,0.00628,ZP>,\r\n<-0.00628,0.01884,ZP>,\r\n<-0.00628,0.03141,ZP>,\r\n<-0.00628,0.04397,ZP>,\r\n<-0.00628,0.05654,ZP>,\r\n<-0.00629,0.06911,ZP>,\r\n<-0.00629,0.08168,ZP>,\r\n<-0.00629,0.09425,ZP>,\r\n<-0.00629,0.10683,ZP>,\r\n<-0.00629,0.11941,ZP>,\r\n<-0.00629,0.13200,ZP>,\r\n<-0.00629,0.14459,ZP>,\r\n<-0.00629,0.15718,ZP>,\r\n<-0.00630,0.16979,ZP>,\r\n<-0.00630,0.18240,ZP>,\r\n<-0.00630,0.19501,ZP>,\r\n<-0.00630,0.20764,ZP>,\r\n<-0.00631,0.22028,ZP>,\r\n<-0.00631,0.23293,ZP>,\r\n<-0.00632,0.24559,ZP>,\r\n<-0.00632,0.25826,ZP>,\r\n<-0.00633,0.27094,ZP>,\r\n<-0.00634,0.28364,ZP>,\r\n<-0.00635,0.29636,ZP>,\r\n<-0.00636,0.30909,ZP>,\r\n<-0.00638,0.32183,ZP>,\r\n<-0.00639,0.33459,ZP>,\r\n<-0.00641,0.34737,ZP>,\r\n<-0.00644,0.36017,ZP>,\r\n<-0.00646,0.37299,ZP>,\r\n<-0.00649,0.38583,ZP>,\r\n<-0.00651,0.39869,ZP>,\r\n<-0.00653,0.41157,ZP>,\r\n<-0.00655,0.42446,ZP>,\r\n<-0.00655,0.43739,ZP>,\r\n<-0.00652,0.45032,ZP>,\r\n<-0.00647,0.46334,ZP>,\r\n<-0.00636,0.47630,ZP>,\r\n<-0.00629,0.48951,0.66018>,\r\n<-0.00626,0.50010,0.64927>,\r\n<-0.00615,0.49998,0.63613>,\r\n<-0.00604,0.50304,0.62320>,\r\n<-0.00607,0.50534,0.61041>,\r\n<-0.00658,0.50682,0.59745>,\r\n<-0.00661,0.50745,0.58482>\r\n<0.00639,-0.51331,0.58540>,\r\n<0.00658,-0.51126,0.59817>,\r\n<0.00665,-0.50856,0.61094>,\r\n<0.00676,-0.50536,0.62370>,\r\n<0.00689,-0.49996,0.63613>,\r\n<0.00703,-0.50008,0.64936>,\r\n<0.00698,-0.48944,0.66017>,\r\n<0.00690,-0.47623,ZP>,\r\n<0.00685,-0.46329,ZP>,\r\n<0.00678,-0.45028,ZP>,\r\n<0.00674,-0.43739,ZP>,\r\n<0.00668,-0.42448,ZP>,\r\n<0.00664,-0.41161,ZP>,\r\n<0.00659,-0.39875,ZP>,\r\n<0.00655,-0.38590,ZP>,\r\n<0.00651,-0.37307,ZP>,\r\n<0.00647,-0.36025,ZP>,\r\n<0.00644,-0.34745,ZP>,\r\n<0.00641,-0.33467,ZP>,\r\n<0.00638,-0.32190,ZP>,\r\n<0.00636,-0.30914,ZP>,\r\n<0.00634,-0.29641,ZP>,\r\n<0.00633,-0.28369,ZP>,\r\n<0.00632,-0.27098,ZP>,\r\n<0.00631,-0.25829,ZP>,\r\n<0.00630,-0.24562,ZP>,\r\n<0.00630,-0.23295,ZP>,\r\n<0.00630,-0.22030,ZP>,\r\n<0.00629,-0.20766,ZP>,\r\n<0.00629,-0.19503,ZP>,\r\n<0.00629,-0.18241,ZP>,\r\n<0.00629,-0.16980,ZP>,\r\n<0.00629,-0.15719,ZP>,\r\n<0.00629,-0.14460,ZP>,\r\n<0.00629,-0.13200,ZP>,\r\n<0.00628,-0.11942,ZP>,\r\n<0.00628,-0.10683,ZP>,\r\n<0.00628,-0.09426,ZP>,\r\n<0.00628,-0.08168,ZP>,\r\n<0.00628,-0.06911,ZP>,\r\n<0.00628,-0.05654,ZP>,\r\n<0.00628,-0.04398,ZP>,\r\n<0.00628,-0.03141,ZP>,\r\n<0.00628,-0.01885,ZP>,\r\n<0.00628,-0.00628,ZP>,\r\n<0.00628,0.00628,ZP>,\r\n<0.00628,0.01884,ZP>,\r\n<0.00628,0.03141,ZP>,\r\n<0.00628,0.04397,ZP>,\r\n<0.00628,0.05654,ZP>,\r\n<0.00628,0.06911,ZP>,\r\n<0.00628,0.08168,ZP>,\r\n<0.00628,0.09425,ZP>,\r\n<0.00629,0.10683,ZP>,\r\n<0.00629,0.11941,ZP>,\r\n<0.00629,0.13200,ZP>,\r\n<0.00629,0.14459,ZP>,\r\n<0.00629,0.15718,ZP>,\r\n<0.00630,0.16979,ZP>,\r\n<0.00630,0.18240,ZP>,\r\n<0.00630,0.19501,ZP>,\r\n<0.00631,0.20764,ZP>,\r\n<0.00631,0.22028,ZP>,\r\n<0.00631,0.23293,ZP>,\r\n<0.00632,0.24559,ZP>,\r\n<0.00632,0.25826,ZP>,\r\n<0.00632,0.27094,ZP>,\r\n<0.00632,0.28364,ZP>,\r\n<0.00632,0.29636,ZP>,\r\n<0.00632,0.30909,ZP>,\r\n<0.00632,0.32183,ZP>,\r\n<0.00631,0.33460,ZP>,\r\n<0.00630,0.34738,ZP>,\r\n<0.00629,0.36018,ZP>,\r\n<0.00627,0.37299,ZP>,\r\n<0.00625,0.38583,ZP>,\r\n<0.00624,0.39868,ZP>,\r\n<0.00622,0.41156,ZP>,\r\n<0.00621,0.42445,ZP>,\r\n<0.00621,0.43737,ZP>,\r\n<0.00622,0.45028,ZP>,\r\n<0.00626,0.46329,ZP>,\r\n<0.00635,0.47626,ZP>,\r\n<0.00656,0.48946,0.66019>,\r\n<0.00673,0.50011,0.64931>,\r\n<0.00646,0.49999,0.63619>,\r\n<0.00646,0.50283,0.62338>,\r\n<0.00641,0.50518,0.61030>,\r\n<0.00601,0.50652,0.59743>,\r\n<0.00598,0.50775,0.58458>\r\n<0.01826,-0.50895,0.58428>,\r\n<0.01847,-0.50758,0.59723>,\r\n<0.01865,-0.50556,0.61004>,\r\n<0.01877,-0.50309,0.62295>,\r\n<0.01914,-0.49965,0.63583>,\r\n<0.01966,-0.49973,0.64902>,\r\n<0.01963,-0.48942,0.66018>,\r\n<0.01955,-0.47617,ZP>,\r\n<0.01958,-0.46329,ZP>,\r\n<0.01954,-0.45027,ZP>,\r\n<0.01952,-0.43739,ZP>,\r\n<0.01947,-0.42448,ZP>,\r\n<0.01942,-0.41161,ZP>,\r\n<0.01936,-0.39875,ZP>,\r\n<0.01931,-0.38590,ZP>,\r\n<0.01926,-0.37307,ZP>,\r\n<0.01920,-0.36026,ZP>,\r\n<0.01916,-0.34745,ZP>,\r\n<0.01911,-0.33467,ZP>,\r\n<0.01908,-0.32190,ZP>,\r\n<0.01904,-0.30915,ZP>,\r\n<0.01901,-0.29641,ZP>,\r\n<0.01899,-0.28369,ZP>,\r\n<0.01897,-0.27099,ZP>,\r\n<0.01895,-0.25830,ZP>,\r\n<0.01894,-0.24562,ZP>,\r\n<0.01893,-0.23296,ZP>,\r\n<0.01892,-0.22031,ZP>,\r\n<0.01891,-0.20767,ZP>,\r\n<0.01890,-0.19504,ZP>,\r\n<0.01889,-0.18242,ZP>,\r\n<0.01888,-0.16980,ZP>,\r\n<0.01888,-0.15720,ZP>,\r\n<0.01887,-0.14460,ZP>,\r\n<0.01887,-0.13201,ZP>,\r\n<0.01886,-0.11942,ZP>,\r\n<0.01886,-0.10684,ZP>,\r\n<0.01885,-0.09426,ZP>,\r\n<0.01885,-0.08168,ZP>,\r\n<0.01885,-0.06911,ZP>,\r\n<0.01885,-0.05654,ZP>,\r\n<0.01885,-0.04398,ZP>,\r\n<0.01884,-0.03141,ZP>,\r\n<0.01884,-0.01885,ZP>,\r\n<0.01884,-0.00628,ZP>,\r\n<0.01884,0.00628,ZP>,\r\n<0.01884,0.01884,ZP>,\r\n<0.01884,0.03141,ZP>,\r\n<0.01885,0.04397,ZP>,\r\n<0.01885,0.05654,ZP>,\r\n<0.01885,0.06911,ZP>,\r\n<0.01885,0.08168,ZP>,\r\n<0.01886,0.09425,ZP>,\r\n<0.01886,0.10683,ZP>,\r\n<0.01886,0.11941,ZP>,\r\n<0.01887,0.13200,ZP>,\r\n<0.01888,0.14459,ZP>,\r\n<0.01888,0.15719,ZP>,\r\n<0.01889,0.16979,ZP>,\r\n<0.01890,0.18240,ZP>,\r\n<0.01891,0.19502,ZP>,\r\n<0.01892,0.20765,ZP>,\r\n<0.01893,0.22029,ZP>,\r\n<0.01894,0.23294,ZP>,\r\n<0.01895,0.24560,ZP>,\r\n<0.01896,0.25827,ZP>,\r\n<0.01897,0.27096,ZP>,\r\n<0.01899,0.28366,ZP>,\r\n<0.01899,0.29637,ZP>,\r\n<0.01900,0.30911,ZP>,\r\n<0.01901,0.32185,ZP>,\r\n<0.01901,0.33462,ZP>,\r\n<0.01901,0.34740,ZP>,\r\n<0.01901,0.36020,ZP>,\r\n<0.01901,0.37302,ZP>,\r\n<0.01900,0.38585,ZP>,\r\n<0.01899,0.39871,ZP>,\r\n<0.01898,0.41159,ZP>,\r\n<0.01897,0.42447,ZP>,\r\n<0.01898,0.43739,ZP>,\r\n<0.01897,0.45027,ZP>,\r\n<0.01901,0.46328,ZP>,\r\n<0.01901,0.47614,ZP>,\r\n<0.01925,0.48939,0.66020>,\r\n<0.01945,0.49978,0.64903>,\r\n<0.01883,0.49969,0.63584>,\r\n<0.01820,0.49969,0.62272>,\r\n<0.01721,0.49971,0.60941>,\r\n<0.01668,0.49976,0.59671>,\r\n<0.01600,0.49991,0.58354>\r\n<0.02602,-0.49825,0.58343>,\r\n<0.02743,-0.49815,0.59617>,\r\n<0.02904,-0.49917,0.60895>,\r\n<0.03027,-0.49909,0.62200>,\r\n<0.03142,-0.49904,0.63526>,\r\n<0.03227,-0.49906,0.64831>,\r\n<0.03232,-0.48953,0.66019>,\r\n<0.03222,-0.47614,ZP>,\r\n<0.03235,-0.46338,ZP>,\r\n<0.03231,-0.45033,ZP>,\r\n<0.03231,-0.43745,ZP>,\r\n<0.03225,-0.42452,ZP>,\r\n<0.03220,-0.41165,ZP>,\r\n<0.03213,-0.39878,ZP>,\r\n<0.03207,-0.38593,ZP>,\r\n<0.03200,-0.37309,ZP>,\r\n<0.03194,-0.36028,ZP>,\r\n<0.03188,-0.34747,ZP>,\r\n<0.03182,-0.33469,ZP>,\r\n<0.03177,-0.32192,ZP>,\r\n<0.03173,-0.30917,ZP>,\r\n<0.03169,-0.29643,ZP>,\r\n<0.03165,-0.28371,ZP>,\r\n<0.03163,-0.27100,ZP>,\r\n<0.03160,-0.25831,ZP>,\r\n<0.03158,-0.24564,ZP>,\r\n<0.03156,-0.23297,ZP>,\r\n<0.03154,-0.22032,ZP>,\r\n<0.03152,-0.20768,ZP>,\r\n<0.03151,-0.19505,ZP>,\r\n<0.03149,-0.18243,ZP>,\r\n<0.03148,-0.16981,ZP>,\r\n<0.03147,-0.15721,ZP>,\r\n<0.03146,-0.14461,ZP>,\r\n<0.03145,-0.13201,ZP>,\r\n<0.03144,-0.11943,ZP>,\r\n<0.03143,-0.10684,ZP>,\r\n<0.03143,-0.09426,ZP>,\r\n<0.03142,-0.08169,ZP>,\r\n<0.03142,-0.06912,ZP>,\r\n<0.03141,-0.05655,ZP>,\r\n<0.03141,-0.04398,ZP>,\r\n<0.03141,-0.03141,ZP>,\r\n<0.03141,-0.01885,ZP>,\r\n<0.03141,-0.00628,ZP>,\r\n<0.03141,0.00628,ZP>,\r\n<0.03141,0.01885,ZP>,\r\n<0.03141,0.03141,ZP>,\r\n<0.03141,0.04398,ZP>,\r\n<0.03141,0.05654,ZP>,\r\n<0.03142,0.06911,ZP>,\r\n<0.03142,0.08168,ZP>,\r\n<0.03143,0.09426,ZP>,\r\n<0.03143,0.10684,ZP>,\r\n<0.03144,0.11942,ZP>,\r\n<0.03145,0.13201,ZP>,\r\n<0.03146,0.14460,ZP>,\r\n<0.03147,0.15720,ZP>,\r\n<0.03148,0.16980,ZP>,\r\n<0.03150,0.18242,ZP>,\r\n<0.03151,0.19504,ZP>,\r\n<0.03153,0.20767,ZP>,\r\n<0.03155,0.22031,ZP>,\r\n<0.03157,0.23296,ZP>,\r\n<0.03159,0.24562,ZP>,\r\n<0.03161,0.25830,ZP>,\r\n<0.03163,0.27098,ZP>,\r\n<0.03165,0.28369,ZP>,\r\n<0.03167,0.29641,ZP>,\r\n<0.03169,0.30914,ZP>,\r\n<0.03171,0.32189,ZP>,\r\n<0.03172,0.33466,ZP>,\r\n<0.03173,0.34744,ZP>,\r\n<0.03174,0.36024,ZP>,\r\n<0.03175,0.37306,ZP>,\r\n<0.03175,0.38590,ZP>,\r\n<0.03175,0.39876,ZP>,\r\n<0.03175,0.41164,ZP>,\r\n<0.03174,0.42452,ZP>,\r\n<0.03176,0.43746,ZP>,\r\n<0.03175,0.45031,ZP>,\r\n<0.03181,0.46334,ZP>,\r\n<0.03171,0.47594,ZP>,\r\n<0.03188,0.48933,0.66019>,\r\n<0.03722,0.49551,0.65000>,\r\n<0.03110,0.49907,0.63537>,\r\n<0.03011,0.49911,0.62206>,\r\n<0.02924,0.49918,0.60887>,\r\n<0.02842,0.49615,0.59609>,\r\n<0.02755,0.49528,0.58308>\r\n<0.03884,-0.49685,0.58213>,\r\n<0.04017,-0.49656,0.59496>,\r\n<0.04130,-0.49831,0.60786>,\r\n<0.04241,-0.49821,0.62091>,\r\n<0.04365,-0.49812,0.63427>,\r\n<0.04478,-0.49806,0.64720>,\r\n<0.04505,-0.48989,ZP>,\r\n<0.04496,-0.47620,ZP>,\r\n<0.04515,-0.46357,ZP>,\r\n<0.04509,-0.45044,ZP>,\r\n<0.04509,-0.43756,ZP>,\r\n<0.04503,-0.42460,ZP>,\r\n<0.04498,-0.41171,ZP>,\r\n<0.04491,-0.39883,ZP>,\r\n<0.04483,-0.38598,ZP>,\r\n<0.04475,-0.37314,ZP>,\r\n<0.04468,-0.36032,ZP>,\r\n<0.04460,-0.34751,ZP>,\r\n<0.04454,-0.33472,ZP>,\r\n<0.04447,-0.32195,ZP>,\r\n<0.04442,-0.30920,ZP>,\r\n<0.04437,-0.29646,ZP>,\r\n<0.04432,-0.28374,ZP>,\r\n<0.04429,-0.27103,ZP>,\r\n<0.04425,-0.25834,ZP>,\r\n<0.04422,-0.24566,ZP>,\r\n<0.04419,-0.23300,ZP>,\r\n<0.04416,-0.22034,ZP>,\r\n<0.04414,-0.20770,ZP>,\r\n<0.04412,-0.19507,ZP>,\r\n<0.04410,-0.18244,ZP>,\r\n<0.04408,-0.16983,ZP>,\r\n<0.04406,-0.15722,ZP>,\r\n<0.04405,-0.14462,ZP>,\r\n<0.04403,-0.13202,ZP>,\r\n<0.04402,-0.11944,ZP>,\r\n<0.04401,-0.10685,ZP>,\r\n<0.04400,-0.09427,ZP>,\r\n<0.04399,-0.08169,ZP>,\r\n<0.04399,-0.06912,ZP>,\r\n<0.04398,-0.05655,ZP>,\r\n<0.04398,-0.04398,ZP>,\r\n<0.04397,-0.03141,ZP>,\r\n<0.04397,-0.01885,ZP>,\r\n<0.04397,-0.00628,ZP>,\r\n<0.04397,0.00628,ZP>,\r\n<0.04397,0.01885,ZP>,\r\n<0.04397,0.03141,ZP>,\r\n<0.04398,0.04398,ZP>,\r\n<0.04398,0.05655,ZP>,\r\n<0.04399,0.06912,ZP>,\r\n<0.04399,0.08169,ZP>,\r\n<0.04400,0.09427,ZP>,\r\n<0.04401,0.10685,ZP>,\r\n<0.04402,0.11943,ZP>,\r\n<0.04403,0.13202,ZP>,\r\n<0.04405,0.14461,ZP>,\r\n<0.04406,0.15721,ZP>,\r\n<0.04408,0.16982,ZP>,\r\n<0.04410,0.18243,ZP>,\r\n<0.04412,0.19506,ZP>,\r\n<0.04415,0.20769,ZP>,\r\n<0.04417,0.22033,ZP>,\r\n<0.04420,0.23299,ZP>,\r\n<0.04423,0.24565,ZP>,\r\n<0.04426,0.25833,ZP>,\r\n<0.04429,0.27102,ZP>,\r\n<0.04432,0.28373,ZP>,\r\n<0.04435,0.29645,ZP>,\r\n<0.04438,0.30919,ZP>,\r\n<0.04441,0.32194,ZP>,\r\n<0.04444,0.33471,ZP>,\r\n<0.04446,0.34750,ZP>,\r\n<0.04448,0.36031,ZP>,\r\n<0.04449,0.37314,ZP>,\r\n<0.04450,0.38598,ZP>,\r\n<0.04451,0.39884,ZP>,\r\n<0.04452,0.41173,ZP>,\r\n<0.04452,0.42461,ZP>,\r\n<0.04454,0.43756,ZP>,\r\n<0.04455,0.45039,ZP>,\r\n<0.04463,0.46349,ZP>,\r\n<0.04474,0.47575,ZP>,\r\n<0.04474,0.48953,0.66008>,\r\n<0.04444,0.49808,0.64709>,\r\n<0.04318,0.49815,0.63423>,\r\n<0.04232,0.49821,0.62081>,\r\n<0.04142,0.49829,0.60781>,\r\n<0.04065,0.49770,0.59495>,\r\n<0.04018,0.49764,0.58209>\r\n<0.04922,-0.50534,0.58125>,\r\n<0.05097,-0.50411,0.59391>,\r\n<0.05272,-0.50243,0.60673>,\r\n<0.05422,-0.50059,0.61979>,\r\n<0.05564,-0.49690,0.63291>,\r\n<0.05749,-0.49555,0.64538>,\r\n<0.05787,-0.49048,0.65953>,\r\n<0.05775,-0.47637,ZP>,\r\n<0.05794,-0.46385,ZP>,\r\n<0.05786,-0.45060,ZP>,\r\n<0.05786,-0.43770,ZP>,\r\n<0.05781,-0.42471,ZP>,\r\n<0.05776,-0.41181,ZP>,\r\n<0.05768,-0.39892,ZP>,\r\n<0.05760,-0.38605,ZP>,\r\n<0.05751,-0.37320,ZP>,\r\n<0.05742,-0.36038,ZP>,\r\n<0.05734,-0.34757,ZP>,\r\n<0.05726,-0.33477,ZP>,\r\n<0.05718,-0.32200,ZP>,\r\n<0.05712,-0.30924,ZP>,\r\n<0.05706,-0.29651,ZP>,\r\n<0.05700,-0.28378,ZP>,\r\n<0.05695,-0.27107,ZP>,\r\n<0.05691,-0.25838,ZP>,\r\n<0.05687,-0.24570,ZP>,\r\n<0.05683,-0.23303,ZP>,\r\n<0.05679,-0.22038,ZP>,\r\n<0.05676,-0.20773,ZP>,\r\n<0.05673,-0.19510,ZP>,\r\n<0.05670,-0.18247,ZP>,\r\n<0.05668,-0.16985,ZP>,\r\n<0.05666,-0.15724,ZP>,\r\n<0.05664,-0.14464,ZP>,\r\n<0.05662,-0.13204,ZP>,\r\n<0.05660,-0.11945,ZP>,\r\n<0.05659,-0.10686,ZP>,\r\n<0.05658,-0.09428,ZP>,\r\n<0.05657,-0.08170,ZP>,\r\n<0.05656,-0.06913,ZP>,\r\n<0.05655,-0.05656,ZP>,\r\n<0.05655,-0.04399,ZP>,\r\n<0.05654,-0.03142,ZP>,\r\n<0.05654,-0.01885,ZP>,\r\n<0.05654,-0.00628,ZP>,\r\n<0.05654,0.00628,ZP>,\r\n<0.05654,0.01885,ZP>,\r\n<0.05654,0.03142,ZP>,\r\n<0.05655,0.04398,ZP>,\r\n<0.05655,0.05655,ZP>,\r\n<0.05656,0.06912,ZP>,\r\n<0.05657,0.08170,ZP>,\r\n<0.05658,0.09428,ZP>,\r\n<0.05659,0.10686,ZP>,\r\n<0.05660,0.11944,ZP>,\r\n<0.05662,0.13203,ZP>,\r\n<0.05664,0.14463,ZP>,\r\n<0.05666,0.15723,ZP>,\r\n<0.05668,0.16984,ZP>,\r\n<0.05671,0.18246,ZP>,\r\n<0.05674,0.19509,ZP>,\r\n<0.05677,0.20772,ZP>,\r\n<0.05680,0.22037,ZP>,\r\n<0.05684,0.23303,ZP>,\r\n<0.05687,0.24569,ZP>,\r\n<0.05691,0.25838,ZP>,\r\n<0.05695,0.27107,ZP>,\r\n<0.05699,0.28378,ZP>,\r\n<0.05704,0.29651,ZP>,\r\n<0.05708,0.30925,ZP>,\r\n<0.05712,0.32201,ZP>,\r\n<0.05716,0.33479,ZP>,\r\n<0.05719,0.34758,ZP>,\r\n<0.05722,0.36040,ZP>,\r\n<0.05725,0.37323,ZP>,\r\n<0.05727,0.38608,ZP>,\r\n<0.05728,0.39895,ZP>,\r\n<0.05729,0.41185,ZP>,\r\n<0.05730,0.42474,ZP>,\r\n<0.05732,0.43771,ZP>,\r\n<0.05735,0.45054,ZP>,\r\n<0.05745,0.46375,ZP>,\r\n<0.05762,0.47614,ZP>,\r\n<0.05760,0.49032,0.65957>,\r\n<0.05701,0.49676,0.64569>,\r\n<0.05559,0.49700,0.63249>,\r\n<0.05397,0.50187,0.62006>,\r\n<0.05234,0.50415,0.60727>,\r\n<0.05050,0.50631,0.59433>,\r\n<0.04881,0.50745,0.58153>\r\n<0.06187,-0.50360,0.57943>,\r\n<0.06355,-0.50267,0.59206>,\r\n<0.06495,-0.50094,0.60506>,\r\n<0.06621,-0.49876,0.61800>,\r\n<0.06762,-0.49541,0.63113>,\r\n<0.06953,-0.49515,0.64378>,\r\n<0.07077,-0.49120,0.65819>,\r\n<0.07054,-0.47664,ZP>,\r\n<0.07066,-0.46412,ZP>,\r\n<0.07062,-0.45078,ZP>,\r\n<0.07062,-0.43786,ZP>,\r\n<0.07059,-0.42486,ZP>,\r\n<0.07053,-0.41194,ZP>,\r\n<0.07046,-0.39903,ZP>,\r\n<0.07037,-0.38615,ZP>,\r\n<0.07027,-0.37329,ZP>,\r\n<0.07017,-0.36046,ZP>,\r\n<0.07007,-0.34764,ZP>,\r\n<0.06998,-0.33484,ZP>,\r\n<0.06990,-0.32207,ZP>,\r\n<0.06982,-0.30931,ZP>,\r\n<0.06975,-0.29657,ZP>,\r\n<0.06969,-0.28384,ZP>,\r\n<0.06963,-0.27113,ZP>,\r\n<0.06957,-0.25843,ZP>,\r\n<0.06952,-0.24575,ZP>,\r\n<0.06947,-0.23308,ZP>,\r\n<0.06943,-0.22042,ZP>,\r\n<0.06939,-0.20777,ZP>,\r\n<0.06935,-0.19513,ZP>,\r\n<0.06932,-0.18250,ZP>,\r\n<0.06928,-0.16988,ZP>,\r\n<0.06926,-0.15727,ZP>,\r\n<0.06923,-0.14466,ZP>,\r\n<0.06921,-0.13206,ZP>,\r\n<0.06919,-0.11947,ZP>,\r\n<0.06917,-0.10688,ZP>,\r\n<0.06916,-0.09429,ZP>,\r\n<0.06914,-0.08171,ZP>,\r\n<0.06913,-0.06914,ZP>,\r\n<0.06912,-0.05656,ZP>,\r\n<0.06912,-0.04399,ZP>,\r\n<0.06911,-0.03142,ZP>,\r\n<0.06911,-0.01885,ZP>,\r\n<0.06911,-0.00628,ZP>,\r\n<0.06911,0.00628,ZP>,\r\n<0.06911,0.01885,ZP>,\r\n<0.06911,0.03142,ZP>,\r\n<0.06912,0.04399,ZP>,\r\n<0.06912,0.05656,ZP>,\r\n<0.06913,0.06913,ZP>,\r\n<0.06914,0.08171,ZP>,\r\n<0.06916,0.09429,ZP>,\r\n<0.06917,0.10687,ZP>,\r\n<0.06919,0.11946,ZP>,\r\n<0.06921,0.13205,ZP>,\r\n<0.06923,0.14465,ZP>,\r\n<0.06926,0.15726,ZP>,\r\n<0.06928,0.16987,ZP>,\r\n<0.06932,0.18249,ZP>,\r\n<0.06935,0.19512,ZP>,\r\n<0.06939,0.20776,ZP>,\r\n<0.06943,0.22041,ZP>,\r\n<0.06948,0.23307,ZP>,\r\n<0.06952,0.24575,ZP>,\r\n<0.06957,0.25844,ZP>,\r\n<0.06963,0.27114,ZP>,\r\n<0.06968,0.28385,ZP>,\r\n<0.06973,0.29658,ZP>,\r\n<0.06978,0.30933,ZP>,\r\n<0.06984,0.32210,ZP>,\r\n<0.06988,0.33488,ZP>,\r\n<0.06993,0.34769,ZP>,\r\n<0.06997,0.36051,ZP>,\r\n<0.07001,0.37335,ZP>,\r\n<0.07004,0.38622,ZP>,\r\n<0.07006,0.39910,ZP>,\r\n<0.07007,0.41200,ZP>,\r\n<0.07009,0.42491,ZP>,\r\n<0.07010,0.43789,ZP>,\r\n<0.07013,0.45075,ZP>,\r\n<0.07018,0.46407,ZP>,\r\n<0.07000,0.47668,ZP>,\r\n<0.07016,0.49126,0.65821>,\r\n<0.06900,0.49522,0.64376>,\r\n<0.06717,0.49812,0.63148>,\r\n<0.06609,0.50266,0.61875>,\r\n<0.06440,0.50623,0.60626>,\r\n<0.06286,0.50905,0.59336>,\r\n<0.06096,0.51145,0.58101>\r\n<0.06975,-0.49319,0.57760>,\r\n<0.07215,-0.49280,0.59023>,\r\n<0.07488,-0.49439,0.60294>,\r\n<0.07716,-0.49402,0.61572>,\r\n<0.07938,-0.49367,0.62899>,\r\n<0.08173,-0.49328,0.64150>,\r\n<0.08361,-0.49148,0.65577>,\r\n<0.08329,-0.47697,ZP>,\r\n<0.08331,-0.46431,ZP>,\r\n<0.08338,-0.45100,ZP>,\r\n<0.08338,-0.43805,ZP>,\r\n<0.08338,-0.42504,ZP>,\r\n<0.08332,-0.41209,ZP>,\r\n<0.08324,-0.39917,ZP>,\r\n<0.08314,-0.38627,ZP>,\r\n<0.08304,-0.37340,ZP>,\r\n<0.08293,-0.36056,ZP>,\r\n<0.08282,-0.34773,ZP>,\r\n<0.08272,-0.33493,ZP>,\r\n<0.08263,-0.32215,ZP>,\r\n<0.08254,-0.30939,ZP>,\r\n<0.08246,-0.29665,ZP>,\r\n<0.08238,-0.28392,ZP>,\r\n<0.08231,-0.27120,ZP>,\r\n<0.08225,-0.25850,ZP>,\r\n<0.08218,-0.24581,ZP>,\r\n<0.08213,-0.23314,ZP>,\r\n<0.08207,-0.22047,ZP>,\r\n<0.08202,-0.20782,ZP>,\r\n<0.08197,-0.19518,ZP>,\r\n<0.08193,-0.18254,ZP>,\r\n<0.08189,-0.16991,ZP>,\r\n<0.08186,-0.15730,ZP>,\r\n<0.08183,-0.14469,ZP>,\r\n<0.08180,-0.13208,ZP>,\r\n<0.08178,-0.11949,ZP>,\r\n<0.08176,-0.10690,ZP>,\r\n<0.08174,-0.09431,ZP>,\r\n<0.08172,-0.08173,ZP>,\r\n<0.08171,-0.06915,ZP>,\r\n<0.08170,-0.05657,ZP>,\r\n<0.08169,-0.04400,ZP>,\r\n<0.08168,-0.03143,ZP>,\r\n<0.08168,-0.01885,ZP>,\r\n<0.08168,-0.00628,ZP>,\r\n<0.08168,0.00628,ZP>,\r\n<0.08168,0.01885,ZP>,\r\n<0.08168,0.03142,ZP>,\r\n<0.08169,0.04400,ZP>,\r\n<0.08170,0.05657,ZP>,\r\n<0.08171,0.06914,ZP>,\r\n<0.08172,0.08172,ZP>,\r\n<0.08174,0.09430,ZP>,\r\n<0.08175,0.10689,ZP>,\r\n<0.08178,0.11948,ZP>,\r\n<0.08180,0.13208,ZP>,\r\n<0.08183,0.14468,ZP>,\r\n<0.08186,0.15729,ZP>,\r\n<0.08189,0.16990,ZP>,\r\n<0.08193,0.18253,ZP>,\r\n<0.08197,0.19517,ZP>,\r\n<0.08202,0.20781,ZP>,\r\n<0.08207,0.22047,ZP>,\r\n<0.08213,0.23313,ZP>,\r\n<0.08218,0.24581,ZP>,\r\n<0.08224,0.25851,ZP>,\r\n<0.08231,0.27122,ZP>,\r\n<0.08237,0.28394,ZP>,\r\n<0.08244,0.29668,ZP>,\r\n<0.08250,0.30943,ZP>,\r\n<0.08256,0.32221,ZP>,\r\n<0.08262,0.33500,ZP>,\r\n<0.08268,0.34781,ZP>,\r\n<0.08273,0.36065,ZP>,\r\n<0.08278,0.37350,ZP>,\r\n<0.08282,0.38638,ZP>,\r\n<0.08285,0.39927,ZP>,\r\n<0.08286,0.41219,ZP>,\r\n<0.08289,0.42513,ZP>,\r\n<0.08287,0.43812,ZP>,\r\n<0.08287,0.45105,ZP>,\r\n<0.08277,0.46437,ZP>,\r\n<0.08267,0.47707,ZP>,\r\n<0.08297,0.49156,0.65580>,\r\n<0.08096,0.49357,0.64159>,\r\n<0.07853,0.49507,0.62897>,\r\n<0.07715,0.49865,0.61610>,\r\n<0.07574,0.50139,0.60335>,\r\n<0.07426,0.50394,0.59035>,\r\n<0.07277,0.50603,0.57813>\r\n<0.08225,-0.49080,0.57537>,\r\n<0.08472,-0.49095,0.58797>,\r\n<0.08695,-0.49241,0.60062>,\r\n<0.08910,-0.49200,0.61331>,\r\n<0.09119,-0.49185,0.62639>,\r\n<0.09372,-0.49115,0.63897>,\r\n<0.09616,-0.49057,0.65256>,\r\n<0.09600,-0.47735,0.66010>,\r\n<0.09595,-0.46442,ZP>,\r\n<0.09619,-0.45130,ZP>,\r\n<0.09615,-0.43827,ZP>,\r\n<0.09617,-0.42526,ZP>,\r\n<0.09610,-0.41228,ZP>,\r\n<0.09603,-0.39934,ZP>,\r\n<0.09592,-0.38642,ZP>,\r\n<0.09581,-0.37354,ZP>,\r\n<0.09570,-0.36068,ZP>,\r\n<0.09559,-0.34785,ZP>,\r\n<0.09548,-0.33504,ZP>,\r\n<0.09537,-0.32226,ZP>,\r\n<0.09528,-0.30949,ZP>,\r\n<0.09518,-0.29674,ZP>,\r\n<0.09509,-0.28401,ZP>,\r\n<0.09501,-0.27129,ZP>,\r\n<0.09493,-0.25859,ZP>,\r\n<0.09486,-0.24589,ZP>,\r\n<0.09479,-0.23321,ZP>,\r\n<0.09472,-0.22054,ZP>,\r\n<0.09466,-0.20788,ZP>,\r\n<0.09461,-0.19523,ZP>,\r\n<0.09456,-0.18259,ZP>,\r\n<0.09451,-0.16996,ZP>,\r\n<0.09447,-0.15733,ZP>,\r\n<0.09443,-0.14472,ZP>,\r\n<0.09440,-0.13211,ZP>,\r\n<0.09437,-0.11951,ZP>,\r\n<0.09434,-0.10692,ZP>,\r\n<0.09432,-0.09433,ZP>,\r\n<0.09430,-0.08174,ZP>,\r\n<0.09429,-0.06916,ZP>,\r\n<0.09428,-0.05658,ZP>,\r\n<0.09427,-0.04400,ZP>,\r\n<0.09426,-0.03143,ZP>,\r\n<0.09425,-0.01886,ZP>,\r\n<0.09425,-0.00629,ZP>,\r\n<0.09425,0.00629,ZP>,\r\n<0.09425,0.01886,ZP>,\r\n<0.09426,0.03143,ZP>,\r\n<0.09427,0.04400,ZP>,\r\n<0.09428,0.05658,ZP>,\r\n<0.09429,0.06916,ZP>,\r\n<0.09430,0.08174,ZP>,\r\n<0.09432,0.09432,ZP>,\r\n<0.09434,0.10691,ZP>,\r\n<0.09437,0.11951,ZP>,\r\n<0.09440,0.13210,ZP>,\r\n<0.09443,0.14471,ZP>,\r\n<0.09447,0.15732,ZP>,\r\n<0.09451,0.16995,ZP>,\r\n<0.09455,0.18258,ZP>,\r\n<0.09460,0.19522,ZP>,\r\n<0.09466,0.20787,ZP>,\r\n<0.09472,0.22053,ZP>,\r\n<0.09478,0.23321,ZP>,\r\n<0.09485,0.24589,ZP>,\r\n<0.09492,0.25859,ZP>,\r\n<0.09500,0.27131,ZP>,\r\n<0.09508,0.28404,ZP>,\r\n<0.09515,0.29679,ZP>,\r\n<0.09523,0.30955,ZP>,\r\n<0.09530,0.32233,ZP>,\r\n<0.09538,0.33514,ZP>,\r\n<0.09544,0.34796,ZP>,\r\n<0.09551,0.36081,ZP>,\r\n<0.09556,0.37368,ZP>,\r\n<0.09561,0.38657,ZP>,\r\n<0.09565,0.39949,ZP>,\r\n<0.09566,0.41243,ZP>,\r\n<0.09568,0.42540,ZP>,\r\n<0.09563,0.43840,ZP>,\r\n<0.09564,0.45145,ZP>,\r\n<0.09536,0.46459,ZP>,\r\n<0.09535,0.47751,0.66010>,\r\n<0.09552,0.49073,0.65245>,\r\n<0.09301,0.49128,0.63892>,\r\n<0.09003,0.49184,0.62638>,\r\n<0.08717,0.49236,0.61333>,\r\n<0.08413,0.49289,0.60067>,\r\n<0.08084,0.49308,0.58783>,\r\n<0.07797,0.49418,0.57548>\r\n<0.09297,-0.49695,0.57278>,\r\n<0.09551,-0.49702,0.58557>,\r\n<0.09789,-0.49705,0.59825>,\r\n<0.10056,-0.49584,0.61104>,\r\n<0.10319,-0.49347,0.62385>,\r\n<0.10573,-0.48939,0.63621>,\r\n<0.10836,-0.48823,0.64916>,\r\n<0.10880,-0.47778,0.66021>,\r\n<0.10868,-0.46456,ZP>,\r\n<0.10902,-0.45169,ZP>,\r\n<0.10893,-0.43852,ZP>,\r\n<0.10896,-0.42551,ZP>,\r\n<0.10889,-0.41250,ZP>,\r\n<0.10881,-0.39953,ZP>,\r\n<0.10871,-0.38660,ZP>,\r\n<0.10860,-0.37370,ZP>,\r\n<0.10848,-0.36083,ZP>,\r\n<0.10836,-0.34799,ZP>,\r\n<0.10825,-0.33518,ZP>,\r\n<0.10814,-0.32239,ZP>,\r\n<0.10803,-0.30962,ZP>,\r\n<0.10792,-0.29686,ZP>,\r\n<0.10782,-0.28412,ZP>,\r\n<0.10772,-0.27140,ZP>,\r\n<0.10763,-0.25868,ZP>,\r\n<0.10754,-0.24598,ZP>,\r\n<0.10746,-0.23329,ZP>,\r\n<0.10738,-0.22061,ZP>,\r\n<0.10731,-0.20795,ZP>,\r\n<0.10724,-0.19529,ZP>,\r\n<0.10719,-0.18264,ZP>,\r\n<0.10713,-0.17001,ZP>,\r\n<0.10708,-0.15738,ZP>,\r\n<0.10704,-0.14476,ZP>,\r\n<0.10700,-0.13215,ZP>,\r\n<0.10697,-0.11954,ZP>,\r\n<0.10694,-0.10694,ZP>,\r\n<0.10691,-0.09435,ZP>,\r\n<0.10689,-0.08176,ZP>,\r\n<0.10687,-0.06917,ZP>,\r\n<0.10686,-0.05659,ZP>,\r\n<0.10684,-0.04401,ZP>,\r\n<0.10684,-0.03144,ZP>,\r\n<0.10683,-0.01886,ZP>,\r\n<0.10683,-0.00629,ZP>,\r\n<0.10683,0.00629,ZP>,\r\n<0.10683,0.01886,ZP>,\r\n<0.10684,0.03144,ZP>,\r\n<0.10685,0.04401,ZP>,\r\n<0.10686,0.05659,ZP>,\r\n<0.10687,0.06917,ZP>,\r\n<0.10689,0.08176,ZP>,\r\n<0.10691,0.09434,ZP>,\r\n<0.10694,0.10694,ZP>,\r\n<0.10697,0.11953,ZP>,\r\n<0.10700,0.13214,ZP>,\r\n<0.10704,0.14475,ZP>,\r\n<0.10708,0.15737,ZP>,\r\n<0.10713,0.16999,ZP>,\r\n<0.10718,0.18263,ZP>,\r\n<0.10724,0.19528,ZP>,\r\n<0.10730,0.20794,ZP>,\r\n<0.10737,0.22061,ZP>,\r\n<0.10745,0.23329,ZP>,\r\n<0.10753,0.24598,ZP>,\r\n<0.10762,0.25869,ZP>,\r\n<0.10770,0.27142,ZP>,\r\n<0.10779,0.28416,ZP>,\r\n<0.10788,0.29692,ZP>,\r\n<0.10797,0.30969,ZP>,\r\n<0.10806,0.32248,ZP>,\r\n<0.10814,0.33530,ZP>,\r\n<0.10822,0.34813,ZP>,\r\n<0.10829,0.36099,ZP>,\r\n<0.10836,0.37388,ZP>,\r\n<0.10841,0.38679,ZP>,\r\n<0.10845,0.39973,ZP>,\r\n<0.10847,0.41270,ZP>,\r\n<0.10848,0.42571,ZP>,\r\n<0.10841,0.43872,ZP>,\r\n<0.10845,0.45192,ZP>,\r\n<0.10808,0.46481,ZP>,\r\n<0.10817,0.47803,0.66022>,\r\n<0.10767,0.48840,0.64891>,\r\n<0.10481,0.48890,0.63607>,\r\n<0.10160,0.48958,0.62340>,\r\n<0.09866,0.49021,0.61055>,\r\n<0.09497,0.48684,0.59784>,\r\n<0.09141,0.48665,0.58540>,\r\n<0.08831,0.48689,0.57282>\r\n<0.10289,-0.50470,0.57125>,\r\n<0.10628,-0.50301,0.58378>,\r\n<0.10949,-0.50066,0.59607>,\r\n<0.11238,-0.49751,0.60867>,\r\n<0.11513,-0.49372,0.62106>,\r\n<0.11745,-0.48811,0.63329>,\r\n<0.12024,-0.48536,0.64575>,\r\n<0.12186,-0.47901,0.65940>,\r\n<0.12149,-0.46481,ZP>,\r\n<0.12178,-0.45208,ZP>,\r\n<0.12174,-0.43880,ZP>,\r\n<0.12175,-0.42579,ZP>,\r\n<0.12170,-0.41275,ZP>,\r\n<0.12161,-0.39975,ZP>,\r\n<0.12151,-0.38680,ZP>,\r\n<0.12140,-0.37388,ZP>,\r\n<0.12128,-0.36101,ZP>,\r\n<0.12116,-0.34816,ZP>,\r\n<0.12104,-0.33534,ZP>,\r\n<0.12092,-0.32255,ZP>,\r\n<0.12080,-0.30977,ZP>,\r\n<0.12068,-0.29701,ZP>,\r\n<0.12056,-0.28426,ZP>,\r\n<0.12045,-0.27152,ZP>,\r\n<0.12034,-0.25880,ZP>,\r\n<0.12024,-0.24609,ZP>,\r\n<0.12014,-0.23339,ZP>,\r\n<0.12005,-0.22070,ZP>,\r\n<0.11997,-0.20803,ZP>,\r\n<0.11989,-0.19536,ZP>,\r\n<0.11982,-0.18271,ZP>,\r\n<0.11976,-0.17006,ZP>,\r\n<0.11970,-0.15743,ZP>,\r\n<0.11965,-0.14480,ZP>,\r\n<0.11961,-0.13219,ZP>,\r\n<0.11957,-0.11958,ZP>,\r\n<0.11953,-0.10697,ZP>,\r\n<0.11951,-0.09437,ZP>,\r\n<0.11948,-0.08178,ZP>,\r\n<0.11946,-0.06919,ZP>,\r\n<0.11944,-0.05661,ZP>,\r\n<0.11943,-0.04402,ZP>,\r\n<0.11942,-0.03144,ZP>,\r\n<0.11941,-0.01886,ZP>,\r\n<0.11941,-0.00629,ZP>,\r\n<0.11941,0.00629,ZP>,\r\n<0.11941,0.01887,ZP>,\r\n<0.11942,0.03144,ZP>,\r\n<0.11943,0.04402,ZP>,\r\n<0.11944,0.05661,ZP>,\r\n<0.11946,0.06919,ZP>,\r\n<0.11948,0.08178,ZP>,\r\n<0.11951,0.09437,ZP>,\r\n<0.11953,0.10697,ZP>,\r\n<0.11957,0.11957,ZP>,\r\n<0.11961,0.13218,ZP>,\r\n<0.11965,0.14479,ZP>,\r\n<0.11970,0.15742,ZP>,\r\n<0.11975,0.17005,ZP>,\r\n<0.11982,0.18269,ZP>,\r\n<0.11988,0.19535,ZP>,\r\n<0.11996,0.20801,ZP>,\r\n<0.12004,0.22069,ZP>,\r\n<0.12013,0.23338,ZP>,\r\n<0.12022,0.24609,ZP>,\r\n<0.12032,0.25881,ZP>,\r\n<0.12042,0.27155,ZP>,\r\n<0.12053,0.28430,ZP>,\r\n<0.12063,0.29707,ZP>,\r\n<0.12073,0.30985,ZP>,\r\n<0.12083,0.32266,ZP>,\r\n<0.12093,0.33548,ZP>,\r\n<0.12102,0.34833,ZP>,\r\n<0.12109,0.36121,ZP>,\r\n<0.12117,0.37411,ZP>,\r\n<0.12123,0.38705,ZP>,\r\n<0.12127,0.40001,ZP>,\r\n<0.12130,0.41301,ZP>,\r\n<0.12128,0.42605,ZP>,\r\n<0.12121,0.43907,ZP>,\r\n<0.12120,0.45236,ZP>,\r\n<0.12088,0.46511,ZP>,\r\n<0.12126,0.47941,0.65930>,\r\n<0.11956,0.48554,0.64544>,\r\n<0.11634,0.48628,0.63284>,\r\n<0.11313,0.48787,0.61992>,\r\n<0.11004,0.48774,0.60709>,\r\n<0.10699,0.48765,0.59447>,\r\n<0.10392,0.48753,0.58202>,\r\n<0.10080,0.48754,0.56945>\r\n<0.11588,-0.50450,0.56826>,\r\n<0.11897,-0.50137,0.58035>,\r\n<0.12153,-0.49794,0.59249>,\r\n<0.12382,-0.49389,0.60487>,\r\n<0.12604,-0.48948,0.61699>,\r\n<0.12825,-0.48435,0.62954>,\r\n<0.13186,-0.48230,0.64192>,\r\n<0.13486,-0.47985,0.65598>,\r\n<0.13432,-0.46521,ZP>,\r\n<0.13446,-0.45240,ZP>,\r\n<0.13458,-0.43919,ZP>,\r\n<0.13453,-0.42609,ZP>,\r\n<0.13450,-0.41303,ZP>,\r\n<0.13441,-0.40000,ZP>,\r\n<0.13432,-0.38703,ZP>,\r\n<0.13422,-0.37410,ZP>,\r\n<0.13411,-0.36122,ZP>,\r\n<0.13399,-0.34837,ZP>,\r\n<0.13386,-0.33554,ZP>,\r\n<0.13373,-0.32274,ZP>,\r\n<0.13359,-0.30995,ZP>,\r\n<0.13346,-0.29718,ZP>,\r\n<0.13332,-0.28442,ZP>,\r\n<0.13319,-0.27167,ZP>,\r\n<0.13306,-0.25893,ZP>,\r\n<0.13295,-0.24621,ZP>,\r\n<0.13283,-0.23350,ZP>,\r\n<0.13273,-0.22080,ZP>,\r\n<0.13264,-0.20812,ZP>,\r\n<0.13255,-0.19544,ZP>,\r\n<0.13247,-0.18278,ZP>,\r\n<0.13240,-0.17013,ZP>,\r\n<0.13233,-0.15749,ZP>,\r\n<0.13227,-0.14485,ZP>,\r\n<0.13222,-0.13223,ZP>,\r\n<0.13218,-0.11961,ZP>,\r\n<0.13214,-0.10700,ZP>,\r\n<0.13210,-0.09440,ZP>,\r\n<0.13208,-0.08180,ZP>,\r\n<0.13205,-0.06921,ZP>,\r\n<0.13203,-0.05662,ZP>,\r\n<0.13202,-0.04403,ZP>,\r\n<0.13201,-0.03145,ZP>,\r\n<0.13200,-0.01887,ZP>,\r\n<0.13199,-0.00629,ZP>,\r\n<0.13199,0.00629,ZP>,\r\n<0.13200,0.01887,ZP>,\r\n<0.13201,0.03145,ZP>,\r\n<0.13202,0.04404,ZP>,\r\n<0.13203,0.05662,ZP>,\r\n<0.13205,0.06921,ZP>,\r\n<0.13208,0.08180,ZP>,\r\n<0.13211,0.09440,ZP>,\r\n<0.13214,0.10700,ZP>,\r\n<0.13218,0.11961,ZP>,\r\n<0.13222,0.13222,ZP>,\r\n<0.13227,0.14484,ZP>,\r\n<0.13233,0.15747,ZP>,\r\n<0.13239,0.17011,ZP>,\r\n<0.13246,0.18276,ZP>,\r\n<0.13254,0.19543,ZP>,\r\n<0.13262,0.20810,ZP>,\r\n<0.13272,0.22079,ZP>,\r\n<0.13281,0.23349,ZP>,\r\n<0.13292,0.24621,ZP>,\r\n<0.13303,0.25894,ZP>,\r\n<0.13315,0.27169,ZP>,\r\n<0.13327,0.28446,ZP>,\r\n<0.13339,0.29724,ZP>,\r\n<0.13351,0.31004,ZP>,\r\n<0.13363,0.32286,ZP>,\r\n<0.13373,0.33570,ZP>,\r\n<0.13383,0.34856,ZP>,\r\n<0.13392,0.36145,ZP>,\r\n<0.13399,0.37437,ZP>,\r\n<0.13406,0.38733,ZP>,\r\n<0.13410,0.40031,ZP>,\r\n<0.13413,0.41335,ZP>,\r\n<0.13410,0.42641,ZP>,\r\n<0.13409,0.43951,ZP>,\r\n<0.13390,0.45270,ZP>,\r\n<0.13373,0.46553,0.66007>,\r\n<0.13424,0.48019,0.65576>,\r\n<0.13124,0.48247,0.64170>,\r\n<0.12788,0.48480,0.62944>,\r\n<0.12498,0.48909,0.61673>,\r\n<0.12133,0.49180,0.60423>,\r\n<0.11762,0.49381,0.59162>,\r\n<0.11401,0.49506,0.57946>,\r\n<0.11030,0.49589,0.56702>\r\n<0.12473,-0.49613,0.56373>,\r\n<0.12714,-0.49287,0.57587>,\r\n<0.12881,-0.48871,0.58790>,\r\n<0.13079,-0.48453,0.60017>,\r\n<0.13444,-0.48165,0.61264>,\r\n<0.13880,-0.48036,0.62552>,\r\n<0.14317,-0.47907,0.63781>,\r\n<0.14707,-0.47809,0.65066>,\r\n<0.14726,-0.46581,0.66018>,\r\n<0.14718,-0.45271,ZP>,\r\n<0.14747,-0.43969,ZP>,\r\n<0.14733,-0.42642,ZP>,\r\n<0.14731,-0.41334,ZP>,\r\n<0.14724,-0.40028,ZP>,\r\n<0.14716,-0.38729,ZP>,\r\n<0.14707,-0.37436,ZP>,\r\n<0.14696,-0.36147,ZP>,\r\n<0.14684,-0.34861,ZP>,\r\n<0.14671,-0.33578,ZP>,\r\n<0.14656,-0.32297,ZP>,\r\n<0.14641,-0.31016,ZP>,\r\n<0.14625,-0.29738,ZP>,\r\n<0.14610,-0.28460,ZP>,\r\n<0.14595,-0.27184,ZP>,\r\n<0.14580,-0.25909,ZP>,\r\n<0.14567,-0.24635,ZP>,\r\n<0.14554,-0.23363,ZP>,\r\n<0.14542,-0.22092,ZP>,\r\n<0.14531,-0.20822,ZP>,\r\n<0.14521,-0.19553,ZP>,\r\n<0.14512,-0.18286,ZP>,\r\n<0.14504,-0.17020,ZP>,\r\n<0.14497,-0.15755,ZP>,\r\n<0.14490,-0.14491,ZP>,\r\n<0.14484,-0.13228,ZP>,\r\n<0.14479,-0.11966,ZP>,\r\n<0.14475,-0.10704,ZP>,\r\n<0.14471,-0.09443,ZP>,\r\n<0.14468,-0.08183,ZP>,\r\n<0.14465,-0.06923,ZP>,\r\n<0.14463,-0.05664,ZP>,\r\n<0.14461,-0.04405,ZP>,\r\n<0.14460,-0.03146,ZP>,\r\n<0.14459,-0.01887,ZP>,\r\n<0.14458,-0.00629,ZP>,\r\n<0.14459,0.00629,ZP>,\r\n<0.14459,0.01888,ZP>,\r\n<0.14460,0.03146,ZP>,\r\n<0.14461,0.04405,ZP>,\r\n<0.14463,0.05664,ZP>,\r\n<0.14465,0.06923,ZP>,\r\n<0.14468,0.08183,ZP>,\r\n<0.14471,0.09443,ZP>,\r\n<0.14475,0.10704,ZP>,\r\n<0.14479,0.11965,ZP>,\r\n<0.14485,0.13227,ZP>,\r\n<0.14490,0.14490,ZP>,\r\n<0.14497,0.15754,ZP>,\r\n<0.14504,0.17019,ZP>,\r\n<0.14512,0.18285,ZP>,\r\n<0.14520,0.19552,ZP>,\r\n<0.14530,0.20820,ZP>,\r\n<0.14540,0.22090,ZP>,\r\n<0.14552,0.23361,ZP>,\r\n<0.14564,0.24635,ZP>,\r\n<0.14577,0.25909,ZP>,\r\n<0.14590,0.27186,ZP>,\r\n<0.14604,0.28464,ZP>,\r\n<0.14618,0.29744,ZP>,\r\n<0.14631,0.31025,ZP>,\r\n<0.14644,0.32309,ZP>,\r\n<0.14657,0.33594,ZP>,\r\n<0.14667,0.34882,ZP>,\r\n<0.14677,0.36172,ZP>,\r\n<0.14685,0.37466,ZP>,\r\n<0.14691,0.38763,ZP>,\r\n<0.14696,0.40065,ZP>,\r\n<0.14699,0.41372,ZP>,\r\n<0.14695,0.42679,ZP>,\r\n<0.14703,0.44003,ZP>,\r\n<0.14668,0.45303,ZP>,\r\n<0.14672,0.46612,0.66018>,\r\n<0.14647,0.47827,0.65054>,\r\n<0.14265,0.47929,0.63759>,\r\n<0.13929,0.48309,0.62544>,\r\n<0.13663,0.48767,0.61296>,\r\n<0.13319,0.49131,0.60082>,\r\n<0.12977,0.49449,0.58817>,\r\n<0.12605,0.49712,0.57643>,\r\n<0.12217,0.49944,0.56410>\r\n<0.12795,-0.48460,0.55973>,\r\n<0.13107,-0.48148,0.57181>,\r\n<0.13506,-0.47904,0.58379>,\r\n<0.13946,-0.47729,0.59607>,\r\n<0.14536,-0.47843,0.60832>,\r\n<0.14964,-0.47710,0.62094>,\r\n<0.15413,-0.47567,0.63340>,\r\n<0.15844,-0.47431,0.64577>,\r\n<0.16048,-0.46733,0.65953>,\r\n<0.15990,-0.45306,ZP>,\r\n<0.16014,-0.44011,ZP>,\r\n<0.16009,-0.42677,ZP>,\r\n<0.16007,-0.41364,ZP>,\r\n<0.16006,-0.40058,ZP>,\r\n<0.16002,-0.38760,ZP>,\r\n<0.15995,-0.37467,ZP>,\r\n<0.15986,-0.36177,ZP>,\r\n<0.15973,-0.34891,ZP>,\r\n<0.15959,-0.33606,ZP>,\r\n<0.15942,-0.32323,ZP>,\r\n<0.15925,-0.31041,ZP>,\r\n<0.15907,-0.29760,ZP>,\r\n<0.15890,-0.28481,ZP>,\r\n<0.15872,-0.27202,ZP>,\r\n<0.15856,-0.25926,ZP>,\r\n<0.15841,-0.24650,ZP>,\r\n<0.15826,-0.23377,ZP>,\r\n<0.15813,-0.22104,ZP>,\r\n<0.15800,-0.20833,ZP>,\r\n<0.15789,-0.19564,ZP>,\r\n<0.15779,-0.18295,ZP>,\r\n<0.15770,-0.17028,ZP>,\r\n<0.15761,-0.15762,ZP>,\r\n<0.15754,-0.14498,ZP>,\r\n<0.15747,-0.13234,ZP>,\r\n<0.15742,-0.11971,ZP>,\r\n<0.15737,-0.10708,ZP>,\r\n<0.15732,-0.09447,ZP>,\r\n<0.15729,-0.08186,ZP>,\r\n<0.15725,-0.06926,ZP>,\r\n<0.15723,-0.05666,ZP>,\r\n<0.15721,-0.04406,ZP>,\r\n<0.15719,-0.03147,ZP>,\r\n<0.15719,-0.01888,ZP>,\r\n<0.15718,-0.00629,ZP>,\r\n<0.15718,0.00630,ZP>,\r\n<0.15719,0.01889,ZP>,\r\n<0.15720,0.03148,ZP>,\r\n<0.15721,0.04407,ZP>,\r\n<0.15723,0.05666,ZP>,\r\n<0.15726,0.06926,ZP>,\r\n<0.15729,0.08186,ZP>,\r\n<0.15733,0.09447,ZP>,\r\n<0.15737,0.10708,ZP>,\r\n<0.15742,0.11970,ZP>,\r\n<0.15748,0.13233,ZP>,\r\n<0.15754,0.14497,ZP>,\r\n<0.15761,0.15761,ZP>,\r\n<0.15769,0.17027,ZP>,\r\n<0.15778,0.18294,ZP>,\r\n<0.15788,0.19562,ZP>,\r\n<0.15799,0.20831,ZP>,\r\n<0.15810,0.22102,ZP>,\r\n<0.15823,0.23375,ZP>,\r\n<0.15837,0.24650,ZP>,\r\n<0.15851,0.25926,ZP>,\r\n<0.15866,0.27204,ZP>,\r\n<0.15882,0.28484,ZP>,\r\n<0.15898,0.29766,ZP>,\r\n<0.15914,0.31049,ZP>,\r\n<0.15929,0.32335,ZP>,\r\n<0.15943,0.33622,ZP>,\r\n<0.15955,0.34912,ZP>,\r\n<0.15965,0.36204,ZP>,\r\n<0.15973,0.37499,ZP>,\r\n<0.15979,0.38797,ZP>,\r\n<0.15983,0.40101,ZP>,\r\n<0.15984,0.41409,ZP>,\r\n<0.15984,0.42720,ZP>,\r\n<0.15985,0.44049,ZP>,\r\n<0.15956,0.45337,ZP>,\r\n<0.16007,0.46758,0.65948>,\r\n<0.15799,0.47446,0.64577>,\r\n<0.15364,0.47582,0.63343>,\r\n<0.14946,0.47796,0.62083>,\r\n<0.14592,0.48130,0.60827>,\r\n<0.14299,0.48513,0.59629>,\r\n<0.14009,0.48862,0.58360>,\r\n<0.13713,0.49159,0.57200>,\r\n<0.13356,0.49473,0.55975>\r\n<0.13444,-0.47441,0.55573>,\r\n<0.13914,-0.47265,0.56758>,\r\n<0.14424,-0.47146,0.57960>,\r\n<0.14938,-0.47132,0.59171>,\r\n<0.15559,-0.47522,0.60362>,\r\n<0.16009,-0.47370,0.61609>,\r\n<0.16471,-0.47211,0.62869>,\r\n<0.16945,-0.47044,0.64084>,\r\n<0.17352,-0.46824,0.65450>,\r\n<0.17287,-0.45358,0.66014>,\r\n<0.17286,-0.44050,ZP>,\r\n<0.17301,-0.42729,ZP>,\r\n<0.17291,-0.41400,ZP>,\r\n<0.17295,-0.40096,ZP>,\r\n<0.17294,-0.38798,ZP>,\r\n<0.17288,-0.37503,ZP>,\r\n<0.17279,-0.36214,ZP>,\r\n<0.17266,-0.34925,ZP>,\r\n<0.17250,-0.33639,ZP>,\r\n<0.17231,-0.32353,ZP>,\r\n<0.17211,-0.31069,ZP>,\r\n<0.17191,-0.29785,ZP>,\r\n<0.17171,-0.28504,ZP>,\r\n<0.17152,-0.27223,ZP>,\r\n<0.17133,-0.25945,ZP>,\r\n<0.17116,-0.24668,ZP>,\r\n<0.17100,-0.23392,ZP>,\r\n<0.17085,-0.22118,ZP>,\r\n<0.17071,-0.20846,ZP>,\r\n<0.17058,-0.19575,ZP>,\r\n<0.17047,-0.18306,ZP>,\r\n<0.17036,-0.17037,ZP>,\r\n<0.17027,-0.15770,ZP>,\r\n<0.17019,-0.14505,ZP>,\r\n<0.17011,-0.13240,ZP>,\r\n<0.17005,-0.11976,ZP>,\r\n<0.16999,-0.10713,ZP>,\r\n<0.16994,-0.09451,ZP>,\r\n<0.16990,-0.08189,ZP>,\r\n<0.16987,-0.06928,ZP>,\r\n<0.16984,-0.05668,ZP>,\r\n<0.16982,-0.04408,ZP>,\r\n<0.16980,-0.03148,ZP>,\r\n<0.16979,-0.01889,ZP>,\r\n<0.16978,-0.00629,ZP>,\r\n<0.16978,0.00630,ZP>,\r\n<0.16979,0.01890,ZP>,\r\n<0.16980,0.03149,ZP>,\r\n<0.16982,0.04409,ZP>,\r\n<0.16984,0.05669,ZP>,\r\n<0.16987,0.06929,ZP>,\r\n<0.16991,0.08190,ZP>,\r\n<0.16995,0.09451,ZP>,\r\n<0.17000,0.10713,ZP>,\r\n<0.17005,0.11976,ZP>,\r\n<0.17012,0.13239,ZP>,\r\n<0.17019,0.14504,ZP>,\r\n<0.17027,0.15769,ZP>,\r\n<0.17036,0.17036,ZP>,\r\n<0.17046,0.18304,ZP>,\r\n<0.17057,0.19573,ZP>,\r\n<0.17069,0.20844,ZP>,\r\n<0.17082,0.22116,ZP>,\r\n<0.17096,0.23390,ZP>,\r\n<0.17111,0.24666,ZP>,\r\n<0.17127,0.25944,ZP>,\r\n<0.17144,0.27224,ZP>,\r\n<0.17162,0.28506,ZP>,\r\n<0.17180,0.29790,ZP>,\r\n<0.17198,0.31076,ZP>,\r\n<0.17215,0.32364,ZP>,\r\n<0.17231,0.33654,ZP>,\r\n<0.17246,0.34945,ZP>,\r\n<0.17257,0.36239,ZP>,\r\n<0.17266,0.37535,ZP>,\r\n<0.17272,0.38836,ZP>,\r\n<0.17275,0.40139,ZP>,\r\n<0.17274,0.41447,ZP>,\r\n<0.17286,0.42774,ZP>,\r\n<0.17270,0.44087,ZP>,\r\n<0.17266,0.45386,0.66012>,\r\n<0.17325,0.46837,0.65445>,\r\n<0.16916,0.47054,0.64088>,\r\n<0.16438,0.47223,0.62878>,\r\n<0.15967,0.47384,0.61615>,\r\n<0.15505,0.47538,0.60373>,\r\n<0.14978,0.47562,0.59189>,\r\n<0.14556,0.47813,0.57940>,\r\n<0.14245,0.48122,0.56773>,\r\n<0.13941,0.48463,0.55528>\r\n<0.14481,-0.46841,0.55119>,\r\n<0.15024,-0.46836,0.56282>,\r\n<0.15539,-0.46869,0.57473>,\r\n<0.16047,-0.46946,0.58667>,\r\n<0.16536,-0.46977,0.59874>,\r\n<0.17053,-0.47003,0.61090>,\r\n<0.17526,-0.46929,0.62344>,\r\n<0.17987,-0.46656,0.63541>,\r\n<0.18479,-0.46478,0.64801>,\r\n<0.18586,-0.45443,0.66038>,\r\n<0.18531,-0.44072,0.66010>,\r\n<0.18562,-0.42759,ZP>,\r\n<0.18577,-0.41442,ZP>,\r\n<0.18585,-0.40138,ZP>,\r\n<0.18589,-0.38841,ZP>,\r\n<0.18587,-0.37548,ZP>,\r\n<0.18577,-0.36257,ZP>,\r\n<0.18563,-0.34966,ZP>,\r\n<0.18544,-0.33676,ZP>,\r\n<0.18522,-0.32387,ZP>,\r\n<0.18500,-0.31100,ZP>,\r\n<0.18477,-0.29814,ZP>,\r\n<0.18455,-0.28529,ZP>,\r\n<0.18433,-0.27247,ZP>,\r\n<0.18412,-0.25966,ZP>,\r\n<0.18393,-0.24687,ZP>,\r\n<0.18375,-0.23409,ZP>,\r\n<0.18358,-0.22134,ZP>,\r\n<0.18343,-0.20860,ZP>,\r\n<0.18328,-0.19588,ZP>,\r\n<0.18316,-0.18317,ZP>,\r\n<0.18304,-0.17048,ZP>,\r\n<0.18294,-0.15779,ZP>,\r\n<0.18284,-0.14513,ZP>,\r\n<0.18276,-0.13247,ZP>,\r\n<0.18269,-0.11982,ZP>,\r\n<0.18263,-0.10718,ZP>,\r\n<0.18257,-0.09455,ZP>,\r\n<0.18252,-0.08193,ZP>,\r\n<0.18249,-0.06931,ZP>,\r\n<0.18245,-0.05670,ZP>,\r\n<0.18243,-0.04410,ZP>,\r\n<0.18241,-0.03149,ZP>,\r\n<0.18240,-0.01889,ZP>,\r\n<0.18239,-0.00629,ZP>,\r\n<0.18240,0.00631,ZP>,\r\n<0.18240,0.01890,ZP>,\r\n<0.18242,0.03150,ZP>,\r\n<0.18243,0.04411,ZP>,\r\n<0.18246,0.05671,ZP>,\r\n<0.18249,0.06932,ZP>,\r\n<0.18253,0.08194,ZP>,\r\n<0.18258,0.09456,ZP>,\r\n<0.18263,0.10719,ZP>,\r\n<0.18270,0.11982,ZP>,\r\n<0.18277,0.13246,ZP>,\r\n<0.18285,0.14512,ZP>,\r\n<0.18294,0.15778,ZP>,\r\n<0.18304,0.17046,ZP>,\r\n<0.18315,0.18315,ZP>,\r\n<0.18327,0.19586,ZP>,\r\n<0.18341,0.20858,ZP>,\r\n<0.18355,0.22131,ZP>,\r\n<0.18371,0.23407,ZP>,\r\n<0.18387,0.24685,ZP>,\r\n<0.18405,0.25964,ZP>,\r\n<0.18424,0.27246,ZP>,\r\n<0.18444,0.28530,ZP>,\r\n<0.18464,0.29817,ZP>,\r\n<0.18485,0.31106,ZP>,\r\n<0.18505,0.32396,ZP>,\r\n<0.18523,0.33689,ZP>,\r\n<0.18540,0.34983,ZP>,\r\n<0.18553,0.36279,ZP>,\r\n<0.18563,0.37577,ZP>,\r\n<0.18570,0.38878,ZP>,\r\n<0.18570,0.40180,ZP>,\r\n<0.18571,0.41488,ZP>,\r\n<0.18566,0.42806,ZP>,\r\n<0.18558,0.44112,ZP>,\r\n<0.18612,0.45460,0.66028>,\r\n<0.18505,0.46470,0.64807>,\r\n<0.18009,0.46647,0.63585>,\r\n<0.17484,0.46845,0.62375>,\r\n<0.17000,0.47025,0.61121>,\r\n<0.16350,0.46787,0.59900>,\r\n<0.15853,0.46830,0.58726>,\r\n<0.15328,0.46925,0.57492>,\r\n<0.14824,0.47090,0.56361>,\r\n<0.14338,0.47309,0.55163>\r\n<0.15658,-0.46936,0.54610>,\r\n<0.16180,-0.47020,0.55770>,\r\n<0.16656,-0.47112,0.56956>,\r\n<0.17139,-0.47223,0.58151>,\r\n<0.17631,-0.47280,0.59370>,\r\n<0.18123,-0.47154,0.60578>,\r\n<0.18641,-0.46913,0.61816>,\r\n<0.19062,-0.46408,0.62998>,\r\n<0.19530,-0.46032,0.64213>,\r\n<0.19960,-0.45679,0.65627>,\r\n<0.19839,-0.44128,0.66020>,\r\n<0.19857,-0.42816,0.66007>,\r\n<0.19886,-0.41514,ZP>,\r\n<0.19886,-0.40192,ZP>,\r\n<0.19894,-0.38896,ZP>,\r\n<0.19892,-0.37602,ZP>,\r\n<0.19880,-0.36306,ZP>,\r\n<0.19862,-0.35012,ZP>,\r\n<0.19840,-0.33718,ZP>,\r\n<0.19816,-0.32425,ZP>,\r\n<0.19791,-0.31134,ZP>,\r\n<0.19765,-0.29844,ZP>,\r\n<0.19740,-0.28557,ZP>,\r\n<0.19716,-0.27272,ZP>,\r\n<0.19693,-0.25989,ZP>,\r\n<0.19672,-0.24708,ZP>,\r\n<0.19651,-0.23428,ZP>,\r\n<0.19633,-0.22151,ZP>,\r\n<0.19616,-0.20875,ZP>,\r\n<0.19600,-0.19602,ZP>,\r\n<0.19586,-0.18329,ZP>,\r\n<0.19573,-0.17059,ZP>,\r\n<0.19562,-0.15789,ZP>,\r\n<0.19551,-0.14521,ZP>,\r\n<0.19542,-0.13254,ZP>,\r\n<0.19534,-0.11989,ZP>,\r\n<0.19527,-0.10724,ZP>,\r\n<0.19521,-0.09460,ZP>,\r\n<0.19516,-0.08197,ZP>,\r\n<0.19511,-0.06935,ZP>,\r\n<0.19508,-0.05673,ZP>,\r\n<0.19505,-0.04411,ZP>,\r\n<0.19503,-0.03151,ZP>,\r\n<0.19502,-0.01890,ZP>,\r\n<0.19501,-0.00629,ZP>,\r\n<0.19501,0.00631,ZP>,\r\n<0.19502,0.01891,ZP>,\r\n<0.19504,0.03152,ZP>,\r\n<0.19506,0.04413,ZP>,\r\n<0.19509,0.05674,ZP>,\r\n<0.19512,0.06936,ZP>,\r\n<0.19517,0.08198,ZP>,\r\n<0.19522,0.09461,ZP>,\r\n<0.19528,0.10725,ZP>,\r\n<0.19535,0.11989,ZP>,\r\n<0.19543,0.13254,ZP>,\r\n<0.19552,0.14521,ZP>,\r\n<0.19562,0.15788,ZP>,\r\n<0.19573,0.17057,ZP>,\r\n<0.19586,0.18328,ZP>,\r\n<0.19599,0.19599,ZP>,\r\n<0.19614,0.20873,ZP>,\r\n<0.19630,0.22148,ZP>,\r\n<0.19647,0.23425,ZP>,\r\n<0.19666,0.24705,ZP>,\r\n<0.19685,0.25986,ZP>,\r\n<0.19706,0.27270,ZP>,\r\n<0.19728,0.28557,ZP>,\r\n<0.19751,0.29846,ZP>,\r\n<0.19774,0.31138,ZP>,\r\n<0.19797,0.32432,ZP>,\r\n<0.19818,0.33728,ZP>,\r\n<0.19838,0.35025,ZP>,\r\n<0.19854,0.36324,ZP>,\r\n<0.19867,0.37624,ZP>,\r\n<0.19873,0.38926,ZP>,\r\n<0.19874,0.40227,ZP>,\r\n<0.19888,0.41549,ZP>,\r\n<0.19864,0.42838,ZP>,\r\n<0.19869,0.44150,0.66011>,\r\n<0.19999,0.45657,0.65622>,\r\n<0.19575,0.46016,0.64241>,\r\n<0.19044,0.46233,0.63044>,\r\n<0.18526,0.46537,0.61819>,\r\n<0.18025,0.46639,0.60586>,\r\n<0.17452,0.46591,0.59365>,\r\n<0.16955,0.46537,0.58185>,\r\n<0.16438,0.46488,0.56983>,\r\n<0.15852,0.46491,0.55853>,\r\n<0.15295,0.46546,0.54682>\r\n<0.16608,-0.47637,0.54137>,\r\n<0.17106,-0.47761,0.55324>,\r\n<0.17628,-0.47769,0.56488>,\r\n<0.18176,-0.47678,0.57681>,\r\n<0.18718,-0.47470,0.58884>,\r\n<0.19236,-0.47115,0.60056>,\r\n<0.19701,-0.46667,0.61219>,\r\n<0.20084,-0.46044,0.62403>,\r\n<0.20470,-0.45622,0.63581>,\r\n<0.20531,-0.45004,0.65044>,\r\n<0.21099,-0.44216,0.66056>,\r\n<0.21114,-0.42862,0.66014>,\r\n<0.21154,-0.41536,0.66008>,\r\n<0.21201,-0.40265,ZP>,\r\n<0.21204,-0.38963,ZP>,\r\n<0.21201,-0.37665,ZP>,\r\n<0.21186,-0.36363,ZP>,\r\n<0.21165,-0.35063,ZP>,\r\n<0.21140,-0.33764,ZP>,\r\n<0.21112,-0.32466,ZP>,\r\n<0.21084,-0.31171,ZP>,\r\n<0.21056,-0.29878,ZP>,\r\n<0.21028,-0.28588,ZP>,\r\n<0.21001,-0.27299,ZP>,\r\n<0.20976,-0.26014,ZP>,\r\n<0.20952,-0.24730,ZP>,\r\n<0.20930,-0.23449,ZP>,\r\n<0.20910,-0.22170,ZP>,\r\n<0.20891,-0.20892,ZP>,\r\n<0.20873,-0.19617,ZP>,\r\n<0.20858,-0.18343,ZP>,\r\n<0.20843,-0.17071,ZP>,\r\n<0.20831,-0.15800,ZP>,\r\n<0.20819,-0.14531,ZP>,\r\n<0.20809,-0.13263,ZP>,\r\n<0.20800,-0.11996,ZP>,\r\n<0.20792,-0.10730,ZP>,\r\n<0.20786,-0.09465,ZP>,\r\n<0.20780,-0.08201,ZP>,\r\n<0.20775,-0.06938,ZP>,\r\n<0.20771,-0.05676,ZP>,\r\n<0.20768,-0.04414,ZP>,\r\n<0.20766,-0.03152,ZP>,\r\n<0.20765,-0.01891,ZP>,\r\n<0.20764,-0.00630,ZP>,\r\n<0.20764,0.00631,ZP>,\r\n<0.20765,0.01893,ZP>,\r\n<0.20767,0.03154,ZP>,\r\n<0.20769,0.04415,ZP>,\r\n<0.20772,0.05677,ZP>,\r\n<0.20776,0.06940,ZP>,\r\n<0.20781,0.08203,ZP>,\r\n<0.20787,0.09467,ZP>,\r\n<0.20794,0.10731,ZP>,\r\n<0.20802,0.11997,ZP>,\r\n<0.20811,0.13263,ZP>,\r\n<0.20821,0.14531,ZP>,\r\n<0.20832,0.15799,ZP>,\r\n<0.20844,0.17070,ZP>,\r\n<0.20858,0.18341,ZP>,\r\n<0.20873,0.19615,ZP>,\r\n<0.20889,0.20890,ZP>,\r\n<0.20907,0.22167,ZP>,\r\n<0.20926,0.23446,ZP>,\r\n<0.20946,0.24727,ZP>,\r\n<0.20968,0.26010,ZP>,\r\n<0.20990,0.27296,ZP>,\r\n<0.21014,0.28585,ZP>,\r\n<0.21040,0.29877,ZP>,\r\n<0.21065,0.31172,ZP>,\r\n<0.21091,0.32469,ZP>,\r\n<0.21116,0.33769,ZP>,\r\n<0.21139,0.35071,ZP>,\r\n<0.21160,0.36374,ZP>,\r\n<0.21176,0.37679,ZP>,\r\n<0.21183,0.38979,ZP>,\r\n<0.21189,0.40283,ZP>,\r\n<0.21186,0.41593,ZP>,\r\n<0.21178,0.42852,ZP>,\r\n<0.21214,0.44190,0.66037>,\r\n<0.21344,0.44713,0.65000>,\r\n<0.20582,0.45571,0.63654>,\r\n<0.20086,0.45890,0.62541>,\r\n<0.19600,0.46420,0.61210>,\r\n<0.19123,0.46712,0.60062>,\r\n<0.18537,0.46916,0.58828>,\r\n<0.17996,0.46862,0.57636>,\r\n<0.17518,0.46714,0.56449>,\r\n<0.16994,0.46638,0.55277>,\r\n<0.16462,0.46594,0.54133>\r\n<0.17598,-0.48278,0.53718>,\r\n<0.18208,-0.48161,0.54848>,\r\n<0.18792,-0.47971,0.55974>,\r\n<0.19311,-0.47664,0.57153>,\r\n<0.19818,-0.47245,0.58300>,\r\n<0.20270,-0.46712,0.59438>,\r\n<0.20627,-0.46142,0.60561>,\r\n<0.20960,-0.45534,0.61766>,\r\n<0.21469,-0.45162,0.62880>,\r\n<0.22050,-0.44887,0.64140>,\r\n<0.22534,-0.44524,0.65561>,\r\n<0.22443,-0.42952,0.66025>,\r\n<0.22482,-0.41647,0.66008>,\r\n<0.22523,-0.40363,ZP>,\r\n<0.22519,-0.39040,ZP>,\r\n<0.22512,-0.37735,ZP>,\r\n<0.22495,-0.36426,ZP>,\r\n<0.22470,-0.35118,ZP>,\r\n<0.22441,-0.33813,ZP>,\r\n<0.22411,-0.32511,ZP>,\r\n<0.22379,-0.31211,ZP>,\r\n<0.22348,-0.29914,ZP>,\r\n<0.22318,-0.28621,ZP>,\r\n<0.22289,-0.27329,ZP>,\r\n<0.22261,-0.26041,ZP>,\r\n<0.22235,-0.24755,ZP>,\r\n<0.22211,-0.23471,ZP>,\r\n<0.22188,-0.22190,ZP>,\r\n<0.22167,-0.20910,ZP>,\r\n<0.22148,-0.19633,ZP>,\r\n<0.22131,-0.18357,ZP>,\r\n<0.22115,-0.17084,ZP>,\r\n<0.22101,-0.15811,ZP>,\r\n<0.22089,-0.14541,ZP>,\r\n<0.22077,-0.13271,ZP>,\r\n<0.22068,-0.12003,ZP>,\r\n<0.22059,-0.10737,ZP>,\r\n<0.22052,-0.09471,ZP>,\r\n<0.22045,-0.08206,ZP>,\r\n<0.22040,-0.06942,ZP>,\r\n<0.22036,-0.05679,ZP>,\r\n<0.22032,-0.04416,ZP>,\r\n<0.22030,-0.03153,ZP>,\r\n<0.22028,-0.01891,ZP>,\r\n<0.22028,-0.00630,ZP>,\r\n<0.22028,0.00632,ZP>,\r\n<0.22029,0.01894,ZP>,\r\n<0.22031,0.03156,ZP>,\r\n<0.22033,0.04418,ZP>,\r\n<0.22037,0.05681,ZP>,\r\n<0.22041,0.06944,ZP>,\r\n<0.22047,0.08208,ZP>,\r\n<0.22053,0.09473,ZP>,\r\n<0.22061,0.10738,ZP>,\r\n<0.22069,0.12005,ZP>,\r\n<0.22079,0.13273,ZP>,\r\n<0.22090,0.14541,ZP>,\r\n<0.22103,0.15811,ZP>,\r\n<0.22116,0.17083,ZP>,\r\n<0.22131,0.18356,ZP>,\r\n<0.22148,0.19631,ZP>,\r\n<0.22166,0.20908,ZP>,\r\n<0.22185,0.22187,ZP>,\r\n<0.22206,0.23468,ZP>,\r\n<0.22228,0.24751,ZP>,\r\n<0.22252,0.26036,ZP>,\r\n<0.22277,0.27325,ZP>,\r\n<0.22303,0.28616,ZP>,\r\n<0.22331,0.29910,ZP>,\r\n<0.22359,0.31208,ZP>,\r\n<0.22388,0.32509,ZP>,\r\n<0.22416,0.33813,ZP>,\r\n<0.22444,0.35120,ZP>,\r\n<0.22469,0.36429,ZP>,\r\n<0.22489,0.37737,ZP>,\r\n<0.22500,0.39039,ZP>,\r\n<0.22520,0.40357,ZP>,\r\n<0.22496,0.41644,0.66008>,\r\n<0.22526,0.42925,0.66018>,\r\n<0.22663,0.44459,0.65548>,\r\n<0.22132,0.44842,0.64179>,\r\n<0.21452,0.45169,0.62950>,\r\n<0.21066,0.45599,0.61868>,\r\n<0.20639,0.46166,0.60598>,\r\n<0.20208,0.46605,0.59505>,\r\n<0.19658,0.46984,0.58306>,\r\n<0.19049,0.47238,0.57134>,\r\n<0.18478,0.47348,0.55977>,\r\n<0.17919,0.47384,0.54819>,\r\n<0.17372,0.47323,0.53653>\r\n<0.18790,-0.48425,0.53200>,\r\n<0.19365,-0.48050,0.54285>,\r\n<0.19849,-0.47612,0.55388>,\r\n<0.20283,-0.47106,0.56520>,\r\n<0.20643,-0.46556,0.57618>,\r\n<0.20962,-0.45945,0.58749>,\r\n<0.21296,-0.45359,0.59896>,\r\n<0.21827,-0.44987,0.61031>,\r\n<0.22428,-0.44691,0.62311>,\r\n<0.23011,-0.44396,0.63503>,\r\n<0.23874,-0.43670,0.64348>,\r\n<0.23800,-0.43175,0.66013>,\r\n<0.23787,-0.41766,0.66009>,\r\n<0.23835,-0.40459,ZP>,\r\n<0.23846,-0.39140,ZP>,\r\n<0.23824,-0.37809,ZP>,\r\n<0.23804,-0.36493,ZP>,\r\n<0.23777,-0.35178,ZP>,\r\n<0.23745,-0.33867,ZP>,\r\n<0.23712,-0.32559,ZP>,\r\n<0.23678,-0.31255,ZP>,\r\n<0.23643,-0.29954,ZP>,\r\n<0.23610,-0.28656,ZP>,\r\n<0.23579,-0.27362,ZP>,\r\n<0.23548,-0.26070,ZP>,\r\n<0.23520,-0.24782,ZP>,\r\n<0.23493,-0.23495,ZP>,\r\n<0.23468,-0.22212,ZP>,\r\n<0.23445,-0.20930,ZP>,\r\n<0.23425,-0.19651,ZP>,\r\n<0.23406,-0.18373,ZP>,\r\n<0.23389,-0.17098,ZP>,\r\n<0.23373,-0.15824,ZP>,\r\n<0.23359,-0.14552,ZP>,\r\n<0.23347,-0.13281,ZP>,\r\n<0.23336,-0.12012,ZP>,\r\n<0.23327,-0.10744,ZP>,\r\n<0.23319,-0.09477,ZP>,\r\n<0.23312,-0.08211,ZP>,\r\n<0.23306,-0.06946,ZP>,\r\n<0.23301,-0.05682,ZP>,\r\n<0.23298,-0.04418,ZP>,\r\n<0.23295,-0.03155,ZP>,\r\n<0.23293,-0.01892,ZP>,\r\n<0.23293,-0.00630,ZP>,\r\n<0.23293,0.00633,ZP>,\r\n<0.23294,0.01895,ZP>,\r\n<0.23296,0.03158,ZP>,\r\n<0.23299,0.04421,ZP>,\r\n<0.23303,0.05685,ZP>,\r\n<0.23308,0.06949,ZP>,\r\n<0.23314,0.08214,ZP>,\r\n<0.23321,0.09479,ZP>,\r\n<0.23329,0.10746,ZP>,\r\n<0.23339,0.12014,ZP>,\r\n<0.23349,0.13283,ZP>,\r\n<0.23361,0.14553,ZP>,\r\n<0.23375,0.15825,ZP>,\r\n<0.23390,0.17098,ZP>,\r\n<0.23406,0.18372,ZP>,\r\n<0.23425,0.19649,ZP>,\r\n<0.23444,0.20928,ZP>,\r\n<0.23466,0.22208,ZP>,\r\n<0.23489,0.23491,ZP>,\r\n<0.23513,0.24777,ZP>,\r\n<0.23539,0.26064,ZP>,\r\n<0.23567,0.27355,ZP>,\r\n<0.23595,0.28649,ZP>,\r\n<0.23625,0.29946,ZP>,\r\n<0.23656,0.31247,ZP>,\r\n<0.23688,0.32552,ZP>,\r\n<0.23719,0.33860,ZP>,\r\n<0.23751,0.35172,ZP>,\r\n<0.23780,0.36486,ZP>,\r\n<0.23804,0.37799,ZP>,\r\n<0.23835,0.39121,ZP>,\r\n<0.23846,0.40431,ZP>,\r\n<0.23826,0.41691,0.66016>,\r\n<0.23906,0.43092,0.66023>,\r\n<0.23217,0.43989,0.64326>,\r\n<0.23088,0.44357,0.63402>,\r\n<0.22470,0.44670,0.62290>,\r\n<0.21890,0.45038,0.61169>,\r\n<0.21491,0.45580,0.59940>,\r\n<0.21142,0.46143,0.58853>,\r\n<0.20721,0.46675,0.57694>,\r\n<0.20164,0.47146,0.56560>,\r\n<0.19603,0.47477,0.55422>,\r\n<0.19008,0.47716,0.54306>,\r\n<0.18396,0.47893,0.53190>\r\n<0.19797,-0.47891,0.52557>,\r\n<0.20220,-0.47346,0.53637>,\r\n<0.20565,-0.46790,0.54727>,\r\n<0.20850,-0.46200,0.55841>,\r\n<0.21060,-0.45568,0.56951>,\r\n<0.21430,-0.45017,0.58104>,\r\n<0.21974,-0.44602,0.59252>,\r\n<0.22753,-0.44528,0.60418>,\r\n<0.23329,-0.44228,0.61615>,\r\n<0.23916,-0.43914,0.62775>,\r\n<0.24584,-0.43547,0.63848>,\r\n<0.25115,-0.43278,0.65105>,\r\n<0.25117,-0.41892,0.66033>,\r\n<0.25142,-0.40547,0.66009>,\r\n<0.25161,-0.39231,ZP>,\r\n<0.25145,-0.37895,ZP>,\r\n<0.25115,-0.36563,ZP>,\r\n<0.25087,-0.35242,ZP>,\r\n<0.25052,-0.33924,ZP>,\r\n<0.25016,-0.32610,ZP>,\r\n<0.24979,-0.31301,ZP>,\r\n<0.24942,-0.29996,ZP>,\r\n<0.24906,-0.28694,ZP>,\r\n<0.24871,-0.27397,ZP>,\r\n<0.24838,-0.26102,ZP>,\r\n<0.24807,-0.24810,ZP>,\r\n<0.24777,-0.23521,ZP>,\r\n<0.24750,-0.22235,ZP>,\r\n<0.24725,-0.20951,ZP>,\r\n<0.24703,-0.19669,ZP>,\r\n<0.24682,-0.18390,ZP>,\r\n<0.24663,-0.17113,ZP>,\r\n<0.24647,-0.15837,ZP>,\r\n<0.24632,-0.14564,ZP>,\r\n<0.24618,-0.13291,ZP>,\r\n<0.24606,-0.12021,ZP>,\r\n<0.24596,-0.10751,ZP>,\r\n<0.24587,-0.09483,ZP>,\r\n<0.24579,-0.08216,ZP>,\r\n<0.24573,-0.06950,ZP>,\r\n<0.24568,-0.05685,ZP>,\r\n<0.24564,-0.04421,ZP>,\r\n<0.24561,-0.03157,ZP>,\r\n<0.24559,-0.01893,ZP>,\r\n<0.24559,-0.00630,ZP>,\r\n<0.24559,0.00633,ZP>,\r\n<0.24560,0.01897,ZP>,\r\n<0.24562,0.03160,ZP>,\r\n<0.24565,0.04424,ZP>,\r\n<0.24569,0.05689,ZP>,\r\n<0.24575,0.06954,ZP>,\r\n<0.24581,0.08220,ZP>,\r\n<0.24589,0.09487,ZP>,\r\n<0.24598,0.10755,ZP>,\r\n<0.24609,0.12024,ZP>,\r\n<0.24621,0.13294,ZP>,\r\n<0.24634,0.14566,ZP>,\r\n<0.24649,0.15839,ZP>,\r\n<0.24665,0.17113,ZP>,\r\n<0.24684,0.18390,ZP>,\r\n<0.24703,0.19668,ZP>,\r\n<0.24725,0.20949,ZP>,\r\n<0.24748,0.22231,ZP>,\r\n<0.24774,0.23517,ZP>,\r\n<0.24801,0.24804,ZP>,\r\n<0.24830,0.26095,ZP>,\r\n<0.24860,0.27388,ZP>,\r\n<0.24891,0.28684,ZP>,\r\n<0.24923,0.29984,ZP>,\r\n<0.24956,0.31287,ZP>,\r\n<0.24990,0.32595,ZP>,\r\n<0.25025,0.33909,ZP>,\r\n<0.25061,0.35226,ZP>,\r\n<0.25093,0.36545,ZP>,\r\n<0.25129,0.37872,ZP>,\r\n<0.25159,0.39196,ZP>,\r\n<0.25160,0.40501,0.66009>,\r\n<0.25188,0.41805,0.66040>,\r\n<0.25230,0.43218,0.65105>,\r\n<0.24611,0.43534,0.63917>,\r\n<0.24011,0.43862,0.62789>,\r\n<0.23401,0.44189,0.61611>,\r\n<0.22793,0.44505,0.60447>,\r\n<0.22128,0.44771,0.59266>,\r\n<0.21730,0.45296,0.58149>,\r\n<0.21428,0.45908,0.57005>,\r\n<0.21037,0.46495,0.55913>,\r\n<0.20604,0.47028,0.54791>,\r\n<0.20111,0.47496,0.53707>,\r\n<0.19557,0.47934,0.52617>\r\n<0.20317,-0.46931,0.51873>,\r\n<0.20591,-0.46340,0.52980>,\r\n<0.20762,-0.45730,0.54081>,\r\n<0.21014,-0.45123,0.55202>,\r\n<0.21449,-0.44598,0.56314>,\r\n<0.22039,-0.44179,0.57437>,\r\n<0.22723,-0.43915,0.58577>,\r\n<0.23433,-0.43743,0.59723>,\r\n<0.24206,-0.43754,0.60859>,\r\n<0.24845,-0.43398,0.61941>,\r\n<0.25523,-0.43005,0.63064>,\r\n<0.26046,-0.42693,0.64265>,\r\n<0.26573,-0.42211,0.65595>,\r\n<0.26463,-0.40648,0.66024>,\r\n<0.26462,-0.39310,0.66008>,\r\n<0.26463,-0.37980,ZP>,\r\n<0.26431,-0.36636,ZP>,\r\n<0.26400,-0.35309,ZP>,\r\n<0.26363,-0.33985,ZP>,\r\n<0.26323,-0.32665,ZP>,\r\n<0.26283,-0.31350,ZP>,\r\n<0.26243,-0.30041,ZP>,\r\n<0.26204,-0.28736,ZP>,\r\n<0.26166,-0.27434,ZP>,\r\n<0.26130,-0.26135,ZP>,\r\n<0.26096,-0.24840,ZP>,\r\n<0.26064,-0.23548,ZP>,\r\n<0.26035,-0.22259,ZP>,\r\n<0.26008,-0.20973,ZP>,\r\n<0.25983,-0.19689,ZP>,\r\n<0.25961,-0.18408,ZP>,\r\n<0.25940,-0.17129,ZP>,\r\n<0.25922,-0.15852,ZP>,\r\n<0.25905,-0.14576,ZP>,\r\n<0.25891,-0.13302,ZP>,\r\n<0.25878,-0.12030,ZP>,\r\n<0.25866,-0.10759,ZP>,\r\n<0.25857,-0.09490,ZP>,\r\n<0.25848,-0.08222,ZP>,\r\n<0.25842,-0.06955,ZP>,\r\n<0.25836,-0.05689,ZP>,\r\n<0.25832,-0.04423,ZP>,\r\n<0.25829,-0.03159,ZP>,\r\n<0.25827,-0.01894,ZP>,\r\n<0.25826,-0.00630,ZP>,\r\n<0.25826,0.00634,ZP>,\r\n<0.25827,0.01898,ZP>,\r\n<0.25830,0.03163,ZP>,\r\n<0.25833,0.04427,ZP>,\r\n<0.25838,0.05693,ZP>,\r\n<0.25843,0.06959,ZP>,\r\n<0.25850,0.08226,ZP>,\r\n<0.25859,0.09494,ZP>,\r\n<0.25869,0.10764,ZP>,\r\n<0.25880,0.12034,ZP>,\r\n<0.25893,0.13306,ZP>,\r\n<0.25908,0.14579,ZP>,\r\n<0.25925,0.15854,ZP>,\r\n<0.25943,0.17131,ZP>,\r\n<0.25963,0.18409,ZP>,\r\n<0.25984,0.19689,ZP>,\r\n<0.26008,0.20971,ZP>,\r\n<0.26033,0.22256,ZP>,\r\n<0.26061,0.23544,ZP>,\r\n<0.26091,0.24834,ZP>,\r\n<0.26122,0.26127,ZP>,\r\n<0.26156,0.27423,ZP>,\r\n<0.26190,0.28722,ZP>,\r\n<0.26225,0.30024,ZP>,\r\n<0.26260,0.31330,ZP>,\r\n<0.26297,0.32642,ZP>,\r\n<0.26336,0.33961,ZP>,\r\n<0.26375,0.35283,ZP>,\r\n<0.26411,0.36606,ZP>,\r\n<0.26454,0.37945,ZP>,\r\n<0.26471,0.39263,0.66008>,\r\n<0.26492,0.40588,0.66023>,\r\n<0.26664,0.42133,0.65629>,\r\n<0.26146,0.42636,0.64262>,\r\n<0.25515,0.43005,0.63149>,\r\n<0.24891,0.43367,0.62028>,\r\n<0.24279,0.43714,0.60860>,\r\n<0.23495,0.43722,0.59709>,\r\n<0.22801,0.44004,0.58568>,\r\n<0.22178,0.44388,0.57454>,\r\n<0.21708,0.44901,0.56341>,\r\n<0.21466,0.45522,0.55232>,\r\n<0.21211,0.46142,0.54105>,\r\n<0.20857,0.46699,0.53028>,\r\n<0.20436,0.47271,0.51931>\r\n<0.20311,-0.45835,0.51251>,\r\n<0.20576,-0.45232,0.52381>,\r\n<0.20965,-0.44675,0.53463>,\r\n<0.21482,-0.44165,0.54552>,\r\n<0.22119,-0.43778,0.55644>,\r\n<0.22840,-0.43546,0.56747>,\r\n<0.23598,-0.43450,0.57849>,\r\n<0.24342,-0.43403,0.58962>,\r\n<0.25056,-0.43275,0.60089>,\r\n<0.25735,-0.43006,0.61214>,\r\n<0.26306,-0.42558,0.62336>,\r\n<0.26939,-0.42126,0.63443>,\r\n<0.27574,-0.41736,0.64560>,\r\n<0.27900,-0.40882,0.65947>,\r\n<0.27781,-0.39393,0.66019>,\r\n<0.27775,-0.38058,0.66008>,\r\n<0.27758,-0.36724,ZP>,\r\n<0.27714,-0.35377,ZP>,\r\n<0.27676,-0.34048,ZP>,\r\n<0.27635,-0.32723,ZP>,\r\n<0.27592,-0.31404,ZP>,\r\n<0.27548,-0.30089,ZP>,\r\n<0.27506,-0.28779,ZP>,\r\n<0.27464,-0.27473,ZP>,\r\n<0.27425,-0.26170,ZP>,\r\n<0.27387,-0.24872,ZP>,\r\n<0.27353,-0.23577,ZP>,\r\n<0.27321,-0.22285,ZP>,\r\n<0.27292,-0.20996,ZP>,\r\n<0.27265,-0.19711,ZP>,\r\n<0.27241,-0.18427,ZP>,\r\n<0.27219,-0.17146,ZP>,\r\n<0.27199,-0.15867,ZP>,\r\n<0.27180,-0.14589,ZP>,\r\n<0.27164,-0.13314,ZP>,\r\n<0.27150,-0.12040,ZP>,\r\n<0.27138,-0.10768,ZP>,\r\n<0.27128,-0.09497,ZP>,\r\n<0.27119,-0.08228,ZP>,\r\n<0.27112,-0.06959,ZP>,\r\n<0.27106,-0.05692,ZP>,\r\n<0.27101,-0.04426,ZP>,\r\n<0.27098,-0.03160,ZP>,\r\n<0.27096,-0.01895,ZP>,\r\n<0.27095,-0.00630,ZP>,\r\n<0.27095,0.00635,ZP>,\r\n<0.27096,0.01900,ZP>,\r\n<0.27098,0.03165,ZP>,\r\n<0.27102,0.04431,ZP>,\r\n<0.27107,0.05698,ZP>,\r\n<0.27113,0.06965,ZP>,\r\n<0.27121,0.08233,ZP>,\r\n<0.27130,0.09502,ZP>,\r\n<0.27141,0.10773,ZP>,\r\n<0.27153,0.12045,ZP>,\r\n<0.27168,0.13319,ZP>,\r\n<0.27184,0.14594,ZP>,\r\n<0.27202,0.15870,ZP>,\r\n<0.27222,0.17149,ZP>,\r\n<0.27243,0.18429,ZP>,\r\n<0.27267,0.19711,ZP>,\r\n<0.27293,0.20996,ZP>,\r\n<0.27321,0.22282,ZP>,\r\n<0.27351,0.23572,ZP>,\r\n<0.27384,0.24865,ZP>,\r\n<0.27418,0.26161,ZP>,\r\n<0.27455,0.27460,ZP>,\r\n<0.27493,0.28762,ZP>,\r\n<0.27531,0.30068,ZP>,\r\n<0.27570,0.31377,ZP>,\r\n<0.27608,0.32692,ZP>,\r\n<0.27647,0.34012,ZP>,\r\n<0.27687,0.35338,ZP>,\r\n<0.27740,0.36682,ZP>,\r\n<0.27770,0.38012,0.66008>,\r\n<0.27793,0.39335,0.66018>,\r\n<0.27921,0.40800,0.65972>,\r\n<0.27638,0.41696,0.64587>,\r\n<0.27005,0.42085,0.63462>,\r\n<0.26371,0.42481,0.62345>,\r\n<0.25774,0.42922,0.61203>,\r\n<0.25117,0.43235,0.60091>,\r\n<0.24354,0.43289,0.58968>,\r\n<0.23609,0.43400,0.57874>,\r\n<0.22857,0.43633,0.56764>,\r\n<0.22205,0.44000,0.55668>,\r\n<0.21689,0.44469,0.54583>,\r\n<0.21280,0.45035,0.53477>,\r\n<0.21036,0.45640,0.52385>,\r\n<0.20817,0.46273,0.51232>\r\n<0.20448,-0.44745,0.50647>,\r\n<0.20943,-0.44208,0.51735>,\r\n<0.21541,-0.43769,0.52792>,\r\n<0.22253,-0.43441,0.53853>,\r\n<0.23023,-0.43281,0.54916>,\r\n<0.23787,-0.43249,0.55984>,\r\n<0.24550,-0.43315,0.57059>,\r\n<0.25302,-0.43292,0.58164>,\r\n<0.26001,-0.43052,0.59273>,\r\n<0.26644,-0.42647,0.60390>,\r\n<0.27229,-0.42167,0.61507>,\r\n<0.27770,-0.41580,0.62610>,\r\n<0.28413,-0.41151,0.63702>,\r\n<0.29066,-0.40732,0.64816>,\r\n<0.29144,-0.39506,0.66059>,\r\n<0.29098,-0.38133,0.66016>,\r\n<0.29081,-0.36803,0.66008>,\r\n<0.29047,-0.35463,ZP>,\r\n<0.28993,-0.34112,ZP>,\r\n<0.28951,-0.32784,ZP>,\r\n<0.28906,-0.31460,ZP>,\r\n<0.28857,-0.30139,ZP>,\r\n<0.28810,-0.28824,ZP>,\r\n<0.28765,-0.27513,ZP>,\r\n<0.28722,-0.26206,ZP>,\r\n<0.28682,-0.24904,ZP>,\r\n<0.28645,-0.23606,ZP>,\r\n<0.28610,-0.22312,ZP>,\r\n<0.28579,-0.21021,ZP>,\r\n<0.28550,-0.19733,ZP>,\r\n<0.28523,-0.18447,ZP>,\r\n<0.28499,-0.17164,ZP>,\r\n<0.28477,-0.15882,ZP>,\r\n<0.28457,-0.14603,ZP>,\r\n<0.28440,-0.13326,ZP>,\r\n<0.28425,-0.12050,ZP>,\r\n<0.28411,-0.10776,ZP>,\r\n<0.28400,-0.09504,ZP>,\r\n<0.28391,-0.08234,ZP>,\r\n<0.28383,-0.06964,ZP>,\r\n<0.28377,-0.05696,ZP>,\r\n<0.28372,-0.04429,ZP>,\r\n<0.28368,-0.03162,ZP>,\r\n<0.28366,-0.01896,ZP>,\r\n<0.28365,-0.00630,ZP>,\r\n<0.28365,0.00636,ZP>,\r\n<0.28366,0.01902,ZP>,\r\n<0.28369,0.03168,ZP>,\r\n<0.28373,0.04435,ZP>,\r\n<0.28378,0.05702,ZP>,\r\n<0.28384,0.06971,ZP>,\r\n<0.28393,0.08240,ZP>,\r\n<0.28403,0.09511,ZP>,\r\n<0.28414,0.10783,ZP>,\r\n<0.28428,0.12057,ZP>,\r\n<0.28443,0.13332,ZP>,\r\n<0.28461,0.14609,ZP>,\r\n<0.28481,0.15887,ZP>,\r\n<0.28502,0.17168,ZP>,\r\n<0.28527,0.18450,ZP>,\r\n<0.28553,0.19735,ZP>,\r\n<0.28581,0.21021,ZP>,\r\n<0.28611,0.22310,ZP>,\r\n<0.28644,0.23602,ZP>,\r\n<0.28679,0.24897,ZP>,\r\n<0.28717,0.26196,ZP>,\r\n<0.28757,0.27499,ZP>,\r\n<0.28799,0.28805,ZP>,\r\n<0.28842,0.30115,ZP>,\r\n<0.28886,0.31429,ZP>,\r\n<0.28926,0.32745,ZP>,\r\n<0.28965,0.34066,ZP>,\r\n<0.29020,0.35412,ZP>,\r\n<0.29065,0.36749,0.66008>,\r\n<0.29095,0.38075,0.66015>,\r\n<0.29149,0.39425,0.66059>,\r\n<0.29123,0.40694,0.64854>,\r\n<0.28476,0.41108,0.63735>,\r\n<0.27831,0.41539,0.62634>,\r\n<0.27305,0.42113,0.61516>,\r\n<0.26684,0.42570,0.60388>,\r\n<0.26029,0.42928,0.59288>,\r\n<0.25291,0.43120,0.58156>,\r\n<0.24535,0.43118,0.57092>,\r\n<0.23748,0.43139,0.56011>,\r\n<0.22987,0.43296,0.54940>,\r\n<0.22298,0.43591,0.53876>,\r\n<0.21663,0.44055,0.52800>,\r\n<0.21163,0.44571,0.51762>,\r\n<0.20754,0.45149,0.50627>\r\n<0.20965,-0.43780,0.49989>,\r\n<0.21663,-0.43433,0.51033>,\r\n<0.22420,-0.43215,0.52054>,\r\n<0.23218,-0.43143,0.53082>,\r\n<0.23998,-0.43188,0.54128>,\r\n<0.24751,-0.43344,0.55187>,\r\n<0.25506,-0.43366,0.56269>,\r\n<0.26246,-0.43155,0.57359>,\r\n<0.26923,-0.42762,0.58453>,\r\n<0.27515,-0.42239,0.59545>,\r\n<0.28074,-0.41670,0.60633>,\r\n<0.28605,-0.41084,0.61730>,\r\n<0.29219,-0.40579,0.62839>,\r\n<0.29871,-0.40112,0.63913>,\r\n<0.30540,-0.39661,0.65032>,\r\n<0.30441,-0.38222,0.66065>,\r\n<0.30390,-0.36864,0.66027>,\r\n<0.30360,-0.35524,0.66017>,\r\n<0.30330,-0.34194,ZP>,\r\n<0.30270,-0.32845,ZP>,\r\n<0.30222,-0.31517,ZP>,\r\n<0.30170,-0.30191,ZP>,\r\n<0.30118,-0.28869,ZP>,\r\n<0.30068,-0.27553,ZP>,\r\n<0.30022,-0.26243,ZP>,\r\n<0.29979,-0.24938,ZP>,\r\n<0.29939,-0.23637,ZP>,\r\n<0.29902,-0.22340,ZP>,\r\n<0.29868,-0.21047,ZP>,\r\n<0.29837,-0.19756,ZP>,\r\n<0.29808,-0.18468,ZP>,\r\n<0.29781,-0.17182,ZP>,\r\n<0.29757,-0.15899,ZP>,\r\n<0.29736,-0.14617,ZP>,\r\n<0.29717,-0.13338,ZP>,\r\n<0.29700,-0.12060,ZP>,\r\n<0.29686,-0.10785,ZP>,\r\n<0.29675,-0.09512,ZP>,\r\n<0.29664,-0.08240,ZP>,\r\n<0.29656,-0.06969,ZP>,\r\n<0.29649,-0.05700,ZP>,\r\n<0.29644,-0.04432,ZP>,\r\n<0.29640,-0.03164,ZP>,\r\n<0.29638,-0.01897,ZP>,\r\n<0.29636,-0.00630,ZP>,\r\n<0.29636,0.00637,ZP>,\r\n<0.29638,0.01904,ZP>,\r\n<0.29641,0.03171,ZP>,\r\n<0.29645,0.04439,ZP>,\r\n<0.29650,0.05708,ZP>,\r\n<0.29657,0.06977,ZP>,\r\n<0.29666,0.08248,ZP>,\r\n<0.29676,0.09520,ZP>,\r\n<0.29689,0.10794,ZP>,\r\n<0.29703,0.12069,ZP>,\r\n<0.29720,0.13346,ZP>,\r\n<0.29739,0.14625,ZP>,\r\n<0.29761,0.15905,ZP>,\r\n<0.29785,0.17188,ZP>,\r\n<0.29812,0.18473,ZP>,\r\n<0.29840,0.19759,ZP>,\r\n<0.29871,0.21048,ZP>,\r\n<0.29905,0.22339,ZP>,\r\n<0.29940,0.23633,ZP>,\r\n<0.29978,0.24930,ZP>,\r\n<0.30019,0.26232,ZP>,\r\n<0.30062,0.27537,ZP>,\r\n<0.30109,0.28848,ZP>,\r\n<0.30158,0.30164,ZP>,\r\n<0.30205,0.31483,ZP>,\r\n<0.30249,0.32801,ZP>,\r\n<0.30303,0.34139,ZP>,\r\n<0.30332,0.35460,ZP>,\r\n<0.30363,0.36795,0.66012>,\r\n<0.30421,0.38151,0.66047>,\r\n<0.30574,0.39630,0.65118>,\r\n<0.29918,0.40077,0.63962>,\r\n<0.29271,0.40541,0.62881>,\r\n<0.28676,0.41054,0.61763>,\r\n<0.28145,0.41648,0.60653>,\r\n<0.27575,0.42198,0.59550>,\r\n<0.26950,0.42689,0.58451>,\r\n<0.26234,0.43033,0.57345>,\r\n<0.25488,0.43153,0.56301>,\r\n<0.24720,0.43058,0.55229>,\r\n<0.23942,0.43009,0.54160>,\r\n<0.23172,0.43071,0.53114>,\r\n<0.22380,0.43282,0.52068>,\r\n<0.21685,0.43627,0.51060>,\r\n<0.21066,0.44087,0.49974>\r\n<0.21832,-0.43186,0.49255>,\r\n<0.22623,-0.43106,0.50267>,\r\n<0.23419,-0.43103,0.51277>,\r\n<0.24187,-0.43238,0.52299>,\r\n<0.24934,-0.43479,0.53341>,\r\n<0.25705,-0.43487,0.54396>,\r\n<0.26472,-0.43286,0.55467>,\r\n<0.27176,-0.42896,0.56539>,\r\n<0.27783,-0.42355,0.57604>,\r\n<0.28303,-0.41732,0.58670>,\r\n<0.28824,-0.41106,0.59743>,\r\n<0.29388,-0.40534,0.60812>,\r\n<0.29993,-0.40008,0.61940>,\r\n<0.30639,-0.39520,0.63020>,\r\n<0.31298,-0.39014,0.64087>,\r\n<0.31947,-0.38504,0.65297>,\r\n<0.31731,-0.36946,0.66060>,\r\n<0.31686,-0.35586,0.66024>,\r\n<0.31661,-0.34264,ZP>,\r\n<0.31608,-0.32920,ZP>,\r\n<0.31541,-0.31572,ZP>,\r\n<0.31486,-0.30242,ZP>,\r\n<0.31430,-0.28916,ZP>,\r\n<0.31376,-0.27595,ZP>,\r\n<0.31326,-0.26280,ZP>,\r\n<0.31280,-0.24972,ZP>,\r\n<0.31237,-0.23669,ZP>,\r\n<0.31197,-0.22370,ZP>,\r\n<0.31160,-0.21073,ZP>,\r\n<0.31126,-0.19780,ZP>,\r\n<0.31094,-0.18489,ZP>,\r\n<0.31065,-0.17201,ZP>,\r\n<0.31039,-0.15915,ZP>,\r\n<0.31016,-0.14631,ZP>,\r\n<0.30995,-0.13350,ZP>,\r\n<0.30978,-0.12071,ZP>,\r\n<0.30963,-0.10794,ZP>,\r\n<0.30950,-0.09519,ZP>,\r\n<0.30940,-0.08246,ZP>,\r\n<0.30931,-0.06975,ZP>,\r\n<0.30924,-0.05704,ZP>,\r\n<0.30918,-0.04435,ZP>,\r\n<0.30914,-0.03166,ZP>,\r\n<0.30911,-0.01898,ZP>,\r\n<0.30910,-0.00630,ZP>,\r\n<0.30910,0.00638,ZP>,\r\n<0.30911,0.01906,ZP>,\r\n<0.30914,0.03174,ZP>,\r\n<0.30918,0.04443,ZP>,\r\n<0.30924,0.05713,ZP>,\r\n<0.30932,0.06984,ZP>,\r\n<0.30941,0.08256,ZP>,\r\n<0.30952,0.09530,ZP>,\r\n<0.30965,0.10805,ZP>,\r\n<0.30981,0.12081,ZP>,\r\n<0.30999,0.13360,ZP>,\r\n<0.31019,0.14641,ZP>,\r\n<0.31043,0.15924,ZP>,\r\n<0.31069,0.17209,ZP>,\r\n<0.31099,0.18496,ZP>,\r\n<0.31130,0.19785,ZP>,\r\n<0.31165,0.21076,ZP>,\r\n<0.31201,0.22369,ZP>,\r\n<0.31240,0.23665,ZP>,\r\n<0.31281,0.24965,ZP>,\r\n<0.31325,0.26268,ZP>,\r\n<0.31372,0.27577,ZP>,\r\n<0.31423,0.28893,ZP>,\r\n<0.31476,0.30213,ZP>,\r\n<0.31528,0.31536,ZP>,\r\n<0.31590,0.32874,ZP>,\r\n<0.31638,0.34208,ZP>,\r\n<0.31660,0.35519,0.66009>,\r\n<0.31701,0.36867,0.66037>,\r\n<0.31943,0.38444,0.65432>,\r\n<0.31351,0.38973,0.64141>,\r\n<0.30686,0.39484,0.63074>,\r\n<0.30038,0.39974,0.61987>,\r\n<0.29456,0.40521,0.60859>,\r\n<0.28900,0.41111,0.59772>,\r\n<0.28392,0.41734,0.58680>,\r\n<0.27825,0.42349,0.57611>,\r\n<0.27168,0.42840,0.56541>,\r\n<0.26447,0.43155,0.55488>,\r\n<0.25691,0.43268,0.54414>,\r\n<0.24912,0.43132,0.53342>,\r\n<0.24148,0.42979,0.52305>,\r\n<0.23360,0.42957,0.51289>,\r\n<0.22564,0.43067,0.50292>,\r\n<0.21764,0.43287,0.49263>\r\n<0.22831,-0.43111,0.48466>,\r\n<0.23601,-0.43217,0.49477>,\r\n<0.24346,-0.43421,0.50484>,\r\n<0.25094,-0.43652,0.51522>,\r\n<0.25891,-0.43636,0.52548>,\r\n<0.26682,-0.43428,0.53585>,\r\n<0.27399,-0.43022,0.54630>,\r\n<0.28006,-0.42457,0.55667>,\r\n<0.28520,-0.41797,0.56706>,\r\n<0.28989,-0.41114,0.57760>,\r\n<0.29502,-0.40481,0.58829>,\r\n<0.30082,-0.39911,0.59900>,\r\n<0.30741,-0.39435,0.61004>,\r\n<0.31377,-0.38934,0.62097>,\r\n<0.32027,-0.38405,0.63173>,\r\n<0.32824,-0.37810,0.63300>,\r\n<0.33274,-0.37254,0.65520>,\r\n<0.33025,-0.35663,0.66049>,\r\n<0.32981,-0.34317,0.66011>,\r\n<0.32939,-0.32981,ZP>,\r\n<0.32876,-0.31637,ZP>,\r\n<0.32802,-0.30288,ZP>,\r\n<0.32744,-0.28959,ZP>,\r\n<0.32688,-0.27636,ZP>,\r\n<0.32635,-0.26319,ZP>,\r\n<0.32585,-0.25008,ZP>,\r\n<0.32539,-0.23702,ZP>,\r\n<0.32496,-0.22400,ZP>,\r\n<0.32455,-0.21101,ZP>,\r\n<0.32417,-0.19804,ZP>,\r\n<0.32382,-0.18510,ZP>,\r\n<0.32350,-0.17219,ZP>,\r\n<0.32322,-0.15931,ZP>,\r\n<0.32297,-0.14645,ZP>,\r\n<0.32276,-0.13362,ZP>,\r\n<0.32257,-0.12082,ZP>,\r\n<0.32242,-0.10803,ZP>,\r\n<0.32228,-0.09527,ZP>,\r\n<0.32217,-0.08253,ZP>,\r\n<0.32208,-0.06980,ZP>,\r\n<0.32200,-0.05708,ZP>,\r\n<0.32194,-0.04438,ZP>,\r\n<0.32189,-0.03168,ZP>,\r\n<0.32186,-0.01899,ZP>,\r\n<0.32185,-0.00630,ZP>,\r\n<0.32185,0.00639,ZP>,\r\n<0.32186,0.01908,ZP>,\r\n<0.32189,0.03178,ZP>,\r\n<0.32193,0.04448,ZP>,\r\n<0.32199,0.05719,ZP>,\r\n<0.32207,0.06991,ZP>,\r\n<0.32217,0.08265,ZP>,\r\n<0.32229,0.09539,ZP>,\r\n<0.32243,0.10816,ZP>,\r\n<0.32259,0.12094,ZP>,\r\n<0.32279,0.13375,ZP>,\r\n<0.32301,0.14657,ZP>,\r\n<0.32327,0.15942,ZP>,\r\n<0.32355,0.17229,ZP>,\r\n<0.32388,0.18519,ZP>,\r\n<0.32423,0.19810,ZP>,\r\n<0.32461,0.21104,ZP>,\r\n<0.32501,0.22400,ZP>,\r\n<0.32544,0.23699,ZP>,\r\n<0.32589,0.25001,ZP>,\r\n<0.32637,0.26307,ZP>,\r\n<0.32686,0.27618,ZP>,\r\n<0.32739,0.28935,ZP>,\r\n<0.32794,0.30258,ZP>,\r\n<0.32863,0.31600,ZP>,\r\n<0.32923,0.32938,ZP>,\r\n<0.32960,0.34265,0.66010>,\r\n<0.32998,0.35597,0.66032>,\r\n<0.33236,0.37169,0.65651>,\r\n<0.32463,0.37513,0.64206>,\r\n<0.32067,0.38373,0.63235>,\r\n<0.31419,0.38900,0.62159>,\r\n<0.30778,0.39406,0.61056>,\r\n<0.30133,0.39904,0.59955>,\r\n<0.29574,0.40501,0.58867>,\r\n<0.29096,0.41143,0.57788>,\r\n<0.28609,0.41832,0.56739>,\r\n<0.28069,0.42462,0.55696>,\r\n<0.27404,0.42975,0.54646>,\r\n<0.26664,0.43295,0.53587>,\r\n<0.25850,0.43420,0.52543>,\r\n<0.25079,0.43320,0.51516>,\r\n<0.24342,0.43066,0.50479>,\r\n<0.23558,0.42993,0.49482>,\r\n<0.22730,0.42992,0.48487>\r\n<0.23740,-0.43464,0.47681>,\r\n<0.24467,-0.43741,0.48703>,\r\n<0.25248,-0.43846,0.49710>,\r\n<0.26062,-0.43801,0.50721>,\r\n<0.26868,-0.43565,0.51720>,\r\n<0.27599,-0.43127,0.52732>,\r\n<0.28195,-0.42528,0.53756>,\r\n<0.28675,-0.41849,0.54772>,\r\n<0.29101,-0.41127,0.55797>,\r\n<0.29564,-0.40433,0.56843>,\r\n<0.30121,-0.39826,0.57906>,\r\n<0.30745,-0.39294,0.58977>,\r\n<0.31463,-0.38862,0.60068>,\r\n<0.32094,-0.38344,0.61127>,\r\n<0.32740,-0.37796,0.62221>,\r\n<0.33388,-0.37228,0.63291>,\r\n<0.34030,-0.36662,0.64328>,\r\n<0.34576,-0.35947,0.65634>,\r\n<0.34318,-0.34371,0.66034>,\r\n<0.34261,-0.33021,0.66011>,\r\n<0.34207,-0.31688,ZP>,\r\n<0.34139,-0.30346,ZP>,\r\n<0.34063,-0.29001,ZP>,\r\n<0.34005,-0.27677,ZP>,\r\n<0.33950,-0.26360,ZP>,\r\n<0.33895,-0.25045,ZP>,\r\n<0.33844,-0.23736,ZP>,\r\n<0.33797,-0.22430,ZP>,\r\n<0.33752,-0.21127,ZP>,\r\n<0.33710,-0.19828,ZP>,\r\n<0.33672,-0.18531,ZP>,\r\n<0.33638,-0.17237,ZP>,\r\n<0.33607,-0.15946,ZP>,\r\n<0.33581,-0.14659,ZP>,\r\n<0.33558,-0.13374,ZP>,\r\n<0.33539,-0.12092,ZP>,\r\n<0.33522,-0.10813,ZP>,\r\n<0.33508,-0.09535,ZP>,\r\n<0.33496,-0.08259,ZP>,\r\n<0.33486,-0.06985,ZP>,\r\n<0.33478,-0.05712,ZP>,\r\n<0.33472,-0.04440,ZP>,\r\n<0.33467,-0.03170,ZP>,\r\n<0.33463,-0.01899,ZP>,\r\n<0.33461,-0.00629,ZP>,\r\n<0.33461,0.00641,ZP>,\r\n<0.33462,0.01911,ZP>,\r\n<0.33465,0.03182,ZP>,\r\n<0.33470,0.04453,ZP>,\r\n<0.33476,0.05725,ZP>,\r\n<0.33485,0.06999,ZP>,\r\n<0.33495,0.08274,ZP>,\r\n<0.33508,0.09550,ZP>,\r\n<0.33522,0.10828,ZP>,\r\n<0.33540,0.12108,ZP>,\r\n<0.33560,0.13389,ZP>,\r\n<0.33584,0.14673,ZP>,\r\n<0.33612,0.15960,ZP>,\r\n<0.33643,0.17249,ZP>,\r\n<0.33678,0.18541,ZP>,\r\n<0.33717,0.19836,ZP>,\r\n<0.33759,0.21132,ZP>,\r\n<0.33804,0.22432,ZP>,\r\n<0.33851,0.23733,ZP>,\r\n<0.33901,0.25038,ZP>,\r\n<0.33954,0.26348,ZP>,\r\n<0.34007,0.27660,ZP>,\r\n<0.34061,0.28977,ZP>,\r\n<0.34132,0.30317,ZP>,\r\n<0.34197,0.31654,ZP>,\r\n<0.34246,0.32982,0.66010>,\r\n<0.34298,0.34325,0.66031>,\r\n<0.34542,0.35880,0.65718>,\r\n<0.34050,0.36645,0.64397>,\r\n<0.33408,0.37211,0.63350>,\r\n<0.32769,0.37770,0.62295>,\r\n<0.32130,0.38313,0.61206>,\r\n<0.31495,0.38837,0.60119>,\r\n<0.30780,0.39276,0.59039>,\r\n<0.30181,0.39828,0.57948>,\r\n<0.29663,0.40459,0.56881>,\r\n<0.29228,0.41173,0.55846>,\r\n<0.28792,0.41892,0.54812>,\r\n<0.28252,0.42570,0.53774>,\r\n<0.27604,0.43100,0.52756>,\r\n<0.26826,0.43448,0.51752>,\r\n<0.26021,0.43594,0.50736>,\r\n<0.25227,0.43562,0.49710>,\r\n<0.24476,0.43347,0.48688>,\r\n<0.23709,0.43140,0.47694>\r\n<0.24587,-0.44014,0.46932>,\r\n<0.25387,-0.44072,0.47921>,\r\n<0.26218,-0.43970,0.48900>,\r\n<0.27025,-0.43691,0.49889>,\r\n<0.27747,-0.43217,0.50861>,\r\n<0.28342,-0.42577,0.51855>,\r\n<0.28807,-0.41858,0.52855>,\r\n<0.29183,-0.41109,0.53859>,\r\n<0.29592,-0.40381,0.54881>,\r\n<0.30112,-0.39729,0.55921>,\r\n<0.30739,-0.39169,0.56970>,\r\n<0.31412,-0.38687,0.58034>,\r\n<0.32101,-0.38217,0.59101>,\r\n<0.32794,-0.37748,0.60139>,\r\n<0.33481,-0.37138,0.61038>,\r\n<0.34067,-0.36602,0.62316>,\r\n<0.34696,-0.36011,0.63352>,\r\n<0.35341,-0.35401,0.64371>,\r\n<0.35870,-0.34622,0.65660>,\r\n<0.35588,-0.33063,0.66034>,\r\n<0.35516,-0.31712,0.66010>,\r\n<0.35460,-0.30378,ZP>,\r\n<0.35406,-0.29058,ZP>,\r\n<0.35328,-0.27719,ZP>,\r\n<0.35268,-0.26400,ZP>,\r\n<0.35209,-0.25082,ZP>,\r\n<0.35153,-0.23769,ZP>,\r\n<0.35100,-0.22459,ZP>,\r\n<0.35051,-0.21153,ZP>,\r\n<0.35005,-0.19850,ZP>,\r\n<0.34964,-0.18550,ZP>,\r\n<0.34927,-0.17254,ZP>,\r\n<0.34894,-0.15961,ZP>,\r\n<0.34867,-0.14672,ZP>,\r\n<0.34843,-0.13386,ZP>,\r\n<0.34822,-0.12103,ZP>,\r\n<0.34805,-0.10822,ZP>,\r\n<0.34790,-0.09543,ZP>,\r\n<0.34777,-0.08266,ZP>,\r\n<0.34767,-0.06990,ZP>,\r\n<0.34758,-0.05716,ZP>,\r\n<0.34751,-0.04443,ZP>,\r\n<0.34746,-0.03171,ZP>,\r\n<0.34742,-0.01900,ZP>,\r\n<0.34740,-0.00629,ZP>,\r\n<0.34739,0.00642,ZP>,\r\n<0.34740,0.01913,ZP>,\r\n<0.34743,0.03185,ZP>,\r\n<0.34748,0.04458,ZP>,\r\n<0.34755,0.05732,ZP>,\r\n<0.34764,0.07007,ZP>,\r\n<0.34775,0.08283,ZP>,\r\n<0.34788,0.09561,ZP>,\r\n<0.34804,0.10840,ZP>,\r\n<0.34822,0.12121,ZP>,\r\n<0.34844,0.13404,ZP>,\r\n<0.34870,0.14689,ZP>,\r\n<0.34899,0.15977,ZP>,\r\n<0.34933,0.17268,ZP>,\r\n<0.34971,0.18562,ZP>,\r\n<0.35013,0.19859,ZP>,\r\n<0.35060,0.21159,ZP>,\r\n<0.35110,0.22462,ZP>,\r\n<0.35163,0.23768,ZP>,\r\n<0.35218,0.25076,ZP>,\r\n<0.35275,0.26389,ZP>,\r\n<0.35333,0.27703,ZP>,\r\n<0.35406,0.29037,ZP>,\r\n<0.35455,0.30351,ZP>,\r\n<0.35504,0.31682,0.66010>,\r\n<0.35570,0.33028,0.66032>,\r\n<0.35845,0.34579,0.65719>,\r\n<0.35351,0.35393,0.64423>,\r\n<0.34704,0.36004,0.63406>,\r\n<0.34075,0.36595,0.62378>,\r\n<0.33446,0.37167,0.61308>,\r\n<0.32816,0.37727,0.60230>,\r\n<0.32105,0.38184,0.59154>,\r\n<0.31428,0.38647,0.58092>,\r\n<0.30764,0.39149,0.57018>,\r\n<0.30169,0.39739,0.55961>,\r\n<0.29694,0.40426,0.54924>,\r\n<0.29322,0.41177,0.53900>,\r\n<0.28923,0.41936,0.52881>,\r\n<0.28421,0.42626,0.51894>,\r\n<0.27778,0.43203,0.50914>,\r\n<0.26999,0.43595,0.49914>,\r\n<0.26178,0.43784,0.48912>,\r\n<0.25369,0.43812,0.47927>,\r\n<0.24564,0.43675,0.46936>\r\n<0.25529,-0.44329,0.46154>,\r\n<0.26363,-0.44151,0.47106>,\r\n<0.27160,-0.43804,0.48059>,\r\n<0.27867,-0.43276,0.49020>,\r\n<0.28441,-0.42612,0.49973>,\r\n<0.28886,-0.41862,0.50948>,\r\n<0.29228,-0.41077,0.51933>,\r\n<0.29592,-0.40320,0.52937>,\r\n<0.30085,-0.39643,0.53962>,\r\n<0.30688,-0.39057,0.54991>,\r\n<0.31384,-0.38563,0.56025>,\r\n<0.32104,-0.38129,0.57077>,\r\n<0.32810,-0.37687,0.58132>,\r\n<0.33489,-0.37198,0.59185>,\r\n<0.34141,-0.36647,0.60240>,\r\n<0.34748,-0.36050,0.61295>,\r\n<0.35328,-0.35385,0.62359>,\r\n<0.35957,-0.34752,0.63364>,\r\n<0.36603,-0.34094,0.64357>,\r\n<0.37162,-0.33302,0.65593>,\r\n<0.36865,-0.31756,0.66039>,\r\n<0.36793,-0.30411,0.66012>,\r\n<0.36740,-0.29101,0.66008>,\r\n<0.36668,-0.27771,ZP>,\r\n<0.36589,-0.26437,ZP>,\r\n<0.36525,-0.25116,ZP>,\r\n<0.36464,-0.23800,ZP>,\r\n<0.36406,-0.22487,ZP>,\r\n<0.36351,-0.21176,ZP>,\r\n<0.36301,-0.19869,ZP>,\r\n<0.36257,-0.18566,ZP>,\r\n<0.36218,-0.17268,ZP>,\r\n<0.36184,-0.15974,ZP>,\r\n<0.36155,-0.14684,ZP>,\r\n<0.36130,-0.13397,ZP>,\r\n<0.36108,-0.12113,ZP>,\r\n<0.36090,-0.10831,ZP>,\r\n<0.36074,-0.09551,ZP>,\r\n<0.36060,-0.08272,ZP>,\r\n<0.36049,-0.06995,ZP>,\r\n<0.36040,-0.05720,ZP>,\r\n<0.36032,-0.04446,ZP>,\r\n<0.36027,-0.03172,ZP>,\r\n<0.36023,-0.01900,ZP>,\r\n<0.36020,-0.00628,ZP>,\r\n<0.36019,0.00644,ZP>,\r\n<0.36020,0.01916,ZP>,\r\n<0.36023,0.03189,ZP>,\r\n<0.36028,0.04463,ZP>,\r\n<0.36035,0.05738,ZP>,\r\n<0.36044,0.07015,ZP>,\r\n<0.36056,0.08293,ZP>,\r\n<0.36070,0.09572,ZP>,\r\n<0.36087,0.10852,ZP>,\r\n<0.36107,0.12134,ZP>,\r\n<0.36131,0.13418,ZP>,\r\n<0.36158,0.14704,ZP>,\r\n<0.36189,0.15993,ZP>,\r\n<0.36225,0.17285,ZP>,\r\n<0.36265,0.18580,ZP>,\r\n<0.36311,0.19880,ZP>,\r\n<0.36362,0.21184,ZP>,\r\n<0.36418,0.22491,ZP>,\r\n<0.36476,0.23801,ZP>,\r\n<0.36536,0.25112,ZP>,\r\n<0.36598,0.26429,ZP>,\r\n<0.36674,0.27759,ZP>,\r\n<0.36746,0.29090,0.66009>,\r\n<0.36794,0.30395,0.66013>,\r\n<0.36856,0.31732,0.66038>,\r\n<0.37146,0.33274,0.65640>,\r\n<0.36609,0.34090,0.64396>,\r\n<0.35963,0.34746,0.63408>,\r\n<0.35337,0.35376,0.62405>,\r\n<0.34772,0.36033,0.61341>,\r\n<0.34154,0.36635,0.60283>,\r\n<0.33491,0.37173,0.59230>,\r\n<0.32810,0.37642,0.58176>,\r\n<0.32101,0.38072,0.57121>,\r\n<0.31376,0.38518,0.56071>,\r\n<0.30698,0.39040,0.55027>,\r\n<0.30132,0.39663,0.53995>,\r\n<0.29700,0.40376,0.52975>,\r\n<0.29382,0.41162,0.51968>,\r\n<0.29024,0.41942,0.50994>,\r\n<0.28541,0.42663,0.50028>,\r\n<0.27900,0.43287,0.49062>,\r\n<0.27145,0.43726,0.48101>,\r\n<0.26323,0.43975,0.47128>,\r\n<0.25485,0.44072,0.46167>\r\n<0.26497,-0.44332,0.45326>,\r\n<0.27273,-0.43900,0.46245>,\r\n<0.27962,-0.43328,0.47160>,\r\n<0.28519,-0.42627,0.48112>,\r\n<0.28931,-0.41853,0.49060>,\r\n<0.29234,-0.41040,0.50028>,\r\n<0.29577,-0.40262,0.51010>,\r\n<0.30053,-0.39560,0.52009>,\r\n<0.30648,-0.38956,0.53027>,\r\n<0.31333,-0.38459,0.54036>,\r\n<0.32076,-0.38041,0.55058>,\r\n<0.32827,-0.37645,0.56104>,\r\n<0.33544,-0.37206,0.57147>,\r\n<0.34204,-0.36697,0.58191>,\r\n<0.34830,-0.36105,0.59235>,\r\n<0.35414,-0.35478,0.60266>,\r\n<0.35980,-0.34803,0.61308>,\r\n<0.36556,-0.34117,0.62345>,\r\n<0.37176,-0.33447,0.63318>,\r\n<0.37511,-0.32527,0.64239>,\r\n<0.38433,-0.31987,0.65380>,\r\n<0.38145,-0.30467,0.66048>,\r\n<0.38063,-0.29129,0.66016>,\r\n<0.37995,-0.27799,0.66008>,\r\n<0.37925,-0.26480,ZP>,\r\n<0.37849,-0.25153,ZP>,\r\n<0.37775,-0.23827,ZP>,\r\n<0.37712,-0.22510,ZP>,\r\n<0.37653,-0.21196,ZP>,\r\n<0.37598,-0.19885,ZP>,\r\n<0.37551,-0.18580,ZP>,\r\n<0.37511,-0.17280,ZP>,\r\n<0.37477,-0.15986,ZP>,\r\n<0.37446,-0.14696,ZP>,\r\n<0.37420,-0.13408,ZP>,\r\n<0.37397,-0.12123,ZP>,\r\n<0.37377,-0.10840,ZP>,\r\n<0.37360,-0.09559,ZP>,\r\n<0.37345,-0.08279,ZP>,\r\n<0.37333,-0.07000,ZP>,\r\n<0.37324,-0.05723,ZP>,\r\n<0.37316,-0.04447,ZP>,\r\n<0.37310,-0.03173,ZP>,\r\n<0.37305,-0.01900,ZP>,\r\n<0.37302,-0.00627,ZP>,\r\n<0.37301,0.00645,ZP>,\r\n<0.37302,0.01919,ZP>,\r\n<0.37304,0.03193,ZP>,\r\n<0.37309,0.04468,ZP>,\r\n<0.37316,0.05745,ZP>,\r\n<0.37326,0.07023,ZP>,\r\n<0.37339,0.08302,ZP>,\r\n<0.37354,0.09583,ZP>,\r\n<0.37373,0.10864,ZP>,\r\n<0.37395,0.12148,ZP>,\r\n<0.37420,0.13432,ZP>,\r\n<0.37449,0.14718,ZP>,\r\n<0.37482,0.16007,ZP>,\r\n<0.37519,0.17298,ZP>,\r\n<0.37561,0.18595,ZP>,\r\n<0.37610,0.19897,ZP>,\r\n<0.37666,0.21205,ZP>,\r\n<0.37726,0.22516,ZP>,\r\n<0.37789,0.23829,ZP>,\r\n<0.37862,0.25152,ZP>,\r\n<0.37936,0.26475,ZP>,\r\n<0.38002,0.27792,0.66008>,\r\n<0.38067,0.29126,0.66016>,\r\n<0.38141,0.30459,0.66049>,\r\n<0.38430,0.31979,0.65404>,\r\n<0.37533,0.32493,0.64234>,\r\n<0.37174,0.33449,0.63353>,\r\n<0.36560,0.34112,0.62382>,\r\n<0.36013,0.34795,0.61354>,\r\n<0.35446,0.35476,0.60309>,\r\n<0.34856,0.36111,0.59283>,\r\n<0.34230,0.36675,0.58238>,\r\n<0.33547,0.37163,0.57185>,\r\n<0.32815,0.37580,0.56143>,\r\n<0.32053,0.37969,0.55114>,\r\n<0.31317,0.38402,0.54082>,\r\n<0.30656,0.38929,0.53059>,\r\n<0.30101,0.39576,0.52052>,\r\n<0.29685,0.40321,0.51055>,\r\n<0.29397,0.41138,0.50076>,\r\n<0.29082,0.41937,0.49114>,\r\n<0.28616,0.42687,0.48165>,\r\n<0.28006,0.43340,0.47229>,\r\n<0.27256,0.43833,0.46293>,\r\n<0.26456,0.44184,0.45357>\r\n<0.27363,-0.44006,0.44447>,\r\n<0.28014,-0.43367,0.45353>,\r\n<0.28554,-0.42642,0.46256>,\r\n<0.28944,-0.41840,0.47200>,\r\n<0.29213,-0.41014,0.48142>,\r\n<0.29547,-0.40212,0.49102>,\r\n<0.30019,-0.39493,0.50079>,\r\n<0.30612,-0.38871,0.51067>,\r\n<0.31308,-0.38368,0.52073>,\r\n<0.32060,-0.37970,0.53070>,\r\n<0.32830,-0.37619,0.54087>,\r\n<0.33584,-0.37233,0.55121>,\r\n<0.34293,-0.36755,0.56149>,\r\n<0.34925,-0.36190,0.57181>,\r\n<0.35499,-0.35553,0.58212>,\r\n<0.36038,-0.34875,0.59236>,\r\n<0.36576,-0.34182,0.60255>,\r\n<0.37134,-0.33484,0.61281>,\r\n<0.37739,-0.32806,0.62268>,\r\n<0.38344,-0.32101,0.63208>,\r\n<0.38958,-0.31370,0.64110>,\r\n<0.39611,-0.30603,0.65091>,\r\n<0.39414,-0.29179,0.66060>,\r\n<0.39318,-0.27821,0.66018>,\r\n<0.39243,-0.26496,0.66008>,\r\n<0.39174,-0.25184,ZP>,\r\n<0.39097,-0.23860,ZP>,\r\n<0.39013,-0.22525,ZP>,\r\n<0.38951,-0.21206,ZP>,\r\n<0.38898,-0.19895,ZP>,\r\n<0.38851,-0.18590,ZP>,\r\n<0.38809,-0.17291,ZP>,\r\n<0.38773,-0.15996,ZP>,\r\n<0.38741,-0.14706,ZP>,\r\n<0.38713,-0.13418,ZP>,\r\n<0.38689,-0.12133,ZP>,\r\n<0.38667,-0.10849,ZP>,\r\n<0.38648,-0.09566,ZP>,\r\n<0.38632,-0.08284,ZP>,\r\n<0.38619,-0.07004,ZP>,\r\n<0.38609,-0.05726,ZP>,\r\n<0.38601,-0.04449,ZP>,\r\n<0.38595,-0.03173,ZP>,\r\n<0.38590,-0.01899,ZP>,\r\n<0.38587,-0.00626,ZP>,\r\n<0.38585,0.00647,ZP>,\r\n<0.38585,0.01921,ZP>,\r\n<0.38587,0.03196,ZP>,\r\n<0.38591,0.04472,ZP>,\r\n<0.38599,0.05750,ZP>,\r\n<0.38609,0.07030,ZP>,\r\n<0.38623,0.08311,ZP>,\r\n<0.38640,0.09593,ZP>,\r\n<0.38661,0.10876,ZP>,\r\n<0.38685,0.12160,ZP>,\r\n<0.38713,0.13444,ZP>,\r\n<0.38744,0.14730,ZP>,\r\n<0.38779,0.16018,ZP>,\r\n<0.38818,0.17310,ZP>,\r\n<0.38862,0.18606,ZP>,\r\n<0.38911,0.19908,ZP>,\r\n<0.38966,0.21217,ZP>,\r\n<0.39029,0.22532,ZP>,\r\n<0.39112,0.23864,ZP>,\r\n<0.39188,0.25185,ZP>,\r\n<0.39254,0.26496,0.66008>,\r\n<0.39324,0.27819,0.66018>,\r\n<0.39413,0.29183,0.66061>,\r\n<0.39606,0.30609,0.65093>,\r\n<0.38950,0.31385,0.64040>,\r\n<0.38340,0.32107,0.63221>,\r\n<0.37734,0.32811,0.62285>,\r\n<0.37136,0.33481,0.61307>,\r\n<0.36603,0.34191,0.60285>,\r\n<0.36079,0.34894,0.59270>,\r\n<0.35551,0.35563,0.58262>,\r\n<0.34958,0.36197,0.57243>,\r\n<0.34303,0.36739,0.56201>,\r\n<0.33582,0.37179,0.55169>,\r\n<0.32817,0.37534,0.54149>,\r\n<0.32040,0.37876,0.53125>,\r\n<0.31291,0.38294,0.52114>,\r\n<0.30619,0.38839,0.51117>,\r\n<0.30068,0.39510,0.50133>,\r\n<0.29651,0.40281,0.49157>,\r\n<0.29392,0.41100,0.48190>,\r\n<0.29098,0.41921,0.47253>,\r\n<0.28661,0.42697,0.46335>,\r\n<0.28058,0.43383,0.45421>,\r\n<0.27370,0.43962,0.44502>\r\n<0.28027,-0.43414,0.43541>,\r\n<0.28532,-0.42647,0.44449>,\r\n<0.28935,-0.41846,0.45346>,\r\n<0.29176,-0.40986,0.46285>,\r\n<0.29509,-0.40185,0.47221>,\r\n<0.29986,-0.39441,0.48172>,\r\n<0.30587,-0.38803,0.49145>,\r\n<0.31290,-0.38299,0.50123>,\r\n<0.32057,-0.37912,0.51114>,\r\n<0.32842,-0.37598,0.52109>,\r\n<0.33619,-0.37261,0.53120>,\r\n<0.34352,-0.36830,0.54135>,\r\n<0.35016,-0.36287,0.55151>,\r\n<0.35600,-0.35646,0.56174>,\r\n<0.36117,-0.34958,0.57192>,\r\n<0.36604,-0.34245,0.58206>,\r\n<0.37112,-0.33528,0.59210>,\r\n<0.37696,-0.32852,0.60206>,\r\n<0.38283,-0.32165,0.61181>,\r\n<0.38874,-0.31452,0.62135>,\r\n<0.39463,-0.30714,0.63053>,\r\n<0.40058,-0.29944,0.63949>,\r\n<0.40678,-0.29145,0.64848>,\r\n<0.40783,-0.27945,0.65974>,\r\n<0.40569,-0.26515,0.66023>,\r\n<0.40481,-0.25184,0.66009>,\r\n<0.40407,-0.23871,ZP>,\r\n<0.40330,-0.22547,ZP>,\r\n<0.40253,-0.21217,ZP>,\r\n<0.40196,-0.19900,ZP>,\r\n<0.40150,-0.18595,ZP>,\r\n<0.40111,-0.17299,ZP>,\r\n<0.40074,-0.16005,ZP>,\r\n<0.40041,-0.14716,ZP>,\r\n<0.40010,-0.13427,ZP>,\r\n<0.39983,-0.12141,ZP>,\r\n<0.39959,-0.10856,ZP>,\r\n<0.39939,-0.09572,ZP>,\r\n<0.39921,-0.08289,ZP>,\r\n<0.39907,-0.07008,ZP>,\r\n<0.39896,-0.05728,ZP>,\r\n<0.39888,-0.04450,ZP>,\r\n<0.39881,-0.03173,ZP>,\r\n<0.39877,-0.01898,ZP>,\r\n<0.39874,-0.00624,ZP>,\r\n<0.39871,0.00649,ZP>,\r\n<0.39870,0.01924,ZP>,\r\n<0.39871,0.03199,ZP>,\r\n<0.39875,0.04476,ZP>,\r\n<0.39883,0.05755,ZP>,\r\n<0.39894,0.07036,ZP>,\r\n<0.39909,0.08318,ZP>,\r\n<0.39929,0.09602,ZP>,\r\n<0.39952,0.10885,ZP>,\r\n<0.39979,0.12170,ZP>,\r\n<0.40010,0.13454,ZP>,\r\n<0.40045,0.14741,ZP>,\r\n<0.40082,0.16027,ZP>,\r\n<0.40122,0.17318,ZP>,\r\n<0.40163,0.18611,ZP>,\r\n<0.40210,0.19913,ZP>,\r\n<0.40268,0.21228,ZP>,\r\n<0.40345,0.22556,ZP>,\r\n<0.40422,0.23879,ZP>,\r\n<0.40494,0.25190,0.66009>,\r\n<0.40580,0.26520,0.66023>,\r\n<0.40791,0.27951,0.65969>,\r\n<0.40672,0.29153,0.64846>,\r\n<0.40054,0.29949,0.63955>,\r\n<0.39464,0.30712,0.63056>,\r\n<0.38874,0.31451,0.62131>,\r\n<0.38281,0.32168,0.61184>,\r\n<0.37697,0.32850,0.60229>,\r\n<0.37134,0.33539,0.59233>,\r\n<0.36660,0.34254,0.58231>,\r\n<0.36179,0.34982,0.57227>,\r\n<0.35648,0.35683,0.56223>,\r\n<0.35050,0.36297,0.55209>,\r\n<0.34371,0.36802,0.54188>,\r\n<0.33626,0.37189,0.53176>,\r\n<0.32826,0.37493,0.52172>,\r\n<0.32022,0.37813,0.51171>,\r\n<0.31264,0.38225,0.50178>,\r\n<0.30586,0.38779,0.49199>,\r\n<0.30030,0.39467,0.48235>,\r\n<0.29621,0.40236,0.47274>,\r\n<0.29352,0.41074,0.46338>,\r\n<0.29087,0.41919,0.45425>,\r\n<0.28634,0.42704,0.44527>,\r\n<0.28107,0.43438,0.43620>\r\n<0.28486,-0.42670,0.42629>,\r\n<0.28839,-0.41828,0.43536>,\r\n<0.29124,-0.40980,0.44435>,\r\n<0.29475,-0.40160,0.45368>,\r\n<0.29951,-0.39416,0.46298>,\r\n<0.30562,-0.38763,0.47242>,\r\n<0.31282,-0.38250,0.48208>,\r\n<0.32063,-0.37869,0.49173>,\r\n<0.32871,-0.37575,0.50152>,\r\n<0.33665,-0.37279,0.51141>,\r\n<0.34416,-0.36885,0.52146>,\r\n<0.35101,-0.36368,0.53149>,\r\n<0.35690,-0.35747,0.54154>,\r\n<0.36196,-0.35045,0.55167>,\r\n<0.36650,-0.34303,0.56171>,\r\n<0.37103,-0.33558,0.57167>,\r\n<0.37598,-0.32841,0.58154>,\r\n<0.38150,-0.32148,0.59122>,\r\n<0.38811,-0.31527,0.60094>,\r\n<0.39382,-0.30808,0.61034>,\r\n<0.39954,-0.30064,0.61971>,\r\n<0.40524,-0.29295,0.62871>,\r\n<0.41094,-0.28497,0.63732>,\r\n<0.41680,-0.27661,0.64588>,\r\n<0.42102,-0.26696,0.65631>,\r\n<0.41773,-0.25220,0.66027>,\r\n<0.41649,-0.23839,ZP>,\r\n<0.41620,-0.22523,ZP>,\r\n<0.41564,-0.21218,ZP>,\r\n<0.41518,-0.19918,ZP>,\r\n<0.41456,-0.18600,ZP>,\r\n<0.41417,-0.17303,ZP>,\r\n<0.41380,-0.16011,ZP>,\r\n<0.41346,-0.14724,ZP>,\r\n<0.41312,-0.13435,ZP>,\r\n<0.41281,-0.12148,ZP>,\r\n<0.41254,-0.10861,ZP>,\r\n<0.41231,-0.09576,ZP>,\r\n<0.41212,-0.08292,ZP>,\r\n<0.41197,-0.07010,ZP>,\r\n<0.41185,-0.05729,ZP>,\r\n<0.41177,-0.04450,ZP>,\r\n<0.41171,-0.03172,ZP>,\r\n<0.41167,-0.01897,ZP>,\r\n<0.41163,-0.00622,ZP>,\r\n<0.41160,0.00652,ZP>,\r\n<0.41159,0.01926,ZP>,\r\n<0.41158,0.03201,ZP>,\r\n<0.41161,0.04478,ZP>,\r\n<0.41168,0.05757,ZP>,\r\n<0.41179,0.07039,ZP>,\r\n<0.41196,0.08322,ZP>,\r\n<0.41218,0.09607,ZP>,\r\n<0.41245,0.10892,ZP>,\r\n<0.41277,0.12177,ZP>,\r\n<0.41312,0.13462,ZP>,\r\n<0.41351,0.14748,ZP>,\r\n<0.41390,0.16032,ZP>,\r\n<0.41430,0.17321,ZP>,\r\n<0.41472,0.18615,ZP>,\r\n<0.41533,0.19930,ZP>,\r\n<0.41578,0.21228,ZP>,\r\n<0.41634,0.22535,ZP>,\r\n<0.41666,0.23858,ZP>,\r\n<0.41794,0.25227,0.66025>,\r\n<0.42116,0.26696,0.65611>,\r\n<0.41677,0.27665,0.64582>,\r\n<0.41089,0.28503,0.63731>,\r\n<0.40523,0.29297,0.62874>,\r\n<0.39955,0.30063,0.61971>,\r\n<0.39384,0.30806,0.61030>,\r\n<0.38811,0.31527,0.60091>,\r\n<0.38147,0.32145,0.59137>,\r\n<0.37614,0.32838,0.58175>,\r\n<0.37145,0.33567,0.57191>,\r\n<0.36721,0.34321,0.56200>,\r\n<0.36278,0.35070,0.55206>,\r\n<0.35758,0.35768,0.54210>,\r\n<0.35142,0.36373,0.53202>,\r\n<0.34435,0.36854,0.52200>,\r\n<0.33648,0.37208,0.51203>,\r\n<0.32824,0.37475,0.50210>,\r\n<0.32017,0.37771,0.49228>,\r\n<0.31244,0.38184,0.48257>,\r\n<0.30562,0.38741,0.47301>,\r\n<0.30005,0.39431,0.46346>,\r\n<0.29574,0.40218,0.45426>,\r\n<0.29287,0.41058,0.44516>,\r\n<0.28998,0.41912,0.43617>,\r\n<0.28615,0.42721,0.42716>\r\n<0.28755,-0.41846,0.41722>,\r\n<0.29060,-0.40976,0.42621>,\r\n<0.29442,-0.40163,0.43515>,\r\n<0.29935,-0.39402,0.44441>,\r\n<0.30541,-0.38747,0.45367>,\r\n<0.31268,-0.38230,0.46305>,\r\n<0.32063,-0.37847,0.47264>,\r\n<0.32885,-0.37568,0.48221>,\r\n<0.33698,-0.37296,0.49192>,\r\n<0.34466,-0.36929,0.50179>,\r\n<0.35164,-0.36437,0.51180>,\r\n<0.35772,-0.35822,0.52173>,\r\n<0.36276,-0.35112,0.53165>,\r\n<0.36701,-0.34348,0.54153>,\r\n<0.37097,-0.33577,0.55144>,\r\n<0.37535,-0.32829,0.56132>,\r\n<0.38048,-0.32133,0.57103>,\r\n<0.38634,-0.31474,0.58064>,\r\n<0.39261,-0.30832,0.59007>,\r\n<0.39893,-0.30178,0.59933>,\r\n<0.40507,-0.29493,0.60841>,\r\n<0.41040,-0.28699,0.61757>,\r\n<0.41522,-0.27857,0.62632>,\r\n<0.42069,-0.27029,0.63463>,\r\n<0.42611,-0.26179,0.64256>,\r\n<0.43191,-0.25255,0.65107>,\r\n<0.43076,-0.23917,0.66012>,\r\n<0.42910,-0.22552,0.66015>,\r\n<0.42825,-0.21209,ZP>,\r\n<0.42804,-0.19896,ZP>,\r\n<0.42770,-0.18596,ZP>,\r\n<0.42742,-0.17320,ZP>,\r\n<0.42690,-0.16016,ZP>,\r\n<0.42651,-0.14726,ZP>,\r\n<0.42616,-0.13437,ZP>,\r\n<0.42583,-0.12151,ZP>,\r\n<0.42553,-0.10865,ZP>,\r\n<0.42527,-0.09580,ZP>,\r\n<0.42504,-0.08295,ZP>,\r\n<0.42487,-0.07011,ZP>,\r\n<0.42474,-0.05728,ZP>,\r\n<0.42466,-0.04448,ZP>,\r\n<0.42461,-0.03171,ZP>,\r\n<0.42457,-0.01894,ZP>,\r\n<0.42454,-0.00619,ZP>,\r\n<0.42451,0.00656,ZP>,\r\n<0.42449,0.01930,ZP>,\r\n<0.42448,0.03204,ZP>,\r\n<0.42449,0.04479,ZP>,\r\n<0.42455,0.05757,ZP>,\r\n<0.42467,0.07039,ZP>,\r\n<0.42487,0.08324,ZP>,\r\n<0.42513,0.09610,ZP>,\r\n<0.42544,0.10894,ZP>,\r\n<0.42580,0.12178,ZP>,\r\n<0.42618,0.13461,ZP>,\r\n<0.42659,0.14746,ZP>,\r\n<0.42703,0.16034,ZP>,\r\n<0.42757,0.17335,ZP>,\r\n<0.42791,0.18614,ZP>,\r\n<0.42823,0.19907,ZP>,\r\n<0.42821,0.21217,ZP>,\r\n<0.42907,0.22571,0.66013>,\r\n<0.43086,0.23949,ZP>,\r\n<0.43189,0.25255,0.65085>,\r\n<0.42610,0.26178,0.64249>,\r\n<0.42065,0.27034,0.63456>,\r\n<0.41520,0.27859,0.62625>,\r\n<0.41036,0.28701,0.61771>,\r\n<0.40488,0.29477,0.60862>,\r\n<0.39864,0.30155,0.59944>,\r\n<0.39234,0.30812,0.59014>,\r\n<0.38627,0.31447,0.58071>,\r\n<0.38058,0.32115,0.57114>,\r\n<0.37564,0.32834,0.56142>,\r\n<0.37161,0.33601,0.55166>,\r\n<0.36784,0.34390,0.54193>,\r\n<0.36357,0.35156,0.53209>,\r\n<0.35833,0.35858,0.52214>,\r\n<0.35198,0.36449,0.51225>,\r\n<0.34467,0.36905,0.50232>,\r\n<0.33662,0.37227,0.49240>,\r\n<0.32834,0.37464,0.48267>,\r\n<0.32010,0.37753,0.47302>,\r\n<0.31234,0.38164,0.46355>,\r\n<0.30538,0.38732,0.45409>,\r\n<0.29968,0.39432,0.44498>,\r\n<0.29525,0.40217,0.43592>,\r\n<0.29181,0.41056,0.42704>,\r\n<0.28921,0.41920,0.41805>\r\n<0.29001,-0.41008,0.40815>,\r\n<0.29419,-0.40183,0.41699>,\r\n<0.29918,-0.39423,0.42586>,\r\n<0.30544,-0.38756,0.43503>,\r\n<0.31265,-0.38230,0.44426>,\r\n<0.32057,-0.37845,0.45361>,\r\n<0.32888,-0.37571,0.46314>,\r\n<0.33716,-0.37315,0.47269>,\r\n<0.34505,-0.36960,0.48235>,\r\n<0.35224,-0.36481,0.49210>,\r\n<0.35839,-0.35876,0.50193>,\r\n<0.36341,-0.35168,0.51175>,\r\n<0.36745,-0.34394,0.52162>,\r\n<0.37098,-0.33593,0.53140>,\r\n<0.37477,-0.32814,0.54120>,\r\n<0.37938,-0.32088,0.55095>,\r\n<0.38509,-0.31428,0.56053>,\r\n<0.39154,-0.30819,0.57002>,\r\n<0.39819,-0.30241,0.57929>,\r\n<0.40480,-0.29628,0.58847>,\r\n<0.41089,-0.28943,0.59756>,\r\n<0.41625,-0.28175,0.60638>,\r\n<0.42089,-0.27335,0.61507>,\r\n<0.42458,-0.26414,0.62336>,\r\n<0.42989,-0.25538,0.63140>,\r\n<0.43524,-0.24625,0.63914>,\r\n<0.43096,-0.24307,0.65001>,\r\n<0.44457,-0.22687,0.65542>,\r\n<0.44167,-0.21249,0.66041>,\r\n<0.44120,-0.19898,0.66011>,\r\n<0.44078,-0.18586,ZP>,\r\n<0.44054,-0.17309,ZP>,\r\n<0.44017,-0.16022,ZP>,\r\n<0.43973,-0.14738,ZP>,\r\n<0.43923,-0.13440,ZP>,\r\n<0.43882,-0.12148,ZP>,\r\n<0.43851,-0.10861,ZP>,\r\n<0.43822,-0.09575,ZP>,\r\n<0.43799,-0.08290,ZP>,\r\n<0.43781,-0.07007,ZP>,\r\n<0.43770,-0.05727,ZP>,\r\n<0.43763,-0.04449,ZP>,\r\n<0.43757,-0.03170,ZP>,\r\n<0.43752,-0.01892,ZP>,\r\n<0.43748,-0.00615,ZP>,\r\n<0.43746,0.00661,ZP>,\r\n<0.43745,0.01935,ZP>,\r\n<0.43744,0.03206,ZP>,\r\n<0.43744,0.04479,ZP>,\r\n<0.43745,0.05752,ZP>,\r\n<0.43754,0.07031,ZP>,\r\n<0.43773,0.08317,ZP>,\r\n<0.43802,0.09604,ZP>,\r\n<0.43838,0.10889,ZP>,\r\n<0.43881,0.12171,ZP>,\r\n<0.43931,0.13459,ZP>,\r\n<0.43987,0.14751,ZP>,\r\n<0.44032,0.16033,ZP>,\r\n<0.44070,0.17318,ZP>,\r\n<0.44095,0.18609,ZP>,\r\n<0.44137,0.19918,0.66011>,\r\n<0.44181,0.21256,0.66037>,\r\n<0.44447,0.22706,0.65533>,\r\n<0.43143,0.24262,0.65008>,\r\n<0.43514,0.24641,0.63905>,\r\n<0.42984,0.25547,0.63133>,\r\n<0.42482,0.26417,0.62324>,\r\n<0.42119,0.27344,0.61505>,\r\n<0.41640,0.28180,0.60643>,\r\n<0.41073,0.28932,0.59768>,\r\n<0.40443,0.29597,0.58869>,\r\n<0.39780,0.30196,0.57942>,\r\n<0.39123,0.30776,0.57006>,\r\n<0.38491,0.31403,0.56068>,\r\n<0.37940,0.32097,0.55112>,\r\n<0.37510,0.32856,0.54148>,\r\n<0.37173,0.33653,0.53183>,\r\n<0.36840,0.34452,0.52200>,\r\n<0.36428,0.35224,0.51219>,\r\n<0.35902,0.35918,0.50241>,\r\n<0.35249,0.36495,0.49257>,\r\n<0.34487,0.36939,0.48274>,\r\n<0.33679,0.37240,0.47309>,\r\n<0.32839,0.37464,0.46348>,\r\n<0.32009,0.37750,0.45405>,\r\n<0.31213,0.38177,0.44468>,\r\n<0.30515,0.38747,0.43559>,\r\n<0.29940,0.39448,0.42653>,\r\n<0.29474,0.40232,0.41772>,\r\n<0.29107,0.41076,0.40889>\r\n<0.29381,-0.40229,0.39898>,\r\n<0.29921,-0.39476,0.40774>,\r\n<0.30533,-0.38804,0.41660>,\r\n<0.31263,-0.38261,0.42568>,\r\n<0.32055,-0.37858,0.43487>,\r\n<0.32886,-0.37583,0.44413>,\r\n<0.33724,-0.37330,0.45359>,\r\n<0.34525,-0.36984,0.46309>,\r\n<0.35265,-0.36512,0.47268>,\r\n<0.35899,-0.35907,0.48238>,\r\n<0.36404,-0.35198,0.49207>,\r\n<0.36793,-0.34422,0.50179>,\r\n<0.37106,-0.33614,0.51160>,\r\n<0.37430,-0.32809,0.52140>,\r\n<0.37858,-0.32042,0.53116>,\r\n<0.38399,-0.31364,0.54071>,\r\n<0.39039,-0.30776,0.55006>,\r\n<0.39745,-0.30244,0.55943>,\r\n<0.40458,-0.29730,0.56860>,\r\n<0.41135,-0.29140,0.57774>,\r\n<0.41716,-0.28422,0.58682>,\r\n<0.42176,-0.27601,0.59551>,\r\n<0.42548,-0.26723,0.60387>,\r\n<0.42907,-0.25808,0.61205>,\r\n<0.43353,-0.24916,0.62032>,\r\n<0.43853,-0.24031,0.62796>,\r\n<0.44344,-0.23121,0.63476>,\r\n<0.44833,-0.22166,0.64177>,\r\n<0.44750,-0.21197,0.65000>,\r\n<0.45641,-0.20026,0.65630>,\r\n<0.45428,-0.18639,0.66031>,\r\n<0.45353,-0.17307,0.66013>,\r\n<0.45306,-0.15996,ZP>,\r\n<0.45274,-0.14707,ZP>,\r\n<0.45244,-0.13425,ZP>,\r\n<0.45210,-0.12150,ZP>,\r\n<0.45168,-0.10864,ZP>,\r\n<0.45123,-0.09574,ZP>,\r\n<0.45089,-0.08284,ZP>,\r\n<0.45070,-0.07000,ZP>,\r\n<0.45059,-0.05722,ZP>,\r\n<0.45053,-0.04447,ZP>,\r\n<0.45046,-0.03166,ZP>,\r\n<0.45043,-0.01887,ZP>,\r\n<0.45042,-0.00609,ZP>,\r\n<0.45039,0.00663,ZP>,\r\n<0.45039,0.01937,ZP>,\r\n<0.45038,0.03208,ZP>,\r\n<0.45040,0.04479,ZP>,\r\n<0.45039,0.05746,ZP>,\r\n<0.45048,0.07020,ZP>,\r\n<0.45066,0.08304,ZP>,\r\n<0.45106,0.09595,ZP>,\r\n<0.45161,0.10883,ZP>,\r\n<0.45215,0.12161,ZP>,\r\n<0.45258,0.13432,ZP>,\r\n<0.45292,0.14710,ZP>,\r\n<0.45325,0.16001,ZP>,\r\n<0.45370,0.17312,0.66012>,\r\n<0.45440,0.18665,0.66029>,\r\n<0.45634,0.20053,0.65623>,\r\n<0.45453,0.20430,0.64321>,\r\n<0.44826,0.22176,0.64171>,\r\n<0.44333,0.23144,0.63428>,\r\n<0.43846,0.24045,0.62776>,\r\n<0.43348,0.24925,0.62017>,\r\n<0.42924,0.25836,0.61198>,\r\n<0.42582,0.26757,0.60376>,\r\n<0.42195,0.27633,0.59548>,\r\n<0.41705,0.28425,0.58689>,\r\n<0.41097,0.29102,0.57797>,\r\n<0.40410,0.29658,0.56871>,\r\n<0.39691,0.30174,0.55941>,\r\n<0.38992,0.30730,0.55014>,\r\n<0.38362,0.31363,0.54075>,\r\n<0.37855,0.32076,0.53120>,\r\n<0.37480,0.32859,0.52157>,\r\n<0.37198,0.33677,0.51187>,\r\n<0.36890,0.34493,0.50223>,\r\n<0.36486,0.35265,0.49258>,\r\n<0.35944,0.35961,0.48281>,\r\n<0.35264,0.36537,0.47312>,\r\n<0.34502,0.36961,0.46356>,\r\n<0.33684,0.37256,0.45397>,\r\n<0.32836,0.37476,0.44455>,\r\n<0.31990,0.37772,0.43526>,\r\n<0.31206,0.38205,0.42611>,\r\n<0.30506,0.38780,0.41710>,\r\n<0.29913,0.39488,0.40833>,\r\n<0.29418,0.40272,0.39963>\r\n<0.29898,-0.39537,0.38967>,\r\n<0.30547,-0.38885,0.39839>,\r\n<0.31260,-0.38317,0.40723>,\r\n<0.32052,-0.37888,0.41625>,\r\n<0.32888,-0.37592,0.42543>,\r\n<0.33726,-0.37338,0.43462>,\r\n<0.34537,-0.36992,0.44401>,\r\n<0.35283,-0.36528,0.45348>,\r\n<0.35930,-0.35930,0.46302>,\r\n<0.36447,-0.35216,0.47267>,\r\n<0.36836,-0.34431,0.48235>,\r\n<0.37123,-0.33617,0.49198>,\r\n<0.37402,-0.32802,0.50168>,\r\n<0.37782,-0.32028,0.51141>,\r\n<0.38310,-0.31314,0.52107>,\r\n<0.38960,-0.30711,0.53046>,\r\n<0.39685,-0.30212,0.53968>,\r\n<0.40440,-0.29774,0.54897>,\r\n<0.41174,-0.29292,0.55813>,\r\n<0.41821,-0.28656,0.56726>,\r\n<0.42327,-0.27871,0.57614>,\r\n<0.42670,-0.26983,0.58451>,\r\n<0.42923,-0.26044,0.59260>,\r\n<0.43216,-0.25150,0.60089>,\r\n<0.43698,-0.24310,0.60863>,\r\n<0.44175,-0.23432,0.61618>,\r\n<0.44656,-0.22509,0.62289>,\r\n<0.45120,-0.21564,0.62988>,\r\n<0.45564,-0.20609,0.63637>,\r\n<0.46004,-0.19601,0.64240>,\r\n<0.46457,-0.18536,0.64815>,\r\n<0.46812,-0.17371,0.65462>,\r\n<0.46720,-0.16051,0.65957>,\r\n<0.46580,-0.14714,0.66017>,\r\n<0.46508,-0.13425,ZP>,\r\n<0.46476,-0.12119,ZP>,\r\n<0.46455,-0.10828,ZP>,\r\n<0.46431,-0.09546,0.66008>,\r\n<0.46414,-0.08271,0.66008>,\r\n<0.46408,-0.07003,ZP>,\r\n<0.46386,-0.05728,ZP>,\r\n<0.46367,-0.04452,ZP>,\r\n<0.46351,-0.03167,ZP>,\r\n<0.46344,-0.01885,ZP>,\r\n<0.46344,-0.00604,ZP>,\r\n<0.46346,0.00670,ZP>,\r\n<0.46352,0.01945,ZP>,\r\n<0.46349,0.03210,ZP>,\r\n<0.46363,0.04484,ZP>,\r\n<0.46353,0.05733,ZP>,\r\n<0.46363,0.07010,ZP>,\r\n<0.46308,0.08289,ZP>,\r\n<0.46380,0.09550,ZP>,\r\n<0.46449,0.10834,ZP>,\r\n<0.46507,0.12101,ZP>,\r\n<0.46551,0.13384,0.66010>,\r\n<0.46601,0.14708,0.66020>,\r\n<0.46746,0.16053,0.65948>,\r\n<0.46821,0.17371,0.65443>,\r\n<0.46449,0.18556,0.64815>,\r\n<0.45996,0.19621,0.64242>,\r\n<0.45549,0.20637,0.63665>,\r\n<0.45114,0.21572,0.63000>,\r\n<0.44647,0.22523,0.62308>,\r\n<0.44174,0.23436,0.61600>,\r\n<0.43696,0.24312,0.60848>,\r\n<0.43212,0.25155,0.60080>,\r\n<0.42967,0.26095,0.59248>,\r\n<0.42710,0.27016,0.58448>,\r\n<0.42323,0.27899,0.57612>,\r\n<0.41794,0.28638,0.56727>,\r\n<0.41122,0.29232,0.55824>,\r\n<0.40362,0.29693,0.54899>,\r\n<0.39596,0.30150,0.53978>,\r\n<0.38878,0.30685,0.53058>,\r\n<0.38264,0.31319,0.52113>,\r\n<0.37788,0.32062,0.51163>,\r\n<0.37460,0.32866,0.50203>,\r\n<0.37217,0.33702,0.49238>,\r\n<0.36926,0.34522,0.48272>,\r\n<0.36515,0.35300,0.47304>,\r\n<0.35962,0.35992,0.46348>,\r\n<0.35284,0.36550,0.45398>,\r\n<0.34508,0.36973,0.44443>,\r\n<0.33681,0.37270,0.43505>,\r\n<0.32825,0.37493,0.42583>,\r\n<0.31988,0.37801,0.41661>,\r\n<0.31204,0.38251,0.40764>,\r\n<0.30500,0.38852,0.39887>,\r\n<0.29885,0.39550,0.39028>\r\n<0.30527,-0.38952,0.38031>,\r\n<0.31264,-0.38405,0.38904>,\r\n<0.32037,-0.37938,0.39784>,\r\n<0.32870,-0.37614,0.40684>,\r\n<0.33716,-0.37337,0.41598>,\r\n<0.34524,-0.36989,0.42513>,\r\n<0.35284,-0.36524,0.43452>,\r\n<0.35937,-0.35935,0.44398>,\r\n<0.36460,-0.35232,0.45350>,\r\n<0.36853,-0.34448,0.46310>,\r\n<0.37134,-0.33617,0.47276>,\r\n<0.37389,-0.32788,0.48233>,\r\n<0.37744,-0.32000,0.49189>,\r\n<0.38239,-0.31285,0.50146>,\r\n<0.38882,-0.30670,0.51103>,\r\n<0.39622,-0.30180,0.52038>,\r\n<0.40418,-0.29784,0.52960>,\r\n<0.41205,-0.29387,0.53885>,\r\n<0.41896,-0.28842,0.54787>,\r\n<0.42453,-0.28110,0.55681>,\r\n<0.42818,-0.27228,0.56542>,\r\n<0.43011,-0.26286,0.57356>,\r\n<0.43110,-0.25328,0.58168>,\r\n<0.43272,-0.24394,0.58961>,\r\n<0.43715,-0.23510,0.59710>,\r\n<0.44488,-0.22827,0.60427>,\r\n<0.44979,-0.21899,0.61124>,\r\n<0.45588,-0.21111,0.61815>,\r\n<0.45938,-0.20133,0.62475>,\r\n<0.46227,-0.19064,0.63039>,\r\n<0.46636,-0.18037,0.63581>,\r\n<0.47037,-0.16965,0.64098>,\r\n<0.47429,-0.15853,0.64590>,\r\n<0.47813,-0.14697,0.65070>,\r\n<0.47988,-0.13468,0.65603>,\r\n<0.47907,-0.12148,0.65946>,\r\n<0.47771,-0.10835,0.66030>,\r\n<0.47715,-0.09544,0.66018>,\r\n<0.47688,-0.08256,0.66012>,\r\n<0.47674,-0.06988,ZP>,\r\n<0.47649,-0.05710,ZP>,\r\n<0.47632,-0.04434,ZP>,\r\n<0.47626,-0.03153,ZP>,\r\n<0.47629,-0.01876,ZP>,\r\n<0.47636,-0.00601,ZP>,\r\n<0.47642,0.00673,ZP>,\r\n<0.47650,0.01945,ZP>,\r\n<0.47632,0.03199,0.66009>,\r\n<0.47662,0.04468,ZP>,\r\n<0.47655,0.05719,ZP>,\r\n<0.47667,0.06999,0.66009>,\r\n<0.47635,0.08211,0.66010>,\r\n<0.47709,0.09508,0.66012>,\r\n<0.47791,0.10785,0.66028>,\r\n<0.47946,0.12099,0.65938>,\r\n<0.48027,0.13408,0.65580>,\r\n<0.47819,0.14680,0.65049>,\r\n<0.47432,0.15845,0.64572>,\r\n<0.47036,0.16967,0.64085>,\r\n<0.46614,0.18091,0.63592>,\r\n<0.46218,0.19114,0.63037>,\r\n<0.45894,0.20123,0.62443>,\r\n<0.45480,0.21095,0.61809>,\r\n<0.44954,0.21891,0.61100>,\r\n<0.44487,0.22831,0.60427>,\r\n<0.43679,0.23484,0.59706>,\r\n<0.43317,0.24403,0.58951>,\r\n<0.43191,0.25381,0.58153>,\r\n<0.43073,0.26349,0.57352>,\r\n<0.42847,0.27273,0.56539>,\r\n<0.42449,0.28115,0.55673>,\r\n<0.41854,0.28813,0.54796>,\r\n<0.41113,0.29325,0.53881>,\r\n<0.40302,0.29696,0.52953>,\r\n<0.39520,0.30105,0.52047>,\r\n<0.38795,0.30630,0.51116>,\r\n<0.38188,0.31288,0.50174>,\r\n<0.37747,0.32047,0.49226>,\r\n<0.37450,0.32873,0.48261>,\r\n<0.37231,0.33722,0.47301>,\r\n<0.36944,0.34547,0.46346>,\r\n<0.36531,0.35319,0.45390>,\r\n<0.35976,0.36000,0.44443>,\r\n<0.35284,0.36557,0.43491>,\r\n<0.34497,0.36978,0.42561>,\r\n<0.33667,0.37277,0.41647>,\r\n<0.32806,0.37519,0.40725>,\r\n<0.31974,0.37850,0.39831>,\r\n<0.31196,0.38343,0.38950>,\r\n<0.30488,0.38933,0.38088>\r\n<0.31239,-0.38462,0.37092>,\r\n<0.32029,-0.38006,0.37967>,\r\n<0.32847,-0.37633,0.38847>,\r\n<0.33687,-0.37332,0.39739>,\r\n<0.34508,-0.36966,0.40650>,\r\n<0.35259,-0.36506,0.41567>,\r\n<0.35928,-0.35919,0.42508>,\r\n<0.36461,-0.35223,0.43453>,\r\n<0.36861,-0.34446,0.44400>,\r\n<0.37140,-0.33617,0.45353>,\r\n<0.37382,-0.32776,0.46312>,\r\n<0.37725,-0.31970,0.47269>,\r\n<0.38209,-0.31241,0.48224>,\r\n<0.38835,-0.30631,0.49176>,\r\n<0.39574,-0.30148,0.50115>,\r\n<0.40372,-0.29791,0.51041>,\r\n<0.41201,-0.29463,0.51966>,\r\n<0.41954,-0.28975,0.52888>,\r\n<0.42556,-0.28305,0.53779>,\r\n<0.42954,-0.27449,0.54646>,\r\n<0.43133,-0.26495,0.55469>,\r\n<0.43138,-0.25527,0.56257>,\r\n<0.43095,-0.24556,0.57062>,\r\n<0.43358,-0.23638,0.57851>,\r\n<0.43969,-0.22814,0.58588>,\r\n<0.44750,-0.22127,0.59273>,\r\n<0.45518,-0.21500,0.59961>,\r\n<0.46162,-0.20722,0.60625>,\r\n<0.46516,-0.19699,0.61249>,\r\n<0.46622,-0.18629,0.61824>,\r\n<0.46827,-0.17531,0.62375>,\r\n<0.47205,-0.16490,0.62885>,\r\n<0.47564,-0.15421,0.63350>,\r\n<0.47909,-0.14311,0.63776>,\r\n<0.48201,-0.13309,0.64135>,\r\n<0.48533,-0.12040,0.64558>,\r\n<0.48585,-0.11398,0.64567>,\r\n<0.49073,-0.09584,0.65246>,\r\n<0.49159,-0.08312,0.65582>,\r\n<0.49132,-0.07011,0.65819>,\r\n<0.49064,-0.05723,0.65951>,\r\n<0.48998,-0.04441,ZP>,\r\n<0.48960,-0.03158,0.66020>,\r\n<0.48949,-0.01879,0.66020>,\r\n<0.48955,-0.00602,0.66020>,\r\n<0.48967,0.00681,0.66023>,\r\n<0.48989,0.01960,0.66029>,\r\n<0.48893,0.03238,0.65290>,\r\n<0.49092,0.04482,ZP>,\r\n<0.48776,0.05810,0.65438>,\r\n<0.49229,0.07033,0.65760>,\r\n<0.48941,0.08129,0.65042>,\r\n<0.49108,0.09506,0.65146>,\r\n<0.48511,0.09889,0.65000>,\r\n<0.48566,0.11932,0.64543>,\r\n<0.48253,0.13120,0.64170>,\r\n<0.47914,0.14298,0.63764>,\r\n<0.47565,0.15419,0.63339>,\r\n<0.47201,0.16499,0.62877>,\r\n<0.46819,0.17553,0.62366>,\r\n<0.46706,0.18632,0.61841>,\r\n<0.46514,0.19752,0.61275>,\r\n<0.46110,0.20730,0.60639>,\r\n<0.45403,0.21395,0.59963>,\r\n<0.44618,0.22054,0.59291>,\r\n<0.43900,0.22818,0.58599>,\r\n<0.43384,0.23677,0.57869>,\r\n<0.43200,0.24636,0.57057>,\r\n<0.43256,0.25603,0.56259>,\r\n<0.43219,0.26541,0.55471>,\r\n<0.43002,0.27474,0.54646>,\r\n<0.42540,0.28315,0.53778>,\r\n<0.41877,0.28952,0.52879>,\r\n<0.41095,0.29370,0.51949>,\r\n<0.40263,0.29663,0.51046>,\r\n<0.39455,0.30060,0.50131>,\r\n<0.38725,0.30594,0.49192>,\r\n<0.38141,0.31268,0.48257>,\r\n<0.37719,0.32051,0.47296>,\r\n<0.37447,0.32883,0.46341>,\r\n<0.37246,0.33727,0.45396>,\r\n<0.36961,0.34546,0.44440>,\r\n<0.36541,0.35314,0.43499>,\r\n<0.35973,0.35990,0.42550>,\r\n<0.35271,0.36542,0.41616>,\r\n<0.34486,0.36959,0.40702>,\r\n<0.33642,0.37278,0.39783>,\r\n<0.32783,0.37542,0.38891>,\r\n<0.31965,0.37936,0.38016>,\r\n<0.31191,0.38422,0.37147>\r\n<0.31990,-0.38040,0.36160>,\r\n<0.32813,-0.37653,0.37034>,\r\n<0.33646,-0.37313,0.37910>,\r\n<0.34456,-0.36938,0.38796>,\r\n<0.35228,-0.36467,0.39709>,\r\n<0.35898,-0.35891,0.40631>,\r\n<0.36450,-0.35196,0.41568>,\r\n<0.36861,-0.34431,0.42512>,\r\n<0.37146,-0.33614,0.43462>,\r\n<0.37384,-0.32776,0.44415>,\r\n<0.37714,-0.31968,0.45365>,\r\n<0.38186,-0.31216,0.46318>,\r\n<0.38812,-0.30586,0.47274>,\r\n<0.39547,-0.30108,0.48216>,\r\n<0.40346,-0.29769,0.49146>,\r\n<0.41184,-0.29504,0.50064>,\r\n<0.41975,-0.29084,0.50978>,\r\n<0.42642,-0.28447,0.51878>,\r\n<0.43085,-0.27627,0.52747>,\r\n<0.43270,-0.26677,0.53593>,\r\n<0.43242,-0.25717,0.54396>,\r\n<0.43029,-0.24769,0.55172>,\r\n<0.43081,-0.23776,0.55977>,\r\n<0.43559,-0.22874,0.56734>,\r\n<0.44336,-0.22178,0.57460>,\r\n<0.45263,-0.21690,0.58148>,\r\n<0.46120,-0.21169,0.58837>,\r\n<0.46663,-0.20283,0.59496>,\r\n<0.46853,-0.19193,0.60098>,\r\n<0.46705,-0.18111,0.60607>,\r\n<0.47004,-0.17057,0.61126>,\r\n<0.47364,-0.16026,0.61621>,\r\n<0.47708,-0.14989,0.62023>,\r\n<0.48188,-0.13977,0.62470>,\r\n<0.48391,-0.12796,0.62904>,\r\n<0.48614,-0.11698,0.63231>,\r\n<0.48882,-0.10522,0.63621>,\r\n<0.49125,-0.09330,0.63894>,\r\n<0.49336,-0.08135,0.64147>,\r\n<0.49528,-0.06869,0.64367>,\r\n<0.49689,-0.05626,0.64521>,\r\n<0.49812,-0.04402,0.64728>,\r\n<0.49911,-0.03146,0.64835>,\r\n<0.49977,-0.01883,0.64900>,\r\n<0.50010,-0.00610,0.64924>,\r\n<0.50009,0.00654,0.64896>,\r\n<0.49975,0.01919,0.64815>,\r\n<0.49912,0.03153,0.64644>,\r\n<0.49812,0.04428,0.64553>,\r\n<0.49687,0.05636,0.64399>,\r\n<0.49532,0.06859,0.64206>,\r\n<0.49357,0.08018,0.63940>,\r\n<0.49133,0.09287,0.63771>,\r\n<0.48893,0.10482,0.63560>,\r\n<0.48633,0.11625,0.63272>,\r\n<0.48367,0.12698,0.62973>,\r\n<0.48102,0.13845,0.62483>,\r\n<0.47707,0.14972,0.62089>,\r\n<0.47356,0.16049,0.61618>,\r\n<0.46990,0.17091,0.61121>,\r\n<0.46882,0.18158,0.60563>,\r\n<0.46909,0.19225,0.60038>,\r\n<0.46642,0.20284,0.59446>,\r\n<0.45982,0.21045,0.58796>,\r\n<0.45079,0.21536,0.58134>,\r\n<0.44203,0.22145,0.57461>,\r\n<0.43516,0.22953,0.56763>,\r\n<0.43171,0.23885,0.55982>,\r\n<0.43212,0.24844,0.55180>,\r\n<0.43389,0.25758,0.54393>,\r\n<0.43375,0.26735,0.53607>,\r\n<0.43120,0.27697,0.52776>,\r\n<0.42594,0.28471,0.51902>,\r\n<0.41888,0.29036,0.50980>,\r\n<0.41068,0.29378,0.50062>,\r\n<0.40205,0.29634,0.49156>,\r\n<0.39397,0.30024,0.48228>,\r\n<0.38681,0.30568,0.47310>,\r\n<0.38111,0.31262,0.46367>,\r\n<0.37716,0.32042,0.45407>,\r\n<0.37463,0.32867,0.44459>,\r\n<0.37263,0.33712,0.43498>,\r\n<0.36968,0.34532,0.42559>,\r\n<0.36531,0.35292,0.41617>,\r\n<0.35949,0.35958,0.40677>,\r\n<0.35240,0.36500,0.39762>,\r\n<0.34440,0.36927,0.38848>,\r\n<0.33603,0.37266,0.37957>,\r\n<0.32757,0.37594,0.37085>,\r\n<0.31946,0.37990,0.36212>\r\n<0.32772,-0.37655,0.35223>,\r\n<0.33591,-0.37284,0.36093>,\r\n<0.34401,-0.36886,0.36975>,\r\n<0.35160,-0.36416,0.37862>,\r\n<0.35851,-0.35840,0.38781>,\r\n<0.36414,-0.35169,0.39710>,\r\n<0.36853,-0.34403,0.40644>,\r\n<0.37158,-0.33591,0.41586>,\r\n<0.37402,-0.32761,0.42536>,\r\n<0.37733,-0.31956,0.43492>,\r\n<0.38185,-0.31209,0.44438>,\r\n<0.38797,-0.30563,0.45383>,\r\n<0.39534,-0.30069,0.46331>,\r\n<0.40338,-0.29730,0.47262>,\r\n<0.41181,-0.29511,0.48187>,\r\n<0.41983,-0.29155,0.49104>,\r\n<0.42682,-0.28580,0.50005>,\r\n<0.43195,-0.27786,0.50887>,\r\n<0.43414,-0.26851,0.51723>,\r\n<0.43381,-0.25877,0.52539>,\r\n<0.43099,-0.24951,0.53328>,\r\n<0.42958,-0.24011,0.54123>,\r\n<0.43217,-0.23025,0.54923>,\r\n<0.43913,-0.22217,0.55657>,\r\n<0.44817,-0.21690,0.56335>,\r\n<0.45860,-0.21411,0.56993>,\r\n<0.46680,-0.20760,0.57665>,\r\n<0.47091,-0.19747,0.58283>,\r\n<0.47085,-0.18609,0.58850>,\r\n<0.46690,-0.17534,0.59361>,\r\n<0.46730,-0.16442,0.59906>,\r\n<0.47516,-0.15574,0.60376>,\r\n<0.47961,-0.14574,0.60749>,\r\n<0.48608,-0.13666,0.61174>,\r\n<0.48818,-0.12540,0.61639>,\r\n<0.48698,-0.11399,0.61980>,\r\n<0.48950,-0.10200,0.62342>,\r\n<0.49180,-0.09029,0.62635>,\r\n<0.49477,-0.07797,0.62853>,\r\n<0.49752,-0.06734,0.63128>,\r\n<0.49693,-0.05538,0.63286>,\r\n<0.49818,-0.04291,0.63426>,\r\n<0.49909,-0.03069,0.63529>,\r\n<0.49968,-0.01843,0.63582>,\r\n<0.49997,-0.00607,0.63598>,\r\n<0.50045,0.00542,0.63564>,\r\n<0.49969,0.01808,0.63454>,\r\n<0.49914,0.02981,0.63315>,\r\n<0.49818,0.04304,0.63210>,\r\n<0.49812,0.05476,0.63045>,\r\n<0.49577,0.06692,0.62930>,\r\n<0.49446,0.07591,0.62522>,\r\n<0.49182,0.09017,0.62450>,\r\n<0.48947,0.10247,0.62194>,\r\n<0.48955,0.11375,0.62028>,\r\n<0.48940,0.12509,0.61721>,\r\n<0.48472,0.13529,0.61254>,\r\n<0.47843,0.14530,0.60825>,\r\n<0.47506,0.15605,0.60364>,\r\n<0.46842,0.16570,0.59910>,\r\n<0.46977,0.17690,0.59391>,\r\n<0.47276,0.18680,0.58880>,\r\n<0.47170,0.19848,0.58298>,\r\n<0.46564,0.20726,0.57644>,\r\n<0.45653,0.21227,0.56969>,\r\n<0.44633,0.21591,0.56312>,\r\n<0.43785,0.22238,0.55640>,\r\n<0.43247,0.23108,0.54902>,\r\n<0.43092,0.24063,0.54113>,\r\n<0.43327,0.24983,0.53328>,\r\n<0.43545,0.25953,0.52563>,\r\n<0.43518,0.26961,0.51767>,\r\n<0.43216,0.27864,0.50915>,\r\n<0.42633,0.28585,0.50015>,\r\n<0.41884,0.29087,0.49103>,\r\n<0.41029,0.29362,0.48197>,\r\n<0.40164,0.29595,0.47278>,\r\n<0.39361,0.29992,0.46357>,\r\n<0.38657,0.30549,0.45427>,\r\n<0.38120,0.31239,0.44476>,\r\n<0.37737,0.32015,0.43532>,\r\n<0.37480,0.32847,0.42576>,\r\n<0.37270,0.33693,0.41637>,\r\n<0.36955,0.34502,0.40700>,\r\n<0.36496,0.35249,0.39757>,\r\n<0.35894,0.35904,0.38840>,\r\n<0.35170,0.36443,0.37926>,\r\n<0.34381,0.36883,0.37027>,\r\n<0.33554,0.37251,0.36154>,\r\n<0.32733,0.37605,0.35274>\r\n<0.33545,-0.37253,0.34290>,\r\n<0.34337,-0.36826,0.35163>,\r\n<0.35102,-0.36340,0.36046>,\r\n<0.35784,-0.35770,0.36940>,\r\n<0.36371,-0.35105,0.37863>,\r\n<0.36828,-0.34373,0.38801>,\r\n<0.37162,-0.33571,0.39743>,\r\n<0.37431,-0.32748,0.40688>,\r\n<0.37766,-0.31950,0.41630>,\r\n<0.38218,-0.31201,0.42580>,\r\n<0.38802,-0.30553,0.43518>,\r\n<0.39524,-0.30042,0.44461>,\r\n<0.40327,-0.29685,0.45401>,\r\n<0.41181,-0.29486,0.46319>,\r\n<0.42009,-0.29186,0.47243>,\r\n<0.42734,-0.28667,0.48150>,\r\n<0.43280,-0.27936,0.49037>,\r\n<0.43558,-0.27018,0.49895>,\r\n<0.43547,-0.26041,0.50706>,\r\n<0.43270,-0.25100,0.51497>,\r\n<0.42946,-0.24178,0.52286>,\r\n<0.43019,-0.23204,0.53079>,\r\n<0.43511,-0.22296,0.53851>,\r\n<0.44377,-0.21671,0.54561>,\r\n<0.45414,-0.21419,0.55222>,\r\n<0.46445,-0.21103,0.55887>,\r\n<0.47163,-0.20301,0.56548>,\r\n<0.47353,-0.19190,0.57148>,\r\n<0.47117,-0.18094,0.57674>,\r\n<0.46626,-0.17041,0.58189>,\r\n<0.46753,-0.15918,0.58723>,\r\n<0.47422,-0.14968,0.59198>,\r\n<0.48307,-0.14289,0.59568>,\r\n<0.49091,-0.13435,0.60018>,\r\n<0.49166,-0.12219,0.60378>,\r\n<0.48773,-0.11054,0.60702>,\r\n<0.49014,-0.09898,0.61052>,\r\n<0.49231,-0.08742,0.61323>,\r\n<0.49815,-0.07703,0.61601>,\r\n<0.50231,-0.06599,0.61862>,\r\n<0.50197,-0.05378,0.62003>,\r\n<0.49873,-0.04189,0.62098>,\r\n<0.49913,-0.02982,0.62203>,\r\n<0.49983,-0.01791,0.62246>,\r\n<0.50445,-0.00630,0.62274>,\r\n<0.50624,0.00588,0.62287>,\r\n<0.50238,0.01725,0.62168>,\r\n<0.49916,0.02921,0.62042>,\r\n<0.49833,0.04138,0.61906>,\r\n<0.50124,0.05364,0.61794>,\r\n<0.49984,0.06582,0.61612>,\r\n<0.49425,0.07579,0.61373>,\r\n<0.49225,0.08786,0.61191>,\r\n<0.49035,0.09967,0.60922>,\r\n<0.49245,0.11078,0.60696>,\r\n<0.49254,0.12358,0.60438>,\r\n<0.48750,0.13277,0.60049>,\r\n<0.47933,0.14104,0.59599>,\r\n<0.47203,0.15027,0.59187>,\r\n<0.46786,0.16064,0.58720>,\r\n<0.46940,0.17164,0.58173>,\r\n<0.47439,0.18160,0.57686>,\r\n<0.47560,0.19304,0.57143>,\r\n<0.47116,0.20335,0.56509>,\r\n<0.46249,0.20984,0.55882>,\r\n<0.45176,0.21178,0.55201>,\r\n<0.44210,0.21613,0.54535>,\r\n<0.43452,0.22341,0.53844>,\r\n<0.43087,0.23268,0.53073>,\r\n<0.43092,0.24252,0.52291>,\r\n<0.43514,0.25195,0.51523>,\r\n<0.43723,0.26158,0.50752>,\r\n<0.43662,0.27116,0.49924>,\r\n<0.43286,0.27985,0.49052>,\r\n<0.42649,0.28656,0.48158>,\r\n<0.41855,0.29091,0.47251>,\r\n<0.40992,0.29315,0.46332>,\r\n<0.40143,0.29543,0.45414>,\r\n<0.39357,0.29951,0.44490>,\r\n<0.38680,0.30511,0.43550>,\r\n<0.38154,0.31208,0.42608>,\r\n<0.37771,0.31999,0.41662>,\r\n<0.37508,0.32830,0.40725>,\r\n<0.37272,0.33665,0.39796>,\r\n<0.36919,0.34458,0.38855>,\r\n<0.36431,0.35188,0.37929>,\r\n<0.35814,0.35833,0.37012>,\r\n<0.35102,0.36373,0.36104>,\r\n<0.34322,0.36826,0.35226>,\r\n<0.33516,0.37221,0.34345>\r\n<0.34283,-0.36781,0.33355>,\r\n<0.35022,-0.36270,0.34240>,\r\n<0.35718,-0.35694,0.35135>,\r\n<0.36312,-0.35040,0.36042>,\r\n<0.36800,-0.34312,0.36968>,\r\n<0.37165,-0.33537,0.37903>,\r\n<0.37468,-0.32726,0.38847>,\r\n<0.37822,-0.31937,0.39793>,\r\n<0.38270,-0.31193,0.40736>,\r\n<0.38846,-0.30533,0.41686>,\r\n<0.39542,-0.30015,0.42617>,\r\n<0.40327,-0.29642,0.43553>,\r\n<0.41176,-0.29437,0.44478>,\r\n<0.42012,-0.29180,0.45395>,\r\n<0.42775,-0.28711,0.46320>,\r\n<0.43371,-0.28023,0.47217>,\r\n<0.43705,-0.27151,0.48080>,\r\n<0.43731,-0.26178,0.48902>,\r\n<0.43497,-0.25241,0.49690>,\r\n<0.43015,-0.24359,0.50462>,\r\n<0.42921,-0.23379,0.51273>,\r\n<0.43218,-0.22417,0.52053>,\r\n<0.43954,-0.21677,0.52774>,\r\n<0.44932,-0.21247,0.53443>,\r\n<0.46050,-0.21212,0.54079>,\r\n<0.46987,-0.20687,0.54761>,\r\n<0.47553,-0.19740,0.55399>,\r\n<0.47514,-0.18608,0.55952>,\r\n<0.46947,-0.17596,0.56432>,\r\n<0.46591,-0.16496,0.56963>,\r\n<0.46820,-0.15375,0.57462>,\r\n<0.47610,-0.14533,0.57920>,\r\n<0.48690,-0.14024,0.58341>,\r\n<0.49392,-0.13051,0.58810>,\r\n<0.49371,-0.11805,0.59147>,\r\n<0.48723,-0.10722,0.59416>,\r\n<0.48634,-0.09528,0.59783>,\r\n<0.49284,-0.08444,0.60055>,\r\n<0.50039,-0.07585,0.60325>,\r\n<0.50535,-0.06464,0.60606>,\r\n<0.50409,-0.05209,0.60722>,\r\n<0.49834,-0.04122,0.60782>,\r\n<0.49920,-0.02912,0.60899>,\r\n<0.49973,-0.01690,0.60907>,\r\n<0.50676,-0.00684,0.60991>,\r\n<0.50897,0.00500,0.61004>,\r\n<0.50500,0.01656,0.60897>,\r\n<0.49924,0.02780,0.60726>,\r\n<0.49839,0.04015,0.60583>,\r\n<0.50245,0.05173,0.60534>,\r\n<0.50119,0.06359,0.60298>,\r\n<0.49453,0.07392,0.60084>,\r\n<0.48894,0.08464,0.59995>,\r\n<0.49084,0.09709,0.59565>,\r\n<0.49523,0.10844,0.59442>,\r\n<0.49683,0.11996,0.59197>,\r\n<0.49168,0.13070,0.58854>,\r\n<0.48128,0.13730,0.58392>,\r\n<0.47290,0.14490,0.57996>,\r\n<0.46721,0.15525,0.57498>,\r\n<0.46890,0.16661,0.56964>,\r\n<0.47496,0.17654,0.56487>,\r\n<0.47833,0.18758,0.55964>,\r\n<0.47599,0.19862,0.55409>,\r\n<0.46824,0.20659,0.54777>,\r\n<0.45810,0.20983,0.54092>,\r\n<0.44735,0.21104,0.53463>,\r\n<0.43810,0.21638,0.52790>,\r\n<0.43190,0.22484,0.52062>,\r\n<0.43004,0.23493,0.51290>,\r\n<0.43263,0.24462,0.50493>,\r\n<0.43727,0.25351,0.49739>,\r\n<0.43893,0.26308,0.48942>,\r\n<0.43771,0.27263,0.48105>,\r\n<0.43327,0.28087,0.47233>,\r\n<0.42651,0.28702,0.46323>,\r\n<0.41852,0.29100,0.45403>,\r\n<0.40980,0.29246,0.44492>,\r\n<0.40139,0.29494,0.43572>,\r\n<0.39371,0.29914,0.42647>,\r\n<0.38717,0.30492,0.41710>,\r\n<0.38207,0.31210,0.40770>,\r\n<0.37827,0.31994,0.39833>,\r\n<0.37532,0.32809,0.38908>,\r\n<0.37259,0.33628,0.37972>,\r\n<0.36870,0.34406,0.37037>,\r\n<0.36358,0.35124,0.36116>,\r\n<0.35739,0.35754,0.35208>,\r\n<0.35027,0.36298,0.34317>,\r\n<0.34274,0.36773,0.33429>\r\n<0.34974,-0.36220,0.32452>,\r\n<0.35640,-0.35625,0.33336>,\r\n<0.36250,-0.34971,0.34241>,\r\n<0.36758,-0.34255,0.35168>,\r\n<0.37171,-0.33489,0.36097>,\r\n<0.37525,-0.32710,0.37039>,\r\n<0.37905,-0.31935,0.37978>,\r\n<0.38354,-0.31197,0.38920>,\r\n<0.38908,-0.30532,0.39865>,\r\n<0.39580,-0.29987,0.40808>,\r\n<0.40345,-0.29588,0.41737>,\r\n<0.41168,-0.29330,0.42661>,\r\n<0.42004,-0.29117,0.43576>,\r\n<0.42779,-0.28710,0.44494>,\r\n<0.43426,-0.28082,0.45405>,\r\n<0.43828,-0.27255,0.46284>,\r\n<0.43926,-0.26315,0.47123>,\r\n<0.43734,-0.25356,0.47922>,\r\n<0.43261,-0.24476,0.48679>,\r\n<0.42928,-0.23561,0.49466>,\r\n<0.43013,-0.22558,0.50268>,\r\n<0.43578,-0.21683,0.51031>,\r\n<0.44484,-0.21150,0.51726>,\r\n<0.45525,-0.20957,0.52360>,\r\n<0.46608,-0.20879,0.52988>,\r\n<0.47481,-0.20225,0.53668>,\r\n<0.47844,-0.19135,0.54298>,\r\n<0.47566,-0.18024,0.54813>,\r\n<0.46817,-0.17094,0.55270>,\r\n<0.46561,-0.15978,0.55797>,\r\n<0.46957,-0.14869,0.56286>,\r\n<0.47873,-0.14137,0.56701>,\r\n<0.49011,-0.13694,0.57108>,\r\n<0.49656,-0.12664,0.57597>,\r\n<0.49524,-0.11430,0.57944>,\r\n<0.48689,-0.10424,0.58192>,\r\n<0.48608,-0.09201,0.58521>,\r\n<0.49211,-0.08134,0.58791>,\r\n<0.50287,-0.07414,0.59047>,\r\n<0.50815,-0.06279,0.59336>,\r\n<0.50594,-0.05048,0.59445>,\r\n<0.49810,-0.04063,0.59492>,\r\n<0.49524,-0.02837,0.59603>,\r\n<0.49903,-0.01634,0.59637>,\r\n<0.50888,-0.00754,0.59716>,\r\n<0.51179,0.00508,0.59751>,\r\n<0.50753,0.01647,0.59590>,\r\n<0.49887,0.02630,0.59455>,\r\n<0.49748,0.03892,0.59302>,\r\n<0.50406,0.04992,0.59193>,\r\n<0.50228,0.06239,0.59024>,\r\n<0.49352,0.07155,0.58848>,\r\n<0.48864,0.08262,0.58639>,\r\n<0.48957,0.09452,0.58365>,\r\n<0.49609,0.10481,0.58122>,\r\n<0.49953,0.11690,0.57931>,\r\n<0.49465,0.12823,0.57562>,\r\n<0.48403,0.13443,0.57137>,\r\n<0.47354,0.14023,0.56765>,\r\n<0.46722,0.15017,0.56336>,\r\n<0.46744,0.16213,0.55778>,\r\n<0.47466,0.17149,0.55323>,\r\n<0.47982,0.18220,0.54844>,\r\n<0.47982,0.19364,0.54296>,\r\n<0.47399,0.20291,0.53666>,\r\n<0.46416,0.20758,0.53002>,\r\n<0.45301,0.20735,0.52394>,\r\n<0.44267,0.21041,0.51748>,\r\n<0.43439,0.21725,0.51056>,\r\n<0.43054,0.22698,0.50287>,\r\n<0.43125,0.23697,0.49495>,\r\n<0.43597,0.24572,0.48726>,\r\n<0.43962,0.25478,0.47956>,\r\n<0.44073,0.26452,0.47148>,\r\n<0.43870,0.27381,0.46306>,\r\n<0.43382,0.28167,0.45420>,\r\n<0.42659,0.28698,0.44501>,\r\n<0.41841,0.28999,0.43590>,\r\n<0.40973,0.29151,0.42673>,\r\n<0.40159,0.29447,0.41756>,\r\n<0.39420,0.29902,0.40833>,\r\n<0.38796,0.30508,0.39901>,\r\n<0.38299,0.31217,0.38970>,\r\n<0.37906,0.31988,0.38035>,\r\n<0.37576,0.32779,0.37102>,\r\n<0.37240,0.33577,0.36161>,\r\n<0.36818,0.34337,0.35230>,\r\n<0.36289,0.35035,0.34318>,\r\n<0.35665,0.35666,0.33424>,\r\n<0.34976,0.36241,0.32528>\r\n<0.35600,-0.35592,0.31548>\r\n<0.36196,-0.34921,0.32445>\r\n<0.36720,-0.34203,0.33358>\r\n<0.37161,-0.33444,0.34291>\r\n<0.37561,-0.32668,0.35227>\r\n<0.37977,-0.31907,0.36167>\r\n<0.38440,-0.31185,0.37111>\r\n<0.38985,-0.30520,0.38058>\r\n<0.39633,-0.29959,0.38995>\r\n<0.40390,-0.29530,0.39932>\r\n<0.41210,-0.29251,0.40857>\r\n<0.42051,-0.29051,0.41784>\r\n<0.42829,-0.28692,0.42706>\r\n<0.43504,-0.28142,0.43622>\r\n<0.43968,-0.27369,0.44515>\r\n<0.44133,-0.26436,0.45361>\r\n<0.43981,-0.25459,0.46157>\r\n<0.43567,-0.24553,0.46913>\r\n<0.43058,-0.23706,0.47671>\r\n<0.42919,-0.22750,0.48467>\r\n<0.43214,-0.21799,0.49252>\r\n<0.43985,-0.21076,0.49982>\r\n<0.45049,-0.20735,0.50647>\r\n<0.46170,-0.20758,0.51261>\r\n<0.47208,-0.20484,0.51939>\r\n<0.47950,-0.19675,0.52631>\r\n<0.48005,-0.18543,0.53209>\r\n<0.47525,-0.17501,0.53708>\r\n<0.46751,-0.16607,0.54179>\r\n<0.46545,-0.15460,0.54699>\r\n<0.47121,-0.14359,0.55192>\r\n<0.48207,-0.13845,0.55527>\r\n<0.49349,-0.13420,0.55992>\r\n<0.49934,-0.12277,0.56454>\r\n<0.49591,-0.11057,0.56718>\r\n<0.48719,-0.10113,0.56962>\r\n<0.48653,-0.08858,0.57308>\r\n<0.49327,-0.07829,0.57586>\r\n<0.50467,-0.07260,0.57816>\r\n<0.51004,-0.06109,0.58067>\r\n<0.50704,-0.04874,0.58164>\r\n<0.49775,-0.03970,0.58227>\r\n<0.49436,-0.02723,0.58354>\r\n<0.49935,-0.01533,0.58353>\r\n<0.51008,-0.00758,0.58417>\r\n<0.51336,0.00439,0.58441>\r\n<0.50926,0.01608,0.58331>\r\n<0.49943,0.02420,0.58167>\r\n<0.49722,0.03692,0.58053>\r\n<0.50502,0.04760,0.57915>\r\n<0.50315,0.06047,0.57734>\r\n<0.49393,0.06924,0.57525>\r\n<0.48751,0.07974,0.57358>\r\n<0.48889,0.09263,0.57070>\r\n<0.49826,0.10169,0.56902>\r\n<0.50012,0.11317,0.56692>\r\n<0.49642,0.12489,0.56350>\r\n<0.48700,0.13174,0.55948>\r\n<0.47616,0.13616,0.55582>\r\n<0.46813,0.14492,0.55187>\r\n<0.46721,0.15648,0.54686>\r\n<0.47350,0.16620,0.54151>\r\n<0.48060,0.17519,0.53713>\r\n<0.48377,0.18726,0.53232>\r\n<0.47924,0.19827,0.52594>\r\n<0.47010,0.20462,0.51919>\r\n<0.45929,0.20508,0.51281>\r\n<0.44835,0.20597,0.50683>\r\n<0.43868,0.21079,0.50018>\r\n<0.43207,0.21896,0.49302>\r\n<0.43071,0.22900,0.48522>\r\n<0.43335,0.23836,0.47743>\r\n<0.43884,0.24689,0.46986>\r\n<0.44240,0.25637,0.46205>\r\n<0.44284,0.26625,0.45385>\r\n<0.43985,0.27518,0.44520>\r\n<0.43409,0.28211,0.43619>\r\n<0.42669,0.28669,0.42699>\r\n<0.41847,0.28906,0.41775>\r\n<0.40996,0.29069,0.40860>\r\n<0.40192,0.29387,0.39944>\r\n<0.39473,0.29870,0.39022>\r\n<0.38868,0.30490,0.38097>\r\n<0.38374,0.31205,0.37162>\r\n<0.37960,0.31959,0.36228>\r\n<0.37592,0.32741,0.35286>\r\n<0.37219,0.33519,0.34357>\r\n<0.36771,0.34277,0.33436>\r\n<0.36242,0.34978,0.32532>\r\n<0.35628,0.35636,0.31633>\r\n}\r\nnormal_vectors {\r\nnx*ny,\r\n<-0.727,-0.685,0.031>,\r\n<-0.784,-0.621,-0.005>,\r\n<-0.847,-0.531,-0.014>,\r\n<-0.889,-0.457,-0.019>,\r\n<-0.897,-0.442,-0.024>,\r\n<-0.867,-0.498,-0.014>,\r\n<-0.810,-0.586,-0.009>,\r\n<-0.719,-0.695,-0.018>,\r\n<-0.590,-0.807,-0.035>,\r\n<-0.442,-0.896,-0.047>,\r\n<-0.319,-0.947,-0.038>,\r\n<-0.328,-0.944,0.018>,\r\n<-0.512,-0.858,0.046>,\r\n<-0.706,-0.702,0.090>,\r\n<-0.882,-0.450,0.138>,\r\n<-0.975,-0.137,0.172>,\r\n<-0.969,0.175,0.176>,\r\n<-0.919,0.378,0.107>,\r\n<-0.970,0.239,0.033>,\r\n<-0.989,-0.131,-0.074>,\r\n<-0.833,-0.525,-0.173>,\r\n<-0.516,-0.831,-0.209>,\r\n<-0.213,-0.957,-0.198>,\r\n<-0.260,-0.961,-0.094>,\r\n<-0.656,-0.755,0.029>,\r\n<-0.939,-0.301,0.168>,\r\n<-0.951,0.227,0.211>,\r\n<-0.864,0.486,0.131>,\r\n<-0.968,0.235,0.081>,\r\n<-0.939,-0.333,-0.083>,\r\n<-0.579,-0.792,-0.193>,\r\n<-0.422,-0.902,-0.087>,\r\n<-0.770,-0.638,0.005>,\r\n<-0.985,-0.080,0.153>,\r\n<-0.864,0.464,0.196>,\r\n<-0.921,0.382,0.083>,\r\n<-0.968,-0.246,-0.047>,\r\n<-0.654,-0.740,-0.156>,\r\n<-0.685,-0.729,0.009>,\r\n<-0.977,-0.141,0.162>,\r\n<-0.862,0.492,0.121>,\r\n<-0.863,0.503,0.045>,\r\n<-0.998,-0.057,0.017>,\r\n<-0.850,-0.526,-0.011>,\r\n<-0.921,-0.387,0.038>,\r\n<-0.940,0.327,0.101>,\r\n<-0.837,0.546,0.040>,\r\n<-0.989,0.140,-0.050>,\r\n<-0.880,-0.474,0.016>,\r\n<-0.844,-0.514,0.154>,\r\n<-0.981,0.103,0.162>,\r\n<-0.711,0.702,0.032>,\r\n<-0.658,0.743,-0.123>,\r\n<-0.964,0.254,-0.084>,\r\n<-0.925,-0.374,0.069>,\r\n<-0.882,-0.431,0.192>,\r\n<-0.981,0.144,0.133>,\r\n<-0.728,0.685,-0.019>,\r\n<-0.453,0.888,-0.081>,\r\n<-0.680,0.714,-0.166>,\r\n<-0.976,0.202,-0.079>,\r\n<-0.926,-0.359,0.116>,\r\n<-0.845,-0.500,0.190>,\r\n<-0.961,-0.146,0.236>,\r\n<-0.899,0.402,0.174>,\r\n<-0.577,0.817,0.010>,\r\n<-0.182,0.979,-0.092>,\r\n<-0.212,0.955,-0.207>,\r\n<-0.550,0.812,-0.194>,\r\n<-0.861,0.486,-0.150>,\r\n<-0.995,0.089,-0.045>,\r\n<-0.960,-0.275,0.049>,\r\n<-0.926,-0.351,0.137>,\r\n<-0.975,-0.128,0.181>,\r\n<-0.967,0.183,0.176>,\r\n<-0.857,0.495,0.142>,\r\n<-0.673,0.735,0.086>,\r\n<-0.482,0.875,0.033>,\r\n<-0.314,0.949,0.006>,\r\n<-0.353,0.934,-0.052>,\r\n<-0.493,0.869,-0.044>,\r\n<-0.637,0.770,-0.026>,\r\n<-0.757,0.653,-0.012>,\r\n<-0.838,0.546,-0.006>,\r\n<-0.886,0.464,-0.012>,\r\n<-0.906,0.422,-0.022>,\r\n<-0.889,0.458,-0.018>,\r\n<-0.837,0.547,-0.014>,\r\n<-0.767,0.642,-0.006>,\r\n<-0.707,0.706,0.032>\r\n<-0.667,-0.745,-0.005>,\r\n<-0.728,-0.684,-0.042>,\r\n<-0.806,-0.591,-0.047>,\r\n<-0.869,-0.493,-0.035>,\r\n<-0.904,-0.427,-0.015>,\r\n<-0.900,-0.435,0.009>,\r\n<-0.859,-0.511,0.027>,\r\n<-0.787,-0.617,0.027>,\r\n<-0.677,-0.736,0.017>,\r\n<-0.537,-0.843,0.002>,\r\n<-0.391,-0.920,-0.018>,\r\n<-0.302,-0.953,-0.021>,\r\n<-0.403,-0.915,-0.026>,\r\n<-0.595,-0.804,0.007>,\r\n<-0.794,-0.606,0.051>,\r\n<-0.942,-0.323,0.087>,\r\n<-0.995,-0.013,0.104>,\r\n<-0.953,0.279,0.119>,\r\n<-0.940,0.335,0.065>,\r\n<-1,0.022,0.014>,\r\n<-0.931,-0.357,-0.081>,\r\n<-0.685,-0.716,-0.135>,\r\n<-0.342,-0.923,-0.174>,\r\n<-0.211,-0.973,-0.088>,\r\n<-0.546,-0.837,-0.037>,\r\n<-0.878,-0.467,0.103>,\r\n<-0.987,0.034,0.157>,\r\n<-0.896,0.418,0.151>,\r\n<-0.944,0.314,0.102>,\r\n<-0.973,-0.225,-0.057>,\r\n<-0.698,-0.697,-0.166>,\r\n<-0.469,-0.880,-0.077>,\r\n<-0.723,-0.691,0>,\r\n<-0.975,-0.166,0.144>,\r\n<-0.907,0.376,0.187>,\r\n<-0.934,0.350,0.075>,\r\n<-0.974,-0.219,-0.062>,\r\n<-0.719,-0.679,-0.146>,\r\n<-0.746,-0.663,0.061>,\r\n<-0.971,-0.174,0.165>,\r\n<-0.892,0.404,0.203>,\r\n<-0.884,0.466,0.033>,\r\n<-0.991,-0.044,-0.129>,\r\n<-0.862,-0.506,-0.017>,\r\n<-0.931,-0.345,0.118>,\r\n<-0.932,0.338,0.130>,\r\n<-0.881,0.473,0.015>,\r\n<-0.984,0.092,-0.152>,\r\n<-0.918,-0.397,-0.011>,\r\n<-0.891,-0.411,0.191>,\r\n<-0.974,0.143,0.175>,\r\n<-0.750,0.658,0.061>,\r\n<-0.750,0.644,-0.149>,\r\n<-0.979,0.191,-0.071>,\r\n<-0.935,-0.350,0.054>,\r\n<-0.925,-0.335,0.181>,\r\n<-0.966,0.227,0.122>,\r\n<-0.684,0.729,-0.031>,\r\n<-0.517,0.849,-0.106>,\r\n<-0.792,0.596,-0.129>,\r\n<-0.993,0.109,-0.040>,\r\n<-0.914,-0.388,0.115>,\r\n<-0.894,-0.407,0.185>,\r\n<-0.985,0.046,0.167>,\r\n<-0.830,0.548,0.100>,\r\n<-0.464,0.884,-0.053>,\r\n<-0.172,0.981,-0.095>,\r\n<-0.367,0.915,-0.171>,\r\n<-0.715,0.687,-0.127>,\r\n<-0.947,0.316,-0.059>,\r\n<-0.997,-0.063,0.037>,\r\n<-0.937,-0.342,0.074>,\r\n<-0.963,-0.239,0.125>,\r\n<-0.993,0.057,0.106>,\r\n<-0.927,0.366,0.086>,\r\n<-0.768,0.638,0.047>,\r\n<-0.569,0.822,0.005>,\r\n<-0.380,0.925,-0.029>,\r\n<-0.320,0.947,-0.029>,\r\n<-0.439,0.898,-0.019>,\r\n<-0.586,0.810,0.002>,\r\n<-0.721,0.693,0.021>,\r\n<-0.820,0.571,0.032>,\r\n<-0.882,0.471,0.026>,\r\n<-0.914,0.405,0.004>,\r\n<-0.907,0.420,-0.018>,\r\n<-0.862,0.506,-0.040>,\r\n<-0.790,0.612,-0.050>,\r\n<-0.707,0.706,-0.043>,\r\n<-0.642,0.767,-0.004>\r\n<-0.573,-0.819,-0.013>,\r\n<-0.639,-0.767,-0.050>,\r\n<-0.730,-0.681,-0.057>,\r\n<-0.818,-0.573,-0.047>,\r\n<-0.887,-0.461,-0.026>,\r\n<-0.924,-0.382,0>,\r\n<-0.917,-0.398,0.018>,\r\n<-0.869,-0.494,0.026>,\r\n<-0.786,-0.618,0.024>,\r\n<-0.663,-0.748,0.011>,\r\n<-0.516,-0.857,-0.006>,\r\n<-0.357,-0.934,-0.032>,\r\n<-0.299,-0.954,-0.030>,\r\n<-0.442,-0.897,-0.011>,\r\n<-0.645,-0.764,0.025>,\r\n<-0.840,-0.539,0.061>,\r\n<-0.966,-0.241,0.091>,\r\n<-0.992,0.055,0.110>,\r\n<-0.948,0.310,0.078>,\r\n<-0.976,0.214,0.040>,\r\n<-0.987,-0.157,-0.041>,\r\n<-0.839,-0.534,-0.105>,\r\n<-0.554,-0.822,-0.134>,\r\n<-0.257,-0.961,-0.099>,\r\n<-0.390,-0.918,-0.066>,\r\n<-0.774,-0.631,0.060>,\r\n<-0.975,-0.177,0.132>,\r\n<-0.943,0.280,0.179>,\r\n<-0.935,0.348,0.069>,\r\n<-0.992,-0.109,-0.057>,\r\n<-0.815,-0.561,-0.146>,\r\n<-0.564,-0.822,-0.084>,\r\n<-0.683,-0.730,0.009>,\r\n<-0.952,-0.266,0.154>,\r\n<-0.947,0.256,0.193>,\r\n<-0.954,0.292,0.065>,\r\n<-0.969,-0.163,-0.185>,\r\n<-0.814,-0.569,-0.113>,\r\n<-0.815,-0.575,0.070>,\r\n<-0.968,-0.163,0.189>,\r\n<-0.928,0.293,0.229>,\r\n<-0.979,0.204,0.015>,\r\n<-0.990,-0.048,-0.134>,\r\n<-0.961,-0.274,-0.018>,\r\n<-0.947,-0.250,0.204>,\r\n<-0.956,0.241,0.169>,\r\n<-0.966,0.260,-0.006>,\r\n<-0.991,0.055,-0.125>,\r\n<-0.983,-0.180,-0.024>,\r\n<-0.940,-0.266,0.212>,\r\n<-0.964,0.159,0.213>,\r\n<-0.831,0.546,0.105>,\r\n<-0.831,0.539,-0.135>,\r\n<-0.970,0.153,-0.191>,\r\n<-0.959,-0.280,0.038>,\r\n<-0.961,-0.202,0.189>,\r\n<-0.942,0.307,0.133>,\r\n<-0.679,0.734,0.004>,\r\n<-0.609,0.782,-0.132>,\r\n<-0.863,0.490,-0.128>,\r\n<-1,0.015,-0.021>,\r\n<-0.917,-0.394,0.066>,\r\n<-0.945,-0.261,0.195>,\r\n<-0.963,0.230,0.141>,\r\n<-0.727,0.683,0.063>,\r\n<-0.336,0.940,-0.059>,\r\n<-0.256,0.959,-0.121>,\r\n<-0.581,0.802,-0.139>,\r\n<-0.860,0.499,-0.108>,\r\n<-0.992,0.122,-0.028>,\r\n<-0.968,-0.246,0.047>,\r\n<-0.951,-0.295,0.091>,\r\n<-0.995,-0.017,0.100>,\r\n<-0.956,0.282,0.082>,\r\n<-0.819,0.572,0.054>,\r\n<-0.621,0.783,0.015>,\r\n<-0.416,0.909,-0.019>,\r\n<-0.310,0.950,-0.031>,\r\n<-0.407,0.913,-0.033>,\r\n<-0.563,0.826,-0.008>,\r\n<-0.709,0.705,0.009>,\r\n<-0.822,0.570,0.023>,\r\n<-0.894,0.448,0.025>,\r\n<-0.932,0.363,0.015>,\r\n<-0.927,0.375,-0.006>,\r\n<-0.879,0.476,-0.035>,\r\n<-0.803,0.594,-0.053>,\r\n<-0.707,0.704,-0.061>,\r\n<-0.612,0.789,-0.051>,\r\n<-0.546,0.838,-0.012>\r\n<-0.478,-0.878,-0.017>,\r\n<-0.535,-0.844,-0.043>,\r\n<-0.628,-0.777,-0.052>,\r\n<-0.734,-0.677,-0.050>,\r\n<-0.830,-0.556,-0.040>,\r\n<-0.903,-0.430,-0.022>,\r\n<-0.940,-0.341,-0.002>,\r\n<-0.932,-0.363,0.012>,\r\n<-0.880,-0.475,0.016>,\r\n<-0.789,-0.615,0.011>,\r\n<-0.654,-0.756,0.001>,\r\n<-0.497,-0.868,-0.013>,\r\n<-0.330,-0.944,-0.020>,\r\n<-0.307,-0.952,-0.010>,\r\n<-0.477,-0.879,0.012>,\r\n<-0.686,-0.726,0.045>,\r\n<-0.873,-0.480,0.080>,\r\n<-0.979,-0.182,0.094>,\r\n<-0.989,0.107,0.099>,\r\n<-0.961,0.274,0.030>,\r\n<-0.998,0.057,-0.003>,\r\n<-0.946,-0.316,-0.076>,\r\n<-0.737,-0.666,-0.114>,\r\n<-0.425,-0.894,-0.139>,\r\n<-0.318,-0.947,-0.032>,\r\n<-0.638,-0.769,0.037>,\r\n<-0.917,-0.379,0.125>,\r\n<-0.982,0.069,0.174>,\r\n<-0.953,0.299,0.046>,\r\n<-1,0.004,-0.042>,\r\n<-0.895,-0.428,-0.123>,\r\n<-0.694,-0.698,-0.174>,\r\n<-0.692,-0.721,0.043>,\r\n<-0.925,-0.343,0.161>,\r\n<-0.971,0.113,0.211>,\r\n<-0.995,0.094,0.022>,\r\n<-0.978,-0.153,-0.142>,\r\n<-0.923,-0.381,-0.049>,\r\n<-0.865,-0.484,0.131>,\r\n<-0.946,-0.165,0.279>,\r\n<-0.943,0.170,0.287>,\r\n<-0.993,0.120,0.019>,\r\n<-0.998,-0.061,0>,\r\n<-0.987,-0.162,-0.008>,\r\n<-0.964,-0.153,0.218>,\r\n<-0.968,0.133,0.213>,\r\n<-0.985,0.172,0>,\r\n<-0.998,0.059,0>,\r\n<-0.997,-0.081,0.012>,\r\n<-0.960,-0.122,0.253>,\r\n<-0.940,0.187,0.285>,\r\n<-0.886,0.438,0.148>,\r\n<-0.948,0.316,-0.033>,\r\n<-0.980,0.136,-0.144>,\r\n<-0.998,-0.070,-0.002>,\r\n<-0.977,-0.062,0.203>,\r\n<-0.908,0.387,0.162>,\r\n<-0.704,0.709,0.034>,\r\n<-0.733,0.647,-0.209>,\r\n<-0.921,0.370,-0.122>,\r\n<-0.995,-0.097,-0.002>,\r\n<-0.943,-0.327,0.059>,\r\n<-0.985,-0.031,0.172>,\r\n<-0.894,0.432,0.122>,\r\n<-0.594,0.804,0.018>,\r\n<-0.298,0.954,-0.028>,\r\n<-0.455,0.879,-0.145>,\r\n<-0.761,0.639,-0.115>,\r\n<-0.955,0.287,-0.074>,\r\n<-0.996,-0.093,0.003>,\r\n<-0.959,-0.282,0.036>,\r\n<-0.992,-0.081,0.100>,\r\n<-0.973,0.215,0.084>,\r\n<-0.853,0.517,0.063>,\r\n<-0.660,0.751,0.032>,\r\n<-0.449,0.894,0.003>,\r\n<-0.311,0.950,-0.017>,\r\n<-0.379,0.925,-0.024>,\r\n<-0.546,0.837,-0.013>,\r\n<-0.700,0.714,0>,\r\n<-0.825,0.566,0.009>,\r\n<-0.904,0.428,0.015>,\r\n<-0.945,0.327,0.011>,\r\n<-0.942,0.337,-0.003>,\r\n<-0.893,0.449,-0.025>,\r\n<-0.814,0.580,-0.045>,\r\n<-0.709,0.703,-0.055>,\r\n<-0.598,0.799,-0.056>,\r\n<-0.505,0.862,-0.044>,\r\n<-0.451,0.892,-0.016>\r\n<-0.419,-0.908,-0.021>,\r\n<-0.439,-0.898,-0.025>,\r\n<-0.513,-0.858,-0.040>,\r\n<-0.620,-0.783,-0.045>,\r\n<-0.738,-0.673,-0.041>,\r\n<-0.841,-0.540,-0.028>,\r\n<-0.914,-0.405,-0.012>,\r\n<-0.949,-0.315,0.002>,\r\n<-0.939,-0.343,0.009>,\r\n<-0.885,-0.466,0.010>,\r\n<-0.787,-0.617,0.003>,\r\n<-0.644,-0.765,-0.006>,\r\n<-0.482,-0.876,-0.017>,\r\n<-0.328,-0.944,-0.015>,\r\n<-0.339,-0.941,0>,\r\n<-0.524,-0.851,0.032>,\r\n<-0.728,-0.682,0.065>,\r\n<-0.901,-0.425,0.086>,\r\n<-0.985,-0.147,0.090>,\r\n<-0.990,0.127,0.064>,\r\n<-0.984,0.179,0.004>,\r\n<-0.993,-0.109,-0.049>,\r\n<-0.880,-0.464,-0.104>,\r\n<-0.650,-0.750,-0.122>,\r\n<-0.406,-0.912,-0.053>,\r\n<-0.508,-0.861,0.014>,\r\n<-0.825,-0.550,0.129>,\r\n<-0.973,-0.157,0.170>,\r\n<-0.985,0.140,0.104>,\r\n<-0.998,0.058,-0.032>,\r\n<-0.913,-0.338,-0.230>,\r\n<-0.813,-0.558,-0.166>,\r\n<-0.786,-0.612,0.088>,\r\n<-0.889,-0.417,0.192>,\r\n<-0.964,-0.055,0.258>,\r\n<-0.998,-0.010,0.061>,\r\n<-0.985,-0.172,0.010>,\r\n<-0.971,-0.238,-0.013>,\r\n<-0.937,-0.306,0.167>,\r\n<-0.950,-0.119,0.290>,\r\n<-0.972,-0.028,0.235>,\r\n<-0.996,-0.090,-0.001>,\r\n<-0.991,-0.072,0.111>,\r\n<-1,-0.039,-0.006>,\r\n<-0.994,-0.014,0.109>,\r\n<-0.992,0.013,0.125>,\r\n<-1,0.035,0.005>,\r\n<-0.998,0.060,-0.003>,\r\n<-0.996,0.086,0.006>,\r\n<-0.986,0.060,0.157>,\r\n<-0.959,0.143,0.244>,\r\n<-0.962,0.247,0.114>,\r\n<-0.979,0.206,-0.006>,\r\n<-0.989,0.147,0.015>,\r\n<-0.997,0.038,0.061>,\r\n<-0.961,0.133,0.244>,\r\n<-0.874,0.436,0.214>,\r\n<-0.833,0.547,0.078>,\r\n<-0.835,0.519,-0.183>,\r\n<-0.920,0.307,-0.245>,\r\n<-0.993,-0.115,0.009>,\r\n<-0.981,-0.152,0.125>,\r\n<-0.965,0.204,0.164>,\r\n<-0.796,0.595,0.115>,\r\n<-0.469,0.883,-0.005>,\r\n<-0.406,0.911,-0.071>,\r\n<-0.675,0.727,-0.127>,\r\n<-0.889,0.445,-0.105>,\r\n<-0.996,0.079,-0.044>,\r\n<-0.980,-0.199,0.007>,\r\n<-0.991,-0.114,0.075>,\r\n<-0.982,0.167,0.089>,\r\n<-0.886,0.456,0.080>,\r\n<-0.702,0.710,0.052>,\r\n<-0.493,0.870,0.016>,\r\n<-0.335,0.942,-0.007>,\r\n<-0.372,0.928,-0.019>,\r\n<-0.534,0.845,-0.019>,\r\n<-0.691,0.723,-0.008>,\r\n<-0.823,0.568,0.002>,\r\n<-0.908,0.420,0.009>,\r\n<-0.951,0.310,0.009>,\r\n<-0.949,0.314,0.003>,\r\n<-0.904,0.428,-0.011>,\r\n<-0.823,0.567,-0.027>,\r\n<-0.711,0.702,-0.042>,\r\n<-0.587,0.808,-0.047>,\r\n<-0.478,0.878,-0.039>,\r\n<-0.411,0.911,-0.025>,\r\n<-0.397,0.917,-0.021>\r\n<-0.434,-0.900,-0.019>,\r\n<-0.396,-0.918,-0.005>,\r\n<-0.403,-0.915,-0.016>,\r\n<-0.492,-0.870,-0.030>,\r\n<-0.613,-0.790,-0.032>,\r\n<-0.742,-0.670,-0.025>,\r\n<-0.848,-0.529,-0.015>,\r\n<-0.921,-0.390,-0.003>,\r\n<-0.954,-0.300,0.004>,\r\n<-0.942,-0.335,0.007>,\r\n<-0.886,-0.464,0.003>,\r\n<-0.782,-0.623,-0.006>,\r\n<-0.637,-0.771,-0.017>,\r\n<-0.478,-0.878,-0.022>,\r\n<-0.348,-0.937,-0.009>,\r\n<-0.388,-0.921,0.015>,\r\n<-0.573,-0.818,0.047>,\r\n<-0.767,-0.637,0.080>,\r\n<-0.918,-0.385,0.091>,\r\n<-0.988,-0.133,0.084>,\r\n<-0.995,0.094,0.034>,\r\n<-0.999,0.046,-0.022>,\r\n<-0.959,-0.266,-0.093>,\r\n<-0.811,-0.572,-0.124>,\r\n<-0.600,-0.792,-0.114>,\r\n<-0.515,-0.857,0.003>,\r\n<-0.723,-0.680,0.126>,\r\n<-0.921,-0.340,0.189>,\r\n<-0.985,-0.083,0.153>,\r\n<-0.991,-0.126,-0.048>,\r\n<-0.952,-0.271,-0.145>,\r\n<-0.934,-0.357,-0.016>,\r\n<-0.882,-0.466,0.069>,\r\n<-0.890,-0.393,0.231>,\r\n<-0.955,-0.182,0.234>,\r\n<-0.985,-0.167,0.051>,\r\n<-0.978,-0.210,-0.004>,\r\n<-0.981,-0.195,0.003>,\r\n<-0.976,-0.186,0.111>,\r\n<-0.959,-0.137,0.250>,\r\n<-0.959,-0.148,0.243>,\r\n<-0.942,-0.058,0.330>,\r\n<-0.922,-0.091,0.376>,\r\n<-0.909,-0.132,0.394>,\r\n<-0.913,-0.014,0.408>,\r\n<-0.916,0.019,0.402>,\r\n<-0.922,0.052,0.383>,\r\n<-0.935,0.084,0.345>,\r\n<-0.951,0.115,0.287>,\r\n<-0.968,0.139,0.211>,\r\n<-0.970,0.158,0.186>,\r\n<-0.982,0.175,0.072>,\r\n<-0.981,0.193,-0.001>,\r\n<-0.978,0.207,-0.004>,\r\n<-0.976,0.211,0.059>,\r\n<-0.953,0.240,0.184>,\r\n<-0.909,0.368,0.194>,\r\n<-0.922,0.385,0.050>,\r\n<-0.946,0.324,-0.002>,\r\n<-0.950,0.267,-0.160>,\r\n<-0.997,0.072,-0.035>,\r\n<-0.983,0.061,0.173>,\r\n<-0.904,0.391,0.170>,\r\n<-0.693,0.714,0.106>,\r\n<-0.496,0.868,-0.005>,\r\n<-0.619,0.775,-0.128>,\r\n<-0.823,0.554,-0.129>,\r\n<-0.965,0.243,-0.095>,\r\n<-0.997,-0.073,-0.023>,\r\n<-0.995,-0.092,0.038>,\r\n<-0.986,0.146,0.086>,\r\n<-0.911,0.404,0.088>,\r\n<-0.746,0.662,0.072>,\r\n<-0.542,0.839,0.038>,\r\n<-0.375,0.927,0.006>,\r\n<-0.379,0.925,-0.016>,\r\n<-0.526,0.850,-0.022>,\r\n<-0.683,0.730,-0.016>,\r\n<-0.818,0.575,-0.006>,\r\n<-0.908,0.420,0.002>,\r\n<-0.952,0.306,0.007>,\r\n<-0.953,0.303,0.005>,\r\n<-0.910,0.415,-0.001>,\r\n<-0.829,0.559,-0.012>,\r\n<-0.713,0.700,-0.022>,\r\n<-0.578,0.816,-0.028>,\r\n<-0.454,0.890,-0.028>,\r\n<-0.367,0.930,-0.009>,\r\n<-0.375,0.927,-0.002>,\r\n<-0.421,0.907,-0.018>\r\n<-0.507,-0.862,-0.011>,\r\n<-0.437,-0.899,0.015>,\r\n<-0.354,-0.935,0.009>,\r\n<-0.369,-0.929,-0.009>,\r\n<-0.475,-0.880,-0.018>,\r\n<-0.608,-0.794,-0.017>,\r\n<-0.744,-0.668,-0.012>,\r\n<-0.852,-0.523,-0.004>,\r\n<-0.924,-0.382,0.003>,\r\n<-0.955,-0.297,0.006>,\r\n<-0.941,-0.338,0.002>,\r\n<-0.882,-0.471,-0.008>,\r\n<-0.776,-0.630,-0.020>,\r\n<-0.635,-0.772,-0.028>,\r\n<-0.488,-0.872,-0.024>,\r\n<-0.388,-0.922,-0.002>,\r\n<-0.452,-0.892,0.026>,\r\n<-0.625,-0.778,0.065>,\r\n<-0.799,-0.594,0.090>,\r\n<-0.926,-0.365,0.095>,\r\n<-0.986,-0.146,0.077>,\r\n<-1,0,0.004>,\r\n<-0.991,-0.118,-0.063>,\r\n<-0.909,-0.399,-0.118>,\r\n<-0.771,-0.625,-0.119>,\r\n<-0.674,-0.735,-0.075>,\r\n<-0.697,-0.711,0.098>,\r\n<-0.846,-0.499,0.191>,\r\n<-0.941,-0.283,0.188>,\r\n<-0.971,-0.230,0.063>,\r\n<-0.948,-0.319,0.015>,\r\n<-0.944,-0.329,0>,\r\n<-0.944,-0.327,0.032>,\r\n<-0.939,-0.324,0.113>,\r\n<-0.948,-0.294,0.118>,\r\n<-0.935,-0.298,0.192>,\r\n<-0.882,-0.299,0.364>,\r\n<-0.819,-0.247,0.518>,\r\n<-0.737,-0.157,0.657>,\r\n<-0.643,-0.071,0.762>,\r\n<-0.577,-0.014,0.817>,\r\n<-0.484,-0.002,0.875>,\r\n<-0.451,-0.005,0.893>,\r\n<-0.412,-0.006,0.911>,\r\n<-0.404,-0.004,0.915>,\r\n<-0.409,-0.004,0.912>,\r\n<-0.428,-0.006,0.904>,\r\n<-0.461,-0.006,0.887>,\r\n<-0.512,0.005,0.859>,\r\n<-0.581,0.033,0.813>,\r\n<-0.666,0.087,0.740>,\r\n<-0.752,0.166,0.638>,\r\n<-0.830,0.248,0.500>,\r\n<-0.889,0.295,0.351>,\r\n<-0.939,0.292,0.182>,\r\n<-0.956,0.286,0.071>,\r\n<-0.923,0.340,0.182>,\r\n<-0.952,0.307,0.003>,\r\n<-0.945,0.328,0>,\r\n<-0.957,0.289,0.026>,\r\n<-0.979,0.193,0.074>,\r\n<-0.936,0.289,0.203>,\r\n<-0.835,0.522,0.172>,\r\n<-0.667,0.739,0.091>,\r\n<-0.677,0.730,-0.090>,\r\n<-0.784,0.608,-0.124>,\r\n<-0.916,0.383,-0.116>,\r\n<-0.993,0.095,-0.066>,\r\n<-1,-0.003,0.004>,\r\n<-0.985,0.156,0.078>,\r\n<-0.922,0.374,0.098>,\r\n<-0.785,0.613,0.090>,\r\n<-0.597,0.800,0.058>,\r\n<-0.432,0.902,0.022>,\r\n<-0.407,0.913,-0.007>,\r\n<-0.528,0.849,-0.024>,\r\n<-0.677,0.736,-0.023>,\r\n<-0.811,0.585,-0.014>,\r\n<-0.903,0.429,-0.004>,\r\n<-0.950,0.312,0.004>,\r\n<-0.953,0.302,0.007>,\r\n<-0.913,0.408,0.005>,\r\n<-0.833,0.554,0>,\r\n<-0.715,0.699,-0.008>,\r\n<-0.573,0.820,-0.014>,\r\n<-0.437,0.900,-0.013>,\r\n<-0.330,0.944,-0.007>,\r\n<-0.329,0.944,0.014>,\r\n<-0.427,0.904,0.024>,\r\n<-0.503,0.864,-0.009>\r\n<-0.605,-0.796,-0.015>,\r\n<-0.528,-0.849,0.027>,\r\n<-0.409,-0.912,0.024>,\r\n<-0.316,-0.949,0.007>,\r\n<-0.345,-0.939,-0.003>,\r\n<-0.463,-0.886,-0.007>,\r\n<-0.605,-0.796,-0.007>,\r\n<-0.745,-0.667,-0.002>,\r\n<-0.854,-0.520,0.004>,\r\n<-0.925,-0.381,0.008>,\r\n<-0.952,-0.305,0.004>,\r\n<-0.936,-0.352,-0.005>,\r\n<-0.875,-0.484,-0.020>,\r\n<-0.770,-0.638,-0.032>,\r\n<-0.638,-0.770,-0.035>,\r\n<-0.511,-0.860,-0.024>,\r\n<-0.446,-0.895,0.005>,\r\n<-0.523,-0.851,0.041>,\r\n<-0.675,-0.733,0.079>,\r\n<-0.824,-0.557,0.104>,\r\n<-0.927,-0.363,0.100>,\r\n<-0.978,-0.200,0.057>,\r\n<-0.989,-0.148,-0.016>,\r\n<-0.959,-0.264,-0.107>,\r\n<-0.852,-0.486,-0.195>,\r\n<-0.801,-0.589,-0.106>,\r\n<-0.815,-0.573,0.086>,\r\n<-0.840,-0.514,0.176>,\r\n<-0.904,-0.394,0.166>,\r\n<-0.934,-0.355,0.047>,\r\n<-0.934,-0.357,-0.005>,\r\n<-0.937,-0.349,0.018>,\r\n<-0.901,-0.391,0.187>,\r\n<-0.824,-0.379,0.420>,\r\n<-0.726,-0.255,0.639>,\r\n<-0.578,-0.087,0.811>,\r\n<-0.420,0.006,0.908>,\r\n<-0.270,0.018,0.963>,\r\n<-0.143,0.008,0.990>,\r\n<-0.057,0.001,0.998>,\r\n<-0.011,0,1>,\r\n<0.004,0.002,1>,\r\n<0.006,-0.002,1>,\r\n<0.006,-0.001,1>,\r\n<0.006,0,1>,\r\n<0.006,0,1>,\r\n<0.006,0,1>,\r\n<0.006,0,1>,\r\n<-0.001,0,1>,\r\n<-0.024,0,1>,\r\n<-0.076,-0.003,0.997>,\r\n<-0.164,-0.007,0.986>,\r\n<-0.289,-0.016,0.957>,\r\n<-0.434,-0.002,0.901>,\r\n<-0.587,0.093,0.804>,\r\n<-0.712,0.364,0.600>,\r\n<-0.833,0.379,0.404>,\r\n<-0.940,0.248,0.233>,\r\n<-0.938,0.347,0.019>,\r\n<-0.935,0.354,-0.005>,\r\n<-0.939,0.331,0.090>,\r\n<-0.904,0.372,0.211>,\r\n<-0.813,0.555,0.177>,\r\n<-0.798,0.599,0.071>,\r\n<-0.812,0.574,-0.105>,\r\n<-0.856,0.479,-0.197>,\r\n<-0.963,0.251,-0.097>,\r\n<-0.990,0.140,-0.011>,\r\n<-0.976,0.210,0.062>,\r\n<-0.923,0.371,0.100>,\r\n<-0.815,0.570,0.104>,\r\n<-0.653,0.753,0.078>,\r\n<-0.502,0.864,0.036>,\r\n<-0.456,0.890,0>,\r\n<-0.543,0.839,-0.026>,\r\n<-0.674,0.738,-0.033>,\r\n<-0.802,0.597,-0.026>,\r\n<-0.895,0.445,-0.012>,\r\n<-0.945,0.328,0.002>,\r\n<-0.951,0.310,0.008>,\r\n<-0.914,0.406,0.010>,\r\n<-0.835,0.550,0.007>,\r\n<-0.716,0.698,0.002>,\r\n<-0.570,0.821,-0.002>,\r\n<-0.426,0.905,-0.004>,\r\n<-0.309,0.951,0>,\r\n<-0.291,0.957,0.009>,\r\n<-0.399,0.917,0.024>,\r\n<-0.529,0.848,0.033>,\r\n<-0.615,0.788,-0.012>\r\n<-0.724,-0.690,-0.028>,\r\n<-0.644,-0.765,0.023>,\r\n<-0.522,-0.853,0.026>,\r\n<-0.382,-0.924,0.016>,\r\n<-0.293,-0.956,0.007>,\r\n<-0.330,-0.944,0.002>,\r\n<-0.455,-0.890,0>,\r\n<-0.603,-0.798,0.004>,\r\n<-0.745,-0.667,0.010>,\r\n<-0.853,-0.522,0.014>,\r\n<-0.921,-0.390,0.013>,\r\n<-0.945,-0.328,0.003>,\r\n<-0.926,-0.378,-0.013>,\r\n<-0.863,-0.505,-0.030>,\r\n<-0.763,-0.645,-0.042>,\r\n<-0.648,-0.760,-0.042>,\r\n<-0.549,-0.835,-0.023>,\r\n<-0.520,-0.854,0.014>,\r\n<-0.597,-0.800,0.058>,\r\n<-0.723,-0.684,0.098>,\r\n<-0.840,-0.530,0.114>,\r\n<-0.918,-0.384,0.100>,\r\n<-0.946,-0.323,0.023>,\r\n<-0.926,-0.369,-0.076>,\r\n<-0.905,-0.412,-0.104>,\r\n<-0.884,-0.467,0>,\r\n<-0.884,-0.467,0.035>,\r\n<-0.884,-0.463,0.066>,\r\n<-0.878,-0.468,0.102>,\r\n<-0.908,-0.417,0.038>,\r\n<-0.837,-0.468,0.284>,\r\n<-0.739,-0.355,0.572>,\r\n<-0.564,-0.131,0.815>,\r\n<-0.352,0.008,0.936>,\r\n<-0.152,0.012,0.988>,\r\n<-0.026,0.002,1>,\r\n<0.007,0,1>,\r\n<0.002,0,1>,\r\nz,z,<0.002,0,1>,\r\nz,z,z,<0.001,0,1>,\r\nZS(7)\r\n<0.003,0,1>,\r\n<0.008,0,1>,\r\n<-0.027,-0.004,1>,\r\n<-0.158,-0.014,0.987>,\r\n<-0.414,-0.017,0.910>,\r\n<-0.564,0.126,0.816>,\r\n<-0.739,0.351,0.575>,\r\n<-0.836,0.465,0.290>,\r\n<-0.907,0.418,0.045>,\r\n<-0.845,0.502,0.187>,\r\n<-0.873,0.477,0.097>,\r\n<-0.887,0.462,0.027>,\r\n<-0.885,0.465,0>,\r\n<-0.907,0.409,-0.105>,\r\n<-0.929,0.363,-0.074>,\r\n<-0.945,0.324,0.032>,\r\n<-0.914,0.391,0.104>,\r\n<-0.834,0.539,0.117>,\r\n<-0.708,0.700,0.097>,\r\n<-0.582,0.812,0.054>,\r\n<-0.525,0.851,0.009>,\r\n<-0.574,0.818,-0.027>,\r\n<-0.678,0.734,-0.041>,\r\n<-0.791,0.611,-0.038>,\r\n<-0.882,0.470,-0.022>,\r\n<-0.935,0.356,-0.003>,\r\n<-0.944,0.329,0.011>,\r\n<-0.911,0.412,0.017>,\r\n<-0.836,0.549,0.017>,\r\n<-0.719,0.695,0.011>,\r\n<-0.572,0.820,0.006>,\r\n<-0.423,0.906,0.003>,\r\n<-0.298,0.954,0.003>,\r\n<-0.273,0.962,0.007>,\r\n<-0.374,0.927,0.013>,\r\n<-0.523,0.852,0.022>,\r\n<-0.657,0.754,0.023>,\r\n<-0.741,0.671,-0.028>\r\n<-0.835,-0.548,-0.045>,\r\n<-0.769,-0.639,0.007>,\r\n<-0.655,-0.756,0.017>,\r\n<-0.511,-0.859,0.015>,\r\n<-0.368,-0.930,0.010>,\r\n<-0.283,-0.959,0.006>,\r\n<-0.325,-0.946,0.004>,\r\n<-0.454,-0.891,0.008>,\r\n<-0.603,-0.798,0.016>,\r\n<-0.743,-0.669,0.022>,\r\n<-0.848,-0.530,0.024>,\r\n<-0.911,-0.412,0.017>,\r\n<-0.931,-0.364,0.002>,\r\n<-0.909,-0.416,-0.018>,\r\n<-0.847,-0.531,-0.040>,\r\n<-0.757,-0.651,-0.049>,\r\n<-0.668,-0.743,-0.044>,\r\n<-0.604,-0.797,-0.016>,\r\n<-0.604,-0.797,0.029>,\r\n<-0.672,-0.736,0.077>,\r\n<-0.768,-0.631,0.111>,\r\n<-0.851,-0.513,0.110>,\r\n<-0.901,-0.427,0.072>,\r\n<-0.891,-0.452,0.047>,\r\n<-0.874,-0.486,0.009>,\r\n<-0.877,-0.480,-0.002>,\r\n<-0.840,-0.529,0.124>,\r\n<-0.918,-0.392,0.052>,\r\n<-0.808,-0.515,0.285>,\r\n<-0.655,-0.473,0.589>,\r\n<-0.459,-0.084,0.884>,\r\n<-0.204,0.022,0.979>,\r\n<-0.021,0.004,1>,\r\n<0.006,0,1>,\r\n<0.001,0,1>,\r\nZS(19)\r\n<0.001,-0.001,1>,\r\n<0.004,-0.001,1>,\r\n<0.009,0,1>,\r\n<-0.017,-0.003,1>,\r\n<-0.200,-0.019,0.980>,\r\n<-0.452,0.080,0.889>,\r\n<-0.663,0.417,0.622>,\r\n<-0.781,0.536,0.322>,\r\n<-0.952,0.280,0.126>,\r\n<-0.802,0.559,0.212>,\r\n<-0.879,0.477,-0.003>,\r\n<-0.877,0.481,0.010>,\r\n<-0.892,0.451,0.046>,\r\n<-0.899,0.432,0.069>,\r\n<-0.847,0.521,0.108>,\r\n<-0.759,0.642,0.110>,\r\n<-0.665,0.743,0.073>,\r\n<-0.607,0.794,0.021>,\r\n<-0.622,0.783,-0.024>,\r\n<-0.691,0.721,-0.047>,\r\n<-0.781,0.623,-0.047>,\r\n<-0.864,0.502,-0.034>,\r\n<-0.918,0.397,-0.011>,\r\n<-0.932,0.362,0.010>,\r\n<-0.904,0.427,0.023>,\r\n<-0.833,0.552,0.026>,\r\n<-0.720,0.693,0.022>,\r\n<-0.575,0.818,0.014>,\r\n<-0.425,0.905,0.008>,\r\n<-0.297,0.955,0.004>,\r\n<-0.268,0.963,0.004>,\r\n<-0.366,0.931,0.007>,\r\n<-0.515,0.857,0.008>,\r\n<-0.666,0.746,0.007>,\r\n<-0.786,0.618,0.002>,\r\n<-0.854,0.517,-0.053>\r\n<-0.917,-0.394,-0.063>,\r\n<-0.872,-0.489,-0.013>,\r\n<-0.788,-0.616,0>,\r\n<-0.661,-0.750,0.005>,\r\n<-0.511,-0.860,0.004>,\r\n<-0.366,-0.931,0.003>,\r\n<-0.285,-0.958,0.003>,\r\n<-0.329,-0.944,0.008>,\r\n<-0.459,-0.888,0.019>,\r\n<-0.606,-0.795,0.029>,\r\n<-0.739,-0.672,0.036>,\r\n<-0.837,-0.546,0.035>,\r\n<-0.894,-0.448,0.023>,\r\n<-0.910,-0.416,0.002>,\r\n<-0.885,-0.466,-0.024>,\r\n<-0.826,-0.562,-0.047>,\r\n<-0.755,-0.653,-0.055>,\r\n<-0.697,-0.716,-0.040>,\r\n<-0.668,-0.744,-0.002>,\r\n<-0.684,-0.728,0.045>,\r\n<-0.739,-0.670,0.079>,\r\n<-0.796,-0.596,0.103>,\r\n<-0.850,-0.513,0.119>,\r\n<-0.872,-0.486,0.050>,\r\n<-0.860,-0.510,-0.005>,\r\n<-0.955,-0.271,0.122>,\r\n<-0.807,-0.559,0.192>,\r\n<-0.684,-0.437,0.583>,\r\n<-0.565,-0.086,0.820>,\r\n<-0.144,0.022,0.989>,\r\n<0.010,0.005,1>,\r\n<0.003,0.001,1>,\r\nZS(23)\r\n<0.001,0,1>,\r\n<0.002,0,1>,\r\n<0.002,0,1>,\r\n<0.004,0,1>,\r\n<0.010,-0.003,1>,\r\n<-0.135,-0.014,0.991>,\r\n<-0.549,0.073,0.832>,\r\n<-0.654,0.527,0.543>,\r\n<-0.802,0.555,0.219>,\r\n<-0.934,0.351,0.072>,\r\n<-0.860,0.511,-0.006>,\r\n<-0.873,0.486,0.054>,\r\n<-0.849,0.515,0.117>,\r\n<-0.790,0.605,0.096>,\r\n<-0.736,0.673,0.070>,\r\n<-0.689,0.724,0.038>,\r\n<-0.680,0.733,-0.010>,\r\n<-0.713,0.700,-0.046>,\r\n<-0.773,0.632,-0.057>,\r\n<-0.841,0.539,-0.042>,\r\n<-0.894,0.449,-0.016>,\r\n<-0.913,0.409,0.009>,\r\n<-0.891,0.453,0.028>,\r\n<-0.827,0.561,0.037>,\r\n<-0.721,0.692,0.033>,\r\n<-0.581,0.814,0.025>,\r\n<-0.432,0.902,0.014>,\r\n<-0.305,0.952,0.005>,\r\n<-0.272,0.962,0.001>,\r\n<-0.365,0.931,0>,\r\n<-0.515,0.857,0>,\r\n<-0.671,0.741,0>,\r\n<-0.802,0.597,-0.010>,\r\n<-0.889,0.458,-0.019>,\r\n<-0.935,0.346,-0.074>\r\n<-0.955,-0.297,-0.022>,\r\n<-0.940,-0.339,-0.032>,\r\n<-0.890,-0.456,-0.025>,\r\n<-0.801,-0.598,-0.010>,\r\n<-0.672,-0.741,-0.007>,\r\n<-0.518,-0.855,-0.007>,\r\n<-0.374,-0.927,-0.004>,\r\n<-0.301,-0.954,0.002>,\r\n<-0.349,-0.937,0.013>,\r\n<-0.474,-0.880,0.028>,\r\n<-0.613,-0.789,0.040>,\r\n<-0.735,-0.676,0.047>,\r\n<-0.822,-0.568,0.044>,\r\n<-0.870,-0.493,0.027>,\r\n<-0.878,-0.479,0.001>,\r\n<-0.851,-0.524,-0.028>,\r\n<-0.803,-0.594,-0.046>,\r\n<-0.757,-0.652,-0.043>,\r\n<-0.744,-0.667,-0.042>,\r\n<-0.729,-0.684,0.005>,\r\n<-0.752,-0.657,0.058>,\r\n<-0.798,-0.595,0.097>,\r\n<-0.820,-0.568,0.069>,\r\n<-0.842,-0.539,-0.009>,\r\n<-0.832,-0.554,0.023>,\r\n<-0.736,-0.521,0.433>,\r\n<-0.487,-0.259,0.834>,\r\n<-0.182,0.017,0.983>,\r\n<0.017,0.005,1>,\r\n<0.006,0.001,1>,\r\n<0.002,0.001,1>,\r\nZS(28)\r\n<0.001,0,1>,\r\n<0.004,-0.036,1>,\r\n<0.009,-0.002,1>,\r\n<-0.157,0.026,0.987>,\r\n<-0.504,0.217,0.836>,\r\n<-0.738,0.503,0.450>,\r\n<-0.829,0.558,0.034>,\r\n<-0.843,0.538,-0.010>,\r\n<-0.818,0.572,0.066>,\r\n<-0.797,0.597,0.089>,\r\n<-0.758,0.651,0.049>,\r\n<-0.737,0.676,-0.005>,\r\n<-0.753,0.656,-0.047>,\r\n<-0.769,0.638,-0.045>,\r\n<-0.815,0.578,-0.044>,\r\n<-0.860,0.510,-0.022>,\r\n<-0.883,0.469,0.009>,\r\n<-0.870,0.492,0.034>,\r\n<-0.816,0.577,0.047>,\r\n<-0.720,0.692,0.047>,\r\n<-0.590,0.806,0.036>,\r\n<-0.446,0.895,0.022>,\r\n<-0.323,0.946,0.007>,\r\n<-0.288,0.958,-0.002>,\r\n<-0.374,0.927,-0.007>,\r\n<-0.521,0.854,-0.008>,\r\n<-0.679,0.734,-0.011>,\r\n<-0.812,0.584,-0.014>,\r\n<-0.901,0.432,-0.029>,\r\n<-0.955,0.294,-0.036>,\r\n<-0.972,0.232,-0.030>\r\n<-0.913,-0.407,0.017>,\r\n<-0.945,-0.324,-0.031>,\r\n<-0.950,-0.308,-0.038>,\r\n<-0.903,-0.428,-0.025>,\r\n<-0.812,-0.584,-0.019>,\r\n<-0.682,-0.731,-0.016>,\r\n<-0.529,-0.848,-0.016>,\r\n<-0.393,-0.920,-0.010>,\r\n<-0.331,-0.944,0>,\r\n<-0.381,-0.924,0.016>,\r\n<-0.497,-0.867,0.035>,\r\n<-0.624,-0.780,0.050>,\r\n<-0.731,-0.680,0.057>,\r\n<-0.803,-0.594,0.050>,\r\n<-0.839,-0.544,0.029>,\r\n<-0.840,-0.543,0>,\r\n<-0.816,-0.578,-0.021>,\r\n<-0.776,-0.628,-0.063>,\r\n<-0.766,-0.642,-0.045>,\r\n<-0.783,-0.622,0.007>,\r\n<-0.781,-0.624,0.028>,\r\n<-0.797,-0.603,0.021>,\r\n<-0.824,-0.567,-0.015>,\r\n<-0.774,-0.614,0.153>,\r\n<-0.641,-0.428,0.637>,\r\n<-0.332,-0.094,0.938>,\r\n<-0.001,0.013,1>,\r\n<0.007,0.004,1>,\r\n<0.002,0.001,1>,\r\n<0.001,0,1>,\r\nZS(31)\r\n<0.035,0.001,1>,\r\n<0.002,-0.004,1>,\r\n<0.002,-0.013,1>,\r\n<-0.310,0.081,0.947>,\r\n<-0.631,0.420,0.653>,\r\n<-0.774,0.610,0.169>,\r\n<-0.825,0.565,-0.015>,\r\n<-0.801,0.598,0.016>,\r\n<-0.785,0.618,0.023>,\r\n<-0.788,0.616,0.002>,\r\n<-0.771,0.635,-0.048>,\r\n<-0.781,0.621,-0.060>,\r\n<-0.821,0.571,-0.018>,\r\n<-0.844,0.536,0.008>,\r\n<-0.841,0.540,0.037>,\r\n<-0.799,0.598,0.055>,\r\n<-0.718,0.693,0.059>,\r\n<-0.603,0.796,0.049>,\r\n<-0.471,0.881,0.031>,\r\n<-0.354,0.935,0.010>,\r\n<-0.317,0.948,-0.006>,\r\n<-0.392,0.920,-0.016>,\r\n<-0.533,0.846,-0.020>,\r\n<-0.688,0.726,-0.018>,\r\n<-0.819,0.573,-0.021>,\r\n<-0.912,0.409,-0.028>,\r\n<-0.962,0.270,-0.042>,\r\n<-0.965,0.262,-0.029>,\r\n<-0.941,0.336,0.025>\r\n<-0.790,-0.609,0.065>,\r\n<-0.866,-0.500,-0.013>,\r\n<-0.937,-0.348,-0.027>,\r\n<-0.954,-0.298,-0.019>,\r\n<-0.910,-0.414,-0.025>,\r\n<-0.817,-0.576,-0.024>,\r\n<-0.689,-0.724,-0.025>,\r\n<-0.543,-0.839,-0.025>,\r\n<-0.421,-0.907,-0.019>,\r\n<-0.377,-0.926,-0.004>,\r\n<-0.426,-0.904,0.017>,\r\n<-0.530,-0.847,0.040>,\r\n<-0.639,-0.767,0.057>,\r\n<-0.725,-0.686,0.060>,\r\n<-0.780,-0.624,0.049>,\r\n<-0.804,-0.595,0.028>,\r\n<-0.793,-0.609,-0.007>,\r\n<-0.776,-0.631,-0.026>,\r\n<-0.765,-0.643,0>,\r\n<-0.778,-0.629,-0.003>,\r\n<-0.790,-0.613,-0.006>,\r\n<-0.803,-0.596,-0.021>,\r\n<-0.722,-0.612,0.323>,\r\n<-0.517,-0.345,0.784>,\r\n<-0.146,-0.004,0.989>,\r\n<0.014,0.006,1>,\r\n<0.004,0.001,1>,\r\n<0.002,0.001,1>,\r\nZS(34)\r\n<0,-0.001,1>,\r\n<0.003,-0.001,1>,\r\n<0.013,-0.006,1>,\r\n<-0.128,0,0.992>,\r\n<-0.506,0.336,0.794>,\r\n<-0.720,0.606,0.338>,\r\n<-0.803,0.595,-0.022>,\r\n<-0.791,0.612,-0.006>,\r\n<-0.779,0.627,-0.003>,\r\n<-0.767,0.642,0>,\r\n<-0.779,0.627,-0.021>,\r\n<-0.797,0.604,0>,\r\n<-0.807,0.590,0.036>,\r\n<-0.779,0.624,0.059>,\r\n<-0.716,0.695,0.065>,\r\n<-0.620,0.783,0.059>,\r\n<-0.506,0.862,0.039>,\r\n<-0.401,0.916,0.013>,\r\n<-0.360,0.933,-0.009>,\r\n<-0.421,0.907,-0.024>,\r\n<-0.550,0.835,-0.031>,\r\n<-0.697,0.716,-0.031>,\r\n<-0.825,0.564,-0.027>,\r\n<-0.918,0.396,-0.026>,\r\n<-0.965,0.260,-0.020>,\r\n<-0.956,0.292,-0.027>,\r\n<-0.897,0.441,-0.013>,\r\n<-0.830,0.553,0.073>\r\n<-0.576,-0.808,0.127>,\r\n<-0.707,-0.706,0.037>,\r\n<-0.833,-0.554,0.011>,\r\n<-0.924,-0.382,-0.003>,\r\n<-0.948,-0.319,-0.010>,\r\n<-0.909,-0.416,-0.020>,\r\n<-0.817,-0.577,-0.029>,\r\n<-0.693,-0.720,-0.035>,\r\n<-0.560,-0.828,-0.036>,\r\n<-0.460,-0.888,-0.028>,\r\n<-0.432,-0.902,-0.008>,\r\n<-0.481,-0.876,0.018>,\r\n<-0.568,-0.822,0.044>,\r\n<-0.653,-0.755,0.059>,\r\n<-0.718,-0.694,0.059>,\r\n<-0.757,-0.652,0.043>,\r\n<-0.770,-0.637,0.024>,\r\n<-0.754,-0.656,0.014>,\r\n<-0.754,-0.657,-0.003>,\r\n<-0.703,-0.706,0.086>,\r\n<-0.771,-0.637,-0.013>,\r\n<-0.680,-0.569,0.462>,\r\n<-0.403,-0.264,0.876>,\r\n<-0.021,0.020,1>,\r\n<0.007,0.004,1>,\r\n<0.002,0.001,1>,\r\n<0.001,0,1>,\r\nZS(36)\r\n<0.001,0,1>,\r\n<0.002,-0.001,1>,\r\n<0.007,-0.004,1>,\r\n<-0.015,-0.020,1>,\r\n<-0.394,0.256,0.883>,\r\n<-0.676,0.565,0.473>,\r\n<-0.770,0.637,-0.010>,\r\n<-0.700,0.709,0.091>,\r\n<-0.755,0.655,-0.003>,\r\n<-0.758,0.652,0.017>,\r\n<-0.773,0.634,0.032>,\r\n<-0.757,0.651,0.050>,\r\n<-0.713,0.698,0.064>,\r\n<-0.640,0.766,0.060>,\r\n<-0.549,0.835,0.043>,\r\n<-0.462,0.887,0.016>,\r\n<-0.418,0.908,-0.012>,\r\n<-0.459,0.888,-0.033>,\r\n<-0.570,0.821,-0.041>,\r\n<-0.704,0.709,-0.039>,\r\n<-0.826,0.562,-0.034>,\r\n<-0.918,0.397,-0.025>,\r\n<-0.960,0.281,-0.012>,\r\n<-0.945,0.328,-0.005>,\r\n<-0.865,0.501,0.008>,\r\n<-0.755,0.655,0.037>,\r\n<-0.632,0.763,0.136>\r\n<-0.270,-0.947,0.174>,\r\n<-0.451,-0.889,0.082>,\r\n<-0.646,-0.762,0.051>,\r\n<-0.801,-0.598,0.030>,\r\n<-0.901,-0.433,0.011>,\r\n<-0.935,-0.354,-0.001>,\r\n<-0.901,-0.434,-0.018>,\r\n<-0.810,-0.586,-0.034>,\r\n<-0.694,-0.719,-0.044>,\r\n<-0.580,-0.813,-0.046>,\r\n<-0.507,-0.861,-0.035>,\r\n<-0.497,-0.867,-0.012>,\r\n<-0.542,-0.840,0.019>,\r\n<-0.606,-0.794,0.042>,\r\n<-0.667,-0.744,0.049>,\r\n<-0.712,-0.701,0.047>,\r\n<-0.732,-0.680,0.047>,\r\n<-0.743,-0.669,0.013>,\r\n<-0.806,-0.586,0.077>,\r\n<-0.740,-0.673,0.019>,\r\n<-0.594,-0.627,0.504>,\r\n<-0.307,-0.183,0.934>,\r\n<0.019,0.014,1>,\r\n<0.005,0.004,1>,\r\n<0.002,0.002,1>,\r\nZS(40)\r\n<0.002,-0.002,1>,\r\n<0.005,-0.004,1>,\r\n<0.019,-0.014,1>,\r\n<-0.299,0.171,0.939>,\r\n<-0.586,0.630,0.509>,\r\n<-0.737,0.675,0.030>,\r\n<-0.813,0.576,0.084>,\r\n<-0.745,0.667,0.013>,\r\n<-0.733,0.678,0.051>,\r\n<-0.711,0.701,0.054>,\r\n<-0.662,0.748,0.054>,\r\n<-0.595,0.802,0.041>,\r\n<-0.529,0.849,0.014>,\r\n<-0.489,0.872,-0.018>,\r\n<-0.507,0.861,-0.042>,\r\n<-0.590,0.806,-0.051>,\r\n<-0.707,0.706,-0.048>,\r\n<-0.820,0.571,-0.037>,\r\n<-0.909,0.416,-0.021>,\r\n<-0.947,0.321,-0.002>,\r\n<-0.923,0.385,0.013>,\r\n<-0.834,0.550,0.031>,\r\n<-0.695,0.718,0.049>,\r\n<-0.511,0.856,0.080>,\r\n<-0.330,0.927,0.179>\r\n<0.054,-0.980,0.192>,\r\n<-0.135,-0.984,0.112>,\r\n<-0.365,-0.927,0.088>,\r\n<-0.590,-0.804,0.065>,\r\n<-0.762,-0.646,0.043>,\r\n<-0.873,-0.487,0.025>,\r\n<-0.913,-0.407,0.008>,\r\n<-0.881,-0.472,-0.014>,\r\n<-0.794,-0.607,-0.036>,\r\n<-0.688,-0.723,-0.051>,\r\n<-0.601,-0.798,-0.054>,\r\n<-0.557,-0.830,-0.037>,\r\n<-0.561,-0.828,-0.008>,\r\n<-0.602,-0.798,0.010>,\r\n<-0.637,-0.770,0.036>,\r\n<-0.683,-0.729,0.053>,\r\n<-0.708,-0.705,0.031>,\r\n<-0.719,-0.695,-0.010>,\r\n<-0.721,-0.691,0.050>,\r\n<-0.662,-0.494,0.564>,\r\n<-0.211,-0.127,0.969>,\r\n<0.016,0.011,1>,\r\n<0.004,0.003,1>,\r\n<0.002,0.002,1>,\r\nZS(42)\r\n<0.002,-0.002,1>,\r\n<0.004,-0.003,1>,\r\n<0.016,-0.011,1>,\r\n<-0.199,0.109,0.974>,\r\n<-0.665,0.477,0.574>,\r\n<-0.719,0.692,0.070>,\r\n<-0.720,0.694,-0.010>,\r\n<-0.709,0.704,0.031>,\r\n<-0.683,0.729,0.054>,\r\n<-0.635,0.772,0.037>,\r\n<-0.598,0.802,0.006>,\r\n<-0.557,0.830,-0.014>,\r\n<-0.558,0.829,-0.044>,\r\n<-0.607,0.792,-0.061>,\r\n<-0.700,0.712,-0.055>,\r\n<-0.805,0.592,-0.038>,\r\n<-0.890,0.456,-0.014>,\r\n<-0.924,0.383,0.011>,\r\n<-0.891,0.453,0.029>,\r\n<-0.794,0.606,0.050>,\r\n<-0.640,0.765,0.070>,\r\n<-0.426,0.901,0.088>,\r\n<-0.194,0.975,0.109>,\r\n<0,0.981,0.194>\r\n<0.326,-0.929,0.176>,\r\n<0.169,-0.977,0.128>,\r\n<-0.056,-0.993,0.103>,\r\n<-0.293,-0.952,0.086>,\r\n<-0.534,-0.843,0.072>,\r\n<-0.720,-0.691,0.061>,\r\n<-0.836,-0.547,0.042>,\r\n<-0.879,-0.477,0.022>,\r\n<-0.847,-0.531,-0.004>,\r\n<-0.764,-0.644,-0.035>,\r\n<-0.677,-0.734,-0.051>,\r\n<-0.618,-0.784,-0.045>,\r\n<-0.614,-0.788,-0.053>,\r\n<-0.624,-0.781,-0.012>,\r\n<-0.649,-0.760,0.020>,\r\n<-0.665,-0.747,0.015>,\r\n<-0.694,-0.720,-0.010>,\r\n<-0.706,-0.706,0.061>,\r\n<-0.548,-0.527,0.650>,\r\n<-0.143,-0.108,0.984>,\r\n<0.012,0.010,1>,\r\n<0.003,0.002,1>,\r\n<0.002,0,1>,\r\nZS(44)\r\n<0.002,0,1>,\r\n<0.003,-0.002,1>,\r\n<0.012,-0.010,1>,\r\n<-0.125,0.087,0.988>,\r\n<-0.534,0.511,0.674>,\r\n<-0.704,0.705,0.087>,\r\n<-0.695,0.719,-0.010>,\r\n<-0.667,0.745,0.015>,\r\n<-0.651,0.759,0.020>,\r\n<-0.624,0.781,-0.019>,\r\n<-0.615,0.786,-0.065>,\r\n<-0.620,0.783,-0.050>,\r\n<-0.683,0.728,-0.055>,\r\n<-0.774,0.632,-0.036>,\r\n<-0.855,0.518,-0.003>,\r\n<-0.887,0.461,0.024>,\r\n<-0.849,0.526,0.049>,\r\n<-0.746,0.663,0.071>,\r\n<-0.578,0.811,0.088>,\r\n<-0.352,0.931,0.097>,\r\n<-0.109,0.988,0.109>,\r\n<0.115,0.986,0.119>,\r\n<0.290,0.940,0.181>\r\n<0.367,-0.929,0.044>,\r\n<0.363,-0.928,0.086>,\r\n<0.246,-0.962,0.118>,\r\n<0.004,-0.995,0.099>,\r\n<-0.239,-0.967,0.087>,\r\n<-0.480,-0.873,0.086>,\r\n<-0.671,-0.737,0.083>,\r\n<-0.788,-0.612,0.067>,\r\n<-0.828,-0.560,0.040>,\r\n<-0.794,-0.608,0.007>,\r\n<-0.722,-0.692,-0.021>,\r\n<-0.641,-0.765,-0.053>,\r\n<-0.629,-0.776,-0.050>,\r\n<-0.642,-0.767,0>,\r\n<-0.655,-0.755,-0.003>,\r\n<-0.574,-0.814,0.086>,\r\n<-0.690,-0.722,0.049>,\r\n<-0.527,-0.549,0.649>,\r\n<-0.113,-0.115,0.987>,\r\n<0.010,0.010,1>,\r\n<0.002,0.003,1>,\r\n<0,0.001,1>,\r\nZS(46)\r\n<0,-0.001,1>,\r\n<0.002,-0.002,1>,\r\n<0.009,-0.009,1>,\r\n<-0.092,0.089,0.992>,\r\n<-0.509,0.529,0.678>,\r\n<-0.690,0.720,0.077>,\r\n<-0.581,0.810,0.081>,\r\n<-0.657,0.754,-0.003>,\r\n<-0.644,0.765,0>,\r\n<-0.630,0.774,-0.060>,\r\n<-0.640,0.766,-0.060>,\r\n<-0.729,0.685,-0.023>,\r\n<-0.802,0.597,0.008>,\r\n<-0.835,0.549,0.042>,\r\n<-0.798,0.598,0.070>,\r\n<-0.692,0.717,0.089>,\r\n<-0.517,0.850,0.096>,\r\n<-0.289,0.952,0.101>,\r\n<-0.051,0.993,0.104>,\r\n<0.190,0.974,0.124>,\r\n<0.358,0.928,0.102>,\r\n<0.406,0.912,0.064>\r\n<0.021,-1,-0.019>,\r\n<0.170,-0.983,0.064>,\r\n<0.308,-0.950,0.052>,\r\n<0.272,-0.961,0.055>,\r\n<0.050,-0.995,0.089>,\r\n<-0.206,-0.974,0.091>,\r\n<-0.437,-0.894,0.100>,\r\n<-0.620,-0.778,0.103>,\r\n<-0.730,-0.677,0.089>,\r\n<-0.759,-0.648,0.060>,\r\n<-0.726,-0.687,0.027>,\r\n<-0.668,-0.744,-0.014>,\r\n<-0.611,-0.791,-0.004>,\r\n<-0.627,-0.779,-0.003>,\r\n<-0.713,-0.694,0.099>,\r\n<-0.671,-0.741,0.017>,\r\n<-0.486,-0.677,0.552>,\r\n<-0.108,-0.145,0.984>,\r\n<0.010,0.010,1>,\r\n<0.003,0.003,1>,\r\n<0.001,0.001,1>,\r\nZS(48)\r\n<0.001,-0.001,1>,\r\n<0.002,-0.002,1>,\r\n<0.009,-0.009,1>,\r\n<-0.084,0.113,0.990>,\r\n<-0.472,0.660,0.585>,\r\n<-0.678,0.734,0.039>,\r\n<-0.711,0.698,0.092>,\r\n<-0.629,0.777,-0.002>,\r\n<-0.609,0.793,-0.009>,\r\n<-0.670,0.742,-0.021>,\r\n<-0.735,0.677,0.026>,\r\n<-0.767,0.638,0.060>,\r\n<-0.741,0.666,0.089>,\r\n<-0.640,0.761,0.106>,\r\n<-0.470,0.876,0.107>,\r\n<-0.252,0.963,0.099>,\r\n<-0.019,0.995,0.095>,\r\n<0.230,0.970,0.075>,\r\n<0.337,0.940,0.054>,\r\n<0.275,0.959,0.072>,\r\n<0.144,0.989,0.020>\r\n<-0.373,-0.916,-0.148>,\r\n<-0.216,-0.975,-0.047>,\r\n<-0.028,-1,-0.002>,\r\n<0.181,-0.983,0.017>,\r\n<0.219,-0.976,0.020>,\r\n<0.059,-0.996,0.064>,\r\n<-0.198,-0.976,0.091>,\r\n<-0.414,-0.904,0.110>,\r\n<-0.576,-0.809,0.118>,\r\n<-0.665,-0.740,0.105>,\r\n<-0.683,-0.727,0.067>,\r\n<-0.651,-0.758,0.041>,\r\n<-0.615,-0.789,0.018>,\r\n<-0.612,-0.791,-0.006>,\r\n<-0.635,-0.773,-0.013>,\r\n<-0.643,-0.588,0.491>,\r\n<-0.127,-0.214,0.969>,\r\n<0.010,0.012,1>,\r\n<0.003,0.002,1>,\r\n<0.001,0.001,1>,\r\nZS(50)\r\n<0.001,-0.001,1>,\r\n<0.002,-0.002,1>,\r\n<0.009,-0.012,1>,\r\n<-0.099,0.187,0.977>,\r\n<-0.627,0.588,0.511>,\r\n<-0.642,0.767,-0.005>,\r\n<-0.613,0.790,-0.007>,\r\n<-0.615,0.788,0.017>,\r\n<-0.658,0.752,0.036>,\r\n<-0.693,0.718,0.064>,\r\n<-0.676,0.729,0.104>,\r\n<-0.595,0.795,0.120>,\r\n<-0.444,0.889,0.115>,\r\n<-0.245,0.964,0.099>,\r\n<-0.015,0.997,0.079>,\r\n<0.195,0.980,0.034>,\r\n<0.242,0.970,0.012>,\r\n<0.097,0.995,0.008>,\r\n<-0.075,0.997,-0.019>,\r\n<-0.227,0.969,-0.098>\r\n<-0.743,-0.635,-0.210>,\r\n<-0.606,-0.786,-0.121>,\r\n<-0.418,-0.905,-0.083>,\r\n<-0.206,-0.977,-0.057>,\r\n<0.011,-1,-0.019>,\r\n<0.112,-0.994,-0.003>,\r\n<-0.003,-1,0.029>,\r\n<-0.231,-0.970,0.081>,\r\n<-0.417,-0.902,0.112>,\r\n<-0.544,-0.832,0.114>,\r\n<-0.616,-0.782,0.099>,\r\n<-0.601,-0.795,0.083>,\r\n<-0.597,-0.802,0.014>,\r\n<-0.595,-0.804,-0.021>,\r\n<-0.570,-0.681,0.459>,\r\n<-0.184,-0.309,0.933>,\r\n<0.011,0.016,1>,\r\n<0.002,0.003,1>,\r\n<0.001,0,1>,\r\nZS(52)\r\n<0.001,0,1>,\r\n<0.002,-0.003,1>,\r\n<0.010,-0.016,1>,\r\n<-0.160,0.291,0.943>,\r\n<-0.574,0.666,0.475>,\r\n<-0.597,0.802,-0.021>,\r\n<-0.598,0.801,0.014>,\r\n<-0.606,0.791,0.086>,\r\n<-0.624,0.774,0.103>,\r\n<-0.557,0.823,0.116>,\r\n<-0.440,0.890,0.118>,\r\n<-0.270,0.959,0.092>,\r\n<-0.057,0.997,0.054>,\r\n<0.107,0.994,0.009>,\r\n<0.096,0.995,-0.011>,\r\n<-0.073,0.997,-0.037>,\r\n<-0.264,0.962,-0.075>,\r\n<-0.458,0.883,-0.103>,\r\n<-0.619,0.765,-0.175>\r\n<-0.933,-0.282,-0.224>,\r\n<-0.871,-0.465,-0.157>,\r\n<-0.747,-0.652,-0.127>,\r\n<-0.579,-0.808,-0.107>,\r\n<-0.375,-0.923,-0.090>,\r\n<-0.169,-0.982,-0.080>,\r\n<-0.053,-0.997,-0.049>,\r\n<-0.136,-0.991,0.004>,\r\n<-0.320,-0.946,0.054>,\r\n<-0.446,-0.891,0.084>,\r\n<-0.523,-0.843,0.124>,\r\n<-0.574,-0.816,0.065>,\r\n<-0.565,-0.825,-0.015>,\r\n<-0.611,-0.724,0.320>,\r\n<-0.267,-0.405,0.875>,\r\n<0.014,0.018,1>,\r\n<0.002,0.004,1>,\r\n<0,0.002,1>,\r\nZS(54)\r\n<0,-0.002,1>,\r\n<0.003,-0.004,1>,\r\n<0.014,-0.019,1>,\r\n<-0.249,0.392,0.885>,\r\n<-0.605,0.718,0.344>,\r\n<-0.567,0.824,-0.016>,\r\n<-0.578,0.813,0.069>,\r\n<-0.531,0.837,0.132>,\r\n<-0.456,0.885,0.095>,\r\n<-0.324,0.943,0.081>,\r\n<-0.159,0.987,0.025>,\r\n<-0.037,0.999,-0.028>,\r\n<-0.073,0.996,-0.052>,\r\n<-0.237,0.968,-0.080>,\r\n<-0.428,0.898,-0.101>,\r\n<-0.622,0.774,-0.120>,\r\n<-0.777,0.614,-0.139>,\r\n<-0.873,0.446,-0.199>\r\n<-0.982,-0.171,-0.077>,\r\n<-0.973,-0.204,-0.109>,\r\n<-0.936,-0.316,-0.152>,\r\n<-0.840,-0.522,-0.145>,\r\n<-0.685,-0.717,-0.126>,\r\n<-0.508,-0.852,-0.127>,\r\n<-0.333,-0.936,-0.114>,\r\n<-0.232,-0.969,-0.080>,\r\n<-0.350,-0.935,-0.058>,\r\n<-0.441,-0.896,0.053>,\r\n<-0.490,-0.870,0.061>,\r\n<-0.538,-0.843,-0.008>,\r\n<-0.611,-0.777,0.153>,\r\n<-0.346,-0.518,0.783>,\r\n<0.020,-0.022,1>,\r\n<0.004,0.005,1>,\r\n<0.002,0.002,1>,\r\nZS(56)\r\n<0.002,-0.002,1>,\r\n<0.004,-0.005,1>,\r\n<0.020,0.013,1>,\r\n<-0.335,0.504,0.796>,\r\n<-0.616,0.769,0.169>,\r\n<-0.545,0.839,-0.005>,\r\n<-0.492,0.867,0.072>,\r\n<-0.430,0.901,0.056>,\r\n<-0.345,0.938,-0.032>,\r\n<-0.217,0.975,-0.047>,\r\n<-0.250,0.963,-0.100>,\r\n<-0.385,0.915,-0.121>,\r\n<-0.558,0.821,-0.117>,\r\n<-0.728,0.675,-0.120>,\r\n<-0.862,0.484,-0.148>,\r\n<-0.944,0.291,-0.155>,\r\n<-0.970,0.188,-0.152>\r\n<-0.838,-0.544,-0.030>,\r\n<-0.904,-0.419,-0.089>,\r\n<-0.949,-0.309,-0.067>,\r\n<-0.952,-0.304,-0.042>,\r\n<-0.885,-0.456,-0.096>,\r\n<-0.740,-0.660,-0.131>,\r\n<-0.585,-0.801,-0.130>,\r\n<-0.461,-0.865,-0.199>,\r\n<-0.411,-0.905,-0.106>,\r\n<-0.475,-0.880,0.016>,\r\n<-0.509,-0.861,-0.003>,\r\n<-0.552,-0.834,0.026>,\r\n<-0.424,-0.643,0.638>,\r\n<-0.005,-0.146,0.989>,\r\n<0.004,0.007,1>,\r\n<0.002,0.002,1>,\r\nZS(58)\r\n<0.002,-0.002,1>,\r\n<0.004,-0.007,1>,\r\n<0,0.132,0.991>,\r\n<-0.415,0.636,0.651>,\r\n<-0.560,0.828,0.030>,\r\n<-0.505,0.863,-0.002>,\r\n<-0.468,0.884,0.021>,\r\n<-0.413,0.905,-0.103>,\r\n<-0.429,0.881,-0.201>,\r\n<-0.493,0.860,-0.134>,\r\n<-0.633,0.762,-0.136>,\r\n<-0.786,0.606,-0.124>,\r\n<-0.910,0.403,-0.100>,\r\n<-0.960,0.274,-0.060>,\r\n<-0.963,0.260,-0.074>,\r\n<-0.943,0.325,-0.075>\r\n<-0.454,-0.883,0.122>,\r\n<-0.597,-0.799,0.066>,\r\n<-0.724,-0.689,0.033>,\r\n<-0.836,-0.548,0.001>,\r\n<-0.888,-0.459,0>,\r\n<-0.851,-0.524,-0.022>,\r\n<-0.691,-0.714,-0.116>,\r\n<-0.556,-0.823,-0.113>,\r\n<-0.467,-0.884,-0.002>,\r\n<-0.481,-0.876,-0.003>,\r\n<-0.309,-0.945,0.104>,\r\n<-0.513,-0.737,0.439>,\r\n<-0.089,-0.329,0.940>,\r\n<0.006,0.009,1>,\r\n<0.001,0.002,1>,\r\nZS(60)\r\n<0.001,-0.002,1>,\r\n<0.005,-0.016,1>,\r\n<-0.081,0.320,0.944>,\r\n<-0.516,0.728,0.452>,\r\n<-0.392,0.919,0.049>,\r\n<-0.489,0.872,-0.008>,\r\n<-0.471,0.882,-0.002>,\r\n<-0.512,0.846,-0.148>,\r\n<-0.593,0.787,-0.172>,\r\n<-0.785,0.613,-0.087>,\r\n<-0.893,0.450,-0.023>,\r\n<-0.916,0.402,-0.008>,\r\n<-0.872,0.490,-0.018>,\r\n<-0.788,0.616,0.023>,\r\n<-0.708,0.702,0.077>\r\n<0.091,-0.979,0.181>,\r\n<-0.099,-0.984,0.148>,\r\n<-0.310,-0.941,0.135>,\r\n<-0.489,-0.865,0.116>,\r\n<-0.630,-0.770,0.104>,\r\n<-0.733,-0.673,0.096>,\r\n<-0.724,-0.686,0.074>,\r\n<-0.562,-0.826,0.050>,\r\n<-0.458,-0.889,0.014>,\r\n<-0.534,-0.836,0.130>,\r\n<-0.562,-0.803,0.201>,\r\n<-0.248,-0.505,0.827>,\r\n<0.011,-0.003,1>,\r\n<0.002,0,1>,\r\n<0,0.001,1>,\r\nZS(60)\r\n<0,-0.001,1>,\r\n<0.001,-0.007,1>,\r\n<0.014,-0.004,1>,\r\n<-0.199,0.638,0.744>,\r\n<-0.560,0.802,0.209>,\r\n<-0.538,0.833,0.128>,\r\n<-0.455,0.891,-0.015>,\r\n<-0.483,0.876,0.007>,\r\n<-0.704,0.710,-0.008>,\r\n<-0.804,0.593,0.038>,\r\n<-0.801,0.597,0.049>,\r\n<-0.700,0.710,0.077>,\r\n<-0.566,0.819,0.093>,\r\n<-0.413,0.901,0.133>,\r\n<-0.256,0.943,0.213>\r\n<0.474,-0.861,0.183>,\r\n<0.387,-0.902,0.190>,\r\n<0.200,-0.962,0.187>,\r\n<-0.047,-0.985,0.163>,\r\n<-0.259,-0.952,0.166>,\r\n<-0.421,-0.891,0.171>,\r\n<-0.540,-0.825,0.167>,\r\n<-0.536,-0.829,0.160>,\r\n<-0.467,-0.882,0.068>,\r\n<-0.315,-0.945,0.092>,\r\n<-0.455,-0.677,0.579>,\r\n<0.013,-0.176,0.984>,\r\n<0,0.005,1>,\r\n<0.001,0,1>,\r\nZS(62)\r\n<0.001,-0.003,1>,\r\n<0.007,-0.006,1>,\r\n<0.020,0.174,0.984>,\r\n<-0.594,0.629,0.501>,\r\n<-0.388,0.919,0.073>,\r\n<-0.441,0.897,0.019>,\r\n<-0.537,0.835,0.121>,\r\n<-0.649,0.747,0.144>,\r\n<-0.609,0.779,0.146>,\r\n<-0.491,0.859,0.145>,\r\n<-0.323,0.936,0.138>,\r\n<-0.128,0.982,0.140>,\r\n<0.054,0.985,0.162>,\r\n<0.244,0.942,0.231>\r\n<0.369,-0.921,0.125>,\r\n<0.411,-0.905,0.111>,\r\n<0.402,-0.914,0.052>,\r\n<0.301,-0.951,0.076>,\r\n<0.103,-0.983,0.154>,\r\n<-0.104,-0.977,0.187>,\r\n<-0.307,-0.929,0.205>,\r\n<-0.391,-0.904,0.176>,\r\n<-0.510,-0.832,0.219>,\r\n<-0.513,-0.805,0.299>,\r\n<-0.108,-0.443,0.890>,\r\n<0.005,0.016,1>,\r\n<0,0.002,1>,\r\nZS(64)\r\n<0.002,0,1>,\r\n<0.003,-0.014,1>,\r\n<-0.070,0.602,0.795>,\r\n<-0.511,0.804,0.303>,\r\n<-0.462,0.881,0.105>,\r\n<-0.473,0.864,0.172>,\r\n<-0.442,0.869,0.223>,\r\n<-0.290,0.937,0.195>,\r\n<-0.111,0.977,0.184>,\r\n<0.099,0.978,0.181>,\r\n<0.285,0.944,0.165>,\r\n<0.409,0.903,0.131>,\r\n<0.494,0.860,0.127>\r\n<-0.176,-0.983,-0.055>,\r\n<-0.082,-0.996,-0.034>,\r\n<0.028,-1,-0.023>,\r\n<0.130,-0.992,0.002>,\r\n<0.116,-0.993,0.016>,\r\n<-0.091,-0.996,-0.014>,\r\n<-0.212,-0.975,0.072>,\r\n<-0.349,-0.934,0.076>,\r\n<-0.414,-0.909,0.047>,\r\n<-0.479,-0.661,0.578>,\r\n<0.025,-0.146,0.989>,\r\n<0.002,0.002,1>,\r\nZS(65)\r\n<0,-0.002,1>,\r\n<-0.001,-0.006,1>,\r\n<0.017,0.134,0.991>,\r\n<-0.448,0.653,0.610>,\r\n<-0.424,0.904,0.062>,\r\n<-0.385,0.914,0.128>,\r\n<-0.247,0.950,0.191>,\r\n<-0.078,0.989,0.126>,\r\n<0.123,0.988,0.098>,\r\n<0.257,0.965,0.060>,\r\n<0.315,0.947,0.064>,\r\n<0.316,0.945,0.077>,\r\n<0.268,0.961,0.061>\r\n<-0.688,-0.706,-0.169>,\r\n<-0.574,-0.808,-0.135>,\r\n<-0.455,-0.882,-0.126>,\r\n<-0.346,-0.930,-0.124>,\r\n<-0.284,-0.930,-0.233>,\r\n<-0.252,-0.957,-0.144>,\r\n<-0.293,-0.956,0.024>,\r\n<-0.349,-0.937,-0.001>,\r\n<-0.468,-0.840,0.275>,\r\n<-0.090,-0.454,0.887>,\r\n<0.002,0.009,1>,\r\nZS(66)\r\n<0,-0.002,1>,\r\n<0.002,-0.004,1>,\r\n<0.006,-0.011,1>,\r\n<-0.076,0.451,0.889>,\r\n<-0.467,0.834,0.294>,\r\n<-0.348,0.937,0.011>,\r\n<-0.233,0.971,0.050>,\r\n<-0.154,0.987,-0.033>,\r\n<-0.133,0.986,-0.097>,\r\n<-0.014,1,-0.033>,\r\n<-0.076,0.995,-0.066>,\r\n<-0.159,0.984,-0.074>,\r\n<-0.264,0.960,-0.090>\r\n<-0.900,-0.422,-0.110>,\r\n<-0.859,-0.495,-0.128>,\r\n<-0.785,-0.600,-0.155>,\r\n<-0.639,-0.734,-0.231>,\r\n<-0.498,-0.848,-0.181>,\r\n<-0.329,-0.944,-0.004>,\r\n<-0.327,-0.945,0>,\r\n<-0.346,-0.938,0.017>,\r\n<-0.359,-0.742,0.566>,\r\n<0.019,-0.208,0.978>,\r\n<0,0.004,1>,\r\nZS(67)\r\n<0.002,0,1>,\r\n<0.003,-0.004,1>,\r\n<0.022,0.198,0.980>,\r\n<-0.350,0.736,0.579>,\r\n<-0.349,0.937,0.021>,\r\n<-0.319,0.948,0.004>,\r\n<-0.321,0.947,0>,\r\n<-0.318,0.923,-0.214>,\r\n<-0.301,0.921,-0.248>,\r\n<-0.464,0.877,-0.126>,\r\n<-0.590,0.797,-0.129>,\r\n<-0.701,0.698,-0.148>\r\n<-0.731,-0.681,-0.036>,\r\n<-0.767,-0.640,-0.043>,\r\n<-0.768,-0.640,-0.007>,\r\n<-0.730,-0.682,0.039>,\r\n<-0.565,-0.822,0.072>,\r\n<-0.417,-0.908,0.030>,\r\n<-0.309,-0.951,0.009>,\r\n<-0.385,-0.905,0.182>,\r\n<-0.135,-0.570,0.810>,\r\n<0.005,-0.024,1>,\r\n<0,0.001,1>,\r\nZS(69)\r\n<0.004,0.019,1>,\r\n<-0.126,0.559,0.820>,\r\n<-0.392,0.900,0.193>,\r\n<-0.307,0.952,-0.002>,\r\n<-0.299,0.954,0>,\r\n<-0.321,0.944,-0.082>,\r\n<-0.589,0.790,-0.172>,\r\n<-0.753,0.646,-0.122>,\r\n<-0.842,0.529,-0.102>,\r\n<-0.886,0.454,-0.095>\r\n<-0.163,-0.978,0.129>,\r\n<-0.244,-0.962,0.126>,\r\n<-0.324,-0.935,0.145>,\r\n<-0.398,-0.904,0.158>,\r\n<-0.454,-0.873,0.181>,\r\n<-0.397,-0.897,0.197>,\r\n<-0.312,-0.946,0.086>,\r\n<-0.376,-0.834,0.405>,\r\n<0.004,-0.363,0.932>,\r\n<0,0.006,1>,\r\nZS(70)\r\n<0,-0.005,1>,\r\n<0.008,0.346,0.938>,\r\n<-0.375,0.826,0.422>,\r\n<-0.283,0.959,-0.007>,\r\n<-0.356,0.934,0.031>,\r\n<-0.546,0.836,0.063>,\r\n<-0.716,0.694,0.072>,\r\n<-0.775,0.630,0.047>,\r\n<-0.780,0.626,-0.006>,\r\n<-0.766,0.643,-0.014>\r\n<0.434,-0.879,0.196>,\r\n<0.345,-0.918,0.194>,\r\n<0.215,-0.955,0.205>,\r\n<0.073,-0.974,0.213>,\r\n<-0.097,-0.965,0.245>,\r\n<-0.207,-0.955,0.211>,\r\n<-0.292,-0.951,0.100>,\r\n<-0.262,-0.735,0.625>,\r\n<0.012,-0.164,0.986>,\r\n<0,0.002,1>,\r\nZS(70)\r\n<0,-0.001,1>,\r\n<0.011,0.146,0.989>,\r\n<-0.249,0.721,0.646>,\r\n<-0.297,0.949,0.109>,\r\n<-0.375,0.904,0.205>,\r\n<-0.493,0.841,0.222>,\r\n<-0.466,0.869,0.168>,\r\n<-0.389,0.908,0.154>,\r\n<-0.317,0.938,0.138>,\r\n<-0.242,0.959,0.149>\r\n<0.391,-0.915,0.099>,\r\n<0.360,-0.929,0.080>,\r\n<0.291,-0.955,0.062>,\r\n<0.079,-0.997,0.021>,\r\n<-0.026,-0.998,0.062>,\r\n<-0.177,-0.983,0.051>,\r\n<-0.289,-0.941,0.178>,\r\n<-0.100,-0.594,0.798>,\r\n<0.002,-0.033,1>,\r\nZS(72)\r\n<0.002,0.024,1>,\r\n<-0.087,0.574,0.814>,\r\n<-0.306,0.920,0.246>,\r\n<-0.225,0.946,0.231>,\r\n<-0.151,0.946,0.287>,\r\n<0.016,0.973,0.232>,\r\n<0.163,0.963,0.216>,\r\n<0.298,0.934,0.197>,\r\n<0.397,0.897,0.197>\r\n<-0.218,-0.974,-0.054>,\r\n<-0.177,-0.982,-0.059>,\r\n<-0.154,-0.972,-0.180>,\r\n<-0.146,-0.980,-0.136>,\r\n<-0.164,-0.986,0.010>,\r\n<-0.207,-0.978,-0.004>,\r\n<-0.292,-0.893,0.343>,\r\n<-0.002,-0.441,0.898>,\r\n<0,0.007,1>,\r\nZS(72)\r\n<0,-0.007,1>,\r\n<0.002,0.420,0.907>,\r\n<-0.294,0.884,0.364>,\r\n<-0.175,0.979,0.108>,\r\n<0.009,0.989,0.146>,\r\n<0.149,0.987,0.058>,\r\n<0.245,0.968,0.057>,\r\n<0.406,0.910,0.086>,\r\n<0.455,0.884,0.104>\r\n<-0.721,-0.683,-0.114>,\r\n<-0.636,-0.758,-0.148>,\r\n<-0.524,-0.841,-0.132>,\r\n<-0.310,-0.950,-0.031>,\r\n<-0.205,-0.979,-0.006>,\r\n<-0.192,-0.981,-0.003>,\r\n<-0.250,-0.835,0.491>,\r\n<0.016,-0.297,0.955>,\r\n<0,0.003,1>,\r\nZS(72)\r\n<0,-0.003,1>,\r\n<0.015,0.277,0.961>,\r\n<-0.245,0.824,0.510>,\r\n<-0.185,0.983,0.004>,\r\n<-0.075,0.997,0.023>,\r\n<-0.072,0.997,0.022>,\r\n<-0.052,0.995,-0.089>,\r\n<-0.040,0.994,-0.105>,\r\n<-0.088,0.996,-0.016>\r\n<-0.697,-0.717,0.022>,\r\n<-0.651,-0.757,0.057>,\r\n<-0.535,-0.838,0.111>,\r\n<-0.431,-0.890,0.146>,\r\n<-0.254,-0.961,0.107>,\r\n<-0.177,-0.982,0.066>,\r\n<-0.171,-0.758,0.630>,\r\n<0.008,-0.173,0.985>,\r\nZS(74)\r\n<0.007,0.155,0.988>,\r\n<-0.160,0.748,0.643>,\r\n<-0.173,0.983,0.054>,\r\n<-0.158,0.987,0>,\r\n<-0.275,0.961,-0.024>,\r\n<-0.368,0.927,-0.071>,\r\n<-0.563,0.820,-0.099>,\r\n<-0.642,0.763,-0.078>\r\n<-0.112,-0.982,0.149>,\r\n<-0.147,-0.975,0.169>,\r\n<-0.171,-0.964,0.204>,\r\n<-0.200,-0.943,0.264>,\r\n<-0.140,-0.961,0.236>,\r\n<-0.158,-0.970,0.186>,\r\n<-0.092,-0.674,0.733>,\r\n<0.003,-0.082,0.997>,\r\nZS(74)\r\n<0.002,0.068,0.998>,\r\n<-0.083,0.658,0.749>,\r\n<-0.161,0.978,0.135>,\r\n<-0.181,0.977,0.111>,\r\n<-0.389,0.905,0.170>,\r\n<-0.508,0.850,0.138>,\r\n<-0.614,0.784,0.088>,\r\n<-0.663,0.747,0.044>\r\n<0.471,-0.870,0.147>,\r\n<0.388,-0.905,0.173>,\r\n<0.260,-0.945,0.196>,\r\n<0.123,-0.957,0.261>,\r\n<-0.051,-0.984,0.169>,\r\n<-0.136,-0.970,0.203>,\r\n<-0.036,-0.590,0.806>,\r\n<0,-0.028,1>,\r\nZS(74)\r\n<0,0.020,1>,\r\n<-0.031,0.571,0.820>,\r\n<-0.146,0.958,0.247>,\r\n<-0.136,0.967,0.216>,\r\n<-0.175,0.937,0.301>,\r\n<-0.147,0.964,0.221>,\r\n<-0.120,0.976,0.181>,\r\n<-0.089,0.982,0.165>\r\n<0.473,-0.880,0.041>,\r\n<0.411,-0.911,0.019>,\r\n<0.190,-0.982,0.001>,\r\n<0.095,-0.995,0.013>,\r\n<-0.085,-0.996,-0.001>,\r\n<-0.115,-0.953,0.279>,\r\n<-0.005,-0.519,0.855>,\r\n<0,-0.003,1>,\r\nZS(75)\r\n<-0.005,0.503,0.864>,\r\n<-0.116,0.948,0.296>,\r\n<-0.070,0.987,0.146>,\r\n<0.132,0.961,0.243>,\r\n<0.276,0.941,0.195>,\r\n<0.424,0.889,0.170>,\r\n<0.517,0.844,0.142>\r\n<-0.061,-0.998,-0.030>,\r\n<-0.044,-0.987,-0.153>,\r\n<-0.046,-0.989,-0.137>,\r\n<-0.057,-0.998,0>,\r\n<-0.060,-0.998,-0.003>,\r\n<-0.085,-0.937,0.339>,\r\n<0.007,-0.467,0.884>,\r\n<0,0.005,1>,\r\nZS(74)\r\n<0,-0.006,1>,\r\n<0.003,0.455,0.890>,\r\n<-0.084,0.933,0.351>,\r\n<-0.062,0.998,-0.003>,\r\n<0.098,0.995,0.007>,\r\n<0.193,0.981,-0.028>,\r\n<0.357,0.934,-0.026>,\r\n<0.391,0.920,0.010>\r\n<-0.570,-0.821,-0.016>,\r\n<-0.497,-0.867,-0.039>,\r\n<-0.274,-0.961,-0.032>,\r\n<-0.172,-0.985,-0.009>,\r\n<-0.034,-1,-0.004>,\r\n<-0.053,-0.924,0.379>,\r\n<0.007,-0.432,0.902>,\r\n<0,0.006,1>,\r\nZS(74)\r\n<0,-0.006,1>,\r\n<0.002,0.426,0.905>,\r\n<-0.050,0.922,0.385>,\r\n<-0.037,1,-0.004>,\r\n<-0.161,0.987,-0.005>,\r\n<-0.248,0.966,-0.076>,\r\n<-0.346,0.936,-0.061>,\r\n<-0.385,0.922,0.023>\r\n<-0.556,-0.826,0.098>,\r\n<-0.487,-0.864,0.131>,\r\n<-0.367,-0.915,0.170>,\r\n<-0.237,-0.948,0.213>,\r\n<-0.012,-0.992,0.123>,\r\n<-0.019,-0.917,0.398>,\r\n<0.004,-0.412,0.911>,\r\n<0,0.005,1>,\r\nZS(74)\r\n<0,-0.006,1>,\r\n<0,0.413,0.911>,\r\n<-0.017,0.917,0.399>,\r\n<-0.014,0.994,0.112>,\r\n<-0.130,0.971,0.202>,\r\n<-0.225,0.963,0.146>,\r\n<-0.352,0.932,0.084>,\r\n<-0.385,0.922,0.047>\r\n<0.021,-0.987,0.158>,\r\n<0.017,-0.983,0.183>,\r\n<0.012,-0.974,0.225>,\r\n<0.013,-0.946,0.323>,\r\n<0.015,-0.979,0.201>,\r\n<0.017,-0.916,0.401>,\r\n<0.001,-0.409,0.913>,\r\n<0,0.005,1>,\r\nZS(73)\r\n<0,-0.001,1>,\r\n<0,-0.006,1>,\r\n<0,0.411,0.912>,\r\n<0.015,0.916,0.402>,\r\n<0.013,0.994,0.104>,\r\n<0.138,0.971,0.194>,\r\n<0.238,0.962,0.133>,\r\n<0.292,0.952,0.090>,\r\n<0.320,0.943,0.089>\r\n<0.612,-0.788,0.073>,\r\n<0.536,-0.838,0.102>,\r\n<0.394,-0.906,0.154>,\r\n<0.266,-0.941,0.211>,\r\n<0.042,-0.991,0.126>,\r\n<0.053,-0.921,0.386>,\r\n<-0.002,-0.424,0.906>,\r\n<0,0.006,1>,\r\nZS(74)\r\n<0.001,-0.007,1>,\r\n<0.002,0.423,0.906>,\r\n<0.129,0.914,0.384>,\r\n<0.037,1,-0.005>,\r\n<0.155,0.988,-0.009>,\r\n<0.254,0.967,-0.012>,\r\n<0.419,0.908,-0.013>,\r\n<0.499,0.866,-0.016>\r\n<0.503,-0.863,-0.049>,\r\n<0.444,-0.892,-0.085>,\r\n<0.298,-0.952,-0.068>,\r\n<0.201,-0.979,-0.013>,\r\n<0.062,-0.998,-0.004>,\r\n<0.087,-0.932,0.352>,\r\n<-0.004,-0.456,0.890>,\r\n<0,0.006,1>,\r\nZS(74)\r\n<0.001,-0.006,1>,\r\n<0.002,0.456,0.890>,\r\n<0.091,0.928,0.361>,\r\n<0.070,0.991,0.110>,\r\n<0.061,0.998,0>,\r\n<0.051,0.992,-0.116>,\r\n<0.073,0.985,-0.154>,\r\n<0.089,0.993,-0.073>\r\n<-0.287,-0.956,0.051>,\r\n<-0.248,-0.968,-0.031>,\r\n<-0.141,-0.989,-0.050>,\r\n<-0.061,-0.998,0.013>,\r\n<0.087,-0.996,-0.003>,\r\n<0.165,-0.942,0.291>,\r\n<0.004,-0.506,0.862>,\r\nZS(75)\r\n<0,-0.002,1>,\r\n<0.002,0.501,0.865>,\r\n<0.009,0.949,0.316>,\r\n<0.084,0.996,-0.002>,\r\n<-0.114,0.993,0.012>,\r\n<-0.211,0.978,-0.006>,\r\n<-0.418,0.908,-0.003>,\r\n<-0.496,0.868,0.014>\r\n<-0.265,-0.956,0.129>,\r\n<-0.234,-0.962,0.142>,\r\n<-0.092,-0.985,0.146>,\r\n<0.002,-0.978,0.206>,\r\n<0.133,-0.976,0.175>,\r\n<0.144,-0.965,0.221>,\r\n<0.027,-0.607,0.794>,\r\n<0,-0.019,1>,\r\nZS(73)\r\n<0,0.001,1>,\r\n<-0.001,0.018,1>,\r\n<0.022,0.570,0.821>,\r\n<0.143,0.963,0.227>,\r\n<0.023,0.981,0.193>,\r\n<-0.152,0.946,0.288>,\r\n<-0.308,0.930,0.202>,\r\n<-0.438,0.882,0.173>,\r\n<-0.542,0.827,0.146>\r\n<0.509,-0.861,-0.004>,\r\n<0.475,-0.879,0.034>,\r\n<0.355,-0.929,0.104>,\r\n<0.299,-0.939,0.169>,\r\n<0.153,-0.981,0.117>,\r\n<0.115,-0.984,0.140>,\r\n<0.084,-0.660,0.747>,\r\n<-0.003,-0.068,0.998>,\r\nZS(74)\r\n<-0.004,0.067,0.998>,\r\n<0.079,0.660,0.747>,\r\n<0.167,0.959,0.228>,\r\n<0.122,0.955,0.270>,\r\n<0.179,0.942,0.283>,\r\n<0.151,0.963,0.223>,\r\n<0.128,0.975,0.184>,\r\n<0.083,0.981,0.178>\r\n<0.520,-0.851,-0.073>,\r\n<0.460,-0.878,-0.135>,\r\n<0.340,-0.934,-0.111>,\r\n<0.279,-0.960,-0.022>,\r\n<0.150,-0.989,0.002>,\r\n<0.174,-0.983,0.053>,\r\n<0.162,-0.748,0.644>,\r\n<-0.007,-0.156,0.988>,\r\nZS(74)\r\n<-0.008,0.155,0.988>,\r\n<0.163,0.743,0.649>,\r\n<0.180,0.979,0.098>,\r\n<0.292,0.945,0.145>,\r\n<0.467,0.869,0.164>,\r\n<0.577,0.810,0.102>,\r\n<0.673,0.738,0.056>,\r\n<0.717,0.696,0.031>\r\n<-0.156,-0.988,0.019>,\r\n<-0.183,-0.983,-0.029>,\r\n<-0.119,-0.993,-0.021>,\r\n<-0.071,-0.997,0.033>,\r\n<0.015,-1,0.031>,\r\n<0.163,-0.986,0.017>,\r\n<0.245,-0.824,0.511>,\r\n<-0.015,-0.276,0.961>,\r\n<0,0.003,1>,\r\nZS(72)\r\n<0,-0.003,1>,\r\n<-0.017,0.279,0.960>,\r\n<0.247,0.825,0.509>,\r\n<0.192,0.981,0.001>,\r\n<0.229,0.973,-0.011>,\r\n<0.355,0.934,-0.044>,\r\n<0.577,0.808,-0.120>,\r\n<0.685,0.717,-0.131>,\r\n<0.755,0.645,-0.118>\r\n<-0.541,-0.834,0.102>,\r\n<-0.473,-0.877,0.088>,\r\n<-0.322,-0.940,0.107>,\r\n<-0.193,-0.965,0.175>,\r\n<-0.019,-0.968,0.252>,\r\n<0.164,-0.972,0.168>,\r\n<0.298,-0.874,0.385>,\r\n<-0.002,-0.418,0.909>,\r\n<0,0.007,1>,\r\nZS(72)\r\n<0,-0.007,1>,\r\n<-0.004,0.427,0.904>,\r\n<0.296,0.886,0.358>,\r\n<0.208,0.978,-0.004>,\r\n<0.172,0.985,0.009>,\r\n<0.157,0.977,-0.145>,\r\n<0.171,0.967,-0.186>,\r\n<0.220,0.974,-0.057>,\r\n<0.268,0.962,-0.047>\r\n<-0.271,-0.942,0.200>,\r\n<-0.137,-0.971,0.195>,\r\n<0.015,-0.977,0.212>,\r\n<0.143,-0.961,0.235>,\r\n<0.251,-0.920,0.300>,\r\n<0.283,-0.925,0.255>,\r\n<0.312,-0.912,0.265>,\r\n<0.087,-0.572,0.815>,\r\n<-0.002,-0.024,1>,\r\nZS(72)\r\n<-0.002,0.028,1>,\r\n<0.090,0.583,0.807>,\r\n<0.293,0.937,0.189>,\r\n<0.187,0.981,0.043>,\r\n<0.035,0.998,0.048>,\r\n<-0.068,0.998,0.008>,\r\n<-0.278,0.959,0.060>,\r\n<-0.330,0.941,0.077>,\r\n<-0.357,0.930,0.089>\r\n<0.401,-0.907,0.132>,\r\n<0.472,-0.872,0.126>,\r\n<0.562,-0.815,0.138>,\r\n<0.616,-0.773,0.153>,\r\n<0.581,-0.789,0.201>,\r\n<0.390,-0.905,0.170>,\r\n<0.292,-0.952,0.089>,\r\n<0.250,-0.721,0.646>,\r\n<-0.011,-0.147,0.989>,\r\n<0,0.001,1>,\r\nZS(70)\r\n<0,-0.002,1>,\r\n<-0.011,0.154,0.988>,\r\n<0.254,0.728,0.637>,\r\n<0.291,0.952,0.097>,\r\n<0.199,0.958,0.204>,\r\n<0.082,0.966,0.247>,\r\n<-0.093,0.973,0.210>,\r\n<-0.232,0.953,0.194>,\r\n<-0.352,0.918,0.182>,\r\n<-0.441,0.877,0.190>\r\n<0.849,-0.527,-0.027>,\r\n<0.857,-0.515,0.013>,\r\n<0.826,-0.560,0.068>,\r\n<0.735,-0.678,0.026>,\r\n<0.492,-0.870,-0.012>,\r\n<0.316,-0.949,-0.012>,\r\n<0.283,-0.959,-0.007>,\r\n<0.376,-0.826,0.421>,\r\n<-0.009,-0.347,0.938>,\r\n<0,0.005,1>,\r\nZS(70)\r\n<0,-0.006,1>,\r\n<-0.007,0.352,0.936>,\r\n<0.375,0.829,0.416>,\r\n<0.314,0.945,0.091>,\r\n<0.372,0.903,0.216>,\r\n<0.410,0.891,0.196>,\r\n<0.344,0.925,0.159>,\r\n<0.272,0.951,0.147>,\r\n<0.191,0.972,0.140>,\r\n<0.097,0.983,0.155>\r\n<0.890,-0.441,-0.116>,\r\n<0.831,-0.543,-0.120>,\r\n<0.709,-0.694,-0.125>,\r\n<0.509,-0.839,-0.193>,\r\n<0.252,-0.963,-0.096>,\r\n<0.299,-0.954,0>,\r\n<0.307,-0.952,-0.002>,\r\n<0.392,-0.900,0.192>,\r\n<0.125,-0.559,0.819>,\r\n<-0.004,-0.019,1>,\r\nZS(70)\r\n<-0.004,0.021,1>,\r\n<0.129,0.563,0.817>,\r\n<0.388,0.902,0.189>,\r\n<0.318,0.948,0.024>,\r\n<0.436,0.898,0.062>,\r\n<0.582,0.809,0.083>,\r\n<0.699,0.713,0.046>,\r\n<0.722,0.692,0.010>,\r\n<0.694,0.720,-0.006>,\r\n<0.653,0.758,0.004>\r\n<0.646,-0.749,-0.145>,\r\n<0.525,-0.844,-0.112>,\r\n<0.407,-0.905,-0.123>,\r\n<0.234,-0.937,-0.257>,\r\n<0.297,-0.929,-0.221>,\r\n<0.321,-0.947,0>,\r\n<0.295,-0.955,0.014>,\r\n<0.349,-0.937,0.021>,\r\n<0.352,-0.735,0.580>,\r\n<-0.022,-0.197,0.980>,\r\n<-0.002,0.004,1>,\r\n<-0.001,0,1>,\r\nZS(67)\r\n<0,-0.003,1>,\r\n<-0.018,0.200,0.980>,\r\n<0.349,0.739,0.577>,\r\n<0.348,0.937,0.021>,\r\n<0.328,0.945,0>,\r\n<0.347,0.938,-0.011>,\r\n<0.544,0.823,-0.161>,\r\n<0.672,0.718,-0.181>,\r\n<0.800,0.591,-0.106>,\r\n<0.863,0.498,-0.086>,\r\n<0.892,0.441,-0.097>\r\n<0.187,-0.979,-0.082>,\r\n<0.086,-0.995,-0.050>,\r\n<-0.005,-1,-0.044>,\r\n<-0.052,-0.998,-0.023>,\r\n<0.087,-0.994,-0.060>,\r\n<0.093,-0.996,-0.018>,\r\n<0.171,-0.982,0.074>,\r\n<0.312,-0.949,0.053>,\r\n<0.469,-0.833,0.292>,\r\n<0.075,-0.449,0.890>,\r\n<-0.005,0.012,1>,\r\n<-0.001,0.002,1>,\r\n<0,0.001,1>,\r\nZS(66)\r\n<-0.002,-0.009,1>,\r\n<0.082,0.453,0.888>,\r\n<0.462,0.837,0.293>,\r\n<0.358,0.934,-0.006>,\r\n<0.319,0.948,0.015>,\r\n<0.271,0.951,-0.147>,\r\n<0.326,0.917,-0.231>,\r\n<0.408,0.905,-0.121>,\r\n<0.523,0.841,-0.135>,\r\n<0.657,0.737,-0.158>,\r\n<0.759,0.621,-0.194>\r\n<-0.319,-0.945,0.075>,\r\n<-0.370,-0.925,0.088>,\r\n<-0.367,-0.928,0.069>,\r\n<-0.302,-0.952,0.056>,\r\n<-0.176,-0.979,0.099>,\r\n<0.016,-0.990,0.142>,\r\n<0.222,-0.953,0.207>,\r\n<0.371,-0.908,0.196>,\r\n<0.442,-0.892,0.096>,\r\n<0.457,-0.650,0.607>,\r\n<-0.025,-0.133,0.991>,\r\n<-0.003,0.006,1>,\r\n<-0.002,0.001,1>,\r\nZS(65)\r\n<0,-0.003,1>,\r\n<-0.016,0.135,0.991>,\r\n<0.416,0.660,0.626>,\r\n<0.419,0.907,0.047>,\r\n<0.362,0.931,0.044>,\r\n<0.231,0.971,0.065>,\r\n<0.129,0.991,-0.035>,\r\n<-0.066,0.998,-0.013>,\r\n<-0.030,1,-0.030>,\r\n<0.071,0.996,-0.053>,\r\n<0.174,0.983,-0.062>,\r\n<0.279,0.956,-0.088>\r\n<-0.522,-0.843,0.132>,\r\n<-0.436,-0.889,0.140>,\r\n<-0.300,-0.939,0.169>,\r\n<-0.118,-0.977,0.175>,\r\n<0.106,-0.977,0.184>,\r\n<0.297,-0.934,0.197>,\r\n<0.471,-0.854,0.220>,\r\n<0.514,-0.834,0.201>,\r\n<0.527,-0.817,0.233>,\r\n<0.525,-0.791,0.316>,\r\n<0.089,-0.431,0.898>,\r\n<-0.006,0.018,1>,\r\n<-0.001,0.004,1>,\r\n<0,0.002,1>,\r\nZS(63)\r\n<-0.001,0,1>,\r\n<-0.005,-0.013,1>,\r\n<0.095,0.466,0.880>,\r\n<0.520,0.792,0.321>,\r\n<0.494,0.855,0.157>,\r\n<0.380,0.910,0.163>,\r\n<0.281,0.938,0.202>,\r\n<0.096,0.982,0.162>,\r\n<-0.119,0.986,0.116>,\r\n<-0.297,0.954,0.046>,\r\n<-0.360,0.931,0.065>,\r\n<-0.347,0.931,0.110>,\r\n<-0.303,0.947,0.104>\r\n<-0.242,-0.943,0.229>,\r\n<-0.052,-0.985,0.162>,\r\n<0.140,-0.980,0.144>,\r\n<0.333,-0.932,0.144>,\r\n<0.501,-0.853,0.146>,\r\n<0.629,-0.763,0.147>,\r\n<0.697,-0.701,0.148>,\r\n<0.585,-0.801,0.126>,\r\n<0.449,-0.893,0.037>,\r\n<0.299,-0.948,0.107>,\r\n<0.484,-0.659,0.576>,\r\n<-0.018,-0.154,0.988>,\r\n<0,0.008,1>,\r\n<-0.001,0.002,1>,\r\nZS(62)\r\n<-0.001,-0.002,1>,\r\n<-0.004,-0.005,1>,\r\n<-0.021,0.162,0.987>,\r\n<0.535,0.639,0.552>,\r\n<0.301,0.946,0.118>,\r\n<0.471,0.879,0.071>,\r\n<0.525,0.834,0.172>,\r\n<0.498,0.848,0.180>,\r\n<0.361,0.916,0.172>,\r\n<0.192,0.967,0.164>,\r\n<-0.042,0.984,0.175>,\r\n<-0.256,0.949,0.185>,\r\n<-0.396,0.901,0.179>,\r\n<-0.485,0.855,0.183>\r\n<0.265,-0.946,0.186>,\r\n<0.435,-0.892,0.121>,\r\n<0.596,-0.798,0.092>,\r\n<0.719,-0.692,0.071>,\r\n<0.820,-0.570,0.047>,\r\n<0.840,-0.541,0.043>,\r\n<0.750,-0.662,-0.006>,\r\n<0.494,-0.869,0.009>,\r\n<0.448,-0.894,0>,\r\n<0.503,-0.861,0.074>,\r\n<0.560,-0.801,0.213>,\r\n<0.178,-0.642,0.745>,\r\n<-0.009,0.003,1>,\r\n<-0.001,0.002,1>,\r\n<0,0.001,1>,\r\nZS(60)\r\n<0,-0.001,1>,\r\n<-0.001,-0.005,1>,\r\n<-0.012,-0.006,1>,\r\n<0.192,0.614,0.766>,\r\n<0.559,0.802,0.213>,\r\n<0.515,0.852,0.096>,\r\n<0.461,0.887,0.023>,\r\n<0.577,0.813,0.075>,\r\n<0.724,0.684,0.093>,\r\n<0.700,0.706,0.104>,\r\n<0.574,0.812,0.110>,\r\n<0.410,0.904,0.118>,\r\n<0.219,0.967,0.132>,\r\n<0.034,0.986,0.165>,\r\n<-0.155,0.959,0.237>\r\n<0.725,-0.686,0.062>,\r\n<0.815,-0.580,0.006>,\r\n<0.893,-0.449,-0.022>,\r\n<0.935,-0.354,-0.014>,\r\n<0.918,-0.396,-0.028>,\r\n<0.820,-0.566,-0.088>,\r\n<0.609,-0.771,-0.185>,\r\n<0.517,-0.840,-0.164>,\r\n<0.466,-0.885,0>,\r\n<0.478,-0.879,0>,\r\n<0.402,-0.915,0.043>,\r\n<0.503,-0.744,0.441>,\r\n<0.090,-0.314,0.945>,\r\n<-0.006,0.010,1>,\r\n<-0.001,0.002,1>,\r\nZS(60)\r\n<-0.001,-0.002,1>,\r\n<-0.005,-0.013,1>,\r\n<0.080,0.313,0.946>,\r\n<0.508,0.731,0.457>,\r\n<0.410,0.911,0.038>,\r\n<0.480,0.877,-0.003>,\r\n<0.467,0.884,0>,\r\n<0.570,0.815,-0.107>,\r\n<0.722,0.685,-0.098>,\r\n<0.859,0.513,-0.008>,\r\n<0.872,0.490,-0.007>,\r\n<0.787,0.616,0.018>,\r\n<0.666,0.744,0.058>,\r\n<0.530,0.843,0.096>,\r\n<0.382,0.908,0.171>\r\n<0.954,-0.290,-0.081>,\r\n<0.974,-0.212,-0.081>,\r\n<0.973,-0.222,-0.064>,\r\n<0.929,-0.355,-0.105>,\r\n<0.809,-0.573,-0.129>,\r\n<0.648,-0.749,-0.139>,\r\n<0.492,-0.860,-0.136>,\r\n<0.425,-0.879,-0.215>,\r\n<0.401,-0.909,-0.114>,\r\n<0.463,-0.886,0.024>,\r\n<0.501,-0.866,0.004>,\r\n<0.554,-0.832,0.031>,\r\n<0.425,-0.639,0.642>,\r\n<0.005,-0.141,0.990>,\r\n<-0.005,0.007,1>,\r\n<-0.002,0.002,1>,\r\nZS(58)\r\n<-0.002,-0.002,1>,\r\n<-0.004,-0.007,1>,\r\n<-0.001,0.131,0.991>,\r\n<0.416,0.632,0.654>,\r\n<0.559,0.829,0.032>,\r\n<0.510,0.860,-0.005>,\r\n<0.479,0.878,0.013>,\r\n<0.409,0.906,-0.107>,\r\n<0.478,0.856,-0.200>,\r\n<0.609,0.784,-0.124>,\r\n<0.770,0.626,-0.126>,\r\n<0.904,0.421,-0.075>,\r\n<0.946,0.324,-0.030>,\r\n<0.931,0.359,-0.066>,\r\n<0.875,0.481,-0.062>,\r\n<0.799,0.601,0.006>\r\n<0.978,-0.145,-0.153>,\r\n<0.957,-0.247,-0.153>,\r\n<0.882,-0.448,-0.148>,\r\n<0.747,-0.652,-0.127>,\r\n<0.570,-0.812,-0.123>,\r\n<0.385,-0.915,-0.122>,\r\n<0.236,-0.967,-0.098>,\r\n<0.194,-0.980,-0.050>,\r\n<0.333,-0.942,-0.040>,\r\n<0.423,-0.904,0.053>,\r\n<0.494,-0.866,0.075>,\r\n<0.543,-0.840,0>,\r\n<0.607,-0.779,0.154>,\r\n<0.346,-0.517,0.782>,\r\n<-0.021,-0.023,1>,\r\n<-0.004,0.005,1>,\r\n<-0.002,0.002,1>,\r\nZS(56)\r\n<-0.002,-0.002,1>,\r\n<-0.004,-0.005,1>,\r\n<-0.020,0.014,1>,\r\n<0.334,0.505,0.796>,\r\n<0.614,0.771,0.170>,\r\n<0.539,0.842,-0.010>,\r\n<0.487,0.872,0.058>,\r\n<0.445,0.894,0.052>,\r\n<0.354,0.932,-0.072>,\r\n<0.243,0.965,-0.093>,\r\n<0.375,0.920,-0.111>,\r\n<0.547,0.828,-0.122>,\r\n<0.720,0.683,-0.124>,\r\n<0.869,0.475,-0.143>,\r\n<0.949,0.286,-0.129>,\r\n<0.976,0.196,-0.093>,\r\n<0.978,0.195,-0.079>\r\n<0.890,-0.408,-0.203>,\r\n<0.798,-0.587,-0.140>,\r\n<0.641,-0.758,-0.122>,\r\n<0.439,-0.893,-0.102>,\r\n<0.237,-0.968,-0.083>,\r\n<0.058,-0.997,-0.057>,\r\n<0.018,-1,-0.032>,\r\n<0.147,-0.989,0.021>,\r\n<0.326,-0.942,0.077>,\r\n<0.466,-0.880,0.093>,\r\n<0.540,-0.832,0.126>,\r\n<0.577,-0.814,0.065>,\r\n<0.565,-0.825,-0.015>,\r\n<0.611,-0.726,0.317>,\r\n<0.272,-0.406,0.872>,\r\n<-0.020,0.018,1>,\r\n<-0.008,0.004,1>,\r\n<-0.005,0.002,1>,\r\nZS(54)\r\n<0,-0.002,1>,\r\n<-0.002,-0.004,1>,\r\n<-0.013,-0.019,1>,\r\n<0.246,0.391,0.887>,\r\n<0.606,0.717,0.344>,\r\n<0.566,0.824,-0.016>,\r\n<0.573,0.817,0.068>,\r\n<0.517,0.847,0.125>,\r\n<0.434,0.897,0.080>,\r\n<0.315,0.948,0.037>,\r\n<0.132,0.991,-0.004>,\r\n<0.086,0.995,-0.053>,\r\n<0.229,0.970,-0.085>,\r\n<0.426,0.899,-0.099>,\r\n<0.622,0.775,-0.110>,\r\n<0.784,0.605,-0.141>,\r\n<0.899,0.403,-0.173>,\r\n<0.947,0.235,-0.221>\r\n<0.647,-0.740,-0.186>,\r\n<0.482,-0.870,-0.102>,\r\n<0.278,-0.957,-0.076>,\r\n<0.071,-0.997,-0.041>,\r\n<-0.113,-0.994,-0.013>,\r\n<-0.121,-0.993,0.003>,\r\n<0.055,-0.997,0.049>,\r\n<0.276,-0.957,0.085>,\r\n<0.450,-0.886,0.110>,\r\n<0.566,-0.817,0.111>,\r\n<0.624,-0.775,0.098>,\r\n<0.602,-0.794,0.080>,\r\n<0.595,-0.803,0.012>,\r\n<0.594,-0.804,-0.021>,\r\n<0.570,-0.686,0.452>,\r\n<0.193,-0.320,0.928>,\r\n<-0.018,0.017,1>,\r\n<-0.007,0.008,1>,\r\n<-0.001,0.005,1>,\r\nZS(52)\r\n<-0.001,0,1>,\r\n<-0.002,-0.003,1>,\r\n<-0.010,-0.015,1>,\r\n<0.156,0.287,0.945>,\r\n<0.560,0.671,0.485>,\r\n<0.597,0.802,-0.021>,\r\n<0.600,0.800,0.017>,\r\n<0.599,0.795,0.092>,\r\n<0.608,0.787,0.104>,\r\n<0.526,0.843,0.113>,\r\n<0.394,0.913,0.106>,\r\n<0.206,0.976,0.070>,\r\n<-0.006,1,0.016>,\r\n<-0.076,0.997,-0.012>,\r\n<0.056,0.998,-0.035>,\r\n<0.260,0.963,-0.069>,\r\n<0.472,0.875,-0.105>,\r\n<0.659,0.741,-0.129>,\r\n<0.790,0.578,-0.205>\r\n<0.248,-0.961,-0.118>,\r\n<0.088,-0.996,-0.028>,\r\n<-0.098,-0.995,0.011>,\r\n<-0.254,-0.967,0.010>,\r\n<-0.205,-0.978,0.032>,\r\n<0.020,-0.997,0.076>,\r\n<0.254,-0.963,0.091>,\r\n<0.454,-0.885,0.107>,\r\n<0.602,-0.790,0.113>,\r\n<0.676,-0.731,0.098>,\r\n<0.683,-0.728,0.061>,\r\n<0.648,-0.761,0.035>,\r\n<0.613,-0.790,0.015>,\r\n<0.612,-0.791,-0.006>,\r\n<0.632,-0.775,-0.017>,\r\n<0.653,-0.590,0.475>,\r\n<0.139,-0.228,0.964>,\r\n<-0.011,0.019,1>,\r\n<-0.002,0.008,1>,\r\n<-0.001,0.001,1>,\r\nZS(50)\r\n<-0.001,-0.001,1>,\r\n<-0.002,-0.002,1>,\r\n<-0.009,-0.011,1>,\r\n<0.099,0.183,0.978>,\r\n<0.642,0.569,0.514>,\r\n<0.642,0.767,-0.004>,\r\n<0.612,0.790,-0.006>,\r\n<0.619,0.785,0.023>,\r\n<0.656,0.753,0.049>,\r\n<0.679,0.730,0.075>,\r\n<0.649,0.753,0.109>,\r\n<0.547,0.829,0.116>,\r\n<0.379,0.920,0.103>,\r\n<0.164,0.983,0.084>,\r\n<-0.081,0.996,0.048>,\r\n<-0.200,0.980,0.012>,\r\n<-0.123,0.992,0.008>,\r\n<0.088,0.996,-0.026>,\r\n<0.274,0.960,-0.060>,\r\n<0.442,0.883,-0.155>\r\n<-0.141,-0.990,0.003>,\r\n<-0.278,-0.959,0.061>,\r\n<-0.340,-0.939,0.048>,\r\n<-0.231,-0.970,0.072>,\r\n<0.028,-0.996,0.087>,\r\n<0.264,-0.960,0.092>,\r\n<0.482,-0.871,0.100>,\r\n<0.645,-0.758,0.099>,\r\n<0.738,-0.670,0.083>,\r\n<0.755,-0.654,0.056>,\r\n<0.719,-0.695,0.023>,\r\n<0.662,-0.749,-0.017>,\r\n<0.609,-0.793,-0.007>,\r\n<0.627,-0.779,-0.002>,\r\n<0.626,-0.779,-0.025>,\r\n<0.670,-0.743,0.009>,\r\n<0.478,-0.709,0.519>,\r\n<0.114,-0.153,0.982>,\r\n<-0.010,0.015,1>,\r\n<-0.003,0.003,1>,\r\n<-0.001,0.001,1>,\r\nZS(48)\r\n<-0.001,-0.001,1>,\r\n<-0.002,-0.002,1>,\r\n<-0.009,-0.009,1>,\r\n<0.086,0.114,0.990>,\r\n<0.464,0.676,0.573>,\r\n<0.676,0.736,0.040>,\r\n<0.717,0.689,0.102>,\r\n<0.628,0.778,-0.003>,\r\n<0.615,0.788,0>,\r\n<0.680,0.733,-0.007>,\r\n<0.733,0.679,0.037>,\r\n<0.753,0.654,0.068>,\r\n<0.707,0.701,0.095>,\r\n<0.582,0.806,0.105>,\r\n<0.392,0.915,0.100>,\r\n<0.162,0.983,0.088>,\r\n<-0.094,0.992,0.084>,\r\n<-0.281,0.959,0.041>,\r\n<-0.271,0.961,0.048>,\r\n<-0.105,0.993,0.048>,\r\n<0.044,0.998,-0.039>\r\n<-0.420,-0.906,0.053>,\r\n<-0.362,-0.927,0.094>,\r\n<-0.186,-0.975,0.118>,\r\n<0.058,-0.994,0.092>,\r\n<0.298,-0.950,0.091>,\r\n<0.526,-0.846,0.088>,\r\n<0.694,-0.715,0.082>,\r\n<0.793,-0.606,0.064>,\r\n<0.820,-0.571,0.038>,\r\n<0.781,-0.624,0.007>,\r\n<0.713,-0.701,-0.021>,\r\n<0.636,-0.770,-0.052>,\r\n<0.627,-0.777,-0.050>,\r\n<0.642,-0.767,0>,\r\n<0.655,-0.756,-0.002>,\r\n<0.685,-0.728,-0.028>,\r\n<0.693,-0.720,0.042>,\r\n<0.530,-0.548,0.646>,\r\n<0.108,-0.116,0.987>,\r\n<-0.010,0.010,1>,\r\n<-0.002,0.002,1>,\r\n<0,0.001,1>,\r\nZS(46)\r\n<0,-0.001,1>,\r\n<-0.002,-0.002,1>,\r\n<-0.009,-0.009,1>,\r\n<0.090,0.091,0.992>,\r\n<0.509,0.531,0.677>,\r\n<0.688,0.721,0.076>,\r\n<0.569,0.818,0.091>,\r\n<0.656,0.755,-0.003>,\r\n<0.643,0.766,0>,\r\n<0.634,0.771,-0.053>,\r\n<0.656,0.753,-0.053>,\r\n<0.740,0.672,-0.015>,\r\n<0.804,0.594,0.016>,\r\n<0.820,0.570,0.049>,\r\n<0.763,0.642,0.073>,\r\n<0.631,0.771,0.089>,\r\n<0.428,0.899,0.089>,\r\n<0.188,0.978,0.092>,\r\n<-0.058,0.993,0.101>,\r\n<-0.286,0.953,0.101>,\r\n<-0.357,0.931,0.074>,\r\n<-0.315,0.948,0.046>\r\n<-0.296,-0.937,0.184>,\r\n<-0.115,-0.986,0.117>,\r\n<0.109,-0.989,0.101>,\r\n<0.351,-0.933,0.085>,\r\n<0.576,-0.814,0.075>,\r\n<0.742,-0.668,0.061>,\r\n<0.840,-0.541,0.044>,\r\n<0.869,-0.494,0.023>,\r\n<0.832,-0.555,-0.003>,\r\n<0.753,-0.658,-0.032>,\r\n<0.670,-0.741,-0.047>,\r\n<0.616,-0.787,-0.042>,\r\n<0.614,-0.788,-0.051>,\r\n<0.625,-0.780,-0.011>,\r\n<0.650,-0.759,0.019>,\r\n<0.666,-0.746,0.013>,\r\n<0.694,-0.720,-0.009>,\r\n<0.709,-0.702,0.062>,\r\n<0.545,-0.523,0.655>,\r\n<0.132,-0.103,0.986>,\r\n<-0.012,0.010,1>,\r\n<-0.003,0.002,1>,\r\n<-0.002,0,1>,\r\nZS(44)\r\n<-0.002,0,1>,\r\n<-0.003,-0.002,1>,\r\n<-0.012,-0.010,1>,\r\n<0.118,0.086,0.989>,\r\n<0.531,0.510,0.677>,\r\n<0.704,0.705,0.087>,\r\n<0.694,0.720,-0.010>,\r\n<0.666,0.746,0.015>,\r\n<0.650,0.759,0.019>,\r\n<0.624,0.781,-0.020>,\r\n<0.618,0.784,-0.064>,\r\n<0.633,0.772,-0.049>,\r\n<0.701,0.711,-0.050>,\r\n<0.789,0.614,-0.029>,\r\n<0.860,0.511,0.003>,\r\n<0.873,0.487,0.030>,\r\n<0.812,0.581,0.055>,\r\n<0.682,0.728,0.071>,\r\n<0.481,0.873,0.081>,\r\n<0.238,0.967,0.090>,\r\n<0.003,0.994,0.106>,\r\n<-0.221,0.967,0.127>,\r\n<-0.350,0.924,0.157>\r\n<-0.005,-0.982,0.188>,\r\n<0.187,-0.976,0.109>,\r\n<0.418,-0.904,0.085>,\r\n<0.627,-0.776,0.063>,\r\n<0.782,-0.622,0.043>,\r\n<0.877,-0.480,0.024>,\r\n<0.905,-0.426,0.009>,\r\n<0.866,-0.500,-0.012>,\r\n<0.781,-0.623,-0.034>,\r\n<0.683,-0.729,-0.049>,\r\n<0.600,-0.798,-0.052>,\r\n<0.561,-0.827,-0.036>,\r\n<0.566,-0.824,-0.008>,\r\n<0.606,-0.795,0.010>,\r\n<0.639,-0.769,0.037>,\r\n<0.684,-0.728,0.050>,\r\n<0.708,-0.705,0.028>,\r\n<0.719,-0.695,-0.010>,\r\n<0.723,-0.689,0.057>,\r\n<0.666,-0.484,0.569>,\r\n<0.199,-0.116,0.973>,\r\n<-0.016,0.011,1>,\r\n<-0.004,0.003,1>,\r\n<-0.002,0.002,1>,\r\nZS(42)\r\n<-0.002,-0.002,1>,\r\n<-0.004,-0.003,1>,\r\n<-0.016,-0.011,1>,\r\n<0.192,0.103,0.976>,\r\n<0.661,0.474,0.581>,\r\n<0.719,0.691,0.074>,\r\n<0.719,0.695,-0.010>,\r\n<0.706,0.707,0.034>,\r\n<0.680,0.732,0.055>,\r\n<0.631,0.775,0.035>,\r\n<0.598,0.801,0.001>,\r\n<0.562,0.827,-0.018>,\r\n<0.568,0.822,-0.045>,\r\n<0.625,0.778,-0.059>,\r\n<0.721,0.691,-0.051>,\r\n<0.823,0.567,-0.031>,\r\n<0.897,0.442,-0.005>,\r\n<0.911,0.412,0.015>,\r\n<0.854,0.520,0.032>,\r\n<0.730,0.682,0.050>,\r\n<0.543,0.837,0.068>,\r\n<0.309,0.947,0.085>,\r\n<0.082,0.991,0.107>,\r\n<-0.104,0.976,0.190>\r\n<0.320,-0.932,0.168>,\r\n<0.495,-0.865,0.079>,\r\n<0.676,-0.735,0.050>,\r\n<0.817,-0.575,0.030>,\r\n<0.906,-0.423,0.012>,\r\n<0.927,-0.374,-0.002>,\r\n<0.885,-0.464,-0.019>,\r\n<0.797,-0.603,-0.033>,\r\n<0.689,-0.723,-0.042>,\r\n<0.583,-0.812,-0.044>,\r\n<0.514,-0.857,-0.034>,\r\n<0.507,-0.862,-0.012>,\r\n<0.549,-0.836,0.017>,\r\n<0.611,-0.790,0.040>,\r\n<0.668,-0.743,0.047>,\r\n<0.711,-0.701,0.046>,\r\n<0.731,-0.681,0.045>,\r\n<0.742,-0.670,0.011>,\r\n<0.809,-0.582,0.081>,\r\n<0.738,-0.674,0.027>,\r\n<0.586,-0.629,0.510>,\r\n<0.296,-0.171,0.940>,\r\n<-0.019,0.014,1>,\r\n<-0.005,0.004,1>,\r\n<-0.002,0.002,1>,\r\nZS(40)\r\n<-0.002,-0.002,1>,\r\n<-0.005,-0.004,1>,\r\n<-0.019,-0.014,1>,\r\n<0.295,0.165,0.941>,\r\n<0.589,0.629,0.508>,\r\n<0.735,0.677,0.036>,\r\n<0.811,0.580,0.081>,\r\n<0.746,0.666,0.015>,\r\n<0.730,0.681,0.056>,\r\n<0.705,0.707,0.055>,\r\n<0.654,0.754,0.052>,\r\n<0.589,0.808,0.038>,\r\n<0.528,0.849,0.011>,\r\n<0.496,0.868,-0.020>,\r\n<0.525,0.850,-0.042>,\r\n<0.614,0.788,-0.049>,\r\n<0.731,0.680,-0.045>,\r\n<0.841,0.541,-0.032>,\r\n<0.918,0.396,-0.014>,\r\n<0.936,0.352,0.002>,\r\n<0.885,0.465,0.015>,\r\n<0.772,0.635,0.032>,\r\n<0.601,0.798,0.051>,\r\n<0.396,0.914,0.085>,\r\n<0.214,0.961,0.178>\r\n<0.608,-0.785,0.117>,\r\n<0.730,-0.683,0.035>,\r\n<0.845,-0.535,0.016>,\r\n<0.928,-0.373,-0.002>,\r\n<0.941,-0.337,-0.010>,\r\n<0.895,-0.446,-0.022>,\r\n<0.803,-0.595,-0.030>,\r\n<0.687,-0.726,-0.035>,\r\n<0.563,-0.825,-0.036>,\r\n<0.470,-0.882,-0.027>,\r\n<0.443,-0.896,-0.008>,\r\n<0.489,-0.872,0.018>,\r\n<0.571,-0.820,0.043>,\r\n<0.653,-0.755,0.058>,\r\n<0.715,-0.697,0.059>,\r\n<0.754,-0.656,0.043>,\r\n<0.767,-0.641,0.025>,\r\n<0.754,-0.657,0.014>,\r\n<0.754,-0.656,-0.003>,\r\n<0.699,-0.710,0.090>,\r\n<0.769,-0.639,-0.009>,\r\n<0.676,-0.564,0.475>,\r\n<0.393,-0.253,0.884>,\r\n<0.014,0.020,1>,\r\n<-0.007,0.004,1>,\r\n<-0.002,0.001,1>,\r\n<-0.001,0,1>,\r\nZS(36)\r\n<-0.001,0,1>,\r\n<-0.002,-0.001,1>,\r\n<-0.007,-0.004,1>,\r\n<0.015,-0.020,1>,\r\n<0.394,0.253,0.883>,\r\n<0.670,0.574,0.472>,\r\n<0.768,0.640,-0.007>,\r\n<0.698,0.710,0.093>,\r\n<0.754,0.657,-0.003>,\r\n<0.759,0.651,0.020>,\r\n<0.775,0.631,0.036>,\r\n<0.753,0.656,0.054>,\r\n<0.704,0.707,0.065>,\r\n<0.629,0.775,0.061>,\r\n<0.539,0.841,0.041>,\r\n<0.459,0.889,0.012>,\r\n<0.429,0.903,-0.016>,\r\n<0.483,0.875,-0.035>,\r\n<0.599,0.800,-0.040>,\r\n<0.733,0.680,-0.035>,\r\n<0.848,0.530,-0.029>,\r\n<0.928,0.372,-0.018>,\r\n<0.951,0.310,-0.009>,\r\n<0.909,0.416,0>,\r\n<0.805,0.593,0.016>,\r\n<0.666,0.744,0.044>,\r\n<0.524,0.840,0.137>\r\n<0.801,-0.595,0.057>,\r\n<0.873,-0.487,-0.016>,\r\n<0.939,-0.343,-0.019>,\r\n<0.949,-0.314,-0.013>,\r\n<0.897,-0.441,-0.024>,\r\n<0.804,-0.594,-0.024>,\r\n<0.681,-0.732,-0.027>,\r\n<0.544,-0.838,-0.027>,\r\n<0.433,-0.901,-0.020>,\r\n<0.390,-0.921,-0.005>,\r\n<0.436,-0.900,0.016>,\r\n<0.533,-0.845,0.039>,\r\n<0.637,-0.769,0.057>,\r\n<0.720,-0.691,0.062>,\r\n<0.775,-0.630,0.052>,\r\n<0.800,-0.599,0.030>,\r\n<0.791,-0.612,-0.006>,\r\n<0.776,-0.631,-0.025>,\r\n<0.766,-0.643,0>,\r\n<0.778,-0.629,-0.003>,\r\n<0.790,-0.613,-0.006>,\r\n<0.802,-0.597,-0.022>,\r\n<0.719,-0.606,0.341>,\r\n<0.504,-0.335,0.796>,\r\n<0.131,0.002,0.991>,\r\n<-0.008,0.006,1>,\r\n<0,0.002,1>,\r\n<0,0.001,1>,\r\nZS(34)\r\n<0,-0.001,1>,\r\n<0,-0.002,1>,\r\n<-0.007,-0.006,1>,\r\n<0.137,0,0.991>,\r\n<0.506,0.337,0.794>,\r\n<0.718,0.607,0.339>,\r\n<0.802,0.597,-0.021>,\r\n<0.791,0.612,-0.007>,\r\n<0.778,0.629,-0.003>,\r\n<0.766,0.643,0>,\r\n<0.781,0.624,-0.021>,\r\n<0.803,0.596,0.002>,\r\n<0.808,0.588,0.039>,\r\n<0.774,0.631,0.059>,\r\n<0.705,0.706,0.066>,\r\n<0.606,0.793,0.056>,\r\n<0.494,0.869,0.035>,\r\n<0.397,0.918,0.010>,\r\n<0.373,0.928,-0.010>,\r\n<0.448,0.894,-0.023>,\r\n<0.583,0.812,-0.027>,\r\n<0.729,0.684,-0.026>,\r\n<0.847,0.530,-0.024>,\r\n<0.930,0.366,-0.022>,\r\n<0.958,0.285,-0.017>,\r\n<0.925,0.380,-0.025>,\r\n<0.841,0.540,-0.002>,\r\n<0.760,0.645,0.081>\r\n<0.915,-0.403,0.019>,\r\n<0.944,-0.328,-0.027>,\r\n<0.946,-0.322,-0.035>,\r\n<0.893,-0.450,-0.019>,\r\n<0.801,-0.599,-0.018>,\r\n<0.673,-0.739,-0.017>,\r\n<0.528,-0.849,-0.017>,\r\n<0.404,-0.915,-0.013>,\r\n<0.349,-0.937,-0.003>,\r\n<0.394,-0.919,0.013>,\r\n<0.502,-0.864,0.033>,\r\n<0.622,-0.782,0.048>,\r\n<0.726,-0.685,0.055>,\r\n<0.798,-0.600,0.049>,\r\n<0.835,-0.549,0.029>,\r\n<0.837,-0.547,0.003>,\r\n<0.816,-0.578,-0.020>,\r\n<0.778,-0.626,-0.062>,\r\n<0.768,-0.639,-0.047>,\r\n<0.785,-0.620,0.005>,\r\n<0.782,-0.622,0.026>,\r\n<0.800,-0.600,0.017>,\r\n<0.824,-0.567,-0.016>,\r\n<0.771,-0.613,0.171>,\r\n<0.634,-0.410,0.655>,\r\n<0.313,-0.075,0.947>,\r\n<-0.002,0.008,1>,\r\n<-0.004,0,1>,\r\nZS(34)\r\n<-0.003,0,1>,\r\n<0.002,-0.008,1>,\r\n<0.321,0.079,0.944>,\r\n<0.637,0.415,0.649>,\r\n<0.772,0.613,0.168>,\r\n<0.824,0.567,-0.015>,\r\n<0.800,0.600,0.017>,\r\n<0.786,0.617,0.020>,\r\n<0.791,0.612,-0.005>,\r\n<0.772,0.633,-0.057>,\r\n<0.783,0.619,-0.065>,\r\n<0.828,0.561,-0.016>,\r\n<0.850,0.526,0.010>,\r\n<0.842,0.539,0.040>,\r\n<0.793,0.607,0.057>,\r\n<0.706,0.706,0.059>,\r\n<0.588,0.807,0.049>,\r\n<0.456,0.889,0.031>,\r\n<0.348,0.937,0.010>,\r\n<0.332,0.943,-0.005>,\r\n<0.423,0.906,-0.013>,\r\n<0.570,0.821,-0.017>,\r\n<0.722,0.692,-0.017>,\r\n<0.842,0.539,-0.020>,\r\n<0.925,0.378,-0.027>,\r\n<0.957,0.286,-0.037>,\r\n<0.938,0.346,-0.031>,\r\n<0.893,0.450,0.024>\r\n<0.949,-0.314,-0.018>,\r\n<0.934,-0.356,-0.024>,\r\n<0.882,-0.471,-0.017>,\r\n<0.793,-0.610,-0.005>,\r\n<0.665,-0.747,-0.006>,\r\n<0.516,-0.856,-0.008>,\r\n<0.384,-0.923,-0.005>,\r\n<0.319,-0.948,0>,\r\n<0.363,-0.932,0.011>,\r\n<0.480,-0.877,0.025>,\r\n<0.612,-0.790,0.038>,\r\n<0.731,-0.681,0.045>,\r\n<0.818,-0.574,0.043>,\r\n<0.866,-0.499,0.028>,\r\n<0.876,-0.483,0.002>,\r\n<0.852,-0.523,-0.028>,\r\n<0.807,-0.589,-0.046>,\r\n<0.762,-0.646,-0.044>,\r\n<0.748,-0.662,-0.045>,\r\n<0.732,-0.681,0>,\r\n<0.755,-0.654,0.056>,\r\n<0.797,-0.597,0.094>,\r\n<0.817,-0.572,0.067>,\r\n<0.842,-0.539,-0.008>,\r\n<0.829,-0.558,0.036>,\r\n<0.728,-0.507,0.461>,\r\n<0.505,-0.227,0.833>,\r\n<0.162,0.017,0.987>,\r\n<-0.014,0.004,1>,\r\n<-0.003,0,1>,\r\nZS(30)\r\n<-0.003,0,1>,\r\n<-0.013,-0.003,1>,\r\n<0.166,-0.015,0.986>,\r\n<0.498,0.236,0.834>,\r\n<0.731,0.512,0.452>,\r\n<0.831,0.555,0.033>,\r\n<0.840,0.543,-0.001>,\r\n<0.813,0.578,0.075>,\r\n<0.791,0.605,0.093>,\r\n<0.751,0.659,0.043>,\r\n<0.739,0.674,-0.015>,\r\n<0.761,0.646,-0.057>,\r\n<0.776,0.629,-0.049>,\r\n<0.822,0.568,-0.044>,\r\n<0.868,0.497,-0.020>,\r\n<0.887,0.461,0.013>,\r\n<0.868,0.495,0.037>,\r\n<0.807,0.589,0.049>,\r\n<0.706,0.707,0.049>,\r\n<0.572,0.819,0.038>,\r\n<0.429,0.903,0.022>,\r\n<0.315,0.949,0.008>,\r\n<0.304,0.953,0>,\r\n<0.406,0.914,-0.005>,\r\n<0.559,0.829,-0.006>,\r\n<0.714,0.700,-0.009>,\r\n<0.834,0.551,-0.014>,\r\n<0.913,0.407,-0.032>,\r\n<0.952,0.304,-0.032>,\r\n<0.958,0.287,-0.001>\r\n<0.911,-0.408,-0.050>,\r\n<0.866,-0.499,-0.002>,\r\n<0.783,-0.623,0.004>,\r\n<0.658,-0.753,0.007>,\r\n<0.511,-0.860,0.005>,\r\n<0.374,-0.928,0.002>,\r\n<0.301,-0.954,0.003>,\r\n<0.344,-0.939,0.009>,\r\n<0.466,-0.885,0.019>,\r\n<0.605,-0.796,0.028>,\r\n<0.734,-0.678,0.036>,\r\n<0.831,-0.555,0.036>,\r\n<0.888,-0.458,0.025>,\r\n<0.906,-0.424,0.004>,\r\n<0.884,-0.466,-0.021>,\r\n<0.831,-0.555,-0.046>,\r\n<0.763,-0.644,-0.057>,\r\n<0.704,-0.709,-0.043>,\r\n<0.672,-0.740,-0.005>,\r\n<0.684,-0.728,0.043>,\r\n<0.735,-0.674,0.077>,\r\n<0.789,-0.605,0.105>,\r\n<0.845,-0.520,0.124>,\r\n<0.870,-0.489,0.058>,\r\n<0.860,-0.510,-0.003>,\r\n<0.953,-0.275,0.127>,\r\n<0.794,-0.567,0.220>,\r\n<0.666,-0.438,0.604>,\r\n<0.461,-0.093,0.882>,\r\n<0.131,0.018,0.991>,\r\n<-0.010,0.002,1>,\r\n<-0.003,0,1>,\r\nZS(25)\r\n<-0.001,0,1>,\r\n<-0.003,0,1>,\r\n<-0.009,-0.002,1>,\r\n<0.135,-0.016,0.991>,\r\n<0.554,0.080,0.829>,\r\n<0.668,0.437,0.602>,\r\n<0.799,0.563,0.211>,\r\n<0.950,0.290,0.118>,\r\n<0.864,0.504,0.002>,\r\n<0.871,0.486,0.074>,\r\n<0.837,0.529,0.136>,\r\n<0.775,0.624,0.104>,\r\n<0.719,0.692,0.068>,\r\n<0.678,0.735,0.029>,\r\n<0.682,0.731,-0.020>,\r\n<0.722,0.690,-0.052>,\r\n<0.784,0.618,-0.059>,\r\n<0.853,0.521,-0.042>,\r\n<0.903,0.429,-0.013>,\r\n<0.916,0.400,0.012>,\r\n<0.887,0.461,0.032>,\r\n<0.817,0.575,0.040>,\r\n<0.705,0.708,0.035>,\r\n<0.561,0.827,0.025>,\r\n<0.412,0.911,0.016>,\r\n<0.296,0.955,0.007>,\r\n<0.288,0.958,0.003>,\r\n<0.398,0.917,0.003>,\r\n<0.553,0.833,0.002>,\r\n<0.705,0.709,0.002>,\r\n<0.822,0.569,-0.006>,\r\n<0.898,0.440,-0.018>,\r\n<0.936,0.347,-0.058>\r\n<0.832,-0.554,-0.037>,\r\n<0.767,-0.642,0.018>,\r\n<0.654,-0.756,0.023>,\r\n<0.514,-0.858,0.016>,\r\n<0.376,-0.927,0.010>,\r\n<0.296,-0.955,0.005>,\r\n<0.337,-0.941,0.006>,\r\n<0.459,-0.888,0.010>,\r\n<0.602,-0.799,0.018>,\r\n<0.737,-0.675,0.025>,\r\n<0.840,-0.542,0.028>,\r\n<0.904,-0.428,0.022>,\r\n<0.927,-0.374,0.007>,\r\n<0.909,-0.416,-0.015>,\r\n<0.852,-0.522,-0.037>,\r\n<0.766,-0.641,-0.049>,\r\n<0.677,-0.735,-0.047>,\r\n<0.610,-0.792,-0.020>,\r\n<0.601,-0.799,0.026>,\r\n<0.663,-0.745,0.078>,\r\n<0.756,-0.644,0.115>,\r\n<0.842,-0.527,0.115>,\r\n<0.895,-0.439,0.080>,\r\n<0.894,-0.445,0.051>,\r\n<0.877,-0.480,0.014>,\r\n<0.876,-0.482,-0.002>,\r\n<0.836,-0.533,0.127>,\r\n<0.949,-0.293,0.117>,\r\n<0.792,-0.518,0.323>,\r\n<0.655,-0.425,0.625>,\r\n<0.447,-0.078,0.891>,\r\n<0.194,0.018,0.981>,\r\n<0.018,0.004,1>,\r\n<-0.005,0,1>,\r\nz,z,<-0.001,0,1>,\r\n<-0.002,0,1>,\r\n<-0.002,0,1>,\r\nZS(15)\r\n<-0.001,0,1>,\r\n<-0.003,0,1>,\r\n<-0.006,0,1>,\r\n<0.021,-0.003,1>,\r\n<0.201,-0.017,0.980>,\r\n<0.451,0.083,0.889>,\r\n<0.623,0.541,0.564>,\r\n<0.791,0.520,0.321>,\r\n<0.915,0.398,0.063>,\r\n<0.838,0.532,0.124>,\r\n<0.876,0.483,-0.002>,\r\n<0.882,0.472,0.020>,\r\n<0.903,0.426,0.054>,\r\n<0.892,0.444,0.089>,\r\n<0.828,0.549,0.113>,\r\n<0.734,0.672,0.104>,\r\n<0.641,0.765,0.062>,\r\n<0.596,0.803,0.012>,\r\n<0.628,0.778,-0.031>,\r\n<0.705,0.707,-0.052>,\r\n<0.797,0.602,-0.050>,\r\n<0.879,0.475,-0.033>,\r\n<0.929,0.370,-0.009>,\r\n<0.936,0.352,0.012>,\r\n<0.900,0.434,0.025>,\r\n<0.824,0.566,0.027>,\r\n<0.704,0.710,0.022>,\r\n<0.555,0.832,0.016>,\r\n<0.405,0.914,0.010>,\r\n<0.289,0.957,0.006>,\r\n<0.284,0.959,0.008>,\r\n<0.399,0.917,0.009>,\r\n<0.551,0.834,0.012>,\r\n<0.696,0.718,0.011>,\r\n<0.806,0.593,0.005>,\r\n<0.867,0.497,-0.045>\r\n<0.725,-0.688,-0.025>,\r\n<0.647,-0.762,0.028>,\r\n<0.527,-0.849,0.030>,\r\n<0.390,-0.920,0.017>,\r\n<0.306,-0.952,0.006>,\r\n<0.341,-0.940,0>,\r\n<0.460,-0.888,0.001>,\r\n<0.601,-0.799,0.006>,\r\n<0.739,-0.673,0.012>,\r\n<0.846,-0.532,0.016>,\r\n<0.915,-0.404,0.015>,\r\n<0.942,-0.336,0.007>,\r\n<0.927,-0.375,-0.008>,\r\n<0.868,-0.495,-0.026>,\r\n<0.772,-0.634,-0.039>,\r\n<0.658,-0.751,-0.042>,\r\n<0.558,-0.830,-0.026>,\r\n<0.517,-0.856,0.010>,\r\n<0.582,-0.811,0.056>,\r\n<0.706,-0.701,0.100>,\r\n<0.829,-0.546,0.122>,\r\n<0.912,-0.396,0.110>,\r\n<0.947,-0.318,0.040>,\r\n<0.933,-0.352,-0.070>,\r\n<0.906,-0.410,-0.107>,\r\n<0.883,-0.469,-0.001>,\r\n<0.891,-0.454,0.004>,\r\n<0.879,-0.471,0.071>,\r\n<0.846,-0.500,0.187>,\r\n<0.907,-0.419,0.050>,\r\n<0.834,-0.465,0.297>,\r\n<0.734,-0.346,0.584>,\r\n<0.556,-0.123,0.822>,\r\n<0.346,0.011,0.938>,\r\n<0.145,0.011,0.989>,\r\n<0.022,0,1>,\r\n<-0.010,-0.002,1>,\r\n<-0.006,0,1>,\r\n<-0.003,0.001,1>,\r\n<0,0.002,1>,\r\nZS(5)\r\n<-0.001,0,1>,\r\n<-0.001,0,1>,\r\n<-0.002,0,1>,\r\n<-0.001,0,1>,\r\n<-0.001,0,1>,\r\n<-0.002,0,1>,\r\n<-0.003,0,1>,\r\n<-0.004,0,1>,\r\n<-0.009,0,1>,\r\n<0.024,-0.003,1>,\r\n<0.152,-0.011,0.988>,\r\n<0.354,-0.004,0.935>,\r\n<0.564,0.130,0.815>,\r\n<0.739,0.349,0.576>,\r\n<0.836,0.464,0.294>,\r\n<0.906,0.420,0.052>,\r\n<0.871,0.474,0.127>,\r\n<0.890,0.454,0.038>,\r\n<0.894,0.449,-0.003>,\r\n<0.883,0.469,-0.001>,\r\n<0.908,0.401,-0.120>,\r\n<0.940,0.338,-0.051>,\r\n<0.947,0.313,0.066>,\r\n<0.899,0.423,0.112>,\r\n<0.806,0.580,0.117>,\r\n<0.676,0.731,0.091>,\r\n<0.554,0.832,0.046>,\r\n<0.514,0.858,0.001>,\r\n<0.585,0.810,-0.035>,\r\n<0.696,0.717,-0.047>,\r\n<0.810,0.584,-0.042>,\r\n<0.899,0.437,-0.025>,\r\n<0.946,0.324,-0.005>,\r\n<0.949,0.316,0.009>,\r\n<0.908,0.418,0.016>,\r\n<0.826,0.563,0.016>,\r\n<0.703,0.711,0.013>,\r\n<0.553,0.833,0.007>,\r\n<0.405,0.914,0.005>,\r\n<0.291,0.957,0.004>,\r\n<0.292,0.957,0.008>,\r\n<0.409,0.912,0.015>,\r\n<0.557,0.830,0.024>,\r\n<0.685,0.728,0.024>,\r\n<0.764,0.644,-0.024>\r\n<0.610,-0.793,-0.019>,\r\n<0.535,-0.844,0.027>,\r\n<0.420,-0.907,0.024>,\r\n<0.330,-0.944,0.008>,\r\n<0.357,-0.934,-0.004>,\r\n<0.469,-0.883,-0.009>,\r\n<0.604,-0.797,-0.007>,\r\n<0.741,-0.672,-0.002>,\r\n<0.849,-0.528,0.004>,\r\n<0.920,-0.391,0.006>,\r\n<0.951,-0.310,0.003>,\r\n<0.937,-0.348,-0.005>,\r\n<0.880,-0.476,-0.017>,\r\n<0.779,-0.627,-0.028>,\r\n<0.650,-0.759,-0.032>,\r\n<0.522,-0.853,-0.024>,\r\n<0.446,-0.895,0.002>,\r\n<0.504,-0.863,0.037>,\r\n<0.654,-0.752,0.080>,\r\n<0.810,-0.577,0.106>,\r\n<0.920,-0.377,0.104>,\r\n<0.975,-0.209,0.069>,\r\n<0.992,-0.129,-0.010>,\r\n<0.966,-0.237,-0.099>,\r\n<0.857,-0.471,-0.208>,\r\n<0.826,-0.554,-0.106>,\r\n<0.819,-0.571,0.056>,\r\n<0.812,-0.562,0.158>,\r\n<0.893,-0.401,0.204>,\r\n<0.929,-0.358,0.093>,\r\n<0.934,-0.357,-0.006>,\r\n<0.936,-0.350,0.023>,\r\n<0.899,-0.392,0.196>,\r\n<0.826,-0.373,0.423>,\r\n<0.726,-0.248,0.642>,\r\n<0.575,-0.085,0.814>,\r\n<0.563,0.019,0.826>,\r\n<0.277,0.016,0.961>,\r\n<0.154,0.008,0.988>,\r\n<0.068,0.004,0.998>,\r\n<0.020,0,1>,\r\n<-0.001,0,1>,\r\n<-0.006,0,1>,\r\n<-0.006,0,1>,\r\n<-0.006,0,1>,\r\n<-0.007,0,1>,\r\n<-0.009,0,1>,\r\n<0.270,-0.001,0.963>,\r\nz,<0.227,-0.001,0.974>,\r\n<0.085,0,0.996>,\r\n<0.343,-0.007,0.939>,\r\n<0.300,-0.025,0.954>,\r\n<0.433,-0.014,0.901>,\r\n<0.582,0.086,0.809>,\r\n<0.728,0.255,0.636>,\r\n<0.829,0.374,0.415>,\r\n<0.902,0.389,0.189>,\r\n<0.937,0.349,0.020>,\r\n<0.935,0.354,-0.004>,\r\n<0.915,0.387,0.111>,\r\n<0.876,0.444,0.189>,\r\n<0.821,0.550,0.150>,\r\n<0.858,0.514,0.029>,\r\n<0.833,0.530,-0.157>,\r\n<0.870,0.444,-0.216>,\r\n<0.977,0.203,-0.060>,\r\n<0.991,0.136,0.015>,\r\n<0.966,0.245,0.082>,\r\n<0.900,0.422,0.109>,\r\n<0.778,0.620,0.105>,\r\n<0.614,0.786,0.073>,\r\n<0.469,0.883,0.028>,\r\n<0.450,0.893,-0.011>,\r\n<0.558,0.829,-0.037>,\r\n<0.694,0.719,-0.040>,\r\n<0.823,0.567,-0.031>,\r\n<0.913,0.407,-0.015>,\r\n<0.956,0.292,-0.002>,\r\n<0.955,0.296,0.006>,\r\n<0.911,0.411,0.010>,\r\n<0.827,0.562,0.008>,\r\n<0.703,0.711,0.002>,\r\n<0.555,0.832,-0.003>,\r\n<0.411,0.911,-0.005>,\r\n<0.305,0.952,0>,\r\n<0.311,0.950,0.009>,\r\n<0.434,0.901,0.025>,\r\n<0.562,0.827,0.035>,\r\n<0.646,0.763,-0.009>\r\n<0.513,-0.858,-0.017>,\r\n<0.448,-0.894,0.012>,\r\n<0.370,-0.929,0.008>,\r\n<0.382,-0.924,-0.010>,\r\n<0.482,-0.876,-0.018>,\r\n<0.609,-0.793,-0.018>,\r\n<0.741,-0.672,-0.015>,\r\n<0.848,-0.529,-0.006>,\r\n<0.921,-0.390,0>,\r\n<0.954,-0.300,0.002>,\r\n<0.943,-0.333,-0.002>,\r\n<0.886,-0.463,-0.011>,\r\n<0.784,-0.620,-0.021>,\r\n<0.647,-0.762,-0.026>,\r\n<0.501,-0.865,-0.023>,\r\n<0.392,-0.920,-0.004>,\r\n<0.435,-0.900,0.024>,\r\n<0.602,-0.796,0.058>,\r\n<0.783,-0.616,0.090>,\r\n<0.919,-0.383,0.096>,\r\n<0.984,-0.162,0.080>,\r\n<1,0.008,0.014>,\r\n<0.996,-0.066,-0.060>,\r\n<0.926,-0.356,-0.124>,\r\n<0.789,-0.599,-0.137>,\r\n<0.700,-0.705,-0.114>,\r\n<0.658,-0.748,0.090>,\r\n<0.805,-0.568,0.170>,\r\n<0.918,-0.329,0.223>,\r\n<0.974,-0.198,0.113>,\r\n<0.960,-0.278,0.033>,\r\n<0.944,-0.330,0>,\r\n<0.952,-0.308,0>,\r\n<0.951,-0.306,0.052>,\r\n<0.955,-0.287,0.071>,\r\n<0.949,-0.237,0.208>,\r\n<0.881,-0.297,0.368>,\r\n<0.805,-0.315,0.503>,\r\n<0.745,-0.162,0.648>,\r\n<0.663,-0.082,0.744>,\r\n<0.588,-0.028,0.808>,\r\n<0.505,-0.003,0.863>,\r\n<0.456,0.004,0.890>,\r\n<0.426,0,0.905>,\r\n<0.414,-0.004,0.910>,\r\n<0.425,-0.009,0.905>,\r\n<0.443,0.259,0.858>,\r\n<0.513,-0.012,0.858>,\r\n<0.560,-0.023,0.828>,\r\n<0.621,0.041,0.783>,\r\n<0.696,0.073,0.714>,\r\n<0.763,0.191,0.617>,\r\n<0.834,0.216,0.508>,\r\n<0.887,0.288,0.361>,\r\n<0.965,0.135,0.225>,\r\n<0.959,0.280,0.049>,\r\n<0.957,0.290,0.011>,\r\n<0.952,0.307,-0.002>,\r\n<0.944,0.330,0>,\r\n<0.968,0.248,0.047>,\r\n<0.960,0.219,0.173>,\r\n<0.892,0.387,0.232>,\r\n<0.757,0.635,0.154>,\r\n<0.656,0.755,0.015>,\r\n<0.753,0.637,-0.165>,\r\n<0.839,0.531,-0.121>,\r\n<0.954,0.282,-0.100>,\r\n<0.999,0.037,-0.035>,\r\n<0.999,0.027,0.045>,\r\n<0.972,0.214,0.095>,\r\n<0.891,0.441,0.105>,\r\n<0.737,0.670,0.091>,\r\n<0.547,0.835,0.049>,\r\n<0.394,0.919,0.010>,\r\n<0.405,0.914,-0.019>,\r\n<0.546,0.837,-0.033>,\r\n<0.699,0.714,-0.030>,\r\n<0.834,0.552,-0.019>,\r\n<0.922,0.387,-0.007>,\r\n<0.962,0.275,0.003>,\r\n<0.958,0.288,0.007>,\r\n<0.912,0.411,0.004>,\r\n<0.827,0.562,-0.003>,\r\n<0.704,0.710,-0.011>,\r\n<0.560,0.828,-0.017>,\r\n<0.427,0.904,-0.017>,\r\n<0.332,0.943,-0.008>,\r\n<0.352,0.936,0.015>,\r\n<0.460,0.888,0.028>,\r\n<0.537,0.843,-0.007>\r\n<0.445,-0.895,-0.022>,\r\n<0.410,-0.912,-0.009>,\r\n<0.415,-0.910,-0.018>,\r\n<0.499,-0.866,-0.031>,\r\n<0.614,-0.788,-0.033>,\r\n<0.739,-0.673,-0.025>,\r\n<0.844,-0.536,-0.017>,\r\n<0.918,-0.398,-0.005>,\r\n<0.953,-0.304,0.002>,\r\n<0.944,-0.331,0.005>,\r\n<0.890,-0.457,0>,\r\n<0.789,-0.614,-0.010>,\r\n<0.647,-0.762,-0.019>,\r\n<0.492,-0.870,-0.023>,\r\n<0.357,-0.934,-0.011>,\r\n<0.378,-0.926,0.010>,\r\n<0.552,-0.833,0.042>,\r\n<0.749,-0.659,0.073>,\r\n<0.908,-0.409,0.090>,\r\n<0.984,-0.154,0.085>,\r\n<0.995,0.087,0.047>,\r\n<0.995,0.095,-0.016>,\r\n<0.976,-0.200,-0.088>,\r\n<0.836,-0.533,-0.133>,\r\n<0.639,-0.757,-0.137>,\r\n<0.506,-0.862,-0.024>,\r\n<0.660,-0.746,0.093>,\r\n<0.884,-0.436,0.169>,\r\n<0.977,-0.111,0.181>,\r\n<0.998,-0.069,-0.003>,\r\n<0.962,-0.235,-0.141>,\r\n<0.947,-0.322,0>,\r\n<0.925,-0.379,0.017>,\r\n<0.922,-0.351,0.161>,\r\n<0.958,-0.234,0.165>,\r\n<0.977,-0.214,0.009>,\r\n<0.974,-0.221,0.041>,\r\n<0.982,-0.187,0>,\r\n<0.981,-0.176,0.081>,\r\n<0.965,-0.166,0.205>,\r\n<0.965,-0.143,0.218>,\r\n<0.948,-0.122,0.294>,\r\n<0.932,-0.085,0.352>,\r\n<0.922,-0.049,0.385>,\r\n<0.918,-0.011,0.395>,\r\n<0.916,0.030,0.400>,\r\n<0.934,0.071,0.351>,\r\n<0.889,0.104,0.446>,\r\n<0.964,0.112,0.243>,\r\n<0.914,0.158,0.373>,\r\n<0.983,0.156,0.102>,\r\n<0.970,0.187,0.154>,\r\n<0.983,0.184,-0.006>,\r\n<0.954,0.242,0.179>,\r\n<0.963,0.253,0.093>,\r\n<0.937,0.292,0.190>,\r\n<0.942,0.317,0.112>,\r\n<0.948,0.318,-0.008>,\r\n<0.947,0.321,0>,\r\n<0.980,0.187,-0.066>,\r\n<0.994,0.078,0.080>,\r\n<0.954,0.216,0.207>,\r\n<0.826,0.538,0.172>,\r\n<0.591,0.804,0.064>,\r\n<0.552,0.832,-0.050>,\r\n<0.726,0.675,-0.130>,\r\n<0.895,0.431,-0.117>,\r\n<0.992,0.111,-0.057>,\r\n<0.994,-0.112,0.004>,\r\n<0.997,-0.027,0.070>,\r\n<0.972,0.215,0.096>,\r\n<0.869,0.485,0.096>,\r\n<0.687,0.723,0.068>,\r\n<0.484,0.875,0.030>,\r\n<0.335,0.942,0>,\r\n<0.382,0.924,-0.023>,\r\n<0.546,0.837,-0.027>,\r\n<0.708,0.706,-0.019>,\r\n<0.842,0.539,-0.010>,\r\n<0.926,0.377,0.002>,\r\n<0.963,0.269,0.007>,\r\n<0.957,0.289,0.003>,\r\n<0.910,0.416,-0.005>,\r\n<0.824,0.566,-0.018>,\r\n<0.705,0.709,-0.029>,\r\n<0.570,0.821,-0.035>,\r\n<0.451,0.892,-0.030>,\r\n<0.375,0.927,-0.007>,\r\n<0.398,0.917,0.002>,\r\n<0.452,0.892,-0.016>\r\n<0.431,-0.902,-0.021>,\r\n<0.451,-0.892,-0.027>,\r\n<0.519,-0.854,-0.041>,\r\n<0.622,-0.782,-0.047>,\r\n<0.736,-0.676,-0.043>,\r\n<0.837,-0.547,-0.028>,\r\n<0.910,-0.414,-0.013>,\r\n<0.948,-0.319,0.002>,\r\n<0.940,-0.341,0.009>,\r\n<0.888,-0.459,0.009>,\r\n<0.794,-0.608,0.002>,\r\n<0.653,-0.758,-0.009>,\r\n<0.493,-0.870,-0.019>,\r\n<0.338,-0.941,-0.017>,\r\n<0.330,-0.944,0>,\r\n<0.502,-0.864,0.028>,\r\n<0.708,-0.704,0.060>,\r\n<0.886,-0.456,0.081>,\r\n<0.981,-0.172,0.088>,\r\n<0.992,0.101,0.076>,\r\n<0.978,0.209,0.015>,\r\n<0.999,-0.035,-0.031>,\r\n<0.910,-0.402,-0.096>,\r\n<0.699,-0.704,-0.127>,\r\n<0.435,-0.895,-0.094>,\r\n<0.446,-0.895,0>,\r\n<0.760,-0.642,0.103>,\r\n<0.951,-0.265,0.156>,\r\n<0.983,0.103,0.154>,\r\n<0.989,0.146,0.033>,\r\n<0.934,-0.275,-0.228>,\r\n<0.857,-0.479,-0.189>,\r\n<0.855,-0.515,0.062>,\r\n<0.862,-0.458,0.216>,\r\n<0.956,-0.132,0.263>,\r\n<0.997,-0.070,0.045>,\r\n<0.980,-0.200,0.002>,\r\n<0.977,-0.213,-0.008>,\r\n<0.954,-0.267,0.134>,\r\n<0.957,-0.140,0.253>,\r\n<0.980,-0.050,0.193>,\r\n<0.996,-0.089,0.016>,\r\n<0.998,-0.061,-0.003>,\r\n<1,-0.036,0>,\r\n<0.986,-0.031,0.162>,\r\n<0.973,0.025,0.229>,\r\n<0.994,0.063,0.094>,\r\n<0.998,0.060,-0.004>,\r\n<1,0.041,0.003>,\r\n<0.981,0.117,0.152>,\r\n<0.968,0.204,0.147>,\r\n<0.986,0.167,-0.003>,\r\n<0.983,0.185,0>,\r\n<0.994,0.102,0.033>,\r\n<0.974,0.049,0.221>,\r\n<0.911,0.304,0.278>,\r\n<0.853,0.511,0.108>,\r\n<0.914,0.401,-0.057>,\r\n<0.912,0.355,-0.207>,\r\n<0.972,0.174,-0.157>,\r\n<0.983,-0.159,0.090>,\r\n<0.977,0.019,0.211>,\r\n<0.891,0.417,0.178>,\r\n<0.634,0.770,0.076>,\r\n<0.413,0.911,-0.008>,\r\n<0.539,0.833,-0.124>,\r\n<0.786,0.607,-0.120>,\r\n<0.953,0.291,-0.085>,\r\n<0.998,-0.057,-0.017>,\r\n<0.976,-0.219,0.019>,\r\n<0.996,-0.028,0.087>,\r\n<0.963,0.250,0.097>,\r\n<0.836,0.542,0.080>,\r\n<0.641,0.766,0.046>,\r\n<0.426,0.905,0.011>,\r\n<0.297,0.955,-0.014>,\r\n<0.379,0.925,-0.027>,\r\n<0.554,0.832,-0.022>,\r\n<0.717,0.697,-0.011>,\r\n<0.847,0.532,0>,\r\n<0.926,0.377,0.007>,\r\n<0.961,0.276,0.008>,\r\n<0.953,0.303,0>,\r\n<0.903,0.430,-0.016>,\r\n<0.819,0.573,-0.036>,\r\n<0.705,0.708,-0.049>,\r\n<0.583,0.811,-0.048>,\r\n<0.478,0.877,-0.036>,\r\n<0.420,0.907,-0.021>,\r\n<0.417,0.909,-0.023>\r\n<0.487,-0.873,-0.015>,\r\n<0.540,-0.840,-0.042>,\r\n<0.630,-0.775,-0.052>,\r\n<0.732,-0.679,-0.050>,\r\n<0.826,-0.562,-0.041>,\r\n<0.899,-0.437,-0.021>,\r\n<0.938,-0.346,-0.002>,\r\n<0.932,-0.361,0.012>,\r\n<0.883,-0.469,0.017>,\r\n<0.795,-0.606,0.012>,\r\n<0.662,-0.749,0.002>,\r\n<0.505,-0.863,-0.012>,\r\n<0.339,-0.941,-0.021>,\r\n<0.298,-0.954,-0.014>,\r\n<0.458,-0.889,0.010>,\r\n<0.668,-0.743,0.045>,\r\n<0.857,-0.510,0.077>,\r\n<0.973,-0.215,0.088>,\r\n<0.993,0.069,0.095>,\r\n<0.959,0.280,0.035>,\r\n<0.992,0.124,0.009>,\r\n<0.969,-0.239,-0.062>,\r\n<0.792,-0.601,-0.105>,\r\n<0.498,-0.855,-0.145>,\r\n<0.291,-0.956,-0.044>,\r\n<0.539,-0.842,0>,\r\n<0.866,-0.487,0.115>,\r\n<0.987,-0.057,0.151>,\r\n<0.955,0.290,0.067>,\r\n<0.988,0.153,0.025>,\r\n<0.944,-0.313,-0.102>,\r\n<0.761,-0.608,-0.228>,\r\n<0.667,-0.744,0.032>,\r\n<0.882,-0.436,0.179>,\r\n<0.970,0.062,0.234>,\r\n<0.998,0.058,0.025>,\r\n<0.976,-0.150,-0.160>,\r\n<0.942,-0.334,-0.038>,\r\n<0.879,-0.450,0.158>,\r\n<0.941,-0.201,0.271>,\r\n<0.953,0.114,0.281>,\r\n<0.993,0.116,0.013>,\r\n<0.999,-0.046,0.001>,\r\n<0.975,-0.220,-0.011>,\r\n<0.934,-0.256,0.251>,\r\n<0.945,0.097,0.313>,\r\n<0.937,0.303,0.177>,\r\n<0.986,0.165,-0.009>,\r\n<0.996,-0.083,0.017>,\r\n<0.984,-0.040,0.175>,\r\n<0.934,0.323,0.151>,\r\n<0.947,0.321,-0.024>,\r\n<0.980,0.133,-0.145>,\r\n<0.999,0.002,0.052>,\r\n<0.974,-0.044,0.223>,\r\n<0.936,0.275,0.220>,\r\n<0.769,0.631,0.102>,\r\n<0.772,0.625,-0.116>,\r\n<0.879,0.395,-0.266>,\r\n<0.993,0.082,-0.085>,\r\n<0.962,-0.262,0.077>,\r\n<0.965,-0.196,0.173>,\r\n<0.959,0.231,0.164>,\r\n<0.750,0.655,0.094>,\r\n<0.409,0.913,-0.018>,\r\n<0.339,0.938,-0.076>,\r\n<0.623,0.771,-0.130>,\r\n<0.865,0.490,-0.110>,\r\n<0.989,0.138,-0.059>,\r\n<0.977,-0.215,0.002>,\r\n<0.961,-0.268,0.062>,\r\n<0.995,0.005,0.099>,\r\n<0.948,0.306,0.084>,\r\n<0.799,0.598,0.063>,\r\n<0.591,0.806,0.025>,\r\n<0.373,0.928,-0.004>,\r\n<0.268,0.963,-0.013>,\r\n<0.391,0.920,-0.029>,\r\n<0.566,0.824,-0.017>,\r\n<0.725,0.689,-0.003>,\r\n<0.847,0.531,0.011>,\r\n<0.921,0.389,0.019>,\r\n<0.954,0.299,0.012>,\r\n<0.943,0.331,-0.009>,\r\n<0.891,0.454,-0.031>,\r\n<0.809,0.585,-0.048>,\r\n<0.704,0.708,-0.053>,\r\n<0.596,0.801,-0.052>,\r\n<0.506,0.861,-0.041>,\r\n<0.457,0.889,-0.019>\r\n<0.577,-0.817,-0.010>,\r\n<0.640,-0.767,-0.048>,\r\n<0.728,-0.683,-0.055>,\r\n<0.815,-0.578,-0.046>,\r\n<0.884,-0.467,-0.028>,\r\n<0.922,-0.388,0>,\r\n<0.917,-0.397,0.018>,\r\n<0.872,-0.489,0.026>,\r\n<0.793,-0.609,0.023>,\r\n<0.672,-0.741,0.009>,\r\n<0.523,-0.852,-0.008>,\r\n<0.366,-0.930,-0.033>,\r\n<0.293,-0.956,-0.028>,\r\n<0.425,-0.905,-0.012>,\r\n<0.631,-0.775,0.021>,\r\n<0.826,-0.560,0.061>,\r\n<0.958,-0.272,0.093>,\r\n<0.994,0.020,0.105>,\r\n<0.951,0.295,0.093>,\r\n<0.963,0.265,0.039>,\r\n<0.996,-0.079,-0.031>,\r\n<0.886,-0.454,-0.095>,\r\n<0.627,-0.768,-0.127>,\r\n<0.302,-0.942,-0.148>,\r\n<0.303,-0.951,-0.068>,\r\n<0.685,-0.728,0.032>,\r\n<0.942,-0.310,0.125>,\r\n<0.966,0.186,0.181>,\r\n<0.923,0.382,0.044>,\r\n<0.998,0.058,-0.002>,\r\n<0.902,-0.418,-0.104>,\r\n<0.623,-0.769,-0.144>,\r\n<0.640,-0.768,-0.003>,\r\n<0.937,-0.329,0.114>,\r\n<0.953,0.219,0.211>,\r\n<0.954,0.297,0.042>,\r\n<0.962,-0.180,-0.204>,\r\n<0.821,-0.554,-0.140>,\r\n<0.830,-0.550,0.091>,\r\n<0.963,-0.183,0.199>,\r\n<0.946,0.269,0.182>,\r\n<0.978,0.209,-0.014>,\r\n<0.987,-0.049,-0.150>,\r\n<0.946,-0.319,-0.048>,\r\n<0.904,-0.389,0.175>,\r\n<0.974,0.082,0.210>,\r\n<0.899,0.404,0.167>,\r\n<0.963,0.265,-0.041>,\r\n<0.991,-0.134,-0.020>,\r\n<0.987,-0.103,0.122>,\r\n<0.938,0.344,0.043>,\r\n<0.866,0.489,-0.107>,\r\n<0.979,0.119,-0.163>,\r\n<0.968,-0.251,0.021>,\r\n<0.957,-0.221,0.186>,\r\n<0.955,0.208,0.211>,\r\n<0.723,0.686,0.082>,\r\n<0.626,0.775,-0.088>,\r\n<0.816,0.551,-0.177>,\r\n<0.986,0.140,-0.088>,\r\n<0.946,-0.321,0.050>,\r\n<0.927,-0.342,0.157>,\r\n<0.986,0.034,0.165>,\r\n<0.850,0.517,0.105>,\r\n<0.527,0.850,0.008>,\r\n<0.238,0.970,-0.051>,\r\n<0.402,0.901,-0.164>,\r\n<0.726,0.674,-0.136>,\r\n<0.938,0.334,-0.092>,\r\n<1,-0.032,0.006>,\r\n<0.945,-0.321,0.056>,\r\n<0.966,-0.229,0.120>,\r\n<0.993,0.062,0.099>,\r\n<0.924,0.373,0.082>,\r\n<0.757,0.652,0.050>,\r\n<0.542,0.840,0.028>,\r\n<0.329,0.944,-0.019>,\r\n<0.265,0.963,-0.041>,\r\n<0.414,0.910,-0.032>,\r\n<0.579,0.815,-0.006>,\r\n<0.730,0.683,0.019>,\r\n<0.841,0.540,0.033>,\r\n<0.909,0.416,0.028>,\r\n<0.940,0.342,0.013>,\r\n<0.928,0.373,-0.010>,\r\n<0.876,0.481,-0.037>,\r\n<0.799,0.599,-0.053>,\r\n<0.705,0.707,-0.061>,\r\n<0.612,0.789,-0.052>,\r\n<0.545,0.838,-0.014>\r\n<0.668,-0.744,-0.003>,\r\n<0.727,-0.686,-0.040>,\r\n<0.803,-0.594,-0.046>,\r\n<0.867,-0.497,-0.033>,\r\n<0.902,-0.432,-0.014>,\r\n<0.899,-0.437,0.010>,\r\n<0.861,-0.508,0.030>,\r\n<0.792,-0.610,0.033>,\r\n<0.685,-0.728,0.021>,\r\n<0.547,-0.837,0.003>,\r\n<0.400,-0.916,-0.018>,\r\n<0.300,-0.954,-0.026>,\r\n<0.386,-0.922,-0.027>,\r\n<0.579,-0.815,0.011>,\r\n<0.779,-0.625,0.051>,\r\n<0.934,-0.348,0.086>,\r\n<0.994,-0.042,0.106>,\r\n<0.962,0.245,0.121>,\r\n<0.931,0.358,0.070>,\r\n<0.994,0.101,0.033>,\r\n<0.960,-0.271,-0.073>,\r\n<0.753,-0.644,-0.138>,\r\n<0.441,-0.883,-0.164>,\r\n<0.190,-0.975,-0.111>,\r\n<0.402,-0.911,-0.092>,\r\n<0.789,-0.610,0.067>,\r\n<0.984,-0.112,0.142>,\r\n<0.910,0.369,0.187>,\r\n<0.911,0.401,0.097>,\r\n<0.998,-0.045,-0.041>,\r\n<0.836,-0.533,-0.128>,\r\n<0.527,-0.843,-0.111>,\r\n<0.642,-0.767,-0.017>,\r\n<0.955,-0.265,0.133>,\r\n<0.919,0.346,0.190>,\r\n<0.929,0.359,0.088>,\r\n<0.976,-0.210,-0.049>,\r\n<0.742,-0.653,-0.150>,\r\n<0.750,-0.660,0.043>,\r\n<0.975,-0.153,0.159>,\r\n<0.904,0.399,0.156>,\r\n<0.900,0.435,0.005>,\r\n<0.982,-0.026,-0.189>,\r\n<0.837,-0.545,-0.046>,\r\n<0.850,-0.513,0.124>,\r\n<0.984,0.064,0.167>,\r\n<0.839,0.529,0.129>,\r\n<0.914,0.403,-0.050>,\r\n<0.976,-0.217,-0.017>,\r\n<0.975,-0.185,0.125>,\r\n<0.898,0.440,0.015>,\r\n<0.834,0.540,-0.118>,\r\n<0.985,0.152,-0.082>,\r\n<0.947,-0.322,-0.017>,\r\n<0.908,-0.364,0.205>,\r\n<0.991,0.086,0.107>,\r\n<0.752,0.660,-0.011>,\r\n<0.514,0.855,-0.074>,\r\n<0.713,0.685,-0.152>,\r\n<0.969,0.239,-0.068>,\r\n<0.951,-0.302,0.064>,\r\n<0.871,-0.467,0.152>,\r\n<0.974,-0.144,0.177>,\r\n<0.926,0.346,0.150>,\r\n<0.648,0.761,0.036>,\r\n<0.258,0.962,-0.089>,\r\n<0.213,0.966,-0.147>,\r\n<0.543,0.827,-0.144>,\r\n<0.840,0.536,-0.089>,\r\n<0.989,0.145,-0.016>,\r\n<0.973,-0.217,0.078>,\r\n<0.929,-0.359,0.090>,\r\n<0.982,-0.149,0.119>,\r\n<0.982,0.148,0.116>,\r\n<0.885,0.455,0.098>,\r\n<0.700,0.712,0.050>,\r\n<0.486,0.874,-0.012>,\r\n<0.292,0.956,-0.033>,\r\n<0.292,0.956,-0.035>,\r\n<0.449,0.893,-0.014>,\r\n<0.606,0.795,0.009>,\r\n<0.743,0.669,0.025>,\r\n<0.838,0.544,0.032>,\r\n<0.896,0.444,0.024>,\r\n<0.922,0.387,0>,\r\n<0.909,0.417,-0.021>,\r\n<0.861,0.508,-0.042>,\r\n<0.788,0.613,-0.052>,\r\n<0.706,0.707,-0.042>,\r\n<0.642,0.767,-0.002>\r\n<0.728,-0.685,0.030>\r\n<0.782,-0.624,-0.005>\r\n<0.845,-0.534,-0.014>\r\n<0.887,-0.462,-0.019>\r\n<0.894,-0.447,-0.022>\r\n<0.866,-0.499,-0.011>\r\n<0.812,-0.584,-0.005>\r\n<0.724,-0.689,-0.011>\r\n<0.599,-0.800,-0.027>\r\n<0.453,-0.890,-0.045>\r\n<0.323,-0.945,-0.045>\r\n<0.313,-0.950,0.013>\r\n<0.492,-0.870,0.042>\r\n<0.684,-0.723,0.098>\r\n<0.868,-0.473,0.150>\r\n<0.971,-0.160,0.179>\r\n<0.973,0.143,0.181>\r\n<0.921,0.365,0.139>\r\n<0.951,0.306,0.042>\r\n<0.998,-0.044,-0.045>\r\n<0.889,-0.433,-0.147>\r\n<0.605,-0.768,-0.209>\r\n<0.266,-0.938,-0.221>\r\n<0.163,-0.983,-0.082>\r\n<0.529,-0.849,-0.016>\r\n<0.875,-0.459,0.152>\r\n<0.976,0.094,0.196>\r\n<0.865,0.466,0.189>\r\n<0.916,0.383,0.116>\r\n<0.989,-0.129,-0.075>\r\n<0.732,-0.653,-0.195>\r\n<0.418,-0.902,-0.105>\r\n<0.667,-0.745,0.018>\r\n<0.971,-0.156,0.183>\r\n<0.875,0.448,0.183>\r\n<0.925,0.363,0.114>\r\n<0.968,-0.248,-0.034>\r\n<0.675,-0.728,-0.120>\r\n<0.714,-0.700,0.017>\r\n<0.984,-0.117,0.131>\r\n<0.863,0.485,0.140>\r\n<0.862,0.507,0.014>\r\n<0.995,-0.062,-0.076>\r\n<0.781,-0.624,-0.029>\r\n<0.811,-0.580,0.077>\r\n<0.992,0.039,0.117>\r\n<0.808,0.581,0.093>\r\n<0.868,0.495,-0.043>\r\n<0.973,-0.231,0.017>\r\n<0.967,-0.228,0.114>\r\n<0.891,0.455,-0.007>\r\n<0.782,0.618,-0.083>\r\n<0.974,0.185,-0.128>\r\n<0.899,-0.437,0.016>\r\n<0.866,-0.425,0.263>\r\n<0.996,0.084,0.023>\r\n<0.823,0.567,-0.036>\r\n<0.505,0.860,-0.069>\r\n<0.604,0.785,-0.137>\r\n<0.926,0.366,-0.094>\r\n<0.975,-0.204,0.085>\r\n<0.840,-0.522,0.152>\r\n<0.907,-0.327,0.265>\r\n<0.952,0.177,0.248>\r\n<0.751,0.655,0.084>\r\n<0.357,0.932,-0.059>\r\n<0.133,0.983,-0.126>\r\n<0.366,0.912,-0.185>\r\n<0.692,0.705,-0.153>\r\n<0.941,0.319,-0.114>\r\n<0.998,-0.067,0>\r\n<0.922,-0.384,0.041>\r\n<0.932,-0.314,0.180>\r\n<0.979,-0.034,0.203>\r\n<0.939,0.291,0.183>\r\n<0.806,0.580,0.121>\r\n<0.600,0.797,0.070>\r\n<0.388,0.921,0.019>\r\n<0.252,0.968,-0.018>\r\n<0.348,0.935,-0.069>\r\n<0.513,0.857,-0.051>\r\n<0.664,0.747,-0.030>\r\n<0.780,0.625,-0.012>\r\n<0.854,0.519,-0.007>\r\n<0.899,0.438,-0.016>\r\n<0.913,0.407,-0.022>\r\n<0.890,0.455,-0.017>\r\n<0.838,0.546,-0.011>\r\n<0.766,0.643,-0.001>\r\n<0.706,0.708,0.035>\r\n}\r\nuv_vectors {\r\nnx*ny,\r\n#local i=0;\r\n#while (i<nx)\r\n  #local j=0;\r\n  #while (j<ny)\r\n    #if((j < ny-1) & (i < nx-1))\r\n      <i/(nx-1), j/(ny-1)>,\r\n    #else\r\n      <i/(nx-1), j/(ny-1)>\r\n    #end\r\n    #local j=j+1;\r\n  #end\r\n  #local i=i+1;\r\n#end\r\n}\r\nface_indices {\r\n15842\r\n#local i=0;\r\n#while (i<nx)\r\n  #local j=0;\r\n  #while (j<ny)\r\n    #if (((j+1) <= (ny-1)) & ((i+1) <= (nx-1)))\r\n      <i*ny+j, i*ny+j+1, (i+1)*ny+j>\r\n    #end\r\n    #if (((j-1) >= 0) & ((i-1) >= 0))\r\n      <i*ny+j, i*ny+j-1, (i-1)*ny+j>\r\n    #end\r\n    #local j=j+1;\r\n  #end\r\n  #local i=i+1;\r\n#end\r\n}\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/gamma_showcase.pov",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\n\n// Persistence of Vision Ray Tracer Scene Description File\n// File: gamma_showcase.pov\n// Vers: 3.7\n// Desc: Gamma Handling Test Scene - An arrangement of spheres on a marble plane\n// Date: 2010-12-21\n// Auth: Christoph Lipka\n//\n\n// +w640 +h480 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase.png\n// +w640 +h480 +a0.3 +am1 +fN -d File_Gamma=1.0  Output_File_Name=gamma_showcase_linear.png\n// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref0.png Declare=Stripes=off\n// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref1.png Declare=Stripes=off Declare=Gamma=1.2\n// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref2.png Declare=Stripes=off Declare=Gamma=0.8\n// +w640 +h480 +a0.3 +am1 -f +d\n\n#version 3.7;\n\n#include \"colors.inc\"\n#include \"stones.inc\"\n\n#ifndef (Stripes)\n  #declare Stripes = on;\n#end\n#ifndef (Gamma)\n  #declare Gamma   = 1.0;\n#end\n\nglobal_settings {\n  max_trace_level 5\n  assumed_gamma 1.0\n  radiosity {\n    pretrace_start 0.08\n    pretrace_end   0.01\n    count 35\n    nearest_count 5\n    error_bound 1.8\n    recursion_limit 2\n    low_error_factor .5\n    gray_threshold 0.0\n    minimum_reuse 0.015\n    brightness 1\n    adc_bailout 0.01/2\n  }\n}\n\n#default {\n  texture {\n    pigment {rgb 1}\n    finish {\n      ambient 0.0\n      diffuse 0.6\n      specular 0.6 roughness 0.001\n      reflection { 0.0 1.0 fresnel on }\n      conserve_energy\n    }\n  }\n}\n\n// ----------------------------------------\n\n#local TestRed   = rgb <0.5,0.1,0.1>;\n#local TestGreen = rgb <0.1,0.5,0.1>;\n#local TestBlue  = rgb <0.1,0.1,0.5>;\n\n#local CameraFocus = <0,0.5,0>;\n#local CameraDist  = 8;\n#local CameraDepth = 1.8;\n#local CameraTilt  = 20;\n\ncamera {\n  location  <0,0,0>\n  direction z*CameraDepth\n  right     x*image_width/image_height\n  up        y\n  translate <0,0,-CameraDist>\n  rotate    x*CameraTilt\n  translate CameraFocus\n}\n\n#macro LightSource(Pos,Color)\n  light_source {\n    Pos\n    color Color\n    spotlight\n    point_at <0,0,0>\n    radius  175/vlength(Pos)\n    falloff 200/vlength(Pos)\n    area_light x*vlength(Pos)/10, y*vlength(Pos)/10, 9,9 adaptive 1 jitter circular orient\n  }\n  \n#end\n\nLightSource(<-500,500,-500>,TestRed   + <0.2,0.2,0.2>)\nLightSource(<   0,500,-500>,TestGreen + <0.2,0.2,0.2>)\nLightSource(< 500,500,-500>,TestBlue  + <0.2,0.2,0.2>)\n\n// ----------------------------------------\n\n#macro DarkStripeBW(TargetBrightness)\n  #if (TargetBrightness < 0.5)\n    (0.0)\n  #else\n    (TargetBrightness*2 - 1.0)\n  #end\n#end\n\n#macro BrightStripeBW(TargetBrightness)\n  #if (TargetBrightness < 0.5)\n    (TargetBrightness*2)\n  #else\n    (1.0)\n  #end\n#end\n\n#macro DarkStripeRGB(TargetColor)\n  <DarkStripeBW(TargetColor.red),DarkStripeBW(TargetColor.green),DarkStripeBW(TargetColor.blue)>\n#end\n\n#macro BrightStripeRGB(TargetColor)\n  <BrightStripeBW(TargetColor.red),BrightStripeBW(TargetColor.green),BrightStripeBW(TargetColor.blue)>\n#end\n\n#macro StripedPigment(TargetColor)\n  #if (Stripes)\n    function { abs(mod(abs(image_height*CameraDepth*y/z+0.5),2.0)-1.0) }\n    color_map {\n      [0.5 color rgb DarkStripeRGB(TargetColor) ]\n      [0.5 color rgb BrightStripeRGB(TargetColor) ]\n    }\n    translate <0,0,-CameraDist>\n    rotate x*CameraTilt\n    translate CameraFocus\n  #else\n    color TargetColor\n  #end\n#end\n\n\nplane {\n  y, 0\n  texture { T_Stone11 }\n  interior { ior 1.5 }\n}\n\n#macro GammaAdjust(C,G)\n  #local C2 = color rgbft <pow(C.red,G),pow(C.green,G),pow(C.blue,G),pow(C.filter,G),pow(C.transmit,G)>;\n  (C2)\n#end\n\n#macro TestSphere(Pos,Radius,TargetColor,Split)\n  sphere {\n    Pos + y*Radius, Radius\n    texture { pigment { color GammaAdjust(TargetColor,Gamma) } }\n    interior { ior 1.5 }\n  }\n  #if (Split)\n    sphere {\n      Pos + y*Radius + x*0.001, Radius\n      texture { pigment { StripedPigment(TargetColor) } }\n      interior { ior 1.5 }\n    }\n  #end\n#end\n\nTestSphere(<-2,0,1>, 1, TestRed,   true)\nTestSphere(< 0,0,1>, 1, TestGreen, true)\nTestSphere(< 2,0,1>, 1, TestBlue,  true)\n\n#local Steps = 6;\n#for(I,0,1,1/Steps)\n  #if (I < 0.5)\n    #local Color2 = TestRed;\n  #else\n    #local Color2 = TestBlue;\n  #end\n  #local P = abs(I-0.5)*2;\n  TestSphere(<I*4-2,0,-0.5>, 2/Steps, (1-P)*TestGreen + P*Color2, true)\n#end\n\n#local Steps = 8;\n#for(I,0,1,1/Steps)\n  TestSphere(<I*4-2,0,-1.5>, 2/Steps, rgb I, true)\n  TestSphere(<I*4-2,0,-2.0>, 2/Steps, GammaAdjust(rgb I, 2.2*Gamma), false)\n#end\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/sky.inc",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Persistence Of Vision Ray Tracer Include File\r\n// File: sky.inc\r\n// Desc: sky for 'balcony.pov' demonstration scene\r\n// Date: July/August 2001\r\n// Auth: Christoph Hormann\r\n\r\n// Updated: 09Aug2008 (jh) for v3.7 distribution\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (version < 3.7)\r\n  #version 3.5;\r\n#end\r\n\r\n#local P_Clouds=\r\npigment {\r\n   gradient z\r\n   pigment_map {\r\n     [ 0.0 color rgbt 1]\r\n     [ 0.1\r\n       bozo\r\n       color_map {\r\n         [0.0 color rgbt < 0.85, 0.88, 0.94, 0.0>]\r\n         [0.15 color rgbt < 0.91, 0.96, 0.99, 0.0>]\r\n         [0.35 color rgbt < 0.91, 0.96, 0.99, 1.0>]\r\n       }\r\n       turbulence 0.75\r\n       lambda 2.4\r\n       omega 0.6\r\n       octaves 8\r\n       scale <0.4,0.4,0.15>\r\n     ]\r\n     [ 0.4\r\n       bozo\r\n       color_map {\r\n         [0.0 color rgbt < 0.85, 0.88, 0.94, 0.0>]\r\n         [0.15 color rgbt < 0.91, 0.96, 0.99, 0.0>]\r\n         [0.35 color rgbt < 0.91, 0.96, 0.99, 1.0>]\r\n       }\r\n       turbulence 0.75\r\n       lambda 2.4\r\n       omega 0.6\r\n       octaves 8\r\n       scale <0.4,0.4,0.15>\r\n     ]\r\n     [ 0.65 color rgbt 1]\r\n\r\n   }\r\n   rotate 10*z\r\n}\r\n\r\n\r\n#local Tex_Sky =\r\ntexture {\r\n   pigment {\r\n     function { abs(z) }\r\n     color_map {\r\n       [0.0 color rgb < 0.640, 0.685, 0.800 >]\r\n       [0.3 color rgb < 0.400, 0.550, 0.900 >]\r\n     }\r\n     turbulence 0.05\r\n   }\r\n\r\n   finish {\r\n     diffuse 0\r\n     ambient 1\r\n   }\r\n}\r\ntexture {\r\n   pigment { P_Clouds }\r\n   finish {\r\n     diffuse 0\r\n     ambient 1\r\n   }\r\n}\r\n\r\n\r\nsphere {\r\n  <0, 0, 0>, 1\r\n  texture { Tex_Sky }\r\n  scale<1000000, 1000000, 300000>\r\n  no_shadow\r\n  hollow on\r\n  photons{ collect off }\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/table.inc",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Persistence Of Vision Ray Tracer Include File\r\n// File: table.inc\r\n// Desc: table for 'balcony.pov' demonstration scene\r\n// Date: July/August 2001\r\n// Auth: Christoph Hormann\r\n\r\n// Updated: 09Aug2008 (jh) for v3.7 distribution\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (version < 3.7)\r\n  #version 3.5;\r\n#end\r\n\r\n#declare Tex_Table_Foot=\r\ntexture {\r\n  pigment {\r\n    color rgb 0.4\r\n  }\r\n  finish {\r\n    ambient 0.0\r\n    diffuse 0.3\r\n    specular 0.4\r\n    roughness 0.01\r\n    metallic\r\n\r\n    reflection {\r\n      0.8\r\n      metallic\r\n    }\r\n  }\r\n}\r\n\r\n#declare Tex_Table_Foot_Bottom=\r\ntexture {\r\n  pigment {\r\n    color rgb 0.2\r\n  }\r\n  finish {\r\n    ambient 0.0\r\n    diffuse 0.3\r\n    specular 0.4\r\n    roughness 0.02\r\n  }\r\n}\r\n\r\n#declare Tex_Dark_Wood=\r\ntexture {\r\n  pigment {\r\n    bozo\r\n    color_map {\r\n      [0.3 color rgb <0.0,0.0,0.16> ]\r\n      [0.5 color rgb <0.0,0.0,0.08> ]\r\n      [0.7 color rgb <0.0,0.0,0.0> ]\r\n    }\r\n    scale <4,1,1>*0.036\r\n  }\r\n  finish {\r\n    ambient 0.09\r\n    diffuse 0.3\r\n    specular 0.5\r\n    roughness 0.025\r\n\r\n    reflection {\r\n      0.15\r\n      metallic\r\n    }\r\n  }\r\n  normal {\r\n    granite 0.1\r\n    scale 0.03\r\n    accuracy 0.007\r\n  }\r\n  scale 0.5\r\n  rotate 90*y\r\n}\r\n\r\n#declare Tex_Dark_Wood2 =\r\ntexture {\r\n  pigment {\r\n    wood\r\n    color_map {\r\n      [ 0.0000  color rgb<0.6431, 0.3176, 0.0824> ]\r\n      [ 0.1000  color rgb<0.6196, 0.2824, 0.0588> ]\r\n      [ 0.2000  color rgb<0.7137, 0.3725, 0.1529> ]\r\n      [ 0.3000  color rgb<0.7529, 0.4157, 0.1922> ]\r\n      [ 0.4000  color rgb<0.8157, 0.4941, 0.2588> ]\r\n      [ 0.5000  color rgb<0.7686, 0.4745, 0.2196> ]\r\n      [ 0.6000  color rgb<0.8471, 0.5647, 0.2980> ]\r\n      [ 0.7000  color rgb<0.8627, 0.5843, 0.3137> ]\r\n      [ 0.8000  color rgb<0.8902, 0.6314, 0.3529> ]\r\n      [ 0.9000  color rgb<0.8627, 0.6118, 0.3294> ]\r\n      [ 1.0000  color rgb<0.8392, 0.5922, 0.3098> ]\r\n    }\r\n\r\n    turbulence <0.075, 0.075, 0.65>\r\n    scale      <0.04, 0.04, 0.6>\r\n\r\n    scale 0.27\r\n    rotate 91*y\r\n    translate -0.1*z\r\n  }\r\n  finish {\r\n    ambient 0.0\r\n    diffuse 0.4\r\n    specular 0.3\r\n    roughness 0.025\r\n\r\n    reflection {\r\n      0.17\r\n      metallic\r\n    }\r\n  }\r\n  normal {\r\n    granite 0.015\r\n    scale <0.02, 0.02, 0.06>\r\n    rotate 91*y\r\n    accuracy 0.007\r\n  }\r\n}\r\n\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#include \"shapes.inc\"\r\n\r\n#declare Table_Height=0.66;\r\n\r\n#declare Table=\r\nunion {\r\n\r\n  torus { 0.49, 0.01 sturm rotate 90*x translate z*(Table_Height-0.01) }\r\n  cylinder { z*(Table_Height-0.05), z*(Table_Height-0.01), 0.5 }\r\n  cylinder { z*(Table_Height-0.01), z*Table_Height, 0.49 }\r\n\r\n  union {\r\n    cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x }\r\n    cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x rotate 120*z }\r\n    cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x rotate 240*z }\r\n\r\n    texture { Tex_Table_Foot }\r\n\r\n    rotate -70*z\r\n  }\r\n\r\n  union {\r\n    object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x }\r\n    object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x rotate 120*z }\r\n    object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x rotate 240*z }\r\n\r\n    texture { Tex_Table_Foot_Bottom }\r\n\r\n    rotate -70*z\r\n  }\r\n\r\n  texture { Tex_Dark_Wood2 }\r\n\r\n  #if (show_TableCloth)\r\n    scale <0.97, 0.97, 0.99>\r\n  #else\r\n    scale <0.97, 0.97, 1.00>\r\n  #end\r\n}\r\n\r\nobject { Table translate <3.3,2.52,0> }\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/table_cloth.inc",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Persistence Of Vision Ray Tracer Include File\r\n// File: table_cloth.inc\r\n// Desc: table cloth for 'balcony.pov' demonstration scene\r\n// Date: July/August 2001\r\n// Auth: Christoph Hormann\r\n\r\n// Updated: 09Aug2008 (jh) for v3.7 distribution\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (version < 3.7)\r\n  #version 3.5;\r\n#end\r\n\r\n#declare ClCol01=color rgb <0.8, 0.7, 0.4>;\r\n#declare ClCol02=color rgb <0.07, 0.12, 0.4>;\r\n\r\n#declare CPig1=\r\npigment {\r\n  gradient x\r\n  triangle_wave\r\n  color_map {\r\n    [0.04 ClCol01 ]\r\n    [0.04 ClCol02 ]\r\n    [0.06 ClCol02 ]\r\n    [0.06 ClCol01 ]\r\n    [0.09 ClCol01 ]\r\n    [0.09 ClCol02 ]\r\n    [0.13 ClCol02 ]\r\n    [0.13 ClCol01 ]\r\n    [0.16 ClCol01 ]\r\n    [0.16 ClCol02 ]\r\n    [0.18 ClCol02 ]\r\n    [0.18 ClCol01 ]\r\n  }\r\n}\r\n\r\n#declare CPig2=\r\npigment {\r\n  gradient y\r\n  triangle_wave\r\n  pigment_map {\r\n    [0.04 CPig1 ]\r\n    [0.04 ClCol02 ]\r\n    [0.06 ClCol02 ]\r\n    [0.06 CPig1 ]\r\n    [0.09 CPig1 ]\r\n    [0.09 ClCol02 ]\r\n    [0.13 ClCol02 ]\r\n    [0.13 CPig1 ]\r\n    [0.16 CPig1 ]\r\n    [0.16 ClCol02 ]\r\n    [0.18 ClCol02 ]\r\n    [0.18 CPig1 ]\r\n  }\r\n}\r\n\r\n    /*\r\n#include \"clothutil.inc\"\r\n\r\nReadClothFile(\"cloth.cth\")\r\nDrawSmoothTriangles2(Points, 90, 90, on, true, \"cloth.inc\")\r\n        */\r\n#declare Table_Cloth=\r\nmesh2{\r\n  #include \"cloth.inc\"\r\n  texture {\r\n    uv_mapping\r\n    pigment {\r\n      CPig2\r\n    }\r\n    finish {\r\n      ambient 0.0\r\n      diffuse 0.6\r\n    }\r\n    normal {\r\n      quilted 0.16\r\n      scale 0.008\r\n    }\r\n  }\r\n  rotate -30*z\r\n}\r\n\r\nobject { Table_Cloth translate <3.3,2.52,0> }\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/table_stuff.inc",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Persistence Of Vision Ray Tracer Include File\r\n// File: table_stuff.inc\r\n// Desc: stuff on the table for 'balcony.pov' demonstration scene\r\n// Date: July/August 2001\r\n// Auth: Christoph Hormann\r\n\r\n// Updated: 09Aug2008 (jh) for v3.7 distribution\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (version < 3.7)\r\n  #version 3.5;\r\n#end\r\n\r\n#declare Mat_Glass=\r\nmaterial {\r\n  texture {\r\n    pigment { color rgbt 1 }\r\n    finish {\r\n      ambient 0.0\r\n      diffuse 0.1\r\n      specular 0.5\r\n      roughness 0.01\r\n\r\n      reflection {\r\n        0.15, 1.0\r\n        fresnel on\r\n      }\r\n\r\n      conserve_energy\r\n    }\r\n  }\r\n  interior {\r\n    ior 1.5\r\n    fade_distance 0.1\r\n    fade_power 1001\r\n    fade_color <0.4,0.4,0.8>\r\n  }\r\n}\r\n\r\n#declare Tex_Box_Metal=\r\ntexture {\r\n  pigment {\r\n    color rgb <0.5,0.45,0.4>\r\n  }\r\n  finish {\r\n    ambient 0.0\r\n    diffuse 0.05\r\n    specular 0.5\r\n    roughness 0.01\r\n    metallic\r\n\r\n    reflection {\r\n      0.8\r\n      metallic\r\n    }\r\n  }\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#include \"shapes.inc\"\r\n#include \"functions.inc\"\r\n\r\n#declare Table_Height=0.66;\r\n\r\n#declare Box_Iso=\r\nisosurface {\r\n  function  { -f_superellipsoid(x,y,z, 0.2, 0.2) }\r\n  contained_by {box { -1.2, 1.2 }}\r\n  max_gradient 1.1\r\n\r\n  translate 1.001*z\r\n}\r\n\r\n#declare Box=\r\nunion {\r\n  intersection {\r\n    object { Box_Iso }\r\n    object { Round_Box_Merge (<-1.1,-1.1,1.6>, <1.1,1.1,-0.1>, 0.4) }\r\n\r\n  }\r\n  intersection {\r\n    object { Box_Iso }\r\n    object { Round_Box_Merge (<-1.1,-1.1,1.6>, <1.1,1.1,2.2>, 0.4) }\r\n    scale 1.01\r\n    rotate 0.2\r\n  }\r\n  torus {\r\n    0.6, 0.13\r\n    rotate 90*z\r\n    translate 2*z\r\n  }\r\n\r\n  scale <1,1,0.6>\r\n}\r\n\r\n#include \"bglass.inc\"\r\n\r\nunion {\r\n  object {\r\n    Glass\r\n\r\n    photons{\r\n      target 1.0\r\n      refraction on\r\n      reflection on\r\n    }\r\n\r\n    translate <-0.16,-0.1,0>\r\n  }\r\n\r\n  object {\r\n    Box\r\n\r\n    texture {\r\n      Tex_Box_Metal\r\n    }\r\n    photons{\r\n      target 1.0\r\n      reflection on\r\n    }\r\n\r\n    scale 0.06\r\n    translate <-0.1,0.2,0>\r\n  }\r\n\r\n\r\n  translate <3.3,2.52,Table_Height>\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/terrain.inc",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Persistence of Vision Ray Tracer Include File\r\n// File: terrain.inc\r\n// Desc: terrain for 'balcony.pov' demonstration scene\r\n// Date: July/August 2001\r\n// Auth: Christoph Hormann\r\n\r\n// Updated: 09Aug2008 (jh) for v3.7 distribution\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (version < 3.7)\r\n  #version 3.5;\r\n#end\r\n\r\n#declare Tex_Vegetation=\r\ntexture {\r\n  pigment {\r\n    bozo\r\n    color_map {\r\n      [0.3 color rgb <0.20,0.35,0.1>*0.9 ]\r\n      [0.8 color rgb <0.12,0.35,0.1>*0.7 ]\r\n    }\r\n    scale 4\r\n  }\r\n  finish {\r\n    ambient 0.0\r\n    diffuse 0.5\r\n    brilliance 0.8\r\n    specular 0.1\r\n  }\r\n  normal {\r\n    granite 0.4\r\n  }\r\n}\r\n\r\n#declare Tex_Stone=\r\ntexture {\r\n  pigment {\r\n    color rgb <0.6,0.6,0.6>\r\n  }\r\n  finish {\r\n    ambient 0.0//0.1\r\n    diffuse 0.45\r\n    specular 0.15\r\n  }\r\n}\r\n\r\n#declare Tex_Terrain=\r\ntexture {\r\n  slope -z\r\n  texture_map {\r\n    [0.34 Tex_Vegetation ]\r\n    [0.34 Tex_Stone ]\r\n  }\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n\r\n\r\n#declare Terrain=\r\nobject {\r\n  height_field {\r\n\r\n    function 300,300 {\r\n      pigment {\r\n        function { 1-(min(pow(x*x + z*z,1.3), 1) -0.0001) }\r\n        color_map {\r\n          [0.0 color rgb 0.0]\r\n          [1.0 color rgb 1.0]\r\n        }\r\n        scale 0.35\r\n        translate <0.5,0,0.5>\r\n\r\n        warp { turbulence 0.3 }\r\n\r\n        scale 3\r\n        warp { turbulence 0.4 lambda 2.2 octaves 8 }\r\n        scale 1/3\r\n\r\n        rotate -90*x\r\n        translate -0.5*y\r\n        scale <1, -1, 1>\r\n        translate 0.5*y\r\n      }\r\n    }\r\n\r\n    water_level 0.02\r\n\r\n    rotate 90*x\r\n    rotate -10*z\r\n\r\n    scale <4, 4, 1>\r\n    scale 30\r\n  }\r\n}\r\n\r\n\r\nunion {\r\n  object {\r\n    Terrain\r\n    translate <130, 368, -10>\r\n  }\r\n\r\n  object {\r\n    Terrain\r\n    rotate -180*z\r\n    scale 0.3\r\n    translate <90, 97, -6>\r\n  }\r\n  texture { Tex_Terrain }\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/POV-Ray SDL/water.inc",
    "content": "// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.\r\n// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a\r\n// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.\r\n\r\n// Persistence Of Vision Ray Tracer Include File\r\n// File: water.inc\r\n// Desc: water for 'balcony.pov' demonstration scene\r\n// Date: July/August 2001\r\n// Auth: Christoph Hormann\r\n\r\n// Updated: 09Aug2008 (jh) for v3.7 distribution\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n\r\n#if (version < 3.7)\r\n  #version 3.5;\r\n#end\r\n\r\n#include \"functions.inc\"\r\n\r\n#declare RMF=function{ f_ridged_mf(x, y, z, 0.07, 2.2,  7, 0.6, 0.9, 1)}\r\n\r\n#declare M_Watx4 =\r\nmaterial {\r\n  texture {\r\n    pigment {\r\n      color rgbt <0.2, 0.22, 0.21, 0.94>\r\n    }\r\n    finish {\r\n      diffuse 0.0\r\n      ambient -0.2\r\n\r\n      reflection {\r\n        0.0, 0.95\r\n        fresnel on\r\n      }\r\n\r\n      conserve_energy\r\n\r\n      specular 0.4\r\n      roughness 0.007\r\n    }\r\n    normal{\r\n      function { RMF(x, y, z) } 0.8\r\n      scale 0.3\r\n    }\r\n  }\r\n  interior {\r\n    ior 1.31\r\n    fade_distance 5\r\n    fade_power 1001.0\r\n    fade_color <0.02, 0.20, 0.06>\r\n  }\r\n}\r\n\r\nplane {\r\n  z, -1\r\n  material {\r\n    M_Watx4\r\n  }\r\n  hollow on\r\n}\r\n\r\nplane {\r\n  z, -12.0\r\n\r\n  texture {\r\n    pigment { color rgb 0 }\r\n    finish { ambient 0.0 diffuse 0.0 }\r\n  }\r\n  hollow on\r\n}\r\n\r\n/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/ceph-raid.pan",
    "content": "unique template site/filesystems/ceph-raid;\n\nprefix '/system/blockdevices';\n\nvariable CEPH_OSD_DISKS = {\n    # SAS disks partitions\n    disks = list();\n    foreach (disk; data; value('/hardware/harddisks')) {\n        if (data['capacity'] > 1000 * GB) {\n            append(disks, disk);\n        };\n    };\n    disks;\n};\n\n'partitions' = {\n    foreach (idx; disk; CEPH_OSD_DISKS) {\n        partitions_add(\n            disk, dict(\n                format('%s1', disk), 10 * GB,\n                format('%s2', disk), 5 * GB,\n                format('%s3', disk), -1));\n        SELF[format('%s1', disk)]['offset'] = 1;\n    };\n    SELF;\n};\n\n#raid for data\n'md' = {\n    for (i = 0; i < length(CEPH_OSD_DISKS); i = i + 2) {\n        for (j = 2; j <= 3; j = j + 1) {\n            SELF[escape(format('md/%s0%s%d', CEPH_OSD_DISKS[i], CEPH_OSD_DISKS[i+1], j ))] = dict(\n                \"device_list\", list(format('partitions/%s%d', CEPH_OSD_DISKS[i], j), format('partitions/%s%d', CEPH_OSD_DISKS[i+1], j)),\n                \"raid_level\", 'RAID0',\n                \"metadata\", '1.2',\n            );\n        };\n    };\n    SELF;\n};\n\n# ceph OSD and journal fs\n'/system/filesystems' = {\n    # ga over software raids..\n    foreach (disk; data; value('/system/blockdevices/md')) { #check for data part/disk\n        if (match(unescape(disk), '^md/.+0.+3$')) {\n            append(merge(CEPH_FSOPTS_BASE, CEPH_DISK_OPTIONS[CEPH_FS], dict(\n                'mountpoint', format('/var/lib/ceph/osd/%s', replace('md/([a-z0A-Z]+)[0-9]*$', '$1', unescape(disk))),\n                'block_device', format('md/%s', disk),\n            )));\n        } else if (match(unescape(disk), '^md/.+0.+2$')) {\n            append(merge(CEPH_FSOPTS_DUMMY, dict(\n                'mountpoint', format('/dummy/%s', unescape(disk)),\n                'block_device', format('md/%s', disk)\n            )));\n        };\n    };\n    SELF;\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/cluster-A.pan",
    "content": "structure template site/nagios/hosts/cluster-A;\n\n# let Nagios server A monitor B\n# just an example to make the templates compile\n\"nagios-slave-B.example.org\" = create (NAGIOS_QUATTOR_HOST);\n\"nagios-slave-B.example.org/alias\" = \"slave B\";\n\"nagios-slave-B.example.org/hostgroups\" = list( \"quattor-nodes\" );\n\n\n# \"another-host-in-A.example.org\" = create (NAGIOS_QUATTOR_HOST);\n# \"another-host-in-A.example.org/alias\" = \"another monitored host in cluster A\";\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/databases.pan",
    "content": "template site/databases;\n\n# Defines the mapping between the full hostname and the IP\n# address.\nfinal variable DB_IP = dict(\n    escape(\"one\"), \"192.168.0.24\",\n    escape(\"hyp01\"), \"192.168.0.25\",\n    escape(\"vm\"), \"192.168.0.26\",\n);\n\n# Defines the mapping between the full hostname and the\n# physical machine.\n# A different hardware template must be used for each machine\nfinal variable DB_MACHINE = dict(\n    escape(\"one\"), \"hardware/machine/ibm/x3550/x_KDXXXX\",\n    escape(\"hyp01\"), \"hardware/machine/ibm/hs21xm/blade_99HXXXX\",\n    escape(\"vm\"), \"hardware/machine/one/example\",\n);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/functions.pan",
    "content": "################################################################################\n# This is 'namespaces/standard/pan/functions.tpl', a pan-templates's file\n################################################################################\n#\n# VERSION:    3.2.7, 21/08/09 22:22\n# AUTHOR:     Martin Bock\n# MAINTAINER: Example Maintainer <support@example.org>\n# LICENSE:    http://cern.ch/eu-datagrid/license.html\n#\n################################################################################\n# Coding style: emulate <TAB> characters with 4 spaces, thanks!\n################################################################################\n#\n# Function definitions\n#\n################################################################################\n\ndeclaration template pan/functions;\n\ninclude 'pan/types';\n\n############################################################\n##=\n## @function push\n## @# push zero or more values onto the end of a list.\n##+If the list does not exist or is not defined a new list is\n##+created.\n## @syntax value:element\n## @param:value... the values to push onto list\n## @example\n##+# \"/data\" will contain list (1,2,3,4)\n##+\"/data\" = list(1,2);\n##+\"/data\" = push(3,4);\n##=\n############################################################\nfunction push = {\n    # Get the reference to SELF or create an empty list\n    # as necessary.\n    if (exists(SELF) && is_list(SELF)) {\n        v = SELF;\n    } else if (!exists(SELF) || !is_defined(SELF)) {\n        v = list();\n    } else {\n        error(\"push can only be applied to a list\");\n    };\n\n    # Merge the arguments into the given array.  Neither the\n    # first/next or merge functions can be used because the\n    # ARGV array cannot be directly referenced.\n    i = 0;\n    while (i < ARGC) {\n        v[length(v)] = ARGV[i];\n        i = i + 1;\n    };\n    v;\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/infernalis.pan",
    "content": "unique template site/ceph/server/infernalis;\n\ninclude 'components/dirperm/config';\n\n\"/software/components/dirperm/paths\" = {\n    foreach (idx; mp; value('/system/filesystems')) {\n        if (match(mp['mountpoint'], format('^%s', CEPH_OSD_MP_BASE))) {\n            append(SELF, dict(\n                \"path\", mp['mountpoint'],\n                \"owner\", \"ceph:ceph\",\n                \"perm\", \"0755\",\n                \"type\", \"d\",\n            ));\n        };\n    };\n    SELF;\n};\n\ninclude 'common/sysctl/service';\nprefix \"/software/components/metaconfig/services/{/etc/sysctl.conf}/contents\";\n\n'kernel.pid_max' = 4194303;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/libvirt.pan",
    "content": "unique template site/ceph/client/libvirt;\n\ninclude 'site/ceph/client/config';\n\nvariable CEPH_LIBVIRT_USER ?= 'oneadmin';\nvariable CEPH_LIBVIRT_GROUP ?= CEPH_LIBVIRT_USER;\nprefix '/software/components/metaconfig/services/{/etc/ceph/ceph.client.libvirt.keyring}';\n\n\"contents\" = if (is_defined(CEPH_LIBVIRT_SECRET)) {\n    dict(\"client.libvirt\", dict(\n        \"key\", CEPH_LIBVIRT_SECRET,\n        )\n    );\n} else {\n    dict();\n};\n'module' = 'tiny';\n'mode' = 0600;\n'owner' = CEPH_LIBVIRT_USER;\n'group' = CEPH_LIBVIRT_GROUP;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/link.pan",
    "content": "unique template site/dcache/link;\n\ninclude 'components/dcache/config';\n\n## links\n## default preference value\n\"/software/components/dcache/link/def_pref\" = \"10\";\n## list of links that will be ignored during configuration\n\"/software/components/dcache/link/ignore_link\" = list();\n##\n\"/software/components/dcache/link/links\" = dict(\n    ## out_buf_write: all outside to write to the storage through this buffer\n    \"out\", dict(\"ugroup\", list(\"all_net\", \"any_store\"), \"pgroup\", list(\"out_buf\"), \"read\", \"10\", \"write\", \"10\", \"cache\", \"10\"),\n    \"in\", dict(\"ugroup\", list(\"in_net\", \"any_store\"), \"pgroup\", list(\"priv\"), \"read\", \"20\", \"write\", \"20\", \"cache\", \"20\"),\n    \"dteam\", dict(\"ugroup\", list(\"dteam_store\"), \"pgroup\", list(\"out_buf\"), \"read\", \"10\", \"write\", \"10\", \"cache\", \"10\"),\n    \"ops\", dict(\"ugroup\", list(\"ops_store\"), \"pgroup\", list(\"out_buf\"), \"read\", \"10\", \"write\", \"10\", \"cache\", \"10\"),\n    \"cms\", dict(\"ugroup\", list(\"cms_store\"), \"pgroup\", list(\"out_buf\"), \"read\", \"10\", \"write\", \"10\", \"cache\", \"10\"),\n    \"test\", dict(\"ugroup\", list(\"test_store\"), \"pgroup\", list(\"behar_test\"), \"read\", \"10\", \"write\", \"10\", \"cache\", \"10\"),\n);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/mysql.pan",
    "content": "unique template common/opennebula/mysql;\n\nprefix \"/software/packages\";\n\"{mysql-server}\" = dict();\n\ninclude 'components/mysql/config';\n\nprefix  \"/software/components/mysql\";\n\"serviceName\" = {\n    if (RPM_BASE_FLAVOUR_VERSIONID == 7) {\n        \"mariadb\";\n    } else {\n        \"mysqld\";\n    };\n};\nprefix \"/software/components/mysql/servers/one\";\n\"host\" = FULL_HOSTNAME; # localhost is added by component\n\"adminpwd\" = OPENNEBULA_MYSQL_ADMIN;\n\"adminuser\" = \"root\";\n\nprefix \"/software/components/mysql/databases/opennebula\";\n\"server\" = \"one\";\n\"users/oneadmin/password\" = OPENNEBULA_MYSQL_ONEADMIN;\n\"users/oneadmin/rights\" = list(\"ALL PRIVILEGES\");\n\"createDb\" = false; # if false, run script\n\"initScript/file\" = \"/dev/null\";\n\nprefix \"/software/components/chkconfig/service\";\n\"mysqld\" = dict(\"on\", \"\", \"startstop\", true);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/nodes_properties.pan",
    "content": "template config/nodes_properties;\n\nvariable SITES ?= list('example');\n\n#variable NEW_NODES_PROPS ?= {\n\nvariable NODES_PROPS = {\n    nodes_add = dict();\n    nodes_props = dict();\n    allsites = SITES;\n    ok = first(allsites, k, v);\n    while (ok) {\n        nodes_add = merge(create(format(\"config/%s_nodes_properties\", v)), nodes_props);\n        nodes_props = merge(nodes_add[v], nodes_props);\n        ok = next(allsites, k, v);\n    };\n    nodes_props;\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/onevm.pan",
    "content": "unique template site/one/onevm;\n\ninclude 'components/chkconfig/config';\n\n# set opennebula map\ninclude 'quattor/aii/opennebula/schema';\nbind \"/system/opennebula\" = opennebula_vmtemplate;\n\ninclude 'site/config-vm';\n\ninclude 'quattor/aii/opennebula/default';\n\n\"/software/packages/{acpid}\" = dict();\n\"/software/components/chkconfig/service/acpid\" = dict('on', '', 'startstop', true);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/osd-fetch.pan",
    "content": "unique template site/ceph/osdschemas/osd-fetch;\n\nprefix '/software/components/ceph/clusters/ceph';\n\nvariable FETCHED_OSDS = {\n    t = dict();\n    rep = 2;\n    foreach(idx; host; CEPH_NODES) {\n        prof = replace('.data$', '.os', host);\n        d = value(format('%s:/software/components/ceph/localdaemons/osds', prof));\n        t[shorten_fqdn(host)] = dict(\n            'fqdn', host,\n            'osds', d\n        );\n\n        numosd = length(d);\n        if (numosd > rep){\n            rep = numosd;\n        };\n    };\n    all = dict('osdhosts', t, 'maxosd', rep);\n};\n\n'osdhosts' = FETCHED_OSDS['osdhosts'];\nvariable CEPH_OSD_DOWN_REPORTERS ?= FETCHED_OSDS['maxosd'] + 2;\nvariable CEPH_OSD_DOWN_REPORTS ?=  CEPH_OSD_DOWN_REPORTERS + CEPH_OSD_DOWN_REPORTERS / 4 + 1;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/pakiti.pan",
    "content": "#\n# Generated by RepositoryTask on 12/09/13 15:41\n#\n# name = pakiti\n# owner = support@example.org\n# url = http://quattor.web.lal.in2p3.fr/packages/pakiti\n#\n\nstructure template repository/pakiti;\n\n\"name\" = \"pakiti\";\n\"owner\" = \"support@example.org\";\n\"protocols\" = list(\n    dict(\"name\", \"http\",\n    \"url\", \"http://quattor.web.lal.in2p3.fr/packages/pakiti\")\n);\n\n\"contents\" = dict(\n    # pkg = pakiti-client-2.1.4-1-noarch\nescape(\"pakiti-client-2.1.4-1-noarch\"), dict(\"name\", \"pakiti-client\", \"version\", \"2.1.4-1\", \"arch\", \"noarch\"),\n    # pkg = pakiti-client-2.1.4-2-noarch\nescape(\"pakiti-client-2.1.4-2-noarch\"), dict(\"name\", \"pakiti-client\", \"version\", \"2.1.4-2\", \"arch\", \"noarch\"),\n    # pkg = pakiti-client-2.1.4-3-noarch\nescape(\"pakiti-client-2.1.4-3-noarch\"), dict(\"name\", \"pakiti-client\", \"version\", \"2.1.4-3\", \"arch\", \"noarch\"),\n    # pkg = pakiti-client-2.1.4-4-noarch\nescape(\"pakiti-client-2.1.4-4-noarch\"), dict(\"name\", \"pakiti-client\", \"version\", \"2.1.4-4\", \"arch\", \"noarch\"),\n    # pkg = pakiti-client-2.1.5-0-noarch\nescape(\"pakiti-client-2.1.5-0-noarch\"), dict(\"name\", \"pakiti-client\", \"version\", \"2.1.5-0\", \"arch\", \"noarch\"),\n    # pkg = pakiti-client-manual-2.1.4-2-noarch\nescape(\"pakiti-client-manual-2.1.4-2-noarch\"), dict(\"name\", \"pakiti-client-manual\", \"version\", \"2.1.4-2\", \"arch\", \"noarch\"),\n    # pkg = pakiti-client-manual-2.1.4-3-noarch\nescape(\"pakiti-client-manual-2.1.4-3-noarch\"), dict(\"name\", \"pakiti-client-manual\", \"version\", \"2.1.4-3\", \"arch\", \"noarch\"),\n    # pkg = pakiti-client-manual-2.1.4-4-noarch\nescape(\"pakiti-client-manual-2.1.4-4-noarch\"), dict(\"name\", \"pakiti-client-manual\", \"version\", \"2.1.4-4\", \"arch\", \"noarch\"),\n    # pkg = pakiti-server-2.1.4-1-noarch\nescape(\"pakiti-server-2.1.4-1-noarch\"), dict(\"name\", \"pakiti-server\", \"version\", \"2.1.4-1\", \"arch\", \"noarch\"),\n    # pkg = pakiti-server-2.1.4-2-noarch\nescape(\"pakiti-server-2.1.4-2-noarch\"), dict(\"name\", \"pakiti-server\", \"version\", \"2.1.4-2\", \"arch\", \"noarch\"),\n    # pkg = pakiti-server-2.1.4-3-noarch\nescape(\"pakiti-server-2.1.4-3-noarch\"), dict(\"name\", \"pakiti-server\", \"version\", \"2.1.4-3\", \"arch\", \"noarch\"),\n    # pkg = pakiti-server-2.1.4-4-noarch\nescape(\"pakiti-server-2.1.4-4-noarch\"), dict(\"name\", \"pakiti-server\", \"version\", \"2.1.4-4\", \"arch\", \"noarch\"),\n    # pkg = pakiti-server-2.1.5-0-noarch\nescape(\"pakiti-server-2.1.5-0-noarch\"), dict(\"name\", \"pakiti-server\", \"version\", \"2.1.5-0\", \"arch\", \"noarch\"),\n);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/purge_fqan_accounts.pan",
    "content": "# Template installing a script to remove all accounts with 'fqan' in\n# their name. Used after fixing VOConfigTask in SCDB 2.3.2 to remove\n# obsolete accounts not removed by ncm-accounts.\n#\n# The script is added and executed only on nodes where NODE_VO_ACCOUNTS\n# is true. It is intended to be run as GLITE_BASE_CONFIG_SITE (define\n# this variable to the script namespace).\n#\n# Michel Jouvin - 13/9/09\n\nunique template site/misc/purge_fqan_accounts;\n\nvariable LAL_PURGE_ACCOUNTS_SCRIPT = '/tmp/purge_fqan_accounts';\n\ninclude 'components/filecopy/config';\n\n'/software/components/filecopy/services' = {\n    if ( is_defined(NODE_VO_ACCOUNTS) && NODE_VO_ACCOUNTS ) {\n        debug('Adding purge_fqan_accounts');\n        SELF[escape(LAL_PURGE_ACCOUNTS_SCRIPT)] = dict(\n            'config', file_contents('site/misc/purge_fqan_accounts.sh'),\n            'owner', 'root:root',\n            'perms', '0755',\n            'restart', LAL_PURGE_ACCOUNTS_SCRIPT,\n        );\n    } else {\n        debug(format('VO accounts disabled (NODE_VO_ACCOUNTS=%s', NODE_VO_ACCOUNTS));\n    };\n    SELF;\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/resources.pan",
    "content": "unique template site/one/resources;\n\n# datastores templates\nprefix \"/software/components/opennebula/datastores/0\";\n\"name\" = \"ceph.example\";\n\"bridge_list\" = list(FULL_HOSTNAME); # for now, do this from the headnode\n\"ceph_host\" = CEPH_MON_HOSTS;\n\"ceph_secret\" = CEPH_LIBVIRT_UUID;\n\"ceph_user\" = \"libvirt\";\n\"ceph_user_key\" = CEPH_LIBVIRT_SECRET;\n\"datastore_capacity_check\" = true;\n\"pool_name\" = \"one\";\n\"type\" = \"IMAGE_DS\";\n\"rbd_format\" = 2;\n\nprefix \"/software/components/opennebula/datastores/1\";\n\"name\" = \"nfs.example\";\n\"datastore_capacity_check\" = true;\n\"ds_mad\" = \"fs\";\n\"tm_mad\" = \"shared\";\n\"type\" = \"IMAGE_DS\";\n\n# untouchables resources\nprefix \"/software/components/opennebula/untouchables\";\n\"datastores\" = list('system');\n\n# extra conf\nprefix \"/software/components/opennebula\";\n\"ssh_multiplex\" = true;\n\"tm_system_ds\" = \"ssh\";\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/simple.pan",
    "content": "unique template site/ceph/osdlocal/simple;\n\nvariable CEPH_JOURNAL_PART ?= dict();\n\nprefix '/software/components/ceph';\n\n'localdaemons/osds' = {\n    d = dict();\n    foreach(idx; osdmnt; value('/system/filesystems')) {\n        part = osdmnt['block_device'];\n        disk = replace('\\S+/([a-zA-Z]+)[0-9]*$', '$1', part);\n        if (match(osdmnt['mountpoint'], '/var/lib/ceph/osd/\\w+')){\n            d[escape(osdmnt['mountpoint'])] = dict(\n                'journal_path', format('/dev/%s%d', disk, CEPH_JOURNAL_PART['data']),\n                'crush_weight', weight_of(part),\n            );\n        };\n    };\n    d;\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/test.pan",
    "content": "object template pantest;\n\n# Very simple pan test file\n\"/long/decimal\" = 123;\n\"/long/octal\" = 0755;\n\"/long/hexadecimal\" = 0xFF;\n\n\"/double/simple\" = 0.01;\n\"/double/pi\" = 3.14159;\n\"/double/exponent\" = 1e-8;\n\"/double/scientific\" = 1.3E10;\n\n\"/string/single\" = 'Faster, but escapes like \\t, \\n and \\x3d don''t work, but '' should work.';\n\"/string/double\" = \"Slower, but escapes like \\t, \\n and \\x3d do work\";\n\nvariable TEST = 2;\n\n\"/x2\" = to_string(TEST);\n\"/x2\" ?= 'Default value';\n\n\"/x3\" = 1 + 2 + value(\"/long/decimal\");\n\n\"/x4\" = undef;\n\n\"/x5\" = null;\n\nvariable e ?= error(\"Test error message\");\n\n# include gmond config for services-monitoring\ninclude { 'site/ganglia/gmond/services-monitoring' };\n\n\"/software/packages\"=pkg_repl(\"httpd\",\"2.2.3-43.sl5.3\",PKG_ARCH_DEFAULT);\n\"/software/packages\"=pkg_repl(\"php\");\n\n# Example function\nfunction show_things_view_for_stuff = {\n    thing = ARGV[0];\n    foreach( i; mything; STUFF ) {\n        if ( thing == mything ) {\n            return( true );\n        } else {\n            return SELF;\n        };\n    };\n    false;\n};\n\nvariable HERE = <<EOF;\n; This example demonstrates an in-line heredoc style config file\n[main]\nawesome = true\nEOF\n\nvariable small = false;#This should be highlighted normally again.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/types.pan",
    "content": "@contributor{\n  name = First Contributor\n  email = first@example.org\n}\n@contributor{\n  name = Second Contributor\n  email = second@example.org\n}\n@documentation{\nData type and function definitions for basic types\n}\n\ndeclaration template pan/types;\n\ninclude 'pan/legacy';\n\n@documentation{\nThis type implements a date/time format consistent with\nASN.1 typically used by LDAP.  The actual specification is the\n\"GeneralizedTime\" format as specified on page 38 of the X.208\nITU-T recommendation and references within.\n\nEx: 20040825120123Z\n    20040825120123+0100\n    20040825120123,5\n    20040825120123.5\n    20040825120123.5-0123\n}\nfunction is_asndate = {\n    # Check cardinality and type of argument.\n    if (ARGC != 1 || !is_string(ARGV[0]))\n        error(\"usage: is_asndate(string)\");\n\n    # Match the datetime pattern, extracting interesting fields.\n    result = matches(ARGV[0],\n        '^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(?:[,\\.](\\d+))?([Zz]|(?:[-+]\\d{2}\\d{2}))?$');\n\n    if (length(result) >= 7) {\n        # Do further tests on various components of the date.\n        # NOTE: the to_long(to_double(x)) construct below is to avoid having\n        # the to_long function treat strings with leading zeros as octal\n        # numbers.  E.g. to_long(\"09\") will throw an exception because '9' is\n        # not a valid octal digit.\n        year = to_long(result[1]);\n        month = to_long(to_double(result[2]));\n        day = to_long(to_double(result[3]));\n        hour = to_long(to_double(result[4]));\n        minute = to_long(to_double(result[5]));\n        second = to_long(to_double(result[6]));\n\n        frac = 0;\n        if (length(result) > 7) {\n            frac = to_long(to_double(result[7]));\n        };\n\n        zone = '+0000';\n        if (length(result) > 8) {\n            zone = result[8];\n        };\n\n        # Check the range of months.\n        if (month < 1 || month > 12) {\n            error(\"is_asndate: invalid month\");\n            return(false);\n        };\n\n        # Check the range of days.\n        if (day < 1 || day > 31) {\n            error(\"is_asndate: invalid day\");\n            return(false);\n        };\n\n        # Be more specific on the days in each month.\n        if (month == 4 || month == 6 || month == 9 || month == 11) {\n            if (day > 30) {\n                error(\"is_asndate: invalid day\");\n            };\n        };\n\n        # February is always a bother.  Too lazy to check that the leap\n        # years have been specified correctly.\n        if (month == 2 && day > 29) {\n            error(\"is_asndate: invalid day\");\n        };\n\n        # Check the time.\n        if (hour > 23) {\n            error(\"is_asndate: invalid hour\");\n            return(false);\n        };\n        if (minute > 59) {\n            error(\"is_asndate: invalid minute\");\n            return(false);\n        };\n\n        # Allow for leap seconds here (since it is easy).\n        if (second > 60) {\n            error(\"is_asndate: invalid minute\");\n            return(false);\n        };\n\n        # Check the time zone format.\n        if (zone != \"Z\" && zone != \"z\") {\n            tz = matches(zone, '^[-+](\\d{2})(\\d{2})$');\n\n            hoffset = to_long(to_double(tz[1]));\n            moffset = to_long(to_double(tz[2]));\n\n            if (hoffset >= 12) {\n                error(\"is_asndate: invalid hour offset in time zone\");\n                return(false);\n            };\n            if (moffset > 59) {\n                error(\"is_asndate: invalid minute offset in time zone\");\n                return(false);\n            };\n        };\n\n    } else {\n        error(\"is_asndate: invalid format for time\");\n        return(false);\n    };\n\n    # If it gets to this point, then the date must be OK.\n    true;\n};\n\n\ntype type_asndate = string with {\n    is_asndate(SELF);\n};\n\n@documentation{\n    desc = Type that enforces the existence of a named interface.\n}\ntype valid_interface = string with {\n    if (exists(format('/system/network/interfaces/%s', SELF))) {\n        return(true);\n    };\n    foreach(ifc; attr; value('/system/network/interfaces')) {\n        if (attr['device'] == SELF){\n            return(true);\n        };\n    };\n    false;\n};\n\n@documentation{\n    desc = CPU architectures understood by Quattor\n}\ntype cpu_architecture = string with match (SELF, '^(i386|ia64|x86_64|sparc|aarch64|ppc64(le)?)$');\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pan/unit.pan",
    "content": "unique template site/dcache/unit;\n\ninclude 'components/dcache/config';\n\n## unit/ugroups\n## list of ugroups that will be ignored during configuration\n\"/software/components/dcache/unit/ignore_ugroup\" = list();\n\"/software/components/dcache/unit/units\" = dict(\n    \"protocol\", list(\n        dict(\"cond\", \"*/*\", \"ugroup\", list(\"default_protocol\"))\n    ),\n    \"net\", list(\n        dict(\"cond\", \"192.168.0.0/255.255.0.0\", \"ugroup\", list(\"in_net\", \"all_net\")),\n        dict(\"cond\", \"192.168.10.0/255.255.255.0\", \"ugroup\", list(\"in_server\", \"in_net\", \"all_net\")),\n        dict(\"cond\", \"192.168.11.0/255.255.255.0\", \"ugroup\", list(\"in_wn\", \"in_net\", \"all_net\")),\n        dict(\"cond\", \"192.168.12.0/255.255.255.0\", \"ugroup\", list(\"in_wn\", \"in_net\", \"all_net\")),\n        dict(\"cond\", \"192.168.13.0/255.255.255.0\", \"ugroup\", list(\"in_wn\", \"in_net\", \"all_net\")),\n        dict(\"cond\", \"192.168.14.0/255.255.255.0\", \"ugroup\", list(\"in_wn\", \"in_net\", \"all_net\")),\n        dict(\"cond\", \"192.168.15.0/255.255.255.0\", \"ugroup\", list(\"in_wn\", \"in_net\", \"all_net\")),\n        dict(\"cond\", \"192.168.16.0/255.255.255.0\", \"ugroup\", list(\"in_wn\", \"in_net\", \"all_net\")),\n        dict(\"cond\", \"192.168.17.0/255.255.255.0\", \"ugroup\", list(\"in_wn\", \"in_net\", \"all_net\")),\n        dict(\"cond\", \"0.0.0.0/0.0.0.0\", \"ugroup\", list(\"all_net\")),\n        ),\n    \"store\", list(\n        dict(\"cond\", \"*@*\", \"ugroup\", list(\"any_store\")),\n        dict(\"cond\", \"myStore:STRING@osm\", \"ugroup\", list(\"default_store\", \"any_store\")),\n        dict(\"cond\", \"dteam:dteam-base@osm\", \"ugroup\", list(\"dteam_store\", \"any_store\")),\n        dict(\"cond\", \"ops:ops-base@osm\", \"ugroup\", list(\"ops_store\", \"any_store\")),\n        dict(\"cond\", \"cms:cms-base@osm\", \"ugroup\", list(\"cms_store\", \"any_store\")),\n        dict(\"cond\", \"test:cms-test@osm\", \"ugroup\", list(\"test_store\")),\n    ),\n);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Papyrus/CAMTEST_OverShoulderME.psc",
    "content": "Scriptname CAMTEST_OverShoulderME extends activemagiceffect  \n{Play with camera effects}\n\n;--=== Imports ===--\n\nImport Utility\nImport Game\n\n;--=== Properties ===--\n\nActor Property PlayerRef Auto\nActorBase Property CAMTEST_CameraActor Auto\n\n;--=== Variables ===--\n\nActor Player\n\nActor Camera\n\nActor Target\n\nFloat PosX\nFloat PosY\nFloat PosZ\nFloat SpeedMult\n\nObjectReference Mist\nObjectReference Fog\n\n;--=== Events ===--\n\nEvent OnInit()\n\tPlayer = PlayerRef\nEndEvent\n\nEvent onEffectStart(Actor akTarget, Actor akCaster)\n\tCamera = Player.PlaceActorAtMe(CAMTEST_CameraActor)\n\tCamera.EnableAI(False)\n\tCamera.SetScale(0.1)\n\tCamera.TranslateTo(Player.X + 40,Player.Y,Player.Z,0,0,0,800,30)\n\tDisablePlayerControls(abMovement = true, abFighting = true, abCamSwitch = true,  abLooking = true, abSneaking = true, abMenu = true, abActivate = true, abJournalTabs = false)\n\tSetPlayerAIDriven(True)\n\tForceThirdPerson()\n\tSetHUDCartMode()\n\tSetInChargen(True, True, False)\n\tSetCameraTarget(Camera)\n\tForceFirstPerson()\n\tWait(1)\n\tCamera.SplineTranslateTo(Player.X + 4000,Player.Y,Player.Z + 1000,15,0,Camera.GetHeadingAngle(Player) + Camera.GetAngleZ(),1800,800,100)\n;\tCamera.SetLookAt(Player)\n\tWait(10)\n\tCamera.SplineTranslateTo(Player.X + 1000,Player.Y - 500,Player.Z + 500,25,0,Camera.GetHeadingAngle(Player) + Camera.GetAngleZ(),1800,800,100)\n\tWait(10)\n\tSetHUDCartMode(False)\n\tSetCameraTarget(Player)\n\tSetInChargen(False, False, False)\n\tEnablePlayerControls()\n\tSetPlayerAIDriven(False)\nEndEvent\n\nEvent onUpdate()\nEndEvent\n\nEvent onEffectFinish(Actor akTarget, Actor akCaster)\nEndEvent\n\n;--=== Functions ===--\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Papyrus/vMFX_FXPlugin.psc",
    "content": "Scriptname vMFX_FXPlugin extends Quest  \n"
  },
  {
    "path": "src/test/resources/samples/langs/Papyrus/vSCM_MetaQuestScript.psc",
    "content": "Scriptname vSCM_MetaQuestScript extends Quest  \n{Do initialization and track variables for scripts}\n\n;--=== Imports ===--\n\nImport Utility\nImport Game\n\n;--=== Properties ===--\n\nActor Property PlayerRef Auto\n\nFloat Property ModVersion Auto Hidden\n\nString Property ModName = \"Smarter Combat Music\" Auto Hidden\n\nMessage Property vSCM_ModLoadedMSG Auto\nMessage Property vSCM_ModUpdatedMSG Auto\n\n;--=== Variables ===--\n\nFloat _CurrentVersion\nString _sCurrentVersion\n\nBool _Running\n\nFloat _ScriptLatency\nFloat _StartTime\nFloat _EndTime\n\n;--=== Events ===--\n\nEvent OnInit()\n\tIf ModVersion == 0\n\t\tDoUpkeep(True)\n\tEndIf\nEndEvent\n\nEvent OnReset()\n\tDebug.Trace(\"SCM: Metaquest event: OnReset\")\nEndEvent\n\nEvent OnGameReloaded()\n\tDebug.Trace(\"SCM: Metaquest event: OnGameReloaded\")\nEndEvent\n\n;--=== Functions ===--\n\nFunction DoUpkeep(Bool DelayedStart = True)\n\t;FIXME: CHANGE THIS WHEN UPDATING!\n\t_CurrentVersion = 0.01\n\t_sCurrentVersion = GetVersionString(_CurrentVersion)\n\tString sErrorMessage\n\tIf DelayedStart\n\t\tWait(RandomFloat(2,4))\n\tEndIf\n\tDebug.Trace(\"SCM: \" + ModName)\n\tDebug.Trace(\"SCM: Performing upkeep...\")\n\tDebug.Trace(\"SCM: Loaded version is \" + GetVersionString(ModVersion) + \", Current version is \" + _sCurrentVersion)\n\tIf ModVersion == 0\n\t\tDebug.Trace(\"SCM: Newly installed, doing initialization...\")\n\t\tDoInit()\n\t\tIf ModVersion == _CurrentVersion\n\t\t\tDebug.Trace(\"SCM: Initialization succeeded.\")\n\t\tElse\n\t\t\tDebug.Trace(\"SCM: WARNING! Initialization had a problem!\")\n\t\tEndIf\n\tElseIf ModVersion < _CurrentVersion\n\t\tDebug.Trace(\"SCM: Installed version is older. Starting the upgrade...\")\n\t\tDoUpgrade()\n\t\tIf ModVersion != _CurrentVersion\n\t\t\tDebug.Trace(\"SCM: WARNING! Upgrade failed!\")\n\t\t\tDebug.MessageBox(\"WARNING! \" + ModName + \" upgrade failed for some reason. You should report this to the mod author.\")\n\t\tEndIf\n\t\tDebug.Trace(\"SCM: Upgraded to \" + _CurrentVersion)\n\t\tvSCM_ModUpdatedMSG.Show(_CurrentVersion)\n\tElse\n\t\tDebug.Trace(\"SCM: Loaded, no updates.\")\n\t\t;CheckForOrphans()\n\tEndIf\n\tCheckForExtras()\n\tUpdateConfig()\n\tDebug.Trace(\"SCM: Upkeep complete!\")\nEndFunction\n\nFunction DoInit()\n\tDebug.Trace(\"SCM: Initializing...\")\n\t_Running = True\n\tModVersion = _CurrentVersion\n\tvSCM_ModLoadedMSG.Show(_CurrentVersion)\nEndFunction\n\nFunction DoUpgrade()\n\t_Running = False\n\tIf ModVersion < 0.01\n\t\tDebug.Trace(\"SCM: Upgrading to 0.01...\")\n\t\tModVersion = 0.01\n\tEndIf\n\t_Running = True\n\tDebug.Trace(\"SCM: Upgrade complete!\")\nEndFunction\n\nFunction UpdateConfig()\n\tDebug.Trace(\"SCM: Updating configuration...\")\n\n\tDebug.Trace(\"SCM: Updated configuration values, some scripts may update in the background!\")\nEndFunction\n\nString Function GetVersionString(Float fVersion)\n\tInt Major = Math.Floor(fVersion) as Int\n\tInt Minor = ((fVersion - (Major as Float)) * 100.0) as Int\n\tIf Minor < 10\n\t\tReturn Major + \".0\" + Minor\n\tElse\n\t\tReturn Major + \".\" + Minor\n\tEndIf\nEndFunction\n\nFunction CheckForExtras()\nEndFunction\n"
  },
  {
    "path": "src/test/resources/samples/langs/Parrot Assembly/hello.pasm",
    "content": "#!/usr/bin/env parrot\n\n.pcc_sub :main main:\n    say \"Hello!\"\n    end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Parrot Internal Representation/hello.pir",
    "content": "#!/usr/bin/env parrot\n\n.sub 'main' :main\n    say \"Hello!\"\n.end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pascal/bulls-and-cows.pascal",
    "content": "Program BullCow;\n\n{$mode objFPC}\n\nuses Math, SysUtils;\n\ntype\n   TFourDigit = array[1..4] of integer;\n\nProcedure WriteFourDigit(fd: TFourDigit);\n{ Write out a TFourDigit with no line break following. }\nvar\n   i: integer;\nbegin\n   for i := 1 to 4 do\n   begin\n      Write(fd[i]);\n   end;\nend;\n\nFunction WellFormed(Tentative: TFourDigit): Boolean;\n{ Does the TFourDigit avoid repeating digits? }\nvar\n   current, check: integer;\nbegin\n\n   Result := True;\n\n   for current := 1 to 4 do\n   begin\n      for check := current + 1 to 4 do\n      begin\n         if Tentative[check] = Tentative[current] then\n         begin\n            Result := False;\n         end;\n      end;\n   end;\n\nend;\n\nFunction MakeNumber(): TFourDigit;\n{ Make a random TFourDigit, keeping trying until it is well-formed. }\nvar\n   i: integer;\nbegin\n   for i := 1 to 4 do\n   begin\n      Result[i] := RandomRange(1, 9);\n   end;\n   if not WellFormed(Result) then\n   begin\n      Result := MakeNumber();\n   end;\nend;\n\nFunction StrToFourDigit(s: string): TFourDigit;\n{ Convert an (input) string to a TFourDigit. }\nvar\n   i: integer;\nbegin\n   for i := 1 to Length(s) do\n   begin\n      StrToFourDigit[i] := StrToInt(s[i]);\n   end;\nend;\n\nFunction Wins(Num, Guess: TFourDigit): Boolean;\n{ Does the guess win? }\nvar\n   i: integer;\nbegin\n   Result := True;\n   for i := 1 to 4 do\n   begin\n      if Num[i] <> Guess[i] then\n      begin\n         Result := False;\n         Exit;\n      end;\n   end;\nend;\n\nFunction GuessScore(Num, Guess: TFourDigit): string;\n{ Represent the score of the current guess as a string. }\nvar\n   i, j, bulls, cows: integer;\nbegin\n\n   bulls := 0;\n   cows := 0;\n\n   { Count the cows and bulls. }\n   for i := 1 to 4 do\n   begin\n      for j := 1 to 4 do\n      begin\n         if  (Num[i] = Guess[j]) then\n         begin\n            { If the indices are the same, that would be a bull. }\n            if (i = j) then\n            begin\n               bulls := bulls + 1;\n            end\n            else\n            begin\n               cows := cows + 1;\n            end;\n         end;\n      end;\n   end;\n\n   { Format the result as a sentence. }\n   Result := IntToStr(bulls) + ' bulls, ' + IntToStr(cows) + ' cows.';\n\nend;\n\nFunction GetGuess(): TFourDigit;\n{ Get a well-formed user-supplied TFourDigit guess. }\nvar\n   input: string;\nbegin\n\n   WriteLn('Enter a guess:');\n   ReadLn(input);\n\n   { Must be 4 digits. }\n   if Length(input) = 4 then\n   begin\n\n      Result := StrToFourDigit(input);\n\n      if not WellFormed(Result) then\n      begin\n         WriteLn('Four unique digits, please.');\n         Result := GetGuess();\n      end;\n\n   end\n   else\n   begin\n      WriteLn('Please guess a four-digit number.');\n      Result := GetGuess();\n   end;\n\nend;\n\nvar\n   Num, Guess: TFourDigit;\n   Turns: integer;\nbegin\n\n   { Initialize the randymnity. }\n   Randomize();\n\n   { Make the secred number. }\n   Num := MakeNumber();\n\n   WriteLn('I have a secret number. Guess it!');\n\n   Turns := 0;\n\n   { Guess until the user gets it. }\n   While True do\n   begin\n\n      Guess := GetGuess();\n\n      { Count each guess as a turn. }\n      Turns := Turns + 1;\n\n      { If the user won, tell them and ditch. }\n      if Wins(Num, Guess) then\n      begin\n         WriteLn('You won in ' + IntToStr(Turns) + ' tries.');\n         Write('The number was ');\n         WriteFourDigit(Num);\n         WriteLn('!');\n         Exit;\n      end\n      else { Otherwise, score it and get a new guess. }\n      begin\n         WriteLn(GuessScore(Num, Guess));\n      end;\n\n   end;\n\nend.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pascal/custforms.pp",
    "content": "unit custforms;\n\n{$mode objfpc}{$H+}\n\ninterface\n\nuses\n  Classes, SysUtils, Forms;\n\nType\n\n  { TCustomFormDescr }\n\n  TCustomFormDescr = Class\n  private\n    FAuthor: String;\n    FCaption: String;\n    FCategory: String;\n    FDescription: String;\n    FFormClass: TFormClass;\n    FLazPackage: String;\n    FUnitName: String;\n  public\n    Constructor Create(AFormClass : TFormClass; const APackage: string);\n    Constructor Create(AFormClass : TFormClass; Const ACaption,ADescription,AUnit,APackage : String);\n    Property FormClass : TFormClass Read FFormClass Write FFormClass;\n    Property Caption : String Read FCaption Write FCaption;\n    Property Description : String Read FDescription Write FDescription;\n    Property UnitName : String Read FUnitName Write FUnitName;\n    Property Category : String Read FCategory Write FCategory;\n    Property Author : String Read FAuthor Write FAuthor;\n    Property LazPackage : String Read FLazPackage Write FLazPackage;\n  end;\n\nProcedure RegisterCustomForm(Descr : TCustomFormDescr);\nProcedure RegisterCustomForm(AFormClass : TFormClass; const APackage: string);\nProcedure RegisterCustomForm(AFormClass : TFormClass; Const AUnitName, APackage : String);\n\nProcedure Register;\n\nimplementation\n\nuses ProjectIntf,NewItemIntf,contnrs;\n\nConst\n  SAppFrameWork = 'Custom forms';\n  SInstanceOf   = 'Create a new instance of %s';\n\n{ TCustomFormDescr }\n\nconstructor TCustomFormDescr.Create(AFormClass: TFormClass;\n  const APackage: string);\n\nVar\n  N,U : String;\n\nbegin\n  N:=AFormClass.ClassName;\n  U:=N;\n  If (Upcase(U[1])='T') then\n    Delete(U,1,1);\n  Create(AFormClass,N,Format(SInstanceOf,[N]),U,APackage);\nend;\n\nconstructor TCustomFormDescr.Create(AFormClass: TFormClass;\n  const ACaption, ADescription, AUnit, APackage: String);\nbegin\n  FFormClass:=AFormClass;\n  FCaption:=ACaption;\n  FDescription:=ADescription;\n  FUnitName:=AUnit;\n  FCategory:=SAppFrameWork;\n  FLazPackage:=APackage;\nend;\n\n// Registration code.\n\nType\n  { TCustomFormFileDescriptor }\n  TCustomFormFileDescriptor = Class(TFileDescPascalUnitWithResource)\n  private\n    FFormDescr: TCustomFormDescr;\n  Public\n    Constructor Create(ADescr : TCustomFormDescr);\n    Property FormDescr : TCustomFormDescr Read FFormDescr;\n    Function GetLocalizedName : String; override;\n    Function GetLocalizedDescription : String; override;\n    Function GetInterfaceUsesSection : String; override;\n  end;\n\n{ TCustomFormFileDescriptor }\n\nconstructor TCustomFormFileDescriptor.Create(ADescr: TCustomFormDescr);\nbegin\n  Inherited Create;\n  FFormDescr:=ADescr;\n  ResourceClass:=FFormDescr.FFormClass;\n  Name:=FFormDescr.Caption;\n  RequiredPackages:=ADescr.LazPackage;\n  //Writeln('TCustomFormFileDescriptor.Create RequiredPackages=',RequiredPackages);\nend;\n\nfunction TCustomFormFileDescriptor.GetLocalizedName: String;\nbegin\n  Result:=FFormDescr.Caption;\nend;\n\nfunction TCustomFormFileDescriptor.GetLocalizedDescription: String;\nbegin\n  Result:=FFormDescr.Description;\n  If (FFormDescr.Author<>'') then\n    Result:=Result+LineEnding+'By '+FFormDescr.Author;\nend;\n\nfunction TCustomFormFileDescriptor.GetInterfaceUsesSection: String;\nbegin\n  Result:=inherited GetInterfaceUsesSection;\n  Result:=Result+',Forms,'+FFormDescr.UnitName;\nend;\n\nVar\n  CustomFormList : TObjectList;\n\nProcedure RegisterCustomForm(Descr : TCustomFormDescr);\n\nbegin\n  CustomFormList.Add(Descr);\nend;\n\nProcedure RegisterCustomForm(AFormClass : TFormClass; const APackage: string);\n\nbegin\n  RegisterCustomForm(TCustomFormDescr.Create(AFormClass,APackage));\nend;\n\nProcedure RegisterCustomForm(AFormClass : TFormClass; Const AUnitName, APackage : String);\n\nVar\n  D : TCustomFormDescr;\n\nbegin\n  D:=TCustomFormDescr.Create(AFormClass,APackage);\n  D.UnitName:=AUnitName;\n  RegisterCustomForm(D);\nend;\n\n\nProcedure Register;\n\nVar\n  L : TStringList;\n  I : Integer;\n  D : TCustomFormDescr;\n  \nbegin\n  L:=TStringList.Create;\n  Try\n    L.Sorted:=True;\n    L.Duplicates:=dupIgnore;\n    For I:=0 to CustomFormList.Count-1 do\n      L.Add(TCustomFormDescr(CustomFormList[i]).Category);\n    For I:=0 to L.Count-1 do\n    begin\n      RegisterNewItemCategory(TNewIDEItemCategory.Create(L[i]));\n    end;\n  Finally\n    L.Free;\n  end;\n  For I:=0 to CustomFormList.Count-1 do\n    begin\n    D:=TCustomFormDescr(CustomFormList[i]);\n    RegisterProjectFileDescriptor(TCustomFormFileDescriptor.Create(D),D.Category);\n    end;\nend;\n\nProcedure InitCustomForms;\n\nbegin\n  CustomFormList:=TObjectList.Create;\nend;\n\nProcedure DoneCustomForms;\n\nbegin\n  FreeAndNil(CustomFormList);\nend;\n\nInitialization\n  InitCustomForms;\nFinalization\n  DoneCustomForms;\nend.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pascal/cwindirs.pp",
    "content": "\nunit cwindirs;\n\n\n\n\ninterface\n\nuses\n  windows,\n  strings;\n\nConst\n  CSIDL_PROGRAMS                = $0002;\n  CSIDL_PERSONAL                = $0005;\n  CSIDL_FAVORITES               = $0006;\n  CSIDL_STARTUP                 = $0007;\n  CSIDL_RECENT                  = $0008;\n  CSIDL_SENDTO                  = $0009;\n  CSIDL_STARTMENU               = $000B;\n  CSIDL_MYMUSIC                 = $000D;\n  CSIDL_MYVIDEO                 = $000E;\n  CSIDL_DESKTOPDIRECTORY        = $0010;\n  CSIDL_NETHOOD                 = $0013;\n  CSIDL_TEMPLATES               = $0015;\n  CSIDL_COMMON_STARTMENU        = $0016;\n  CSIDL_COMMON_PROGRAMS         = $0017;\n  CSIDL_COMMON_STARTUP          = $0018;\n  CSIDL_COMMON_DESKTOPDIRECTORY = $0019;\n  CSIDL_APPDATA                 = $001A;\n  CSIDL_PRINTHOOD               = $001B;\n  CSIDL_LOCAL_APPDATA           = $001C;\n  CSIDL_COMMON_FAVORITES        = $001F;\n  CSIDL_INTERNET_CACHE          = $0020;\n  CSIDL_COOKIES                 = $0021;\n  CSIDL_HISTORY                 = $0022;\n  CSIDL_COMMON_APPDATA          = $0023;\n  CSIDL_WINDOWS                 = $0024;\n  CSIDL_SYSTEM                  = $0025;\n  CSIDL_PROGRAM_FILES           = $0026;\n  CSIDL_MYPICTURES              = $0027;\n  CSIDL_PROFILE                 = $0028;\n  CSIDL_PROGRAM_FILES_COMMON    = $002B;\n  CSIDL_COMMON_TEMPLATES        = $002D;\n  CSIDL_COMMON_DOCUMENTS        = $002E;\n  CSIDL_COMMON_ADMINTOOLS       = $002F;\n  CSIDL_ADMINTOOLS              = $0030;\n  CSIDL_COMMON_MUSIC            = $0035;\n  CSIDL_COMMON_PICTURES         = $0036;\n  CSIDL_COMMON_VIDEO            = $0037;\n  CSIDL_CDBURN_AREA             = $003B;\n  CSIDL_PROFILES                = $003E;\n\n  CSIDL_FLAG_CREATE             = $8000;\n\nFunction GetWindowsSpecialDir(ID :  Integer) : String;\n\nimplementation\n\nuses\n  sysutils;\n\nType\n  PFNSHGetFolderPath = Function(Ahwnd: HWND; Csidl: Integer; Token: THandle; Flags: DWord; Path: PChar): HRESULT; stdcall;\n\n\nvar\n  SHGetFolderPath : PFNSHGetFolderPath = Nil;\n  CFGDLLHandle : THandle = 0;\n\nProcedure InitDLL;\n\nVar\n  pathBuf: array[0..MAX_PATH-1] of char;\n  pathLength: Integer;\nbegin\n  { Load shfolder.dll using a full path, in order to prevent spoofing (Mantis #18185)\n    Don't bother loading shell32.dll because shfolder.dll itself redirects SHGetFolderPath\n    to shell32.dll whenever possible. }\n  pathLength:=GetSystemDirectory(pathBuf, MAX_PATH);\n  if (pathLength>0) and (pathLength<MAX_PATH-14) then\n  begin\n    StrLCopy(@pathBuf[pathLength],'\\shfolder.dll',MAX_PATH-pathLength-1);\n    CFGDLLHandle:=LoadLibrary(pathBuf);\n\n    if (CFGDLLHandle<>0) then\n    begin\n      Pointer(ShGetFolderPath):=GetProcAddress(CFGDLLHandle,'SHGetFolderPathA');\n      If @ShGetFolderPath=nil then\n      begin\n        FreeLibrary(CFGDLLHandle);\n        CFGDllHandle:=0;\n      end;\n    end;\n  end;\n  If (@ShGetFolderPath=Nil) then\n    Raise Exception.Create('Could not determine SHGetFolderPath Function');\nend;\n\nFunction GetWindowsSpecialDir(ID :  Integer) : String;\n\nVar\n  APath : Array[0..MAX_PATH] of char;\n\nbegin\n  Result:='';\n  if (CFGDLLHandle=0) then\n    InitDLL;\n  If (SHGetFolderPath<>Nil) then\n    begin\n    if SHGetFolderPath(0,ID or CSIDL_FLAG_CREATE,0,0,@APATH[0])=S_OK then\n      Result:=IncludeTrailingPathDelimiter(StrPas(@APath[0]));\n    end;\nend;\n\nInitialization\nFinalization\n  if CFGDLLHandle<>0 then\n   FreeLibrary(CFGDllHandle);\nend.\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pascal/image_url.inc",
    "content": "  function GetUnixMangaImageURL: Boolean;\n  var\n    i: Integer;\n    l: TStringList;\n    s: String;\n  begin\n    l := TStringList.Create;\n    s := manager.container.PageContainerLinks[workCounter];\n    Result := GetPage(TObject(l), s , manager.container.Manager.retryConnect);\n\n    if Self.Terminated then\n    begin\n      l.Free;\n      parse.Free;\n      Exit;\n    end;\n\n    parse := TStringList.Create;\n    Parser := THTMLParser.Create(PChar(l.Text));\n    Parser.OnFoundTag := OnTag;\n    Parser.OnFoundText := OnText;\n    Parser.Exec;\n    Parser.Free;\n    l.Free;\n    if parse.Count > 0 then\n    begin\n      for i := 0 to parse.Count - 1 do\n      begin\n        if (Pos('STYLE=\"border', parse[i]) > 0) and (Pos('<IMG', parse[i]) > 0) then\n        begin\n          manager.container.PageLinks[workCounter] := Trim(GetVal(parse[i], 'SRC'));\n\t\t  Break;\n        end;\n      end;\n    end;\n    parse.Free;\n  end;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pascal/large.pp",
    "content": "program large;\n\n  const\n     max = 100000000;\n\n  type\n     tlist = array[1..max] of longint;\n\n  var\n     data : tlist;\n\ti : integer;\n\nbegin\n\n  i := 0;\n  while(i < max) \n  do\n\tbegin\n\t\tdata[i] := 0;\n\t\tWriteln(data[i])\n\tend\nend.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pascal/libc.inc",
    "content": "{\n    This file is part of the Free Component Library (FCL)\n    Copyright (c) 1999-2002 by the Free Pascal development team\n\n    BIOS functions unit for Nintendo DS\n    Copyright (c) 2006 by Francesco Lombardi\n\n    See the file COPYING.FPC, included in this distribution,\n    for details about the copyright.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n *****************************************************************************}\n\nfunction __errno: plongint;  cdecl; export;\nbegin\n\nend;\n\n\nfunction S_ISBLK(m: longint): boolean; inline;\nbegin\n  result := (m and _IFMT) = _IFBLK;\nend;\n\nfunction S_ISCHR(m: longint): boolean; inline;\nbegin\n  result := (m and _IFMT) = _IFCHR;\nend;\n\nfunction S_ISDIR(m: longint): boolean; inline;\nbegin\n  result := (m and _IFMT) = _IFDIR;\nend;\n\nfunction S_ISFIFO(m: longint): boolean; inline;\nbegin\n  result := (m and _IFMT) = _IFIFO;\nend;\n\nfunction S_ISREG(m: longint): boolean; inline;\nbegin\n  result := (m and _IFMT) = _IFREG;\nend;\n\nfunction S_ISLNK(m: longint): boolean; inline;\nbegin\n  result := (m and _IFMT) = _IFLNK;\nend;\n\nfunction S_ISSOCK(m: longint): boolean; inline;\nbegin\n  result := (m and _IFMT) = _IFSOCK;\nend;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pascal/program.dpr",
    "content": "program gmail;\n\nuses\n  Forms,\n  Unit2 in 'Unit2.pas' {Form2};\n\n{$R *.res}\n\nbegin\n  Application.Initialize;\n  Application.MainFormOnTaskbar := True;\n  Application.CreateForm(TForm2, Form2);\n  Application.Run;\nend.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pascal/read-a-configuration-file.pascal",
    "content": "#!/usr/bin/instantfpc\n\n{$if not defined(fpc) or (fpc_fullversion < 20600)}\n  {$error FPC 2.6.0 or greater required}\n{$endif}\n\n{$mode objfpc}{$H+}\n\nuses\n  Classes,SysUtils,gvector,ghashmap;\n\ntype\n  TStrHashCaseInsensitive = class\n    class function hash(s: String; n: Integer): Integer;\n  end;\n\nclass function TStrHashCaseInsensitive.hash(s: String; n: Integer): Integer;\nvar\n  x: Integer;\n  c: Char;\nbegin\n  x := 0;\n  for c in UpCase(s) do Inc(x,Ord(c));\n  Result := x mod n;\nend;\n\ntype\n  TConfigValues  = specialize TVector<String>;\n  TConfigStorage = class(specialize THashMap<String,TConfigValues,TStrHashCaseInsensitive>)\n    destructor Destroy; override;\n  end;\n\ndestructor TConfigStorage.Destroy;\nvar\n  It: TIterator;\nbegin\n  if Size > 0 then begin\n    It := Iterator;\n    repeat\n      It.Value.Free;\n    until not It.Next;\n    It.Free;\n  end;\n  inherited Destroy;\nend;\n\nvar\n  ConfigStrings,ConfigValues: TStrings;\n  ConfigStorage: TConfigStorage;\n  ConfigLine,ConfigName,ConfigValue: String;\n  SeparatorPos: Integer;\nbegin\n  ConfigStrings := TStringList.Create;\n  ConfigValues  := TStringList.Create;\n  ConfigValues.Delimiter := ',';\n  ConfigValues.StrictDelimiter := true;\n  ConfigStorage := TConfigStorage.Create;\n\n  ConfigStrings.LoadFromFile('config.test');\n  for ConfigLine in ConfigStrings do begin\n    if Length(ConfigLine) > 0 then begin\n      case ConfigLine[1] of\n        '#',';': ; // ignore\n        else begin\n          // look for = first\n          SeparatorPos := Pos('=',ConfigLine);\n          // if not found, then look for space\n          if SeparatorPos = 0 then begin\n            SeparatorPos := Pos(' ',ConfigLine);\n          end;\n          // found space\n          if SeparatorPos <> 0 then begin\n            ConfigName := UpCase(Copy(ConfigLine,1,SeparatorPos - 1));\n            ConfigValues.DelimitedText := Copy(ConfigLine,SeparatorPos + 1,Length(ConfigLine) - SeparatorPos);\n          // no = or space found, take the whole line as a key name\n          end else begin\n            ConfigName := UpCase(Trim(ConfigLine));\n          end;\n          if not ConfigStorage.Contains(ConfigName) then begin\n            ConfigStorage[ConfigName] := TConfigValues.Create;\n          end;\n          for ConfigValue in ConfigValues do begin\n            ConfigStorage[ConfigName].PushBack(Trim(ConfigValue));\n          end;\n        end;\n      end;\n    end;\n  end;\n\n  WriteLn('FULLNAME = ' + ConfigStorage['FULLNAME'][0]);\n  WriteLn('FAVOURITEFRUIT = ' + ConfigStorage['FAVOURITEFRUIT'][0]);\n  WriteLn('NEEDSPEELING = ' + BoolToStr(ConfigStorage.Contains('NEEDSPEELING'),true));\n  WriteLn('SEEDSREMOVED = ' + BoolToStr(ConfigStorage.Contains('SEEDSREMOVED'),true));\n  WriteLn('OTHERFAMILY(1) = ' + ConfigStorage['OTHERFAMILY'][0]);\n  WriteLn('OTHERFAMILY(2) = ' + ConfigStorage['OTHERFAMILY'][1]);\n\n  ConfigStorage.Free;\n  ConfigValues.Free;\n  ConfigStrings.Free;\nend.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pascal/tw27294.pp",
    "content": "uses\n  uw27294;\n\nvar\n  p : procedure;\n\nprocedure test;\n\nbegin\n  p:=@test;\n  writeln('OK');\nend;\n\nprocedure global;\nbegin\n  p:=nil;\n  test;\n  p();\nend;\n\nbegin\n  global;\n  uw27294.global;\nend.\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pascal/vmops_impl.inc",
    "content": "operator+(a, b: TVector)res: TVector;\nvar\n  i, an, bn, rn: Integer;\nbegin\n  an := Length(a);\n  bn := Length(b);\n  rn := math.max(an, bn);\n  SetLength(res, rn);\n  for i := 0 to rn - 1 do res[i] := a[i mod an] + b[i mod bn];\nend;\n\noperator+(a: TVector; b: Double)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a[i] + b;\nend;\n\noperator+(a: Double; b: TVector)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(b);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a + b[i];\nend;\n\noperator-(a: TVector)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := -a[i];\nend;\n\noperator-(a, b: TVector)res: TVector;\nvar\n  i, an, bn, rn: Integer;\nbegin\n  an := Length(a);\n  bn := Length(b);\n  rn := math.max(an, bn);\n  SetLength(res, rn);\n  for i := 0 to rn - 1 do res[i] := a[i mod an] - b[i mod bn];\nend;\n\noperator-(a: TVector; b: Double)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a[i] - b;\nend;\n\noperator-(a: Double; b: TVector)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(b);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a - b[i];\nend;\n\noperator*(a, b: TVector)res: TVector;\nvar\n  i, an, bn, rn: Integer;\nbegin\n  an := Length(a);\n  bn := Length(b);\n  rn := math.max(an, bn);\n  SetLength(res, rn);\n  for i := 0 to rn - 1 do res[i] := a[i mod an] * b[i mod bn];\nend;\n\noperator*(a: TVector; b: Double)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a[i] * b;\nend;\n\noperator*(a: Double; b: TVector)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(b);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a * b[i];\nend;\n\noperator/(a, b: TVector)res: TVector;\nvar\n  i, an, bn, rn: Integer;\nbegin\n  an := Length(a);\n  bn := Length(b);\n  rn := math.max(an, bn);\n  SetLength(res, rn);\n  for i := 0 to rn - 1 do res[i] := a[i mod an] / b[i mod bn];\nend;\n\noperator/(a: TVector; b: Double)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a[i] / b;\nend;\n\noperator/(a: Double; b: TVector)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(b);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a / b[i];\nend;\n\noperator**(a, b: Double)res: Double;\nbegin\n  if IsNan(a) or IsNan(b) then res := NaN\n  else if b = Infinity then begin\n    if a = NegInfinity then res := NaN\n    else case sign(a) of\n      1: res := Infinity;\n      0: res := 0;\n      -1: res := NegInfinity;\n    end;\n  end else if b = NegInfinity then begin\n    if a = NegInfinity then res := NaN\n    else case sign(a) of\n      1: res := 0;\n      0: res := Infinity;\n      -1: res := 0;\n    end;\n  end else res := power(a, b);\nend;\n\noperator**(a, b: TVector)res: TVector;\nvar\n  i, an, bn, rn: Integer;\nbegin\n  an := Length(a);\n  bn := Length(b);\n  rn := math.max(an, bn);\n  SetLength(res, rn);\n  for i := 0 to rn - 1 do res[i] := a[i mod an] ** b[i mod bn];\nend;\n\noperator**(a: TVector; b: Double)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a[i] ** b;\nend;\n\noperator**(a: Double; b: TVector)res: TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(b);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a ** b[i];\nend;\n\noperator><(a: TVector; b: TVector)res: TMatrix;\nvar\n  i, an, bn, rn: Integer;\nbegin\n  an := Length(a);\n  bn := Length(b);\n  if an * bn = 0 then Exit(nil);\n  rn := math.max(an, bn);\n  SetLength(res, 1);\n  SetLength(res[0], 1);\n  res[0][0] := 0;\n  for i := 0 to rn - 1 do res[0][0] := res[0][0] + a[i mod an] * b[i mod bn];\nend;\n\noperator+(a: TMatrix; b: TMatrix)res: TMatrix;\nvar\n  i, an: Integer;\nbegin\n  an := Length(a);\n  SetLength(res, an);\n  for i := 0 to an - 1 do res[i] := a[i] + b[i];\nend;\n\noperator+(a: TMatrix; b: Double)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a[i] + b;\nend;\n\noperator+(a: Double; b: TMatrix)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(b);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a + b[i];\nend;\n\noperator+(a: TMatrix; b: TVector)res: TMatrix;\nbegin\n  res := a + matrix(b, Length(a), Length(a[0]));\nend;\n\noperator+(a: TVector; b: TMatrix)res: TMatrix;\nbegin\n  res := b + matrix(a, Length(b), Length(b[0]));\nend;\n\noperator-(a: TMatrix)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := -a[i];\nend;\n\noperator-(a: TMatrix; b: TMatrix)res: TMatrix;\nvar\n  i, an: Integer;\nbegin\n  an := Length(a);\n  SetLength(res, an);\n  for i := 0 to an - 1 do res[i] := a[i] - b[i];\nend;\n\noperator-(a: TMatrix; b: Double)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a[i] - b;\nend;\n\noperator-(a: Double; b: TMatrix)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(b);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a - b[i];\nend;\n\noperator-(a: TMatrix; b: TVector)res: TMatrix;\nbegin\n  res := a - matrix(b, Length(a), Length(a[0]));\nend;\n\noperator-(a: TVector; b: TMatrix)res: TMatrix;\nbegin\n  res := b - matrix(a, Length(b), Length(b[0]));\nend;\n\noperator*(a: TMatrix; b: TMatrix)res: TMatrix;\nvar\n  i, an: Integer;\nbegin\n  an := Length(a);\n  SetLength(res, an);\n  for i := 0 to an - 1 do res[i] := a[i] * b[i];\nend;\n\noperator*(a: TMatrix; b: Double)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a[i] * b;\nend;\n\noperator*(a: Double; b: TMatrix)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(b);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a * b[i];\nend;\n\noperator*(a: TMatrix; b: TVector)res: TMatrix;\nbegin\n  res := a * matrix(b, Length(a), Length(a[0]));\nend;\n\noperator*(a: TVector; b: TMatrix)res: TMatrix;\nbegin\n  res := b * matrix(a, Length(b), Length(b[0]));\nend;\n\noperator/(a: TMatrix; b: TMatrix)res: TMatrix;\nvar\n  i, an: Integer;\nbegin\n  an := Length(a);\n  SetLength(res, an);\n  for i := 0 to an - 1 do res[i] := a[i] / b[i];\nend;\n\noperator/(a: TMatrix; b: Double)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a[i] / b;\nend;\n\noperator/(a: Double; b: TMatrix)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(b);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a / b[i];\nend;\n\noperator/(a: TMatrix; b: TVector)res: TMatrix;\nbegin\n  res := a / matrix(b, Length(a), Length(a[0]));\nend;\n\noperator/(a: TVector; b: TMatrix)res: TMatrix;\nbegin\n  res := b / matrix(a, Length(b), Length(b[0]));\nend;\n\noperator**(a: TMatrix; b: TMatrix)res: TMatrix;\nvar\n  i, an: Integer;\nbegin\n  an := Length(a);\n  SetLength(res, an);\n  for i := 0 to an - 1 do res[i] := a[i] ** b[i];\nend;\n\noperator**(a: TMatrix; b: Double)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a[i] ** b;\nend;\n\noperator**(a: Double; b: TMatrix)res: TMatrix;\nvar\n  i, n: Integer;\nbegin\n  n := Length(b);\n  SetLength(res, n);\n  for i := 0 to n - 1 do res[i] := a ** b[i];\nend;\n\noperator**(a: TMatrix; b: TVector)res: TMatrix;\nbegin\n  res := a ** matrix(b, Length(a), Length(a[0]));\nend;\n\noperator**(a: TVector; b: TMatrix)res: TMatrix;\nbegin\n  res := b ** matrix(a, Length(b), Length(b[0]));\nend;\n\noperator><(a: TMatrix; b: TMatrix)res: TMatrix;\nvar\n  i, j, n, m: Integer;\nbegin\n  n := Length(a);\n  m := Length(b);\n  if (n = 1) and (m = 1) then Exit(vector(a) >< vector(b));\n  SetLength(res, n);\n  for i := 0 to n - 1 do begin\n    j := 0;\n    res[i] := a[i][j] * b[j];\n    for j := 1 to m - 1 do res[i] := res[i] + a[i][j] * b[j];\n  end;\nend;\n\noperator><(a: TMatrix; b: TVector)res: TMatrix;\nbegin\n  res := a >< matrix(b, 1, Length(b));\nend;\n\noperator><(a: TVector; b: TMatrix)res: TMatrix;\nbegin\n  res := matrix(a, 1, Length(a)) >< b;\nend;\n\nfunction vector(a: array of const): TVector;\nvar\n  i, n: Integer;\nbegin\n  n := Length(a);\n  SetLength(Result, n);\n  for i := 0 to n - 1 do case a[i].VType of\n    vtInteger:  Result[i] := a[i].VInteger;\n    vtExtended: Result[i] := a[i].VExtended^;\n    vtCurrency: Result[i] := a[i].VCurrency^;\n    vtInt64:    Result[i] := a[i].VInt64^;\n  end;\nend;\n\nfunction vector(a: TMatrix): TVector; inline;\nvar\n  i, j, n, m : Integer;\nbegin\n  n := Length(a);\n  if n = 0 then Exit(nil);\n  m := Length(a[0]);\n  if m = 0 then Exit(nil);\n  SetLength(Result, m * n);\n  for i := 0 to m - 1 do\n    for j := 0 to n - 1 do\n      Result[i * n + j] := a[j][i];\nend;\n\nfunction matrix(data: TVector; nrow, ncol: Integer; byrow: Boolean): TMatrix;\nvar\n  i, j, n, c: Integer;\nbegin\n  n := Length(data);\n  if n = 0 then Exit(nil);\n  if (nrow = 0) and (ncol = 0) then ncol := 1;\n  if nrow = 0 then nrow := (n div ncol) + sign(n mod ncol);\n  if ncol = 0 then ncol := (n div nrow) + sign(n mod nrow);\n  SetLength(Result, nrow);\n  for i := 0 to nrow - 1 do begin\n    SetLength(Result[i], ncol);\n    for j := 0 to ncol - 1 do begin\n      if byrow then c := i * ncol + j else c := j * nrow + i;\n      Result[i][j] := data[c mod n];\n    end;\n  end;\nend;\n\nfunction matrix(data: TMatrix; nrow, ncol: Integer; byrow: Boolean): TMatrix;\nbegin\n  Result := matrix(vector(data), nrow, ncol, byrow);\nend;\n\nfunction rep(data: TVector; times: TVector): TVector;\nvar\n  i, j, n, m, s, c: Integer;\nbegin\n  Result := nil;\n  n := Length(data);\n  m := Length(times);\n  if n * m = 0 then Exit;\n  s := 0;\n  for i := 0 to n - 1 do begin\n    c := trunc(times[i mod m]);\n    if c > 0 then s += c;\n  end;\n  SetLength(Result, s);\n  c := 0;\n  for i := 0 to n - 1 do begin\n    s := trunc(times[i mod m]);\n    for j := 1 to s do begin\n      Result[c] := data[i];\n      Inc(c);\n    end;\n  end;\nend;\n\nfunction rep(data: TVector; len: Integer): TVector;\nvar\n  i, j, n: Integer;\nbegin\n  n := Length(data);\n  SetLength(Result, n * len);\n  if n = 0 then Exit;\n  for i := 0 to len - 1 do\n    for j := 0 to n - 1 do\n      Result[i * n + j] := data[j];\nend;\n\nfunction rep(data: Double; len: Integer): TVector;\nvar\n  i: Integer;\nbegin\n  SetLength(Result, len);\n  for i := 0 to len - 1 do Result[i] := data;\nend;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pep8/div.pep",
    "content": "main:\tSUBSP\t8, i\n\tDECI\t0, s\n\tDECI\t2, s\n\tCALL\tdiv\n\tDECO\t4, s\n\tCHARO\t'\\n', i\n\tDECO\t6, s\n\tCHARO\t'\\n', i\n\tSTOP\n\n; Divides two numbers following the euclidian method\n;\n; Parameters:\n;\tSP + 2: Dividend \n;\tSP + 4: Divider\n; Returns:\n;\tSP + 6: Quotient\n;\tSP + 8: Remain\ndiv:\t\tLDX\t0, i\n\t\tLDA\tdividend, s\ndivlp:\t\tCPA\tdivider, s\n\t\tBRLT\tdivout\n\t\tADDX\t1, i\n\t\tSUBA\tdivider, s\n\t\tBR\tdivlp\ndivout:\t\tSTX\tquot, s\n\t\tSTA\trem, s\n\t\tRET0\ndividend:\t.EQUATE 2\ndivider:\t.EQUATE 4\nquot:\t\t.EQUATE 6\nrem:\t\t.EQUATE 8\n\n\t\t.END\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pep8/flag.pep",
    "content": "_start:\tLDA\t0,i\n\tLDX\t0,i\n\tLDA\t20, i\n\tADDA\t51, i\n\tCPA\t0,i\n\tBRLT\ts3\n\tBR\ts4\ns1:\tLDBYTEA\ts3, x\n\tNOTA\n\tSTBYTEA s3, x\n\tADDX\t1,i\n\tCPX\t12, i\n\tBRNE\ts1\ns2:\tSTOP\ns4:\tLDA\t31, d\n\tLDX\t50, d\n\tRET0\n\tSTOP\ns3:\tCPX\t-27746, d\n\tANDX\t-8241, i\n\tSUBA\t-12337, sxf\n\tLDX\t-12289, sx\n\t.END\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pep8/linked.pep",
    "content": "; Linked list of integers API\n;\n; Contains the basis of the structure and a\n; variety of available functions to call on it.\n;\n; Calling conventions:\n;\n;   - When the number of arguments is <= 2, the fastcall convention will be used:\n;   Arguments will be passed by registers, no assumption is made concerning the\n;   state of the registers during execution, they will need to be saved.\n;\n;   - When the number of arguments exceeds 2, the cdecl convention will be used:\n;   Arguments will be passed on the stack, no assumption is made concerning the\n;   state of the registers during execution, they will need to be saved.\n\n; Simple test program, do no include when using the library\nmain:       SUBSP   4, i\n            DECI    mnelmt, s\n            CALL    newlst\n            LDX     mnlst, s\n            CALL    lstgetst\n            LDX     mnlst, s\n            CALL    lstsetst\n            LDX     mnlst, s\n            CALL    lstgetst\n            LDX     mnlst, s\n            CALL    shftest\n            LDX     mnlst, s\n            CALL    ushftest\n            LDX     mnlst, s\n            CALL    shftest\n            ADDSP   4, i\n            STOP\n; Pointer to the list\nmnlst:      .EQUATE 0\n; Element read\nmnelmt:     .EQUATE 2\n\n; TESTS\n\n; Simple test for the get operation\n; Gets the first element of the list and prints it\n;\n; REQUIRES: Non-empty list\n;\n; Parameters:\n;   - X: Pointer to the list\n;\n; Returns:\n;   void\nlstgetst:   SUBSP   2, i\n            LDA     0, i\n            CALL    lstget\n            STA     0, s\n            DECO    0, s\n            CHARO   '\\n', i\n            ADDSP   2, i\n            RET0\n\n; Test for the set operation\n; Sets the first element of the list to a given value\n; The value is read from stdin\n;\n; REQUIRES: Non-empty list\n;\n; Parameters:\n;   - X: Pointer to the list\n;\n; Returns:\n;   void\nlstsetst:   SUBSP   6, i\n            STX     0, s\n            DECI    4, s\n            LDA     0, i\n            STA     2, s\n            CALL    lstset\n            ADDSP   6, i\n            RET0\n\n; Tests shift operation on a list\n; Gets the last element of the list and prints it\n;\n; REQUIRES: Non-empty list\n;\n; Parameters:\n;   - X: Pointer to the list\n;\n; Returns:\n;   void\nshftest:    SUBSP   2, i\n            CALL    lstshft\n            STA     0, s\n            DECO    0, s\n            CHARO   '\\n', i\n            ADDSP   2, i\n            RET0\n\n; Tests unshift operation on a list\n; Unshifts a new element read from keyboard\n;\n; Parameters:\n;   - X: Pointer to the list\n;\n; Returns:\n;   void\nushftest:   SUBSP   2, i\n            DECI    0, s\n            LDA     0, s\n            CALL    lstunshf\n            ADDSP   2, i\n            RET0\n\n; LIBRARY\n\n; Creates a new list with `element` as head\n;\n; Parameters:\n;   SP + 4: Element\n;\n; Returns:\n;   SP + 2: Pointer to the list\nnewlst:     LDA     lstlen, i\n            CALL    new\n            STX     2, s\n            CALL    newnode\n            SUBSP   2, i\n            STX     0, s\n            LDX     nodeelmt, i\n            LDA     6, s\n            STA     0, sxf\n            LDA     0, s\n            LDX     lsthead, i\n            STA     4, sxf\n            ADDSP   2, i\n            RET0\n\n; Gets a node at specified index in a list\n;\n; Parameters:\n;   - A: Index\n;   - X: Pointer to the list\n;\n; Returns:\n;   - A: Error code (0 if no error was produced)\n;   - X: Pointer to the node\n;\n; Errors:\n;   -1: Index < 0\n;   -2: Index >= list.length\nnodeat:     SUBSP   10, i\n            STA     ndaind, s\n            STX     ndalst, s\n            LDX     lsthead, i\n            LDA     ndalst, sxf\n            STA     ndanode, s\n            LDA     ndaind, s\n            CPA     0, i\n            LDA     0, i\n            STA     ndacurri, s\n            BRGE    ndagez\n            LDA     -1, i\n            ADDSP   10, i\n            RET0\nndagez:     LDX     ndalst, s\n            CALL    listlen\n            STA     ndalstln, s\n            LDA     ndaind, s\n            CPA     ndalstln, s\n            BRLT    ndalp\n            LDA     -2, i\n            ADDSP   10, i\n            RET0\nndalp:      LDA     ndacurri, s\n            CPA     ndaind, s\n            BREQ    ndaout\n            LDX     nodenxt, i\n            LDA     ndanode, sxf\n            STA     ndanode, s\n            LDA     ndacurri, s\n            ADDA    1, i\n            STA     ndacurri, s\n            BR      ndalp\nndaout:     LDX     ndanode, s\n            LDA     0, i\n            ADDSP   10, i\n            RET0\nndaind:     .EQUATE 0\nndanode:    .EQUATE 2\nndalst:     .EQUATE 4\nndalstln:   .EQUATE 6\nndacurri:   .EQUATE 8\n\n; Length of the list passed as a parameter\n;\n; Parameters:\n;   - X: List\n;\n; Returns:\n;   - A: Length\nlistlen:    SUBSP   4, i\n            STX     lenode, s\n            LDX     lenode, sf\n            STX     lenode, s\n            LDA     0, i\n            STA     lencpt, s\nllenlp:     LDA     lenode, s\n            CPA     0, i\n            BREQ    lenout\n            LDA     lencpt, s\n            ADDA    1, i\n            STA     lencpt, s\n            LDX     nodenxt, i\n            LDA     lenode, sxf\n            STA     lenode, s\n            BR      llenlp\nlenout:     LDA     lencpt, s\n            ADDSP   4, i\n            RET0\nlenode:     .EQUATE 0\nlencpt:     .EQUATE 2\n\n; Gets an element in a list at a specified index\n;\n; Parameters:\n;   - A: Index\n;   - X: Address of the list\n;\n; Returns:\n;   - A: Element value\n;\n; Error:\n;   If out of bounds, prints an error message and stops the program\nlstget:     SUBSP   2, i\n            STA     0, s\n            CALL    nodeat\n            CPA     0, i\n            BRNE    getoob\n            LDA     0, x\n            ADDSP   2, i\n            RET0\n; Out of bounds\ngetoob:     STRO    getstrob, d\n            DECO    0, s\n            CHARO   '\\n', i\n            STOP\n; String for out of bounds error\ngetstrob:   .ASCII  \"Invalid index on get, index = \\x00\"\n\n; Sets an element in a list at a specified index to a new value\n;\n; Parameters:\n;   - SP + 2: Pointer to the list\n;   - SP + 4: Index\n;   - SP + 6: Element\n;\n; Returns:\n;   - A: 0 if all went well, an error code otherwise (analogous to the error codes in nodeat)\nlstset:     CHARO   '\\n', i\n            DECO    lstsetlp, s\n            CHARO   ' ', i\n            DECO    lstsetin, s\n            CHARO   ' ', i\n            DECO    lstsetel, s\n            CHARO   '\\n', i\n            SUBSP   2, i\n            LDX     lstsetlp, s\n            LDA     lstsetin, s\n            CALL    nodeat\n            CPA     0, i\n            BRNE    lstsetrt\n            STX     lstsetnp, s\n            LDA     lstsetel, s\n            LDX     nodeelmt, i\n            STA     lstsetnp, sxf\n            LDA     0, i\nlstsetrt:   ADDSP   2, i\n            RET0\n; Pointer to the list\nlstsetlp:   .EQUATE 4\n; Element to set the value at\nlstsetel:   .EQUATE 8\n; Index of the node\nlstsetin:   .EQUATE 6\n; Pointer to the node\nlstsetnp:   .EQUATE 0\n\n; Removes the first element of the list in parameter and returns its value\n;\n; REQUIRES: Non-empty list\n;\n; Parameters:\n;   ⁻ X: Pointer to the list\n;\n; Returns :\n;   - A: Element removed\nlstshft:    SUBSP   8, i\n            STX     lshflp, s\n            LDX     lsthead, i\n            LDA     lshflp, sxf\n            CPA     0, i\n            BREQ    shfterr\n            STA     lshfohd, s\n            LDX     nodenxt, i\n            LDA     lshfohd, sxf\n            STA     lshfnhd, s\n            LDX     lsthead, i\n            STA     lshflp, sxf\n            LDX     nodeelmt, i\n            LDA     lshfohd, sxf\n            ADDSP   8, i\n            RET0\nshfterr:    STRO    shfterrm, d\n            STOP\n; Pointer to the list\nlshflp:     .EQUATE 0\n; Pointer to the old head\nlshfohd:    .EQUATE 2\n; Old head's element\nlshfhdel:   .EQUATE 4\n; Pointer to the new head\nlshfnhd:    .EQUATE 6\n; Error message on shift\nshfterrm:   .ASCII \"Cannot do shift on empty list.\\n\\x00\"\n\n; Inserts a new element at the beginning of a list\n;\n; Parameters:\n;   - X: Pointer to the list\n;   - A: Element to add to the list\n;\n; Returns:\n;   - A: Error code, 0 if all right, a code otherwise\nlstunshf:   SUBSP   8, i\n            STA     lunshelm, s\n            STX     lunslp, s\n            CALL    newnode\n            STX     lunsnhd, s\n            LDX     lsthead, i\n            LDA     lunslp, sxf\n            STA     lunsohd, s\n            LDX     nodenxt, i\n            LDA     lunsohd, s\n            STA     lunsnhd, sxf\n            LDA     lunshelm, s\n            LDX     nodeelmt, i\n            STA     lunsohd, sxf\n            LDX     lsthead, i\n            LDA     lunsnhd, s\n            STA     lunslp, sxf\n            ADDSP   8, i\n            RET0\n; Pointer to the list\nlunslp:     .EQUATE 0\n; Pointer to the old head\nlunsohd:    .EQUATE 2\n; Pointer to the new head\nlunsnhd:    .EQUATE 4\n; Element to add\nlunshelm:   .EQUATE 6\n\n; Finds whether or not an element is present in a list\n;\n; Parameters:\n;   - X: Pointer to the list\n;   - A: Element to be found\n;\n; Returns:\n;   - A: 0 if element was not found, 1 if it was\nlstfnd:     SUBSP   6, i\n            STX     lstfndlp, s\n            STA     lstfndel, s\n            LDX     lsthead, i\n            LDA     lstfndlp, sxf\n            STA     lstfndnd, s\nfndloop:    CPA     0, i\n            BREQ    notfnd\n            LDX     nodeelmt, i\n            LDA     lstfndnd, sxf\n            CPA     lstfndel, s\n            BREQ    found\n            LDX     nodenxt, i\n            LDA     lstfndnd, sxf\n            STA     lstfndnd, s\n            BR      fndloop\nnotfnd:     LDA     0, i\n            ADDSP   6, i\n            RET0\nfound:      LDA     1, i\n            ADDSP   6, i\n            RET0\n; Pointer to the list\nlstfndlp:   .EQUATE 0\n; Element to search\nlstfndel:   .EQUATE 2\n; Current node\nlstfndnd:   .EQUATE 4\n\n; Pushes a new element at the end of the list\n;\n; Parameters:\n;   - X: Pointer to the list\n;   - A: Element to push\n;\n; Returns:\n;   - A: 0 if all went well, an error code otherwise\nlstpsh:     SUBSP   8, i\n            STX     lpshlp, s\n            STA     lpshel, s\n            CALL    newnode\n            STX     lpshnd, s\n            LDX     lpshlp, s\n            CALL    listlen\n            CPA     0, i\n            BREQ    lpshshft\n            SUBA    1, i\n            LDX     lpshlp, s\n            CALL    nodeat\n            STX     lpshlnd, s\n            LDX     nodenxt, i\n            LDA     lpshnd, s\n            STA     lpshlnd, sxf\n            LDA     lpshel, s\n            LDX     nodeelmt, i\n            STA     lpshnd, sxf\n            ADDSP   8, i\n            RET0\nlpshshft:   LDX     lpshlp, s\n            LDA     lpshel, s\n            CALL    lstunshf\n            ADDSP   8, i\n            RET0\n; Pointer to the list     \nlpshlp:     .EQUATE 0\n; Element to add to the list\nlpshel:     .EQUATE 2\n; Node to add to the list\nlpshnd:     .EQUATE 4\n; Node to append\nlpshlnd:    .EQUATE 6\n\n; Pops the last element of a list\n;\n; Parameters:\n;   - X: Pointer to the list\n;\n; Returns:\n;   - A: Element removed from the list\nlstpop:     SUBSP   6, i\n            STX     lpoplp, s\n            CALL    listlen\n            CPA     0, i\n            BRNE    poperrem\n            CPA     1, i\n            BREQ    popshft\n            SUBA    2, i\n            LDX     lpoplp, s\n            CALL    nodeat\n            STX     lpopndpr, s\n            LDX     nodenxt, i\n            LDA     lpopndpr, sxf\n            LDA     0, i\n            LDX     nodenxt, i\n            STA     lpopndpr, sxf\n            STA     lpoplnd, s\n            LDX     nodeelmt, i\n            LDA     lpoplnd, s\n            ADDSP   6, i\n            RET0\npoperrem:   STRO    poperrsm, d\n            STOP\npopshft:    LDX     lpoplp, s\n            CALL    lstshft\n            ADDSP   6, i\n            RET0\n; Pointer to the list\nlpoplp:     .EQUATE 0\n; Node to remove\nlpoplnd:    .EQUATE 2\n;New last node\nlpopndpr:   .EQUATE 4\n; Message to print when popping an empty list\npoperrsm:    .ASCII \"Error: cannot pop an empty list.\\n\\x00\"\n\n; Inserts an element in a list at a given position\n;\n; REQUIRES: Non-empty list\n;\n; Parameters:\n;   - SP + 2: Pointer to the list\n;   - SP + 4: Index to insert at\n;   - SP + 6: Element to add\n;\n; Returns:\n;   - A: Error code: 0 if all went well, -1 if index < 0, -2 if index > list.length\nlstinsat:   SUBSP   6, i\n            LDA     lstinsid, s\n            CPA     0, i\n            BRLT    lstinslz\n            BREQ    lstinush\n            LDX     lstinslp, s\n            CALL    listlen\n            CPA     lstinsel, s\n            BRLT    lstinsgl\n            BREQ    lstinpsh\n            LDX     lstinslp, s\n            LDA     lstinsel, s\n            SUBA    1, i\n            CALL    nodeat\n            STX     lstinsnd, s\n            LDX     nodenxt, i\n            LDA     lstinsnd, sxf\n            STA     lstinscx, s\n            CALL    newnode\n            STX     lstinscn, s\n            LDX     nodeelmt, i\n            LDA     lstinsel, s\n            STA     lstinscn, sxf\n            LDX     nodenxt, i\n            LDA     lstinscx, s\n            STA     lstinscn, sxf\n            LDA     lstinscn, s\n            LDX     nodenxt, i\n            STA     lstinsnd, sxf\n            ADDSP   6, i\n            RET0\nlstinush:   LDX     lstinslp, s\n            LDA     lstinsel, s\n            CALL    lstunshf\n            ADDSP   6, i\n            RET0\nlstinpsh:   LDX     lstinslp, s\n            LDA     lstinsel, s\n            CALL    lstpsh\n            ADDSP   6, i\n            RET0\n; Insert with index < 0\nlstinslz:   LDA     -1, i\n            ADDSP   6, i\n            RET0\n; Insert with index > list.length\nlstinsgl:   LDA     -2, i\n            ADDSP   6, i\n            RET0\n; List pointer\nlstinslp:   .EQUATE 8\n; Index of the newly created node\nlstinsid:   .EQUATE 10\n; Element to add\nlstinsel:   .EQUATE 12\n; Node to change the pointer to the next\nlstinsnd:   .EQUATE 0\n; Node to insert\nlstinscn:   .EQUATE 2\n; Pointer to the node after the created one (might be null)\nlstinscx:   .EQUATE 4\n\n; Removes a node at a given index in a list,\n; returns the element previously contained\n;\n; Parameters:\n;   - X: Pointer to the list\n;   - A: Index of the element\n;\n; Returns:\n;   - A: Element removed\n;\n; Error:\n;   In case of error, the program aborts with an error message\nlstremat:   SUBSP   8, i\n            STX     lremlp, s\n            STA     lremid, s\n            CPA     0, i\n            BRLT    lstremob\n            BREQ    lstremz\n            CALL    listlen\n            CPA     lremid, s\n            BRGE    lstremob\n            SUBA    1, i\n            CPA     lremid, s\n            BREQ    lrempop\n            LDA     lremid, s\n            LDX     lremlp, s\n            CALL    nodeat\n            STX     lremnd, s\n            LDA     lremid, s\n            SUBA    1, i\n            LDX     lremlp, s\n            CALL    nodeat\n            STX     lrempnd, s\n            LDX     nodenxt, i\n            LDA     lremnd, sxf\n            STA     lrempnd, sxf\n            LDX     nodeelmt, i\n            LDA     lremnd, sxf\n            ADDSP   8, i\n            RET0\nlstremz:    LDX     lremlp, s\n            CALL    lstshft\n            ADDSP   8, i\n            RET0\nlrempop:    LDX     lremlp, s\n            CALL    lstpop\n            ADDSP   8, i\n            RET0\nlstremob:   STRO    lremobst, d\n            DECO    lremid, s\n            CHARO   '\\n', i\n            STOP\n; Pointer to the list\nlremlp:     .EQUATE 0\n; Index to remove an element at\nlremid:     .EQUATE 2\n; Pointer to the node before the removed element\nlrempnd:    .EQUATE 4\n; Pointer to the node to remove\nlremnd:     .EQUATE 6\n; Error out of bounds string for remove_at\nlremobst:   .ASCII \"Error: Out of bounds in remove_at, index = \\x00\"\n\n; Creates a new node from scratch\n; Sets its content to 0/NULL\n;\n; Parameters:\n;   void\n;\n; Return:\n;   - X: Address of the node\nnewnode:    LDA     nodeln, i\n            SUBSP   2, i\n            CALL    new\n            STX     0, s\n            LDA     0, i\n            LDX     nodenxt, i\n            STA     0, sxf\n            LDX     nodeelmt, i\n            STA     0, sxf\n            LDX     0, s\n            ADDSP   2, i\n            RET0\n\n; Allocates a new structure in the heap\n;\n; Parameters:\n;   - A: Length of the structure to allocate (bytes)\n;\n; Returns:\n;   - X: Address of the allocated structure\nnew:        ADDA    hpptr, d\n            LDX     hpptr, d\n            STA     hpptr, d\n            RET0\n\n; Node in a linked list\n;\n; Contains two fields:\n;   - Element: Offset 0\n;   - Next: Offset 2\n;\nnodeln:     .EQUATE 4\nnodeelmt:   .EQUATE 0\nnodenxt:    .EQUATE 2\n\n; Linked list capsule\n;\n; Contains one field:\n;   - Head: Offset 0\n;\nlstlen:     .EQUATE 2\nlsthead:    .EQUATE 0\n\n; Pointer to the next available byte on the heap\nhpptr:      .ADDRSS heap\n; Start of the heap\nheap:       .BLOCK 1\n    .END\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pep8/msq.pep",
    "content": "; Reads a square from stdin, then computes whether it is a magic square or not.\n;\n; A Magic Square is a square following a specific set of rules, namely:\n; - The sum of each row must be the same as the sum of the diagonal\n; - The sum of the anti-diagonal must be the same as the sum of the diagonal\n; - The sum of each column must be the same as the sum of the diagonal\n;\n; If any column, row, or anti-diagonal does not follow the aformented rules,\n; the program will output its number to stdout.\n;\n; Columns are identified by a negative digit, ranging from -1 to -n\n; The anti-diagonal is identified by the number 0.\n; Finally, rows are identified by a positive integer, ranging from 1 to n.\n;\n; Formatting:\n; First a number `n` is read from Stdin, it will determine the size of the square\n; Then, enter the data for the square, `n` entries will be read\n; The data is sequentially added to the square in memory, from the upper-left corner\n; to the lower-right corner, in a zig-zag pattern\n;\n; Example:\n; 3\n; 4   9   3\n; 3   5   7\n; 8   1   6\n;\n; Limitation: Since there is no dynamic allocation, the size\n; of the square is capped at a maximum of 32*32.\n; Any size lower than 1 or higher than 32 will produce\n; an error and the termination of the program.\n\n;_start\n\t\tDECI\tsidelen, d\n\t\tLDA\tsidelen, d\n\t\tCPA\t1, i\n\t\tBRLT\tsderror\n\t\tCPA\t32, i\n\t\tBRGT\tsderror\n\t\tLDX\tsidelen, d\n\t\tCALL\tmult\n\t\tSTA\tsqlen, d\n\t\tCALL\tfillsq\n\t\tLDA\tsidelen, d\n\t\tLDX\tsquare, i\n\t\tCALL\tdiagsum\n\t\tSTA\tdgsm, d\n\t\tCALL\tcolsums\n\t\tLDA\tsidelen, d\n\t\tLDX\tsquare, i\n\t\tCALL\tcdiagsum\n\t\tCPA\tdgsm, d\n\t\tBREQ\tcnt\n\t\tDECO\t0, i\n\t\tCHARO\t'\\n', i\ncnt:\t\tSTA\tcdsm, d\n\t\tCALL\trowsums\n\t\tSTOP\nel:\t\t.BLOCK 2\n; Length of a side of the square\nsidelen:\t.WORD 0\n; Total length  of the square\nsqlen:\t\t.BLOCK 2\n; 32 * 32 square of integers\nsquare: \t.BLOCK 255\n\t\t.BLOCK 255\n\t\t.BLOCK 255\n\t\t.BLOCK 255\n\t\t.BLOCK 255\n\t\t.BLOCK 255\n\t\t.BLOCK 255\n\t\t.BLOCK 255\n\t\t.BLOCK 8\n\n; Prints an error and terminates the program\nsderror:\tSTRO stderr, d\n\t\tSTOP\n\n; Parameters:\tA: Size of a side of the square\n;\t\tX: Base address of the square\n;\t\tcscolid: Identifier of the column (0-based)\n\n; Computes the sum of each column\n; If the sum is not the same as dgsm, its index will be printed (in negative form)\n;\n; Parameters:\tA: Size of a side of the square\n;\t\tX: Address of the square\n;\n; Return:\tvoid\ncolsums:STA\tclsmsqsz, d\n\t\tSTX\tclsmsqad, d\n\t\tSUBA\t1, i\n\t\tSTA\tclsmyp, d\nclssmlp:CPA\t0 ,i\n\t\tBRLT\tclsmout\n\t\tSTA\tcscolid, d\n\t\tLDA\tclsmsqsz, d\n\t\tLDX\tclsmsqsz, d\n\t\tCALL\tcolsum\n\t\tCPA\tdgsm, d\n\t\tBREQ\tclsdecpt\n\t\tLDX\tclsmyp, d\n\t\tNEGX\n\t\tSTX\tclsmyp, d\n\t\tDECO\tclsmyp, d\n\t\tCHARO\t'\\n', i\n\t\tLDX\tclsmyp, d\n\t\tNEGX\n\t\tSTX\tclsmyp, d\nclsdecpt:\tLDA\tclsmyp, d\n\t\tSUBA\t1, i\n\t\tSTA\tclsmyp, d\n\t\tBR\tclssmlp\nclsmout:\tRET0\nclsmsqad:\t.BLOCK 2\nclsmsqsz:\t.BLOCK 2\nclsmyp_:\t\t.BLOCK 2\n\n; Compute the sum of each row\n; Prints its index if the value does not match dgsum\n;\n; Parameters:\tA: Size of a side of the square\n;\t\tX: Address of the square\n;\n; Returns:\tvoid\nrowsums:\tSTA\tmaxrows, d\n\t\tSTX\trowssqad, d\n\t\tLDA\t0, i\n\t\tSTA\ttmprwsm, d\n\t\tSTA\trowid, d\nrwsmslp:\tCPA\tmaxrows, d\n\t\tBRGE\trwsmsout\n\t\tSTA\trwxpos, d\n\t\tLDA\tmaxrows, d\n\t\tLDX\trowssqad, d\n\t\tCALL\trowsum\n\t\tCPA\tdgsm, d\n\t\tSTA\ttmprwsm, d\n\t\tBREQ\trwinccpt\n\t\tDECO\trowid, d\n\t\tCHARO\t'\\n', i\nrwinccpt:\tLDA\trowid, d\n\t\tADDA\t1, i\n\t\tSTA\trowid, d\n\t\tBR\trwsmslp\nrwsmsout:\tRET0\n; Number of rows to compute\nmaxrows:\t.BLOCK 2\n; Square address\nrowssqad:\t.BLOCK 2\n; Current rowid\nrowid:\t\t.BLOCK 2\n; Current rowsum\ntmprwsm:\t.BLOCK 2\n\n; Gets an element at the indexes given as parameter\n; The square is supposed to contain only integers\n; No check will be made on the correctness of the indexes\n;\n; Parameters:\tA: Size of a side of the square (in elements)\n;\t\tX: Base address of the square\n;\t\txpos: Position in X for the element (0-indexed)\n;\t\typos: Position in Y for the element (0-indexed)\n;\n; Return:\tA will contain the element\n;\n; Side-effects: Registers A and X will neither be saved nor restored upon call\n;\t\typos will be altered\nelemat:\t\tSTX\telsqaddr, d\n\t\tASLA\n\t\tLDX\txpos, d\n\t\tCALL\tmult\n\t\tSTA\txpos, d\n\t\tLDX\typos, d\n\t\tASLX\n\t\tSTX\typos, d\n\t\tADDA\typos, d\n\t\tADDA\telsqaddr, d\n\t\tSTA\telsqaddr, d\n\t\tLDX\telsqaddr, d\n\t\tLDA\t0, x\n\t\tRET0\n; X-index in square (in elements)\nxpos:\t\t.BLOCK 2\n; Y-index in square (in elements)\nypos:\t\t.BLOCK 2\n; Address to fetch elements at\nelsqaddr:\t.BLOCK 2\n\n; Fills the square with input from the user\n;\n; Pass via register A the number of inputs to be read\nfillsq:\t\tLDX\t0, i\nfilloop:\tSUBA\t1, i\n\t\tCPA\t0, i\n\t\tBRLT\tfillout\n\t\tDECI\tsquare, x\n\t\tADDX\t2, i\n\t\tBR\tfilloop\nfillout:\tRET0\n\n; Computes the sum of the digits of a column\n; The square is supposed to contain integers only\n;\n; Parameters:\tA: Size of a side of the square\n;\t\tX: Base address of the square\n;\t\tcscolid: Identifier of the column (0-based)\n;\n; Return:\tA: Sum of the digits of the column\ncolsum:\t\tSTA\tcsclsqsz, d\n\t\tSTX\tcsclsqad, d\n\t\tLDA\t0, i\n\t\tSTA\tcsclsum, d\n\t\tSTA\tcsclxpos, d\nclsmloop:\tCPA\tcsclsqsz, d\n\t\tBRGE\tcolout\n\t\tLDA\tcscolid, d\n\t\tSTA\typos, d\n\t\tLDA\tcsclxpos, d\n\t\tSTA\txpos, d\n\t\tLDA\tcsclsqsz, d\n\t\tLDX\tcsclsqad, d\n\t\tCALL\telemat\n\t\tADDA\tcsclsum, d\n\t\tSTA\tcsclsum, d\n\t\tLDA\tcsclxpos, d\n\t\tADDA\t1, i\n\t\tSTA\tcsclxpos, d\n\t\tBR\tclsmloop\ncolout:\t\tLDA\tcsclsum, d\n\t\tRET0\n; Identifier of the column which sum is to be computed\ncscolid:\t.BLOCK 2\n; Temporary for x position\ncsclxpos:\t.BLOCK 2\n; Base address of the square\ncsclsqad:\t.BLOCK 2\n; Size of a side of the square\ncsclsqsz:\t.BLOCK 2\n; Sum of the column\ncsclsum:\t.BLOCK 2\n\n; Computes the sum of the digits of a row\n; The square is supposed to contain integers only\n;\n; Parameters:\tA: Size of a side of the square\n;\t\tX: Base address of the square\n;\t\trwxpos: Row index (0-based)\n;\n; Returns:\tA: Sum of the digits of the row\nrowsum:\t\tSTA\trwsqsz, d\n\t\tSTX\trwbsqadr, d\n\t\tLDA\t0,i\n\t\tSTA\trwsum, d\n\t\tSTA\trwypos, d\nrwsumlp:\tLDA\trwypos, d\n\t\tCPA\trwsqsz, d\n\t\tBRGE\trwsumout\n\t\tSTA\typos, d\n\t\tLDA\trwxpos, d\n\t\tSTA\txpos, d\n\t\tLDA\trwsqsz, d\n\t\tLDX\trwbsqadr, d\n\t\tCALL\telemat\n\t\tADDA\trwsum, d\n\t\tSTA\trwsum, d\n\t\tLDA\trwypos, d\n\t\tADDA\t1, i\n\t\tSTA\trwypos, d\n\t\tBR\trwsumlp\nrwsumout:\tLDA\trwsum, d\n\t\tRET0\n; Square size (in elements)\nrwsqsz:\t\t.BLOCK 2\n; Square base address\nrwbsqadr:\t.BLOCK 2\n; Position of the row to compute\nrwxpos:\t\t.BLOCK 2\n; Current column visited\nrwypos:\t\t.BLOCK 2\n; Sum of the row\nrwsum:\t\t.BLOCK 2\n\n; Computes the sum for the antidiagonal of a square\n; The square is supposed to contain integers only\n;\n; Parameters:\tA: Size of a side of the square (elements)\n;\t\tX: Base address of the square\n;\n; Returns:\tA: Sum of the antidiagonal\ncdiagsum:\tSTA\tcdsqsz, d\n\t\tSUBA\t1,i\n\t\tSTA\tcdtmpy, d\n\t\tLDA\t0, i\n\t\tSTA\tcdtmpx, d\n\t\tSTA\tcdsum, d\n\t\tSTX\tcdsqaddr, d\ncdiaglp:\tLDA\tcdtmpx, d\n\t\tSTA\txpos, d\n\t\tLDA\tcdtmpy, d\n\t\tSTA\typos, d\n\t\tCPA\t0, i\n\t\tBRLT\tcdout\n\t\tLDA\tcdsqsz, d\n\t\tLDX\tcdsqaddr, d\n\t\tCALL\telemat\n\t\tADDA\tcdsum, d\n\t\tSTA\tcdsum,d\n\t\tLDA\tcdtmpx, d\n\t\tADDA\t1, i\n\t\tSTA\tcdtmpx, d\n\t\tLDA\tcdtmpy, d\n\t\tSUBA\t1, i\n\t\tSTA\tcdtmpy, d\n\t\tBR\tcdiaglp\ncdout:\t\tLDA\tcdsum, d\n\t\tRET0\n; Temporary handle for square size (elements)\ncdsqsz:\t\t.BLOCK 2\n; Square address\ncdsqaddr:\t.BLOCK 2\n; Keep x address\ncdtmpx:\t\t.BLOCK 2\n; Keep y address\ncdtmpy:\t\t.BLOCK 2\n; Sum of antidiagonal\ncdsum:\t\t.BLOCK 2\n\n; Computes the sum for the diagonal of a square\n; The square is supposed to contain integers only\n;\n; Parameters:\tA: Size of a side of the square (elements)\n;\t\tX: Base address of the square\n;\n; Returns:\tA: Sum of the diagonal\n;\ndiagsum:\tSTA\tdsqsz, d\n\t\tSTX\tdsqaddr, d\n\t\tLDA \t0, i\n\t\tSTA\ttmpsum, d\n\t\tSTA\tcurra, d\ndglp:\t\tCPA\tdsqsz, d\n\t\tBRGE\tdglpout\n\t\tSTA\txpos, d\n\t\tSTA\typos, d\n\t\tLDA\tdsqsz, d\n\t\tLDX\tdsqaddr, d\n\t\tCALL\telemat\n\t\tADDA\ttmpsum, d\n\t\tSTA\ttmpsum, d\n\t\tLDA\tcurra, d\n\t\tADDA\t1, i\n\t\tSTA\tcurra, d\n\t\tBR\tdglp\ndglpout:\tLDA\ttmpsum, d\n\t\tRET0\n; Address of the square\ndsqaddr:\t.BLOCK 2\n; Size of a side of the square (elements)\ndsqsz:\t\t.BLOCK 2\n; Current value of the x and y indexes\ncurra:\t\t.BLOCK 2\n; Sum of the values\ntmpsum:\t\t.BLOCK 2\n\n; Muliplies two ints\n;\n; Parameters:\n; Register A : Left part of the multiplication\n; Register X : Right part of the multiplication\n;\n; Return:\n; Register A : Result of the multiplication\n;\n; Side-effects:\n; Uses multmp as a temporary value\nmult:\t\tSTA\tmultmp, d\n\t\tLDA\t0, i\nmuloop:\t\tCPX\t0, i\n\t\tBRLE\tmulout\n\t\tADDA\tmultmp, d\n\t\tSUBX \t1, i\n\t\tBR\tmuloop\nmulout:\t\tRET0\n; Temporary variable for mult function\n; Holds the initial value of A\nmultmp:\t\t.WORD 0\n\n; For debugging purposes\n; Prints the content of the square to stdout\n;\n; Parameters: \tA: Size of a side\n;\t\tX: Base address of square\n;\n; Side-effects:\n;\t\tConsider variables sidesz, sqaddr, sqmaxa as local, they will be written\n;\t\tRegisters A and X will not be saved nor restored upon call\nprintsq:\tSTA\tsidesz, d\n\t\tSTX\tsqaddr, d\n\t\tLDX\tsidesz, d\n\t\tCALL\tmult\n\t\tASLA\n\t\tADDA\tsqaddr, d\n\t\tSTA\tsqmaxa, d\n\t\tLDX\tsqaddr, d\n\t\tLDA\t0, i\npriloop:\tDECO\t0, x\n\t\tCHARO\t' ', i\n\t\tADDX\t2, i\n\t\tCPX\tsqmaxa, d\n\t\tBREQ\tpriout\n\t\tADDA\t1, i\n\t\tCPA\tsidesz, d\n\t\tBRLT\tpriloop\n\t\tLDA \t0, i\n\t\tCHARO\t'\\n', i\n\t\tBR\tpriloop\npriout:\t\tRET0\n; Size of a side of the square\nsidesz: \t.BLOCK 2\n; Address of the square\nsqaddr: \t.BLOCK 2\n; Maximum address to iterate upon\nsqmaxa: \t.BLOCK 2\n\n; ------------------ GLOBALLY ACCESSIBLE SYMBOLS -------------------- ;\n;\n; Sum of the diagonal for the square\n; Reference value for magic-square\ndgsm:\t\t.WORD 0\n; Sum of the counter-diagonal\ncdsm:\t\t.WORD 0\n; Input error string\nstderr:\t\t.ASCII \"A number between 1 and 32 (both inclusive) must be entered as value for the size of the square for the program to work.\\n\\x00\"\n\t\t.END\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pep8/qsort.pep",
    "content": "; Sorts a statically defined array using the recursive implementation\n; of the quicksort algorithm.\n;\n; In this implementation, the pivot is supposed to be the rightmost\n; value of the slice of the array being sorted.\n;\n; Note that the code presented below should work on any array,\n; whether defined statically or dynamically.\n;\n; Calling conventions:\n;\tExcept when mentionned otherwise, every parameter is to be passed on the stack.\n;\tThe return values are also on the stack.\n;\tNo assumption is to be made on the content of a register on a function call.\n;\tThe values of the registers are to be locally saved for further use if necessary.\nmain:\t\tSUBSP\t4, i\n\t\tLDA\t11, i\n\t\tASLA\n\t\tSTA\t2, s\n\t\tLDA\tarr, i\n\t\tSTA\t0, s\n\t\tCALL\tprintarr\n\t\tSUBSP\t2, i\n\t\tLDA\tarr, i\n\t\tSTA\t0, s\n\t\tLDA\t0, i\n\t\tSTA\t2, s\n\t\tLDA\t10, i\n\t\tSTA\t4, s\n\t\tCALL\tqsort\n\t\tADDSP\t2, i\n\t\tCHARO\t'\\n', i\n\t\tLDA\t11, i\n\t\tASLA\n\t\tSTA\t2, s\n\t\tLDA\tarr, i\n\t\tSTA\t0, s\n\t\tCALL\tprintarr\n\t\tSTOP\n\n; Sorts an array using the quicksort algorithm\n;\n; Parameters:\n;\t- SP + 2: Address of the array\n;\t- SP + 4: Left bound\n;\t- SP + 6: Right bound\n; Returns:\n;\tvoid\nqsort:\t\tSUBSP\t2, i\n\t\tLDA\tqsarrlb, s\n\t\tCPA\tqsarrrb, s\n\t\tBRGE\tqsortout\n\t\tSUBSP\t6, i\n\t\tLDA\t10, s\n\t\tSTA\t0, s\n\t\tLDA\t12, s\n\t\tSTA\t2, s\n\t\tLDA\t14, s\n\t\tSTA\t4, s\n\t\tCALL\tpart\n\t\tLDA\t10, s\n\t\tSTA\t0, s\n\t\tLDA\t12, s\n\t\tSTA\t2, s\n\t\tLDA\t6, s\n\t\tSUBA\t1, i\n\t\tSTA\t4, s\n\t\tCALL\tqsort\n\t\tLDA\t10, s\n\t\tSTA\t0, s\n\t\tLDA\t6, s\n\t\tADDA\t1, i\n\t\tSTA\t2, s\n\t\tLDA\t14, s\n\t\tSTA\t4, s\n\t\tCALL\tqsort\n\t\tADDSP\t6, i\nqsortout:\tADDSP\t2, i\n\t\tRET0\n; Address of the array\nqsarradd:\t.EQUATE 4\n; Left bound\nqsarrlb:\t.EQUATE 6\n; Right bound\nqsarrrb:\t.EQUATE 8\n; Pivot value returned by the part command\nqsortp:\t\t.EQUATE 0\n\n; Partitions an array in two following the quicksort rules.\n;\n; All the lower values compared to the pivot will be on the left\n; All the upper values compared to the pivot will be on the right\n; The pivot's final index is then returned\n;\n; Parameters:\n;\t- SP + 2: Address of the array\n;\t- SP + 4: Left bound\n;\t- SP + 6: Right bound\n;\n; Returns:\n;\t- SP + 8: Pivot final index\npart:\t\tSUBSP\t8, i\n\t\tLDA\tparrrb, s\n\t\tSTA\tpartpiv, s\n\t\tLDA\tparrlb, s\n\t\tSTA\tpstind, s\n\t\tSTA\tpiter, s\npartflp:\tCPA\tparrrb, s\n\t\tBRGE\tpartout\n\t\tLDX\tpiter, s\n\t\tASLX\n\t\tLDA\tparaddr, sxf\n\t\tSTA\tparrival, s\n\t\tLDX\tpartpiv, s\n\t\tASLX\n\t\tLDA\tparaddr, sxf\n\t\tCPA\tparrival, s\n\t\tBRLT\tparlpinc\n\t\tSUBSP\t6, i ; Call swap(arr, i, st_index)\n\t\tLDA\t16, s\n\t\tSTA\t0, s\n\t\tLDA\t8, s\n\t\tSTA\t2, s\n\t\tLDA\t10, s\n\t\tSTA\t4, s\n\t\tCALL\tswap\n\t\tADDSP\t6, i\n\t\tLDA\tpstind, s\n\t\tADDA\t1, i\n\t\tSTA\tpstind, s\nparlpinc:\tLDA\tpiter, s\n\t\tADDA\t1, i\n\t\tSTA\tpiter, s\n\t\tBR\tpartflp\npartout:\tSUBSP\t6, i ; Call swap(arr, piv, st_index)\n\t\tLDA\t16, s\n\t\tSTA\t0, s\n\t\tLDA\t12, s\n\t\tSTA\t2, s\n\t\tLDA\t10, s\n\t\tSTA\t4, s\n\t\tCALL\tswap\n\t\tADDSP\t6, i\n\t\tLDA\tpstind, s\n\t\tADDSP\t8, i\n\t\tSTA\t8, s\n\t\tRET0\n; Address of the array\t\t\nparaddr:\t.EQUATE 10\n; Left bound\nparrlb:\t\t.EQUATE 12\n; Right bound\nparrrb:\t\t.EQUATE 14\n; Pivot value\npartpiv:\t.EQUATE 6\n; st_index\npstind:\t\t.EQUATE 4\n; For iterator value\npiter:\t\t.EQUATE 2\n; arr[i] value \nparrival:\t.EQUATE 0\n\n; Swaps the value of two elements of an array of integers\n;\n; Parameters:\n;\t- SP + 2: Address of the array\n;\t- SP + 4: Index of the 1st element to swap\n;\t- SP + 6: Index of the 2nd element to swap\n;\n; Returns:\n;\tvoid\nswap:\t\tSUBSP\t2, i\n\t\tLDX\tfstelind, s\n\t\tASLX\n\t\tLDA\tarraddr, sxf\n\t\tSTA\tswaptmp, s\n\t\tLDX\tsecelind, s\n\t\tASLX\n\t\tLDA\tarraddr, sxf\n\t\tLDX\tfstelind, s\n\t\tASLX\n\t\tSTA\tarraddr, sxf\n\t\tLDA\tswaptmp, s\n\t\tLDX\tsecelind, s\n\t\tASLX\n\t\tSTA\tarraddr, sxf\n\t\tADDSP\t2, i\n\t\tRET0\n; Temporary value for the swap\nswaptmp:\t.EQUATE 0\n; Address of the array on which the swap is done\narraddr:\t.EQUATE 4\n; Index of the first element\nfstelind:\t.EQUATE 6\n; Index of the second element\nsecelind:\t.EQUATE 8\n\n; Prints the content of an array\n;\n; Parameters:\n;\tSP + 2: Address of the array\n;\tSP + 4: Length of the array\n;\n; Returns:\n;\tvoid\nprintarr:\tLDX\t0, i\nparrlp:\t\tCPX\t4, s\n\t\tBRGE\tparrout\n\t\tDECO\t2, sxf\n\t\tCHARO\t' ', i\n\t\tADDX\t2, i\n\t\tBR\tparrlp\nparrout:\tRET0\n\n; Unsorted array for testing purposes\narr:\t.WORD 9\n\t.WORD 5\n\t.WORD 8\n\t.WORD 10\n\t.WORD 4\n\t.WORD 7\n\t.WORD 0\n\t.WORD 3\n\t.WORD 2\n\t.WORD 1\n\t.WORD 6\n\n\t.END\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pep8/stri_buf.pep",
    "content": "main:\n\n; Reads a string in stdin, returns the buffer it was read in\n; Stops reading at the first encounter of a \\n character.\n;\n; Parameters:\n;\tvoid\n;\n; Returns:\n;\t- X: Address of the buffer\nstri:\t\tSUBSP\t2, i\n\t\tLDA\t32, i\n\t\tCALL\tnew\n\t\tCPX\tbuflen, s\n\t\tBRGE\tstrinlrg\nstrinlrg:\tLDA\tbuflen, d\n\t\tLDX\t2, i\n\t\tCALL\tmult\n\t\tSTA\tbuflen\n\t\tCALL\tnew\n\t\t\nbuflen:\t\t.EQUATE 0\n\n; Copies the content of a buffer to another one\n;\n; Parameters:\n;\t- SP + 2: Destination buffer\n;\t- SP + 4: Source buffer\n;\t- SP + 6: Length to copy\nmemcpy:\t\tLDX\t0, i\nmemcplp:\tCPX\tcpylen, s\n\t\tBREQ\tmemcpout\n\t\tLDBYTEA\tsrcbuf, sxf\n\t\tSTBYTEA\tdstbuf, sxf\n\t\tADDX\t1, i\n\t\tBR\tmemcplp\nmemcpout:\tRET0\n; Destination buffer\ndtsbuf:\t\t.EQUATE 2\n; Source buffer\nsrcbuf:\t\t.EQUATE 4\n; Copy length\ncpylen:\t\t.EQUATE 6\n\n; Allocates a new structure in the heap\n;\n; Parameters:\n;\t- A: Length of the structure to allocate (bytes)\n;\n; Returns:\n;\t- X: Address of the allocated structure\nnew:\t\tADDA\thpptr, d\n\t\tLDX\thpptr, d\n\t\tSTA\thpptr, d\n\t\tRET0\n\n; Pointer to the next available byte on the heap\nhpptr:\t\t.ADDRSS heap\n; Start of the heap\nheap:\t\t.BLOCK 1\n\t.END\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pep8/stristack.pep",
    "content": "main:\t\tSUBSP\t34, i\n\t\tLDA\t31, i\n\t\tSTA\t0, s\n\t\tCALL\tfgets\n\t\tADDSP\t2, i\n\t\tCALL\tststro\n\t\tSTOP\n\n; Reads a string from stdin, stops reading when one of the following is true:\n;\t- Read a \\n\n;\t- Read a maximum of `max` chars\n;\n; Parameters:\n;\t- SP + 2: `max`, the maximum number of chars to read\n;\t- SP + 4: `buffer` of length `max` + 1\n; Returns:\n;\tvoid\nfgets:\t\tLDX\t0, i\n\t\tLDA\t0, i\nfgetslp:\tCHARI\tbuffer, sx\n\t\tLDBYTEA\tbuffer, sx\n\t\tCPA\t'\\n', i\n\t\tBREQ\tfout\n\t\tCPX\tmax, s\n\t\tBREQ\tfout\n\t\tADDX\t1, i\n\t\tBR\tfgetslp\nfout:\t\tLDA\t'\\x00', i\n\t\tSTBYTEA\tbuffer, sx\n\t\tRET0\nmax:\t.EQUATE 2\nbuffer: .EQUATE 4\n\n; Prints a string stored in stack\n;\n; Parameters:\n;\tSP + 2: `string`\n; Returns:\n;\tvoid\nststro:\t\tLDX\t0, i\n\t\tLDA\t0, i\nstrolp:\t\tLDBYTEA\tstring, sx\n\t\tCPA\t'\\x00', i\n\t\tBREQ\tstrout\n\t\tCHARO\tstring, sx\n\t\tADDX\t1, i\n\t\tBR\tstrolp\nstrout:\t\tRET0\nstring: .EQUATE 2\n\t.END\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/Ack.pm",
    "content": "package App::Ack;\n\nuse warnings;\nuse strict;\n\nuse File::Next 0.40;\n\nuse App::Ack::Plugin::Basic;\n\n=head1 NAME\n\nApp::Ack - A container for functions for the ack program\n\n=head1 VERSION\n\nVersion 1.94\n\n=cut\n\nour $VERSION;\nour $COPYRIGHT;\nBEGIN {\n    $VERSION = '1.96';\n    $COPYRIGHT = 'Copyright 2005-2011 Andy Lester.';\n}\n\nour $fh;\n\nBEGIN {\n    $fh = *STDOUT;\n}\n\n\nour %types;\nour %type_wanted;\nour %mappings;\nour %ignore_dirs;\n\nour $input_from_pipe;\nour $output_to_pipe;\n\nour $dir_sep_chars;\nour $is_cygwin;\nour $is_windows;\n\nuse File::Spec ();\nuse File::Glob ':glob';\nuse Getopt::Long ();\n\nBEGIN {\n    %ignore_dirs = (\n        '.bzr'              => 'Bazaar',\n        '.cdv'              => 'Codeville',\n        '~.dep'             => 'Interface Builder',\n        '~.dot'             => 'Interface Builder',\n        '~.nib'             => 'Interface Builder',\n        '~.plst'            => 'Interface Builder',\n        '.git'              => 'Git',\n        '.hg'               => 'Mercurial',\n        '.pc'               => 'quilt',\n        '.svn'              => 'Subversion',\n        _MTN                => 'Monotone',\n        blib                => 'Perl module building',\n        CVS                 => 'CVS',\n        RCS                 => 'RCS',\n        SCCS                => 'SCCS',\n        _darcs              => 'darcs',\n        _sgbak              => 'Vault/Fortress',\n        'autom4te.cache'    => 'autoconf',\n        'cover_db'          => 'Devel::Cover',\n        _build              => 'Module::Build',\n    );\n\n    %mappings = (\n        actionscript => [qw( as mxml )],\n        ada         => [qw( ada adb ads )],\n        asm         => [qw( asm s )],\n        batch       => [qw( bat cmd )],\n        binary      => q{Binary files, as defined by Perl's -B op (default: off)},\n        cc          => [qw( c h xs )],\n        cfmx        => [qw( cfc cfm cfml )],\n        clojure     => [qw( clj )],\n        cpp         => [qw( cpp cc cxx m hpp hh h hxx )],\n        csharp      => [qw( cs )],\n        css         => [qw( css )],\n        delphi      => [qw( pas int dfm nfm dof dpk dproj groupproj bdsgroup bdsproj )],\n        elisp       => [qw( el )],\n        erlang      => [qw( erl hrl )],\n        fortran     => [qw( f f77 f90 f95 f03 for ftn fpp )],\n        go          => [qw( go )],\n        groovy      => [qw( groovy gtmpl gpp grunit )],\n        haskell     => [qw( hs lhs )],\n        hh          => [qw( h )],\n        html        => [qw( htm html shtml xhtml )],\n        java        => [qw( java properties )],\n        js          => [qw( js )],\n        jsp         => [qw( jsp jspx jhtm jhtml )],\n        lisp        => [qw( lisp lsp )],\n        lua         => [qw( lua )],\n        make        => q{Makefiles (including *.mk and *.mak)},\n        mason       => [qw( mas mhtml mpl mtxt )],\n        objc        => [qw( m h )],\n        objcpp      => [qw( mm h )],\n        ocaml       => [qw( ml mli )],\n        parrot      => [qw( pir pasm pmc ops pod pg tg )],\n        perl        => [qw( pl pm pm6 pod t psgi )],\n        php         => [qw( php phpt php3 php4 php5 phtml)],\n        plone       => [qw( pt cpt metadata cpy py )],\n        python      => [qw( py )],\n        rake        => q{Rakefiles},\n        ruby        => [qw( rb rhtml rjs rxml erb rake spec )],\n        scala       => [qw( scala )],\n        scheme      => [qw( scm ss )],\n        shell       => [qw( sh bash csh tcsh ksh zsh )],\n        skipped     => q{Files, but not directories, normally skipped by ack (default: off)},\n        smalltalk   => [qw( st )],\n        sql         => [qw( sql ctl )],\n        tcl         => [qw( tcl itcl itk )],\n        tex         => [qw( tex cls sty )],\n        text        => q{Text files, as defined by Perl's -T op (default: off)},\n        tt          => [qw( tt tt2 ttml )],\n        vb          => [qw( bas cls frm ctl vb resx )],\n        verilog     => [qw( v vh sv )],\n        vhdl        => [qw( vhd vhdl )],\n        vim         => [qw( vim )],\n        yaml        => [qw( yaml yml )],\n        xml         => [qw( xml dtd xsl xslt ent )],\n    );\n\n    while ( my ($type,$exts) = each %mappings ) {\n        if ( ref $exts ) {\n            for my $ext ( @{$exts} ) {\n                push( @{$types{$ext}}, $type );\n            }\n        }\n    }\n    # add manually Makefile extensions\n    push @{$types{$_}}, 'make' for qw{ mk mak };\n\n    # These have to be checked before any filehandle diddling.\n    $output_to_pipe  = not -t *STDOUT;\n    $input_from_pipe = -p STDIN;\n\n    $is_cygwin       = ($^O eq 'cygwin');\n    $is_windows      = ($^O =~ /MSWin32/);\n    $dir_sep_chars   = $is_windows ? quotemeta( '\\\\/' ) : quotemeta( File::Spec->catfile( '', '' ) );\n}\n\n=head1 SYNOPSIS\n\nIf you want to know about the F<ack> program, see the F<ack> file itself.\n\nNo user-serviceable parts inside.  F<ack> is all that should use this.\n\n=head1 FUNCTIONS\n\n=head2 read_ackrc\n\nReads the contents of the .ackrc file and returns the arguments.\n\n=cut\n\nsub read_ackrc {\n    my @files = ( $ENV{ACKRC} );\n    my @dirs =\n        $is_windows\n            ? ( $ENV{HOME}, $ENV{USERPROFILE} )\n            : ( '~', $ENV{HOME} );\n    for my $dir ( grep { defined } @dirs ) {\n        for my $file ( '.ackrc', '_ackrc' ) {\n            push( @files, bsd_glob( \"$dir/$file\", GLOB_TILDE ) );\n        }\n    }\n    for my $filename ( @files ) {\n        if ( defined $filename && -e $filename ) {\n            open( my $fh, '<', $filename ) or App::Ack::die( \"$filename: $!\\n\" );\n            my @lines = grep { /./ && !/^\\s*#/ } <$fh>;\n            chomp @lines;\n            close $fh or App::Ack::die( \"$filename: $!\\n\" );\n\n            # get rid of leading and trailing whitespaces\n            for ( @lines ) {\n               s/^\\s+//;\n               s/\\s+$//;\n            }\n\n            return @lines;\n        }\n    }\n\n    return;\n}\n\n=head2 get_command_line_options()\n\nGets command-line arguments and does the Ack-specific tweaking.\n\n=cut\n\nsub get_command_line_options {\n    my %opt = (\n        pager => $ENV{ACK_PAGER_COLOR} || $ENV{ACK_PAGER},\n    );\n\n    my $getopt_specs = {\n        1                       => sub { $opt{1} = $opt{m} = 1 },\n        'A|after-context=i'     => \\$opt{after_context},\n        'B|before-context=i'    => \\$opt{before_context},\n        'C|context:i'           => sub { shift; my $val = shift; $opt{before_context} = $opt{after_context} = ($val || 2) },\n        'a|all-types'           => \\$opt{all},\n        'break!'                => \\$opt{break},\n        c                       => \\$opt{count},\n        'color|colour!'         => \\$opt{color},\n        'color-match=s'         => \\$ENV{ACK_COLOR_MATCH},\n        'color-filename=s'      => \\$ENV{ACK_COLOR_FILENAME},\n        'color-lineno=s'        => \\$ENV{ACK_COLOR_LINENO},\n        'column!'               => \\$opt{column},\n        count                   => \\$opt{count},\n        'env!'                  => sub { }, # ignore this option, it is handled beforehand\n        f                       => \\$opt{f},\n        flush                   => \\$opt{flush},\n        'follow!'               => \\$opt{follow},\n        'g=s'                   => sub { shift; $opt{G} = shift; $opt{f} = 1 },\n        'G=s'                   => \\$opt{G},\n        'group!'                => sub { shift; $opt{heading} = $opt{break} = shift },\n        'heading!'              => \\$opt{heading},\n        'h|no-filename'         => \\$opt{h},\n        'H|with-filename'       => \\$opt{H},\n        'i|ignore-case'         => \\$opt{i},\n        'invert-file-match'     => \\$opt{invert_file_match},\n        'lines=s'               => sub { shift; my $val = shift; push @{$opt{lines}}, $val },\n        'l|files-with-matches'  => \\$opt{l},\n        'L|files-without-matches' => sub { $opt{l} = $opt{v} = 1 },\n        'm|max-count=i'         => \\$opt{m},\n        'match=s'               => \\$opt{regex},\n        'n|no-recurse'          => \\$opt{n},\n        o                       => sub { $opt{output} = '$&' },\n        'output=s'              => \\$opt{output},\n        'pager=s'               => \\$opt{pager},\n        'nopager'               => sub { $opt{pager} = undef },\n        'passthru'              => \\$opt{passthru},\n        'print0'                => \\$opt{print0},\n        'Q|literal'             => \\$opt{Q},\n        'r|R|recurse'           => sub { $opt{n} = 0 },\n        'show-types'            => \\$opt{show_types},\n        'smart-case!'           => \\$opt{smart_case},\n        'sort-files'            => \\$opt{sort_files},\n        'u|unrestricted'        => \\$opt{u},\n        'v|invert-match'        => \\$opt{v},\n        'w|word-regexp'         => \\$opt{w},\n\n        'ignore-dirs=s'         => sub { shift; my $dir = remove_dir_sep( shift ); $ignore_dirs{$dir} = '--ignore-dirs' },\n        'noignore-dirs=s'       => sub { shift; my $dir = remove_dir_sep( shift ); delete $ignore_dirs{$dir} },\n\n        'version'   => sub { print_version_statement(); exit; },\n        'help|?:s'  => sub { shift; show_help(@_); exit; },\n        'help-types'=> sub { show_help_types(); exit; },\n        'man'       => sub {\n            require Pod::Usage;\n            Pod::Usage::pod2usage({\n                -verbose => 2,\n                -exitval => 0,\n            });\n        },\n\n        'type=s'    => sub {\n            # Whatever --type=xxx they specify, set it manually in the hash\n            my $dummy = shift;\n            my $type = shift;\n            my $wanted = ($type =~ s/^no//) ? 0 : 1; # must not be undef later\n\n            if ( exists $type_wanted{ $type } ) {\n                $type_wanted{ $type } = $wanted;\n            }\n            else {\n                App::Ack::die( qq{Unknown --type \"$type\"} );\n            }\n        }, # type sub\n    };\n\n    # Stick any default switches at the beginning, so they can be overridden\n    # by the command line switches.\n    unshift @ARGV, split( ' ', $ENV{ACK_OPTIONS} ) if defined $ENV{ACK_OPTIONS};\n\n    # first pass through options, looking for type definitions\n    def_types_from_ARGV();\n\n    for my $i ( filetypes_supported() ) {\n        $getopt_specs->{ \"$i!\" } = \\$type_wanted{ $i };\n    }\n\n\n    my $parser = Getopt::Long::Parser->new();\n    $parser->configure( 'bundling', 'no_ignore_case', );\n    $parser->getoptions( %{$getopt_specs} ) or\n        App::Ack::die( 'See ack --help, ack --help-types or ack --man for options.' );\n\n    my $to_screen = not output_to_pipe();\n    my %defaults = (\n        all            => 0,\n        color          => $to_screen,\n        follow         => 0,\n        break          => $to_screen,\n        heading        => $to_screen,\n        before_context => 0,\n        after_context  => 0,\n    );\n    if ( $is_windows && $defaults{color} && not $ENV{ACK_PAGER_COLOR} ) {\n        if ( $ENV{ACK_PAGER} || not eval { require Win32::Console::ANSI } ) {\n            $defaults{color} = 0;\n        }\n    }\n    if ( $to_screen && $ENV{ACK_PAGER_COLOR} ) {\n        $defaults{color} = 1;\n    }\n\n    while ( my ($key,$value) = each %defaults ) {\n        if ( not defined $opt{$key} ) {\n            $opt{$key} = $value;\n        }\n    }\n\n    if ( defined $opt{m} && $opt{m} <= 0 ) {\n        App::Ack::die( '-m must be greater than zero' );\n    }\n\n    for ( qw( before_context after_context ) ) {\n        if ( defined $opt{$_} && $opt{$_} < 0 ) {\n            App::Ack::die( \"--$_ may not be negative\" );\n        }\n    }\n\n    if ( defined( my $val = $opt{output} ) ) {\n        $opt{output} = eval qq[ sub { \"$val\" } ];\n    }\n    if ( defined( my $l = $opt{lines} ) ) {\n        # --line=1 --line=5 is equivalent to --line=1,5\n        my @lines = split( /,/, join( ',', @{$l} ) );\n\n        # --line=1-3 is equivalent to --line=1,2,3\n        @lines = map {\n            my @ret;\n            if ( /-/ ) {\n                my ($from, $to) = split /-/, $_;\n                if ( $from > $to ) {\n                    App::Ack::warn( \"ignoring --line=$from-$to\" );\n                    @ret = ();\n                }\n                else {\n                    @ret = ( $from .. $to );\n                }\n            }\n            else {\n                @ret = ( $_ );\n            };\n            @ret\n        } @lines;\n\n        if ( @lines ) {\n            my %uniq;\n            @uniq{ @lines } = ();\n            $opt{lines} = [ sort { $a <=> $b } keys %uniq ];   # numerical sort and each line occurs only once!\n        }\n        else {\n            # happens if there are only ignored --line directives\n            App::Ack::die( 'All --line options are invalid.' );\n        }\n    }\n\n    return \\%opt;\n}\n\n=head2 def_types_from_ARGV\n\nGo through the command line arguments and look for\nI<--type-set foo=.foo,.bar> and I<--type-add xml=.rdf>.\nRemove them from @ARGV and add them to the supported filetypes,\ni.e. into %mappings, etc.\n\n=cut\n\nsub def_types_from_ARGV {\n    my @typedef;\n\n    my $parser = Getopt::Long::Parser->new();\n        # pass_through   => leave unrecognized command line arguments alone\n        # no_auto_abbrev => otherwise -c is expanded and not left alone\n    $parser->configure( 'no_ignore_case', 'pass_through', 'no_auto_abbrev' );\n    $parser->getoptions(\n        'type-set=s' => sub { shift; push @typedef, ['c', shift] },\n        'type-add=s' => sub { shift; push @typedef, ['a', shift] },\n    ) or App::Ack::die( 'See ack --help or ack --man for options.' );\n\n    for my $td (@typedef) {\n        my ($type, $ext) = split /=/, $td->[1];\n\n        if ( $td->[0] eq 'c' ) {\n            # type-set\n            if ( exists $mappings{$type} ) {\n                # can't redefine types 'make', 'skipped', 'text' and 'binary'\n                App::Ack::die( qq{--type-set: Builtin type \"$type\" cannot be changed.} )\n                    if ref $mappings{$type} ne 'ARRAY';\n\n                delete_type($type);\n            }\n        }\n        else {\n            # type-add\n\n            # can't append to types 'make', 'skipped', 'text' and 'binary'\n            App::Ack::die( qq{--type-add: Builtin type \"$type\" cannot be changed.} )\n                if exists $mappings{$type} && ref $mappings{$type} ne 'ARRAY';\n\n            App::Ack::warn( qq{--type-add: Type \"$type\" does not exist, creating with \"$ext\" ...} )\n                unless exists $mappings{$type};\n        }\n\n        my @exts = split /,/, $ext;\n        s/^\\.// for @exts;\n\n        if ( !exists $mappings{$type} || ref($mappings{$type}) eq 'ARRAY' ) {\n            push @{$mappings{$type}}, @exts;\n            for my $e ( @exts ) {\n                push @{$types{$e}}, $type;\n            }\n        }\n        else {\n            App::Ack::die( qq{Cannot append to type \"$type\".} );\n        }\n    }\n\n    return;\n}\n\n=head2 delete_type\n\nRemoves a type from the internal structures containing type\ninformation: %mappings, %types and %type_wanted.\n\n=cut\n\nsub delete_type {\n    my $type = shift;\n\n    App::Ack::die( qq{Internal error: Cannot delete builtin type \"$type\".} )\n        unless ref $mappings{$type} eq 'ARRAY';\n\n    delete $mappings{$type};\n    delete $type_wanted{$type};\n    for my $ext ( keys %types ) {\n        $types{$ext} = [ grep { $_ ne $type } @{$types{$ext}} ];\n    }\n}\n\n=head2 ignoredir_filter\n\nStandard filter to pass as a L<File::Next> descend_filter.  It\nreturns true if the directory is any of the ones we know we want\nto ignore.\n\n=cut\n\nsub ignoredir_filter {\n    return !exists $ignore_dirs{$_} && !exists $ignore_dirs{$File::Next::dir};\n}\n\n=head2 remove_dir_sep( $path )\n\nThis functions removes a trailing path separator, if there is one, from its argument\n\n=cut\n\nsub remove_dir_sep {\n    my $path = shift;\n    $path =~ s/[$dir_sep_chars]$//;\n\n    return $path;\n}\n\n=head2 filetypes( $filename )\n\nReturns a list of types that I<$filename> could be.  For example, a file\nF<foo.pod> could be \"perl\" or \"parrot\".\n\nThe filetype will be C<undef> if we can't determine it.  This could\nbe if the file doesn't exist, or it can't be read.\n\nIt will be 'skipped' if it's something that ack should avoid searching,\neven under -a.\n\n=cut\n\nuse constant TEXT => 'text';\n\nsub filetypes {\n    my $filename = shift;\n\n    my $basename = $filename;\n    $basename =~ s{.*[$dir_sep_chars]}{};\n\n    return 'skipped' unless is_searchable( $basename );\n\n    my $lc_basename = lc $basename;\n    return ('make',TEXT)        if $lc_basename eq 'makefile' || $lc_basename eq 'gnumakefile';\n    return ('rake','ruby',TEXT) if $lc_basename eq 'rakefile';\n\n    # If there's an extension, look it up\n    if ( $filename =~ m{\\.([^\\.$dir_sep_chars]+)$}o ) {\n        my $ref = $types{lc $1};\n        return (@{$ref},TEXT) if $ref;\n    }\n\n    # At this point, we can't tell from just the name.  Now we have to\n    # open it and look inside.\n\n    return unless -e $filename;\n    # From Elliot Shank:\n    #     I can't see any reason that -r would fail on these-- the ACLs look\n    #     fine, and no program has any of them open, so the busted Windows\n    #     file locking model isn't getting in there.  If I comment the if\n    #     statement out, everything works fine\n    # So, for cygwin, don't bother trying to check for readability.\n    if ( !$is_cygwin ) {\n        if ( !-r $filename ) {\n            App::Ack::warn( \"$filename: Permission denied\" );\n            return;\n        }\n    }\n\n    return 'binary' if -B $filename;\n\n    # If there's no extension, or we don't recognize it, check the shebang line\n    my $fh;\n    if ( !open( $fh, '<', $filename ) ) {\n        App::Ack::warn( \"$filename: $!\" );\n        return;\n    }\n    my $header = <$fh>;\n    close $fh;\n\n    if ( $header =~ /^#!/ ) {\n        return ($1,TEXT)       if $header =~ /\\b(ruby|lua|p(?:erl|hp|ython))-?(\\d[\\d.]*)?\\b/;\n        return ('shell',TEXT)  if $header =~ /\\b(?:ba|t?c|k|z)?sh\\b/;\n    }\n    else {\n        return ('xml',TEXT)    if $header =~ /\\Q<?xml /i;\n    }\n\n    return (TEXT);\n}\n\n=head2 is_searchable( $filename )\n\nReturns true if the filename is one that we can search, and false\nif it's one that we should skip like a coredump or a backup file.\n\nRecognized files:\n  /~$/            - Unix backup files\n  /#.+#$/         - Emacs swap files\n  /[._].*\\.swp$/  - Vi(m) swap files\n  /core\\.\\d+$/    - core dumps\n  /[.-]min\\.js$/  - Minified javascript files\n\nNote that I<$filename> must be just a file, not a full path.\n\n=cut\n\nsub is_searchable {\n    my $filename = shift;\n\n    # If these are updated, update the --help message\n    return if $filename =~ /[.]bak$/;\n    return if $filename =~ /~$/;\n    return if $filename =~ m{^#.*#$}o;\n    return if $filename =~ m{^core\\.\\d+$}o;\n    return if $filename =~ m{[._].*\\.swp$}o;\n    return if $filename =~ /[.-]min\\.js$/;\n\n    return 1;\n}\n\n=head2 build_regex( $str, \\%opts )\n\nReturns a regex object based on a string and command-line options.\n\nDies when the regex $str is undefinied (i.e. not given on command line).\n\n=cut\n\nsub build_regex {\n    my $str = shift;\n    my $opt = shift;\n\n    defined $str or App::Ack::die( 'No regular expression found.' );\n\n    $str = quotemeta( $str ) if $opt->{Q};\n    if ( $opt->{w} ) {\n        $str = \"\\\\b$str\" if $str =~ /^\\w/;\n        $str = \"$str\\\\b\" if $str =~ /\\w$/;\n    }\n\n    my $regex_is_lc = $str eq lc $str;\n    if ( $opt->{i} || ($opt->{smart_case} && $regex_is_lc) ) {\n        $str = \"(?i)$str\";\n    }\n\n    return $str;\n}\n\n=head2 check_regex( $regex_str )\n\nChecks that the $regex_str can be compiled into a perl regular expression.\nDies with the error message if this is not the case.\n\nNo return value.\n\n=cut\n\nsub check_regex {\n    my $regex = shift;\n\n    return unless defined $regex;\n\n    eval { qr/$regex/ };\n    if ($@) {\n        (my $error = $@) =~ s/ at \\S+ line \\d+.*//;\n        chomp($error);\n        App::Ack::die( \"Invalid regex '$regex':\\n  $error\" );\n    }\n\n    return;\n}\n\n\n\n=head2 warn( @_ )\n\nPut out an ack-specific warning.\n\n=cut\n\nsub warn { ## no critic (ProhibitBuiltinHomonyms)\n    return CORE::warn( _my_program(), ': ', @_, \"\\n\" );\n}\n\n=head2 die( @_ )\n\nDie in an ack-specific way.\n\n=cut\n\nsub die { ## no critic (ProhibitBuiltinHomonyms)\n    return CORE::die( _my_program(), ': ', @_, \"\\n\" );\n}\n\nsub _my_program {\n    require File::Basename;\n    return File::Basename::basename( $0 );\n}\n\n\n=head2 filetypes_supported()\n\nReturns a list of all the types that we can detect.\n\n=cut\n\nsub filetypes_supported {\n    return keys %mappings;\n}\n\nsub _get_thpppt {\n    my $y = q{_   /|,\\\\'!.x',=(www)=,   U   };\n    $y =~ tr/,x!w/\\nOo_/;\n    return $y;\n}\n\nsub _thpppt {\n    my $y = _get_thpppt();\n    App::Ack::print( \"$y ack $_[0]!\\n\" );\n    exit 0;\n}\n\nsub _bar {\n    my $x;\n    $x = <<'_BAR';\n 6?!I'7!I\"?%+!\n 3~!I#7#I\"7#I!?!+!=\"+\"=\"+!:!\n 2?#I!7!I!?#I!7!I\"+\"=%+\"=#\n 1?\"+!?*+!=#~\"=!+#?\"=\"+!\n 0?\"+!?\"I\"?&+!=\"~!=!~\"=!+%=\"+\"\n /I!+!?)+!?!+!=$~!=!~!=\"+!=\"+\"?!=\"?!\n .?%I\"?%+%='?!=#~$=\"\n ,,!?%I\"?(+$=$~!=#:\"~$:!~!\n ,I!?!I!?\"I\"?!+#?\"+!?!+#=\"~$:!~!:!~!:!,!:!,\":#~!\n +I!?&+!=\"+!?#+$=!~\":!~!:!~!:!,!:#,!:!,%:\"\n *+!I!?!+$=!+!=!+!?$+#=!~\":!~\":#,$:\",#:!,!:!\n *I!?\"+!?!+!=$+!?#+#=#~\":$,!:\",!:!,&:\"\n )I!?$=!~!=#+\"?!+!=!+!=!~!=\"~!:!~\":!,'.!,%:!~!\n (=!?\"+!?!=!~$?\"+!?!+!=#~\"=\",!=\"~$,$.\",#.!:!=!\n (I\"+\"=\"~\"=!+&=!~\"=!~!,!~!+!=!?!+!?!=!I!?!+\"=!.\",!.!,\":!\n %I$?!+!?!=%+!~!+#~!=!~#:#=!~!+!~!=#:!,%.!,!.!:\"\n $I!?!=!?!I!+!?\"+!=!~!=!~!?!I!?!=!+!=!~#:\",!~\"=!~!:\"~!=!:\",&:\" '-/\n $?!+!I!?\"+\"=!+\"~!,!:\"+#~#:#,\"=!~\"=!,!~!,!.\",!:\".!:! */! !I!t!'!s! !a! !g!r!e!p!!! !/!\n $+\"=!+!?!+\"~!=!:!~!:\"I!+!,!~!=!:!~!,!:!,$:!~\".&:\"~!,# (-/\n %~!=!~!=!:!.!+\"~!:!,!.!,!~!=!:$.!,\":!,!.!:!~!,!:!=!.#=\"~!,!:\" ./!\n %=!~!?!+\"?\"+!=!~\",!.!:!?!~!.!:!,!:!,#.!,!:\",\"~!:!=!~!=!:\",!~! ./!\n %+\"~\":!~!=#~!:!~!,!.!~!:\",!~!=!~!.!:!,!.\",!:!,\":!=\":!.!,!:!7! -/!\n %~\",!:\".#:!=!:!,!:\"+!:!~!:!.!,!~!,!.#,!.!,$:\"~!,\":\"~!=! */!\n &=!~!=#+!=!~\",!.!:\",#:#,!.\",+:!,!.\",!=!+!?!\n &~!=!~!=!~!:\"~#:\",!.!,#~!:!.!+!,!.\",$.\",$.#,!+!I!?!\n &~!=\"~!:!~\":!~\",!~!=!~\":!,!:!~!,!:!,&.$,#.\"+!?!I!?!I!\n &~!=!~!=!+!,!:!~!:!=!,!:!~&:$,!.!,\".!,\".!,#.\"~!+!?$I!\n &~!=!~!=\"~!=!:!~\":!,!~%:#,!:\",!.!,#.\",#I!7\"I!?!+!?\"I\"\n &+!I!7!:#~\"=!~!:!,!:\"~$.!=!.!,!~!,$.#,!~!7!I#?!+!?\"I\"7!\n %7#?!+!~!:!=!~!=!~\":!,!:\"~\":#.!,)7#I\"?\"I!7&\n %7#I!=\":!=!~!:\"~$:\"~!:#,!:!,!:!~!:#,!7#I!?#7)\n $7$+!,!~!=#~!:!~!:!~$:#,!.!~!:!=!,\":!7#I\"?#7+=!?!\n $7#I!~!,!~#=!~!:\"~!:!,!:!,#:!=!~\",\":!7$I!?#I!7*+!=!+\"\n \"I!7$I!,\":!,!.!=\":$,!:!,$:$7$I!+!?\"I!7+?\"I!7!I!7!,!\n !,!7%I!:\",!.\"~\":!,&.!,!:!~!I!7$I!+!?\"I!7,?!I!7',!\n !7(,!.#~\":!,%.!,!7%I!7!?#I\"7,+!?!7*\n7+:!,!~#,\"=!7'I!?#I\"7/+!7+\n77I!+!7!?!7!I\"71+!7,\n_BAR\n\n    $x =~ s/(.)(.)/$1x(ord($2)-32)/eg;\n    App::Ack::print( $x );\n    exit 0;\n}\n\nsub _key {\n    my $str = lc shift;\n    $str =~ s/[^a-z]//g;\n\n    return $str;\n}\n\n=head2 show_help()\n\nDumps the help page to the user.\n\n=cut\n\nsub show_help {\n    my $help_arg = shift || 0;\n\n    return show_help_types() if $help_arg =~ /^types?/;\n\n    my $ignore_dirs = _listify( sort { _key($a) cmp _key($b) } keys %ignore_dirs );\n\n    App::Ack::print( <<\"END_OF_HELP\" );\nUsage: ack [OPTION]... PATTERN [FILE]\n\nSearch for PATTERN in each source file in the tree from cwd on down.\nIf [FILES] is specified, then only those files/directories are checked.\nack may also search STDIN, but only if no FILE are specified, or if\none of FILES is \"-\".\n\nDefault switches may be specified in ACK_OPTIONS environment variable or\nan .ackrc file. If you want no dependency on the environment, turn it\noff with --noenv.\n\nExample: ack -i select\n\nSearching:\n  -i, --ignore-case     Ignore case distinctions in PATTERN\n  --[no]smart-case      Ignore case distinctions in PATTERN,\n                        only if PATTERN contains no upper case\n                        Ignored if -i is specified\n  -v, --invert-match    Invert match: select non-matching lines\n  -w, --word-regexp     Force PATTERN to match only whole words\n  -Q, --literal         Quote all metacharacters; PATTERN is literal\n\nSearch output:\n  --line=NUM            Only print line(s) NUM of each file\n  -l, --files-with-matches\n                        Only print filenames containing matches\n  -L, --files-without-matches\n                        Only print filenames with no matches\n  -o                    Show only the part of a line matching PATTERN\n                        (turns off text highlighting)\n  --passthru            Print all lines, whether matching or not\n  --output=expr         Output the evaluation of expr for each line\n                        (turns off text highlighting)\n  --match PATTERN       Specify PATTERN explicitly.\n  -m, --max-count=NUM   Stop searching in each file after NUM matches\n  -1                    Stop searching after one match of any kind\n  -H, --with-filename   Print the filename for each match\n  -h, --no-filename     Suppress the prefixing filename on output\n  -c, --count           Show number of lines matching per file\n  --column              Show the column number of the first match\n\n  -A NUM, --after-context=NUM\n                        Print NUM lines of trailing context after matching\n                        lines.\n  -B NUM, --before-context=NUM\n                        Print NUM lines of leading context before matching\n                        lines.\n  -C [NUM], --context[=NUM]\n                        Print NUM lines (default 2) of output context.\n\n  --print0              Print null byte as separator between filenames,\n                        only works with -f, -g, -l, -L or -c.\n\nFile presentation:\n  --pager=COMMAND       Pipes all ack output through COMMAND.  For example,\n                        --pager=\"less -R\".  Ignored if output is redirected.\n  --nopager             Do not send output through a pager.  Cancels any\n                        setting in ~/.ackrc, ACK_PAGER or ACK_PAGER_COLOR.\n  --[no]heading         Print a filename heading above each file's results.\n                        (default: on when used interactively)\n  --[no]break           Print a break between results from different files.\n                        (default: on when used interactively)\n  --group               Same as --heading --break\n  --nogroup             Same as --noheading --nobreak\n  --[no]color           Highlight the matching text (default: on unless\n                        output is redirected, or on Windows)\n  --[no]colour          Same as --[no]color\n  --color-filename=COLOR\n  --color-match=COLOR\n  --color-lineno=COLOR  Set the color for filenames, matches, and line numbers.\n  --flush               Flush output immediately, even when ack is used\n                        non-interactively (when output goes to a pipe or\n                        file).\n\nFile finding:\n  -f                    Only print the files found, without searching.\n                        The PATTERN must not be specified.\n  -g REGEX              Same as -f, but only print files matching REGEX.\n  --sort-files          Sort the found files lexically.\n  --invert-file-match   Print/search handle files that do not match -g/-G.\n  --show-types          Show which types each file has.\n\nFile inclusion/exclusion:\n  -a, --all-types       All file types searched;\n                        Ignores CVS, .svn and other ignored directories\n  -u, --unrestricted    All files and directories searched\n  --[no]ignore-dir=name Add/Remove directory from the list of ignored dirs\n  -r, -R, --recurse     Recurse into subdirectories (ack's default behavior)\n  -n, --no-recurse      No descending into subdirectories\n  -G REGEX              Only search files that match REGEX\n\n  --perl                Include only Perl files.\n  --type=perl           Include only Perl files.\n  --noperl              Exclude Perl files.\n  --type=noperl         Exclude Perl files.\n                        See \"ack --help type\" for supported filetypes.\n\n  --type-set TYPE=.EXTENSION[,.EXT2[,...]]\n                        Files with the given EXTENSION(s) are recognized as\n                        being of type TYPE. This replaces an existing\n                        definition for type TYPE.\n  --type-add TYPE=.EXTENSION[,.EXT2[,...]]\n                        Files with the given EXTENSION(s) are recognized as\n                        being of (the existing) type TYPE\n\n  --[no]follow          Follow symlinks.  Default is off.\n\n  Directories ignored by default:\n    $ignore_dirs\n\n  Files not checked for type:\n    /~\\$/            - Unix backup files\n    /#.+#\\$/         - Emacs swap files\n    /[._].*\\\\.swp\\$/ - Vi(m) swap files\n    /core\\\\.\\\\d+\\$/  - core dumps\n    /[.-]min\\\\.js\\$/  - Minified javascript files\n\nMiscellaneous:\n  --noenv               Ignore environment variables and ~/.ackrc\n  --help                This help\n  --man                 Man page\n  --version             Display version & copyright\n  --thpppt              Bill the Cat\n  --bar                 The warning admiral\n\nExit status is 0 if match, 1 if no match.\n\nThis is version $VERSION of ack.\nEND_OF_HELP\n\n    return;\n }\n\n\n=head2 show_help_types()\n\nDisplay the filetypes help subpage.\n\n=cut\n\nsub show_help_types {\n    App::Ack::print( <<'END_OF_HELP' );\nUsage: ack [OPTION]... PATTERN [FILES]\n\nThe following is the list of filetypes supported by ack.  You can\nspecify a file type with the --type=TYPE format, or the --TYPE\nformat.  For example, both --type=perl and --perl work.\n\nNote that some extensions may appear in multiple types.  For example,\n.pod files are both Perl and Parrot.\n\nEND_OF_HELP\n\n    my @types = filetypes_supported();\n    my $maxlen = 0;\n    for ( @types ) {\n        $maxlen = length if $maxlen < length;\n    }\n    for my $type ( sort @types ) {\n        next if $type =~ /^-/; # Stuff to not show\n        my $ext_list = $mappings{$type};\n\n        if ( ref $ext_list ) {\n            $ext_list = join( ' ', map { \".$_\" } @{$ext_list} );\n        }\n        App::Ack::print( sprintf( \"    --[no]%-*.*s %s\\n\", $maxlen, $maxlen, $type, $ext_list ) );\n    }\n\n    return;\n}\n\nsub _listify {\n    my @whats = @_;\n\n    return '' if !@whats;\n\n    my $end = pop @whats;\n    my $str = @whats ? join( ', ', @whats ) . \" and $end\" : $end;\n\n    no warnings 'once';\n    require Text::Wrap;\n    $Text::Wrap::columns = 75;\n    return Text::Wrap::wrap( '', '    ', $str );\n}\n\n=head2 get_version_statement\n\nReturns the version information for ack.\n\n=cut\n\nsub get_version_statement {\n    require Config;\n\n    my $copyright = get_copyright();\n    my $this_perl = $Config::Config{perlpath};\n    if ($^O ne 'VMS') {\n        my $ext = $Config::Config{_exe};\n        $this_perl .= $ext unless $this_perl =~ m/$ext$/i;\n    }\n    my $ver = sprintf( '%vd', $^V );\n\n    return <<\"END_OF_VERSION\";\nack $VERSION\nRunning under Perl $ver at $this_perl\n\n$copyright\n\nThis program is free software.  You may modify or distribute it\nunder the terms of the Artistic License v2.0.\nEND_OF_VERSION\n}\n\n=head2 print_version_statement\n\nPrints the version information for ack.\n\n=cut\n\nsub print_version_statement {\n    App::Ack::print( get_version_statement() );\n\n    return;\n}\n\n=head2 get_copyright\n\nReturn the copyright for ack.\n\n=cut\n\nsub get_copyright {\n    return $COPYRIGHT;\n}\n\n=head2 load_colors\n\nSet default colors, load Term::ANSIColor\n\n=cut\n\nsub load_colors {\n    eval 'use Term::ANSIColor ()';\n\n    $ENV{ACK_COLOR_MATCH}    ||= 'black on_yellow';\n    $ENV{ACK_COLOR_FILENAME} ||= 'bold green';\n    $ENV{ACK_COLOR_LINENO}   ||= 'bold yellow';\n\n    return;\n}\n\n=head2 is_interesting\n\nFile type filter, filtering based on the wanted file types\n\n=cut\n\nsub is_interesting {\n    return if /^\\./;\n\n    my $include;\n\n    for my $type ( filetypes( $File::Next::name ) ) {\n        if ( defined $type_wanted{$type} ) {\n            if ( $type_wanted{$type} ) {\n                $include = 1;\n            }\n            else {\n                return;\n            }\n        }\n    }\n\n    return $include;\n}\n\n\n\n# print subs added in order to make it easy for a third party\n# module (such as App::Wack) to redefine the display methods\n# and show the results in a different way.\nsub print                   { print {$fh} @_ }\nsub print_first_filename    { App::Ack::print( $_[0], \"\\n\" ) }\nsub print_blank_line        { App::Ack::print( \"\\n\" ) }\nsub print_separator         { App::Ack::print( \"--\\n\" ) }\nsub print_filename          { App::Ack::print( $_[0], $_[1] ) }\nsub print_line_no           { App::Ack::print( $_[0], $_[1] ) }\nsub print_column_no         { App::Ack::print( $_[0], $_[1] ) }\nsub print_count {\n    my $filename = shift;\n    my $nmatches = shift;\n    my $ors = shift;\n    my $count = shift;\n    my $show_filename = shift;\n\n    if ($show_filename) {\n        App::Ack::print( $filename );\n        App::Ack::print( ':', $nmatches ) if $count;\n    }\n    else {\n        App::Ack::print( $nmatches ) if $count;\n    }\n    App::Ack::print( $ors );\n}\n\nsub print_count0 {\n    my $filename = shift;\n    my $ors = shift;\n    my $show_filename = shift;\n\n    if ($show_filename) {\n        App::Ack::print( $filename, ':0', $ors );\n    }\n    else {\n        App::Ack::print( '0', $ors );\n    }\n}\n\n\n=head2 search_resource( $resource, \\%opt )\n\nMain search method.\n\nAssumes an open resource, and that the caller will close the resource.\n\n=cut\n\n{\n    my $filename;\n    my $regex;\n    my $display_filename;\n\n    my $keep_context;\n\n    my $last_output_line;             # number of the last line that has been output\n    my $any_output;                   # has there been any output for the current file yet\n    my $context_overall_output_count; # has there been any output at all\n\nsub search_resource {\n    my $res = shift;\n    my $opt = shift;\n\n    $filename = $res->name();\n\n    my $v = $opt->{v};\n    my $passthru = $opt->{passthru};\n    my $max = $opt->{m};\n    my $nmatches = 0;\n\n    $display_filename = undef;\n\n    # for --line processing\n    my $has_lines = 0;\n    my @lines;\n    if ( defined $opt->{lines} ) {\n        $has_lines = 1;\n        @lines = ( @{$opt->{lines}}, -1 );\n        undef $regex; # Don't match when printing matching line\n    }\n    else {\n        $regex = qr/$opt->{regex}/;\n    }\n\n    # for context processing\n    $last_output_line = -1;\n    $any_output = 0;\n    my $before_context = $opt->{before_context};\n    my $after_context  = $opt->{after_context};\n\n    $keep_context = ($before_context || $after_context) && !$passthru;\n\n    my @before;\n    my $before_starts_at_line;\n    my $after = 0; # number of lines still to print after a match\n\n    while ( $res->next_text ) {\n        # XXX Optimize away the case when there are no more @lines to find.\n        # XXX $has_lines, $passthru and $v never change.  Optimize.\n        if ( $has_lines\n               ? $. != $lines[0]  # $lines[0] should be a scalar\n               : $v ? m/$regex/ : !m/$regex/ ) {\n            if ( $passthru ) {\n                App::Ack::print( $_ );\n                next;\n            }\n\n            if ( $keep_context ) {\n                if ( $after ) {\n                    print_match_or_context( $opt, 0, $., $-[0], $+[0], $_ );\n                    $after--;\n                }\n                elsif ( $before_context ) {\n                    if ( @before ) {\n                        if ( @before >= $before_context ) {\n                            shift @before;\n                            ++$before_starts_at_line;\n                        }\n                    }\n                    else {\n                        $before_starts_at_line = $.;\n                    }\n                    push @before, $_;\n                }\n                last if $max && ( $nmatches >= $max ) && !$after;\n            }\n            next;\n        } # not a match\n\n        ++$nmatches;\n\n        # print an empty line as a divider before first line in each file (not before the first file)\n        if ( !$any_output && $opt->{show_filename} && $opt->{break} && defined( $context_overall_output_count ) ) {\n            App::Ack::print_blank_line();\n        }\n\n        shift @lines if $has_lines;\n\n        if ( $res->is_binary ) {\n            App::Ack::print( \"Binary file $filename matches\\n\" );\n            last;\n        }\n        if ( $keep_context ) {\n            if ( @before ) {\n                print_match_or_context( $opt, 0, $before_starts_at_line, $-[0], $+[0], @before );\n                @before = ();\n                $before_starts_at_line = 0;\n            }\n            if ( $max && $nmatches > $max ) {\n                --$after;\n            }\n            else {\n                $after = $after_context;\n            }\n        }\n        print_match_or_context( $opt, 1, $., $-[0], $+[0], $_ );\n\n        last if $max && ( $nmatches >= $max ) && !$after;\n    } # while\n\n    return $nmatches;\n}   # search_resource()\n\n\n=head2 print_match_or_context( $opt, $is_match, $starting_line_no, $match_start, $match_end, @lines )\n\nPrints out a matching line or a line of context around a match.\n\n=cut\n\nsub print_match_or_context {\n    my $opt         = shift; # opts array\n    my $is_match    = shift; # is there a match on the line?\n    my $line_no     = shift;\n    my $match_start = shift;\n    my $match_end   = shift;\n\n    my $color         = $opt->{color};\n    my $heading       = $opt->{heading};\n    my $show_filename = $opt->{show_filename};\n    my $show_column   = $opt->{column};\n\n    if ( $show_filename ) {\n        if ( not defined $display_filename ) {\n            $display_filename =\n                $color\n                    ? Term::ANSIColor::colored( $filename, $ENV{ACK_COLOR_FILENAME} )\n                    : $filename;\n            if ( $heading && !$any_output ) {\n                App::Ack::print_first_filename($display_filename);\n            }\n        }\n    }\n\n    my $sep = $is_match ? ':' : '-';\n    my $output_func = $opt->{output};\n    for ( @_ ) {\n        if ( $keep_context && !$output_func ) {\n            if ( ( $last_output_line != $line_no - 1 ) &&\n                ( $any_output || ( !$heading && defined( $context_overall_output_count ) ) ) ) {\n                App::Ack::print_separator();\n            }\n            # to ensure separators between different files when --noheading\n\n            $last_output_line = $line_no;\n        }\n\n        if ( $show_filename ) {\n            App::Ack::print_filename($display_filename, $sep) if not $heading;\n            my $display_line_no =\n                $color\n                    ? Term::ANSIColor::colored( $line_no, $ENV{ACK_COLOR_LINENO} )\n                    : $line_no;\n            App::Ack::print_line_no($display_line_no, $sep);\n        }\n\n        if ( $output_func ) {\n            while ( /$regex/go ) {\n                App::Ack::print( $output_func->() . \"\\n\" );\n            }\n        }\n        else {\n            if ( $color && $is_match && $regex &&\n                 s/$regex/Term::ANSIColor::colored( substr($_, $-[0], $+[0] - $-[0]), $ENV{ACK_COLOR_MATCH} )/eg ) {\n                # At the end of the line reset the color and remove newline\n                s/[\\r\\n]*\\z/\\e[0m\\e[K/;\n            }\n            else {\n                # remove any kind of newline at the end of the line\n                s/[\\r\\n]*\\z//;\n            }\n            if ( $show_column ) {\n                App::Ack::print_column_no( $match_start+1, $sep );\n            }\n            App::Ack::print($_ . \"\\n\");\n        }\n        $any_output = 1;\n        ++$context_overall_output_count;\n        ++$line_no;\n    }\n\n    return;\n} # print_match_or_context()\n\n} # scope around search_resource() and print_match_or_context()\n\n\nTOTAL_COUNT_SCOPE: {\nmy $total_count;\n\nsub get_total_count {\n    return $total_count;\n}\n\nsub reset_total_count {\n    $total_count = 0;\n}\n\n=head2 search_and_list( $res, \\%opt )\n\nOptimized version of searching for -l and --count, which do not\nshow lines.\n\n=cut\n\nsub search_and_list {\n    my $res = shift;\n    my $opt = shift;\n\n    my $nmatches = 0;\n    my $count = $opt->{count};\n    my $ors = $opt->{print0} ? \"\\0\" : \"\\n\"; # output record separator\n    my $show_filename = $opt->{show_filename};\n\n    my $regex = qr/$opt->{regex}/;\n\n    if ( $opt->{v} ) {\n        while ( $res->next_text ) {\n            if ( /$regex/ ) {\n                return 0 unless $count;\n            }\n            else {\n                ++$nmatches;\n            }\n        }\n    }\n    else {\n        while ( $res->next_text ) {\n            if ( /$regex/ ) {\n                ++$nmatches;\n                last unless $count;\n            }\n        }\n    }\n\n    if ( $opt->{show_total} ) {\n        $total_count += $nmatches;\n    }\n    else {\n        if ( $nmatches ) {\n            App::Ack::print_count( $res->name, $nmatches, $ors, $count, $show_filename );\n        }\n        elsif ( $count && !$opt->{l} ) {\n            App::Ack::print_count0( $res->name, $ors, $show_filename );\n        }\n    }\n\n    return $nmatches ? 1 : 0;\n}   # search_and_list()\n\n} # scope around $total_count\n\n\n=head2 filetypes_supported_set\n\nTrue/False - are the filetypes set?\n\n=cut\n\nsub filetypes_supported_set {\n    return grep { defined $type_wanted{$_} && ($type_wanted{$_} == 1) } filetypes_supported();\n}\n\n\n=head2 print_files( $iter, $one [, $regex, [, $ors ]] )\n\nPrints all the files returned by the iterator matching I<$regex>.\n\nIf I<$one> is set, stop after the first.\nThe output record separator I<$ors> defaults to C<\"\\n\"> and defines, what to\nprint after each filename.\n\n=cut\n\nsub print_files {\n    my $iter = shift;\n    my $opt = shift;\n\n    my $ors = $opt->{print0} ? \"\\0\" : \"\\n\";\n\n    my $nmatches = 0;\n    while ( defined ( my $file = $iter->() ) ) {\n        App::Ack::print $file, $opt->{show_types} ? \" => \" . join( ',', filetypes( $file ) ) : (),  $ors;\n        $nmatches++;\n        last if $opt->{1};\n    }\n\n    return $nmatches;\n}\n\n=head2 print_files_with_matches( $iter, $opt )\n\nPrints the name of the files where a match was found.\n\n=cut\n\nsub print_files_with_matches {\n    my $iter = shift;\n    my $opt = shift;\n\n    # if we have -l and only 1 file given on command line (this means\n    # show_filename is set to 0), we want to see the filename nevertheless\n    $opt->{show_filename} = 1 if $opt->{l};\n\n    $opt->{show_filename} = 0 if $opt->{h};\n    $opt->{show_filename} = 1 if $opt->{H};\n\n    # abuse options to hand in the show_total parameter to search_and_list\n    $opt->{show_total} = $opt->{count} && !$opt->{show_filename};\n    reset_total_count();\n\n    my $nmatches = 0;\n    while ( defined ( my $filename = $iter->() ) ) {\n        my $repo = App::Ack::Repository::Basic->new( $filename );\n        my $res;\n        while ( $res = $repo->next_resource() ) {\n            $nmatches += search_and_list( $res, $opt );\n            $res->close();\n            last if $nmatches && $opt->{1};\n        }\n        $repo->close();\n    }\n\n    if ( $nmatches && $opt->{show_total} ) {\n        App::Ack::print_count('', get_total_count(), \"\\n\", 1, 0  )\n    }\n\n    return $nmatches;\n}\n\n=head2 print_matches( $iter, $opt )\n\nPrint matching lines.\n\n=cut\n\nsub print_matches {\n    my $iter = shift;\n    my $opt = shift;\n\n    $opt->{show_filename} = 0 if $opt->{h};\n    $opt->{show_filename} = 1 if $opt->{H};\n\n    my $nmatches = 0;\n    while ( defined ( my $filename = $iter->() ) ) {\n        my $repo;\n        my $tarballs_work = 0;\n        if ( $tarballs_work && $filename =~ /\\.tar\\.gz$/ ) {\n            App::Ack::die( 'Not working here yet' );\n            require App::Ack::Repository::Tar; # XXX Error checking\n            $repo = App::Ack::Repository::Tar->new( $filename );\n        }\n        else {\n            $repo = App::Ack::Repository::Basic->new( $filename );\n        }\n        $repo or next;\n\n        while ( my $res = $repo->next_resource() ) {\n            my $needs_line_scan;\n            if ( $opt->{regex} && !$opt->{passthru} ) {\n                $needs_line_scan = $res->needs_line_scan( $opt );\n                if ( $needs_line_scan ) {\n                    $res->reset();\n                }\n            }\n            else {\n                $needs_line_scan = 1;\n            }\n            if ( $needs_line_scan ) {\n                $nmatches += search_resource( $res, $opt );\n            }\n            $res->close();\n        }\n        last if $nmatches && $opt->{1};\n        $repo->close();\n    }\n    return  $nmatches;\n}\n\n=head2 filetype_setup()\n\nMinor housekeeping before we go matching files.\n\n=cut\n\nsub filetype_setup {\n    my $filetypes_supported_set = filetypes_supported_set();\n    # If anyone says --no-whatever, we assume all other types must be on.\n    if ( !$filetypes_supported_set ) {\n        for my $i ( keys %type_wanted ) {\n            $type_wanted{$i} = 1 unless ( defined( $type_wanted{$i} ) || $i eq 'binary' || $i eq 'text' || $i eq 'skipped' );\n        }\n    }\n    return;\n}\n\n=head2 expand_filenames( \\@ARGV )\n\nReturns reference to list of expanded filename globs (Win32 only).\n\n=cut\n\nEXPAND_FILENAMES_SCOPE: {\n    my $filter;\n\n    sub expand_filenames {\n        my $argv = shift;\n\n        my $attr;\n        my @files;\n\n        foreach my $pattern ( @{$argv} ) {\n            my @results = bsd_glob( $pattern );\n\n            if (@results == 0) {\n                @results = $pattern; # Glob didn't match, pass it thru unchanged\n            }\n            elsif ( (@results > 1) or ($results[0] ne $pattern) ) {\n                if (not defined $filter) {\n                    eval 'require Win32::File;';\n                    if ($@) {\n                        $filter = 0;\n                    }\n                    else {\n                        $filter = Win32::File::HIDDEN()|Win32::File::SYSTEM();\n                    }\n                } # end unless we've tried to load Win32::File\n                if ( $filter ) {\n                    # Filter out hidden and system files:\n                    @results = grep { not(Win32::File::GetAttributes($_, $attr) and $attr & $filter) } @results;\n                    App::Ack::warn( \"$pattern: Matched only hidden files\" ) unless @results;\n                } # end if we can filter by file attributes\n            } # end elsif this pattern got expanded\n\n            push @files, @results;\n        } # end foreach pattern\n\n        return \\@files;\n    } # end expand_filenames\n} # EXPAND_FILENAMES_SCOPE\n\n\n=head2 get_starting_points( \\@ARGV, \\%opt )\n\nReturns reference to list of starting directories and files.\n\n=cut\n\nsub get_starting_points {\n    my $argv = shift;\n    my $opt = shift;\n\n    my @what;\n\n    if ( @{$argv} ) {\n        @what = @{ $is_windows ? expand_filenames($argv) : $argv };\n        $_ = File::Next::reslash( $_ ) for @what;\n\n        # Show filenames unless we've specified one single file\n        $opt->{show_filename} = (@what > 1) || (!-f $what[0]);\n    }\n    else {\n        @what = '.'; # Assume current directory\n        $opt->{show_filename} = 1;\n    }\n\n    for my $start_point (@what) {\n        App::Ack::warn( \"$start_point: No such file or directory\" ) unless -e $start_point;\n    }\n    return \\@what;\n}\n\nsub _match {\n    my ( $target, $expression, $invert_flag ) = @_;\n\n    if ( $invert_flag ) {\n        return $target !~ $expression;\n    }\n    else {\n        return $target =~ $expression;\n    }\n}\n\n=head2 get_iterator\n\nReturn the File::Next file iterator\n\n=cut\n\nsub get_iterator {\n    my $what = shift;\n    my $opt  = shift;\n\n    # Starting points are always searched, no matter what\n    my %starting_point = map { ($_ => 1) } @{$what};\n\n    my $g_regex = defined $opt->{G} ? qr/$opt->{G}/ : undef;\n    my $file_filter;\n\n    if ( $g_regex ) {\n        $file_filter\n            = $opt->{u}   ? sub { _match( $File::Next::name, qr/$g_regex/, $opt->{invert_file_match} ) }    # XXX Maybe this should be a 1, no?\n            : $opt->{all} ? sub { $starting_point{ $File::Next::name } || ( _match( $File::Next::name, qr/$g_regex/, $opt->{invert_file_match} ) && is_searchable( $_ ) ) }\n            :               sub { $starting_point{ $File::Next::name } || ( _match( $File::Next::name, qr/$g_regex/, $opt->{invert_file_match} ) && is_interesting( @ _) ) }\n            ;\n    }\n    else {\n        $file_filter\n            = $opt->{u}   ? sub {1}\n            : $opt->{all} ? sub { $starting_point{ $File::Next::name } || is_searchable( $_ ) }\n            :               sub { $starting_point{ $File::Next::name } || is_interesting( @_ ) }\n            ;\n    }\n\n    my $descend_filter\n        = $opt->{n} ? sub {0}\n        : $opt->{u} ? sub {1}\n        : \\&ignoredir_filter;\n\n    my $iter =\n        File::Next::files( {\n            file_filter     => $file_filter,\n            descend_filter  => $descend_filter,\n            error_handler   => sub { my $msg = shift; App::Ack::warn( $msg ) },\n            sort_files      => $opt->{sort_files},\n            follow_symlinks => $opt->{follow},\n        }, @{$what} );\n    return $iter;\n}\n\n\nsub set_up_pager {\n    my $command = shift;\n\n    return if App::Ack::output_to_pipe();\n\n    my $pager;\n    if ( not open( $pager, '|-', $command ) ) {\n        App::Ack::die( qq{Unable to pipe to pager \"$command\": $!} );\n    }\n    $fh = $pager;\n\n    return;\n}\n\n=head2 input_from_pipe()\n\nReturns true if ack's input is coming from a pipe.\n\n=cut\n\nsub input_from_pipe {\n    return $input_from_pipe;\n}\n\n\n=head2 output_to_pipe()\n\nReturns true if ack's output is going to a pipe.\n\n=cut\n\nsub output_to_pipe {\n    return $output_to_pipe;\n}\n\n=head2 exit_from_ack\n\nExit from the application with the correct exit code.\n\nReturns with 0 if a match was found, otherwise with 1. The number of matches is\nhanded in as the only argument.\n\n=cut\n\nsub exit_from_ack {\n    my $nmatches = shift;\n\n    my $rc = $nmatches ? 0 : 1;\n    exit $rc;\n}\n\n\n=head1 COPYRIGHT & LICENSE\n\nCopyright 2005-2011 Andy Lester.\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the Artistic License v2.0.\n\n=cut\n\n1; # End of App::Ack\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/Any.pm",
    "content": "use strict; #-*-cperl-*-\nuse warnings;\n\nuse lib qw( ../../../../lib );\n\n=encoding utf8\n\n=head1 NAME\n\nAlgorithm::Evolutionary::Fitness::Any - Façade for any function so that it can be used as fitness\n\n=head1 SYNOPSIS\n\n   use Algorithm::Evolutionary::Utils qw( string_decode )\n\n   sub squares {\n     my $chrom = shift;\n     my @values = string_decode( $chrom, 10, -1, 1 );\n     return $values[0] * $values[1];\n   }\n\n   my $any_eval = new Algorithm::Evolutionary::Fitness::Any \\&squares;\n\n\n=head1 DESCRIPTION\n\nTurns any subroutine or closure into a fitness function. Useful mainly\nif you want results cached; it's not really needed otherwise.\n\n=head1 METHODS\n\n=cut\n\npackage Algorithm::Evolutionary::Fitness::Any;\n\nuse Carp;\n\nuse base 'Algorithm::Evolutionary::Fitness::Base';\n\nour $VERSION =  '3.2';\n\n=head2 new( $function )\n\nAssigns default variables\n\n=cut \n\nsub new {\n  my $class = shift;\n  my $self = { _function => shift || croak \"No functiona rray\" };\n  bless $self, $class;\n  $self->initialize();\n  return $self;\n}\n\n=head2 apply( $individual )\n\nApplies the instantiated problem to a chromosome. It is actually a\nwrapper around C<_apply>.\n\n=cut\n\nsub apply {\n    my $self = shift;\n    my $individual = shift || croak \"Nobody here!!!\";\n    $self->{'_counter'}++;\n    return $self->_apply( $individual );\n}\n\n=head2 _apply( $individual )\n\nThis is the one that really does the stuff. It applies the defined\nfunction to each individual. Itis cached for efficiency.\n\n=cut\n\nsub _apply {\n  my $self = shift;\n  my $individual = shift || croak \"Nobody here!\";\n  my $chrom = $individual->Chrom();\n  my $cache = $self->{'_cache'};\n  if ( $cache->{$chrom} ) {\n    return $cache->{$chrom};\n  }\n  my $result = $self->{'_function'}->($chrom);\n  if ( (scalar $chrom ) eq $chrom ) {\n    $cache->{$chrom} = $result;\n  }\n  return $result;\n}\n\n\n=head1 Copyright\n  \n  This file is released under the GPL. See the LICENSE file included in this distribution,\n  or go to http://www.fsf.org/licenses/gpl.txt\n\n=cut\n\n\"What???\";\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/Request.pm",
    "content": "package Plack::Request;\nuse strict;\nuse warnings;\nuse 5.008_001;\nour $VERSION = '0.9988';\n$VERSION = eval $VERSION;\n\nuse HTTP::Headers;\nuse Carp ();\nuse Hash::MultiValue;\nuse HTTP::Body;\n\nuse Plack::Request::Upload;\nuse Plack::TempBuffer;\nuse URI;\nuse URI::Escape ();\n\nsub _deprecated {\n    my $alt = shift;\n    my $method = (caller(1))[3];\n    Carp::carp(\"$method is deprecated. Use '$alt' instead.\");\n}\n\nsub new {\n    my($class, $env) = @_;\n    Carp::croak(q{$env is required})\n        unless defined $env && ref($env) eq 'HASH';\n\n    bless { env => $env }, $class;\n}\n\nsub env { $_[0]->{env} }\n\nsub address     { $_[0]->env->{REMOTE_ADDR} }\nsub remote_host { $_[0]->env->{REMOTE_HOST} }\nsub protocol    { $_[0]->env->{SERVER_PROTOCOL} }\nsub method      { $_[0]->env->{REQUEST_METHOD} }\nsub port        { $_[0]->env->{SERVER_PORT} }\nsub user        { $_[0]->env->{REMOTE_USER} }\nsub request_uri { $_[0]->env->{REQUEST_URI} }\nsub path_info   { $_[0]->env->{PATH_INFO} }\nsub path        { $_[0]->env->{PATH_INFO} || '/' }\nsub script_name { $_[0]->env->{SCRIPT_NAME} }\nsub scheme      { $_[0]->env->{'psgi.url_scheme'} }\nsub secure      { $_[0]->scheme eq 'https' }\nsub body        { $_[0]->env->{'psgi.input'} }\nsub input       { $_[0]->env->{'psgi.input'} }\n\nsub content_length   { $_[0]->env->{CONTENT_LENGTH} }\nsub content_type     { $_[0]->env->{CONTENT_TYPE} }\n\nsub session         { $_[0]->env->{'psgix.session'} }\nsub session_options { $_[0]->env->{'psgix.session.options'} }\nsub logger          { $_[0]->env->{'psgix.logger'} }\n\nsub cookies {\n    my $self = shift;\n\n    return {} unless $self->env->{HTTP_COOKIE};\n\n    # HTTP_COOKIE hasn't changed: reuse the parsed cookie\n    if (   $self->env->{'plack.cookie.parsed'}\n        && $self->env->{'plack.cookie.string'} eq $self->env->{HTTP_COOKIE}) {\n        return $self->env->{'plack.cookie.parsed'};\n    }\n\n    $self->env->{'plack.cookie.string'} = $self->env->{HTTP_COOKIE};\n\n    my %results;\n    my @pairs = grep /=/, split \"[;,] ?\", $self->env->{'plack.cookie.string'};\n    for my $pair ( @pairs ) {\n        # trim leading trailing whitespace\n        $pair =~ s/^\\s+//; $pair =~ s/\\s+$//;\n\n        my ($key, $value) = map URI::Escape::uri_unescape($_), split( \"=\", $pair, 2 );\n\n        # Take the first one like CGI.pm or rack do\n        $results{$key} = $value unless exists $results{$key};\n    }\n\n    $self->env->{'plack.cookie.parsed'} = \\%results;\n}\n\nsub query_parameters {\n    my $self = shift;\n    $self->env->{'plack.request.query'} ||= Hash::MultiValue->new($self->uri->query_form);\n}\n\nsub content {\n    my $self = shift;\n\n    unless ($self->env->{'psgix.input.buffered'}) {\n        $self->_parse_request_body;\n    }\n\n    my $fh = $self->input                 or return '';\n    my $cl = $self->env->{CONTENT_LENGTH} or return'';\n    $fh->read(my($content), $cl, 0);\n    $fh->seek(0, 0);\n\n    return $content;\n}\n\nsub raw_body { $_[0]->content }\n\n# XXX you can mutate headers with ->headers but it's not written through to the env\n\nsub headers {\n    my $self = shift;\n    if (!defined $self->{headers}) {\n        my $env = $self->env;\n        $self->{headers} = HTTP::Headers->new(\n            map {\n                (my $field = $_) =~ s/^HTTPS?_//;\n                ( $field => $env->{$_} );\n            }\n                grep { /^(?:HTTP|CONTENT|COOKIE)/i } keys %$env\n            );\n    }\n    $self->{headers};\n}\n\nsub content_encoding { shift->headers->content_encoding(@_) }\nsub header           { shift->headers->header(@_) }\nsub referer          { shift->headers->referer(@_) }\nsub user_agent       { shift->headers->user_agent(@_) }\n\nsub body_parameters {\n    my $self = shift;\n\n    unless ($self->env->{'plack.request.body'}) {\n        $self->_parse_request_body;\n    }\n\n    return $self->env->{'plack.request.body'};\n}\n\n# contains body + query\nsub parameters {\n    my $self = shift;\n\n    $self->env->{'plack.request.merged'} ||= do {\n        my $query = $self->query_parameters;\n        my $body  = $self->body_parameters;\n        Hash::MultiValue->new($query->flatten, $body->flatten);\n    };\n}\n\nsub uploads {\n    my $self = shift;\n\n    if ($self->env->{'plack.request.upload'}) {\n        return $self->env->{'plack.request.upload'};\n    }\n\n    $self->_parse_request_body;\n    return $self->env->{'plack.request.upload'};\n}\n\nsub hostname     { _deprecated 'remote_host';      $_[0]->remote_host || $_[0]->address }\nsub url_scheme   { _deprecated 'scheme';           $_[0]->scheme }\nsub params       { _deprecated 'parameters';       shift->parameters(@_) }\nsub query_params { _deprecated 'query_parameters'; shift->query_parameters(@_) }\nsub body_params  { _deprecated 'body_parameters';  shift->body_parameters(@_) }\n\nsub cookie {\n    my $self = shift;\n    _deprecated 'cookies';\n\n    return keys %{ $self->cookies } if @_ == 0;\n\n    my $name = shift;\n    return $self->cookies->{$name};\n}\n\nsub param {\n    my $self = shift;\n\n    return keys %{ $self->parameters } if @_ == 0;\n\n    my $key = shift;\n    return $self->parameters->{$key} unless wantarray;\n    return $self->parameters->get_all($key);\n}\n\nsub upload {\n    my $self = shift;\n\n    return keys %{ $self->uploads } if @_ == 0;\n\n    my $key = shift;\n    return $self->uploads->{$key} unless wantarray;\n    return $self->uploads->get_all($key);\n}\n\nsub raw_uri {\n    my $self = shift;\n    _deprecated 'base';\n\n    my $base = $self->base;\n    $base->path_query($self->env->{REQUEST_URI});\n\n    $base;\n}\n\nsub uri {\n    my $self = shift;\n\n    my $base = $self->_uri_base;\n\n    # We have to escape back PATH_INFO in case they include stuff like\n    # ? or # so that the URI parser won't be tricked. However we should\n    # preserve '/' since encoding them into %2f doesn't make sense.\n    # This means when a request like /foo%2fbar comes in, we recognize\n    # it as /foo/bar which is not ideal, but that's how the PSGI PATH_INFO\n    # spec goes and we can't do anything about it. See PSGI::FAQ for details.\n    # http://github.com/miyagawa/Plack/issues#issue/118\n    my $path_escape_class = '^A-Za-z0-9\\-\\._~/';\n\n    my $path = URI::Escape::uri_escape($self->env->{PATH_INFO} || '', $path_escape_class);\n    $path .= '?' . $self->env->{QUERY_STRING}\n        if defined $self->env->{QUERY_STRING} && $self->env->{QUERY_STRING} ne '';\n\n    $base =~ s!/$!! if $path =~ m!^/!;\n\n    return URI->new($base . $path)->canonical;\n}\n\nsub base {\n    my $self = shift;\n    URI->new($self->_uri_base)->canonical;\n}\n\nsub _uri_base {\n    my $self = shift;\n\n    my $env = $self->env;\n\n    my $uri = ($env->{'psgi.url_scheme'} || \"http\") .\n        \"://\" .\n        ($env->{HTTP_HOST} || (($env->{SERVER_NAME} || \"\") . \":\" . ($env->{SERVER_PORT} || 80))) .\n        ($env->{SCRIPT_NAME} || '/');\n\n    return $uri;\n}\n\nsub new_response {\n    my $self = shift;\n    require Plack::Response;\n    Plack::Response->new(@_);\n}\n\nsub _parse_request_body {\n    my $self = shift;\n\n    my $ct = $self->env->{CONTENT_TYPE};\n    my $cl = $self->env->{CONTENT_LENGTH};\n    if (!$ct && !$cl) {\n        # No Content-Type nor Content-Length -> GET/HEAD\n        $self->env->{'plack.request.body'}   = Hash::MultiValue->new;\n        $self->env->{'plack.request.upload'} = Hash::MultiValue->new;\n        return;\n    }\n\n    my $body = HTTP::Body->new($ct, $cl);\n\n    # HTTP::Body will create temporary files in case there was an\n    # upload.  Those temporary files can be cleaned up by telling\n    # HTTP::Body to do so. It will run the cleanup when the request\n    # env is destroyed. That the object will not go out of scope by\n    # the end of this sub we will store a reference here.\n    $self->env->{'plack.request.http.body'} = $body;\n    $body->cleanup(1);\n\n    my $input = $self->input;\n\n    my $buffer;\n    if ($self->env->{'psgix.input.buffered'}) {\n        # Just in case if input is read by middleware/apps beforehand\n        $input->seek(0, 0);\n    } else {\n        $buffer = Plack::TempBuffer->new($cl);\n    }\n\n    my $spin = 0;\n    while ($cl) {\n        $input->read(my $chunk, $cl < 8192 ? $cl : 8192);\n        my $read = length $chunk;\n        $cl -= $read;\n        $body->add($chunk);\n        $buffer->print($chunk) if $buffer;\n\n        if ($read == 0 && $spin++ > 2000) {\n            Carp::croak \"Bad Content-Length: maybe client disconnect? ($cl bytes remaining)\";\n        }\n    }\n\n    if ($buffer) {\n        $self->env->{'psgix.input.buffered'} = 1;\n        $self->env->{'psgi.input'} = $buffer->rewind;\n    } else {\n        $input->seek(0, 0);\n    }\n\n    $self->env->{'plack.request.body'}   = Hash::MultiValue->from_mixed($body->param);\n\n    my @uploads = Hash::MultiValue->from_mixed($body->upload)->flatten;\n    my @obj;\n    while (my($k, $v) = splice @uploads, 0, 2) {\n        push @obj, $k, $self->_make_upload($v);\n    }\n\n    $self->env->{'plack.request.upload'} = Hash::MultiValue->new(@obj);\n\n    1;\n}\n\nsub _make_upload {\n    my($self, $upload) = @_;\n    my %copy = %$upload;\n    $copy{headers} = HTTP::Headers->new(%{$upload->{headers}});\n    Plack::Request::Upload->new(%copy);\n}\n\n1;\n__END__\n\n=head1 NAME\n\nPlack::Request - Portable HTTP request object from PSGI env hash\n\n=head1 SYNOPSIS\n\n  use Plack::Request;\n\n  my $app_or_middleware = sub {\n      my $env = shift; # PSGI env\n\n      my $req = Plack::Request->new($env);\n\n      my $path_info = $req->path_info;\n      my $query     = $req->param('query');\n\n      my $res = $req->new_response(200); # new Plack::Response\n      $res->finalize;\n  };\n\n=head1 DESCRIPTION\n\nL<Plack::Request> provides a consistent API for request objects across\nweb server environments.\n\n=head1 CAVEAT\n\nNote that this module is intended to be used by Plack middleware\ndevelopers and web application framework developers rather than\napplication developers (end users).\n\nWriting your web application directly using Plack::Request is\ncertainly possible but not recommended: it's like doing so with\nmod_perl's Apache::Request: yet too low level.\n\nIf you're writing a web application, not a framework, then you're\nencouraged to use one of the web application frameworks that support PSGI (L<http://plackperl.org/#frameworks>),\nor see modules like L<HTTP::Engine> to provide higher level\nRequest and Response API on top of PSGI.\n\n=head1 METHODS\n\nSome of the methods defined in the earlier versions are deprecated in\nversion 0.99. Take a look at L</\"INCOMPATIBILITIES\">.\n\nUnless otherwise noted, all methods and attributes are B<read-only>,\nand passing values to the method like an accessor doesn't work like\nyou expect it to.\n\n=head2 new\n\n    Plack::Request->new( $env );\n\nCreates a new request object.\n\n=head1 ATTRIBUTES\n\n=over 4\n\n=item env\n\nReturns the shared PSGI environment hash reference. This is a\nreference, so writing to this environment passes through during the\nwhole PSGI request/response cycle.\n\n=item address\n\nReturns the IP address of the client (C<REMOTE_ADDR>).\n\n=item remote_host\n\nReturns the remote host (C<REMOTE_HOST>) of the client. It may be\nempty, in which case you have to get the IP address using C<address>\nmethod and resolve on your own.\n\n=item method\n\nContains the request method (C<GET>, C<POST>, C<HEAD>, etc).\n\n=item protocol\n\nReturns the protocol (HTTP/1.0 or HTTP/1.1) used for the current request.\n\n=item request_uri\n\nReturns the raw, undecoded request URI path. You probably do B<NOT>\nwant to use this to dispatch requests.\n\n=item path_info\n\nReturns B<PATH_INFO> in the environment. Use this to get the local\npath for the requests.\n\n=item path\n\nSimilar to C<path_info> but returns C</> in case it is empty. In other\nwords, it returns the virtual path of the request URI after C<<\n$req->base >>. See L</\"DISPATCHING\"> for details.\n\n=item script_name\n\nReturns B<SCRIPT_NAME> in the environment. This is the absolute path\nwhere your application is hosted.\n\n=item scheme\n\nReturns the scheme (C<http> or C<https>) of the request.\n\n=item secure\n\nReturns true or false, indicating whether the connection is secure (https).\n\n=item body, input\n\nReturns C<psgi.input> handle.\n\n=item session\n\nReturns (optional) C<psgix.session> hash. When it exists, you can\nretrieve and store per-session data from and to this hash.\n\n=item session_options\n\nReturns (optional) C<psgix.session.options> hash.\n\n=item logger\n\nReturns (optional) C<psgix.logger> code reference. When it exists,\nyour application is supposed to send the log message to this logger,\nusing:\n\n  $req->logger->({ level => 'debug', message => \"This is a debug message\" });\n\n=item cookies\n\nReturns a reference to a hash containing the cookies. Values are\nstrings that are sent by clients and are URI decoded.\n\n=item query_parameters\n\nReturns a reference to a hash containing query string (GET)\nparameters. This hash reference is L<Hash::MultiValue> object.\n\n=item body_parameters\n\nReturns a reference to a hash containing posted parameters in the\nrequest body (POST). As with C<query_parameters>, the hash\nreference is a L<Hash::MultiValue> object.\n\n=item parameters\n\nReturns a L<Hash::MultiValue> hash reference containing (merged) GET\nand POST parameters.\n\n=item content, raw_body\n\nReturns the request content in an undecoded byte string for POST requests.\n\n=item uri\n\nReturns an URI object for the current request. The URI is constructed\nusing various environment values such as C<SCRIPT_NAME>, C<PATH_INFO>,\nC<QUERY_STRING>, C<HTTP_HOST>, C<SERVER_NAME> and C<SERVER_PORT>.\n\nEvery time this method is called it returns a new, cloned URI object.\n\n=item base\n\nReturns an URI object for the base path of current request. This is\nlike C<uri> but only contains up to C<SCRIPT_NAME> where your\napplication is hosted at.\n\nEvery time this method is called it returns a new, cloned URI object.\n\n=item user\n\nReturns C<REMOTE_USER> if it's set.\n\n=item headers\n\nReturns an L<HTTP::Headers> object containing the headers for the current request.\n\n=item uploads\n\nReturns a reference to a hash containing uploads. The hash reference\nis a L<Hash::MultiValue> object and values are L<Plack::Request::Upload>\nobjects.\n\n=item content_encoding\n\nShortcut to $req->headers->content_encoding.\n\n=item content_length\n\nShortcut to $req->headers->content_length.\n\n=item content_type\n\nShortcut to $req->headers->content_type.\n\n=item header\n\nShortcut to $req->headers->header.\n\n=item referer\n\nShortcut to $req->headers->referer.\n\n=item user_agent\n\nShortcut to $req->headers->user_agent.\n\n=item param\n\nReturns GET and POST parameters with a CGI.pm-compatible param\nmethod. This is an alternative method for accessing parameters in\n$req->parameters. Unlike CGI.pm, it does I<not> allow\nsetting or modifying query parameters.\n\n    $value  = $req->param( 'foo' );\n    @values = $req->param( 'foo' );\n    @params = $req->param;\n\n=item upload\n\nA convenient method to access $req->uploads.\n\n    $upload  = $req->upload('field');\n    @uploads = $req->upload('field');\n    @fields  = $req->upload;\n\n    for my $upload ( $req->upload('field') ) {\n        print $upload->filename;\n    }\n\n=item new_response\n\n  my $res = $req->new_response;\n\nCreates a new L<Plack::Response> object. Handy to remove dependency on\nL<Plack::Response> in your code for easy subclassing and duck typing\nin web application frameworks, as well as overriding Response\ngeneration in middlewares.\n\n=back\n\n=head2 Hash::MultiValue parameters\n\nParameters that can take one or multiple values (i.e. C<parameters>,\nC<query_parameters>, C<body_parameters> and C<uploads>) store the\nhash reference as a L<Hash::MultiValue> object. This means you can use\nthe hash reference as a plain hash where values are B<always> scalars\n(B<NOT> array references), so you don't need to code ugly and unsafe\nC<< ref ... eq 'ARRAY' >> anymore.\n\nAnd if you explicitly want to get multiple values of the same key, you\ncan call the C<get_all> method on it, such as:\n\n  my @foo = $req->query_parameters->get_all('foo');\n\nYou can also call C<get_one> to always get one parameter independent\nof the context (unlike C<param>), and even call C<mixed> (with\nHash::MultiValue 0.05 or later) to get the I<traditional> hash\nreference,\n\n  my $params = $req->parameters->mixed;\n\nwhere values are either a scalar or an array reference depending on\ninput, so it might be useful if you already have the code to deal with\nthat ugliness.\n\n=head2 PARSING POST BODY and MULTIPLE OBJECTS\n\nThe methods to parse request body (C<content>, C<body_parameters> and\nC<uploads>) are carefully coded to save the parsed body in the\nenvironment hash as well as in the temporary buffer, so you can call\nthem multiple times and create Plack::Request objects multiple times\nin a request and they should work safely, and won't parse request body\nmore than twice for the efficiency.\n\n=head1 DISPATCHING\n\nIf your application or framework wants to dispatch (or route) actions\nbased on request paths, be sure to use C<< $req->path_info >> not C<<\n$req->uri->path >>.\n\nThis is because C<path_info> gives you the virtual path of the request,\nregardless of how your application is mounted. If your application is\nhosted with mod_perl or CGI scripts, or even multiplexed with tools\nlike L<Plack::App::URLMap>, request's C<path_info> always gives you\nthe action path.\n\nNote that C<path_info> might give you an empty string, in which case\nyou should assume that the path is C</>.\n\nYou will also want to use C<< $req->base >> as a base prefix when\nbuilding URLs in your templates or in redirections. It's a good idea\nfor you to subclass Plack::Request and define methods such as:\n\n  sub uri_for {\n      my($self, $path, $args) = @_;\n      my $uri = $self->base;\n      $uri->path($uri->path . $path);\n      $uri->query_form(@$args) if $args;\n      $uri;\n  }\n\nSo you can say:\n\n  my $link = $req->uri_for('/logout', [ signoff => 1 ]);\n\nand if C<< $req->base >> is C</app> you'll get the full URI for\nC</app/logout?signoff=1>.\n\n=head1 INCOMPATIBILITIES\n\nIn version 0.99, many utility methods are removed or deprecated, and\nmost methods are made read-only.\n\nThe following methods are deprecated: C<hostname>, C<url_scheme>,\nC<params>, C<query_params>, C<body_params>, C<cookie> and\nC<raw_uri>. They will be removed in the next major release.\n\nAll parameter-related methods such as C<parameters>,\nC<body_parameters>, C<query_parameters> and C<uploads> now contains\nL<Hash::MultiValue> objects, rather than I<scalar or an array\nreference depending on the user input> which is insecure. See\nL<Hash::MultiValue> for more about this change.\n\nC<< $req->path >> method had a bug, where the code and the document\nwas mismatching. The document was suggesting it returns the sub\nrequest path after C<< $req->base >> but the code was always returning\nthe absolute URI path. The code is now updated to be an alias of C<<\n$req->path_info >> but returns C</> in case it's empty. If you need\nthe older behavior, just call C<< $req->uri->path >> instead.\n\nCookie handling is simplified, and doesn't use L<CGI::Simple::Cookie>\nanymore, which means you B<CAN NOT> set array reference or hash\nreference as a cookie value and expect it be serialized. You're always\nrequired to set string value, and encoding or decoding them is totally\nup to your application or framework. Also, C<cookies> hash reference\nnow returns I<strings> for the cookies rather than CGI::Simple::Cookie\nobjects, which means you no longer have to write a wacky code such as:\n\n  $v = $req->cookie->{foo} ? $req->cookie->{foo}->value : undef;\n\nand instead, simply do:\n\n  $v = $req->cookie->{foo};\n\n=head1 AUTHORS\n\nTatsuhiko Miyagawa\n\nKazuhiro Osawa\n\nTokuhiro Matsuno\n\n=head1 SEE ALSO\n\nL<Plack::Response> L<HTTP::Request>, L<Catalyst::Request>\n\n=head1 LICENSE\n\nThis library is free software; you can redistribute it and/or modify\nit under the same terms as Perl itself.\n\n=cut\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/Response.pm",
    "content": "package Plack::Response;\nuse strict;\nuse warnings;\nour $VERSION = '0.9988';\n$VERSION = eval $VERSION;\n\nuse Plack::Util::Accessor qw(body status);\nuse Carp ();\nuse Scalar::Util ();\nuse HTTP::Headers;\nuse URI::Escape ();\n\nsub code    { shift->status(@_) }\nsub content { shift->body(@_)   }\n\nsub new {\n    my($class, $rc, $headers, $content) = @_;\n\n    my $self = bless {}, $class;\n    $self->status($rc)       if defined $rc;\n    $self->headers($headers) if defined $headers;\n    $self->body($content)    if defined $content;\n\n    $self;\n}\n\nsub headers {\n    my $self = shift;\n\n    if (@_) {\n        my $headers = shift;\n        if (ref $headers eq 'ARRAY') {\n            Carp::carp(\"Odd number of headers\") if @$headers % 2 != 0;\n            $headers = HTTP::Headers->new(@$headers);\n        } elsif (ref $headers eq 'HASH') {\n            $headers = HTTP::Headers->new(%$headers);\n        }\n        return $self->{headers} = $headers;\n    } else {\n        return $self->{headers} ||= HTTP::Headers->new();\n    }\n}\n\nsub cookies {\n    my $self = shift;\n    if (@_) {\n        $self->{cookies} = shift;\n    } else {\n        return $self->{cookies} ||= +{ };\n    }\n}\n\nsub header { shift->headers->header(@_) } # shortcut\n\nsub content_length {\n    shift->headers->content_length(@_);\n}\n\nsub content_type {\n    shift->headers->content_type(@_);\n}\n\nsub content_encoding {\n    shift->headers->content_encoding(@_);\n}\n\nsub location {\n    my $self = shift;\n    return $self->headers->header('Location' => @_);\n}\n\nsub redirect {\n    my $self = shift;\n\n    if (@_) {\n        my $url = shift;\n        my $status = shift || 302;\n        $self->location($url);\n        $self->status($status);\n    }\n\n    return $self->location;\n}\n\nsub finalize {\n    my $self = shift;\n    Carp::croak \"missing status\" unless $self->status();\n\n    my $headers = $self->headers->clone;\n    $self->_finalize_cookies($headers);\n\n    return [\n        $self->status,\n        +[\n            map {\n                my $k = $_;\n                map {\n                    my $v = $_;\n                    $v =~ s/\\015\\012[\\040|\\011]+/chr(32)/ge; # replace LWS with a single SP\n                    $v =~ s/\\015|\\012//g; # remove CR and LF since the char is invalid here\n\n                    ( $k => $v )\n                } $headers->header($_);\n\n            } $headers->header_field_names\n        ],\n        $self->_body,\n    ];\n}\n\nsub _body {\n    my $self = shift;\n    my $body = $self->body;\n       $body = [] unless defined $body;\n    if (!ref $body or Scalar::Util::blessed($body) && overload::Method($body, q(\"\")) && !$body->can('getline')) {\n        return [ $body ];\n    } else {\n        return $body;\n    }\n}\n\nsub _finalize_cookies {\n    my($self, $headers) = @_;\n\n    while (my($name, $val) = each %{$self->cookies}) {\n        my $cookie = $self->_bake_cookie($name, $val);\n        $headers->push_header('Set-Cookie' => $cookie);\n    }\n}\n\nsub _bake_cookie {\n    my($self, $name, $val) = @_;\n\n    return '' unless defined $val;\n    $val = { value => $val } unless ref $val eq 'HASH';\n\n    my @cookie = ( URI::Escape::uri_escape($name) . \"=\" . URI::Escape::uri_escape($val->{value}) );\n    push @cookie, \"domain=\" . $val->{domain}   if $val->{domain};\n    push @cookie, \"path=\" . $val->{path}       if $val->{path};\n    push @cookie, \"expires=\" . $self->_date($val->{expires}) if $val->{expires};\n    push @cookie, \"secure\"                     if $val->{secure};\n    push @cookie, \"HttpOnly\"                   if $val->{httponly};\n\n    return join \"; \", @cookie;\n}\n\nmy @MON  = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );\nmy @WDAY = qw( Sun Mon Tue Wed Thu Fri Sat );\n\nsub _date {\n    my($self, $expires) = @_;\n\n    if ($expires =~ /^\\d+$/) {\n        # all numbers -> epoch date\n        # (cookies use '-' as date separator, HTTP uses ' ')\n        my($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($expires);\n        $year += 1900;\n\n        return sprintf(\"%s, %02d-%s-%04d %02d:%02d:%02d GMT\",\n                       $WDAY[$wday], $mday, $MON[$mon], $year, $hour, $min, $sec);\n\n    }\n\n    return $expires;\n}\n\n1;\n__END__\n\n=head1 NAME\n\nPlack::Response - Portable HTTP Response object for PSGI response\n\n=head1 SYNOPSIS\n\n  use Plack::Response;\n\n  sub psgi_handler {\n      my $env = shift;\n\n      my $res = Plack::Response->new(200);\n      $res->content_type('text/html');\n      $res->body(\"Hello World\");\n\n      return $res->finalize;\n  }\n\n=head1 DESCRIPTION\n\nPlack::Response allows you a way to create PSGI response array ref through a simple API.\n\n=head1 METHODS\n\n=over 4\n\n=item new\n\n  $res = Plack::Response->new;\n  $res = Plack::Response->new($status);\n  $res = Plack::Response->new($status, $headers);\n  $res = Plack::Response->new($status, $headers, $body);\n\nCreates a new Plack::Response object.\n\n=item status\n\n  $res->status(200);\n  $status = $res->status;\n\nSets and gets HTTP status code. C<code> is an alias.\n\n=item headers\n\n  $headers = $res->headers;\n  $res->headers([ 'Content-Type' => 'text/html' ]);\n  $res->headers({ 'Content-Type' => 'text/html' });\n  $res->headers( HTTP::Headers->new );\n\nSets and gets HTTP headers of the response. Setter can take either an\narray ref, a hash ref or L<HTTP::Headers> object containing a list of\nheaders.\n\n=item body\n\n  $res->body($body_str);\n  $res->body([ \"Hello\", \"World\" ]);\n  $res->body($io);\n\nGets and sets HTTP response body. Setter can take either a string, an\narray ref, or an IO::Handle-like object. C<content> is an alias.\n\nNote that this method doesn't automatically set I<Content-Length> for\nthe response. You have to set it manually if you want, with the\nC<content_length> method (see below).\n\n=item header\n\n  $res->header('X-Foo' => 'bar');\n  my $val = $res->header('X-Foo');\n\nShortcut for C<< $res->headers->header >>.\n\n=item content_type, content_length, content_encoding\n\n  $res->content_type('text/plain');\n  $res->content_length(123);\n  $res->content_encoding('gzip');\n\nShortcut for the equivalent get/set methods in C<< $res->headers >>.\n\n=item redirect\n\n  $res->redirect($url);\n  $res->redirect($url, 301);\n\nSets redirect URL with an optional status code, which defaults to 302.\n\nNote that this method doesn't normalize the given URI string. Users of\nthis module have to be responsible about properly encoding URI paths\nand parameters.\n\n=item location\n\nGets and sets C<Location> header.\n\nNote that this method doesn't normalize the given URI string in the\nsetter. See above in C<redirect> for details.\n\n=item cookies\n\n  $res->cookies->{foo} = 123;\n  $res->cookies->{foo} = { value => '123' };\n\nReturns a hash reference containing cookies to be set in the\nresponse. The keys of the hash are the cookies' names, and their\ncorresponding values are a plain string (for C<value> with everything\nelse defaults) or a hash reference that can contain keys such as\nC<value>, C<domain>, C<expires>, C<path>, C<httponly>, C<secure>.\n\nC<expires> can take a string or an integer (as an epoch time) and\nB<does not> convert string formats such as C<+3M>.\n\n  $res->cookies->{foo} = {\n      value => 'test',\n      path  => \"/\",\n      domain => '.example.com',\n      expires => time + 24 * 60 * 60,\n  };\n\n=item finalize\n\n  $res->finalize;\n\nReturns the status code, headers, and body of this response as a PSGI\nresponse array reference.\n\n=back\n\n=head1 AUTHOR\n\nTokuhiro Matsuno\n\nTatsuhiko Miyagawa\n\n=head1 SEE ALSO\n\nL<Plack::Request>\n\n=cut\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/example.cgi",
    "content": "#!/usr/bin/perl\n\n# v1.0\n# nagiostat, program to insert performance-data from Nagios into RRD-archives\n# Copyright (C) 2004  Carl Bingel / Svensk IT konsult AB\n#\n# This program is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License\n# as published by the Free Software Foundation; either version 2\n# of the License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n\nuse strict;\n\n## Basic configuration options\nmy $BASE_DIR = \"/usr/share/nagiostat\";\nmy $CONFIG_FILE = \"/etc/nagios/nagiostat.conf\";  ## Config-file location\nmy $DEBUG_LOG_FILE = \"/var/spool/nagiostat/debug.log\";    ## Specify where to create log-file and what filename (must be writable by nagios-user!)\nmy $DEBUGLEVEL = 1;              ## 0=Nothing, 1=Errors, 2=Warnings, 3=Debug\nmy $DEBUGOUTPUT = 0;\t\t ## 0=file, 1=STDERR, 2=STDOUT (for cgi)\n\nrequire 'shellwords.pl';\n\n## Global vars\nmy $DEBUG_TIMESTAMP=0;\n\n## Find out how program is run\nif( $ARGV[0] eq \"-t\") {\t\t## -t = test configuration-file\n  print STDERR \"nagiostat: Testing configuration-file..\\n\";\n  $DEBUGLEVEL=3;\n  $DEBUGOUTPUT=1;    ## output errors to console and not file\n  my $c = &read_config();\n  abort();\n} elsif( $ARGV[0] eq \"-p\") {\t## -p = parse performance-data (when started by nagios)\n  &parse_perfdata();\n} else {\n  if( exists $ENV{'GATEWAY_INTERFACE'}) {\t## we are run as a CGI-script!\n    $DEBUGOUTPUT=2;  ## output errors to web-browser\n    &run_as_cgi();\n  } else {                                ## print some help-info\n    print STDERR \"nagiostat: usage:\n        -t\tTest configuration-file\n        -p\tParse/import performance-data (used when called from nagios)\n\";\n  }\n}\n\nabort();\n\nsub abort {\n   ## logfile: write blank if we wrote anything...\n   if( $DEBUG_TIMESTAMP!=0) {\n     debug( 1, \"\");\t\n   }\n   exit;\n}\n\n##\n##  Program is called as CGI\n##\nsub run_as_cgi {\n   use CGI;\n   my $cgi = new CGI;\n   \n   my $graph_name = $cgi->param( \"graph_name\");\n   my $graph_iteration = $cgi->param( \"graph_iteration\");\n\n   if( $graph_iteration eq \"\") {\n      print \"Content-type: text/html\\nExpires: 0\\n\\n\";\n   } else {\n      print \"Content-type: image/gif\\nExpires: 0\\n\\n\";\n   }\n\n   my $config = read_config();\n\n   if( $graph_name eq \"\") {      \n      ##\n      ## display index of graphs\n      ##\n      display_htmltemplate( $config->{'htmltemplatepath'}.\"/\".$config->{'graphindextemplate'}, $graph_name, $config);\n   } else {                      ## display graph\n      if( ! exists $config->{'graphs'}->{$graph_name}) {\n         debug( 1, \"ERROR: Graph '$graph_name' does not exist!\");\n         exit;\n      } elsif( $graph_iteration eq \"\") {\n         ##\n         ## Display HTML-page with all the graphs\n         ##\n         if( ! -r $config->{'htmltemplatepath'}.\"/\".$config->{'graphs'}->{$graph_name}->{'htmltemplate'}) {\n            debug( 1, \"ERROR: HTML-template '\".($config->{'htmltemplatepath'}.\"/\".$config->{'graphs'}->{$graph_name}->{'htmltemplate'}).\"' is not readable by effective userid!\");\n            exit;\n         }\n         display_htmltemplate( $config->{'htmltemplatepath'}.\"/\".$config->{'graphs'}->{$graph_name}->{'htmltemplate'}, $graph_name, $config);\n      } else {                   \n         ##\n         ## generate graph (call 'rrdtool graph')\n         ##\n         my $rrdtool_cmdline = $config->{'rrdtoolpath'}.\" graph - \".join( \" \", @{$config->{'plottemplates'}->{ $config->{'graphs'}->{$graph_name}->{'plottemplate'} } }); \n         \n         ## expand variables\n         my $rrdarchive = $config->{'rrdarchivepath'}.\"/\".$config->{'graphs'}->{$graph_name}->{'rrdfilename'};\n         $rrdtool_cmdline =~ s/\\$f/$rrdarchive/g;\n         my $t_start = $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} }->[$graph_iteration]->{'starttime'};\n         $rrdtool_cmdline =~ s/\\$s/$t_start/g;\n         my $t_end = $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} }->[$graph_iteration]->{'endtime'};\n         $rrdtool_cmdline =~ s/\\$e/$t_end/g;\n         my $t_descr = $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} }->[$graph_iteration]->{'description'};\n         $rrdtool_cmdline =~ s/\\$d/$t_descr/g;\n\n         ## Call rrdtool (should probably be fixed to call it in a better way, like exec)\n         print `$rrdtool_cmdline`;\n      }\n\n   }\n\n}\n\n## Display HTML template (and do variable-substitution and other stuff)\n##\nsub display_htmltemplate {\n   my( $filename, $graph_name, $config) = @_;\n\n   if( -r $filename) {\n      open( HTML, $filename);\n      while( <HTML>) {\n         ## All is a big regex.. :-)\n         s/\\$(\\w+)/my $t=sub {   \n            my $varname = $_[0];\n            if( $varname eq \"GRAPHNAME\") {                           ## return the name of the graph\n               if( $config->{'graphs'}->{$graph_name}->{'title'} ne \"\") {\n                  return( $config->{'graphs'}->{$graph_name}->{'title'});\n               } else {\n                  return( \"Graph \".$graph_name);\n               }\n            } elsif( $varname eq \"CURRENTTIME\") {                    ## return current date-time\n               return( localtime());\n            } elsif( $varname eq \"GRAPHINDEX\" || $varname eq \"GRAPHINDEX_ONEROW\") {    ## return HTML-code for index of the different graphs\n               my $return_html;\n               foreach my $gn ( sort keys %{$config->{'graphs'}}) {           \n                     $return_html.=(($varname eq \"GRAPHINDEX\")?\"<LI>\":\"\").\n                     \"<A HREF=\\\"?graph_name=$gn\\\">\".($config->{'graphs'}->{$gn}->{'title'}).\"<\\/A>\".                  # must escape slash since were inside an regex!\n                     (($varname eq \"GRAPHINDEX_ONEROW\")?\"&nbsp;&nbsp;\":\"\");\n               }\n               return( $return_html);\n            } elsif( $varname eq \"GRAPH_AUTOGENERATE\") {             ## return HTML-code for displaying the actual graph-images\n               my $iteration_id=0;\n               my $return_html;\n               foreach my $time ( @{ $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} } }) {\n                 $return_html.=\"<P>\".($time->{'description'}).\"<BR><IMG SRC=\\\"?graph_name=$graph_name&graph_iteration=$iteration_id\\\">\"; \n                 $iteration_id++;\n               }\n               return( $return_html);\n            } else {                                                 ## unknown variable\n               return( \"##UNKNOWN-VARIABLE##\");\n            }\n         }; &$t($1)/eig;   ## i thought that regex would never end!\n         print;\n      }\n      close( HTML);\n   } else {\n      print \"ERROR: HTML-template '$filename' does not exist or is not readable by effective userid.\";\n   }\n\n}\n\n##\n##  Process incoming performance-data (parse output from check-plugin and insert values into rrd-archives)\n##\nsub parse_perfdata {\n\n  $DEBUG_TIMESTAMP=0;\n  \n  my $config = read_config();\n\n  my $rrd_updates;\n\n  ##  Provide more symbolic names (same names as the macros in nagios configuration-file)\n\n  my( $LASTCHECK, $HOSTNAME, $SERVICEDESCR, $SERVICESTATE, $OUTPUT, $PERFDATA) = split( /\\|!!\\|/, $ARGV[1]);\n  debug( 3, \"**INCOMING PERFDATA:\\n  LASTCHECK=$LASTCHECK\\n  HOSTNAME=$HOSTNAME\\n  SERVICEDESCR=\\\"$SERVICEDESCR\\\"\\n  SERVICESTATE=\\\"$SERVICESTATE\\\"\\n  OUTPUT=\\\"$OUTPUT\\\"\\n  PERFDATA=\\\"$PERFDATA\\\"\");\n  \n  my $host_and_descr_found;\n  ## Loop through all host_regexes\n  foreach my $host_regex ( keys %{$config->{'regexes'}}) {\n    ## Loop through all service_description_regexes\n    foreach my $service_regex ( keys %{$config->{'regexes'}->{$host_regex}}) {\n      if( ($HOSTNAME =~ m/$host_regex/i) && ($SERVICEDESCR =~ m/$service_regex/i) ) {     ## match!\n        $host_and_descr_found=1;\n        ## Loop through all InsertValue-lines with same host and service_description match\n        foreach my $insert_value ( @{$config->{'regexes'}->{$host_regex}->{$service_regex}} ) {\n          ## Loop through all regexes that should match values in the output/perfdata\n          foreach my $regex ( @{ $config->{'valueregextemplates'}->{$insert_value->{'regextemplate'}} }) {\n             my $regex_string = $regex->{'regex'};\n             if( $regex->{'regex_what'} eq \"output\") {         ## do regex on \"output\"\n                if( $OUTPUT =~ m/$regex_string/) {\n                   debug( 3, \" +VALUE: \".$1);\n                   push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'value'}}, $1);\n                   push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'dsaname'}}, $regex->{'dsaname'});\n                   $rrd_updates->{$insert_value->{'rrdarchive'}}->{'rrdcreatetemplate'} = $insert_value->{'rrdcreatetemplate'};  #$config->{'regexes'}->{$host_regex}->{$service_regex}->[0]->{'rrdcreatetemplate'};\n                } else {\n                   debug( 2, \"**WARNING: No match for value with regex on output '$regex_string'.\");\n                }\n             } else {                                          ## do regex on \"perfdata\"\n                if( $PERFDATA =~ m/$regex_string/) {\n                   debug( 3, \" +VALUE: \".$1);\n                   push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'value'}}, $1);\n                   push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'dsaname'}}, $regex->{'dsaname'});\n                   $rrd_updates->{$insert_value->{'rrdarchive'}}->{'rrdcreatetemplate'} = $insert_value->{'rrdcreatetemplate'};  #$config->{'regexes'}->{$host_regex}->{$service_regex}->[0]->{'rrdcreatetemplate'};\n                } else {\n                   debug( 2, \"**WARNING: No match for value with regex on perfdata '$regex_string'.\");\n                }\n             }\n          }\n        }\n        \n      }\n    }\n  }\n  \n  if( !$host_and_descr_found) {\n    debug( 2, \"**WARNING: Hostname and description didn't match any of the regexes in the config-file.\");\n  } else {\n    ##\n    ## Insert the value into the RRD by calling the rrdtool (may be several rrd-archives)\n    ##\n    foreach my $archive ( keys %{$rrd_updates}) {\n      debug( 3, \" =INSERT into '$archive': \".join( \",\", @{$rrd_updates->{$archive}->{'value'}} ).\" DSA-names=\".join( \",\", @{$rrd_updates->{$archive}->{'dsaname'}}) );\n      \n      my $rrdarchive_filename = $config->{'rrdarchivepath'}.\"/\".$archive;\n      \n      ## Create RRD-Archive (according to template) if it does not exist\n      if( ! -e $rrdarchive_filename) {\n         my $rrdtool_cmdline = $config->{'rrdtoolpath'}.\" create \".$rrdarchive_filename.\" \".(join( \" \", @{$config->{'rrdcreatetemplates'}->{$rrd_updates->{$archive}->{'rrdcreatetemplate'}}}));\n         debug( 2, \"**CREATING: $rrdarchive_filename, cmdline='\".$rrdtool_cmdline.\"'.\");\n         `$rrdtool_cmdline`;\n      }\n\n      ## Check if rrd-archive is writable\n      if( ! -w $rrdarchive_filename) {\t\t\t\t\t## check wheter RRD-archive exists\n        debug( 1, \"!!ERROR: RRD-archive '\".$rrdarchive_filename.\"' does not exist or is not writable by effective UID.\"); abort();\n      }\n\n      ## Assemle command-line for rrdtool\n      my $rrdtool_cmdline = $config->{'rrdtoolpath'}.\" update \".$rrdarchive_filename.\n\t                    \" --template \".join( \":\", @{$rrd_updates->{$archive}->{'dsaname'}}).\n                            \" $LASTCHECK:\".join( \":\", @{$rrd_updates->{$archive}->{'value'}});\n      debug( 3, \" !RRDCMDLINE: \".$rrdtool_cmdline);\n      my $result = `$rrdtool_cmdline`;\n      if( $result ne \"\") {\n        debug( 1, \"!!RESULT: $result\");\n      }\n    }\n  }\n\n}\n\n\n\n\n##\n##  Read config-file and check for errors\n##\nsub read_config {\n  my $config;\n  open( CONFIG, $CONFIG_FILE);\n  my( $line_counter);\n  while( <CONFIG>) {\n    $line_counter++;\n    chomp;\n    my( @args) = &shellwords( $_);\n    my $orig_confline = $_;\n    $args[0] = uc( $args[0]);\n  \n    if( $args[0] eq \"INSERTVALUE\") {\t##  INSERTVALUE-command\n      shift @args;\n      my( $rrd_filename, $rrdcreatetemplate, $hostname_regex, $servicedescr_regex, $regex_template) = @args;\n\n      if( ! exists $config->{'rrdcreatetemplates'}->{$rrdcreatetemplate}) {\n         debug( 1, \"!!ERROR: RRDCreateTemplate '$rrdcreatetemplate' is not defined but refered to in line $line_counter.\"); abort();\n      }\n      if( $hostname_regex !~ m/^\\/(.*)\\/$/) {\t\t\t## verify hostname regex\n        debug( 1, \"!!ERROR: Hostname regex should be enclosed in slashes, i.e. /HOSTNAME/ and optionally enclosed in quotes if needed. Conf-line $line_counter.\"); abort();\n      } else {\n        $hostname_regex = $1;\n      }\n      if( $servicedescr_regex !~ m/^\\/(.*)\\/$/) {\t\t\t## verify service description regex\n        debug( 1, \"!!ERROR: Service-description regex should be enclosed in slashes, i.e. /SERVICEDESCR/ and optionally enclosed in quotes if needed. Config-line $line_counter.\");\n        abort();\n      } else {\n        $servicedescr_regex = $1;\n      }\n      if( ! exists $config->{'valueregextemplates'}->{$regex_template}) {  ## verify value-regex-template exists\n         debug( 1, \"!!ERROR: VALUEREGEXTEMPLATE '$regex_template' is not defined on line $line_counter.\"); abort();\n      }\n      push( @{$config->{'regexes'}->{$hostname_regex}->{$servicedescr_regex}}, {\n            'rrdarchive' => $rrd_filename,\n            'rrdcreatetemplate' => $rrdcreatetemplate,\n            'regextemplate' => $regex_template\n            } );\n    } elsif( $args[0] =~ m/^(\\s*)#/ || $args[0] eq \"\") {\t## comment or blank row\n      ## do nuthin\n    } elsif( $args[0] eq \"RRDTOOLPATH\") {               ## RRDToolPath args: path\n      $config->{'rrdtoolpath'} = $args[1];\n    } elsif( $args[0] eq \"PLOTTEMPLATE\") {\t\t## PlotTemplate args: name,htmltemplate,parameters..\n      shift @args;\n      my( $name, @params) = @args;\n      if( $name eq \"\") {\n        debug( 1, \"!!ERROR: PLOTTEMPLATE-name must be specified on line $line_counter.\"); abort();\n      }\n      if( exists $config->{'plottemplates'}->{$name}) {\n        debug( 1, \"!!ERROR: PLOTTTEMPLATE-names must be uniqe. Duplicate name found on line: $line_counter.\"); abort();\n      }\n      $config->{'plottemplates'}->{$name} = [ @params];\n    } elsif( $args[0] eq \"GRAPHTIMETEMPLATE\") {         ## GraphTimeTemplate args: name,parameters..\n      shift @args;\n      my( $name, @params) = @args;\n      if( $name eq \"\") {\n        debug( 1, \"!!ERROR: GRAPHTIMETEMPLATE-name must be specified on line $line_counter.\"); abort();\n      }\n      if( exists $config->{'graphtimetemplates'}->{$name}) {\n        debug( 1, \"!!ERROR: GRAPHTIMETEMPLATE-names must be uniqe. Duplicate name found on line: $line_counter.\"); abort();\n      }\n      foreach my $time_template (@params) {\n         my( $t_start, $t_end, @t_descr) = split( /:/, $time_template);\n         my $t_descr = join( \":\", @t_descr);    # workaround if ':' is used in description-string\n         if( $t_start eq \"\" || $t_end eq \"\") {\n            debug( 1, \"!!ERROR: GRAPHTIMETEMPLATE, each time-definition should be defined as '<starttime>:<endtime>:<description>' on line $line_counter.\");\n         }\n         push( @{$config->{'graphtimetemplates'}->{$name}}, {\n             'starttime' => $t_start,\n             'endtime' => $t_end,\n             'description' => $t_descr\n         });\n      }\n    } elsif( $args[0] eq \"RRDCREATETEMPLATE\") {         ## RRDCreateTemplate\n      shift @args;\n      my( $name, @params) = @args;\n      if( $name eq \"\") {\n        debug( 1, \"!!ERROR: RRDCREATETEMPLATE-name must be specified on line $line_counter.\"); abort();\n      }\n      if( exists $config->{'rrdcreatetemplates'}->{$name}) {\n        debug( 1, \"!!ERROR: RRDCREATETEMPLATE-names must be uniq. Duplicate name found on line: $line_counter.\"); abort();\n      }\n      $config->{'rrdcreatetemplates'}->{$name} = [ @params];\n    } elsif( $args[0] eq \"VALUEREGEXTEMPLATE\") {        ## ValueRegexTemplate\n      shift @args;\n      my( $template_name, @regexes) = @args;\n      if( $template_name eq \"\") {\n         debug( 1, \"!!ERROR: VALUEREGEXTEMPLATE-name must be specified on line $line_counter.\"); abort();\n      }\n      foreach my $r (@regexes) {\n         if( $r !~ m/^(output|perfdata):(\\w+):\\/(.*)\\/$/) {\n           debug( 1, \"!!ERROR: Value-regex should be formatted as 'output:dsaname:/regex/' or 'perfdata:dsaname:/regex/' depending on in which field to extract the data. The value should be within parantheses in the regex. Config-line $line_counter.\");\n           abort();\n         } else {\n           my( $regex_what, $dsa_name, $regex) = ( $1, $2, $3);\n           push( @{$config->{'valueregextemplates'}->{$template_name}}, { \n                   'regex_what' => $regex_what, \n                   'regex' => $regex, \n                   'dsaname' => $dsa_name\n                  } );\n         }\n      }\n    } elsif( $args[0] eq \"RRDARCHIVEPATH\") {            ## RRDARCHIVEPATH\n      $config->{'rrdarchivepath'} = $args[1];\n    } elsif( $args[0] eq \"HTMLTEMPLATEPATH\") {          ## HTMLTemplatePath\n      $config->{'htmltemplatepath'} = $args[1];\n    } elsif( $args[0] eq \"GRAPHINDEXTEMPLATE\") {        ## GraphIndexTemplate\n      $config->{'graphindextemplate'} = $args[1];\n    } elsif( $args[0] eq \"GRAPH\") {\t\t\t## GRAPH args: name,rrdfilename,rrdcreatetemplate,graphtimetemplate,plottemplate,htmltemplate\n      if( $args[1] eq \"\") {\n\tdebug( 1, \"!!ERROR: GRAPH-name must be specified on line $line_counter.\"); abort();\n      }\n      if( ! exists $config->{'graphtimetemplates'}->{$args[3]}) {\n        debug( 1, \"!!ERROR: Unknown GRAPHTIMETEMPLATE on line $line_counter.\"); abort();\n      }\n      if( ! exists $config->{'plottemplates'}->{$args[4]}) {\n        debug( 1, \"!!ERROR: Unknown PLOTTEMPLATE on line $line_counter.\"); abort();\n      }\n      if( exists $config->{'graphs'}->{$args[1]}) {\n        debug( 1, \"!!ERROR: Graphnames must be uniqe. Duplicate name found on line: $line_counter.\");\n        abort();\n      } else {\n        $config->{'graphs'}->{$args[1]} = {\n\t\t'graphname' => $args[1],\n\t\t'rrdfilename' => $args[2],\n                'graphtimetemplate' => $args[3],\n                'plottemplate' => $args[4],\n                'htmltemplate' => $args[5],\n                'title' => $args[6]\n        };\n      }\n    } else {\n      debug( 1, \"!!ERROR: Unknown config-file directive on line $line_counter: '\".$args[0].\"'\");\n    }\n  }\n  close( CONFIG);\n\n  if( ! -x $config->{'rrdtoolpath'}) {\n    debug( 1, \"!!ERROR: RRDTOOLPATH does not point to executable rrdtool-binary.\");\n    abort();\n  }\n  if( ! -x $config->{'rrdarchivepath'}) {\n     debug( 1, \"!!ERROR: RRDARCHIVEPATH, '\".($config->{'rrdarchivepath'}).\"' is not readable by effective userid.\"); abort();\n  }\n  if( ! -x $config->{'htmltemplatepath'}) {\n     debug( 1, \"!!ERROR: HTMLTEMPLATEPATH, '\".($config->{'htmltemplatepath'}).\"' is not readable by effective userid.\"); abort();\n  }\n\n  return( $config);\n}\n\n\n## \n##  Write debug-output/logging\n##\nsub debug {\n  my( $level, $msg) = @_;\n  if( $DEBUGLEVEL >= $level) {\n\n    ## write timestamp\n    if( !$DEBUG_TIMESTAMP) {\t\n      $DEBUG_TIMESTAMP=1;\n      debug( 1, scalar localtime());\n    }\n\n    ## write to file or STDERR\n    if( $DEBUGOUTPUT == 0) {\n      open( DEBUGOUTPUT, \">>\".$DEBUG_LOG_FILE);\n      print DEBUGOUTPUT $msg.\"\\n\";\n      close( DEBUGOUTPUT);\n    } elsif( $DEBUGOUTPUT == 2) {\n      print \"<BR><PRE>$msg</PRE>\";\n    } else {\n      print STDERR $msg.\"\\n\";\n    }\n\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/exception_handler.pl",
    "content": "package exception_handler;\nuse sigtrap qw(die normal-signals);\nuse IO::Handle;\nuse Carp;\nuse File::Spec;\nuse File::Basename;\nuse Data::Dumper;\n\nuse sigtrap 'handler', \\&tm_die;\n\n$Carp::CarpLevel = 1;     # How many extra package levels to skip on carp.\n\nBEGIN {\n    *CORE::GLOBAL::die = \\&tm_die;\n    $main::SIG{__DIE__} = \\&tm_die;\n    my $error_fd = $ENV{\"TM_ERROR_FD\"};\n\topen (TM_ERROR_FD, \">&=$error_fd\");\n\tTM_ERROR_FD->autoflush(1);\n}\n\nsub realwarn { CORE::warn(@_); }\nsub realdie { CORE::die(@_); }\n\nsub longmess {\n    my ($arg, @rest) = shift;\n    {\n        local $@;\n        # XXX fix require to not clear $@?\n        # don't use require unless we need to (for Safe compartments)\n        require Carp::Heavy unless $INC{\"Carp/Heavy.pm\"};\n    }\n    # Icky backwards compatibility wrapper. :-(\n    my $call_pack = caller();\n    if ($Internal{$call_pack} or $Carp::CarpInternal{$call_pack}) {\n      return longmess_heavy($arg, @rest);\n    }\n    else {\n      local $Carp::CarpLevel = $Carp::CarpLevel + 1;\n      return longmess_heavy($arg, @rest);\n    }\n}\n\nsub longmess_heavy {\n  return @_ if ref($_[0]); # don't break references as exceptions\n  my $i = Carp::long_error_loc();\n  my ($arg, @rest) = @_;\n  return ret_backtrace($i, $arg, @rest);\n}\n\nsub quote {\n\tmy $str = shift;\n\t$str =~ s/([^A-Za-z0-9\\/_.-])/sprintf(\"%%%02X\", ord($1))/seg;\n\treturn $str;\n}\n\nsub url_and_display_name {\n\tmy $file = shift;\n\tmy $url = \"\";\n\tmy $display_name = \"\";\n\t$display_name = basename($file);\n\t$url = 'url=file://' . quote($file);\n\treturn ($url, $display_name);\n}\n\n# Returns a full stack backtrace starting from where it is\n# told.\nsub ret_backtrace { \n  my ($i, $arg, @rest) = @_;\n  my $mess;\n  $i++;\n\n  my $tid_msg = '';\n  if (defined &Thread::tid) {\n    my $tid = Thread->self->tid;\n    $tid_msg = \" thread $tid\" if $tid;\n  }\n\n  my %i = Carp::caller_info($i);\n  $arg =~ s/\\n/\\<br\\>/g;\n  $i{sub} =~ s/tm_die/die/g;\n  $mess .= \"<div id='exception_report' class='framed'>\\n\";\n  $mess .= \"<p id='exception'><strong>$arg</strong></p>\\n\";\n  $mess .= \"<blockquote><table border='0' cellspacing='0' cellpadding='0'>\\n\";\n  my ($url, $display_name) = url_and_display_name($i{file});\n  $mess .= \"<tr><td><a href='txmt://open?line=$i{line}&\" . $url . \"'>$i{sub}</a></td><td>&nbsp;in $display_name at line $i{line}$tid_msg</td></tr>\\n\";\n  while (my %i = Carp::caller_info(++$i)) {\n      ($url, $display_name) = url_and_display_name($i{file});\n      $mess .= \"<tr><td><a href='txmt://open?line=$i{line}&\" . $url . \"'>$i{sub}</a></td><td>&nbsp;in $display_name at line $i{line}$tid_msg</td></tr>\\n\";\n  }\n  $mess .= \"</table></blockquote></div>\";\n  return $mess;\n}\n\nsub ineval {\n  (exists $ENV{MOD_PERL} ? 0 : $^S) || Carp::longmess() =~ /eval [\\{\\']/m\n}\n\nsub htmlize {\n\tmy $l = shift;\n\t$l =~ s/&/&amp;/g;\n\t$l =~ s/</&lt;/g;\n\t$l =~ s/>/&gt;/g;\n\treturn $l;\n}\n\nsub tm_die {\n  my ($arg,@rest) = @_;\n  if (ineval()) {\n      realdie ($arg,@rest) if ineval();\n  }\n  if (!ref($arg)) {\n    print TM_ERROR_FD longmess($arg,@rest);\n  }\n  exit($!);\n}\n\n1;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/feedgnuplot",
    "content": "#!/usr/bin/perl\n\npackage feedgnuplot; # for the metacpan indexer\n\nuse strict;\nuse warnings;\nuse Getopt::Long;\nuse Time::HiRes qw( usleep gettimeofday tv_interval );\nuse IO::Handle;\nuse IO::Select;\nuse List::Util qw( first );\nuse List::MoreUtils 'any';\nuse Scalar::Util qw( looks_like_number );\nuse Text::ParseWords; # for shellwords\nuse Pod::Usage;\nuse Time::Piece;\n\nmy $VERSION = 1.44;\n\nmy %options;\ninterpretCommandline();\n\n# list containing the plot data. Each element is a hashref of parameters.\n# $curve->{datastring} is a string of all the data in this curve that can be\n# sent directly to gnuplot. $curve->{datastring_meta} is a hashref {domain =>\n# ..., offset_start => ...}. offset_start represents a position in the\n# datastring where this particular data element begins. As the data is culled\n# with --xlen, the offsets are preserved by using $curve->{datastring_offset} to\n# represent the offset IN THE ORIGINAL STRING of the current start of the\n# datastring\nmy @curves = ();\n\n# list mapping curve names to their indices in the @curves list\nmy %curveIndices = ();\n\n# Whether any new data has arrived since the last replot\nmy $haveNewData;\n\n# when the last replot happened\nmy $last_replot_time = [gettimeofday];\n\n# whether the previous replot was timer based\nmy $last_replot_is_from_timer = 1;\nmy $this_replot_is_from_timer;\n\n\n\n\n\n\n\n\nsub getRangeSize\n{\n    my ($id) = @_;\n\n    # I'd like to use //, but I guess some people are still on perl 5.8\n    return\n      exists $options{rangesize_hash}{$id} ?\n      $options{rangesize_hash}{$id} :\n      $options{rangesize_default};\n}\n\nsub interpretCommandline\n{\n  # if I'm using a self-plotting data file with a #! line, then $ARGV[0] will contain ALL of the\n  # options and $ARGV[1] will contain the data file to plot. In this case I need to split $ARGV[0] so\n  # that GetOptions() can parse it correctly. On the other hand, if I'm plotting normally (not with\n  # #!)  a file with spaces in the filename, I don't want to split the filename. Hopefully this logic\n  # takes care of both those cases.\n  if (exists $ARGV[0] && !-r $ARGV[0])\n  {\n    unshift @ARGV, shellwords shift @ARGV;\n  }\n\n  # everything off by default:\n  # do not stream in the data by default\n  # point plotting by default.\n  # no monotonicity checks by default\n  # normal histograms by default\n  $options{ maxcurves } = 100;\n  $options{ histstyle}  = 'freq';\n\n  # Previously I was using 'legend=s%' and 'curvestyle=s%' for curve addressing. This had cleaner\n  # syntax, but disregarded the order of the given options. This resulted in arbitrarily ordered\n  # curves. I thus make parse these into lists, and then also make hashes, for later use\n\n  # needed for these to be parsed into an array-ref, these default to []\n  $options{legend}     = [];\n  $options{curvestyle} = [];\n  $options{style}      = [];\n  $options{histogram}  = [];\n  $options{y2}         = [];\n  $options{extracmds}  = [];\n  $options{set}        = [];\n  $options{unset}      = [];\n  $options{equation}   = [];\n\n  $options{curvestyleall} = '';\n  $options{styleall}      = '';\n  $options{with}          = '';\n\n  $options{rangesize} = [];\n\n  GetOptions(\\%options, 'stream:s', 'domain!', 'dataid!', '3d!', 'colormap!', 'lines!', 'points!',\n             'circles', 'legend=s{2}', 'autolegend!', 'xlabel=s', 'ylabel=s', 'y2label=s', 'zlabel=s',\n             'title=s', 'xlen=f', 'ymin=f', 'ymax=f', 'xmin=s', 'xmax=s', 'y2min=f', 'y2max=f',\n             'zmin=f', 'zmax=f', 'y2=s@',\n             'style=s{2}', 'curvestyle=s{2}', 'curvestyleall=s', 'styleall=s', 'with=s', 'extracmds=s@', 'set=s@', 'unset=s@',\n             'square!', 'square_xy!', 'hardcopy=s', 'maxcurves=i', 'monotonic!', 'timefmt=s',\n             'equation=s@',\n             'image=s',\n             'histogram=s@', 'binwidth=f', 'histstyle=s',\n             'terminal=s',\n             'rangesize=s{2}', 'rangesizeall=i', 'extraValuesPerPoint=i',\n             'help', 'dump', 'exit', 'version',\n             'geometry=s') or exit 1;\n\n  # handle various cmdline-option errors\n  if ( $options{help} )\n  {\n    pod2usage( -exitval => 0,\n               -verbose => 1, # synopsis and args\n               -output  => \\*STDOUT );\n  }\n\n  if( $options{version} )\n  {\n    print \"feedgnuplot version $VERSION\\n\";\n    exit 0;\n  }\n\n  # --style and --curvestyle are synonyms, as are --styleall and\n  # --curvestyleall, so fill that in\n  if( $options{styleall} )\n  {\n    if($options{curvestyleall} ) { $options{curvestyleall} .= \" $options{styleall}\"; }\n    else                         { $options{curvestyleall}  =   $options{styleall};  }\n    delete $options{styleall};\n  }\n\n  push @{$options{curvestyle}}, @{$options{style}};\n  delete $options{style};\n\n  if( $options{curvestyleall} && $options{with} )\n  {\n    print STDERR \"--curvestyleall and --with are mutually exclusive. Please just use one.\\n\";\n    exit -1;\n  }\n  if( $options{with} )\n  {\n    $options{curvestyleall} = \"with $options{with}\";\n    delete $options{with};\n  }\n\n\n  # expand options that are given as comma-separated lists\n  for my $listkey (qw(histogram y2))\n  {\n    @{$options{$listkey}} = map split('\\s*,\\s*', $_), @{$options{$listkey}}\n      if defined $options{$listkey};\n  }\n  for my $listkey (qw(curvestyle rangesize))\n  {\n      next unless defined $options{$listkey};\n      my @in = @{$options{$listkey}};\n      my $N = @in / 2;\n      my @out;\n      for my $i (0..$N-1)\n      {\n          my $key   = $in[2*$i];\n          my $value = $in[2*$i + 1];\n          for my $key_new (split('\\s*,\\s*', $key))\n          {\n              push @out, $key_new, $value;\n          }\n      }\n\n      @{$options{$listkey}} = @out;\n  }\n\n\n  # If we're plotting histograms, then set the default histogram options for\n  # each histogram curve\n  #\n  # Apply this to plain (non-cumulative) histograms\n  if( !$options{curvestyleall} && $options{histstyle} =~ /freq|fnorm/ )\n  {\n      for my $hist_curve(@{$options{histogram}})\n      {\n          # If we don't specify any options specifically for this histogram, use\n          # the defaults: filled boxes with borders\n          if( !any { $options{curvestyle}[$_*2] eq $hist_curve } 0..(@{$options{curvestyle}}/2 - 1) )\n          {\n              push @{$options{curvestyle}}, ($hist_curve, 'with boxes fill solid border lt -1');\n          }\n      }\n  }\n\n  # --legend and --curvestyle options are conceptually hashes, but are parsed as\n  # arrays in order to preserve the ordering. I parse both of these into hashes\n  # because those are useful to have later. After this I can access individual\n  # legends with $options{legend_hash}{curveid}\n  for my $listkey (qw(legend curvestyle rangesize))\n  {\n    $options{\"${listkey}_hash\"} = {};\n\n    my $n = scalar @{$options{$listkey}}/2;\n    foreach my $idx (0..$n-1)\n    {\n      $options{\"${listkey}_hash\"}{$options{$listkey}[$idx*2]} = $options{$listkey}[$idx*2 + 1];\n    }\n  }\n\n  if ( defined $options{hardcopy} && defined $options{stream} )\n  {\n    print STDERR \"--stream doesn't make sense together with --hardcopy\\n\";\n    exit -1;\n  }\n\n  if ( defined $options{rangesizeall} && defined $options{extraValuesPerPoint} )\n  {\n    print STDERR \"Only one of --rangesizeall and --extraValuesPerPoint may be given\\n\";\n    exit -1;\n  }\n\n\n  # I now set up the rangesize to always be\n  #\n  #   $options{rangesize_hash}{$id} // $options{rangesize_default}\n  #\n  # which is available as getRangeSize($id)\n  if ( $options{rangesizeall} )\n  {\n      $options{rangesize_default} = $options{rangesizeall};\n  }\n  else\n  {\n      $options{rangesize_default} = 1;\n\n      $options{rangesize_default} += $options{extraValuesPerPoint} if ($options{extraValuesPerPoint});\n      $options{rangesize_default}++                                if ($options{colormap});\n      $options{rangesize_default}++                                if ($options{circles} );\n  }\n\n\n  # parse stream option. Allowed only numbers >= 0 or 'trigger'. After this code\n  # $options{stream} is\n  #  -1 for triggered replotting\n  #  >0 for timed replotting\n  #  undef if not streaming\n  #\n  #  Note that '0' is not allowed, so !$options{stream} will do the expected\n  #  thing\n  if(defined $options{stream})\n  {\n    # if no streaming period is given, default to 1Hz.\n    $options{stream} = 1 if $options{stream} eq '';\n\n    if( !looks_like_number $options{stream} )\n    {\n      if($options{stream} eq 'trigger')\n      {\n        $options{stream} = 0;\n      }\n      else\n      {\n        print STDERR \"--stream can only take in values >=0 or 'trigger'\\n\";\n        exit -1;\n      }\n    }\n\n    if ( $options{stream} == 0 )\n    {\n      $options{stream} = -1;\n    }\n    elsif ( $options{stream} <= 0)\n    {\n      print STDERR \"--stream can only take in values >=0 or 'trigger'\\n\";\n      exit -1;\n    }\n  }\n\n  if ($options{colormap})\n  {\n    # colormap styles all curves with palette. Seems like there should be a way to do this with a\n    # global setting, but I can't get that to work\n    $options{curvestyleall} .= ' palette';\n  }\n\n  if ( defined $options{binwidth} && !@{$options{histogram}} )\n  {\n    print STDERR \"--binwidth doesn't make sense without any histograms\\n\";\n    exit -1;\n  }\n\n\n  if ( $options{'3d'} )\n  {\n    if ( !$options{domain} )\n    {\n      print STDERR \"--3d only makes sense with --domain\\n\";\n      exit -1;\n    }\n\n    if ( $options{timefmt} )\n    {\n      print STDERR \"--3d makes no sense with --timefmt\\n\";\n      exit -1;\n    }\n\n    if ( defined $options{y2min} || defined $options{y2max} || @{$options{y2}} )\n    {\n      print STDERR \"--3d does not make sense with --y2...\\n\";\n      exit -1;\n    }\n\n    if ( defined $options{xlen} )\n    {\n      print STDERR \"--3d does not make sense with --xlen\\n\";\n      exit -1;\n    }\n\n    if ( defined $options{monotonic} )\n    {\n      print STDERR \"--3d does not make sense with --monotonic\\n\";\n      exit -1;\n    }\n\n    if ( @{$options{histogram}} )\n    {\n      print STDERR \"--3d does not make sense with histograms\\n\";\n      exit -1;\n    }\n\n    if ( defined $options{circles} )\n    {\n      print STDERR \"--3d does not make sense with circles (gnuplot doesn't support this)\\n\";\n      exit -1;\n    }\n  }\n  else\n  {\n    if ( $options{timefmt} && !$options{domain} )\n    {\n      print STDERR \"--timefmt makes sense only with --domain\\n\";\n      exit -1;\n    }\n\n    if(!$options{colormap})\n    {\n      if ( defined $options{zmin} || defined $options{zmax} || defined $options{zlabel} )\n      {\n        print STDERR \"--zmin/zmax/zlabel only makes sense with --3d or --colormap\\n\";\n        exit -1;\n      }\n    }\n\n    if ( defined $options{square_xy} )\n    {\n      print STDERR \"--square_xy only makes sense with --3d\\n\";\n      exit -1;\n    }\n\n    for my $hist_curve(@{$options{histogram}})\n    {\n        my $hist_dim = getRangeSize($hist_curve);\n        if( $hist_dim != 1 )\n        {\n            print STDERR \"I only support 1D histograms, but curve '$hist_curve' has '$hist_dim'-D data\\n\";\n            exit -1;\n        }\n    }\n  }\n\n  if(defined $options{xlen} && !$options{stream} )\n  {\n    print STDERR \"--xlen does not make sense without --stream\\n\";\n    exit -1;\n  }\n\n  if($options{stream} && defined $options{xlen} &&\n     ( defined $options{xmin} || defined $options{xmax}) &&\n    !defined $options{histogram})\n  {\n    print STDERR \"With --stream and --xlen the X bounds are set, so neither --xmin nor --xmax make sense\\n\";\n    exit -1;\n  }\n\n  # --xlen implies an order to the data, so I force monotonicity\n  $options{monotonic} = 1 if defined $options{xlen};\n\n  if( $options{histstyle} !~ /freq|cum|uniq|cnorm|fnorm/ )\n  {\n    print STDERR \"unknown histstyle. Allowed are 'freq...', 'fnorm...', 'cum...', 'uniq...', 'cnorm...'\\n\";\n    exit -1;\n  }\n\n  # deal with timefmt\n  if ( $options{timefmt} )\n  {\n    # I need to compute a regex to match the time field and I need to count how\n    # many whilespace-separated fields there are.\n\n    # strip leading and trailing whitespace\n    $options{timefmt} =~ s/^\\s*//;\n    $options{timefmt} =~ s/\\s*$//;\n\n    my $Nfields = () = split /\\s+/, $options{timefmt}, -1;\n    $options{timefmt_Ncols} = $Nfields;\n\n    # make sure --xlen is an integer. With a timefmt xlen goes through strptime\n    # and strftime, and those are integer-only\n    if( defined $options{xlen} )\n    {\n      if( $options{xlen} - int($options{xlen}) )\n      {\n        print STDERR \"When streaming --xlen MUST be an integer. Rounding up to the nearest second\\n\";\n        $options{xlen} = 1 + int($options{xlen});\n      }\n    }\n  }\n\n  # deal with --image. I just fill in --equation, and reverse the y extents if\n  # none are explicitly given\n  if( defined $options{image} )\n  {\n      # images generally have the origin at the top-left instead of the\n      # bottom-left, so given nothing else, I flip the y axis\n      if( !defined $options{ymin} && !defined $options{ymax} &&\n          ! any { /^ *yrange\\b/ } @{$options{set}} )\n      {\n          push @{$options{set}}, \"yrange [:] reverse\";\n      }\n\n      if ( ! -r $options{image} )\n      {\n          die \"Couldn't read image '$options{image}'\";\n      }\n\n      unshift @{$options{equation}}, qq{\"$options{image}\" binary filetype=auto flipy with rgbimage};\n      delete $options{image};\n  }\n}\n\nsub getGnuplotVersion\n{\n  open(GNUPLOT_VERSION, 'gnuplot --version |') or die \"Couldn't run gnuplot\";\n  my ($gnuplotVersion) = <GNUPLOT_VERSION> =~ /gnuplot\\s*(\\d*\\.\\d*)/;\n  if (!$gnuplotVersion)\n  {\n    print STDERR \"Couldn't find the version of gnuplot. Does it work? Trying anyway...\\n\";\n    $gnuplotVersion = 0;\n  }\n  close(GNUPLOT_VERSION);\n\n  return $gnuplotVersion;\n}\n\nsub sendRangeCommand\n{\n  my ($name, $min, $max) = @_;\n\n  return unless defined $min || defined $max;\n\n  if( defined $min )\n  { $min = \"\\\"$min\\\"\"; }\n  else\n  { $min = ''; }\n\n  if( defined $max )\n  { $max = \"\\\"$max\\\"\"; }\n  else\n  { $max = ''; }\n\n  my $cmd = \"set $name [$min:$max]\\n\";\n  print PIPE $cmd;\n}\n\nsub makeDomainNumeric\n{\n  my ($domain0) = @_;\n\n  if ( $options{timefmt} )\n  {\n    my $timepiece = Time::Piece->strptime( $domain0, $options{timefmt} )\n      or die \"Couldn't parse time format. String '$domain0' doesn't fit format '$options{timefmt}'\";\n\n    return $timepiece->epoch();\n  }\n\n  return $domain0;\n}\n\n\nmy $prev_timed_replot_time = [gettimeofday];\nmy $pipe_in;\nmy $selector;\nmy $line_number = 0;\nmy $is_stdin = !@ARGV; # read stdin only if no data files given on the cmdline\nsub openNextFile\n{\n    my $fd;\n    if($is_stdin)\n    {\n        $fd = IO::Handle->new();\n        $fd->fdopen(fileno(STDIN), \"r\") or die \"Couldn't open STDIN\";\n    }\n    else\n    {\n        my $filename = shift @ARGV;\n        $fd = IO::File->new($filename, \"r\") or die \"Couldn't open file '$filename'\";\n    }\n\n    my $selector = IO::Select->new( $fd );\n    return ($fd, $selector);\n}\nsub getNextLine\n{\n    sub getline_internal\n    {\n        while(1)\n        {\n            my $line = $pipe_in->getline();\n            if( !$is_stdin && !defined $line && $pipe_in->eof() && @ARGV)\n            {\n                # I got to the end of one file, so open the next one (which I'm\n                # sure exists)\n                ($pipe_in, $selector) = openNextFile();\n                next;\n            }\n            return $line;\n        }\n    }\n\n\n\n\n\n    if( !defined $pipe_in )\n    {\n        ($pipe_in, $selector) = openNextFile();\n    }\n\n    while(1)\n    {\n        $this_replot_is_from_timer = undef;\n\n        # if we're not streaming, or we're doing triggered-only replotting, simply\n        # do a blocking read\n        if (! $options{stream} || $options{stream} < 0)\n        {\n            $line_number++;\n            return getline_internal();\n        }\n\n\n        my $now = [gettimeofday];\n        my $time_remaining = $options{stream} - tv_interval($prev_timed_replot_time, $now);\n\n        if ( $time_remaining < 0 )\n        {\n            $prev_timed_replot_time = $now;\n            $this_replot_is_from_timer = 1;\n            return 'replot';\n        }\n\n        if ($selector->can_read($time_remaining))\n        {\n            $line_number++;\n            return getline_internal();\n        }\n    }\n}\n\nsub mainThread\n{\n    local *PIPE;\n    my $dopersist = '';\n\n    if( getGnuplotVersion() >= 4.3 && # --persist not available before this\n\n        # --persist is needed for the \"half-alive\" state (see documentation for\n        # --exit). This state is only used with these options:\n        !$options{stream} && $options{exit})\n    {\n      $dopersist = '--persist';\n    }\n\n    # We trap SIGINT to kill the data input, but keep the plot up. see\n    # documentation for --exit\n    if ($options{stream} && !$options{exit})\n    {\n        $SIG{INT} = sub\n        {\n            print STDERR \"$0 received SIGINT. Send again to quit\\n\";\n            $SIG{INT} = undef;\n        };\n    }\n\n\n\n\n    if(exists $options{dump})\n    {\n      *PIPE = *STDOUT;\n    }\n    else\n    {\n      my $geometry = defined $options{geometry} ?\n        \"-geometry $options{geometry}\" : '';\n      open PIPE, \"|gnuplot $geometry $dopersist\" or die \"Can't initialize gnuplot\\n\";\n    }\n    autoflush PIPE 1;\n\n    my $outputfile;\n    my $outputfileType;\n    if( defined $options{hardcopy})\n    {\n      $outputfile = $options{hardcopy};\n      if( $outputfile =~ /^[^|]                       # starts with anything other than |\n                          .*                          # stuff in the middle\n                          \\.(eps|ps|pdf|png|svg)$/ix) # ends with a known extension\n      {\n        $outputfileType = lc $1;\n      }\n\n      my %terminalOpts =\n      ( eps  => 'postscript noenhanced solid color enhanced eps',\n        ps   => 'postscript noenhanced solid color landscape 12',\n        pdf  => 'pdfcairo noenhanced solid color font \",12\" size 11in,8.5in',\n        png  => 'png noenhanced size 1280,1024',\n        svg  => 'svg noenhanced');\n\n      if( !defined $options{terminal} &&\n           defined $outputfileType    &&\n           $terminalOpts{$outputfileType} )\n      {\n        $options{terminal} = $terminalOpts{$outputfileType};\n      }\n\n      die \"Asked to plot to file '$outputfile', but I don't know which terminal to use, and no --terminal given\"\n        unless $options{terminal};\n    }\n    print PIPE \"set terminal $options{terminal}\\n\" if $options{terminal};\n    print PIPE \"set output \\\"$outputfile\\\"\\n\"      if $outputfile;\n\n    # set up plotting style\n    my $style = '';\n    if($options{lines})  { $style .= 'lines';}\n    if($options{points}) { $style .= 'points';}\n    if($options{circles})\n    {\n      $options{curvestyleall} = \"with circles $options{curvestyleall}\";\n    }\n\n    print PIPE \"set style data $style\\n\" if $style;\n    print PIPE \"set grid\\n\";\n\n    print(PIPE \"set xlabel  \\\"$options{xlabel }\\\"\\n\") if defined $options{xlabel};\n    print(PIPE \"set ylabel  \\\"$options{ylabel }\\\"\\n\") if defined $options{ylabel};\n    print(PIPE \"set zlabel  \\\"$options{zlabel }\\\"\\n\") if defined $options{zlabel};\n    print(PIPE \"set y2label \\\"$options{y2label}\\\"\\n\") if defined $options{y2label};\n    print(PIPE \"set title   \\\"$options{title  }\\\"\\n\") if defined $options{title};\n\n    if($options{square})\n    {\n      # set a square aspect ratio. Gnuplot does this differently for 2D and 3D plots\n      if(! $options{'3d'})\n      {\n        print(PIPE \"set size ratio -1\\n\");\n      }\n      else\n      {\n        print(PIPE \"set view equal xyz\\n\");\n      }\n    }\n\n    if($options{square_xy})\n    {\n      print(PIPE \"set view equal xy\\n\");\n    }\n\n    # For the specified values, set the legend entries to 'title \"blah blah\"'\n    if(@{$options{legend}})\n    {\n      # @{$options{legend}} is a list where consecutive pairs are (curveID,\n      # legend). I use $options{legend} here instead of $options{legend_hash}\n      # because I create a new curve when I see a new one, and the hash is\n      # unordered, thus messing up the ordering\n      my $n = scalar @{$options{legend}}/2;\n      foreach my $idx (0..$n-1)\n      {\n        setCurveLabel($options{legend}[$idx*2    ],\n                      $options{legend}[$idx*2 + 1]);\n      }\n    }\n\n    # add the extra curve options\n    if(@{$options{curvestyle}})\n    {\n      # @{$options{curvestyle}} is a list where consecutive pairs are (curveID,\n      # style).\n      my $n = scalar @{$options{curvestyle}}/2;\n      foreach my $idx (0..$n-1)\n      {\n        addCurveOption($options{curvestyle}[$idx*2    ],\n                       $options{curvestyle}[$idx*2 + 1]);\n      }\n    }\n\n    # For the values requested to be printed on the y2 axis, set that\n    addCurveOption($_, 'axes x1y2') foreach (@{$options{y2}});\n\n    # timefmt\n    if( $options{timefmt} )\n    {\n      print(PIPE \"set timefmt '$options{timefmt}'\\n\");\n      print(PIPE \"set xdata time\\n\");\n    }\n\n    # add the extra global options\n    print(PIPE \"$_\\n\")       foreach (@{$options{extracmds}});\n    print(PIPE \"set $_\\n\")   foreach (@{$options{set}});\n    print(PIPE \"unset $_\\n\") foreach (@{$options{unset}});\n\n    # set up histograms\n    $options{binwidth} ||= 1;   # if no binwidth given, set it to 1\n    print PIPE\n      \"set boxwidth $options{binwidth}\\n\" .\n      \"histbin(x) = $options{binwidth} * floor(0.5 + x/$options{binwidth})\\n\";\n\n    setCurveAsHistogram( $_ ) foreach (@{$options{histogram}});\n\n    if(@{$options{y2}})\n    {\n      print PIPE \"set ytics nomirror\\n\";\n      print PIPE \"set y2tics\\n\";\n      # if any of the ranges are given, set the range\n      sendRangeCommand( \"y2range\", $options{y2min}, $options{y2max} );\n    }\n\n    # if any of the ranges are given, set the range\n    sendRangeCommand( \"xrange\",  $options{xmin}, $options{xmax} );\n    sendRangeCommand( \"yrange\",  $options{ymin}, $options{ymax} );\n    sendRangeCommand( \"zrange\",  $options{zmin}, $options{zmax} );\n    sendRangeCommand( \"cbrange\", $options{zmin}, $options{zmax} ) if($options{colormap});\n\n\n\n\n    # latest domain variable present in our data\n    my $latestX;\n\n    # The domain of the current point\n    my @domain;\n\n    # The x-axis domain represented as a number. This is exactly the same as\n    # $domain[0] unless the x-axis domain uses a timefmt. Then this is the\n    # number of seconds since the UNIX epoch.\n    my $domain0_numeric;\n\n    while( defined ($_ = getNextLine()) )\n    {\n      next if /^#/o;\n\n      if( $options{stream} )\n      {\n        if(/^clear/o )\n        {\n          clearCurves();\n          next;\n        }\n\n        if(/^replot/o )\n        {\n          replot( $domain0_numeric );\n          next;\n        }\n\n        last if /^exit/o;\n      }\n\n      # parse the incoming data lines. The format is\n      # x id0 dat0 id1 dat1 ....\n      # where idX is the ID of the curve that datX corresponds to\n      #\n      # $options{domain} indicates whether the initial 'x' is given or not (if not, the line\n      # number is used)\n      # $options{dataid} indicates whether idX is given or not (if not, the point order in the\n      # line is used)\n      # 3d plots require $options{domain}, and dictate \"x y\" for the domain instead of just \"x\"\n\n      my @fields = split;\n\n      if($options{domain})\n      {\n        if( $options{timefmt} )\n        {\n            # no point if doing anything unless I have at least the domain and\n            # 1 piece of data\n            next if @fields < $options{timefmt_Ncols}+1;\n\n            $domain[0] = join (' ', splice( @fields, 0, $options{timefmt_Ncols}) );\n            $domain0_numeric = makeDomainNumeric( $domain[0] );\n        }\n        elsif(!$options{'3d'})\n        {\n            # no point if doing anything unless I have at least the domain and\n            # 1 piece of data\n            next if @fields < 1+1;\n\n            $domain[0] = $domain0_numeric = shift @fields;\n        }\n        else\n        {\n            # no point if doing anything unless I have at least the domain and\n            # 1 piece of data\n            next if @fields < 2+1;\n\n            @domain = splice(@fields, 0, 2);\n        }\n\n        if( $options{monotonic} )\n        {\n          if( defined $latestX && $domain0_numeric < $latestX )\n          {\n            # the x-coordinate of the new point is in the past, so I wipe out\n            # all the data and start anew. Before I wipe the old data, I\n            # replot the old data\n            replot( $domain0_numeric );\n            clearCurves();\n            $latestX = undef;\n          }\n          else\n          { $latestX = $domain0_numeric; }\n        }\n      }\n      else\n      {\n        $domain[0] = $line_number;\n        $domain0_numeric = makeDomainNumeric( $domain[0] );\n      }\n\n      my $id = -1;\n\n      while(@fields)\n      {\n          if($options{dataid}) { $id = shift @fields; }\n          else                 { $id++;               }\n\n          my $rangesize = getRangeSize($id);\n          last if @fields < $rangesize;\n\n          pushPoint(getCurve($id),\n                    join(' ',\n                         @domain,\n                         splice( @fields, 0, $rangesize ) ) . \"\\n\",\n                    $domain0_numeric);\n      }\n    }\n\n    # finished reading in all. Plot what we have\n    plotStoredData() unless $options{stream} && $options{exit};\n\n    if ( defined $options{hardcopy})\n    {\n      print PIPE \"set output\\n\";\n\n      # sleep until the plot file exists, and it is closed. Sometimes the output\n      # is still being written at this point. If the output filename starts with\n      # '|', gnuplot pipes the output to that process, instead of writing to a\n      # file. In that case I don't make sure the file exists, since there IS no\n      # file\n      if( $options{hardcopy} !~ /^\\|/ )\n      {\n        usleep(100_000) until -e $outputfile;\n        usleep(100_000) until(system(\"fuser -s \\\"$outputfile\\\"\"));\n      }\n\n      print \"Wrote output to $outputfile\\n\";\n      return;\n    }\n\n    # data exhausted. If we're killed now, then we should peacefully die.\n    if($options{stream} && !$options{exit})\n    {\n        print STDERR \"Input data exhausted\\n\";\n        $SIG{INT} = undef;\n    }\n\n    # we persist gnuplot, so we shouldn't need this sleep. However, once\n    # gnuplot exits, but the persistent window sticks around, you can no\n    # longer interactively zoom the plot. So we still sleep\n    sleep(100000000) unless $options{dump} || $options{exit};\n}\n\nsub pruneOldData\n{\n  my ($oldestx) = @_;\n\n  foreach my $curve (@curves)\n  {\n    next unless $curve->{datastring};\n\n    my $meta = $curve->{datastring_meta};\n\n    my $firstInWindow = first {$meta->[$_]{domain} >= $oldestx} 0..$#$meta;\n    if ( !defined $firstInWindow )\n    {\n      # everything is too old. Clear out all the data\n      $curve->{datastring}        = '';\n      $curve->{datastring_meta}   = [];\n      $curve->{datastring_offset} = 0;\n    }\n    elsif ( $firstInWindow >= 2 )\n    {\n      # clear out everything that's too old, except for one point. This point\n      # will be off the plot, but if we're plotting lines there will be a\n      # connecting line to it. Some of the line will be visible\n      substr( $curve->{datastring}, 0,\n              $meta->[$firstInWindow-1]{offset_start} - $curve->{datastring_offset},\n              '' );\n      $curve->{datastring_offset} = $meta->[$firstInWindow-1]{offset_start};\n    }\n  }\n}\n\nsub plotStoredData\n{\n  # get the options for those curves that havse any data\n  my @nonemptyCurves = grep { $_->{datastring} } @curves;\n  my @extraopts = map {$_->{options}} @nonemptyCurves;\n\n  my $body = join('', map { \"$_,\" } @{$options{equation}});\n  $body .= join(', ' , map({ \"'-' $_\" } @extraopts) );\n\n  if($options{'3d'}) { print PIPE \"splot $body\\n\"; }\n  else               { print PIPE  \"plot $body\\n\"; }\n\n  foreach my $curve (@nonemptyCurves)\n  {\n    print PIPE $curve->{datastring};\n    print PIPE \"e\\n\";\n  }\n}\n\nsub updateCurveOptions\n{\n  # generates the 'options' string for a curve, based on its legend title and its other options\n  # These could be integrated into a single string, but that raises an issue in the no-title\n  # case. When no title is specified, gnuplot will still add a legend entry with an unhelpful '-'\n  # label. Thus I explicitly do 'notitle' for that case\n\n  my ($curve, $id) = @_;\n\n  # use the given title, unless we're generating a legend automatically. Given titles\n  # override autolegend\n  my $title;\n  if(defined $curve->{title})\n  { $title = $curve->{title}; }\n  elsif( $options{autolegend} )\n  { $title = $id; }\n\n  my $titleoption = defined $title ? \"title \\\"$title\\\"\" : \"notitle\";\n  my $histoptions = $curve->{histoptions} || '';\n\n  my $usingoptions = '';\n  if( $options{timefmt} )\n  {\n      # with --timefmt I need an explicit 'using' specification. I specify the\n      # columns as 1:2:3..... I need the right number of columns (this is given\n      # as 1 + rangesize). I also need to start the range at the first column\n      # past the timefmt\n\n      my @rest = map {$_ + $options{timefmt_Ncols}} (1..getRangeSize($id));\n\n      $usingoptions = \"using 1:\" . join(':', @rest);\n  }\n\n  $curve->{options} = \"$histoptions $usingoptions $titleoption $curve->{extraoptions} $options{curvestyleall}\";\n}\n\nsub getCurve\n{\n  # This function returns the curve corresponding to a particular label, creating a new curve if\n  # necessary\n\n  if(scalar @curves >= $options{maxcurves})\n  {\n    print STDERR \"Tried to exceed the --maxcurves setting.\\n\";\n    print STDERR \"Invoke with a higher --maxcurves limit if you really want to do this.\\n\";\n    exit -1;\n  }\n\n  my ($id) = @_;\n\n  if( !exists $curveIndices{$id} )\n  {\n    push @curves, {extraoptions      => ' ',\n                   datastring        => '',\n                   datastring_meta   => [],\n                   datastring_offset => 0}; # push a curve with no data and no options\n    $curveIndices{$id} =  $#curves;\n\n    updateCurveOptions($curves[$#curves], $id);\n\n\n    # --xlen has a meaning if we're not plotting histograms at all or if we're\n    # plotting ONLY histograms. If we're doing both at the same time, there's no\n    # consistent way to assign meaning to xlen\n    if ( defined $options{xlen} &&\n\n         # have at least some histograms\n         @{$options{histogram}} &&\n\n         # there are more curves than histogram curves, i.e. there're some\n         # non-histogram curves\n         @curves > @{$options{histogram}} ) {\n        print STDERR \"--xlen only makes sense when plotting ONLY histograms or ONLY NON-histograms\\n\";\n        exit -1;\n    }\n  }\n  return $curves[$curveIndices{$id}];\n}\n\nsub addCurveOption\n{\n  my ($id, $str) = @_;\n\n  my $curve = getCurve($id);\n  $curve->{extraoptions} .= \"$str \";\n  updateCurveOptions($curve, $id);\n}\n\nsub setCurveLabel\n{\n  my ($id, $str) = @_;\n\n  my $curve = getCurve($id);\n  $curve->{title} = $str;\n  updateCurveOptions($curve, $id);\n}\n\nsub setCurveAsHistogram\n{\n  my ($id, $str) = @_;\n\n  my $curve = getCurve($id);\n\n  # With histograms I have 2d plots with rangesize=1. I thus give gnuplot two\n  # values for each point: a domain and a range. For histograms I ignore the\n  # domain, so I get the statistics of the 2nd column: $2\n  $curve->{histoptions} = 'using (histbin($2)):(1.0) smooth ' . $options{histstyle};\n\n  updateCurveOptions($curve, $id);\n}\n\n# remove all the curve data\nsub clearCurves\n{\n  foreach my $curve(@curves)\n  {\n    $curve->{datastring}        = '';\n    $curve->{datastring_meta}   = [];\n    $curve->{datastring_offset} = 0;\n  }\n}\n\nsub replot\n{\n  return unless $haveNewData;\n  $haveNewData = undef;\n\n  return if !$options{stream};\n\n\n  # The logic involving domain rollover replotting due to --monotonic is a bit\n  # tricky. I want this:\n\n  # if( domain rolls over slowly )\n  # {\n  #   should update on a timer;\n  #   when the domain rolls over, --monotonic should force a replot\n  # }\n  # if( domain rolls over quickly )\n  # {\n  #   should update when the domain rolls over,\n  #     at most as quickly as the timer indicates\n  # }\n\n\n  my ($domain0_numeric) = @_;\n\n  my $now = [gettimeofday];\n\n  if( # If there is no replot timer at all, replot at any indication\n      $options{stream} < 0 ||\n\n      # if the last replot was timer-based, but this one isn't, force a replot.\n      # This makes sure that a replot happens for a domain rollover shortly\n      # after a timer replot\n      !$this_replot_is_from_timer && $last_replot_is_from_timer ||\n\n      # if enough time has elapsed since the last replot, it's ok to replot\n      tv_interval ( $last_replot_time, $now ) > 0.8*$options{stream} )\n  {\n    # ok, then. We really need to replot\n    if ( defined $options{xlen} )\n    {\n      # we have an --xlen, so we need to clean out the old data\n      pruneOldData( $domain0_numeric - $options{xlen} );\n\n      my ($xmin, $xmax) = ($domain0_numeric - $options{xlen}, $domain0_numeric);\n      if ( defined $options{timefmt} )\n      {\n        # if we're using a timefmt, I need to convert my xmin range from\n        # seconds-since-the-epoch BACK to the timefmt. Sheesh\n        ($xmin, $xmax) = map {Time::Piece->strptime( $_, '%s' )->strftime( $options{timefmt} ) } ($xmin, $xmax);\n      }\n\n      # if we have any histograms, then I'm not really visualizing the domain at\n      # all, and I don't set the range.\n      sendRangeCommand( \"xrange\", $xmin, $xmax )\n        unless @{$options{histogram}};\n    }\n\n    plotStoredData();\n\n\n    # update replot state\n    $last_replot_time          = $now;\n    $last_replot_is_from_timer = $this_replot_is_from_timer;\n  }\n}\n\n# function to add a point to the plot. Assumes that the curve indexed by $idx already exists\nsub pushPoint\n{\n  my ($curve, $datastring, $domain0_numeric) = @_;\n\n  push @{$curve->{datastring_meta}}, { offset_start => length( $curve->{datastring} ) + $curve->{datastring_offset},\n                                       domain       => $domain0_numeric };\n  $curve->{datastring} .= $datastring;\n\n  $haveNewData = 1;\n}\n\n\nmainThread();\n\n\n=head1 NAME\n\nfeedgnuplot - General purpose pipe-oriented plotting tool\n\n=head1 SYNOPSIS\n\nSimple plotting of piped data:\n\n $ seq 5 | awk '{print 2*$1, $1*$1}'\n 2 1\n 4 4\n 6 9\n 8 16\n 10 25\n\n $ seq 5 | awk '{print 2*$1, $1*$1}' |\n   feedgnuplot --lines --points --legend 0 \"data 0\" --title \"Test plot\" --y2 1\n               --terminal 'dumb 80,40' --exit\n\n                                  Test plot\n\n  10 ++------+--------+-------+-------+-------+--------+-------+------*A 25\n     +       +        +       +       +       +        +       +    **#+\n     |       :        :       :       :       :        : data 0+**A*** |\n     |       :        :       :       :       :        :       :** #   |\n   9 ++.......................................................**.##....|\n     |       :        :       :       :       :        :    ** :#      |\n     |       :        :       :       :       :        :  **   #       |\n     |       :        :       :       :       :        :**   ##:      ++ 20\n   8 ++................................................A....#..........|\n     |       :        :       :       :       :      **:   #   :       |\n     |       :        :       :       :       :    **  : ##    :       |\n     |       :        :       :       :       :  **    :#      :       |\n     |       :        :       :       :       :**      B       :       |\n   7 ++......................................**......##................|\n     |       :        :       :       :    ** :    ##  :       :      ++ 15\n     |       :        :       :       :  **   :   #    :       :       |\n     |       :        :       :       :**     : ##     :       :       |\n   6 ++..............................*A.......##.......................|\n     |       :        :       :    ** :     ##:        :       :       |\n     |       :        :       :  **   :    #  :        :       :       |\n     |       :        :       :**     :  ##   :        :       :      ++ 10\n   5 ++......................**........##..............................|\n     |       :        :    ** :      #B       :        :       :       |\n     |       :        :  **   :    ## :       :        :       :       |\n     |       :        :**     :  ##   :       :        :       :       |\n   4 ++...............A.......###......................................|\n     |       :      **:     ##:       :       :        :       :       |\n     |       :    **  :   ##  :       :       :        :       :      ++ 5\n     |       :  **    : ##    :       :       :        :       :       |\n     |       :**    ##B#      :       :       :        :       :       |\n   3 ++.....**..####...................................................|\n     |    **####      :       :       :       :        :       :       |\n     |  **## :        :       :       :       :        :       :       |\n     B**     +        +       +       +       +        +       +       +\n   2 A+------+--------+-------+-------+-------+--------+-------+------++ 0\n     1      1.5       2      2.5      3      3.5       4      4.5      5\n\n\nSimple real-time plotting example: plot how much data is received on the wlan0\nnetwork interface in bytes/second (uses bash, awk and Linux):\n\n $ while true; do sleep 1; cat /proc/net/dev; done |\n   gawk '/wlan0/ {if(b) {print $2-b; fflush()} b=$2}' |\n   feedgnuplot --lines --stream --xlen 10 --ylabel 'Bytes/sec' --xlabel seconds\n\n=head1 DESCRIPTION\n\nThis is a flexible, command-line-oriented frontend to Gnuplot. It creates\nplots from data coming in on STDIN or given in a filename passed on the\ncommandline. Various data representations are supported, as is hardcopy\noutput and streaming display of live data. A simple example:\n\n $ seq 5 | awk '{print 2*$1, $1*$1}' | feedgnuplot\n\nYou should see a plot with two curves. The C<awk> command generates some data to\nplot and the C<feedgnuplot> reads it in from STDIN and generates the plot. The\nC<awk> invocation is just an example; more interesting things would be plotted\nin normal usage. No commandline-options are required for the most basic\nplotting. Input parsing is flexible; every line need not have the same number of\npoints. New curves will be created as needed.\n\nThe most commonly used functionality of gnuplot is supported directly by the\nscript. Anything not directly supported can still be done with options such as\nC<--set>, C<--extracmds> C<--style>, etc. Arbitrary gnuplot commands can be\npassed in with C<--extracmds>. For example, to turn off the grid, you can pass\nin C<--extracmds 'unset grid'>. Commands C<--set> and C<--unset> exists to\nprovide nicer syntax, so this is equivalent to passing C<--unset grid>. As many\nof these options as needed can be passed in. To add arbitrary curve styles, use\nC<--style curveID extrastyle>. Pass these more than once to affect more than one\ncurve.\n\nTo apply an extra style to I<all> the curves that lack an explicit C<--style>,\npass in C<--styleall extrastyle>. In the most common case, the extra style is\nC<with something>. To support this more simply, you can pass in C<--with\nsomething> instead of C<--styleall 'with something'>. C<--styleall> and\nC<--with> are mutually exclusive. Furthermore any curve-specific C<--style>\noverrides the global C<--styleall> or C<--with> setting.\n\n=head2 Data formats\n\nBy default, each value present in the incoming data represents a distinct data\npoint, as demonstrated in the original example above (we had 10 numbers in the\ninput and 10 points in the plot). If requested, the script supports more\nsophisticated interpretation of input data\n\n=head3 Domain selection\n\nIf C<--domain> is passed in, the first value on each line of input is\ninterpreted as the I<X>-value for the rest of the data on that line. Without\nC<--domain> the I<X>-value is the line number, and the first value on a line is\na plain data point like the others. Default is C<--nodomain>. Thus the original\nexample above produces 2 curves, with B<1,2,3,4,5> as the I<X>-values. If we run\nthe same command with C<--domain>:\n\n $ seq 5 | awk '{print 2*$1, $1*$1}' | feedgnuplot --domain\n\nwe get only 1 curve, with B<2,4,6,8,10> as the I<X>-values. As many points as\ndesired can appear on a single line, but all points on a line are associated\nwith the I<X>-value at the start of that line.\n\n=head3 Curve indexing\n\nBy default, each column represents a separate curve. This is fine unless sparse\ndata is to be plotted. With the C<--dataid> option, each point is represented by\n2 values: a string identifying the curve, and the value itself. If we add\nC<--dataid> to the original example:\n\n $ seq 5 | awk '{print 2*$1, $1*$1}' | feedgnuplot --dataid --autolegend\n\nwe get 5 different curves with one point in each. The first column, as produced\nby C<awk>, is B<2,4,6,8,10>. These are interpreted as the IDs of the curves to\nbe plotted. The C<--autolegend> option adds a legend using the given IDs to\nlabel the curves. The IDs need not be numbers; generic strings are accepted. As\nmany points as desired can appear on a single line. C<--domain> can be used in\nconjunction with C<--dataid>.\n\n=head3 Multi-value style support\n\nDepending on how gnuplot is plotting the data, more than one value may be needed\nto represent the range of a single point. Basic 2D plots have 2 numbers\nrepresenting each point: 1 domain and 1 range. But if plotting with\nC<--circles>, for instance, then there's an extra range value: the radius. A\nsimilar situation exists with C<--colormap> where each point contains the\nposition I<and> the color. There are other gnuplot styles that require more data\n(such as error bars), but none of these are directly supported by the script.\nThey can still be used, however, by specifying the specific style with\nC<--style>, and specifying how many values are needed for each point with\nC<--rangesizeall> or C<--rangesize> or C<--extraValuesPerPoint>. Those options\nthat specify the range size are required I<only> for styles not explicitly\nsupported by feedgnuplot; supported styles do the right thing automatically.\n\nMore examples: if making a 2d plot of y error bars where gnuplot expects a\n(x,y,ydelta) tuple for each point, you want C<--rangesizeall 2> because you have\none domain value (x) and 2 range values (y,ydelta). Gnuplot can also plot\nlopsided y errorbars by giving a tuple (x,y,ylow,yhigh). This is similar as\nbefore, but you want C<--rangesizeall 3> instead.\n\n\n=head3 3D data\n\nTo plot 3D data, pass in C<--3d>. C<--domain> MUST be given when plotting 3D\ndata to avoid domain ambiguity. If 3D data is being plotted, there are by\ndefinition 2 domain values instead of one (I<Z> as a function of I<X> and I<Y>\ninstead of I<Y> as a function of I<X>). Thus the first 2 values on each line are\ninterpreted as the domain instead of just 1. The rest of the processing happens\nthe same way as before.\n\n=head3 Time/date data\n\nIf the input data domain is a time/date, this can be interpreted with\nC<--timefmt>. This option takes a single argument: the format to use to parse\nthe data. The format is documented in 'set timefmt' in gnuplot, although the\ncommon flags that C<strftime> understands are generally supported. The backslash\nsequences in the format are I<not> supported, so if you want a tab, put in a tab\ninstead of \\t. Whitespace in the format I<is> supported. When this flag is\ngiven, some other options act a little bit differently:\n\n=over\n\n=item\n\nC<--xlen> is an I<integer> in seconds\n\n=item\n\nC<--xmin> and C<--xmax> I<must> use the format passed in to C<--timefmt>\n\n=back\n\nUsing this option changes both the way the input is parsed I<and> the way the\nx-axis tics are labelled. Gnuplot tries to be intelligent in this labelling, but\nit doesn't always do what the user wants. The labelling can be controlled with\nthe gnuplot C<set format> command, which takes the same type of format string as\nC<--timefmt>. Example:\n\n $ sar 1 -1 |\n   awk '$1 ~ /..:..:../ && $8 ~/^[0-9\\.]*$/ {print $1,$8; fflush()}' |\n   feedgnuplot --stream --domain\n                --lines --timefmt '%H:%M:%S'\n                --set 'format x \"%H:%M:%S\"'\n\nThis plots the 'idle' CPU consumption against time.\n\nNote that while gnuplot supports the time/date on any axis, I<feedgnuplot>\ncurrently supports it I<only> as the x-axis domain. This may change in the\nfuture.\n\n=head2 Real-time streaming data\n\nTo plot real-time data, pass in the C<--stream [refreshperiod]> option. Data\nwill then be plotted as it is received. The plot will be updated every\nC<refreshperiod> seconds. If the period isn't specified, a 1Hz refresh rate is\nused. To refresh at specific intervals indicated by the data, set the\nrefreshperiod to 0 or to 'trigger'. The plot will then I<only> be refreshed when\na data line 'replot' is received. This 'replot' command works in both triggered\nand timed modes, but in triggered mode, it's the only way to replot. Look in\nL</\"Special data commands\"> for more information.\n\nTo plot only the most recent data (instead of I<all> the data), C<--xlen\nwindowsize> can be given. This will create an constantly-updating, scrolling\nview of the recent past. C<windowsize> should be replaced by the desired length\nof the domain window to plot, in domain units (passed-in values if C<--domain>\nor line numbers otherwise). If the domain is a time/date via C<--timefmt>, then\nC<windowsize> is and I<integer> in seconds. If we're plotting a histogram, then\nC<--xlen> causes a histogram over a moving window to be computed. The subtlely\nhere is that with a histogram you don't actually I<see> the domain since only\nthe range is analyzed. But the domain is still there, and can be utilized with\nC<--xlen>. With C<--xlen> we can plot I<only> histograms or I<only>\nI<non>-histograms.\n\n=head3 Special data commands\n\nIf we are reading streaming data, the input stream can contain special commands\nin addition to the raw data. Feedgnuplot looks for these at the start of every\ninput line. If a command is detected, the rest of the line is discarded. These\ncommands are\n\n=over\n\n=item C<replot>\n\nThis command refreshes the plot right now, instead of waiting for the next\nrefresh time indicated by the timer. This command works in addition to the timed\nrefresh, as indicated by C<--stream [refreshperiod]>.\n\n=item C<clear>\n\nThis command clears out the current data in the plot. The plotting process\ncontinues, however, to any data following the C<clear>.\n\n=item C<exit>\n\nThis command causes feedgnuplot to exit.\n\n=back\n\n=head2 Hardcopy output\n\nThe script is able to produce hardcopy output with C<--hardcopy outputfile>. The\noutput type can be inferred from the filename, if B<.ps>, B<.eps>, B<.pdf>,\nB<.svg> or B<.png> is requested. If any other file type is requested,\nC<--terminal> I<must> be passed in to tell gnuplot how to make the plot. If\nC<--terminal> is passed in, then the C<--hardcopy> argument only provides the\noutput filename.\n\n=head2 Self-plotting data files\n\nThis script can be used to enable self-plotting data files. There are 2 ways of\ndoing this: with a shebang (#!) or with inline perl data.\n\n=head3 Self-plotting data with a #!\n\nA self-plotting, executable data file C<data> is formatted as\n\n $ cat data\n #!/usr/bin/feedgnuplot --lines --points\n 2 1\n 4 4\n 6 9\n 8 16\n 10 25\n 12 36\n 14 49\n 16 64\n 18 81\n 20 100\n 22 121\n 24 144\n 26 169\n 28 196\n 30 225\n\nThis is the shebang (#!) line followed by the data, formatted as before. The\ndata file can be plotted simply with\n\n $ ./data\n\nThe caveats here are that on Linux the whole #! line is limited to 127\ncharacters and that the full path to feedgnuplot must be given. The 127\ncharacter limit is a serious limitation, but this can likely be resolved with a\nkernel patch. I have only tried on Linux 2.6.\n\n=head3 Self-plotting data with perl inline data\n\nPerl supports storing data and code in the same file. This can also be used to\ncreate self-plotting files:\n\n $ cat plotdata.pl\n #!/usr/bin/perl\n use strict;\n use warnings;\n\n open PLOT, \"| feedgnuplot --lines --points\" or die \"Couldn't open plotting pipe\";\n while( <DATA> )\n {\n   my @xy = split;\n   print PLOT \"@xy\\n\";\n }\n __DATA__\n 2 1\n 4 4\n 6 9\n 8 16\n 10 25\n 12 36\n 14 49\n 16 64\n 18 81\n 20 100\n 22 121\n 24 144\n 26 169\n 28 196\n 30 225\n\nThis is especially useful if the logged data is not in a format directly\nsupported by feedgnuplot. Raw data can be stored after the __DATA__ directive,\nwith a small perl script to manipulate the data into a useable format and send\nit to the plotter.\n\n=head1 ARGUMENTS\n\n=over\n\n=item\n\n--C<[no]domain>\n\nIf enabled, the first element of each line is the domain variable. If not, the\npoint index is used\n\n=item\n\n--C<[no]dataid>\n\nIf enabled, each data point is preceded by the ID of the data set that point\ncorresponds to. This ID is interpreted as a string, NOT as just a number. If not\nenabled, the order of the point is used.\n\nAs an example, if line 3 of the input is \"0 9 1 20\" then\n\n=over\n\n=item\n\nC<--nodomain --nodataid> would parse the 4 numbers as points in 4 different\ncurves at x=3\n\n=item\n\nC<--domain --nodataid> would parse the 4 numbers as points in 3 different\ncurves at x=0. Here, 0 is the x-variable and 9,1,20 are the data values\n\n=item\n\nC<--nodomain --dataid> would parse the 4 numbers as points in 2 different\ncurves at x=3. Here 0 and 1 are the data IDs and 9 and 20 are the\ndata values\n\n=item\n\nC<--domain --dataid> would parse the 4 numbers as a single point at\nx=0. Here 9 is the data ID and 1 is the data value. 20 is an extra\nvalue, so it is ignored. If another value followed 20, we'd get another\npoint in curve ID 20\n\n=back\n\n=item\n\nC<--[no]3d>\n\nDo [not] plot in 3D. This only makes sense with C<--domain>. Each domain here is\nan (x,y) tuple\n\n=item\n\n--C<timefmt [format]>\n\nInterpret the X data as a time/date, parsed with the given format\n\n=item\n\nC<--colormap>\n\nShow a colormapped xy plot. Requires extra data for the color. zmin/zmax can be\nused to set the extents of the colors. Automatically sets the C<--rangesize>.\n\n=item\n\nC<--stream [period]>\n\nPlot the data as it comes in, in realtime. If period is given, replot every\nperiod seconds. If no period is given, replot at 1Hz. If the period is given as\n0 or 'trigger', replot I<only> when the incoming data dictates this. See the\nL</\"Real-time streaming data\"> section of the man page.\n\n=item\n\nC<--[no]lines>\n\nDo [not] draw lines to connect consecutive points\n\n=item\n\nC<--[no]points>\n\nDo [not] draw points\n\n=item\n\nC<--circles>\n\nPlot with circles. This requires a radius be specified for each point.\nAutomatically sets the C<--rangesize>. C<Not> supported for 3d plots.\n\n=item\n\nC<--title xxx>\n\nSet the title of the plot\n\n=item\n\nC<--legend curveID legend>\n\nSet the label for a curve plot. Use this option multiple times for multiple\ncurves. With C<--dataid>, curveID is the ID. Otherwise, it's the index of the\ncurve, starting at 0\n\n=item\n\nC<--autolegend>\n\nUse the curve IDs for the legend. Titles given with C<--legend> override these\n\n=item\n\nC<--xlen xxx>\n\nWhen using C<--stream>, sets the size of the x-window to plot. Omit this or set\nit to 0 to plot ALL the data. Does not make sense with 3d plots. Implies\nC<--monotonic>. If we're plotting a histogram, then C<--xlen> causes a histogram\nover a moving window to be computed. The subtlely here is that with a histogram\nyou don't actually I<see> the domain since only the range is analyzed. But the\ndomain is still there, and can be utilized with C<--xlen>. With C<--xlen> we can\nplot I<only> histograms or I<only> I<non>-histograms.\n\n\n=item\n\nC<--xmin/xmax/ymin/ymax/y2min/y2max/zmin/zmax xxx>\n\nSet the range for the given axis. These x-axis bounds are ignored in a streaming\nplot. The y2-axis bound do not apply in 3d plots. The z-axis bounds apply\nI<only> to 3d plots or colormaps.\n\n=item\n\nC<--xlabel/ylabel/y2label/zlabel xxx>\n\nLabel the given axis. The y2-axis label does not apply to 3d plots while the\nz-axis label applies I<only> to 3d plots.\n\n=item\n\nC<--y2 xxx>\n\nPlot the data specified by this curve ID on the y2 axis. Without C<--dataid>,\nthe ID is just an ordered 0-based index. Does not apply to 3d plots. Can be\npassed multiple times, or passed a comma-separated list. By default the y2-axis\ncurves look the same as the y-axis ones. I.e. the viewer of the resulting plot\nhas to be told which is which via an axes label, legend, etc. Prior to version\n1.25 of feedgnuplot the curves plotted on the y2 axis were drawn with a thicker\nline. This is no longer the case, but that behavior can be brought back by\npassing something like\n\n --y2 curveid --style curveid 'linewidth 3'\n\n=item\n\nC<--histogram curveID>\n\nSet up a this specific curve to plot a histogram. The bin width is given with\nthe C<--binwidth> option (assumed 1.0 if omitted). If a drawing style is not\nspecified for this curve (C<--curvestyle>) or all curves (C<--with>,\nC<--curvestyleall>) then the default histogram style is set: filled boxes with\nborders. This is what the user generally wants. This works with C<--domain>\nand/or C<--stream>, but in those cases the x-value is used I<only> to cull old\ndata because of C<--xlen> or C<--monotonic>. I.e. the domain values are I<not>\ndrawn in any way. Can be passed multiple times, or passed a comma- separated\nlist\n\n=item\n\nC<--binwidth width>\n\nThe width of bins when making histograms. This setting applies to ALL histograms\nin the plot. Defaults to 1.0 if not given.\n\n=item\n\nC<--histstyle style>\n\nNormally, histograms are generated with the 'smooth frequency' gnuplot style.\nC<--histstyle> can be used to select different C<smooth> settings (see the\ngnuplot C<help smooth> page for more info). Allowed values are 'frequency' (the\ndefault), 'fnormal' (available in very recent gnuplots), 'unique', 'cumulative'\nand 'cnormal'. 'fnormal' is a normalized histogram. 'unique' indicates whether a\nbin has at least one item in it: instead of counting the items, it'll always\nreport 0 or 1. 'cumulative' is the integral of the 'frequency' histogram.\n'cnormal' is like 'cumulative', but rescaled to end up at 1.0.\n\n=item\n\nC<--style curveID style>\n\nAdditional styles per curve. With C<--dataid>, curveID is the ID. Otherwise,\nit's the index of the curve, starting at 0. curveID can be a comma-separated\nlist of IDs to which the given style should apply. Use this option multiple\ntimes for multiple curves. C<--styleall> does I<not> apply to curves that have a\nC<--style>.\n\n=item\n\nC<--curvestyle curveID>\n\nSynonym for C<--style>\n\n=item\n\nC<--styleall xxx>\n\nAdditional styles for all curves that have no C<--style>. This is overridden by\nany applicable C<--style>. Exclusive with C<--with>.\n\n=item\n\nC<--curvestyleall xxx>\n\nSynonym for C<--styleall>\n\n=item\n\nC<--with xxx>\n\nSame as C<--styleall>, but prefixed with \"with\". Thus\n\n --with boxes\n\nis equivalent to\n\n --styleall 'with boxes'\n\nExclusive with C<--styleall>.\n\n=item\n\nC<--extracmds xxx>\n\nAdditional commands to pass on to gnuplot verbatim. These could contain extra\nglobal styles for instance. Can be passed multiple times.\n\n=item\n\nC<--set xxx>\n\nAdditional 'set' commands to pass on to gnuplot verbatim. C<--set 'a b c'> will\nresult in gnuplot seeing a C<set a b c> command. Can be passed multiple times.\n\n=item\n\nC<--unset xxx>\n\nAdditional 'unset' commands to pass on to gnuplot verbatim. C<--unset 'a b c'>\nwill result in gnuplot seeing a C<unset a b c> command. Can be passed multiple\ntimes.\n\n=item\n\nC<--image filename>\n\nOverlays the data on top of a raster image given in C<filename>. This is passed\nthrough to gnuplot via C<--equation>, and is not interpreted by C<feedgnuplot>\nother than checking for existence. Usually images have their origin at the\ntop-left corner, while plots have it in the bottom-left corner instead. Thus if\nthe y-axis extents are not specified (C<--ymin>, C<--ymax>, C<--set 'yrange\n...'>) this option will also flip around the y axis to make the image appear\nproperly. Since this option is just a passthrough to gnuplot, finer control can\nbe achieved by passing in C<--equation> and C<--set yrange ...> directly.\n\nC<--equation xxx>\n\nGnuplot can plot both data and symbolic equations. C<feedgnuplot> generally\nplots data, but with this option can plot symbolic equations I<also>. This is\ngenerally intended to augment data plots, since for equation-only plots you\ndon't need C<feedgnuplot>. C<--equation> can be passed multiple times for\nmultiple equations. The given strings are passed to gnuplot directly without any\nthing added or removed, so styling and such should be applied in the string. A\nbasic example:\n\n seq 100 | awk '{print $1/10, $1/100}' |\n   feedgnuplot --with 'lines lw 3' --domain --ymax 1\n               --equation 'sin(x)/x' --equation 'cos(x)/x with lines lw 4'\n\nHere I plot the incoming data (points along a line) with the given style (a line\nwith thickness 3), I<and> I plot two damped sinusoids on the same plot. The\nsinusoids are not affected by C<feedgnuplot> styling, so their styles are set\nseparately, as in this example. More complicated example:\n\n seq 360 | perl -nE '$th=$_/360 * 3.14*2; $c=cos($th); $s=sin($th); say \"$c $s\"' |\n   feedgnuplot --domain --square\n               --set parametric --set \"trange [0:2*3.14]\" --equation \"sin(t),cos(t)\"\n\nHere the data I generate is points along the unit circle. I plot these as\npoints, and I I<also> plot a true circle as a parametric equation.\n\n=item\n\nC<--square>\n\nPlot data with aspect ratio 1. For 3D plots, this controls the aspect ratio for\nall 3 axes\n\n=item\n\nC<--square_xy>\n\nFor 3D plots, set square aspect ratio for ONLY the x,y axes\n\n=item\n\nC<--hardcopy xxx>\n\nIf not streaming, output to a file specified here. Format inferred from\nfilename, unless specified by C<--terminal>. If C<--terminal> is given,\nC<--hardcopy> sets I<only> the output filename.\n\n=item\n\nC<--terminal xxx>\n\nString passed to 'set terminal'. No attempts are made to validate this.\nC<--hardcopy> sets this to some sensible defaults if C<--hardcopy> is set to a\nfilename ending in C<.png>, C<.pdf>, C<.ps>, C<.eps> or C<.svg>. If any other\nfile type is desired, use both C<--hardcopy> and C<--terminal>\n\n=item\n\nC<--maxcurves xxx>\n\nThe maximum allowed number of curves. This is 100 by default, but can be reset\nwith this option. This exists purely to prevent perl from allocating all of the\nsystem's memory when reading bogus data\n\n=item\n\nC<--monotonic>\n\nIf C<--domain> is given, checks to make sure that the x- coordinate in the input\ndata is monotonically increasing. If a given x-variable is in the past, all data\ncurrently cached for this curve is purged. Without C<--monotonic>, all data is\nkept. Does not make sense with 3d plots. No C<--monotonic> by default. The data is\nreplotted before being purged\n\n=item\n\nC<--rangesize curveID xxx>\n\nThe options C<--rangesizeall>, C<--rangesize> and C<--extraValuesPerPoint> set\nthe number of values are needed to represent each point being plotted (see\nL</\"Multi-value style support\"> above). These options are I<only> needed if\nunknown styles are used, with C<--styleall> or C<--with> for instance.\n\nC<--rangesize> is used to set how many values are needed to represent the range\nof a point for a particular curve. This overrides any defaults that may exist\nfor this curve only.\n\nWith C<--dataid>, curveID is the ID. Otherwise, it's the index of the curve,\nstarting at 0. curveID can be a comma-separated list of IDs to which the given\nrangesize should apply.\n\n=item\n\nC<--rangesizeall xxx>\n\nLike C<--rangesize>, but applies to I<all> the curves.\n\nC<--extraValuesPerPoint xxx>\n\nLike C<--rangesizeall>, but instead of overriding the default, adds to it. For\nexample, if plotting non-lopsided y errorbars gnuplot wants (x,y,ydelta) tuples.\nThese can be specified both with C<--rangesizeall 2> (because there are 2 range\nvalues) or C<--extraValuesPerPoint 1> (because there's 1 more value than usual).\n\nThis option is I<only> needed if unknown styles are used, with C<--styleall> or\nC<--with> for instance.\n\n=item\n\nC<--dump>\n\nInstead of printing to gnuplot, print to STDOUT. Very useful for debugging. It\nis possible to send the output produced this way to gnuplot directly.\n\n=item\n\nC<--exit>\n\nThis controls what happens when the input data is exhausted, or when some part\nof the C<feedgnuplot> pipeline is killed. This option does different things\ndepending on whether C<--stream> is active, so read this closely.\n\nWith interactive gnuplot terminals (qt, x11, wxt), the plot windows live in a\nseparate process from the main C<gnuplot> process. It is thus possible for the\nmain C<gnuplot> process to exit, while leaving the plot windows up (a caveat is\nthat such decapitated windows aren't interactive). There are 3 possible states\nof the polotting pipeline:\n\n=over\n\n=item Alive: C<feedgnuplot>, C<gnuplot> alive, plot window process alive, no\nshell prompt (shell busy with C<feedgnuplot>)\n\n=item Half-alive: C<feedgnuplot>, C<gnuplot> dead, plot window process alive\n(but non-interactive), shell prompt available\n\n=item Dead: C<feedgnuplot>, C<gnuplot> dead, plot window process dead, shell\nprompt available\n\n=back\n\nThe possibilities are:\n\n=over\n\n=item No C<--stream>, all data read in\n\n=over\n\n=item no C<--exit> (default)\n\nAlive. Need to Ctrl-C to get back into the shell\n\n=item C<--exit>\n\nHalf-alive. Non-interactive prompt up, and the shell accepts new commands.\nWithout C<--stream> the goal is to show a plot, so a Dead state would not be\nuseful.\n\n=back\n\n=item C<--stream>, all data read in or the C<feedgnuplot> process terminated\n\n=over\n\n=item no C<--exit> (default)\n\nAlive. Need to Ctrl-C to get back into the shell. This means that when making\nlive plots, the first Ctrl-C kills the data feeding process, but leaves the\nfinal plot up for inspection. A second Ctrl-C kills feedgnuplot as well.\n\n=item C<--exit>\n\nDead. No plot is shown, and the shell accepts new commands. With C<--stream> the\ngoal is to show a plot as the data comes in, which we have been doing. Now that\nwe're done, we can clean up everything.\n\n=back\n\n=back\n\nNote that one usually invokes C<feedgnuplot> as a part of a shell pipeline:\n\n $ write_data | feedgnuplot\n\nIf the user terminates this pipeline with ^C, then I<all> the processes in the\npipeline receive SIGINT. This normally kills C<feedgnuplot> and all its\nC<gnuplot> children, and we let this happen unless C<--stream> and no C<--exit>.\nIf C<--stream> and no C<--exit>, then we ignore the first ^C. The data feeder\ndies, and we behave as if the input data was exhausted. A second ^C kills us\nalso.\n\n=item\n\nC<--geometry>\n\nIf using X11, specifies the size, position of the plot window\n\n=item\n\nC<--version>\n\nPrint the version and exit\n\n=back\n\n=head1 RECIPES\n\n=head2 Basic plotting of piped data\n\n $ seq 5 | awk '{print 2*$1, $1*$1}'\n 2 1\n 4 4\n 6 9\n 8 16\n 10 25\n\n $ seq 5 | awk '{print 2*$1, $1*$1}' |\n   feedgnuplot --lines --points --legend 0 \"data 0\" --title \"Test plot\" --y2 1\n\n=head2 Realtime plot of network throughput\n\nLooks at wlan0 on Linux.\n\n $ while true; do sleep 1; cat /proc/net/dev; done |\n   gawk '/wlan0/ {if(b) {print $2-b; fflush()} b=$2}' |\n   feedgnuplot --lines --stream --xlen 10 --ylabel 'Bytes/sec' --xlabel seconds\n\n=head2 Realtime plot of battery charge in respect to time\n\nUses the result of the C<acpi> command.\n\n $ while true; do acpi; sleep 15; done |\n   perl -nE 'BEGIN{ $| = 1; } /([0-9]*)%/; say join(\" \", time(), $1);' |\n   feedgnuplot --stream --ymin 0 --ymax 100 --lines --domain --xlabel 'Time' --timefmt '%s' --ylabel \"Battery charge (%)\"\n\n=head2 Realtime plot of temperatures in an IBM Thinkpad\n\nUses C</proc/acpi/ibm/thermal>, which reports temperatures at various locations\nin a Thinkpad.\n\n $ while true; do cat /proc/acpi/ibm/thermal | awk '{$1=\"\"; print}' ; sleep 1; done |\n   feedgnuplot --stream --xlen 100 --lines --autolegend --ymax 100 --ymin 20 --ylabel 'Temperature (deg C)'\n\n=head2 Plotting a histogram of file sizes in a directory, granular to 10MB\n\n $ ls -l | awk '{print $5/1e6}' |\n   feedgnuplot --histogram 0\n     --binwidth 10\n     --ymin 0 --xlabel 'File size (MB)' --ylabel Frequency\n\n=head2 Plotting a live histogram of the ping round-trip times for the past 20 seconds\n\n $ ping -A -D 8.8.8.8 |\n   perl -anE 'BEGIN { $| = 1; }\n              $F[0] =~ s/[\\[\\]]//g or next;\n              $F[7] =~ s/.*=//g    or next;\n              say \"$F[0] $F[7]\"' |\n   feedgnuplot --stream --domain --histogram 0 --binwidth 10 \\\n               --xlabel 'Ping round-trip time (s)'  \\\n               --ylabel Frequency --xlen 20\n\n=head2 Plotting points on top of an existing image\n\nThis can be done with C<--image>:\n\n $ < features_xy.data\n   feedgnuplot --points --domain --image \"image.png\"\n\nor with C<--equation>:\n\n $ < features_xy.data\n   feedgnuplot --points --domain\n     --equation '\"image.png\" binary filetype=auto flipy with rgbimage'\n     --set 'yrange [:] reverse'\n\nThe C<--image> invocation is a convenience wrapper for the C<--equation>\nversion. Finer control is available with C<--equation>.\n\n\nHere an existing image is given to gnuplot verbatim, and data to plot on top of\nit is interpreted by feedgnuplot as usual. C<flipy> is useful here because\nusually the y axis points up, but when looking at images, this is usually\nreversed: the origin is the top-left pixel.\n\n=head1 ACKNOWLEDGEMENT\n\nThis program is originally based on the driveGnuPlots.pl script from\nThanassis Tsiodras. It is available from his site at\nL<http://users.softlab.ece.ntua.gr/~ttsiod/gnuplotStreaming.html>\n\n=head1 REPOSITORY\n\nL<https://github.com/dkogan/feedgnuplot>\n\n=head1 AUTHOR\n\nDima Kogan, C<< <dima@secretsauce.net> >>\n\n=head1 LICENSE AND COPYRIGHT\n\nCopyright 2011-2012 Dima Kogan.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of either: the GNU General Public License as published\nby the Free Software Foundation; or the Artistic License.\n\nSee http://dev.perl.org/licenses/ for more information.\n\n=cut\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/fib.pl",
    "content": "#! perl\n# Copyright (C) 2001-2003, Parrot Foundation.\n\n=head1 NAME\n\nexamples/benchmarks/fib.pl - Fibonacci Benchmark\n\n=head1 SYNOPSIS\n\n    % time perl examples/benchmarks/fib.pl n\n\n=head1 DESCRIPTION\n\nCalculates the Fibonacci Number for C<n> (defaults to 28 if\nunspecified).\n\n=cut\n\nuse strict;\nuse warnings;\n\nsub fib {\n    my $n = shift;\n    return $n if ( $n < 2 );\n    return fib( $n - 1 ) + fib( $n - 2 );\n}\nmy $N = shift || 28;\n\nprint \"fib($N) = \", fib($N), \"\\n\";\n\n=head1 SEE ALSO\n\nF<examples/benchmarks/fib.pir>.\n\n=cut\n\n# Local Variables:\n#   mode: cperl\n#   cperl-indent-level: 4\n#   fill-column: 100\n# End:\n# vim: expandtab shiftwidth=4:\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/filenames/Makefile.PL",
    "content": "use strict;\nuse warnings;\nuse ExtUtils::MakeMaker;\n\nWriteMakefile(\n    NAME                => 'Algorithm::Evolutionary::Simple',\n    AUTHOR              => 'JJ Merelo <jj@merelo.net>',\n    VERSION_FROM        => 'lib/Algorithm/Evolutionary/Simple.pm',\n    ABSTRACT_FROM       => 'lib/Algorithm/Evolutionary/Simple.pm',\n    LICENSE => 'gpl',\n    EXE_FILES => [ 'script/simple-EA.pl',  'script/maxones.pl'],\n    PREREQ_PM => {\n        'Test::More' => 0,\n\t'Carp' => 0,\n\t'Exporter' => 0,\n\t'Sort::Key::Top' => 0\n    },\n    dist                => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },\n    clean               => { FILES => 'Algorithm-Evolutionary-Simple-*' },\n);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/filenames/Rexfile",
    "content": "use Rex -feature => ['1.0'];\n\nuser \"eleccionesugr\";\ngroup eleccionesugr => \"elecciones-ugr.cloudapp.net\";\n\ndesc \"Install perlbrew\";\ntask \"perlbrew\", group => \"eleccionesugr\", sub {\n};\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/filenames/ack",
    "content": "#!/usr/bin/env perl\n#\n# This file, ack, is generated code.\n# Please DO NOT EDIT or send patches for it.\n#\n# Please take a look at the source from\n# https://github.com/petdance/ack\n# and submit patches against the individual files\n# that build ack.\n#\n\nuse warnings;\nuse strict;\n\nour $VERSION = '1.96';\n# Check http://betterthangrep.com/ for updates\n\n# These are all our globals.\n\n\nMAIN: {\n    if ( $App::Ack::VERSION ne $main::VERSION ) {\n        App::Ack::die( \"Program/library version mismatch\\n\\t$0 is $main::VERSION\\n\\t$INC{'App/Ack.pm'} is $App::Ack::VERSION\" );\n    }\n\n    # Do preliminary arg checking;\n    my $env_is_usable = 1;\n    for ( @ARGV ) {\n        last if ( $_ eq '--' );\n\n        # Priorities! Get the --thpppt and --bar checking out of the way.\n        /^--th[pt]+t+$/ && App::Ack::_thpppt($_);\n        /^--bar$/ && App::Ack::_bar();\n\n        # See if we want to ignore the environment. (Don't tell Al Gore.)\n        if ( /^--(no)?env$/ ) {\n            $env_is_usable = defined $1 ? 0 : 1;\n        }\n    }\n    if ( $env_is_usable ) {\n        unshift( @ARGV, App::Ack::read_ackrc() );\n    }\n    else {\n        my @keys = ( 'ACKRC', grep { /^ACK_/ } keys %ENV );\n        delete @ENV{@keys};\n    }\n    App::Ack::load_colors();\n\n    if ( exists $ENV{ACK_SWITCHES} ) {\n        App::Ack::warn( 'ACK_SWITCHES is no longer supported.  Use ACK_OPTIONS.' );\n    }\n\n    if ( !@ARGV ) {\n        App::Ack::show_help();\n        exit 1;\n    }\n\n    main();\n}\n\nsub main {\n    my $opt = App::Ack::get_command_line_options();\n\n    $| = 1 if $opt->{flush}; # Unbuffer the output if flush mode\n\n    if ( App::Ack::input_from_pipe() ) {\n        # We're going into filter mode\n        for ( qw( f g l ) ) {\n            $opt->{$_} and App::Ack::die( \"Can't use -$_ when acting as a filter.\" );\n        }\n        $opt->{show_filename} = 0;\n        $opt->{regex} = App::Ack::build_regex( defined $opt->{regex} ? $opt->{regex} : shift @ARGV, $opt );\n        if ( my $nargs = @ARGV ) {\n            my $s = $nargs == 1 ? '' : 's';\n            App::Ack::warn( \"Ignoring $nargs argument$s on the command-line while acting as a filter.\" );\n        }\n\n        my $res = App::Ack::Resource::Basic->new( '-' );\n        my $nmatches;\n        if ( $opt->{count} ) {\n            $nmatches = App::Ack::search_and_list( $res, $opt );\n        }\n        else {\n            # normal searching\n            $nmatches = App::Ack::search_resource( $res, $opt );\n        }\n        $res->close();\n        App::Ack::exit_from_ack( $nmatches );\n    }\n\n    my $file_matching = $opt->{f} || $opt->{lines};\n    if ( $file_matching ) {\n        App::Ack::die( \"Can't specify both a regex ($opt->{regex}) and use one of --line, -f or -g.\" ) if $opt->{regex};\n    }\n    else {\n        $opt->{regex} = App::Ack::build_regex( defined $opt->{regex} ? $opt->{regex} : shift @ARGV, $opt );\n    }\n\n    # check that all regexes do compile fine\n    App::Ack::check_regex( $_ ) for ( $opt->{regex}, $opt->{G} );\n\n    my $what = App::Ack::get_starting_points( \\@ARGV, $opt );\n    my $iter = App::Ack::get_iterator( $what, $opt );\n    App::Ack::filetype_setup();\n\n    my $nmatches = 0;\n\n    App::Ack::set_up_pager( $opt->{pager} ) if defined $opt->{pager};\n    if ( $opt->{f} ) {\n        $nmatches = App::Ack::print_files( $iter, $opt );\n    }\n    elsif ( $opt->{l} || $opt->{count} ) {\n        $nmatches = App::Ack::print_files_with_matches( $iter, $opt );\n    }\n    else {\n        $nmatches = App::Ack::print_matches( $iter, $opt );\n    }\n    close $App::Ack::fh;\n    App::Ack::exit_from_ack( $nmatches );\n}\n\n=head1 NAME\n\nack - grep-like text finder\n\n=head1 SYNOPSIS\n\n    ack [options] PATTERN [FILE...]\n    ack -f [options] [DIRECTORY...]\n\n=head1 DESCRIPTION\n\nAck is designed as a replacement for 99% of the uses of F<grep>.\n\nAck searches the named input FILEs (or standard input if no files are\nnamed, or the file name - is given) for lines containing a match to the\ngiven PATTERN.  By default, ack prints the matching lines.\n\nAck can also list files that would be searched, without actually searching\nthem, to let you take advantage of ack's file-type filtering capabilities.\n\n=head1 FILE SELECTION\n\nI<ack> is intelligent about the files it searches.  It knows about\ncertain file types, based on both the extension on the file and,\nin some cases, the contents of the file.  These selections can be\nmade with the B<--type> option.\n\nWith no file selections, I<ack> only searches files of types that\nit recognizes.  If you have a file called F<foo.wango>, and I<ack>\ndoesn't know what a .wango file is, I<ack> won't search it.\n\nThe B<-a> option tells I<ack> to select all files, regardless of\ntype.\n\nSome files will never be selected by I<ack>, even with B<-a>,\nincluding:\n\n=over 4\n\n=item * Backup files: Files matching F<#*#> or ending with F<~>.\n\n=item * Coredumps: Files matching F<core.\\d+>\n\n=back\n\nHowever, I<ack> always searches the files given on the command line,\nno matter what type. Furthermore, by specifying the B<-u> option all\nfiles will be searched.\n\n=head1 DIRECTORY SELECTION\n\nI<ack> descends through the directory tree of the starting directories\nspecified.  However, it will ignore the shadow directories used by\nmany version control systems, and the build directories used by the\nPerl MakeMaker system.  You may add or remove a directory from this\nlist with the B<--[no]ignore-dir> option. The option may be repeated\nto add/remove multiple directories from the ignore list.\n\nFor a complete list of directories that do not get searched, run\nF<ack --help>.\n\n=head1 WHEN TO USE GREP\n\nI<ack> trumps I<grep> as an everyday tool 99% of the time, but don't\nthrow I<grep> away, because there are times you'll still need it.\n\nE.g., searching through huge files looking for regexes that can be\nexpressed with I<grep> syntax should be quicker with I<grep>.\n\nIf your script or parent program uses I<grep> C<--quiet> or\nC<--silent> or needs exit 2 on IO error, use I<grep>.\n\n=head1 OPTIONS\n\n=over 4\n\n=item B<-a>, B<--all>\n\nOperate on all files, regardless of type (but still skip directories\nlike F<blib>, F<CVS>, etc.)\n\n=item B<-A I<NUM>>, B<--after-context=I<NUM>>\n\nPrint I<NUM> lines of trailing context after matching lines.\n\n=item B<-B I<NUM>>, B<--before-context=I<NUM>>\n\nPrint I<NUM> lines of leading context before matching lines.\n\n=item B<-C [I<NUM>]>, B<--context[=I<NUM>]>\n\nPrint I<NUM> lines (default 2) of context around matching lines.\n\n=item B<-c>, B<--count>\n\nSuppress normal output; instead print a count of matching lines for\neach input file.  If B<-l> is in effect, it will only show the\nnumber of lines for each file that has lines matching.  Without\nB<-l>, some line counts may be zeroes.\n\nIf combined with B<-h> (B<--no-filename>) ack outputs only one total count.\n\n=item B<--color>, B<--nocolor>\n\nB<--color> highlights the matching text.  B<--nocolor> supresses\nthe color.  This is on by default unless the output is redirected.\n\nOn Windows, this option is off by default unless the\nL<Win32::Console::ANSI> module is installed or the C<ACK_PAGER_COLOR>\nenvironment variable is used.\n\n=item B<--color-filename=I<color>>\n\nSets the color to be used for filenames.\n\n=item B<--color-match=I<color>>\n\nSets the color to be used for matches.\n\n=item B<--color-lineno=I<color>>\n\nSets the color to be used for line numbers.\n\n=item B<--column>\n\nShow the column number of the first match.  This is helpful for editors\nthat can place your cursor at a given position.\n\n=item B<--env>, B<--noenv>\n\nB<--noenv> disables all environment processing. No F<.ackrc> is read\nand all environment variables are ignored. By default, F<ack> considers\nF<.ackrc> and settings in the environment.\n\n=item B<--flush>\n\nB<--flush> flushes output immediately.  This is off by default\nunless ack is running interactively (when output goes to a pipe\nor file).\n\n=item B<-f>\n\nOnly print the files that would be searched, without actually doing\nany searching.  PATTERN must not be specified, or it will be taken as\na path to search.\n\n=item B<--follow>, B<--nofollow>\n\nFollow or don't follow symlinks, other than whatever starting files\nor directories were specified on the command line.\n\nThis is off by default.\n\n=item B<-G I<REGEX>>\n\nOnly paths matching I<REGEX> are included in the search.  The entire\npath and filename are matched against I<REGEX>, and I<REGEX> is a\nPerl regular expression, not a shell glob.\n\nThe options B<-i>, B<-w>, B<-v>, and B<-Q> do not apply to this I<REGEX>.\n\n=item B<-g I<REGEX>>\n\nPrint files where the relative path + filename matches I<REGEX>. This option is\na convenience shortcut for B<-f> B<-G I<REGEX>>.\n\nThe options B<-i>, B<-w>, B<-v>, and B<-Q> do not apply to this I<REGEX>.\n\n=item B<--group>, B<--nogroup>\n\nB<--group> groups matches by file name with.  This is the default when\nused interactively.\n\nB<--nogroup> prints one result per line, like grep.  This is the default\nwhen output is redirected.\n\n=item B<-H>, B<--with-filename>\n\nPrint the filename for each match.\n\n=item B<-h>, B<--no-filename>\n\nSuppress the prefixing of filenames on output when multiple files are\nsearched.\n\n=item B<--help>\n\nPrint a short help statement.\n\n=item B<-i>, B<--ignore-case>\n\nIgnore case in the search strings.\n\nThis applies only to the PATTERN, not to the regexes given for the B<-g>\nand B<-G> options.\n\n=item B<--[no]ignore-dir=I<DIRNAME>>\n\nIgnore directory (as CVS, .svn, etc are ignored). May be used multiple times\nto ignore multiple directories. For example, mason users may wish to include\nB<--ignore-dir=data>. The B<--noignore-dir> option allows users to search\ndirectories which would normally be ignored (perhaps to research the contents\nof F<.svn/props> directories).\n\nThe I<DIRNAME> must always be a simple directory name. Nested directories like\nF<foo/bar> are NOT supported. You would need to specify B<--ignore-dir=foo> and\nthen no files from any foo directory are taken into account by ack unless given\nexplicitly on the command line.\n\n=item B<--line=I<NUM>>\n\nOnly print line I<NUM> of each file. Multiple lines can be given with multiple\nB<--line> options or as a comma separated list (B<--line=3,5,7>). B<--line=4-7>\nalso works. The lines are always output in ascending order, no matter the\norder given on the command line.\n\n=item B<-l>, B<--files-with-matches>\n\nOnly print the filenames of matching files, instead of the matching text.\n\n=item B<-L>, B<--files-without-matches>\n\nOnly print the filenames of files that do I<NOT> match. This is equivalent\nto specifying B<-l> and B<-v>.\n\n=item B<--match I<REGEX>>\n\nSpecify the I<REGEX> explicitly. This is helpful if you don't want to put the\nregex as your first argument, e.g. when executing multiple searches over the\nsame set of files.\n\n    # search for foo and bar in given files\n    ack file1 t/file* --match foo\n    ack file1 t/file* --match bar\n\n=item B<-m=I<NUM>>, B<--max-count=I<NUM>>\n\nStop reading a file after I<NUM> matches.\n\n=item B<--man>\n\nPrint this manual page.\n\n=item B<-n>, B<--no-recurse>\n\nNo descending into subdirectories.\n\n=item B<-o>\n\nShow only the part of each line matching PATTERN (turns off text\nhighlighting)\n\n=item B<--output=I<expr>>\n\nOutput the evaluation of I<expr> for each line (turns off text\nhighlighting)\n\n=item B<--pager=I<program>>\n\nDirect ack's output through I<program>.  This can also be specified\nvia the C<ACK_PAGER> and C<ACK_PAGER_COLOR> environment variables.\n\nUsing --pager does not suppress grouping and coloring like piping\noutput on the command-line does.\n\n=item B<--passthru>\n\nPrints all lines, whether or not they match the expression.  Highlighting\nwill still work, though, so it can be used to highlight matches while\nstill seeing the entire file, as in:\n\n    # Watch a log file, and highlight a certain IP address\n    $ tail -f ~/access.log | ack --passthru 123.45.67.89\n\n=item B<--print0>\n\nOnly works in conjunction with -f, -g, -l or -c (filename output). The filenames\nare output separated with a null byte instead of the usual newline. This is\nhelpful when dealing with filenames that contain whitespace, e.g.\n\n    # remove all files of type html\n    ack -f --html --print0 | xargs -0 rm -f\n\n=item B<-Q>, B<--literal>\n\nQuote all metacharacters in PATTERN, it is treated as a literal.\n\nThis applies only to the PATTERN, not to the regexes given for the B<-g>\nand B<-G> options.\n\n=item B<-r>, B<-R>, B<--recurse>\n\nRecurse into sub-directories. This is the default and just here for\ncompatibility with grep. You can also use it for turning B<--no-recurse> off.\n\n=item B<--smart-case>, B<--no-smart-case>\n\nIgnore case in the search strings if PATTERN contains no uppercase\ncharacters. This is similar to C<smartcase> in vim. This option is\noff by default.\n\nB<-i> always overrides this option.\n\nThis applies only to the PATTERN, not to the regexes given for the\nB<-g> and B<-G> options.\n\n=item B<--sort-files>\n\nSorts the found files lexically.  Use this if you want your file\nlistings to be deterministic between runs of I<ack>.\n\n=item B<--show-types>\n\nOutputs the filetypes that ack associates with each file.\n\nWorks with B<-f> and B<-g> options.\n\n=item B<--thpppt>\n\nDisplay the all-important Bill The Cat logo.  Note that the exact\nspelling of B<--thpppppt> is not important.  It's checked against\na regular expression.\n\n=item B<--bar>\n\nCheck with the admiral for traps.\n\n=item B<--type=TYPE>, B<--type=noTYPE>\n\nSpecify the types of files to include or exclude from a search.\nTYPE is a filetype, like I<perl> or I<xml>.  B<--type=perl> can\nalso be specified as B<--perl>, and B<--type=noperl> can be done\nas B<--noperl>.\n\nIf a file is of both type \"foo\" and \"bar\", specifying --foo and\n--nobar will exclude the file, because an exclusion takes precedence\nover an inclusion.\n\nType specifications can be repeated and are ORed together.\n\nSee I<ack --help=types> for a list of valid types.\n\n=item B<--type-add I<TYPE>=I<.EXTENSION>[,I<.EXT2>[,...]]>\n\nFiles with the given EXTENSION(s) are recognized as being of (the\nexisting) type TYPE. See also L</\"Defining your own types\">.\n\n\n=item B<--type-set I<TYPE>=I<.EXTENSION>[,I<.EXT2>[,...]]>\n\nFiles with the given EXTENSION(s) are recognized as being of type\nTYPE. This replaces an existing definition for type TYPE.  See also\nL</\"Defining your own types\">.\n\n=item B<-u>, B<--unrestricted>\n\nAll files and directories (including blib/, core.*, ...) are searched,\nnothing is skipped. When both B<-u> and B<--ignore-dir> are used, the\nB<--ignore-dir> option has no effect.\n\n=item B<-v>, B<--invert-match>\n\nInvert match: select non-matching lines\n\nThis applies only to the PATTERN, not to the regexes given for the B<-g>\nand B<-G> options.\n\n=item B<--version>\n\nDisplay version and copyright information.\n\n=item B<-w>, B<--word-regexp>\n\nForce PATTERN to match only whole words.  The PATTERN is wrapped with\nC<\\b> metacharacters.\n\nThis applies only to the PATTERN, not to the regexes given for the B<-g>\nand B<-G> options.\n\n=item B<-1>\n\nStops after reporting first match of any kind.  This is different\nfrom B<--max-count=1> or B<-m1>, where only one match per file is\nshown.  Also, B<-1> works with B<-f> and B<-g>, where B<-m> does\nnot.\n\n=back\n\n=head1 THE .ackrc FILE\n\nThe F<.ackrc> file contains command-line options that are prepended\nto the command line before processing.  Multiple options may live\non multiple lines.  Lines beginning with a # are ignored.  A F<.ackrc>\nmight look like this:\n\n    # Always sort the files\n    --sort-files\n\n    # Always color, even if piping to a another program\n    --color\n\n    # Use \"less -r\" as my pager\n    --pager=less -r\n\nNote that arguments with spaces in them do not need to be quoted,\nas they are not interpreted by the shell. Basically, each I<line>\nin the F<.ackrc> file is interpreted as one element of C<@ARGV>.\n\nF<ack> looks in your home directory for the F<.ackrc>.  You can\nspecify another location with the F<ACKRC> variable, below.\n\nIf B<--noenv> is specified on the command line, the F<.ackrc> file\nis ignored.\n\n=head1 Defining your own types\n\nack allows you to define your own types in addition to the predefined\ntypes. This is done with command line options that are best put into\nan F<.ackrc> file - then you do not have to define your types over and\nover again. In the following examples the options will always be shown\non one command line so that they can be easily copy & pasted.\n\nI<ack --perl foo> searches for foo in all perl files. I<ack --help=types>\ntells you, that perl files are files ending\nin .pl, .pm, .pod or .t. So what if you would like to include .xs\nfiles as well when searching for --perl files? I<ack --type-add perl=.xs --perl foo>\ndoes this for you. B<--type-add> appends\nadditional extensions to an existing type.\n\nIf you want to define a new type, or completely redefine an existing\ntype, then use B<--type-set>. I<ack --type-set\neiffel=.e,.eiffel> defines the type I<eiffel> to include files with\nthe extensions .e or .eiffel. So to search for all eiffel files\ncontaining the word Bertrand use I<ack --type-set eiffel=.e,.eiffel --eiffel Bertrand>.\nAs usual, you can also write B<--type=eiffel>\ninstead of B<--eiffel>. Negation also works, so B<--noeiffel> excludes\nall eiffel files from a search. Redefining also works: I<ack --type-set cc=.c,.h>\nand I<.xs> files no longer belong to the type I<cc>.\n\nWhen defining your own types in the F<.ackrc> file you have to use\nthe following:\n\n  --type-set=eiffel=.e,.eiffel\n\nor writing on separate lines\n\n  --type-set\n  eiffel=.e,.eiffel\n\nThe following does B<NOT> work in the F<.ackrc> file:\n\n  --type-set eiffel=.e,.eiffel\n\n\nIn order to see all currently defined types, use I<--help types>, e.g.\nI<ack --type-set backup=.bak --type-add perl=.perl --help types>\n\nRestrictions:\n\n=over 4\n\n=item\n\nThe types 'skipped', 'make', 'binary' and 'text' are considered \"builtin\" and\ncannot be altered.\n\n=item\n\nThe shebang line recognition of the types 'perl', 'ruby', 'php', 'python',\n'shell' and 'xml' cannot be redefined by I<--type-set>, it is always\nactive. However, the shebang line is only examined for files where the\nextension is not recognised. Therefore it is possible to say\nI<ack --type-set perl=.perl --type-set foo=.pl,.pm,.pod,.t --perl --nofoo> and\nonly find your shiny new I<.perl> files (and all files with unrecognized extension\nand perl on the shebang line).\n\n=back\n\n=head1 ENVIRONMENT VARIABLES\n\nFor commonly-used ack options, environment variables can make life much easier.\nThese variables are ignored if B<--noenv> is specified on the command line.\n\n=over 4\n\n=item ACKRC\n\nSpecifies the location of the F<.ackrc> file.  If this file doesn't\nexist, F<ack> looks in the default location.\n\n=item ACK_OPTIONS\n\nThis variable specifies default options to be placed in front of\nany explicit options on the command line.\n\n=item ACK_COLOR_FILENAME\n\nSpecifies the color of the filename when it's printed in B<--group>\nmode.  By default, it's \"bold green\".\n\nThe recognized attributes are clear, reset, dark, bold, underline,\nunderscore, blink, reverse, concealed black, red, green, yellow,\nblue, magenta, on_black, on_red, on_green, on_yellow, on_blue,\non_magenta, on_cyan, and on_white.  Case is not significant.\nUnderline and underscore are equivalent, as are clear and reset.\nThe color alone sets the foreground color, and on_color sets the\nbackground color.\n\nThis option can also be set with B<--color-filename>.\n\n=item ACK_COLOR_MATCH\n\nSpecifies the color of the matching text when printed in B<--color>\nmode.  By default, it's \"black on_yellow\".\n\nThis option can also be set with B<--color-match>.\n\nSee B<ACK_COLOR_FILENAME> for the color specifications.\n\n=item ACK_COLOR_LINENO\n\nSpecifies the color of the line number when printed in B<--color>\nmode.  By default, it's \"bold yellow\".\n\nThis option can also be set with B<--color-lineno>.\n\nSee B<ACK_COLOR_FILENAME> for the color specifications.\n\n=item ACK_PAGER\n\nSpecifies a pager program, such as C<more>, C<less> or C<most>, to which\nack will send its output.\n\nUsing C<ACK_PAGER> does not suppress grouping and coloring like\npiping output on the command-line does, except that on Windows\nack will assume that C<ACK_PAGER> does not support color.\n\nC<ACK_PAGER_COLOR> overrides C<ACK_PAGER> if both are specified.\n\n=item ACK_PAGER_COLOR\n\nSpecifies a pager program that understands ANSI color sequences.\nUsing C<ACK_PAGER_COLOR> does not suppress grouping and coloring\nlike piping output on the command-line does.\n\nIf you are not on Windows, you never need to use C<ACK_PAGER_COLOR>.\n\n=back\n\n=head1 ACK & OTHER TOOLS\n\n=head2 Vim integration\n\nF<ack> integrates easily with the Vim text editor. Set this in your\nF<.vimrc> to use F<ack> instead of F<grep>:\n\n    set grepprg=ack\\ -a\n\nThat examples uses C<-a> to search through all files, but you may\nuse other default flags. Now you can search with F<ack> and easily\nstep through the results in Vim:\n\n  :grep Dumper perllib\n\n=head2 Emacs integration\n\nPhil Jackson put together an F<ack.el> extension that \"provides a\nsimple compilation mode ... has the ability to guess what files you\nwant to search for based on the major-mode.\"\n\nL<http://www.shellarchive.co.uk/content/emacs.html>\n\n=head2 TextMate integration\n\nPedro Melo is a TextMate user who writes \"I spend my day mostly\ninside TextMate, and the built-in find-in-project sucks with large\nprojects.  So I hacked a TextMate command that was using find +\ngrep to use ack.  The result is the Search in Project with ack, and\nyou can find it here:\nL<http://www.simplicidade.org/notes/archives/2008/03/search_in_proje.html>\"\n\n=head2 Shell and Return Code\n\nFor greater compatibility with I<grep>, I<ack> in normal use returns\nshell return or exit code of 0 only if something is found and 1 if\nno match is found.\n\n(Shell exit code 1 is C<$?=256> in perl with C<system> or backticks.)\n\nThe I<grep> code 2 for errors is not used.\n\nIf C<-f> or C<-g> are specified, then 0 is returned if at least one\nfile is found.  If no files are found, then 1 is returned.\n\n=cut\n\n=head1 DEBUGGING ACK PROBLEMS\n\nIf ack gives you output you're not expecting, start with a few simple steps.\n\n=head2 Use B<--noenv>\n\nYour environment variables and F<.ackrc> may be doing things you're\nnot expecting, or forgotten you specified.  Use B<--noenv> to ignore\nyour environment and F<.ackrc>.\n\n=head2 Use B<-f> to see what files you're scanning\n\nThe reason I created B<-f> in the first place was as a debugging\ntool.  If ack is not finding matches you think it should find, run\nF<ack -f> to see what files are being checked.\n\n=head1 TIPS\n\n=head2 Use the F<.ackrc> file.\n\nThe F<.ackrc> is the place to put all your options you use most of\nthe time but don't want to remember.  Put all your --type-add and\n--type-set definitions in it.  If you like --smart-case, set it\nthere, too.  I also set --sort-files there.\n\n=head2 Use F<-f> for working with big codesets\n\nAck does more than search files.  C<ack -f --perl> will create a\nlist of all the Perl files in a tree, ideal for sending into F<xargs>.\nFor example:\n\n    # Change all \"this\" to \"that\" in all Perl files in a tree.\n    ack -f --perl | xargs perl -p -i -e's/this/that/g'\n\nor if you prefer:\n\n    perl -p -i -e's/this/that/g' $(ack -f --perl)\n\n=head2 Use F<-Q> when in doubt about metacharacters\n\nIf you're searching for something with a regular expression\nmetacharacter, most often a period in a filename or IP address, add\nthe -Q to avoid false positives without all the backslashing.  See\nthe following example for more...\n\n=head2 Use ack to watch log files\n\nHere's one I used the other day to find trouble spots for a website\nvisitor.  The user had a problem loading F<troublesome.gif>, so I\ntook the access log and scanned it with ack twice.\n\n    ack -Q aa.bb.cc.dd /path/to/access.log | ack -Q -B5 troublesome.gif\n\nThe first ack finds only the lines in the Apache log for the given\nIP.  The second finds the match on my troublesome GIF, and shows\nthe previous five lines from the log in each case.\n\n=head2 Share your knowledge\n\nJoin the ack-users mailing list.  Send me your tips and I may add\nthem here.\n\n=head1 FAQ\n\n=head2 Why isn't ack finding a match in (some file)?\n\nProbably because it's of a type that ack doesn't recognize.  ack's\nsearching behavior is driven by filetype.  B<If ack doesn't know\nwhat kind of file it is, ack ignores the file.>\n\nUse the C<-f> switch to see a list of files that ack will search\nfor you.\n\nIf you want ack to search files that it doesn't recognize, use the\nC<-a> switch.\n\nIf you want ack to search every file, even ones that it always\nignores like coredumps and backup files, use the C<-u> switch.\n\n=head2 Why does ack ignore unknown files by default?\n\nack is designed by a programmer, for programmers, for searching\nlarge trees of code.  Most codebases have a lot files in them which\naren't source files (like compiled object files, source control\nmetadata, etc), and grep wastes a lot of time searching through all\nof those as well and returning matches from those files.\n\nThat's why ack's behavior of not searching things it doesn't recognize\nis one of its greatest strengths: the speed you get from only\nsearching the things that you want to be looking at.\n\n=head2 Wouldn't it be great if F<ack> did search & replace?\n\nNo, ack will always be read-only.  Perl has a perfectly good way\nto do search & replace in files, using the C<-i>, C<-p> and C<-n>\nswitches.\n\nYou can certainly use ack to select your files to update.  For\nexample, to change all \"foo\" to \"bar\" in all PHP files, you can do\nthis from the Unix shell:\n\n    $ perl -i -p -e's/foo/bar/g' $(ack -f --php)\n\n=head2 Can you make ack recognize F<.xyz> files?\n\nThat's an enhancement.  Please see the section in the manual about\nenhancements.\n\n=head2 There's already a program/package called ack.\n\nYes, I know.\n\n=head2 Why is it called ack if it's called ack-grep?\n\nThe name of the program is \"ack\".  Some packagers have called it\n\"ack-grep\" when creating packages because there's already a package\nout there called \"ack\" that has nothing to do with this ack.\n\nI suggest you make a symlink named F<ack> that points to F<ack-grep>\nbecause one of the crucial benefits of ack is having a name that's\nso short and simple to type.\n\nTo do that, run this with F<sudo> or as root:\n\n   ln -s /usr/bin/ack-grep /usr/bin/ack\n\n=head2 What does F<ack> mean?\n\nNothing.  I wanted a name that was easy to type and that you could\npronounce as a single syllable.\n\n=head2 Can I do multi-line regexes?\n\nNo, ack does not support regexes that match multiple lines.  Doing\nso would require reading in the entire file at a time.\n\nIf you want to see lines near your match, use the C<--A>, C<--B>\nand C<--C> switches for displaying context.\n\n=head1 AUTHOR\n\nAndy Lester, C<< <andy at petdance.com> >>\n\n=head1 BUGS\n\nPlease report any bugs or feature requests to the issues list at\nGithub: L<https://github.com/petdance/ack/issues>\n\n=head1 ENHANCEMENTS\n\nAll enhancement requests MUST first be posted to the ack-users\nmailing list at L<http://groups.google.com/group/ack-users>.  I\nwill not consider a request without it first getting seen by other\nack users.  This includes requests for new filetypes.\n\nThere is a list of enhancements I want to make to F<ack> in the ack\nissues list at Github: L<https://github.com/petdance/ack/issues>\n\nPatches are always welcome, but patches with tests get the most\nattention.\n\n=head1 SUPPORT\n\nSupport for and information about F<ack> can be found at:\n\n=over 4\n\n=item * The ack homepage\n\nL<http://betterthangrep.com/>\n\n=item * The ack-users mailing list\n\nL<http://groups.google.com/group/ack-users>\n\n=item * The ack issues list at Github\n\nL<https://github.com/petdance/ack/issues>\n\n=item * AnnoCPAN: Annotated CPAN documentation\n\nL<http://annocpan.org/dist/ack>\n\n=item * CPAN Ratings\n\nL<http://cpanratings.perl.org/d/ack>\n\n=item * Search CPAN\n\nL<http://search.cpan.org/dist/ack>\n\n=item * Git source repository\n\nL<https://github.com/petdance/ack>\n\n=back\n\n=head1 ACKNOWLEDGEMENTS\n\nHow appropriate to have I<ack>nowledgements!\n\nThanks to everyone who has contributed to ack in any way, including\nShlomi Fish,\nKaren Etheridge,\nOlivier Mengue,\nMatthew Wild,\nScott Kyle,\nNick Hooey,\nBo Borgerson,\nMark Szymanski,\nMarq Schneider,\nPacky Anderson,\nJR Boyens,\nDan Sully,\nRyan Niebur,\nKent Fredric,\nMike Morearty,\nIngmar Vanhassel,\nEric Van Dewoestine,\nSitaram Chamarty,\nAdam James,\nRichard Carlsson,\nPedro Melo,\nAJ Schuster,\nPhil Jackson,\nMichael Schwern,\nJan Dubois,\nChristopher J. Madsen,\nMatthew Wickline,\nDavid Dyck,\nJason Porritt,\nJjgod Jiang,\nThomas Klausner,\nUri Guttman,\nPeter Lewis,\nKevin Riggle,\nOri Avtalion,\nTorsten Blix,\nNigel Metheringham,\nGE<aacute>bor SzabE<oacute>,\nTod Hagan,\nMichael Hendricks,\nE<AElig>var ArnfjE<ouml>rE<eth> Bjarmason,\nPiers Cawley,\nStephen Steneker,\nElias Lutfallah,\nMark Leighton Fisher,\nMatt Diephouse,\nChristian Jaeger,\nBill Sully,\nBill Ricker,\nDavid Golden,\nNilson Santos F. Jr,\nElliot Shank,\nMerijn Broeren,\nUwe Voelker,\nRick Scott,\nAsk BjE<oslash>rn Hansen,\nJerry Gay,\nWill Coleda,\nMike O'Regan,\nSlaven ReziE<0x107>,\nMark Stosberg,\nDavid Alan Pisoni,\nAdriano Ferreira,\nJames Keenan,\nLeland Johnson,\nRicardo Signes\nand Pete Krawczyk.\n\n=head1 COPYRIGHT & LICENSE\n\nCopyright 2005-2012 Andy Lester.\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the Artistic License v2.0.\n\n=cut\npackage File::Next;\n\nuse strict;\nuse warnings;\n\n\nour $VERSION = '1.06';\n\n\n\nuse File::Spec ();\n\n\nour $name; # name of the current file\nour $dir;  # dir of the current file\n\nour %files_defaults;\nour %skip_dirs;\n\nBEGIN {\n    %files_defaults = (\n        file_filter     => undef,\n        descend_filter  => undef,\n        error_handler   => sub { CORE::die @_ },\n        sort_files      => undef,\n        follow_symlinks => 1,\n    );\n    %skip_dirs = map {($_,1)} (File::Spec->curdir, File::Spec->updir);\n}\n\n\nsub files {\n    ($_[0] eq __PACKAGE__) && die 'File::Next::files must not be invoked as File::Next->files';\n\n    my ($parms,@queue) = _setup( \\%files_defaults, @_ );\n    my $filter = $parms->{file_filter};\n\n    return sub {\n        while (@queue) {\n            my ($dir,$file,$fullpath) = splice( @queue, 0, 3 );\n            if ( -f $fullpath ) {\n                if ( $filter ) {\n                    local $_ = $file;\n                    local $File::Next::dir = $dir;\n                    local $File::Next::name = $fullpath;\n                    next if not $filter->();\n                }\n                return wantarray ? ($dir,$file,$fullpath) : $fullpath;\n            }\n            elsif ( -d _ ) {\n                unshift( @queue, _candidate_files( $parms, $fullpath ) );\n            }\n        } # while\n\n        return;\n    }; # iterator\n}\n\n\n\n\n\n\n\nsub sort_standard($$)   { return $_[0]->[1] cmp $_[1]->[1] }\nsub sort_reverse($$)    { return $_[1]->[1] cmp $_[0]->[1] }\n\nsub reslash {\n    my $path = shift;\n\n    my @parts = split( /\\//, $path );\n\n    return $path if @parts < 2;\n\n    return File::Spec->catfile( @parts );\n}\n\n\n\nsub _setup {\n    my $defaults = shift;\n    my $passed_parms = ref $_[0] eq 'HASH' ? {%{+shift}} : {}; # copy parm hash\n\n    my %passed_parms = %{$passed_parms};\n\n    my $parms = {};\n    for my $key ( keys %{$defaults} ) {\n        $parms->{$key} =\n            exists $passed_parms{$key}\n                ? delete $passed_parms{$key}\n                : $defaults->{$key};\n    }\n\n    # Any leftover keys are bogus\n    for my $badkey ( keys %passed_parms ) {\n        my $sub = (caller(1))[3];\n        $parms->{error_handler}->( \"Invalid option passed to $sub(): $badkey\" );\n    }\n\n    # If it's not a code ref, assume standard sort\n    if ( $parms->{sort_files} && ( ref($parms->{sort_files}) ne 'CODE' ) ) {\n        $parms->{sort_files} = \\&sort_standard;\n    }\n    my @queue;\n\n    for ( @_ ) {\n        my $start = reslash( $_ );\n        if (-d $start) {\n            push @queue, ($start,undef,$start);\n        }\n        else {\n            push @queue, (undef,$start,$start);\n        }\n    }\n\n    return ($parms,@queue);\n}\n\n\nsub _candidate_files {\n    my $parms = shift;\n    my $dir = shift;\n\n    my $dh;\n    if ( !opendir $dh, $dir ) {\n        $parms->{error_handler}->( \"$dir: $!\" );\n        return;\n    }\n\n    my @newfiles;\n    my $descend_filter = $parms->{descend_filter};\n    my $follow_symlinks = $parms->{follow_symlinks};\n    my $sort_sub = $parms->{sort_files};\n\n    for my $file ( grep { !exists $skip_dirs{$_} } readdir $dh ) {\n        my $has_stat;\n\n        # Only do directory checking if we have a descend_filter\n        my $fullpath = File::Spec->catdir( $dir, $file );\n        if ( !$follow_symlinks ) {\n            next if -l $fullpath;\n            $has_stat = 1;\n        }\n\n        if ( $descend_filter ) {\n            if ( $has_stat ? (-d _) : (-d $fullpath) ) {\n                local $File::Next::dir = $fullpath;\n                local $_ = $file;\n                next if not $descend_filter->();\n            }\n        }\n        if ( $sort_sub ) {\n            push( @newfiles, [ $dir, $file, $fullpath ] );\n        }\n        else {\n            push( @newfiles, $dir, $file, $fullpath );\n        }\n    }\n    closedir $dh;\n\n    if ( $sort_sub ) {\n        return map { @{$_} } sort $sort_sub @newfiles;\n    }\n\n    return @newfiles;\n}\n\n\n1; # End of File::Next\npackage App::Ack;\n\nuse warnings;\nuse strict;\n\n\n\n\nour $VERSION;\nour $COPYRIGHT;\nBEGIN {\n    $VERSION = '1.96';\n    $COPYRIGHT = 'Copyright 2005-2011 Andy Lester.';\n}\n\nour $fh;\n\nBEGIN {\n    $fh = *STDOUT;\n}\n\n\nour %types;\nour %type_wanted;\nour %mappings;\nour %ignore_dirs;\n\nour $input_from_pipe;\nour $output_to_pipe;\n\nour $dir_sep_chars;\nour $is_cygwin;\nour $is_windows;\n\nuse File::Spec ();\nuse File::Glob ':glob';\nuse Getopt::Long ();\n\nBEGIN {\n    %ignore_dirs = (\n        '.bzr'              => 'Bazaar',\n        '.cdv'              => 'Codeville',\n        '~.dep'             => 'Interface Builder',\n        '~.dot'             => 'Interface Builder',\n        '~.nib'             => 'Interface Builder',\n        '~.plst'            => 'Interface Builder',\n        '.git'              => 'Git',\n        '.hg'               => 'Mercurial',\n        '.pc'               => 'quilt',\n        '.svn'              => 'Subversion',\n        _MTN                => 'Monotone',\n        blib                => 'Perl module building',\n        CVS                 => 'CVS',\n        RCS                 => 'RCS',\n        SCCS                => 'SCCS',\n        _darcs              => 'darcs',\n        _sgbak              => 'Vault/Fortress',\n        'autom4te.cache'    => 'autoconf',\n        'cover_db'          => 'Devel::Cover',\n        _build              => 'Module::Build',\n    );\n\n    %mappings = (\n        actionscript => [qw( as mxml )],\n        ada         => [qw( ada adb ads )],\n        asm         => [qw( asm s )],\n        batch       => [qw( bat cmd )],\n        binary      => q{Binary files, as defined by Perl's -B op (default: off)},\n        cc          => [qw( c h xs )],\n        cfmx        => [qw( cfc cfm cfml )],\n        clojure     => [qw( clj )],\n        cpp         => [qw( cpp cc cxx m hpp hh h hxx )],\n        csharp      => [qw( cs )],\n        css         => [qw( css )],\n        delphi      => [qw( pas int dfm nfm dof dpk dproj groupproj bdsgroup bdsproj )],\n        elisp       => [qw( el )],\n        erlang      => [qw( erl hrl )],\n        fortran     => [qw( f f77 f90 f95 f03 for ftn fpp )],\n        go          => [qw( go )],\n        groovy      => [qw( groovy gtmpl gpp grunit )],\n        haskell     => [qw( hs lhs )],\n        hh          => [qw( h )],\n        html        => [qw( htm html shtml xhtml )],\n        java        => [qw( java properties )],\n        js          => [qw( js )],\n        jsp         => [qw( jsp jspx jhtm jhtml )],\n        lisp        => [qw( lisp lsp )],\n        lua         => [qw( lua )],\n        make        => q{Makefiles (including *.mk and *.mak)},\n        mason       => [qw( mas mhtml mpl mtxt )],\n        objc        => [qw( m h )],\n        objcpp      => [qw( mm h )],\n        ocaml       => [qw( ml mli )],\n        parrot      => [qw( pir pasm pmc ops pod pg tg )],\n        perl        => [qw( pl pm pm6 pod t psgi )],\n        php         => [qw( php phpt php3 php4 php5 phtml)],\n        plone       => [qw( pt cpt metadata cpy py )],\n        python      => [qw( py )],\n        rake        => q{Rakefiles},\n        ruby        => [qw( rb rhtml rjs rxml erb rake spec )],\n        scala       => [qw( scala )],\n        scheme      => [qw( scm ss )],\n        shell       => [qw( sh bash csh tcsh ksh zsh )],\n        skipped     => q{Files, but not directories, normally skipped by ack (default: off)},\n        smalltalk   => [qw( st )],\n        sql         => [qw( sql ctl )],\n        tcl         => [qw( tcl itcl itk )],\n        tex         => [qw( tex cls sty )],\n        text        => q{Text files, as defined by Perl's -T op (default: off)},\n        tt          => [qw( tt tt2 ttml )],\n        vb          => [qw( bas cls frm ctl vb resx )],\n        verilog     => [qw( v vh sv )],\n        vhdl        => [qw( vhd vhdl )],\n        vim         => [qw( vim )],\n        yaml        => [qw( yaml yml )],\n        xml         => [qw( xml dtd xsl xslt ent )],\n    );\n\n    while ( my ($type,$exts) = each %mappings ) {\n        if ( ref $exts ) {\n            for my $ext ( @{$exts} ) {\n                push( @{$types{$ext}}, $type );\n            }\n        }\n    }\n    # add manually Makefile extensions\n    push @{$types{$_}}, 'make' for qw{ mk mak };\n\n    # These have to be checked before any filehandle diddling.\n    $output_to_pipe  = not -t *STDOUT;\n    $input_from_pipe = -p STDIN;\n\n    $is_cygwin       = ($^O eq 'cygwin');\n    $is_windows      = ($^O =~ /MSWin32/);\n    $dir_sep_chars   = $is_windows ? quotemeta( '\\\\/' ) : quotemeta( File::Spec->catfile( '', '' ) );\n}\n\n\nsub read_ackrc {\n    my @files = ( $ENV{ACKRC} );\n    my @dirs =\n        $is_windows\n            ? ( $ENV{HOME}, $ENV{USERPROFILE} )\n            : ( '~', $ENV{HOME} );\n    for my $dir ( grep { defined } @dirs ) {\n        for my $file ( '.ackrc', '_ackrc' ) {\n            push( @files, bsd_glob( \"$dir/$file\", GLOB_TILDE ) );\n        }\n    }\n    for my $filename ( @files ) {\n        if ( defined $filename && -e $filename ) {\n            open( my $fh, '<', $filename ) or App::Ack::die( \"$filename: $!\\n\" );\n            my @lines = grep { /./ && !/^\\s*#/ } <$fh>;\n            chomp @lines;\n            close $fh or App::Ack::die( \"$filename: $!\\n\" );\n\n            # get rid of leading and trailing whitespaces\n            for ( @lines ) {\n               s/^\\s+//;\n               s/\\s+$//;\n            }\n\n            return @lines;\n        }\n    }\n\n    return;\n}\n\n\nsub get_command_line_options {\n    my %opt = (\n        pager => $ENV{ACK_PAGER_COLOR} || $ENV{ACK_PAGER},\n    );\n\n    my $getopt_specs = {\n        1                       => sub { $opt{1} = $opt{m} = 1 },\n        'A|after-context=i'     => \\$opt{after_context},\n        'B|before-context=i'    => \\$opt{before_context},\n        'C|context:i'           => sub { shift; my $val = shift; $opt{before_context} = $opt{after_context} = ($val || 2) },\n        'a|all-types'           => \\$opt{all},\n        'break!'                => \\$opt{break},\n        c                       => \\$opt{count},\n        'color|colour!'         => \\$opt{color},\n        'color-match=s'         => \\$ENV{ACK_COLOR_MATCH},\n        'color-filename=s'      => \\$ENV{ACK_COLOR_FILENAME},\n        'color-lineno=s'        => \\$ENV{ACK_COLOR_LINENO},\n        'column!'               => \\$opt{column},\n        count                   => \\$opt{count},\n        'env!'                  => sub { }, # ignore this option, it is handled beforehand\n        f                       => \\$opt{f},\n        flush                   => \\$opt{flush},\n        'follow!'               => \\$opt{follow},\n        'g=s'                   => sub { shift; $opt{G} = shift; $opt{f} = 1 },\n        'G=s'                   => \\$opt{G},\n        'group!'                => sub { shift; $opt{heading} = $opt{break} = shift },\n        'heading!'              => \\$opt{heading},\n        'h|no-filename'         => \\$opt{h},\n        'H|with-filename'       => \\$opt{H},\n        'i|ignore-case'         => \\$opt{i},\n        'invert-file-match'     => \\$opt{invert_file_match},\n        'lines=s'               => sub { shift; my $val = shift; push @{$opt{lines}}, $val },\n        'l|files-with-matches'  => \\$opt{l},\n        'L|files-without-matches' => sub { $opt{l} = $opt{v} = 1 },\n        'm|max-count=i'         => \\$opt{m},\n        'match=s'               => \\$opt{regex},\n        'n|no-recurse'          => \\$opt{n},\n        o                       => sub { $opt{output} = '$&' },\n        'output=s'              => \\$opt{output},\n        'pager=s'               => \\$opt{pager},\n        'nopager'               => sub { $opt{pager} = undef },\n        'passthru'              => \\$opt{passthru},\n        'print0'                => \\$opt{print0},\n        'Q|literal'             => \\$opt{Q},\n        'r|R|recurse'           => sub { $opt{n} = 0 },\n        'show-types'            => \\$opt{show_types},\n        'smart-case!'           => \\$opt{smart_case},\n        'sort-files'            => \\$opt{sort_files},\n        'u|unrestricted'        => \\$opt{u},\n        'v|invert-match'        => \\$opt{v},\n        'w|word-regexp'         => \\$opt{w},\n\n        'ignore-dirs=s'         => sub { shift; my $dir = remove_dir_sep( shift ); $ignore_dirs{$dir} = '--ignore-dirs' },\n        'noignore-dirs=s'       => sub { shift; my $dir = remove_dir_sep( shift ); delete $ignore_dirs{$dir} },\n\n        'version'   => sub { print_version_statement(); exit; },\n        'help|?:s'  => sub { shift; show_help(@_); exit; },\n        'help-types'=> sub { show_help_types(); exit; },\n        'man'       => sub {\n            require Pod::Usage;\n            Pod::Usage::pod2usage({\n                -verbose => 2,\n                -exitval => 0,\n            });\n        },\n\n        'type=s'    => sub {\n            # Whatever --type=xxx they specify, set it manually in the hash\n            my $dummy = shift;\n            my $type = shift;\n            my $wanted = ($type =~ s/^no//) ? 0 : 1; # must not be undef later\n\n            if ( exists $type_wanted{ $type } ) {\n                $type_wanted{ $type } = $wanted;\n            }\n            else {\n                App::Ack::die( qq{Unknown --type \"$type\"} );\n            }\n        }, # type sub\n    };\n\n    # Stick any default switches at the beginning, so they can be overridden\n    # by the command line switches.\n    unshift @ARGV, split( ' ', $ENV{ACK_OPTIONS} ) if defined $ENV{ACK_OPTIONS};\n\n    # first pass through options, looking for type definitions\n    def_types_from_ARGV();\n\n    for my $i ( filetypes_supported() ) {\n        $getopt_specs->{ \"$i!\" } = \\$type_wanted{ $i };\n    }\n\n\n    my $parser = Getopt::Long::Parser->new();\n    $parser->configure( 'bundling', 'no_ignore_case', );\n    $parser->getoptions( %{$getopt_specs} ) or\n        App::Ack::die( 'See ack --help, ack --help-types or ack --man for options.' );\n\n    my $to_screen = not output_to_pipe();\n    my %defaults = (\n        all            => 0,\n        color          => $to_screen,\n        follow         => 0,\n        break          => $to_screen,\n        heading        => $to_screen,\n        before_context => 0,\n        after_context  => 0,\n    );\n    if ( $is_windows && $defaults{color} && not $ENV{ACK_PAGER_COLOR} ) {\n        if ( $ENV{ACK_PAGER} || not eval { require Win32::Console::ANSI } ) {\n            $defaults{color} = 0;\n        }\n    }\n    if ( $to_screen && $ENV{ACK_PAGER_COLOR} ) {\n        $defaults{color} = 1;\n    }\n\n    while ( my ($key,$value) = each %defaults ) {\n        if ( not defined $opt{$key} ) {\n            $opt{$key} = $value;\n        }\n    }\n\n    if ( defined $opt{m} && $opt{m} <= 0 ) {\n        App::Ack::die( '-m must be greater than zero' );\n    }\n\n    for ( qw( before_context after_context ) ) {\n        if ( defined $opt{$_} && $opt{$_} < 0 ) {\n            App::Ack::die( \"--$_ may not be negative\" );\n        }\n    }\n\n    if ( defined( my $val = $opt{output} ) ) {\n        $opt{output} = eval qq[ sub { \"$val\" } ];\n    }\n    if ( defined( my $l = $opt{lines} ) ) {\n        # --line=1 --line=5 is equivalent to --line=1,5\n        my @lines = split( /,/, join( ',', @{$l} ) );\n\n        # --line=1-3 is equivalent to --line=1,2,3\n        @lines = map {\n            my @ret;\n            if ( /-/ ) {\n                my ($from, $to) = split /-/, $_;\n                if ( $from > $to ) {\n                    App::Ack::warn( \"ignoring --line=$from-$to\" );\n                    @ret = ();\n                }\n                else {\n                    @ret = ( $from .. $to );\n                }\n            }\n            else {\n                @ret = ( $_ );\n            };\n            @ret\n        } @lines;\n\n        if ( @lines ) {\n            my %uniq;\n            @uniq{ @lines } = ();\n            $opt{lines} = [ sort { $a <=> $b } keys %uniq ];   # numerical sort and each line occurs only once!\n        }\n        else {\n            # happens if there are only ignored --line directives\n            App::Ack::die( 'All --line options are invalid.' );\n        }\n    }\n\n    return \\%opt;\n}\n\n\nsub def_types_from_ARGV {\n    my @typedef;\n\n    my $parser = Getopt::Long::Parser->new();\n        # pass_through   => leave unrecognized command line arguments alone\n        # no_auto_abbrev => otherwise -c is expanded and not left alone\n    $parser->configure( 'no_ignore_case', 'pass_through', 'no_auto_abbrev' );\n    $parser->getoptions(\n        'type-set=s' => sub { shift; push @typedef, ['c', shift] },\n        'type-add=s' => sub { shift; push @typedef, ['a', shift] },\n    ) or App::Ack::die( 'See ack --help or ack --man for options.' );\n\n    for my $td (@typedef) {\n        my ($type, $ext) = split /=/, $td->[1];\n\n        if ( $td->[0] eq 'c' ) {\n            # type-set\n            if ( exists $mappings{$type} ) {\n                # can't redefine types 'make', 'skipped', 'text' and 'binary'\n                App::Ack::die( qq{--type-set: Builtin type \"$type\" cannot be changed.} )\n                    if ref $mappings{$type} ne 'ARRAY';\n\n                delete_type($type);\n            }\n        }\n        else {\n            # type-add\n\n            # can't append to types 'make', 'skipped', 'text' and 'binary'\n            App::Ack::die( qq{--type-add: Builtin type \"$type\" cannot be changed.} )\n                if exists $mappings{$type} && ref $mappings{$type} ne 'ARRAY';\n\n            App::Ack::warn( qq{--type-add: Type \"$type\" does not exist, creating with \"$ext\" ...} )\n                unless exists $mappings{$type};\n        }\n\n        my @exts = split /,/, $ext;\n        s/^\\.// for @exts;\n\n        if ( !exists $mappings{$type} || ref($mappings{$type}) eq 'ARRAY' ) {\n            push @{$mappings{$type}}, @exts;\n            for my $e ( @exts ) {\n                push @{$types{$e}}, $type;\n            }\n        }\n        else {\n            App::Ack::die( qq{Cannot append to type \"$type\".} );\n        }\n    }\n\n    return;\n}\n\n\nsub delete_type {\n    my $type = shift;\n\n    App::Ack::die( qq{Internal error: Cannot delete builtin type \"$type\".} )\n        unless ref $mappings{$type} eq 'ARRAY';\n\n    delete $mappings{$type};\n    delete $type_wanted{$type};\n    for my $ext ( keys %types ) {\n        $types{$ext} = [ grep { $_ ne $type } @{$types{$ext}} ];\n    }\n}\n\n\nsub ignoredir_filter {\n    return !exists $ignore_dirs{$_} && !exists $ignore_dirs{$File::Next::dir};\n}\n\n\nsub remove_dir_sep {\n    my $path = shift;\n    $path =~ s/[$dir_sep_chars]$//;\n\n    return $path;\n}\n\n\nuse constant TEXT => 'text';\n\nsub filetypes {\n    my $filename = shift;\n\n    my $basename = $filename;\n    $basename =~ s{.*[$dir_sep_chars]}{};\n\n    return 'skipped' unless is_searchable( $basename );\n\n    my $lc_basename = lc $basename;\n    return ('make',TEXT)        if $lc_basename eq 'makefile' || $lc_basename eq 'gnumakefile';\n    return ('rake','ruby',TEXT) if $lc_basename eq 'rakefile';\n\n    # If there's an extension, look it up\n    if ( $filename =~ m{\\.([^\\.$dir_sep_chars]+)$}o ) {\n        my $ref = $types{lc $1};\n        return (@{$ref},TEXT) if $ref;\n    }\n\n    # At this point, we can't tell from just the name.  Now we have to\n    # open it and look inside.\n\n    return unless -e $filename;\n    # From Elliot Shank:\n    #     I can't see any reason that -r would fail on these-- the ACLs look\n    #     fine, and no program has any of them open, so the busted Windows\n    #     file locking model isn't getting in there.  If I comment the if\n    #     statement out, everything works fine\n    # So, for cygwin, don't bother trying to check for readability.\n    if ( !$is_cygwin ) {\n        if ( !-r $filename ) {\n            App::Ack::warn( \"$filename: Permission denied\" );\n            return;\n        }\n    }\n\n    return 'binary' if -B $filename;\n\n    # If there's no extension, or we don't recognize it, check the shebang line\n    my $fh;\n    if ( !open( $fh, '<', $filename ) ) {\n        App::Ack::warn( \"$filename: $!\" );\n        return;\n    }\n    my $header = <$fh>;\n    close $fh;\n\n    if ( $header =~ /^#!/ ) {\n        return ($1,TEXT)       if $header =~ /\\b(ruby|lua|p(?:erl|hp|ython))-?(\\d[\\d.]*)?\\b/;\n        return ('shell',TEXT)  if $header =~ /\\b(?:ba|t?c|k|z)?sh\\b/;\n    }\n    else {\n        return ('xml',TEXT)    if $header =~ /\\Q<?xml /i;\n    }\n\n    return (TEXT);\n}\n\n\nsub is_searchable {\n    my $filename = shift;\n\n    # If these are updated, update the --help message\n    return if $filename =~ /[.]bak$/;\n    return if $filename =~ /~$/;\n    return if $filename =~ m{^#.*#$}o;\n    return if $filename =~ m{^core\\.\\d+$}o;\n    return if $filename =~ m{[._].*\\.swp$}o;\n    return if $filename =~ /[.-]min\\.js$/;\n\n    return 1;\n}\n\n\nsub build_regex {\n    my $str = shift;\n    my $opt = shift;\n\n    defined $str or App::Ack::die( 'No regular expression found.' );\n\n    $str = quotemeta( $str ) if $opt->{Q};\n    if ( $opt->{w} ) {\n        $str = \"\\\\b$str\" if $str =~ /^\\w/;\n        $str = \"$str\\\\b\" if $str =~ /\\w$/;\n    }\n\n    my $regex_is_lc = $str eq lc $str;\n    if ( $opt->{i} || ($opt->{smart_case} && $regex_is_lc) ) {\n        $str = \"(?i)$str\";\n    }\n\n    return $str;\n}\n\n\nsub check_regex {\n    my $regex = shift;\n\n    return unless defined $regex;\n\n    eval { qr/$regex/ };\n    if ($@) {\n        (my $error = $@) =~ s/ at \\S+ line \\d+.*//;\n        chomp($error);\n        App::Ack::die( \"Invalid regex '$regex':\\n  $error\" );\n    }\n\n    return;\n}\n\n\n\n\nsub warn {\n    return CORE::warn( _my_program(), ': ', @_, \"\\n\" );\n}\n\n\nsub die {\n    return CORE::die( _my_program(), ': ', @_, \"\\n\" );\n}\n\nsub _my_program {\n    require File::Basename;\n    return File::Basename::basename( $0 );\n}\n\n\n\nsub filetypes_supported {\n    return keys %mappings;\n}\n\nsub _get_thpppt {\n    my $y = q{_   /|,\\\\'!.x',=(www)=,   U   };\n    $y =~ tr/,x!w/\\nOo_/;\n    return $y;\n}\n\nsub _thpppt {\n    my $y = _get_thpppt();\n    App::Ack::print( \"$y ack $_[0]!\\n\" );\n    exit 0;\n}\n\nsub _bar {\n    my $x;\n    $x = <<'_BAR';\n 6?!I'7!I\"?%+!\n 3~!I#7#I\"7#I!?!+!=\"+\"=\"+!:!\n 2?#I!7!I!?#I!7!I\"+\"=%+\"=#\n 1?\"+!?*+!=#~\"=!+#?\"=\"+!\n 0?\"+!?\"I\"?&+!=\"~!=!~\"=!+%=\"+\"\n /I!+!?)+!?!+!=$~!=!~!=\"+!=\"+\"?!=\"?!\n .?%I\"?%+%='?!=#~$=\"\n ,,!?%I\"?(+$=$~!=#:\"~$:!~!\n ,I!?!I!?\"I\"?!+#?\"+!?!+#=\"~$:!~!:!~!:!,!:!,\":#~!\n +I!?&+!=\"+!?#+$=!~\":!~!:!~!:!,!:#,!:!,%:\"\n *+!I!?!+$=!+!=!+!?$+#=!~\":!~\":#,$:\",#:!,!:!\n *I!?\"+!?!+!=$+!?#+#=#~\":$,!:\",!:!,&:\"\n )I!?$=!~!=#+\"?!+!=!+!=!~!=\"~!:!~\":!,'.!,%:!~!\n (=!?\"+!?!=!~$?\"+!?!+!=#~\"=\",!=\"~$,$.\",#.!:!=!\n (I\"+\"=\"~\"=!+&=!~\"=!~!,!~!+!=!?!+!?!=!I!?!+\"=!.\",!.!,\":!\n %I$?!+!?!=%+!~!+#~!=!~#:#=!~!+!~!=#:!,%.!,!.!:\"\n $I!?!=!?!I!+!?\"+!=!~!=!~!?!I!?!=!+!=!~#:\",!~\"=!~!:\"~!=!:\",&:\" '-/\n $?!+!I!?\"+\"=!+\"~!,!:\"+#~#:#,\"=!~\"=!,!~!,!.\",!:\".!:! */! !I!t!'!s! !a! !g!r!e!p!!! !/!\n $+\"=!+!?!+\"~!=!:!~!:\"I!+!,!~!=!:!~!,!:!,$:!~\".&:\"~!,# (-/\n %~!=!~!=!:!.!+\"~!:!,!.!,!~!=!:$.!,\":!,!.!:!~!,!:!=!.#=\"~!,!:\" ./!\n %=!~!?!+\"?\"+!=!~\",!.!:!?!~!.!:!,!:!,#.!,!:\",\"~!:!=!~!=!:\",!~! ./!\n %+\"~\":!~!=#~!:!~!,!.!~!:\",!~!=!~!.!:!,!.\",!:!,\":!=\":!.!,!:!7! -/!\n %~\",!:\".#:!=!:!,!:\"+!:!~!:!.!,!~!,!.#,!.!,$:\"~!,\":\"~!=! */!\n &=!~!=#+!=!~\",!.!:\",#:#,!.\",+:!,!.\",!=!+!?!\n &~!=!~!=!~!:\"~#:\",!.!,#~!:!.!+!,!.\",$.\",$.#,!+!I!?!\n &~!=\"~!:!~\":!~\",!~!=!~\":!,!:!~!,!:!,&.$,#.\"+!?!I!?!I!\n &~!=!~!=!+!,!:!~!:!=!,!:!~&:$,!.!,\".!,\".!,#.\"~!+!?$I!\n &~!=!~!=\"~!=!:!~\":!,!~%:#,!:\",!.!,#.\",#I!7\"I!?!+!?\"I\"\n &+!I!7!:#~\"=!~!:!,!:\"~$.!=!.!,!~!,$.#,!~!7!I#?!+!?\"I\"7!\n %7#?!+!~!:!=!~!=!~\":!,!:\"~\":#.!,)7#I\"?\"I!7&\n %7#I!=\":!=!~!:\"~$:\"~!:#,!:!,!:!~!:#,!7#I!?#7)\n $7$+!,!~!=#~!:!~!:!~$:#,!.!~!:!=!,\":!7#I\"?#7+=!?!\n $7#I!~!,!~#=!~!:\"~!:!,!:!,#:!=!~\",\":!7$I!?#I!7*+!=!+\"\n \"I!7$I!,\":!,!.!=\":$,!:!,$:$7$I!+!?\"I!7+?\"I!7!I!7!,!\n !,!7%I!:\",!.\"~\":!,&.!,!:!~!I!7$I!+!?\"I!7,?!I!7',!\n !7(,!.#~\":!,%.!,!7%I!7!?#I\"7,+!?!7*\n7+:!,!~#,\"=!7'I!?#I\"7/+!7+\n77I!+!7!?!7!I\"71+!7,\n_BAR\n\n    $x =~ s/(.)(.)/$1x(ord($2)-32)/eg;\n    App::Ack::print( $x );\n    exit 0;\n}\n\nsub _key {\n    my $str = lc shift;\n    $str =~ s/[^a-z]//g;\n\n    return $str;\n}\n\n\nsub show_help {\n    my $help_arg = shift || 0;\n\n    return show_help_types() if $help_arg =~ /^types?/;\n\n    my $ignore_dirs = _listify( sort { _key($a) cmp _key($b) } keys %ignore_dirs );\n\n    App::Ack::print( <<\"END_OF_HELP\" );\nUsage: ack [OPTION]... PATTERN [FILE]\n\nSearch for PATTERN in each source file in the tree from cwd on down.\nIf [FILES] is specified, then only those files/directories are checked.\nack may also search STDIN, but only if no FILE are specified, or if\none of FILES is \"-\".\n\nDefault switches may be specified in ACK_OPTIONS environment variable or\nan .ackrc file. If you want no dependency on the environment, turn it\noff with --noenv.\n\nExample: ack -i select\n\nSearching:\n  -i, --ignore-case     Ignore case distinctions in PATTERN\n  --[no]smart-case      Ignore case distinctions in PATTERN,\n                        only if PATTERN contains no upper case\n                        Ignored if -i is specified\n  -v, --invert-match    Invert match: select non-matching lines\n  -w, --word-regexp     Force PATTERN to match only whole words\n  -Q, --literal         Quote all metacharacters; PATTERN is literal\n\nSearch output:\n  --line=NUM            Only print line(s) NUM of each file\n  -l, --files-with-matches\n                        Only print filenames containing matches\n  -L, --files-without-matches\n                        Only print filenames with no matches\n  -o                    Show only the part of a line matching PATTERN\n                        (turns off text highlighting)\n  --passthru            Print all lines, whether matching or not\n  --output=expr         Output the evaluation of expr for each line\n                        (turns off text highlighting)\n  --match PATTERN       Specify PATTERN explicitly.\n  -m, --max-count=NUM   Stop searching in each file after NUM matches\n  -1                    Stop searching after one match of any kind\n  -H, --with-filename   Print the filename for each match\n  -h, --no-filename     Suppress the prefixing filename on output\n  -c, --count           Show number of lines matching per file\n  --column              Show the column number of the first match\n\n  -A NUM, --after-context=NUM\n                        Print NUM lines of trailing context after matching\n                        lines.\n  -B NUM, --before-context=NUM\n                        Print NUM lines of leading context before matching\n                        lines.\n  -C [NUM], --context[=NUM]\n                        Print NUM lines (default 2) of output context.\n\n  --print0              Print null byte as separator between filenames,\n                        only works with -f, -g, -l, -L or -c.\n\nFile presentation:\n  --pager=COMMAND       Pipes all ack output through COMMAND.  For example,\n                        --pager=\"less -R\".  Ignored if output is redirected.\n  --nopager             Do not send output through a pager.  Cancels any\n                        setting in ~/.ackrc, ACK_PAGER or ACK_PAGER_COLOR.\n  --[no]heading         Print a filename heading above each file's results.\n                        (default: on when used interactively)\n  --[no]break           Print a break between results from different files.\n                        (default: on when used interactively)\n  --group               Same as --heading --break\n  --nogroup             Same as --noheading --nobreak\n  --[no]color           Highlight the matching text (default: on unless\n                        output is redirected, or on Windows)\n  --[no]colour          Same as --[no]color\n  --color-filename=COLOR\n  --color-match=COLOR\n  --color-lineno=COLOR  Set the color for filenames, matches, and line numbers.\n  --flush               Flush output immediately, even when ack is used\n                        non-interactively (when output goes to a pipe or\n                        file).\n\nFile finding:\n  -f                    Only print the files found, without searching.\n                        The PATTERN must not be specified.\n  -g REGEX              Same as -f, but only print files matching REGEX.\n  --sort-files          Sort the found files lexically.\n  --invert-file-match   Print/search handle files that do not match -g/-G.\n  --show-types          Show which types each file has.\n\nFile inclusion/exclusion:\n  -a, --all-types       All file types searched;\n                        Ignores CVS, .svn and other ignored directories\n  -u, --unrestricted    All files and directories searched\n  --[no]ignore-dir=name Add/Remove directory from the list of ignored dirs\n  -r, -R, --recurse     Recurse into subdirectories (ack's default behavior)\n  -n, --no-recurse      No descending into subdirectories\n  -G REGEX              Only search files that match REGEX\n\n  --perl                Include only Perl files.\n  --type=perl           Include only Perl files.\n  --noperl              Exclude Perl files.\n  --type=noperl         Exclude Perl files.\n                        See \"ack --help type\" for supported filetypes.\n\n  --type-set TYPE=.EXTENSION[,.EXT2[,...]]\n                        Files with the given EXTENSION(s) are recognized as\n                        being of type TYPE. This replaces an existing\n                        definition for type TYPE.\n  --type-add TYPE=.EXTENSION[,.EXT2[,...]]\n                        Files with the given EXTENSION(s) are recognized as\n                        being of (the existing) type TYPE\n\n  --[no]follow          Follow symlinks.  Default is off.\n\n  Directories ignored by default:\n    $ignore_dirs\n\n  Files not checked for type:\n    /~\\$/            - Unix backup files\n    /#.+#\\$/         - Emacs swap files\n    /[._].*\\\\.swp\\$/ - Vi(m) swap files\n    /core\\\\.\\\\d+\\$/  - core dumps\n    /[.-]min\\\\.js\\$/  - Minified javascript files\n\nMiscellaneous:\n  --noenv               Ignore environment variables and ~/.ackrc\n  --help                This help\n  --man                 Man page\n  --version             Display version & copyright\n  --thpppt              Bill the Cat\n  --bar                 The warning admiral\n\nExit status is 0 if match, 1 if no match.\n\nThis is version $VERSION of ack.\nEND_OF_HELP\n\n    return;\n }\n\n\n\nsub show_help_types {\n    App::Ack::print( <<'END_OF_HELP' );\nUsage: ack [OPTION]... PATTERN [FILES]\n\nThe following is the list of filetypes supported by ack.  You can\nspecify a file type with the --type=TYPE format, or the --TYPE\nformat.  For example, both --type=perl and --perl work.\n\nNote that some extensions may appear in multiple types.  For example,\n.pod files are both Perl and Parrot.\n\nEND_OF_HELP\n\n    my @types = filetypes_supported();\n    my $maxlen = 0;\n    for ( @types ) {\n        $maxlen = length if $maxlen < length;\n    }\n    for my $type ( sort @types ) {\n        next if $type =~ /^-/; # Stuff to not show\n        my $ext_list = $mappings{$type};\n\n        if ( ref $ext_list ) {\n            $ext_list = join( ' ', map { \".$_\" } @{$ext_list} );\n        }\n        App::Ack::print( sprintf( \"    --[no]%-*.*s %s\\n\", $maxlen, $maxlen, $type, $ext_list ) );\n    }\n\n    return;\n}\n\nsub _listify {\n    my @whats = @_;\n\n    return '' if !@whats;\n\n    my $end = pop @whats;\n    my $str = @whats ? join( ', ', @whats ) . \" and $end\" : $end;\n\n    no warnings 'once';\n    require Text::Wrap;\n    $Text::Wrap::columns = 75;\n    return Text::Wrap::wrap( '', '    ', $str );\n}\n\n\nsub get_version_statement {\n    require Config;\n\n    my $copyright = get_copyright();\n    my $this_perl = $Config::Config{perlpath};\n    if ($^O ne 'VMS') {\n        my $ext = $Config::Config{_exe};\n        $this_perl .= $ext unless $this_perl =~ m/$ext$/i;\n    }\n    my $ver = sprintf( '%vd', $^V );\n\n    return <<\"END_OF_VERSION\";\nack $VERSION\nRunning under Perl $ver at $this_perl\n\n$copyright\n\nThis program is free software.  You may modify or distribute it\nunder the terms of the Artistic License v2.0.\nEND_OF_VERSION\n}\n\n\nsub print_version_statement {\n    App::Ack::print( get_version_statement() );\n\n    return;\n}\n\n\nsub get_copyright {\n    return $COPYRIGHT;\n}\n\n\nsub load_colors {\n    eval 'use Term::ANSIColor ()';\n\n    $ENV{ACK_COLOR_MATCH}    ||= 'black on_yellow';\n    $ENV{ACK_COLOR_FILENAME} ||= 'bold green';\n    $ENV{ACK_COLOR_LINENO}   ||= 'bold yellow';\n\n    return;\n}\n\n\nsub is_interesting {\n    return if /^\\./;\n\n    my $include;\n\n    for my $type ( filetypes( $File::Next::name ) ) {\n        if ( defined $type_wanted{$type} ) {\n            if ( $type_wanted{$type} ) {\n                $include = 1;\n            }\n            else {\n                return;\n            }\n        }\n    }\n\n    return $include;\n}\n\n\n\n# print subs added in order to make it easy for a third party\n# module (such as App::Wack) to redefine the display methods\n# and show the results in a different way.\nsub print                   { print {$fh} @_ }\nsub print_first_filename    { App::Ack::print( $_[0], \"\\n\" ) }\nsub print_blank_line        { App::Ack::print( \"\\n\" ) }\nsub print_separator         { App::Ack::print( \"--\\n\" ) }\nsub print_filename          { App::Ack::print( $_[0], $_[1] ) }\nsub print_line_no           { App::Ack::print( $_[0], $_[1] ) }\nsub print_column_no         { App::Ack::print( $_[0], $_[1] ) }\nsub print_count {\n    my $filename = shift;\n    my $nmatches = shift;\n    my $ors = shift;\n    my $count = shift;\n    my $show_filename = shift;\n\n    if ($show_filename) {\n        App::Ack::print( $filename );\n        App::Ack::print( ':', $nmatches ) if $count;\n    }\n    else {\n        App::Ack::print( $nmatches ) if $count;\n    }\n    App::Ack::print( $ors );\n}\n\nsub print_count0 {\n    my $filename = shift;\n    my $ors = shift;\n    my $show_filename = shift;\n\n    if ($show_filename) {\n        App::Ack::print( $filename, ':0', $ors );\n    }\n    else {\n        App::Ack::print( '0', $ors );\n    }\n}\n\n\n\n{\n    my $filename;\n    my $regex;\n    my $display_filename;\n\n    my $keep_context;\n\n    my $last_output_line;             # number of the last line that has been output\n    my $any_output;                   # has there been any output for the current file yet\n    my $context_overall_output_count; # has there been any output at all\n\nsub search_resource {\n    my $res = shift;\n    my $opt = shift;\n\n    $filename = $res->name();\n\n    my $v = $opt->{v};\n    my $passthru = $opt->{passthru};\n    my $max = $opt->{m};\n    my $nmatches = 0;\n\n    $display_filename = undef;\n\n    # for --line processing\n    my $has_lines = 0;\n    my @lines;\n    if ( defined $opt->{lines} ) {\n        $has_lines = 1;\n        @lines = ( @{$opt->{lines}}, -1 );\n        undef $regex; # Don't match when printing matching line\n    }\n    else {\n        $regex = qr/$opt->{regex}/;\n    }\n\n    # for context processing\n    $last_output_line = -1;\n    $any_output = 0;\n    my $before_context = $opt->{before_context};\n    my $after_context  = $opt->{after_context};\n\n    $keep_context = ($before_context || $after_context) && !$passthru;\n\n    my @before;\n    my $before_starts_at_line;\n    my $after = 0; # number of lines still to print after a match\n\n    while ( $res->next_text ) {\n        # XXX Optimize away the case when there are no more @lines to find.\n        # XXX $has_lines, $passthru and $v never change.  Optimize.\n        if ( $has_lines\n               ? $. != $lines[0]  # $lines[0] should be a scalar\n               : $v ? m/$regex/ : !m/$regex/ ) {\n            if ( $passthru ) {\n                App::Ack::print( $_ );\n                next;\n            }\n\n            if ( $keep_context ) {\n                if ( $after ) {\n                    print_match_or_context( $opt, 0, $., $-[0], $+[0], $_ );\n                    $after--;\n                }\n                elsif ( $before_context ) {\n                    if ( @before ) {\n                        if ( @before >= $before_context ) {\n                            shift @before;\n                            ++$before_starts_at_line;\n                        }\n                    }\n                    else {\n                        $before_starts_at_line = $.;\n                    }\n                    push @before, $_;\n                }\n                last if $max && ( $nmatches >= $max ) && !$after;\n            }\n            next;\n        } # not a match\n\n        ++$nmatches;\n\n        # print an empty line as a divider before first line in each file (not before the first file)\n        if ( !$any_output && $opt->{show_filename} && $opt->{break} && defined( $context_overall_output_count ) ) {\n            App::Ack::print_blank_line();\n        }\n\n        shift @lines if $has_lines;\n\n        if ( $res->is_binary ) {\n            App::Ack::print( \"Binary file $filename matches\\n\" );\n            last;\n        }\n        if ( $keep_context ) {\n            if ( @before ) {\n                print_match_or_context( $opt, 0, $before_starts_at_line, $-[0], $+[0], @before );\n                @before = ();\n                $before_starts_at_line = 0;\n            }\n            if ( $max && $nmatches > $max ) {\n                --$after;\n            }\n            else {\n                $after = $after_context;\n            }\n        }\n        print_match_or_context( $opt, 1, $., $-[0], $+[0], $_ );\n\n        last if $max && ( $nmatches >= $max ) && !$after;\n    } # while\n\n    return $nmatches;\n}   # search_resource()\n\n\n\nsub print_match_or_context {\n    my $opt         = shift; # opts array\n    my $is_match    = shift; # is there a match on the line?\n    my $line_no     = shift;\n    my $match_start = shift;\n    my $match_end   = shift;\n\n    my $color         = $opt->{color};\n    my $heading       = $opt->{heading};\n    my $show_filename = $opt->{show_filename};\n    my $show_column   = $opt->{column};\n\n    if ( $show_filename ) {\n        if ( not defined $display_filename ) {\n            $display_filename =\n                $color\n                    ? Term::ANSIColor::colored( $filename, $ENV{ACK_COLOR_FILENAME} )\n                    : $filename;\n            if ( $heading && !$any_output ) {\n                App::Ack::print_first_filename($display_filename);\n            }\n        }\n    }\n\n    my $sep = $is_match ? ':' : '-';\n    my $output_func = $opt->{output};\n    for ( @_ ) {\n        if ( $keep_context && !$output_func ) {\n            if ( ( $last_output_line != $line_no - 1 ) &&\n                ( $any_output || ( !$heading && defined( $context_overall_output_count ) ) ) ) {\n                App::Ack::print_separator();\n            }\n            # to ensure separators between different files when --noheading\n\n            $last_output_line = $line_no;\n        }\n\n        if ( $show_filename ) {\n            App::Ack::print_filename($display_filename, $sep) if not $heading;\n            my $display_line_no =\n                $color\n                    ? Term::ANSIColor::colored( $line_no, $ENV{ACK_COLOR_LINENO} )\n                    : $line_no;\n            App::Ack::print_line_no($display_line_no, $sep);\n        }\n\n        if ( $output_func ) {\n            while ( /$regex/go ) {\n                App::Ack::print( $output_func->() . \"\\n\" );\n            }\n        }\n        else {\n            if ( $color && $is_match && $regex &&\n                 s/$regex/Term::ANSIColor::colored( substr($_, $-[0], $+[0] - $-[0]), $ENV{ACK_COLOR_MATCH} )/eg ) {\n                # At the end of the line reset the color and remove newline\n                s/[\\r\\n]*\\z/\\e[0m\\e[K/;\n            }\n            else {\n                # remove any kind of newline at the end of the line\n                s/[\\r\\n]*\\z//;\n            }\n            if ( $show_column ) {\n                App::Ack::print_column_no( $match_start+1, $sep );\n            }\n            App::Ack::print($_ . \"\\n\");\n        }\n        $any_output = 1;\n        ++$context_overall_output_count;\n        ++$line_no;\n    }\n\n    return;\n} # print_match_or_context()\n\n} # scope around search_resource() and print_match_or_context()\n\n\nTOTAL_COUNT_SCOPE: {\nmy $total_count;\n\nsub get_total_count {\n    return $total_count;\n}\n\nsub reset_total_count {\n    $total_count = 0;\n}\n\n\nsub search_and_list {\n    my $res = shift;\n    my $opt = shift;\n\n    my $nmatches = 0;\n    my $count = $opt->{count};\n    my $ors = $opt->{print0} ? \"\\0\" : \"\\n\"; # output record separator\n    my $show_filename = $opt->{show_filename};\n\n    my $regex = qr/$opt->{regex}/;\n\n    if ( $opt->{v} ) {\n        while ( $res->next_text ) {\n            if ( /$regex/ ) {\n                return 0 unless $count;\n            }\n            else {\n                ++$nmatches;\n            }\n        }\n    }\n    else {\n        while ( $res->next_text ) {\n            if ( /$regex/ ) {\n                ++$nmatches;\n                last unless $count;\n            }\n        }\n    }\n\n    if ( $opt->{show_total} ) {\n        $total_count += $nmatches;\n    }\n    else {\n        if ( $nmatches ) {\n            App::Ack::print_count( $res->name, $nmatches, $ors, $count, $show_filename );\n        }\n        elsif ( $count && !$opt->{l} ) {\n            App::Ack::print_count0( $res->name, $ors, $show_filename );\n        }\n    }\n\n    return $nmatches ? 1 : 0;\n}   # search_and_list()\n\n} # scope around $total_count\n\n\n\nsub filetypes_supported_set {\n    return grep { defined $type_wanted{$_} && ($type_wanted{$_} == 1) } filetypes_supported();\n}\n\n\n\nsub print_files {\n    my $iter = shift;\n    my $opt = shift;\n\n    my $ors = $opt->{print0} ? \"\\0\" : \"\\n\";\n\n    my $nmatches = 0;\n    while ( defined ( my $file = $iter->() ) ) {\n        App::Ack::print $file, $opt->{show_types} ? \" => \" . join( ',', filetypes( $file ) ) : (),  $ors;\n        $nmatches++;\n        last if $opt->{1};\n    }\n\n    return $nmatches;\n}\n\n\nsub print_files_with_matches {\n    my $iter = shift;\n    my $opt = shift;\n\n    # if we have -l and only 1 file given on command line (this means\n    # show_filename is set to 0), we want to see the filename nevertheless\n    $opt->{show_filename} = 1 if $opt->{l};\n\n    $opt->{show_filename} = 0 if $opt->{h};\n    $opt->{show_filename} = 1 if $opt->{H};\n\n    # abuse options to hand in the show_total parameter to search_and_list\n    $opt->{show_total} = $opt->{count} && !$opt->{show_filename};\n    reset_total_count();\n\n    my $nmatches = 0;\n    while ( defined ( my $filename = $iter->() ) ) {\n        my $repo = App::Ack::Repository::Basic->new( $filename );\n        my $res;\n        while ( $res = $repo->next_resource() ) {\n            $nmatches += search_and_list( $res, $opt );\n            $res->close();\n            last if $nmatches && $opt->{1};\n        }\n        $repo->close();\n    }\n\n    if ( $nmatches && $opt->{show_total} ) {\n        App::Ack::print_count('', get_total_count(), \"\\n\", 1, 0  )\n    }\n\n    return $nmatches;\n}\n\n\nsub print_matches {\n    my $iter = shift;\n    my $opt = shift;\n\n    $opt->{show_filename} = 0 if $opt->{h};\n    $opt->{show_filename} = 1 if $opt->{H};\n\n    my $nmatches = 0;\n    while ( defined ( my $filename = $iter->() ) ) {\n        my $repo;\n        my $tarballs_work = 0;\n        if ( $tarballs_work && $filename =~ /\\.tar\\.gz$/ ) {\n            App::Ack::die( 'Not working here yet' );\n            require App::Ack::Repository::Tar; # XXX Error checking\n            $repo = App::Ack::Repository::Tar->new( $filename );\n        }\n        else {\n            $repo = App::Ack::Repository::Basic->new( $filename );\n        }\n        $repo or next;\n\n        while ( my $res = $repo->next_resource() ) {\n            my $needs_line_scan;\n            if ( $opt->{regex} && !$opt->{passthru} ) {\n                $needs_line_scan = $res->needs_line_scan( $opt );\n                if ( $needs_line_scan ) {\n                    $res->reset();\n                }\n            }\n            else {\n                $needs_line_scan = 1;\n            }\n            if ( $needs_line_scan ) {\n                $nmatches += search_resource( $res, $opt );\n            }\n            $res->close();\n        }\n        last if $nmatches && $opt->{1};\n        $repo->close();\n    }\n    return  $nmatches;\n}\n\n\nsub filetype_setup {\n    my $filetypes_supported_set = filetypes_supported_set();\n    # If anyone says --no-whatever, we assume all other types must be on.\n    if ( !$filetypes_supported_set ) {\n        for my $i ( keys %type_wanted ) {\n            $type_wanted{$i} = 1 unless ( defined( $type_wanted{$i} ) || $i eq 'binary' || $i eq 'text' || $i eq 'skipped' );\n        }\n    }\n    return;\n}\n\n\nEXPAND_FILENAMES_SCOPE: {\n    my $filter;\n\n    sub expand_filenames {\n        my $argv = shift;\n\n        my $attr;\n        my @files;\n\n        foreach my $pattern ( @{$argv} ) {\n            my @results = bsd_glob( $pattern );\n\n            if (@results == 0) {\n                @results = $pattern; # Glob didn't match, pass it thru unchanged\n            }\n            elsif ( (@results > 1) or ($results[0] ne $pattern) ) {\n                if (not defined $filter) {\n                    eval 'require Win32::File;';\n                    if ($@) {\n                        $filter = 0;\n                    }\n                    else {\n                        $filter = Win32::File::HIDDEN()|Win32::File::SYSTEM();\n                    }\n                } # end unless we've tried to load Win32::File\n                if ( $filter ) {\n                    # Filter out hidden and system files:\n                    @results = grep { not(Win32::File::GetAttributes($_, $attr) and $attr & $filter) } @results;\n                    App::Ack::warn( \"$pattern: Matched only hidden files\" ) unless @results;\n                } # end if we can filter by file attributes\n            } # end elsif this pattern got expanded\n\n            push @files, @results;\n        } # end foreach pattern\n\n        return \\@files;\n    } # end expand_filenames\n} # EXPAND_FILENAMES_SCOPE\n\n\n\nsub get_starting_points {\n    my $argv = shift;\n    my $opt = shift;\n\n    my @what;\n\n    if ( @{$argv} ) {\n        @what = @{ $is_windows ? expand_filenames($argv) : $argv };\n        $_ = File::Next::reslash( $_ ) for @what;\n\n        # Show filenames unless we've specified one single file\n        $opt->{show_filename} = (@what > 1) || (!-f $what[0]);\n    }\n    else {\n        @what = '.'; # Assume current directory\n        $opt->{show_filename} = 1;\n    }\n\n    for my $start_point (@what) {\n        App::Ack::warn( \"$start_point: No such file or directory\" ) unless -e $start_point;\n    }\n    return \\@what;\n}\n\nsub _match {\n    my ( $target, $expression, $invert_flag ) = @_;\n\n    if ( $invert_flag ) {\n        return $target !~ $expression;\n    }\n    else {\n        return $target =~ $expression;\n    }\n}\n\n\nsub get_iterator {\n    my $what = shift;\n    my $opt  = shift;\n\n    # Starting points are always searched, no matter what\n    my %starting_point = map { ($_ => 1) } @{$what};\n\n    my $g_regex = defined $opt->{G} ? qr/$opt->{G}/ : undef;\n    my $file_filter;\n\n    if ( $g_regex ) {\n        $file_filter\n            = $opt->{u}   ? sub { _match( $File::Next::name, qr/$g_regex/, $opt->{invert_file_match} ) }    # XXX Maybe this should be a 1, no?\n            : $opt->{all} ? sub { $starting_point{ $File::Next::name } || ( _match( $File::Next::name, qr/$g_regex/, $opt->{invert_file_match} ) && is_searchable( $_ ) ) }\n            :               sub { $starting_point{ $File::Next::name } || ( _match( $File::Next::name, qr/$g_regex/, $opt->{invert_file_match} ) && is_interesting( @ _) ) }\n            ;\n    }\n    else {\n        $file_filter\n            = $opt->{u}   ? sub {1}\n            : $opt->{all} ? sub { $starting_point{ $File::Next::name } || is_searchable( $_ ) }\n            :               sub { $starting_point{ $File::Next::name } || is_interesting( @_ ) }\n            ;\n    }\n\n    my $descend_filter\n        = $opt->{n} ? sub {0}\n        : $opt->{u} ? sub {1}\n        : \\&ignoredir_filter;\n\n    my $iter =\n        File::Next::files( {\n            file_filter     => $file_filter,\n            descend_filter  => $descend_filter,\n            error_handler   => sub { my $msg = shift; App::Ack::warn( $msg ) },\n            sort_files      => $opt->{sort_files},\n            follow_symlinks => $opt->{follow},\n        }, @{$what} );\n    return $iter;\n}\n\n\nsub set_up_pager {\n    my $command = shift;\n\n    return if App::Ack::output_to_pipe();\n\n    my $pager;\n    if ( not open( $pager, '|-', $command ) ) {\n        App::Ack::die( qq{Unable to pipe to pager \"$command\": $!} );\n    }\n    $fh = $pager;\n\n    return;\n}\n\n\nsub input_from_pipe {\n    return $input_from_pipe;\n}\n\n\n\nsub output_to_pipe {\n    return $output_to_pipe;\n}\n\n\nsub exit_from_ack {\n    my $nmatches = shift;\n\n    my $rc = $nmatches ? 0 : 1;\n    exit $rc;\n}\n\n\n\n1; # End of App::Ack\npackage App::Ack::Repository;\n\n\nuse warnings;\nuse strict;\n\nsub FAIL {\n    require Carp;\n    Carp::confess( 'Must be overloaded' );\n}\n\n\nsub new {\n    FAIL();\n}\n\n\nsub next_resource {\n    FAIL();\n}\n\n\nsub close {\n    FAIL();\n}\n\n1;\npackage App::Ack::Resource;\n\n\nuse warnings;\nuse strict;\n\nsub FAIL {\n    require Carp;\n    Carp::confess( 'Must be overloaded' );\n}\n\n\nsub new {\n    FAIL();\n}\n\n\nsub name {\n    FAIL();\n}\n\n\nsub is_binary {\n    FAIL();\n}\n\n\n\nsub needs_line_scan {\n    FAIL();\n}\n\n\nsub reset {\n    FAIL();\n}\n\n\nsub next_text {\n    FAIL();\n}\n\n\nsub close {\n    FAIL();\n}\n\n1;\npackage App::Ack::Plugin::Basic;\n\n\n\npackage App::Ack::Resource::Basic;\n\n\nuse warnings;\nuse strict;\n\n\nour @ISA = qw( App::Ack::Resource );\n\n\nsub new {\n    my $class    = shift;\n    my $filename = shift;\n\n    my $self = bless {\n        filename        => $filename,\n        fh              => undef,\n        could_be_binary => undef,\n        opened          => undef,\n        id              => undef,\n    }, $class;\n\n    if ( $self->{filename} eq '-' ) {\n        $self->{fh} = *STDIN;\n        $self->{could_be_binary} = 0;\n    }\n    else {\n        if ( !open( $self->{fh}, '<', $self->{filename} ) ) {\n            App::Ack::warn( \"$self->{filename}: $!\" );\n            return;\n        }\n        $self->{could_be_binary} = 1;\n    }\n\n    return $self;\n}\n\n\nsub name {\n    my $self = shift;\n\n    return $self->{filename};\n}\n\n\nsub is_binary {\n    my $self = shift;\n\n    if ( $self->{could_be_binary} ) {\n        return -B $self->{filename};\n    }\n\n    return 0;\n}\n\n\n\nsub needs_line_scan {\n    my $self  = shift;\n    my $opt   = shift;\n\n    return 1 if $opt->{v};\n\n    my $size = -s $self->{fh};\n    if ( $size == 0 ) {\n        return 0;\n    }\n    elsif ( $size > 100_000 ) {\n        return 1;\n    }\n\n    my $buffer;\n    my $rc = sysread( $self->{fh}, $buffer, $size );\n    if ( not defined $rc ) {\n        App::Ack::warn( \"$self->{filename}: $!\" );\n        return 1;\n    }\n    return 0 unless $rc && ( $rc == $size );\n\n    my $regex = $opt->{regex};\n    return $buffer =~ /$regex/m;\n}\n\n\nsub reset {\n    my $self = shift;\n\n    seek( $self->{fh}, 0, 0 )\n        or App::Ack::warn( \"$self->{filename}: $!\" );\n\n    return;\n}\n\n\nsub next_text {\n    if ( defined ($_ = readline $_[0]->{fh}) ) {\n        $. = ++$_[0]->{line};\n        return 1;\n    }\n\n    return;\n}\n\n\nsub close {\n    my $self = shift;\n\n    if ( not close $self->{fh} ) {\n        App::Ack::warn( $self->name() . \": $!\" );\n    }\n\n    return;\n}\n\npackage App::Ack::Repository::Basic;\n\n\nour @ISA = qw( App::Ack::Repository );\n\n\nuse warnings;\nuse strict;\n\nsub new {\n    my $class    = shift;\n    my $filename = shift;\n\n    my $self = bless {\n        filename => $filename,\n        nexted   => 0,\n    }, $class;\n\n    return $self;\n}\n\n\nsub next_resource {\n    my $self = shift;\n\n    return if $self->{nexted};\n    $self->{nexted} = 1;\n\n    return App::Ack::Resource::Basic->new( $self->{filename} );\n}\n\n\nsub close {\n}\n\n\n\n1;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/filenames/cpanfile",
    "content": "requires 'perl', '5.008001';\n\nrequires 'JSON';\nrequires 'Path::Class', 0.26;\nrequires 'WebService::Dropbox', 2.06;\nrequires 'DateTime::Format::Strptime';\nrequires 'Encode::Locale';\n\nif ($^O eq 'darwin') {\n\trequires 'Encode::UTF8Mac';\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/getchar.al",
    "content": "# NOTE: Derived from ../../lib/POSIX.pm.\n# Changes made here will be lost when autosplit is run again.\n# See AutoSplit.pm.\npackage POSIX;\n\n#line 318 \"../../lib/POSIX.pm (autosplit into ../../lib/auto/POSIX/getchar.al)\"\nsub getchar {\n    usage \"getchar()\" if @_ != 0;\n    CORE::getc(STDIN);\n}\n\n# end of POSIX::getchar\n1;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/index.fcgi",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse warnings;\n\nuse CGI::Fast;\nuse XML::Hash::XS;\nuse File::Spec;\nuse FindBin qw($Bin);\n\n#use lib File::Spec->catdir($Bin, qw(.. lib));\n\nmy $_stop = 0;\nmy $request;\n$SIG{'PIPE'} = 'IGNORE';\n\n$SIG{'INT'} = $SIG{'TERM'} = sub {\n\t$_stop = 1;\n\n\texit(0) unless defined($request);\n};\n\nunless ($ENV{'SERVER_SOFTWARE'}) { # for nginx external fcgi\n\t$CGI::Fast::Ext_Request = FCGI::Request(\n\t\t\\*STDIN, \\*STDOUT, \\*STDERR,\n\t\t\\%ENV, int($ARGV[0] || 0), 1\n\t);\n}\n\nmy $conv = XML::Hash::XS->new(\n\tuse_attr => 1,\n\tindent   => 2,\n\toutput   => \\*STDOUT,\n\txml_decl => 1\n);\n\nmy $tmpl_path = File::Spec->catdir($Bin, qw|.. tmpl|);\n\n\nmy $data = {\n\tname => {\n\t\tnick => 'cono'\n\t},\n\ttree => {\n\t\texample => [\n\t\t\t{ name => 'Encyclopaedia', parent => 0, id => 1 },\n\t\t\t{ name => 'Science',       parent => 1, id => 2 },\n\t\t\t{ name => 'Culture',       parent => 1, id => 3 },\n\t\t\t{ name => 'Art',           parent => 3, id => 4 },\n\t\t\t{ name => 'Craft',         parent => 3, id => 5 }\n\t\t],\n\t},\n\tthird_party => {\n\t\tresults => [\n\t\t\t{ artist_name => 'Madonna', venue => 'Kitchen',      event => 'cooking',      date => '2013-04-21' },\n\t\t\t{ artist_name => 'cono',    venue => 'Provectus-IT', event => 'presentation', date => '2013-04-20' },\n\t\t]\n\t}\n};\n\nwhile (1) {\n\teval {\n\t\t$request = CGI::Fast->new();\n\t\tunless ($request) {\n\t\t\t$_stop = 1;\n\n\t\t\treturn;\n\t\t}\n\n\t\tmy ($tmpl, $output) = ('nick');\n\t\tif ($ENV{'REQUEST_URI'} =~ m|/([a-zA-Z0-9_]+)|) {\n\t\t\t$tmpl = $1;\n\t\t\t$output = $data->{$tmpl} if exists $data->{$tmpl};\n\t\t}\n\n\t\tdie \"Bad request\" unless $output;\n\n\t\tif (-e File::Spec->catfile($tmpl_path, \"$tmpl.xslt\")) {\n\t\t\tprint \"X-Xslt-Stylesheet: /$tmpl.xslt\\r\\n\";\n\t\t}\n\n\t\tprint qq(Content-type:application/xml;charset=utf-8\\r\\n\\r\\n);\n\t\t$conv->hash2xml($output);\n\n\t};\n\n\tif ($@) {\n\t\tprint qq(Content-type:text/html;charset=utf-8\\r\\n\\r\\nError: $@);\n\t}\n\n\t$request = undef;\n\tlast if $_stop;\n\n\tif (-M $0 < 0) {\n\t\tunless ($ENV{'SERVER_SOFTWARE'}) { # for nginx external fcgi\n\t\t\tsystem(\"$0 \". int($ARGV[0] || 0).' &');\n\t\t}\n\t\tlast;\n\t}\n}\n\nexit(0);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/oo1.pl",
    "content": "#! perl\n\n# Copyright (C) 2004-2006, Parrot Foundation.\n\nuse strict;\nuse warnings;\n\nfor my $i ( 1 .. 100000 ) {\n    my $o = new Foo();\n}\nmy $o = new Foo();\nprint $o->[0], \"\\n\";\n\npackage Foo;\n\nsub new {\n    my $self = ref $_[0] ? ref shift : shift;\n    return bless [ 10, 20 ], $self;\n}\n1;\n\n# Local Variables:\n#   mode: cperl\n#   cperl-indent-level: 4\n#   fill-column: 100\n# End:\n# vim: expandtab shiftwidth=4:\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/oo2.pl",
    "content": "#! perl\n\n# Copyright (C) 2004-2006, Parrot Foundation.\n\nuse strict;\nuse warnings;\n\nfor my $i ( 1 .. 500000 ) {\n    my $o = new Foo();\n}\nmy $o = new Foo();\nprint $o->[0], \"\\n\";\n\npackage Foo;\n\nsub new {\n    my $self = ref $_[0] ? ref shift : shift;\n    return bless [ 10, 20 ], $self;\n}\n1;\n\n# Local Variables:\n#   mode: cperl\n#   cperl-indent-level: 4\n#   fill-column: 100\n# End:\n# vim: expandtab shiftwidth=4:\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/oo3.pl",
    "content": "#! perl\n\n# Copyright (C) 2004-2006, Parrot Foundation.\n\nuse strict;\nuse warnings;\n\nmy $o = new Foo();\nfor my $i ( 1 .. 500000 ) {\n    my $x = $o->[0];\n    my $y = $o->[1];\n}\nprint $o->[0], \"\\n\";\n\npackage Foo;\n\nsub new {\n    my $self = ref $_[0] ? ref shift : shift;\n    return bless [ 10, 20 ], $self;\n}\n\n1;\n\n# Local Variables:\n#   mode: cperl\n#   cperl-indent-level: 4\n#   fill-column: 100\n# End:\n# vim: expandtab shiftwidth=4:\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/perl",
    "content": "#!/usr/local/bin/perl\nprint \"Perl\\n\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/perl-test.t",
    "content": "use strict;\nuse warnings;\n\nuse Foo::Bar\n\n$n = 42;\n$name = \"world\";\n@array = (\"1\",\"2\",\"3\");\n%hash = (\"foo\":\"bar\");\nmy $name = \"josh\";\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/script.pl",
    "content": "#!/usr/local/bin/perl\nprint \"Perl\\n\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/strict.t",
    "content": "use Test::Base;\nuse Test::More;\n\n__DATA__\n=== Strict Test\n\n--- perl strict\nmy $x = 5;\n--- strict\nuse strict;\nuse warnings;\nmy $x = 5;"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/test-perl.pl",
    "content": "#!/usr/bin/perl\nprint \"Hello, world!\\n\";\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/test-perl2.pl",
    "content": "\n# Perl file without shebang\nprint \"Hello, world!\\n\";\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl/use5.pl",
    "content": "use Mojolicious::Lite;\nuse 5.20.0;\nuse experimental 'signatures';\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/01-dash-uppercase-i.t",
    "content": "use v6;\n\nuse Test;\n\n=begin pod\n\nTest handling of -I.\n\nMultiple C<-I> switches are supposed to\nprepend left-to-right:\n\n  -Ifoo -Ibar\n\nshould make C<@*INC> look like:\n\n  foo\n  bar\n  ...\n\nDuplication of directories on the command line is mirrored\nin the C<@*INC> variable, so C<pugs -Ilib -Ilib> will have B<two>\nentries C<lib/> in C<@*INC>.\n\n=end pod\n\n# L<S19/Reference/\"Prepend directories to\">\n\nmy $fragment = '-e \"@*INC.perl.say\"';\n\nmy @tests = (\n    'foo',\n    'foo$bar',\n    'foo bar$baz',\n    'foo$foo',\n);\n\nplan @tests*2;\n\ndiag \"Running under $*OS\";\n\nmy ($pugs,$redir) = ($*EXECUTABLE_NAME, \">\");\n\nif $*OS eq any <MSWin32 mingw msys cygwin> {\n  $pugs = 'pugs.exe';\n  $redir = '>';\n};\n\nsub nonce () { return (\".{$*PID}.\" ~ (1..1000).pick) }\n\nsub run_pugs ($c) {\n  my $tempfile = \"temp-ex-output\" ~ nonce;\n  my $command = \"$pugs $c $redir $tempfile\";\n  diag $command;\n  run $command;\n  my $res = slurp $tempfile;\n  unlink $tempfile;\n  return $res;\n}\n\nfor @tests -> $t {\n  my @dirs = split('$',$t);\n  my $command;\n  # This should be smarter about quoting\n  # (currently, this should work for WinNT and Unix shells)\n  $command = join \" \", map { qq[\"-I$_\"] }, @dirs;\n  my $got = run_pugs( $command ~ \" $fragment\" );\n  $got .= chomp;\n\n  if (substr($got,0,1) ~~ \"[\") {\n    # Convert from arrayref to array\n    $got = substr($got, 1, -1);\n  };\n\n  my @got = EVAL $got;\n  @got = @got[ 0..@dirs-1 ];\n  my @expected = @dirs;\n\n  is @got, @expected, \"'\" ~ @dirs ~ \"' works\";\n\n  $command = join \" \", map { qq[-I \"$_\"] }, @dirs;\n  $got = run_pugs( $command ~ \" $fragment\" );\n  \n  $got .= chomp;\n  if (substr($got,0,1) ~~ \"[\") {\n    # Convert from arrayref to array\n    $got = substr($got, 1, -1);\n  };\n  \n  @got = EVAL $got;\n  @got = @got[ 0..@dirs-1 ];\n  @expected = @dirs;\n\n  is @got, @expected, \"'\" ~ @dirs ~ \"' works (with a space delimiting -I)\";\n}\n\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/01-parse.t",
    "content": "use v6;\nBEGIN { @*INC.push('lib') };\n\nuse JSON::Tiny::Grammar;\nuse Test;\n\nmy @t =\n    '{}',\n    '{  }',\n    ' { } ',\n    '{ \"a\" : \"b\" }',\n    '{ \"a\" : null }',\n    '{ \"a\" : true }',\n    '{ \"a\" : false }',\n    '{ \"a\" : { } }',\n    '[]',\n    '[ ]',\n    ' [ ] ',\n    # stolen from JSON::XS, 18_json_checker.t, and adapted a bit\n    Q<<[\n    \"JSON Test Pattern pass1\",\n    {\"object with 1 member\":[\"array with 1 element\"]},\n    {},\n    []\n    ]>>,\n    Q<<[1]>>,\n    Q<<[true]>>,\n    Q<<[-42]>>,\n    Q<<[-42,true,false,null]>>,\n    Q<<{ \"integer\": 1234567890 }>>,\n    Q<<{ \"real\": -9876.543210 }>>,\n    Q<<{ \"e\": 0.123456789e-12 }>>,\n    Q<<{ \"E\": 1.234567890E+34 }>>,\n    Q<<{ \"\":  23456789012E66 }>>,\n    Q<<{ \"zero\": 0 }>>,\n    Q<<{ \"one\": 1 }>>,\n    Q<<{ \"space\": \" \" }>>,\n    Q<<{ \"quote\": \"\\\"\"}>>,\n    Q<<{ \"backslash\": \"\\\\\"}>>,\n    Q<<{ \"controls\": \"\\b\\f\\n\\r\\t\"}>>,\n    Q<<{ \"slash\": \"/ & \\/\"}>>,\n    Q<<{ \"alpha\": \"abcdefghijklmnopqrstuvwyz\"}>>,\n    Q<<{ \"ALPHA\": \"ABCDEFGHIJKLMNOPQRSTUVWYZ\"}>>,\n    Q<<{ \"digit\": \"0123456789\"}>>,\n    Q<<{ \"0123456789\": \"digit\"}>>,\n    Q<<{\"special\": \"`1~!@#$%^&*()_+-={':[,]}|;.</>?\"}>>,\n    Q<<{\"hex\": \"\\u0123\\u4567\\u89AB\\uCDEF\\uabcd\\uef4A\"}>>,\n    Q<<{\"true\": true}>>,\n    Q<<{\"false\": false}>>,\n    Q<<{\"null\": null}>>,\n    Q<<{\"array\":[  ]}>>,\n    Q<<{\"object\":{  }}>>,\n    Q<<{\"address\": \"50 St. James Street\"}>>,\n    Q<<{\"url\": \"http://www.JSON.org/\"}>>,\n    Q<<{\"comment\": \"// /* <!-- --\"}>>,\n    Q<<{\"# -- --> */\": \" \"}>>,\n    Q<<{ \" s p a c e d \" :[1,2 , 3\n\n,\n\n4 , 5        ,          6           ,7        ],\"compact\":[1,2,3,4,5,6,7]}>>,\n\n    Q<<{\"jsontext\": \"{\\\"object with 1 member\\\":[\\\"array with 1 element\\\"]}\"}>>,\n    Q<<{\"quotes\": \"&#34; \\u0022 %22 0x22 034 &#x22;\"}>>,\n    Q<<{    \"\\/\\\\\\\"\\uCAFE\\uBABE\\uAB98\\uFCDE\\ubcda\\uef4A\\b\\f\\n\\r\\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?\"\n: \"A key can be any string\"\n    }>>,\n    Q<<[    0.5 ,98.6\n,\n99.44\n,\n\n1066,\n1e1,\n0.1e1\n    ]>>,\n    Q<<[1e-1]>>,\n    Q<<[1e00,2e+00,2e-00,\"rosebud\"]>>,\n    Q<<[[[[[[[[[[[[[[[[[[[\"Not too deep\"]]]]]]]]]]]]]]]]]]]>>,\n    Q<<{\n    \"JSON Test Pattern pass3\": {\n        \"The outermost value\": \"must be an object or array.\",\n        \"In this test\": \"It is an object.\"\n    }\n}\n>>,\n# from http://www.json.org/example.html\n    Q<<{\n    \"glossary\": {\n        \"title\": \"example glossary\",\n\t\t\"GlossDiv\": {\n            \"title\": \"S\",\n\t\t\t\"GlossList\": {\n                \"GlossEntry\": {\n                    \"ID\": \"SGML\",\n\t\t\t\t\t\"SortAs\": \"SGML\",\n\t\t\t\t\t\"GlossTerm\": \"Standard Generalized Markup Language\",\n\t\t\t\t\t\"Acronym\": \"SGML\",\n\t\t\t\t\t\"Abbrev\": \"ISO 8879:1986\",\n\t\t\t\t\t\"GlossDef\": {\n                        \"para\": \"A meta-markup language, used to create markup languages such as DocBook.\",\n\t\t\t\t\t\t\"GlossSeeAlso\": [\"GML\", \"XML\"]\n                    },\n\t\t\t\t\t\"GlossSee\": \"markup\"\n                }\n            }\n        }\n    }\n}\n    >>,\n    Q<<{\"menu\": {\n  \"id\": \"file\",\n  \"value\": \"File\",\n  \"popup\": {\n    \"menuitem\": [\n      {\"value\": \"New\", \"onclick\": \"CreateNewDoc()\"},\n      {\"value\": \"Open\", \"onclick\": \"OpenDoc()\"},\n      {\"value\": \"Close\", \"onclick\": \"CloseDoc()\"}\n    ]\n  }\n}}>>,\n    Q<<{\"widget\": {\n    \"debug\": \"on\",\n    \"window\": {\n        \"title\": \"Sample Konfabulator Widget\",\n        \"name\": \"main_window\",\n        \"width\": 500,\n        \"height\": 500\n    },\n    \"image\": {\n        \"src\": \"Images/Sun.png\",\n        \"name\": \"sun1\",\n        \"hOffset\": 250,\n        \"vOffset\": 250,\n        \"alignment\": \"center\"\n    },\n    \"text\": {\n        \"data\": \"Click Here\",\n        \"size\": 36,\n        \"style\": \"bold\",\n        \"name\": \"text1\",\n        \"hOffset\": 250,\n        \"vOffset\": 100,\n        \"alignment\": \"center\",\n        \"onMouseUp\": \"sun1.opacity = (sun1.opacity / 100) * 90;\"\n    }\n}}>>,\n    ;\n\nmy @n =\n    '{ ',\n    '{ 3 : 4 }',\n    '{ 3 : tru }',  # not quite true\n    '{ \"a : false }', # missing quote\n    # stolen from JSON::XS, 18_json_checker.t\n    Q<<\"A JSON payload should be an object or array, not a string.\">>,\n    Q<<{\"Extra value after close\": true} \"misplaced quoted value\">>,\n    Q<<{\"Illegal expression\": 1 + 2}>>,\n    Q<<{\"Illegal invocation\": alert()}>>,\n    Q<<{\"Numbers cannot have leading zeroes\": 013}>>,\n    Q<<{\"Numbers cannot be hex\": 0x14}>>,\n    Q<<[\"Illegal backslash escape: \\x15\"]>>,\n    Q<<[\\naked]>>,\n    Q<<[\"Illegal backslash escape: \\017\"]>>,\n# skipped: wo don't implement no stinkin' aritifical limits.\n#    Q<<[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\"Too deep\"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]>>,\n    Q<<{\"Missing colon\" null}>>,\n    Q<<[\"Unclosed array\">>,\n    Q<<{\"Double colon\":: null}>>,\n    Q<<{\"Comma instead of colon\", null}>>,\n    Q<<[\"Colon instead of comma\": false]>>,\n    Q<<[\"Bad value\", truth]>>,\n    Q<<['single quote']>>,\n    qq<[\"\\ttab\\tcharacter\tin\tstring\t\"]>,\n    Q<<[\"line\nbreak\"]>>,\n    Q<<[\"line\\\nbreak\"]>>,\n    Q<<[0e]>>,\n    Q<<{unquoted_key: \"keys must be quoted\"}>>,\n    Q<<[0e+]>>,\n    Q<<[0e+-1]>>,\n    Q<<{\"Comma instead if closing brace\": true,>>,\n    Q<<[\"mismatch\"}>>,\n    Q<<[\"extra comma\",]>>,\n    Q<<[\"double extra comma\",,]>>,\n    Q<<[   , \"<-- missing value\"]>>,\n    Q<<[\"Comma after the close\"],>>,\n    Q<<[\"Extra close\"]]>>,\n    Q<<{\"Extra comma\": true,}>>,\n;\n\nplan (+@t) + (+@n);\n\nmy $i = 0;\nfor @t -> $t {\n    my $desc = $t;\n    if $desc ~~ m/\\n/ {\n        $desc .= subst(/\\n.*$/, \"\\\\n...[$i]\");\n    }\n    my $parsed = 0;\n    try {\n        JSON::Tiny::Grammar.parse($t)\n            and $parsed = 1;\n    }\n    ok $parsed, \"JSON string «$desc» parsed\";\n    $i++;\n}\n\nfor @n -> $t {\n    my $desc = $t;\n    if $desc ~~ m/\\n/ {\n        $desc .= subst(/\\n.*$/, \"\\\\n...[$i]\");\n    }\n    my $parsed = 0;\n    try { JSON::Tiny::Grammar.parse($t) and $parsed = 1 };\n    nok $parsed, \"NOT parsed «$desc»\";\n    $i++;\n}\n\n\n# vim: ft=perl6\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/A.pm",
    "content": "# used in t/spec/S11-modules/nested.t \n\nBEGIN { @*INC.push('t/spec/packages') };\n\nmodule A::A {\n    use A::B;\n}\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/ANSIColor.pm",
    "content": "use v6;\n\nmodule Term::ANSIColor;\n\n# these will be macros one day, yet macros can't be exported so far\nsub RESET         is export { \"\\e[0m\"  }\nsub BOLD          is export { \"\\e[1m\"  }\nsub UNDERLINE     is export { \"\\e[4m\"  }\nsub INVERSE       is export { \"\\e[7m\"  }\nsub BOLD_OFF      is export { \"\\e[22m\" }\nsub UNDERLINE_OFF is export { \"\\e[24m\" }\nsub INVERSE_OFF   is export { \"\\e[27m\" }\n\nmy %attrs = \n\treset      => \"0\",\n\tbold       => \"1\",\n\tunderline  => \"4\",\n\tinverse    => \"7\",\n\tblack      => \"30\",\n\tred        => \"31\",\n\tgreen      => \"32\",\n\tyellow     => \"33\",\n\tblue       => \"34\",\n\tmagenta    => \"35\",\n\tcyan       => \"36\",\n\twhite      => \"37\",\n\tdefault    => \"39\",\n\ton_black   => \"40\",\n\ton_red     => \"41\",\n\ton_green   => \"42\",\n\ton_yellow  => \"43\",\n\ton_blue    => \"44\",\n\ton_magenta => \"45\",\n\ton_cyan    => \"46\",\n\ton_white   => \"47\",\n\ton_default => \"49\";\n\nsub color (Str $what) is export {\n\tmy @res;\n\tmy @a = $what.split(' ');\n\tfor @a -> $attr {\n\t\tif %attrs.exists($attr) {\n\t\t\t@res.push: %attrs{$attr}\n\t\t} else {\n\t\t\tdie(\"Invalid attribute name '$attr'\")\n\t\t}\n\t}\n\treturn \"\\e[\" ~ @res.join(';') ~ \"m\";\n}\n\nsub colored (Str $what, Str $how) is export {\n\tcolor($how) ~ $what ~ color('reset');\n}\n\nsub colorvalid (*@a) is export {\n\tfor @a -> $el {\n\t\treturn False unless %attrs.exists($el)\n\t}\n\treturn True;\n}\n\nsub colorstrip (*@a) is export {\n\tmy @res;\n\tfor @a -> $str {\n\t\t@res.push: $str.subst(/\\e\\[ <[0..9;]>+ m/, '', :g);\n\t}\n\treturn @res.join;\n}\n\nsub uncolor (Str $what) is export {\n\tmy @res;\n\tmy @list = $what.comb(/\\d+/);\n\tfor @list -> $elem {\n\t\tif %attrs.reverse.exists($elem) {\n\t\t\t@res.push: %attrs.reverse{$elem}\n\t\t} else {\n\t\t\tdie(\"Bad escape sequence: {'\\e[' ~ $elem ~ 'm'}\")\n\t\t}\n\t}\n\treturn @res.join(' ');\n}\n\n=begin pod\n\n=head1 NAME\n\nTerm::ANSIColor - Color screen output using ANSI escape sequences\n\n=head1 SYNOPSIS\n\n\tuse Term::ANSIColor;\n\tsay color('bold'), \"this is in bold\", color('reset');\n\tsay colored('underline red on_green', 'what a lovely colours!');\n\tsay BOLD, 'good to be fat!', BOLD_OFF;\n\tsay 'ok' if colorvalid('magenta', 'on_black', 'inverse');\n\tsay '\\e[36m is ', uncolor('\\e36m');\n\tsay colorstrip(\"\\e[1mThis is bold\\e[0m\");\n\n=head1 DESCRIPTION\n\nTerm::ANSIColor provides an interface for using colored output\nin terminals. The following functions are available:\n\n=head2 C<color()>\n\nGiven a string with color names, the output produced by C<color()>\nsets the terminal output so the text printed after it will be colored\nas specified. The following color names are recognised:\n\n\treset bold underline inverse black red green yellow blue\n\tmagenta cyan white default on_black on_red on_green on_yellow\n\ton_blue on_magenta on_cyan on_white on_default\n\nThe on_* family of colors correspond to the background colors.\n\n=head2 C<colored()>\n\nC<colored()> is similar to C<color()>. It takes two Str arguments,\nwhere the first is the colors to be used, and the second is the string\nto be colored. The C<reset> sequence is automagically placed after\nthe string.\n\n=head2 C<colorvalid()>\n\nC<colorvalid()> gets an array of color specifications (like those\npassed to C<color()>) and returns true if all of them are valid,\nfalse otherwise.\n\n=head2 C<colorstrip()>\n\nC<colorstrip>, given a string, removes all the escape sequences\nin it, leaving the plain text without effects.\n\n=head2 C<uncolor()>\n\nGiven escape sequences, C<uncolor()> returns a string with readable\ncolor names. E.g. passing \"\\e[36;44m\" will result in \"cyan on_blue\".\n\n=head1 Constants\n\nC<Term::ANSIColor> provides constants which are just strings of\nappropriate escape sequences. The following constants are available:\n\n\tRESET BOLD UNDERLINE INVERSE BOLD_OFF UNDERLINE_OFF INVERSE_OFF\n\n=end pod\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/Bailador.pm",
    "content": "use Bailador::App;\nuse Bailador::Request;\nuse Bailador::Response;\nuse Bailador::Context;\nuse HTTP::Easy::PSGI;\n\nmodule Bailador;\n\nmy $app = Bailador::App.current;\n\nour sub import {\n    my $file = callframe(1).file;\n    my $slash = $file.rindex('/');\n    if $slash {\n        $app.location = $file.substr(0, $file.rindex('/'));\n    } else {\n        $app.location = '.';\n    }\n}\n\nsub route_to_regex($route) {\n    $route.split('/').map({\n        my $r = $_;\n        if $_.substr(0, 1) eq ':' {\n            $r = q{(<-[\\/\\.]>+)};\n        }\n        $r\n    }).join(\"'/'\");\n}\n\nmulti parse_route(Str $route) {\n    my $r = route_to_regex($route);\n    return \"/ ^ $r \\$ /\".eval;\n}\n\nmulti parse_route($route) {\n    # do nothing\n    $route\n}\n\nsub get(Pair $x) is export {\n    my $p = parse_route($x.key) => $x.value;\n    $app.add_route: 'GET', $p;\n    return $x;\n}\n\nsub post(Pair $x) is export {\n    my $p = parse_route($x.key) => $x.value;\n    $app.add_route: 'POST', $p;\n    return $x;\n}\n\nsub request is export { $app.context.request }\n\nsub content_type(Str $type) is export {\n    $app.response.headers<Content-Type> = $type;\n}\n\nsub header(Str $name, Cool $value) is export {\n    $app.response.headers{$name} = ~$value;\n}\n\nsub status(Int $code) is export {\n    $app.response.code = $code;\n}\n\nsub template(Str $tmpl, *@params) is export {\n    $app.template($tmpl, @params);\n}\n\nour sub dispatch_request(Bailador::Request $r) {\n    return dispatch($r.env);\n}\n\nsub dispatch($env) {\n    $app.context.env = $env;\n\n    my ($r, $match) = $app.find_route($env);\n\n    if $r {\n        status 200;\n        if $match {\n            $app.response.content = $r.value.(|$match.list);\n        } else {\n            $app.response.content = $r.value.();\n        }\n    }\n\n    return $app.response;\n}\n\nsub dispatch-psgi($env) {\n    return dispatch($env).psgi;\n}\n\nsub baile is export {\n    given HTTP::Easy::PSGI.new(port => 3000) {\n        .app(&dispatch-psgi);\n        say \"Entering the development dance floor: http://0.0.0.0:3000\";\n        .run;\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/ContainsUnicode.pm",
    "content": "module ContainsUnicode {\n    sub uc-and-join(*@things, :$separator = ', ') is export {\n        @things».uc.join($separator)\n    }\n}\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/Exception.pm",
    "content": "my class Failure { ... }\nmy role X::Comp { ... }\nmy class X::ControlFlow { ... }\n\nmy class Exception {\n    has $!ex;\n\n    method backtrace() { Backtrace.new(self) }\n\n    multi method Str(Exception:D:) {\n        self.?message.Str // 'Something went wrong'\n    }\n\n    multi method gist(Exception:D:) {\n        my $str = try self.?message;\n        return \"Error while creating error string: $!\" if $!;\n        $str ~= \"\\n\";\n        try $str ~= self.backtrace;\n        return \"$str\\nError while creating backtrace: $!.message()\\n$!.backtrace.full();\" if $!;\n        return $str;\n    }\n\n    method throw() is hidden_from_backtrace {\n        nqp::bindattr(self, Exception, '$!ex', nqp::newexception())\n            unless nqp::isconcrete($!ex);\n        nqp::setpayload($!ex, nqp::decont(self));\n        my $msg := self.?message;\n        nqp::setmessage($!ex, nqp::unbox_s($msg.Str))\n            if $msg.defined;\n        nqp::throw($!ex)\n    }\n    method rethrow() is hidden_from_backtrace {\n        nqp::setpayload($!ex, nqp::decont(self));\n        nqp::rethrow($!ex)\n    }\n\n    method resumable() {\n        nqp::p6bool(nqp::istrue(nqp::atkey($!ex, 'resume')));\n    }\n\n    method resume() {\n        my Mu $resume := nqp::atkey($!ex, 'resume');\n        if $resume {\n            $resume();\n        }\n        else {\n            die \"Exception is not resumable\";\n        }\n    }\n\n    method fail(Exception:D:) {\n        try self.throw;\n        my $fail := Failure.new($!);\n        my Mu $return := nqp::getlexcaller('RETURN');\n        $return($fail) unless nqp::isnull($return);\n        $fail\n    }\n\n    method is-compile-time { False }\n}\n\nmy class X::AdHoc is Exception {\n    has $.payload;\n    method message() { $.payload.Str     }\n    method Numeric() { $.payload.Numeric }\n}\n\nmy class X::Method::NotFound is Exception {\n    has $.method;\n    has $.typename;\n    has Bool $.private = False;\n    method message() {\n        $.private\n            ?? \"No such private method '$.method' for invocant of type '$.typename'\"\n            !! \"No such method '$.method' for invocant of type '$.typename'\";\n    }\n}\n\nmy class X::Method::InvalidQualifier is Exception {\n    has $.method;\n    has $.invocant;\n    has $.qualifier-type;\n    method message() {\n          \"Cannot dispatch to method $.method on {$.qualifier-type.^name} \"\n        ~ \"because it is not inherited or done by {$.invocant.^name}\";\n    }\n}\n\n\nsub EXCEPTION(|) {\n    my Mu $vm_ex   := nqp::shift(nqp::p6argvmarray());\n    my Mu $payload := nqp::getpayload($vm_ex);\n    if nqp::p6bool(nqp::istype($payload, Exception)) {\n        nqp::bindattr($payload, Exception, '$!ex', $vm_ex);\n        $payload;\n    } else {\n        my int $type = nqp::getextype($vm_ex);\n        my $ex;\n#?if parrot\n        if $type == pir::const::EXCEPTION_METHOD_NOT_FOUND &&\n#?endif\n#?if !parrot\n        if\n#?endif\n            nqp::p6box_s(nqp::getmessage($vm_ex)) ~~ /\"Method '\" (.*?) \"' not found for invocant of class '\" (.+)\\'$/ {\n\n            $ex := X::Method::NotFound.new(\n                method   => ~$0,\n                typename => ~$1,\n            );\n        }\n        else {\n\n            $ex := nqp::create(X::AdHoc);\n            nqp::bindattr($ex, X::AdHoc, '$!payload', nqp::p6box_s(nqp::getmessage($vm_ex)));\n        }\n        nqp::bindattr($ex, Exception, '$!ex', $vm_ex);\n        $ex;\n    }\n}\n\nmy class X::Comp::AdHoc { ... }\nsub COMP_EXCEPTION(|) {\n    my Mu $vm_ex   := nqp::shift(nqp::p6argvmarray());\n    my Mu $payload := nqp::getpayload($vm_ex);\n    if nqp::p6bool(nqp::istype($payload, Exception)) {\n        nqp::bindattr($payload, Exception, '$!ex', $vm_ex);\n        $payload;\n    } else {\n        my $ex := nqp::create(X::Comp::AdHoc);\n        nqp::bindattr($ex, Exception, '$!ex', $vm_ex);\n        nqp::bindattr($ex, X::AdHoc, '$!payload', nqp::p6box_s(nqp::getmessage($vm_ex)));\n        $ex;\n    }\n}\n\n\ndo {\n    sub is_runtime($bt) {\n        for $bt.keys {\n            try {\n                my Mu $sub := nqp::getattr(nqp::decont($bt[$_]<sub>), ForeignCode, '$!do');\n                my Mu $codeobj := nqp::ifnull(nqp::getcodeobj($sub), Mu);\n                my $is_nqp = $codeobj && $codeobj.HOW.name($codeobj) eq 'NQPRoutine';\n                return True if nqp::iseq_s(nqp::getcodename($sub), 'eval') && $is_nqp;\n                return False if nqp::iseq_s(nqp::getcodename($sub), 'compile') && $is_nqp;\n            }\n        }\n        return False;\n    }\n\n\n    sub print_exception(|) is hidden_from_backtrace {\n        my Mu $ex := nqp::atpos(nqp::p6argvmarray(), 0);\n        try {\n            my $e := EXCEPTION($ex);\n            my Mu $err := nqp::getstderr();\n\n#?if parrot\n            if $e.is-compile-time || is_runtime($ex.backtrace) {\n#?endif\n#?if !parrot\n            if $e.is-compile-time || is_runtime(nqp::backtrace($ex)) {\n#?endif\n                nqp::printfh($err, $e.gist);\n                nqp::printfh($err, \"\\n\");\n            }\n            else {\n                nqp::printfh($err, \"===SORRY!===\\n\");\n                nqp::printfh($err, $e.Str);\n                nqp::printfh($err, \"\\n\");\n            }\n            $_() for nqp::hllize(nqp::getcurhllsym('@END_PHASERS'));\n        }\n        if $! {\n#?if parrot\n            pir::perl6_based_rethrow__0PP(nqp::getattr(nqp::decont($!), Exception, '$!ex'), $ex);\n#?endif\n#?if !parrot\n            nqp::rethrow(nqp::getattr(nqp::decont($!), Exception, '$!ex'));\n            $ex\n#?endif\n        }\n    }\n\n    sub print_control(|) is hidden_from_backtrace {\n        my Mu $ex := nqp::atpos(nqp::p6argvmarray(), 0);\n        my int $type = nqp::getextype($ex);\n        if ($type == nqp::const::CONTROL_WARN) {\n            my Mu $err := nqp::getstderr();\n            my $msg = nqp::p6box_s(nqp::getmessage($ex));\n            nqp::printfh($err, $msg ?? \"$msg\" !! \"Warning\");\n#?if parrot\n            nqp::printfh($err, Backtrace.new($ex.backtrace, 0).nice(:oneline));\n#?endif\n#?if jvm\n#            XXX Backtraces busted\n#            nqp::printfh($err, Backtrace.new(nqp::backtrace($ex), 0).nice(:oneline));\n#?endif\n            nqp::printfh($err, \"\\n\");\n#?if parrot\n            my $resume := nqp::atkey($ex, 'resume');\n            if ($resume) {\n                $resume();\n            }\n#?endif\n#?if !parrot\n            nqp::resume($ex)\n#?endif\n        }\n        if ($type == nqp::const::CONTROL_LAST) {\n            X::ControlFlow.new(illegal => 'last', enclosing => 'loop construct').throw;\n        }\n        if ($type == nqp::const::CONTROL_NEXT) {\n            X::ControlFlow.new(illegal => 'next', enclosing => 'loop construct').throw;\n        }\n        if ($type == nqp::const::CONTROL_REDO) {\n            X::ControlFlow.new(illegal => 'redo', enclosing => 'loop construct').throw;\n        }\n        if ($type == nqp::const::CONTROL_PROCEED) {\n            X::ControlFlow.new(illegal => 'proceed', enclosing => 'when clause').throw;\n        }\n        if ($type == nqp::const::CONTROL_SUCCEED) {\n            # XXX: should work like leave() ?\n            X::ControlFlow.new(illegal => 'succeed', enclosing => 'when clause').throw;\n        }\n        if ($type == nqp::const::CONTROL_TAKE) {\n            X::ControlFlow.new(illegal => 'take', enclosing => 'gather').throw;\n        }\n    }\n            \n    my Mu $comp := nqp::getcomp('perl6');\n    $comp.HOW.add_method($comp, 'handle-exception',\n        method (|) {\n            my Mu $ex := nqp::atpos(nqp::p6argvmarray(), 1);\n#?if parrot\n            pir::perl6_invoke_catchhandler__vPP(&print_exception, $ex);\n#?endif\n#?if !parrot\n            print_exception($ex);\n#?endif\n            nqp::exit(1);\n            0;\n        }\n    );\n    $comp.HOW.add_method($comp, 'handle-control',\n        method (|) {\n            my Mu $ex := nqp::atpos(nqp::p6argvmarray(), 1);\n#?if parrot\n            pir::perl6_invoke_catchhandler__vPP(&print_control, $ex);\n#?endif\n#?if !parrot\n            print_control($ex);\n#?endif\n            nqp::rethrow($ex);\n        }\n    );\n\n}\n\nmy role X::OS {\n    has $.os-error;\n}\n\nmy role X::IO does X::OS { };\n\nmy class X::IO::Rename does X::IO is Exception {\n    has $.from;\n    has $.to;\n    method message() {\n        \"Failed to rename '$.from' to '$.to': $.os-error\"\n    }\n}\n\nmy class X::IO::Copy does X::IO is Exception {\n    has $.from;\n    has $.to;\n    method message() {\n        \"Failed to copy '$.from' to '$.to': $.os-error\"\n    }\n}\n\nmy class X::IO::Symlink does X::IO is Exception {\n    has $.target;\n    has $.name;\n    method message() {\n        \"Failed to create symlink called '$.name' on target '$.target': $.os-error\"\n    }\n}\n\nmy class X::IO::Link does X::IO is Exception {\n    has $.target;\n    has $.name;\n    method message() {\n        \"Failed to create link called '$.name' on target '$.target': $.os-error\"\n    }\n}\n\nmy class X::IO::Mkdir does X::IO is Exception {\n    has $.path;\n    has $.mode;\n    method message() {\n        \"Failed to create directory '$.path' with mode '0o{$.mode.fmt(\"%03o\")}': $.os-error\"\n    }\n}\n\nmy class X::IO::Chdir does X::IO is Exception {\n    has $.path;\n    method message() {\n        \"Failed to change the working directory to '$.path': $.os-error\"\n    }\n}\n\nmy class X::IO::Dir does X::IO is Exception {\n    has $.path;\n    method message() {\n        \"Failed to get the directory contents of '$.path': $.os-error\"\n    }\n}\n\nmy class X::IO::Cwd does X::IO is Exception {\n    method message() {\n        \"Failed to get the working directory: $.os-error\"\n    }\n}\n\nmy class X::IO::Rmdir does X::IO is Exception {\n    has $.path;\n    method message() {\n        \"Failed to remove the directory '$.path': $.os-error\"\n    }\n}\n\nmy class X::IO::Unlink does X::IO is Exception {\n    has $.path;\n    method message() {\n        \"Failed to remove the file '$.path': $.os-error\"\n    }\n}\n\nmy class X::IO::Chmod does X::IO is Exception {\n    has $.path;\n    has $.mode;\n    method message() {\n        \"Failed to set the mode of '$.path' to '0o{$.mode.fmt(\"%03o\")}': $.os-error\"\n    }\n}\n\nmy role X::Comp is Exception {\n    has $.filename;\n    has $.line;\n    has $.column;\n    has @.modules;\n    has $.is-compile-time = False;\n    has $.pre;\n    has $.post;\n    has @.highexpect;\n    multi method gist(::?CLASS:D: :$sorry = True, :$expect = True) {\n        if $.is-compile-time {\n            my $color = %*ENV<RAKUDO_ERROR_COLOR> // $*OS ne 'MSWin32';\n            my ($red, $green, $yellow, $clear) = $color\n                ?? (\"\\e[31m\", \"\\e[32m\", \"\\e[33m\", \"\\e[0m\")\n                !! (\"\", \"\", \"\", \"\");\n            my $eject = $*OS eq 'MSWin32' ?? \"<HERE>\" !! \"\\x[23CF]\";\n            my $r = $sorry ?? self.sorry_heading() !! \"\";\n            $r ~= \"$.message\\nat $.filename():$.line\\n------> \";\n            $r ~= \"$green$.pre$yellow$eject$red$.post$clear\" if defined $.pre;\n            if $expect && @.highexpect {\n                $r ~= \"\\n    expecting any of:\";\n                for @.highexpect {\n                    $r ~= \"\\n        $_\";\n                }\n            }\n            for @.modules.reverse[1..*] {\n                $r ~= $_<module>.defined\n                        ?? \"\\n  from module $_<module> ($_<filename>:$_<line>)\"\n                        !! \"\\n  from $_<filename>:$_<line>\";\n            }\n            $r;\n        }\n        else {\n            self.Exception::gist;\n        }\n    }\n    method sorry_heading() {\n        my $color = %*ENV<RAKUDO_ERROR_COLOR> // $*OS ne 'MSWin32';\n        my ($red, $clear) = $color ?? (\"\\e[31m\", \"\\e[0m\") !! (\"\", \"\");\n        \"$red==={$clear}SORRY!$red===$clear Error while compiling $.filename\\n\"\n    }\n    method SET_FILE_LINE($file, $line) {\n        $!filename = $file;\n        $!line     = $line;\n        $!is-compile-time = True;\n    }\n}\n\nmy class X::Comp::Group is Exception {\n    has $.panic;\n    has @.sorrows;\n    has @.worries;\n\n    method is-compile-time() { True }\n\n    multi method gist(::?CLASS:D:) {\n        my $r = \"\";\n        if $.panic || @.sorrows {\n            my $color = %*ENV<RAKUDO_ERROR_COLOR> // $*OS ne 'MSWin32';\n            my ($red, $clear) = $color ?? (\"\\e[31m\", \"\\e[0m\") !! (\"\", \"\");\n            $r ~= \"$red==={$clear}SORRY!$red===$clear\\n\";\n            for @.sorrows {\n                $r ~= .gist(:!sorry, :!expect) ~ \"\\n\";\n            }\n            if $.panic {\n                $r ~= $.panic.gist(:!sorry) ~ \"\\n\";\n            }\n        }\n        if @.worries {\n            $r ~= $.panic || @.sorrows\n                ?? \"Other potential difficulties:\\n\"\n                !! \"Potential difficulties:\\n\";\n            for @.worries {\n                $r ~= .gist(:!sorry, :!expect).indent(4) ~ \"\\n\";\n            }\n        }\n        $r\n    }\n\n    method message() {\n        my @m;\n        for @.sorrows {\n            @m.push(.message);\n        }\n        if $.panic {\n            @m.push($.panic.message);\n        }\n        for @.worries {\n            @m.push(.message);\n        }\n        @m.join(\"\\n\")\n    }\n}\n\n# XXX a hack for getting line numbers from exceptions from the metamodel\nmy class X::Comp::AdHoc is X::AdHoc does X::Comp {\n    method is-compile-time() { True }\n}\n\nmy role X::Syntax does X::Comp { }\nmy role X::Pod                 { }\n\nmy class X::NYI is Exception {\n    has $.feature;\n    method message() { \"$.feature not yet implemented. Sorry. \" }\n}\nmy class X::Comp::NYI is X::NYI does X::Comp { };\n\nmy class X::Trait::Unknown is Exception {\n    has $.type;       # is, will, of etc.\n    has $.subtype;    # wrong subtype being tried\n    has $.declaring;  # variable, sub, parameter, etc.\n    method message () {\n        \"Can't use unknown trait '$.type $.subtype' in a$.declaring declaration.\"\n    }\n}\nmy class X::Comp::Trait::Unknown is X::Trait::Unknown does X::Comp { };\n\nmy class X::Trait::NotOnNative is Exception {\n    has $.type;       # is, will, of etc.\n    has $.subtype;    # wrong subtype being tried\n    has $.native;     # type of native (optional)\n    method message () {\n        \"Can't use trait '$.type $.subtype' on a native\"\n          ~ ( $.native ?? \" $.native.\" !! \".\" );\n    }\n}\nmy class X::Comp::Trait::NotOnNative is X::Trait::NotOnNative does X::Comp { };\n\nmy class X::OutOfRange is Exception {\n    has $.what = 'Argument';\n    has $.got = '<unknown>';\n    has $.range = '<unknown>';\n    has $.comment;\n    method message() {\n        $.comment.defined \n           ?? \"$.what out of range. Is: $.got, should be in $.range.gist(); $.comment\"\n           !! \"$.what out of range. Is: $.got, should be in $.range.gist()\"\n    }\n}\n\nmy class X::Buf::AsStr is Exception {\n    has $.method;\n    method message() {\n        \"Cannot use a Buf as a string, but you called the $.method method on it\";\n    }\n}\nmy class X::Buf::Pack is Exception {\n    has $.directive;\n    method message() {\n        \"Unrecognized directive '$.directive'\";\n    }\n}\n\nmy class X::Buf::Pack::NonASCII is Exception {\n    has $.char;\n    method message() {\n        \"non-ASCII character '$.char' while processing an 'A' template in pack\";\n    }\n}\n\nmy class X::Signature::Placeholder does X::Comp {\n    has $.placeholder;\n    method message() {\n        \"Placeholder variable '$.placeholder' cannot override existing signature\";\n    }\n}\n\nmy class X::Placeholder::Block does X::Comp {\n    has $.placeholder;\n    method message() {\n        \"Placeholder variable $.placeholder may not be used here because the surrounding block takes no signature\";\n    }\n}\n\nmy class X::Placeholder::Mainline is X::Placeholder::Block {\n    method message() {\n        \"Cannot use placeholder parameter $.placeholder in the mainline\"\n    }\n}\n\nmy class X::Undeclared does X::Comp {\n    has $.what = 'Variable';\n    has $.symbol;\n    has @.suggestions;\n    method message() {\n        my $message := \"$.what '$.symbol' is not declared\";\n        if +@.suggestions == 1 {\n            $message := \"$message. Did you mean '@.suggestions[0]'?\";\n        } elsif +@.suggestions > 1 {\n            $message := \"$message. Did you mean any of these?\\n    { @.suggestions.join(\"\\n    \") }\\n\";\n        }\n        $message;\n    }\n}\n\nmy class X::Attribute::Undeclared is X::Undeclared {\n    has $.package-kind;\n    has $.package-name;\n\n    method message() {\n        \"Attribute $.symbol not declared in $.package-kind $.package-name\";\n    }\n}\n\nmy class X::Undeclared::Symbols does X::Comp {\n    has %.post_types;\n    has %.unk_types;\n    has %.unk_routines;\n    has %.routine_suggestion;\n    has %.type_suggestion;\n    multi method gist(:$sorry = True) {\n        ($sorry ?? self.sorry_heading() !! \"\") ~ self.message\n    }\n    method message() {\n        sub l(@l) {\n            my @lu = @l.map({ nqp::hllize($_) }).uniq.sort;\n            'used at line' ~ (@lu == 1 ?? ' ' !! 's ') ~ @lu.join(', ')\n        }\n        sub s(@s) {\n            \"Did you mean '{ @s.join(\"', '\") }'?\";\n        }\n        my $r = \"\";\n        if %.post_types {\n            $r ~= \"Illegally post-declared type\" ~ (%.post_types.elems == 1 ?? \"\" !! \"s\") ~ \":\\n\";\n            for %.post_types.sort(*.key) {\n                $r ~= \"    $_.key() &l($_.value)\\n\";\n            }\n        }\n        if %.unk_types {\n            $r ~= \"Undeclared name\" ~ (%.unk_types.elems == 1 ?? \"\" !! \"s\") ~ \":\\n\";\n            for %.unk_types.sort(*.key) {\n                $r ~= \"    $_.key() &l($_.value)\";\n                if +%.type_suggestion{$_.key()} {\n                    $r ~= \". \" ~ s(%.type_suggestion{$_.key()});\n                }\n                $r ~= \"\\n\";\n            }\n        }\n        if %.unk_routines {\n            $r ~= \"Undeclared routine\" ~ (%.unk_routines.elems == 1 ?? \"\" !! \"s\") ~ \":\\n\";\n            for %.unk_routines.sort(*.key) {\n                $r ~= \"    $_.key() &l($_.value)\";\n                if +%.routine_suggestion{$_.key()} {\n                    $r ~= \". \" ~ s(%.routine_suggestion{$_.key()});\n                }\n                $r ~= \"\\n\";\n            }\n        }\n        $r\n    }\n}\n\nmy class X::Redeclaration does X::Comp {\n    has $.symbol;\n    has $.postfix = '';\n    has $.what    = 'symbol';\n    method message() {\n        \"Redeclaration of $.what $.symbol$.postfix\";\n    }\n}\n\nmy class X::Redeclaration::Outer does X::Comp {\n    has $.symbol;\n    method message() {\n        \"Lexical symbol '$.symbol' is already bound to an outer symbol;\\n\" ~\n        \"the implicit outer binding must be rewritten as OUTER::<$.symbol>\\n\" ~\n        \"before you can unambiguously declare a new '$.symbol' in this scope\";\n    }\n}\n\nmy class X::Import::Redeclaration does X::Comp {\n    has @.symbols;\n    has $.source-package-name;\n    method message() {\n        @.symbols == 1\n            ?? \"Cannot import symbol @.symbols[0] from $.source-package-name, because it already exists in this lexical scope\"\n            !! (\"Cannot import the following symbols from $.source-package-name, because they already exist in this lexical scope: \", @.symbols.join(', '));\n    }\n}\n\nmy class X::Import::OnlystarProto does X::Comp {\n    has @.symbols;\n    has $.source-package-name;\n    method message() {\n        @.symbols == 1\n            ?? \"Cannot import symbol @.symbols[0] from $.source-package-name, only onlystar-protos can be merged\"\n            !! (\"Cannot import the following symbols from $.source-package-name, only onlystar-protos can be merged: \", @.symbols.join(', '));\n    }\n}\n\nmy class X::Phaser::Multiple does X::Comp {\n    has $.block;\n    method message() { \"Only one $.block block is allowed\" }\n}\n\nmy class X::Obsolete does X::Comp {\n    has $.old;\n    has $.replacement; # can't call it $.new, collides with constructor\n    has $.when = 'in Perl 6';\n    method message() { \"Unsupported use of $.old; $.when please use $.replacement\" }\n}\n\nmy class X::Parameter::Default does X::Comp {\n    has $.how;\n    has $.parameter;\n    method message() {\n        $.parameter\n            ?? \"Cannot put default on $.how parameter $.parameter\"\n            !! \"Cannot put default on anonymous $.how parameter\";\n    }\n}\n\nmy class X::Parameter::Placeholder does X::Comp {\n    has $.parameter;\n    has $.right;\n    method message() {\n        \"In signature parameter, placeholder variables like $.parameter are illegal\\n\"\n        ~ \"you probably meant a named parameter: '$.right'\";\n    }\n}\n\nmy class X::Parameter::Twigil does X::Comp {\n    has $.parameter;\n    has $.twigil;\n    method message() {\n        \"In signature parameter $.parameter, it is illegal to use the $.twigil twigil\";\n    }\n}\n\nmy class X::Parameter::MultipleTypeConstraints does X::Comp {\n    has $.parameter;\n    method message() {\n        ($.parameter ?? \"Parameter $.parameter\" !! 'A parameter')\n        ~ \" may only have one prefix type constraint\";\n    }\n}\n\nmy class X::Parameter::WrongOrder does X::Comp {\n    has $.misplaced;\n    has $.parameter;\n    has $.after;\n    method message() {\n        \"Cannot put $.misplaced parameter $.parameter after $.after parameters\";\n    }\n}\n\nmy class X::Parameter::InvalidType does X::Comp {\n    has $.typename;\n    has @.suggestions;\n    method message() {\n        my $msg := \"Invalid typename '$.typename' in parameter declaration.\";\n        if +@.suggestions > 0 {\n            $msg := $msg ~ \" Did you mean '\" ~ @.suggestions.join(\"', '\") ~ \"'?\";\n        }\n        return $msg;\n    }\n}\n\nmy class X::Signature::NameClash does X::Comp {\n    has $.name;\n    method message() {\n        \"Name $.name used for more than one named parameter\";\n    }\n}\n\nmy class X::Method::Private::Permission does X::Comp {\n    has $.method;\n    has $.source-package;\n    has $.calling-package;\n    method message() {\n        \"Cannot call private method '$.method' on package $.source-package because it does not trust $.calling-package\";\n    }\n}\n\nmy class X::Method::Private::Unqualified does X::Comp {\n    has $.method;\n    method message() {\n        \"Private method call to $.method must be fully qualified with the package containing the method\";\n    }\n}\n\nmy class X::Bind is Exception {\n    has $.target;\n    method message() {\n        $.target.defined\n            ?? \"Cannot bind to $.target\"\n            !! 'Cannot use bind operator with this left-hand side'\n    }\n}\nmy class X::Bind::NativeType does X::Comp {\n    has $.name;\n    method message() {\n        \"Cannot bind to natively typed variable '$.name'; use assignment instead\"\n    }\n}\nmy class X::Bind::Slice is Exception  {\n    has $.type;\n    method message() {\n        \"Cannot bind to {$.type.^name} slice\";\n    }\n}\nmy class X::Bind::ZenSlice is X::Bind::Slice {\n    method message() {\n        \"Cannot bind to {$.type.^name} zen slice\";\n    }\n}\n\nmy class X::Value::Dynamic does X::Comp {\n    has $.what;\n    method message() { \"$.what value must be known at compile time\" }\n}\n\nmy class X::Syntax::Name::Null does X::Syntax {\n    method message() { 'Name component may not be null'; }\n}\n\nmy class X::Syntax::UnlessElse does X::Syntax {\n    method message() { '\"unless\" does not take \"else\", please rewrite using \"if\"' }\n}\n\nmy class X::Syntax::KeywordAsFunction does X::Syntax {\n    has $.word;\n    has $.needparens;\n    method message {\n        \"Word '$.word' interpreted as '{$.word}()' function call; please use whitespace \"\n            ~ ($.needparens ?? 'around the parens' !! 'instead of parens')\n    }\n}\n\nmy class X::Syntax::Malformed::Elsif does X::Syntax {\n    has $.what = 'else if';\n    method message() { qq{In Perl 6, please use \"elsif' instead of \"$.what\"} }\n}\n\nmy class X::Syntax::Reserved does X::Syntax {\n    has $.reserved;\n    has $.instead = '';\n    method message() { \"The $.reserved is reserved$.instead\" }\n}\n\nmy class X::Syntax::P5 does X::Syntax {\n    method message() { 'This appears to be Perl 5 code' }\n}\n\nmy class X::Syntax::NegatedPair does X::Syntax {\n    has $.key;\n    method message() { \"Argument not allowed on negated pair with key '$.key'\" }\n}\n\nmy class X::Syntax::Variable::Numeric does X::Syntax {\n    has $.what = 'variable';\n    method message() { \"Cannot declare a numeric $.what\" }\n}\n\nmy class X::Syntax::Variable::Match does X::Syntax {\n    method message() { 'Cannot declare a match variable' }\n}\n\nmy class X::Syntax::Variable::Twigil does X::Syntax {\n    has $.twigil;\n    has $.scope;\n    method message() { \"Cannot use $.twigil twigil on $.scope variable\" }\n}\n\nmy class X::Syntax::Variable::IndirectDeclaration does X::Syntax {\n    method message() { 'Cannot declare a variable by indirect name (use a hash instead?)' }\n}\n\nmy class X::Syntax::Augment::WithoutMonkeyTyping does X::Syntax {\n    method message() { \"augment not allowed without 'use MONKEY_TYPING'\" };\n}\n\nmy class X::Syntax::Augment::Illegal does X::Syntax {\n    has $.package;\n    method message() { \"Cannot augment $.package because it is closed\" };\n}\n\nmy class X::Syntax::Argument::MOPMacro does X::Syntax {\n    has $.macro;\n    method message() { \"Cannot give arguments to $.macro\" };\n}\n\nmy class X::Does::TypeObject is Exception {\n    method message() { \"Cannot use 'does' operator with a type object.\" }\n}\n\nmy class X::Role::Initialization is Exception {\n    has $.role;\n    method message() { \"Can only supply an initialization value for a role if it has a single public attribute, but this is not the case for '{$.role.^name}'\" }\n}\n\nmy class X::Syntax::Comment::Embedded does X::Syntax {\n    method message() { \"Opening bracket required for #` comment\" }\n}\n\nmy class X::Syntax::Pod::BeginWithoutIdentifier does X::Syntax does X::Pod {\n    method message() {\n        '=begin must be followed by an identifier; (did you mean \"=begin pod\"?)'\n    }\n}\n\nmy class X::Syntax::Pod::BeginWithoutEnd does X::Syntax does X::Pod {\n    method message() { '=begin without matching =end' }\n}\n\nmy class X::Syntax::Confused does X::Syntax {\n    has $.reason = 'unknown';\n    method message() { $.reason eq 'unknown' ?? 'Confused' !! $.reason }\n}\n\nmy class X::Syntax::Malformed does X::Syntax {\n    has $.what;\n    method message() { \"Malformed $.what\" }\n}\nmy class X::Syntax::Missing does X::Syntax {\n    has $.what;\n    method message() { \"Missing $.what\" }\n}\n\nmy class X::Syntax::Perl5Var does X::Syntax {\n    has $.name;\n    my %m =\n      '$*'  => '^^ and $$',\n      '$\"'  => '.join() method',\n      '$$'  => '$*PID',\n      '$('  => '$*GID',\n      '$)'  => '$*EGID',\n      '$<'  => '$*UID',\n      '$>'  => '$*EUID',\n      '$;'  => 'real multidimensional hashes',\n      '$&'  => '$<>',\n      '$`'  => 'explicit pattern before <(',\n      '$\\'' => 'explicit pattern after )>',\n      '$,'  => '$*OUT.output_field_separator()',\n      '$.'  => \"the filehandle's .line method\",\n      '$\\\\' => \"the filehandle's .ors attribute\",\n      '$|'  => ':autoflush on open',\n      '$?'  => '$! for handling child errors also',\n      '$@'  => '$!',\n      '$#'  => '.fmt',\n      '$['  => 'user-defined array indices',\n      '$]'  => '$*PERL_VERSION',\n\n      '$^C' => 'COMPILING namespace',\n      '$^D' => '$*DEBUGGING',\n      '$^E' => '$!.extended_os_error',\n      '$^F' => '$*SYSTEM_FD_MAX',\n      '$^H' => '$?FOO variables',\n      '$^I' => '$*INPLACE',\n      '$^M' => 'a global form such as $*M',\n      '$^N' => '$/[*-1]',\n      '$^O' => '$?OS or $*OS',\n      '$^R' => 'an explicit result variable',\n      '$^S' => 'context function',\n      '$^T' => '$*BASETIME',\n      '$^V' => '$*PERL_VERSION',\n      '$^W' => '$*WARNING',\n      '$^X' => '$*EXECUTABLE_NAME',\n\n      '$:'  => 'Form module',\n      '$-'  => 'Form module',\n      '$+'  => 'Form module',\n      '$='  => 'Form module',\n      '$%'  => 'Form module',\n      '$^'  => 'Form module',\n      '$~'  => 'Form module',\n      '$^A' => 'Form module',\n      '$^L' => 'Form module',\n\n      '@-'  => '.from method',\n      '@+'  => '.to method',\n\n      '%-'  => '.from method',\n      '%+'  => '.to method',\n      '%^H' => '$?FOO variables',\n    ;\n    method message() {\n        my $v = $.name ~~ m/ <[ $ @ % & ]> [ \\^ <[ A..Z ]> | \\W ] /;\n        $v\n          ?? %m{~$v}\n            ?? \"Unsupported use of $v variable; in Perl 6 please use {%m{~$v}}\"\n            !! \"Unsupported use of $v variable\"\n          !! 'Non-declarative sigil is missing its name';\n    }\n}\n\nmy class X::Syntax::Self::WithoutObject does X::Syntax {\n    method message() { \"'self' used where no object is available\" }\n}\nmy class X::Syntax::VirtualCall does X::Syntax {\n    has $.call;\n    method message() { \"Virtual call $.call may not be used on partially constructed objects\" }\n}\nmy class X::Syntax::NoSelf does X::Syntax {\n    has $.variable;\n    method message() { \"Variable $.variable used where no 'self' is available\" }\n}\n\nmy class X::Syntax::Number::RadixOutOfRange does X::Syntax {\n    has $.radix;\n    method message() { \"Radix $.radix out of range (allowed: 2..36)\" }\n}\n\nmy class X::Syntax::NonAssociative does X::Syntax {\n    has $.left;\n    has $.right;\n    method message() {\n        \"Operators '$.left' and '$.right' are non-associative and require parenthesis\";\n    }\n}\n\nmy class X::Syntax::Regex::Adverb does X::Syntax {\n    has $.adverb;\n    has $.construct;\n    method message() { \"Adverb $.adverb not allowed on $.construct\" }\n}\n\nmy class X::Syntax::Regex::UnrecognizedMetachar does X::Syntax {\n    has $.metachar;\n    method message() { \"Unrecognized regex metacharacter $.metachar (must be quoted to match literally)\" }\n}\n\nmy class X::Syntax::Regex::NullRegex does X::Syntax {\n    method message() { 'Null regex not allowed' }\n}\n\nmy class X::Syntax::Signature::InvocantMarker does X::Syntax {\n    method message() {\n        \"Can only use : as invocant marker in a signature after the first parameter\"\n    }\n}\n\nmy class X::Syntax::Extension::Category does X::Syntax {\n    has $.category;\n    method message() {\n        \"Cannot add tokens of category '$.category'\";\n    }\n}\n\nmy class X::Syntax::Extension::Null does X::Syntax {\n    method message() {\n        \"Null operator is not allowed\";\n    }\n}\n\nmy class X::Syntax::InfixInTermPosition does X::Syntax {\n    has $.infix;\n    method message() {\n        \"Preceding context expects a term, but found infix $.infix instead\";\n    }\n}\n\nmy class X::Attribute::Package does X::Comp {\n    has $.package-kind;\n    has $.name;\n    method message() { \"A $.package-kind cannot have attributes, but you tried to declare '$.name'\" }\n}\nmy class X::Attribute::NoPackage does X::Comp {\n    has $.name;\n    method message() { \"You cannot declare attribute '$.name' here; maybe you'd like a class or a role?\" }\n}\nmy class X::Declaration::Scope does X::Comp {\n    has $.scope;\n    has $.declaration;\n    method message() { \"Cannot use '$.scope' with $.declaration declaration\" }\n}\n\nmy class X::Declaration::Scope::Multi is X::Declaration::Scope {\n    method message() {\n        \"Cannot use '$.scope' with individual multi candidates. Please declare an {$.scope}-scoped proto instead\";\n    }\n}\n\nmy class X::Anon::Multi does X::Comp {\n    has $.multiness;\n    has $.routine-type = 'routine';\n    method message() { \"Cannot put $.multiness on anonymous $.routine-type\" }\n}\nmy class X::Anon::Augment does X::Comp {\n    has $.package-kind;\n    method message() { \"Cannot augment anonymous $.package-kind\" }\n}\nmy class X::Augment::NoSuchType does X::Comp {\n    has $.package-kind;\n    has $.package;\n    method message() { \"You tried to augment $.package-kind $.package, but it does not exist\" }\n}\n\nmy class X::Routine::Unwrap is Exception {\n    method message() { \"Cannot unwrap routine: invalid wrap handle\" }\n}\n\nmy class X::Constructor::Positional is Exception {\n    has $.type;\n    method message() { \"Default constructor for '\" ~ $.type.^name ~ \"' only takes named arguments\" }\n}\n\nmy class X::Hash::Store::OddNumber is Exception {\n    method message() { \"Odd number of elements found where hash expected\" }\n}\n\nmy class X::Package::Stubbed does X::Comp {\n    has @.packages;\n    # TODO: suppress display of line number\n    method message() {\n        \"The following packages were stubbed but not defined:\\n    \"\n        ~ @.packages.join(\"\\n    \");\n    }\n}\n\nmy class X::Phaser::PrePost is Exception {\n    has $.phaser = 'PRE';\n    has $.condition;\n    method message {\n        my $what = $.phaser eq 'PRE' ?? 'Precondition' !! 'Postcondition';\n        $.condition.defined\n            ?? \"$what '$.condition.trim()' failed\"\n            !! \"$what failed\";\n    }\n}\n\nmy class X::Str::Numeric is Exception {\n    has $.source;\n    has $.pos;\n    has $.reason;\n    method source-indicator {\n        constant marker = chr(0x23CF);\n        join '', \"in '\",\n                $.source.substr(0, $.pos),\n                marker,\n                $.source.substr($.pos),\n                \"' (indicated by \",\n                marker,\n                \")\",\n                ;\n    }\n    method message() {\n        \"Cannot convert string to number: $.reason $.source-indicator\";\n    }\n}\n\nmy class X::Str::Match::x is Exception {\n    has $.got;\n    method message() {\n        \"in Str.match, got invalid value of type {$.got.^name} for :x, must be Int or Range\"\n    }\n}\n\nmy class X::Str::Trans::IllegalKey is Exception {\n    has $.key;\n    method message {\n        \"in Str.trans, got illegal substitution key of type {$.key.^name} (should be a Regex or Str)\"\n    }\n}\nmy class X::Str::Trans::InvalidArg is Exception {\n    has $.got;\n    method message() {\n        \"Only Pair objects are allowed as arguments to Str.trans, got {$.got.^name}\";\n    }\n}\n\nmy class X::Range::InvalidArg is Exception {\n    has $.got;\n    method message() {\n        \"{$.got.^name} objects are not valid endpoints for Ranges\";\n    }\n}\n\nmy class X::Sequence::Deduction is Exception {\n    method message() { 'Unable to deduce sequence' }\n}\n\nmy class X::Backslash::UnrecognizedSequence does X::Syntax {\n    has $.sequence;\n    method message() { \"Unrecognized backslash sequence: '\\\\$.sequence'\" }\n}\n\nmy class X::Backslash::NonVariableDollar does X::Syntax {\n    method message() { \"Non-variable \\$ must be backslashed\" }\n}\n\nmy class X::ControlFlow is Exception {\n    has $.illegal;   # something like 'next'\n    has $.enclosing; # ....  outside a loop\n\n    method message() { \"$.illegal without $.enclosing\" }\n}\nmy class X::ControlFlow::Return is X::ControlFlow {\n    method illegal()   { 'return'  }\n    method enclosing() { 'Routine' }\n    method message()   { 'Attempt to return outside of any Routine' }\n}\n\nmy class X::Composition::NotComposable does X::Comp {\n    has $.target-name;\n    has $.composer;\n    method message() {\n        $.composer.^name ~ \" is not composable, so $.target-name cannot compose it\";\n    }\n}\n\nmy class X::TypeCheck is Exception {\n    has $.operation;\n    has $.got;\n    has $.expected;\n    method message() {\n        \"Type check failed in $.operation; expected '{$.expected.^name}' but got '{$.got.^name}'\";\n\n    }\n}\n\nmy class X::TypeCheck::Binding is X::TypeCheck {\n    method operation { 'binding' }\n}\nmy class X::TypeCheck::Return is X::TypeCheck {\n    method operation { 'returning' }\n    method message() {\n        \"Type check failed for return value; expected '{$.expected.^name}' but got '{$.got.^name}'\";\n    }\n}\nmy class X::TypeCheck::Assignment is X::TypeCheck {\n    has $.symbol;\n    method operation { 'assignment' }\n    method message {\n        $.symbol.defined\n            ?? \"Type check failed in assignment to '$.symbol'; expected '{$.expected.^name}' but got '{$.got.^name}'\"\n            !! \"Type check failed in assignment; expected '{$.expected.^name}' but got '{$.got.^name}'\";\n    }\n}\nmy class X::TypeCheck::Argument is X::TypeCheck {\n    has $.protoguilt;\n    has @.arguments;\n    has $.objname;\n    has $.signature;\n    method message { \n            ($.protoguilt ?? \"Calling proto of '\" !! \"Calling '\") ~\n            $.objname ~ \"' \" ~\n            (+@.arguments == 0\n              ?? \"requires arguments\\n\"\n              !! \"will never work with argument types (\" ~ join(', ', @.arguments) ~ \")\\n\") \n            ~ $.signature \n    }\n}\n\nmy class X::TypeCheck::Splice is X::TypeCheck does X::Comp {\n    has $.action;\n    method message {\n        \"Type check failed in {$.action}; expected {$.expected.^name} but got {$.got.^name}\";\n    }\n\n}\n\nmy class X::Assignment::RO is Exception {\n    method message {\n        \"Cannot modify an immutable value\";\n    }\n}\n\nmy class X::Immutable is Exception {\n    has $.typename;\n    has $.method;\n    method message {\n        \"Cannot call '$.method' on an immutable '$.typename'\";\n    }\n}\n\nmy class X::NoDispatcher is Exception {\n    has $.redispatcher;\n    method message() {\n        \"$.redispatcher is not in the dynamic scope of a dispatcher\";\n    }\n}\n\nmy class X::Localizer::NoContainer is Exception {\n    has $.localizer;\n    method message() {\n        \"Can only use '$.localizer' on a container\";\n    }\n}\n\nmy class X::Mixin::NotComposable is Exception {\n    has $.target;\n    has $.rolish;\n    method message() {\n        \"Cannot mix in non-composable type {$.rolish.^name} into object of type {$.target.^name}\";\n    }\n}\n\nmy class X::Inheritance::Unsupported does X::Comp {\n    # note that this exception is thrown before the child type object\n    # has been composed, so it's useless to carry it around. Use the\n    # name instead.\n    has $.child-typename;\n    has $.parent;\n    method message {\n        $.parent.^name ~ ' does not support inheritance, so '\n        ~ $.child-typename ~ ' cannot inherit from it';\n    }\n}\n\nmy class X::Inheritance::UnknownParent is Exception {\n    has $.child;\n    has $.parent;\n    has @.suggestions is rw;\n\n    method message {\n        my $message := \"'\" ~ $.child ~ \"' cannot inherit from '\" ~ $.parent ~ \"' because it is unknown.\";\n        if +@.suggestions > 1 {\n            $message := $message ~ \"\\nDid you mean one of these?\\n    '\" ~ @.suggestions.join(\"'\\n    '\") ~ \"'\\n\";\n        } elsif +@.suggestions == 1 {\n            $message := $message ~ \"\\nDid you mean '\" ~ @.suggestions[0] ~ \"'?\\n\";\n        }\n        return $message;\n    }\n}\n\nmy class X::Inheritance::SelfInherit is Exception {\n    has $.name;\n\n    method message {\n        \"'$.name' cannot inherit from itself.\"\n    }\n}\n\nmy class X::Export::NameClash does X::Comp {\n    has $.symbol;\n    method message() {\n        \"A symbol '$.symbol' has already been exported\";\n    }\n}\n\nmy class X::HyperOp::NonDWIM is Exception {\n    has &.operator;\n    has $.left-elems;\n    has $.right-elems;\n    method message() {\n        \"Lists on both side of non-dwimmy hyperop of &.operator.name() are not of the same length\\n\"\n        ~ \"left: $.left-elems elements, right: $.right-elems elements\"; \n    }\n}\n\nmy class X::Set::Coerce is Exception {\n    has $.thing;\n    method message {\n        \"Cannot coerce object of type {$.thing.^name} to Set. To create a one-element set, pass it to the 'set' function\";\n    }\n}\n\n\nmy role X::Temporal is Exception { }\nmy class X::Temporal::InvalidFormat does X::Temporal {\n    has $.invalid-str;\n    has $.target = 'Date';\n    has $.format;\n    method message() {\n        \"Invalid $.target string '$.invalid-str'; use $.format instead\";\n    }\n}\nmy class X::DateTime::TimezoneClash does X::Temporal {\n    method message() {\n        'DateTime.new(Str): :timezone argument not allowed with a timestamp offset';\n    }\n}\nmy class X::DateTime::InvalidDeltaUnit does X::Temporal {\n    has $.unit;\n    method message() {\n        \"Cannnot use unit $.unit with Date.delta\";\n    }\n}\n\nmy class X::Eval::NoSuchLang is Exception {\n    has $.lang;\n    method message() {\n        \"No compiler available for language '$.lang'\";\n    }\n}\n\nmy class X::Import::MissingSymbols is Exception {\n    has $.from;\n    has @.missing;\n    method message() {\n        \"Trying to import from '$.from', but the following symbols are missing: \"\n            ~ @.missing.join(', ');\n    }\n}\n\nmy class X::Numeric::Real is Exception {\n    has $.target;\n    has $.reason;\n    has $.source;\n\n    method message() {\n        \"Can not convert $.source to {$.target.^name}: $.reason\";\n    }\n}\n\nmy class X::Numeric::DivideByZero is Exception {\n    has $.using;\n    method message() {\n        \"Divide by zero\" ~ ( $.using ?? \" using $.using\" !! '' );\n    }\n}\n\nmy class X::PseudoPackage::InDeclaration does X::Comp {\n    has $.pseudo-package;\n    has $.action;\n    method message() {\n        \"Cannot use pseudo package $.pseudo-package in $.action\";\n    }\n}\n\nmy class X::NoSuchSymbol is Exception {\n    has $.symbol;\n    method message { \"No such symbol '$.symbol'\" }\n}\n\nmy class X::Item is Exception {\n    has $.aggregate;\n    has $.index;\n    method message { \"Cannot index {$.aggregate.^name} with $.index\" }\n}\n\nmy class X::Multi::Ambiguous is Exception {\n    has $.dispatcher;\n    has @.ambiguous;\n    method message {\n        join \"\\n\",\n            \"Ambiguous call to '$.dispatcher.name()'; these signatures all match:\",\n            @.ambiguous.map(*.signature.perl)\n    }\n}\n\nmy class X::Multi::NoMatch is Exception {\n    has $.dispatcher;\n    method message {\n        join \"\\n\",\n            \"Cannot call '$.dispatcher.name()'; none of these signatures match:\",\n            $.dispatcher.dispatchees.map(*.signature.perl)\n    }\n}\n\nmy class X::Caller::NotDynamic is Exception {\n    has $.symbol;\n    method message() {\n        \"Cannot access '$.symbol' through CALLER, because it is not declared as dynamic\";\n    }\n}\n\n{\n    my %c_ex;\n    %c_ex{'X::TypeCheck::Binding'} := sub ($got, $expected) is hidden_from_backtrace {\n            X::TypeCheck::Binding.new(:$got, :$expected).throw;\n        };\n    %c_ex<X::TypeCheck::Assignment> := sub ($symbol, $got, $expected) is hidden_from_backtrace {\n            X::TypeCheck::Assignment.new(:$symbol, :$got, :$expected).throw;\n        };\n    %c_ex{'X::TypeCheck::Return'} := sub ($got, $expected) is hidden_from_backtrace {\n            X::TypeCheck::Return.new(:$got, :$expected).throw;\n        };\n    %c_ex<X::Assignment::RO> := sub () is hidden_from_backtrace {\n            X::Assignment::RO.new.throw;\n        };\n    %c_ex{'X::ControlFlow::Return'} := sub () is hidden_from_backtrace {\n            X::ControlFlow::Return.new().throw;\n        };\n    %c_ex{'X::NoDispatcher'} := sub ($redispatcher) is hidden_from_backtrace {\n            X::NoDispatcher.new(:$redispatcher).throw;\n        };\n    %c_ex{'X::Multi::Ambiguous'} := sub ($dispatcher, @ambiguous) is hidden_from_backtrace {\n            X::Multi::Ambiguous.new(:$dispatcher, :@ambiguous).throw\n        };\n    %c_ex{'X::Multi::NoMatch'} := sub ($dispatcher) is hidden_from_backtrace {\n            X::Multi::NoMatch.new(:$dispatcher).throw\n        };\n    my Mu $parrot_c_ex := nqp::getattr(%c_ex, EnumMap, '$!storage');\n    nqp::bindcurhllsym('P6EX', $parrot_c_ex);\n    \n    0;\n}\n\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/List.pm",
    "content": "# for our tantrums\nmy class X::TypeCheck { ... }\nmy role Supply { ... }\n\nmy sub combinations($n, $k) {\n    my @result;\n    my @stack;\n\n    return ([],) unless $k;\n\n    @stack.push(0);\n    gather while @stack {\n        my $index = @stack - 1;\n        my $value = @stack.pop;\n\n        while $value < $n {\n            @result[$index++] = $value++;\n            @stack.push($value);\n            if $index == $k {\n                take [@result];\n                $value = $n;  # fake a last\n            }\n        }\n    }\n}\n\nmy sub permutations(Int $n) {\n    $n == 1 ?? ( [0,] ) !!\n    gather for ^$n -> $i {\n        my @i = grep none($i), ^$n;\n        take [$i, @i[@$_]] for permutations($n - 1);\n    }\n}\n\nmy class List does Positional { # declared in BOOTSTRAP\n    # class List is Iterable is Cool\n    #   has Mu $!items;        # VM's array of our reified elements\n    #   has Mu $!flattens;     # true if this list flattens its parcels\n    #   has Mu $!nextiter;     # iterator for generating remaining elements\n\n    method new(|) {\n        my Mu $args := nqp::p6argvmarray();\n        nqp::shift($args);\n\n        nqp::p6list($args, self.WHAT, Mu);\n    }\n\n    multi method Bool(List:D:)    { self.gimme(1).Bool }\n    multi method Int(List:D:)     { self.elems }\n    multi method end(List:D:)     { self.elems - 1 }\n    multi method Numeric(List:D:) { self.elems }\n    multi method Str(List:D:)     { self.join(' ') }\n\n    # Pretend we're a Match assuming we're a list of Matches\n    method to()         { self.elems ?? self[self.end].to !! Nil }\n    method from()       { self.elems ?? self[0].from !! Nil }\n\n    method fmt($format = '%s', $separator = ' ') {\n        self.map({ .fmt($format) }).join($separator);\n    }\n\n    method flat() { self.flattens\n                    ?? self\n                    !! nqp::p6list(nqp::list(self), List, Bool::True)\n    }\n    method list() { self }\n    method lol() {\n        self.gimme(0);\n        my Mu $rpa := nqp::clone($!items);\n        nqp::push($rpa, $!nextiter) if $!nextiter.defined;\n        nqp::p6list($rpa, LoL, Mu);\n    }\n\n    method flattens() { $!flattens }\n\n    method Capture() {\n        self.gimme(*);\n        my $cap := nqp::create(Capture);\n        nqp::bindattr($cap, Capture, '$!list', $!items);\n        $cap\n    }\n\n    method Parcel() {\n        my Mu $rpa := nqp::clone(nqp::p6listitems(self));\n        nqp::push($rpa, $!nextiter) if $!nextiter.defined;\n        nqp::p6parcel($rpa, Any);\n    }\n\n    method Supply(List:D:) { Supply.from-list(self) }\n\n    multi method at_pos(List:D: int \\pos) is rw {\n        fail X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>)\n          if nqp::islt_i(pos,0);\n        self.exists_pos(pos) ?? nqp::atpos($!items,pos) !! Nil;\n    }\n    multi method at_pos(List:D: Int:D \\pos) is rw {\n        my int $pos = nqp::unbox_i(pos);\n        fail X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>)\n          if nqp::islt_i($pos,0);\n        self.exists_pos($pos) ?? nqp::atpos($!items,$pos) !! Nil;\n    }\n\n    method eager() { self.gimme(*); self }\n\n    method elems() {\n        return 0 unless self.DEFINITE;\n        return nqp::elems(nqp::p6listitems(self)) unless nqp::defined($!nextiter);\n        # Get as many elements as we can.  If gimme stops before\n        # reaching the end of the list, assume the list is infinite.\n        my $n := self.gimme(*);\n        nqp::defined($!nextiter) ?? Inf !! $n\n    }\n\n    multi method exists_pos(List:D: int $pos) {\n        return False if nqp::islt_i($pos,0);\n        self.gimme($pos + 1);\n        nqp::p6bool(\n          nqp::not_i(nqp::isnull(nqp::atpos($!items,$pos)))\n        );\n    }\n    multi method exists_pos(List:D: Int:D $pos) {\n        return False if $pos < 0;\n        self.gimme($pos + 1);\n        nqp::p6bool(\n          nqp::not_i(nqp::isnull(nqp::atpos($!items,nqp::unbox_i($pos))))\n        );\n    }\n\n    method gimme($n, :$sink) {\n        return unless self.DEFINITE;\n        # loop through iterators until we have at least $n elements\n        my int $count = nqp::elems(nqp::p6listitems(self));\n        if nqp::istype($n, Whatever) || nqp::istype($n, Num) && nqp::istrue($n == Inf) {\n            while $!nextiter.DEFINITE && !$!nextiter.infinite {\n                $!nextiter.reify(*, :$sink);\n                $count = nqp::elems($!items);\n            }\n        }\n        else {\n            my int $target = $n.Int;\n            while nqp::isconcrete($!nextiter) && $count < $target {\n                $!nextiter.reify($target - $count, :$sink);\n                $count = nqp::elems($!items);\n            }\n        }\n\n        # return the number of elements we have now\n        $count\n    }\n\n    multi method infinite(List:D:) { $!nextiter.infinite }\n\n    method iterator() {\n        # Return a reified ListIter containing our currently reified elements\n        # and any subsequent iterator.\n        my $iter := nqp::create(ListIter);\n        nqp::bindattr($iter, ListIter, '$!nextiter', $!nextiter);\n        nqp::bindattr($iter, ListIter, '$!reified', self.Parcel());\n        $iter;\n    }\n\n    method munch($n is copy) {\n        $n = 0 if $n < 0;\n        $n = self.gimme($n) if nqp::not_i(nqp::istype($n, Int))\n                               || nqp::not_i(nqp::islist($!items))\n                               || nqp::islt_i(nqp::elems($!items), nqp::unbox_i($n));\n        nqp::p6parcel(\n            nqp::p6shiftpush(nqp::list(), $!items, nqp::unbox_i($n)),\n            Any\n        )\n    }\n\n    proto method pick(|) { * }\n    multi method pick() {\n        fail \"Cannot .pick from infinite list\" if self.infinite;\n        my $elems = self.elems;\n        $elems ?? self.at_pos($elems.rand.floor) !! Nil;\n    }\n    multi method pick($n is copy) {\n        fail \"Cannot .pick from infinite list\" if self.infinite;\n        ## We use a version of Fisher-Yates shuffle here to\n        ## replace picked elements with elements from the end\n        ## of the list, resulting in an O(n) algorithm.\n        my $elems = self.elems;\n        return unless $elems;\n        $n = Inf if nqp::istype($n, Whatever);\n        $n = $elems if $n > $elems;\n        return self.at_pos($elems.rand.floor) if $n == 1;\n        my Mu $rpa := nqp::clone($!items);\n        my $i;\n        my Mu $v;\n        gather while $n > 0 {\n            $i = nqp::rand_I(nqp::decont($elems), Int);\n            $elems--; $n--;\n            $v := nqp::atpos($rpa, nqp::unbox_i($i));\n            # replace selected element with last unpicked one\n            nqp::bindpos($rpa, nqp::unbox_i($i),\n                         nqp::atpos($rpa, nqp::unbox_i($elems)));\n            take-rw $v;\n        }\n    }\n\n    method pop() is parcel {\n        my $elems = self.gimme(*);\n        fail 'Cannot .pop from an infinite list' if $!nextiter.defined;\n        $elems > 0\n          ?? nqp::pop($!items)\n          !! fail 'Element popped from empty list';\n    }\n\n    method shift() is parcel {\n        # make sure we have at least one item, then shift+return it\n        nqp::islist($!items) && nqp::existspos($!items, 0) || self.gimme(1)\n          ?? nqp::shift($!items)\n          !! fail 'Element shifted from empty list';\n    }\n\n    my &list_push = multi method push(List:D: *@values) {\n        fail 'Cannot .push an infinite list' if @values.infinite;\n        nqp::p6listitems(self);\n        my $elems = self.gimme(*);\n        fail 'Cannot .push to an infinite list' if $!nextiter.DEFINITE;\n\n        # push is always eager\n        @values.gimme(*);\n\n        # need type checks?\n        my $of := self.of;\n\n        unless $of =:= Mu {\n            X::TypeCheck.new(\n              operation => '.push',\n              expected  => $of,\n              got       => $_,\n            ).throw unless nqp::istype($_, $of) for @values;\n        }\n\n        nqp::splice($!items,\n                nqp::getattr(@values, List, '$!items'),\n                $elems, 0);\n\n        self;\n    }\n\n    multi method push(List:D: \\value) {\n        if nqp::iscont(value) || nqp::not_i(nqp::istype(value, Iterable)) && nqp::not_i(nqp::istype(value, Parcel)) {\n            $!nextiter.DEFINITE && self.gimme(*);\n            fail 'Cannot .push to an infinite list' if $!nextiter.DEFINITE;\n            nqp::p6listitems(self);\n            nqp::istype(value, self.of)\n                ?? nqp::push($!items, nqp::assign(nqp::p6scalarfromdesc(nqp::null), value))\n                !! X::TypeCheck.new(\n                      operation => '.push',\n                      expected  => self.of,\n                      got       => value,\n                    ).throw;\n            self\n        }\n        else {\n            list_push(self, value)\n        }\n    }\n\n    multi method unshift(List:D: \\value) {\n        if nqp::iscont(value) || !(nqp::istype(value, Iterable) || nqp::istype(value, Parcel)) {\n            nqp::p6listitems(self);\n            value.gimme(*) if nqp::istype(value, List); # fixes #121994\n            nqp::istype(value, self.of)\n                ?? nqp::unshift($!items, my $ = value)\n                !! X::TypeCheck.new(\n                      operation => '.push',\n                      expected  => self.of,\n                      got       => value,\n                    ).throw;\n            self\n        }\n        else {\n            callsame();\n        }\n    }\n\n    multi method unshift(List:D: *@values) {\n        fail 'Cannot .unshift an infinite list' if @values.infinite;\n        nqp::p6listitems(self);\n\n        # don't bother with type checks\n        my $of := self.of;\n        if ( $of =:= Mu ) {\n            nqp::unshift($!items, @values.pop) while @values;\n        }\n\n        # we must check types\n        else {\n            while @values {\n                my $value := @values.pop;\n                if nqp::istype($value, $of) {\n                    nqp::unshift($!items, $value);\n                }\n\n                # huh?\n                else {\n                    X::TypeCheck.new(\n                      operation => '.unshift',\n                      expected  => $of,\n                      got       => $value,\n                    ).throw;\n                }\n            }\n        }\n\n        self\n    }\n\n    method plan(List:D: |args) {\n        nqp::p6listitems(self);\n        my $elems = self.gimme(*);\n        fail 'Cannot add plan to an infinite list' if $!nextiter.defined;\n\n#        # need type checks?\n#        my $of := self.of;\n#\n#        unless $of =:= Mu {\n#            X::TypeCheck.new(\n#              operation => '.push',\n#              expected  => $of,\n#              got       => $_,\n#            ).throw unless nqp::istype($_, $of) for @values;\n#        }\n\n        nqp::bindattr(self, List, '$!nextiter', nqp::p6listiter(nqp::list(args.list), self));\n        Nil;\n    }\n\n    proto method roll(|) { * }\n    multi method roll() {\n        fail \"Cannot .roll from infinite list\" if self.infinite;\n        my $elems = self.elems;\n        $elems ?? self.at_pos($elems.rand.floor) !! Nil;\n    }\n    multi method roll($n is copy) {\n        fail \"Cannot .roll from infinite list\" if self.infinite;\n        my $elems = self.elems;\n        return unless $elems;\n        $n = Inf if nqp::istype($n, Whatever);\n        return self.at_pos($elems.rand.floor) if $n == 1;\n\n        gather while $n > 0 {\n            take nqp::atpos($!items, nqp::unbox_i($elems.rand.floor.Int));\n            $n--;\n        }\n    }\n\n    method reverse() {\n        self.gimme(*);\n        fail 'Cannot .reverse from an infinite list' if $!nextiter.defined;\n        my Mu $rev  := nqp::list();\n        my Mu $orig := nqp::clone($!items);\n        nqp::push($rev, nqp::pop($orig)) while $orig;\n        my $rlist := nqp::create(self.WHAT);\n        nqp::bindattr($rlist, List, '$!items', $rev);\n        $rlist;\n    }\n\n    method rotate(Int $n is copy = 1) {\n        self.gimme(*);\n        fail 'Cannot .rotate an infinite list' if $!nextiter.defined;\n        my $items = nqp::p6box_i(nqp::elems($!items));\n        return self if !$items;\n\n        $n %= $items;\n        return self if $n == 0;\n\n        my Mu $res := nqp::clone($!items);\n        if $n > 0 {\n            nqp::push($res, nqp::shift($res)) while $n--;\n        }\n        elsif $n < 0 {\n            nqp::unshift($res, nqp::pop($res)) while $n++;\n        }\n        my $rlist := nqp::create(self.WHAT);\n        nqp::bindattr($rlist, List, '$!items', $res);\n        $rlist;\n    }\n\n    method splice($offset = 0, $size?, *@values) {\n        self.gimme(*);\n        my $o = $offset;\n        my $s = $size;\n        my $elems = self.elems;\n        $o = $o($elems) if nqp::istype($o, Callable);\n        X::OutOfRange.new(\n            what => 'offset argument to List.splice',\n            got  => $offset,\n            range => (0..^self.elems),\n        ).fail if $o < 0;\n        $s //= self.elems - ($o min $elems);\n        $s = $s(self.elems - $o) if nqp::istype($s, Callable);\n        X::OutOfRange.new(\n            what => 'size argument to List.splice',\n            got  => $size,\n            range => (0..^(self.elems - $o)),\n        ).fail if $s < 0;\n\n        my @ret = self[$o..($o + $s - 1)];\n        nqp::splice($!items,\n                    nqp::getattr(@values.eager, List, '$!items'),\n                    $o.Int, $s.Int);\n        @ret;\n    }\n\n    method sort($by = &infix:<cmp>) {\n        fail 'Cannot .sort an infinite list' if self.infinite; #MMD?\n\n        # Instead of sorting elements directly, we sort a Parcel of\n        # indices from 0..^$list.elems, then use that Parcel as\n        # a slice into self. This is for historical reasons: on\n        # Parrot we delegate to RPA.sort. The JVM implementation\n        # uses a Java collection sort. MoarVM has its sort algorithm\n        # implemented in NQP.\n\n        # nothing to do here\n        my $elems := self.elems;\n        return self if $elems < 2;\n\n        # Range is currently optimized for fast Parcel construction.\n        my $index := Range.new(0, $elems, :excludes-max).reify(*);\n        my Mu $index_rpa := nqp::getattr($index, Parcel, '$!storage');\n\n        # if $by.arity < 2, then we apply the block to the elements\n        # for sorting.\n        if ($by.?count // 2) < 2 {\n            my $list = self.map($by).eager;\n            nqp::p6sort($index_rpa, -> $a, $b { $list.at_pos($a) cmp $list.at_pos($b) || $a <=> $b });\n        }\n        else {\n            my $list = self.eager;\n            nqp::p6sort($index_rpa, -> $a, $b { $by($list.at_pos($a), $list.at_pos($b)) || $a <=> $b });\n        }\n        self[$index];\n    }\n\n    multi method ACCEPTS(List:D: $topic) { self }\n\n    method uniq(|c) {\n        DEPRECATED('unique', |<2014.11 2015.11>);\n        self.unique(|c);\n    }\n\n    proto method unique(|) {*}\n    multi method unique() {\n        my $seen := nqp::hash();\n        my str $target;\n        gather for @.list {\n            $target = nqp::unbox_s($_.WHICH);\n            unless nqp::existskey($seen, $target) {\n                nqp::bindkey($seen, $target, 1);\n                take $_;\n            }\n        }\n    }\n    multi method unique( :&as!, :&with! ) {\n        my @seen = \"should be Mu, but doesn't work in settings :-(\"\n        my Mu $target;\n        gather for @.list {\n            $target = &as($_);\n            if first( { with($target,$_) }, @seen ) =:= Nil {\n                @seen.push($target);\n                take $_;\n            }\n        };\n    }\n    multi method unique( :&as! ) {\n        my $seen := nqp::hash();\n        my str $target;\n        gather for @.list {\n            $target = &as($_).WHICH;\n            unless nqp::existskey($seen, $target) {\n                nqp::bindkey($seen, $target, 1);\n                take $_;\n            }\n        }\n    }\n    multi method unique( :&with! ) {\n        nextwith() if &with === &[===]; # use optimized version\n\n        my @seen;  # should be Mu, but doesn't work in settings :-(\n        my Mu $target;\n        gather for @.list {\n            $target := $_;\n            if first( { with($target,$_) }, @seen ) =:= Nil {\n                @seen.push($target);\n                take $_;\n            }\n        }\n    }\n\n    my @secret;\n    proto method squish(|) {*}\n    multi method squish( :&as!, :&with = &[===] ) {\n        my $last = @secret;\n        my str $which;\n        gather for @.list {\n            $which = &as($_).Str;\n            unless with($which,$last) {\n                $last = $which;\n                take $_;\n            }\n        }\n    }\n    multi method squish( :&with = &[===] ) {\n        my $last = @secret;\n        gather for @.list {\n            unless with($_,$last) {\n                $last = $_;\n                take $_;\n            }\n        }\n    }\n\n    proto method rotor(|) {*}\n    multi method rotor(1, 0) { self }\n    multi method rotor($elems = 2, $overlap = 1) {\n        X::OutOfRange.new(\n            what => 'Overlap argument to List.rotor',\n            got  => $overlap,\n            range => (0 .. $elems - 1),\n        ).fail unless 0 <= $overlap < $elems;\n        X::OutOfRange.new(\n            what => 'Elements argument to List.rotor',\n            got  => $elems,\n            range => (0 .. *),\n        ).fail unless 0 <= $elems;\n\n        my $finished = 0;\n        gather while $finished + $overlap < self.gimme($finished + $elems) {\n            take item self[$finished ..^ $finished + $elems];\n            $finished += $elems - $overlap\n        }\n    }\n\n    multi method gist(List:D:) {\n        @(self).map( -> $elem {\n            given ++$ {\n                when 101 { '...' }\n                when 102 { last }\n                default  { $elem.gist }\n            }\n        } ).join: ' ';\n    }\n    multi method perl(List:D \\SELF:) {\n        self.gimme(*);\n        self.Parcel.perl ~ '.list'\n          ~ (nqp::iscont(SELF) ?? '.item' !! '')\n    }\n\n    method REIFY(Parcel \\parcel, Mu \\nextiter) {\n        nqp::splice($!items, nqp::getattr(parcel, Parcel, '$!storage'),\n                    nqp::elems($!items), 0);\n        nqp::bindattr(self, List, '$!nextiter', nextiter);\n        parcel\n    }\n\n    method FLATTENABLE_LIST() { self.gimme(*); $!items }\n    method FLATTENABLE_HASH() { nqp::hash() }\n\n    multi method DUMP(List:D: :$indent-step = 4, :%ctx?) {\n        return DUMP(self, :$indent-step) unless %ctx;\n\n        my $flags    := (\"\\x221e\" if self.infinite);\n        my Mu $attrs := nqp::list();\n        nqp::push($attrs, '$!flattens');\n        nqp::push($attrs,  $!flattens );\n        nqp::push($attrs, '$!items'   );\n        nqp::push($attrs,  $!items    );\n        nqp::push($attrs, '$!nextiter');\n        nqp::push($attrs,  $!nextiter );\n        self.DUMP-OBJECT-ATTRS($attrs, :$indent-step, :%ctx, :$flags);\n    }\n\n    multi method keys(List:D:) {\n        self.values.map: { (state $)++ }\n    }\n    multi method kv(List:D:) {\n        gather for self.values {\n            take (state $)++;\n            take-rw $_;\n        }\n    }\n    multi method values(List:D:) {\n        my Mu $rpa := nqp::clone(nqp::p6listitems(self));\n        nqp::push($rpa, $!nextiter) if $!nextiter.defined;\n        nqp::p6list($rpa, List, self.flattens);\n    }\n    multi method pairs(List:D:) {\n        self.values.map: {; (state $)++ => $_ }\n    }\n\n    method reduce(List: &with) {\n        fail('can only reduce with arity 2')\n            unless &with.arity <= 2 <= &with.count;\n        return unless self.DEFINITE;\n        my \\vals = self.values;\n        my Mu $val = vals.shift;\n        $val = with($val, $_) for vals;\n        $val;\n    }\n\n    method sink() {\n        self.gimme(*, :sink) if self.DEFINITE && $!nextiter.DEFINITE;\n        Nil;\n    }\n\n    # this is a remnant of a previous implementation of .push(), which\n    # apparently is used by LoL.  Please remove when no longer necessary.\n    method STORE_AT_POS(Int \\pos, Mu \\v) is rw {\n        nqp::bindpos($!items, nqp::unbox_i(pos), v)\n    }\n\n    proto method combinations($?) {*}\n    multi method combinations( Int $of ) {\n        ([self[@$_]] for combinations(self.elems, $of).eager)\n    }\n    multi method combinations( Range $of = 0 .. * ) {\n        gather for @$of {\n            last if $_ > self.elems;\n            take self.combinations($_);\n        }\n    }\n\n    method permutations() {\n        # need block on Moar because of RT#121830\n        gather { take [self[@$_]] for permutations(self.elems).eager }\n    }\n}\n\nsub eager(|) {\n    nqp::p6parcel(nqp::p6argvmarray(), Any).eager\n}\n\nsub flat(|) {\n    nqp::p6list(nqp::p6argvmarray(), List, Bool::True)\n}\n\nsub list(|) {\n    nqp::p6list(nqp::p6argvmarray(), List, Mu)\n}\n\nproto sub infix:<xx>(|)       { * }\nmulti sub infix:<xx>()        { fail \"No zero-arg meaning for infix:<xx>\" }\nmulti sub infix:<xx>(Mu \\x)   {x }\nmulti sub infix:<xx>(Mu \\x, $n is copy, :$thunked!) {\n    $n = nqp::p6bool(nqp::istype($n, Whatever)) ?? Inf !! $n.Int;\n    GatherIter.new({ take x.() while --$n >= 0; }, :infinite($n == Inf)).list\n}\nmulti sub infix:<xx>(Mu \\x, Whatever, :$thunked!) {\n    GatherIter.new({ loop { take x.() } }, :infinite(True)).flat\n}\nmulti sub infix:<xx>(Mu \\x, Whatever) {\n    GatherIter.new({ loop { take x } }, :infinite(True)).flat\n}\nmulti sub infix:<xx>(Mu \\x, $n) {\n    my int $size = $n.Int;\n\n    my Mu $rpa := nqp::list();\n    if $size > 0 {\n        nqp::setelems($rpa, $size);\n        nqp::setelems($rpa, 0);\n\n        $size = $size + 1;\n        nqp::push($rpa,x) while $size = $size - 1;\n    }\n\n    nqp::p6parcel($rpa, Any);\n}\n\nproto sub pop(@) {*}\nmulti sub pop(@a) { @a.pop }\n\nproto sub shift(@) {*}\nmulti sub shift(@a) { @a.shift }\n\nproto sub unshift(|) {*}\nmulti sub unshift(\\a, \\elem) { a.unshift: elem }\nmulti sub unshift(\\a, *@elems) { a.unshift: @elems }\n\nproto sub push(|) {*}\nmulti sub push(\\a, \\elem) { a.push: elem }\nmulti sub push(\\a, *@elems) { a.push: @elems }\n\nsub reverse(*@a)            { @a.reverse }\nsub rotate(@a, Int $n = 1)  { @a.rotate($n) }\nsub reduce (&with, *@list)  { @list.reduce(&with) }\nsub splice(@arr, $offset = 0, $size?, *@values) {\n    @arr.splice($offset, $size, @values)\n}\n\nmulti sub infix:<cmp>(@a, @b) { (@a Zcmp @b).first(&prefix:<?>) || @a <=> @b }\n\n# vim: ft=perl6 expandtab sw=4\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/Model.pm",
    "content": "use v6;\n\nclass Math::Model;\n\nuse Math::RungeKutta;\n# TODO: only load when needed\nuse SVG;\nuse SVG::Plot;\n\nhas %.derivatives;\nhas %.variables;\nhas %.initials;\nhas @.captures is rw;\n\nhas %!inv = %!derivatives.invert;\n# in Math::Model all variables are accessible by name\n# in contrast Math::RungeKutta uses vectors, so we need\n# to define an (arbitrary) ordering\n# @!deriv-names holds the names of the derivatives in a fixed\n# order, sod @!deriv-names[$number] turns the number into a name\n# %!deriv-keying{$name} translates a name into the corresponding index\nhas @!deriv-names  =  %!inv.keys;\nhas %!deriv-keying =  @!deriv-names Z=> 0..Inf;\n\n# snapshot of all variables in the current model\nhas %!current-values;\n\nhas %.results;\nhas @.time;\n\nhas $.numeric-error is rw = 0.0001;\n\nmy sub param-names(&c) {\n    &c.signature.params».name».substr(1).grep({ $_ ne '_'});\n}\n\nmethod !params-for(&c) {\n    param-names(&c).map( {; $_ => %!current-values{$_} } ).hash;\n}\n\nmethod topo-sort(*@vars) {\n    my %seen;\n    my @order;\n    sub topo(*@a) {\n        for @a {\n            next if %!inv.exists($_) || %seen{$_} || $_ eq 'time';\n            die \"Undeclared variable '$_' used in model\"\n                unless %.variables.exists($_);\n            topo(param-names(%.variables{$_}));\n            @order.push: $_;\n            %seen{$_}++;\n        }\n    }\n    topo(@vars);\n#    say @order.perl;\n    @order;\n}\n\n\nmethod integrate(:$from = 0, :$to = 10, :$min-resolution = ($to - $from) / 20, :$verbose) {\n    for %.derivatives -> $d {\n        die \"There must be a variable defined for each derivative, missing for '$d.key()'\"\n            unless %.variables.exists($d.key) || %!inv.exists($d.key);\n        die \"There must be an initial value defined for each derivative target, missing for '$d.value()'\"\n            unless %.initials.exists($d.value);\n    }\n\n    %!current-values       = %.initials;\n    %!current-values<time> = $from;\n\n    my @vars-topo          = self.topo-sort(%.variables.keys);\n    sub update-current-values($time, @values) {\n        %!current-values<time>          = $time;\n        %!current-values{@!deriv-names} = @values;\n        for @vars-topo {\n            my $c = %.variables{$_};\n            %!current-values{$_} = $c.(|self!params-for($c));\n        }\n    }\n\n    my @initial = %.initials{@!deriv-names};\n\n    sub derivatives($time, @values) {\n        update-current-values($time, @values);\n        my @r;\n        for %!inv{@!deriv-names} {\n            my $v = %.variables{$_};\n            @r.push: $v.defined\n                ?? $v(|self!params-for($v))\n                !! %!current-values{$_};\n        }\n        @r;\n    }\n\n    @!time = ();\n    for @.captures {\n        %!results{$_} = [];\n    }\n\n    sub record($time, @values) {\n        update-current-values($time, @values);\n        @!time.push: $time;\n        say $time if $verbose;\n\n        for @.captures {\n            %!results{$_}.push: %!current-values{$_};;\n        }\n    }\n\n    record($from, %.initials{@!deriv-names});\n\n    adaptive-rk-integrate(\n        :$from,\n        :$to,\n        :@initial,\n        :derivative(&derivatives),\n        :max-stepsize($min-resolution),\n        :do(&record),\n        :epsilon($.numeric-error),\n    );\n    %!results;\n}\n\nmethod render-svg(\n            $filename,\n            :$x-axis = 'time',\n            :$width = 800,\n            :$height = 600,\n            :$title = 'Model output') {\n    my $f = open $filename, :w\n            or die \"Can't open file '$filename' for writing: $!\";\n    my @values = map { %!results{$_} }, @.captures.grep({ $_ ne $x-axis});\n    my @x = $x-axis eq 'time' ?? @!time !! %!results{$x-axis}.flat;\n    my $svg = SVG::Plot.new(\n        :$width,\n        :$height,\n        :@x,\n        :@values,\n        :$title,\n    ).plot(:xy-lines);\n    $f.say(SVG.serialize($svg));\n    $f.close;\n    say \"Wrote ouput to '$filename'\";\n}\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/RoleQ.pm6",
    "content": "role q {\n    token stopper { \\' }\n\n    token escape:sym<\\\\> { <sym> <item=.backslash> }\n\n    token backslash:sym<qq> { <?before 'q'> <quote=.LANG('MAIN','quote')> }\n    token backslash:sym<\\\\> { <text=.sym> }\n    token backslash:sym<stopper> { <text=.stopper> }\n\n    token backslash:sym<miscq> { {} . }\n\n    method tweak_q($v) { self.panic(\"Too late for :q\") }\n    method tweak_qq($v) { self.panic(\"Too late for :qq\") }\n}\n\nrole qq does b1 does c1 does s1 does a1 does h1 does f1 {\n    token stopper { \\\" }\n    token backslash:sym<unrec> { {} (\\w) { self.throw_unrecog_backslash_seq: $/[0].Str } }\n    token backslash:sym<misc> { \\W }\n\n    method tweak_q($v) { self.panic(\"Too late for :q\") }\n    method tweak_qq($v) { self.panic(\"Too late for :qq\") }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/Simple.pm",
    "content": "# ----------------------\n# LWP::Simple for Perl 6\n# ----------------------\nuse v6;\nuse MIME::Base64;\nuse URI;\n\nclass LWP::Simple:auth<cosimo>:ver<0.085>;\n\nour $VERSION = '0.085';\n\nenum RequestType <GET POST>;\n\nhas Str $.default_encoding = 'utf-8';\nour $.class_default_encoding = 'utf-8';\n\n# these were intended to be constant but that hit pre-compilation issue\nmy Buf $crlf = Buf.new(13, 10);\nmy Buf $http_header_end_marker = Buf.new(13, 10, 13, 10);\nmy Int constant $default_stream_read_len = 2 * 1024;\n\nmethod base64encode ($user, $pass) {\n    my MIME::Base64 $mime .= new();\n    my $encoded = $mime.encode_base64($user ~ ':' ~ $pass);\n    return $encoded;\n}\n\nmethod get (Str $url) {\n    self.request_shell(RequestType::GET, $url)\n}\n\nmethod post (Str $url, %headers = {}, Any $content?) {\n    self.request_shell(RequestType::POST, $url, %headers, $content)\n}\n\nmethod request_shell (RequestType $rt, Str $url, %headers = {}, Any $content?) {\n\n    return unless $url;\n\n    my ($scheme, $hostname, $port, $path, $auth) = self.parse_url($url);\n\n    %headers{'Connection'} = 'close';\n    %headers{'User-Agent'} //= \"LWP::Simple/$VERSION Perl6/$*PERL<compiler><name>\";\n\n    if $auth {\n        $hostname = $auth<host>;\n        my $user = $auth<user>;\n        my $pass = $auth<password>;\n        my $base64enc = self.base64encode($user, $pass);\n        %headers<Authorization> = \"Basic $base64enc\";\n    }\n\n    %headers<Host> = $hostname;\n\n    if ($rt ~~ RequestType::POST && $content.defined) {\n        # Attach Content-Length header\n        # as recommended in RFC2616 section 14.3.\n        # Note: Empty content is also a content,\n        # header value equals to zero is valid.\n        %headers{'Content-Length'} = $content.encode.bytes;\n    }\n\n    my ($status, $resp_headers, $resp_content) =\n        self.make_request($rt, $hostname, $port, $path, %headers, $content);\n\n    given $status {\n\n        when / 30 <[12]> / {\n            my %resp_headers = $resp_headers.hash;\n            my $new_url = %resp_headers<Location>;\n            if ! $new_url {\n                die \"Redirect $status without a new URL?\";\n            }\n\n            # Watch out for too many redirects.\n            # Need to find a way to store a class member\n            #if $redirects++ > 10 {\n            #    say \"Too many redirects!\";\n            #    return;\n            #}\n\n            return self.request_shell($rt, $new_url, %headers, $content);\n        }\n\n        when /200/ {\n            # should be fancier about charset decoding application - someday\n            if  $resp_headers<Content-Type> &&\n                $resp_headers<Content-Type> ~~\n                    /   $<media-type>=[<-[/;]>+]\n                        [ <[/]> $<media-subtype>=[<-[;]>+] ]? /  &&\n                (   $<media-type> eq 'text' ||\n                    (   $<media-type> eq 'application' &&\n                        $<media-subtype> ~~ /[ ecma | java ]script | json/\n                    )\n                )\n            {\n                my $charset = \n                    ($resp_headers<Content-Type> ~~ /charset\\=(<-[;]>*)/)[0];\n                $charset = $charset ?? $charset.Str !!\n                    self ?? $.default_encoding !! $.class_default_encoding;\n                return $resp_content.decode($charset);\n            }\n            else {\n                return $resp_content;\n            }\n            \n        }\n\n        # Response failed\n        default {\n            return;\n        }\n    }\n\n}\n\nmethod parse_chunks(Blob $b is rw, IO::Socket::INET $sock) {\n    my Int ($line_end_pos, $chunk_len, $chunk_start) = (0) xx 3;\n    my Blob $content = Blob.new();\n\n    # smallest valid chunked line is 0CRLFCRLF (ascii or other 8bit like EBCDIC)\n    while ($line_end_pos + 5 <= $b.bytes) {\n        while ( $line_end_pos +4 <= $b.bytes  &&\n                $b.subbuf($line_end_pos, 2) ne $crlf\n        ) {\n            $line_end_pos++\n        }\n#       say \"got here x0x pos \", $line_end_pos, ' bytes ', $b.bytes, ' start ', $chunk_start, ' some data ', $b.subbuf($chunk_start, $line_end_pos +2 - $chunk_start).decode('ascii');\n        if  $line_end_pos +4 <= $b.bytes &&\n            $b.subbuf(\n                $chunk_start, $line_end_pos + 2 - $chunk_start\n            ).decode('ascii') ~~ /^(<.xdigit>+)[\";\"|\"\\r\\n\"]/ \n        {\n\n            # deal with case of chunk_len is 0\n\n            $chunk_len = :16($/[0].Str);\n#            say 'got chunk len ', $/[0].Str;\n\n            # test if at end of buf??\n            if $chunk_len == 0 {\n                # this is a \"normal\" exit from the routine\n                return True, $content;\n            }\n\n            # think 1CRLFxCRLF\n            if $line_end_pos + $chunk_len + 4 <= $b.bytes {\n#                say 'inner chunk';\n                $content ~= $b.subbuf($line_end_pos +2, $chunk_len);\n                $line_end_pos = $chunk_start = $line_end_pos + $chunk_len +4;\n            }\n            else {\n#                say 'last chunk';\n                # remaining chunk part len is chunk_len with CRLF\n                # minus the length of the chunk piece at end of buffer\n                my $last_chunk_end_len = \n                    $chunk_len +2 - ($b.bytes - $line_end_pos -2);\n                $content ~= $b.subbuf($line_end_pos +2);\n                if $last_chunk_end_len > 2  {\n                    $content ~= $sock.read($last_chunk_end_len -2);\n                }\n                # clean up CRLF after chunk\n                $sock.read(min($last_chunk_end_len, 2));\n\n                # this is a` \"normal\" exit from the routine\n                return False, $content;\n            }\n        }\n        else {\n#            say 'extend bytes ', $b.bytes, ' start ', $chunk_start, ' data ', $b.subbuf($chunk_start).decode('ascii');\n            # maybe odd case of buffer has just part of header at end\n            $b ~= $sock.read(20);\n        }\n    }\n\n#    say join ' ', $b[0 .. 100];\n#    say $b.subbuf(0, 100).decode('utf-8');\n    die \"Could not parse chunk header\";\n}\n\nmethod make_request (\n    RequestType $rt, $host, $port as Int, $path, %headers, $content?\n) {\n\n    my $headers = self.stringify_headers(%headers);\n\n    my IO::Socket::INET $sock .= new(:$host, :$port);\n    my Str $req_str = $rt.Stringy ~ \" {$path} HTTP/1.1\\r\\n\"\n        ~ $headers\n        ~ \"\\r\\n\";\n\n    # attach $content if given\n    # (string context is forced by concatenation)\n    $req_str ~= $content if $content.defined;\n\n    $sock.send($req_str);\n\n    my Blob $resp = $sock.read($default_stream_read_len);\n\n    my ($status, $resp_headers, $resp_content) = self.parse_response($resp);\n\n\n    if (($resp_headers<Transfer-Encoding> || '') eq 'chunked') {\n        my Bool $is_last_chunk;\n        my Blob $resp_content_chunk;\n\n        ($is_last_chunk, $resp_content) =\n            self.parse_chunks($resp_content, $sock);\n        while (not $is_last_chunk) {\n            ($is_last_chunk, $resp_content_chunk) =\n                self.parse_chunks(\n                    my Blob $next_chunk_start = $sock.read(1024),\n                    $sock\n            );\n            $resp_content ~= $resp_content_chunk;\n        }\n    }\n    elsif ( $resp_headers<Content-Length>   &&\n            $resp_content.bytes < $resp_headers<Content-Length>\n    ) {\n        $resp_content ~= $sock.read(\n            $resp_headers<Content-Length> - $resp_content.bytes\n        );\n    }\n    else { # a bit hacky for now but should be ok\n        while ($resp.bytes > 0) {\n            $resp = $sock.read($default_stream_read_len);\n            $resp_content ~= $resp;\n        }\n    }\n\n    $sock.close();\n\n    return ($status, $resp_headers, $resp_content);\n}\n\nmethod parse_response (Blob $resp) {\n\n    my %header;\n\n    my Int $header_end_pos = 0;\n    while ( $header_end_pos < $resp.bytes &&\n            $http_header_end_marker ne $resp.subbuf($header_end_pos, 4)  ) {\n        $header_end_pos++;\n    }\n\n    if ($header_end_pos < $resp.bytes) {\n        my @header_lines = $resp.subbuf(\n            0, $header_end_pos\n        ).decode('ascii').split(/\\r\\n/);\n        my Str $status_line = @header_lines.shift;\n\n        for @header_lines {\n            my ($name, $value) = .split(': ');\n            %header{$name} = $value;\n        }\n        return $status_line, %header.item, $resp.subbuf($header_end_pos +4).item;\n    }\n\n    die \"could not parse headers\";\n#    if %header.exists('Transfer-Encoding') && %header<Transfer-Encoding> ~~ m/:i chunked/ {\n#        @content = self.decode_chunked(@content);\n#    }\n\n}\n\nmethod getprint (Str $url) {\n    my $out = self.get($url);\n    if $out ~~ Buf { $*OUT.write($out) } else { say $out }\n}\n\nmethod getstore (Str $url, Str $filename) {\n    return unless defined $url;\n\n    my $content = self.get($url);\n    if ! $content {\n        return\n    }\n\n    my $fh = open($filename, :bin, :w);\n    if $content ~~ Buf {\n        $fh.write($content)\n    }\n    else {\n        $fh.print($content)\n    }\n\n    $fh.close; \n}\n\nmethod parse_url (Str $url) {\n    my URI $u .= new($url);\n    my $path = $u.path_query;\n    \n    my $user_info = $u.grammar.parse_result<URI_reference><URI><hier_part><authority><userinfo>;\n    \n    return (\n        $u.scheme, \n        $user_info ?? \"{$user_info}@{$u.host}\" !! $u.host, \n        $u.port, \n        $path eq '' ?? '/' !! $path,\n        $user_info ?? {\n            host => $u.host,\n            user => ~ $user_info<likely_userinfo_component>[0],\n            password => ~ $user_info<likely_userinfo_component>[1]\n        } !! Nil\n    );    \n}\n\nmethod stringify_headers (%headers) {\n    my Str $str = '';\n    for sort %headers.keys {\n        $str ~= $_ ~ ': ' ~ %headers{$_} ~ \"\\r\\n\";\n    }\n    return $str;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/Win32.pm",
    "content": "my class IO::Spec::Win32 is IO::Spec::Unix {\n\n    # Some regexes we use for path splitting\n    my $slash\t    = regex {  <[\\/ \\\\]> }\n    my $notslash    = regex { <-[\\/ \\\\]> }\n    my $driveletter = regex { <[A..Z a..z]> ':' }\n    my $UNCpath     = regex { [<$slash> ** 2] <$notslash>+  <$slash>  [<$notslash>+ | $] }\n    my $volume_rx   = regex { <$driveletter> | <$UNCpath> }\n\n    method canonpath ($path, :$parent) {\n        $path eq '' ?? '' !! self!canon-cat($path, :$parent);\n    }\n\n    method catdir(*@dirs) {\n        return \"\" unless @dirs;\n        return self!canon-cat( \"\\\\\", |@dirs ) if @dirs[0] eq \"\";\n        self!canon-cat(|@dirs);\n    }\n\n    method splitdir($dir)        { $dir.split($slash)  }\n    method catfile(|c)           { self.catdir(|c)     }\n    method devnull               { 'nul'               }\n    method rootdir               { '\\\\'                }\n\n    method tmpdir {\n        first( { .defined && .IO.d && .IO.w },\n            %*ENV<TMPDIR>,\n            %*ENV<TEMP>,\n            %*ENV<TMP>,\n            'SYS:/temp',\n            'C:\\system\\temp',\n            'C:/temp',\n            '/tmp',\n            '/')\n          || self.curdir;\n    }\n\n    method path {\n       my @path = split(';', %*ENV<PATH>);\n       @path».=subst(:global, q/\"/, '');\n       @path = grep *.chars, @path;\n       unshift @path, \".\";\n       return @path;\n   }\n\n    method is-absolute ($path) {\n        # As of right now, this returns 2 if the path is absolute with a\n        # volume, 1 if it's absolute with no volume, 0 otherwise.\n        given $path {\n            when /^ [<$driveletter> <$slash> | <$UNCpath>]/ { 2 }\n            when /^ <$slash> /                              { 1 }\n            default                     { 0 }\n        }   #/\n    }\n\n    method split ($path as Str is copy) { \n        $path ~~ s[ <$slash>+ $] = ''                       #=\n            unless $path ~~ /^ <$driveletter>? <$slash>+ $/;\n\n        $path ~~ \n            m/^ ( <$volume_rx> ? )\n            ( [ .* <$slash> ]? )\n            (.*)\n             /;\n        my ($volume, $directory, $basename) = (~$0, ~$1, ~$2);\n        $directory ~~ s/ <?after .> <$slash>+ $//;\n\n\n        if all($directory, $basename) eq '' && $volume ne '' {\n            $directory = $volume ~~ /^<$driveletter>/\n                     ?? '.' !! '\\\\';\n        }\n        $basename = '\\\\'  if $directory eq any('/', '\\\\') && $basename eq '';\n        $directory = '.'  if $directory eq ''             && $basename ne '';\n\n        return (:$volume, :$directory, :$basename);\n    }\n\n    method join ($volume, $directory is copy, $file is copy) { \n        $directory = '' if $directory eq '.' && $file.chars;\n        if $directory.match( /^<$slash>$/ ) && $file.match( /^<$slash>$/ ) {\n            $file = '';\n            $directory = '' if $volume.chars > 2; #i.e. UNC path\n        }\n        self.catpath($volume, $directory, $file);\n    }\n\n    method splitpath($path as Str, :$nofile = False) { \n\n        my ($volume,$directory,$file) = ('','','');\n        if ( $nofile ) {\n            $path ~~ \n                /^ (<$volume_rx>?) (.*) /;\n            $volume    = ~$0;\n            $directory = ~$1;\n        }\n        else {\n            $path ~~ \n                m/^ ( <$volume_rx> ? )\n                ( [ .* <$slash> [ '.' ** 1..2 $]? ]? )\n                (.*)\n                 /;\n            $volume    = ~$0;\n            $directory = ~$1;\n            $file      = ~$2;\n        }\n\n        return ($volume,$directory,$file);\n    }\n\n    method catpath($volume is copy, $directory, $file) {\n\n        # Make sure the glue separator is present\n        # unless it's a relative path like A:foo.txt\n        if $volume.chars and $directory.chars\n           and $volume !~~ /^<$driveletter>/\n           and $volume !~~ /<$slash> $/\n           and $directory !~~ /^ <$slash>/\n            { $volume ~= '\\\\' }\n        if $file.chars and $directory.chars\n           and $directory !~~ /<$slash> $/\n            { $volume ~ $directory ~ '\\\\' ~ $file; }\n        else     { $volume ~ $directory     ~    $file; }\n    }\n\n    method rel2abs ($path is copy, $base? is copy) {\n\n        my $is_abs = self.is-absolute($path);\n\n        # Check for volume (should probably document the '2' thing...)\n        return self.canonpath( $path ) if $is_abs == 2;\n\n        if $is_abs {\n            # It's missing a volume, add one\n            my $vol;\n            $vol = self.splitpath($base)[0] if $base.defined;\n            $vol ||= self.splitpath($*CWD)[0];\n            return self.canonpath( $vol ~ $path );\n        }\n\n        if not defined $base {\n        # TODO: implement _getdcwd call ( Windows maintains separate CWD for each volume )\n        # See: http://msdn.microsoft.com/en-us/library/1e5zwe0c%28v=vs.80%29.aspx\n            #$base = Cwd::getdcwd( (self.splitpath: $path)[0] ) if defined &Cwd::getdcwd ;\n            #$base //= $*CWD ;\n            $base = $*CWD;\n        }\n        elsif ( !self.is-absolute( $base ) ) {\n            $base = self.rel2abs( $base );\n        }\n        else {\n            $base = self.canonpath( $base );\n        }\n\n        my ($path_directories, $path_file) = self.splitpath( $path )[1..2] ;\n\n        my ($base_volume, $base_directories) = self.splitpath( $base, :nofile ) ;\n\n        $path = self.catpath( \n                    $base_volume, \n                    self.catdir( $base_directories, $path_directories ), \n                    $path_file\n                    ) ;\n\n        return self.canonpath( $path ) ;\n    }\n\n\n    method !canon-cat ( $first, *@rest, :$parent --> Str) {\n\n        $first ~~ /^ ([   <$driveletter> <$slash>?\n                        | <$UNCpath>\n                        | [<$slash> ** 2] <$notslash>+\n                        | <$slash> ]?)\n                       (.*)\n                   /;\n        my Str ($volume, $path) = ~$0, ~$1;\n\n        $volume.=subst(:g, '/', '\\\\');\n        if $volume ~~ /^<$driveletter>/ {\n            $volume.=uc;\n        }\n        elsif $volume.chars && $volume !~~ / '\\\\' $/ {\n            $volume ~= '\\\\';\n        }\n\n        $path = join \"\\\\\", $path, @rest.flat;\n        $path ~~ s:g/ <$slash>+ /\\\\/;                              # /xx\\\\yy   --> \\xx\\yy\n        $path ~~ s:g/[ ^ | '\\\\']   '.'  '\\\\.'*  [ '\\\\' | $ ]/\\\\/;  # xx/././yy --> xx/yy\n        if $parent {\n            while $path ~~ s:g { [^ | <?after '\\\\'>] <!before '..\\\\'> <-[\\\\]>+ '\\\\..' ['\\\\' | $ ] } = '' { };\n        }\n        $path ~~ s/^ '\\\\'+ //;        # \\xx --> xx  NOTE: this is *not* root\n        $path ~~ s/ '\\\\'+ $//;        # xx\\ --> xx\n        if $volume ~~ / '\\\\' $ / {    # <vol>\\.. --> <vol>\\ \n            $path ~~ s/ ^  '..'  '\\\\..'*  [ '\\\\' | $ ] //;\n        }\n\n        if $path eq '' {        # \\\\HOST\\SHARE\\ --> \\\\HOST\\SHARE\n            $volume ~~ s/<?after '\\\\\\\\' .*> '\\\\' $ //;\n            $volume || '.';\n        }\n\telse {\n            $volume ~ $path;\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/advent2009-day16.t",
    "content": "# http://perl6advent.wordpress.com/2009/12/16/day-16-we-call-it-the-old-switcheroo/\n\nuse v6;\nuse Test;\n\n\nsub weather($weather) {\n    given $weather {\n      when 'sunny'  { return 'Aah! ☀'                    }\n      when 'cloudy' { return 'Meh. ☁'                    }\n      when 'rainy'  { return 'Where is my umbrella? ☂'   }\n      when 'snowy'  { return 'Yippie! ☃'                 }\n      default       { return 'Looks like any other day.' }\n    }\n}\nis weather(Any), 'Looks like any other day.', 'Weather given/when';\n\n{\n    sub probability($probability) {\n        given $probability {\n          when     1.00 { return 'A certainty'   }\n          when * > 0.75 { return 'Quite likely'  }\n          when * > 0.50 { return 'Likely'        }\n          when * > 0.25 { return 'Unlikely'      }\n          when * > 0.00 { return 'Very unlikely' }\n          when     0.00 { return 'Fat chance'  }\n        }\n    }\n    is probability(0.80), 'Quite likely', 'Probability given/when';\n\n    sub fib(Int $_) {\n      when * < 2 { 1 }\n      default { fib($_ - 1) + fib($_ - 2) }\n    }\n    is fib(5), 8, '6th fibonacci number';\n}\n\nclass Card {\n    method bend()     { return \"Card bent\" }\n    method fold()     { return \"Card folded\" }\n    method mutilate() { return \"Card mutilated\" }\n}\nmy Card $punch-card .= new;\n\nmy $actions;\ngiven $punch-card {\n  $actions ~= .bend;\n  $actions ~= .fold;\n  $actions ~= .mutilate;\n}\nis $actions, 'Card bentCard foldedCard mutilated', 'Given as a sort of once-only for loop.';\n\n\nmy @list = 1, 2, 3, 4, 5;\nmy $castle = 'phantom';\nmy $full-of-vowels = 'aaaooouuuiiee';\nis (.[0] + .[1] + .[2] given @list), 6, 'Statement ending given';\n\n{\n    is (\"My God, it's full of vowels!\" when $full-of-vowels ~~ /^ <[aeiou]>+ $/), \"My God, it's full of vowels!\", 'Statement ending when';\n    is ('Boo!' when /phantom/ given $castle), 'Boo!', 'Nesting when inside given';\n}\n\n{\n    #Test DNA one liner at the end\n    my $result;\n    for ^20 {my ($a,$b)=<AT CG>.pick.comb.pick(*); my ($c,$d)=sort map({6+4*sin($_/2)},($_,$_+4)); $result ~= sprintf \"%{$c}s%{$d-$c}s\\n\",$a,$b}\n    is $result.chars , 169 , 'We got a bunch of DNA';\n    is $result.split(\"\\n\").Int , 21 , 'On 20 line';\n    is $result.subst(/\\s/ , '' , :g).chars , 40 , 'Containing 20 pairs';\n}\n\neval_lives_ok 'for ^20 {my ($a,$b)=<AT CG>.pick.comb.pick(*); my ($c,$d)=sort map {6+4*sin($_/2)},$_,$_+4; sprintf \"%{$c}s%{$d-$c}s\\n\",$a,$b}' , 'Can handle \"map {...} ,$x,$y\"';\n\ndone;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/basic-open.t",
    "content": "use v6;\nuse Test;\n\nplan 9;\n\nsub test_lines(@lines) {\n    #!rakudo todo 'line counts'\n    is @lines.elems, 3, 'Three lines read';\n    is @lines[0],\n       \"Please do not remove this file, used by S16-io/basic-open.t\",\n       'Retrieved first line';\n    is @lines[2],\n       \"This is a test line.\",\n       'Retrieved last line';\n}\n\n#?niecza skip 'TextReader.eof NYI'\n{\n    my $fh = open('t/spec/S16-io/test-data');\n    my $count = 0;\n    while !$fh.eof {\n        my $x = $fh.get;\n        $count++ if $x.defined;\n    }\n    is $count, 3, 'Read three lines with while !$hanlde.eof';\n}\n\n# test that we can interate over $fh.lines\n{\n    my $fh =  open('t/spec/S16-io/test-data');\n\n    ok defined($fh), 'Could open test file';\n    my @lines;\n    for $fh.lines -> $x {\n        push @lines, $x;\n    }\n    test_lines(@lines);\n}\n\n# test that we can get all items in list context:\n{\n    my $fh =  open('t/spec/S16-io/test-data');\n    ok defined($fh), 'Could open test file (again)';\n    my @lines = $fh.lines;\n    test_lines(@lines);\n}\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/calendar.t",
    "content": "use v6;\nuse Test;\n\n# calendar.t: tests some calendar-related methods common to\n# Date and DateTime\n\nplan 130;\n\nsub date($year, $month, $day) {\n    Date.new(:$year, :$month, :$day)\n}\n\nsub dtim($year, $month, $day) {\n    DateTime.new(:$year, :$month, :$day,\n        :hour(17), :minute(33), :second(2.9))\n}\n\n# --------------------------------------------------------------------\n# L<S32::Temporal/C<DateTime>/'truncated-to'>\n# --------------------------------------------------------------------\n\nis ~date(1969, 7, 20).truncated-to(month), '1969-07-01', 'Date.truncated-to(month)';\nis ~dtim(1969, 7, 20).truncated-to(month), '1969-07-01T00:00:00Z', 'DateTime.truncated-to(month)';\nis ~date(1969, 7, 20).truncated-to(year), '1969-01-01', 'Date.truncated-to(year)';\nis ~dtim(1969, 7, 20).truncated-to(year), '1969-01-01T00:00:00Z', 'DateTime.truncated-to(year)';\n\nis ~date(1999, 1, 18).truncated-to(week), '1999-01-18', 'Date.truncated-to(week) (no change in day)';\nis ~date(1999, 1, 19).truncated-to(week), '1999-01-18', 'Date.truncated-to(week) (short jump)';\nis ~date(1999, 1, 17).truncated-to(week), '1999-01-11', 'Date.truncated-to(week) (long jump)';\nis ~dtim(1999, 1, 17).truncated-to(week), '1999-01-11T00:00:00Z', 'DateTime.truncated-to(week) (long jump)';\nis ~date(1999, 4,  2).truncated-to(week), '1999-03-29', 'Date.truncated-to(week) (changing month)';\nis ~date(1999, 1,  3).truncated-to(week), '1998-12-28', 'Date.truncated-to(week) (changing year)';\nis ~dtim(1999, 1,  3).truncated-to(week), '1998-12-28T00:00:00Z', 'DateTime.truncated-to(week) (changing year)';\nis ~date(2000, 3,  1).truncated-to(week), '2000-02-28', 'Date.truncated-to(week) (skipping over Feb 29)';\nis ~dtim(2000, 3,  1).truncated-to(week), '2000-02-28T00:00:00Z', 'DateTime.truncated-to(week) (skipping over Feb 29)';\nis ~date(1988, 3,  3).truncated-to(week), '1988-02-29', 'Date.truncated-to(week) (landing on Feb 29)';\nis ~dtim(1988, 3,  3).truncated-to(week), '1988-02-29T00:00:00Z', 'DateTime.truncated-to(week) (landing on Feb 29)';\n\n# Verify .gist\n# Example taken from S32 specs documentation.\n#?niecza skip 'Undeclared routine: hour'\n{\n    my $dt = DateTime.new('2005-02-01T15:20:35Z');\n    my $truncated = $dt.truncated-to(hour);\n\n    is $truncated.gist, \"2005-02-01T15:00:00Z\", \"validate .gist output\";\n}\n\n# --------------------------------------------------------------------\n# L<S32::Temporal/Accessors/'the synonym day-of-month'>\n# --------------------------------------------------------------------\n\nis date(2003, 3, 18).day-of-month, 18, 'Date.day can be spelled as Date.day-of-month';\nis dtim(2003, 3, 18).day-of-month, 18, 'DateTime.day can be spelled as DateTime.day-of-month';\n\n# --------------------------------------------------------------------\n# L<S32::Temporal/Accessors/'day-of-week method'>\n# --------------------------------------------------------------------\n\n# much of this is blatantly stolen from the Date::Simple test suite\n# and redistributed under the terms of the Artistic License 2.0 with\n# permission of the original authors (John Tobey, Marty Pauly).\n\nis date(1966, 10, 15).day-of-week, 6, 'Date.day-of-week (1966-10-15)';\nis dtim(1966, 10, 15).day-of-week, 6, 'DateTime.day-of-week (1966-10-15)';\nis date(2401,  3,  1).day-of-week, 4, 'Date.day-of-week (2401-03-01)';\nis date(2401,  2, 28).day-of-week, 3, 'Date.day-of-week (2401-02-28)';\nis date(2400,  3,  1).day-of-week, 3, 'Date.day-of-week (2400-03-01)';\nis date(2400,  2, 29).day-of-week, 2, 'Date.day-of-week (2400-02-29)';\nis date(2400,  2, 28).day-of-week, 1, 'Date.day-of-week (2400-02-28)';\nis date(2101,  3,  1).day-of-week, 2, 'Date.day-of-week (2101-03-01)';\nis date(2101,  2, 28).day-of-week, 1, 'Date.day-of-week (2101-02-28)';\nis date(2100,  3,  1).day-of-week, 1, 'Date.day-of-week (2100-03-01)';\nis dtim(2100,  3,  1).day-of-week, 1, 'DateTime.day-of-week (2100-03-01)';\nis date(2100,  2, 28).day-of-week, 7, 'Date.day-of-week (2100-02-28)';\nis dtim(2100,  2, 28).day-of-week, 7, 'DateTime.day-of-week (2100-02-28)';\nis date(2001,  3,  1).day-of-week, 4, 'Date.day-of-week (2001-03-01)';\nis date(2001,  2, 28).day-of-week, 3, 'Date.day-of-week (2001-02-28)';\nis date(2000,  3,  1).day-of-week, 3, 'Date.day-of-week (2000-03-01)';\nis date(2000,  2, 29).day-of-week, 2, 'Date.day-of-week (2000-02-29)';\nis date(2000,  2, 28).day-of-week, 1, 'Date.day-of-week (2000-02-28)';\nis date(1901,  3,  1).day-of-week, 5, 'Date.day-of-week (1901-03-01)';\nis date(1901,  2, 28).day-of-week, 4, 'Date.day-of-week (1901-02-28)';\nis date(1900,  3,  1).day-of-week, 4, 'Date.day-of-week (1900-03-01)';\nis date(1900,  2, 28).day-of-week, 3, 'Date.day-of-week (1900-02-28)';\nis date(1801,  3,  1).day-of-week, 7, 'Date.day-of-week (1801-03-01)';\nis date(1801,  2, 28).day-of-week, 6, 'Date.day-of-week (1801-02-28)';\nis date(1800,  3,  1).day-of-week, 6, 'Date.day-of-week (1800-03-01)';\nis dtim(1800,  3,  1).day-of-week, 6, 'DateTime.day-of-week (1800-03-01)';\nis date(1800,  2, 28).day-of-week, 5, 'Date.day-of-week (1800-02-28)';\nis dtim(1800,  2, 28).day-of-week, 5, 'DateTime.day-of-week (1800-02-28)';\nis date(1701,  3,  1).day-of-week, 2, 'Date.day-of-week (1701-03-01)';\nis date(1701,  2, 28).day-of-week, 1, 'Date.day-of-week (1701-02-28)';\nis date(1700,  3,  1).day-of-week, 1, 'Date.day-of-week (1700-03-01)';\nis date(1700,  2, 28).day-of-week, 7, 'Date.day-of-week (1700-02-28)';\nis date(1601,  3,  1).day-of-week, 4, 'Date.day-of-week (1601-03-01)';\nis dtim(1601,  3,  1).day-of-week, 4, 'DateTime.day-of-week (1601-03-01)';\nis date(1601,  2, 28).day-of-week, 3, 'Date.day-of-week (1601-02-28)';\nis dtim(1601,  2, 28).day-of-week, 3, 'DateTime.day-of-week (1601-02-28)';\nis date(1600,  3,  1).day-of-week, 3, 'Date.day-of-week (1600-03-01)';\nis date(1600,  2, 29).day-of-week, 2, 'Date.day-of-week (1600-02-29)';\nis date(1600,  2, 28).day-of-week, 1, 'Date.day-of-week (1600-02-28)';\n\n# --------------------------------------------------------------------\n# L<S32::Temporal/Accessors/'The method week'>\n# --------------------------------------------------------------------\n\nis date(1977, 8, 20).week.join(' '), '1977 33', 'Date.week (1977-8-20)';\nis dtim(1977, 8, 20).week.join(' '), '1977 33', 'DateTime.week (1977-8-20)';\nis date(1977, 8, 20).week-year, 1977, 'Date.week (1977-8-20)';\nis dtim(1977, 8, 20).week-year, 1977, 'DateTime.week (1977-8-20)';\nis date(1977, 8, 20).week-number, 33, 'Date.week-number (1977-8-20)';\nis dtim(1977, 8, 20).week-number, 33, 'DateTime.week-number (1977-8-20)';\nis date(1987, 12, 18).week.join(' '), '1987 51', 'Date.week (1987-12-18)';\nis date(2020, 5, 4).week.join(' '), '2020 19', 'Date.week (2020-5-4)';\n\n# From http://en.wikipedia.org/w/index.php?title=ISO_week_dtim&oldid=370553706#Examples\n\nis date(2005, 01, 01).week.join(' '), '2004 53', 'Date.week (2005-01-01)';\nis date(2005, 01, 02).week.join(' '), '2004 53', 'Date.week (2005-01-02)';\nis date(2005, 12, 31).week.join(' '), '2005 52', 'Date.week (2005-12-31)';\nis date(2007, 01, 01).week.join(' '), '2007 1',  'Date.week (2007-01-01)';\nis date(2007, 12, 30).week.join(' '), '2007 52', 'Date.week (2007-12-30)';\nis dtim(2007, 12, 30).week.join(' '), '2007 52', 'DateTime.week (2007-12-30)';\nis date(2007, 12, 30).week-year, 2007, 'Date.week (2007-12-30)';\nis dtim(2007, 12, 30).week-year, 2007, 'DateTime.week (2007-12-30)';\nis date(2007, 12, 30).week-number, 52, 'Date.week-number (2007-12-30)';\nis dtim(2007, 12, 30).week-number, 52, 'DateTime.week-number (2007-12-30)';\nis date(2007, 12, 31).week.join(' '), '2008 1',  'Date.week (2007-12-31)';\nis date(2008, 01, 01).week.join(' '), '2008 1',  'Date.week (2008-01-01)';\nis date(2008, 12, 29).week.join(' '), '2009 1',  'Date.week (2008-12-29)';\nis date(2008, 12, 31).week.join(' '), '2009 1',  'Date.week (2008-12-31)';\nis date(2009, 01, 01).week.join(' '), '2009 1',  'Date.week (2009-01-01)';\nis date(2009, 12, 31).week.join(' '), '2009 53', 'Date.week (2009-12-31)';\nis date(2010, 01, 03).week.join(' '), '2009 53', 'Date.week (2010-01-03)';\nis dtim(2010, 01, 03).week.join(' '), '2009 53', 'DateTime.week (2010-01-03)';\nis date(2010, 01, 03).week-year, 2009, 'Date.week-year (2010-01-03)';\nis dtim(2010, 01, 03).week-year, 2009, 'DateTime.week-year (2010-01-03)';\nis date(2010, 01, 03).week-number, 53, 'Date.week-number (2010-01-03)';\nis dtim(2010, 01, 03).week-number, 53, 'DateTime.week-number (2010-01-03)';\n\n# day-of-week is tested each time show-dt is called.\n\n# --------------------------------------------------------------------\n# L<S32::Temporal/Accessors/'The weekday-of-month method'>\n# --------------------------------------------------------------------\n\nis date(1982, 2,  1).weekday-of-month, 1, 'Date.weekday-of-month (1982-02-01)';\nis dtim(1982, 2,  1).weekday-of-month, 1, 'DateTime.weekday-of-month (1982-02-01)';\nis date(1982, 2,  7).weekday-of-month, 1, 'Date.weekday-of-month (1982-02-07)';\nis date(1982, 2,  8).weekday-of-month, 2, 'Date.weekday-of-month (1982-02-08)';\nis date(1982, 2, 18).weekday-of-month, 3, 'Date.weekday-of-month (1982-02-18)';\nis date(1982, 2, 28).weekday-of-month, 4, 'Date.weekday-of-month (1982-02-28)';\nis dtim(1982, 2, 28).weekday-of-month, 4, 'DateTime.weekday-of-month (1982-02-28)';\nis date(1982, 4,  4).weekday-of-month, 1, 'Date.weekday-of-month (1982-04-04)';\nis date(1982, 4,  7).weekday-of-month, 1, 'Date.weekday-of-month (1982-04-07)';\nis date(1982, 4,  8).weekday-of-month, 2, 'Date.weekday-of-month (1982-04-08)';\nis date(1982, 4, 13).weekday-of-month, 2, 'Date.weekday-of-month (1982-04-13)';\nis date(1982, 4, 30).weekday-of-month, 5, 'Date.weekday-of-month (1982-04-30)';\nis dtim(1982, 4, 30).weekday-of-month, 5, 'DateTime.weekday-of-month (1982-04-30)';\n\n# --------------------------------------------------------------------\n# L<S32::Temporal/Accessors/'The days-in-month method'>\n# --------------------------------------------------------------------\n\nis date(1999,  5,  5).days-in-month, 31, 'Date.days-in-month (May 1999)';\nis date(1999,  6,  5).days-in-month, 30, 'Date.days-in-month (Jun 1999)';\nis date(1999,  2,  5).days-in-month, 28, 'Date.days-in-month (Feb 1999)';\nis dtim(1999,  2,  5).days-in-month, 28, 'DateTime.days-in-month (Feb 1999)';\nis date(2000,  2,  5).days-in-month, 29, 'Date.days-in-month (Feb 2000)';\nis dtim(2000,  2,  5).days-in-month, 29, 'DateTime.days-in-month (Feb 2000)';\n\n# --------------------------------------------------------------------\n# L<S32::Temporal/Accessors/'The day-of-year method'>\n# --------------------------------------------------------------------\n\nis date(1975,  1,  1).day-of-year,   1, 'Date.day-of-year (1975-01-01)';\nis dtim(1975,  1,  1).day-of-year,   1, 'DateTime.day-of-year (1975-01-01)';\nis date(1977,  5,  5).day-of-year, 125, 'Date.day-of-year (1977-05-05)';\nis date(1983, 11, 27).day-of-year, 331, 'Date.day-of-year (1983-11-27)';\nis date(1999,  2, 28).day-of-year,  59, 'Date.day-of-year (1999-02-28)';\nis dtim(1999,  2, 28).day-of-year,  59, 'DateTime.day-of-year (1999-02-28)';\nis date(1999,  3,  1).day-of-year,  60, 'Date.day-of-year (1999-03-01)';\nis dtim(1999,  3,  1).day-of-year,  60, 'DateTime.day-of-year (1999-03-01)';\nis date(1999, 12, 31).day-of-year, 365, 'Date.day-of-year (1999-12-31)';\nis date(2000,  2, 28).day-of-year,  59, 'Date.day-of-year (2000-02-28)';\nis dtim(2000,  2, 28).day-of-year,  59, 'DateTime.day-of-year (2000-02-28)';\nis date(2000,  2, 29).day-of-year,  60, 'Date.day-of-year (2000-02-29)';\nis dtim(2000,  2, 29).day-of-year,  60, 'DateTime.day-of-year (2000-02-29)';\nis date(2000,  3,  1).day-of-year,  61, 'Date.day-of-year (2000-03-01)';\nis date(2000, 12, 31).day-of-year, 366, 'Date.day-of-year (2000-12-31)';\n\n# --------------------------------------------------------------------\n# L<S32::Temporal/Accessors/'The method is-leap-year'>\n# --------------------------------------------------------------------\n\nnok date(1800,  1,  1).is-leap-year, 'Date.is-leap-year (1800)';\nnok date(1801,  1,  1).is-leap-year, 'Date.is-leap-year (1801)';\nok  date(1804,  1,  1).is-leap-year, 'Date.is-leap-year (1804)';\nnok date(1900,  1,  1).is-leap-year, 'Date.is-leap-year (1900)';\nnok dtim(1900,  1,  1).is-leap-year, 'DateTime.is-leap-year (1900)';\nok  date(1996,  1,  1).is-leap-year, 'Date.is-leap-year (1996)';\nnok date(1999,  1,  1).is-leap-year, 'Date.is-leap-year (1999)';\nok  date(2000,  1,  1).is-leap-year, 'Date.is-leap-year (2000)';\nok  dtim(2000,  1,  1).is-leap-year, 'DateTime.is-leap-year (2000)';\n\ndone;\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/for.t",
    "content": "use v6;\n\n#?pugs emit #\nuse MONKEY_TYPING;\n\nuse Test;\n\n=begin description\n\nTests the \"for\" statement\n\nThis attempts to test as many variations of the\nfor statement as possible\n\n=end description\n\nplan 77;\n\n## No foreach\n# L<S04/The C<for> statement/\"no foreach statement any more\">\n{\n    my $times_run = 0;\n    eval_dies_ok 'foreach 1..10 { $times_run++ }; 1', \"foreach is gone\";\n    eval_dies_ok 'foreach (1..10) { $times_run++}; 1',\n        \"foreach is gone, even with parens\";\n    is $times_run, 0, \"foreach doesn't work\";\n}\n\n## for with plain old range operator w/out parens\n\n{\n    my $a = \"\";\n    for 0 .. 5 { $a = $a ~ $_; };\n    is($a, '012345', 'for 0..5 {} works');\n}\n\n# ... with pointy blocks\n\n{\n    my $b = \"\";\n    for 0 .. 5 -> $_ { $b = $b ~ $_; };\n    is($b, '012345', 'for 0 .. 5 -> {} works');\n}\n\n#?pugs todo 'slice context'\n#?niecza skip 'slice context'\n{\n    my $str;\n    my @a = 1..3;\n    my @b = 4..6;\n    for zip(@a; @b) -> $x, $y {\n        $str ~= \"($x $y)\";\n    }\n    is $str, \"(1 4)(2 5)(3 6)\", 'for zip(@a; @b) -> $x, $y works';\n}\n\n# ... with referential sub\n{\n    my $d = \"\";\n    for -2 .. 2 { $d ~= .sign };\n    is($d, '-1-1011', 'for 0 .. 5 { .some_sub } works');\n}\n\n## and now with parens around the range operator\n{\n    my $e = \"\";\n    for (0 .. 5) { $e = $e ~ $_; };\n    is($e, '012345', 'for () {} works');\n}\n\n# ... with pointy blocks\n{\n    my $f = \"\";\n    for (0 .. 5) -> $_ { $f = $f ~ $_; };\n    is($f, '012345', 'for () -> {} works');\n}\n\n# ... with implicit topic\n\n{\n    $_ = \"GLOBAL VALUE\";\n    for \"INNER VALUE\" {\n        is( .lc, \"inner value\", \"Implicit default topic is seen by lc()\");\n    };\n    is($_,\"GLOBAL VALUE\",\"After the loop the implicit topic gets restored\");\n}\n\n{\n    # as statement modifier\n    $_ = \"GLOBAL VALUE\";\n    is( .lc, \"inner value\", \"Implicit default topic is seen by lc()\" )\n        for \"INNER VALUE\";\n    #?pugs todo\n    is($_,\"GLOBAL VALUE\",\"After the loop the implicit topic gets restored\");\n}\n\n## and now for with 'topical' variables\n\n# ... w/out parens\n\nmy $i = \"\";\nfor 0 .. 5 -> $topic { $i = $i ~ $topic; };\nis($i, '012345', 'for 0 .. 5 -> $topic {} works');\n\n# ... with parens\n\nmy $j = \"\";\nfor (0 .. 5) -> $topic { $j = $j ~ $topic; };\nis($j, '012345', 'for () -> $topic {} works');\n\n\n## for with @array operator w/out parens\n\nmy @array_k = (0 .. 5);\nmy $k = \"\";\nfor @array_k { $k = $k ~ $_; };\nis($k, '012345', 'for @array {} works');\n\n# ... with pointy blocks\n\nmy @array_l = (0 .. 5);\nmy $l = \"\";\nfor @array_l -> $_ { $l = $l ~ $_; };\nis($l, '012345', 'for @array -> {} works');\n\n## and now with parens around the @array\n\nmy @array_o = (0 .. 5);\nmy $o = \"\";\nfor (@array_o) { $o = $o ~ $_; };\nis($o, '012345', 'for (@array) {} works');\n\n# ... with pointy blocks\n{\n    my @array_p = (0 .. 5);\n    my $p = \"\";\n    for (@array_p) -> $_ { $p = $p ~ $_; };\n    is($p, '012345', 'for (@array) -> {} works');\n}\n\nmy @elems = <a b c d e>;\n\n{\n    my @a;\n    for (@elems) {\n        push @a, $_;\n    }\n    my @e = <a b c d e>;\n    is(@a, @e, 'for (@a) { ... $_ ... } iterates all elems');\n}\n\n{\n    my @a;\n        for (@elems) -> $_ { push @a, $_ };\n    my @e = @elems;\n    is(@a, @e, 'for (@a)->$_ { ... $_ ... } iterates all elems' );\n}\n\n{\n    my @a;\n    for (@elems) { push @a, $_, $_; }\n    my @e = <a a b b c c d d e e>;\n    is(@a, @e, 'for (@a) { ... $_ ... $_ ... } iterates all elems, not just odd');\n}\n\n# \"for @a -> $var\" is ro by default.\n#?pugs skip 'parsefail'\n{\n    my @a = <1 2 3 4>;\n\n    eval_dies_ok('for @a -> $elem {$elem = 5}', '-> $var is ro by default');\n\n    for @a <-> $elem {$elem++;}\n    is(@a, <2 3 4 5>, '<-> $var is rw');\n\n    for @a <-> $first, $second {$first++; $second++}\n    is(@a, <3 4 5 6>, '<-> $var, $var2 works');\n}\n\n# for with \"is rw\"\n{\n    my @array_s = (0..2);\n    my @s = (1..3);\n    for @array_s { $_++ };\n    is(@array_s, @s, 'for @array { $_++ }');\n}\n\n{\n  my @array = <a b c d>;\n  for @array { $_ ~= \"c\" }\n  is ~@array, \"ac bc cc dc\",\n    'mutating $_ in for works';\n}\n\n{\n    my @array_t = (0..2);\n    my @t = (1..3);\n    for @array_t -> $val is rw { $val++ };\n    is(@array_t, @t, 'for @array -> $val is rw { $val++ }');\n}\n\n#?pugs skip \"Can't modify const item\"\n{\n    my @array_v = (0..2);\n    my @v = (1..3);\n    for @array_v.values -> $val is rw { $val++ };\n    is(@array_v, @v, 'for @array.values -> $val is rw { $val++ }');\n}\n\n#?pugs skip \"Can't modify const item\"\n{\n    my @array_kv = (0..2);\n    my @kv = (1..3);\n    for @array_kv.kv -> $key, $val is rw { $val++ };\n    is(@array_kv, @kv, 'for @array.kv -> $key, $val is rw { $val++ }');\n}\n\n#?pugs skip \"Can't modify const item\"\n{\n    my %hash_v = ( a => 1, b => 2, c => 3 );\n    my %v = ( a => 2, b => 3, c => 4 );\n    for %hash_v.values -> $val is rw { $val++ };\n    is(%hash_v, %v, 'for %hash.values -> $val is rw { $val++ }');\n}\n\n#?pugs todo\n{\n    my %hash_kv = ( a => 1, b => 2, c => 3 );\n    my %kv = ( a => 2, b => 3, c => 4 );\n    try { for %hash_kv.kv -> $key, $val is rw { $val++ }; };\n    is( %hash_kv, %kv, 'for %hash.kv -> $key, $val is rw { $val++ }');\n}\n\n# .key //= ++$i for @array1;\nclass TestClass{ has $.key is rw  };\n\n{\n   my @array1 = (TestClass.new(:key<1>),TestClass.new());\n   my $i = 0;\n   for @array1 { .key //= ++$i }\n   my $sum1 = [+] @array1.map: { $_.key };\n   is( $sum1, 2, '.key //= ++$i for @array1;' );\n\n}\n\n# .key = 1 for @array1;\n{\n   my @array1 = (TestClass.new(),TestClass.new(:key<2>));\n\n   .key = 1 for @array1;\n   my $sum1 = [+] @array1.map: { $_.key };\n   is($sum1, 2, '.key = 1 for @array1;');\n}\n\n# $_.key = 1 for @array1;\n{\n   my @array1 = (TestClass.new(),TestClass.new(:key<2>));\n\n   $_.key = 1 for @array1;\n   my $sum1 = [+] @array1.map: { $_.key };\n   is( $sum1, 2, '$_.key = 1 for @array1;');\n\n}\n\n# rw scalars\n#L<S04/The C<for> statement/implicit parameter to block read/write \"by default\">\n{\n    my ($a, $b, $c) = 0..2;\n    try { for ($a, $b, $c) { $_++ } };\n    is( [$a,$b,$c], [1,2,3], 'for ($a,$b,$c) { $_++ }');\n\n    ($a, $b, $c) = 0..2;\n    try { for ($a, $b, $c) -> $x is rw { $x++ } };\n    is( [$a,$b,$c], [1,2,3], 'for ($a,$b,$c) -> $x is rw { $x++ }');\n}\n\n# list context\n\n{\n    my $a = '';\n    my $b = '';\n    for 1..3, 4..6 { $a ~= $_.WHAT.gist ; $b ~= Int.gist };\n    is($a, $b, 'List context');\n\n    $a = '';\n    for [1..3, 4..6] { $a ~= $_.WHAT.gist };\n    is($a, Array.gist, 'List context');\n\n    $a = '';\n    $b = '';\n    for [1..3], [4..6] { $a ~= $_.WHAT.gist ; $b ~= Array.gist };\n    is($a, $b, 'List context');\n}\n\n{\n    # this was a rakudo bug with mixed 'for' and recursion, which seems to \n    # confuse some lexical pads or the like, see RT #58392\n    my $gather = '';\n    sub f($l) {\n        if $l <= 0 {\n            return $l;\n        }\n        $gather ~= $l;\n        for 1..3 {\n        f($l-1);\n            $gather ~= '.';\n        }\n    }\n    f(2);\n\n    is $gather, '21....1....1....', 'Can mix recursion and for';\n}\n\n# another variation\n{\n    my $t = '';\n    my $c;\n    sub r($x) {\n        my $h = $c++;\n        r $x-1 if $x;\n        for 1 { $t ~= $h };\n    };\n    r 3;\n    is $t, '3210', 'can mix recursion and for (RT 103332)';\n}\n\n# grep and sort in for - these were pugs bugs once, so let's\n# keep them as regression tests\n\n{\n  my @array = <1 2 3 4>;\n  my $output = '';\n\n  for (grep { 1 }, @array) -> $elem {\n    $output ~= \"$elem,\";\n  }\n\n  is $output, \"1,2,3,4,\", \"grep works in for\";\n}\n\n{\n  my @array = <1 2 3 4>;\n  my $output = '';\n\n  for @array.sort -> $elem {\n    $output ~= \"$elem,\";\n  }\n\n  is $output, \"1,2,3,4,\", \"sort works in for\";\n}\n\n{\n  my @array = <1 2 3 4>;\n  my $output = '';\n\n  for (grep { 1 }, @array.sort) -> $elem {\n    $output ~= \"$elem,\";\n  }\n\n  is $output, \"1,2,3,4,\", \"grep and sort work in for\";\n}\n\n# L<S04/Statement parsing/keywords require whitespace>\neval_dies_ok('for(0..5) { }','keyword needs at least one whitespace after it');\n\n# looping with more than one loop variables\n{\n  my @a = <1 2 3 4>;\n  my $str = '';\n  for @a -> $x, $y { \n    $str ~= $x+$y;\n  }\n  is $str, \"37\", \"for loop with two variables\";\n}\n\n{\n  #my $str = '';\n  eval_dies_ok('for 1..5 ->  $x, $y { $str ~= \"$x$y\" }', 'Should throw exception, no value for parameter $y');\n  #is $str, \"1234\", \"loop ran before throwing exception\";\n  #diag \">$str<\";\n}\n\n#?rakudo skip 'optional variable in for loop (RT #63994)'\n#?niecza 2 todo 'NYI'\n{\n  my $str = '';\n  for 1..5 -> $x, $y? {\n    $str ~= \" \" ~ $x*$y;\n  }\n  is $str, \" 2 12 0\";\n}\n\n{\n  my $str = '';\n  for 1..5 -> $x, $y = 7 {\n    $str ~= \" \" ~ $x*$y;\n  }\n  is $str, \" 2 12 35\", 'default values in for-loops';\n}\n\n#?pugs todo\n{\n  my @a = <1 2 3>;\n  my @b = <4 5 6>;\n  my $res = '';\n  for @a Z @b -> $x, $y {\n    $res ~= \" \" ~ $x * $y;\n  }\n  is $res, \" 4 10 18\", \"Z -ed for loop\";\n}\n\n#?pugs todo\n{\n  my @a = <1 2 3>;\n  my $str = '';\n\n  for @a Z @a Z @a Z @a Z @a -> $q, $w, $e, $r, $t {\n    $str ~= \" \" ~ $q*$w*$e*$r*$t;\n  }\n  is $str, \" 1 {2**5} {3**5}\", \"Z-ed for loop with 5 arrays\";\n}\n\n{\n  eval_dies_ok 'for 1.. { };', \"Please use ..* for indefinite range\";\n  eval_dies_ok 'for 1... { };', \"1... does not exist\";\n}\n\n{\n  my $c;\n  for 1..8 {\n    $c = $_;\n    last if $_ == 6;\n  }\n  is $c, 6, 'for loop ends in time using last';\n}\n\n{\n  my $c;\n  for 1..* {\n    $c = $_;\n    last if $_ == 6;\n  }\n  is $c, 6, 'infinte for loop ends in time using last';\n}\n\n{\n  my $c;\n  for 1..Inf {\n    $c = $_;\n    last if $_ == 6;\n  }\n  is $c, 6, 'infinte for loop ends in time using last';\n}\n\n# RT #62478\n#?pugs todo\n{\n    try { EVAL('for (my $ii = 1; $ii <= 3; $ii++) { say $ii; }') };\n    ok \"$!\" ~~ /C\\-style/,   'mentions C-style';\n    ok \"$!\" ~~ /for/,        'mentions for';\n    ok \"$!\" ~~ /loop/,       'mentions loop';\n}\n\n# RT #65212\n#?pugs todo\n{\n    my $parsed = 0;\n    try { EVAL '$parsed = 1; for (1..3)->$n { last }' };\n    ok ! $parsed, 'for (1..3)->$n   fails to parse';\n}\n\n# RT #71268\n{\n    sub rt71268 { for ^1 {} }\n    #?pugs todo\n    lives_ok { ~(rt71268) }, 'can stringify \"for ^1 {}\" without death';\n    #?pugs skip 'Cannot cast from VList to VCode'\n    ok rt71268() ~~ (), 'result of \"for ^1 {}\" is ()';\n}\n\n# RT 62478\n{\n    eval_dies_ok 'for (my $i; $i <=3; $i++) { $i; }', 'Unsupported use of C-style \"for (;;)\" loop; in Perl 6 please use \"loop (;;)\"';\n}\n\n#?pugs todo\n{\n    try { EVAL 'for (my $x; $x <=3; $x++) { $i; }'; diag($!) };\n    ok $! ~~ / 'C-style' /, 'Sensible error message';\n}\n\n# RT #64886\n#?rakudo skip 'maybe bogus, for loops are not supposed to be lazy?'\n{\n    my $a = 0;\n    for 1..10000000000 {\n        $a++;\n        last;\n    }\n    is $a, 1, 'for on Range with huge max value is lazy and enters block';\n}\n\n# RT #60780\nlives_ok {\n    for 1 .. 5 -> $x, $y? { }\n}, 'Iteration variables do not need to add up if one is optional';\n\n# RT #78232\n{\n    my $a = 0;\n    for 1, 2, 3 { sub foo {}; $a++ }\n    is $a, 3, 'RT #78232';\n}\n\n# http://irclog.perlgeek.de/perl6/2011-12-29#i_4892285\n# (Niecza bug)\n{\n    my $x = 0;\n    for 1 .. 2 -> $a, $b { $x = $b } #OK not used\n    is $x, 2, 'Lazy lists interact properly with multi-element for loops';\n}\n\n# RT #71270\n# list comprehension\n#?pugs skip 'Cannot cast from VList to VCode'\n{\n    sub f() { for ^1 { } };\n    is ~f(), '', 'empty for-loop returns empty list';\n}\n\n# RT #74060\n# more list comprehension\n#?pugs skip 'parsefail'\n#?niecza todo \"https://github.com/sorear/niecza/issues/180\"\n{\n    my @s = ($_ * 2 if $_ ** 2 > 3 for 0 .. 5);\n    is ~@s, '4 6 8 10', 'Can use statement-modifying \"for\" in list comprehension';\n}\n\n# RT 113026\n#?rakudo todo 'RT 113026 array iterator does not track a growing array'\n#?niecza todo 'array iterator does not track a growing array'\n#?pugs todo\n{\n    my @rt113026 = 1 .. 10;\n    my $iter = 0;\n    for @rt113026 -> $n {\n\t$iter++;\n\tif $iter % 2 {\n\t    @rt113026.push: $n;\n\t}\n    }\n    is $iter, 20, 'iterating over an expanding list';\n    is @rt113026, <1 2 3 4 5 6 7 8 9 10 1 3 5 7 9 1 5 9 5 5>,\n       'array expanded in for loop is expanded';\n}\n\n# RT #78406\n{\n    my $c = 0;\n    dies_ok { for ^8 { .=fmt('%03b'); $c++ } }, '$_ is read-only here';\n    is $c, 0, '... and $_ is *always* read-only here';\n}\n\ndies_ok\n    {\n        my class Foo {\n            has @.items;\n            method check_items { for @.items -> $item { die \"bad\" if $item == 2 } }\n            method foo { self.check_items; .say for @.items }\n        }\n        Foo.new(items => (1, 2, 3, 4)).foo\n    }, 'for in called method runs (was a sink context bug)';\n\n# RT #77460\n#?pugs todo\n{\n    my @a = 1;\n    for 1..10 {\n        my $last = @a[*-1];\n        push @a, (sub ($s) { $s + 1 })($last)\n    };\n    is @a, [1, 2, 3, 4, 5, 6, 7, 8,9, 10, 11];\n}\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/grammar-test.p6",
    "content": "token pod_formatting_code {\n    $<code>=<[A..Z]>\n    '<' { $*POD_IN_FORMATTINGCODE := 1 }\n    $<content>=[ <!before '>'> <pod_string_character> ]+\n    '>' { $*POD_IN_FORMATTINGCODE := 0 }\n}\n\ntoken pod_string {\n    <pod_string_character>+\n}\n\ntoken something:sym«<» {\n    <!>\n}\n\ntoken name {\n    <!>\n}\n\ntoken comment:sym<#> {\n   '#' {} \\N*\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/hash.t",
    "content": "use v6;\n\nuse Test;\n\nplan(5);\n\nunless EVAL 'EVAL(\"1\", :lang<perl5>)' {\n    skip_rest;\n    exit;\n}\n\ndie unless\nEVAL(q/\npackage My::Hash;\n\nsub new {\n    my ($class, $ref) = @_;\n    bless \\$ref, $class;\n}\n\nsub hash {\n    my $self = shift;\n    return $$self;\n}\n\nsub my_keys {\n    my $self = shift;\n    return keys %{$$self};\n}\n\nsub my_exists {\n    my ($self, $idx) = @_;\n    return exists $$self->{$idx};\n}\n\nsub fetch {\n    my ($self, $idx) = @_;\n    return $$self->{$idx};\n}\n\nsub store {\n    my ($self, $idx, $val) = @_;\n    $$self->{$idx} = $val;\n}\n\nsub push {\n    my ($self, $val) = @_;\n}\n\n1;\n/, :lang<perl5>);\n\nmy $p5ha = EVAL('sub { My::Hash->new($_[0]) }', :lang<perl5>);\nmy %hash = (5 => 'a', 6 => 'b', 7 => 'c', 8 => 'd');\nmy $p5hash = $p5ha(\\%hash);\n\nmy $rethash = $p5hash.hash;\nmy @keys = %hash.keys.sort;\nmy @p5keys;\ntry {\n    @p5keys = $p5hash.my_keys; # this doesn't even pass lives_ok ??\n    @p5keys .= sort;\n};\n\nis(\"{ @keys }\", \"{ @p5keys }\");\n\nok($p5hash.store(9, 'e'), 'can store');\nis(%hash{9}, 'e', 'store result');\n\nis($p5hash.fetch(5), 'a', 'fetch result');\nis($p5hash.my_exists(5), %hash<5>:exists, 'exists');\n#?pugs todo 'bug'\nis($p5hash.my_exists(12), %hash<12>:exists, 'nonexists fail');\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/htmlify.pl",
    "content": "#!/usr/bin/env perl6\nuse v6;\n\n# This script isn't in bin/ because it's not meant to be installed.\n\nBEGIN say 'Initializing ...';\n\nuse Pod::To::HTML;\nuse URI::Escape;\nuse lib 'lib';\nuse Perl6::TypeGraph;\nuse Perl6::TypeGraph::Viz;\nuse Perl6::Documentable::Registry;\n\nmy $*DEBUG = False;\n\nmy $tg;\nmy %methods-by-type;\nmy $footer = footer-html;\nmy $head   = q[\n<link rel=\"icon\" href=\"/favicon.ico\" type=\"favicon.ico\" />\n<link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\" media=\"screen\" title=\"default\" />\n];\n\n\nsub url-munge($_) {\n    return $_ if m{^ <[a..z]>+ '://'};\n    return \"/type/$_\" if m/^<[A..Z]>/;\n    return \"/routine/$_\" if m/^<[a..z]>/;\n    # poor man's <identifier>\n    if m/ ^ '&'( \\w <[[\\w'-]>* ) $/ {\n        return \"/routine/$0\";\n    }\n    return $_;\n}\n\nsub p2h($pod) {\n    pod2html($pod, :url(&url-munge), :$footer, :$head);\n}\n\nsub pod-gist(Pod::Block $pod, $level = 0) {\n    my $leading = ' ' x $level;\n    my %confs;\n    my @chunks;\n    for <config name level caption type> {\n        my $thing = $pod.?\"$_\"();\n        if $thing {\n            %confs{$_} = $thing ~~ Iterable ?? $thing.perl !! $thing.Str;\n        }\n    }\n    @chunks = $leading, $pod.^name, (%confs.perl if %confs), \"\\n\";\n    for $pod.content.list -> $c {\n        if $c ~~ Pod::Block {\n            @chunks.push: pod-gist($c, $level + 2);\n        }\n        elsif $c ~~ Str {\n            @chunks.push: $c.indent($level + 2), \"\\n\";\n        } elsif $c ~~ Positional {\n            @chunks.push: $c.map: {\n                if $_ ~~ Pod::Block {\n                    *.&pod-gist\n                } elsif $_ ~~ Str {\n                    $_\n                }\n            }\n        }\n    }\n    @chunks.join;\n}\n\nsub recursive-dir($dir) {\n    my @todo = $dir;\n    gather while @todo {\n        my $d = @todo.shift;\n        for dir($d) -> $f {\n            if $f.f {\n                take $f;\n            }\n            else {\n                @todo.push($f.path);\n            }\n        }\n    }\n}\n\nsub first-code-block(@pod) {\n    if @pod[1] ~~ Pod::Block::Code {\n        return @pod[1].content.grep(Str).join;\n    }\n    '';\n}\n\nsub MAIN(Bool :$debug, Bool :$typegraph = False) {\n    $*DEBUG = $debug;\n\n    say 'Creating html/ subdirectories ...';\n    for '', <type language routine images op op/prefix op/postfix op/infix\n             op/circumfix op/postcircumfix op/listop> {\n        mkdir \"html/$_\" unless \"html/$_\".IO ~~ :e;\n    }\n\n    say 'Reading lib/ ...';\n    my @source  = recursive-dir('lib').grep(*.f).grep(rx{\\.pod$});\n       @source .= map: {; .path.subst('lib/', '').subst(rx{\\.pod$}, '').subst(:g, '/', '::') => $_ };\n\n    say 'Reading type graph ...';\n    $tg = Perl6::TypeGraph.new-from-file('type-graph.txt');\n    {\n        my %h = $tg.sorted.kv.flat.reverse;\n        @source .= sort: { %h{.key} // -1 };\n    }\n\n    my $dr = Perl6::Documentable::Registry.new;\n\n    say 'Processing Pod files ...';\n    for (0..* Z @source) -> $num, $_ {\n        my $podname  = .key;\n        my $file     = .value;\n        my $what     = $podname ~~ /^<[A..Z]> | '::'/  ?? 'type' !! 'language';\n        printf \"% 4d/%d: % -40s => %s\\n\", $num, +@source, $file.path, \"$what/$podname\";\n\n        my $pod  = eval slurp($file.path) ~ \"\\n\\$=pod\";\n           $pod .= [0];\n\n        if $what eq 'language' {\n            write-language-file(:$dr, :$what, :$pod, :$podname);\n        }\n        else {\n            say pod-gist($pod[0]) if $*DEBUG;\n            write-type-file(:$dr, :$what, :pod($pod[0]), :$podname);\n        }\n    }\n\n    say 'Composing doc registry ...';\n    $dr.compose;\n\n    write-disambiguation-files($dr);\n    write-op-disambiguation-files($dr);\n    write-operator-files($dr);\n    write-type-graph-images(:force($typegraph));\n    write-search-file($dr);\n    write-index-file($dr);\n\n    say 'Writing per-routine files ...';\n    my %routine-seen;\n    for $dr.lookup('routine', :by<kind>).list -> $d {\n        next if %routine-seen{$d.name}++;\n        write-routine-file($dr, $d.name);\n        print '.'\n    }\n    say '';\n\n    say 'Processing complete.';\n}\n\nsub write-language-file(:$dr, :$what, :$pod, :$podname) {\n    spurt \"html/$what/$podname.html\", p2h($pod);\n    if $podname eq 'operators' {\n        my @chunks = chunks-grep($pod.content,\n                                 :from({ $_ ~~ Pod::Heading and .level == 2}),\n                                 :to({  $^b ~~ Pod::Heading and $^b.level <= $^a.level}),\n                                );\n        for @chunks -> $chunk {\n            my $heading = $chunk[0].content[0].content[0];\n            next unless $heading ~~ / ^ [in | pre | post | circum | postcircum ] fix | listop /;\n            my $what = ~$/;\n            my $operator = $heading.split(' ', 2)[1];\n            $dr.add-new(\n                        :kind<operator>,\n                        :subkind($what),\n                        :name($operator),\n                        :pod($chunk),\n                        :!pod-is-complete,\n                       );\n        }\n    }\n    $dr.add-new(\n                :kind<language>,\n                :name($podname),\n                :$pod,\n                :pod-is-complete,\n               );\n}\n\nsub write-type-file(:$dr, :$what, :$pod, :$podname) {\n    my @chunks = chunks-grep($pod.content,\n                             :from({ $_ ~~ Pod::Heading and .level == 2}),\n                             :to({  $^b ~~ Pod::Heading and $^b.level <= $^a.level}),\n                            );\n\n    if $tg.types{$podname} -> $t {\n        $pod.content.push: Pod::Block::Named.new(\n            name    => 'Image',\n            content => [ \"/images/type-graph-$podname.png\"],\n        );\n        $pod.content.push: pod-link(\n            'Full-size type graph image as SVG',\n            \"/images/type-graph-$podname.svg\",\n        );\n\n        my @mro = $t.mro;\n           @mro.shift; # current type is already taken care of\n\n        for $t.roles -> $r {\n            next unless %methods-by-type{$r};\n            $pod.content.push:\n                pod-heading(\"Methods supplied by role $r\"),\n                pod-block(\n                    \"$podname does role \",\n                    pod-link($r.name, \"/type/$r\"),\n                    \", which provides the following methods:\",\n                ),\n                %methods-by-type{$r}.list,\n                ;\n        }\n        for @mro -> $c {\n            next unless %methods-by-type{$c};\n            $pod.content.push:\n                pod-heading(\"Methods supplied by class $c\"),\n                pod-block(\n                    \"$podname inherits from class \",\n                    pod-link($c.name, \"/type/$c\"),\n                    \", which provides the following methods:\",\n                ),\n                %methods-by-type{$c}.list,\n                ;\n            for $c.roles -> $r {\n                next unless %methods-by-type{$r};\n                $pod.content.push:\n                    pod-heading(\"Methods supplied by role $r\"),\n                    pod-block(\n                        \"$podname inherits from class \",\n                        pod-link($c.name, \"/type/$c\"),\n                        \", which does role \",\n                        pod-link($r.name, \"/type/$r\"),\n                        \", which provides the following methods:\",\n                    ),\n                    %methods-by-type{$r}.list,\n                    ;\n            }\n        }\n    }\n    my $d = $dr.add-new(\n        :kind<type>,\n        # TODO: subkind\n        :$pod,\n        :pod-is-complete,\n        :name($podname),\n    );\n\n    for @chunks -> $chunk {\n        my $name = $chunk[0].content[0].content[0];\n        say \"$podname.$name\" if $*DEBUG;\n        next if $name ~~ /\\s/;\n        %methods-by-type{$podname}.push: $chunk;\n        # determine whether it's a sub or method\n        my Str $subkind;\n        {\n            my %counter;\n            for first-code-block($chunk).lines {\n                if ms/^ 'multi'? (sub|method)»/ {\n                    %counter{$0}++;\n                }\n            }\n            if %counter == 1 {\n                ($subkind,) = %counter.keys;\n            }\n            if %counter<method> {\n                write-qualified-method-call(\n                    :$name,\n                    :pod($chunk),\n                    :type($podname),\n                );\n            }\n        }\n\n        $dr.add-new(\n            :kind<routine>,\n            :$subkind,\n            :$name,\n            :pod($chunk),\n            :!pod-is-complete,\n            :origin($d),\n        );\n    }\n\n    spurt \"html/$what/$podname.html\", p2h($pod);\n}\n\nsub chunks-grep(:$from!, :&to!, *@elems) {\n    my @current;\n\n    gather {\n        for @elems -> $c {\n            if @current && ($c ~~ $from || to(@current[0], $c)) {\n                take [@current];\n                @current = ();\n                @current.push: $c if $c ~~ $from;\n            }\n            elsif @current or $c ~~ $from {\n                @current.push: $c;\n            }\n        }\n        take [@current] if @current;\n    }\n}\n\nsub pod-with-title($title, *@blocks) {\n    Pod::Block::Named.new(\n        name => \"pod\",\n        content => [\n            Pod::Block::Named.new(\n                name => \"TITLE\",\n                content => Array.new(\n                    Pod::Block::Para.new(\n                        content => [$title],\n                    )\n                )\n            ),\n            @blocks.flat,\n        ]\n    );\n}\n\nsub pod-block(*@content) {\n    Pod::Block::Para.new(:@content);\n}\n\nsub pod-link($text, $url) {\n    Pod::FormattingCode.new(\n        type    => 'L',\n        content => [\n            join('|', $text, $url),\n        ],\n    );\n}\n\nsub pod-item(*@content, :$level = 1) {\n    Pod::Item.new(\n        :$level,\n        :@content,\n    );\n}\n\nsub pod-heading($name, :$level = 1) {\n    Pod::Heading.new(\n        :$level,\n        :content[pod-block($name)],\n    );\n}\n\nsub write-type-graph-images(:$force) {\n    unless $force {\n        my $dest = 'html/images/type-graph-Any.svg'.path;\n        if $dest.e && $dest.modified >= 'type-graph.txt'.path.modified {\n            say \"Not writing type graph images, it seems to be up-to-date\";\n            say \"To force writing of type graph images, supply the --typegraph\";\n            say \"option at the command line, or delete\";\n            say \"file 'html/images/type-graph-Any.svg'\";\n            return;\n        }\n    }\n    say 'Writing type graph images to html/images/ ...';\n    for $tg.sorted -> $type {\n        my $viz = Perl6::TypeGraph::Viz.new-for-type($type);\n        $viz.to-file(\"html/images/type-graph-{$type}.svg\", format => 'svg');\n        $viz.to-file(\"html/images/type-graph-{$type}.png\", format => 'png', size => '8,3');\n        print '.'\n    }\n    say '';\n\n    say 'Writing specialized visualizations to html/images/ ...';\n    my %by-group = $tg.sorted.classify(&viz-group);\n    %by-group<Exception>.push: $tg.types< Exception Any Mu >;\n    %by-group<Metamodel>.push: $tg.types< Any Mu >;\n\n    for %by-group.kv -> $group, @types {\n        my $viz = Perl6::TypeGraph::Viz.new(:types(@types),\n                                            :dot-hints(viz-hints($group)),\n                                            :rank-dir('LR'));\n        $viz.to-file(\"html/images/type-graph-{$group}.svg\", format => 'svg');\n        $viz.to-file(\"html/images/type-graph-{$group}.png\", format => 'png', size => '8,3');\n    }\n}\n\nsub viz-group ($type) {\n    return 'Metamodel' if $type.name ~~ /^ 'Perl6::Metamodel' /;\n    return 'Exception' if $type.name ~~ /^ 'X::' /;\n    return 'Any';\n}\n\nsub viz-hints ($group) {\n    return '' unless $group eq 'Any';\n\n    return '\n    subgraph \"cluster: Mu children\" {\n        rank=same;\n        style=invis;\n        \"Any\";\n        \"Junction\";\n    }\n    subgraph \"cluster: Pod:: top level\" {\n        rank=same;\n        style=invis;\n        \"Pod::Config\";\n        \"Pod::Block\";\n    }\n    subgraph \"cluster: Date/time handling\" {\n        rank=same;\n        style=invis;\n        \"Date\";\n        \"DateTime\";\n        \"DateTime-local-timezone\";\n    }\n    subgraph \"cluster: Collection roles\" {\n        rank=same;\n        style=invis;\n        \"Positional\";\n        \"Associative\";\n        \"Baggy\";\n    }\n';\n}\n\nsub write-search-file($dr) {\n    say 'Writing html/search.html ...';\n    my $template = slurp(\"search_template.html\");\n    my @items;\n    my sub fix-url ($raw) { $raw.substr(1) ~ '.html' };\n    @items.push: $dr.lookup('language', :by<kind>).sort(*.name).map({\n        \"\\{ label: \\\"Language: {.name}\\\", value: \\\"{.name}\\\", url: \\\"{ fix-url(.url) }\\\" \\}\"\n    });\n    @items.push: $dr.lookup('type', :by<kind>).sort(*.name).map({\n        \"\\{ label: \\\"Type: {.name}\\\", value: \\\"{.name}\\\", url: \\\"{ fix-url(.url) }\\\" \\}\"\n    });\n    my %seen;\n    @items.push: $dr.lookup('routine', :by<kind>).grep({!%seen{.name}++}).sort(*.name).map({\n        \"\\{ label: \\\"{ (.subkind // 'Routine').tclc }: {.name}\\\", value: \\\"{.name}\\\", url: \\\"{ fix-url(.url) }\\\" \\}\"\n    });\n    sub escape(Str $s) {\n        $s.trans([</ \\\\ \">] => [<\\\\/ \\\\\\\\ \\\\\">]);\n    }\n    @items.push: $dr.lookup('operator', :by<kind>).map({\n        qq[\\{ label: \"$_.human-kind() {escape .name}\", value: \"{escape .name}\", url: \"{ fix-url .url }\"\\}]\n    });\n\n    my $items = @items.join(\",\\n\");\n    spurt(\"html/search.html\", $template.subst(\"ITEMS\", $items));\n}\n\nmy %operator_disambiguation_file_written;\n\nsub write-disambiguation-files($dr) {\n    say 'Writing disambiguation files ...';\n    for $dr.grouped-by('name').kv -> $name, $p is copy {\n        print '.';\n        my $pod = pod-with-title(\"Disambiguation for '$name'\");\n        if $p.elems == 1 {\n            $p.=[0] if $p ~~ Array;\n            if $p.origin -> $o {\n                $pod.content.push:\n                    pod-block(\n                        pod-link(\"'$name' is a $p.human-kind()\", $p.url),\n                        ' from ',\n                        pod-link($o.human-kind() ~ ' ' ~ $o.name, $o.url),\n                    );\n            }\n            else {\n                $pod.content.push:\n                    pod-block(\n                        pod-link(\"'$name' is a $p.human-kind()\", $p.url)\n                    );\n            }\n        }\n        else {\n            $pod.content.push:\n                pod-block(\"'$name' can be anything of the following\"),\n                $p.map({\n                    if .origin -> $o {\n                        pod-item(\n                            pod-link(.human-kind, .url),\n                            ' from ',\n                            pod-link($o.human-kind() ~ ' ' ~ $o.name, $o.url),\n                        )\n                    }\n                    else {\n                        pod-item( pod-link(.human-kind, .url) )\n                    }\n                });\n        }\n        my $html = p2h($pod);\n        spurt \"html/$name.html\", $html;\n        if all($p>>.kind) eq 'operator' {\n            spurt \"html/op/$name.html\", $html;\n            %operator_disambiguation_file_written{$p[0].name} = 1;\n        }\n    }\n    say '';\n}\n\nsub write-op-disambiguation-files($dr) {\n    say 'Writing operator disambiguation files ...';\n    for $dr.lookup('operator', :by<kind>).classify(*.name).kv -> $name, @ops {\n        next unless %operator_disambiguation_file_written{$name};\n        my $pod = pod-with-title(\"Disambiguation for '$name'\");\n        if @ops == 1 {\n            my $p = @ops[0];\n            if $p.origin -> $o {\n                $pod.content.push:\n                    pod-block(\n                        pod-link(\"'$name' is a $p.human-kind()\", $p.url),\n                        ' from ',\n                        pod-link($o.human-kind() ~ ' ' ~ $o.name, $o.url),\n                    );\n            }\n            else {\n                $pod.content.push:\n                    pod-block(\n                        pod-link(\"'$name' is a $p.human-kind()\", $p.url)\n                    );\n            }\n        }\n        else {\n            $pod.content.push:\n                pod-block(\"'$name' can be anything of the following\"),\n                @ops.map({\n                    if .origin -> $o {\n                        pod-item(\n                            pod-link(.human-kind, .url),\n                            ' from ',\n                            pod-link($o.human-kind() ~ ' ' ~ $o.name, $o.url),\n                        )\n                    }\n                    else {\n                        pod-item( pod-link(.human-kind, .url) )\n                    }\n                });\n        }\n        my $html = p2h($pod);\n        spurt \"html/$name.html\", $html;\n    }\n\n}\n\nsub write-operator-files($dr) {\n    say 'Writing operator files ...';\n    for $dr.lookup('operator', :by<kind>).list -> $doc {\n        my $what  = $doc.subkind;\n        my $op    = $doc.name;\n        my $pod   = pod-with-title(\n            \"$what.tclc() $op operator\",\n            pod-block(\n                \"Documentation for $what $op, extracted from \",\n                pod-link(\"the operators language documentation\", \"/language/operators\")\n            ),\n            @($doc.pod),\n        );\n        spurt \"html/op/$what/$op.html\", p2h($pod);\n    }\n}\n\nsub write-index-file($dr) {\n    say 'Writing html/index.html ...';\n    my %routine-seen;\n    my $pod = pod-with-title('Perl 6 Documentation',\n        Pod::Block::Para.new(\n            content => ['Official Perl 6 documentation'],\n        ),\n        # TODO: add more\n        pod-heading(\"Language Documentation\"),\n        $dr.lookup('language', :by<kind>).sort(*.name).map({\n            pod-item( pod-link(.name, .url) )\n        }),\n        pod-heading('Types'),\n        $dr.lookup('type', :by<kind>).sort(*.name).map({\n            pod-item(pod-link(.name, .url))\n        }),\n        pod-heading('Routines'),\n        $dr.lookup('routine', :by<kind>).sort(*.name).map({\n            next if %routine-seen{.name}++;\n            pod-item(pod-link(.name, .url))\n        }),\n    );\n    spurt 'html/index.html', p2h($pod);\n}\n\nsub write-routine-file($dr, $name) {\n    say 'Writing html/routine/$name.html ...' if $*DEBUG;\n    my @docs = $dr.lookup($name, :by<name>).grep(*.kind eq 'routine');\n    my $subkind = 'routine';\n    {\n        my @subkinds = @docs>>.subkind;\n        $subkind = @subkinds[0] if all(@subkinds>>.defined) && [eq] @subkinds;\n    }\n    my $pod = pod-with-title(\"Documentation for $subkind $name\",\n        pod-block(\"Documentation for $subkind $name, assembled from the\n            following types:\"),\n        @docs.map({\n            pod-heading(.origin.name ~ '.' ~ .name),\n            pod-block(\"From \", pod-link(.origin.name, .origin.url ~ '#' ~ .name)),\n            .pod.list,\n        })\n    );\n    spurt \"html/routine/$name.html\", p2h($pod);\n}\n\nsub write-qualified-method-call(:$name!, :$pod!, :$type!) {\n    my $p = pod-with-title(\n        \"Documentation for method $type.$name\",\n        pod-block('From ', pod-link($type, \"/type/{$type}#$name\")),\n        @$pod,\n    );\n    spurt \"html/{$type}.{$name}.html\", p2h($p);\n}\n\nsub footer-html() {\n    state $dt = ~DateTime.now;\n    qq[\n    <div id=\"footer\">\n        <p>\n            Generated on $dt from the sources at\n            <a href=\"https://github.com/perl6/doc\">perl6/doc on github</a>.\n        </p>\n        <p>\n            This is a work in progress to document Perl 6, and known to be\n            incomplete. Your contribution is appreciated.\n        </p>\n    </div>\n    ];\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/listquote-whitespace.t",
    "content": "use v6;\n\nuse Test;\n\n# L<S02/Whitespace and Comments>\n\n=begin kwid\n\n= DESCRIPTION\n\nTests that the List quoting parser properly\nignores whitespace in lists. This becomes important\nif your line endings are \\x0d\\x0a.\n\nCharacters that should be ignored are:\n\n    \\t\n    \\r\n    \\n\n    \\x20\n\nMost likely there are more. James tells me that\nthe maximum Unicode char is \\x10FFFF , so maybe\nwe should simply (re)construct the whitespace\nlist via IsSpace or \\s on the fly.\n\nOf course, in the parsed result, no item should\ncontain whitespace.\n\nC<\\xA0> is specifically an I<nonbreaking> whitespace\ncharacter and thus should B<not> break the list.\n\n=end kwid\n\n#?pugs emit if $?PUGS_BACKEND ne \"BACKEND_PUGS\" {\n#?pugs emit   skip_rest \"PIL2JS and PIL-Run do not support EVAL() yet.\";\n#?pugs emit   exit;\n#?pugs emit }\n\nmy @list = <a b c d>;\nmy @separators = (\"\\t\",\"\\r\",\"\\n\",\" \");\nmy @nonseparators = (\",\",\"/\",\"\\\\\",\";\",\"\\xa0\");\n\nplan +@separators + @nonseparators + 3;\n\nfor @separators -> $sep {\n  my $str = \"<$sep\" ~ @list.join(\"$sep$sep\") ~ \"$sep>\";\n  my @res = EVAL $str;\n\n  my $vis = sprintf \"%02x\", ord $sep;\n  is( @res, @list, \"'\\\\x$vis\\\\x$vis' is properly parsed as list whitespace\")\n};\n\nfor @nonseparators -> $sep {\n  my $ex = @list.join($sep);\n  my $str = \"<\" ~$ex~ \">\";\n  my @res = EVAL $str;\n\n  my $vis = sprintf \"%02x\", ord $sep;\n  #?rakudo emit if $sep eq \"\\xa0\" {\n  #?rakudo emit      todo('\\xa0 should not be a separator for list quotes');\n  #?rakudo emit };\n  #?niecza emit if $sep eq \"\\xa0\" {\n  #?niecza emit      todo('\\xa0 should not be a separator for list quotes');\n  #?niecza emit };\n  is( @res, [@list.join($sep)], \"'\\\\x$vis' does not split in a whitespace quoted list\")\n};\n\nis < foo  \n\t    >, 'foo', 'various combinations of whitespaces are stripped';\n\n# RT #73772\nisa_ok < >, Parcel, '< > (only whitespaces) is empty Parcel';\nis < >.elems, 0, \".. and it's really empty\";\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/man-or-boy.t",
    "content": "use Test;\n\n# stress test for lexicals and lexical subs\n# See \n# http://en.wikipedia.org/w/index.php?title=Man_or_boy_test&oldid=249795453#Perl\n\nmy @results = 1, 0, -2, 0, 1, 0, 1, -1, -10, -30;\n\n# if we want to *really* stress-test, we can use a few more tests:\n# my @results = 1, 0, -2, 0, 1, 0, 1, -1, -10, -30, -67, -138\n# -291, -642, -1446, -3250, -7244, -16065, -35601, -78985;\n\nplan +@results;\n\nsub A($k is copy, &x1, &x2, &x3, &x4, &x5) {\n    my $B;\n    $B = sub (*@) { A(--$k, $B, &x1, &x2, &x3, &x4) };\n    if ($k <= 0) {\n        return    x4($k, &x1, &x2, &x3, &x4, &x5)\n                + x5($k, &x1, &x2, &x3, &x4, &x5);\n    }\n    return $B();\n};\n\nfor 0 .. (@results-1) -> $i {\n    is A($i, sub (*@) {1}, sub (*@) {-1}, sub (*@) {-1}, sub (*@) {1}, sub (*@) {0}),\n       @results[$i],\n       \"man-or-boy test for start value $i\";\n}\n\n\n# vim: ft=perl6\n"
  },
  {
    "path": "src/test/resources/samples/langs/Perl 6/test.p6",
    "content": "#!/usr/bin/env perl6\n\nuse v6;\n\nmy $string = 'I look like a # comment!';\n\nif $string eq 'foo' {\n    say 'hello';\n}\n\nregex http-verb {\n      'GET'\n    | 'POST'\n    | 'PUT'\n    | 'DELETE'\n    | 'TRACE'\n    | 'OPTIONS'\n    | 'HEAD'\n}\n\n# a sample comment\n\nsay 'Hello from Perl 6!'\n\n\n#`{\nmulti-line comment!\n}\n\nsay 'here';\n\n#`(\nmulti-line comment!\n)\n\nsay 'here';\n\n#`{{{\nI'm a special comment!\n}}}\n\nsay 'there';\n\n#`{{\nI'm { even } specialer!\n}}\n\nsay 'there';\n\n#`{{\ndoes {{nesting}} work?\n}}\n\n#`«<\ntrying mixed delimiters\n»\n\nmy $string = qq<Hooray, arbitrary delimiter!>;\nmy $string = qq«Hooray, arbitrary delimiter!»;\nmy $string = q <now with whitespace!>;\nmy $string = qq<<more strings>>;\n\nmy %hash := Hash.new;\n\n=begin pod\n\nHere's some POD!  Wooo\n\n=end pod\n\n=for Testing\n    This is POD (see? role isn't highlighted)\n\nsay('this is not!');\n\nsay 'Moar code!';\n\nmy $don't = 16;\n\nsub don't($x) {\n    !$x\n}\n\nsay don't 'foo';\n\nmy %hash = (\n    :foo(1),\n);\n\nsay %hash<foo>;\nsay %hash<<foo>>;\nsay %hash«foo»;\n\nsay %*hash<foo>;\nsay %*hash<<foo>>;\nsay %*hash«foo»;\n\nsay $<todo>;\nsay $<todo>;\n\nfor (@A Z @B) -> $a, $b {\n    say $a + $b;\n}\n\nQ:PIR {\n    .loadlib \"somelib\"\n}\n\nmy $longstring = q/\n    lots\n    of\n    text\n/;\n\nmy $heredoc = q:to/END_SQL/;\nSELECT * FROM Users\nWHERE first_name = 'Rob'\nEND_SQL\nmy $hello;\n\n# Fun with regexen\n\nif 'food' ~~ /foo/ {\n    say 'match!'\n}\n\nmy $re  = /foo/;\nmy $re2 = m/ foo /;\nmy $re3 = m:i/ FOO /;\n\ncall-a-sub(/ foo /);\ncall-a-sub(/ foo \\/ bar /);\n\nmy $re4    = rx/something | something-else/;\nmy $result = ms/regexy stuff/;\nmy $sub0   = s/regexy stuff/more stuff/;\nmy $sub    = ss/regexy stuff/more stuff/;\nmy $trans  = tr/regexy stuff/more stuff/;\n\nmy @values = <a b c d>;\ncall-sub(<a b c d>);\ncall-sub <a b c d>;\n\nmy $result = $a < $b;\n\nfor <a b c d> -> $letter {\n    say $letter;\n}\n\nsub test-sub {\n    say @_;\n    say $!;\n    say $/;\n    say $0;\n    say $1;\n    say @*ARGS;\n    say $*ARGFILES;\n    say &?BLOCK;\n    say ::?CLASS;\n    say $?CLASS;\n    say @=COMMENT;\n    say %?CONFIG;\n    say $*CWD;\n    say $=data;\n    say %?DEEPMAGIC;\n    say $?DISTRO;\n    say $*DISTRO;\n    say $*EGID;\n    say %*ENV;\n    say $*ERR;\n    say $*EUID;\n    say $*EXECUTABLE_NAME;\n    say $?FILE;\n    say $?GRAMMAR;\n    say $*GID;\n    say $*IN;\n    say @*INC;\n    say %?LANG;\n    say $*LANG;\n    say $?LINE;\n    say %*META-ARGS;\n    say $?MODULE;\n    say %*OPTS;\n    say %*OPT;\n    say $?KERNEL;\n    say $*KERNEL;\n    say $*OUT;\n    say $?PACKAGE;\n    say $?PERL;\n    say $*PERL;\n    say $*PID;\n    say %=pod;\n    say $*PROGRAM_NAME;\n    say %*PROTOCOLS;\n    say ::?ROLE;\n    say $?ROLE;\n    say &?ROUTINE;\n    say $?SCOPE;\n    say $*TZ;\n    say $*UID;\n    say $?USAGE;\n    say $?VM;\n    say $?XVM;\n}\n\nsay <a b c>;\n\nmy $perl5_re = m:P5/ fo{2} /;\nmy $re5      = rx«something | something-else»;\n\nmy $M := %*COMPILING<%?OPTIONS><M>;\n\nsay $M;\n\nsub regex-name { ... }\nmy $pair = role-name => 'foo';\n$pair = rolesque => 'foo';\n\nmy sub something(Str:D $value) { ... }\n\nmy $s = q«<\nsome\nstring\nstuff\n»;\n\nmy $regex = m«< some chars »;\n# after\n\nsay $/<foo><bar>;\n\nroleq;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pic/dextroamphetamine.chem",
    "content": "# Dextroamphetamine molecule\n.cstart\n\t.ps 26\n\tsize 28\nR1:\n\tring double 1,2 3,4 5,6\n\tbond 60 from R1.V2\n\tbond 120\nA1:\n\tfront bond down ; CH3\n\tbond 60 from A1 ; NH2\n\t.ps\n.cend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pic/graph.pic",
    "content": ".PS\n\tellipse \"Pic\" \"example\"\n\tarrow\n\tbox \"This is\" \"a box\" \n\tarrow right\n\tbox \"Another\" \"box\" dashed\n\tmove down then right;\nThing: ellipse \"This is a\" \"circle-thing\"\n\tarrow <-> from last box.r to Thing.l\n\tmove down then left;\nB: box \"Still a box\"\n\tarrow from Thing.l to B.r\n\tsprintf(\"Width = %g, Height = %g \", B.wid, B.ht) rjust at B.w\n\tmove down\n.ps 15\n\tdefine sadness {\n\t\tboxwid = 3;\n\t\tboxht = 1;\n\t\ttextht = .5;\n\t\tbox \"\\\"I run from my depression by\" \" \" \"burying myself in code\\\"\"\n\t\tarrow down from last box.s\n\t\t\"Me\"\n\t}\n\tsadness();\n.PE\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pic/ritalin.chem",
    "content": ".\\\" RITALIN: Methylphenidate Hydrochloride\n.cstart\n.ps 15\nsize 15\n\tR1: ring double 1,2 3,4 5,6 pointing up\n\tbond 60 length .35 from R1.V2 ; BP\n\tbond 120 length .35 from BP\n\tR2: ring pointing up put N at 1\n\tH above R2\n\tbond up  length .35 from BP ; BP\n\tbond -60 length .35 from BP ; O\n\tbond up\n\tdouble bond 60 length .35 from BP ; O\n.ps 10\n.cend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pickle/data.pkl",
    "content": "(dp0\nS'a'\np1\n(lp2\nI1\naF2.0\naI3\nac__builtin__\ncomplex\np3\n(F4.0\nF6.0\ntp4\nRp5\nasS'c'\np6\nNsS'b'\np7\n(S'string'\np8\nVUnicode string\np9\ntp10\ns."
  },
  {
    "path": "src/test/resources/samples/langs/Pickle/neural-network-ce-l2reg-784-10-30.pkl",
    "content": "(cnumpy.core.multiarray\n_reconstruct\np1\n(cnumpy\nndarray\np2\n(I0\ntS'b'\ntRp3\n(I1\n(I10\nI784\ntcnumpy\ndtype\np4\n(S'f8'\nI0\nI1\ntRp5\n(I3\nS'<'\nNNNI-1\nI-1\nI0\ntbI00\nS'B\\xf9\\xc2tq0\\xed?\\xe7\\xcd\\xa1\\x01\\xe7\\xb9\\xca\\xbf\\x19X;&x8\\xea?\\xa9V\\xc7\\xf2\\x81\\xd3\\xd8\\xbf\\xaa\\xa8fs\\x88\\xaa\\xe6?\\x1bC\\xde\\xe8,!\\xf0?\\xf3\\x10%y\\x89\\x83\\xe9\\xbf\\xc5\\x9dY\\t{\\x94\\xf4\\xbf:/\\x18\\x10l\\xd7\\xe2?[g\\x8f\\xa8O\\x99\\xc9\\xbf\\xeb\\x11g\\x06\\xe9\\xd2\\xe0\\xbf\\xd7\\xe6R\\x0b\\xd5\\x19\\xe8\\xbfF\\x90\\xef\\xfe\\x05>\\xd9\\xbf_\\x82u\\x8d\\xa2\\xd3\\xae\\xbf/\\x91\\x97\\x8b>I\\xca?f\\x9a\\xb7\\x15O!\\xd0\\xbf|\\xff\\xfe\\x98#\\x1f\\xd2\\xbf\\x98J@kO\\xa6\\xe4\\xbf\\x90\\x94@ \\x82\\xbf\\xd9?=2\\x1f\\xc7\\xcbi\\xf1?\\xbc\\x07\\x9cJj\\x96\\xed\\xbf\\xc0\\xf2c\\x8f\\xb4\\xc3\\xca\\xbf\\xb8):\\x0f\\x8e\\x00\\xe1?\\xc6\\xfe\\xae\\n\\xc0M\\xce?\\xf0hf:]#\\xd1?\\xd6f9_\\xf0\\t\\xe4?\\xbd1\\x8b\\xf3T7\\xf3?\\xcfCX\\xbfQ\\xf5\\xec\\xbf\\xaaP^\\xaf\\x00\\xe0\\x8e\\xbf\\xa4\\x122FP!\\xd4?\\xcf\\xa5>\\xa6\\xee\\xc0\\xd9\\xbf\\xeb\\xae\\x90\\xd2*\\x05\\xdf?\\xb2nPzh\\xa0\\xf3?d\\xf8\\xa8P\\xf9d\\xb6?\\x1e\\x8b\\x1b\\xfe\\x9e\\xf2\\xc6?\\xb8\\x92.\\x1c\\\\1\\xd3?`hs\\xc7;T\\xd2?MQ\\x99+\\xfc\\x9c\\xf0?;\\\\F\\xf40=\\xb9?Y\\xbc\\xd4\\xb5\\xf9\\xe6\\xa5\\xbf?\\x02\\xf4\\xa6\\xc6\\x9d\\xe5\\xbf\\xe0\\x94\\xf0\\xef#\\x7f\\xd2\\xbf\\xf2\\xd7\\\\I\\x8eh\\xc8?\\xf1\\xd9S\\xf1-\\xef\\xda\\xbf\\x1e\\xe9\\xbeZ\\xbav\\xff?n\\xb7erb\\xdf\\xbe\\xbf\\xc8\\xa9d\\xe9\\xb1\\x81\\xf1\\xbf\\x0f\\x81\\xa5E{\\xfc\\xd1?*\\x8d\\xb8s\\x05T\\xef\\xbf\\xf3.s\\xf0\\x1e\\xe8\\xdd?\\xcab\\x0cT\\x1bZ\\xe9?\\xc4\\xf3\\rQ\\xdd\\x10\\xd8\\xbf\\x1eHe\\xc2\\xca\\xca\\xda?\\xbdq\\xe9p\\x96{\\xdf\\xbfD\\x05\\x0eI\\xe6V\\xc9\\xbf\\xcf\\xf5\\\\v\\xce8\\xea\\xbfbV\\xd5;\\xb5k\\xf2\\xbf}\\x90\\x1b|\\xd4g\\xe0?\\xce\\xac\\xc0\\xa9\\xe0\\x9d\\x90?+\\xf3W(\\x01u\\xdb\\xbf\\xac\\xa19\"D\\x7f\\xdd?\\x1d\\xf2\\xfbmJ\\xb8\\xdd?fv\\x8c\\x0bt\\x18\\xf0\\xbf\\xff\\x94hIJ&\\xe8?\\x87\\xf4\\xb3K\\xdbC\\xdc\\xbf\\x1a9G\\xc1p\\xa0\\xc2\\xbf%^ZX\\xaa\\xbd\\xda\\xbf4\\xdf\\x9f\\xac\\x10!\\xe2\\xbf\\xc8:$\\x03\\xb3\\xce\\xc4\\xbf\\xa7,\\x11\\xf4\\xf9\\x14\\xe5\\xbf\\x97\\xb2\\x8ez\\xe4w\\xdc?T0\\xedSI\\xdf\\xd5?\\xc5\\xd8W0^\\xce\\xc4?\\xee`\\x867\\xdb\\xb4\\xe7\\xbf\\xc1F\\xf1\\x00B\\x10\\x03\\xc0\\xf1\\xcd\\xdeM\\xb7P\\xf1\\xbf\\x07\\xb7\\x80KIn\\xf6\\xbf\\xeb2\\xc3O\\x95\\x9b\\xb7\\xbf\\xa7s^\\xa5x\\x05\\xe2?^\\xd3\\x1b\\xbbA?\\xf4\\xbf\\xfc+U\\xb0M\\xa8\\xd5?\\x1d gm$\\xf4\\xda?\\xa7\"c\\xaf\\xbf\\x04\\xe1\\xbf\\xb6U7\\xde3v\\xb9\\xbf\\x81\"\\x95\\xe7G\\x14\\xc4?!^S,\\xb60\\x01\\xc0i\\x08&\\xf3\\x8d\\r\\xd0\\xbf2\\x05^w\\xe7\\xdf\\xb7?w\\x84}n\\xd6\\xcd\\xe1?\\xb3\\x98\\xfbN\\xfb\\xa2\\xee?S\\xab/\\xef\\x7f\\x12\\xf3\\xbfWw\\xf4\\xfez\\xae\\xeb?a\\xa5~\\x19&\\xec\\xf3?\\xb1\\x08\\xfe\\xdd-\\'\\xd3\\xbf\\xbe\\xe5i\\r\\xca\\x90\\xe9?\\xf0\\'T\\xe3\\xd1j\\xe3?uH\\xe3\\xea8\\xcb\\xc0?X\\xaf\\x86\\xa6\\xe3\\xb7\\xf4?\\xb7\\xcc\\xael6\\x7f\\xda\\xbf\\x06\\x87a\\xe2\\x0e\\xf0\\xb4\\xbfnWl6\\x1b\\x9e\\xe9?\\x97\\xfb\\x91X2\\xf6\\xb0\\xbfT[\\xea\\xc0\\xdfr\\xe0?\\xba\\xd5\\x00U\\xc5B\\xe3?n\\xa4V\\xa8\\xa4z\\xd0?\\xf4#/,!\\x92\\xf2\\xbf\\x82\\x83\\xae\\r\\xa6\\xec\\xea\\xbf\\xa7t\\xbbi\\xdb\\xf5\\xb2\\xbf\\xd4Wr\\xc2\\xb0\\x93\\xcc?\\xe2\\x03gt\\x0cr\\xf0\\xbfJ\\x03\\xf6_\\xe4\\r\\xdf?\\x8a\\x83u#\\xfe\\x85\\xe4\\xbf/lf\\xbe\\xf3\\xde\\x94?\\xbd\\x99#\\x10\\x0c\\x90\\xf7?\\xfd\\x832\\xfa([\\xe5?R<a\\x95\\x8f\\x1e\\xf8\\xbf:][X\\xc6\\n\\xc6\\xbf\\x8e\\x036\\x0b~\\x8b\\xf0\\xbf\\xbea\\xde\\xa8\\x9e\\xc0\\xfd\\xbf\\xbd\\xfc\\xc6\\xa4\\x02~\\xfc?\\x07z:!\\x93\\x9e\\xe7?\\xcay\\x1a\\xaf\\xf0\\xfb\\xf8?@\\x07E\\xf3\\xb4\\x1e\\x05@\\xdc`2\\x8c*\\xe6\\xf0?\\xae\\tF\\\\Nl\\xf5?\\xe6\\xb3\\x03\\'\\x00<\\xef?\\xed\\xd3Q\\x0bG\\xb8\\xf4?,\\x04\\xd5\\xc1\\x89\\'\\x08@s\\xd5i\\xe9\\x014\\xeb?f\\x9a\\xf1\\xde~\\x1a\\xf9?t\\xb0#\\xd4\\x8a\\xa2\\xfa?\\xf5\\x0br\\xa0V\\xa7\\xf8?\\x83\\x11\\x84TI\\'\\xf5\\xbf#X\\x87\\xacC\\x14\\xeb\\xbfX\\x17i@\\xef\\xb9\\x00\\xc0\\x0ea\\rx\\x9c\\xb9\\xf2\\xbf\\xce\\xc1\\x80W\\x1b\\xff\\xe0\\xbf9j\\xc1D|\\xa7\\x01@\\xf23\\x8b\\xffN\\x9c\\xc5?/\\xa2\\xfd{\\xbe\\xe4\\xa8\\xbf2\\x93n2\\xba\\xc3\\xe1?|(\\xa66\\x01\\xc0\\xeb\\xbf\\xfec\\xe5h\\x17\\xfd\\xed?\\xceW1k\\xf6\\x9a\\xc4\\xbf\\xaaa4v\\xa4\\x05\\xeb\\xbf\\xc4\\xd3*\\xd2\\x8d\\xbf\\xed?\\xbc\\xfa\\xa3\\xe3\\x99\\x82\\x01\\xc0\\xce48\\x03%\\x93\\xec\\xbf\\x00\\xb6J\\xacF*\\x05\\xc0}\\xed\\x97~\\x96\\xe7\\xe3\\xbf\\xd44!\"\\x1b}\\xfc?\\r\\xa2\\xfde\"\\x8b\\xf8?\\x1b\\xd4y6\\x11\\x98\\xea?\\xdds\\x8eO\\x8bs\\xeb?K\\xe7\\xdb\\xa7\\x8b,\\x04@\\x1aQ\\xb7\\x19 \\x1d\\xfa?\\xd7\\x8a\\x90\\xa2R\\xdf\\x02@\\xca\\xbd\\xef\\x0c\\\\\\x94\\x04@\\xf749v\\x87\\xc2\\x04@:\\x96w}\\xe3\\x82\\x0f@\\x98\\x04,\\xba\\x06]\\xf6?ib\\xde\\xad\\xe9E\\x02@\\xec\\x8b\\xc8\\xfd|b\\xeb?V\\x02\\xf2\\x90S3\\x03\\xc0\\xfd\\xb3\\xe3c\\x90q\\xe2\\xbf\\xa0\\xbei\\'\\xc55\\xba\\xbfN\\xddA\\x06\\xfb\\xa7\\xe8\\xbf\\xe9\\x92DRrs\\xd4\\xbf\\xc8\\xd1\\x94\\xf6\\x05\\xda\\xde\\xbf(lVa\\xb8i\\xeb\\xbfi\\xaf\"un\\x11\\xf3?\\xceF\\xe9\\xf3\\xe8\\x0b\\xe2?\\x986\\n\\xca\\xdf\\x98\\xea?mkVtrg\\x01\\xc0\\x94\\xbaJ\\x01\\x1eQ\\x02\\xc0-\\x02\\xce\\x7f\\x134\\xb9?\\xfco\\xb4\\n)V\\x06\\xc0\\xb6\\xe0\\xd0\\r>\\xd9\\xa6\\xbf-$\\x19\\xfa7W\\xd8?\\xe6\\xc8\\xc6\\x8d\\x19u\\xe4\\xbf*\\xedf\\xd1\\xab\\x82\\xe2\\xbf\\\\7<\\x97\\x84\\x84\\xcf?\\xc8\\xce\\xdc\\xfb\\x1f\\xca\\xee?\\x98\\xcbC\\xb7\\xf2\\xac\\xe6??\\tKt\\xbc\\x8f\\xf9\\xbft\\x98\\x15\\xc2\\x84\\xac\\xfa\\xbf\\x93\\'\\xc6\\xe6\\xc5\\xc3\\xf7\\xbfv\\x9eLu\\xdbq\\xf6?H\\x85\\xf5e\\xf0\\x85\\x8b\\xbf>\\xd9\\xfas\\x15%\\xf2\\xbf\\xe4\\xcf\\x9e\\xad\\xf6\\x96\\xf4?_(\\xfa\\x94o\\xbc\\xe6?\\n\\xb0\\x0cC!\\x8e\\xfd?1\\x04lY])\\x01@4_\\x1bdyP\\xe6?\\xf8\\xf1CG\\xfe\\x91\\xe0\\xbfD\\x8c,\\xdb\\xcf\\x14\\xc2?\\xe9N\\xf1\\x926\\n\\xdb?\\x01\\xed,\\xba\\x1dp\\xe1\\xbf\\x87\\xed\\xd2\\xcb\\xe6\\xc5\\xde?(\\xca\\x9f\\x02\\xb7\\xba\\xcb\\xbf\\x179\\xf7\\x9c\\xca\\xa1\\xe5?\\x1d\\x93P\\xdbV\\x1f\\xf0?\\xe0\\xd2\\xb41;\\xf1\\xfa\\xbf+\\x81M9\\x88\\xa0\\xf5?\\x9b\\x01\\xdb\\x14g\\x85\\xc4\\xbf\\x82\\\\\\xd7\\xad-\\xc6\\xee\\xbf\\x85\\xc9\\xa2i\\x95\\x03\\xe1\\xbf\\x04\\xa0\\xcb\\xc1\\xc7{\\xde\\xbf\\x84()\\xa4\\xd8\\xe9\\xf3\\xbf\\x97NY\\x85\\xa3\\x8e\\xe0?\\x0f\\xf5\\xaa\\x1c\\x1a\\xe8\\x00@4\\xf9+\\xce\\xab\\xdc\\xf6\\xbf\\xf1\\x98D\\xa6\\x07\\xe3\\xe1\\xbfT\\xa3A\\xa7\\x95\\x17\\x01@\\xc8iPOe\\xc2\\xfc?\\xdb(l\\xd7o\\xd3\\xff\\xbf}\\xd1\\x17\\xee \\x00\\x02@\\x95\\xe0\\x93X&\\'\\xcf\\xbfgF\\xd9(\\x9f\\x02\\xe0?p\\x9a\\x9a\\xc2\\x12\\x8c\\xf9?\\x9c\\x7f\\xed\\x93\\x11R\\x00@\\xcby\\xd3\\x94\\xc7\\x91\\xea\\xbf)\\xea\\x93\\xfa\\xc1+\\xf2?\\xe0\\xd5\\xd7\\xd2\\x99\\xe7\\xe2\\xbf\\x0b\\xdf=`T\\xbf\\xca\\xbf\\x84\\xed\\x92\\xef\\x8d\\x0b\\xd9?\\xc7\\xa9XI\\xfeH\\xeb\\xbf\\xebJ#\\xbd\\xa3`\\xf0?\\xc5\\x82\\xb8\\xf7\\x12\\xb4\\x01\\xc0\\x0c\\xaa\\xdb\\xe5\\xe6\\xff\\xf5\\xbfx\\xceQ\\x11]\\xee\\x01\\xc0\\xba*\\n/\\xa7\\x15\\xc7\\xbf\\x89\\x1bC\\x8e\\xe7\\xc9\\xec\\xbf\\x1e\\xcb\\xeb\\xc3\\xcdb\\xe6\\xbf\\xcf\\x9c\\x1f\\x0e\\x04\\xe0\\xf0\\xbfvV\\x05>\\x8c\\x12\\xd8?\\x08b\\xc9S\\xd5\\xd3\\xff?\\x80S\\xe4\\xddP\\xed\\xfc\\xbf\\x99\\xa0W\\xf7O\\xa3\\xce\\xbfj\\xe2\\xde\\xb2\\x1c\\x1f\\xf4?\\x13\\x00p\\xb7\\xe72\\xa9?\\xdf\\xaal\\xcfo1\\x06\\xc0\\x024}<Gw\\xef?\\xb0\\xe2&y\\xcej\\xc6\\xbf\\x00m\\xe73\\x8cL\\xee?\\x0e1\\xac\\n\\xc1\\x06\\x08@*\\x86P\\x15\\xda\\xb6\\x01@)\\xbc\\x08\\xd7>C\\xdd?;Cr\\xff\\xd8\\x11\\xe6?\\x10\\x02k\\x80U/\\xf9?\\x14\\xc8_~1\\xf1\\xa3?0\\xa0\\xb76\\x05\\xa0\\xe5\\xbf@\\xf8F\\xfa\\xe1\\x84\\xb0\\xbf\\xa4\\x04\\xadTx\\x80\\xc2\\xbfP\\x82F\\xc0\\x1eW\\xde\\xbf\\xc8\\xbd2K\\x1e\\xd6\\xd4\\xbf^X\\x81\\x0f\\x99#\\xf8\\xbf\\x07]}\\x11\\xff\\x95\\xd0?;\\xafZ\\x0e\\xc8\\xb6\\xd5?*I\\x9d\\xb0\\x9fU\\xcd?ct}\\x1f\\r1\\xef?\\x08\\xaa\\xc1\\xbdQB\\xfa\\xbf\\xf7\\x10\\xce\\xe4\\xc7-\\xe9\\xbf\\xfb\\xack`w\\xd2\\x0c\\xc0c\\xf4<\\x13\\x8a\\xf8\\xce?]\\x0ei\\xe2Fu\\xca\\xbft\\xadq\\xe0\\xa7\\x04\\xe9\\xbf\\x06|\\xb1\\x0b\\x8a}\\xe4?\\x0e\\xefe86M\\x05\\xc0\\xa9n\\x87\\x1d\\xc0U\\xe2?\\xc0\\xc1\\xc4x\\x95\\xb4\\xbd\\xbfR\\xfc\\xf4\\x0b\\xb4Q\\xd5?\\xfc#\\x86\\x0c\\x8d \\xf1\\xbf\\x1c75\\xe1C\\x8a\\xf0?\\xca\\x9e\\xa2\\xd2\\xd7\\xa4\\x04@\\x9fP\\xd1S\\x12\\xa9\\x10@\\xaaw\\x94\\x97\\x95\\x18\\x00@\\x9a\\xb7Fz\\xbcZ\\xf0?g\\xa9\\x95\\xb0=|\\x93?s\\x13\\x9f\\xf0}1\\xa5?\\xac\\x8c\\x95\\x95\\xd0w\\xff\\xbfJ$Sk;\\x00\\xec\\xbf\\xd4\\xc5\\x0e\\xb6\\xbb\\xe4\\xf1\\xbf\\xa8E\\xf3\\xbe7\\xcc\\x04@\\x92+\\xf2\\xc2s\\t\\xe8\\xbfN\\x12\\xf9\\xcf\\x91\\x0e\\xba\\xbf\\xda\\xe0\\x06\\xcc\\xd5\\x1f\\xc1?\\x88\\x027\\x94\\xa6\\xd5\\xd4\\xbf\\xe6\\x95\\x0cs\\xf5O\\x0b\\xc0M\\xad\\x11<\\x04r\\xd0?\\x8ac\\xb8\\x05\\xa18\\xf2?_>\\xf7w\\x843\\xd0?\\x03\\x08a7\\xd4\\\\\\xfd\\xbf\\x8d\\xd3\\xaf]\\xe5\\x9c\\xb0\\xbfqZ\\xb6AK/\\xa7?)\\x8f\\xf9z\\x8a\\x96\\xc9?\\xeaE\\x8er\\x8d>\\xf9?\\xf8w\\xed\\xde\\r\\xed\\xe9\\xbf8\\xf5\\xbbD\\x0e\\xdd\\xe1\\xbf4\\x82\\x0c:\\x0e]\\xe5?\\xa8\\xc4\\xad\\xa0e\\xbe\\x06@\\xbf>\\xc6(\\x81\\x00\\xed\\xbf\\xc7\\x921\\xc1*\\xb0\\x06@\\xb2\\xb6k\\xc7\\xfe\\xe7\\x15@\\xdf\\xa7\\xb9\\xc7\\x03~\\x0b@\\xceP\\x1f\\';A\\xf7?\\xbe\\x8eAL<\\xfd\\xf3\\xbf\\xf5\\xd7\\x87\\xbf\\x15\\x13\\x9e?+\\xcc\\xb4\\xce\\xfd\\xad\\xb2?b\\xe5\\x1e\\x88o\\xe3\\xef\\xbfim9aR\\xc4\\xf3\\xbf6\\xaakxf\\x80\\x93?\\xb9\\xa8\\xfd\\xa2\\xe6~\\xf5?g\\xae\\x19=yW\\xfe\\xbf\\xbe\"m\\xe3\\x85<\\n\\xc09\\xdf]\\xb7\\x83\\xa1\\xda?\\n\\xb1\\x89\\x90\\x9e\\x97\\r\\xc0\\x96\\xad\\x05\\xc4@7\\xc6\\xbf\\xee\\xa6\\xf6~\\x95/\\x10\\xc0<\\xb2\\xd6\\xfd\\xa2\\x86\\xd3\\xbf\\x940\\xfe\\x93\\xd51\\x03@FS\\xb9;\"\\xa7\\xd3?9\\x1f\\r\\xaa<\\xb9\\x0c\\xc0z\\xc4\\rq\\xc4\\x1f\\x03\\xc0\\xa6\\x8e\\x15_\\xd0\\xeb\\x06\\xc0\\xf3\\x0eX\\xfc\\xdd\\xd4\\x05\\xc0\\n\\xf7J\\xa6L&\\xea\\xbf\\xa6\\x87\\x96\\x18\\xe4p\\t\\xc0\\xd7\\xdbPz\\x1aN\\xfc\\xbf\\xf7.-\\xef\\x95\\xdd\\xec?\\x03\\xfa\\t4xh\\x10@c\\xc7s\\xb4\\xd5\\xe8\\x10@]\\xe7!?\\xb0\\xec\\xee?b\\x8e\\xb2A0\\xf6\\x01@K\\xb7\\xf811\\x07\\xdc\\xbfi\\xfaE\\xf7\\xa8\\x16\\xfc?\\xeav\\x84gWW\\xf7\\xbf\\xc1\\x99x\\x8f\\xbf\\x1f\\xd7\\xbf\\xfa\\x98\\x9e\\xed\\xac\\xaf\\xc0?C\\x90\\xd7\\xb2\\x13\\x96\\x0f\\xc0\\xba\\r\\xbfT\\x07\\xc4\\x98?#\\x80\\x19\\xf8y\\xc8\\x05\\xc0v\\xf0s\\x97c\\xca\\x02\\xc0\\x99\\x89A\\x85\\xfd\\xce\\xc4\\xbf\\xa6\\xbeV{y\\xd5\\xde\\xbfq45\\x8d\\xffu\\x02\\xc0N\\x0f\\xddt\\xeb\\xdc\\xff\\xbf\\x0f\\xad,b\\x96.\\xdb\\xbff\\xcf\\xcf\\xe5\\r5\\x07@\\x06Q=qm\\xcc\\n@\\x84\\xdf\\xbe{\\t1\\xf2\\xbf\\xc4\\x8a:\\xae:\\x1d\\n\\xc0\\xb0T\\x1e~\\x844\\xf7\\xbf\\xc1m\\xc2\\xbe\\xc0Z\\xff\\xbft\\x1b\\xea\\nFT\\xe5\\xbfz\\xed\\'\\xce\\xbdA\\xe8\\xbf\\xd5\\xfc\\xe2\\xd1$\\x98\\xf2\\xbfrI2\\xa3\\xca\\x0c\\x01\\xc0J6~\\x8548\\xfd?\\x8eH|\\xf7\\xcbL\\x10@\\xfc\\x02e4x)\\x01@\\x80\\xeb\\xdf\\x14\\xfa\\x95\\xe9?\\xce9\\xce\\x8f0*\\xe5?\\xaba\\xb6;Y[\\xed\\xbf8\\x89\\xe12\\xc7\\xb0\\xd4\\xbfc\\xfc\\xa8eE\\xc4\\xf1?P\\xba\\x1f>z\\xbd\\xb2\\xbf\\xa7\\xfb\\x05\\x13\\xd3\\xe7\\x11\\xc05a\\x87\\xc4\\xea\\x88\\x0b\\xc0g\\xc3)\\xd6M\\xf2\\xf9\\xbf\\xec\\x18a\\x10^w\\x02\\xc0\\x0b\\xa4\\x12\\xd8\\x92\\xf5\\xea?\\x97\\xe1\\'\\'\\x99\\xa7\\xe4?\\x02c\\xcd~\\x1f\\x11\\x00\\xc0a\\x82\\x85Q^\\x97\\x01@\\x8d\\x97|\\xfdz\\x03\\x07@&\\xeedI\\xcb\\xd5\\xfe?\\x07\\x17\\x1e\\xb7\\xed6\\xdb\\xbfv\\xa4\\xa5y\\xc0\\xe2\\xf6\\xbf\\x0f\\xb2:\\xeb\\x1f\\xd3\\xd7\\xbf\\xa2\\x14M$}\\xb6\\t\\xc0\\xdf;g\\xd8\\xa2~\\xed?#r\\xdcR\\x94\\xfb\\xf6\\xbfc\\x1f\\x82\\x17\\x0e\\xdc\\xf9\\xbf\\x80\\xe7\\x08\\xe26\\x15\\x0b\\xc0M\\x91\\x1e\\xd3\\x99\\x98\\xf2?\\x9fn\\x81\\xd7b\\xb5\\r@X\\x93\\xeb<2\\x85\\x03@\\xc9r\\xea\\x00\\xce\\xb7\\xf2?\\x8c\\xc4It\\xb5\\x8f\\xb2\\xbf\\x0e\\xe6\\xf5\\x81\\xbc\\xed\\xce?\\xac\\xf0r\\x0b\\xa8\\x8e\\xf5?7E\\x19\\xaa\\x115\\xee\\xbf\\x9a~j\\x97\\x95)\\xf1\\xbf\\x8de\\x11\\x9d\\xad\\x8e\\xcf\\xbfU\\x18\\x87\\x9e\\xd5\\x9d\\x05\\xc0\\x96\\xb0\\xde\\x17\\xab\\x8f\\xc4?\\x19i\\x1f.\\x07$\\xf0?\\xa6Kv\\xbdFh\\xe4\\xbf\\xc4V\\x99cCh\\xf6\\xbfiT\\xfaXw\\x8c\\xc5\\xbf\\x8f$\\x84\\x8d\\xcf\\xea\\xea?\\xe7\\x8e\\x13\\xf0\\x936\\xf9\\xbfcn>\\xd9\\xaf\\xfb\\x00@r\\xe8\\xe1\\xd3\\xdbu\\xf1?\\xab\\x82\\xef\\xd2\\xfb;\\xf6\\xbfJ\\xd2\\xc3j\\x7f\\xbb\\xf5\\xbf\\x07\\x04\\xb0C\\xfb\\xb7\\x00\\xc0\\x0c\\x82\\x0e\\xcc\\xd8\\xf9\\xe8\\xbf<\\xfbh\\xb5wJ\\x0f\\xc0h^\\x83\\x93\\xc5\\xe5\\x11\\xc0\\xa1\\x95\\xfe\\rqi\\xfe\\xbf\\x03\\xcb\\xbd\\xb4\\xf0)\\xf4\\xbf\\xc5\\x17q\\x89\\x0cd\\x08\\xc0\\xaa>_=\\x05\\x9f\\xfc?\\x99\\xb9W\\x89\\xc2\\xee\\xf2?Qt\\'C\\xdb\\x0e\\xf5?\\xbe\\xac\\x9f\\xc4\\x1c\\xad\\xe7\\xbfd\\xac\\xa4.\\xc9\\xac\\xe3\\xbf\\x15W>m\\xd0\\x0c\\x99\\xbfv\\xf6./\\x82y\\xd0?(o+L\\x17O\\xd6\\xbf\\xec\\xfd\\xd1P\\xb9A\\xe4?QAY$v\\xf3\\xf2\\xbf\\x90<\\xc4\\nG=\\xe9?\\x04\\xa7eI\\x14\\xd4\\xcf\\xbf\\x033\\xf4\\xfbB\\xad\\xe1?\\x03^$d\\xa1\\x9f\\xc4\\xbf\\xed\\x1c\\xdb&\\xd1q\\xf9?\\xab\\x1b\\xce\\x8a\\xcc\\x05\\xf0?A\\x060\\x87&\\xa7\\x08\\xc0U\\x08\\x14\\x0ci=\\x0c@\\x88\\xde\\x8e:[_\\xfd?\\x1d\\xe4Ju\\xe5?\\xef?\\xa0E(<V\\xb3\\x05\\xc0\\xf8\\xba\\xacI\\x9dC\\x00\\xc0\\x11\\xb5\\x9e\\xc9\\xfe\\n\\x03\\xc0{>|z\\xec4\\xfd\\xbf\\xb9\\xe0\\xe37\\xa2=\\xd2\\xbfh\\x9c\\xc0\\xf3\\xfa\\x9b\\xfb\\xbf\\xeb\\x0c\\xddR\\x8e\\r\\xfc\\xbf\\xb0u\\xf1>\\xb9\\'\\x10\\xc0\\xc9I\\x14\\x935\\xe0\\xe5?\\xe7\\xcb\\xcc\\x86\\x86+\\r@\\xcf]\\xe6\\xa1\\xa2\\xa4\\xef?\\xfc\\x8c\\x82\\xd9\\xc2\\x9c\\xd1?V\\xacJ\\xef\\x13\\x05\\xec?\\xf0\\x08G\\'e]\\xe4\\xbf\\xda\\x165\\xf88]\\xd1?\\x8crAl\\xec\\xba\\xf1\\xbfW\\x1c\\x07G\\x12\\xb4\\xfa?\\x88\\x108^\\xd5\\xcb\\r@Y\\xc6\\x00\\xad\\xc8&\\xf2?\\xc0a\\xd5\\xefs\\xaf\\xc6\\xbf\\xef\\xeb\\x98\\x85\\x19\\x04\\x02\\xc0b\\xd9d\\xb4i\\xaa\\xe7\\xbfI\\xa0\\x96\\xbf\\x8f\\x93\\xb8?\\x0c~$\\xd8\\xc0\\x94\\xf4\\xbf\\xa0]:\\x1b\\xf0\\x1d\\xf0?X\\xf4G\\x8a}\\xfa\\x03@:\\xdd*\\x0b_A\\xea?\\xda\\x1a\\xe1*|\\x85\\x00\\xc0\\x02\\x10j\\x14\\x88\\x10\\x07\\xc0\\xa5\\x84\\xd1\"<\\xbd\\xf3\\xbf\\xf0e\\xf3\\x85\\x10c\\xfd\\xbfM\\xdd+8\\xff\\xad\\xf7\\xbfb\\x00\\x1f\\xbe\\x0c\\xef\\xf9\\xbf\\xd6\\xa2\\x8d\\xb9\\x86\\x83\\xfe\\xbf-\\xe0\\x1cuo\\xee\\xbe\\xbf+[\\xc7jL\\x0b\\xf4?\\x89M#c\\x1b7\\xc6?\\xd4\\\\\\xdd\\x836\\xe5\\x01@\\xab\\xeb\\xfeB\\x16V\\xe9?\\xe8\\xfe\\x95)=C\\xf3?\\x1f\\xfb\\xc3\\xf4t\\xba\\xbd\\xbf\\x84\\x10a\\x13\\xba/\\xb4\\xbf\\xe4r\\xb5l\\x08\\xd8\\xa4?\\x0cT\\xa4\\x07\\xcaJ\\xda\\xbf\\xd8\\xa8|Q\\xbd\\x1d\\x06@/\\xcb4y\\x82Q\\x03@\\xe8\\xb8\\xad6\\xc7\\xa7\\x08@\\xc9\\x01\\\\\\xc6\\x1dn\\x00@\\xd2\\x1f\\xa3\\xc1e\\x81\\xf1\\xbf\\xaa\\x1e\\x1cY\\x9c\\x91\\xeb\\xbf\\xff\\xd2w\\xba\\xbe(\\xd8\\xbfs\\x10.\\xfd;\\x9a\\xf2?\\x90F\\xb8\\x9a\\x89r\\xee\\xbf\\x8265f\\x1aL\\xe9?\\xb0n\\xf3\\x00\\xdb*\\xfa\\xbfL\\xbf\\x877q\\xb2\\xe6?D\\x13rg{\\x91\\x03\\xc0:\\xe0\\xe9\\xd2\\xef\\\\\\xaa\\xbfz<\\xb6\\xa7E\\xf6\\xd6\\xbfw\\xde\\xe2\\xba\\xc6\\x01\\x07\\xc0q.\\xd2\\xda\\x7ff\\x10@\"`\\x9b\\xc5\\x90G\\xb8\\xbf*0rV\\xd8O\\xb9?\\xee\\xbf}v\\x08=\\xef?IH\\xb5TBx\\xf5?\\x1a\\xa3rh\\x1a\\n\\xfb?\\xb8U\\x9c+\\x9c\\x9e\\xdc\\xbf\\xb7\\xc1c\\xe1\\xdb\\r\\xef\\xbf\\xe0/\\x82QgZ\\xb3?\\xa6\\xe2\\x17\\xbc\\x05]\\xdd?\\xa9l\\xdf?\\xb1\\x9e\\xda?\\x8c\\n\\xee!gd\\xe7\\xbfK\\xac9>\\xf5!\\xe9?\\x07Q\\x02s\\xdb\\xfb\\xe4?\\xa2z#\\x19\\n\\xd7\\xeb?\\xa6kC_\\x9b\\x8a\\xe2?0\\xcf\\x94\\xadg\\xf1\\x02@\\xdei1\\xcf@I\\xf7?o\\x8b\\xf2$Z\\x83\\xe6?\\xeeb\\xd0\\xb3\\x91H\\xd8\\xbf\\xd1\\xc0\\x0ck^\\x95\\x01\\xc0\\x96\\xf21)`\\xb9\\xeb?l\\xed\\x89\\xdf\\xee\\x08\\xf0?\\xddZ\\xb5m\\xfcQ\\xf5?4\\x18w\\xa0\\xbe\\xf9\\xf6\\xbf\\x1b\\xa7\\xff\\x1d\\x08\\n\\xec\\xbf\\xaa\\x08\\x85\\'R\\xac\\xc3?\\xcd\\x8es\\x87!T\\xfe?X\\xbb\\x8e[\\x9e\\x89\\xed?\\xdf\\x8b\\xf9T\\xe0G\\x03@}\\xcer}TM\\xeb\\xbf\\xe1\\xf8V\\xb9\\xd8J\\x0f@\\xe1Zv\\x02\\xa1m\\x12@p\\xb4\\x0be\\xf7\\xa7\\x10@\\xc4\\xb7\\xf9!m\\xb9\\xf7?\\xf2\\x93\\x83\\\\\\xe6W\\xff?@s\\xc2\\x92\\xd9b\\xee\\xbf\\x03\\xeb%\\x8b\\xf0\\xed\\xc6\\xbf\\xa1\\xe2\\xc9\\xcf\\xfa`\\xdd?y\\xddyAR\\xc5\\xd2\\xbf)\\x9cScA\\xd6\\xc9?\\xfc\\xc4=4\\xd5\\x8f\\xc7?\\xd9]\\xbd\\xef\\x01)\\xe0\\xbf\\t\\x05`j\\xa11\\x0f@\\x8c\\xb7\\xf2\\xfb\\xea\\xd0\\x04@\\xc5\\xee\\xf2\\x9e\\\\i\\xf0?\\x1c\\xc8\\x01y4\\\\\\x13@\\xca,\\xf74\\xf3C\\xff?-f\\xac\\x07\\xdb\\xce\\xf6??\\xef\\x9b\\xd2\\xaa\\xa1\\xd9\\xbf\\xbc\\x1d\\x9a&v\\xef\\xa0\\xbfC\\xde+k\\xa9s\\xea\\xbf/\\x1b\"c|\\xd7\\xe5?d=zH\\tJ\\xea?\\xd2?\\xb1rKp\\xf0?4@;<\\xc5l\\x03@-\\xd3r\\x1co\\xab\\xed?p\\xcb\\x9e\\xca\\x94\\xb8\\xf9?X\\x112\\x18\\x02H\\xde\\xbf+!\\xa8I\\xba.\\x10@\\xd7\\xa3\\xc3\\xaf\\xd8\\xe5\\x13@\\xdf\\x8c\\xe5\\xb4\\x0fH\\t@}Z\\xb3m\\x14\\x9e\\xeb\\xbfJ\\x1e.\\xde\\xc2@\\x00@\\x05\\xa8\\xd6\\xc8\\x1b\\xa1\\xce?\\x9d\\x12\\xdd\\xa3\\x1b\\xe4\\xe8?\\xeb\\x03\\x91\\xb7\\x1d\\xb5\\xd6?I\\xa2V\\x8b5\\x1d\\xf0?6U\\x96\\xafH;\\xf5?63\\xb9\\xf4\\xc0.\\xe5?\\x92\\xe8\\x9a0\\xda\\xe7\\xf6?\\xf9\\x01T\\x87UV\\x11@\\x8a\\xd9\\xcb!\\xc1W\\x18@\\x94\\x1f\\x1e\\xb40\\x9a\\x14@\\xc8\\x8be>-&\\x12@\\xc6\\x9bx\\x86\\x15i\\x06@\\x06^\\xcer\\xb0\\x94\\x03@\\xa2\\x1er\\x8f\\xd8r\\xff?\\xb5\\x06\\x17\\x81\\xf6\\x17\\xc7\\xbf$\\xcc\\xb2\\x14\\x03\\xb4\\xef?QY\\xfe\\xe3b\\xc9\\x0e@\\xe8|\\x8e\\xcc\\t \\x05@\\x05\\xb4\\xa2\\x9bQZ\\x04@\\xb8\\'\\xa7Vrh\\xfc?n\\x82\\x9c\\xd7\\xe7\\x03\\x08@)\\xdeo\\x07\\x93-\\x10@\\x8aO\\xe5\\x97\\xb56\\t@\\xd3\\xcd\\x12X\\x01m\\x0b@\\xb2\\x16H\\xeb\"\\xb7\\x06@,6\\x91n\\xcc\\xcd\\xd5?\\xe9\\xc1X\\xf9\\xf6\\xa0\\xf1?\\xc3\\x06\\x056\\xc3\\xf0\\x94?\\xb7m\\xef\\x99\\xc5%\\xf3?1)\\xb6\\x17*\\xb1\\xf8\\xbf\\xbf\\x95\\xce\\xd5\\n\\xe5\\xdc\\xbf\\xd2\\xeb\\xfe\\xeb\\xbd\\xbe\\xd8?\\xeeo~\\x0b\\x0cV\\xf5?|\\xf5\\xf1\\x13\\x08?\\xef?d\\x0f\\xc3\\xbaN\\x83\\x01@\\xbe\\xcc\\x8c\\x91\\xab\\x1a\\x12@\\x99\\x9e\\x83\\xda\"\\xb9\\x04@\\x86\\xaa\\xdd\\x96qB\\xff?\\xac\\xf2<E\\x16\\t\\xa2\\xbf\\xe5\\x0c\\xe5TA\\x06\\x02@\\xcb\\xfa\\xf2\\xe4\\x98\\x8b\\t@F2\\x9f\\xb8\\x8b\\x1a\\x02@\\x84P\\xb87\\x19E\\x0e@B\\x914\\xfa\\x07<\\xce?[\\xb1\\xe6\\xc8\\x83\\x17\\xff?\\x08jS\\xe1\\xfbZ\\xb7?\\xa8*\\xd4Ql\\xad\\x08@\\x00e\\xcc\\x97\\x1fS\\t@5\\x04\\x06\\x06\\x9e\\xc1\\x02@\\x8d\\xda\\xdc\\x90\\xd9\\xc6\\xfa?\\xac\\x1a\\x12L*\\r\\x11@\\x1c\\x1aT\\x10^0\\x03@\\xff\\xeb6\\xa0[\\x8c\\x00@k\\x9db\\x8d=&\\xe2?\\x9d\\x9e{\\x80`\\xa7\\xb5?\\x9f-o}\\xff\\xd5\\xb0?\\x9f\\xe3E+\\xae\\xa5\\xf0\\xbf\\xea)\\xe9\"7\\xe5\\xcd\\xbf\\xb0E\\xfc\\xed\\x94\\xa5\\xa8\\xbfL\\x0c\\xcb\\xd8\\x81\\xe0\\x86\\xbf,\\x81\\xad\\xc5\\x8c7\\xf7?\\x8c0\\xe5\\xaa-5\\xfa?\\x1f\\x05N\\xe5\\x80\\x90\\x02@\\x8b\\xa7\\xf12\\x95\\xbf\\xfb?\\xba8\\x0co$\\xae\\x02@\\xfb\\xc68}\\xe7\\xdf\\xf5\\xbf\\x9a\\xdb\\x11\\xea]\\xae\\xc0?\\xe1\\xcf\\xae\\x97\\xa7\\x8f\\x00@F7Z\\tdQ\\xf3?$a\\xe8L\\x8e\\x11\\x07@\\t@\\x8b\\xfb\\x06\\xb2\\x12@\\xcdBTw2\\x9a\\xf3?&\\xf8!\\xe5\\x80Q\\x02@\\xa3\\tl\\xa9\\x9eK\\xd8?\\xdaKm\\xd9\\ri\\x06@\\x1fEj>\\x18`\\xf7?P\\t\\x97%80\\xff?\\x8f_\\x11\\x0cEZ\\xef?\\x91\\x8aR\\x17\\x1e?\\x10@\\xe7)}4\\xe8\\x15\\x06@\\xe1\\xcf\\xdb\\xa2\\xfc\\xc3\\n@\\xd5\\xd7\\x99v\\xdf\\x9c\\xf8\\xbf0\\x7f-T\\xfb\\xf0\\xd1\\xbf\\xcf\\xa7\\x02T#r\\xe6\\xbfi6r=\\x9b\\x1ew\\xbfW`C\\x03l\\xad\\xdf?\\xc4H\\t\\x16b\\x10\\xcf?\\x1aj\\xb1\\x10\\x95[\\xd0\\xbf2\\x94\\x06N\\x98\\xa4\\xea?\\t|Ql\\x14#\\xfd?\\t\\x813 \\x1c\\x80\\xc9?\\x99\\xc0\\xf7,\\xc4K\\x9f\\xbfT#\\xa1\\x1c3\\xbb\\xea\\xbf\\xb6\\x19\\xf6\\x98\\x89\\xd9\\xf7?\\x83\\xf6\\x87L\\xca\\x95\\x02@\\x8c\\xe6\\xe0\\x9c\\xd6\\x81\\xf1\\xbf\\t\\x8a\\n\\x94#\\xe2\\xbb?\\xe1\\xb7\\n\\xf3\\xc5\\xe3\\x00@6\\xe1=<\\xad\\xc1\\xd2?\\x96.\\x1bh\\xd4l\\xea?\\x06\\xb0*\\x19\\xd49\\x01@\\xd4\\x90\\xd0;\\x1ak\\x10@j \\x02\\'[:\\xe0?\\xc8\\x10\\x8aOW\\xc3\\x02@\\x96\\x00\\xdd\\xe6\\x13\\xc4\\xe9?\\xbf\\x95\\xd0\\x0f\\xba\\xf1\\xe6?\\xb7-3\\xa8-\\x89\\xf7?0\\xe5?\\xc0Y\\xfb\\xfc?\\x1a\\xe5:\\x177E\\x07@\\xb5Xn%\\x7f\\xbd\\xe6?\\xb3:\\x99\\x1a\\x83*\\xf3?NvfY\\x01h\\xe4?\\xd6@;\\xe0\\xc1\\xff\\xe7?BOi )A\\xdc?!5\\x1aT\\xf1\\xec\\xd1\\xbf7g\\xf4@1x\\xf3?\\xee\\xf8\\xab\\x1a&\\xee\\xee?\\xd9&\\xa0\\x9e\\xef9\\xe2\\xbfB\\xf3\\x0bC\\xbbi\\x00\\xc0\\x02V#\\x1d\\x1az\\xf7\\xbf\\xd9a\\x84\\xdc\\x8a\\'\\xbe?\\xf4\\x8dMWH\\xb0\\xe5?s\\xee\\x00\\x80Q\\x89\\x04@\\x15o\\x1f\\x03\\x1d>\\xd8\\xbfq\\xbb\\x85\\xd5\\xd1\\xf2\\xff?<\\x13T\\xd19\\xb6\\x04@N\\x17\\x1c\\xde\\x08m\\xfb?p\\xd9h7\\x1d\\r\\x14@\\xa8v\\xd0Z\\xe7c\\xe8?A\\xf5\\'\\xc2\\xceP\\t@2\\xf9\\x9aZ>\\x92\\xec?\"\\xca\\xc4\\xac>\"\\x06@\\xe8\\x1d\\xa0\\xbe8\\xab\\xff?\\xf0\\x1aS\\x99\\x0bk\\xf1?u)\\xaa\\x01\\xbao\\xf6\\xbf\\xb0_\\xc8\\x1cF\\x9b\\x03@x\\x01Q\\x02\\x12\\xdb\\xcf\\xbf\\xf1\\xe9C\\\\\\xf7Y\\xd5?\\x12\\xa6\\x84\\xea\\xe9W\\xc3\\xbf\\xf90\\xa95\\x05.\\xdb?\\x85}\\xcc5\\xfb\\xaa\\xce?\\x0f \\x83\\xc2AP\\xeb?b\\x05\\xef\\xcc\\xeeP\\xb2?B\\xdb\\xf9\\xe1\\xf5\\x9d\\xcb\\xbf\\x8b\\xa2/`\\x0c\\xe2\\xc6\\xbf`\\xdd\\xa1\\xb4\\xc5\\x92\\xf9\\xbf=2\\x1fL\\xfe\\xd2\\t\\xc0[\\xf1nPhY\\xff\\xbf\\x17\\xbb|B\\x94\\xbb\\x00\\xc0\\x99\\x1f\\x1bk\\xc7\\xce\\xf9\\xbf\\x94\\x02\\x83\\x96\\xe6\\x1f\\xd3?\\xaf\\x1a\\xa3B1\\x95\\xfe?_\\xd5\\x89r3e\\xe3?\\x85\\xdaW\\x83\\x9dZ\\xea\\xbf]\\xacJ\\x1a\\xb8\\x07\\xd5?\\x00\\x01\\x1e\\xd8YT\\xe0\\xbfR\\x80\\xa1\\x90\\x9bj\\xf1?\\xe3\\xcd\\x99n\\xeb\\t\\xf9?`\\xb7E\\xe7U\\xc1\\xe6\\xbf\\x02\\x88\\x0c\\xbc\\xdc-\\xe0\\xbfk\\xb4F\\x17\\xf7\\xf8\\xe4\\xbf\\xb6\\xdf\\xdfu\\xfbf\\xe1\\xbf\\xbf\\xc5\\xd3\\x97!{\\xf8\\xbf\\xd7\\x90P\\x8e\\xf4m\\xc5\\xbf\\x93\\x1a\\\\\\xd8\\xb7\\x90\\xe2?)k\\xbe\\xefFW\\xa3?\\xaa\\xcep\\xb6\\xcc\\xee\\xf3?\\x81\\x11\\xb1\\xd9mk\\xe2\\xbf+\\xd0P]\\x00p\\xd0\\xbf\\xbb\\xd2\\xaf\\xf8P\\xbd\\xf4\\xbf\\xf22n\\x01\\x01\\xbc\\xc2\\xbf@\\xdf\\xb1\\xce\\xe1i\\xd3\\xbf++\\x00\\xd7\\xbfo\\xda?\\xf9L\\x03\\xca\\\\*\\xd6?\\xe5\\xbdS\\xd5\\xbe8\\xc0\\xbf\\x95\\x99Ui\\xdaZ\\x00\\xc0q\\x8a\\xd2\\x96\\xe6\\xd5\\xf9\\xbfm\\xb9\\x01[\\x95\\x10\\x00\\xc0\\xbc\\x10\\x05x\\x9f-\\x13\\xc0\\xbbd\\xbc\\xb9\\x8e\\xfe\\x05\\xc0Y\\xc9\\xd91\\xdc:\\xea\\xbf\\xce\\xf7(\\xf8\\x94\\xdb\\xeb\\xbf\\xea\\xb8\\xc9\\xce\\xab\\x87\\xb3?e\\xc1\\xae\\xe5\\x86>\\x04\\xc0Ks\\xd0\\xfcp\\x87\\xc2?;9\\x1b\\x0f4\\xb8\\xd8\\xbf3\\x86\\xf6\\xa5\\x80\\xae\\xfd\\xbf\\x9a\\xb8\\xb3\\x1c\\x87\\x9a\\xe9\\xbf9E\\xa7\\xfaq\\xd4\\xf2\\xbf\\xda\\xdc\\x874\\x94\\x91\\xe6?\\xd1g\\xb8\\xa4x\\xad\\xe4\\xbf^\\xbf_\\xcd\\xbf\\xb0\\xc6?<\\x85&6R\\xa5\\xe5\\xbf\\xaa\"\\xcbG-\\x1a\\xf5\\xbf\\x88\\xd2\\x11T\\xb5\\xe5\\xe2\\xbf\\xec\\x127\\x1f\\xc5\\xc0\\xd9?\\xdaB\\xc5\\x07\\n\\xe3\\xe5?3\\x0e\\xc7_\\x92\\xeb\\xf0?\\x19\\xb3\\x1f\\xeeRY\\xc3?\\xfa\\x01\\x9d\\xa3\\x9bf\\xf2?W\\xb6\\x10\\xfee\\xab2?5A)\\x05\\x15\\x83\\xe6\\xbf\\x05\\xb7\\x0cO\\x81\\xdf\\xd6\\xbf\\x0bim\\xfb\\xbcX\\xf8?7\\x8c\\xfd\\xea\\xadQ\\xd1\\xbf@\\xb7K\\x18\\x10$\\xea\\xbf\\xb3\\x8b\\x86\\xed\\n\\x98\\xa4\\xbf\\xe7\\x10\\xa9-@\\x06\\xe5?E7\\xb0\\x83\\xfe\\xe5\\xe6\\xbf\\xa9\\xd3\\xbf\\xd0a\\x04\\xed\\xbf\\x069\\xc1\\xb46\\x1a\\xe4\\xbf\\xc9-\\xf2\\xc3\\xac\\xe9\\xe3\\xbf\\xd5\\x7fA\\x8d\\x97\\xca\\xec\\xbfs\\xf8\\x8c\\xbe\\'\\xf4\\xc8?\\xbd\\xef\\x8aM\\xa23\\xf3?\\xe0U\\xc4\\xc3!\\xfb\\xc5\\xbf\\x8d\\x8f\\xaaO\\x0fp\\xe9\\xbf\\x8e#\\x19\\xb5\\x0bO\\xe6\\xbf\\x88,dLk\\xf2\\xf2?\\\\s\\xf7=\\x05\\x8e\\xd6\\xbf*\\x04\\x8b,N\\xfa\\xe6\\xbf,\\xf8\\xb8\\xe9I\\xda\\xd4?l\\xd19\\x1dqJ\\xf7\\xbf\\xdd\\xc1u\\x17 \\xcf\\xe0?\\x00\\xc4\\x8a\\xbc \\x12\\xc7?@\\x02\\xe3\\xec4\\x1b\\xe7?\\xa3,yQ\\x02\\x07\\xc3\\xbf\\xbf\\xc0\\xa5\\xb7\\xc6K\\xe6?\\x8d\\xf4\\x02 vC\\xe5?m\\xe9Lf\\xc7\\x90\\xf2\\xbf3\\xfb\\xec\\x1am\\x1es\\xbfP\\xe7fr@\\xc5\\xeb?8\\x8eu\\xea\\xd9\\xeb\\xea\\xbfI\\xbd\\x9d\\xde\\xb30\\xda?\\x19\\x89\\x82\\xef\\xc5\\xd7\\xf4\\xbf\\xef\\xaa\\x9d#\\x88$\\xf6?\\x05W\\xe8V\\xe6\\xa3\\xcf\\xbf\\xa4\\xa9\\xe8.\\xfeE\\xc6\\xbf\\xec\\xd9m\\x97\\xdcI\\xe1\\xbf]F\\xb2\\x16B\\xe7\\xe2?,WR\\t\\xe5\\xaf\\xe2?\\tK\\xe9\\x87$(\\xea??\\x0bM\\xd9R\\xba\\xb6\\xbf\\x88F\\xe3\\xb2\\xc3v\\xef\\xbf7^\\x89\\xd8j#\\xc4\\xbfY8c6\\xc6\\xdb\\xe8\\xbf\\xca\\to\\xbf\\xec\\xf0\\xd9?w\\xe0\\x13\\xad\\xb9\\xeb\\xe9?\\xaa\\xe8\\xb7\\x92A\\xe9\\xf7?\\xcc/\\xcb\\xae\\xb1T\\xd3?\\xf97e\\xa4a\\xab\\xf5?\\xd6\\x06:nh\\xb0\\xde?R\\xd6{\\x89\\x90\\r\\xf0\\xbf\\xa7\\xd1\\x0cD\\xff\\\\\\xef?$\\r\\xc6\\x91\\x16\\xf1\\xfc?\\x9c\\xca\\xe3\\xda/\\xbb\\x03\\xc0j-S\\xa7\\x98?\\xfe\\xbf\\xd0\\xe5\\x9b\\x92\\x11\\x82\\xd2?K\\x88&\\xbf\\xc8\\xee\\xf6\\xbfhB\\xa6\\x02\\xe3\\xb3\\xe0\\xbfC\\xee(b\\xda\\xe6\\xeb?\\xfb!\\xef\\x1d\\x12\\x86\\xe9\\xbf&o8x7\\xd1\\xf0\\xbfp\\x16\\xcc\\xd4W\\xeb\\xfb?Ua\\xa1i\\t\\x1e\\xb7\\xbf\\xdb\\x10\\xc6\\xc1vQ\\xd4?N\\xdc\\xd7\\x0f\\xf7\\xda\\xb2?\\xf1k\\x0cF\\xf5T\\xca\\xbf\\x8f(q\\xdbU\\\\\\xdc?\\x8b\\xde\\x162\\x92\\xbd\\xc0\\xbf8\\xb80\"\\x88\\x86\\xdd\\xbf\\xdaa\\x8b\\xb21\\xa4\\xb3\\xbfD\\xb2\\'\\x859\\xca\\xd3?nw-\\x98\\x03\\xc5\\xd7\\xbfaj\\xb3\\xacn \\xe1\\xbfr]\\xff>V\\x90\\xda\\xbf\\xfa\\xec\\x1at\\xd0x\\xd3?.\\x0b\\xe5\\x1a-]\\xd0?5,\\xbc\\x87R?\\xf5\\xbf{P\\x1a\\xdc\\xbe\\xbc\\xf0?\\xe9\\x86\\xceHq\\xe4\\xd6?\\xbd\\xb0\\\\^w\\xd6\\xf2?\\xa5\\xe0\\xf0\\xaf\\xf8\\x99\\xc4?\\x02\\'/\\x11qy\\xf3\\xbf[\\xda\\x8e\\xfd\\xa2\\xee\\xe7\\xbf*Wa\\x96\\xb8\\xb8\\xd0\\xbf\\xef\\xb6\\xed\\x8d\\x03\\xa0\\xe0?\\xd9\\x045\\x1cR\\xac\\xd5?\\xd0!\\x9b\\x9c\\xb5!\\xea\\xbf#SgZ\\x9a\\xa0\\xe2\\xbf\\x19\\xc7\\xf9\\xf26\\xe7\\xc4\\xbf\\xe2\\xd7`\\xbd\\xc0\\x97\\xe2\\xbf\\x95\\xa4j\\xb5f\\xac\\xc9\\xbf\\xc9\\xc2\\xdb\\xf6Ka\\xf5?^\\xdbE\\xa4\\xdfb\\xf4\\xbf\\xc7\\x95\\xd6\\x01X\\xcf\\xb9\\xbfsk\\n\\x9e\\x9a\\xf2\\n@\\x8c\\xd4\\xb6\\x919\\xb6\\xf2\\xbf\\x1c\\xce\\xa6\\x8b\\x88\\xb2\\xc0\\xbf\\x86\\xb8i=J\\x85\\xc9?\\x9e\\xfc\\x94\\xfa\\x8c\\xbe\\xc9\\xbf,i\\x03C\\x99\\x87\\xef\\xbf\\xe3\\x04\\xa5\\xdb\\xcd\\xb0\\x95\\xbf\\xa76\\x00t\\xcbL\\xf2\\xbf\\x1d\\xac\\x86\\xc7\\x8e\\x9a\\xdf\\xbfo_U\\xd4)h\\xda\\xbf<>\\xd0\\xe5z:\\xf5\\xbf\\x88\\xccQ8\\x943\\xd8\\xbf\\xeb\\x0fJi\\xbe\\xaa\\xd6?q7\\x06\\xda\\xb5r\\xe1?&\\x07\\xcb\\r\\xeb\\x8b\\xd3?\\xa4h\\r\\xc4I\\x89\\xb5?\\x1dI\\x00\\x01|H\\xb5?i\\xba\\xf1\\x04\\x1b\\x07\\xba\\xbf\\x1f\\xc0L?\\x11U\\xdc\\xbf\\xe7\\xf6I\\x17u\\xa6\\xde?`\\x19\\x19\\x8f\\xad\\x86\\xe9?\\xe2\\x8e\\x0c\\xb3ag\\xe7\\xbf\\x8d4\\xdc\\xe1%\\xe1\\xd6\\xbf\\xa8f<z#\\'\\xd0?N\\xc2\\xea\\xae\\x9c\\x8b\\n\\xc0\\x05C\\x1c\\xb0\\x82\\x97\\xff\\xbf\\xe7\\xadF\\xe4\\x8c4\\x06\\xc0\\x9b\\x1d\\xc2\\x1f\\xea\\xb5\\x0f\\xc0J\\xf6\\xcd2\\xf4U\\xf2\\xbf\\xb5\\x7f\\\\\\xef\\xb1\\xf7\\x00\\xc0\\xdd\\x08\\x02]\\xac3\\xdc?\\x94\\xa29\\xd5\\xb4\\xff\\xf2\\xbfh\\xd5\\xbf\\x14vZ\\xfc\\xbf\\xad\\xcf\\xe2;&\\x9d\\xe8\\xbf\\xe6\\xd13{q\\x86\\xf2\\xbf\\xbcw5d)\\xfd\\t\\xc0\\x01p\\xa2_\\xd4y\\xe3\\xbf\\x8ec$\\x1cBK\\xe0\\xbf\\x83K!\\xb0\\\\{\\xa5?7\\xed\\xde\\x8e\\xcf\\x00\\xe1?\\x19\\xf06 j\\x8c\\xd7?\\xc6\\xf9[j\\x05H\\xd0?W\\xa4\\x0f\\xe1\\xe4{\\xd4?\\xcb\\xbff\\n4\\xa7\\xc7?\\x99~\\x9d\\xa4.\\\\\\xd7\\xbf\\x90\\xb5\\x9b\\xef\\x94\\x95\\xd6\\xbf\\xd3\\x12\\x9d\\xf1\\x9f\\x85\\xba?\\x0b7~\\xf4\\xae\\x1e\\xf9\\xbf\\x9e\\x01;\\xcb\\xc4\\x8a\\xf2\\xbfc\\x99G\\x0f\\xf9\\xfc\\x08\\xc0\\xd7\\xea\\xe6\\x0f\\x1d]\\xf0\\xbf\\x14\\xec\\xb1\\xe0\\xa0\\xc7\\xe4\\xbf\\xb4K\\x1d\\xe4\\xd8&\\xd1?.\\x8a\\x94\\xef\\x86e\\xeb\\xbf\\xd7\\xdf~\\xc1M\\xe2\\xf8\\xbf\\xaf\\xba1n5\\xaa\\xd1\\xbf?\\xbb\\x1e9\\x9e\\xe3\\xf2\\xbf\\xb3\\x97]\\xaa\\xe0\\xbf\\xeb\\xbf\\xdc\\x87\\xf6);\\xe2\\xf4\\xbf\\xabur\\x10\\xd3P\\xcf?\\xe6\\xae\\x00\\x89W&~\\xbf\\x9e\\xafJ\\xa4\\x16\\x9f\\xee?h\\x15\\xf4\\x10\\rs\\xb9?{e\\xac:z*N\\xbf\\xbe\\x1d\\xe3M\\xb4\\x03\\xb9?\\xa1\\x05\\xa7\\x1d\\xb6\\xf7\\xce\\xbf\\x97\\n^\\x9aw\\x10\\xd6\\xbf\\x0cK\\xb4\\x1d\\x00\\x9b\\xfe?s.\\'\\x1b\\xfe\\xdd\\xd1?z\\xaf\\xf7\\x92\\xbd\\xf2\\xe3\\xbf\\xc3:Rqh\\'\\xe7?\\xe1\\rv3h\\x04\\xa1?5\\x14\\x01Q(\\xd3\\xd4?\\xc9\\xb0\\xebn\\x13>\\xea\\xbfH\\xe3x\\x8b\\xb0>\\xb4?\\xa0eT\\xc14\\x16\\xe9\\xbf\\xdc\\xb0\\x91\\xa0\\x04\\x18\\x00\\xc0\\xd5\\x19\\xd7v\\x96\\x1c\\x05\\xc0$\\x17\\xed*\\xef\\xf6\\x04\\xc0|\\xe8\\xea\\x04%\\x05\\x15\\xc0\\xb2&\\x1e\\x16\\x14\\xa3\\x00\\xc0\\x8b\\xf7\\x8d\\x896\\xdf\\xf9\\xbf\\xdd\\x9a\\x0c\\xed\"\\xe5\\x01\\xc0x\\xf2\\xb5\\x15\\xc2\\xfd\\xdf\\xbf\\xca7!\\x8cWY\\xc6\\xbf\\x18\\xa6\\x9es\\x96\\xca\\xe8\\xbf\\xaf7\\x11\\x14\\x9c)\\x08\\xc0KZ\\xd5\\x90\\x98\\xe6\\xb2\\xbf\\x91\\xd2C\\x18\\xdde\\x06\\xc0U\\xfe[>[ \\xee\\xbf\\x8e\\x19\\x03\\x9aj\\xa2\\xd4\\xbf\\x84\\xd1\\x984\\x1b\\x15\\xf4?\\x9c\\x16\\x05G\\x8dx\\xeb?\\xef\\x15MA\\xac\\xa6\\xec?\\xd5\\x8e\\x12wG\\x9a\\xf3\\xbfZ\\xe0r}q[\\xbb?A\\x13\\xb1\\x85\\xd9C\\xe5\\xbfL\\xaf\\x00_\\x8b\\xfe\\xe3?\\xdeG~\\xa1B\\xbbp\\xbfuCo3\\xbf\\xe6\\xd4?\\xab@\\xb7\\x9e\\xf7:\\xd0\\xbf\\x1d\\xdf\\xe7\\nfs\\x00@\\xb2+\\xa7\\xb9\\n\\xd3\\xdc?\\xa3\\n\\x9b\\x04\\x9cv\\xf2?o7.\\xb9-\\x0c\\xfc\\xbf\\x9bk\\x88\\xd7o/\\xf2\\xbf\\x1aD\\xa818\\xbf\\x07\\xc0\\xb6Q{\\xee;4\\xf6\\xbf\\x1a\\xe3z\\xe0[\\x13\\xdc\\xbf\\x8a\\xcdDU\\xd5\\x14\\xf8?\\x10\\x89Aj\\xc2\\xdc\\xee\\xbfE\\x05\\xb1\\x8b\\xb6\\xe0\\xec\\xbflR\\xcb\\x03\\x0bQ\\xf6\\xbf\\x89\\xd9\\xd2U\\x92\\x16\\xed\\xbf\\x91\\xdd\\xc1\\xe9,%\\xf7\\xbf>\\xc5\\xe5\\x03j{\\xa0\\xbf\\xf3\\x98\\xb5\\xf7\\x98e\\xf3\\xbfzY\\xd0\\x1b\\x0f\\x01\\xf2\\xbfdfH6\\xbfT\\xfc\\xbfd\\x98@9ii\\xd0?\\xc2\\xa77\\xce\\x13\\x0b\\xd8\\xbf\\xe8\\x11t\\xf9h&\\xf0?\\x97\\x82\\xf3}\\xf07\\xfc?{\\xd4\\xe5\\xd7\\xb9\\xe6\\x00@3\\x17f\\xc0Q\\xce\\xe7\\xbf\\xd1Zf\\xf7\\xa5%\\xec\\xbf\\x15\\xe8\\xe5\\x9d\\xdf\\xf7\\xcc\\xbf\\xc7v\\x05\\xce\\x8fc\\xf5\\xbf\\xa4=\\x05LRs\\xd0\\xbf\\xc0+\\xd4n\\xf4\\xa1\\xf0?Y\\xd8\\xaf\\xf5\\xaa\\x17\\xc1\\xbf\\xaf\\x19dY\\t\\xbc\\xc3?\\xd7\\xb7\\x0e\\x98\\xce\\xcb\\xea?\\xed\\x9d\\xec9\\x0f\\xa5\\xfd\\xbf\\xb9\\xd8<\\xbb\\x0e;\\x04@(\\xd1\\xd9\\xb5\\x87G\\xfd\\xbf\\xec\\xf8<\\x9d\\xc7\\xb3\\xe5?4\\xaf\\x16F\\xfe!\\xbd?lX^-\\xa7\\xc9\\x00\\xc0\\xd3Yfn/\\xed\\xe0?;t\\xb6}\\xac\\xd3\\x01\\xc0\\x1a`\\xbd\\xb8\\xb1\\xa0\\xcc?\\xcds\\xb2\\xde\\xca\\xfe\\xd0?hA`\\xdbD\\xea\\xdf\\xbfE\\xa6w\\x91\\x03+u?\\xe7\\xcf\\x8c\\xd3\\x84\\xa5\\x03@\\x94\\x1d3\\x82\\x9f\\xeb\\xe0\\xbf\\xad\\xe8{\\xd7B\\x16\\xf8?+\\'\\x0eN\\xf9.\\r@!f\\xbfa\\xc0\\xea\\xf4?\\x07\\x87NO\\x15\\xc5\\xb3\\xbf\\xcc\\xb4A\\xee\\x08\\x14\\xf3?e\\xa2\\x8e\\x08R\\xb0\\xb8\\xbfY\\xd4H\\x10\\x9f\\t\\xd6?\\xd9\\xf4\\xef\\xa9\\x15\\x06\\xc0\\xbf\\xda\\x83|y\\xa8\\x1d\\xe6\\xbfW\\xdfG$W5\\xd3?\\x9f\\xc6\\x1f\"\\xd0O\\xed?/\\xf9_\\xb6\\xc3\\xef\\xe7?\\xbd\\x0c\\xc9\\x02k\\xcb\\xf3?n\\x8c\\xd2+\\xbdL\\xf2?!\\x17x>\\xa1\\xeb\\xfd?\\xfe:\\xfe\\xa8\\xfb\\xa8\\xe8?h\\x90\\xc3Ad\\xc2\\xe5\\xbf\\x85\\x9fr\\x1d\\xb7#4\\xbf\\x90\\x881\\n\\x13\\x0c\\x06@\\xd7\\x06^\\xbe(\\xdc\\xf0?\\xdf\\x06\\xaf0Ta\\xf6?\\xf7>\\x9d\\xedCR\\xeb?\\x99d\\xf2\\x1a\\x9d\\'\\xce?\\x1d\\xa9oq\\xa3\\xd6\\xf6?\\xcb?=\\x93B=\\x06@Pc~\\xcd\\x03:\\xf9?\\x8c\\x06&I\\x83i\\xf6?\\x18\\x83F&S\\x81\\xef\\xbf\\xaa\\xd8\\xa8;`\\x99\\x01@\\xc2\\xee\\x82[\\x1a,\\xca?\\x1c\\x04\\xc4\\xb0\\x92\\x11\\xff?\\t\\x93]B\\x15\\xdb\\xf6?\\xf0\\x1dT\\xff\\n\\x9e\\xef?h@\\x14\\xae\\x1b\\x91\\xec\\xbfL\\xd2k\\x1e\\x88_\\xdd\\xbf[[Z\\x11\\xd2\\x15\\xea\\xbfc\\xde\\x91\\xfcF\\xd2\\xe8?U\\xeb\\xd9\\x13NY\\xf5?\\xd4wD\\xff+;\\xa6?\\xbc\\xfc\\x85EY\\xfa\\xfe?\\xeb\\xec\\xa9\\xd5\\xe7\\x0c\\xf5?x\\xe9&%\\x9e\\xa6\\x03@m\\xcd4\\x8acS\\xe8?#\\xbb\\xad\\x04\\x9a\\x96\\xf0?\\x86o\\xa7\\x16Fm\\xe7\\xbf\\xa1U\\xd0*r\\xc8\\x0b\\xc0\\x870.\\x8e\\x87L\\xeb?\\xd1\\xa4\\xb2Sd\\xea\\xd0\\xbfB\\xff\\xf1\\xa0\\x9c*\\xef?\\x9b\\xbc6\\xbag\\x04\\xf5?\\x7f\\xc1[S\\x1b\\n\\xf3?\\xe3\\x8c*\\xd2\\'~\\xfa?V\\xb0r\\xac\\x17\\x0b\\xf2?\\xab\\x18\\xf5\\xccG\\x87\\xe5?.pe\\x9b\\x04l\\xe0\\xbf\\x80\\x04\\xc7\\x85N\\x18\\xd9\\xbfm!\\xd3\\xac\\xa6\\xb0\\xc9\\xbf\\x90\\x85\\xa7<)\\x8a\\xe6\\xbf\\xbf`\\xc0\\xf83\\xdf\\xfb?\\xd5\\xd5\\xf2\\xad\\xb6\\x85\\xf1?\\x87\\xa5-r\\xb2\\xdb\\xb7?DJR_\\xe6\\xe6\\xd5?\\xf6\\xb8\\xa8]\\xce%\\xf5\\xbf\\x0c\\xc5\\xb2\\x99\\x1d\\x17\\xf0?\\x15\\r\\xaf\\n\\x8a\\x02\\xf4?\\xa9\\xa1\\x85a4\\xe5\\xe3\\xbf(\\x13\\x8b\\x9d\\xee\\xcb\\xe9?`\\xff]\\t\\x83\\x1e\\xf7?\\xfc1\\n\\x80\\xb9\\xe1\\xe7?.\\xb0o\\xf1\\xd2\\xae\\xff\\xbf!\\xd4\\xac\\x8a\\xc5\\xcb\\xfa\\xbf\\xaej$\\x13\\x10E\\xf2?Y\\xcf\\xba&a\\x95\\x02@!\\x11\\xe0\\x17\\x88\\xdb\\xb3\\xbf\\xdc\\x0b\\x13\\xb8B\\xf1\\xd3\\xbf\\x06\\x9d\\xea\\x81\\xc5\\x91\\t@\\xaba\\xa0m\\xb5D\\t@\\xb4\\x8bQ\\x8b5\\xf7\\x14@\\x9b\\n\\xc5C\\xdd\\x9e\\n@a\\xca\\x18\\x85%W\\x01@_\\xc1v\\xfa\\xde\\xbf\\xf2?\\xfb\\xf6\\x84\\xf4\\xad\\xd2\\xf9?\\x07\\xeda#=\\xfd\\xe5?u\\xeat\\x08h\\x1f\\xff?>\\xe3\\xed\\xdcM\\x92\\x97\\xbf\\xf0\\x7f\\x92\\x8d\\xc8 \\xd4\\xbf\\xab\\xb2\\n\\xda\\x19\\xed\\xe6?/\\xb0\\xc1{\\x1cE\\x04@\\n\\xa7\\xecG\\xbb\\x13\\xe3?y\\x8bJCEO\\xd7?\\xf8F\\r\\x1d\\xf2\\x06\\xc7\\xbf\\xcb\\x8d\\x92\\x0c\\xcb\\xd5\\xd0?3r\\xfeca=\\x02@\\x01wUn)l\\xf5?\\xc4.(\\x89J\\x15\\xd7?0\\x03\\xed\\x06\\x8f~\\xe3\\xbf\\x01\\x94\\xd9\\xb0w\\xa6\\xc4\\xbf\\x83\\xfd\\xcce\\x17\\xbe\\xe9?xvCy\\xbcu\\x00\\xc0q\\x03y\\x01<\\xbd\\xd6?\\x0e\\xbeZ\\xf38\\xd4\\xe0\\xbfR\\xd8\\xd2\\xbf\\xd0#\\xf7\\xbf\\x17}\\x8d\\xbc\\xff\\xaa\\xa3\\xbf\\x12\\x16\\xfe\\xa2\\xe0\\x82\\xde?K\\x15@z\\xc63\\xfd?\\x17\\x10\\xc1<\\x07\\t\\x00@\\x14\\xfb$\\xe3\\xf9\\x1c\\xf5?\\xf2\\xd5\\xa9&\\xadG\\xf6\\xbf\\xf1\\xa1\\x864\\xd4\\xc4\\x01@\\x80x\\xffc\\xf4\\xe7\\xf5?\\xf9Q\\xff\\x89\\xf2\\x94\\x01@\\xa3S\\xd1s\\xd9\\x17\\xfb?n%{\\x1cK\\xa6\\xbc\\xbf0:\\xe6\\x1f\\x05\\xe3\\xf2?R\\xb3.=\\r\\x85\\xd4?8m@\\n\\xba+\\xf6?\\xd9\\xc9HXV\\xd2\\xe5?\\xe2\\x87D\\xad?~\\xec\\xbf\\xe5\\x96\\x19|\\xce\\x9b\\xd0\\xbf\\x01\\x97m\\xfbd\\xb9\\xce\\xbf,`\\xaf\\rG\\xcc\\t@\\xf9\\xe0\\xbcF\\x06\\x9f\\x02@_\\xbb/x\\xc0\\x9e\\x06@\\x05\\r6\\xc1\\x81}\\xcc?\\xcd\\xba\\x93\\x93\\x8fO\\xe3\\xbf5\\x9b\\xc8\\xbdN\\xc8\\x11@\\xd8\\x90{3\\x9f\\x90\\xf2?\\x0e\\xe5\\x99q$\\xc9\\x00\\xc0\\xd7(\\xc7\\xd9\\xf3\\xaf\\xfc\\xbf\\xf2q+f.\\xe1\\x03\\xc0\\x9b<\\xa6\\xc55{\\xec\\xbfrlTN\\xac\\x1d\\x06\\xc0\\x1a\\xa4\\xfb\\x8d\\x1a\\x19\\xea\\xbf\\xde\\x1a\\xdf\\x8b\\xfd\\xbe\\xe2\\xbf\\xbb\\x87\\xc5\\xb3D\\\\\\xd6\\xbf\\x9e\\xb3\\xed-\\xbe\\xf9\\xf2\\xbf\\x90\\t\\x8e/b\\xcc\\xf5\\xbf\\xe0BpS\\x819\\x0f\\xc0N\\xd4\\x19\\x85\\xf0\\xaf\\x02\\xc0\\xcb\\xfc9S6:\\x02\\xc0\\xde\\xf3\\xe5?\\x94\\x90\\x01\\xc0o\\xc2gz:\\x11\\x10\\xc0\\xb0\\x804\\x1f\\xca\\x01\\x0e\\xc0\\xaa\\xdcI\\xc4\\xe0y\\xff\\xbf\\x03\\xc77\\xf9:\\x8e\\xf2\\xbf\\xa9\\x92\\xd5\\x852I\\xbe?\\xb4r\\x1c\\xa9 \\x8a\\xd6?\\x13\\x9bJ\\xbc\\xa1\\x1a\\xbf\\xbf\\xcaD\\x0f2\\xc1\\xad\\x8b?\\nr)\\xb4^S\\xb0?}\\xa0\\x8b\\xc1\\x06\\x98\\n@\\x88\\xdc^wA\\xcb\\xf5?\\x9d\\xf3I\\xdf\\x81D\\x91?sb\\xa2k\\xf4\\x8d\\x00\\xc0~\\x84\\xbc\\x84\\xf0s\\xf0?\\xd9\\xdeZ\\xdf\\xb8\\x16\\xdd?q\\xcda\\xb3\\x94$\\xf3?\\xaa\\r\\xfc\\xa8\\xc9G\\x0b\\xc0\\x1fg\\xb3\\x1ebP\\xc2\\xbfJwV\\xe0\\xde#\\x00\\xc0\\xcf\\x977Q\\x8e\\x06\\xe6\\xbfxYN\\xb4\"\\xce\\xf7\\xbf\\xf5w\\xe2Y\\xe29\\xc0?G0\\xc8\\xcc\\tS\\x00\\xc0\\xd4\\x83\\xc7C\\xe8\\xc4\\x07\\xc02-*\\xffU\\xdf\\x06\\xc0\\xb4\\xff\\xf9\\x11\\xb3\\xa5\\xf4\\xbf\\xa9\\xcf\\xa0\\xf8r\\x85\\x04\\xc0:\\xce\\x8fC\\xd9?\\x13\\xc0\\xc6\\xeb`\\xb2r\\xc6\\x08\\xc0\\xbe\\xef\\xfd\\xa6\\xd0r\\xf7\\xbf\\xeemq\\x91\\xceE\\xd6\\xbf-\\xdd\\x08\\x17>\\xe3\\xc0\\xbf%\\xc5\\x1b\\xb3\\x82\\x1c\\xe9\\xbf\\xb68\\xeap\\xac\\xb1\\xd5?\\xacD_+\\xdd7\\xdc\\xbf\\xf5\\xd6\\xe3\\xac\\xd6j\\xf8?\\x84\\xda\\xec\\x83\\x93\\xcc\\xf5?\\xdc\\xba\\xabz\\xda\\xb7\\x00@\\xa7\\xff\\xed;8<\\n@\\xfdB_.\\x1c \\xb7?K\\xeda\\t(\\xfc\\xe1\\xbf\\xe5N}\\xa087\\xeb?\\xc9kN\\xbd\\x9a\\xe6\\xd4\\xbf\\x80\\xf1\\xec=,\\x14\\x04\\xc0%\\x19*\\xfb\\xf2b\\n\\xc0\\xf9\\xe8N\\x00b\\x9d\\xeb\\xbf\\xa1\\x12\\x9c\\xec\\xd2E\\x0b\\xc0\\xcf\\x84F9\\xdc\\n\\xe7\\xbf{\\x89\\x8aQW7\\xf4\\xbfG\\xba\\xbb\\xee\\x7f9\\xd0\\xbf1[F\\xc9\\xc4\\xd5\\xf3\\xbf\\xf0\\xf9\\xc2\\xf1\\x98\\xdb\\x03@\\xa3\\x1cD\\xea\\x83$\\xfa?PB\\xeaSz\\xad\\xf6?\\xce\\x8c\\xb1 \\x80l\\xf4\\xbf\\x16\\xcb\\x93\\x08\\xca\\xd5\\xee\\xbf\"R\\xb2\\n7\\xe5\\xbe?;\\x94\\\\\\\\\\x9d\\xf1\\x05\\xc0\\xd4\\x81NV\\x8aX\\xd6?\\xd3\\x15c\\xed\\xf3t\\xf2?\\x9c\\x90\\x87\\xb7\\x91\\x85\\xc9\\xbf\\xf4\\xfa\\xe8u\\xde\\xf3\\xf6?\\x82 B\\xdf\\xe0K\\xf1?J\\xd3\\xc3\\xf7\\xf8G\\xf1?Z\\x91\\xaew\\xc3\\xa1\\xe7?&\\x03\\xf5)\\x10 \\xfe\\xbf\\x87,\\xdd\\xf2.1\\x0f\\xc0|\\xd5\\xe1\\xed\\t.\\xc9\\xbf\\xe2\\xb8\\x8d\\xfbH/\\xe6?V5l\\x12+I\\x05\\xc0\\x062\\x979\\xb6\\xe1\\x08\\xc0\\x8bQ\\xe6#z\\xa3\\xf5\\xbf$\\xf4\\xae\\x9d\\x94\\xa9\\x93\\xbfH\\x7f\\x07\\x08\\xe2\\xac\\xef\\xbf\\xd0\\xc7v\\xeb\\x0e%\\xef\\xbf\\x82\\x9a\\xfa7\\x9c\\xb4\\xd5\\xbf\\xf6\\x15.\\xa4\\x1e\\xf5\\xf9\\xbf\\x0c\\xb2\"\\xc4h\\\\\\xee\\xbf\\xbb\\xff\\xc4\\xecB}\\xaa?\\x7f\\x01\\xe9\\xac\\xad]\\x03@\\xed\\xcbVT\\x04\\xb5\\xd7\\xbf]2\\xb5\\xd2s0\\xdb?\\x9eQ\\xe3\\x1d\\xa52\\xce\\xbfk\\xeb\\x06\\'\\x00\\xeb\\xef\\xbf\\x83U\\x89%64\\x03\\xc0\\x03\\xadAk\\xc4y\\xb1?\\x1f\\x0f\\x1f\\x91\\xa2i\\xf6\\xbf\\xd3\\x8d\\xa0z\\x12\\x84\\xcd?\\xber\\xb2\\xff\\x03G\\xe2?\\x17t\\xe8d\\x9a\\xfb\\xd5?F \\xf4\\x8cE\\'\\xe7?k\\x07%\\xdc4[\\xf0\\xbf\\xe6\\x04\\x9d\\x8bx\\xc0\\xe0\\xbf/\\xa8\\x0f\\xc6\\xa6\\x97\\x01\\xc0\\x1c\\x80&\\x02\\xba\\xed\\xfb\\xbf\\xd9\\x1c\\xfb\\xde\\xaa>\\xe1\\xbf\\r\\xac\\x0b\\xf3\\x82\\x19\\xf4\\xbf*\\x89\\xdb\\'\\xaa \\x0b\\xc0\\x91r\\x99s\\xe7J\\xe6?\\xbe\\xad\\x87\\xbb\\x99\\xd5\\x04\\xc0`7\\x8b\\xe8&v\\x80\\xbf\\x9d4\\xc9\\xab6u\\xea\\xbfL\\xdc\\xc3\\'\\xaa\\x9f\\xd4?\\xc9\\xc2\\xff\\xf8\\xfe&\\xf3\\xbf\\xcf\\x1b\\x00\\xd3f\\x9a\\xd4?oY9W@\\xba\\xe0\\xbf\\xda\\x88&8\\xf1\\xc0\\xd6\\xbf\\xac_\\xad6\\x1d\\xa8\\xfb\\xbfs%\\xf7*q\\xe5\\xe4\\xbf\\x82\\x93j\\xd1)=\\xdd?\\xc1\\xe0q|E\\xfc\\xec?\\xa7\\x12\\x90\\xaf\\xd2Q\\xf9\\xbfu*\\xfc\\x9a\\xeb\\x06\\x03\\xc0\\xd7\\x9f=\\xd5\\x98@\\xf5\\xbf\\x1c\\x00C\\xa3\\xb6\\xa3\\xfa\\xbfj.;\\x96\\xf9\\x96\\xe4\\xbfh\\xb5n\\xcdI\\xff\\xe7?\\x19\\xd0\\xd4\\x0f\\xa5D\\xe1?\\xe4\\x7fd\\x7f\\xc0\\xc9\\xef?\\xefC\\x1eF\\xf9\\xb8\\xe1?\\x880\\xc3\\xec\\x93S\\xfc\\xbf]\\x0f\\xbb\\xf1\\xef\\xf7\\xaa\\xbf7^\\x90x_\\x02\\xf2?h\\xbej$\\xc51\\xf6\\xbf\\x02\\x1e\\x0c6\\xf4\\x9c\\x07\\xc03\\x7f\\x13\\x14\\x1e\\xb8\\xc0\\xbf\\xe6\\x0cd\\x9d(\\xe9\\xf5\\xbfG\\xce\\xd7V\\xe6W\\xe3?\\xe6\\xc5\\x9f\\x9a\\xfeC\\x00\\xc0\\xe6\\xff\\xe0\\xe5\\xc5\\xde\\xc0\\xbfi\\xe4\\x12\\xf0#`\\xf7?\\xf3\\xe0\\xaad$\\xe2\\xdb?\\r\\x7f3JY3\\xd7?yT\\xed\\x8d\\xe5f\\xe5\\xbf\\x0f\\xd8\\x1e}z\\xe7\\xba?\\xa7|\\xa6\\x13G_\\xce?[6\\x07{\\xc6\\xdc\\xe8\\xbf\\xac\\x1f\\x15?\\x18}\\xf3?\\xa3d\\xf6-\\xd93\\xf9\\xbf\\x17\\xcb\\xfa\\x86S0\\x00\\xc0\\x11\\x15\\x19j\\xe7\\xfc\\xee\\xbf\\x9d\\xcb\\xf8\\x05\\xa1\\xfb\\xfb\\xbf\\xf8\\x80\\xda\\xd1kS\\xf8\\xbfl\\xbb\\xb5\\xc1\\xdb\\x87\\xf3\\xbf\\x18\\xa6\\x8b\\x84$A\\xee?\\n\\x0be!\\xba\\xcf\\xc2\\xbf;(\\x90m\\xef\\x14\\xea?\\xe5%` \\x88C\\xc9?oL\\xe3\\x08\\xbc\\xb8\\xf4\\xbfqlnh=\\xd0\\xf5\\xbfc\\xc7\\xab\\xa8\\xfb[\\xf7\\xbf`\\xa6\\x1d\\x8b\\xdb\\xc9\\xf6\\xbf\\xcf/rE\\x84$\\xea\\xbf\\xf9b\\xac\\xc2w8\\xe0\\xbfd_1x\\xfe.\\xe2?\\x9b:H\\xef,\\xfd\\xfb\\xbf]\\xcb\\x11r\\xceG\\xf0\\xbf\\x1d\\xa32&\\xf7U\\xdf?\\xd4$\\xdbK@\\x0c\\t@\\xec5\\x88,\\xe2z\\xd2?\\x87\\xbbkh\\xed\\x14\\xa0?\\xf3K\\x87*\\xd9\\xfe\\xf4\\xbf;\\x10\\xbc\\r\\x82x\\xf0\\xbf\\x97\\xf9p\\xd9\\\\o\\xd9\\xbf\\x8eq\\x90#,\\xf6\\xd0\\xbf\\x17\\x97\\xc7cXe\\xe5?\\x112\\xd3\\x91\\x17\\xe7\\x00\\xc0\\xbfi[\\xdb\\xbe\\x99\\x0f\\xc0\\xdc>\\xa2\\x83\\xe8y\\x08\\xc0\\xf1+\\x97C\\x97\\xff\\xfc\\xbf\\xb1\\x87V>;\\xcc\\xd5?\\xb80\\x11gz\\x11\\xc8\\xbf%\\x9f\\n\\xa6\\x9b\\x1f\\x96?\\x89A\\x8c\\xda\\x7f!\\xb0\\xbf\\x8d\\xb89\\xcc\\x15I\\xc2?\\xefT\\xa5\\xf3\\xce\\x1b\\xfe?\\x01\\xea\\xf3\\x9c\\xb6\\xae\\xfd\\xbfU\\xac\\xc2W\\x95\\x0b\\xe1\\xbfj\\xcf\\x94\\xf6\\x82\\xb7\\t\\xc0\\x04\\x7f8\\xfe\\xbcG\\xfa\\xbfKIFpE\\xd3\\xf7?\\x84\\x8ex\\xf4\\xb3\\x9f\\xf4\\xbf\\xfb\\x92\\x15\\x9cI\\xba\\xd7?\\xe7\\xa6\\xf4c\\xf5\\xa5\\xe5?\\x17\\t\\xa6\\x1e\\xa0\\xb8\\xdb?K\\xec\\x1a+\\x932\\xf2?j\\x9d\\xef\\xd3\\xf1\\n\\xd4?\\xbd,\\xaf\\x16\\x8a\\xd4\\xf7?}\\x98l\\xfc`\\x07\\x03\\xc0\\x16\\xb0A\\x9cj\\x08\\xe3\\xbf<yK\\xf9\\xf9\\xf8\\x03\\xc0\\nc\\xa3\\xc6g\\x8d\\x07\\xc0:\\x02d\\x12I\\x01\\xf4\\xbf\\x1d\\xb1\\xadq\\x84\\xee\\x0b\\xc0\\xf7\\xe1\\xca\\xea\\xd9\\xcb\\x11\\xc0\\x00\\xfb\\xcc7]\\x16\\r\\xc0u\\xc5\\xffgy\\xba\\xb9\\xbfpo\\xa1\\xe3\\x8b\\xa0\\xfa\\xbf\\x99\\xdd\\xce\\x01\\xd5\\x91\\xf4?\\xfbw<\\xe7\\xbe\\xa6\\xdd\\xbfIl\\xcb\\x11\\xd6\\x18\\xdf?\\x84\\xc0WR\\xe1\\x90\\xe4?\\x86\\x13R\\x103\\xd9\\x02\\xc0\\x90\\xae\\xf9\\xc6\\xd1\\x94\\xe5\\xbf\\xb8\\xcd\\x0f\\xd4Y\\x00\\x0b\\xc0}\\xb9\\xfb\\xe3o\\xe3\\n\\xc0\\x8e\\x9f\\xfa\\xaeO\\xea\\n\\xc0FT\\xe7\\x10\\x91\\xbf\\xe2\\xbfd7\\x8bl{\\xb8\\xd1\\xbfn\\x16PZ\\xb4\\x95\\xf4?\\xc1\\xcf5\\x8a0s\\xcb\\xbf\\xb6\\xfeb\\xf1\\t\\xf3\\xe3?\\xb6\\xdda\\x8f\\xb0x\\xef\\xbf\\xd3\\x8d8\\xf1\\xec\\x17\\xe3?\\xeb\\xe1\\xba\\xe3Y:\\xee?=8\\xb3\\xc0/)\\x02@\\x0eZq\\xd3\\xf5Z\\xbf\\xbf\\xdb\\xfd@T\\xaaL\\xf9\\xbf3UfGF\\xd3O?0\\n\\x02A\\xf6;\\xf2\\xbfu\\xdc)R\\xd2*\\xf1?A\\x15*N\\x9c\\xa9\\x05\\xc0p\\t\\xb2\\xcfC\\xcb\\x13\\xc0\\x98\\x9f\\r\\x9e3s\\x0e\\xc0#5LIV\\x07\\x03\\xc0).^\\x12\\xbcL\\xfa\\xbf\\x99\\xcc\\xf3\\xfbt\\x8b\\xf0\\xbf\\xf6,\\xc4F\\x86\\x06\\xd1?\\xab\\xd6g\\x1d\\x8f\\'\\xe4\\xbf\\xbe\\x19\\x84\\x1b\\x88u\\xd6?\\x8f\\xa4\\xd1\\x9a\\x88\\xbd\\xe4\\xbf\\x0c\\xdb\\xa9\\xe6\\x04\\t\\x00\\xc0\\x17W\\xa8\\xde\\xcdl\\x06\\xc0TNk\\x07p7\\n\\xc0\\rkq}HI\\x01\\xc0\\x9b\\xd2\\'uG(\\xd9\\xbf\\xf3Qz\\x8f?^\\xf5\\xbf\\xd6<vC\\xfe$\\xfa?N8\\x90-\\x1bX\\xd4\\xbfv\\xcd\\xd9\\xd6\\xbbM\\xde?\\x0b\\x93\\xcbE)\\x8e\\xe7?\\xdc(~\\x8cu\\xe5\\xd1\\xbf\\t-\\xba\\xd4t\\x01\\xf1\\xbf\\xfd\\rL\\x8b\\x0bz\\xec\\xbf\\x0f\\x0b\\x8b=L\\xef\\xef?\\xd5\\xe8X0\\x03<\\xea?\\x9b\\x1b\\xbb\\xd0\\x8fH\\xf3\\xbf\\xd0\\x9e\\xb7\\xbc\\xea\\x1d\\x03\\xc0\\x1dx\\x8c\\xd1O\\x88\\xe9\\xbf\\xf3\\x90\\xac\\xbd\\x06=\\x00\\xc0\\xbb\\xe1\\x98\\x03r\\xde\\x0e\\xc0\\xe9\\xd5\\xf2\\x1d\\x06S\\x0b\\xc0\\xd4>\\x1d\\xc3\\xc9i\\x01\\xc0c\\x05\\x11\\x00\\x83\\xc4\\xcf?-\\xfe\\xc0v\\xde#\\xe2\\xbfJ$F\\x94\\xe0T\\xef?B\\xf2\\t\\xcd\\xbf\\xcf\\xde\\xbfc\\xbc4\\xf1~\\xf4\\xe1\\xbf\\x14\\xb0\\x81\\xcb\\xebP\\xd9?\\xbe\\xf1\\x00\\xf2\\xca\\x0b\\xce\\xbf\\x1d\\x85\\xc8?M\\x8a\\x03\\xc0\\xd4\\x0b\\xfd$\\xc3\\xbf\\xdc\\xbf&F\\x9f\\xed0\\xe6\\n@\\x1a\\x10\\xb8I\\x81\\x93\\xe8\\xbf\\xcdLH\\x98\\xb2=\\xe6?,\\x0f\\x920K\\xd0\\xda\\xbf\\x1f\\xf7\\xb0\\x9aM\\x05\\xdf?\\x97\\x05m\\x93\\x80\\x0b\\xe7\\xbf\\xc9\\x84\\xd8n\\x83)\\x03\\xc0\\xd8(\\xea\\x15\\xc3\"\\xf1\\xbf\\x8c`\\xe0\\x8b\\x80\\xbe\\xea\\xbfp\\xeb$b\\x12%\\xf9?nb\\xaa\\x10\\xcb!\\x00@^#=h\\xad\\x04\\xb7\\xbf\\xc9\\x03\\n\\x9c.\\xfc\\xc1?\\x1b \\x10\\'\\x05\\xb4\\xd8\\xbf\\x18\\xa5\\x80\\x86s\\t\\xd2\\xbf\\x17\\x00s\\x10\\xb8\\x06\\t\\xc04\\xd1R\\xe1\\xa4*\\xf4\\xbfg\\x17\\xd1+$\\xb3\\x03\\xc0\\x05m\\xfd\\x082\\xcb\\xf5\\xbf3?c\\xaf`\\x00\\xf1\\xbf\\x06J\\'\\x07\\x05\\x84\\xe8\\xbf\\x1d#\\xb8\\x0b1|\\xd0?j\\xf0\\xa0#Z\\x1c\\xc2?bJ\\xe1\\xf5i;\\xa1\\xbf\\xbd\\t\\\\\\xa9Em\\xce?\\x9c\\xc2bkn\\xc7\\xe1\\xbf\\x07\\xfb\\xads2\\xa2\\xfe\\xbfk.]\\x90\\x8eY\\xee\\xbf\\xbf\\nn\\x8fL\\xed\\x02@\\x0b3\\x9c\\xed\\xc2\\xb7\\xed?\\x84\\xef-]5\\n\\xe1\\xbfy\\xa7\\x80\\xaeC\\x8e\\xee\\xbf\\x99\\xb0\\xbc\\x9a\\xfa:\\xe5?\\xd4\\x80+\\x9f\\x10\\xa4\\xe5?\\xec\\xaf\\x0f\\x9bCg\\xf0\\xbf}0\\xeb&f\\t\\xee?\\x14[\\x89\\x18\\xd3\\xfd\\xc0?\\xb55\\x98VR\\xf3\\xfe\\xbf\\xf9\\xd0\\x91\\x11`\\xb4\\xdd\\xbf\\xbf\\xf9\\xeew\\xb9\\xd4\\x06@\\xd3\\x0e\\xab\\xde\\x15=\\xfc?U\\xdf\\xf9}\\xa8~\\xf2\\xbf\\x11\\x17\\x90\\x99)\\x8d\\x10\\xc0\\xbb\\xf9\\x86\"[\\x1b\\xee\\xbf\\xa1S\\x1c~\\x90\\xf2\\xf1\\xbf\\xa2[\\x12&\\x15\\x19\\x01\\xc0\\xb3\\xc8\\x9cdD)\\x01\\xc0\\x07\\xbc`\\xd9+\\xf2l?\\x90\\x1f\\x01\\xf7\\x1f0\\xc0?\\x95;a^\\xe6\\x80\\xe2?\\x9fQt\\x98\\x9f\\xc3\\xe9?\\x93z\\xe9\\xe9:\\xc6\\xd3\\xbf\\xe3gR \\xfb\\xb0\\xd4?\\x93~\\x9eB\\x91D\\xf6\\xbfs\\xdcO\\x17\\x8d\\xdf\\xed\\xbf\\xe2\\x99\\x18\\x1e_\\xf6\\x00\\xc0~\\xb0\\x16\\x08\\x83^\\xe7?\\x95q\\x16&\\x14\\xa7\\xec\\xbfKa\\x05\\x1a\\xbcH\\xdf?\\xb1\\x9f\\xed\\xe8\\xf0&\\xed\\xbf*6\\x19\\xe5\\xb6\\xf0\\xf3\\xbf\\xbep\\x17s\\xa2\\xdc\\xf9\\xbf\\xc7`Ja\\x12a\\xd2\\xbf\\xb6\\xf0\\x11\\xcaS\\xda\\xfe\\xbf?\\xc5a\\xea\\x9b0\\xc8?\\xa8K6E\"\\xc3\\xf9\\xbf!8\\xb51\\x7f\\x83\\xe8\\xbfYW\\x95N\\xef\\xee\\x0c\\xc0=\\xd1\\xf7\\xd6O\\x1b\\xe6\\xbf\\xa8\\xcdeVS\\xa9\\xfc\\xbf\\xde9\\xcb\\xb7(c\\xf8\\xbfcx\\x96\\xb0!R\\xf2\\xbf\\xae\\xc2L\\xbb\\x1d\\x95\\xe0\\xbf\\x93}\\xb7U\\x88\\xcb\\x00\\xc0\\xd1\\xf6]\\x18\\xd9\\xa9\\xea\\xbf\\xb6\\xe1*Tm\\xd7\\xe4\\xbf8\\xe1,\\xd5\\xbf\\xdb\\xb4\\xbf\\xba\\x1b\\x83\\x93k\\xdb\\xf9?<\\xfd\\xfedL\\x00\\xf8\\xbf\\xf3}K=\\xe2\\x10\\xee?\\xefl2\\xado9\\xe1\\xbfo(\\x94\\xd4X\\xc1\\xd9\\xbf\\x0e\\xa1|5\\xd8#\\xe1?\\xdc\\x86\\xb8\\xca_e\\xde\\xbftG\\x1em\\xcbC\\xe8\\xbf\\xa0\\xb7\\xd0v\\x0f\\xee\\xe0\\xbf\\x8f\\xe7\\x1ez\\x0f\\x15\\xf3\\xbf\\xd3\\xac\\x10p\\xdaX\\xd5?\\xe7^\\xbb\\x96,\\xb2\\xe3\\xbf\\xfb\\x86\\xbfQ\\x05\\x89\\xd7?\\xfd\\xd8&[\\xcf#\\xdc\\xbfI1O\\x05Q\\xe6\\xe8?&\\xb1\\x1a\\xbc\\xeb\\x03\\xe4\\xbf\\x17\\x10\\n\\x8aW\\xa6\\xc4\\xbf\\x9bb\\x13\\x1cF\\xc3\\xf8\\xbf\\x16\\x0f\\x10\\xf4\\x00\\xc8\\xfd\\xbf\\xe88`\\xd9\\xbf\\xdd\\xf6\\xbf\\xd7\\x0eU\\xc2\\xfa\\xc4\\xd2\\xbf\\x9b8\\xa4Q<\\xc1\\xb0?R\\nw\\x1a\\x91*\\xd2?PQ\\xd5\\x94\\xb7\\xfd\\xda\\xbf\\x83\\xc8Q\\xe0G\\x92\\x97?<\\xb6\\n\\xbb\\t\\xfc\\xe3?\\x11\\x8d\\x16/\\xb4\\xfd\\xc5\\xbf\\x98@#\\xc9\\x95[\\xd1\\xbf 4\\xa3\\xdc.\\xda\\xc6?yf\\xc5a\\xde\\xf2\\xe3\\xbf\\xfb\\x1f\\xa1s+\\x18\\xb4\\xbf\\xc8a\\xdf\\t\\x18\\xf2\\xda?|\\x9cEY-\\xe6\\xf6\\xbf\\xa4\\'\\x89c\\xc9\\x95\\xe6\\xbfs0\\xd3\\xc0M!\\xfe\\xbf\\xee\\x86Y\\xc9i\\xc1\\xdf\\xbfr;\\xfbK\\xc7\\xa0\\xf5\\xbf\\xe9\\xaf\\xee\\xc3\\x85\\xd5\\x08\\xc0\\xcdV$x\\x9e\\xb7\\xe3\\xbf\\xff\\xa3\\x07\\x1ft\\x96\\xe4?\\xc9\\x06\\xdf\\xa4sE\\xff\\xbfL\\xce\\xed\\xce\\x8b\\xd0\\xf6\\xbfP\\xef\\x81;\\x85\\xdc\\xed\\xbfP]\\x0b\\xec\\xb9\\xab\\xed\\xbfU+}\\xd1\\xa9\\xb8\\xc9?\\\\*A\\x8c.$\\xe8?w\\xae\\x91\\r\\xc5\\xa3\\xb1\\xbf\\xa4\\xbc\\xbf\\xfb\\x1a\\xeb\\xe0\\xbf\\x1c\\x07 \\xed\\x1a\\xbf\\xce\\xbf\\x87\\xcb\\x7f\\x9d\\x0c\\xbd\\xcb?r4`2\\xfeO\\xed?\\xdfb\\x1c\\xf5r\\x1f\\xe2?50\\xfd{\\xc6\\x19\\xf2?dl\\x9a%\\xda\\x02\\xca\\xbf\\x9d\\xae\\xdc\\xb2\\x9d\\xf1\\xdc\\xbfv\\xb9\\x03*\\x8a\\xe9\\xd4\\xbf\\xbc\\x9cFo\\xad0\\xd0?\\xcaw\\x05\\x97\\x982\\xe7\\xbf\\xcek\\x8d\\xd5\\x87G\\xac\\xbf\\'\\xc0\\xee\\x0f\\xb8K\\xdc?n\\x14\\xc4p\\x18\\xfc\\xed\\xbfL1G^*F\\xe2?\\n\\x06\\xfb4,W\\xf2?\\xe9\\xe4\\x1c\\xcf\\x91\\x91\\xe1?\\t\\xf8\\xe7\\xadJ\\xb8\\xc6\\xbfW\\xa2Mz\\xc8\\x92\\xf2\\xbf\\'\\xe0\\x91\\xcb\\xcc\\xf4\\xc8?\\xe1\\xf3;\\x15\\x08M\\xf2?S\\x1e\\xb0\\x0e}!\\xd1?\\xb5<\\x87\\xddh-\\xe5\\xbf\\x0bY\\x06\\xabBr\\xcb\\xbf&ME\\xea)&\\xe5?G\\x0cN\\xd5\\x7f\\xef\\xf0?s\\xdf\\x9c\\xd7\\x87?\\xe9\\xbf\\xcb(\\x178\\x9d\\x08\\xf0\\xbf\\xab\\x11\\xbfE\\'\\x90\\xdd?\\x92\\xd5Cv\\xaa\\xa4\\xdc\\xbf\\x05\\x1bGS\\xf8\\x13\\xf0\\xbf\\x91u\\xd7\\xdbDN\\xd9?\\x15[\\x84\\x90\\xb3\\xa8\\xea\\xbfo\\xd9\\xdcnx\\x14\\xe6?\\x86k\\x87\\x04\\x81\\xb5\\xc7\\xbfO\\xef\\x14\\x14\\xc4\\xce\\xb2\\xbf\\xa7U\\x9a\\x03;\\x0f\\xe4?\\xe4\\x0c\\xb6>LM\\xd9?\\xbb\\xc8\\xdfxX\\x99\\xe6\\xbf\\xbc}\\x8e\\x0cZ\\x99\\xe7\\xbf\\xb8P(u]y\\xd4?C\\xb6&X1\\x19\\xdc\\xbfT\\'vn\\x8e\\xfc\\xfc\\xbf\\x12+\\xdeC2\\x91\\xfa\\xbf\\xa0!\\x80\\x01\\xce\\xb5\\xd3\\xbfB\\x82\\xcc8\\xa4j\\xc2?\\xc8\\xba\\xa4\\nl\\xc8\\xb1\\xbfn\\xe74\\xe5h\\xcb\\xe7\\xbf\\xea\\xdcV\\xa6l+\\xb8\\xbfP\\xc9\\x0e\\xccnh\\xc8?@/\\xf6)B\\x0f\\xe1?\\x93\\xac\\xa5\\x98dj\\xf4\\xbf\\x13\\xfe\\xfaJ6\\x08\\xde?\\xe1N2\\xe8\\x84\\xa8\\xbc?\\xc8[u\\x94\\xf8\\x02\\xe2?1\\x9f5\\x87t5\\xe3\\xbf\\x00U~\\xd3PD\\xd3\\xbf\\xb8\\r\\xe8\\x86dB\\xb0?7<\\xadhq\\x89\\xe1?\\x97\\xf0\\xbd9\\xd8\\x98\\xe4\\xbf\\xd7\\xa1;\\x84\\x94P\\xe2?/\\xc6\\x96\\x8b\\xe3\\x1e\\xd3\\xbf\\xd0G\\xf1j\\xf9\\xef\\xef?#\\x99A5\\xfb5\\xf0\\xbfPk\\xe3\\x07{\\xbc\\xde?\\xbc\\x12\\xd5\\x7f\\xbe\\xc6\\xd1\\xbf\\xe11\\xffb\\xbb\\xdb\\xde?|\\xde\\x9a]w\\x1f\\xd2\\xbf\\x9d\\x0e\\xe5c\\x01\\xcb\\xd2?\\xc9\\xf9\\xe5\\xb1\\x8d\\xf1\\xdb\\xbf\\x8b\\xda\\x11\\x17@\\xb7\\xd6?\\x849a\\xd2\\x8cT\\xe7?\\x9e\\xd9\\xcc\\x8ac\\x07\\xef\\xbf\\xa5sIz\\x16K\\xeb?\\xfc\\xb2(\\x81S\\xd5\\xf5\\xbf\\x9a\\xeb\\xc6\\x83N\\x1d\\xb9\\xbfyZ\\x99\\x14\\x0bB\\xe5?\\x1b\\xcbin\\x11R\\xd8?\\xbc\\t\\xbd\\xb6\\xb2R\\xf4\\xbfh\\xef\\xe1BQ2\\xca?\\xbf\\x18\\x1cH-F\\xf5?\\x92\\x80\\x95\\x7f\\x82[\\xb8\\xbf\\xf5\\xd4[G\\xdc\\x8c\\x87\\xbf\"\\x01\\xf9:\\x06|\\xdd\\xbf\\xab\\x08\\xbf\\x84DN\\xf1\\xbf\\x96f\\xe8\\x1f\\xd0\\x1b\\xdd\\xbf6\\x9aD\\xb9\\xd1\\x8e\\xe0?\\xe61`\\x1b~\\xc2\\xe1?\\x10-F\\xaaBk\\xe6\\xbf\\x9d\\xc1\\xf6\\xbc \\xbe\\xb9?$vk\\xc1\\xed\\x0e\\xe6?\\xfa\\x06\\x08W*\\xf7\\xda\\xbfF>G_{M\\xe8?p(\\x9fS\\xb3\\x92\\xe8\\xbf\\xf4\\xdf\\x88W]\\xb1\\xe1\\xbfP\\xd5\\xaeZ\\xb0J\\xdb\\xbf$\\xe3\\xb8\\x06\\xb0\\t\\xe5?\\x00A\\x1c#\\xfcw\\xe0\\xbf\\xc2\\xf7\\x1ahm\\x04\\xc8?\\xa1\\x02\\xee\\x1c&\\xfe\\xed\\xbf\\x82\\x04J3\\xb0\\xa2\\xb6\\xbf}\\xa2\\x99{\\xb7\\x97\\xe3\\xbfr&\\xf4\\xa8\\xaf|\\xdc?\\xafj\\xb6\\x00\\xe3p\\xf7\\xbf\\xdb\\x03\\xe4j`{\\xb3\\xbf\\xbe!\\xe3\\x84hR\\x00\\xc0\\t\\xa9\\x02(\\x8f\\xdd\\xe3\\xbfE\\xcd\\x18\\x8dw\\x90\\x02\\xc0\\xbc:W\\x8a3\\xbb\\xf8\\xbf\\xae\\xcf]\\xa8\\xbb\\x87\\xee\\xbf\\x00J\\xe2\\x1e\\xac\\xa3\\xfd\\xbf0g,\\xa4%k\\xeb\\xbf\\xaa[\\xa5\\xf7*\\xfd\\xf2\\xbf\\xe2\\xb6\\xa1\\x14\\x9f9\\xc6\\xbfK`\\xb6k8\\x98\\x00\\xc0\\xbeM\\xdc-\\xbd\\xa5\\xef\\xbf\\xd7\\x05\\xbe\\xf6\\xb4T\\xa3\\xbf\\xd1j\\xcf,i\\xe0\\xe2?=\\x7f\\x06\\xb4\\x8a\\x8d\\xca?\\xd79\\xa8\\xd9\\xefX\\x95\\xbfr\"\\xcd\\xc7\\xcd\\x13\\xe8?w\\xa4\\xc1\\\\\\x8b\\xf9\\xf1?\\x15_\\xcczc\\x9d\\xbd?\\t3\\x99z)\\xc9\\xee?\\xfc\\x8f\\xc6\\x85<\\x9d\\xdb?\\x1c\\xc29>\\xd2e\\x97\\xbf\\xef\\xf9\\xff\\xad\\x9b\\xb1\\xf8\\xbf\\x82O\\xd6\\x08\\x90v\\xee\\xbf\\xd5\\xc6fK\\x9fg\\xd1?\\xb5\\xd3\\xaaP\\x90\\x08\\xd2\\xbfI\\xd8\\xe0!\\x8a\\xb9\\xde?\\xfc\\xc5*,\\xaf<\\xc9\\xbflOV}%\\xbe\\xf7\\xbf>\\xe3\\xa0\\xe8\\xf4*\\r\\xc0?\\xbd\\x808U\\x87\\x0e\\xc0X\\xde~\\xaeYu\\x1e\\xc0?\\xa4\\x9b\\xbd\\x1a\\x13\\x1d\\xc0\\xb0\"\\xf4s\\x07\\xf5\\x1f\\xc0\\t\\xc4\\x93&\\xa3e\\x1a\\xc0\\x12\\x8bR\\'\\t\\x04\"\\xc0PK\\x9d&(\\xa7\\x19\\xc0\\x151g\\x04\\xd4\\xc3\\x18\\xc0\\xdf\\xcd\\x85N\\xff[\\r\\xc0\\xb5\\xa9\\x7f\\x18\\xf3J\\xfe\\xbf\\xe2\\x1dL\\x93po\\xff\\xbf\\xcc\\x95MO{\\xef\\xe6?\\xc6\\xe6\\xcc\\xd3\\xf37\\xf7\\xbf\\x88\\x04\\x05\\xdd\"\\'\\xf8\\xbf\\xaa\\xe8\\xb88\\xaco\\xd2?bW\\xb5\\xd0\\xf0\\xf6\\xc9?\\x03\\xc4\\x03\\xa6@\\xc3\\xda?\\x15dhHTA\\xf1?\\xc7\\xa8\\xbbZ\\xae\\x12\\xd1\\xbfO\\x92\\xf3K\\xdc\\xff\\x9a?\\xc6\\x97\\xfa\\rd\\xa7\\xd2?\\xa0\\xf2\\xa1\\xd3\\x00\\x94\\x8a?\\xc2\\x87\\xd2\\xf0\\x12\\'\\xf9\\xbf|\\xcds\\xeb\\xc0\\xbb\\xe6\\xbf\\xacXK\\xf0U\\xea\\xb8?\\xb3\\xea\\x9e\\xa2\\x9b\\xbe\\x08\\xc0\\xc1\\xa9y:?\\x11\\r\\xc0\\x96y\\x9c\\x97p\\x1d\\x03\\xc0\\x95\\xbe\\\\\\xbbq\\xbd\\xc6?C\\x8e \\xbe\\xd2Z\\xab\\xbfI\\xeaT3}\\xdd\\x10\\xc0\\xa16>T\\xbe;\\xd4?\\x95\\xa5\\xc2e\\xc4r\\xe3\\xbfe\\x95\\xea\\xbaw\\xf6\\xc6?\\xed\\xdf\\x02u\\x85\\x16\\xd0\\xbft\\x15\\x13\\x18=K\\xd7\\xbf\\xd6\\x87)\\xb7\\xfah\\xf6\\xbf\\xd0\\xea\\xc5I\\xe1J\\xf8\\xbf\\xc1\\x9c\\xf2\\xfe0\\x10\\xff\\xbf\\x0cF\\x94\\xe51z\\xd3\\xbf\\xcd\\x90\\x11d7D\\xd0\\xbf2\\xea\\xe8\\xfd\\xde\\x07\\xff?\\xce\\x91\\x99to\\xb7\\xa0\\xbf\\xac\\x94\\xc6\\xa9\\xcf0\\xeb\\xbf\\x96\\xd5\\x97\\xd8\\x13\\x9c\\xd9?\\xcff\\xc2\\xc8\\xc3\\x19\\xdc\\xbf\\r\\xa7\\x87\\xcd\\x88\\xa5\\xa9?\\x03\\x0e\\x06\\x849&\\xd0\\xbf\\xcce\\xcbm\\xd6\\xa7\\xf1\\xbf\\xcd\\x82\\xd3\\x8f\\xca\\xfb\\xd7?\\x95_\\xcd\\x06?\\xce\\t\\xc0\\xcf\\xe6Hm\\xb7D\\xf7\\xbf\\xda\\xac\\xe0\\xfaT9\\x01\\xc0l\\x97!\\xdf\\xb9\\xff\\xf7\\xbf\\xff\\xf4\\x0c\\x0b\\x08\\x1d\\xcd?\\x17gv\\xd3\\xc8\\xa7\\xf7\\xbf\\xfc\\xc9\\x0c5\\x8a\\x80\\xdc?\\x9a\\xab\\x8eJ+/\\xf3?}R\\x81\\x104\\x91\\xe4\\xbf\\x90\\xe5\\xafVw1\\xdf\\xbfq\\xdd\\xa6\\x90:F\\xa9\\xbf\\x00\\xa6f\\xc6l\\xfe\\xd7?\\x02\\xdaD\\xd0\\xd2\\x84\\xd4\\xbf\\x86\\xadL\\xf4\\x1e\\r\\xe8?\\xc2\\r\\xed7u\\xe2\\xdb\\xbf\\xfa\\xcd_ \\xb2\\xf7\\xfa?\\xe3*\\xb3\\x87\\xb0 \\xf0?Z\\x00s\\xaa\\xe6+\\x00@\\xad\\x16\\xea\\xda_\\xd7\\xcc?o.p\\xa3a\\x8a\\xd9\\xbfJ\\x02>\\xedoY\\xe2?z}\\x1b\\xa1>}\\xef?h\\xd8\\xb3o\\xc8\\xde\\xe4?\\xddY\\xa2\\x8c\\x0b\\x9d\\xe7?rLLl\\xcd)\\xa8\\xbfh\\xf8>\\x07\\xb9\\xae\\xd3?_\\x07\\xb6\\xc1\\x10j\\xea\\xbf\\xf9t\\xa7\\xdc\\xa6\\xa1\\xf3\\xbf(\\x80qoU\\x95\\xf7\\xbf\\x95b%\\xe5\\x0b(\\x05\\xc0_<\\xc8\\xe2\\x11\\x03\\xc9?\\xfd\\xbd\\xfc&\\xcc\\x98\\xf0\\xbf~\\x9d\\xcbB\\x9e\\x02\\x00\\xc0\\x9e\\xf8gwR\\xba\\xd7?\\x8b\\xbc\\x89\\xf6\\x01\\x8b\\xdb\\xbf2\\x1e\\xb3 \\xef\\xa5\\xe4\\xbf&pry\\x1b\\x00\\xc6\\xbf\\xb9)\\xe9N)k\\xec\\xbf\\x1eN}\\x0c\\xd5\\xa9\\xe8?\\xdab{\\x01E\\x83\\xd1?\\n\\xfd\\x96\\x15J[\\xf1?K\\xd6\\x84\\xa4C\\xaf\\xf5\\xbfI^\\xc2Xh\\xf3\\xfa?/\\xb2\\xe37L\\x87\\xdc?\\x87X\\xdf#\\x18L\\xdb?\\xf7\\xee\\x18\\xbc\\xc89\\xe6?Gw\\xde%\\x7f\\xe8\\xf9?\\x1df\\xdcI\\xdc\\x90\\xee?\\x8f\\xba\\xdb\\xb0\\x00\\xe8\\xd7\\xbf\\xc6\\xdf\\x92\\xbc\\x16\\xa9\\xe5?W\\xbfb\\xfb\\x1c\\x83\\xa8?\\xb0\\xf7J\\x8d\\xae\\xb5\\xb8?\\x1dEp\\x9a~\\xfa\\xbe?Cw\\x85~\\xfd\\xa5\\xc5\\xbf\\x9f\\'\\xa41p%\\xba\\xbfe\\xa0\\x1cf9\\x11\\x00\\xc06\\xba\\x06\\xf1\\x96\\xe6\\xff\\xbf\\x8e\\xae\\xf1\\\\\\xc8\\x8b\\x07\\xc0\\xca\\x98+mCe\\x03\\xc0\\xd5\\xe4N\\no\\xf2\\xf2?\\xee\\x0e\\x8b\\xd3S}\\xb2?s\\x02z\\xaa\\x02\\r\\xe8\\xbfx\\x85\\xd4q\\xad\\xa2\\xf5\\xbf\\x9e\\xaba\\xcf\\xce\\xce\\xf0?\\x03\\x84y\\x96\\x98P\\xfb\\xbf\\xfe\\xa1\\x05\\xdbP\\x8f\\xf6\\xbf\\xfa\\xda3\\xeajn\\xcf\\xbf\\x8d\\xc20\\x9d\\xacg\\xed\\xbf\\xae\\x1c\\xa3\\x92\\x83\\x02\\xd8?\\xad!\\xf1Ja\\xa9\\xe5\\xbf\\x9c\\xf8\\xef\\xc2_\\xc0\\xf2?\\'\\xceC\\xb2\\x87\\xf8\\xce\\xbf\\xd5\\xc5\\xf2\\xc0W\\xf7\\xf7?\\x99\\xddS\\x1d\\x83\\xb9\\xf7?\\xa5P^\\t\\x1f\\xcf\\xed?^\\xdf\\xa4\\x1c\\xb1\\xd1\\xf9?\\\\\\x05\\x19\\xf4\\x07\\xa0\\xe8?K\\xcf\\xb2k\\xf8\\x87\\xdd\\xbf\\x9bFZ\\xe9\\xb4\\xfe\\xf5?\\x10\\x9a]\\x89%\\xf4\\xe1?\\xde\\x05.\\xb1p\\xf9\\xf1\\xbf\\x85z\\x91\\x85O\\xcc\\xd5\\xbf!\\xc1f\\x82\\xaa\\x87\\xfb\\xbf\\x0c\\xa1+\\x1e\\x00\\x0e\\x05\\xc0h\\xe0\\x17Q\\xa8\\xa0\\xfb\\xbf\\x86\\x1e%\\x81\\x81\\x91\\xe5?d\\x8e\\xde\\xfb\\xdc\\x99\\xf6\\xbf\\xa4\\x08\\xfaX\\x8a\\xe0\\x91?\\xa5\\xf6\\xb7\\xd3\\xc6S\\xf4\\xbf\\x03\\xdbe?Db\\xe8?\\x0cW\\xf4(\\xe8(\\xcf\\xbf0\\x9a-B\\xad\\x01\\xdb\\xbf>\\xd3I\\xd4\\xaf\\xd5\\xef\\xbf\\xddE\\xf1\\xd9/4\\xef\\xbf\\xdd\\x9bIIy\\xa3\\xab\\xbf\\xc6\\xcd\\xecK\\xdbs\\xcf?\\xf1\\x16\\x84{\\x91\\x99\\xe1\\xbf\\xb7\\xf4vr;\\x98\\xff?C\\xee\\xd2x\\xccL\\xa9\\xbf^\\xff\\x06\\xbb\\xdd\\xb2\\xd6?j\\xe2&\\x8e\\xeb%\\xdb\\xbf\\x82\\xe9J\\xba\\x9b\\t\\xdd\\xbf\\x89\\x0b\\xec\\xcd:G\\x08@SS6\\xdd/\\xc8\\x10@\\x8f\\xa1m\\xaa\\x90\\xb6\\r@\\x10kbJ8m\\xf5?\\x936\\xa6\\x02\\x07\\xd9\\xe3?\\xa0\\x1f\\x9b\\xee\\x91\\xfa\\xdc?lH\\\\\\x17\\xcd\\x08\\xf0\\xbf^\\x84\\xe4H0\\xfa\\xdc\\xbf\\xa0b\\x19\\xdd\\x88G\\x02\\xc0\\x18(\\xe3\\xb5\\xdd\\x18\\x0f\\xc05@\\xbe\\xfax\\xd4\\xe1?\\x87\\\\C\\xfa\\xb1\\xfa\\xd4\\xbfx;\\xde\\xf4\\x17\\xd8\\xed\\xbf\\x87n\\x8bF-_\\xb7?\\xc0\\x9a\\x1d\\x94\\x9fL\\xc2\\xbf\\x82\\x81o\\xb3\\x90\\xdd\\xfd\\xbf2\\xc0\\xcdol\\x8d\\xf3?\\xf2\\xee\\x1a9^\\x01\\xe4?\\xb9q+\\x0cg\\x85\\xe7?\\xe8\\x1d\\xdb\\x0c\\xbf\\xfd\\x0c\\xc0\\x96\\x89\\x15\\x14\\xe7\\x95\\n\\xc0s\\xcc\\xb5\\x1e[\\xd5\\xe3\\xbf\\xc2E\\x9c\\x904\\x91\\xc0?\\xce^d\\x10\\xe9\\xc4\\xfc\\xbf\\xb5z\\x10d\\xf7\\x10\\xf4\\xbf\\xb0\\xdb\\xef\\xdc\\xcei\\xf2?n\\x91\\xb6\\xbb\\xf0\\xd2\\xed\\xbf\\x8e\\xb1m\\xb3t\\xb2\\xe5?6\\xd3\\xdd\\xb5\\xefu\\x04@\\xb3,w\\xcd\\x98P\\x05@n<\\xbbR\\x06\\xc9\\x11@{5\\xc2\\xe6\\xef\\xf6\\xf5?\\x9bp\\xb0~F\\xec\\xec\\xbf\\x1d\\x07\\xbbR\\xa3g\\xbb?\\x03C\\xc2\\xc1\\x82\\xb8\\xd4\\xbfD5H=\\x06e\\xf1\\xbfx\\xf7\\x85\\xa3\\xc6\\xc6\\xed\\xbf\\x17>wuB\\x94\\xb9\\xbf\\x90h\\xaa\\x95\\xa8\\xb7\\xe9\\xbf6\\xb4\\x92W\\x07*\\xc3\\xbf\\x1f\\xd1\\xb0|`A\\x03@Y\\x85\\xa6\\xd4\\x12\\xa1\\xd4?N\\x9a\\xa1\\xf5\\x00h\\x10@\\x87\\x93d\\xda\\x00\\xf4\\x13@W\\x90_U^\\x8e\\x0b@\\xae(\\xb6\\x1f\\xa0\\xf5\\r@\\x8d\\xb4\\x95\\xe4\\x00\\x8a\\x05@%\\xbfyI<\\x8a\\x06@\\xad\\xe6U\\xa5\\x14\\xa0\\xfa\\xbf\\xa6\\x18NL&0\\x04\\xc07\\xe9\\x16/\\x08\\xf7\\x04\\xc0\\x81\\xd5\\xc4K\\xc7\\x1b\\xee?s\\x05\\xbd\\xddR\\xd3\\xee\\xbf\\x19\\x1c?\\x0e/\\xed\\xf6\\xbf\\x11\\x8a\\x8c\\x16\\xa3\\xa5\\x01@\\xcdK\\xdd_\\x87\\xf8\\xef\\xbf4\\xc36\\x85\\xbc\\x0f\\xec\\xbf\\x80e\\xddq\\x95\\xea\\x08@L\\x18\\xad\\xfc\\xa8\\xf6\\x11@\\xf7\\x17.\\xf2\\xbd\\xa7\\x03@\\xed\\x9c\\xa9\\x90\\x89\\xef\\xbe?\\x90\\x08\\x12&k\\xff\\xde\\xbfO\\x91qU\\x1b\\xb1\\xe0\\xbfc:o\\xb1$\\xa5\\xf6\\xbf\\xa2i\\x17S,\\xc5\\xf1\\xbfD\\xe9\\xba\\xd1]\\xb2\\x05@(\\xaa}i\\xd7\\xe1\\x0e@;x\\x1e\\x9c\\xcd\\xcc\\x15@\\xb9\\xe1\\x16\\xe9\\x9e\\xf7\\x1a@\\xbf49-\\xdd\\xca\\x1f@\\x8a\\xf1kV\\x9c\\xc2\\r@QQ\\xe0\\xc6\"\\x1d\\xfd?\\xe0\\xea\\xcf\\xe8\\xd4S\\x03@[\\r\\xc4\\xfb`\\xd6\\xf6?{\\xd7\\x0e*\\x84\\x1d\\xfd?\\xe5\\xddO\\xd5\\xb2`\\xf8?h\\xa4\\x97rM\\xe5\\xd1?\\xb4\\xec\\xfe\\xd35\\xd4\\xfa?\\xae\\x93\\xc1\\x9b\\x06\\xf7\\xfc\\xbfE\\xcf\\x99k\\xabDJ\\xbf\\x1b\\xa0|\\xf69@\\xc8\\xbf\\x97\\x8b\\xff\\xda\\xf1l\\x08\\xc0I\\x84\\x087\\x915\\xfa\\xbf\\x1d,n8\\nZ\\xec\\xbf\\xde\\x16+\\xf4\\xc3\\xc1\\x08\\xc0J\\x1c\\xa09\\x01\\x1b\\x07@\\xee\\xf0\\x89-w\\x06\\x15@\\x0b\\\\\\xef!\\xf6\\x0b\\x03@<&\\x0e9\\xbe\\xea\\xdb?\\xa8F\\xecl2\\xa9\\xe0?\\x1fVU\\xc3\\xaf\\xfe\\xd3\\xbf\\xbd-\\'\\xaa\\xdf\\xa8\\xd7?\\xe0\\xa5\\x0c\\xc2Ih\\xd0\\xbf\\xaft\\x90\\x05td\\x17@\\xd4r\\xff\\x84y\\xdc\\x17@\\x10D\\xf8\\xb0X\\xa6\\x15@\\xee]\\xab\\x12\\n|\\x12@\\xe3\\xa6t\\xea\\x1b\\xaa\\xee?\\xe9\\xad\\x01\\x1eH\\xd3\\xf9?\\x8e\\xdaF\\xd4\\xdf\\xef\\xf7?9\\xc4\\t\\xbb\\xf01\\xd2?D\\xa1\\xf6\\t\\xcb\\xc1\\xf6\\xbf\\x92{\\x171\\x84t\\xf4?\\x0cI\\x9e\\xf8\\xe6`\\xe6?\\x03\\x11\\xf57\\x8c=\\xfb?9n\\xf2s\\xa9\\x86\\xf1\\xbf\\x80O!]\\x90F\\xef?\\xe5\\x1c\\xc7{\\xbf\\x0b\\xc9\\xbfq\\x91\\xd7_\\xaf;\\x05@\\x9fL\\xb3F^b\\xe7\\xbfl\\x99\\xabfP\\x1b\\xf6?\\x07\\xe2`j\\xf9\\x19\\x0c\\xc0x\\x0eE1\\x0b&\\r\\xc0\\x87W\\xad\\xd6\"\\xd2\\x00\\xc0\\x93Ii\\xfd\\xcac\\xf7?\\x19\\xd8\\x0e\\x84@\\xbd\\xfe?\\x88\\xef\\xdb\\x7f\\xb7\\xa2\\xd5\\xbf\\xee\\xe6\\xa6\\x1b\\xfdO\\xe6?\\xd2/\\xf3\\xab2\\x8f\\xe9\\xbf\\xdfR\\xd6\\xcdn\\xa3\\xf5?\\x010\\xdcXSk\\xb0?\\x0b\\xcf\\xf48\"q\\x0f@\\x89\\xb3\\xacg>c\\x06@1\\xaa\\x819\\x1f\"\\xe2\\xbf\\xc5$\\xa2\\xc6)\\xc1\\xb2\\xbfq\\xcc8\\x7f\\n0\\xf6\\xbf\\x89\\xcd{\\xb1\\xe1<\\xac\\xbfs\\x10\\x94l]\\xd3\\xd3?%\\r\\'\\xdd\\xda\\x0e\\xd7?\\xcc\\xd8\\x80iSR\\xf9?n\\xa9\\'\\xf04\\xeb\\xe4?\\xb3(\\x95\\xd0l\\xff\\xc8?\\'$\\xd0_\\xddu\\xfc?t\\x03l&\\xddk\\xeb?\\x1aa\\x8f\\x01\\xc9\\x01\\xe6?_{@\\xf9s\\xde\\xe4?\\xfa\\r\\xcf\\x07\\xb8\\x15\\xfa?[\\xb9b\\x85\\x06q\\xf0?rz%}I%\\xf0\\xbf\\xd2^\\x95(1\\xcb\\xe6\\xbf+1lT\\xdea\\x0b\\xc0$\\xb1;I\\xb80\\x10\\xc0\\x1a\\x8e\\xf7J[\\xbc\\xf2?rW\\xd6\\x04\\xc40\\xeb?Vzo\\xd0\\x17Q\\xf6?\\xbb\\xc6\\xe6\\xbc\\xf3\\x96\\xeb?\\x9b\\x88Z\\xff\\xb6w\\xc0?\\x13\\x8c\\x1cM8\\x15\\xe0?\\x158\\xf0\\xfc\\xc1C\\xf9?\\xfd\\xb3F\\xd0\\x9f\\xb1\\xf0?\\x8d\\xd6Ph\\xfco\\x05\\xc0J\\x0b\\xf6\\x9b\\xc5s\\xe8\\xbf\\x86\\x15JV#>\\x04\\xc0#\\xa1%\\xd3\\x00o\\xa1? \\xd6\\xe6\\x89\\xe6\\xab\\xe6\\xbf,7\\x94\\x151\\x12\\xe4\\xbf@\\xf8x\\xae\\xe0F\\xf8\\xbf\\x031\\xce\\xe5\\xe7\\n\\xef?w\\xb0\\xe1\\xbc\\xb7B\\xf8?Y\\x0b\\x96\\x87\\x1a%\\xe6\\xbf\\tK~\\xef\\xed\\xdc\\xfd??\\xb1t:\\x05K\\xf2?\\xdak\\xe6x\\xcb\\xae\\xda?\\x93\\x01\\x000\\xd4y\\xc5?51\\xd8\\xc0~\\x9b\\xcc\\xbf\\xb8\\x18\\x80(\\x97\\xba\\xe5\\xbf\\xa2u\\x89J\\xdb\\xed\\xe1\\xbfb\\xb3\\x1b\\x8b\\x9as\\xd8\\xbfs\\xaby\\xbd\\xa0}\\x01\\xc0:\\xe4(q\\xea|\\xcf?\\x96FI\\x91\\xc0P\\xe7?;H\\xb6\\x15\\xcd)\\xf0\\xbf\\xa1\\xc7ei\\x86\\xda\\xf9\\xbf\\xd0a>W\\xa2W\\xf4\\xbf\\x86=\\x7fb>?\\xe5\\xbf\\xc2@B9\\x03A\\xee\\xbfwP<[f\\xc3\\xee\\xbf\\xf5\\x10x\\x06\\x9f\\xd8\\xf8\\xbf\\x0b\\x15\\xfa\\x9e\\xfe\\xaa\\n\\xc0\\xdc\\xa4\\'\\x1ev\\xa5\\x0b\\xc0G\\x17g\\xaf\\x07\"\\xea\\xbf\\xd6\\x12!`\\x9f\\x1f\\xe9?\\x83\\xa7P\\x9b\\x00\\xb2\\xb5\\xbf\\x11\\x8a\\xac\\x82\\x92\\x83\\xea?C\\xc8\\x03\\xb7jx\\xe2?\\x8b\\xe1t&\\xf7\\x1b\\xf6?\\xd3J\\x01\\x15\\xb3x\\xe8\\xbf\\x03u\\x0eC\\xd5\\x8a\\x04@&}G\\'\\xc4l\\xc6\\xbfS\\xad\\xc5\\xee\\t_\\xf4?&NoP\\xe2\\xb0\\xed\\xbf\\xa6\\xb1cw\\xc3\\xa0\\xc6?(.\\xcf\\x15On\\xba?\\xf2\\x0c\\x04\\x98\\x99\\x93\\xe6\\xbf=\\x93\\xbbt\\x1d\\xd6\\xfb\\xbfZ\\xc0sw\\x05\\xa7\\x03\\xc0\\xd3\\x14\\x15YJ\\x07\\xfe\\xbf\\xb4\\xa3\\xda1`\\x14\\xc2?\\xd7[\\xa6\\x8f\\xb2\\xca\\xbd?lM\\x7f\\xf2\\xa6\\x19\\xe5?McA\\xa8\\xe0\\xeb\\xe4?\\xd9\\xf1J\\xe4\\x11\\\\\\xdf?P\\x82\\xe7\\x8d\\x8b\\x7f\\xd3?=\\x8aR\\xf5\\xd5\\xe3\\xee\\xbf\\xb9\\x03$\\xb9\\xc41\\x00@*\\xcf\\xc0o\\xbd\\x96\\xfa\\xbf\\xbc\\xa8G\\xd6\\xd7\\xb7\\x01\\xc0\\x18\\xe8\\xe3F\\x14\\xc9\\xd9?\\xcfN\\x97k\\xf5\\x7f\\x00\\xc0G\\x1c\\xfc\\xc7(\\xa4\\xb0\\xbf\\x06\\x1a\\x06\\x85C\\xf1\\x04\\xc0\\xac6\\xc2\\x9d\\x8bG\\xff\\xbf\\x1dL\\x10\\xb6H_\\xd7\\xbf\\x84f\\xf1P\\xe6\\xfc\\xc6?\\xdfu~\\x98\\x14\\x11\\xd0?\\xed\\xbe\\xefPV1\\xcd?\\xf7\\xffa\\x17\\xa36\\xf8?\\xcc\\xc8\\xa2\\xe4\\x11\\xdb\\xe2?\\xac\\x0b\\x1b\\xe8S\\x8e\\xa4?\\x82 /\\xd8\\x10X\\xc2\\xbf\\x11Z\\xab\\xb4^\\x10\\xfe\\xbf\\x93\\xce\\x18\\xce\\x91r\\x03\\xc0\\xc8D|\\x85\\x93\\xe1\\xec?:\\xaex=\\xa1<\\x00\\xc0\\xce\\x07\\x94\\x16DS\\xf9?\\x95\\x92\\xe6\\x07\\x92p\\x01@f\\xf2\\x97\\x8a\\xe8!\\xee?`\\xec\\\\\\x8d\\x0c9\\xef\\xbf\\xb5\\x02\\xe9c,D\\xd1?\\x02\\xf4h\\x82,\\xe4\\xd4?\\x02\\x05~\\xa5)\\x14\\xf4\\xbf\\x10<\\xb1\\x8c\\t\\xef\\x00\\xc04k\\x9d7vt\\xe5?\\x98%\\x01\\t9\\xd8\\xfb?\\x0fL\\xe7\\xfb\"\\x9e\\xf2?\\x96\\xc0\\xe4\\xad=\\xcd\\xf8?D\\xed\\x86\\xab\\xff\\xa5\\xe5\\xbfJ\\xcb1U\\xd7\\x9a\\x05\\xc0\\xf4\\x81\\xd9_^n\\x08@F\\x86\\x1b\\xe2\\xc5\\xed\\xe9\\xbf\\xbc`\\xbd\\x95\\x94\\x18\\xf0?\\xcb\\xd0\\xbb\\x81\\x05\\x87\\xf2?\\x0b\\xb4~\\xb1\\xc1\\x0f\\xf8?Y#\\xe0\\xd4n\\xdf\\xc2?\\x01\\xc5Z\\xb1M\\x08\\x04@\\x01\\xe2P\\x14-\\xd0\\xeb?\\x1fH$>,\\xa0\\xd5\\xbfSyM-8\\xa4\\xf9\\xbf\\xa4x\\xd8\\xcf\\xc8;\\xcc?\\xb5\\xb51]Kn\\xe1\\xbfi\\x8e\\x8dI\\xae\\r\\xf4\\xbf|\\xeb\\xb8Ny%\\xfd\\xbf\\xc2\\x14\\x92\\xd0|\\x12\\xfb?5|\\xbf\\x95X\\xb5\\xec?\\x07\\xb8i\\xc6\\x94\\xb4\\xf0\\xbfBI\\xcc\\xfc\\x85?\\xe5?\\xb2\\x9bXs\\xbd\\xe8\\xb0?\\x90i\\xc3qn\\xfc\\xe0\\xbf\\xb3\\x95\\x03\\xde\\x1c\\x0b\\xc4?\\xeb\\xeb\\x9d?\\xda\\xb3\\xd8\\xbfM\\x18\\xb9M\\xfc\\xfa\\xf8\\xbf\\xb8\\xa5\\xe9\\xc9\\x86\\xd2\\xd0\\xbf:\\xa3\\x129\\xf5\\x8f\\xf8\\xbf\\x03\\x80W\\xba\\x83\\n\\xf8?\\x06\\x99\\xca1\\xa8\\x9a\\xd2\\xbf\\xfa\\xbf\\xdf\\x1d.\\x10\\xf1\\xbf\\n!A\\x1a\\x01\\xa1\\xdd\\xbf\\x89G\\xe4\\xf6\\x0c3\\xe9\\xbfb\\x03\\x94\\x15\\x08\\x93\\xfa?\\xbd\\xd6O\\x18\\xe3\\xec\\xd4\\xbf\\xd0{k\\x10\\xc1\\xb6\\xe1\\xbfQ\\xd1\\xd1\\xd5\\x9a\\xb5\\x06@E\\xe0\\x8aF\\xd7E\\x07\\xc0\\xa7\\x8d\\xb7.\\xb2\\xd3\\xf6\\xbf\\x1fKTy\\xd9\\x99\\xfd\\xbfD\\xf0N\\x12\\xbfA\\xf4\\xbfv\\xff\\x13 c\\x0c\\xfe\\xbf\\xa1r\\x0b\\x8e\\xa7T\\xe0?\\x87\\xc6]\\x12\\x93A\\x07\\xc0\\xebS\\x08\\x97O\\xe7\\xf1\\xbf9\\x8bD\\xea\\xd9\\xe4\\xe2\\xbfv0t\\xa0J\\xcb\\xe6?\\r\\xa5\"k\\'\\xe6\\xf0\\xbf\\x07\\x8d\\x99\\xc5C\\xa8\\xc9?1\\xec~\\xb6\\x7f\\x9d\\xac\\xbfp\\xde\\xe2\\xc5\\xce0\\xd6?\\x02Y\\xd3#yQ\\x88?\\x05\\xb9\\xde\\xb8e\\x8b\\xe5?))\\x81i\\xce\\xc4\\x05\\xc0:\\xd0\\xadx\\xe9\\x1b\\xd9\\xbf\\xeb\\xf3e\\x05\\x7f\\xc1\\xe7\\xbf\\xd5i\\x00\\xa0\\x1b\\xfc\\xda\\xbf\\x17\\x070t;0\\xc1?9U/\\x18\\x1c\\xe4\\xe8?XlF@\\xf5\\x1bD?\\xf8\\x96\\xddM\\xdb\\x98\\xdd?\\xad\\xb5\\xa4\\rp\\xab\\xf7\\xbf\\xd5=\\x9d\\x9aVX\\xf2\\xbfo\\xcb\\xfaG\\xe8\\'\\xec\\xbf\\x96\\xb8\\x84\\x8fo:\\xf4\\xbf\\xe0\\xba\\xae\\x07c\\xb1\\xfa\\xbfxG\\xcb\\xb4Q_\\xd5\\xbf\\xd2\\x94c\\xa0\\xc3\\xa2\\x05\\xc0\\xab\\xa3j\\tN\\x17\\xf0\\xbf,\\xf2z\\xaf9\\x8d\\x01\\xc0D\\xe4Ss\\xdf\\xe2\\xfe\\xbf\\xda\\xaf\\xebM\\x1b\\x86\\xe7\\xbf\\x99\\xbd\\xaf\\xca\\xf32\\xde?\\xd8 \\xe3VPg\\xf5\\xbf\\xb8\\\\\\xdd\\x8b\\xf7_\\xec\\xbf\\x19\\xe0NF\\xe6\\x9c\\xe1\\xbf\\xd8m\\x0b(\\xa1\\xb1\\xe1?\\xa4#T2l\\xf0\\xf2\\xbf\\x1a\\x91\\xe3\\x8e\\xed5\\xbf\\xbf\\xb3\\x85\\xa6\\xec\\xec\\x9d\\xc9?u\\xa7?l^Y\\xe2\\xbfQ\\x945\\x16(H\\xec\\xbfT\\xc9\\x0er\\x97\"\\x01\\xc0\\xfa\\xa3\\xe9\\xb1\\xf1\\x88\\xf9?\\x06sd\\x19\\xae\\xc8\\xe0?\\x93\\xa8\\xe6b}<\\xd0\\xbf\\x8eF$XX\\xb5\\xf8?\\xb8\\xdf\\xdf\\xe1\\xb5[\\xf9\\xbf\\xa7\\x0f\\xe3\\x8e\\x87\\xa0\\x00\\xc0\\xa3\\x9f\\x10\\xc1ax\\xb8\\xbf\\\\\\x13\\xb4{\\xcfc\\x04\\xc0\\xa0c{f\\xce\\xce\\xd3?\\x1fz\\xa7\\x14\\xbeY\\xf7\\xbfa\\xe8m\\xef4c\\xc0\\xbfo\\xbe\\x9f\\x83,\\x8d\\xba\\xbf\\xec\\xe5\\x87\\xdbt\\xd0\\xe2?\\x8d$L\\x98\\xe5B\\xe7\\xbf\\x04C\\t\\x8e\\xec\\x1d\\xd2\\xbf\\xb4&?3\\xdd\\xd8\\xe9\\xbf]\\xeb\\x89\\x90O+\\xf0\\xbf\\x92E\\x98I\\x15\\xa6\\xe7?\\xc3FB\\xc5\\xce\\xef\\xf0\\xbfV\\xbeT\\xb17\\xb7\\xe5\\xbf\\x91\\xccF\\xf8\\x1a!\\xc7?\\xae\\xc6TKDG\\xe0\\xbfZ\\x00\\xe8xF\\xc3\\xe2?\\xe7\\xa1m\\x01\\x82\\xfe\\xdc\\xbf\\x9b\\xbcOn\\xc0\"\\xe3?7\\xceA\\xd8\\x815\\xd0\\xbfpt\\x99\\xdcG\\xd3\\x01\\xc0|yZ\\xa1\\xf0\\x84\\xe9\\xbf6%\\xcdg\\xb9\\x9a\\xa4\\xbf\\x19\\xb9\\x0bd\\x92}\\xec\\xbf!\\xf1\\x98:\\xb0\\xa0\\xf3\\xbf\\x93e\\xbc[\\xab!\\xf9\\xbf\\xc2#\\x0e6\\x98S\\xaf?\\x92\\xb7\\x90\\x07\\xe3\\x12\\x07\\xc04x\\xe8\\xb2o\\xe9\\xdd\\xbff\\x84\\xcf\\x1a\\x1dn\\xee\\xbf\\xdab*\\xb4\\xdac\\xf1\\xbf\\x80\\x92\\xbb\\xf3?\\xc9\\xe7?\\x1d\\xf5\\x99\\x00P?\\xdc?2\\\\\\xc8\\xad\\x1b\\x86\\xed?\\xd1\\x9a\\x02\\x14\\x195\\xc5?\\x16>C\\xb7F\\x0f\\xe9\\xbf\\xa3\\xdb\\t\\x15\\x87\\x04\\xd6\\xbf[\\xe7\\xd4\\xae\\xfa\\xdc\\x00@\\x13\\xd1\\xd4\\xf2\\xcc\\x95\\x05@\"\\x12\\xc6\\xebC\\xda\\xe6\\xbf\\xf7}\\xb3\\xe3\\x15\\x99\\xd2?\\x1d<\\xdf]\\x919\\xe2\\xbf\\x10\\xfeU]\\x9c\\xc3\\xf1\\xbf\\xfb\\x85\\xc6q\\x883\\xe9\\xbf8\\xb2\\xfb\\xad6>\\xea\\xbft\\xa5\\xa7j\\xa6<\\x94\\xbf\\xdb~\\x979B\\xe9\\xed?\\xacg\\x83\\x91\\x043\\xa7?bN\\x06\\xf9n\\xc1\\xe6?\\xbbu\\x15\\x93\\x92\\x1c\\x00\\xc0\\xf3\\xf0s\\x94\\xc4P\\x81\\xbf\\xda\\xcam\\xa9K\\xc5\\xc1\\xbf\\xec\\x9a\\xcb\\xc6\\xd7E\\xe0\\xbf\\xa3\\'p\\x0eDA\\xe0?\\x95\\xe3\\t\\x1f\\n\\\\\\xce?\\xfes\\xfb\\xe6\\x99a\\xf4?2^ZFw\\x0c\\xf0?\\xd2\\x17\\xce\\xe0\\x9fsu?\\x8b\\x0e:\\xd5=\\x04\\xc1?u\\xf8\\xd7\\xeb\\x7f\\xdc\\xd5\\xbfM(\\x9f\\x82\\x1f\\x1d\\x04\\xc0\\xef\\xb3[6\\xf5H\\xb5\\xbfK\\xb8\\x95k\\x12\\'\\xf8?\\x10|;\\x1d\\tM\\x11@5.\\xe3U\\xc7\\xb1\\xe0\\xbfy\\x87\\x91]\\x0e\\xb8\\xf7?\\x7f/\\x97\\t=\\x97\\x0b@v\\x95E\\xa9\\x08O\\xc7?\\xf4\\xc7N&\\xfa~\\xe8?E\\x8e\\xfb\\x17\\xab\\xdb\\xe3\\xbf)\\x9a\\x967\\x84\\xe3\\xeb\\xbf\\x81\\xc2#p\\x0b\\x89\\xdb?\\x84\\xado\\xa9&\\xd7\\xf1\\xbf\\xb5l\\xb7s\\xca\\x8d\\xf6?\\xe5dV\\xa1]\\xb8\\xc6\\xbf^\\x96N\\xdd\\xb8\\xb6\\xd2?\\x01\\xfe<\\x8e\\r\\xec\\xe0\\xbf\\xcacd\\xfd\\xdd\\x0e\\xf5\\xbf\\xd4?,\\x98\\x13K\\x04\\xc0p\\xa5\\xb1\\x8e\\x90\\xb2\\xf5\\xbf~\\x90f\\xcc\\x05\\xaa\\xf0\\xbf\\xed\\nz\\xcc}\\xf8\\xe0\\xbf=nu\\xfb&x\\x00\\xc0Se\\xcao\\xa7\\xd0\\xc4?\\ts`\\x00\\xf1\\xc3\\xf2\\xbf\\xb2\\x95\\xdd\\x86\\x01\\x97\\xc2\\xbf\\xb0\\xd1@*\\x0fp\\xc7\\xbf\\x85\\xf9\\xd7\\\\\\xb2\\xa4\\xf3?j\\xcc\\t\\xed=\\xb2\\xf4\\xbf\\x88.\\x8a\\x97\\xbc\\xec\\xae\\xbf\\x89\\xbd\\xda\\xe3\\x8f\\xbd\\xbd?\\xdcy\"\\x0f\\x10\\x0b\\xf8\\xbf\\xa7j\\x94E\\xf4\\xc6\\xee?\\x15*\\xf3\\xc7\\x9d\\x9b\\xff?\\xa3\\xaa1\\xde\\xf3!\\x00@\\xd8V\\xea\\xe6\\x0c\\x9f\\xe4?P\\x0bdA\\xe7\\x1e\\x00@f\\xb2e\\x84k\\xd6\\xea\\xbf\\xc12\\xaf\\xd8,\\xdc\\xe6\\xbf\\x9dz\\x13\\xb7.\\xa1\\xf2?\\xac\\x1b\\x01\\x8d\\xf1E\\xdc\\xbfNPG@`*\\xb0\\xbf{\\xf9.\\xc8ho\\xf0\\xbf%\\xca\\xb2z\\xf0\\xa6\\xf4?\\x16\\xeb\\x9f# (\\xd9\\xbf\\xfb[\\xff\\xf0\\x9e\\xdf\\xfd\\xbf\\xe0\\r\\xc0\\xd0w\\x07\\x01\\xc0\\xdar\\x1cV\\xc5T\\x00\\xc0GQ\\x93\\xf9\\xf1\\x1c\\xf9\\xbf\\xa8\\xe5V D\\xc6\\xb8?\\xb0\\xf8\\xac\\x8a\\x9b\\'\\xf3?;A\\xfe\\x94m\\x1c\\xf7\\xbfM\\x14YC\\xc4\\x0b\\xf4\\xbf\\x0c\\xa6$\\xdc\\xb6\\xd6\\xb6?\\xb6N:R\\x172\\xea\\xbf\\xe5X\\xe2W\\xcc\\'\\xf5\\xbf\\x1b\\xdf\\xc2\\x16\\xc4J\\xc4?&\\x19D+0\\xef\\xe8\\xbf\\xd9\\xeci(\"\\xf2\\xe4\\xbf\\x0e\\xa0\\xe3*\\x96\\xec\\xff?7\\x19\\xd6\\xc9R]\\x0e@\\xeb\\xa7\\xbbx\\xfdp\\xfd?\\x8d9\\x15O\\xd07\\xf6?\\t\\x97x\\xa9y\\x82\\xf0?\\xfbM\\x083\\x8e\\x1f\\xf1?\\xb9\\xc2\\x96\\xfaG\\xbe\\xee\\xbf\\x8b\\x0e\\x82TD\\xda\\xea\\xbfa\\x12\\t\\x99<f\\xd0\\xbfw\\x87\\xbc\\xdaP>\\xc1\\xbf\\x16\\x9d>u\\xef\\xe5\\xcb?\\x94\\xa0\\t\\xc6\\xcf!\\xc9?\\xc0_\\xd82\\xa8R\\xf2?\\x10\\x9a\\x14\\x90\\x16\\x82\\xf7?\\xab\\x04\\x08\\xcd\\xbd\\xef\\x03\\xc0\\xdf\\x96e\\xd7\\x8e\\x01\\xc8?Bo\\xb9\\t\\x85\\x19\\xd9\\xbf\\x15\\xdc\\xdf.\\xb7\\xf3\\xc1\\xbf\\x9a\\x9c\\xfc\\xe9\\xe1Y\\xf3\\xbf\\x0f1\\x1c\\xf6S\\xaf\\xf1\\xbf\\xbf\\xed\\xa1\\x9e\\xb0\\xce\\xe7?\\x83@\\x06\\xc6\\x0fv\\x08\\xc0wH9\\xf3\\xa1\\x05\\xf1\\xbf\\xc1\\x05\\xdc\\t\\xf1|\\x00\\xc0\\xb4\\x14Hy\\xa8\\xd5\\xcb?\\xad_\\n>s\\xf4\\xf5\\xbf\\xdc\\xe6\\xc6\\xa7vz\\x01@l\\xcb>\\xf6\\x94\\xfa\\xd0?|\\x8d*\\x8c\\xc2\\x8e\\xe6\\xbf\\x19\\xc5\\xd7?\\xbe.\\xe2\\xbf|2s\\'0\\x1c\\xc3\\xbf\\x94\\n|W\\x8b-\\xff\\xbf\\x1aD_t\\x7f\\xcf\\xee?\\x1e\\xbf\\x9c\\x9dr\\xc0\\xf3?\\xf3EW\\xb9j.\\xf2\\xbfL\\xd2\\xb9Z=\\xdf\\xcc\\xbfX\\xf6\\xee\\xabqH\\xf2?M\\xb5G\\xe4\\xe1\\xe7\\xfb\\xbf\\x83*\\r\\xdc\\\\.\\xc4\\xbf\\xa65\\xa9h\\xbf\\x86\\xf5\\xbf\\x04(\\xc8x\\xb3\\xdb\\xf6?\\xb4\\'*\\xcc\\x12\\xa4\\xe8\\xbf\\x95T\\xbdl\\xdeE\\xe1\\xbf/\\xb06\\x0f\\x00\\xe6\\xe3?J&\\r\\x85\\x97\\xd6\\xfb\\xbf>\\r\\xcb\\xacQ\\x04\\xdd?\\xbfW0N\\xaf\\xc8\\xe2\\xbfS\\xf2\\xf1\\xa8\\x85\\x1a\\x04@_\\xee\\x1d\\x12w\\xf1\\xe7?\\xdc\\xa9:\\x10\\x99\\xd1\\xe7\\xbfp\\xb4\\x92\\xafn\\xeaY\\xbf\\x00\\xa0\\xbf\\xddZQ\\xe7?\\xfe\\xde\\xfe\\xc0I\\x96\\xbf\\xbf\"\\xae\\x0c\\xef\\xd4B\\xef?l7H\\xf8\\x126\\xd4\\xbf\\x12\\xaa\\xfa\\xafh\\x07\\xd9\\xbf\\xc4\\xben\\xed\\x1a-\\xf6?\\t#\\xc6\\xc9Fn\\xab?\\xed!\\xf0^\\xc4\\x18\\xe1\\xbf \\xe3]\\xe2\\x8bL\\xe4\\xbf\\xfa\\x18\\x1d\\xf8\\xd8\\xf3\\xec?\\x0f\\xb4\\xed\\xb1\\x88h\\xd6?u\\xa9\\x91\\x19\\x86\\x9e\\xda\\xbf\\xc5)&\\xd2<\\xe4\\xed?,B~\\xc0\\x05\\r\\xeb?*\\x8bI\\xde\\xdfc\\xe1\\xbf\\x88\\xdc(\\x80ES\\xfe?/\\x13R\\xc6\\xdf\\xfa\\xec\\xbf\\x8d\\x01\\x9e\\xcb\\xf8\\xa4\\xb4?-\\x95\\x83\\xb7e\\xc6\\xd5?\\x84;\\xebk\\x89N\\xcd\\xbf\\xb1yG\\x9bTE\\x87\\xbf\\xe5\\xf8<\\xf3\\xfas\\xff?\\xf7D\\x96\\x8b\\xf2\\xbc\\xbf\\xbf\\xe6\\x9f\\x8b\\xe82\\xde\\xe5\\xbf\\x98Mo}\\x8aZ\\xd1\\xbf\\xd4\\xee\\xc3\\xbb:s\\xc6\\xbf}\\xf0\\x11\\xea\\xf4\\xd6\\xec\\xbf#\\xc5\\xf0\\x8e \\x97\\xd9?\\x04\\xfd\\x19>\\xa0K\\xc2\\xbfph\\xc0\\xbd\\xae\\xdc\\xeb?\\xe4o\\x9d\\x89\\xeb\\xab\\xf2\\xbflac\\xe6\\x06\\x84\\xc0\\xbf\\x1c\\xb8T\\x89\\xfd\\xed\\xfa\\xbfg\\xc6|N\\xa9\\t\\xd3?\\xba\\x90\\x08\\x1f\\x9aF\\xc1\\xbf\\xfaFX\\x91d\\xfe\\xe6\\xbf\\x8b\\xbf\\x89\\xeeH\\r\\xc4?\\x1c\\r\\xa2\\x17\\x88l\\xed\\xbfR\\x9dJ\\xfc\\xf9 \\xe7?\\x94\\x83\\xb2\\xb3\\xaf\\x90\\xd6\\xbf\\x8a,\\xad\\x8d\\x10\\xcb\\xf0\\xbfw\\x16\\xc3\\x15\\x1d\\xdd\\xef?,\\xedA]\\xd3\\xd5\\xf4?+?\\x1c[\\xf1\\xcd\\xf1\\xbf\\x87H\\x14\\x0b\\x11=\\xf4\\xbf\\x86$\\xc4\\x84\\xac\\xb9\\xc8?s6\\xa5u\\xfe\\xb8\\xf2\\xbf_3v\\xc8Tp\\xc0\\xbfU\\x85\\xe4Yz%\\xdf\\xbf\\xcep\\x8aQf(\\xe3?\\xd2\\x92\\xf4mQ\\xd7\\xf2\\xbf-!/\\xf8<\\xde\\xd8?x%\\x01\\x19\\xc0~\\xed?\\x1c\\xcf\\x84X\\xd4\\x8e\\xf3\\xbf}n\\x0eq\\xe9\\xc4\\xe3?\\'9\\x80,\\x10*\\xc7\\xbf\\xdd\\x8ay\\xca\\xf1\\xed\\xdb\\xbf\\xb6\\xfc\\x84\\x197S\\xe4?\\xa2\\xe2\\xff\\x96z]\\xe1?N\\xba\\xe0\\xf7\\xa4\\xa4\\xd2?O\\x87\\x03\\xb8\\xfdF\\xdd\\xbf\\xbd\\xf6_\\xd2!\\xe0\\xf0\\xbf\\x8e\\xbb\\x8b\\x01\\xe2\\x12\\xf1\\xbfs\\x03\\x10+\\xfb1\\xc1\\xbf\\nD\\xc5\\xf5\\x11c\\xb7?y\\x85\\xd4/:;\\xdb\\xbf\\x1fYB\\x10\\xc7\\xec\\xd9?\\x8b\\xec\\x84Jl\\x13\\xcb?\\xbb\\xe3U\\x1e/\\x94\\xf2\\xbf\\xeb\\xf8\\xf12!\\xd6\\xf0\\xbfT\\xdc\\x1c\\xa3\\xeb\\x15\\xc1\\xbf\\xbb\\x94\\xc99\\xa4\\x04\\xce\\xbf\\x06\\x98\\x12\\xd2\\x08\\x90\\xd4\\xbf\\x06\\xd3O\\x9d\\xda9\\xe8?H/Y\\xd2\\xde\\xeb\\xd4\\xbf\\xe1\\x83#\\xd1\\xf0\\x93\\xcf?\\xf5\\xe6\\xdfU\\xaf\\xe2\\xe6\\xbf~\\xbfK\\x9ch8\\xd2\\xbfz\\xc6)\\xfa\\x96\\xe2\\xd1\\xbfmu\\xb8\\x8e\\x86p\\xec\\xbfE\\xd2X\\xe1\\'\\x9e\\xd8?\\x8e\\xb6\\xda\\x9c,\\xe1\\x9d\\xbf.\\xbc\\x81?m\\x90\\xf9\\xbf\\xfe\\x90\\xa2\\x9eH\\xa4\\xe3?L\\xb6hJ\\x05\\x8a\\xe7\\xbf\\x95\\xa0\\xa1\\xe9&\\x8d\\xf7\\xbfy\\xd9\\n\\x07\\xeba\\xf4\\xbf\\x83\\x85\\x91\\xc6\\x08\\xaf\\xb5\\xbf>\\xd8\\x96\\x86\\xf8\\xd2\\xe9\\xbf\\x93y\\x10\\xcc{9\\xf2\\xbf\\xe5\\x07E%\\xc1\\xcd\\xec?S\\x7f\\x04\\x8e\\xd4\\x1b\\xd4\\xbf\\xeb?\\x94\\xa4\\xffe\\xea?b5\\xde \\xab&\\xe6\\xbf\\x18J\\x90\\'\\xb6\\x87\\xc9?\\x99\\x0c\\xc7my*\\xf4\\xbf\\xc0,\\x7f\\xabt\\x0f\\xcc\\xbfQ\\x1dj\\x04\\x97\\x9f\\xd8?\\xb6\\xa6)\\xfc\\xf5\\xe5\\xe5?\\xc8\\xd10u%\\x9a\\xc8\\xbf\\xe7g\\xce\\xaevI\\xd1\\xbf3\\x9b\\xef\\x11l\\x16\\x97\\xbf\\xd3\\xf9aT\\xa0\\x83\\xe7?\\x99(\\x90v\\x01e\\xb6\\xbf\\xd3S\\xa2\\xcf\\\\O\\xd1?\"\\xe1\\x84\\x13\\x83l\\xf6\\xbf\\x14\\xa8\\x11\\xe8\\x83\\x0f\\x00\\xc0\\xa1$y%\\xc7$\\xd3\\xbf\\x0fZE\\x91s\\xcb\\xe7\\xbfL\\x1c\\x18k2~\\x0e\\xc0O\\xa2>h\\xc9\\x14\\x0c\\xc0\\x12\\xf0\\x99\\xc2\\xf5\\xe9\\xcc\\xbf\\xaa\\xb41\\xd5\\x05I\\xf6\\xbf\\xfe\\x1b\\xa4J\\xd0\\xc8\\x04\\xc0i:D{\\xc72\\xf1\\xbf\\rMa\\x8eta\\xe4\\xbf\\x96\\xa3v\\x84U\\xd3\\xea?\\x84=\\xc3\\xe7\\xd3\\x1c\\xe5?)\\xad\\x02\\n\\xc0\\x02\\xf0\\xbf\\x9e\\xe7\\x0f\\xf9~c\\xf1\\xbf\\x08\\xc8\\xfa\\x8c\\xb7;\\xfe\\xbf\\x8af6yQ\\xcf\\xf8\\xbf$\\xb8\\xb5K\\r@\\xc2?f\\xcb\\x87\\x92eO\\xdd\\xbf\\x91_\\xca\\xb2\\xae[\\xe2?\\x83\\x8a\\xf8a8\\xb2\\xcb?\\x84\\x8a\\x11\\xa6w\\xb0\\xec?\\xed\\x08\\x08\\x17r\\xa6\\xcf\\xbfT\\xe8\\x92C\\xf1\\r\\xe6?\\xaf\\xfa\\x0e\\xe1\\xe5$\\xf9?\\x8bKS\\xae8\\x8c\\xe3\\xbfeL\\x84\\xe0\\xa6$\\xe4?@=V\\xe4\\xe2h`?\\xda\\xeb\\xae\\x0b\\xf6D\\xe8\\xbf\\x89-\\xe7%\\xc08\\xcb?&Y4E~\\x9f\\xf1\\xbfP-\\xcb0\\x96\\xb6\\xd8\\xbfso:W\\xadM\\xc4?e\\xfd\\xe9\\xbb/\\xa4\\xec\\xbf\\xaa^\\x8f9\\xb9\\x80\\xff?l\\xcf8#\\x06-\\x05@\\xafA\\xc6\\xacL\\xd6\\xf7?\\xf5\\xd8\\xfa\\x95\\xf8^\\xd9?\\xb3?\\xba\\',\\xf8\\xfc?;\\x94\\xde<\\x8b\\x12\\xb5?\\xb9\\xc7\\xfa\\xb1\\x13@\\x00\\xc0\\xa9\\xbbC\\xee\\xdc\\xcb\\x00\\xc0o=v7\\xe3\\x98\\xf6\\xbf\\x1fW\\xb7q\\xd5\\xb3\\x03\\xc0\\x0b\\xa7GI\\x95\\x97\\xee\\xbf\\xc5\\x9a\\x17\\xa6\\x02\\x85\\xec\\xbf\\xa44j\\x9b\\x90\\x10\\xdb\\xbf\\xa1\\xbc\\xfb\\xb7A<\\xf4?}\\xb0\\xeef.\\xa9\\xc0?\\x94)\\xfc\\x86\\xb7\\x91\\xf2\\xbf\\x163g\\xea\\x9f\\x1d\\xe2\\xbf\\xba\\xd2\\x10\\xa0\\xcfo\\xd5?\\x7f\\xf8\\xec]Ad\\xd4\\xbf\\xa4\\xcf\\xcdpf\\xeb\\xbf\\xbf\\x08\\xaa\\'\\x93\\x97\\x88\\xa2\\xbfJiD\\xa8\\x96\\x19\\xfd?x\\xb0\\x81.am\\xd6\\xbf\\xdc)\\xe3\\x0eM\\xc7\\xd1?\\xacb\\xddR\\x98\\xe6\\x00@\\xa5\\x9d\\xc0\\xf4\\x98\\xd9\\x05@T\\xbd\\xc3\\x9f D\\x01@\\x8e`u\\xdbH\\xfb\\xf8?\\xe79\\xa2\\xef\\x90O\\xff?T*\\x9c\\xf8\\xa9\\xd0\\xe3?\\xd1_\\xa7bJ\\xef\\n@\\x04\\x97\\xee]\\x14\\x9b\\xfb?\\x16K%\\xcfV1\\xdf\\xbf\\x0b\\xaa\\x19\\x17\\x17\\x00\\xd8\\xbf\\x02\\xf8d$\\xbb.\\xfa?\\x82\\x12[\\x96p\\x04\\xe6?\\xfbh\\xc3\\xaf\\x88\\'\\xcf\\xbf\\x95\\xd2Wsj\\x80\\x06\\xc0O\\xe4x?\\xbb\\xe7\\x05\\xc0X%2\\x8eYY\\t\\xc0\\xb1\\xb2\\x7fU\\x90G\\x02\\xc0\\x13C\\x16\\xd41\\xb1\\xfb?\\xca\\xe9(\\x1cx|\\xeb?_\\xea\\xd4}\\x9d\\x0c\\x88?\\xde\\xb8\\xeci\\xc5\\xfb\\xc4?m\\x17O\\xd6\\xc5V\\xea?q\\xa3\\x7fN~7\\xc6\\xbfq\\xdc__\\xe2\\x9b\\xc1\\xbf\\xbbo\\xbf\\xd3\\x92g\\x03@\\xc6M\\xf9\\xcb\\x15k\\x12@\\xda&;jw\\x0b\\x0c@\\xbc\\xe2{<\\x86\\x0e\\x04@\\rX\\xec\\xe6\\x14i\\x9e?\\x86}\\x18\\rb\\x1e\\xf2?{\\xdb\\x0ej\\xfbn\\x03@\\xbd4\\x13G~\\\\\\xf7?\\xa4j\\xc6\\x88\\xd7P\\xdc?\\xd8\\x04\\xcdx\\xb3n\\xf0?\\x9bz\\x86P\\xb2\\x17\\xe9?n\\xad\\xee\\xdfh\\xa0\\xf4?L\\xfc\\x87\\x95\\x08!\\xfa?B!n\\x83\\x8cY\\xf1\\xbf\\x9f!A\\x92\\x8d=\\xed?\\xa1B\\x81\\x8c?\\x15\\xca\\xbf\\xa3\\xf6f\\t\\xcc\\xad\\xd8\\xbf\\x1d\\x1d\\x97\\xee\\xa05\\xaf\\xbf\\x8e<q\\t\\xa4Q\\xe3\\xbf\\xe1YJ.\\xc8\\xb1\\xff\\xbf\\xd3\\xf6\\xdf\\xddQ%\\xb1?\\xfd\\xd9rM\\xf0\\xad\\x85\\xbf\\xdb\\xb6\\x90\\xba\\x84\\x9d\\xd4?\\xaf\\xa3\\xb5\\xb7l\\x00\\xf9?k\\xc6\\xb3\\xef\\xc7\\xbd\\xdf\\xbf\\xb6\\xf6\\xd2\\\\\\xa7\\xac\\xdb\\xbf{v\\xa6H\"\\xc8\\xde?Mi\\x9f\\xff\\x13\\x85\\xf9?\\x15\\x1f\\xec\\x07\\x0f\\xa2\\x05@H\\xf4\\xc0R\\xb0\\xf7\\xb0\\xbf\\x8dBH_\\xf8\\x07\\x08@\\'I\\x94\\x84!\\x7f\\xf3?\\x859\\x82\\xce\\xaf4\\xf5?\\xf2\\xf8\\xba.\\xc0f\\xe3?B(\\x83\\xcbh\\x84\\xff?MP\\xdam5\\x90\\xf5?E\\x04]\\x94\\xe5E\\xb6?O.\\xfe>\\x893\\xe1?\\x07i\\xa5\\xb2:p\\x00@\\xb9z\\x9cw\\x9fw\\xfc?c\\x1cvrr\\x90\\xfc?Oz\\xebW\\xdaj\\xff\\xbf+?\\x9a\\x92\\xc9\\xe8\\x00@\\x83\\xe9\\xb7D\\x89\\xb2\\xf4\\xbf\\xa6\\x91\\x89\\x80\\xf7t\\xc1?Ox\\xd1\\x1ea\\x01\\xef?L\\xb2\\x1d\\x02\\xe31\\xe9\\xbf\\xb0\\x88\\x12\\xa7\\xdc\\xaf\\xf7\\xbfR\\xc39\\xa2+\\xae\\xf2\\xbf?]\\xb0\\xc7\\xc0\\xc0\\x02\\xc0\\xbe\\x91\\xb8K\\xc3w\\xb1\\xbf\\xb1\\xd6n\\xd7}\\x82\\xf6\\xbf\\xcb\\x18UC\\xdf\\x92\\xd7\\xbf:\\x08\\xfbM\\xaa\\xb4\\xd1?\\x18=t\\xe5\\xb0m\\xe2?\\x01%^\\xe7q\\xb1\\xf9?\\xf7\\x18j\\xe8\\xd67\\x06@O\\xbe.$Sf\\xf9?\\x02\\x1b\\xdf\\xa7\\x1c\\xd4\\xeb?!\\x8a@9|(\\xf0\\xbf\\x99\\x89\\xb1\\x14\\xd8#\\xe5\\xbf\\xb3\\x1e\\xb1\\x97\\xcc`\\xb4?\\xd0\\xdc\\x99\\xbe\\xed\\xb8\\xd0\\xbfj\\xab\\xb7S_*\\x0c@[\\x86r]0\\xf6\\x00@=\\xda]\\xf4\\xcd\\x97\\xe6?\\xee_\\xbd\\xe1E]\\xc9?\\xa8p\\x8b~\\xe1=\\xf7?N7\\x100\\\\v\\xb6?(\\xfb\\xa3`\\xe7*\\xf3\\xbf\\xe5|\\x10\\xeb\\x1e\\x08\\xe7?\\xd1\\xf7C\\xaa\\xd5q\\xe7?\\x1aq\\xb1H\\xb8C\\xe2\\xbf-\\xc27k\\xe9d\\xfb\\xbf\\x7f&\\xfc7\\x1cX\\xe5?\\x0e NO\\xf0\\xe5\\x10\\xc0\\xdd\\xdb\\xf4\\xee\\x90\\x9b\\x18\\xc0\\xce\\xe9\\xa6\\x8b\\xf4\\x07\\xfc\\xbf\\x8b\\xad\\xe5\\xc5\\xc2\\x8e\\xc2\\xbf\\xb6\\xeaa@\\xc4S\\xf2?\\x86yA\\x13(P\\xda\\xbf\\xf3\\xa9\\x97\\x84\\xc3\\x13\\xff?a\\x98\\xa7>\\xad\\x92\\xf3?\\xaf\\xcc\\x1ce\\xaf^\\xc7?]\\r\\x9c\\x83!~\\n@\\x10:c\\x08\\xeaW\\xf4?z\"\\xf74\\x8f\\xc6\\xe2?T\\xff\"\\xc4\\xadp\\xf0?\\xff\\xd7\\x8e\\xb0\\x1e\\x18\\xfa\\xbf\\xa6\\xc1,EE\\x9d\\xdc\\xbf\\xe2xn\\xa9\\xfdU\\x05\\xc0\\ng-\\x19\\xbd\\xc0\\xeb\\xbf\\x95\\x89y\\xc54\\x10\\x0b@\\x94\\x0f\\x90~,c\\x02@\\xd8\\xa30\\xae!9\\xf9?\\xfd\\xebf\\xbf\\xe0\\xea\\xf0?\\xc8>\\x16A,o\\xe5\\xbfC\\ts?\\x82d\\x02@\\x100\\xdf+\\x8a\\xdb\\xd4\\xbf\\xf7\\x9a\\xce\\xec\\x86H\\xf3?\\xbb\\x81\\xbd5U\\xb0\\xea?\\xf1&\\xc0C\\x8d\\x11\\x00@\\xca\\xdb\\xa3\\xfc\\x07\\xc3\\xe6?\\xdd\\xb9\\xceo:h\\x12\\xc0\\xc2*\\xea;\\xa2\\xca#\\xc0\\xb4\\xe7\\x1aq\\x9b\\xc7\\x04\\xc0!,\\xaa\\xe4\\xa9;\\xf2\\xbf\\xb6\\x0cW\\x92\\x1d\\xe3\\xc0\\xbf(\\xc9\\xd6\\x00]\\x01\\xdc?@r\\x93\\xb8\\xbfA\\xd0?,s\\x8f0\\x84\\x96\\xe3\\xbf\\xc5\\xdfD\\xf2\\x90\\xa4\\xff?\\x1a\\xc0\\xb2/q\\xb1\\x1d@\\r\\xdb\\xdax\\xcb\\xc9\\x0b@:\\xfb\\x92\\xa7A\\xae\\xb0?\\x83\\x94\\'V\\x93C\\xeb?U\\x95g|\\r7\\xcc?\\x92\\x15\\xe0\\x98\\x03\\xf7\\xe9\\xbfK\\xe7B\\x00\\x8b\\x12\\xdc\\xbf\\xd2\\xf9\\xca//Y\\x06\\xc0\\x9f\\xc3\\xfe\\x11\\xa9\\x13\\xb7\\xbf\\x0c\\xf0\\x9b\\x85\\xee\\xaf\\xe1?\\xde$O\\x08\\x03\\xe8\\x11@g\\xec\\xec-lU\\x11@8\\xb2\\xf0\\x8e\\xa8>\\xbf\\xbf\\xe6\\xd0\\x10<\\xa4\\x8f\\x02@\\xb9\\x92K\\x81\\xae\\xe7\\xf5?\\x91m^\\x8e\\x8c\\x9a\\xf3\\xbf\\xa0|\\xf6\\xee\\xdc|\\xe7?\\x07\\x02O\\x98d\\xbf\\x00\\xc0M\\xc1F\\xa3\\xd2\\x00\\x06@\\x1f\\x9a\\xc8\\x890\\xba\\x05\\xc0\\x13\\n ~\\x136\"\\xc0g\\xfd\\xbc\\x9b\\xa3\\xa5\\x07\\xc0\\xbd\\xbb9`\\xe4\\xe6\\xc2?\\xff\\x9a\\x0e\\x93\\x9ac\\xf3?\\xf6P)\\xf9O\\xd8\\x8c?\\x85\\x19xL\\x88\\x83\\xcc?\\x87>\\x94*\\xac\\x92\\xc9?\\x86\\xca\\xbc*2>\\xf7?X\\n\\xe7\\x18\\x95I\\x0c@AB\\x82\\x9fi\\xc4\\xf8\\xbfX\\x9e\\x80<u\\xec\\xe9?\\x02\\xb8\\xd0e\\x88\\xe0\\xed\\xbf$\\x07\\x19\\xf4\\xf6\\x07\\x06\\xc0\\xfcl\\xba\\xbe<\\x90\\x10\\xc0#C\\x01\\xff\\xbf\\xc9\\r\\xc0\\x95\\x8b\\x9a\\xdf[\\xaa\\x0e\\xc0;ZT?C\\x1b\\x13\\xc0\\xb7\\x87L\\x93B\\x1d\\xf5\\xbf\\x14\\xd6\\xef\\x94\\xb7\\x07\\r@\\xb5\\xf66\\xc3\\xeb#\\xf6?\\x97\\xc4#\\x05\\xb33\\xfd?\\xba\\x8e\\x14:^c\\x04@\\x07i\\xf0\\xf7.m\\xf0?^7\\xa2_u_\\xee?\\xf5Y\\x85\\xf2\\x1ck\\r@\\xe0\\xde\\xa8\\x7fy`\\xe8?N\\x01s\\x0e=\\x81\\xf2?\\xf7 \\xd2\\x1c\\xd4\\xdd\\x05\\xc0\\xf8Z\\x0f6S\\xb6\\x1e\\xc07q\\xb4\\xbb\\xc5\\x1f\\xf4\\xbf\\xbe\\x9e)\\x15K\\xc6\\xc3\\xbf\\xd5{\\xaa\\xa4oA\\xe5\\xbf\\xd6\\xfa\\x86\\x0cN\\xbd\\xea?@\\xb5)\\x90^\\xdb\\xd9?s\\x0f\\xd8F\\x96\\xaa\\xfa?v4\\x8f\\x01\\xfeO\\xf0?\\x8b\\xf6ju\\x0fZ\\xe2?\\xe28$V\\xe1\\xd5\\xec\\xbfj\\xdd\\x0b\\xf3<\\x85\\x06\\xc0nC-\\x1b\\xfeG\\x10\\xc0\\xb8\\xe1@G|\\xab\\x13\\xc0\\xb0\\x1e_\\x06d\\xd6\\x04\\xc0.\\xed9V=9\\xfd\\xbf\\xaaf\\x9e\\xf9!O\\x05\\xc0\\xd41Vr\\xaey\\r\\xc0\\xf9.\\x88\\xa66\\xfb\\x0c\\xc0\\xba\\x0b\\xedW\\x81{\\xdf\\xbf\\xc5#\\xa5\\xd0*l\\x15@\\xedF\\xfc\\xb3\\xb0T\\xef\\xbf\\xd4_\\xff\\x80\\xf8R\\xef?\\xad\\xd0\\xbevJ\\t\\x05@N\\x19\\xd4\\xa4\\xb7e\\xd5?\\x06\\xf8\\xcd\\xa2\\xbcv\\xd2?\\x8c\\xady\\xae\\xbbv\\xf2\\xbf\\xcc\\xd6\\x7fkN\\xce\\xef\\xbf\\x94 \\x161\\x9c\\xc1\\xee\\xbf\\xbe\\x96\\x109\\xd9w\\x01\\xc0\\xfbI\\xc3\\x9c\\xe4K\\xd6?\\xc2\\xf4\\x1dOQ\\xd0\\xe2\\xbf\\xce\\xd7\\x00\\x81\\xe4>\\xf4\\xbfx\\x18\\xb1\\xbe\\xef\\x10\\xe6?R\\x86\\xffW\\xf0\\xd8\\xe8\\xbf\\xde\\x83aT\\xb9\\xa2\\xe4\\xbfUl\\xa8\\xc8\\xd5\\xd9\\xe9?:\\x18n\\xf8\\xea\\xfd\\xf1?\\xb2\\xa1\\tP\\xf83\\xfb\\xbf4\\xaa/\\\\\\x92/\\x14\\xc05\\x86O\\x98M\\xec\\r\\xc0\\xf9\\x12\\xc6\\x1eYe\\xdd\\xbf\\x90K\\xfd\\xe7Y\\xed\\xe5\\xbf\\x94=\\xdf\\xe6\\x10\\xfe\\xe4\\xbf-i\\x0b\\xfe\\xe1\\xa4\\xec\\xbf\\xc8\\xb1\\xe38\\xad\\x1d\\x10\\xc05\\x8cZ30\\xd2\\x11\\xc0\\x18\\x19\\x95\\xc3\\xff\\xdd\\x06@\\xf1\\xac\\xa4/9S\\xe9?\\xbe0\\xdfA\\xbad\\x00@j\\x9e\\x1f\\x8f\\xcb\\xe5\\xd6\\xbf\\xbc7Y\\xe3\\xa8\\xe1\\xe8?\\x07\\xd4r<\\xaa\\xf3\\xc3?>W\\xf2Z\\x85\\xc3\\xd7\\xbf\"?\\x87\\x0c\\xea\\xc5\\xec\\xbf\\xf7\\x91\\xcc]\\xdc\\x0e\\x0c\\xc0W\\xd3\\xbdl\\x9a\\x97\\x0b\\xc0\\xdczo\\xe5\\xec\\xd1\\xf4\\xbf\\x16\\x96,\\xb7\\xb40\\xf6?\\x99|\\xb0\\xfdl\\x01\\xd5\\xbf\\x9e\\x0c(\\x1aQF\\xcb?\\xfb\\x93\\x15\\x07\\xb9G\\xb9?\\x10\\xcb!\\xc8\\xf6\\xe0\\xdc?\\xb5\\xd3\\xff0\\xc7v\\xe2\\xbfw\\x7fP\\xd4?K\\xf1?\\x15\\rQ\\xc1)\\xbf\\xe6?mS\\xed\\xf4\\'\\xa4\\x16\\xc0\\x9f\\xddLg\\x8b@\\x13\\xc0\\x7f#JR7\\x1a\\x0f\\xc0.\\x93}\\x9e6N\\xca\\xbf\\xc7:\\xba]\\xab\\\\\\xf7\\xbf\\xa6X\\xf2\\xee:\\x92\\xdf\\xbf\\xaddw\\xbd\\xfaa\\x04\\xc0\\xa3\\xa9k\\xb5B\\xe0\\x06\\xc0u\\xfd\\x85\\xfa\\x8d\\x17\\xe9\\xbfUD\\xf1d\\xc2=\\x02@\\xe1\\xc8I\\xb5\\xa0r\\xf2?\\x18Iuq\\x07\\x97\\xf4?\\xc3H\\x943c5\\xf8?\\x96\\x03H\\xf1\\xece\\xe7?\\xb9YD\\xb4\\x92\\xa4\\xd4?\\x05=\\xd3W\\x96\\x96\\xf2?ME\\x1a\\n8?\\xf2\\xbf\\xf6\\x91[6k\\x8b\\x0c\\xc0\\x13\\x0c\\xfc~U\\x04\\x0e\\xc0\\x88\\x04W\\xc4At\\xcc\\xbf\\xbc(c=\\x87\\x0c\\t@\\xf3\\t\\xba\\x80@\\xe5\\xf7?q\\x0e\\xee\\x8cw\\xb2\\xea?\\xc8\\xb5\\xd2Wc\\xf7\\xf0\\xbf\\xaaj\\xc2t\\xb9o\\xe3?\\xa1\\x94\\xde\\x82\\xdd\\xac\\xe6?\\xf51/\\xe7d-\\xfb?\\x1c\\xa6_\\x01=\\xb9\\xcd?\\x1b[|g\\xaa\\x82\\x11\\xc0[\\xf5\\x88\\xba\\xee\\xb1\\x13\\xc0\\xfb\\xc5\\xac{\\xb2x\\xe5\\xbf\\xa4\\xe3\\x17\\x02\\xc7\\xc5\\x08\\xc0\\xb8V\\xa0j\\x90\\xd8\\xf6\\xbfb\\xe8q\\xafA&\\x05\\xc0c%\\x8e\\xc1\\'\\x1a\\x08\\xc0hI\\n\\xca\\xbd\\xf3\\xd2?\\x0f-P\\x08\\xa9\\x17\\xe1\\xbf\\xcc\\xf9\\xc4E\\x8eE\\x03@\\x97\\x91\\xa1\\xbc\\x9f\\x04\\xf1\\xbf\\x9eH\\xee,\\xcfK\\xfb?\\xe1$}\\xda\\xf6\\xd9\\xe3\\xbfOu\\xba\\x94\\x13n\\x01@\\x8d\\xb9WFO.\\xdd?p\\xd5yY\\x95|\\xf8\\xbf-\\xcfm\\x85\\xc6\\xf6\\xf1?\\x84\\xfah\\x1a|9\\xff\\xbf\\xc8\\x97\\xae\\xa0N$\\t\\xc0\\x99\\xae\\x92\\x1aW\\xce\\xe7\\xbf\\xf3\\xc1\\x81\\xfc*\\xb3\\xff?\\x00\\x9b\\x81\\xf8\\xde\\xf1\\x06@\\xd3\\xc0Q\\x93\\xa0\\xb1\\xe0?~\\x07V\\xec|\\xb3\\xd0?P\\x9d\\xf3*,\\xdf\\xa9?\\x02\\xdf\\xb2_\\xf6\\x8b\\xe9?G\\xed\\x92\\x80e\\x19\\n@2\\xe5Ie\\xa3\\xca\\x04@\\xdd\\xe0\\xfd\\x9b\\x04\\x15\\xfe?\\xbez\\t\\xba\\xbe\\x93\\xe6\\xbf\\x07Q\\xd6\\xba\\xf1\\n\\x08\\xc0\\xed#u>\\x19\\x82\\xd2\\xbfo\\x9f!mmd\\xe9\\xbfqy\\xc0C\\xf4\\x8f\\xfc\\xbf\\x98\\xb2\\x1d\\x84>\\xf2\\xbb\\xbf\\xee\\xa3\\x04\\x07\\x0c\\xea\\xf8\\xbf\\xe7\\xae>\\x92u\\x0e\\x05@\\xe8\\xc4\\xd8\\x89-\\xd0\\xe1?\\xdb\\x0cz\\x8e\\x95\\x1a\\xf4?,\\x84j\\xef>\\xd0\\x11@5\\xe1\\x91\\xd1\\x95\\x10\\x80?%:\\xe8\\xc0\\xc1\\x13\\xc9\\xbf\\x80\\x1c\\xbd$\\xe3\\xd2\\xe4?\\xf1\\r\\x1ac6_\\xed\\xbf\\xe2\\x81\\xce\\x1c/)\\xf2\\xbf\\x12$vs\\x1c\\x80\\xde\\xbf\\x0fp\\x87\\xbf;+\\xff\\xbfd\\x16\\x8e\\xf8\\xce9\\xc7\\xbf\\x182in\\xc8\\xba\\x06@}\\x85\\x80\\x16TM\\x04@\\x94u+@\\xe5Z\\xf2?\\x96\\xfc\\xa0\\x98s\\xfc\\xfc\\xbf#\\x8a\\xb7\\xdb\\x01\\x05\\xe3?w\\xba\\xec:\\xbc(\\xe1?\\xa4\\xb5\\xb9\\xb0\\xcc\\x16\\xf5?LK\\x93\\xa6\\x95\\xa3\\x01@%\\x8bq\\xa7Nq\\t@\\xd1E\\x9by\\xa5\\x16\\x03@\\xf7`\\xd4\\x14\\x9b\\xea\\xe8\\xbf\\xd2\\xc2\\x080\\xddK\\t\\xc0x\\xf8^\\x83\\xf3i\\xf0?F\\xecr\\xc0\\xce\\xa4\\xe4?\\x0f\\xcd1\\x80\\xbcv\\x02\\xc0z\\x92\\xad\\x0b\\x12\\xab\\xc1?&\\x99\\x16\\xf6\\xe7\\xdf\\xed?\\x1d\\x13;\\xce\\x9e%\\x05@I\\xdb\\x07\\x8d\\xde!\\xf4\\xbf3\\x0e\\x84\\xfe\\'\\x85\\x02@\\x02\\x103Xwb\\xc6\\xbf\\x99\\xee\\x11m\\x10\\xd9\\xf7?SV\\x872\\x8f\\xfa\\xe7\\xbf\\xc4\\xee\\xc0\\x8fb8\\xfa?.B\\xe6kW\\x9b\\xe0?[\\x14\\x0f\\xc2\\\\\\xed\\xca?0`\\xd8:\\xbew\\xe7?\\x13Fi\\xe0\\xf1A\\xf4?,\\x0c\\xb0Nd\\x88\\x11@JP\\x14\\x92\\x15)\\x04@\\xe7\\x91\\\\\\x07\\x0c\\xec\\xda?\\xe9\\x85\\xe4\\xbf\\xe2\\xda\\x8b?ex\\x83[\\xbf\\xb3\\xd2?zv<\\xf0\\xbc\\x12\\xf1?\\xe1\\x8f4\\'\\x91\\xb2\\xfe?WIJX\\xd1\\x06\\xee?\\'\\x19\\x80\\xe81\\xb2\\xe1?\\xbb\\xb1\\xfe\\xd62B\\xd8\\xbf\\x15gz\\x0b)\\x07\\xfa?8\\xce\\x86<\\xc5\\x87\\xc9\\xbf\\xdaBz\\xc7\\xdc\\xac\\x01\\xc0\\xd8\\x98\\xad\\xddv\\xf5\\x10\\xc03\\xa4\\tT\\xe9\\xab\\x0c\\xc0(O\\x91\\xc1)\\x0e\\xec?\\xd5\\xea\\x94\\xf4\\xf1\\x9a\\xfc?\\xbfT\\xceOVK\\xe0\\xbf\\xebl\\x8e\\xf1$\\x98\\xcf\\xbf[\\xd5r\\x15V\\xa0\\xc4\\xbfm\\xf2\\xc5\\x11\\x8e^\\xd6\\xbf(\\xde.\\x96\\xb0+\\xe3\\xbfS\\x91\\x1e\\t\\xb7\\xa3\\xea?\\xcf\\xe4Z\\xcd)\\x10\\x04\\xc0Gi\\x19AT;\\xe8\\xbf\\x81\\xdeX\\x1e\\xf9C\\xed\\xbf\\x9cA\\x10\\x05\\xb6\\xf4\\xd5?91\\x9c\\xbfP\\x19\\xd2\\xbf\\xf9\\x933\\xcb\\x038\\x10@\\xbd#\\xdc\\xbfl\\xd8\\xf8?R\\x82GU\\x06\\xf7\\xbd\\xbf\\xcdp?I\\x9cY\\xc3?\\xee\\x99o\\x8d\\xa6\\xe1\\xdc\\xbf\\xf0&\\xed\\xdd~q\\xaf?\\xfd\\xc2\\xa7Q\\xdbN\\xfd?\\x1e\\x81>\\xb5f\\xb9\\xf6?C\\xa2\\xc7\\xfb\\xf3\\xd9\\xf2?\\xc5q\\xce\\x9b\\x85\\t\\x00@\\x84\\xaen*H3\\xe2\\xbf\\x16zG\\xc8\\x974\\xd2\\xbf]\\x95\\xc9\\x90\\xb5\\xe9\\xf5\\xbf\\xd1\\xfdR\\xbeW*\\xb1\\xbf\\xd5o9\\x0e\\xae\\xf5\\xfb\\xbf\\xa7\\xe0\\x85\\xaeS\\xbf\\x12\\xc0\\xdf\\xc3d\\x9a\\x90P\\xa5?\\x0fu5V\\xc3K\\x06@\\x1e=S\\xfc\\xf4\\x81\\xd2?\\xa0J\\xa2\\xf9\\xe7\\xcb\\xc5\\xbf\\x00\\xe3\\x02e8\\xb4\\xf1\\xbf\\x1a\\x053\\xc3\\xb7\\xfe\\xe3?#\\x1d\\xaf\\x19\\xc3\\xfa\\xd2?\\xe5B\\x81&;\\xf0\\xc3?kJI\\xb0\\x85\\xf5\\x00@\\xee\\xe0~\\xac\\xc2\\xe7\\xf6?\\xe4hM\\x15<\\x01\\x12@qN\\x8a..:\\xfd?t:\\xb3\\x95\\xffP\\x08@\\xeaQ;\\x1c\\x14\\x19\\x07@g\\\\*\\xaa\\xeb\\xb6\\xfe?\\x00\\xe4L\\xb7\\x10K\\xbb\\xbf\\x8d\\xfb\\xb1\\xb6M\\xbd\\xf0?|\\xae\\x9b\\xf5\\xe1\\xf5\\xac\\xbfU\\x03\\x95\\xa4\\x05\\xef\\xd8?C\\xec\\x98{\\xa3\\xcf\\xee?Wp\\xc1\\r\\xad@\\xe1\\xbf?\"\\xecV\\xc3\\xfc\\r\\xc0\\x16\\x84\\x01\\xfb\\xa0?\\xeb?\\x86Kw\\xcb2\\xfc\\xfe\\xbf]\\xa6n\\n\\x0e\\xc2\\xf0\\xbfug\\xfa\\xe2\\x05\\x1f\\x07\\xc03{\\xeeI\\x07\\t\\xf5\\xbfm\\xe4\\xb7\\xc5\\x05\\x16\\xe8\\xbfK^hI\\xfb\\xc9\\xe0\\xbfpmq\\x06\\x90+\\x97?\\xbf\\xa4\\xfdr{\\xb5\\x00@\\xf9+\\x17 S)\\xe8\\xbf\\xef~\\xb5\\x07\\xedu\\x04@=\\xaa\\xff4\\xb3\\x83\\xf9?\\xa8\\x17\\xcd\\x0f\\xca\\xa0\\xe5?\\xebp\\xd5\\xa5\"\\x1d\\xeb?\\xcfku\\xb6\\xa2\\x95\\xbb?\\xed\\xfa*\\x89\\xc3\\xa9\\xd4?\\x96\\x95E&\\xbd\\x17\\xf9?\\xbc\\xd0\\x00\\xfc\\'\\x07\\xf3\\xbf\\x8amP\\xa7\\xf1\\x1c\\x0b@9\\xc5\\xafJ\\xe6l\\xf2?\\xf25*\\xb0N\\xe6\\xc7?\\xbc\\xbb\\x1b\\x82/i\\xff?RP\\xd7\\xa1\\x13h\\xf5?W\\xdbg@W^\\xbe?\\xfed\\xd7\\x90\\x9c\\x96\\xec\\xbfY(fY\\xea<\\x12@\\xf6v\\x1fa\\x9c\\xd0\\xff\\xbff\\xf0\\xf7]\\x0f\\x0f\\xf0?\\xde\\x7fzJ\\xa8P\\x0b@H\\xc1\\x02\\x90#,\\xd6?Ybr)\\xa78\\x04@3{\\x02\\xd4h\\xbd\\xe1?\\\\2\\x94\\n\\xb0v\\xe0?\\x15R\\x10\\x83hC\\x07\\xc0\\x9d%\\x01S3\\x0c\\xf6\\xbf\\xa4i\\xf4\\x0e\\xdd\\xca\\xec\\xbf\\xba\\xec\\x17\\x90<\\xe0\\xe4\\xbf\\x90\\x90&\\xea\\xb8\\xc7\\xf5?\\x87\\xee\\xa0\\x8d\\x97\\xd8\\xf7\\xbfPO\\x92\\x1bt\\xf9\\xf2?\\xed8\\xa9\\xe1_\\x0e\\xfb?D_\\xf5 \\x85y\\xff?}\\xcc\\xd7\\xdaw\\xf5\\xdb\\xbfc\\xebK\\x82m\\xdf\\xb7?8a\\x81a\\xa2C\\xf0\\xbf\\xeaOP6\\xbb\\x86\\x04@\\xaf\\xf2\\x00\\t\\x93\\x85\\x00@^\\x99\\xf0\\xdau@\\xdd?\\xe8\\xe1\\xd3\\xa9\\xd4T\\xee\\xbf7\\xcf\\xadx\\xff\\x1b\\xe8\\xbf\\x97\\xd7\\xc6D>\\x1f\\xce\\xbfps;\\x86Q\\x9c\\xef\\xbf\\xed\\xce<P\\x16\\xdc\\xaa\\xbf\\xc3r\\xde\\x84\\x08f\\xf9?g\\xee\\xfd\\x81\\x9c4\\x01@\\xb8J^\\x16\\xe7\\xf8\\x07@! -\\xcds\\xf1\\xf0\\xbf\\xf9r0\\xca\\xc4\\xcf\\xcd\\xbf@\\x15\\x8dYu\\xb5\\xff\\xbf-\\x11s\\xaaN\\xa2\\xf1\\xbf\\xce\\x06$NeV\\x04\\xc0\\xa1\\r\\x12\\x15\\x8c`\\x03\\xc0\\x84\\x15I\\xb2R\\xc8\\xff\\xbfOx\\xe3\\x92\\x98\\xf5\\xf1\\xbf*\\xbc\\xb0\\x8d\\x02$\\xf4\\xbf\\xb3\\x9a\\xf3R\\x8e\\xfe\\xd7?\\xf2\\xbd`\\xeb\\xf8\\xa6\\xe0? \\xadZ\\xbd\\xfa\\x8c\\xef\\xbfv\\x84\\r\\xd3\\xba\\x87\\xee?m!\\xd9V\\xb7F\\xdb?\\t\\xa5i0\\r\\x15\\x01@\\xd3\\xa1\\xfcQ\\xb3\\n\\xf4?[G\\x9fE\\xc4|\\x06@\\xa2\\xe1\\x0c\\x03D\\x0c\\xd1?R\\xf8L\\x13\\xab\\x89\\xbf?\\xc6)^\\xe7AV\\xf1\\xbf\\xdc\\xf0\\x99]\\xda\\xb6\\xa9?\\x89\\x96\\xe8L\\xeb\\xdf\\x97\\xbfI4X\\xd2\\xaf\\x02\\xc0\\xbf\\xe5\\xed\\x8etl\\xd2\\xf0?\\x11l\\xa95D\\xa5\\xf1?\\x92\\x10\\x8c\\x9b\\xc2\\xb0\\xf7?\\x0e\\xb6r\\x01\\xb4\\xad\\xe1?\\xad;\\x87\\t\\xc7 \\xe9?_\\x82\\xf31\\xc4\\x7f\\xd1?\\xbdB\\x12\\xed\\x1dS\\xfc?\\xb9v,\\x9f\\x90r\\xc8?\\xa4L\\xda1\\x0c\\xd7\\xcf?\\xd0\\xfc\\x1a\\xa1E\\xfb\\xbc\\xbfqyH\\xff~\\x86\\xf5\\xbf\\xba\\x82\\xbc{Aj\\x02\\xc0\\xd7\\x13B\\x81\\xc9-\\xdf\\xbfAd&#eO\\xfc\\xbf\\xddWJ\"\\xaa\\xef\\xb9?\\xabk?\\xc8*0\\xf3?,\\x8da\\x05\\xdb\\xfe\\xf5?\\x03}\\xdfa\\xb3t\\xfc?7\\xe1\\x1a\\xac\\xa3\\x9a\\xf2?\\xc65\\xd7\\x1a>\\xdc\\x04\\xc0\\x08\\x9df@\\xd7_\\xe1\\xbf\\x92\\x1c\\'c\\xb0\"\\xf2?\\x8dH\\nN*]\\xeb\\xbf\\xf6\\xf7\\x030\\xed\\xff\\x96?\\xfcR\\x95okD\\xed?5\\x8a\\xea\\xfd\\xb8\\xbe\\xca\\xbf\\x92\\x1b%c\\x0b\\xb4\\xe3\\xbf\\x80\\xb6M\\x18\\x8a\\xc7\\x9c?k\\x19u\\xf2qny\\xbfR+\\x83\\xdfJ\\xde\\xe2\\xbf%U\\x9cR\\x02\\x1a\\xff?r\\x11\\xe9\\xf9%\\xe6\\xcc?\\xaalD\\x0f\\xa9\\xc3\\xe7?0\\xfb\\xbe\\xfc#m\\xc0?\\xc0\\xa3\\x1c\\xe5\\x82D\\x00\\xc0\\x01\\xbe\\xf6^\\xa5|\\xf9\\xbf\\xabN\\xa7\\xe1\\x17\\xfa\\xc3?\\xaaO\\xc2\\x8bF\\xf5\\xf2\\xbfAY\\xff2\\x11\\x80\\xfc\\xbf\\x1b\\xf0Ds\\x7f\\xe2\\xe3\\xbf:n\\xb2[[\\x91\\xfe\\xbf\\x94\\x7fy\\xabz6\\x04\\xc0v\\xa9\\xbf!wQ\\xe8\\xbf\\xc4vm\\'\\x8bc\\xf3\\xbf\\x90\\xa4\\x89\\xeaPv\\xfa?$\\x84\\xaa\\x10\\xd1\\x8e\\xee?4o.\\x14\\x06r\\xf4?G\\x92y\\xd1!\\xd8\\xf3\\xbf\\xd0\\xa5\\x15\\xe5\\xc3\\x1b\\xc3\\xbfel1I\\xbc\\x1a\\xe0\\xbf\\xc7,\\xc7|\\xa5\\xf9\\xe1?fQ?D\\xb8c\\xf5\\xbf\\xff-\\xd6a\\xad\\xd6\\xef?/V\\x88K\\xedk\\xd4?\\x02\\xd0\\xee\\x9a\\r\\x95\\xd9\\xbf\\xbe>}\\xa7*\\n\\xec?\\x8e\\xdf\\x87x`\\x0e\\xe4?\\xd2\\xfb\\x82\\xdae\\xae\\xea\\xbf\\xe5\\x11d\\xb3\\x1f\\xa3\\xc7\\xbf\\xe8\\xccxL\\xb3\\xd8\\xe8\\xbf\\xec\\xf6\\'\\xce]\\x04\\xff?N\\x84\\xd55\\x9a@\\x06@S\\xf8\\x8eB\\x08\\x81\\xdc?\\x96D\\x92e\\x04W\\xf0\\xbf\\xdf1\\xeb|\\x05\\xac\\xcf\\xbfR\\xd0\\x04)m`\\xc8\\xbf\\xaf\\x05\\xca\\xebT\\xa8\\xb6\\xbf\\xb8x\\x1c\\xbf\\xd7i\\xd2\\xbf\\xaf\\x96\\xe8\\x12\\xb5\\xbc\\xb9?0\\xf0\\x9f\\xf4\\x94W\\xd7\\xbf\\xfe\\xf6\\x8d;\\x87\\x9a\\n\\xc0\\x8e\\x96\\xdd\\x0c\\xc5\\xc7\\xff?E\\x08\\xe1\\x98&\\x8f\\xc2?\\xafcn\\x92\\xa5\\x14\\xbd?\\n\\xdc\\x8bg\\x0c\\xb8\\xe7?\\x8ap9E@\\x87\\xda?\\x11\\xd0\\xe4q<J\\xf7?X\\x04\\xe9\\xd27\\xb4\\xe2?\\xb9\\xf2J\\x12\\x1eE\\xf6?\\xd0N}\\x1aV\\xb1\\xe8?\\x10\\r\\x12\\xe1j\\xe7\\xcb\\xbf\\xae\\xb7\\t\\x9c\\x1b\\xf9\\xf0?\\xd9I\\xcb\\xf1\\x96=\\xf3\\xbf\\xbdqV&\\x1d\\x8f\\xd6\\xbf\\xa8\\x04\\xber\\xb9\\xdd\\xd9\\xbfp\\xe2\\xf0\\x93\\xa6\\xc3\\xf3\\xbf3\\xed\\xec\\xa3\\x13\\x9f\\xd5\\xbf\\xf8\\xcf\\x93\\\\\\xb6Q\\xb5\\xbf\\x1f\\x18\\xdb\\xd80\\xfc\\xe7?3p\\xcb5\\x98\\x96\\xfa?9\\xcd\\xe8i\\xb4\\xcb\\r@\\x04\\xf7.\\xaa\\xb8\\xd5\\xfa?v\\x12\\tE\\x8b\\xf9\\xfe?\\x128A \\xc9g\\xf3?VN\\xf8\\x1f8\\xcb\\xf2?w\\xf5\\xa3\\xd9p\\x9f\\xda?.\\xe1qw\\xbb\\xae\\xf2?\\xa2\\x15\\xf6J\\x0f6\\xdb?\\x8dC\\xe8T\\xb9t\\xe5?[W\\xea\\xfd\\x1dk\\xd7\\xbf\\x80U\\xe5L]\\x1f\\xfb\\xbf\\xed\\xa6\\xd7\\x1c\\x12M\\xe7\\xbf2\\xc0\\x7fXGi\\xfb?\\x11Ch\\x04)\\xb3\\xd7?e2\\x98\\x06 \\x97\\xe1?F\\x9c\\x8d u\\x95\\xf5\\xbfn\\xd5\\xdbe\\xc5\\xbc\\xf0\\xbf\\xb5!\\xc1C\\xee\\xe0\\xf4?ql\\x13\\xc9\\x91\\xc9\\xd5\\xbf\\xd2\\xbb\\xf8C\\x97\\xb6\\xda\\xbf:k\\x0c\\x9e\\x90\\xfa\\xe1?\\nb\\xc6%\\xd3\\xa9\\xbc\\xbf\\x86\\xa1\\xca\\xdc\\x9e\\x95\\xe9?\\xf9\"\\x1cA\\x13z\\xd1?\\xa5l\\xa3\\x17i\\xd5\\xe4?\\x0bg\\xa1r\\xe2\\xac\\xc0?\\x01Nj\\x1bhn\\xe4?\\x16\\xcf\\\\q\\x89Q\\xd2?\\xf8m\\xfe-\\xdc\\xa0\\xff?s\\xbf\\x96}\\tN\\xfe?F\\xaa\\x98\\xd8\\x00\\xb4\\xf3?\\x90\\x08+qQ\\x00\\xdf?\\xe3\\x0e5)\\xa0\\x8d\\xe5?\\'*\\x02\\xc0D\\xd4\\x04@|\\xf37\\xfb\\x87)\\x00@\\x9c3v%\\n\\x0f\\xed?@\\xbe\\x04y\\x05\\xc1\\xfc?\\xa1\\xdfU\\x89\\xa09\\xda?F3\\xa9p\\x12\\xf1\\xb1\\xbfW\\xb81\\xdd\\xae#\\xe6\\xbf~\\x9b\\xcf,\\x8f\\xca\\xfb?\\xd5gk\\xb0\\xfbm\\xd3\\xbf\\xccu\\x16\\x83\\xab\\xdf\\xaa\\xbf\\xaf*R\\x06z(\\xea\\xbf\\x95\\xdd\\x1c\\x1b\\xd7~\\xdc?/y49\\x89\\xa5\\xc3\\xbf\\x05-\\xb3\\xe1\\xad\\x15\\xc0?\\xea\\x00\\x80=\\xde\\xc2\\xc4\\xbf=\\x0f?\\xe44\\x03\\xe0\\xbf\\xeb{\\x03\\xce\\xad\\xac\\xc8?Ky\\x90\\xb2\\x8d\\xe1\\xeb?\\x00\\xcdT\\xd8V(\\xe3?{!w\\xef\\xeer\\xf0?\\x82\\xbc\\xb9R\\xde\\xa0\\xf5\\xbf$z\\x93Z\\xee\\xae\\xe6?\\x11|\\x04\\xa5\\xe5\\xa0\\xff?^>\\xe0!\\xf9\\xaa\\xb4\\xbfE\\x92\\xa7\\x12\\xe0\\xf2\\xa9?=\\xa1\\xea\\x82\\xed0\\xf0?C\\xa5\\xba\\x8e2,\\xec\\xbf\\xe6\\xf2\\xb2\\xa3#\\x0e\\xdf?\\xccR\\xb7JJ\\x01\\xea?\\xcd\\xa1\\xb6G\\\\b\\xe7?\\x12\\x0f\\xf0\\xa4\\xf7J\\xf7\\xbf\\xb82zFPz\\xc1\\xbf\\x00n\\xf9\\xa6\\x15i\\xeb\\xbf\\xe8\\xa2\\x16\\xa7Y#\\xd7\\xbf\\x08\\xd5]\\xa4\\r\\x16\\xd8\\xbflh\\x8d\\xcf\\xfdV\\x8d?\\xe9\\x8d+\\xd2\\xd8\\x08\\xe6?\\xe1\\xf3./RN\\xd7\\xbfT\\xf2,\\x1a\\xa9\\xe5\\xde?\\x1e\\\\\\xc8\\x00\\xb6B\\xd0?^\\xc5<&\\x1c\\xad\\xe0\\xbf\\xfb\\xf7F\\xf9\\x8d$\\xc4\\xbf+ \\xc9\\xd9\\xec\\x17\\xc0?%\\xfaU5\\x0c\\x94\\xa8?\\x80\\x8c\\x96\\xb9]F\\xee\\xbf\\xf2X\\x89\\xa4F\\x10\\xf2?E\\x05L[\\x99K\\xe0?\\xda\\xf7P\\x12<\\xb9\\xf1?\\x9f\\xf0\\xcc3}\\x7f\\xe9?\\x19U\\xb0\\xb5\\x9a\\x97\\xd6?\\xd6xb\\x02X\\x1d\\x9d?\\xcb\\x11.\\xed\\x0c\\xab\\xf3?\\x93\\xe3\\xaa\\xe9Wq\\xca\\xbf~)uD\\xae\\xb0\\xd3?\\xd39\\x96\\xe1;\\xcc\\xd7\\xbf)1\\x93\\xb4\\xbba\\xf0?\\xae\\xb0C\\xb9n\\x15\\xe0?\\x900\\x98\\xd9\\x88\\x8f\\xe5?\\x9b\\xe3r\\xdeQp\\xb3\\xbf\\xff\\xbe\\xe3H\\x96\\xeb\\xe2?\\x1c\\x90\\xe3\\xc0n\\xed\\xe8\\xbf@\\nI\\xe4,\\xec\\xd1\\xbf\\x17\\x9d\\xd5p\\x1d\\xe6\\xfb?\\xcb\\xe8\\xf9rU\\xfc\\xba\\xbfE\\xed\\xd2~\\xc2\\x1f\\xb2\\xbf\\xf8_\\xde6\\xe1\\r\\xf8?\\x08\\xb3\\xc5k(\\x0e\\xd6\\xbfr\\x83\\x93Xl#\\xde?\\xe4o\\xde\\x06&\\x08\\xd0?\\xac\\x08\\x82\\x11\\xba\\xbd\\xd0\\xbf5\\xcfA\"\\x13y\\xf7?\\xb4P\\xc0f\\xf2\\x1b\\xf4\\xbf\\xb66\\x9c \\x05\\xfa\\xd0?i\\xa2\\xb2\\xf9\\x1d\\xee\\xee\\xbfV>\\xec\\xd8#\\xb9\\xd0\\xbfn\\xca<h\\xfb0\\xe0\\xbf^\\xd9\\xe2\\xce\\xc8f\\xe8\\xbf\\xdf9\\xe2\\xec\\x1f=\\xef?\\xd5\\x01qG\\xfc@\\xe4?z7\\xa8\\x15\\xac\\x11\\xe6\\xbf-r\\xbd\\x1bz\\xf5\\xfc?\\xd5\\x10\\x1d\\x0e\\xed+\\xf0?T\\xab\\x06\\x83\\x84p\\xf0\\xbf\\xc2\\xdae\\xdc\\xa1\\n\\xf2?l\\xe5[\\x81-\\x96\\xb5?\\x94+x2L\\x19\\xe0\\xbf(^Au\\x99t\\xde\\xbf\\xbc\\x0c\\xcf1\\x90\\x12\\xe4\\xbf\\xea\\x8cS\\xd9t\\xc9\\xbf\\xbf\\xea\\xed3e\\xa6\\x14\\xda\\xbf^\\x95\\xedb\\xe1\\n\\xed\\xbf\\xefE\\xdd\\xbes\\xd5\\xf0?I\\x16\\t\\xe5\\xeb\\x14\\xe7\\xbf@@\\xfan]\\xea\\xd2?\\xda\\xaf\\x90\\xd5\\xb4\\x99\\xf0?8\\x85\\xe3(\\xd4g\\xc0\\xbf\\x92\\x07\\x08\\x98\\xb4b\\xd6?.\\x07\\xfeK\\xb8 \\xf0?\\xb7C\\x99V\"w\\xef?9H\\xf5J\\xa3\\xaf\\xb4\\xbf?\\x0e\\xee\\xe3\\xd2\\x1b\\xe0?\\x1e\\xfb\\xf8\\x9d\\xc7O\\xcd\\xbfi\\xe7\\xa8\\xc2\\xc1\\x15\\xd0\\xbfC\\xb2\\x03\\x99nD\\xc4?\\x1a\\xd9M\\x01\\x89\\xe7\\xe7?q\\xe2\\x86B\\x0b\\x13\\xce?:{>\\'{\\x94\\xcd?\\x0b3\\x96J\\x16\\xc2\\xfe?\\x02\\xb5\\xd2\\xb5_\\xe1\\xe0?\\x97G\\xf2\\xc9\\xfe\\xa2\\xe8?#\\xf1|\\x8dX\\xc0\\xf7?A\\xeb[\\xbd?\\x9a\\x06@WqQ\\xc7\\xda\\xc0\\xf5? Rh\\x11\\x12/\\xf8?k\\xa0\\xb3G:\\x1a\\xf7?#P\\xba\\xa3\\xef<\\x05@\\t\\xfb\\x14SEW\\xf7?\\xfaY\\x08\\x1a:\\x1d\\xf6?\\xe3\\x84\\x9b\\xf4\\x1e_\\xf0?`\\x87MRB6\\xea?W\\xa3RZ\\x90z\\xe3\\xbf\\xcb3\\xf5;\\xa9\\x90\\xe6\\xbf\\x08\\x85\\xb0\\x97\\xce\\x9e\\xf7?)\\x1f\\x9f\\xbdS\\xa3\\xe8?[e\\x9a\\x9b+j\\xdd?\\x99\\xd9\\xae\\xe0\\xd0\\xcf\\xe0\\xbf\\x90\\x07\\xcbNOG\\xed?\\xc9j\\xb2?\\xbcT\\xd1?\\xdb;\\x0bD\\x8a\\xd1\\xe2?\\xdb\\xb24\\xf0U\\xc7\\xc3\\xbf\\xf3&\\xd8b\\xca:\\xdd?w\\xdcBF\\xcc\\x0b\\xdb\\xbflw\\x99&\\xa34\\xd2\\xbf\\xeec\\x12\\xd14\\xae\\xd6?\\xa3K\\xab\\xad\\x7f\\xf0\\xe3\\xbf6\\xc8W\\xc1\\xe3\\xa0\\xf2?$]\\x17FU\\xbf\\xfb?\\x11\\xf1\\x06\\xe2\\x84\\xb9\\xe0?\\x14\\x9bB\\xcf\\x94,\\x02@\\x12?E\\xf5\\xf2\\xfe\\xe7?\\x14$\\xbb\\xae}\\xd2\\t@\\\\\\x0f\\xe3\\xcc\\xb6\\xa1\\t@\\xee&fO\\xfe\\x84\\xfb\\xbf\\xd9\\xafg\\\\\\x0c[\\xe6\\xbfM\\xc2t\\x9d\\xf1\\xab\\xf6?\\x8b\\xff\\xf6\\xed\\xa8\\x17\\xfe\\xbf9t\\x07\\x91\\xe6\\xd2\\xf3\\xbf\\xad(\\xe5\\xbd\\xba\\xce\\xe2?@\\xbc.P\\xa5\\x03\\xde\\xbf\\x9d\\x02\\x0e7\\xaa\\xb0\\xdd\\xbf\\x18T\\xb6\\x8dI?\\xe0?%\\x89zX\\xa5K\\xf6\\xbfQTt\\x97\\xe7@\\xc9\\xbfs\\xd1*x^<\\x9c\\xbf\\xa6\\x1a\\xb2\\x87\\xbb\\xed\\xbb?\\xc9\\xa8a\\xe2\\\\3\\xb1\\xbf\\x85 \\x11\\x85\\x88.\\xf0\\xbf9\\xe3\\xfd\\x83\\x15\\x91\\xe2\\xbfxj\\xa8\\xa3\\xfb\\xa3\\xe7\\xbf\\t_E\\xfaDh\\xeb\\xbfol\\xc9*\\x96O\\xdd\\xbf?\\xb3\\xe2\\x10\\x83O\\xdd\\xbf\\x9b\\xcb6\\xf2T\\x11\\xaf\\xbfq\\x02`H\\xe5\\xa2\\xdd?\\xff\\x0e\\x9b\\xcf\\x93\\xc9\\xf1?8\\xcb\\xd7\\xc6/\\x7f\\xf0?t}d\\x97\\xdb.\\xe2\\xbf\\x14\\xc8\\xa6\\xdf\\xde\\xa3\\xf4\\xbf\\x1e\\xc4>\\xe2\\xf0\\xe0\\xc0\\xbfXL\\x05{\\xb7\\xf8\\xeb?+\\x89D\\x93\\xd5\\xeb\\xec\\xbfQ\\xben\\x97\\x1ad\\xef?\\x16I\\xccRAB\\xea\\xbf\\xbb\\x9cL\\'q\\x82\\xc9\\xbf\\\\\\xc2\\x0b\\xa8\\xd5K\\xe9?\\x01\\x8a\\x9a{\\x05\\x88\\xd3?\\x90\\xaf\\xe5Rc.\\xb5\\xbf<\\xa9>\\xef\\xc6\\xb9\\xa7?\\xff8m\\x01\\xaf\\x96\\x00@\\xa8\\xc3\\xe6_%Z\\xf7?\\x99P\\xb3X\\xd4\\xca\\x06\\xc0\\xe9]Nk\\xd1\\xd2\\xe8\\xbf\\xe1\\xef\\x18\\xcc;\\xb6\\xc9?\\xfb\\xcc?h~A\\xbf?\\xf4V\\x14\\xfe{\\xbe\\xe6?\\xd9\\xd3a\\x83:\\xcb\\xd6\\xbf\\xff\\xdb\\x11d\\xa6[\\xe6\\xbfp\\x00\\xee\\xf2c \\xea\\xbf\\xb0\\xd9\\xba\\xd8\\xcfy\\xfe\\xbf@y1%Q\\xbb\\xfa\\xbf\\x90\\xe5\\x99\\x82\\x9c\\x18\\x94?\\xd3\\x06\\xe5\\xa2\\x85\\xf3\\xea?\\x08s!\\x1a\\xab\\x8d\\xf3\\xbf\\xcd\\xf2\\xdb\\x9cR>\\xf6?\\xb3F\\xd1O\\xabD\\xe3?|\\x01i\\xe9j\\xa7\\xe7?:9M/\\xfe\\xd6~\\xbf\\xd0{\\xa2\\x1b]`\\xf3?O\\x83\\xf0T(\\x12\\xdb?g^Q\\x063\\xd7\\xf1\\xbf\\x8fC\\xfeZ\\x88\\x8a\\xdd\\xbf\\xb4\\r\\xf66\\x9b0\\x00@\\t\\x1c\\n\\xe7\\xa6\\xae\\xfc\\xbfx\\xff:\\xc3VB\\xec\\xbf\\x83\\x9e\\xa3\\x1c\\xd8\\xd9\\xe3?\\xa7\\x86n\\x8f\\xa4\\xea\\x05\\xc0\\x94\\x02=\\x07*\\xe6\\xf7\\xbf\\x7f\\xdbm\\xca\\x7f|\\x02\\xc0\\x9a\\x85\\x1e\\x1f<V\\xf3\\xbf\\xfb\\xf8\\xd7\\xc1|\\xc3\\xff?\\x86Z\\xef\\xf19\\xd1\\xd1?a\\xda\\xb4\\x90\\xf2\\x0e\\xe1\\xbfi\\r\\xf5\\xe3X\\xb3\\xb0?\\r\\xea\\x10\\x1d\\xc1q\\xb6?h\\x9b\\x1f\\xfd\\xe0\\x1f\\xf3\\xbf\\x89\\x18\\xe2j~\\xd9\\xf6\\xbf}\\xf9I\\xe8\\xd7\\xdf\\xf9\\xbf\\r|#%\\x82\\xe4\\xfc\\xbfb\\xc5\\xed\\xfbgu\\x04@3\\x9a\\xab\\x95\\xfaY\\xc4\\xbfJkB]\\xcf\\xb1\\xae\\xbf\\x95?\\x02L\\xf4,\\xf5\\xbf\\xd7\\x18\\xc8<(\\xcb\\xe5?\\xf0\\xc3\\xcb\\x1d\\x9b\\x1b\\xf5?W|\\x83\\xf3\\xad\\t\\xda\\xbf\\xb3\\x165\\xee\\xb0\\x16\\xd5\\xbf\\xb1\\xf3\\xa3h,\\n\\xf9?z\\x8e\\xcb!3\\x0b\\xf5?Wg\\xfe\\xb6\\xa27\\xd9\\xbf\\xc1@7\\x12N\\x16\\xd1\\xbfk,[E@\\x93\\xd8?\\x9eq\\x1e\\x8cF\\xd7\\xed\\xbf)O\\xc4\\xb2\\xa5\\xc4\\xf9?\\xee\\xd0\\xe5\\x01s`\\xd5?|J\\x19\\xd5\\x1b\\x11\\x04\\xc0X\\xcfNo\\xb6\\xa5\\x0e\\xc0H\\xf1\\xce@e\\xf4\\x11\\xc0\\x8c>\\x0c\\x9ch\\xa8\\xf5\\xbf\\x92\\x0b\\x01vLz\\xea\\xbf#\\xef\\x92\\tF\\x9d\\xb4\\xbf\\xd9\\xd8g\\x01.\\x92\\xea\\xbfx_\\x9fhK\\x86\\xe6?\\xfbYrm\\xfa\\xc9\\xb7?\\t\\x81\\x08E\\x9ac\\xa4\\xbf\\xf2yL\\xb4\\x89\\xdd\\xfd\\xbf=]<6\\xd9\\xef\\xe5?E^\\xde^n\\x80\\xf7\\xbf\\xa8\\xe7|\\xc1\\x8fB\\xf2?\\xe7\\xb0\\x8f?\\xa9\\n\\xd9\\xbf\\x8c\\xacGI\\xc3\\xdf\\xe6?\\xc0\\xbc\\x08De\\x89\\xf5\\xbf\\xdeB&\\xd3%]\\xe2\\xbf\\xcd3\\xf2,\\x9ds\\xf4?\\x9f\\xaeU\\xfe\\xf0X\\xd8\\xbf\\x19\\x96\\xb9j\\xb7^\\xe9\\xbf-\\xe0\\xc7\\x8f\\xc0J\\xfd?\\xd9\\x05L7,\\xe9\\xee\\xbf\\xb8i\\xc6\\xd5Ab\\x86\\xbf\\xad\\xc9\\xf2q\"V\\xed?\\\\h\\xfb\\xcf\\xa3\\xf2\\xfb\\xbfVLk \\x9cF\\xb2\\xbf\\x93\\x01\\xfe8.\\x94\\xe0?\\xc7F1\\xa7,$\\xc1\\xbfs\\xe8@\\x06\\xba\\x0e\\n\\xc0\\x97\\xf7\\xd5\\xb7k<\\x17\\xc0j\\x9cO}\"\\xb0\\x00\\xc0\\xac\\xae\\xc8\\xb5\\xce\\xa2\\xdc\\xbf\\xcdz\\x076\\xa3\\x83\\x94\\xbf\\x05\\xc7\\xcbe\\xa9\\xe3\\xe3?\\xa0Q2\\xa2\\xb50\\xe6\\xbfw.\\x98y\\x1d\\x03\\x02@}Y_e\\x86K\\xdd?\\xf4\\xc3\\xa61$^\\xe8?\\x02s\\xce/\\x1bl\\xf0\\xbf\\x13\\x8bz\\xce\\xa9\\xe0\\xf7\\xbf\\n%o\\xed,\\n\\x04@\\xe7\\xc7UiU\\xca\\xa1?\\xf2\\xef\\xaf\\xcf\\x18Y\\x00@\\xd0{LH14\\xe7\\xbfG\\x04<s\\xaa\\xee\\xa8\\xbf\\xfeT\\x1a#\\xbdn\\xd6?zvsM\\xee\\x08\\x02@k\\x11\\xd8\\x82\\x0b\\xf3\\xd2?&\\xd6!\\xf3\\x87\\xb4\\xee\\xbf\\xack4G\\xd4t\\xdb?\\xd1\\xdc\\xd8c-[\\xf3?\\xae}\\x19B\\'\\xd7\\xf5\\xbf\\xd1BcB\\xea\\x9d\\xd0?\\x12\\x84\\xfe\\x9b\\x88Z\\xdc\\xbf\\x9fJ}\\x81\\xf9k\\xe5\\xbf.\\xcbU^H\\xc9\\xf5?\\x86\\xa9K!\\xe13\\x15\\xc0\\xdd\\xcdCj\\xd1m\\x0e\\xc0\\x1e\\xed\\xd3c\\x99\\xd4\\x03\\xc0\\xfa\\xe4\\xa5bZ\\x85\\xf1\\xbf\\x00\\xa1(O\\xf56\\xc4?\\x1e\\xb8\\xa4m6e\\xd9?Dy\\xdc/o\\xdd\\xe8?\\xe9\\xed\\xa6\\xac\\xd1W\\xef?<&9#\\x90\\x95\\xf9\\xbf\\xac\\xec\\xa0\\xdd\\xf1\\r\\xf2?\\xf2 \\xd4\\xc38\\xe7\\xfa\\xbf+\\x83\\x8dM\\xe0\\x9f\\xde\\xbf\\xb1\\x03\\x10\\x9f\\xc9\\xf6\\xfd\\xbf\\xed\\xb62\\x82\\xba\\xa8\\xd8\\xbfk\\xd2\\x82ZTI\\xeb?\\xe0\\xa3\\xd2\\x1eke\\xf5?n7\\xad\\x01\\x17\\xa7\\xf5?\\x8c\\x1bF\\xe74\\xb4\\xed?\\xc4\\x9d\\x8fG\\xdf\\xdc\\xfd?8\\xa8;;m(\\xf3?\\x08\\xee{\\xbcL\\x8f\\x04@;\\x1e\\xf3r\\xc2\\x1b\\xcd?\\x1e\\r\\xee\\x8c\\xf6\\xdf\\xce?\\xa5$\\x8f\\xb1\\xe0\\x01\\xff?\\x03!;\\\\\\xf5y\\xd2?A\\xbdq\\xdc\\xe7\\xc3\\xf8\\xbf\\xb1\\xe74W\\xcf\\r\\xfc\\xbfKT\\xaeX\\xccm\\xd1\\xbf(\\xb32\\x9c\\x81H\\t\\xc0o\\x0f\\xe8\\x14\\\\r\\x15\\xc0\\xc3\\xb0\\x1b|P\\xbf\\xfa\\xbf\\x02\\xcfA\\x82\\x089\\xd0?\\tkm\\xeeB\\xe1\\xbd\\xbf\\xdb\\xda=\\x1b-Z\\xd2?\\xcaQ\\xd9\\x98\\xda\\xe5\\xb8?\\xb2](\\xd2k\\xd4\\x05\\xc0_\\x8d\\x03\\xcc\\xc7\\xc2\\xec\\xbfw?T\\x85+\\xdd\\x9c\\xbf\\n\\xa2\\x86\\xc5\\xd1\\xd0\\xd6\\xbf\\x94nH\\xe4v)\\xf8?\\xa6\\x8cS(\\x8a\\x02\\xf0\\xbf\\xf3\\xe5\\x84\\xfbU|\\x01\\xc0q\\x178\\x9bQ\\xf5\\xf4\\xbf\\n|f\\x9d^!\\x03\\xc0\\xbf/\\xc4\\x8d\\x1c\\x97\\xd4?\\xccff\\xeb\\x88\\xf1\\xf9\\xbf\\x02!YEN\\xbc\\xde?\\x17ET\\xacy\\xbc\\xf9?+5\\x96\\xf2\\xd9T\\xff?\\xefqN\\xea\\xd7[\\x0b@\\xff;\\xd7\\xaa\\xb4\\xee\\xfc?\\xfd\\xf9\\xd43t\\xdf\\xe4\\xbf\\x10\\xe3\\xdf\\x15>\\x8f\\xf1?\\xaf\\xb6\\t\\x82_r\\xb1\\xbf\\xa5V=\\xe3\\x82p\\xf3\\xbf\\xebO;\\x9e\\xd2\\xa1\\xde\\xbf<\\x89\\xf2\\xa6\\xf8\\xa1\\x14\\xc0\\xba\\xdc\\xdb\\xcdJ\\x1a\\x15\\xc0v%\\x1dK\\x14\\xa7\\xf6\\xbf\\x98\\xd1\\xac\\xeb\\x1b\\xb4\\xf7\\xbf2\\xb5\\xc3\\x14\\xcd\\xc7\\x17?\\x91\\x9bZ\\n>k\\xc3\\xbf\\xd1\\x90(\\x05u\\xc3\\xe8?\\xec\\xe0=B]A\\xe7?y\\xfa\\x8bp\\x12\\x1d\\xef\\xbfk\\xcbv\\x15[k\\xf2\\xbfJ\\xb5\\xed\\x8a\\xc0\\xc4\\xd6\\xbf\\x1b\\xe1E\\xca\\x02\\xf6\\xee\\xbf\\xbe\\xd8\\xb0\\x04\\xdb\\xfe\\x05\\xc0a,\\xe2^\\xe1>\\xd5\\xbf\\xfbq\\xa1\\xf1H\\xc7\\xdb\\xbf\\x9e\\x1c\\x1fY\\x81\\xc7\\x05\\xc0\\xfb\\x04\\xda\\xa7-9\\xf1\\xbf~\\xda\\xd2F\\x968\\x14\\xc02\\x1b\\x18\\xdd\\xd3\\xa9\\x19\\xc0e\\xb6\\xc6\\xd3\\x1b\\xed\\x10\\xc0\\xb6\\x02.\\xe0\\x96u\\xd5\\xbf\\xb3i\\xe5\\x18\\xaf\\xa2\\xfa\\xbf\\x95m8\\xa84\\x03\\xe5\\xbf\\xa7o\\xeeT\\xbcK\\x01@\\xa3fz;m\\xb3\\xe6?\\x06\\x07\\xbdeh\\x0c\\x04@\\xb6\\xcfy\\xc5\\xa8\\xef\\n@\\xea\\x82p:\\xdb\\xd8\\xdd?\\x88\\x10\\x95\\xee\\xcf<\\xd7?`\\xec\\x99\\x11\\x16\\x13\\x00\\xc0]\\x93\\xf4\\x84\\x1a/\\xcd\\xbfV\\xd5q\\xbb\\xa4P\\xfe?\\xfd\\xc8 \\xc8\\x89:\\xd0?;\\x92\\xf1\\xc3\\t.\\xdf?|\\xd0\\x01\\x1a\\xf1Q\\xd1\\xbf\\xbf^f9\\xb6e\\xb7?\\xb4q\\xfdyRC\\xf5\\xbfQ\\x16\\x8fK\\xc2\\x93\\xc1?\\xf4\\x00\\x00\\xf1\\xa0\\x93\\xda\\xbf#\\x95\\xb2\\x13n\\xfc\\xe7\\xbfi\\xeb\\xc5\\xa3\\xea\\xf6\\xf1?\\x11\\x07\\xcb@\\xfd\\x8d\\xe7\\xbf\\xe6\\x8cR\\xb9PM\\xfb\\xbfY\\x9c`\\x98\\xdfN\\xfc\\xbf\\xb1\\x18g\\xc2\\xd9\\n\\x08\\xc0\\xf8\\xf3y\\x15\\xefb\\xf3\\xbf\\xd2\\x90\\'\\xcfR\\x8d\\x15\\xc0\\xfdE\\x8b^pB\\x0b\\xc0\\xfd\\xc8\\xa8\\x15\\t\\n\\x06\\xc0\\x8f\\xf5|v\\xb3>\\xdf\\xbf\\x9b\\x1f\\xbf\\x89C\\xd8\\xfd\\xbf\\x0c\\x0bL:\\xf2\\x041?\\xe1\\xad\\xdf\\xc4C\\xc6\\xf0\\xbfd\\x017\\xae\\xf8\\xc4\\xcf?\\x91h\\x04Zw\\x99\\xff?s\\x0e\\'\\'\\xb9\\x8f\\r@g\\x87\\x88 \\x93n\\x08@@\\xdfIm\\x86\\xc4\\xd1\\xbfk\\x15\\xc3\\x08\\x04\\xb3\\xfd?\\xcd\\x94\\xc0\\x99\\x12)\\xeb?\\xa5\\xe2\\xb4Me\\xbd\\xee\\xbf\\xf8\\x08\\x04\\xba\\x06\\xb3\\xf5\\xbf\\xdcq\\x9d\\x8c|g\\xf2\\xbf9\\x06\\xb1Ia\\xc4\\xbb\\xbfD]\\xe7 ]\\xc0\\xe0\\xbf\\x0c\\xa2Z\\xe6\\xd6T\\xc3?\\xfd,\\xd5\\xf7\\xfc\"\\xf6\\xbf\\xd6x\\xdd\\x8c^l\\xed\\xbfN`\\x0f\\x03z\\xc9\\x03\\xc0J\"\\xae\\xa9c\\x02\\xde?#\\xaa\\xbcc\\xc5\\xc3\\xd0\\xbf\\xd4u\\x9eV9x\\xf0\\xbfY\\xcb\\x9a\\xac\\x8c\\x0b\\x12\\xc0\\xc4\\xd9\\xea\\x1b7o\\x0e\\xc0.\\x8d\\xfd\\x9clE\\xea\\xbf?*\\x8f\\xcd\\x86\\xf2\\x13\\xc0R\\x9c2\\xf8\\x9a\\xf7\\x06\\xc0A\\xe6\\x1e\\xaf\\xa0\\xd3\\xfe\\xbf\\x89OP\\xb5\\x0fb\\x06\\xc0=\\xf9\\x8bBy\\xa9\\x00\\xc0>?9\\xa8\\x1a\\xe7\\x06\\xc0\\xfa\\xf7\\xe0\\xa8\\x8e\\xe1\\t@\\xc7\\x02zH\\xe2u\\xb2\\xbf\\\\\\xd1+\\x0cS\\x1f\\x08@4\\xce\\xb4D\\xf6s\\x13@\\xad\\x18\\x8e\\x15eM\\x05@\\xf5\\xa3>w4\\x97\\xf7?\\xf3I\\xb6\\x96?\\x1f\\xe2?\\xdc#6_\\xbc\\xfb\\xbb?h6\\xc7\\x8d\\xd8\\xec\\xbf\\xbf\\x8f\\xf4\\xc4\\xd2\\xb4\\xe7\\xf7?\\xfc\\xaaq\\xc8h\\x84\\xef?;O,\\xa0\\xf6;\\x02@2\\xb1 \\xf6\\xfe[\\xf9?\\xa0WC\\x06\\xdf\\xf7\\n@\\xe6\\x10\\x11rv\\xaa\\xfe?j7;Q\\xe6\\xf2\\xf6\\xbf]\\x80:8\\x80\\xbf\\xeb?G\\x1c\\xdf8]\\xa0\\xd3\\xbf\\xac\\x02l\\xd6\"\\x83\\xdd\\xbfj\\xd5@\\x97\\x8c\\x7f\\x00\\xc0\\xad_\\xf4y\\xd7\\xd9\\xec\\xbf\\xaa\\x03D\\xdb\\'h\\xe6\\xbfo\\x0eu\\x9e\\x96\\xe9\\x08\\xc0\\xef\\xb4V\\x041\\x9f\\xf9\\xbf\\x95!\\xf5\\xf8\\xa7g\\x07\\xc0Z{\\xc3kj3\\xf1?:\\x11\\x812d\\x9e\\xea\\xbfa\\xdcM\\xd2\\xfd\\xcf\\xf6?\\xf1\\xc1\\x92\\x87\\xb7\\xfb\\xd4\\xbf\\xfd\\xfajZ\\xb8N\\xc3?R\\x19U\\x0fT\\x01\\xf0?\\x19\\xa1\\xa2\\x0f\\x07\\xde\\x03@B\\x05D\\x9a\\x1e\\x1f\\x04@\\x08o\\x94(c\\x94\\xf1?\\xe0\\xf3\\xf8pP\\x1e\\xd6?r\\xcb\"\\xab\\xder\\xdb\\xbf\\xd5M\\x00<\\xe7\\x89\\xec\\xbf\\x04\\xbd7\\x86\\xbc\\x96\\xef\\xbf\\xbe\\xa7|\\xab%\\x9f\\xd2?\\x8bJ\\xf2`\\xcf\\xea\\x03@\\xc9C\\x075]{\\x0b@d\\xb8,\\xabP\\xb3\\x14@A\\xdc7\\x8bn\\xc9\\x13@\\x92h\\x92?K\\x1a\\x07@}@\\xd13$\\xd7\\xe1?\\x85\\xc8\\xf0us&\\xeb\\xbf\\x0f\\tO\\xf7\\xaa1\\xff\\xbf\\xf5.q\\xdd+\\xa6\\x04\\xc0=N\\xd2\\xdf\\xf6\\xbb\\xf9\\xbf\\xf0e\\x12,\\xdb\\xe1\\xf8\\xbf\\x95w\\xc5\\xb1z\\xeb\\xf6\\xbf_\\x9a\\x95g\\x06\\xba\\x02\\xc0\\xdd\\x93\\x1bD\\x86\\xba\\xe8?\\xd6\\n\\xb0M#\\xd9\\xf6\\xbf\\x8f\\xfc\\x1c\\x9b\\xcd\\xef\\xf3?\\xd36\\xc4\\r\\x10c\\xbc\\xbfrAw\\x1a\\xe0\\xd0\\xbc?6\\x96\\xb3\\x8d\\xadg\\xfa\\xbf\\xf0\\x1b\\xb9\\x8f\\xe4\\x07\\xbe\\xbf\\xcb\\xa4\\xc9}\\x9f\\xa2\\x0b@S\\xc3:@:\\xee\\x06@\\xc1\\n\\xb0\\xce1I\\xeb?\\x85!t\\xbfb\\xb2\\xf0?\\x03\\x8d\\x8f\\x8c\\xdc\\xac\\xe4?\\x8bM\\x9fW\\xbao\\xc8\\xbf0vv\\xcc\\x05$\\xc2\\xbfe\\xe1w\\x10SQ\\xf7?\\xa5\\xae\\x08\\x94ij\\x00@\\xad-\\x17\\xc1=A\\x00@\\xa7,f\\xc1T\\x19\\x03@)\\'n\\x9dI\\xe1\\x0c@\\x00\\xba<&\\xaa\\xc8\\x14@\\xef\\xc5Vv\\xd1v\\x14@\\x89\\xc8\\x12\\x01wT\\xca?\\x92S\\x97\\x17:\\\\\\x0b\\xc0\\xbc\\x1ffn\\xeb\\xb4\\xf8\\xbftu\\xb9=\\xc9\\xef\\t\\xc0\\xee\\x18\\xea\\x93\\xb6\\x05\\x05\\xc0\\x98\\xfbb\\xa6\\xfcn\\xe4\\xbf\\x92\\x84\\x06\\xfc)\\xbd\\xc7?d6\\xddb0\\xd8\\xf3?b0?O}y\\xd5?\\xd5\\\\\\x07C\\x9f\\xf7\\xf8?\\x84\\r\\x98\\xcf\\x8e+\\xff\\xbf\\x11\\xd8z\\xcc\\x12\\xc0\\xf1?q>\\x1cmk?\\xaf?-\\x8d\\xfe\\xd3\\x8a\\xdc\\xd0?#lIH\\x12 \\x12@\\xfa\\xeb`\\xdd\\x062\\x1a@\\x8e\\x014\\x9f\\xa2R\\x04@\\\\\\xa5\\xb2\\x1c\\xb7a\\x02@\\x835\\xb9G\\xfa\\x12\\xd9\\xbf\\xf6`\\xc2Ch\\x84\\xb5?\\xde=\\x0e\\xea\\x89\\xab\\xfa?)\\r\\xd3\\xaej\\x08\\xd8\\xbf\\xe6\\x19\\xf5\\n\\xabI\\xcc\\xbf\\x12y}\\x975Z\\xf7\\xbf\\xd3`M$>%\\xe4?\\xf3\\x17\\x7f\\x06*\\xb8\\xf6?\\xba$A\\xf7\\xa9\\xb2\\x0b@\\x1f;\\xe7\\x08\\xfa\\xe9\\x17@\\xdb\\xa2\\x9b\\xee\\xb0\\xf9\\x1b@7r,\\'LL\\x0c@5\\xbf}\\x9e;\\x95\\x04@\\xdc\\xff\\xdd\\xc1\\'\\x98\\xbb\\xbf\\xfc\"p<\\xf3\\xb7\\xd8?%\\xd6\\xf3O\\x9bK\\x00@\\x9b\\x02r\\xed**\\xf7?vn\\x90\\x05\\x89\\x16\\xd5\\xbf\\xacM\\xadi{\\x87\\xe3?&\\xbdc\\x127}\\xf1?0\\xdb\\x18bW\\xf1\\xf3\\xbfi\\x97c\\xa3\\xdd\\x15\\xdf\\xbfs\\x0b\\xe5\\xc0\\x8e\\xba\\xcb\\xbf\\xd7\\xbc`\\x990\\x8e\\xf2\\xbfV\\x93\\xb8\\x7f\\\\\\xbd\\x15@$\\x89\\x07\\xe7\\xf9-\\x14@J\\xf7\\xe5\\xe83v\\xf4?\\xb6\\xc7\\x0f.\\xe7\\xb7\\xf4?7R~\\xb3g\\xe4\\xb5?\\x05d\\xd3\\x1c6\\xcf\\xea\\xbfd\\x98\\x04\\xb6\\x8a\\xdc\\xe3?\\xff\\xfdw\\xdf\\xf1\\xc2\\xf5\\xbfk\\xa9\\x04\\xf7\\xc4!\\xf4?(r\\xf2\\x16\\x90Q\\xf6?E\\xd6/\\xd3\\x17&\\xfd\\xbfFc\\x13\\x1e\\x9d[\\xf6?\\x02V(6\\xb1R\\x07\\xc0u\\xca\\x10\\xa5\\x05,\\xc2?\\x15:\\x8c\\n\\x00\\xe3\\x1e@\\xf5\\xb4\\xb8\\xa2\\x0b\\x88\\x10@\\xbd\\xe7H\\x8eRl\\x0e@\\xac\\x18L\\x0f^(\\x05@`g\\x7f(\\xeeu\\xe1\\xbff\\x15\\xf0\\xc5\\x94\\x8c\\xe3\\xbf\\xc1\\xdc\\x0bcw\\xc9\\xea?\\xfd\\x15\\xb7\\x07\\x04\\xf2\\xd9?\\xc0\\xfbk\\xd2\\xb6\\x8d\\xd8?\\xf5\\xbd\\x9c\\t_|\\xe2\\xbf\\r\\xb0loQ\\xbb\\xe0?\\xc1\\x10\\xf4\\x15\\xbb\\x0e\\xd7\\xbf\\xfbe1g\\x8d\\xe1\\xca?V\\x1b\\xccr\\xee+\\xdb?\\x1b\\xcd\\xd5\\xeb\\xab[\\r@\\xda\\x8aWZ\\xb5(\\x00@I\\x04\\x06\\xef\\xc9\\x86\\xed\\xbf \\x106\\xaa\\xba\\x06\\xca\\xbf\\xf0k\\x0c\\x10\\xfc]\\xd9\\xbf0t{\\xd9\\xe3\\xe2\\xee\\xbf\\x07\\xc0j\\x87\\x9c\\x00\\xd2\\xbf_\\xdcd\\xba\\xd9\\x9c\\xe0\\xbf\\x8b}9\\xe3\\xfa\\x9f\\xc9?\\x89;6\\xf3e\\xc1\\xf8\\xbf\\xd2\\x92\\x91\\xfe\\x9f\\xdd\\x00\\xc0(Yj\\xe1\\xbb8\\xf0?y\\xc37/:N\\x80?\\x91P\\xa5_\\xa0\\xf6\\xd9?6Q+\\xceO\\xa8\\xfb\\xbfsu\\x07\\xc8\\xbez\\x03@\\xfbir\\xca;\\xa7\\x0f@\\x1a\\x1c\\xcd\\x97\\t\\xdf\\xe3?\\xf4\\x94\\x87\\x8fW|\\x02@\\x00\\xe9\\xe3\\x15-\\x85\\x01\\xc0Q\\x1f\\xbc\\xc0\\x1ad\\xf9?\\xe0\\x85\\xc3x-\\x87\\xed\\xbf\\xe7\\xe9\\x8a\\xc28\\x84\\xe9\\xbf\\xfe_\\xfe\\xbf\\xb0\\xc6\\x02\\xc0&\\x99-\\xe9\\xc3\\x81\\xf2?\\x01\\x97\\xb6\\xbdM\\x91\\xe2?\\'Y\\x100\\xd6K\\x05@\\xcf\\x11A?\\x1eS\\xd2?X\\xa0\\xe0\\x9d?P\\xf8?\\x03\\xc4E\\xb9\\xae\\xf7\\xe2?\\xf0+LPP\\x95\\xe6\\xbf\\x14\\xabd/Ha\\xee?\\xcc\\xb2&)D\\x14\\xf2\\xbf>\\x8ap\\xc4\\x03\\xc2\\xe4\\xbfNlW~:\\xa7\\xde?\\xf05\\x11I\\x072\\xf1?\\xeb\\xe5\\xa4\\xe6\\x8a\\xcd\\x90?\\x81A\\x8e!\\xac\\x1e\\xfa?9\\xaa\\xc6=jD\\xde\\xbf\\x03F\\xa1\\x1d$\\xc1\\xfa?\\xfc\\xfbx\\xe4~p\\xe0\\xbf\\xa6Q\\xb6U\\x8d\\xc3\\xe1\\xbfZ\\x98|\\xaca\\xa4\\x96?H6\\xb11\\xe9\\xba\\xf3?\\xdb\\x944z\\xa8\\xd0\\xf7?\\xfb\\xf1\\x05h\\xca\\x07\\t@\\xaa\\x1d\\x1f\\x7f\\xc99\\xe5\\xbf\\xe8h\\xb2`\\x8d\\xa4\\xe9?G\\xce\\xcc\\x89\\xbc\\x19\\x03@5\\x13\\xa6\\xd185\\xe5\\xbfv\\xc6\\xe2\\xda\\x95\\xd6\\xc7\\xbf\\x86L\\xe1\\xec\\xfa_\\xda?2\\xbf\\x9b\\x1f1\\xcb\\xd9?\\xfey\\x02ZQ\\xe9\\xe7?(\\x13\\x04\\xb7\\xe3\\xe2\\xd6?\\xb8&\\x91\\xd6$t\\xee?M\\x14?Gg\\x96\\x03@>\\xb4\\x8by]R\\xcb\\xbf\\x0ck\\x16\\xb7j\\xd4\\xee\\xbf\\xde\\x9e\\xdf\\xf0&\\xa5\\xe6\\xbfW\\x05G&\\xc4\\x8f\\xe6?\\x02B\\x88\\xf0\\xe2G\\xc0?i0mE\\xc1B\\xef?\\xf6\\xfb\\xcf\\xdb6\\xdc\\xdb?i\\xd5\\xd2\\xb1\\xb2D\\xe8\\xbf\\xf3x\\xa4\\xbd\\xb0\\x82\\xe8?\\x8d\\xc5\\x05[\\x0c@\\xf3\\xbf\\x0b7\\x0f\\xcb\\xa4-\\xe0?c\\xfc\\xda\\x84=:\\xf8\\xbf6\\x0c\\x18G\\xf0x\\x06@\\x8dZU\\x16_\\n\\xb9\\xbf\\xd7\\x91\\xd6\\x1a2\\\\\\xe9?\\x05\\xce\\x9bhT\\xc4\\x02@/\\xfc\\xe9\\x81\\xc4\\xc9\\xd5\\xbf\\x1d\\xdb\\xb4L\\x92\\x0e\\xed\\xbf\\xce\\'\\x9e\\xad\\xea\\xa7\\xff\\xbf\\xb7E\\xc1\\xcd\\xa6\\xb2\\xd2\\xbf\\xce&6\\xd5\\x1a1\\x90?\\xec(\\xcb\\xdfK\\xb0\\xa9\\xbf0>+e\\x8e\\x8a\\xf8?\\xd9\\xaa\\xb6e\\x8d\\xba\\xe2?\\x88\\x9a\\xf8}\\x02\\xf4\\xea\\xbf\\x9f\\x96\\xdb\\x8e%\\xf5\\xf2?\\x03M\\xeb\\xd8\\xd2_\\xfe?\\x03\\x0b.\\xe0J\\xcc\\xff?\\xf7\\xbe\\x82@BX\\xec?\\xae^\\x0f\\xf58\\x93\\xe2?\\x12-\\xa3R\\xcc|\\xea\\xbfi;j\\xe6\\xf3\\x98\\xef\\xbf7\\xfcq\\x93\\x91\\x99\\xd7?\\xdc\\xee\\x18\\xf7\\xc5\\xa5\\xf5?\\xf1\\x9b\\'\\x08\\xf8\\xb4\\xe7\\xbf\\x8e\"k\\x93\\xeb9\\xf6\\xbfU\\x9e=?\\xf9G\\xfe??\\xf3\\xf0D\\xd0\\x91\\xc7?#3Uz\\x95D\\xc4?8\\x84\\x9el\\x13\\x12\\xf2?I\\x16\\x83b\\x8a\\xe0\\x81?_\\xb0GX\\xfc\\x07\\xdb\\xbf\\xc9\\\\\\x04\\x05\\xc8Y\\xd6\\xbf\\x03#\\xe2\\xe5-c\\xe1?\\xfe\\xffS&\\x945\\x05@\\xbd\\x9e\\xb6\\xdb\\x8c\\xd8\\xf2?\\xeb\\x0b\\xd0\\xe5\\xac\\xbf\\xf0\\xbf\\x98\\x1462Nv\\xc1\\xbfz3\\xf2\\x96\\xde\\x88\\xc0?]_#S8\\x07\\xf0?\\x960\\xad5\\xf2u\\xe7\\xbfV\\xbe\\xf6\\xd3\\x17\\xb7\\x08@(\\x08O\\x8f\\xfex\\xce\\xbfL\\xc3\\xfa\\x84\\t\\xe2\\xfe?;\"\\xe7\\x92\\x16\\xfd\\x02@+\\x88ro\\x7f\\x9a\\xf5?\\x12\\xc4\\xc4l\\xea\\xd7\\xf4?\\xfbn\\x19l\\xde+\\xef\\xbf\\x9d\\xe5\\xc9\\xae\\xac\\x08\\xe3\\xbf\\xa8\\xca\\xeb\\x87\\x11\\xdc\\xf3\\xbf\\xfb\\xdfz8\\x92\\xa3\\xd5?>\\xcedm\\xc1N\\xda\\xbf\\x86\\xbe\\xc8\\x12\\x82\\x89\\xf0\\xbf\\x169\\x7f>0m\\xe6\\xbf\\'\\x90\\xd2\\x9fk\\xcd\\xed\\xbf}\\x92\\x1d\\xd3\\xd1\\xde\\xd4?\\x1b\\x85\\x84\\x96\\x03H\\x04@\\xf0KE\\xe6\\xafz\\xf2\\xbf5\\xf4W\\x987\\xf6\\xf7?/\\x8d\\xcah{\\x06\\xf2?Vq\\xf2w!\\x90\\xee?\\x05\\xfas!n\\x07\\xe3?\\xec\\x936\\xc5\\xa4%\\xe4\\xbff\\xec\\x11(\\x1c\\xbf\\xb2\\xbf\\x10Vv\\x0b\\x0c\\xa4\\xf6\\xbf\\x95c\\xf1x\\xb1:\\xe9?d\\xa9\\x08)\\xa1*\\x04\\xc0\"!yi#$\\xdf\\xbf\\t\\xad\\x00\\xe1\\xeb\\xfc\\xf9?^\\x9eP\\x95\\x00\\xe9\\xf8?\\x83\\x1d2l\\xae\\xb8\\x06@\\xce\\xa3\\xc6\\xed\\x01\\xbb\\x05@V\\x11\\xeays/\\x02@\\xcf\\xf0,\\t#;\\xee?]\\xaf\\xcfO(;\\xeb?V\\x1c\\xbe\\x8a\\xca\\xb0\\xfb\\xbf\\xb1\\x8eSo\\xcaa\\xd1\\xbf\\xb8\\xf11\\xd4%\\xbd\\xdf\\xbf\\xb9|\\x05\\xd8f\\xc4\\xf0?\"1\\xfdu\\xcam\\xe3\\xbf\\xe1\\x07VG\\xea\\x91\\xf7\\xbf\\x98\\xbb\\x13E\\xa9\\xd2\\xfb\\xbf\\xed\\x00@\\xe3^\\x86\\xf1\\xbf\\xcd\\xe0\\x8f\\xca\\xbf}\\xf9\\xbf\\xc5\\xf9,\\xe0\\xf2{\\xd6\\xbf\\x82\\xb1D\\x12\\t&\\x00\\xc0&\\x12R}C\\xa1\\xe8\\xbf=Y\\x19\\xb6P\\x9c\\x01\\xc0e\\x03&\\x9e3!\\xdb\\xbf\\x92\\xf3\\x87\\x88\\xc1\\x15\\xee?{\\xe6g\\x85\\xb7A\\xf8?\\x88.8\\x8c\\x97\\xa1\\x00@2\\xe5\\xbc\\xba\\x10\\xab\\xd2\\xbf\\xde\\xca\\x00f\\xb0)\\x02\\xc0@\\xcc\\xfc\\xbf\\xe9f\\xfa\\xbf\\xc7*\\x8c\\xe6u\\xf3\\xf1?\\xbeWl\\xd1\\x0b\\x02\\xf3\\xbf\\xd1zi\\xfaE-\\xf2\\xbf\\x17\\xc9\"\\xf2\\x16t\\xc4\\xbf?7\\xb0\\x11\\xafC\\x03@\\xbav\\xb7B\\xb38\\xf7\\xbfr\\xd5P\\x0f>g\\xd3\\xbf\\xd1\\xa8Z\\xc4\\xc4U\\xf0?\\xb3\\xe4I\\xda2x\\xeb?\\xf2\\x9d|Yh\\xe4\\xca?W\\xe0/K\\xca\\xbe\\xe2\\xbfWzO[jV\\xda?\\xb0\\xb8r\\xe7\\x1d\\x95\\xc4\\xbf\\xfd%\\xa0\\xf2\\x9b\\x91\\xe6\\xbff\\\\\\xa4\\xb1\\xee\\n\\xf3\\xbf\\xe3\\x05;\\xc5\\x11\\x17\\xea?\\xcb\\xc3\\xba\\xcb\\x94k\\xda?\\x86\\x07\\xb9\\xc0X\\xac\\xd3?T\\xd5S:\\xa7\\x86\\xe0\\xbf6\\x856T\\x93g\\xf7\\xbf\\xe8\\xb8\\xdek@\\x8a\\xc8\\xbf\\x9e\\xd6\\xadMR9\\xc8?\\x17\\xbf\\x992\\xafL\\xec\\xbf\\x01\\xdf\\xf1\\x8fn\\xac\\xf3\\xbf\\x18\\xd9_\\xdab&\\xe8\\xbf\\x08}\\xa6M]&\\x0b@\\xd3\\xd6G\\x06\\xc4J\\x07@\\xf5\\x89\\xda\\xe6\\x8d\\xc3\\xd6?\\xec\\xab\\x9b\\x88bW\\xd7?\\x80\\x16^\\xe1\\xf4\\xc9\\xee\\xbf\\xcf\\xf1aIa\\x98\\xe6?p\\xdc/\\xf8\\xb8\\x1a\\xd8?Y&y\\x9f$9\\xe3\\xbf\\x10\\x1e\\x05$2B\\xe6\\xbf\\xa1\\x86\\'6\\x8e\\\\\\x00\\xc0\\x89\\xad\\xcd\\x8a\\xdb\\x81\\xf2\\xbf\\xd8\\xff\\x94\\x84\\x9b\\x85\\xb7\\xbfc\\x01\\x1f\\x97\\xe7\\xcd\\xe3\\xbfE\\xe0j\\xd2\\xe7?\\xde\\xbf\\x10\\xb2?\\x89:\\x95\\xf3\\xbf\\xe1\\xbclY\\xc1\\xd9\\xd4\\xbf?c\\xbb\\xb7\\xa0\\x8f\\xdb?h\\x1ea\\xb3\\x8b\\xfa\\xe6?\\xba0\\xf7\\xd0a2\\xd3?\\xbai\\xf6sJ\\xd6\\xf0?\\xfe\\x97\\xa8\\xb8\\'o\\xcb?\\xde\\xab\\xb8X&\\xb0\\xe4\\xbf\\x02hSh8<\\xe6?I#\\xa8\\xfe\\xe0t\\xfb?\\xa5L\\\\Q\\xd7\\xe3\\xed?\\xb8C\\xf3WH4\\xf4?{c\\x84\\x14\\x97U\\x07@\\xc8U\\xc9\\xadb_\\x02@\\xb3\\x8a\\xb2\\x05];\\x05@\\xe1\\xa7b\\x08\\xd9q\\xf2?7E\\xcd\\x90*\\x88\\x00@\\x94\\xac\\xfe\\x9f\\xb4\\x13\\xa1\\xbf\\x19\\x05-\\x90\\xe4\\x03\\xee?w\\x054\\x91\\xce\\x98\\x9e?\\x8e>\\xcf\\xd7\\xdc\\xb0\\xe0?1{\\x80\\x92\\'\\xb3\\xc8?[Z\\xf0\\xf6\\xa7W\\xd3?\\xd3[p\\xae\\xbc\\xfd\\xb2\\xbf\\xf6\\x80\\rJ\\x8d{\\xc5\\xbfs\\x1e\\xe1\\x16sK\\xbb\\xbfL!\\x10\\xf0\\xb8r\\xd5\\xbf,Q\\x86\\xd2\\xf4\\xd5\\xd4\\xbf\\x02\\x08\\xd4F\\x84\\xc1\\xe8?\\xcd.\\xc6\\xa8\\xa5\\x17\\xd8\\xbfa\\x896\\x81\\xb4\\xd1\\xcb?\"4\\x98g*\\x0c\\xc0\\xbf\\xfd\\xc3o\\x84\\x15(\\xe8?Q\\x04\\x13Xa\\x90\\xf3\\xbf[\\x18\\xc8\\xf6U\\xd1\\xe5\\xbf\\xd6;yS\\xf1\\x86\\xd9?\\x04\\x99\\xac\"/\\x1c\\xe1\\xbf\\xb1_qnc\\x8d\\xe3?\\xdc\\x11\\xa4\\xb3\\xc4\\xa4\\xe2?\\x81\\xda\\x8eG\\xd2\\xcf\\xd0?\\x83n+-\\x86\\xa4\\xd6\\xbfb\\xaf\\x880\\x871\\xd7?\\x1d\\x8f\\xaa\\xac\\xa6\\x1b\\xe2\\xbf1\\xa5\\xee-\\xe1\\xe2\\xe7?\\x05\\xd4\\n\\x00\\xad\\xa6\\xe1\\xbf\\xd8\\xbeq\\x92\\x88*\\xc4\\xbf\\x02o@\\xaa\\xcf\\xd0\\xc2\\xbf4\\na\\x8e\\x90=\\xa6?d\\x18\\xb9\\xfc\\x10i\\xed\\xbf\\xe8D\\x17\\xca\\x04\\x06\\xe3\\xbf\\rJ\\xc0\\xc9\\xff\\x8c\\xfb\\xbfq\\x95pV\\x01\\x8e\\xdd?\\xb7\\xf2\\xdd\\xb6{5\\x02@\\xfc\\x08}\\x98#{\\xe4\\xbf\\x0b.\\xbc(\\xe5X\\xca?\\x1a\\x93\\xc4\\xdb9\\xe3\\xc2\\xbf/g\\x18\\x92\\xea\\xa1\\xff\\xbf\\xc89\\xed\\xb9\\xf7\\xbf\\xd9?\\xdc\\xd9\\xf2Z\\x95\\x87\\xd8?\\x06\\x8c)\\xe1\\xb7\\xe0\\xe3\\xbfI\\xba\\x1d\\x0e\\xcbI\\xc4\\xbf\\xf2N\\xa1iLF\\xf2\\xbf\\xff\\x04\\xc6qq1\\xf3\\xbf\\xe7b\\x8d\\x95\\xee\\xf3\\xea?E\\xb7\\xf3\\xb8\\xc7\\xc0\\xce?ag\\x1dQ{\\xb4\\xf8\\xbf\\xce\\xbeB\\xae\\xd3E\\xc0?_\\xddq\\x12l\\xac\\xc9?\\xc5X\\\\*~\\r\\x85\\xbf>\\x8e\\xda\\xb0\\xe1\\x18\\xa3?\\r\\x01\\x8e\\xd3\\xd8U\\xb8?\\xa6\\x97zO\\x1aX\\xe1?s\\t\\xec\\xf5o\\x12\\xc6\\xbfu\\x99y\\xf8\\xd7\\x13\\xbf?DX\\x82\\xf2H\\xb3\\xf7?\\xd8\\xb2\\xf3\\x8c-\\xe0\\x94?\\x9d\\x0f\\xffk\\xf7\\xcb\\xda?\\xd2\\x8bWp\\xc3\\x05\\xd4\\xbf\\xa0\\'DL&\\xb9\\xcb\\xbf$%@\\xff\\xce%\\xf5?\\xdc\\xc9h\\xbc\\x920\\xf0\\xbf\\xf5U\\xeb\\xbc\\x11Q\\xee\\xbf\\xc45\\xdd\\x91+a\\xc6?\\xb1\\xd5s\\x88\\xa7\\xbd\\xc9\\xbf2.\\xf5\\xd9hX\\xa5\\xbf\\xa8\\xf5 )\\x01\\xf8\\xf0?\\x8e\\x0c1\\x1f\\x8e\\x7f\\xf4\\xbf\\x14\\x9d\\xaeG<\\xcc\\xa2\\xbf\\xa6$\\xe4\\xe8K\\xad\\xe0?b*X\\x0bG\\x08\\xc3?\\xfe/\\xf5Z\\xd9\\xc1\\xef\\xbf+\\xbe\\x80\\x15zC\\xe2?\\xebo\\x00\\xa0\\xbex\\xe6\\xbfX=\\xf5\\x85\\xc9 \\xdb?v\\x07\\xddxv\\xb2\\xe0?\\x89\\x88w\\xac8\\xa0\\xe6\\xbfy\\x8bK\\x8aG\\x1a\\xf6\\xbf7\\xadp\\x8b\\xf0\\xb2\\xe2\\xbfq1e\\x05i\\xad\\xcb\\xbfW\\xa8\\xd8\\x03\\x9c\\x9b\\xed\\xbfY77\\xecZ(\\xe3?\\x88`*\\xd8\\xf0\\x8f\\xd6?i\\x91\\xed^\\xe6\\xb7\\xf1\\xbf\\xa3p\\x10\\xa6\\xe6\\xbe\\xbf\\xbf\\x8f{\\xad\\x19\\xf7C\\xf4\\xbf\\xdf\\xba\\xc2\\xf9MN\\xdb\\xbft\\xbf~k\\xe3f\\xd6\\xbf5<\\x97(\\x0cW\\xd6\\xbf\\xee\\x87\\xf2\\xb9`\\xd2\\xb7?.\\xf1+t\\x9fB\\xb5\\xbf\\x0fbe.\\xe1\\xf9\\xc0?\\x1a$X.\\xad\\xbd\\xd9\\xbf9K\\xcc]\\xbe+\\xd7?\\xac\\xda\\x91\\xde\\xb2\\xbe\\xd6\\xbfZ\\x84\\x90<\\x80Y\\xf7?\\x10x}\\xbb\\xd7\\xb2\\xb2?\\xd2|\\n\\x0b\\xd3\\xc2\\xf0?\\x90\\xf1\\xd2N-j\\xe2\\xbf$\\xbd\\t\\xaaZ?\\xd8?~\\x9b\\x8cE\\xe9\\x84\\xca\\xbfEA\\xbc\\xc2@\\x01\\xe4?\\xdc(4\\x08;F\\xf3\\xbf\\xe2\\xd3\\xda\\x02\\xb1\\xe1\\xd5?\\x1b\\xf9\\x07\\xe92\\x80\\xf1?\\x1a\\t\\x98A\\x11\\xac\\xfd\\xbf\\xc6\\r\\xde\\xfc\\xd1\\x14\\xc0\\xbf\\xd0*\\x89T\\x0fy\\xdd\\xbf\\x7f~n\\x9d\\x13\\\\\\xe2?\\xcf\\x08\\xc8!\\xe0@\\x9f\\xbf\\xec\\x93\\xf1N\\xc1)\\xfa\\xbfGjSug\\xf8\\xb8?id\\xc3\\x0f\\x19\\xeb\\xc2\\xbfD\\x1f\\xcd\\xc7\\xe7\\x1d\\xb3\\xbf\\xec\\xd2M[\\xb9B\\xc4\\xbf\\xcek\\x0e\\x94\\xa1h\\xbf\\xbf%\\xd1\\xcd6\\xdcD\\xef\\xbf\\xa6!\\x88d_\\xdc\\xbc?\\x13\\xf3t\\xce\\xba\\x9eF\\xbfT>\\xd9l\\xbdp\\xf1?\\x82\\xf3 \\xee\\xcbc\\xff\\xbf\\xd7H\\xb0,&,\\xb8?\\x0c\\xce.\\xe9\\xd4\\n\\x8f\\xbf\\xc0\\xa5\\xcd~\\x1d\\x07\\xe3\\xbf\"yX\\xa9\\xa2\\x17\\xe8\\xbf\\\\\\xbf\\x0f\\x9a>|\\xfb\\xbf\\x95\\xb9\\x87\\t\\x88\\xad\\xe4\\xbfC\\x9e4\\xaf\\xe8\\x8e\\xe0?u0{\\n\\xf6\\xfd\\xef\\xbf\\x03\\x1f\\xaaa%\\xc4\\xf6?~\\x9f4\\xec=\\xf9\\xb2?1\\x89\\x9dCA\\xbd\\xed?\\x98\\xe6\\xc1\\xca\\xb1\\xb1\\xf1?0u\\x96\\x90\\xd7v\\xfc?\\xaa\\x1fx\\xc5\\x05z\\xe3?6\\xad\\xa1\\x1e;\\xbe\\xb7?\\xf7HDW\\x19-\\xea?\\x0e\\xf3a\\x92m\\xd9\\xff?\\x14\\x13]\\x0e\\x82>\\xf1?\\x81\\xfb|[g\\xf3\\xa4?\\tn>\\x81\\xb2!\\xdf\\xbfc\\xc5\\x81z\\xec\\xd9\\xee\\xbf\\x93\\xb0\\x87\\x144\\xc3\\xf8?\\x06l\\x04\\xaf2-\\xba?\\xe9\\xf4Y\\xb3\\x12\\x06\\xdc\\xbfm\\x95\\xbf-2<\\xfc\\xbfh\\x82\\xe0M\\xe7\\x1e\\xf6\\xbf\\xae\\x1a\\x957\\x988\\xba\\xbf\\xf9\\x85\\x7f\\xfdjo\\xca\\xbf/<\\x9a(w\\xf3\\xa9\\xbf\\xdd\\xbb\\xd3\\xdb8=\\xc1?\\xca\\x9eDF\\x0e\\x81\\xcf\\xbf\\x0b@\\xb8\\xbe\\x17\\x7f\\xc8?\\xf5\\x7f1\\x91\\x9c\\x95\\xb8\\xbf\\xd6\\xf3K]~\\xe5\\xe1?i\\x1b\\x11\\x8c~\\x84\\xe9\\xbf\\xca\\xe3)\\xc1\\x87\\x03\\xf7?*\\x02\\xfe\\xed\\x886\\xf7?\\x15\\xab\\xe5\\xbe5%\\xfa?\\x1d\\x81\\x00/\\x80k\\xd8\\xbf\\x91\\xe1\\x03\\xf4)\\x8f\\x04@t\\x13\\xe8V\\r\\xe0\\x00@\\xcbp\\x92$\\xb0B\\xf2?U\\xc6\\xd0/\\xa9\\xf6\\xdc?\\x81%\\x8a5\\xb7\\x99\\xf8?*\\x1aL\\xfap\\x9e\\xff?\\xc3\\x9dO\\x0e\\x06:\\xe9?5L\\xf3/g\\xcb\\xd3?Q\\xafs\\xe3\\x89\\xf0\\xf5\\xbf\\xd4\\xb8\\x82\\xec\\x1c\\xd3\\xf7\\xbf\\xa7-\\x8bg\\x9f\\xed\\xca\\xbf\\x01_\\xef\\x82\\xe2\\r\\xf6?\\x96H\\xee\\x0f\\xf3Q\\xf1?s\\xe8H\\x820;\\xd3\\xbf\\xfd\\x1d\\xe2\\xd6\\xfcw\\xe0\\xbf\\x89\\xd9\\x1e\\xc0\\x7f\\x03\\xcc?[\\x8d\\x80\\xdbaz\\xeb\\xbf\\xe2\\xaf\\xbadZO\\xe7?V\\xa9\\xfb\\xdf\\xf8\\x87\\xd8\\xbf\\xf3.\\xf9\\xe0\\x83\\xa6\\xf2?\\x06^ik\\xa1<\\xe8\\xbf5\\x01\\xc6\\xbc\\xf0+a?h\\xe1 \\xb2Y\\x7f\\xf0\\xbfP\\xa3\\x06TW9\\xf1?\\xd3\\x12CP\\x172\\xea?\\xc1\\x13\\x15-K\\x88\\xf0?\\xb5\\xb0\\x8em\\xc2\\x8b\\xc2?xw%o2\\x98\\xeb\\xbf\\xe6\\x8e\\xa1\\xa3e\\xa1\\xf5?){^\\x99\\xdf\\xd2\\x18\\xc0\\x0f\\x9e\\xb9\\x02f\\t\\xf5\\xbf\\xf4\\r\\xc9\\xf9|\\xfd\\xec?\\xb1\\xdcR\\t\\xa8E\\xef?\\xb3\\x08\\xb6-+\\xce\\xf3?4\\x11\\x05;1\\xcc\\xe3?\\xc9=C\\xa8%\\x86\\xe3\\xbf\\x89\\xdb\\x82\\xa7\\x1f<\\x07\\xc0\\xe5\\x1c\\x8b\\xd9i\\xeb\\xd7?\\x82:|\\\\\\xb9\\xb2\\xe3?=5\\xda\\x98\\xeb\\xba\\xce?\\xf9\\x95\\xe9\\xb9\\xc5\\xbe\\xd6\\xbf@?/\\x92x\\x0b\\xcc\\xbf\\xcf\\x99eS\\xb6\\x91\\xd0?F\\xc7\\xd0\\xca\\xa0\\x87\\xeb\\xbf\\x06@\\xac\\xd4\\x11Q\\xf6\\xbf\\xd9&t{ao\\xbb?\\x96\\xcd\\x10\\x9b\\x15\\x9b\\xeb?\\xe9d\\x81\\xf0\\x15r\\xe0\\xbf]\\x94\\xe3\\xf6G\\xa6\\xd3?\\r\\x08\\xea\\x96LS\\xf6?\\x16q\\xc1\\xf2\\xa9\\xef\\xd9\\xbf\\xa4J\\x8e\\xdfK\\xb5\\x03@\\xac\\xcd\\x9a\\xb5B\\x8f\\xf4?\\x87\\xf8\\x7f\\xf3;F\\x10\\xc0a\\xb2\\r\\x84\\x1f\\xc9\\x0b\\xc0\\xb4U\\xef\\xcd\\xadD\\x07\\xc0\\xa4\\x1e\\x9c\\x14\\x97\\xd5\\xfd\\xbfc:\\x00\\xdfD\\xe6\\x06\\xc0\\xc2H\\xca\\x93\\xc0\\xd8\\x10\\xc0\\xbeO-l\\x88/\\x0f\\xc0\\xe3\\xd1=L.\\xec\\x11\\xc0\\n\\xa0\\x14l&\\xb1\\x0b\\xc0\\xfb\\x1e^Gy_\\x12\\xc0\\xcb\\xf1\\xd8\\xa4\\xf1\\x92\\x04\\xc0Y\\xfa\\x14\\x9e`\\xd1\\xcf?\\x89\\xb1,\\x13\\xfe;\\xf0\\xbf\\xba\\xae\\x84C\\x8d\\x93\\xf0?\\x85}\\xf3\\x93\\xfb\\xe8\\x12@\\x02\\x86a6\\xf8\\x1e\\xf7?|\\\\\\x81\\x19Z\\xaf\\xe7?\\xbf&T6\\xf8\\xf9\\xc3\\xbf.\\xb2z_\\xd7\\xe2\\xf0\\xbf\\xe8FI\\xcd?\\x95\\xe0\\xbfa\\xffY\\xb1\\xde\\xef\\xe2\\xbf\\xcac^\\x9d\\x863\\xf6?\\xb2\\xb3R\\x14\\xf7:\\xc8\\xbfw\\x11U\\xec\\xa5r\\xf8\\xbf,S\\x0cem\\x16\\x03@(\\xbf\\xa9\\xa4\\x90:\\xe6\\xbf\\x85L\\x88\\xf5br\\xd2?\\xdcF\\xe7M%\\xfd\\xdc?Lzi\\x9a\\xb5k\\xf9\\xbf\\xd6\\xbf\\xee?L\\xee\\x00\\xc0l\\x18\\xe0\\xc2\\xea\\xbb\\xf8\\xbf\\xf6`\\xc4y\\xbe\\xe7\\x0e\\xc0\\xcc\\x0e[\\'\\x05X\\x0c\\xc0\\x07\\xd3~\\x12\\x92\\x15\\x17\\xc0\\x8c\\xe1\\x1f\\x8d\\x0f\\xd2\\x0e\\xc0\\xca\\xe0\\xbaWh\\xaf\\x12\\xc0G?@\\x02E\\xd0\\xfa\\xbfE\\xb4\\xc1\\x96g\\x88\\x00\\xc0b\\x8b\\xe6\\x89\\xfe2\\xe4\\xbft\\xec\\xea`\\xcf_\\x14\\xc0P\\xe6\\xe9\\x8e}]\\xe3\\xbf\\x9a.X\\x92L}\\x9e?C\\xd5\\xf4~\\xaa\\x83\\x8f?2\\x93@W\\x0e\\xec\\x01@\\x9c]\\xaa<\\xa9\\t\\x06@Ccs\\x88\\xe1.\\xf5?\\xaa\\x0c\\xcc\\xe8IQ\\xf4?\\x14Oe\\xfb\\xd7\\x9f\\xe1\\xbf\\'\\xc3Ai\\xf3r\\xd6?\\xd2\\x9f\\tJ]\\xba\\xdf?Ge\\xcc\\x10\\x93m\\xcf?\\xae\"\\xb4\\xa465\\xe2\\xbf\\x93\\x1d\\xc2{\\xca\\xec\\xf7?\\xd4\\xb5\\xf1\\x1f0g\\xd6\\xbf\\xe8}t#\\x84\\xfe\\xd2?\\xc08\\x89\\x1cp\\x89\\xf6\\xbf\\xb0\\xeb\\xc3\\xd6\\xbdt\\xda\\xbf/\\xe2\\xb0\\x04\\xc52\\xd0?q\\rgNc\\n\\x04\\xc0r\\xf7\\ti\\x99S\\xfa\\xbfQ\\x1f&\\xb5\\xf5\\x84\\xf5\\xbf\\xa74H\\xf1@\\xed\\x13\\xc0\\xd8\\x89cs\\xc2\\x81\\xd3\\xbf\\xbc\\x84\\xea;\\x16\\x80\\x18\\xc01\\xaa\\x0b\\x10\\xe2n\\xe9\\xbf\\xf4\\x9c\\xec\\x99\\xf1\\r\\x03\\xc0F\\xd4\\x00[\\\\\\xf6\\xf6\\xbf\\x1c\\xe8\\xb0z\\x80!\\xf5\\xbf\\'\\x11j\\xa8\\xe2l\\xa0?R\\x99\\xc6\\x11\\x1d,\\xb9\\xbf\\xa4\\xf6\\x94V\\xa3q\\xd3?\\xd3\\x11v\\xbb\\xc6Q\\xf2?1\\xfa\\x92f\\'z\\x02@\\xab\\x14r\\x7f\\x90(\\xea?\\xd01\\xbb\\x1b\\xd8\\xc9\\xe0\\xbf\\x83\\xf6\\xa3F\\x92\\xbd\\xbc\\xbf\\xa1\\xbf|\\x87.\\x9a\\xd4\\xbfn\\x12a\\xda\\xb0\\xad\\xf4?m\\x7f7\\x88\\xcc\\xd7\\xd9\\xbf\\xaa\\xfe\\xe97\\xd1\\xf9\\xdb\\xbf\\x9fM\\x1a\\x7f\\xff\\xce\\x01@!#\\xbb1)n\\xf8\\xbf8\\xf9\\xe0\\xbe>8\\xda\\xbf~\\xfd\\xde\\x97\\x1f\\xe9\\xf6\\xbf\\x01\\xb9\\xe9jX\\xf8\\xf1\\xbf\\x04o\\x1f\\xb2\\x1a\\xbd\\x06\\xc0\\xde\\x9e\\xfeMCc\\xfa\\xbfl(\\xfb\\xae\\x9c\\x8f\\x06\\xc0\\x9b\\xd9\\\\\\xab\\x9e\\x9e\\x01\\xc0\\x122\\xb9d\\xces\\x17\\xc0\\xdcK\\xd6\\x0e7e\\x17\\xc0\\xc8\\xb9$Hx\\xfd\\xec?!r!9\\xac\\xb0\\xde\\xbf\\xdbmZA\\x851\\xb2?\\x01\\xfbA\\xe5N\\x07\\xc4\\xbf\\x0b\\xc9\\'\\x90\\xa1\\x00\\xe7?;_\\xa1\\xf9\\x1dA\\x06@\\xd8;\\xb5\\xb9H\\xbf\\xd1\\xbf>C\\xd8\\xf8\\xf6\\xbd\\xdc\\xbfW@{\\xe1\\xe7\\xcd\\x8a?\\xd2\"\\xbaF\\xfcT\\xc8?\\x18\\x8a\\x90\\xb4\\x08\\xf3\\xd5\\xbf\\x97\\xdb\\x00\\x85\\x91\\xc5\\xd6?Z\\x1d\\x06t8\\xe4\\xe8\\xbfm>c\\xd1\\xbb%\\xf0\\xbf\\x87^\\xe0\\xf6\\x8c\\xcf\\xd2\\xbf\\xf5H-\\xdbHB\\x06\\xc0ln\\xdc>\\xb4\\xf6\\xda\\xbf\\x1f\\xc8\\xd3\\x9e\\xa99\\xd8?l\\x11QA\\x11\\x18\\xdc\\xbfcm\\x80\\xd7(1\\xf6\\xbf\\xf0\\x13[\\x10\\xa6R\\xf1\\xbf\\xb06\\xc2o\\xff\\xe7\\xef?A{}\\xa7\\xf0\\xbc\\xf0\\xbf\\xba\\xb6\\x1d\\xd8\\xdfs\\xe7\\xbf\\xfb}\\xdd\\xc4\\x9b\\xd8\\xe1\\xbfb\\x8e\\xaa\\xf63\\xc4\\x07\\xc0\\xd6{\\x9a\\x15\\xf8\\xf1\\x1b\\xc0\\xd8N\\xaf\\xd9\\xc0\\x04\\xee?\\\\!\\'\\x12g\\xd1\\x08\\xc0\\xfa\\x1b\\xcdo\\xd2\\xb4\\x00@)\\xe2\\xacmT\\xf6\\xe2?\\xe0\\x9e\\x0eA\\xc9&\\xe2?\\xc1R\\xb5\\'\\xd6_\\xe6\\xbfU\\x00\\x8420\\x9b\\xfb\\xbf\\xb5fo+\\xeaV\\xc7\\xbf.\\xf4\\xfa7\\xa2\\x89\\xfc\\xbf\\xe5tC\\xdan\\xb8\\xe3\\xbfg\\x12+\\xce=7\\xe2?\\x14~%\\xa7~\\xd7\\xf1?\\xb2\\xa1J\\xba\\x9e\\xb2\\xd7?:lR\\xbc\\x93^\\xf2?\\x04\\x1c\\x90\\x87\\x8b\"\\xbb\\xbf\\xb3u\\t\\xd2\\xd5+\\xdd\\xbfK\\x1eZ\\x8f\\xf1\\xe5\\xc9\\xbf\\\\\\xf5\\xd9\\xecSH\\xea\\xbfiM,\\xbc\\x10\\xee\\x01\\xc0\\x13z`\\xf7\\xeb\\xe7\\xeb\\xbf\\xcco\\xf6aT\\xae\\xf2\\xbf:a\\xe3\\xdf\\xde \\xee\\xbf\\xdd\\xa5[\\x15\\x7f\\xba\\xf5?\\x1c\\x0bq\\x13\\xc4\\x0b\\xe6\\xbfL\\xa2\\xebl\\xfdG\\xee\\xbfZ\\x02\\xfb\\xb0c\\xca\\xdc?0\\xf9\\xda\\xa9\\xcc\\xf5\\x1d\\xc0mRi\\x02$\\x91\\x03\\xc0\\x85Z\\xd5\\x83\\x94/\\xf0?\\x86\"\\x86\\x9fE\\x17\\xe4?\\xddj\\xc8\\xda\\xf3D\\x01\\xc0\\xdb\\xc8\\x9fEb\\xee\\x05\\xc0U\\xad\\x85\\xfa\\x8f\\x90\\xf4\\xbfj\\xe4\\x95pV\\xce\\x01\\xc0\\'Y\\x8f\\xc45\\x00\\x06\\xc0\\xe5i\\x18\\xc2s^\\x0f\\xc0\\xf8;\\xd8h\\x1bm\\x05\\xc0\\x86\\x83\\x04\\x80ZD\\xe3\\xbfD\\x86<\\xd1!\\x8c\\xc6\\xbf\\xd5\\xa5u.\\x9a\\xed\\xd2\\xbf\\xe1z\\xe7\\xcfIE\\xfd\\xbf\\x9c\\x98\\xab\\te\\x9e\\xb9\\xbf\\x88\\xfd.\\xba\\x80\\x1f\\xe1\\xbf\\x12\\x12\\xb4=\\xa8W\\xb6?I\\xbb\\x19\\xee\\xef\\xe7\\xf2\\xbf\\xb0\\xd1\\xb5J\\xdc\\xd3\\x06\\xc0\\n]mR:\\xa0\\x0e\\xc0f\\x8d~\\xf5\\xfc~\\xf8\\xbf\\x97n\\x9f)\\xa6\\xf4\\x01\\xc0\\xc8\\xe1\\x83\\x07\\xa0\\xe3\\xe6?\\x19\\x92\\x11r\\xb2V\\xec\\xbf\\x8c\\xabk\\x8f\\xc95\\x08@q\\xdd\\xfd\\x10\\x8cT\\x07@|~N\\xb6B\\x9a\\x13@\\x99\\x01<\\xa9\\xc2Z\\x0c@w\\x84\\x8d\\xf1s\\xbc\\xe3\\xbf\\x1eL\\\\Te\\xb0\\xe1\\xbf\\xba\\xd9w\\xbbg\\x9c\\xf9?\\xeeAR\\x8c\\x03+\\x03\\xc0\\xd2\\x92[&a\\x90\\xf1\\xbfl\\xb7 d\\x13-\\xf3\\xbf\\xf2DF\\xbc\\xad\\x12\\xf9\\xbf\\xee+\\xafa\\xabG\\x03\\xc0?x\\x1a9T\\x82\\xf4\\xbf\\x08\\x94\\x0b\\xfc\\xdf\\xfc\\x07\\xc0\\x14\\xe7~[GZ\\xf3\\xbf\\xf0M\\x15\\x1a\\xc7\\xeb\\xea\\xbf\\xdbm\\x96\\x87\\xef\\x9f\\xe2\\xbf:3Gv\\\\\\xbd\\xcb?\\x1ea\\xed}P\\x8b\\xc7\\xbf\\x01\\xce\\xc36\\x85\\xb2\\xdb?\\xd4\\x9a\\xa3{\\xcc\\x94\\xe8?!\\x1c\\xb0\\xcd@#\\xfb\\xbf\\x7f\\xf3\\x1a+\\xd8>\\xf2\\xbf\\x1c\\tj\\xa0\\x00!\\xe4\\xbf\\x965\\xa0J\\x9cP\\xfd?\\xfc\\x0e\\xb1\\x8e*E\\xfa?\\x91V\\xef\\x06\\xd7\\xaa\\xd5\\xbf\\x8e\\xa2\\x0c\\xcdC\\x06\\x07@\\xdbQ\\x9d\\xe5+\\xae\\x0b@%/\\xa3\\xf0\\xd9\\xfa\\x0f@\\x8c\\x19\\xde\\xeaze\\x1d@\\x02?\\xc8n\\x9c\\xf5\\x9c?c\\xaf\\xcbN\\xb8\\xec\\x11\\xc0\\x19\\'3\\x94\\x97*\\x0b@\\x97\\xdd\\x05T0z\\xe4\\xbf}g n\\xf0>\\xf4?\\xe4\\xa4\\xaa\\xd6\\xc5\\x82\\xc1\\xbf\\xcf\\xa0eo\\n\\xb5\\xd3?\\xc1\\xb8\\xb9\\xd4\\x0e\\x7f\\xc9\\xbfb\\xaaJ\\xe9\\xd5J{\\xbff\\x00\\x87\\xbd\\x83a\\xea\\xbf\\x92\\xa2\\xc5\\x07\\xb7\\xd8\\xdb\\xbfO\\xe0\\xabd=\\xde\\xe0?\\x84\\xc8CG\\x921\\xc0?~\\xb0\\x80\\xa6\\r\\x17\\xf3?x\\xc1Y\\x96\\x03\\xa7\\xe9?/2.\\xa7T,\\x84?[V]\\xff\\x93\\x84\\xee?\\x82\\xaeb\\xb7\\xfa\\x9e\\xe3\\xbf\\x04\\xe9\\xf6\\xb2\\xae\\xf7\\xdc\\xbf\\xef\\xff,\\xb5WH\\xd4?\\xe0_\\x83\\x9c\\x04E\\n@W*\\xfc\\xd9\\xc9<\\xe2\\xbf\\xe8\\xc2\\xf8%\\xe3\\x92\\x11@\\x0f\\x9d\\x11;\\x9f\\xbd\\xe1?$^y\\xf0{]\\t@\\xc2b\\xc4\\xa7\\x11.\\xed?\\'\\xbcj\\xca\\x16*\\x14@\\xb2\\xe0\\x9b@\\x8fJ\\x13@#\\x82\\xde\\xe4\\x06\\n\\xfe\\xbf\\r\\xaf\\xd6\\x83\\xcb\\xa5\\xf7\\xbfaC\\xdd\\x97\\xbd\\xa4\\xf5?\\xff>c_p\\x02\\xd4?\\xf9\\x0fX{+\\xf2\\xfd?m\\x07ZR\\xf04\\xff?\\xae\\xfc\\xb1) :\\xeb?Ty\\x8d?E\\x97\\xfd?\\xa9\\xcf\\xdaV\\x18j\\xb9\\xbfy\\x92\\xce\\xa3\\xba \\xe9\\xbf\\xd4\\xfd\\xef-?\\x19\\xf3?v\\x04o*\\xd9K\\x03@1\\xc0\\xad\\xe2*o\\xed?\\xad\\x07\\xd3\\x1e\\xab\\xc8\\xf2?\\x87\\xb7FVp\\xcb\\xe7?\\x12Ew\\t\\xa7\\x86\\xb7?n\\xbc\\xd7Jh)\\xe8?\\x94\\xb68[J^\\xed?JT\\xeb\\xa9\\xaa\\x03\\xc7\\xbfb\\x0b\\x0e\\xc4\\x07\\x1c\\xdd?\\xbd\\x15\\x9az*H\\xf3?\\x8aq\\xf4\\xa0 \\x18\\xe9?c3e\\xd4\\x8d\\xc5\\xf0?\\xab\\n\\xab\\xee\\xcc\\x05\\x08@\\xeek\\xe4@\\x17t\\x12@\\xe4\\xdf\\xbe\\xf4\\x7f!\\xe4?*\\xc8`9J\\x14\\xd7?\\xca\\xec\\x82\\'\\xc7\\xa0\\x12@\\x80lp\\xee\\x1d\\xe2\\xc4\\xbf\\xab\\xdd\\xeb^\\xcev\\x01@3`5\\xdd\\xf7 \\xe4\\xbfsn\\x00\\xea\\x19\\xbb\\x11@\\xec\\xd0aH\\x89\\xc6\\xe7?\\xcc\\xc8w\\x81CZ\\xf5\\xbf\\n\\xf6H\\xb7Ti\\x00@\\xbf\\xb3\\xe4\\xf6\\x01\\x9b\\xdf\\xbf,\\x9eZFZ\\x18\\xb6?6\\x16\\xe0\\xcb8\\x94\\xf3?\\x81+\\x05\\x0eJ`\\x07@\\x04&\\x9e$i\\x7f\\xfc?AZ\\x12^=-\\xeb?M\\xd7\\'`\\xde\\x93\\xf7?\\x15?\\xbd\\xb2p\\xc4\\xdf\\xbf\\xa4CK\\x12\\x0f?\\xea\\xbf\\xac\\x83\\xebo\\x1a\\xed\\x95\\xbf\\x0c/\\x04\\xd0\\xa9\\x04\\xc8\\xbf\\x8b\\xeby\\xcb\\xbaw\\xf8?\\x8e\\x84\\xf3r\\xb3\\xeb\\xbf?\\xb5&\\xc6\\x0f\\xd9\\x1f\\xca?\\x8b\\xe3\\x1b\\xd0\\xab\\xfb\\x9c?T\\x85\\xec\\xd2\\xd8\\xb8\\xf3?\\xba\\x04\\x0c@\\xddu\\xf0?$b\\xab%\\x00\\xf3\\xd2\\xbf\\xc0~~\\x0f\\xc2r\\xdd?\\x96\\x99\\x82B\\x863V? @\\xa5\\xe2\\xd2\\t\\xe6?\\x14\\xbb*\\xcf)\\xb5\\xd3?\\xfeJ\\x02\\xcf\\xda?\\x11@\\x99\\xbdx\\x95\\x1d\\x8d\\x14@\\xa3V&\\xed\\xc7+\\x05@w\\x8b&\\x112\\x0c\\x07@\\\\\\xd4\\xe3a\\x93\\xd4\\x0c@\\xbe\\xf3\\xfej\\xe3V\\x15@=\\xd0,\\xf7\\xf3\\xf6\\xf2?\\x99\\x9f\\xd9.\"\\xbc\\x01@\\xfb\\x82\\xbb\\x8e_[\\xf1?\\x17\\x12:\\\\\\x9eB\\xf6?\\x981\\xf5z\\x11\\xe2\\x03@o-\\x8d\\xa6\\xd4#\\x05@#\\x0c`~\\xd6\\xc1\\xe8\\xbf\\xd74\\\\\\xb1\\x1f\\xc1\\xce?\\xc2\\xccH*X\\x8f\\xe2\\xbfC;\\r\\x12nw\\xcf?e\\xa6\\xe4\\xfd\\x07\\xe1\\xf7\\xbf\\xb6\\xfc\\xea \\xa9\\xb7\\xca\\xbf\\xfdyJ\\xa0\\xc6\\x01\\xf5?\\xd8+\\x97\\xde\\x1b$\\xf3?\\'\\xcd\\xe3\\x13\\x00\\xe6\\x02@\\xc2\\x8b\\xf5\\xe8\\x1f*\\x03@\\x80\\x04\\x84\\r\\x87\\xb8\\x00@K\\xc4\\x12\\xcb$\\x02\\xf7?\\xc6|{\\xa5\\x81\\x11\\x00\\xc0\\xcd\\x9f\\xc9}a\\x91\\x00@\\\\\\xc8\\xc7^\\xed\\xa56?\\xa5O\\xb0\\xa1\\xa2J\\xe6?\\x07\\xbe\\xf78\\xbf\\x11\\n@\\xb0\\xc0\\x80\\xc64\\x8d\\x02@\\xfc\\xca\\xdb4L\\xf5\\xfb?\\xfdAV\\x9eC\\xcc\\xeb?\\x04\\xc4\\x0b0\\x04\\xd8\\xfa?\\x17\\xcf\\x8f\\xef\\xf6\\x1a\\x91?4\\xa8)\\xf8_\\xf5\\xfe? \\xa8\\x8f\\xd1?\\n\\x0b@\\xf6\\xd7\\x84\\xcc\\xd7\\x91\\x0b@`\\xb0\"C.\\xbf\\xf5?\\x96\\xee\\x8dP\\xcd\\x7f\\xf0?\\xb7\\xae\\xa8\\xc7L \\xef?M\\x00\\xf5\\xb2\\x9cm\\xe9?\\xa8\\xf7~\\xa4\\xc53\\xec?T\\xb3#\\xbe\\xd7\\xce\\xc0\\xbf\\x1f\\xd8\\xb5\\xf9[\\xb7\\x91?N\\xac\\xff\\xa9\\x1b=\\xec\\xbf\\x8fg\\x01\\x87H\\x82\\xf3?\\x01t\\xb1\\xbbZ#\\x0b@b\\x02\\x86\\xec\\x1c\\x1a\\x13@\\xbd\\xe3oxc\\x19\\x05@\\x85\\x81\\x99\\xc43m\\xde?`z\\x85\\x11\\xc0\\xd0\\xe8?\\x11\\xcay$W\\xa9\\xd7\\xbf\\xf8Z\\xae\\x80?\\x16\\x05\\xc0\\xe1-\\xb7:\\x0c\\xe3\\xf3?/,\\xac\\xde\\x1d:\\x04@.N=l\\xf6\\x1f\\xce?.m<^x\\\\\\xf5?\\xbd\\xe1\\x1dF\\x06\\xb6\\xec?\\x12Y\\x883\\xa8E\\xfc?\\x1f\\xdb\\x0c\\x0c\\xbd\\x95\\xfe\\xbf\\x1b\\xb9\\xfa\\x16\\x9b0\\xfb?\\x0e\\x0eDei}\\xd3\\xbf\\xf0\\x80\\xd1db\\x1c\\xf3?Zv\\xa8\\xd9\\x13\\xb9\\xf5?\\xe3\\x06<\\x91\"\\xef\\x02@\\x03\\x94\\x14\\x02\\xb8\\xbe\\x01@\\xf2\\xc2\\xf1Y\\x7f\\x8e\\x03@wE\\xad\\xa2\\xaa~\\xde?\\xa6\\x1c%\\x0b\\xec7\\xdd?4m\\\\\\x12\\xbe\\xac\\xa6\\xbf\\xfc\\x83\\x94S\\x97\\xaa\\xef\\xbf\\xdag+\\x8e\\xca\\x80\\xea?\\xf4\\x9awx\\xb9\\xdf\\xf0\\xbf\\x1d\\xb0N6\\xc8\\x1f\\xe2?\\x06\\xba9\\xe4\\xd5v\\xfb?\\x9e\\x81|\\x18\\xc4\\xbf\\x10@V\\xd0\\xe0\\xb0\\x96\\xa9\\xee?cl\\xcb\\xbb7\\xd4\\xea\\xbf\\xf7\\x99QG\\x00}\\xfe\\xbf\\xb8\\x19\\x0c\\xfes\\x98\\xe8\\xbfI\\xfa\\x1e\\xceM\\x1b\\xf5\\xbf\\x80\\x96\\x06\\xe4\\xdd\\x91\\x08@\\xc40\\x85\\xde\\xb4\\x07\\xd7\\xbf\\xde^}\\xf3\\xe8[\\x0e@\\xfaR>\\xc2$\\xb2\\xfa?b\\x83\\xeeQ\\x8a\\xd5\\x07@\\xdf\\xddm\\'OZ\\x05@9q\\xe2Gq\\xeb\\xf1?\\xfe\"\\xef\\x9cHr\\xfe?ho\\xc1\\x1f\\xce\\x95\\x05\\xc0\\x85\\x911Yg\\x12\\xd6\\xbf\\x00*\\xac~\\x14\\xb5\\xbd?op\\xc7\\xe2)\\x88\\xea?\\\\\\xbd\\xc4n\\xc7\\xd6\\xfa?\\x0c\\xb7\\xbb\\'\\xf2X\\xdb?r)\\xb9\\x94\\xc8\\xef\\xe3?\\xbbn\\xe9\\x80u\\xdf\\xf8?v\\x83\\xb0\\xad\\xd7\\x80\\xcb\\xbf\\x9cW\\xeb\\x0e\\x95\\xea\\xc3?\\xefs\\x9a\\'8\\x15\\xf1\\xbf\\xb9\\xd8\\xea\\xf4\\xb4@\\xe2\\xbfi\\xd6\\x83\\x91\\xbe\\x93\\xd2\\xbf\\xc1\\xa8\\xfe=\\x05\\xe3\\x07@\\x16B\\xa0\\xa8\\xf0\\r\\x05@.X\\xae\\xfftQ\\xde?#\\xf4\\xf8\\xe0\\x8b\\xb9\\xf4?\\x7f\\x18\\x15\\xc5\\xd5\\xf6\\xe3?`\\xc3\\xca\\x86Y\\xb9\\xcd\\xbf\\xf0=\\xf8G\\xcba\\xf1\\xbf\\xfd\\xa9Q?\\xad\\x85\\x02@\\nrd\\xc4j=\\xf4?X#z\\xc6~3\\xc5\\xbf?\\xa6\\xcfsm~\\xa1?\\xf7B\\xd3\\xbf\\xd2\\xe0\\xf7?D7\\xf9\\x080]\\xf6?\\'U\\xb8\\xd9Ve\\xf7?\\xfb\\xd8\\xf9\\xc7$v\\xcd?\\xe1t@\\n\\x16\\xd1\\x10\\xc0/y\\xe1\\xda\\xf7\"\\xf7\\xbfo\\x8e\\xbd\\x82\\xcc\\xb6\\xdb\\xbf\\x82\\xe8\\xe9e\\x15\\x06\\xf1\\xbf\\xffxs2g\\x8f\\xa2\\xbfoXf~\\x1e[\\xe9\\xbf\\x9d\\xa5\\x98L\\xafL\\xa5?\\x13\\x84y]\\xf5\\xfb\\xe2\\xbf\\x8b\\xe2\\xc0\\xde\\xb3\\x99\\xe7?c\\x05\\xa9\\xe8O\\xa2\\xdd?\\x990#\\xad\\x14Y\\xe9?\\x89\\xc7/\\xf5\\x12\\xc0\\xe1?\\xd6\\\\w\\xda\\xb3\\x17\\xe3?s\\xdc\\xff\\xbe\\xd1z\\xf1?\\x03q\\xf6h\\xa1\\xee\\x01\\xc0YL\\x1a\\xc8~\\xfb\\x04\\xc0\"\\x04\\x1d\\xbd\\x88\\x15\\xf0\\xbf\\xc3\\x91\\x96Z@~\\xe5?=\\x02wU\\xa5\\x19\\xf9\\xbf\\x9c\\xe2.\\xdaw\\xed\\xf8\\xbf1]\\xc8t\\\\\\t\\xf4?\\xea\\xfe\\xf5.\\xce\\x7f\\xd7\\xbf\\x04o\\x96\\xa7\\x89\\xf3\\xc1\\xbf7\\xba\\xbd\\x8b\\xff\\xa0\\xe4?\\x97\\xd3\\xa6\\x15\\x80-\\x07\\xc0Jp\\xc5oc\\x17\\xfa\\xbf=\\xe8YN\\x90\\xac\\xec\\xbf\\xd2\\x9e\\xb0\\x19s%\\xf3\\xbfEy\\x9c\\xdf\\xd7\\xd9\\x04\\xc0\\xa2\\x1e\\x7fs\\x1c \\xf7\\xbf\\xb1\\x85\\xfcwTi\\xf3\\xbf\\x18&P\\x82|:\\x00\\xc0\\x9b6i\\xe7\\xba%\\xda\\xbf\\xca\\xb4\\xc0\\x89\\xe3\\x1e\\xe5\\xbfF\\xef`\\x8d\\xdb\\x1c\\xec?\\x19I5D$\\xb2\\xd0?n0\\x9c\\x0e\\x89\\x9f\\xd4\\xbf\\xf7Dfg7F\\xe3\\xbfOFP\\xc7\\xb2\\x0e\\xdd?%\\x82K\\xc6\\x8b\\x02\\xd1\\xbf}1\\xa5\\x1e-\\x85\\xeb\\xbf\\xde\\x85Y\\xf9;\\xe9\\xb7\\xbf\\x14\\x9c&\\xa7\\xca\\x17\\x08\\xc0q\\x1d\\x10\\x03\\x17\\x13\\x07\\xc0\\x80\\x97\\xb1\"Rh\\x01\\xc0\\xd6h(ko0\\x13\\xc0\\xac\\xaal\\xd8\\xd9y\\xe2\\xbf\\xdc\\x16\\x1cn\\xb5_\\xf6\\xbf\\xef_\\x0e)\\xbb\\x06\\x04\\xc0J\\x04~^\\xfc-\\x12\\xc00\\xf2a\\x18\\x97D\\xff\\xbf\\x8a\\x000\\xb9\\x94\\xa9\\x0b\\xc0V7\\xcb\\x05V\\xfb\\xe7\\xbfGryM\\x8bE\\xfa\\xbfYQ\\xbc\\'\\xd0:\\x00\\xc0\\xe9\\xadX\\xe7\\xc2)\\xe5\\xbf:$N3\\xa1-\\xe4?\\xfa\\xbd\\xc0w:\\x91\\xe9?dU\\xdc\\x97\\xb4Q\\x01\\xc0\\xebM\\x01\\xecC`\\xf8\\xbf=N\\x1f\\xb2\\t\\x11\\x03\\xc0Y\\xa6\\xd3`J\\xc1\\xf7\\xbfL\\xa4u}{C\\xe0?\\xa9\\x1a\\x164\\xf6?\\xe6?\\xa8\\xa8,Z\\x17\\x9d\\xf1?\\xa7\\xe4\\xc4e\\xbe\\x92\\xd4\\xbf\\xb1\\xd3\\x80\\x0c\\xe9A\\xf5\\xbf\\xc5\\x8a\\nh\\x996\\xf6?Ch\\x8a[_\\x83\\xe4\\xbf\\x02\\xd8\\xc7$\\xbc{\\xee\\xbf\\xf2f{/\\xf8-\\x08\\xc0\\xb5\\xd8\\x1a\\xcd\\x95\\xaa\\x0b\\xc0&z\\x8a\\x01\\x0c\\x0b\\x03\\xc0\\xd7\\xa7/\\xa9\\xce.\\x01\\xc02\\x8f\\x1d\\xc3[\\xbc\\xf5\\xbfz;\\xf0\\x18\\x96\\xe9\\xfa\\xbf\\xfb\\xae+h\\x89c\\x00\\xc0\\xc6\\xf8|\\xbbo9\\xe9\\xbfn\\xa8\\xf5\\xf5\\x19\\xac\\x06\\xc0,T\\x8ei\">\\xfe\\xbfK\\xaf\\xd1:S@\\x07\\xc00\\xf4il\\x0f`\\xf9\\xbf\\xf3\\xa2%cS@\\xed\\xbf\\x9aI8N\\'\\x18\\xea?\\xe4A_J#\\x05\\x03\\xc0\\x04\\xd3\\xbe9#\\xae\\xff?\\xafmk\\x95\\x89(\\xe2\\xbf\\xcf\\x1a\\xeck\\xf8\\xee\\xfe\\xbf\\x1f\\x0c\\x075\\xa0I\\x08\\xc0\\xd7]p/!\\x89\\x04\\xc0P\\xfd\\xc5\\xe3)\\x86\\xec?\\xc9 ;BVZ\\xa1\\xbf\\xe8\\xf6$\\x91%\\xd7\\xd8\\xbf\\x9eA\\xf9ot\\x9c\\xe9?\\xe0cmc\\xecq\\xee\\xbf$|-/=\\x85\\xc2\\xbf\\xb0\\xed\\xc5\\x85\\x8a\\x06\\xe2?Q?\\xf8x7\\x0c\\x97?\\xb0[q\\xa3\\x1c$\\xcd?\\x18N\\x89\\xc5\\x19%\\xf9\\xbf\\xfe\\xa1\\xb9c\\xe9M\\x05\\xc0\\xe8\\x03\\xack:\\xa5\\x04\\xc0\\xbbb\\x990H+\\xdd\\xbf\\xf6b\\x90:\\x00\\x14\\xf1\\xbf\\xef\\xcc\\xd73\\xe2\\xe9\\x94\\xbf<\\xe7\\xca\\x81\\xac\\xce\\xec\\xbfjA\\xdc7u\\xf7\\xe7?rNX\\x87\\x88\\x8d\\xbd?v|\\xc9\\xd2O\\x80\\xfa?q\\x98s\\x90\\x1c\\x06\\xd9\\xbf\\xb7\\x0e\\xad[q\\x8b\\xd1\\xbfP*\\xe5\\x07}\\xa4t\\xbf\\x10\\x94\\xc0O-\\xfc\\xff?\\x06\\xd5\"\\xc2\\xd1\\xb8\\xe2?\\xea\\x82\\xa3\\xf9@\\x90\\xe7\\xbf\\x81\\'g\\x82\"\\x00\\xfd\\xbf\\x86\\xed?,\\xe0\\x9b\\x02\\xc0\\x9b\\x93@\\xd9\\xc6^\\xe4\\xbf\\x96Ij\\x9bc\\x85\\xd9?J%?\\x89\\x00P\\xd3\\xbf\\xcc\\x89\\xdbj\\x95_\\xe3\\xbfI\\xc0\\x80!?D\\xdd?\\xb2\\xda\\xad\\x82\\xb0I\\xe3?\\x99\\x81gi\\xf1\\xc6\\xed\\xbfJw\\x01\\x05\\x9f\\x8f\\xb1\\xbf`fC$\\xb3@\\xf1\\xbf@p\\xa1c\\xda8\\xf4\\xbfz\\xf59j<\\xea\\xfd\\xbfj\\xc0\\xb7K\\xe2v\\x10\\xc0\\xac\\x7f\\xafP\\r\\xd0\\x0f\\xc0z\\x88\\xf0@\\xadC\\x11\\xc0\\xf8\\xe1?\\x0b\\xb9\\xa5\\x12\\xc0$\\xcc\\xa1\\xacx\\xe3\\x03\\xc0\":\\xae]\\x13\\xac\\x12\\xc0W\\xe6-\\xdfz\\r\\x03\\xc0\\xd5/x\\x1a\\xf5\\x82\\r\\xc0\\x1f\\xef(\\xb3\\xff\\xc8\\xfa\\xbf6\\x00n\\xe51j\\x04\\xc0|\\xc0\\x84z\\x94\\xda\\xfe\\xbf\\x98\\xd3}\\xd0*j\\x0f\\xc0\\xde\\xc7\\xe1\\x00\\x17e\\x00\\xc0I\\x89xj\\x18\\xd9\\x07\\xc0&{\\xcc\\x13N\\xd2\\x08\\xc0\\xdb\\xd1C\\xee\\x80\\xbc\\x03\\xc0E\\x94c7B\\x90\\xf3\\xbf\\xbf<8~\\xb3l\\xe4?\\xf1iq\\xfc\\xa4\\xce\\xe8?\\x19\\xb9\\xa0S`~\\xda?\\x8f{\\x9f\\x9dC\\x89\\xb0?B\\xf8\\x13\\xe2\\x0e\\xed\\xe5\\xbf\\x9f\\x1by\\xe9&U\\xec?\\\\\\xb39\\xcc0J\\xa5?fx\\x93\\xd9\\t\\x05\\xec?d\\xd1\\x06T\\xc5O\\xda?l\\x80W\\xfc\\x95\\x95\\xff\\xbf-\\xf5G\\xb9N#\\x04\\xc0\\xef\\xc2\\xb3\\xfd\\xd5\\xa6\\xf4\\xbf\\xc2\\xf5\\x8d\\xe2\\xed\\x95\\x07\\xc0l\\x11\\xb2@\\xa1}\\x0c\\xc0E\\xbb\\xd9\\x9c\\xd7-\\x12\\xc0\\xb4#\\x97\\x85\\xa9\\xf1\\x0c\\xc0m\\xe5\\xea\\xff\\xd1n\\x12\\xc0\\xfc\\xea^\\xb1\\xef\\x9a\\x14\\xc0#\\xa5@\\x14\\xe2\\x96\\x1b\\xc0\\x8a\\xac\\xf2\\xf5\\x01b\\x13\\xc0zz\\xc4.l\\xcf\\x10\\xc0Tt\\x1e\\xc1\\x18\\xd4\\x0b\\xc0H\\xf5Q\\xe3\\x85\\x1d\\x0f\\xc0\\x9d\\xa3\\xafb\\x0bp\\x0e\\xc0\\xf4\\xd5D\\xc6y{\\xf2\\xbf\\xc6\\x14|\\x18f]\\x01\\xc0\\xfcG?\\x19\\x04\\x02\\xf9\\xbf\\xd3\\x85\\x84\\x04\\x9f\\xd3\\xf2?]15\\x8e\\x8c\\x03\\xbf\\xbf\\xdeOyq3\\xd0\\xc1\\xbf\\xba\\x06f\\xecdH\\xe0\\xbf\\x05\\x93\\xd2}m>\\xd2?\\x19\\xef\\x1f\\xdc}\\xaf\\xe0?\\x0b\\xbc\\x88\\xe3\\x98\\xe5\\xda?\\xd4\\xdf\\x9c\\x9f\\xa32\\xdc\\xbfx\\xb8\\xa0\\xb0\\x92\\xc3\\x9f\\xbf\\xbe\\xb4\\x94\\xeb\\x87C\\xfa?0\\xfe\\x0e\\xaef\\xec\\xf3?\\xd6\\xb1\\xe2e\\x9e\\xc8\\xf2\\xbf\\xd5o \\xf8\\xef\\xc0\\xe5\\xbf\\xf8*D\\'\\x9b\\xbd\\xe8?\\xd4\\x07L\\x1a\\xd8\\x0c\\xf0\\xbf\\x97nh\\xcb\\xfd#\\x99\\xbf\\xaeP\\x80\\x06\\x9b\\xae\\xd5\\xbf\\xac\\xd1\\x0f#\\x01\\xa2\\xfd\\xbf\\xeb\\xad\\xc0\\xfe) \\xe7\\xbf<\\xba\\xa4C4\\x1a\\xf1\\xbf\\xdfa\\x19\\xe3l0\\xe2\\xbf\\xdd\\xd2\\xd0\\x01\\xb5i\\xf2?\\xe8u\\xcc\\x1e\\x86\\x8a\\xac\\xbf87\\xd6\\xf4\\x84<\\xe9\\xbf\\x9dMB\\xb2\\xd2\\xa9\\xf7\\xbf\\xc8\\x04\\xd9\\xfd\\x8d_\\xb8\\xbf\\xc9<K~+q\\xd8?\\x04\\x15iwm\\x06\\xe1\\xbfW\\r\\xa3bI\\xf6\\xdb\\xbf\\xb4\\x11\\xe9>\\x87/\\xd0\\xbf&\\xa6Hi\\xc8\\x1e\\xde\\xbf\\xfd\\x83\\xc9\\x94\\xe6\\xd6\\xdb?\\x04\\x1a+S\\xd2\\xf9\\xc0?-\\xc9b\\xcc\\xaf^y?\\x164#\\x83\\xc2g\\xe8?\\xecR\\x8b\\x16\\x1fv\\xf1?\\x97I\\xad\\xa0\\x87\\xdb\\xe6?\\x1e\\xc0\\x8b}R&\\xe6\\xbf\\xca\\x1c\\x85[\\xde\\xf0\\xdc?\\xfd\\x83\\x00\\xae\\x190\\xe0\\xbf1\\x92\\xf8\\xc4\\xc0?\\xe6?\\xe1+\\x90\\xc8\\xdap\\xd2?g,\\x18\\x01\\xb9\\xf7\\xf1?\\xc5@\\x9b\\xad0E\\xd0?L`\\x9b\\x95\\x18=\\xda?\\xaf\\x8d&\\x17\\xa3B\\xf2\\xbftM\\xd0\\xed\\xc9\\xf2\\x9a\\xbf\\xc6(\\xe7\\xd8\\x17\\x87\\x95\\xbf1t\\xbbEe\\xfe\\xf1?\\x14\\x89\\xfcP\\x0c\\xed\\xf1?\\xd5\\xa3\\xecJ 3\\xdc?E\\xae\\x1bH\\xbc\\xe3\\xc1\\xbf\\x01\\x91\\xce3*y\\xc0?\\xe5\\xabR\\xfb\\xeeQ\\xba\\xbf\\xd2o\"\\x1dk\"\\xe6\\xbf\\x9e\\xd7\\x16\\xf48\\x82\\xb3\\xbfd\\xa14$\\x11Q\\xb3?\\xef\\xcc18\\x8a\\xb9\\xe2?\\x0c\\x96\\xba=\\xe4\\xbb\\xc0\\xbf\\xcf\\xfd\\xfb\\xa3S\\'\\x8d\\xbf<\\x14\\xae\\xe4\\xd0\\xbb\\xf2?F\\t\\xa34@\\xd8\\xea\\xbf\\x10\\x9b( \\x10\\xbf\\xbb?F\\\\&\\x04K\\xfc\\xd3\\xbf\\x8e\\xee\\x8c\\x04Y:\\x88\\xbf.\\xeekP\\x1cg\\xf5\\xbf\\x9f\\xdf\\x81U\\xa4\\xd6\\xdc?\\x1c\\xfa\\xebr\\xd1r\\xf0\\xbf|\\xff\\x7f\\xc8\\x86\\x99\\xe1\\xbf\\x8d\\xfb\\xb4\\x03\\x0b=\\xac\\xbfk\\xf2\\x87\\xbb\\x87\\xdc\\xc0\\xbf\\xb3M\\xc5oh|\\xf3?g\\xe9\\x8b\\xa2eA\\xf1?\\xf1\\xfc\\xd2,V\\xd6\\xd2\\xbf\\x9d\\xcf\\xb0D\\x84R\\xd7\\xbf\\x89\\xf6*\\xb9\\xa2\\xcd\\xe5?\\x81wt\\xf2\\xc7\\x8c\\xfa?\\xf7\\xe4*\\x93\\x93\\xbb\\xf2?\\x9e\\xc8|%h/\\xb6?\\x03]\\xc5\\xff\\xc6\\xed\\xfc?\\xd7\\xeb`\\xfcSN\\xd0?g\\x93\\xc7n\\x18\\x9e\\xe9\\xbfK\\xe7N\\xbeh\\xfc\\xf1\\xbf\\x90\\xaf\\xf2\\xcdi4\\xea?\\xdc\\xef5A\\x10\\xce\\xc8?\\x1a\\x0c\\xac\\xb4\\xd7B\\xde\\xbf%\\xb94\\xc2N\\xe8\\xbd\\xbf^\\x9bKT\\x0e\\x15\\xe2\\xbfY\\xc7O\\xd3\\xb8C\\xdb\\xbf\\n3\\x9a\\xb4l\\xda\\xf1?\\xdc\\xa9\\x1fh\\xa1,\\xcf?k\\xee\\xd7\\x90g\\xea\\xf2?5O\\xa8\\x89\\x05\\x80\\xf0?\\xc9i\\x1d\\xbb\\x08\\x1e\\xe3\\xbf\\x95v8J\\x94|\\xe1?)\\'\\xe7\\xea \\x9c\\xfb?Qu\\xe9\\xb4\\xe6\\xa7\\xe6\\xbf@\\x93\\xf1e\\xb4\\xa4\\xf3\\xbf\\xa8&4\\xa7^L\\xee?\\x14;|\\xbb\\x1c\\xba\\xa5?b\\x8c\\x89O\\x9e(\\xfa\\xbfu\\x18u\\x02\\xaav\\xda\\xbf\\x08js\\xa4\\x02u\\xf6?\\xae\\x82\\x82\\x83\\xfe\\x85\\xcf?\\x84\\xfeyF\\xe9V\\xc4\\xbf\\x1d`\\xf1\\x1f8\\x93\\x01@\\xcc\\xac\\xad\\xcbf$\\xe1?%`\\xddT\\x86\\x98\\xa4\\xbf\\x82N\\xe4\\xd4hE\\xd6?\\xed=\\xea\\xb8\\x18\\x13\\xd4?\\xcbjN\\x8b\\xf4\\xdf\\xef?\\xacR\\xd0\\xd4d\\x9b\\xd3?\\xe8\\xf3} *\\xe7\\xe5\\xbf+-\\xc4\\x9c\\xf0{\\xda?\\x11vs\\x02\\xc6\\xfc\\xc4\\xbfL\\x0f\\xc8\\xe4^\\x8c\\xc8?16(\\xa0\\x8c\\xc0\\xde\\xbfEq&\\xb9\\x97\\x1a\\xbd?O\\xae\\x8di8/\\xda\\xbf\\x83\\xd7K\\xa3\\x89\\xaf\\xf6\\xbf\\x0e\\x97m\\xe1\\'l\\xd7?\\x12\\xf4kb2I\\xab\\xbf\\x89\\xfd\\x0b\\xeb6\\xcb\\xcc\\xbf\\xec\\xcf\\x0b\\xad`\\x95\\xd2\\xbf\\x1c\\x10\\xd8\\xbcKN\\xf4?p#\\xd3\\xdcj\\xa1\\xec?Q\\xd0MC\\xb7\\xac\\xf1\\xbfVDJ\\x8d\\xb7\\x07\\x04\\xc0^\\xf6\\xeb\\xc0\\xcb\\x14\\xe7?\\xae\\x8e\\xb6\\xcd[\\x85\\xc0\\xbf\\xfcV\\xc6E9W\\xfb?\\x17^\\x16\\xcc&w\\xd0?\\xb2\\x8eJC\\xf4C\\xc1\\xbf\\xd6\\xd1yj\\x04\\x06\\xe8\\xbf\\xca\\x1d43\\xad#\\xfe\\xbf-k\\x1b\\xb7\\xc0\\xf8\\xed?e>\\xcf\\x1a\\xc1\\x03\\x08@PH{\\xc8[\\t\\xfd?\\xc0\\xceiNY\\x9a\\xf2?\\xac-\\xa04\\xf6\\x7f\\xe0?\\x15\\xa8\\x8d\\n\\x1a_\\xe2?\\xbdQpz\\x8av\\xe6?\\x8e\\xad\\xa4}f\\x18\\xd1\\xbf8\\xa0\\xea\\xc4\\x92\\xbd\\xd2\\xbf\\x00\\xbd6\\xf7\\xe0a\\xc6?L\\x9c\\xa3\\xea\\xd5:\\xc2?CE\\x89\\xabkE\\xa4?\\xce];\\xdf\\x90\\x94\\xf3?\\xc0rs\\x97}e\\xaa?\\x8edS\\xc9N\\xfd\\xe5?\\x81\\xb0I\\xf8\\xf1t\\xe2\\xbf\\xb17Z\\xdb\\x05\\'\\xdc?\\xcf\\x86\\xfc\\xfa\\x0c\\xe6\\xd0?\\x96\\xdat\\xa4\\x83Y\\xe5\\xbfVX\\x96\\xc9\\xef:\\xfa\\xbf\\xc5\\xd9\\x9d\\xfb\\xbaL\\x00\\xc0\\\\OFx\\xe8\\x8b\\xfa\\xbf\\xdbu\\x08\\xd9\\xaa4\\x06\\xc0\\x02\\x88\\xe4Z\\xf3\\x08\\xe7\\xbfC\\x03\\xf76X?\\xf9\\xbf\\xf5\\xd6\\xcb\\x85\\xb5\\x90\\xff\\xbf\\xb3i\\xba\\xb1\\x06\\x07\\xe0?\\x9c\\x965\\xff\\xb7H\\xcb\\xbfx\\xb4\\x9b\\xfcl\\xdd\\xdf\\xbf\\xb8\\xdb\\x8d\\x06_I\\xe6?\\x06\\x11\\xea\\xf3\\xa55\\xfe?h\\xad\\xb4\\x88\\xb8w\\xa6\\xbfK\\x96\\x02\\xd9\\x93A\\xf9?\\x8e\\xe7\\xe9Bj\\xa7\\xf7?,\\x15\\xa0\\xd8\\xca\\xcd\\xe5?w\\xc8\\xda*\\xc6\\xda\\xec\\xbf\\xd28\\xe39\\xaaK\\xd6?\\x18\\xc7\\xf8@\\xaa:\\xe0?\\x98\\xacQ4\\x18\\x19\\xec?\\xb0\\x0e\\x12\\x8e\\\\k\\xb3? \\xef\\x0eG\\xbf\\x0b\\xcd\\xbf\\xf1\\x865\\xcb\\xb6a\\xc4\\xbf\\x81\\xe9q\\x85\\xbf\\x88\\xd9\\xbf\\xaa\\xf6N>\\xb8D\\xd4\\xbf\\xee\\xe9\\xaa\\x85\\x14\\xab\\xf5\\xbfc\\xdd(\\xe5\\x9f\\x99\\xe1?\\xa7#l\\xafR\\xb5\\x05\\xc0\\xb2\\xf0DU~\\xd7\\xf9\\xbf\\x7f\\x0el]\\xf7N\\xda\\xbf\\xf1\\xb5\\x9e\\xd8\\xcc\\x8a\\x05\\xc0\\x14\\x14\\xd5\\xeb\\xc6B\\xf6\\xbf~\\xc1#\\xdc\\xd4h\\x00\\xc0\\xc5\\xa6\\xa1*M\\x1b\\x11\\xc0\\xd1\\xb5z\\'[\\\\\\xeb\\xbf\\x1a\\xd6\\x08\\xd5:\\xda\\x06\\xc0\\x89\\xb6\\x17\\xa0\\x96!\\x06\\xc0J\\xae\\r\\xca\\xc4\\x12\\xda\\xbf\\xcaY#)\\xee\\xd2\\xe6\\xbf\\xbaa\\x19\\xc5\\xd6\\xa1\\xed?\\xed3\\xdb\\xdf\\xa8\\xa2\\x00@\\xe1\\xec\\x99\\xe96\\x9c\\x07@#\\xfbD\\x88\\x0e\\xb6\\xe1?x`\\x97\\xd6{q\\xd9?\\x02\\x15\\xf2kK\\xfd\\xfb\\xbf\\xc9q\\xdd\\xbc\\xa0\\n\\xcd?wj\\xa5\\xec\\x96\\x95\\xdf?\\x94a\\xf4\\xf3i]\\xe7?M\\xe3\\x9fK\\x02%\\xdf\\xbf\\x17\\x1dQ\\xcc\\xb6)\\xcd\\xbf]\\x9f^Q\\xa2\\xbc\\xe5\\xbf\\xe7i\\x9f\\\\\\x02\\xcc\\xac\\xbf\\xfa\\x08m\\x05\\xfa\\xd8\\xd9?\\xe6\\xba\\xb2>\\xee\\xeb\\x00\\xc09\\x00I`\\x81Y\\x04\\xc0\\xb25\\x98\\x85\\x0b\\xbe\\t\\xc0\\xb0\\x7f\\x1fa\\x06\\x0b\\xfe\\xbf\\xc3|B\\xfc\\xb5&\\x06\\xc0\\xf2)\\x92\\xfc\\n\\x16\\x06\\xc0#\\xdf\\xee<\\xee\\xb5\\xe9\\xbf\\xe2\\xe93\\xe1b2\\xd1?\\x92\\xc4v\\xe0\\xfc\\xfe\\x81\\xbf\\xf5D\\\\\\xbff\\xae\\xf7\\xbfx3z\\x83\\xed(\\xe5\\xbf\\xdc\\x02M\\xd9\\r\\x9e\\xf0\\xbf\\\\\\x83\\x15Q7u\\xcd?\\x88\\x00D\\xb7\\xd2\\xc3\\xf6\\xbf\\x194A\\x8dj\\xaa7?\\xdf5\\xf0\\xf4\\xf2z\\xf5\\xbfx\\xfb!yF3\\xe6\\xbftH\\x9a\\xf2t\\xaf\\xe6?\\xa0\\xbd\\xfa~<\\x0f\\xf7\\xbf\\x0e\\xf8\\xcb\\x9a A\\xd8\\xbf\\x94+g\\xa5t\\n\\xe8?F\\xb1\\x0cJ\\xa2\\n\\xee\\xbf\\xdf\\x8eD/z\\xb2\\xf0\\xbfm\\xa9\\xa1\\x12\\xd3\\xff\\xba\\xbf\\t1\\x86\\x9dl6\\xe8\\xbf\\x1b\\xdd\\x11q\\x07\\xc0\\xc0\\xbfQB\\xa7\\xdf8\\x82\\xfa\\xbf#\\x9f\\xa8\\x9a K\\n\\xc0A\\xfc\\x90.\\x90\\x13\\x08\\xc0\\xf0\\x8eX\\x0b?m\\x02\\xc0=\\x8ac\\xde\\xa1\\\\\\xf4\\xbf6\\xb8M\\xc1m@\\xfa\\xbf\\x85\\xc0N\\x00D\\xd2\\x03\\xc0X\\xce8\\x95\\xc5h\\xee\\xbf\\xea:g\\xcd\\x82\\x99\\xef\\xbf0\\x15\\xcbPh\\x0f\\xfb\\xbf\\xcf\\xe4\\xac+\\x02\\xfc\\x02@\\xd2nM\\x19m\\xc5\\xec\\xbf\\x03\\xb7E\\xfd\\x98\\x9f\\xca?\\xa5\\x1fR\\xd3\\x1e\\xe0\\xe0\\xbfx\\x8dwh\\x16\\xb0\\xd0\\xbf\\xce\\xca\\xf5Z \\xf2\\xe8?\\xb80\\xe2^\\xa15\\xe6\\xbf5o\\xda\\xd1\\xc3a\\xbb?\\x16j\\x8f\\x17\\xe5\\xab\\x00\\xc0\\x07\\x1cmnUn\\xf1?\\xed\\x04\\xd8\\x93$\\x1c\\xec?\\xbb\\xab6mmd\\xa5\\xbfq\\xac$\\xde\\xc5\\x1e\\xfb\\xbfk@\\x14\\xe7\\x9e\\x96\\xde\\xbf\\x04\\xb3\\xc8\\r\\xf3V\\xc8?\\xb0\\xd4\\xd9\\xe2\\xf8B\\xd1\\xbf\\xc0\\xfc1\\xdf\\xee\\xae\\xd1\\xbf\\xda@=\\xd4\\xcd\\\\\\xfc\\xbf\\xbb\\xdb\\x00^rP\\x00\\xc0U\\xeb\\xacL46\\xfc\\xbf\\xd3+\\x8b\\xf2\\xb4\\x99\\x04\\xc0\\xa9S=F\\xed\\xf2\\x0b\\xc0x`+\\xe1\\x93\\xba\\x01\\xc0l\\x90\\x00\\xb1\\xae\\xbb\\xf5\\xbf\\xbeL\\x06\\xe4sf\\xe6\\xbfG\\xcc\\x1a\\xe8\\xb9\\xe3\\xfd\\xbfZ%\\xa6\\x0b{K\\x03\\xc0\\xb45\\x93m\\xfa\\r\\xed\\xbfwXi\\x11\\xbaH\\xe9?E\\t-\\xda\\x03\\xe2\\xb9?Q\\xc4y\\xa9\\xcf\\xb1\\xef\\xbf\\'+\\x9byQl\\xd4?m\\xf3\\xc7\\x93\\xfbp\\xf0?\\xfd\\x1f\\xb8#\\x18/\\xe6\\xbf\\xc3;9\\x13\\xed\\xfd\\xe8\\xbf\\xb5\\xcbQ\\xc3\\xe7\\x02\\xf7\\xbf\\x89V\\xc2\\x91\\xd1(\\xfc\\xbf\\xf0\\xc4\\xd9\\xc4\\xf1\\xec\\xfc\\xbfj\\x1c\\xfa\\xe0\\x9aZ\\xf0\\xbf6\\xe8r7\\x10\\x17\\xf1\\xbf\\x13\\xff\\x9f\\xcd^h\\xf9\\xbf}q\\xda\\'\\xd3z\\xf2\\xbf\\x12_;\\xc0W\\x95\\xe2\\xbf2\\xd3;\\xed*M\\xdf?P\\xdav\\xe5\\x87\\xa1\\xd0?\\xd2\\'#\\xf4\\xa8\\x8f\\xf8\\xbf\\x9b\\x02c~\\xd5\\x95\\x14\\xc0\\xc7$\\x9a\\x80\\xc0\\x11\\x12\\xc0\\xd1p\\x1a-)\\xa0\\xc7\\xbfFA\\xf6\\xe2q\\xeb\\xf6\\xbf-\\x10C\\x88\\xe7]q?8\\xef\\xe1\\xc3K\\x96\\xf9\\xbf\\x95c?\\xcdE\\xba\\x96\\xbf?\\x18\\x8a\\xc4\\xf3\\xcd\\xc3?Qq\\'\\xb3\\xa5L\\xbd\\xbf\\x04N\\xc5\\x9fh\\x0b\\xe1?`\\xf7\\xec\\xb6W\\x18\\x06\\xc0`\\xf1\\xcc\\x07\\\\\\x14\\xf2\\xbf\\xde\\x04{\\xb6^\\x08\\xe3\\xbf.\\'\\xe7\\xfc\\xefX\\xf3\\xbf!\\x16\\xc1\\xecTN\\xfa\\xbfE\\xfa<\"d~\\x02\\xc0\\x95Yv\\xb2\\x97\\xccy?\\xd4\\xb7\\x80\\xb9Bj\\xfc\\xbf\\x9d\\xb3d\\x86\\xca&\\x01\\xc0\\xcb}\\xd0\\x19\\xc6q\\x15\\xc0\\x9e\\xfa\\x15\\x00\\x1b\\x95\\x0c\\xc0\\xc2\\xb1\\xc5\\x1c\\n\"\\xee\\xbf9\\xb7\\x08\\x9a\\\\\\xb3\\xe1\\xbf\\xfdMxQ\\t\\xf1\\xe6?\\x99\\xedM\\xa5\\xf9\\xbd\\xf4?\\x9dk\\x8elB\\x0f\\xd5?*\\xde\\x0ez\\xd2\\x86\\xf4\\xbf\\xb9\\x95O\\x9a\\xf5\\xc2\\x04\\xc0z\\xa3\\xe1\\x93\\xd1\\x93\\x02\\xc0P\\xf7?i\\xe6\\x96\\xfc\\xbf\\xd9\\xf1\\xe9C\\xb1\\xcd\\xca?\\x15\\x03t\\x15\\r\\xa0\\xd9\\xbf\\x1cvZ\\xf3\\xdc\\x01\\xe4\\xbf\\xd2 \\x11!\\xac\\xc9\\xf6\\xbf\\xf8\\xd3\\xedb\\x9e%\\xd8\\xbf\\xe6\\xd6\\x985p\\xba\\xff\\xbf\\xd3\\x7f0\\x9c\\xd0L\\xa7?\\xa3\\x19\\x03\\xb73\\xd5\\x0b\\xc0\\xc0\\x89\\xdaY\\x11{\\xde\\xbf\"\\x88|\\xeb\\xf3F\\xe7?\\xb2+\\xdc0\\x08\\xcc\\x08\\xc0\\x8c\\x07\\xdch\\xb5\\xd4\\x06\\xc0Z\\x14\\x05\\x95\\x82\\xae\\xe5\\xbf$\\xa6\\xc1\\x8e3 \\xda\\xbf\\x11M[\\xb0\\x0c\\xb9\\xff\\xbf\\xe3@B\\xf8D\\x9d\\xf0\\xbf\\x1aI\\xca*\\xbd#\\xef\\xbf \\xc9\\xbdj\\xc7\\xf7\\x0f\\xc07\\'X\\xb2\\x8am\\n\\xc0A\\xde\\xf4\\x16\\x01\\xa0\\xfa\\xbf\\x15W\\x818\\xf9\\xc2\\xe5\\xbfR\\n/\\xd99^\\xe7\\xbfY\\x99\\x10\\x0e,\\xa9\\x83?D\\xe2\\xec7\\xdeq\\xdb\\xbf\\x06[\\x8a\\x8aP\\xce\\xb9\\xbf\\x163\\xc9Z\\x98\\x8d\\xf3\\xbf\\x13vx\\x83\\xe2\\x7f\\x00\\xc0Zd8\\x98\\rZ\\xf5\\xbf\\xe6\\x8bm\\x8dl\\xf1\\xd0\\xbf4\\xc9\\xcb+\\xcd\\x95\\xf0\\xbfPhy\\x01Q\\xd3\\xcf?{K2\\xce\\x085\\xfc\\xbf\\xdaw3p\\xa5\\xe1\\xe8\\xbfE\\x16%%\\xd4n\\x03\\xc0w\\xbd\\xc4\\xa6\\x1f\\x8e\\xca?\\x19[\\\\\\xeah\\x1c\\xdd\\xbf\\xe6\\xccB\\x02\\xb9}\\xd1?\\xea&\\xc0z\\xee\\xd0\\xed?\\x1a\\x9d[\\x04\\'\\x15\\xc8?\\x9fP\\xe6&c\\xef\\xe7\\xbfM\\xe1\\xdc\\xb9\\xbc\\xb7\\xf2\\xbf\\xc1jY\\xfc?\\xd9\\xd5\\xbf\\xdfdy\\x8b9\\xb1\\xfd\\xbf\\x99\\xd4\\x89\\x85\\x15\\x10\\xf3\\xbf\\x17Uu\\xf74\\xf5\\x02@uIuG\\xae<\\xdf\\xbf\\xea\\xec \\xf2<\\xab\\xf7\\xbf/C0+YC\\xfe\\xbf\\xfd\\x0f-\\xbbHw\\xe4\\xbf^a\\xc4\\xdc\\xb4\\x11\\xd1?\\t{p\\xee6\\x9c\\xe6?\\xce\\xc7\\x01\\xa0\\xb7w\\xe6\\xbf\\xf3Se\\x8d\\xc7s\\xf2\\xbf\\x14\\xc99\\x95\\x95F\\xdb\\xbfd,\\xb9\\xea\\x08\\xa7\\xe2\\xbf\\xb3\\xc8\\xb8\\x03ef\\xa2\\xbf&\\x14\\xf4[\\xf4\\x11\\x0e@:\\xab}\\xe7?\\x85\\x01@\\xa6\\x8f\\xc7\\xf6!\\xde\\x04@!t\"?\\x8dI\\t@\\x9e\\xe1\\xf9\\xfb\\x18\\xdc\\xeb?\\x8a\\xed\\x0c\\x06\\xdf\\xb4\\xa8?\\xc8\\xfc);=}\\xf3?\\xb6\\x16P\\xc4\\x92@\\xfa?I\\xb1\\x868\\xf3\\xac\\x08@\\x0c5\\xfb\\x13\\xaeg\\x04@6\\x8d\\x1c\\xc2\\xf1d\\xcd\\xbf\\xdc\\xe2|\\x13\\x8d\\xc4\\x02\\xc0D\\xa3o\\xdbF$\\xd0\\xbf\\xff~\\x96\\x08:W\\xc8\\xbf\\t\\xb2\\xb2\\xfc\\xa4\\x86\\xd2?\\xa91]\\xe1\\xcfk\\xe7\\xbf\\xb1\\xdb\\xbb\\xd9\\xd6\\xdb\\xf3\\xbf\\xbf\\xdf{\\xd0\\xe45\\x00@|\\xe0(0\\x82D\\x00\\xc0R\\xb7\\xb4\\xf1]G\\xf5\\xbfH\\xce\\xfc\\xb5<K\\xf3\\xbf1S\\x9c\\x97\\xbd\\x1d\\xde\\xbf6!\\x02\\xffM`\\xf4\\xbf\\xf4\\xe0lNU/\\xdf?\\xa11\\xf7X\\xf9\\x16\\xab\\xbf\\xe6\\x17\\x8d\\x15\\xc9\\xf8\\x04@\\r\\x9b\\x91\\x08.\\xd0\\x06@\\xabC\\xf0[AV\\x12@\\x85\\x0e{\\xc8\\xa4{\\x0b@&c0\\xd9|\\x94\\n@\\x8551\\xd3W\\x18\\t@\\x0c\\x1a-\\xbd\\x18\\xf4\\x00@a\\xdf\\x9c\\x88O\\x93\\x08@\\x9f\\xb5\\xfa\\x97\\x82h\\xfa?\\xd0\\xe877\\xb0S\\xe9?\"\\xf6\\xf2Y\\x1b\\x9d\\t@\\xf5\\x9c\\xd3U\\x81\\x18\\xeb?\\xda\\x0e?\\x06i\\xc2\\x05@#\\x19\\xdb\\x1a\\xc0/\\xff?Y\\xbe\\xc7Cw\\xb8\\xf9?@\\xe5\\xba\\x9d\\x90\\xfb\\xf3?\\xa1\\xa7\\xf5:zz\\xf7?\\xc7\\xa7\\xd08\\x16\\x84\\xe7?\\xbb^\\xb5g\\xc4]\\xe5?\\xa0\\xdd\\x1fg\\xbe\\xec\\xfa\\xbf\\xbaG\\xce\\x0eO2\\xe6?\\x80\\xa1\\xde-=+\\xcc?\\x88n\\xdc\\x1cM\\xb3\\xfb\\xbf \\x82q\\xe5oR\\xf0\\xbf\\xf3\\x17c<T-\\xe6\\xbf\\xad\\xcc\\x0b\\xbbb\\x0e\\xd2\\xbf\\x05_@L\\xd3\\x0b\\xf2?7\\x90\\xbe\\x8a\\xdez\\xd7?v\\x8e?M\\xf4\\x94\\xf5?\\xda\\xd6\\xac\\xa5\\x9cL\\xf7?/\\xf9\\xb9\\xfd)&\\xfd?\\x85\\x9dn\\xcdJ\\xda\\x16@\\x9c\\x02\\x0b\\xff\\xc9\\xa8\\xf5?_\\xb3\\x9b\\n`\\xa8\\x0b@\\xf2\\xc7\\xe35\\xad\\n\\xfb?\\xa1\\xa4\\x17\\xe7\\xc0\\xfa\\xf3?\\x03\\xb4\\xfdh\\xf2a\\xe4?}O\\x86\\xae\\x80\\xb1\\xc4\\xbf\\x19\\xa5\\x8e.\\x11\\xc1\\xf4?\\xc0cC\\x81\\xa1\\xac\\xe4??\\x07$\\xea0\\x07\\xf2?\\xee\\xfe7iG\\x1b\\x03@9\\xc4\\xd8\\xb1D\\xa4\\xd1?e\\xa4\\xab\\xa9[Z\\xe8?\\x9e\\x93\\xff\\xa6\\xc15\\xf7\\xbfq^\\xa4#)i\\xcf?\\x98O\\xfa\\xfeoC\\xe7\\xbf^5\\xb0\\x91\\x1a\\xe0\\xf4?`A\\x06\\x82m\\xf6\\x03@\\xeb3\\x14_\\xf0\\xd2\\xfc?\\x8d\\x88p\\xf0\\xc3l\\xe1\\xbf,\\x9d\\x93T<\\xe0\\xf4\\xbfq\\xf3\\x8d\\x08\\xb3\\x0f\\xf6\\xbf\\x81\\xe8\\xbc\\xad\\xd8\\x8b\\xc0?\\xb8e\\xf9H\\x92\\xc5\\xcd\\xbf\\x03\\xf91<\\xcd\\x9b\\xca? \\xb0E\\xb6\\xb6\\x9d\\xdc?G\\xca\\x95\\x7ff$\\xde\\xbf\\x9dP^\\x95n\\xf4\\xdf?l\\xb5\\xae2\\x8e\\xa9\\x07@\\n\"\\x94@\\xfco\\xf9?\\xfb\\x9b\\xa7\\x8b\\xd2\\x13\\xd0?\\xf8<\\x069W\\x9d\\x02@[?\\xc8\\x0e\\xc0\\xc2\\xff?\\xde\\xb8t\\xa8=o\\xeb?\\x19\\x0b+\\x1c\\xc8\\x84\\xd6?\\xf8\\xf9\\'G\\xeaM\\xdc?\\xac\\xec5N\\xb7P\\xe8?S\\x9cv\\xf8\\xe2U\\xde?\\x05\\xaa\\xd7\\xb6Q\\r\\xed?\\xf7\\xd2\\xd5\\x1e.\\x8b\\xc7\\xbf]\\x89\\xe4T\\x04h\\xe4?\\xa6\\xdf\\xc18lH\\xca\\xbf\\xbc\\x031\\xf3S\\xae\\xc0\\xbfC\\xdf\\xe2\\xd1\\x0b1\\xf3?\\xb9>E\\xebc\\x84\\xfe?\\x85p}^*y\\xd8\\xbf\\rr#-V \\xb0\\xbf\\xed\\x88\\xcf\\xee\\xd7&\\xfe\\xbf-\\xfa[2+\\x83\\x00\\xc0z:\\xba\\x03T\\x13\\xca\\xbf\\xb1\\xe6\\x849(j\\xf2?\\x15z,\\\\\\xe0}\\xf0\\xbf\\x88\\xdd\\xb1\\xc0\\x06r\\xcb\\xbf\\x8ds\\x95\\xa5\\xe9\\x0b\\xd7\\xbf\\x8d]\\x04i\\x98\\xe2\\xed\\xbf\\x86`\\xb3\\xa8\\xfd\\xe8\\xec?\\xe4\\xb8\\xe6/\\xce\\x1a\\x03@\\xfa\\xf9\\xad#\\xbbn\\x84\\xbf\\xd5\\x81=^!U\\xf7?>\\xdf\\xd1\\x08^\\x1c\\xe9\\xbf\\xf7\\xcd\\xdf\\x83\\x93\\xcf\\xcc\\xbf\\xf7\\xa2f\\x86\\xc3\\x1a\\x05@\\xc3\\xb7,9\\xb6Q\\xf5\\xbf7\\xe7d\\xb2\\x16f\\xff?NG\\xf3h6^\\xf9?i\\x04\\x82\\x93\\xde\\xed\\xce\\xbf\\x08\\x15\\x86G\\x993\\xc7?j\\xb1KQ\\xc0\\xc5\\xe1?d\\xedI\\xb4\\xe9\\xaa\\xeb\\xbf\\xe2\\xe0\\xad\\xd2\\xce\\xf9\\xf9\\xbf,C\\xfc%\\n\\xb8\\x00\\xc0Y\\xac\\xf1i2\\x15\\xc9?~\\xa0\\xb4jqh\\xfb?\\x1b\\x06w5E\\xb7\\t\\xc06M\\xf1\\xa6\\xf7\\xc4\\x10\\xc0\\xfc\\x95\\xd4A\\x90G\\x05\\xc0\\xa4\\xf5\\\\\\x18\\xf6\\x15\\x00\\xc0a\\xcf\\x8d\\xfe\\xed\\x11\\xe8\\xbf+\\x17\\x93\\xba\\xf1\\xab\\xea\\xbf\\x92H\\xc1\\xbb\\xecJ\\xe6?\\x96\\x81\\x92.1\\x0b\\xe1\\xbf\"\\xcd\\xbc\\x15\\x0b9\\xeb\\xbf\\xd16l\\xf0V\\xaf\\x04\\xc0Q\\x00%\\x17\\xc2\\xc5\\x0c\\xc0\\xe0chP*1\\x04@\\xba\\x0b\\x87\\xa4\\xe6)\\x11@\\x1a\\xc9\\xe1\\x9c\\x7f)\\xe9?\\xc8\\xb3\\x8c\\xb3\\xec:\\xd4\\xbf\\x0f\\xe4\\xc6I\\x8d\\xd6\\xfa?b\\xca\\x92\\x93\\x8cq\\xfc?\\x8f\\xbb\\x85j!\\x04\\xf4?\\xa0~4\\xda\\xa0Z\\xb0\\xbf\\x19\\ru\\x9d3D\\xef?O\\xb1\\x9f\\xce\\xf77\\xf4?&\\xc9\\xe2\\x9aX\\xc9\\xe1\\xbf^\\x08\\xb6\\x04cL\\xdf\\xbf\\xad\\xa4\\xdf\\xcaT\\xab\\xdc?UU\\x8e\\rs\\xdf\\xec?\\xc2\\x96\\xbc~K`\\xd4\\xbf\\xa4A\\x12\\x93\\\\q\\xb8\\xbf\\xd6m\\xc1\\x99-\\x9c\\xff\\xbf\\x1d\\x9d\\xff8,\\x97\\x06\\xc0\\xf9\\x8293Y\\x17\\x11\\xc0Q\\xd6\\x8d:\\xc4\\x0c\\xf9\\xbf\\x8f\\xe6[t\\xd5V\\xf8\\xbf\\xe0\\x16\\xe7\\xf9\\x16\\xbf\\xed?=\\xbe\\x0c6&\\xa0\\xe1\\xbf\\xd1\\xd0\\xf9i.\\xf9\\xf7\\xbfV3\\x9a^\\xe3\\x06\\xc1?&\\xfeA\\xc4\\x92,\\xdd\\xbf\\xd8\\xce\\xb6\\x00k3\\x08\\xc06\\xd3m\\x1e\\xa2b\\x0f\\xc0\\x8b\\x97\\x90~\\x04\\xc5\\xfd\\xbf\\xa0\\xcf\\xb9\\xa4s+\\xf2?/\\xd8\\xbb\\xb0Ff\\x03@]K\\xcf\\xf9\\xe0y\\x0e@\\xcf\\xff\\x162\\x81\\xc8\\xee?O\\xbf\\x8ePp\\x14\\xd5?0( \\x80No\\x9d\\xbf0\\xc75\\x9ev\\x7f\\xe5?a\\xeb\\xb7\\x18?\\xa8\\xfd?\\xb8\\x18\\x8f\\xb8\\xc1\\xee\\xa8?o.sZ\\x94\\xb4\\x01@^>\\xf2\\xcd\\xd20\\x01\\xc0Z.\\xbck\\x08v\\x01@])\\x82\\xdf\\x94\\xe9\\xca?\\x19I\\xc2\\x82\\xd0\\xd3\\xe6\\xbf\\x1a\\xf6\\xeb\\xb9\\xa7\\xd8\\x04@\\xc5\\xf4L\\tW/\\xf8\\xbf\\xe8\\x0b\\x98\\x07?\\x02\\t\\xc0\\xf3U\\xa8\\xc0\\x96\\xd6\\x00\\xc0\\xd8\\xecX\\x05+\\x13\\xa0\\xbf\\x85`A\\xf2\\xe7\\xa3\\xf7?i\"/ir\\x1c\\xd7?\\x80\\xd6\\x83\\xed{0\\xc5?\\xae\\xb3\\xa4\\xc8\\x88\\xbc\\xed\\xbfts\\xd5\\x95l~\\xcd?j\\xcb\\x84k\\xdcE\\xed\\xbf\\xbc\\x06\\xfe\\xb5\\x92<\\x12\\xc0s\\xba\\x1d\\xbd\\x81\\x13\\x0f\\xc0\\xf6\\xea\\x99\\xfb\\xcb\\x18\\x15\\xc0\\xfdHN\\x89\\x96s\\x00\\xc0\\'/\\x10#\\x8c\\xe9\\xe1\\xbf\\x11[\\xfc *\\xe2\\xfe\\xbf\\xa8I\\xc9\\xd7\\n\\xd0\\xf3\\xbf1^^\\xa2\\x175\\xea?\\xa7cv\\x1b\\xf6y\\xe0?\\xe8\\n!\\x9c\\x80\\x9b\\x00@\\xdc\\x1f\\xa1~\\xf4d\\xd3\\xbf\\xfc;\\xfe,-n\\xd2?\\x17\\xed\\xeb\\xce/U\\xe8?@8\\xba\\x00\\x1fS\\xff\\xbfS\\xed\\x95G\\x17Y\\xcb?{eK{\\x00J\\xeb\\xbf_IY\\xf4\\x01\\x81\\xe7?\\xd1\\x82\\xc8\\xb8\\xc3\\xa7\\xd9\\xbfa\\xcde\\xaf\\xeb\\xf6\\xe5\\xbfS1\\xff\\xf1\\x8al\\x04\\xc0\\xeb\\x06\\xb0\\x11\\xc1\\x10\\xf0\\xbf\\xed~=\\x1b\\x9e\\xb3\\xe8\\xbf\\x8a\\x06c\\xbc\\xc4\\xf4\\xff\\xbf\\xb7\\xebn\\xa0\\xf5\\xcd\\xed\\xbf7\\xc9\\x18\\xff\\x91:\\xe7?\\xc1\\xbf\\xd3\\xa5\\x83P\\xf3?|\\xf6\\xd6M\\x18\\x9d\\xf1\\xbfw\\xe3\\xf0\\xf5]\\xe4\\xc9?\\x8c8=\\x9a\\x15G\\x06\\xc0vB\\x98;\\xe3:\\x07\\xc0\\x94\\xbd\\xbed&{\\x11\\xc0\\xccb\\x90;\\xeb\\x16\\x14\\xc0\\x07\\x12+j\\x02~\\x0f\\xc0Q\\x91;Xn\\xc7\\xf8\\xbf\\xe6R\\xd6I\\xdf6\\xe9?\\x89\\x0f?S\\x88\\x84\\x00@\\x9e\\xa4D\\xec\\xdc\\xc4\\xd7\\xbf\\xaa\\x9a;\\x8fYh\\xeb\\xbf?t\\xbc\\xa3\\xfe\\xb2\\xda?/\\xc8\\xb6\\xb0\\x05\\x82\\xf2?\\xc8\\xfa\\xc7A3c\\xf4?$\\x0c\\xf5\\x97\\x1c5\\x0c@\\xf1\\xdb\\xd9W?\\x06\\xc7?\\xf2\\xe9\\xd0{<2\\xfb?\\\\\\x01\\xb54\\xc6\\xaf\\xf1?\\xbe-~\\xfej\\x18\\x02\\xc0{\\x81\\x86\\x0e\\xf0\\xe6\\xed\\xbf\\xcfR\\xacy\\xe9\\x83\\xf0\\xbf\\xec\\x12\\xdbN\\x15\\xd8\\xfc\\xbf^\\x9cs\\x86I\\xc4\\xd4\\xbff\\xa7$\\xc7\\x08\\x14\\xd6\\xbf}\\x0fJ\\xe1)S\\xe1\\xbf#f\\x90\\x9fe\\x13\\xdc\\xbf\\xb1\\xaa\\x03\\x10\\xf8B\\xf0\\xbf\\x03\\xb9\\x12QI5\\xe8?M>1\\x9b\\x19\\xd7\\xe9\\xbf\\x13\\xb7\\xee\\xa5\\x19\\xfc\\x01\\xc0e\\xc1~%s\\x12\\x04\\xc0\\xcd\\xff\\xe9\\xf1mK\\t\\xc0sP\\xbf\\x0e\\xf5\\x94\\x07\\xc0\\x14\\\\\\xe69\\x9e\\x80\\xfd\\xbfp\\xc63\\xf6\\xe8t\\xf6\\xbfP;\\xc1V\\xc4a\\xe5\\xbf\\x1e0v\\xec \\x81\\xd1\\xbf9\\xbc\\x89\\x8dK\\x8b\\xe0?\\x89j\\x8a\\xab\\xe6\\xc7\\xf2\\xbfMXE\\x99\\xfa\\xb1\\x00@\\xd5\\xea\\xf4\\xc7\\x85\\xbd\\xf3\\xbf\\x84\\t.\\xfc<u\\xe2\\xbf\\xb5e\\x113Yq\\xe7\\xbf\\xfc\\xf5\\xcc\\x9d!E\\xed\\xbf\\x82\\x9df\\xd1\\xfb\\xeb\\x01@\\xae\\xed\\xbd\\xb1\\x82\\xea\\xd2?\\xfeI\\xb5\\xa8\\x8fv\\x05\\xc0\\x90y\\xe3\\xb3\\xea\\x93\\xfc\\xbf1\\x1a\\xc4\\x9d\\xd3[\\xdb\\xbf\\xfa\\xa3:R/g\\xe9\\xbfi\\xdb\\x80n\\x8b-\\xcf?V4\\xbd%\\x8f\\x04\\xc8?BuP\\x02)Z\\x9f\\xbf1\\xbd%\\x817\\xf1\\xb9?3\\xa9\\xf8\\x8d\\xae\\x95\\xe7?\\xcen6\\x149\\x1d\\xe0?\\xe0,\\x92\\x12\\x15\\x88\\xc0\\xbf\\x97\\xeb~YH\\xeb\\x03\\xc0l\\xf70\\xe7\\xf3\\x17\\xfd\\xbfZp\\xb3\\x95\\x1e\\xbd\\x04@\\xe9\\x00\\x9b\\xb2\\x0b\\xe8\\xc8?\\xb5h-\\xd4\\xda\\xd4\\xf6\\xbfd\\xba\\x0c\\x04\\xb4\\xbd\\x08\\xc0\\x15)\\xde.3u\\xe9\\xbfn\\xe74\\xa9{\\xd9\\x0c\\xc0O\\xdf\\x16\\x9f\\x16\\xba\\x00\\xc0J\\xcc\\x7f\\xabt{\\xeb\\xbfA#m\\xdb\\\\q\\xe9\\xbf\\xae\\xec\\x98\\xeeDL\\x01\\xc0\\x0bGd}6\\x9a\\xf3?hvjKE`\\xf1?Tv\\xf9\\xa0\\x86?\\xf4?\\xc9*p\\xfeo\\n\\xf4?\\x85F\\x028d\\xb0\\xf9?\\xb9\\xd5NRXn\\xe8\\xbf\\x9cwa\\xadYx\\xee\\xbfT\\xfb\\xb7`\\xc2j\\xf3?qb]~\\xd64\\xd3\\xbfbu|\\xfe\\x83s\\xd6\\xbfR\\xba\\x00\\xe2I\\xdb\\xd1\\xbf\\x1b\\xdd\\xc1\\x82\\xee\\xd4\\xf0?\\nU\\x7f\\xf6\\xe2\\xd1\\xda\\xbf$\\xca\\x8d\"\\x84\\xc7\\xde\\xbf~h~\\xd6>\\xd9\\xf1\\xbf9N\\x04ug(\\xec?hV\\x089\\xc4\\xfe\\xe9\\xbfi\\x1d\\xb7?U\\xbf\\xf9?\\x15\\x82\\x1a\\x9ci\\xc2\\x06@L\\xae\\xfd;\\x8f\\xbe\\xa3?U\\xd1*V\\xb5\\xd1\\xf2?\\x96\\xd8)\\x9f\\x9dU\\xfd?r5>:`\\xc7\\xf2\\xbf\\x02\\xda\\x82\\xb3\\x98\\x1e\\xf1\\xbf\\x8d\\xffY\"f\\xfa\\xea?n\\x7f\\x86Z\\xa2u\\x05\\xc0n\\xd2\\xf3\\xea\\x0ey\\xf4\\xbf;n\\xea\\xae\\x02\\xe8\\xe3?}wP\\xc1=\\xae\\xfb\\xbfCk\\x1d\\x9c=\\n\\xda\\xbf\\xfc`\\rC\\x87*\\xdc\\xbfi/\\xd0\\x02\\xde\\xad\\xda?e\\xddA\\xad\\xean\\x07@\\xb4#\\xbf\\xd1\\xba\\t\\xfe?\\xe7\\xdd\\xa9]\\xbd\\x1d\\xb4?\\xc4\\x06F\\xc0t\\xfa\\xf5?\\xf6\\xeb\\xdf\\xf7\\xbe\\x10\\xe1\\xbf\\xbe\\x97\\x9c\\xad\\xb3`\\xa9?5j\\xc0\\x7f3\\xd3\\xd8\\xbf\\x04]p\\xcd\\xbe\\xb6\\xf0\\xbfI\\x00\\x13\\xed\\xad\\xd4\\x99?y\\x99\\xda\\xc1\\x1c\\xf5\\xee\\xbf\\xa4\\x0e\\x8c\\x93\\xe2\\xbb\\xe7\\xbfo\\xfd\\x85\\x1ax\\r\\xe9?\\x02\\x9c.>\\x8c\\xbd\\xd5?\"\\xd6\\x1fI\\x03\\xb1\\xda\\xbf\\xd0\\xab\\xaa\\r\\xef6\\xe9?\\t\\xa0A\\xcen\\xee\\xdd\\xbf\\xdb\\xd0\\x89\\\\\\xf7\\xcc\\xbd?q\\x11+\\xd9\\x98\\xf2\\xea\\xbf\\xa6\\x9a\\xb1\\xbc\\x17\\x9c\\xe2?\\x98\\xbf2H\\xe9\\x0c\\xec\\xbf\\xae\\xaa\\xf46\\xec>\\xe9\\xbf\\xe0L\\xa2\\x7f\\xc1\\xac\\xff\\xbf0\\xeb,\\x05\\xcf1\\x00\\xc0x\\xa7\\x0b|\\xb5\\x97\\xff\\xbf.\\\\\\xed\\x9aP\\xee\\xe9\\xbfK\\xb2\\xbc}\\x89\\xf6\\xba\\xbf\\xa4\\xf7\"\\xae\\x8c\\x16\\xf0\\xbf\\xbcqF!\\x16m\\xb5?\\xa5f\\x83ND\\xbc\\xf7?\\x0c[\\xab,\\xfb\\xd9\\x01@\\x8a)\\xc6ahf\\xfc?R,R\\x87Ad\\xf6?[\\x86\\xb3\\xd7tM\\xce?\\x12D\\x00s\\xabZ\\xd9\\xbf\\x16\\'e\\x1br\\xfa\\xf4?#\\x85|\\xdf\\x8f{\\xe8?\\x81\\xd2\\x97gwc\\xcd?\\x0b\\xfbuD\\xaeW\\xe7\\xbf\\xad\\x98\\x83wh\\x8a\\xfa?\\x9e\\xe8\\x9c\\xed8\\xfb\\xe8\\xbf2Db\\xe0e\\x87\\xd8?KrL\\xdf+\\xe9\\xf9?\\x9d?\\x14\\xf0\\xb07\\xcf\\xbfG}AY\\x18`\\xb2?v\\xa1\\xedt\\x84\\x89\\xed?N\\xc7\\x89\\x0c@\\x8f\\xe5\\xbf\\xca\\ty\\x9f\\xb6_\\xd4?\\x0c\\xb6\\xce\\xf6\\xd2\\x0b\\xe0?\\xc1\\x11\\xfd\\xa5\\x07p\\xf4\\xbf\\x8a\\x8e\\xe6\\xbah1\\xcb??\\x8e]\\xce1h\\xf3?\\x99\\x82\\xa6\\x0c\\x11\\xab\\xf6\\xbf\\x95s\\x80L\\xf47\\xf5\\xbfYe\\x1a\\xea\\xc6\\x1b\\xdb\\xbf\\xb2mH\\x8f(p\\x05\\xc0\"\\xe8@z\\xc2\\x81\\x00\\xc0c\\x02E_0\\x87\\xfd?\\xe6\\x8aF\\xc56\\xc5\\x01@\\x9a\\xf7\\n$\\xfd\\xb1\\xf1?R:\\\\2\\x81\\xfe\\xd6?\\xe6\\x13\\x95\\x8f\\x02e\\xca?\\x10\\xf2\\xf0}d\\x8d\\xc4\\xbf{\\xd9\\x89\\xb1\\xc0Z\\xf4?,\\xca\\xb2\\x1b\\xa9V\\xc7\\xbf\\x8d\\xdb\\xd6\\xe5{\\xbd\\xde\\xbfYv\\xcc0\\x97\\xc0\\xd1?\\x89\\x93\\'\\xf4\\xb6\\xf2\\x95?\\xbf\\x0bQ&\\x93\\xc1\\xec?\\xd9z\\xbf\\x85\\rh\\xd3?\\xba\\x19\\x82\\xc6\\xbe\\xb2\\xdd?\\xc0\\xf4\\x80\\xb0\\xde\\xcd\\xb9\\xbf\\x0f$\\x9a\\xc34\\xc7\\xd8?\\xbe6_\\xc6\\xfe\\x97\\xf2\\xbf\\x9c\\xef\\xfe\\x9e\\x15\\xf1p\\xbfL\\xecWb\\xa5\\n\\xe6\\xbfP\\xcaK\\\\O\\x96\\xc5?\\xdd?yW\\x9f\\xae\\xf3?\\xe1\\xa86\\xa7>v\\xf8\\xbf*V*\\xea04\\xe3\\xbf\\nE\\xf33\\xe6&\\x04\\xc0\\xa2&\\x80\\x1c\\xfav\\x11\\xc0\\x98|\\x9a\\xf2\\'\\xde\\xec\\xbf\\x97\\xb98m\\x13\\xe4\\xed\\xbf\\xbc\\xd5\\x15\\xc8\\xe6\\xca\\t\\xc0g\\x91\\x0fWu\\xcb\\xf3?\\xa2\\xb3\\x0c\\xcfA\\x11\\xb8?\\x83\\xb4\\xcaN6\\x89\\xa6?WzTh@\\xf3\\xe3\\xbf\\xe0-\\xbdJ\\x8fu\\xe8?G\\xe8\\xae\\x1f\\x8e\\'\\xf5?\\x9d\\x89/-w\\x19\\xc3\\xbf\\xa1\\xb2@\\x18\\xfd\\xed\\xc0\\xbf\\x80\\x90\\x1d\\xe6\\xb5\\x96\\xc9?\\xb0\\x05\\xac\\xd2\\xd2\\xab\\xbf?\\x8a\\xa1s\\xd9~\\x17\\xd7\\xbf\\t\\xb6\\xba\"\\x06\\xe6\\xf1?v\\x83zE\\xf5\\x1d\\xea\\xbf\\x91\\xe0<\\xd6\\xe2\\x1c\\xca\\xbfb[\\xa0\\x17\\xba\\x13\\xd2\\xbf9r\\xe7\\n|\\xf0\\xf3?\\x19\\x88\\xe2\\x89\\x83\\x05\\xdc?\\x8b?f\\xa6\\x04\\xed\\xd7?\\x91\\xa5V\\x14k\\xad\\xd6\\xbf\\x91s(`\\\\\\x88\\xe4?h|u\\x9el\\xcd\\xf8?\\x89\\xc4G\\xb8\\xcc\\x8c\\xe6\\xbfwC\\xbbPZ\\xcf\\xcf\\xbf\\xf2r\\x99k\\x04\\\\\\xa3?\\x10\\x81\\x7f\\xdff\\xf5\\xf1?\\x0cm\\\\\\xe5hw\\xcf\\xbf]%\\x85\\xfcu\\x8c\\xe0\\xbfI6\\xc4\\x15\\x19n\\xcc\\xbfc\\xbc8\\x1b\\xa2\\xf4\\xde?%-\\x98c\\x1b\\xec\\xd5?j\\xbc?\\x9d]\\xc1\\xe4?q\\xc68\\xd86\\xbc\\xe7\\xbf1\\xc5\\xe0\\xfa\\xf4\\x8d\\xbf?\\xf05\\t\\xf9Hd\\xb9\\xbf\\xc00\\xe8\\x05\\x86x\\xde\\xbf\\xa9\\xf4\\xa3\\t#J\\xf3?8\\x01\\x1b\\x05\\xea\\x10\\xe2?\\x03|o\\x9a\\xb9[\\xe0?;\\x82\\xf7e\\x81D\\xf0\\xbf\\xa9P\\xa8\\x17\\xe0T\\xc5?<\\xa6.\\n\\t\\xfd\\xe6?\\xc0\\xb7\\xb7\\xcb\\\\\\xda\\xe2?h\\x07\\x11\\xf3\\x18h\\xbc?Z-\\xb3[*\\xe4\\xd9\\xbf\\xe0\\xa8\\x12\\x9b>(\\xb0?\\xd3w\\xd3Xye\\xf0?\\xad\\xb2\\\\J\\xab!\\xaa\\xbf8g\\xc3@j\\x8e\\xa6\\xbf\\xe3p}-yv\\xf9\\xbf|PT\\x0c\\xbc&\\xba?\\x8f\\xe9\\xc1AK\\x05\\xdf?\\n$+\\xec\\xf2\\x81\\xd4?\\xa3oU\\x1d\\x9d\\xd8\\xcd?D\\x8d\\xfc/\\xb5\\xcd\\xf4\\xbf[@\\xe5\\x0bk\\x0b\\xe7\\xbf\\xf1\\x98L):\\x01\\xb8\\xbfA\\xcb\\xdaU\\x16T\\xeb\\xbf\\xa9\\xf8\\xc3\\x8b\\xee\\xf6\\xae\\xbf\\xca\\x91\\x87\\x11\\xf3m\\xed\\xbf\\xaa\\xb3\\xeb\\x82\\x8b\\x15\\xea?X\\xbd\\xce\\x9dDu\\xa1\\xbf\\x97P\\x92\\xc0\\x90\\x98\\xf1?\\x96v\\x03\\x108\\xa0\\xd9?:\\xd4\\x13\\xf6[6\\xc5\\xbf\\xa1\\xcd\\xee\\x10\\xe0k\\xf7\\xbf\\xc0}\\x83E\\xf1\\x9e\\xdf?\\xcc\\x1e\\x0fRl\\xbe\\xd1\\xbfo\\x7fD\\x1eR\\xfa\\xc7\\xbf\\xd8l\\x93\\xd4\\xfaX\\xe0\\xbf\\x0eHt\\x91\\xb7\\xe5\\xdf\\xbf\\xe8\\x7f$\\xd9\\xe5%\\xe5\\xbf\\xf2\\x80\\x1a\\xf1\\xb9#\\xd3?\\x1c3+\\x94\\xf5\\x96\\xdb\\xbf\\xe3\\xbb\\x82\\xd6\\xe3\\x17\\xe8?X(\\xb2\\xea\\xad\\xcf\\xf7?Y\\xa66]\\xd2\\xac\\xe6?\\x90\\xf0\\x08\\n`*\\xb1?U\\x93P\\x94\\x8e\\xc2\\x8c?\\xe0\\xbb_)\\xef/\\xf5?\\x9d\\xf6\"\\x06\\x94:\\xde?\\x83\\xd4\\xf9(w\\xc9\\xe2?s\\xa3\\xd7\\x1c\\x1d\\x9a\\xed\\xbf;\\xb5\\xffl\\x81\\x12\\xd6?t\\n\\xc0!p<\\xc6?\\xc1\\xc3\\x83\\x80\\xf0\\xb2\\xe4\\xbfW\\xe61\\x9e\\x1af\\xf0?\\xeco\\x82\\xe1\\xe4q\\xd0?S\\xac\\r\\xf1\\xfaq\\xec?\\xbc4Wx\\xbf\\xec\\xf6?=\\x8cj=/Q\\xe4?B\\x0eL_\\xde;\\xf6\\xbf\\xba\\x14\\xa3\\xbb.\\x9f\\xe9\\xbftv\\x98\\x8eDm\\xcc\\xbf\\xf6\\xb2B\\xf6\\x05E\\xe2?6%}t&\\x82\\xd1\\xbfB\\x8c\\xda\\xa9^\\xf8\\xcf\\xbf-\\xeb\\x0cm\\x88M\\xd6\\xbf\\xab\\xc8\\x89\\xdf%\\xe9\\xc2?{C\\\\<a\\xd2\\xda?\\x11\\x01\\xce\\xfc\\xb6g\\xb1\\xbfq\\x93G\\xe5\\x055\\xdf\\xbf\\x02bO-\\xe7\\xb0\\xd2?\\xf1\\x1e\\xb3y\\x87\\xe3\\xd8?\\xbe\\x8c\\xddS\\x94\\xd2\\xca?D\\xd8\\xa1\\xba\\x0bm\\xd7?\\x1c\\xfb0\\x89\\xf3p\\xde\\xbf+\\xad1\\x00\\xc4E\\xed\\xbf\\xcf-\\x19Q\\xb1\\'\\xee?{\\x87\\xb9oX4\\xaa\\xbf`\\xb5\\x07\\xe6d\\xf5\\xe2\\xbf38\\xd0Eu\\xe7\\xf6?J\\xc7A\\xbcq\\x8a\\xed?\\xd9\\xb7\\x1e\\xa2\\x91z\\xbd?\\xad:{\\xba\\xdf\\xf6\\xd1\\xbf\\xe43\\xce\\x0f\\xd7C\\xf5?\\x7f\\xc20\\xda?D\\xee?gc\\x07\\xb8\\x84)\\xdd\\xbf\\x1b\\x9d\\x81[I`\\xd8?\\x9b~\\x1b`\\xe2\\x92\\xaa?\\xb3\\x1eE\\xaa\\x00#\\xf5?\\xb1\\x13\\x11\\xb6i\\x97\\xde\\xbf4_2s\\xa4\\xc5\\xad?#\\x0b2A\\xd5\\x94\\xdb\\xbf\\xbbS\\xcbw\\x91!\\xf9\\xbf\\xd9y\\xeacE\\'\\xd7?Sc\\xe5\\xe11\\xa5\\xd3\\xbf\\xeaY\\x10a\\x1e9\\x95?()7l7\\xb9\\xbb\\xbfw\\x99$\\xb1\\xa1\\xb7\\xd3\\xbf-\\xf7]c\\x0b\\xaf\\xb6\\xbfj\\xea\\xd8\\xef\\x1a\\xe8\\xef?\\xdd?\\xe3-F!\\xf4?\\x88\\xb9\\xd4\\xe2\\xb8\\x04\\xb8\\xbf\\x92}e\\xa4\\xd6\\xc4\\x00@U\\x88\\xfd\\xa9\\x16\\'\\xbe?\\x01qT\\xd7\\xadT\\x8e?\\'\\x90\\xca\\xac\\x99-\\xc7?\\x9c\\xdf>u\\x88\\x00\\xe7?\\xea\\xd0\\xe0|\\x1bf\\xeb?\\xc7G\\xc6\\xb2\\x1da\\xf5?\\xff\\xdd\\xcbGo\\x9c\\xee?\\xbf\\xd0v\\xdb\\xbb\\xd4\\xe9?e\\xf8\\x88\\xa9\\xd3Y\\xea?\\xbb\\x83V)\\xa6\\xdd\\xec?\\x98\\x13\\xc6\\xbe\\xf4y\\xcf?.5\\xd0\\xb4\\xff\\xbb\\xde\\xbf.\\x07\\x81`\\xbb\\xef\\xe0\\xbfd\\xdd?`rU\\xd8\\xbf\\xd6SQ\\xd59D\\xe1\\xbf\\x86?5\\xaaG\\x9e\\xdf?S%\\x88\\x9d\\xe8\\xe2\\xd1\\xbf\\xf5&/\\xea1\\xda\\xe6\\xbf\\xcc\\xe9\\xc4%^;\\xe9\\xbf\\\\\\x8a\\xef\"\\x9b(\\xe0\\xbf\\xb6\\x8f\\xfc\\x9f-\\x8a\\xe4?\\x86q\\xc34\\xa8\\x16\\xa2?\\xbb)a\\xc1+o\\xf1?\\xac\\xb8K\\xff\\xc1\\x03\\xf7?\\x9cO.\\x94N\\xec\\xed?G\\xa6HI -\\xfa\\xbf|V\\xdd\\x14#$\\xeb?\\x7f\\xa2\\x8e\\xdd\\xc9\\xb3\\xfa?\\xdc<n=y\\x89\\xfe?\\xfcSz\\xee\\xbb\\xed\\xfa?\\xaa(~|\\xd2\\\\\\xe0?\\x0c2\\xc5\\xd9\\xcfe\\xf5?\\xb42\\xf5\\x8b\\xb0B\\xf0?\\xedV\\xac\\xd2\\xa3\\xa0\\xfe?\\x13\\x9f)M\\x05\\xf9\\xdb?$\\x8c\\xc4\\xcc&\\xcf\\x02@w\\x88\\x0c\\xd6j[\\xde\\xbfY\\x99\\x07e\\xdc\\xe0\\xe5?j\\x18\\xc8\\xe1\\x06\"\\xca\\xbf\\x1f8\\xf7\\x89\\x9f\\x91\\xe3\\xbfd\\xf3<\\xc3Rb\\xda\\xbf\\xc5B\\'$\\xac\\xfb\\xd9\\xbf\\x87\\x98\\xfb\\xd8c\\xd8\\xe8?\\x07E\\xe6\\xd44}\\xeb\\xbf\\xe3R>\\xe4\\x95\\xd4\\xb1?\\x9e4\\x8c\\xb5\\xfd\\xca\\xe0\\xbf\\x9d\\x92t{j,\\xbc\\xbf\\x84(\\xa14/\\xb0\\xab?\\x87\\xff\\x08\\xe2\\x9c\\xce\\xee?\\xe2\\xda\\x00\\x94g\\xe7\\xc7?3\\xe7O\\xebZ\\xb3\\xe7?\\x02\\xf1\\x95\\xb2\\x1e\\xe1\\xc6?\\xb5\\xe9\\xb1\\xb7`\"\\xea?\\x07\\xdc\\x10\\x8aI\\x1d\\xea?\\xd2\\xf5\\xbf\\xc0\\xb2\\xe5\\xde?k)h\\x1f2w\\xf5?\\x93\\xba\\xc8x[\\xc2\\x10@\\xa4%=\\xa4\\xa5<\\xf6?\\x1e\\xef\\x9cTLn\\xfa?\\xde\\x06l\\x046N\\x06@\\xc1 \\r\\x9a9\\x96\\xc3?\\xcf\\x14*\\\\E\\xe3\\xf8?X\\xeb\\x1f\\xb0\\x8c|\\xf2?\\xf2=\\x1d\\xcd\\xac\\x00\\xfb? {,C{U\\xf3?\\xcd\\xcbD\\xe6OD\\xe7?o\\x0c\\x11\\xb8\\rC\\xc0?TT{\\x16\\xff\\xe4\\xb7\\xbfi.\\x98\\xfa\\xc8I\\xe6?R\\\\\\xf9+\\xfb\\x16\\xdf?a\\xeb\\t0\\xfb\\xf7\\xaa?\\xfb\\xaf\\xee\\xae\\xb8U\\xbf?\\x94\\x90\\xdb\\x05[\\x97\\xce?T\\xd5\\'\\x1cD\\x11\\xb2\\xbf\\xdaj\\xf3V\\x9at\\xf0?=Q\\xf14\\xd5\\xba\\xd5\\xbf\\xc0\\xa9\\xf3\\x9c\\x85\\x1c\\xc9\\xbf\\x02\\x1b\\xd4d\\xae\\xaf\\xc5?=\\xf2\\xfa*\\x8d\\xee\\xec?\\x02!\\t\\xfa{|\\xfa?\\xc0\\xe6\"|2&\\xd5\\xbf\\x04?z\\xd85Z\\xf4?+\\xaf\\xab\\xc4\\xb5\\x12\\xf7?\\x8a\\xe7B\\xaf\\xdd/\\xe6?\\x04=Q\\x93\\xbdY\\xcb?{\\xd8\\xc7dv\\xf9\\x06@}\\xbe\\xdc\\x05x{\\xed\\xbfxXY%b\\xbc\\xf1?\\xbbb\\r\\xed]\\xb8\\xdc?n\\xeb,,}\\xc2\\xf6?,T\\xc6\\xce\\x11\\x89\\xe1?7\\x05\\x03Vk>\\xf3?4a\\x11:!\\xca\\xf8?\\xea\\xb1\\xcc.\\xa0W\\xf5?\\xe6\\x02\\xd5P\\x85\\xaf\\xf8?\\xa8\\xcd\\xacV\\x056\\xc1\\xbfn\"\\x1cA\\xf8\\x19\\xf0?\\x0e\\x19\\xfb\\xfav\\xca\\xe1?\\xe3a\\x91\\x1f\\x99J\\xe9\\xbf2\\x8ea\\x06\\x8es\\xd5\\xbf(\\x96\\xd8\\xa17\\xc4\\x85?\\xc6M\\x18\\xc3\\xf4\\x16\\xba\\xbf\\x0fJ/\\xbbb\\x03\\xb1\\xbf\\xda\\xb97\\xdeov\\xe9?\\xc7\\x9c\\xb1\\xff\\x96\\x8e\\xa7\\xbf\\xad\\xfa\\xf8\\xf7M\\x0b\\xf0?\\xf3\\x86\\x00\\xea\\xcc]\\xf8\\xbf\\xe7\\x04g%J4\\xec?S7\\x9e~\\xab=\\xfa?\\x81\\xd6\\x7f\\xa4\\xf3E\\xdc?\\xb1^\\xbd\\xd0{\\x84\\xb6?\\x0e+\\x19H\\xf5v\\xfb\\xbf\\xd5<\\xa1*\\xf8\\xde\\xf9\\xbf\\x1b~#\\xba&\\x06\\xea\\xbf\\xa0\\xbb\\xc7\\xb9\\xebl\\xe9?J\\xef\\x88\\x00\\xdc\\xa6\\xe8?Z\\xb7|\\x0f\\x01\\xf1\\xe7?\\'\\'s\\xc3\\xf0Q\\xff?\\x04\\xe2\\xa6\\xc5Q\\xd1\\xf3?\\xdf\\xc46\\xd8\\xc0$\\xe9?\\n\\x93\\x0f\\xd4[\\xa4\\xec?\\xd5\\xde%\\xa7\\x94@\\xec\\xbf:\\x02*\\xd3Df\\xc2?\\xf4\\x13\\x16\\x1eg\\xa7\\xf4\\xbft\\x8c\\xb1\\x99K\\x8d\\xd0?\\x0fG\\x1fL\\xc6\\x1a\\xcb?\\x86\\xedK\\xb9C\\xf7\\x9f?\\x12\\xe8\\x1a\\x9b\\xb2_\\xd4?\\xf4\\xc7vGE\\xbc\\xe8?\\x1ck\\xfd\\x1a\\x89\\xc5\\xa4?$:\\x0e\\x972{\\xeb?\\xb8\\xbcrD\\xbe\\\\\\x01@M\\xe3(d\\x86\\xb1\\x02@\\t\\xf2\\xaf\\x17\\rT\\xc7?5*\\x0b0.\\xdd\\xb6?\\x04T\\xee\\xff\\xbdW\\xe7?\\xa9\\x18]Z\\xe1\\x1f\\xdb\\xbf\\x04H$\\x14B\"\\xe9\\xbf\\x0c\\x8bp\\xf6\\xa0\\x86\\x9d?\\xac#\\xbf(\\x83\\x8d\\xb5\\xbf\\xf4O\\x8c\\x17\\'\\x96\\xc6\\xbf\\xdd\\x89\\x9c*\\xf3\\xcc\\xda\\xbf\\xa6bc\\x02\\x7f\\x82\\xb2?\\x8a=\\xf0\\xc15y\\xb1?\\x02\\x14`\\xc5\\xdd\\xe9\\xbf\\xbf\\xd9^C*\\x06\\x19\\xd7\\xbf4*\\xf2T\\x83;\\xb0??\\xbf\\xc4\\x95\\xec-\\xe9\\xbf\\xe5\\xdd\\xf6\\x87$3\\x01@\\x02\\x00?*/H\\xe6\\xbf\\xc6\\xd3X)\\xdd\\x93\\xf3\\xbf\\xb6d\\xa4\\xb4\\xad.\\xca?WG\\xd35q[\\xf8?\\x1d1p\\xc3\\xec%\\xdf?\\xe2\\x01z\\x11\\xeeI\\xeb?\\xde\\r\\xb0\\xf1R\\xdc\\xdc?j\\x10\\xb6HhO\\xf1\\xbf<\\xd5|\\xa6ER\\xd4?\\x93\\x87\\xc2\\xa7@\\xc7\\xa2?94\\xdeL\\x98\\xa0\\xf5?c\\x90\\xae\\xc4\\t\\x82\\xec?\\xc0\\x06\\x98!\\x7f\\xdb\\xe3\\xbf\\xfekw\\xfd\\xa8[\\xfc?\\x91\\xe9\\xc0\\xfaSa\\xd6?\\xf2\\xd4/\\x9f\\x97\\xa3\\xf4\\xbf\\x94\\xa4\\xba\\xc3\\r\\xe5\\xe1?,\\x8cV\\xc3\\x19\\x9c\\xf3\\xbf7\\xf5\\x18\\x88.\\x14\\xe2\\xbf\\xa2\\xbbO\\xc1Gl\\xc2?\\xf8\\xbc\\xdb\\x92\\xa9\\xfe\\xd5\\xbf^u\\x86=\\xa8\\xb2\\xf2?+\\x9f\\xef\\xba\\xcd@\\xf4\\xbfr!\\xddK\\xa5<\\xf7\\xbf\\xf9\\xb4a\\x15p\\xd5\\xe3\\xbf\\x06\\\\;\\xab\\xb5[\\xcc?\\xffdi\\x84\\x04\\xf6\\xb9?\\x0b\\xa1m\\xf1\\xe5\\xd2\\xe7?\\xc7\\tsW\\xa0~\\xf1?\\xe6)o\\xeb=d\\xf8\\xbf\\xff&\\xcf\\xb4\\x9f\\x85\\xf9\\xbf1\\xf0\\xca\\xc2\\xc7\\xe6\\xda\\xbf\\x84\\x08h{YN\\xb8?v\\x9ac\\xe8\\x16h\\xe9\\xbf\\xa1\"a\\x83\\x83K\\xd7\\xbf\\x0eV\\xf7i\\x80\\x95\\xf1?\\xf3.\\x85\\xf9\\x02\\xe0\\xf5?\\xdf#!\\xce\\xe4\\x0f\\xf6?\\xe7vCv\\xdaf\\xee\\xbfR\\xab\\xfa]\\xafk\\xeb\\xbfWP\\xa3kT0\\xbf?\\xf91S\\xc8\\xbe\\xf1\\xf1\\xbf\\xd6\\x1a\\x8a\\xd0yM\\xc6\\xbf\\x083\\xe4n\\xeek\\xd5\\xbf\\x11v[t\\n\\xac\\xd1\\xbf\\xcb\\xfe\\x05\\xdab<\\xde?\\xf4\\x88k\\x9c\\xd1F\\xd7?\\x088\\xae\\xa5\\xe5>\\xe9?\\x90\\xb9\\xdf\\xe7\\xfc\\xa2\\xf8\\xbf\\x02y\\x03\\x8d\\x03\\xfb\\xed\\xbf\\xc0b\\xb8\\x9e\\xd2)\\xf1?\\x98\\xe2\\x9d\\xc2x\\x88\\xd0\\xbf\\x97m\\xdb\\xb1\\x02S\\xd4?=C\\x7f\\xa9\\xca\\xf6\\xeb\\xbf\\x9b\\xdf\\xdf\\xd7\\xdaq\\xaf\\xbfbDA\\xed_\\xde\\xe4?\\xaa\\xea\\x15\\x8bU3\\xd9\\xbf\\x8c\\xe5\\x96\\x87\\xab;\\xf6\\xbf\\xb7\\xf5\\xa1\\xe0\\x81\\xac\\xe2\\xbfhq\\xdc}\\xac\\x8d\\xde\\xbfI\\xb04`C\\xc4\\xd4?\\xd5(jR\\xbb\\x7f\\xdb?\\xa8Cd\\x8a\\x88\\x95\\xf4??\\x7f\\xac,\\xc3\\x9e\\xe9\\xbf;\\xa4\\x10\\xb4\\xa5\\x96\\xdf\\xbf\\xaa\\x81\\x1f \\xb4+\\xdd?\\xa16e\\xe9\\xf3!\\xf9?Dw\\n\\xc5.7\\xfe\\xbf\\xb9\\x1e\\xf6\\xf4W)\\xc5\\xbf\\xadV\\'x\\x92\\xda\\xfe\\xbf4\\xb8\\x11\\xa5\\xf1\\xcd\\xe8?R\\xb7C9\\x11\\t\\xc9\\xbf\\xbe\\xca\\xe7)V\\xfb\\xee\\xbfF\\xba\\xed^\\x14\\xc4\\xdb\\xbf=\\x85g\\xe3\\x9d\\xc2\\xd5\\xbf\\x90\\x80\\x1dz\\x9e\\t\\xf5\\xbfQ\\xd4?\\xac;=\\xe9\\xbf\\xe1\\xf8S\\xdc=\\xc6\\xfd\\xbfF\\xcc\\xc6)Q[\\xf9\\xbf\\xe9\\xe4[%j?\\xe5\\xbf<k\\x8b\\xbb;\\xfe\\xe2\\xbf\\xea\\x8a\\xc6%6\\xcb\\xee\\xbf\\xae\\xe7W\\xe6c\\x0b\\xf0?gz\\xe1N\\x81\\xf9\\xc2\\xbf\\xe5\\x9a\\xadw\\xe19\\xab\\xbf\\xff\\x13\\x9f\\x9b\\xfe\\x1e\\xf5?\\xdd\\x06|V)5\\xb7\\xbfQl\\xd3\\xb26\\xd0\\xe0?\\x11+\\x14\\xf1\\'C\\xee?Hd\\x85\\x98\\x8f\\xca\\xd7\\xbf\\xef\\xc2\\xc6\\xf9b\\x06\\xf5\\xbf\\to\\'\\xe5\\x85\\xa4\\xc6?\\xd9\\xf7{\\xc3X\\xd9\\xf0\\xbfk\\x10\\xac\\xb4\\xafd\\xea?+\\x8d1cA\\xe2\\xeb\\xbf\\xcc\\xe0\\xb3?{\\x8a\\xb2?\\xedt,z\\xbf\\x18\\xf2?\\x98\\xecN\\x83\\xae\\xc2\\xe0\\xbf.\\xc5\\x08\\x8e\\n\\x19\\xee\\xbf\\x164\\x98\\xec\\xbb\\x1a\\xe3?\\x82\\x9fd\\xf3ud\\xe2\\xbf.&s\\xa1\\x1b\\xc1\\xe0\\xbf\\x9b\\xaf\\x95<\\x90\\xe3\\xd5?\\x95`J\\xf5-\\x87\\xf3\\xbfp\\x9a\\xde*\\xc92\\xef\\xbf !\\xc2\\x03\\xac\\x7f\\xd7\\xbfra>\\xa5N\\x9c\\xd4\\xbf3\\xd1\\xa9\\xa8\\x86\\xa3\\xf0?}\\x0c\\xbb\\xef\\x9b\\xe0\\xd7?\\xfcu\\x81\\xbd\\xd5\\xf9\\xdd?x\\xbej\\x0c\\xba\\x88\\xf6?\\xa1\\x93\\x07\\x9d\\xc5\\xbd\\xd5?D\\xf9}\\xf5\\t\\x10\\xf7?ht\\xc0\\xb42\\xe0\\xec?\\xad\\x0c\\xb3\\x0f\\xc0U\\xf1\\xbf\\x0c\\xc4\\x83N\\x07o\\xf4?R\\xdf5\\x02B&\\xd2\\xbfQ\\x95+f\\x84\\x14\\xde?-md,Bb\\xe4\\xbf\\xb5\\xe2\\xecS9\\xdf\\xd0\\xbf\\xb3S\\xea{:\\xd2\\xaa\\xbf\\x8a\\xd5\\xc8\\x87Ln\\xa2?\\xf9l4\\xeaF\\xc1\\xd8\\xbf.\\xca\\xb9]I\\x8d\\xdc?\\xc9\\xccn\\xea\\xe3\\x7f\\xa7?/\\xb2\\xfdh\\xf0<\\xcd?\\xdfQB\\xb3Yd\\xe1\\xbfs]\\xffs\\xbd\\x0b\\xb1?G\\xbb\\xb0\\xac\\x83\\xd3\\xd0?\\xc67\\x7f\\xdd~u\\xfa\\xbf\\xa1c\\x9c\\xfb\\x867\\x00\\xc0\\xcd\\\\\\x14<<\\xd7\\xed\\xbf\\x10\\xc0\\xddg\\xcd\\x84\\xd3?\\xa4{\\xba5\\x93>\\xf2?\\x86:\\xe8Q\\xab\\xbc\\xac?\\xe1\\xbblI\\x016\\xed\\xbfn\\xc8\\x1ay)\\xe2\\xf1?\\x9c\\x12o\\xdc\\xaa\\x88\\xa7\\xbf\\xf8\\xcc\\xb6[~\\xc0\\xed?C\\x0f\\x1c\\x90l\\x1fd?\\xb5My\\x1d\\xb4\\x19\\xf2?\\xd9\\x9e\\x1af\\xbe\\xb4\\xe1?/\\xe3\\xa2\\xc3^\\x17\\x02\\xc0\\x03R\\x134\\xf1\\xc7\\xe6\\xbf9\\xf6\\xdf\\x9fjQ\\xee\\xbf,\\xd7\\xda\\xfb7\\xa7\\xd1?W\\x96\\xeeH\\'\\xf9\\xb1\\xbfy\\x06\\x1dlN\\x1f\\xfd\\xbf\\xc4&\\xd3:-\\xe3\\xd7?\\xc4Wf\\xb7\\x1a\\xd2\\xf1?\\x1c\\xc6!V\\x9dd\\xe1?d\\xf4\\x8d\\x00G\\xc1\\xcb\\xbf=\\xd4\\x8b\\xbf\\x87E\\xfc?\\xc5\\x08\\x8d\\xc6\\xb8\\x88\\xd5?\\x07\\x8c\\x88\\xf26\\x1e\\xd4\\xbfK7\\xb6\\x8d_\\xdc\\xf1?\\x80\\xb2\\xed\\x83\\xcc\\x01\\xec\\xbfl\\x1b^F\\xf9\\x07\\xb8?\\x10\\xd0h\\x8b\\xb5\\xfb\\xe6\\xbfU\"@\\x7f9\\x80\\xe5?\\x9dUh\\xd8\\xe8h\\xc9?\\x1b\\\\)W\\xe5\\xa5\\xf2\\xbfsN\\xd8*\\x03$\\xf0?\\x1d\\xb0\\x18#\\x10\\xfb\\xc1\\xbf 6\\x0e{1\\xa3\\xff?W\\xe2|DK\\xf4\\xc5\\xbf/\\xec\\n\\x953\\xbb\\xc7?\\x86\\xbd\\x8d\\xb1\\x95\\xcf\\xd7\\xbf\\xc2\\xf5$S\\x08\\xf0\\xe8?\\xd3\\xa6\\xcc\\xde\\xeef\\xc1\\xbf9[\\xa8\\x91\\xeb\\xa6\\xee\\xbf\\xc2tC\\x95\\xa2W\\x00\\xc0\\xf8\\x05X\\xa5\\xfb7\\xe4\\xbf\\xf6X\\xd3@\\x0c\\xc7\\xc1?*\\x1b#j\\x93\\xb8\\xdb?\\xb5\\xa1\\xb2\\xfbg\\xa4\\xe4?\\xd1\\xd6\\x05\\xe1\\xa2\\t\\xeb?\\xb8x\\xf1Y\\x0c\\xe7\\xc8\\xbf\\x8cvT\\x97:x\\xd7\\xbf\\x8f\\xd2sB\\x83\\x8c\\xff?\\x8e\\x87\\x84u\\x80\\x1c\\xec\\xbf).\\xa1rM\\xc7\\xc7\\xbf\\t\\xcax\\xd0h(\\xf9\\xbf\\xc7\\xae\\x8eG\\x16\\x0e\\xec\\xbfB\\x13\\x1b\\x9b\\x18S\\xd3\\xbf\\x85\\xc2\\xc3\\x1bF\\xda\\xec\\xbf\\'\\x1c?\\x86\\x8b\\x92\\xcb\\xbfB\\x04\\xb5\\xbe\\x15\\xb9\\xe9?\\xc3G\\xe7\\xba\\xe5\\x11\\xe4\\xbf\\x0b\\xdb\\x9c\\xd6\\x05\\x8e\\xd1\\xbf)\\xcc\\xe9\\xab\\xd5?\\xc9?5\\x85D\\x8f\\xae\\x12\\xe7?8b\\xc9\\x1b$\\xdd\\xe7\\xbf2\\xa2\\x11^\\x84\\xe5\\xd8\\xbf\\xa0^n+\\xa8\\r\\xc0?S\\x12\\xe4\\xd7\\xd6X\\xd2?\\xdeE\\xa5\\xbd\\x8b*\\xee\\xbfr\\xe5\\xf3\\xe2\\x16\\x11\\xcc?\\xea\\xbd\\xd5\\xe3g3\\xf1?\\x0e\\x1cj\\xf8F3\\xbc\\xbfJp\\xfc\\xba\\xb1|\\xda\\xbf\\x9f\\xb1\\x13\\x0c\\xd1\\x8b\\xeb?\\xdbXb\\xc1\\x87\\xfc\\xdf\\xbf\\xf6\\xcf\\xc5\\x90Z\\xb8\\xf0\\xbf\\x81\\xfc%\\x92\\xcd(\\xd8?\\xc9\\xd0\\xbdb\\x1d\\xe4\\xaa?\\x03\\x9c7\\xfaE\\xb6\\xe4\\xbf\\x92<\\x84M\\x01\\x8e\\xbb\\xbf\\xc0\\xb4\\xcf\\x9a\\xbeH\\xe5\\xbf\\xa4\\x05\\xb1\\x01X\\xfc\\xd9\\xbf\\xae\\xd2\\xe5A\\xae\\xdd\\xed?\\xf4\\x01tH\\x11R\\xf1?\\x1a\\xfe\\x94=)%\\xed\\xbf\\x95\\x81\\n\\x83\\xcb\\xe1\\x01@\\xb2\\xc2s\\xd4E\\x04\\xf5?Zh\\xe6\\xdd\\xb3@\\xf6\\xbf\\x8b\\xc5R}\\x12\\'\\xf0\\xbf\\x86(\\x02m\\x91\\xfd\\xf5\\xbfh\\x1b\\xf3P\\x04\\x8c\\xfb\\xbf[\\x9dm\\xeaT\\xca\\xc5?1\\x00A-|\\xc1\\xcb?\\xfaA_n\\xd2D\\xee?\\xee7 s=r\\xc4\\xbf\\xdfqk\\xeaI1\\xe2\\xbf\\xf3i\\x93\\xc6)S\\xe2\\xbf\\xb8E\\xf9\\xe6Y\\xf6\\xe4?[f\\xe3.\\x1fp\\xc4?+z\\x9d#+\\xef\\xaf\\xbf\\xf6\\r?\\xc5-h\\xa5?\\xec\\xc3i:\\x02i\\xea\\xbf\\xf0\\xdc\\xe3\\xe4N\\xdd\\xe0?~I]se\\xe8\\xda?\\x8cgV\"\\xf7r\\xc5?T]\\xd3\\xb1s\\xb3\\xe0\\xbf\\xa5\\xab\\xda\\xa0\\xcd \\xeb?\\x9f\\xd9\\xac\\xbb\\xcfQ\\xe7\\xbfkM\\xbe\\x8bA\\x06\\xe7\\xbf\\x04\\xab\\x9c\\x8c\\x13\\xb5\\xec?\\xee\\xde\\xa2M\\xb0\\xaa\\xe0\\xbfwj\\x8d\\xea>\\x01\\xd5\\xbf\\xfd\\xe4\\xe8e\\x13\\xcd\\x97\\xbf~\\xafQ\\\\\\xebi\\xcb\\xbf[ZD7\\xcd$\\xe2\\xbf\\x02\\xfbk>/XW?/\\xf3B,q\\x94\\xf8\\xbfR\\xaaC|qT\\xd8\\xbf3eR\\x16u?\\xd1\\xbf^S\\xd2\\x94c\\xa6\\xd5\\xbf\\x89\\xaa\\xf4\\xaf0;\\xe6?(1\\x8e\\xeb\\xc73\\xec\\xbf\\x0f\\x90\\xa3f\\x91\\xd1\\xdd?&\\x1e\\'\\xab\\x93\\xe7\\xf1\\xbf\\'$\\x86j\\x9eD\\xfa?\\x04<\\x10\\x8b\\x1b<\\xe2?\\xed\\x03C\\xe3\\xd0\\x11\\xf5?\\\\\\xa0v\\x85i\\xba\\xd8?\\x0eD9\\xf5\\x98\\x1f\\xd4?E\\x135l\\x87\\xc8\\xc3?\\xba\\xaf\\xe0\\x18\\xcc7\\xc7?J\\xdb\\xa4\\xac0\\x1e\\xe4\\xbf\\x83\\x8a\\xbd\\x11g\\xc7\\xfb?\\x13aOK x\\xe9?\\xc3\\'\\xfb\\x0f\\xa1\\xec\\xe6\\xbf\\x90\\x8b}\\xb9\\x86\\x9d\\xb5\\xbfW%\\xf6\\xaa\\xf6\\x9d\\xd2\\xbf\\xa5S\\xf8\\xa3u\\xdf\\xdb\\xbf\\xb1\\x83\\xbb\\xe9\\xd49\\xf8\\xbf3\\x17\\xd5\\x16\\xb5B\\xe1\\xbfo\\x9f2M\\x1d\\x0c\\xeb\\xbf\\x1d\\xa6\\xea\\xfc\\xecy\\xe6?/\\x9f\\x88\\x9f\\x107\\xd1?\\x9f\\x9bp\\xc0\\xf8\\xb7\\xe5\\xbf5B\\xff\\xe0\\x0cd\\x03\\xc0\\xfc\\xf9a\\xf4Ut\\xd2\\xbf\\xe3v\\xfalH\\x18\\xf1\\xbf\\xbf;3~\\xf7\\xb4\\xb2\\xbfsJ\\xc5\\x1fV\\xda\\xcb?\\x8a\\x9ew\\xf3\\xff7\\x06@\\xbd\\xed\\xa9\\xce\\xf3\\x9c\\xd6\\xbf\\xca:\\x90B&\\xbf\\xfb\\xbf\\x88\\x08AAL_\\xf1\\xbfJ\\xf8\\x14^di\\xf7\\xbf\\xfdYz\\x1e\\xa6\\xfd\\xfb?A^\\x81\\xe9\\x1b9\\xce\\xbf\\x86\\xcb\\x0fE2L~?\\x85\\x84IO0&\\xfa?\\xf8\\xdd\\xb7\\x9c{\\x7f\\xd7?\\xc2\\xb2D\\x86\\xa1\\xaf\\xe1?uB\\x0fDA\\x7f\\xe7\\xbf\\xb1%\\x18)\\x91\\x06\\xd2?e\\xf9\\xbd8\\xcd7\\xe5?\\xe6\\x0c\\x94\\xbf\\x04\\xad\\xf9?0\\xc1\\xa8\\x07L\\xd7\\xf1\\xbf\\x1b\\x81a\\xa3\\x7f*\\xe6?\\x8d\\x90\\xc2\\x10\\x00\\xf6\\xe0\\xbfP\\x92Q\\xb4\\xd9\\x16\\xba?\\x95\\xc6P\\xe7\\x12b\\xbb?\\x11O\\xfbw\\x86\\xa7\\xfb?\\xfe\\xd1\\x1d\\x9e4\\xf7\\xf0?f\\xdc\\x90_\\x87t\\xe6?\\xfa|\\xe4\\x83)\\xde\\x98\\xbfc\\xce\\xa4\\x96\\xba\\x04\\xf4?\\xa4\\xb5\\x896\\x97\\xd3\\xfa\\xbfc\\xe7\\xe4e\\xe5\\xc5\\x86\\xbf\\xee\\x07(\\x13\\x191\\xe0\\xbf\\xa3;@~:.\\xe7?luY2b\\x01\\xe4?c\\xc78\\x9cnn\\xf1\\xbf\\xdb\\x98oA\\\\f\\x03\\xc0v\\xafB\\xc8\\xfd\\xa2\\xe2\\xbf\\xfb\\x05\\xcb\\xf5\\x95\\xeb\\xe6?2V`r\\xa4<\\xce?t\\xa6Y_yu\\xe5?\\xb7@\\xc3u2\\xab\\xdf?\\xb1/\\x01\\x16\\xc5\\xe6\\xe5?RL\\xdb\\xe4\\xa6\\xe8\\xee\\xbf\\x95\\xaa\\x86$\\x16D\\xd7?\\xf9\\xbd\\xf1K\\xed\\x85\\xac?\\xa2\\xdb\\xcd\\xc5a\\xdf\\xf2?\\xfe\\x0b\\xbe\\x89\\xfb\\xe6\\xf0?p\\x94\\x8c\\xcf@:\\xf2?7R\\xc84Y\\xa1\\xeb?,\\xff\\'\\xb1v\\xdc\\xdf?\\xf3\\xa8\\xc1\\\\\\xcc\\xdd\\xe1?\\xb6I\\xf2V\\x03\\xb8\\x00\\xc06\\x9f\\xb2J\\x16\\xa9\\xdc\\xbf\\xa1\\xe8W$f9\\xae\\xbf)\\x9e\\x86\\x8a\\xbf\\xd5\\xeb?\\xe0\\x85\\xef\\xfd\\x93T\\xfc?W1\\xfd\\xee\\xb2x\\xe9?\\xf0\"E\\xe4\\xa5\\xb8\\x03@0\\x05\\xd2[\\xfe\\x96\\xcf\\xbf5\\x08-\\x08v\\xc7\\xa9?\\x1e\\x7fg\\xed\\x9d\\xcd\\xb8\\xbf+ke\\xb6\\x0e\\xf4\\xf9\\xbf\\xe8\\x1bs\\x8d{\\xca\\xcc?\\xe8G\\x81\\xfa{\\xed\\xd2?\\x0b\\xcd3\\xdf\\x8e\\xf7\\xee?\\x19\\x06\\xe1PR\\'\\xd7?\\x0c-\\xdc\\xcd(~\\xf9?\\xc0\\x99\\x07\\xe1-\\xca\\xc5?b\\xf7\\x80E|N\\xd4?\\xdd\\xc3t?<\\x98\\xb2?\\xc1m\\xb9\\x0e\\xce\\xf4\\xf6?^\\x11B\\xef\\x10\\xdd\\xba\\xbfL\\x9f\\xf9\\x17#\\x03\\xd5\\xbf\\x82\\xdbxnF\\xf1\\xdb\\xbf\\x02~e\\xf6Q\\x0c\\xf1?\\x7f\\xca=ht\\\\\\xf4?k$bFl\\xae\\xf2?d\\x874\\x14_\\x1c\\xea?9\\xa4\\xa7\\x19`n\\xd0?\\xc7\\x97V{^\\x03\\xef?\\xdf\\xd0\\xc7\\xc2\\\\N\\xee?\\x91\\xe7\\xd8\\x1dh|\\xed?`\"\\x86\\xde\\xb4\\x97\\xfc?:\\xdd\\x94hD%\\x06@-\\xcf\\xdc\\xa2<\\x84\\x00@\\x1f89\\x9c4\\xa4\\x05@t\\xba\\\\&\\xbf\\xec\\x02@{\\xad\\x99xq\\xc9\\xf0?J\\xcb\\xc6AF\\xb3\\xfa?\\xa2\\xcaL\\xf9=\\x88\\xd0?\\x1dK\\xec-\\xae\\x81\\xe0?\\xca\\xfe\\xdf\\x12\\x8cH\\xda\\xbf\\xb4\\x1c\\x90\\xfeu\\xfe\\xe0?v\\x8br\\xd2\\xda\\xc7\\xe4?~(\\xd4\\xe7|T\\x94?P\\x17XeB\\xd0\\x94?\\xe9\\xea\\x90*\\x01\\x90\\xe0\\xbfn\\x03g%\\xffZ\\xe7\\xbf\\x86\\x01z1\\xd3\\xe8\\xb1?Z\\xc7\\x15\\xd1i$\\xe5?y\\xaf\\xb5\\'\\x1dE\\xec\\xbf\\xd1\\xa8\\xe5\\x8dS`\\xf4?,\\xd6\\xfb\\x9d\\xea-\\xe6\\xbfX\\x1f\\n&G\\xd5\\xf8?_\\x9d\\xc9\\x1a\\x9d\\x83\\xfd?\\x0bz\\x07a\\xcc\\xc0\\xeb?\\xd4i\\xf5\\x0cF\\x10\\xfd?\\x131=\\xdc\\x0e\\xcc\\xdf?N\\xf0=\\x1a\\x04\\x11\\xd5?\\xe9\\x97t\\x03\\xa6\\x0e\\xf6?\\x92\\xde\\xf5,\\xd6\\xfe\\x04@eW\\xba\\x90C\\x86\\xf5?\\x16\\x87\\xd9\\x87_\\xfe\\x03@\\x99R\\xe9\\xfc\\xc9\\xad\\x03@\\x9f\\xc0!\\n\\xcdt\\x03@\\xfd\\x92\\x0b\\n6\\xec\\xf5?\\xe5z\"\\xff\\xe5\\x7f\\xef?M\\xc3\\xd3\\xe6\\xfb\\xd6\\xe9?\\xcc\\x96.\\xcd\\xbe$\\xdb?\\xe3z\\x8dh\\x04\\xd1\\xca\\xbf\\xbf\\xed\\x02P\\t\\x8b\\xec\\xbf\\xc6\\x84\\xf6\\xef6\\x01\\xd8?\\x1a-\\xeaG6\\x18\\xed\\xbf(\\xa5!l\\x93s\\xdb\\xbf\\x9b\\x13G\\x12\\xe3\\xdb\\xf4\\xbf\\xcd\\x03r\\x0b\\x03j\\xf3\\xbf\\xe6\\xb3\\xdc\\xc5\\xc0>\\xe3\\xbf+\\xabw\\xc2z\\xe3\\xce\\xbf\\xef<\\xf2j\\x07>\\xed\\xbfB\\x9b\\x8a\\x16\\x8bX\\xad?\\x18z\\x96\\x96#P\\xf2?v\\xab\\xba\\xd94\\\\\\xb9?\\x97\\x16GT\\xd6X\\xfd?\\x95\\xf9\\xd6A\\xeb\\x9e\\xff?\\x15B\\xb8\\x02\\xf9[\\x05@C\\x18m\\x8b\\x15!\\xed?k&\\x84MHP\\x04@\\xb5\\t\\xb3\\x8cdE\\xf4?\\x8f4\\xdb\\x8c\\xaf\\xb1\\xf1?\\xd8\\x82\\xa9\\xe73\\x1f\\xe6?\\xb9\\xc1tl\\x02\\x13\\x9e\\xbfU*F\\xd2d3\\xe1?\\xdf\\x1bYr\\x86t\\xdb?\\xfd5$S\\xf8\\xfb\\xf8?\\xf1\\x94\\xc5A\\x95\\x98\\xf9?\\xfc\\xbd\\xc6\\x07\\x82\\x94\\xe1?)\\xbd\\x17\\xd1;:\\xda?\\xca\\x07R \\xd7\\x1a\\xcb?\\xe7\\xdf\\xde\\xc7~\\x94\\xf1\\xbfu\\xc5\\xbd\\xb6\\xd7A\\xc6\\xbf\\x9d\\xde\\xde\\xa1S\\x1c\\xee\\xbf\\x84\\x9b\\xa6\\x895\\xc6\\xec\\xbf\\xecp\\\\\\xcb\\xa3\\x16\\xf2?VE\\x0bY\\xd9\\xf4\\xc9?\\xd8f\\x95\\xf3^\\x06\\xd9\\xbfj\\x94\\xfb\\\\\\xee\\x1f\\xe8?^n&R\\xb1`\\xf2?\\xcc\\x03\\xd7\\xcd1E\\xe0?\\x07\\x0b\\x85\\xa8 q\\xd5?\\rf\\xad9\\xd3\\x9d\\xf0?\\xd9/\\xd4\\xf6?\\xa9\\xe8?>4\\xb9\\xfa\\xf1,\\xf1?\\xc4\"]\\xfeT\\xcc\\xda?\\x1a2\\xdd\\xe64D\\xf8?qr\\x86V\\x8b\\xb1\\xf0?H\\xaaVE\\x1a%\\xd3?&Z\\xa5\\xd7_&\\xe0?a\\x91\\xb4As\\xfe\\xe9?\\x91\\xa9\\xab\\xf0\\x9d\\xf4\\xf1?|\\xbf\\xfd\\xc4R\\x82\\xba\\xbf\\t\\xfc\\xcb&\\xaf\"\\xc7\\xbf\\xda\\xaa\\x17>\\x84:\\xf4?\\x8crg\\xf3 \\x17\\xd9?\\xef\\xce\\x08\\xa8\\xdf\\xf2\\xf5?\\xac\\xde\\xfd\\x93hr\\xfe?V\\\\\\xea\\x848\\xbc\\xee??\\xd7\\x954\\xa3^\\xd1\\xbf\\xb0\\xc7\\xf8\\x06s\\\\\\xd2?\\xadf\\xf0\\x81\\x81\\xb2\\xf0?M\\xbd9\\xaf|\\xa9\\xc1?W\\xb4\\x89\\xe0ZK\\xc5?UL\\xcb\\x06\\xc1\\xed\\xea?Z\\xc6\\xd9\\x80\\xb88\\xdc\\xbf\\r\\xa1\\xbd4\\xe9m\\xda\\xbf\\xab\\xe2lL\\xa8{\\xdc\\xbf\\xa0v\\xa3\\xe6Tu\\xce\\xbf\\xd03f\\x1d\\xb3\\xb3\\xea?\\x93\\xc2\\xcd\\xae<\\x8f\\xea?\\x08N\\x97\\xa1\\xb8)\\xc0\\xbf\\x99\\x9a\\x9f\\x97\\xab\\xba\\xd3?&Nl#\\x82\\x1e\\xd5?\\x1c\\x02\\xf9XL|\\xa4?S\\x99b q{\\xf0?\\xbeK\\xec\\xa4\\xf0q\\xdb?\\x0fe\\xed\\xc4\\xc3\\x17\\xe7?\\xfa\\x97\\xb8(\\xcc\\x81\\xf0?\\xe1\\xf3\\xb7\\xf6H\\xa7\\xf2\\xbf\\x84\\x18T\\xa3\\x86\\x08\\xd1\\xbf\\xaf4\\xa6DQ\\xe2\\xde?\\xb5\\xec\\x9f\\xbc\\xfb4\\xe0?\\xe2\\xa2\\xcdJ,\\xa5\\xee?b\\xd2\\xda\\x03\\x9d\\x1c\\xe2\\xbf\\xa6\\x8c\\x1c9\\x8cC\\xe2?\\xe6vzZ\\x1f\\x83\\xf1\\xbf\\x16\\xce\\xb8\\x85\\xf3\\xde\\xf0\\xbf\\xe7\\x05tJ\\xca\\x04\\xbc\\xbf\\xcc;\\xdc\\xec\\xb2d\\xaf?\\x1b\\x88Rc|2\\xf3?\\x97\\xb2w\\xdfl\\x10\\xdb?e\\\\\\xfeN\\xe0M\\xde\\xbf\\t\\xe7\\x98\\xf2\\xd6\\xe1\\xde?\\\\\\xef\\xb2M\\xc2/\\xc8\\xbf\\x90\\x16M\\xb8\\xbb\\xc2\\xca?@\\x11l\\x8a\\x1f\\xff\\xc6\\xbf$\\x03\\xad\\x1dF\\x96\\xdc\\xbf\\x8d\\x14\\xc0\\x89\\x99b\\xf2?)\\xda\\x9d\\xb3\\t\\xdb\\xd9?\\xcd#\\x1e\\xd2k\\xc4\\xd2\\xbf\\x0e?h\\xab\\xd5\\xd6\\xe2\\xbfj\\x95\"\\x98\\x01D\\xca?\\x83\\x91X\\xf8\\x8a\"\\xcb\\xbf\\'\\x95\\xff\\x8da5\\xe5\\xbf\\x9f\\x8a\\xb0=\\xce\\x87\\xf7\\xbf\\xf6Y\\xa3\\xe9\\x9fe\\xe8\\xbf\\xa0}\\xad*\\x8f{\\xb8\\xbf<\\xec\\x19\\x92\\xc2\\xb5\\xee?i\\'\\xb9p\\xdd\\xbc\\xdd? T\\xfdv\\xd4\\xff\\xdd?q\\x14C\\xbe-\\x88\\xf2?\\xf0T\\xcc\\x8c`\\x95\\xf5?%L\\xf9xY\\xfd\\xd5?\\xc5\\x1am/\\xb6R\\xed\\xbf\\x9c>\\xd2\\xd1u\\xf4\\xd5?S&\\x07\\xbfK\\'\\xdd\\xbf*w\\x83\\xef\\x90\\xd8\\xcd?W\\x8co_\\x7f\\r\\xf4?\\xb0v\\xf8\\xf9\\x82h\\xf1\\xbf\\r\\x15|=\\xfcL\\xbb?\\xe9Dd\\xdd\\x7f\\x93\\xe9?\\xc0\\xf7\\xe80\\xdf(\\xe6?o\\xd3\\xaf\\xf2\\x1f\\x9e\\xe5?z3a\\xb6\\x0f\\x90\\xc8\\xbf\\x93\\'\\x98\\xe6(\\x16\\xd4\\xbfmD\\x9dX\\xf1\\xf4\\xd7?n\\x9a\\xef\\xe0^\\xc6\\xd7\\xbf\\x8c\\x1aE#\\xdb8\\xb1\\xbf\\xf4\\'\\x87\\xd1\\x1eM\\xd9\\xbfCFD\\xc7\\xee\"\\xc1?Y\\x92\\xe5\\xc6i\\x18\\xf3?\\xa6\\xc6\\x9b6\\xd5\\x1b\\xd8\\xbf\\x95\\xddP\\xa0\\xb8\\xcb\\xf5?-/d0N\\x92\\xda\\xbf)SZFh\\x90\\xd2\\xbf\\x9ex\\xb7\\x85)\\xf3\\xf1?\\x98\\xd0\\x12\\xab\\xb0S\\xd4?\\xf2lt\\x15\\xc7sl\\xbfleX\\xf3\\xcb\\xae\\xb3\\xbf\\x1aO\\xee\\xe4\\x1a4\\xd7?H\\xad\\xd2y\\xe9\\x85\\xea?i\\xbb9\\x8cq,\\xf5\\xbf\\xba\\xbc\\x83[\\xca\\'\\xf1\\xbf\\xc58\\xaf7c\\xa2\\xc6\\xbfr\\xa58\\xe0\\xcb%\\xf1\\xbf\\xbb\\xe8\\x07\\xf83t\\xdc?\\xc6m\\xc3#!Z\\xe6\\xbf\\xd8\\x11\\n\\x97:]\\xd5\\xbf\\xb2\\xc5u\\x86\\xeb\\x8a\\x02@a\\xcf\\x81T\\xfe\\xe7\\xe9?1\\xddZ\\xda\\xf5\\\\\\xed?ff\\x19\\xfa\\x81i\\xe1\\xbf\\x0b\\x163\\xdaK\\x8d\\xe3\\xbfr\\x9f\\x12\\x81\\x01\\x84\\xd8?\\xe53\\xa0\\x97Uw\\xd6\\xbfn\\xe7YAFO\\xbe?\\x13\\x8cj\\xc0|\\xc6\\xdc?y\\xd4\\xbc~\\xed\\x10\\xee?8\\x87Mj\\xb0\\xda\\xe8\\xbf9\\xad\\xe2\\xb4L\\x8b\\xf3\\xbf\\x05{\\xd8\\x97\\x16l\\xbc?\\xe5\\xea\\xba\\x8ah\\x89\\xe3\\xbf4n\\xc2\\x06\\x94\\xa0\\xf4?\\x0f\\xa0/\\xd5\\xe0\\xa9\\xe3?\\xa4\\x85Os/R\\xc7\\xbf\\x8f\\x06r\\xfa\\xdc\\xd1\\xd5\\xbf\\x93O\\x04?%.\\xe6?\\xa3\\x91\\xb9\\\\h\\x83\\xe6\\xbf\\x04\\xe0\\xf1\\xd0\\x98\\x1b\\xd8?\\x89<Q\\\\\\x04[\\xd4?\\\\$\\xb8*\\x0f\\xf4\\xf1?T\\xe3Sa?\\xcd\\xe0\\xbf\\xbf\\x0e\\x88G\\xbb\\x81\\xfb?\\xd1\\x9d\\xa91m\\x16\\x9c\\xbf\\xf5\\xed\\xd6\\xf6\\xe7\\xcf\\x8a?H\\xd4X\\x0e\\x08)\\xeb?3\\xea\\xaf\\xd38\\x89\\xeb\\xbf\\xac\\x0c\\x18\\x9f5S\\xd5\\xbf\\xd3\\x14\\x1dQ^W\\xc2\\xbf\\x1f\\xf0:\\xaa\\x81M\\x83\\xbf\\x97\\x99\\xb4L\\xfa\\x90\\xb7?\\xa3ui<\\xb2I\\xdc\\xbf\\xfb\\x80\\x9d\\xba\\xe0\\x87\\xe1\\xbf0\\xb0^C\\x03\\x12\\xe4?\\x07\\xef\\x07\\x8f\\x89\\x7f\\xdf\\xbf\\xe6\\xd9_\\xa3\\x90\\x1e\\xe6?\\xbe\\xdbIaP4\\xf4?9\\xf1\\x92E#\\xc1\\xd8\\xbf=\\x84\\x1esc\\xd2\\xe3?\\xfb\\x852\\x1f\\x9eP\\xc9?z\\xfc7f\\xc7\\x7f\\xb6?\\xd7\\x17f\\xc1\\xd3g\\xcd?\\x9b\\x16\\x91\\xa6\\xccG\\xea\\xbf\\xa6|\\xc9$\\x91\\xad\\xaf\\xbf\\xdbH\\xfe)\\xc0?\\xc5?\\xa63 \\x08M\\x02\\xd2?\\x1fa\\xd7\\xad\\xde\\xa5\\xdc?\\xc4\\xcd\\xb90\\x03\\x93\\xd1?8C\\x15d\\x80j\\x7f\\xbf\\xae1\\x17yLQ\\xd3\\xbfc\\x86}\\xc1\\xf3\\xcf\\xb8?\\x8b\\xdeg4jC\\xf4\\xbf\\x1fQB\\x96\\xde\\x00\\xe3?\\x9d\\x84\\xe2\\x96)\\xf5\\xf0?\\x105\\xff&\\x1c\\x89\\xb0\\xbf\\xf2\\xcb\\x14\\xd4\\x00\\xfe\\xf2\\xbf\\xc8\\x14\\xb5l\\x19_\\xd5\\xbf\\x88\\x88R\\xb7\\xac\\x12\\xc3?A\\xe1Y\\x018\\xcf\\xf8?\\xc0\\x80)\\x9b\\x08\\x1f\\xd2?\\x9d\\x1f#N@z\\xfa?\\x9e\\x1a\\x15\\x89\\xfa\\xec\\xf4?\\xa9\\xff\\x84P\\xa5\\xa1\\xf6?*{\\x15U\\x86\\x98\\x05@\\xdf\\x7f\\xf5\\x97\\x96\\xee\\xf9?pQj\\xda&\\xc8\\xfb?mw\\xb5\\xa9\\xa8\\x86\\xcd?o\\xaeR\\x0b^_\\xef?\\x9d\\xcd\\xaa%s\\xec\\xee?\\xc0\\xad\\'\\xdb\\x7f\\xe6\\xf5?\\xa8B=(}[\\xfe?\\xe0\\x11#\\xeem\\xd8\\xd4?\\xf9\\xb2~\\xa6\\x02W\\xec?\\xe9M\\x9f\\xa3\\xf1!\\xcf?7\\x8c86\\xe2\\x17\\xcc\\xbf\\xb2\\xd9U\\xb5J\\xbc\\xba?\\x9e\\xc9\\xfep>d\\xe8?\\xf8\\xb6\\x1b\\xda\\xba\\x7f\\xb5\\xbf@\\x82m\\xbf\\xe4\\xc7\\xea?k\\xf5\\xc2\\x1b\\x99\\xcb\\xd9?\\r\\xb3\\x83\\xf3\\xe4T\\xdf?(/.}\\xad\\x7f\\xdc\\xbf\\x8a\\xff-\\xfc\\x06\\n\\xf5\\xbf\\xea\\xa7\\x1f\\nke\\xf0\\xbf\\x15\\x1bp\\x91\\xc7\\x84\\xc1\\xbf\\xa2^\\x0f\\x9b\\xc4\\x84\\xf1?\\xbcu\\xc3T\\x83~\\xf5?\\xc8\\xed\\xc3\\xa2K\\x81\\t@\\x00S\\x99~O%\\x15@N9_U\\xb9v\\x0e@\\xd4iC\\xf8b\\xeb\\x06@ur2D\\x93^\\x06@\\x843?\\xa7\\x1a\\x08\\x07@\\x16\\x1a\\xbcl,\\xfe\\xfe?\\xcc\\x11}\\xef\\xbfO\\xef\\xbfW\\xd7k8F\\xb6\\x00@\\x87\\xbaU.\\xfa\\xa4\\xa4?\\xf6\\xe2\\x8e\\x95?C\\xf6\\xbf\\xbe\\xeb\\xf3<\\x1a\\x91\\xb5\\xbf0\\x1e\\xe69\\x8b\\x87\\xcc\\xbf>\\x02]\\xadq\\xc0\\xed\\xbfa\\xfc\\xa0\\xa9e`\\xe4?\\xae\\xe5\\xb4\\xb9\\xe8\\xa5\\xdf?\\x8d\\x91+\\x876\\x16\\xa8\\xbfw\\xb88\\x8c\\xaet\\xe8?\\xac}Q\\xec;\\xb7\\x00\\xc0\\xe9\\xb4.\\x98\\x16\\xa4\\xee?\\xeby \\x00\\xcd>\\x9a?\\x9f\\xd3\\xf1:\\x10\\\\\\xe7\\xbf\\x98u\\x8dp~m\\x90\\xbf\\xc7\\x82\\xef\\xdc.\\xb2\\xe5?\\x08fN?q\\xb1\\xf3?\\xfe\\xb8\\x15\\xd3\\xd0\\xb0\\xda?\\xdb\\x8b\\x91\\x115}\\xbe\\xbf\\xec.\\x19\\xe0\\x98u\\xeb?\\x06\\x07\\xe7\\xd3\\x080\\x03@\\xf3w\\xef\\xc4\\xa1W\\xe6\\xbf\\xbe\\xcb\\x18\\xc9\\xbd\\xef\\xe5\\xbf\\x90\\xfdf>\\xad@\\xf0?>6\\xc2\\xe5\\x8d)\\x00\\xc0\\x9cG\\x98$\\r\\xa4\\xfc\\xbf\\x99\\x1c\\xf6\\xbc(\\xd8\\xf6\\xbf\\xb1~\\r<\\x84\\xd5\\xe0\\xbf2\\n\\x8b\\xce\\x9e\\x85\\xea\\xbf\\xf0!\\t\\x80\\xc7\\x95\\xfa\\xbf\\x83\\xd3\\xee\\x8d{\\xeb\\xb3?lY\\xa7\\xfe&\\xf3\\xff\\xbfp/\\xb0m\\x8a\\x97\\xe1\\xbf\\x88\\x0cv\\xe8\\xdb\\x19\\xea?b6*\\xd4\\xb2\\xd2\\xe7\\xbf\\x01Si\\xc7\\x11\\xd6\\xd4?\\x82\\x98\\xb2hU\\x95\\xfd?\\xde\\xce=\\x0c!\\xa2\\xf0\\xbf\\xc5joN?\\xb1\\x01\\xc0\\xad;\\xc13\\xd0j\\xd7?\\xcf\\x97\\xac\\xad\\x93V\\xd9?,\\x13\\xa1\\xa3\\'\\xaf\\xe7\\xbf\\xf3\\x12\\x8e\\x15\\x8d\\xa8\\xb8\\xbf\\xce\\x96\\xa9\\xb8\\xec\\xfa\\xe4\\xbf\\xce\\xb1\"x[\\x1b\\xdd\\xbfxCm\\xfel@\\xf8\\xbf\\x98\\x99\\xf0\\xb6x\\x0e\\xf5\\xbfb\\xed\\xc7\\x02\\xcf\\xb0\\xfb\\xbf/\\x7f\\'+\\x93\\x98\\xed\\xbf\\x8b@\\x1b<?\\x1d\\xf4?@\\xa0\\x808\\x00a\\xc8?\\xf5+\\xb5\\x15\\xe4\\xcd\\xe0?SF\\x05\\xe4\\xfc9\\xfd\\xbf\\xe4\\x98\\x1a\\xcac\\x02\\xf0\\xbf\\x1a\\xc7\\xb8\\xa5\\x9e\\xa1\\xfb?\\x8e\\x8c\\x9d\\xb12$\\xb3?&.\\xc7\\x1e\\r|\\xef?\\x026\\x92\\xd7;\\xea\\xe0?\\x17\\x1b\\x98\\xe9\\xfc-\\x02@:C!!\\x84K\\xff?\\x00US\\xafWw\\xf5?\\\\\\xb8\\xea\\xeaN\\x1d\\x05@\\x93\\xa9\\x16\\xaca\\xc0\\xfd?\\xf8@\\xcc*75\\xf9?\\xa3H\\xd2\\xb8\\x81\\x8a\\xe1?\\xb6OR{I\\xd4\\xcf\\xbf>\\x7f\\xc7\\xa5\\x03\\x13\\xb5?\\xf5l\\xd8\\x96\\xcax\\xf0\\xbf\\xfe\\n\\xc0\\xa6\\xd9\\x1f\\xc8\\xbfe\\xfe\\x97\\x1d\\x90\\x12\\xed?w\\xca\\xf6\\xbaR\\x12\\xe0\\xbf\\x96\\xfc;\\xd0n\\x9e\\xc1?:J\\x14\\xb3\\xbd\\xa5\\xcc\\xbf\\xc2\\xa8\\xf73\\xdb+\\xe7\\xbf\\x01 &+\\xa4B\\xfe\\xbf\\x1f\\xda\\x1c\\xb3\\xe9M\\xfd\\xbf\\xb9\\xc6]\\x97\\x00\\xb4\\xe6?\\xf3\\x03/\\xdf\\x87>\\xfc\\xbf\\x84\\x19=\\xa8\\xeb\\x90\\xf0\\xbf1\\x8a$]s\\xba\\xee?D\\'\\x1b\\x92\\xd9v\\xc8?\\xdbF).\\x8b\\x1b\\x06\\xc0\\xf3QW2F\\xbe\\xd8\\xbf\\x98\\x9be}\\xf8\\xc5\\xfc\\xbf\\xa0\\xae\\xff\\xd9\\xce\\xdc\\xf3\\xbf&\"{\\xbe`\\xd4\\xee\\xbf\\x0bx.\\x1ft\\xfe\\xf1\\xbfZ\\x84\\xe89\\x8e6\\x03\\xc0\\xa1O2\\xa6;\\x1b\\x02\\xc0\\x86)\\xbb\\xeb{O\\xea\\xbf\\xfe\\x8c\\x7f\\x1bD\\xe3\\xea\\xbf~\\xb5\\n\\x9e\\x14\\xb4\\xf8?2\\x90E=\\xae\\xc9\\xf2?\\xc9\\xe4\\x93X\\xfa\\x12\\x07@7v4\\xba@@\\xc9\\xbf\\xbb\\xe8\\xbe8$!\\xb8\\xbf\\x8f\\xb1\\x17\\xb9\\xba\\xdd\\xea\\xbf4\\xb3\\xa4\\'\\xf0\\xe2\\xc8\\xbf\\x01%(\\x83\\xde\\x17\\xe8\\xbf\\xb0\\xf5\\xd1\\x89\\xd0\\x02\\xd1\\xbf\\xda\\x18U\\x81\\xd1\\x87\\xf0\\xbf\\xf7\\x80|\\xbe\\xe8\\x19\\xfe\\xbf\\xab;\\xb7\\xdd\\xbe>\\xf8\\xbf\\x16\\xca\\xbe\\x11\\xe4\\xfc\\xb1?}\\x11m\\x08a\\r\\xc6\\xbf\\r\\x84\\x99\\x1d\\x18\\xc1\\x04\\xc0\\xe2\\x17\\xb5\\xd1\\t\\xd1\\xd7\\xbf\\x9bxXf\\x9a\\x93\\xf2?a\\xac\\xb4\\xfb\\x19R\\xd0?\\xc1\\xd0BO\\x90b\\xe0\\xbf\\xb3_I;\\xa9\\xec\\x04\\xc0].\\xa9}\\xb2o\\xe2\\xbf\\xe565\\xcc\\xe4u\\xd2\\xbf\\x88\\xd3\\x9br\\xeb\\x1f\\xf0\\xbf\\xee\\x01}\\x89\\x1c\\x12\\xf6\\xbf\\xef\\xaf\\x08L\\xd9\\xa4\\xf5\\xbf\\xbd\\xe1}\\xf7\\x0f\\x95\\xf2\\xbf{\\xacg\\xcf\\xd9b\\xf9\\xbf/\\xbc2#\\xd9\\xda\\xfe\\xbf+\\xa6\\xe3\\xc5\\n\\xde\\xf1\\xbf\\x84\\xb8qk\\xc6\\xbe\\x0b\\xc0s\\xa3\\xc2\\xaf\\xfaQ\\xec\\xbf\\xf2\\xb8\\x93)\\x878\\xc4?p\\xc5\\x06\\x0f\\x9cY\\xfc\\xbf\\x9e\\xef\\x86\\xd1\\xd63\\xd9\\xbfx\\x93Q\\xe1\\xa0\\x13\\xb8?rX4\\xa6Q\\'\\xbe\\xbf\\xf6\\x81\\xb1I&\\'\\xd8?\\xcez\\xc0\\x89\\xf3H\\xf0\\xbfW\\xb2\\xae\\x06}\\x84\\x08\\xc0\\x86T\\x05\\xe9[J\\xf8?:wv\\xcf\\x90\\xb1\\xf1?\\x84\\xcf\\x03\\x18,f\\xe0?\\xb0T\\xcdsw\\xb6\\xdd?2\\x84\\xd4\\xa7\\xad\\xd0\\xbf\\xbf\\xe1,\\xff\\r\\x8a\\x8b\\xf8\\xbfa\\xf28\\x92#:\\xfe?\\x07\\x11\\x8d\\xd6\\xe90\\xeb\\xbf\\xbf\\x87\\x88\\xaeI\\x80\\xfb\\xbfsw\\xed\\xc09\\xea\\xe0\\xbf\\xd3\\xe2qP\\x0fb\\xb9?\\xec<\\xe62\\xc4\\xd6\\x13\\xc0\\'\\x93\\xaf(\\xc4R\\xd8?\\x10p^\\xa1\\xcd\\x1e\\x12\\xc0`;7\\xfe\\xbb\\x19\\x13\\xc0\\xef\\x05u\\xa8\\xf4y\\x03\\xc0m\\x12\\x9dc\\x97\\xc0\\x07\\xc0T\\xc1\\r\\xea\\xdc\\x10\\x03\\xc0c\\x88\\x96\\x9f\\xd3q\\x16\\xc07W\\x9b\\x17\\xd3\\x16\\x0f\\xc0\\xd1Y)tVv\\xc1\\xbf\\xe1Z\\xd3f\\xb6g\\xec\\xbf\\xe9\\\\Fj\\xe5i\\xfe\\xbf\\x02\\r\\xbf\\xc4C\\xf4\\xe9\\xbf\\xc2\\xc3q\\xf0A\\x0b\\xf2\\xbfr\\x0cM\\x83\\xb6\\xa5\\xf3?Y\\xf5\\xe5\\xa4\\x80\\xf9\\xe0\\xbf\\x13|\\xbb\\x1b\\x7f\\xea\\xe4\\xbf\\xbc\\xc2S(oh\\x01@\\xfd\\xb9\\x83\\x95\\xe7\\x8f\\xeb\\xbf\\xb0V\\x0f\\xb7\\xdf>\\xc2?\\x95\\t\\xa5}z\\xf0\\xf5\\xbf%v\\xdf N.\\xe8\\xbf\\\\\\x0bOl\\xee5\\xcc\\xbf\\xfbXI1\\xbd\\x0f\\xfb?(\\x15\\x0fY\\x83\\xa5\\xf1?\\x8e\\x8f(=l\\'\\xb7\\xbf3cKZ_n\\x00\\xc0\\xbb \\xa3\\xfb\\xe2\\xc8\\xfe\\xbf\\xc0~\\x81\\x10E\\x15\\xfa\\xbf`\\x10\\x0co\\x8d\\x9c\\x0b\\xc0*\\x8e^\\xb7\\xb5\\xca\\x0e\\xc0\\x07,\\xf0\\x7fo\\t\\t\\xc0\\t\\x1dg\\xb2\\x9d\\xc0\\x06\\xc0\\xdf\\xc8\\xce\\xfd\\x11\\n\\x05\\xc07\\x13|$\\xda\\xe4\\x02\\xc0\\xc2\\x13\\x9c\\x9fl2\\x10\\xc0\\xee\\xbe\\x1ap\\x81\\x80\\x06\\xc0\\x02\\xbf\\x9f\\x03&\\xf4\\xe3?\\xb6f\\xec\\x9b\\x02\\x18\\xb7?A1\\xcd\\xf92\\xab\\xe7?8Tv\\xae\\x12_\\xf6\\xbf\\x19\\x9cUS\\xba\"\\xdc\\xbf\\xa9nGz\\x1eK\\xea?I^Q=\\x1e\\x06\\xf2\\xbf\\x8ez\\xde \\x15k\\xe4\\xbfw|\\x04\\x00X&\\xe9?\\x0b\\x0b\\xbe\\x04\\xc3X\\xef\\xbfD@Y\\xcb\\xac=\\xeb?\\xcc`\\x80\\x1a\\x81\\x85\\xc8?\\xcfb\\xa5mh(\\xf3?v\\xdf+Y\\xe5\\x10\\xf5\\xbf\\xd9\\xfbl\\xee\\xf31\\xd3?H\\x1d\\xc1\\xfe\\xa1a\\xee\\xbf\\x08\\xe7P\\xfa\\xc6\\x02\\x85?\\xcd\\xd1OF\\xa8\\xdb\\xee\\xbf\\xf1w[\\xa7}\\x08\\xfb\\xbf\\xc5\\xda\\x17\\xba\\x9a\\x01\\xfb\\xbfX\\xf1\\xd3\\x0c\\x83\\xb0\\x05\\xc0\\x9b\\xc6\\x19\\xb5\\xbaD\\x04\\xc0!\\xdaK\\x1f\\xc3\\xa2\\x05\\xc0\\x14\\xeb~\\x12E\\x0e\\xef\\xbfL\\xcaQBc\\x8c\\x05\\xc0\\x91\\x185\\xfa\\x88\\x8a\\x02\\xc0\\xbfx\\xa9\\xd6[\\x9b\\xf7?1\\xa3x\\x7f\\xc9\\xdc\\x92\\xbfzV\\xcfN\\x1e\\xf9\\xb4?y  \\x9eC\\xd6\\xeb\\xbf,\\x12\\xe2\\xc7\\xe3N\\xe2?X\\n\\xb4F\\x82\\x05\\xe1?\\xca\\xe3\\xa4\\x8c\\xc4\\xd0\\xc4?\\xa1\\xf2d<?\\xa9\\xc3\\xbf\\xeb\\xdb/\\rLQ\\xa2\\xbf\\xb2f\\xcf\\x0b\\x16#\\xf0?\\xafp \\xf2C\\xda\\x00@\\r\\xc1\\xef\\xc8S\\xd5\\xec\\xbf\\xbc\\x11\\xe9e@\\x87\\xe1\\xbf]\\xd3\\x8d\\xa2\\x8fx\\xcb\\xbfB7:\\x8fA\\xcd\\x01\\xc0\\xef\\xdf\\xea\\xfc\\xff\\x1f\\xf5\\xbfG.\\xf4\\xc0<\\xc4\\xe1\\xbf6\\xdb\\x80\\xe5\\xfcZ\\xf0\\xbf\\x99t@\\xc4*\\x15\\xf8\\xbf\\xc4Ps\\xd0\\xb1\\x0f\\xeb\\xbf\\x95\\x88\\xc1\\xa7\\xe5\\x9a\\xc6\\xbf4\\x0e\\xf1\\xe9\\xdd\\x1b\\xa9\\xbf\\xc7G\\x06\\xb5\\x07\\xe1\\xf2\\xbf\\xca\\x0fT\\xe1\\xe3=\\xe6?\\xeb\\xc0\\xa8\\xc6\\x0ca\\xb6?Z\\x97\\x90\\xdd\\xc0\\xe6\\xf9\\xbf\\xfd\\xa4\\\\Yl\\x81\\xd3\\xbf\\xa2EG\\x83\\t\\xe0\\x01\\xc0Z\\xefQ\\x0c\\xf9\\x16\\xdf?\\xfa<%H7a\\xef?\\x7fD\\x00\\xc4c\\xfb\\xf1?\\xbe\\xce\\x85\\nE\\x00\\xf3?\\x91Bw2\\xa7\\x1a\\xc3?*\\x8eq\\r\\x1a\\xb3\\xd8\\xbf\\xca(\\x82\\xc2\\xc7\\xe4\\xd0\\xbf\\x1f#\\xaa\\\\J\\x8a\\xb3?\\x01\\xcc\\x05\\x85\\xe5\\xdc\\xf8?\\x9c\\xb0\\xa7\\xe7\\xc0\\xd1\\xbb\\xbf\\xdb>X\\x12F\\xd7\\xf4\\xbf\\xd2\\xbf\\x94\\xd8\\xd5\\x86\\xf3\\xbfQ\\xfb\\xb6\\xda\\xae3\\x00\\xc0\\'\\x19f\\x00\\xd4\\xf0\\x00\\xc0\\xbb\\x17\\x84h\\x0e\\xc3\\x04\\xc0\\xe21@\\x0c\\xf5*\\x05\\xc0\\x8d\\xd0e\\x06n\\xc7\\xf1\\xbfe\\xc8\\x80\\xc1\\xe2\\xfa\\t\\xc0\\x8f\\xfa\\xf0\\xd4\\xa6\\xce\\x01\\xc0G7M<\\x1b\\xd4\\xf2?\\x1f\\xc9jHD\\x0f\\xaf?(aZ\\x1d\\xee^\\xa1?\\x10\\x12\\xdc\\xbb\\x83\\x03\\xf5\\xbf8\\xfdg\\xe9\\xc2\\xff\\xba?\\x1f\\xef\\x8d\\xe7\\x1c2\\n\\xc05\\xeaK\\x1d\\xd5A\\xd0?\\xf0\\xe6\\xcd\\xd0\\xc7f\\xc5?\\x0f\\xd4\\xd4\\xa7\\xb6\\x87\\xb1\\xbf\\x9f\\xd1\\xa9\\xb5\\xbe\\xf5\\xfa\\xbf9\\x1a\\xa9\\x18\\x9f\\x13\\xf5?\\xeb\\x12\\xc5T\\xd0o\\xf0\\xbf\\xcf\\x14\\xe5md\\x8b\\xfb\\xbf\\xfd\\xd2\\xec\\x84\\xf3\\xa8\\x01@\\rEi\\xd57\\xc9\\xeb\\xbf3\\x8fU\\xfe\\xb9B\\xe1\\xbf\\x8e\\x8a\\xea\\xd8\\x08\\x8f\\xea\\xbf\\xad\\x9e&~\\xcao\\xe4?w\\xd2\\\\[\\x92\\x01\\x00\\xc0w\\xad\\xd4\\xf8\\xcc~\\x11\\xc0\\x9c#\\x01>\\xa3\\t\\xfc\\xbfJ\\xc5\\x90\\xec\\xa3\\r\\xf7\\xbfec\\x8d\\xf9\\xf2V\\n\\xc0T!\\x05Q5N\\xff\\xbf:G\\x1e\\xf2\\x17B\\x01\\xc0]7\\xf3y\\xbb\\xcd\\xd9\\xbfj\\xf5}\\xc9\\xd7\\x86\\xe8\\xbf\\xb5\\xbc\\xd7{\\xeb1\\xeb?w\\xb0\\xfa\\xa7iQ\\xf9?\\x85f\\xb7$\\xf3\\xd8\\x05\\xc0:\\xa04qp\\x1a\\xe0?i|\\xbf\\x02\\x80?\\xe3\\xbf\\xe1n\\xc6\\xbdy<\\xb4\\xbf\\x060\\x8e&\\x06\"\\xe3?\\xf3\\\\\\xccK\\xedN\\x81?r\"\\x19\\x80U$\\xf5?Y\\xf3\\xbf\\xa0\\xc3\\xb4\\xd2?\\xc5\\xd5^\\xb2\\x03\\xbd\\xf5?\\x9dp\\xb6\\x0eX3\\x01@\\xb5\\x0c\\x8e\\x84d\\x0f\\xe6\\xbf\\x9b\\x9b\\x1f\\xb5\\x94\\xea\\xe2?+\\x806#\\x1b\\x9f\\xe5\\xbf\\xa11JZ`X\\xe1\\xbfsUB\\xc5Z\\\\\\xca?DK\\x16\\xb6ny\\xfc?\\xba\\x99\\xdd\\xa3X\\x9c\\xfb?`]\\xb7Y\\\\K\\xfa\\xbf\\x16\\xc8G\\xf0W\\x11\\t\\xc0e\\xe0V\\xd0\\x0f\\xf6\\x07\\xc0E\\xdd\"\\xbc\\\\\\x07\\xeb\\xbfx\\x0bS\\xab\\xf1\\x1f\\xe6\\xbf\\x0e\\nq\\x04\\x83+\\xe0\\xbfO\\xd0\\xf9\\xdfc\\xd0\\xdd\\xbf\\xf8a\\xc0\\x06m\\xe9\\xf0?\\x0c\\xfe/C1g\\xbf?\\xfc\\x0f\\xcf\\xd3\\xd1\\xcd\\xe2\\xbf\\xa3smS\\xa2\\'\\x02@\\xd2\\xf8\\x08_\\x16R\\x9a?\\xe8\\xdan\\xca\\x1aY\\xe2?\\x91\\xbe\\xa4\\x83{\\x80\\x01\\xc0l\\xa1\\xdc=\"y\\xe3\\xbf\\x1cj)\\xba\\x99z\\xf4\\xbf\\xeefP\\xfa\\x88\\xce\\xf6\\xbf_\\x86\\x14\\x1d\\xa2=\\xfb?\\xf8\\xd2\\xcf\\xc0\\xeaa\\xde\\xbf\\x8f\\xc7\\x97\\xa7UX\\xcc?\\xdc\\xe0K\\x1ek+\\xf8\\xbf\\x83\\xb0#\\r\\xdf&\\xd3?\\x03\\xed`w\\x83\\xaf\\xeb?&e\\x1cA{\\xdb\\xd5\\xbfu\\xfa\\xf8\\xb1\\xc5\"\\xf2\\xbf\\x93\\xab\\x8e\\x07\\xd2\\xd1\\xc9?;\\x07,\\xd5)\\x88\\xf2?\\xc9tZ|\\x05\\xad\\xd3\\xbf\\xc2\\x928u\\x16I\\x0c\\xc0q\\xfc|\\x1c\\x7f\\x06\\x02\\xc0\\x83u=\\xf7\\x12%\\xb1\\xbf\\x84z\\\\\\x9a\\xf2\\xd1\\xec?\\xc0\\xb2&H>\\xf4\\xcf?\\x85P\\x8a\\x82\\xe1\\x1f\\xd6?\\xeaj\\x8d\\xaa`\\xbd\\xed\\xbf.p\\xad\\xb4\\xccE\\xd3?\\x05@\\xbc3\\xbf{\\xfc?B|s%\\xb4\\xac\\xfd?\\xf7\\xfa\\xb0\\xa1\\xb3K\\r@\\x0e\\xd15Ri\\x8b\\xf8\\xbf\\x94\\x0ca\\'j\\xb6\\xe8\\xbftk\\x82\\x1d+:\\xd3\\xbf\\xc3k\\xed\\x92\\xc2O\\xea\\xbf\\xc8/\\x06\\xd2s\\x01\\xc2\\xbf\"\\xee\\xf0\\xb7V\\x8b\\xe1\\xbf\\xdbH\\x95vpH\\xc7\\xbf,\\xb8\\x9b(?\\x1b\\xf4?\\n\\xfe\\x8e\\xe7\\xd4\\xf7\\xef?\\x83*\\xd9\\xa6\\xaf\\xb0\\xd8\\xbf\\xb0.)+\\x81 \\xe7?\\xd6\\x7f\\x86r\"\\x11\\xde?\\xbe\\xe4c\\x88\\xfc\\xf2\\xc4?\\xea\\xa1;g\\x9d\\xa5\\xb3\\xbf\\xf6\\x1d\\x1d\\xf8\\xa9\\x1c\\xfa\\xbfLG}\\'H+\\xe6\\xbfe\\xbc\\x15\\x8e!+\\xf8?50\"4_]\\xf8\\xbf\\xee&!\\xdbZ\\x92\\xe0\\xbf\\xd7X\\xa6\\x9e\\xc3\\x13\\xf3?\\xc2~(_\\xdb\\xd6\\x00\\xc0\\x0c\\xd4\\xcf\\x98^\\xc9\\n\\xc0V\\x17\\xa2\\'\\x07\\xae\\xf8?z\\x87\\xbc\\xee\\xff\\xbc\\xe1?\\x19a\\x1c\\xa7\\xc7@\\xe0\\xbf\\xce\\x00\\xd4U\\xc2\\xcc\\xdf\\xbf\\x0f26\\x04\\xaf\\xe4\\x0b@\\x14\\xffpO\\xd4\\x98\\x00@\\x8d\\xb7q\\x95\\x15\\xc5\\x01@\\xda\\x19\\xbbx~j\\xe6?8)\\x15lR\\xfa\\x00\\xc0C\\x9a.\\x04\\x0e;\\xc3\\xbf\\xbb}\\x12\\xb9\\x91x\\xfc?\\xbd\\xa2$\\x0bw\\xf6\\xf4?\\x14o\\x00\\x18\\xe9\\xec\\xf4\\xbffM)U\\xab\\x7f\\xde?}\\xc6\\x81\\xe0\\x84\\xd8\\xe8?\\x08T&\\xab\\xa0\\xa6\\xd5\\xbf)\\xf3Vx\\xf5\\x9a\\x0c@[\\xb1\\x06KC\\xb3\\xe3?\\xd4\\x9c\\x143nX\\xe9\\xbf\\x92Oq\\xd5\\x92\\xd5\\xc1?A\\x82mK\\x17\\x8c\\xd4?\\x887\\xb0\\xe5i\\xf0\\xe1?\\x80-\\x7f\\xfbu2\\xe8?L\\x91\\x80\\xbc\\xe0\\xb8\\xc1?\\x1e\\xee/\\x1d\\x027\\x03\\xc0\\x83\\x07\\xd6\\x0b=,\\xef?\\xc7\\xb9\\xc1\\x96\\\\\\xe4\\xf1?\\x8f\\x96N\\xae\\x16\\xb8\\xea?\\xd9[\\x8di\\xac%\\xcf?\\x99!\\xcb\\x05\\xea,\\x06@Q\\x96\\xbd\\xfa\\x9a\\x7f\\xe5\\xbf\\xa9\\xefD\\xae\\x15D\\xd3\\xbf\\xe1J\\xb19t\\x08\\xd5\\xbfH\\xba\\xe9\\x1d\\x16\\\\\\x00@\\xb7\\\\\\x81\\x11\\xf0\\xc7\\xf7?\\x10\\x9aI;\\xef\\xbb\\xf9\\xbf\\xa1\\x1c\\t\\xed>M\\xd6\\xbf\\xed?\\x86j\\xcd\\xef\\xf4\\xbf\\xde\\xeeh\\x9a\\xf8\\xff\\xd7?zUM\\x8d\\xc9W\\xfb?h\\x17\\xaee\\x90\\x8e\\xcb\\xbfN6\\xbe\\xb7\\xa3\\x1e\\xf4?\\xe8d\\xf5\\'\\xbd{\\xb5\\xbfeLZ3<a\\x01@\\x1c\\x84\\x8b\\x108\\xdd\\x03@\\xd9\\xfas=\\x15\\x98\\xe7\\xbf\\xddE\\x1b\\xa7\\ng\\x01@:\\xf4\\xde\\xd5F\\xec\\xe7\\xbf\\xddF\\\\Yd\\x0e\\xbb\\xbf\\xca\\xc5N\\x95i\\x85\\xd4\\xbf\\x96@\\xe5S\\xd1\\xeb\\x00@\\xf6\\xef\\x02%\\x9f\\xed\\xe7?\\xbe|\\xd8\\xc67f\\xf5?\\xc0\\x87\\xa7\\x8b\\'\\xc1\\xcf?\\x95/=\\xcf>\\xae\\xcc?\\x8bX\\xbf\\x96[\\xd6\\x01@3\\xb7\\xd4\\xf2\\x92\\x07\\xdb?\\x0b\\x81^\\x1eJ\\x82\\xf7?\\xf1\\xf9\\xbd\\x88\\xeaM\\xeb\\xbf\\xdal\\xf3\\x85 {\\x03@Z\\xb8\\xec\\x0cO\\x81\\xf5?\\x89\\x1a\\x0b\\x80m\\x98\\xf3?|\\xd8\\xd6\\xcb\\x9c7\\xfc?\\xdc\\x14\\xab\\xc3\\xb5\\xf0\\x98?\\x04e\\xe2\\xa2\\xcc\\xe1\\x02@\\xe8l+\\xe4\\xf9\\x81\\xf4?\\xc0\\xcb\\x93\\xc0+\\xf6\\xec?nP\\xc4\\x1c\\xe1\\xc1\\xc7\\xbf\\x85\\xcex\\xfd\\xc0\\x9b\\xea\\xbf\\xe0)\\x99\\x17\\x9e\\xc9\\xf7?\\x84\\x86\\xf4q\\xc2\\xda\\xd3?\\xa0;\\xc9\\x96d]\\xfe?!\\x06.j\\xb2\\x91\\xfe?\\xf7\\xb8\\xe4\\xd3\\x0b6\\xdc\\xbf\\xf9\\x9b\\xad.&\\x84\\xfc?\\x1d8e%\\xa7E\\xe6?\\x95\\x0b\\x06\\xf8LG\\x98?\\xb8\\xb8d`\\x0b \\xe2?\\xc1Y\\x0f\\xe7\\x04\\x1f\\xf9\\xbf\\xd7p%!\\xecI\\xa5\\xbf\\x01\\x1b\\xf3\\x17>\\t\\xf8?\\xfc\\xbdR\\n7&\\xf4?\\xcc@(?\\xcb[\\xdb?\\xda\\x9a\\xedD\\xbb\\xae\\xfa\\xbfP\\xa6O(\\n\"\\x0e@\\xd9l\\xb8\\xd8\\xe1\\xb5\\xe1?{f\\x9f\\xa52\\xe3\\x15@\\x9a\\xce\\xc2\\xf0eJ\\x0b@\\xba\\xaf\\x84%\\x1eA\\xf4?5`W\\x83\\xfa[\\xe2\\xbf\\xd0\\xb9\\xad\\xc5js\\x0c@)*\\x9fd\\xb0\\x81\\xfe?#\\x8e\\xa2\\xfc&\\xc7\\x01@\\\\}\\xca\\xf7\\xa1\\xe8\\xab\\xbfal{x\\xd8\\xe5\\xfd?\\x1e\\x1f\\xbf\\xe1h\\xf9\\xf9?\\xfe\\t|\\x92\\xe56\\xc9\\xbf%\\\\\\x9e\\x98\\xfe\\x07\\xf7\\xbfxu:\\x88\\x9a\\x97\\xf2?\\x07|\\x18\\xf4\\xf9|\\x00@\\x0e\\xeb\\x00\\x05j\\xcf\\xf6?o\\xb2\\x88-\\x84\\xad\\xf6\\xbf\\xfa\\x1c\\xf5\\xed\\xe2Z\\xe5\\xbf\\xb2\\x80\\x1ba\\xdau\\xd3?\\xf6i;\\xd0\\xe6\\xae\\xe2\\xbf\\x13Fh\\xe3\\xbf\\x1da\\xbf\\tv\\\\<\\xfc\\xa9\\xc6\\xbf\\x9fe\\xc9\\x17O\\xf9\\x03@\\xd7%k\\x12\\xf0_\\x10@\\xd8\\xd5\\x8cs\\xbf\\xc2\\xf8?G\\x197=\\xe7\\x85\\x05@\\x1e\\x0c\\x16U\\x87\\x9a\\x0c@\\x11u\\xe6\\x94~\\xfb\\x04@\\xd4n \\x95 \\xb7\\xe3?M}*\\xbe,+\\x0e@\\xad\\xe0\\xea\\x1c\\xf8\\xb9\\xdf?\\';\\x1f\\xb2ll\\xf7?QG\\xec<\\x80P\\xd5\\xbf\\x8c1#\\xb9\\xfd}\\xd1\\xbf3\\xc2e\\x055\\xb9\\xf8?w\\x9a\\x1f\\xafv2\\xd7?n/#WB$\\xd6\\xbfg\\x1cE`\\xe4}\\xf6?W\\xe2\\xf6\\xd9\\xc6\\xa2\\x92\\xbf?\\xf6*\\x925\\x99\\xe7?\\x12\\xac\\x8d\\xd4|\\xf9\\xfa?X\\xad\\x7f\\xcc\\xaf\\x97\\xfd?\\xbd>\\xa0\\x80C\\xf5\\xee?\\x81\\xfb\\xc1\\x06\\xfb\\xe9\\xf7?\\xca\\x81%\\x80\\x1av\\xfe?\\x92\\xa8j\\xcc\\x1e\\xd2\\xe3\\xbf\\x11\\xf5\\xe8\\x0bs;\\xb8\\xbf\\x94?\\x96\\x10\\x89\\x04\\xe2\\xbf2\\xc8\\x1b\\xfb\\xad\\x87\\xf0\\xbf]\\xce\\xf8!3\\n\\xef?\\xf1<]W\\x97B\\xd0\\xbfJ\\xa8le\\xc8\\x97\\xf0\\xbfV\\x11\\x00\\x82t\\xe6\\xce?\\xcf\\x00\\x17e8\\x07\\xf3?\\xd8\\xfe6\\xa6Cc\\xf9?\\xcd\\xaa\\xbf\\xc0Y\\xbd\\xfe?\\x9b\\x95#i\\xaf\\x95\\xfd?E\\x18i\\xe2?\\xd5\\xf1?\\x08F@\\\\\\xe3\\xfa\\xfc?8\\xc3\\xfa\\xaa\\xc4\\xe7\\x04@\\xf3\\x80V\\x0cS\\xbc\\x03@\\xc0\\n\\xf6\\xf4\\xc8<\\xe3\\xbf\\x00\\x1a]:\\xb9\\xbe\\xc1\\xbf\\x08\\xc9\\xb5\\xb0\\xf0\\x8d\\x03@=F\\xc6\\xe9\\x90\\xb5\\x03@\\x83\\xb9\\x9d4eS\\xf4?\\xedV\\xb5pwQ\\xf2?\\xa1\\xc3\\xde\\xf0X7\\xd0\\xbf\\xbd\\x0e)\\xe0eb\\xfd?\\xad[3\\xce\\xc6}\\x04@\\xd7\\x95\\xa2\\xbc\\xd2e\\xe1?\\xedc\\xd0\\xf1.\\x06\\xc3\\xbf\\xbb\\x98\\xf1q\\x0f\\xb4\\xec?\\xf0\\x06\\x99~\\xf2Z\\xe2\\xbf\\xfc\\x9d^\\x19e\\xe4\\xd7\\xbf\\x03\\xa67\\x8bsD\\xf2?\\xb6\\x99\\xb8\\xbb\\x06\\xb0\\xda?\\xa0\\xf8\\x92\\xb8\\xef!\\xe5\\xbfEE4\\xfb\\x0e\\xeb\\x00@\\xd9Y}3\\x92\\xa0\\x11@\\xb2\\xe5\\x1e\\x16\\xcb-\\xe0\\xbf\\xafS@w\\xa2@\\xc6\\xbf\\xbb\\xc0\\xc0B\\x96e\\xf0\\xbf\\r\\xa1^\\xc1\\xbcF\\xf1?b\\xbaP\\xef\\x03\\xee\\xf6?N;\\xc4\\xad\\xb2\\xd5\\xe2?C\\x12\\xb5\\x8a\\tL\\xf0?\\t\\x8b\\x99\\xe6\\xffE\\xd9?\\xa0(P\\xb4A|\\xec?\\x0bM\\x07\\x9a\\x01m\\xfa?\\xb5UX\\n3\\xe5\\xbc\\xbf\\xaeA\\x18\\xd2\\xca\\xb5\\x05@\\xa8T\\xf2`\\x92\\xfb\\xe4\\xbf\\xa3_\\xa8V9\\xab\\xa8\\xbf\\x82\\xf4c\\x19\\xc4\\xd0\\x0b@\\x11\\xc8\\xfb\\x1f\\x15\\x02\\xed?\\xe5\\xe7\\x0c\\x17\\x96\\x06\\xf3\\xbfz\\xe7\\xbd\\xa2\\xd7\\x15\\xee?W\\x0f4X\\xdb^\\xd7\\xbf\\xe0\\\\\\x83\\xae]\\x83\\xfd?\\x18d\\xe2\\xa29\\x02\\xe0\\xbf\\x0e3\\x07i{\\xe7v\\xbf\\xaf\\x16\\x0c\\x882\\xc3\\xb5?o7\\xbb\\x02\\xd7\\t\\xe1\\xbf:\\x10\\xbf\\'\\xecW\\xed\\xbf\\xb8\\xda\\xec\\xe4\\xbc4\\xd7\\xbf\\x0e_\\xa7\\xa6P\\x10\\x9b\\xbf\\xc4\\x9b\\xde\\xc7\\x96D\\xf4?\\xe6\\xb5\\x12\\xd9\\xb1\\x95\\xfd?\\x9ed\\xe4a\\xf7~\\xcf?!\\xeb]\\x87\\x95\\xc3\\xe0\\xbf\\xf6\\xddq\\xe0r\\xa9\\xd8? \\xa5\\x07>S\\t\\xe0\\xbfB$\\xb1\\xc1\\xd9`\\xf9\\xbf\\xf4\\xb4\\xa1\\xb9\\x80\\xa5\\xec\\xbf\\xc0S\\x87\\x97\\x90\\x87\\xe8\\xbf\\'\\xb1\\xee=\\x08p\\xd4?r\\xddsB[\\xdb\\xf3?\\xa7yldQ\\x9f\\xf1\\xbfc\\t\\x11,g\\x98\\r\\xc0\\x17\\xd3\\r\\x81=J\\xf7\\xbf,\\xc5\\xbd+\\xa2x\\xc1?\\xee\\xd0\\x10\\xfd\\x13\\x05\\xc5?\\xad\\xf5\\n8ZK\\xf9?\\xd2S\\xe9\\xa7uQ\\xd2\\xbf\\xf5\\\\\\xdf\\x8a\\'\\x1d\\xd8\\xbf\\xebC\\xb3\\x06E\\xd4\\xd5\\xbf\\xf3\\x9c\\xe9\\x87\\x83\\r\\xe0?\\xedb5a\\x85\\x16\\xcb?2[\\xf7\\xb2\\xb9\\x14\\xd0\\xbf\\xdc\\xef\\xe1\\xf5\\x15\\xfe\\xeb?\\x83\\xdd\\x88\\xc3\\xed\\x8c\\xf1\\xbf\\x8d-\\x1c\\x00\\x86\\xff\\xdc?\\xb5\\xe4\\x7f\\xeb\\xde8\\xde?\\xcf\\x0b\\xd0\\x06\\x05l\\xd6?\\x99$\\xb4\\'\\x11`\\xee?\\xd12~{r\\xf8\\x03@qp\\xc2y\\x92e\\xd5?\\xd4\\xd2\\xe2(\\x9d=\\xf8\\xbf\\x00\\xf4\\x98\\xe0xz\\xda\\xbf\\xad\\xe4\\x9d\\t\\xa9\\xe7\\xec?r\\xb6\\xe2Y\\xf1\\xd7\\xfe\\xbf,6i\\xa8`\\x80\\xe5\\xbf\\xf7z\\xd2\\xea\\xbb\\xc3\\x0c\\xc0\\xab\\xda\\xfc+\\xc7O\\x03\\xc0\\x1cp\\xfb\\x1d\\xba\\xdd\\xdf\\xbf\\xc1PS\\x8f\\xc0_\\xb4\\xbf\\x073\\xa9\\xceR-\\x02\\xc0&|hU\\xb8K\\xf4?\\x9c@\\\\\\x82\\xe4Y\\xee\\xbf@\\x9f8\\xd4UF\\xf0\\xbf\\xb6\\xd1\\xbdC\\xf8\\xdc\\xf7?\\xa5\\xf9\\xf8I~\\xe9\\xe0\\xbf`R\\xb5\\xbe\\xe6\\x10\\xe6?<\\xdb\\x87C\\x99\\x10\\xf6?\\xc9\\xca~\\xc5\\x1e\\x88\\xb6\\xbf\\x12\\x12\\xcc\\xfeIA\\xc8?\\xe9u\\xfa\\x9fr\\xe1\\xdd\\xbf\\x87\\t[\\xe4\\xb8\\x96\\xd7?%\\xff\\x83\\x0e}\\x10\\xed?a\\xda;\\tg;\\xc3?\\x0f\\xa0X\\x9a%\\xf9\\xeb?R9N\\xfd\\\\\\x11\\xfb\\xbf\\xc1\\xc5\\xba{B\\xcc\\xf2?\\x8e\\xa7\\xa1\\x16\\r\\x91\\xec\\xbf{\\xdcO\\xf5)\\xba\\xf2\\xbf\\r\\xff\\xde\\x8e\\x1a\\x8e\\xf0\\xbf\\x9dib\\x84m\\xd8\\xfb\\xbf>\\x0c\\xd5\\x0fay\\xed\\xbf\\xaf\\xb8*\\xfc\\xc7o\\xf9\\xbf\\xfe\\x8b\\xcd\\x98\\xeb\\xb7\\xe9?T\\xea{\\xbd\\x10q\\x05\\xc0\\xachi\\x15\\x88.\\xf6\\xbf\\xb5T\\xff^\\xb3\\x9a\\x07\\xc0\\xa2\\x85\\xbc\\x13\\xd7e\\x03\\xc0\\xd7&S\\x9c}\\xd4\\xf3\\xbf\\xa4\\xb2\\xae/^\\x1a\\x01\\xc0\\xe9\\x08\\x04\\x9ez\\xc6\\x04\\xc0!\\xe1\\xa4)\\xf9\\xd1\\xe9\\xbf;\\x1f\\xb2\\xff\\xcbO\\xe3?|\\x9f\\x96\\xc7\\x0b\\xcb\\xa5?\\x8a~\\x93qjA\\xdb?\\xb16\\xa4B=U\\x03@\\xb0z\\xb4a>\\x93\\xab\\xbfP\\xfb\\xa6y4M\\xa8?\\xd3\\x05x\\x9d\\xbf\\xb8\\xf1?4\\xca\\x1f\\xee\\xea\\n\\xcd?>d\\x0c\\xbb#P\\xb2?MEQ\\'\\x0ff\\xe1\\xbf\\xf1\\xf2\\xabRW\\x9d\\x96?L\\xa8\\xe2\\xfdT\\xac\\xe7\\xbf\\xeby%\\xab\\x99A\\xc9?D1\\xe6\\xa8\\xa8\\x85\\xd0?\\xbbq\\xef\\xd7\\xbf\\x81\\xce\\xbf\\xc2#\\x83\\xb9B\\x00\\xfc?\\xc3\\xd92\\xd0\\xf7~\\xe6\\xbfF\\xd0\\xd8~/v\\xf1\\xbf\\x87\\xbb\\xc0\\xce\\xd1u\\xc6?\\x06\\x80 \\xb3k\\xe1\\xea\\xbf\\x93\\x91\\xb2\\'\\xe2%\\xf1\\xbfr\\xdeA\\x14\\x97\\xeb\\xcb?\\xac6\\xd7\\xfc|\\xce\\xf1?\\xd5\\x84\\x9b{\\xdc\\x9c\\xe4\\xbfYP\\x85\\x86\\xc8>\\xd8\\xbf7\\x014yJ\\x11\\xdb\\xbf\\x98\\x9a{\\xd3\\x91\\xe0\\xec\\xbf5\"r-Ik\\x98\\xbf\\x82TC?\\x7f@\\xe5?\\x98l\\xb4\\x98\\x9a2\\xf2\\xbf\\xcb\\x10JoH)\\xd5\\xbf\\xd2\\x9a\\xf8\\x85\\x11\\xe5\\xd1?\\xde5\\x1fW\\xc4l\\xd8\\xbf\\xf8\\xc1\\xd5\\xb0\\xa1o\\xb2\\xbf\\xc4l\\xc4h\\xc7\\xfa\\xc3?\\xe0\\x1f>/o\\xf7\\xd6?Gr^\\x17\\x83\\xd1\\xd2?\\xf3\\xd7\\xc4\\xd8XL\\xb3\\xbf\\xdc\\x96\\xdd[?\\x03\\xb4\\xbf#\\x11\\x8d\\x8a\\x03\\xdb\\xe6?\\xc9\\xe2\\xb6\\xa7\\x19\\xcb\\xdc\\xbfE\\x14lz\\xcb\\\\\\xe6?\\xcarY\\x9b\\x91\\xc8\\xe4?\\x03\\xc5T\\xd1\\x82\\r\\xe2\\xbfN\\x99\\xcc\\t\\xe0e\\xf1\\xbf\\xe5Ar\\xb0_\\xcc\\xe6?^\\xc3\\x8a\\x91\\xf8\\xa9\\xa7\\xbf\\x85,\\x19i\\x1es\\xc8?i\\x84\\x92\\xb8\\n\\xe7\\xb0\\xbf\\x1aZ\\xeb\\xca\\x08\\xec\\xce?qF\\xd9\\x15)\\xc7\\xac\\xbf\\xe6K\\xb9\\x13\\t\\xa1\\xdb?%l0\\x10\\x1d\\xdf\\xcb\\xbfDkyn\\xe9\\x92\\xe1?\\xa0\\xc7\\xb5\\xd1\\xd3$\\xe2?\\x9b\\xf0\\x04\\x1db\\xde\\xd9?S \\xb01u\\x90\\xe8?\\x80\\xb8\\xc6\\xb0\\xe6O\\xf2?\\xcb1\\x17\\xa4L\\x8b\\xeb?2\\xa2q\\x15 \\xad\\xcc\\xbf\\x03p\\xd6\\xfa\\xd3\\xa0\\xad\\xbf\\xc9\\xe9\\xdd\\xf9$\\x80\\xda\\xbf\\xff\\xebt\\xde\\x01\\xb3X\\xbf\\x93%\\xe9#\\t\\xc5\\xe9\\xbfv)\\x95\\n \\x14\\xe5?\\xb1\\x0b\\xc6\\xee\\xb0$\\xe3\\xbf#``\\xfe\\x0cq\\xb4\\xbf\\xa0<\\xfa\\xde}\\xaa\\xf5?o\\xda\\xc2\\x01\\r\\xf9\\xd6?\\x0e\\xab\\x163\\x14]\\xd1\\xbf\\xb0q>\\xff\\x014\\xe8\\xbfX\\xa1r\\x98\\x95s\\xe0\\xbf\\xb8\\x8a\\xd6$\\x051\\xf5\\xbf\\x84p\\xd7.\\xb4\\xb3\\xf6?\\x11\\xa1K\\x16\\xa4X\\xf3\\xbf\\x02~\\xc2\\x12A\\x81\\xbf\\xbfW\\xcc\\xc9UQ\\xdb\\xe0?\\xdf\\xeb\\xe4\\xc2\\xa5F\\xf8\\xbf\\xa3$Iw\\xf6\\xe2\\xe3?\\x01\\x19\\x7f\\xac\\xd7\\x97\\xe2?\\xec\\xcfH5\\xc4e\\xf0?d\\x84?\\xb5O`\\xe3\\xbf;\\x1d\\x96xuo\\xd0\\xbf\\x90\\xab\\'\\x81\\x1f\\xc8\\xef\\xbf\\xae~V\\xf8\\x08\\xef\\xeb?2\\x04j<\\xb9\\x0f\\xed?~c[\\xb2\\x11\\xa6\\xe0\\xbf\\xab\\xe73\\xe3\\x9a\\xef\\xcb?\\xe7\\x1b\\\\\\x06\\x04\\xcd\\xde?N\\xcf|\\xd6\\xafj\\xd2\\xbf\\x14\\xa7`\\x94\\x15n\\xf1?k\\x81\\x01\\x89\\x86\\x82\\xf7\\xbf\\x9ds\\xe4\\xe9\\x81\\xa8\\xfb?\\x07:\\x90R\\x8a\\x19\\xa5\\xbfTQ\\x0fB\\x8eI\\x93\\xbf\\xb9(\\x1fk\\x8a1\\xf2\\xbfo21aZ\\x8d\\xf2\\xbf\\xb86\\xaa\\xe3ze\\xd8?a\\x14\\x83\\xe9s\\x04\\xe7?\\xcd\\xc9\\x0cV\\xe4\\xde\\xe4\\xbf\\xd3M\\xde\\xad\\xd3\\x05\\xeb\\xbf=\\x1b\\x0f\\xf2\\xdb\\xce\\xe9\\xbf\\xb6\\x82u\\xaa\\xf5\\xa4\\xc9\\xbf\\xb5\\x8f\\x9c\\x86R\\x9f\\xea?\\xc0\\xa73kh6\\xd6?\\xdf\\x1e\"\\xca\\xac\\x8e\\xc9?<\\x1d\\xd5\\x18g\\x18\\xe7\\xbf=\"\\x81:N\\xdd\\xed\\xbf\\xfd)\\x85\\x96\\xee\\x05\\xe8?n\\x1b\\x80J\\x16\\xd4\\xdd\\xbf\\x97\\x1a\\xd4\\x07\\x19r\\xce?3\\x13\\x0e\\xe2h\\xec\\xd6\\xbf\\x95\\xbdHVa\\xc7\\xd1\\xbf\\xe0\\xe13\\xd3I+\\xd5\\xbfa\\x00\\x03\\xc9\\xd9\\xf4\\xf3?A\\x8a\\x16\\xfaS\\x1f\\xe3\\xbf\\x06\\xdf\\xee\\xba\\xc0\\x0b\\xc5\\xbfV\\xd0o|vz\\xfa\\xbfc\\xc4\\xdfw\\xe1\\xfd\\xdb\\xbf1\\x01Na\\xe7\\xc5\\xe0?+\\xe2\\xaf\\xe8\\xa0:\\xbe\\xbf^M\\xeb\\xafX\\xcf\\xcd?\\xd4\\xef\\xb2<\\xae\\xb1\\xea\\xbf\\x89L.\\xf9a4\\xf9\\xbf\\x0c\\x9a\\xd8\\x94\\x017\\xd2?$Y\\n\\x95\\xe62\\xd2\\xbf&\\x1f\\xf787\\xff\\xf9\\xbf\\xdby\\x0e\\x13\\xb7)\\xe0\\xbfn\\xa6\\x12U8\\xff\\xb2\\xbf\\xb6\\xf0\\x0b]:\\xdb\\xe3\\xbf\\x1d\\xa9,\\x9dJ_\\xf4\\xbf\\x90&w\\x86\\xf37\\xd3?@\\xca\\xa5\\x9b1=\\xf7\\xbf\\\\U\\x8a\\x0b\\x8e\\xe3\\xd6\\xbf1!^\\xe3\\x03\\x1e\\x01\\xc0\\x13\\\\gwA\\x05\\xf5\\xbfg\\xe7\\xeb#\\x12\\xc6\\xec\\xbfk\\x94X\\xc8\\xcc\\x07\\xfc\\xbf\\xac:\\xe8y\\x87\\x1d\\xe1\\xbf\\x93Gz\\xa3W{\\xe9\\xbf\\xc3\\x05-\\x88\\xf6L\\xf7\\xbf\\xa8\\x1b\\xa1\\x1b\\x04\\xe6\\xaa?\\xa0aC\\xa4\\x18\\xdc\\xfb\\xbf\\xa3\\x8c\\xf5-t\\x7f\\xda?\\x85\\xd7\\xae\\xc0\\x04v\\xd9\\xbf\\xb77\\xb88\\xd8\\x19\\xf4\\xbf\\xf8\\x9dW\\xdcJ\\xac\\xf9\\xbf\\xfd\\xca\\xfe,S\\'\\xe9\\xbf\\xfe\\x1dd\\xecf?\\xf2?\\xab><4\\xb5\\xa7\\xa2?\\x06\\xf4\\xdb\\xf2\\xec\\x8d\\xe1?~9\\x94\\xe4\\xf7\\xc7\\xd7?F\\x18\\x98\\xc3|\\xbf\\xf3\\xbfu\\x88\\xbc\\xbf\\xa1\\xdc\\xd4\\xbf\\xbboEO\\xf9\\xf4\\xbd?R8uFs\\xd6\\xfd\\xbf\\xc1\\xac\\xe4\\xfaY\\xd4\\xdd?\\xb7\\xd6\\x85~\\x8f\\x0b\\xd2\\xbfp\\xee&\\xae\\x8b\\xa7\\xef?\\xbc\\xf1\\x97\\x8e\\xa5\\x98\\x02@\\x01\\xde\\xd0\"\\x17\\xf3\\xec?\\xa2\\x08W\\xb1|?\\xc9\\xbfDeEd$\\x1e\\xf4?2/\\xb0\\xf0\\xadR\\xd9\\xbf&\\x9b$\\xf2\\xb6[\\xe2?\\xf1\\x9e\\xd6\\xfa\\xa5\\x1a\\x01\\xc0\\xcbU\\xb9[\\x8c\\xa4\\xfa\\xbfi)p\\x88\\x88\\xe5\\xd2?\"8\\xe5\\xb4@B\\xf5\\xbf(\\x1e\\xbb\\xb2Jr\\xe4?b{I\"xb\\xf1?\\x1e\\x0b\\xf3\\x12^\\xd1\\xc1?\\xeaR\\x9f\\x911\\x83\\xe7?:\\xf7\\x0c\\xf5\\x0b\\xb8\\xf3?\\xf7\\xd6\\x99OL\\x89\\xc7\\xbfn\\xf32\\xc6\\xb4\\x86\\xd6\\xbf9\\xd7\\xa3i\\x8c\\xb7\\xd5\\xbfX\\xd2\\xa7G\\xe6\\x8a\\xc4\\xbf\\x85\\xb3\\x8f\\xcf\\xbd\\xc4\\xd7?s\\x97\\xb3\\x06rB\\xda\\xbf:\\x1fY\\xfe\\x05\\xaa\\xe5?8\\x13\\x19\\xbfO\\xe6\\xf4\\xbf\\xb7\\x081~7Q\\x00@\\xc7<\\x01\\xf1\\x0c\\x8c\\xc0\\xbf}\\xe8=F\\xc6\\xa5\\xdc?\\x91.\\xb5\\x10\\xb5*\\xe1\\xbf\\x8e\\xc8[\\xf9\\xa7\\xc1\\xec?\\xef\\xcd&)\\x19g\\xfa\\xbf\\xbb W?ed\\xd6\\xbf\\t\\xd4\\xd2i/ \\xc6?\\xa4W\\xba\\xac\\xd2\\x81\\xeb\\xbf\\xea\\x9c\\x91\\xf7\\xb6\\xbd\\xfc\\xbf\\xda3 \\x9a\\xca1\\xca?FG\\xa3\\xe7O\\t\\x05@\\xe6\\xb77\\xeb\\x07P\\xe1?\\xd2\\xeb\\xfb\\xddB\\xd7\\xf6\\xbfs\\xfddD\\t\\xa9\\xee\\xbfa\\xc5,\\xe8\\xb9?\\xda?\\xa9wr\\xcf\\xaeH\\xe4?h\\x9dw(\\x11A\\xf4?\\xa3\\xe8(\\xb9=s\\xd5\\xbf\\'\\xff\\x18\\x9b\\x83\\xf7\\xbd?\\xd3p\\xda\\xb3\\x94(\\xd6?\\xe8\\xf8\\x19\\xdb+\\xd7\\xe1\\xbf\\x00\\xc5}\\x0c\\xbd\\xbc\\xf5?M\\x91{\\xb4\\xe6\\x96\\xf4\\xbf\\xf7\\x97\\xaa\\x18L2\\xf6?7\\x04A\\x8f\\xf4\\xc6\\xe7?G\\xf1\\x9b\\xf9fU\\xfc?\\xd3\\xc04F\\xed\\xe4\\xba\\xbf\\x04\\xe7\\x84j\\xcb_\\x91?,\\xd6\\x11~\\t\\x81\\xef?L[\\xfc\\xe9q&\\xe4?x]\\xbf5\\xe2~\\xf4?\\x0c\\x15I\\xb9\\x14$\\xfb?\\x0f\\x11\\xb3\\x83\\xf4?\\xd0?3\\xd5\\xb7\\x0c\\xbf\\x10\\xe2?\\xd7o\\xf0\\x89u\\xd4\\xf7\\xbf\\x90\\x1b\\x1c\\xa2\\xdc\\xaf\\xd2\\xbf\\xcd\\x11\\x05)mG\\x00@\\xdd\\xc9\\xa6yV_\\xec\\xbfY\\xb9\\xfde\\xa9/\\xea?\\x03\\xf5\\x03l\\xa6m\\xcf\\xbfk\\xd3\\\\\\x11\\x15\\xa7\\x00@5XE\\xbe/\\x9b\\xa7?g\\x1148\\x13\\x16\\x85\\xbf\\xda^Q\\xa6\\x0e\\xce\\x00@Q\\x94\\xfe\\xddK%\\x06@FA\\x1d\\xb5q\\x92\\xdd\\xbf\\xd3\\x85\\x8ae\\xd3O\\xf4?\\xc2\\x93\\x92;\\xa0\\x8a\\xc9?[\\x14\\xa5\\x17\\xc11\\xe1?\\xe1\\xe5\\x08\\xcd\\xeb\\xfd\\xc5?\\x9e\\x0f\\xd0\\xa9\\xe2\\x0e\\xea?n\\x99G\\xcfp\\xd4\\xf1?\\xd5)\\xe9\\x91u\\xee\\xc9?\\x01f\\xd8~\\xc4]\\xf1?\\x8e\\xf8\\xad\\xce\\xab\\t\\xf4?^\\x0b\\xe2t\\xd1:\\xef\\xbf\\xbfa\\xe5\\xf5\\xad\\x10\\xf4?1\\xc4U+\\x86F\\xc4\\xbf6\\xe2i\\xdb\\xd8d\\xee\\xbf\\xcc\\xa6\\x12\\xad\\xeeb\\xf0\\xbflw\\x0f\\x07\\x07)\\xf1\\xbfm\\xce\\xef\\xbe\\x14w\\x00@f\\xa7\\xafo\\x8d\\xe0\\xfa?\\xf6\\x12\\xa1\\xf3{;\\x02\\xc0\\xc9\\x01\\xe5\\xc1\\x95\\xe2\\xc4\\xbf\\xc8iw\\x01\\x91D\\xe0?\\x19\\x10\\xec06\\xa7\\xe4\\xbf\\xd6\\xbd\\xe4@\\xf4\\x86\\xf6?\\xff\\xde\\xa7(k\\x85\\xfe?\\x0c\\xf0Z\\xe4\\xf2\\xaf\\xf8?\\xf4\\xf5.`\\xf4\\x8c\\xcc\\xbf \\x86z\\x005B\\xf1?&\\xd3[\\xab\\x8be\\x13@/\\x158\\x9eX\\x91\\xf9?s\\xf7\\x02\\xd1R\\xc9\\xf5?#\\xd9\\x1fi\\x8d\\xd7\\xcb\\xbf\\x1d\\xc7\\xa8\\xdb\\xba\\xc5\\xd2?3:\\xdb\\xa6\\xc1\\xb6\\xc8\\xbf\\x9f\\xcc\\xe4\\x01\\x19\\xb9\\xea?\\x99E\\x881y9\\xeb?\\xbb\\x9a\\xbf\\x94\\x1fB\\xb6\\xbf\\xdf\\x90\\x1f\\xc9\\x1e\\x1b\\xca?5\\xa9+\\x07\\xf4\\x1a\\xf0?\\x1c\\x7f\\x1d\\xae\\x04\\r\\xc2?\\xf1\\x8c\\xa6<C\\x02\\xfd?\\xda\\xceP\\xd7\\xb1.\\xf2\\xbf\\x8f\\xa4\\xd9\\xf2\\xfdW\\xfa?\\xe7\\x95\\x86\\x13\\xac\\xaf\\xfd?te\\xc2O\\xcc\\x03\\x04@\\xadzZ\\x85\\xa6&\\xe5\\xbfO\\xae\\x80\\xf2\\xf4\\xb6\\xfe?#]&\\xa8\\xcf\\xdf\\xfa\\xbf\\xf5\\x10\\xefr\\xc2\\x9f\\xd1?\\xcc\\x94\\x8b\\xe8~\\xc5\\xf0?\\xfai\\xa7-\\xb7\\x89\\xae?I#)\\x82\\x87^\\x10@\\xf3C\\xe4\\x86i\\x8a\\xeb?G& \\x1db\\xd3\\x04@-R\\x94\\x87\\x1d\\x9d\\x03@\\xcc\\xe4:\\x08d\\xe9\\x00@\\x9e\\xe4\\xe8#1.\\x0f@\\x8b\\x8f\\xa5\\x95\\x8cx\\x05@\\xbc\\x0c)OX;\\xf1?k\\xb2\\x14\\x87I\\xfa\\xf0\\xbf\\x13\\x9f\\xc8F\\x0e \\xe2?\\xfa\\xf84\\xc9\\x00\\x8b\\xd0?\\xf8PE\\xee\\x19[\\xdd?\\x15\\'\\x078EK\\xed?\\x08/\\xc8sFC\\xc2\\xbf\\xef8\\xb6\\x9c\\xd3\\xc5\\xd8?\\x1b\\xee\\xd4\\xe8L\\xb0\\xdc?\\xf0C\\x85Nq\\xe2\\x0c\\xc0\\xdc0\\x19\\x87\\\\\\xd1\\xd2?\\xee!\\xee\\xcaN\\x95\\xf4\\xbf\\xc3\\x1f\\xdb\\xd3/\\xc0\\xd7?\\x15\\x07\\x07\\x1eu\\xde\\xf4\\xbf\\xdd\\x85y*:\\x1b\\xd7\\xbf\\xcboQ\\x1b(\\x1e\\xfc\\xbf\\\\\\xb2/f\\xcf\\x11\\xfa?\\xc6~\\x916\\xf7\\x9c\\xdb?\\xb7\\xfe1@G\\xa1\\xb3?\\x10-\\x07b{\\xc1\\xdf\\xbf\\'\\x97`\\xdc\\xc4\\xd6\\xe9\\xbf1\\xe6\\x03j\\x84;\\xe5?\\xb0\\xb3\\x18\\xda~\\xb2\\xd1?\\'\\x83]\\x9b\\xfdb\\xba?\\xf8\\x03%M\\xfc\\xbd\\xe0\\xbf\\xc7\\x08*g\\xec+\\x00@=\\xe24GCv\\x12@?\\x13b\\xaa\\xc1\\x0b\\x0e@\\xc2\\xf3\\xa3B\\xb3Z\\xe0?\\x11j0\\x1c\\xd9\\xf9\\xf0?\\xccatz\\x17J\\xe2\\xbf\\x07Ai\\t\\x94\\x94\\xde\\xbf:{\\x08\\x9c\\x18\\xc3\\xf1\\xbf\\x08\\x93[$\\x1e\\xaa\\xfe?Eg\\x0b\\xfc\\xc7o\\xff?\\xcaA\\x07_\\xe6\\x86\\xda\\xbf\\x94]\\xfd_Y\\x98\\xe3?\\x92\\xfffG\\xef\\x1a\\x00\\xc0\\x8b\\x9cW\\x81\\xe4\\xf4\\xdf\\xbfj\\x0eM BX\\t\\xc0\\x08\\x8f\\x0e\\x89O\\x01\\xeb\\xbfT)\\x1fm\\x81\\xf0\\xd1?X\\n6f\\x8c\\x01\\xf2?\\xe0#0\\xeeMW\\xab\\xbf\\x95>v\\xe8\\xd9\\xf4\\xe4?\\xe9\\xb9\\xe9\\xf0\\t\\x98\\xda?\\xf2\\xde\\xf3U\\x073\\xe2?\\x869\\x15 \\x92\\xf3\\x05@\\xaf\\x83\\x96\\xa4^\\xe4\\xc2\\xbf\\xd0\\xd0\\xe8\\x07/w\\xdb?\\x1b\\xb90\\xc1\\x07\\x83\\x04@a\\x8b\\xcf\\xc4\\x80\\x98\\xf9?\\xac\\xc5<\\xd0,\\x95\\xf9?U\\xee\\x8ay=\\x9e\\xd7?\\x9ec\\xe9\\xe7\\xc7H\\x06@\\xb9\\xdbC\\xe9\\xec\\xb3\\x14@\\xcfg\\xdb\\xad\\xc4\\'\\xfd?\\xd9\\xf8 \\xbd\\x89\\xd4\\xec?d\\xe9L\\xeb$1\\xd2?\\x9e\\x05\\x87\\x03\\x87\\xfe\\xf3\\xbfP\\xd6\\x1f\\xa7|p\\xda\\xbf\\x99\\x815m>a\\xe7?\\x0b\\x16\\xc9J\\xed\\xf8\\x03@o\\xe6\\xb3\\xb6L]\\x02\\xc0\\x12\\x7f\\xe4\\x94\\xadE\\xd7\\xbf\\xc0\\x94\\xfe\\xb3\\xdc*\\xdb\\xbf\\x0fH\\x1f\\xe1\\x88%\\xf5?\\x90G\\x86\\x90\\xcf\\x99\\xfe\\xbf\\xa1\\x04\\xf8\\xf3\\x17\\x18\\xf2?sY\\xdaC\\xbf\\x96\\xd7\\xbf|\\xb3W!-,\\xd5?\\xca\\xec/\\xa5\\xa26\\xfe?e\\xa3G\\x1d\\x92\\xfd\\xee?\\xa7\\xad\\x0e\\xb2JN\\xfa\\xbf;\\x9d\\xd4\\xf1\\xfe#\\xe4?\\x90\\xaf?\\x96\\xdb\\xde\\xf5\\xbf^=\\x1bb\\xb7]\\xe8\\xbf\\xdbiX\\xb9 )\\xfd\\xbf0\\xd62e\\xe4=\\xf2\\xbf\\xc1\\x86\\xaa\\x93\\xd6_\\xd6?p\\x9c\\xcc\\x15\\x9d\\x0f\\xf6?\\xb5-\\xacN\\xd3\\x98\\xb6?\\xad\\xc8Do\\xbf\\xfb\\x11@\\x8c\\x98\\x8e:!W\\x19@\\xc6jt4\\x03v\\t@\\xb3\\x08\\x063\\xf8\\xa1\\xe0?\\xbb\\xdc\\xd6?P\\xb0\\xe5?r\\xf1\\xfa\\xbaC\\x82\\xce?\\xce\\x8fn&!\\x01\\xfc?\\xb3\\xdb`\\xd4\\x80G\\xdb?\\x17\\xab5\\xde\\xf6\\x88\\xe8?\\xcf\\xb2\\xe2;\\x16\\'\\x10\\xc0:\\xd2-\\x97\\x8b\\xa9\\xe5?i\\xdfa\\xb7\\xa2L\\xfb\\xbfo\\x1e\\xc6\\xf7\\xc37\\xa1?\\xba\\xc5kED\\xc5\\x80?S\\x0e\\x08\\xacc\\xc3\\xef\\xbf\\x80C\\x7f\\x0f\\x0e\\n\\xfc?\\x8d\\xf1*\\x87\\x8f\\xfd\\x83?\\xc4]Wd\\xa77\\xc9?\\xec\\x060iu\\x06\\x00\\xc0m\\x9b\\xae\\x17]M\\x00\\xc0\\xa3>a\\x13\\\\\\x19\\xfe\\xbf$\\xdc-5\\xf8p\\xf1\\xbf\\xaf\\xeb\\xb3\\x03\\xc1i\\xf0?/\\x03,\\xb5\\xe6 \\xff\\xbf\\x0f}\\xda\\xe1\\x9f\\xf0\\r\\xc0\\x19\\xec\\xcc\\x11\\xb6\\x88\\r\\xc0\\x18j%\\xecA|\\x01\\xc0\\x8a\\xd8\\xe7B\\x827\\xce\\xbf\\x9e\\xfa\\x18]\\xae\\xcd\\xee?\\x05\\xf1\\xd2\\xcb\\x9e\\xe0\\xf6?\\xf4e9\\x07\\xf0-\\xf9?\\xa2\\xff\\x8a\\xc8\\x84|\\xea?\\xa94>u\\xc2Tp?\\x84\\xbd=BDG\\xf0?9a\\x84;4\\xb3\\xe9?\\x86\\x7f\\x81\\xa9\\x94C\\xf4?Ur\\x1a\\xd8\\xfa\\xaa\\xea?\\xe5\\x7f\\x82\\xb7\\x95\\xe4\\x05\\xc0\\xb5\\x11:/|\\x8c\\x02@\\x16lCft\\xf6\\xfd\\xbfm\\x82|\\xb2f\\t\\xd3?\\xda\\xdb\\x7f\\x01\\xb8}\\xed\\xbf\\xfe\\xe5\\xa7f\\x171\\x01@\\x13o/\\xb9cq\\xf2?\\x80\\xdf\\x958d\\xeb\\xfb\\xbfx\\x80\\x88\\xce3\\xeb\\xec\\xbf>j.\\xddR\\xcb\\x02\\xc0L\\xb6m\\\\\\x83h\\xf5\\xbf\\xab\\x10\\xef\\x13\\xc7\\xc8\\x01\\xc0\\xb7\\xfc`~\\xdd!\\x01\\xc0\\xb9m\\x98rts\\xf7\\xbf\\xdf\\x1e\\xe6\\x8a\\xf0\\xc9\\x07\\xc0\\xd6L4?\\xa9\\xd7\\xf2\\xbfV\\x9d:\\xf7q\\xc7\\x11\\xc0\\x134%\\x81\\xc7(\\x03\\xc0\\n\\xb7G[PF\\t\\xc08}\\x93\\xf8D\\xd4\\xf0\\xbfY*\\xef\\x8c\\x1d\\x10\\xf0\\xbf\\xe2\\x9d\\x0b\\xed\\xc0\\x9d\\xd3\\xbf\\xf4\\xa9\\x88\\xf8\\xe5\\xb0\\xb1?\\xbe\\xc9\\x94\\xa0\\x87Q\\xf1?\\xf1\\x10#\\xb6Y\\xfe\\xf6?\\xe9R\\xd9W\\xd3I\\xa7?_\\xf9\\xde\\x18(n\\xf7?\\xc377gRU\\xe5\\xbf\\xba8H\\xacM\\xe8\\xd5?\\xeb\\x82l:\\x8c\\xba\\xc5?\\x02\\xe6\\xf4\\x06\\xec\\xc8\\xda\\xbf\\x0e\\xd4\\xb8\\xd52\\x18\\xd9\\xbfs\\xf8\\x91\\xe2\\xc2\\xb1\\xfd?\\x81\\xbf\\xc0\\x84\\xbfB\\xc9?\\x8bQ\\xe8n\\xcc\\xb5\\xdd\\xbfZ\\xd6\\x95\\xa7\\x8e\\xd4\\x01\\xc0\\x0c\\x19Y]o\\xd3\\xe0\\xbf\\xf1\\xa6]m\\x8c\\xf0\\xf4\\xbf\\x91\\xf8\\xe1q\\xd1\\x1a\\x14\\xc0\\xda\\xe9K\\x1a_Y\\x04\\xc0\\x7f\\xcdB\\xc5f\\x87\\x01\\xc0\\n(\\x9a\\xb7\\xea\\xcd\\xe4\\xbf\\x1b\\xbf\\x03\\xf6\\xa8d\\x01\\xc0\\x05\\xf7\\xa5\\xb7\\xd5\\x8f\\t\\xc0\\xb5\\xb5>\\x15S|\\xf5\\xbf\\x06\\xd6\\x90,\\xe96\\xf6\\xbf\\xd3\\xd6\\xef\\xb8\\x93\\xe0\\xf2\\xbfv\\x11\\xe4[1|\\xfc\\xbfT\\xb1\\x165J\\x10\\xea?\\x95\\t`\\xe0DJ\\xe2\\xbfH\\xde;\\xba\\xf0B\\x96\\xbf\\xb5\\xe1\\xc7\\xc7\\x8d\\xc2\\xde?\\xee2o\\x95\\xf0\\\\\\xeb\\xbfm\\xa4\\xce~\\xe5\\xa0\\xf0\\xbfI\\xb1\\xcd!\\x8d\\xf5\\xdd\\xbfJ-\\xb2\\xdf>\\x0e\\xd4\\xbf\\xe8\\xc9\\'\\xee$\\xa9\\xe7?\\xf1YW\\x92\\x15\\x0f\\xfa?\\xe8Aj\\xab\\x87g\\x00@\\x94ig1{D\\x12@V\\x8a\\x9b\\xb5\\x9e\\x03\\xff?\\xe4\\xb4\\x0cN\\x81\\x99\\x00@Gu3\\xd1\\x98\\xa3\\x03\\xc0X\\xf8+0\\xa4}\\xf0\\xbfq\\xefOR\\xe0\\xff\\x01\\xc0\\x0c\\xfd\\xf2\\x93\\xbc\\x8e\\t\\xc0{Ua~x\\x7f\\xf7\\xbf\\xfa\\t\\xa9\\xb6\\xcd\\xdc\\n\\xc0 \\x90.\\xb5\\x19Z\\xf5\\xbf\\x9dt\\xd6#\\x02\\x1e\\xdf?\\xff\\xcf\\xb7\\x8fV\\xa0\\x0b\\xc0\\x03\\xa6Y\\xa1\\xaf$\\xfa?\\xeb\\x95\\xaa\\xf2\\x9fx\\xf6?\\x92bL\\x88p\\xc0\\n@N\\xc03\\xf2\\x9cb\\xfd?+\\xc5\\x07\\xbd\\xc6R\\xea?mJN\\x97\\xfa\\xe3\\x01\\xc0.$\\xba\\xe8A\\x9a\\x8f\\xbf\\xe9!\\xdc\\xfe\\x81G\\xe6?\\xcd\\xf3\"H~\\xa0\\xd0?\\xf3\\xee|\\xe6jd\\xeb\\xbf\\x10\\xf4\\tt\\x98\\xae\\xf2\\xbf\\xd2\\xf7\\xd3\\xff\\xd0\\x93\\xee\\xbf\\xd02\\xf7\\xd8\\x91\\x1b\\x04@\\xdbO\\xef\\xe6\\x1a\\xa9\\x0b@\\xc6\\xf0N~#\\x16\\x04@,Jum\\rP\\xfc\\xbf\\xd2\\xd5n\\x93\\xca\\x9e\\xfa?\\xe7h\\xdd\\x8b\\xfb\\xa9\\xeb\\xbf\\xa0\\x94\\xcb\\xf1\\x8d\\xc2\\xe4?2\\x018@\\xd8\\xd7\\x0b\\xc0\\xd9\\x14:^;`\\xf7\\xbfi\\x94\\xe5c\\x0f[\\xee\\xbf\\xf7j\\x98\\xe1O\\xa4\\x08\\xc0R\\xf4\\x19\\xba\\xfd\\x06\\x0e\\xc0\\'\\t\\xd5\\x9d\\xed.\\x04\\xc0\\xca\\x95\\xcf\\x9a\\xad\\xaf\\x0b\\xc0>\\x1fR\\x15\\x1c.\\x07\\xc0\\xa8\\x9e\\xf2\\xb3Di\\x0b@\\xd1\\x92\\xfa\\xc8\\xd0\\\\\\x13@\\x9e\\x02\\x1e\\x01*\\xcb\\xca\\xbf\\x81\\xa8|f\\tI\\xc8?\\x10\\x80\\x94\\xa9\"g\\x08@\\xd8(}u\\x14\\x13\\x02@%\\x0f\\x90\\xc7\\x85U\\x04\\xc0\\xa7\\xe6^<\\xb7i\\xec\\xbff\\xe9\\xd6\\xee\\x95\\xa3\\xec\\xbf\\x13\\xf7Z\\xadx\\xe2\\xe5\\xbf\\x16]}\\x07\\x84\\x1b\\xf7?\\xdb\\xa24A\\\\\\x15\\xe4?#/(\\x850\\xed\\xe5\\xbf5w\\xaf\\xa0\\x80r\\x02@\\x83AD\\xcd/_\\x04@\\x08Q\\x92\\x14i\\x06\\xe9?\\xe4\\x0cn\\x98\\xe9j\\x06\\xc0\\x08\\x98}r\\xdc\\xdc\\x05\\xc00\\x14S\\xf4\\xdc4\\x0f\\xc0\\x99\\x19\\xe3~\\xfaA\\x03\\xc0\\xf2LD\\xf5\\x93\\xfd\\xf9\\xbf4\\xa2r\\x17\\x80\\xb1\\xfb\\xbfM\\xea\\xe6\\x1f\\x89\\xc0\\x00\\xc0\\x9b\\x89\\x82\\x8e9}\\x13\\xc0]\\xd2\\x97\\xd4\\x1bG\\x06\\xc0\\xcd\\x1e6\\x90\\xbc\\x81\\x04\\xc0\\xe5\\xf41w\\xe5\"\\xe5?\\xff\\xfb\\xac\\x86\\x8a\\xa6\\x03@\\xfb\\x95\\xdfmPl\\x03@O\\x94\\xf3\\xd2\\xce\\xfa\\xf4?\\x91\\xbe\\xbb\\x18@A\\x03@BS\\x91J\\xe6\\x93\\x0c@\\x02\\x84\\xd8\\xdf\\xd8J\\xc3\\xbf\\x8a}@\\xeaR\\x9c\\x01@\\xd3>\\x19\\xe3\\xf0\\x0f\\x07\\xc0\\x9d\\x8a#D\\xac?\\xe0\\xbf\\x9e\\xa2\\x1dTc:\\xac?\\xdarL\\x0fo#\\xde?)#\\xbeR\\xa8\\x8e\\xe4\\xbf\\x08\\xb5f\\xfd\\x08\\x99\\xb7?\\xb7c\\x86\\xc9g\\xe1\\xd6?\\xee\\xa2\\x81\\x8e\\x14<\\x02@v\\xaeh\\xedjG\\x12@\\xf2\\x8dx\\x0c3d\\xd6?\\xeaaO\\x86\\x03\\xc9\\x04\\xc0\\x1c\\x9c3\\xadi\\t\\x13\\xc0\\x8e\\x19\\x96\\\\b\\x13\\xfe\\xbf\\xd8\\xb2\\x92\\xf4K\\x01\\x15\\xc0-\\x1e\\',_:\\x10\\xc0\\xf3T;\\xdf-\\xf2\\x04\\xc0\\x14,=\\x89d\\xb8\\x1f\\xc0\\x06wZ\\xcd\\xb7\\xcd\\x1c\\xc0\\xe9\\x96@ \\xb8!\\x0e\\xc0\\x15\\x91\\xf9\\xd3<\\xa2\\xc4?\\x9b\\x95\\xdd\\x84E5\\x06@\\x96\\tE\\xc0\\xf2\\xf8\\x10@%\\xe8~\\x86\\x88\\xd7\\xfa?@\\xf7\\r0H~\\xf8?\\xeb\\x88\\x1e)\\xb53\\xd6\\xbf\\x10\\xfd$SH\\x99\\x01@=;\\x8a\\xb9\\xa7\\xd6\\xcf?\\t\\x02\\x98*\\xa8\\xbf\\xe8\\xbf<\"T\\x8a\\xe00\\xb2\\xbf\\xcb{<h[\\xbf\\xe6\\xbf\\xf2\\xb9\\x10\\x8d\\xf9\\x0c\\x81?\\x06Gu\\x86\\x1fN\\xc5?_QZ\\x15!\\xb0\\xd5?\\xaaq\\x95\\xc0\\x06\\xe6\\xd2\\xbfhE|J\\x8a\\x06\\xb1?Qb\\xe0&\\xdb6\\x0e@\\xf4\\x83\\x1eg\\x92\\xec\\x15@\\xa06\\xe4\\xa3\\xae\\xc8\\x02@/c\\xeb\\xe3\\x87\\xfe\\xf5\\xbf\\xa23\\xf5\\x99L\\xa2\\x10\\xc0\\xe9\\xc4Bu\\x16Y\\x12\\xc0Y\\x9d\\xb3D\\x11\\xb4\\x11\\xc0C\\xc1\\xf2\\xb1|\\x9b\\x1b\\xc0\\x97\\x16\\x81\\x85\\xba\\xcf\\x18\\xc0\\xd5\\x81S?\\xbe\\x12\\x05\\xc0\\xd4\\x95;\\xd7;\\x84\\xc4\\xbf\\x06D\\x85\\x1d\\xd4<\\xfd?\\x08\\x1f\\xe52\\xf6\\xce\\r@\\xc4\\x9b\\xfb\\xc1c\\xd7\\x04@\\x7f\\x17\\xc8\\x1c\\xc0\\x95\\xcf\\xbf\\xacH\\x87\\xdf\\xc7\\xca\\xf1?2\\xb9\\x91\\xafi\"\\xf6?f\\xe6\\xc3\\x0c\\x90\\xef\\t@p\"\\xe1!\\xd9\\xc7\\xd4?\\xea\\x00W#\\xbd\\xf0\\xe3\\xbfv[\\x19\\xca\\x81\\xe3\\xec\\xbf\\xe0\\xfb}\\x1ez\\xbd\\xfa\\xbfo8\\x80\\xf7\\xcf\\x88\\xea\\xbf\\xb0)1\\x8fP\\r\\xe5?\\x1d\\x02j\\xb1\\xba\\xe0\\xe4?F\\xb1\\xee\\x04\\xb1\\xb1\\xf1\\xbf\\x13X\\xe3\\xef\\x92\\'\\xdd\\xbf\\xb8\\xb7\\xc2\\xf8\\xb0\\xfa\\xde?\\xa7[\\xb9\\x83\\x99\\xd1\\x02@\\xca.\\x1c\\x07\\x8f\\x0b\\x03@;F\\xa25E\\xb4\\xfd?\\x9b\\x06E\\xd4\\x03\\xa4\\xf0?\\xc22h]\\xb0\\xa1\\xc0?\\xc5\\x16\\xf5\\x12!\\xf0\\xf0\\xbf\\x04\\xcd\\xb9-\\x18/\\x02\\xc0\\xa5\\x075F~\\xa1\\xee\\xbf\\x0c[\\xbb\\x87\\xc5&\\xed?T\\r\\xad\\x12\\xe9|\\xf5?\\x8b\\xba$\\x88\\xcc)\\xfb?\\xc7\\x98\\xec\\xf7\\x8e\\x95\\x00@\\xa0\\xc8aO\\xb6\\xc5\\xc5?\\xecL\\x93\\xf7\\x13\\xc0\\xcd\\xbf\\x07\\x8fMM\\x08\\xb8\\xba?\\x0eC\\x1d\\xab\\x1e\\xeb\\xf6?l\\xe9\\x8d\\xc5!)\\xd4?\\xd2B3t\\xf6\\xc0\\xe5\\xbf#E\\x1dB5\\x0f\\xfc\\xbfb\\x97\\r<\\xddf\\xef\\xbf\\x12&\\xe3\\x9d\\xf4R\\xd4?\\xa8/W\\xff\\xf2.\\xfa\\xbf\\x11*U\\xf4+h\\xf9\\xbf\\x0e\\x03\\xe2\\xb0\\x8b\\xe5\\xf0?\\xfc\\xd0\\xbc\\x8cJ;\\xef\\xbf\\x05#8\\xdf\\x04\\xf9\\xd5?g\\x05o\\x19\\xcc@\\xf2\\xbf\\x8d\\x1d9\\xc3\\xf5\\xcc\\x03@\\x9dc\\xd9u\\x82\\xb1\\xc9?\\\\\\xef\\xe6\\xdeG\\xc2\\x00@\\xe4\\'Nr\\xe2\\x89\\xfd?\\x98\\xc4 iC9\\xeb?\\xfeT\\x898\\x927\\xe8?\\xca\\xfe*\\xdc\\xd9E\\xfc\\xbf\\xa2\\x1e&\\xd3\\xf9]\\xee?\\xedY\\xed\\xb3\\x94\\x7f\\x03@l\\x19\\xe6G\\xc1\\x8a\\xe8?\\x16\\x89D\\xe2\\x07\\xe8\\x06@wI\\x0c\\xd9D\\x8d\\xa9?\\xbb\\nY\\x1f\\xca\\xae\\xf6\\xbf\\xc8\\xf1\\xc8\\x15\\xce\\x1f\\x04@\\xc8\\xd4T1U<\\xee?\\xdf\\xc1\\xe4W\\x9b\\xc4\\xf3?\\x11\\x03ZR\\xfdk\\xf5\\xbf\\xc7z\\x0e_t\\xc6\\xfe\\xbf\\x9b\\xa2\\xb5\\xeb\\'j\\xbd?\\x85E\\xd0\\xa23g\\xf1?w\\x17\\x81\\xd4\\x80\\xda\\xf2?Z\\x17I77\\xf3\\xa3\\xbf\\xe1\\xb23~m!\\xe1\\xbfri\\xe1\\xbdR\\xf0\\xf2\\xbf\\xc81\\xa6<\\x81\\x02\\xc0\\xbf,\\xb6\\xdd,+\\xb2\\xd2?\\xc9\\x0f\\xb7|\\xc5)\\xcf\\xbf\\x93\\x0b\\xb37\\x96&\\xed\\xbf`D%Ij\\xdc\\xf9?%!q3\\xad\\x96\\xfe?q)\\xb9oF\\t\\xf0?G\\xa0\\xb4fY\\x0e\\xfe?\\x05\\xd3\\tP\\x8dz\\xed\\xbf!x\\xf8\\xb6\\x93\\xac\\xf4?\\xfdQ\\x07\\xd0\\n\\\\\\xef?>\\xe6\\x15?\\x9d\\xd3\\xf4?\\xb8dE7\\x14\\xcb\\xde?\\xf45\\x89gZl\\x03@\\xab#\\x0559\\xa0\\xad\\xbfj\\'\\xfd\\xd5\\x94^\\x07@\\xf26\\xc0\\xa2\\xd6[\\x00@\\xa6\\x9c\\xeaT$\\xc3\\xf1?\\xbd5\\xee\\xa7\\xcb@\\xea?\\x18\\xaa\\x908B\\xdd\\xeb?\\xfe\\xc2r\\xa2R\\xaf\\x9a\\xbf\\x081\\xd1\\x928\\xfc\\x04@\\xcb\\xaaD\\xcd\\xe9\\xeb\\xf9?(\\x16;5_u\\x03@m\\xc9~\\x8b\\xe0\\xc5\\xf9\\xbf\\x90\\x85\\x1d\\x9a\\xdal\\xce\\xbf\\xa1\\xe8\\xac\\x07\\xb0\\x9e\\xea?\\xea*C\\x97o8\\xd1?\\xb5l&\\xe1\\x99\\xc8\\x01@H\\x84\\xd5\\x086J\\xd7?=\\x9e\\xed\\x08+\\x95\\xe1\\xbf\\xdao@\\x94\\x18U\\xeb?\\xcd\\xd7\\xc1\\xd8(\\x0e\\xdb?P\\x15|}f\\xa2\\xcf?\\xce\\xde(*B\\xe6\\xe9\\xbf\\xc6\\x81\\x86\\x98\\x86\\x07\\xeb\\xbfU\\x1b\\xb3=\\xdcn\\xe6\\xbf\\xa9\\xfc\\xb2\\xc0\\x11L\\xde?\\xfb\\xefFV\\t\\'\\xf9?^!\\xfe#\\xc2\\xdb\\xe3\\xbfL\\x91\\x05g\\xb2y\\x03@Ea\\xba\\xe4.\\x10\\xe7?\"Ue\\xd40c\\xf4?\\xa8\\x80X\\xe7r\\xc9\\xeb\\xbfb-M\\xec\\xc0\\t\\xf2\\xbf\\xa1\\xf3\"\\xa0\\xee \\xf3?\\x07\\x91O\\x86\\x9c\\xa5\\xd9?\\xa0\\x06\\x92\\xd7\\x0fX\\xfd?\\x82\\x16\\x81R-J\\x07@\\xbb\\xf3$B\\xcc\\x02\\x02@\\xe6:\\xc5\\x9a\\xac\\xfc\\xeb\\xbf.b\\xab\\xdd\\x1b\\xad\\xe4\\xbf\\xfa\\x98\\xbc\\xa0,|\\xe6\\xbf?\\xd4?\\xac&p\\xe3?9\\xe3:\\xde;\\xe9\\xe3\\xbf\\x9b[\\xc7\\xf2\\x9f\\xa5\\xb2\\xbf\\x02\\xb5\\x89\\x11\\xfe\\xc2\\xce?[\\x1b\\x9blo\\x8a\\xa1\\xbf5\\xa2\\x89\\xa9a\"\\xbc\\xbfIDn\\xd6\\x1a\\n\\xd0\\xbfLy\\xa9z\\xd1\\xe9\\xf4?\\xa7{\\xb5\\x0b:}\\xda?\\xb1\\x0e\\xdf\\x95{\\x03\\xfe?5\\x8a\\x0c\\xa1\\x0f\\x9f\\xfb?\\x87\\xc8\\xb9\\xa1p\\x0b\\xaa\\xbf\\xd3\\xdb\\x0b~\\xbd\\xbe\\xe2?\\x9d\\xc8X\\x07Y\\xd6\\xf0?v\\x84\\x9f\\x1b\\x05\\xe8\\xf9?\\xc9.Px\\xc9Z\\x01@\\xc3\\x1c;\\xe9\\xce\\xcf\\xd5?\\xd3\\xe5L\\xcc\\x91\\x13\\xd6\\xbf\\x0e\\xa5\\xc63T2\\xf6?K\\x11\\xe6\\xba\\xe6\\x89\\xf0?>\\xc8|\\xa6JG\\xed\\xbf|^\\xc3\\xeb\\xe8\\xe7\\xbf\\xbf\\xb6\\x9dO\\x88\\xfeu\\x03\\xc0V\\xaf\\xcb\\xc3\\xc5\\xf3\\x01\\xc0\\x99!J\\xd6L\\x1b\\xab\\xbf\\xcc\\xda\\xbc\\xa5=/\\xfc\\xbf5\\x93f\\xf1\\r*\\xdd\\xbf\\x8cK\\xe7\\xefm\\xed\\xac\\xbf\\x07\\xe3Z\\xc0\\xad\\xb5\\xe2\\xbf:\\xae\\xc9\\xa9o\\x0e\\xe2\\xbf4\\xa9\\xc2\\x0eQ \\\\\\xbf\\xfe\\xba\\xca\\xd6\\x10\"\\xe1?\\x0c\\x03\\x97X8`\\xf3\\xbf\\xbd\\x8ePaj\\x9c\\xf0?\\x04hl.\\x95\\x00\\xb4\\xbfl\\xc8zp\\xe9\\xb5\\xcb?\\xc4\\xdb6\\xb0\\x13\\xc3\\xf9?q\\xd8[{\\xb3\\xeb\\xf3?\\x1fu\\xb6[\\xd8\\t\\xf7?h\\xac\\x1b\\x01\\xf2\\xaf\\xeb\\xbf\\xf1\\xf8;\\xdch?\\xe8?5\\xbd\\xa2\\xcb\\x14\\xc2\\x12@\"\\xd0\\xe3\\xd4\\xbb\\xe3\\xf3?Xv\\xd6\\x19-P\\xc0?sY%xml\\xd3?*\\xc6\\xac\\x19\\x91\\xe6\\xe8\\xbf\\x1b\\x7f\\xf0G\\x8e\\xb9\\xfd?\\x81\\xedK\\xe7\\x04a\\xe1?\\xd1\\xd3\\x05\\x9e\\xc94\\xd4?\\xe9\\xd3v\\xf9c\\x8b\\xec?\\xd4,\\xcfX\\xf9\\xb8\\xe4?\\x0f \\x1a\\x92\\xd0\\xbd\\x05\\xc0B\\xf6\\x82\\xc7\\xae\\xe8\\xe0?J)\\n\\xadG\\x9e\\xce\\xbfFA\\xb5_!\\xfc\\xca\\xbfm$\\xbd2\\x85\\xbe\\xd6\\xbf\\xb0\\x16\\x10\\t\\x01N\\xea?\\xd9K\\x98\\xf7\\xc5z\\xf2?F\\xfa\\xa3\\x1c\\xafJ\\xe3\\xbf\\x9c6m#%\\xb7\\xd9\\xbfj,\\xe1\\x11\\r\\xa1\\xeb?C\\xa4\\x0eJ\\xc7v\\xeb?\\xdc9[\\xfc\\xcfP\\xdb\\xbf]`7F%\\xc7\\xf2?\\xe6\\x96z]\\xd3\\xfa\\xe8?\\xca\\xe4\\xe2\\'\\x0b\\x93\\xe3?\\xf1\\xd8\\x9c\\xed\\x0f\\xe8\\x07@\\xd161\\xc7\\xd8\\xc8\\xe5?_\\xab~\\x0e\\xd8_\\xef?=\\x0e|\\x83\\x84\\xfe\\x00@F\\xc1\\xc1\\x1e\\x1f\\x08\\xed?\\x83\\xb2\\xb1\\xa5$\\\\\\x00@\\xe8f\\x8d/<l\\x00@\\x89J\\xbe\\xfd\\xd0\\x17\\xf7?U\\x1c\\xff\\xe0\\xd1\\x10\\xe8\\xbf\\xd8\\x04\\xef#\\xad\\x9b\\xfc\\xbf\\x7f\\xdc\\xecz\\xbd\\x00\\x05@\\xe4\\xbad\\xcb\\xad\\x00\\xf7?\\xba\\x8flF\"\\xa1\\x08@\\xc3\\xe8\\x8e;\\x9aG\\x06@QkN\\x1b\\xf7\\xa0\\xd2?\\n5Xz\\xb8\\xa1\\xfd?G\\xa3\\x8dl\\xe8\\xc9\\xec?f\\xbd\\xc4\\xba\\xe9s\\xd5\\xbfH\\xfc\\xc7\\x0c\\xd5\\xe9\\xd3\\xbf\\x1f\\xc5\\xa4\\x05\\xb3\\xef\\xda\\xbfJh\\x9enO\\xba\\xd3\\xbf`\\xdc\\x8a\\xf9\\xe0V\\xed\\xbf5\\x7f\\x1bd~b\\xf7?\\xe1*\\xefY\\x00\\xdb\\xf0\\xbf\\xde\\xda\\x82\\xef\\xb4\\xf0\\xf8?\\xbe0\\xf9\\x12\\x02\\\\\\xa7?\\x85\\xa4P\\\\\\xe6\\x14\\xe8?\\xd2S\\x90(c\\xe5\\xe6\\xbf\\x80\\xf5>\\'\\x15\\xd0\\xfc?\\x9e}\\x8c\\x8b\\xb9\\x9a\\xaa?\\xd20\\xc5\\xc6\\x99\\xcd\\xec\\xbf\\xffc\\xd4[\\xc0\\xc4\\xaf?C\\\\r\\xa5\\xcbZ\\xc9\\xbf\\xdb\\x01<\\xcc\\xe0P\\xfd?\\xba\\xb1\\x85\\xe4\\xdb$\\x01@5u\\x9e\\xcc;\\xb5\\xe7?\\x15R\\x06>S\\xbd\\xf6?\\x1a\\xb3y\\x86\\r\\xc7\\xfd?\\x13\\xb6\\xf4\\xc0\\x12\\xee\\t@\\x07\\x1a\\xd3\\xc0\\xf6\\xe8\\x92\\xbf\\x1b\\x90\\xb9\\x94\\xfeB\\xe5?\\x7f\\x08b\\x97\\xd8M\\x02@\\xb8\\xef\\xb2\\xdc\\'\\x03\\xe0?w\\x84\\x83->D\\xd4?d\\x96\\xf3\\xd7\\xb5\\t\\xc2\\xbf\\xc10\\x01w\\xe4\\x91\\xef\\xbf\\x96\\x88\\x04j$l\\xe5\\xbf]\\xc26\\x03dG\\xeb\\xbf\\x9a\\xe1^\\xa1\\xff\\x01\\xf2\\xbf\\xa5\\x0b6\\x9c9\\xb5\\xc0?\\xa4\\xca\\xc5\\xa5\\x14m\\xe1?\\xa1wf_U\\xd5\\xb6?_\\xa3\\x05\\x86x\\x9c\\xd9?5\\x8d\\xc1]%v\\xf4\\xbfv\\xf8_\\n\\xd2\\x07\\xde\\xbf<v4\\xe2\\xc7\\x08\\x98?AH\\xb2].\\xa6\\xd8?\\xd3\\x99\\x9f\\xc0U\\x1c\\xf5?\\xf3\\xeb\\xcd\\xa9Bk\\xd0\\xbf\\xfd\\xdf\\xa7\\xd9\\x1d\\xbf\\xd0?\\xf3\\xce\\xffy\\xba\\x8a\\xd5\\xbf\\xe5}\\xbb\\xe3\\rZ\\xe6?U8d!\\x9c9\\xf4?Z\\xd5\\xbd\\x11\\xcdT\\xe3?\\xa8\\x99\\x10\\x8f\\xc4%\\xe6\\xbf\\x8c\\xf2\\x1c\\xb08\\x1a\\xab?\\x1eB\\x932m\\x97\\xd3\\xbf$j}\\xb5\\xd9G\\xe0\\xbf\\xfe\\x1b_\\xd5\\xc8\\xe9\\xf6\\xbf\\xado\\x1c*\\xac\\xf9\\xe8?\\xca\\x1a\\x88\\r\\xc6-\\xe2?F8o\\xe3\\x9f;\\x04@ \\x8c\\xed\\xc2\\x0f\\x1d\\xe7?\\xc1\\xee\\xc5\\xac\\x03\\x1d\\xe5\\xbf\\xf8/lZ\\xe2f\\xf0\\xbf \\x8b`\\x88\\xad\\xe6\\xd3\\xbf<\\xef\\x87Yi\\xbc\\xef\\xbf\\xb8\\x8c\\x1d\\xeaH\\x0f\\xd9\\xbf'\ntbg1\n(g2\n(I0\ntS'b'\ntRp6\n(I1\n(I10\nI10\ntg5\nI00\nS';I5\\x9b\\xb9\\x81\\x0f@c\\xc9W\\xf4$:\\x0b\\xc0\\xe9f\\x95r\\xa0\\x89\\r\\xc0\\x96=!{*\\xf2\\x16\\xc00\\xa0\\x15\\x01j\\xec\\x17@\\x18\\xd1\\xe7H\\x81\\xce\\xfb\\xbf<A\\xdd\\x8d\\xaeL\\x01\\xc0\\x04p\\x97\\x8e\\x9a\\x1b\\r\\xc0\\xc4\\xc2\\xd7\\x86\\xda!\\x12\\xc0\\xab\\xa7&\\xbb\\x93\\xdf\\x03@\\xa40\\xfa\\xebz?\\x11@\\x0f\\x9d-@(\\x0f\\x13@\\xae\\x97bh\\xad\\xed\\xf5?T\\xda@O\\xa5\\x88\\x10@\\xfcm\\xb1\\x10A\\x93\\x04\\xc0\\xb9PE\\xcf\\x94\\xea\\xfe\\xbf\\x8do|\\xd7*\\x18\\r@\\xb9\\x9f=\\xdb,\\x1d\\xfe?H\\xa45q\\xebU\\n@\\x13k-\\x0b\\xfex\\xe2\\xbfp{Z\\x03 \\x86\\x04@\\x81\\x7f;\\x8c:6\\n\\xc0\\x93\\xdc\"\\xad\\x95i\\xe3?\\xbeu\\xb7\\xbe\\xa8\\xe1\\x13@\\xf8\\xef\\xc2/\\x14O\\x17@\\xd9jd\\x10\\\\u\\xed?K\\xaa\\xce\\xa7\\xa2|\\x06\\xc0@\\xeb\\x16VW~\\x16\\xc0t\\xa5\\xe9\\xa0\\xef\\x11\\x05@\\xc8\"\\xa2n8\\x8b\\xf5\\xbf1\\x17Vg\\xf0\\x87\\x05@\\xdai\\xb30\\x01m\\t\\xc0\\xa0\\r\\x07b\\xfc\\xf2\\x0e\\xc0**\\xa8\\xc5\\xb6\\xb5\\x10@X\\xe9]:\\x16\\xa7\\x13\\xc0UV\\x9c+k\\xf6\\xd1\\xbf\\x93?\\x1f\\xfe]\\xa7\\xf0\\xbf\\x8c)|\\xa0f>\\xd8\\xbf$L\\x7f\\xd9\\xc1\\xa0\\x00\\xc0\\x96\\xf0m\\x8d0\\xb6\\x00@_7\\xe3\\x82\\x87\\x8f\\t\\xc0\\xc23\\xb9M+{\\x04\\xc0\\xee\\xb7\\xdc1\\xac\\xb5\\xff?\\xa8\\xeff\\xa8\\xa1X\\xd1\\xbfLC(8\\xee\\x97\\xbd?\\xc7m\\xcb\\xef\\xbc\\xf4\\x1c@U\\xfa_p\\x8bV\\x00@`\\xa3\\xb5\\xa5u\\xc9\\x11@\\xf42\\xe2#\\xc0t\\x17\\xc0\\xaeM\\x18WT\\xea\\xf8\\xbf5\\x98\\xcb\\x01\\r* @\\xb9\\xe5\\x85\\xc7L*\\x00@\\xdc!\\xa5a\\xd4\\xf9\\r@d\\x01*6\\xa4\\x8d\\r\\xc0\\xac\\x007\\xfc\\xa1\\xfe\\x0b\\xc0zj\\xc0l\\xa55\\xdb?\\xb5\\xd4\\x9d\\xde\\x84\\xd0b?s\\xff:9\\xf3j\\x15\\xc0\\x96\\x1c\\x0b\\xd2\\'\\x1c\\xf2?F\\x06w\\xc6\\x02\\x98\\x1a@F\\x04u%8\\x95\\xfa?\\xa1\\xbd\\xa3<\\xea\\xc2\\x01\\xc0K\\x9a\\x8d\\xe2\\x8c\\x0f\\t\\xc0]G\\x16\\x9d\\xb5\\x14\\x1b\\xc0\\xad@\\xc1v\\xa3\\xec\\xee?\\xe1\\xcb\\x82[\\x8f\\xb0\\xf8?h\\x7f\\xb0H\\x12\\xca\\x0f@\\xab\\x08\\x0b][\\xbe\\n@i\\xaa\\xd8\\xce\\xb6r\\x16@\"\\t\\x8a\\xdfA\\x91\\xf9\\xbf\\xdd\\x1f\\xa8\\xba\\x9dM\\x1b\\xc0\\xb1\\x97\\xb2W\\xd1\\xd3\\x12@\\\\\\xaf\\xa6m\\x99\\x87\\xfc\\xbfO\\x8c\\xd2\\xe3\\xae#\\xbf?\\x81n\\xeb\\x04\\xf7\\xba\\xe1?\\xc6\\xee\\xd9\\xb8\\xc01\\xf9\\xbf\\xd5\\x1f\\xe7\\xa8\\xfdY\\t\\xc0\\x8f\\x87\\x04\\x1bZ\\x9b\\xfb?\\xe7\\xf6\\xf7\\xa1]\\xc7\\xf8\\xbf\\x00\\xffCh\\xb0\\x9f\\xe7?\\xf1\\x87Q\\xc9m\\\\\\x17@\\xe4C\\x82\\xe1\\x80\\t\\x05\\xc0\\x7f\\xde\\x92z{{\\x0b@W\\xe6\\xc2\\xdby^\\x03\\xc0\\xcc\\xf0\\n}\\xdbx\\x05\\xc0=\\xa6\\xf3\\xa9\\xfdE\\xfd\\xbf4q\\x85=.\\xbe\\x05\\xc0\\xc2\\xa0\\x19\\x10\\xdcl\\x08@\\x14\\xaa4\\xce\\x14\\x86\\xfa\\xbf\\xaf\\xcc5G\\xf0\\xd5\\x1e\\xc0P.$^\\x94\\x9d\\x11\\xc0\\xc8\\xaa\\xca(\\x8f{\\x0f\\xc0:q\\xad\\x1b\\xf9Q\\x01@}\\xde\\xf6\\xa3\\x1a\\x1b\\xea?\\xeb\\x19\\xc0J\\x11\\xb2\\xb8\\xbf\\x92\\x8f8\\xfb\\xdf\\xe6\\x1b\\xc0q*\\x02e*\\xa1\\x06@\\xd4\\xa7\\xc5F\\\\\\x18\\x02\\xc0\\xe96\\x10\\xe4\\xb4D\\x0f\\xc0N\\xfc\\xc8\\xfd:\\xf6\\xdb\\xbf'\ntbg1\n(g2\n(I0\ntS'b'\ntRp7\n(I1\n(I10\nI1\ntg5\nI00\nS'\\xad\\xe6(\\x12\\xef\\xd0\\xaa\\xbf\\x7f\\xbdB\\xa0\\x82\\x8c\\x1f@\\xe6\\xd7\\xef\\x00q\\xbc\\xf1?\\x1d\\xab\\xfa\\x9a;\\xe9\\xb0?E\\x0b24\\x10)\\xf9?\\xf9P\\x86\\xf7\\x00\\xd0\\x10@\\xde\\x89\\xf0\\xf1\\x8c\\xa5\\x0b@\\x18\\xeb\\xf4N\\xf1\\xaa\\xf3?\\xd64\\xd7\\xc7\\xf2F\\x00\\xc0N\\n\\xdf\\x08\\x14x)@'\ntbg1\n(g2\n(I0\ntS'b'\ntRp8\n(I1\n(I10\nI1\ntg5\nI00\nS'\\xcd(\\xef\\xf6\\xae`\\x0c\\xc0\\xd83\\x80\\x90`\\x9e0\\xc0\\xb9\\xdc1\\x80X^\\x1a\\xc0\\xcc).\\x98Y\\xe0\\x11\\xc0myx\\x94\\xf6\\xba&\\xc0\\xde3M%\\xd2\\x8f$\\xc0\\xacQx\\x89\\x06\\xc1%\\xc0\\xfb\\xaa \\xec\\x9en\\xf3\\xbf\\x1b\\x8b\\xf0H/\\xf0 \\xc0\\x90\\xf7\\x0c$\\xc3\\xa9\\x94?'\ntbt."
  },
  {
    "path": "src/test/resources/samples/langs/Pickle/random.pkl",
    "content": "cnumpy.core.multiarray\n_reconstruct\np0\n(cnumpy\nndarray\np1\n(I0\ntp2\nS'b'\np3\ntp4\nRp5\n(I1\n(I100\ntp6\ncnumpy\ndtype\np7\n(S'f8'\np8\nI0\nI1\ntp9\nRp10\n(I3\nS'<'\np11\nNNNI-1\nI-1\nI0\ntp12\nbI00\nS'\\x1cc~\\xc3\\xa7r\\xed?\\xe5${\\xec\\xd6\\xcd\\xed?\\x809-\\x02%\\xa9\\xa2?F\\x0f\\x1d\\xe8\\xef\\xa3\\xdb?\\xfe\\xd1\\x0c\\xb7\\x83\\x13\\xef?\\xe0<o\\xa1\\xa9^\\xdf?CE\\x96\\x88/o\\xe2?<\\xd8\\xa1\\x96\\xa2T\\xce?\\x152\\x8e\\xe5\\xa8\\x7f\\xe8?\\xe4\\xb7\\x9a\\xe0$\\x0f\\xdc?\\x90\\xe4\\xe2\\xd4=\\xce\\xc3?Ix\\xe3P\\xc4C\\xe1?\\x16\\xd17\\xc1Y\\xfc\\xed?5\\xd7\\xae@4\\xfa\\xe8?\\x0f\\x87\\x8d>\\xfcO\\xe5?Y\\x97\\xcb\"\\xa7%\\xe7?\\x9b\\x8d\\x16\\xda\\x97\\xe1\\xeb?T\\x14\\xbd\\xfe|\\xf4\\xd0?\\x18\\xdfH\\xc56A\\xba?\\x90\\xc5\\xfb\\xc63:\\xe5?\\xbf%\\xad\\xe5.\\x86\\xe9?\\xc6\\x0c\\xa9\\x8c\\xd7\\xd5\\xe9?\\xf8\\xafc:\\x84g\\xd7?\\xf8\\x98\\x879\\x9a\\x16\\xee?\\xba\\xdf\\x88\\x8az\\x06\\xe2?~g-\\xeb\\xc8\\xed\\xee?\\x08A\\xcc\\x8c\\xe7>\\xef?\\xceD\\xc4ar\\n\\xdc?\\x92w\\xbb\\xa34\\xb1\\xd9?\\x88\\xb9\\xc0{u\\xa3\\xdc?d\\x1a\\xad\\xe8\\xf3\\x14\\xdd?\\x9c\\x95\\x13\\x96o?\\xe5?\\x9cT[\\xb8r\\xa9\\xe5?0\\xf1\\x01+(\\x0f\\xdf?W\\xbdjqD&\\xed?c\\xcf1-W\\xe6\\xe1?\\xce\\xbc\\xe1{zW\\xd9?\"d\\xcf\\xd7\\x13\\x93\\xde?\\xf2P\\xf6\\xc3\\xd6\\x87\\xd5?\\xc2\\x0e\\x92q\\x89\\xda\\xd5?\\xc0:B\\x1bb\\x00\\x9e?Y\\xafHmr\\x80\\xe3?\\x1co\\xa7\\xba\\xa5/\\xe4?\\xa2\\xbc \\x9c\\xddB\\xd0?\\xd2L\\x935\\x17\\'\\xee?|\\x8cM\\xeb\\x97=\\xe8?\\x0f0xN*V\\xea?\\x81p\\xe3,!\\xf2\\xee?\\xf5w\\xed\\x10\\x9eu\\xe0?\\xc5\\x16\\\\LR\\xb5\\xe1?\\xbeh\\x04\\xa4g\\xe5\\xd6?\\xea\\xc0\\xb9\\xf0\\xb2\\xd8\\xd9?\\xac\\x9c\\xeep\\x1a\\xa9\\xd8?@W9hp\\x16\\xb1?\\xc4\\xedS\\xd6V\\xa1\\xed?\\x93,!\\xdc\\xa1\\x8b\\xe9?\\x80)\\xb1\\xa6[T\\xc9?\\xac\\xbc\\x8a\\xd21\\xdd\\xc5?\\x80\\x9c.g\\xf1\\xf2\\xc6?\\tLu\\xc3\\xf7U\\xe9?n\\'\\x9f?\\xbe\\xf9\\xe9?\\xa3\\xe7K\\x1c\\xb3\\xa9\\xea?X\\x98\\x1a\\xcb\\xa0\\xcd\\xd3? \\xb6O\\x9c\\x1bQ\\xc2?\"\\x89[\\xad1\\x8e\\xea?\\xdd\\x8f\\xa0P\\xc7\\x0e\\xe2?c\\xa4j\\xa3\\r\\xac\\xef?\\xba\\xb6\\x0f\\x8emo\\xef?\\xe0\\xed\\xa0\\xc5R9\\xab?U\\xf1\\xcd\\xcf\\xbf\\xcb\\xea?\\x89*#\\x06\\xb0|\\xe8?d\\xa3\\xad\\xcd\\xe0]\\xcc?\\xb5\\xe78\\xa7w\\x13\\xe3?\\xce\\x99\\x98\\xefS%\\xd7?\\xb1\\xf8\\xd8\\x8eI\\x13\\xef?\\x91`]\\x93\\xd4 \\xec?\\xc0\\rPz\\xee\\xbd\\xe7?7\\x92\\xd4\\x0fP\\x8f\\xe1?L\\x0f\\xaf\\xa9\\xc3\\x19\\xdd?\\\\}\\x15X\\x870\\xc7? ~ t\\xcat\\xb1?@?\\xec\\x97u\\x05\\xe9?F\\x8d:\\xac4D\\xdb?qY\\xe1Qk|\\xe2? \\xaf\\xeaj\\xa5\\x04\\xab?J[\\x1al;\\x00\\xd5?\\x00^{n\\xc2\\xf1S?\\xb0\\x82dN\\xda\\xb5\\xc7?\\xe0 \\x07\\xe1?R\\x92?\\xc4\\r\\x08+\\x99J\\xe1?I|&U\\x19\\xc4\\xe1?|*\\xf9\\xebq\\x7f\\xed?\\xbc*\\x93\\x89k\\xab\\xe9?oiL\\x90;\\xe0\\xef?\\x96\\xcd\\x9b\\xff\\x18g\\xdc?pt\\xb4\\xa5\\x9c\\xa2\\xbc?Nu]w*\\xb7\\xd2?\\x88k\\xac\\xd0\\xfd\\xbf\\xd5?Q\\x02$b\\xfeH\\xea?5\\xf6\\t\\xb6K\\x1a\\xee?'\np13\ntp14\nb."
  },
  {
    "path": "src/test/resources/samples/langs/Pickle/save.pkl",
    "content": "(dp0\nS'lion'\np1\nS'yellow'\np2\nsS'kitty'\np3\nS'red'\np4\ns."
  },
  {
    "path": "src/test/resources/samples/langs/PicoLisp/simul.l",
    "content": "# 11dec13abu\n# (c) Software Lab. Alexander Burger\n\n(de permute (Lst)\n   (ifn (cdr Lst)\n      (cons Lst)\n      (mapcan\n         '((X)\n            (mapcar\n               '((Y) (cons X Y))\n               (permute (delete X Lst)) ) )\n         Lst ) ) )\n\n(de subsets (N Lst)\n   (cond\n      ((=0 N) '(NIL))\n      ((not Lst))\n      (T\n         (conc\n            (mapcar\n               '((X) (cons (car Lst) X))\n               (subsets (dec N) (cdr Lst)) )\n            (subsets N (cdr Lst)) ) ) ) )\n\n(de shuffle (Lst)\n   (by '(NIL (rand)) sort Lst) )\n\n(de samples (Cnt Lst)\n   (make\n      (until (=0 Cnt)\n         (when (>= Cnt (rand 1 (length Lst)))\n            (link (car Lst))\n            (dec 'Cnt) )\n         (pop 'Lst) ) ) )\n\n\n# Genetic Algorithm\n(de gen (\"Pop\" \"Cond\" \"Re\" \"Mu\" \"Se\")\n   (until (\"Cond\" \"Pop\")\n      (for (\"P\" \"Pop\" \"P\" (cdr \"P\"))\n         (set \"P\"\n            (maxi \"Se\"  # Selection\n               (make\n                  (for (\"P\" \"Pop\" \"P\")\n                     (rot \"P\" (rand 1 (length \"P\")))\n                     (link  # Recombination + Mutation\n                        (\"Mu\" (\"Re\" (pop '\"P\") (pop '\"P\"))) ) ) ) ) ) ) )\n   (maxi \"Se\" \"Pop\") )\n\n\n# Alpha-Beta tree search\n(de game (\"Flg\" \"Cnt\" \"Moves\" \"Move\" \"Cost\")\n   (let (\"Alpha\" '(1000000)  \"Beta\" -1000000)\n      (recur (\"Flg\" \"Cnt\" \"Alpha\" \"Beta\")\n         (let? \"Lst\" (\"Moves\" \"Flg\")\n            (if (=0 (dec '\"Cnt\"))\n               (loop\n                  (\"Move\" (caar \"Lst\"))\n                  (setq \"*Val\" (list (\"Cost\" \"Flg\") (car \"Lst\")))\n                  (\"Move\" (cdar \"Lst\"))\n                  (T (>= \"Beta\" (car \"*Val\"))\n                     (cons \"Beta\" (car \"Lst\") (cdr \"Alpha\")) )\n                  (when (> (car \"Alpha\") (car \"*Val\"))\n                     (setq \"Alpha\" \"*Val\") )\n                  (NIL (setq \"Lst\" (cdr \"Lst\")) \"Alpha\") )\n               (setq \"Lst\"\n                  (sort\n                     (mapcar\n                        '((\"Mov\")\n                           (prog2\n                              (\"Move\" (car \"Mov\"))\n                              (cons (\"Cost\" \"Flg\") \"Mov\")\n                              (\"Move\" (cdr \"Mov\")) ) )\n                        \"Lst\" ) ) )\n               (loop\n                  (\"Move\" (cadar \"Lst\"))\n                  (setq \"*Val\"\n                     (if (recurse (not \"Flg\") \"Cnt\" (cons (- \"Beta\")) (- (car \"Alpha\")))\n                        (cons (- (car @)) (cdar \"Lst\") (cdr @))\n                        (list (caar \"Lst\") (cdar \"Lst\")) ) )\n                  (\"Move\" (cddar \"Lst\"))\n                  (T (>= \"Beta\" (car \"*Val\"))\n                     (cons \"Beta\" (cdar \"Lst\") (cdr \"Alpha\")) )\n                  (when (> (car \"Alpha\") (car \"*Val\"))\n                     (setq \"Alpha\" \"*Val\") )\n                  (NIL (setq \"Lst\" (cdr \"Lst\")) \"Alpha\") ) ) ) ) ) )\n\n\n### Grids ###\n(de grid (DX DY FX FY)\n   (let Grid\n      (make\n         (for X DX\n            (link\n               (make\n                  (for Y DY\n                     (set\n                        (link\n                           (if (> DX 26)\n                              (box)\n                              (intern (pack (char (+ X 96)) Y)) ) )\n                        (cons (cons) (cons)) ) ) ) ) ) )\n      (let West (and FX (last Grid))\n         (for (Lst Grid  Lst)\n            (let\n               (Col (pop 'Lst)\n                  East (or (car Lst) (and FX (car Grid)))\n                  South (and FY (last Col)) )\n               (for (L Col  L)\n                  (with (pop 'L)\n                     (set (: 0 1) (pop 'West))  # west\n                     (con (: 0 1) (pop 'East))  # east\n                     (set (: 0 -1) South)       # south\n                     (con (: 0 -1)              # north\n                        (or (car L) (and FY (car Col))) )\n                     (setq South This) ) )\n               (setq West Col) ) ) )\n      Grid ) )\n\n(de west (This)\n   (: 0 1 1) )\n\n(de east (This)\n   (: 0 1 -1) )\n\n(de south (This)\n   (: 0 -1 1) )\n\n(de north (This)\n   (: 0 -1 -1) )\n\n(de disp (\"Grid\" \"How\" \"Fun\" \"X\" \"Y\" \"DX\" \"DY\")\n   (setq \"Grid\"\n      (if \"X\"\n         (mapcar\n            '((L) (flip (head \"DY\" (nth L \"Y\"))))\n            (head \"DX\" (nth \"Grid\" \"X\")) )\n         (mapcar reverse \"Grid\") ) )\n   (let (N (+ (length (cdar \"Grid\")) (or \"Y\" 1))  Sp (length N))\n      (\"border\" north)\n      (while (caar \"Grid\")\n         (prin \" \" (align Sp N) \" \"\n            (and \"How\" (if (and (nT \"How\") (west (caar \"Grid\"))) \" \" '|)) )\n         (for L \"Grid\"\n            (prin\n               (\"Fun\" (car L))\n               (and \"How\" (if (and (nT \"How\") (east (car L))) \" \" '|)) ) )\n         (prinl)\n         (\"border\" south)\n         (map pop \"Grid\")\n         (dec 'N) )\n      (unless (> (default \"X\" 1) 26)\n         (space (inc Sp))\n         (for @ \"Grid\"\n            (prin \" \" (and \"How\" \"  \") (char (+ 96 \"X\")))\n            (T (> (inc '\"X\") 26)) )\n         (prinl) ) ) )\n\n(de \"border\" (Dir)\n   (when \"How\"\n      (space Sp)\n      (prin \"  +\")\n      (for L \"Grid\"\n         (prin (if (and (nT \"How\") (Dir (car L))) \"   +\" \"---+\")) )\n      (prinl) ) )\n"
  },
  {
    "path": "src/test/resources/samples/langs/PigLatin/example.pig",
    "content": "/**\n * sample.pig\n */\n\nREGISTER $SOME_JAR;\n\nA = LOAD 'person' USING PigStorage() AS (name:chararray, age:int); -- Load person\nB = FOREACH A generate name;\nDUMP B;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pike/Error.pmod",
    "content": "#pike __REAL_VERSION__\n\nconstant Generic = __builtin.GenericError;\n\nconstant Index = __builtin.IndexError;\n\nconstant BadArgument = __builtin.BadArgumentError;\n\nconstant Math = __builtin.MathError;\n\nconstant Resource = __builtin.ResourceError;\n\nconstant Permission = __builtin.PermissionError;\n\nconstant Decode = __builtin.DecodeError;\n\nconstant Cpp = __builtin.CppError;\n\nconstant Compilation = __builtin.CompilationError;\n\nconstant MasterLoad = __builtin.MasterLoadError;\n\nconstant ModuleLoad = __builtin.ModuleLoadError;\n\n//! Returns an Error object for any argument it receives. If the\n//! argument already is an Error object or is empty, it does nothing.\nobject mkerror(mixed error)\n{\n  if (error == UNDEFINED)\n    return error;\n  if (objectp(error) && error->is_generic_error)\n    return error;\n  if (arrayp(error))\n    return Error.Generic(@error);\n  if (stringp(error))\n    return Error.Generic(error);\n  return Error.Generic(sprintf(\"%O\", error));\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Pike/FakeFile.pike",
    "content": "#pike __REAL_VERSION__\n\n//! A string wrapper that pretends to be a @[Stdio.File] object\n//! in addition to some features of a @[Stdio.FILE] object.\n\n\n//! This constant can be used to distinguish a FakeFile object\n//! from a real @[Stdio.File] object.\nconstant is_fake_file = 1;\n\nprotected string data;\nprotected int ptr;\nprotected int(0..1) r;\nprotected int(0..1) w;\nprotected int mtime;\n\nprotected function read_cb;\nprotected function read_oob_cb;\nprotected function write_cb;\nprotected function write_oob_cb;\nprotected function close_cb;\n\n//! @seealso\n//!   @[Stdio.File()->close()]\nint close(void|string direction) {\n  direction = lower_case(direction||\"rw\");\n  int cr = has_value(direction, \"r\");\n  int cw = has_value(direction, \"w\");\n\n  if(cr) {\n    r = 0;\n  }\n\n  if(cw) {\n    w = 0;\n  }\n\n  // FIXME: Close callback\n  return 1;\n}\n\n//! @decl void create(string data, void|string type, void|int pointer)\n//! @seealso\n//!   @[Stdio.File()->create()]\nvoid create(string _data, void|string type, int|void _ptr) {\n  if(!_data) error(\"No data string given to FakeFile.\\n\");\n  data = _data;\n  ptr = _ptr;\n  mtime = time();\n  if(type) {\n    type = lower_case(type);\n    if(has_value(type, \"r\"))\n      r = 1;\n    if(has_value(type, \"w\"))\n      w = 1;\n  }\n  else\n    r = w = 1;\n}\n\nprotected string make_type_str() {\n  string type = \"\";\n  if(r) type += \"r\";\n  if(w) type += \"w\";\n  return type;\n}\n\n//! @seealso\n//!   @[Stdio.File()->dup()]\nthis_program dup() {\n  return this_program(data, make_type_str(), ptr);\n}\n\n//! Always returns 0.\n//! @seealso\n//!   @[Stdio.File()->errno()]\nint errno() { return 0; }\n\n//! Returns size and the creation time of the string.\nStdio.Stat stat() {\n  Stdio.Stat st = Stdio.Stat();\n  st->size = sizeof(data);\n  st->mtime=st->ctime=mtime;\n  st->atime=time();\n  return st;\n}\n\n//! @seealso\n//!   @[Stdio.File()->line_iterator()]\nString.SplitIterator line_iterator(int|void trim) {\n  if(trim)\n    return String.SplitIterator( data-\"\\r\", '\\n' );\n  return String.SplitIterator( data, '\\n' );\n}\n\nprotected mixed id;\n\n//! @seealso\n//!   @[Stdio.File()->query_id()]\nmixed query_id() { return id; }\n\n//! @seealso\n//!   @[Stdio.File()->set_id()]\nvoid set_id(mixed _id) { id = _id; }\n\n//! @seealso\n//!   @[Stdio.File()->read_function()]\nfunction(:string) read_function(int nbytes) {\n  return lambda() { return read(nbytes); };\n}\n\n//! @seealso\n//!   @[Stdio.File()->peek()]\nint(-1..1) peek(int|float|void timeout) {\n  if(!r) return -1;\n  if(ptr >= sizeof(data)) return 0;\n  return 1;\n}\n\n//! Always returns 0.\n//! @seealso\n//!   @[Stdio.File()->query_address()]\nstring query_address(void|int(0..1) is_local) { return 0; }\n\n//! @seealso\n//!   @[Stdio.File()->read()]\nstring read(void|int(0..) len, void|int(0..1) not_all) {\n  if(!r) return 0;\n  if (len < 0) error(\"Cannot read negative number of characters.\\n\");\n  int start=ptr;\n  ptr += len;\n  if(zero_type(len) || ptr>sizeof(data))\n    ptr = sizeof(data);\n\n  // FIXME: read callback\n  return data[start..ptr-1];\n}\n\n//! @seealso\n//!   @[Stdio.FILE()->gets()]\nstring gets() {\n  if(!r) return 0;\n  string ret;\n  sscanf(data,\"%*\"+(string)ptr+\"s%[^\\n]\",ret);\n  if(ret)\n  {\n    ptr+=sizeof(ret)+1;\n    if(ptr>sizeof(data))\n    {\n      ptr=sizeof(data);\n      if(!sizeof(ret))\n\tret = 0;\n    }\n  }\n\n  // FIXME: read callback\n  return ret;\n}\n\n//! @seealso\n//!   @[Stdio.FILE()->getchar()]\nint getchar() {\n  if(!r) return 0;\n  int c;\n  if(catch(c=data[ptr]))\n    c=-1;\n  else\n    ptr++;\n\n  // FIXME: read callback\n  return c;\n}\n\n//! @seealso\n//!   @[Stdio.FILE()->unread()]\nvoid unread(string s) {\n  if(!r) return;\n  if(data[ptr-sizeof(s)..ptr-1]==s)\n    ptr-=sizeof(s);\n  else\n  {\n    data=s+data[ptr..];\n    ptr=0;\n  }\n}\n\n//! @seealso\n//!   @[Stdio.File()->seek()]\nint seek(int pos, void|int mult, void|int add) {\n  if(mult)\n    pos = pos*mult+add;\n  if(pos<0)\n  {\n    pos = sizeof(data)+pos;\n    if( pos < 0 )\n\tpos = 0;\n  }\n  ptr = pos;\n  if( ptr > strlen( data ) )\n      ptr = strlen(data);\n  return ptr;\n}\n\n//! Always returns 1.\n//! @seealso\n//!   @[Stdio.File()->sync()]\nint(1..1) sync() { return 1; }\n\n//! @seealso\n//!   @[Stdio.File()->tell()]\nint tell() { return ptr; }\n\n//! @seealso\n//!   @[Stdio.File()->truncate()]\nint(0..1) truncate(int length) {\n  data = data[..length-1];\n  return sizeof(data)==length;\n}\n\n//! @seealso\n//!   @[Stdio.File()->write()]\nint(-1..) write(string|array(string) str, mixed ... extra) {\n  if(!w) return -1;\n  if(arrayp(str)) str=str*\"\";\n  if(sizeof(extra)) str=sprintf(str, @extra);\n\n  if(ptr==sizeof(data)) {\n    data += str;\n    ptr = sizeof(data);\n  }\n  else if(sizeof(str)==1)\n    data[ptr++] = str[0];\n  else {\n    data = data[..ptr-1] + str + data[ptr+sizeof(str)..];\n    ptr += sizeof(str);\n  }\n\n  // FIXME: write callback\n  return sizeof(str);\n}\n\n//! @seealso\n//!   @[Stdio.File()->set_blocking]\nvoid set_blocking() {\n  close_cb = 0;\n  read_cb = 0;\n  read_oob_cb = 0;\n  write_cb = 0;\n  write_oob_cb = 0;\n}\n\n//! @seealso\n//!   @[Stdio.File()->set_blocking_keep_callbacks]\nvoid set_blocking_keep_callbacks() { }\n\n//! @seealso\n//!   @[Stdio.File()->set_blocking]\nvoid set_nonblocking(function rcb, function wcb, function ccb,\n\t\t     function rocb, function wocb) {\n  read_cb = rcb;\n  write_cb = wcb;\n  close_cb = ccb;\n  read_oob_cb = rocb;\n  write_oob_cb = wocb;\n}\n\n//! @seealso\n//!   @[Stdio.File()->set_blocking_keep_callbacks]\nvoid set_nonblocking_keep_callbacks() { }\n\n\n//! @seealso\n//!   @[Stdio.File()->set_close_callback]\nvoid set_close_callback(function cb) { close_cb = cb; }\n\n//! @seealso\n//!   @[Stdio.File()->set_read_callback]\nvoid set_read_callback(function cb) { read_cb = cb; }\n\n//! @seealso\n//!   @[Stdio.File()->set_read_oob_callback]\nvoid set_read_oob_callback(function cb) { read_oob_cb = cb; }\n\n//! @seealso\n//!   @[Stdio.File()->set_write_callback]\nvoid set_write_callback(function cb) { write_cb = cb; }\n\n//! @seealso\n//!   @[Stdio.File()->set_write_oob_callback]\nvoid set_write_oob_callback(function cb) { write_oob_cb = cb; }\n\n\n//! @seealso\n//!   @[Stdio.File()->query_close_callback]\nfunction query_close_callback() { return close_cb; }\n\n//! @seealso\n//!   @[Stdio.File()->query_read_callback]\nfunction query_read_callback() { return read_cb; }\n\n//! @seealso\n//!   @[Stdio.File()->query_read_oob_callback]\nfunction query_read_oob_callback() { return read_oob_cb; }\n\n//! @seealso\n//!   @[Stdio.File()->query_write_callback]\nfunction query_write_callback() { return write_cb; }\n\n//! @seealso\n//!   @[Stdio.File()->query_write_oob_callback]\nfunction query_write_oob_callback() { return write_oob_cb; }\n\nstring _sprintf(int t) {\n  return t=='O' && sprintf(\"%O(%d,%O)\", this_program, sizeof(data),\n\t\t\t   make_type_str());\n}\n\n\n// FakeFile specials.\n\n//! A FakeFile can be casted to a string.\nmixed cast(string to) {\n  switch(to) {\n  case \"string\": return data;\n  case \"object\": return this;\n  }\n  error(\"Can not cast object to %O.\\n\", to);\n}\n\n//! Sizeof on a FakeFile returns the size of its contents.\nint(0..) _sizeof() {\n  return sizeof(data);\n}\n\n//! @ignore\n\n#define NOPE(X) mixed X (mixed ... args) { error(\"This is a FakeFile. %s is not available.\\n\", #X); }\nNOPE(assign);\nNOPE(async_connect);\nNOPE(connect);\nNOPE(connect_unix);\nNOPE(open);\nNOPE(open_socket);\nNOPE(pipe);\nNOPE(tcgetattr);\nNOPE(tcsetattr);\n\n// Stdio.Fd\nNOPE(dup2);\nNOPE(lock); // We could implement this\nNOPE(mode); // We could implement this\nNOPE(proxy); // We could implement this\nNOPE(query_fd);\nNOPE(read_oob);\nNOPE(set_close_on_exec);\nNOPE(set_keepalive);\nNOPE(trylock); // We could implement this\nNOPE(write_oob);\n\n//! @endignore"
  },
  {
    "path": "src/test/resources/samples/langs/Pike/shebang.pike",
    "content": "#!/usr/bin/env pike\n\nint main(int argc, array argv) {\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pod/PSGI.pod",
    "content": "=pod\n\n=head1 NAME\n\nCatalyst::PSGI - How Catalyst and PSGI work together\n\n=head1 SYNOPSIS\n\nThe L<PSGI> specification defines an interface between web servers and\nPerl-based web applications and frameworks. It supports the writing of\nportable applications that can be run using various methods (as a\nstandalone server, or using mod_perl, FastCGI, etc.). L<Plack> is an\nimplementation of the PSGI specification for running Perl applications.\n\nCatalyst used to contain an entire set of C<< Catalyst::Engine::XXXX >>\nclasses to handle various web servers and environments (e.g. CGI,\nFastCGI, mod_perl) etc.\n\nThis has been changed in Catalyst 5.9 so that all of that work is done\nby Catalyst implementing the L<PSGI> specification, using L<Plack>'s\nadaptors to implement that functionality.\n\nThis means that we can share common code, and share fixes for specific\nweb servers.\n\n=head1 I already have an application\n\nIf you already have a Catalyst application, then you should be able to\nupgrade to the latest release with little or no trouble (see the notes\nin L<Catalyst::Upgrading> for specifics about your web server\ndeployment).\n\n=head1 Writing your own PSGI file.\n\n=head2 What is a .psgi file?\n\nA C<< .psgi >> file lets you control how your application code reference\nis built. Catalyst will automatically handle this for you, but it's\npossible to do it manually by creating a C<myapp.psgi> file in the root\nof your application.\n\n=head2 Why would I want to write my own .psgi file?\n\nWriting your own .psgi file allows you to use the alternate L<plackup> command\nto start your application, and allows you to add classes and extensions\nthat implement L<Plack::Middleware>, such as L<Plack::Middleware::ErrorDocument>\nor L<Plack::Middleware::AccessLog>.\n\nThe simplest C<.psgi> file for an application called C<TestApp> would be:\n\n    use strict;\n    use warnings;\n    use TestApp;\n\n    my $app = TestApp->psgi_app(@_);\n\nNote that Catalyst will apply a number of middleware components for you\nautomatically, and these B<will not> be applied if you manually create a\npsgi file yourself. Details of these components can be found below.\n\nAdditional information about psgi files can be found at:\nL<http://search.cpan.org/dist/Plack/lib/Plack.pm#.psgi_files>\n\n=head2 What is in the .psgi file Catalyst generates by default?\n\nCatalyst generates an application which, if the C<using_frontend_proxy>\nsetting is on, is wrapped in L<Plack::Middleware::ReverseProxy>, and\ncontains some engine-specific fixes for uniform behaviour, as contained\nin:\n\n=over\n\n=item L<Plack::Middleware::LighttpdScriptNameFix>\n\n=item L<Plack::Middleware::IIS6ScriptNameFix>\n\n=back\n\nIf you override the default by providing your own C<< .psgi >> file,\nthen none of these things will be done automatically for you by the PSGI\napplication returned when you call C<< MyApp->psgi_app >>. Thus, if you\nneed any of this functionality, you'll need to implement this in your\nC<< .psgi >> file yourself.\n\nAn apply_default_middlewares method is supplied to wrap your application\nin the default middlewares if you want this behaviour and you are providing\nyour own .psgi file.\n\nThis means that the auto-generated (no .psgi file) code looks something\nlike this:\n\n    use strict;\n    use warnings;\n    use TestApp;\n\n    my $app = TestApp->apply_default_middlewares(TestApp->psgi_app(@_));\n\n=head1 SEE ALSO\n\nL<Catalyst::Upgrading>, L<Plack>, L<PSGI::FAQ>, L<PSGI>.\n\n=head1 AUTHORS\n\nCatalyst Contributors, see Catalyst.pm\n\n=head1 COPYRIGHT\n\nThis library is free software. You can redistribute it and/or modify\nit under the same terms as Perl itself.\n\n=cut\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pod/Sample.pod",
    "content": "use strict;\nuse warnings;\npackage DZT::Sample;\n\nsub return_arrayref_of_values_passed {\n  my $invocant = shift;\n  return \\@_;\n}\n\n1;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pod/contents.pod",
    "content": "$Id: contents.pod,v 1.3 2003/05/04 04:05:14 tower Exp $\n\n=begin html\n\n<style = \"text/css\">\ncode { font-family: sans-serif; font-weight:bold; }\n</style>\n\n=end html\n\n=head1 Net::Z3950::AsyncZ\n\n=head2 Intro\n\nNet::Z3950::AsyncZ adds an additional layer of asynchronous support for the Z3950 module through the use\nof multiple forked processes. I hope that users will also find that it provides a convenient\nfront end to C<Net::Z3950>.  My initial idea was to write something that\nwould provide a convenient means of processing and formatting Z39.50 records--which I\ndid, using the C<Z3950> synchronous code.  But I also wanted something that could\nhandle queries to large numbers of servers at one session. Working on this part of my\nproject, I found that I had trouble with the C<Z3950> asynchronous features\nand so ended up with what I have here.\n\n=begin html\n\nI give a more detailed account in the <A href=\"AsyncZ.html#apologia\"><B>DESCRIPTION</b></a>\nsection of <code>AsyncZ.html</code>.\n\n=end html\n\n=pod\n\nI give a more detailed account in in the B<DESCRIPTION> section of C<AsyncZ.pod>.\n\n=cut\n\n=head2 Documentation\n\n=pod\n\n=over 4\n\n=item AsyncZ.pod\n\nThis is the starting point--it gives an overview of the AsyncZ module,\ndescribes the basic mechanics of its asynchronous workings, and details\nthe particulars of the objects and methods.  But see\nL</\"Examples.pod> for detailed explanations of the sample\nscripts which come with the C<Net::Z3950::AsyncZ> distribution.\n\n=item Options.pod\n\nThis document details the various options that can be set to modify\nthe behavior of AsyncZ Index\n\n=item Report.pod\n\nReport.pod deals with how records are treated line by line\nand how you can affect the apearance of a record's line by line output\n\n=item Examples.pod\n\nThis document goes through the sample scripts that come with the\nC<Net::Z3950::AsyncZ> distribution and annotates them\nin a line-by-line fashion.  It's a basic HOW-TO.\n\n=back\n\n=cut\n\n=begin html\n\n<UL>\n<LI>\n <A href=\"AsyncZ.html\">AsyncZ.html</a>\n    \t<br>This is the starting point--it gives an overview of the AsyncZ module,\ndescribes the basic mechanics of its asynchronous workings, and details\nthe particulars of the objects and methods.  But see\n<a href=\"#examples\">Examples</a> for detailed explanations of the sample\nscripts which come with the <code>Net::Z3950::AsyncZ</code> distribution.\n\n<LI>\n <A href=\"Options.html\">Options.html</a>\n\t<br> This document details the various options that can be set to modify\nthe behavior of <code>AsyncZ</code>\n\n<LI>\n <A href=\"Report.html\">Report.html</a>\n        <br><Code>Report.html</code> deals with how records are treated line by line\nand how you can affect the apearance of a record's line by line output\n\n<LI><A name = \"examples\"></a>\n <A href=\"Examples.html\">Examples.html</a>\nThis document goes through the sample scripts that come with the\n<code>Net::Z3950::AsyncZ</code> distribution and annotates them\nin a line-by-line fashion.  It's a basic HOW-TO.\n\n</UL>\n\n=end html\n\n=head2 The Modules\n\n=pod\n\nThere are more modules than there is documentation. The reason for this\nis that the only module you have full and complete access to is\nC<Net::Z3950::AsyncZ>.  The other modules are either internal to C<Net::AsyncZ>\nor accessed indirectly or in part indirectly.\n\n=cut\n\n=for html\nThere are more modules than there is documentation. The reason for this\nis that the only module you have full and complete access to is\n<code>Net::Z3950::AsyncZ</code>.  The other modules are either internal to <code>Net::AsyncZ</code>\nor accessed indirectly or in part indirectly.\n\n=head3  Here are the modules:\n\n=over 4\n\n=item Net::Z3950::AsyncZ\n\nThe main module: direct access --documented in\nC<AsyncZ> and C<Options> documentation\n\n=item Net::Z3950::AsyncZ::ErrMsg\n\nUser error message handling: indirect access  -- documented in\nC<AsyncZ> documentation\n\n=item Net::Z3950::AsyncZ::Errors\n\nError handling for debugging: limited access -- documented in\nC<AsyncZ> documentation\n\n=item Net::Z3950::AsyncZ::Report\n\nModule reponsible for fetching and formatting records: limited access -- documented\n\n=item Net::Z3950::AsyncZ::ZLoop\n\nEvent loop for child processes: no access -- not documented\n\n=item Net::Z3950::AsyncZ::ZSend\n\nConnection details for child processes: no access -- not documented\n\n=item Net::Z3950::AsyncZ::Options::_params\n\nOptions for child processes: direct and indirect access -- documented\nin C<Options> and C<AsyncZ> documentation\n\n=back\n\n=head1 INDEX\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/PogoScript/squashy.pogo",
    "content": "httpism = require 'httpism'\nasync = require 'async'\nresolve = require 'url'.resolve\n\nexports.squash (url) ! =\n    html = httpism.get ! (url).body\n    squash html ! (html, url)\n\nsquash html (html, url, callback) =\n    replacements = sort (links in (html).concat(scripts in (html)))\n    for each @(r) in (replacements) @{ r.url = resolve(url, r.href) }\n    async.map (replacements, get) @(err, requested)\n        callback (err, replace (requested) in (html))    \n\nsort (replacements) =\n    replacements.sort @(a, b) @{ a.index - b.index }\n\nget (replacement) =\n    replacement.body = httpism.get ! (replacement.url).body\n    replacement\n\nreplace (replacements) in (html) =\n    i = 0\n    parts = \"\"\n    for each @(rep) in (replacements)\n        parts := \"#(parts)#(html.substring(i, rep.index))<#(rep.tag)>#(rep.body)</#(rep.tag)>\"\n        i := rep.index + rep.length\n    \n    parts + html.substr(i)\n\nlinks in (html) =\n    link reg = r/<link\\s[^>]*href=[\"']?([^\"']+)[\"'][^\\>]*(\\/\\>|\\>\\s*\\<\\/link\\>)/gi\n    elements in (html) matching (link reg) as 'style'\n\nscripts in (html) =\n    script reg = r/<script\\s[^>]*src=[\"']?([^\"']+)[\"'][^\\>]*(\\/\\>|\\>\\s*\\<\\/script\\>)/gi\n    elements in (html) matching (script reg) as 'script'\n\nelements in (html) matching (reg) as (tag) =\n    elements = []\n    while (m = reg.exec (html))\n        elements.push { tag = tag, index = m.index, length = m.0.length, href = m.1 }\n    \n    elements\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pony/circle.pony",
    "content": "use \"collections\"\n\nclass Circle\n  var _radius: F32\n\n  new create(radius': F32) =>\n    _radius = radius'\n\n  fun ref get_radius(): F32 =>\n    _radius\n\n  fun ref get_area(): F32 =>\n    F32.pi() * _radius.pow(2)\n\n  fun ref get_circumference(): F32 =>\n    2 * _radius * F32.pi()\n\nactor Main\n  new create(env: Env) =>\n\n    for i in Range[F32](1.0, 101.0) do\n      let c = Circle(i)\n\n      var str =\n        \"Radius: \" + c.get_radius().string() + \"\\n\" +\n        \"Circumference: \" + c.get_circumference().string() + \"\\n\" +\n        \"Area: \" + c.get_area().string() + \"\\n\"\n\n      env.out.print(str)\n    end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pony/counter.pony",
    "content": "use \"collections\"\n\nactor Counter\n  var _count: U32\n\n  new create() =>\n    _count = 0\n\n  be increment() =>\n    _count = _count + 1\n\n  be get_and_reset(main: Main) =>\n    main.display(_count)\n    _count = 0\n\nactor Main\n  var _env: Env\n\n  new create(env: Env) =>\n    _env = env\n\n    var count: U32 = try env.args(1).u32() else 10 end\n    var counter = Counter\n\n    for i in Range[U32](0, count) do\n      counter.increment()\n    end\n\n    counter.get_and_reset(this)\n\n  be display(result: U32) =>\n    _env.out.print(result.string())\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pony/gups-opt.pony",
    "content": "use \"options\"\nuse \"time\"\nuse \"collections\"\n\nclass Config\n  var logtable: U64 = 20\n  var iterate: U64 = 10000\n  var logchunk: U64 = 10\n  var logactors: U64 = 2\n\n  fun ref apply(env: Env): Bool =>\n    var options = Options(env)\n\n    options\n      .add(\"logtable\", \"l\", I64Argument)\n      .add(\"iterate\", \"i\", I64Argument)\n      .add(\"chunk\", \"c\", I64Argument)\n      .add(\"actors\", \"a\", I64Argument)\n\n    for option in options do\n      match option\n      | (\"table\", var arg: I64) => logtable = arg.u64()\n      | (\"iterate\", var arg: I64) => iterate = arg.u64()\n      | (\"chunk\", var arg: I64) => logchunk = arg.u64()\n      | (\"actors\", var arg: I64) => logactors = arg.u64()\n      | let err: ParseError =>\n        err.report(env.out)\n        env.out.print(\n          \"\"\"\n          gups_opt [OPTIONS]\n            --table     N   log2 of the total table size. Defaults to 20.\n            --iterate   N   number of iterations. Defaults to 10000.\n            --chunk     N   log2 of the chunk size. Defaults to 10.\n            --actors    N   log2 of the actor count. Defaults to 2.\n          \"\"\"\n          )\n        return false\n      end\n    end\n\n    env.out.print(\n      \"logtable: \" + logtable.string() +\n      \"\\niterate: \" + iterate.string() +\n      \"\\nlogchunk: \" + logchunk.string() +\n      \"\\nlogactors: \" + logactors.string()\n      )\n    true\n\nactor Main\n  let _env: Env\n  let _config: Config = Config\n\n  var _updates: U64 = 0\n  var _confirm: U64 = 0\n  let _start: U64\n  var _actors: Array[Updater] val\n\n  new create(env: Env) =>\n    _env = env\n\n    if _config(env) then\n      let actor_count = 1 << _config.logactors\n      let loglocal = _config.logtable - _config.logactors\n      let chunk_size = 1 << _config.logchunk\n      let chunk_iterate = chunk_size * _config.iterate\n\n      _updates = chunk_iterate * actor_count\n      _confirm = actor_count\n\n      var updaters = recover Array[Updater](actor_count) end\n\n      for i in Range[U64](0, actor_count) do\n        updaters.push(Updater(this, actor_count, i, loglocal, chunk_size,\n          chunk_iterate * i))\n      end\n\n      _actors = consume updaters\n      _start = Time.nanos()\n\n      for a in _actors.values() do\n        a.start(_actors, _config.iterate)\n      end\n    else\n      _start = 0\n      _actors = recover Array[Updater] end\n    end\n\n  be done() =>\n    if (_confirm = _confirm - 1) == 1 then\n      for a in _actors.values() do\n        a.done()\n      end\n    end\n\n  be confirm() =>\n    _confirm = _confirm + 1\n\n    if _confirm == _actors.size() then\n      let elapsed = (Time.nanos() - _start).f64()\n      let gups = _updates.f64() / elapsed\n\n      _env.out.print(\n        \"Time: \" + (elapsed / 1e9).string() +\n        \"\\nGUPS: \" + gups.string()\n        )\n    end\n\nactor Updater\n  let _main: Main\n  let _index: U64\n  let _updaters: U64\n  let _chunk: U64\n  let _mask: U64\n  let _loglocal: U64\n\n  let _output: Array[Array[U64] iso]\n  let _reuse: List[Array[U64] iso] = List[Array[U64] iso]\n  var _others: (Array[Updater] val | None) = None\n  var _table: Array[U64]\n  var _rand: U64\n\n  new create(main:Main, updaters: U64, index: U64, loglocal: U64, chunk: U64,\n    seed: U64)\n  =>\n    _main = main\n    _index = index\n    _updaters = updaters\n    _chunk = chunk\n    _mask = updaters - 1\n    _loglocal = loglocal\n\n    _rand = PolyRand.seed(seed)\n    _output = _output.create(updaters)\n\n    let size = 1 << loglocal\n    _table = Array[U64].undefined(size)\n\n    var offset = index * size\n\n    try\n      for i in Range[U64](0, size) do\n        _table(i) = i + offset\n      end\n    end\n\n  be start(others: Array[Updater] val, iterate: U64) =>\n    _others = others\n    iteration(iterate)\n\n  be apply(iterate: U64) =>\n    iteration(iterate)\n\n  fun ref iteration(iterate: U64) =>\n    let chk = _chunk\n\n    for i in Range(0, _updaters) do\n      _output.push(\n        try\n          _reuse.pop()\n        else\n          recover Array[U64](chk) end\n        end\n        )\n    end\n\n    for i in Range(0, _chunk) do\n      var datum = _rand = PolyRand(_rand)\n      var updater = (datum >> _loglocal) and _mask\n\n      try\n        if updater == _index then\n          _table(i) = _table(i) xor datum\n        else\n          _output(updater).push(datum)\n        end\n      end\n    end\n\n    try\n      let to = _others as Array[Updater] val\n\n      repeat\n        let data = _output.pop()\n\n        if data.size() > 0 then\n          to(_output.size()).receive(consume data)\n        else\n          _reuse.push(consume data)\n        end\n      until _output.size() == 0 end\n    end\n\n    if iterate > 1 then\n      apply(iterate - 1)\n    else\n      _main.done()\n    end\n\n  be receive(data: Array[U64] iso) =>\n    try\n      for i in Range(0, data.size()) do\n        let datum = data(i)\n        var j = (datum >> _loglocal) and _mask\n        _table(j) = _table(j) xor datum\n      end\n\n      data.clear()\n      _reuse.push(consume data)\n    end\n\n  be done() =>\n    _main.confirm()\n\nprimitive PolyRand\n  fun apply(prev: U64): U64 =>\n    (prev << 1) xor if prev.i64() < 0 then _poly() else 0 end\n\n  fun seed(from: U64): U64 =>\n    var n = from % _period()\n\n    if n == 0 then\n      return 1\n    end\n\n    var m2 = Array[U64].undefined(64)\n    var temp = U64(1)\n\n    try\n      for i in Range(0, 64) do\n        m2(i) = temp\n        temp = this(temp)\n        temp = this(temp)\n      end\n    end\n\n    var i: U64 = 64 - n.clz()\n    var r = U64(2)\n\n    try\n      while i > 0 do\n        temp = 0\n\n        for j in Range(0, 64) do\n          if ((r >> j) and 1) != 0 then\n            temp = temp xor m2(j)\n          end\n        end\n\n        r = temp\n        i = i - 1\n\n        if ((n >> i) and 1) != 0 then\n          r = this(r)\n        end\n      end\n    end\n    r\n\n  fun _poly(): U64 => 7\n\n  fun _period(): U64 => 1317624576693539401\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pony/hello-world.pony",
    "content": "actor Main\n  new create(env: Env) =>\n    env.out.print(\"Hello, world.\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pony/mandelbrot.pony",
    "content": "use \"files\"\nuse \"options\"\nuse \"collections\"\n\nactor Worker\n  new mandelbrot(main: Main, x: U64, y: U64, width: U64, iterations: U64,\n    limit: F32, real: Array[F32] val, imaginary: Array[F32] val)\n  =>\n    var view: Array[U8] iso =\n      recover\n        Array[U8]((y - x) * (width >> 3))\n      end\n\n    let group_r = Array[F32].undefined(8)\n    let group_i = Array[F32].undefined(8)\n\n    var row = x\n\n    try\n      while row < y do\n        let prefetch_i = imaginary(row)\n\n        var col: U64 = 0\n\n        while col < width do\n          var j: U64 = 0\n\n          while j < 8 do\n            group_r.update(j, real(col + j))\n            group_i.update(j, prefetch_i)\n            j = j + 1\n          end\n\n          var bitmap: U8 = 0xFF\n          var n = iterations\n\n          repeat\n            var mask: U8 = 0x80\n            var k: U64 = 0\n\n            while k < 8 do\n              let r = group_r(k)\n              let i = group_i(k)\n\n              group_r.update(k, ((r * r) - (i * i)) + real(col + k))\n              group_i.update(k, (2.0 * r * i) + prefetch_i)\n\n              if ((r * r) + (i * i)) > limit then\n                bitmap = bitmap and not mask\n              end\n\n              mask = mask >> 1\n              k = k + 1\n            end\n          until (bitmap == 0) or ((n = n - 1) == 1) end\n\n          view.push(bitmap)\n\n          col = col + 8\n        end\n        row = row + 1\n      end\n\n      main.draw(x * (width >> 3), consume view)\n    end\n\nactor Main\n  var iterations: U64 = 50\n  var limit: F32 = 4.0\n  var chunks: U64 = 16\n  var width: U64 = 16000\n  var actors: U64 = 0\n  var header: U64 = 0\n  var real: Array[F32] val = recover Array[F32] end\n  var imaginary: Array[F32] val = recover Array[F32] end\n  var outfile: (File | None) = None\n\n  new create(env: Env) =>\n    try\n      arguments(env)\n\n      let length = width\n      let recip_width = 2.0 / width.f32()\n\n      var r = recover Array[F32](length) end\n      var i = recover Array[F32](length) end\n\n      for j in Range(0, width) do\n        r.push((recip_width * j.f32()) - 1.5)\n        i.push((recip_width * j.f32()) - 1.0)\n      end\n\n      real = consume r\n      imaginary = consume i\n\n      spawn_actors()\n      create_outfile()\n    end\n\n  be draw(offset: U64, pixels: Array[U8] val) =>\n    match outfile\n    | var out: File =>\n      out.seek_start(header + offset)\n      out.write(pixels)\n      if (actors = actors - 1) == 1 then\n        out.dispose()\n      end\n    end\n\n  fun ref create_outfile() =>\n    match outfile\n    | var f: File =>\n      f.print(\"P4\\n \" + width.string() + \" \" + width.string() + \"\\n\")\n      header = f.size()\n      f.set_length((width * (width >> 3)) + header)\n    end\n\n  fun ref spawn_actors() =>\n    actors = ((width + (chunks - 1)) / chunks)\n\n    var rest = width % chunks\n\n    if rest == 0 then rest = chunks end\n\n    var x: U64 = 0\n    var y: U64 = 0\n\n    for i in Range(0, actors - 1) do\n      x = i * chunks\n      y = x + chunks\n      Worker.mandelbrot(this, x, y, width, iterations, limit, real, imaginary)\n    end\n\n    Worker.mandelbrot(this, y, y + rest, width, iterations, limit, real,\n      imaginary)\n\n  fun ref arguments(env: Env) ? =>\n    let options = Options(env)\n\n    options\n      .add(\"iterations\", \"i\", I64Argument)\n      .add(\"limit\", \"l\", F64Argument)\n      .add(\"chunks\", \"c\", I64Argument)\n      .add(\"width\", \"w\", I64Argument)\n      .add(\"output\", \"o\", StringArgument)\n\n    for option in options do\n      match option\n      | (\"iterations\", var arg: I64) => iterations = arg.u64()\n      | (\"limit\", var arg: F64) => limit = arg.f32()\n      | (\"chunks\", var arg: I64) => chunks = arg.u64()\n      | (\"width\", var arg: I64) => width = arg.u64()\n      | (\"output\", var arg: String) =>\n        outfile = try File(FilePath(env.root, arg)) end\n      | let err: ParseError => err.report(env.out) ; usage(env) ; error\n      end\n    end\n\n  fun tag usage(env: Env) =>\n    env.out.print(\n      \"\"\"\n      mandelbrot [OPTIONS]\n\n      The binary output can be converted to a BMP with the following command\n      (ImageMagick Tools required):\n\n        convert <output> JPEG:<output>.jpg\n\n      Available options:\n\n      --iterations, -i  Maximum amount of iterations to be done for each pixel.\n                        Defaults to 50.\n\n      --limit, -l       Square of the limit that pixels need to exceed in order\n                        to escape from the Mandelbrot set.\n                        Defaults to 4.0.\n\n      --chunks, -c      Maximum line count of chunks the image should be\n                        divided into for divide & conquer processing.\n                        Defaults to 16.\n\n      --width, -w       Lateral length of the resulting mandelbrot image.\n                        Defaults to 16000.\n\n      --output, -o      File to write the output to.\n\n      \"\"\"\n      )\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pony/mixed.pony",
    "content": "use \"collections\"\n\nactor Worker\n  var _env: Env\n\n  new create(env: Env) =>\n    _env = env\n\n    var a: U64 = 86028157\n    var b: U64 = 329545133\n\n    var result = factorize(a*b)\n\n    var correct =\n      try\n        (result.size() == 2) and\n          (result(0) == 86028157) and\n          (result(1) == 329545133)\n      else\n        false\n      end\n\n  fun ref factorize(bigint: U64) : Array[U64] =>\n    var factors = Array[U64](2)\n\n    if bigint <= 3 then\n      factors.push(bigint)\n    else\n      var d: U64 = 2\n      var i: U64 = 0\n      var n = bigint\n\n      while d < n do\n        if (n % d) == 0 then\n          i = i + 1\n          factors.push(d)\n          n = n / d\n        else\n          d = if d == 2 then 3 else (d + 2) end\n        end\n      end\n\n      factors.push(d)\n    end\n\n    factors\n\nactor Ring\n  var _env: Env\n  var _size: U32\n  var _pass: U32\n  var _repetitions: U32\n  var _next: Ring\n\n  new create(env: Env, size: U32, pass: U32, repetitions: U32) =>\n    _env = env\n    _size = size\n    _pass = pass\n    _repetitions = repetitions\n    _next = spawn_ring(_env, _size, _pass)\n    run()\n\n  new neighbor(env: Env, next: Ring) =>\n    _env = env\n    _next = next\n    _size = 0\n    _pass = 0\n    _repetitions = 0\n\n  be apply(i: U32) =>\n    if i > 0 then\n      _next(i - 1)\n    else\n      run()\n    end\n\n  fun ref run() =>\n    if _repetitions > 0 then\n      _repetitions = _repetitions - 1\n      _next(_pass * _size)\n      Worker(_env)\n    end\n\n  fun tag spawn_ring(env: Env, size: U32, pass': U32) : Ring =>\n    var next: Ring = this\n\n    for i in Range[U32](0, size) do\n      next = Ring.neighbor(env, next)\n    end\n\n    next\n\nactor Main\n  var _size: U32 = 50\n  var _count: U32 = 20\n  var _pass: U32 = 10000\n  var _repetitions: U32 = 5\n  var _env: Env\n\n  new create(env: Env) =>\n    _env = env\n\n    try\n      arguments()\n      start_benchmark()\n    else\n      usage()\n    end\n\n  fun ref arguments() ? =>\n    _count = _env.args(1).u32()\n    _size = _env.args(2).u32()\n    _pass = _env.args(3).u32()\n    _repetitions = _env.args(4).u32()\n    \n  fun ref start_benchmark() =>\n    for i in Range[U32](0, _count) do\n      Ring(_env, _size, _pass, _repetitions)\n    end\n\n  fun ref usage() =>\n    _env.out.print(\n      \"\"\"\n      mixed OPTIONS\n        N   number of actors in each ring\"\n        N   number of rings\"\n        N   number of messages to pass around each ring\"\n        N   number of times to repeat\"\n      \"\"\"\n      )\n"
  },
  {
    "path": "src/test/resources/samples/langs/PostCSS/sample.pcss",
    "content": "@define-mixin size $size {\n  width: $size;\n}\n\n$big: 100px;\n\n/* Main block */\n.block {\n  &_logo {\n    background: inline(\"./logo.png\");\n    @mixin size $big;\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PostScript/lambda.pfa",
    "content": "%!PS-AdobeFont-1.0: Greek_Lambda_Character-Regular 020.017\n%%Title: Greek_Lambda_Character-Regular\n%Version: 020.017\n%%CreationDate: Sun Jul 23 23:14:02 2017\n%%Creator: John Gardner /ThatGuyLinguistWatchersAreSickOf\n%Copyright: NONE. NADA. PUBLIC DOMAIN, BOI\n% Generated by FontForge 20170719 (http://fontforge.sf.net/)\n%%EndComments\n\n10 dict begin\n/FontType 1 def\n/FontMatrix [0.000488281 0 0 0.000488281 0 0 ]readonly def\n/FontName /Greek_Lambda_Character-Regular def\n/FontBBox {68 -362 1158 1556 }readonly def\n/PaintType 0 def\n/FontInfo 11 dict dup begin\n /version (020.017) readonly def\n /Notice (NONE. NADA. PUBLIC DOMAIN, BOI) readonly def\n /FullName (Greek_Lambda_Character Regular) readonly def\n /FamilyName (Greek_Lambda_Character) readonly def\n /Weight (Regular) readonly def\n /FSType 8 def\n /ItalicAngle 0 def\n /isFixedPitch false def\n /UnderlinePosition -175 def\n /UnderlineThickness 90 def\n /ascent 1556 def\nend readonly def\n/Encoding 256 array\n 0 1 255 { 1 index exch /.notdef put} for\ndup 13/uni000D put\ndup 32/space put\nreadonly def\ncurrentdict end\ncurrentfile eexec\n743F8413F3636CA85A9FFEFB50B4BB27302A5F6C876586CCC1670A7EF5521E6ADE15AAB4\nDD2DDDB83735311FC63DB80D2C96AECFA05BB67F865EA35934B4B79A203A8DD489B09C79\nFF6EB9DBCFD889C3E73F8C94BC342AF671D6F688870A62EE1A0DF216E150FFEC64A8C2B7\n509AD05C011599C1AD84E6C4B668E07EA219BD72663D8AF4CA8EC8E23AA90DE90BE940C6\n6DB849CEDB3B64961365A7CCE47F4FC9E30FDEE4B14B90C2E0D8C344EBC974EABF417B3D\n28251A78ACEE2BFC4212B1E3E9C7EBC3262821EE98E538713C64DF0BC13C19337B1307DE\n427F2C8C4FF2126B9FF99DDDFB332AF3EBCD23349171C5C7E66B1C53EF39C35516C0DC7D\nD6F70D59C28603519559B710C0128C22BA268D330AE02690534939E5B58BAAB00A59B0E6\nE515E80A04F2B315A00FB1CA49A4B0259167BBA9852544092955FE0883DBCD89B739AA94\n8C6277B54019E9870B44E5A998F0F2175545F602CC4630E4BE01E35F4CEFDD7D1B737358\n1B2D6F612B23AFAF221AB18CD868E7548EE5064762971F8868940F26134CA7BB40734220\n06EEBE10B5F5251FE36B0E794D8B0D7AC814F4C30BB5A0435C203748B40217BEAF506328\nD30E9417382B228FF6DF97A71135B613CC3EF4CDD8276711842C3DB0D31A25883544FFF5\nD8719874AD10816F3EB272D5C245440127B9F2967DC46EAF4BED77FF2C2585A355EB586E\n09BE8BA3D104EA174EA004DCE00066F7606EEF55376E332566235B8F4283D63E2AE5F2E3\n6A6940BED4FA83C6E82C444B2D790BAA36E641908C61F6409CA09D9723B2F169BE42B166\n5E704AA69D594B2A22C631D030029B772C3C200A0A483A13403E2EF19274B73860FFEA37\n521C65865A79A5429EED01C0F95AB6F66F030BF14CCB42A6DA2435B74135BB5D35EF6DC6\nFE48D29690417795B9D7AA2A3D66B7A175F8B6C23AFB5A472343C2DFDCC242C27033DD6F\nB65B1CD5DC29B9DA455FAAC3A9408BB9B61C2B701741C34CE88EBFF05B7045CBEAC8788E\n548F0E642277D4F9AED30A3431070805910970243FD069130D641AFAE28754B1355618B8\n706D163027980F2A76A59E0B9D2FB92BF17943129A8A6FB15CBF6D376C464329E24A118B\n8E38987CDD4CD5F214B26D65BEEDB2ECD7502861747089298A653654062A3AD5AC4FC4AF\n5DEF7BDD4C5CDBC828A1F12235F68522B45BE0C2D6FB663B51E76BF559815F41C25EC7F8\n17A92B9E139F3E6D27A8512A261EE576459DE603F386516E46B8326574E900101A8D49C9\nE8798E734F56C4E2D78B14D6B14E96F3523F3F34464235C96F94609852F90A0A1B51CE14\n25EC76E65E5D1C5D2EEC730FC438F4083A806C67D0A1566D0E6EF70DC38E64DCA44DFA66\n20073E848BDFDB2B793AFE29B47917D87CB8320F48A7C083CAAD2CA20C25D705D78B33D5\nA5EAB8C671A57BBC3C896DE54C71B8F860B640B7C30199A2443353E3727FA99C168DB4E8\nABE021B7DDB526E30B2075028BD8D387D32E025E458D05E3A25B9BC94ED54F7A0FCA3D61\n604D2F49A205CBDF5FBDD5D3E1D31C6F7310CC155982689FA1F5723DDAE2EDEB5E69F03C\n4CCDBBCB348E57AF222744A07DCCE69236EB29499A87C0A201EDD6A402EA23C035732184\n339049E8C101388304CD20EAA8554A9B6E4F2B126A0593F4401992E73F7BFEF89DE3DFDE\nDA548E3EE05D5B4EE0D114F916\n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000\ncleartomark\n"
  },
  {
    "path": "src/test/resources/samples/langs/PostScript/sierpinski.ps",
    "content": "%!PS-Adobe-3.0\n%%Creator: Aaron Puchert\n%%Title: The Sierpinski triangle\n%%Pages: 1\n%%PageOrder: Ascend\n\n%%BeginProlog\n% PAGE SETTINGS\n/pageset {\n  28.3464566 28.3464566 scale    % set cm = 1\n  0.5 0.5 translate\n  0 setlinewidth\n} def\n\n% sierpinski(n) draws a sierpinski triangle of order n\n/sierpinski {\ndup 0 gt {\n  [0.5 0 0 0.5 0 0] concat dup 1 sub sierpinski\n  [1 0 0 1 1 0] concat dup 1 sub sierpinski\n  [1 0 0 1 -1 1] concat dup 1 sub sierpinski\n  [2 0 0 2 0 -1] concat\n} {\n  newpath\n    0 0 moveto\n    1 0 lineto\n    0 1 lineto\n  closepath\n  fill\n} ifelse pop} def\n%%EndProlog\n\n%%BeginSetup\n<< /PageSize [596 843] >> setpagedevice  % A4\n%%EndSetup\n\n%%Page: Test 1\npageset\n[20 0 10 300 sqrt 0 0] concat\n9 sierpinski\nshowpage\n%%EOF\n"
  },
  {
    "path": "src/test/resources/samples/langs/PowerBuilder/TestPBT.pbt",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 dario ureña\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n// Source: https://github.com/darioaxel/PowerScriptToKDMTransformer/blob/c7f167b4852c75d3da2f7b024bda7d7dda241a00/resources/advanced/real/myproject/myproject.pbt\n\nSave Format v3.0(19990112)\n@begin Libraries\n \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\" \"\";\n@end;\n@begin Objects\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_mant_apbe.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_mant_envio.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_inp_bolsa.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_mant_imput.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_inp_conce.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_mant_rete.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_info_noti.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_mant_concsani.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_mant_expe.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_proc_expe.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_mant_soli.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n \"Scs\\\\Lib\\\\ScsApex1\\\\m_proc_soli.srm\" \"Scs\\\\Lib\\\\ScsApex1\\\\ScsApex1.pbl\";\n@end;"
  },
  {
    "path": "src/test/resources/samples/langs/PowerBuilder/ginpix7.sra",
    "content": "// The MIT License (MIT)\r\n\r\n// Copyright (c) 2016 dario ureña\r\n\r\n// Permission is hereby granted, free of charge, to any person obtaining a copy\r\n// of this software and associated documentation files (the \"Software\"), to deal\r\n// in the Software without restriction, including without limitation the rights\r\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n// copies of the Software, and to permit persons to whom the Software is\r\n// furnished to do so, subject to the following conditions:\r\n\r\n// The above copyright notice and this permission notice shall be included in all\r\n// copies or substantial portions of the Software.\r\n\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n// SOFTWARE.\r\n\r\n// Source: https://github.com/darioaxel/PowerScriptToKDMTransformer/blob/07bf527194b73e133943221dc2199a9442d463eb/resources/inventoryModel/nivel0/ginpix7.sra\r\n\r\nHA$PBExportHeader$ginpix7.sra\r\n$PBExportComments$Aplicaci$$HEX1$$f300$$ENDHEX$$n Ginpix7\r\nforward\r\nglobal type ginpix7 from application\r\nend type\r\nglobal n_tr_apli sqlca\r\nglobal dynamicdescriptionarea sqlda\r\nglobal dynamicstagingarea sqlsa\r\nglobal error error\r\nglobal message message\r\nend forward\r\n\r\nglobal variables\r\nn_appmanager  gnv_app\r\n//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\r\n// Satxa - 02-Jun-2009.27760 No tenemos constancia del uso de esta ayuda, asi que la eliminamos.\r\n//n_help     gn_help\r\n//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\r\n//----------------------------------------------------------\r\n// Satxa - 17-Jun-2010.42351 No se usa.\r\n//n_help2  gn_help2\r\n//----------------------------------------------------------\r\n\r\n//-----------------------------------------------------------------------------------------------------------------------------------------------------------\r\n// Satxa - 15-Jun-2009.27760\r\n//Para el modulo de contratos.\r\nString\tgs_enlacemacros, gs_office2000 // Posibles de Pulir.(en estudio).\r\n//-----------------------------------------------------------------------------------------------------------------------------------------------------------\r\nend variables\r\nglobal type ginpix7 from application\r\nstring appname = \"ginpix7\"\r\nstring toolbarframetitle = \"ginpix7\"\r\nboolean toolbarusercontrol = false\r\nend type\r\nglobal ginpix7 ginpix7\r\n\r\ntype prototypes\r\n//------------------------------------------------------------------------------------------------------------------------------------------------------\r\n// Satxa - 15-Jun-2009.27760 Copio la llamada a la API del objeto aplicaci$$HEX1$$f300$$ENDHEX$$n de LCS.\r\n// Satxa - 25-Oct-2005.25577 Viene de LCS y RCS, abre un archivo independientemente del tipo ejecutando el programa asociado en WINDOWS\r\nPublic Function long ShellExecuteA(long hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, long nShowCmd) Library \"SHELL32.DLL\" alias for \"ShellExecuteA;Ansi\"\r\n//------------------------------------------------------------------------------------------------------------------------------------------------------\r\n\r\n//\r\n// Fernando Baldellou.14/05/2009. Ginpix7.// Funciones Externas Globales para el Proyecto de Mensajer$$HEX1$$ed00$$ENDHEX$$a.\r\n//\r\nPublic Function Long GetWindowRect (Long hWnd, Ref mensajeria lpRect) Library \"user32\" alias for \"GetWindowRect;Ansi\"\r\nPublic Function Long GetClientRect (Long hWnd, Ref mensajeria lpRect) Library \"user32\" alias for \"GetClientRect;Ansi\"\r\nPublic Function Long SetWindowPos (Long hWnd, Long hWndInsertAfter, Long x, Long y, Long cx, Long cy, Long wFlags) Library \"user32\"\r\nPublic Function Boolean sndPlaySoundA (String SoundName, uint Flags)Library \"winmm.dll\" alias for \"sndPlaySoundA;Ansi\" \r\n// Fin de la anotaci$$HEX1$$f300$$ENDHEX$$n anterior.\r\n\r\n\r\nend prototypes\r\n\r\ntype variables\r\n\r\nend variables\r\n\r\non ginpix7.create\r\nappname=\"ginpix7\"\r\nmessage=create message\r\nsqlca=create n_tr_apli\r\nsqlda=create dynamicdescriptionarea\r\nsqlsa=create dynamicstagingarea\r\nerror=create error\r\nend on\r\n\r\non ginpix7.destroy\r\ndestroy(sqlca)\r\ndestroy(sqlda)\r\ndestroy(sqlsa)\r\ndestroy(error)\r\ndestroy(message)\r\nend on\r\n\r\nevent open;// Inicializa propiedades del objeto aplicaci$$HEX1$$f300$$ENDHEX$$n:\r\nThis.MicroHelpDefault = \"SAVIA\"\t\t\r\n\r\n//----------------------------------------------------------\r\n// Satxa - 17-Jun-2010.42351 No se usa.\r\n// Crea el servicio de ayuda nivel2:\r\n//IF NOT IsValid(gn_help2) THEN\r\n//   gn_help2 = CREATE n_help2\r\n//END IF\r\n//----------------------------------------------------------\r\n\r\n// Presenta la aplicaci$$HEX1$$f300$$ENDHEX$$n:\r\nOpenWithParm(w_ini_ginpix7,commandline)\r\n//OpenWithParm(w_logontab,commandline)\r\n\r\n\r\n// PORQU$$HEX2$$c9002000$$ENDHEX$$RETRASAMOS LA INSTANCIACI$$HEX1$$d300$$ENDHEX$$N DEL MANEJADOR DE LA APLICACI$$HEX1$$d300$$ENDHEX$$N \"n_appmanager\" ???\r\n//\r\n// El CNVUO n_appmanager conlleva consigo el proceso de apertura de la ventana w_logon de\r\n// conexi$$HEX1$$f300$$ENDHEX$$n a la base de datos. Nosotros sin embargo, deseamos presentar previamente \r\n// nuestra ventana de presentaci$$HEX1$$f300$$ENDHEX$$n \"w_ini\".\r\n//\r\n// Si instanciamos n_appmanager aqu$$HEX1$$ed00$$ENDHEX$$, abre \"w_ini\" pero pasa de largo y no se \"queda\" en la\r\n// ventana esperando que pulsemos <CONTINUAR> o bien <SALIR>, ll$$HEX1$$e900$$ENDHEX$$ndose directamente a la \r\n// apertura de \"w_logon\" y requirimientos de datos para la conexi$$HEX1$$f300$$ENDHEX$$n a la base de datos.\r\n//\r\n// Por eso instanciamos el CNVUO n_appmanager en el evento w_ini::cb_ini_con::clicked, para\r\n// retrasar este proceso de conexi$$HEX1$$f300$$ENDHEX$$n a base de datos.\r\n//\r\n//gnv_app = CREATE n_appmanager\r\n//gnv_app.Event pfc_Open(commandline)\r\n\r\n\r\nend event\r\n\r\nevent close;//----------------------------------------------------------\r\n// Satxa - 17-Jun-2010.42351 No se usa.\r\n// Destruye el servicio de ayuda nivel2:\r\n//IF IsValid(gn_help2) THEN\r\n//   DESTROY n_help2\r\n//END IF\r\n//----------------------------------------------------------\r\n\r\n// Destruye el manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:\r\nIF IsValid(gnv_app) THEN\r\n   DESTROY gnv_app\r\nEND IF\r\n\r\n// Redirige el evento al manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:\r\nIF IsValid(gnv_app) THEN\r\n   gnv_app.Event pfc_Close()\r\nEND IF\r\n\r\nend event\r\n\r\nevent connectionbegin;// Redirige el evento al manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:\r\nRETURN gnv_app.Event pfc_ConnectionBegin(userid,password,connectstring)\r\n\r\nend event\r\n\r\nevent connectionend;// Redirige el evento al manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:\r\ngnv_app.Event pfc_ConnectionEnd()\r\n\r\n\r\nend event\r\n\r\nevent idle;// Redirige el evento al manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:\r\ngnv_app.Event pfc_Idle()\r\nend event\r\n\r\nevent systemerror;// Redirige el evento al manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:\r\ngnv_app.Event pfc_SystemError()\r\nend event\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/PowerBuilder/myproject.pbt",
    "content": "// The MIT License (MIT)\r\n\r\n// Copyright (c) 2016 dario ureña\r\n\r\n// Permission is hereby granted, free of charge, to any person obtaining a copy\r\n// of this software and associated documentation files (the \"Software\"), to deal\r\n// in the Software without restriction, including without limitation the rights\r\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n// copies of the Software, and to permit persons to whom the Software is\r\n// furnished to do so, subject to the following conditions:\r\n\r\n// The above copyright notice and this permission notice shall be included in all\r\n// copies or substantial portions of the Software.\r\n\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n// SOFTWARE.\r\n\r\n// Source: https://github.com/darioaxel/PowerScriptToKDMTransformer/blob/173c3949d5684150c34f7405f0689310eade0362/resources/basics/TestPBT.pbt\r\n\r\nSave Format v3.0(19990112)\r\n@begin Projects\r\n 0 \"myproject\\\\myprojectlib.pbl\";\r\n@end;\r\nappname \"myproject\";\r\napplib \"myproject\\\\myproject.pbl\";\r\nLibList \"myproject\\\\myproject.pbl;myproject\\\\lib\\\\logger\\\\logger.pbl;myproject\\\\lib\\\\payroll\\\\payroll.pbl;myproject\\\\lib\\\\contract\\\\contract.pbl;myproject\\\\lib\\\\common\\\\common.pbl;\";\r\ntype \"pb\";"
  },
  {
    "path": "src/test/resources/samples/langs/PowerBuilder/n_cst_buttonlistbar_gradient.sru",
    "content": "// The MIT License (MIT)\r\n\r\n// Copyright (c) 2016 dario ureña\r\n\r\n// Permission is hereby granted, free of charge, to any person obtaining a copy\r\n// of this software and associated documentation files (the \"Software\"), to deal\r\n// in the Software without restriction, including without limitation the rights\r\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n// copies of the Software, and to permit persons to whom the Software is\r\n// furnished to do so, subject to the following conditions:\r\n\r\n// The above copyright notice and this permission notice shall be included in all\r\n// copies or substantial portions of the Software.\r\n\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n// SOFTWARE.\r\n\r\n// Source: https://github.com/darioaxel/PowerScriptToKDMTransformer/blob/07bf527194b73e133943221dc2199a9442d463eb/resources/inventoryModel/nivel0/nivel1/n_cst_buttonlistbar_gradient.sru\r\n\r\nHA$PBExportHeader$n_cst_buttonlistbar_gradient.sru\r\nforward\r\nglobal type n_cst_buttonlistbar_gradient from nonvisualobject\r\nend type\r\ntype gradient_rect from structure within n_cst_buttonlistbar_gradient\r\nend type\r\ntype gradient_triangle from structure within n_cst_buttonlistbar_gradient\r\nend type\r\ntype rect from structure within n_cst_buttonlistbar_gradient\r\nend type\r\ntype trivertex from structure within n_cst_buttonlistbar_gradient\r\nend type\r\ntype logfont from structure within n_cst_buttonlistbar_gradient\r\nend type\r\nend forward\r\n\r\ntype gradient_rect from structure\r\n\tunsignedlong\t\tupperleft\r\n\tunsignedlong\t\tlowerright\r\nend type\r\n\r\ntype gradient_triangle from structure\r\n\tunsignedlong\t\tvertex1\r\n\tunsignedlong\t\tvertex2\r\n\tunsignedlong\t\tvertex3\r\nend type\r\n\r\ntype rect from structure\r\n\tlong\t\tleft\r\n\tlong\t\ttop\r\n\tlong\t\tright\r\n\tlong\t\tbottom\r\nend type\r\n\r\ntype trivertex from structure\r\n\tlong\t\tx\r\n\tlong\t\ty\r\n\tinteger\t\tred\r\n\tinteger\t\tgreen\r\n\tinteger\t\tblue\r\n\tinteger\t\talpha\r\nend type\r\n\r\ntype logfont from structure\r\n\tlong\t\tlfheight\r\n\tlong\t\tlfwidth\r\n\tlong\t\tlfescapement\r\n\tlong\t\tlforientation\r\n\tlong\t\tlfweight\r\n\tcharacter\t\tlfitalic\r\n\tcharacter\t\tlfunderline\r\n\tcharacter\t\tlfstrikeout\r\n\tcharacter\t\tlfcharset\r\n\tcharacter\t\tlfoutprecision\r\n\tcharacter\t\tlfclipprecision\r\n\tcharacter\t\tlfquality\r\n\tcharacter\t\tlfpitchandfamily\r\n\tcharacter\t\tlffacename[32]\r\nend type\r\n\r\nglobal type n_cst_buttonlistbar_gradient from nonvisualobject autoinstantiate\r\nend type\r\n\r\ntype prototypes\r\nFUNCTION ulong SetBkMode(ulong lhdc,ulong nBkMode) LIBRARY \"gdi32.dll\"\r\nFunction Long GetDC (Long hwnd) Library 'user32'\r\nFunction Long GetClientRect (Long hwnd, REF RECT lpRect) Library 'user32' alias for \"GetClientRect;Ansi\"\r\nFunction Long ReleaseDC (Long hwnd, Long hdc1) Library 'user32'\r\nFunction Boolean GradientRectangle (Long hdc2, TRIVERTEX pVert[], ULong numVert, GRADIENT_RECT pMesh [], ULong numMesh, ULong dMode) Library 'msimg32' Alias For 'GradientFill;Ansi'\r\nFunction Boolean GradientTriangle (Long hdc3, TRIVERTEX pVert[], ULong numVert, GRADIENT_TRIANGLE pMesh [], ULong numMesh, ULong dMode) Library 'msimg32' Alias For 'GradientFill;Ansi'\r\n\r\nFunction ulong Rectangle (ulong hwnd, ulong X1, ulong Y1, ulong X2, ulong Y2) library \"gdi32\" \r\nFunction ulong CreatePen  (ulong nPenStyle, ulong nWidth, ulong crColor) LIBRARY \"Gdi32.dll\"\r\nFunction ULONG\tSelectObject (uLong hdc4, uLong hObject ) LIBRARY \"Gdi32.dll\"\r\nfunction boolean DeleteObject(ulong hgdiobject) library \"gdi32.dll\" \r\n\r\nFUNCTION ulong DrawText(ulong lhdc,ref string lpStr,ulong nCount,ref RECT lpRect,ulong wFormat) LIBRARY \"user32.dll\" ALIAS FOR \"DrawTextA;Ansi\"\r\nFUNCTION ulong SetTextColor(ulong lhdc,ulong crColor) LIBRARY \"gdi32.dll\"\r\nFUNCTION ulong CreateFontIndirect(ref LOGFONT lpLogFont) LIBRARY \"gdi32.dll\" ALIAS FOR \"CreateFontIndirectA;ANSI\"\r\n\r\nFunction ulong RoundRect (uLong hdc5 , uLong X1, ulong Y1 , ulong X2 , ulong Y2 , ulong X3 , ulong Y3 ) LIBRARY \"Gdi32.dll\"\r\nFunction ULONG FillRgn (Long hdc6, Long hRgn , Long hBrush ) LIBRARY \"Gdi32.dll\"\r\nFunction ulong CreateRectRgn (Long X1, Long Y1 , Long X2 , Long Y2 ) LIBRARY \"Gdi32.dll\"\r\nFunction ulong CreateRoundRectRgn (long X1 , long Y1 , long X2 , long Y2 , long X3 , long Y3 ) LIBRARY \"Gdi32.dll\"\r\n\r\nFunction ULONG PolyBezier (Long hdc7, REF RECT lpRect, long cPoints ) LIBRARY \"Gdi32.dll\"\r\nFunction ULONG Polyline( Long hdc8, GRADIENT_RECT lppt[], int cPoints) LIBRARY \"Gdi32.dll\"\r\n\r\nFUNCTION boolean Ellipse(ulong hwnd,long x1,long y1,long x2,long y2) LIBRARY \"Gdi32.dll\"\r\n\r\nFUNCTION ulong CreatePolygonRgn(ref POINT ppoint[], int count, int fillMode) Library \"GDI32.DLL\"\r\nFUNCTION long SelectClipRgn(ulong lhdc, ulong lhrgn) Library \"GDI32.DLL\"\r\n\r\nFUNCTION long PtInRegion(ulong hrgn, int x, int y) LIBRARY \"GDI32.dll\"\r\n\r\nFunction boolean ImageList_Draw(long himl, long i, long hdcDst, long lx, long ly, ulong fStyle) Library \"comctl32.dll\"\r\nFunction boolean ImageList_DrawEx(long himl, long i, long hdcDst, long lx, long ly, long lwidth, long lheight, long lback, long lfore , ulong fStyle) Library \"comctl32.dll\"\r\n\r\nend prototypes\r\n\r\ntype variables\r\n// MS Windows enumerations\r\nCONSTANT ULong GRADIENT_FILL_RECT_H = 0\r\nCONSTANT ULong GRADIENT_FILL_RECT_V = 1\r\nCONSTANT ULong GRADIENT_FILL_TRIANGLE = 2\r\nCONSTANT ULong GRADIENT_FILL_OP_FLAG = 255\r\n\r\nCONSTANT Long ILD_TRANSPARENT = 1\r\nCONSTANT Long LVM_GETIMAGELIST = 4098\r\nCONSTANT Long LVSIL_NORMAL = 0\r\nCONSTANT Long ILD_BLEND50 = 4\r\nCONSTANT Long ILD_BLEND25 = 2\r\n\r\n// User object enumerations\r\nCONSTANT String TOPLEFT = \"TOPLEFT\"\r\nCONSTANT String TOPRIGHT = \"TOPRIGHT\"\r\nCONSTANT String BOTTOMRIGHT = \"BOTTOMRIGHT\"\r\nCONSTANT String BOTTOMLEFT = \"BOTTOMLEFT\"\r\n\r\nBOOLEAN\tib_displayborder\r\n\r\nCONSTANT LONG ALIGN_LEFT = 0\r\nCONSTANT LONG ALIGN_CENTER = 1\r\nCONSTANT LONG ALIGN_RIGHT = 2\r\n\r\nCONSTANT LONG DT_WORD_ELLIPSIS = 262144\r\nCONSTANT LONG DT_CALCRECT = 1024\r\nCONSTANT LONG DT_WORDBREAK = 16\r\n\r\nLong\til_HDC\r\n\r\nLong il_newHeight\r\nLong il_newWidth\r\n\r\nPRIVATE:\r\n// Object Handle\r\nLong\tHDC\r\n\r\nLong\til_ShadowBackColor\r\n\r\nULong iul_font\r\nULong iul_fontbold\r\n\r\n// Dimensions\r\nRECT DC_Rect\r\n\r\n// Vertices\r\nTRIVERTEX Corner[4]\r\nTRIVERTEX BorderCorner[2]\r\nTRIVERTEX VistaCorner1[4]\r\nTRIVERTEX VistaCorner2[4]\r\nTRIVERTEX VistaCorner3[4]\r\nend variables\r\n\r\nforward prototypes\r\npublic subroutine of_verticalgradient (long al_color1, long al_color2)\r\npublic subroutine of_splitrgb (long al_color, ref long red, ref long green, ref long blue)\r\npublic function boolean of_setdevicecontext (graphicobject ado_palette)\r\npublic subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette)\r\npublic subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor, integer ai_style)\r\npublic subroutine of_xpgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor)\r\npublic function boolean of_setdevicecontext (graphicobject ado_palette, integer ai_style, boolean ab_border)\r\npublic function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow)\r\npublic function integer of_sethdc (long al_hdc)\r\npublic function boolean of_getbit (long al_decimal, integer ai_bit)\r\npublic function unsignedlong of_createfont (string as_name, long al_size, boolean ab_underline)\r\npublic function long of_bitwiseand (long al_value1, long al_value2)\r\npublic function long of_bitwiseor (long al_value1, long al_value2)\r\npublic function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow, boolean ab_elipse, boolean ab_underline, boolean ab_wordwrap)\r\npublic function integer of_drawbuttons (dragobject ado_palette, buttons ast_buttons[], long al_bordercolor, long al_imagelist, boolean ab_boldselected, long il_imagesize, long al_height)\r\npublic subroutine of_verticalgradient (long al_color1, long al_color2)\r\npublic subroutine of_splitrgb (long al_color, ref long red, ref long green, ref long blue)\r\npublic function boolean of_setdevicecontext (graphicobject ado_palette)\r\npublic subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette)\r\npublic subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor, integer ai_style)\r\npublic subroutine of_xpgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor)\r\npublic function boolean of_setdevicecontext (graphicobject ado_palette, integer ai_style, boolean ab_border)\r\npublic function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow)\r\npublic function integer of_sethdc (long al_hdc)\r\npublic function boolean of_getbit (long al_decimal, integer ai_bit)\r\npublic function unsignedlong of_createfont (string as_name, long al_size, boolean ab_underline)\r\npublic function long of_bitwiseand (long al_value1, long al_value2)\r\npublic function long of_bitwiseor (long al_value1, long al_value2)\r\npublic function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow, boolean ab_elipse, boolean ab_underline, boolean ab_wordwrap)\r\npublic function integer of_drawbuttons (dragobject ado_palette, buttons ast_buttons[], long al_bordercolor, long al_imagelist, boolean ab_boldselected, long il_imagesize, long al_height)\r\nend prototypes\r\n\r\npublic subroutine of_verticalgradient (long al_color1, long al_color2);Long\tll_Red, &\r\n\t\tll_Green, &\r\n\t\tll_Blue, &\r\n\t\tll_DC\r\nGRADIENT_RECT l_Gradient[1]\r\n\r\nLONG hRPen\r\n\r\n// Set the colors in the first corner (top left)\r\nof_SplitRGB (al_Color1, ll_Red, ll_Green, ll_Blue)\r\nCorner[1].Red = ll_Red\r\nCorner[1].Green = ll_Green\r\nCorner[1].Blue = ll_Blue\r\n\r\n// Set the colors in the third corner (bottom right)\r\nof_SplitRGB (al_Color2, ll_Red, ll_Green, ll_Blue)\r\nCorner[3].Red = ll_Red\r\nCorner[3].Green = ll_Green\r\nCorner[3].Blue = ll_Blue\r\n\r\nl_Gradient[1].UpperLeft = 0 // First corner, top left\r\nl_Gradient[1].LowerRight = 2 // Third corner, bottom right\r\n\r\nll_DC = il_HDC//GetDC (HDC)\r\n\r\n// Create a border if ib_displayborder is true\r\nIF \tib_displayborder THEN\r\n\thRPen = CreatePen(0,0,1090519039)\r\n\tSelectObject(ll_DC, hRPen)\r\n\tRectangle(ll_DC, Corner[1].X - 1, Corner[1].Y - 1, Corner[3].X +1, Corner[3].Y +1)\r\nEND IF\r\n\r\nGradientRectangle (ll_DC, Corner, 4, l_Gradient, 1, GRADIENT_FILL_RECT_V)\r\n\r\n//ReleaseDC (HDC, ll_DC)\r\nend subroutine\r\n\r\npublic subroutine of_splitrgb (long al_color, ref long red, ref long green, ref long blue);Red = Mod (al_Color, 256)\r\nRed *= 256\r\n\r\nal_Color /= 256\r\nGreen\t= Mod (al_Color, 256)\r\nGreen *= 256\r\n\r\nBlue = al_Color / 256\r\nBlue *= 256\r\nend subroutine\r\n\r\npublic function boolean of_setdevicecontext (graphicobject ado_palette);IF NOT IsValid (ado_Palette) THEN RETURN FALSE\r\n\r\n// Get the object's handle\r\nHDC = Handle (ado_Palette)\r\n\r\n// Get the object's dimensions\r\nGetClientRect (HDC, DC_RECT)\r\n\r\n// let's resize the grandient rectangle if border is displayed\r\nIF ib_displayborder THEN\r\n\t// Initialize the vertices\r\n\tCorner[1].X = DC_RECT.Left +1 \r\n\tCorner[1].Y = DC_RECT.Top +1 \r\n\tCorner[2].X = DC_RECT.Right -1\r\n\tCorner[2].Y = DC_RECT.Top +1\r\n\tCorner[3].X = DC_RECT.Right -1\r\n\tCorner[3].Y = DC_RECT.Bottom - 1\r\n\tCorner[4].X = DC_RECT.Left +1\r\n\tCorner[4].Y = DC_RECT.Bottom - 1\r\n\t\r\n\tVistaCorner1[1].X = DC_RECT.Left + 1 \r\n\tVistaCorner1[1].Y = DC_RECT.Top + 1\r\n\tVistaCorner1[2].X = DC_RECT.Right -1\r\n\tVistaCorner1[2].Y = DC_RECT.Top + 1\r\n\tVistaCorner1[3].X = DC_RECT.Right -1\r\n\tVistaCorner1[3].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .65)//20\r\n\tVistaCorner1[4].X = DC_RECT.Left +1\r\n\tVistaCorner1[4].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .65)//20\r\n\t\r\n\tVistaCorner3[1].X = DC_RECT.Left + 1 \r\n\tVistaCorner3[1].Y = DC_RECT.Top + ((DC_RECT.Bottom * .65) / 2)//10\r\n\tVistaCorner3[2].X = DC_RECT.Right -1\r\n\tVistaCorner3[2].Y = DC_RECT.Top + ((DC_RECT.Bottom * .65) / 2)//10\r\n\tVistaCorner3[3].X = DC_RECT.Right -1\r\n\tVistaCorner3[3].Y = DC_RECT.Bottom - 1\r\n\tVistaCorner3[4].X = DC_RECT.Left +1\r\n\tVistaCorner3[4].Y = DC_RECT.Bottom - 1\r\n\r\nELSE\r\n\tCorner[1].X = DC_RECT.Left\r\n\tCorner[1].Y = DC_RECT.Top \r\n\tCorner[2].X = DC_RECT.Right\r\n\tCorner[2].Y = DC_RECT.Top\r\n\tCorner[3].X = DC_RECT.Right\r\n\tCorner[3].Y = DC_RECT.Bottom \r\n\tCorner[4].X = DC_RECT.Left\r\n\tCorner[4].Y = DC_RECT.Bottom\r\n\t\r\n\tVistaCorner1[1].X = DC_RECT.Left \r\n\tVistaCorner1[1].Y = DC_RECT.Top\r\n\tVistaCorner1[2].X = DC_RECT.Right\r\n\tVistaCorner1[2].Y = DC_RECT.Top\r\n\tVistaCorner1[3].X = DC_RECT.Right\r\n\tVistaCorner1[3].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .65)// - 19\r\n\tVistaCorner1[4].X = DC_RECT.Left\r\n\tVistaCorner1[4].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .65)// - 19\r\n\t\r\n\tVistaCorner3[1].X = DC_RECT.Left \r\n\tVistaCorner3[1].Y = DC_RECT.Top + ((DC_RECT.Bottom * .65) / 2) - 1// + 9//12 \r\n\tVistaCorner3[2].X = DC_RECT.Right\r\n\tVistaCorner3[2].Y = DC_RECT.Top + ((DC_RECT.Bottom * .65) / 2) - 1// + 9//12\r\n\tVistaCorner3[3].X = DC_RECT.Right\r\n\tVistaCorner3[3].Y = DC_RECT.Bottom\r\n\tVistaCorner3[4].X = DC_RECT.Left\r\n\tVistaCorner3[4].Y = DC_RECT.Bottom\r\nEND IF\t\r\n\r\nRETURN TRUE\r\n\r\n\r\nend function\r\n\r\npublic subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette);IF NOT of_SetDeviceContext (ado_Palette) THEN RETURN\r\n\r\nof_VerticalGradient (al_Color1, al_Color2)\r\nend subroutine\r\n\r\npublic subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor, integer ai_style);CHOOSE CASE ai_STYLE\r\n\tCASE 0\r\n\t\tof_XPGradient (al_color1, al_color2, ado_palette,ab_displayborder,al_bordercolor)\r\nEND CHOOSE\r\nend subroutine\r\n\r\npublic subroutine of_xpgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor);Long\tll_Red, &\r\n\t\tll_Green, &\r\n\t\tll_Blue, &\r\n\t\tll_DC\r\nGRADIENT_RECT l_Gradient[1]\r\n\r\nLONG hRPen\r\n\r\nib_displayborder = ab_displayborder\r\n\r\nIF NOT of_SetDeviceContext (ado_Palette) THEN RETURN\r\n\r\n//of_VerticalGradient (al_Color1, al_Color2)\r\n\r\n// Set the colors in the first corner (top left)\r\nof_SplitRGB (al_Color1, ll_Red, ll_Green, ll_Blue)\r\nCorner[1].Red = ll_Red\r\nCorner[1].Green = ll_Green\r\nCorner[1].Blue = ll_Blue\r\n\r\n// Set the colors in the third corner (bottom right)\r\nof_SplitRGB (al_Color2, ll_Red, ll_Green, ll_Blue)\r\nCorner[3].Red = ll_Red\r\nCorner[3].Green = ll_Green\r\nCorner[3].Blue = ll_Blue\r\n\r\nl_Gradient[1].UpperLeft = 0 // First corner, top left\r\nl_Gradient[1].LowerRight = 2 // Third corner, bottom right\r\n\r\nll_DC = il_HDC//GetDC (HDC)\r\n\r\n// Create a border if ib_displayborder is true\r\nIF \tab_displayborder THEN\r\n\thRPen = CreatePen(0,0,al_bordercolor)\r\n\tSelectObject(ll_DC, hRPen)\r\n\tRectangle(ll_DC, Corner[1].X - 1, Corner[1].Y - 1, Corner[3].X +1, Corner[3].Y +1)\r\n\tDeleteObject(hRPen)\r\nEND IF\r\n\r\nGradientRectangle (ll_DC, Corner, 4, l_Gradient, 1, GRADIENT_FILL_RECT_V)\r\n\r\n//ReleaseDC (HDC, ll_DC)\r\nend subroutine\r\n\r\npublic function boolean of_setdevicecontext (graphicobject ado_palette, integer ai_style, boolean ab_border);IF NOT IsValid (ado_Palette) THEN RETURN FALSE\r\n\r\n// Get the object's handle\r\nHDC = Handle (ado_Palette)\r\n\r\n// Get the object's dimensions\r\nGetClientRect (HDC, DC_RECT)\r\n\r\n// let's resize the grandient rectangle if border is displayed\r\nchoose case ai_style\r\n\tcase 2\r\n\tIF ab_border THEN\r\n\t\t// Initialize the vertices\r\n\t\tCorner[1].X = DC_RECT.Left +1 \r\n\t\tCorner[1].Y = DC_RECT.Top +1 \r\n\t\tCorner[2].X = DC_RECT.Right -1\r\n\t\tCorner[2].Y = DC_RECT.Top +1\r\n\t\tCorner[3].X = DC_RECT.Right -1\r\n\t\tCorner[3].Y = DC_RECT.Bottom - 1\r\n\t\tCorner[4].X = DC_RECT.Left +1\r\n\t\tCorner[4].Y = DC_RECT.Bottom - 1\r\n\t\r\n\t\tVistaCorner1[1].X = DC_RECT.Left + 2 \r\n\t\tVistaCorner1[1].Y = DC_RECT.Top + 2\r\n\t\tVistaCorner1[2].X = DC_RECT.Right - 1\r\n\t\tVistaCorner1[2].Y = DC_RECT.Top + 2\r\n\t\tVistaCorner1[3].X = DC_RECT.Right -2\r\n\t\tVistaCorner1[3].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .48)//14\r\n\t\tVistaCorner1[4].X = DC_RECT.Left +1\r\n\t\tVistaCorner1[4].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .48)//14\r\n\t\r\n\t\tVistaCorner3[1].X = DC_RECT.Left + 2\r\n\t\tVistaCorner3[1].Y = DC_RECT.Top + (DC_RECT.Bottom * .53)//16\r\n\t\tVistaCorner3[2].X = DC_RECT.Right //-1\r\n\t\tVistaCorner3[2].Y = DC_RECT.Top + (DC_RECT.Bottom * .53)//16 \r\n\t\tVistaCorner3[3].X = DC_RECT.Right - 2\r\n\t\tVistaCorner3[3].Y = DC_RECT.Bottom - 2\r\n\t\tVistaCorner3[4].X = DC_RECT.Left \r\n\t\tVistaCorner3[4].Y = DC_RECT.Bottom - 2\r\n\tELSE\r\n\t\tCorner[1].X = DC_RECT.Left +1 \r\n\t\tCorner[1].Y = DC_RECT.Top +1 \r\n\t\tCorner[2].X = DC_RECT.Right -1\r\n\t\tCorner[2].Y = DC_RECT.Top +1\r\n\t\tCorner[3].X = DC_RECT.Right -1\r\n\t\tCorner[3].Y = DC_RECT.Bottom - 1\r\n\t\tCorner[4].X = DC_RECT.Left +1\r\n\t\tCorner[4].Y = DC_RECT.Bottom - 1\r\n\t\r\n\t\tVistaCorner1[1].X = DC_RECT.Left\r\n\t\tVistaCorner1[1].Y = DC_RECT.Top \r\n\t\tVistaCorner1[2].X = DC_RECT.Right\r\n\t\tVistaCorner1[2].Y = DC_RECT.Top \r\n\t\tVistaCorner1[3].X = DC_RECT.Right\r\n\t\tVistaCorner1[3].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .48)//14\r\n\t\tVistaCorner1[4].X = DC_RECT.Left\r\n\t\tVistaCorner1[4].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .48)//14\r\n\t\r\n\t\tVistaCorner3[1].X = DC_RECT.Left\r\n\t\tVistaCorner3[1].Y = DC_RECT.Top + (DC_RECT.Bottom * .53)//16\r\n\t\tVistaCorner3[2].X = DC_RECT.Right \r\n\t\tVistaCorner3[2].Y = DC_RECT.Top + (DC_RECT.Bottom * .53)//16 \r\n\t\tVistaCorner3[3].X = DC_RECT.Right\r\n\t\tVistaCorner3[3].Y = DC_RECT.Bottom\r\n\t\tVistaCorner3[4].X = DC_RECT.Left \r\n\t\tVistaCorner3[4].Y = DC_RECT.Bottom\r\n\tEND IF\r\nend choose\r\n\r\nRETURN TRUE\r\n\r\n\r\nend function\r\n\r\npublic function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow);RETURN of_DrawText (ado_palette, as_text, al_color, as_font, al_size, ab_bold, al_align, al_x, al_y, al_width, al_height, ab_displayshadow, FALSE, FALSE, FALSE)\r\nend function\r\n\r\npublic function integer of_sethdc (long al_hdc);il_HDC = al_hdc\r\n\r\nRETURN 1\r\nend function\r\n\r\npublic function boolean of_getbit (long al_decimal, integer ai_bit);Boolean lb_null\r\n\r\n//Check parameters\r\nIf IsNull(al_decimal) or IsNull(ai_bit) then\r\n\tSetNull(lb_null)\r\n\tReturn lb_null\r\nEnd If\r\n\r\n//Assumption ai_bit is the nth bit counting right to left with\r\n//the leftmost bit being bit one.\r\n//al_decimal is a binary number as a base 10 long.\r\nIf Int(Mod(al_decimal / (2 ^(ai_bit - 1)), 2)) > 0 Then\r\n\tReturn True\r\nEnd If\r\n\r\nReturn False\r\nend function\r\n\r\npublic function unsignedlong of_createfont (string as_name, long al_size, boolean ab_underline);LogFont lstr_Lf\r\nuLong lul_Font\r\n\r\nlstr_Lf.lffacename = as_name\r\nlstr_Lf.lfweight = 400\r\nlstr_Lf.lfheight = al_size * -1\r\nlstr_Lf.lfPitchAndFamily = '1'\r\nlstr_Lf.lfClipPrecision = Char(2)\r\nlstr_Lf.lfOutPrecision = Char(1)\r\nlstr_Lf.lfQuality = Char(1)\r\nlstr_Lf.lfCharset = Char(1)\r\n\r\nIF ab_underline THEN\r\n\tlstr_Lf.lfunderline = Char(1)\r\nEND IF\r\n\r\niul_font = CreateFontIndirect( lstr_Lf )\r\nlstr_Lf.lfweight = 700\r\niul_fontbold = CreateFontIndirect( lstr_Lf )\r\n\r\nRETURN 1\r\nend function\r\n\r\npublic function long of_bitwiseand (long al_value1, long al_value2);Integer\t\tli_Cnt\r\nLong\t\t\tll_Result\r\nBoolean\t\tlb_Value1[32], lb_Value2[32]\r\n\r\n// Check for nulls\r\nIf IsNull(al_Value1) Or IsNull(al_Value2) Then\r\n\tSetNull(ll_Result)\r\n\tReturn ll_Result\r\nEnd If\r\n\r\n// Get all bits for both values\r\nFor li_Cnt = 1 To 32\r\n\tlb_Value1[li_Cnt] = of_getbit(al_Value1, li_Cnt)\r\n\tlb_Value2[li_Cnt] = of_getbit(al_Value2, li_Cnt)\r\nNext\r\n\r\n// And them together\r\nFor li_Cnt = 1 To 32\r\n\tIf lb_Value1[li_Cnt] And lb_Value2[li_Cnt] Then\r\n\t\tll_Result = ll_Result + (2^(li_Cnt - 1))\r\n\tEnd If\r\nNext\r\n\r\nReturn ll_Result\r\nend function\r\n\r\npublic function long of_bitwiseor (long al_value1, long al_value2);Integer\t\tli_Cnt\r\nLong\t\t\tll_Result\r\nBoolean\t\tlb_Value1[32], lb_Value2[32]\r\n\r\n// Check for nulls\r\nIf IsNull(al_Value1) Or IsNull(al_Value2) Then\r\n\tSetNull(ll_Result)\r\n\tReturn ll_Result\r\nEnd If\r\n\r\n// Get all bits for both values\r\nFor li_Cnt = 1 To 32\r\n\tlb_Value1[li_Cnt] = of_getbit(al_Value1, li_Cnt)\r\n\tlb_Value2[li_Cnt] = of_getbit(al_Value2, li_Cnt)\r\nNext\r\n\r\n// Or them together\r\nFor li_Cnt = 1 To 32\r\n\tIf lb_Value1[li_Cnt] Or lb_Value2[li_Cnt] Then\r\n\t\tll_Result = ll_Result + (2^(li_Cnt - 1))\r\n\tEnd If\r\nNext\r\n\r\nReturn ll_Result\r\n\r\nend function\r\n\r\npublic function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow, boolean ab_elipse, boolean ab_underline, boolean ab_wordwrap);Long\tll_Red, &\r\n\t\tll_Green, &\r\n\t\tll_Blue, &\r\n\t\tll_DC, ll_parm, ll_sizeparm\r\nGRADIENT_RECT l_Gradient[1]\r\nRECT l_Rect, l_Rectback\r\n\r\nLONG hRPen\r\n\r\nIF Len(Trim(as_text)) = 0 THEN\r\n\til_newWidth = 1\r\n\til_NewHeight = al_height\r\n\tRETURN 0\r\nEND IF\r\n\r\nIF NOT of_SetDeviceContext (ado_Palette) THEN RETURN 0\r\n\r\nll_DC = il_HDC//GetDC (HDC)\r\n\r\nof_CreateFont(as_font, al_size, ab_underline)\r\n\r\nIF ab_bold THEN\r\n\tSelectObject(ll_DC, iul_fontbold)\r\nELSE\r\n\tSelectObject(ll_DC, iul_font)\r\nEND IF\r\n\r\nIF ab_elipse THEN\r\n\tll_sizeparm = of_BitWiseOr(al_align, DT_WORD_ELLIPSIS)\r\nELSE\r\n\tIF ab_wordwrap THEN\r\n\t\tll_sizeparm = of_BitWiseOr(al_align, DT_WORDBREAK)\r\n\tEND IF\r\nEND IF\r\n\r\nIF ab_wordwrap THEN\r\n\tll_parm = of_BitWiseOr(DT_CALCRECT, DT_WORDBREAK)\r\nELSE\r\n\tll_parm = DT_CALCRECT\r\nEND IF\r\n\r\nSetBkMode(ll_DC, 1)\r\n\r\n/*-------------------------------------------------------------------\r\n\tNormal text\r\n-------------------------------------------------------------------*/\r\n// Position\r\nl_Rect.Left = al_x\r\nl_Rect.Top = al_y\r\nl_Rect.Right = al_width\r\nl_Rect.Bottom = al_height\r\n\r\n//SetBkMode(ll_DC, 1)\r\nSetTextColor(ll_DC, al_color)\r\n\r\nIF NOT ab_elipse THEN\r\n\tDrawtext(ll_DC, as_text, LEN(as_text), l_Rect, ll_parm)\r\nEND IF\r\n\r\nIF al_align = ALIGN_RIGHT OR &\r\n   al_align = ALIGN_CENTER THEN\r\n\tl_Rect.Right = al_width\r\nEND IF\r\n\r\nDrawtext(ll_DC, as_text, LEN(as_text), l_Rect, ll_sizeparm)\r\n\r\nil_NewHeight = l_Rect.Bottom\r\nil_newWidth = l_Rect.RIGHT\r\n\r\nDeleteObject(iul_font)\r\nDeleteObject(iul_fontbold)\r\n\r\n//ReleaseDC (HDC, ll_DC)\r\n\r\nRETURN 1\r\nend function\r\n\r\npublic function integer of_drawbuttons (dragobject ado_palette, buttons ast_buttons[], long al_bordercolor, long al_imagelist, boolean ab_boldselected, long il_imagesize, long al_height);point lp[], lp_line[]\r\npoint lp_empty[]\r\ngradient_rect l_Gradient[1]\r\nGRADIENT_RECT l_Line[]\r\nrect rc\r\nLong\tll_Red, &\r\n\t\tll_Green, &\r\n\t\tll_Blue\r\nlong hRgn, hRPen, ll_index, ll_count, ll_textcolor, ll_parm\r\nLong ll_inner, ll_innercount\r\nLong ll_textx, ll_texty, ll_textwidth, ll_y\r\nBoolean lb_bold\r\n\r\nll_count = UpperBound(ast_buttons)\r\n\r\nFOR ll_index = 1 TO ll_count\r\n\tlp = lp_empty\r\n\t\r\n\tlp = ast_buttons[ll_index].ast_point\r\n\t\r\n\tIF lp[4].py < 0 OR lp[1].py > al_height THEN\r\n\t\tCONTINUE\r\n\tEND IF\r\n\t\r\n\tl_Gradient[1].UpperLeft = 0\r\n\tl_Gradient[1].LowerRight = 2\r\n\t\r\n\tIF ast_buttons[ll_index].ab_selected OR &\r\n\t   ast_buttons[ll_index].ab_mouseover THEN\r\n\t\tCorner[1].X = lp[1].px \r\n\t\tCorner[1].Y = lp[1].py\r\n\t\tCorner[2].X = lp[2].px \r\n\t\tCorner[2].Y = lp[2].py\r\n\t\tCorner[3].X = lp[3].px \r\n\t\tCorner[3].Y = lp[3].py\r\n\t\tCorner[4].X = lp[4].px \r\n\t\tCorner[4].Y = lp[4].py\r\n\t\t\r\n\t\t// Set the colors in the first corner (top left)\r\n\t\tof_SplitRGB (ast_buttons[ll_index].al_backcolor1, ll_Red, ll_Green, ll_Blue)\r\n\t\tCorner[1].Red = ll_Red\r\n\t\tCorner[1].Green = ll_Green\r\n\t\tCorner[1].Blue = ll_Blue\r\n\t\t\r\n\t\t// Set the colors in the third corner (bottom right)\r\n\t\tof_SplitRGB (ast_buttons[ll_index].al_backcolor2, ll_Red, ll_Green, ll_Blue)\r\n\t\tCorner[3].Red = ll_Red\r\n\t\tCorner[3].Green = ll_Green\r\n\t\tCorner[3].Blue = ll_Blue\r\n\t\t\r\n\t\t//Create Polygon\r\n\t\thRPen = CreatePen(0,0,al_bordercolor)\r\n\t\tSelectObject(il_HDC, hRPen)\r\n\t\thRgn = CreateRoundRectRgn( Corner[1].X, Corner[1].Y, Corner[3].X, Corner[3].Y,7,7)\r\n\t\tRoundRect( il_HDC, Corner[1].X - 1, Corner[1].Y - 1, Corner[3].X, Corner[3].Y,10,10)\r\n\t\t\r\n\t\tSelectClipRgn(il_HDC, hRgn)\r\n\t\t\r\n\t\t//Gradient Fill\r\n\t\tGradientRectangle (il_HDC, Corner, 4, l_Gradient, 1, GRADIENT_FILL_RECT_V)\r\n\t\t\r\n\t\tSelectClipRgn(il_HDC, 0)\r\n\t\t\r\n\t\tDeleteObject(hRPen)\r\n\t\tDeleteObject(hRgn)\r\n\tEND IF\r\n\t\r\n\tIF ast_buttons[ll_index].ab_enabled THEN\r\n\t\tll_textcolor = 0\r\n\tELSE\r\n\t\tll_textcolor = RGB(100,100,100)\r\n\tEND IF\r\n\t\r\n\tIF ab_boldselected AND ast_buttons[ll_index].ab_selected THEN\r\n\t\tlb_bold = TRUE\r\n\tELSE\r\n\t\tlb_bold = FALSE\r\n\tEND IF\r\n\t\r\n\tof_DrawText(ado_palette, &\r\n\t            ast_buttons[ll_index].as_text, &\r\n\t\t\t\t\tll_textcolor, &\r\n\t\t\t\t\t'tahoma', &\r\n\t\t\t\t\t11, lb_bold, ALIGN_CENTER, &\r\n\t\t\t\t\tast_buttons[ll_index].ast_point[1].px, &\r\n\t\t\t\t\tast_buttons[ll_index].ast_point[1].py + il_imagesize + 6, &\r\n\t\t\t\t\tast_buttons[ll_index].ast_point[2].px - ast_buttons[ll_index].ast_point[1].px + 10, &\r\n\t\t\t\t\tast_buttons[ll_index].al_textheight, &\r\n\t\t\t\t\tFALSE, FALSE, FALSE, TRUE)\r\n\t\r\n\t//----------------------------------------\r\n\t\r\n\tIF ast_buttons[ll_index].ab_enabled THEN\r\n\t\tImageList_DrawEx(al_imagelist, &\r\n\t\t                 ast_buttons[ll_index].al_image - 1, &\r\n\t\t\t\t\t\t\t  il_HDC, &\r\n\t\t\t\t\t\t\t  ast_buttons[ll_index].ast_point[1].px + (ast_buttons[ll_index].ast_point[2].px - ast_buttons[ll_index].ast_point[1].px) / 2 - (il_imagesize / 2) , &\r\n\t\t\t\t\t\t\t  ast_buttons[ll_index].ast_point[1].py + 4, &\r\n\t\t\t\t\t\t\t  il_imagesize,il_imagesize, &\r\n\t\t\t\t\t\t\t  0, 0, ILD_TRANSPARENT )\r\n\tELSE\r\n\t\tll_parm = of_BitWiseOR(ILD_TRANSPARENT, ILD_BLEND50)\r\n\t\tImageList_DrawEx(al_imagelist, &\r\n\t\t                 ast_buttons[ll_index].al_image - 1, &\r\n\t\t\t\t\t\t\t  il_HDC, &\r\n\t\t\t\t\t\t\t  ast_buttons[ll_index].ast_point[1].px + (ast_buttons[ll_index].ast_point[2].px - ast_buttons[ll_index].ast_point[1].px) / 2 - (il_imagesize / 2) , &\r\n\t\t\t\t\t\t\t  ast_buttons[ll_index].ast_point[1].py + 4, &\r\n\t\t\t\t\t\t\t  il_imagesize,il_imagesize, &\r\n\t\t\t\t\t\t\t  4294967295, RGB(128,128,128), ll_parm )\r\n\tEND IF\r\n\t\r\nNEXT\r\n\r\nRETURN 1\r\nend function\r\n\r\non n_cst_buttonlistbar_gradient.create\r\ncall super::create\r\nTriggerEvent( this, \"constructor\" )\r\nend on\r\n\r\non n_cst_buttonlistbar_gradient.destroy\r\nTriggerEvent( this, \"destructor\" )\r\ncall super::destroy\r\nend on\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/PowerBuilder/part1.srw",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 dario ureña\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n// Source - https://github.com/darioaxel/PowerScriptToKDMTransformer/blob/62083e4cd4f9ead9975427ee9f558d6adef67bbe/resources/advanced/w_mant_seg/part1.srw\n\nforward\nglobal type w_mant_seg_scs from w_mant\nend type\ntype sle_anio from singlelineedit within w_mant_seg_scs\nend type\ntype st_1 from statictext within w_mant_seg_scs\nend type\nend forward\n\nglobal type w_mant_seg_scs from w_mant\ninteger height = 952\nsle_anio sle_anio\nst_1 st_1\nend type\nglobal w_mant_seg_scs w_mant_seg_scs\n\ntype variables\n//------------------------------------------------------------------------------------------\n// Satxa - 26-Ene-2005.19417 \nString\tis_anio\n//------------------------------------------------------------------------------------------\nend variables\n"
  },
  {
    "path": "src/test/resources/samples/langs/PowerBuilder/w_export.srw",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 Sébastien Kirche\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n// Source: https://github.com/sebkirche/libexport/blob/c2459a5399ff87f29344b3b0472b041ebb6f9246/sources/115/w_export.srw\n\nHA$PBExportHeader$w_export.srw\nforward\nglobal type w_export from window\nend type\ntype st_2 from statictext within w_export\nend type\ntype sle_destdir from singlelineedit within w_export\nend type\ntype cb_browse_dest from commandbutton within w_export\nend type\ntype cb_export_some from commandbutton within w_export\nend type\ntype cb_export_all from commandbutton within w_export\nend type\ntype dw_objects from datawindow within w_export\nend type\ntype cb_browse from commandbutton within w_export\nend type\ntype sle_pbl from singlelineedit within w_export\nend type\ntype st_1 from statictext within w_export\nend type\nend forward\n\nglobal type w_export from window\ninteger width = 3209\ninteger height = 1600\nboolean titlebar = true\nstring title = \"Export\"\nboolean controlmenu = true\nboolean minbox = true\nboolean maxbox = true\nboolean resizable = true\nlong backcolor = 67108864\nstring icon = \"AppIcon!\"\nboolean center = true\nst_2 st_2\nsle_destdir sle_destdir\ncb_browse_dest cb_browse_dest\ncb_export_some cb_export_some\ncb_export_all cb_export_all\ndw_objects dw_objects\ncb_browse cb_browse\nsle_pbl sle_pbl\nst_1 st_1\nend type\nglobal w_export w_export\n\nforward prototypes\npublic subroutine get_objects (string as_pbl)\npublic function boolean export_object (string as_lib, string as_object, string as_type, string as_comment)\npublic function string get_object_suffix (string as_type)\npublic function libexporttype get_object_libtype (string as_type)\npublic subroutine export_object_at_row (long al_row, string as_lib)\nend prototypes\n\npublic subroutine get_objects (string as_pbl);\nif not fileexists(as_pbl) then return\n\nint i, p = 1\nstring ls_entries, ls_entry\nls_entries = LibraryDirectoryEx(as_pbl, DirAll!)\ndebug_message('get_objects()', ls_entries)\n\ndw_objects.reset()\ndw_objects.importstring(ls_entries)\n\nend subroutine\n\npublic function boolean export_object (string as_lib, string as_object, string as_type, string as_comment);\nLibExportType l_ot\nstring ls_syntax, ls_filename, ls_dir\nint li_file\n\nls_dir = sle_destdir.text\nl_ot = get_object_libtype(as_type)\nls_syntax = libraryexport(as_lib, as_object, l_ot)\n\nls_filename = as_object + '.' + get_object_suffix(as_type)\nli_file = FileOpen(ls_dir + '\\' + ls_filename, streammode!, write!, LockReadWrite!, Replace!, EncodingUTF16LE!)\nif li_file = -1 then return false\n\nFileWrite(li_file, \"$PBExportHeader$\" + ls_filename + \"~r~n\")\nif as_comment <> \"\" then\n\tFileWrite(li_file, \"$PBExportComments$\" + as_comment + \"~r~n\")\nend if\nFileWrite(li_file, ls_syntax)\nFileClose(li_file)\n\nreturn true\n\nend function\n\npublic function string get_object_suffix (string as_type);\nstring ls_suf = \"\"\n\nchoose case as_type\n\tcase 'Application'; ls_suf = 'sra'\n\tcase 'DataWindow';  ls_suf = 'srd'\n\tcase 'Function';    ls_suf = 'srf'\n\tcase 'Menu';        ls_suf = 'srm'\n\tcase 'Pipeline';    ls_suf = 'srp'\n\tcase 'Project';     ls_suf = 'srj'\n\tcase 'Query';       ls_suf = 'srq'\n\tcase 'Structure';   ls_suf = 'srs'\n\tcase 'UserObject';  ls_suf = 'sru'\n\tcase 'Window';      ls_suf = 'srw'\nend choose\n\nreturn ls_suf\n\nend function\n\npublic function libexporttype get_object_libtype (string as_type);\nlibexporttype l_ot\n\nchoose case as_type\n\tcase 'Application'; l_ot = ExportApplication!\n\tcase 'DataWindow';  l_ot = ExportDataWindow!\n\tcase 'Function';    l_ot = ExportFunction!\n\tcase 'Menu';        l_ot = ExportMenu!\n\tcase 'Pipeline';    l_ot = ExportPipeline!\n\tcase 'Project';     l_ot = ExportProject!\n\tcase 'Query';       l_ot = ExportQuery!\n\tcase 'Structure';   l_ot = ExportStructure!\n\tcase 'UserObject';  l_ot = ExportUserObject!\n\tcase 'Window';      l_ot = ExportWindow!\nend choose\n\nreturn l_ot\n\nend function\n\npublic subroutine export_object_at_row (long al_row, string as_lib);\nstring ls_obj, ls_type, ls_comment\n\nls_obj = dw_objects.getitemstring(al_row, \"obj_name\")\nls_type = dw_objects.getitemstring(al_row, \"obj_type\")\nls_comment = dw_objects.getitemstring(al_row, \"comment\")\nexport_object(as_lib, ls_obj, ls_type, ls_comment)\n\nend subroutine\n\non w_export.create\nthis.st_2=create st_2\nthis.sle_destdir=create sle_destdir\nthis.cb_browse_dest=create cb_browse_dest\nthis.cb_export_some=create cb_export_some\nthis.cb_export_all=create cb_export_all\nthis.dw_objects=create dw_objects\nthis.cb_browse=create cb_browse\nthis.sle_pbl=create sle_pbl\nthis.st_1=create st_1\nthis.Control[]={this.st_2,&\nthis.sle_destdir,&\nthis.cb_browse_dest,&\nthis.cb_export_some,&\nthis.cb_export_all,&\nthis.dw_objects,&\nthis.cb_browse,&\nthis.sle_pbl,&\nthis.st_1}\nend on\n\non w_export.destroy\ndestroy(this.st_2)\ndestroy(this.sle_destdir)\ndestroy(this.cb_browse_dest)\ndestroy(this.cb_export_some)\ndestroy(this.cb_export_all)\ndestroy(this.dw_objects)\ndestroy(this.cb_browse)\ndestroy(this.sle_pbl)\ndestroy(this.st_1)\nend on\n\ntype st_2 from statictext within w_export\ninteger x = 32\ninteger y = 1208\ninteger width = 251\ninteger height = 76\ninteger textsize = -8\ninteger weight = 400\nfontcharset fontcharset = ansi!\nfontpitch fontpitch = variable!\nfontfamily fontfamily = swiss!\nstring facename = \"Tahoma\"\nlong textcolor = 33554432\nlong backcolor = 67108864\nstring text = \"Export into\"\nboolean focusrectangle = false\nend type\n\ntype sle_destdir from singlelineedit within w_export\ninteger x = 325\ninteger y = 1204\ninteger width = 2619\ninteger height = 80\ninteger taborder = 30\ninteger textsize = -8\ninteger weight = 400\nfontcharset fontcharset = ansi!\nfontpitch fontpitch = variable!\nfontfamily fontfamily = swiss!\nstring facename = \"Tahoma\"\nlong textcolor = 33554432\nstring text = \"none\"\nborderstyle borderstyle = stylelowered!\nend type\n\ntype cb_browse_dest from commandbutton within w_export\ninteger x = 2985\ninteger y = 1204\ninteger width = 169\ninteger height = 80\ninteger taborder = 30\ninteger textsize = -8\ninteger weight = 400\nfontcharset fontcharset = ansi!\nfontpitch fontpitch = variable!\nfontfamily fontfamily = swiss!\nstring facename = \"Tahoma\"\nstring text = \"...\"\nend type\n\nevent clicked;\nstring ls_dir\n\nls_dir = getfolder(\"Select the directory where you want to export\")\nif ls_dir <> \"\" then\n\tsle_destdir.text = ls_dir\nend if\n\nend event\n\ntype cb_export_some from commandbutton within w_export\ninteger x = 398\ninteger y = 1344\ninteger width = 457\ninteger height = 100\ninteger taborder = 50\ninteger textsize = -8\ninteger weight = 400\nfontcharset fontcharset = ansi!\nfontpitch fontpitch = variable!\nfontfamily fontfamily = swiss!\nstring facename = \"Tahoma\"\nstring text = \"Export selected\"\nend type\n\nevent clicked;\nstring ls_lib\nint r\n\nls_lib = sle_pbl.text\nif not fileexists(ls_lib) then return\n\nr = dw_objects.getselectedrow(0)\ndo while r > 0\n\texport_object_at_row(r, ls_lib)\n\tr = dw_objects.getselectedrow(r)\nloop\n\nend event\n\ntype cb_export_all from commandbutton within w_export\ninteger x = 37\ninteger y = 1344\ninteger width = 338\ninteger height = 100\ninteger taborder = 40\ninteger textsize = -8\ninteger weight = 400\nfontcharset fontcharset = ansi!\nfontpitch fontpitch = variable!\nfontfamily fontfamily = swiss!\nstring facename = \"Tahoma\"\nstring text = \"Export all\"\nend type\n\nevent clicked;\nstring ls_lib\nint i, li_max\n\nls_lib = sle_pbl.text\nif not fileexists(ls_lib) then return\n\nli_max = dw_objects.rowcount()\nfor i = 1 to li_max\n\texport_object_at_row(i, ls_lib)\nnext\nend event\n\ntype dw_objects from datawindow within w_export\ninteger x = 32\ninteger y = 212\ninteger width = 2912\ninteger height = 876\ninteger taborder = 30\nstring title = \"none\"\nstring dataobject = \"dw_objects\"\nboolean hscrollbar = true\nboolean vscrollbar = true\nboolean livescroll = true\nborderstyle borderstyle = stylelowered!\nend type\n\nevent clicked;\nboolean lb_sel\n\nlb_sel = dw_objects.isselected(row)\ndw_objects.selectrow(row, not lb_sel)\n\nend event\n\ntype cb_browse from commandbutton within w_export\ninteger x = 2985\ninteger y = 64\ninteger width = 169\ninteger height = 80\ninteger taborder = 20\ninteger textsize = -8\ninteger weight = 400\nfontcharset fontcharset = ansi!\nfontpitch fontpitch = variable!\nfontfamily fontfamily = swiss!\nstring facename = \"Tahoma\"\nstring text = \"...\"\nend type\n\nevent clicked;\nstring ls_dir, ls_file, ls_path\n\nif 1 = getfileopenname(\"Choose a library to export\", ls_dir, ls_file, \"pbl\", \"Libraries (*.PBL),*.PBL\") then\n\tls_path = ls_dir\n\tsle_pbl.text = ls_path\n\tget_objects(ls_path)\nend if\n\nend event\n\ntype sle_pbl from singlelineedit within w_export\ninteger x = 256\ninteger y = 64\ninteger width = 2688\ninteger height = 80\ninteger taborder = 10\ninteger textsize = -8\ninteger weight = 400\nfontcharset fontcharset = ansi!\nfontpitch fontpitch = variable!\nfontfamily fontfamily = swiss!\nstring facename = \"Tahoma\"\nlong textcolor = 33554432\nstring text = \"none\"\nborderstyle borderstyle = stylelowered!\nend type\n\ntype st_1 from statictext within w_export\ninteger x = 32\ninteger y = 72\ninteger width = 215\ninteger height = 76\ninteger textsize = -8\ninteger weight = 400\nfontcharset fontcharset = ansi!\nfontpitch fontpitch = variable!\nfontfamily fontfamily = swiss!\nstring facename = \"Tahoma\"\nlong textcolor = 33554432\nlong backcolor = 67108864\nstring text = \"Library\"\nboolean focusrectangle = false\nend type\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/PowerShell/ZLocation.psd1",
    "content": "﻿#\n# Module manifest for module 'ZLocation'\n#\n# Generated by: sevoroby\n#\n# Generated on: 12/10/2014\n#\n\n@{\n\n# Script module or binary module file associated with this manifest.\nRootModule = 'ZLocation.psm1'\n\n# Version number of this module.\nModuleVersion = '0.1'\n\n# ID used to uniquely identify this module\nGUID = '18e8ca17-7f67-4f1c-85ff-159373bf66f5'\n\n# Author of this module\nAuthor = 'Sergei Vorobev'\n\n# Company or vendor of this module\nCompanyName = 'Microsoft'\n\n# Copyright statement for this module\nCopyright = '(c) 2014 Sergei Vorobev. All rights reserved.'\n\n# Description of the functionality provided by this module\n# Description = ''\n\n# Minimum version of the Windows PowerShell engine required by this module\n# PowerShellVersion = ''\n\n# Name of the Windows PowerShell host required by this module\n# PowerShellHostName = ''\n\n# Minimum version of the Windows PowerShell host required by this module\n# PowerShellHostVersion = ''\n\n# Minimum version of Microsoft .NET Framework required by this module\n# DotNetFrameworkVersion = ''\n\n# Minimum version of the common language runtime (CLR) required by this module\n# CLRVersion = ''\n\n# Processor architecture (None, X86, Amd64) required by this module\n# ProcessorArchitecture = ''\n\n# Modules that must be imported into the global environment prior to importing this module\n# RequiredModules = @()\n\n# Assemblies that must be loaded prior to importing this module\n# RequiredAssemblies = @()\n\n# Script files (.ps1) that are run in the caller's environment prior to importing this module.\n# ScriptsToProcess = @()\n\n# Type files (.ps1xml) to be loaded when importing this module\n# TypesToProcess = @()\n\n# Format files (.ps1xml) to be loaded when importing this module\n# FormatsToProcess = @()\n\n# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess\nNestedModules = @(\"ZLocation.Storage.psm1\", \"ZLocation.Search.psm1\")\n\n# Functions to export from this module\nFunctionsToExport = '*'\n\n# Cmdlets to export from this module\nCmdletsToExport = '*'\n\n# Variables to export from this module\nVariablesToExport = '*'\n\n# Aliases to export from this module\nAliasesToExport = '*'\n\n# List of all modules packaged with this module\n# ModuleList = @()\n\n# List of all files packaged with this module\n# FileList = @()\n\n# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.\nPrivateData = @{\n\n    PSData = @{\n\n        # Tags applied to this module. These help with module discovery in online galleries.\n        # Tags = @()\n\n        # A URL to the license for this module.\n        # LicenseUri = ''\n\n        # A URL to the main website for this project.\n        # ProjectUri = ''\n\n        # A URL to an icon representing this module.\n        # IconUri = ''\n\n        # ReleaseNotes of this module\n        # ReleaseNotes = ''\n\n    } # End of PSData hashtable\n\n} # End of PrivateData hashtable\n\n# HelpInfo URI of this module\n# HelpInfoURI = ''\n\n# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.\n# DefaultCommandPrefix = ''\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/PowerShell/ZLocation.psm1",
    "content": "#\n# Weight function.\n#\nfunction Update-ZLocation([string]$path)\n{\n    $now = [datetime]::Now\n    if (Test-Path variable:global:__zlocation_current)\n    {\n        $prev = $global:__zlocation_current\n        $weight = $now.Subtract($prev.Time).TotalSeconds\n        Add-ZWeight ($prev.Location) $weight \n    }\n\n    $global:__zlocation_current = @{\n        Location = $path\n        Time = [datetime]::Now\n    }\n\n    # populate folder immidiatly after the first cd\n    Add-ZWeight $path 0\n}\n\n# this approach hurts `cd` performance (0.0008 sec vs 0.025 sec). \n# Consider replace it with OnIdle Event.\n(Get-Variable pwd).attributes.Add((new-object ValidateScript { Update-ZLocation $_.Path; return $true }))\n#\n# End of weight function.\n#\n\n\n#\n# Tab complention.\n#\nif (Test-Path Function:\\TabExpansion) {\n    Rename-Item Function:\\TabExpansion PreZTabExpansion\n}\n\nfunction Get-EscapedPath\n{\n    param( \n    [Parameter(\n        Position=0, \n        Mandatory=$true, \n        ValueFromPipeline=$true,\n        ValueFromPipelineByPropertyName=$true)\n    ]\n    [string]$path\n    ) \n\n    process {\n        if ($path.Contains(' '))\n        {\n            return '\"' + $path + '\"'\n        }\n        return $path\n    }\n}\n\nfunction global:TabExpansion($line, $lastWord) {\n    switch -regex ($line) {\n        \"^(Set-ZLocation|z) .*\" {\n            $arguments = $line -split ' ' | Where { $_.length -gt 0 } | select -Skip 1\n            Find-Matches (Get-ZLocation) $arguments | Get-EscapedPath\n        }\n        default {\n            if (Test-Path Function:\\PreZTabExpansion) {\n                PreZTabExpansion $line $lastWord\n            }\n        }\n    }\n}\n#\n# End of tab completion.\n#\n\nfunction Set-ZLocation()\n{\n    if (-not $args) {\n        $args = @()\n    }\n    $matches = Find-Matches (Get-ZLocation) $args\n    if ($matches) {\n        Push-Location ($matches | Select-Object -First 1)\n    } else {\n        Write-Warning \"Cannot find matching location\"\n    }\n}\n\n\nSet-Alias -Name z -Value Set-ZLocation\nExport-ModuleMember -Function Set-ZLocation, Get-ZLocation -Alias z"
  },
  {
    "path": "src/test/resources/samples/langs/PowerShell/history.ps1",
    "content": "function Save-HistoryAll() {\n    $history = Get-History -Count $MaximumHistoryCount\n    [array]::Reverse($history)\n    $history = $history | Group CommandLine | Foreach {$_.Group[0]}\n    [array]::Reverse($history)\n    $history | Export-Csv $historyPath\n}\n\nfunction Save-HistoryIncremental() {\n#    Get-History -Count $MaximumHistoryCount | Group CommandLine | Foreach {$_.Group[0]} | Export-Csv $historyPath \n    Get-History -Count 1 | Export-Csv -Append $historyPath \n}\n \n# hook powershell's exiting event & hide the registration with -supportevent.\n#Register-EngineEvent -SourceIdentifier powershell.exiting -SupportEvent -Action { Save-History }\n\n$oldPrompt = Get-Content function:\\prompt\n\nif( $oldPrompt -notlike '*Save-HistoryIncremental*' )\n{\n    $newPrompt = @'\nSave-HistoryIncremental\n\n'@\n    $newPrompt += $oldPrompt\n    $function:prompt = [ScriptBlock]::Create($newPrompt)\n}\n \n# load previous history, if it exists\nif ((Test-Path $historyPath)) {\n    $loadTime = \n    (\n        Measure-Command {\n            Import-Csv $historyPath | Add-History\n            Save-HistoryAll\n            Clear-History\n            Import-Csv $historyPath | ? {$count++;$true} | Add-History\n        }\n    ).totalseconds\n    Write-Host -Fore Green \"`nLoaded $count history item(s) in $loadTime seconds.`n\"\n}\n\n\nfunction Search-History()\n{\n    <#\n    .SYNOPSIS\n        Retrive and filter history based on query\n    .DESCRIPTION\n    .PARAMETER Name\n    .EXAMPLE\n    .LINK\n    #>\n\n    param(\n        [string[]] $query\n    )\n\n    $history = Get-History -Count $MaximumHistoryCount\n    foreach ($item in $query){\n        $item = $item.ToLower()\n        $history = $history | where {$_.CommandLine.ToLower().Contains($item)}    \n    }\n    $history\n}"
  },
  {
    "path": "src/test/resources/samples/langs/PowerShell/pwsh-shebang.ps1",
    "content": "#!/usr/bin/env pwsh\n\n# source:  https://github.com/PowerShell/PowerShellStandard/blob/3436bfc162d6804dd11d1d76c4faff486b4b405d/build.ps1\n\nparam ( \n    [Parameter(ParameterSetName=\"Clean\")][switch]$Clean,\n    [Parameter(ParameterSetName=\"Test\")][switch]$Test\n)\n\nimport-module $PSScriptRoot/PowerShellStandard.psm1 -force\n\nif ( $Clean ) {\n    Start-Clean\n    return\n}\n\nStart-Build\n\nif ( $Test ) {\n    Invoke-Test\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Processing/hello.pde",
    "content": "/**\n * Shape Primitives. \n * \n * The basic shape primitive functions are triangle(),\n * rect(), quad(), ellipse(), and arc(). Squares are made\n * with rect() and circles are made with ellipse(). Each \n * of these functions requires a number of parameters to \n * determine the shape's position and size. \n */\n\nvoid setup() {\n  size(640, 360);\n  background(0);\n  noStroke();\n}\n\nvoid draw() {\n  fill(204);\n  triangle(18, 18, 18, 360, 81, 360);\n\n  fill(102);\n  rect(81, 81, 63, 63);\n\n  fill(204);\n  quad(189, 18, 216, 18, 216, 360, 144, 360);\n\n  fill(255);\n  ellipse(252, 144, 72, 72);\n\n  fill(204);\n  triangle(288, 18, 351, 360, 288, 360); \n\n  fill(255);\n  arc(479, 300, 280, 280, PI, TWO_PI);\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Prolog/admin.pl",
    "content": "/*  Part of ClioPatria SeRQL and SPARQL server\r\n\r\n    Author:        Jan Wielemaker\r\n    E-mail:        J.Wielemaker@cs.vu.nl\r\n    WWW:           http://www.swi-prolog.org\r\n    Copyright (C): 2004-2010, University of Amsterdam,\r\n\t\t\t      VU University Amsterdam\r\n\r\n    This program is free software; you can redistribute it and/o<r\r\n    modify it under the terms of the GNU General Public License\r\n    as published by the Free Software Foundation; either version 2\r\n    of the License, or (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public\r\n    License along with this library; if not, write to the Free Software\r\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n\r\n    As a special exception, if you link this library with other files,\r\n    compiled with a Free Software compiler, to produce an executable, this\r\n    library does not by itself cause the resulting executable to be covered\r\n    by the GNU General Public License. This exception does not however\r\n    invalidate any other reasons why the executable file might be covered by\r\n    the GNU General Public License.\r\n*/\r\n\r\n:- module(cpa_admin,\r\n\t  [ change_password_form//1\r\n\t  ]).\r\n:- use_module(user(user_db)).\r\n:- use_module(library(http/http_parameters)).\r\n:- use_module(library(http/http_session)).\r\n:- use_module(library(http/html_write)).\r\n:- use_module(library(http/html_head)).\r\n:- use_module(library(http/mimetype)).\r\n:- use_module(library(http/http_dispatch)).\r\n:- use_module(library(url)).\r\n:- use_module(library(debug)).\r\n:- use_module(library(lists)).\r\n:- use_module(library(option)).\r\n:- use_module(library(http_settings)).\r\n\r\n/** <module> ClioPatria administrative interface\r\n\r\nThis module provides HTTP services to perform administrative actions.\r\n\r\n@tbd\tIdeally, this module should be split into an api-part, a\r\n\tcomponent-part and the actual pages.  This also implies that\r\n\tthe current `action'-operations must (optionally) return\r\n\tmachine-friendly results.\r\n*/\r\n\r\n\r\n:- http_handler(cliopatria('admin/listUsers'),\t\t   list_users,\t\t    []).\r\n:- http_handler(cliopatria('admin/form/createAdmin'),\t   create_admin,\t    []).\r\n:- http_handler(cliopatria('admin/form/addUser'),\t   add_user_form,\t    []).\r\n:- http_handler(cliopatria('admin/form/addOpenIDServer'),  add_openid_server_form,  []).\r\n:- http_handler(cliopatria('admin/addUser'),\t\t   add_user,\t\t    []).\r\n:- http_handler(cliopatria('admin/selfRegister'),\t   self_register,\t    []).\r\n:- http_handler(cliopatria('admin/addOpenIDServer'),\t   add_openid_server,\t    []).\r\n:- http_handler(cliopatria('admin/form/editUser'),\t   edit_user_form,\t    []).\r\n:- http_handler(cliopatria('admin/editUser'),\t\t   edit_user,\t\t    []).\r\n:- http_handler(cliopatria('admin/delUser'),\t\t   del_user,\t\t    []).\r\n:- http_handler(cliopatria('admin/form/editOpenIDServer'), edit_openid_server_form, []).\r\n:- http_handler(cliopatria('admin/editOpenIDServer'),\t   edit_openid_server,\t    []).\r\n:- http_handler(cliopatria('admin/delOpenIDServer'),\t   del_openid_server,\t    []).\r\n:- http_handler(cliopatria('admin/form/changePassword'),   change_password_form,    []).\r\n:- http_handler(cliopatria('admin/changePassword'),\t   change_password,\t    []).\r\n:- http_handler(cliopatria('user/form/login'),\t\t   login_form,\t\t    []).\r\n:- http_handler(cliopatria('user/login'),\t\t   user_login,\t\t    []).\r\n:- http_handler(cliopatria('user/logout'),\t\t   user_logout,\t\t    []).\r\n:- http_handler(cliopatria('admin/settings'),\t\t   settings,\t\t    []).\r\n:- http_handler(cliopatria('admin/save_settings'),\t   save_settings,\t    []).\r\n\r\n%%\tlist_users(+Request)\r\n%\r\n%\tHTTP Handler listing registered users.\r\n\r\nlist_users(_Request) :-\r\n\tauthorized(admin(list_users)),\r\n\tif_allowed(admin(user(edit)),   [edit(true)], UserOptions),\r\n\tif_allowed(admin(openid(edit)), [edit(true)], OpenIDOptions),\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Users'),\r\n\t\t\t[ h1('Users'),\r\n\t\t\t  \\user_table(UserOptions),\r\n\t\t\t  p(\\action(location_by_id(add_user_form), 'Add user')),\r\n\t\t\t  h1('OpenID servers'),\r\n\t\t\t  \\openid_server_table(OpenIDOptions),\r\n\t\t\t  p(\\action(location_by_id(add_openid_server_form), 'Add OpenID server'))\r\n\t\t\t]).\r\n\r\nif_allowed(Token, Options, Options) :-\r\n\tlogged_on(User, anonymous),\r\n\tcatch(check_permission(User, Token), _, fail), !.\r\nif_allowed(_, _, []).\r\n\r\n%%\tuser_table(+Options)//\r\n%\r\n%\tHTML component generating a table of registered users.\r\n\r\nuser_table(Options) -->\r\n\t{ setof(U, current_user(U), Users)\r\n\t},\r\n\thtml([ table([ class(block)\r\n\t\t     ],\r\n\t\t     [ tr([ th('UserID'),\r\n\t\t\t    th('RealName'),\r\n\t\t\t    th('On since'),\r\n\t\t\t    th('Idle')\r\n\t\t\t  ])\r\n\t\t     | \\list_users(Users, Options)\r\n\t\t     ])\r\n\t     ]).\r\n\r\nlist_users([], _) -->\r\n\t[].\r\nlist_users([User|T], Options) -->\r\n\t{ user_property(User, realname(Name)),\r\n\t  findall(Idle-Login,\r\n\t\t  user_property(User, connection(Login, Idle)),\r\n\t\t  Pairs0),\r\n\t  keysort(Pairs0, Pairs),\r\n\t  (   Pairs == []\r\n\t  ->  OnLine = (-)\r\n\t  ;   length(Pairs, N),\r\n\t      Pairs = [Idle-Login|_],\r\n\t      OnLine = online(Login, Idle, N)\r\n\t  )\r\n\t},\r\n\thtml(tr([ td(User),\r\n\t\t  td(Name),\r\n\t\t  td(\\on_since(OnLine)),\r\n\t\t  td(\\idle(OnLine)),\r\n\t\t  \\edit_user_button(User, Options)\r\n\t\t])),\r\n\tlist_users(T, Options).\r\n\r\nedit_user_button(User, Options) -->\r\n\t{ option(edit(true), Options) }, !,\r\n\thtml(td(a(href(location_by_id(edit_user_form)+'?user='+encode(User)), 'Edit'))).\r\nedit_user_button(_, _) -->\r\n\t[].\r\n\r\non_since(online(Login, _Idle, _Connections)) --> !,\r\n\t{ format_time(string(Date), '%+', Login)\r\n\t},\r\n\thtml(Date).\r\non_since(_) -->\r\n\thtml(-).\r\n\r\nidle(online(_Login, Idle, _Connections)) -->\r\n\t{ mmss_duration(Idle, String)\r\n\t},\r\n\thtml(String).\r\nidle(_) -->\r\n\thtml(-).\r\n\r\n\r\nmmss_duration(Time, String) :-\t\t% Time in seconds\r\n\tSecs is round(Time),\r\n\tHour is Secs // 3600,\r\n\tMin  is (Secs // 60) mod 60,\r\n\tSec  is Secs mod 60,\r\n\tformat(string(String), '~`0t~d~2|:~`0t~d~5|:~`0t~d~8|', [Hour, Min, Sec]).\r\n\r\n\r\n\r\n\t\t /*******************************\r\n\t\t *\t      ADD USERS\t\t*\r\n\t\t *******************************/\r\n\r\n%%\tcreate_admin(+Request)\r\n%\r\n%\tCreate the administrator login.\r\n\r\ncreate_admin(_Request) :-\r\n\t(   current_user(_)\r\n\t->  throw(error(permission_error(create, user, admin),\r\n\t\t\tcontext(_, 'Already initialized')))\r\n\t;   true\r\n\t),\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Create administrator'),\r\n\t\t\t[ h1(align(center), 'Create administrator'),\r\n\r\n\t\t\t  p('No accounts are available on this server. \\c\r\n\t\t\t  This form allows for creation of an administrative \\c\r\n\t\t\t  account that can subsequently be used to create \\c\r\n\t\t\t  new users.'),\r\n\r\n\t\t\t  \\new_user_form([ user(admin),\r\n\t\t\t\t\t   real_name('Administrator')\r\n\t\t\t\t\t ])\r\n\t\t\t]).\r\n\r\n\r\n%%\tadd_user_form(+Request)\r\n%\r\n%\tForm to register a user.\r\n\r\nadd_user_form(_Request) :-\r\n\tauthorized(admin(add_user)),\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Add new user'),\r\n\t\t\t[ \\new_user_form([])\r\n\t\t\t]).\r\n\r\nnew_user_form(Options) -->\r\n\t{ (   option(user(User), Options)\r\n\t  ->  UserOptions = [value(User)],\r\n\t      PermUser = User\r\n\t  ;   UserOptions = [],\r\n\t      PermUser = (-)\r\n\t  )\r\n\t},\r\n\thtml([ h1('Add new user'),\r\n\t       form([ action(location_by_id(add_user)),\r\n\t\t      method('POST')\r\n\t\t    ],\r\n\t\t    table([ class((form))\r\n\t\t\t  ],\r\n\t\t\t  [ \\realname(Options),\r\n\t\t\t    \\input(user,     'Login',\r\n\t\t\t\t   UserOptions),\r\n\t\t\t    \\input(pwd1,     'Password',\r\n\t\t\t\t   [type(password)]),\r\n\t\t\t    \\input(pwd2,     'Retype',\r\n\t\t\t\t   [type(password)]),\r\n\t\t\t    \\permissions(PermUser),\r\n\t\t\t    tr(class(buttons),\r\n\t\t\t       td([ colspan(2),\r\n\t\t\t\t    align(right)\r\n\t\t\t\t  ],\r\n\t\t\t\t  input([ type(submit),\r\n\t\t\t\t\t  value('Create')\r\n\t\t\t\t\t])))\r\n\t\t\t  ]))\r\n\t     ]).\r\n\r\n\r\ninput(Name, Label, Options) -->\r\n\thtml(tr([ th(align(right), Label),\r\n\t\t  td(input([name(Name),size(40)|Options]))\r\n\t\t])).\r\n\r\n%\tOnly provide a realname field if this is not already given. This\r\n%\tis because firefox determines the login user from the text field\r\n%\timmediately above the password entry. Other   browsers may do it\r\n%\tdifferent, so only having one text-field  is probably the savest\r\n%\tsolution.\r\n\r\nrealname(Options) -->\r\n\t{ option(real_name(RealName), Options) }, !,\r\n\thidden(realname, RealName).\r\nrealname(_Options) -->\r\n\tinput(realname, 'Realname', []).\r\n\r\n\r\n%%\tadd_user(+Request)\r\n%\r\n%\tAPI  to  register  a  new  user.  The  current  user  must  have\r\n%\tadministrative rights or the user-database must be empty.\r\n\r\nadd_user(Request) :-\r\n\t(   \\+ current_user(_)\r\n\t->  FirstUser = true\r\n\t;   authorized(admin(add_user))\r\n\t),\r\n\thttp_parameters(Request,\r\n\t\t\t[ user(User),\r\n\t\t\t  realname(RealName),\r\n\t\t\t  pwd1(Password),\r\n\t\t\t  pwd2(Retype),\r\n\t\t\t  read(Read),\r\n\t\t\t  write(Write),\r\n\t\t\t  admin(Admin)\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\t(   current_user(User)\r\n\t->  throw(error(permission_error(create, user, User),\r\n\t\t\tcontext(_, 'Already present')))\r\n\t;   true\r\n\t),\r\n\t(   Password == Retype\r\n\t->  true\r\n\t;   throw(password_mismatch)\r\n\t),\r\n\tpassword_hash(Password, Hash),\r\n\tphrase(allow(Read, Write, Admin), Allow),\r\n\tuser_add(User,\r\n\t\t [ realname(RealName),\r\n\t\t   password(Hash),\r\n\t\t   allow(Allow)\r\n\t\t ]),\r\n\t(   FirstUser == true\r\n\t->  user_add(anonymous,\r\n\t\t     [ realname('Define rights for not-logged in users'),\r\n\t\t       allow([read(_,_)])\r\n\t\t     ]),\r\n\t    reply_login([user(User), password(Password)])\r\n\t;   list_users(Request)\r\n\t).\r\n\r\n%%\tself_register(Request)\r\n%\r\n%\tSelf-register and login a new user if\r\n%\tcliopatria:enable_self_register is set to true.\r\n%       Users are registered with full read\r\n%\tand limited (annotate-only) write access.\r\n%\r\n%\tReturns a HTTP 403 forbidden error if:\r\n%\t- cliopatria:enable_self_register is set to false\r\n%\t- the user already exists\r\n\r\nself_register(Request) :-\r\n\thttp_location_by_id(self_register, MyUrl),\r\n\t(   \\+ setting(cliopatria:enable_self_register, true)\r\n\t->  throw(http_reply(forbidden(MyUrl)))\r\n\t;   true\r\n\t),\r\n\thttp_parameters(Request,\r\n\t\t\t[ user(User),\r\n\t\t\t  realname(RealName),\r\n\t\t\t  password(Password)\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\t(   current_user(User)\r\n\t->  throw(http_reply(forbidden(MyUrl)))\r\n\t;   true\r\n\t),\r\n\tpassword_hash(Password, Hash),\r\n\tAllow = [ read(_,_), write(_,annotate) ],\r\n\tuser_add(User, [realname(RealName), password(Hash), allow(Allow)]),\r\n\treply_login([user(User), password(Password)]).\r\n\r\n\r\n%%\tedit_user_form(+Request)\r\n%\r\n%\tForm to edit user properties\r\n\r\nedit_user_form(Request) :-\r\n\tauthorized(admin(user(edit))),\r\n\thttp_parameters(Request,\r\n\t\t\t[ user(User)\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Edit user'),\r\n\t\t\t\\edit_user_form(User)).\r\n\r\n%%\tedit_user_form(+User)//\r\n%\r\n%\tHTML component to edit the properties of User.\r\n\r\nedit_user_form(User) -->\r\n\t{ user_property(User, realname(RealName))\r\n\t},\r\n\thtml([ h1(['Edit user ', User, ' (', RealName, ')']),\r\n\r\n\t       form([ action(location_by_id(edit_user)),\r\n\t\t      method('POST')\r\n\t\t    ],\r\n\t\t    [ \\hidden(user, User),\r\n\t\t      table([ class((form))\r\n\t\t\t    ],\r\n\t\t\t    [ \\user_property(User, realname, 'Real name', []),\r\n\t\t\t      \\permissions(User),\r\n\t\t\t      tr(class(buttons),\r\n\t\t\t\t td([ colspan(2),\r\n\t\t\t\t      align(right)\r\n\t\t\t\t    ],\r\n\t\t\t\t    input([ type(submit),\r\n\t\t\t\t\t    value('Modify')\r\n\t\t\t\t\t  ])))\r\n\t\t\t    ])\r\n\t\t    ]),\r\n\r\n\t       p(\\action(location_by_id(del_user)+'?user='+encode(User),\r\n\t\t\t [ 'Delete user ', b(User), ' (', i(RealName), ')' ]))\r\n\t     ]).\r\n\r\nuser_property(User, Name, Label, Options) -->\r\n\t{  Term =.. [Name, Value],\r\n\t   user_property(User, Term)\r\n\t-> O2 = [value(Value)|Options]\r\n\t;  O2 = Options\r\n\t},\r\n\thtml(tr([ th(class(p_name), Label),\r\n\t\t  td(input([name(Name),size(40)|O2]))\r\n\t\t])).\r\n\r\npermissions(User) -->\r\n\thtml(tr([ th(class(p_name), 'Permissions'),\r\n\t\t  td([ \\permission_checkbox(User, read,  'Read'),\r\n\t\t       \\permission_checkbox(User, write, 'Write'),\r\n\t\t       \\permission_checkbox(User, admin, 'Admin')\r\n\t\t     ])\r\n\t\t])).\r\n\r\npermission_checkbox(User, Name, Label) -->\r\n\t{ (   User \\== (-),\r\n\t      (\t  user_property(User, allow(Actions))\r\n\t      ->  true\r\n\t      ;\t  openid_server_property(User, allow(Actions))\r\n\t      ),\r\n\t      pterm(Name, Action),\r\n\t      memberchk(Action, Actions)\r\n\t  ->  Opts = [checked]\r\n\t  ;   def_user_permissions(User, DefPermissions),\r\n\t      memberchk(Name, DefPermissions)\r\n\t  ->  Opts = [checked]\r\n\t  ;   Opts = []\r\n\t  )\r\n\t},\r\n\thtml([ input([ type(checkbox),\r\n\t\t       name(Name)\r\n\t\t     | Opts\r\n\t\t     ]),\r\n\t       Label\r\n\t     ]).\r\n\r\ndef_user_permissions(-, [read]).\r\ndef_user_permissions(admin, [read, write, admin]).\r\n\r\n\r\n%%\tedit_user(Request)\r\n%\r\n%\tHandle reply from edit user form.\r\n\r\nedit_user(Request) :-\r\n\tauthorized(admin(user(edit))),\r\n\thttp_parameters(Request,\r\n\t\t\t[ user(User),\r\n\t\t\t  realname(RealName,\r\n\t\t\t\t   [ optional(true),\r\n\t\t\t\t     length > 2,\r\n\t\t\t\t     description('Comment on user identifier-name')\r\n\t\t\t\t   ]),\r\n\t\t\t  read(Read),\r\n\t\t\t  write(Write),\r\n\t\t\t  admin(Admin)\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\tmodify_user(User, realname(RealName)),\r\n\tmodify_permissions(User, Read, Write, Admin),\r\n\tlist_users(Request).\r\n\r\n\r\nmodify_user(User, Property) :-\r\n\tProperty =.. [_Name|Value],\r\n\t(   (   var(Value)\r\n\t    ;\tValue == ''\r\n\t    )\r\n\t->  true\r\n\t;   set_user_property(User, Property)\r\n\t).\r\n\r\nmodify_permissions(User, Read, Write, Admin) :-\r\n\tphrase(allow(Read, Write, Admin), Allow),\r\n\tset_user_property(User, allow(Allow)).\r\n\r\nallow(Read, Write, Admin) -->\r\n\tallow(read, Read),\r\n\tallow(write, Write),\r\n\tallow(admin, Admin).\r\n\r\nallow(Access, on) -->\r\n\t{ pterm(Access, Allow)\r\n\t}, !,\r\n\t[ Allow\r\n\t].\r\nallow(_Access, off) --> !,\r\n\t[].\r\n\r\npterm(read,  read(_Repositiory, _Action)).\r\npterm(write, write(_Repositiory, _Action)).\r\npterm(admin, admin(_Action)).\r\n\r\n\r\n%%\tdel_user(+Request)\r\n%\r\n%\tDelete a user\r\n\r\ndel_user(Request) :- !,\r\n\tauthorized(admin(del_user)),\r\n\thttp_parameters(Request,\r\n\t\t\t[ user(User)\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\t(   User == admin\r\n\t->  throw(error(permission_error(delete, user, User), _))\r\n\t;   true\r\n\t),\r\n\tuser_del(User),\r\n\tlist_users(Request).\r\n\r\n\r\n%%\tchange_password_form(+Request)\r\n%\r\n%\tAllow user to change the password\r\n\r\nchange_password_form(_Request) :-\r\n\tlogged_on(User), !,\r\n\tuser_property(User, realname(RealName)),\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Change password'),\r\n\t\t\t[ h1(['Change password for ', User, ' (', RealName, ')']),\r\n\r\n\t\t\t  \\change_password_form(User)\r\n\t\t\t]).\r\nchange_password_form(_Request) :-\r\n\tthrow(error(context_error(not_logged_in), _)).\r\n\r\n\r\n%%\tchange_password_form(+UserID)//\r\n%\r\n%\tHTML component that shows a form   for changing the password for\r\n%\tUserID.\r\n\r\nchange_password_form(User) -->\r\n\thtml(form([ action(location_by_id(change_password)),\r\n\t\t    method('POST')\r\n\t\t  ],\r\n\t\t  [ table([ id('change-password-form'),\r\n\t\t\t    class(form)\r\n\t\t\t  ],\r\n\t\t\t  [ \\user_or_old(User),\r\n\t\t\t    \\input(pwd1,     'New Password',\r\n\t\t\t\t   [type(password)]),\r\n\t\t\t    \\input(pwd2,     'Retype',\r\n\t\t\t\t   [type(password)]),\r\n\t\t\t    tr(class(buttons),\r\n\t\t\t       td([ align(right),\r\n\t\t\t\t    colspan(2)\r\n\t\t\t\t  ],\r\n\t\t\t\t  input([ type(submit),\r\n\t\t\t\t\t  value('Change password')\r\n\t\t\t\t\t])))\r\n\t\t\t  ])\r\n\t\t  ])).\r\n\r\nuser_or_old(admin) --> !,\r\n\tinput(user, 'User', []).\r\nuser_or_old(_) -->\r\n\tinput(pwd0, 'Old password', [type(password)]).\r\n\r\n\r\n%%\tchange_password(+Request)\r\n%\r\n%\tHTTP handler to change the password. The user must be logged on.\r\n\r\nchange_password(Request) :-\r\n\tlogged_on(Login), !,\r\n\thttp_parameters(Request,\r\n\t\t\t[ user(User,     [ optional(true),\r\n\t\t\t\t\t   description('User identifier-name')\r\n\t\t\t\t\t ]),\r\n\t\t\t  pwd0(Password, [ optional(true),\r\n\t\t\t\t\t   description('Current password')\r\n\t\t\t\t\t ]),\r\n\t\t\t  pwd1(New),\r\n\t\t\t  pwd2(Retype)\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\t(   Login == admin\r\n\t->  (   current_user(User)\r\n\t    ->\ttrue\r\n\t    ;\tthrow(error(existence_error(user, User), _))\r\n\t    )\r\n\t;   Login = User,\r\n\t    validate_password(User, Password)\r\n\t),\r\n\t(   New == Retype\r\n\t->  true\r\n\t;   throw(password_mismatch)\r\n\t),\r\n\tpassword_hash(New, Hash),\r\n\tset_user_property(User, password(Hash)),\r\n\treply_html_page(cliopatria(default),\r\n\t\t\t'Password changed',\r\n\t\t\t[ h1(align(center), 'Password changed'),\r\n\t\t\t  p([ 'Your password has been changed successfully' ])\r\n\t\t\t]).\r\nchange_password(_Request) :-\r\n\tthrow(error(context_error(not_logged_in), _)).\r\n\r\n\r\n\r\n\t\t /*******************************\r\n\t\t *\t       LOGIN\t\t*\r\n\t\t *******************************/\r\n\r\n%%\tlogin_form(+Request)\r\n%\r\n%\tHTTP handler that presents a form to login.\r\n\r\nlogin_form(_Request) :-\r\n\treply_html_page(cliopatria(default),\r\n\t\t\t'Login',\r\n\t\t\t[ h1(align(center), 'Login'),\r\n\t\t\t  form([ action(location_by_id(user_login)),\r\n\t\t\t\t method('POST')\r\n\t\t\t       ],\r\n\t\t\t       table([ tr([ th(align(right), 'User:'),\r\n\t\t\t\t\t    td(input([ name(user),\r\n\t\t\t\t\t\t       size(40)\r\n\t\t\t\t\t\t     ]))\r\n\t\t\t\t\t  ]),\r\n\t\t\t\t       tr([ th(align(right), 'Password:'),\r\n\t\t\t\t\t    td(input([ type(password),\r\n\t\t\t\t\t\t       name(password),\r\n\t\t\t\t\t\t       size(40)\r\n\t\t\t\t\t\t     ]))\r\n\t\t\t\t\t  ]),\r\n\t\t\t\t       tr([ td([ align(right), colspan(2) ],\r\n\t\t\t\t\t       input([ type(submit),\r\n\t\t\t\t\t\t       value('Login')\r\n\t\t\t\t\t\t     ]))\r\n\t\t\t\t\t  ])\r\n\t\t\t\t     ])\r\n\t\t\t      )\r\n\t\t\t]).\r\n\r\n%%\tuser_login(+Request)\r\n%\r\n%\tHandle  =user=  and  =password=.  If    there   is  a  parameter\r\n%\t=return_to= or =|openid.return_to|=, reply using   a redirect to\r\n%\tthe given URL. Otherwise display a welcome page.\r\n\r\nuser_login(Request) :- !,\r\n\thttp_parameters(Request,\r\n\t\t\t[ user(User),\r\n\t\t\t  password(Password),\r\n\t\t\t  'openid.return_to'(ReturnTo, [optional(true)]),\r\n\t\t\t  'return_to'(ReturnTo, [optional(true)])\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\t(   var(ReturnTo)\r\n\t->  Extra = []\r\n\t;   Extra = [ return_to(ReturnTo) ]\r\n\t),\r\n\treply_login([ user(User),\r\n\t\t      password(Password)\r\n\t\t    | Extra\r\n\t\t    ]).\r\n\r\n\r\nreply_login(Options) :-\r\n\toption(user(User), Options),\r\n\toption(password(Password), Options),\r\n\tvalidate_password(User, Password), !,\r\n\tlogin(User),\r\n\t(   option(return_to(ReturnTo), Options)\r\n\t->  throw(http_reply(moved_temporary(ReturnTo)))\r\n\t;   reply_html_page(cliopatria(default),\r\n\t\t\t    title('Login ok'),\r\n\t\t\t    h1(align(center), ['Welcome ', User]))\r\n\t).\r\nreply_login(_) :-\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Login failed'),\r\n\t\t\t[ h1('Login failed'),\r\n\t\t\t  p(['Password incorrect'])\r\n\t\t\t]).\r\n\r\n%%\tuser_logout(+Request)\r\n%\r\n%\tLogout the current user\r\n\r\nuser_logout(_Request) :-\r\n\tlogged_on(User), !,\r\n\tlogout(User),\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Logout'),\r\n\t\t\th1(align(center), ['Logged out ', User])).\r\nuser_logout(_Request) :-\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Logout'),\r\n\t\t\t[ h1(align(center), ['Not logged on']),\r\n\t\t\t  p(['Possibly you are logged out because the session ',\r\n\t\t\t     'has timed out.'])\r\n\t\t\t]).\r\n\r\n%%\tattribute_decl(+Param, -DeclObtions) is semidet.\r\n%\r\n%\tProvide   reusable   parameter   declarations   for   calls   to\r\n%\thttp_parameters/3.\r\n\r\nattribute_decl(user,\r\n\t       [ description('User identifier-name'),\r\n\t\t length > 1\r\n\t       ]).\r\nattribute_decl(realname,\r\n\t       [ description('Comment on user identifier-name')\r\n\t       ]).\r\nattribute_decl(description,\r\n\t       [ optional(true),\r\n\t\t description('Descriptive text')\r\n\t       ]).\r\nattribute_decl(password,\r\n\t       [ description('Password')\r\n\t       ]).\r\nattribute_decl(pwd1,\r\n\t       [ length > 5,\r\n\t\t description('Password')\r\n\t       ]).\r\nattribute_decl(pwd2,\r\n\t       [ length > 5,\r\n\t\t description('Re-typed password')\r\n\t       ]).\r\nattribute_decl(openid_server,\r\n\t       [ description('URL of an OpenID server')\r\n\t       ]).\r\nattribute_decl(read,\r\n\t       [ description('Provide read-only access to the RDF store')\r\n\t       | Options])   :- bool(off, Options).\r\nattribute_decl(write,\r\n\t       [ description('Provide write access to the RDF store')\r\n\t       | Options])   :- bool(off, Options).\r\nattribute_decl(admin,\r\n\t       [ description('Provide administrative rights')\r\n\t       | Options])   :- bool(off, Options).\r\n\r\nbool(Def,\r\n     [ default(Def),\r\n       oneof([on, off])\r\n     ]).\r\n\r\n\r\n\t\t /*******************************\r\n\t\t *\t    OPENID ADMIN\t*\r\n\t\t *******************************/\r\n\r\n%%\tadd_openid_server_form(+Request)\r\n%\r\n%\tReturn an HTML page to add a new OpenID server.\r\n\r\nadd_openid_server_form(_Request) :-\r\n\tauthorized(admin(add_openid_server)),\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Add OpenID server'),\r\n\t\t\t[ \\new_openid_form\r\n\t\t\t]).\r\n\r\n\r\n%%\tnew_openid_form// is det.\r\n%\r\n%\tPresent form to add a new OpenID provider.\r\n\r\nnew_openid_form -->\r\n\thtml([ h1('Add new OpenID server'),\r\n\t       form([ action(location_by_id(add_openid_server)),\r\n\t\t      method('GET')\r\n\t\t    ],\r\n\t\t    table([ id('add-openid-server'),\r\n\t\t\t    class(form)\r\n\t\t\t  ],\r\n\t\t\t  [ \\input(openid_server, 'Server homepage', []),\r\n\t\t\t    \\input(openid_description, 'Server description',\r\n\t\t\t\t   []),\r\n\t\t\t    \\permissions(-),\r\n\t\t\t    tr(class(buttons),\r\n\t\t\t       td([ colspan(2),\r\n\t\t\t\t    align(right)\r\n\t\t\t\t  ],\r\n\t\t\t\t  input([ type(submit),\r\n\t\t\t\t\t  value('Create')\r\n\t\t\t\t\t])))\r\n\t\t\t  ])),\r\n\t       p([ 'Use this form to define access rights for users of an ',\r\n\t\t   a(href('http://www.openid.net'), 'OpenID'), ' server. ',\r\n\t\t   'The special server ', code(*), ' specifies access for all OpenID servers. ',\r\n\t\t   'Here are some examples of servers:'\r\n\t\t ]),\r\n\t       ul([ li(code('http://myopenid.com'))\r\n\t\t  ])\r\n\t     ]).\r\n\r\n\r\n%%\tadd_openid_server(+Request)\r\n%\r\n%\tAllow access from an OpenID server\r\n\r\nadd_openid_server(Request) :-\r\n\tauthorized(admin(add_openid_server)),\r\n\thttp_parameters(Request,\r\n\t\t\t[ openid_server(Server0,\r\n\t\t\t\t\t[ description('URL of the server to allow')]),\r\n\t\t\t  openid_description(Description,\r\n\t\t\t\t\t     [ optional(true),\r\n\t\t\t\t\t       description('Description of the server')\r\n\t\t\t\t\t     ]),\r\n\t\t\t  read(Read),\r\n\t\t\t  write(Write)\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\tphrase(allow(Read, Write, off), Allow),\r\n\tcanonical_url(Server0, Server),\r\n\tOptions = [ description(Description),\r\n\t\t    allow(Allow)\r\n\t\t  ],\r\n\tremove_optional(Options, Properties),\r\n\topenid_add_server(Server, Properties),\r\n\tlist_users(Request).\r\n\r\nremove_optional([], []).\r\nremove_optional([H|T0], [H|T]) :-\r\n\targ(1, H, A),\r\n\tnonvar(A), !,\r\n\tremove_optional(T0, T).\r\nremove_optional([_|T0], T) :-\r\n\tremove_optional(T0, T).\r\n\r\n\r\ncanonical_url(Var, Var) :-\r\n\tvar(Var), !.\r\ncanonical_url(*, *) :- !.\r\ncanonical_url(URL0, URL) :-\r\n\tparse_url(URL0, Parts),\r\n\tparse_url(URL, Parts).\r\n\r\n\r\n%%\tedit_openid_server_form(+Request)\r\n%\r\n%\tForm to edit user properties\r\n\r\nedit_openid_server_form(Request) :-\r\n\tauthorized(admin(openid(edit))),\r\n\thttp_parameters(Request,\r\n\t\t\t[ openid_server(Server)\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Edit OpenID server'),\r\n\t\t\t\\edit_openid_server_form(Server)).\r\n\r\nedit_openid_server_form(Server) -->\r\n\thtml([ h1(['Edit OpenID server ', Server]),\r\n\r\n\t       form([ action(location_by_id(edit_openid_server)),\r\n\t\t      method('GET')\r\n\t\t    ],\r\n\t\t    [ \\hidden(openid_server, Server),\r\n\t\t      table([ class(form)\r\n\t\t\t    ],\r\n\t\t\t    [ \\openid_property(Server, description, 'Description', []),\r\n\t\t\t      \\permissions(Server),\r\n\t\t\t      tr(class(buttons),\r\n\t\t\t\t td([ colspan(2),\r\n\t\t\t\t      align(right)\r\n\t\t\t\t    ],\r\n\t\t\t\t    input([ type(submit),\r\n\t\t\t\t\t    value('Modify')\r\n\t\t\t\t\t  ])))\r\n\t\t\t    ])\r\n\t\t    ]),\r\n\r\n\t       p(\\action(location_by_id(del_openid_server) +\r\n\t\t\t '?openid_server=' + encode(Server),\r\n\t\t\t [ 'Delete ', b(Server) ]))\r\n\t     ]).\r\n\r\n\r\nopenid_property(Server, Name, Label, Options) -->\r\n\t{  Term =.. [Name, Value],\r\n\t   openid_server_property(Server, Term)\r\n\t-> O2 = [value(Value)|Options]\r\n\t;  O2 = Options\r\n\t},\r\n\thtml(tr([ th(align(right), Label),\r\n\t\t  td(input([name(Name),size(40)|O2]))\r\n\t\t])).\r\n\r\n\r\n%%\topenid_server_table(+Options)//\r\n%\r\n%\tList registered openid servers\r\n\r\nopenid_server_table(Options) -->\r\n\t{ setof(S, openid_current_server(S), Servers), !\r\n\t},\r\n\thtml([ table([ class(block)\r\n\t\t     ],\r\n\t\t     [ tr([ th('Server'),\r\n\t\t\t    th('Description')\r\n\t\t\t  ])\r\n\t\t     | \\openid_list_servers(Servers, Options)\r\n\t\t     ])\r\n\t     ]).\r\nopenid_server_table(_) -->\r\n\t[].\r\n\r\nopenid_list_servers([], _) -->\r\n\t[].\r\nopenid_list_servers([H|T], Options) -->\r\n\topenid_list_server(H, Options),\r\n\topenid_list_servers(T, Options).\r\n\r\nopenid_list_server(Server, Options) -->\r\n\thtml(tr([td(\\openid_server(Server)),\r\n\t\t td(\\openid_field(Server, description)),\r\n\t\t \\edit_openid_button(Server, Options)\r\n\t\t])).\r\n\r\nedit_openid_button(Server, Options) -->\r\n\t{ option(edit(true), Options) }, !,\r\n\thtml(td(a(href(location_by_id(edit_openid_server_form) +\r\n\t\t       '?openid_server='+encode(Server)\r\n\t\t      ), 'Edit'))).\r\nedit_openid_button(_, _) --> [].\r\n\r\n\r\n\r\nopenid_server(*) --> !,\r\n\thtml(*).\r\nopenid_server(Server) -->\r\n\thtml(a(href(Server), Server)).\r\n\r\nopenid_field(Server, Field) -->\r\n\t{ Term =.. [Field, Value],\r\n\t  openid_server_property(Server, Term)\r\n\t}, !,\r\n\thtml(Value).\r\nopenid_field(_, _) -->\r\n\t[].\r\n\r\n\r\n%%\tedit_openid_server(Request)\r\n%\r\n%\tHandle reply from OpenID server form.\r\n\r\nedit_openid_server(Request) :-\r\n\tauthorized(admin(openid(edit))),\r\n\thttp_parameters(Request,\r\n\t\t\t[ openid_server(Server),\r\n\t\t\t  description(Description),\r\n\t\t\t  read(Read),\r\n\t\t\t  write(Write),\r\n\t\t\t  admin(Admin)\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\tmodify_openid(Server, description(Description)),\r\n\topenid_modify_permissions(Server, Read, Write, Admin),\r\n\tlist_users(Request).\r\n\r\n\r\nmodify_openid(User, Property) :-\r\n\tProperty =.. [_Name|Value],\r\n\t(   (   var(Value)\r\n\t    ;\tValue == ''\r\n\t    )\r\n\t->  true\r\n\t;   openid_set_property(User, Property)\r\n\t).\r\n\r\n\r\nopenid_modify_permissions(Server, Read, Write, Admin) :-\r\n\tphrase(allow(Read, Write, Admin), Allow),\r\n\topenid_set_property(Server, allow(Allow)).\r\n\r\n\r\n%%\tdel_openid_server(+Request)\r\n%\r\n%\tDelete an OpenID Server\r\n\r\ndel_openid_server(Request) :- !,\r\n\tauthorized(admin(openid(delete))),\r\n\thttp_parameters(Request,\r\n\t\t\t[ openid_server(Server)\r\n\t\t\t],\r\n\t\t\t[ attribute_declarations(attribute_decl)\r\n\t\t\t]),\r\n\topenid_del_server(Server),\r\n\tlist_users(Request).\r\n\r\n\r\n\t\t /*******************************\r\n\t\t *\t       SETTINGS\t\t*\r\n\t\t *******************************/\r\n\r\n%%\tsettings(+Request)\r\n%\r\n%\tShow current settings. If user  has administrative rights, allow\r\n%\tediting the settings.\r\n\r\nsettings(_Request) :-\r\n\t(   catch(authorized(admin(edit_settings)), _, fail)\r\n\t->  Edit = true\r\n\t;   authorized(read(admin, settings)),\r\n\t    Edit = false\r\n\t),\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Settings'),\r\n\t\t\t[ h1('Application settings'),\r\n\t\t\t  \\http_show_settings([ edit(Edit),\r\n\t\t\t\t\t\thide_module(false),\r\n\t\t\t\t\t\taction('save_settings')\r\n\t\t\t\t\t      ]),\r\n\t\t\t  \\warn_no_edit(Edit)\r\n\t\t\t]).\r\n\r\nwarn_no_edit(true) --> !.\r\nwarn_no_edit(_) -->\r\n\thtml(p(id(settings_no_edit),\r\n\t       [ a(href(location_by_id(login_form)), 'Login'),\r\n\t\t ' as ', code(admin), ' to edit the settings.' ])).\r\n\r\n%%\tsave_settings(+Request)\r\n%\r\n%\tSave modified settings.\r\n\r\nsave_settings(Request) :-\r\n\tauthorized(admin(edit_settings)),\r\n\treply_html_page(cliopatria(default),\r\n\t\t\ttitle('Save settings'),\r\n\t\t\t\\http_apply_settings(Request, [save(true)])).\r\n\r\n\r\n\t\t /*******************************\r\n\t\t *\t\tEMIT\t\t*\r\n\t\t *******************************/\r\n\r\n%%\thidden(+Name, +Value)\r\n%\r\n%\tCreate a hidden input field with given name and value\r\n\r\nhidden(Name, Value) -->\r\n\thtml(input([ type(hidden),\r\n\t\t     name(Name),\r\n\t\t     value(Value)\r\n\t\t   ])).\r\n\r\naction(URL, Label) -->\r\n\thtml([a([href(URL)], Label), br([])]).\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Prolog/dleak-report",
    "content": "#!/usr/bin/env swipl\n\n:- set_prolog_flag(verbose, silent).\n:- use_module(dleak).\n\n:- initialization\n\tmain, halt.\n\nmain :-\n\tcurrent_prolog_flag(argv, [File]),\n\tdleak(File).\n"
  },
  {
    "path": "src/test/resources/samples/langs/Prolog/ex6.pl",
    "content": "%6.8\nsubset(Set, Subset) :-\n\tappend(L1, Subset, Set).\npowerset(Set, Subset) :-\n\tbagof(Subset, subset(Set, Subset), Subset).\n"
  },
  {
    "path": "src/test/resources/samples/langs/Prolog/format_spec.pl",
    "content": ":- module(format_spec, [ format_error/2\n                       , format_spec/2\n                       , format_spec//1\n                       , spec_arity/2\n                       , spec_types/2\n                       ]).\n\n:- use_module(library(dcg/basics), [eos//0, integer//1, string_without//2]).\n:- use_module(library(error)).\n:- use_module(library(when), [when/2]).\n\n% TODO loading this module is optional\n% TODO it's for my own convenience during development\n%:- use_module(library(mavis)).\n\n%% format_error(+Goal, -Error:string) is nondet.\n%\n%  True if Goal exhibits an Error in its format string. The\n%  Error string describes what is wrong with Goal. Iterates each\n%  error on backtracking.\n%\n%  Goal may be one of the following predicates:\n%\n%    * format/2\n%    * format/3\n%    * debug/3\nformat_error(format(Format,Args), Error) :-\n    format_error_(Format, Args,Error).\nformat_error(format(_,Format,Args), Error) :-\n    format_error_(Format,Args,Error).\nformat_error(debug(_,Format,Args), Error) :-\n    format_error_(Format,Args,Error).\n\nformat_error_(Format,Args,Error) :-\n    format_spec(Format, Spec),\n    !,\n    is_list(Args),\n    spec_types(Spec, Types),\n    types_error(Args, Types, Error).\nformat_error_(Format,_,Error) :-\n    % \\+ format_spec(Format, _),\n    format(string(Error), \"Invalid format string: ~q\", [Format]).\n\ntypes_error(Args, Types, Error) :-\n    length(Types, TypesLen),\n    length(Args, ArgsLen),\n    TypesLen =\\= ArgsLen,\n    !,\n    format( string(Error)\n          , \"Wrong argument count. Expected ~d, got ~d\"\n          , [TypesLen, ArgsLen]\n          ).\ntypes_error(Args, Types, Error) :-\n    types_error_(Args, Types, Error).\n\ntypes_error_([Arg|_],[Type|_],Error) :-\n    ground(Arg),\n    \\+ is_of_type(Type,Arg),\n    message_to_string(error(type_error(Type,Arg),_Location),Error).\ntypes_error_([_|Args],[_|Types],Error) :-\n    types_error_(Args, Types, Error).\n\n\n% check/0 augmentation\n:- multifile check:checker/2.\n:- dynamic check:checker/2.\ncheck:checker(format_spec:checker, \"format/2 strings and arguments\").\n\n:- dynamic format_fail/3.\n\nchecker :-\n    prolog_walk_code([ module_class([user])\n                     , infer_meta_predicates(false)\n                     , autoload(false)  % format/{2,3} are always loaded\n                     , undefined(ignore)\n                     , trace_reference(_)\n                     , on_trace(check_format)\n                     ]),\n    retract(format_fail(Goal,Location,Error)),\n    print_message(warning, format_error(Goal,Location,Error)),\n    fail.  % iterate all errors\nchecker.  % succeed even if no errors are found\n\ncheck_format(Module:Goal, _Caller, Location) :-\n    predicate_property(Module:Goal, imported_from(Source)),\n    memberchk(Source, [system,prolog_debug]),\n    can_check(Goal),\n    format_error(Goal, Error),\n    assert(format_fail(Goal, Location, Error)),\n    fail.\ncheck_format(_,_,_).  % succeed to avoid printing goals\n\n% true if format_error/2 can check this goal\ncan_check(Goal) :-\n    once(clause(format_error(Goal,_),_)).\n\nprolog:message(format_error(Goal,Location,Error)) -->\n    prolog:message_location(Location),\n    ['~n    In goal: ~q~n    ~s'-[Goal,Error]].\n\n\n%% format_spec(-Spec)//\n%\n%  DCG for parsing format strings. It doesn't yet generate format\n%  strings from a spec.  See format_spec/2 for details.\nformat_spec([]) -->\n    eos.\nformat_spec([escape(Numeric,Modifier,Action)|Rest]) -->\n    \"~\",\n    numeric_argument(Numeric),\n    modifier_argument(Modifier),\n    action(Action),\n    format_spec(Rest).\nformat_spec([text(String)|Rest]) -->\n    { when((ground(String);ground(Codes)),string_codes(String, Codes)) },\n    string_without(\"~\", Codes),\n    { Codes \\= [] },\n    format_spec(Rest).\n\n\n%% format_spec(+Format, -Spec:list) is semidet.\n%\n%  Parse a format string.  Each element of Spec is one of the following:\n%\n%    * `text(Text)` - text sent to the output as is\n%    * `escape(Num,Colon,Action)` - a format escape\n%\n%  `Num` represents the optional numeric portion of an esape. `Colon`\n%  represents the optional colon in an escape. `Action` is an atom\n%  representing the action to be take by this escape.\nformat_spec(Format, Spec) :-\n    when((ground(Format);ground(Codes)),text_codes(Format, Codes)),\n    once(phrase(format_spec(Spec), Codes, [])).\n\n%% spec_arity(+FormatSpec, -Arity:positive_integer) is det.\n%\n%  True if FormatSpec requires format/2 to have Arity arguments.\nspec_arity(Spec, Arity) :-\n    spec_types(Spec, Types),\n    length(Types, Arity).\n\n\n%% spec_types(+FormatSpec, -Types:list(type)) is det.\n%\n%  True if FormatSpec requires format/2 to have arguments of Types. Each\n%  value of Types is a type as described by error:has_type/2. This\n%  notion of types is compatible with library(mavis).\nspec_types(Spec, Types) :-\n    phrase(spec_types(Spec), Types).\n\nspec_types([]) -->\n    [].\nspec_types([Item|Items]) -->\n    item_types(Item),\n    spec_types(Items).\n\nitem_types(text(_)) -->\n    [].\nitem_types(escape(Numeric,_,Action)) -->\n    numeric_types(Numeric),\n    action_types(Action).\n\nnumeric_types(number(_)) -->\n    [].\nnumeric_types(character(_)) -->\n    [].\nnumeric_types(star) -->\n    [number].\nnumeric_types(nothing) -->\n    [].\n\naction_types(Action) -->\n    { atom_codes(Action, [Code]) },\n    { action_types(Code, Types) },\n    phrase(Types).\n\n\n%% text_codes(Text:text, Codes:codes).\ntext_codes(Var, Codes) :-\n    var(Var),\n    !,\n    string_codes(Var, Codes).\ntext_codes(Atom, Codes) :-\n    atom(Atom),\n    !,\n    atom_codes(Atom, Codes).\ntext_codes(String, Codes) :-\n    string(String),\n    !,\n    string_codes(String, Codes).\ntext_codes(Codes, Codes) :-\n    is_of_type(codes, Codes).\n\n\nnumeric_argument(number(N)) -->\n    integer(N).\nnumeric_argument(character(C)) -->\n    \"`\",\n    [C].\nnumeric_argument(star) -->\n    \"*\".\nnumeric_argument(nothing) -->\n    \"\".\n\n\nmodifier_argument(colon) -->\n    \":\".\nmodifier_argument(no_colon) -->\n    \\+ \":\".\n\n\naction(Action) -->\n    [C],\n    { is_action(C) },\n    { atom_codes(Action, [C]) }.\n\n\n%% is_action(+Action:integer) is semidet.\n%% is_action(-Action:integer) is multi.\n%\n%  True if Action is a valid format/2 action character. Iterates all\n%  acceptable action characters, if Action is unbound.\nis_action(Action) :-\n    action_types(Action, _).\n\n%% action_types(?Action:integer, ?Types:list(type))\n%\n%  True if Action consumes arguments matching Types. An action (like\n%  `~`), which consumes no arguments, has `Types=[]`.  For example,\n%\n%      ?- action_types(0'~, Types).\n%      Types = [].\n%      ?- action_types(0'a, Types).\n%      Types = [atom].\naction_types(0'~, []).\naction_types(0'a, [atom]).\naction_types(0'c, [integer]).  % specifically, a code\naction_types(0'd, [integer]).\naction_types(0'D, [integer]).\naction_types(0'e, [float]).\naction_types(0'E, [float]).\naction_types(0'f, [float]).\naction_types(0'g, [float]).\naction_types(0'G, [float]).\naction_types(0'i, [any]).\naction_types(0'I, [integer]).\naction_types(0'k, [any]).\naction_types(0'n, []).\naction_types(0'N, []).\naction_types(0'p, [any]).\naction_types(0'q, [any]).\naction_types(0'r, [integer]).\naction_types(0'R, [integer]).\naction_types(0's, [text]).\naction_types(0'@, [callable]).\naction_types(0't, []).\naction_types(0'|, []).\naction_types(0'+, []).\naction_types(0'w, [any]).\naction_types(0'W, [any, list]).\n"
  },
  {
    "path": "src/test/resources/samples/langs/Prolog/func.pl",
    "content": ":- module(func, [ op(675, xfy, ($))\n                , op(650, xfy, (of))\n                , ($)/2\n                , (of)/2\n                ]).\n:- use_module(library(list_util), [xfy_list/3]).\n:- use_module(library(function_expansion)).\n:- use_module(library(arithmetic)).\n:- use_module(library(error)).\n\n\n% true if the module whose terms are being read has specifically\n% imported library(func).\nwants_func :-\n    prolog_load_context(module, Module),\n    Module \\== func,  % we don't want func sugar ourselves\n    predicate_property(Module:of(_,_),imported_from(func)).\n\n\n%%  compile_function(+Term, -In, -Out, -Goal) is semidet.\n%\n%   True if Term represents a function from In to Out\n%   implemented by calling Goal.  This multifile hook is\n%   called by $/2 and of/2 to convert a term into a goal.\n%   It's used at compile time for macro expansion.\n%   It's used at run time to handle functions which aren't\n%   known at compile time.\n%   When called as a hook, Term is guaranteed to be =nonvar=.\n%\n%   For example, to treat library(assoc) terms as functions which\n%   map a key to a value, one might define:\n%\n%       :- multifile compile_function/4.\n%       compile_function(Assoc, Key, Value, Goal) :-\n%           is_assoc(Assoc),\n%           Goal = get_assoc(Key, Assoc, Value).\n%\n%   Then one could write:\n%\n%       list_to_assoc([a-1, b-2, c-3], Assoc),\n%       Two = Assoc $ b,\n:- multifile compile_function/4.\ncompile_function(Var, _, _, _) :-\n    % variables storing functions must be evaluated at run time\n    % and can't be compiled, a priori, into a goal\n    var(Var),\n    !,\n    fail.\ncompile_function(Expr, In, Out, Out is Expr) :-\n    % arithmetic expression of one variable are simply evaluated\n    \\+ string(Expr),  % evaluable/1 throws exception with strings\n    arithmetic:evaluable(Expr),\n    term_variables(Expr, [In]).\ncompile_function(F, In, Out, func:Goal) :-\n    % composed functions\n    function_composition_term(F),\n    user:function_expansion(F, func:Functor, true),\n    Goal =.. [Functor,In,Out].\ncompile_function(F, In, Out, Goal) :-\n    % string interpolation via format templates\n    format_template(F),\n    ( atom(F) ->\n        Goal = format(atom(Out), F, In)\n    ; string(F) ->\n        Goal = format(string(Out), F, In)\n    ; error:has_type(codes, F) ->\n        Goal = format(codes(Out), F, In)\n    ; fail  % to be explicit\n    ).\ncompile_function(Dict, In, Out, Goal) :-\n    is_dict(Dict),\n    Goal = get_dict(In, Dict, Out).\n\n%%\t$(+Function, +Argument) is det.\n%\n%\tApply Function to an Argument.  A Function is any predicate\n%\twhose final argument generates output and whose penultimate argument\n%\taccepts input.\n%\n%\tThis is realized by expanding function application to chained\n%\tpredicate calls at compile time.  Function application itself can\n%\tbe chained.\n%\n%\t==\n%\tReversed = reverse $ sort $ [c,d,b].\n%\t==\n:- meta_predicate $(2,+).\n$(_,_) :-\n    throw(error(permission_error(call, predicate, ($)/2),\n          context(_, '$/2 must be subject to goal expansion'))).\n\nuser:function_expansion($(F,X), Y, Goal) :-\n    wants_func,\n    ( func:compile_function(F, X, Y, Goal) ->\n        true\n    ; var(F) -> Goal =      % defer until run time\n        ( func:compile_function(F, X, Y, P) ->\n            call(P)\n        ; call(F, X, Y)\n        )\n    ; Goal = call(F, X, Y)\n    ).\n\n\n%%\tof(+F, +G) is det.\n%\n%\tCreates a new function by composing F and G.  The functions are\n%\tcomposed at compile time to create a new, compiled predicate which\n%\tbehaves like a function.  Function composition can be chained.\n%\tComposed functions can also be applied with $/2.\n%\n%\t==\n%\tReversed = reverse of sort $ [c,d,b].\n%\t==\n:- meta_predicate of(2,2).\nof(_,_).\n\n\n%%  format_template(Format) is semidet.\n%\n%   True if Format is a template string suitable for format/3.\n%   The current check is very naive and should be improved.\nformat_template(Format) :-\n    atom(Format), !,\n    atom_codes(Format, Codes),\n    format_template(Codes).\nformat_template(Format) :-\n    string(Format),\n    !,\n    string_codes(Format, Codes),\n    format_template(Codes).\nformat_template(Format) :-\n    error:has_type(codes, Format),\n    memberchk(0'~, Format).  % ' fix syntax highlighting\n\n\n% True if the argument is a function composition term\nfunction_composition_term(of(_,_)).\n\n% Converts a function composition term into a list of functions to compose\nfunctions_to_compose(Term, Funcs) :-\n    functor(Term, Op, 2),\n    Op = (of),\n    xfy_list(Op, Term, Funcs).\n\n% Thread a state variable through a list of functions.  This is similar\n% to a DCG expansion, but much simpler.\nthread_state([], [], Out, Out).\nthread_state([F|Funcs], [Goal|Goals], In, Out) :-\n    ( compile_function(F, In, Tmp, Goal) ->\n        true\n    ; var(F) ->\n        instantiation_error(F)\n    ; F =.. [Functor|Args],\n      append(Args, [In, Tmp], NewArgs),\n      Goal =.. [Functor|NewArgs]\n    ),\n    thread_state(Funcs, Goals, Tmp, Out).\n\nuser:function_expansion(Term, func:Functor, true) :-\n    wants_func,\n    functions_to_compose(Term, Funcs),\n    debug(func, 'building composed function for: ~w', [Term]),\n    variant_sha1(Funcs, Sha),\n    format(atom(Functor), 'composed_function_~w', [Sha]),\n    debug(func, '  name: ~s', [Functor]),\n    ( func:current_predicate(Functor/2) ->\n        debug(func, '  composed predicate already exists', [])\n    ; true ->\n        reverse(Funcs, RevFuncs),\n        thread_state(RevFuncs, Threaded, In, Out),\n        xfy_list(',', Body, Threaded),\n        Head =.. [Functor, In, Out],\n        func:assert(Head :- Body),\n        func:compile_predicates([Functor/2])\n    ).\n\n\n% support foo(x,~,y) evaluation\nuser:function_expansion(Term, Output, Goal) :-\n    wants_func,\n    compound(Term),\n\n    % has a single ~ argument\n    setof( X\n         , ( arg(X,Term,Arg), Arg == '~' )\n         , [N]\n         ),\n\n    % replace ~ with a variable\n    Term =.. [Name|Args0],\n    nth1(N, Args0, ~, Rest),\n    nth1(N, Args, Output, Rest),\n    Goal =.. [Name|Args].\n"
  },
  {
    "path": "src/test/resources/samples/langs/Prolog/logic-problem.pro",
    "content": "/**\n * Question 1.1\n * combiner(+Buddies, -Pairs)\n */\ncombiner([], []).\ncombiner([First|Buddies], Pairs):-\n\tmake_pairs(First, Buddies, Pairs1),\n\tcombiner(Buddies, Pairs2),\n\tconcat(Pairs1, Pairs2, Pairs).\n\n/**\n * make_pairs(+Buddy, +Buddies, -Pairs)\n */\nmake_pairs(Buddy, [], []).\nmake_pairs(Buddy, [First|Buddies], [(Buddy, First)|Pairs]):-\n\tmake_pairs(Buddy, Buddies, Pairs).\n\n/**\n * concat(+X, +Y, ?T)\n */\nconcat([], Y, Y).\nconcat([P|R], Y, [P|T]):-\n\tconcat(R, Y, T).\n\n\n/**\n * Question 1.2\n * extraire(+AllPossiblePairs, +NbPairs, -Tp, -RemainingPairs)\n */\nextraire(AllPossiblePairs, 0, [], AllPossiblePairs).\nextraire([PossiblePair|AllPossiblePairs], NbPairs, [PossiblePair|Tp], NewRemainingPairs):-\n\tNbPairs > 0,\n\tNewNbPairs is NbPairs - 1,\n\textraire(AllPossiblePairs, NewNbPairs, Tp, RemainingPairs),\n\tnot(pair_in_array(PossiblePair, Tp)),\n\tdelete_pair(RemainingPairs, PossiblePair, NewRemainingPairs).\nextraire([PossiblePair|AllPossiblePairs], NbPairs, Tp, [PossiblePair|RemainingPairs]):-\n\tNbPairs > 0,\n\textraire(AllPossiblePairs, NbPairs, Tp, RemainingPairs),\n\tpair_in_array(PossiblePair, Tp).\n\n/**\n * delete_pair(+Pairs, +Pair, -PairsWithoutPair)\n */\ndelete_pair([], _, []).\ndelete_pair([Pair|Pairs], Pair, Pairs):-!.\ndelete_pair([FirstPair|Pairs], Pair, [FirstPair|PairsWithoutPair]):-\n\tdelete_pair(Pairs, Pair, PairsWithoutPair).\n\n/**\n * pair_in_array(+Pair, +Pairs)\n */\npair_in_array((A, B), [(C, D)|Pairs]):-\n\t(A == C ; B == D ; A == D ; B == C),\n\t!.\npair_in_array(Pair, [FirstPair|Pairs]):-\n\tpair_in_array(Pair, Pairs).\n\n\n/**\n * Question 1.3\n * les_tps(+Buddies, -Tps)\n */\nles_tps(Buddies, Tps):-\n\tcombiner(Buddies, PossiblePairs),\n\tlength(Buddies, NbBuddies),\n\tNbPairs is integer(NbBuddies / 2),\n\tfindall(Tp, extraire(PossiblePairs, NbPairs, Tp, _), Tps).\n"
  },
  {
    "path": "src/test/resources/samples/langs/Prolog/queues.yap",
    "content": "% This file has been included as an YAP library by Vitor Santos Costa, 1999\n\n%   File   : QUEUES.PL\n%   Author : R.A.O'Keefe\n%   Updated: Friday November 18th, 1983, 8:09:31 pm\n%   Purpose: define queue operations\n%   Needs  : lib(lists) for append/3.\n\n/** @defgroup Queues Queues\n@ingroup library\n@{\n\nThe following queue manipulation routines are available once\nincluded with the `use_module(library(queues))` command. Queues are\nimplemented with difference lists.\n\n*/\n\n/**\n\n @pred make_queue(+ _Queue_) \n\n\nCreates a new empty queue. It should only be used to create a new queue.\n\n \n*/\n\n\n/** @pred empty_queue(+ _Queue_) \n\n\nTests whether the queue is empty.\n\n \n*/\n/** @pred head_queue(+ _Queue_, ? _Head_) \n\n\nUnifies Head with the first element of the queue.\n\n \n*/\n/** @pred join_queue(+ _Element_, + _OldQueue_, - _NewQueue_) \n\n\nAdds the new element at the end of the queue.\n\n \n*/\n/** @pred jump_queue(+ _Element_, + _OldQueue_, - _NewQueue_) \n\n\nAdds the new element at the front of the list.\n\n \n*/\n/** @pred length_queue(+ _Queue_, - _Length_) \n\n\nCounts the number of elements currently in the queue.\n\n \n*/\n/** @pred list_join_queue(+ _List_, + _OldQueue_, - _NewQueue_) \n\n\nAds the new elements at the end of the queue.\n\n \n*/\n/** @pred list_jump_queue(+ _List_, + _OldQueue_, + _NewQueue_) \n\n\nAdds all the elements of  _List_ at the front of the queue.\n\n \n*/\n/** @pred list_to_queue(+ _List_, - _Queue_) \n\n\nCreates a new queue with the same elements as  _List._\n\n \n*/\n/** @pred queue_to_list(+ _Queue_, - _List_) \n\n\nCreates a new list with the same elements as  _Queue_.\n\n\n\n\n */\n/** @pred serve_queue(+ _OldQueue_, + _Head_, - _NewQueue_) \n\n\nRemoves the first element of the queue for service.\n\n \n*/\n:- module(queues, [\n\tmake_queue/1,\t\t%   create empty queue\n\tjoin_queue/3,\t\t%   add element to end of queue\n\tlist_join_queue/3,\t%   add many elements to end of queue\n\tjump_queue/3,\t\t%   add element to front of queue\n\tlist_jump_queue/3,\t%   add many elements to front of queue\n\thead_queue/2,\t\t%   look at first element of queue\n\tserve_queue/3,\t\t%   remove first element of queue\n\tlength_queue/2,\t\t%   count elements of queue\n\tempty_queue/1,\t\t%   test whether queue is empty\n\tlist_to_queue/2,\t%   convert list to queue\n\tqueue_to_list/2\t\t%   convert queue to list\n    ]).\n\n:- use_module(library(lists), [append/3]).\n\n/*\n:- mode\n\tmake_queue(-),\n\tjoin_queue(+, +, -),\n\tlist_join_queue(+, +, -),\n\tjump_queue(+, +, -),\n\tlist_jump_queue(+, +, -),\n\thead_queue(+, ?),\n\tserve_queue(+, ?, -),\n\tlength_queue(+, ?),\n\tlength_queue(+, +, +, -),\n\tempty_queue(+),\n\tlist_to_queue(+, -),\n\tqueue_to_list(+, -),\n\tqueue_to_list(+, +, -).\n*/\n\n/*  In this package, a queue is represented as a term Front-Back,  where\n    Front  is  a list and Back is a tail of that list, and is normally a\n    variable.  join_queue will only work when the Back  is  a  variable,\n    the  other routines will accept any tail.  The elements of the queue\n    are the list difference, that is, all the elements starting at Front\n    and stopping at Back.  Examples:\n\n\t[a,b,c,d,e|Z]-Z\t    has elements a,b,c,d,e\n\t[a,b,c,d,e]-[d,e]   has elements a,b,c\n\tZ-Z\t\t    has no elements\n\t[1,2,3]-[1,2,3]\t    has no elements\n*/\n\n%   make_queue(Queue)\n%   creates a new empty queue.  It will also match empty queues, but\n%   because Prolog doesn't do the occurs check, it will also match\n%   other queues, creating circular lists.  So this should ONLY be\n%   used to make new queues.\n\nmake_queue(X-X).\n\n\n\n%   join_queue(Element, OldQueue, NewQueue)\n%   adds the new element at the end of the queue.  The old queue is\n%   side-effected, so you *can't* do\n%\tjoin_queue(1, OldQ, NewQ1),\n%\tjoin_queue(2, OldQ, NewQ2).\n%   There isn't any easy way of doing that, sensible though it might\n%   be.  You *can* do\n%\tjoin_queue(1, OldQ, MidQ),\n%\tjoin_queue(2, MidQ, NewQ).\n%   See list_join_queue.\n\njoin_queue(Element, Front-[Element|Back], Front-Back).\n\n\n\n%   list_join_queue(List, OldQueue, NewQueue)\n%   adds the new elements at the end of the queue.  The elements are\n%   added in the same order that they appear in the list, e.g.\n%   list_join_queue([y,z], [a,b,c|M]-M, [a,b,c,y,z|N]-N).\n\nlist_join_queue(List, Front-OldBack, Front-NewBack) :-\n\tappend(List, OldBack, NewBack).\n\n\n\n%   jump_queue(Element, OldQueue, NewQueue)\n%   adds the new element at the front of the list.  Unlike join_queue,\n%\tjump_queue(1, OldQ, NewQ1),\n%\tjump_queue(2, OldQ, NewQ2)\n%   *does* work, though if you add things at the end of NewQ1 they\n%   will also show up in NewQ2.  Note that\n%\tjump_queue(1, OldQ, MidQ),\n%\tjump_queue(2, MidQ, NewQ)\n%   makes NewQ start 2, 1, ...\n\njump_queue(Element, Front-Back, [Element|Front]-Back).\n\n\n\n%   list_jump_queue(List, OldQueue, NewQueue)\n%   adds all the elements of List at the front of the queue.  There  are\n%   two  ways  we might do this.  We could add all the elements one at a\n%   time, so that they would appear at the beginning of the queue in the\n%   opposite order to the order they had in the list, or  we  could  add\n%   them in one lump, so that they have the same order in the  queue  as\n%   in  the  list.   As you can easily add the elements one at a time if\n%   that is what you want, I have chosen the latter.\n\nlist_jump_queue(List, OldFront-Back, NewFront-Back) :-\n\tappend(List, OldFront, NewFront).\n%\treverse(List, OldFront, NewFront).\t% for the other definition\n\n\n\n%   head_queue(Queue, Head)\n%   unifies Head with the first element of the queue.  The tricky part\n%   is that we might be at the end of a queue: Back-Back, with Back a\n%   variable, and in that case this predicate should not succeed, as we\n%   don't know what that element is or whether it exists yet.\n\nhead_queue(Front-Back, Head) :-\n\tFront \\== Back,\t\t%  the queue is not empty\n\tFront = [Head|_].\n\n\n\n%   serve_queue(OldQueue, Head, NewQueue)\n%   removes the first element of the queue for service.\n\nserve_queue(OldFront-Back, Head, NewFront-Back) :-\n\tOldFront \\== Back,\n\tOldFront = [Head|NewFront].\n\n\n\n%   empty_queue(Queue)\n%   tests whether the queue is empty.  If the back of a queue were\n%   guaranteed to be a variable, we could have\n%\tempty_queue(Front-Back) :- var(Front).\n%   but I don't see why you shouldn't be able to treat difference\n%   lists as queues if you want to.\n\nempty_queue(Front-Back) :-\n\tFront == Back.\n\n\n\n%   length_queue(Queue, Length)\n%   counts the number of elements currently in the queue.  Note that\n%   we have to be careful in checking for the end of the list, we\n%   can't test for [] the way length(List) does.\n\nlength_queue(Front-Back, Length) :-\n\tlength_queue(Front, Back, 0, N),\n\tLength = N.\n\nlength_queue(Front, Back, N, N) :-\n\tFront == Back, !.\nlength_queue([_|Front], Back, K, N) :-\n\tL is K+1,\n\tlength_queue(Front, Back, L, N).\n\n\n\n%   list_to_queue(List, Queue)\n%   creates a new queue with the same elements as List.\n\nlist_to_queue(List, Front-Back) :-\n\tappend(List, Back, Front).\n\n\n\n%   queue_to_list(Queue, List)\n%   creates a new list with the same elements as Queue.\n\nqueue_to_list(Front-Back, List) :-\n\tqueue_to_list(Front, Back, List).\n\nqueue_to_list(Front, Back, Ans) :-\n\tFront == Back, !, Ans = [].\nqueue_to_list([Head|Front], Back, [Head|Tail]) :-\n\tqueue_to_list(Front, Back, Tail).\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Prolog/test-prolog.prolog",
    "content": "-/* Prolog test file */\n -male(john).\n -male(peter).\n -\n -female(vick).\n -female(christie).\n -\n -parents(john, peter, christie).\n -parents(vick, peter, christie).\n -\n -/* X is a brother of Y */\n -brother(X, Y) :- male(X), parents(X, F, M), parents(Y, F, M).\n"
  },
  {
    "path": "src/test/resources/samples/langs/Prolog/turing.pl",
    "content": "-turing(Tape0, Tape) :-\n -    perform(q0, [], Ls, Tape0, Rs),\n -    reverse(Ls, Ls1),\n -    append(Ls1, Rs, Tape).\n -\n -perform(qf, Ls, Ls, Rs, Rs) :- !.\n -perform(Q0, Ls0, Ls, Rs0, Rs) :-\n -    symbol(Rs0, Sym, RsRest),\n -    once(rule(Q0, Sym, Q1, NewSym, Action)),\n -    action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),\n -    perform(Q1, Ls1, Ls, Rs1, Rs).\n -\n -symbol([], b, []).\n -symbol([Sym|Rs], Sym, Rs).\n -\n -action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).\n -action(stay, Ls, Ls, Rs, Rs).\n -action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).\n -\n -left([], [], Rs0, [b|Rs0]).\n -left([L|Ls], Ls, Rs, [L|Rs]).\n"
  },
  {
    "path": "src/test/resources/samples/langs/Propeller Spin/4x4 Keypad Reader.spin",
    "content": "﻿{{\r\n*****************************************\r\n* 4x4 Keypad Reader           v1.0      *\r\n* Author: Beau Schwabe                  *\r\n* Copyright (c) 2007 Parallax           *               \r\n* See end of file for terms of use.     *               \r\n*****************************************\r\n}}\r\n{\r\n\r\nOperation:\r\n\r\nThis object uses a capacitive PIN approach to reading the keypad.\r\nTo do so, ALL pins are made LOW and an OUTPUT to \"discharge\" the\r\nI/O pins.  Then, ALL pins are set to an INPUT state.  At this point,\r\nonly one pin is made HIGH and an OUTPUT at a time.  If the \"switch\"\r\nis closed, then a HIGH will be read on the input, otherwise a LOW\r\nwill be returned.\r\n\r\nThe keypad decoding routine only requires two subroutines and returns\r\nthe entire 4x4 keypad matrix into a single WORD variable indicating\r\nwhich buttons are pressed.  Multiple button presses are allowed with\r\nthe understanding that“BOX entries can be confused. An example of a\r\nBOX entry... 1,2,4,5 or 1,4,3,6 or 4,6,*,#  etc. where any 3 of the 4\r\nbuttons pressed will evaluate the non pressed button as being pressed,\r\neven when they are not.  There is no danger of any physical or\r\nelectrical damage, that s just the way this sensing method happens to\r\nwork.\r\n\r\nSchematic:\r\nNo resistors, No capacitors.  The connections are directly from the\r\nkeypad to the I/O's.  I literally plugged mine right into the demo\r\nboard RevC.\r\n\r\nLooking at the Back of the 4x4 keypad...\r\n\r\n       P7         P0\r\n         ││││││││\r\n┌─────── ││││││││ ───────┐\r\n│     oo ││││││││ o      │\r\n│                        │\r\n│  O    O    O    O    O │ \r\n│                        │\r\n│  O    O    O    O    O │\r\n│         {LABEL}        │\r\n│  O    O    O    O    O │ \r\n│                        │\r\n│  O    O    O    O    O │\r\n│                        │\r\n│  O    O    O    O    O │\r\n│             o    o     │\r\n└────────────────────────┘\r\n\r\n}\r\nVAR\r\n  word  keypad\r\n  \r\nPUB ReadKeyPad\r\n    keypad := 0                 'Clear 4x4 'keypad' value\r\n    ReadRow(3)                  'Call routine to read entire ROW 0\r\n    keypad <<= 4                'Shift 'keypad' value left by 4\r\n    ReadRow(2)                  'Call routine to read entire ROW 1\r\n    keypad <<= 4                'Shift 'keypad' value left by 4\r\n    ReadRow(1)                  'Call routine to read entire ROW 2\r\n    keypad <<= 4                'Shift 'keypad' value left by 4\r\n    ReadRow(0)                  'Call routine to read entire ROW 3\r\n    Result := keypad\r\n\r\nPRI ReadRow(n)\r\n    outa[0..7]~                 'preset P0 to P7 as LOWs\r\n    dira[0..7]~~                'make P0 to P7 OUTPUTs ... discharge pins or \"capacitors\" to VSS\r\n    dira[0..7]~                 'make P0 to P7 INPUTSs ... now the pins act like tiny capacitors\r\n    outa[n]~~                   'preset Pin 'n' HIGH         \r\n    dira[n]~~                   'make Pin 'n' an OUTPUT... Make only one pin HIGH ; will charge\r\n                                '                          \"capacitor\" if switch is closed.\r\n                                ' \r\n    keypad += ina[4..7]         'read ROW value        ... If a switch is open, the pin or \"capacitor\"\r\n    dira[n]~                    'make Pn an INPUT          will remain discharged\r\n    \r\nDAT\r\n{{\r\n┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\r\n│                                                   TERMS OF USE: MIT License                                                  │                                                            \r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ \r\n│files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │\r\n│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│\r\n│is furnished to do so, subject to the following conditions:                                                                   │\r\n│                                                                                                                              │\r\n│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│\r\n│                                                                                                                              │\r\n│THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │\r\n│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │\r\n│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │\r\n│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\r\n}}    "
  },
  {
    "path": "src/test/resources/samples/langs/Propeller Spin/Debug_Lcd.spin",
    "content": "﻿''****************************************\r\n''*  Debug_Lcd v1.2                      *\r\n''*  Authors: Jon Williams, Jeff Martin  *\r\n''*  Copyright (c) 2006 Parallax, Inc.   *\r\n''*  See end of file for terms of use.   *\r\n''****************************************\r\n''\r\n'' Debugging wrapper for Serial_Lcd object\r\n''\r\n'' v1.2 - March 26, 2008 - Updated by Jeff Martin to conform to Propeller object initialization standards.\r\n'' v1.1 - April 29, 2006 - Updated by Jon Williams for consistency.\r\n''\r\n\r\n\r\nOBJ\r\n\r\n  lcd : \"serial_lcd\"                                    ' driver for Parallax Serial LCD\r\n  num : \"simple_numbers\"                                ' number to string conversion\r\n\r\n\r\nPUB init(pin, baud, lines) : okay\r\n\r\n'' Initializes serial LCD object\r\n'' -- returns true if all parameters okay\r\n\r\n  okay := lcd.init(pin, baud, lines) \r\n\r\n\r\nPUB finalize\r\n\r\n'' Finalizes lcd object -- frees the pin (floats)\r\n\r\n  lcd.finalize\r\n\r\n  \r\nPUB putc(txbyte)\r\n\r\n'' Send a byte to the terminal\r\n\r\n  lcd.putc(txbyte)\r\n  \r\n  \r\nPUB str(strAddr)\r\n\r\n'' Print a zero-terminated string\r\n\r\n  lcd.str(strAddr)\r\n\r\n\r\nPUB dec(value)\r\n\r\n'' Print a signed decimal number\r\n\r\n  lcd.str(num.dec(value))  \r\n\r\n\r\nPUB decf(value, width) \r\n\r\n'' Prints signed decimal value in space-padded, fixed-width field\r\n\r\n  lcd.str(num.decf(value, width))   \r\n  \r\n\r\nPUB decx(value, digits) \r\n\r\n'' Prints zero-padded, signed-decimal string\r\n'' -- if value is negative, field width is digits+1\r\n\r\n  lcd.str(num.decx(value, digits)) \r\n\r\n\r\nPUB hex(value, digits)\r\n\r\n'' Print a hexadecimal number\r\n\r\n  lcd.str(num.hex(value, digits))\r\n\r\n\r\nPUB ihex(value, digits)\r\n\r\n'' Print an indicated hexadecimal number\r\n\r\n  lcd.str(num.ihex(value, digits))   \r\n\r\n\r\nPUB bin(value, digits)\r\n\r\n'' Print a binary number\r\n\r\n  lcd.str(num.bin(value, digits))\r\n\r\n\r\nPUB ibin(value, digits)\r\n\r\n'' Print an indicated (%) binary number\r\n\r\n  lcd.str(num.ibin(value, digits))     \r\n    \r\n\r\nPUB cls\r\n\r\n'' Clears LCD and moves cursor to home (0, 0) position\r\n\r\n  lcd.cls \r\n\r\n\r\nPUB home\r\n\r\n'' Moves cursor to 0, 0\r\n\r\n  lcd.home\r\n  \r\n\r\nPUB gotoxy(col, line)\r\n\r\n'' Moves cursor to col/line\r\n\r\n  lcd.gotoxy(col, line)\r\n\r\n  \r\nPUB clrln(line)\r\n\r\n'' Clears line\r\n\r\n  lcd.clrln(line)\r\n\r\n\r\nPUB cursor(type)\r\n\r\n'' Selects cursor type\r\n''   0 : cursor off, blink off  \r\n''   1 : cursor off, blink on   \r\n''   2 : cursor on, blink off  \r\n''   3 : cursor on, blink on\r\n\r\n  lcd.cursor(type)\r\n       \r\n\r\nPUB display(status)\r\n\r\n'' Controls display visibility; use display(false) to hide contents without clearing\r\n\r\n  if status\r\n    lcd.displayOn\r\n  else\r\n    lcd.displayOff\r\n\r\n\r\nPUB custom(char, chrDataAddr)\r\n\r\n'' Installs custom character map\r\n'' -- chrDataAddr is address of 8-byte character definition array\r\n\r\n  lcd.custom(char, chrDataAddr)\r\n\r\n      \r\nPUB backLight(status)\r\n\r\n'' Enable (true) or disable (false) LCD backlight\r\n'' -- affects only backlit models\r\n\r\n  lcd.backLight(status)\r\n\r\n{{\r\n\r\n┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\r\n│                                                   TERMS OF USE: MIT License                                                  │                                                            \r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ \r\n│files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │\r\n│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│\r\n│is furnished to do so, subject to the following conditions:                                                                   │\r\n│                                                                                                                              │\r\n│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│\r\n│                                                                                                                              │\r\n│THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │\r\n│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │\r\n│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │\r\n│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\r\n}}  "
  },
  {
    "path": "src/test/resources/samples/langs/Propeller Spin/Graphics.spin",
    "content": "﻿''***************************************\r\n''*  Graphics Driver v1.0               *\r\n''*  Author: Chip Gracey                *\r\n''*  Copyright (c) 2005 Parallax, Inc.  *               \r\n''*  See end of file for terms of use.  *               \r\n''***************************************\r\n\r\n''\r\n'' Theory of Operation:\r\n''\r\n'' A cog is launched which processes commands via the PUB routines.\r\n''\r\n'' Points, lines, arcs, sprites, text, and polygons are rasterized into\r\n'' a specified stretch of memory which serves as a generic bitmap buffer.\r\n''\r\n'' The bitmap can be displayed by the TV.SRC or VGA.SRC driver.\r\n''\r\n'' See GRAPHICS_DEMO.SRC for usage example.\r\n''\r\n\r\nCON\r\n\r\n  #1, _setup, _color, _width, _plot, _line, _arc, _vec, _vecarc, _pix, _pixarc, _text, _textarc, _textmode, _fill, _loop\r\n\r\nVAR\r\n\r\n  long  cog\r\n\r\n  long  command\r\n\r\n  long  bitmap_base                                     'bitmap data\r\n  long  bitmap_longs\r\n  word  bases[32]\r\n\r\n  long  pixel_width                                     'pixel data\r\n  long  slices[8]\r\n\r\n  long  text_xs, text_ys, text_sp, text_just            'text data (these 4 must be contiguous)\r\n\r\n\r\nPUB start : okay\r\n\r\n'' Start graphics driver - starts a cog\r\n'' returns false if no cog available\r\n\r\n  fontptr := @font                                      'set font pointer (same for all instances)\r\n\r\n  stop\r\n  okay := cog := cognew(@loop, @command) + 1\r\n\r\n\r\nPUB stop\r\n\r\n'' Stop graphics driver - frees a cog\r\n\r\n  if cog\r\n    cogstop(cog~ - 1)\r\n\r\n  command~\r\n\r\n\r\nPUB setup(x_tiles, y_tiles, x_origin, y_origin, base_ptr) | bases_ptr, slices_ptr\r\n\r\n'' Set bitmap parameters\r\n''\r\n''   x_tiles        - number of x tiles (tiles are 16x16 pixels each)\r\n''   y_tiles        - number of y tiles\r\n''   x_origin       - relative-x center pixel\r\n''   y_origin       - relative-y center pixel\r\n''   base_ptr       - base address of bitmap\r\n\r\n  setcommand(_loop, 0)                                  'make sure last command finished\r\n\r\n  repeat bases_ptr from 0 to x_tiles - 1 <# 31          'write bases\r\n    bases[bases_ptr] := base_ptr + bases_ptr * y_tiles << 6\r\n\r\n  y_tiles <<= 4                                         'adjust arguments and do setup command\r\n  y_origin := y_tiles - y_origin - 1\r\n  bases_ptr := @bases\r\n  slices_ptr := @slices\r\n  setcommand(_setup, @x_tiles)\r\n\r\n  bitmap_base := base_ptr                               'retain high-level bitmap data\r\n  bitmap_longs := x_tiles * y_tiles\r\n\r\n\r\nPUB clear\r\n\r\n'' Clear bitmap\r\n\r\n  setcommand(_loop, 0)                                  'make sure last command finished\r\n\r\n  longfill(bitmap_base, 0, bitmap_longs)                'clear bitmap\r\n\r\n\r\nPUB copy(dest_ptr)\r\n\r\n'' Copy bitmap\r\n'' use for double-buffered display (flicker-free)\r\n''\r\n''   dest_ptr       - base address of destination bitmap\r\n\r\n  setcommand(_loop, 0)                                  'make sure last command finished\r\n\r\n  longmove(dest_ptr, bitmap_base, bitmap_longs)         'copy bitmap\r\n\r\n\r\nPUB color(c)\r\n\r\n'' Set pixel color to two-bit pattern\r\n''\r\n''   c              - color code in bits[1..0]\r\n\r\n  setcommand(_color, @colors[c & 3])                    'set color\r\n\r\n\r\nPUB width(w) | pixel_passes, r, i, p\r\n\r\n'' Set pixel width\r\n'' actual width is w[3..0] + 1\r\n''\r\n''   w              - 0..15 for round pixels, 16..31 for square pixels\r\n\r\n  r := not w & $10                                      'determine pixel shape/width\r\n  w &= $F\r\n  pixel_width := w\r\n  pixel_passes := w >> 1 + 1\r\n\r\n  setcommand(_width, @w)                                'do width command now to avoid updating slices when busy\r\n\r\n  p := w ^ $F                                           'update slices to new shape/width\r\n  repeat i from 0 to w >> 1\r\n    slices[i] := true >> (p << 1) << (p & $E)\r\n    if r and pixels[w] & |< i\r\n      p += 2\r\n    if r and i == pixel_passes - 2\r\n      p += 2\r\n\r\n\r\nPUB colorwidth(c, w)\r\n\r\n'' Set pixel color and width\r\n\r\n  color(c)\r\n  width(w)\r\n\r\n\r\nPUB plot(x, y)\r\n\r\n'' Plot point\r\n''\r\n''   x,y            - point\r\n\r\n  setcommand(_plot, @x)\r\n\r\n\r\nPUB line(x, y)\r\n\r\n'' Draw a line to point\r\n''\r\n''   x,y            - endpoint\r\n\r\n  setcommand(_line, @x)\r\n\r\n\r\nPUB arc(x, y, xr, yr, angle, anglestep, steps, arcmode)\r\n\r\n'' Draw an arc\r\n''\r\n''   x,y            - center of arc\r\n''   xr,yr          - radii of arc\r\n''   angle          - initial angle in bits[12..0] (0..$1FFF = 0°..359.956°)\r\n''   anglestep      - angle step in bits[12..0]\r\n''   steps          - number of steps (0 just leaves (x,y) at initial arc position)\r\n''   arcmode        - 0: plot point(s)\r\n''                    1: line to point(s)\r\n''                    2: line between points\r\n''                    3: line from point(s) to center\r\n\r\n  setcommand(_arc, @x)\r\n\r\n\r\nPUB vec(x, y, vecscale, vecangle, vecdef_ptr)\r\n\r\n'' Draw a vector sprite\r\n''\r\n''   x,y            - center of vector sprite\r\n''   vecscale       - scale of vector sprite ($100 = 1x)\r\n''   vecangle       - rotation angle of vector sprite in bits[12..0]\r\n''   vecdef_ptr     - address of vector sprite definition\r\n''\r\n''\r\n'' Vector sprite definition:\r\n''\r\n''    word    $8000|$4000+angle       'vector mode + 13-bit angle (mode: $4000=plot, $8000=line)\r\n''    word    length                  'vector length\r\n''    ...                             'more vectors\r\n''    ...\r\n''    word    0                       'end of definition\r\n\r\n  setcommand(_vec, @x)\r\n\r\n\r\nPUB vecarc(x, y, xr, yr, angle, vecscale, vecangle, vecdef_ptr)\r\n\r\n'' Draw a vector sprite at an arc position\r\n''\r\n''   x,y            - center of arc\r\n''   xr,yr          - radii of arc\r\n''   angle          - angle in bits[12..0] (0..$1FFF = 0°..359.956°)\r\n''   vecscale       - scale of vector sprite ($100 = 1x)\r\n''   vecangle       - rotation angle of vector sprite in bits[12..0]\r\n''   vecdef_ptr     - address of vector sprite definition\r\n\r\n  setcommand(_vecarc, @x)\r\n\r\n\r\nPUB pix(x, y, pixrot, pixdef_ptr)\r\n\r\n'' Draw a pixel sprite\r\n''\r\n''   x,y            - center of vector sprite\r\n''   pixrot         - 0: 0°, 1: 90°, 2: 180°, 3: 270°, +4: mirror\r\n''   pixdef_ptr     - address of pixel sprite definition\r\n''\r\n''\r\n'' Pixel sprite definition:\r\n''\r\n''    word                            'word align, express dimensions and center, define pixels\r\n''    byte    xwords, ywords, xorigin, yorigin\r\n''    word    %%xxxxxxxx,%%xxxxxxxx\r\n''    word    %%xxxxxxxx,%%xxxxxxxx\r\n''    word    %%xxxxxxxx,%%xxxxxxxx\r\n''    ...\r\n\r\n  setcommand(_pix, @x)\r\n\r\n\r\nPUB pixarc(x, y, xr, yr, angle, pixrot, pixdef_ptr)\r\n\r\n'' Draw a pixel sprite at an arc position\r\n''\r\n''   x,y            - center of arc\r\n''   xr,yr          - radii of arc\r\n''   angle          - angle in bits[12..0] (0..$1FFF = 0°..359.956°)\r\n''   pixrot         - 0: 0°, 1: 90°, 2: 180°, 3: 270°, +4: mirror\r\n''   pixdef_ptr     - address of pixel sprite definition\r\n\r\n  setcommand(_pixarc, @x)\r\n\r\n\r\nPUB text(x, y, string_ptr) | justx, justy\r\n\r\n'' Draw text\r\n''\r\n''   x,y            - text position (see textmode for sizing and justification)\r\n''   string_ptr     - address of zero-terminated string (it may be necessary to call .finish\r\n''                    immediately afterwards to prevent subsequent code from clobbering the\r\n''                    string as it is being drawn\r\n\r\n  justify(string_ptr, @justx)                           'justify string and draw text\r\n  setcommand(_text, @x)\r\n\r\n\r\nPUB textarc(x, y, xr, yr, angle, string_ptr) | justx, justy\r\n\r\n'' Draw text at an arc position\r\n''\r\n''   x,y            - center of arc\r\n''   xr,yr          - radii of arc\r\n''   angle          - angle in bits[12..0] (0..$1FFF = 0°..359.956°)\r\n''   string_ptr     - address of zero-terminated string (it may be necessary to call .finish\r\n''                    immediately afterwards to prevent subsequent code from clobbering the\r\n''                    string as it is being drawn\r\n\r\n  justify(string_ptr, @justx)                           'justify string and draw text\r\n  setcommand(_textarc, @x)\r\n\r\n\r\nPUB textmode(x_scale, y_scale, spacing, justification)\r\n\r\n'' Set text size and justification\r\n''\r\n''   x_scale        - x character scale, should be 1+\r\n''   y_scale        - y character scale, should be 1+\r\n''   spacing        - character spacing, 6 is normal\r\n''   justification  - bits[1..0]: 0..3 = left, center, right, left\r\n''                    bits[3..2]: 0..3 = bottom, center, top, bottom\r\n\r\n  longmove(@text_xs, @x_scale, 4)                       'retain high-level text data\r\n \r\n  setcommand(_textmode, @x_scale)                       'set text mode\r\n\r\n\r\nPUB box(x, y, box_width, box_height) | x2, y2, pmin, pmax \r\n\r\n'' Draw a box with round/square corners, according to pixel width\r\n''\r\n''   x,y            - box left, box bottom\r\n\r\n  if box_width > pixel_width and box_height > pixel_width\r\n\r\n    pmax := pixel_width - (pmin := pixel_width >> 1)    'get pixel-half-min and pixel-half-max\r\n\r\n    x += pmin                                           'adjust coordinates to accomodate width\r\n    y += pmin\r\n    x2 := x + box_width - 1 - pixel_width\r\n    y2 := y + box_height - 1 - pixel_width\r\n\r\n    plot(x, y)                                          'plot round/square corners\r\n    plot(x, y2)\r\n    plot(x2, y)\r\n    plot(x2, y2)\r\n\r\n    fill(x, y2 + pmax, 0, (x2 - x) << 16, 0, 0, pmax)   'fill gaps\r\n    fill(x, y, 0, (x2 - x) << 16, 0, 0, pmin)\r\n    fill(x - pmin, y2, 0, (x2 - x + pixel_width) << 16, 0, 0, y2 - y)\r\n\r\n\r\nPUB quad(x1, y1, x2, y2, x3, y3, x4, y4)\r\n\r\n'' Draw a solid quadrilateral\r\n'' vertices must be ordered clockwise or counter-clockwise\r\n\r\n  tri(x1, y1, x2, y2, x3, y3)                           'draw two triangle to make 4-sides polygon\r\n  tri(x3, y3, x4, y4, x1, y1)\r\n\r\n\r\nPUB tri(x1, y1, x2, y2, x3, y3) | xy[2]\r\n\r\n'' Draw a solid triangle\r\n\r\n' reorder vertices by descending y\r\n\r\n  case (y1 => y2) & %100 | (y2 => y3) & %010 | (y1 => y3) & %001\r\n    %000:\r\n      longmove(@xy, @x1, 2)\r\n      longmove(@x1, @x3, 2)\r\n      longmove(@x3, @xy, 2)\r\n    %010:\r\n      longmove(@xy, @x1, 2)\r\n      longmove(@x1, @x2, 4)\r\n      longmove(@x3, @xy, 2)\r\n    %011:\r\n      longmove(@xy, @x1, 2)\r\n      longmove(@x1, @x2, 2)\r\n      longmove(@x2, @xy, 2)\r\n    %100:\r\n      longmove(@xy, @x3, 2)\r\n      longmove(@x2, @x1, 4)\r\n      longmove(@x1, @xy, 2)\r\n    %101:\r\n      longmove(@xy, @x2, 2)\r\n      longmove(@x2, @x3, 2)\r\n      longmove(@x3, @xy, 2)\r\n\r\n' draw triangle\r\n\r\n  fill(x1, y1, (x3 - x1) << 16 / (y1 - y3 + 1), (x2 - x1) << 16 / (y1 - y2 + 1), (x3 - x2) << 16 / (y2 - y3 + 1), y1 - y2, y1 - y3)\r\n\r\n\r\nPUB finish\r\n\r\n'' Wait for any current graphics command to finish\r\n'' use this to insure that it is safe to manually manipulate the bitmap\r\n\r\n  setcommand(_loop, 0)                                  'make sure last command finished\r\n\r\n\r\nPRI fill(x, y, da, db, db2, linechange, lines_minus_1)\r\n\r\n  setcommand(_fill, @x)\r\n\r\n\r\nPRI justify(string_ptr, justptr) | x\r\n\r\n  x := (strsize(string_ptr) - 1) * text_xs * text_sp + text_xs * 5 - 1\r\n  long[justptr] := -lookupz(text_just >> 2 & 3: 0, x >> 1, x, 0)\r\n  long[justptr][1] := -lookupz(text_just & 3: 0, text_ys << 3, text_ys << 4, 0)\r\n\r\n\r\nPRI setcommand(cmd, argptr)\r\n\r\n  command := cmd << 16 + argptr                         'write command and pointer\r\n  repeat while command                                  'wait for command to be cleared, signifying receipt\r\n\r\n\r\nCON\r\n\r\n  ' Vector font primitives\r\n\r\n  xa0   = %000 << 0             'x line start / arc center\r\n  xa1   = %001 << 0\r\n  xa2   = %010 << 0\r\n  xa3   = %011 << 0\r\n  xa4   = %100 << 0\r\n  xa5   = %101 << 0\r\n  xa6   = %110 << 0\r\n  xa7   = %111 << 0\r\n\r\n  ya0   = %0000 << 3            'y line start / arc center\r\n  ya1   = %0001 << 3\r\n  ya2   = %0010 << 3\r\n  ya3   = %0011 << 3\r\n  ya4   = %0100 << 3\r\n  ya5   = %0101 << 3\r\n  ya6   = %0110 << 3\r\n  ya7   = %0111 << 3\r\n  ya8   = %1000 << 3\r\n  ya9   = %1001 << 3\r\n  yaA   = %1010 << 3\r\n  yaB   = %1011 << 3\r\n  yaC   = %1100 << 3\r\n  yaD   = %1101 << 3\r\n  yaE   = %1110 << 3\r\n  yaF   = %1111 << 3\r\n\r\n  xb0   = %000 << 7             'x line end\r\n  xb1   = %001 << 7\r\n  xb2   = %010 << 7\r\n  xb3   = %011 << 7\r\n  xb4   = %100 << 7\r\n  xb5   = %101 << 7\r\n  xb6   = %110 << 7\r\n  xb7   = %111 << 7\r\n\r\n  yb0   = %0000 << 10           'y line end\r\n  yb1   = %0001 << 10\r\n  yb2   = %0010 << 10\r\n  yb3   = %0011 << 10\r\n  yb4   = %0100 << 10\r\n  yb5   = %0101 << 10\r\n  yb6   = %0110 << 10\r\n  yb7   = %0111 << 10\r\n  yb8   = %1000 << 10\r\n  yb9   = %1001 << 10\r\n  ybA   = %1010 << 10\r\n  ybB   = %1011 << 10\r\n  ybC   = %1100 << 10\r\n  ybD   = %1101 << 10\r\n  ybE   = %1110 << 10\r\n  ybF   = %1111 << 10\r\n\r\n  ax1   = %0 << 7               'x arc radius\r\n  ax2   = %1 << 7\r\n\r\n  ay1   = %00 << 8              'y arc radius\r\n  ay2   = %01 << 8\r\n  ay3   = %10 << 8\r\n  ay4   = %11 << 8\r\n\r\n  a0    = %0000 << 10           'arc start/length\r\n  a1    = %0001 << 10           'bits[1..0] = start (0..3 = 0°, 90°, 180°, 270°)\r\n  a2    = %0010 << 10           'bits[3..2] = length (0..3 = 360°, 270°, 180°, 90°)\r\n  a3    = %0011 << 10\r\n  a4    = %0100 << 10\r\n  a5    = %0101 << 10\r\n  a6    = %0110 << 10\r\n  a7    = %0111 << 10\r\n  a8    = %1000 << 10\r\n  a9    = %1001 << 10\r\n  aA    = %1010 << 10\r\n  aB    = %1011 << 10\r\n  aC    = %1100 << 10\r\n  aD    = %1101 << 10\r\n  aE    = %1110 << 10\r\n  aF    = %1111 << 10\r\n\r\n  fline = %0 << 14              'line command\r\n  farc  = %1 << 14              'arc command\r\n\r\n  more  = %1 << 15              'another arc/line\r\n\r\n\r\nDAT\r\n\r\n' Color codes\r\n\r\ncolors  long    %%0000000000000000\r\n        long    %%1111111111111111\r\n        long    %%2222222222222222\r\n        long    %%3333333333333333\r\n\r\n' Round pixel recipes\r\n\r\npixels  byte    %00000000,%00000000,%00000000,%00000000         '0,1,2,3\r\n        byte    %00000000,%00000000,%00000010,%00000101         '4,5,6,7\r\n        byte    %00001010,%00001010,%00011010,%00011010         '8,9,A,B\r\n        byte    %00110100,%00111010,%01110100,%01110100         'C,D,E,F\r\n\r\n' Vector font - standard ascii characters ($21-$7E)\r\n\r\nfont    word    fline + xa2 + yaC + xb2 + yb7 + more            '!\r\n        word    fline + xa2 + ya5 + xb2 + yb4\r\n\r\n        word    fline + xa1 + yaD + xb1 + ybC + more            '\"\r\n        word    fline + xa3 + yaD + xb3 + ybC\r\n\r\n        word    fline + xa1 + yaA + xb1 + yb6 + more            '#\r\n        word    fline + xa3 + yaA + xb3 + yb6 + more\r\n        word    fline + xa0 + ya9 + xb4 + yb9 + more\r\n        word    fline + xa0 + ya7 + xb4 + yb7\r\n\r\n        word    farc + xa2 + ya9 + a9 + ax2 + ay1 + more        '$\r\n        word    farc + xa2 + ya7 + aB + ax2 + ay1 + more\r\n        word    fline + xa0 + ya6 + xb2 + yb6 + more\r\n        word    fline + xa2 + yaA + xb4 + ybA + more\r\n        word    fline + xa2 + yaA + xb2 + ybB + more\r\n        word    fline + xa2 + ya6 + xb2 + yb5\r\n\r\n        word    farc + xa1 + yaA + a0 + ax1 + ay1 + more        '%\r\n        word    farc + xa3 + ya6 + a0 + ax1 + ay1 + more\r\n        word    fline + xa0 + ya6 + xb4 + ybA\r\n\r\n        word    farc + xa2 + yaA + a7 + ax1 + ay1 + more        '&\r\n        word    farc + xa2 + ya7 + a5 + ax2 + ay2 + more\r\n        word    fline + xa1 + yaA + xb4 + yb5\r\n\r\n        word    fline + xa2 + yaD + xb2 + ybC                   ' '\r\n\r\n        word    farc + xa3 + ya9 + aD + ax1 + ay4 + more        '(\r\n        word    farc + xa3 + ya7 + aE + ax1 + ay4 + more\r\n        word    fline + xa2 + ya7 + xb2 + yb9\r\n\r\n        word    farc + xa1 + ya9 + aC + ax1 + ay4 + more        ')\r\n        word    farc + xa1 + ya7 + aF + ax1 + ay4 + more\r\n        word    fline + xa2 + ya7 + xb2 + yb9\r\n\r\n        word    fline + xa4 + ya6 + xb0 + ybA + more            '*\r\n        word    fline + xa0 + ya6 + xb4 + ybA + more\r\n        word    fline + xa2 + yaB + xb2 + yb5\r\n\r\n        word    fline + xa0 + ya8 + xb4 + yb8 + more            '+\r\n        word    fline + xa2 + yaA + xb2 + yb6\r\n\r\n        word    fline + xa2 + ya4 + xb1 + yb3                   ',\r\n\r\n        word    fline + xa0 + ya8 + xb4 + yb8                   '-\r\n\r\n        word    fline + xa2 + ya5 + xb2 + yb4                   '.\r\n\r\n        word    fline + xa0 + ya4 + xb4 + ybC                   '/\r\n\r\n        word    farc + xa2 + ya8 + a0 + ax2 + ay4               '0\r\n\r\n        word    fline + xa0 + ya4 + xb4 + yb4 + more            '1\r\n        word    fline + xa2 + ya4 + xb2 + ybC + more\r\n        word    fline + xa0 + yaA + xb2 + ybC\r\n\r\n        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        '2\r\n        word    farc + xa2 + yaA + aF + ax2 + ay3 + more\r\n        word    farc + xa2 + ya4 + aD + ax2 + ay3 + more\r\n        word    fline + xa0 + ya4 + xb4 + yb4\r\n\r\n        word    farc + xa2 + yaA + a7 + ax2 + ay2 + more        '3\r\n        word    farc + xa2 + ya6 + a6 + ax2 + ay2\r\n\r\n        word    fline + xa2 + yaC + xb0 + yb7 + more            '4\r\n        word    fline + xa0 + ya7 + xb4 + yb7 + more\r\n        word    fline + xa3 + ya4 + xb3 + yb8\r\n\r\n        word    farc + xa2 + ya6 + aB + ax2 + ay2 + more        '5\r\n        word    fline + xa4 + yaC + xb0 + ybC + more\r\n        word    fline + xa0 + yaC + xb0 + yb8 + more\r\n        word    fline + xa0 + ya8 + xb2 + yb8 + more\r\n        word    fline + xa0 + ya4 + xb2 + yb4\r\n\r\n        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        '6\r\n        word    farc + xa2 + ya8 + aD + ax2 + ay4 + more\r\n        word    fline + xa0 + ya6 + xb0 + yb8 + more\r\n        word    fline + xa2 + yaC + xb3 + ybC\r\n\r\n        word    fline + xa0 + yaC + xb4 + ybC + more            '7\r\n        word    fline + xa1 + ya4 + xb4 + ybC\r\n\r\n        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        '8\r\n        word    farc + xa2 + yaA + a0 + ax2 + ay2\r\n\r\n        word    farc + xa2 + yaA + a0 + ax2 + ay2 + more        '9\r\n        word    farc + xa2 + ya8 + aF + ax2 + ay4 + more\r\n        word    fline + xa4 + ya8 + xb4 + ybA + more\r\n        word    fline + xa1 + ya4 + xb2 + yb4\r\n\r\n        word    fline + xa2 + ya6 + xb2 + yb7 + more            ':\r\n        word    fline + xa2 + yaA + xb2 + yb9\r\n\r\n        word    fline + xa2 + ya4 + xb1 + yb3 + more            ';\r\n        word    fline + xa2 + ya8 + xb2 + yb7\r\n\r\n        word    fline + xa0 + ya8 + xb4 + ybA + more            '<\r\n        word    fline + xa0 + ya8 + xb4 + yb6\r\n\r\n        word    fline + xa0 + yaA + xb4 + ybA + more            '=\r\n        word    fline + xa0 + ya6 + xb4 + yb6\r\n\r\n        word    fline + xa4 + ya8 + xb0 + ybA + more            '>\r\n        word    fline + xa4 + ya8 + xb0 + yb6\r\n\r\n        word    farc + xa2 + yaB + a8 + ax2 + ay1 + more        '?\r\n        word    farc + xa3 + yaB + aF + ax1 + ay2 + more\r\n        word    farc + xa3 + ya7 + aD + ax1 + ay2 + more\r\n        word    fline + xa2 + ya5 + xb2 + yb4\r\n\r\n        word    farc + xa2 + ya8 + a0 + ax1 + ay1 + more        '@\r\n        word    farc + xa2 + ya8 + a4 + ax2 + ay3 + more\r\n        word    farc + xa3 + ya8 + aF + ax1 + ay1 + more\r\n        word    farc + xa2 + ya6 + aF + ax2 + ay1 + more\r\n        word    fline + xa3 + ya7 + xb3 + yb9\r\n\r\n        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        'A\r\n        word    fline + xa0 + ya4 + xb0 + ybA + more\r\n        word    fline + xa4 + ya4 + xb4 + ybA + more\r\n        word    fline + xa0 + ya8 + xb4 + yb8\r\n\r\n        word    farc + xa2 + yaA + aB + ax2 + ay2 + more        'B\r\n        word    farc + xa2 + ya6 + aB + ax2 + ay2 + more\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more\r\n        word    fline + xa0 + ya4 + xb2 + yb4 + more\r\n        word    fline + xa0 + ya8 + xb2 + yb8 + more\r\n        word    fline + xa0 + yaC + xb2 + ybC\r\n\r\n        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        'C\r\n        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more\r\n        word    fline + xa0 + ya6 + xb0 + ybA\r\n\r\n        word    farc + xa2 + yaA + aC + ax2 + ay2 + more        'D\r\n        word    farc + xa2 + ya6 + aF + ax2 + ay2 + more\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more\r\n        word    fline + xa4 + ya6 + xb4 + ybA + more\r\n        word    fline + xa0 + ya4 + xb2 + yb4 + more\r\n        word    fline + xa0 + yaC + xb2 + ybC\r\n\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more            'E\r\n        word    fline + xa0 + ya4 + xb4 + yb4 + more\r\n        word    fline + xa0 + ya8 + xb3 + yb8 + more\r\n        word    fline + xa0 + yaC + xb4 + ybC\r\n\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more            'F\r\n        word    fline + xa0 + ya8 + xb3 + yb8 + more\r\n        word    fline + xa0 + yaC + xb4 + ybC\r\n\r\n        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        'G\r\n        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more\r\n        word    fline + xa0 + ya6 + xb0 + ybA + more\r\n        word    fline + xa4 + ya4 + xb4 + yb7 + more\r\n        word    fline + xa3 + ya7 + xb4 + yb7\r\n\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more            'H\r\n        word    fline + xa4 + ya4 + xb4 + ybC + more\r\n        word    fline + xa0 + ya8 + xb4 + yb8\r\n\r\n        word    fline + xa2 + ya4 + xb2 + ybC + more            'I\r\n        word    fline + xa0 + ya4 + xb4 + yb4 + more\r\n        word    fline + xa0 + yaC + xb4 + ybC\r\n\r\n        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more        'J\r\n        word    fline + xa4 + ya6 + xb4 + ybC\r\n\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more            'K\r\n        word    fline + xa4 + yaC + xb0 + yb8 + more\r\n        word    fline + xa4 + ya4 + xb0 + yb8\r\n\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more            'L\r\n        word    fline + xa0 + ya4 + xb4 + yb4\r\n\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more            'M\r\n        word    fline + xa4 + ya4 + xb4 + ybC + more\r\n        word    fline + xa2 + ya8 + xb0 + ybC + more\r\n        word    fline + xa2 + ya8 + xb4 + ybC\r\n\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more            'N\r\n        word    fline + xa4 + ya4 + xb4 + ybC + more\r\n        word    fline + xa4 + ya4 + xb0 + ybC\r\n\r\n        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        '0\r\n        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more\r\n        word    fline + xa0 + ya6 + xb0 + ybA + more\r\n        word    fline + xa4 + ya6 + xb4 + ybA\r\n\r\n        word    farc + xa2 + yaA + aB + ax2 + ay2 + more        'P\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more\r\n        word    fline + xa0 + ya8 + xb2 + yb8 + more\r\n        word    fline + xa0 + yaC + xb2 + ybC\r\n\r\n        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        'Q\r\n        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more\r\n        word    fline + xa0 + ya6 + xb0 + ybA + more\r\n        word    fline + xa4 + ya6 + xb4 + ybA + more\r\n        word    fline + xa2 + ya6 + xb4 + yb3\r\n\r\n        word    farc + xa2 + yaA + aB + ax2 + ay2 + more        'R\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more\r\n        word    fline + xa0 + ya8 + xb2 + yb8 + more\r\n        word    fline + xa0 + yaC + xb2 + ybC + more\r\n        word    fline + xa4 + ya4 + xb2 + yb8\r\n\r\n        word    farc + xa2 + yaA + a4 + ax2 + ay2 + more        'S\r\n        word    farc + xa2 + ya6 + a6 + ax2 + ay2\r\n\r\n        word    fline + xa2 + ya4 + xb2 + ybC + more            'T\r\n        word    fline + xa0 + yaC + xb4 + ybC\r\n\r\n        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more        'U\r\n        word    fline + xa0 + ya6 + xb0 + ybC + more\r\n        word    fline + xa4 + ya6 + xb4 + ybC\r\n\r\n        word    fline + xa2 + ya4 + xb0 + ybC + more            'V\r\n        word    fline + xa2 + ya4 + xb4 + ybC\r\n\r\n        word    fline + xa0 + yaC + xb0 + yb4 + more            'W\r\n        word    fline + xa4 + yaC + xb4 + yb4 + more\r\n        word    fline + xa2 + ya8 + xb0 + yb4 + more\r\n        word    fline + xa2 + ya8 + xb4 + yb4\r\n\r\n        word    fline + xa4 + ya4 + xb0 + ybC + more            'X\r\n        word    fline + xa0 + ya4 + xb4 + ybC\r\n\r\n        word    fline + xa0 + yaC + xb2 + yb8 + more            'Y\r\n        word    fline + xa4 + yaC + xb2 + yb8 + more\r\n        word    fline + xa2 + ya4 + xb2 + yb8\r\n\r\n        word    fline + xa0 + yaC + xb4 + ybC + more            'Z\r\n        word    fline + xa0 + ya4 + xb4 + ybC + more\r\n        word    fline + xa0 + ya4 + xb4 + yb4\r\n\r\n        word    fline + xa2 + yaD + xb2 + yb3 + more            '[\r\n        word    fline + xa2 + yaD + xb4 + ybD + more\r\n        word    fline + xa2 + ya3 + xb4 + yb3\r\n\r\n        word    fline + xa4 + ya4 + xb0 + ybC                   '\\\r\n\r\n        word    fline + xa2 + yaD + xb2 + yb3 + more            '[\r\n        word    fline + xa2 + yaD + xb0 + ybD + more\r\n        word    fline + xa2 + ya3 + xb0 + yb3\r\n\r\n        word    fline + xa2 + yaA + xb0 + yb6 + more            '^\r\n        word    fline + xa2 + yaA + xb4 + yb6\r\n\r\n        word    fline + xa0 + ya1 + xa4 + yb1                   '_\r\n\r\n        word    fline + xa1 + ya9 + xb3 + yb7                   '`\r\n\r\n        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'a\r\n        word    fline + xa4 + ya4 + xb4 + yb8\r\n\r\n        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'b\r\n        word    fline + xa0 + ya4 + xb0 + ybC\r\n\r\n        word    farc + xa2 + ya6 + a9 + ax2 + ay2 + more        'c\r\n        word    fline + xa2 + ya4 + xb4 + yb4 + more\r\n        word    fline + xa2 + ya8 + xb4 + yb8\r\n\r\n        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'd\r\n        word    fline + xa4 + ya4 + xb4 + ybC\r\n\r\n        word    farc + xa2 + ya6 + a4 + ax2 + ay2 + more        'e\r\n        word    fline + xa0 + ya6 + xb4 + yb6 + more\r\n        word    fline + xa2 + ya4 + xb4 + yb4\r\n\r\n        word    farc + xa4 + yaA + aD + ax2 + ay2 + more        'f\r\n        word    fline + xa0 + ya8 + xb4 + yb8 + more\r\n        word    fline + xa2 + ya4 + xb2 + ybA\r\n\r\n        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'g\r\n        word    farc + xa2 + ya3 + aF + ax2 + ay2 + more\r\n        word    fline + xa4 + ya3 + xb4 + yb8 + more\r\n        word    fline + xa1 + ya1 + xb2 + yb1\r\n\r\n        word    farc + xa2 + ya6 + a8 + ax2 + ay2 + more        'h\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more\r\n        word    fline + xa4 + ya4 + xb4 + yb6\r\n\r\n        word    fline + xa1 + ya4 + xb3 + yb4 + more            'i\r\n        word    fline + xa2 + ya4 + xb2 + yb8 + more\r\n        word    fline + xa1 + ya8 + xb2 + yb8 + more\r\n        word    fline + xa2 + yaB + xb2 + ybA\r\n\r\n        word    farc + xa0 + ya3 + aF + ax2 + ay2 + more        'j\r\n        word    fline + xa2 + ya3 + xb2 + yb8 + more\r\n        word    fline + xa1 + ya8 + xb2 + yb8 + more\r\n        word    fline + xa2 + yaB + xb2 + ybA\r\n\r\n        word    fline + xa0 + ya4 + xb0 + ybC + more            'k\r\n        word    fline + xa0 + ya6 + xb2 + yb6 + more\r\n        word    fline + xa2 + ya6 + xb4 + yb8 + more\r\n        word    fline + xa2 + ya6 + xb4 + yb4\r\n\r\n        word    fline + xa1 + ya4 + xb3 + yb4 + more            'l\r\n        word    fline + xa2 + ya4 + xb2 + ybC + more\r\n        word    fline + xa1 + yaC + xb2 + ybC\r\n\r\n        word    farc + xa1 + ya7 + a8 + ax1 + ay1 + more        'm\r\n        word    farc + xa3 + ya7 + a8 + ax1 + ay1 + more\r\n        word    fline + xa0 + ya4 + xb0 + yb8 + more\r\n        word    fline + xa2 + ya4 + xb2 + yb7 + more\r\n        word    fline + xa4 + ya4 + xb4 + yb7\r\n\r\n        word    farc + xa2 + ya6 + a8 + ax2 + ay2 + more        'n\r\n        word    fline + xa0 + ya4 + xb0 + yb8 + more\r\n        word    fline + xa4 + ya4 + xb4 + yb6\r\n\r\n        word    farc + xa2 + ya6 + a0 + ax2 + ay2               'o\r\n\r\n        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'p\r\n        word    fline + xa0 + ya1 + xb0 + yb8\r\n\r\n        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'q\r\n        word    fline + xa4 + ya1 + xb4 + yb8\r\n\r\n        word    farc + xa2 + ya7 + a8 + ax2 + ay1 + more        'r\r\n        word    fline + xa0 + ya4 + xb0 + yb8\r\n\r\n        word    farc + xa2 + ya7 + a9 + ax2 + ay1 + more        's\r\n        word    farc + xa2 + ya5 + aB + ax2 + ay1 + more\r\n        word    fline + xa0 + ya4 + xb2 + yb4 + more\r\n        word    fline + xa2 + ya8 + xb4 + yb8\r\n\r\n        word    farc + xa4 + ya6 + aE + ax2 + ay2 + more        't\r\n        word    fline + xa0 + ya8 + xb4 + yb8 + more\r\n        word    fline + xa2 + ya6 + xb2 + ybA\r\n\r\n        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more        'u\r\n        word    fline + xa0 + ya6 + xb0 + yb8 + more\r\n        word    fline + xa4 + ya4 + xb4 + yb8\r\n\r\n        word    fline + xa0 + ya8 + xb2 + yb4 + more            'v\r\n        word    fline + xa4 + ya8 + xb2 + yb4\r\n\r\n        word    farc + xa1 + ya5 + aA + ax1 + ay1 + more        'w\r\n        word    farc + xa3 + ya5 + aA + ax1 + ay1 + more\r\n        word    fline + xa0 + ya5 + xb0 + yb8 + more\r\n        word    fline + xa2 + ya5 + xb2 + yb6 + more\r\n        word    fline + xa4 + ya5 + xb4 + yb8\r\n\r\n        word    fline + xa0 + ya8 + xb4 + yb4 + more            'x\r\n        word    fline + xa0 + ya4 + xb4 + yb8\r\n\r\n        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more        'y\r\n        word    farc + xa2 + ya3 + aF + ax2 + ay2 + more\r\n        word    fline + xa4 + ya3 + xb4 + yb8 + more\r\n        word    fline + xa0 + ya6 + xb0 + yb8 + more\r\n        word    fline + xa1 + ya1 + xb2 + yb1\r\n\r\n        word    fline + xa0 + ya8 + xb4 + yb8 + more            'z\r\n        word    fline + xa4 + ya8 + xb0 + yb4 + more\r\n        word    fline + xa0 + ya4 + xb4 + yb4\r\n\r\n        word    farc + xa3 + yaA + aD + ax1 + ay3 + more        '{\r\n        word    farc + xa1 + ya6 + aC + ax1 + ay2 + more\r\n        word    farc + xa1 + yaA + aF + ax1 + ay2 + more\r\n        word    farc + xa3 + ya6 + aE + ax1 + ay3\r\n\r\n        word    fline + xa2 + ya3 + xb2 + ybD                   '|\r\n\r\n        word    farc + xa1 + yaA + aC + ax1 + ay3 + more        '}\r\n        word    farc + xa3 + ya6 + aD + ax1 + ay2 + more\r\n        word    farc + xa3 + yaA + aE + ax1 + ay2 + more\r\n        word    farc + xa1 + ya6 + aF + ax1 + ay3\r\n\r\n        word    farc + xa1 + ya8 + a8 + ax1 + ay1 + more        '~\r\n        word    farc + xa3 + ya8 + aA + ax1 + ay1\r\n\r\n' Vector font - custom characters ($7F+)\r\n\r\n        word    fline + xa2 + ya9 + xb0 + yb4 + more            'delta\r\n        word    fline + xa2 + ya9 + xb4 + yb4 + more\r\n        word    fline + xa0 + ya4 + xb4 + yb4\r\n\r\n        word    farc + xa2 + ya7 + a8 + ax2 + ay2 + more        'omega\r\n        word    farc + xa1 + ya7 + aE + ax1 + ay2 + more\r\n        word    farc + xa3 + ya7 + aF + ax1 + ay2 + more\r\n        word    fline + xa1 + ya5 + xb1 + yb4 + more\r\n        word    fline + xa3 + ya5 + xb3 + yb4 + more\r\n        word    fline + xa0 + ya4 + xb1 + yb4 + more\r\n        word    fline + xa4 + ya4 + xb3 + yb4\r\n\r\n        word    farc + xa2 + ya8 + a0 + ax1 + ay1               'bullet\r\n\r\nCON     fx = 3  'number of custom characters\r\n\r\nDAT\r\n\r\n'*************************************\r\n'* Assembly language graphics driver *\r\n'*************************************\r\n\r\n                        org\r\n'\r\n'\r\n' Graphics driver - main loop\r\n'\r\nloop                    rdlong  t1,par          wz      'wait for command\r\n        if_z            jmp     #loop\r\n\r\n                        movd    :arg,#arg0              'get 8 arguments\r\n                        mov     t2,t1\r\n                        mov     t3,#8\r\n:arg                    rdlong  arg0,t2\r\n                        add     :arg,d0\r\n                        add     t2,#4\r\n                        djnz    t3,#:arg\r\n\r\n                        wrlong  zero,par                'zero command to signify received\r\n\r\n                        call    #setd                   'set dx,dy from arg0,arg1\r\n\r\n                        ror     t1,#16+2                'lookup command address\r\n                        add     t1,#jumps\r\n                        movs    :table,t1\r\n                        rol     t1,#2\r\n                        shl     t1,#3\r\n:table                  mov     t2,0\r\n                        shr     t2,t1\r\n                        and     t2,#$FF\r\n                        jmp     t2                      'jump to command\r\n\r\n\r\njumps                   byte    0                       '0\r\n                        byte    setup_                  '1\r\n                        byte    color_                  '2\r\n                        byte    width_                  '3\r\n                        byte    plot_                   '4\r\n                        byte    line_                   '5\r\n                        byte    arc_                    '6\r\n                        byte    vec_                    '7\r\n                        byte    vecarc_                 '8\r\n                        byte    pix_                    '9\r\n                        byte    pixarc_                 'A\r\n                        byte    text_                   'B\r\n                        byte    textarc_                'C\r\n                        byte    textmode_               'D\r\n                        byte    fill_                   'E\r\n                        byte    loop                    'F\r\n'\r\n'\r\n' setup(x_tiles, y_tiles*16, x_origin, y_origin, base_ptr)  bases_ptr, slices_ptr\r\n'\r\nsetup_                  mov     xlongs,arg0             'set xlongs, ylongs\r\n                        mov     ylongs,arg1\r\n                        mov     xorigin,arg2            'set xorigin, yorigin\r\n                        mov     yorigin,arg3\r\n                        mov     basesptr,arg5           'set pointers\r\n                        mov     slicesptr,arg6\r\n\r\n                        jmp     #loop\r\n'\r\n'\r\n' color(c)\r\n'\r\ncolor_                  mov     pcolor,arg0             'set pixel color\r\n\r\n                        jmp     #loop\r\n'\r\n'\r\n' width(w)  pixel_passes\r\n'\r\nwidth_                  mov     pwidth,arg0             'set pixel width\r\n                        mov     passes,arg1             'set pixel passes\r\n\r\n                        jmp     #loop\r\n'\r\n'\r\n' plot(x, y)\r\n'\r\nplot_                   call    #plotd\r\n\r\n                        jmp     #loop\r\n'\r\n'\r\n' line(x, y)\r\n'\r\nline_                   call    #linepd\r\n\r\n                        jmp     #loop\r\n'\r\n'\r\n' arc(x, y, xr, yr, angle, anglestep, iterations, mode)\r\n'\r\narc_                    and     arg7,#3                 'limit mode\r\n\r\n:loop                   call    #arca                   'get arc dx,dy\r\n\r\n                        cmp     arg7,#1         wz      'if not mode 1, set px,py\r\n        if_nz           mov     px,dx\r\n        if_nz           mov     py,dy\r\n\r\n                        tjz     arg6,#loop              'if no points exit with new px,py\r\n\r\n                        cmp     arg7,#3         wz      'if mode 3, set center\r\n        if_z            call    #setd\r\n\r\n                        test    arg7,#1         wz      'if mode 0 or 2, plot point\r\n        if_z            call    #plotp\r\n\r\n                        test    arg7,#1         wz      'if mode 1 or 3, plot line\r\n        if_nz           call    #linepd\r\n\r\n                        cmp     arg7,#2         wz      'if mode 2, set mode 1\r\n        if_z            mov     arg7,#1\r\n\r\n                        add     arg4,arg5               'step angle\r\n                        djnz    arg6,#:loop             'loop if more iterations\r\n\r\n                        jmp     #loop\r\n'\r\n'\r\n' vec(x, y, vecscale, vecangle, vecdef_ptr)\r\n' vecarc(x, y, xr, yr, angle, vecscale, vecangle, vecdef_ptr)\r\n'\r\n' vecdef:       word    $8000/$4000+angle       'vector mode + 13-bit angle (mode: $4000=plot, $8000=line)\r\n'               word    length                  'vector length\r\n'               ...                             'more vectors\r\n'               ...\r\n'               word    0                       'end of definition\r\n'\r\nvecarc_                 call    #arcmod\r\n\r\nvec_                    tjz     arg2,#loop              'if scale 0, exit\r\n\r\n:loop                   rdword  t7,arg4         wz      'get vector mode+angle\r\n                        add     arg4,#2\r\n\r\n        if_z            jmp     #loop                   'if mode+angle 0, exit\r\n\r\n                        rdword  t1,arg4                 'get vector length\r\n                        add     arg4,#2\r\n\r\n                        abs     t2,arg2         wc      'add/sub vector angle to/from angle\r\n                        mov     t6,arg3\r\n                        sumc    t6,t7\r\n\r\n                        call    #multiply               'multiply length by scale\r\n                        add     t1,#$80                 'round up 1/2 lsb\r\n                        shr     t1,#8\r\n\r\n                        mov     t4,t1                   'get arc dx,dy\r\n                        mov     t5,t1\r\n                        call    #arcd\r\n\r\n                        test    t7,h8000        wc      'plot pixel or draw line?\r\n        if_nc           call    #plotd\r\n                        test    t7,h8000        wc\r\n        if_c            call    #linepd\r\n\r\n                        jmp     #:loop                  'get next vector\r\n'\r\n'\r\n' pix(x, y, pixrot, pixdef_ptr)\r\n' pixarc(x, y, xr, yr, angle, pixrot, pixdef_ptr)\r\n'\r\n' pixdef:       word\r\n'               byte    xwords, ywords, xorigin, yorigin\r\n'               word    %%xxxxxxxx,%%xxxxxxxx\r\n'               word    %%xxxxxxxx,%%xxxxxxxx\r\n'               word    %%xxxxxxxx,%%xxxxxxxx\r\n'               ...\r\n'\r\npixarc_                 call    #arcmod\r\n\r\npix_                    mov     t6,pcolor               'save color\r\n\r\n                        mov     px,dx                   'get center into px,py\r\n                        mov     py,dy\r\n\r\n                        mov     sy,pwidth               'get actual pixel width\r\n                        add     sy,#1\r\n\r\n                        rdbyte  dx,arg3                 'get dimensions into dx,dy\r\n                        add     arg3,#1\r\n                        rdbyte  dy,arg3\r\n                        add     arg3,#1\r\n\r\n                        rdbyte  t1,arg3                 'get origin and adjust px,py\r\n                        add     arg3,#1\r\n                        rdbyte  t2,arg3\r\n                        add     arg3,#1\r\n                        neg     t2,t2\r\n                        sub     t2,#1\r\n                        add     t2,dy\r\n                        mov     t3,sy\r\n:adjust                 test    arg2,#%001      wz\r\n                        test    arg2,#%110      wc\r\n        if_z            sumnc   px,t1\r\n        if_nz           sumc    py,t1\r\n                        test    arg2,#%010      wc\r\n        if_nz           sumnc   px,t2\r\n        if_z            sumnc   py,t2\r\n                        djnz    t3,#:adjust\r\n\r\n:yline                  mov     sx,#0                   'plot entire pix\r\n                        mov     t3,dx\r\n:xword                  rdword  t4,arg3                 'read next pix word\r\n                        add     arg3,#2\r\n                        shl     t4,#16\r\n                        mov     t5,#8\r\n:xpixel                 rol     t4,#2                   'plot pixel within word\r\n                        test    t4,#1           wc      'set color\r\n                        muxc    pcolor,color1\r\n                        test    t4,#2           wc\r\n                        muxc    pcolor,color2   wz      '(z=1 if color=0)\r\n        if_nz           call    #plotp\r\n                        test    arg2,#%001      wz      'update px,py for next x\r\n                        test    arg2,#%110      wc\r\n        if_z            sumc    px,sy\r\n        if_nz           sumnc   py,sy\r\n                        add     sx,sy\r\n                        djnz    t5,#:xpixel             'another x pixel?\r\n                        djnz    t3,#:xword              'another x word?\r\n        if_z            sumnc   px,sx                   'update px,py for next y\r\n        if_nz           sumc    py,sx\r\n                        test    arg2,#%010      wc\r\n        if_nz           sumc    px,sy\r\n        if_z            sumc    py,sy\r\n                        djnz    dy,#:yline              'another y line?\r\n\r\n                        mov     pcolor,t6               'restore color\r\n\r\n                        jmp     #loop\r\n'\r\n'\r\n' text(x, y, @string) justx, justy\r\n' textarc(x, y, xr, yr, angle, @string) justx, justy\r\n'\r\ntextarc_                call    #arcmod\r\n\r\ntext_                   add     arg3,arg0               'add x into justx\r\n                        add     arg4,arg1               'add y into justy\r\n\r\n:chr                    rdbyte  t1,arg2         wz      'get chr\r\n                        add     arg2,#1\r\n\r\n        if_z            jmp     #loop                   'if 0, done\r\n\r\n                        sub     t1,#$21                 'if chr out of range, skip\r\n                        cmp     t1,#$7F-$21+fx  wc\r\n        if_nc           jmp     #:skip\r\n\r\n                        mov     arg5,fontptr            'scan font for chr definition\r\n:scan                   tjz     t1,#:def\r\n                        rdword  t2,arg5\r\n                        add     arg5,#2\r\n                        test    t2,h8000        wc\r\n        if_nc           sub     t1,#1\r\n                        jmp     #:scan\r\n\r\n:def                    rdword  t7,arg5                 'get font definition word\r\n                        add     arg5,#2\r\n\r\n                        call    #fontxy                 'extract initial x,y\r\n\r\n                        test    t7,#$80         wc      'arc or line?\r\n        if_nc           jmp     #:line\r\n\r\n\r\n                        mov     t2,textsx               'arc, extract x radius\r\n                        mov     t3,#%0001_0001_1\r\n                        call    #fontb\r\n                        mov     t4,t1\r\n\r\n                        mov     t2,textsy               'extract y radius\r\n                        mov     t3,#%0010_0011_1\r\n                        call    #fontb\r\n                        mov     t5,t1\r\n\r\n                        mov     t2,#1                   'extract starting angle\r\n                        mov     t3,#%0010_0011_0\r\n                        call    #fontb\r\n                        shl     t1,#11\r\n\r\n                        mov     t6,t1                   'extract angle sweep\r\n                        mov     t3,#%0010_0011_0\r\n                        call    #fontb\r\n                        neg     arg6,t1\r\n                        shl     arg6,#4\r\n                        add     arg6,#65\r\n\r\n                        call    #arcd                   'plot initial arc point\r\n                        call    #plotd\r\n\r\n:arc                    call    #arcd                   'connect subsequent arc points with lines\r\n                        call    #linepd\r\n                        add     t6,#$80\r\n                        djnz    arg6,#:arc\r\n\r\n                        jmp     #:more\r\n\r\n\r\n:line                   call    #plotd                  'line, plot initial x,y\r\n\r\n                        call    #fontxy                 'extract terminal x,y\r\n\r\n                        call    #linepd                 'draw line\r\n\r\n\r\n:more                   test    t7,#$02         wc      'more font definition?\r\n        if_c            jmp     #:def\r\n\r\n:skip                   mov     t1,textsp               'advance x to next chr position\r\n                        mov     t2,textsx\r\n                        call    #multiply\r\n                        add     arg3,t1\r\n\r\n                        jmp     #:chr                   'get next chr\r\n\r\n\r\nfontxy                  mov     t2,textsx               'extract x\r\n                        mov     t3,#%0011_0111_0\r\n                        call    #fontb\r\n                        mov     arg0,t1\r\n                        add     arg0,arg3\r\n\r\n                        mov     t2,textsy               'extract y\r\n                        mov     t3,#%0100_1111_0\r\n                        call    #fontb\r\n                        mov     arg1,t1\r\n                        add     arg1,arg4\r\n\r\nsetd                    mov     dx,xorigin              'set dx,dy from arg0,arg1\r\n                        add     dx,arg0\r\n                        mov     dy,yorigin\r\n                        sub     dy,arg1\r\nsetd_ret\r\nfontxy_ret              ret\r\n\r\n\r\nfontb                   mov     t1,t7                   'extract bitrange from font word\r\n                        shr     t3,#1           wc\r\n                        and     t1,t3\r\n        if_c            add     t1,#1\r\n                        shr     t3,#4\r\n                        shr     t7,t3\r\n\r\n                        shl     t1,#32-4                'multiply t1[3..0] by t2\r\n                        mov     t3,#4\r\n:loop                   shl     t1,#1           wc\r\n        if_c            add     t1,t2\r\n                        djnz    t3,#:loop\r\n\r\nfontb_ret               ret\r\n'\r\n'\r\n' textmode(x_scale, y_scale, spacing, justification)\r\n'\r\ntextmode_               mov     textsx,arg0             'set text x scale\r\n                        mov     textsy,arg1             'set text y scale\r\n                        mov     textsp,arg2             'set text spacing\r\n\r\n                        jmp     #loop\r\n'\r\n'\r\n' fill(x, y, da, db, db2, linechange, lines_minus_1)\r\n'\r\nfill_                   shl     dx,#16                  'get left and right fractions\r\n                        or      dx,h8000\r\n                        mov     t1,dx\r\n\r\n                        mov     t2,xlongs               'get x pixels\r\n                        shl     t2,#4\r\n\r\n                        add     arg6,#1                 'pre-increment line counter\r\n\r\n:yloop                  add     dx,arg2                 'adjust left and right fractions\r\n                        add     t1,arg3\r\n\r\n                        cmps    dx,t1           wc      'get left and right integers\r\n        if_c            mov     base0,dx\r\n        if_c            mov     base1,t1\r\n        if_nc           mov     base0,t1\r\n        if_nc           mov     base1,dx\r\n                        sar     base0,#16\r\n                        sar     base1,#16\r\n\r\n                        cmps    base0,t2        wc      'left out of range?\r\n        if_c            cmps    hFFFFFFFF,base1 wc      'right out of range?\r\n        if_c            cmp     dy,ylongs       wc      'y out of range?\r\n        if_nc           jmp     #:skip                  'if any, skip\r\n\r\n                        mins    base0,#0                'limit left and right\r\n                        maxs    base1,t2        wc\r\n        if_nc           sub     base1,#1\r\n\r\n                        shl     base0,#1                'make left mask\r\n                        neg     mask0,#1\r\n                        shl     mask0,base0\r\n                        shr     base0,#5\r\n\r\n                        shl     base1,#1                'make right mask\r\n                        xor     base1,#$1E\r\n                        neg     mask1,#1\r\n                        shr     mask1,base1\r\n                        shr     base1,#5\r\n\r\n                        sub     base1,base0     wz      'ready long count\r\n                        add     base1,#1\r\n\r\n        if_z            and     mask0,mask1             'if single long, merge masks\r\n\r\n                        shl     base0,#1                'get long base\r\n                        add     base0,basesptr\r\n                        rdword  base0,base0\r\n                        shl     dy,#2\r\n                        add     base0,dy\r\n                        shr     dy,#2\r\n\r\n                        mov     bits0,mask0             'ready left mask\r\n:xloop                  mov     bits1,pcolor            'make color mask\r\n                        and     bits1,bits0\r\n                        rdlong  pass,base0              'read-modify-write long\r\n                        andn    pass,bits0\r\n                        or      pass,bits1\r\n                        wrlong  pass,base0\r\n                        shl     ylongs,#2               'advance to next long\r\n                        add     base0,ylongs\r\n                        shr     ylongs,#2\r\n                        cmp     base1,#2        wz      'one more?\r\n        if_nz           neg     bits0,#1                'if not, ready full mask\r\n        if_z            mov     bits0,mask1             'if one more, ready right mask\r\n                        djnz    base1,#:xloop           'loop if more longs\r\n\r\n:skip                   sub     arg5,#1         wc      'delta change?\r\n        if_c            mov     arg3,arg4               'if so, set new deltas\r\n:same\r\n                        add     dy,#1                   'adjust y\r\n                        djnz    arg6,#:yloop            'another y?\r\n\r\n                        jmp     #loop\r\n'\r\n'\r\n' Plot line from px,py to dx,dy\r\n'\r\nlinepd                  cmps    dx,px           wc, wr  'get x difference\r\n                        negc    sx,#1                   'set x direction\r\n\r\n                        cmps    dy,py           wc, wr  'get y difference\r\n                        negc    sy,#1                   'set y direction\r\n\r\n                        abs     dx,dx                   'make differences absolute\r\n                        abs     dy,dy\r\n\r\n                        cmp     dx,dy           wc      'determine dominant axis\r\n        if_nc           tjz     dx,#:last               'if both differences 0, plot single pixel\r\n        if_nc           mov     count,dx                'set pixel count\r\n        if_c            mov     count,dy\r\n                        mov     ratio,count             'set initial ratio\r\n                        shr     ratio,#1\r\n        if_c            jmp     #:yloop                 'x or y dominant?\r\n\r\n\r\n:xloop                  call    #plotp                  'dominant x line\r\n                        add     px,sx\r\n                        sub     ratio,dy        wc\r\n        if_c            add     ratio,dx\r\n        if_c            add     py,sy\r\n                        djnz    count,#:xloop\r\n\r\n                        jmp     #:last                  'plot last pixel\r\n\r\n\r\n:yloop                  call    #plotp                  'dominant y line\r\n                        add     py,sy\r\n                        sub     ratio,dx        wc\r\n        if_c            add     ratio,dy\r\n        if_c            add     px,sx\r\n                        djnz    count,#:yloop\r\n\r\n:last                   call    #plotp                  'plot last pixel\r\n\r\nlinepd_ret              ret\r\n'\r\n'\r\n' Plot pixel at px,py\r\n'\r\nplotd                   mov     px,dx                   'set px,py to dx,dy\r\n                        mov     py,dy\r\n\r\nplotp                   tjnz    pwidth,#wplot           'if width > 0, do wide plot\r\n\r\n                        mov     t1,px                   'compute pixel mask\r\n                        shl     t1,#1\r\n                        mov     mask0,#%11\r\n                        shl     mask0,t1\r\n                        shr     t1,#5\r\n\r\n                        cmp     t1,xlongs       wc      'if x or y out of bounds, exit\r\n        if_c            cmp     py,ylongs       wc\r\n        if_nc           jmp     #plotp_ret\r\n\r\n                        mov     bits0,pcolor            'compute pixel bits\r\n                        and     bits0,mask0\r\n\r\n                        shl     t1,#1                   'get address of pixel long\r\n                        add     t1,basesptr\r\n                        mov     t2,py\r\n                        rdword  t1,t1\r\n                        shl     t2,#2\r\n                        add     t1,t2\r\n\r\n                        rdlong  t2,t1                   'write pixel\r\n                        andn    t2,mask0\r\n                        or      t2,bits0\r\n                        wrlong  t2,t1\r\nplotp_ret\r\nplotd_ret               ret\r\n'\r\n'\r\n' Plot wide pixel\r\n'\r\nwplot                   mov     t1,py                   'if y out of bounds, exit\r\n                        add     t1,#7\r\n                        mov     t2,ylongs\r\n                        add     t2,#7+8\r\n                        cmp     t1,t2           wc\r\n        if_nc           jmp     #plotp_ret\r\n\r\n                        mov     t1,px                   'determine x long pair\r\n                        sub     t1,#8\r\n                        sar     t1,#4\r\n                        cmp     t1,xlongs       wc\r\n                        muxc    jumps,#%01              '(use jumps[1..0] to store writes)\r\n                        add     t1,#1\r\n                        cmp     t1,xlongs       wc\r\n                        muxc    jumps,#%10\r\n\r\n                        test    jumps,#%11      wz      'if x out of bounds, exit\r\n        if_z            jmp     #plotp_ret\r\n\r\n                        shl     t1,#1                   'get base pair\r\n                        add     t1,basesptr\r\n                        rdword  base1,t1\r\n                        sub     t1,#2\r\n                        rdword  base0,t1\r\n\r\n                        mov     t1,px                   'determine pair shifts\r\n                        shl     t1,#1\r\n                        movs    :shift1,t1\r\n                        xor     :shift1,#7<<1\r\n                        add     t1,#9<<1\r\n                        movs    :shift0,t1\r\n                        test    t1,#$F<<1       wz      '(account for special case)\r\n        if_z            andn    jumps,#%01\r\n\r\n                        mov     pass,#0                 'ready to plot slices\r\n                        mov     slice,slicesptr\r\n\r\n:loop                   rdlong  mask0,slice             'get next slice\r\n                        mov     mask1,mask0\r\n\r\n:shift0                 shl     mask0,#0                'position slice\r\n:shift1                 shr     mask1,#0\r\n\r\n                        mov     bits0,pcolor            'colorize slice\r\n                        and     bits0,mask0\r\n                        mov     bits1,pcolor\r\n                        and     bits1,mask1\r\n\r\n                        mov     t1,py                   'plot lower slice\r\n                        add     t1,pass\r\n                        cmp     t1,ylongs       wc\r\n        if_c            call    #wslice\r\n\r\n                        mov     t1,py                   'plot upper slice\r\n                        test    pwidth,#1       wc\r\n                        subx    t1,pass\r\n                        cmp     t1,ylongs       wc\r\n        if_c            call    #wslice\r\n\r\n                        add     slice,#4                'next slice\r\n                        add     pass,#1\r\n                        cmp     pass,passes     wz\r\n        if_nz           jmp     #:loop\r\n\r\n                        jmp     #plotp_ret\r\n'\r\n'\r\n' Plot wide pixel slice\r\n'\r\nwslice                  shl     t1,#2                   'ready long offset\r\n\r\n                        add     base0,t1                'plot left slice\r\n                        test    jumps,#%01      wc\r\n        if_c            rdlong  t2,base0\r\n        if_c            andn    t2,mask0\r\n        if_c            or      t2,bits0\r\n        if_c            wrlong  t2,base0\r\n\r\n                        add     base1,t1                'plot right slice\r\n                        test    jumps,#%10      wc\r\n        if_c            rdlong  t2,base1\r\n        if_c            andn    t2,mask1\r\n        if_c            or      t2,bits1\r\n        if_c            wrlong  t2,base1\r\n\r\n                        sub     base0,t1                'restore bases\r\n                        sub     base1,t1\r\n\r\nwslice_ret              ret\r\n'\r\n'\r\n' Get arc point from args and then move args 5..7 to 2..4\r\n'\r\narcmod                  call    #arca                   'get arc using first 5 args\r\n\r\n                        mov     arg0,dx                 'set arg0,arg1\r\n                        sub     arg0,xorigin\r\n                        mov     arg1,yorigin\r\n                        sub     arg1,dy\r\n\r\n                        mov     arg2,arg5               'move args 5..7 to 2..4\r\n                        mov     arg3,arg6\r\n                        mov     arg4,arg7\r\n\r\narcmod_ret              ret\r\n'\r\n'\r\n' Get arc dx,dy from arg0,arg1\r\n'\r\n'   in:         arg0,arg1 = center x,y\r\n'               arg2/t4 = x length\r\n'               arg3/t5 = y length\r\n'               arg4/t6 = 13-bit angle\r\n'\r\n'   out:        dx,dy = arc point\r\n'\r\narca                    mov     t4,arg2                 'use args\r\n                        mov     t5,arg3\r\n                        mov     t6,arg4\r\n\r\narcd                    call    #setd                   'reset dx,dy to arg0,arg1\r\n\r\n                        mov     t1,t6                   'get arc dx\r\n                        mov     t2,t4\r\n                        call    #polarx\r\n                        add     dx,t1\r\n\r\n                        mov     t1,t6                   'get arc dy\r\n                        mov     t2,t5\r\n                        call    #polary\r\n                        sub     dy,t1\r\narcd_ret\r\narca_ret                ret\r\n'\r\n'\r\n' Polar to cartesian\r\n'\r\n'   in:         t1 = 13-bit angle\r\n'               t2 = 16-bit length\r\n'\r\n'   out:        t1 = x|y\r\n'\r\npolarx                  add     t1,sine_90              'cosine, add 90° for sine lookup\r\npolary                  test    t1,sine_180     wz      'get sine quadrant 3|4 into nz\r\n                        test    t1,sine_90      wc      'get sine quadrant 2|4 into c\r\n                        negc    t1,t1                   'if sine quadrant 2|4, negate table offset\r\n                        or      t1,sine_table           'or in sine table address >> 1\r\n                        shl     t1,#1                   'shift left to get final word address\r\n                        rdword  t1,t1                   'read sine/cosine word\r\n                        call    #multiply               'multiply sine/cosine by length to get x|y\r\n                        add     t1,h8000                'add 1/2 lsb to round up x|y fraction\r\n                        shr     t1,#16                  'justify x|y integer\r\n                        negnz   t1,t1                   'if sine quadrant 3|4, negate x|y\r\npolary_ret\r\npolarx_ret              ret\r\n\r\nsine_90                 long    $0800                   '90° bit\r\nsine_180                long    $1000                   '180° bit\r\nsine_table              long    $E000 >> 1              'sine table address shifted right\r\n'\r\n'\r\n' Multiply\r\n'\r\n'   in:         t1 = 16-bit multiplicand (t1[31..16] must be 0)\r\n'               t2 = 16-bit multiplier\r\n'\r\n'   out:        t1 = 32-bit product\r\n'\r\nmultiply                mov     t3,#16\r\n                        shl     t2,#16\r\n                        shr     t1,#1           wc\r\n\r\n:loop   if_c            add     t1,t2           wc\r\n                        rcr     t1,#1           wc\r\n                        djnz    t3,#:loop\r\n\r\nmultiply_ret            ret\r\n'\r\n'\r\n' Defined data\r\n'\r\nzero                    long    0                       'constants\r\nd0                      long    $200\r\nh8000                   long    $8000\r\nhFFFFFFFF               long    $FFFFFFFF\r\ncolor1                  long    %%1111111111111111\r\ncolor2                  long    %%2222222222222222\r\n\r\nfontptr                 long    0                       'font pointer (set before cognew command)\r\n\r\npcolor                  long    %%1111111111111111      'pixel color\r\npwidth                  long    0                       'pixel width\r\npasses                  long    1                       'pixel passes\r\ntextsx                  long    1                       'text scale x\r\ntextsy                  long    1                       'text scale y\r\ntextsp                  long    6                       'text spacing\r\n'\r\n'\r\n' Undefined data\r\n'\r\nt1                      res     1       'temps\r\nt2                      res     1\r\nt3                      res     1\r\nt4                      res     1\r\nt5                      res     1\r\nt6                      res     1\r\nt7                      res     1\r\n\r\narg0                    res     1       'arguments passed from high-level\r\narg1                    res     1\r\narg2                    res     1\r\narg3                    res     1\r\narg4                    res     1\r\narg5                    res     1\r\narg6                    res     1\r\narg7                    res     1\r\n\r\nbasesptr                res     1       'pointers\r\nslicesptr               res     1\r\n\r\nxlongs                  res     1       'bitmap metrics\r\nylongs                  res     1\r\nxorigin                 res     1\r\nyorigin                 res     1\r\n\r\ndx                      res     1       'line/plot coordinates\r\ndy                      res     1\r\npx                      res     1\r\npy                      res     1\r\n\r\nsx                      res     1       'line\r\nsy                      res     1\r\ncount                   res     1\r\nratio                   res     1\r\n\r\npass                    res     1       'plot\r\nslice                   res     1\r\nbase0                   res     1\r\nbase1                   res     1\r\nmask0                   res     1\r\nmask1                   res     1\r\nbits0                   res     1\r\nbits1                   res     1\r\n\r\n{{\r\n\r\n┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\r\n│                                                   TERMS OF USE: MIT License                                                  │                                                            \r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ \r\n│files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │\r\n│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│\r\n│is furnished to do so, subject to the following conditions:                                                                   │\r\n│                                                                                                                              │\r\n│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│\r\n│                                                                                                                              │\r\n│THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │\r\n│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │\r\n│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │\r\n│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\r\n}}"
  },
  {
    "path": "src/test/resources/samples/langs/Propeller Spin/Inductor.spin",
    "content": "﻿{{\r\n*****************************************\r\n* Inductive Sensor Demo v1.0            *\r\n* Author: Beau Schwabe                  *\r\n* Copyright (c) 2007 Parallax           *\r\n* See end of file for terms of use.     *\r\n*****************************************\r\n\r\n\r\nTest Circuit:\r\n\r\n      10pF   100K  1M\r\nFPin ───┳──┳── SDF(sigma-delta feedback)\r\n          │      ┣──── SDI(sigma-delta input)\r\n        L   100K\r\n                     \r\n         GND    GND  \r\n                                 \r\n\r\nTest Coils:\r\n\r\nWire used was the \"Radio Shack Special\" GREEN (about 27 gauge)\r\n\r\n25T (Coke Can form)    = 2.1MHz\r\n15T (Coke Can form)    = 3.9MHz\r\n 5T (Coke Can form)    = 5.3MHz\r\n50T (BIC pen form)     = 3.2MHz\r\n\r\n\r\n\r\nHow does it work?\r\n\r\nNote: The reported resonate frequency is NOT the actual resonate LC frequency.  Instead it is where the voltage produced from\r\n      the LC circuit was clipped.  \r\n\r\n      In the example circuit below:\r\n      \r\n             C     L\r\n        A ────┳──── GND\r\n                │ \r\n                B         \r\n\r\n      When you apply a small voltage at a specific frequency to an LC circuit (at point \"A\") that is at or near the resonate\r\n      frequency of LC, it is not uncommon to measure 10's or 100's of times the amount of voltage (at point \"B\") that you are\r\n      applying to the LC circuit. (at point \"A\")\r\n\r\n\r\n      In the \"Test Circuit\" above, point \"B\" passes through a diode which then basically feeds a divide by 2 voltage divider:\r\n\r\n              100K 100K\r\n        B ───┳── GND\r\n                  │\r\n                  C\r\n\r\n      ...So in order see the sigma-delta ADC \"clip\" the frequency sweep result, the output from the LC circuit only needs\r\n      to generate about 6.6 Volts above ground. (0.6V drop across the diode, and since the ADC is only sensitive to about\r\n      3V, it works out to be about 6.6V after the voltage divider.)\r\n\r\n\r\n      A typical magnitude plot of a frequency sweep applied to an LC circuit might look something like this:\r\n      \r\n                    *\r\n                    *\r\n                    *\r\n                    *\r\n                   * *\r\n                  *   *\r\n                 *     *\r\n               *         *\r\n             *             *\r\n       *****                 *****\r\n\r\n\r\n       ...With 'clipping' the pattern looks more like this:\r\n\r\n                  X****\r\n                 *     *\r\n               *         *\r\n             *             *\r\n       *****                 *****\r\n\r\n       ...The 'X' denotes the location of the reported resonate frequency. The reason this is slightly off is for\r\n       two reasons really. 1) lazy - I didn't want to fiddle with the voltage divider combo... adjusting so that the\r\n       \"peak\" was also where the ADC happened to \"clip\".  2) some benefit - When you apply a frequency to a tuned LC\r\n       circuit that's resonate frequency is the same as the applied frequency, the LC acts like a dead short.  A\r\n       situation not exactly great for Propeller I/O's\r\n\r\n       Now that we have that out of the way, what happens next?  How can we use this so called \"coil\" as a sensor?\r\n\r\n       If a frequency sweep is initially preformed to determine the resonate frequency clip point, then it just so\r\n       happens that adding additional \"metal\" (<- Does not need to be ferrous) causes the resonate frequency to shift\r\n       to a HIGHER frequency.\r\n\r\n       Once you determine the \"clip\" frequency and you use one of the available counters to constantly feed that\r\n       particular frequency back to the LC circuit, the resulting ADC output is proportional and somewhat linear when\r\n       metal objects are introduced to the coil.\r\n\r\n       Assume frequency increases from Left to Right.  With a slight resonate shift to the right, the ADC reports a\r\n       lower \"de-tuned\" value because the voltage magnitude no longer \"clips\" at the reported resonate frequency.\r\n       Typical ranges are full scale between 65535 (no metal) and 0 (metal saturation)\r\n\r\n \r\n                          X    *****\r\n                              *     *\r\n ADC reports value here --> *         *\r\n                          *             *\r\n                    *****                 *****\r\n\r\n                     Slight shift to the right\r\n\r\n       I also made mention that the response is somewhat linear. As the LC resonance shifts and the ADC value begins\r\n       to lower, the slope is steepest near the \"clip\" point.  Therefore, the slightest shift results in larger value\r\n       changes.  Since the coil is actually the least sensitive to metal the further away it is (Law of squares) and\r\n       most sensitive to metal the closer it is, the resulting combination acts to linearize the output. I need to\r\n       point out that some LC combinations will exhibit plateaus and other anomalies caused by varying parasitic circuit\r\n       conditions that will affect the overall output, so a little bit of trial and error is necessary to get things\r\n       the way you want them.\r\n\r\n}}\r\nOBJ\r\n   Freq   : \"Synth\"\r\n   ADC    : \"ADC\"\r\n   gr     : \"graphics\"\r\n   Num    : \"Numbers\"\r\nCON\r\n  FPin =                        0\r\n\r\n  UpperFrequency =              6_000_000\r\n  LowerFrequency =              2_000_000\r\n\r\n  bitmap_base = $2000\r\n  display_base = $5000\r\n\r\nVAR\r\n    long              FMax, FTemp, FValue, Frequency\r\n    \r\nPUB demo\r\n    'start and setup graphics\r\n    gr.start\r\n    gr.setup(16, 12, 128, 96, bitmap_base)\r\n\r\n    FindResonateFrequency\r\n\r\n    DisplayInductorValue\r\n\r\nPUB DisplayInductorValue | X\r\n    Freq.Synth(\"A\", FPin, FValue)\r\n    repeat\r\n      ADC.SigmaDelta(@FTemp)\r\n\r\n'**************************************** Graphics Option Start *********************************************\r\n      'clear bitmap\r\n      gr.clear\r\n      'draw text\r\n      gr.textmode(1,1,7,5)\r\n      gr.colorwidth(1,0)\r\n      gr.text(0,90,string(\"Inductive Propeller Sensor\"))\r\n\r\n      gr.colorwidth(1,5)\r\n      X := (65535 - FTemp )*200/65535\r\n      gr.plot(-100+X,15)\r\n\r\n      gr.textmode(1,1,7,%0000)\r\n      gr.colorwidth(1,0)\r\n      gr.text(-100,-20,string(\"Resonate Frequency =\"))\r\n      gr.text(35,-20,Num.ToStr(FValue,10))\r\n\r\n      gr.text(-100,-36,string(\"ADC Frequency Response =\"))\r\n      gr.text(65,-36,Num.ToStr(FTemp,10))\r\n\r\n      'copy bitmap to display\r\n      gr.copy(display_base)\r\n'**************************************** Graphics Option Finish *********************************************      \r\n\r\nPUB FindResonateFrequency | P\r\n    dira[FPin]                  := 1\r\n    \r\n    FMax := 0\r\n    repeat Frequency from LowerFrequency to UpperFrequency step 1000\r\n      Freq.Synth(\"A\", FPin, Frequency)\r\n      ADC.SigmaDelta(@FTemp)\r\n\r\n      if FTemp > FMax\r\n         FMax := FTemp\r\n         FValue := Frequency\r\n'**************************************** Graphics Option Start *********************************************\r\n      P := (Frequency - LowerFrequency)*100/(UpperFrequency - LowerFrequency)\r\n\r\n      gr.colorwidth(1,5)\r\n      gr.plot(0,0)\r\n      gr.line(P,0)\r\n      gr.colorwidth(3,5)\r\n      gr.line(100,0)\r\n\r\n      gr.colorwidth(2,0)\r\n      gr.plot(P,(FTemp/1024)+10)\r\n      gr.colorwidth(0,1)\r\n      gr.plot(P+1,5)\r\n      gr.line(P+1,50)\r\n\r\n      gr.copy(display_base)\r\n'**************************************** Graphics Option Finish *********************************************\r\n\r\nDAT\r\n{{\r\n┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\r\n│                                                   TERMS OF USE: MIT License                                                  │\r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │\r\n│files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │\r\n│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│\r\n│is furnished to do so, subject to the following conditions:                                                                   │\r\n│                                                                                                                              │\r\n│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│\r\n│                                                                                                                              │\r\n│THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │\r\n│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │\r\n│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │\r\n│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\r\n}}"
  },
  {
    "path": "src/test/resources/samples/langs/Propeller Spin/Keyboard.spin",
    "content": "﻿''***************************************\r\n''*  PS/2 Keyboard Driver v1.0.1        *\r\n''*  Author: Chip Gracey                *\r\n''*  Copyright (c) 2004 Parallax, Inc.  *\r\n''*  See end of file for terms of use.  *\r\n''***************************************\r\n\r\n{-----------------REVISION HISTORY-----------------\r\n v1.0.1 - Updated 6/15/2006 to work with Propeller Tool 0.96}\r\n \r\nVAR\r\n\r\n  long  cog\r\n\r\n  long  par_tail        'key buffer tail        read/write      (19 contiguous longs)\r\n  long  par_head        'key buffer head        read-only\r\n  long  par_present     'keyboard present       read-only\r\n  long  par_states[8]   'key states (256 bits)  read-only\r\n  long  par_keys[8]     'key buffer (16 words)  read-only       (also used to pass initial parameters)\r\n\r\n\r\nPUB start(dpin, cpin) : okay\r\n\r\n'' Start keyboard driver - starts a cog\r\n'' returns false if no cog available\r\n''\r\n''   dpin  = data signal on PS/2 jack\r\n''   cpin  = clock signal on PS/2 jack\r\n''\r\n''     use 100-ohm resistors between pins and jack\r\n''     use 10K-ohm resistors to pull jack-side signals to VDD\r\n''     connect jack-power to 5V, jack-gnd to VSS\r\n''\r\n'' all lock-keys will be enabled, NumLock will be initially 'on',\r\n'' and auto-repeat will be set to 15cps with a delay of .5s\r\n\r\n  okay := startx(dpin, cpin, %0_000_100, %01_01000)\r\n\r\n\r\nPUB startx(dpin, cpin, locks, auto) : okay\r\n\r\n'' Like start, but allows you to specify lock settings and auto-repeat\r\n''\r\n''   locks = lock setup\r\n''           bit 6 disallows shift-alphas (case set soley by CapsLock)\r\n''           bits 5..3 disallow toggle of NumLock/CapsLock/ScrollLock state\r\n''           bits 2..0 specify initial state of NumLock/CapsLock/ScrollLock\r\n''           (eg. %0_001_100 = disallow ScrollLock, NumLock initially 'on')\r\n''\r\n''   auto  = auto-repeat setup\r\n''           bits 6..5 specify delay (0=.25s, 1=.5s, 2=.75s, 3=1s)\r\n''           bits 4..0 specify repeat rate (0=30cps..31=2cps)\r\n''           (eg %01_00000 = .5s delay, 30cps repeat)\r\n\r\n  stop\r\n  longmove(@par_keys, @dpin, 4)\r\n  okay := cog := cognew(@entry, @par_tail) + 1\r\n\r\n\r\nPUB stop\r\n\r\n'' Stop keyboard driver - frees a cog\r\n\r\n  if cog\r\n    cogstop(cog~ -  1)\r\n  longfill(@par_tail, 0, 19)\r\n\r\n\r\nPUB present : truefalse\r\n\r\n'' Check if keyboard present - valid ~2s after start\r\n'' returns t|f\r\n\r\n  truefalse := -par_present\r\n\r\n\r\nPUB key : keycode\r\n\r\n'' Get key (never waits)\r\n'' returns key (0 if buffer empty)\r\n\r\n  if par_tail <> par_head\r\n    keycode := par_keys.word[par_tail]\r\n    par_tail := ++par_tail & $F\r\n\r\n\r\nPUB getkey : keycode\r\n\r\n'' Get next key (may wait for keypress)\r\n'' returns key\r\n\r\n  repeat until (keycode := key)\r\n\r\n\r\nPUB newkey : keycode\r\n\r\n'' Clear buffer and get new key (always waits for keypress)\r\n'' returns key\r\n\r\n  par_tail := par_head\r\n  keycode := getkey\r\n\r\n\r\nPUB gotkey : truefalse\r\n\r\n'' Check if any key in buffer\r\n'' returns t|f\r\n\r\n  truefalse := par_tail <> par_head\r\n\r\n\r\nPUB clearkeys\r\n\r\n'' Clear key buffer\r\n\r\n  par_tail := par_head\r\n\r\n\r\nPUB keystate(k) : state\r\n\r\n'' Get the state of a particular key\r\n'' returns t|f\r\n\r\n  state := -(par_states[k >> 5] >> k & 1)\r\n\r\n\r\nDAT\r\n\r\n'******************************************\r\n'* Assembly language PS/2 keyboard driver *\r\n'******************************************\r\n\r\n                        org\r\n'\r\n'\r\n' Entry\r\n'\r\nentry                   movd    :par,#_dpin             'load input parameters _dpin/_cpin/_locks/_auto\r\n                        mov     x,par\r\n                        add     x,#11*4\r\n                        mov     y,#4\r\n:par                    rdlong  0,x\r\n                        add     :par,dlsb\r\n                        add     x,#4\r\n                        djnz    y,#:par\r\n\r\n                        mov     dmask,#1                'set pin masks\r\n                        shl     dmask,_dpin\r\n                        mov     cmask,#1\r\n                        shl     cmask,_cpin\r\n\r\n                        test    _dpin,#$20      wc      'modify port registers within code\r\n                        muxc    _d1,dlsb\r\n                        muxc    _d2,dlsb\r\n                        muxc    _d3,#1\r\n                        muxc    _d4,#1\r\n                        test    _cpin,#$20      wc\r\n                        muxc    _c1,dlsb\r\n                        muxc    _c2,dlsb\r\n                        muxc    _c3,#1\r\n\r\n                        mov     _head,#0                'reset output parameter _head\r\n'\r\n'\r\n' Reset keyboard\r\n'\r\nreset                   mov     dira,#0                 'reset directions\r\n                        mov     dirb,#0\r\n\r\n                        movd    :par,#_present          'reset output parameters _present/_states[8]\r\n                        mov     x,#1+8\r\n:par                    mov     0,#0\r\n                        add     :par,dlsb\r\n                        djnz    x,#:par\r\n\r\n                        mov     stat,#8                 'set reset flag\r\n'\r\n'\r\n' Update parameters\r\n'\r\nupdate                  movd    :par,#_head             'update output parameters _head/_present/_states[8]\r\n                        mov     x,par\r\n                        add     x,#1*4\r\n                        mov     y,#1+1+8\r\n:par                    wrlong  0,x\r\n                        add     :par,dlsb\r\n                        add     x,#4\r\n                        djnz    y,#:par\r\n\r\n                        test    stat,#8         wc      'if reset flag, transmit reset command\r\n        if_c            mov     data,#$FF\r\n        if_c            call    #transmit\r\n'\r\n'\r\n' Get scancode\r\n'\r\nnewcode                 mov     stat,#0                 'reset state\r\n\r\n:same                   call    #receive                'receive byte from keyboard\r\n\r\n                        cmp     data,#$83+1     wc      'scancode?\r\n\r\n        if_nc           cmp     data,#$AA       wz      'powerup/reset?\r\n        if_nc_and_z     jmp     #configure\r\n\r\n        if_nc           cmp     data,#$E0       wz      'extended?\r\n        if_nc_and_z     or      stat,#1\r\n        if_nc_and_z     jmp     #:same\r\n\r\n        if_nc           cmp     data,#$F0       wz      'released?\r\n        if_nc_and_z     or      stat,#2\r\n        if_nc_and_z     jmp     #:same\r\n\r\n        if_nc           jmp     #newcode                'unknown, ignore\r\n'\r\n'\r\n' Translate scancode and enter into buffer\r\n'\r\n                        test    stat,#1         wc      'lookup code with extended flag\r\n                        rcl     data,#1\r\n                        call    #look\r\n\r\n                        cmp     data,#0         wz      'if unknown, ignore\r\n        if_z            jmp     #newcode\r\n\r\n                        mov     t,_states+6             'remember lock keys in _states\r\n\r\n                        mov     x,data                  'set/clear key bit in _states\r\n                        shr     x,#5\r\n                        add     x,#_states\r\n                        movd    :reg,x\r\n                        mov     y,#1\r\n                        shl     y,data\r\n                        test    stat,#2         wc\r\n:reg                    muxnc   0,y\r\n\r\n        if_nc           cmpsub  data,#$F0       wc      'if released or shift/ctrl/alt/win, done\r\n        if_c            jmp     #update\r\n\r\n                        mov     y,_states+7             'get shift/ctrl/alt/win bit pairs\r\n                        shr     y,#16\r\n\r\n                        cmpsub  data,#$E0       wc      'translate keypad, considering numlock\r\n        if_c            test    _locks,#%100    wz\r\n        if_c_and_z      add     data,#@keypad1-@table\r\n        if_c_and_nz     add     data,#@keypad2-@table\r\n        if_c            call    #look\r\n        if_c            jmp     #:flags\r\n\r\n                        cmpsub  data,#$DD       wc      'handle scrlock/capslock/numlock\r\n        if_c            mov     x,#%001_000\r\n        if_c            shl     x,data\r\n        if_c            andn    x,_locks\r\n        if_c            shr     x,#3\r\n        if_c            shr     t,#29                   'ignore auto-repeat\r\n        if_c            andn    x,t             wz\r\n        if_c            xor     _locks,x\r\n        if_c            add     data,#$DD\r\n        if_c_and_nz     or      stat,#4                 'if change, set configure flag to update leds\r\n\r\n                        test    y,#%11          wz      'get shift into nz\r\n\r\n        if_nz           cmp     data,#$60+1     wc      'check shift1\r\n        if_nz_and_c     cmpsub  data,#$5B       wc\r\n        if_nz_and_c     add     data,#@shift1-@table\r\n        if_nz_and_c     call    #look\r\n        if_nz_and_c     andn    y,#%11\r\n\r\n        if_nz           cmp     data,#$3D+1     wc      'check shift2\r\n        if_nz_and_c     cmpsub  data,#$27       wc\r\n        if_nz_and_c     add     data,#@shift2-@table\r\n        if_nz_and_c     call    #look\r\n        if_nz_and_c     andn    y,#%11\r\n\r\n                        test    _locks,#%010    wc      'check shift-alpha, considering capslock\r\n                        muxnc   :shift,#$20\r\n                        test    _locks,#$40     wc\r\n        if_nz_and_nc    xor     :shift,#$20\r\n                        cmp     data,#\"z\"+1     wc\r\n        if_c            cmpsub  data,#\"a\"       wc\r\n:shift  if_c            add     data,#\"A\"\r\n        if_c            andn    y,#%11\r\n\r\n:flags                  ror     data,#8                 'add shift/ctrl/alt/win flags\r\n                        mov     x,#4                    '+$100 if shift\r\n:loop                   test    y,#%11          wz      '+$200 if ctrl\r\n                        shr     y,#2                    '+$400 if alt\r\n        if_nz           or      data,#1                 '+$800 if win\r\n                        ror     data,#1\r\n                        djnz    x,#:loop\r\n                        rol     data,#12\r\n\r\n                        rdlong  x,par                   'if room in buffer and key valid, enter\r\n                        sub     x,#1\r\n                        and     x,#$F\r\n                        cmp     x,_head         wz\r\n        if_nz           test    data,#$FF       wz\r\n        if_nz           mov     x,par\r\n        if_nz           add     x,#11*4\r\n        if_nz           add     x,_head\r\n        if_nz           add     x,_head\r\n        if_nz           wrword  data,x\r\n        if_nz           add     _head,#1\r\n        if_nz           and     _head,#$F\r\n\r\n                        test    stat,#4         wc      'if not configure flag, done\r\n        if_nc           jmp     #update                 'else configure to update leds\r\n'\r\n'\r\n' Configure keyboard\r\n'\r\nconfigure               mov     data,#$F3               'set keyboard auto-repeat\r\n                        call    #transmit\r\n                        mov     data,_auto\r\n                        and     data,#%11_11111\r\n                        call    #transmit\r\n\r\n                        mov     data,#$ED               'set keyboard lock-leds\r\n                        call    #transmit\r\n                        mov     data,_locks\r\n                        rev     data,#-3 & $1F\r\n                        test    data,#%100      wc\r\n                        rcl     data,#1\r\n                        and     data,#%111\r\n                        call    #transmit\r\n\r\n                        mov     x,_locks                'insert locks into _states\r\n                        and     x,#%111\r\n                        shl     _states+7,#3\r\n                        or      _states+7,x\r\n                        ror     _states+7,#3\r\n\r\n                        mov     _present,#1             'set _present\r\n\r\n                        jmp     #update                 'done\r\n'\r\n'\r\n' Lookup byte in table\r\n'\r\nlook                    ror     data,#2                 'perform lookup\r\n                        movs    :reg,data\r\n                        add     :reg,#table\r\n                        shr     data,#27\r\n                        mov     x,data\r\n:reg                    mov     data,0\r\n                        shr     data,x\r\n\r\n                        jmp     #rand                   'isolate byte\r\n'\r\n'\r\n' Transmit byte to keyboard\r\n'\r\ntransmit\r\n_c1                     or      dira,cmask              'pull clock low\r\n                        movs    napshr,#13              'hold clock for ~128us (must be >100us)\r\n                        call    #nap\r\n_d1                     or      dira,dmask              'pull data low\r\n                        movs    napshr,#18              'hold data for ~4us\r\n                        call    #nap\r\n_c2                     xor     dira,cmask              'release clock\r\n\r\n                        test    data,#$0FF      wc      'append parity and stop bits to byte\r\n                        muxnc   data,#$100\r\n                        or      data,dlsb\r\n\r\n                        mov     x,#10                   'ready 10 bits\r\ntransmit_bit            call    #wait_c0                'wait until clock low\r\n                        shr     data,#1         wc      'output data bit\r\n_d2                     muxnc   dira,dmask\r\n                        mov     wcond,c1                'wait until clock high\r\n                        call    #wait\r\n                        djnz    x,#transmit_bit         'another bit?\r\n\r\n                        mov     wcond,c0d0              'wait until clock and data low\r\n                        call    #wait\r\n                        mov     wcond,c1d1              'wait until clock and data high\r\n                        call    #wait\r\n\r\n                        call    #receive_ack            'receive ack byte with timed wait\r\n                        cmp     data,#$FA       wz      'if ack error, reset keyboard\r\n        if_nz           jmp     #reset\r\n\r\ntransmit_ret            ret\r\n'\r\n'\r\n' Receive byte from keyboard\r\n'\r\nreceive                 test    _cpin,#$20      wc      'wait indefinitely for initial clock low\r\n                        waitpne cmask,cmask\r\nreceive_ack\r\n                        mov     x,#11                   'ready 11 bits\r\nreceive_bit             call    #wait_c0                'wait until clock low\r\n                        movs    napshr,#16              'pause ~16us\r\n                        call    #nap\r\n_d3                     test    dmask,ina       wc      'input data bit\r\n                        rcr     data,#1\r\n                        mov     wcond,c1                'wait until clock high\r\n                        call    #wait\r\n                        djnz    x,#receive_bit          'another bit?\r\n\r\n                        shr     data,#22                'align byte\r\n                        test    data,#$1FF      wc      'if parity error, reset keyboard\r\n        if_nc           jmp     #reset\r\nrand                    and     data,#$FF               'isolate byte\r\n\r\nlook_ret\r\nreceive_ack_ret\r\nreceive_ret             ret\r\n'\r\n'\r\n' Wait for clock/data to be in required state(s)\r\n'\r\nwait_c0                 mov     wcond,c0                '(wait until clock low)\r\n\r\nwait                    mov     y,tenms                 'set timeout to 10ms\r\n\r\nwloop                   movs    napshr,#18              'nap ~4us\r\n                        call    #nap\r\n_c3                     test    cmask,ina       wc      'check required state(s)\r\n_d4                     test    dmask,ina       wz      'loop until got state(s) or timeout\r\nwcond   if_never        djnz    y,#wloop                '(replaced with c0/c1/c0d0/c1d1)\r\n\r\n                        tjz     y,#reset                'if timeout, reset keyboard\r\nwait_ret\r\nwait_c0_ret             ret\r\n\r\n\r\nc0      if_c            djnz    y,#wloop                '(if_never replacements)\r\nc1      if_nc           djnz    y,#wloop\r\nc0d0    if_c_or_nz      djnz    y,#wloop\r\nc1d1    if_nc_or_z      djnz    y,#wloop\r\n'\r\n'\r\n' Nap\r\n'\r\nnap                     rdlong  t,#0                    'get clkfreq\r\nnapshr                  shr     t,#18/16/13             'shr scales time\r\n                        min     t,#3                    'ensure waitcnt won't snag\r\n                        add     t,cnt                   'add cnt to time\r\n                        waitcnt t,#0                    'wait until time elapses (nap)\r\n\r\nnap_ret                 ret\r\n'\r\n'\r\n' Initialized data\r\n'\r\n'\r\ndlsb                    long    1 << 9\r\ntenms                   long    10_000 / 4\r\n'\r\n'\r\n' Lookup table\r\n'                               ascii   scan    extkey  regkey  ()=keypad\r\n'\r\ntable                   word    $0000   '00\r\n                        word    $00D8   '01             F9\r\n                        word    $0000   '02\r\n                        word    $00D4   '03             F5\r\n                        word    $00D2   '04             F3\r\n                        word    $00D0   '05             F1\r\n                        word    $00D1   '06             F2\r\n                        word    $00DB   '07             F12\r\n                        word    $0000   '08\r\n                        word    $00D9   '09             F10\r\n                        word    $00D7   '0A             F8\r\n                        word    $00D5   '0B             F6\r\n                        word    $00D3   '0C             F4\r\n                        word    $0009   '0D             Tab\r\n                        word    $0060   '0E             `\r\n                        word    $0000   '0F\r\n                        word    $0000   '10\r\n                        word    $F5F4   '11     Alt-R   Alt-L\r\n                        word    $00F0   '12             Shift-L\r\n                        word    $0000   '13\r\n                        word    $F3F2   '14     Ctrl-R  Ctrl-L\r\n                        word    $0071   '15             q\r\n                        word    $0031   '16             1\r\n                        word    $0000   '17\r\n                        word    $0000   '18\r\n                        word    $0000   '19\r\n                        word    $007A   '1A             z\r\n                        word    $0073   '1B             s\r\n                        word    $0061   '1C             a\r\n                        word    $0077   '1D             w\r\n                        word    $0032   '1E             2\r\n                        word    $F600   '1F     Win-L\r\n                        word    $0000   '20\r\n                        word    $0063   '21             c\r\n                        word    $0078   '22             x\r\n                        word    $0064   '23             d\r\n                        word    $0065   '24             e\r\n                        word    $0034   '25             4\r\n                        word    $0033   '26             3\r\n                        word    $F700   '27     Win-R\r\n                        word    $0000   '28\r\n                        word    $0020   '29             Space\r\n                        word    $0076   '2A             v\r\n                        word    $0066   '2B             f\r\n                        word    $0074   '2C             t\r\n                        word    $0072   '2D             r\r\n                        word    $0035   '2E             5\r\n                        word    $CC00   '2F     Apps\r\n                        word    $0000   '30\r\n                        word    $006E   '31             n\r\n                        word    $0062   '32             b\r\n                        word    $0068   '33             h\r\n                        word    $0067   '34             g\r\n                        word    $0079   '35             y\r\n                        word    $0036   '36             6\r\n                        word    $CD00   '37     Power\r\n                        word    $0000   '38\r\n                        word    $0000   '39\r\n                        word    $006D   '3A             m\r\n                        word    $006A   '3B             j\r\n                        word    $0075   '3C             u\r\n                        word    $0037   '3D             7\r\n                        word    $0038   '3E             8\r\n                        word    $CE00   '3F     Sleep\r\n                        word    $0000   '40\r\n                        word    $002C   '41             ,\r\n                        word    $006B   '42             k\r\n                        word    $0069   '43             i\r\n                        word    $006F   '44             o\r\n                        word    $0030   '45             0\r\n                        word    $0039   '46             9\r\n                        word    $0000   '47\r\n                        word    $0000   '48\r\n                        word    $002E   '49             .\r\n                        word    $EF2F   '4A     (/)     /\r\n                        word    $006C   '4B             l\r\n                        word    $003B   '4C             ;\r\n                        word    $0070   '4D             p\r\n                        word    $002D   '4E             -\r\n                        word    $0000   '4F\r\n                        word    $0000   '50\r\n                        word    $0000   '51\r\n                        word    $0027   '52             '\r\n                        word    $0000   '53\r\n                        word    $005B   '54             [\r\n                        word    $003D   '55             =\r\n                        word    $0000   '56\r\n                        word    $0000   '57\r\n                        word    $00DE   '58             CapsLock\r\n                        word    $00F1   '59             Shift-R\r\n                        word    $EB0D   '5A     (Enter) Enter\r\n                        word    $005D   '5B             ]\r\n                        word    $0000   '5C\r\n                        word    $005C   '5D             \\\r\n                        word    $CF00   '5E     WakeUp\r\n                        word    $0000   '5F\r\n                        word    $0000   '60\r\n                        word    $0000   '61\r\n                        word    $0000   '62\r\n                        word    $0000   '63\r\n                        word    $0000   '64\r\n                        word    $0000   '65\r\n                        word    $00C8   '66             BackSpace\r\n                        word    $0000   '67\r\n                        word    $0000   '68\r\n                        word    $C5E1   '69     End     (1)\r\n                        word    $0000   '6A\r\n                        word    $C0E4   '6B     Left    (4)\r\n                        word    $C4E7   '6C     Home    (7)\r\n                        word    $0000   '6D\r\n                        word    $0000   '6E\r\n                        word    $0000   '6F\r\n                        word    $CAE0   '70     Insert  (0)\r\n                        word    $C9EA   '71     Delete  (.)\r\n                        word    $C3E2   '72     Down    (2)\r\n                        word    $00E5   '73             (5)\r\n                        word    $C1E6   '74     Right   (6)\r\n                        word    $C2E8   '75     Up      (8)\r\n                        word    $00CB   '76             Esc\r\n                        word    $00DF   '77             NumLock\r\n                        word    $00DA   '78             F11\r\n                        word    $00EC   '79             (+)\r\n                        word    $C7E3   '7A     PageDn  (3)\r\n                        word    $00ED   '7B             (-)\r\n                        word    $DCEE   '7C     PrScr   (*)\r\n                        word    $C6E9   '7D     PageUp  (9)\r\n                        word    $00DD   '7E             ScrLock\r\n                        word    $0000   '7F\r\n                        word    $0000   '80\r\n                        word    $0000   '81\r\n                        word    $0000   '82\r\n                        word    $00D6   '83             F7\r\n\r\nkeypad1                 byte    $CA, $C5, $C3, $C7, $C0, 0, $C1, $C4, $C2, $C6, $C9, $0D, \"+-*/\"\r\n\r\nkeypad2                 byte    \"0123456789.\", $0D, \"+-*/\"\r\n\r\nshift1                  byte    \"{|}\", 0, 0, \"~\"\r\n\r\nshift2                  byte    $22, 0, 0, 0, 0, \"<_>?)!@#$%^&*(\", 0, \":\", 0, \"+\"\r\n'\r\n'\r\n' Uninitialized data\r\n'\r\ndmask                   res     1\r\ncmask                   res     1\r\nstat                    res     1\r\ndata                    res     1\r\nx                       res     1\r\ny                       res     1\r\nt                       res     1\r\n\r\n_head                   res     1       'write-only\r\n_present                res     1       'write-only\r\n_states                 res     8       'write-only\r\n_dpin                   res     1       'read-only at start\r\n_cpin                   res     1       'read-only at start\r\n_locks                  res     1       'read-only at start\r\n_auto                   res     1       'read-only at start\r\n\r\n''\r\n''\r\n''      _________\r\n''      Key Codes\r\n''\r\n''      00..DF  = keypress and keystate\r\n''      E0..FF  = keystate only\r\n''\r\n''\r\n''      09      Tab\r\n''      0D      Enter\r\n''      20      Space\r\n''      21      !\r\n''      22      \"\r\n''      23      #\r\n''      24      $\r\n''      25      %\r\n''      26      &\r\n''      27      '\r\n''      28      (\r\n''      29      )\r\n''      2A      *\r\n''      2B      +\r\n''      2C      ,\r\n''      2D      -\r\n''      2E      .\r\n''      2F      /\r\n''      30      0..9\r\n''      3A      :\r\n''      3B      ;\r\n''      3C      <\r\n''      3D      =\r\n''      3E      >\r\n''      3F      ?\r\n''      40      @       \r\n''      41..5A  A..Z\r\n''      5B      [\r\n''      5C      \\\r\n''      5D      ]\r\n''      5E      ^\r\n''      5F      _\r\n''      60      `\r\n''      61..7A  a..z\r\n''      7B      {\r\n''      7C      |\r\n''      7D      }\r\n''      7E      ~\r\n''\r\n''      80-BF   (future international character support)\r\n''\r\n''      C0      Left Arrow\r\n''      C1      Right Arrow\r\n''      C2      Up Arrow\r\n''      C3      Down Arrow\r\n''      C4      Home\r\n''      C5      End\r\n''      C6      Page Up\r\n''      C7      Page Down\r\n''      C8      Backspace\r\n''      C9      Delete\r\n''      CA      Insert\r\n''      CB      Esc\r\n''      CC      Apps\r\n''      CD      Power\r\n''      CE      Sleep\r\n''      CF      Wakeup\r\n''\r\n''      D0..DB  F1..F12\r\n''      DC      Print Screen\r\n''      DD      Scroll Lock\r\n''      DE      Caps Lock\r\n''      DF      Num Lock\r\n''\r\n''      E0..E9  Keypad 0..9\r\n''      EA      Keypad .\r\n''      EB      Keypad Enter\r\n''      EC      Keypad +\r\n''      ED      Keypad -\r\n''      EE      Keypad *\r\n''      EF      Keypad /\r\n''\r\n''      F0      Left Shift\r\n''      F1      Right Shift\r\n''      F2      Left Ctrl\r\n''      F3      Right Ctrl\r\n''      F4      Left Alt\r\n''      F5      Right Alt\r\n''      F6      Left Win\r\n''      F7      Right Win\r\n''\r\n''      FD      Scroll Lock State\r\n''      FE      Caps Lock State\r\n''      FF      Num Lock State\r\n''\r\n''      +100    if Shift\r\n''      +200    if Ctrl\r\n''      +400    if Alt\r\n''      +800    if Win\r\n''\r\n''      eg. Ctrl-Alt-Delete = $6C9\r\n''\r\n''\r\n'' Note: Driver will buffer up to 15 keystrokes, then ignore overflow.\r\n\r\n{{\r\n\r\n┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\r\n│                                                   TERMS OF USE: MIT License                                                  │                                                            \r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ \r\n│files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │\r\n│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│\r\n│is furnished to do so, subject to the following conditions:                                                                   │\r\n│                                                                                                                              │\r\n│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│\r\n│                                                                                                                              │\r\n│THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │\r\n│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │\r\n│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │\r\n│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\r\n}}"
  },
  {
    "path": "src/test/resources/samples/langs/Propeller Spin/TV.spin",
    "content": "﻿''***************************************\r\n''*  TV Driver v1.1                     *\r\n''*  Author: Chip Gracey                *\r\n''*  Copyright (c) 2004 Parallax, Inc.  *               \r\n''*  See end of file for terms of use.  *               \r\n''***************************************\r\n\r\n' v1.0 - 01 May 2006 - original version\r\n' v1.1 - 17 May 2006 - pixel tile size can now be 16 x 32 to enable more efficient\r\n'                       character displays utilizing the internal font - see 'tv_mode'\r\n\r\n\r\nCON\r\n\r\n  fntsc         = 3_579_545     'NTSC color frequency\r\n  lntsc         = 3640          'NTSC color cycles per line * 16\r\n  sntsc         = 624           'NTSC color cycles per sync * 16\r\n\r\n  fpal          = 4_433_618     'PAL color frequency\r\n  lpal          = 4540          'PAL color cycles per line * 16\r\n  spal          = 848           'PAL color cycles per sync * 16\r\n\r\n  paramcount    = 14\r\n  colortable    = $180          'start of colortable inside cog\r\n  \r\n\r\nVAR\r\n\r\n  long  cog\r\n\r\n\r\nPUB start(tvptr) : okay\r\n\r\n'' Start TV driver - starts a cog\r\n'' returns false if no cog available\r\n''\r\n''   tvptr = pointer to TV parameters\r\n\r\n  stop\r\n  okay := cog := cognew(@entry, tvptr) + 1\r\n\r\n\r\nPUB stop\r\n\r\n'' Stop TV driver - frees a cog\r\n\r\n  if cog\r\n    cogstop(cog~ - 1)\r\n\r\n\r\nDAT\r\n\r\n'*******************************\r\n'* Assembly language TV driver *\r\n'*******************************\r\n\r\n                        org\r\n'\r\n'\r\n' Entry\r\n'\r\nentry                   mov     taskptr,#tasks          'reset tasks\r\n\r\n                        mov     x,#10                   'perform task sections initially\r\n:init                   jmpret  taskret,taskptr\r\n                        djnz    x,#:init\r\n'\r\n'\r\n' Superfield\r\n'\r\nsuperfield              mov     taskptr,#tasks          'reset tasks\r\n\r\n                        test    _mode,#%0001    wc      'if ntsc, set phaseflip\r\n        if_nc           mov     phaseflip,phasemask\r\n\r\n                        test    _mode,#%0010    wz      'get interlace into nz\r\n'\r\n'\r\n' Field\r\n'\r\nfield                   mov     x,vinv                  'do invisible back porch lines\r\n:black                  call    #hsync                  'do hsync\r\n                        waitvid burst,sync_high2        'do black\r\n                        jmpret  taskret,taskptr         'call task section (z undisturbed)\r\n                        djnz    x,#:black               'another black line?\r\n\r\n                        wrlong  visible,par             'set status to visible\r\n\r\n                        mov     x,vb                    'do visible back porch lines\r\n                        call    #blank_lines\r\n\r\n                        mov     screen,_screen          'point to first tile (upper-leftmost)\r\n                        mov     y,_vt                   'set vertical tiles\r\n:line                   mov     vx,_vx                  'set vertical expand\r\n:vert   if_z            xor     interlace,#1            'interlace skip?\r\n        if_z            tjz     interlace,#:skip\r\n\r\n                        call    #hsync                  'do hsync\r\n\r\n                        mov     vscl,hb                 'do visible back porch pixels\r\n                        xor     tile,colortable\r\n                        waitvid tile,#0\r\n\r\n                        mov     x,_ht                   'set horizontal tiles\r\n                        mov     vscl,hx                 'set horizontal expand\r\n\r\n:tile                   rdword  tile,screen             'read tile\r\n                        or      tile,line               'set pointer bits into tile\r\n                        rol     tile,#6                 'read tile pixels\r\n                        rdlong  pixels,tile             '(2 instructions between reads)\r\n                        shr     tile,#10+6              'set tile colors\r\n                        movs    :color,tile\r\n                        add     screen,#2               'point to next tile\r\n                        mov     tile,phaseflip\r\n:color                  xor     tile,colortable\r\n                        waitvid tile,pixels             'pass colors and pixels to video\r\n                        djnz    x,#:tile                'another tile?\r\n\r\n                        sub     screen,hc2x             'repoint to first tile in same line\r\n\r\n                        mov     vscl,hf                 'do visible front porch pixels\r\n                        mov     tile,phaseflip\r\n                        xor     tile,colortable\r\n                        waitvid tile,#0\r\n\r\n:skip                   djnz    vx,#:vert               'vertical expand?\r\n                        ror     line,linerot            'set next line\r\n                        add     line,lineadd    wc\r\n                        rol     line,linerot      \r\n        if_nc           jmp     #:line\r\n                        add     screen,hc2x             'point to first tile in next line\r\n                        djnz    y,#:line                'another tile line?\r\n\r\n        if_z            xor     interlace,#1    wz      'get interlace and field1 into z\r\n\r\n                        test    _mode,#%0001    wc      'do visible front porch lines\r\n                        mov     x,vf\r\n        if_nz_and_c     add     x,#1\r\n                        call    #blank_lines\r\n\r\n        if_nz           wrlong  invisible,par           'unless interlace and field1, set status to invisible\r\n\r\n        if_z_eq_c       call    #hsync                  'if required, do short line\r\n        if_z_eq_c       mov     vscl,hrest\r\n        if_z_eq_c       waitvid burst,sync_high2\r\n        if_z_eq_c       xor     phaseflip,phasemask\r\n\r\n                        call    #vsync_high             'do high vsync pulses\r\n\r\n                        movs    vsync1,#sync_low1       'do low vsync pulses\r\n                        movs    vsync2,#sync_low2\r\n                        call    #vsync_low\r\n\r\n                        call    #vsync_high             'do high vsync pulses\r\n\r\n        if_nz           mov     vscl,hhalf              'if odd frame, do half line\r\n        if_nz           waitvid burst,sync_high2\r\n\r\n        if_z            jmp     #field                  'if interlace and field1, display field2\r\n                        jmp     #superfield             'else, new superfield\r\n'\r\n'\r\n' Blank lines\r\n'\r\nblank_lines             call    #hsync                  'do hsync\r\n\r\n                        xor     tile,colortable         'do background\r\n                        waitvid tile,#0\r\n\r\n                        djnz    x,#blank_lines\r\n\r\nblank_lines_ret         ret\r\n'\r\n'\r\n' Horizontal sync\r\n'\r\nhsync                   test    _mode,#%0001    wc      'if pal, toggle phaseflip\r\n        if_c            xor     phaseflip,phasemask\r\n\r\n                        mov     vscl,sync_scale1        'do hsync       \r\n                        mov     tile,phaseflip\r\n                        xor     tile,burst\r\n                        waitvid tile,sync_normal\r\n\r\n                        mov     vscl,hvis               'setup in case blank line\r\n                        mov     tile,phaseflip\r\n\r\nhsync_ret               ret\r\n'\r\n'\r\n' Vertical sync\r\n'\r\nvsync_high              movs    vsync1,#sync_high1      'vertical sync\r\n                        movs    vsync2,#sync_high2\r\n\r\nvsync_low               mov     x,vrep\r\n\r\nvsyncx                  mov     vscl,sync_scale1\r\nvsync1                  waitvid burst,sync_high1\r\n\r\n                        mov     vscl,sync_scale2\r\nvsync2                  waitvid burst,sync_high2\r\n\r\n                        djnz    x,#vsyncx\r\nvsync_low_ret\r\nvsync_high_ret          ret\r\n'\r\n'\r\n' Tasks - performed in sections during invisible back porch lines\r\n'\r\ntasks                   mov     t1,par                  'load parameters\r\n                        movd    :par,#_enable           '(skip _status)\r\n                        mov     t2,#paramcount - 1\r\n:load                   add     t1,#4\r\n:par                    rdlong  0,t1\r\n                        add     :par,d0\r\n                        djnz    t2,#:load               '+119\r\n\r\n                        mov     t1,_pins                'set video pins and directions\r\n                        test    t1,#$08         wc\r\n        if_nc           mov     t2,pins0\r\n        if_c            mov     t2,pins1\r\n                        test    t1,#$40         wc\r\n                        shr     t1,#1\r\n                        shl     t1,#3\r\n                        shr     t2,t1\r\n                        movs    vcfg,t2\r\n                        shr     t1,#6\r\n                        movd    vcfg,t1\r\n                        shl     t1,#3\r\n                        and     t2,#$FF\r\n                        shl     t2,t1\r\n        if_nc           mov     dira,t2\r\n        if_nc           mov     dirb,#0\r\n        if_c            mov     dira,#0\r\n        if_c            mov     dirb,t2                 '+18\r\n\r\n                        tjz     _enable,#disabled       '+2, disabled?\r\n\r\n                        jmpret  taskptr,taskret         '+1=140, break and return later\r\n\r\n                        movs    :rd,#wtab               'load ntsc/pal metrics from word table\r\n                        movd    :wr,#hvis\r\n                        mov     t1,#wtabx - wtab\r\n                        test    _mode,#%0001    wc\r\n:rd                     mov     t2,0\r\n                        add     :rd,#1\r\n        if_nc           shl     t2,#16\r\n                        shr     t2,#16\r\n:wr                     mov     0,t2\r\n                        add     :wr,d0\r\n                        djnz    t1,#:rd                 '+54\r\n\r\n        if_nc           movs    :ltab,#ltab             'load ntsc/pal metrics from long table\r\n        if_c            movs    :ltab,#ltab+1\r\n                        movd    :ltab,#fcolor\r\n                        mov     t1,#(ltabx - ltab) >> 1\r\n:ltab                   mov     0,0\r\n                        add     :ltab,d0s1\r\n                        djnz    t1,#:ltab               '+17\r\n\r\n                        rdlong  t1,#0                   'get CLKFREQ\r\n                        shr     t1,#1                   'if CLKFREQ < 16MHz, cancel _broadcast\r\n                        cmp     t1,m8           wc\r\n        if_c            mov     _broadcast,#0\r\n                        shr     t1,#1                   'if CLKFREQ < color frequency * 4, disable\r\n                        cmp     t1,fcolor       wc\r\n        if_c            jmp     #disabled               '+11\r\n\r\n                        jmpret  taskptr,taskret         '+1=83, break and return later\r\n\r\n                        mov     t1,fcolor               'set ctra pll to fcolor * 16\r\n                        call    #divide                 'if ntsc, set vco to fcolor * 32 (114.5454 MHz)\r\n                        test    _mode,#%0001    wc      'if pal, set vco to fcolor * 16 (70.9379 MHz)\r\n        if_c            movi    ctra,#%00001_111        'select fcolor * 16 output (ntsc=/2, pal=/1)\r\n        if_nc           movi    ctra,#%00001_110\r\n        if_nc           shl     t2,#1\r\n                        mov     frqa,t2                 '+147\r\n\r\n                        jmpret  taskptr,taskret         '+1=148, break and return later\r\n\r\n                        mov     t1,_broadcast           'set ctrb pll to _broadcast\r\n                        mov     t2,#0                   'if 0, turn off ctrb\r\n                        tjz     t1,#:off\r\n                        min     t1,m8                   'limit from 8MHz to 128MHz\r\n                        max     t1,m128\r\n                        mov     t2,#%00001_100          'adjust _broadcast to be within 4MHz-8MHz\r\n:scale                  shr     t1,#1                   '(vco will be within 64MHz-128MHz)\r\n                        cmp     m8,t1           wc\r\n        if_c            add     t2,#%00000_001\r\n        if_c            jmp     #:scale\r\n:off                    movi    ctrb,t2\r\n                        call    #divide\r\n                        mov     frqb,t2                 '+165\r\n\r\n                        jmpret  taskptr,taskret         '+1=166, break and return later\r\n\r\n                        mov     t1,#%10100_000          'set video configuration\r\n                        test    _pins,#$01      wc      '(swap broadcast/baseband output bits?)\r\n        if_c            or      t1,#%01000_000\r\n                        test    _mode,#%1000    wc      '(strip chroma from broadcast?)\r\n        if_nc           or      t1,#%00010_000\r\n                        test    _mode,#%0100    wc      '(strip chroma from baseband?)\r\n        if_nc           or      t1,#%00001_000\r\n                        and     _auralcog,#%111         '(set aural cog)\r\n                        or      t1,_auralcog\r\n                        movi    vcfg,t1                 '+10\r\n\r\n                        mov     hx,_hx                  'compute horizontal metrics\r\n                        shl     hx,#8\r\n                        or      hx,_hx\r\n                        shl     hx,#4\r\n\r\n                        mov     hc2x,_ht\r\n                        shl     hc2x,#1\r\n\r\n                        mov     t1,_ht\r\n                        mov     t2,_hx\r\n                        call    #multiply\r\n                        mov     hf,hvis\r\n                        sub     hf,t1\r\n                        shr     hf,#1           wc\r\n                        mov     hb,_ho\r\n                        addx    hb,hf\r\n                        sub     hf,_ho                  '+52\r\n\r\n                        mov     t1,_vt                  'compute vertical metrics\r\n                        mov     t2,_vx\r\n                        call    #multiply\r\n                        test    _mode,#%10000   wc      'consider tile size\r\n                        muxc    linerot,#1\r\n                        mov     lineadd,lineinc\r\n        if_c            shr     lineadd,#1\r\n        if_c            shl     t1,#1\r\n                        test    _mode,#%0010    wc      'consider interlace\r\n        if_c            shr     t1,#1\r\n                        mov     vf,vvis\r\n                        sub     vf,t1\r\n                        shr     vf,#1           wc\r\n                        neg     vb,_vo\r\n                        addx    vb,vf\r\n                        add     vf,_vo                  '+53\r\n\r\n                        xor     _mode,#%0010            '+1, flip interlace bit for display\r\n\r\n:colors                 jmpret  taskptr,taskret         '+1=117/160, break and return later\r\n\r\n                        mov     t1,#13                  'load next 13 colors into colortable\r\n:colorloop              mov     t2,:colorreg            '5 times = 65 (all 64 colors loaded)\r\n                        shr     t2,#9-2\r\n                        and     t2,#$FC\r\n                        add     t2,_colors\r\n:colorreg               rdlong  colortable,t2\r\n                        add     :colorreg,d0\r\n                        andn    :colorreg,d6\r\n                        djnz    t1,#:colorloop          '+158\r\n\r\n                        jmp     #:colors                '+1, keep loading colors\r\n'\r\n'\r\n' Divide t1/CLKFREQ to get frqa or frqb value into t2\r\n'\r\ndivide                  rdlong  m1,#0                   'get CLKFREQ\r\n\r\n                        mov     m2,#32+1\r\n:loop                   cmpsub  t1,m1           wc\r\n                        rcl     t2,#1\r\n                        shl     t1,#1\r\n                        djnz    m2,#:loop\r\n\r\ndivide_ret              ret                             '+140\r\n'\r\n'\r\n' Multiply t1 * t2 * 16 (t1, t2 = bytes)\r\n'\r\nmultiply                shl     t2,#8+4-1\r\n\r\n                        mov     m1,#8\r\n:loop                   shr     t1,#1           wc\r\n        if_c            add     t1,t2\r\n                        djnz    m1,#:loop\r\n\r\nmultiply_ret            ret                             '+37\r\n'\r\n'\r\n' Disabled - reset status, nap ~4ms, try again\r\n'\r\ndisabled                mov     ctra,#0                 'reset ctra\r\n                        mov     ctrb,#0                 'reset ctrb\r\n                        mov     vcfg,#0                 'reset video\r\n\r\n                        wrlong  outa,par                'set status to disabled\r\n\r\n                        rdlong  t1,#0                   'get CLKFREQ\r\n                        shr     t1,#8                   'nap for ~4ms\r\n                        min     t1,#3\r\n                        add     t1,cnt\r\n                        waitcnt t1,#0\r\n\r\n                        jmp     #entry                  'reload parameters\r\n'\r\n'\r\n' Initialized data\r\n'\r\nm8                      long    8_000_000\r\nm128                    long    128_000_000\r\nd0                      long    1 << 9 << 0\r\nd6                      long    1 << 9 << 6\r\nd0s1                    long    1 << 9 << 0 + 1 << 1\r\ninterlace               long    0\r\ninvisible               long    1\r\nvisible                 long    2\r\nphaseflip               long    $00000000\r\nphasemask               long    $F0F0F0F0\r\nline                    long    $00060000\r\nlineinc                 long    $10000000\r\nlinerot                 long    0\r\npins0                   long    %11110000_01110000_00001111_00000111\r\npins1                   long    %11111111_11110111_01111111_01110111\r\nsync_high1              long    %0101010101010101010101_101010_0101\r\nsync_high2              long    %01010101010101010101010101010101       'used for black\r\nsync_low1               long    %1010101010101010101010101010_0101\r\nsync_low2               long    %01_101010101010101010101010101010\r\n'\r\n'\r\n' NTSC/PAL metrics tables\r\n'                               ntsc                    pal\r\n'                               ----------------------------------------------\r\nwtab                    word    lntsc - sntsc,          lpal - spal     'hvis\r\n                        word    lntsc / 2 - sntsc,      lpal / 2 - spal 'hrest\r\n                        word    lntsc / 2,              lpal / 2        'hhalf\r\n                        word    243,                    286             'vvis\r\n                        word    10,                     18              'vinv\r\n                        word    6,                      5               'vrep\r\n                        word    $02_8A,                 $02_AA          'burst\r\nwtabx\r\nltab                    long    fntsc                                   'fcolor\r\n                        long    fpal\r\n                        long    sntsc >> 4 << 12 + sntsc                'sync_scale1\r\n                        long    spal >> 4 << 12 + spal\r\n                        long    67 << 12 + lntsc / 2 - sntsc            'sync_scale2\r\n                        long    79 << 12 + lpal / 2 - spal\r\n                        long    %0101_00000000_01_10101010101010_0101   'sync_normal\r\n                        long    %010101_00000000_01_101010101010_0101\r\nltabx\r\n'\r\n'\r\n' Uninitialized data\r\n'\r\ntaskptr                 res     1                       'tasks\r\ntaskret                 res     1\r\nt1                      res     1\r\nt2                      res     1\r\nm1                      res     1\r\nm2                      res     1\r\n\r\nx                       res     1                       'display\r\ny                       res     1\r\nhf                      res     1\r\nhb                      res     1\r\nvf                      res     1\r\nvb                      res     1\r\nhx                      res     1\r\nvx                      res     1\r\nhc2x                    res     1\r\nscreen                  res     1\r\ntile                    res     1\r\npixels                  res     1\r\nlineadd                 res     1\r\n\r\nhvis                    res     1                       'loaded from word table\r\nhrest                   res     1\r\nhhalf                   res     1\r\nvvis                    res     1\r\nvinv                    res     1\r\nvrep                    res     1\r\nburst                   res     1\r\n\r\nfcolor                  res     1                       'loaded from long table\r\nsync_scale1             res     1\r\nsync_scale2             res     1\r\nsync_normal             res     1\r\n'\r\n'\r\n' Parameter buffer\r\n'\r\n_enable                 res     1       '0/non-0        read-only\r\n_pins                   res     1       '%pppmmmm       read-only\r\n_mode                   res     1       '%tccip         read-only\r\n_screen                 res     1       '@word          read-only\r\n_colors                 res     1       '@long          read-only\r\n_ht                     res     1       '1+             read-only\r\n_vt                     res     1       '1+             read-only\r\n_hx                     res     1       '4+             read-only\r\n_vx                     res     1       '1+             read-only\r\n_ho                     res     1       '0+-            read-only\r\n_vo                     res     1       '0+-            read-only\r\n_broadcast              res     1       '0+             read-only\r\n_auralcog               res     1       '0-7            read-only\r\n\r\n                        fit     colortable              'fit underneath colortable ($180-$1BF)\r\n''\r\n''___\r\n''VAR                   'TV parameters - 14 contiguous longs\r\n''\r\n''  long  tv_status     '0/1/2 = off/invisible/visible              read-only\r\n''  long  tv_enable     '0/non-0 = off/on                           write-only\r\n''  long  tv_pins       '%pppmmmm = pin group, pin group mode       write-only\r\n''  long  tv_mode       '%tccip = tile,chroma,interlace,ntsc/pal    write-only\r\n''  long  tv_screen     'pointer to screen (words)                  write-only      \r\n''  long  tv_colors     'pointer to colors (longs)                  write-only                            \r\n''  long  tv_ht         'horizontal tiles                           write-only                            \r\n''  long  tv_vt         'vertical tiles                             write-only                            \r\n''  long  tv_hx         'horizontal tile expansion                  write-only                            \r\n''  long  tv_vx         'vertical tile expansion                    write-only                            \r\n''  long  tv_ho         'horizontal offset                          write-only                            \r\n''  long  tv_vo         'vertical offset                            write-only                            \r\n''  long  tv_broadcast  'broadcast frequency (Hz)                   write-only                            \r\n''  long  tv_auralcog   'aural fm cog                               write-only                            \r\n''                                                                                              \r\n''The preceding VAR section may be copied into your code.        \r\n''After setting variables, do start(@tv_status) to start driver. \r\n''                                                               \r\n''All parameters are reloaded each superframe, allowing you to make live\r\n''changes. To minimize flicker, correlate changes with tv_status.\r\n''\r\n''Experimentation may be required to optimize some parameters.\r\n''\r\n''Parameter descriptions:\r\n''  _________\r\n''  tv_status\r\n''\r\n''    driver sets this to indicate status:\r\n''      0: driver disabled (tv_enable = 0 or CLKFREQ < requirement)\r\n''      1: currently outputting invisible sync data\r\n''      2: currently outputting visible screen data\r\n''  _________\r\n''  tv_enable\r\n''\r\n''        0: disable (pins will be driven low, reduces power)\r\n''    non-0: enable\r\n''  _______\r\n''  tv_pins\r\n''\r\n''    bits 6..4 select pin group:\r\n''      %000: pins 7..0\r\n''      %001: pins 15..8\r\n''      %010: pins 23..16\r\n''      %011: pins 31..24\r\n''      %100: pins 39..32\r\n''      %101: pins 47..40\r\n''      %110: pins 55..48\r\n''      %111: pins 63..56\r\n''\r\n''    bits 3..0 select pin group mode:\r\n''      %0000: %0000_0111    -                    baseband\r\n''      %0001: %0000_0111    -                    broadcast\r\n''      %0010: %0000_1111    -                    baseband + chroma\r\n''      %0011: %0000_1111    -                    broadcast + aural\r\n''      %0100: %0111_0000    broadcast            -\r\n''      %0101: %0111_0000    baseband             -\r\n''      %0110: %1111_0000    broadcast + aural    -\r\n''      %0111: %1111_0000    baseband + chroma    -\r\n''      %1000: %0111_0111    broadcast            baseband\r\n''      %1001: %0111_0111    baseband             broadcast\r\n''      %1010: %0111_1111    broadcast            baseband + chroma\r\n''      %1011: %0111_1111    baseband             broadcast + aural\r\n''      %1100: %1111_0111    broadcast + aural    baseband\r\n''      %1101: %1111_0111    baseband + chroma    broadcast\r\n''      %1110: %1111_1111    broadcast + aural    baseband + chroma\r\n''      %1111: %1111_1111    baseband + chroma    broadcast + aural\r\n''      -----------------------------------------------------------\r\n''            active pins    top nibble           bottom nibble\r\n''\r\n''      the baseband signal nibble is arranged as:\r\n''        bit 3: chroma signal for s-video (attach via 560-ohm resistor)\r\n''        bits 2..0: baseband video (sum 270/560/1100-ohm resistors to form 75-ohm 1V signal)\r\n''\r\n''      the broadcast signal nibble is arranged as:\r\n''        bit 3: aural subcarrier (sum 560-ohm resistor into network below)\r\n''        bits 2..0: visual carrier (sum 270/560/1100-ohm resistors to form 75-ohm 1V signal)\r\n''  _______\r\n''  tv_mode\r\n''\r\n''    bit 4 selects between 16x16 and 16x32 pixel tiles:\r\n''      0: 16x16 pixel tiles (tileheight = 16)\r\n''      1: 16x32 pixel tiles (tileheight = 32)\r\n''\r\n''    bit 3 controls chroma mixing into broadcast:\r\n''      0: mix chroma into broadcast (color)\r\n''      1: strip chroma from broadcast (black/white)\r\n''\r\n''    bit 2 controls chroma mixing into baseband:\r\n''      0: mix chroma into baseband (composite color)\r\n''      1: strip chroma from baseband (black/white or s-video)\r\n''\r\n''    bit 1 controls interlace:\r\n''      0: progressive scan (243 display lines for NTSC, 286 for PAL)\r\n''           less flicker, good for motion\r\n''      1: interlaced scan (486 display lines for NTSC, 572 for PAL)\r\n''           doubles the vertical display lines, good for text\r\n''\r\n''    bit 0 selects NTSC or PAL format\r\n''      0: NTSC\r\n''           3016 horizontal display ticks\r\n''           243 or 486 (interlaced) vertical display lines\r\n''           CLKFREQ must be at least 14_318_180 (4 * 3_579_545 Hz)*\r\n''      1: PAL\r\n''           3692 horizontal display ticks\r\n''           286 or 572 (interlaced) vertical display lines\r\n''           CLKFREQ must be at least 17_734_472 (4 * 4_433_618 Hz)*\r\n''\r\n''      * driver will disable itself while CLKFREQ is below requirement\r\n''  _________\r\n''  tv_screen\r\n''\r\n''    pointer to words which define screen contents (left-to-right, top-to-bottom)\r\n''      number of words must be tv_ht * tv_vt\r\n''      each word has two bitfields: a 6-bit colorset ptr and a 10-bit pixelgroup ptr\r\n''        bits 15..10: select the colorset* for the associated pixel tile\r\n''        bits 9..0: select the pixelgroup** address %ppppppppppcccc00 (p=address, c=0..15)\r\n''\r\n''       * colorsets are longs which each define four 8-bit colors\r\n''\r\n''      ** pixelgroups are <tileheight> longs which define (left-to-right, top-to-bottom) the 2-bit\r\n''         (four color) pixels that make up a 16x16 or a 32x32 pixel tile\r\n''  _________\r\n''  tv_colors\r\n''\r\n''    pointer to longs which define colorsets\r\n''      number of longs must be 1..64\r\n''      each long has four 8-bit fields which define colors for 2-bit (four color) pixels\r\n''      first long's bottom color is also used as the screen background color\r\n''      8-bit color fields are as follows:\r\n''        bits 7..4: chroma data (0..15 = blue..green..red..)*\r\n''        bit 3: controls chroma modulation (0=off, 1=on)\r\n''        bits 2..0: 3-bit luminance level:\r\n''          values 0..1: reserved for sync - don't use\r\n''          values 2..7: valid luminance range, modulation adds/subtracts 1 (beware of 7)\r\n''          value 0 may be modulated to produce a saturated color toggling between levels 1 and 7\r\n''\r\n''      * because of TV's limitations, it doesn't look good when chroma changes abruptly -\r\n''        rather, use luminance - change chroma only against a black or white background for\r\n''        best appearance\r\n''  _____\r\n''  tv_ht\r\n''\r\n''    horizontal number pixel tiles - must be at least 1\r\n''    practical limit is 40 for NTSC, 50 for PAL\r\n''  _____\r\n''  tv_vt\r\n''\r\n''    vertical number of pixel tiles - must be at least 1\r\n''    practical limit is 13 for NTSC, 15 for PAL (26/30 max for interlaced NTSC/PAL)\r\n''  _____\r\n''  tv_hx\r\n''\r\n''    horizontal tile expansion factor - must be at least 3 for NTSC, 4 for PAL\r\n''\r\n''    make sure 16 * tv_ht * tv_hx + ||tv_ho + 32 is less than the horizontal display ticks\r\n''  _____\r\n''  tv_vx\r\n''\r\n''    vertical tile expansion factor - must be at least 1\r\n''\r\n''    make sure <tileheight> * tv_vt * tv_vx + ||tv_vo + 1 is less than the display lines\r\n''  _____\r\n''  tv_ho\r\n''\r\n''    horizontal offset in ticks - pos/neg value (0 for centered image)\r\n''    shifts the display right/left\r\n''  _____\r\n''  tv_vo\r\n''\r\n''    vertical offset in lines - pos/neg value (0 for centered image)\r\n''    shifts the display up/down\r\n''  ____________\r\n''  tv_broadcast\r\n''\r\n''    broadcast frequency expressed in Hz (ie channel 2 is 55_250_000)\r\n''    if 0, modulator is turned off - saves power\r\n''\r\n''    broadcasting requires CLKFREQ to be at least 16_000_000\r\n''    while CLKFREQ is below 16_000_000, modulator will be turned off\r\n''  ___________\r\n''  tv_auralcog\r\n''\r\n''    selects cog to supply aural fm signal - 0..7\r\n''    uses ctra pll output from selected cog\r\n''\r\n''    in NTSC, the offset frequency must be 4.5MHz and the max bandwidth +-25KHz\r\n''    in PAL, the offset frequency and max bandwidth vary by PAL type\r\n\r\n{{\r\n\r\n┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\r\n│                                                   TERMS OF USE: MIT License                                                  │                                                            \r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ \r\n│files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │\r\n│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│\r\n│is furnished to do so, subject to the following conditions:                                                                   │\r\n│                                                                                                                              │\r\n│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│\r\n│                                                                                                                              │\r\n│THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │\r\n│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │\r\n│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │\r\n│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\r\n}}"
  },
  {
    "path": "src/test/resources/samples/langs/Propeller Spin/TV_Terminal.spin",
    "content": "﻿''***************************************\r\n''*  TV Terminal v1.1                   *\r\n''*  Author: Chip Gracey                *\r\n''*  Copyright (c) 2005 Parallax, Inc.  *\r\n''*  See end of file for terms of use.  *\r\n''***************************************\r\n\r\n{-----------------REVISION HISTORY-----------------\r\n v1.1 - Updated 5/15/2006 to use actual pin number, instead of pin group, for Start method's basepin parameter.}\r\n \r\nCON\r\n\r\n  x_tiles = 16\r\n  y_tiles = 13\r\n\r\n  x_screen = x_tiles << 4\r\n  y_screen = y_tiles << 4\r\n\r\n  width = 0             '0 = minimum\r\n  x_scale = 1           '1 = minimum\r\n  y_scale = 1           '1 = minimum\r\n  x_spacing = 6         '6 = normal\r\n  y_spacing = 13        '13 = normal\r\n\r\n  x_chr = x_scale * x_spacing\r\n  y_chr = y_scale * y_spacing\r\n\r\n  y_offset = y_spacing / 6 + y_chr - 1\r\n\r\n  x_limit = x_screen / (x_scale * x_spacing)\r\n  y_limit = y_screen / (y_scale * y_spacing)\r\n  y_max = y_limit - 1\r\n\r\n  y_screen_bytes = y_screen << 2\r\n  y_scroll = y_chr << 2\r\n  y_scroll_longs = y_chr * y_max\r\n  y_clear = y_scroll_longs << 2\r\n  y_clear_longs = y_screen - y_scroll_longs\r\n\r\n  paramcount = 14       \r\n\r\n  \r\nVAR\r\n\r\n  long  x, y, bitmap_base\r\n\r\n  long  tv_status     '0/1/2 = off/visible/invisible           read-only\r\n  long  tv_enable     '0/? = off/on                            write-only\r\n  long  tv_pins       '%ppmmm = pins                           write-only\r\n  long  tv_mode       '%ccinp = chroma,interlace,ntsc/pal,swap write-only\r\n  long  tv_screen     'pointer to screen (words)               write-only\r\n  long  tv_colors     'pointer to colors (longs)               write-only               \r\n  long  tv_hc         'horizontal cells                        write-only\r\n  long  tv_vc         'vertical cells                          write-only\r\n  long  tv_hx         'horizontal cell expansion               write-only\r\n  long  tv_vx         'vertical cell expansion                 write-only\r\n  long  tv_ho         'horizontal offset                       write-only\r\n  long  tv_vo         'vertical offset                         write-only\r\n  long  tv_broadcast  'broadcast frequency (Hz)                write-only\r\n  long  tv_auralcog   'aural fm cog                            write-only\r\n\r\n  long  bitmap[x_tiles * y_tiles << 4 + 16]     'add 16 longs to allow for 64-byte alignment\r\n  word  screen[x_tiles * y_tiles]\r\n  \r\n\r\nOBJ\r\n\r\n  tv    : \"tv\"\r\n  gr    : \"graphics\"\r\n\r\n\r\nPUB start(basepin)\r\n\r\n'' Start terminal\r\n''\r\n''  basepin = first of three pins on a 4-pin boundary (0, 4, 8...) to have\r\n''  1.1k, 560, and 270 ohm resistors connected and summed to form the 1V,\r\n''  75 ohm DAC for baseband video   \r\n\r\n  'init bitmap and tile screen\r\n  bitmap_base := (@bitmap + $3F) & $7FC0\r\n  repeat x from 0 to x_tiles - 1\r\n    repeat y from 0 to y_tiles - 1\r\n      screen[y * x_tiles + x] := bitmap_base >> 6 + y + x * y_tiles\r\n\r\n  'start tv\r\n  tvparams_pins := (basepin & $38) << 1 | (basepin & 4 == 4) & %0101\r\n  longmove(@tv_status, @tvparams, paramcount)\r\n  tv_screen := @screen\r\n  tv_colors := @color_schemes\r\n  tv.start(@tv_status)\r\n\r\n  'start graphics\r\n  gr.start\r\n  gr.setup(x_tiles, y_tiles, 0, y_screen, bitmap_base)\r\n  gr.textmode(x_scale, y_scale, x_spacing, 0)\r\n  gr.width(width)\r\n  out(0)\r\n\r\n\r\nPUB stop\r\n\r\n'' Stop terminal\r\n\r\n  tv.stop\r\n  gr.stop\r\n\r\n\r\nPUB out(c)\r\n\r\n'' Print a character\r\n''\r\n''       $00 = home\r\n''  $01..$03 = color\r\n''  $04..$07 = color schemes\r\n''       $09 = tab\r\n''       $0D = return\r\n''  $20..$7E = character\r\n\r\n  case c\r\n\r\n    $00:                'home?\r\n      gr.clear\r\n      x := y := 0\r\n\r\n    $01..$03:           'color?\r\n      gr.color(c)\r\n\r\n    $04..$07:           'color scheme?\r\n      tv_colors := @color_schemes[c & 3]\r\n\r\n    $09:                'tab?\r\n      repeat\r\n        out($20)\r\n      while x & 7\r\n\r\n    $0D:                'return?\r\n      newline\r\n\r\n    $20..$7E:           'character?\r\n      gr.text(x * x_chr, -y * y_chr - y_offset, @c)\r\n      gr.finish\r\n      if ++x == x_limit\r\n        newline\r\n\r\n\r\nPUB str(string_ptr)\r\n\r\n'' Print a zero-terminated string\r\n\r\n  repeat strsize(string_ptr)\r\n    out(byte[string_ptr++])\r\n\r\n\r\nPUB dec(value) | i\r\n\r\n'' Print a decimal number\r\n\r\n  if value < 0\r\n    -value\r\n    out(\"-\")\r\n\r\n  i := 1_000_000_000\r\n\r\n  repeat 10\r\n    if value => i\r\n      out(value / i + \"0\")\r\n      value //= i\r\n      result~~\r\n    elseif result or i == 1\r\n      out(\"0\")\r\n    i /= 10\r\n\r\n\r\nPUB hex(value, digits)\r\n\r\n'' Print a hexadecimal number\r\n\r\n  value <<= (8 - digits) << 2\r\n  repeat digits\r\n    out(lookupz((value <-= 4) & $F : \"0\"..\"9\", \"A\"..\"F\"))\r\n\r\n\r\nPUB bin(value, digits)\r\n\r\n'' Print a binary number\r\n\r\n  value <<= 32 - digits\r\n  repeat digits\r\n    out((value <-= 1) & 1 + \"0\")\r\n\r\n\r\nPRI newline\r\n\r\n  if ++y == y_limit\r\n    gr.finish\r\n    repeat x from 0 to x_tiles - 1\r\n      y := bitmap_base + x * y_screen_bytes\r\n      longmove(y, y + y_scroll, y_scroll_longs)\r\n      longfill(y + y_clear, 0, y_clear_longs)\r\n    y := y_max\r\n  x := 0\r\n\r\n\r\nDAT\r\n\r\ntvparams                long    0               'status\r\n                        long    1               'enable\r\ntvparams_pins           long    %001_0101       'pins\r\n                        long    %0000           'mode\r\n                        long    0               'screen\r\n                        long    0               'colors\r\n                        long    x_tiles         'hc\r\n                        long    y_tiles         'vc\r\n                        long    10              'hx\r\n                        long    1               'vx\r\n                        long    0               'ho\r\n                        long    0               'vo\r\n                        long    55_250_000      'broadcast\r\n                        long    0               'auralcog\r\n\r\ncolor_schemes           long    $BC_6C_05_02\r\n                        long    $0E_0D_0C_0A\r\n                        long    $6E_6D_6C_6A\r\n                        long    $BE_BD_BC_BA\r\n\r\n{{\r\n\r\n┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\r\n│                                                   TERMS OF USE: MIT License                                                  │                                                            \r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ \r\n│files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │\r\n│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│\r\n│is furnished to do so, subject to the following conditions:                                                                   │\r\n│                                                                                                                              │\r\n│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│\r\n│                                                                                                                              │\r\n│THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │\r\n│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │\r\n│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │\r\n│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\r\n}}                   "
  },
  {
    "path": "src/test/resources/samples/langs/Propeller Spin/TV_Text.spin",
    "content": "﻿''***************************************\r\n''*  TV Text 40x13 v1.0                 *\r\n''*  Author: Chip Gracey                *\r\n''*  Copyright (c) 2006 Parallax, Inc.  *               \r\n''*  See end of file for terms of use.  *               \r\n''***************************************\r\n\r\nCON\r\n\r\n  cols = 40\r\n  rows = 13\r\n\r\n  screensize = cols * rows\r\n  lastrow = screensize - cols\r\n\r\n  tv_count = 14\r\n\r\n  \r\nVAR\r\n\r\n  long  col, row, color, flag\r\n  \r\n  word  screen[screensize]\r\n  long  colors[8 * 2]\r\n\r\n  long  tv_status     '0/1/2 = off/invisible/visible              read-only   (14 longs)\r\n  long  tv_enable     '0/non-0 = off/on                           write-only\r\n  long  tv_pins       '%pppmmmm = pin group, pin group mode       write-only\r\n  long  tv_mode       '%tccip = tile,chroma,interlace,ntsc/pal    write-only\r\n  long  tv_screen     'pointer to screen (words)                  write-only      \r\n  long  tv_colors     'pointer to colors (longs)                  write-only                            \r\n  long  tv_ht         'horizontal tiles                           write-only                            \r\n  long  tv_vt         'vertical tiles                             write-only                            \r\n  long  tv_hx         'horizontal tile expansion                  write-only                            \r\n  long  tv_vx         'vertical tile expansion                    write-only                            \r\n  long  tv_ho         'horizontal offset                          write-only                            \r\n  long  tv_vo         'vertical offset                            write-only                            \r\n  long  tv_broadcast  'broadcast frequency (Hz)                   write-only                            \r\n  long  tv_auralcog   'aural fm cog                               write-only                            \r\n\r\n\r\nOBJ\r\n\r\n  tv : \"tv\"\r\n\r\n\r\nPUB start(basepin) : okay\r\n\r\n'' Start terminal - starts a cog\r\n'' returns false if no cog available\r\n\r\n  setcolors(@palette)\r\n  out(0)\r\n  \r\n  longmove(@tv_status, @tv_params, tv_count)\r\n  tv_pins := (basepin & $38) << 1 | (basepin & 4 == 4) & %0101\r\n  tv_screen := @screen\r\n  tv_colors := @colors\r\n  \r\n  okay := tv.start(@tv_status)\r\n\r\n\r\nPUB stop\r\n\r\n'' Stop terminal - frees a cog\r\n\r\n  tv.stop\r\n\r\n\r\nPUB str(stringptr)\r\n\r\n'' Print a zero-terminated string\r\n\r\n  repeat strsize(stringptr)\r\n    out(byte[stringptr++])\r\n\r\n\r\nPUB dec(value) | i\r\n\r\n'' Print a decimal number\r\n\r\n  if value < 0\r\n    -value\r\n    out(\"-\")\r\n\r\n  i := 1_000_000_000\r\n\r\n  repeat 10\r\n    if value => i\r\n      out(value / i + \"0\")\r\n      value //= i\r\n      result~~\r\n    elseif result or i == 1\r\n      out(\"0\")\r\n    i /= 10\r\n\r\n\r\nPUB hex(value, digits)\r\n\r\n'' Print a hexadecimal number\r\n\r\n  value <<= (8 - digits) << 2\r\n  repeat digits\r\n    out(lookupz((value <-= 4) & $F : \"0\"..\"9\", \"A\"..\"F\"))\r\n\r\n\r\nPUB bin(value, digits)\r\n\r\n'' Print a binary number\r\n\r\n  value <<= 32 - digits\r\n  repeat digits\r\n    out((value <-= 1) & 1 + \"0\")\r\n\r\n\r\nPUB out(c) | i, k\r\n\r\n'' Output a character\r\n''\r\n''     $00 = clear screen\r\n''     $01 = home\r\n''     $08 = backspace\r\n''     $09 = tab (8 spaces per)\r\n''     $0A = set X position (X follows)\r\n''     $0B = set Y position (Y follows)\r\n''     $0C = set color (color follows)\r\n''     $0D = return\r\n''  others = printable characters\r\n\r\n  case flag\r\n    $00: case c\r\n           $00: wordfill(@screen, $220, screensize)\r\n                col := row := 0\r\n           $01: col := row := 0\r\n           $08: if col\r\n                  col--\r\n           $09: repeat\r\n                  print(\" \")\r\n                while col & 7\r\n           $0A..$0C: flag := c\r\n                     return\r\n           $0D: newline\r\n           other: print(c)\r\n    $0A: col := c // cols\r\n    $0B: row := c // rows\r\n    $0C: color := c & 7\r\n  flag := 0\r\n\r\n\r\nPUB setcolors(colorptr) | i, fore, back\r\n\r\n'' Override default color palette\r\n'' colorptr must point to a list of up to 8 colors\r\n'' arranged as follows:\r\n''\r\n''               fore   back\r\n''               ------------\r\n'' palette  byte color, color     'color 0\r\n''          byte color, color     'color 1\r\n''          byte color, color     'color 2\r\n''          ...\r\n\r\n  repeat i from 0 to 7\r\n    fore := byte[colorptr][i << 1]\r\n    back := byte[colorptr][i << 1 + 1]\r\n    colors[i << 1]     := fore << 24 + back << 16 + fore << 8 + back\r\n    colors[i << 1 + 1] := fore << 24 + fore << 16 + back << 8 + back\r\n\r\n\r\nPRI print(c)\r\n\r\n  screen[row * cols + col] := (color << 1 + c & 1) << 10 + $200 + c & $FE\r\n  if ++col == cols\r\n    newline\r\n\r\n\r\nPRI newline | i\r\n\r\n  col := 0\r\n  if ++row == rows\r\n    row--\r\n    wordmove(@screen, @screen[cols], lastrow)   'scroll lines\r\n    wordfill(@screen[lastrow], $220, cols)      'clear new line\r\n\r\n\r\nDAT\r\n\r\ntv_params               long    0               'status\r\n                        long    1               'enable\r\n                        long    0               'pins\r\n                        long    %10010          'mode\r\n                        long    0               'screen\r\n                        long    0               'colors\r\n                        long    cols            'hc\r\n                        long    rows            'vc\r\n                        long    4               'hx\r\n                        long    1               'vx\r\n                        long    0               'ho\r\n                        long    0               'vo\r\n                        long    0               'broadcast\r\n                        long    0               'auralcog\r\n\r\n\r\n                        '       fore   back\r\n                        '       color  color\r\npalette                 byte    $07,   $0A    '0    white / dark blue\r\n                        byte    $07,   $BB    '1    white / red\r\n                        byte    $9E,   $9B    '2   yellow / brown\r\n                        byte    $04,   $07    '3     grey / white\r\n                        byte    $3D,   $3B    '4     cyan / dark cyan\r\n                        byte    $6B,   $6E    '5    green / gray-green\r\n                        byte    $BB,   $CE    '6      red / pink\r\n                        byte    $3C,   $0A    '7     cyan / blue\r\n\r\n{{\r\n\r\n┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\r\n│                                                   TERMS OF USE: MIT License                                                  │                                                            \r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ \r\n│files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │\r\n│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│\r\n│is furnished to do so, subject to the following conditions:                                                                   │\r\n│                                                                                                                              │\r\n│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│\r\n│                                                                                                                              │\r\n│THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │\r\n│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │\r\n│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │\r\n│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\r\n}}                        "
  },
  {
    "path": "src/test/resources/samples/langs/Propeller Spin/VGA.spin",
    "content": "﻿''***************************************\r\n''*  VGA Driver v1.1                    *\r\n''*  Author: Chip Gracey                *\r\n''*  Copyright (c) 2006 Parallax, Inc.  *\r\n''*  See end of file for terms of use.  *\r\n''***************************************\r\n\r\n' v1.0 - 01 May 2006 - original version\r\n' v1.1 - 15 May 2006 - pixel tile size can now be 16 x 32 to enable more efficient\r\n'                       character displays utilizing the internal font - see 'vga_mode'\r\n\r\nCON\r\n\r\n  paramcount    = 21\r\n  colortable    = $180  'start of colortable inside cog\r\n  \r\n\r\nVAR\r\n\r\n  long  cog\r\n\r\n\r\nPUB start(vgaptr) : okay\r\n\r\n'' Start VGA driver - starts a cog\r\n'' returns false if no cog available\r\n''\r\n''   vgaptr = pointer to VGA parameters\r\n\r\n  stop\r\n  okay := cog := cognew(@entry, vgaptr) + 1\r\n\r\n\r\nPUB stop\r\n\r\n'' Stop VGA driver - frees a cog\r\n\r\n  if cog\r\n    cogstop(cog~ - 1)\r\n\r\n\r\nDAT\r\n\r\n'********************************\r\n'* Assembly language VGA driver *\r\n'********************************\r\n\r\n                        org\r\n'\r\n'\r\n' Entry\r\n'\r\nentry                   mov     taskptr,#tasks          'reset tasks\r\n\r\n                        mov     x,#8                    'perform task sections initially\r\n:init                   jmpret  taskret,taskptr\r\n                        djnz    x,#:init\r\n'\r\n'\r\n' Superfield\r\n'\r\nsuperfield              mov     hv,hvbase               'set hv\r\n\r\n                        mov     interlace,#0            'reset interlace\r\n\r\n                        test    _mode,#%0100    wz      'get interlace into nz\r\n'\r\n'\r\n' Field\r\n'\r\nfield                   wrlong  visible,par             'set status to visible\r\n\r\n                        tjz     vb,#:nobl               'do any visible back porch lines\r\n                        mov     x,vb\r\n                        movd    bcolor,#colortable\r\n                        call    #blank_line\r\n:nobl\r\n                        mov     screen,_screen          'point to first tile (upper-leftmost)\r\n                        mov     y,_vt                   'set vertical tiles\r\n:line                   mov     vx,_vx                  'set vertical expand\r\n:vert   if_nz           xor     interlace,#1            'interlace skip?\r\n        if_nz           tjz     interlace,#:skip\r\n\r\n                        tjz     hb,#:nobp               'do any visible back porch pixels\r\n                        mov     vscl,hb\r\n                        waitvid colortable,#0\r\n:nobp\r\n                        mov     x,_ht                   'set horizontal tiles\r\n                        mov     vscl,hx                 'set horizontal expand\r\n\r\n:tile                   rdword  tile,screen             'read tile\r\n                        add     tile,line               'set pointer bits into tile\r\n                        rol     tile,#6                 'read tile pixels\r\n                        rdlong  pixels,tile             '(8 clocks between reads)\r\n                        shr     tile,#10+6              'set tile colors\r\n                        movd    :color,tile\r\n                        add     screen,#2               'point to next tile\r\n:color                  waitvid colortable,pixels       'pass colors and pixels to video\r\n                        djnz    x,#:tile                'another tile?\r\n\r\n                        sub     screen,hc2x             'repoint to first tile in same line\r\n\r\n                        tjz     hf,#:nofp               'do any visible front porch pixels\r\n                        mov     vscl,hf\r\n                        waitvid colortable,#0\r\n:nofp\r\n                        mov     x,#1                    'do hsync\r\n                        call    #blank_hsync            '(x=0)\r\n\r\n:skip                   djnz    vx,#:vert               'vertical expand?\r\n                        ror     line,linerot            'set next line\r\n                        add     line,lineadd    wc\r\n                        rol     line,linerot                        \r\n        if_nc           jmp     #:line\r\n                        add     screen,hc2x             'point to first tile in next line\r\n                        djnz    y,#:line        wc      'another tile line? (c=0)\r\n\r\n                        tjz     vf,#:nofl               'do any visible front porch lines\r\n                        mov     x,vf\r\n                        movd    bcolor,#colortable\r\n                        call    #blank_line\r\n:nofl\r\n        if_nz           xor     interlace,#1    wc,wz   'get interlace and field1 into nz (c=0/?)\r\n\r\n        if_z            wrlong  invisible,par           'unless interlace and field1, set status to invisible\r\n\r\n                        mov     taskptr,#tasks          'reset tasks\r\n\r\n                        addx    x,_vf           wc      'do invisible front porch lines (x=0 before, c=0 after)\r\n                        call    #blank_line\r\n\r\n                        mov     x,_vs                   'do vsync lines\r\n                        call    #blank_vsync\r\n\r\n                        mov     x,_vb                   'do invisible back porch lines, except last\r\n                        call    #blank_vsync\r\n\r\n        if_nz           jmp     #field                  'if interlace and field1, display field2\r\n                        jmp     #superfield             'else, new superfield\r\n'\r\n'\r\n' Blank line(s)\r\n'\r\nblank_vsync             cmp     interlace,#2    wc      'vsync (c=1)\r\n\r\nblank_line              mov     vscl,h1                 'blank line or vsync-interlace?\r\n        if_nc           add     vscl,h2\r\n        if_c_and_nz     xor     hv,#%01\r\n        if_c            waitvid hv,#0\r\n        if_c            mov     vscl,h2                 'blank line or vsync-normal?\r\n        if_c_and_z      xor     hv,#%01\r\nbcolor                  waitvid hv,#0\r\n\r\n        if_nc           jmpret  taskret,taskptr         'call task section (z undisturbed)\r\n\r\nblank_hsync             mov     vscl,_hf                'hsync, do invisible front porch pixels\r\n                        waitvid hv,#0\r\n\r\n                        mov     vscl,_hs                'do invisble sync pixels\r\n                        xor     hv,#%10\r\n                        waitvid hv,#0\r\n\r\n                        mov     vscl,_hb                'do invisible back porch pixels\r\n                        xor     hv,#%10\r\n                        waitvid hv,#0\r\n\r\n                        djnz    x,#blank_line   wc      '(c=0)\r\n\r\n                        movd    bcolor,#hv\r\nblank_hsync_ret\r\nblank_line_ret\r\nblank_vsync_ret         ret\r\n'\r\n'\r\n' Tasks - performed in sections during invisible back porch lines\r\n'\r\ntasks                   mov     t1,par                  'load parameters\r\n                        movd    :par,#_enable           '(skip _status)\r\n                        mov     t2,#paramcount - 1\r\n:load                   add     t1,#4\r\n:par                    rdlong  0,t1\r\n                        add     :par,d0\r\n                        djnz    t2,#:load               '+164\r\n\r\n                        mov     t1,#2                   'set video pins and directions\r\n                        shl     t1,_pins                '(if video disabled, pins will drive low)\r\n                        sub     t1,#1\r\n                        test    _pins,#$20      wc\r\n                        and     _pins,#$38\r\n                        shr     t1,_pins\r\n                        movs    vcfg,t1\r\n                        shl     t1,_pins\r\n                        shr     _pins,#3\r\n                        movd    vcfg,_pins\r\n        if_nc           mov     dira,t1\r\n        if_nc           mov     dirb,#0\r\n        if_c            mov     dira,#0\r\n        if_c            mov     dirb,t1                 '+14\r\n\r\n                        tjz     _enable,#disabled       '+2, disabled?\r\n\r\n                        jmpret  taskptr,taskret         '+1=181, break and return later\r\n\r\n                        rdlong  t1,#0                   'make sure CLKFREQ => 16MHz\r\n                        shr     t1,#1\r\n                        cmp     t1,m8           wc\r\n        if_c            jmp     #disabled               '+8\r\n\r\n                        min     _rate,pllmin            'limit _rate to pll range\r\n                        max     _rate,pllmax            '+2\r\n\r\n                        mov     t1,#%00001_011          'set ctra configuration\r\n:max                    cmp     m8,_rate        wc      'adjust rate to be within 4MHz-8MHz\r\n        if_c            shr     _rate,#1                '(vco will be within 64MHz-128MHz)\r\n        if_c            add     t1,#%00000_001\r\n        if_c            jmp     #:max\r\n:min                    cmp     _rate,m4        wc\r\n        if_c            shl     _rate,#1\r\n        if_c            sub     x,#%00000_001\r\n        if_c            jmp     #:min\r\n                        movi    ctra,t1                 '+22\r\n\r\n                        rdlong  t1,#0                   'divide _rate/CLKFREQ and set frqa\r\n                        mov     hvbase,#32+1\r\n:div                    cmpsub  _rate,t1        wc\r\n                        rcl     t2,#1\r\n                        shl     _rate,#1\r\n                        djnz    hvbase,#:div            '(hvbase=0)\r\n                        mov     frqa,t2                 '+136\r\n\r\n                        test    _mode,#%0001    wc      'make hvbase\r\n                        muxnc   hvbase,vmask\r\n                        test    _mode,#%0010    wc\r\n                        muxnc   hvbase,hmask            '+4\r\n\r\n                        jmpret  taskptr,taskret         '+1=173, break and return later\r\n\r\n                        mov     hx,_hx                  'compute horizontal metrics\r\n                        shl     hx,#8\r\n                        or      hx,_hx\r\n                        shl     hx,#4\r\n\r\n                        mov     hc2x,_ht\r\n                        shl     hc2x,#1\r\n\r\n                        mov     h1,_hd\r\n                        neg     h2,_hf\r\n                        sub     h2,_hs\r\n                        sub     h2,_hb\r\n                        sub     h1,h2\r\n                        shr     h1,#1           wc\r\n                        addx    h2,h1\r\n\r\n                        mov     t1,_ht\r\n                        mov     t2,_hx\r\n                        call    #multiply\r\n                        mov     hf,_hd\r\n                        sub     hf,t1\r\n                        shr     hf,#1           wc\r\n                        mov     hb,_ho\r\n                        addx    hb,hf\r\n                        sub     hf,_ho                  '+59\r\n\r\n                        mov     t1,_vt                  'compute vertical metrics\r\n                        mov     t2,_vx\r\n                        call    #multiply\r\n                        test    _mode,#%1000    wc      'consider tile size\r\n                        muxc    linerot,#1\r\n                        mov     lineadd,lineinc\r\n        if_c            shr     lineadd,#1\r\n        if_c            shl     t1,#1\r\n                        test    _mode,#%0100    wc      'consider interlace\r\n        if_c            shr     t1,#1\r\n                        mov     vf,_vd\r\n                        sub     vf,t1\r\n                        shr     vf,#1           wc\r\n                        neg     vb,_vo\r\n                        addx    vb,vf\r\n                        add     vf,_vo                  '+53\r\n\r\n                        movi    vcfg,#%01100_000        '+1, set video configuration\r\n\r\n:colors                 jmpret  taskptr,taskret         '+1=114/160, break and return later\r\n\r\n                        mov     t1,#13                  'load next 13 colors into colortable\r\n:loop                   mov     t2,:color               '5 times = 65 (all 64 colors loaded)\r\n                        shr     t2,#9-2\r\n                        and     t2,#$FC\r\n                        add     t2,_colors\r\n                        rdlong  t2,t2\r\n                        and     t2,colormask\r\n                        or      t2,hvbase\r\n:color                  mov     colortable,t2\r\n                        add     :color,d0\r\n                        andn    :color,d6\r\n                        djnz    t1,#:loop               '+158\r\n\r\n                        jmp     #:colors                '+1, keep loading colors\r\n'\r\n'\r\n' Multiply t1 * t2 * 16 (t1, t2 = bytes)\r\n'\r\nmultiply                shl     t2,#8+4-1\r\n\r\n                        mov     tile,#8\r\n:loop                   shr     t1,#1           wc\r\n        if_c            add     t1,t2\r\n                        djnz    tile,#:loop\r\n\r\nmultiply_ret            ret                             '+37\r\n'\r\n'\r\n' Disabled - reset status, nap ~4ms, try again\r\n'\r\ndisabled                mov     ctra,#0                 'reset ctra\r\n                        mov     vcfg,#0                 'reset video\r\n\r\n                        wrlong  outa,par                'set status to disabled\r\n\r\n                        rdlong  t1,#0                   'get CLKFREQ\r\n                        shr     t1,#8                   'nap for ~4ms\r\n                        min     t1,#3\r\n                        add     t1,cnt\r\n                        waitcnt t1,#0\r\n\r\n                        jmp     #entry                  'reload parameters\r\n'\r\n'\r\n' Initialized data\r\n'\r\npllmin                  long    500_000                 'pll lowest output frequency\r\npllmax                  long    128_000_000             'pll highest output frequency\r\nm8                      long    8_000_000               '*16 = 128MHz (pll vco max)\r\nm4                      long    4_000_000               '*16 = 64MHz (pll vco min)\r\nd0                      long    1 << 9 << 0\r\nd6                      long    1 << 9 << 6\r\ninvisible               long    1\r\nvisible                 long    2\r\nline                    long    $00060000\r\nlineinc                 long    $10000000\r\nlinerot                 long    0\r\nvmask                   long    $01010101\r\nhmask                   long    $02020202\r\ncolormask               long    $FCFCFCFC\r\n'\r\n'\r\n' Uninitialized data\r\n'\r\ntaskptr                 res     1                       'tasks\r\ntaskret                 res     1\r\nt1                      res     1\r\nt2                      res     1\r\n\r\nx                       res     1                       'display\r\ny                       res     1\r\nhf                      res     1\r\nhb                      res     1\r\nvf                      res     1\r\nvb                      res     1\r\nhx                      res     1\r\nvx                      res     1\r\nhc2x                    res     1\r\nscreen                  res     1\r\ntile                    res     1\r\npixels                  res     1\r\nlineadd                 res     1\r\ninterlace               res     1\r\nhv                      res     1\r\nhvbase                  res     1\r\nh1                      res     1\r\nh2                      res     1\r\n'\r\n'\r\n' Parameter buffer\r\n'\r\n_enable                 res     1       '0/non-0        read-only\r\n_pins                   res     1       '%pppttt        read-only\r\n_mode                   res     1       '%tihv          read-only\r\n_screen                 res     1       '@word          read-only\r\n_colors                 res     1       '@long          read-only\r\n_ht                     res     1       '1+             read-only\r\n_vt                     res     1       '1+             read-only\r\n_hx                     res     1       '1+             read-only\r\n_vx                     res     1       '1+             read-only\r\n_ho                     res     1       '0+-            read-only\r\n_vo                     res     1       '0+-            read-only\r\n_hd                     res     1       '1+             read-only\r\n_hf                     res     1       '1+             read-only\r\n_hs                     res     1       '1+             read-only\r\n_hb                     res     1       '1+             read-only\r\n_vd                     res     1       '1+             read-only\r\n_vf                     res     1       '1+             read-only\r\n_vs                     res     1       '1+             read-only\r\n_vb                     res     1       '2+             read-only\r\n_rate                   res     1       '500_000+       read-only\r\n\r\n                        fit     colortable              'fit underneath colortable ($180-$1BF)\r\n\r\n\r\n''\r\n''___\r\n''VAR                   'VGA parameters - 21 contiguous longs\r\n''\r\n''  long  vga_status    '0/1/2 = off/visible/invisible      read-only\r\n''  long  vga_enable    '0/non-0 = off/on                   write-only\r\n''  long  vga_pins      '%pppttt = pins                     write-only\r\n''  long  vga_mode      '%tihv = tile,interlace,hpol,vpol   write-only\r\n''  long  vga_screen    'pointer to screen (words)          write-only\r\n''  long  vga_colors    'pointer to colors (longs)          write-only            \r\n''  long  vga_ht        'horizontal tiles                   write-only\r\n''  long  vga_vt        'vertical tiles                     write-only\r\n''  long  vga_hx        'horizontal tile expansion          write-only\r\n''  long  vga_vx        'vertical tile expansion            write-only\r\n''  long  vga_ho        'horizontal offset                  write-only\r\n''  long  vga_vo        'vertical offset                    write-only\r\n''  long  vga_hd        'horizontal display ticks           write-only\r\n''  long  vga_hf        'horizontal front porch ticks       write-only\r\n''  long  vga_hs        'horizontal sync ticks              write-only\r\n''  long  vga_hb        'horizontal back porch ticks        write-only\r\n''  long  vga_vd        'vertical display lines             write-only\r\n''  long  vga_vf        'vertical front porch lines         write-only\r\n''  long  vga_vs        'vertical sync lines                write-only\r\n''  long  vga_vb        'vertical back porch lines          write-only\r\n''  long  vga_rate      'tick rate (Hz)                     write-only\r\n''\r\n''The preceding VAR section may be copied into your code.\r\n''After setting variables, do start(@vga_status) to start driver.\r\n''\r\n''All parameters are reloaded each superframe, allowing you to make live\r\n''changes. To minimize flicker, correlate changes with vga_status.\r\n''\r\n''Experimentation may be required to optimize some parameters.\r\n''\r\n''Parameter descriptions:\r\n''  __________\r\n''  vga_status\r\n''\r\n''    driver sets this to indicate status:\r\n''      0: driver disabled (vga_enable = 0 or CLKFREQ < 16MHz)\r\n''      1: currently outputting invisible sync data\r\n''      2: currently outputting visible screen data\r\n''  __________\r\n''  vga_enable\r\n''\r\n''        0: disable (pins will be driven low, reduces power)\r\n''    non-0: enable\r\n''  ________\r\n''  vga_pins\r\n''\r\n''    bits 5..3 select pin group:\r\n''      %000: pins 7..0\r\n''      %001: pins 15..8\r\n''      %010: pins 23..16\r\n''      %011: pins 31..24\r\n''      %100: pins 39..32\r\n''      %101: pins 47..40\r\n''      %110: pins 55..48\r\n''      %111: pins 63..56\r\n''\r\n''    bits 2..0 select top pin within group\r\n''    for example: %01111 (15) will use pins %01000-%01111 (8-15)\r\n''  ________\r\n''  vga_mode\r\n''\r\n''    bit 3 selects between 16x16 and 16x32 pixel tiles:\r\n''      0: 16x16 pixel tiles (tileheight = 16)\r\n''      1: 16x32 pixel tiles (tileheight = 32)\r\n''\r\n''    bit 2 controls interlace:\r\n''      0: progressive scan (less flicker, good for motion, required for LCD monitors)\r\n''      1: interlaced scan (allows you to double vga_vt, good for text)\r\n''\r\n''    bits 1 and 0 select horizontal and vertical sync polarity, respectively\r\n''      0: active low\r\n''      1: active high\r\n''  __________\r\n''  vga_screen\r\n''\r\n''    pointer to words which define screen contents (left-to-right, top-to-bottom)\r\n''      number of words must be vga_ht * vga_vt\r\n''      each word has two bitfields: a 6-bit colorset ptr and a 10-bit pixelgroup ptr\r\n''        bits 15..10: select the colorset* for the associated pixel tile\r\n''        bits 9..0: select the pixelgroup** address %ppppppppppcccc00 (p=address, c=0..15)\r\n''\r\n''       * colorsets are longs which each define four 8-bit colors\r\n''\r\n''      ** pixelgroups are <tileheight> longs which define (left-to-right, top-to-bottom) the 2-bit\r\n''         (four color) pixels that make up a 16x16 or a 16x32 pixel tile\r\n''  __________\r\n''  vga_colors\r\n''\r\n''    pointer to longs which define colorsets\r\n''      number of longs must be 1..64\r\n''      each long has four 8-bit fields which define colors for 2-bit (four color) pixels\r\n''      first long's bottom color is also used as the screen background color\r\n''      8-bit color fields are as follows:\r\n''        bits 7..2: actual state of pins 7..2 within pin group*\r\n''        bits 1..0: don't care (used within driver for hsync and vsync)\r\n''\r\n''    * it is suggested that:\r\n''        bits/pins 7..6 are used for red\r\n''        bits/pins 5..4 are used for green\r\n''        bits/pins 3..2 are used for blue\r\n''      for each bit/pin set, sum 240 and 470-ohm resistors to form 75-ohm 1V signals\r\n''      connect signal sets to RED, GREEN, and BLUE on VGA connector\r\n''      always connect group pin 1 to HSYNC on VGA connector via 240-ohm resistor\r\n''      always connect group pin 0 to VSYNC on VGA connector via 240-ohm resistor\r\n''  ______\r\n''  vga_ht\r\n''\r\n''    horizontal number of pixel tiles - must be at least 1\r\n''  ______\r\n''  vga_vt\r\n''\r\n''    vertical number of pixel tiles - must be at least 1\r\n''  ______\r\n''  vga_hx\r\n''\r\n''    horizontal tile expansion factor - must be at least 1\r\n''\r\n''    make sure 16 * vga_ht * vga_hx + ||vga_ho is equal to or at least 16 less than vga_hd\r\n''  ______\r\n''  vga_vx\r\n''\r\n''    vertical tile expansion factor - must be at least 1\r\n''\r\n''    make sure <tileheight> * vga_vt * vga_vx + ||vga_vo does not exceed vga_vd\r\n''      (for interlace, use <tileheight> / 2 * vga_vt * vga_vx + ||vga_vo)\r\n''  ______\r\n''  vga_ho\r\n''\r\n''    horizontal offset in ticks - pos/neg value (0 recommended)\r\n''    shifts the display right/left\r\n''  ______\r\n''  vga_vo\r\n''\r\n''    vertical offset in lines - pos/neg value (0 recommended)\r\n''    shifts the display up/down\r\n''  ______\r\n''  vga_hd\r\n''\r\n''    horizontal display ticks\r\n''  ______\r\n''  vga_hf\r\n''\r\n''    horizontal front porch ticks\r\n''  ______\r\n''  vga_hs\r\n''\r\n''    horizontal sync ticks\r\n''  ______\r\n''  vga_hb\r\n''\r\n''    horizontal back porch ticks\r\n''  ______\r\n''  vga_vd\r\n''\r\n''    vertical display lines\r\n''  ______\r\n''  vga_vf\r\n''\r\n''    vertical front porch lines\r\n''  ______\r\n''  vga_vs\r\n''\r\n''    vertical sync lines\r\n''  ______\r\n''  vga_vb\r\n''\r\n''    vertical back porch lines\r\n''  ________\r\n''  vga_rate\r\n''\r\n''    tick rate in Hz\r\n''\r\n''    driver will limit value to be within 500KHz and 128MHz\r\n''    pixel rate (vga_rate / vga_hx) should be no more than CLKFREQ / 4\r\n\r\n{{\r\n\r\n┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\r\n│                                                   TERMS OF USE: MIT License                                                  │                                                            \r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ \r\n│files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │\r\n│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│\r\n│is furnished to do so, subject to the following conditions:                                                                   │\r\n│                                                                                                                              │\r\n│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│\r\n│                                                                                                                              │\r\n│THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │\r\n│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │\r\n│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │\r\n│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\r\n}}"
  },
  {
    "path": "src/test/resources/samples/langs/Propeller Spin/VocalTract.spin",
    "content": "﻿{{\r\n┌───────────────────────────────────────────┬────────────────┬───────────────────────────────────┬─────────────────┐\r\n│ Vocal Tract v1.1                          │ by Chip Gracey │ Copyright (c) 2006 Parallax, Inc. │ 28 October 2006 │\r\n├───────────────────────────────────────────┴────────────────┴───────────────────────────────────┴─────────────────┤\r\n│                                                                                                                  │\r\n│ This object synthesizes a human vocal tract in real-time. It requires one cog and at least 80 MHz.               │\r\n│                                                                                                                  │\r\n│ The vocal tract is controlled via 13 single-byte parameters which must reside in the parent object:              │\r\n│                                                                                                                  │\r\n│ VAR byte aa,ga,gp,vp,vr,f1,f2,f3,f4,na,nf,fa,ff    'vocal tract parameters                                       │\r\n│                                                                                                                  │\r\n│                                                                                                                  │\r\n│                        aa                                                                                        │\r\n│                  ┌────────────┐                                                                                  │\r\n│                  │ ASPIRATION ├──┐                                                                              │\r\n│                  └────────────┘   │     f1       f2       f3       f4      na   nf                               │\r\n│                                      ┌────┐   ┌────┐   ┌────┐   ┌────┐   ┌───────┐                              │\r\n│                                  +┣──┤ F1 ├──┤ F2 ├──┤ F3 ├──┤ F4 ├──┤ NASAL ├──┐                          │\r\n│                       ga   gp        └────┘   └────┘   └────┘   └────┘   └───────┘   │                          │\r\n│                     ┌─────────┐   │                                                                             │\r\n│                     │ GLOTTAL ├──┘                                                  +┣── OUTPUT                │\r\n│                     └────┬────┘                                          fa   ff                                │\r\n│                                                                      ┌───────────┐   │                          │\r\n│                       vp │ vr                                         │ FRICATION ├──┘                          │\r\n│                     ┌────┴────┐                                       └───────────┘                              │\r\n│                     │ VIBRATO │                                                                                  │\r\n│                     └─────────┘                                                                                  │\r\n│                                                                                                                  │\r\n│                                                                                                                  │\r\n│       ┌───────────┬──────────────────────┬─────────────┬────────────────────────────────────────────────┐        │\r\n│       │ parameter │ description          │ unit        │ notes                                          │        │\r\n│       ├───────────┼──────────────────────┼─────────────┼────────────────────────────────────────────────┤        │\r\n│       │    aa     │ aspiration amplitude │ 0..255      │ breath volume: silent..loud, linear            │        │\r\n│       │    ga     │ glottal amplitude    │ 0..255      │ voice volume: silent..loud, linear             │        │\r\n│       │    gp     │ glottal pitch        │ 1/48 octave │ voice pitch: 100 ─ 110.00Hz (musical note A2) │        │\r\n│       │    vp     │ vibrato pitch        │ 1/48 octave │ voice vibrato pitch: 48 ─ ± 1/2 octave swing  │        │\r\n│       │    vr     │ vibrato rate         │ 0.0763 Hz   │ voice vibrato rate: 52 ─ 4 Hz                 │        │\r\n│       │    f1     │ formant1 frequency   │ 19.53 Hz    │ 1st resonator frequency: 40 ─ 781 Hz          │        │\r\n│       │    f2     │ formant2 frequency   │ 19.53 Hz    │ 2nd resonator frequency: 56 ─ 1094 Hz         │        │\r\n│       │    f3     │ formant3 frequency   │ 19.53 Hz    │ 3rd resonator frequency: 128 ─ 2500 Hz        │        │\r\n│       │    f4     │ formant4 frequency   │ 19.53 Hz    │ 4th resonator frequency: 179 ─ 3496 Hz        │        │\r\n│       │    na     │ nasal amplitude      │ 0..255      │ anti-resonator level: off..on, linear          │        │\r\n│       │    nf     │ nasal frequency      │ 19.53 Hz    │ anti-resonator frequency: 102 ─ 1992 Hz       │        │\r\n│       │    fa     │ frication amplitude  │ 0..255      │ white noise volume: silent..loud, linear       │        │\r\n│       │    ff     │ frication frequency  │ 39.06 Hz    │ white noise frequency: 60 ─ 2344 Hz (\"Sh\")    │        │\r\n│       └───────────┴──────────────────────┴─────────────┴────────────────────────────────────────────────┘        │\r\n│                                                                                                                  │\r\n│ The parent object alternately modifies one or more of these parameters and then calls the go(time) method to     │\r\n│ queue the entire 13-parameter frame for feeding to the vocal tract. The vocal tract will load one queued frame   │\r\n│ after another and smoothly interpolate between them over specified amounts of time without interruption. Up to   │\r\n│ eight frames will be queued in order to relax the frame-generation timing requirement of the parent object. If   │\r\n│ eight frames are queued, the parent must then wait to queue another frame. If the vocal tract runs out of        │\r\n│ frames, it will continue generating samples based on the last frame. When a new frame is queued, it will         │\r\n│ immediately load it and begin inter-polating towards it.                                                         │                                    \r\n│                                                                                                                  │\r\n│ The vocal tract generates audio samples at a continuous rate of 20KHz. These samples can be output to pins via   │\r\n│ delta-modulation for RC filtering or direct transducer driving. An FM aural subcarrier can also be generated for │\r\n│ inclusion into a TV broadcast controlled by another cog. Regardless of any output mode, samples are always       │\r\n│ streamed into a special variable so that other objects can access them in real-time.                             │                                                           \r\n│                                                                                                                  │\r\n│ In order to achieve optimal sound quality, it is worthwhile to maximize amplitudes such as 'ga' to the point     │\r\n│ just shy of numerical overflow. Numerical overflow results in high-amplitude noise bursts which are quite        │\r\n│ disruptive. The closeness of 'f1'-'f4' and their relationship to 'gp' can greatly influence the amount of 'ga'   │\r\n│ that can be applied before overflow occurs. You must determine through experimentation what the limits are. By   │\r\n│ pushing 'ga' close to the overflow point, you will maximize the signal-to-noise ratio of the vocal tract,        │\r\n│ resulting in the highest quality sound. Once your vocal tract programming is complete, the attenuation level     │\r\n│ can then be used to reduce the overall output in 3dB steps while preserving the signal-to-noise ratio.           │                                       \r\n│                                                                                                                  │\r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│ Revision History                                                                   v1.0 released 26 October 2006 │\r\n│                                                                                                                  │\r\n│ v1.1  If the vocal tract runs out of frames, its internal parameters will now be brought all the way to the      │\r\n│       last frame's values. Before, they were left one interpolation point shy, and then set to the last frame's  │\r\n│       values at the start of the next frame. For continuous frames this was trivial, but it posed a problem      │\r\n│       during frame gaps because the internal parameters would get stalled at transition points just shy of the   │\r\n│       last frame's values. This change makes the vocal tract behave more sensibly during frame gaps.             │                                                                        \r\n│                                                                                                                  │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘                                     \r\n                                                                                                                                            \r\n}}                                                                                                                                          \r\nCON                                                                                                                                         \r\n                                                                                                                                            \r\n  frame_buffers = 8                                     'frame buffers (2n)                                                                \r\n                                                                                                                                            \r\n  frame_bytes = 3 {for stepsize} + 13 {for aa..ff}      '16 bytes per frame                                                                 \r\n  frame_longs = frame_bytes / 4                         '4 longs per frame                                                                  \r\n                                                                                                                                            \r\n  frame_buffer_bytes = frame_bytes * frame_buffers                                                                                          \r\n  frame_buffer_longs = frame_longs * frame_buffers                                                                                          \r\n                                                                                                                                            \r\n                                                                                                                                            \r\nVAR                                                                                                                                         \r\n                                                                                                                                            \r\n  long  cog, tract, pace                                                                                                                    \r\n                                                                                                                                            \r\n  long  index, attenuation, sample                      '3 longs       ...must                                                              \r\n  long  dira_, dirb_, ctra_, ctrb_, frqa_, cnt_         '6 longs       ...be                                                                \r\n  long  frames[frame_buffer_longs]                      'many longs    ...contiguous                                                        \r\n                                                                                                                                            \r\n                                                                                                                                            \r\nPUB start(tract_ptr, pos_pin, neg_pin, fm_offset) : okay                                                                                    \r\n                                                                                                                                            \r\n'' Start vocal tract driver - starts a cog                                                                                                  \r\n'' returns false if no cog available                                                                                                        \r\n''                                                                                                                                          \r\n''   tract_ptr = pointer to vocal tract parameters (13 bytes)                                                                               \r\n''     pos_pin = positive delta-modulation pin (-1 to disable)                                                                              \r\n''     neg_pin = negative delta-modulation pin (pos_pin must also be enabled, -1 to disable)                                                \r\n''   fm_offset = offset frequency for fm aural subcarrier generation (-1 to disable, 4_500_000 for NTSC)                                    \r\n                                                                                                                                            \r\n  'Reset driver                                                                                                                             \r\n  stop                                                                                                                                      \r\n                                                                                                                                            \r\n  'Remember vocal tract parameters pointer                                                                                                  \r\n  tract := tract_ptr                                                                                                                        \r\n                                                                                                                                            \r\n  'Initialize pace to 100%                                                                                                                  \r\n  pace := 100                                                                                                                               \r\n                                                                                                                                            \r\n  'If delta-modulation pin(s) enabled, ready output(s) and ready ctrb for duty mode                                                         \r\n  if pos_pin > -1                                                                                                                           \r\n    dira_[pos_pin >> 5 & 1] |= |< pos_pin                                                                                                   \r\n    ctrb_ := $18000000 + pos_pin & $3F                                                                                                      \r\n    if neg_pin > -1                                                                                                                         \r\n      dira_[neg_pin >> 5 & 1] |= |< neg_pin                                                                                                 \r\n      ctrb_ += $04000000 + (neg_pin & $3F) << 9                                                                                             \r\n                                                                                                                                            \r\n  'If fm offset is valid, ready ctra for pll mode with divide-by-16 (else disabled)                                                         \r\n  if fm_offset > -1                                                                                                                         \r\n    ctra_ := $05800000                                                                                                                      \r\n                                                                                                                                            \r\n  'Ready frqa value for fm offset                                                                                                           \r\n  repeat 33                                                                                                                                 \r\n    frqa_ <<= 1                                                                                                                             \r\n    if fm_offset => clkfreq                                                                                                                 \r\n      fm_offset -= clkfreq                                                                                                                  \r\n      frqa_++                                                                                                                               \r\n    fm_offset <<= 1                                                                                                                         \r\n                                                                                                                                            \r\n  'Ready 20KHz sample period                                                                                                                \r\n  cnt_ := clkfreq / 20_000                                                                                                                  \r\n                                                                                                                                            \r\n  'Launch vocal tract cog                                                                                                                   \r\n  return cog := cognew(@entry, @attenuation) + 1                                                                                            \r\n                                                                                                                                            \r\n                                                                                                                                            \r\nPUB stop                                                                                                                                    \r\n                                                                                                                                            \r\n'' Stop vocal tract driver - frees a cog                                                                                                    \r\n                                                                                                                                            \r\n  'If already running, stop vocal tract cog                                                                                                 \r\n  if cog                                                                                                                                    \r\n    cogstop(cog~ -  1)                                                                                                                      \r\n                                                                                                                                            \r\n  'Reset variables and buffers\r\n  longfill(@index, 0, constant(3 + 6 + frame_buffer_longs))\r\n\r\n\r\nPUB set_attenuation(level)\r\n\r\n'' Set master attenuation level (0..7, initially 0)\r\n\r\n  attenuation := level\r\n\r\n\r\nPUB set_pace(percentage)\r\n\r\n'' Set pace to some percentage (initially 100)\r\n\r\n  pace := percentage\r\n\r\n\r\nPUB go(time)\r\n\r\n'' Queue current parameters to transition over time\r\n''\r\n''   actual time = integer(time * 100 / pace) #> 2 * 700µs (at least 1400µs, see set_pace)\r\n\r\n  'Wait until frame available (first long will be zeroed)\r\n  repeat while frames[index]\r\n\r\n  'Load parameters into frame\r\n  bytemove(@frames[index] + 3, tract, 13)\r\n\r\n  'Write stepsize into frame (non-0 alerts vocal tract that frame is ready)\r\n  frames[index] |= $01000000 / (time * 100 / pace #> 2)\r\n\r\n  'Increment frame index\r\n  index := (index + frame_longs) & constant(frame_buffer_longs - 1)\r\n\r\n\r\nPUB full : status\r\n\r\n'' Returns true if the parameter queue is full\r\n'' (useful for checking if \"go\" would have to wait) \r\n\r\n  return frames[index]\r\n\r\n\r\nPUB empty : status | i\r\n\r\n'' Returns true if the parameter queue is empty\r\n'' (useful for detecting when the vocal tract is finished)\r\n\r\n  repeat i from 0 to constant(frame_buffers - 1)\r\n    if frames[i * frame_longs]\r\n      return {false}\r\n  return true\r\n  \r\n \r\nPUB sample_ptr : ptr\r\n\r\n'' Returns the address of the long which receives the audio samples in real-time\r\n'' (signed 32-bit values updated at 20KHz)\r\n\r\n  return @sample\r\n  \r\n\r\nPUB aural_id : id\r\n\r\n'' Returns the id of the cog executing the vocal tract algorithm\r\n'' (for connecting a broadcast tv driver with the aural subcarrier)\r\n\r\n  return cog - 1\r\n\r\n\r\nDAT\r\n\r\n' ┌──────────────────┐\r\n' │  Initialization  │\r\n' └──────────────────┘\r\n\r\nentry                   org\r\n\r\n:zero                   mov     reserves,#0             'zero all reserved data\r\n                        add     :zero,d0\r\n                        djnz    clear_cnt,#:zero\r\n\r\n                        mov     t1,#2*15                'assemble 15 multiply steps into reserves\r\n:minst                  mov     mult_steps,mult_step    '(saves hub memory)\r\n                        add     :minst,d0s0             \r\n                        test    t1,#1           wc\r\n        if_c            sub     :minst,#2\r\n                        djnz    t1,#:minst\r\n                        mov     mult_ret,antilog_ret    'write 'ret' after last instruction\r\n\r\n                        mov     t1,#13                  'assemble 13 cordic steps into reserves\r\n:cstep                  mov     t2,#8                   '(saves hub memory)\r\n:cinst                  mov     cordic_steps,cordic_step\r\n                        add     :cinst,d0s0\r\n                        djnz    t2,#:cinst\r\n                        sub     :cinst,#8\r\n                        add     cordic_dx,#1\r\n                        add     cordic_dy,#1\r\n                        add     cordic_a,#1\r\n                        djnz    t1,#:cstep                       \r\n                        mov     cordic_ret,antilog_ret  'write 'ret' over last instruction\r\n\r\n                        mov     t1,par                  'get dira/dirb/ctra/ctrb\r\n                        add     t1,#2*4\r\n                        mov     t2,#4\r\n:regs                   rdlong  dira,t1\r\n                        add     t1,#4\r\n                        add     :regs,d0\r\n                        djnz    t2,#:regs\r\n\r\n                        rdlong  frqa_center,t1          'get frqa center\r\n                        \r\n                        add     t1,#4                   'get cnt ticks\r\n                        rdlong  cnt_ticks,t1\r\n                        \r\n                        mov     cnt_value,cnt           'prepare for initial waitcnt\r\n                        add     cnt_value,cnt_ticks\r\n\r\n\r\n' ┌────────────────────┐\r\n' │  Vocal Tract Loop  │\r\n' └────────────────────┘\r\n\r\n' Wait for next sample period, then output sample\r\n\r\nloop                    waitcnt cnt_value,cnt_ticks     'wait for sample period\r\n\r\n                        rdlong  t1,par                  'perform master attenuation\r\n                        sar     x,t1                    \r\n\r\n                        mov     t1,x                    'update fm aural subcarrier for tv broadcast\r\n                        sar     t1,#10\r\n                        add     t1,frqa_center\r\n                        mov     frqa,t1\r\n\r\n                        mov     t1,x                    'update duty cycle output for pin driving\r\n                        add     t1,h80000000\r\n                        mov     frqb,t1\r\n\r\n                        mov     t1,par                  'update sample receiver in main memory\r\n                        add     t1,#1*4\r\n                        wrlong  x,t1\r\n\r\n' White noise source\r\n\r\n                        test    lfsr,lfsr_taps  wc      'iterate lfsr three times\r\n                        rcl     lfsr,#1\r\n                        test    lfsr,lfsr_taps  wc\r\n                        rcl     lfsr,#1\r\n                        test    lfsr,lfsr_taps  wc\r\n                        rcl     lfsr,#1\r\n\r\n' Aspiration\r\n\r\n                        mov     t1,aa                   'aspiration amplitude\r\n                        mov     t2,lfsr\r\n                        call    #mult\r\n                        \r\n                        sar     t1,#8                   'set x\r\n                        mov     x,t1\r\n\r\n' Vibrato\r\n\r\n                        mov     t1,vr                   'vibrato rate\r\n                        shr     t1,#10\r\n                        add     vphase,t1\r\n\r\n                        mov     t1,vp                   'vibrato pitch\r\n                        mov     t2,vphase\r\n                        call    #sine\r\n                        \r\n                        add     t1,gp                   'sum glottal pitch (+) into vibrato pitch (+/-)\r\n\r\n' Glottal pulse\r\n\r\n                        shr     t1,#2                   'divide final pitch by 3 to mesh with                                                                   \r\n                        mov     t2,t1                   '...12 notes/octave musical scale\r\n                        shr     t2,#2                   '(multiply by %0.0101010101010101)\r\n                        add     t1,t2                                                             \r\n                        mov     t2,t1\r\n                        shr     t2,#4\r\n                        add     t1,t2\r\n                        mov     t2,t1\r\n                        shr     t2,#8\r\n                        add     t1,t2\r\n\r\n                        add     t1,tune                 'tune scale so that gp=100 produces 110.00Hz (A2)\r\n\r\n                        call    #antilog                'convert pitch (log frequency) to phase delta\r\n                        add     gphase,t2              \r\n\r\n                        mov     t1,gphase               'convert phase to glottal pulse sample\r\n                        call    #antilog    \r\n                        sub     t2,h40000000\r\n                        mov     t1,ga\r\n                        call    #sine\r\n\r\n                        sar     t1,#6                   'add to x\r\n                        add     x,t1\r\n\r\n' Vocal tract formants\r\n\r\n                        mov     y,#0                    'reset y\r\n\r\n                        mov     a,f1                    'formant1, sum and rotate (x,y) \r\n                        add     x,f1x                   \r\n                        add     y,f1y\r\n                        call    #cordic\r\n                        mov     f1x,x\r\n                        mov     f1y,y\r\n\r\n                        mov     a,f2                    'formant2, sum and rotate (x,y) \r\n                        add     x,f2x                   \r\n                        add     y,f2y\r\n                        call    #cordic\r\n                        mov     f2x,x\r\n                        mov     f2y,y\r\n\r\n                        mov     a,f3                    'formant3, sum and rotate (x,y) \r\n                        add     x,f3x                  \r\n                        add     y,f3y\r\n                        call    #cordic\r\n                        mov     f3x,x\r\n                        mov     f3y,y\r\n               \r\n                        mov     a,f4                    'formant4, sum and rotate (x,y)    \r\n                        add     x,f4x                  \r\n                        add     y,f4y\r\n                        call    #cordic\r\n                        mov     f4x,x\r\n                        mov     f4y,y\r\n\r\n' Nasal anti-formant\r\n\r\n                        add     nx,x                    'subtract from x (nx negated)\r\n\r\n                        mov     a,nf                    'nasal frequency\r\n                        call    #cordic\r\n\r\n                        mov     t1,na                   'nasal amplitude\r\n                        mov     t2,x\r\n                        call    #mult\r\n                        \r\n                        mov     x,nx                    'restore x\r\n                        neg     nx,t1                   'negate nx\r\n                        \r\n' Frication\r\n\r\n                        mov     t1,lfsr                 'phase noise\r\n                        sar     t1,#3\r\n                        add     fphase,t1\r\n                        sar     t1,#1\r\n                        add     fphase,t1\r\n\r\n                        mov     t1,ff                   'frication frequency\r\n                        shr     t1,#1\r\n                        add     fphase,t1\r\n\r\n                        mov     t1,fa                   'frication amplitude\r\n                        mov     t2,fphase\r\n                        call    #sine\r\n                        \r\n                        add     x,t1                    'add to x\r\n\r\n' Handle frame\r\n\r\n                        jmp     :ret                    'run segment of frame handler, return to loop\r\n\r\n\r\n' ┌─────────────────┐\r\n' │  Frame Handler  │\r\n' └─────────────────┘\r\n\r\n:ret                    long    :wait                   'pointer to next frame handler routine\r\n\r\n\r\n:wait                   jmpret  :ret,#loop              '(6 or 17.5 cycles)\r\n                        mov     frame_ptr,par           'check for next frame\r\n                        add     frame_ptr,#8*4          'point past miscellaneous data\r\n                        add     frame_ptr,frame_index   'point to start of frame\r\n                        rdlong  step_size,frame_ptr     'get stepsize\r\n                        and     step_size,h00FFFFFF  wz 'isolate stepsize and check if not 0\r\n        if_nz           jmp     #:next                  'if not 0, next frame ready\r\n        \r\n\r\n                        mov     :final1,:finali         'no frame ready, ready to finalize parameters\r\n                        mov     frame_cnt,#13           'iterate aa..ff\r\n\r\n:final                  jmpret  :ret,#loop              '(13.5 or 4 cycles)\r\n:final1                 mov     par_curr,par_next       'current parameter = next parameter\r\n                        add     :final1,d0s0            'update pointers\r\n                        djnz    frame_cnt,#:final       'another parameter?\r\n                        \r\n                        jmp     #:wait                  'check for next frame\r\n\r\n\r\n:next                   add     step_size,#1            'next frame ready, insure accurate accumulation\r\n                        mov     step_acc,step_size      'initialize step accumulator                    \r\n\r\n\r\n                        movs    :set1,#par_next         'ready to get parameters and steps for aa..ff\r\n                        movd    :set2,#par_curr   \r\n                        movd    :set3,#par_next\r\n                        movd    :set4,#par_step\r\n                        add     frame_ptr,#3            'point to first parameter\r\n                        mov     frame_cnt,#13           'iterate aa..ff\r\n\r\n:set                    jmpret  :ret,#loop              '(19.5 or 46.5 cycles)\r\n                        rdbyte  t1,frame_ptr            'get new parameter\r\n                        shl     t1,#24                  'msb justify\r\n:set1                   mov     t2,par_next             'get next parameter\r\n:set2                   mov     par_curr,t2             'current parameter = next parameter\r\n:set3                   mov     par_next,t1             'next parameter = new parameter\r\n                        sub     t1,t2           wc      'get next-current delta with sign in c            \r\n                        negc    t1,t1                   'make delta absolute (by c, not msb)\r\n                        rcl     vscl,#1         wz, nr  'save sign into nz (vscl unaffected)\r\n\r\n                        mov     t2,#8                   'multiply delta by step size\r\n:mult                   shl     t1,#1           wc\r\n        if_c            add     t1,step_size\r\n                        djnz    t2,#:mult\r\n\r\n:set4                   negnz    par_step,t1            'set signed step\r\n\r\n                        add     :set1,#1                'update pointers for next parameter+step\r\n                        add     :set2,d0\r\n                        add     :set3,d0\r\n                        add     :set4,d0\r\n                        add     frame_ptr,#1\r\n                        djnz    frame_cnt,#:set         'another parameter?\r\n\r\n\r\n:stepframe              jmpret  :ret,#loop              '(47.5 or 8 cycles)\r\n                        mov     :step1,:stepi           'ready to step parameters\r\n                        mov     frame_cnt,#13           'iterate aa..ff\r\n                        \r\n:step                   jmpret  :ret,#loop              '(3 or 4 cycles)\r\n:step1                  add     par_curr,par_step       'step parameter\r\n                        add     :step1,d0s0             'update pointers for next parameter+step\r\n                        djnz    frame_cnt,#:step        'another parameter?\r\n                        \r\n                        add     step_acc,step_size      'accumulate frame steps\r\n                        test    step_acc,h01000000  wc  'check for frame steps done\r\n        if_nc           jmp     #:stepframe             'another frame step?\r\n\r\n        \r\n                        sub     frame_ptr,#frame_bytes  'zero stepsize in frame to signal frame done\r\n                        wrlong  vscl,frame_ptr\r\n\r\n                        add     frame_index,#frame_bytes'point to next frame\r\n                        and     frame_index,#frame_buffer_bytes - 1\r\n                        \r\n                        jmp     #:wait                  'check for next frame\r\n\r\n\r\n:finali                 mov     par_curr,par_next       'instruction used to finalize parameters                 \r\n:stepi                  add     par_curr,par_step       'instruction used to step parameters               \r\n\r\n\r\n' ┌────────────────────┐\r\n' │  Math Subroutines  │\r\n' └────────────────────┘\r\n\r\n' Antilog\r\n'\r\n'   in:         t1 = log (top 4 bits = whole number, next 11 bits = fraction)\r\n'\r\n'   out:        t2 = antilog ($00010000..$FFEA0000)\r\n\r\nantilog                 mov     t2,t1                   \r\n                        shr     t2,#16                  'position 11-bit fraction\r\n                        shr     t1,#16+12               'position 4-bit whole number\r\n                        and     t2,h00000FFE            'get table offset\r\n                        or      t2,h0000D000            'get table base\r\n                        rdword  t2,t2                   'lookup fractional antilog\r\n                        or      t2,h00010000            'insert leading bit\r\n                        shl     t2,t1                   'shift up by whole number\r\n\r\nantilog_ret             ret\r\n\r\n\r\n' Scaled sine\r\n'\r\n'   in:         t1 = unsigned scale (15 top bits used)\r\n'               t2 = angle (13 top bits used)\r\n'\r\n'   out:        t1 = 17-bit * 15-bit scaled sine ($80014000..$7FFEC000)\r\n\r\nsine                    shr     t2,#32-13               'get 13-bit angle\r\n                        test    t2,h00001000    wz      'get sine quadrant 3|4 into nz\r\n                        test    t2,h00000800    wc      'get sine quadrant 2|4 into c\r\n                        negc    t2,t2                   'if sine quadrant 2|4, negate table offset\r\n                        or      t2,h00007000            'insert sine table base address >> 1\r\n                        shl     t2,#1                   'shift left to get final word address\r\n                        rdword  t2,t2                   'read sine word from table\r\n                        negnz   t2,t2                   'if quadrant 3|4, negate word\r\n                        shl     t2,#15                  'msb-justify result\r\n                                                        'multiply follows...\r\n\r\n' Multiply\r\n'                                                                                             \r\n'   in:         t1 = unsigned multiplier (15 top bits used)\r\n'               t2 = signed multiplicand (17 top bits used)\r\n'\r\n'   out:        t1 = 32-bit signed product\r\n\r\nmult                    shr     t1,#32-15               'position unsigned multiplier\r\n\r\n                        sar     t2,#15                  'position signed multiplicand\r\n                        shl     t2,#15-1\r\n\r\n                        jmp     #mult_steps             'do multiply steps\r\n\r\n\r\nmult_step               sar     t1,#1           wc      'multiply step that gets assembled into reserves (x15)\r\n        if_c            add     t1,t2                   \r\n\r\n\r\n' Cordic rotation\r\n'\r\n'   in:          a = 0 to <90 degree angle (~13 top bits used)\r\n'              x,y = signed coordinates     \r\n'\r\n'   out:       x,y = scaled and rotated signed coordinates\r\n\r\ncordic                  sar     x,#1                    'multiply (x,y) by %0.10011001 (0.60725 * 0.984)                   \r\n                        mov     t1,x                    '...for cordic pre-scaling and slight damping         \r\n                        sar     t1,#3\r\n                        add     x,t1\r\n                        mov     t1,x\r\n                        sar     t1,#4\r\n                        add     x,t1\r\n                        \r\n                        sar     y,#1\r\n                        mov     t1,y\r\n                        sar     t1,#3\r\n                        add     y,t1\r\n                        mov     t1,y\r\n                        sar     t1,#4\r\n                        add     y,t1\r\n\r\n                        mov     t1,x                    'do first cordic step\r\n                        sub     x,y\r\n                        add     y,t1\r\n                        sub     a,h80000000     wc\r\n\r\n                        jmp     #cordic_steps+1         'do subsequent cordic steps (skip first instruction)\r\n\r\n\r\ncordic_step             mov     a,a             wc      'cordic step that gets assembled into reserves (x13)\r\n                        mov     t1,y                    \r\ncordic_dx               sar     t1,#1                   '(source incremented for each step)\r\n                        mov     t2,x\r\ncordic_dy               sar     t2,#1                   '(source incremented for each step)\r\n                        sumnc   x,t1\r\n                        sumc    y,t2\r\ncordic_a                sumnc   a,cordic_delta          '(source incremented for each step)\r\n\r\n\r\n' ┌────────────────┐\r\n' │  Defined Data  │\r\n' └────────────────┘\r\n\r\ntune                    long    $66920000               'scale tuned to 110.00Hz at gp=100 (manually calibrated)\r\n\r\nlfsr                    long    1                       'linear feedback shift register for noise generation\r\nlfsr_taps               long    $80061000\r\n\r\ncordic_delta            long    $4B901476               'cordic angle deltas (first is h80000000)\r\n                        long    $27ECE16D\r\n                        long    $14444750\r\n                        long    $0A2C350C\r\n                        long    $05175F85\r\n                        long    $028BD879                                       \r\n                        long    $0145F154\r\n                        long    $00A2F94D\r\n                        long    $00517CBB\r\n                        long    $0028BE60\r\n                        long    $00145F30\r\n                        long    $000A2F98\r\n\r\nh80000000               long    $80000000               'miscellaneous constants greater than 9 bits\r\nh40000000               long    $40000000\r\nh01000000               long    $01000000\r\nh00FFFFFF               long    $00FFFFFF\r\nh00010000               long    $00010000        \r\nh0000D000               long    $0000D000\r\nh00007000               long    $00007000\r\nh00001000               long    $00001000\r\nh00000FFE               long    $00000FFE\r\nh00000800               long    $00000800\r\n\r\nd0                      long    $00000200               'destination/source field increments\r\nd0s0                    long    $00000201\r\n\r\nclear_cnt               long    $1F0 - reserves         'number of reserved registers to clear on startup\r\n\r\n\r\n' ┌──────────────────────────────────────────────────┐\r\n' │  Undefined Data (zeroed by initialization code)  │\r\n' └──────────────────────────────────────────────────┘\r\n\r\nreserves\r\n\r\nfrqa_center             res     1                       'reserved registers that get cleared on startup\r\n\r\ncnt_ticks               res     1\r\ncnt_value               res     1\r\n\r\nframe_index             res     1\r\nframe_ptr               res     1\r\nframe_cnt               res     1\r\n\r\nstep_size               res     1\r\nstep_acc                res     1\r\n                                                \r\nvphase                  res     1\r\ngphase                  res     1\r\nfphase                  res     1\r\n\r\nf1x                     res     1\r\nf1y                     res     1\r\nf2x                     res     1\r\nf2y                     res     1\r\nf3x                     res     1\r\nf3y                     res     1\r\nf4x                     res     1\r\nf4y                     res     1\r\nnx                      res     1\r\n\r\na                       res     1\r\nx                       res     1\r\ny                       res     1\r\n\r\nt1                      res     1\r\nt2                      res     1\r\n\r\npar_curr                                                '*** current parameters\r\naa                      res     1                       'aspiration amplitude\r\nga                      res     1                       'glottal amplitude       \r\ngp                      res     1                       'glottal pitch\r\nvp                      res     1                       'vibrato pitch           \r\nvr                      res     1                       'vibrato rate            \r\nf1                      res     1                       'formant1 frequency      \r\nf2                      res     1                       'formant2 frequency\r\nf3                      res     1                       'formant3 frequency\r\nf4                      res     1                       'formant4 frequency\r\nna                      res     1                       'nasal amplitude\r\nnf                      res     1                       'nasal frequency\r\nfa                      res     1                       'frication amplitude\r\nff                      res     1                       'frication frequency\r\n\r\npar_next                res     13                      '*** next parameters\r\npar_step                res     13                      '*** parameter steps\r\n\r\n\r\nmult_steps              res     2 * 15                  'assembly area for multiply steps w/ret\r\nmult_ret\r\nsine_ret                res     1\r\n\r\ncordic_steps            res     8 * 13 - 1              'assembly area for cordic steps w/ret\r\ncordic_ret              res     1\r\n\r\n{{\r\n\r\n┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\r\n│                                                   TERMS OF USE: MIT License                                                  │                                                            \r\n├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤\r\n│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ \r\n│files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │\r\n│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│\r\n│is furnished to do so, subject to the following conditions:                                                                   │\r\n│                                                                                                                              │\r\n│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│\r\n│                                                                                                                              │\r\n│THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │\r\n│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │\r\n│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │\r\n│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │\r\n└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\r\n}}"
  },
  {
    "path": "src/test/resources/samples/langs/Protocol Buffer/addressbook.proto",
    "content": "package tutorial;\n\noption java_package = \"com.example.tutorial\";\noption java_outer_classname = \"AddressBookProtos\";\n\nmessage Person {\n  required string name = 1;\n  required int32 id = 2;\n  optional string email = 3;\n\n  enum PhoneType {\n    MOBILE = 0;\n    HOME = 1;\n    WORK = 2;\n  }\n\n  message PhoneNumber {\n    required string number = 1;\n    optional PhoneType type = 2 [default = HOME];\n  }\n\n  repeated PhoneNumber phone = 4;\n}\n\nmessage AddressBook {\n  repeated Person person = 1;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Public Key/gpg_key.asc",
    "content": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2\n\nmQINBFJJNS0BEADE9QkGDstkCAbUWIMnyzfYb+Z7KdF1vFR2WLe4yov9lwQ1gfjy\n3lV5AZfEmNe+AGTRney/jpp9It0wyVQWvKM7N9yvFkWRVHq/thz8oDz/SknBoD1F\njACJgPXGlK3+YiXa03e3XM1JZxBgvHEH4MQTnNHQ2N7ey2J3oZ6NtOkZdu1xHKZS\nhn1WUR9zRMa1XK1yLAowlKThnPk+jQVrMrwLtjoJ4wyWHGz+sZJw0IkV/7YJa2it\n0h7z2x0JmkkiNtYGmbwiTKIIbR2ZcjXLN/VgQ5dvMJDHqkiuVG8VCZ5RetYbLPza\n6+xsJoByuAzK5Zgg8lB73TgjkJYN19F56W10e5b+4VUYjU1g7rFbYh0JRz4u6IVJ\n4lJykVHTCIVbGPNeBlqw/LeGnDsXV3a9OGnWvHZzLzFEp9RZwrUMOFUtdkEwZU+j\nnt/I7c1+RVrmjW0aNulR9fywD+GdaTEnxl08m2yNokMdjy6Z43yUNbYf4F5HFYCi\nwZRD40jHb8N89DPZhdZaDub5F+ePfy3+JIXm1e8rdWjr1z9UjF8eX5XQ89OVNS62\nKb2VM5YT/gCa/4Iwaoag/URVyB/BDJIuqjBpu6Al6zdtuOkvbawoezrqaWN6JJF7\nBBaVYy2AS5OjGtu8Uxfz0iYevwql1lIczK2c0E+InNNyFPOu/rpppgURwQARAQAB\ntCRSeWFuIEphY29icyA8cnlhbi5tamFjb2JzQGdtYWlsLmNvbT6JAjkEEwECACMF\nAlOeONMCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAKCRC9jrHuX4qBgQJ7\nD/kBzMpbQeoZ6LCIRs2Yngalc+8U+Td9GSjdmo1oIjrYtowSTeOQcoIznv8gKY2n\nyUypNNsgYtT8lpMtnT6BjHJU05vdGBVZDbD6NnxcgIwo3DM9I9eazjy9oHVIXPDu\noffTfwFmVEIlWWLcn0bHzyy70Gp7p0J3QbEN1Q2nXNX5LXzqfPlaeLpwotnSiKD8\nxNZ/iKVhMduLOZ6YY2jDcdlYba1hDoDHgO1Xh0wR2ZO7Yl50XM4mQlMudX1YsTuy\ndLEbEtX+CR2uMpvhPYUhQzE4st9r7ZPlUO33cOn5FCyn29EB5DyMpILjS6M9Vlwa\noByPOhsCg7U23gviGxx7h/9dSFx6pZ7/Ejhwq+NgtmnMn+xQ5SL0UgVm1O3lruf+\n0OxlkShpx85PRJIr+lJvFAulb+h5kjzDTV5ekqL0poGlRzLvC4xSbEzYdpBN2mbD\nsR2yR4KJ6K972CufYTdKVk2hnvlYunP1Yg7NYaQvSITKbcZ+M6tvAkbXyOV6MGVV\nu8dhKwKmR4+s8Rajf0x2n2wl7DZy5sdSmSIGPMYOskgsVxXcuaWa7DEqcjrdoGPQ\nuJiBubAQnMKnUvOwY1dsD3H7FQu3INQbarngcPUfxKjGWRveGYYQtAf5FF5Cuj7T\nOuQM2+CVaPWlrj944IEGWp75ezWDCsEMTQZC7B86BDer2bQvUnlhbiBKYWNvYnMg\nKER1a2VsYW5hKSA8cnlhbi5tamFjb2JzQGdtYWlsLmNvbT6JAjMEMAECAB0FAlOe\nOU8WHQBSZW1vdmVkIHRoZSBjb21tZW50LgAKCRC9jrHuX4qBgTLxEACrFljsl+8F\nEPHZ2fhMr+2601RktBttkl3RgFMpaXKBBuiGwaatfo9k6GsXaVfzAXpR7jf1RxUr\nqzJ3H8YT5mvnXzVSe0i42Ykfj8+SxsggfcJfLZfyMtTsT0mE1WCb1JaTfn0HyYum\nkuVtCm3pBhrwlyEGjRMx1HKeOnQCXYLjtTgjsmlitRl/mwKpHkTuKOdt9rpTU77H\nx3+Hi5YEeSDd5jEujj0THC98WcokhBuKT3Ki805jqPuyFIN17+cJK8rHEQSnZOLG\nXj/VzogQ/t2OZw5IpmdLefLRTCvcZNsfqsHLc543+C0dzK3eL2z+g/rOU0VnVjf9\nANKZHzoUkYSmKDS/JQDXgCgKC5FjtyEjvP4xgQasqmtt3FWT/CljxEqP5tXGdLnE\nMBeKJO9UkomG2bHTeJhS5yVL53ULtMvNmQX+21zz7QQdbL6wIKw7MwjhmkuUAeKG\n+6ZfqEJnCCEvOp8Q0RddQ00JLneY54WuR1I17+peDIc59zS+wpwCcHA2MiVBwouB\n2eUYb0O+TBdcrx/NMoIQWJ6QK2z/CP90tCKcMvCoU0fCRwkiWk9CFcrk0MAbPt8N\nC3LV3Xr9qFBAyPRsg8SkTzeWf9oCsQDydWTN+UydHMbdTnQLs4qCt5/i3jOmYpSK\nj5f5VcqO+Uq8fcAFasQt8giSuzBrcdW4+4kCOAQTAQIAIgUCUkk1LQIbAwYLCQgH\nAwIGFQgCCQoLBBYCAwECHgECF4AACgkQvY6x7l+KgYFlkxAAkHwIjv9bIcHhQ5HK\nIt6ZKPTEuZJM5VUYGO3o0bA8wPRGapJ+6ndCbeC7/U+W8ShfNJM789cFLTN0dQbU\njbbkucTCqG+0lAgimP7KiCLx2Hs3McdOTHt3m4dzPiUsz1waNDkrD3QzU6k6jebW\nApAzhMkYH1IALxd4yScNR2CPcdV/YQUt4OG0+h69rubsHbszQOpAsFoygNAZGWbD\n6i4gQz5CYat+TCmooI/kJh/cdZ+IFfwZXfQHndwsmByqZYydu4Lc0i/KgaW4r4fp\nu5/L19qWPjoJKQf8y1aiVjEq/QCi0fKEAIhrOJq6Woyv97WDsGu5u0yDIOpCInSC\n5J8okLl2CtATYh9YayxAHyus/137skhJwwLwAadpmsXeZR+xOpE8HMXxS8DiVH+O\nnu3beOZnY6g4g8/uxzY0FpQ6MB1DRVPRxPZ/+3RjMqAjSRFVZag3zwv19Qu/IHhR\nuQal7eR5Ml0MqTBPl2cKt3iKmrY2RIMfLC2Emv5cH5y3iep7A6FrLn4fiS6u0AXJ\nNmPk23C65K/dlIdytm9qZi7EJpOw0IE1x4UU6wNS+kM4mqnWtzCZvMIhq2lQY1k0\nPEB2NAGrOgNRkr6MsL4XOQhy6lT18sO39LTWdMoz0IviGSpdO9MukxhraBt/6GWK\nYP8E+8TwsCqxq2LD/9E8G4n9IaC5Ag0EUkk1LQEQAK5R+XG9q2rcVkZhsTOOJf6k\nBc/aYYsEJktnZD7jqFRUve9p/K31qPL/qtMyLxQqRJla9PUiPtwY1vZo+omtg1Eh\neu2Na6z7m5ZuFE7GkS2hvFlM/STqiZ09Vrv8CaCb8Vs/sbrsupgeNGOTZOf53DHF\nVszV9C1KY5Ux+t7gua0mKwBOrk4l5ctGDsV7GE8BsplfZHwsYKW2ez4462s2lgDf\nH+nBxToT0pv5OVvE6Iv5oXUTaotpOm2s/leNiHBYOS+qYXq58LcvjNaFY6ROexWW\nJQbaK8jEYP5HKSA7p2+5Cnf1FNP4LjH0dnT3OOC5PTlZ9Di4reLtLlsmCQkhRRyx\ntjZfWCNDI70pme0SMXUe4lYnLjNTrmryu9PV0RYaMAL1VZYhrMLCT0SMaHNm1gKN\n+j00X8bGTEvA9bTzWo2oOS0r1hw0AdgfeFaMvSzTaiZfrB5a6UEDDMwrraaTwlPp\nSXVL9OWtdvr5kuIwMG6uHxGXmDHkxQsm0jqiWMl8y43QJ1qJQ02DYyAFGH/liKmt\nj46fxRWxoCUVF6xaBf7zQv3h5YouM+tVe0X/bcZKGc+tFbngy8MtP3cuv5I1UZ+C\nGg9mttl8/SrLtpOtHSkKtJqU69sVVZazRn/GXApnhTdSMySCkmwdafEnK73izBt/\nSJiaoDIvVejvuIt5jFudABEBAAGJAh8EGAECAAkFAlJJNS0CGwwACgkQvY6x7l+K\ngYFX2xAAhiK/NeQdoZ44MqNxeXyo+xqBAotYGXZ5G8pNc07FtDcU/Ile4PKpmrVG\nzH0de0Gw1e2gTHmDJHMadPGjaYqDK6ZTXE4M58u7KAoQNQIXU4URHmTSBreB3qVp\nkXepM6lGZq5/DXOT2r+OzyCDI3isza2Xqzy6doC2/QGPMG3GMgc1aolToPznSTWX\nKIlOuEpvGvZICprlb4fOVAa6nGF5WFi+kyF4UpkxOniaVW6fAfezlBEiQKlJe2Rh\nSsDBbS2DmRw/6TEWzd2DVobfWfK+wWDLqm6L+zS3StkMCm3A6UKkoHZzWAAbKqta\nsbQPFFfJnKyWXi0kjiAHlycdMouSgk1JY72fCxHUMxYRLKHGvpX1o2MlqUkjn5Yv\nOVD9U8w4BUnv/iXd0Txdp1nkz/NLM174HCrQKSfubKNL1K53K0+iFNo4Ow2RJodR\n71SGZgfkBxjD4bkJhaLB9xUmBkz6PaQl7pRVBtS7INbEbiyR2QvMYwsn7XwY92iI\nWQ1yopiNGIub7pvrhs/qpzmftb/r9OaiGUoXB0FeQnDHo7x0vulX+0nU9crPcVCe\nh/qQe/KCbs6ZuUkKKG9Y4XreJ8S1s3iGsVefwHQ/mjRB1b857of+61K4pquQ4u9J\nsvBlAR7nTIPqbZDw1lf5V2UrsyXQ2xBpCp5WGlRZ+SGvB0zvlzU=\n=xJ8l\n-----END PGP PUBLIC KEY BLOCK-----\n"
  },
  {
    "path": "src/test/resources/samples/langs/Public Key/id.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQConqV+vS0WfY9swk8St+JcRuhft0jTg4IrAEfmxahSLurkbf54jbe8mrNn96Nm2gkRzs2RNVQ9r4dZzdhKTUk395Vs3LbX3cfdRNaCrs3udqhRZK7Go69DQECnEHFNczBxSrhT5DoO4nuzVimHgSsX7rHKHo6J7SDNowf83/nLUr7SAJvOeQo5yZQqqZQi5NXqH6pEOQtWPILdbZWuhq8s4JIXc38I+w3IXEJ0ttsfkyShv85bhwSFzrOlq2oGY37YVWeXPREXg9ksA6rlxe29SIdAQbINlgJ/ELzDVMYiaQkI5opAvI2EzPVd4325PcMgyFM/weO9F6bKZaGCNyt3 \n"
  },
  {
    "path": "src/test/resources/samples/langs/Public Key/id_dsa.asc",
    "content": "ssh-dss AAAAB3NzaC1kc3MAAACBAIXi8hv+I7/bYzbve0Wg/Gv9yeZX0H/qON6rwJTPFICTncfK2t/Kc2Ec7+GYSkEIj7ok5wzHgv51SFTM6dvK/8hrjFE8frNztRK2TwZCvgYkbcBoprUstE86ZHBA1pAVPfHAOcF708Yk+KsxDONxkzu7FWw4HWqycqPtaavdcgsZAAAAFQC0uvetk3WY9sFNU71a32JKjkmTnwAAAIBlm1eGuATcZJvlk2jerZnTO54MlO/htWQrI4pZGLdhukOPgF1lsTUSwmCN8k8xxkyRL5Yl/8GUcdUfC4gbZvsbZGtvq5gFZSVTfkKJrlwykpZcaijWXtDiWSpqszs0MfexLMdpZSkNsWp7TEoWcqNLN8X7ohlsLAhcdrAbGqFblAAAAIBgW12r208h9AA3rH3t+6HKLXuPO1BQPuE+fKQg1Aet40c1gxUkCF/J+xdAITE1v7kmssZxBvDqUPgpvYCm+ZfA0j712pvt4JmQcfPn9Go003kq6/cgI4tCOy1dgQDLr0E5Jd7YqIglkr25fkDtKRFBRue3FmCGOdaM4NAAdYU48Q== lars@junk\n"
  },
  {
    "path": "src/test/resources/samples/langs/Public Key/id_rsa.asc",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCw3QQtYgRViVH8ZpkQ2A7BuCeyPYC4hB9kKNhxwUfJ2hFgW8soGMBhsLN+vOeAJ2IXDMsezJO2/qhoZFQMvHoWpWTRTLPeNtBsKD+nhOZX28A4D+QRzVZ6hdWoh9W+mIP69MIT3aX35oLb86IycbNdRJlEK4FAUt7tjezNkU7boQ== root@use1-2.nitrousbox.com\n"
  },
  {
    "path": "src/test/resources/samples/langs/Public Key/id_rsa.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCw3QQtYgRViVH8ZpkQ2A7BuCeyPYC4hB9kKNhxwUfJ2hFgW8soGMBhsLN+vOeAJ2IXDMsezJO2/qhoZFQMvHoWpWTRTLPeNtBsKD+nhOZX28A4D+QRzVZ6hdWoh9W+mIP69MIT3aX35oLb86IycbNdRJlEK4FAUt7tjezNkU7boQ== root@use1-2.nitrousbox.com\n"
  },
  {
    "path": "src/test/resources/samples/langs/Public Key/sshkey1.asc",
    "content": "---- BEGIN SSH2 PUBLIC KEY ----\nSubject: galb\nComment: 1024-bit rsa, created by galb@shimi Mon Jan 15 08:31:24 2001\nAAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt459\n6k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6\nNUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=\n---- END SSH2 PUBLIC KEY ----\n"
  },
  {
    "path": "src/test/resources/samples/langs/Public Key/sunCert.asc",
    "content": "Type Bits/KeyID    Date       User ID\npub  1024/79949ADD 2005/08/07 sun <sun.strongswan.org>\n\n-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: 2.6.3i\n\nmQCNA0L2Km8AAAEEANRAVMn8HBxfYaGhLqtQ3IZJArn9wpcQ+7sH/F9PaXIjzHRQ\nrfFkfmxxp9lVjCk0LM/BnnlnUmyz6F8K7V0Gi40Am4+ln1zHvZZIQJYGrDhDnjb7\nI5TVeD4Ib5bQ1CoUbIhv2LocCeR6OjefQgGmerC5RQ3d5ci7uB0pVpd5lJrdAAUR\ntBhzdW4gPHN1bi5zdHJvbmdzd2FuLm9yZz6JAJUDBRBC9ipvHSlWl3mUmt0BAUZR\nA/43nuZbxADMSviu54Mj8pvQbYeGLQVabiWT6h7L0ZPX4MWpFH3dTixBfRrZRSsj\n0AgiMMuZAMebfOe+Xf9uDQv7p1yumEiNg43tg85zyawkARWNTZZ04woxtvAqNwXn\nlQotGz7YA6JMxry9RQo5yI4Y4dPnVZ/o8eDpP0+I88cOhQ==\n=lLvB\n-----END PGP PUBLIC KEY BLOCK-----\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pug/hello.jade",
    "content": "p.\n  Hello,\n  World!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Pug/hello.pug",
    "content": "doctype html\nhtml\n  head\n    meta(charset='utf-8')\n    link(rel='stylesheet', type='text/css', href='main.css')\n    title Hello Pug\n  body\n    #text\n      include page\n"
  },
  {
    "path": "src/test/resources/samples/langs/Puppet/apacheinit.pp",
    "content": "# Class: apache\n#\n# This class installs Apache\n#\n# Parameters:\n#\n# Actions:\n#   - Install Apache\n#   - Manage Apache service\n#\n# Requires:\n#\n# Sample Usage:\n#\nclass apache (\n  $apache_name            = $::apache::params::apache_name,\n  $service_name           = $::apache::params::service_name,\n  $default_mods           = true,\n  $default_vhost          = true,\n  $default_charset        = undef,\n  $default_confd_files    = true,\n  $default_ssl_vhost      = false,\n  $default_ssl_cert       = $::apache::params::default_ssl_cert,\n  $default_ssl_key        = $::apache::params::default_ssl_key,\n  $default_ssl_chain      = undef,\n  $default_ssl_ca         = undef,\n  $default_ssl_crl_path   = undef,\n  $default_ssl_crl        = undef,\n  $default_ssl_crl_check  = undef,\n  $default_type           = 'none',\n  $ip                     = undef,\n  $service_enable         = true,\n  $service_manage         = true,\n  $service_ensure         = 'running',\n  $purge_configs          = true,\n  $purge_vhost_dir        = undef,\n  $purge_vdir             = false,\n  $serveradmin            = 'root@localhost',\n  $sendfile               = 'On',\n  $error_documents        = false,\n  $timeout                = '120',\n  $httpd_dir              = $::apache::params::httpd_dir,\n  $server_root            = $::apache::params::server_root,\n  $conf_dir               = $::apache::params::conf_dir,\n  $confd_dir              = $::apache::params::confd_dir,\n  $vhost_dir              = $::apache::params::vhost_dir,\n  $vhost_enable_dir       = $::apache::params::vhost_enable_dir,\n  $mod_dir                = $::apache::params::mod_dir,\n  $mod_enable_dir         = $::apache::params::mod_enable_dir,\n  $mpm_module             = $::apache::params::mpm_module,\n  $lib_path               = $::apache::params::lib_path,\n  $conf_template          = $::apache::params::conf_template,\n  $servername             = $::apache::params::servername,\n  $manage_user            = true,\n  $manage_group           = true,\n  $user                   = $::apache::params::user,\n  $group                  = $::apache::params::group,\n  $keepalive              = $::apache::params::keepalive,\n  $keepalive_timeout      = $::apache::params::keepalive_timeout,\n  $max_keepalive_requests = $::apache::params::max_keepalive_requests,\n  $logroot                = $::apache::params::logroot,\n  $logroot_mode           = $::apache::params::logroot_mode,\n  $log_level              = $::apache::params::log_level,\n  $log_formats            = {},\n  $ports_file             = $::apache::params::ports_file,\n  $docroot                = $::apache::params::docroot,\n  $apache_version         = $::apache::version::default,\n  $server_tokens          = 'OS',\n  $server_signature       = 'On',\n  $trace_enable           = 'On',\n  $allow_encoded_slashes  = undef,\n  $package_ensure         = 'installed',\n  $use_optional_includes  = $::apache::params::use_optional_includes,\n) inherits ::apache::params {\n  validate_bool($default_vhost)\n  validate_bool($default_ssl_vhost)\n  validate_bool($default_confd_files)\n  # true/false is sufficient for both ensure and enable\n  validate_bool($service_enable)\n  validate_bool($service_manage)\n  validate_bool($use_optional_includes)\n\n  $valid_mpms_re = $apache_version ? {\n    '2.4'   => '(event|itk|peruser|prefork|worker)',\n    default => '(event|itk|prefork|worker)'\n  }\n\n  if $mpm_module {\n    validate_re($mpm_module, $valid_mpms_re)\n  }\n\n  if $allow_encoded_slashes {\n    validate_re($allow_encoded_slashes, '(^on$|^off$|^nodecode$)', \"${allow_encoded_slashes} is not permitted for allow_encoded_slashes. Allowed values are 'on', 'off' or 'nodecode'.\")\n  }\n\n  # NOTE: on FreeBSD it's mpm module's responsibility to install httpd package.\n  # NOTE: the same strategy may be introduced for other OSes. For this, you\n  # should delete the 'if' block below and modify all MPM modules' manifests\n  # such that they include apache::package class (currently event.pp, itk.pp,\n  # peruser.pp, prefork.pp, worker.pp).\n  if $::osfamily != 'FreeBSD' {\n    package { 'httpd':\n      ensure => $package_ensure,\n      name   => $apache_name,\n      notify => Class['Apache::Service'],\n    }\n  }\n  validate_re($sendfile, [ '^[oO]n$' , '^[oO]ff$' ])\n\n  # declare the web server user and group\n  # Note: requiring the package means the package ought to create them and not puppet\n  validate_bool($manage_user)\n  if $manage_user {\n    user { $user:\n      ensure  => present,\n      gid     => $group,\n      require => Package['httpd'],\n    }\n  }\n  validate_bool($manage_group)\n  if $manage_group {\n    group { $group:\n      ensure  => present,\n      require => Package['httpd']\n    }\n  }\n\n  validate_apache_log_level($log_level)\n\n  class { '::apache::service':\n    service_name   => $service_name,\n    service_enable => $service_enable,\n    service_manage => $service_manage,\n    service_ensure => $service_ensure,\n  }\n\n  # Deprecated backwards-compatibility\n  if $purge_vdir {\n    warning('Class[\\'apache\\'] parameter purge_vdir is deprecated in favor of purge_configs')\n    $purge_confd = $purge_vdir\n  } else {\n    $purge_confd = $purge_configs\n  }\n\n  # Set purge vhostd appropriately\n  if $purge_vhost_dir == undef {\n    $purge_vhostd = $purge_confd\n  } else {\n    $purge_vhostd = $purge_vhost_dir\n  }\n\n  Exec {\n    path => '/bin:/sbin:/usr/bin:/usr/sbin',\n  }\n\n  exec { \"mkdir ${confd_dir}\":\n    creates => $confd_dir,\n    require => Package['httpd'],\n  }\n  file { $confd_dir:\n    ensure  => directory,\n    recurse => true,\n    purge   => $purge_confd,\n    notify  => Class['Apache::Service'],\n    require => Package['httpd'],\n  }\n\n  if ! defined(File[$mod_dir]) {\n    exec { \"mkdir ${mod_dir}\":\n      creates => $mod_dir,\n      require => Package['httpd'],\n    }\n    # Don't purge available modules if an enable dir is used\n    $purge_mod_dir = $purge_configs and !$mod_enable_dir\n    file { $mod_dir:\n      ensure  => directory,\n      recurse => true,\n      purge   => $purge_mod_dir,\n      notify  => Class['Apache::Service'],\n      require => Package['httpd'],\n    }\n  }\n\n  if $mod_enable_dir and ! defined(File[$mod_enable_dir]) {\n    $mod_load_dir = $mod_enable_dir\n    exec { \"mkdir ${mod_enable_dir}\":\n      creates => $mod_enable_dir,\n      require => Package['httpd'],\n    }\n    file { $mod_enable_dir:\n      ensure  => directory,\n      recurse => true,\n      purge   => $purge_configs,\n      notify  => Class['Apache::Service'],\n      require => Package['httpd'],\n    }\n  } else {\n    $mod_load_dir = $mod_dir\n  }\n\n  if ! defined(File[$vhost_dir]) {\n    exec { \"mkdir ${vhost_dir}\":\n      creates => $vhost_dir,\n      require => Package['httpd'],\n    }\n    file { $vhost_dir:\n      ensure  => directory,\n      recurse => true,\n      purge   => $purge_vhostd,\n      notify  => Class['Apache::Service'],\n      require => Package['httpd'],\n    }\n  }\n\n  if $vhost_enable_dir and ! defined(File[$vhost_enable_dir]) {\n    $vhost_load_dir = $vhost_enable_dir\n    exec { \"mkdir ${vhost_load_dir}\":\n      creates => $vhost_load_dir,\n      require => Package['httpd'],\n    }\n    file { $vhost_enable_dir:\n      ensure  => directory,\n      recurse => true,\n      purge   => $purge_vhostd,\n      notify  => Class['Apache::Service'],\n      require => Package['httpd'],\n    }\n  } else {\n    $vhost_load_dir = $vhost_dir\n  }\n\n  concat { $ports_file:\n    owner   => 'root',\n    group   => $::apache::params::root_group,\n    mode    => '0644',\n    notify  => Class['Apache::Service'],\n    require => Package['httpd'],\n  }\n  concat::fragment { 'Apache ports header':\n    ensure  => present,\n    target  => $ports_file,\n    content => template('apache/ports_header.erb')\n  }\n\n  if $::apache::conf_dir and $::apache::params::conf_file {\n    case $::osfamily {\n      'debian': {\n        $pidfile              = \"\\${APACHE_PID_FILE}\"\n        $error_log            = 'error.log'\n        $scriptalias          = '/usr/lib/cgi-bin'\n        $access_log_file      = 'access.log'\n      }\n      'redhat': {\n        $pidfile              = 'run/httpd.pid'\n        $error_log            = 'error_log'\n        $scriptalias          = '/var/www/cgi-bin'\n        $access_log_file      = 'access_log'\n      }\n      'freebsd': {\n        $pidfile              = '/var/run/httpd.pid'\n        $error_log            = 'httpd-error.log'\n        $scriptalias          = '/usr/local/www/apache24/cgi-bin'\n        $access_log_file      = 'httpd-access.log'\n      } 'gentoo': {\n        $pidfile              = '/run/apache2.pid'\n        $error_log            = 'error.log'\n        $error_documents_path = '/usr/share/apache2/error'\n        $scriptalias          = '/var/www/localhost/cgi-bin'\n        $access_log_file      = 'access.log'\n\n        ::portage::makeconf { 'apache2_modules':\n          content => $default_mods,\n        }\n        file { [\n          '/etc/apache2/modules.d/.keep_www-servers_apache-2',\n          '/etc/apache2/vhosts.d/.keep_www-servers_apache-2'\n        ]:\n          ensure  => absent,\n          require => Package['httpd'],\n        }\n      }\n      default: {\n        fail(\"Unsupported osfamily ${::osfamily}\")\n      }\n    }\n\n    $apxs_workaround = $::osfamily ? {\n      'freebsd' => true,\n      default   => false\n    }\n\n    # Template uses:\n    # - $pidfile\n    # - $user\n    # - $group\n    # - $logroot\n    # - $error_log\n    # - $sendfile\n    # - $mod_dir\n    # - $ports_file\n    # - $confd_dir\n    # - $vhost_dir\n    # - $error_documents\n    # - $error_documents_path\n    # - $apxs_workaround\n    # - $keepalive\n    # - $keepalive_timeout\n    # - $max_keepalive_requests\n    # - $server_root\n    # - $server_tokens\n    # - $server_signature\n    # - $trace_enable\n    file { \"${::apache::conf_dir}/${::apache::params::conf_file}\":\n      ensure  => file,\n      content => template($conf_template),\n      notify  => Class['Apache::Service'],\n      require => Package['httpd'],\n    }\n\n    # preserve back-wards compatibility to the times when default_mods was\n    # only a boolean value. Now it can be an array (too)\n    if is_array($default_mods) {\n      class { '::apache::default_mods':\n        all  => false,\n        mods => $default_mods,\n      }\n    } else {\n      class { '::apache::default_mods':\n        all => $default_mods,\n      }\n    }\n    class { '::apache::default_confd_files':\n      all => $default_confd_files\n    }\n    if $mpm_module {\n      class { \"::apache::mod::${mpm_module}\": }\n    }\n\n    $default_vhost_ensure = $default_vhost ? {\n      true  => 'present',\n      false => 'absent'\n    }\n    $default_ssl_vhost_ensure = $default_ssl_vhost ? {\n      true  => 'present',\n      false => 'absent'\n    }\n\n    ::apache::vhost { 'default':\n      ensure          => $default_vhost_ensure,\n      port            => 80,\n      docroot         => $docroot,\n      scriptalias     => $scriptalias,\n      serveradmin     => $serveradmin,\n      access_log_file => $access_log_file,\n      priority        => '15',\n      ip              => $ip,\n      logroot_mode    => $logroot_mode,\n      manage_docroot  => $default_vhost,\n    }\n    $ssl_access_log_file = $::osfamily ? {\n      'freebsd' => $access_log_file,\n      default   => \"ssl_${access_log_file}\",\n    }\n    ::apache::vhost { 'default-ssl':\n      ensure          => $default_ssl_vhost_ensure,\n      port            => 443,\n      ssl             => true,\n      docroot         => $docroot,\n      scriptalias     => $scriptalias,\n      serveradmin     => $serveradmin,\n      access_log_file => $ssl_access_log_file,\n      priority        => '15',\n      ip              => $ip,\n      logroot_mode    => $logroot_mode,\n      manage_docroot  => $default_ssl_vhost,\n    }\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Puppet/expiringhost.pp",
    "content": "define example::expiringhost($ip, $timestamp) {\n\n  # Calculate the age of this resource by comparing 'now' against $timestamp\n  $age = inline_template(\"<%= require 'time'; Time.now - Time.parse(timestamp) %>\")\n\n  # Max age, in seconds.\n  $maxage = 60\n\n  if $age > $maxage {\n    $expired = true\n    notice(\"Expiring resource $class[$name] due to age > $maxage (actual: $age)\")\n  } else {\n    $expired = false\n    notice(\"Found recently-active $class[$name] (age: $age)\")\n  }\n\n  # I set target to a /tmp path so you can run this example as non-root.\n  # In production, you probabyl won't set target as it defaults to /etc/hosts\n  # (or wherever puppet thinks your platform wants it)\n  host {\n    $name:\n      ip => $ip,\n      target => \"/tmp/expiring-hosts-example-output\",\n      ensure => $expired ? { true => absent, false => present };\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Puppet/hiera_include.pp",
    "content": "hiera_include('classes')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Puppet/stages-example.pp",
    "content": "class foo {\n  notify {\n    \"foo\": ;\n  }\n}\n\nclass bar {\n  notify {\n    \"bar\": ;\n  }\n}\n\n\nnode default {\n  stage {\n    \"one\": ;\n    \"two\": ;\n  }\n\n  class {\n    \"foo\": stage => \"one\";\n    \"bar\": stage => \"two\";\n  }\n\n  Stage[\"one\"] -> Stage[\"two\"]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Puppet/unmanaged-notify-puppet25.pp",
    "content": "# Manually manage /tmp/original\n# Each puppet run will copy it to /tmp/flag if there's a change and notify\n# the exec when it changes.\n# \n# The idea here is you might need (in some case) to manually manage a file outside\n# of puppet (in this case, \"/tmp/original\"). Using this example, you can make puppet\n# signal other parts of your catalog based on changes to that file.\n\nfile {\n  # This will, when different, copy /tmp/original to /tmp/flag and notify our\n  # exec.\n  \"/tmp/flag\":\n    source => \"file:///tmp/original\",\n    notify => Exec[\"hello world\"];\n}\n\nexec {\n  \"hello world\":\n    command => \"/bin/echo hello world\",\n    refreshonly => true;\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/PureBasic/Example_Sine.pb",
    "content": "EnableExplicit\n\n; ##################################################### Includes ####################################################\n\nXIncludeFile \"Includes/AudioOut.pbi\"\n\n; ##################################################### Prototypes ##################################################\n\n; ##################################################### Structures ##################################################\n\n; ##################################################### Constants ###################################################\n\n#Samplerate = 44100\n\n; ##################################################### Structures ##################################################\n\nStructure Main\n  *AudioOut\n  \n  Quit.i\nEndStructure\nGlobal Main.Main\n\nStructure Main_Window\n  ID.i\n  \n  TrackBar.i [10]\nEndStructure\nGlobal Main_Window.Main_Window\n\n; ##################################################### Variables ###################################################\n\nGlobal Frequency.d = 1000\nGlobal Amplitude.d = 0.25\n\n; ##################################################### Procedures ##################################################\n\nProcedure Main_Window_Open()\n  Main_Window\\ID = OpenWindow(#PB_Any, 0, 0, 800, 100, \"AudioOut Example\", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)\n  \n  If Main_Window\\ID\n    \n    Main_Window\\TrackBar[0] = TrackBarGadget(#PB_Any, 10, 10, 780, 30, 0, 20000)\n    SetGadgetState(Main_Window\\TrackBar[0], Frequency)\n    \n    Main_Window\\TrackBar[1] = TrackBarGadget(#PB_Any, 10, 40, 780, 30, 0, 1000)\n    SetGadgetState(Main_Window\\TrackBar[1], Amplitude*1000)\n    \n  EndIf\nEndProcedure\n\nProcedure Notifier_CallBack(*AudioOut)\n  Protected *Temp, Temp_Size.i\n  Static Rotation.d\n  \n  While AudioOut::GetQueuedBlocks(*AudioOut) <= 3\n    \n    Temp_Size = AudioOut::GetBufferBlocksize(*AudioOut)\n    If Temp_Size > 0\n      *Temp = AllocateMemory(Temp_Size)\n      \n      Define Left.d, Right.d, i\n      For i = 0 To Temp_Size / 4 - 1\n        Left = Sin(Rotation) * Amplitude\n        Right = Sin(Rotation) * Amplitude\n        \n        PokeW(*Temp + i*4    , Left*32767)\n        PokeW(*Temp + i*4 + 2, Right*32767)\n        \n        Rotation + 2.0*#PI / #Samplerate * Frequency\n      Next\n      \n      AudioOut::Write_Data(Main\\AudioOut, *Temp, Temp_Size)\n      \n      FreeMemory(*Temp)\n    EndIf\n    \n  Wend\nEndProcedure\n\n; ##################################################### Initialisation ##############################################\n\nMain_Window_Open()\n\nAudioOut::GetDevices()\n\nForEach AudioOut::Device()\n  Debug PeekS(AudioOut::@Device()\\szPname)\nNext\n\nMain\\AudioOut = AudioOut::Initialize(#WAVE_MAPPER, #Samplerate, 2, 16, @Notifier_CallBack())\n\nIf Not Main\\AudioOut\n  Debug AudioOut::GetError()\n  End\nEndIf\n\nNotifier_CallBack(Main\\AudioOut)\n\n; ##################################################### Main ########################################################\n\nRepeat\n  \n  Repeat\n    Select WaitWindowEvent(100)\n      Case #PB_Event_Gadget\n        Select EventGadget()\n          Case Main_Window\\TrackBar[0]\n            Frequency = GetGadgetState(Main_Window\\TrackBar[0])\n            Debug Frequency\n            \n          Case Main_Window\\TrackBar[1]\n            Amplitude = GetGadgetState(Main_Window\\TrackBar[1]) / 1000\n            \n        EndSelect\n        \n      Case #PB_Event_CloseWindow\n        Main\\Quit = #True\n        \n      Case 0\n        Break\n    EndSelect\n  ForEver\n  \nUntil Main\\Quit\n\n; ##################################################### End #########################################################\n\nAudioOut::Deinitialize(Main\\AudioOut)\n\n; IDE Options = PureBasic 5.30 Beta 2 (Windows - x64)\n; CursorPosition = 109\n; FirstLine = 79\n; Folding = -\n; EnableUnicode\n; EnableThread\n; EnableXP\n"
  },
  {
    "path": "src/test/resources/samples/langs/PureBasic/Memory.pbi",
    "content": "\nStructure Memory_Operation\n  Src_Offset.q\n  Src_Size.q\n  \n  Dst_Offset.q\n  Dst_Size.q\n  \n  Copy_Size.q\nEndStructure\n\n; #### Cuts the Offset's / Sizes of the memory operation to prevent memory violations\nProcedure Memory_Operation_Check(*Memory_Operation.Memory_Operation)\n  Protected Temp.q\n  \n  If *Memory_Operation\\Src_Offset < 0\n    *Memory_Operation\\Copy_Size  + *Memory_Operation\\Src_Offset\n    *Memory_Operation\\Dst_Offset - *Memory_Operation\\Src_Offset\n    *Memory_Operation\\Src_Offset - *Memory_Operation\\Src_Offset\n  EndIf\n  \n  If *Memory_Operation\\Dst_Offset < 0\n    *Memory_Operation\\Copy_Size  + *Memory_Operation\\Dst_Offset\n    *Memory_Operation\\Src_Offset - *Memory_Operation\\Dst_Offset\n    *Memory_Operation\\Dst_Offset - *Memory_Operation\\Dst_Offset\n  EndIf\n  \n  Temp = *Memory_Operation\\Src_Size - *Memory_Operation\\Src_Offset\n  If *Memory_Operation\\Copy_Size > Temp\n    *Memory_Operation\\Copy_Size = Temp\n  EndIf\n  \n  Temp = *Memory_Operation\\Dst_Size - *Memory_Operation\\Dst_Offset\n  If *Memory_Operation\\Copy_Size > Temp\n    *Memory_Operation\\Copy_Size = Temp\n  EndIf\n  \n  If *Memory_Operation\\Copy_Size < 0\n    *Memory_Operation\\Copy_Size = 0\n  EndIf\n  \n  ProcedureReturn #True\nEndProcedure\n\n; #### Fills a *Destination with a specified amount of data.\n; #### It cuts everything, to prevent memory violations\nProcedure Memory_Range_Fill(Ascii.a, Fill_Size.q, *Dst, Dst_Offset.q, Dst_Size.q=-1)\n  Protected Temp.q\n  \n  If Not *Dst\n    ProcedureReturn #False\n  EndIf\n  \n  If Dst_Size = -1\n    Dst_Size.q = MemorySize(*Dst)\n  EndIf\n  \n  If Dst_Offset < 0\n    Fill_Size  + Dst_Offset\n    Dst_Offset - Dst_Offset\n  EndIf\n  \n  Temp = Dst_Size - Dst_Offset\n  If Fill_Size > Temp\n    Fill_Size = Temp\n  EndIf\n  \n  If Fill_Size > 0\n    FillMemory(*Dst+Dst_Offset, Fill_Size, Ascii)\n  EndIf\n  \n  ProcedureReturn #True\nEndProcedure\n\n; #### Copies a specified amount of data (Copy_Size) from the source to the destination.\n; #### It cuts everything, to prevent memory violations\nProcedure Memory_Range_Copy(*Src, Src_Offset.q, *Dst, Dst_Offset.q, Copy_Size.q, Src_Size.q=-1, Dst_Size.q=-1)\n  Protected Temp.q\n  If Not *Src\n    ProcedureReturn #False\n  EndIf\n  \n  If Not *Dst\n    ProcedureReturn #False\n  EndIf\n  \n  If Src_Size = -1\n    Src_Size.q = MemorySize(*Src)\n  EndIf\n  If Dst_Size = -1\n    Dst_Size.q = MemorySize(*Dst)\n  EndIf\n  \n  If Src_Offset < 0\n    Copy_Size  + Src_Offset\n    Dst_Offset - Src_Offset\n    Src_Offset - Src_Offset\n  EndIf\n  \n  If Dst_Offset < 0\n    Copy_Size  + Dst_Offset\n    Src_Offset - Dst_Offset\n    Dst_Offset - Dst_Offset\n  EndIf\n  \n  Temp = Src_Size - Src_Offset\n  If Copy_Size > Temp\n    Copy_Size = Temp\n  EndIf\n  \n  Temp = Dst_Size - Dst_Offset\n  If Copy_Size > Temp\n    Copy_Size = Temp\n  EndIf\n  \n  If Copy_Size > 0\n    CopyMemory(*Src+Src_Offset, *Dst+Dst_Offset, Copy_Size)\n  EndIf\n  \n  ProcedureReturn #True\nEndProcedure\n\n; #### Copies (MoveMemory) a specified amount of data (Copy_Size) from the source to the destination.\n; #### It cuts everything, to prevent memory violations\nProcedure Memory_Range_Move(*Src, Src_Offset.q, *Dst, Dst_Offset.q, Copy_Size.q, Src_Size.q=-1, Dst_Size.q=-1)\n  Protected Temp.q\n  If Not *Src\n    ProcedureReturn #False\n  EndIf\n  \n  If Not *Dst\n    ProcedureReturn #False\n  EndIf\n  \n  If Src_Size = -1\n    Src_Size.q = MemorySize(*Src)\n  EndIf\n  If Dst_Size = -1\n    Dst_Size.q = MemorySize(*Dst)\n  EndIf\n  \n  If Src_Offset < 0\n    Copy_Size  + Src_Offset\n    Dst_Offset - Src_Offset\n    Src_Offset - Src_Offset\n  EndIf\n  \n  If Dst_Offset < 0\n    Copy_Size  + Dst_Offset\n    Src_Offset - Dst_Offset\n    Dst_Offset - Dst_Offset\n  EndIf\n  \n  Temp = Src_Size - Src_Offset\n  If Copy_Size > Temp\n    Copy_Size = Temp\n  EndIf\n  \n  Temp = Dst_Size - Dst_Offset\n  If Copy_Size > Temp\n    Copy_Size = Temp\n  EndIf\n  \n  If Copy_Size > 0\n    MoveMemory(*Src+Src_Offset, *Dst+Dst_Offset, Copy_Size)\n  EndIf\n  \n  ProcedureReturn #True\nEndProcedure\n\n; #### Mirrors the memory, usable for little/big endian switching\nProcedure Memory_Mirror(*Memory, Memory_Size)\n  Protected Elements, i\n  Protected Temp.a, *A.Ascii, *B.Ascii\n  \n  If Not *Memory\n    ProcedureReturn #False\n  EndIf\n  \n  If Memory_Size < 1\n    ProcedureReturn #True\n  EndIf\n  \n  Elements = Memory_Size/2\n  *A = *Memory\n  *B = *Memory + Memory_Size - 1\n  \n  For i = 0 To Elements - 1\n    Temp = *A\\a\n    *A\\a = *B\\a\n    *B\\a = Temp\n    *A + 1\n    *B - 1\n  Next\n  \n  ProcedureReturn #True\nEndProcedure\n; IDE Options = PureBasic 5.31 (Windows - x64)\n; CursorPosition = 190\n; FirstLine = 177\n; Folding = -\n; EnableXP\n; DisableDebugger\n"
  },
  {
    "path": "src/test/resources/samples/langs/PureScript/Control.Arrow.purs",
    "content": "module Control.Arrow where\n\nimport Data.Tuple\n\nclass Arrow a where\n  arr :: forall b c. (b -> c) -> a b c\n  first :: forall b c d. a b c -> a (Tuple b d) (Tuple c d)\n\ninstance arrowFunction :: Arrow (->) where\n  arr f = f\n  first f (Tuple b d) = Tuple (f b) d\n\nsecond :: forall a b c d. (Category a, Arrow a) => a b c -> a (Tuple d b) (Tuple d c)\nsecond f = arr swap >>> first f >>> arr swap\n\nswap :: forall a b. Tuple a b -> Tuple b a\nswap (Tuple x y) = Tuple y x\n\ninfixr 3 ***\ninfixr 3 &&&\n\n(***) :: forall a b b' c c'. (Category a, Arrow a) => a b c -> a b' c' -> a (Tuple b b') (Tuple c c')\n(***) f g = first f >>> second g\n\n(&&&) :: forall a b b' c c'. (Category a, Arrow a) => a b c -> a b c' -> a b (Tuple c c')\n(&&&) f g = arr (\\b -> Tuple b b) >>> (f *** g)\n\nclass ArrowZero a where\n  zeroArrow :: forall b c. a b c\n\ninfixr 5 <+>\n\nclass ArrowPlus a where\n  (<+>) :: forall b c. a b c -> a b c -> a b c\n"
  },
  {
    "path": "src/test/resources/samples/langs/PureScript/Data.Foreign.purs",
    "content": "module Data.Foreign\n  ( Foreign(..)\n  , ForeignParser(ForeignParser)\n  , parseForeign\n  , parseJSON\n  , ReadForeign\n  , read\n  , prop\n  ) where\n\nimport Prelude\nimport Data.Array\nimport Data.Either\nimport Data.Maybe\nimport Data.Tuple\nimport Data.Traversable\n\nforeign import data Foreign :: *\n\nforeign import fromString\n  \"function fromString (str) { \\\n  \\  try { \\\n  \\    return _ps.Data_Either.Right(JSON.parse(str)); \\\n  \\  } catch (e) { \\\n  \\    return _ps.Data_Either.Left(e.toString()); \\\n  \\  } \\\n  \\}\" :: String -> Either String Foreign\n\nforeign import readPrimType\n  \"function readPrimType (typeName) { \\\n  \\  return function (value) { \\\n  \\    if (toString.call(value) == '[object ' + typeName + ']') { \\\n  \\      return _ps.Data_Either.Right(value);\\\n  \\    } \\\n  \\    return _ps.Data_Either.Left('Value is not a ' + typeName + ''); \\\n  \\  }; \\\n  \\}\" :: forall a. String -> Foreign -> Either String a\n\nforeign import readMaybeImpl\n  \"function readMaybeImpl (value) { \\\n  \\  return value === undefined || value === null ? _ps.Data_Maybe.Nothing : _ps.Data_Maybe.Just(value); \\\n  \\}\" :: forall a. Foreign -> Maybe Foreign\n\nforeign import readPropImpl\n  \"function readPropImpl (k) { \\\n  \\  return function (obj) { \\\n  \\    return _ps.Data_Either.Right(obj[k]);\\\n  \\  }; \\\n  \\}\" :: forall a. String -> Foreign -> Either String Foreign\n\nforeign import showForeignImpl\n  \"var showForeignImpl = JSON.stringify;\" :: Foreign -> String\n\ninstance showForeign :: Prelude.Show Foreign where\n  show = showForeignImpl\n\ndata ForeignParser a = ForeignParser (Foreign -> Either String a)\n\nparseForeign :: forall a. ForeignParser a -> Foreign -> Either String a\nparseForeign (ForeignParser p) x = p x\n\nparseJSON :: forall a. (ReadForeign a) => String -> Either String a\nparseJSON json = fromString json >>= parseForeign read\n\ninstance monadForeignParser :: Prelude.Monad ForeignParser where\n  return x = ForeignParser \\_ -> Right x\n  (>>=) (ForeignParser p) f = ForeignParser \\x -> case p x of\n      Left err -> Left err\n      Right x' -> parseForeign (f x') x\n\ninstance applicativeForeignParser :: Prelude.Applicative ForeignParser where\n  pure x = ForeignParser \\_ -> Right x\n  (<*>) (ForeignParser f) (ForeignParser p) = ForeignParser \\x -> case f x of\n      Left err -> Left err\n      Right f' -> f' <$> p x\n\ninstance functorForeignParser :: Prelude.Functor ForeignParser where\n  (<$>) f (ForeignParser p) = ForeignParser \\x -> f <$> p x\n\nclass ReadForeign a where\n  read :: ForeignParser a\n\ninstance readString :: ReadForeign String where\n  read = ForeignParser $ readPrimType \"String\"\n\ninstance readNumber :: ReadForeign Number where\n  read = ForeignParser $ readPrimType \"Number\"\n\ninstance readBoolean :: ReadForeign Boolean where\n  read = ForeignParser $ readPrimType \"Boolean\"\n\ninstance readArray :: (ReadForeign a) => ReadForeign [a] where\n  read =\n    let arrayItem (Tuple i x) = case parseForeign read x of\n      Right result -> Right result\n      Left err -> Left $ \"Error reading item at index \" ++ (show i) ++ \":\\n\" ++ err\n    in\n    (ForeignParser $ readPrimType \"Array\") >>= \\xs -> \n      ForeignParser \\_ -> arrayItem `traverse` (zip (range 0 (length xs)) xs)\n\ninstance readMaybe :: (ReadForeign a) => ReadForeign (Maybe a) where\n  read = (ForeignParser $ Right <<< readMaybeImpl) >>= \\x -> \n    ForeignParser \\_ -> case x of\n      Just x' -> parseForeign read x' >>= return <<< Just\n      Nothing -> return Nothing\n\nprop :: forall a. (ReadForeign a) => String -> ForeignParser a\nprop p = (ForeignParser \\x -> readPropImpl p x) >>= \\x -> \n  ForeignParser \\_ -> case parseForeign read x of\n    Right result -> Right result\n    Left err -> Left $ \"Error reading property '\" ++ p ++ \"':\\n\" ++ err\n"
  },
  {
    "path": "src/test/resources/samples/langs/PureScript/Data.Map.purs",
    "content": "module Data.Map\n  ( Map(),\n    empty,\n    singleton,\n    insert,\n    lookup,\n    delete,\n    alter,\n    toList,\n    fromList,\n    union,\n    map\n  ) where\n\nimport qualified Prelude as P\n\nimport Data.Array (concat)\nimport Data.Foldable (foldl)\nimport Data.Maybe\nimport Data.Tuple\n\ndata Map k v = Leaf | Branch { key :: k, value :: v, left :: Map k v, right :: Map k v }\n\ninstance eqMap :: (P.Eq k, P.Eq v) => P.Eq (Map k v) where\n  (==) m1 m2 = toList m1 P.== toList m2\n  (/=) m1 m2 = P.not (m1 P.== m2)\n\ninstance showMap :: (P.Show k, P.Show v) => P.Show (Map k v) where\n  show m = \"fromList \" P.++ P.show (toList m)\n\nempty :: forall k v. Map k v\nempty = Leaf\n\nsingleton :: forall k v. k -> v -> Map k v\nsingleton k v = Branch { key: k, value: v, left: empty, right: empty }\n\ninsert :: forall k v. (P.Eq k, P.Ord k) => k -> v -> Map k v -> Map k v\ninsert k v Leaf = singleton k v\ninsert k v (Branch b@{ key = k1 }) | k P.== k1 = Branch (b { key = k, value = v })\ninsert k v (Branch b@{ key = k1 }) | k P.< k1 = Branch (b { left = insert k v b.left })\ninsert k v (Branch b) = Branch (b { right = insert k v b.right })\n\nlookup :: forall k v. (P.Eq k, P.Ord k) => k -> Map k v -> Maybe v\nlookup k Leaf = Nothing\nlookup k (Branch { key = k1, value = v }) | k P.== k1 = Just v\nlookup k (Branch { key = k1, left = left }) | k P.< k1 = lookup k left\nlookup k (Branch { right = right }) = lookup k right\n\nfindMinKey :: forall k v. (P.Ord k) => Map k v -> Tuple k v\nfindMinKey (Branch { key = k, value = v, left = Leaf }) = Tuple k v\nfindMinKey (Branch b) = findMinKey b.left\n\ndelete :: forall k v. (P.Eq k, P.Ord k) => k -> Map k v -> Map k v\ndelete k Leaf = Leaf\ndelete k (Branch b@{ key = k1, left = Leaf }) | k P.== k1 =\n  case b of\n    { left = Leaf } -> b.right\n    { right = Leaf } -> b.left\n    _ -> glue b.left b.right\ndelete k (Branch b@{ key = k1 }) | k P.< k1 = Branch (b { left = delete k b.left })\ndelete k (Branch b) = Branch (b { right = delete k b.right })\n\nalter :: forall k v. (P.Eq k, P.Ord k) => (Maybe v -> Maybe v) -> k -> Map k v -> Map k v\nalter f k Leaf = case f Nothing of\n  Nothing -> Leaf\n  Just v -> singleton k v\nalter f k (Branch b@{ key = k1, value = v }) | k P.== k1 = case f (Just v) of\n  Nothing -> glue b.left b.right\n  Just v' -> Branch (b { value = v' })\nalter f k (Branch b@{ key = k1 }) | k P.< k1 = Branch (b { left = alter f k b.left })\nalter f k (Branch b) = Branch (b { right = alter f k b.right })\n\nglue :: forall k v. (P.Eq k, P.Ord k) => Map k v -> Map k v -> Map k v\nglue left right = \n  let Tuple minKey root = findMinKey right in\n  Branch { key: minKey, value: root, left: left, right: delete minKey right }\n\ntoList :: forall k v. Map k v -> [Tuple k v]\ntoList Leaf = []\ntoList (Branch b) = toList b.left `concat` [Tuple b.key b.value] `concat` toList b.right\n\nfromList :: forall k v. (P.Eq k, P.Ord k) => [Tuple k v] -> Map k v\nfromList = foldl (\\m (Tuple k v) -> insert k v m) empty\n\nunion :: forall k v. (P.Eq k, P.Ord k) => Map k v -> Map k v -> Map k v\nunion m1 m2 = foldl (\\m (Tuple k v) -> insert k v m) m2 (toList m1)\n\nmap :: forall k v1 v2. (P.Eq k, P.Ord k) => (v1 -> v2) -> Map k v1 -> Map k v2\nmap _ Leaf = Leaf\nmap f (Branch b) = Branch (b { value = f b.value, left = map f b.left, right = map f b.right })\n"
  },
  {
    "path": "src/test/resources/samples/langs/PureScript/ReactiveJQueryTest.purs",
    "content": "module ReactiveJQueryTest where\n\nimport Prelude ((+), (++), (<$>), (<*>), ($), (<<<), flip, return, show)\nimport Control.Monad\nimport Control.Monad.Eff\nimport Control.Monad.JQuery\nimport Control.Reactive\nimport Control.Reactive.JQuery\nimport Data.Array (map, head, length)\nimport Data.Foldable\nimport Data.Foreign\nimport Data.Maybe\nimport Data.Monoid\nimport Data.Traversable\nimport Debug.Trace\nimport Global (parseInt)\n\nmain = do\n  personDemo\n  todoListDemo\n\ngreet firstName lastName = \"Hello, \" ++ firstName ++ \" \" ++ lastName ++ \"!\"\n\npersonDemo = do\n  -- Create new reactive variables to hold the user's names\n  firstName <- newRVar \"John\"\n  lastName <- newRVar \"Smith\"\n\n  -- Get the document body\n  b <- body\n\n  -- Create a text box for the first name\n  firstNameDiv <- create \"<div>\"\n  firstNameInput <- create \"<input>\"\n  \"First Name: \" `appendText` firstNameDiv\n  firstNameInput `append` firstNameDiv\n  firstNameDiv `append` b\n\n  -- Create a text box for the last name\n  lastNameDiv <- create \"<div>\"\n  lastNameInput <- create \"<input>\"\n  \"Last Name: \" `appendText` lastNameDiv\n  lastNameInput `append` lastNameDiv\n  lastNameDiv `append` b\n\n  -- Bind the text box values to the name variables\n  bindValueTwoWay firstName firstNameInput\n  bindValueTwoWay lastName lastNameInput\n\n  -- Create a paragraph to display a greeting\n  greeting <- create \"<p>\"\n  { color: \"red\" } `css` greeting\n  greeting `append` b\n\n  -- Bind the text property of the greeting paragraph to a computed property\n  let greetingC = greet <$> toComputed firstName <*> toComputed lastName\n  bindTextOneWay greetingC greeting\n\ntodoListDemo = do\n  -- Get the document body\n  b <- body\n\n  -- Create an array\n  arr <- newRArray\n\n  text1 <- newRVar \"Learn PureScript\"\n  comp1 <- newRVar false\n  insertRArray arr { text: text1, completed: comp1 } 0\n  \n  ul <- create \"<ul>\"\n\n  -- Bind the ul to the array\n  bindArray arr ul $ \\entry indexR -> do\n    li <- create \"<li>\"\n\n    completedInput <- create \"<input>\"\n    setAttr \"type\" \"checkbox\" completedInput\n    completedInput `append` li\n    sub1 <- bindCheckedTwoWay entry.completed completedInput\n    \n    textInput <- create \"<input>\"\n    textInput `append` li\n    sub2 <- bindValueTwoWay entry.text textInput\n\n    btn <- create \"<button>\"\n    \"Remove\" `appendText` btn\n    flip (on \"click\") btn $ do\n      index <- readRVar indexR\n      removeRArray arr index\n    btn `append` li\n\n    return { el: li, subscription: sub1 <> sub2 }\n\n  ul `append` b\n\n  -- Add button\n  newEntryDiv <- create \"<div>\"\n  btn <- create \"<button>\"\n  \"Add\" `appendText` btn\n  btn `append` newEntryDiv\n  newEntryDiv `append` b\n\n  flip (on \"click\") btn $ do\n    text <- newRVar \"\"\n    completed <- newRVar false\n    arr' <- readRArray arr\n    insertRArray arr { text: text, completed: completed } (length arr')\n\n  -- Create a paragraph to display the next task\n  nextTaskLabel <- create \"<p>\"\n  nextTaskLabel `append` b\n\n  let nextTask = do\n    task <- head <$> toComputedArray arr\n    case task of\n      Nothing -> return \"Done!\"\n      Just { text = text } -> (++) \"Next task: \" <$> toComputed text\n  bindTextOneWay nextTask nextTaskLabel\n\n  -- Create a paragraph to display the task counter\n  counterLabel <- create \"<p>\"\n  counterLabel `append` b\n\n  let counter = (flip (++) \" tasks remaining\") <<< show <$> do\n    rs <- toComputedArray arr\n    cs <- map (\\c -> if c then 0 else 1) <$> traverse (\\entry -> toComputed entry.completed) rs\n    return $ foldl (+) 0 cs\n  bindTextOneWay counter counterLabel\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/AdditiveWave.pyde",
    "content": "\"\"\"\nAdditive Wave\nby Daniel Shiffman. \n\nCreate a more complex wave by adding two waves together. \n\"\"\"\n\nxspacing = 8    # How far apart should each horizontal location be spaced\nmaxwaves = 4    # total # of waves to add together\ntheta = 0.0\n\namplitude = []  # Height of wave\n# Value for incrementing X, to be calculated as a function of period and\n# xspacing\ndx = []\nyvalues = []\n\n\ndef setup():\n    size(640, 360)\n    frameRate(30)\n    colorMode(RGB, 255, 255, 255, 100)\n    w = width + 16\n    for i in range(maxwaves):\n        amplitude.append(random(10, 30))\n        period = random(100, 300)  # How many pixels before the wave repeats\n        dx.append((TWO_PI / period) * xspacing)\n    for _ in range(w / xspacing + 1):\n        yvalues.append(0.0)\n\n\ndef draw():\n    background(0)\n    calcWave()\n    renderWave()\n\n\ndef calcWave():\n    # Increment theta (try different values for 'angular velocity' here\n    theta += 0.02\n    # Set all height values to zero\n    for i in range(len(yvalues)):\n        yvalues[i] = 0\n    # Accumulate wave height values\n    for j in range(maxwaves):\n        x = theta\n        for i in range(len(yvalues)):\n            # Every other wave is cosine instead of sine\n            if j % 2 == 0:\n                yvalues[i] += sin(x) * amplitude[j]\n            else:\n                yvalues[i] += cos(x) * amplitude[j]\n            x += dx[j]\n\n\ndef renderWave():\n    # A simple way to draw the wave with an ellipse at each location\n    noStroke()\n    fill(255, 50)\n    ellipseMode(CENTER)\n    for x, v in enumerate(yvalues):\n        ellipse(x * xspacing, height / 2 + v, 16, 16)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/Cinema4DPythonPlugin.pyp",
    "content": "#\n# Cinema 4D Python Plugin Source file\n# https://github.com/nr-plugins/nr-xpresso-alignment-tools\n#\n\n# coding: utf-8\n#\n# Copyright (C) 2012, Niklas Rosenstein\n# Licensed under the GNU General Public License\n#\n# XPAT - XPresso Alignment Tools\n# ==============================\n#\n# The XPAT plugin provides tools for aligning nodes in the Cinema 4D\n# XPresso Editor, improving readability of complex XPresso set-ups\n# immensively.\n#\n# Requirements:\n# - MAXON Cinema 4D R13+\n# - Python `c4dtools` library. Get it from\n#   http://github.com/NiklasRosenstein/c4dtools\n#\n# Author:  Niklas Rosenstein <rosensteinniklas@gmail.com>\n# Version: 1.1 (01/06/2012)\n\nimport os\nimport sys\nimport json\nimport c4d\nimport c4dtools\nimport itertools\n\nfrom c4d.modules import graphview as gv\nfrom c4dtools.misc import graphnode\n\nres, importer = c4dtools.prepare(__file__, __res__)\nsettings = c4dtools.helpers.Attributor({\n    'options_filename': res.file('config.json'),\n})\n\ndef align_nodes(nodes, mode, spacing):\n    r\"\"\"\n    Aligns the passed nodes horizontally and apply the minimum spacing\n    between them.\n    \"\"\"\n\n    modes = ['horizontal', 'vertical']\n    if not nodes:\n        return\n    if mode not in modes:\n        raise ValueError('invalid mode, choices are: ' + ', '.join(modes))\n\n    get_0 = lambda x: x.x\n    get_1 = lambda x: x.y\n    set_0 = lambda x, v: setattr(x, 'x', v)\n    set_1 = lambda x, v: setattr(x, 'y', v)\n\n    if mode == 'vertical':\n        get_0, get_1 = get_1, get_0\n        set_0, set_1 = set_1, set_0\n\n    nodes = [graphnode.GraphNode(n) for n in nodes]\n    nodes.sort(key=lambda n: get_0(n.position))\n    midpoint = graphnode.find_nodes_mid(nodes)\n\n    # Apply the spacing between the nodes relative to the coordinate-systems\n    # origin. We can offset them later because we now the nodes' midpoint\n    # already.\n    first_position = nodes[0].position\n    new_positions = []\n    prev_offset = 0\n    for node in nodes:\n        # Compute the relative position of the node.\n        position = node.position\n        set_0(position, get_0(position) - get_0(first_position))\n\n        # Obtain it's size and check if the node needs to be re-placed.\n        size = node.size\n        if get_0(position) < prev_offset:\n            set_0(position, prev_offset)\n            prev_offset += spacing + get_0(size)\n        else:\n            prev_offset = get_0(position) + get_0(size) + spacing\n\n        set_1(position, get_1(midpoint))\n        new_positions.append(position)\n\n    # Center the nodes again.\n    bbox_size = prev_offset - spacing\n    bbox_size_2 = bbox_size * 0.5\n    for node, position in itertools.izip(nodes, new_positions):\n        # TODO: Here is some issue with offsetting the nodes. Some value\n        # dependent on the spacing must be added here to not make the nodes\n        # move horizontally/vertically although they have already been\n        # aligned.\n        set_0(position, get_0(midpoint) + get_0(position) - bbox_size_2 + spacing)\n        node.position = position\n\ndef align_nodes_shortcut(mode, spacing):\n    master = gv.GetMaster(0)\n    if not master:\n        return\n\n    root = master.GetRoot()\n    if not root:\n        return\n\n    nodes = graphnode.find_selected_nodes(root)\n    if nodes:\n        master.AddUndo()\n        align_nodes(nodes, mode, spacing)\n        c4d.EventAdd()\n\n    return True\n\nclass XPAT_Options(c4dtools.helpers.Attributor):\n    r\"\"\"\n    This class organizes the options for the XPAT plugin, i.e.\n    validating, loading and saving.\n    \"\"\"\n\n    defaults = {\n        'hspace': 50,\n        'vspace': 20,\n    }\n\n    def __init__(self, filename=None):\n        super(XPAT_Options, self).__init__()\n        self.load(filename)\n\n    def load(self, filename=None):\n        r\"\"\"\n        Load the options from file pointed to by filename. If filename\n        is None, it defaults to the filename defined in options in the\n        global scope.\n        \"\"\"\n\n        if filename is None:\n            filename = settings.options_filename\n\n        if os.path.isfile(filename):\n            self.dict_ = self.defaults.copy()\n            with open(filename, 'rb') as fp:\n                self.dict_.update(json.load(fp))\n        else:\n            self.dict_ = self.defaults.copy()\n            self.save()\n\n    def save(self, filename=None):\n        r\"\"\"\n        Save the options defined in XPAT_Options instance to HD.\n        \"\"\"\n\n        if filename is None:\n            filename = settings.options_filename\n\n        values = dict((k, v) for k, v in self.dict_.iteritems()\n                      if k in self.defaults)\n        with open(filename, 'wb') as fp:\n            json.dump(values, fp)\n\nclass XPAT_OptionsDialog(c4d.gui.GeDialog):\n    r\"\"\"\n    This class implements the behavior of the XPAT options dialog,\n    taking care of storing the options on the HD and loading them\n    again on startup.\n    \"\"\"\n\n    # c4d.gui.GeDialog\n\n    def CreateLayout(self):\n        return self.LoadDialogResource(res.DLG_OPTIONS)\n\n    def InitValues(self):\n        self.SetLong(res.EDT_HSPACE, options.hspace)\n        self.SetLong(res.EDT_VSPACE, options.vspace)\n        return True\n\n    def Command(self, id, msg):\n        if id == res.BTN_SAVE:\n            options.hspace = self.GetLong(res.EDT_HSPACE)\n            options.vspace = self.GetLong(res.EDT_VSPACE)\n            options.save()\n            self.Close()\n        return True\n\nclass XPAT_Command_OpenOptionsDialog(c4dtools.plugins.Command):\n    r\"\"\"\n    This Cinema 4D CommandData plugin opens the XPAT options dialog\n    when being executed.\n    \"\"\"\n\n    def __init__(self):\n        super(XPAT_Command_OpenOptionsDialog, self).__init__()\n        self._dialog = None\n\n    @property\n    def dialog(self):\n        if not self._dialog:\n            self._dialog = XPAT_OptionsDialog()\n        return self._dialog\n\n    # c4dtools.plugins.Command\n\n    PLUGIN_ID = 1029621\n    PLUGIN_NAME = res.string.XPAT_COMMAND_OPENOPTIONSDIALOG()\n    PLUGIN_HELP = res.string.XPAT_COMMAND_OPENOPTIONSDIALOG_HELP()\n\n    # c4d.gui.CommandData\n\n    def Execute(self, doc):\n        return self.dialog.Open(c4d.DLG_TYPE_MODAL)\n\nclass XPAT_Command_AlignHorizontal(c4dtools.plugins.Command):\n\n    PLUGIN_ID = 1029538\n    PLUGIN_NAME = res.string.XPAT_COMMAND_ALIGNHORIZONTAL()\n    PLUGIN_ICON = res.file('xpresso-align-h.png')\n    PLUGIN_HELP = res.string.XPAT_COMMAND_ALIGNHORIZONTAL_HELP()\n\n    def Execute(self, doc):\n        align_nodes_shortcut('horizontal', options.hspace)\n        return True\n\nclass XPAT_Command_AlignVertical(c4dtools.plugins.Command):\n\n    PLUGIN_ID = 1029539\n    PLUGIN_NAME = res.string.XPAT_COMMAND_ALIGNVERTICAL()\n    PLUGIN_ICON = res.file('xpresso-align-v.png')\n    PLUGIN_HELP = res.string.XPAT_COMMAND_ALIGNVERTICAL_HELP()\n\n    def Execute(self, doc):\n        align_nodes_shortcut('vertical', options.vspace)\n        return True\n\noptions = XPAT_Options()\n\nif __name__ == '__main__':\n    c4dtools.plugins.main()\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/JupyterNotebook.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Morphological image operations\\n\",\n    \"\\n\",\n    \"** Bird Counting **\\n\",\n    \"\\n\",\n    \"I've used some simple morphological image operations from scipy.morphology module.\\n\",\n    \"\\n\",\n    \"The goal was to count how many birds were in an image\\n\",\n    \"\\n\",\n    \"Here are the steps taken :\\n\",\n    \"\\n\",\n    \"1. Load the image as an ndimage matrix object\\n\",\n    \"2. Filter all pixels for those with a color tone less than 100/255\\n\",\n    \"3. Get a binary representation of the pixels that satisfy the condition in step 2\\n\",\n    \"4. Apply some dilation and erosion in order to get rid of noise and isolate the birds\\n\",\n    \"5. Count all contiguous areas\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": false,\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Original image:\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAV0AAADtCAYAAAAcNaZ2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvVusrVl23/Ubl/mttfc5dcqu6u60YycxAScGKSRCgKVE\\nOMgPQEMUbAkcQoQQTzxEPCCBUACDECgIkCMZkSdEBEQmxEmQIiwegoQfEiPidmwcx8E2sR2F2N3E\\nfa+qs/f65hxj8DDmPg6SXWXZUvPAnlKpTtU5a6+15jfnuPwv40hV8bye1/N6Xs/rq7P0/+sP8Lye\\n1/N6Xv9/Ws9B93k9r+f1vL6K6znoPq/n9bye11dxPQfd5/W8ntfz+iqu56D7vJ7X83peX8X1HHSf\\n1/N6Xs/rq7j8w35TRJ71ZM/reT2v5/VrWFUlv9z//9CgC/DDP/llqopMY7GoBBAyE1UlIgBDMKoK\\nM6NyAQVaVCYFqCpQVDhoYCogQAkuQokSLCAZGKsUUbAMAkHNWRlYQRagRVKIGGQiqhBKyeJJe9zv\\nqRRJZSIyQIPK4qLCEgDFgBKh6I9kFCJFhKEiiAZzJuKGFkQlIqC5QIwQZUiRoihJpiIoYfW0+/1V\\nC6RAqkgVQIglqAXzhMykqpgpIMLKoKawFIhiVvSPI6h0qqr/SSNkYgClLBRHQRNSQJPbbXEuZc7k\\ngzN4bzof3G48TlgrmUsIlDMCKFyU2DsyRElulF7xTFIEop//JDnEueVEJZiroAYiIAmlIJK4G3cO\\nMwJlMCvJLFYmyH5KoSBCVTFUmNnfL6chHlQuVg2GGhmJepC5QA1NowoKQWWCDBIhmSgHqxKXhUD/\\nXhajjNQbWnBLY1giUmQYJavPdComQUgiDKoAFYQbswaQiCg6C7GFfvAaub+HOgjv50YJJQIEUQUy\\n0RrIbjRF6Z/BIghUB5xFmlASkIZqoEXv/SkwAE3OVBLQTNwKwikS0WSWIxmI9908UlkxUXOyFqoO\\nWSTJUhj0uZQlpAmWEBSO9BkWJarvs6lSmSwDQdEIlgiHKhJFChSQFRD0PTJFgKWJlZKxMHHQ1ReP\\nwSEFAoFSLBRBVYhITAzVpLJjh1jftzNAC2aCaEAMkhvHOBATXhzJqxfGKMFdOCwZo2NPrOSUZIRj\\nBmMIQ41xFC8vxuVQjlGYOS8cogQzIyKhksMHLy4n5sadGS9eXXh5L3zsrV85tH4kvJClrHRCC8Eg\\nhMqEGh1B+tjsYJBELvZj6X+LoPsiVQmlHbAylcyOQkGwKoDE0rlVIGqUQKKUCJngWYQCBmKGivEm\\ndleBJ5Xj7/pE/StRwYaTee4vfeWMAwsYJR2XKhlqOLKDtEAFIUqgYNoBX0FE0DLCDJGBSxLlSNGX\\nVIvQxEKQhFGFZGEFqvEUh8mwTh6r94idCKSc13NxLuGWybmKM4sIiIA1hUwhVl+KpTckndsJ5+qL\\nfjtPzluQBbfHwnQQmkhHwQ7wqVBJlIAaKxaWfRFjCRlCEEQlyUDzERRqZe+LTgQ4owNHrsHwwaFF\\n5kJcUS3cDRBWJCJOycKV3m8baEGVoiK4gVvyOCcVRoZgo1iiqAxEF1k3llUHQTVKjKjqRFcFYn3G\\nns4ZCVVYHmQ5ciYmi7ITRXgkMe2A3IEepPoMVCYTQ1W55UQQvIQZB5aBh3BZggyI9/4O/+N3fys/\\n/QN/klCQLNQ6fBgLs07wQ66YeScbBQ2IOVmyoA4IAU+yoFZ/pwhllYIkNaBSuJ0gquhKrmMgOUAg\\nXRCUowq1wqrQhMpCzDqoaQfQUFA1jlRUDCmjDIYskNVFhsr+vJ04LiqkBSIdPL2KQhgpVBYlwqKQ\\nShSlTEmjz11/BYgk3SgScHJ1EJ/ZZzMobB2UwKy+c0IRaSw3giQimSuRStZOZquU4sRskBRDgvuh\\n5CrUhDGKF3fKq+uVd96+8M6rOz5+f8fbL523X1752qvxtS+UV1fjfijD9xlVZSUIHXDdjbuhvLgH\\nPRxTMA8ulrh+eFj9yKAr9AGldrZzoXCoIKPQUiA7oxVUduaLTEgjE7LL464OK3bl12FRsiDASlBx\\nQlcfjFp9+XVnNClqOJKCl0EVmk5FgSlUUbkQPREpCqNKyZywIJeiZv2edqJjgQlTi84NRmQQEazQ\\nDnAmaJ7kTDSLiK79Okh0hZ96Q0QxDQpFBEoMLyVlIVUdqMxQhSgjTEk6MK0zOCu5Bcwobik85CIS\\nzjOYq7+bqmLmqCqqStWiUOKEvBnnubgFvE744DG5lRABj+cjS5TzLCKEh1p8ZQYPKzlXXzr3Ynhw\\nN/qymyuLrpKtOrGZQGKcM0gElSLWwAqQRa6ubuasvrSHY5JkworevyolS0g6AYckVcFFO0jK6M2d\\nMzj8jrNO1BLRYpBEwqEDyrhoMaU7A8GJ3Z2YQkSRKdjKXaUlLsnSycykDqh0MozI4uoDoasY59hV\\nmjMF0EAqyTXwGl1YkGgtRBM7YNmJhfAjf+F7ePd68n/8wB9F9dYJNQUsSTHWKtSL2kWCJSRCefQZ\\njwt9GJWF4yaIJqqFyA5oORAtsImb4SGMoawzWNpF0AjB7KBDxOg7Y0Ic0pUixSjBRFCEiiSk30Oy\\n0BSkBoJTJljBrO4Wq5RZMDjIUqSKWElqV7+TPu/XUkqfgi2IGrB2EWJMFQ4WiPZejOQQo2r1/lcx\\nJYgpjKyOMUZH7BOQ6v5anDOCzEBRXIqhhmhw53B/19XrixfKW1fj1dV4cT946+rcifHyKF5cnVd3\\ng7euhV6NYwzurwfH1bgfxaHCIFHt91cVhiaXO+MYyr0ITjGOgY/BR8Tcj4YXupSvN60sVd2Oe5Hr\\nICooFlKOdOHUFSwQM0AE826FRYoUwYyulqHbmYKSbmWlDMskEChBGz3AYpFq6ICsQkpgJHkTTAbI\\n7EBfjnsHSNTR2oGwJmrSh3Y3zpWCmoCCVFCliD1V7fv7W4AMKhJUkSxCAFNGCTOMNMGz8xLSlWOH\\nLUEluqKU2q2WEVLMgAxBU1lZnKsghLNWB9Wnfc8uIw+CJUbiiJ1kdcs4p3BKV8MxQaQrq6GCopyp\\naC3m7ErpS7fkNvefNcNScCvONLDsKi6zE5Rp9ytVqIAzuspa0dX+rsxSJocKs7QT7OxqqRB0w0Bz\\nQzyuistAZCFLEIWIIHMnlhJ0XFlncDw9iywIQw4h1g1RYZVQLEwEiRsuRspCObhJIRSuzmRxAEu6\\n46gh2DKWLKw7d9aaqNxBPhIGTleZFjAMYkM0sqECNQgZSCaxiqpBGvzCj/553r4sRILXn/ksl09+\\nHdQggSQIAU1DbXGGoVJIgeqBVexEVKxxspaQogztrgMtdHTF/FjGUYbbZIrgocQoqD7zxeScgtkJ\\n5Yj1/TNObqk4oCoIQZZiatw0qYDUIlFW3TAueD0VuA3hGdawQUTDd2t1YE5A4aJFzmQCFQ1TTQOJ\\nQl1YCerJEcq5DJMAq4ZjtJ93Rt9ZoagNupC9h5qG6CSiiCwqizRlaMOOWcHBwf0d3B3O3QEHwlWC\\n+6txmCMSuBp+WV3ZVxJhIMWhyjDhkOzKPyEvcFfa1daOUX5MnMHhQpwT1aIoMosZH06FfWTQzeqA\\nqrLxJLrFrii+8P4Xqbjxzqu3G4vbGFyRrHQwwyLJAFMjFn38UhESsd3yaGc7LUFKCaAx6K6WL6XU\\nGJhIVyw8tcXFOJS1FoKjkg15aLdXSnWANoUUakGNiZQhETylJEF2exuNMeMkQQlENowiuxWyFELo\\noMUCUzSVkII6iX1UAmNIEamENfadAqlJnUKWdFW9ikfggvBAcCnjYT7hfII5DITFsfHLJJcSUdxW\\n8khy3pJI6Wwv2q3dCoIDwzgjmXHyMCEzqKWYFUTg4pgntuBG469yNr5+C+GM3uOjBmcs0jooI8qw\\nAyLxUs4KpBa4klF9AaTPySQbYjFDRFhzJyRT5k5QIoaUcFuNjRePHTQfC73TxvaiWOGIK1XCAYgV\\nC2HUSXGl9qE2DSqTA2NmdMFgSaydDmUx7aBPipD1gMilK3IpFN24ulOqaBXmyTw7ATRDIUhJJ5q1\\n+A0ff5d33oIPXn/AD/5X/yzf9l1/GUWYAkfaDoJGLuuqXIRCWBEgYHruu+AcOhtz1APRQJHuHAVM\\ngiqnQjAUcThysCobEkslNbj40a366ruieqDWVe6qk2IwLHhMsNgcTNGJrA6E/oxRT3BYF1Ei0tiu\\nCgyHucihrDwB3c+13/9cE6JIVSwMrSBSujgQw6zhBBFAJyxvCCW6sEEWVaDppJwondjNjJRABLzA\\nUG4Kx+G8vBpvH45UYggv7pV7d7SStSYugh7JxZrjkTSmF8KBKRyiqAlaxQ3lAuTGmg8RVOGqV8wa\\n0spheDlrJinxBuL8ldZHwgtmvclvKl0RyG5FPv1jP813/eHv5C9+/3/DnPPNa/oYz275K3cgBihU\\nDYEmC9Ix9W7bn37+rm5ECitFTJkSu7qFiSLSYJjSn0sddG8am8gyG1CKuqGrSR/EkTnIMFIVxFD1\\nDo4mZCklyoygVPpQr8Jjoyv0XvS+FDVG/39JrAorp+jAktWXptGXJmh0CoKwNp59W8UNWGvxeiZM\\neKgkc/8TSlZxyyBqNea7FomREZ2FM6nkzT5HBiLFmkZmMlmoJCLCnRl3Kry6h5dDuLpiXow07g94\\neWeMoYxLInagKqgLWsJDFTVqQynFBSGSxtizoRyEhoSk0GwcW7Q5H9FouEFBh4IomsGdgpeCdAIy\\nE+KhsdYzFHMhb5OIyVndbeiZuDQ2HnFiclJmpNwoeeiLIMIsQ2VxMUHfJG1D9KSysWTbQJfJYGUT\\nULbJJNGFW0JOMouYDgPMrIOgTEoSRVg6+Ozf+Qzf9M2/jbu7O168NZnvvQ81GZx9RtJYlSxtfHdJ\\noT7x0VW+qLOqP5FUQy4WZ8Np1ocwCLQKkSAMFgWhPBKYTiQ3/2DGmsntpBNWFmTiNUmAdFySGcpR\\nfQ6yhCuOizZ/U7AAlQ6kKYIfB7KS9Ia5jgD3rgiHS1eiBYfBmRMT4bAiK9/gw6lCiHZMlez7H4s1\\nm6CxUFKLUEHEyRCyqp+dwaALuMquhDFFtHh1FT55CK8uinmiV3h5XwxJ3GTDI4lZV/RiwvUwXlwH\\nbx0HLy/G1a2LEFNKhUM75kkKLCUUipMp3eGfMwBFCoZdmKdtccGvI+hmCMWkSpCNzUkkFYbM9/iJ\\nn/gRvuvf+ze46pc35rkhCBW8OjhnZpNTKFm7tZcbBaxFww/SxFKFNIGyAX1229nBft/rLMhuw7Xe\\n6A8w7wvhWrAE9X6giw7oYol4IF6INlFWebLYRBYbVrAOGDRc35XRTGoFc6sXOijeGAFJcZKcst4o\\nEHQHzFjKiiKmMTFuD9rk1mzm/nYuHh+F2zx5FIhTmKt4fHAezmKeULmIzIZrFFiB2dGJSLYkooqB\\nYqpIKa6CqnOP8sKdu/uDuxfw1vXCi4tjA8bRgFt6cavig7OrcaeZfBOjOfVdtS/jXLlbNMEI7lKb\\niKSa1ECogFknZmBujCG4Xil1dCoZti+xkvGAiOIlHG5UCX6BhxSMyaqJ+EDVuSCITGrI/t5NAokY\\npUerJriy9ClhAyqUJDJPbhyoTISBlOCWJBNJI3LDXlXcIimFCue8FVrehFgmR1TzCJEQTka3zy+v\\nk6zkF37+M1yuVwzn0//lv4jIQeXRPIcUXo7XwCQ5CjIGObs3XhFoFhcxKKVCUHeyOmm3smYAg0zF\\nU1F1zkw8A3Jg127pLbqwOVwolJLC1RrLXslSZYmhJUylK3AgpIg4SUtKno5WbZgweZg39NL7Z7TK\\nYWmrJ+YUVj69TrlEv2+mcRFDh/fnWoknxFxEFG4HJR0oAZb3Xb/UZMakDqN880rAqqRkBwMtTAob\\ng3euB69eOV9zbeXBqwF3Nrged01kuzPGYDxBRSRZfX7UGpqDYKaxZquCLuYcJLYTY99vI6dzO5UZ\\nQs7VXf2AYashy19P0G1JkjceS7fWqQPsxMcddxfl63/Du3zb7/4H8AFVTorShPHO4CKsKJSNk8jG\\nVveDzAgMQXUzphYMmlwoachHC8qUCkNFMXUyOxsVEzYxgnYQLIDsFlg4dvvqgBLr6TANgk4mtarh\\nhLXwxZtEEQLChbIm8KzAdeDWMrlHglw724n1g8yuBCaC7Pao5GStxn3WKqIW84Q5hVrB7VY8vvfI\\n7Uwez+Rhnd2aZUEMIjozk10tKIm5ccEwFBdH3TiGcVycixd3OhkXxx1eWvJqXLm/HFwug8OMQ7Ix\\ny2oSonFgwVwZLtzTl30EW14H996QwJkQIjxmIhkUwsUgMrDDGNpwSOUjq5zQlpQxGpuTKrSSrAtl\\nkFwgey+HKaYt0RrWz6gqOTcxZNbSxCmCe/dQWY9ELZZOBl1pHBKsmcxKzIXipLK7kNKTW0gz/qak\\nJTILyrEwZKdydWGYUzKQEa3ioODIJp0wBicP54kgfPbzv8j7jw8c14HKFwhOTFrZIwxKJqInFk49\\nVd0oqYLq6Kp5rZYJAnVL7CLk9I0ZJlRjzTOLlQsRYZiw6kbcdpEku9gIadht313Z3aQoaHYF6tFk\\nsklXgymG5WKZ7IKnYYXAuGrjw7qCiKQiG9E7ChPDRYi1OohLE+Qi3RXdYhIqLIclDU8s7echHqgc\\nxN4rEyXKGVZkBLEMVnCLzR0s3RxKy0vvRiCHITaYZbgK17HhAi0ud8bLi3HvtIRNlbVaVBh1AkXU\\nYM1C19pqhGJRnCgzlNLCS6gazHljndHQlR2IKcNawvpRRNqvwpEm++EZ4MTamN10fvZv/jQf+9gr\\n3nrnFb/pN3+CP//f/rGGFGKhu8VR7U131c3aPrX6BbWIpVCXDpIiLekRAW24uaIrqVLZioHZOA+K\\naCB0UITWSeY0RtlOGC05Eorc6IdU48mNIy0MYaY3ZrUlNZJJphNTAWfxSEnrC1OySZGYVHUgz7DG\\nraay7wS5YN2KDIdUYgmPlZwz+WCe3G7GlJNYfThXKhGDh9sjDzkht7RMOrMrTqUg42BYwymHt6Tl\\n7s54+cK4Hop5gCwmippzDDqIDsMuixd3ybDkfsA4mtF9+37w6govD+flKMboqk+HNJnlZ2NuBA9R\\nJE6urnxvsZgF+QiZA1OjYrXSgoHkgWvg6awJ8bhoviS3MkWoBDVhpaBuzBkMvVJPypNYSA2GFqxm\\ntW8hXC26M6pCohg20CW4GpGLGYGIgxizZJMmu3VGODTR0dVNpiEmSCXDGrMUVY7h3OLcMidFRzJF\\nWOVgQloByuv3HkGKy3EgwMrg4OSnvv+PE3Tbf5JodnC91a2hqTzQje8uORGTXakXookMbUmhdRHS\\nkodkVeClHKK4KqsC0yuqrcyQJ4WPBSGbrGZh7v09s++OmmFbxytdp+yLohyZnORu5XN3PQ1TLBdy\\nw3IlAuGsClK6Oj9ztmphJ2vZpKFUotFJ06qxZB0K4cQ6SZIZwSnZqTNbCSQmLBSLwqsLBAlHq7hc\\n+vywFvM8iZLWaGeCGDhcRTBN4GQM7YKgijmT8yxyFrWiVTdHd0eZ3Sk/VftzBmcWZ5xELlZ1QrBK\\nDqtdsCQuv85Kd61EIslcaCXC2bpb4Prinvde37rtMePP/rk/wd34SqsYaBlHRLzBQZ+CeERjtFn6\\n5oFAZ14oMp2ybuE0QVb2Jdga08KICghBdKC19gPuiiZEd9ClpSVbDhNxA52ItEi7pAj6YOYTsZHC\\n9P6MqtZsdRa1P4tGt1qltquO/m4zW1WR6TzejBmGaZNbQYvYb7OYEWQ9BYqjtYXRkMLrSG5lcBvc\\nQrfkTSA22WcgsUjtikx1cgzhbsBVnTs3Xpry6lBeXQTzQs25u9yho2uyWsahiqpxdwyGOYc0g31/\\nwPCDF6rcDTg2Dr7S29RQUHPvI4nXYohTcZIjSGvYRsw517m7hCLOlvXEUjCHlWSONj6sAozIky2k\\nw8SQuuHaVfAhB3ZsjaSBnoNBsVaz780HsBNhS9Io76Qvhp6NG6tc4QCw1g7X2LpcZexEnyUsGlsM\\ninl2gKCS0+GsJtGGdvJ1m5gZH/vYK6rgnMVtNg5qdxd+6n/7HkSTskRXd2trbn1uCqGTtCAyYJst\\nrGAcm2zVJmYlR8NrufXvYY1vy2r4qy6N6W9N66LQghXagU47odwykOyAXVnAScxFbt1wieIFEyHM\\nMG5bI9uEbgmUKyM6MVkmx+5qiw35CDhPXFC/trZU1GQxvMO3eBdHOYuoDW2lcFFrGWEVJcmSah12\\ngegOhpIcBkag1RLVx1zcIljr5HGerGy47SCAVlcd49LqhMO4F+3uodorkK7kTIy+d5ldPOWMjjdb\\n6phJY+8ijCHcj4PhTklhss/Sryfoim42nH64iTWorYuf+9nPMB9bqjX8yt31JX/oO74VkC2T0q0M\\nqDcusS2s2C3Pk2ts6ybl2KzxJKd1tQnbkeXtzgEyErAmqSQ3MddynmRRtTDtrNM8QwumqdEtJKu/\\nXG2dIlC5VRMJsZrAQZJuMFrziCkxWjdr0bx31a5CqohYxGysk7yx1pZ1dc9EJjxGsmZX1edZPJ7w\\nehaPEUC7sG4sVgVzqwDscLA2mEUERFISzUarcAzhclHu7uG4Hww/GGNwGUdjlPPGfEhmJLdYPE7p\\nDwP7+7XUppUeJ+bah/7o53yo4J1JwRNJcOsAogLiiol2Qm2aG/WBZXabNgIV5/5Q0hbpzUoTHYz7\\n8hspTiWsEFSurHxEWypD5iIDxmasM5SqJGsSqyEs1cK8jSQtZ1KKiboglpi8RqOVLJlFVKIbH5Rs\\n0ldsttvSWlEg3vtiCUfBkY3fx2zFRaUzz+DxnBTw+S99gc994XOsUEyFyxU8WvPsx3oDuTGNSSAc\\naLYxo/WwQq6GRcxBs5Md3uaJlpg1Jm5erLDmG+jkICLEvlf9Xk18tyjAMYRSJ6woFYSBIRALK2kZ\\npPYzHjNJuyNdeKzJmv3+EYG6blJc0W2u0U2OihRLhTOaTA+KtDaYFINVQqz9+Z6IaR1ojR0TaMzY\\nWwLKNlHZwTbXgJQzCWYeRLRiY61ojD0aYoDEzYkC9cCkz8lxXHB35gAXwelCzaOfTWu+W5ebFDOT\\nPIXHEOIMcrsQIf8uKGzu71ecbwSnv8agi8DwgeqgCIbQriBR/qHf9Tv44GGxbidvvXXlk5/4GjIX\\nh75uHWVl9xfSbpMnVr4qqeyH9EQ8mWq3+NW4SBGb+GrCzL1xqSfsCbJlbJGEDHRnWsV2xt6VrjVu\\nI+btgHFlR4oNTexq0jqTqdUOuF2hi7agQrVJAUH60ntncvW12zkY1vKrqMasF21YuM3i9VyN1YWT\\nVTzOZIbwegZnNMl4xiIj+s+tYhE81mLOcys89hakQ3R1qtbKBPHG043CvVDvvXdrZhngtjYelkWU\\nENFW0FY9wDmh1qBi48ZzE2PaIrgSRYFD216pBFgyxpVxtJPPdqKWSkp6r4cKZcGSRaVSGVR0G3/1\\nxsoiolUYUqi1w8z8QEYyNam1QG/g0hYueaREOcaBeTZmv5qI06WITtSTrA0dqRI4kn1upHRfLGOu\\nJDRQCZID39VZZmurS6INmGJkFgdK6miICnC/MI6jNzmV222R1WTcMQZf+D9/ZF816bKjkhLBdDHy\\nRnHZhODiQFFvC0Zl45XlSSzbUkZAznZ3ssAbrrPsVldWPwPdFW+X5YandhcybHeuhZtzIzcZVoQk\\nJ4shgloyfbfoUdy7s7Q4timBEkyLZXBKbmkp4AetLFOGDspkqyey92QbMuBJ9trmDitYGpi0BXhl\\nbHigicGDJzPLxu8EYhkik1nwerKt7e1mXAuS5IwTkNb+qjEO3hhOlFbs32hpGRKkrFYNLaVCWTM6\\nSUfgaHeMIRiJ+8FlDMxb/ihiTTjqh1e6H6nTpYqai7R+iCFORVeAcT4C7eQ5Hx+5v7/jrbeu/I2/\\n9oP85r//U02+Zbazi2pW3XQfvCauRHY7FImNxKzZWmNQsrAUksayrBrMT1azu1VIOWXR2YzGVCnb\\nF7OQ7GxcGRzesyNMO0s9aYqHNdCf8SSw137f7c+uip3Ne6ZBZmuNqwpJR+0kcCJz204LogmOEqgZ\\nzNxi7ggeb5MzlbkWGcXKaE+3JJIHsf3lngVncY6+PE/uKzZzn1lUWWOLq4Nv+3FbUlYbu15ZxILb\\nKqjY1ZKQ4VR7GzExli0qhMiGQNQM00KjoSCrQjUIq9Z14u1L1tqVTnCYvmkzO+c+zVJQctEBjIEK\\nrCxSDK+ujJRCc1A227UQk3LjOvpA1ww++PIv8v3/8adwnfzWv+cbuT285r333ufLX/oMdfktfOsf\\n/lO8+4lPUtUQVHmTR0rbOFWVyJbJJUktuBytStEqXLNhHFqbrmroMk4NDgI1aYMPQlQbBSrmm+/6\\n+vGGqXO4MW+Cm/N//60f52u/+fc0Jq+tW2cTynMaciQe2fiwCL4GoMQOBpXSpFM1VBbiWBVnCVTP\\nB1m0TK98wy3SboVc1clRpJPhVphcy4i1uNA647FxgVJhZYHSlR+tTjgDDnXmWoQZSuBLGQWntda1\\nZCuc6MIoSaSEytbkqm0FR7ZsLKt/HwQuE9nzPzTaViyMJmbFGqZzZaS2FpZbE5NPcAuFShJi3U2f\\n8DCEQ1fDVb5xcmlsf1SAeScqU85orbBU+xuBPa+l5WrlxpBszfDREjQVQWPidr8r3d7zX37MzS+t\\nj5aMSZ//DlCb+ZWJqvGF148U8Pr1ayLhcrnw1luv+PH//a9QnCxppptV3TpqW21z63xhwwS1cTPp\\ng080mdZBazAOYdCvGVoMTVx6lkFkDyQwkZ1FAV1vHC1mhdSJZrdZJWzbBE8Rv39dfdBVBG0vc286\\ngmMtGF+Nz9LdFD5qt0BHv051y06qoQjtgTbtrjMyjfdn8sE05iweZw+ISbYpJIrJjYoejLJWNUkl\\nxZlCrMbJO6b1YYiEmI1pVha5us3q/zZmwJzK67VnStCSt5m7FZPuOm4LMo3bbvU1W0WgOGqNY54o\\nkYqmgyiTaL2zJ2ctDN/aXMHEKG24YTXi0J1IKTUViWTdulWdGaxq+U1tNZZZIe5oCBdt8bsMePvV\\nu9y/9QqCltnrAAAgAElEQVTyfT772Z9h5hd5513nm7757+Xv+0blr/7Xn+KH/vg/zv/y3d9OhnDk\\nRMOQKbicwAIvwhcm3X5HDWz2c4qVLe+KQrWY2TMrXJQUZ6b1Pm/teVdjwuPZ0MGae1jSKuZ8RET4\\n6R/608TsqtuqNaXm2hdcHJdA/AJ5oLpID266z9EQnoAgZSFqWBolwZGtaLDcFuiRuwhs7YVZ9KAZ\\n2drfeNLKnoTCqT35IK2VMCLSMnnr+QpRtc0H0tbdSkwNicXFi6ntMJWlMLxJM6EH9WRC7opbO0Dl\\nfOyKlybtJOtNYSAYkkrOhY7uMs/MdnRqYGrbwNGqirmUQlBraaeVEGJkJVmdsOppXzByt3tVB+KN\\nVwfBxIksjq1zdxqmbN4m8dHdyqHtWTARHMWGcx2Fjyb01RqOtEr0w2W6vwrJGPsy5y5dSJSunn7w\\nL/1FAPwYfPwT7+JqzDX5pt/+zagoRDJEQXcrvyUEok8mg4Yg+tddNUZ6a++YjbZKEw6oUSYtxn8i\\nyghs+xTlCZD1hgx6qtMBOwDYtRA1VK0lS7ZnMVRjUqLB0IWpgRvlhjIaq5SeK6CX9qE/KSmqlErH\\nrB/orGDxNO2qoY/Xa/H6tnh4hC++N3n/g+ThvPHenMwspmzypYIzhds0HmPvdQlgPK7itiavVwfs\\niGRFEtGzHapa+hMRnHNR2Q61iODcAUAKZiRnLB7n6tZ54+HIIvWkstrOrIWPo2VyuXaQASUbT48m\\nsIa3SzFmIdHPclKsPUHMSnpi23Y6nVW0q/nkbK6KPNuRZWsL+BVcBlpbrnQVEMM0OdSwQ/jOf/9/\\n5nd+x3/E+6+DX/j5z/G5z3+Z999/YK3k4594l1dvOZ9890v8wH/yu/A639hgqaOt4GXYaoa73V5t\\nZb1lYTYQrz2kCSx3xYg0ZqltApmdohHp2RAqA2SASCfPeeM8T95/eOThvZ+hLCkNfu6v/WX+yp/5\\nLxDOVr9ow2bqAd4Y77CDK9ra0UhKd4CRY6sq+uqWTFygjthJuM0es5nXDUGwh0lVy+IQNAeTrTsV\\ncJxJMasY1VbsyGy3mcVWNZzt1NLEbbCm4dEtvByKVZCVzFoQnXgV3Xb/Jt1SnSXSQUmA4Zg3XLnW\\nYnh0NTxtB0Ah7UBWT9xrmKCdi7i1sWI/n0U0NBftVlVvs0ZEcTuD2+vk/TO4nQ/M82TOaCFUNW9w\\n6uAqrWAZF+U6jLvj4MXFuF4aXz/MGUO5XAbDjNACMeaqPSBLt374wzHdj4YXUtveWUrheC2iDkyF\\nv/XXfwwQDjNElFVgfjBXMFN3C9zjD6ElH6PaLpwoatnBRQNoB1nWznJIC/0Fohr079k0CWWUFKUG\\nK3EFlL6oG4+ULGRDCIjACtiDVTS6Kk6a1d2jIkgZEEWxEO8hIW9wVNU3cxwSaanTXKCDtUWsoopk\\nH/wzs6ubgPM0vnKe3GKyYpAlnAIa2ZdWjMf1AHFPaaCpG3eCIJCAFYHTuB8lHNJ4lGtbXqOcswrX\\nX5KtmYDN5GGTmZp7dJ9AVk/fWpXtFc9Wt6YJozqoZkVbqnUxUG77dUt3QkjtfXWF0DcKk7oFUxum\\nSU08RsuVVmN1PgZVk7C2fBLb/VYFFhxsVhlpb7+3cF9F0XJWKt/0LX+A3/4tf5Cf+6Hv43/9vn+T\\nr7z3Pu+++4r76x2/8es+wfXqvPP21/Cn/t1/kO/4D3+qg5oqt5A2JXii4W0oiCKPhYVCNj5Z5YgG\\nocKQ0SYbmSwxPDdOKfFGlqg6+Ye/8z/lh//0v86cxcNcmCpjHMDiz/2R39qHlOT+7d/Iqn+tL6Do\\nHrE4uapDTEISN+XMahZZg6HK1IRYLJz2fBoja5NLBYwOGtmsq0ztkZCyMe4Y3PKkbPT8hVWgyqwu\\nbpzG1tMMp9Ad8NWCDONBgmu2DLS0CWpNuuAROJ7us+j+1668ZVe11bZpH8lJUasx5kxtGC8nKt1x\\nmAoyo6v8QxvNTtpFhzG0R75WjnbIWrGkQIuIwuSADALnxuSSg8wO5jHbXLOsHXQ6YOxRtWrGYYbr\\nokSIcLSCYYXJBAzJicTBGLYhiDZnDVd8a5U/bP0qKt3NrGrg3jZQsYA6+dQf/JeA4v7FS+7urry8\\nf8Hnvvh5/vM/9t38wi/+It/7Z/4n/vlv/738/M99mtLCJHvMm/aTSJoBrRj0ZLBfUjOojC1VbVcY\\nWVv58KQZ7Fit7jRq1eB+bezzqYWhnix/7b2G6iAhtdnWXUnlJmhqdYGZuy2WxqLJPgD7E3TbZVvO\\ns9snr/bCI7sCVG1SzYpI4TyVxzyZK6i5f5r0iDriQtZJRbb10JQzak9pEwRjrdgutuQxe2jOCljZ\\nKoBOLg1/yL5AkfnG6aPWGthkdNWbQa6GPoBum6S1iLVvUlqTEK+ryEhM+7KsSB5uEzdlrXNXHFBT\\neUxpQ8csmDBpx454MtzbZUYnU6+BanC5nEi7bJmSiPUBNretnhFyJreVpCyG9mf7+n/0D/CPffu/\\nRazgC5//MrfbyTvvvOLttz/Gy6/5Wl6+etUMfl2Qs+ceq7WZpCwJvVEOQ5TD+9lGWCsmTDeV3p5/\\nwdBITHvOREhTt8UDFs43/M5/kidh6pe++AGf+9xX+PKXPugz12kdRPmn/shfQqsaStBJRJNM6dvm\\nvHW3iCBjcVgS2fpUlwOiUFp7miIkLW/san71263W0Tb6ocgchIDZ4NjnuEmw6oE10XME1KwJ0Ggn\\nGylUOlpwKUi99VCmeII1+meJBZmD4NKyNSsklZKGY5YIYoHIuT9zYRZUnbjlHmvZsrVcE2QSY0s7\\nA7K2e07gom1QUa2eQyHNi9gMWEpy5ZbJrZQb7fycOVsJktZzFaSfqG/659T+zOY9MMuHgs5Wsag2\\nXFZNvQnWiiFpV+flEI6LMkz3ZLgPj6kfGXSdHino7piAXFr/6GPwz/2+34+Icv/iJe99MPn0j/xV\\nfuYnf5a/8TM/yb/yz3wTf/I/+0N86TN/nf/+T3wPtt7DdOCVPWBb5p6stP1j1UX3k5oh9uzSvsqD\\nCBriyGRJj5pL3ZpMEayK0n69VAfCJ2JCaJ1gSstmACybIFrapODqsN0jGDe596RgCLH2o2+Xmlfr\\ndkO7xVHPrixEUI2NVHeLf94WX35cPMzF65zbmWNE9dSv2zQCZQbcIjlRXpeyYoG0znnOycPZ4xpv\\na3FGcLudxBl7JGS7e45q+dgwMKk2RAznot6wSjYmZxIcChdzXuzh4iqgUugeSznPgqo3w+qPagH6\\nBMQhGGgZt9X++DDb+tbisl1Ea/QM26rtdDqSKS1sT6E9+XJi1FZ1QIQw0lnBniKlxDzJtefLiqAM\\nbtXJcsjkG373v/pGbfD1v+kbML1wOQ4+8YlPtAOSxGqS2vMOJpM5BSrQOiiNre90UhO1bidtGRd6\\nhKdtiOS4KJEDdYHqPTNzpglM4a233u3kU79ci6n8y//BD1E0yWvSQS5l9uc82x3YB6hdUYKSNRij\\nO8QzYydRofO24OUkJ1TxmG3lzervEDa6TBhtz53scan0TI0R4Kv5kWL/5QTVFaPIiVBUBaI9llPy\\nimWbP4qtNtG2zYotDBrrX534NQuVYEhQYVQOHgMuNvqOhrNWE5uyR2EeY/SgIaAsOC7F3VFc7ooX\\nF+nZIO7b/aWtrCkDLjzGgnzkdsLtND64wa2UQwYyWookUvg2lywRGD3+8aIHIg29zQoEJxbtiMuW\\nm9kw3B1cMW/JZM902LXcJo4/PKZ+xBpju7vUetBFdKstFQyHV2/d86M/+mNdXeb/+7VVxfd+75/l\\nk7/t2zrjbb90fyhleyM6A+8LDvSwiaeWf8pmYgWsh46otrskN7tYKT1rkyd/eWPOReNa6JbVrGTJ\\nCdUVTMP3SUWzk7loBhTZAgHZbVcPbO4hJN2iexZBy4hKkpT2+itNHsxZ7YoSIc7FiiTPVhqEJDF7\\nLv6wBvznVnfUCsykKxe0bZFz9ZCQWN3SVDHGwaHtVy/RrV9toD/F0WOhCdetVFKBBz0Y1U66lqBJ\\nj2harZudc4u/TZk59yCangI2RjLX4DqciIVJ4N4TsGYEnsceCpSsTIYPKnsexSDJ5ZhqW2KjD2zM\\nG3o9kGxCpmw7q/bwnBVJyGTIXesqIxgmVJ0MG8x85BCnNPktv+Of4G/++F/gOAYvX77kk1/3ccqu\\nDC++79/+PWB3UCey/jb/yD/9R/nG3/svUHVgkqy57cQSXRXuAJt1UmlU1Bv4I6Kr7Pej+Mkf/gn+\\n9qf/Bx7+r/8OOLcG9Fe+Ut/yqX+H19d3ufNW0wzt+RxWzVdINVmbnlCjz6ApNZv0TGDoYtbBVaT/\\nwgDvYfasvqej8TjElAjlbrTm/SGUq7VqRVYRBrIS39hcT/vbmHtJQ4Xmm8vZA2sQKk/UBpOJiyPV\\nDkgbQkQrkw7dnYluuCHH5lFAJPFQ1plsdSciuc8gqHVH5Qg2QFc7Ed28oRL6LxVwqqvYW3L1wYwb\\nU5Or2/YSJGueHEcPtJos7rHmYhBSByq5uY2GaeZYOJsQL6Xq9kZNNaSlrKaJO9vy20ol1XZuyoY5\\n33jmf61BV8y2tAPqYqzbyf9D2tvH7NqlZ12/81xrXff9PHvv952ZzkBKW6aNfHTaKB9iEW0UKBVi\\na7CxlGjQBMGECEHFREw0GqB/qFhMDAkBAsGPEvmQBBEaaWIRsNhCASmhFKIzoZWW0s5Mp++7n+e+\\n1jrP0z+Ode93KNCXj7dN5q+99/Pc93WtdX4cx+/4n/+Xb+F//O2/iU9933cT57vUXRPI33nCf93X\\nfg2f+8VfvlF24m9GSdT+2bItDxSHYlrarSxGgyyBxmOKdVin/o3cmgzbB/sqo23QRm5Xm0mMKclb\\nOjUXs5lsqtmovhdCxptxgmYTaDHiew69SgcTHet3opfaKt+tSaCLoZnAKYYOZm3sJVY/Y4ENXi+5\\nmSwHZsEqw+u9SJiLHZQn8zSOS8qx5WJXZEs4k3HtgPHiQVWWxhSNDMn3BpJ83fnGIEnYcUmYjUC3\\ndUVyVuCxdtdgTCtm6PNWWIq2+Zjxohk3SjxRn6w5dTmOThAcW3mgdIJFr6Fxfnas3YidpDHdeABV\\nCzenXae+1+U0Cr84t6fJpTWGXxW/Uyfdi7WA3uSGy4PlyVmNj/3cX80nvvOP85N+8k/h+7//U3zT\\nN/9hPvlDf4s3j//+HAr4yb/gq3l+doxFoCggc4MZuI03Yvq7EkD/b6zD8FAiwbf/vq/nB/7S75IW\\nff9XVdxu79H2QNOGz/ngwfNz8m3f9Jv4iT/vV1Ir6WPQcaLDWScX78yYHEcjq0OTVnvOXXGl2mmL\\ng+FwErh3epj2G2hx9Po2aRiDIdXLgobmrVVOy9z4z8VoBydzy6QSy125xcKORuxnvVXQvHOrxMcA\\nFo1jsxvuFX9uK3NgeWFR9KWlJQ69O88LRojI+0wyIukuW3n1jpmgUtYkT8zl2AGjqzszZytApg70\\nU5hHax3yykMLjg4vHI6jaH3w6ji5jAuX3rA7v6S2A469symNv9xdu6vSaM2btNgyVSwuhz5zc8PW\\nVn00ue5WalewFsT6sStd+7FKYTOr7/ir75IUv/Mbv4nf9Zt/FfH8Q3vjDX/vP2rC80Xyrf/39zLj\\npearJjC3e2lw7qZbEtfCyA48Tt2G6eB7g5wmlcJwYmnWEndNnSEzRMt9Y9qbJ71S8OcqwZ+JnRrh\\negPN3oNT1EY5koPMEJnftZHs+xA2LSeh/I12rxHgg4wpTUe62tRTqQ/vlvH6Mzd+8J3kM7fF6xms\\nperGA6wbZ2ku2HPhbVPSgHEUw4wVHWx7/x26O49H4/Fh8Pa1Mbo26Jlta3K3pKwJN5epbXemc+IQ\\njc7Jc8DMJKJ4PYPbqdFFhPGUWsDdXJXvCphnEihRo1ibd9ql6SxJcnzNfWG57Mpd7qPhRa7A28BD\\nizfby81q4hRXwZnGi4Eu0dDyfJVpUbov27MmrTnnSim2y5jZ+M7f9x/Cp/4in/jEx4mYf9dTuZ9n\\nfuk3fJwsx2fqQvahBBREn1ONduyx13sLNXPxCmZ0KifX86/ze3/DL/y7nv3P+9jP4aM/6WfyrX/k\\ntwLgGG+/NfAxOJ+f6R/8cr7m130j0eFwIGwDfeS4o+l+sCxm+n4HhMS8hXOdxkRsi7kW1XVwdFvU\\ndOiNnEt63a0aGvZMxYWyZyIvHC0kZTR9hxduEIMnnxwl806zza0dxVlt0/TijfkIXPhSdtdakk9G\\nCIpPqrtaOxOx0sEXzS/MuYT4rE3363cXp1yCxqF3dhUPF2cMjdYp21LQIKtprFZG81C0lDUeWvBw\\nNR5HZ4zksdVWInQuh/F4bW/cevf/WoNrG7gbD6No7b2pq34vvUtH17tkrfFgOufGxbkMOC6C0hfq\\ngl+9dP6Rgym9OWvB7/j6X/KmkH1TAeyF0v3n/9zPfcWHP/QhqorzefLP//Qv4H//8z8AOShrLGRw\\nwBZZA71uul2MZ5Z1fBp0zYZW6FDNSmyJ2D/PkNRLPEEN7Yc4ILEdRN21EdWWNbAcuz1S4KBjag32\\ncsxN1ksBSEzpP5GMMmgmyc62VNrKzfZ0SX6ysDbwmSTSNOYGofgZjNE4RjCWwfPAYxGtc0pmgdtk\\npB4Y6r55NXI2blurnKGgyz6Kh9EYzeUMao4d+yBc0idSgg0JJJ6qIpZCDrOC8sVaTTbjBc9ncgLd\\ni/BOzMUFdUjNbR9IzjHY5gKYmwdcrvEMKXqX2yCYzAnHeGTVpEXC6rJhNlXirQwB4Dszg1GCXD8i\\nDkLH8WOxyjlakmmsSiyTt3vy23/tF0nFonPuRzdYP/oJRpes8bW/+buZ0+ku7/7+gVAw4la0ZIJP\\nWkC7NGmms+ErOLMxOpzWeb58Me+tRJLunV/yX/5VIhsVN/yP/FaNAw7juL7gchQPh/PpT30rH/9L\\nf5qP/tNfxowLBtzWpCN8pBghzlxJN3iKZ7IGPXQZP3dVnjcEOzLgeZsfylOaeEpSzTuCtImS53nh\\nciQ5O1jQm0w5qxRUObKxnG382IvRLPrSs4073p3n243ehgopTsy0D4k46D2IVKrGuo+7NETGGLAU\\n+dWmzEdpi2s7mKeet4aUDHkL+pA99+oaPbam3LdoSpfptnc+ulkgk1cPyjl8GDB6p3lxtMHVjdHU\\nZa8q0dA2FyaWYFaPruX12MkSsIuWEOdZ4xfHfDH7cUd/79GTfn4rtvTgx34if8z/OsXo9ndIz0br\\n/Lb/9nfwHd/5N/iz3/VJPv+L/hmwxid/6F3e+REBMi698YVf8GF+/s/8cfT2jLMTQNHsCluyArOg\\nTtbW5mH3ak3uHe+QvW/SmWQhGUGyhJCj4LwfPFqyCEcJZaeYpzWZJNlukHIBrbvGUPJsyb22hExp\\nqsZqOnzemDfW9pwj/OExnD70AbeejKH4n7bNH7Ztgy/G4GJwvU5sGCO2cHstahanp+DOW82wMJ5v\\nqYy0grO2Cy6SFfr3cshocr5O4fzCCeaG9NyBHc65JiuD81ysm1M34/l24/k5eD4XUSGpUBrtCI6L\\n0w/nMjovLweP187DKC6HKhiB0zUkdjM8bRtbGuZGd81HKxZjq/WqL2ZJMVEkZxozJIvrTcyF9AZd\\nduPuSaPRKhTEiRY9eOOP/u7/7L0DF97nwIWXD8bP++e+hJcvDmJ13IvAsU3ncl+YDbXo2aAaPtX2\\nV+gSMBOp69Jja8hVfX3lv/N7APiSr/j3+Nf+i7/OiisRTtkj/dXnAXA7k7/9g59mhnEcD3z4Qx/k\\n2/7gvyXZ4lzMmJg7t3WTYeY0MpfkadXAL8h8XTznxFKb92EhKRdwWCPLaEOi/bGNCo5xDLTM2pba\\nNbX8Um6hc9tWZnoxrDEwsht9k8emdaWjjCS6Mefc6cJJFKQfOylBz0fEgUdhPTlMDrRgQlN+3fRF\\n1KJ1MZRbOuctSV+cNYncfNvustXHZEVul9eSPtqMFw+Dtx6dF1fjoXceu/PWi8bLC7y8KvGXnFz6\\n4HIY8WBU17x2uBO1MJzWBGE/dhCut/aGL6GDvmmE15xz7bOAxkjwo9HbjhYyGZVWvs8DyT+II605\\nZsVf/p7Fl37JT+dP/ulv589919/mZ33lL6X6RzBr/P5v+mao4HYmn/ie7+dTn3yHSfLy1SNf+BN/\\nPL/tv/71zEwWKMGz5BWXw7yzMEw9JGbBoOuGtisG9NK8dUVy4MySDpDPYjdkLVYI51ehBybPg7ST\\nSn3Bcx1EPuEWOGA5qDogu+Ds7vjYEI6SLtTM6ZYYqlrdFLrITlN1dy7dGGPzgZtcModDH8alOw8X\\n49WD8+HHK28PwVcixOm0Mu6W5paOl7a4XKTQuN1ucIo76makTQr93rdTZK1zBfjSS9MVwV3bZrpS\\nzrAHdKg2ppYFLTm6UAakQjHjdKJJAzyO5LCi9+1WuomRE1b0rsqB8yQJchpt663NDIvAfIGlOBGb\\nZ+C7JRpNGW6VDTs75cU1SxjOGqwdTthcvGRsV6aj+Nwv/NL3qSM0Rvi8z/scfto/+UV88cf+Cb7/\\n05/heQajDWVjoUyvWg55pdliRZPueBshiMk51VJzSkdzQ9FQ1ElV8cGf/C/wdV//1/iSr/g1RNx/\\nKiVOf/Wv/6MA2nQnfPpTn+E2i6sVL64H3/Nn/6TSF9jbF7vynEp6Vvi7ETxrBuvBrZKrD7S6KdI7\\nGUM8DA/KOjlNHGer/UwYT2la5jbp0u8clN464Z0Hc8oWFxrlEwpaBtSkj8DPHXUUDZ/3bDyjXPl0\\nvZx0Z3gjpma76YuKzZrGGP0q7sKSLnZk57TAmGTuSjE7zAvliyg512gK/izE7V1TTkrcsG6MA64d\\nXr4oPvKy8+MenVdH5+FivLhe+PDLVzxuNsW1BHYvYKTz2B+5dudAS7Bum5R8lz6+wRQYawURN9w6\\nfRgPPrhcjYfmHEN+ghSFR1bo96kE3nem+10ff61ZISbNaXE30b5RG2Rqg/5lX/zqzZ99663BF330\\n83n9+sb3fu8P8Ef/zPcTdeEeK4MFwwdrFy3uYKlfoGxqKRUS5lPaNho7EjqVDvyjYcEifupDtm2j\\nzB0tvT9JbGyFhHVqp8k6svaFQ6uQJoqlpIP9Gvbe35sZ817124kNkUnW/t85i9e3hEjemcbtvPF0\\nK17fgneeOz/87hOfuSl/rEh5tq3xgGG94S04vHFtoe2oNR66xgrXa1E0rq5LAdNFdb307YwyZhjn\\nbWo0YS4kpwlJN92J5Tw/L1ZOVsIZyZpqn33P6FYr5q24lTFvJ3M2bgXP59xEMSX9pg36LPyisjYn\\nzAXt0vGU60oMgQ09AsaR3DI52qB2bp43QXvabJIaX/Q99WWsNjnorEquR/A7/90v4l7imung+rr/\\n5rvws/F7/9Mvo+Yn8Sre+sCFz/ngK55O4wt/1q/ioz/n32a64aNRp6JkIjqtrY0WvOIs5aEhQE5w\\nw+tC5BO9X6WpNhGlYhnhyeGSIdWtMbvA3WnB3/pz/z3f+gf/c64PF956qer+wx98RZ2L7/3kyS/5\\njd9B2YXwTj0vstV+HhsrFMlz1qC3Gx6NNYZ4HAW1ApqzctJLAHtluMFCzNo+Os+WXJakdlale6Ud\\nVC4qb1gNjiNZszEbXDLAYZ56J/0uFTOZF6Y5gxPjwkKkTk7BvefhEDfNxEOgoocGt6UkEwOcTtqz\\ncuH8gawbhxvUIOsmGV1XHJIdMuqMpm13oUSah8fGq6PjZlxGcW3GQxNbIgpedI0CWmv0rnfVzWTb\\nb+1NMO7AOS25Hk27crMNvrFtelAF29x5cRgPl844NCN2bxyX+16pNN3wvXQtePVof9+Z7vtWus0c\\nxkFvg8NFZGdj8HT6jM0ccP7QN/+5N3/leQu+//t+UEPqh4MX+Q7OxEwLhGsbWBXdoNWiVUoGVjdB\\nMqrQeP0CdC3G0jW3dG1sYwcOLppy72NuSpm+XrJTJSug4nr231t7UwqKuCmnNryc3Wbgg05u9uYh\\nt4qLJtQ3FDztTtfXAmx4cbjmfo9HY/TBy1G8PAaXMTjcqXriOOCtB+PlAzy6c+3OtSXHaDy24K3j\\n4O2juAzjrccLjxfn4Wg8PjjXY/BiGL0rtLJ3UeDuc8tt/+FyDFprAtC0u4bYOHZ68xgNb0Mb61CL\\nNY6OD0FfPI1bBnMu5jKeK3jOLRsqwdnNjGFwG40zgudYnAVjLKxuVCkEsltCD7wX7bKj1BHEumop\\nd6qKdSuWBbRJxQkRlK29bArlfp0HX/Yv/2ps/98v/y1/ka/7hk9Q60JW5yt+1e+GSi5X4+gH3/cD\\nP8znfukv5KM/51eSTYuYWkH3oWe3TbIGXhd1N1syNNuO9c4BdqO1wToX4VPzvb3tvpjifXJ2qi0u\\n28XWMH7Cz/7XaZdHnp5O3nk9efXi4DYNjsaHPnClm6RUFUH2iVunVmPW/U5pdJNiYVXCkrxRqEaB\\nX5SEXcwUTD5c72zHYcJY0I79vRlAYLG4tobbwXHALdU+X7YRJ06NF0CkreqaDzcbO03jkdg7D5sL\\n90U0Rd5TTRzfBofBc0L3U6SuTOYOf726NNbD0OIMo/nQUplGH8WllOqcW5lEOt47DWcmeCxu05ih\\nuKmzREDzFhyHM/pOhe75BntZM5hza+gLHryJKmfCkwbiZwQ6qJsbj5eiXZs4DIc0762/t8syE8DH\\nXAfw+00Y3vfQvasMOkne0RtbvlBVqkQBy+Rzv+CL+Qvf9WnMjfOEyOSddxVX8i3f/AcwTJSpTR/L\\nStKT8LGZBfKwmzeKJvlJCaozPGUOTelfzyVDxS2TFUvCevRJrJismVIGZKoqbpuXmn1rire3G6DF\\njugQms2b9IK9v7fp1K1veIfeivJiuEwTNNQKdac3ReCMA45LMboE9Q8PxluvnI+8feHth4MPvnA+\\neIUXj53hxovmvLgWL66Fxcks3cZrLV18rbi4MVza6TG65klutJE78227xhi0YRzDGb1zNOlcR1ea\\nxyqdxm0AACAASURBVKN3dRYmnF8NZ1KQwZyNd0OM31uppTtD4Hif+VlOHsnyVk5aPBEbjN1N8G+q\\nUR3lkJUrWYCiTnnnzXUIhA2Ojbv0DavGO60uNDuwNmRzzXxjA//SX/gf88t+y//Lv/ENH+c1H8By\\nV2Ij+Ot/5g8BMI5BlXHeOj/1F/0GXUp0vCTxKd9pHKYo+WSnLqdzrqDiIufl5gRXlmhg3uh+UVpI\\nwfLOdSiptmywwhgmgwXZ+MW/8TuxZjy9DtwvPNjighPziT/xO/998pxyV9nBtAKbdNe4KJsirtoo\\nuh1SHRiULY40LBw3J7qSrL2CllrE+gGLG4D4zZsut8ppLXier+ktuYU4shaLGYm5KsjMElvAjRY7\\n7cMSrKvVdrX/uPFcsHxy23CZMjhKqKiDjuegN6OPHb1lg7poCXhYZ/iNNibNgsbaoTFOesNsyJo7\\nOnYkZHKbweu5+JHQuPJcS+zpCMJli74T98wbFQdsSJGUM9qhPjbXCCwMNp/ZTUXVdQwuw3l8MI7L\\n4LErSy4idsEnl2BE7bTkgv2MjveRJ7zveOG7P/7EakaP4nSE59tGhioR1J2luBOTU2vO13z5z/jx\\nvHgcfPCtR8o752z8/v/tu9lyaGSJ3Ni0VBsvXm3sw3nLwXbDK3qQVl+kMW3Rom9gCfQdHdJ8bKdb\\n0ZvUCsaB+0Si0Ya7pGqi26MBO1pkOUm/W5Fd4JzuLq5uUxXhBZDETrHNEjquL40zZkljPFOR3c83\\neD6DeSt+ZAXPT8F5wq2MVbEBNIvGVbS0OreM6sC3XOnhaLx9GYxjy62aUheaNyBwvxuUG44OVQWK\\n7u+SQeYispgT3l2L21k8nQLlPIf+3pjB65WsVbx7Cqo95yQRPrL3vl/kpWPKRb5yjLCgLd8X2bZi\\nJ9xRlESnmCx3HrIRKEvLthQvberh3cuOlR3jSRKebDtFQlpiUh5owwjveEK24Pf+Bx/l5UPjGAdf\\n9E99FT/pa/4refy5YH5ipsMyQpllxqklYBbhdzi1qpFKfe9GsFLz+hVG1Y3em+aRKdRopSzLGUAX\\ndN1q0NwI3uEP/Ecfo3fj8Tr4yIde8vL6yCf+vx/kq37jX9Gz6JCuNv+MfTAElM83ypkqxVl5yn1p\\n7rvrFIXr9KkFT8lwRDRWJhfvnDvi6uiDiHex9siZgu8f1igPchbetTzMCMKajC2YcJjIPg9a5ul9\\nMdIXlm3vtJOxx4JZXaMBTyqDNraVt+QG7d02oKdxHXLb1f48h3XSShAqLqTJMLFs0YcJzONwHcZl\\ndB4PY7TkejFeHuITH11p1DI2OWUhhUSD6x125bugokkwYLXf9aTV4Lg6bsm16/vvjTeW66qid+c4\\nxDkZpmVhAC+u/xiSMTY85jltz/J2XLo8tfQ9xCivfZBCOx75Y//n3+SrvvzzqfgMb731gk9/8gnF\\n8vhunXzTyzTX1Dxli/tKbNbKoHdTxI0la3U5SsSuIdeiNcWpRyvF6djaD4QqbfcuHzgdc9e/5f7G\\nKly6eTQDouuA3QP0bqWZKJsHu5UJ3oyMOwZPMpZFKc9qqvAlnYHTL8ocO26wrnA8Ga9H4zaT24Sn\\nm2aSazXOdXKrjiMPN7UEt3bNdecqaLJO29ThUNvIEblxeQMyT2KJWFXJBpqfyAJUzErmKsHVz5Ms\\nuW7WSs4snk9xJ5TevIDG8GQdckGRRutDgZZbWrNi0nfOGe0UKAkliLRmqsAtOcsYSJzvbYvbt/TQ\\nDTZOGqpofRKn42Mwa9FX49mLbjeKg4naP08jrPj4d3wbrYzHlx/kX/wV/x39Ix8j525JPcgNy+k2\\n8WbEPDEfmK3tUNRMf2EcrRMZSgLebXsGWJ6bVMZmKis6vR3FiqK5Ynlo2jtUOq0/8Mu+4a/wx7/h\\nF/HBi/NTf8oX8Im/8QmgeLg9cT6+RUURdHo3zHRZYzq4l00sO4bR6oTehVzNoqwYNGadHOeQPrcV\\nVhMwjo4SIkISTY/A7EFkN6SnnaztavRN66td7qgbSJLeQuxqmxhO1DPdD5lhsm13ZjCqUb0gOoz2\\nRoF00BmXlO06T+be31jBIDinLmo5MjrZNebCpMdtPsk9uutL7X0fOk+iFiucXo1qndcVjGth4Vw8\\ndmhrhzLl1EXxjPFgKuaaHbJ5p+G99pipk03yUMnvdC7gOmPMOyAYus4zqSPkGnyfI/X9ztzs+svG\\nYewS781CSckKi7RjV6PSgxLBWx94xW/7xv+D24RPfvo1MwLqtt1cucMmN0vWirLFHUW3oXvgtnmr\\nbKPDFIADOFOV6KKYa76Rm929z26yETaX8iHSiNJ8sJar/U1BeMxhNLleWqs9v9Uy23rhh9r4Y7Ni\\njaIPw0cpyqZrNuy7qrNSxWSmn3G04uW18/aLwYc+dOHHvX3wkQ8cvP1W50MfcD7yVuNzXh48Xg+G\\nJ82KTuM6Do5jKxI8iWw61MpYc+sGSxggu38vS1zxqk70JY6AK24ofTFPf+OaeXee3GKwZnBbyTur\\neM5k7UqQFBKyNbYcrNOqMXYHoYQqPQvF2NZrbbp7NFr6tpmmmOQleXVu80burTjnNiOYZuaYVAOZ\\nSvHI3IkCloyaUIccetXo6M8dbvxf/8Mv5cd/9GP8gl//rfQPfQnFweHCu0QZFcmlgjr7nvFDbwsr\\nye+6SyPaAIs9I9+KjWFFK7GFEyAuuAf9ULezSplklUaNbX116XPOTF7XK37er/sWPl0f5pM/8hl+\\nwud/Pmec/Nk//PW7ajIaS0Q/BItPO7C2GC4wlFtSHFQt2uziSpdpOZhdkrudHZg5sK4KPZdGN1QR\\n3KDv56WgmqzonlB1svJE2w5V7bf7O1+6IO/xP+RQdhmycItNrKpRxZPegyyTrds7rYaSWZrx2NUF\\n5KbchTt1FpRY2CtV2ETaPtw2YxvjRF2th4BUQfG0gqda3GIRBbcTnm+L10/G8zSenk9uZ3C+Ls4p\\ng9XpSbMLEcHtltxWcIaCYOd9w5/F0YzWjdGdo/k+9947JzAVgUOy/vc9Vd/30LVSblKaRNKtNdn0\\nWn8z77TQll3oNm3xrJKPfeyn8RVf/Sve/ALHoS++2JvUUsxNTDmqFvtAdA2pay8TKHa/BGVSC2Ai\\nA83K7XJLLVwSqnW8S0ytmOtJb1vT20REOlrSlC3DsdMsdGDfF2bGxZ0LcJHfTNXwm4MdHbJsg4bV\\nG55pql/es6l9AHfb6DldYA9H4wOPBx94HLz16sKLF/DqcuXV9eAYrofTZBGulQKIuOLEV4A1+eTL\\n7jxdvRw7jo20ElHJjGgnUY11Fu/O4DyD26lqJDI1DoliLpQrtjm+i5vm0yw8JG66dwtRDWoJ/mNF\\nazIIRDP80Jy7XC9dhFgdeHHsLiNLVZa1INuNrWrWy7/b1radiQ1VJN2TZYpkd8QhCBv0bjzXM//S\\nr/jt/Pxf+8cwf6Rb3zhKKV6sFsuMs4LqiS9VjprH7YSPKoVXlqzosxrVF4GL46oSfOuvl8wBIZVI\\ny0FZYH0HcBI7xkmGoBYG2fi5v+YPsD74lfyFP/9XePvVS77z2/8nvTu+4enZNwfBcMQJsZVU3bae\\nHKwuLE/WuQ/ZvMOfAs+teElY1ekDsqPuqIfMMuGSwjEZWSw7SBbLO80G3qRGiq2lTUtmGUcf5Ooo\\nwLNo0Wi2b3k2ON/EJabtf1NRLrgFtmfUozaqEc1dKWBCpMYnYXDpxVm5edZKjrDNLJUZQb9BRLJO\\nwX/emcmPnMbTXJzn5PUt+eF3T/72Dz3zfZ965gc/swSO2iyLtWSnXit5JlhzcZ6StmXalqUWJwGW\\nZAbrDig3Nk5Ty1cKziwdU58lI/97n6nvM9P9a39z6maL5DRFeExM/mI3MpYq3FKkSxnkUpWSoW3g\\nv/mv/AxevRj81t/1v2IPH9bccv/gqwrWXfOqrbDx3mbQjT2wViTIuRSDYwZkY3X9uQuac40usbgf\\nJQ2sC0izVcAcW2jujlrAu81vf//WZL08YA/V33wWuoGX/uz9c1uhFjciWThre9vvMB5Rz9TW36V3\\nleLfZqCstLl494Sn14vbhuMEMho0g3dPfQbdkYjdUStlCFNXsW9d30wLVRB3OpK3TsQzM41Pvzu5\\nzeTd04i1WLZF8LM4czKnAjrTmoZTpRiUhaoDHQ2a+TZ3IhXQmNNZLTj83mnImWM4nS2BXU742qYK\\n55bFpe+uJ+HobZtATnp/wEPLKT3I26rNTmYoZzTDNuYwcKJumF12nyQjBqHvqZsqJ4Dp0JZLxdEl\\naVvRKDvFTN4dhHPIvjzEA6hV2D1qJrfbipP0riiX1M/RvCCKjvYF5U4P47R4M+fu+Zo/9Tt+OT/0\\n6ZMv/cr/hC/9Z382UalxUW6CGHrJfRtPKvY4zmRhxkW+wwzzpqh6BlYbnYixem7dLWT2N6Obctfo\\nLmU8WRn0lpy5MaeV0BbpB5zB4c7ZUBfncpTNQ3sVN3VhjWQHaGuxS5LItv5waAHdy5kGaxYrF15y\\nj75eJ9BpKMz0GIIfVbLh8fVm+SujqJaIj65CY63FdQxa7zxckse7uiCdWwrqfu2qsMdj5+1Diz0F\\nn6haT4exOn41LlZcL8YYxeP14KGBb7i9D1X2Bvt80AK5dT1flyYOxt9vpvu+h+7/872LuXOylu12\\ntgxLzVqttMnLXWLJ9R7EuWnvdV9mbf1b7GA+B88DXNCXNyfsjprpnpgfOjiozeUUdq1CLR22539Z\\n1AEHThuacfXWFPliBk3jImpXTEOi+76DHX3HM5vJ2npFrNxsxkAxHWYowsV2nlrBNPBVnIaWENvN\\npqRafa6VcrX1fdHEdstFLGIJqn17Dt6di/OWPN/0+5sZvSVRndcLMhb3qPFxOB4hEEjTMehub4Tr\\nqwTKeQ4tKVfqYI9IXq/iXMU7p6qO16Hvk0rOEGM4o+sASKi2gUSg2Wspj6syOKdjrYiV9KGqLlbB\\ndjC2rnFHoRcxjS0BglGNtRMOopJOx+6LrEQIvhXQBbm5tC6ycoGxtKHWCgFMYZPTnCPV2cytTYlS\\nqgUuZ1Z2IMBWJ7cZwN3UMe3RlCpNZPm0jvkpvnPGhqZIRxsUvYOFlnxa9mj+viZcjtT3Y8VMRejM\\nLGqliozmRE5oV17tLDc2LnQl3JZ+13O2bTlVYolZMq0zCALoHPt522qiOuRkcZHsGotVnUuXXEq/\\nnLEs6cjwk1G0DssEh3JzbiQHKQ0qQpG63QhEkJOoZs95s9PGIlIRRNpD6NkcXSkjozkrYs9OxWVw\\nW4qcSi3bZnWu2/E2NsLSVOXgnrQ8eAqNAS8s0pSB2EzP6tGch0NhqNbgnMHEuBoc3XlxdS7tECKy\\nFcfRd8e7j6DUKOm4Dh6vyePR6RehTduQjLV1jYJaFwd8dBVHKtzETLkcf/9D9x8omNLXJO2gR3Aj\\nGQHPON1c/E93PJIzBVzLZXroK8m4EX7Im2wN15ZBX2KbgifXtkZpq0WZqPnOjnwucWqr9CUKw3dg\\ntsnyaCygPtSUXmvogTOFSpq5IPzmVBftSti5Pc5ILbyai5pvVhy7utWBLPvh/nWhYEQxm5GnonuU\\nTWYcqn+Y4W8WddPlbGvlrNKG+E43OzM5cyn2owR+6SaYh9nEI1n3v8uM56cplmeI1mZ7o5opzei7\\nZ1EhgfeZJzLXKlxwIoZCA15nYVNMjNrwEUtdPl4a3fTYc7yStvVUe0IBvRuZnT6KvBXexVgwdxkP\\nkMX1DSYTfZZKunAOtF23Mr2gCct1eWUuWit6brtug6xGy0Bw7aA2K9ZxznIlXvTc2/f7chbquDMy\\nksOME/A6hS2twVqnDA21/7a9wda8etK58JwKb7S+dwvuXK1BpqJ4SMbOIsOTfgladrIJGToM1tom\\nnAMoFzIyL2RNXWrjUHwMV40STMudo8l6XRitSSY56m4OTpKFd9uw70HViWXDcYbthAkW87wbigr2\\nZ7HQCMBacpbTywWkd+NaipPaQAH9GynmgDCNTubCq28Ep3GMK8YkXeMtDqOXAlvnbuXDHG66UFSl\\nJ92NKAUSVBWDwGzowkP/XlZn9ZsSVGpfejpx9GcryFvyI7fg1bVrxtodVjJdBLtzySz0ZIZfRBSL\\nlIZd40PDDrk6AVYBM7FKpjfGVlHROnHuuLBqWrKbxrF/76P2H+LQteZEdVqmkJfhnE0vJXc5UuxJ\\nMgFrgC8qT+5pEM3UGhrKGuvCXjHMVXkUVC2qGm5KspUsA9KCmQ1byjqzfaB6C9w2iSsbVidlB/fM\\nqULR7ZlOmbLp77zXe1JCUrSuWJ/mTkOKBXNVusA2bOglrtox8anD8WY6eO8z3rnjUZ5Kh/Q9pTQx\\nRhY305KQuo9NdivWoN/0cjxnMs+TZ3PGocwyHfxydMWcwl0ueDLwgGFSPqxsvHtb3Na6T4RoLnBQ\\n2uYO20IK5RIftiW+DNvAd+kNi/KgZ8eaPs+jDW1y28nBA1nJbQl03TDWQ9EYRAwyFRHuvetl2gqV\\nVuyqxLjYhkmbsfq+oDO4ZpeywdQeWltUv+J5cnCoio5GdOEuwyDeAEoEANfUtcBcS0/TjNZMGVaH\\ngQ1t5ctu+yLQrqGiyGhKSqFUicekmw5IxgnRGMeGLrXk4luBwnuMCNLp18k8E+tXVibtAhbKZFtN\\npoY06D5wv//ZjT7FaR7M7CwLuSezU7YY6Zo1ByyTtKlSnZM+b99VrrQgVifTDy0h0iCD1RpHGbSQ\\nbDKPvXQ+6YdB6LNreyFMU3VuTfBz9T5J78K2DlEbMKYu+eUbRdlZ0pkokSRVDOgiT7KaLj8Hsxsv\\nubBqsfrBS0vOOlB6jcO9bi8FzmYOnktd4HNplDeaHKivb/BwFP7ksJnV71YQt072qUTgzccdh36W\\nyk7vsTe9sGbHPYllzFaMqefsRLpt36qistJ3sSVk/o976E7kPJmGbnUN63YrLW/5qmBOzRXTJrls\\n6+zkmR8u2ZVharPL3lvClbS5lW3P7mTVywwilKbbPGXltS3Od8Ukr31It7a23bfepI+aFbWajA41\\nWXURJ7T1/aEaD6bHpKFKpIZr8SEluKoCF9tz7rTeKpj7EfA9G27NiaVZ1ERVlXtyuCsyp4pw266c\\nz5KlmJZJnGrdZi7mTG4h1sOK4mFc9WWywycr8TjEZ0jjeYIRnDjPa/K0NGdWVVM8VUBd6XYyMS2H\\nduvq7eBiSY4NUEf5cnGDMwWNTvQiuxejILlwMsnse1nDe6aZjO3kEW7TLRkum2bRmbHAZJho7rSx\\nP5PaYvzoiglafY+BOkTieaPZFe9SGMxIehqjG2cEjYHZJNJ3IocO1pWp2KRb0A9T+gg7iDSC8KBV\\nI2Nn8OHcLLmOfI/7XMr281jYWHJC9caMUmx5NmmV6QzXis8s1Pjn0Ix2L4zaXiY2e6DFyU1GL6rg\\neRbjSFhit3rXzD9Nl3QYdDfWajQ7wYQivNRW0mbX7zilm4ZSV9Cg+YExpZN2p5px+JSN152Zer4O\\nOs9qp4TgbK6wzJCJ5OJSlZQNAe45MJs0l1LDstPcOGPJXLQXykVX2svURegNYuqAwvYozgrzi/ZG\\nNagsnohtANKy7SgxcbNLG59bLTNLkJqGMLAZSqcQIvuGTyFRDzcsp1ylFficjGHYNGpAb6ExkMsx\\nmZmsKWa1rSSseHdX5+fW7poB1mii82vJ/aP5BP+why4zOJuCApspzND3oVgFsZJVQTTbWzsNzaqC\\nNSdWCTmx9qBW0JeE7sWWjxmUxNZlwfLaHNiiWcdGkrkoJJ1iS3nMhbrD9VB0C9bWjWYmtTS4z5zQ\\nLsDUEx6a9YzmTDS6P3pACabTuhYpWG1Jmarb1tUiZ+liCDOONHFRZ1HNOVNLi+UyVLR2pzU5mZOb\\n7QqhBm2nTXRftAN6SJvbmukwO3XAdl/0A9a5aBHYcbCWFjJEQWt85nlR7rx+LlY4r8/iJOm3povx\\nMllTJP9cnde1OLpm7Z1G9C0eT/UIvUNLI7pGL3lKTREs1m2bV6rIVuTUZxTptKPxqhtHD1aYYDpl\\nXA7nXEW/GFauLLQCi2J2p5UYC8/eUFZi7jZNc/uyK5cLHMpjIi8mw0NNDkOfaeiylTTKuC1BXawC\\n606sxRgHc01hQ1Ngm+Gaw8Wu6I50cgZ2dPKNrC20zc+gGBCn9gE16ceh58MTaUYT1kE/Gmstukt5\\n0n19FsMgKYJLPWBtipzlTRporZGZ5x2eLfVKd0GEBgXeiWnQ0VIt1dk1mhJ/N/O5TCkrVkHfCQi2\\nedbBYLg604Yirs64iUkSBc1pfXNwTW2HdMiNo0nSZf1UQvNdgtZ0gT42/e7eGrelOX9LjWR00emQ\\nixRS1LpBaV/TffOzu9ObkwE9G/Tcz4YzQqO53px3Vu6wSo1ffBkxUqqMua25QyqVG7K8356Di3Wm\\nBTMvutEMRfMMDT+r6Sy5lHHUFPJyLTlmbY+YGOrUl5Cyo2u0aT86Qucf+tC1vTFWQJU+uM2hzFTs\\ncu5onAzJufbI802rmjH2MupU6B97YVNBVd82V/nDiSRctg5pQQuzwfBGceMyjp3ScIfvONWeyRgc\\n3pkVGluUFA97YLsBGP3NSATg8GR0zfF06+6+oO5qBaU/JFo0hNQv3Ng67g494bUJxmFbRS/Ggrz7\\nlG7+2uhIvO/tuP6NsCb9MBpzDIObNcKc5hJhdwK/NM6zYHNF9RKoNfQybnNpyZJaPNhynuMk3Tnm\\nVpZsAPklO3aIkxsOPl3aUvPNlxU1bDQt48Zw0gtO58FDSgabtOx60LJ4PGKzHvS7vGywtn45o3hw\\nh6PJy9/g8MaKybEBSNaMw4JrOK0bT2WsWdAWV6C8MVGApFdQnowY3Fw0sKquZR1F1uTSnLkWrQlz\\n6dYVarnEYx2buhWoHWyVhHUcXSYRSlJoluQe7XTrcl+qnsWGMzw36auYz461g7wsHdx+gby7yUB1\\nYtvyw2OrQjptKYG4mQwla4l3sHLxdC7acHw1VissGtiNcmWItY1ALdd82dC4b9mzIE00QdtzIqjM\\nIvbnGHFqIR2O+aA17WAE7R7coslsxGIch2KBKCmOhirL6YmndOQNmZiqINuxdd4FvXFbWsZfvADD\\nstH3hCZzaaSDdi9WW36WpUvVpihuBrdQxX+FDXNvnKttRc0k7FCqg4tP7enEalRNLi3Flc7BKo39\\nzii6PIVSvuSkNbitoDURER/KuQ4jsm856A2a8TR3LNjRuA72tjje+Bj+kQ9ddfzS6C4vam276LYC\\nq4Vr5CkpFLHdaamkzKygb0al7RxSyctyjxhCD9DSDLZZo0y3xord4g9Vr4ddAGkNvYKyCXXZ5byU\\nA92KSdLioHy99wGUImSsDUbT1j1Nbc/DrkrlRPss4XhJqnVXEzSHtZLLnu3ORHASQ4F+3sjNljCa\\nDtsQ+ahZQG2A9rY2Y/LpH71YrWlLOp0jF5NnQIQy47JnTtrqwtbm7tn4LVXhriWjgJkma96Ny04A\\ndtds05vskmGBlfGcmqvbbumbNc3uurqJh64PQoT+pI3BZbfpUc6F2m1uwphc+4BMetO8MbOxWgjP\\nicuwgiRxHttSaYkPVTOezhmTF9Z4JyajyV4+HEhTZIxpTPNu7oNqayh7k8470QjFupHLKN+W2trc\\niF7kKQdiNCNdmt1ibp6qIN/uxW0FPbdkyxM4OfwlR1PKSXOlKczNkIXEFvL8JygKsms3sHQ4Ubqo\\nFqXla9ess/UtR1viWKQZl6bKGC/qVvShQzSRFTZiH/q1gyLzwNoJ4eRU9Z6XIG9KNmip7icy9yJM\\nS6TlhWeg42wRObliAqh7EjkV2rovj7Ydh8OlQLF0ySG906yx8uTc35Wt4NIPwoLbCh4u+k5jXxoL\\neGAvuuvU/qcUcBAY152m3dck9p4mDU6cmE7ZDaLj3skyKhZhvg/UYHhjyOsr9VBP5pLL8MluRD94\\n21AqiTtrhizdTNwHzyTQGRZk3Sg0C55l8KAnx7wzzRhh1J1q+I966D5viMNpJhnKZr8aBT7oLvK9\\nubGWvcElysprdHvY9l9j1R3urfFBlALmGpBtQ8wJ2ALp8qS3K2VLi7AMyoe+CjPoh9pKLtimFwWO\\nbx89SDamLlnTW3dVwL3LTdKtEa5ZsLta1LsxYy0dtrfc+u9iy3zUSmbIrTX2HPgWOkBj6QVV7Qpm\\nSeXetMtrqhFKSevaHa4ePJ+yFkYE4zi4PYsnKsvmpvmbJFeVQh2qdG+snCR9t4DF1aXVstKMsrfB\\ncLF+RzrTjTOTxxRUvHowFmRPLnSo0DW2PeZm0C8O3YgKrmNwzuLA6Oa4yxyB6/d76M6MRjiKgKEY\\nTe68uRS26EMvn+2E4ofWVDlV52bFqxc6QNtqhAdnahewKjWL7g1qoqdIKQjNnRaJteLijeklVGQL\\nekCzg9vT0uY6Aq/CXDFKXuo8CsUjidXuRINLa6y5uI6D1tT+uvtuRcFDETq+n/1z7Q6wsaE6TUyG\\nkIY7facbH0PR4CVuKz522i+66Hrn6YRLK47upC/aHCoaCqWoUFB9uzoX01x7iW4CzMxBmA5HLbUO\\n/e4mE1E8AwNVehVYNHofZE2aqfNsoX2MRl7FLU5GNzKvlMfONkzKdxrK/eIrGYOIRXO9oxNjrBuX\\nQ3FOnSCaqtU2OooukgPMSM7u+CzO1ve7n9wY2tFYUtFZuw29q5l6bsMLB1HFxXVJmJ3UHORVjsaI\\nwHryhGs0aEUz6fFbdibBUY3YOl6FAyydHb3RTvAmS/01ZcAx+7HHC+9vA66CXAS5K79FkUQGEScW\\nk4EOWqW9ChJzVwgUsJYSZCtCTNVS1Ezfvf65f9lCbfjX/qu/mKfXr2m2SDbwwxretETY/rFd7drm\\ntG4WaRWRnYik1cLDAFW8HUmiajRadrnHUumgoCo2Q3lgSvMtblOH71rFOZN3p3Kg5gwiprSvZ3Gm\\n8INrGoHIQxlJzGBFY54nGSV27XMRUxbnSH0FvkHQ4ygeX1xwKx4ucNmpujM13zwDzpWcJYxltaur\\nJwAAIABJREFUlBCXZ6glcorbqWu8YbRWvLg2Ln0KoGdC3/VoXMwpb1qeRSPSOazxOOCt0Xg5jBdX\\neHHVbPrSNW+2U1yJS1Pg4RjBGEPPy10bjRi5vYcskn0ybMn1hoIxW3ceL851JJe+geWo+rUqYkEt\\nOEMR7JCMgsvuJB7QIew0yiGbljTHKI6uxIlMAZGwrrk7Cr6slMc/StV465JjsTsALXklOWpVrEgx\\nLPwicUJI6yrgeUlnXJBlzDiJTEmZomGBpHZm0JxqOgDaatgZ0lZv/6jPpbmMTQFaCh42w6EwbHXi\\nECbGhtIjautc01U4HA3Kd6oySVVoHOI6cM0Fwr/PqdsFVYIpLWqnK6apoLHn4r7IJkMKvXG5djIP\\nJSWEigHvnaOKi/le/rZd3CRtOH0cXC+dFjf6cTCtMbxx9KEuqkk22mxoQT+Tsg6nlEdukDkYBUfc\\ntlFC54Z1U8TRUHTOzEmxYCwai7kcUpbv0XU+ZSbDDxUxtXalpfPANzOiece8cYvJeS4pGRYad4Ti\\nkCI1IomCk/15/Bj/vX9GWgYzd8LBlvmIeiTpz3tVoNqozIRMYofF4UuTrNBQG7RJLFRJUBri9+pk\\nNT7zTvDD3/Mn+Nqv+InM88bD5SV/6i//AK9fP2s84YcifNYmtsciPfFUpRxV2kKWayNqBY5mwj1I\\nM44EP4pqatF8QXjRmzNX7QG+XrQz5ESaXhDQ00mXcqJKvu47K7TYjjCXCH2m7ayySTfndk58dDr2\\nBup8S81hX6ciTdbNwRcvrJitcy5t1hNjTc3jCiOnDqFoME8dACdGnEU/Bm5Ft8XD8D0Pb8xKDpRM\\nZ0dRmyrVz4Z5cBzGtRmHC1SSlm9if5zklluWhRxMo+vF9YR5735u0kE/xya4eXBQnNF5uifabkPM\\nozUmwWW74pIkfRA5ZQnNYp2LYRpV9cM5UErs0tifYzUWi36XBZYUBZWN65ic6Zy5MLugINGihxEO\\nZy7tBEBjMRkHObNztFI0TQy8F8u1ZXGbzGU8uJNxw6pxjHuc0oLqrKWZobPHcAQ1wVtiOWl1yHHW\\nlGTNQuYNh2p3uH7nYsVTJr0ZZ0yuzfZhBsEBJ9xa0V1WkIpO1TMxDfcLKxbN2SGWu3rettvmgBWj\\nd+apBa6NXSjkibfFyqbv2S6cbTGqeMZhnf8/ae8aq2u33nX9rmsc7ueZa71v96aVWsTaagO0xCKR\\n4gEocggRAY2CnOIXTTxEYiJ+wChG1JjgIZpojUGEDwRMJUpSowFiQAIE5aS0YCHFUmppN1XY3ae1\\n1nzue4xxXX74j7neXWn7EvZMdnb2fte75jOf+dxjXIf///cX63YZ04OolaMY3QbH0bRrGE4UpUMc\\ntmPTbRIk91vfz/0gi5xxsfTsZGppvlbhbpq6Y9K6z42DnQXSDo6VfGFX7BHgR2c+pkxN7lh0ZbVh\\nPFXTRV8EcSp0skjB7lbxGTxQika7FPj52lU7n6FcxmUFn5I+Zui5f4H2ZDrnqUj7x8doxj720I1d\\nHSnfPYghUbSWTImFY0NRNyylebZaNxpu2zSLb+viPnj3Es4NzAqYpGnVjE+8bvxDP/eX87/94f9O\\ne9x8w8/4Sa9wg//lj38v9ekT5JLUpXlhVbbleINfhlwirI2dzCSispqE6ap7xQAAzf1KJldBDyQv\\nM2DjkYUxBhkNSxkxVmheHTOwwhakq+WfTFoWmLnlSbGjg4JlBqm3e6QkSYL9BJPgVam8WRf37jDg\\nba08HksLsmmsKlLXoLK2CaMV4zxdGk1Mpo4CrUx6cbo1rLtE+2Z0pMjIbLzbNm6uRW+6CIsFr/pd\\nsGaXhnSGc12Tx1jMNSGddQz60MJmEZwBR2tKiGjySJmZDrVVefZKYdFbpdgmp11ygc2HDo7DVYlQ\\nLiwLNxek5umpbv1nMIdxNVg+cFM6wXKX1jcXa0jm5DVYJ0rFzca9bUWNxInvK+pigXFjxSmN8rW4\\nbOIoyFTZb0FSqTtQMTPwTK5rSaPq2tTbTNwryyozTq4LWdrdcZviSGTRgsq2vDAkV5TQruBRWCS3\\nAhmDi4pFZdgpPOMEy8lZqzS2bhx+ygFpycygrsYoRmdRrMgY0MeWGFaWBzXVtY5ctAF5hFQpMcna\\nKb6jf0jSFtGgRyJxRdBKZ0aw6qJm4fCt3shGctGqjEtp9b3i59hOTqzQanKNVEJELswqpSzqdlSO\\nXNwsOA1epSJwlofCYCM5s9JZPCN4zpUmvXxBcrjq27AgK3wr4mIo2WExKawIWsiFKThPxUzLNeV2\\nGmcv+AqCIumi6fthwd2MbM7Mgi29NvP5Hqz0Y319rA34z37PW2omYybRXO15OJhYqDEXF1q4jU2l\\nIpXgO07pPs0HJcCsgw0MY2Sl2OCF1K+Mof3GZvKPfNPXkuPTfOJDwaQ/81kxHrwU/sx3fZZTmDKp\\nI0xWVJHIDGNxhpZW6ca9NswXtVaOajuyI2mtcGxWwFbFSAvp8JgwT1U7M6tWP6nKz0ui8Ec5cl5K\\nJMO3YqIwl+JslIUGzbXdB40SLDcbzLSoWyt5TBHVHu8Wj8fkM4/Fm0sz9cdaPGbhikXDtH3OZAI2\\npD10kg+eGl7gVgswqWkyhxTF9YBmxOYm2E0sjtooVikOrRbuh5CAscQzOE/neYgGda3k+VLu3NwL\\nRoB7VfeDi7Ur9oMWUIcZpSetKvJ+XMa7K3nOoYt1yVxgNfjwqLzqssuOnKyh38vzhMcjwaTeWGpg\\nuEIxSKA4KW+LGNJAx4LaG2tMXYrLWGYadaXmlHQBhNbetEvSVVll0EqFWCokvDFHwctFrc6cqWSC\\n3SKvNXZ8kRNTVCxV7lPUOGtiebB4Xovwwrp0KZdqO71k6HOllRhmuQX6IvCZq+0Pn1Q6xNyZYoaF\\nkzWwWbYpSJHo1yUjwcwiBUOT0WmhxBRSyqNZgDXw9A1gb7owfArL2RpxDmY1chilOzUn/ah7DBN4\\nGrVrNqu9A1CStopASFWmlRWTtZwbcKKFeq9Qwlno8F2mjsRrYezUuDWCuZJRgaUD+HGpo7hybZ2u\\nkJutCIhTkHOtV7h38bfvpYMFH96cpy6nWmlOtYa1yZq6rI5eocjRebdC7ZVW4cjQ/qdqfNKrlBz1\\n0BK7efLTv+7pb90G7Gy8Wy/UDMaLV3tvYKkmnmzktlXqAClh+E1zy2RvDkk8VT2wo9DTZb/06mQM\\nMm8kyR/8k9/Fz//pP54f+vyDT3zY+bIPOo/HRRD8tK/7kK/52q/jv/99f4KkENFU6WbuGe0GdptT\\nQ3SlF+7rizY4XZvThTaspRhzyuEUMykL1hQzInf+RkQjCV06aXsgXnfgplER9crM5MJbAMF9b3Vz\\nU5N8S93wyULz50Ra0klyrcnzKlQm3eGxkucLrktM0USxNmPnZdUwrBmfqIVajFY3Z8DBirqOuWeY\\nQtU5xQurwOsGWsRAKclTdYqsY3hZwvHdFr0ab6Zh18D94DxP0uDwIrNKNNqxXYC1SiJlDdiAG6SA\\nyDC8TAFNFtiAcxOjPnGrvO6ihtVM+nKWB1csHTZNlpSVS+OPnenWi7GoxLjYRSuYIus9xRNYRchM\\nT40ecBUEoZU51RCI3wPqoKqtkboi2OQwMWrnZWTR55lhhJ8sE/QmLLCEx7rUeg5jFh2kRw2ZV1Dx\\nwn7rsRDJKhM4yegfGWfslLOQOxFDsJe5BPEvC4tOiQtzjcKqVea4pOE9TZZrl4XfrGOAZ+jfZ8+Y\\nh+b/pKpPTO6qZro8vTpYKL/PknY4YwxKO7Q3bdK9m8nM4MVpU79TN7BmPEhaBFml346lC/tI6eUj\\nlWemgMgbKwZWG2VD1XPoM7kyiUuL0RVKZjmXFtTnDDkFfQnHiTNWah8SHffg1irXWtyqM1mMVfBq\\nzLVNLmtto1PhPC+xMKpukCff1W6Xoaa8OFSRp6CEkj2Ggv9+1K+PPXQLLiNAwmkOHnsLr5YmrFFY\\nlKIFjzMp3hQDI7W9KlCSZBDecNASZ8+9cFXKYoXtsEjr/OE/92m++Rs/yWc/f9GbcRyFDz78kOu6\\n+MwPfT/f9PVfwZ/5i59mXNs2avb+lq+1YpGUVrGU/rJ57uwn6LmBHKkD9zyH3DKbQTABasWmMpZW\\niPkba0N2XDNVd8MH4KnZt8tdV4FV9jw1BRAxhJiYM7djy8kV+/vL7z7OkJaF91RT3p7wGJIBjriw\\nrKwhL3s3SbmOarSaHA7NDCt77jnUyjarRAGsUD0pocFedBkTshXqy4jGXtIyXnSfDbfJsWT8IALu\\nnXouzdIdSpG1UmGdjSsG8+XgQZdchj4HbJXBKzvIsvjAjVqMp1bfp0KPveAMdFHVNrl78G4ZFpU5\\nB+TgjCL3mS98OiNUndUCiXNdgZm0pBqTBTiUUPDjSmXoBcZyAavdnItFyc0HNsNcgu1ai4wm68Io\\nWzEgLfgw6bltjzw8TeOPzfkYW+puK4UfDVWta+3U4JFkuRM2sGiKnTJFDIWfcmohS29J8LyxcuKt\\nEnNxkJw29Jm0xWzCRJa5R4OmgmGli+ewKnUHUboZ1o+tLQ96yh2o9IvQ6KI4zRVm0GqjZFI39S73\\n/eFMepGJoqHlZITAObHlpcuArkslp5bqZYjH4bUwbG6EwJI703Qxrqmzoic8Qg6/sYqeKV9Ua8zz\\nxKss1udWkrTWGOMkrxcVTWo52Cq9LCJl/y8UiINpExOvgDmDZrmRqYHROZE2upjAOqBO/Vw6S6D/\\nmGfqx6oXzFKLr1q4mfHKnBs7TscdY703HLTqmPX9i9AbbhQlvZpcZ0LnmQ67attF9DKM3hB02EqE\\nzv/wB/8CGFwjefN28Zkf+gytdF6/utO780/8wr9P2ssug0Otu8JhcjSnN804j2paxhSoTei11j7S\\n52YCW3u8Nm0fBNHuRR+yNN/LwJ2Y4dsJ1JQ/1VzxI8XFHTArNFNbXVkaJbAz2MzEsX2xQxelLFia\\nIuq3XfrtcGIZcznn6ayz8uaxFSCZHIdT7522K84XxyANejPurxqvPrzzdHdeHYXDEu8mwX0T1KR6\\n0nbqQXFpbM3XPlRyVzpGL52jCylZclGa0Y6geXD0m5IgRkLObe18WW7KaGC8wG8kyzFftGbcuvPU\\nZVG9huKL5gzOOVgzOSeKRkJto9mgNseicGO7xqa02qXEe8kWIbne2hrtJSyq7Luo0k1zSi1Aofj+\\n83PRSiFcmENbtt1lznzW+KpW6V3dKzlzL3KdEkWd2wSzRfFkWbKai5IWgRXfrsYlI8o28zwsWCik\\nVZ2gcytJb0a1ThYFUTZ2xD0XpYYOCEedTWiuiZXt7AMrG7JpjlMVvz636uGFVdKCkrmLhE74JNYE\\nRBI8XIuwuo+MAtSekkzWirlxy0IxbU4So5ZK97W5FlKlNIejGsfNadXwbko4rsmOKCSGwVBixDWC\\nuJJ5CZt6pnMhu/4ZggKFKYSgNikryq6CoWBz8O7NidHE6riCNStXVOaMDamCfPk9MbkD1icVXSpz\\npJb4JiVIhp49y2TMxZpDgKXNlrB8ge7+yF8fP17wBmts5cI+Xw3uAZBclpQsW1erNxcXas1CeUYn\\nAomU7VBTqeGYDWUiWSKG08D2lrXWitXFj//Kv4vj9iHn8+c1h62N2gpPr554++7kr37qU5DIGrsF\\n32mFViphptt5H7C97oXRdnS9tyG/fL99+HqIeuUlOZdUG7mCbsEwtaYTvcnEIeVCasuqD2UQ66U9\\nDMXhgETxuVgmqZJmMTpsxzh5vuBz7xZv3059wGLxPJzna+6N+GQsVfNXBN2cMdY+xKQ31vLGOIps\\nksVkzPBbIZZzP9RuBU6uubWoWmS02qQ/bCL0S5VSpR9NwJJ7cfKQaE9V5JZt+Z4remqBZi8TNrUx\\nMszoAF4pxF8NsWZn+pYisoP+xIIIpAkmEQTFCgwXoJ0gu+y+uONTY4hlZc8quyR8sd4D3a0IlrSW\\nuqKjVEadxPLtStqZbVWHohus6qQHx8aMhi8pVHIbhzaRK8wJLszVCUXtWAzClSZgy/Sel82ZKOBz\\nM0iwbQ7SxT/RzH8V6VojNS4yyw1JEv4Rc2IYWS/Asdko9mBhxKyYuWy2WUgzgkkpJ7EK6TcK13uw\\nVA7jqiEOSZUTszT9HRjcSohxsKvfyouRSJLNtsdaYlc3irO7BBG7bAO/zcC+SEv/AmIaJeVQCycd\\nVixsOoXGsy3mGryPkU8BbEopYqVQNOKzgYdxIT10LRdRi3gvoT3GFcE1LiKd6oU3e0x4xNr8Bc2f\\n11mgOCOnPIQB83LKUclrkE0Oz5qIlEnwWEg//jG17Mc70uxShAqgtf2WahUh2o4lqE1itBRgCZyB\\nkkWDoIVE6iW2NcjlFJI9T7+UxaSyMA5RgLYwvdjiX/i3fgvf8ht/rdqw0nn9qhORtN75Vb/snyQ2\\nJ8HdibldW6XQ9nC/UYg9V2TjIX1X1LFtmq3pE/ECIJmYEHQ6OQW436kWCoAQywCbqpuKUycsS40o\\nXLGHmdp42x6nTCRzcy+yVeZuu6ZznSfPZ/CF8+QxOo9IhVtOycvW/jmkXAgJyzNwhKtzl/kDoJUl\\njSH6VMQSh0IIR2jNoKnl9prc/CCKIC+ZxhWnEgZCr3/scYfjPNVg4NwcubFSEBpDQHLFBuz5rUvm\\ns5YR82Wer3h764W5Ll7ur+ZOTul13+YgrsKVL6MAU0IFcqMFi2tC2646HFpJiaodwm0vaW/Mpdia\\nWpKYg0SLz7kG3Qqnb3VJvMgYpdBxS9aa3MwFq6du5u7QjNddi+GtchCcSQcRMXdHoGdnhm/trP75\\nmlr+MS+GFylr1k6GAAa6MGMuWlliQ4QKAdjKgrUY3vHVWNW41QHRsbiotTDms5gLBL1UufVSDOnD\\nYKwqRrDVHbqqBdGyAG/6fpvTPJaquMuT7sGkYBP8iM2w1kivmknaxZZELs1DM5RPVtxpppGNmw7f\\n6bF/x86aMLejTKlHSRtincTSAeepWfSMqc8ZKvzAme1i26dYIUZHLcpwywyWT+7zxrLJmzM4V93p\\n304JmCzmlCLJUkPPLeQlatWOqhh5wSqK7eorCR8Ur5wXXzrwJsz2SKAQcb2PoCH2bVWcsnTrTX+B\\nd6t9jD1Jb6kPkZQ6AbahBZaQAwzKMkoru9RsVNNgu9rkn/lnfw3f8ht/LbUWXn34Aa3e+eCDO89n\\n8J3f+Z3oyDeuJQgHcWxLL3q4DOH8qJKyqGwDFwEtbb+U/f+/RN9II6jytzVVcXUvHGIl08u2Wqbm\\nc7wcuI6XpbwykhbJyKHDCPblANfmDqxMnkfwmHDO5BGFL4yLiMqY2vSaArjUuiXkBvfUJn1jcRjX\\nYrnmVhmVQKhJS1UOmbvl3OqNF1eVm4y5pFrrtZwxX5Jv9wcOaJtpa2bcTDzbK0JJIYQA3UsMihVI\\nv5yFmVq+qVKsOjxNDOJuB17XvgADb5U3l4hh51ycS4d4JhwVdUI1iFFUVSckslvnNt0kCbFRonFh\\npXG8dGnb8D8DbBYetmfRpoPE04ky6abXU9JYpWJzij+xbdGlyH0ZJuux9cl9Z/5lpjbb66T7xOLg\\nzc0pa1fLYZAT66r6IjrYpIQ+c0alL2NZUMuxcRj6vRdTxpdtbXDzSyDxDMYqyjvjYK3gqJVrQeua\\nR64N/qkczBzYtl1Xk0OuuGzSaYrgKltqtUKQeF4MTRngaztORaG7FyeqiITWZNgpq3GupcQRM128\\nqOvyTYCrW29tYVyXKvuKy05fC3Mtwpy5tHgfK4lrM0NKwVK6eGPhIVToYyZ25f4ziyXPK8uMuo4d\\neSUjl6/FY0CvCNO4lOrCWpQiIJJm3s55JasvjkzcGqCF7hUNr5VjJmNNpo8v7dDV7E2Hoztkqn3y\\nEsQKWlaeXXZQebJVAMzUocDU3OhIaXwi5Bqbe5arB2rtysLBh6yXE3qDXIW+tU4RwY/7sg/55Jd/\\nBZ/93Bf4vu/7Ab7v+76fn/1TPwEvBynJ//5dP8Tz0GxqhRZoMhgMfFdhIPXC3oFQfNuUHVVIqMUt\\nW4P7ciivKelXotngJWcFsWTyiLoD/IYWcp6QxelRGRmb14rQhQHPkVxn8PnH4N05eUzN6A4TW4A0\\nsgRXqKKtZkrVqNJ4FhcS0MJ2PMbCaeCJFxHBZqjq8F1pHE1QnFJ0YZQp3vG187WuJSbqcCOWDmvc\\nmCu4Ff3vax9KLRYqYNWmLddoAltYhcxBNfFesxpmU87Ajft0AkyMDsy4xsWcizUKa/mOavpo9BAE\\ndb8e2+kNsiurEo9sJBMCjXH8gceguPYQNoUfdSpnLvEFqkZBBdNrjsIj92e/IlLdnlOCcsNW3eD3\\ncLLsKKnM9zlgRuEn2vdwfP6P8PyFv8bx2R/ic89Jef0N1K/5JZztK1nDWRb0nHp/M+l2J8sibDHt\\n4LCpUcpZuMqUUsWMjEktTe9JBXOj5mJmaDyW0i7X1oiZ+vPH9oDaReKKkfKtmd+VaSGxHNqtbJJg\\nefldV1MIJdsWXqQVv9VKawKPX8JEMKNrlBTSW7OMrNAogpaUQjX56F/2F3ZoRPhY2v0s+MiGniIF\\nZmhB7Vv3H2nkFMDHXN6AI53Rg6oznIihRfsYRGtUd1rVOYQVHpd+/lWkxCD28tWKLmKk0XeXFC4o\\nWBn7+NQ/vc7JLIZ7475HKX/Lh65h+2bTLzJRRpJW6wZp3PI9HU0Jv/tWtExKE9BYuWDg3gmTHe9l\\nm2wBrWxWb/rW0QKk6Em7RXv9+jXf/Zf/Cu++8//ih+uL8/1/f8M3fD2f/cHv5f4VPwV35+jQTe1+\\nSVV2LxVw2oZ2m9IUVOVu3/U+5C10Kcgxtb3/ob36Mh3PsIlkWTHWTilwLWquha3GZYFtI4Vswsnz\\nCuZwfujd4t3z4u21mMN5pDGYzFWY6wSgmzz5L3BvxYPIYTafE3pyL5XWnMM1IVcUvUIBvQjdWGuV\\n/Md4D2OfmbDHGHMmV+gSKduNKJiPYzWZcWkxuBT7vrD9kOn9KyWVJbbBO6UUWLktuUYrL2Ojl/cy\\nILX4WLF4eyp257wmp2mdELnHVVPv9wWE1ilq1XWVamQyJ3M+SKtMS1pUijJ16EXdBdGZocj4M6EF\\nZMiJiIk3YXsjXcr+PJoMPJ4N/KFQ0JLUCFZ9+fwtiAp+YAE/UL6O3/ctv5LPfP6z9FZobrx6/T9z\\nu/+XjMv48q/6Zr7hV//HAsWsye128HwGTaQcOvrcJYVZFy0aVkUka1bANdoqBZIhVnQeLE6aF+aU\\n2aLWrQsPNf2WBYtglaTg1CZgTjUnmLgJPp+uMUBqToKHc7Tkg9qVd1acXiWFA2dmhzVkVY+LCOMx\\nEUehJEdxmssCv/lqpA1eFeNB4d0juDK5JVy+5/7mXCtwl2C7UKQUYuGxRy5VGnQzaDRWD8qSEcZ3\\n4gXsJSFK+ZhXUfbd0jjBreBId+A+8QpnJmUNMgsxBfkpDc4SvLZtdArIqTFM+kvn+DFn6sdmpH3q\\nWcP+PXMBhePhkMOJWMyydX4rVA1Wp8zBZb4PLeWoycKqDfY+Unk5ttLk/PgFP+cf4N3nPsVP+qnf\\nyPl8Ukvnu//id5Dnp/dG8kd5rRj/7r/3G/lFv/I3ELNTqqA4r1/pIOoop8ld5LLY3N5cYm2u0Gjg\\nxaxw7l9ihu38Jpk/it6XLU3TeGAgW3JIRcZKxX68JO1mgkVh2SLn4jk0enwM43wMPvO4OB8X76Zz\\nzeDtEuloRjCHDimq7tw59dM2h+MwnoqUILXA6558cGu8vhcpTmxX8OjDW0rnJS6ytr0HTINIpi/y\\nFEh9TrEJzgXW5H5jVmpPWug9fFF9RCzGdN6N/blgTxxTI4a1K1BC7eWyQa9FD48lM4SnHKtwXoM3\\ny7kewbsho0gu2yMEHRjd4Ixt+XWn5oYHMWnlAC5dbGYQheoTi4a3jZBcjZnBeSZLgmnNg0PZD2GA\\ni//7VIyFMscCLTHLzv3KbW4prtSS6YLXp0kjXqLhvVBq8HPu38b16e/lL33Pd/Hpv/4pvuMv/GW+\\n+3s/zee/oN/Fz/5X/iRf+dVfrsSU7JrLHeqyoOwOU11Y2RddqdJcaz+ZjFxYLdiU7dVrxXJgw8m2\\ntcyhD2N1J9J3EkzQmlNtUEvZmnVpoNOXXIah2X3rzgebl1EphE0cjRmuTCVO51I67wjehWFDuXHL\\npSEfFtyKZtitwa1pqPf2UbiuZ0Wxr+RK2c/nHB91lkuUubWJeRmbG4zkn4ONukTP4DlVBYfl+yU7\\npkrc92XiJQlPDqscNelds3Tfypq+x0232jl88ap1KJUPDp0vDlAGrSgUs1YVG7/0m15/CeaIlzmt\\nqcFKU9CiT6fsZU4zkcHGjjIvGLNUtRS5H0bbOVXoh8Y2hnDHrFSc5Y3P/9VvJ4Hv/FN/4P9/AfyY\\nr/N3/M7fxtd/06/Wzd7Epe1H4V4k5WoNSde2rdBTg/kRcIbcLxeqCBXQqHGz7zHIfMHUoQdghnKd\\ncq/DtSyrW1dq+8HX4RXDeDCZk/fOucccPC/nvOTLXyE9Y4RzuNFaZT0m3jU28XZwrsQZOnhdS5rq\\nSa/GUZwPb87rp0Jv2/lnmmu6HbBUH5Yq67EvzURfmoQYL7QqLaEk4w3WqtwcrpowFrkdfUeXFDBC\\nOt/e1YrOqKwxsFqYF1wrucbgDDmnXkD4gJaMywnflzcQ18W5KW7kIkqTpMiFrpxI8D+WKZgxjHar\\n5KWDGTdqmvgbV0ijXeXqE4hdRgsvgh+tXNioYtWaEn5tFpovZkBYh7xwCt0Kc7/+smePM4K5gfpp\\nQJxyVtl4z2L+E+cv5Mf9P/8hYZ03p/OD/+8bPv8Fzf2S5I9+y8/k1/wn36s0D1+kFapVzrw4dhEg\\nfW1oU21s2FPlXBdKyi2UpZSLVqQv9tScVZfErlynZuWtGqxL4KeEfuv0TJaphb7vTjCmk61x80mp\\nhVc1uVVdchbCjS5sA4pkGlhzsgxuLv33u2Bb2A1jciIHGFv1VBJetcm9HkQmb+ZijtDby4HjAAAg\\nAElEQVRYwLcBIZ3hSX2fYajY+boGY8Pe6059sM1iqSWIqhm/ApELcyy86kx6Cbws05h1ksM51+TW\\noacWsadPaduvoN5UaD3dBiP1nK40ut1YM2WsSed4Lzz4kb8+HmKOSDsr5E4htRjLsphTESXQydRB\\nN9EckK29lVRKZHWj7MMz+Si9Fl5IOLOpEt7/1g/7+pEqcgM+/KDzhbcXv+23fiv/6T/4q2gmOcvt\\nZtyac7+r3O9FygRcsJPQwAgLuBu89aAv2XdNenFiH/Qv39sR4zsylZAacgHNS60QG+A80d+Lyy3z\\nGIPnM3hccK1JAOs0zjw3WKcytyGp5JK0ZyVndfpG96VpSXG0xjmn9JFu1Crs371VmssZdzHo/eU9\\nksDbPDiaxjc1C6tMiEqsi6xGtz2vjI6dg2XBKpUDPdzHVkeUKmume+6ZtlPLwlzx2WGLPDprCnlY\\nptQKMYycUlKMKR2vIT33NQVF0hY9udXO+Tyw0jnHAG/i31YX0QkdkDGNfjg5F71pDt/bngUu42iF\\nZOIFjjDOKFJYx2CyZLrILokSypXTKmmbWEKIzpKaT7oFN9+pCaaFsNugXIKql9rAD5KlGXJcxEze\\nxg2+5tfzt3//f8G3/d7/VrE1X/wQ9tesUegNxe0Uwbl7aMSRGw5TvaqDo+uwsInFZIbTXNFJbjI9\\nWFMcz82dy2WvLcOhaql8jqC2BpWd6hv7GZEkL3ZE1u1Vcmvwik67yYiy3Mh5MbOADVYUxlYdqLgT\\nWGbGpAb40iI2WWQ2Mps6qhjcreBe6TZ56pNaDvqZvHE43XlcoTkxJyv2CMOV8gKiwL0gBErVYs1I\\nrMt5eU3paedILrYsbVamEljpO5CTlPpgpQw1HAqH9RfBwD0hC6clbTo04wDxu4fCWHOIxhf1S+Tp\\nqvjxHaeTHx1CC0qdG9ScO15bB0eyKUYpUr4MOfohk729J0UC2jNKd7D1o48PatEm8+Xr6XA++ckn\\nbP9df+SP/gF+2c/5yfyhP/U9VHPuN+fpeMmo30qGF3XCXoy5y0Awl17rBJHg93FFSmYCtun/qXSM\\nqRl2RuHdEP82lw73B1qWFU/xA4ZxXou3I5mP4PPXloiFDujM5ChyULknWRTCSYU+A65gNbiu5EAu\\nsfurSq/OUeSWufUbR58sk2THCA4Ka89xWzX6cZdcLhF6zuXy6bV+9LszsAxaFY9VbIiyZUXOY4gs\\nhT244sBuSc8k6kEJ5c8pYBSKVa4hgbmh9796MlawliJNhiXvKJQKZTWuodSJ60rSHSYc9cBsMAjO\\nVahT5pXKZBZRqV6E/80aIy61z3tjbVTWnDyXxTwbK4ccdNWxpW33Wmt/tit5Sa4kDu6ukNna3Fo4\\nr0nJtufbJxFG740X9vDy0OGznFYKa4kZ8vnzFd/xZ+/MuTVpX/Q1r7c0PwnuNE+oRdpoU3BqjAPa\\ndnhGA19Sq4yQoiA0FqrlzswHR4NbO+R6rJMjgjlDnIlwhlW6G9OS117wFjzdnHtR0vbjIefYU60c\\nbdFLoRexoSXZDq4TZkzOUNU9ppCukwmrMq6h2WsIzM58UXVMuieH79DSpRFV9sBXxXzwdHOO7rw5\\n1Q2UmbwddUvmBtc1oN9EJSuNtmOnLnxDawr3YhxWeP1qMefg8spTiur2uCf1hJKTZcmHtTKuxoxF\\ndbaWe7FGx3tKaTG0eJ1r4dx5tU7m7b7JdollSJ4ZTswfuyv/m6h0DWy+r/ZK7jcRRYUXJgP5/D0h\\nN6hiDtsi4Z1pBkSqfdf2UxUFaLmz1qL54it+wjfy1z/17YDmSObJn//Ov8i4/x381//Vt/Kf/Qf/\\nHCS8O4P2PHh9P/jggw+4tZO/+oM/wCeepLnr1alNZ0vEDz84u2tTeS7NdlnCGZ5T7UEsQU4yQ2Dq\\n/e+thBHaqD9PI2PwdiTnOaFXasB1avSg8ZEzrqHZ6UrejsnbKWnLWJqr3nDSqsTm5dLcsMgGW+oG\\nfxSV5vcmWd3dnXsVv/j1ceA1KS5bhuSKheFLyw6cth/izD07L8qf8gQrtqlne7ZOpVswYxLr2se3\\n8rv6joB2O2jVuGPSM6dMMB2ZQAYOTEoUxkKb5khiTsl3HM4UWKZ0iWOXQS9Kvn1dkuuCK5OXZTe7\\nQ5q1k37uRLBFbYeOsDVYJk7snJLnpZUdeVSIZZS62bXDd6p0gL9E5dQtZxKqMorGFK0sbbFzcQ0t\\nrciLkQWB6SaxmiD+5nthV9W+Ttlh56Un7Xv+zz/2I3dstvhvfsPfDcBXfc1P4af95K/mUz/0t/GT\\n/unfTMtC8qCsl4XWxgmG7L8lJE18VRtXTLo5bXcfvRdqGnZvnMNZYVxD4Zqrwpd1p5bBB0fhg7vs\\n4UnluClavBRJI1cuzqhq6REZbpEsOlEUKWSexEyYybRU/tilTrZ4Uircm2FFFxQ1mTOZc1KORp0d\\nUfT1+ltzKsoQ/OybSczJO78RS+kWK6DUtXXRznAosTgiyaPyyZuWtplKtOg9WbPyfClNOY7ES8PW\\nJAoczXhcFTcZn9aQmscuFUJ9JY8wbkfj3eMiaxHMqCAq3F5QJkb5GPbCxy7S/vIPanseK96bJDKT\\nmRXmYOyFkoWIO4slW6Rv4lbu9IS9pIomJkIlEBhXs9HYB/zIyU/76huJ8T9+27fy9d/0S4j6inku\\nTha/5Jt/Bp/63j/38vowS778yz8gZ/DXP/OOzz0vzeX8ZYO+W65U9b32gmwtGEthdNfQfx4zGUOu\\npJWhliHVppjDNVUFnAvePE/GCs5pEINceyG18XlSKUg6lKFUgHfPk88+FsOCZnLIeCn0LFJG5CIN\\nLgJCNC7Yc0c37s14Ks7TK3hVuqrjLlF35E6k7ULnvQxpjoJSJmJC1VLzMCU6uC/qrDznhXmnbhay\\nu/FuymF3DY2UtL5pOjRqcOv3PXrQsqu4lqXVNT8cK3gmuJ4Xn7+SN29Prim1yhWNyBPPxlEVzz6B\\nitgAYxmPnDyfYFYZ62JMRdOcU1l3zZzcRKrIffDX7VAqjRaXEIe94/NipDiqa212byg+x9piTae1\\n5FYqpcPzKatnhOnCGgoRHdMY+Q5DceXpTRdJbgmVF3KJVzEzFFK4jBULp/Pdf/p38X/87t8gUM6P\\n8lVK4ZOf/AQ/61//droVjiqZIunUvhGroAy42JCntTsSm6pWC7Sa9KNuGFWQM7l2avWak2KF++vO\\nh23SS+EojVpiz6W1cAuD67oopbBS9LJcg8tldeYKHg94s8QzJnaVmIXHnCp2TFFFZsarrku0WiPt\\nUoVgi8M7t1q4tcmtVe5uhAVH7Xz+nDyuxQ++ufj8u2Cl3udSJSm9mdyt7M/rvSXNO/cuyeo4Lymv\\n3Hn30NJ2ZjBX088Y+gyP3L8rg7jUtcxa6Zv5a5H0o9B80urBBz249wN3aARHFxtG3N7CL/pSFmm2\\nZVVe/KX/3Gm9QbMq0nqCdZ1klvIwm8SvHxniloacbZ96ZkV1UlGMTcGYpoyt7/yBZ76sLkY+UW1x\\nFgh3bsv4/X/0z/CNX1136y/XiJnxuXfv+Kd+8c/dOkRVtplaQsT+OVZIc7z2ReSpzfiZyeXbs+GF\\nnPor3LXdnxZ0KxST3vfxSB7zIhd4FCaNt/MiSNa89H12VIttYMc1p4AjLsbs5KJag6tI5wnvOa/3\\n6cwyeHrqnNcCHDfjVS+8vjv37hSXFCgzMG+qhjO5244lKrvDiMLbdekmHgO3xruY1NaJMTTr9U7k\\nRW+NtMIa0A6nrKQxWZ6s2LlWa4cyIlML4URNJSmbLN22u4K6ILvzagbl1nk3grdn0m1SrUCdWCQj\\n4V6UQhsuuVxfDb8l70YqBcOMEZNejN5Co6ZUG+wGuUK/j+Lb+qsZ/uN50Jo+K60epF+UAaN1apMD\\nqxzO001zwViGdR1tNoxhAz+cx7gwb+TQM3At8PHYm3UZGq45cZskTZD/NSCrbMivjL/0p//XH2Fb\\n8cO/1kp+3r/xx7Epj+k5FDvkJrlmL1X8Zga+hXPFK8UWrQie9GE3Tndupgs0DLx3ylyEw9UaT2bS\\nqRYXi2HJYJBb5ucoe+7Dp9fMNTlnknOR1ikhzOmJ8aY8K7vQk/VQrJdtTXQx51oLd0Wztxe+wY42\\nCoy2YJgs9qBi5yxB8zvuxidfG+/eNZ7ngyR5XGJ/vOp6lospabkdRm2Ve5XrtezkGo4queNY+NHe\\nK0HmWjwvyUPHEhx/7qpshhgXGRfnUKZaLR27JE87WmBWGI8Tq8C978su6a3tEuJH//p4R9p2jviK\\nXb3K9yy9ZBDV8Cw7nlpyFB1u9pJRgC3b9zPvq0d5sR324eBAWfpwuTund8wEK78ZRN/0q4DXH/4E\\n3nzuUzqg7sbz8zNzwG/9Hb9TcSJ8NDd7UT28Fz+k2ve10M0c4AOayQwxPMgi91nMyVhKFlActaRg\\nxYLijce6yBWMU1Kj69TPQto2QkgKVX3IBkzhXqXzG+vYKaqq1t0dm0HpxtEbYfq+betce218cHfN\\nP4ttNsGk1ULf5o+b+Tb02b4MVNG5FS0Fsqg9dAgemBcugluKqi+JWVBvjRbB8qCVpvkWySNfHG4v\\nDOJKdbWAihlUplVEoVdxBhhBdIUMTqAWVQdrw6PHmNxprJzK4ZsonLQOWE7Npa13XdztYKUROfZ4\\nyiQDyvL+sp1L0PCZTQs+koyCFaflpBdF4XSX9+tGwz25mbq3K4On1rXYq0ZD8PAcO1tvB3serdLM\\nuJaDmZZGVrhWZy5o1vi//8pf4Y/89n+J83Pf/kWOxx/96/aJv4df+m/+IWxuANI2wiwmM4wSnSh6\\n/tLVWZaoJFMqjYIkS8XpphSOmpupnCZcojeZHrZ2dV7Gc1n0zXko+wJbLkzrNEmjak28NlYGz1ey\\nojM4ecVrlmsct5pxW7EDKbXU7W3H9VT2nF3K6hHKHrvcaKYst1LK/rwHzRXh7g61Lj7onccGx5eq\\nz86tJkdNWqk0rzjB7Vg0bwIRreBRkjkCq5VPVO03shnxXPlr7wZvHohJDPgVNCBqo96CPgvPG6B0\\nLwvb4KHKIubCm3YfJRZRpD0MFh4/NmXs42e6AW7J5Y22LlYU5TmtbWbYshhHODWbQ1lTW/7s8QKi\\nMfCPhPYgADQ7WWIS3F3zlCfXA9qa9HQkfNB8Mzmdf/U3/zb+/X/5HxOysDXePU4+eT/oH3wVL0By\\nfbsvOnBtu8qMvfxTkq8Bx42tfwXf+va4tkxMbwFzyVNuKUF+TFVgb5fRdpX51A/ONbnGeJ8iPNYU\\nvwC1w44obYdDKXPPi2XPrUX0L8vF/dYpVZVALYpViQwBoKd6g6Poh2mmgwNXtLnborRCI5lFOV0M\\n9qLDNFuP5FYKRuANmld6BUzgn7ntt9cCq4WSUAe8jbVtmuxYmY/kX2absbBHDdKW6pdRS6hqpnLD\\nGV6YPih2SBUzoS0l4Mov4Tymtt5ui7XEBQ72snZJRmQ+KBuv6ByYXVrUuV6TV22oyUW6otetKHkh\\n3XhqbAaAEJn3pur53ZkcO/22N+M5A6oLrH2DVxWebs7MA88HK+48X4vnR3La4rf8uq8kv6iuTT4q\\nAH7EkZ7Br/hNf4wR51bPmBycU1XsKoXIi1hFqScpS/Dag5lSF6WIKXLOYFpyXIPZNPqJKbjUuQa+\\njDdr0Sn0Q68tCJ78oJrsAxZLGQFrve/AZgw9v6ll6IpCzsHY6pqkStmQAuDUO3gEWVX1ZoYciBVa\\nFmItuldeteTpkEOxpkBGtRl+JDWdV09in1gt+r2T1GL0Xnhqu+joSc3COCe1NzkcU3iB+iopRUjZ\\n10ellMKb8mB6x/NirIpbYdXJysXC6NY5I/gy4PDUobpHlLd+UGtS9jL8VkxZb8VZ5kT7sY/Uv4lF\\nWjJotJWcVOkvx6n5zlDVlTmJLORu6yIntnO1VkpsnIQSSMuO+okEFu7GuYSMm00MASK4F7muHA3h\\nAV7tCJyv/aq/EzDuh3zGFvA//d5v25K0fH/YKiPN3h+clZTgPm3P4FRxZe6o930RvJ0aCZir0sxc\\nyrxK5ZCFB6WKXNVj8rBgjsLzuvYDVRhrcsai5MHpA5iUhEckhbX/3m3DtaDWqvmQN161hBLUWvCi\\n6rNUzZ9YAIoGeUllcHdqndRSxWNwtYe6DDccJYtijVJowQhVwaXpfWhVm/L3BwPSMTeP97KzbM6H\\ndObS3L5glGNHGpWCR+IZ7x1pc4Wcim0bOFbb2mCjcMFCXvrd5q6pjIDMolm/yck2MnW4HwkPw+wg\\nfSjqpVQsNs5vbZWBJ5EX1QufeGp4xnYMJvcGr7rvU1CqnEKCiUDluSNznuQ0nKH65ajO6wyealOy\\ngjuasFySweUOCa35RUqZjw5UHbYffSb/hoM34Xf9+p/Ir/2Pvp9pp4qNWNRWRfVK0xBjz03DB42q\\nCt4mI4oiabIrRdtdLjLXYljTRXVoK9eeOy8YhUcYr7PwnJOospr3Lhv7ysU8YZrabrfClRVicFjh\\n2YGQEsTXInqh2R5tTduXZNIDpk2NGmZAh0/cO7euZWOthSMgutM2o+MwoVUjKsULT0+Sbd7cyC6K\\nXSUoKYXUGYvedsT8lGX5wx7Ufufeu/gKNVhTEP+ai1s5mGO/P+uFbGeEC+J0K9CraZm7YrM9ZBzx\\n0Htbe8fDuTIpa3K340s7dB+mw2Buw0CZyaJJqmO+I2kkd5pI01a87NgajQciFQIp1qQTUwkDi6TM\\nQlbFhc8M5oTXRW0yqFqt+0M7m9qud+MLQNLvnczkVR/8vX//z8MKW//7Iv3dqgOg7CovTRKmF7qY\\nNw3ObQNFXjzlMwwPoRhfIuQ1V7ve24djacN78EJKM2YG13qBnhsrT0qYooys0vdSQSkSSrUFZ86d\\nHeYPLivcq7zkzSqlqSkD8UnPErjiwMQsrobXg1sPKJrVBRLCvzzci2C4bZ21UUqndo1K2mYQlyIQ\\nSanG0XJnzxVWQutGpnNdiuWeUQjX9lmxPkJRllCL/gLamUtLvlxO9UWJzumTLNInp4ttseZkBjxO\\nuYncVOFyQR2Fh1XG2yEAtg1VGaXhMznLolNpPSCRZPCAV0XLm5fl3ktyQC1FFDYLVnYU4+6U0nRw\\nrsG5ihx3E6wvPljG0ZX1dmbl3an0hsR5zME1jOchuBEF/uF/9F/kj/3+3wLA09Mn+ef/82/nvJyR\\ni9/+6772R37YTLI7zwumY00OtCiLmEUVqy2KdSpd0VG+23/XjsJycVhuY4fUF7emzLew5HMjGQtY\\nFSuLSLjF5AyHruQGr01OSJyLi+UuNVIYlxm9XFxWuDDOvcwrVcqTeyThlSdPOOBhST4Uevm6HayY\\nWE9eteR+yMlaC1hOStXzXKvvrMKgtM6TBZnqfF73g9uhW+qakxUVW4Vlgw9rhyE7eTTjXgq1B7de\\nxBspSgCeK6mtYx7cLsQ1VivCvIJ3c7CW2NylVrwE6xKsZ84pDOlycKkiZITS/ob03X18CYfusdgH\\nqNrqaUsV4LL9cGmruXZFoOjxAXZgBCPUgmr+VtUX7kNL47igbYgzl6DID3fqBstE4b0SwXeW/b0/\\n6cWt5DpPfs/v/lZoh5ZmLxjA9VJx6BBeWw9spqQAy63XDdtV5E5v3eOSNYNz60m1vZQo/hqVx/Pk\\nsSZz6u8uCfUwGC70cFy0ogvo2ku90hx1HbqhFwpVtFiiSZmWNVmd1m6EBzd3bhVaEXb79KQo3W87\\nYTZcvu5qtSCf/f4ZHxmUKFgg/e4eebTm7wM5ey0KotyCsVJ35VySCMdaMlMLtDmAI4l5QFmM03k7\\nJ2stwp2SxshLv4dVmQzmMuIy8RJC3VAJqQFyBRRxdSmNMgfNIHMy08Q8LcbVBnlJqthQJ+VVszq8\\n0JkYE5a24U+l8GX3yuuuBZwV596gWsVd1mCouGu3YFbpVZ+9yMY1gqe1iXBIGtuyk7kU6TOdUYyo\\ni3gE5wXvhlE6Cmq05Gf+yn+bb/4V/xrvaIzlrNhYwNn45b/p9/J7/p1f/Dc+bAm0t5RVqXspJkeW\\nZtxXaMaMG0dJ7AjakgmhN4MQjjJMGXoF5dQdLaleeUNQHluNUiQpJIO36fSEnFDrhAGrSrx9pshx\\nEcAOIJhD4Z8Mk6EiJV27uxah9yp7bdm7n9kn/TC6OwNd3tU12ipdP/aB0buMG75VG1YrN+I9o/jH\\n3Tv3u3G45ustZEw650WvFYr015km1kUVHbDfjI7GXtdKWhb6cJ56slZwTcHsX3LdXs3OWrCWxokr\\n4KyB7dj2WJrhg84TL44VFRmlGI/4UhdpjuKGbaqYt5ScrjqEtsj5MpcNLX/SfM8Ng/SKZwq8nJM0\\nudvwTou5bwiJ4d9/zGNhvWhhF8Zy25VPUtz47Gf/GgBjXHztT/hKftbP/8e/6BWrLNaslC0P0tLg\\n5RAeqcPV7cXCoz8fS3PetdgzSX0gchrjWjyPxfPQ8idPDS0yq76nBTNTtP1osEX7uDFisaZh3ui+\\nJftu7+X7L1s+t6I5t8/9cwfVG7xkT6URXmhR3qc8HL4opVKqomQaQVQR+s0KpxtznnAUroFcWjGl\\n6y1OO6QzNNuJFyv2sk5mjxXgy3iEOMielUkyJzyvybgmsSqYZm2gqnfGpRkioQ31SnDBzcMgh9OO\\nwJazuhEjOVplP/HYpbypWYycB60Nzdt9UUMPSO+mLDxSMsQS3I7K65vzwSHd76ubHH37mdyLGWmX\\nq7GXxEZtucX6yVPpYDD3Fv6IzpmLEs67NXYwKTidd9c7HdpFlkJ3wWPuBU5uHLUp5mgnOrsbn/7z\\n3wGgeXIpvHmoK7z3J9bSa+2k7Kopy7a3IjpbBu5BdhUpq/gOGVW0liBIJnYv/v+R9i4/t27Zeddv\\njDnn+67v2+dUlW8Y25hLEoeAksgRcidghQYg5FwQEv8ACQ0Qd0LSQKIRQdppElqAxFVYooNocxM0\\nEiGUhCgJMYoDNrYTl6tSZ+9vrXfOMQaNZ67vWHKo49i7Vfdae633nXNcnuf37GRcdT5ndz68NOJa\\nHK49w0RY0pexOFunReMtRU8Llwso9/6maPSZhEOlczSjpbNq6SSpTj+cZpPRpXl9bcV1dQI55iiB\\nZ3ozjq7348U6vcV2KTbGoS70uY4yM27dub3qOxMxbjAu5+4wUtJLs6SXlomf3RpxwC2LLM2EY8Fw\\nhZ7mYQpWnVpO11ZkFeJ7rEtd4iNgPpy6krcIYrEvUddFNzTEcwq3Yq149x/8hg/dlcp5V7R0MlZS\\nfsgxw0arWcnxYqbK0IzKQboSFVKlD938HVpj2z9vDUBRx67VKVUNm0WNLfsyebufB+kv/NzPg8HH\\nt+A//s/+S/y87QpXEi+FIKJ2f9l7PPuTFVqlWWcASoC3DeNBuU+m9JdaxbyKt6lNujCDwTJ2XIou\\nngzINOa8iGhEPjDrrOU8IveF0pg+wRpj/8DWBB6xaVwWnKNhFdTqLDNeD4NRfDg63kHc2C6k6xIo\\nejRV6mfXIZsu+VY/ij6Ae1EvuqFHU6hljoGXokg6pkNoKAyy+k6BQBdW3/ZpN8dHcb3pJcsIMuCq\\nxqOMc6eLQLGiuKeTa3K685Zbs72cuQ8D74uILS8KZxxBriTpvNqCZnwKzYutIRdg13e5ppKDK9kj\\nGfGUeze+cTO+/jp4PRSa2U17BivNR48DXvvJbUe7WMpJtF3bzCaVQVVpo44i624pB9erDT6RjANe\\nPYm4YUy+fZd21dYFt05P38+rMenK8FrGoxV/4B/9Xn7yt/zz/M1f+gX+r7/61/ibf+Nb/Nw33/hn\\n/sSfwVNGCxDUJ2rgI1ghjegKzerblPMwsjEMbEjnTBnRY4O0J92LaIOzLdwGr6cogU96XOZeWLcT\\nUCjqlUZck27qOj/sxV2WXIQEjBRmE4x7FX0Hdx419J6xIeDpeFs46kJu5rycnXQBhWjPYqrJiNTU\\ntX04ujIJgY7s3i/dZD8f6iLzkJJBk0x738O8dKMOOEusGLOi4jkeFIPFU1mCMYppOz0jpEAgknVL\\nHtmoKxRt1NHsui/NpF2jxXEc2BJgNGLq8mu/WRswIkVlNWo1lkGVnFNm6CZ0zTV6BdG6IC8V+NJs\\nydx1czY2mbLh1xZOV2wivLHYt3QTaFsaCFOF0zbRx+Gb3/wb/PE/+sf4wR/4Hv7B3/OT72MDRdmV\\niPEFMaWgXBixjIEKW2tf0h1qIrKUfAEA3EyD+hnJ23bjveVFzO1uKahx0kuyqvkmdF6Pg8c1N4pw\\nUTtjay4jWmCzsaJx9O3TT/ndzR3vmn+fNG6Hqp0stXVXKEK6mbgCsoqixUZrGINVD2pBG9LNYtqq\\n2k3z7GuJD5GlBRjWcEuO4bwMSYLalng8jST3kDolWpFL7acbWyJYPAhyLkZqZn9R2HI+RXBdggA9\\nmn6V5k0dj94CKsYeMamns2zkMjpJ7wezgs/K+KJr2fXhTB42WJF8qmTOtiurCVmczTiPJhKawTgk\\nIeqHVDPDNU54aU2Iwb20tW0YsWZEXpzuzMu4lsIdW3PaUOrFXI3HBNaF28Qcbs35lfdRFmRr1Gws\\nV0SNbzedWSN6ceSN7/9a8e2fLV4+fJ1vfO/XuM/BT/1z/xbfc/vA61AqSy6IPFkWZCh5JdJUXZlo\\nd1GKiL8y+YAuVHfJ/17MOfaMVB2fYoduQ4vWtwzWNHw6q6aSRUoSz0dpNn4ZnCXQUG0gkBi2wWWi\\nlo2CW1OcfIxOJjzMGLMxTvGTb61xtMY4bnx2FGMUYrMoqKC20cVMZhd3Y0bQhyKnXg4VBccA785p\\nKqjSirOMaK7RWzp+6LtpKeVMyYbJLrIF9G9gTc97N2efp1SD+5SWeU0t3El1D21fxLFn5b3rcPXt\\nO1AKuRbj381w9us6dG0lszUsdnpq7lK8BBVRsoAWX4/o1FT1krFInHR2BVP40vxXxa5uwApwUxtz\\nZmOeTltyxjyGstjKIJsgNd6KP/Un/k3+0l/8C/zWH/utOmxTM1tKB2emHlDSuIrYmVIAACAASURB\\nVG9n0coEk1unSrdp0w4LT4Fs9rNGNS0OKWUuzefBWdIjdsRZ7WabcmX4o0hvfKqpmfyGcNyGCGdp\\nIhdhscP8tlLDxCQ9+uDWjYim1AlzyWYMAUgm+JBqoaWqr6Pp+8Sn3FEWdJSWOrouoXPInjhuxnUP\\nMmGuIi1xLw4He2qa0edsOmvxhHvB9dDfJzAqi7URiC2K0Y0I8Wr9greZPFZKnVJyBno4yySMNpNU\\nqLpp8RB7wmNIUrg0y2RKi3kiK/R9OlHFfGyo9VFYPtgRZbRm9LY4rXF00a76kIzupRnj6JwGo0Pv\\nyTEQIMWS3C/jMYYKhpG87Mvw6LJ2hkuj7K4MsC+8YY/gO7V0GKVSl910ky+KjEHM4LEW2U9pVlvx\\ny7/w89w++8D8TvJ93/9DfO8P/wg/+jv/CTFdmysivqmybCYzxCMCY6eElChpWTIfrOz0EcQ6yAwO\\nc84u/XRWETWYsVknrir4ZRVvQyO0t6vRC95qYtZ1eCdayPoiurS0bs/EEzFIQPPy7mBDKQyPSGx0\\nxtgpzq3TvfP66nx4lWPrSZnLLfujir7BTuozBKU6cNw742wcTXCZw4ydzqQCQKUTn7EXj3uE+M6P\\nfe5pnlJVh3Nnu20Tnf5TKYdq7tGjVYqT2+AIpYR0F0vEh6pz35W1I6VJPkebXzFf+OpK1x32LajD\\n1pkR77PSWeCxkx8cIiZ5dT2kptbbrRFbVhRVlAfWJDkzR1HuZSL41IKb6zbP4u2Ux9/QTRsmiM1v\\n/52/izLjSvTNlbS0V8IV28m4RPeP2CMP00FCg1Fw1tYwolutNlKwUgfQaIPztog0gXCmMUMjikzN\\nPs2Uj9UPw5bazvujk9vWlmipUT3oVVqwuQhhtL41tZ2jJE07BviOSXlKjyrVhqki21bXLnaFN6Mj\\nvXMf7Qls0/dnO4SxRPJqveHPmHUvztEYbR9Y+8BoWxe9tpRuF2qiskXIkWbG0Yq6DT7dJysa12Ny\\nn5rdRkCUlCpxaQb5bCPMpFIgNTvLZrvSKc2egVwbhC/dyX6QZYedmnuQlz6nexOK0kSwWlFctbih\\nc/vVtVh89aIdm9fQG6OpCc7aSQi9aObgnbZf2N4d3997JDymKslMOFeymvEy4HFI032/pOetCdk7\\nbV7cE25+6HI74O8+f4k0OM+TeFx8+vD38A/84/+uHGBNv2lkEpEc/cRK0em3sm03bpyukZBAiUlO\\nKcDvLull88Y4gBySOl3JRXFfk2WuNORm9BrMusS8eEyUO7apdKYF9kAI0WVGTx2Xr168IcJghhEW\\nXOkcvqH23XArusPnNxOn9mb690tjMq+B+ZfyQnAtNksGA0k6naNpmdy7GM5r56t1kOmjwVE6L9wk\\ndWTruJ8mXGn21Wm30PI8aktSTUUI6MC1AuUWfik3Pc5GNuNrfnD0yTU1quwuvktkkm1wlrCT07+7\\n7/ArD12FPKKYE9jtSpHRlbAJLGQRrqUtN6XZk+RAjocIWLYmR3MaXdIO04O+tt8fBDrvOxF2no7P\\n4lOxUYr17mnZQkMKE3AnjWuK6hWhl7ahttfN9ssoqLI1uHVY5u8ys3weMpmq5pFW93CHWxEpOHUk\\nO1QQIjRPTBw/jM/mIl9lS31c0nu2pkqyaXgs+EcbHKfmZAdbvzmEJTyHximxD/NmaoHCU+DyBqsN\\nRaB33xcFYDpcW5PUSVqELcQ/jL4abSbWjNsp0b+7qTrruvjEGZYPnd3R9Kh9gxfeGr0Xlk3RKnfl\\n5l3zwXdWEgGPWAoJNRHR5ipYxiOfAHConhwly7EUL0pvxYrMTT0zsDyomtLAovSRCmcu2MZx0emO\\nxK2TNbkHHNeOi/ditMbXb40xOscRgntvnbgSX+Tzv9ElwDcpAwp1KK3xHsro1pgdqoIZolvd0vm8\\nbqQ9oC/42Hl0KTouDLPBGloauXW+dv+rfCsWVnD7vr+Xv+/H/sh7dXk0/Z5lYh0vFm0veg1F0rg3\\nHUCmE0O41yTTeD3PTYSDnLX3JQVtEvPGjMVok0cY+bRl7gV2tc4V83038mJQwznhWU4yazFLyR4j\\ngOyEBy2MI5I6Gred6vthwMvL4DY6503x7WFGywLr5HN304zuWhgO7+AwrDG80Q7j5cXpXcveZVJN\\nmR4pWu2P5r9KX55wodYlgRsyvWSJn1zY7tZFXMssWgJlTKv3BAqBsgy2tn2Y7OLm7Z3CR0wc42G6\\nBNnx6+NZ+PyGD10fwNINQ6O28BmK3EJyUPm+1iJqJ9bmIldjmWyLnkvowjK8qSWzAl+5KfCLdXSJ\\nqFdhI8l9Cx5RxBKV67yMaXtj6Zp3zlT1cV+qxPTVmsrolIZuZRJzD+1x7inopLuLoYu9Q2qq9pC9\\nphgBdHq7hMPD6YfkQ62h2RTKhOsvxody2qvYntSOCTKBozOTZoMPHS1wrHOMgR/O2eEF3ebtlM45\\nVpP5xG1XMLmtksbwju047yrHVpA7n0uWz+e/J4PJ6YYdsnH33ZVghXfZkG1XCE8nXZbayBnGlYKm\\nKB9KB5Wxo9BNcrvrIRBQpm1jRgkyg2DgzcQhaF60aMj3I9+9/t+lxURXmHLScvHYLrW5CnYysfvW\\nfZixIhjT4JRfvqFZUxtwnIPb2aVdbom73Ha+RSvu2+lkXSm9Li4t3d/n/1HIaYR4vp8WPBz6WIyH\\nDvuzBx+GsJpvHy6+WI3roXGQErAlzTt6kd/6f7h9+BrnZz/K/L4/xMOOnRq9e10Ty9esMVOHIu8H\\nrz782juWbqgQCC2MpCk3LBSc+RTGmDVuY9IxrjxIk0Ik1p6NhuROZo3WEqwRXgwTlzdWMGNXyAsp\\nlbrSi3d5AkOZna+j8dnR+XA0kfAOsYYvilFSNVUKJoUXR+vcqshjj+26mNtHL25nk9Sv6UAklVDR\\nS4ve5Vp8K3ASFmA7TcPM6Hvu60M7F9/yL53Posk9l3C521sfUEtsk5a2O2AVhnPBaM4xQNvErj3A\\n6rsLLTj2M/ibOXQfD0liRu9c+cxZAkr09spnOkSCj00Wa6xVRC1yibTv3vAJjzE5ppYKp3ctUppc\\nLL4SuiroNR0rpx9okI8zZ/KGRhnwtOemKpFoW9q2Rwslu8LhriXJhHsmZDEiOLyxesHSl+lPQv/T\\nRtzBqlM98ZaM5pxDGlLMKIZQjgZYYiGZ1zjhsM7Xzo23rAeT4pd+6dv82T/7P/NDP/CD/OQ/9hP0\\ndtC9sTIYlRze3yvdKxVn3SywUXSC44RjdG7d8J1SWnpegOIxpMdNUlSr7O/Ouz0uhTT60fa/Vjt2\\nWy9zlVjCK4y3BCZ8WjtYMNXOx47wcYe4NOMuOrOCikmUbNy11I9MWwqRjEW6eKuaCz9ofiNY2D4s\\nsjrRgiPFbb4ssVS97im7rwZ5RVzSehuae5o5reRGfDkaH26Nz1+Mzz7rvA6XjMh1sHu5RjsYvpfM\\nTwNONBFCHF1EtQuDKr3QcjNqeVmVME4sH5rvnUb3xlkHZovYuWR6/QZ2wtka8/a7uX34FvNrPwHc\\n+EbXYfMptwKojGw7/flakmuZXJ+Thj2K4Z2ZwaOtDcv3rWPXYWJbSqf498K9c38UVyUPBACfW1v9\\nmIGtko66pHHNvdzoZ1KhhJBhi/tyqqub7Wtx69rfuKtLGc05PDjH0Gy6mWLiZ9GPxurXlrX5Zqxs\\n4puz46SaFqnNOY7OOeo9Fsq3eqRXsVK/10i4u+FR3Lf8JLZCaejuFMHwOdpy+zIqbCuIZEvVu/Bq\\nSkyJF2NF22CvnSgSxljFFZuq6MoTrDzpZzAjeOYn+m+20p0aCpFR7CEmlYINr6znW68/OTFTGquS\\nczXTtII59aJH1ZbPdB4+NS/ZMRc0SbLkqnIi4LY0t7seehAyTImrrpSHVcb1KCwXZoOHFX2JGna6\\n8o8a4sNeq8MqHo/JeUtsAdumnN3ItQHerXZIplCAT3T6cOA8gKcjLZUmex7c7sEjtTA0Azv048zZ\\nGOb8+//GT3G2O1//2tf5qX/6f9rf46KhWexLa9zOkgst5d5yK8wbjnEewg+eTTK7tp13GcYjUt9v\\nlZZvdHFsi73RVjQ5nruytV1VKL0hQokf31nAgi8eKgHeQtbeSnnr5ya63ZeyzeaVrMwdlV5Mklxt\\nM0/VAl5LVu9hqu4Lw1YnWpL4ljbpAW5lvIUiZjKE73u8JebFVXJBNu/kESL5pUYjXk2pDy22zXUD\\ndcpouxUfbY9S3g0ROnhb28+HO0dAP3SJCbwNWHEtuM8kw1kIjzjawWUTr6Q1eCmNTXIZtz5Y6dzX\\npaw2Cg/Jna6v/0NE6mKmkk9XURWslQRy+M1yrPS5v1PBSUczPrXFs64txzIaARX0cjDxMyyTZcJr\\nrggeCx5ra60LlslxeeXSIottNOgpPfGauA89VyRWvqWWkk3adqM+L61W6lTb0Xg9D6lDTp0Ns5zu\\napEqB25J2XP4pdbfMcwFIjrHiQ3l/7XtPIo9OshSDys1d7FMS6+VWs4dlw5ZoV1R1trSs59dh/Su\\nuwB1Nk1HALDdm5t3MszE6KWYBldKSHD2znUFgYD95iEHpTs5tRx+/GYr3dbUJmfazjVKamqGtMWw\\ne2ZZkuZk8Omh2OVM455JKydc1asPtUqN5MUk5TILquk2Oz246PQ5se1/7tUJm8RS27CacVSqfV3a\\npMc0oi5ibTj1aMxavNhgNmO5cV0XxqBbV6hdTdL2BjN0PfUNtLGUste3JKINbacPa6xZzDKWd0YV\\ntrfxzRvHrPeHxb2RTUnAb9/8S9y+NvjZn/nrfD4WMwaMzugwWnE7CuuNTG38WzsYVdueq1muN2d0\\nVWxHV6t0mfSQjtr8ufQwWggDWLUYQwaL0QQQ1zyX9zmYqWSkhfE21VnMacx4dgwCnFwhudCaQeWh\\nwzfWhpAE92tgPrnvnLd4SMvo3pilkM4jtdU2wCLFnTUZK2wpvNPCYC2uh0wfbnC25D59j6oECLI0\\nKhqrJd0aZ+sYE28HZzs4EavgeBXar1xgpV4K5Zlo22LdNNdryIXY9MJSCtNcq1gTlhfr0qjlmfd2\\n9EHlQ6aGgBwyejQ2zJwiUnPJp2EFl0szy6R5TqXI9jTo4Jncp/57JLyhIt+8aJWQsgSLRNzx1EiG\\nVsSE1gdFcs3JKnhL56opzfAj+bj3BNd6UuEG9wyc4krJ5DIXawm36ZZ0bxut6Zy3kjwPKUys4NZv\\nwo16A9f4yb1xmjrfqsLT5L4cDd+QJ9fgmdaL13bSxtaGR1LNduBrEa738jLNa5trl9N2cKw9FxlS\\n0VGh/x1pkRfMzifkMuslFZMZeNuF3F46t9S4pGnXyGqOK8ACsyHBa2taNuLEVnDNuVgoZWXmdy91\\nv9oGfJ5qRdANp03mFtFfqp7SXIevIR/+rn7e7o1qk08TrnWXC2oqybRX0qprLjr1xVeltq0p9iYu\\nUMrM5xZb5KqRThR8ui6SxvVYglWUHE+tb3H/alwuOtIKaHYw4846G9wFu34CzpcX3VwUpt3qx76N\\nu+85o6vyNFvY1HJvVWEbjE2ERnCj7Xlh0geSAGGMo/Hhtvi8f5v88JnkTp54lzX4sNIMqrlitT3x\\n1rhZchz+Pt7zveVO04JH8iQIAl/qRuhOdDhrzzGReN/RbFx/npYALeFi661rNeYK5pqs1ogHOyrd\\nYSMnVySPcN4+GRGLqzregkhnFzlYU8LAfYpbSwS5l3bxZmpVlxM5oSRxCvM9x3eOGxukVOROGx7e\\nmG6ce8Ztw3gh6E0Lzv4y+DA6YxTtkH8eoLqer9O3e66Cc1tGc+mlvUdyslOUE64tJctK0p3rLbiA\\n9RDWdO3uigp6SzVBCeTFW5hW6HR6myTqEEXmW+Ql/GG54ZV0DpatLXtMjjFkVwc+Xktx6VfR+6Fg\\nTZcq6GjiWc8UES/cuR53OvqMMxrEhJKIf1E8ruRuDiE7uflSYTPFptXWf7AiOI+idwNLjjJeT+fA\\nuJ16Zjq7iOqi45kZfTTBxVmbbbIVPxTdxMN9Li1XTMKMEYP1lNy55szpOkHL2g4RrV0IalZLaF/T\\n3Ombj7KWqtPusp63cqYJxjNcz6613FpalyoHI01yOYG4igdFzy0LlVqAzNSieC+X7zPJa/HpIZRr\\nlk6MHr/JSrd3zVoiQguugmF6Ab3BzIVX56pFxeDBXVvzi10Vd4iJ0QR1McWGmPsOjBPbgJKMLFvD\\nS9xPW0mPEmeVEPimNVYsIiWuJkS2nzNp3igculi2YY3ISURjxSTjTcujaTy6YUsyrjKNNPo4uM1O\\nc7mJTgO8yKZZj5sORz8aLwfc1xTqrzeuCC5zsMTNubXChqqhP/0f/EeYwYcPH3B3/uv/9D/kD//L\\nf1KtG03DenNyitnp8D7i+NAkrKdp0WT2qySIW2HgW3VRaVt/6/QoWgbXKCy2TdjsV2kIn+AdXRyF\\nlAuR6mLWVbylZt7Fl5UAliwL3lKw8BlLXUOwx03JaIW5DuHr4TLPTMWexDYSWBUxi5WLCEnGmjnW\\nNJcFxUEd28+fj6If+jyjO9dMfDg9FrMrJsjDmZU7TvyUSgFhCo+ulJKsJUzm0oGxTHrQuxW2tKTl\\nUmWVKWNQLF0ykYt5h4973mTmVN5x67QReF8c4UxrxB4RXJci7a2CmQ/Non3DVwzG6PRlRC/yIe1r\\n70pHTmsM73x+C1aJIvYgBbYBWgt2eaFE62y0HpDJI53YS+/ujVyTRxbzAqtBZMCQxdeXscak7YVS\\nrs4iODei1Uyf6zwHp0HrncxJJ3EbjJGcrUmpcDba6JyecCjh2l+NuAw1FrJsq7WwbVRp4CXSHVJB\\nKZU7GFbEXDx8d0dZu1ORoeZpdorN+z5dZLhrBdV1gR44yltQpqDh9OFbiSUpXjHEd2073dg2KCth\\nzSVlTkIuZ17J20zWI7nPxX0rnwJoXdCr7/bnK+N6/vLPL5Iip6qi+6UnLgPCilq2yTvOW6o1vebi\\ncSVfPKSBu5Yo7QdsyYvE2+0ppRnOEcl46XgIuiLaUMdN9CGqtp03t0RNVDLjyxvTlinQkMAZfLoW\\n5SI/PS5ntGBt0n9GJ1lUaE7pAccIPv8w+MZLYwxndDQHLb0cM/dDkQktpRAouTYqnOUoF2tDelrr\\nVAU//mPf4Ps+JLfXG705X3z8yP/+l3+FR93kjguR7L0ks7uZfvTeXNCTpoNW8jZJZSK3nrOM+x3e\\n7qEX3ROspEXNYhwbYLPZAs2ScXw5U1ulJI37Hb51Lz5+sSuhTGmSS1AQkBVXicPJDLhs8Ph451fu\\nkzWLj/elaoUmjTTOW6WSga1tsluBSarjpZl8hcI9rTlOo4/g8CFN89gb8ik5z6Mg1rsgjr639AP4\\n7KX4ns9OfvR7X/jGh8btZnx2dnwUzKK6GLlVO1ZoT8jkItoX195O2obar0hmFo+HUhy+eLv0/LHl\\neDWY8YZVJ1Fi71zJ47GIcj4u/VixL7ZMJcymS01BbYBUGWlOxGS4VEFWugCtGc06R1dYaDP4NBca\\n0unZ+eLNVJ95p1La2EzJ3dydTOOLT4svYjEvKJyQ6gkfIJRmh1JCBhWyhnfj5djql6ZxW5nz0uFw\\n7Rp679xujZuJ6Naa5KX0pKUq07UalJKZWxPnQ4Qxfdevp5ZnrYm5sLapqpYx0dz8qbvVGa1lHKaq\\nf3S9l4dLITFbYyQ78FXnkrttL8GOan9OSLf07EJLwpYwXQd8JjzmVDbiXNzfgk/zwVqDR+hCiAqo\\nA2zSR6M5/LO/93v5Dcf1DHdm6oVYS39BPe5aDszkXeJxlzZL213X0PuL+8WnaTzmpNH4/FVZVo8I\\nbnTCBm6Lhx3UJeRjy8QiyDKpJt4upTlU8XhTKf9YCy+1+jfrHKdspWmT+4KMxVzKLvuI0UdQoZt3\\nZdMMZi7BWUrSn5fGlrUNjrPx2ovWG8eOoekORm4lmjNMsc7DijXALbCn79ocs5B0bH2k9Q+YiVLV\\n+uBn/o//ld/yD/8+HfqlcM61r1ZH6ce/egv6rHCtnm1vvUeN08GGiGXNvjyVHyXO6a2zjSWFgjc1\\n101jX5pwD3hcSaRu8TDhFpMNNbGQ2aU1Mpva+fteIhS8rVJ1tWIbPra2NNiLUrWjKyRhCzSqKfV3\\nuB9qYz2wHPpOSh/ygdNz8hZ71JCTpDOA8IQU6Wn4kMljFNaSjtIw1gSQZKhS4/va6NEvweLABsZI\\njSOx/VV6EWNT5VZ1Jgtbu/L3S++FJeViZ2QpJ8vSaHFh3mihEY0ho4ylwPDVhDa87eSDsoPRJJvq\\nTa7CyiRSIKHRGq0nn3Gywnm7T745J+5ypmlwHu8jM3cjljb+xmYj7+cnTUklcnq6dLzmmhR34+VF\\nCMyXNrbSQKYNb4tmJ8eBUhuOJm3ti66j4Q13sR4qFWx5HDCnvv9VqqJrFMOMcRhj2LsTM6o0pjRI\\nX7CcNFkPJYmThKt5MM254VxXaaaNCpLuJbXKVkj0jUe1fdhKIqY5saR3ss3fKdHKEtKNWMHaVuiY\\nRtbAYwmriqSr2Q4KeOEQ82F892P1Kw9d7ZYFBm5NEphcehAqO2YL9g95plrINbXkyGsRGVwlpJuP\\n4Fqd3thtI8xrcZhQcLG0vV8kvXUlVpRich73ySMhHgpulDd60poTPXhjcrSOl0EJZHKWc3ejx+L+\\n0fAun34a3K/kuoLvLLA0rD+YrQt8HJMPM5hHY3Tj9TSlWpg24B2Bfbx3xpIcyh0i+z7NNKsdvg86\\n4Ft/687f9QOvPB53xmj86//av8R/99//OQzFEnkU0Y1aztoW0LGrcFBb5mO3QrEPiXIe+/doVjAk\\nczFvm05VVJPmtXUl4mbqI7K3uJHwNou3K1kpWdThOtiP3rlnkF1LNna12husZRxnqHu5kKrAHorW\\nSSMfye1Xka7uU0s9IUdrz93kqlKcVVDZGO3gaOqulukCPmg8qmiIc5sM3EPZbZcOp9ZFbvvaoRid\\now2FZW45UJXmeVclI9myQ1X7VVt+VxqltC2Mf8QST3gFlzUetRTVfjlpi+qKRSo30hbnOLCUJng5\\nxKVDcqbxclN3+Ci9URFJ68HruGkc01E2n6nzO7vmzioUBCZae28yH644+PvFF4/JXMVdCC/N0pfx\\nKBG7nnroYDM0plRS7k0z3T3esVj67/bBeRR2KCj13N8PtnXqrXhpN44evJwHL66O0L3wOGgtgImb\\n07OYtlVHKWZx+dIiqsFpLvuwmUZ8NfaYYHffm9UrBrbW2mZ6BwLJG5sVyxRG66nDUSWhRjiPKm57\\nVPR0a+rd0d/rWdi46/dpyR7TwXxI+bGWEkEytX+4u2FX0k2d9c2blrFNTs3j/NsWuL/+Q7dSFkie\\ngYcmGZYHO1hQUpDIJG1t8IOG2NMU0RaRUgFMJ4ZxzVBLE5OXYzDNoJKBgy9GnZTJQOErBbtxx2fw\\nyGLtdrdSi6fH3qDXKd2nQBb6YV8yeIzO2Nluy2DOUHWXk0XD0snLVZUyyWzMV3idxXmY/NY4R3Vo\\nQXij246P2S9zzE3Ld6dZ0IccKsfTzTNDqocsXoZT9cDnr2DnDyqNNI1j6sUIg1Gq7NvYHIQyJRW4\\nbuUrUcLrVpBgxrkTMMogeqc3KRkoxF3AqO70az94pgN3LrVYzOTsMH1gkWQG5zKibQpbQU5ZKKtP\\n6tLD9no6EY8dXokWim1IKsZG+VnwCXuPZP9sqCKfJb3m/b4BJ5SWNr0pb2+JD3u0rkrbNO7IcmrJ\\noBJ+x/zGaJPWb2qB0W9zugwU3bVtt+f7UEosewJh3NTJLQ88NQYwmkYp5eRUHp6b0bqMImRgpnSB\\ncdwwlzqjqvEpUpClDMbYyEeTysTMBCIfm02BFlB+dmiLD/0gXBzrqTucXsY5nGVT/Om8iJ6sT6KC\\nVSrRYhvmtyywAMnpzGSPb27M+SDqhCiqd4apOj8OZQW673agGeGNsyWHOTPhBSdtctCJ/LKoGFu3\\nb6WxTKQpGTxya38lmTusU80ZpbGCI5MQW/ZlJqtwkOJgpCKgPFydEBr36dAMAieXqaqfekFGU0LJ\\nbHCknu3pxllbs972wZrS4ZZrZ1OJzpdK8iFlVaxkXs/O21mzOMoFx6mgreDucKQzvEFpvPCbOnQv\\n1xc6NQeHGjSbRHdxVAkypg7agssa9zWZVzKXsUKj/llb/2rF6I3beC6Iip7gXeBi753baHp4NK7T\\nrYMGNIcFPQ7ukWphUhZbKdbkQFtorhmVpOsx9NH59PbgEcmnTOoyHvnl4SNIefApIK9kBVzd+fxF\\nRJZHJJ+dYh6cxyTa8Z7/FZu6UrnzpfbMyUwb19/+u38ff+XP/Q/88re+4PXlxnEcfOtXvuAf+T0/\\nzv/2F39e1ZHDHNLEOsYDeNl810Lf/eXyxR+a3bDH6zj6e17AEYLKVEvu9SQXwNw25HkvPkW94xAj\\nJDPThl7QEdtOOnBWN2KJP0EVk+Ltmtg0VoM1BTm31vhwojnkntMNV1WVe3kxunOlLrBWTSGLS53M\\ny5DESIYbOXy8nBqFVUh03jQHXEuHpe2/exsH53DOc/BywHE7VD02sSOOLpmWdLr7d5khzemz0t36\\n3ZbaVtcaom9lYaG55UsqIPKBQixxsXzHFqwaSpTtUbyYE3seHSGHEwy83RnHoD0XQxinH8wGZzXM\\nBmahS9aAXnRcS1ScuLRLWStZl1SrZ0vKFi3blt8pVgdD/OOc1CVLc1G0MTbcJRmVBI2QF1gJMS7N\\n87WcxsK7wWEyFKE5qaYYofdrNcKVsJLAtTXmfe8WKvW7mu8A1gqWqSPR1FPGggKstIiqXXE6hyR2\\nqUOxQjD7quu9W7Gnac9cKeQ7FGCkTtmg9kC4JA+TZW1fwKZ0EHTgztL+ai6TeCBtF56C/eBJuUwx\\nr6aLKV1dllswTuPw7x6S9usYL2iTS2jxkRjLlJFUqeVWuFiJvVIc3O3ESYK0yayBJdgO+nvehjX0\\nkHuH85h81hp+HJQFrWQnvXrx+Fi0KceSIoJ0w2QzztvA+6K1G2tePNZF0nC9PQAAIABJREFUPgxG\\n14294JGLWELO1UxON+aAz6vzWKoyw423Ms5IWIad4qz2dOwONYpJ51jG59E5TuVJWUm2ZS6Ed9vm\\nkUfpYWgFHz+qvIoUMrGqoDn/78/9ArmrtufBBGp1jyiu/lRNqN3NLAjnYxlkaDa3HTO96aGiS/Ct\\nBZXasOmqQOdKKkRNkwNPovVAiRdrt6JJCfATWhba/lBzzi2eV+tdSyaF+0NSmkVBN26mVGeta4zH\\n0pLDSpV/SNxEhWt05aIbm8WuBjWLWyxS8GKJ3XPSwmm2K91KqnWOKG5evPah+aLrGWN3qQqYci0S\\nh4w6hS6WldvKXFpERsauuKSHNZRVNywIO7jmIqZmyQeduRaYc1TS3KVP78bZDXzxsRqzh96Pvrgd\\nN87xJbC/KEYzPrjA2Bnaa7ylFqtr85hDlCBmBldAZMPL6MfCouRN3lS6yC6dbNXO1LAdCSpHoZVG\\nTO0c1Axae7KoL8w6Kx1nchyy9GfosF9DC7QsLQazSmkWpgVzhAwv3RRtUxse5S2AQWtKJjbruyvU\\nnBlfJB2yYwN8qZs2L4QX1DO+1qJQQZMp117rJh6CI4VPtneLe2iSw9BNxGOfeMeyd5qeng9lJ15T\\nhqdIzbX9fbS3ZYNNypHDFc6AJWYHfScmmxdjtF8lyfwNHrrmciXZzj0z16HUWqNs4c2oh+aBO4kH\\ny07vsWHM2upZa1iDYYtjHJQVty7JR++2kXu6nbtJM3qlEgpah07QAu4la+DNOjmc43kq2UUYHNX5\\nyGTeJ82crOSLkFOo0vAuK9+TXRjPSriSI4OVjtlCMP+Ddg9iOW+zwz3oLbifjdvsvJzF8BKdf0fF\\nzEsJv+Gii60sfvhHfpif+5mtiHXn7e3OFx8n5rbtixvGkV8iKguJ7Nmwl9xtz7OmutJ2rprypDy1\\nTSbh0dRS22Y0XkuA+GsrHiphzcSbNr3r0kNVKD69SpK/DfJSBWIhGM0KHo9khjPX4i3hftfYxk1O\\nwmwd94sFe468heQuCZYgMuwLa6fLqYfe2t5toU1Bur3pBd7CDASMVgjlcHvfsuNaQBqyHD/18pjc\\nbdVV6egr1EjrKb+Lrc81czwFZPlyErH0j7tQi6MCwU0Q9rDvz5ViHTcflAe3jdv0CTQtS19fBHN5\\nLka7i1MRBQo4kvMrS/I6gfBhxu6TSxfqytr6dRU5x5D0ME2d6arF4rkI1PtpppimXPvyR+XvpbNJ\\nunmPjcvs0ueX3ttWWgTepxbhqxTSaMt4aRoJUWI0V+xUCMDcaA2OksGi3OSqtNx687ZpdFOX1rVZ\\nDi47eZXGE2sFs1SY2JTEs/nBYNI28Ma2JvtEJpdIcSy+2H8/S6iZcPr+zaU2mmWsmcwZKkysYGvv\\niySr473wdWHuXLHoXZS0sQ0eUltp3+PP0/w3euhWCEhz+X6hUkNtSs4VymktaRY8wljXfF/+dOCl\\nJb4ziW+jOHuX9dMgZm27rGDnbys4B7wVHMggUdt7fRyN62Ewg0yJ8MudRyW1fLeNxbK1byote+5W\\nrMs1LiDkJbeU+6c2aKlriSOt6AZlkEwUz7NykPc3osQk/dSDr3+e3G+dz0dyeeN2yDNPSgh++F5w\\n9cW/+Ef/Hf7M//ifEwlffHFnrc7HLy4yoa47l9+0Aykj8U3dUoUZFfheCBkio3WTNpaCmhNGY60m\\nzqhvSdtzLGFGKyWgFtrKr0v5dgMdMIHaZgFngNjjhU2Us20BvWryKWFWssJ5rCKXfgtD0eWKeIGo\\nzWW1RtXcI4iAZVxv0l73ENu1trU5qpQq66ZsPZxHFedltCNZ3vEhwPfRnTbEyv3Qjc/G4LMbMkwA\\nUdIdryhe91Nuoc5BCpaiaFBiEHjCclU36SH8HyLU5b54PIv7nDt8VTP30xwPYw3FEl3mnLnHChOu\\nSIridpx8OHnfprs3HKiSU26QpAvqP5fa2kXyNi/uj05FcpmWqHPtCHTq/fJppncqVwh4HikZYwZX\\nCD055xZcNsdMKpSVQTNhRb37O3QoM/AlAE548TGNdsl2faTA5KPnpviJp1zsy8h31eemZOFmuiCb\\njBbeUlWtCTOgZZkWlu5a2LsZ1QWwqpCCANsRWqZRjoI8/V243nHKFQLbm377DCjXd0ETtGif2cKX\\nRrJWqePd4ZsLOSnbXpcMT1ixx28C/3cL2pN3nRe4TFnH0Ti+AjP21ZKxLWaTM0e6zWbFRAdusdRG\\nL32pt9chWO2nZN1OWpvkKeGyAQ0Xexa9QCNRrHE00pKPoXC6twpabXeSGVe5UoNZ1GVKsGVt33QT\\nCagmzU5eXoLHffK3SvEy8tNdkEo8KC9myWVmS/OlQoeFmwDKLYoJehlr7RlYMJrLnAF8fhnrg9EP\\n6AIL4yVy14mLBdCKH/9dv0MXWMF1Jdd1vX+/y+RwuaK+XFoWVEijmlNymUmhhISgegMC75Jz0aUu\\nEW8hNNNFvINWyqbyCiKVfLCmDs28AttxJxGCvSSK22bDUrSsdK7Stu3xttOOo3h7gpv92a7Xu69+\\n5q5kt8qgEmIZ95XEDusMwCIZrbOiOFoR1TB2qx/GL//yN/lv/r3fzw/9yG/j9//x/4Rjv8S3UyOS\\n29Z9v74e9OasvQx5BSbQhrHqy5SDhS54D6SR3RWvu3OYOpRmLknZlPQK06JNFWUJGD/FJFiVzA5n\\nOg9Ta/zmRc3YCSZiC/RSsjK2oDqxLqLv4MwC8y71jnUeliyC6568PTTymPG0Y2uj/ulSyFDz5LDi\\n00LLpUyu0nc9DWopu29F7fe3yyZfpfDW9rSFH1rB7X+OKaNvVmc+ci8JNVfvNyOGNN5tFd/xB4cN\\nWpkOKKQW6da4jcY55Fg7DtsLZiXyzhm0Lkmf8Ry7amwUq+89zQWuhXKurs5luFgeJjeeR6MGuyIP\\nsrU9NtrdTKrgINjjDhSjFaVRTUjKWSmlxdGMXHq2b4dpONWNvur9QmnC1EndZcc+K2XCaE/c6m/0\\n0J25g+gCSL1sVdrQB/CIRs1tQiCx0IzWb/qAj+Y4J3tXrOXLQxE/cYdoi+t+4GPxOclAbaDid/Rj\\nLApsMmi0NrAXY2XInXaXB/1ugS1VEXMuzT9TB9Bahdlg5l6wpaq3eYkWVCbff6U2tyOMRaOxuPcB\\nd94/OxOO07nm4q2MKzp+PPCURKXX5DyMT944DrByvn1/7L9J/Zrv93f8yPfoX914xT//V36eb9+/\\noe/gGlTBoxZ9Cd/Xd76TN9tLCi3BbEvANDZIohwcwpxCeWUVTkzNgK7cjIhNZtOLyT6qdn5WaYN/\\nZRBTOmxz+fcDg9W5qrjmUnAmzg1YLSkWUZNYQ/ZjU5rHcIPpYl4sbfrWFDT7ys7Rk/jkWJfa4+//\\noQ/E/ef5hf/7l3CCys6HQxvvxSSRg+00gw7XlISxdVcFt5K1Fx2xK9CBU65L1F1JDeap7LuUQHKl\\nLgpKbblMIkVVZ6aysGKHQOo/ZrtlN2Iq8ijXIqtTLfhYyWc7VXeU9KgNY5rT3ZldRpdYwZyJLfE/\\nvMuAVCRrBvcdKNAIohoRxsdplF1QGjtdS4m+eWgZVdmINXXibFdgogKh4YpZQgvNnhub2Q5qabls\\nNEZL7Qta8JJicDxmY4wkZuNK+HBM+jhoptFDH9A8GP3guJn04o6CITHMnNhQIUxLUkfKh9qaRhVj\\nYt6aO9a0GwChZYcZbNyiu8xKGUWtIvtW5WTud0wznZhSrKxZ752AhS4WSs7Ktu3oVYs+tLhsw4Qy\\n8MD74NiabjPpqq3pjJtfIV/46jRgQxE8ezNZe6NuNCqCI4ZI6S3ISy/lzdSmOMnr7ZWsxeNefFrG\\n/VFYTkiR8mMpuVRGgz0X29Kn3p/yF82bsonFsCLA95drcF/OtR48ruTjAyIWczUWDa+gdznj3BqP\\nmvRqEvv7tj1emil600NopfDIK3aSsTAXtBq0HlR1AuORSSM4p4hnVRc2Bkby8nrx9pZMM/7bn/5p\\nzcHWr41mri+3Pfzhf+GP8M3rJj/8Mqon1yO0RT20oFrL6MdmLqwnAWqzbpcqDEqjlms7wKqcx/J3\\nQHssSYsec2GhxcZjnzBravG0ix2YIlYxG3ktzTpbcV0iT1mJHdHz+QInK4yaxaRx1LY078RXwpWB\\nt1JWTELVUW1CWBrXIZxjVuNP/bE/yB/4J38vf+1n/zo/4G989M8FLNrz2HPoN1hN2WYvh7LYrGRk\\nidKyppVvpYmiV4Y5bLKUbcpdp8haLDrWmlitO1WgTPN2q9pGE3VpMxbujUclhhxmkmjJHp4zNSOO\\n4u0o5WqVJE5nSM/9WAtfApg/atuPmZqFTudTASbDipaTMI5DGvgEb8m1DoLJd95CelhL8m54E9xd\\njkDb+myj1WTa0O9njcilDqlqz+aD3M45Ww9oJyuLk0YdsunfaGRNmg8+HHD7IEXCy3ly291I78bt\\nJgh5HwK3MZ8mlD2kT9cs3gPZ/ZNYjeVKVu5lu+Bguzb13D+H9sNM718YqwRMSqAeKPUFVcWUgix9\\njysq5Lp0tkKuij6296AcLAAXsY5Oa3u53l1pIyZVBk8ldKkr77+2tvo7O3RnKiwwluyu7Hms5jAp\\nqU0ZHo3hmveuJefHOJyq0BbY5GG3LKpUBVYWfrjSOVdxR1t5WwKWRIRmX470eyuJZuRUu3BlIzJl\\nu5zaPlYVX0wnI7li0keX1CNEvm97a3r2pplrwtu+mDI6NnRD2jC1U6n/H3M5xRowesNRrpMV0ITI\\nW1X8K//U51/1lf5t/jj/1U//F3z9t/0h3mZqNlaNfFz7dja9qE8IdEA7nCNR5hVFzMaywlKb5e7C\\nKFVe1NJ3HmuRUzKlt6nAzbyCZROWcu6uUnUYvjBvUDAQV+JCm12qK1CQRgunW8LY0jWgllgAZPLW\\nEpsC12cq54pYsFN8e+/KQfNGRmJrqwlW8fDk0y/+ef7Cz/wgsT7xJ//Vn+Df/tP/J0dbXKsxbOCe\\nlMktVO0gc9J6o/XOiebDbSvgI9fmp25QURYcKh7MdNgsBGyKqcq4trZTAzH5sSdws8ZsIsORygQU\\n1HvHyJdm5O4me/B2mT0jp0Bz50eqKiYUERMhtYZzkiQ+Ak9o9mU22qwGpRbXdxW75uKRclit3JK6\\nclY+aAdY6CLO2MtYO6h1qdK3LUsjpR2urfb1JSPF7WBsS+9oxeftpDXhMrsfnDfj5XRuo/OhOZ9/\\nNujH4tYFtOqjGB1aKMHFXCqA0bu+467P9eRIELoMWu3v3xWtBBeR2hX0Jj6DpVyUzUznpBm1dcZr\\nFxkijWmUk3GJwlYyZ1kEc2rESXuaiw7KlVirA1fnSR+w9Ta4K+HaN2O7Id1adX/faf3//fnqjLTQ\\n0sEstg4OzYOIPfcLIEk/WHGnaFokVcktlc68dmvWgkZnpRQBR4dZ2xLZ5K8Pc9ZYimPeTi9KHN5c\\n7DA76UXdAivn4fosz4j0DsxNDatZLHbQJE1pEEfnRLjJKJcLhZRIHAEy1twVTbrIW+ih10EmduzK\\nRVsavg+HeFfF/p39+V/+ws/yy4/v474UOumtnpKB7eASBISnA6855zKunliAb7HXWrm388W9dpSN\\nda4d9LnlxNzn1NiohNucAW+Pi47m6t5y66uXWt+URXTtZ2Fl0PZzsHrSrO2HfrGmGA+r2a6ugjTN\\n7YZLY2ptUIh3sOZeUESp3QQyg2FaKN5G8Iu/+Iv84Pd/P9/zsvhiLW7mvB7FrTmjd8b2uxOLelLV\\n3LCdimwZLHzDvzdOMETHsygsjGu3lrE2VxV7r2QypR83NhHLlSV2870ss6C3ttGaSkEW1gwg6P2U\\nHM61NBabVtK8WPp+PIzrOVcvLbKiBpXGYLHMeHnp3K+kLbkhlcCwwDvdk6jFI6UL/v9Ie/uYe7e0\\nru9zrZf73vt5fi/nbWYOnZHOYFuF0hLUppSUt4a0sUYphZBGIUVM1KKoaSs1oQVpYkOxCopabLC1\\njBWxMCAFNZ1BpBXEEDogwkiR6cC8MWfOmfPy+z3P3ve91rqu/vFd+zmjMnMM7MlJzuT3O8+z977v\\ne611Xdf3+/l6DCIVsi0k75MhsmiTCqka1inPVItKVaN5cLUYVjPRGznLXFFyZimJ+yU4roXjwag1\\nc8zGYU0clsxxzVwviesD87uboPwJD/ekRKNhmZwGHaMWOVhzlSLF+xzk1SErbihnMWcnpUVutShc\\nYsMGwebGmnSAypamyMNJ6EQ7hpCgXncqCetNfzq0PpUJjbdADwias8Slz8vFwZco1e/0wcqpEwfa\\nimDxyzyQfrzXv4BO19gxSjiK7dHQxru4B70JlZdwjIqlTvLB2WSRbUM2OslSdIqw5nQLesBSg2JG\\ntgrZJ3ZNNJ+RBjaESRwfdQGGB8mdfUaa+HAtOK5yNwIKBSuz0e6QSmMwmatToxo2nSwuoHEKwUTU\\nJjJu9j4HLur1Rc2M6Dxq6pMdFsCbTuN59pc+xuvp130CL3z4g7/in7WXX+E87kFeadlJezBMkjL1\\nmY2GSZJTGuUMYxEAJaWLv1xa3jHdaYRx6oOIJq0vAzfDhnq/YRB7JkbDrZBTpY8uv39If92bc4pG\\nssw+KxZ3J3rHUmUtxoOohCV6cjaHakXC+dQ5u/TSeahnOxzIWjSwTCrKw+rTddgDjihXrddEHSvL\\n0nnLJ/2rPP+h5yhr5vbnfpSrT/5Mbe4Emw3Mg3M3lmMifKPHqn50KMI7FbUJbtrlQXFyDhbL7CHV\\nhZgOg3DhHpu7TvBms6IJKNy1KcpxSvHMOYzMzQh6EzrRu2zKMWEz+E6e7TBdg67ngJWUCplOD7tb\\ncMk6pWaTfjUdEkcP2m7ktbMnpbKYQU2F0zws7BFY7njLRFQSwcl36ihkU5pxRKOkxDEnaXrpDKu6\\n75OGSEvJrDk4XlViOORKCjgUZ6mZ473ClQWHQ+J6VWthqYWywloTS1Zv23iV1ZJCn92LWhxlnl2T\\nC5upNk+QitQe2WE0kdgSgBcNa7W74iMR6DSabeqBqypsJh4VwLqTa8whurP3UB99UUabzwNdzUZV\\nPLf6xgDMcNmWZvagzw1dLQ6xQTSYM9JdL/uOzPOrXnSTUcPxWeLKKaO+WG95MhPUm1oStKhKAnbn\\nnGQZdWBcBm42JGntImq1bkCj1qTsLlOawIguUEfPmE3ftjt7UvxK5CkY74YPDZVGa4xS5w432LdJ\\nIjPDUuUqJUhNoB7U08muAEJZVsGlEpe10hLnfslzclI4p126SrzrQi9GCdmVN391hzNgWY78ue/9\\naW76fYzMH/mCZ7hsgkuGWjNtOF/42z6LP/89v4CNRlpmwvKUtGRbJEnB8B1sh3EIzDujC9ITocFQ\\n77A19aF8Cn9j3qDDLsGG8zNusnSTsnbqqlOhgkUv1m/BfzyaTAp0PAyvlRXFF4HULDUS2RcanTUn\\nzl2sV5lnJNBnDLaRJRJ1LZsKJKmY75ThAh9VYxsbK8ErjwZPPvkktzePKZb53/7sl/FV3/r/sYXa\\nWKslRnYBX0xtlLCgmcAoxdEiH5DmEInkZNeAEEt3xog+gSwpd2lHKeS58MoBV0ho8GhIqdFRDmBC\\nBK3UOhDMOGPdC9NphjVwxf3YhC3o+cyUmmntTPRMcuEdBefuJM8a+pXEuU3+rcmibBgrl0WukPxC\\nhpPEb7FKQvHpYXBYqt771KpcRcFXY/E0o9YVU3+siaslYbYIEuPGUtVSuJcThwcLTy6J4yqg+rLA\\noYg9kEy/YSS7oEjYDYoH5qp4PCfS0DVcmBLkKGwhXod4HJKcBUM6eABriuXCEJYAcCmGIuYCjclV\\nFibIfAQnb7KUj4TnQW8KyRwxw1zHmJJBrSmA5KVpQO4iH5rUKEaij6H/rkpWuM5Y9vLavYN/AZ5u\\nhpwLrcnsUC5kdO+UvGgyPXeXFhretDHxf00tgdalftAJWU3+VH3yO6U+OEXmMOCcG1AFkUa4RZun\\nkSLzD1uaqamutoVfyiMSe2u0yGwdzvSZXS9S/jmCOrSolwwnZyYWS8HQLxPRCPJlMpn1BR88c54i\\nf2Nw75DJlqm5EzHY3HhlC77+r7+XX3rnT/LJn/7JvORX/OJLcoZRBvff9Pm88t53AHB1/8D9q2sA\\nPvChj5DjZW7iIctp2hoPusF97KRRuI0O1nEvHE7BaQ3WJKfTWpwxqtivOTH2cSeCx5VeEJ7wo079\\njhPZoYvXWlHLIBbDt4J7x6zLnx6dZEbNaPLdYQmwojZGSjNyJ5yC49P2WwKWXNhGYo/B2IJbV0Cp\\npSw9bQgUvyRn5EzUwtIb2wBa5Rf/3x/DI3jhQx/CWyddL1xfP8TrIHqC4eyW5oMsRUaNoDbJtJqp\\nnMxmLDWoNiiLdNg24UIXaymTCTFSnmCWLMdSllGjJVjRSSrsMrSMi2tgDnyTZGHpohOWoy2iq29Y\\n0szd8sliOMj04JuCE0mkJeF9up9KEJtK3xGFjCRWay7SuJckHaInjouer3N3Uu9iHvRMVCPawGl4\\nHhyXlTqHgtelUHNAUupwjgBWam5EyJCxFKOMTF6Cw7FwqM5x1Ul3KZBLZ7XMknWQKNmIaRYpMTmz\\nQ4Q3knS+NaSRGUmn094Hh6Jntma4EBG3pE0UMm4yAvmQO5GsVsKSZiuoqCrsQ9/jDrStKfvN1S4c\\ngSoEFyGRnFmLBq7BrAJNECYMmSRiEFb13UzKmWQEiVwTixu5QC7CSuok/PHX1Nf4Y5SphRiYIKcK\\noThuZzp10GzER4ItROfZB3sbtCYavlUgm7SlaKjgScqA1FeiJ07J6aOwb2LwenTO+4nRobXOGTiN\\nwe3tziu3O6886jzqg9smEfTZHKzg3el9UD1ztUjPSdb0fo/BTd95fNaNRSQ8CebRRwhog7SePlAe\\nVCT2Js9/ax0fKNZmKCW1DePl085NG7xwu3D1G/9t3ndzzcs3xqOz8ejsnHfn9/13f01DmQS1Vg6H\\nA08+/RRPPHnNf/tVX0gachSRMuyZbTMYQmuObtycjNMpeNzhfJbm9rY7j3dj7zutNdp+pnfn9Fj8\\ni20ftB2YZXhkZ0kXdGDiLjoxF44YV2vHsnp4GByWwlILuVaKGTUHSxVM5dJX63ubpwyBicxlCyUZ\\nV7VxzMH9Q3BVguu1cLiA2RF0/XZIkmMbAhClxHKEf/jDb9d94junbWfJiaefPPCO/+lruT3D2WF3\\nDZC2FoK++LzOrbFvg7MHW8RMpEjkkKKkN6Y+eej7NUVy2yRbDXcxb2NasYdLjzwVDFhQFmNJeuAv\\n2t5Ikj2l0CkVIKUqJYN1ue8mhKa1hkXHS6FbxlOhcyblTPZEiawWUi4clkSpiv+2gOuSeFgLS1m4\\nvjpgFiwZDguUVGmuzdtiQE7kZeW6rlyviXvLwsPFONRMqYV7tXDMhftr4Yl7meNauH+oHJaq61g1\\n4OvnDRtJBo1paDIzqIJ3++yh55Cr1LA5A4IxA02WuV5UpDpIhEDmBsca5DU4rBfmLqRw8TVSmVWi\\nTXmZDAyRpXTqk8k8Ouxdiy9JZLBtjMmk0BoVnhlz6OYjOPU23a8T9ToHjj4cSCxC95BNCg+3Tq1Z\\ni/dUZaSi03mSDPnjvl7zpLsA5+z6rDH5AkhEXkypo+KZTnG/QVkqvQ3WlGQljUaKRloS0QbLsnLG\\nyD1gbaRmjOq0Xf3a6IO9JGokqld26xSUztDD2Zp83ltPtDiRrarB7gub3zKssObAxy6HmAty3ocm\\nlDmGduPpZ+8emIuFeTgZe1J/ziMzXFBmmwkCNVf2Puil46NwIjgwxf5dg5jWNjTekti9Yux7Ysk7\\nMdsXw+G0bxzv3+OZp57hIx/5IJlBTeozNlX52AjOZIYPSb1iQK/sYeQ4U7ySq1ICvCf23bXQ7NLh\\nWlapuxKUFZInUk4sof70cgTri0DMl3DOBdIYZJuSORMqMkZmVLubwsueuVM+KhEimwYxPfJECBbW\\nMG43ZyzBTZ8Lck4kBskzNcnm6ylIPVEYmBe+/I/+F3zd7/xWIi/UsnN7e+Lppx/yIz/4l/h3fufX\\nY0iQX9B7aa1zzgvBTiSnpkylkdaVbUzQdc+MGJSQs44JSZqoItqYIBqDrYliZ1n0uNbHtBnPescl\\nU9IS0OhD00pPmq7HJWDVpyXZq8JKfU6/pzY7DSfSTh+Z7At5yWCaQRScYoMxMhnZuFM29qH2mF2i\\nQEInvX0Y3XcN8uYUf60Fo1OLsVgil070eToz8QvqnAtU5UGRkjCJ5SiwkrLUCrcjKDZYQmnTEVPi\\nGdI12zx5EhqaJhPycHqY7ugiHkYGOUOFDWNJxmFo+i9cSeIcCgR1QwkYl35riAMcHlhNlG7sKH9v\\nax0L6E1D8GqhdI8kCJSSkxe2mLQ48hRJasV0d1bTNQhTpZgmmxlQbmSW7d5QxVPcpvabuxbir3rR\\njZiRzVkfdISAMzGMzRvJFaMeowpUgqaoNWmKmA+Tu3v6ZR7fFJ56YFh9nZimNdFGxqe3vlQj98o+\\ndsVCz9BJN2OLhnvicRv0kTg3TW7PTbXMcYEyhHbrQ1R+nzupF8M3XaQ+1G8qsVJisLuz5IyPht8m\\nRnGiTZmIjro6IWVJRs57Z+CkE1iWrKWbqT/tzj508iqIRFUJWjGSOx3nkz/3j/OuH/o6Tje3HNaV\\n1ga351s+5VN+I8NvyX6PYkYztUwgCQSOorAjnGaO7TunBY6A0Rkj2DZnP6MQQhKRpItN1dlorK1o\\nQ0waZAzL5OH0LN+7uYFnDqBI6UXJBKcJdRHy0CC/6mCrYXi5lFRiml5K1Zyz2L5jcFzURz9MQlYe\\neZpJBqlqEUsBYxUJLdx57kOPiHA+9MHnKDXx7LNPse96PI61cCyCFwWDUwxsn7l1nlmMCZQf1Krh\\n3GaaGwyYD5w4EIRaJObSFI8+F1lc2tEhVGitkAj6jJyQz1FT97BEymoBDNPsvE7+bk6KxfE0UaIj\\n2EfX5gMz7aSQ0ZDGp6InSpf9NTo5yW23pMzt5jpEYCQfJDK7O7e7gEaHAAAgAElEQVRD169aps8F\\n33JnWUR4O2bD8uC6LuSjWmUZnerH6JSieJ48Qekpax2ybTDI1CU4YkqIxqdWVYWZJ7WgRuheyGNC\\n/y//wMwfm4vedO/mot+h2HvxbSLgyiTldE+SYyIoUbg0uJjPFqBgW30qJPoMqdx3Oc401M1c+CbK\\nKje2vkmTHAVPAZNIWEODdrdBskU5dnTJEkOD4ghjCcMi1FqYB6SLlvvyOT/W6zXbCzlLjrPEtEKm\\neVFyKGU2DaCTkvgLS+0cExxT4ionUjNaMf7wV/x2Tu/5Xn70+98KQ1HJgc+8e7EQDpFxl7uNFKyl\\n3ilvuifObSiVdZdIeWg+IgnM2Tg10fPN0vR9J4bNlFUCjx13yXn2c+c0wEM7o9KNjd2TTsTzgibL\\nonWNzN6E18MyIzI9FfY2mbQt2G+M1hIpEuepke0BrRtnN7ZR+Kwv/QoAzttgXVZuHj3GLPP8R16k\\nDXjpPLgd2twI2Mn0YlQaaykUE3UpLeqTjYCbETx6PHi89aml9QlVB5p4rUvomGEelNFlvTRjv/Rl\\nXUmzawnqGlwdD9QqRfpVllkk5olEzqzpMawzlNN10hxjcD675GVDlufRZTUmBJwZDqcR3DZBWXpX\\nyrEnx7tYxOkQ3IoLRZBYlyPhmUe3JzB4UJ3DnGQnc66rUWudch7DRwPb8bko1jDGHuxNjJBzd/BM\\n24K9O33TNTw152Z0Hrdd0JjhMyrI2dvgvBv7JlpXn4GqPbSRMBdym/fLiEXlbAR1CRKLqkR0ENED\\nNglqYdroQ/Ew+77TzlpkqHlubEl93azqbLQZdd8l5m9tEK1TSVyvwaEYV9crT6zG/Sq0ap3yqGJq\\nXWgBlMb0IgfNZapLcmK7FWMlIVvz8ETKmWNNLDWxlAtWlTtEQJqOM+ZCehH15DKZHhZqHWRIRRre\\nUlGUVLa7v59G6F7IrnzEqRzRFdZBhHQ5WaoVMDzwXZXw3qVEOfdgj678O9PpuLmxDThFZxvBHnIA\\n7k2Duhksgjtkq3MYP69BVmUvRGTctS4urRReo73wmouuzUXN7DKllo0xL8axGEtN1FpVRlgSTaxo\\nsdpNRLCrNfGBD/4T3vqt38Sf+dNfT10aELLU5QwpK5QuO2uFtVSVQblo+mySdKhnWCZtXsOb+VTS\\n0SSy9cGaBLVJJih3+BRel4WCkUNs0eEOvTNCiQIv707vSrk494xjdNdpbwzFUweFU9dNte9ntp7U\\nhx5F5gSczY3FDUsrKYdO260L+9cyyVbZe883LGsieuOFDz/HS7cvahE/NdqmHvKIwWidUDY3VgaH\\ncJIFKa+MlLi9bUrv3Y1tV1l8c9o5740Tg9aDNjJjL2w4DSOiKQEhXMg8d1mMU1L5Uwc5KffKMKxk\\nbOpx60fdHGPK9dror7YdkpIoXj7v7C2xDwcGS8pk2+dJcbroAswGbdNdfgnLLGT+5Te+EYB9byw1\\nc9o3alGOVvOdU2P2ajPZFmpJLMuQYq7qQTlkDXq30M8/z36vO5xGVxacD24dboZzboMxuuSNXSzd\\nqJk6Q0ZzBWxoCOwxrcxBNkglK8QVwDdNj6f6QflrU0kz0YmjZ9oePN7hHDMZdwy2m1u+4gs/j+96\\n67dB6SyhBN6yJOqSOFa4WhO5ME+pjo9ONhg140mg/3oIrlfnuDj3Ds7rrjNPHDNXJXN9WHjykHlw\\nf+HesXJVy9Ryu1p8U51Tp0FmoA3lHE5vWsgCMS2saH0ogWzHoYfSYqoSpmlrikUmq1mLsYEgOQ7U\\nNIE3GuAv9VXZmZkieJap6bSkvLYcl1VMA0PVIkx2R9A3beS9GW0PthH0vStItnWlQXRJSM9dU6rW\\nRBtsoc/Y5+yCoc239iE6YKQ7GHrEDAMYel5+TYvuxdLoHmCiGaWiU2QktRFyQs6ZC24tBXnRCaqm\\nLKI7if/nXR/k2Weu+eBP/S2Y2jyP+SZn5PqaE6UODmvCvVEPcleZKcUhF+HUVL5qv7Okiz9gIid3\\nkZqArdn8DIH3zkhTjD57gUNKJraeOZR0F054brB1p/vgcRNiUojHxkqiD2M0Cfk3ExA7dePssoJu\\nNiNbPPCiRV89qMSX/+mfBuCllx4R3XnyyXtcHSrvf88/5rw555HZ+gae6Ju+l5iWZYA4VqEtaeqp\\nhzLOblrjtnVu3Dj7yu7y8Z+bYo9aCKDSTsF5qgrSqDpl5dk3ngvDmjIlu7LuLCZJSSYLcUo77mJc\\nxLTGwjwJmAQ9oysQsA/1SscYZBaqBQf0d+rEUQ4M38YkSClD76VX9DMfP37MSy+9zLIUnnh4TdsH\\nT90rLHmjFOe4arhXq3S/pU45YlrU+7yYQvDJl8hkTLll3eXBb53WnXPX0GjvpocK5slGpxtvMu4M\\nAmzGc08IfU6KVS9m02Iut2aEcKJ6gHUqHFHvqoWaB9l9plAH/dHzvPlNxju++8+pn4zUNhnxmks1\\nrtaFJ9eVw1KUvJyyAjhjAMZSC/drYS3GcV14uKxcH1eeulp44qpwXfU91TDqWnl4ZbzhwcL940K2\\nyugFH0nBsGlwfVhZl8SaG6TEVc70GPOziVzXzYS/nd9JH0yaW9yBgy6LrftUHQ1ZfN2URnMB3V0U\\nUcfFqEsi1YmjtNk39vndJrtjZCy53PVk+xacma0GEucui/v53Hl567LXk1RZoyqnjaQNAPkORuvs\\nXQkgumtUnbR5+NhMLA0fiNKHWlPj19rTlbxFN5FNQ4ORJvZMzgwLfzUQkZ0dI7qxBOx5UAt80X/8\\nW/met/1NXnjpxH/2+7+MH/jxD3Eb1+TICDhXGD7IYyPXA43J7RyDKR1leMwBiE4VuHOVNd2PNEX9\\nUyjf03SZ7XNA5Aa+4uwzQl6N771nZTw1n/ISlS8pTa1q7+RUuMGpOD1DoeK+qyPmRtrgZKGe9FAf\\nsWi0IvpZl2NlHZqKlsMDjk9/Orcv/CR1YuDc4YM/9w84vPFzuOo7fQx6Dq4PByI67j61m0YdnfPF\\nkroHw0IW0ZTlqPJBp2kolIyaOnYe4FV9aYKaF67KAMtEJHqHUqpcdpamrVWbUIMZEe8a/pjiZnz0\\nufGpjLuUmBpEyUBy64rhyajXmKokY15gNaOkjs9qolMQ7K3R3SBVynKPsT/m6de9jhdfPPHO9/wc\\nAF/1298ovampt/aXfvAlrmvRvYrryR8blqoMNUm20EvvcLj4rJpRiEdgtlEnvAR2CgvMyCFQ35GU\\n2P3VAYobpHwpR4cgRIDNCmPgMDelfboH95Eotc97MAT2zrOPWOH3fMmn8OTDAx958UQizSm8xjm5\\nJOhqSaQlGF7p/awFvWtg2qqwi1cV1lI41kI9wHGR0hjkXIzQ+60FwivFEpYGpTdaGFEyxRZqngOp\\nkrBIrIuzgRgmLd2dREnq86esQVoQsnirW3i32KZ0Gcai9oBLJSVbhFqPbRoWtokrsaErkEO5ZH1o\\nCOrzmgqsLs16N9HzlqHFfLgT3blFDsjR1OIoSSagWoV+JcHWnJaCoxdyKiyLTB2anCirTiha5Qa2\\ncEaaxgjEDh7/PGLln3q9tmQs25yQ6p9kcmvtFiyAV6ir3FwWA5JoQbgiRCpw6it/43v/Jp/5Gf8m\\nDw+Jp5468If+k89gKZ2aBrVCjp0yGlvK9N6I4XgM2IPemnpvTXpTPLNfCESoDM7J8AT7Pjh7ZztD\\nu5W+MjrKt0p9Ro44W2YOJgJzWZzzMBZUD02mPVgRK4LEiEKKlRvvEJmeZ0qGKcnUuoGfVbKMjA2B\\nuw/mVIKRxZRtGL/rT/wAYLznFz7Ivg9uTze868ffTmo6Te/D1I6gkVMmEK5ub8ajHU5n5/bWaaMx\\npH9hyUFeG8ukO3FJlZ396tYGp8ed21vndLtz25zeGzkcG65YFzf62WmnIUh5N7wLXj4m6aq1wb4L\\n+CwnoFQgOr04I8RMPi5wrKbS2Jg6x8KxGFfVubc491LiWE19/QJWBpvLpRY++NL/8q28/vXP8LM/\\n+/P8/M//wkdhMScqKOB//Fu/rHbNNvCuYVEt5a6aaiYnUmJ67F2wkoScXx5AFphavYmLBT1YD3Ip\\nqsRW/3a4+Bcjx9wwJ0/AhE1MSTLCNoTybA2xBUyLyB7B2CG8S4aEFqFMpm7Pc311JLvxuifv0847\\n5jPCPmkjo4rBEHmlINZ0ShI3rYtxVeHBUjgUtUV8JibbGHjaBVAanX2e1JOjxQy5O90FbSIFh6ps\\ntntXavcth8QBo9pMlHDYzpKP7ZvMTm1n2miN84g7FoTPVoP77MkONJ/ISpQm6V71uRinLBtxjdkz\\nNc2BLj1kUszDmCLetyagUQkjl9Cxuccda7jEoNbCem+hHjOlFMF+hkA7ddidDNJdgQ1Gok69itgc\\nM5armQJBB7Q2YfPdaI0ZgPCxX/bxfMJmFu9/3mefTR8w5kTdQ/rHQKfhvotRG8PwbmzhjCaY8isl\\n8x/9G0eSBb/pU9/Mu9/7PozCD/ydn+K5/omEj2kXdm4bbOdOroXRnYJx0xsx5CDaQknDnTkomtKd\\nvTtbBH5Wo+hy8iLpVJtyEKOwRSPZwu6dNAqRXJPOnKZVcZBDvvaOJrDDnCUqu8sAgGUplEMTVJ+S\\ntXDJzPTFOmRtn9kTyYSTvJSdlYTl4C/+vmd58n7FcuXxoxN/8Nvex1qUm/XwID5xtvmdDzkD+9g5\\nbaKt9Yu6AsWkEK705dbnTZtIqJWS0nTUGKw1s+bMg2OZcS1G5A6jsDFmKF/Cx6CNrr5w6EFJNGpd\\npE4xZdGFDnS0mJtuFFL22a5RO8Osk8gUk+xpyWLwusPWO3/89/4OTi/9LPitVjng/v1rHj26+Vh3\\nKH/++99NiieoRyipiNcQM8TQ9L3HTPFI2cmpkotOrW7Qdme4kjpzXaYsa7DUAyWrvL1kq+nEOquu\\nCLxrKNgt2Gd8/RgKUuxjSCeNk3OBMTRdD7UZFgb5eKDkM+ZlRsMkvvjfPfL5n/NbWA5H3vlTP8Ph\\nwW/hm7/j+0gzo667TTgMYInbAW3f2LfgtO90V0JuSvOwFEpquLdqw1Hyllp6eSnU2W4D0yFmuBIj\\nknEoiSUnHYpMJ+QE1FRJqREZlrSyLEEpykSDhCTesySvUIoG8cBUzihKp4CgOQWs6AR4hyj1War3\\n4NQVSNC6nkkLUf18rkfeBHx3z2o1Ts1ub3NNcOeiTItIhDc8FcyDhVCqdCCG8nwd1oVa6uwjB7VU\\nrSfZFSWWpwrjbnKmIXvgjHA+9RMrcXF5/DOv1zzpXtbkmL1d/XtnMIldzF9uRqbMkmEG02VjLYn3\\nvPtFjMAj8dPv+kUe3n/A7Xnncz7jk3mwNGpRUxzTrmaWOJ93+nAe9Z1tD86jsTejhq7MkiQFKQGk\\nREmw5MS9Q6IuIhtZ0kJultnPAmVXFDedBHjAmFHKQ7ttDVH0vUDKKhsYhX02jtykj1zSHJAMKNEY\\nEimyJiU1aGetsnRmx6oqhCA4lMFaB8sh+Kr/+YO89KhhDP61T/l02i//DI7RbPB4GDenxnkfnPfG\\neTRut43zLrPFo+7cnI3Hu0rLPQa3TazhZJmaMwfTgjN8SpvupsrBcmjksglKE4NoWmTTPK1s+85N\\n2zhtyuXaXAMHyysRrgWXmY/lxk0PziPYcNyaXG7zfzV31pQgO07M085sz5ixLonziz8OfnO34AIf\\nZ8GFz/is3wHpCUot0nD2ILoka3pJ8ieJkwY4SV0ZqXKDOXDNhC/0rg2kWgabkilQf7IJJC5JVMi0\\nUMCm1Vl7sDNGovfOqTmnZowmfGkK6VbdnOyNRqH3RtuKTDdzoV6XK370R3+S973/fSTgpQ/8fUaf\\nQan7hJiHcx4aZo2+05tMO6UUjuvsGPpcWKc6pQ80MEpBOSSW48KSnFIqS64subBUWNfEvWPiwSFx\\nWBK5ZswSqcbUpRqYNn9dpkYL2cNlE9OvF+xGg2UjaElVZzb1P3OfZrrBnVIgzc1sb9xZsjdTe6L1\\nmMoH1TiWJCtsI80hujbL3vvdRi8xhmYissAnzOSsNRdlrGUYXpQY4XISRmRaH5xbk/rIYfPGmCqd\\nEU4bgvnvIfWNfAPOaVNV9fFer7noljJ3dhSTAzGhN5PAFBORR6iOn68lw7I4tRSefeZqPkZ6Q49u\\nbnj2DU+y7cEr7/sRqkEpMd1OSBGxlAkt0ZdVUmYpAkpUbOroBuSdGoN1SRxLaDFlSpOGSsK9B16C\\nUmEpxoNj4X6FZYIvS9ENl0qhoXIyRrC4ppOlqj3AIgF9X103WW7YUnW6m72pYMAa1FyoyTkuwb0r\\neOLKuD5m7l9lDmvhcF25yoX7a+ar/8p7efmR89LpHu94x98XMBqhAfdpd46AYpXFsjK4DIgyS66h\\nfrjN91qMqxUOJdFTZjfHclBSUQlbCn/1L34L//jvfRfPveddNGBz58zgHMbtrj55H3DTjcdDFUjb\\nE/uo3PbGNpKqjSGx/21zmqPvvRmN8eqDn+UsAm2q2bQw7mOyig31N3+l29HgE97yr98NYd747JP8\\n+re8njd/4tP8xI99P+vaqUvAcMyFJhypiBqV87wmWnDF2NXPtNkSWksirUUBhz7wJoQlrsGOzdWg\\n1nxHvKtFqRdjAF1hlK119okX3buxt0RzFziod3ZPRCz4MLZQ33ffUUwMcG7B1hvn8y0Pn37I88+/\\nyAiwOjTEdT1/bWRST3jrtH2b+XYBeQbPD01aUkl3z6tH0BPk1ahlYc2FYpJwmUm1UpLMI9dL5nhc\\nWWqm5HR3avaR6DlRFyUHx1ycOjppbnvMe1WDa5ia+JC9toQ0sq7Ckw0lelwWRm9Ob7Cd4eRKdNhb\\nEDvgCl4NpAPvA/qetdi5BrU+EKs5kAMVfa9man2WMKojcxI6ONbR8S6CYvgMhg3mPEiKE1rguwbg\\n3p2+O9vujD0YuyzMPVRp9zGEJWgff1n9FxikqSTNc3ATgRa9CEDSrGFBzoWIjrka3LKcZrzI5ADw\\nuqcXXn60s64yil/fW/my3/UlfM8Pf5h7ljnnmWMWWWTWUggL1i760rAEPmiW9eXnYLV6h0LcRmJb\\njeUsZ1wPwArNO8sIsEJeDYFb9DBlV9pqTpneN4z6anyKh6KzZwpDGQu7OWUUGUF8kWV19pSpg+yi\\npt2/P3i4JA5rnoaNmAkWQ26zlrGlq3cUB/7zb/tZ7i9HTsDmC1cEURuL6cZmZlypJelKm2XGJxX1\\n2mtylnnUqKbY+oPNbLR0SXOu5Nppz/0wf+Vb38mn/eZ/ny/8Q9/KmtQzJIxcFYnUYycNRbz4GBAV\\np7Ea7DS8qc88YnDqCSJRUoeyYO6cu4Z4IwG+kLKT3CfIu5NyvhvSFqt3JXOEyrU/+VffSa5vYCTn\\nj37RG4Ggj45Z5XBY+XVvfJqv/A/fzJ9523sFSjLD9kEpQRTA+6RDTb8+sv1epYRIfYXBoI6g5xm8\\n6YL3OFP4n2ymXsxjQ0wQvxnmxm5DC3sxaaJTJ3mn2oqVV5UdY3Ra69jlVBYCv4DIbU5TJiDOG9/4\\nJn7pF9/Ntp2wCl//h7+U//rPvpUUsj0nE+faUsayADHEjC4nsFJoowmPWoxajNWKtMIxSKak7OBS\\nFSjlpYRR84wUynpf+3BqFCiKVbJZpus3bfhY5vNntC7yWcmSW1Wb0sx5Qi2OGBOTqFZS0E3weymI\\nYHQpPDSwl7IlgskaloU6IxNEIPJaB3IPPDUuDIW9a03ou6rTzTfWvEgjHWIiDgO6rMMeggRZgBVj\\nFMXHd5VFk4w43WiesIw2rJhtDs93G8pHtyl+VYuumW5cv5B9bGoDTaffPGbcd0wgRcQd6ixmSf7c\\n8zeA8fwLO4eDABheHB+DshypVREwy+Swltq4Di3aOSdaGgyHZSycHEbsRNeUkpi4QYelDI6RuMmd\\nfpqx0SM4JFiWypKcQ8131LDoAVuwe6f3hHnGEjiFhaAvjk1gdLdECWcx2F3mBcsqK0YZPEFwPCTW\\ndeUqBw9WY8mFHjourVmR88aMta5del1vnIdxVZ/k5MYRo3a5mtiMcTCyOyUpdC/mzZpNPG6zrP+f\\nhKkTY1UrzIoejjZmNIprs/yh//tHefEDP83TT9znx//e/8Fv+73fxNmuBZrOHVwgmiiZ1IfQgwnC\\nBqUXbnrXyTtBJ7Hvs+dssmsuMWh7Juj0kRm5Y+wqw12w++OSWHBqKjPdIvimt72PP/XHvpQ/8F99\\nC/XhM5SS5cG34PrBs9y88kFeevmGYcHD6yuOOfP0Uwsvvu+nuX72U8kpOOSFZiZraglyriRriHyq\\n+7cXYzVYccIKPantEh54ljwxWWghh6lucHJW7E+fqoRzOHvTohBNmufdM9tQ0GRoCCK+Q5fGu49G\\nKUW8XJtyuTFzufxGmuNiWE6spXBqO+/6ie+ndKFI12lHVuKs+u7qLYprTQIPneCryYFwSEYuYx4o\\nujbQnJXEMCEtzF61JafnLH18zhxz5hKrLpOC3vNuIuAJ0iw+ccriI4QHa1E/N5itlTmILM6rvw/Z\\ngC/RSG0utn3MuKlx2bR0P6eUJc+a86U+NIxMQ8/FIMM22xlTt7X3dDer8NS04LoinWxkDRlT4Jue\\n1Uwm+2CMgjHo0zrXPKmN2MByCA+QBi0WLnMxC3FL2iVx+le76M74RiDu+rqGdqc0gi2b7hqTnjG6\\nfqiVzBgqHT7tNzzNZdocYbR9TF3k4IWPvDghy1U9VgtqtUn8V0lVQ1ARAypiuZ6bE1thD6WIdrqE\\n2tEwE+MzJ20AROW6JPXgojBCygjvM6DSMhCYOUuo1xNhHFBpsvsAb7hVPMRjtZJJOMeDc1WNpw+V\\nh9cLJQ+K5ZkDpUl2DC2SUezuRtn7YClyzK2ps3sWrJpFioPkXC1livsLucofn6tuypwTfYNU1Wcl\\nNGxQjMls7aeEN+26+wjO4WQPnnjwkNe/7nWQOp/4xmd5+3d+LZ/7xX8SD6ESDUnvFlQZLF64isYY\\ncJs6dEUk2QVUkxJlOMuq9kFR62uaTBoxjOawn51aErXIzHLlRjElxO77zm1PfMXXfQenEixJD/r1\\nWmnR+fa//S6+6DOfYKmF7fEtL+3BU09e88TDa77m938u3/y2jxCEcIYU9moslhmmtF2bzAs8aN3x\\nDAcE084JDpHZFvUgI+CYslo4w6hFcjwlEKiKau2CJZU6wkdn3zPnrWuocxk+I1Jgnwuw2aKee7gi\\ngVzQn31ktpc+QsTgZ3/m5ziulW7Gsiy0ZecUknvlZFgt+L5PfbCqyosJKmchLZdVsqhDcWpK1LoK\\n1JMkI1Rb6gIt0r2SQplt1Qe1yERkOdGiU0JOtAQMGzNpWRVJHk4ug1wqS5bqI034S81TEsbshyYF\\nZq5a9uiXAddcjAz1Vc1h6+rH5os5wUx98YESv31XBUyiB3jvJKvqXTPoe9D7ThumgIJNz24PbeTh\\nO+GXZJqiiCJ0j6TkEwWqVIo+djqJnJwid71ASNH5aDFCugAYPs7rtSVjKSbXUzeYuyNSgrRxuQ1R\\nRs2w4ZQkt4jbxaEET98/cKnvzpvzwksnXnhpozfdKm/7a9/IP/qJH+T97383/81XfyXv+OvfyFU1\\njiVzb63cP2Turca9JXhQE2sO7tfM4V7wYB2URbEvNj2HiuQ2nrk2nqiZJ66MYw6usrKZfDSKJSkB\\nSNxMQ0QAtxjD0uz3Bt208PdqmoSaIua97+QEawruHTLXh8RhgauDYCHHkme4XZDWRBQF4Z23we0+\\nOHXjpe3Mzd547JLGrFUBnWVxrkvmak2Ukrl/rByKzXw2lT01nPXQqTmLmTqnwMshz0my8JceIkLd\\nDrlwRof/5Wu+gOee+zCvPLrBsvMT/9ffoPsjtr1ze9o5nRujDVUAI8B32oBtb+JuRGdJcuscanBd\\n4eoQXNfMcQkeXBUeHBPHDPcWEawkNZTEqPculcoe3PbgfOvcDGN4lUsxFJIZyOVzIPHKyfjs3/q7\\neXTTePqZ11OqTla1FJ56eCTVM44zkrEP5zzgFErJ3Zqxb8Ht7tz0oO0afuwuCWIqCZbCdSosuVAv\\nj8WFLMYcyGRjqAtNt8ShZFK6yAmN3hvd5OH3ZKScdR26FuAWjaDdOf9wm7lrwk8++QnPzqcu2Pcz\\nDx7c47Akrq8rP/J33kFOzj4Ca0OpBkyiWu+KDceI7kSWnDJHvXtmNRF3YWmjzqoozdaL+p0pd8mq\\nLoSvIj2ZDCfq+1pRCvWCcs1qglITpdT532kucyjGWqRUWPI0mExOwYU05hZY1wacTBv12UOcjPOg\\nDVWw23B6oPu3JfYmF+E+Mt0Te5jaDZ5F2usb5z1oo7P3wJoGj+6drcPmnduOuC/zQGm1UXK54yh4\\nyDCDSUmBGdUdR7366IPdJRsbTfbyMQZbG9yMj+8Dfm3krk9Q8OXGA0k2fNByJpLKpzySAByXCad0\\n98rkss6nfs4f4B/93W+5+7EfvTv8qT/x9f/Ur/xNn/SVLPEiVt+AZ7DWCSsQicXUP9odzKWxDJSL\\ntJZMobCPyXRIjh+kIthHcBqdNjZ6FE5NE2ED1lA0zCA45kxGY9XwwLIiTI8YW50PSHSul8TTxzmU\\nO66UefOFNYUBjkSknfDE2MSkxQQ7znmZuW4T8zcG5xZQ5Zs3NOQrObGuldUmXCWUltDOwe4SzZcZ\\nrTPNOAIFkRmjs/fEeag09k2ZaXsJnnjmU/mFD/woz77hiut2xTMPrvkLX/0F/J5v+D+xUUg50VMn\\nh83YmDydfYKL1ICw4FBF0rqfFZS4pMyyVGwI/pNT4VEPliYb8ckuyEQNKR5FZrsJDkUqgohBc2Nh\\nZaydNpSGSzjjnPmyP/IN/Mjbv5P3vPdDvOnZp3jl8Zn7YTzxxBP4449wm58hEaxrIu0+S0Q4pyFn\\nlwstaqvkhCNDI2SzTQ5Vw55IiU11Mmk3eoXDIioWxejNWRz2ZOCDfdcUfnOIrpNeLjIOhUHJmidU\\nVKqCesuKfx+YKV9vmY/jtotnvNycuX/vPqfteX7+J/8unz7IcJIAACAASURBVPd5n0+KQZsyQR9D\\ns5UisH9KaSpGIMxZ8mDkwmpanKnSnbr5tDVdcggTmNOprCZ4j7k2mYSx1IkTSHJmXqpekshfpTo5\\nmXi6RfcieebTTbgNLt2ujE5T7ZG0uOcJsWmXAZxDs6RhVQtF+VxMLEMW3e3cue1K6rBRZk99F8+5\\nz4zE2YKsOZO6sy+Z6k7EpS0iomG3lVKGEsa56HTR8LM4xSWDa3dkPEU0RYdhlUD3bgzJ/szar23R\\n9SyYhu/cSU8itKOV+UWtJJqBQikv+WlcFM1kN779L/8P/OY3/wX92cd4GYn/9du/h0/6tz4fRmaE\\noB7dMtX0ZZxJl0YFlgUZv2dBy5ktg+86XXY6KS/gjdadx32jeWHf5QxqXe/fsi5+jUmJ8kE+IMrT\\ntI/GQRlL9y2DD3JdeLDA09ewlMz1wVlmptvwSvdGWxcWKvsWRBa1f6lychXvbBhtv+K0q/xhOlrM\\nVIaWotLzmAK8UI+dOBtnF7OghRO7c+s7ORf8PGbva7ANuPVBbBoItCa5WBrGcpV54k2fRnv5H3B9\\nvMJMIZXvf+8/5Gr8MnH4l2S5zit9dHKG3ga1ymqdqbh1FiuUnDjMPvV6kFU2hjLSlpFJJbP0zpaC\\nw0gU62x7Zg+B7iMLfJ+SUSIT3oikYdbumcVNpoyRWNLO3g9829vfy+/+954hwnnLm9/Mc8+9H4/B\\nN/6xL+YP/vc/xGaDtKNzXxp43iiWyS7r75Up5t1SUKJg7ng3WpZRhpFoBGuoP60DbkwiWaI63JDo\\nZbDdbHTPnG4HtyMxfEgumYySFA009pioRy3arTk9pmMO9b29FlLvc3gE+77z8IkryiJH3HYabOed\\nbbqvmJKphHbalNPdcKukKss7skEfoksEa6hHHcw03VcXv2o+y/g5xB7xaq1vQcepORMm27abAi8r\\nlVyCQxUKoCxwMFXHORmpBsmlxb6c3JTOok0qYnK40QQqT4BTSTIBzcwIIrSpjO7sYYzm3JrRd508\\nIxp09XVt6FnrOWOjU1OmT9zmsju3BmVaxrJpJrPUNoFXclaGi6q21JnCEX0mclSsaBB8ec/OwMeQ\\nQspdVvD68ZfV1zRHfOAlhcWp16LAvJoq3eapag4KArmWzq6dM8J5/iMv8L3/+3fztu/+y3zwn7xz\\n6vp+5d9nZnzX9/1tXv/mz5YVNOs0JLeIrIY9tOAr5VPidusKqaSbSpOhJFc32LfGORKnc3DaB7cu\\nSYeF/PjdlTY8kNX5MCM5iOCQDKyQJoj6UJ3MgWNW1tixGnUx7hXjsBbuHxJrVdTOee/sI3Nz6nSM\\nNaAcKktWa6I57K3TJ+2oWOK8Newy2HBFd0cyjmthKQo7PHfj9iw4vLuzufpHUifoVBHD2YZiSbp1\\nSsiV1q3Rd5WJazzma7/sk3jTG57k5nzmqSfvs7fg+Q+f+IbvfDeXKO5LH7SpvsYmr7QsWsAsw3Vd\\nKNUl7UlBC/X4u1WcTt/VjmpNlcS+w6NbJRx40XDwYINS4MhUapCo1jkeKstsSyxrIuNYKrBufPln\\nvw6Apx4eePDwig+8/0W+5js+AC6raMmaO+QyJ84o36sucF0LT99bIEN1ZzcN2Y4kWnEqig7XqUWc\\njoEked0hunEag33v3Jw6j3eZLJwZ4LgavQkQ1XG9J0uQdErefQfKXfx5zuLL1kPiKz5PaSJPP/ME\\n964WWu+89PIrlONb+Obv/AmWWlQdTZOL+2CpK+ftTJox6+7MZG4NhuqMfo8I2efDZ5BiUpugqgor\\n1cCdA0Ze9O9lyZJmAmsWTOd0VpsrR+V4NVUza2JJivox08YrRtPF9qvnfLa2GbMfPAz6xh1Uqg/j\\n3Iybrav83weYstF6g70PTsNpW3CODd8S5AXvJ9n8o2MmcHt03UstLtpZw5JOzqsrat2MmTZsgDbP\\nCPFdjrmQqvaey/e3pkKKjtfMtqul4C4IUMwqPGXjSz77wcc0R7x2RlpcPBc+w+1Qn+PyF4aimbcY\\nbAEvtuDzf8Pyzy2tWYoi6el+hdfxeOAT3vLZtECgldDOWkqhk6HJhuoTyJIspgZTcO1wcU97D9qU\\nbPQxOPUuwfrm7B3SWubxtVOXC0BkYc3OgeA85CspKZFyo5qRU2bJshbWmjmmzGFVs31dMvdKoayS\\nkRxCXIpg4+qg91OSsWSnLIqcTkBZC5GydugIyprIreMjs+UOaaHaIMeOo++jmHPMSLERlbF3GoOB\\nUf2SXiyZEyNzSK7BnwX36kIvnTUVIj9BcuP2dKLmwrY7x+OB8/ZhAGrWqS1H4pamUxIQVqg5saYq\\ntOQsDWOMabkdVKu0uKT9CoMXPlhKlmYzB+O6k/bCNgYj5OLrHbwkltQxS0p36IIalRLUJLHQRsC+\\n8ta3v8B/+h+8gTf+ujfx6/+VN/OLv/R2Snc2L/QwzqNxtQQ2Fmqag8+UuJcWif4jWFKl284hFMU0\\nYlB6wurUd7p4r20yRLsDPXG2JhH9jA2wcdbiirGPzrhJlBzsiICGujLS2pqkV+7QY0gtY9Kbxnmf\\nj2Rn2870diLnzOm2w+0vMCKINliXs/gNKeve9l2OqRH0nLC0Kxk3a1Ccqcgn2PCu3xl7oqcBNqTW\\nWZTKWyzTk+ObWiR7V0+3LqHPMQA3MZOry7G2JJYV1gsNcErE1FGbC24wXZmX/DS1Bm0EVO42i2xa\\nuK88cwJ6LextEKMzprwOT+xxhjYHgeOsisA6q09p17goU5oC2kyTqIMlsmdaCg42B4rupEPCPXMv\\n2XRaDkVKpaK1K8aMaR8a8E15nKBIgS1A6zj5DpDzsV6vueiOOTk0THBlUwlcsxJq3aZkqwHufO/3\\n/diveJb1kMPEZnPgn33d3p64d3yFF28fELHclUA7Tu87/z9p7x5r63aW9/3ecfm+Oefal+Nzjg3h\\naiBgl6AAhkCtEEzSplJShQINVUSCEhWRIhSRNg0hVEpDUkHbiAZRcFtKaIogIkAdcQtOQlJwAJuU\\nSyABczGYmpgY8PXss/da8/vGGO/bP54x1z6usY8DS7KOta9rzzm/Md7L8/yeJTR3co/byqVYYURm\\nyZlusChoG6/O1nRJWBk8G049GqUbeKPYCjVxqpqR3imTMzrRjHie6ccmuLc9dpstRYs8arDmZXJK\\npYtNSL+aauIqDhyS01b9/FJEoTKTC2t3WXVbDHaceqOsNrPBvZrptrOUqgRZxAge2anZKRs8aJ2a\\nA7PKNsZkuqK5UjJtmFPibk3UyVHVkJ0pXwre9cyZe3cWliVzvm4sS+a0nglWefY9OPqiQL8YWAjw\\n0tLOHerE70Gw0HvHrDC8KRUiiuaLQ/QsN6W+LjVgL7TcqV1pBYplGVLKTKG+tyJTRwS5ZvZtwIpy\\nvwjGKPzP3/3r/C9/48/wL173U9y5OpL3GygrNvkH3R3KgAZrqN33aeAZaYHsFAopEqUHRpCyU2ud\\nCyLNGj2cbcvs0ShDXVYQs/O6YQ24CaOPLnB96niSlrumwuhdgi5Lwhva41GAlB5GNMdzhTl+285t\\nIgMb0mM7X/gf3n/8wJhxuvN7+ebv/1fsc6FmybDsLD2TirEDZNH1iB1LmZIVUUM4YTtuR5HiPOZY\\nYo4+JoBm+nTUWU3shYn2SM0yI9SizvCygDO7Nabp8J3/vThc7CLdQ6M9XG45mJMQgdKkSU/OsmQG\\nmtMnM5xOnoddmnB3XcqOl8wBdSbkIN0YzSsgy/NSFaZb3GaO3UQZ7GAzUr2kQcnLHMmYEjRSxrKx\\nhLr+bQwt4ZKkZ/RQWIOJl/y+vp5XvSBt7mOdnCUdoGm+SBdAxMUz/bmf9Wm3L+7jz4fxWZ/9J/mB\\nH/1VDi982bv9/FqNO3cKKcHLXvIheN6IKuVDH0Fuio3ZLBiz8i1hHFOmLol6dJalkRdEwqJTTA9M\\nzZUUitoeKahhlFTJNI41c5WdF54S94+Z0xFOS+FUMicE+qhlYS1wWjP3aqYcigIOS+aqrNxdE1dX\\nmaurzOFolKrl0tUhWE5wOGWeOAZXRzgtcHVInErmWBJLGqwmkX7OiXw06h3j6rRy51C5fzpwWLKq\\n5OSU4iwFlrqyHjPHY2Wd3vBCJkVQV1hSVYVeg9OSOK5GrZm1LBwPmTt3V67uFD7qkz6PQJXMsw9v\\neOeDG7Zt8EX/8UfyHa/8Mn7mtf+IL//CP84v/z//F3ePibVklrWwHuBeMQ6LnIIjBhHzfckZQ1lq\\nbjtlLnx6E7mMGKQSrEfjToXD0TmUxO7in4Z3bjo88uAcg/PIPHDn+uw8e3aeedg47xvn88azbbA9\\nSnz+X/kWPumPfQWPbq5442+8i82VgrFmpR8XpCLQKaC22UxyNLvwOXIog6xkcl6UZhuSzcUQqCVl\\ngckfbE1zdQbF5Jg0M2pJeC/y/MO0VocO6JBAv/cuPfWcb4b2zYyhEVMh+O//jx/RCKo9bl3//yNA\\ns8SXfdU/4hu//+fwoTTdWgaWZx5hBKM64FiHfVab3oy2NfpoNBswFnwoUidN+HvJgClsFfw2W3Ab\\nScS8EaSYyFaDXGMiJ9X5FHvOOPg9ToLnnir68gnACTN1Ny6db8lKokg55p85z6Gkfy/JsFTJubKU\\nJMVG0mhweMeS9LIbBVsHp2osNZMXYTJrdQ45k1am8knLQ9HbCs3krlPklpLBY0if7Nmo60KdMUjG\\nmHJA/f3leZIpn3em++a37vjMCXus6ZOj2pszkpZp7TzY9syjPvj0j1UoNMAHfuAH8x2vfh0jP01v\\n8E9/4g38rf/iE3RLZeP+1cLde0csr/zar/0WP/5TP8PD/DG3KDsbYDZwyxgB8yYtKU/AiGJVeg8e\\nPWowoYqbZWI4bVeVdd4Gz7ZO7FOetSjDq2AsayGZeK9j3uyBbk8zoyxwLHAqYLlSK6zZdKAVSJOe\\n7+ghjaH8q2zjVrWQzSk50wckG3SKWLe7i9DUh9qrnFnM2NxZTDEsAM4QrDoy29g4NyO3wsPe2c+D\\nmwZn72DBaoml2oyELpq/YSyHwlU2RnL2CP7cK+5zgRm95yOhnvBb/sFrOD79cQzXbNiS5qU2wS05\\nzS14OG0Gu/XRaGlRIm2CZRg3XS/sZWbr3hhdsUsP9s6+aym6ZlGxwo3wRKYxKKwqh8nmLJE425gh\\ng7r4uwfdGikWrg6ZeyUTSb9mqXq/1wL3rlYOK1wdJOeCnTCJmKqIzOQ838skI88YYjpcd6cPLYqN\\nKknd3rnZnevN2fvj2VmymBZ2qXnCJDdbIuE2V8EXeZIPUnJKrbz6VV/Pd33DX9Nn/r0UTE98wMfy\\ndd/+41ialSaaJbvtUqlkY5hg5D4MS4PkwiXKOl+oRd9LLZWySBedixgFOfl0DybWQ5bhpjy219pc\\nZq8Z1gPcXY3TQZ+F+r4763f76igpfGuS8XnM6hxVu1uDmzZw13Nz3ju9O1tLbK3hMR2xMRjJYReo\\navi45TlEiLO8LgupCGwVe59/v1JYendiDMwUFJBzFr4ma9czhRq3CMsLX9wsK2evDTwqre8YKr4+\\n++V3f+czXStG6ul2AC7dn35umKSMHpLG5BocMF73hjN/9GUv4T/5E3+YL/6rf5uHvmijnJ3P+NSX\\n8rfmjRAet8uFu8fEh37QC/iPPuPlfOdr3qoPkTtuiWSVbINelE2UcpZsBqMPVQIeQa4F71PoPGac\\nXNGgvBZj6ZqDiT8wICaiTnGijFzE3xySMGUXPamuiWNNGqznIOVCKdIqp6J58mXp5LOyseS6QaNL\\nl1kUOHUq825sMm+Ukige1FwBZwwmSeny50wQ+mQTRAQ5LRwSjDqJR0viYIPsep0uEUvVMm30SZfS\\nmOQccCRIaSOVFe/bb/OuSx3ywz/7Np7djvi0X6ZI80DMyozqjmXpgTEoq9QjharstFyBHU+JvGS8\\nBTnU4i9UfA3qovjud5qzdeW8pci0GqTRuTFxPFo0jafMwLpCB02WWjMdMuZCM7YeRIZaM3lVO3ha\\nKsfVuLMaa8mkmdVmuUCIPzBGwtLji1qkOgPT36XqVVE7I93grdB2Yf1S2ck+B5nd5X9l6nVFZp+R\\nM3GblvFD3/vtvPrbvpIH7/g37/kOvJda6ENe+in8d6/8p4yhizwludvavhNLYeRBcW5leREZ3yRx\\nYjJyralt135U8JYEeBf1K1IjJrzGh3gWpU6VVbKpttJct+TnVLP/Dgfuu50xZqIBTidXDia3eWq7\\nhzS77sI4khTj082wPfBRYCiZfCTI8/C0nMgpUWxIHDwRr24FUiM2n8hNwMQXxv2WZZEmUd278gb7\\nELXOXaOVHg0vF6/jLp1vDZlQ3sfX+8FeEJdK1ZA2gDoA4jYS4xJVTErU0knD+Sc/9otCLobak45e\\nVKPzkn//z/ILr/s/uXtn4WZreARPvvApSl5hvIulboy4kgoiqd0ACM8Yzh6a7Vqf1CxzsmXKMtg9\\nOHdZIcE4TUvMzUgsqbBtZ1oqjJbwMqjJWMcF+TfIJeHtsfUwT4JZzkYzFwUtdPuSpJQoxSjmtzHT\\nPlMAismlk/TSKP2h+63Y2iOxzJmU29C8cuwCuvdGnzZU0Oc5zQqcHoqLCmlcIwyPKskPhUOVkiTy\\noKaFsMbojR/+h6/m1d/+P/C2X/+536a6ffev177+bVyfjxzKAodJZvMgSGyhWX8uRt9nMkcwE1Wn\\n8N/k+sFFbVvInIt0r5ELvQmUNLxjOThOx+HZUEU2GudpV7oZSgFIqVBTMLJel+ImM8KEjKQEtsj2\\n6S4IintwqJkUUMqgEZQ5MhCDC3KJqdk2RveJr1QqgYVe9EYwImhtE2IzJN8j5jx9F7zew24jW5Qb\\nqESOmsttuhQxCL/h21/5Rc/3+N1+zTqFd77ltzg3J8fAPFHTIBepV9II2p7ECxgBObDstKZFYPNO\\nNVW5Y2RGdtKQGmlPgzqUGVZTYU2XFGQ96wmpc9wdK8oiyxUkX7Pbvc/7+zUFMVxYDro4wZvLXx4z\\nQZnB5ehpQ0YfGQu1W7KsjEW6/Jx1ZFLqrEVT5WGGtwo3jbBKxIZH1efDhDOw7txcvitPLOh1khoE\\nCHWjPnaxPJAyyGexMTyBQ0y8a7X3PV54/krXM1Yavs/2kiTbbZJG7fLlIY2oz411ycEgs++TZzmX\\naCTja175Sv74y/4uzz678eRTd3jw4Jp3vf2dLIcrHtw0TkvnQU9YH2D6B9Yh9sHNlEVNdfVcy1U0\\n8c+k7BxDVYsz5UCeSK4qMuUiiZUKJjmYlsyhOks+kKoyti6hlxKSwHnrpFpoDmuRrMaTkzyT5utS\\nMEYdLKNACcwlgSpzVpW6zy220InnLRjRaNM7LgfZZNimRAkDC5bJNOg+9MEuThnGjsLylpLwIhOC\\nF2O0QSqFNStxdiyFz/9Dd5nX57u/v8/5kZyMFz595F3PbPzED38vL/u0Py24dyxgCg3tZNaGorHJ\\nWHIyAsdEMy7iZkOozMhSCbQxWK3SKkQbjCx1g6UEfccLZC+KG2+DM7qUzENBoZi4ANPlV4rANDlJ\\nEhSmqszbIFHZyjTSmDbjWzh11+XnWUwOknjN5gF9jhRU2AKDVAsWwb51YfvOG73brdxp61qw9gv2\\n0zXjxgQCuthKM4k2xDJUUKbz6296/Xs+a/O9+G/+px/g73zNX+C33qyUjJRgyZV1NZ555k2crztL\\n1bvZwii7UXPRBdQHpVQhJ2M+cwVurjcRufrA1pWEs6+XscfOwTKedYEW10LWp75WhK/JpC1iKSxJ\\n27Kcte3XGvLf7SvQpdiGuBdjqFPQXaaOcxuJ5oLRDC7IxtkpNz1P9CByI/eEZQFtJDUtShrP0tTC\\nztg1zgkXhaz7IMxm4SgeuOUFy4mEcAGjQxs7qayspoNWCFGHnhl9n2qXjNWLPfq9f70fEeyBDQmu\\nJXeShIxkWNc8j7nhjz7ZF02zsT4GxUUV2hBEuubMnaXwL9/U+YQPL7z97Q8xpF5wS5SceNebf4V4\\n8mXsAzCneuLh5DJcaFIRPuNFdOsmd9acyNXoZcBZs6cSg7Npwn+3LmwiGVP2zr6qXS+WVMWVDW9F\\nl8TQgT8CGMppUzUvhmwPfV/M+Z+5wNypZxGK/OLISbRdrd2eXQ9mCx6cYdudzfXgjyZFQS0qlysS\\nsYcz56Aa1KesAzemtGZrEvRZSMso0wik2DFcMrZ8qUAuj4Vmtn/zq7+Bj/v0z+ZzPuVpYBKhxuCp\\np57gL33xf87P/PLn8s6tAh1PGbOFbA1GKI+qDa7n7LJ5wAA3x4as4GFGDOWV5Vm1d3O6d7XpZFUz\\nObE06LaTSsLIFJtBkVsiTMaP2EWlqjXT9k5LhnnT6z8Mj8KVhw4UjJvNOCxZRple2A1qKTyKQU6F\\nFVmBm0mGmGeE0zoHeKkbO0PSr2QstUJ0PIKbHaVIj6GEjxGQB3vTzk5SMG3KFnM8SXHTut6rD/jg\\nj3+356yuT/LVr3oj2z7INnjwrmdufy4lm8vTlVwy/9XnPM3XfvdbYZd9uM1lVy2JXMQCzrmQexDs\\n5KgckjOq36oESBqxZDrZqpKeJ5GuD6ckJFNAz3hNiToP4aTfLooY0gSn+ePvz1fAbbl2SdnFxTr2\\nJiRrdzg7tF224NZCY6fQs2djYmVLwbPr+a0zdw0pn9wHNvKslFUixoBgcI6ghsh54ZKUMaQ+sALW\\nz2yp0gxdpLGw9ODGFNxardMikVzqEvcgUie2/Lz1/vvBXrjMcwNQRnyu6VY8Hz7lRN2Ay3wzsQ9R\\nIfZwdhzLzlUqPHHMrIeAgJf9kb9w+yZs5537d09sN2d+4fU/ow0m+ntvIjRHjESQZ8R4QqniyiML\\nU1TP1nba1ummpshzYrHOkpVZlnpneGcvYNk5lkRKmYjCeS88uum88+HgmbNxvRs3Hpyj0EenjUaL\\nxr7PSmBK2MLl0sFUVRxyotYs4pPPNzsbDHUJN/uQX96DgnKaSpltOZ2rnDiYccqmhWFIAte703pW\\nWqvN6GsTszQ7WDYOCQ5ZNLWlrtSDccj53aqQv/99r+MfvPbtfMIrPo817sKFeh9yLSVzPuxDXsgf\\neOlTlGiTyq+qLVxpzyWFHtwEve+kpr9fYvMppZlqE8mvKvWQqFn4QLOVjBaieRg2bcNpzLRhs/nQ\\nN3Ch/8JklHnsd1dUUd+NsILZYItQnFHvbK59gSXhNTEhAZm5fFsotqZ1jRf2kOJAn2tdejmUpRWh\\nixMrnDEenm949nrnweY8czN4tomnAdK0b62zuQ6Ic/cJoh+ce+dhc65b5mu/7y28+CWv4G9/91v5\\na9/yi1w/0oK0deOr/t5P375ftazcvTqxLEfu3j3wohfe4yu+4BW0MdhdC9bhnf0i6QybKSPQXdnN\\n9Vh5Yi286P7C3ZNSvFeDlDMXh2eaF7tcYGjRGFJLyPar91cBAtpJ1EWc3pLeLykUMCv62x3RlAzO\\nQ1tqhpBTrc19UYClTtaJeWu4qBOU4DHoMejd6M3AsyzrFlOiaoxe8a4ucxtBWOI8ViK5aHSW58gj\\n2DfnbJkermJoaFfT0AzcL91XN/ahA7dNO78WD++75n/e1+l29mcAg3C1WmNXFIsHjJhWO29Ez/Sm\\nRNS1Gqe1csoLd9fK8SjIdhbUi2/6pq/lQ1/6HwCZUqW33cfgtf/8n1GzyP2nUqhVkSHLrJLvr5VD\\nKRxz5rAU1mrUklmqIjZyrXMYv+N7gC9aZoTMEMnkxFlGYXOnR9Bm5Mp5d7oFbe/czBRjI7j2zKN9\\n0PYAcyw/FsQI9aeZVrHZxDtTTgRrsWl/VEUWLgviWoycilJsS+JQ4WrRqGQ5ZJY1ceeg9A0LBMne\\ndx3arUmobtNGWYLFlJiRl0StiZQ6xQp1MX70Z6/5qV8589qffcgHf8Qn8vTdI3dLoqydb3zVz2hG\\nPwTkSWkhcJ560T1e/+P/BEVkx/xQTW/6SFjo31pKxY5F55rrQQ1rpAqpCENYsyRv946FJ+4t3L2C\\nw0n2UXJW6OF8mMh6WMwHKR2EfjSNDTw712OfWVWTCZEKfSIWW58SqIDWO9f7YN8EhbnpcN2ZcJK5\\nCJwC+fn445F41HYdxLu0z3tD46A9sZ0H/ayZbkppmnHmmGHIoXnuxu6Z0WHriethbN4577D1KooW\\nwc115gv+5nfx4BGyH5vQnNcB77oetxXTedt417M39LETXjgcDjz7zl8icCWGXHiwbXBuOwoXcIJB\\nXeDumjjWwuGwsJRKSsZiDZ+KlLUG1UTgSiZ7/YhgazqwtNCe0rk5frEI6iplQJkV7/s70e08Vm7E\\nZRHv03FKsHXUSZpQmqXAUhfyYpwWo1bNmkdkRmvQs9J4u0YEPqH/EuGJNW25YQYbA1LGvMzOWcfy\\n4nBKMwEnJayXydRISkUuYy60wZPGkucQnrMNyC44TgTqen43h65uGr/tTMPz9C4/znsfQzDu0YPN\\nnTFnjSXLR10XOFSlbpJU7gcaOr/qH/4A2Mr1zaCkTGvOT/zk67g6GffvLhyvMvePxv2rwpNXheMJ\\n7typ3L1K3L0qglnkrGBMBrkqkG85JlbLpGz03OlF8iM344CgIW1eKO6d7abTeme4kUeQlzzpafp3\\nLzFYycTQvPimddHrQxvQaIoNuZ1txcVfrgRVN8Vzh2n+Vm2wmnFKzkLisFSujivrWjkdCseaOdbK\\nugb372aevF+4fzdz96i0iVoSJStI8/6hcGfN1IoirEcWSS0XjotxLOLt4pV1OXFaCsdD5c6dzJOn\\nysd+7MewHO7ezpXPN9eyPY7Gf/0X/6xasxCLN0bAZAxHLSwh/WQaavGSpbncmOCgUDV1sVsmg7rC\\noSzUsggpmCXMz7nQIjF6yFbJlOJNJcc5DdIQoOgSwSPQiM9lovgWiwUZ5Y65Gbt39pvgfDNoN02Z\\neJZFF5uHRUEVXZkk6qRxMBpeDLWtY+PhuXPeGm3EXNZKCdDakISySXQfHuwOmw9iDLY+2G2gVV5j\\n0BgzT0+woqGlM8iVOFb+22/9RQzjdDqAOY8e3bC1wVOfTgAAIABJREFUTnhwOhr/21d8iZygDK6n\\nOyulJFBNsqk9ZSZhDAU4Th5BLZX1apCqQlh5zuUzZqmrePUxExkM6zN1GlgWzZozkqy9P1+qp2fl\\nOn+sMbuMFmw3sHUxPpQ+4pCkFFjqYMkKCzimytESKSnLzcfQXHce4mOOB8cY82zSLHgLKTbwgdMo\\nyagjWNVA0Yuaq4hGG3JiSksd9P0iSAly1wXHUE50SstkehdsQvnf19fz24AnoUjCX+lyGUnBfBH0\\noeWZt6njTU4hiVRksM5lRC6JsBki5z6XLBlz57W//Cyf/pKVe089iccbecMb38xVcboNlqT2+fb0\\nA4U+huDHGuQ76xLkUdlap2UjzoXROjfuBI51F+w4O8Mk7N6iYTNeZgLitWQLiLmQGMOxJBlLLnKX\\nQcNswa2zN2PNgaeJyUPR7XufeVoxZ6wkGE5ZBQLJ60qabW2a3u+UtaiImFEyKRO54j24OmiO2U+Z\\nfejf7kPLo8uHbSdwL1hxLFcWVEmua6WYQ1L1ZDmpdbRCeKd44Ud+/q18ykesnPfOU0+dyClzOl5x\\n/37hlB/xoN/Fw5RvlRqWjeTBntPtgC4lVb6pCoozw6GJic5MBEw3U7ZB9aAlg5QYntld44KIgqV2\\nG3hJPLajNxPYfIymdnRkEtJFJ6+ao1qHIu7BktAyKGnBt40BzVh3J61aEkntpz3BFkGecTptvm82\\nVCFF6KCu5nR2uQovq7JIeJGED5Ry0sdgR8GpkW3ye0Ov++hafHER32vRus/Pd7bg7Pf50Jd+Br/2\\nCz/InTsnai3EaFLRrAu/+cbvBb6OMkIyRNdnZzu72v4EkTJrSpQi/WpKGk/pfZEUcbNBvnQIaNRl\\nLg60pyzam0v2NkyR9DHF7G5xy6e15yzTLkvB5/7XQCRCjbqlt2cmOMxSedsH+6Yxg37T3FOYzpwg\\n6Ax2snTaoaq+T/VE8syWNq21XZ9RENN4RJB6IaqzhtGs417F6J7nlZlUWZaMNoQ2rTUT4XQv1KSY\\nIUsDyqCdg7QMIlfJyBja6b+vM/X5Dt3hl22sYL2jz+SESepqDkOfFOpirLlSqmQbkoPYdIvB2ETH\\nai6/d/Lp7vDgx37xEU+/6MO5DKX3B2+Sg6Soxahm8nlno5TEktTaHOt0ki2LAMMZ6Ip1CfpcgCzC\\nUZKorjmdW1BZ2C7czVCb2KalNqesCmkb0KTlW5bE8QB3DysLSj1OkWgxD9vutNbZmpix0gQKjk4S\\nIaqiMcCSg7wEyyGxHIJ16ZTi5KwonmJGqmrJD2uiJuPqVLl3VXjiKnH3aNw5wdXRWBfjcEicauLe\\nkrhzrJxqpS6F5SDiVZrs01zlyFlycMh67Y4V1lT46V/daN20iEgalSR3vvwv/hmiB9EbxqTOuaHw\\nRnEGrBZyrtSlkjy0ZGTB5ykbVBoTR9gSwxN9zlzDpSbJKZNTAteyKq1Brk5ZnFQzC1kGBneCSkaH\\nps/WMWy2F6bUhFOq3MmFA1W8AUO6VaYkNLIi1UfMuBYn5vx7ZLX61VVxjan3Gj4YbYZXhuA4KYyW\\nhArd3JWAIN0ZhwkfUiEirbW7UiAcpAt1n/IlXZLuzuiDiMSf+vK/xye8/E/w8OE1L3zh01iecJZw\\nllr45Z/6Sdyl2W3dud7O3LTGzTY4n1XtMbTjyBPmXqrjWVLN7JCH4omIQb2oTubpkLMqYfGAtTtw\\nBBlnPGap+DxwVRo9bq8f/9jjH+2hgkHZb1IpMGBrTvhga51nt8511zPlMW67CrssbH1X0bGn25gd\\n/HFIZuvaQ+xmdItJLJwM7R2aqWMTHztpVDDNJH0Mts2JcSGRSYFyTJIlRgEbBl2QHx/GmoLUtUR+\\nvq/nHy94MIb4kB6X5dEs0+dsL834G8hTTN5IVJJpez7aUKCbi7hvZuIQ5OCwTFcXmT/8Wf8lWPDp\\nn/5pfN/3fJeSIFDmUs66IUvSyIKq37ssxtUBDqfgiTuJ+1dVh9RqRD1QPeObdJspGy2lOZPU/5Jr\\n025mFMvUpVKSTc2piPRthgluvdN7cB6DM4Pdgn1CPPrQomvrRYYNAqPMwXyidzF/99BS7ViMJ06Z\\np+4m7lxlTsfCackcq4A/VyfjWBInMw5Vzp9aZxrGvOAOS2ZdjLUmakIyojLxkAxycdZplz5UXRqH\\nxVizVCJW9L17vrR9ia//1n/Gv3nz2/mtt72DXOCpewfe+Cs/C3HDHlmJqUnMWPeOddccdcg1FzHm\\nSiaj+EGnUzBzwXGs4t257oOHW+f63Hh07mz74Lo7xFnYxVKoo1CqXEOFuZnHyNmoNUSEs6Bg4DHZ\\nFqpWCnBYYVmCZWFm+ol/kXPGhzTT5kG1wsHk6koR09FkRMB5yhOTVWmTk+R757OxdxNXwYccdGiB\\nmB1V0A5R5WgkqSvZQ26pEXLoW05ETvNQMoY33J2bCM5t0Hrij37xK8ll4ed//o28/Z0PGb1zOpw4\\nHCrf/jX/KaXMdGIbmBceNefZ68bWBzfboOOkOWe06uTQ4tSSZHlRNN4Zpjj5bKKzlQq3etm56Loc\\nos11kHkWZMmRBGtH8V0+R4iXw/bdFAsxzxVT2olMD1pYGtKulxziUky9dXTF7DSDM4NtC/YhCZxG\\nB0lql2b0Lc/iUPl9SplRSnZruxyMO2wjSC1x04P9HOznwbkJXdSj0TzYXeMUy4XoXTFQ5uQi5UJG\\nsrst5m7FZVX+XR26lzmPIW+0ud2KoMOgXP6IkPhbtkzdjqkYYR0z2erKnN1JiRCkYhxsttUZPulT\\nX87LX/Gn+bCP/mQ+5CNfTmablnmZAVJSC1QXLafWqtnS4QB3j8bVqv/dO2VOVZloZR3kRRXkEkEa\\ngz3NrWbtk0WaUOjioPVOG6o2+pSq7O4T/KlWJiWlBNtwhrfbCiq8sA9JxPYmp1Y0AW68aRu/EKxZ\\ny4BDVTbWvRXun+CJO8H9Y+KJU2ZNGlvURZfMmoI1wWk1TqfEC9bE3cU4rYXTGiyrsZbC6WAsybha\\nC4eUWdfEsWbuHQv3Dpl7S+J0Mso6o9OHq1JCGV+f/El/gC/7ym/hwTvPbNc7D6431jR427/9l1Mw\\nr82/ueEuCU9CZpSElkulBjaTQ4ggR5sxQh0uEqvoWr7Oh7OFzY/jQXyMpAOzhEMKwVnizDCNGowE\\nfjHPaNY3hpxKpzVz/07m/p2VO1cHIjnVKnFRtLROMIhs5LyQV6i1sCwKZ7ykolhIHywGQiNsoZu+\\n35463Q1s5RIpkw3GPugWpJHJ6ZJmAqlPruyY37NVRusqaBq4F3bX4kYqQLXOu0P3A3/l7/y/YCs1\\nV170ohdxPB44rJVlVbsdaE5903eZkrxwcxbfuA+7tXuP1jl7U3fakkhhqXDImUPO5DyTR3LW5Wp6\\n/oYHIwXX0zwSaNTUt5l/1i7jrlmsmWJ3ZhF7SyXs8/dGGLEjnGMPbvwCD9cCfSlZuW6WKCYlQrFM\\n8oFFpeRE+FCSNUFv0LdE742xb4SpwIueSBRGQu/t5CI0H8TeOYezDZ8FUrr1IojlKzynZcAGy1pZ\\nChyzjDa1TLlj6iyh86mn92RlvMeZ+nzshV99S2dDVUX0oLXJsiXwPq1zkdX2zGvQh894Z1WqfVpb\\nw4v0tUmAEMtDIBS0+TU6Zam0fSf5TqonljpjoE2LuLrMwb0K0du8pb1rGH/d4PoGHpyd6/OgtdD8\\nt3e2oaH4GEGYll9hwd4FbWkDGLvcXXngLavFz5n1kLh7yixTHO0eHMuBvCqaRCasfJsIcJHUWRpU\\nyxwOSfElGeqqYMSSNfzPF8TkbC1hutTmJQaAFGiKY5/e79GVoLHtqtobdlvRdHMKQV4qaw0WZpUW\\n0rqOnth2/X27S99oAe94xzsY3fmxH/3H/I2//AW85MVPUo4rb/nNZ/j7//dvsbsggQNd6B7z+4xO\\nSvX2Azem+X14FuRlAmC0GAtudufBdWfvje6CSUcEZ9cScOuZjnPeO26azwOy4Jr6Xw9nScInZgbr\\nEZ4oiXt3V8U7rRlyYd8G19uOo89bWeGJdeF4KlzlOitkAWn2CB0W09qtxUxia8F539jOg2fPnc2d\\nvRWGJ5ptXKVCmNKQe2gH0OfFs6QDzJjvCGfz2Z6jDs6y1BGjK6R09wkh70HKQ3PlSHjuvPILXsxH\\nfNgL+f2//+N529t+g9f/3C/S84v5y9/wQzoodgVr5uIcSua0Ku5pSSZr7AS3WDbWg/S3S63qPl3L\\n7F4G6zRklDIZBGjMl7Mu+BoxDx095xlkkZ8tuD13DfOcI+biG5DqQ1XyvgU9GfsGj86D3jseCnDN\\njpakk2f8aBv0Png04+u9Gzdbn0kfIU180iWax4TgpNCAfqZZjOFTOqjzSv9xMFHYYijBXP822cZr\\n1nN+W4SaZsotA9N45TQIQao+/49cvVf2wvNWum3MILY26Pugt8yjc/Dw0eB6c8ITgUYOm/cJjens\\nzbnZEzebckoThZKdUuTvTkA2Jdj69NRfQvaWpbCc7nBa0yRrGXeuEvdOcLUEx9k21gInpdCwZGa1\\nZyxF6MnjWqgFKMIc5tw4JjgV52CLFmA+NEecEI9h0wARSTKsnCcT1njwMNh3HVg9wR6Nbd85D71O\\nrbXb2/py+Jaki2LJoSjsbCyzegCB0KXFl9e8LqoU1zlSKFXVbk1x+1pUm4d01kz73gmeuGM8fYIX\\n3E3cu0qcVqOshTxfn5TS3PYbaTxuCfeYK9pIWMrcv7vwS6//YX7vR7+M7/2x3yTWD+OXf+U3eMlH\\nv4QfeNW34sDWnX3vuky7nqKUhCWUBCtT54NczDFrqnyLfq2Hwj+XmlmXmbiRVvYoRA7cFuq8rE5m\\nrN6Uhhz6dxCK/Cm5kJI4GGWFOwfj7lq5OkjxUgvk1FkqvOCq8sTpyN0r4/6iCPeFifMskgGmItiQ\\nLtVEH4mg6BDonehZLsDIVC8suZGKc1WNtezcWeC0LDx5p/Lk3cpTpxN368qhDpbkLDaUK7bAsRqp\\nDlVOxVlKY5QAtLQeyalJD7YhDnGm8qXf9CY4fRSv+cF/TlkOfMxLPpLrB7/IsRbpVLPPZSkUMn0Y\\n+yTBWUgNUhdnncXEoSYOOVisczok1kWRVdXKnJNPF1iSqkDc23l4zQXupcVWftgFeanD7DLWCdXi\\nMkC4QDKZ0Gf4YKzJWbNz55g4rUVjoeSkHDI/ENy0wJt2SinZ4xzAJLnYvnWGPedzkjX6tFSIqiFH\\n90HTgSNI0xh0R6nfHnhXAXJYKselsGRB3tdcKKWQVp0lJRssnTE2unf2rXM+67k47+97k/a8le7P\\n/9uGtyka7oObnuhNEplSCocq5xdoM9l7p+ai2I0i1N2ShloVJMVJJQmhpieQSNJ2piSXVdGCV5v3\\ngnLFim7YmR6tr6HtqTel7A7XkP68Gw9v4B3Xg+vrplZmsllTqviAhzdTVoIshpuP5+D0sqLILVMJ\\ncilYDq5SZlk0M+wm/eCaE0uVInAtFXLHBkRJHFKZRDNmvPljAwNzPp2XEIs3iWp/e5POt8Uv/9Xn\\nRFzWWQGPqdNNror/lnQWxtgld6okzhYchjGKZmdgbM1VYYR+n+UMMUhj43x+xHe+6rv5xE/8g1w9\\n/YHcu1p41Td/HZ/9eV/Mw14ZY7AuC0xuqDErXGuklPDRSaZFGTEhQIgIRwQ3DHwU+q7lxSWEsLke\\nZPddqQHVGd14dB5qYcdCMxdXNWecM0vNHJbEC5bEnTVzWCungwIyfai6D8TQYBUW8JgTI4mypSga\\nHUjnaOQGN8xl1tDSq+2N4QkfmWf7Rus+E0iQkgcdIqlI45yiT+Yztzpgd6knYo6uPDRikj61s/XB\\nw2u4Ced6A2JwYOGc9bmtdIxKKQljsK43/PXP/QjWtbBtg0/4g3+eP/elX8mze6OUylWduMjFqEsi\\n2WDNckuVKprYUhMVacTLCjWpSmZq2lNOlOrKPQudAYdVqdoLYAzqIgnoUvRpSPPDa3ArnbpUvBeT\\nlY4czWovNLDdUTKEo4XgPsAT267TuznsrjzA4U6bO6L9evCoGeet4ZdLv+TJ17X57MzX3p0Rkyo2\\nz7025sVrynjzGNRUqLVwLOqMPWVOy0SozvfSEfPjegTb2cENz+pwazL+/B+7/14r3ec9dP/1r22Y\\nyyXTRuOmBfSFmxicaiLP/jfQgiEluaSyOT0yKTnmrnlUclpCN5iVKSeZ1LI0qCWxLtIWHgrUgw6N\\nMhdIBnSfB/eieVCK0GypmzzSSYfwtsP1Dg+uB1vTiymlmWI/zr3TdmeURN4HO51tm1HZtw2ASPpm\\ncPdQWauAzc1kHS5JdtjjMiNhcpBDMqPIkt4saSLvpiQmJ810xdFVdEgOSGWODwIdvsGtlOgyYri8\\nVQLkuFJmh9rTiy64PffAHlrnTZQtN12/LiI4N7jZLoQpRcxYNAhj267p6YpnH3UePbxmXY/iieIT\\n6aj5LVlSJIvLIog5VlHO1mWkEFaJ7pJOhUYcW/cZhZR4uPnEdAZtJPbW2N3oWSOsdjO4iWBviohJ\\nJUgmOdjpVHmqZtajNv/LmjmYU3JilE4ZCY+kz2RGVDMk9XLvMJd8SykMlzph65qbbM31+Y2g90Lz\\nxvUO530jIdmezRc7hjNSxTCydXVWoaq21opl1xgsIFriZuy6OFonksAq27nzcI+54NKNqtHcHOON\\noKdMSoU1n8nZ+aFv+2Y+7IOfJNUP5eP/0KdgZGX+pcGyZA5rUYVphdI7pUA6OEscWVbnkIoMNVkK\\noVozbkMa3CTnmj66+qyaBcekRdmhanabLCYgiDk2kfb43eYKUwGRkt260cI1FgRoMWi7cTOEjN32\\noarVO6MVLLSsGr1zM2C76ezd9CwnGVbGNMXATB+uwChEDPrEco4QcCqQlTjSilkjU8hmuOnCTKGx\\nglUli18QrUTMz7FYGzfhnK/FPR7zcAf4ks986r0eus9PGesxHwiE0xuqZkvSYZlTprNrYTI1j9Uy\\nTqLgmKOolOlvX+iSargoVQJRaNOfXbrMw6JDt2TFgOR5+zaPx+fhiBmX/HhCYhmqK73Vutr1Nc/W\\nwcTPPG87MMCGtuEOYap01oNRh2Z7EQnPuvFrMfLSZ7Jp4TAF26cFluokW0ils2ajDdmBw6SFlEB/\\nan/TBITY3IjaHIqa4V2SJ/3YnEPZ5ZB8XBH4/J+NhBgqj0XhyRR+2Ae3I5ucmHhIzZO3PdgHPNrg\\n+rrhqVKKZpBrCObz9KnzGw93zsuB41Xh0cMzg05agiUf5/c+WzgPILMgYtNIWbNRTzCMFE7UfaoZ\\nNEYZHjzz6B18z9/9aqK9k//sS75e8/YOfXTc5W8f7fKNB6lncm5E3+mWubdk7i+JwyFxWOUyLEkh\\nqFaktCle8blga7uLB8FOtzK131rGgCnuezj7cOlTuWi3J0i+DtZUWZZO26/Y9sajNhRjHsgeH0E3\\nh56IrINLRKvAPNEPmdI7kbrE/JsSJXrfWZbKsibuZTFGui/YtD33Pnh0Ds425XUE25AD8xV/6ou4\\nSloU5xkead4JCqNBK51imfPWuarBCKlCyA0fCy1JQy2HX4LeSWkQsdwiW5nJJ2aXUYIOzz6h32HG\\nSPrMpSnIvZDDmGYIBximFBKbSo0hhKl+LtMuF4vPZdtI4AvDZknsYjhLTTDHcq4U5bwMHfqtwZo4\\n2rThpwEDrlMmu3T1ZuqYUzIGKjQsiwx4KEdy8edY0aVcEgWva7eyJ/oQzP7cFCPUPW6BVCW972P1\\neQ/d7oJHdE+0MPboDFOb9nhp9Dh4zlwOnfnSaHYzmbOHkia8WwdiDB0auaAbOMHVrCbTfKOXiyd7\\nvpnuUjDAJQ9N2ropBmUMu5W0qGqEpQ7aMCw6OUmFkbP0pGFBpEGyLCNI1qes90HqamOXpK225cwh\\nw3LQYb4siWzgqVG4yJl0KuYk3qiWGjo/D0Xy8ZwuCwipQoaLlH+pBmQksFuBoyrcuA3j7JvPA1na\\nyNtxw1wJDHeaJoHUrg9mLpLmnHuwb1o6nkcS8yAX6V1J/NK/+n6W1HjBR74cqx9EbEZNCVzSnBQb\\nZuW2ZzQS2KAH9EiSUAmUgIXRPZF7BQTQ7t7Bg5/+0R/gNd/39eRU+ZNf9D8yzgcIMDKNmBZnF/Sn\\nGRXHi5GskKuxLAoOrMmmiULzeJuKmoyqatwpZtOEEexd1VuEwy7kaABjr7ThbFtnhFNr4apkaaeT\\nNuCenaVUMp2blqAP9pj69XDwLAtukkg/p6oQ1eY6gG+CnJPSlOuiWWUEeW70czYOdb2VKybLjO48\\niqAsibQJrLOEKHRt71wthQ3jTllgOJYH+y7+65ITbNpNlDVoJjRq2ofGX93pPiTNa07UxB5BGsql\\nO+Q5yhuOLXA0Jp8h3VbCYo9odqvPsn5NT0Y2sGQz5Tjm2EHJxW1oDHb5/AKUyNz4DpFm1al5aw64\\nGdCn6CzPpJIosi2npvDTG08sZSGPjC0Dz0IO5ADbnX1IrbHt0vy7zSRkIFlmLcZx0ez3gnYdQ+PC\\ngXZIfTjZKrjMT765yHEM8Kx///K+1QvPX+miOVyPC6Ix4T7oWfNOHbQKbWQkPKuKS+gFz0Xta1ry\\ndFHpsCkZHXaznCtuHI/K8yrJOCzSCZb5aBtaHu3z4O3TfROBKsthcp2YNqMpySpaktB7JQW1F7CN\\nm7gcTkN+bVvIIfB1jM4KeJa+dTGjrom6BCebyoOZ+Jqy5Eu4zATM7zGWmGm5U5COqtxzwDpv9sXm\\n/PWiWhhK0tBF9dvPwXogELNpsWdolluAdqk0LnPMEL5QTFjo18GjDbZr5zxCo4mQGmLvEOOGuzzg\\n9/2+j+Nd73oTb37DT3D1MZ+JLUZqBesydtjsWLCETzO+kdinVqj3OeMMpTlo9jUjrh0ommO+5h9/\\nGx/yQR8AwFd84Sfzpf/rz+Oj61DOhb3tJCtzTp9mKy9k4VUugqCXWfl5hhQsQ1xZwmiEomQMwock\\nRiGb8vmm04aE9wMjpxCQ2mHvFyvUoC1ymuWQxjOHXtcRGbMGEzU4XO1nKsqzK9bU4cQGXe93TlU+\\nqpKpuUCKqVQBrBBNltduYoykNAliNqRbzlWmBTszXE9EncAlN3jYlFqAq+Bprkv1MDZqKSxV8KCc\\nM4NMIRh5F90tjFITx9ZYMNKMf+gpKMOxmjjKDSwgf1KAJMyK1ENOQ59ZilMRMLrkjgNp5C/dtmom\\nVb1mcyE3HM+JUop4LhNqlS6KnpRYAs59RhiRiNb19yepQY7z9dhLJntgKrexSOSDtMy1SzXkXZCa\\n7oLd1MVYZnFjKak7v5Wx9blEzFpO+uA6CjEGnhOtD1Kgijx0/vyuDt0YJj/0UJ/7mC7mujnHmG0m\\nUJ3ohZZgZCcPMBRjXJBwv89D2WDCybWoWgpkgloF4Cg1qM8RVxhT62ehOJKmw1d/hEkmElpyxfz/\\nHMA8KEPWvUjOmlbW3nm4DZoXBh0uEdNIoO0k7iRjXUSKryVxzBK5L+VyGMqdZ8UZSSaKGIqjzp5o\\nCY1ApmohNS2x2iL4tgfUubAYNmdhcyYO3G6IfTIG1ILN8YKrgh5N44oLKER3iT7EFg6mw0qXU9er\\nmREjwE2HRipEwH5+hpvxdo7HRMZ426//a37Px30mrQVemS3XInddqOU1HtOscG2SpWGWg3H3pOo8\\nOqsXeoK8CZDza2/4JT70AxK9DdaU+MCnG7/5Vumf2whqVmWjZaFmcD6ro2eL80R09iiqqFtX2nBN\\nxDBuAlKVjnQJwasTQMo8ez7TdmjN8SQ51vd853fwcZ/4KXzUR33E1A0PKgUbIYUHO+5KTIyUidZu\\nOaxmUCzYTHD0UpLclknFQ48pUeqDOjXpmw9qPF6w7X1T9RQz6cFl4x1zi1pq5RCyRVsqMmwM6BOQ\\n3gjokmMuxW7NP2dvjAy2d3I2TkumpoatilLKttzK2Ibp0Dsno0RlGYOSYORMDXWOS1y6LnE4mIvS\\nMIimrtJmdRtTuthijmlU50xb9+PED40kQvKwWw6tAzE/p/PvDOPZG0UjRQpSkdqE7jpckzjbKQWL\\n73hOpMiYy+iUQ13oJcljw2g3XQvQOiheCNRBmmUidroXSSw9aXyyOzak2y0e9DRYUwHrnMfAelZn\\n9pyR5+/o0N36LP9jLmUMFk9sNkg4zYxDdLoVbXEY03oirZIByTvNhStcZ2JoNhhkclHVVxLkogpX\\nB/B7fuNa5eivuGwck3rxeSNqlrSmCdwxpo1ztkWzLCwLlM3ZhsjzZYJadhqrKQ+uFNmMIbNmqSS4\\npAIs+rNSdkaU2XarZdp8YDilJtacSSlYLYhVacTNZAPeQ/8OUpCndTAF89ZXBeGhS68NfWh1g5p8\\n5mbTqqqLZ0x6mf4oeeoh2HtACmrKLCU0YrHETTNKM667k4sYGE8+ecRovPOtD7m6WvjVN/wL7n/Q\\np8KAalJiBIpnD9M8DpNLkSFffHQ5oPSgQPFEc9ljI4IG5Ogs6wGza+6/4B69D/7S57yUv/q//4IO\\nENWGGg0kk8g9NEaoqYiFkI2xDUaB7Gk6J0X2z+ZUL6pYJnfBkW1922HbGz0S2YPfeMvP8bM/+NX8\\n5KsP/PVvfA1hgsIvaxE60IzRMo46NrxxDp+KD72XzWwCl4xzD5IpRULzeCO8UXKmpEIt83Ka7NrD\\nUqlrYcGgFlZiJo1M0lcxfBgpZXw1Ng/qyIzUsHDCEow0tdd64HPSYdy7mLSlAO5c952cK3HeWQ6V\\nJSswM9cuuP9EN44x1JGQwRUQq25MIZc5BRUty8yN1nTpa/mLusewaYKY1L1s5Kkxv1Sm3I4M50Ld\\nLiopF/DIjH0IsrS30Nhp6pejOYup7U/A6MYYnWVZ5Dicr7/m0jNCxwOKOuAlB3ek3cSQm48o7GSW\\n0VAufGfvMFJgm7NHZvQue3TJIipG0Hblz3XXcj9urSC/w0M3Am2hHR15kdiShMWpOwXnbEWWvTRx\\n255IQ8zXUxjZTPHdSfIoKxpil2y3H7Jc5gw1lqXbAAAgAElEQVQ3B49Dat79y7Hb+U8qgqOHz+lx\\n0tZ3zIqSDH1aMXOCHaNnKC24f9B23eqgnWV9NBusprysZZFkrCYtxRrBkgogUhgjkXIishaEgn3o\\ndoxIpCKHktpPYxv6fHkEB9eh2Wd/ll1jCDNjdpiMy7z7oqUdsI85thnBpvGYcuK6MtcwVTf23Lm3\\n6aEfTb82mWDsh4OSVrekgZlZp9rgmXe8lQ/8PR/AE08+TeudN/3kj/DyF38qfdP2v42dO2lhz6b4\\nz96V7tATO4Pk4DY3vei9HFPTNjbHmzB6Poxn3/5LvPiDPgrvstzevXeXkm9oNyf9u5Oqk4ZTp/87\\nbcHwnZLkHooRNNcoYevSdB5zIWel9aY0iInr8xFc77uUH+HKCVucr/riz+Df++gP5y3/H3FvH6zb\\nlpX1/cacc6333fvsc7/7ExAQKSAdIQHFj6AxhUFLJClEAaOpRBPLSKEiUYmmKpYxarD9LEStgBAx\\naBVERRosFKOCAlokSDQopcRu6Ibuhvt57jn7fdeac4yRP5757ttU2/deg7ar6lb3vXXO3u/HWnOO\\nOcbz/J6HP8aITq0LUIV+LJrfbOlyvS0b5islBoQqIs9OsYUrjL04LWMS9RqHVqh1mXE2quwajWzO\\n4obR8BxEqxyysF6p51tA1t29UotLwrYm6164aXAbzjYUGy/HV8wB0VxkctApDHYyF3wELAGjkgwi\\n15ly7LRW5fDKnE5SyTk1jRdqFdPpwYd05S1gWVVQuV9kjtrk9Xwa3RTmksEE6MzhW8KkIKqqZKo1\\n4jIjV9DBGIOtG/se7EO8ltGbGMdunMIZWVgSojpejVYX3fOtU3whbYeiQFsbhdGUCtNSn+dVa0rT\\nSKmOzuSMyTKIQU5oVXeDAe77dKlVYh90d/qQDtqj0nvHqzH8pzhIC4f0yj5BEjEHKqq0CmNi/kbu\\nUyWg3W2/DWrLaa0rFCqbBVRjQRCchqpb8TJnC+JDLLiXF5tzYF5D/R6KLMTaWVM9yAR2fbijwShA\\nl1Vx35JtJAuGl0pUx0rTF2NdLN7GTD82lkUSp5ICqXiZN1FxLbZWmSZCDstCxBziEWzuLGHk7Ose\\nEvY2X+9sKVzskhceqc9NMlNVwb5JBje6errherDqHJplAR95p4O1mNSHRVQlndS0OUUxoqrlQabA\\n8qvCHJfz4HS65YXnn+WF55/nK7/iq3jyzR/PL/xVX0pvlTE21lpwi3kclWW0n6dW16W+qLN8qRfG\\nRYEShdIKvssLf4HHPHr5lieffILHj1e89/0v8Ns+95P4H/78O5Ug4s5Aw7g9AvMmZnE2tl2L6AKM\\nIrJXNlg9ybZzbcbWtWhvpWMpP30MLSqtFuyYHA7w5qeuKexEP83+u+FdldrDeQJS33QQZyOz0wd3\\nC0EpCgE1g6ulYsW4WhrXrbAeFXQJKxTRzcRTr2QUTtlpIwW7qQlNWW5SKAi04qnnZbCIrWCCwINz\\njqR3bQxWddoZZtQhm3uzhdIa6zJYU4XEIaWs2L0KGL/uXNnCRWcoNLDRy1wQo3DuTisFb0EfzjUL\\n56LPW+ESl+d2qhOKFuZktsvmmuxwJ3+MnLb+OpU3RbHzrVR6Fa86T5A58CzT6j312sPJogUzClhM\\nVkNrFPSgRHHNmlArLmeiV0xaWDMN2syc1gv7gO6DPtnR7kAtQkO6k6VwZw/YC1toeL5nJyc2s5uR\\nA2aI0P//RffWB6Q+RE8R9MO1SGVR6T6biUgeogdtTGtpnQqFgR6+C47xsrQ2U6tB6+eHXnAvV51O\\nrlLVyrWc08nZvA/TZP6wauBESOxuAae0ibTTkSHmwA0GMQqtLoLEtGRhIYscF0rTBaEbfVaxkquN\\nITVCWmBWKQ2OCVamXdWl6c1U36nNflY1iKpnEcAtp90x55BC1VGtUwI2dYH7pu9hqYWc8qThIiLt\\nkVgJBeptyZiVxJiOilYlw1qtUppSgnPGjr/7Xf+Me1edtsDtyy/wyz/nl/L2P/7nWaZC5bC2KV0T\\nWUsnIPVwz3uQIynLxfqt9zE8GTZTnV2CclWe6j28+NILPHZzj8fe9BbquvDci8+JMxuSHEZCNw2U\\nHJeCIJy0UPWP3HVjccxhtYYX4zSMK8QAloUWHu1JQS2SZb6Hr/6Dv53DvSuWUnjs/g2cXyKOz0yv\\nvTTbVkQ8q9kIjelJktqSg1XWYyM9aW3hajXWpsSF4yq3l/60SUJ3mN9xwnDnni/kKvhNacAIyrIo\\nC2w6pUYkXYIPzh6Ei30xsjKAQ0vOmYzhuBdaSJlQLWm1QB0sYZTaKX5gW3auY9XspAr2tMzUDbPJ\\nWoi8A7t4LeRIWII220ViS8yhcSoDUCDyKceakBjJ1y5P7uWeuVNiKSaH2V4wtLDn5eRrLGuyRRUu\\nAMFxcFVZa0IWRS21oSgfjz5daEOMi9mLFrRHLTf1sJ0xJaVWJlUu1Hv37owIzgP1nkkNNIGrOSSE\\nnUy4zR2GGMCj7ERUzmO23V7les1Fl1Tpv6VK7nF5aEqRSPjCc62QwwkXfWkQ1N3gMKi1cZUiOpVj\\nAdQ4XxCL8wJDfj1XmW884K6HJKnR3FlJrpfJhiD1YCJfeGtyti0BMQpLKzxE/Wh5ryUi7xHYIViy\\n3DFhS6m0GkJVmqRfSkpOKI39Tv4mile6Frw0Y2dow3Ed+1t5xaF2gYmYachYQ3zRy5xCAyB9PgFY\\nHarkDSxnem04u0sutadx5BU61nC1K/oI1oDIwaMiVOR6UAuAWvju7/4ufu6nfxJG5+HLL3F7+xJP\\nP/0EbXHqpj6qzZ7cMpUAewjtWAzCKj2YOXkydYwZfzNikGgiX0Yo48oKTz/zDDdPPM7Ljx5w7/oe\\nP/1jPobx4HnKzVswnChQh1KW2cXvKMUoWcEqkcqn0vdfaEuZMHKlKUjGZfo+53GnZSXrIIvxf3/P\\nN/AxH/kUvcDN/Wu+7+/8b/x7v+SLVTGO+bvGojbYCqUtrCGCXLYqc1CRQ+tY4HgsXK1FUsFMsmoh\\nyoDhhf3yfKRxbBVnyI4diTxe2swl3nfRzkZj7z4NFDHVJoN9JGcPWZV9Bg2YeqOzUKe68tj2Miix\\nkGXQouJF+l+z4EjDcxcUp+p7uRcVX4OewTKSbIV7poWwW3DoRQEAVQkxXS19DpnqY1f1fpeAWHQq\\nKfmKHNJDhdky44ASYLI/asxkidRpsxb93b0HW3Sd2EajN5241DdPek2u7qSklcyu8NkUYzpzuhKR\\nGiRD+Yc2YTd7iBYXLopgBIys2rhNCq5HZWe1BkUtwr2rMBjmEG0O9AO//SlWutLUOmmNpJIhYEp1\\nWfIyZiemByMqp5D/+OJK069PxtKp9xrLOsX8aHdpORvv66tP/D7wKlyqKV2Tr/yTKuWLFK2anF/N\\n50I3h26WsJlSiqOEBPUIrdfqQvGYMTIyHSwHo1UdJXWcAsfmDqkFsDQNtkZMgAqoUm5VbRFPHIUU\\nGnCYO369LNIDzrP6rQE+dyKbU3JLZ6mV3UM5aS6JUSmVhhQJq8viulQJ/gcV33cIeBRF1tiWsIDt\\nOtJWg7beY9t2/s73fR/f8z3fzXZ74rR1WtxS40Y5bfNz3n0mHJeVDKdYsNULtCYwFprLLLGddQKI\\nVEROIqVHKSsvPvcS9+8/zlve/EbuP3XDjz/7LO/5f7+Xt37yZ8t80S+ngQLFacUpUQkPhncNo0py\\ns1Raqawmr1yf5p0xpFcdu5Qx2aTqaPMbHP3Evp8p9ZptH/z1b/4zfNov+y0YGiy2pYnnURpLkdlB\\n6RdOqwvL4kpHMTiubfZyc8YLzRMY0BPKPh/exbgKmRHCG7s722hEqq8UcbGbNkY1Tl3AHXdnREKb\\ni3SBdQ5Mh6vPSCr/q3kQtSo5uysRui7BvVa5tuCwNtalccjGGH0qCMQ+KWuwV7Ch2HVbpGVN2tSf\\nK7PPuvqc+5ytADwyVak5dEQfNsleOe20GOaaZ4QLus98DkhhIi31Z2Kyds3R/KgENYLd1eKJgDVg\\nFLU51+j0ulBdmvwyJ+tjJGNx2hxGd6AN2OnUNpc/GxPAXylrUs5SzowRGqL1QbZG2YuSpG0Ilh4x\\ne9NNxoiQbjjXVy8hX1+lK2MrWZIW0DNnw15i5zHNCcNFyy9z8scCEY1tuMT5nowxPfVbpa5Jd/VI\\n/XW9mPkZMWVR9ooo2+yD/5wm3vrfbqpYD4vRzyHSvoe4pzklb2gBXNDNVYoWl7qoXVFNv5tqZJ9M\\n4YKq1bwYHAS4jiEJjacq+0qhlJhADg2AcogtIf2ozVSOZOtzABFayPuWU+NoU8qPjk9TTtbn51EN\\nwoK1ClHnvTD6oPdGH8FQ0h9l6lHX2rheB1d14Zvf8Q7+1Ff8ABmDZ97wNH2H973vWb7z2/8an/gf\\nfMFd9HhmqpfLZWJ9CUOETB2Lg+VOa7wsC73vjJTFVlP1JOyKFx884E3bjpUFNnjisSf4jm/+Y3zh\\n234paRW3TvSGLUkOZn9XcPHLIGaZwPeMwSmZk+qgT0+qZVXvjkHLZVZPg6tltogIvG9cHRfe/8PP\\ncXM8s/d7LMfCcYYVFnNFEJXKUpO6LBiOpTa2pajfrGy3KknTdBsmwneWmtzIskEPCDf6XskuWPw5\\njTJMBVOmtKWm6vO8BH2rqNyQumL0wUunSqvSzJ+GqrfDGKp0feClUWMlS0A4JaTBXatJxthc5K2U\\nWcQDsssBVqej65IYIxnaABaY1efoMq5UnJEiC9apTmjztQbq+9YC6cEwYzuNu3y/tVZyBfNCTn3Y\\ntjv7npx2bdDkjG/Kha3s6k97ZS8hEmAdjGqUPdmLHJ/Moiyy0U/z3JtIymZTiVV3ruqB4VKTRAab\\nd2nDu3T/kWojNh9CBEQoAccVVX+yomCCpjTuRipm6FWu16FeuAjCJ8AiFYvSfXCm4mcjijSjwU4f\\nAmREaHCR1nUcddiA+zMAL6dj6KIvvWsLv87r0tvNV/lLho7lfb7R3cQtGNVoZ93oPpT3ZkXUroM1\\nyY7qBITY1BHuQa7zSMS0MDuSTE3gwb7pv28WULSbS0kAc4lSxlSxyQcGL3L3ZQbNi6b9UzFyTlUT\\nuGO1ctFcx+DOcpjYPJYVohQyBQY3Nx66kix2N/BktznU2iW+8WrUVmAk7/2JnR//iZdorXA4nnUU\\nDudLvvjX8xff8ck8/oY38S/+6ffz0z7p57F7Tmu34N5t0YCm2AJtwdyp1Rk59Y5IZdHn4KePwsf9\\nnC/kh77rT3N1dcW6LDx8+JBMeNcP/iPMglMYJWS2sc0IKsMHxRT+WNvcKD05qYDU8XVXP6igXXnY\\nIFBLrBmspbNkFXch4f5jT/HgxZewVri6Xvn+f/gP+Jmf8lkc1NwU0nBiS1udQ9TJdmXOBsz081W9\\nBda1MdUJ+okpEfNpn12Lqri6SrUzHA5URpegP1ygKLWuCq11fFkYe5+JLU5thXtrslE57xry9rNz\\nLtINZwhg5IROCBpb02zc9awJwV4SVfBgZD1jHLVhzmer0NjTGV444EQXG7jvMWci5W7R6kX2/WIy\\n5pQhB9mw1CKdsO8q2DDJIBdTVFKb9tyRM2EkBLnZ0pUA7YU+TDzuCDabWvHd1fasmjSXURkmnKkP\\nn+qO8coMZkmqrRQf3JYdqHgojHS/pOGMoJRGhpNtvqbZqmSaZYTt1ES8ZOBZdar4qVa6j06bpqXT\\nlCB49eA2IHdNA0/nHVAPzUdhzN7I0grWBLUYVb3LzQdtAK3Qkjsf/2URfT2Xar4ZD2IzOeBfchUT\\nezcXLeotBD2/Dgmpc4dHIYdJsWnxOwhBmUCWgVHU/C9G9FnNBHR3fChI0KZaATPMBLs5mJwtG+p9\\nnzMpBGtTz0/3qo5PvdkUh+dddTFT03B3SmlsIyZERhxdzQg1SPMUr2ALfcaBoqj36Iyt0iNpWTiu\\niS1GlEoO55yFcnsi88hv+71/nN/xX3wGb3vb28CCd//Ij+o79Z3P/2Wf/MoHn/Ctf+95xjiSVVBz\\ni8K6GM07Iw+T3KYqUqnBijBKq3Q6jvFrvvjL+B+/68/w/AsPuLn/PPdu7vOJn/ix/IN/8L38gf/8\\nrXc9egN+3e/5Zq4/8tOJcKwcpiyxy6K9Moe5EuJTCzEGtMoFpg+K6ImiqCFbCoucNDz/7LNs28bh\\neuWJx57g27/+T/CzPvUXY1ZFhSOoJcAWTDU8h6UwerJVp3nBDko5yCwzYViLghVpQCMMb7OVlpeb\\nOGmLTdeW2nPrIomWAO8TvpQyCQ1zrEhJkEuBLm5sdVQVZxCtcJ3JOSBqEF3qiVor1wcobQDim1gE\\nuUzTwgdWPZvRD4KD0wSOWoq0vq0Ubl2MYJ08FPeDTX2qF0z5NUSbMiNCFfac33iX/G6fGuxizn52\\njANRBEnquxKYByH+wpggpumlG2NMYFESvmFVC/+aM83CBAw6h7FFl6koGnvXcLWROCLilTRiqhY2\\nzznDCvY6e9KtiJvhriLDZbCoJqhQmS2RzkJEp5RKTrPVh7pec9F9cEra2jmWwhIVatCjkiECfUSy\\neVBSybip8y6ngDJdOPcO0tTVWjjMSXiL2ee5q6D5V6p0L2vAh1pwL1cxtYvjIGnVMOO4aNe0KgNE\\npsIfHadVY6nGyK4ddfapIjWHvu2GuU8jQrmzctYqlJ70hrLFlqbKJbvaMbUpKfaApmQ90cLlU7Ez\\n1RaWUFph69Pt5TlbGarualM0eFqhmzzl7iFlA0LXVRtYWViWTvVL6J5R1uRXfvrNhTM0J7iNn/Wp\\nn8q/+7a38fwL72cM4/nnX3xlgZjtm2/8zh9m8AQPQUaLizklA7ch2Dy7jnRl6jFNpDCs08fs69XB\\nGkcgefHFF3n48CEvvPAC+wU5xSu3g9Uj1/ffSJ8qksjkmLMF1AILZZd008N8YSGXGNjU27bFWDOp\\nrdKplIt9NJNHjx5xPB45ro1b3/mRf/EDAq8ERMpokfNzaldS4bQx/9uAUiXTi0Od6FAd240J7ket\\nhBxaCNsi3ShWOO3KWwuvSo3ocApZ7jMkXRtT6zpcx/zagrppThC+k1a4zsqZM4uvdAaxpVx5RQkr\\nIglWcGEPhyfnM9To9NaoaZTQwLVZkttOXRduwzlUY/QuSE5Rn5ollLSdsuX7xZVKUFMzkuqmrW5W\\n9yAHp0cyGGDGvssRyFJpZbCfZIjoPdiQwiO4pE4YbQQvnTQE9eles0vhgRO1sZRF0sqLOWMMRq48\\n8g1jYbiGeAdTFlrvUvWUyYWIMEJdfUbp9FHI7KxZ8XkSthKsRfjS3QsnV6Vb67zfyk9RvdCHa5K+\\nLhzCaV2MAh+IpmTKKgNosbL5YCE51AOPxk7vlRf3ztUotFxozbm+rtSaeJuqTpsTh3/VVfd1XpeK\\nl6O+/NuSPLFM/aUXdiCGEV1pnjnjSS0la9m8UFD0dU/hCLdzwOLYCDgE62hQgkriVVPtNm0366KH\\nN4op/TR1MhbCtrAUTV8V0KdeVIaq/4pODnVKWxRiaDimfi0K4dtDDyiXyqWsWBOZaSkLFxttLUct\\n4HNBVZ9r8MPv/Me88Y1v4tmfeInTaeMDkZ9G8rf/4Xt5YX+MMt13w00yqjaEDcxBLEXpx77Pqbzg\\nOy89fJ7f9as/nuV4Q6kL3p03ffQn8Mwb3sRzz71frq0P+H2X67E3fSr/5R98h17qbmCFtQK5Y2ul\\nuQIFzWYvtzjhRe7BUFTOoWjAkbP3brbjWbiauWQeQVka5/OZ8OB8fihljhnVB+cCJYybZfYEKZwz\\niGwUHxqs1qKUAjSg8zGP1ykesKccXV4qOdQT1ECw4i7H3cvd6S5Ww07gWyHTOQ1jNddGNheFw7Hq\\nd6wHrA9uzVmm9TxGYAOl1lrM3y2AU10am8t95sV42AvRfbZPDKtOD7XQDjkoS5WgsGhMDTljbua9\\n3CTjWk2FRdYLJgC8itPRUkNUimA4Y6hVaSOgBmapKKU5bBvnwRlJu/Ze6eHsuyRb7oVaXCc5q9hF\\nvtpiMlaUXlJdm9oeO1skPTs2miSvU6OeGFs3WqtqXWTQ6co+S2Pv2lBLgUNt5G6s1XXqicRsnYXG\\nrtZemiyl5kS+eij96wDeBLWsEgzXhiPe5RgDV+6HwN9IEnOYjpoYGn6cY7BtpmPtlQMLpw0Oiw7Q\\ndQKr/s0st69ci0FdxEE4hjicag/IRXPak1gLEQUfRu/qryoUb7BnvTOFnIezA3neZc7YNIjoV1UV\\nWBRKBsNEFluKTQPFtFnOIaQPVYqqhGzGCEmz2wLJWjBY6owxV99tHy4IfAHGK061VqXNvCRWjAhK\\nWehd2tbwyj9/5zs/+MMx4/3PnXj/s++6G4DlpRQG3vzmt5D2BI+1aTclabvjuat3nwtmC9lnaGk0\\nEf3diQz+7J/4fRQG/fzi3a/8sX/+PchIw93v+cDr5/2S38qnf+Hv4LwhIlyZS5oVDlbpCSdcSQQu\\nRkNrMqfYNMpkJlutNFNMT5mRLcuh0lPgnvOePFEWTpsWZx8bpHqFW0DiXJvCRs3V668mTai1AjbI\\nbLirvxlThiQnbE6+iLGNjsWiFsNiU/3jDDc2FFmzd+Ph2Xl0UuqZR6FeUqRXx8dOLYtE/6skYgWj\\n+bTsjmm7LnLxKWSjgV1A+eIH326DZXH1H6u9YmAaiZWKmxGLYR60o86SF5facLVPThHYNmit3kU3\\n5bwXlyoOBCC5YCkC+pDajEcyKizDyKXim9NTcfTZC3txbC/seWbs2uTGCEiFeLqrVYcZWTWRy9Rs\\naevOodWJCIXCyvk8OB6Mg5qBRFYleLeNbQ9KWRklOETDKHR3lllANBI8aGul2oI1Z03Ds7PtybGt\\nLOuE2l+SGT74dv5J12vqtIpVTb3T6Vtn33dO511E9zDSFTXuqWPUS7vz8qg87MEYVYmpDlvCOZzT\\nqbN3NclLFfHHyr/5RVdvVlE39+pM111FTWrFePyqcP8aDkdjXeFwT8oBq0r+XA9wddDgYSUoFlBk\\nFnCHR2Nwut04n50xdjxd6aZT2VDnrgk5Yd0aoOwjtYDs0gdue+L79Kjn5NF2CbQvZPyrGXFjVidT\\nOLm3NO4dVh6/Xnjy5sDNsXBvOWBV8etqhQze+pa3/ks+meTn/MJfzR/55ndpEZ3fzSXF4n3vey+F\\nTVbihBIVxzjFyjaS29PGS+chFm0m1M6xJIdD43io3Ls5fNA8VwX5B9+dH/uxb+GNb7riPT/8fcAy\\nnYGCx6y1EaNzO5OXQdPoUhdaqaRLU3FJazDTEbci/Vank1WYSQZ83Ns+Sxvu+Zbb21sePbolE/7c\\nH/5vp26vc20DM1cffjrCDhlqk1HkIoskbRFwvOsB9Hlc1fTfqamwy+GJd2PvyR5yYZ32wak7Dx4N\\nHm6dh3vwwm3w4u3gxZN4Dg9P4g/4jJvxuUmXi4Qmgj4G583ZSsG62l1MPCpWAA3ovBRIzRr2wR3L\\nuVWdXEsblJgg9nBqLew+2M6DdDj7xu1psO+FzU0DqNlCc5ItBptLRxypQS2p7zHDGEWusj2d3vXe\\n+w5jD7UJRtIz2Hpht8B3xfREaoNoeTE1MZ+DeVJyxWTtigIGVEDcHKRkAZvM6qCWnZIH2tKIss8W\\nVXAOp4DaSjWFLGhGKUG2nQVYs9BK4/pQiOrzVCpnbqGwLD/F9kKrclD53Lkj5Z/u4VNb12gUdnfR\\neEblQWinHruTCPzdMzhvyXataq2assJKsZ80NPlwXSsi4Q9Fe5FV+r21CU7jA/Yj7F3Wxj1MlWkp\\n+HJgnJ3zFvTc8bOzLmrC6+gxKfRTm1jSca930JyzB0Qlc1CqhhDUoh4kTjNpIcOSxTSAaCPBKztB\\nHdCKbqClFagLFVdII44VAaG9SnbiJfENgUB650+/49180X/yUWQav+63fgWf8ot/JekH7h3Wu+9i\\nbcbN9ZGHpzPnc3A6v8Aob9bRLjrbOdj6Sb70kpRdfc0j0FqhHAat65j1K77gN/CP/uaf/qAC4D/8\\n3C/jn/7gP+HHf/AdPPn4NU89cZ91acTxmve+87tgm5Krg1oxq8O2CHROSje++BCAuyTplWVJBuI8\\n3PXWaiHODseK+eA2C8dq/JYv/3P8ls9+Mw8ebIzxSj/5O77ta/mOb/taLqzov/zd7yHDqOUgydBi\\nQnrWoNHwIn1yIpOEV2ly0zVYdpM+mdkaoo8puTQijb4Ptm1wjsJpg9sO5z4wK3cx5LUOjgmZTsFZ\\njtLlxnwWbzs6ShclvKQ1ihvrAtetEmwsdnXXo3ZXsbOYCoK1OddW2Yu07dYayyqxY7gTPYi1EmfN\\nE7YwbofTtmBpcDgmdZvRQDheZIbZM6gmhKtyEJ1mWvwvuv+e2ukVqyUHnFnQTNyFSPElVNwWWcsx\\nSquTNSJdgUfcucGyKtEXd9x0qhw5I5WysVghq4wN5lXfhUn9k2hNEBZaoQZXy8pVGrFALEkZTlql\\nRSh63nfl+BWxVF7tes1Fdx9gFvTU1NJd5ffmCzE2rAU7CPjgzmYarMq/DqNWrnAahWMVsWsxaC2J\\n6RePCm5BtddjBP7Xc+kmmCaLizayGatJ7jaqdLKtJL0W2AUrXhY4bcn9Y2XbxaXtPWVzvTpwWIwx\\nOlsuHDC87mDq79ZF2lqLqf8LCJpkSEhelqlFpZokWU5QrTLCpnNNrz+ZA8ghahcp/unV0hg+yDSa\\nu45RruV/kFhZuXnsaf7Cdzzg1CH25ORw8s77Hj66G7Cdt2BdO4/fPzL6mc/5jE/k6//Ws8RQHliP\\nmIoEGLsq0WVIqG6lUFw9yaTxcR/3CR+w4BpY8tXveC+3eeDd7/kXvP03vYOXXrrlTW94ij46zzx2\\nD7zwV//kr+CXffFfoaRiwqnBYfI93KcWtUm+pONdsu9l5r2pT5ctqOeih6V1Dgc41M43fd1X8re+\\n8e0AP2nBvXuVppbRN33vo5mUUjgUBYeaCUqeUzqUJhlYQUoSZqvBp404nZmmXbDJD0iHcybn7mzn\\nwqOzTSC6GCe1TjutJa0GN8uBUlVJDtPwU1IAACAASURBVA+qJ8MHWw8ehSzuw/Waix+prQtHOApu\\nTmsHSm6EqQIuVQ5RgNrKnOEaSw0WGqWpl0+YOLFW8C4J1skrfQzcjb3BdRptS2IJSfZaxXqfpzuF\\nTxo2xQzJ7j55udJce0/GLtB8CZlQ+pST9S5JpAaWE55uE7mYMcM2E8+dag2WSnQnSTwHA21+xkLU\\nQfrCUn0+R86SMLILkO4raQU32KNQkbGktUqS7KlTjjLSYI/BvqcqtlogK2UWlK92va7kCA1b1d8c\\nI3joLt90GNaDUaR/ra5FoyBZkkXlWAZlkYJAfZ7KYdGH1+YDqAexTCXrh6/eFefpFbfMpR1T0CKy\\nh2yO0ZJ7FE5d+LZSgpxVxMkqwwbphboFL/Zgacm9FYKFSlHlesdtzGmHFIWNnDDrksQIiIJXI/v0\\n3M1oI5v9KMuLO427CsCrUXrI7trlUNNIRz1Hj6myyMpGZ3GpKIiC28BH188NePqjP4vn3vU3AHj5\\nYefJJ+7x03/641wfr+n7yzzYbmQCyUbmYOud47KwlMpSkli6oCFFAHh3+di/+m/+BP/1f/xGPvKj\\nP50v+cpv4YVz4h7cf+qjAL2Xd//o+7k6NGp9gpv7R37gB76b4yppVXUlcHjAEolfmKfTwXSsRQOR\\naR8R67aq+lgK3/o1f4Af/M4/pnnDXT3/oa/rx57ha7/ln5B9cKiVQ0sOtVFrcmiXGPg6UxOEs7RM\\ntYOQRnaf8+ERcjcFyRh63xkN92QbcHKnVqMOab+rMnDUR51zhMhLpRcUVwW5R9yxrvcxWNx4NDRQ\\n7FOZu9Qhx6Kpui5zM6mlUerFhjvTfSNpvchMMipxmFLIKfGs3skjXPWOkFHq8d46M9QgZINOQW8k\\nTzfO0wAVofnJtg/CGsQQe3nvnLKqGAmX0sMLdRFwRzK3nPe/bMktVdhFdJHjOOLWKeEzX06f/YIY\\nHZFJiyqbrjSg9EuvvxQimkh6xSkOxyKOQ3T15XuVZOw8pJxh0Vp3dVBE0lqX6dM34pKt9SGu12GO\\nEOughCg8UmrIt5ytaTeYzNQxSUEyU8yFIlITTIPlWLl3LzleFa4Os62Q3GUrldfYIf5NXHeySZty\\nJv2LvrA277chNGI1heOZF0Yq1oQ1sF653XZu9+Bqrbgn1ZJ1DUokVofMCKMqpysaHkMLXREEyM2o\\nUWdfDGo4VhvpA5tVU2V+RkVsi9GneH3Ta24oHslSiaTbNHLQgpbGGM5qldqcGE2ibozlUO82xC/+\\nY9/A7/3cJ3jm6StqW3jqqSd44t6RZWm8+M++nfUTfg1xvmWEXletYlWUUijWOLoWyWVFLZW909J5\\ndGr8yW95Ft+TsWkgB9oMfv0f+m6+5st+/kwKqNyez1gmV63weL7Iy/kEthhk4WxOLRDdsVaoVmkF\\nNp/0u1aIXu767YSRS/CD3/kVwMV4+IF1t81/0ynip33kG3nw0gM+83N+LVZWwpIDQWOBErSiI+1S\\nYwYrzvSK2b8ntaT7xHnum4QXfTIyPNRCyp5k6nh9tOTh3FQdk87VZj/fpKzpiPTVAmwJtq4TU7Pg\\nduazbRa0umBFUq+bNbhZjxhdp5NRKKURuavPXKoSgZcizXfLO1ZzyWD0qml9KTrhtKoFo1SubHBb\\n1cP0PpTA4Y3YuFOKlKphV12FUoWZ9guQJ8o46HRCo/cdH9LI1lIxG/RN8P0MBahir5w4xkDZg1GI\\nHCQb7pVmlTJRqelyp5kZwU76ot7wJUaLBWtSe8wJKDUaUYBeJosiqEuS0QiCSH3GNYPIlZHOWmAf\\ngz4UcvrqfrTXMUgbM9Lm5ME+GqcsZG/UMJYJUdgzRVIfkli5D8oQjs1Qpv39xbh/bBwWBQjmvMlt\\n6nV9fhmvMfj7137Z/Efy6pwSNikDSoWyzL5zCOi+bcnmsyfd4FgLN1eVe0cJ8G83sU5Pu3O7BX2Y\\nbgyvCvELsV4zGltoQr77jHVOLfyyqxnhndKq5FnzxUbRETO9KBbbq24wdQ1lsQURl0pQ28JqOpql\\nGwwl7kqXJufUdVu5ul548rByzMb/8fd/lL/2bX+Lv/SNX8ev+vzPwzA+8ePezP/+9X+UVjVEG55s\\n2ybHT3d6OBHJ4Vg5HgyqUWwX6yKgZMP3IhZEzhTnlBPqoz/q47E0Xn64z3htw6Px5DOP8bf/0h9h\\nbZWXR0hWtWvjq02tqPDBeRfX1L2w74qfGX3MgMnA98K//5/+z9gHYpUMvvRPfA9f+hfeCyj/6q1v\\nfZrr64VnnrjPX/r6P0rNIaZvLVgzjotMIHWRsNo9yKq0B+tJ9KRHYfPklFXIzUy8D8be2bek96He\\nFUnmjoezd2MMGLsQ7iOlu+7TXDJyqjw2uM3kvKvKohQ6zkplqZV7y8LhkNy/qjx5NB5rSrC+d2is\\nraq9twT3jgs3S+VwAEwDMFJuxRbiS0cEOYLeg33saqGFy0hUpZleJ7i9tJU9nfPuPNiChz3omxCY\\nHRjzSL73DqFCxF0EjEhpXNV+MAYwcnDuzuhdml0Pbnvjti/c7sb57PToM6w16CEEwSkGPTaK1XmS\\nFNEw0iloHhKZinuPQs5/RinUQ0JpLFVD0uPVNHXM4qC2iT4A3Dtdsh3c4XZPepcp53ZzTqdXX8Ve\\nc9GFhZ7LpCMFpJE26DXBZRGM6RbxCRYuZRWIpWoRu1oqV8fGUlVaR4aA1zFtuX326KZW78N9Fc2Z\\nafOx1KhvLsY5JW3VWGpyOBjXRx2XdMMXGkP5S7VgVS2ZCNhGsvWBuyyi0cVRJYw0JwZsvWui7MYe\\nNpnFyBiRmnKTMMLYfNB7IYcxQj3aTMGUPeA8VGGNIeVI71oYQpBUHWFnFbBHYnGJUklWCutqPPV4\\n4T37W3j68cf4hI//mXzLX/wGPuKtb+IXfsbP5dd83n/EU/ehtANZDprYD+Mcg+6VvQ+2Pbk9F8ZJ\\nlVKk4VRKlVnk7miTxqEFh7LQWuPL//Jz3HvDz+Cll2+5f2hU3yk4f/fbvgYPp8blFKSKnLnh5ARG\\nmynxOSPJ2MkUBjIG9IDP+JxfzSf9oi/GgLrc8KVf+2PkzccytuTJj/g0Mo2XHzzg0Wnn/s09PuIt\\nT/O1X/G7KM041qbhYLWpxeXu+N9QDFRdxUX2EYLcR9B7cpsQ1qhNKSmtyC7rXokonFOvbx+d3ae2\\nlplGm1rsDdhxzgRjD3oM8ZxrsDRFER2amAxPHYI33Ks8fl25vl5YK1PlUjhew+FQWJcCK8SYkCD3\\nCfFJ6qLZSzsatKGcPyuUOsE4HjIQuE+zSkDvsqYPcQtKdvaQ1tW3YGxwCrU89l2DQVzZhVskoxT2\\nPbjdB+c9tHAP6eOdwh6m9kgMwgp7yI1GziBMk0StmGHW6CEOcYRA+8t0lWaKDNmkpdO8BSkTFirH\\nReCgUtRymeIP0tEzRJM23IPbU3Lak9uu1/ywD17ag1MEp9dcb17jGhFAEKVMkbSSC2IEp4SXezC6\\nJE5jTu89kr0KUcdiVC6Sn1lBqnWFx1RGDIUj9s7M7vq3d83ZJ5UJWS9KtGgVro9wveb0eAeVQlid\\n8SzGsjalBBPqq6Zu+G0E+wcswJ6ihJ3DOe/w4DzYNkmNzunc7oMwZTPlHBjsnvi4gEnm5pdTijMf\\nzDY3rXQxdmOy1qzY3PEbYxi7BW1Wo90uwnDZOkkdj54/fCI//xf8Ek6nwZe//e189uf+Zzz+hvt8\\nxNPOzf1Fw5FJUutW6eOMYfq9BTKrFpcul1KZGsalFpam4eGxLawtuFqNYzN+/1f9fT7lM/87fuhH\\nfpzz7SNub285Ho/TEw/uQ+S07rrXzGiLPoMwvZ5qibUDWYFymDKjzt4XftGv/d186df9GF/0v7yL\\nfQjb16PwG3//OxhROB5Wzrcv8/J+5v7NNX/tG7+KQ5FkzFIsiiTZzzBGw4c2vtpkGCqlUqoRNivc\\nBa5NbkXJIqvSgYdx2ncenJ3TbefheXB24zQ0CFyLIEa1gs24nL4lDye3wnNl86KQVw/WFrTqXDfn\\nuDaulkpbYF3UwnAumWTqNY/d6GfhI0upLIvUNrKnG21R02VpkiYyigA1UUhvpCsI9RRdLIWLLcRU\\nvW69MRLOIzilsW0QZ8PPklftURhmnF0BmtvtEBvbEqdpXnCXsReMKIwsU62xT7ylQPXdL4Npnb49\\n5v3hydblPN1chUylqCc89DyNXhhhdK+StYYzUAJLeqNkJYtxbIVmRstON0ljPRuPerDtyaMOt+fk\\n3CUHzP7qa9hrLro9Jem4hECeR8pFk8G+d3wE54Bzb2Q2UtFWHBJKbeCKu9i7QyusrdKmjs3S6Be7\\n3tRs/lto637QVbC7Stfm/zH0PvqlKseILER2SjWOR+P+2rm5qRyPjVa1SV0C+tKMsMoe6kONLjeU\\nWjILHWVD2RDvd+wFHylJ1uSRVhaKlRkAqJ/rVRzScziPxk7sg80HW8YES0uiuRRpjksxamks0Wkl\\naCjOuqIh1EqlZfJjDwr9iZ/H9/3Qu3nLR38Sxyc+irf9O5/Gu7//m7h3BddXVxxWDZiaCxbeFjgu\\n4k7UlcmaVV5cq4Wbw4F714X7V437a1P0S5lAoNJIa3z+b/jtfMIv+G38xEPndAs5dvbRhM20QmuV\\nUiprgaUq6+p6KZjtso3mQvpOuQCya4WYfb5Ibm/VnxSKtXDdoC6Vn/3ZX8aPP3vL4epa1XAr3H/8\\nwGrSK59e+BGevnaIM+pgiq1QQtVuCVirUmFL0cCqZiFKY0lXsnEGPpzboWFjz0EQjNg1pHYnTG6/\\ntennVlNA5Kii1A1T/9pHY7jhs3pudWEx9eb7cHIUTpuO4VaCVbmXeJ9gy2pThVJhniS8O2lDGWlU\\nWbyjUWrQ2kE/oKB05Uh8LEKXwpTjjJnM4Gx7cNoH+y069ncliXec4k53Z/TB+RSSm/osIKJz25Pb\\n3ujpirqKi4FDEP5zGKcunnOSbK42RZ/PxG7JNgo9VzyN8xBf+tSdPY1zvtLK2FFr7DzNSi0v0CEV\\nI2ayDZspJSc92ALONmYKipIbSxFeVJbxV+/qvrZkzOGQBUzVxZjQcotCZKHPifuyGP0ytSsaCSwo\\nxSBNImZcO/3ohWhCv9WA0mYFXMQm/bd53Q3WmFUjNqHS9gppPaFUo9VgLQv0wWbGVTuwp89Qvwln\\nr9KtXvCTiZJyc94gpRpLdiXXVj1IgYA8YYPqAui0UqaHPSY+TsoHG7Blyq1mwZ5QIwQByQCrgo0w\\nWA9qVhcfnJvwkwB2iW13tTAGjf25wh/6qj/H+17ceeYmKaVxuH4jz1z/KM+RWNOkvh0W7hU4rHBz\\nrNzcq6xNlcNo0PvCPmYVaCZOalGgaRmGHeaf3XWsPu/w+b/pvye/6Mt48PxzXN27UqVmhaZPhlOd\\nIJcCTpP9MwRlsjJ7rDUgNGyzA5Rd+vJap3LBgOxYaAH/gl//m3n62vnn3/u/cn19j9vziY966xv5\\nh3/vW/nkz/g8ft/v+a38s3/89/nln/cl/Fe/+XdqaIdwflx0qEVYwyyp72BAHzunUF83HDw1aN29\\n4zE391IZXVN0i4TVhDqMQWsLY3IG9h60FliETAOhzwRTWyxNKNLOwKJSalUyS5lkuxTr1/uMUoqg\\ntA3PwkD8a+sIhBPBKJWwGe3uISD7rATBuFrFc+40ynBIY+xDmMcq1c0pO1d9wQ6TuDY/E4uVEfqu\\ntj5dbgPSp1Y2C32/xNc7UdRP3V2KoxrCd55Na0ZmUs3ZYlW/HefKBpstItMBiavPH6bTaYKNaTpK\\npZQMD2oqlkunPrlLicqW8inIEafecKmOh8hBgVIjTtv2qmvM63CkJWecLQs+Zj8mio5mpgn/4aBS\\n8LgmbVWemKUE/llmcqoZZl2LNZo89nkzRepmgdfK0fzwXIFSay9MAJuVrybHaj3UIpnSasm6NG4O\\njXWtXC/G/avKU9eFJw6VQ2szvNKVxMtgLQutKkerteRwWLlZVlpVv7t5RwpdHf/D4TS462Odp5vo\\nUXduvZP06XOXY640DRJ86kjHGNMNBG473ZJDVo7NuDkYV8dCXWXZfvRo8NzDW55/+REPXjT+zx9f\\neTSuePHFF1gOK+f9ZS0uu7EuC8dSuLlpPHm/8cRN4/HrxtqM9RIcNm3hlZioy5iniEZpqnB8DPZM\\nth6KlDfYcuX+028Gu1E7x5K2QFRjLck6rdWE6wEqydVaOBwrzzxWePKq8vi9JvdeVHxKmC4uu1or\\n99fGvWPl5lBZ28oX/obfSb35GbzzXT/KEWWTfcNf/FOYDf7ud/x13vfsC3zdn/2fgEJbNNtQVQyt\\nBWuTa/FeKSyrYDNLWbGJ/zNLCk5dQnlsMRGHUaDstFZpa1BmVQeVcwwd9Q2uFkm8fEx4vhVgoRYl\\nVlwdG8tSqLPX6WNooRyV7ezsp+C0DaJMmzEF36WrzokbrbWRY0LTz0Huhm+Jj4vGQ73Nc9Y73oe7\\nNv0eceekFMIzGA7neQyPM+ynJLr+7MhQH9iD3cU2oUnHvPXkNJxTKrE4vHDakzrgtImdfHZVulFm\\naEBfJmUviHROvsjNSFAQqlEGDZtDQZ0QM5wxXEN9N84jiKEB3dZTGvmSUx443+tIajFiVMnUTH36\\nHhD11ZfV1yUZKzZX51WBebsnxcUZKEWA6KUVciLmSllhkoQycgrunVpX5Xplw4cTR7lGLqrJTO1Y\\nw14JavxwXokWXL90dpPJINCLaQ2uA8oR6jC2AmVo2KUAPKOuC9VM3vAiCVjfG0lhdKHfIpzjUvAK\\ny9ACSpWQ/XpJTlFELGPogUwYnjzMDgGLVS3GM7Uih3bugeLVb3dX4scsdp2gWJvRIgfq7mQJfJHa\\nkj0570qUPeXO6hVaofedhy+s/D2vfMwb3sztc+/hHE/RHr2TJ68/Go+maJolONbK9dI0iGzG7Ta5\\nDCqAwC6YQcPNsKGKa992HkbBvbONaRM1ow1nVFXEC3Cs2nTWqlZGFIVzaknKGREvmVkhOdTgFMmS\\nQcepFbrLuWez+rOWXC1QLGilMaj8nj/+V/ndv/EzectbD5we3fKjz76HYsFx0bCn5WB76YeoT38c\\n6YUtBD0qVqjNBVSvBfNCWwJKYFvh1huZZ+xQiE3YQqvzJiudNSYYBiObYrB6XlCCQY6FrmhO1gY+\\nF48yE2+L1XlqapxMMUb7pgBVt6GTDEKP7qdJBcsgl4bfDszg6qBWwFqMc19ZQlLHOu/jWnSMf7gn\\n2wRhVdNQuE1kZsx4Kw8R+UokMLBdTrJActLhGg7vXu64ICBlTRldU5UiAHyCJtqhBOtmDctgWRbO\\nY7CE7NWl6NTdTJXpnpKarVnmPTiRrpNhEh60EpznKbQMQYrSpIdvdKweOfW5YXqSQ5+dZUoeS4A1\\n6JVLzIWNnyJPt5h2zegJTVUq2aCOmT8UtFUVR2uNPiq2SgJSqFwvwWqFZWkqv5nZYlmYkDu5mqZr\\nB9d7uETyfDivi3QsZcQhTYtWq3MBdjQYbEm0JFbYR2FzADlvVjNKg4yqDL1hnBfj9uTUVZtMXCRe\\nYTriLIaNIGdk0DIF4p4FK4kbhCenUwqUXAaUQm26uTKmLCeT2yHU3j6S0XeGD9Z1wZpIVwxpeBsF\\nY1Wyakj4veTgnIXzMFrZ2ak8eiR96HuW5P6TP5s3Pq3q59lHyTHhSCEO0spG0SIYF5urjjR3AnzC\\ncAplSqL2rirGu3Fy6FnuoPK1CvB+SKV5NJR6kGnUNhs/fiCrXFvF5HiyOhi7sTcjdlXDS1kYfbBO\\nC2g2Zy0xU3WZetXKMQ2zA1/+1X+D3/clX8CL7/l/eOtb3sJz7/y/uLl3zbAHnM/J53zmp/Dt3/8A\\ns5URQz3ikixRWCrErpBH5r2eGMs68LJyPu0Mu5yiVPNrnqHFrdoQxyTUQsoCnq448awUCw3QFvEc\\nBPSujDLYztBK5aVtTIWK4buO1QdTu2sxx60h/9xOG5AlWAxuR3KzHDgV9aWzGaM3jjWhiMaXeXFG\\nSubYQ4PeQ1mUS2TMtkFyWKSkiRCCVAa4Ic1rhORaI6jlQGsGtmM77McFTppl9BKUqte+WtJTWYM2\\nHXKRyb5PdnEINh+jUSLE//bByIVBQcYkaYCtyMLdKzC0AEdRuk1rzFaGeB6GwkbDlKKTYUQ0fR/6\\n66SPGUqQqEz40NdrJ+SEVp7dVJnUeZPXWXHsQ9VtXQuHNI6HQY/K0gRfvrdo6r8uRb27nvgSpFXG\\nSFjhKAKh3vwMPwzLaa38cC+8F23etOZWHemXKsVFrVoYA9lfL+mytWg6r5ZhQpP7xptxNFjvFfaU\\nPA4L+ggc9RvdjWwyCowwwmVFlG1y9sK8ELGzdWkSatnouZLVWWvOPrDgJafd2Yfx4BQ0Co/OG4dj\\nYS1CTuZSGSM4sDHKDCi0Rh4bizv7EMD78XvJYzfw2I0I+WXhLub7yYPNvrQqfFwi9QGKP5rBkiOU\\nuqxFRFHyxYKRDqEK4tCUZKxAQL2eLQrHMqNlFjhao7ahPvZ0ES21sC5gLGxj43QedFdP9dwVvni5\\nyqoElBoxWx7O0ipr7RyWA4dmrK1iq9Piirf/mb/C13z12/mxf/w3+B2//b/h9nRmO8OxVI6HI2+6\\nWXj/S85Sgq7JJmME+1amLGne1BKasLl6rlZXjmMjj4afJ9TIO8tkSqRV1sr/x9u7B+u2ZmddvzHG\\n+875fWvts8/pPunuJJ2EdCCYtIJchNKKsYGgErEELNRCYwGiCHKREpHKBUhpxKIACwT+EaW0jEiV\\nqES8FGolECCkIpdwC0mFUNBJh3S6kz59zt57fd98L8M/nvfbuzt2n9OkE2bV6Tq7z95r7TW/Occ7\\nxjOeC0c691NqL+0Ei3BXJtNkaTjW+3H0pKcUaE/nZI5C5spUS5exkjubd44iDNRG4+KBD+Gveo7g\\noV8xK1RXDHrZg05yZnBtxuXo9D5pa3kFhZ7Gw2zK5ctkW/TEXOGFkqUHaStG6jY9oucEJh5Jv4YW\\nvZbc+WQG3G1BNaf64Ckb49Kf84hHV2tHimRn1vQuMcRsscL0M2NcSJRksG2CB8o0DpK8DtKN3jfc\\nDi3Mm5RxpQQzBiU3bgkbrEl9zqnDkE7mxjDBUTFheHvTGvPW8EJZhSK1zAEoVRiJRfDYjebOVuqK\\nDg9ONrhOAx+0LLJ9W53Pw4S7OTkOncocSTsZFZlVGJIblyLbxU+BSPxjft3YC+rCBa+0rgLL4vLO\\nmerwuUEQQrvSVnTMFO2n9GQWbaRLlz9CTsPWYimPwTXUBbQjlLJag9k7o69k2AnHMXi4mjbXYZQB\\nHk1BgTGllhvOs8uV11vnesCTodO94hzIhu/sxtEOtlo0iq3Ug4Okbs4jNiRhVy7c+QQ1lPSayzRk\\nAxoycQ5UfIeLazwsFYWzQiONB2YWDpQG0FJqrLGyqmqYPINHYWTjYSyP1TEpJ0lWtjDu6qTGJte3\\nCE4LmMotiS66ksQQokEJxmk8uyZebKXyisYVDicL7m1w3k882pztZNicxJKdHlb5lf/uV/GX//yX\\n8o+/9xW+4l/+UhW2Otnv73jPuyt/9q8+Y7qYETKbX1HkfXJxY4xDXiVzLvGNtvAeRp3J5pUx2nL9\\nYknRffktHDrBh4MdkCdh4BmSfw9h/jdGjLUFm5hy2PoBhNM6HOaUfnBx4zSdZknWZFw75+WS5kvd\\n5wbFtIDrV8mbHeNJdiwnx9R0MOfkWc+VWDW1JB8TcDUnZd46kBXRPpeXiL6HmRMzsSomTljojLKD\\nmIVyksIVnOmThnYD2ymIPsk2eXCpYZ8mRJfqTpTVoBant7Fkv0q/7mXS+6CUTdDeTAhlPJrBmFKU\\n5dSCu0+Da+WwQYavaWpjZmemILjegzIGkSnDHQ/yzVXAn4L3QtMPPsogDsP3gQ0jQsY37fbw55CR\\nL67B1YxCcI4JGUQENYzdRdWZKWx4w+gXOX4tIwQVsuB5+OSnGs/+Y30pwlkshiVTf37Jh5RFpGbx\\nZlkMBVFyqoFt4lnKMN2UVJpwSi0gZglOc9AyeLAuKs9F490szkyF9D1bpOvsxrhOWkx237AxeZop\\n/X+Xp/GTKzy5TnFLV3y0eYhOxcQ3p2bHyxmz1PeeV16JyulucrdVjV8WSs+dufLik5pKbfUBSaPN\\nEK1mQjVbKixnzIYTsNz6hw2MTZAUWqIIigmlExv4swrbwdEq+73oOVGdrSR3p8qjk69j2FjSKd33\\nmGwY8xRM5OFbA6Bi1nmaATPZ6/pMqnFe9MWXTjpg5H74PPaTwBhz8CXv+2eI8QOCh4CnV/i8Vx7z\\n4Q/+EJMHet8AsQFGX9Nf2oqyKrTRxfs0yenDWSC3ghz7DEBBqXjis9F7JcpO68sofErF2YWIgudz\\ncUv4ZLDc78Zg8851Kibr2sfaqBfFpU+XRDc7/ZpUDyadWu/Y42A/69kdvXH0Fx4h7rJ2TCRLbznx\\nrMLFJzALo8gQKrthRYXvNCe2F6pLzovBXYQkx0ysyG+iuzH7oJhYN+aJe0idaLJaHM3AjDtLjg2u\\ntuEPV7pVCX6WI5g5QOdgsNeN4ziwFFOqmpaGL97RQaYohMUmxwJAZwSMi7j205jWGSvyCTPaITpZ\\nDCNmp0esYp3Pob43uz4FeEEmL7FcnrLrJM2pLbmNXMC13HhgOdFb1cmVWhL5LVJmJKUleCUw5qKd\\nMLVciVAndW3KE2u2YsZXB/kP67p9K7MFNKzin3kLu5QXgyChG/VHWPTHQiKJMOEexgwdMnMk28L1\\n2oFevCMZmwIAt23SCM5p2KyMFCWJcXCkXrINafkvYzBSvqjPrsnrYzCnHgKsUHPSXQuOLTsZ8DYP\\namxkDo6r+J+7F7Y72Iuz1UkYvP/vfBef95P+ESnsuvxWGXDtnWdLeRVrKx8pEvtDAjlXxNFci9gV\\nwz4bMZOCjHYmUFLjfnH5Ndz3jRqTkrLOCxrVlTjivhPRdMBbkBhtdLptykybYiHMKYy1zeRuS7YO\\nWSUsqVGI6JzDOZ1UBKdP6MsRi3j9ZgAAIABJREFUy0WIj5ycawWD//Hrv55tX1Hiy83scz7/s/j2\\nv/Dn+Kk/+59jmuCfZjL337NztfLisJ2Tm7/vnC9c+AaTmV086aFS1Gfi3uktOFJ7kxqmFVq6ltpD\\nopCRgE+8m5KgfTJMScVMGapXU+EuEdToEgSkIAxf8VnMptDT66CGRAjtSC4mHrchz4PeOtcxIXcu\\nJgrcTCc8adeB4WQ5iOZUgl6Su5nIf6kqgZhcvHD9TDOMzYJ+O8BdqcbHFC7tJGMEYwXBOhAz2M0Y\\n5yBbY1sv6qU1tlrVtR9BDz1/FgWiYRlUFwQSA7oFaRNfuXrTCp7ClXspeE+iNGxugsxWmveMRplr\\nus2Ue5tXpge9ic3yZtdbFt0ok21M2lqIjPVCuQnodhN2Fik6UvTbQkNdooVA6ifHFSeYpnHrtOxl\\nTLnmKlCZ1LqUOLkc4n2FVoaoGJv/+LMaMrW8WoiRrEhWF+umZZGnCRsDNkSBW/qvj/taBrA28At/\\nIWNJfaeM1MdVi6DN4RRyZTo5HFvHG1id1AbVnSw3RskNADGepTxIn03F+9iE5ollcoRkmmG7fgYf\\nVC9Mm7jBqcDpDqpL1LGHOrD/+3//47z2g+/nC77wC8FW3NGcgjtSrIO28r18FwWrX4cwsFHlWtX7\\nc25lmlOr0h2u18aJYKQWLSWNWpx7JiWcoxnX+YDZxit3O+dTcC6OeeNk0CK4XjtzSX0tG8Urbl2m\\nQhaMYzL7QUQlTmJ6WJoOMAt8U4erkEVBQMWd4i4FUgFDXde/+m/9Gv7g7/sdvPSowpA04tFd5Y/8\\n4f+c3/uzv2x1x4Z3vRtHakVci+kINsnME5YIIGEr7CSWdS0UoY7AS3DMQc9BGyFzmlaI6mAda9rE\\nO8u3dTg11CmfqHQSCszpvG2XhFdUM6mzjqrUlGsbbJkcIVnryOTxSeZLbXQpRhenuo4qmmA2LJzr\\n6Dy9KBpJ4Z1j4bWJN4cqhzdbvGELW/leJlI+ghcKyXDRsyaJbZWwziwpBg1BSRXF4xiMGPTcsHKl\\nHabuNpNTDXoa79g2eYAAs8iXujdwb4LBMnnojd2LqKkpiLNFo1jleBgSI5VJNKj7Rs9GKbKSVDDs\\nIFCiR0Ppv6NvWhrnpG6F9P1N68tbFt3dd6iN40guUx9idKk/tqFC0rNSzIgUVlmLgO1qVxITRy+S\\nZyacxyPEg4vArwbTaDV1yvY1oqewOLE/DDoyqt6N048T3nAbLYfZc8+FFFf9uTuVr93kj1TO/YMs\\n/Ax17qdIDjP2bX33w9jo2B4Ub3grzGlcotMXVCAP4CSKwPxuQYzBNSfbVsjWObZgS9PSKI04Va45\\n8AhOtRBFS4YonVMtbJ7UGpyLsUUQdfIf/5av4DNffcSv+FX/DtTHohgZeJ/MC4IFRrBtyVaczZyL\\nC0NsU54SvcHFlKxhcxC7uio36MXJpsTkEo5tk8enjYcxeTiS67FJ0WdNHFIUn9KjirZj8kEuKZ5q\\nawM35xyDw5JjpMxqRicIMhtY5VwLd1uwla7CZWBFGV23yPLpKeWbpeJ5UpuFh4fG/XnjVDfeePIR\\n3vjQ93OqBZsaeT0Ku8m43HzQO1hJolSxVoYk3DlFecucnMO59Mm1B+MYkhAvyCFnMlPFSwsiPWWZ\\n4th6c+o2wZKTCbcuBpGVVhXTvuMUGxxdqinrEoTIuz85pTGLptE+nfq8eRAXWtKIRpPiieNqHGMy\\npmDFOQ5K2Zizi1q2FKndFO84LWA03IKjD8mMbTArWJ8MIIcsFmuBzIBDnOFChzDeuB5MCsX21dxt\\nVOv4bpRZ2YEREx9a3h5NXgutd9IH5MZMpSmbK5gzU4br043tKDzMSalFfhKIbjmHsvXacWAhH1+v\\npoQKDzgkCx4xOCFKJmVwmm9eVt+6010teg3htk0LUWoqJDCHUcKYITmgReJLVIolbRSCBja5jCQv\\n6ii6Gw9DChlsUtNlk+iukduNaOLM6nBMTn6TtKpo/Vh3vLevV9YvJouKhL4fSDr4yW+auHu1vvlt\\nnatDvXGAI4y9qlhteyEm7LGz7+DPGtcOhw8ui6qTvCD52zg4ZqyXYzI9OJkkygMtdsZw7gIqxu0M\\nNiYRO1YbXjdO4ZyqFphvPP0Ip3Nl3wvf+Cf/K/6FX/YfrkgXFrQkPPalu8LdnXO+c1rX8u6Nh6Bd\\nGr07T5swMlJQlAJjJYmtGFlMCQIG91nxGJwymbXgORT4CNS0ZTEoMn2EwXKwi9CiqdZKkjJZaY7N\\nQx16bNRibHuhmFMiqQw8Cn3cUn87UcSKqGaUKJjBXpLpQbE7QLTG7Xzm4eGBJ08bf/8H/jYv32uP\\nIal8cL1MeiZtLQBPJ6f4WkK7Y1kl9e3Jw3CePT1INF6XGYw+CZMXBnaTIqxYLJdjFlGJORlFmOsW\\nGyVW+vEx6dmpqdTp8MkpCu6ddpVMuUSneLDtsoasvmM+2AyiBJnBVlDszUhiSnDREedefbvYEVF5\\nbn6Dy1Q8TV4bXhpPe+dkgSLPA8uLpLNN8vU2xdMP5zl1zqstH2GnLQn8SJRhF0BfJqyLgnbg9OH0\\nPvS8dy3PmiXRKxlT2+BcwammnUvx5RxmsFWWH/NYalDRz3ympNbpEnKgqTBS4aU+jOpqEEvAVkKW\\nlm9yvTWmm4OZksJJGSJS9ymcOQZHNW22hzGsL79XcVaLFcKl477x8mp1DoxtdmIUnrlxSvl51iOY\\nZXJynVSsDtdW90s1omvJVKrifpRN8OMDONy6V0NLvTCI27bsR1zf/C3fys/6Gf+o/kx99KZfd6Ry\\npeZU7M4tuqV6YtWxFRVi2TEqmz1QqrFvg9FCMuPs9Cmq1UMf4jm7zIZmThmlTMMZlJJstZKzkT24\\nWMc2ZxsGzTkX4VDmCd5548kz7Gg8PHnK7/m6r+V9P+/LOb/zvfh0IoL7O7ib2vjfDIDaIaen0yV4\\nlonnwbbFC4HEYnfgTiKOaU1jN4cqgwh5AZtSNkxb7YKxVWMMeQ9jEoS4I7/ZgBzOLIP+IIrVcbWl\\nbJzUcO53HShzGWGn6Z7fZMNhNyAJ9hIqzNVFLZtNkut1HQ8PfPTJG7z9lZf5wPd/mLc/7uTc5HzV\\nktfNYHOOFAsh3JXTVnx5HRjtmDJX6SoA263ZYJIl8IfGkfq7BoMokKU8d5fzAXUvvK1MTlslmPQs\\njDmYJ2PLIAi8JHULrBsvbYVyJxVVG/pcrmNgPTkyWfIeHVTu2DawqxE1YAgCqF7oNjiG0jpqQplB\\nFjVgfRS2MoEuxtIo1KJCP/C13JT3Q075riAGreS+pkl5tqnA1lR00F6DjeDaEqxTw7gwmV3PeF/U\\nwzHGLSMeKw0/jNgGOQqBU70zvJJjYCufkEwZ/2+OWVeMenOsKm04mZQsjBREVkCLxCYhRFYoXtk3\\nqUL2Yssw+JNfb110PfGpvK6BtouT5EidbmeD62iEiU9Hut4yKsPaWoZojI4pk4piSe8y85BLVsco\\nwksfku5KoygYxQUDbaFTJ8eK/3Y4Yili1gPKj0P3i74yYeJ+109QcP/q3/sgX/7z38d/+Yd+P1/+\\n5V/G/plf+Em/1kx1THOKVnaMG1FelKFckF8PaBfnenSuM5b81bmWla9hQalJjGQPICetdcowrptz\\nmIqXnBomx3HlfLexO2xb5bQb9xVOZ8drUr0v/mvwt/7md/CsL9pWDX7Bl30Jf+k7f4Bud9yZPv8c\\n8lvYiu5PL8iKskAtzqlubEWF7TjkfDYMIIk5aDV5hNKXy24UklKd4zjYMwgva9NsUAbSg/jK9lpb\\n55Vq0ptMstt0+mVwzEEYbHXjXJxalMd1C7mcU34F1CEbxnD2MPbq3O3OaRPPXFh2pdTgX/rFv5T/\\n9U/8cZ48DF591x0f+sjruMO7P+P+xUOS8A3/x7fyhf/Yz1zslMFAlp/uGv9H71wOJWrUadgmNkbE\\nVLd9TR4OoxaTMCaNnkUx53XyaN94fBfstbJHknSeNGf3oOYUJOZJ5JqG0rFT53za2Kt4zYlzbY3L\\nKDx5OuCYXI5OEuy1EAXBDlEk5a1O64U2O/s1ufqtVAqb3fwmhmh4BjV2Ntd0YgTmxjkS0KTG4tm6\\nBZZQSnme9pwrQsgsnkfXwxSv+uxk7rTeKV2HcKFznZqYj2E8ezCwvmhbyTw2GSvlYEZ5HqIbOelt\\nQmxKVp7Cd3uDsk9mH3jsz9/H4cmOIFbH8KqkiwRqGZQaEppM8O3N68lbFt22SO+WS/kyBm7JNJ2W\\ncOPUah/Z1u/1PEQmm3LhITvTgotPysWJIk6hxWQfxuGQ13Xij2VeYdDC10gsCaMUNGuLuZRjbZXa\\nssQJ9uNUfD+ZGc/7/sn38eqrd3z1V/9W9vE1/NJ/+7d8wt8npbjggdFFatczJsxukFzHZDS4Nnjy\\nMHnt2eDJRS76w1PKJ7bn5GxxUhWnfTEjq2MN7iraemdyqoWzwxbJfqrc7cm5BOc749FWuKtO2eXJ\\nGkVY2rkYx6GbfLfDL/jSn8I3ftvfpgYqIIjFoWBZ8YblCZy0NM4uc6MD4+5882CVQAYD87qKpviV\\nJYQy3t1tirieSWMuf1awHXbgWm8G2GIEzJz4aWLLZrHuG3Y0zOC0hzx7t8DQQWcu/9W74mQU7SIi\\n8OzU6tRinKoEQFtd0M8++WN/7H/g5Ze+gczB3/me9wM3iOcFkfB7X1MX2lrSjiQjluZf7lPHED+9\\nz8mRLk/lCXsaPYcghAzuT4Z75WiT8AoJbQxKBPd3lbc/Cu420b+yB+djcIwkEftCiV6S1/bZ2WPn\\nvhoeg7oF3idWgj2Ss8si8ehl3TPn7OBeuc5BG5OjTUYrfORi7CfnbTHx3sBD0SqZUJwxOhYw7ErE\\nxnmTgGUsPJU0JZhMY4TBUIgqCKYcKZxbxpI35oQtS0qw1AQ0Mc4xZUBjTvHJuCbpRi2dPlWbLJNH\\nZz1ftVZmXsmxMYvG1pFKyO5d+LWXoGfDmun5oi/J8MHJnN7V+MxsMALzSd02+Sn3oBWnjMn148il\\nn6COvFWhudF+5pS2OSiiwXjiywR/do27RyZnC459Uqevm6cutJhsHxPnGALuYxbKhMMmp5lcDJxJ\\nv2o4rBFsVVE2ZuLuPsvkfhXp2iDLC3ihaZnLFj8+EmJDNGLhQvr6k+SND34Xb/+sV7g8u/CVX/21\\nn7ToKiFiKdWWpeUYSvu9TiUPZCbXHhzXwXUK1qmLON5XOGi3g2MZjcyrnJMuiL7jBlSxEh6VE7UO\\nefyGc78Vtg3OZ2fftTirAbHD6WTcuwrqe9/7k3loyUuPgvP5zNteecQPv/YRePgQ5aV3Usot5lx3\\nZYyP51Sfwml3xtkcJxgzJeo4khmdI+U0NTAlYMxBRHA2B1eiiKcxZyxLv845pOiKVAJrH8L9Tb0U\\nw8TnPXkyTlq2nouxnau6rnDmUOjjbVjZXPl3xSYZlcok3Phbf+Nb+CW/8H28OLo/8Uv0IkLe+PCT\\nCSNVOMKwLeGYSoddpP1pCOMdSVykGrwOuK5odizYK9QsYlBUQUyZYOzUYrx03rg7K59vdOPh2iTB\\nnq4kXFu+uKYC33bRqyIUkVXCyZj4mDw05+zJ/b4OEE+2cAk0QsBd7/D6JXlog8cJd9UZWXnUN/px\\ncI3kGcvKtZY1talz3cLZtgAL5nAsOn50wivPZiMW53qMQaNx9pMUjCXIcfOLSOHuDMyNhuoBhlgP\\ny4NEVORY/hwOVfCgF8etU9IZo5KbYcv284SRYTzExIaBOWcvPI1J+MYcDfPE2DAbEnykPGZqNXkR\\nh1FrocagDKfFYLy5ydhbF12bCjjMSGzEUo+sRIJZ2VzpBT1F9TqYbN3kneso/RbEYuip9E46tWzi\\nki685+EWHYEtcv2gIa/MPpJzleXb2YtO+CkvUZ8rZdTyuTnGj4V0eAEWH/NrxbDnGtt8yC6vm3Gu\\nFdsqJ3tEknzkg+/n5Xd9nv78x7yYJMxhCifM5Us85FmsyBuTiU3TqNTbIH1JqDNpfYVUZhBMrtm5\\nro3veU6iajmwWeFUjfstudsrsSE2w2acd3j7o427DYpc8AgzTiXZqmEBP/E9n0UuLDV7o0bh8f09\\nf/S/+yP8mt/0lYrg8TV2LZikDyVllGqc7zWeVowDmdx7g8MnNiveIRnYSEYd6s5CfM7b/cVgzk5B\\nuLebTNH3lGHOxRdMgNIahBhLQnzenDsr1LNoeKVqx5BUMqfiStb2poJOi9mYBLHBL/mFP+djnoI3\\nvxzje3/gI/IMMaMUiTXokgzry2uqKel4vhBjlKOw9ascwWrRQYL8lAdGVHh5P1N3QQ2Wzl4hXBar\\njcFdMe5TZgF9SjUow+XBdnaKb5RItiqIw5EXwjEm+7YsSC1xpjDLZQMZXpEQoBOR5NNOvKTxu8/O\\neThtd8hQqMFwGIPr0ekJW6mUCPaa0MBCUT8zgpENaxMPjehejN1PzMWOYk662YJmbAk6iubEOcEG\\nl4StTlor1CJ4oM1B2esq2Mqii7XcGwyyorisg2UwBc27YodmMpbZfPVCZmOuRIo5BlYHZQhuKVaJ\\nmJSiZWtMQ15mg60bHm9ef94a0w29VDGDu9rlCuTC76wORhqlVEIREFiRysWGMTIkVUyw6JQRPPgF\\nHxvZFecyNlOHMI0u4h1tOm4NOxKvyTG01T2ba6McS3qakgxXXz6pS1b66Vy5uthbrVyKa0aKF/jQ\\nphzVpgrP937oCdfZubx+4e7RTpvwK3/ZL+KP/z9/hYViESiQb84Vp7Ow2yPRUuyaeBbaMTl6l1y2\\nq7PrvdO705sizyPhaI2MmwpM3UDG5DwL+9l4aUvuT5VSHTdny4GZNumv3AWv3MuSM2JhUiZc2EOu\\nY1qoJM+eHbzjHXfYhMu18ef+wrfxm37ziy6/8WI5xUwR1lPmIKxAwJjy0ai7sdtGzkkZUC7AdDJC\\nC5QpLBKcfJ6nZaINMiD1UDs3nmeSs67PC0CYNDZgFnLr+KzYtrbjdovOLlCcnFIZMuX34FEJH1g6\\nb3v1nXzkhz74I54M57d81dfyu3/nb9drEfDoXPmMd7ydz/3sV/nh1zvTZExEV/FLkrJMdbaiLlP8\\nbKVpb+eFm6R2HYbTmtzdeibbVjifjD0KGQkzqZZEOGHgRSffXsQXylyjfPgqUmAmKmEBHkYS3ekG\\ndQYju/yAu0x/KBIgVX8xJz6roUVsKbRelzJtl+kMybMGrXWul4OHFuQQfbCc9H7YCPBDkemuZR+j\\nsG8yzMFZjmfydcm0Rc9s1E38swnkovmOTCngvGHdmX5go3BZ+5GTC6+XKY/8iy1z8XRXGFj15x7S\\nB6GE5NJhilcULjiszkmPorTvHmArAcTGahYXrcxMh/mU3W35dK0d337aJIgw42EUnMBs0Ka2xy1N\\n5iwmHmFLjSXFZF+3O6JxZBEofRRanVzaZC+Vy6VT3CBF0J7CIBgzpBYakx4TOFHb5DgmT0P4rojZ\\nYEXvmkQHqXEubzSvT/1KkiMXGJ5qGMZannU1VezFRCULY3T4xj/1LdxtCr2zY7Dtzl//ng9Adnrq\\n9vZUceq57Oxm0gYwjMtS/B3HZAzjenXJEcegm6/OQm71OSbNwTeJK06bzGzaijPZ4sqWhUjRs3ZP\\ntrMR06leuD/DozsosWLNXQYdXhWnJEpX8vjlR5DwcEzeePJAa4OHhwv/8//yJ/hrf+2v8C1//lv5\\no1//3/MH/uDv5yd80c9kdGjdeNqg964srWXleH0YSKZexKzowusiiqwNe2fgYIr1mXPSRtAJTm6k\\nDzavygVbFDvp/dcInBNQLIIXo8bGqU7qgj9sOFbFU60hCahjCh11F+VpChsOD2xM/sJf/G6+6D2P\\nAdj3R/y9D35EfNyE3/Of/Q4ykxLGo5ce0drBZ77jJT7yoQ/w8jvfDaBkiwptpIySZpfP6lyJDH1y\\nvitE5vPDt5hUfzUmuRd1m3W5/GWX5BRxS8WKkBlQAWpds6Sr4yxhK88tKRaKgl+Mj25aWobrxXFn\\niZCUn3cLYZ0m2fqjcK4V7g/nWU/IDRG7jOydVz04mvHsSeVpn/SXJLCYGMfyqrVpMI1oA0POYR3x\\nPrcyYW6UFTnUhqbB6FWsnsHCpuVPMtN4WFDDSKPEiTY7m831wicRk9kFa2QfWIqF0ad2AeHLLYzG\\nniHT9amGIVhBnUukNHuTZmCZ8ximxOQMPAfXLHJEnFIEbsOw/dPEdO+L0xcpv1yTY+uy/kP2htYg\\nZoInVQJvFZKEk+n0jghsufiDImaOOXl6bWy5ElZJuut0OVaqQkuowyjTaeXK5VogZDxzmKz0pHZR\\n0RiDZW4igycVzE9WYNfwqAaCNI3ZbiqSgByi1sZoD7QCC6Pd/rDDO97zHu7OlVff+XZef/11Hj16\\nmYeHZ/yx//YP8Yv/jd+ornkq+601uAx4eEguU9lwCPqjH4OnR9LG4NpEjXp4aLSWHANwvXS4qTiU\\nxnUpmQapLTU7p925vyvcnZxtl9fAVjYebclp15KoLlzLpviKYVpA3h5qMtlPr3C9vMYPv/YAHxO1\\n99N+2s98/u8/75/9F/l///K3c//4XaKGmbiVmZPug+uTi27UcOKuYEUH8TaUOJumBQwrSvvaVZRs\\nHXB4V6S2SQE4SJqp2DCSq9taIHWq7dyVpBY9C1HU2YQVSdBdycebOyWTFkkM4apmeml6ajkX+5kf\\nfF2bczMlBdfFmX33Z38u3/eB93M9ktc+/FE+9z3v5tnTC1/wBZ/Ha0+GTNjXi3sKsRRyBMZc4auD\\nKPK0uOHiJ6DhzJqESfCSLo/ebRW4qGJTlDCKQufEh52LWrd+Xd3wWPx39LOdUg1JncbY1UxE3tIk\\n9PVviktY4rH5Ir58Xykgj8uiciYKIDgVpT5IhMZ5Oq3t9HT6dfK0T47ZmW1yTB1q126a3rKxeQGv\\neB1sszA8OefkAYMOvQ3ZlE7VH1bemxuUnux7kHNqWGgnQAZDMNmr6IfpseAKtMSzxH3D/Qpjw2qn\\n9qB5J6+SUZPGaHNNTXCKslwvjEKnUBTOe4FauxhCiaTXJh+QT6vols1W9AcM65QrWA4oiQ9p5plq\\nqVs2LI3dE6VLBJmDGkaJwUjhd5uZOqtd8ECbgyxFI6Ml5oU5D+Z0pgctJtaMawxqL8IOiz2XGQ6M\\nHuvFmYrg9q5uZJikuzICW0uU9YBdFx55+//UQb0oqNNuOVW3u6F/kW+CXMa++Cf/BD74Qw+c7p4y\\n0vE2uL/f+dW/9j/gF/+bv4HRoE2jD3h6TS4NyVyv2kj35b6WXVr6y5E8uTT6kTw7OteWa/sqjvP2\\nnP/g2ng3tLB08Za3Wnh8LmxF/MZTSXaf3N3pQMnV2cAyp1+MD24KnBQH8/t+8O/zzlfunlN4Pv5y\\n/vSf/4t80Xt/On2MlQg8n5sV6bORXWXrAmjcEk9fseuSP9+WKONIxlyZzA6+D+pUMQ43ejfF7oxk\\nD3UdcjpLKgpKLLWzRaUUxLG1BlSm696X0JJyZtI34zSMYTKenmvvsJkcw7Zwlp84JZbk1oFMvvO7\\nv5OX7u8pAU/b5O++//v4rHe9nRJJb0/x7V6S2X7DvDUZzRQGmBky8EeH+AinDvkgBInVxMbATVh+\\nKbk+J38OfWG2Phctv8oa6WztNkRz0ufovkbi1NK3gqS5id6N9dzLU0JFOArYyMX1Bi8SMkxDy/Oh\\noj9nCkrCSb8tv43sAzZ45DBa4fWhbvEBPSsMw6WzVg7ZgEsMShqXrNDbi6bI5CHMkNtY4FQUEzXQ\\nJHRPxXEuy6z8YezPGUzFklGdLRvMSqRsL+cw1G87ncSacNqYk6MqT8+7U+pKohiaxkXt7czUJKc0\\n4r4YV8GphmTXb3K9+X9FH5T4tBP31Rl5WcKHIl/dSCbXheEUFK9tlOXSn2NQKJyQsiXS2LaNGnC/\\nByUKpU/KFGjd28G8JVb0Qf0YQYIv6limqCzP+lxLPRXVVV0ZrJhxgysaRRrKNbpOeKYfafE2bwsc\\n/bMVFYbNPnmnbKsrHlf5Czy88YzZ5O1f65nzucLRuHZRr16/JG88DC7PJs8uk2vrXEfSmvwMuiti\\np1iRG1Kd1GLcnYNqk70UKkEpgYXikrLDLEEx51wG9yd421l47V2FR9VEATopOn5z4a447JbUPRWA\\n6Mav+7W/mne9svMZLzlvvw/e9fKdXKR+BC/ZzPiOv/ldvPen/HSOljy5Gm9chpyXxm396MxpRN2I\\nEuwnERebNZLJGJ3eZA4zEXZ5tyeP7uDRKUVpOxn7Lm9UdxmFK5k2mEOHTHHjLpxzKdyFq4XwXO5v\\nG6xnt8ZSMElXwjanUounNoEVYZqlJvsmjwgFfwqqSnvhNFfrma/5bV9LH4vNcgXrk5MZv/Prvk45\\naGMyFz5pJkZILYpoclTs2nJ3s6XqCp+rsMJeK7UUqfBCXPUaKmi1JNXlmHbLFkTngQpVmkzOjfWu\\nQkFxP7uZmAwsAymWkx6s/L0X74CHiu++aXEXZpzW9/H1e2YmoynLz132rJjyzMbUe3cgp7PDtCtI\\nm6Jsof3F9dp4+nDQHybXpysrz5I+ljfLSJyCheTmNfS8ZspsieGMbPKuKFUCH+vqUk00um0mnhtu\\n8iPGYIRjFmoCbCyf8Mmwmw0oIhCkYwFbTCIkI/bi4pHPqsWlV3kzn426r9y6T6fojmlcU2qPwNnK\\n5OV7uK/GZso/c3c2q6p3XDnG5KG1lR4w6WPQMukmKtd+DvYt2SLYN20AywbDCiMK7UByyuvkEpNn\\nI0XTAjmdzUZfWGCEIqOLC6cDne5eoRYt8TbTSe3D6F3LLOat6Eq+t6+HedO7KX+Ft7o5wEd/6MMA\\nPLTOtu9sJyWyDoxr6/zwk+QHP9J47aODN551PnrttMvgoSetC+OVOk0v3XQB/MW2FRnibKfCVjte\\nJm00Lsfkeu2MJteyR3vyzkc7n/W2nccvB2+/dx7dO3f74H6D/SSeaHe4yMVE2gBfBcbh6/+bP0zv\\nLxLqZmp6eUGLgpcebUR2N3FCAAAgAElEQVQ4f+Yb/08yc8VVj+cvq/sNk4XWBkdL0gttOEfP1dEm\\ncxR5kk7tCsKHOMIhzwEnmdb0wN/UYEsEY0VyYDPRw6Ik+8moLt6pVE0JdMEC4ZQ9OO+Bh2NF01U3\\n8c+ryWP3tBlbdepJIom9ipZFphgUsJYs8DVf89t0QFanpfF3P/Aa9483/sB/8XufUwJLGpTElqkO\\nOaUYQxTHfcoC8TZFySBHOWdl8YN1yOhQlg4kl+GQdgQFQWKwDJducMiWRFFxLPCm9MnnBcBefIZm\\n+v7aAUq0ESWZoWJsZpQpoycvPOcrJ0aaGDa9NS3YetLmpI6hWKq+ItL7OvhWsMHTo0mll5NrExFQ\\nzYgj+oMpBr04UYLBlAkOrKXhheTQOxMVX3UvzekoCqkyRSu2gfltkSofiY6SV7YiEUR1o5RJrUlB\\nJ5D7IGJyHJ1JgxgrJUfT/H3A7nNBO5/8emvKmLGcFEQriaxkJPumB2E2Y7jR2hU357Cgt0mG8BYP\\nYNnhnUrh7i44VWerwbZwsolUb2mBdRWEnp0xjHJxzneFlpO9O3MlCc8E88HuVTlXoXC624hU5vIu\\nNY1Wbio6MRWXAxImFLfny5UfzfWzftbnAaxQRXhyacx25cmTK2989DWetsrDNWkNDmyN21Jo9d6Z\\npVNj1zg7ktnWkuBItq3Se6d6BTqzwQFKXBXcxLnAqy+fePvjwit3wbbByQ1ssNeCV9gNjpFcpuGz\\nsG86kPbKMvKQdeeYL4ru6XTi2//Gd/NFP+lzAOO0w8uPT7zysvPv/cbfyFf8ql9DO4JeirpARE7n\\nSFofYgrMCb1CiIExB1KZkdQSIsbnLfqlIf2W4lAkotBhPw3MpWB0btp2LT5yBLZwfnHJRcIPd05V\\nXr2bh7LZAMbkYk7OIdPugL0m502ddZhi3fXsr9GcG/NP05PfDoA1NeSENz56IcxX0Vpd4xBlkmyY\\nV3KoE1Sck4vG5/o7byHFj2v/Q7ahCHuzF31TyvXgxgzJTMZQgdxWpxpVTUQ8N6558+bh1nnfyuYL\\nfE1f313KP1+4L6tLz4UHewB93Ysw5MU6V6RNMvsg2+RKMLpSH5gvyHhpK5NsVKZ1HtqkRKH1C+Aa\\n311JIbk+iDkNzwPKEmgVh7GReeClUPvB1XRMtuza1UQw13PhKVe2kWOlXxgRsiNoaC/Uuxa7LFhn\\njmREYNPY7wfjqinCMigFTkUe4pisMN/semsT85zEbWs8k8yD0QqRHY9Qt2twmcLBTiHvAA+NJZaF\\nuk32GLx0Fzx+KbiPwDZhS21CIBI9fXKZ4MOpdZff7uxYl6b6YoO9GWMzym48qht1V0X1ZU58oz21\\nVMcqbMcWZqf/ebEH+5iX50d51dQDeT0mH/nI6zxcGhGFMZIv+PzP4Tu+5wc4Rud3/6e/g5/zJf8E\\nP/FLfjm9rYUKS2uenWzOmJ2ccKWosKQwSjMlrwrDDpo1rgY11V2/+jj4vLcF5bzGzYU92VjdiCXn\\nKq6zYuG1HNqqPX8APvrs4NEpgORvfsd38d4v/sl66cqZ2R/INB7dv8Sjl+75nHd/Lj/9p34x3/St\\n38nmhSO7RBB9iBxP1+juxmyDgV7cisIbdy/L+8Bw60wqUQo0/fm5eNiWRilFhS6TUupipARjyJrS\\nikqSB2JkzIFvzr5tEkfUF9CRPPKTsni6hrwutppsu7GF8rG0VBKsYOv5GItDm7k28w/w7nd/Pt//\\ngb+rUMvZGUtANMaSKOPLnS2YNuRTkKGlaiSWA0+5rCUHTqHaQuzLbWl0oy+qOEgNaM8hsVitsgdr\\n9OZTKLUfz0Ovy/Rl8PFmSrdFG+udluHNWuD5DcoQRHccEy8FL5O6lKtbJiMSWlB70nNjeBOtDXH+\\n0w1vSV9R745x7Tp8+9D337aCZWMQVJfgYnKHzcGYYswMk01mH1JphiXTOifOa6Jyjt5wkmMJvjor\\npDLX51rFd78iX2mYjNFkAp/zeSpHyQ12mbqfArbdZC2aEDl4+HS9F2aXGmQkMIyUvQZpizuZk94L\\nxiSKus3iyoE/VeUulVPhznZefhScz64OdG143YzuUumw23q2Al/x0aXqBPXbyFNTC5MKtcoaL24u\\nZOWFd8Hui3P7CR4+48XI9ekUXBA16lf8pt/DH/l9v5nXXr/dbZ10CXzxT/zM59/0G/6n/5pf9qu+\\nj3/t134VNTU2z7nLojE7eJBMTtmYZTmE4Rztqk54GlsxegSPmJy3M5/9auWzXy288kgwQW+LF20Q\\nJ2GYURYeVnJ1RP//n/l+X1zDj71PZnzP934/7/mst+EYr73xlNNJKrfXPvqDbDZ4oGjDnnON1onP\\nwXCnX51SBENldcY0SooeZrHkqqm4mERikbm2zfr8BsfwlQtmtDHYS5HUu2hkdPf1aQ5q2dn3yWkt\\nxGrRfahlmVmb0YeWkscxqJtz3oPTJhtHM3W65h9zh0wFzl344pxOmxqJ/9Jf/9v8ol/wc/m2b/uz\\n3G8wjsTmleJ34E5bgokcKy04tLAKn5ymy/CmKPHBqy+OuWxF22pcBoJMSvUX3HEJo55/jrHilT6R\\nL8gnu26/M1dhX/YtMHke8pnwfMloLrFLX9FDuZaFNcUAmT0locWxEDbeZ6dEUE4qatEa9ZACM5c0\\n+EYxjJxYOfGEK9vcmCn8dwtN2IQKrvNCYEI4jMI1jH50rseamoZTrHPMjTb1TvocEAetO5kFptzt\\nMk0hlsXZc9AjKan049kMolAsVyPgckuzyqkGJY0oTiHY7JDd4xzPudmf7HpLTPfaOpejYUNkZk+9\\nuJmS6o0x6eXKCOO0LPuidO528UhfvQ8+83Hhne8IXnrJeXxy7ja4P1fZCbrxyPVAxjJxeakG26ny\\n8tmIWvAs7Fvwynnj0Tk47SxP1OXhUGQYbbAwwtv78ukV1E/1+tqv+uVv+t/NjH/9K341f/qvvsGv\\n+PW/nXsrSkoohnknigxDokC3jcssXB6SNhvHNWHKLDmLJKNmxnkLPuNlQQqnE0SFczVOd7DtSSnO\\nZkpkPe+657cR9B/k+vx3vQIWtJHs25ln18bl2nn747fx9MkPP18AufsyLnFmFpiF80lijXoulE3G\\nM0QuxoOEBJnC/I6p+JZSFa2dPqAo5qlEoVZfMJK6yW0p6Go42zZ4dFd5fDd5vIsj65Efsxz153jn\\nthZDdf1ZlkXhzXRojBeWm7druTJSXJOBTcFl7s6f+sZv5pu+6VvIslNOhW/+pj9DWd6gIudPMnzB\\nLS9gCo+k7kXLynDKehVHwnUsx6wUTfDWVLiv7xsvFl2nE5yLMMgfDUJ2gyAcMYGqi21h3H7G1V2v\\nil+qs5XbxCTZvTvaPqdqhK3l9AwZ9WwEscPd7tjm7CV078fEc0rhas7D9co2gihT6SGuSUeUOKfi\\nlFrY9mWXWQpWmpzotsK+i+HjIQ8XKy9azqN3+tVluj8nM/oSOE2yKNfteQTSkLG9uaCMMbRc69aI\\nUqiL0zhiiP4RDbNYk3nin25cz8nloVs2YFbG6Ktr6BBVS4+rU/fJpR2KFbedSw5ONajVuT87j2rB\\nS3KqcudPM3IvWib1zmgq4obR5mCz5GE60R64Oxfu6sZWglphO4vKE0XdLWZvfXp8mldm8nBM7k8F\\nnpvRfWrXyy+/yr//Nb+fa3fOZjzLuUZXda6X1girHJfLit/uULTEzOj41CKsrA+17MlLW/DS2Xnl\\nPrgzlKjhghP2k3O/5JUlPhXZ4ZtcBmNIwPLDH/owb3/1FYxg3yt/7/1/hy/8onetLKnkMkULjKKF\\nArl60CF8cqLOQlguosutb7MtLDQi6L1RIzgmuA/MJp6OWWG6EZnEoqURkxKVs0NZtowshktfFLYx\\npiaEmcvHN1chXzxa5lJBAm63IfvjboOgjMVuMXV9tnwifvY//U/xDX/y/+Lnf9n7+Mqv/k/4tn/+\\ny1ex1/JHFCuHGz1xfe2c4qW5oiBeQBodCHn0VvM1wrN+Zt2xCH3J+jFf71O5Op/YCtVvkNz6+Tqi\\nW6UL870dRII0kEIsknMGp7N4s70pkqvPoUOqF46QKvJRrzy5Xik2+ajBvIiOOqfwUzdn3+R5HA7Z\\nutKPS9HBkPJkjpB8OGoybtHr5uTyWVZO3BQzJMXcyGl0gpZSDRYTDRYKOTtpsqElD3CJWTBnmBM5\\n8OJcGuy2ce0H0507DO+uYACWcMMmg41x405+kust38d6To43DloTVaynRh4fIdMaC/aimBRGoa+/\\n6N02OW8751PhzkWLOdVg322dBMLGaoXL06AXRbfcZKRHN6odlH1n35NHd8m5dk7njbuAfYdS/sFV\\nZz/ay8wkrwQ+1YJ7W3Z801/6bh4uSkWeKGusL1/gXEKaFgr/iDR2qzSHdh1UQorAkEm2uXG3Ba/c\\nB2977Lx8gvO+Io7sBeG9Vn7MAj3d4Ot+1x/ka7/6N3C5XDAvdJ88ee2jhBnHGLSFaYSpMxJ0BH0M\\nwvXShDt9+looLcZGkZBBGJ/J31YIAzWgeTyn4JjJ73aLhptRY+nxHZHhF07rptTk53dgbdhr6O8l\\nbin0LnjC8EWBkiDnk/kzGzrsiaVY5LaBSn7ez/1SXvvoU+4fn+U34kZJdfPuRr9VtPW1x5BYo9Qb\\nY0Dc23RbdERtHaYma8Ce0xen65D60Tz7b+Y9fYufgpVozaJtgmTIKfbPnLfu3ziZXOXuzBg2uEyj\\njMLISZ/G1p3jOhnbpJaNN2pjxqS68XCs4miD+9PG/e6UrbIzSa+Yd3wWhiB4xhxrzyfBRDXwlPIN\\nZLyl++PMNig4F4zmSWSy4TRr+ChiQFgn0jhwsCuxVfqYyoQMYIjt0HLIC9inOOLFcCuUOil1Lvc6\\nhy5ytr05eeGti+4dgZ8qbxyDtANzlyXcubJtCaWQOKM5fQRzahN73o2X7uHRyTjVYNucUxHZnbUV\\nZprMPk6TeklOdSdz0OmSbIYgiHOFrQz2rXBnk9Mm0+SIf0gVd12Xi8D+F/3Zi8t4ThEG4O4cnE4n\\nXn/ywLd/8//Ge37GvyJxAk7JSQltzntPKW12YxwTb20tYlBIn01ZGqavePMJPQkrCoWMIs+C5LnR\\nRrUfu4J7u77yP/p1fPVv/fUcfXB3PKPenfnQhz/AtQ9Gg4cuhgtzMlC4oPlULpknYtEktiKb5lwK\\nsbCF1RsxZHRis2KR9DmFB6eMR8wM94lb0eZ40X5iRX2HSWSQmbKWvHFp0xclao3La3UghZjk15FK\\nsohM+pAk+pNJ6G/JIi8+fP3i5cdKmEjpBRZveVmCTsOWrLXbimgyHZaOivNYhXcvRk/wZQA1xuS0\\nyRHLDU4/To/9x37Z5dr8/N8dTQpgzyPG57qPcyxF44214YYvUybbkii+GATG+Vo4lcHrcehrXZVF\\nhkFhUmYjKtS64R40g60vaS6hhI5mbKYp4dqNvmCco+kz7ohS1pbYZ0O7qLSxaIkKbw0zuusAzVTQ\\ngrl8d8OSGQ6js7FYDwGnolghQT9iSdn8/9p791jLsq287zfGnGvtvc85Vf28/bgvwBeD20BiQYJw\\nQgKRCLFkhBxjmetYAsUJcYLiKE5iC8U2QTFJiBIZyVEspChPjCEPTBxiiCGyDBiEgYQAvjwM1zwv\\n3dD30a+qc/Zec46RP8aYa5/q7qrTfburbl2oKbWq61TV3nutPdeYY3zjG9/ndO8sRRAxSnmLme7J\\n6Ux/OWguvcN2CuGUk0mZZ81ybkebOqJRBtYaDYnNSWHWEPuYizFNEWjEBXWnZ0NNiKmvqs5uA2Uz\\nJdCt7KaYzz7bbdjOwrR1dtvLpdW9W4+cbW4JrGN90zf9Z/wbf+bP8/Q7nmR/88OowG4zsdsVrp09\\nztf861/FD/zUl9Nsk1zigvmCmVJU6a6UQ6f3GI82h8MSmgBFlPNm4ThrzmYulDmyyYKvc/My+JV+\\n+2DxVpYAH7u554lrJ7z78UcwM5577jnchQNgKdjdltjc3pPqU4TSw/urJPc3snFZSfhKuLOqjkmz\\nhpSKToot8eC4RtlbJLUFRlDUtG8alKnRrCqRlXZPzmxehFsGihycEfHA47J5tu+knGZQ2z4eKuFQ\\nX7PkgQ8mlgq4CBuNDE3LkY5Wq6T2RHJwdTAJApPuODs9NoDv9rr8PpoZvY3UeoZDAzzuJ+RYsIRo\\nzbDYUdWUmQSKs3ThpBpyFrbw5sbijh0KVSsqQt1YYqPR2qtS8amgLXi+0sPtePGZZmHf5D10f90a\\nFzLR/IC0iaYtjFpL2M/4Ek3bZoVuB7TMIYaTEOroVE4e6obuxoawvdJJmSyb/yoYh0gYew0RIi1I\\nazHj5m+xkXbtZMfZQ2c8fHLCQ9uY6T+dC6c74aFZuF4r82SczHAyK6enyslcOamF0qPzqSWI5Fpi\\n+CAmbCRI4DXKvpOd8sh15fHrlWsnwtm1mYevFU5PlevXJ66fCtdO4Np2yBd+XH2Dt7z+x7/9E7ds\\nyF/6xx/k3/1zX8emKl/21f/p+id1M3Pt7DpPPPEw73nXk3z3t30j81aYajA6ZoJTfGE9Rwudi96x\\ni5nzfacdOjcv9ryyX7i5dFoPMfKznXJtO3GydTbzxFyPX2IVvysBd6yz7czf+7Ff4PkXX0Fm4Zd+\\n8ecQbTkf7xz2zkWLoYjeB60pB2gshh+0Bs1umiLozBKZBukqDZG5TuqciHJtFw2STZmpRZkywwVi\\nAyiZgQ3ifuzDUgkfrJrBLWlo3XIsmRDfB5B0Phj0QlWlD0GOXFdUjLeshIbXFXS2oOgVAYzV9WJt\\n9iWbXxNegDgQbBxMeq/C7WuXe9yvcbCLjMrlCKHVEseTelIx1dHq4W9YM5hp2CBtN4Vru8q1beUd\\n15RHz+D6iTCdWui3ENx/M8e9hyhS61iSolvvtN7X/pJ7jO26VrR3NlKotXOtFq5tY3R8o1FNDWqK\\nSg05yIQ0JamAvRdaX45DJ0Uobiy2Z5HQCG8LtH3wyU0W1GHfLIxzvXHFbARyeeLoNX8o4j/w042L\\n3sK2o0GpYbh3WitlCsnAPmhAONtpihLTnVJLAPMzbKcYT63iaxlsqSVr2SAqImOuBVFlco8HcMrG\\nWYns5l5nuK9eX/sffxvf8g1fxY0brzDttvQk8990eMcm7LsfefiMRx59lLOTiWma+amf/iV+5APP\\nY3ZKN8ME9nvjokNvxoU1zl8RXj50eoN9b+xb1AHene2sXNsVnnxYuXY28ehJ4ZFT5eRUOEkd3c3t\\nrC3eptUMzvfwwz/6//D+L/t83vPkU/ztH/xZbvgZNw+Nw97DRFOc2YWpOJs5J6skp8+AXa14hToX\\n5gx2MbobjZBgQwzhfLLZ4gERENKGvfdsvAlTMjNikivoghBZruLs89+3JcRdlMsi7MdgDbEntUTz\\nZfxcL+OnEtOKr221xbosDbo46TxLXqODa3rijQDLev3x5+OwitepE0B6At7F7/ZOy4jnFA/R/cHP\\nbWNMOoYEg0rXYO9OdWFZwpHYB6c3ByOWHtOJF0tnadGkqhqYsKTMa4zIAxJ9j+5Kb53zvlBNaQZL\\nLyx0WtJLlyDAx5BVL+hkNFOqGIulO7MINw5RUbbuIaxDYN3LOlsQDThx2NPDckzDlkgLlBaBvkzK\\npJ3FklBg0GjcWOCvfPVT+KtpMLmuzItKhXkzsd1Urp9WHtkJD51UtlvnZDsxVeVk45xulNOTgpaO\\nFKhTwUZJ4EE1q5KBU4KgP09wMgmbGr/uJudsFk4m5XSC0xNht42/N03RPPhEB1yAv/b1fxKzzm63\\no2SzQSTKkoee/NwMEMLLr9xAKCyt8ynvfprlxec5eGhxetMw1gPOW2N/XjiIr6V06yE2cqOF9utc\\nC9utoFNSc5wwFLSRKR1pPXdrFQkTyj/4+Z/L//J//SRf8kf+FD/6D36IokYdUStN/yD0EcRDOHtW\\nSWscZdHQO6g9mA51I8xziCLtttFsnef4zke2zMAMXbhpPR7CnJH3zhq8Zj1mpdG3iqx5nmOqbp4I\\nF9wpIIhhzTM+vmhIGq7dEGHVQSbHcQ8ZNMf7NGKycgwWjJ9XGZKJ0UAbf1ZKyGrGe2aWrtwScEuN\\n7FgENkWuzJ7u1lpy/L4mBW6MB5dqbFJ/d5OsDicOrF0hGkqzBg7dM9n1rALS4HSaCtPsXD91dtvO\\nPNXQ/lVi4KnETTbv6cph4EMaVaEuKSYe/oqbqWIa067TNt5r0mjaVi3sNimsPldmVSYNY8lSHbTH\\nsAaABAXTa2hyTC3Uzpbm7A+wlxhPjqZbRbThcgj/Qwv++Z3W1eyFEiOeWuPFSgU0tUmJxpiUuONm\\n0HoEid4bXsawQoDdWx2NtMwsstSac8OXKqty/VjDRUCAdQ7xPloD4nV36MLP/NJP8N5rIUzz8NkJ\\nL770Co8//hAvSefvfM//zJf80T8PYjTvoZvbggvYRBCZqXWBQ8+ZfGN252QubNNxVRJrwiRL4Qy2\\ncixL79ZyZOWsft4f+Bw+65nP5qYLsu9YRFr2KLPHtNFcwi5lSu1ayWbKpBlURIN7miPbogEfhJ2R\\nr1ktBD+29RC0rhYTS0WjIipTclf1tbtjNISKR6k4aVCG0rEltDckfM1iuCMpYzFQljhfNnzz1VXA\\nE4+dxkEpkTGF01s0z5bErUemS7J1xs9Go02ENYPMWY/kx+afCZeU7u7dsqwIPK85xubj1y4xrNGF\\nGF/PvdEs7veUGPWSOLbn9UfTyWI82jzphjEIsZEYcy9VOelwI8WLrHmIn7shhETohk7T4MZWNbxW\\nLs4XTjYT1jLQTiV9/MKnsZkzz4W672yKsO+Fi6ZcNENLgz146ZhqaOtqUGP3NjHTcSekKr2EGWxN\\nWUyrOdkWjJXDFc/hlZlurYXtLGxnZbPREJ2wKBNL6niqO/vWORycQ1s470bqUlPH6Y7kJMrISvLk\\nzBN9uyGsSErahySUULK0ux8y3NutcbB0YO7Ol/2Jr+PZZz/G9vQEx/noR15kN2/5W9/17dSpIans\\nNUuocR2Wyv680/YLoZQfAWeuUVWcXTOulw/xyLZxMi2cDgPJGnYzwR29+9c5iHKSGgEoqDkXzViW\\nQndlUzRHRB1sTBIqm9k5neCkwnYOp4ppTjH1Gk3UmpACRIAvNaQNh8uFSuynuU5MVZg3wm6Oe1nK\\nccz38hqT8J0xWRWvM/bUJAEnD+dcfIzdjmGJmD7DoS1GbwmAeTQtLauO5r5mc+ahZNd7NDrNYj/X\\nhD4mouobycUweI3GYmTltR6HMoYI071eITfk5Dmwsj4cbmncQmCi4mHtpYxEBGoPP8WleRiuNlkx\\n+C4xNBIuIKHbHcjwYEpHZRNK7cZBZpAltFpqZZ6FXYENBS01eh1TaLXsTgrXZ+XaWWGzU85qZZoq\\nsw7X54mzufLItvLQLvbU9qRQpQQ85QFr0StVGq0IF73jVkAqiznaJxZf6N7CjVqMw7AIvsN6Yx5p\\nSnTb0QyiQaQOjK6xWMGbsm8h6SYSFOxBxzmYoYtSJg01JMbGjltb9djdHdyrPBjji5OReNyfkdds\\nNI4CC/wr3/yNfM93/Bc8+2u/ysMPPcS03dCWhXbjglO9yQWntCLsvXPojdZreEh1CR+pbmy3cJpy\\nyN/0F/4iJxc/xgd+5scB4c/+2X+br/+P/nNsUqap3HUsFwKfPGKNMYBkU+DNporPIbAd5PhwS52L\\ncbqpWX4eMVTRsLGZp+x+j/7G0D3GmTIVtRpOBt2AMeaNZENNQgWqZgbOa7v7QgQtI7SVh45s5ShW\\nPwxtI8P0CKQGSwtvNc3qrE66XkPvhiWRP1gRweLQLLMniYxHde3dZGEXgktjXx/gEr86hn3W+3RX\\nvsk3t8aoSPMjj3chgu2SjUATwrUl75d1SVaGp6VT3JPBwCmEN6C5Bbe2Gli46y44y5BqxUGMYuEi\\nbXbBlspmbpQ60VvgxFZaHMZzitMY2FyZU8u4mOHF2Zqy5Li0WQxtuDuzT1xoVOfnRKV+4UYpwr40\\n6j78+UqdKcSgjVt41LnF0A/iWHPUsvK/w7oy010a0YDoBWvK0gPEbocUIE/9Tk/2qiYP5mDhDrBv\\nzsVe44RbPGxLfDQojgF3zcjHn2VmcownnyBQ6w7LiYymLSHc05uE3U9zvuPv/wbPfeSCJk5rnWmO\\nx+7Z3/iHmBfawaO5c4iMqB1iB28o7OrERmY2O2F3Uvjnv/Rf5AM/8+OowBOPnfFf/dX/mk9592M8\\neVaR5eV8OO/u/REGnzEzEQtoo87C6Yly/azwyPXCvA1MbTPDtFHmCvMWyhyZeRyuGrids8oGDjZD\\njOfK8eea2gKTs51jEOR0F83ZGJDJiok7BykVUsA7UYNgbq5WSjAgr3T68CiLLTNfs2QT2IAL4tFR\\nWH/mmeVGGcoKD8glrF3JibpMMmqJTL9ouBePad77IeCOFTDKcXjE875BHsIWIJuqpL0Ot2DiDlkV\\nRUAyi1oOS/rgEhz0Q+tYg74I+xFPJMpdKbCVikwehpYe1VFB2GhlHgMvA6bqmgd9nLAyKZsKZ1U4\\nnYXTCic7ZbMRNlXZbmA7F65tYNrAyRQj2rMLOsfQz8kcFfmAj/IOYO6cH+CA06WxtDs/i1cG3WaN\\npQv7g3PIjmNvnmIRkR44pPZrfJJSSk76BIDl+OgyBGcyO7VjlHFkA+s3zBFSGxvwfsxyhcQfGfci\\nMNcywz/5vif46v/gv+eXP/jb0EPm8HDjBt/3vd+5ll5mBK5VO6Jh+dEkRFB0ck4EzjbK+//YH+K/\\n/f5nceCFl2/y2GPXOD074el3P8V73/teTnYTL734sbsad2tiiyKe1xp2NlONUnjWELG+Piunm4lr\\nJ4WzbWgnz6qc5IjudiPspqB0aYnSdXTxdyU4rKOxuq3hEzbNoXe72SRToTrTnKV3NlffDFNuZMQN\\nSZ5pHlvm+fvUCs4AujTHLRpsY79mAb3S/VYxGj9ygNdAzJHt0DMzTDiX7/1b38lyc59j0G/5a7qr\\nK2ydfHVTOU7SxbRuzmcAACAASURBVJ97T3wln/WS9DdJdlJ4nhmdEg4xYkgO/TixrzqdhbDXcXcc\\nQ62H28wmGC/iEj6IRdFtCF/NE9RdjNXr3Ci1QXVqsTz8lbpNDeNa2JxWNhqN+90mHL2vnUyc7SYe\\nPimcTcaJRqCfpGVPRZAWnPSDh6PE0uDmXkKTdw/7AfbfYV25V19ZoLVQ7lmss3fjvIdluDVhWcIO\\nulvoYkJkfJHmd/DORpXTbXBILRX5VZJ+QsAX7p56BJG1lNcUivffGuhjlQy+FmVWUN2cr/9zX8WX\\n/2vfzG996CMUhOdfeJH/6Vu+heIvRdlTnDKHhjDeKSJMtTJNhetb52Q3cbpVdlV45j2P8Rf/6g9w\\nWDqHZQk94mni2kPX2O52vPfd7+EzPu2pu8JgcHf2CSuU0Y0fJfAoLz2aItMknG3g7KRyuqtsVajp\\nFDCVgCVG06tquDdvCq9Lh1IJ4bmZCPpVAhNVjeGbST0bmW/umocMivkRLhmB0z2ocRh4Nu6cEJtv\\n+XeGQ4YnDHG8T0d8dv15qpeNnlz0nAd85vyRP/rH+PRPfZJf+IVffFPX8IlYGVJBPDVCMtkQDyy8\\nyJpQuMHSOkt3lt6wFDPfm0YjrccNclmiEXexsBycfTecjiZk15uwiMbUIEHncgI/32hhozXcyEs0\\n1ba1sKszm3lmLkothZITc5EVTxE8tVM38fxtpsq1eWJbC9udsi0zJ5vKdhaunwmPnW15x2nl+lyC\\nK1+FDSWcW7xTtNPlANJD1P+K7Xhl0DWDm83ZS6ctnWXv4VxwUF6+6LRD+AMdGrySRnKa2cq1XTx4\\nJycxRjflhUNs+JLpf45OB4k+3/d+D7iQGbgGtStUiKJ7q1LQfEi/8Rv+DH/6m76bX/m153js7Bpf\\n9KVfzt/9m3+dQ/fAEnunS3TGTYjMlxCImecxAw9FnX/5y/4gn/1P/0leeOGCmxfnHJYD283MZ37G\\np/HYE49g05bP/vSn3/brdEJIuyVm33tg1xAwUC3KNEdpXCdnuy2cZAZRSqiQ1UmDnZJ87WiQRpMr\\nYfz1ob7dnh17YhzKwZ95ffnO11vxOAeea/il2YfovotEk8eG7ZNKOFSPQNoDi1y6H/dsltFD1lLk\\nqM9cL33q9JJcf16E1d34Yy++zD/1eZ/zhq7hE7nigIvMda1M874V8gDuhlvslYXQU3ELh43WCXuf\\nRSMgN2E5gGkJzRaE0iBezRHp4bZhPbRHNB2Rp9BfLuqpUREuvTopm7mw3VTmKeCCWnNCthSKRuNW\\nN4VNmdhNMU5e5ti3tTgbCF/BrbLbbNjM2ZMo4SxyujG2kzJVZVZBu+JSmNBg3IjS+p1FzK9mL5Rw\\n9aU7C4HfaoebtqBeWDwEu80LW+LiNlNhqprd5tjSQwqu5DSaavDgILug2Wi5VwI2b9eaBGoJ/LEU\\nmN1iHLp6Nnecr/jyL+Sv/8Dz/PJzL/Dcb7/CP/Gl/yq/+sFf4nCImfviCoQFd5k7Oqeodg17ku1G\\nmWp0W7/v+7+Vd/7eL+H551/mpZdf5HBxTu/w+595hk/9lPfw0gHejALaG1ndCVWptQwfU175ORW2\\nFXY72E3KZvLgwtYQgx6BaZTP0VSJEl9xDhbBcHz1b2QLjMAsbzjkBkQlZDrrYTkj+SplLWdhOGxK\\nflAnROoDagBc0/mYW7LdOIhkvdZ+qVfR5aiqNhpTh+xbvPPpJ3j80Yc4Ozl9g1dy79fQ13WPSkE5\\nQirHg4fkOhC0Rg0Ro7iH0axZLZ6sBHMHDeddlEMFT/W4IjEiX2sJXHeqVC0BZ3nIrrlHxUwakp7U\\nwjyH9OK21hQlyqSgKHOt1ElCeHwiE0FjEkFLD7nJUikpKbmZlc0E07RlN0/UTWGeZ3abwqbGkNdU\\nQCQNXWtk5LVMd7yXV0s71kJfxukfGcLenVmUPUbpipqgU0MksJrUX0FxqDAnEC75BQkhUVcsfZgu\\nZQC3k567X5cKbObAYWue2j35nrWHItR22vLeR43/71eNH/77P8Qv/OzP8Rmf/Tlc3OgcitL3bdUp\\nmF0DzK8zp1MJmcQCm62wqcasygd+6u/w+ENP89ILv8173nXGe9/zLjbbLfv9wlNPPcmbQzivXlWh\\nB4gfWfe6a+LwXKemxviqQsnssUE2WPxYenpggUv+vlR508fEx7NDAhSIw/1waahkRPBShYm0Q7eO\\ne+xnPIY6WgqLu4d2QsbuFNyO/xcbTeIhWJ6Hi8RwhyVbo+IcEtrYnZ4g5jz6+NEr735awxB6VCRC\\nyI6KhF1778KyQi/xDC8iWO94TznKLjkirHQJ2Ka3BiheFF0aWguWHmPtQLpAbNiwBI006U06FSbX\\ntMtRFunBpmCBZkhR3A9MVdmmGWhMOZaYZFTh0INtcUHc86Kh1bBR4YCx1UqvBrLDfc9kMwdVbO68\\n/NJNfCq4H5JZE7bx4hJuzlfgC1dTxlywmthNHtMiQm/GXIRWHdGQ0RPtaJFU8wkpRxNiWiTauMFx\\nTE6mXOrUFlhN+z7Z1pTUoTLngMgSgWpRmGcNXKsWGs4X/nP/DMseXrkwbAu2F05PGyygE2x3cO1s\\nx4n2FG0J3YptiRNbiYz6V5//dd798Eydgo/04osv8cijj/Kbz/72Sn8ad3I0cT6eZRyJ7zE4cKlp\\nKL76kg23AS2E1iwp+qKwt1QDU1mtvoNmF2LrQ94ylPnu3h4YrzoaZDUD5XE5teQ1amHJLrv1I8PB\\nTbAC+yV41JL7u/XsQ2S8HG4TcZ/gkPCCSObRLun0IMylUuZwg37koYd54eWX7vpT8Kb2RCZKOZUb\\nwxE5zNE8LXy6rNORrbU4pLsgJao59U7zEoJDHq+ngSKkB6NRvFD7GC4wpjl8Fncy0SdACQug3im1\\nxL0sodsLztQqIoGpqk7hoDzlKTmuQyrNO8XD2Vw92qqtt8yoYZ4mJlcMwYtzscyoKVXiID452cLN\\nC2yaaL0hLYR9OjGZuJE7h9Urg26tAuZ4dw4+Uun4QN2diR6iwmmnISnMYdY578GJkxpCI7XE1y1E\\nZlBKPMDTmyos789lElDDHo/xzWQ1TEmVmerAEwsXqaAkCNtNiZJknthqwAxTgaJTOCQUYapEFjwF\\nxWiu8Ni1YDv0ZUGl8qmf9k6eeuppPvjBX6EUYbfZIKosywUV4ZVD/7juriaS1+w4uACDQhVBx8zR\\nSaivCpiivjZA4DiBteoK1OPUlQtJxL/7e0AlJi3FhVmi1B/qcSPz7h2kJZ+UyODG9fYWsNvBonwd\\nTd8mrC60VeO1YpIt3Fba4M0LuMJv/eazIHB2/WFunr/C9uwaTz1tWDNKvXvZ7hsNuJZ7VDPgrp89\\nD5SxBwbtrqfYuqigTaAIbTGsKK6Km1EVdAbfCwuOu9LS3knMWQhOv5MuDlm+zxIzAlrAa8V7CCTN\\nOD6FlZNMGip0U2j0TkVxN+ocQxiHQ9D3imiI03RntohjntWFU0Jbw1swKw7hEFwoVC+0aSG0YWb0\\nZqMbnEpH3ThvjrpicmeTtKvHgCu0fZTMXaFaRcWo7mhVqivTVlmWBaXgzdMkLrIyinA4ONMmLm6T\\nmqAO68k4eLufvCE3MvW9jM3oK2hv3fESFJdm0SmMpD/wqioLu90cOFY1JjFKKezdOCnCNEdbYZv2\\nNKV4Uu8AnOsPvYMf/Qc/wYsvvsD5+Z6eXeGbF3tG6+O/+9Zvf0sT1Ergtvt1WuuIVUqWzJKN0cvU\\nqDGBeOS5jswvXmSlCzJ4tvdmBziRlY5SeZ12THqji+TQAisjByIQ9w4qRlcZZF4o45qE3gYEMRgO\\ncd37zPCXfLkN8CM/8kPxyupM08R2O7O/8QqPPv44L7zw0belUvl41mASjRbl4dKf9Xa8rhYTUvn3\\no4lkQjhdd4t9IIHbVyx87dQwq7Bx9FA5lBiYqK2wWEfdWYowm0MN6ummhohUlRgXBqfXKZTaerJZ\\nSqTNpSibqTPXQnCxlYUeWfQUokfiAYWKSFBjeqHicW1uWaHM4SCxU0oDLx1qXJvW1AFOXut0rpg1\\n2qFxEZYad7y/Vzu5SKr5A9coWIVDduYhfLvaEoFiaRIJdoGNCy6R9ZUpuu9Dd8FTvSnKSlnLl0/m\\nJYS49JKc494im2pJF7IOYjEy7ZuCa6MsqXZVwuxvk9NltQjXYkIEMfhv/to3Q3+RL/7iL+LXfuWX\\n+cDPf4C/8Te+i0cevsYP/8iPAqRVyauxJOf8/JztdvuWr88lLHJGqT1GueO9YyMNsWuIIFSQFLmO\\nUrRHfEKTWe5+77Lby+vVddXloBaZ25gQC7ujnlguJHxkSumR5UoJLdlhallyaq4l5llyCOSWiUti\\nyOCZ3/eZgHPz5k3MjIeuP8S73/MuXj6/wHE6cssDemwevj3X/+oVPIA4dOJsj89QPKsBH41DT+go\\nBYcssNrmR951VQ1MtkTPpylUd5rEIeNmWIGNlRggKsZGhMaEArNu0RIaHXMhrNo9LZVQrB0QL3gN\\nm5FJO6ozQrituFkIj+NMaX1UHaSC9WnwVdggHHCWDpQhGuVZgQVNdiQRIFSv9OZU6RxqQQ8OukRm\\nLIVSJNujt19XBt2lWYz1lVS6EFCPG7wcOtVrTFt5YLWhKhUP6UYV1NlqZGiDDzlm3eWSpN7vlDVs\\nTpaSZKakFjVGVm/semh79iCrAsFZ3RZntxU2U469EhS0v/QX/n2uIv+9NuCyyiS+HWsE0DFJeHlJ\\nYrG3HJwepXlvcOjHptP69yXYDT3/1SdyG1x+byfoXD0DpXvIF4YTcNjVLABu1CJMLe59nQQToS9H\\nAfIpGhVrX3MVjMkw/xmf+QwgmIdlkONs5so7Hn2MmwdjO5cMhMcH1RM3FN7awNB43VFlOGOsN5Ig\\nl2gMjX04qpW2xGdfugftzoJLS3VaFWoDrCE12AfiYUFUTaA4NcWdIO+ThwtK7T0pZyVNRR2G04Ok\\npoMm/9kFF0WnuL8+GWYT6i0CJ0YpmgMcMSW3LcLeycYozKK0rLi2VSnNU4bTuTBias4dtYpLC/pg\\ncyod3TjThdPU2GwLS4OzjYB0JhzrbzHTLRqbaSEEld0E87BaL0qK/QaeQwLsCOw2o9vpl0q0KCHd\\nf+cF28tLiAmthfHgAgxFNuVCjMOhUkqwQmZ1tlXZbiP4giT+DZ5WNK/7PutrH/+/FuFd73qS537z\\nt972LnglVKMGO3a87ygjPSk6IrJa87lHSWoJJe1DUyackCVe825uhTdbmscBkN5gGo3AKf/EPK57\\nMcd7YGSHEnJ+5wdj48BG2FrwPge0ABHMJGE1PIJyb/F3lkPn0UfPOD27xqSd7WbixkXjdC63NJfb\\n5dfL34fIT3zwOxOVXnudsdWyIUbKVxLv4Xnn1hHn/PUARK9KWA4x4CNBzYiEQ2DWSrfOXiPLXSwY\\nA90U7z0DvqLZWCcbawiIZn4vDSklLlTTrDKfA/FourkFiO4txsRJyp5p9EFc41AoGpWmanxvMkUD\\neMrvxTt4JV1FlKKWeHzY74QQEkwieFFkaZSizK5UOuwUnZR6w7iwwv7yxMzrrKufSoEyORsH7U7z\\naJzVWtAq7CX84dsBbvZG60GGtqbcDA24KK/G660B1/OUvdrI7ZN1TeSIql7SIVVhLspJNTYKO3G2\\nU4y3krQYEVab7U25/c3x0dkAnn7qUT7rmffwOc+8l81GefjR63ztv/KH39brGfjnNOyBcvc4yVTI\\nsnrpQY4f4iNOZEzNZM18s2i66xnux/v6I6MMNTeQbLzhMc5q7uwXuLgwWnNsgQVhTgOMoVGxfo6c\\nxJQMlCIwzTGHt9vtUJ1YLs5pXTm7fp1nP/QccBwmglREI4LlyKXSNWf9740uw1PnIfDrPvordpS4\\nNAsMdGDZZtEodIHWQydjaFK4O92MPcYFnYNo0uQIChcRLJt7TPx5jNMWDc1bKXbp4iwU9CrMG4ln\\nQBx6WLG7x2SaQAbaijWj93jPKWGParJKYormvU93lblqWLwX0GpUcaQmRNZ79F8SXllwGjkN1y0C\\nb1HKJn375s6slakGPY36FoPu8Gw6qIR1hZb4oEJsSxMuvHNuRjsI+xR77mJh9uesAsxDvHwNQitn\\n93du2itk8NWgek0Kmxp6o/MkbHcRcCdJnVeLx2fMswvC5uTR17zuhz70HO7Gz/7miwA8++xHuTi/\\nQOrEtbMTSi384I/99F25nihtnYoz4WsGMrJuy6mutkiW6b5Kdo7yvdz3WgPxwN4yXTbG1XtMpx3a\\nwvnB2B86h4wkXTzUs/ySwpZFNlklyvIGOT4d5fXHnv8wh2WfHfNGb+d8zVe//3UPDCfymGAT+Fpz\\nvNlbOcabV7kEH7S4wLLdYenxqmYghFKXlgBCBv9fLx0w3kGWxPA7ObKbEI0rlBDj3wzdjWQXmIc/\\nWlxf+tVpmIVOl+6/SOo3YAmBRBOuZxMzDo1+NM60uD+lBswwpXXThKyj6KVI+vaFrKSIghW8O613\\nzFpUGw57LOcL8uaJIpOxK852bszb0AyZrvDMujLoTpOwm5Xrs3A2a7r6EgLVFBDDCY5ha7HZ4iEb\\nUIJw0SJr0ORqquYY5JvaJp/cK+V/Qie4hH3RZnamGtqypR4FRMxSlyIpRi+88hFGuPu3vvbfwd15\\n5zufBIRnnj7j5JFPBYTnn/8YH/7wC7zwwovsb97kf/iOb79r11OR3KTx6+CgjgdXiPJu4Gqae2JO\\nAZv7O+De2mxzd7oPsZvwxhpCL4rTJTInyT2/QmgZzJDRlCItiSLbM5w//se/kuc+/DyvvHyDx554\\nN5/ye34v73vf+/jJ//fH+U/+8tfz0Y8+z0svvsCyHPLzJLDjMCYyusWYcSJ863KOgw2Xf9YBsVDG\\nW/rg3B4hkNHkFvN1TFs0xnTnEnb3UwGpnjKdrDhqpJbBHGgeh2tFkRruDaGopkETlVCr80T2iwQd\\nUtSRvJqhz9LEsaHspoFRWYtf3aN5H1BHJdHmFIQPh2VygrBOUaEVzyrCUwCphICT4iwSFb274lpw\\nZM1820FDhwNDesUXpdTKdtpwrZYYd3/1TX/13rrKI+0nfzlP0sQM9+YhdONxoiHOYYHD3mhdKOXA\\nI7st89bYTMKcyv4PbYXtHLJp23LEZ+5H9bC7uQynuawYJ4yu8HHjwzE7nDS2pGa39fXu13vf9wy/\\n/o9/nrOTysMPP8T5+U1efuWCi32/J1XE6BXtV7GXxHVTo6El46G7p6iPUCdndw90gN/qinI46GL7\\nAxyac3EQ9osDRrewptpml12jDABPQZ8qOcE3NBkuH0qg7Zzt5oQ/8f6v4B/9/Af40LO/xXO/9bFX\\nfYoIhv/Hd38v/9If/lIqEipXXY6HXO6XMfDx6mbNgbDMOawwQkIKjOZUBDv3SxzcxHCVqNBMCJnK\\nHIowJIcdCHcHj0m9i4xkcyghsUhCTx3ooxIamX60BSuCEJNqaODnMQXoqDum0cA392RPGM0lqKkO\\nWnP4RIPSN0/h0jsOkeEI4jgqujYIB2a9Tyjlxr5xsQiHpWGpgGYOtKD7bVyjIVx7uiQnM2cRLtqB\\nF19u3Lxx4N/7iie4nUfa1RNpRxAWFWeHYBtna4AJSxeqOTZZWoEL5o1CjYtVZ8ovsTlMK5Z3/z9w\\nd2MJ8WD0bChZH0GXlds5/mZPoC0EUm5flLzyystAODQsyx7Vwr/wxV90z7JJ9WRnZHdZVFaaWDwg\\nAhpjoFVHaSdpCHj/rcvfgjHKVIEC2oUqnTaHdcZWhOohpC4a0oc9MRRN+MAzI51rZsLS+OhHP8oH\\nf/HneP/7v5LTsw3f/h3fedvPI6QleDJEhnh4fNh4trQcG9R6qdEJqX5HHIrrNKELZOB1yUGepLm1\\nBWxAQWSwGsYCyW4oHtY7i0hiFYJplOHhLuMp3h5YaCO4vF7yAI45oDh8cLpEae/pgwaxh4po4Olm\\nyeePJqRZZVJhmo1aSDZUjPa6BeI9YBLz4M2rh29fX4NzZPQ9qZkOoUrm8flbVxZb6N3QXkKmoAQV\\nrchEwcKRRIDqTEvwfesV8MLVQTencDCChTCk6lIzoWvQmkqfaG1PcaUXDbUhNNgNeR/HqbL4UYX+\\nd+NaYfZ8cETAVVCTWwLvsOPWW4Lxa9eLH/tI/I8KbenceOWC7/me779bH/+1azQrPLDpdum6VGPq\\nawFmycA0ptDIhs5tru3OV3331njPkZOWAt5gVscV5qkgLTrcKjBtjp9yTHFhIIXV+bodbnK2vVXQ\\n5shsuF21qWy2p7x888VURjuaBdCFZYGD5dSnRvPLNaUpJRplZCC1fnz+ogq5BPHYLb/EOyfUYJp3\\nZOCmSsIrcW2FnNYrkVzhMfgxLI26Rx1kEqL3BpT0SHNJmMYNkm7aydckqiJWHFdRLGYBLFCMbXV0\\nFiYGBh38YR8NL41S3wqBwyvxLBlIHZBBfNHDqbpqyI9iiqWa/cREz7sTHGKjakG0hCQlgqUE7rQR\\nNvYWBW+GQIfgeIssRi1OdEkQfePCRTpmCoXiOfrnMTghk3DRAkpYWpRB/jtgIOLjXeP0Nbt0/Tac\\nNwa8EBtBYJ2cut2y5SIfpE7vez7v8z4Xrfc+h3SJB/5IY4uoZM2jEZLMDHMHCx3dbPbHvyeus+Vp\\n9InW4RgYqUpg0UuLbLVLVBUBl4zPHU2mxQQdOpUEBFcq/NzPfuA1r38MtgN2iKUqPP3Od/Ch33ie\\nj914KbJPzzI+Oc+9xc+KyC1mAN0H3JMc2xVbjjK9J1QhGjCBZdY3XU4AnKOwz/hcA/YKqYIVQpqI\\n4aeejIKRHzSJ7JG0MQpcOBvnNZpk1iO4VkqqmEVo7cmsMBNUnUqouiEFTby2VlkFiiAV3XJaLhhC\\nUSHuiWxeLRTJPBt+LYchmkem2i3gkqJxA6oZezfUNJ9LhRxbLzWfSwSvcaINWUdLC6E7rauHI3oa\\n02mcbGNkd+w263H6bybFyibVMATpgk+2TnlY3vy5xylbRD7pZBzfjmXjv6HS1IPzDMfMR/JBGLfn\\nTrh3NAwiN9hfNLoJf/cHf2TVN7jbawTKtUsNKSgj67jv0OM4doDi4TzvIfP56tep2Ub5RMIPliW1\\nChRPypCEvZDU0H3to5nmRJlNwCdjIOCyI8rved9nvuodIot7+unP4Lv+7+/lC37/+7h2tuHRh6/z\\njndcR4hJqhc++gKPPvpQ+HpxhKJEgv6ka8DNLDQD8aCA4YnFSmTBQ0tj4LqjqWQeh8YR2x3f2THY\\nrrxwYcWp3aMSKznoYCJ4i3tmEu7Pc8teEMfP5B7BSQIIzr0aB8qkOUyzWrtH1msWSnZTCfv0oC1G\\nslJNaFWpnpWUE9mpxrRcUcES/nIlJtZ6wKGh/xuZ7NLAm7GkDopMAsuClzma3SJIeq+5BUe5mGAo\\nriHr+pYn0qY6Zs5tLRV7ZN10jhJvJoZ2T06eMXIYNSFEd474iuXU2u+mNYLKmAIam548xcViE9ZL\\npZz71S7IkQkn+1uUv/Qffh3zvLm7F/Oq929wzOwu6TOY5UNMBgqOwdgsOslm4WulDHnsWK+e6bmc\\nE96LNbB3gZig8hC5MT+Wv2JR8h+74XmgFF8pUHiU/g89ev2W11etHPqeZuGZBmF86d7Z7/ecbrc8\\n8vApX/gFn8/P/+I/iuxfxsHslOlItXSCluiwDqVA3PMqvg5ViBy1MCA1kUfgzaApmvoRemuFFQE3\\nq1Q/Jgi2Vja+vr4UZ6jSj8m+SbL5lw3V9TNqCa0WgxhNSG2WDOp4ZqhGOkLH62o9YtiWvO/ISKFY\\nwBqqmgpm8WfL0kN8XjVx5RDkCWprHFRLN8w1aWGBy5fkU7v5EW4pntW/YSac+0K3jviGTb38Lbx2\\nXRn7osuX3egcgRSBQ48Hp3fjYjHcO1pS2ELSnxsL4Yt80IpEkG4G+360TfndsDyJLHDMVobClub9\\nkaHk5bK65C5ux3/3uq8siFecII1/w1/+xnt1ScA6Gb6WvsOyfJUCBcb/LD6msGTNeEJv9vWvzDny\\nSCMPunfr8ntVBo86PNk2ye9UDb6pZbYrWb4aemxY5RMmAos5aOXv/eSvctEO6SsYjAKAi4sLWj/w\\nkRde4rxH6vLrv/bL+ezI2l8p5cgzVYmi0xK2kZi8Z873XTxJbML6X3weX4dwjhbwUfIfK6Qj/VM1\\npwgVNpllwpHrChmUExZLN/to6qnTcyJk9CmOjX1bTwr3GI/3hBWKh+OMqqymAKWC1vzsGQA1L0A9\\nMkHPw2kwFEpm9uKBwYwq0LtQPChg40sqiR1bEaa5silC0RrwjMbcgxeLIZEUsFp6pzYFmzG5WA/R\\n260rM11vQ/80vuCWnNuSeKNMyrXimE10s+AqttHJrdQpdmTeD0qHZRlvHJSa3w3LyDFSP2qRDsuX\\nTojDrKIqzfM4lKC3OIyxvdfDwf/QV/6bfMFnPcWf/po/xb0MTU487Mf5/MjQJbOR3uPPdTxgyWyA\\nS6Uqt05dxV/zdHkYmfwntqF2eQ0hmpXel0kdmSX19HfvHuLzIzC4Awr7vjDla4+m26YIP/MPf57P\\n+ezfx0Nnynau7M/PM8iWW/0CL/keFo527iJHzYgOSA+aV5MYzFkshdQ9guQItKFvnNnieI1uIcqv\\nRyhC9JhRt5XNdOQBDwv5gMxS2jJLOu3O3GOEvLkxFcUwLHs8UiT2Rl7LNBP7R2ytGCRx5jhURpCP\\nG9kTeqCEOI+aYaJY8sTdYkhH87qLyJptHzy+g55DYC1vZvVOV2GiIgUOrjF0oaMh2AIBsKCsnUuj\\nLY5ZHcS3264rg+6+CXPNwOtxKk4lv8weFJBJBdPGLDVoThV0EnCjUDALS4zBaMCC+1gQLiwtfK76\\nIJ+ka2DgfdBq8mFdxsMKQb0TmPrIlgxNgQ9njH/ePuz8n9/2X/LBX/9tnnji8XtxSfGRyXHO3PCj\\n5LzMOVaNh6nhqx8YJI3VU8mLxIMvwQvKUSLyfsL94xBIucPkx/bO2okfOq02YLZ8XqIZdAlnJayv\\nSmaeTeCZzx+DrAAAC7xJREFUZz4TBD780Zd46snrLEtjvz/cMkSkWWpfykNJ5C6ZIPFnhRD3PhDw\\nwaGHLoLBqvQWeOyt1+eeFDKXwIzmgBMkMdIVX833Is0JDgA9DtTe43tdcoNn/ys0lw3mRJUPmsM1\\nVVMXIbi2SS4I1s4lbGPSTIizAqwJVXYP3FhtODjHCTG0n/u4gQZOjySmO80sbhJCswyToogYC0ol\\nhjr6HJzggmL5PJoFi6IdHJMw02yLs2893/ctTqTN2dY0dw7eE5MRSs8vUMMaeTMXTk6c3VbRqTEV\\n2FYJDd6q2BwE6J6cOpfgA7r5eur/TlkjkLTswg5bmp48ySgRI6uIzRPd04Ol6Igrq/i8HClYt1uC\\n8OnvfequXtPltT7gMuQkj/hez+A7rGncg9JUMovK5Ck+dzYLV4rZpde/j2Lta1YbBwrRWFMVtKRD\\nrkcSUhlZbtyPwa2tebxEEDym+6rwwvlC68qLL5+z3DhnOez5A5/7z67vK3Lr0fvq/y/EQb5A6Mz6\\nEU5Y8jAsHDHd8ZpoPKcjCKuGgagkZUsJtlJ5zftlxssIRgPXjcOhZOy2JZTFRMjnP/naGgfSNB/h\\ng/hMI2AHbiLdSCIMEHZgLROR1KKhS8Qkuq9Qj3lQyGTgzl5WKptAvGCP3kNBac1ovaA9jtdFUtgI\\nXRMEvIcUpBtd4OCdpSuHbhyfgzsbU16Z6TYC6F+7js1phBr7SlSEmJiyQhFjWwoihkvJ2Wxoh9DD\\nnDxwSk9rDPJU3X6SzQVfjoNHdCqndHKDo5KEdFLDIrEmQPJ7WXzwOiXKqRLU9pIpSWy2K8LQPWAp\\nvHZFdqcacof40Fz1deqI9H1zC46kdccWD81gPf58ZDTjKj+JtsHqijxwSdEov6tklisxOTYuyvNi\\nzQMjJmlXAlyfC906kyrWz1kW43/93/+3N/xZFjKjVqI5lXtRJTLA/ElkgwwoiBQc1zgEM3Y4+V16\\n2NAgkprJRzZNHL6ePRtWnHY01xpkbyL3s8YgSehQxGduVdP4IH5fSkyyXZTQOPApps6GxZKW4Neq\\nCwuGWXyaWWCpgi4Wz5qEzKbUYMkYAZtUNPsfmgNbUX3vF4sMGEPcoy/l0BOHadazb9Hj9QG6oM0R\\nbVRVLtohXre9RWnHTab1ImGaSI2b28wQgyIGVbOkTM8rDLfQY7DW6RKbznAWD0PK3nJM2x2vwt7C\\n0uR+Kidfb63kd6LUip8NzJZL0VjoIbzKkqZ80UzJL8yhe2CXPaOPljhttzVyh4F/vhrz/ESvkeUE\\n9S0O5INnGbqMZqsGxamlL97IKIYHWWLb9dIXfn9d5WuXc6lq6RY6sgyMNDDRyaKKS4XT4NVK4pES\\nDeRSIjgeveZyOi8z2ZdvnnN2esK3/s3v451PPPKGP9/4Tty5xSnEcjJwwD8j4A4seCrKMjLjGt/X\\n0QjyGGTDRvJVlUhOqOHDRy/5wgSuHI20eM8V3+7JkkhYoVbhkBNw4jFwtbGoipVLDbnsFcwIixIn\\ndkIMhdSfEMXomBXcChfnTkspWlXlYlkC70CwJnQsrOFTAS0kPQuWBpbB6FB6A6tK9wPNJ6TDHqFL\\nATd6O+Au7HvHX0fb+vK6ejjCj7e41LgD+2ZoA1KyzcyoGlw4LTEz7QSLqfRKa1lSJ2duL51tV1qm\\n7GOgpxXWU/9+Wb7+GlnsQFftUok2TuEYO0y5Dc+gY3GNwx9LCRGRsHoJEe+ovQmnjaKIXt7w92+x\\nPZobbhJeVR5OItbDE8+zMe3OqscKjSaVKiGmtE7gyf0PKwjh7nLhgyzP6gt2ecrejHXUu4xglxNq\\nhTh8FknZz8HvvfQ+J7sNzdqKH99pjeHgcZCLBJf14DFGC8d7fMTdfcWWIZpMw5ItLGbBNM0ILn8p\\nHhnkgDKAhM+OAXc0SFU8HEJEks+ab4cfncFrjCZ3jaeq9mFOmlBUwgju8X5LJugHoC7h0jIYMJax\\nH3PEC611mhUWc5YlGQveaFrihXuPPerhWowMSiuILohOcf+6YRVMHOsN6RvELA4MMw69sb9ouMCh\\nE0LpQyLwNutq7vk6IhgqPN3iV+uRajdxtJdw1sypmE3eIMmsJg6oeKqkhm/R2sVmnL7x+z7Krru8\\nXg8euPzzo0J/Nns8MpYj3zRvjZGd0IG/yCpo4wlWNmJO3bNFFhzdxMvE1+aECEzVj/oE3Hsrmze6\\nhAwsCF3jc5qFHODYzMebmaWsw9hyt1Q0MppAOYhzn14zRAkvGpDY+NYPBM9USBurLK3psgqNB8yW\\nGgNkc1RkZa68er2R7/1S0ro21BZPbQES17Rj1Bxc22PGG3t2hQsGJ9YdGWyGEr2Iy6PbkI1Ukm9/\\n6ZkIKlfQQiVPgpFAeFaCAzv2vA/eWb3RpiSyL3JsOInH8El4KmZTNm9PLREzVFhNQA/Nsa5cLAfc\\nCodMAKL0X1ZBn54BVzREbMRCH1dcab2t38uydIobEB5vwbRQvOxRL6BGPxgNmLxjV8B9V2e6HFX/\\nbZxiKIcCcujsc9Chl7AvETnaukw9MuULSVwyifOqIxh7BrLcfDk7Pppqb3fAie/89VL/MdYXf94R\\nVnX//BvqwTHt40SNpDeU6WW4xkoQ5m1MNEVw7QTNpQ2aXYtOrRYHD5dTKWHaOfiHo3Fw/4afhBny\\nFGoEjlhI14hxAearRYoOy/K0i4gyWNYsJWD9+/mKQ4t1YVj2xOFScsO3DGQu2dTKAGdBWb9Eq4rG\\nmsIxyL0BXN6If7MOo0jQnyx/a7429+k2stlYgxs+Mt1j8JXja1+COcY62kCFA8M4S8sIuGTAuxTM\\nh0KZ5GuOwN+EW3pDEO+n7liJybagYzkzwkHjoorIMIVAJVynhz0YLhQN5UNPVTsYNmPKoXVMSUqY\\noVI5LJ0lIjm9a4gVSceolMnoS4w2t6aIN8KxWDHrTNOEYaga3gPlDv6vMRuYFHp5i5lut/iilxYX\\nr0jKwzlWA0dpo0kSvIuQljNoFfwwfKHidDGHDXGqaWaEYbEkl4L7kGF7e4LOCKYDHri84nvzSye4\\nrFns5c7nkl+0WNy1US73xJSM0KYIjyboPcq7EUCjsRon7hhzxAStedpnW384R9zfoee4PLPU+M3A\\n14RDslLQwNvGd1o0sn5JFstYlzPc+x1mCPJ9wkMZlMzjelsPbPvQfR2gKLmve2fNDMGwKcdWM9il\\nhtRt16jQnWyOISvzI+PPOlRzFNPJvSqsegsjY4j9O3DXFCEnG2DuK6XNyCZaBlbRUBcbv6/OLWmw\\nDBseAW3gJQRhQoBnSEIGxOLE66vFgd1yrBd3JhN6PitF4yKLxeup534RgPhMLo6Y0vbO0p19J3pP\\nLjGUJZL8YYUlIAHcWBZNPegejblqqxSkZbDde+j07hdjQ2dJnLwdwsHY3fK6j4Mxt1tXZ7qZ5heV\\ntetZJcqoSeJbCd1iCYFnz8kjAVuIVNxCl7TUmJF2nDlrkdHBdju+15BwGyf7wDVfvSHv9HAeg+j4\\n/8RiWYEA1OM9b8FmSXGRhVVndGTjg/tXsmlkGThHMCVLJTjShVQDppgsKHOtHB9CiR1NrzCRUzay\\nPhL3LbRweRnDiBQwWbmTo2OvOVevxPVOqbw14q3Ird/x/R5wIYYStIRRoRPXHv+fDeWczHN3ijsu\\nGgLZkmPzBUQ1qiJJ0ZfbZLorcJX7cIyR24Dr8p/1DLiix4TAb2naxgcN4aGxd8d7xD5sxM8idzqO\\ncxc9NkwjiYg3HYF9GR90fGaPb9I9KV0te0OeTT3PhmTzFUNumhTKFo01x1f504nBT85ULJkZc1Ya\\nK7XLhH03lpYUzKXlWHpjqpsIjutNC1zC3TCJbFBLyVFeD4FyNazDoSnn7RxlRtQ4SA+ZSGpKzYRK\\nSPeFi95ZLnvWv866UsT8zv/8wXqwHqwH68F6vXU7EfM7Bt0H68F6sB6sB+vtXVdOpD1YD9aD9WA9\\nWG/fehB0H6wH68F6sO7hehB0H6wH68F6sO7hehB0H6wH68F6sO7hehB0H6wH68F6sO7h+v8Bv4F5\\nlQJahW0AAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x42506a0>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import scipy.ndimage\\n\",\n    \"%matplotlib inline\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"import numpy\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def plotImage(image, cmap='gray'):\\n\",\n    \"    birdsPlot = plt.imshow(image, cmap=cmap)\\n\",\n    \"    birdsPlot.axes.get_xaxis().set_visible(False)\\n\",\n    \"    birdsPlot.axes.get_yaxis().set_visible(False)\\n\",\n    \"    plt.show()\\n\",\n    \"\\n\",\n    \"birdsOriginal = scipy.ndimage.imread(\\\"images/birds.jpg\\\")\\n\",\n    \"\\n\",\n    \"print(\\\"Original image:\\\")\\n\",\n    \"plotImage(birdsOriginal)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Binary image:\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAV0AAADtCAYAAAAcNaZ2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAFABJREFUeJzt3VtsFOX7wPFnSAu0hlJIEdsqNx7wgByCV8rBEBIwHIQE\\nJCaKBE1EI2qoMQIJKAEVjEFAIxc0mniBBi5IQIMhRCkYNVGgAQImoEEDAhU5yKG22Pd/wX/3t93O\\nzM7uzrzvOzPfT/Im3dntzNOdmafPPnNYRyklAAA9epkOAADShKQLABqRdAFAI5IuAGhE0gUAjUi6\\nAKBRhd+TjuNwPhkAlEAp5bhNp9IFQlRfX286BFjO8bs4gkoXKE5mf3Ic1yIHKUKlC0Rs7969pkNA\\nDJB0gZCMGTMm+/O8efPMBQKr0V4AQpK/L9FiSLdI2gsNDQ2ilJLa2tpyZgMkUp8+fUyHAAuF0l64\\ncOFCGLMBEqW9vd10CLBQaD1dbhEJAIWFeiBt8ODBYc4OiL2LFy+aDgGWCTXpnjlzJszZAbHXv39/\\n0yHAMmUl3W3btvWYRpsBALyVlXRnzJgRVhxAYq1cudJ0CLBIJBdHjBgxIorZAiJy89OU1wBsxxVp\\nSBQbE/DSpUtNhwCLlJV0T506FVYcQGCO48g333xT8HU2Jd6M1atXWxkX9KHSRSxNmDBBHMeRXbt2\\n+b5OZ4Lbt2+fbxxKKXn99de1xQNLFeiPKb/R0NCgvIiImjZtmlJKqXvvvdd3PgxGOWP37t2e22Fm\\nW9Q1gjD9fjG0bQuuebXsG94EqSQ+++wzmTt3bsHXAaUqsB1bEYcIN8FJE2P303Uch4QLrS5duiSO\\n40hjY6OISGRnOUyfPr2o+RZqhSAlSmkvPProo4E+RrW2thov8RnpGHPmzMluczo+3pfK9PvE0DdU\\nue2FUaNGyf79+z1f6/H7Rb0eKJXfdpwrrG3ScRzp6urqMf3EiRNy4MABmTVrVuQxwG7Ko70QOOkG\\n3ahd5lHS7wFebNkW8+PInb9fjF9++aVMnTo11FhgH6+kW3JP13Gc7Dh//rzfgktdBNDDJ598YjqE\\nrD/++ENEbt5JrJiEPmXKlKhCQgwETrqO48iNGzeyiTZXXV2d7+/Onz+/tOgAiw0ZMkQcx5EBAwb0\\neK5QEt6zZ09UYcFyoX5HWoF5FTMrwJPbdpbZvmzaBjdu3CjPP/+85/PsE8kWenvBTX19fZizA1zl\\nthhqa2u7Ja/x48f3eL1SykiCW7BggfZlIga8TmtQAa5I8xpuXnrpJeOncDCSP06ePGndaVperl+/\\nbjw2RqTrPZor0rz4fQQEouJ3RoFJXvuZLfEhfFraC7nYmKBb7lkBY8aMsWobtCkWmBVZpSsiMnbs\\nWGlpacmdXzmzA3xltmWbt7P8/e2ff/6RmpoaQ9EgStorXRGRvXv3ytatW6NcBJA1adIkqxOuyM1/\\nCOvXr88+7tevn8FoYEKklW5GHCoQQLfMfnH69OnszXmQHF6VboWOhZNsgZ7YL9KJb44AAI1IugCg\\nEUkXADQi6QKARiRdANCIpAsAGpF0AUAjK5OuUkr69u1rOgwACJ2WK9KK4faFf5xEDiBujNx7oRRu\\n/wRy7u8LALFmXdIV8a5sSb4A4s7KpCvi31JQSslvv/2mMRoACId1Pd18hSpb+r0AbBSbnm6+Qkn1\\n8OHDmiIBgPJZX+mKUO0CiJ/YVroi/kl1yZIlGiMBgPLEIun6mThxoukQACCw2CfdCRMm9PheecA2\\nTU1NopSSpqYm06HAsFj0dEUK93Uzfv31V7nzzjsjjgYIhuMR6RWbnm5+1VpM9frCCy+QcGEVx3G6\\njXxKKZk6daqByGCKdZVuqe0BKgbEgdf2zfabPLGpdEv1xRdfmA4BAApKTNJ94oknOIgGqz377LOm\\nQ4AFrEu6Z8+e7TEt0w/btm2bgYiAcGzatMnzuVKPYyB+rEu6t912W/bn/IMPM2fOlJ07d5oICyjb\\nc889F/i19HiTy7oDaUF4xdzc3FzUhg3o1NnZKRUVFQVfR8JNBq8DaYlKumyssM21a9ekqqoq8OvZ\\nhpPDK+kW/rdrIcdx6HnBaqVsnyTcdLCup1sqNljEHYVEOiQm6QI2yT/g63dVGtIlEUmXDRm2eeyx\\nxzwTLZf9plsiki4AxEUsk+7kyZOzP1PlIm6OHDkijuPI6tWru01nW06HWJ4ytmXLFpk9e7bpMICy\\nZfY/Em7yJOqUMRIukmLTpk1y8uRJ02FAo1hWugBgu8Tf2hEA4oCkCwAakXQ1euSRR6S+vt50GAAM\\niuWBtDjK7Z1zpBpILypdANCIpAsAGpF0NdiwYUO3x35f2wIg2ThPVwO395i+LpBsnKcLABYg6RrC\\nDauBdCLpAoBGJF0NduzY4Tr97NmzmiMBYBoH0jQo8B5rjASALhxIM+jbb781HQIAS1DpauL1PlPp\\nAslEpYvYUkpxtgcSgxveGJafTKh8gWSj0tXgqaeeCvS6Dz/8MOJI4ufgwYOmQwBCRU83ZKV+DKbC\\ndaeUkr///lsGDhwoIrxPiA+vni5JN2SlJF0SiTfaL4grDqQZxsfkcMybN890CEBZqHRD5leZcZFE\\n8bhDG+KKSlcTx3G6jVzXr183FBUAW5B0NaqurvZ87pdfftEYSTwcP37cdfrChQs1RwKEh/aCZrQY\\nisOVfIgr2guWWL58uekQABikrdJVSonjOPLKK6/IunXrwpptLFG9Bcd7hbgyfp5u7nLSvsOQSIJL\\n63t1/Phx+f777+Xpp582HQpKRHvBIrfffrvpEGC5+vp6efDBB02HgQhoS7pff/119ue03zHq1KlT\\nrtM3btyoOZL4ytx5LIl3IFNKSXV1tYwYMcJ0KIiAtqQ7adKkbo+PHTuma9FWcvt4PG3aNAOR2C3I\\ngcektxqQLEZ6ujnzD2v2scW9Bf6H+1awnySJlT3dpH0sLAU7VOn27NljOoTQdXR0mA4BEeNAmgVy\\nE+/HH3+sZZlKKWloaNCyrKiMHz/edAih6927t+kQEDGj7YWc5YS1GASUWR/vv/++vPbaa4ajuYmb\\nBaX3FLkksrK9APOamppMh5DlOI5s27bN9WZBZ8+e9fy9UaNGRR0aEBoq3ZTKXR9vvfWWvPnmm+aC\\nCSjp25DjONLV1eX5HOLF6kp39OjRMnr0aBG5uWONHDnScETJlp+84nI/iDVr1pgOIVJ+/1RmzZql\\nMRJEKv8k87wTzlVYY8OGDSqoAwcOhLZcRs/R0dHh+r6bjivI8GI6rqj/vlmzZhmPjVH0unTNq9oq\\n3aD3QHUchx5dxH7//XfTIZTM62O2X5WYBDU1NaZDQEgi7+n27t1b/v3332DB0LfSxmu9x2UduMUf\\nl9j9JL1vnSZePd2KiBZW9O94HUAA3DiOk/jqFskUSdItRa9eVhzTQ4ykLfEmtbpPG22ZbsWKFQU3\\nkDTtQKa1tra6TldKZb+v7cyZM7J27VqdYRXNcRxZunSpiIg0NjYajqZ8QZPooEGDSLgxFUlPN3+e\\nuRtHfX29nD592m+ZpSwSJQjyT+6uu+6SEydOaIgGIiItLS0yduzYgq9jP7GfV083kko3s0EsXry4\\nx8bx559/+v5ue3t7FCGhBI7jkHAjtGvXrh6nE5FwU8DrXDIV8nm6uaO5udn3PN2olpv2sXXrVtXe\\n3u773rMO9I1SmY6bEXj9uudVrydUhEn3/wNio9K7ARTlySefNB5zkse4ceM83/v58+ery5cvs3/E\\nfHjlVW33XnDjtWw+PoXP7b1ubGyU06dPsx4MyX/fg95VLf+1sJOy8d4LW7ZsMbn41MrcxcvvgKZI\\n4R0f5ckkTre7qnGmT3IZrXRF3Deey5cvS//+/aNeNHJQ7dqHajferKx0RdhwbEdFZU6hfWPXrl2a\\nIkGYjFe6GX79LehBtWuftrY2qaur83yedWMvayvdDDYe87zWwQ8//KA5EmQMGjRIzp8/7/n8/fff\\nrzEahMGaSjdDKSX//fefVFRYc1uI1HHbJvinaFaB/VRjJAjK+ko349ixY3LgwAHTYaTaggULTIeA\\nPCTW5LCu0oU96LPbJ7NOVq1alb3RjwjrxkZelS5JF76uXr0q1dXV8t1338nEiRO5N4YFOjo6pLKy\\nsts0kq59SLooS2VlpXR2dpoOAzn4JGI3r6TL0SoEQsK1j+M4smnTJlFKyS233GI6HAREpQtjNm/e\\nLNXV1fL444+bDgUIHe0FWGXKlCmyY8cOEeFjMZKJpAur5G53169fl+rqaoPRAOGLzXm6SJ+qqiqj\\ny583b57R5SNdqHRhhE1XvWVioc2BMFHpAi64ixp0I+nCVearRXQvE0g6ki5cpeGj9rFjx0yHgBQi\\n6SK1hg4d2u3x4sWLDUWCNOFAGroZPny4tLa2Zh9HVfHacMN0mw7mIXm4DBi+bOmndnV1Sa9efABD\\ncrF1Q0REzp075zpdKSX33XefiIg8/PDDoS3v6NGjrtNNV5pDhgwxunwkH+0FZAWtdsNKjPnLGzZs\\nmBw+fLjH68aOHSv79u0LZZl+y88wnfiRDFwGjKxSWwlhJyPdST7o8km6CAM9XZSl3ERkS6IHTKOn\\ni4LKPcj29ttvl/R7JFwkEUkXWV5JLqnJb/fu3a7TL1y4oDkSpErmck+3ISKKkbzR2NioMubOndvt\\nOS/lLK+2ttZ1nj/++KPn8spdZtARhOn1xYjn8MqrHEhDNwW2h9Dmm5lXVVWVXLt2LZJl+mltbZXh\\nw4cXfF1Sq3xET3H2AoKIKunmzjt/PlEuM+PKlStFf48YCRfl8Eq69HTRTZSJxnEc1/lPmzYtsmVm\\nFJtwm5ubI4oEqefVd1D0dBkias6cOUoppY4ePRppfzPqnuqVK1d6zLe+vt532abfe0a8h2deJeky\\n/IZSSh06dEjbsqJMfi+++KLrPL18/vnnxt9/RnyHV16lpwtPmW1DZ2/zjTfekHfeeafbNB3L99oP\\n6OuiVIqeLor11VdfaU867777rly9elXrMkVEfv75Z+3LRErRXmAwbo6PPvrIs7WR8cwzzxiPkxGP\\nQXsBCODgwYMyYsSIbo9HjRrVrf1AywFBeLUXSLpAnvx9wnEcki6KRk8XCCg/qfbv37/bY79CBSiE\\npAu4cBxH3nvvPRERuXjxouFokCS0F4AA3PYT2gzwQ3sBACxA0gUKGDdunOv0Yu/nAIjQXgAC4Yo1\\nFIv2AoqSc4EMgBCRdAFAI5IufFHtAuEi6YZEKSX19fWmw4gEiVdk4cKFrtPzr6t/6KGHNEeGuOFA\\nWghyvwpm5MiR0traajii8uVvF21tbXLrrbcaisYOhf75cFANubj3QoTcrtWPu7RfDFBsdZ+m9wbB\\ncPYCEBAJF1Ei6UYgqT3QtN/oe+XKla7Tk7q+EQ3aC2VyHEe6urpcp8eZ38UACxculDVr1khVVZXm\\nqPTxupUjF0kgKK/2QoXuQNJi8uTJsnPnTtNhhC436SilpLKyUm7cuGEwomgUm0SVUiReBEKlG4Kk\\nVj8Ftg2Nkdglqesb4eJAGnzt3LnT7TvyXKU9ueTf1DxjzJgxmiNBHFHplsmrp5t5Li6KORg0fPhw\\nOXToUITR2I9qF4Vwnm6EkrAD5v8Nly5dktra2kT8bVFJ+7nM8Ed7wQCllPTp00dERD744AOpq6sz\\nHJG33GThOI7U1tb6vv7SpUtRh2S9q1evmg4BMUSlG5KgH8/Xrl0rixYtijiacFHteuvo6JDKysrs\\nY94TZFDpGrZ8+XJxHCd2CRf+evfu3S3RTp482WA0iAMq3SKVevVR3Csg+pf+6urqpK2tTUR4X3AT\\nla5BSdgJx48fbzoEq/3111/iOE4i1jWiRdLVYPbs2aZDKFtLS4vpEIBEoL1QJLf3a/r06bJ9+/ZU\\nXFDgdU8CAN3RXgjJgAEDuj12HEe2b98uIiInTpzw/L2ZM2dGGpcu/fr1y/68ZcsWg5EA8USlW4Il\\nS5bIqlWrXCu9NFS7Iv/7O5P0NwFh4oo0TU6dOiUNDQ2uz5GggPSgvaBJY2Oj53MTJkzQGAkAG5F0\\nI/Dyyy+7Tt+9e7fmSADYhqQbgQ0bNoQ6v/Pnz3e75eL8+fNDnT8AfUi6EQmzf/vpp592e9zc3Fzw\\nnrcA7ETSjdDy5ct7TLvnnnuKnk9TU5NnEif5xlt1dbXpEKBb/rcF5H1zgGKUN5YtW6bylTqvdevW\\n9ZhXWPNmmBmst+QOz7xK0o1+5CbeCxcuqMGDB5c8r/Xr15N4EzRYb8kdXnmV83Q1yrzX5fZ7r127\\n5vv155wPHB+5+59SSnr1ouOXFIqLI5Kls7NTKioqXJ8j6cZH/v7HuksOr6TLv9WYyv22AiSHXxGE\\nZCDpJkRNTU22SlJKSWdnZ7fzewHYgaSbEJcvX+6WXCsqKmTgwIEiInL33XebCgs+HnjgAdfp/JNM\\nNpJuDGzevFlGjhyZffzTTz/JuXPnAv2u4zhy/PjxqEJDGY4cOWI6BBjAgbQYKLXy4aCM/bzWLesu\\n/jiQBgAWIOkm2OrVq02HACAPSTemMt886/cxdMaMGRojQpg4mJZcJN0YyE2sy5YtC9zvGzp0aFQh\\nISTr1q3L/pxZt4sWLRIRkRUrVpgKCxHiQFoCcDAm3pRS0t7eLn379vV93bBhwzjjIUa8DqS5X0eK\\n2Nu/f7/pEFBAXV2dtLW1iYgUTLj8A00OKt0EcFuH7KT24dS/dOGUsRRpaWkxHQJCQsJNHirdBOBO\\nVfHgtq+1t7fLHXfckW0z5GNdxhc93ZTYuHGj6RAQUJCEqpQi8SYMlW4C5K5DdlC7eSXRAvthlCEh\\nIvR0E+zVV18teKEE7OC1jmpqajRHAlOodAFLcL51slDpApYjuaYDSRewSH7iJREnD0kXsEwm0ZJw\\nk4mkC1iIhJtcJF0A0IikCwAakXQBQCOSLgBoRNIFAI18r0gDAISLShcANCLpAoBGJF0A0IikCwAa\\nkXQBQKP/AwtvTcpUtjvBAAAAAElFTkSuQmCC\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x41d9c50>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"birdsColorMap = birdsOriginal < [100,100,100]\\n\",\n    \"\\n\",\n    \"r,g,b = birdsColorMap.T\\n\",\n    \"\\n\",\n    \"# Hack: Using the green channel, because in this particular image, when inverted, \\n\",\n    \"#       pixels with full green would mean it's a white pixel.\\n\",\n    \"\\n\",\n    \"binaryBirds = g.T\\n\",\n    \"print(\\\"Binary image:\\\")\\n\",\n    \"plotImage(binaryBirds)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAV0AAADtCAYAAAAcNaZ2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAElxJREFUeJzt3X+IFGUcx/HvI5aemXfSoaeXIf2RhGKFEP1hZ4gZkpmS\\nRkGEaNhF2T8FWYSaSGX1R2aQgT/+LRQsLLAOi7P6QzD16iiLpLzwOrvMuyO9k6ub/sjddvdmdmZ3\\nZ57nmWfeL3jgbnZv5nu7M5977plnZpXneQIA0GOM6QIAIEsIXQDQiNAFAI0IXQDQiNAFAI0IXQDQ\\naGy5B5VSzCcDgCp4nqf8ltPTBQCNCF0gRp7nybRp00yXAYsRukBMvvjiCxER6e7uNlwJbEboAjGZ\\nP39+/uvVq1ebKwRWU+XuvcCJNCC60mNJKd/zKMiIxE6kccMcwN+4ceNMlwAL1RS606dPFxGCF/Az\\nNDRkugRYKLYxXYIXAMLFeiJt6tSpca4OSL2+vj7TJcAysYZuT09PnKsDUq++vt50CbBM7FPGGGYA\\ngGDM0wUStnXrVtMlwCKJhO4tt9ySxGoBERH58ccfxfM83wbYrqaLI6ZPny5nz54dtfzWW2+Vjo6O\\n2qsDfEQNV90XJ4QcSxorgQ0SuTjCL3CBpCml5PPPPw99Hj1f2IgxXaTSwoULRSklbW1tZZ+nM3i/\\n/PLLsnUwBAKRGkO3ubnZd/lDDz1Uy2qByBYvXiyfffaZ6TJEROTOO+80XQJSoOYb3kT5y814FpIW\\ntB/aNK4rwrGQJcY+OYKdDLr19/eLUkrq6upGzW5Yt25dbNtZtmxZRbMnwoZCkBFBU2+u7ECeX7vr\\nrru8KG6//Xbfn6fR4m5TpkzxPM/zOjo6QvfLOLZXLdOvE01f8wJyNfLwwuTJk+XPP/8MfG7Az1f0\\nfKBa5fbjQnHtk0opGRkZGbX89OnTcuLECVm5cmXiNcBuXsDwQuTQjbpT+6yjqp8DgtiyL5bWUbj+\\ncjV+/PHHsnTp0lhrgX2CQrfqMV2lVL6dP3++3Iar3QQwyt69e02XkJcL2b6+vooC/d57702qJKRA\\n5NBVSsnff/+dD9pCjY2NZX92zZo11VUHWE4pJZMnT/ZdXk57e3tSJcFysX5GWsi6KlkVEMhvP8vt\\nXzbtgzt37pTHH3888HGOCbfFPrzgZ9q0aXGuDvBVOMTQ0NBQFF4LFiwY9XzP84wEXGtrq/ZtIgWC\\npjV4ZaaMhTU/Tz31lPEpHDT325kzZ6ybphVkcHDQeG20RN/32qaMVarcv4BAUsrNKDAp6DizpT7E\\nT8vwQiF2Jpg0f/58q/ZBm2qBWYleBtzS0pLk6oFRcrNrvvrqK9OljKKUkjfffLNo2cDAgKFqYEpi\\nwws5+/bty1+dw197QGTGjBnS1dWV/57jwk3ahxdyVq1aJc8++yw7FnDFr7/+mj8eent7DVcD3RLv\\n6QJAFhnr6QIA/kfoAoBGhC4AaEToAoBGhC4AaEToAoBGhC4AaEToAoBGY00XEKTwog2uZgPgCit7\\nupMmTSr6vuD+vgCQatZeBmzTx64AQKVSdxlwuWD1PE9+/vlnjdUAQDys7enmhA0r0OsFYKPU9XRz\\nwkK1s7NTUyUAUDvre7oi9HYBpE9qe7oi5UP1hRde0FgJANQmFaFbzqJFi0yXAACRpWJ4QSR8iCGH\\noQYANggaXrD2ijTARaWdBzoJ2WPd8MK6devyV6AVtiieeOKJhKsD4uV5nixdutR0GdDIuuGFai/3\\npceANAjav9l/3ZPq2QtRvP/++6ZLAIBQzoTugw8+KPv37zddBhBo7dq1pkuABawbXujp6ZGpU6eW\\n1iEiIgcOHJDly5eX/Xn+TYOtmIGTLakZXmhqasp/rZQq2gFXrFghhw4dMlEWULPHHnss0vNKOx1w\\ni3U93SiCat69e3fkHRvQbXh4WMaODZ+lSU/XDUE9XadCl50Vtrl06ZLU1dVFfj77sDucujhCKcUn\\nScBq1eyfBG42WDemWy12WKQdHYlscCZ0AZuUnvDNnRSmcwAnQpcdGbZZsmRJYNBy2W+2ORG6QJqc\\nPHnSdAkwKPWhSy8XaXP27FlRSsm2bduKlrMvZ0Mqp4wBrsgdfwSue5yaMga4QiklL774oukyoBE9\\nXQBIQGruvQAALiN0AUAjQhcANCJ0NZozZ47pEgAYxuwFTQpPWDI9CMgueroAoBGhq8GOHTuKvt+1\\na5ehSgCYxjxdDfxeY4YYALcxTxcALEDoGsINq4FsInQBQCNCV4OPPvrId/m5c+c0VwLANEJXg19+\\n+cV3+ZQpU/QWAsA4QhcANGLKmCZBrzNTxwA3MWUMACzAvRcM454MQLbQ09XgkUceMV0CAEvQ041Z\\ntRc90MsFsoGergUI3HCe53EVH5xA6Gpy8uRJ0yWkUmnYrl692lwxQAyYMhaz0tezsBcb8lonVlOa\\ncYc2pBVTxjRRShW1QoODg4aqAmALQlejCRMmBD72ww8/aKwkHX766Sff5evXr9dcCRAfhhc0Y4ih\\nMlzJh7RieMESmzZtMl0CAIPo6RpA7y06XiuklfGebm7qT2trq65NAoB1tA8vvPPOO7o3aZ3rr7/e\\ndAmw3KFDh0yXgIRoC91PPvkk/3XWryw6e/as7/KdO3dqriS9cv85ubgv9fT0yD333OPk7waNoTtj\\nxoyi70+dOqVr01byG5O87777DFRityyeeGxqajJdAhKk7UQaVxb5K3cFW9aMHz++4gtIXH29uOVn\\n+hk/keaHf584oApVGrjt7e0JVWLO5cuXOS4cZ7Sne2UbcW0i1TzPy/xrUU3YuPaa8R+hO6zs6YrQ\\n283RfWDlTkK98cYbWrdbiaB7WBTKwv6Thd8xS4yHLsx65plnTJeQp5SSAwcO+AbtuXPnAn/utttu\\nS7o0IDbGhxeubCeuzSCiwvfjpZdeks2bN5srJiLX9yGllIyMjAQ+hnSxdnhBRGTevHkyb94802Vk\\nRml4pWVa1muvvWa6hESV+6OycuVKjZUgSdpC9+233w587NixY3Ls2DHxPC/wwgHEZ3h4eNSyNIwb\\nPvfcc6ZLAGqmLXSj3gO1ubk54UrQ1dVluoSqBf2bnYY/GrWYNGmS6RIQk8THdK+++mq5fPlytGIY\\nt9Im7VP4XJ1a5fq4dZYEjekm8hHs1fQ6gk4gAH6UUvm5za73cuGWREK3GmPGWHFODymStZ4flwa7\\nQVvSbdmyJXRHoceiT0dHh+9yz/NS93ltYRdQpEnU36OxsTHhSpCYwlvklTYR8apppQofmzZt2qjH\\ng55LS7aF2bVrl/Eas9aOHDkS+r5wnKSjBeZqEqF7ZYPehg0bAh8LMjQ0ZPzFykrjwDbb2traIgUs\\n70s6m/bQLdd2797NTmWg7d+/3xsaGuLAtqRVy3TdtMjvrz2he6Ugdiq9O0BFHn74YeM1u96CrFmz\\nxhsYGOD4SHkLylWjnwYctG1XTorYxO+1bm5ulu7ubt4HQ0pf98LXu9xxWfpc2Mmz8d4L+/btM7n5\\nzMqd7e/u7i77vLADH7VRSsnmzZt9Z18w08ddRnu6IiIHDhyQ5cuXFy0bGBiQ+vr6pDeNAvR27UNv\\nN92s7OmKiKxYscJ0CSiDHpU5YaHa1tamqRLEyXjoiozeubi5h370muy0devWwMcWLVqksRLExfjw\\nQqHCWggBM/z2h6NHj8odd9xhoBqIiPzxxx9y3XXX+T42e/Zs+e677zRXhCiChhesCl2R/w76f/75\\nR8aOtea2EJnjt0/wR9CskONUYyWIytox3VJKKQLXsNbWVtMloATB6g7rQhfmvfvuu6MOck6omVf4\\nnjz//PP5r3lv0sW64QXY5eLFizJhwgRpa2uTxYsXmy4HBTgHYrfUjOkCiIbQtVtQ6DJ4CqQUQZtO\\njOkCgEaELozJ3XUJyBJCF0YUhu2lS5cMVgLoxYk0GFHutoaAC1JzcQSyiWEGZAWhi0zLjSu3tLSY\\nLgUZwfACjLDl/r3MdUVSGF4ASpw6dcp0CcggQheZNWvWrKLvC+9nACSF4QUUmTt3rnR0dOS/T+pf\\nbhuGF7iFJZLEZcAIZcMMgpGRERkzhn/A4C72boiIyN69e32Xe54nN998c+zb+/77732Xm+5p3nDD\\nDUa3D/cxvIC8sJ7u8ePHZd68eYltb86cOdLZ2Vm0LMkQtmGIA+7i1o7Iq3YYIe4wilqHy+PKcBdj\\nuqhJrUFkS9ADpjGmi1C1nmB7+eWXq/o5AhcuInSRFxRyrobf4cOHfZdfuHBBcyXIlNy1535NRDya\\nmy3n0Ucf9V1eqpZtNTQ0+K7z6NGjgdurdZuVvg4ma6C52YJylRNpKBKyP8S23ty66urqyt5PN6le\\ndkdHh8ydOzf0ea728pG8oBNpDC9Ai8LwKvx6cHBQy/Y//fTTot4GgQtTCF0USTJolFK+6584cWJi\\n28y5++67K3r+7t27E6oEWUfoYpRcOCqlZObMmSKS7B25Ll68GPhYueGOWrcxffr0wD8ya9eujWW7\\nQClCF2WdOXNGlFKJXApcKOl/5SdOnChPPvlk0fZ+++23sj/z3nvvJVoTsokTabDKhg0b5JVXXila\\npmNsNeg4YFwX1eJEGlLh1VdflS1btuS/37Nnj5btEq7QhZ4ucMX9998vH3zwQdGywjD2PI9wRmT0\\ndIEQH374YdEN3EVETpw4ISL/Dz/EdWIP2UVPFyjR2dkps2fPzn+vlOIDLFExerpARHPmzJGlS5cG\\nPk5vF7WgpwuEaGlpkfb29qJl9HYRJqinS+gCEfgdJwQvymF4AQAsQOgCIVpaWnyXX3PNNZorgQsY\\nXgAi4Io1VIrhBVTs9ddfN10C4Bx6uvCV2y/oyf2Hni4qRU8XVWFOKhAvQjcmLoeTy79bVOvXr/dd\\nnvskihtvvFFzRUgrhhdi8Ndff+XPZM+cOVPOnDljuKLale4Xvb29MmXKFEPV2CHsjw9DDSjExREJ\\nCvrQxTTL+sUAlfbus/TaIBrGdIGICFwkidBNgKtjoF9//bXpEozaunWr73JX328kg+GFGimlZGRk\\nxHd5mpWbIrV+/XrZsWOH5or0CrqVI1PHEBVjugkJCt0lS5bIoUOHDFQUjyi9tywGTcjxorES2I7Q\\nTZCrvR8Cxp+r7zfixYk0hMrNOc21IFkPl/r6et/l8+fP11wJ0oiebgxc6PlUcjJo7ty58u233yZY\\njf1ceM+RLIYXEuTCAVj6O/T390tDQ4MTv1tSsj6XGeUxvGCA53kybtw402VEUhgWSilpaGgo+/z+\\n/v6kS7JeV1eX6RKQQvR0Y+Ly2X56u+XxScHwQ0/XsE2bNpkuAQkhaFEJeroVqvbqo7QfmIxfhmtq\\napKenh7TZcAS9HQNciGcFixYYLoE6xG4iILQ1WDVqlWmS6jZkSNHTJcAOIHhhQr5vV7Lli2TgwcP\\nZuKCAk4aAdEwvBCTyZMnF32vlJKDBw+KiMjp06cDf27FihWJ1qULQQvUhp5uFerr66Wvr883gLLQ\\n2xX57/d06fcB4kZPN0b9/f2BgdPd3a25GjMIXKA6hG7MmpubAx9buHChxkoA2IjQTcDTTz/tu/zw\\n4cOaKwFgG8Z0ExL3pbOF61u7dq3s2bOnqvUA0IO7jBkQ51Vc3P8ASBdOpBngd7+Fm266qap1BYVr\\n2A3HAVim9NMCSj45wKPV1jZu3OiVqnZd27dvH7WuuNZNM9MeeOAB3jdHW2CuErrJt8LgvXDhQk3r\\neuuttwhehxrvm7stKFcZ09XIi+mCgkuXLkldXV3g44zzpkfh8ed5nowZw4ifKzxOpLlleHhYxo4d\\n6/sYoZsepccf7507gkKXP6spddVVV5kuAQko1wmCGwhdR0yaNCnfS/I8T4aHh+X8+fPyzTffGK4M\\nQCGGF1Isaq+If1ntFfQe8p6lH8MLDjl27Jj8/vvvkZ7LwQvYxf9MDKxS7TgfgQvYh54uAGhE6Dps\\n27ZtpksAUILQTSmlVL4FWb58ucaKEKf6+nrTJSAhhG4KFAbrxo0bI4/Vzpo1K6mSEJPt27fnv869\\nt0op6evrky1bthisDElhypgDmHaUbp7nydDQkIwfPz7wObyX6cOUsYw5fvy46RIQorGxMf8Hs1zg\\nwi30dB3g9x7SM7IPU/+yhZ5uhhw5csR0CYgJgeseeroO4E5V6eB3rA0NDcmMGTOkt7fX92d4L9Mr\\nqKfLFWmO2blzp+kSEFGUQI3rHsywBz1dB/T19eXndXKA2i0oREOOwyRLQkK4iTlgsWuvvVYGBgZ8\\nHyN004nQBSzHfGu3MHsBsBzhmg2ELmCR0uAliN1D6AKWyQUtgesmQhewEIHrLkIXADQidAFAI0IX\\nADQidAFAI0IXADQqe0UaACBe9HQBQCNCFwA0InQBQCNCFwA0InQBQKN/Ae70yzlkyn1PAAAAAElF\\nTkSuQmCC\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x80e06d8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# I've chosen a disk-type structuring element so as to avoid birds' wings reaching out and touching others on dilation\\n\",\n    \"struct = [[0, 0, 1, 1, 1, 0, 0],\\n\",\n    \"          [0, 1, 1, 1, 1, 1, 0],\\n\",\n    \"          [1, 1, 1, 1, 1, 1, 1],\\n\",\n    \"          [1, 1, 1, 1, 1, 1, 1],\\n\",\n    \"          [1, 1, 1, 1, 1, 1, 1],\\n\",\n    \"          [0, 1, 1, 1, 1, 1, 0],\\n\",\n    \"          [0, 0, 1, 1, 1, 0, 0]]\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"birdsImage = binaryBirds\\n\",\n    \"\\n\",\n    \"# Two erosions and two dilations to get rid of noise, and isolate bird structures.\\n\",\n    \"birdsImage = scipy.ndimage.binary_erosion(birdsImage, struct, iterations=2).astype(birdsImage.dtype)\\n\",\n    \"birdsImage = scipy.ndimage.binary_dilation(birdsImage, struct, iterations=2).astype(birdsImage.dtype)\\n\",\n    \"\\n\",\n    \"plotImage(birdsImage)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"18 birds have been detected.\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAV0AAADtCAYAAAAcNaZ2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAFPhJREFUeJzt3XuYVPV9x/HvzOwFZndhuSws4gawKKIGZEGlgIBRIxIR\\ng03WKl7w8lBbqGnykP7RqJXkn9QmNtU0taXVGGIhsTwBH1G8VEAhUWER5SqEBZeF5bKwXPY+l/5B\\ndtjZPWd2Luf8fufyfj0PDzPnzMz5PA/shx+/c35nAvF4XAAAagR1BwAAP6F0AUAhShcAFKJ0AUAh\\nShcAFKJ0AUChvFQ7A4EA15MBQBbi8XjAaHvK0hURebW61vo0AOBh91ZWmO5jegGw0KottdLaEdUd\\nAw5G6QIW2bDnuIiIrN1+RHMSOBmlC1ik4Xxb4vGhhiaNSeBklC5gg601p3RHgEPlXLq/eP8PVuQA\\nPCfGzaRgIKfSbWprFxGKFzDyu62HdUeAA1k2vUDxAkDvLJ3TbWnvsPLjANd7fVud7ghwGEtL9+VN\\nW638OMD1OqIx3RHgMJZfvcA0AwCY45IxwGY7687ojgAH6fXeC9loON8sg4rDdnw0IGejb0tMzhvu\\nKw3NU5wGyIwtpQvYyaxwRUQao6sSj51SwHuPnpWrh/fXHQMOkdP0wiubq63KAaStNDRP8gJlvb6u\\nawEDTsFIF65UHLxRRETOxz6USPy46esao6uUjXgHFRcm3X+hq1VbLt4idd4k89v+wftyGuk+MKXS\\ncPv+4ydz+VggbcXBaWmNelWYceUQ3RHgAjmNdIsKCwy3Vx86ItWHLt7e7vGbJudyGCCl4uCNplMJ\\nTpnX7cQoF7ZPL1C4UC0g+dI/NEdEoj3KOBycIAWBUZYc52hji/x+f/r/qxvSr48lx4W7ZVW6RxrP\\nyuptu3p93d0Tr8nm44GM9Q99Q85E35BQoL9E42dMR77NsW1SEMq9dLvO0abr+NnWnI8L90u7dNsi\\nEfnvD7Zk9OFD+hVnHAjIxpnoGyIiEo2nXohg1XTDvEkVhsVbVJgnpeECqTvdbPi+VVtqmWLwubRL\\nN9PCFbmwJJjpBVgt20vB7J7f7Vqmq7YYl66IyOZ9J2XK5YNtzQLnyvrqhcdvmpz41SffvLu5FwOs\\n1Bxzzk2VOks2PxTMaPRaf6bFrkhwgbRL9/GbJkswEEgUbVcLpk1K+d49R82vowTcbN6kCpkzYbjh\\n9lQ27uVnwq8yGukunHmD6b5U0wjv7zmQyWEAU+HgRMPtpaF5jrs8bFSZ+TmNk+eMF1HA+yy9y9iD\\nU41/IAArFQRGJB73D81JKtvi4HTD9+go5AkjBig/JpzP0tINF+Sbjnh31NVbeSj4WDg4MTGyDUh+\\n0r7mWM8TvjpHwKmmGVZX8x1qfmTL/XSNiveDLw7acSggSUySrxpwwpSDWfFGY3xbsB/ZdhNzLhWD\\nTsXBGY4o3E5cm4tOtn5zxF0Trrbz44EeOqcd8gKDdEfpYd6kChk9tCRp25ptTDH4ja2lO6y0RC4r\\nG2jnIQBXGVdRKrePuyTxPBJlisFvbP+OtNuuuUKmjB7BdAPwJ30LQonphsI8vqbQb5TcxHx8xTAV\\nhwFchXlef+KfWQBQiNIFAIUoXQBQiNIFAIUoXQBQiNIFAIUoXQBQiNIFAIWULI7Ixu7mpxOPx4af\\n0ZgEAKzjyJFuLJ58V/3dzU8nlTAAuJUjSzcYKDTcTvkCcDtHlq5I6imF3c1Py/6W5xSmAQBrOLZ0\\nRVIXb0e8kVEvANdxdOmK9H4S7UDrzxUlAYDcOb50e9MWO647AgCkzRWlm2q0OyT/FoVJACA3rijd\\nVJpif9QdAQDS5tjFEelqitawkAKAa7i+dAE3eXH73KTnC8ev1pQEujiudBsjW+Ro++tZvbe84A6L\\n0wD2enH7XJk16gcyot91uqNAEcfN6WZbuGPDz8iAPP7iwn3eqvmR7ghQyHGlm626tt/qjgAAvfJM\\n6Z6N7pDDbSt1xwBM7Tn1ru4IcADHzenmBYolEj+ftK3zioTDbf8j56J7TN97LrrL1mxALjbUPm+6\\nr+sJNk6ueZvjRrqX912SeDw2/EzSJWCXFv6lFIdG64gF5GxGxeK0XtcSabQ5CXRyXOmK9CzbrioK\\n7zd9X2lepV2RgJx9cPjf0npd37xSm5NAJ8dNL+RiWMHc3l8EKPRfn39LIrH2tF/P1IL3ubJ0x4af\\n4baOcLTuiyDSQeH6gyOnF7LB8l+4XTZFDfdx5UgXcLqKkkqpPVedeN51FEu5+psnSpdRLpxm9mXm\\n01+3j3pS3qz5ocI0cBLPTC8AbjGo7yjdEaCR60uXUS7cpih/kCwcv1quHTIvaTsn0vzBtdMLlC3c\\n7oZhD8qnx1eJCIXrJ64tXcALFo5fLdXHfqM7BhRy/fQC4HaVQ7+tOwIUonQBQCFKFwAUonQBQCFK\\nV6FQS4PuCAA04+oFRQZW/yzx+FTlExqTANCJkS4AKETpKhCuXZ/0vOgQ35UF+BWlq0CfE9uTnhc2\\n7NSUBIBulC4AKETpatL1xBoA/6B0AUAhSleBjv7G908t/ew/FScBoBulq0C0oJ/h9mCkWXESALpR\\nugCgEKWrQHPFTN0RADgEpQsACnHvBc24JwPgL4x0FSg4tUd3BAAOwUjXYtkuemCUC/gDI10HoHB7\\nd+fKF+TOlS/ojgHkjJGuItG+ZRJqOaE7hut0L9qKmj1SO+pKTWmA3DHStdmpyifkVOUTcmbsvaav\\n4T4M6ZvwMbfFhLsx0rVYqqmCeDBPArGIwjQAnIaRrkKnr/0b0339d/5SYRJ3uPmNXxluH7XvM8VJ\\nAOtQug4RamvUHcFx3vvG/Ybbv1q9UXESwDqUrmItwybrjgBAI0pXsZZhN+iOAEAjZaU7c/4smTl/\\nllzy3huqDgkAjqN8pHvFS8+rPqTjNH71Ed0R4HDXvfuc7giwibLSPTVuUuLxzPmzVB3WkWL5xYbb\\ni778P8VJ3KtzhZoXV6nd/JvvStmRnTL7lUd1R4ENlJVuYUPyaqzrl/j7L5TR9bz5Zw5oSOJse6/x\\n3xz4e9/+qe4IsJGyxRFFdYeSnoePHlZ1aMc6VflE0mq0YEeTxjT6BaNRueO1X2T0njVVi2xK4wyz\\nX3lU1j6wTHcMWEjr1Qt+n2YQ4WY3XWVauA1lw21Kos+s5QuZVvA4LhlzgM7ipYAzM+hEne4IlgvG\\norojwGbaS5fR7gWqC7eq/impqn9Krj33ltLjZmJN1aLELzNePJHWHSNfb+GGNz43pmmzfFrijH/4\\n1lQtkus2rZVPps7usa+tT1gKW42/sr7/6RNyZkCZ3fEAS2gf6UK/a86/rztCglHhioism/uw6Xtm\\nvL3SrjiKxXUHgAKOKN2Smn1SUrNPdwzfqKp/Kun51Q4q3VT2X1mpO4LNAqZ7yg9tVZgDdlJWunW3\\n3mm6b+KTi2Xik4tl5vxZMmXxfaoi+VbM4I+9exE70a7xU3RHAHKmrHT3PfjXab1u8/O/tjkJmkOl\\nuiNkzeykmtdPqOV1tOiOAIvYXrrBSCRxs5verF/u3DPpXvJG2XcMt7thtCvi/QURRsZtfll3BFjE\\nlqsXsroMLGA+nwV0t6Zqkdy58oXE74BbOOeSsThnbpEZv414u16vy9Jg91I2p3vwm/f1On3AQgl1\\nGvPKDbdX1T8ls0+669uJe1tA4SbplmlB23mbk8AuSkp3/fK35ODdF77vavMLr6o4JHqxbrD5ic2S\\nSINU1T8l1535ncJEEBGZvO6f0npde6Hx7UHhfLZML6xf/pbMnD9LDlQtkC/nVCXtay8dmPK90x+a\\nIxtfft2OWMjQJ/3v0h3B065/5ycy+OjujN/H1IK72Tanm2oqoX7G16V8w9uG+4KRDrsi+d7UxhUy\\nrO0LCcUjvb52ZflSBYn8LZvChftpWZG257Hv6jisr1XVPyWXtu5Kq3BFRL7S+rnNiWDmsykPSSS/\\nj+4YsIm2ZcBck6vfmiFLTEe0f974W8VpsPaBZbL2gWVyePQ0yetoNX0ddx1zN633Xjhxw406D+9b\\nK8uXysrypdISLEn5OrcslnCrtQ8sk33j5ybKtvu+VChe99JaujsX/4OcnNRzPf2Nj83TkMbbOovW\\naGTL/K0++8bP0R0Bimm/y9iO7zCacjJGu/r0Ntq9/p2fKEoCK2kvXZGe87uhFuObVcM+jHadaf+4\\nO0z3cfWDOzmidEU4seYEZsV7S8N/KE6CTl9ce1fKhRDFjUcUpoEVHFO6IheLNx50VCxfMSreQR2H\\nNSRBp3er/sV03/Q1TP+4jePabf3yt2TDK2t1x/C1Lf04ueM0rELzDseVLvT7Y/i6HiNeTqjp17V4\\n91benXjM5WPu4pxbO8JxVpYvlb849kMJxTukvvDPdMeBJBfvmOr/1ZgE2aJ0kdJrQ5/UHQHwFEoX\\ncCnmed2JOV0AUIjShTb3bJwq92ycqjsGoBSlCy26lu23PvyaxiSAWpQutAvF2nRHAJShdOEITDPA\\nL7h6Ab5228YLCws+Hv99Od3/Cs1p4AeMdOEYOke7129P71t4gVxRuvCtaZ/8QHcE+BClC98qaqlP\\nen5ZLTdagv0oXSQpbO+QMQfrEr/85PKaVbojwAcoXSSMOVgnI48c15rhno3TtB4fsBulCxERKT95\\n2nD7mIN1UtARsfx4Z8MjTfbELT9WJvq0ndJ6fHgfpQsREakfPMB036i6YzLmYJ2MsHAUvHbSr3ts\\ne3PSchG5uDxYx9UMMz76vvJjwl+4TteHsp2rPXTJEIuTJLt9y/we2+7ZOFVWTN9k63EBlShdpGXv\\nyOE5vT/bUSuFC69hegG2G1fz71m9j8KFF1G6SMh1NOs2DaVjDbffvPlvFSeBn1C6PtS1XI8OHiB7\\nRw63tXD3VNxnuL2h5CrbjpmOLeO+Z7g9L9Ist218NHFfBsBKzOn6VKYlO+ZgXdbF3J5X0mNb59RB\\nKNZmej9dO0+iTdn6j1LSdNiWzwZSoXShxIrpmxIn07oWaTRYqOT4kz7/qQw6vSuj96ybzneQwXpM\\nLyCJndMMK6ZvMhy5vjb1XduO2SnTwq0rZ2Uc7EHpoofOOd69I4fLgUvLRUSkPd++/xRFQn1N91m1\\nQCIa6jmiXj/5n01Hs8PrP7TkuEB3lC5S6sgLyd6Rw6Vm+FBbj2P35WHvTv257Bp98YTeuunLpK2g\\nNOV7xu9+0dZM8CdKF46xYvom2T7qr2z7/NpLbpJ105f1GN2ajXbLT3xiWxb4F6ULR9ldcb/sGPFw\\n4vmB8juUHJeTZlCFqxfgODtGPCI7Rjyi/Ljbrl4kE3a+YLr/xEvbpGzBBIWJ4EWMdIE/OT7oWjlX\\nVJG0bUr1MyJyoXC7/g5ki9IFutg88Wk5H74k8bzkfK3GNPAiShfoZtOkpVJ9jfn9FxjtIhfM6QIG\\nTgwclzi51nHsvOY08BJGukAv8ocW99jGaBfZonQBQCFKF+iF2fRCPBJTnAReQOkCvTCaXhAROfmr\\n7YqTwAsoXZg6/eEe3REAz6F0Yejg82vlzLYDumMAnkPpIqWDz6/VHQHwFErXIlP6eLecKF6R4smX\\nGm4/8dI2OfHSNomea1ecCG5F6Vpgcp91InKheAsDLZrT2KN2mf3f7uBkfceWpdx/6rWdipLA7ViR\\nZoGgRBOPJxa+L5tbZ2tMY49oi79GcpkufuDuY0gXI12gGwoXdqJ0beDV+d0jK/z9vWHh8eWG21kS\\njExQukhb+4mzIiJy9rNDmpPYq/vItWzBBClbMEGKKodpSgQvYU7XJqXBE9IYS33yxY06r2Q4tWGn\\njFzsvbnrTplOGfCtEkgXI12bXFXg7i817K1QvVy4qVCsyBUjXSSkez2uXwu30+D54+Tk8s96bO84\\n1iT5Q4s0JIKbMNKFiGS2AKK94ZyNSZwvkB8y3N649gvFSeBGlC4MBQvyTEe0R179QHEa52GaAdmi\\ndG00pc9aCYo77rnatWBHLp4tX1n49ZSv//LFt+2O5HjBogLdEeBCgXg8br4zEIi/Ws23oaYjnWtz\\n3bpSzWzqwe9zu526XqfLCBgiIvdWVkg8Hg8Y7WOkq0ht5ArdEWATihaZ4OqFDGW72qw2MtriJOqM\\nXDybO431omzBBIm1dOiOARdgpKuAW6cVuiq/e7LuCI4X7JuvOwJcgNJVYFDoqO4IOetzyUDdEQBP\\noHQtsLt9UsrR7Jh8b9wQhRNnQO4o3Qx93HZr0vPNrbPldGyIiIi0xsOm7xsYOmZrLlUoXiA3lG6G\\nIvF8+aj1wjWs3Ue31W0zTd93Zf5WO2MpRfEC2aN0sxCVPNPphPZ4H8Vp9KB4gexQuhbb0vY10339\\ngw0KkwBwIkrXBjUdVxluv7rgI8VJADgNiyNscDQ6Ukbl77L0M6ec/nHi8f7w7XK8cJylnw9ADUa6\\nNrFzQcTo5jdlyukfJxUxAHegdG1UG7m8x7a+gaasPmvzgL833E75Au5C6dqoNnJ5j+KdULgh6887\\nWjjRdB/l6055X3wgRc/e2vsL4RmUrs0uFO/FO4xFJPv1+TXhW1IWr4hQvC5TuHqpiAjF6yOUrgK1\\nkdGJOd6PW3P74aoJ3yKxAOc/vajo2dQ3joc3ULoKWXVy7Q+l35M4f3QeZP6FAvAOfnJd6vcDluiO\\nABswzeB9/D/VIz4q/TuJBgoSJ9TiEpRooEDagyXyab+HdccD8CeUrkfc0Phc0vOAxCQv3ip50VZN\\niZCtomdvlaYl7+iOAZtQui407uwvpTB2Nq3Xml3fC0APStcFsr0MjMIFnIcTaQCgEKXrYSNa1uuO\\nAKAbphdcquvUgdn0w8COfXKo70xFiWClQFuTxAuLdMeADRjpukDXgv2y741pz9Vu6/eYXZFgkY6J\\n30w8bp/2kDQteUealrwj4X+9Swo+fFlfMNgmEI+br4IJBALxV6trFcZBNsxGupxIc4eiZ28VCRWI\\nRNtNX8MlZO5yb2WFxOPxgNE+Rroe1RQaqjsCehFoOXtxBVqKwoW3MKfrUdv7PaQ7ArrJdokvo1xv\\nYaTrQWfzKnRHgEUoXO+hdD1oR8m9uiMgXXkF0rzoNd0poBDTCx5TXzhBdwSkKZ1RLPdh8B5Guh4Q\\nDRQmHh8IcyNsp+osz87LwuBPXDIGOECgvVnCP5truI+Cdh8uGQMcLl4Q1h0BilC6gEMwovUHShdw\\nkO7FSxF7D6ULOEzXE27wHkoXcCAK17soXQBQiNIFAIUoXQBQiNIFAIV6XZGmMAsAeIbZirSUpQsA\\nsBbTCwCgEKULAApRugCgEKULAApRugCg0P8DsKVY1HBd/6gAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x763f940>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"labeled_array, num_features = scipy.ndimage.label(birdsImage)\\n\",\n    \"\\n\",\n    \"print(\\\"%d birds have been detected.\\\" % num_features)\\n\",\n    \"\\n\",\n    \"# Plotting with a colorful color-map so as to demonstrate the contiguous areas detected\\n\",\n    \"plotImage(labeled_array, 'Paired')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.4.3\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 0\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/MoveEye.pyde",
    "content": "\"\"\"\n * Move Eye. \n * by Simon Greenwold.\n * \n * The camera lifts up (controlled by mouseY) while looking at the same point.\n \"\"\"\n\n\ndef setup():\n    size(640, 360, P3D)\n    fill(204)\n\n\ndef draw():\n    lights()\n    background(0)\n\n    # Change height of the camera with mouseY\n    camera(30.0, mouseY, 220.0,  # eyeX, eyeY, eyeZ\n           0.0, 0.0, 0.0,        # centerX, centerY, centerZ\n           0.0, 1.0, 0.0)        # upX, upY, upZ\n\n    noStroke()\n    box(90)\n    stroke(255)\n    line(-100, 0, 0, 100, 0, 0)\n    line(0, -100, 0, 0, 100, 0)\n    line(0, 0, -100, 0, 0, 100)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/action.cgi",
    "content": "#!/usr/bin/python\n\nfrom model import Feed\nimport session\nimport datetime\nimport sys\n\nargv = session.argv()\n\nfeed = Feed.get(guid=argv[1])\naction = argv[2]\n\nif action == 'done':\n    when = feed.notify_interval * feed.notify_unit\nelif action == 'snooze':\n    if len(argv) > 3:\n        when = int(argv[3])\n    else:\n        when = 3600\nelse:\n    print '''Status: 400 Bad request\nContent-type: text/html\n\nUnknown action %s''' % action\n    sys.exit(1)\n\nfeed.notify_next = datetime.datetime.utcnow() + datetime.timedelta(seconds=when)\nfeed.save()\n\nresponse = '''Content-type: text/html\n\n<html><head><title>Alarm reset</title>\n<link rel=\"stylesheet\" href=\"{base_url}/style.css\">\n</head>\n<body>\n\n<div class=\"container\">\n<h1>Alarm reset</h1>\n<div>\n<p id=\"reset\">Alarm \"<span class=\"name\">{name}</span>\" has been reset. You won't be notified for another <span class=\"duration\">{duration}</span>.</p>\n\n<p>Actions:</p>\n<ul>\n<li><a href=\"{edit_url}?feed={guid}\">Edit this reminder</a></li>\n<li><a href=\"{edit_url}\">Create another reminder</a></li>\n<li><a href=\"{base_url}\">Visit the Reminder Me site</a></li>\n</ul>\n</div>\n</div>\n\n<p class=\"back\"><a href=\".\">Reminder Me</a></p>\n\n</body></html>'''\n\nwhen_left = when\nduration_list = []\nfor (label,period) in [('month',86400*365/12),\n                       ('week',86400*7),\n                       ('day',86400),\n                       ('hour',3600),\n                       ('minute',60),\n                       ('second',1)]:\n    if when == period:\n        duration_list = [label]\n        break\n    \n    val = when_left/period\n    if val:\n        duration_list.append(\"%d %s%s\" % (\n            val,\n            label,\n            val > 1 and 's' or ''))\n        when_left -= val*period\n\nbasedir=session.request_script_dir()\n\nprint response.format(guid=feed.guid,\n                      name=feed.name,\n                      edit_url=\"%s/edit.cgi\" % basedir,\n                      base_url=basedir,\n                      duration=', '.join(duration_list))\n                      \n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/argparse.pyi",
    "content": "# Stubs for argparse (Python 3.4)\n\nfrom typing import (\n    Any, Callable, Iterable, List, IO, Optional, Sequence, Tuple, Type, Union,\n    TypeVar, overload\n)\nimport sys\n\n_T = TypeVar('_T')\n\nif sys.version_info >= (3,):\n    _Text = str\nelse:\n    _Text = Union[str, unicode]\n\nONE_OR_MORE = ...  # type: str\nOPTIONAL = ...  # type: str\nPARSER = ...  # type: str\nREMAINDER = ...  # type: str\nSUPPRESS = ...  # type: str\nZERO_OR_MORE = ...  # type: str\n\nclass ArgumentError(Exception): ...\n\nclass ArgumentParser:\n    if sys.version_info >= (3, 5):\n        def __init__(self,\n                     prog: Optional[str] = ...,\n                     usage: Optional[str] = ...,\n                     description: Optional[str] = ...,\n                     epilog: Optional[str] = ...,\n                     parents: Sequence[ArgumentParser] = ...,\n                     formatter_class: Type[HelpFormatter] = ...,\n                     prefix_chars: _Text = ...,\n                     fromfile_prefix_chars: Optional[str] = ...,\n                     argument_default: Optional[str] = ...,\n                     conflict_handler: _Text = ...,\n                     add_help: bool = ...,\n                     allow_abbrev: bool = ...) -> None: ...\n    else:\n        def __init__(self,\n                     prog: Optional[_Text] = ...,\n                     usage: Optional[_Text] = ...,\n                     description: Optional[_Text] = ...,\n                     epilog: Optional[_Text] = ...,\n                     parents: Sequence[ArgumentParser] = ...,\n                     formatter_class: Type[HelpFormatter] = ...,\n                     prefix_chars: _Text = ...,\n                     fromfile_prefix_chars: Optional[_Text] = ...,\n                     argument_default: Optional[_Text] = ...,\n                     conflict_handler: _Text = ...,\n                     add_help: bool = ...) -> None: ...\n    def add_argument(self,\n                     *name_or_flags: Union[_Text, Sequence[_Text]],\n                     action: Union[_Text, Type[Action]] = ...,\n                     nargs: Union[int, _Text] = ...,\n                     const: Any = ...,\n                     default: Any = ...,\n                     type: Union[Callable[[str], _T], FileType] = ...,\n                     choices: Iterable[_T] = ...,\n                     required: bool = ...,\n                     help: _Text = ...,\n                     metavar: Union[_Text, Tuple[_Text, ...]] = ...,\n                     dest: _Text = ...,\n                     version: _Text = ...) -> None: ...  # weirdly documented\n    def parse_args(self, args: Optional[Sequence[_Text]] = ...,\n                   namespace: Optional[Namespace] = ...) -> Namespace: ...\n    def add_subparsers(self, title: _Text = ...,\n                       description: Optional[_Text] = ...,\n                       prog: _Text = ...,\n                       parser_class: Type[ArgumentParser] = ...,\n                       action: Type[Action] = ...,\n                       option_string: _Text = ...,\n                       dest: Optional[_Text] = ...,\n                       help: Optional[_Text] = ...,\n                       metavar: Optional[_Text] = ...) -> _SubParsersAction: ...\n    def add_argument_group(self, title: Optional[_Text] = ...,\n                           description: Optional[_Text] = ...) -> _ArgumentGroup: ...\n    def add_mutually_exclusive_group(self, required: bool = ...) -> _MutuallyExclusiveGroup: ...\n    def set_defaults(self, **kwargs: Any) -> None: ...\n    def get_default(self, dest: _Text) -> Any: ...\n    def print_usage(self, file: Optional[IO[str]] = ...) -> None: ...\n    def print_help(self, file: Optional[IO[str]] = ...) -> None: ...\n    def format_usage(self) -> str: ...\n    def format_help(self) -> str: ...\n    def parse_known_args(self, args: Optional[Sequence[_Text]] = ...,\n                         namespace: Optional[Namespace] = ...) -> Tuple[Namespace, List[str]]: ...\n    def convert_arg_line_to_args(self, arg_line: _Text) -> List[str]: ...\n    def exit(self, status: int = ..., message: Optional[_Text] = ...) -> None: ...\n    def error(self, message: _Text) -> None: ...\n\nclass HelpFormatter:\n    # not documented\n    def __init__(self, prog: _Text, indent_increment: int = ...,\n                 max_help_position: int = ...,\n                 width: Optional[int] = ...) -> None: ...\nclass RawDescriptionHelpFormatter(HelpFormatter): ...\nclass RawTextHelpFormatter(HelpFormatter): ...\nclass ArgumentDefaultsHelpFormatter(HelpFormatter): ...\nif sys.version_info >= (3,):\n    class MetavarTypeHelpFormatter(HelpFormatter): ...\n\nclass Action:\n    def __init__(self,\n                 option_strings: Sequence[_Text],\n                 dest: _Text = ...,\n                 nargs: Optional[Union[int, _Text]] = ...,\n                 const: Any = ...,\n                 default: Any = ...,\n                 type: Union[Callable[[str], _T], FileType, None] = ...,\n                 choices: Optional[Iterable[_T]] = ...,\n                 required: bool = ...,\n                 help: Optional[_Text] = ...,\n                 metavar: Union[_Text, Tuple[_Text, ...]] = ...) -> None: ...\n    def __call__(self, parser: ArgumentParser, namespace: Namespace,\n                 values: Union[_Text, Sequence[Any], None],\n                 option_string: _Text = ...) -> None: ...\n\nclass Namespace:\n    def __getattr__(self, name: _Text) -> Any: ...\n    def __setattr__(self, name: _Text, value: Any) -> None: ...\n\nclass FileType:\n    if sys.version_info >= (3, 4):\n        def __init__(self, mode: _Text = ..., bufsize: int = ...,\n                     encoding: Optional[_Text] = ...,\n                     errors: Optional[_Text] = ...) -> None: ...\n    elif sys.version_info >= (3,):\n        def __init__(self,\n                     mode: _Text = ..., bufsize: int = ...) -> None: ...\n    else:\n        def __init__(self,\n                     mode: _Text = ..., bufsize: Optional[int] = ...) -> None: ...\n    def __call__(self, string: _Text) -> IO[Any]: ...\n\nclass _ArgumentGroup:\n    def add_argument(self,\n                     *name_or_flags: Union[_Text, Sequence[_Text]],\n                     action: Union[_Text, Type[Action]] = ...,\n                     nargs: Union[int, _Text] = ...,\n                     const: Any = ...,\n                     default: Any = ...,\n                     type: Union[Callable[[str], _T], FileType] = ...,\n                     choices: Iterable[_T] = ...,\n                     required: bool = ...,\n                     help: _Text = ...,\n                     metavar: Union[_Text, Tuple[_Text, ...]] = ...,\n                     dest: _Text = ...,\n                     version: _Text = ...) -> None: ...\n    def add_mutually_exclusive_group(self, required: bool = ...) -> _MutuallyExclusiveGroup: ...\n\nclass _MutuallyExclusiveGroup(_ArgumentGroup): ...\n\nclass _SubParsersAction:\n    # TODO: Type keyword args properly.\n    def add_parser(self, name: _Text, **kwargs: Any) -> ArgumentParser: ...\n\n# not documented\nclass ArgumentTypeError(Exception): ...\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/backstage.fcgi",
    "content": "#!/usr/bin/env python\n\nimport sqlite\nimport urllib2\nimport csv\nimport cgi\nimport simplejson\nimport jsontemplate\nimport time\n\nlog = open('log.txt', 'a')\n\ndef urldecode(query):\n   d = {}\n   a = query.split('&')\n   for s in a:\n      if s.find('='):\n         k,v = map(urllib2.unquote, s.split('='))\n         try:\n            d[k].append(v)\n         except KeyError:\n            d[k] = [v]\n \n   return d\n\ndef load_table(uri, cur):\n    table = uri.split('/')[-1]\n    table = table.split('.')[0]\n\n    contents = urllib2.urlopen(uri)\n    fields = \"\"\n    for field in contents.readline().strip().split(','):\n      fields += field\n      fields += \",\"\n    fields = fields.rstrip(',')\n    \n    cur.execute(\"SELECT name FROM sqlite_master WHERE type='table' \\\n      AND name='%s';\" % (table))\n    if cur.fetchone() == None:\n#      cur.execute(\"DROP TABLE %s;\" % (table))\n      cur.execute(\"CREATE TABLE %s (%s);\" % (table, fields))\n      for line in contents:\n        values = line.strip()\n        values = \"','\".join([val.strip() for val in values.split(\",\")])\n        values = \"'\" + values + \"'\"\n        sql = \"INSERT INTO %s (%s) VALUES (%s);\" % (table, fields, values)\n        cur.execute(sql)\n    return table\n\ndef build_structure(headings, allresults):\n  results = []\n  for result in allresults:\n    results.append(dict(zip(headings, result)))\n  results = { \"query\" : results }\n  return results\n\ndef build_json(headings, allresults, callback):\n  results = build_structure(headings, allresults)\n  return_str = simplejson.dumps(results)\n  if callback != None:\n    return_str = callback + \"(\" + return_str + \");\";\n  return return_str\n\ndef load_template(templatefile):\n  return \"\".join(urllib2.urlopen(templatefile).readlines())\n\ndef build_template(headings, allresults, template_str):\n  results = build_structure(headings, allresults)\n  return jsontemplate.expand(template_str, results)\n  return \"\"\n\ndef myapp(environ, start_response):\n    args = cgi.parse_qs(environ['QUERY_STRING'])\n    \n    query = args['query'][0]\n    uri = args['uri'][0]\n    callback = None\n    if 'callback' in args:\n      callback = args['callback'][0]\n    label = \"no label\"\n    if 'label' in args:\n      label = args['label'][0]\n    templatefile = None\n    if 'templatefile' in args:\n      templatefile = args['templatefile'][0]\n\n    con = sqlite.connect('mydatabase.db')\n    cur = con.cursor()\n    table_uris = uri.split(',')\n    tables = [load_table(uri, cur) for uri in table_uris]\n    con.commit() \n    before = time.time()\n    cur.execute(query)\n    allresults = cur.fetchall()\n    after = time.time()\n    log.write(\"%s: query time %f\\n\" % (label, after - before))\n\n    headings = [name[0] for name in cur.description]\n    return_str = \"\"\n    if templatefile != None:\n      start_response('200 OK', [('Content-Type', 'text/html')])\n      before = time.time()\n      template_str = load_template(templatefile)\n      after = time.time()\n      log.write(\"%s: template loading time %f\\n\" % (label, after - before))\n      before = time.time()\n      return_str = build_template(headings, allresults, template_str)\n      after = time.time()\n      log.write(\"%s: template rendering time %f\\n\" % (label, after - before))\n    else:\n      start_response('200 OK', [('Content-Type', 'text/plain')])\n      before = time.time()\n      return_str = build_json(headings, allresults, callback)\n      after = time.time()\n      log.write(\"%s: json-making time %f\\n\" % (label, after - before))\n    return return_str\n\nif __name__ == '__main__':\n    from fcgi import WSGIServer\n    WSGIServer(myapp).run()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/closure_js_binary.bzl",
    "content": "# Copyright 2015 The Bazel Authors. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Build definitions for JavaScript binaries compiled with the Closure Compiler.\n\nA single file is produced with the _compiled.js suffix.\n\nBy default, the name of the entry point is assumed to be the same as that of the\nbuild target. This behaviour may be overridden with the \"main\" attribute.\n\nThe optimization level may be set with the \"compilation_level\" attribute.\nSupported values are: unobfuscated, simple, and advanced.\n\nExample:\n\n  closure_js_binary(\n      name = \"hello\",\n      compilation_level = \"simple\",\n      language_in = \"ecmascript6\",\n      language_out = \"ecmascript3\",\n      externs = [\"//third_party/javascript/google_cast/cast.js\"],\n      deps = [\n          \"@closure_library//:closure_library\",\n          \":hello_lib\",\n      ],\n  )\n\nThis rule will produce hello_combined.js.\n\"\"\"\n\n_COMPILATION_LEVELS = {\n  \"whitespace_only\": [\n      \"--compilation_level=WHITESPACE_ONLY\",\n      \"--formatting=PRETTY_PRINT\"\n  ],\n  \"simple\": [\"--compilation_level=SIMPLE\"],\n  \"advanced\": [\"--compilation_level=ADVANCED\"]\n}\n\n_SUPPORTED_LANGUAGES = {\n  \"es3\": [\"ES3\"],\n  \"ecmascript3\": [\"ECMASCRIPT3\"],\n  \"es5\": [\"ES5\"],\n  \"ecmascript5\": [\"ECMASCRIPT5\"],\n  \"es5_strict\": [\"ES5_STRICT\"],\n  \"ecmascript5_strict\": [\"ECMASCRIPT5_STRICT\"],\n  \"es6\": [\"ES6\"],\n  \"ecmascript6\": [\"ECMASCRIPT6\"],\n  \"es6_strict\": [\"ES6_STRICT\"],\n  \"ecmascript6_strict\": [\"ECMASCRIPT6_STRICT\"],\n  \"es6_typed\": [\"ES6_TYPED\"],\n  \"ecmascript6_typed\": [\"ECMASCRIPT6_TYPED\"],\n}\n\ndef _impl(ctx):\n  externs = set(order=\"compile\")\n  srcs = set(order=\"compile\")\n  for dep in ctx.attr.deps:\n    externs += dep.transitive_js_externs\n    srcs += dep.transitive_js_srcs\n\n  args = [\n      \"--entry_point=goog:%s\" % ctx.attr.main,\n      \"--js_output_file=%s\" % ctx.outputs.out.path,\n      \"--dependency_mode=LOOSE\",\n      \"--warning_level=VERBOSE\",\n  ] + ([\"--js=%s\" % src.path for src in srcs] +\n       [\"--externs=%s\" % extern.path for extern in externs])\n\n  # Set the compilation level.\n  if ctx.attr.compilation_level in _COMPILATION_LEVELS:\n    args += _COMPILATION_LEVELS[ctx.attr.compilation_level]\n  else:\n    fail(\"Invalid compilation_level '%s', expected one of %s\" %\n         (ctx.attr.compilation_level, _COMPILATION_LEVELS.keys()))\n\n  # Set the language in.\n  if ctx.attr.language_in in _SUPPORTED_LANGUAGES:\n    args += \"--language_in=\" + _SUPPORTED_LANGUAGES[ctx.attr.language_in]\n  else:\n    fail(\"Invalid language_in '%s', expected one of %s\" %\n         (ctx.attr.language_in, _SUPPORTED_LANGUAGES.keys()))\n\n  # Set the language out.\n  if ctx.attr.language_out in _SUPPORTED_LANGUAGES:\n    args += \"--language_out=\" + _SUPPORTED_LANGUAGES[ctx.attr.language_out]\n  else:\n    fail(\"Invalid language_out '%s', expected one of %s\" %\n         (ctx.attr.language_out, _SUPPORTED_LANGUAGES.keys()))\n\n  ctx.action(\n      inputs=list(srcs) + list(externs),\n      outputs=[ctx.outputs.out],\n      arguments=args,\n      executable=ctx.executable._closure_compiler)\n\n  return struct(files=set([ctx.outputs.out]))\n\nclosure_js_binary = rule(\n    implementation=_impl,\n    attrs={\n        \"deps\": attr.label_list(\n            allow_files=False,\n            providers=[\"transitive_js_externs\", \"transitive_js_srcs\"]),\n        \"main\": attr.string(default=\"%{name}\"),\n        \"compilation_level\": attr.string(default=\"advanced\"),\n        \"language_in\": attr.string(default=\"ecmascript6\"),\n        \"language_out\": attr.string(default=\"ecmascript3\"),\n        \"_closure_compiler\": attr.label(\n            default=Label(\"//external:closure_compiler_\"),\n            executable=True),\n    },\n    outputs={\"out\": \"%{name}_combined.js\"})\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/django-models-base.py",
    "content": "from __future__ import unicode_literals\n\nimport copy\nimport sys\nfrom functools import update_wrapper\nfrom future_builtins import zip\n\nimport django.db.models.manager     # Imported to register signal handler.\nfrom django.conf import settings\nfrom django.core.exceptions import (ObjectDoesNotExist,\n    MultipleObjectsReturned, FieldError, ValidationError, NON_FIELD_ERRORS)\nfrom django.core import validators\nfrom django.db.models.fields import AutoField, FieldDoesNotExist\nfrom django.db.models.fields.related import (ManyToOneRel,\n    OneToOneField, add_lazy_relation)\nfrom django.db import (router, transaction, DatabaseError,\n    DEFAULT_DB_ALIAS)\nfrom django.db.models.query import Q\nfrom django.db.models.query_utils import DeferredAttribute\nfrom django.db.models.deletion import Collector\nfrom django.db.models.options import Options\nfrom django.db.models import signals\nfrom django.db.models.loading import register_models, get_model\nfrom django.utils.translation import ugettext_lazy as _\nfrom django.utils.functional import curry\nfrom django.utils.encoding import smart_str, force_unicode\nfrom django.utils.text import get_text_list, capfirst\n\n\nclass ModelBase(type):\n    \"\"\"\n    Metaclass for all models.\n    \"\"\"\n    def __new__(cls, name, bases, attrs):\n        super_new = super(ModelBase, cls).__new__\n        parents = [b for b in bases if isinstance(b, ModelBase)]\n        if not parents:\n            # If this isn't a subclass of Model, don't do anything special.\n            return super_new(cls, name, bases, attrs)\n\n        # Create the class.\n        module = attrs.pop('__module__')\n        new_class = super_new(cls, name, bases, {'__module__': module})\n        attr_meta = attrs.pop('Meta', None)\n        abstract = getattr(attr_meta, 'abstract', False)\n        if not attr_meta:\n            meta = getattr(new_class, 'Meta', None)\n        else:\n            meta = attr_meta\n        base_meta = getattr(new_class, '_meta', None)\n\n        if getattr(meta, 'app_label', None) is None:\n            # Figure out the app_label by looking one level up.\n            # For 'django.contrib.sites.models', this would be 'sites'.\n            model_module = sys.modules[new_class.__module__]\n            kwargs = {\"app_label\": model_module.__name__.split('.')[-2]}\n        else:\n            kwargs = {}\n\n        new_class.add_to_class('_meta', Options(meta, **kwargs))\n        if not abstract:\n            new_class.add_to_class('DoesNotExist', subclass_exception(b'DoesNotExist',\n                    tuple(x.DoesNotExist\n                            for x in parents if hasattr(x, '_meta') and not x._meta.abstract)\n                                    or (ObjectDoesNotExist,), module))\n            new_class.add_to_class('MultipleObjectsReturned', subclass_exception(b'MultipleObjectsReturned',\n                    tuple(x.MultipleObjectsReturned\n                            for x in parents if hasattr(x, '_meta') and not x._meta.abstract)\n                                    or (MultipleObjectsReturned,), module))\n            if base_meta and not base_meta.abstract:\n                # Non-abstract child classes inherit some attributes from their\n                # non-abstract parent (unless an ABC comes before it in the\n                # method resolution order).\n                if not hasattr(meta, 'ordering'):\n                    new_class._meta.ordering = base_meta.ordering\n                if not hasattr(meta, 'get_latest_by'):\n                    new_class._meta.get_latest_by = base_meta.get_latest_by\n\n        is_proxy = new_class._meta.proxy\n\n        if getattr(new_class, '_default_manager', None):\n            if not is_proxy:\n                # Multi-table inheritance doesn't inherit default manager from\n                # parents.\n                new_class._default_manager = None\n                new_class._base_manager = None\n            else:\n                # Proxy classes do inherit parent's default manager, if none is\n                # set explicitly.\n                new_class._default_manager = new_class._default_manager._copy_to_model(new_class)\n                new_class._base_manager = new_class._base_manager._copy_to_model(new_class)\n\n        # Bail out early if we have already created this class.\n        m = get_model(new_class._meta.app_label, name,\n                      seed_cache=False, only_installed=False)\n        if m is not None:\n            return m\n\n        # Add all attributes to the class.\n        for obj_name, obj in attrs.items():\n            new_class.add_to_class(obj_name, obj)\n\n        # All the fields of any type declared on this model\n        new_fields = new_class._meta.local_fields + \\\n                     new_class._meta.local_many_to_many + \\\n                     new_class._meta.virtual_fields\n        field_names = set([f.name for f in new_fields])\n\n        # Basic setup for proxy models.\n        if is_proxy:\n            base = None\n            for parent in [cls for cls in parents if hasattr(cls, '_meta')]:\n                if parent._meta.abstract:\n                    if parent._meta.fields:\n                        raise TypeError(\"Abstract base class containing model fields not permitted for proxy model '%s'.\" % name)\n                    else:\n                        continue\n                if base is not None:\n                    raise TypeError(\"Proxy model '%s' has more than one non-abstract model base class.\" % name)\n                else:\n                    base = parent\n            if base is None:\n                    raise TypeError(\"Proxy model '%s' has no non-abstract model base class.\" % name)\n            if (new_class._meta.local_fields or\n                    new_class._meta.local_many_to_many):\n                raise FieldError(\"Proxy model '%s' contains model fields.\" % name)\n            new_class._meta.setup_proxy(base)\n            new_class._meta.concrete_model = base._meta.concrete_model\n        else:\n            new_class._meta.concrete_model = new_class\n\n        # Do the appropriate setup for any model parents.\n        o2o_map = dict([(f.rel.to, f) for f in new_class._meta.local_fields\n                if isinstance(f, OneToOneField)])\n\n        for base in parents:\n            original_base = base\n            if not hasattr(base, '_meta'):\n                # Things without _meta aren't functional models, so they're\n                # uninteresting parents.\n                continue\n\n            parent_fields = base._meta.local_fields + base._meta.local_many_to_many\n            # Check for clashes between locally declared fields and those\n            # on the base classes (we cannot handle shadowed fields at the\n            # moment).\n            for field in parent_fields:\n                if field.name in field_names:\n                    raise FieldError('Local field %r in class %r clashes '\n                                     'with field of similar name from '\n                                     'base class %r' %\n                                        (field.name, name, base.__name__))\n            if not base._meta.abstract:\n                # Concrete classes...\n                base = base._meta.concrete_model\n                if base in o2o_map:\n                    field = o2o_map[base]\n                elif not is_proxy:\n                    attr_name = '%s_ptr' % base._meta.module_name\n                    field = OneToOneField(base, name=attr_name,\n                            auto_created=True, parent_link=True)\n                    new_class.add_to_class(attr_name, field)\n                else:\n                    field = None\n                new_class._meta.parents[base] = field\n            else:\n                # .. and abstract ones.\n                for field in parent_fields:\n                    new_class.add_to_class(field.name, copy.deepcopy(field))\n\n                # Pass any non-abstract parent classes onto child.\n                new_class._meta.parents.update(base._meta.parents)\n\n            # Inherit managers from the abstract base classes.\n            new_class.copy_managers(base._meta.abstract_managers)\n\n            # Proxy models inherit the non-abstract managers from their base,\n            # unless they have redefined any of them.\n            if is_proxy:\n                new_class.copy_managers(original_base._meta.concrete_managers)\n\n            # Inherit virtual fields (like GenericForeignKey) from the parent\n            # class\n            for field in base._meta.virtual_fields:\n                if base._meta.abstract and field.name in field_names:\n                    raise FieldError('Local field %r in class %r clashes '\\\n                                     'with field of similar name from '\\\n                                     'abstract base class %r' % \\\n                                        (field.name, name, base.__name__))\n                new_class.add_to_class(field.name, copy.deepcopy(field))\n\n        if abstract:\n            # Abstract base models can't be instantiated and don't appear in\n            # the list of models for an app. We do the final setup for them a\n            # little differently from normal models.\n            attr_meta.abstract = False\n            new_class.Meta = attr_meta\n            return new_class\n\n        new_class._prepare()\n        register_models(new_class._meta.app_label, new_class)\n\n        # Because of the way imports happen (recursively), we may or may not be\n        # the first time this model tries to register with the framework. There\n        # should only be one class for each model, so we always return the\n        # registered version.\n        return get_model(new_class._meta.app_label, name,\n                         seed_cache=False, only_installed=False)\n\n    def copy_managers(cls, base_managers):\n        # This is in-place sorting of an Options attribute, but that's fine.\n        base_managers.sort()\n        for _, mgr_name, manager in base_managers:\n            val = getattr(cls, mgr_name, None)\n            if not val or val is manager:\n                new_manager = manager._copy_to_model(cls)\n                cls.add_to_class(mgr_name, new_manager)\n\n    def add_to_class(cls, name, value):\n        if hasattr(value, 'contribute_to_class'):\n            value.contribute_to_class(cls, name)\n        else:\n            setattr(cls, name, value)\n\n    def _prepare(cls):\n        \"\"\"\n        Creates some methods once self._meta has been populated.\n        \"\"\"\n        opts = cls._meta\n        opts._prepare(cls)\n\n        if opts.order_with_respect_to:\n            cls.get_next_in_order = curry(cls._get_next_or_previous_in_order, is_next=True)\n            cls.get_previous_in_order = curry(cls._get_next_or_previous_in_order, is_next=False)\n            # defer creating accessors on the foreign class until we are\n            # certain it has been created\n            def make_foreign_order_accessors(field, model, cls):\n                setattr(\n                    field.rel.to,\n                    'get_%s_order' % cls.__name__.lower(),\n                    curry(method_get_order, cls)\n                )\n                setattr(\n                    field.rel.to,\n                    'set_%s_order' % cls.__name__.lower(),\n                    curry(method_set_order, cls)\n                )\n            add_lazy_relation(\n                cls,\n                opts.order_with_respect_to,\n                opts.order_with_respect_to.rel.to,\n                make_foreign_order_accessors\n            )\n\n        # Give the class a docstring -- its definition.\n        if cls.__doc__ is None:\n            cls.__doc__ = \"%s(%s)\" % (cls.__name__, \", \".join([f.attname for f in opts.fields]))\n\n        if hasattr(cls, 'get_absolute_url'):\n            cls.get_absolute_url = update_wrapper(curry(get_absolute_url, opts, cls.get_absolute_url),\n                                                  cls.get_absolute_url)\n\n        signals.class_prepared.send(sender=cls)\n\nclass ModelState(object):\n    \"\"\"\n    A class for storing instance state\n    \"\"\"\n    def __init__(self, db=None):\n        self.db = db\n        # If true, uniqueness validation checks will consider this a new, as-yet-unsaved object.\n        # Necessary for correct validation of new instances of objects with explicit (non-auto) PKs.\n        # This impacts validation only; it has no effect on the actual save.\n        self.adding = True\n\nclass Model(object):\n    __metaclass__ = ModelBase\n    _deferred = False\n\n    def __init__(self, *args, **kwargs):\n        signals.pre_init.send(sender=self.__class__, args=args, kwargs=kwargs)\n\n        # Set up the storage for instance state\n        self._state = ModelState()\n\n        # There is a rather weird disparity here; if kwargs, it's set, then args\n        # overrides it. It should be one or the other; don't duplicate the work\n        # The reason for the kwargs check is that standard iterator passes in by\n        # args, and instantiation for iteration is 33% faster.\n        args_len = len(args)\n        if args_len > len(self._meta.fields):\n            # Daft, but matches old exception sans the err msg.\n            raise IndexError(\"Number of args exceeds number of fields\")\n\n        fields_iter = iter(self._meta.fields)\n        if not kwargs:\n            # The ordering of the zip calls matter - zip throws StopIteration\n            # when an iter throws it. So if the first iter throws it, the second\n            # is *not* consumed. We rely on this, so don't change the order\n            # without changing the logic.\n            for val, field in zip(args, fields_iter):\n                setattr(self, field.attname, val)\n        else:\n            # Slower, kwargs-ready version.\n            for val, field in zip(args, fields_iter):\n                setattr(self, field.attname, val)\n                kwargs.pop(field.name, None)\n                # Maintain compatibility with existing calls.\n                if isinstance(field.rel, ManyToOneRel):\n                    kwargs.pop(field.attname, None)\n\n        # Now we're left with the unprocessed fields that *must* come from\n        # keywords, or default.\n\n        for field in fields_iter:\n            is_related_object = False\n            # This slightly odd construct is so that we can access any\n            # data-descriptor object (DeferredAttribute) without triggering its\n            # __get__ method.\n            if (field.attname not in kwargs and\n                    isinstance(self.__class__.__dict__.get(field.attname), DeferredAttribute)):\n                # This field will be populated on request.\n                continue\n            if kwargs:\n                if isinstance(field.rel, ManyToOneRel):\n                    try:\n                        # Assume object instance was passed in.\n                        rel_obj = kwargs.pop(field.name)\n                        is_related_object = True\n                    except KeyError:\n                        try:\n                            # Object instance wasn't passed in -- must be an ID.\n                            val = kwargs.pop(field.attname)\n                        except KeyError:\n                            val = field.get_default()\n                    else:\n                        # Object instance was passed in. Special case: You can\n                        # pass in \"None\" for related objects if it's allowed.\n                        if rel_obj is None and field.null:\n                            val = None\n                else:\n                    try:\n                        val = kwargs.pop(field.attname)\n                    except KeyError:\n                        # This is done with an exception rather than the\n                        # default argument on pop because we don't want\n                        # get_default() to be evaluated, and then not used.\n                        # Refs #12057.\n                        val = field.get_default()\n            else:\n                val = field.get_default()\n            if is_related_object:\n                # If we are passed a related instance, set it using the\n                # field.name instead of field.attname (e.g. \"user\" instead of\n                # \"user_id\") so that the object gets properly cached (and type\n                # checked) by the RelatedObjectDescriptor.\n                setattr(self, field.name, rel_obj)\n            else:\n                setattr(self, field.attname, val)\n\n        if kwargs:\n            for prop in kwargs.keys():\n                try:\n                    if isinstance(getattr(self.__class__, prop), property):\n                        setattr(self, prop, kwargs.pop(prop))\n                except AttributeError:\n                    pass\n            if kwargs:\n                raise TypeError(\"'%s' is an invalid keyword argument for this function\" % kwargs.keys()[0])\n        super(Model, self).__init__()\n        signals.post_init.send(sender=self.__class__, instance=self)\n\n    def __repr__(self):\n        try:\n            u = unicode(self)\n        except (UnicodeEncodeError, UnicodeDecodeError):\n            u = '[Bad Unicode data]'\n        return smart_str('<%s: %s>' % (self.__class__.__name__, u))\n\n    def __str__(self):\n        if hasattr(self, '__unicode__'):\n            return force_unicode(self).encode('utf-8')\n        return '%s object' % self.__class__.__name__\n\n    def __eq__(self, other):\n        return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val()\n\n    def __ne__(self, other):\n        return not self.__eq__(other)\n\n    def __hash__(self):\n        return hash(self._get_pk_val())\n\n    def __reduce__(self):\n        \"\"\"\n        Provides pickling support. Normally, this just dispatches to Python's\n        standard handling. However, for models with deferred field loading, we\n        need to do things manually, as they're dynamically created classes and\n        only module-level classes can be pickled by the default path.\n        \"\"\"\n        data = self.__dict__\n        model = self.__class__\n        # The obvious thing to do here is to invoke super().__reduce__()\n        # for the non-deferred case. Don't do that.\n        # On Python 2.4, there is something weird with __reduce__,\n        # and as a result, the super call will cause an infinite recursion.\n        # See #10547 and #12121.\n        defers = []\n        if self._deferred:\n            from django.db.models.query_utils import deferred_class_factory\n            factory = deferred_class_factory\n            for field in self._meta.fields:\n                if isinstance(self.__class__.__dict__.get(field.attname),\n                        DeferredAttribute):\n                    defers.append(field.attname)\n            model = self._meta.proxy_for_model\n        else:\n            factory = simple_class_factory\n        return (model_unpickle, (model, defers, factory), data)\n\n    def _get_pk_val(self, meta=None):\n        if not meta:\n            meta = self._meta\n        return getattr(self, meta.pk.attname)\n\n    def _set_pk_val(self, value):\n        return setattr(self, self._meta.pk.attname, value)\n\n    pk = property(_get_pk_val, _set_pk_val)\n\n    def serializable_value(self, field_name):\n        \"\"\"\n        Returns the value of the field name for this instance. If the field is\n        a foreign key, returns the id value, instead of the object. If there's\n        no Field object with this name on the model, the model attribute's\n        value is returned directly.\n\n        Used to serialize a field's value (in the serializer, or form output,\n        for example). Normally, you would just access the attribute directly\n        and not use this method.\n        \"\"\"\n        try:\n            field = self._meta.get_field_by_name(field_name)[0]\n        except FieldDoesNotExist:\n            return getattr(self, field_name)\n        return getattr(self, field.attname)\n\n    def save(self, force_insert=False, force_update=False, using=None,\n             update_fields=None):\n        \"\"\"\n        Saves the current instance. Override this in a subclass if you want to\n        control the saving process.\n\n        The 'force_insert' and 'force_update' parameters can be used to insist\n        that the \"save\" must be an SQL insert or update (or equivalent for\n        non-SQL backends), respectively. Normally, they should not be set.\n        \"\"\"\n        if force_insert and (force_update or update_fields):\n            raise ValueError(\"Cannot force both insert and updating in model saving.\")\n\n        if update_fields is not None:\n            # If update_fields is empty, skip the save. We do also check for\n            # no-op saves later on for inheritance cases. This bailout is\n            # still needed for skipping signal sending.\n            if len(update_fields) == 0:\n                return\n\n            update_fields = frozenset(update_fields)\n            field_names = set([field.name for field in self._meta.fields\n                               if not field.primary_key])\n            non_model_fields = update_fields.difference(field_names)\n\n            if non_model_fields:\n                raise ValueError(\"The following fields do not exist in this \"\n                                 \"model or are m2m fields: %s\"\n                                 % ', '.join(non_model_fields))\n\n        self.save_base(using=using, force_insert=force_insert,\n                       force_update=force_update, update_fields=update_fields)\n    save.alters_data = True\n\n    def save_base(self, raw=False, cls=None, origin=None, force_insert=False,\n                  force_update=False, using=None, update_fields=None):\n        \"\"\"\n        Does the heavy-lifting involved in saving. Subclasses shouldn't need to\n        override this method. It's separate from save() in order to hide the\n        need for overrides of save() to pass around internal-only parameters\n        ('raw', 'cls', and 'origin').\n        \"\"\"\n        using = using or router.db_for_write(self.__class__, instance=self)\n        assert not (force_insert and (force_update or update_fields))\n        assert update_fields is None or len(update_fields) > 0\n        if cls is None:\n            cls = self.__class__\n            meta = cls._meta\n            if not meta.proxy:\n                origin = cls\n        else:\n            meta = cls._meta\n\n        if origin and not meta.auto_created:\n            signals.pre_save.send(sender=origin, instance=self, raw=raw, using=using,\n                                  update_fields=update_fields)\n\n        # If we are in a raw save, save the object exactly as presented.\n        # That means that we don't try to be smart about saving attributes\n        # that might have come from the parent class - we just save the\n        # attributes we have been given to the class we have been given.\n        # We also go through this process to defer the save of proxy objects\n        # to their actual underlying model.\n        if not raw or meta.proxy:\n            if meta.proxy:\n                org = cls\n            else:\n                org = None\n            for parent, field in meta.parents.items():\n                # At this point, parent's primary key field may be unknown\n                # (for example, from administration form which doesn't fill\n                # this field). If so, fill it.\n                if field and getattr(self, parent._meta.pk.attname) is None and getattr(self, field.attname) is not None:\n                    setattr(self, parent._meta.pk.attname, getattr(self, field.attname))\n\n                self.save_base(cls=parent, origin=org, using=using,\n                               update_fields=update_fields)\n\n                if field:\n                    setattr(self, field.attname, self._get_pk_val(parent._meta))\n            if meta.proxy:\n                return\n\n        if not meta.proxy:\n            non_pks = [f for f in meta.local_fields if not f.primary_key]\n\n            if update_fields:\n                non_pks = [f for f in non_pks if f.name in update_fields]\n\n            # First, try an UPDATE. If that doesn't update anything, do an INSERT.\n            pk_val = self._get_pk_val(meta)\n            pk_set = pk_val is not None\n            record_exists = True\n            manager = cls._base_manager\n            if pk_set:\n                # Determine if we should do an update (pk already exists, forced update,\n                # no force_insert)\n                if ((force_update or update_fields) or (not force_insert and\n                        manager.using(using).filter(pk=pk_val).exists())):\n                    if force_update or non_pks:\n                        values = [(f, None, (raw and getattr(self, f.attname) or f.pre_save(self, False))) for f in non_pks]\n                        if values:\n                            rows = manager.using(using).filter(pk=pk_val)._update(values)\n                            if force_update and not rows:\n                                raise DatabaseError(\"Forced update did not affect any rows.\")\n                            if update_fields and not rows:\n                                raise DatabaseError(\"Save with update_fields did not affect any rows.\")\n                else:\n                    record_exists = False\n            if not pk_set or not record_exists:\n                if meta.order_with_respect_to:\n                    # If this is a model with an order_with_respect_to\n                    # autopopulate the _order field\n                    field = meta.order_with_respect_to\n                    order_value = manager.using(using).filter(**{field.name: getattr(self, field.attname)}).count()\n                    self._order = order_value\n\n                fields = meta.local_fields\n                if not pk_set:\n                    if force_update or update_fields:\n                        raise ValueError(\"Cannot force an update in save() with no primary key.\")\n                    fields = [f for f in fields if not isinstance(f, AutoField)]\n\n                record_exists = False\n\n                update_pk = bool(meta.has_auto_field and not pk_set)\n                result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)\n\n                if update_pk:\n                    setattr(self, meta.pk.attname, result)\n            transaction.commit_unless_managed(using=using)\n\n        # Store the database on which the object was saved\n        self._state.db = using\n        # Once saved, this is no longer a to-be-added instance.\n        self._state.adding = False\n\n        # Signal that the save is complete\n        if origin and not meta.auto_created:\n            signals.post_save.send(sender=origin, instance=self, created=(not record_exists),\n                                   update_fields=update_fields, raw=raw, using=using)\n\n\n    save_base.alters_data = True\n\n    def delete(self, using=None):\n        using = using or router.db_for_write(self.__class__, instance=self)\n        assert self._get_pk_val() is not None, \"%s object can't be deleted because its %s attribute is set to None.\" % (self._meta.object_name, self._meta.pk.attname)\n\n        collector = Collector(using=using)\n        collector.collect([self])\n        collector.delete()\n\n    delete.alters_data = True\n\n    def _get_FIELD_display(self, field):\n        value = getattr(self, field.attname)\n        return force_unicode(dict(field.flatchoices).get(value, value), strings_only=True)\n\n    def _get_next_or_previous_by_FIELD(self, field, is_next, **kwargs):\n        if not self.pk:\n            raise ValueError(\"get_next/get_previous cannot be used on unsaved objects.\")\n        op = is_next and 'gt' or 'lt'\n        order = not is_next and '-' or ''\n        param = smart_str(getattr(self, field.attname))\n        q = Q(**{'%s__%s' % (field.name, op): param})\n        q = q|Q(**{field.name: param, 'pk__%s' % op: self.pk})\n        qs = self.__class__._default_manager.using(self._state.db).filter(**kwargs).filter(q).order_by('%s%s' % (order, field.name), '%spk' % order)\n        try:\n            return qs[0]\n        except IndexError:\n            raise self.DoesNotExist(\"%s matching query does not exist.\" % self.__class__._meta.object_name)\n\n    def _get_next_or_previous_in_order(self, is_next):\n        cachename = \"__%s_order_cache\" % is_next\n        if not hasattr(self, cachename):\n            op = is_next and 'gt' or 'lt'\n            order = not is_next and '-_order' or '_order'\n            order_field = self._meta.order_with_respect_to\n            obj = self._default_manager.filter(**{\n                order_field.name: getattr(self, order_field.attname)\n            }).filter(**{\n                '_order__%s' % op: self._default_manager.values('_order').filter(**{\n                    self._meta.pk.name: self.pk\n                })\n            }).order_by(order)[:1].get()\n            setattr(self, cachename, obj)\n        return getattr(self, cachename)\n\n    def prepare_database_save(self, unused):\n        return self.pk\n\n    def clean(self):\n        \"\"\"\n        Hook for doing any extra model-wide validation after clean() has been\n        called on every field by self.clean_fields. Any ValidationError raised\n        by this method will not be associated with a particular field; it will\n        have a special-case association with the field defined by NON_FIELD_ERRORS.\n        \"\"\"\n        pass\n\n    def validate_unique(self, exclude=None):\n        \"\"\"\n        Checks unique constraints on the model and raises ``ValidationError``\n        if any failed.\n        \"\"\"\n        unique_checks, date_checks = self._get_unique_checks(exclude=exclude)\n\n        errors = self._perform_unique_checks(unique_checks)\n        date_errors = self._perform_date_checks(date_checks)\n\n        for k, v in date_errors.items():\n            errors.setdefault(k, []).extend(v)\n\n        if errors:\n            raise ValidationError(errors)\n\n    def _get_unique_checks(self, exclude=None):\n        \"\"\"\n        Gather a list of checks to perform. Since validate_unique could be\n        called from a ModelForm, some fields may have been excluded; we can't\n        perform a unique check on a model that is missing fields involved\n        in that check.\n        Fields that did not validate should also be excluded, but they need\n        to be passed in via the exclude argument.\n        \"\"\"\n        if exclude is None:\n            exclude = []\n        unique_checks = []\n\n        unique_togethers = [(self.__class__, self._meta.unique_together)]\n        for parent_class in self._meta.parents.keys():\n            if parent_class._meta.unique_together:\n                unique_togethers.append((parent_class, parent_class._meta.unique_together))\n\n        for model_class, unique_together in unique_togethers:\n            for check in unique_together:\n                for name in check:\n                    # If this is an excluded field, don't add this check.\n                    if name in exclude:\n                        break\n                else:\n                    unique_checks.append((model_class, tuple(check)))\n\n        # These are checks for the unique_for_<date/year/month>.\n        date_checks = []\n\n        # Gather a list of checks for fields declared as unique and add them to\n        # the list of checks.\n\n        fields_with_class = [(self.__class__, self._meta.local_fields)]\n        for parent_class in self._meta.parents.keys():\n            fields_with_class.append((parent_class, parent_class._meta.local_fields))\n\n        for model_class, fields in fields_with_class:\n            for f in fields:\n                name = f.name\n                if name in exclude:\n                    continue\n                if f.unique:\n                    unique_checks.append((model_class, (name,)))\n                if f.unique_for_date and f.unique_for_date not in exclude:\n                    date_checks.append((model_class, 'date', name, f.unique_for_date))\n                if f.unique_for_year and f.unique_for_year not in exclude:\n                    date_checks.append((model_class, 'year', name, f.unique_for_year))\n                if f.unique_for_month and f.unique_for_month not in exclude:\n                    date_checks.append((model_class, 'month', name, f.unique_for_month))\n        return unique_checks, date_checks\n\n    def _perform_unique_checks(self, unique_checks):\n        errors = {}\n\n        for model_class, unique_check in unique_checks:\n            # Try to look up an existing object with the same values as this\n            # object's values for all the unique field.\n\n            lookup_kwargs = {}\n            for field_name in unique_check:\n                f = self._meta.get_field(field_name)\n                lookup_value = getattr(self, f.attname)\n                if lookup_value is None:\n                    # no value, skip the lookup\n                    continue\n                if f.primary_key and not self._state.adding:\n                    # no need to check for unique primary key when editing\n                    continue\n                lookup_kwargs[str(field_name)] = lookup_value\n\n            # some fields were skipped, no reason to do the check\n            if len(unique_check) != len(lookup_kwargs.keys()):\n                continue\n\n            qs = model_class._default_manager.filter(**lookup_kwargs)\n\n            # Exclude the current object from the query if we are editing an\n            # instance (as opposed to creating a new one)\n            # Note that we need to use the pk as defined by model_class, not\n            # self.pk. These can be different fields because model inheritance\n            # allows single model to have effectively multiple primary keys.\n            # Refs #17615.\n            model_class_pk = self._get_pk_val(model_class._meta)\n            if not self._state.adding and model_class_pk is not None:\n                qs = qs.exclude(pk=model_class_pk)\n            if qs.exists():\n                if len(unique_check) == 1:\n                    key = unique_check[0]\n                else:\n                    key = NON_FIELD_ERRORS\n                errors.setdefault(key, []).append(self.unique_error_message(model_class, unique_check))\n\n        return errors\n\n    def _perform_date_checks(self, date_checks):\n        errors = {}\n        for model_class, lookup_type, field, unique_for in date_checks:\n            lookup_kwargs = {}\n            # there's a ticket to add a date lookup, we can remove this special\n            # case if that makes it's way in\n            date = getattr(self, unique_for)\n            if date is None:\n                continue\n            if lookup_type == 'date':\n                lookup_kwargs['%s__day' % unique_for] = date.day\n                lookup_kwargs['%s__month' % unique_for] = date.month\n                lookup_kwargs['%s__year' % unique_for] = date.year\n            else:\n                lookup_kwargs['%s__%s' % (unique_for, lookup_type)] = getattr(date, lookup_type)\n            lookup_kwargs[field] = getattr(self, field)\n\n            qs = model_class._default_manager.filter(**lookup_kwargs)\n            # Exclude the current object from the query if we are editing an\n            # instance (as opposed to creating a new one)\n            if not self._state.adding and self.pk is not None:\n                qs = qs.exclude(pk=self.pk)\n\n            if qs.exists():\n                errors.setdefault(field, []).append(\n                    self.date_error_message(lookup_type, field, unique_for)\n                )\n        return errors\n\n    def date_error_message(self, lookup_type, field, unique_for):\n        opts = self._meta\n        return _(\"%(field_name)s must be unique for %(date_field)s %(lookup)s.\") % {\n            'field_name': unicode(capfirst(opts.get_field(field).verbose_name)),\n            'date_field': unicode(capfirst(opts.get_field(unique_for).verbose_name)),\n            'lookup': lookup_type,\n        }\n\n    def unique_error_message(self, model_class, unique_check):\n        opts = model_class._meta\n        model_name = capfirst(opts.verbose_name)\n\n        # A unique field\n        if len(unique_check) == 1:\n            field_name = unique_check[0]\n            field = opts.get_field(field_name)\n            field_label = capfirst(field.verbose_name)\n            # Insert the error into the error dict, very sneaky\n            return field.error_messages['unique'] %  {\n                'model_name': unicode(model_name),\n                'field_label': unicode(field_label)\n            }\n        # unique_together\n        else:\n            field_labels = map(lambda f: capfirst(opts.get_field(f).verbose_name), unique_check)\n            field_labels = get_text_list(field_labels, _('and'))\n            return _(\"%(model_name)s with this %(field_label)s already exists.\") %  {\n                'model_name': unicode(model_name),\n                'field_label': unicode(field_labels)\n            }\n\n    def full_clean(self, exclude=None):\n        \"\"\"\n        Calls clean_fields, clean, and validate_unique, on the model,\n        and raises a ``ValidationError`` for any errors that occured.\n        \"\"\"\n        errors = {}\n        if exclude is None:\n            exclude = []\n\n        try:\n            self.clean_fields(exclude=exclude)\n        except ValidationError as e:\n            errors = e.update_error_dict(errors)\n\n        # Form.clean() is run even if other validation fails, so do the\n        # same with Model.clean() for consistency.\n        try:\n            self.clean()\n        except ValidationError as e:\n            errors = e.update_error_dict(errors)\n\n        # Run unique checks, but only for fields that passed validation.\n        for name in errors.keys():\n            if name != NON_FIELD_ERRORS and name not in exclude:\n                exclude.append(name)\n        try:\n            self.validate_unique(exclude=exclude)\n        except ValidationError as e:\n            errors = e.update_error_dict(errors)\n\n        if errors:\n            raise ValidationError(errors)\n\n    def clean_fields(self, exclude=None):\n        \"\"\"\n        Cleans all fields and raises a ValidationError containing message_dict\n        of all validation errors if any occur.\n        \"\"\"\n        if exclude is None:\n            exclude = []\n\n        errors = {}\n        for f in self._meta.fields:\n            if f.name in exclude:\n                continue\n            # Skip validation for empty fields with blank=True. The developer\n            # is responsible for making sure they have a valid value.\n            raw_value = getattr(self, f.attname)\n            if f.blank and raw_value in validators.EMPTY_VALUES:\n                continue\n            try:\n                setattr(self, f.attname, f.clean(raw_value, self))\n            except ValidationError as e:\n                errors[f.name] = e.messages\n\n        if errors:\n            raise ValidationError(errors)\n\n\n############################################\n# HELPER FUNCTIONS (CURRIED MODEL METHODS) #\n############################################\n\n# ORDERING METHODS #########################\n\ndef method_set_order(ordered_obj, self, id_list, using=None):\n    if using is None:\n        using = DEFAULT_DB_ALIAS\n    rel_val = getattr(self, ordered_obj._meta.order_with_respect_to.rel.field_name)\n    order_name = ordered_obj._meta.order_with_respect_to.name\n    # FIXME: It would be nice if there was an \"update many\" version of update\n    # for situations like this.\n    for i, j in enumerate(id_list):\n        ordered_obj.objects.filter(**{'pk': j, order_name: rel_val}).update(_order=i)\n    transaction.commit_unless_managed(using=using)\n\n\ndef method_get_order(ordered_obj, self):\n    rel_val = getattr(self, ordered_obj._meta.order_with_respect_to.rel.field_name)\n    order_name = ordered_obj._meta.order_with_respect_to.name\n    pk_name = ordered_obj._meta.pk.name\n    return [r[pk_name] for r in\n            ordered_obj.objects.filter(**{order_name: rel_val}).values(pk_name)]\n\n\n##############################################\n# HELPER FUNCTIONS (CURRIED MODEL FUNCTIONS) #\n##############################################\n\ndef get_absolute_url(opts, func, self, *args, **kwargs):\n    return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.module_name), func)(self, *args, **kwargs)\n\n\n########\n# MISC #\n########\n\nclass Empty(object):\n    pass\n\ndef simple_class_factory(model, attrs):\n    \"\"\"Used to unpickle Models without deferred fields.\n\n    We need to do this the hard way, rather than just using\n    the default __reduce__ implementation, because of a\n    __deepcopy__ problem in Python 2.4\n    \"\"\"\n    return model\n\ndef model_unpickle(model, attrs, factory):\n    \"\"\"\n    Used to unpickle Model subclasses with deferred fields.\n    \"\"\"\n    cls = factory(model, attrs)\n    return cls.__new__(cls)\nmodel_unpickle.__safe_for_unpickle__ = True\n\ndef subclass_exception(name, parents, module):\n    return type(name, parents, {'__module__': module})\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/filenames/.gclient",
    "content": "solutions = [\n  {\n    \"url\": \"https://chromium.googlesource.com/v8/v8.git\",\n    \"managed\": False,\n    \"name\": \"v8\",\n    \"deps_file\": \"DEPS\",\n    \"custom_deps\": {},\n  },\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/filenames/BUCK",
    "content": "include_defs('//tools/build.defs')\n\ngerrit_war(name = 'gerrit')\ngerrit_war(name = 'gwtgerrit',   ui = 'ui_dbg')\ngerrit_war(name = 'headless',    ui = None)\ngerrit_war(name = 'chrome',      ui = 'ui_chrome')\ngerrit_war(name = 'firefox',     ui = 'ui_firefox')\ngerrit_war(name = 'safari',      ui = 'ui_safari')\ngerrit_war(name = 'polygerrit',  ui = 'polygerrit')\ngerrit_war(name = 'withdocs', docs = True)\ngerrit_war(name = 'release',  ui = 'ui_optdbg_r', docs = True, context = ['//plugins:core'],  visibility = ['//tools/maven:'])\n\nAPI_DEPS = [\n  '//gerrit-acceptance-framework:acceptance-framework',\n  '//gerrit-acceptance-framework:acceptance-framework-src',\n  '//gerrit-acceptance-framework:acceptance-framework-javadoc',\n  '//gerrit-extension-api:extension-api',\n  '//gerrit-extension-api:extension-api-src',\n  '//gerrit-extension-api:extension-api-javadoc',\n  '//gerrit-plugin-api:plugin-api',\n  '//gerrit-plugin-api:plugin-api-src',\n  '//gerrit-plugin-api:plugin-api-javadoc',\n  '//gerrit-plugin-gwtui:gwtui-api',\n  '//gerrit-plugin-gwtui:gwtui-api-src',\n  '//gerrit-plugin-gwtui:gwtui-api-javadoc',\n]\n\nzip_file(\n  name = 'api',\n  srcs = API_DEPS,\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/filenames/BUILD",
    "content": "package(default_visibility = [\"//scripts/release:__pkg__\"])\n\nfilegroup(\n    name = \"git\",\n    srcs = glob([\".git/**\"]),\n)\n\nfilegroup(\n    name = \"dummy\",\n    visibility = [\"//visibility:public\"],\n)\n\nfilegroup(\n    name = \"srcs\",\n    srcs = glob(\n        [\"**\"],\n        exclude = [\n            \"bazel-*/**\",\n            \"output/**\",\n            \".*/**\",\n        ],\n    ) + [\n        \"//examples:srcs\",\n        \"//scripts:srcs\",\n        \"//site:srcs\",\n        \"//src:srcs\",\n        \"//tools:srcs\",\n        \"//third_party:srcs\",\n    ],\n    visibility = [\"//visibility:private\"],\n)\n\nload(\"//tools/build_defs/pkg:pkg.bzl\", \"pkg_tar\")\n\npkg_tar(\n    name = \"bazel-srcs\",\n    files = [\":srcs\"],\n    strip_prefix = \".\",\n    # Public but bazel-only visibility.\n    visibility = [\"//:__subpackages__\"],\n)\n\nload(\"//tools/build_rules/go:def.bzl\", \"go_prefix\")\n\ngo_prefix(\"github.com/bazelbuild/bazel\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/filenames/WORKSPACE",
    "content": "# rules for scala\n# https://github.com/bazelbuild/rules_scala#getting-started\n# pull rule definitions from git\ngit_repository(\n    name = \"io_bazel_rules_scala\",\n    remote = \"https://github.com/bazelbuild/rules_scala.git\",\n    commit = \"73743b830ae98d13a946b25ad60cad5fee58e6d3\", # update this as needed\n)\n\n# load the desired scala rules for this workspace\nload(\"@io_bazel_rules_scala//scala:scala.bzl\", \"scala_repositories\")\nscala_repositories()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/flask-view.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\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(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    __metaclass__ = MethodViewType\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": "src/test/resources/samples/langs/Python/gen-py-linguist-thrift.py",
    "content": "#\n# Autogenerated by Thrift Compiler (1.0.0-dev)\n#\n# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n#\n#  options string: py\n#\n\nfrom thrift.Thrift import TType, TMessageType, TException, TApplicationException\n\nfrom thrift.transport import TTransport\nfrom thrift.protocol import TBinaryProtocol, TProtocol\ntry:\n  from thrift.protocol import fastbinary\nexcept:\n  fastbinary = None\n\n\n\nclass PullRequest:\n  \"\"\"\n  Attributes:\n   - title\n  \"\"\"\n\n  thrift_spec = (\n    None, # 0\n    (1, TType.STRING, 'title', None, None, ), # 1\n  )\n\n  def __init__(self, title=None,):\n    self.title = title\n\n  def read(self, iprot):\n    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:\n      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))\n      return\n    iprot.readStructBegin()\n    while True:\n      (fname, ftype, fid) = iprot.readFieldBegin()\n      if ftype == TType.STOP:\n        break\n      if fid == 1:\n        if ftype == TType.STRING:\n          self.title = iprot.readString()\n        else:\n          iprot.skip(ftype)\n      else:\n        iprot.skip(ftype)\n      iprot.readFieldEnd()\n    iprot.readStructEnd()\n\n  def write(self, oprot):\n    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:\n      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))\n      return\n    oprot.writeStructBegin('PullRequest')\n    if self.title is not None:\n      oprot.writeFieldBegin('title', TType.STRING, 1)\n      oprot.writeString(self.title)\n      oprot.writeFieldEnd()\n    oprot.writeFieldStop()\n    oprot.writeStructEnd()\n\n  def validate(self):\n    return\n\n\n  def __hash__(self):\n    value = 17\n    value = (value * 31) ^ hash(self.title)\n    return value\n\n  def __repr__(self):\n    L = ['%s=%r' % (key, value)\n      for key, value in self.__dict__.iteritems()]\n    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))\n\n  def __eq__(self, other):\n    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__\n\n  def __ne__(self, other):\n    return not (self == other)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/protocol_buffer_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: protocol-buffer.proto\n\nfrom google.protobuf import descriptor as _descriptor\nfrom google.protobuf import message as _message\nfrom google.protobuf import reflection as _reflection\nfrom google.protobuf import descriptor_pb2\n# @@protoc_insertion_point(imports)\n\n\n\n\nDESCRIPTOR = _descriptor.FileDescriptor(\n  name='protocol-buffer.proto',\n  package='persons',\n  serialized_pb='\\n\\x15protocol-buffer.proto\\x12\\x07persons\\\"\\x16\\n\\x06Person\\x12\\x0c\\n\\x04name\\x18\\x01 \\x02(\\t')\n\n\n\n\n_PERSON = _descriptor.Descriptor(\n  name='Person',\n  full_name='persons.Person',\n  filename=None,\n  file=DESCRIPTOR,\n  containing_type=None,\n  fields=[\n    _descriptor.FieldDescriptor(\n      name='name', full_name='persons.Person.name', index=0,\n      number=1, type=9, cpp_type=9, label=2,\n      has_default_value=False, default_value=unicode(\"\", \"utf-8\"),\n      message_type=None, enum_type=None, containing_type=None,\n      is_extension=False, extension_scope=None,\n      options=None),\n  ],\n  extensions=[\n  ],\n  nested_types=[],\n  enum_types=[\n  ],\n  options=None,\n  is_extendable=False,\n  extension_ranges=[],\n  serialized_start=34,\n  serialized_end=56,\n)\n\nDESCRIPTOR.message_types_by_name['Person'] = _PERSON\n\nclass Person(_message.Message):\n  __metaclass__ = _reflection.GeneratedProtocolMessageType\n  DESCRIPTOR = _PERSON\n\n  # @@protoc_insertion_point(class_scope:persons.Person)\n\n\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/py3.py3",
    "content": "import random\n\nguesses = 0\n\nnumber = random.randint(1, 20)\n\nprint(\"Guess the number between 1 and 20! You have 6 tries.\")\nwhile guesses < 6:\n    guess = int(input(\"Is it... \"))\n\n    if guess == number:\n        print(\"Hooray! You guessed it right!\")\n        break\n    elif guess < number:\n        print(\"It's bigger...\")\n    elif guess > number:\n        print(\"It's not so big.\")\n    guesses += 1\nif guesses == 6:\n    print(\"You've ran out of tries.\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/python",
    "content": "#!/usr/bin/env python2.4\nprint \"Python\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/python2",
    "content": "#!/usr/bin/env python\n\nimport os\nimport sys\n\ndef main():\n\n\t# usage string\n\tusage = 'usage: gitall command'\n\n\t# command check\n\tif len(sys.argv) < 2:\n\t\tsys.exit(usage)\n\n\tcommand = 'git ' + ' '.join(sys.argv[1:])\n\tprintDelimiter()\n\tprint 'Running command:', command\n\n\t# get a list of git directories in the specified parent\n\tgitDirectories = getSubdirectories('.', isGitDirectory)\n\n\tfor gitDirectory in gitDirectories:\n\t\tos.chdir(gitDirectory)\n\t\tprintDelimiter()\n\t\tprint 'Current respository location:', os.getcwd()\n\t\tos.system(command)\n\n\tprintDelimiter()\n\ndef getSubdirectories(directory, filter = None):\n\tdirectory = os.path.abspath(directory)\n\tsubdirectories = os.walk(directory).next()[1]\n\tif filter is None:\n\t\treturn [directory + '/' + i for i in subdirectories]\n\telse:\n\t\treturn [directory + '/' + i for i in subdirectories if filter(directory + '/' + i)]\n\ndef isGitDirectory(directory):\n\treturn os.path.isdir(directory + '/.git/')\n\ndef printDelimiter():\n\tprint '\\033[91m'\n\tprint ('#' * 80)\n\tprint '\\033[0m'\n\nif __name__ == '__main__':\n\tmain()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/python3",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n\n# Copyright © 2013 Martin Ueding <dev@martin-ueding.de>\n\nimport argparse\nimport matplotlib.pyplot as pl\nimport numpy as np\nimport scipy.optimize as op\nfrom prettytable import PrettyTable\n\n__docformat__ = \"restructuredtext en\"\n\n# Sensitivität der Thermosäule\nS = 30e-6\n\ndef phif(U):\n    return U / S\n\ndef main():\n    options = _parse_args()\n\n    V = 1000\n\n    data = np.genfromtxt(\"a-leer.csv\", delimiter=\"\\t\")\n    t = data[:,0]\n    U = data[:,1] / V / 1000\n    U_err = 0.7e-3 / V\n\n    offset = np.mean(U[-3:])\n\n    x = np.linspace(min(t), max(t))\n    y = np.ones(x.size) * offset\n    pl.plot(x, y * 10**6, label=\"Offset\")\n\n    print \"Offset: {:.3g} V\".format(offset)\n\n    pl.errorbar(t, U * 10**6, yerr=U_err * 10**6, linestyle=\"none\", marker=\"+\",\n                label=\"Messdaten\")\n    pl.grid(True)\n    pl.legend(loc=\"best\")\n    pl.title(u\"Bestimmung des Offsets\")\n    pl.xlabel(ur\"Zeit $t / \\mathrm{s}$\")\n    pl.ylabel(ur\"Thermospannung $U / \\mathrm{\\mu V}$\")\n    pl.savefig(\"Plot_a-leer.pdf\")\n    pl.clf()\n\n    V = 100\n\n    data = np.genfromtxt(\"a-Lampe.csv\", delimiter=\"\\t\")\n    t = data[:,0]\n    U = data[:,1] / V / 1000 - offset\n    U_err = 0.7e-3 / V\n\n    x = np.linspace(min(t), max(t))\n    y = np.ones(x.size) * max(U) * 0.9\n    pl.plot(x, y * 10**6, label=ur\"$90\\%$\")\n\n    pl.errorbar(t, U * 10**6, yerr=U_err * 10**6, linestyle=\"none\", marker=\"+\",\n                label=\"Messdaten\")\n    pl.grid(True)\n    pl.legend(loc=\"best\")\n    pl.title(u\"Bestimmung der Ansprechzeit\")\n    pl.xlabel(ur\"Zeit $t / \\mathrm{s}$\")\n    pl.ylabel(ur\"Thermospannung $U / \\mathrm{\\mu V}$\")\n    pl.savefig(\"Plot_a-Lampe.pdf\")\n    pl.clf()\n\n    # Lesliewürfel\n    print \"\"\"\nLesliewürfel\n============\n\"\"\"\n\n    glanz = np.genfromtxt(\"b-glanz.csv\", delimiter=\"\\t\")\n    matt = np.genfromtxt(\"b-matt.csv\", delimiter=\"\\t\")\n    schwarz = np.genfromtxt(\"b-schwarz.csv\", delimiter=\"\\t\")\n    weiss = np.genfromtxt(\"b-weiss.csv\", delimiter=\"\\t\")\n\n    T0 = 19.0 + 273.15\n    T0_err = 1.0\n\n    glanz[:,0] += 273.15\n    matt[:,0] += 273.15\n    schwarz[:,0] += 273.15\n    weiss[:,0] += 273.15\n\n    glanz[:,1] /= 1000 * V\n    matt[:,1] /= 1000 * V\n    schwarz[:,1] /= 1000 * V\n    weiss[:,1] /= 1000 * V\n\n    glanz[:,1] -= offset\n    matt[:,1] -= offset\n    schwarz[:,1] -= offset\n    weiss[:,1] -= offset\n\n    glanz_phi = phif(glanz[:,1])\n    matt_phi = phif(matt[:,1])\n    schwarz_phi = phif(schwarz[:,1])\n    weiss_phi = phif(weiss[:,1])\n\n    T_err = 0.3\n\n    sigma = 5.670373e-8\n\n    def boltzmann(T, epsilon, offset):\n        return epsilon * sigma * T**4 + offset\n\n    glanz_popt, glanz_pconv = op.curve_fit(boltzmann, glanz[:,0], glanz_phi)\n    matt_popt, matt_pconv = op.curve_fit(boltzmann, matt[:,0], matt_phi)\n    schwarz_popt, schwarz_pconv = op.curve_fit(boltzmann, schwarz[:,0], schwarz_phi)\n    weiss_popt, weiss_pconv = op.curve_fit(boltzmann, weiss[:,0], weiss_phi)\n\n    glanz_x = np.linspace(min(glanz[:,0]), max(glanz[:,0]))\n    glanz_y = boltzmann(glanz_x, *glanz_popt)\n    pl.plot(glanz_x, glanz_y, label=\"Fit glanz\", color=\"gold\")\n\n    matt_x = np.linspace(min(matt[:,0]), max(matt[:,0]))\n    matt_y = boltzmann(matt_x, *matt_popt)\n    pl.plot(matt_x, matt_y, label=\"Fit matt\", color=\"yellow\")\n\n    schwarz_x = np.linspace(min(schwarz[:,0]), max(schwarz[:,0]))\n    schwarz_y = boltzmann(schwarz_x, *schwarz_popt)\n    pl.plot(schwarz_x, schwarz_y, label=\"Fit schwarz\", color=\"black\")\n\n    weiss_x = np.linspace(min(weiss[:,0]), max(weiss[:,0]))\n    weiss_y = boltzmann(weiss_x, *weiss_popt)\n    pl.plot(weiss_x, weiss_y, label=\"Fit weiss\", color=\"gray\")\n\n    print \"glanz ε = {:.3g} ± {:.3g}\".format(glanz_popt[0], np.sqrt(glanz_pconv.diagonal()[0]))\n    print \"glanz offset = {:.3g} ± {:.3g}\".format(glanz_popt[1], np.sqrt(glanz_pconv.diagonal()[1]))\n    print \"matt ε = {:.3g} ± {:.3g}\".format(matt_popt[0], np.sqrt(matt_pconv.diagonal()[0]))\n    print \"matt offset = {:.3g} ± {:.3g}\".format(matt_popt[1], np.sqrt(matt_pconv.diagonal()[1]))\n    print \"schwarz ε = {:.3g} ± {:.3g}\".format(schwarz_popt[0], np.sqrt(schwarz_pconv.diagonal()[0]))\n    print \"schwarz offset = {:.3g} ± {:.3g}\".format(schwarz_popt[1], np.sqrt(schwarz_pconv.diagonal()[1]))\n    print \"weiss ε = {:.3g} ± {:.3g}\".format(weiss_popt[0], np.sqrt(weiss_pconv.diagonal()[0]))\n    print \"weiss offset = {:.3g} ± {:.3g}\".format(weiss_popt[1], np.sqrt(weiss_pconv.diagonal()[1]))\n\n    pl.errorbar(glanz[:,0], glanz_phi, xerr=T_err, yerr=U_err/S,\n                label=\"glanz\", color=\"gold\", linestyle=\"none\")\n    pl.errorbar(matt[:,0], matt_phi, xerr=T_err, yerr=U_err/S,\n                label=\"matt\", color=\"yellow\", linestyle=\"none\")\n    pl.errorbar(schwarz[:,0], schwarz_phi, xerr=T_err, yerr=U_err/S,\n                label=\"schwarz\", color=\"black\", linestyle=\"none\")\n    pl.errorbar(weiss[:,0], weiss_phi, xerr=T_err, yerr=U_err/S,\n                label=\"weiss\", color=\"gray\", linestyle=\"none\")\n\n    header = [\"T / K\", \"Phi/F in W/m^2\", \"Fehler T\", \"Fehler Phi/F\"]\n\n    print \"\"\"\nTabellen für den Lesliewürfel-Plot\n----------------------------------\n\"\"\"\n\n    print \"Glanz\"\n    glanz_table = PrettyTable(header)\n    for row in zip(glanz[:,0], glanz_phi, np.ones(glanz[:,0].size)*T_err, np.ones(glanz_phi.size)*U_err/S):\n        glanz_table.add_row(row)\n    print glanz_table\n    print\n\n    print \"Matt\"\n    matt_table = PrettyTable(header)\n    for row in zip(matt[:,0], matt_phi, np.ones(matt[:,0].size)*T_err, np.ones(matt_phi.size)*U_err/S):\n        matt_table.add_row(row)\n    print matt_table\n    print\n\n    print \"Schwarz\"\n    schwarz_table = PrettyTable(header)\n    for row in zip(schwarz[:,0], schwarz_phi, np.ones(schwarz[:,0].size)*T_err, np.ones(schwarz_phi.size)*U_err/S):\n        schwarz_table.add_row(row)\n    print schwarz_table\n    print\n\n    print \"Weiß\"\n    weiss_table = PrettyTable(header)\n    for row in zip(weiss[:,0], weiss_phi, np.ones(weiss[:,0].size)*T_err, np.ones(weiss_phi.size)*U_err/S):\n        weiss_table.add_row(row)\n    print weiss_table\n    print\n\n    epsilon = 0.1\n\n    x = np.linspace(min([min(x) for x in [glanz[:,0], matt[:,0], schwarz[:,0],\n                                          weiss[:,0]]]),\n                    max([max(x) for x in [glanz[:,0], matt[:,0], schwarz[:,0],\n                                          weiss[:,0]]]),\n                    100)\n    offset = - epsilon * sigma * T0**4\n    print \"ideal offset = {:.3g}\".format(offset)\n    y = boltzmann(x, epsilon, offset)\n    pl.plot(x, y, label=ur\"$\\epsilon = 0.1$\")\n\n\n    pl.grid(True)\n    pl.title(u\"Lesliewürfel\")\n    pl.xlabel(ur\"Temperatur $T / \\mathrm{K}$\")\n    pl.ylabel(ur\"Strahlungsfluss $\\frac{\\Phi}{F} / \\mathrm{\\frac{W}{m^2}}$\")\n    pl.legend(loc=\"best\", prop={\"size\": 12})\n    pl.savefig(\"Plot_b.pdf\")\n    pl.clf()\n\n    # Aufgabe c\n    print \"\"\"\nAufgabe c\n=========\n    \"\"\"\n\n    data = np.genfromtxt(\"c-erste.csv\", delimiter=\"\\t\")\n    d = data[:,0] / 100\n    U = data[:,1] / V\n    phi = phif(U)\n\n    def c(x, a, b):\n        return a*x + b\n\n\n    dx = d**(-2)\n    dy = phi\n\n    dx_err = np.abs(-2 * d**(-3)) * 0.001\n    dy_err = 0.001 / S\n\n    popt, pconv = op.curve_fit(c, dx, dy)\n    x = np.linspace(min(dx), max(dx))\n    y = c(x, *popt)\n    pl.plot(x, y, label=\"Fit\")\n\n    print \"Fitparameter\"\n    print \"a\", popt[0], \"±\", np.sqrt(pconv.diagonal()[0])\n    print \"b\", popt[1], \"±\", np.sqrt(pconv.diagonal()[1])\n\n    pl.errorbar(dx, dy, xerr=dx_err, yerr=dy_err, linestyle=\"none\",\n                marker=\"+\", label=\"Messdaten\")\n    pl.grid(True)\n    pl.title(u\"Halogenlampe bei verschiedenen Abständen\")\n    pl.xlabel(ur\"Abstand $d^{-2} / \\mathrm{m^{-2}}$\")\n    pl.ylabel(ur\"Strahlungsfluss $\\frac{\\Phi}{F} / \\mathrm{\\frac{W}{m^2}}$\")\n    pl.legend(loc=\"best\")\n    pl.savefig(\"Plot_c-erste.pdf\")\n    pl.clf()\n\n    print\n    print \"Tabelle für Aufgabe c\"\n    fields = [\"d^-2 in m^-2\", \"Phi/F in W/m^2\", \"Fehler d^-2\", \"Fehler Phi/F\"]\n    table = PrettyTable(fields)\n    table.align = \"l\"\n    for row in zip(dx, dy, dx_err, np.ones(dy.size)*dy_err):\n        table.add_row(row)\n    print table\n    print\n\n    data = np.genfromtxt(\"c-zweite.csv\", delimiter=\"\\t\")\n    U1 = data[:,0]\n    I1 = data[:,1]\n    U2 = data[:,2] / V\n\n    U_err = 0.001\n    I_err = 0.01\n\n    p = U1 * I1\n    R = U1 / I1\n    R_err = np.sqrt(\n        (1/I1 * U_err)**2\n        + (U1/I1**2 * I_err)**2\n    )\n\n    phi = phif(U2)\n    phi_err = U_err / S\n\n    alpha = 4.82e-3\n    beta = 6.76e-7\n\n    R0 = 0.35\n    R0_err = 0.05\n\n    T = (-alpha*R0 + np.sqrt(R0)*np.sqrt(4*beta*R + alpha**2*R0 - 4*beta*R0) +\n 2*beta*R0*T0)/(2*beta*R0)\n\n    popt, pconv = op.curve_fit(boltzmann, T, phi, sigma=phi_err)\n    x = np.linspace(min(T), max(T))\n    y = boltzmann(x, *popt)\n    pl.plot(x, y, label=\"Fit\")\n\n    epsilon = popt[0]\n    epsilon_err = np.sqrt(pconv.diagonal()[0])\n\n    print \"ε = {:.3g} ± {:.3g}\".format(epsilon, epsilon_err)\n\n    f1 = (1/(np.sqrt(R0)*np.sqrt(4*beta*R + alpha**2*R0 - 4*beta*R0))) * R_err\n    f2 = T0_err\n    f3 = ((-alpha + ((alpha**2 - 4*beta)*np.sqrt(R0))/( 2*np.sqrt(4*beta*R + alpha**2*R0 - 4*beta*R0)) + np.sqrt( 4*beta*R + alpha**2*R0 - 4*beta*R0)/(2*np.sqrt(R0)) + 2*beta*T0)/( 2*beta*R0) - (-alpha*R0 + np.sqrt(R0)*np.sqrt(4*beta*R + alpha**2*R0 - 4*beta*R0) + 2*beta*R0*T0)/( 2*beta*R0**2)) * R0_err\n\n    T_err = np.sqrt(f1**2 + f2**2 + f3**2)\n\n    pl.errorbar(T, phi, xerr=T_err, yerr=phi_err, label=\"Messdaten\",\n                linestyle=\"none\", marker=\"+\")\n    pl.grid(True)\n    pl.legend(loc=\"best\")\n    pl.title(u\"Halogenlampe bei verschiedenen Leistungen\")\n    pl.xlabel(u\"Temperatur $T / \\mathrm{K}$\")\n    pl.ylabel(ur\"Strahlungsfluss $\\frac{\\Phi}{F} / \\mathrm{\\frac{W}{m^2}}$\")\n    pl.savefig(\"Plot_c-zweite.pdf\")\n    pl.clf()\n\ndef _parse_args():\n    \"\"\"\n    Parses the command line arguments.\n\n    :return: Namespace with arguments.\n    :rtype: Namespace\n    \"\"\"\n    parser = argparse.ArgumentParser(description=\"\")\n    #parser.add_argument(\"args\", metavar=\"N\", type=str, nargs=\"*\", help=\"Positional arguments.\")\n    #parser.add_argument(\"\", dest=\"\", type=\"\", default=, help=)\n    #parser.add_argument(\"--version\", action=\"version\", version=\"<the version>\")\n\n    return parser.parse_args()\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/simpleclient.rpy",
    "content": "\n# Copyright (c) Twisted Matrix Laboratories.\n# See LICENSE for details.\n\n\n\"\"\"\nAn example client. Run simpleserv.py first before running this.\n\"\"\"\n\nfrom twisted.internet import reactor, protocol\n\n\n# a client protocol\n\nclass EchoClient(protocol.Protocol):\n    \"\"\"Once connected, send a message, then print the result.\"\"\"\n\n    def connectionMade(self):\n        self.transport.write(\"hello, world!\")\n\n    def dataReceived(self, data):\n        \"As soon as any data is received, write it back.\"\n        print \"Server said:\", data\n        self.transport.loseConnection()\n\n    def connectionLost(self, reason):\n        print \"connection lost\"\n\nclass EchoFactory(protocol.ClientFactory):\n    protocol = EchoClient\n\n    def clientConnectionFailed(self, connector, reason):\n        print \"Connection failed - goodbye!\"\n        reactor.stop()\n\n    def clientConnectionLost(self, connector, reason):\n        print \"Connection lost - goodbye!\"\n        reactor.stop()\n\n\n# this connects the protocol to a server running on port 8000\ndef main():\n    f = EchoFactory()\n    reactor.connectTCP(\"localhost\", 8000, f)\n    reactor.run()\n\n# this only runs if the module was *not* imported\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/spec.linux.spec",
    "content": "a = Analysis(['portablizer.pyqt4.py'],\n             hiddenimports=[],\n             hookspath=None,\n             runtime_hooks=None)\npyz = PYZ(a.pure)\nexe = EXE(pyz,\n          a.scripts,\n          exclude_binaries=True,\n          name='Portablizer',\n          debug=False,\n          strip=None,\n          upx=True,\n          console=False)\nnode = Tree('node', prefix='node')\ncollect = COLLECT(exe,\n                  a.binaries,\n                  a.zipfiles,\n                  a.datas,\n                  node,\n                  strip=None,\n                  upx=True,\n                  name='Portablizer')\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/standalone.gypi",
    "content": "# Copyright 2012 the V8 project authors. All rights reserved.\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n#       notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n#       copyright notice, this list of conditions and the following\n#       disclaimer in the documentation and/or other materials provided\n#       with the distribution.\n#     * Neither the name of Google Inc. nor the names of its\n#       contributors may be used to endorse or promote products derived\n#       from this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# Definitions to be used when building stand-alone V8 binaries.\n\n{\n  # We need to include toolchain.gypi here for third-party sources that don't\n  # directly include it themselves.\n  'includes': ['toolchain.gypi'],\n  'variables': {\n    'component%': 'static_library',\n    'clang_xcode%': 0,\n    # Track where uninitialized memory originates from. From fastest to\n    # slowest: 0 - no tracking, 1 - track only the initial allocation site, 2\n    # - track the chain of stores leading from allocation site to use site.\n    'msan_track_origins%': 2,\n    'visibility%': 'hidden',\n    'v8_enable_backtrace%': 0,\n    'v8_enable_i18n_support%': 1,\n    'v8_deprecation_warnings': 1,\n    'v8_imminent_deprecation_warnings': 1,\n    'msvs_multi_core_compile%': '1',\n    'mac_deployment_target%': '10.7',\n    'release_extra_cflags%': '',\n    'v8_enable_inspector%': 0,\n    'variables': {\n      'variables': {\n        'variables': {\n          'variables': {\n            'conditions': [\n              ['OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or \\\n                 OS==\"netbsd\" or OS==\"mac\" or OS==\"qnx\" or OS==\"aix\"', {\n                # This handles the Unix platforms we generally deal with.\n                # Anything else gets passed through, which probably won't work\n                # very well; such hosts should pass an explicit target_arch\n                # to gyp.\n                'host_arch%': '<!pymod_do_main(detect_v8_host_arch)',\n              }, {\n                # OS!=\"linux\" and OS!=\"freebsd\" and OS!=\"openbsd\" and\n                # OS!=\"netbsd\" and OS!=\"mac\" and OS!=\"aix\"\n                'host_arch%': 'ia32',\n              }],\n            ],\n          },\n          'host_arch%': '<(host_arch)',\n          'target_arch%': '<(host_arch)',\n\n          # By default we build against a stable sysroot image to avoid\n          # depending on the packages installed on the local machine. Set this\n          # to 0 to build against locally installed headers and libraries (e.g.\n          # if packaging for a linux distro)\n          'use_sysroot%': 1,\n        },\n        'host_arch%': '<(host_arch)',\n        'target_arch%': '<(target_arch)',\n        'use_sysroot%': '<(use_sysroot)',\n        'base_dir%': '<!(cd <(DEPTH) && python -c \"import os; print os.getcwd()\")',\n\n        # Instrument for code coverage and use coverage wrapper to exclude some\n        # files. Uses gcov if clang=0 is set explicitly. Otherwise,\n        # sanitizer_coverage must be set too.\n        'coverage%': 0,\n\n        # Default sysroot if no sysroot can be provided.\n        'sysroot%': '',\n\n        'conditions': [\n          # The system root for linux builds.\n          ['OS==\"linux\" and use_sysroot==1', {\n            'conditions': [\n              ['target_arch==\"arm\"', {\n                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_wheezy_arm-sysroot',\n              }],\n              ['target_arch==\"x64\"', {\n                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_wheezy_amd64-sysroot',\n              }],\n              ['target_arch==\"ia32\"', {\n                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_wheezy_i386-sysroot',\n              }],\n              ['target_arch==\"mipsel\"', {\n                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_wheezy_mips-sysroot',\n              }],\n            ],\n          }], # OS==\"linux\" and use_sysroot==1\n        ],\n      },\n      'base_dir%': '<(base_dir)',\n      'host_arch%': '<(host_arch)',\n      'target_arch%': '<(target_arch)',\n      'v8_target_arch%': '<(target_arch)',\n      'coverage%': '<(coverage)',\n      'sysroot%': '<(sysroot)',\n      'asan%': 0,\n      'lsan%': 0,\n      'msan%': 0,\n      'tsan%': 0,\n      # Enable coverage gathering instrumentation in sanitizer tools. This flag\n      # also controls coverage granularity (1 for function-level, 2 for\n      # block-level, 3 for edge-level).\n      'sanitizer_coverage%': 0,\n\n      # Use dynamic libraries instrumented by one of the sanitizers\n      # instead of the standard system libraries. Set this flag to download\n      # prebuilt binaries from GCS.\n      'use_prebuilt_instrumented_libraries%': 0,\n\n      # Use libc++ (buildtools/third_party/libc++ and\n      # buildtools/third_party/libc++abi) instead of stdlibc++ as standard\n      # library. This is intended to be used for instrumented builds.\n      'use_custom_libcxx%': 0,\n\n      'clang_dir%': '<(base_dir)/third_party/llvm-build/Release+Asserts',\n      'make_clang_dir%': '<(base_dir)/third_party/llvm-build/Release+Asserts',\n\n      'use_lto%': 0,\n\n      # Control Flow Integrity for virtual calls and casts.\n      # See http://clang.llvm.org/docs/ControlFlowIntegrity.html\n      'cfi_vptr%': 0,\n      'cfi_diag%': 0,\n\n      'cfi_blacklist%': '<(base_dir)/tools/cfi/blacklist.txt',\n\n      # Set to 1 to enable fast builds.\n      # TODO(machenbach): Only configured for windows.\n      'fastbuild%': 0,\n\n      # goma settings.\n      # 1 to use goma.\n      # If no gomadir is set, it uses the default gomadir.\n      'use_goma%': 0,\n      'gomadir%': '',\n\n      'test_isolation_mode%': 'noop',\n\n      # By default, use ICU data file (icudtl.dat).\n      'icu_use_data_file_flag%': 1,\n\n      'conditions': [\n        # Set default gomadir.\n        ['OS==\"win\"', {\n          'gomadir': 'c:\\\\goma\\\\goma-win',\n        }, {\n          'gomadir': '<!(/bin/echo -n ${HOME}/goma)',\n        }],\n        ['host_arch!=\"ppc\" and host_arch!=\"ppc64\" and host_arch!=\"ppc64le\" and host_arch!=\"s390\" and host_arch!=\"s390x\"', {\n          'host_clang%': 1,\n        }, {\n          'host_clang%': 0,\n        }],\n        # linux_use_bundled_gold: whether to use the gold linker binary checked\n        # into third_party/binutils.  Force this off via GYP_DEFINES when you\n        # are using a custom toolchain and need to control -B in ldflags.\n        # Do not use 32-bit gold on 32-bit hosts as it runs out address space\n        # for component=static_library builds.\n        ['((OS==\"linux\" or OS==\"android\") and (target_arch==\"x64\" or target_arch==\"arm\" or (target_arch==\"ia32\" and host_arch==\"x64\"))) or (OS==\"linux\" and target_arch==\"mipsel\")', {\n          'linux_use_bundled_gold%': 1,\n        }, {\n          'linux_use_bundled_gold%': 0,\n        }],\n      ],\n    },\n    'base_dir%': '<(base_dir)',\n    'clang_dir%': '<(clang_dir)',\n    'make_clang_dir%': '<(make_clang_dir)',\n    'host_arch%': '<(host_arch)',\n    'host_clang%': '<(host_clang)',\n    'target_arch%': '<(target_arch)',\n    'v8_target_arch%': '<(v8_target_arch)',\n    'werror%': '-Werror',\n    'use_goma%': '<(use_goma)',\n    'gomadir%': '<(gomadir)',\n    'asan%': '<(asan)',\n    'lsan%': '<(lsan)',\n    'msan%': '<(msan)',\n    'tsan%': '<(tsan)',\n    'sanitizer_coverage%': '<(sanitizer_coverage)',\n    'use_prebuilt_instrumented_libraries%': '<(use_prebuilt_instrumented_libraries)',\n    'use_custom_libcxx%': '<(use_custom_libcxx)',\n    'linux_use_bundled_gold%': '<(linux_use_bundled_gold)',\n    'use_lto%': '<(use_lto)',\n    'cfi_vptr%': '<(cfi_vptr)',\n    'cfi_diag%': '<(cfi_diag)',\n    'cfi_blacklist%': '<(cfi_blacklist)',\n    'test_isolation_mode%': '<(test_isolation_mode)',\n    'fastbuild%': '<(fastbuild)',\n    'coverage%': '<(coverage)',\n    'sysroot%': '<(sysroot)',\n    'icu_use_data_file_flag%': '<(icu_use_data_file_flag)',\n\n    # Add a simple extras solely for the purpose of the cctests\n    'v8_extra_library_files': ['../test/cctest/test-extra.js'],\n    'v8_experimental_extra_library_files': ['../test/cctest/test-experimental-extra.js'],\n\n    # .gyp files or targets should set v8_code to 1 if they build V8 specific\n    # code, as opposed to external code.  This variable is used to control such\n    # things as the set of warnings to enable, and whether warnings are treated\n    # as errors.\n    'v8_code%': 0,\n\n    # Speeds up Debug builds:\n    # 0 - Compiler optimizations off (debuggable) (default). This may\n    #     be 5x slower than Release (or worse).\n    # 1 - Turn on optimizations and disable slow DCHECKs, but leave\n    #     V8_ENABLE_CHECKS and most other assertions enabled.  This may cause\n    #     some v8 tests to fail in the Debug configuration.  This roughly\n    #     matches the performance of a Release build and can be used by\n    #     embedders that need to build their own code as debug but don't want\n    #     or need a debug version of V8. This should produce near-release\n    #     speeds.\n    'v8_optimized_debug%': 0,\n\n    # Use external files for startup data blobs:\n    # the JS builtins sources and the start snapshot.\n    # Embedders that don't use standalone.gypi will need to add\n    # their own default value.\n    'v8_use_external_startup_data%': 1,\n\n    # Relative path to icu.gyp from this file.\n    'icu_gyp_path': '../third_party/icu/icu.gyp',\n\n    # Relative path to inspector.gyp from this file.\n    'inspector_gyp_path': '../src/v8-inspector/inspector.gyp',\n\n    'conditions': [\n      ['(v8_target_arch==\"arm\" and host_arch!=\"arm\") or \\\n        (v8_target_arch==\"arm64\" and host_arch!=\"arm64\") or \\\n        (v8_target_arch==\"mipsel\" and host_arch!=\"mipsel\") or \\\n        (v8_target_arch==\"mips64el\" and host_arch!=\"mips64el\") or \\\n        (v8_target_arch==\"x64\" and host_arch!=\"x64\") or \\\n        (OS==\"android\" or OS==\"qnx\")', {\n        'want_separate_host_toolset': 1,\n      }, {\n        'want_separate_host_toolset': 0,\n      }],\n      ['(v8_target_arch==\"arm\" and host_arch!=\"arm\") or \\\n        (v8_target_arch==\"arm64\" and host_arch!=\"arm64\") or \\\n        (v8_target_arch==\"mipsel\" and host_arch!=\"mipsel\") or \\\n        (v8_target_arch==\"mips64el\" and host_arch!=\"mips64el\") or \\\n        (v8_target_arch==\"mips\" and host_arch!=\"mips\") or \\\n        (v8_target_arch==\"mips64\" and host_arch!=\"mips64\") or \\\n        (v8_target_arch==\"x64\" and host_arch!=\"x64\") or \\\n        (OS==\"android\" or OS==\"qnx\")', {\n        'want_separate_host_toolset_mkpeephole': 1,\n      }, {\n        'want_separate_host_toolset_mkpeephole': 0,\n      }],\n      ['OS == \"win\"', {\n        'os_posix%': 0,\n      }, {\n        'os_posix%': 1,\n      }],\n      ['OS==\"win\" and use_goma==1', {\n        # goma doesn't support pch yet.\n        'chromium_win_pch': 0,\n        # goma doesn't support PDB yet.\n        'fastbuild%': 1,\n      }],\n      ['((v8_target_arch==\"ia32\" or v8_target_arch==\"x64\" or v8_target_arch==\"x87\") and \\\n        (OS==\"linux\" or OS==\"mac\")) or (v8_target_arch==\"ppc64\" and OS==\"linux\")', {\n        'v8_enable_gdbjit%': 1,\n      }, {\n        'v8_enable_gdbjit%': 0,\n      }],\n      ['(OS==\"linux\" or OS==\"mac\") and (target_arch==\"ia32\" or target_arch==\"x64\") and \\\n        (v8_target_arch!=\"x87\" and v8_target_arch!=\"x32\")', {\n        'clang%': 1,\n      }, {\n        'clang%': 0,\n      }],\n      ['asan==1 or lsan==1 or msan==1 or tsan==1', {\n        'clang%': 1,\n        'use_allocator%': 'none',\n      }],\n      ['asan==1 and OS==\"linux\"', {\n        'use_custom_libcxx%': 1,\n      }],\n      ['tsan==1', {\n        'use_custom_libcxx%': 1,\n      }],\n      ['msan==1', {\n        # Use a just-built, MSan-instrumented libc++ instead of the system-wide\n        # libstdc++. This is required to avoid false positive reports whenever\n        # the C++ standard library is used.\n        'use_custom_libcxx%': 1,\n      }],\n      ['cfi_vptr==1', {\n        'use_lto%': 1,\n      }],\n      ['OS==\"android\"', {\n        # Location of Android NDK.\n        'variables': {\n          'variables': {\n            # The Android toolchain needs to use the absolute path to the NDK\n            # because it is used at different levels in the GYP files.\n            'android_ndk_root%': '<(base_dir)/third_party/android_tools/ndk/',\n            'android_host_arch%': \"<!(uname -m | sed -e 's/i[3456]86/x86/')\",\n            # Version of the NDK. Used to ensure full rebuilds on NDK rolls.\n            'android_ndk_version%': 'r12b',\n            'host_os%': \"<!(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')\",\n            'os_folder_name%': \"<!(uname -s | sed -e 's/Linux/linux/;s/Darwin/darwin/')\",\n          },\n\n          # Copy conditionally-set variables out one scope.\n          'android_ndk_root%': '<(android_ndk_root)',\n          'android_ndk_version%': '<(android_ndk_version)',\n          'host_os%': '<(host_os)',\n          'os_folder_name%': '<(os_folder_name)',\n\n          'conditions': [\n            ['target_arch == \"ia32\"', {\n              'android_toolchain%': '<(android_ndk_root)/toolchains/x86-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',\n              'android_target_arch%': 'x86',\n              'android_target_platform%': '16',\n              'arm_version%': 'default',\n            }],\n            ['target_arch == \"x64\"', {\n              'android_toolchain%': '<(android_ndk_root)/toolchains/x86_64-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',\n              'android_target_arch%': 'x86_64',\n              'android_target_platform%': '21',\n              'arm_version%': 'default',\n            }],\n            ['target_arch==\"arm\"', {\n              'android_toolchain%': '<(android_ndk_root)/toolchains/arm-linux-androideabi-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',\n              'android_target_arch%': 'arm',\n              'android_target_platform%': '16',\n              'arm_version%': 7,\n            }],\n            ['target_arch == \"arm64\"', {\n              'android_toolchain%': '<(android_ndk_root)/toolchains/aarch64-linux-android-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',\n              'android_target_arch%': 'arm64',\n              'android_target_platform%': '21',\n              'arm_version%': 'default',\n            }],\n            ['target_arch == \"mipsel\"', {\n              'android_toolchain%': '<(android_ndk_root)/toolchains/mipsel-linux-android-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',\n              'android_target_arch%': 'mips',\n              'android_target_platform%': '16',\n              'arm_version%': 'default',\n            }],\n            ['target_arch == \"mips64el\"', {\n              'android_toolchain%': '<(android_ndk_root)/toolchains/mips64el-linux-android-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',\n              'android_target_arch%': 'mips64',\n              'android_target_platform%': '21',\n              'arm_version%': 'default',\n            }],\n          ],\n        },\n\n        # Copy conditionally-set variables out one scope.\n        'android_ndk_version%': '<(android_ndk_version)',\n        'android_target_arch%': '<(android_target_arch)',\n        'android_target_platform%': '<(android_target_platform)',\n        'android_toolchain%': '<(android_toolchain)',\n        'arm_version%': '<(arm_version)',\n        'host_os%': '<(host_os)',\n\n        # Print to stdout on Android.\n        'v8_android_log_stdout%': 1,\n\n        'conditions': [\n          ['android_ndk_root==\"\"', {\n            'variables': {\n              'android_sysroot': '<(android_toolchain)/sysroot/',\n              'android_stl': '<(android_toolchain)/sources/cxx-stl/',\n            },\n            'conditions': [\n              ['target_arch==\"x64\"', {\n                'android_lib': '<(android_sysroot)/usr/lib64',\n              }, {\n                'android_lib': '<(android_sysroot)/usr/lib',\n              }],\n            ],\n            'android_libcpp_include': '<(android_stl)/llvm-libc++/libcxx/include',\n            'android_libcpp_abi_include': '<(android_stl)/llvm-libc++abi/libcxxabi/include',\n            'android_libcpp_libs': '<(android_stl)/llvm-libc++/libs',\n            'android_support_include': '<(android_toolchain)/sources/android/support/include',\n            'android_sysroot': '<(android_sysroot)',\n          }, {\n            'variables': {\n              'android_sysroot': '<(android_ndk_root)/platforms/android-<(android_target_platform)/arch-<(android_target_arch)',\n              'android_stl': '<(android_ndk_root)/sources/cxx-stl/',\n            },\n            'conditions': [\n              ['target_arch==\"x64\"', {\n                'android_lib': '<(android_sysroot)/usr/lib64',\n              }, {\n                'android_lib': '<(android_sysroot)/usr/lib',\n              }],\n            ],\n            'android_libcpp_include': '<(android_stl)/llvm-libc++/libcxx/include',\n            'android_libcpp_abi_include': '<(android_stl)/llvm-libc++abi/libcxxabi/include',\n            'android_libcpp_libs': '<(android_stl)/llvm-libc++/libs',\n            'android_support_include': '<(android_ndk_root)/sources/android/support/include',\n            'android_sysroot': '<(android_sysroot)',\n          }],\n        ],\n        'android_libcpp_library': 'c++_static',\n      }],  # OS==\"android\"\n      ['host_clang==1', {\n        'conditions':[\n          ['OS==\"android\"', {\n            'host_ld': '<!(which ld)',\n            'host_ranlib': '<!(which ranlib)',\n          }],\n        ],\n        'host_cc': '<(clang_dir)/bin/clang',\n        'host_cxx': '<(clang_dir)/bin/clang++',\n      }, {\n        'host_cc': '<!(which gcc)',\n        'host_cxx': '<!(which g++)',\n      }],\n    ],\n    # Default ARM variable settings.\n    'arm_version%': 'default',\n    'arm_fpu%': 'vfpv3',\n    'arm_float_abi%': 'default',\n    'arm_thumb': 'default',\n\n    # Default MIPS variable settings.\n    'mips_arch_variant%': 'r2',\n    # Possible values fp32, fp64, fpxx.\n    # fp32 - 32 32-bit FPU registers are available, doubles are placed in\n    #        register pairs.\n    # fp64 - 32 64-bit FPU registers are available.\n    # fpxx - compatibility mode, it chooses fp32 or fp64 depending on runtime\n    #        detection\n    'mips_fpu_mode%': 'fp32',\n  },\n  'target_defaults': {\n    'variables': {\n      'v8_code%': '<(v8_code)',\n      'clang_warning_flags': [\n        '-Wsign-compare',\n        # TODO(thakis): https://crbug.com/604888\n        '-Wno-undefined-var-template',\n        # TODO(yangguo): issue 5258\n        '-Wno-nonportable-include-path',\n      ],\n      'conditions':[\n        ['OS==\"android\"', {\n          'host_os%': '<(host_os)',\n        }],\n      ],\n    },\n    'includes': [ 'set_clang_warning_flags.gypi', ],\n    'default_configuration': 'Debug',\n    'configurations': {\n      'DebugBaseCommon': {\n        'conditions': [\n          ['OS==\"aix\"', {\n            'cflags': [ '-g', '-Og', '-gxcoff' ],\n          }, {\n            'cflags': [ '-g', '-O0' ],\n          }],\n        ],\n      },\n      'Optdebug': {\n        'inherit_from': [ 'DebugBaseCommon', 'DebugBase1' ],\n      },\n      'Debug': {\n        # Xcode insists on this empty entry.\n      },\n      'Release': {\n        'cflags+': ['<@(release_extra_cflags)'],\n      },\n      'conditions': [\n        ['OS==\"win\"', {\n          'Optdebug_x64': {\n            'inherit_from': ['Optdebug'],\n          },\n          'Debug_x64': {\n            'inherit_from': ['Debug'],\n          },\n          'Release_x64': {\n            'inherit_from': ['Release'],\n          },\n        }],\n      ],\n    },\n    'conditions':[\n      ['clang==0', {\n        'cflags+': [\n          '-Wno-uninitialized',\n        ],\n      }],\n      ['clang==1 or host_clang==1', {\n        # This is here so that all files get recompiled after a clang roll and\n        # when turning clang on or off.\n        # (defines are passed via the command line, and build systems rebuild\n        # things when their commandline changes). Nothing should ever read this\n        # define.\n        'defines': ['CR_CLANG_REVISION=<!(python <(DEPTH)/tools/clang/scripts/update.py --print-revision)'],\n      }],\n      ['clang==1 and target_arch==\"ia32\"', {\n        'cflags': ['-mstack-alignment=16', '-mstackrealign'],\n      }],\n      ['fastbuild!=0', {\n        'conditions': [\n          ['OS==\"win\" and fastbuild==1', {\n            'msvs_settings': {\n              'VCLinkerTool': {\n                # This tells the linker to generate .pdbs, so that\n                # we can get meaningful stack traces.\n                'GenerateDebugInformation': 'true',\n              },\n              'VCCLCompilerTool': {\n                # No debug info to be generated by compiler.\n                'DebugInformationFormat': '0',\n              },\n            },\n          }],\n        ],\n      }],  # fastbuild!=0\n    ],\n    'target_conditions': [\n      ['v8_code == 0', {\n        'defines!': [\n          'DEBUG',\n        ],\n        'conditions': [\n          ['os_posix == 1 and OS != \"mac\"', {\n            # We don't want to get warnings from third-party code,\n            # so remove any existing warning-enabling flags like -Wall.\n            'cflags!': [\n              '-pedantic',\n              '-Wall',\n              '-Werror',\n              '-Wextra',\n              '-Wshorten-64-to-32',\n            ],\n            'cflags+': [\n              # Clang considers the `register` keyword as deprecated, but\n              # ICU uses it all over the place.\n              '-Wno-deprecated-register',\n              # ICU uses its own deprecated functions.\n              '-Wno-deprecated-declarations',\n              # ICU prefers `a && b || c` over `(a && b) || c`.\n              '-Wno-logical-op-parentheses',\n              # ICU has some `unsigned < 0` checks.\n              '-Wno-tautological-compare',\n              # uresdata.c has switch(RES_GET_TYPE(x)) code. The\n              # RES_GET_TYPE macro returns an UResType enum, but some switch\n              # statement contains case values that aren't part of that\n              # enum (e.g. URES_TABLE32 which is in UResInternalType). This\n              # is on purpose.\n              '-Wno-switch',\n            ],\n            'cflags_cc!': [\n              '-Wnon-virtual-dtor',\n            ],\n          }],\n          ['OS == \"mac\"', {\n            'xcode_settings': {\n              'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO',    # -Werror\n            },\n          }],\n          ['OS == \"win\"', {\n            'msvs_settings': {\n              'VCCLCompilerTool': {\n                'WarnAsError': 'false',\n              },\n            },\n          }],\n        ],\n      }],\n    ],\n  },\n  'conditions': [\n    ['os_posix==1 and OS!=\"mac\"', {\n      'target_defaults': {\n        'conditions': [\n          # Common options for AddressSanitizer, LeakSanitizer,\n          # ThreadSanitizer, MemorySanitizer and CFI builds.\n          ['asan==1 or lsan==1 or tsan==1 or msan==1 or cfi_vptr==1', {\n            'target_conditions': [\n              ['_toolset==\"target\"', {\n                'cflags': [\n                  '-fno-omit-frame-pointer',\n                  '-gline-tables-only',\n                ],\n                'cflags!': [\n                  '-fomit-frame-pointer',\n                ],\n              }],\n            ],\n          }],\n          ['asan==1', {\n            'target_conditions': [\n              ['_toolset==\"target\"', {\n                'cflags': [\n                  '-fsanitize=address',\n                ],\n                'ldflags': [\n                  '-fsanitize=address',\n                ],\n                'defines': [\n                  'ADDRESS_SANITIZER',\n                ],\n              }],\n            ],\n          }],\n          ['lsan==1', {\n            'target_conditions': [\n              ['_toolset==\"target\"', {\n                'cflags': [\n                  '-fsanitize=leak',\n                ],\n                'ldflags': [\n                  '-fsanitize=leak',\n                ],\n                'defines': [\n                  'LEAK_SANITIZER',\n                ],\n              }],\n            ],\n          }],\n          ['tsan==1', {\n            'target_conditions': [\n              ['_toolset==\"target\"', {\n                'cflags': [\n                  '-fsanitize=thread',\n                ],\n                'ldflags': [\n                  '-fsanitize=thread',\n                ],\n                'defines': [\n                  'THREAD_SANITIZER',\n                ],\n              }],\n            ],\n          }],\n          ['msan==1', {\n            'target_conditions': [\n              ['_toolset==\"target\"', {\n                'cflags': [\n                  '-fsanitize=memory',\n                  '-fsanitize-memory-track-origins=<(msan_track_origins)',\n                  '-fPIC',\n                ],\n                'ldflags': [\n                  '-fsanitize=memory',\n                  '-pie',\n                ],\n                'defines': [\n                  'MEMORY_SANITIZER',\n                ],\n              }],\n            ],\n          }],\n          ['use_prebuilt_instrumented_libraries==1', {\n            'dependencies': [\n              '<(DEPTH)/third_party/instrumented_libraries/instrumented_libraries.gyp:prebuilt_instrumented_libraries',\n            ],\n          }],\n          ['use_custom_libcxx==1', {\n            'dependencies': [\n              '<(DEPTH)/buildtools/third_party/libc++/libc++.gyp:libcxx_proxy',\n            ],\n          }],\n          ['sanitizer_coverage!=0', {\n            'target_conditions': [\n              ['_toolset==\"target\"', {\n                'cflags': [\n                  '-fsanitize-coverage=<(sanitizer_coverage)',\n                ],\n                'defines': [\n                  'SANITIZER_COVERAGE',\n                ],\n              }],\n            ],\n          }],\n          ['linux_use_bundled_gold==1 and not (clang==0 and use_lto==1)', {\n            # Put our binutils, which contains gold in the search path. We pass\n            # the path to gold to the compiler. gyp leaves unspecified what the\n            # cwd is when running the compiler, so the normal gyp path-munging\n            # fails us. This hack gets the right path.\n            #\n            # Disabled when using GCC LTO because GCC also uses the -B search\n            # path at link time to find \"as\", and our bundled \"as\" can only\n            # target x86.\n            'ldflags': [\n              # Note, Chromium allows ia32 host arch as well, we limit this to\n              # x64 in v8.\n              '-B<(base_dir)/third_party/binutils/Linux_x64/Release/bin',\n            ],\n          }],\n          ['sysroot!=\"\" and clang==1', {\n            'target_conditions': [\n              ['_toolset==\"target\"', {\n                'cflags': [\n                  '--sysroot=<(sysroot)',\n                ],\n                'ldflags': [\n                  '--sysroot=<(sysroot)',\n                  '<!(<(DEPTH)/build/linux/sysroot_ld_path.sh <(sysroot))',\n                ],\n              }]]\n          }],\n        ],\n      },\n    }],\n    ['OS==\"mac\"', {\n      'target_defaults': {\n       'conditions': [\n          ['asan==1', {\n            'xcode_settings': {\n              # FIXME(machenbach): This is outdated compared to common.gypi.\n              'OTHER_CFLAGS+': [\n                '-fno-omit-frame-pointer',\n                '-gline-tables-only',\n                '-fsanitize=address',\n                '-w',  # http://crbug.com/162783\n              ],\n              'OTHER_CFLAGS!': [\n                '-fomit-frame-pointer',\n              ],\n              'defines': [\n                'ADDRESS_SANITIZER',\n              ],\n            },\n            'dependencies': [\n              '<(DEPTH)/gypfiles/mac/asan.gyp:asan_dynamic_runtime',\n            ],\n            'target_conditions': [\n              ['_type!=\"static_library\"', {\n                'xcode_settings': {'OTHER_LDFLAGS': ['-fsanitize=address']},\n              }],\n            ],\n          }],\n          ['sanitizer_coverage!=0', {\n            'target_conditions': [\n              ['_toolset==\"target\"', {\n                'cflags': [\n                  '-fsanitize-coverage=<(sanitizer_coverage)',\n                ],\n                'defines': [\n                  'SANITIZER_COVERAGE',\n                ],\n              }],\n            ],\n          }],\n        ],\n      },  # target_defaults\n    }],  # OS==\"mac\"\n    ['OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or OS==\"solaris\" \\\n       or OS==\"netbsd\" or OS==\"aix\"', {\n      'target_defaults': {\n        'cflags': [\n          '-Wall',\n          '<(werror)',\n          '-Wno-unused-parameter',\n          '-pthread',\n          '-pedantic',\n          '-Wmissing-field-initializers',\n          '-Wno-gnu-zero-variadic-macro-arguments',\n        ],\n        'cflags_cc': [\n          '-Wnon-virtual-dtor',\n          '-fno-exceptions',\n          '-fno-rtti',\n          '-std=gnu++11',\n        ],\n        'ldflags': [ '-pthread', ],\n        'conditions': [\n          # Don't warn about TRACE_EVENT_* macros with zero arguments passed to\n          # ##__VA_ARGS__. C99 strict mode prohibits having zero variadic macro\n          # arguments in gcc.\n          [ 'clang==0', {\n            'cflags!' : [\n              '-pedantic' ,\n              # Don't warn about unrecognized command line option.\n              '-Wno-gnu-zero-variadic-macro-arguments',\n            ],\n          }],\n          [ 'clang==1 and (v8_target_arch==\"x64\" or v8_target_arch==\"arm64\" \\\n            or v8_target_arch==\"mips64el\")', {\n            'cflags': [ '-Wshorten-64-to-32' ],\n          }],\n          [ 'host_arch==\"ppc64\" and OS!=\"aix\"', {\n            'cflags': [ '-mminimal-toc' ],\n          }],\n          [ 'visibility==\"hidden\" and v8_enable_backtrace==0', {\n            'cflags': [ '-fvisibility=hidden' ],\n          }],\n          [ 'component==\"shared_library\"', {\n            'cflags': [ '-fPIC', ],\n          }],\n          [ 'clang==0 and coverage==1', {\n            'cflags': [ '-fprofile-arcs', '-ftest-coverage'],\n            'ldflags': [ '-fprofile-arcs'],\n          }],\n        ],\n      },\n    }],\n    # 'OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or OS==\"solaris\"\n    #  or OS==\"netbsd\"'\n    ['OS==\"qnx\"', {\n      'target_defaults': {\n        'cflags': [\n          '-Wall',\n          '<(werror)',\n          '-Wno-unused-parameter',\n          # Don't warn about the \"struct foo f = {0};\" initialization pattern.\n          '-Wno-missing-field-initializers',\n          '-Wno-gnu-zero-variadic-macro-arguments',\n        ],\n        'cflags_cc': [\n          '-Wnon-virtual-dtor',\n          '-fno-exceptions',\n          '-fno-rtti',\n          '-std=gnu++11',\n        ],\n        'conditions': [\n          [ 'visibility==\"hidden\"', {\n            'cflags': [ '-fvisibility=hidden' ],\n          }],\n          [ 'component==\"shared_library\"', {\n            'cflags': [ '-fPIC' ],\n          }],\n        ],\n        'target_conditions': [\n          [ '_toolset==\"host\" and host_os==\"linux\"', {\n            'cflags': [ '-pthread' ],\n            'ldflags': [ '-pthread' ],\n            'libraries': [ '-lrt' ],\n          }],\n          [ '_toolset==\"target\"', {\n            'cflags': [ '-Wno-psabi' ],\n            'libraries': [ '-lbacktrace', '-lsocket', '-lm' ],\n          }],\n        ],\n      },\n    }],  # OS==\"qnx\"\n    ['OS==\"win\"', {\n      'target_defaults': {\n        'defines': [\n          '_CRT_SECURE_NO_DEPRECATE',\n          '_CRT_NONSTDC_NO_DEPRECATE',\n          '_USING_V110_SDK71_',\n        ],\n        'conditions': [\n          ['component==\"static_library\"', {\n            'defines': [\n              '_HAS_EXCEPTIONS=0',\n            ],\n          }],\n        ],\n        'msvs_cygwin_dirs': ['<(DEPTH)/third_party/cygwin'],\n        'msvs_disabled_warnings': [\n          # C4091: 'typedef ': ignored on left of 'X' when no variable is\n          #                    declared.\n          # This happens in a number of Windows headers. Dumb.\n          4091,\n\n          # C4127: conditional expression is constant\n          # This warning can in theory catch dead code and other problems, but\n          # triggers in far too many desirable cases where the conditional\n          # expression is either set by macros or corresponds some legitimate\n          # compile-time constant expression (due to constant template args,\n          # conditionals comparing the sizes of different types, etc.).  Some of\n          # these can be worked around, but it's not worth it.\n          4127,\n\n          # C4351: new behavior: elements of array 'array' will be default\n          #        initialized\n          # This is a silly \"warning\" that basically just alerts you that the\n          # compiler is going to actually follow the language spec like it's\n          # supposed to, instead of not following it like old buggy versions\n          # did.  There's absolutely no reason to turn this on.\n          4351,\n\n          # C4355: 'this': used in base member initializer list\n          # It's commonly useful to pass |this| to objects in a class'\n          # initializer list.  While this warning can catch real bugs, most of\n          # the time the constructors in question don't attempt to call methods\n          # on the passed-in pointer (until later), and annotating every legit\n          # usage of this is simply more hassle than the warning is worth.\n          4355,\n\n          # C4503: 'identifier': decorated name length exceeded, name was\n          #        truncated\n          # This only means that some long error messages might have truncated\n          # identifiers in the presence of lots of templates.  It has no effect\n          # on program correctness and there's no real reason to waste time\n          # trying to prevent it.\n          4503,\n\n          # Warning C4589 says: \"Constructor of abstract class ignores\n          # initializer for virtual base class.\" Disable this warning because it\n          # is flaky in VS 2015 RTM. It triggers on compiler generated\n          # copy-constructors in some cases.\n          4589,\n\n          # C4611: interaction between 'function' and C++ object destruction is\n          #        non-portable\n          # This warning is unavoidable when using e.g. setjmp/longjmp.  MSDN\n          # suggests using exceptions instead of setjmp/longjmp for C++, but\n          # Chromium code compiles without exception support.  We therefore have\n          # to use setjmp/longjmp for e.g. JPEG decode error handling, which\n          # means we have to turn off this warning (and be careful about how\n          # object destruction happens in such cases).\n          4611,\n\n          # TODO(jochen): These warnings are level 4. They will be slowly\n          # removed as code is fixed.\n          4100, # Unreferenced formal parameter\n          4121, # Alignment of a member was sensitive to packing\n          4244, # Conversion from 'type1' to 'type2', possible loss of data\n          4302, # Truncation from 'type 1' to 'type 2'\n          4309, # Truncation of constant value\n          4311, # Pointer truncation from 'type' to 'type'\n          4312, # Conversion from 'type1' to 'type2' of greater size\n          4505, # Unreferenced local function has been removed\n          4510, # Default constructor could not be generated\n          4512, # Assignment operator could not be generated\n          4610, # Object can never be instantiated\n          4800, # Forcing value to bool.\n          4838, # Narrowing conversion. Doesn't seem to be very useful.\n          4995, # 'X': name was marked as #pragma deprecated\n          4996, # 'X': was declared deprecated (for GetVersionEx).\n\n          # These are variable shadowing warnings that are new in VS2015. We\n          # should work through these at some point -- they may be removed from\n          # the RTM release in the /W4 set.\n          4456, 4457, 4458, 4459,\n        ],\n        'msvs_settings': {\n          'VCCLCompilerTool': {\n            'MinimalRebuild': 'false',\n            'BufferSecurityCheck': 'true',\n            'EnableFunctionLevelLinking': 'true',\n            'RuntimeTypeInfo': 'false',\n            'WarningLevel': '3',\n            'WarnAsError': 'true',\n            'DebugInformationFormat': '3',\n            'Detect64BitPortabilityProblems': 'false',\n            'conditions': [\n              [ 'msvs_multi_core_compile', {\n                'AdditionalOptions': ['/MP'],\n              }],\n              ['component==\"shared_library\"', {\n                'ExceptionHandling': '1',  # /EHsc\n              }, {\n                'ExceptionHandling': '0',\n              }],\n            ],\n          },\n          'VCLibrarianTool': {\n            'AdditionalOptions': ['/ignore:4221'],\n            'conditions': [\n              ['v8_target_arch==\"x64\"', {\n                'TargetMachine': '17',  # x64\n              }, {\n                'TargetMachine': '1',  # ia32\n              }],\n            ],\n          },\n          'VCLinkerTool': {\n            'AdditionalDependencies': [\n              'ws2_32.lib',\n            ],\n            'GenerateDebugInformation': 'true',\n            'MapFileName': '$(OutDir)\\\\$(TargetName).map',\n            'ImportLibrary': '$(OutDir)\\\\lib\\\\$(TargetName).lib',\n            'FixedBaseAddress': '1',\n            # LinkIncremental values:\n            #   0 == default\n            #   1 == /INCREMENTAL:NO\n            #   2 == /INCREMENTAL\n            'LinkIncremental': '1',\n            # SubSystem values:\n            #   0 == not set\n            #   1 == /SUBSYSTEM:CONSOLE\n            #   2 == /SUBSYSTEM:WINDOWS\n            'SubSystem': '1',\n\n            'conditions': [\n              ['v8_enable_i18n_support==1', {\n                'AdditionalDependencies': [\n                  'advapi32.lib',\n                ],\n              }],\n              ['v8_target_arch==\"x64\"', {\n                'MinimumRequiredVersion': '5.02',  # Server 2003.\n                'TargetMachine': '17',  # x64\n              }, {\n                'MinimumRequiredVersion': '5.01',  # XP.\n                'TargetMachine': '1',  # ia32\n              }],\n            ],\n          },\n          'conditions': [\n            ['clang==1', {\n              'VCCLCompilerTool': {\n                'AdditionalOptions': [\n                  # Don't warn about unused function parameters.\n                  # (This is also used on other platforms.)\n                  '-Wno-unused-parameter',\n                  # Don't warn about the \"struct foo f = {0};\" initialization\n                  # pattern.\n                  '-Wno-missing-field-initializers',\n\n                  # TODO(hans): Make this list shorter eventually, http://crbug.com/504657\n                  '-Qunused-arguments',  # http://crbug.com/504658\n                  '-Wno-microsoft-enum-value',  # http://crbug.com/505296\n                  '-Wno-unknown-pragmas',  # http://crbug.com/505314\n                  '-Wno-microsoft-cast',  # http://crbug.com/550065\n                ],\n              },\n            }],\n            ['clang==1 and MSVS_VERSION == \"2013\"', {\n              'VCCLCompilerTool': {\n                'AdditionalOptions': [\n                  '-fmsc-version=1800',\n                ],\n              },\n            }],\n            ['clang==1 and MSVS_VERSION == \"2015\"', {\n              'VCCLCompilerTool': {\n                'AdditionalOptions': [\n                  '-fmsc-version=1900',\n                ],\n              },\n            }],\n          ],\n        },\n      },\n    }],  # OS==\"win\"\n    ['OS==\"mac\"', {\n      'xcode_settings': {\n        'SDKROOT': 'macosx',\n        'SYMROOT': '<(DEPTH)/xcodebuild',\n      },\n      'target_defaults': {\n        'xcode_settings': {\n          'ALWAYS_SEARCH_USER_PATHS': 'NO',\n          'GCC_C_LANGUAGE_STANDARD': 'c99',         # -std=c99\n          'GCC_CW_ASM_SYNTAX': 'NO',                # No -fasm-blocks\n          'GCC_DYNAMIC_NO_PIC': 'NO',               # No -mdynamic-no-pic\n                                                    # (Equivalent to -fPIC)\n          'GCC_ENABLE_CPP_EXCEPTIONS': 'NO',        # -fno-exceptions\n          'GCC_ENABLE_CPP_RTTI': 'NO',              # -fno-rtti\n          'GCC_ENABLE_PASCAL_STRINGS': 'NO',        # No -mpascal-strings\n          # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden\n          'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES',\n          'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES',      # -fvisibility=hidden\n          'GCC_THREADSAFE_STATICS': 'NO',           # -fno-threadsafe-statics\n          'GCC_WARN_NON_VIRTUAL_DESTRUCTOR': 'YES', # -Wnon-virtual-dtor\n          # MACOSX_DEPLOYMENT_TARGET maps to -mmacosx-version-min\n          'MACOSX_DEPLOYMENT_TARGET': '<(mac_deployment_target)',\n          'PREBINDING': 'NO',                       # No -Wl,-prebind\n          'SYMROOT': '<(DEPTH)/xcodebuild',\n          'USE_HEADERMAP': 'NO',\n          'OTHER_CFLAGS': [\n            '-fno-strict-aliasing',\n          ],\n          'WARNING_CFLAGS': [\n            '-Wall',\n            '-Wendif-labels',\n            '-Wno-unused-parameter',\n            # Don't warn about the \"struct foo f = {0};\" initialization pattern.\n            '-Wno-missing-field-initializers',\n            '-Wno-gnu-zero-variadic-macro-arguments',\n          ],\n        },\n        'conditions': [\n          ['werror==\"\"', {\n            'xcode_settings': {'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO'},\n          }, {\n            'xcode_settings': {'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES'},\n          }],\n          ['clang==1', {\n            'xcode_settings': {\n              'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0',\n              'CLANG_CXX_LANGUAGE_STANDARD': 'c++11',  # -std=c++11\n            },\n            'conditions': [\n              ['clang_xcode==0', {\n                'xcode_settings': {\n                  'CC': '<(clang_dir)/bin/clang',\n                  'LDPLUSPLUS': '<(clang_dir)/bin/clang++',\n                  'CLANG_CXX_LIBRARY': 'libc++'\n                },\n              }],\n              ['v8_target_arch==\"x64\" or v8_target_arch==\"arm64\" \\\n                or v8_target_arch==\"mips64el\"', {\n                'xcode_settings': {'WARNING_CFLAGS': ['-Wshorten-64-to-32']},\n              }],\n            ],\n          }],\n        ],\n        'target_conditions': [\n          ['_type!=\"static_library\"', {\n            'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']},\n          }],\n        ],  # target_conditions\n      },  # target_defaults\n    }],  # OS==\"mac\"\n    ['OS==\"android\"', {\n      'target_defaults': {\n        'defines': [\n          'ANDROID',\n        ],\n        'configurations': {\n          'Release': {\n            'cflags': [\n              '-fomit-frame-pointer',\n            ],\n          },  # Release\n        },  # configurations\n        'cflags': [ '-Wno-abi', '-Wall', '-W', '-Wno-unused-parameter'],\n        'cflags_cc': [ '-Wnon-virtual-dtor', '-fno-rtti', '-fno-exceptions',\n                       '-std=gnu++11' ],\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'cflags!': [\n              '-pthread',  # Not supported by Android toolchain.\n            ],\n            'cflags': [\n              '-ffunction-sections',\n              '-funwind-tables',\n              '-fstack-protector',\n              '-fno-short-enums',\n              '-finline-limit=64',\n              '-Wa,--noexecstack',\n              '--sysroot=<(android_sysroot)',\n            ],\n            'cflags_cc': [\n              '-isystem<(android_libcpp_include)',\n              '-isystem<(android_libcpp_abi_include)',\n              '-isystem<(android_support_include)',\n            ],\n            'defines': [\n              'ANDROID',\n              #'__GNU_SOURCE=1',  # Necessary for clone()\n              'HAVE_OFF64_T',\n              'HAVE_SYS_UIO_H',\n              'ANDROID_BINSIZE_HACK', # Enable temporary hacks to reduce binsize.\n              'ANDROID_NDK_VERSION=<(android_ndk_version)',\n            ],\n            'ldflags!': [\n              '-pthread',  # Not supported by Android toolchain.\n            ],\n            'ldflags': [\n              '-Wl,--no-undefined',\n              '--sysroot=<(android_sysroot)',\n              '-nostdlib',\n            ],\n            'libraries!': [\n                '-lrt',  # librt is built into Bionic.\n                # Not supported by Android toolchain.\n                # Where do these come from?  Can't find references in\n                # any Chromium gyp or gypi file.  Maybe they come from\n                # gyp itself?\n                '-lpthread', '-lnss3', '-lnssutil3', '-lsmime3', '-lplds4', '-lplc4', '-lnspr4',\n              ],\n              'libraries': [\n                '-l<(android_libcpp_library)',\n                '-latomic',\n                # Manually link the libgcc.a that the cross compiler uses.\n                '<!(<(android_toolchain)/*-gcc -print-libgcc-file-name)',\n                '-lc',\n                '-ldl',\n                '-lm',\n            ],\n            'conditions': [\n              ['target_arch == \"arm\"', {\n                'ldflags': [\n                  # Enable identical code folding to reduce size.\n                  '-Wl,--icf=safe',\n                ],\n              }],\n              ['target_arch==\"arm\" and arm_version==7', {\n                'cflags': [\n                  '-march=armv7-a',\n                  '-mtune=cortex-a8',\n                  '-mfpu=vfp3',\n                ],\n                'ldflags': [\n                  '-L<(android_libcpp_libs)/armeabi-v7a',\n                ],\n              }],\n              ['target_arch==\"arm\" and arm_version < 7', {\n                'ldflags': [\n                  '-L<(android_libcpp_libs)/armeabi',\n                ],\n              }],\n              ['target_arch==\"x64\"', {\n                'ldflags': [\n                  '-L<(android_libcpp_libs)/x86_64',\n                ],\n              }],\n              ['target_arch==\"arm64\"', {\n                'ldflags': [\n                  '-L<(android_libcpp_libs)/arm64-v8a',\n                ],\n              }],\n              ['target_arch==\"ia32\" or target_arch==\"x87\"', {\n                # The x86 toolchain currently has problems with stack-protector.\n                'cflags!': [\n                  '-fstack-protector',\n                ],\n                'cflags': [\n                  '-fno-stack-protector',\n                ],\n                'ldflags': [\n                  '-L<(android_libcpp_libs)/x86',\n                ],\n              }],\n              ['target_arch==\"mipsel\"', {\n                # The mips toolchain currently has problems with stack-protector.\n                'cflags!': [\n                  '-fstack-protector',\n                  '-U__linux__'\n                ],\n                'cflags': [\n                  '-fno-stack-protector',\n                ],\n                'ldflags': [\n                  '-L<(android_libcpp_libs)/mips',\n                ],\n              }],\n              ['(target_arch==\"arm\" or target_arch==\"arm64\" or target_arch==\"x64\" or target_arch==\"ia32\") and component!=\"shared_library\"', {\n                'cflags': [\n                  '-fPIE',\n                ],\n                'ldflags': [\n                  '-pie',\n                ],\n              }],\n            ],\n            'target_conditions': [\n              ['_type==\"executable\"', {\n                'conditions': [\n                  ['target_arch==\"arm64\" or target_arch==\"x64\"', {\n                    'ldflags': [\n                      '-Wl,-dynamic-linker,/system/bin/linker64',\n                    ],\n                  }, {\n                    'ldflags': [\n                      '-Wl,-dynamic-linker,/system/bin/linker',\n                    ],\n                  }]\n                ],\n                'ldflags': [\n                  '-Bdynamic',\n                  '-Wl,-z,nocopyreloc',\n                  # crtbegin_dynamic.o should be the last item in ldflags.\n                  '<(android_lib)/crtbegin_dynamic.o',\n                ],\n                'libraries': [\n                  # crtend_android.o needs to be the last item in libraries.\n                  # Do not add any libraries after this!\n                  '<(android_lib)/crtend_android.o',\n                ],\n              }],\n              ['_type==\"shared_library\"', {\n                'ldflags': [\n                  '-Wl,-shared,-Bsymbolic',\n                  '<(android_lib)/crtbegin_so.o',\n                ],\n              }],\n              ['_type==\"static_library\"', {\n                'ldflags': [\n                  # Don't export symbols from statically linked libraries.\n                  '-Wl,--exclude-libs=ALL',\n                ],\n              }],\n            ],\n          }],  # _toolset==\"target\"\n          # Settings for building host targets using the system toolchain.\n          ['_toolset==\"host\"', {\n            'cflags': [ '-pthread' ],\n            'ldflags': [ '-pthread' ],\n            'ldflags!': [\n              '-Wl,-z,noexecstack',\n              '-Wl,--gc-sections',\n              '-Wl,-O1',\n              '-Wl,--as-needed',\n            ],\n          }],\n        ],  # target_conditions\n      },  # target_defaults\n    }],  # OS==\"android\"\n    ['OS==\"android\" and clang==0', {\n      # Hardcode the compiler names in the Makefile so that\n      # it won't depend on the environment at make time.\n      'make_global_settings': [\n        ['LD', '<!(/bin/echo -n <(android_toolchain)/../*/bin/ld)'],\n        ['RANLIB', '<!(/bin/echo -n <(android_toolchain)/../*/bin/ranlib)'],\n        ['CC', '<!(/bin/echo -n <(android_toolchain)/*-gcc)'],\n        ['CXX', '<!(/bin/echo -n <(android_toolchain)/*-g++)'],\n        ['LD.host', '<(host_ld)'],\n        ['RANLIB.host', '<(host_ranlib)'],\n        ['CC.host', '<(host_cc)'],\n        ['CXX.host', '<(host_cxx)'],\n      ],\n    }],\n    ['clang!=1 and host_clang==1 and target_arch!=\"ia32\" and target_arch!=\"x64\"', {\n      'make_global_settings': [\n        ['CC.host', '<(clang_dir)/bin/clang'],\n        ['CXX.host', '<(clang_dir)/bin/clang++'],\n      ],\n    }],\n    ['clang==0 and host_clang==1 and target_arch!=\"ia32\" and target_arch!=\"x64\"', {\n      'target_conditions': [\n        ['_toolset==\"host\"', {\n          'cflags_cc': [ '-std=gnu++11', ],\n        }],\n      ],\n      'target_defaults': {\n        'target_conditions': [\n          ['_toolset==\"host\"', { 'cflags!': [ '-Wno-unused-local-typedefs' ]}],\n        ],\n      },\n    }],\n    ['clang==1 and \"<(GENERATOR)\"==\"ninja\"', {\n      # See http://crbug.com/110262\n      'target_defaults': {\n        'cflags': [ '-fcolor-diagnostics' ],\n        'xcode_settings': { 'OTHER_CFLAGS': [ '-fcolor-diagnostics' ] },\n      },\n    }],\n    ['clang==1 and ((OS!=\"mac\" and OS!=\"ios\") or clang_xcode==0) '\n        'and OS!=\"win\" and \"<(GENERATOR)\"==\"make\"', {\n      'make_global_settings': [\n        ['CC', '<(clang_dir)/bin/clang'],\n        ['CXX', '<(clang_dir)/bin/clang++'],\n        ['CC.host', '$(CC)'],\n        ['CXX.host', '$(CXX)'],\n      ],\n    }],\n    ['clang==1 and ((OS!=\"mac\" and OS!=\"ios\") or clang_xcode==0) '\n        'and OS!=\"win\" and \"<(GENERATOR)\"==\"ninja\"', {\n      'make_global_settings': [\n        ['CC', '<(clang_dir)/bin/clang'],\n        ['CXX', '<(clang_dir)/bin/clang++'],\n        ['CC.host', '$(CC)'],\n        ['CXX.host', '$(CXX)'],\n      ],\n    }],\n    ['clang==1 and OS==\"win\"', {\n      'make_global_settings': [\n        # On Windows, gyp's ninja generator only looks at CC.\n        ['CC', '<(clang_dir)/bin/clang-cl'],\n      ],\n    }],\n    ['OS==\"linux\" and target_arch==\"arm\" and host_arch!=\"arm\" and clang==0 and \"<(GENERATOR)\"==\"ninja\"', {\n      # Set default ARM cross tools on linux.  These can be overridden\n      # using CC,CXX,CC.host and CXX.host environment variables.\n      'make_global_settings': [\n        ['CC', '<!(which arm-linux-gnueabihf-gcc)'],\n        ['CXX', '<!(which arm-linux-gnueabihf-g++)'],\n        ['CC.host', '<(host_cc)'],\n        ['CXX.host', '<(host_cxx)'],\n      ],\n    }],\n    # TODO(yyanagisawa): supports GENERATOR==make\n    #  make generator doesn't support CC_wrapper without CC\n    #  in make_global_settings yet.\n    ['use_goma==1 and (\"<(GENERATOR)\"==\"ninja\" or clang==1)', {\n      'conditions': [\n        ['coverage==1', {\n          # Wrap goma with coverage wrapper.\n          'make_global_settings': [\n            ['CC_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],\n            ['CXX_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],\n            ['CC.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],\n            ['CXX.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],\n          ],\n        }, {\n          # Use only goma wrapper.\n          'make_global_settings': [\n            ['CC_wrapper', '<(gomadir)/gomacc'],\n            ['CXX_wrapper', '<(gomadir)/gomacc'],\n            ['CC.host_wrapper', '<(gomadir)/gomacc'],\n            ['CXX.host_wrapper', '<(gomadir)/gomacc'],\n          ],\n        }],\n      ],\n    }, {\n      'conditions': [\n        ['coverage==1', {\n          # Use only coverage wrapper.\n          'make_global_settings': [\n            ['CC_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],\n            ['CXX_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],\n            ['CC.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],\n            ['CXX.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],\n          ],\n        }],\n      ],\n    }],\n    ['use_lto==1', {\n      'target_defaults': {\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'cflags': [\n              '-flto',\n            ],\n          }],\n        ],\n      },\n    }],\n    ['use_lto==1 and clang==0', {\n      'target_defaults': {\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'cflags': [\n              '-ffat-lto-objects',\n            ],\n          }],\n        ],\n      },\n    }],\n    ['use_lto==1 and clang==1', {\n      'target_defaults': {\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'arflags': [\n              '--plugin', '<(clang_dir)/lib/LLVMgold.so',\n            ],\n            # Apply a lower optimization level with lto. Chromium does this\n            # for non-official builds only - a differentiation that doesn't\n            # exist in v8.\n            'ldflags': [\n              '-Wl,--plugin-opt,O1',\n            ],\n          }],\n        ],\n      },\n    }],\n    ['use_lto==1 and clang==0', {\n      'target_defaults': {\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'ldflags': [\n              '-flto=32',\n            ],\n          }],\n        ],\n      },\n    }],\n    ['use_lto==1 and clang==1', {\n      'target_defaults': {\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'ldflags': [\n              '-flto',\n            ],\n          }],\n        ],\n      },\n    }],\n    ['cfi_diag==1', {\n      'target_defaults': {\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'cflags': [\n              '-fno-sanitize-trap=cfi',\n              '-fno-sanitize-recover=cfi',\n            ],\n            'cflags_cc!': [\n              '-fno-rtti',\n            ],\n            'cflags!': [\n              '-fno-rtti',\n            ],\n            'ldflags': [\n              '-fno-sanitize-trap=cfi',\n              '-fno-sanitize-recover=cfi',\n            ],\n          }],\n        ],\n      },\n    }],\n    ['cfi_vptr==1', {\n      'target_defaults': {\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'cflags': [\n              '-fsanitize=cfi-vcall',\n              '-fsanitize=cfi-derived-cast',\n              '-fsanitize=cfi-unrelated-cast',\n              '-fsanitize-blacklist=<(cfi_blacklist)',\n            ],\n            'ldflags': [\n              '-fsanitize=cfi-vcall',\n              '-fsanitize=cfi-derived-cast',\n              '-fsanitize=cfi-unrelated-cast',\n            ],\n          }],\n        ],\n      },\n    }],\n  ],\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/toolchain.gypi",
    "content": "# Copyright 2013 the V8 project authors. All rights reserved.\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n#       notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n#       copyright notice, this list of conditions and the following\n#       disclaimer in the documentation and/or other materials provided\n#       with the distribution.\n#     * Neither the name of Google Inc. nor the names of its\n#       contributors may be used to endorse or promote products derived\n#       from this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# Shared definitions for all V8-related targets.\n\n{\n  'variables': {\n    'msvs_use_common_release': 0,\n    'clang%': 0,\n    'asan%': 0,\n    'lsan%': 0,\n    'msan%': 0,\n    'tsan%': 0,\n    'ubsan%': 0,\n    'ubsan_vptr%': 0,\n    'has_valgrind%': 0,\n    'coverage%': 0,\n    'v8_target_arch%': '<(target_arch)',\n    'v8_host_byteorder%': '<!(python -c \"import sys; print sys.byteorder\")',\n    'force_dynamic_crt%': 0,\n\n    # Setting 'v8_can_use_vfp32dregs' to 'true' will cause V8 to use the VFP\n    # registers d16-d31 in the generated code, both in the snapshot and for the\n    # ARM target. Leaving the default value of 'false' will avoid the use of\n    # these registers in the snapshot and use CPU feature probing when running\n    # on the target.\n    'v8_can_use_vfp32dregs%': 'false',\n    'arm_test_noprobe%': 'off',\n\n    # Similar to vfp but on MIPS.\n    'v8_can_use_fpu_instructions%': 'true',\n\n    # Similar to the ARM hard float ABI but on MIPS.\n    'v8_use_mips_abi_hardfloat%': 'true',\n\n    # Print to stdout on Android.\n    'v8_android_log_stdout%': 0,\n\n    # Force disable libstdc++ debug mode.\n    'disable_glibcxx_debug%': 0,\n\n    'v8_enable_backtrace%': 0,\n\n    # Enable profiling support. Only required on Windows.\n    'v8_enable_prof%': 0,\n\n    # Some versions of GCC 4.5 seem to need -fno-strict-aliasing.\n    'v8_no_strict_aliasing%': 0,\n\n    # Chrome needs this definition unconditionally. For standalone V8 builds,\n    # it's handled in gypfiles/standalone.gypi.\n    'want_separate_host_toolset%': 1,\n    'want_separate_host_toolset_mkpeephole%': 1,\n\n    # Toolset the shell binary should be compiled for. Possible values are\n    # 'host' and 'target'.\n    # The setting is ignored if want_separate_host_toolset is 0.\n    'v8_toolset_for_shell%': 'target',\n\n    'host_os%': '<(OS)',\n    'werror%': '-Werror',\n    # For a shared library build, results in \"libv8-<(soname_version).so\".\n    'soname_version%': '',\n\n    # Allow to suppress the array bounds warning (default is no suppression).\n    'wno_array_bounds%': '',\n\n    # Override where to find binutils\n    'binutils_dir%': '',\n\n    'conditions': [\n      ['OS==\"linux\" and host_arch==\"x64\"', {\n        'binutils_dir%': 'third_party/binutils/Linux_x64/Release/bin',\n      }],\n      ['OS==\"linux\" and host_arch==\"ia32\"', {\n        'binutils_dir%': 'third_party/binutils/Linux_ia32/Release/bin',\n      }],\n\n      # linux_use_bundled_gold: whether to use the gold linker binary checked\n      # into third_party/binutils.  Force this off via GYP_DEFINES when you\n      # are using a custom toolchain and need to control -B in ldflags.\n      # Do not use 32-bit gold on 32-bit hosts as it runs out address space\n      # for component=static_library builds.\n      ['((OS==\"linux\" or OS==\"android\") and (target_arch==\"x64\" or target_arch==\"arm\" or (target_arch==\"ia32\" and host_arch==\"x64\"))) or (OS==\"linux\" and target_arch==\"mipsel\")', {\n        'linux_use_bundled_gold%': 1,\n      }, {\n        'linux_use_bundled_gold%': 0,\n      }],\n      # linux_use_bundled_binutils: whether to use the binary binutils\n      # checked into third_party/binutils.  These are not multi-arch so cannot\n      # be used except on x86 and x86-64 (the only two architectures which\n      # are currently checke in).  Force this off via GYP_DEFINES when you\n      # are using a custom toolchain and need to control -B in cflags.\n      ['OS==\"linux\" and (target_arch==\"ia32\" or target_arch==\"x64\")', {\n        'linux_use_bundled_binutils%': 1,\n      }, {\n        'linux_use_bundled_binutils%': 0,\n      }],\n      # linux_use_gold_flags: whether to use build flags that rely on gold.\n      # On by default for x64 Linux.\n      ['OS==\"linux\" and target_arch==\"x64\"', {\n        'linux_use_gold_flags%': 1,\n      }, {\n        'linux_use_gold_flags%': 0,\n      }],\n    ],\n\n    # Link-Time Optimizations\n    'use_lto%': 0,\n\n    # Indicates if gcmole tools are downloaded by a hook.\n    'gcmole%': 0,\n  },\n  'conditions': [\n    ['host_arch==\"ia32\" or host_arch==\"x64\" or \\\n      host_arch==\"ppc\" or host_arch==\"ppc64\" or \\\n      host_arch==\"s390\" or host_arch==\"s390x\" or \\\n      clang==1', {\n      'variables': {\n        'host_cxx_is_biarch%': 1,\n       },\n     }, {\n      'variables': {\n        'host_cxx_is_biarch%': 0,\n      },\n    }],\n    ['target_arch==\"ia32\" or target_arch==\"x64\" or target_arch==\"x87\" or \\\n      target_arch==\"ppc\" or target_arch==\"ppc64\" or target_arch==\"s390\" or \\\n      target_arch==\"s390x\" or clang==1', {\n      'variables': {\n        'target_cxx_is_biarch%': 1,\n       },\n     }, {\n      'variables': {\n        'target_cxx_is_biarch%': 0,\n      },\n    }],\n  ],\n  'target_defaults': {\n    'conditions': [\n      ['v8_target_arch==\"arm\"', {\n        'defines': [\n          'V8_TARGET_ARCH_ARM',\n        ],\n        'conditions': [\n          [ 'arm_version==7 or arm_version==\"default\"', {\n            'defines': [\n              'CAN_USE_ARMV7_INSTRUCTIONS',\n            ],\n          }],\n          [ 'arm_fpu==\"vfpv3-d16\" or arm_fpu==\"default\"', {\n            'defines': [\n              'CAN_USE_VFP3_INSTRUCTIONS',\n            ],\n          }],\n          [ 'arm_fpu==\"vfpv3\"', {\n            'defines': [\n              'CAN_USE_VFP3_INSTRUCTIONS',\n              'CAN_USE_VFP32DREGS',\n            ],\n          }],\n          [ 'arm_fpu==\"neon\"', {\n            'defines': [\n              'CAN_USE_VFP3_INSTRUCTIONS',\n              'CAN_USE_VFP32DREGS',\n              'CAN_USE_NEON',\n            ],\n          }],\n          [ 'arm_test_noprobe==\"on\"', {\n            'defines': [\n              'ARM_TEST_NO_FEATURE_PROBE',\n            ],\n          }],\n        ],\n        'target_conditions': [\n          ['_toolset==\"host\"', {\n            'conditions': [\n              ['v8_target_arch==host_arch', {\n                # Host built with an Arm CXX compiler.\n                'conditions': [\n                  [ 'arm_version==7', {\n                    'cflags': ['-march=armv7-a',],\n                  }],\n                  [ 'arm_version==7 or arm_version==\"default\"', {\n                    'conditions': [\n                      [ 'arm_fpu!=\"default\"', {\n                        'cflags': ['-mfpu=<(arm_fpu)',],\n                      }],\n                    ],\n                  }],\n                  [ 'arm_float_abi!=\"default\"', {\n                    'cflags': ['-mfloat-abi=<(arm_float_abi)',],\n                  }],\n                  [ 'arm_thumb==1', {\n                    'cflags': ['-mthumb',],\n                  }],\n                  [ 'arm_thumb==0', {\n                    'cflags': ['-marm',],\n                  }],\n                ],\n              }, {\n                # 'v8_target_arch!=host_arch'\n                # Host not built with an Arm CXX compiler (simulator build).\n                'conditions': [\n                  [ 'arm_float_abi==\"hard\"', {\n                    'defines': [\n                      'USE_EABI_HARDFLOAT=1',\n                    ],\n                  }],\n                  [ 'arm_float_abi==\"softfp\" or arm_float_abi==\"default\"', {\n                    'defines': [\n                      'USE_EABI_HARDFLOAT=0',\n                    ],\n                  }],\n                ],\n              }],\n            ],\n          }],  # _toolset==\"host\"\n          ['_toolset==\"target\"', {\n            'conditions': [\n              ['v8_target_arch==target_arch', {\n                # Target built with an Arm CXX compiler.\n                'conditions': [\n                  [ 'arm_version==7', {\n                    'cflags': ['-march=armv7-a',],\n                  }],\n                  [ 'arm_version==7 or arm_version==\"default\"', {\n                    'conditions': [\n                      [ 'arm_fpu!=\"default\"', {\n                        'cflags': ['-mfpu=<(arm_fpu)',],\n                      }],\n                    ],\n                  }],\n                  [ 'arm_float_abi!=\"default\"', {\n                    'cflags': ['-mfloat-abi=<(arm_float_abi)',],\n                  }],\n                  [ 'arm_thumb==1', {\n                    'cflags': ['-mthumb',],\n                  }],\n                  [ 'arm_thumb==0', {\n                    'cflags': ['-marm',],\n                  }],\n                ],\n              }, {\n                # 'v8_target_arch!=target_arch'\n                # Target not built with an Arm CXX compiler (simulator build).\n                'conditions': [\n                  [ 'arm_float_abi==\"hard\"', {\n                    'defines': [\n                      'USE_EABI_HARDFLOAT=1',\n                    ],\n                  }],\n                  [ 'arm_float_abi==\"softfp\" or arm_float_abi==\"default\"', {\n                    'defines': [\n                      'USE_EABI_HARDFLOAT=0',\n                    ],\n                  }],\n                ],\n              }],\n              # Disable GCC LTO for v8\n              # v8 is optimized for speed. Because GCC LTO merges flags at link\n              # time, we disable LTO to prevent any -O2 flags from taking\n              # precedence over v8's -Os flag. However, LLVM LTO does not work\n              # this way so we keep LTO enabled under LLVM.\n              ['clang==0 and use_lto==1', {\n                'cflags!': [\n                  '-flto',\n                  '-ffat-lto-objects',\n                ],\n              }],\n            ],\n          }],  # _toolset==\"target\"\n        ],\n      }],  # v8_target_arch==\"arm\"\n      ['v8_target_arch==\"arm64\"', {\n        'defines': [\n          'V8_TARGET_ARCH_ARM64',\n        ],\n      }],\n      ['v8_target_arch==\"s390\" or v8_target_arch==\"s390x\"', {\n        'defines': [\n          'V8_TARGET_ARCH_S390',\n        ],\n        'conditions': [\n          ['v8_target_arch==\"s390x\"', {\n            'defines': [\n              'V8_TARGET_ARCH_S390X',\n            ],\n          }],\n          ['v8_host_byteorder==\"little\"', {\n            'defines': [\n              'V8_TARGET_ARCH_S390_LE_SIM',\n            ],\n          }],\n          ],\n      }],  # s390\n      ['v8_target_arch==\"ppc\" or v8_target_arch==\"ppc64\"', {\n        'defines': [\n          'V8_TARGET_ARCH_PPC',\n        ],\n        'conditions': [\n          ['v8_target_arch==\"ppc64\"', {\n            'defines': [\n              'V8_TARGET_ARCH_PPC64',\n            ],\n          }],\n          ['v8_host_byteorder==\"little\"', {\n            'defines': [\n              'V8_TARGET_ARCH_PPC_LE',\n            ],\n          }],\n          ['v8_host_byteorder==\"big\"', {\n            'defines': [\n              'V8_TARGET_ARCH_PPC_BE',\n            ],\n            'conditions': [\n              ['OS==\"aix\"', {\n                # Work around AIX ceil, trunc and round oddities.\n                'cflags': [ '-mcpu=power5+ -mfprnd' ],\n              }],\n              ['OS==\"aix\"', {\n                # Work around AIX assembler popcntb bug.\n                'cflags': [ '-mno-popcntb' ],\n              }],\n            ],\n          }],\n        ],\n      }],  # ppc\n      ['v8_target_arch==\"ia32\"', {\n        'defines': [\n          'V8_TARGET_ARCH_IA32',\n        ],\n      }],  # v8_target_arch==\"ia32\"\n      ['v8_target_arch==\"x87\"', {\n        'defines': [\n          'V8_TARGET_ARCH_X87',\n        ],\n        'cflags': ['-march=i586'],\n      }],  # v8_target_arch==\"x87\"\n      ['v8_target_arch==\"mips\" or v8_target_arch==\"mipsel\" \\\n        or v8_target_arch==\"mips64\" or v8_target_arch==\"mips64el\"', {\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'conditions': [\n              ['v8_target_arch==target_arch', {\n                # Target built with a Mips CXX compiler.\n                'variables': {\n                  'ldso_path%': '<!(/bin/echo -n $LDSO_PATH)',\n                  'ld_r_path%': '<!(/bin/echo -n $LD_R_PATH)',\n                },\n                'conditions': [\n                  ['ldso_path!=\"\"', {\n                    'ldflags': ['-Wl,--dynamic-linker=<(ldso_path)'],\n                  }],\n                  ['ld_r_path!=\"\"', {\n                    'ldflags': ['-Wl,--rpath=<(ld_r_path)'],\n                  }],\n                  [ 'clang==1', {\n                    'cflags': ['-integrated-as'],\n                  }],\n                  ['OS!=\"mac\"', {\n                    'defines': ['_MIPS_TARGET_HW',],\n                  }, {\n                    'defines': ['_MIPS_TARGET_SIMULATOR',],\n                  }],\n                ],\n              }, {\n                'defines': ['_MIPS_TARGET_SIMULATOR',],\n              }],\n            ],\n          }],  #'_toolset==\"target\"\n          ['_toolset==\"host\"', {\n            'conditions': [\n              ['v8_target_arch==target_arch and OS!=\"mac\"', {\n                'defines': ['_MIPS_TARGET_HW',],\n              }, {\n                'defines': ['_MIPS_TARGET_SIMULATOR',],\n              }],\n            ],\n          }],  #'_toolset==\"host\"\n        ],\n      }],\n      ['v8_target_arch==\"mips\"', {\n        'defines': [\n          'V8_TARGET_ARCH_MIPS',\n        ],\n        'conditions': [\n          [ 'v8_can_use_fpu_instructions==\"true\"', {\n            'defines': [\n              'CAN_USE_FPU_INSTRUCTIONS',\n            ],\n          }],\n          [ 'v8_use_mips_abi_hardfloat==\"true\"', {\n            'defines': [\n              '__mips_hard_float=1',\n              'CAN_USE_FPU_INSTRUCTIONS',\n            ],\n          }, {\n            'defines': [\n              '__mips_soft_float=1'\n            ]\n          }],\n        ],\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'conditions': [\n              ['v8_target_arch==target_arch', {\n                # Target built with a Mips CXX compiler.\n                'cflags': [\n                  '-EB',\n                  '-Wno-error=array-bounds',  # Workaround https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273\n                ],\n                'ldflags': ['-EB'],\n                'conditions': [\n                  [ 'v8_use_mips_abi_hardfloat==\"true\"', {\n                    'cflags': ['-mhard-float'],\n                    'ldflags': ['-mhard-float'],\n                  }, {\n                    'cflags': ['-msoft-float'],\n                    'ldflags': ['-msoft-float'],\n                  }],\n                  ['mips_arch_variant==\"r6\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32R6',\n                      'FPU_MODE_FP64',\n                    ],\n                    'cflags!': ['-mfp32', '-mfpxx'],\n                    'conditions': [\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips32r6'],\n                      }],\n                    ],\n                    'cflags': ['-mips32r6'],\n                    'ldflags': ['-mips32r6'],\n                  }],\n                  ['mips_arch_variant==\"r2\"', {\n                    'conditions': [\n                      [ 'mips_fpu_mode==\"fp64\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FP64',\n                        ],\n                        'cflags': ['-mfp64'],\n                      }],\n                      ['mips_fpu_mode==\"fpxx\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FPXX',\n                        ],\n                        'cflags': ['-mfpxx'],\n                      }],\n                      ['mips_fpu_mode==\"fp32\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FP32',\n                        ],\n                        'cflags': ['-mfp32'],\n                      }],\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips32r2'],\n                      }],\n                    ],\n                    'cflags': ['-mips32r2'],\n                    'ldflags': ['-mips32r2'],\n                  }],\n                  ['mips_arch_variant==\"r1\"', {\n                    'defines': [\n                      'FPU_MODE_FP32',\n                    ],\n                    'cflags!': ['-mfp64', '-mfpxx'],\n                    'conditions': [\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips32'],\n                      }],\n                    ],\n                    'cflags': ['-mips32'],\n                    'ldflags': ['-mips32'],\n                  }],\n                  ['mips_arch_variant==\"rx\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32RX',\n                      'FPU_MODE_FPXX',\n                    ],\n                    'cflags!': ['-mfp64', '-mfp32'],\n                    'conditions': [\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips32'],\n                      }],\n                    ],\n                    'cflags': ['-mips32', '-mfpxx'],\n                    'ldflags': ['-mips32'],\n                  }],\n                ],\n              }, {\n                # 'v8_target_arch!=target_arch'\n                # Target not built with an MIPS CXX compiler (simulator build).\n                'conditions': [\n                  ['mips_arch_variant==\"r6\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32R6',\n                      'FPU_MODE_FP64',\n                    ],\n                  }],\n                  ['mips_arch_variant==\"r2\"', {\n                    'conditions': [\n                      [ 'mips_fpu_mode==\"fp64\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FP64',\n                        ],\n                      }],\n                      ['mips_fpu_mode==\"fpxx\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FPXX',\n                        ],\n                      }],\n                      ['mips_fpu_mode==\"fp32\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FP32',\n                        ],\n                      }],\n                    ],\n                  }],\n                  ['mips_arch_variant==\"r1\"', {\n                    'defines': [\n                      'FPU_MODE_FP32',\n                    ],\n                  }],\n                  ['mips_arch_variant==\"rx\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32RX',\n                      'FPU_MODE_FPXX',\n                    ],\n                  }],\n                ],\n              }],\n            ],\n          }],  #_toolset==\"target\"\n          ['_toolset==\"host\"', {\n            'conditions': [\n              ['mips_arch_variant==\"rx\"', {\n                'defines': [\n                  '_MIPS_ARCH_MIPS32RX',\n                  'FPU_MODE_FPXX',\n                ],\n              }],\n              ['mips_arch_variant==\"r6\"', {\n                'defines': [\n                  '_MIPS_ARCH_MIPS32R6',\n                  'FPU_MODE_FP64',\n                ],\n              }],\n              ['mips_arch_variant==\"r2\"', {\n                'conditions': [\n                  ['mips_fpu_mode==\"fp64\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32R2',\n                      'FPU_MODE_FP64',\n                    ],\n                  }],\n                  ['mips_fpu_mode==\"fpxx\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32R2',\n                      'FPU_MODE_FPXX',\n                    ],\n                  }],\n                  ['mips_fpu_mode==\"fp32\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32R2',\n                      'FPU_MODE_FP32'\n                    ],\n                  }],\n                ],\n              }],\n              ['mips_arch_variant==\"r1\"', {\n                'defines': ['FPU_MODE_FP32',],\n              }],\n            ]\n          }],  #_toolset==\"host\"\n        ],\n      }],  # v8_target_arch==\"mips\"\n      ['v8_target_arch==\"mipsel\"', {\n        'defines': [\n          'V8_TARGET_ARCH_MIPS',\n        ],\n        'conditions': [\n          [ 'v8_can_use_fpu_instructions==\"true\"', {\n            'defines': [\n              'CAN_USE_FPU_INSTRUCTIONS',\n            ],\n          }],\n          [ 'v8_use_mips_abi_hardfloat==\"true\"', {\n            'defines': [\n              '__mips_hard_float=1',\n              'CAN_USE_FPU_INSTRUCTIONS',\n            ],\n          }, {\n            'defines': [\n              '__mips_soft_float=1'\n            ],\n          }],\n        ],\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'conditions': [\n              ['v8_target_arch==target_arch', {\n                # Target built with a Mips CXX compiler.\n                'cflags': [\n                  '-EL',\n                  '-Wno-error=array-bounds',  # Workaround https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273\n                ],\n                'ldflags': ['-EL'],\n                'conditions': [\n                  [ 'v8_use_mips_abi_hardfloat==\"true\"', {\n                    'cflags': ['-mhard-float'],\n                    'ldflags': ['-mhard-float'],\n                  }, {\n                    'cflags': ['-msoft-float'],\n                    'ldflags': ['-msoft-float'],\n                  }],\n                  ['mips_arch_variant==\"r6\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32R6',\n                      'FPU_MODE_FP64',\n                    ],\n                    'cflags!': ['-mfp32', '-mfpxx'],\n                    'conditions': [\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips32r6'],\n                      }],\n                    ],\n                    'cflags': ['-mips32r6'],\n                    'ldflags': ['-mips32r6'],\n                  }],\n                  ['mips_arch_variant==\"r2\"', {\n                    'conditions': [\n                      [ 'mips_fpu_mode==\"fp64\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FP64',\n                        ],\n                        'cflags': ['-mfp64'],\n                      }],\n                      ['mips_fpu_mode==\"fpxx\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FPXX',\n                        ],\n                        'cflags': ['-mfpxx'],\n                      }],\n                      ['mips_fpu_mode==\"fp32\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FP32',\n                        ],\n                        'cflags': ['-mfp32'],\n                      }],\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips32r2'],\n                      }],\n                    ],\n                    'cflags': ['-mips32r2'],\n                    'ldflags': ['-mips32r2'],\n                  }],\n                  ['mips_arch_variant==\"r1\"', {\n                    'defines': [\n                      'FPU_MODE_FP32',\n                    ],\n                    'cflags!': ['-mfp64', '-mfpxx'],\n                    'conditions': [\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips32'],\n                      }],\n                    ],\n                    'cflags': ['-mips32'],\n                    'ldflags': ['-mips32'],\n                  }],\n                  ['mips_arch_variant==\"rx\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32RX',\n                      'FPU_MODE_FPXX',\n                    ],\n                    'cflags!': ['-mfp64', '-mfp32'],\n                    'conditions': [\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips32'],\n                      }],\n                    ],\n                    'cflags': ['-mips32', '-mfpxx'],\n                    'ldflags': ['-mips32'],\n                  }],\n                  ['mips_arch_variant==\"loongson\"', {\n                    'defines': [\n                      '_MIPS_ARCH_LOONGSON',\n                      'FPU_MODE_FP32',\n                    ],\n                    'cflags!': ['-mfp64', '-mfpxx'],\n                    'conditions': [\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips3'],\n                      }],\n                    ],\n                    'cflags': ['-mips3', '-mfp32'],\n                  }],\n                ],\n              }, {\n                # 'v8_target_arch!=target_arch'\n                # Target not built with an MIPS CXX compiler (simulator build).\n                'conditions': [\n                  ['mips_arch_variant==\"r6\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32R6',\n                      'FPU_MODE_FP64',\n                    ],\n                  }],\n                  ['mips_arch_variant==\"r2\"', {\n                    'conditions': [\n                      [ 'mips_fpu_mode==\"fp64\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FP64',\n                        ],\n                      }],\n                      ['mips_fpu_mode==\"fpxx\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FPXX',\n                        ],\n                      }],\n                      ['mips_fpu_mode==\"fp32\"', {\n                        'defines': [\n                          '_MIPS_ARCH_MIPS32R2',\n                          'FPU_MODE_FP32',\n                        ],\n                      }],\n                    ],\n                  }],\n                  ['mips_arch_variant==\"r1\"', {\n                    'defines': [\n                      'FPU_MODE_FP32',\n                    ],\n                  }],\n                  ['mips_arch_variant==\"rx\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32RX',\n                      'FPU_MODE_FPXX',\n                    ],\n                  }],\n                  ['mips_arch_variant==\"loongson\"', {\n                    'defines': [\n                      '_MIPS_ARCH_LOONGSON',\n                      'FPU_MODE_FP32',\n                    ],\n                  }],\n                ],\n              }],\n            ],\n          }], #_toolset==\"target\n          ['_toolset==\"host\"', {\n            'conditions': [\n              ['mips_arch_variant==\"rx\"', {\n                'defines': [\n                  '_MIPS_ARCH_MIPS32RX',\n                  'FPU_MODE_FPXX',\n                ],\n              }],\n              ['mips_arch_variant==\"r6\"', {\n                'defines': [\n                  '_MIPS_ARCH_MIPS32R6',\n                  'FPU_MODE_FP64',\n                ],\n              }],\n              ['mips_arch_variant==\"r2\"', {\n                'conditions': [\n                  ['mips_fpu_mode==\"fp64\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32R2',\n                      'FPU_MODE_FP64',\n                    ],\n                  }],\n                  ['mips_fpu_mode==\"fpxx\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32R2',\n                      'FPU_MODE_FPXX',\n                    ],\n                  }],\n                  ['mips_fpu_mode==\"fp32\"', {\n                    'defines': [\n                      '_MIPS_ARCH_MIPS32R2',\n                      'FPU_MODE_FP32'\n                    ],\n                  }],\n                ],\n              }],\n              ['mips_arch_variant==\"r1\"', {\n                'defines': ['FPU_MODE_FP32',],\n              }],\n              ['mips_arch_variant==\"loongson\"', {\n                'defines': [\n                  '_MIPS_ARCH_LOONGSON',\n                  'FPU_MODE_FP32',\n                ],\n              }],\n            ]\n          }],\n        ],\n      }],  # v8_target_arch==\"mipsel\"\n      ['v8_target_arch==\"mips64el\" or v8_target_arch==\"mips64\"', {\n        'defines': [\n          'V8_TARGET_ARCH_MIPS64',\n        ],\n        'conditions': [\n          [ 'v8_can_use_fpu_instructions==\"true\"', {\n            'defines': [\n              'CAN_USE_FPU_INSTRUCTIONS',\n            ],\n          }],\n          [ 'v8_host_byteorder==\"little\"', {\n            'defines': [\n              'V8_TARGET_ARCH_MIPS64_LE',\n            ],\n          }],\n          [ 'v8_host_byteorder==\"big\"', {\n            'defines': [\n              'V8_TARGET_ARCH_MIPS64_BE',\n            ],\n          }],\n          [ 'v8_use_mips_abi_hardfloat==\"true\"', {\n            'defines': [\n              '__mips_hard_float=1',\n              'CAN_USE_FPU_INSTRUCTIONS',\n            ],\n          }, {\n            'defines': [\n              '__mips_soft_float=1'\n            ],\n          }],\n         ],\n        'target_conditions': [\n          ['_toolset==\"target\"', {\n            'conditions': [\n              ['v8_target_arch==target_arch', {\n                'cflags': [\n                  '-Wno-error=array-bounds',  # Workaround https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273\n                ],\n                'conditions': [\n                  ['v8_target_arch==\"mips64el\"', {\n                    'cflags': ['-EL'],\n                    'ldflags': ['-EL'],\n                  }],\n                  ['v8_target_arch==\"mips64\"', {\n                    'cflags': ['-EB'],\n                    'ldflags': ['-EB'],\n                  }],\n                  [ 'v8_use_mips_abi_hardfloat==\"true\"', {\n                    'cflags': ['-mhard-float'],\n                    'ldflags': ['-mhard-float'],\n                  }, {\n                    'cflags': ['-msoft-float'],\n                    'ldflags': ['-msoft-float'],\n                  }],\n                  ['mips_arch_variant==\"r6\"', {\n                    'defines': ['_MIPS_ARCH_MIPS64R6',],\n                    'conditions': [\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips64r6'],\n                      }],\n                    ],\n                    'cflags': ['-mips64r6', '-mabi=64'],\n                    'ldflags': ['-mips64r6', '-mabi=64'],\n                  }],\n                  ['mips_arch_variant==\"r2\"', {\n                    'defines': ['_MIPS_ARCH_MIPS64R2',],\n                    'conditions': [\n                      [ 'clang==0', {\n                        'cflags': ['-Wa,-mips64r2'],\n                      }],\n                    ],\n                    'cflags': ['-mips64r2', '-mabi=64'],\n                    'ldflags': ['-mips64r2', '-mabi=64'],\n                  }],\n                ],\n              }, {\n                # 'v8_target_arch!=target_arch'\n                # Target not built with an MIPS CXX compiler (simulator build).\n                'conditions': [\n                  ['mips_arch_variant==\"r6\"', {\n                    'defines': ['_MIPS_ARCH_MIPS64R6',],\n                  }],\n                  ['mips_arch_variant==\"r2\"', {\n                    'defines': ['_MIPS_ARCH_MIPS64R2',],\n                  }],\n                ],\n              }],\n            ],\n          }],  #'_toolset==\"target\"\n          ['_toolset==\"host\"', {\n            'conditions': [\n              ['mips_arch_variant==\"r6\"', {\n                'defines': ['_MIPS_ARCH_MIPS64R6',],\n              }],\n              ['mips_arch_variant==\"r2\"', {\n                'defines': ['_MIPS_ARCH_MIPS64R2',],\n              }],\n            ],\n          }],  #'_toolset==\"host\"\n        ],\n      }],  # v8_target_arch==\"mips64el\"\n      ['v8_target_arch==\"x64\"', {\n        'defines': [\n          'V8_TARGET_ARCH_X64',\n        ],\n        'xcode_settings': {\n          'ARCHS': [ 'x86_64' ],\n        },\n        'msvs_settings': {\n          'VCLinkerTool': {\n            'StackReserveSize': '2097152',\n          },\n        },\n        'msvs_configuration_platform': 'x64',\n      }],  # v8_target_arch==\"x64\"\n      ['v8_target_arch==\"x32\"', {\n        'defines': [\n          # x32 port shares the source code with x64 port.\n          'V8_TARGET_ARCH_X64',\n          'V8_TARGET_ARCH_32_BIT',\n        ],\n        'cflags': [\n          '-mx32',\n          # Inhibit warning if long long type is used.\n          '-Wno-long-long',\n        ],\n        'ldflags': [\n          '-mx32',\n        ],\n      }],  # v8_target_arch==\"x32\"\n      ['linux_use_gold_flags==1', {\n        # Newer gccs and clangs support -fuse-ld, use the flag to force gold\n        # selection.\n        # gcc -- http://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Optimize-Options.html\n        'ldflags': [ '-fuse-ld=gold', ],\n      }],\n      ['linux_use_bundled_binutils==1', {\n        'cflags': [\n          '-B<!(cd <(DEPTH) && pwd -P)/<(binutils_dir)',\n        ],\n      }],\n      ['linux_use_bundled_gold==1', {\n        # Put our binutils, which contains gold in the search path. We pass\n        # the path to gold to the compiler. gyp leaves unspecified what the\n        # cwd is when running the compiler, so the normal gyp path-munging\n        # fails us. This hack gets the right path.\n        'ldflags': [\n          '-B<!(cd <(DEPTH) && pwd -P)/<(binutils_dir)',\n        ],\n      }],\n      ['OS==\"win\"', {\n        'defines': [\n          'WIN32',\n        ],\n        # 4351: VS 2005 and later are warning us that they've fixed a bug\n        #       present in VS 2003 and earlier.\n        'msvs_disabled_warnings': [4351],\n        'msvs_configuration_attributes': {\n          'OutputDirectory': '<(DEPTH)\\\\build\\\\$(ConfigurationName)',\n          'IntermediateDirectory': '$(OutDir)\\\\obj\\\\$(ProjectName)',\n          'CharacterSet': '1',\n        },\n      }],\n      ['OS==\"win\" and v8_target_arch==\"ia32\"', {\n        'msvs_settings': {\n          'VCCLCompilerTool': {\n            # Ensure no surprising artifacts from 80bit double math with x86.\n            'AdditionalOptions': ['/arch:SSE2'],\n          },\n        },\n      }],\n      ['OS==\"win\" and v8_enable_prof==1', {\n        'msvs_settings': {\n          'VCLinkerTool': {\n            'GenerateMapFile': 'true',\n          },\n        },\n      }],\n      ['(OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or OS==\"solaris\" \\\n         or OS==\"netbsd\" or OS==\"mac\" or OS==\"android\" or OS==\"qnx\") and \\\n        v8_target_arch==\"ia32\"', {\n        'cflags': [\n          '-msse2',\n          '-mfpmath=sse',\n          '-mmmx',  # Allows mmintrin.h for MMX intrinsics.\n        ],\n      }],\n      ['(OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or OS==\"solaris\" \\\n         or OS==\"netbsd\" or OS==\"mac\" or OS==\"android\" or OS==\"qnx\") and \\\n        (v8_target_arch==\"arm\" or v8_target_arch==\"ia32\" or \\\n         v8_target_arch==\"x87\" or v8_target_arch==\"mips\" or \\\n         v8_target_arch==\"mipsel\" or v8_target_arch==\"ppc\" or \\\n         v8_target_arch==\"s390\")', {\n        'target_conditions': [\n          ['_toolset==\"host\"', {\n            'conditions': [\n              ['host_cxx_is_biarch==1', {\n                'conditions': [\n                  ['host_arch==\"s390\" or host_arch==\"s390x\"', {\n                    'cflags': [ '-m31' ],\n                    'ldflags': [ '-m31' ]\n                  },{\n                   'cflags': [ '-m32' ],\n                   'ldflags': [ '-m32' ]\n                  }],\n                ],\n              }],\n            ],\n            'xcode_settings': {\n              'ARCHS': [ 'i386' ],\n            },\n          }],\n          ['_toolset==\"target\"', {\n            'conditions': [\n              ['target_cxx_is_biarch==1', {\n                'conditions': [\n                  ['host_arch==\"s390\" or host_arch==\"s390x\"', {\n                    'cflags': [ '-m31' ],\n                    'ldflags': [ '-m31' ]\n                  },{\n                   'cflags': [ '-m32' ],\n                   'ldflags': [ '-m32' ],\n                  }],\n                ],\n              }],\n            ],\n            'xcode_settings': {\n              'ARCHS': [ 'i386' ],\n            },\n          }],\n        ],\n      }],\n      ['(OS==\"linux\" or OS==\"android\") and \\\n        (v8_target_arch==\"x64\" or v8_target_arch==\"arm64\" or \\\n         v8_target_arch==\"ppc64\" or v8_target_arch==\"s390x\")', {\n        'target_conditions': [\n          ['_toolset==\"host\"', {\n            'conditions': [\n              ['host_cxx_is_biarch==1', {\n                'cflags': [ '-m64' ],\n                'ldflags': [ '-m64' ]\n              }],\n             ],\n           }],\n           ['_toolset==\"target\"', {\n             'conditions': [\n               ['target_cxx_is_biarch==1', {\n                 'cflags': [ '-m64' ],\n                 'ldflags': [ '-m64' ],\n               }],\n             ]\n           }],\n         ],\n      }],\n      ['OS==\"android\" and v8_android_log_stdout==1', {\n        'defines': [\n          'V8_ANDROID_LOG_STDOUT',\n        ],\n      }],\n      ['OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or OS==\"solaris\" \\\n         or OS==\"netbsd\" or OS==\"qnx\" or OS==\"aix\"', {\n        'conditions': [\n          [ 'v8_no_strict_aliasing==1', {\n            'cflags': [ '-fno-strict-aliasing' ],\n          }],\n        ],  # conditions\n      }],\n      ['OS==\"solaris\"', {\n        'defines': [ '__C99FEATURES__=1' ],  # isinf() etc.\n      }],\n      ['OS==\"freebsd\" or OS==\"openbsd\"', {\n        'cflags': [ '-I/usr/local/include' ],\n      }],\n      ['OS==\"netbsd\"', {\n        'cflags': [ '-I/usr/pkg/include' ],\n      }],\n      ['OS==\"aix\"', {\n        'defines': [\n          # Support for malloc(0)\n          '_LINUX_SOURCE_COMPAT=1',\n          '__STDC_FORMAT_MACROS',\n          '_ALL_SOURCE=1'],\n        'conditions': [\n          [ 'v8_target_arch==\"ppc\"', {\n            'ldflags': [ '-Wl,-bmaxdata:0x60000000/dsa' ],\n          }],\n          [ 'v8_target_arch==\"ppc64\"', {\n            'cflags': [ '-maix64' ],\n            'ldflags': [ '-maix64 -Wl,-bbigtoc' ],\n          }],\n        ],\n      }],\n    ],  # conditions\n    'configurations': {\n      # Abstract configuration for v8_optimized_debug == 0.\n      'DebugBase0': {\n        'abstract': 1,\n        'msvs_settings': {\n          'VCCLCompilerTool': {\n            'Optimization': '0',\n            'conditions': [\n              ['component==\"shared_library\" or force_dynamic_crt==1', {\n                'RuntimeLibrary': '3',  # /MDd\n              }, {\n                'RuntimeLibrary': '1',  # /MTd\n              }],\n            ],\n          },\n          'VCLinkerTool': {\n            'LinkIncremental': '2',\n          },\n        },\n        'variables': {\n          'v8_enable_slow_dchecks%': 1,\n        },\n        'conditions': [\n          ['OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or OS==\"netbsd\" or \\\n            OS==\"qnx\" or OS==\"aix\"', {\n            'cflags!': [\n              '-O3',\n              '-O2',\n              '-O1',\n              '-Os',\n            ],\n            'cflags': [\n              '-fdata-sections',\n              '-ffunction-sections',\n            ],\n          }],\n          ['OS==\"mac\"', {\n            'xcode_settings': {\n               'GCC_OPTIMIZATION_LEVEL': '0',  # -O0\n            },\n          }],\n          ['v8_enable_slow_dchecks==1', {\n            'defines': [\n              'ENABLE_SLOW_DCHECKS',\n            ],\n          }],\n        ],\n      },  # DebugBase0\n      # Abstract configuration for v8_optimized_debug == 1.\n      'DebugBase1': {\n        'abstract': 1,\n        'msvs_settings': {\n          'VCCLCompilerTool': {\n            'Optimization': '2',\n            'InlineFunctionExpansion': '2',\n            'EnableIntrinsicFunctions': 'true',\n            'FavorSizeOrSpeed': '0',\n            'StringPooling': 'true',\n            'BasicRuntimeChecks': '0',\n            'conditions': [\n              ['component==\"shared_library\" or force_dynamic_crt==1', {\n                'RuntimeLibrary': '3',  #/MDd\n              }, {\n                'RuntimeLibrary': '1',  #/MTd\n              }],\n            ],\n          },\n          'VCLinkerTool': {\n            'LinkIncremental': '1',\n            'OptimizeReferences': '2',\n            'EnableCOMDATFolding': '2',\n          },\n        },\n        'variables': {\n          'v8_enable_slow_dchecks%': 0,\n        },\n        'conditions': [\n          ['OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or OS==\"netbsd\" or \\\n            OS==\"qnx\" or OS==\"aix\"', {\n            'cflags!': [\n              '-O0',\n              '-O1',\n              '-Os',\n            ],\n            'cflags': [\n              '-fdata-sections',\n              '-ffunction-sections',\n            ],\n            'conditions': [\n              # Don't use -O3 with sanitizers.\n              ['asan==0 and msan==0 and lsan==0 \\\n                and tsan==0 and ubsan==0 and ubsan_vptr==0', {\n                'cflags': ['-O3'],\n                'cflags!': ['-O2'],\n                }, {\n                'cflags': ['-O2'],\n                'cflags!': ['-O3'],\n              }],\n            ],\n          }],\n          ['OS==\"mac\"', {\n            'xcode_settings': {\n              'GCC_OPTIMIZATION_LEVEL': '3',  # -O3\n              'GCC_STRICT_ALIASING': 'YES',\n            },\n          }],\n          ['v8_enable_slow_dchecks==1', {\n            'defines': [\n              'ENABLE_SLOW_DCHECKS',\n            ],\n          }],\n        ],\n      },  # DebugBase1\n      # Common settings for the Debug configuration.\n      'DebugBaseCommon': {\n        'abstract': 1,\n        'defines': [\n          'ENABLE_DISASSEMBLER',\n          'V8_ENABLE_CHECKS',\n          'OBJECT_PRINT',\n          'VERIFY_HEAP',\n          'DEBUG',\n          'TRACE_MAPS'\n        ],\n        'conditions': [\n          ['OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or OS==\"netbsd\" or \\\n            OS==\"qnx\" or OS==\"aix\"', {\n            'cflags': [ '-Woverloaded-virtual', '<(wno_array_bounds)', ],\n          }],\n          ['OS==\"linux\" and v8_enable_backtrace==1', {\n            # Support for backtrace_symbols.\n            'ldflags': [ '-rdynamic' ],\n          }],\n          ['OS==\"linux\" and disable_glibcxx_debug==0', {\n            # Enable libstdc++ debugging facilities to help catch problems\n            # early, see http://crbug.com/65151 .\n            'defines': ['_GLIBCXX_DEBUG=1',],\n          }],\n          ['OS==\"aix\"', {\n            'ldflags': [ '-Wl,-bbigtoc' ],\n            'conditions': [\n              ['v8_target_arch==\"ppc64\"', {\n                'cflags': [ '-maix64 -mcmodel=large' ],\n              }],\n            ],\n          }],\n          ['OS==\"android\"', {\n            'variables': {\n              'android_full_debug%': 1,\n            },\n            'conditions': [\n              ['android_full_debug==0', {\n                # Disable full debug if we want a faster v8 in a debug build.\n                # TODO(2304): pass DISABLE_DEBUG_ASSERT instead of hiding DEBUG.\n                'defines!': [\n                  'DEBUG',\n                  'ENABLE_SLOW_DCHECKS',\n                ],\n              }],\n            ],\n          }],\n          # TODO(pcc): Re-enable in LTO builds once we've fixed the intermittent\n          # link failures (crbug.com/513074).\n          ['linux_use_gold_flags==1 and use_lto==0', {\n            'target_conditions': [\n              ['_toolset==\"target\"', {\n                'ldflags': [\n                  # Experimentation found that using four linking threads\n                  # saved ~20% of link time.\n                  # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36\n                  # Only apply this to the target linker, since the host\n                  # linker might not be gold, but isn't used much anyway.\n                  '-Wl,--threads',\n                  '-Wl,--thread-count=4',\n                ],\n              }],\n            ],\n          }],\n        ],\n      },  # DebugBaseCommon\n      'Debug': {\n        'inherit_from': ['DebugBaseCommon'],\n        'conditions': [\n          ['v8_optimized_debug==0', {\n            'inherit_from': ['DebugBase0'],\n          }, {\n            'inherit_from': ['DebugBase1'],\n          }],\n        ],\n      },  # Debug\n      'ReleaseBase': {\n        'abstract': 1,\n        'variables': {\n          'v8_enable_slow_dchecks%': 0,\n        },\n        'conditions': [\n          ['OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or OS==\"netbsd\" \\\n            or OS==\"aix\"', {\n            'cflags!': [\n              '-Os',\n            ],\n            'cflags': [\n              '-fdata-sections',\n              '-ffunction-sections',\n              '<(wno_array_bounds)',\n            ],\n            'conditions': [\n              # Don't use -O3 with sanitizers.\n              ['asan==0 and msan==0 and lsan==0 \\\n                and tsan==0 and ubsan==0 and ubsan_vptr==0', {\n                'cflags': ['-O3'],\n                'cflags!': ['-O2'],\n              }, {\n                'cflags': ['-O2'],\n                'cflags!': ['-O3'],\n              }],\n            ],\n          }],\n          ['OS==\"android\"', {\n            'cflags!': [\n              '-O3',\n              '-Os',\n            ],\n            'cflags': [\n              '-fdata-sections',\n              '-ffunction-sections',\n              '-O2',\n            ],\n          }],\n          ['OS==\"mac\"', {\n            'xcode_settings': {\n              'GCC_OPTIMIZATION_LEVEL': '3',  # -O3\n\n              # -fstrict-aliasing.  Mainline gcc\n              # enables this at -O2 and above,\n              # but Apple gcc does not unless it\n              # is specified explicitly.\n              'GCC_STRICT_ALIASING': 'YES',\n            },\n          }],  # OS==\"mac\"\n          ['OS==\"win\"', {\n            'msvs_settings': {\n              'VCCLCompilerTool': {\n                'Optimization': '2',\n                'InlineFunctionExpansion': '2',\n                'EnableIntrinsicFunctions': 'true',\n                'FavorSizeOrSpeed': '0',\n                'StringPooling': 'true',\n                'conditions': [\n                  ['component==\"shared_library\" or force_dynamic_crt==1', {\n                    'RuntimeLibrary': '2',  #/MD\n                  }, {\n                    'RuntimeLibrary': '0',  #/MT\n                  }],\n                ],\n              },\n              'VCLinkerTool': {\n                'LinkIncremental': '1',\n                'OptimizeReferences': '2',\n                'EnableCOMDATFolding': '2',\n              },\n            },\n          }],  # OS==\"win\"\n          ['v8_enable_slow_dchecks==1', {\n            'defines': [\n              'ENABLE_SLOW_DCHECKS',\n            ],\n          }],\n        ],  # conditions\n      },  # Release\n      'Release': {\n        'inherit_from': ['ReleaseBase'],\n      },  # Debug\n      'conditions': [\n        [ 'OS==\"win\"', {\n          # TODO(bradnelson): add a gyp mechanism to make this more graceful.\n          'Debug_x64': {\n            'inherit_from': ['DebugBaseCommon'],\n            'conditions': [\n              ['v8_optimized_debug==0', {\n                'inherit_from': ['DebugBase0'],\n              }, {\n                'inherit_from': ['DebugBase1'],\n              }],\n            ],\n          },\n          'Release_x64': {\n            'inherit_from': ['ReleaseBase'],\n          },\n        }],\n      ],\n    },  # configurations\n  },  # target_defaults\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Python/tornado-httpserver.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009 Facebook\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# 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, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\n\"\"\"A non-blocking, single-threaded HTTP server.\n\nTypical applications have little direct interaction with the `HTTPServer`\nclass except to start a server at the beginning of the process\n(and even that is often done indirectly via `tornado.web.Application.listen`).\n\nThis module also defines the `HTTPRequest` class which is exposed via\n`tornado.web.RequestHandler.request`.\n\"\"\"\n\nfrom __future__ import absolute_import, division, with_statement\n\nimport Cookie\nimport logging\nimport socket\nimport time\n\nfrom tornado.escape import utf8, native_str, parse_qs_bytes\nfrom tornado import httputil\nfrom tornado import iostream\nfrom tornado.netutil import TCPServer\nfrom tornado import stack_context\nfrom tornado.util import b, bytes_type\n\ntry:\n    import ssl  # Python 2.6+\nexcept ImportError:\n    ssl = None\n\n\nclass HTTPServer(TCPServer):\n    r\"\"\"A non-blocking, single-threaded HTTP server.\n\n    A server is defined by a request callback that takes an HTTPRequest\n    instance as an argument and writes a valid HTTP response with\n    `HTTPRequest.write`. `HTTPRequest.finish` finishes the request (but does\n    not necessarily close the connection in the case of HTTP/1.1 keep-alive\n    requests). A simple example server that echoes back the URI you\n    requested::\n\n        import httpserver\n        import ioloop\n\n        def handle_request(request):\n           message = \"You requested %s\\n\" % request.uri\n           request.write(\"HTTP/1.1 200 OK\\r\\nContent-Length: %d\\r\\n\\r\\n%s\" % (\n                         len(message), message))\n           request.finish()\n\n        http_server = httpserver.HTTPServer(handle_request)\n        http_server.listen(8888)\n        ioloop.IOLoop.instance().start()\n\n    `HTTPServer` is a very basic connection handler. Beyond parsing the\n    HTTP request body and headers, the only HTTP semantics implemented\n    in `HTTPServer` is HTTP/1.1 keep-alive connections. We do not, however,\n    implement chunked encoding, so the request callback must provide a\n    ``Content-Length`` header or implement chunked encoding for HTTP/1.1\n    requests for the server to run correctly for HTTP/1.1 clients. If\n    the request handler is unable to do this, you can provide the\n    ``no_keep_alive`` argument to the `HTTPServer` constructor, which will\n    ensure the connection is closed on every request no matter what HTTP\n    version the client is using.\n\n    If ``xheaders`` is ``True``, we support the ``X-Real-Ip`` and ``X-Scheme``\n    headers, which override the remote IP and HTTP scheme for all requests.\n    These headers are useful when running Tornado behind a reverse proxy or\n    load balancer.\n\n    `HTTPServer` can serve SSL traffic with Python 2.6+ and OpenSSL.\n    To make this server serve SSL traffic, send the ssl_options dictionary\n    argument with the arguments required for the `ssl.wrap_socket` method,\n    including \"certfile\" and \"keyfile\"::\n\n       HTTPServer(applicaton, ssl_options={\n           \"certfile\": os.path.join(data_dir, \"mydomain.crt\"),\n           \"keyfile\": os.path.join(data_dir, \"mydomain.key\"),\n       })\n\n    `HTTPServer` initialization follows one of three patterns (the\n    initialization methods are defined on `tornado.netutil.TCPServer`):\n\n    1. `~tornado.netutil.TCPServer.listen`: simple single-process::\n\n            server = HTTPServer(app)\n            server.listen(8888)\n            IOLoop.instance().start()\n\n       In many cases, `tornado.web.Application.listen` can be used to avoid\n       the need to explicitly create the `HTTPServer`.\n\n    2. `~tornado.netutil.TCPServer.bind`/`~tornado.netutil.TCPServer.start`:\n       simple multi-process::\n\n            server = HTTPServer(app)\n            server.bind(8888)\n            server.start(0)  # Forks multiple sub-processes\n            IOLoop.instance().start()\n\n       When using this interface, an `IOLoop` must *not* be passed\n       to the `HTTPServer` constructor.  `start` will always start\n       the server on the default singleton `IOLoop`.\n\n    3. `~tornado.netutil.TCPServer.add_sockets`: advanced multi-process::\n\n            sockets = tornado.netutil.bind_sockets(8888)\n            tornado.process.fork_processes(0)\n            server = HTTPServer(app)\n            server.add_sockets(sockets)\n            IOLoop.instance().start()\n\n       The `add_sockets` interface is more complicated, but it can be\n       used with `tornado.process.fork_processes` to give you more\n       flexibility in when the fork happens.  `add_sockets` can\n       also be used in single-process servers if you want to create\n       your listening sockets in some way other than\n       `tornado.netutil.bind_sockets`.\n\n    \"\"\"\n    def __init__(self, request_callback, no_keep_alive=False, io_loop=None,\n                 xheaders=False, ssl_options=None, **kwargs):\n        self.request_callback = request_callback\n        self.no_keep_alive = no_keep_alive\n        self.xheaders = xheaders\n        TCPServer.__init__(self, io_loop=io_loop, ssl_options=ssl_options,\n                           **kwargs)\n\n    def handle_stream(self, stream, address):\n        HTTPConnection(stream, address, self.request_callback,\n                       self.no_keep_alive, self.xheaders)\n\n\nclass _BadRequestException(Exception):\n    \"\"\"Exception class for malformed HTTP requests.\"\"\"\n    pass\n\n\nclass HTTPConnection(object):\n    \"\"\"Handles a connection to an HTTP client, executing HTTP requests.\n\n    We parse HTTP headers and bodies, and execute the request callback\n    until the HTTP conection is closed.\n    \"\"\"\n    def __init__(self, stream, address, request_callback, no_keep_alive=False,\n                 xheaders=False):\n        self.stream = stream\n        self.address = address\n        self.request_callback = request_callback\n        self.no_keep_alive = no_keep_alive\n        self.xheaders = xheaders\n        self._request = None\n        self._request_finished = False\n        # Save stack context here, outside of any request.  This keeps\n        # contexts from one request from leaking into the next.\n        self._header_callback = stack_context.wrap(self._on_headers)\n        self.stream.read_until(b(\"\\r\\n\\r\\n\"), self._header_callback)\n        self._write_callback = None\n\n    def write(self, chunk, callback=None):\n        \"\"\"Writes a chunk of output to the stream.\"\"\"\n        assert self._request, \"Request closed\"\n        if not self.stream.closed():\n            self._write_callback = stack_context.wrap(callback)\n            self.stream.write(chunk, self._on_write_complete)\n\n    def finish(self):\n        \"\"\"Finishes the request.\"\"\"\n        assert self._request, \"Request closed\"\n        self._request_finished = True\n        if not self.stream.writing():\n            self._finish_request()\n\n    def _on_write_complete(self):\n        if self._write_callback is not None:\n            callback = self._write_callback\n            self._write_callback = None\n            callback()\n        # _on_write_complete is enqueued on the IOLoop whenever the\n        # IOStream's write buffer becomes empty, but it's possible for\n        # another callback that runs on the IOLoop before it to\n        # simultaneously write more data and finish the request.  If\n        # there is still data in the IOStream, a future\n        # _on_write_complete will be responsible for calling\n        # _finish_request.\n        if self._request_finished and not self.stream.writing():\n            self._finish_request()\n\n    def _finish_request(self):\n        if self.no_keep_alive:\n            disconnect = True\n        else:\n            connection_header = self._request.headers.get(\"Connection\")\n            if connection_header is not None:\n                connection_header = connection_header.lower()\n            if self._request.supports_http_1_1():\n                disconnect = connection_header == \"close\"\n            elif (\"Content-Length\" in self._request.headers\n                    or self._request.method in (\"HEAD\", \"GET\")):\n                disconnect = connection_header != \"keep-alive\"\n            else:\n                disconnect = True\n        self._request = None\n        self._request_finished = False\n        if disconnect:\n            self.stream.close()\n            return\n        self.stream.read_until(b(\"\\r\\n\\r\\n\"), self._header_callback)\n\n    def _on_headers(self, data):\n        try:\n            data = native_str(data.decode('latin1'))\n            eol = data.find(\"\\r\\n\")\n            start_line = data[:eol]\n            try:\n                method, uri, version = start_line.split(\" \")\n            except ValueError:\n                raise _BadRequestException(\"Malformed HTTP request line\")\n            if not version.startswith(\"HTTP/\"):\n                raise _BadRequestException(\"Malformed HTTP version in HTTP Request-Line\")\n            headers = httputil.HTTPHeaders.parse(data[eol:])\n\n            # HTTPRequest wants an IP, not a full socket address\n            if getattr(self.stream.socket, 'family', socket.AF_INET) in (\n                socket.AF_INET, socket.AF_INET6):\n                # Jython 2.5.2 doesn't have the socket.family attribute,\n                # so just assume IP in that case.\n                remote_ip = self.address[0]\n            else:\n                # Unix (or other) socket; fake the remote address\n                remote_ip = '0.0.0.0'\n\n            self._request = HTTPRequest(\n                connection=self, method=method, uri=uri, version=version,\n                headers=headers, remote_ip=remote_ip)\n\n            content_length = headers.get(\"Content-Length\")\n            if content_length:\n                content_length = int(content_length)\n                if content_length > self.stream.max_buffer_size:\n                    raise _BadRequestException(\"Content-Length too long\")\n                if headers.get(\"Expect\") == \"100-continue\":\n                    self.stream.write(b(\"HTTP/1.1 100 (Continue)\\r\\n\\r\\n\"))\n                self.stream.read_bytes(content_length, self._on_request_body)\n                return\n\n            self.request_callback(self._request)\n        except _BadRequestException, e:\n            logging.info(\"Malformed HTTP request from %s: %s\",\n                         self.address[0], e)\n            self.stream.close()\n            return\n\n    def _on_request_body(self, data):\n        self._request.body = data\n        content_type = self._request.headers.get(\"Content-Type\", \"\")\n        if self._request.method in (\"POST\", \"PATCH\", \"PUT\"):\n            if content_type.startswith(\"application/x-www-form-urlencoded\"):\n                arguments = parse_qs_bytes(native_str(self._request.body))\n                for name, values in arguments.iteritems():\n                    values = [v for v in values if v]\n                    if values:\n                        self._request.arguments.setdefault(name, []).extend(\n                            values)\n            elif content_type.startswith(\"multipart/form-data\"):\n                fields = content_type.split(\";\")\n                for field in fields:\n                    k, sep, v = field.strip().partition(\"=\")\n                    if k == \"boundary\" and v:\n                        httputil.parse_multipart_form_data(\n                            utf8(v), data,\n                            self._request.arguments,\n                            self._request.files)\n                        break\n                else:\n                    logging.warning(\"Invalid multipart/form-data\")\n        self.request_callback(self._request)\n\n\nclass HTTPRequest(object):\n    \"\"\"A single HTTP request.\n\n    All attributes are type `str` unless otherwise noted.\n\n    .. attribute:: method\n\n       HTTP request method, e.g. \"GET\" or \"POST\"\n\n    .. attribute:: uri\n\n       The requested uri.\n\n    .. attribute:: path\n\n       The path portion of `uri`\n\n    .. attribute:: query\n\n       The query portion of `uri`\n\n    .. attribute:: version\n\n       HTTP version specified in request, e.g. \"HTTP/1.1\"\n\n    .. attribute:: headers\n\n       `HTTPHeader` dictionary-like object for request headers.  Acts like\n       a case-insensitive dictionary with additional methods for repeated\n       headers.\n\n    .. attribute:: body\n\n       Request body, if present, as a byte string.\n\n    .. attribute:: remote_ip\n\n       Client's IP address as a string.  If `HTTPServer.xheaders` is set,\n       will pass along the real IP address provided by a load balancer\n       in the ``X-Real-Ip`` header\n\n    .. attribute:: protocol\n\n       The protocol used, either \"http\" or \"https\".  If `HTTPServer.xheaders`\n       is set, will pass along the protocol used by a load balancer if\n       reported via an ``X-Scheme`` header.\n\n    .. attribute:: host\n\n       The requested hostname, usually taken from the ``Host`` header.\n\n    .. attribute:: arguments\n\n       GET/POST arguments are available in the arguments property, which\n       maps arguments names to lists of values (to support multiple values\n       for individual names). Names are of type `str`, while arguments\n       are byte strings.  Note that this is different from\n       `RequestHandler.get_argument`, which returns argument values as\n       unicode strings.\n\n    .. attribute:: files\n\n       File uploads are available in the files property, which maps file\n       names to lists of :class:`HTTPFile`.\n\n    .. attribute:: connection\n\n       An HTTP request is attached to a single HTTP connection, which can\n       be accessed through the \"connection\" attribute. Since connections\n       are typically kept open in HTTP/1.1, multiple requests can be handled\n       sequentially on a single connection.\n    \"\"\"\n    def __init__(self, method, uri, version=\"HTTP/1.0\", headers=None,\n                 body=None, remote_ip=None, protocol=None, host=None,\n                 files=None, connection=None):\n        self.method = method\n        self.uri = uri\n        self.version = version\n        self.headers = headers or httputil.HTTPHeaders()\n        self.body = body or \"\"\n        if connection and connection.xheaders:\n            # Squid uses X-Forwarded-For, others use X-Real-Ip\n            self.remote_ip = self.headers.get(\n                \"X-Real-Ip\", self.headers.get(\"X-Forwarded-For\", remote_ip))\n            if not self._valid_ip(self.remote_ip):\n                self.remote_ip = remote_ip\n            # AWS uses X-Forwarded-Proto\n            self.protocol = self.headers.get(\n                \"X-Scheme\", self.headers.get(\"X-Forwarded-Proto\", protocol))\n            if self.protocol not in (\"http\", \"https\"):\n                self.protocol = \"http\"\n        else:\n            self.remote_ip = remote_ip\n            if protocol:\n                self.protocol = protocol\n            elif connection and isinstance(connection.stream,\n                                           iostream.SSLIOStream):\n                self.protocol = \"https\"\n            else:\n                self.protocol = \"http\"\n        self.host = host or self.headers.get(\"Host\") or \"127.0.0.1\"\n        self.files = files or {}\n        self.connection = connection\n        self._start_time = time.time()\n        self._finish_time = None\n\n        self.path, sep, self.query = uri.partition('?')\n        arguments = parse_qs_bytes(self.query)\n        self.arguments = {}\n        for name, values in arguments.iteritems():\n            values = [v for v in values if v]\n            if values:\n                self.arguments[name] = values\n\n    def supports_http_1_1(self):\n        \"\"\"Returns True if this request supports HTTP/1.1 semantics\"\"\"\n        return self.version == \"HTTP/1.1\"\n\n    @property\n    def cookies(self):\n        \"\"\"A dictionary of Cookie.Morsel objects.\"\"\"\n        if not hasattr(self, \"_cookies\"):\n            self._cookies = Cookie.SimpleCookie()\n            if \"Cookie\" in self.headers:\n                try:\n                    self._cookies.load(\n                        native_str(self.headers[\"Cookie\"]))\n                except Exception:\n                    self._cookies = {}\n        return self._cookies\n\n    def write(self, chunk, callback=None):\n        \"\"\"Writes the given chunk to the response stream.\"\"\"\n        assert isinstance(chunk, bytes_type)\n        self.connection.write(chunk, callback=callback)\n\n    def finish(self):\n        \"\"\"Finishes this HTTP request on the open connection.\"\"\"\n        self.connection.finish()\n        self._finish_time = time.time()\n\n    def full_url(self):\n        \"\"\"Reconstructs the full URL for this request.\"\"\"\n        return self.protocol + \"://\" + self.host + self.uri\n\n    def request_time(self):\n        \"\"\"Returns the amount of time it took for this request to execute.\"\"\"\n        if self._finish_time is None:\n            return time.time() - self._start_time\n        else:\n            return self._finish_time - self._start_time\n\n    def get_ssl_certificate(self):\n        \"\"\"Returns the client's SSL certificate, if any.\n\n        To use client certificates, the HTTPServer must have been constructed\n        with cert_reqs set in ssl_options, e.g.::\n\n            server = HTTPServer(app,\n                ssl_options=dict(\n                    certfile=\"foo.crt\",\n                    keyfile=\"foo.key\",\n                    cert_reqs=ssl.CERT_REQUIRED,\n                    ca_certs=\"cacert.crt\"))\n\n        The return value is a dictionary, see SSLSocket.getpeercert() in\n        the standard library for more details.\n        http://docs.python.org/library/ssl.html#sslsocket-objects\n        \"\"\"\n        try:\n            return self.connection.stream.socket.getpeercert()\n        except ssl.SSLError:\n            return None\n\n    def __repr__(self):\n        attrs = (\"protocol\", \"host\", \"method\", \"uri\", \"version\", \"remote_ip\",\n                 \"body\")\n        args = \", \".join([\"%s=%r\" % (n, getattr(self, n)) for n in attrs])\n        return \"%s(%s, headers=%s)\" % (\n            self.__class__.__name__, args, dict(self.headers))\n\n    def _valid_ip(self, ip):\n        try:\n            res = socket.getaddrinfo(ip, 0, socket.AF_UNSPEC,\n                                     socket.SOCK_STREAM,\n                                     0, socket.AI_NUMERICHOST)\n            return bool(res)\n        except socket.gaierror, e:\n            if e.args[0] == socket.EAI_NONAME:\n                return False\n            raise\n        return True\n"
  },
  {
    "path": "src/test/resources/samples/langs/QML/common.qbs",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2015 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing\n**\n** This file is part of the Qt Build Suite.\n**\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms and\n** conditions see http://www.qt.io/terms-conditions. For further information\n** use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 or version 3 as published by the Free\n** Software Foundation and appearing in the file LICENSE.LGPLv21 and\n** LICENSE.LGPLv3 included in the packaging of this file.  Please review the\n** following information to ensure the GNU Lesser General Public License\n** requirements will be met: https://www.gnu.org/licenses/lgpl.html and\n** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n**\n** In addition, as a special exception, The Qt Company gives you certain additional\n** rights.  These rights are described in The Qt Company LGPL Exception\n** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.\n**\n****************************************************************************/\n\nimport qbs 1.0\nimport qbs.FileInfo\nimport qbs.ModUtils\n\nModule {\n    property string buildVariant: \"debug\"\n    property bool enableDebugCode: buildVariant == \"debug\"\n    property bool debugInformation: (buildVariant == \"debug\")\n    property string optimization: (buildVariant == \"debug\" ? \"none\" : \"fast\")\n    readonly property stringList hostOS: undefined // set internally\n    property string hostOSVersion: {\n        if (hostOS && hostOS.contains(\"osx\")) {\n            return getNativeSetting(\"/System/Library/CoreServices/ServerVersion.plist\", \"ProductVersion\") ||\n                   getNativeSetting(\"/System/Library/CoreServices/SystemVersion.plist\", \"ProductVersion\");\n        } else if (hostOS && hostOS.contains(\"windows\")) {\n            var version = getNativeSetting(\"HKEY_LOCAL_MACHINE\\\\Software\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\", \"CurrentVersion\");\n            return version + \".\" + hostOSBuildVersion;\n        }\n    }\n\n    property string hostOSBuildVersion: {\n        if (hostOS.contains(\"osx\")) {\n            return getNativeSetting(\"/System/Library/CoreServices/ServerVersion.plist\", \"ProductBuildVersion\") ||\n                   getNativeSetting(\"/System/Library/CoreServices/SystemVersion.plist\", \"ProductBuildVersion\");\n        } else if (hostOS.contains(\"windows\")) {\n            return getNativeSetting(\"HKEY_LOCAL_MACHINE\\\\Software\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\", \"CurrentBuildNumber\");\n        }\n    }\n\n    readonly property var hostOSVersionParts: hostOSVersion ? hostOSVersion.split('.').map(function(item) { return parseInt(item, 10); }) : []\n    readonly property int hostOSVersionMajor: hostOSVersionParts[0] || 0\n    readonly property int hostOSVersionMinor: hostOSVersionParts[1] || 0\n    readonly property int hostOSVersionPatch: hostOSVersionParts[2] || 0\n\n    property stringList targetOS: hostOS\n    property string pathListSeparator: hostOS.contains(\"windows\") ? \";\" : \":\"\n    property string pathSeparator: hostOS.contains(\"windows\") ? \"\\\\\" : \"/\"\n    property string profile\n    property stringList toolchain\n    property string architecture\n    property bool install: false\n    property string installSourceBase\n    readonly property string installRoot: undefined\n    property string installDir\n    property string installPrefix: \"\"\n    property path sysroot\n\n    PropertyOptions {\n        name: \"buildVariant\"\n        allowedValues: ['debug', 'release']\n        description: \"name of the build variant\"\n    }\n\n    PropertyOptions {\n        name: \"optimization\"\n        allowedValues: ['none', 'fast', 'small']\n        description: \"optimization level\"\n    }\n\n    validate: {\n        var validator = new ModUtils.PropertyValidator(\"qbs\");\n        validator.setRequiredProperty(\"architecture\", architecture,\n                                      \"you might want to re-run 'qbs-setup-toolchains'\");\n        validator.setRequiredProperty(\"hostOS\", hostOS);\n        validator.setRequiredProperty(\"targetOS\", targetOS);\n        if (hostOS && (hostOS.contains(\"windows\") || hostOS.contains(\"osx\"))) {\n            validator.setRequiredProperty(\"hostOSVersion\", hostOSVersion,\n                                          \"could not detect host operating system version; \" +\n                                          \"verify that system files and registry keys have not \" +\n                                          \"been modified.\");\n            if (hostOSVersion)\n                validator.addVersionValidator(\"hostOSVersion\", hostOSVersion, 2, 4);\n\n            validator.setRequiredProperty(\"hostOSBuildVersion\", hostOSBuildVersion,\n                                          \"could not detect host operating system build version; \" +\n                                          \"verify that system files or registry have not been \" +\n                                          \"tampered with.\");\n        }\n\n        validator.addCustomValidator(\"architecture\", architecture, function (value) {\n            return architecture === canonicalArchitecture(architecture);\n        }, \"'\" + architecture + \"' is invalid. You must use the canonical name '\" +\n        canonicalArchitecture(architecture) + \"'\");\n\n        validator.validate();\n    }\n\n    // private properties\n    property var commonRunEnvironment: {\n        var env = {};\n        if (targetOS.contains(\"windows\")) {\n            env[\"PATH\"] = [\n                FileInfo.joinPaths(installRoot, installPrefix)\n            ];\n        } else if (hostOS.contains(\"darwin\") && targetOS.contains(\"darwin\")) {\n            env[\"DYLD_FRAMEWORK_PATH\"] = [\n                FileInfo.joinPaths(installRoot, installPrefix, \"Library\", \"Frameworks\"),\n                FileInfo.joinPaths(installRoot, installPrefix, \"lib\"),\n                FileInfo.joinPaths(installRoot, installPrefix)\n            ].join(pathListSeparator);\n\n            env[\"DYLD_LIBRARY_PATH\"] = [\n                FileInfo.joinPaths(installRoot, installPrefix, \"lib\"),\n                FileInfo.joinPaths(installRoot, installPrefix, \"Library\", \"Frameworks\"),\n                FileInfo.joinPaths(installRoot, installPrefix)\n            ].join(pathListSeparator);\n\n            if (targetOS.contains(\"ios-simulator\") && sysroot) {\n                env[\"DYLD_ROOT_PATH\"] = [sysroot];\n            }\n        } else if (hostOS.contains(\"unix\") && targetOS.contains(\"unix\")) {\n            env[\"LD_LIBRARY_PATH\"] = [\n                FileInfo.joinPaths(installRoot, installPrefix, \"lib\")\n            ];\n        }\n\n        return env;\n    }\n\n    // internal properties\n    readonly property string version: [versionMajor, versionMinor, versionPatch].join(\".\")\n    readonly property int versionMajor: undefined // set internally\n    readonly property int versionMinor: undefined // set internally\n    readonly property int versionPatch: undefined // set internally\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/QMake/complex.pro",
    "content": "# This QMake file is complex, as it usese\n# boolean operators and function calls\n\nQT += core gui\ngreaterThan(QT_MAJOR_VERSION, 4): QT += widgets\n\n# We could use some OpenGL right now\ncontains(QT_CONFIG, opengl) | contains(QT_CONFIG, opengles2) {\n   QT += opengl\n} else {\n   DEFINES += QT_NO_OPENGL\n}\n\nTEMPLATE = app\nwin32 {\n    TARGET = BlahApp\n    RC_FILE = Resources/winres.rc\n}\n!win32 { TARGET = blahapp }\n\n# Let's add a PRI file!\ninclude(functions.pri)\n\nSOURCES += file.cpp\n\nHEADERS  += file.h\n\nFORMS    += file.ui\n\nRESOURCES += res.qrc\n"
  },
  {
    "path": "src/test/resources/samples/langs/QMake/functions.pri",
    "content": "# QMake include file that calls some functions\n# and does nothing else...\n\nexists(.git/HEAD) {\n    system(git rev-parse HEAD >rev.txt)\n} else {\n    system(echo ThisIsNotAGitRepo >rev.txt)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/QMake/qmake",
    "content": "#!/usr/bin/qmake\nmessage(This is QMake.)\n"
  },
  {
    "path": "src/test/resources/samples/langs/QMake/simple.pro",
    "content": "# Simple QMake file\n\nCONFIG += qt\nQT += core gui\nTEMPLATE = app\nTARGET = simpleapp\n\nSOURCES += file.cpp \\\n    file2.c \\\n    This/Is/Folder/file3.cpp\n\nHEADERS += file.h \\\n    file2.h \\\n    This/Is/Folder/file3.h\n\nFORMS += This/Is/Folder/file3.ui \\\n    Test.ui\n"
  },
  {
    "path": "src/test/resources/samples/langs/R/R-qgis-extension.rsx",
    "content": "##polyg=vector\n##numpoints=number 10\n##output=output vector\n##[Example scripts]=group\npts=spsample(polyg,numpoints,type=\"regular\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/R/df.residual.r",
    "content": "\ndf.residual.mira <- function(object, ...) {\n    fit <- object$analyses[[1]]\n    return(df.residual(fit))\n}\n\ndf.residual.lme <- function(object, ...) {\n    return(object$fixDF[[\"X\"]][1])\n}\n\ndf.residual.mer <- function(object, ...) {\n    return(sum(object@dims[2:4] * c(1, -1, -1)) + 1)\n}\n\ndf.residual.default <- function(object, q = 1.3, ...) {\n    df <- object$df.residual\n    if (!is.null(df)) \n        return(df)\n    \n    mk <- try(c <- coef(object), silent = TRUE)\n    mn <- try(f <- fitted(object), silent = TRUE)\n    if (inherits(mk, \"try-error\") | inherits(mn, \"try-error\")) \n        return(NULL)\n    n <- ifelse(is.data.frame(f) | is.matrix(f), nrow(f), length(f))\n    k <- length(c)\n    if (k == 0 | n == 0) \n        return(NULL)\n    return(max(1, n - q * k))\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/R/filenames/expr-dist",
    "content": "#!/usr/bin/env Rscript\n\n# Copyright (c) 2013 Daniel S. Standage, released under MIT license\n#\n# expr-dist: plot distributions of expression values before and after\n#            normalization; visually confirm that normalization worked\n#            as expected\n#\n# Program input is a matrix of expression values, each row corresponding to a\n# molecule (gene, transcript, etc) and each row corresponding to that molecule's\n# expression level or abundance. The program expects the rows and columns to be\n# named, and was tested primarily on output produced by the\n# 'rsem-generate-data-matrix' script distributed with the RSEM package.\n#\n# The program plots the distributions of the logged expression values by sample\n# as provided, then normalizes the values, and finally plots the distribution of\n# the logged normalized expression values by sample. The expectation is that all\n# samples' distributions will have a similar shape but different medians prior\n# to normalization, and that post normalization they will all have an identical\n# median to facilitate cross-sample comparison.\n\n\n# MedianNorm function borrowed from the EBSeq library version 1.1.6\n# See http://www.bioconductor.org/packages/devel/bioc/html/EBSeq.html\nMedianNorm <- function(data)\n{\n  geomeans <- exp( rowMeans(log(data)) )\n  apply(data, 2, function(cnts) median((cnts/geomeans)[geomeans > 0]))\n}\n\nlibrary(\"getopt\")\nprint_usage <- function(file=stderr())\n{\n  cat(\"\nexpr-dist: see source code for full description\nUsage: expr-dist [options] < expr-matrix.txt\n  Options:\n    -h|--help:          print this help message and exit\n    -o|--out: STRING    prefix for output files; default is 'expr-dist'\n    -r|--res: INT       resolution (dpi) of generated graphics; default is 150\n    -t|--height: INT    height (pixels) of generated graphics; default is 1200\n    -w|--width: INT     width (pixels) of generated graphics; default is 1200\n    -y|--ylim: REAL     the visible range of the Y axis depends on the first\n                        distribution plotted; if other distributions are getting\n                        cut off, use this setting to override the default\\n\\n\")\n}\n\nspec <- matrix( c(\"help\",   'h', 0, \"logical\",\n                  \"out\",    'o', 1, \"character\",\n                  \"res\",    'r', 1, \"integer\",\n                  \"height\", 't', 1, \"integer\",\n                  \"width\",  'w', 1, \"integer\",\n                  \"ylim\",   'y', 1, \"double\"),\n                byrow=TRUE, ncol=4)\nopt  <- getopt(spec)\nif(!is.null(opt$help))\n{\n  print_usage(file=stdout())\n  q(status=1)\n}\nif(is.null(opt$height)) { opt$height <- 1200           }\nif(is.null(opt$out))    { opt$out    <- \"expr-dist\"    }\nif(is.null(opt$res))    { opt$res    <- 150            }\nif(is.null(opt$width))  { opt$width  <- 1200           }\nif(!is.null(opt$ylim))  { opt$ylim   <- c(0, opt$ylim) }\n\n# Load data, determine number of samples\ndata  <- read.table(file(\"stdin\"), header=TRUE, sep=\"\\t\", quote=\"\")\nnsamp <- dim(data)[2] - 1\ndata  <- data[,1:nsamp+1]\n\n# Plot distribution of expression values before normalization\noutfile <- sprintf(\"%s-median.png\", opt$out)\npng(outfile, height=opt$height, width=opt$width, res=opt$res)\nh <- hist(log(data[,1]), plot=FALSE)\nplot(h$mids, h$density, type=\"l\", col=rainbow(nsamp)[1], main=\"\",\n     xlab=\"Log expression value\", ylab=\"Proportion of molecules\", ylim=opt$ylim)\nfor(i in 2:nsamp)\n{\n  h <- hist(log(data[,i]), plot=FALSE)\n  lines(h$mids, h$density, col=rainbow(nsamp)[i])\n}\ndevnum <- dev.off()\n\n# Normalize by median\nsize.factors <- MedianNorm(data.matrix(data))\ndata.norm <- t(apply(data, 1, function(x){ x / size.factors }))\n\n# Plot distribution of normalized expression values\noutfile <- sprintf(\"%s-median-norm.png\", opt$out)\npng(outfile, height=opt$height, width=opt$width, res=opt$res)\nh <- hist(log(data.norm[,1]), plot=FALSE)\nplot(h$mids, h$density, type=\"l\", col=rainbow(nsamp)[1], main=\"\",\n     xlab=\"Log normalized expression value\", ylab=\"Proportion of molecules\",\n     ylim=opt$ylim)\nfor(i in 2:nsamp)\n{\n  h <- hist(log(data.norm[,i]), plot=FALSE)\n  lines(h$mids, h$density, col=rainbow(nsamp)[i])\n}\ndevnum <- dev.off()\n"
  },
  {
    "path": "src/test/resources/samples/langs/R/git-punchcard",
    "content": "#! /usr/bin/env Rscript\n# vim: filetype=r:\n\nParseDates <- function(lines) {\n  dates <- matrix(unlist(strsplit(lines, \" +\")), ncol=6, byrow=TRUE)\n  days  <- dates[,1]\n  times <- dates[,4]\n  hours <- matrix(unlist(strsplit(times, \":\")), ncol=3, byrow=TRUE)[,1]\n  all.days  <- c(\"Sun\", \"Sat\", \"Fri\", \"Thu\", \"Wed\", \"Tue\", \"Mon\")\n  all.hours <- 0:23\n  data.frame( Day  = factor(days , levels=all.days)\n            , Hour = factor(hours, levels=all.hours)\n            )\n}\n\nMain <- function() {\n  lines <- system(\"git log --format=%ad\", intern=TRUE)\n  punchcard <- as.data.frame(table(ParseDates(lines)))\n  punchcard <-\n    ( ggplot2::ggplot(punchcard, ggplot2::aes(y=Day, x=Hour))\n    + ggplot2::geom_point(ggplot2::aes(size=Freq))\n    + ggplot2::scale_size(range=c(0, 15))\n    )\n  ggplot2::ggsave( filename = \"punchcard.png\"\n                 , plot     = punchcard\n                 , width    = 10\n                 , height   = 5\n                 )\n}\n\nMain()\n"
  },
  {
    "path": "src/test/resources/samples/langs/R/hello-r.R",
    "content": "hello <- function() {\n    print(\"hello, world!\")\n}\nhello()\n"
  },
  {
    "path": "src/test/resources/samples/langs/R/import.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/hello.R\n\\name{import}\n\\alias{import}\n\\title{Import a module into the current scope}\n\\usage{\nimport(module, attach, attach_operators = TRUE)\n}\n\\arguments{\n\\item{module}{an identifier specifying the full module path}\n\n\\item{attach}{if \\code{TRUE}, attach the newly loaded module to the object\nsearch path (see \\code{Details})}\n\n\\item{attach_operators}{if \\code{TRUE}, attach operators of module to the\nobject search path, even if \\code{attach} is \\code{FALSE}}\n}\n\\value{\nthe loaded module environment (invisible)\n}\n\\description{\n\\code{module = import('module')} imports a specified module and makes its\ncode available via the environment-like object it returns.\n}\n\\details{\nModules are loaded in an isolated environment which is returned, and\noptionally attached to the object search path of the current scope (if\nargument \\code{attach} is \\code{TRUE}).\n\\code{attach} defaults to \\code{FALSE}. However, in interactive code it is\noften helpful to attach packages by default. Therefore, in interactive code\ninvoked directly from the terminal only (i.e. not within modules),\n\\code{attach} defaults to the value of \\code{options('import.attach')}, which\ncan be set to \\code{TRUE} or \\code{FALSE} depending on the user’s preference.\n\n\\code{attach_operators} causes \\emph{operators} to be attached by default,\nbecause operators can only be invoked in R if they re found in the search\npath. Not attaching them therefore drastically limits a module’s usefulness.\n\nModules are searched in the module search path \\code{options('import.path')}.\nThis is a vector of paths to consider, from the highest to the lowest\npriority. The current directory is \\emph{always} considered first. That is,\nif a file \\code{a.r} exists both in the current directory and in a module\nsearch path, the local file \\code{./a.r} will be loaded.\n\nModule names can be fully qualified to refer to nested paths. See\n\\code{Examples}.\n}\n\\note{\nUnlike for packages, attaching happens \\emph{locally}: if\n\\code{import} is executed in the global environment, the effect is the same.\nOtherwise, the imported module is inserted as the parent of the current\n\\code{environment()}. When used (globally) \\emph{inside} a module, the newly\nimported module is only available inside the module’s search path, not\noutside it (nor in other modules which might be loaded).\n}\n\\examples{\n# `a.r` is a file in the local directory containing a function `f`.\na = import('a')\na$f()\n\n# b/c.r is a file in path `b`, containing a function `g`.\nimport('b/c', attach = TRUE)\ng() # No module name qualification necessary\n\n}\n\\seealso{\n\\code{unload}\n\n\\code{reload}\n\n\\code{module_name}\n}"
  },
  {
    "path": "src/test/resources/samples/langs/R/import.r",
    "content": "#' Import a module into the current scope\n#'\n#' \\code{module = import('module')} imports a specified module and makes its\n#' code available via the environment-like object it returns.\n#'\n#' @param module an identifier specifying the full module path\n#' @param attach if \\code{TRUE}, attach the newly loaded module to the object\n#'      search path (see \\code{Details})\n#' @param attach_operators if \\code{TRUE}, attach operators of module to the\n#'      object search path, even if \\code{attach} is \\code{FALSE}\n#' @return the loaded module environment (invisible)\n#'\n#' @details Modules are loaded in an isolated environment which is returned, and\n#' optionally attached to the object search path of the current scope (if\n#' argument \\code{attach} is \\code{TRUE}).\n#' \\code{attach} defaults to \\code{FALSE}. However, in interactive code it is\n#' often helpful to attach packages by default. Therefore, in interactive code\n#' invoked directly from the terminal only (i.e. not within modules),\n#' \\code{attach} defaults to the value of \\code{options('import.attach')}, which\n#' can be set to \\code{TRUE} or \\code{FALSE} depending on the user’s preference.\n#'\n#' \\code{attach_operators} causes \\emph{operators} to be attached by default,\n#' because operators can only be invoked in R if they re found in the search\n#' path. Not attaching them therefore drastically limits a module’s usefulness.\n#'\n#' Modules are searched in the module search path \\code{options('import.path')}.\n#' This is a vector of paths to consider, from the highest to the lowest\n#' priority. The current directory is \\emph{always} considered first. That is,\n#' if a file \\code{a.r} exists both in the current directory and in a module\n#' search path, the local file \\code{./a.r} will be loaded.\n#'\n#' Module names can be fully qualified to refer to nested paths. See\n#' \\code{Examples}.\n#'\n#' @note Unlike for packages, attaching happens \\emph{locally}: if\n#' \\code{import} is executed in the global environment, the effect is the same.\n#' Otherwise, the imported module is inserted as the parent of the current\n#' \\code{environment()}. When used (globally) \\emph{inside} a module, the newly\n#' imported module is only available inside the module’s search path, not\n#' outside it (nor in other modules which might be loaded).\n#'\n#' @examples\n#' # `a.r` is a file in the local directory containing a function `f`.\n#' a = import('a')\n#' a$f()\n#'\n#' # b/c.r is a file in path `b`, containing a function `g`.\n#' import('b/c', attach = TRUE)\n#' g() # No module name qualification necessary\n#'\n#' @seealso \\code{unload}\n#' @seealso \\code{reload}\n#' @seealso \\code{module_name}\n#' @export\nimport = function (module, attach, attach_operators = TRUE) {\n    module = substitute(module)\n    stopifnot(inherits(module, 'name'))\n\n    if (missing(attach)) {\n        attach = if (interactive() && is.null(module_name()))\n            getOption('import.attach', FALSE)\n        else\n            FALSE\n    }\n\n    stopifnot(class(attach) == 'logical' && length(attach) == 1)\n\n    module_path = try(find_module(module), silent = TRUE)\n\n    if (inherits(module_path, 'try-error'))\n        stop(attr(module_path, 'condition')$message)\n\n    containing_modules = module_init_files(module, module_path)\n    mapply(do_import, names(containing_modules), containing_modules)\n\n    mod_ns = do_import(as.character(module), module_path)\n    module_parent = parent.frame()\n    mod_env = exhibit_namespace(mod_ns, as.character(module), module_parent)\n\n    if (attach) {\n        if (identical(module_parent, .GlobalEnv))\n            attach(mod_env, name = environmentName(mod_env))\n        else\n            parent.env(module_parent) = mod_env\n    }\n    else if (attach_operators)\n        export_operators(mod_ns, module_parent)\n\n    invisible(mod_env)\n}\n\ndo_import = function (module_name, module_path) {\n    if (is_module_loaded(module_path))\n        return(get_loaded_module(module_path))\n\n    # The namespace contains a module’s content. This schema is very much like\n    # R package organisation.\n    # A good resource for this is:\n    # <http://obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/>\n    namespace = structure(new.env(parent = .BaseNamespaceEnv),\n                          name = paste('namespace', module_name, sep = ':'),\n                          path = module_path,\n                          class = c('namespace', 'environment'))\n    local(source(attr(environment(), 'path'), chdir = TRUE, local = TRUE),\n          envir = namespace)\n    cache_module(namespace)\n    namespace\n}\n\nexhibit_namespace = function (namespace, name, parent) {\n    exported_functions = lsf.str(namespace)\n    # Skip one parent environment because this module is hooked into the chain\n    # between the calling environment and its ancestor, thus sitting in its\n    # local object search path.\n    structure(list2env(sapply(exported_functions, get, envir = namespace),\n                       parent = parent.env(parent)),\n              name = paste('module', name, sep = ':'),\n              path = module_path(namespace),\n              class = c('module', 'environment'))\n}\n\nexport_operators = function (namespace, parent) {\n    # `$` cannot be overwritten, but it is generic so S3 variants of it can be\n    # defined. We therefore test it as well.\n    ops = c('+', '-', '*', '/', '^', '**', '&', '|', ':', '::', ':::', '$', '=',\n            '<-', '<<-', '==', '<', '<=', '>', '>=', '!=', '~', '&&', '||')\n\n    is_predefined = function (f) f %in% ops\n\n    is_op = function (f) {\n        prefix = strsplit(f, '\\\\.')[[1]][1]\n        is_predefined(prefix) || grepl('^%.*%$', prefix)\n    }\n\n    operators = Filter(is_op, lsf.str(namespace))\n    name = module_name(namespace)\n    # Skip one parent environment because this module is hooked into the chain\n    # between the calling environment and its ancestor, thus sitting in its\n    # local object search path.\n    op_env = structure(list2env(sapply(operators, get, envir = namespace),\n                                parent = parent.env(parent)),\n                       name = paste('operators', name, sep = ':'),\n                       path = module_path(namespace),\n                       class = c('module', 'environment'))\n\n    if (identical(parent, .GlobalEnv))\n        attach(op_env, name = environmentName(op_env))\n    else\n        parent.env(parent) = op_env\n}\n\n#' Unload a given module\n#'\n#' Unset the module variable that is being passed as a parameter, and remove the\n#' loaded module from cache.\n#' @param module reference to the module which should be unloaded\n#' @note Any other references to the loaded modules remain unchanged, and will\n#' still work. However, subsequently importing the module again will reload its\n#' source files, which would not have happened without \\code{unload}.\n#' Unloading modules is primarily useful for testing during development, and\n#' should not be used in production code.\n#'\n#' \\code{unload} does not currently detach environments.\n#' @seealso \\code{import}\n#' @seealso \\code{reload}\n#' @export\nunload = function (module) {\n    stopifnot(inherits(module, 'module'))\n    module_ref = as.character(substitute(module))\n    rm(list = module_path(module), envir = .loaded_modules)\n    # unset the module reference in its scope, i.e. the caller’s environment or\n    # some parent thereof.\n    rm(list = module_ref, envir = parent.frame(), inherits = TRUE)\n}\n\n#' Reload a given module\n#'\n#' Remove the loaded module from the cache, forcing a reload. The newly reloaded\n#' module is assigned to the module reference in the calling scope.\n#' @param module reference to the module which should be unloaded\n#' @note Any other references to the loaded modules remain unchanged, and will\n#' still work. Reloading modules is primarily useful for testing during\n#' development, and should not be used in production code.\n#'\n#' \\code{reload} does not work correctly with attached environments.\n#' @seealso \\code{import}\n#' @seealso \\code{unload}\n#' @export\nreload = function (module) {\n    stopifnot(inherits(module, 'module'))\n    module_ref = as.character(substitute(module))\n    module_path = module_path(module)\n    module_name = module_name(module)\n    rm(list = module_path, envir = .loaded_modules)\n    #' @TODO Once we have `attach`, need also to take care of the search path\n    #' and whatnot.\n    mod_ns = do_import(module_name, module_path)\n    module_parent = parent.frame()\n    mod_env = exhibit_namespace(mod_ns, module_ref, module_parent)\n    assign(module_ref, mod_env, envir = module_parent, inherits = TRUE)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/R/scholar.Rd",
    "content": "\\docType{package}\n\\name{scholar}\n\\alias{scholar}\n\\alias{scholar-package}\n\\title{scholar}\n\\source{\n  The package reads data from\n  \\url{http://scholar.google.com}.  Dates and citation\n  counts are estimated and are determined automatically by\n  a computer program. Use at your own risk.\n}\n\\description{\n  The \\code{scholar} package provides functions to extract\n  citation data from Google Scholar.  There are also\n  convenience functions for comparing multiple scholars and\n  predicting h-index scores based on past publication\n  records.\n}\n\\note{\n  A complementary set of Google Scholar functions can be\n  found at\n  \\url{http://biostat.jhsph.edu/~jleek/code/googleCite.r}.\n  The \\code{scholar} package was developed independently.\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/RAML/api.raml",
    "content": "#%RAML 0.8\n\ntitle: World Music API\nbaseUri: http://example.api.com/{version}\nversion: v1\ntraits:\n  - paged:\n      queryParameters:\n        pages:\n          description: The number of pages to return\n          type: number\n  - secured: !include http://raml-example.com/secured.yml\n/songs:\n  is: [ paged, secured ]\n  get:\n    queryParameters:\n      genre:\n        description: filter the songs by genre\n  post:\n  /{songId}:\n    get:\n      responses:\n        200:\n          body:\n            application/json:\n              schema: |\n                { \"$schema\": \"http://json-schema.org/schema\",\n                  \"type\": \"object\",\n                  \"description\": \"A canonical song\",\n                  \"properties\": {\n                    \"title\":  { \"type\": \"string\" },\n                    \"artist\": { \"type\": \"string\" }\n                  },\n                  \"required\": [ \"title\", \"artist\" ]\n                }\n            application/xml:\n    delete:\n      description: |\n        This method will *delete* an **individual song**\n"
  },
  {
    "path": "src/test/resources/samples/langs/RDoc/rdoc.rdoc",
    "content": "= \\RDoc - Ruby Documentation System\n\nhome :: https://github.com/rdoc/rdoc\nrdoc :: http://docs.seattlerb.org/rdoc\nbugs :: https://github.com/rdoc/rdoc/issues\ncode quality :: {<img src=\"https://codeclimate.com/badge.png\" alt=\"code climate\">}[https://codeclimate.com/github/rdoc/rdoc]\n\n== Description\n\nRDoc produces HTML and command-line documentation for Ruby projects.  RDoc\nincludes the +rdoc+ and +ri+ tools for generating and displaying documentation\nfrom the command-line.\n\n== Generating Documentation\n\nOnce installed, you can create documentation using the +rdoc+ command\n\n  $ rdoc [options] [names...]\n\nFor an up-to-date option summary, type\n\n  $ rdoc --help\n\nA typical use might be to generate documentation for a package of Ruby\nsource (such as RDoc itself).\n\n  $ rdoc\n\nThis command generates documentation for all the Ruby and C source\nfiles in and below the current directory.  These will be stored in a\ndocumentation tree starting in the subdirectory +doc+.\n\nYou can make this slightly more useful for your readers by having the\nindex page contain the documentation for the primary file.  In our\ncase, we could type\n\n  % rdoc --main README.rdoc\n\nYou'll find information on the various formatting tricks you can use\nin comment blocks in the documentation this generates.\n\nRDoc uses file extensions to determine how to process each file.  File names\nending +.rb+ and +.rbw+ are assumed to be Ruby source.  Files\nending +.c+ are parsed as C files.  All other files are assumed to\ncontain just Markup-style markup (with or without leading '#' comment\nmarkers).  If directory names are passed to RDoc, they are scanned\nrecursively for C and Ruby source files only.\n\nTo generate documentation using +rake+ see RDoc::Task.\n\nTo generate documentation programmatically:\n\n  gem 'rdoc'\n  require 'rdoc/rdoc'\n\n  options = RDoc::Options.new\n  # see RDoc::Options\n\n  rdoc = RDoc::RDoc.new\n  rdoc.document options\n  # see RDoc::RDoc\n\n== Writing Documentation\n\nTo write documentation for RDoc place a comment above the class, module,\nmethod, constant, or attribute you want documented:\n\n  ##\n  # This class represents an arbitrary shape by a series of points.\n\n  class Shape\n\n    ##\n    # Creates a new shape described by a +polyline+.\n    #\n    # If the +polyline+ does not end at the same point it started at the\n    # first pointed is copied and placed at the end of the line.\n    #\n    # An ArgumentError is raised if the line crosses itself, but shapes may\n    # be concave.\n\n    def initialize polyline\n      # ...\n    end\n\n  end\n\nThe default comment markup format is the RDoc::Markup format.\nTomDoc[rdoc-ref:RDoc::TomDoc], Markdown[rdoc-ref:RDoc::Markdown] and\nRD[rdoc-ref:RDoc::RD] format comments are also supported.  You can set the\ndefault comment format for your entire project by creating a\n<tt>.rdoc_options</tt> file.  See RDoc::Options@Saved+Options for instructions\non creating one.  You can also set the comment format for a single file\nthrough the +:markup:+ directive, but this is only recommended if you wish to\nswitch markup formats.  See RDoc::Markup@Other+directives.\n\nComments can contain directives that tell RDoc information that it cannot\notherwise discover through parsing.  See RDoc::Markup@Directives to control\nwhat is or is not documented, to define method arguments or to break up\nmethods in a class by topic.  See RDoc::Parser::Ruby for directives used to\nteach RDoc about metaprogrammed methods.\n\nSee RDoc::Parser::C for documenting C extensions with RDoc.\n\nTo determine how well your project is documented run <tt>rdoc -C lib</tt> to\nget a documentation coverage report.  <tt>rdoc -C1 lib</tt> includes parameter\nnames in the documentation coverage report.\n\n== Bugs\n\nSee CONTRIBUTING@Bugs for information on filing a bug report.  It's OK to file\na bug report for anything you're having a problem with.  If you can't figure\nout how to make RDoc produce the output you like that is probably a\ndocumentation bug.\n\n== License\n\nRDoc is Copyright (c) 2001-2003 Dave Thomas, The Pragmatic Programmers.\nPortions (c) 2007-2011 Eric Hodel.  Portions copyright others, see individual\nfiles and LEGAL.rdoc for details.\n\nRDoc is free software, and may be redistributed under the terms specified in\nLICENSE.rdoc.\n\n== Warranty\n\nThis software is provided \"as is\" and without any express or implied\nwarranties, including, without limitation, the implied warranties of\nmerchantability and fitness for a particular purpose.\n"
  },
  {
    "path": "src/test/resources/samples/langs/REXX/BatchRemapBrushes.pprx",
    "content": "/* Ga igenom lador med IFF-filer rekursivt och skapa:\n   1: Spritekartor om 320x256 med alla spritar\n   2: En tabell med enumererade spritenummer\n   Aterstar:\n   *: Att skriva shapesfiler direkt\n   $VER: 1.0\n*/\nSIGNAL ON BREAK_C\nPARSE ARG argument\ntemplate = 'START/N COLOURS/N REMAP/S RECURSIVE/S PALETTE/K DIRECTORY/A'\nCALL Init\n\nADDRESS 'PPAINT'\nOPTIONS RESULTS\nGetBestVideoMode WIDTH 320 HEIGHT 256 COLORS args.colours\nmodeid=Word(RESULT,1)\nsay modeid\nSet 'FORCE \"DISPLAY=' || modeid || '\"'\nIF RC~=0 THEN EXIT 20\nSet 'FORCE \"IMAGEW=320\" \"IMAGEH=256\" \"COLORS='args.colours'\"'\nClearImage\nLockGUI\nScreenToFront\nx=0 ; y=0 ; maxhoejd=0 ; fil#=0 ; blad#=0\nCALL WriteLn konstfil, ';Blad' blad#\nDO UNTIL Lines()==0 & fillista==''\n   DO WHILE fillista~=''\n      PARSE VAR fillista filnamn 'y' fillista\n      IF Right(filnamn,5)=='.info' THEN ITERATE\n      IF Word(StateF(dir||filnamn),1)=='DIR' THEN DO\n         PUSH fillista\n         PUSH dir\n         dir=dir||filnamn||'/'\n         SAY 'Entering directory' dir'...'\n         fillista=ShowDir(dir,'ALL','y')\n         ITERATE\n         END\n      LoadBrush FILE dir || filnamn NOPROGRESS\n      IF RC~==0 THEN DO\n         SAY 'Skipping file:' dir || filnamn\n         ITERATE\n         END\n      IF args.remap THEN RemapBrush NOPROGRESS\n      GetBrushAttributes WIDTH  ; bredd=RESULT\n      GetBrushAttributes HEIGHT ; hoejd=RESULT\n      GetBrushAttributes COLORS ; djup=RESULT\n      IF bredd//16==0 THEN ebwidth=bredd\n      ELSE ebwidth=bredd+(16-(bredd//16))\n      maxhoejd=Max(maxhoejd,hoejd)\n      SAY 'File:' Left(filnamn,29) 'Width:' bredd ' Height:' hoejd ' Depth:' djup ' ebwidth:' ebwidth\n      SetCurrentBrush RECTANGULAR WIDTH 1 HEIGHT 1\n      DrawRectangle x y x+ebwidth y+hoejd\n      Text fil# 'X' x+2 'Y' y+2\n      SetCurrentBrush 1 ; SetBrushHandle 0 0\n      PutBrush x y\n      CALL WriteLn(konstfil,'; '||fil# ||': '|| filnamn ||' ('||ebwidth||'x'||hoejd||'x'||djup||')')\n      CALL WriteLn(konstfil,'#'||Upper(Left(filnamn,Min(Length(filnamn),Max(LastPos('.',filnamn)-1,0))))||'='fil#)\n      x=x+ebwidth\n      IF x+ebwidth>319 THEN DO\n         x=0\n         y=y+maxhoejd\n         IF y+maxhoejd>255 THEN DO\n            SaveImage FILE 'Spritesheet' || blad# || '.ilbm' FORCE\n            IF RC==0 THEN SAY 'Saved sheet' blad#\n            ELSE SAY \"Couldn't save spritesheet\"\n            ClearImage\n            y=0\n            blad#=blad#+1\n            CALL WriteLn konstfil, ';Blad' blad#\n            END\n         maxhoejd=0\n         END\n      fil#=fil#+1\n      END /* WHILE fillista */\n   IF Lines()>0 THEN DO\n      PARSE PULL dir\n      PARSE PULL fillista\n      SAY 'Going back to' dir'...'\n      END\nEND /* UNTIL Lines() */\n\nBREAK_C:\nFreeBrush FORCE\nUnLockGUI\nmedd=fil# 'files processed in' blad#+1 'sheets'\nSAY medd\nRequestNotify 'TITLE SpriteSheet.pprx PROMPT \"'medd'\"'\nScreenToBack\nCALL Close(konstfil)\nDO WHILE Lines()>0; PULL .; END\nEXIT 0\n\nInit:\n   IF argument = '' | argument = '?' THEN DO\n      SAY template\n      EXIT 0\n      END\n\n   CALL ReadArgs()\n\n   IF ~Show('L',\"rexxsupport.library\") THEN DO\n      IF ~AddLib(\"rexxsupport.library\",0,-30,0) THEN DO\n         SAY 'Hittade inte rexxsupport.library'\n         EXIT 20\n         END\n      END\n   IF ~Open(konstfil,'SpriteConstants.txt','WRITE') THEN EXIT 10\n\n   IF ~SHOW('P', 'PPAINT') THEN DO\n      SAY \"Couldn't find PPaint. Please start the program first.\"\n      EXIT 5\n      END\n   dir=args.directory\n   IF dir='\"\"' THEN dir=Pragma('DIRECTORY')\n   IF dir='' THEN dir='Ram:Megamanv6/Graphics/'\n   IF Right(dir,1)~=='/' THEN dir=dir || '/'\n   fillista=ShowDir(dir,'FILES','y')\n   fillista=ShowDir(dir,'ALL','y')\n   IF fillista=\"\" THEN DO\n      SAY \"Found no files\"\n      EXIT 5\n      END\n   IF args.colours==0 THEN args.colours=16\n   ADDRESS 'PPAINT'\n   OPTIONS RESULTS\n   IF args.palette~='' THEN LoadPalette args.palette\nRETURN\n\nReadArgs:\n/* ReadArgs()-like evaluation of command line arguments */\nSAY 'ReadArgs'\nDO key# = 1 TO Words(Template)\n   key=Word(template,key#)\n   PARSE VAR key key \"/\" keytype\n   SELECT\n      WHEN keytype='S'|keytype='N' THEN args.key=0\n      WHEN keytype='K'|keytype='A' THEN args.key=''\n      OTHERWISE NOP     /* Error in template */\n      END\n   END\n\nDO WHILE argument ~= ''\n   PARSE VAR argument arg1 argument\n   arg2=''\n   DO key# = 1 TO Words(template)\n      key = Word(template,key#)\n      PARSE VAR key key '/' keytype\n      IF Upper(Left(arg1,Length(key))) = key THEN DO\n         SELECT\n            WHEN keytype='S' THEN DO\n               args.key=1\n               END\n            WHEN keytype='K' | keytype='N' | keytype='A' THEN DO\n               IF Index(arg1,'=')>0\n                  THEN DO\n                     SAY 'Innehaller ='\n                     PARSE VAR arg1 '=' arg2\n                     SAY 'arg2:' arg2\n                     END\n                  ELSE PARSE VAR argument arg2 argument\n               args.key=arg2\n               IF keytype='N' & DataType(arg2)~==NUM THEN DO\n                  SAY 'Illegal numerical argument' key arg2\n                  EXIT 10\n                  END\n               END\n            END\n            arg1=''\n            LEAVE key#\n         END\n      END\n      IF arg1~='' THEN args.directory=arg1\n   END\nRETURN"
  },
  {
    "path": "src/test/resources/samples/langs/REXX/ShapesInfo.rexx",
    "content": "/* Display information about Blitz Basic .shapes file,\n   optionally displaying the shape's cookiecut\n$AUTHOR: Iggy Drougge 2016\n$VER: 1.1\n*/\nPARSE ARG argument\ntemplate = 'FROM/N TO/N SHOW/S FILE/A'\nIF argument = '' | argument = '?' THEN DO\n   SAY 'ShapesInfo' template\n   EXIT 0\n   END\n\nCALL ReadArgs()\n\nIF ~Open(fh,args.file,READ) then DO\n   SAY \"Couldn't Open file:\" args.file\n   EXIT 10\n   END\n\nshape#=0\nfilebad=0\nIF args.to=0 THEN args.to=9999\n\nIF args.from>1 THEN SAY 'Seeking...'\nDO WHILE ~EOF(fh)\n   header=ReadCh(fh,32)\n   IF EOF(fh) THEN DO\n      SAY 'Reached end of file.'\n      EXIT 0\n      END\n   PARSE VALUE header WITH pixwidth +2 pixheight +2 depth +2 ebwidth +2 bltsize +2 xhandle +2 yhandle +2 . +4 . +4 onebpmem +2 onebpmemx +2 allbpmem +2 allbpmemx +2 .\n   CALL CheckHeader\n   IF filebad THEN DO\n      SAY 'Not a valid shapes file.'\n      SAY C2X(header)\n      EXIT 10\n      END\n   shape#=shape#+1\n   bitplanesize = C2D(ebwidth) * C2D(pixheight)\n   bitmapsize = bitplanesize * C2D(depth)\n   IF shape# < args.from THEN DO\n      CALL Seek(fh,bitmapsize,CURRENT)\n      ITERATE\n      END\n   IF shape# > args.to THEN LEAVE\n   CALL PrintHeader\n   IF args.show THEN CALL ShowCookiecut\n   ELSE CALL Seek(fh,bitmapsize,CURRENT)\n   END\nEXIT 0\n\nCheckHeader:\n   IF C2D(pixwidth)>C2D(ebwidth)*8 THEN filebad=1\n   IF Left(C2B(bltsize),10)~=C2B(pixheight) THEN filebad=1\nRETURN\n\nPrintHeader:\n   SAY 'Shape #' || shape# || ':'\n   SAY '  Width:    ' C2D(pixwidth) 'pixels' '('C2D(ebwidth) 'bytes)'\n   SAY '  Height:   ' C2D(pixheight) 'pixels'\n   SAY '  Depth:    ' C2D(depth) 'bitplanes'\n   SAY '  BLTSIZE:  ' '$'C2X(bltsize) '('||,\n       C2D(B2C(Left(C2B(bltsize),10))) 'x',\n       C2D(B2C(Right(C2B(bltsize),6)))')'\n   SAY '  Handle:   ' C2D(xhandle)','C2D(yhandle)\n/*\n   SAY 'Onebpmem: ' C2D(onebpmem)\n   SAY 'OnebpmemX:' C2D(onebpmemx)\n   SAY 'Allbpmem: ' C2D(allbpmem)\n   SAY 'AllbpmemX:' C2D(allbpmemx)\n*/\nRETURN\n\n\n\nShowCookiecut:\n   depth=C2D(depth)\n   bmap=Copies('00'x,bitplanesize)\n   DO FOR depth\n      bmap=BitOr(bmap,readch(fh,bitplanesize))\n      END\n   ln=1 ; pixheight=C2D(pixheight) ; ebwidth=C2D(ebwidth)\n   DO FOR pixheight\n      SAY C2B(SubStr(bmap,ln,ebwidth))\n      ln=ln+ebwidth\n      END\nRETURN\n\nEXIT 0\n\nReadArgs:\n/* ReadArgs()-like evaluation of command line arguments */\nDO key# = 1 TO Words(Template) /* Initialise the keywords */\n   key=Word(template,key#)\n   PARSE VAR key key \"/\" keytype\n   SELECT\n      WHEN keytype='S'|keytype='N' THEN args.key=0\n      WHEN keytype='K'|keytype='A' THEN args.key=''\n      OTHERWISE NOP     /* Error in template */\n      END\n   END\n\nDO WHILE argument ~= ''\n   PARSE VAR argument arg1 argument\n   arg2=''\n   DO key# = 1 TO Words(template)\n      key = Word(template,key#)\n      PARSE VAR key key '/' keytype\n      IF Upper(Left(arg1,Length(key))) = key THEN DO\n         SELECT\n            WHEN keytype='S' THEN DO\n               args.key=1\n               END\n            WHEN keytype='K' | keytype='N' | keytype='A' THEN DO\n               IF Index(arg1,'=')>0\n                  THEN DO\n                     SAY 'Innehaller ='\n                     PARSE VAR arg1 '=' arg2\n                     SAY 'arg2:' arg2\n                     END\n                  ELSE PARSE VAR argument arg2 argument\n               args.key=arg2\n               IF keytype='N' & DataType(arg2)~==NUM THEN DO\n                  SAY 'Illegal numerical argument' key arg2\n                  EXIT 10\n                  END\n               END\n            END\n            arg1=''\n            LEAVE key#\n         END\n      END\n      IF arg1~='' THEN args.file=arg1\n   END\nRETURN"
  },
  {
    "path": "src/test/resources/samples/langs/REXX/SkrivShape.rexx",
    "content": "/* rexx */\nPARSE ARG filnamn\nIF filnamn='' THEN DO\n   filnamn='raw'\n   filnamn='font.shapes'\n   end\nIF ~open(fil,filnamn,r) THEN EXIT 10\npixwidth=48\nebwidth=pixwidth/8\npixheight=48\ndepth=4\nSAY \"Skriver utfil...\"\nCALL open utfil,\"RAM:utfil\",W\nCALL skriv pixwidth,2\nCALL skriv pixheight,2\nCALL skriv depth,2\nCALL skriv ebwidth,2\nbltsize=Right(C2B(D2C(pixheight)),10,\"00\")\nbltsize=bltsize || Right(C2B(D2C(ebwidth)),6,\"00\")\n/* SAY bltsize */\nCALL skriv C2D(B2C(bltsize)),2\nCALL skriv 0,4 /* xhandle, yhandle*/\nCALL skriv 0,4 /* datapekare */\nCALL skriv 0,4 /* cookiepekare */\nCALL skriv ebwidth*pixheight,2 /* onebpmem */\nCALL skriv ebwidth*pixheight+pixheight*2,2 /* onebpmemx */\nCALL skriv ebwidth*pixheight*depth,2 /* allbpmem */\nCALL skriv ebwidth*pixheight*depth+pixheight*2*depth,2 /* allbpmemx */\nCALL skriv 0,2 /* padding */\nCALL Close utfil\nEXIT\n\nskriv:\nsay \"Skriver $\"D2X(arg(1)) \"(\"arg(2) \"byte)\"\ncall writech utfil,right(D2C(ARG(1)),ARG(2),\"00\"x)\nreturn\n\nvisacookie:\n   rad=copies('00'x,pixheight*ebwidth)\n   say \"Initierar bitmap till\" pixheight*ebwidth*depth\n   say \"Ett bitplan =\" pixheight*ebwidth\n   bmap.=''\n   say \"laser in\"\n   do bitplan=1 to depth\n      say \"laser plan\" bitplan\n      rad=bitor(rad,readch(fil,pixheight*ebwidth))\n      end\n   ln=1\n   say \"skriver ut\"\n   do for pixheight\n      say c2b(substr(rad,ln,bredd/8))\n      ln=ln+bredd/8\n      end\nreturn"
  },
  {
    "path": "src/test/resources/samples/langs/REXX/ag2xml.rexx",
    "content": "/* Las en Amigaguidefil och omvandla till nan slags XML */\n/* $VER: 2 */\noptions AREXX_BIFS\noptions AREXX_SEMANTICS\nif ~open(infil,'Blitz2_V1.3.guide',R) then exit 10\nif ~open(utfil,'bb2.xml',W) then exit 10\n\ncall writeln utfil,'<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>'\ncall writeln utfil,'<root>'\nradnr=1\ninrad=readln(infil)\n\ndo while ~eof(infil)\n\toch=1\n\tdo while index(inrad,'&',och)>0\n\t\toch=index(inrad,'&',och)\n\t\tif index(inrad,';',och)=0 then do\n\t\t\tparse value inrad with prefix =(och) +1 suffix\n\t\t\tinrad=prefix'&amp;'suffix\n\t\t\toch=index(inrad,';',och)\n\t\tend\n\tend\n\tdo while index(inrad,'<')>0\n\t\tparse var inrad prefix '<' suffix\n\t\tinrad = prefix'&lt;'suffix\n\tend\n\tdo while index(inrad,'>')>0\n\t\tparse var inrad prefix '>' suffix\n\t\tinrad = prefix'&gt;'suffix\n\tend\n\tinrad=behandlarad(inrad)\n\tif right(inrad,1)~='>' & strip(inrad)~='' then inrad=inrad || ' '\n\ttestrad=inrad\n\tdo while index(testrad,'>') > 0\n\t\tparse var testrad prefix '<' . '>' suffix\n\t\ttestrad = prefix || suffix\n\tend\n\tif length(testrad)<65 then inrad = inrad || '0d'x\n\tcall writech utfil,inrad\n\tinrad=readln(infil)\n\tradnr=radnr+1\nend\ncall close(infil)\ncall writeln utfil,'</root>'\ncall close(utfil)\nexit 0\n\nbehandlarad: procedure\nparse arg inrad\ndo forever\n\tif abbrev(inrad,'@NODE') then do\n\t\tparse var inrad '@NODE ' nod inrad\n\t\t/* say 'Hittade nod:' nod */\n\t\tinrad='<story id=\"' || nod || '\">' || inrad\n\tend\n\tif inrad='@ENDNODE' then inrad='</story>' || '0d'x\n\t/* say inrad */\n\tif abbrev(inrad,'-----') then inrad='<streck>\t</streck>'\n\tif abbrev(inrad,'Command'), \n\t| abbrev(inrad,'Function'),\n\t| abbrev(inrad,'Statement') then do\n\t\tparse var inrad kommandotyp ':' inrad\n\t\t/* if index(inrad,'@{')>0 then */\n\t\tparse var inrad inrad '@{' rest\n\t\tif rest~='' then rest='@{' || rest\n\t\t/* say 'rest:' rest */\n\t\tinrad='<commandheadline>'||strip(kommandotyp)||'\t</commandheadline><commandname>'||behandlarad(inrad)||'</commandname>'||behandlarad(rest)\n\tend\n\tif index(inrad,'@{')>0 then do\n\t\tparse var inrad inrad '@{' tagg '}' rest\n\t\tselect\n\t\t\twhen tagg='fg shine' then tagg='<fgshine>'\n\t\t\twhen tagg='fg text'  then tagg='</fgshine>'\n\t\t\twhen tagg='b'\t\t then tagg='<bold>'\n\t\t\twhen tagg='ub'\t\t then tagg='</bold>'\n\t\t\t/* @{\" SpriteMode \" link BUM_SPRITEMODE} */\n\t\t\twhen abbrev(tagg,'\"') then do\n\t\t\t\tparse var tagg '\"' besk '\"' . 'link' dest\n\t\t\t\ttagg='<link dest=\"' || dest || '\">' || besk || '</link>'\n\t\t\tend\n\t\t\totherwise tagg='<okand>'\n\t\tend\n\t\trest=behandlarad(rest)\n\t\t/*\n\t\t\tif index(rest,'@{')>0 then rest=behandlarad(left(rest,index(rest,'@{'))) || substr(rest,index(rest,'@{'))\t\t\n\t\t*/\n\t\t\tinrad=inrad || tagg || rest\n\t\t/* iterate */\n\tend\n\tif abbrev(inrad,'@') then do\n\t\tsay 'Hittade okand tagg:' inrad\n\t\t/* inrad='<okand>' inrad '</okand>' */\n\t\tparse var inrad '@' tagg inrad\n\t\tif abbrev(tagg,'$') then parse var tagg '$' tagg ':'\n\t\tinrad='<'tagg'>'inrad'</'tagg'>'\n\tend\n\tif abbrev(inrad,'Modes') then do\n\t\tparse var inrad . ':' inrad\n\t\tinrad='<modeheadline>Modes:\t</modeheadline><modename>' || strip(inrad) || '</modename>'\n\tend\n\tif abbrev(inrad,'Syntax') then do\n\t\tparse var inrad . ':' inrad\n\t\tinrad='<syntaxheadline>Syntax:\t</syntaxheadline><syntax>' || strip(inrad) || '</syntax>'\n\tend\n\treturn inrad\nend"
  },
  {
    "path": "src/test/resources/samples/langs/RMarkdown/example.rmd",
    "content": "# An example RMarkdown\n\nSome text.\n\n## A graphic in R\n\n```{r}\nplot(1:10)\nhist(rnorm(10000))\n```"
  },
  {
    "path": "src/test/resources/samples/langs/RPC/rpc.x",
    "content": "/* rpc.x extracted from RFC5531 */\n\nconst RPC_VERS = 2;\n\nenum auth_flavor {\n\tAUTH_NONE       = 0,\n\tAUTH_SYS        = 1,\n\tAUTH_SHORT      = 2,\n\tAUTH_DH         = 3,\n\tAUTH_KERB       = 4, /* RFC2695 */\n\tAUTH_RSA        = 5,\n\tRPCSEC_GSS      = 6  /* RFC2203 */\n\t/* and more to be defined */\n};\n\ntypedef opaque opaque_auth_body<400>;\n\nstruct opaque_auth {\n\tint flavor; /* may be \"pseudo\" value outside enum */\n\topaque_auth_body body;\n};\n\nenum msg_type {\n\tCALL  = 0,\n\tREPLY = 1\n};\n\nenum reply_stat {\n\tMSG_ACCEPTED = 0,\n\tMSG_DENIED   = 1\n};\n\nenum accept_stat {\n\tSUCCESS       = 0, /* RPC executed successfully       */\n\tPROG_UNAVAIL  = 1, /* remote hasn't exported program  */\n\tPROG_MISMATCH = 2, /* remote can't support version #  */\n\tPROC_UNAVAIL  = 3, /* program can't support procedure */\n\tGARBAGE_ARGS  = 4, /* procedure can't decode params   */\n\tSYSTEM_ERR    = 5  /* e.g. memory allocation failure  */\n};\n\nenum reject_stat {\n\tRPC_MISMATCH = 0, /* RPC version number != 2          */\n\tAUTH_ERROR = 1    /* remote can't authenticate caller */\n};\n\nenum auth_stat {\n\tAUTH_OK           = 0,  /* success                        */\n\t/*\n\t * failed at remote end\n\t */\n\tAUTH_BADCRED      = 1,  /* bad credential (seal broken)   */\n\tAUTH_REJECTEDCRED = 2,  /* client must begin new session  */\n\tAUTH_BADVERF      = 3,  /* bad verifier (seal broken)     */\n\tAUTH_REJECTEDVERF = 4,  /* verifier expired or replayed   */\n\tAUTH_TOOWEAK      = 5,  /* rejected for security reasons  */\n\t/*\n\t * failed locally\n\t */\n\tAUTH_INVALIDRESP  = 6,  /* bogus response verifier        */\n\tAUTH_FAILED       = 7,  /* reason unknown                 */\n\t/*\n\t * AUTH_KERB errors; deprecated.  See [[139]RFC2695]\n\t */\n\tAUTH_KERB_GENERIC = 8,  /* kerberos generic error */\n\tAUTH_TIMEEXPIRE = 9,    /* time of credential expired */\n\tAUTH_TKT_FILE = 10,     /* problem with ticket file */\n\tAUTH_DECODE = 11,       /* can't decode authenticator */\n\tAUTH_NET_ADDR = 12,     /* wrong net address in ticket */\n\t/*\n\t * RPCSEC_GSS GSS related errors\n\t */\n\tRPCSEC_GSS_CREDPROBLEM = 13, /* no credentials for user */\n\tRPCSEC_GSS_CTXPROBLEM = 14   /* problem with context */\n};\n\nstruct rpc_msg {\n\tunsigned int xid;\n\tunion rpc_msg_body body;\n};\n\nunion rpc_msg_body switch (msg_type mtype) {\n\tcase CALL:\n\t\tcall_body cbody;\n\tcase REPLY:\n\t\treply_body rbody;\n};\n\nstruct call_body {\n\tunsigned int rpcvers;       /* must be equal to two (2) */\n\tunsigned int prog;\n\tunsigned int vers;\n\tunsigned int proc;\n\topaque_auth cred;\n\topaque_auth verf;\n\t/* procedure-specific parameters start here */\n};\n\nunion reply_body switch (reply_stat stat) {\n\tcase MSG_ACCEPTED:\n\t\taccepted_reply areply;\n\tcase MSG_DENIED:\n\t\trejected_reply rreply;\n} /*reply*/;\n\nstruct accepted_reply {\n\topaque_auth verf;\n\tunion accepted_reply_data reply_data;\n};\n\nunion accepted_reply_data switch (accept_stat stat) {\n\tcase SUCCESS:\n\t\tvoid /* opaque results[0] */;\n\t\t/*\n\t\t * procedure-specific results start here\n\t\t */\n\tcase PROG_MISMATCH:\n\t\tstruct {\n\t\t\tunsigned int low;\n\t\t\tunsigned int high;\n\t\t} mismatch_info;\n\tdefault:\n\t\t/*\n\t\t * Void.  Cases include PROG_UNAVAIL, PROC_UNAVAIL,\n\t\t * GARBAGE_ARGS, and SYSTEM_ERR.\n\t\t */\n\t\tvoid;\n};\n\nunion rejected_reply switch (reject_stat stat) {\n\tcase RPC_MISMATCH:\n\t\tstruct {\n\t\t\tunsigned int low;\n\t\t\tunsigned int high;\n\t\t} mismatch_info;\n\tcase AUTH_ERROR:\n\t\tauth_stat auth_stat; /* renamed to avoid conflict with discriminator */\n};\n\nstruct authsys_parms {\n\tunsigned int stamp;\n\tstring machinename<255>;\n\tunsigned int uid;\n\tunsigned int gid;\n\tunsigned int gids<16>;\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/RPC/rusers.x",
    "content": "/*\n * Copyright (c) 2010, Oracle America, Inc.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n *       copyright notice, this list of conditions and the following\n *       disclaimer in the documentation and/or other materials\n *       provided with the distribution.\n *     * Neither the name of the \"Oracle America, Inc.\" nor the names of its\n *       contributors may be used to endorse or promote products derived\n *       from this software without specific prior written permission.\n *\n *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n *   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n *   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n%/*\n% * Find out about remote users\n% */\n\nconst RUSERS_MAXUSERLEN = 32;\nconst RUSERS_MAXLINELEN = 32;\nconst RUSERS_MAXHOSTLEN = 257;\n\nstruct rusers_utmp {\n\tstring ut_user<RUSERS_MAXUSERLEN>;\t/* aka ut_name */\n\tstring ut_line<RUSERS_MAXLINELEN>;\t/* device */\n\tstring ut_host<RUSERS_MAXHOSTLEN>;\t/* host user logged on from */\n\tint ut_type;\t\t\t\t/* type of entry */\n\tint ut_time;\t\t\t\t/* time entry was made */\n\tunsigned int ut_idle;\t\t\t/* minutes idle */\n};\n\ntypedef rusers_utmp utmp_array<>;\n\n#ifdef RPC_HDR\n%\n%/*\n% * Values for ut_type field above.\n% */\n#endif\nconst\tRUSERS_EMPTY = 0;\nconst\tRUSERS_RUN_LVL = 1;\nconst\tRUSERS_BOOT_TIME = 2;\nconst\tRUSERS_OLD_TIME = 3;\nconst\tRUSERS_NEW_TIME = 4;\nconst\tRUSERS_INIT_PROCESS = 5;\nconst\tRUSERS_LOGIN_PROCESS = 6;\nconst\tRUSERS_USER_PROCESS = 7;\nconst\tRUSERS_DEAD_PROCESS = 8;\nconst\tRUSERS_ACCOUNTING = 9;\n\nprogram RUSERSPROG {\n\n\tversion RUSERSVERS_3 {\n\t\tint\n\t\tRUSERSPROC_NUM(void) = 1;\n\n\t\tutmp_array\n\t\tRUSERSPROC_NAMES(void) = 2;\n\n\t\tutmp_array\n\t\tRUSERSPROC_ALLNAMES(void) = 3;\n\t} = 3;\n\n} = 100002;\n\n#ifdef RPC_HDR\n%\n%\n%#ifdef\t__cplusplus\n%extern \"C\" {\n%#endif\n%\n%#include <rpc/xdr.h>\n%\n%/*\n% * The following structures are used by version 2 of the rusersd protocol.\n% * They were not developed with rpcgen, so they do not appear as RPCL.\n% */\n%\n%#define\tRUSERSVERS_IDLE 2\n%#define\tRUSERSVERS 3\t\t/* current version */\n%#define\tMAXUSERS 100\n%\n%/*\n% * This is the structure used in version 2 of the rusersd RPC service.\n% * It corresponds to the utmp structure for BSD systems.\n% */\n%struct ru_utmp {\n%\tchar\tut_line[8];\t\t/* tty name */\n%\tchar\tut_name[8];\t\t/* user id */\n%\tchar\tut_host[16];\t\t/* host name, if remote */\n%\tlong int ut_time;\t\t/* time on */\n%};\n%\n%struct utmparr {\n%       struct ru_utmp **uta_arr;\n%       int uta_cnt;\n%};\n%typedef struct utmparr utmparr;\n%\n%extern bool_t xdr_utmparr (XDR *xdrs, struct utmparr *objp) __THROW;\n%\n%struct utmpidle {\n%\tstruct ru_utmp ui_utmp;\n%\tunsigned int ui_idle;\n%};\n%\n%struct utmpidlearr {\n%\tstruct utmpidle **uia_arr;\n%\tint uia_cnt;\n%};\n%\n%extern bool_t xdr_utmpidlearr (XDR *xdrs, struct utmpidlearr *objp) __THROW;\n%\n%#ifdef\t__cplusplus\n%}\n%#endif\n#endif\n\n\n#ifdef\tRPC_XDR\n%bool_t xdr_utmp (XDR *xdrs, struct ru_utmp *objp);\n%\n%bool_t\n%xdr_utmp (XDR *xdrs, struct ru_utmp *objp)\n%{\n%\t/* Since the fields are char foo [xxx], we should not free them. */\n%\tif (xdrs->x_op != XDR_FREE)\n%\t{\n%\t\tchar *ptr;\n%\t\tunsigned int size;\n%\t\tptr = objp->ut_line;\n%\t\tsize = sizeof (objp->ut_line);\n%\t\tif (!xdr_bytes (xdrs, &ptr, &size, size)) {\n%\t\t\treturn (FALSE);\n%\t\t}\n%\t\tptr = objp->ut_name;\n%\t\tsize = sizeof (objp->ut_name);\n%\t\tif (!xdr_bytes (xdrs, &ptr, &size, size)) {\n%\t\t\treturn (FALSE);\n%\t\t}\n%\t\tptr = objp->ut_host;\n%\t\tsize = sizeof (objp->ut_host);\n%\t\tif (!xdr_bytes (xdrs, &ptr, &size, size)) {\n%\t\t\treturn (FALSE);\n%\t\t}\n%\t}\n%\tif (!xdr_long(xdrs, &objp->ut_time)) {\n%\t\treturn (FALSE);\n%\t}\n%\treturn (TRUE);\n%}\n%\n%bool_t xdr_utmpptr(XDR *xdrs, struct ru_utmp **objpp);\n%\n%bool_t\n%xdr_utmpptr (XDR *xdrs, struct ru_utmp **objpp)\n%{\n%\tif (!xdr_reference(xdrs, (char **) objpp, sizeof (struct ru_utmp),\n%\t\t\t   (xdrproc_t) xdr_utmp)) {\n%\t\treturn (FALSE);\n%\t}\n%\treturn (TRUE);\n%}\n%\n%bool_t\n%xdr_utmparr (XDR *xdrs, struct utmparr *objp)\n%{\n%\tif (!xdr_array(xdrs, (char **)&objp->uta_arr, (u_int *)&objp->uta_cnt,\n%\t\t       MAXUSERS, sizeof(struct ru_utmp *),\n%\t\t       (xdrproc_t) xdr_utmpptr)) {\n%\t\treturn (FALSE);\n%\t}\n%\treturn (TRUE);\n%}\n%\n%bool_t xdr_utmpidle(XDR *xdrs, struct utmpidle *objp);\n%\n%bool_t\n%xdr_utmpidle (XDR *xdrs, struct utmpidle *objp)\n%{\n%\tif (!xdr_utmp(xdrs, &objp->ui_utmp)) {\n%\t\treturn (FALSE);\n%\t}\n%\tif (!xdr_u_int(xdrs, &objp->ui_idle)) {\n%\t\treturn (FALSE);\n%\t}\n%\treturn (TRUE);\n%}\n%\n%bool_t xdr_utmpidleptr(XDR *xdrs, struct utmpidle **objp);\n%\n%bool_t\n%xdr_utmpidleptr (XDR *xdrs, struct utmpidle **objpp)\n%{\n%\tif (!xdr_reference(xdrs, (char **) objpp, sizeof (struct utmpidle),\n%\t\t\t   (xdrproc_t) xdr_utmpidle)) {\n%\t\treturn (FALSE);\n%\t}\n%\treturn (TRUE);\n%}\n%\n%bool_t\n%xdr_utmpidlearr (XDR *xdrs, struct utmpidlearr *objp)\n%{\n%\tif (!xdr_array(xdrs, (char **)&objp->uia_arr, (u_int *)&objp->uia_cnt,\n%\t\t       MAXUSERS, sizeof(struct utmpidle *),\n%\t\t       (xdrproc_t) xdr_utmpidleptr)) {\n%\t\treturn (FALSE);\n%\t}\n%\treturn (TRUE);\n%}\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/RPC/yp.x",
    "content": "/* @(#)yp.x\t2.1 88/08/01 4.0 RPCSRC */\n\n/*\n * Copyright (c) 2010, Oracle America, Inc.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n *       copyright notice, this list of conditions and the following\n *       disclaimer in the documentation and/or other materials\n *       provided with the distribution.\n *     * Neither the name of the \"Oracle America, Inc.\" nor the names of its\n *       contributors may be used to endorse or promote products derived\n *       from this software without specific prior written permission.\n *\n *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n *   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n *   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Protocol description file for the Yellow Pages Service\n */\n\nconst YPMAXRECORD = 1024;\nconst YPMAXDOMAIN = 64;\nconst YPMAXMAP = 64;\nconst YPMAXPEER = 64;\n\n\nenum ypstat {\n\tYP_TRUE\t\t=  1,\n\tYP_NOMORE\t=  2,\n\tYP_FALSE\t=  0,\n\tYP_NOMAP\t= -1,\n\tYP_NODOM\t= -2,\n\tYP_NOKEY\t= -3,\n\tYP_BADOP\t= -4,\n\tYP_BADDB\t= -5,\n\tYP_YPERR\t= -6,\n\tYP_BADARGS\t= -7,\n\tYP_VERS\t\t= -8\n};\n\n\nenum ypxfrstat {\n\tYPXFR_SUCC\t=  1,\n\tYPXFR_AGE\t=  2,\n\tYPXFR_NOMAP\t= -1,\n\tYPXFR_NODOM\t= -2,\n\tYPXFR_RSRC\t= -3,\n\tYPXFR_RPC\t= -4,\n\tYPXFR_MADDR\t= -5,\n\tYPXFR_YPERR\t= -6,\n\tYPXFR_BADARGS\t= -7,\n\tYPXFR_DBM\t= -8,\n\tYPXFR_FILE\t= -9,\n\tYPXFR_SKEW\t= -10,\n\tYPXFR_CLEAR\t= -11,\n\tYPXFR_FORCE\t= -12,\n\tYPXFR_XFRERR\t= -13,\n\tYPXFR_REFUSED\t= -14\n};\n\n\ntypedef string domainname<YPMAXDOMAIN>;\ntypedef string mapname<YPMAXMAP>;\ntypedef string peername<YPMAXPEER>;\ntypedef opaque keydat<YPMAXRECORD>;\ntypedef opaque valdat<YPMAXRECORD>;\n\n\nstruct ypmap_parms {\n\tdomainname domain;\n\tmapname map;\n\tunsigned int ordernum;\n\tpeername peer;\n};\n\nstruct ypreq_key {\n\tdomainname domain;\n\tmapname map;\n\tkeydat key;\n};\n\nstruct ypreq_nokey {\n\tdomainname domain;\n\tmapname map;\n};\n\nstruct ypreq_xfr {\n\typmap_parms map_parms;\n\tunsigned int transid;\n\tunsigned int prog;\n\tunsigned int port;\n};\n\n\nstruct ypresp_val {\n\typstat stat;\n\tvaldat val;\n};\n\nstruct ypresp_key_val {\n\typstat stat;\n#ifdef STUPID_SUN_BUG\n\t/* This is the form as distributed by Sun.  But even the Sun NIS\n\t   servers expect the values in the other order.  So their\n\t   implementation somehow must change the order internally.  We\n\t   don't want to follow this bad example since the user should be\n\t   able to use rpcgen on this file.  */\n\tkeydat key;\n\tvaldat val;\n#else\n\tvaldat val;\n\tkeydat key;\n#endif\n};\n\n\nstruct ypresp_master {\n\typstat stat;\n\tpeername peer;\n};\n\nstruct ypresp_order {\n\typstat stat;\n\tunsigned int ordernum;\n};\n\nunion ypresp_all switch (bool more) {\ncase TRUE:\n\typresp_key_val val;\ncase FALSE:\n\tvoid;\n};\n\nstruct ypresp_xfr {\n\tunsigned int transid;\n\typxfrstat xfrstat;\n};\n\nstruct ypmaplist {\n\tmapname map;\n\typmaplist *next;\n};\n\nstruct ypresp_maplist {\n\typstat stat;\n\typmaplist *maps;\n};\n\nenum yppush_status {\n\tYPPUSH_SUCC\t=  1,\t/* Success */\n\tYPPUSH_AGE\t=  2,\t/* Master's version not newer */\n\tYPPUSH_NOMAP\t= -1,\t/* Can't find server for map */\n\tYPPUSH_NODOM\t= -2,\t/* Domain not supported */\n\tYPPUSH_RSRC\t= -3,\t/* Local resource alloc failure */\n\tYPPUSH_RPC\t= -4,\t/* RPC failure talking to server */\n\tYPPUSH_MADDR\t= -5,\t/* Can't get master address */\n\tYPPUSH_YPERR\t= -6,\t/* YP server/map db error */\n\tYPPUSH_BADARGS\t= -7,\t/* Request arguments bad */\n\tYPPUSH_DBM\t= -8,\t/* Local dbm operation failed */\n\tYPPUSH_FILE\t= -9,\t/* Local file I/O operation failed */\n\tYPPUSH_SKEW\t= -10,\t/* Map version skew during transfer */\n\tYPPUSH_CLEAR\t= -11,\t/* Can't send \"Clear\" req to local ypserv */\n\tYPPUSH_FORCE\t= -12,\t/* No local order number in map  use -f flag. */\n\tYPPUSH_XFRERR\t= -13,\t/* ypxfr error */\n\tYPPUSH_REFUSED\t= -14\t/* Transfer request refused by ypserv */\n};\n\nstruct yppushresp_xfr {\n\tunsigned transid;\n\typpush_status status;\n};\n\n/*\n * Response structure and overall result status codes.  Success and failure\n * represent two separate response message types.\n */\n\nenum ypbind_resptype {\n\tYPBIND_SUCC_VAL = 1,\n\tYPBIND_FAIL_VAL = 2\n};\n\nstruct ypbind_binding {\n    opaque ypbind_binding_addr[4]; /* In network order */\n    opaque ypbind_binding_port[2]; /* In network order */\n};\n\nunion ypbind_resp switch (ypbind_resptype ypbind_status) {\ncase YPBIND_FAIL_VAL:\n\tunsigned ypbind_error;\ncase YPBIND_SUCC_VAL:\n\typbind_binding ypbind_bindinfo;\n};\n\n/* Detailed failure reason codes for response field ypbind_error*/\n\nconst YPBIND_ERR_ERR    = 1;\t/* Internal error */\nconst YPBIND_ERR_NOSERV = 2;\t/* No bound server for passed domain */\nconst YPBIND_ERR_RESC   = 3;\t/* System resource allocation failure */\n\n\n/*\n * Request data structure for ypbind \"Set domain\" procedure.\n */\nstruct ypbind_setdom {\n\tdomainname ypsetdom_domain;\n\typbind_binding ypsetdom_binding;\n\tunsigned ypsetdom_vers;\n};\n\n\n/*\n * YP access protocol\n */\nprogram YPPROG {\n\tversion YPVERS {\n\t\tvoid\n\t\tYPPROC_NULL(void) = 0;\n\n\t\tbool\n\t\tYPPROC_DOMAIN(domainname) = 1;\n\n\t\tbool\n\t\tYPPROC_DOMAIN_NONACK(domainname) = 2;\n\n\t\typresp_val\n\t\tYPPROC_MATCH(ypreq_key) = 3;\n\n\t\typresp_key_val\n\t\tYPPROC_FIRST(ypreq_key) = 4;\n\n\t\typresp_key_val\n\t\tYPPROC_NEXT(ypreq_key) = 5;\n\n\t\typresp_xfr\n\t\tYPPROC_XFR(ypreq_xfr) = 6;\n\n\t\tvoid\n\t\tYPPROC_CLEAR(void) = 7;\n\n\t\typresp_all\n\t\tYPPROC_ALL(ypreq_nokey) = 8;\n\n\t\typresp_master\n\t\tYPPROC_MASTER(ypreq_nokey) = 9;\n\n\t\typresp_order\n\t\tYPPROC_ORDER(ypreq_nokey) = 10;\n\n\t\typresp_maplist\n\t\tYPPROC_MAPLIST(domainname) = 11;\n\t} = 2;\n} = 100004;\n\n\n/*\n * YPPUSHPROC_XFRRESP is the callback routine for result of YPPROC_XFR\n */\nprogram YPPUSH_XFRRESPPROG {\n\tversion YPPUSH_XFRRESPVERS {\n\t\tvoid\n\t\tYPPUSHPROC_NULL(void) = 0;\n\n#ifdef STUPID_SUN_BUG\n\t\t/* This is the form as distributed by Sun.  But even\n\t\t   the Sun NIS servers expect the values in the other\n\t\t   order.  So their implementation somehow must change\n\t\t   the order internally.  We don't want to follow this\n\t\t   bad example since the user should be able to use\n\t\t   rpcgen on this file.  */\n\t\typpushresp_xfr\n\t\tYPPUSHPROC_XFRRESP(void) = 1;\n#else\n\t\tvoid\n\t\tYPPUSHPROC_XFRRESP(yppushresp_xfr) = 1;\n#endif\n\t} = 1;\n} = 0x40000000;\t/* transient: could be anything up to 0x5fffffff */\n\n/*\n * YP binding protocol\n */\nprogram YPBINDPROG {\n\tversion YPBINDVERS {\n\t\tvoid\n\t\tYPBINDPROC_NULL(void) = 0;\n\n\t\typbind_resp\n\t\tYPBINDPROC_DOMAIN(domainname) = 1;\n\n\t\tvoid\n\t\tYPBINDPROC_SETDOM(ypbind_setdom) = 2;\n\t} = 2;\n} = 100007;\n"
  },
  {
    "path": "src/test/resources/samples/langs/RPM Spec/apache.spec",
    "content": "%define _prefix /usr/local\n%define _mandir /usr/local/man\n%define _sysconfdir /etc\n\n%define apache_ver      1.3.42\n%define mod_ssl_ver     2.8.31\n%define\tmod_perl_ver    1.31\n%define\tlibapreq_ver    1.34\n\n\n%define aname           apache\n%define pname           httpd13\n%define contentdir      %{_var}/www\n%define suexec_caller   apache\n\nSummary:       The 1.x Apache webserver (with static mod_perl, mod_ssl)\nName:          apache\nVersion:       %{apache_ver}\nRelease:       4%{?dist}\nLicense:       Apache Software License 2.0\nURL:           http://httpd.apache.org/\nGroup:         System Environment/Daemons\n\nRequires:      initscripts >= 3.25\nRequires:      openssl >= 0.9.6\n\nBuildRequires: openssl-devel mm-devel krb5-devel pkgconfig \nBuildRequires: perl-ExtUtils-MakeMaker perl-libwww-perl perl-HTML-Parser perl-ExtUtils-Embed\nBuildRequires: gdbm-devel flex \nRequires:      /sbin/chkconfig /bin/mktemp /usr/sbin/useradd\nRequires:      findutils procps\n\nProvides:      webserver\nProvides:      mod_perl = %{mod_perl_ver}\nProvides:      perl(mod_perl) = %{mod_perl_ver}\nProvides:      mod_ssl = %{mod_ssl_ver}\nProvides:      apache = %{apache_ver}\n\nSource0:       http://httpd.apache.org/dist/apache_%{apache_ver}.tar.bz2\nSource1:       http://www.modssl.org/source/mod_ssl-%{mod_ssl_ver}-%{apache_ver}.tar.gz\nSource2:       http://perl.apache.org/dist/mod_perl-%{mod_perl_ver}.tar.gz\nSource3:       httpd.init\nSource4:       apache.logrotate\nSource5:       SSL-Certificate-Creation\nSource6:       ftp://ftp.cpan.org/authors/id/J/JO/JOESUF/libapreq-%{libapreq_ver}.tar.gz\n\nPatch0:        sslcfg.patch\nPatch1:        apache_1.3.39-config.patch\nPatch3:        apache_1.3.39-Makefile.patch\nPatch5:        apache_1.3.20-apachectl-init.patch\nPatch11:       mod_ssl-2.8.4-openssl.patch\nPatch12:       apache_1.3.42-db.patch\nPatch13:       apache-1.3.39-gcc44.patch\nPatch14:       mod_ssl-2.8.31-STACK.patch\nPatch15:       apache_1.3.39-ap_getline.patch\nPatch16:       mod_ssl-openssl-x86_64.patch\nPatch17:       mp1+perl5.14.diff\nPatch18:       apache_1.3.42-64bits.patch\n\n\n%description\nThis package contains a powerful, full-featured, efficient, and\nfreely-available Web server based on work done by the Apache Software\nFoundation. It is also the most popular Web server on the Internet.\n\n------------------------------------------------------------------------------\nThis package is a custom release containing the httpd server (v%{apache_ver})\nbundled with: mod_perl v.%{mod_ssl_ver},\nand mod_ssl v%{mod_ssl_ver}, all BUILT-IN.\n------------------------------------------------------------------------------\n\n\tThe Apache/Perl integration project brings together the full power\nof the Perl programming language and the Apache HTTP server.\n\tWith mod_perl it is possible to write Apache modules entirely in Perl.\nIn addition, the persistent interpreter embedded in the server avoids the\noverhead of starting an external interpreter and the penalty of Perl\nstart-up time.\n\tMod_SSL provides strong cryptography for the Apache 1.3 webserver\nvia the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security\n(TLSv1) protocols by the help of the Open Source SSL/TLS toolkit OpenSSL.\n\n\n%package devel\nGroup:         Development/Libraries\nSummary:       Module development tools for apache-mod_ssl\nProvides:      eapi = %{mod_ssl_ver}\nRequires:      %{name} = %{version}\nProvides:      mod_perl-devel = %{mod_perl_ver}\nProvides:      mod_ssl-devel = %{mod_ssl_ver}\nProvides:      apache-devel = %{apache_ver}\n\n%description devel\nThe apache-devel package contains the APXS binary and other files\nthat you need to build Dynamic Shared Objects (DSOs) for Apache.\nIf you are installing the Apache Web server and you want to be able\nto compile or develop additional modules for Apache, you need to install\nthis package.\n\n\n%package manual\nGroup:         Documentation\nSummary:       Documentation for the Apache Web server\n\n%description manual\nThe apache-manual package contains the complete manual and reference\nguide for the Apache Web server.\nIt also contains the basic web content (icons, default welcome messages,\netc) provided with Apache's HTTPD distribution.\n\n\n%prep \n%setup -q -c -T -n %{name}-%{version} -a 0\n%setup -q -c -T -D -n %{name}-%{version} -a 1\n%setup -q -c -T -D -n %{name}-%{version} -a 2\n%setup -q -c -T -D -n %{name}-%{version} -a 6\n\npushd %{aname}_%{apache_ver}\n%patch0 -p0 -b .sslcfg\n%patch1 -p1 -b .config\n%patch3 -p0 -b .make\n%patch5 -p1 -b .apachectl-init\n%ifarch x86_64\n%patch18 -p1 -b .apache-x86_64\n%endif\n\n#patch12 -p1 -b .dbmdb\n%patch13 -p1 -b .compile\n%patch15 -p0 -b .ap_getline\n\n\npatch -p0 < ../libapreq-%{libapreq_ver}/patches/apache-1.3+apreq.patch\ncp ../libapreq-%{libapreq_ver}/c/*.[ch] src/lib/apreq/\npopd\n\npushd mod_ssl-%{mod_ssl_ver}-%{apache_ver}\n%patch11 -p1 -b .openssl\n%patch14 -p0 -b .stack\n%ifarch x86_64\n%patch16 -p1 -b .openssl-x86_64\n%endif\npopd\n\npushd mod_perl-%{mod_perl_ver}\n%patch17 -p1 -b .mp1+perl5.14.diff\npopd\n\n# Substitute values to match the configuration.  The first two are\n# for the default httpd.conf file, the rest is for the mod_ssl\n# additions.\npushd %{aname}_%{apache_ver}\nsed -e 's,@@ServerRoot@@,%{_sysconfdir}/%{pname},g' \\\n    -e 's,@@ContentRoot@@,%{contentdir},g' \\\n    -e 's,^DocumentRoot \"@@ContentRoot@@\",#DocumentRoot \"%{_sysconfdir}/%{pname}/htdocs\",g' \\\n    -e 's,^<Directory \"@@ContentRoot@@/cgi-bin\">,<Directory \"%{contentdir}/cgi-bin\">,g' \\\n    -e 's,^ServerName new.host.name,#ServerName new.host.name,g' \\\n    -e 's,^ServerAdmin you@your.address,#ServerAdmin you@your.address,g' \\\n    -e 's,^SSLCipherSuite,#SSLCipherSuite,g' \\\n    -e 's,^SSLLogLevel info,SSLLogLevel error,g' \\\n    -e 's,^SSLSessionCache         dbm:logs/ssl_scache,SSLSessionCache         shm:logs/ssl_scache(512000),g' \\\n    conf/httpd.conf-dist > conf/httpd.conf\npopd\n\ncp %{SOURCE5} .\n\n#cp %{_tmppath}/rpm-tmp* /tmp/01prep.sh\n\n%build\nexport CFLAGS=\"$RPM_OPT_FLAGS -fPIC $(pkg-config --cflags openssl)\"\nexport LIBS=\"-lpthread\"\nexport EAPI_MM=SYSTEM\n\n###############################################\necho mod_perl ...\npushd mod_perl-%{mod_perl_ver}\n  perl Makefile.PL CCFLAGS=\"$RPM_OPT_FLAGS -fPIC\" \\\n    APACHE_SRC=../%{aname}_%{apache_ver}/src \\\n    DO_HTTPD=1 USE_APACI=1 PREP_HTTPD=1 EVERYTHING=1\n  make %{?_smp_mflags}\n  ## put mod_perl docs in a safe place ;-]~\n  mkdir mod_perl-doc\n  cp -a eg/ faq/ mod_perl-doc/\n  cp {CREDITS,LICENSE,README,SUPPORT,STATUS,Changes,INSTALL*} mod_perl-doc/\n  cp *.{pod,html,gif} mod_perl-doc/\n  find mod_perl-doc -type f -exec chmod 644 {} \\;\npopd\n\n###############################################\necho mod_ssl ...\nexport SSL_COMPAT=yes\nexport SSL_EXPERIMENTAL=yes\npushd mod_ssl-%{mod_ssl_ver}-%{apache_ver}\n  ./configure --with-apache=../apache_%{apache_ver} \\\n    --with-mm=SYSTEM --force\npopd\n\n###############################################\necho apache ...\npushd %{aname}_%{apache_ver}\n  ./configure \\\n \t--prefix=%{_prefix} \\\n \t--exec-prefix=%{_prefix} \\\n \t--bindir=%{_bindir} \\\n \t--sbindir=%{_sbindir} \\\n \t--mandir=%{_mandir} \\\n\t--sysconfdir=%{_sysconfdir}/%{pname}/conf \\\n\t--libexecdir=%{_libdir}/apache \\\n\t--datadir=%{contentdir} \\\n\t--iconsdir=%{contentdir}/icons \\\n\t--htdocsdir=%{contentdir}/html \\\n\t--manualdir=%{contentdir}/html/manual \\\n\t--cgidir=%{contentdir}/cgi-bin \\\n \t--localstatedir=%{_localstatedir} \\\n\t--runtimedir=%{_sysconfdir}/%{pname}/run \\\n\t--logfiledir=logs \\\n\t--proxycachedir=%{_localstatedir}/cache/%{pname} \\\n\t--with-perl=%{__perl} \\\n\t--enable-rule=EAPI \\\n\t--enable-rule=SSL_COMPAT \\\n\t--enable-rule=SSL_EXPERIMENTAL \\\n\t--disable-rule=SSL_VENDOR \\\n\t--disable-rule=WANTHSREGEX \\\n\t--disable-rule=EXPAT \\\n\t%{?_with_backtrace:--activate-module=src/modules/experimental/mod_backtrace.c} \\\n\t%{?_with_whatkilledus:--activate-module=src/modules/experimental/mod_whatkilledus.c} \\\n\t--activate-module=src/modules/perl/libperl.a \\\n\t--enable-module=auth_dbm \\\n\t--enable-module=ssl \\\n\t--enable-module=all \\\n\t--enable-shared=max \\\n\t--disable-shared=perl \\\n\t--disable-shared=ssl \\\n\t--disable-module=example \\\n\t--disable-module=auth_db \\\n\t--without-execstrip \\\n\t%{?_with_suexec:--enable-suexec --suexec-docroot=%{contentdir}} \\\n\t%{?_with_suexec:--suexec-uidmin=300 --suexec-gidmin=300} \\\n\t%{?_with_suexec:--suexec-umask=022 --suexec-caller=%{suexec_caller}}\n\n  make %{?_smp_mflags}\n\npopd\n#cp %{_tmppath}/rpm-tmp* /tmp/02build.sh\n\n%install\n###############################################################################\n### install basic apache stuff\npushd apache_%{apache_ver}\n  make install root=\"$RPM_BUILD_ROOT\"\npopd\n\n### rename \nmv $RPM_BUILD_ROOT%{_sbindir}/httpd $RPM_BUILD_ROOT%{_sbindir}/%{pname}\n\n### install SYSV init stuff\nmkdir -p $RPM_BUILD_ROOT%{_initrddir}\ninstall -m755 %{SOURCE3} $RPM_BUILD_ROOT%{_initrddir}/%{pname}\n\n### install log rotation stuff\nmkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d\ninstall -m644 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/apache\n\n### default rootdir links\nmkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/%{pname}\npushd $RPM_BUILD_ROOT%{_sysconfdir}/%{pname}\n\tln -s %{_localstatedir}/log/%{pname} logs\n\tln -s %{_libdir}/%{aname} modules\n\tln -s %{_localstatedir}/run run\npopd\n\n### replace Apache's default config file with our patched version\ninstall -m644 apache_%{apache_ver}/conf/httpd.conf \\\n\t$RPM_BUILD_ROOT%{_sysconfdir}/%{pname}/conf/httpd.conf\n\n# fix up apxs so that it doesn't think it's in the build root\nperl -pi -e \"s^$RPM_BUILD_ROOT^^g\" $RPM_BUILD_ROOT%{_sbindir}/apxs\n\n# fixup the documentation file naming\nfind $RPM_BUILD_ROOT%{contentdir} -name \"*.html.html\" | xargs rename .html.html .html\n\n###############################################################################\n### install mod_perl files\npushd mod_perl-%{mod_perl_ver}\n  export PERL_INSTALL_ROOT=$RPM_BUILD_ROOT \n  make pure_install PREFIX=/usr INSTALLDIRS=vendor\n\n  # convert man pages to UTF-8\n  recode() {\n    iconv -f \"$2\" -t utf-8 < \"$1\" > \"${1}_\"\n    %{__mv} -f \"${1}_\" \"$1\"\n  }\n  pushd $RPM_BUILD_ROOT/usr/share/man/man3/\n\tfor i in * ; do\n\t\trecode \"${i}\" iso-8859-1\n\tdone\n  popd\n\n  # fix files mod\n  find $RPM_BUILD_ROOT%{perl_vendorarch} -iname '*.pm' -exec chmod 0644 {} \\;\n\n  # bake web docs...\n  mkdir -p $RPM_BUILD_ROOT%{contentdir}/html/manual/mod/mod_perl\n  install -c -m 644 htdocs/manual/mod/mod_perl.html \\\n        $RPM_BUILD_ROOT%{contentdir}/html/manual/mod/mod_perl/\n  make -C faq\n  rm -f faq/pod2htm*\n  install -m644 faq/*.html \\\n    $RPM_BUILD_ROOT%{contentdir}/html/manual/mod/mod_perl/\n\npopd\n\n# remove special perl files this is specific for rpms , already have in own .packlist\nfind $RPM_BUILD_ROOT%{perl_vendorarch}/.. -name perllocal.pod -o -name .packlist \\\n    -o -name '*.bs' | xargs -r -i rm -f {}\n\n### ssl leftovers\n# point to the right makefile.\nln -sf ../../../etc/pki/tls/certs/Makefile $RPM_BUILD_ROOT%{_sysconfdir}/%{pname}/conf\n# create a prototype session cache\ntouch $RPM_BUILD_ROOT%{_localstatedir}/cache/ssl_gcache_data.{dir,pag,sem}\n\n# drop shellbang from .exp files\nfor exp in $RPM_BUILD_ROOT%{perl_vendorarch}/auto/Apache/mod_perl.exp $RPM_BUILD_ROOT%{_libdir}/%{aname}/httpd.exp\ndo\n\tsed -i '/^#!/ d' $exp\ndone\n\n#cp %{_tmppath}/rpm-tmp* /tmp/03install.sh\n\n%post\n/sbin/chkconfig --add %{pname}\n/sbin/ldconfig\n\n# safely build a test certificate\numask 077\nif [ ! -f %{_sysconfdir}/%{pname}/conf/ssl.key/server.key ] ; then\nopenssl genrsa -rand /proc/apm:/proc/cpuinfo:/proc/dma:/proc/filesystems:/proc/interrupts:/proc/ioports:/proc/pci:/proc/rtc:/proc/uptime 1024 > %{_sysconfdir}/%{pname}/conf/ssl.key/server.key 2> /dev/null\nfi\n\nif [ ! -f %{_sysconfdir}/%{pname}/conf/ssl.crt/server.crt ] ; then\ncat << EOF | openssl req -new -key %{_sysconfdir}/%{pname}/conf/ssl.key/server.key -x509 -days 365 -out %{_sysconfdir}/%{pname}/conf/ssl.crt/server.crt 2>/dev/null\n--\nSomeState\nSomeCity\nSomeOrganization\nSomeOrganizationalUnit\nlocalhost.localdomain\nroot@localhost.localdomain\nEOF\nfi\n\n# safely add .htm to mime types if it is not already there\n[ -f %{_sysconfdir}/mime.types ] || exit 0\nTEMPTYPES=`/bin/mktemp /tmp/mimetypes.XXXXXX`\n[ -z \"$TEMPTYPES\" ] && {\n  echo \"could not make temporary file, htm not added to %{_sysconfdir}/mime.types\" >&2\n  exit 1\n}\n( grep -v \"^text/html\"  %{_sysconfdir}/mime.types\n  types=$(grep \"^text/html\" %{_sysconfdir}/mime.types | cut -f2-)\n  echo -en \"text/html\\t\\t\\t\"\n  for val in $types ; do\n      if [ \"$val\" = \"htm\" ] ; then\n          continue\n      fi\n      echo -n \"$val \"\n  done\n  echo \"htm\"\n) > $TEMPTYPES\ncat $TEMPTYPES > %{_sysconfdir}/mime.types && /bin/rm -f $TEMPTYPES\n\ncp %{_tmppath}/rpm-tmp* /tmp/04post.sh\n\n%pre\n# Add the \"apache\" user\n/usr/sbin/useradd -c \"Apache\" -u 48 \\\n\t-s /sbin/nologin -r -d \"%{contentdir}\" apache 2> /dev/null || :\n\n%preun\nif [ $1 = 0 ]; then\n\tif [ -f /var/lock/subsys/%{pname} ]; then\n\t\t%{_initrddir}/%{pname} stop\n\tfi\n\tif [ -f %{_initrddir}/%{pname} ]; then\n\t\t/sbin/chkconfig --del %{pname}\n\tfi\nfi\n\n%files\n%defattr(-,root,root)\n%dir %{_sysconfdir}/%{pname}\n%dir %{_sysconfdir}/%{pname}/conf\n%config(noreplace) %{_sysconfdir}/%{pname}/conf/*.conf\n%config(noreplace) %{_sysconfdir}/%{pname}/conf/Makefile\n%config(noreplace) %{_sysconfdir}/%{pname}/conf/magic\n%config(noreplace) %{_sysconfdir}/%{pname}/conf/mime.types\n%config(noreplace) %{_sysconfdir}/logrotate.d/*\n%config(noreplace) %{_sysconfdir}/%{pname}/conf/ssl.*\n%doc %{_sysconfdir}/%{pname}/conf/*.default\n%attr(755,root,root) %{_initrddir}/*\n%{_sysconfdir}/%{pname}/logs\n%{_sysconfdir}/%{pname}/modules\n%{_sysconfdir}/%{pname}/run\n%{_libdir}/%{aname}\n%{perl_vendorarch}/Apache\n%{perl_vendorarch}/Bundle\n%{perl_vendorarch}/*.pm\n%{perl_vendorarch}/*.PL\n%dir %{perl_vendorarch}/auto/Apache\n%{perl_vendorarch}/auto/Apache/Leak\n%{perl_vendorarch}/auto/Apache/Symbol\n%{perl_vendorarch}/auto/Apache/mod_perl.exp\n%{perl_vendorarch}/auto/Apache/typemap\n%attr(0755,root,root) %{_bindir}/*\n%attr(0755,root,root) %{_sbindir}/ab\n%attr(0755,root,root) %{_sbindir}/apachectl\n%attr(0755,root,root) %{_sbindir}/httpd13\n%attr(0755,root,root) %{_sbindir}/logresolve\n%attr(0755,root,root) %{_sbindir}/rotatelogs\n%{?_with_suexec:%attr(4710,root,%{suexec_caller}) %{_sbindir}/suexec}\n%{_mandir}/man1*/*\n%{_mandir}/man8/ab.8*\n%{_mandir}/man8/apachectl.8*\n%{_mandir}/man8/httpd.8*\n%{_mandir}/man8/logresolve.8*\n%{_mandir}/man8/rotatelogs.8*\n%{?_with_suexec:%{_mandir}/man8/suexec.8*}\n%attr(0755,apache,root) %dir %{_localstatedir}/cache/%{pname}\n%attr(0640,apache,root) %{_localstatedir}/cache/ssl_*\n%attr(0750,root,apache) %dir %{_localstatedir}/log/%{pname}\n\n\n%files devel\n%defattr(-,root,root)\n%{_includedir}\n%attr(0755,root,root) %{_sbindir}/apxs\n%{_mandir}/man8/apxs.8*\n%doc %{perl_vendorarch}/*.pod\n%{perl_vendorarch}/auto/Apache/include\n\n%files manual\n%defattr(-,root,root)\n%doc apache_%{apache_ver}/cgi-bin\n%dir %{contentdir}\n%dir %{contentdir}/cgi-bin\n%config(noreplace) %{contentdir}/cgi-bin/*\n%dir %{contentdir}/html\n%config(noreplace) %{contentdir}/html/*.html*\n%config(noreplace) %{contentdir}/html/*.gif\n%dir %{contentdir}/icons\n%dir %{contentdir}/icons/small\n%config(noreplace) %{contentdir}/icons/*.*\n%config(noreplace) %{contentdir}/icons/small/*.*\n%doc %{contentdir}/icons/README\n\n%doc apache_%{apache_ver}/{ABOUT_APACHE,LICENSE*,NOTICE,README*,cgi-bin}\n%doc apache_%{apache_ver}/src/{CHANGES,README}*\n%doc mod_ssl-%{mod_ssl_ver}-%{apache_ver}/README.*\n%doc mod_ssl-%{mod_ssl_ver}-%{apache_ver}/NEWS\n%doc mod_perl-%{mod_perl_ver}/mod_perl-doc\n%doc SSL-Certificate-Creation\n\n%doc %{contentdir}/html/manual\n%exclude %{contentdir}/html/manual/mod/mod_ssl/ssl_cover.wml\n#man3 conflicts with mod_perl2\n/usr/share/man/man3*/*\n\n\n%changelog\n* Sun May 13 2012 Sérgio Basto <sergio@serjux.com> - 1.3.42-4\n- Many improvements on defaults directories \n- Separate libapreq in other package, to compile libapreq is need other sources installed. \n- more cleanups.\n\n* Wed Nov 16 2011 Sérgio Basto <sergio@serjux.com>\n- build for F16\n- mp1+perl5.14.diff (mod_perl1 + perl5.14)\n- many improvents.\n\n* Sat Oct 29 2011 Sérgio Basto <sergio@serjux.com>\n- mock build add many buildrequires\n- many improvemts on confs \n\n* Tue Oct 16 2007 Sérgio Basto <sergio@serjux.com>\n- UNDROPPED CONFIGURATION COMPLETELY: rpm it suposed do all alone.\n- rename httpd to http13 to work independently of apache 2.2\n- add patch to Makefile.tmp, resolve all problems at once\n- change server port number to run out of the box.\n- Update link to certs/Makefile.\n\n* Tue Sep 11 2007 Marius FERARU <altblue@n0i.net> - 1.3.39-1.n0i.23.MPSSL\n- apache 1.3.39\n- mod_ssl 2.8.29\n\n* Mon Apr 02 2007 Marius FERARU <altblue@n0i.net> - 1.3.37-3.n0i.22.MPSSL\n- mod_perl 1.30\n- initscript: use a \"$pidfile\" variable for all operations\n- initscript: added a dummy \"alias\" for \"reload\" (will do a 'restart'!)\n- initscript: added missing \"fullstatus\" option (will run through \"apachectl\")\n- dropped shellbang from .exp files\n- dropped 2 explicit provides (mod_perl and Apache::Constants)\n\n* Fri Sep 08 2006 Marius FERARU <altblue@n0i.net> - 1.3.37-2.n0i.21.MPSSL\n- BR: gdbm-devel, db4-devel\n\n* Mon Aug 21 2006 Marius FERARU <altblue@n0i.net> - 1.3.37-1.n0i.20.MPSSL\n- apache 1.3.37\n- mod_ssl 2.8.28\n- Dist macro\n- URL update\n- updated description\n- spec cleanups\n- use \"--with backtrace\" to activate \"mod_backtrace\"\n- use \"--with whatkilledus\" to activate \"mod_whatkilledus\"\n- use \"--with suexec\" to activate suexec functionality\n- moved default web content into documentation package\n\n* Tue Jun 06 2006 Marius FERARU <altblue@n0i.net> - 1.3.36-2.n0i.19.MPSSL\n- changed \"runtimedir\" and \"logfiledir\" to relative paths,\n  letting users run apache on their own\n\n* Tue Jun 06 2006 Marius FERARU <altblue@n0i.net> - 1.3.36-1.n0i.19.MPSSL\n- apache 1.3.36\n- mod_ssl version 2.8.27\n- spec cleanups\n\n* Mon Mar 13 2006 Marius FERARU <altblue@n0i.net> - 1.3.34-2.n0i.18.MPSSL\n- rebuild\n\n* Thu Nov 24 2005 Marius FERARU <altblue@n0i.net> 1.3.34-1.n0i.17.MPSSL\n- apache 1.3.34\n- mod_ssl version 2.8.25\n\n* Tue Sep 20 2005 Marius FERARU <altblue@n0i.net> 1.3.33-5.n0i.16.MPSSL\n- mod_ssl version 2.8.24\n\n* Fri Sep 02 2005 Marius FERARU <altblue@n0i.net> 1.3.33-4.n0i.15.MPSSL\n- rebuild\n- dropped more requirements (which Fedora considers to \"always have\")\n\n* Sat Jul 23 2005 Marius FERARU <altblue@n0i.net> 1.3.33-3.n0i.14.MPSSL\n- dropped Epoch\n- changed Summary and Description\n- rebuild (perl 5.8.7)\n\n* Tue Jan 04 2005 Marius FERARU <altblue@n0i.net> 1.3.33-2.n0i.13.MPSSL\n- libapreq version 1.33\n\n* Mon Dec 06 2004 Marius FERARU <altblue@n0i.net> 1.3.33-1.n0i.12.MPSSL\n- apache version 1.3.33\n- mod_ssl version 2.8.22\n- description update\n\n* Tue Aug 17 2004 Marius FERARU <altblue@n0i.net> 1.3.31-5.n0i.11.MPSSL\n- mod_ssl version 2.8.19\n\n* Thu Jul 15 2004 Marius FERARU <altblue@n0i.net> 1.3.31-4.n0i.10.MPSSL\n- mod_ssl version 2.8.18\n\n* Tue Jul 13 2004 Marius FERARU <altblue@n0i.net> 1.3.31-3.n0i.9.MPSSL\n- tweaked rotatelog's build: drop linking with apache libs\n\n* Tue Jul 13 2004 Marius FERARU <altblue@n0i.net> 1.3.31-2.n0i.8.MPSSL\n- applied some fixing patches from current CVS version\n\n* Thu May 13 2004 Marius FERARU <altblue@n0i.net> 1.3.31-1.n0i.7.MPSSL\n- apache version 1.3.31\n- mod_ssl version 2.8.17\n- updated apxs patch\n- slight spec tweaks\n- enabled backtrace experimental module\n- updated config patch\n\n* Fri Apr 30 2004 Marius Feraru <altblue@n0i.net> 1.3.29-6.n0i.6.MPSSL\n- automatic rebuild\n\n* Thu Apr 22 2004 Marius FERARU <altblue@n0i.net> 1.3.29-5.n0i.5.MPSSL\n- rebuild (perl 5.8.4)\n\n* Tue Feb 10 2004 Marius FERARU <altblue@n0i.net> 1.3.29-4.n0i.4.MPSSL\n- fixed the shameful bugs from my httpd.init script\n\n* Fri Jan 23 2004 Marius FERARU <altblue@n0i.net> 1.3.29-3.n0i.3.MPSSL\n- rebuild (perl 5.8.3)\n\n* Fri Jan 16 2004 Marius FERARU <altblue@n0i.net> 1.3.29-2.n0i.2.MPSSL\n- rebuilt on perl 5.8.2 / Fedora 1 Devel (tobe FC2)\n- finally clearly enabled modperl.c in apache_1.3.23-config.patch\nas many helpless people seem to use this dumb default configuration file :(\n- also updated the same patch to properly define SSL too :)\n- added a lame \"MPSSL\" extra tag in release to make people understand this\nis a !SPECIAL! apache + mod_perl + mod_ssl + libapreq package suite!!!\n- updated init script to do \"real\" server shutdown (in squid style) and to NOT\nshutdown all the apache servers, just the one started with /var/run/httpd.pid\n- added USE_MODULEARGS=[yes/no] and SHUTDOWN_TIMEOUT=[seconds] configuration\nparameters to init script\n\n* Thu Nov 13 2003 Marius FERARU <altblue@n0i.net> 1.3.29-1.n0i.1\n- apache 1.3.29\n- modssl 2.8.16\n- dropped zombie patch\n- dropped fderr patch\n- dropped for good thttpd conflict note as THERE IS NO CONFLICT!!! In fact\nwe really use them both for long time without a problem :))\n- added more Prereq stuff\n- more Fedora style spec updates\n\n* Thu Oct 16 2003 Marius FERARU <altblue@n0i.net> 1.3.28-2.n0i\n- mod_perl 1.29\n- libapreq 1.3\n- replaced ALL direct 'etc' occurences to macros (some for other stuff)\n- perl %%files are now more properly quested.\n- switched krb5-config to pkg-config\n- switched textutils to coreutils\n- using mm 1.3\n- disabled internal expat linking\n- added the 'zombie' patch\n- added the 'file descriptors are erroneously closed' patch\n\n* Mon Jul 28 2003 Marius FERARU <altblue.net> 1.3.28-1.n0i\n- mod_perl 1.28\n- added builtin libapreq\n\n* Fri Jul 25 2003 Marius FERARU <altblue@n0i.net> 1.3.28-0.n0i\n- apache version 1.3.28\n- mod_ssl version 2.8.15\n- switched the old dbm-gdbm patch with a more elegant one (apache_1.3.27-db);\nyet, more tests are to be done on other systems before dropping the old one\nfrom our src.rpm\n- disabled suexec SSL env support patch as Apache ppl changed their code heavily\nand I do not yet have time to update this patch\n- moved mod_perl header files into apache-devel (are they needed by someone?!)\n- dropped using RPM_SOURCE_DIR/<filename> stuff.\n- disabled auth_db module (db4 API changes?!)\n\n* Mon Apr 21 2003 Marius FERARU <altblue@n0i.net> 1.3.27-2.n0i\n- automatic rebuild on RHL9\n\n* Wed Mar 26 2003 Marius FERARU <altblue@n0i.net> 1.3.27-1.n0i\n- mod_ssl version 2.8.14\n- dropped thttpd conflict note as THERE IS NO CONFLICT!!! In fact we really\nuse them both :))\n\n* Fri Oct 18 2002 Marius Feraru <altblue@n0i.net>\n- apache version 1.3.27\n- mod_ssl version 2.8.11\n- eliminated db4 patch\n- disabled thttpd conflict flag\n\n* Tue Sep 24 2002 Marius Feraru <altblue@n0i.net>\n- automatic rebuild (to conform with the openssl update)\n\n* Wed Sep  4 2002 Marius Feraru <altblue@n0i.net>\n- some spec cleanups (rpm 4.1.x compatibility)\n\n* Tue Jul 23 2002 Marius FERARU <altblue@n0i.net>\n- apache 1.3.26\n- mod_perl 1.27\n- mod_ssl 2.8.10\n- lots of new tweaks to the spec file (hopefully it will be easier now for others to\nrebuild this package =] )\n\n\n* Sat Sep 1 2001 Marius FERARU <altblue@n0i.net>\n- updated apache to 1.3.22\n- reparsed and tweaked all RedHat patches\n- lots of spec file tweaks: optimisations,\n  file location/integration/modes fixes...\n\n* Sat Sep 1 2001 Marius FERARU <altblue@n0i.net>\n- updated mod_perl to version 1.26\n- based on apache-1.3.20-15.src.rpm from Red Hat RawHide\n- used apache_modperl-1.3.19-1.24-1.src.rpm from\n  perl.apache.org as example spec.\n"
  },
  {
    "path": "src/test/resources/samples/langs/RPM Spec/erlang-erlydtl.spec",
    "content": "%global debug_package %{nil}\n\nName:           erlang-erlydtl\nVersion:        0.6.0\nRelease:        1%{?dist}\nSummary:        Erlang implementation of the Django Template Language.\n\nGroup:          Development/Libraries\nLicense:        MIT\nURL:            http://code.google.com/p/erlydtl/\nSource0:        http://erlydtl.googlecode.com/files/erlydtl-0.6.0.tar.gz\nPatch0:         erlang-erlydtl-0.6.0-tests.patch\nPatch1:         erlang-erlydtl-0.6.0-r14a.patch\nBuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)\n\nProvides:       ErlyDTL = %{version}-%{release}\nBuildRequires:  erlang\nRequires:       erlang\n\n%description\nErlyDTL is an Erlang implementation of the Django Template Language. The\nerlydtl module compiles Django Template source code into Erlang bytecode. The\ncompiled template has a \"render\" function that takes a list of variables and\nreturns a fully rendered document\n\n%prep\n%setup -q -n erlydtl-%{version}\nfind examples/ -type f -executable -exec chmod -x {} \\;\n\n%patch0 -p0\n%patch1 -p0\n\n%build\nmake %{?_smp_mflags}\n\n%check\nmake test\n\n\n%install\nrm -rf %{buildroot}\nmkdir -p %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/\ncp -r ebin     %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/\ncp -r bin      %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/\ncp -r priv     %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/\n\n\n%clean\nrm -rf %{buildroot}\n\n\n%files\n%defattr(-,root,root,-)\n%dir %{_libdir}/erlang/lib/erlydtl-%{version}  \n%{_libdir}/erlang/lib/erlydtl-%{version}/*\n%doc README\n%doc examples\n\n\n%changelog\n* Sun Aug 1 2010 Ilia Cheishvili <ilia.cheishvili@gmail.com> - 0.6.0-1\n- Initial Package\n"
  },
  {
    "path": "src/test/resources/samples/langs/RPM Spec/manos.spec",
    "content": "#\n# spec file for package manos\n#\n# Copyright (c) 2010 Jackson Harper (jackson@novell.com)\n#\n#\n\nName:           manos-devel\nVersion:        0.1.1\nRelease:        1\nLicense:        MIT/X11\nBuildRoot:      %{_tmppath}/manos-%{version}-build\nBuildRequires:  mono-devel >= 2.6\nBuildRequires:  mono-nunit >= 2.6\nSource0:        manos-%{version}.tar.bz2\nSource1:        rpmlintrc\nSummary:        The Manos Web Application Framework\nGroup:          Development/Web/Servers\nBuildArch:      noarch\n\n%description\nManos is an easy to use, easy to test, high performance web application framework that stays out of your way and makes your life ridiculously simple.\n\n%files\n%defattr(-, root, root)\n%{_prefix}/lib/manos\n%{_bindir}/manos\n%{_datadir}/manos\n%{_prefix}/lib/pkgconfig/manos.pc\n%{_datadir}/man/man1/manos.1.gz\n\n%prep\n%setup -q -n manos-%{version}\n\n\n%build\n./configure --prefix=%{buildroot}%{_prefix} --install-prefix=%{_prefix}\nmake\n\n%install\nmake install\n\n%clean\nrm -rf %{buildroot}\n\n%changelog"
  },
  {
    "path": "src/test/resources/samples/langs/RUNOFF/VMS_ZIP.RNH",
    "content": ".!\n.!  File:       ZIP.RNH\n.!\n.!  Author:     Hunter Goatley\n.!\n.!  Date:       October 22, 1991\n.!\n.!  Description:\n.!\n.!      RUNOFF source file for portable ZIP on-line help for VMS.\n.!      Adapted from MANUAL, distributed with ZIP.\n.!\n.!      To build:       $ RUNOFF ZIP.RNH\n.!                      $ LIBR/HELP/INSERT libr ZIP\n.!\n.!  Modification history:\n.!\n.!      Hunter Goatley          22-OCT-1991 20:45\n.!              Genesis.\n.!      Jean-loup Gailly        25 March 92\n.!              Adaptation to zip 1.6.\n.!      Igor Mandrichenko       9-JUN-1992\n.!              Added explanation of -V option.\n.!      Jean-loup Gailly        14 June 92\n.!              Adaptation to zip 1.8.\n.!      Jean-loup Gailly        20 Aug 92\n.!              Adaptation to zip 1.9.\n.!      Jean-loup Gailly        31 Aug 93\n.!              Adaptation to zip 2.0.\n.!      Christian Spieler       20 Sep 93\n.!              Adaptation to zip 2.0 and OpenVMS completed.\n.!      Christian Spieler       05 Dec 95\n.!              Adaptation to zip 2.1, new options.\n.!      Christian Spieler       20 Jan 96\n.!              Changed -L and -v descriptions.\n.!      Christian Spieler       11 Feb 96\n.!              Added -X option.\n.!      Onno van der Linden,\n.!      Christian Spieler       13 Mar 96\n.!              Removed -ee option.\n.!      Christian Spieler       09 Feb 96\n.!              Updated copyright notice, Zip version.\n.!      Christian Spieler       21 Jul 97\n.!              Added -P, -R, -i@, -x@ and -tt options, modified for Zip 2.2.\n.!      Christian Spieler       14 Oct 97\n.!              unified spelling of \"Info-ZIP\", final cleanups for 2.2.\n.!      Steven Schweda          10 May 2007\n.!              General update for version 3.0.\n.!      Ed Gordon               12 May 2007\n.!              Minor updates for version 3.0.\n.!\n.noflags\n.lm4 .rm72\n.indent -4\n1 ZIP\n.br\nZip is a compression and file packaging utility for several operating\nsystems, including UNIX, VMS,  MSDOS, OS/2, Windows 9x/NT/XP, Minix, Atari,\nMacintosh, Amiga, and Acorn RISC OS.  It is analogous to a combination of\ntar and compress and is compatible with PKZIP (Phil Katz's ZIP) for\nMSDOS systems.\n.sk\nZip is useful for packaging a set of files for distribution, for\narchiving files, and for saving disk space by temporarily compressing\nunused files or directories.  A companion program, UnZip, unpacks Zip\narchives.\n.sk\nFor brief help on Zip or UnZip, run the program without specifying any\nparameters on the command line.\n.sk\nThis description covers the Zip program which uses a UNIX-style command\nline.  A separate program is available which provides a VMS-style CLI\ncommand line, and it has its own documentation.  Refer to the Zip\ninstallation instructions for details.\n.sk\nFormat\n.sk;.lm+2;.literal\nZIP [-options] archive inpath inpath ...\n.end literal;.lm-2\n.!------------------------------------------------------------------------------\n.indent -4\n2 Basic_Usage\n.br\nFormat\n.sk;.lm+2;.literal\nZIP [-options] archive inpath inpath ...\n.end literal;.lm-2\n.sk\nThe default action of Zip is to add or replace entries in \"archive\" from\nthe list of \"inpath\" file specifications, which can include directories\nand file names with VMS-style wildcards, or the special name -@ to read\nfile specifications from SYS$INPUT (stdin).\n.sk\nWith SET PROCESS /PARSE_STYLE = EXTENDED (available on recent non-VAX\nsystems), Zip preserves the case of the command line.  Otherwise, mixed-\nor upper-case options and arguments must be quoted.  For example,\n\"-V\".  Examples in this document generally do not show this quotation,\nso VAX and /PARSE_STYLE = TRADITIONAL users (that is, troglodytes) will\nneed to add quotation where needed when working with these examples.\n.sk\nGeneral\n.sk\nZip reads one or more files, compresses the data (normally), and stores\nthe compressed information into a single Zip archive file, along with\ninformation about each file (name, path, date and time of last\nmodification, protection, and check information to verify file\nintegrity).  On a VMS system, Zip can also save VMS/RMS file attributes,\nallowing UnZip to restore the files without loss of important file\nattributes.  Zip can pack an entire directory structure into a Zip\narchive with a single command.\n.sk\nCompression\n.sk\nCompression ratios of 2:1 to 3:1 are common for text files.  Zip has one\nstandard compression method (\"deflate\") and can also store files without\ncompression.  Zip (and UnZip) may be built with optional support for the\nbzip2 compression method.  Then, the user may select bzip2 compression\ninstead of the default \"deflate\" method.  Zip automatically chooses\nsimple storage over compression for a file, if the specified compression\nmethod does not actually compress the data in that file.\n.sk\nCompatibility\n.sk\nZip and UnZip can work with archives produced by PKZIP (supporting most\nPKZIP features up to PKZIP version 4.6), and PKZIP and PKUNZIP can work\nwith archives produced by Zip (with some exceptions, notably streamed\narchives, but recent changes in the .ZIP file standard may facilitate\nbetter compatibility).  Zip version 3.0 is compatible with PKZIP 2.04\nand also supports the Zip64 extensions of PKZIP 4.5 which allows\narchives as well as files to exceed the previous 2 GB limit (4 GB in\nsome cases).  Zip also supports bzip2 compression if the bzip2 library\nis included when Zip is built.  Note that PKUNZIP 1.10 cannot extract\nfiles produced by PKZIP 2.04 or Zip 3.0.  You must use PKUNZIP 2.04g or\nUnZip 5.0p1 (or later versions) to extract them.\n.sk\nLarge Archives and Zip64\n.sk\nWhere the operating system and C run-time support allow, Zip 3.0 and\nUnZip 6.0 (and later versions) support large files (input and archive),\nusing the Zip64 extensions to the original .ZIP file format.  On VMS,\nthis genarally means non-VAX systems with VMS V7.2 or later (perhaps\nrequiring a C RTL ECO before VMS V7.3-2).\n.sk\nZip automatically uses the Zip64 extensions when a file larger than 2 GB\nis added to an archive, an archive containing a Zip64 entry is updated\n(if the resulting archive still needs Zip64), the size of the archive\nwill exceed 4 GB, or when the number of entries in the archive will\nexceed about 64K.  Zip64 is also used for archives streamed to a\nnon-seekable output device.  You must use a 4.5 compatible UnZip to\nextract files using the Zip64 extensions such as UnZip 6.0 or later.\n.sk\nIn addition, streamed archives, entries encrypted with standard\nencryption, or split archives created with the pause option may not be\ncompatible with PKZIP as data descriptors are used, and PKZIP at the \ntime of this writing does not support data descriptors (but recent\nchanges in the PKWare published .ZIP file standard now include some\nsupport for the data descriptor format Zip uses).\n.!------------------------------------------------------------------------------\n.indent -4\n2 More_Usage\n.br\nHere is a very simple example of Zip use:\n.sk;.indent 10;\n$ zip stuff.zip *.*\n.sk\nThis will create the Zip archive \"stuff.zip\" (assuming it does not\nalready exist) and put all the (non-directory) files (\";0\") from the\ncurrent default directory into \"stuff.zip\" in a compressed form.  The\narchive is opened using a default file specification of\n\"SYS$DISK:[].zip\", so specifying \"stuff\" as the archive name would also\ncreate (or use an existing) \"stuff.zip\", but specifying \"stuff.other\"\nwould give you that name.  In general, Zip doesn't care about the type\nin the file specification, but for split archives (archives split over\nmultiple files), the user should normally specify a type-less name,\nbecause Zip will normally generate sequentially numbered types \".z01\",\n\".z02\", and so on for the early splits, and then the required \".zip\" for\nthe last split.  These file types are required by the Zip standard for\nsplit archives.\n.sk\nStandard VMS wildcard expansion ($SEARCH) is used to interpret the\n\"inpath\" file and directory specifications, like the \"*.*\" in this\nexample.\n.sk\nOn VMS, the most natural way to archive an entire directory tree is to\nuse a directory-depth wildcard (\"[...]\").  For example:\n.sk;.indent 10\nzip foo [...]*.*\n.sk\nThis will create the file \"foo.zip\" containing all the files (\";0\") and\ndirectories in and below the current default directory.  A more\nUNIX-like way to do this would be to use the -r (--recurse-paths)\noption:\n.sk;.indent 10\n$ zip -r foo *.*\n.sk\nZip avoids including its own output files when selecting files to\ninclude in the archive, so it should be safe, as in this case, to create\nthe archive in the same drectory as the input files.\n.sk\nOne or more specific files, directories, or subdirectories may also be\nspecified:\n.lm +10;.literal\nzip foo.zip readme.txt [www...]*.* [.ftp...]*.* -\n [.src]*.h [.src]*.c\n.end literal;.lm -10\n.sk\nFor security reasons, paths in Zip archives are always stored as\nrelative paths, so some care is needed when creating an archive so that\nit will create the intended directory structure when UnZip is used to\nunpack it.\n.sk\nTo use -r with a specific directory, the name of the directory file\nitself must be specified:\n.sk;.indent 10\nzip -r foo.zip [000000]www.dir ftp.dir\n.sk\nYou may want to make an archive that contains the files in [.foo], but not\nrecord the directory name, \"foo\".  You can use the -j (junk path) option\nto leave off the path:\n.sk;.indent 10\n$ zip -j foo [.foo]*.*\n.sk\nIf you are short on disk space, you might not have enough room to hold\nboth the original directory and the corresponding compressed Zip\narchive.  In this case, you can create the archive in steps, and use the\n-m option.  For example, if [.foo] contains the subdirectories [.tom],\n[.dick], and [.harry], you could:\n.sk\n.lm +10;.literal\nzip -m foo [.foo.tom...]*.*\nzip -m foo [.foo.dick...]*.*\nzip -m foo [.foo.harry...]*.*\n.end literal;.lm -10\n.sk\nThe first command would create foo.zip, and the next two would add to\nit.  The -m option means \"move\", and it will cause Zip to delete all\nfiles added to the archive after making or updating foo.zip.  No\ndeletions will be done until the Zip operation has completed with no\nerrors.  This option is obviously dangerous and should be used with\ncare, but it does reduce the need for free disk space.  When -m is\nused, the -T option is recommended and will test the resulting archive\nbefore deleting the input files.\n.sk\nIf a file specification list is too long to fit conveniently on the Zip\ncommand line, the -@ option can be used to cause Zip to read a list of\nfile specifications from SYS$INPUT (stdin).  If a DCL command procedure\nis used, the names can be specified in the procedure:\n.sk;\n.lm +10;.literal\n$ zip foo -@\n$ deck\nfile_spec_1\nfile_spec_2\nfile_spec_3\n$ eod\n.end literal;.lm -10\n.sk\nThe file specifications can also be put into a separate file, and fed\ninto Zip by explicitly defining SYS$INPUT, or by using PIPE.  For\nexample, with the list in foo.zfl:\n.sk;\n.lm +10;.literal\n$ define /user_mode sys$input foo.zfl\n$ zip foo -@\n.end literal;.lm -10;\nor:\n.lm +10;.literal\n$ pipe type foo.zfl | zip foo -@\n.end literal;.lm -10\n.sk\nIf Zip is not able to read a file, it issues a warning but continues.\nSee the -MM option for more on how Zip handles patterns that are not\nmatched and files that are not readable.  If some files were skipped, a\nwarning is issued at the end of the Zip operation noting how many files\nwere read and how many skipped.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Comments\n.br\nOne-line comments may be included in the archive for each file added,\nusing the -c (--entry-comments) option.  File operations (adding,\nupdating) are done first, and the user is then prompted for a one-line\ncomment for each file added or updated.  Enter the comment followed by\n<Return>, or just <Return> for no comment.\n.sk\nA single multi-line comment may be included for the archive as a whole,\nusing the -z (--archive-comment) option.  UnZip (including UnZip SFX)\nwill display this comment when it expands the archive.  The comment is\nread from SYS$INPUT (stdin), and is terminated by the usual end-of-file\ncharacter, CTRL/Z.  As usual, in a DCL command procedure, these data can\nbe included in-line in the procedure, or a user may DEFINE SYS$INPUT to\na file to get the comment from that file.  Where supported, the DCL PIPE\ncommand can also be used to redirect SYS$INPUT from a file.\n.sk\nNote that -z (--archive-comment) and -@ (read file specifications from\nSYS$INPUT (stdin)) can't be used together (successfully).\n.!------------------------------------------------------------------------------\n.indent -4\n2 Compression\n.br\nZip can archive files with or without compression.  The standard\ncompression method (\"deflate\") is compatible with all UnZip versions\n(except really old ones that only understand the \"store\" method). \nCurrent Zip and UnZip versions may be built with optional support for\nthe bzip2 compression method.  (The bzip2 method can compress better,\nespecially when compressing smaller files, but uses more CPU time, and\nrequires an UnZip which includes the optional bzip2 support.  See the\ninstallation instructions for details on adding bzip2 compression\nsupport at build time.)\n.sk\nNumeric compression level options control the effort put into data\ncompression, with -1 being the fastest, and -9 giving the most\ncompression.\n.sk\nCompression control options:\n.sk;.lm +10;.literal\n-Z mthd                      use compress method \"mthd\",\n--compression-method mthd    \"bzip2\" or \"deflate\" (default)\n\n-0  (--store)                no compression\n-1  (--compress-1)           compression level 1\n-2  (--compress-2)           compression level 2\n-3  (--compress-3)           compression level 3\n-4  (--compress-4)           compression level 4\n-5  (--compress-5)           compression level 5\n-6  (--compress-6)           compression level 6\n-7  (--compress-7)           compression level 7\n-8  (--compress-8)           compression level 8\n-9  (--compress-9)           compression level 9\n.end literal;.lm -10\n.sk\nNormally, a file which is already compressed will not be compressed much \nfurther (if at all) by Zip, and trying to do it can waste considerable\nCPU time.  Zip can suppress compression on files with particular types,\nspecified as a colon- or semi-colon-separated list of file types:\n.sk;.indent 10\n-n type1[:type2[...]]  (--suffixes type1[:type2[...]])\n.sk\nFor example:\n.sk;.indent 10\nzip -n .bz2:.gz:.jpeg:.jpg:.mp3:.zip foo [.foo]*.*\n.sk\nwill put everything (\";0\") from [.foo] into foo.zip, but will store any\nfiles that end in .bz2, .gz, .jpeg, .jpg, .mp3, or .zip, without trying\nto compress them.\n.sk\nThe default type list is .Z:.zip:.zoo:.arc:.lzh:.arj, and the comparison\nis case-insensitive.\n.sk\n-9 (--compress-9) will override -n (--suffixes), causing compression to\nbe attempted for all files.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Encryption\n.br\nZip offers optional encryption, using a method which by modern standards\nis generally considered to be weak.\n.sk;.literal\n-e  --encrypt\n.end literal;.br\nEncrypt new or updated archive entries using a password which is\nsupplied by the user interactively on the terminal in response to a\nprompt.  (The password will not be echoed.)  If SYS$COMMAND is not a\nterminal, Zip will exit with an error.  The password is verified before\nbeing accepted.\n.sk;.literal\n-P password  --password password\n.end literal;.br\nUse \"password\" to encrypt new or updated archive entries (if any). \nUSING -P IS INSECURE!   Many multi-user operating systems provide ways\nfor any user (or a privileged user) to see the current command line of\nany other user.  Even on more secure systems, there is always the threat\nof over-the-shoulder peeking.  Storing the plaintext password as part of \na command line in a command procedure is even less secure.  Whenever\npossible, use the non-echoing, interactive password entry method.\n.sk\nBecause standard Zip encryption is weak, where security is truly\nimportant, use a strong encryption program, such as Pretty Good Privacy\n(PGP) or GNU Privacy Guard (GnuPG), on an archive instead of standard\nZip encryption.  A stronger encryption method, such as AES, is planned\nfor Zip 3.1.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Exit_Status\n.br\nOn VMS, Zip's UNIX-style exit values are mapped into VMS-style status\ncodes with facility code 1955 = %x7A3, and with the inhibit-message\n(%x10000000) and facility-specific (%x00008000) bits set:\n.sk\n.literal\n   %x17A38001                        normal exit\n   %x17A38000+ 16* Zip_error_code    warnings\n   %x17A38002+ 16* Zip_error_code    normal errors\n   %x17A38004+ 16* Zip_error_code    fatal errors\n.end literal\n.sk\nNote that multiplying the UNIX-style Zip error code by 16 places it\nconveniently in the hexadecimal representation of the VMS exit code,\n\"__\" in %x17A38__s, where \"s\" is the severity code.  For example, a\ntruncated archive might cause Zip error code 2, which would be\ntransformed into the VMS exit status %x17A38024.\n.sk\nThe Zip VMS exit codes include severity values which approximate those\ndefined by PKWARE, as shown in the following table:\n.literal\n\n    VMS      Zip err\n  severity    code     Error description\n ----------+---------+----------------------------------------------\n  Success       0      Normal; no errors or warnings detected.\n  Fatal         2      Unexpected end of archive.\n  Error         3      A generic error in the  archive  format  was\n                       detected.   Processing  may  have  completed\n                       successfully anyway;  some  broken  archives\n                       created by other archivers have simple work-\n                       arounds.\n  Fatal         4      Zip was unable to allocate memory for one or\n                       more  buffers during program initialization.\n  Fatal         5      A severe error in  the  archive  format  was\n                       detected.   Processing probably failed imme-\n                       diately.\n  Error         6      Entry too large to be split with zipsplit.\n  Error         7      Invalid comment format.\n  Fatal         8      Zip -T failed or out of memory.\n  Error         9      The user aborted zip prematurely  with  con-\n                       trol-C (or equivalent).\n  Fatal        10      Zip  encountered an error while using a temp\n                       file.\n  Fatal        11      Read or seek error.\n  Warning      12      Zip has nothing to do.\n  Error        13      Missing or empty zip file.\n  Fatal        14      Error writing to a file.\n  Fatal        15      Zip was unable to create a file to write to.\n  Error        16      Bad command line parameters.\n  Error        18      Zip could not open a specified file to read.\n  Fatal        19      Zip was built with options not supported  on\n                       this system\n  Fatal        20      Attempt to read unsupported Zip64 archive\n.end literal\n.!------------------------------------------------------------------------------\n.indent -4\n2 Extra_Fields\n.br\nThe .ZIP file format allows some extra data to be stored with a file in\nthe archive.  For example, where local time zone information is\navailable, Zip can store UTC date-time data for files.  (Look for\nUSE_EF_UT_TIME in a \"zip -v\" report.)  On VMS, with -V or -VV, Zip will\nalso store VMS-specific file attributes.  These data are packaged as\n\"extra fields\" in the archive.  Some extra fields are specific to a\nparticular operating system (like VMS file attributes).  Large files\n(bigger than 4GB) on any OS require an extra field to hold their 64-bit\nsize data.  Depending on the capabilities of the UnZip program used to\nexpand the archive, these extra fields may be used or ignored when files\nare extracted from the archive.\n.sk\nSome extra fields, like UTC date-times or VMS file attributes, are\noptional.  Others, like the Zip64 extra field which holds 64-bit sizes\nfor a large file, are required.\n.sk\nThe -X (--strip-extra) option suppresses the saving of any optional\nextra fields in the archive.  (Thus, -X conflicts with -V or -VV.)\n.!------------------------------------------------------------------------------\n.indent -4\n2 Environment\n.br\nA user can specify default command-line options and arguments by\ndefining an \"environment variable\" (that is, a logical name or DCL\nsymbol), \"ZIP_OPTS\" or \"ZIPOPT\", to specify them.  If both \"ZIP_OPTS\" and\n\"ZIPOPT\" are specified, the definition of \"ZIPOPT\" prevails.\n.sk\nThe C RTL function getenv() is used to sense these variables, so its\nbehavior determines what happens if both a logical name and a symbol are\ndefined.  As of VMS V7.3, a logical name supercedes a symbol.\n.sk\nThe \"zip -v\" report should show the perceived settings of these\nvariables.\n.!------------------------------------------------------------------------------\n.indent -4\n2 File_Names\n.br\nZip deals with file names in the system file system and with file names\nin Zip archives.  File names in a Zip archive are stored in a UNIX-like\npath-name format.  For example, a VMS file specification like this:\n.sk;.indent 10\n[.zip30.vms]descrip.mms\n.sk\ncould appear in a Zip archive as:\n.sk;.indent 10\nzip30/vms/descrip.mms\n.sk\nFor security reasons, paths in Zip archives are always stored as\nrelative paths, so an absolute VMS directory specification will be\ntransformed to a relative path in the archive (that is, no leading \"/\"). \nFor example, the following absolute directory specification would give\nthe same archive path as the previous (relative) example:\n.sk;.indent 10\n[zip30.vms]descrip.mms\n.sk\nAlso, device names are dropped, so the following file specification\nwould also give the same archive path:\n.sk;.indent 10\nsys$sysdevice:[zip30.vms]descrip.mms\n.sk\nIf an archive is intended for use with PKUNZIP under MSDOS, then the -k\n(for \"Katz\", --DOS-names) option should be used to attempt to adjust the\nnames and paths to conform to MSDOS character-set and length\nlimitations, to store only the MSDOS file attributes (just the\nowner:write attribute from VMS), and to mark the entry as made under\nMSDOS (even though it wasn't).\n.sk\nNote that file specifications in the file system must be specified using\nVMS notation, but file names in an archive must be specified using the\nUNIX-like notation used in the archive.  For example, where a BACKUP\ncommand might look like this:\n.sk.indent 10\n$ back [.zip30...]*.* /excl = [...vms]*.c stuff.bck /save\n.sk\na corresponding Zip command might look like this:\n.sk;.indent 10;\n$ zip stuff.zip [.zip30...]*.* -x */vms/*.c\n.sk\nbecause the files to be added to the Zip archive are specified using VMS\nfile specifications, but the -x (--exclude) option excludes names based\non their archive path/file names.  Options dealing with archive names\ninclude -R (--recurse-patterns), -d (--delete), -i (--include), -x\n(--exclude), and -U (--copy-entries).\n.sk\nNote: By default, on VMS, archive name pattern matching (-R, -d, -i, -x,\nand -U) is case sensitive, even when the file system is not case\nsensitive (or even case preserving).  This allows accurate matching of\nmixed-case names in an archive which may have been created on a system\nwith a case sensitive file system, but it can involve extra effort on\nVMS, where it may be necessary to use unnatural case names (or the same\nnames in multiple cases, like \"*.obj *.OBJ\") for this kind of pattern\nmatching to give the desired behavior.  If completely case-blind pattern\nmatching behavior is desired, specify the -ic (--ignore-case) option.\n.!------------------------------------------------------------------------------\n.indent -4\n3 Case\n.br\nFor better compatibility with UNIX-like systems, Zip, by default,\ndown-cases ODS2 file names.  For example, the following file on an ODS2\nfile system:\n.sk;.indent 10\n[.ZIP30.VMS]DESCRIP.MMS\n.sk\nwould appear in an archive as:\n.sk;.indent 10\nzip30/vms/descrip.mms\n.sk\nZip versions before 3.0 down-cased all VMS file names.  Now, various\noptions give the user control over these conversions:\n.sk\n.lm +10;.literal\n-C    preserve case of all file names\n-C-   down-case all file names\n-C2   preserve case of ODS2 names\n-C2-  down-case ODS2 file names (default)\n-C5   preserve case of ODS5 names (default)\n-C5-  down-case ODS5 file names\n.end literal;.lm -10\n.sk\nCase is handled differently for archive member names, which the user\nspecifies with the -R, -d, -i, -x, and -U options.  By default, on VMS,\narchive name pattern matching is case sensitive, even when the file\nsystem is not case sensitive (or even case preserving).  This allows\naccurate matching of mixed-case names in an archive which may have been\ncreated on a system with a case sensitive file system, but it can\ninvolve extra effort on VMS, where it may be necessary to use unnatural\ncase names (or the same names in multiple cases, like \"*.obj *.OBJ\") for\nthis kind of pattern matching to give the desired behavior.  If\ncompletely case-blind pattern matching behavior is desired, specify the\n-ic (--ignore-case) option.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Fixing_Damage\n.br\nTwo options can be used to fix a damaged Zip archive.\n.sk;.literal\n-F  --fix\n-FF  --fixfix\n.end literal;.sk\nThe -F (--fix) option can be used if some portions of the archive are\nmissing, but it requires a reasonably intact central directory.  The\ninput archive is scanned as usual, but zip will ignore some problems. \nThe resulting archive should  be valid, but any inconsistent entries\nwill be left out.\n.sk\nIf the archive is too damaged or the end (where the central directory is\nsituated) has been truncated, you must use -FF (--fixfix).  This is a\nchange from zip 2.32, where the -F option is able to read a truncated\narchive.  The -F option now more reliably fixes archives with minor \ndamage, and the -FF option is needed to fix archives where -F and -FF\nwas used before.\n.sk\nWith -FF, the archive is scanned from the beginning and Zip scans for\nspecial signatures to identify the limits between the archive members.\nThe -F option is more reliable if the archive is not too much damaged,\nso try this option first.\n.sk\nNeither option will recover archives that have been incorrectly\ntransferred, such as by FTP in ASCII mode instead of binary.  After the\nrepair, the -t option of UnZip may show that some files have a bad CRC.\nSuch files cannot be recovered; you can remove them from the archive\nusing the -d option of Zip.\n.sk\nBecause of the uncertainty of the \"fixing\" process, it's required\nto specify an output archive, rather than risking further damage to the\noriginal damaged archive.  For example, to fix the damaged archive\nfoo.zip,\n.sk;.indent 10\nzip -F foo --out foo_fix\n.sk\ntries to read the entries normally, copying good entries to the new \narchive foo_fix.zip.  If this doesn't work, as when the archive is\ntruncated, or if some entries are missed because of bad central\ndirectory entries, try -FF:\n.sk;.indent 10\nzip -FF foo --out foo_fixfix\n.sk\nand compare the resulting archive to the archive created using -F. The\n-FF option may create an inconsistent archive.  Depending on what is\ndamaged, you can then use the -F option to fix that archive.\n.sk\nA split archive with missing split files can be fixed using -F if you\nhave the last split of the archive (the \".zip\" file).  If this file is\nmissing, you must use -FF to fix the archive, which will prompt you for\nthe splits you have.\n.sk\nCurrently, the fix options can't recover an entry which has a bad\nchecksum or is otherwise damaged.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Log_File\n.br\nZip normally sends messages to the user's terminal, but these may be\nalso directed to a log file.\n.sk;.literal\n-la  --log-append\n.end literal;.br\nAppend to an existing log file.  Default is to create a new version.\n.sk;.literal\n-lf logfilepath  --logfile-path logfilepath\n.end literal;.br\nOpen a logfile at the given path.  By default, a new version will be\ncreated, but with the -la option an existing file will be opened and the\nnew log information appended to any existing information.  Only\nwarnings and errors are written to the log unless the -li option is also\ngiven, then all information messages are also written to the log.\n.sk;.literal\n-li  --log-info\n.end literal;.br\nInclude information messages, such as file names being zipped, in the\nlog.  The default is to include only the command line, any warnings\nand errors, and the final status.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Modes_of_Operation\n.br\nZip supports two distinct types of command modes, external and \ninternal.  The external modes (update, grow, and freshen) read files\nfrom the file system (as well as from an existing archive) while the\ninternal modes (delete and copy) operate exclusively on entries in an\nexisting archive.\n.sk;.literal\n-u  --update\n.end literal;.br\nUpdate existing entries and add new files.  If the archive does not\nexist, create it.  This is the default mode, so -u is optional.\n.sk;.literal\n-g  --grow\n.end literal;.br\nGrow (append to) the specified Zip archive, instead of creating a new\none.  If this operation fails, Zip attempts to restore the archive to\nits original state.  If the restoration fails, the archive might become \ncorrupted.  This option is ignored when there's no existing archive or\nwhen at least one archive member must be updated or deleted.\n.sk;.literal\n-f  --freshen\n.end literal;.br\nUpdate existing entries in an existing archive.  Does not add new files\nto the archive.\n.sk;.literal\n-d  --delete\n.end literal;.br\nDelete entries from an existing archive.\n.sk;.literal\n-DF  --difference-archive\n.end literal;.br\nCreate an incremental backup-style archive, where the resulting archive \nwill contain all new and changed files since the original archive was\ncreated.  For this to work, the input file list and current directory \nmust be the same as during the original Zip operation.\n.sk\nFor example, if the existing archive was created using\n.sk;.indent 10\nzip foo_full.zip [.foo...]*.*\n.sk\nfrom just above the foo directory, then the command (also from just\nabove the foo directory):\n.sk;.indent 10\nzip foo_full.zip [.foo...]*.* -DF -O foo_incr.zip\n.sk\ncreates the archive foo_incr.zip with just the files not in foo_full.zip\nand the files where the size or date-time of the files does not match\nthat in foo_full.zip.  Note that in the \"zip -DF\" operation, the\noriginal full archive is specified as the input archive, and the -O\n(--output-file) option is used to specify the new (incremental) output\narchive.\n.sk;.literal\n-FS  --filesync\n.end literal;.br\nDelete entries in the archive that do not match files on the OS.\nNormally when an archive is updated, new files are added and changed\nfiles are updated but files that no longer exist on the OS are not\ndeleted from the archive.  This option enables deleting of entries that\nare not matched on the OS.  Enabling this option should create archives\nthat are the same as new archives, but since existing entries are copied\ninstead of compressed, updating an existing archive with -FS can be much\nfaster than creating a new archive.  If few files are being copied from\nthe old archive, it may be faster to create a new archive instead.\n.sk\nThis option deletes files from the archive.  If you need to preserve the\noriginal archive, make a copy of the archive first, or use the  -O\n(--output) option to output the new archive to a new file.  Even though\nit's slower, creating a new archive with a new archive name is safer, \navoids mismatches between archive and OS paths, and is preferred.\n.sk;.literal\n-U  --copy-entries\n.end literal;.br\nSelect entries in an existing archive and copy them to a new archive. \nCopy mode is like update mode, but entries in the existing archive are\nselected by command line patterns rather than files from the file system\nand it uses the -O (--output-file) option to write the resulting archive\nto a new file rather than updating the existing archive, leaving the\noriginal archive unchanged.\n.sk\nNormally, when updating an archive using relative file specifications\n(\"[]\", \"[.xxx]\", and so on), it helps to have the same default directory\nas when the archive was created, but this is not a strict requirement.\n.sk\nDate-time information in a Zip archive may be influenced by time zone.\n.!------------------------------------------------------------------------------\n.indent -4\n3 Examples\n.br\nWhen given the name of an existing archive, Zip will replace identically\nnamed entries in the archive or add entries for new names.  For example,\nif foo.zip exists and contains foo/file1 and foo/file2, and the\ndirectory [.foo] contains the files file1 and file3, then:\n.sk;.indent 10\n$ zip foo [.foo...]*.*\n.sk\nwill replace foo/file1 in foo.zip and add foo/file3 to foo.zip.  After\nthis, foo.zip contains foo/file1, foo/file2, and foo/file3, with foo/file2\nunchanged from before.  This is the default mode -u (update).\n.sk\nUpdate will add new entries to the archive and will replace\nexisting entries only if the modified date of the file is more recent than\nthe date recorded for that name in the archive.  For example:\n.sk;.indent 10\n$ zip -u stuff *.*\n.sk\nwill add any new files in the current directory, and update any changed\nfiles in the archive stuff.zip.  Note that Zip will not try to pack\nstuff.zip into itself when you do this.  Zip avoids including its own\noutput files when selecting files to include in the archive, so it\nshould be safe, as in this case, to have the archive included in the\nlist of input files.\n.sk\nA second mode, -f (freshen), like update will only\nreplace entries with newer files.  Unlike update, however, it will not\nadd files that are not already in the archive.  For example:\n.sk;.indent 10\n$ zip -f foo\n.sk\nNote that the -f option with no arguments freshens all the entries in the\narchive.  The same is true of -u, so \"zip -u foo\" and \"zip -f foo\" do\nthe same thing.\n.sk\nWhen these options are used, Zip should be run from the same directory\nas when the original Zip command was run, so that the path names in the\narchive will continue to agree with the path names in the file system. \nNormally, it's also a good idea to keep the other options the same (-V,\n-w, and the like), to keep the archive contents consistent.\n.sk\nThe -t (--from-date) and -tt (--before-date) options can also be used\nwith adding, updating, or freshening to restrict further the files to be\nincluded in the archive.  For example:\n.sk;.indent 10\n$ zip -rt 12071991 infamy [.FOO]*.*\n.sk\nwill add all the files in [.FOO] and its subdirectories that were last\nmodified on December 7, 1991, or later to the achive infamy.zip.  Dates\ncan be in format mmddyyyy or yyyy-mm-dd.\n.sk\nAlso, files can be explicitly excluded using the -x option:\n.sk;.indent 10\n$ zip -r foo [.FOO] -x *.obj\n.sk\nwhich will zip up the contents of [.FOO] into foo.zip but exclude all the\nfiles that end in \".obj\".\n.sk\nThe -d (delete) mode will remove entries from an\narchive.  An example might be:\n.sk;.indent 10\n$ zip -d foo foo/harry/*.* *.obj\n.sk\nwhich will remove all of the files that start with \"foo/harry/\" and all of\nthe files that end with \".obj\" (in any path).\n.sk\nThe last mode, -U (--copy-entries), selects entries from an existing\narchive and copies them to a new archive.\n.sk;.indent 10\n$ zip -U foo *.obj --out fooobj\n.sk\nwill copy all .obj entries from foo.zip and put them in the new archive\nfooobj.zip.\n.sk\nNote: By default, on VMS, archive name pattern matching (-R, -d, -i, -x,\nand -U) is case sensitive, even when the file system is not case\nsensitive (or even case preserving).  This allows accurate matching of\nmixed-case names in an archive which may have been created on a system\nwith a case sensitive file system, but it can involve extra effort on\nVMS, where it may be necessary to use unnatural case names (or the same\nnames in multiple cases, like \"*.obj *.OBJ\") for this kind of pattern\nmatching to give the desired behavior.  If completely case-blind pattern\nmatching behavior is desired, specify the -ic (--ignore-case) option.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Options_List\n.br\n\"zip -h\" provides a concise list of common command-line options.  \"zip\n-h2\" provides more details.  \"zip -so\" provides a list of all available\noptions.  \"zip -v\" shows the program version and available features. \n(The list below was derived from a \"zip -so\" listing.)\n.sk\nShort-form options begin with a single hyphen (\"-\").  Long-form option\nbegin with a double hyphen (\"--\"), and may be abbreviated to any\nunambiguous shorter string.  For example:\n.lm +10;.literal\n-v\n--verbose\n--verb\n.end literal;.lm -10\n.sk\nTo avoid confusion, if a negatable option contains an embedded hyphen\n(\"-\"), then avoid abbreviating it at the hyphen if you plan to negate\nit.  For example, if an option like --some-option were abbreviated to\n--some-, the parser would consider that trailing hyphen to be part of\nthe option name, rather than as a negating trailing hyphen.  This\nbehavior may change in the future, to interpret the trailing hyphen in\n--some- to be negating.  (So don't do it.)\n.sk\nSome options may be negated (or modified) by appending a \"-\":\n.lm +10;.literal\n-la-\n--show-files-\n.end literal;.lm -10\n.sk\nSome options take a value, which may immediately follow the option, or\nbe separated by a space or \"=\".  For example:\n.lm +10;.literal\n-ttmmddyyyy\n-tt mmddyyyy\n-tt=mmddyyyy\n.end literal;.lm -10\n.sk\n.lm -4;.literal\n Sh  Long                Description\n----+-------------------+--------------------------------------------------\n 0   store               store (instead of compress)\n 1   compress-1          compress faster (-2, -3, -4, ...)\n 9   compress-9          compress better\n ?                       show the Zip help screen\n @   names-stdin         read input file patterns from SYS$INPUT (1/line)\n A   adjust-sfx          adjust self-extracting executable\n b   temp-path  path     use \"path\" directory for temporary files\n C   preserve-case       preserve case of all file names added to archive\n C-  preserve-case-      down-case all file names added to archive\n C2  preserve-case-2     preserve case of ODS2 names added to archive\n C2- preserve-case-2-    down-case ODS2 file added to archive (default)\n C5  preserve-case-5     preserve case of ODS5 names added to archive (dflt)\n C5- preserve-case-5-    down-case ODS5 names added to archive\n c   entry-comments      add a comment for each entry added to archive\n D   no-dir-entries      do not add archive entries for directories\n DF  difference-archive  difference archive: add only changed or new files\n d   delete              delete entries in archive\n db  display-bytes       display running byte counts\n dc  display-counts      display running file counts\n dd  display-dots        display progress dots for files (dflt size = 10MB)\n dg  display-globaldots  display progress dots for archive, not each file\n ds  dot-size   size     set progress dot interval to \"size\" (MB)\n du  display-usize       display original uncompressed size for entries\n dv  display-volume      display volume (disk) number as in_disk>out_disk\n e   encrypt             encrypt entries, ask for password\n F   fix                 fix mostly intact archive (try F before FF)\n FF  fixfix              salvage what can be salvaged (not as reliable)\n FS  filesync            remove archive entries unmatched in file system\n f   freshen             update existing entries (only changed files)\n fd  force-descriptors   force data descriptors as if streaming\n fz  force-zip64         force use of Zip64 format\n g   grow                grow existing archive (unless updating or deleting)\n H                       show the Zip help screen\n h   help                show the Zip help screen\n h2  more-help           show extended Zip help\n i   include  pat1 [pat2 [...]]  include only names matching the patterns\n ic  ignore-case         ignore case (case-blind archive entry name matching)\n J   junk-sfx            junk (remove) archive preamble (unzipsfx)\n j   junk-paths          junk (don't store) directory names, only file names\n k   DOS-names           simulate PKZIP-made archive (DOS 8.3 names)\n L   license             show software license\n l   to-crlf             translate end-of-lines (LF -> CRLF)\n la  log-append          append to existing log file\n lf  logfile-path  lfile  log to log file at lfile (default: new version)\n li  log-info            include informational messages in log\n ll  from-crlf           translate end-of-lines (CRLF -> LF)\n MM  must-match          input file spec must exist (wildcards must match)\n m   move                delete files added to archive\n n   suffixes  sfx1[:sfx2[...]]  don't compress files with these suffixes\n nw  no-wild             no wildcards during add or update\n O   output-file  ozf  use \"ozf\" as the output archive (dflt = inp archive)\n o   latest-time         set archive date-time to match oldest entry\n P   password  password  encrypt with supplied \"password\" string\n q   quiet               quiet operation (no info messages)\n R   recurse-patterns    recurse into subdirs from cur dir, match names only\n r   recurse-paths       recurse into directories from specified path pats\n s   split-size  size    split archive at \"size\" (K/MB)  (0: don't split)\n sb  split-bell          ring terminal bell at pause for split medium change\n sc  show-command        show command line\n sd  show-debug          show debug messages\n sf  show-files          show files to process (only)\n so  show-options        show list of all command-line options\n sp  split-pause         pause to select split destination(s)\n sv  split-verbose       be verbose about creating splits\n T   test                test archive integrity (runs UnZip -T)\n t   from-date  mmddyyyy  only do files since (at or after) \"mmddyyyy\"\n tt  before-date  mmddyyyy  only do files before \"mmddyyyy\"\n u   update              update changed files, add new files (default mode)\n V   VMS-portable        save VMS file attributes\n VV  VMS-specific        save VMS file attributes and all allocated blocks\n v   verbose             verbose messages (print version info if only arg)\n w   VMS-versions        save VMS version numbers in archive\n ww  VMS-dot-versions    save VMS version numbers as \".nnn\", not \";nnn\"\n X   strip-extra         strip all but critical extra fields\n X-  strip-extra-        keep all extra fields\n x   exclude  pat1 [pat2 [...]]  exclude all names matching the patterns\n Z   compression-method mthd  use compress method \"mthd\" (bzip2 or deflate)\n z   archive-comment     ask for archive comment\n.end literal;.lm +4\n.!------------------------------------------------------------------------------\n.indent -4\n2 Miscellaneous_Options\n.sk;.literal\n-D  --no-dir-entries\n.end literal;.br\nDo not create entries in the archive for directories.  By default,\ndirectory entries are added to an archive, so that their attributes can\nbe saved in the archive.  When an archive is created using -D, UnZip\nwill still create directories as needed (subject to user control), but\nthey will get the default attributes (date-time, permissions, ...) on\nthe destination system, rather than their original atributes.\n.sk;.literal\n-MM  --must-match\n.end literal;.br\nAll input patterns must match at least one file and all input files \nfound must be readable.  Normally when an input pattern does not match\na file the \"name not matched\" warning is issued and when an input\nfile has been found but later is missing or not readable a \"missing or\nnot readable\" warning is issued.  In either case Zip continues\ncreating the archive, with missing or unreadable new files being skipped \nand files already in the archive remaining unchanged.  After the\narchive is created, if any files were not readable zip returns the OPEN\nerror code (18 on most systems) instead of the normal success return (0\non most systems).  With -MM, Zip exits as soon as an input pattern\nis not matched (whenever the \"name not matched\" warning would be issued)\nor when an input file is not readable. In either case Zip exits with\nan OPEN error and no archive is created.\n.sk\nThis option is useful when a known list of files is to be zipped so any\nmissing or unreadable files should result in an error.  It may be less\nuseful when used with wildcards, but Zip will still exit with an error\nif any input pattern doesn't match at least  one file or if any\nmatched files are unreadable.  If you want to create the archive anyway\nand only need to know if files were skipped, then don't use -MM and just\ncheck the exit status.  Also, a log file (see -lf (--logfile-path))\ncould be useful.\n.sk;.literal\n-O out_file  --output-file out_file\n.end literal;.br\nProcess the archive changes as usual, but instead of updating the\nexisting archive, send the output to a new archive, \"out_file\".  The\noutput archive specified must be a different file from the input\narchive.\n.sk\nThis option can be used to create updated split archives.  It can\nalso be used with -U to copy entries from an existing archive to\na new archive.  See the EXAMPLES section below.\n.sk\nAnother use is converting zip files from one split size to\nanother.  For instance, to convert an archive with 700MB CD splits\nto one with 2GB DVD splits, can use:\n.sk;.indent 10\nzip -s 2g cd-split.zip --out dvd-split.zip\n.sk\nwhich uses copy mode.  See -U below.  Also:\n.sk;.indent 10\nzip -s 0 split.zip --out unsplit.zip\n.sk\nwill convert a split archive to a single-file archive.\n.sk\nCopy mode will convert stream entries (using data descriptors and which\nmay be incompatible with some unzip programs) to normal entries (which\nshould be compatible with all unzip programs), except if standard\nencryption was  used.  For archives with encrypted entries, zipcloak\nwill decrypt the entries and convert them to normal entries.\n.sk;.literal\n-o  --latest-time\n.end literal;.br\nSet the modification date-time of the Zip archive file to the latest\n(newest) modification date-time found among the entries in the zip\narchive.  This can be used without any other operations, if\ndesired.  For example:\n.sk;.indent 10\nzip -o foo\n.sk\nwill change the modification date-time of foo.zip to the latest time of\nthe entries in foo.zip.\n.sk;.literal\n-q  --quiet\n.end literal;.br\nQuiet mode.  Eliminates informational messages and comment prompts. \nThis mode may be useful in command procedures, or if the Zip operation\nis being performed as a background task (\"$ spawn/nowait zip -q foo\n*.c\").\n.sk\n.sk;.literal\n-T  --test\n.end literal;.br\nTest the integrity of a zip archive (the new one, if -O (--output-file)\nis specified).  If the check fails, the old zip file is unchanged  and\n(with the -m option) no input files are removed.\n.sk\nImplementation\n.br\n\"zip -T\" actually runs an \"unzip -t\" command to do the testing, so UnZip\nmust be installed properly for this to work.\n.sk;.literal\n-TT unzip_cmd  --unzip-command unzip_cmd\n.end literal;.br\nSpecify the actual UnZip command, \"unzip_cmd\" (normally a DCL symbol) to\nuse for \"zip -T\".  This can be useful if multiple versions of UnZip are\ninstalled on a system, and the default DCL symbol \"UNZIP\" would run the\nwrong one (or the logical name DCL$PATH would lead to the wrong one).\n.sk\nIn \"unzip_cmd\", the string \"{}\" is replaced by the temporary name of the\narchive to be tested, otherwise the name of the archive is appended\nto the end of the command.  The exit status is checked for success severity.\n.sk;.literal\n-v  --verbose\n.end literal;.br\nVerbose mode or print diagnostic version info.\n.sk\nNormally, when applied to real operations, this option enables the \ndisplay of a progress indicator during compression (see -dd for more on\ndots) and requests verbose diagnostic info about archive structure\noddities.\n.sk\nWhen -v is the only command line argument, a diagnostic report is\ndisplayed, showing:\n.lm +3;.br;.indent -2\no Copyright and other legal notices\n.br;.indent -2\no Program name, version, and release date\n.br;.indent -2\no Pointers to Info-ZIP FTP and Web sites\n.br;.indent -2\no Program build information (compiler type and version, OS version, and\nthe compilation date\n.br;.indent -2\no Optional features enabled at compile-time\n.br;.indent -2\no Environment variable definitions (ZIP_OPTS, ZIPOPT)\n.lm -3;.br\n.sk\nThis information should be included in bug reports.\n.sk;.literal\n-y  --symlinks\n.end literal;.br\nStore symbolic links as such in the Zip archive, instead of compressing\nand storing the file referred to by the link.  A symbolic link normally\nrequires less storage than the actual file, both in the archive, and on\nthe destination file system.\n.sk\nOn VMS, symbolic links are supported on ODS5 disks where the C RTL\nsupports symbolic links.  Full support for symbolic links seems to\nrequire VMS V8.3, but a Zip program supporting symbolic links may be\nbuilt on VMS V7.3-2.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Progress_Display\n.br\nVarious options control the display of progress messages during Zip\noperation.\n.sk;.literal\n-db  --display-bytes\n.end literal;.br\nDisplay running byte counts showing the bytes processed and the bytes to\ngo.\n.sk;.literal\n-dc  --display-counts\n.end literal;.br\nDisplay running count of entries processed and entries to go.\n.sk;.literal\n-dd  --display-dots\n.end literal;.br\nDisplay dots while each entry is processed (except on ports that have \ntheir own progress indicator).  See -ds below for setting dot size.  The\ndefault is a dot every 10 MB of input file processed.  The -v\n(--verbose) option also displays dots and used to at a higher rate than\nthis (at the same rate as in previous versions of Zip) but this rate has\nbeen changed to the new 10 MB default, and is also controlled by -ds.\n.sk;.literal\n-dg  --display-globaldots\n.end literal;.br\nDisplay progress dots for the archive instead of for each file.  The\ncommand\n.sk;.indent 10\nzip -qdgds 10m\n.sk\nwill turn off most output except dots every 10 MB.\n.sk;.literal\n-ds size  --dot-size size\n.end literal;.br\nSet amount of input file processed for each dot displayed.  See -dd to\nenable displaying dots.  Setting this option implies -dd.  \"size\" is in\nthe format \"nm\" where n is a number and m is a multiplier.  Currently\n\"m\" can be k (KB), m (MB), g (GB), or t (TB), so if \"n\" is 100 and \"m\"\nis k, \"size\" would be 100k which is 100KB.  The default is 10MB.\n.sk\nThe -v (--verbose) option also displays dots and used to default to a\nhigher rate than this (at the same rate as in previous versions of Zip)\nbut now the default is 10 MB and the -v dots are also controlled by this\noption.  A \"size\" of 0 turns dots off.\n.sk\nThis option does not control the dots from the \"Scanning files\" message \nas Zip scans for input files.  The dot size for that is fixed at 2\nseconds or a fixed number of entries, whichever is longer.\n.sk;.literal\n-du  --display-usize\n.end literal;.br\nDisplay the uncompressed size of each entry.\n.sk;.literal\n-dv  --display-volume\n.end literal;.br\nDisplay the volume (disk) number each entry is being written to.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Self_Extracting_Archives\n.br\nA self-extracting archive (SFX) comprises a normal Zip archive appended\nto a special UnZip program (such as UNZIPSFX.EXE) for the intended\ntarget system.\n.sk\nThe UnZip distribution includes a VMS command procedure,\n[,vms]makesfx.com, which can be used directly or adapted to create an\nSFX archive from a normal Zip archive.\n.sk\nThe .ZIP file format includes offsets to data structures in the archive,\nand these offsets are measured from the start of the archive file. \nAppending an archive to an UnZip SFX executable effectively moves the\nstart of the archive file.  That makes the original offsets wrong, and\nthat will cause the UnZip SFX program to emit warning messages when it\ntries to unpack the archive.  Zip -A can be used to adjust these offsets\nin a self-extracting archive.  For example, to adjust the offsets in\nfoo.sfx_exe:\n.sk;.indent 10\nzip -A foo.sfx_exe\n.sk\nSimilarly, the UnZip SFX program can be removed from a self-extracting\narchive (and the offsets in the archive restored) using the -J\n(--junk-sfx) option.  For example:\n.sk;.indent 10\nzip -J foo.sfx_exe\n.sk\nNote that a self-extracting archive contains a normal Zip archive, and a\nnormal UnZip program can be used to expand it in the normal way.  You\nmay get a warning about extra bytes at the beginning of the archive (the\nUnZip SFX program), but UnZip should work properly after that.  This\nallows data in a self-extracting archive to be accessed on any system,\nnot just the target system where its embedded UnZip SFX program runs.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Split_Archives\n.br\nBeginning with version 3.0, Zip supports split archives.  A split\narchive is one which is divided into multiple files, usually to allow it\nto be stored on multiple storage media (floppy diskettes, CD-ROMs, or\nthe like) when a single medium would be too small to contain the whole\narchive.  (Note that split archives are not just unitary archives split\ninto pieces, as the .ZIP file format includes offsets to data structures\nin the archive, and for a split archive these are based on the start of\neach split, not on the start of the whole archive.  Concatenating the\npieces will invalidate these offsets, but UnZip can usually deal with\nit.  Zip will usually refuse to process such a spliced archive unless\nthe -FF fix option is used to fix the offsets.)\n.sk\nFor a split archive with, say, 20 split files, the files are typically\nnamed ARCHIVE.z01, ARCHIVE.z02, ..., ARCHIVE.z19, ARCHIVE.zip, where\n\"ARCHIVE\" is the archive name specified by the user on the Zip command\nline.  Note that the last split file is the \".zip\" file.  In contrast,\n\"spanned\" archives are the original multi-disk archive generally\nrequiring floppy disks and using volume labels to store disk numbers. \nZip supports split archives but not spanned archives, though a procedure\nexists for converting split archives of the right size to spanned\narchives.  The reverse is also true, where each file of a spanned\narchive can be copied in order to files with the above names to create a\nsplit archive.\n.!------------------------------------------------------------------------------\n.indent -4\n3 Options\n.br\nUse \"-s size\" to create a split archive (and to set the split size). \nThe size is given as a number followed optionally by a multiplier suffix\nof k (KB), m (MB, the default if no suffix is specified), g (GB), or t\n(TB).  (All are powers of 1024, not 1000).  64K is the minimum split\nsize.  For example, the following command could be used to create a\nsplit archive called \"foo\" from the contents of the \"bar\" directory with\nsplits of 670MB, which might be useful for burning on CDs:\n.sk;.indent 10\nzip -s 670m foo [.bar...]*.*\n.sk\nUsing -s without -sp as above creates all the splits in the directory\nspecified by \"foo\", in this case the current default directory.  This \nsplit mode updates the splits as the archive is being created, requiring\nall splits to remain writable, but creates split archives that are\nreadable by any UnZip that supports split archives.  See -sp below for\nenabling split pause mode which allows splits to be written directly to\nremovable media.\n.sk\nThe -sv option can be used to enable verbose splitting and display\ndetails of how the splitting is being done.  The -sb option can be used\nto ring the terminal bell when Zip pauses for the next split\ndestination.\n.sk\nThe -sp option can be used to pause Zip between splits to allow \nchanging removable media, for example, but read the descriptions and\nwarnings for both -s and -sp below.\n.sk\nThough Zip does not update split archives, Zip provides the option\n-O (--output-file) to allow split archives to be updated and saved in a\nnew archive.  For example:\n.sk;.indent 10\nzip inarchive.zip foo.c bar.c -O outarchive.zip\n.sk\nreads archive inarchive.zip, even if split, adds the files foo.c and\nbar.c, and writes the resulting archive to outarchive.zip.  If\ninarchive.zip is split, then outarchive.zip defaults to the same split\nsize.  Be aware that outarchive.zip and any split files that are created\nwith it are always overwritten without warning.  This may be changed in \nthe future.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Temporary_Files\n.br\nWhen creating a new archive or normally when changing an existing\narchive, Zip will write a temporary file in the archive destination\ndirectory (\"ZIxxxxxxxx\", where \"xxxxxxxx\" is the hexadecimal process ID)\nwith the new contents.  Then, if and when the Zip job has completed with\nno errors, it will rename the temporary file to the specified archive\nname (replacing the old archive, if any).\n.sk\nYou can use the -b (--temp-path) option to specify a different path\n(device and/or directory) for the temporary file, but specifying a\ndifferent device will force Zip to copy the temporary file to its final\ndestination instead of simply renaming it, and that copying will take\nmore time than renaming, especially for a large archive.  For example:\n.sk;.indent 10\n$ zip -b disk$scratch:[tmp] stuff *\n.sk\nwill cause Zip to put its temporary files in the directory\n\"disk$scratch:[tmp]\", copying the temporary file back to the current\ndirectory as stuff.zip when it's complete.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Text_Files\n.br\nZip offers some options to help deal with line endings in text files. \nThese may have limited utility on VMS.\n.sk;.literal\n-l  --to-crlf\n.end literal;.br\nTranslate the UNIX end-of-line character LF (CR on MAC) into the MSDOS\nconvention CR-LF.  This option should not be used on binary files.  This\noption can be used on UNIX if the Zip file is intended for PKUNZIP under\nMSDOS.  If the input files already contain CR-LF, this option adds an\nextra CR.  This ensure that \"unzip -a\" on Unix will get back an exact\ncopy of the original file, to undo the effect of \"zip -l\".  See -ll\nbelow for the binary checks.\n.sk;.literal\n-ll  --from-crlf\n.end literal;.br\nTranslate the MSDOS end-of-line CR LF into UNIX LF (CR on MAC).  This\noption should not be used on binary files.  This option can be used on\nMSDOS if the Zip archive is intended for UnZip under UNIX.\n.sk\nFor both -l and -ll, if the file is converted and the file is later\ndetermined to be binary, a warning is issued and the file is probably\ncorrupted.  If Zip with -l or -ll detects binary (non-text) in the first\nbuffer read from a file, it issues a warning and skips line-ending\nconversion on the file, avoiding corruption.  This check seems to catch\nall binary files tested, but the original check remains and if a\nconverted file is later determined to be binary, that warning is still\nissued.  The algorithm now being used for binary detection should allow\nline-ending conversion of text files in UTF-8 and similar encodings.\n.!------------------------------------------------------------------------------\n.indent -4\n2 VMS_Specifics\n.br\nVMS File Attributes\n.sk;.literal\n-V  --VMS-portable\n-VV --VMS-specific\n.end literal;.br\nThe -V and -VV options cause Zip to store VMS file atributes (such as\nfile organization, record format, carriage control, and so on) in\nVMS-specific \"extra fields\" in an archive along with the usual data. \nThese extra fields are ignored on non-VMS systems, but on a VMS system,\nthey allow UnZip to restore the files with their VMS attributes intact.\n.sk\nWith -V, Zip ignores any data in the file after the end-of-file (EOF)\npoint (defined by FAT$L_EFBLK and FAT$W_FFBYTE), which works well for\nwell-formed files (that is, those with no valid data beyond EOF). \nPortable-format files (Stream_LF, fixed-512) archived with -V should be\nextracted properly on a non-VMS system.  Files with more complex\nstructures, such as indexed files and files with embedded byte counts\nor other such data may be of limited use on other systems.  (UnZip on\nnon-VMS systems may be able to extract various VMS-format text files,\nhowever.)\n.sk\nWith -VV, Zip processes all allocated blocks for the file (including\nthose beyond EOF).  When extracted on a VMS system, the original file\nshould be reproduced with as much fidelity as possible, but on a non-VMS\nsystem, most files will be seen as corrupt because of the data from\nbeyond EOF.\n.sk\nVMS File Version Numbers\n.sk;.literal\n-w  --VMS-versions\n-ww  --VMS-dot-versions\n.end literal;.br\nBy default, for compatibility with non-VMS systems, Zip strips VMS file\nversion numbers from the names stored in an archive.  The -w\n(--VMS-versions) option causes Zip to retain file version numbers on\nnames in an archive. Without -w, a version number wildcard (\";*\") can\ncause errors when multiple versions of a single file are treated as\nmultiple files with the same name.\n.sk\nFor better compatibility with non-VMS systems where semi-colons are less\npopular in file names, the -ww (--VMS-dot-versions) option stores the\nfile version numbers with a dot (\".nnn\") instead of a semi-colon\n(\";nnn\").\n.!------------------------------------------------------------------------------\n.indent -4\n2 Copyright_and_License\n.br\nZip has an option to display its copyright and license.\n.sk;.literal\n-L  --license\n.end literal;.br\nThe license is reproduced below.\n.sk.lm +3\nThis is version 2007-Mar-4 of the Info-ZIP license. The definitive\nversion of this document should be available at\nftp://ftp.info-zip.org/pub/infozip/license.html indefinitely and a copy\nat http://www.info-zip.org/pub/infozip/license.html.\n.lm -3;.sk\n--------------------------------------------------------\n.sk\nCopyright (c) 1990-2007 Info-ZIP.  All rights reserved.\n.sk\nFor the purposes of this copyright and license, \"Info-ZIP\" is defined as\nthe following set of individuals:\n.sk;.lm +3\n     Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois,\n     Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth,\n     Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz,\n     David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko,\n     Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs,\n     Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda,\n     Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren,\n     Rich Wales, Mike White.\n.lm -3;.sk\nThis software is provided \"as is,\" without warranty of any kind, express\nor implied.  In no event shall Info-ZIP or its contributors be held\nliable for any direct, indirect, incidental, special or consequential\ndamages arising out of the use of or inability to use this software.\n.sk\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the above disclaimer and the following restrictions:\n.sk;.lm +7;.indent -4\n    1. Redistributions of source code (in whole or in part) must retain\n       the above copyright notice, definition, disclaimer, and this list\n       of conditions.\n.sk;.indent -4\n    2. Redistributions in binary form (compiled executables and libraries)\n       must reproduce the above copyright notice, definition, disclaimer,\n       and this list of conditions in documentation and/or other materials\n       provided with the distribution.  The sole exception to this condition\n       is redistribution of a standard UnZipSFX binary (including SFXWiz) as\n       part of a self-extracting archive; that is permitted without inclusion\n       of this license, as long as the normal SFX banner has not been removed\n       from the binary or disabled.\n.sk;.indent -4\n    3. Altered versions -- including, but not limited to, ports to new operating\n       systems, existing ports with new graphical interfaces, versions with\n       modified or added functionality, and dynamic, shared, or static library\n       versions not from Info-ZIP -- must be plainly marked as such and must not\n       be misrepresented as being the original source or, if binaries,\n       compiled from the original source.  Such altered versions also must not\n       be misrepresented as being Info-ZIP releases -- including, but not\n       limited to, labeling of the altered versions with the names \"Info-ZIP\"\n       (or any variation thereof, including, but not limited to, different\n       capitalizations), \"Pocket UnZip,\" \"WiZ\" or \"MacZip\" without the\n       explicit permission of Info-ZIP.  Such altered versions are further\n       prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP\n       e-mail addresses or the Info-ZIP URL(s), such as to imply Info-ZIP\n       will provide support for the altered versions.\n.sk;.indent -4\n       4. Info-ZIP retains the right to use the names \"Info-ZIP\", \"Zip\",\n       \"UnZip\", \"UnZipSFX\", \"WiZ\", \"Pocket UnZip\", \"Pocket Zip\", and\n       \"MacZip\" for its own source and binary releases.\n.lm -7;.sk\n.!------------------------------------------------------------------------------\n.indent -4\n2 Acknowledgements\n.br\n       Thanks to R. P. Byrne for his Shrink.Pas program, which\n       inspired this project, and from which the shrink algorithm\n       was stolen; to Phil Katz for placing in the public domain\n       the zip file format, compression format, and .ZIP filename\n       extension, and for accepting minor changes to the file\n       format; to Steve Burg for clarifications on the deflate\n       format; to Haruhiko Okumura and Leonid Broukhis for providing\n        some useful ideas for the compression algorithm; to\n       Keith Petersen, Rich Wales, Hunter Goatley and Mark Adler\n       for providing a mailing list and ftp site for the Info-ZIP\n       group to use; and most importantly, to the Info-ZIP group\n       itself (listed in the file infozip.who) without whose\n       tireless testing and bug-fixing efforts a portable zip\n       would not have been possible.  Finally we should thank\n       (blame) the first Info-ZIP moderator, David Kirschbaum,\n       for getting us into this mess in the first place.\n.!------------------------------------------------------------------------------\n.indent -4\n2 Bugs\n.br\nAll bug reports, patches, or suggestions should go to zip-bugs via the\nweb site contact form at http://www.Info-ZIP.org.  Patches should be\nsent as unified or context diffs only (diff -u or diff -c).\n.sk\nAny bug report should include the Zip version, any special compilation\noptions (see \"zip -v\" report), the host system type and operating system\nversion, and any other relevant information (compiler version, lunar\nphase, ...).  \n.!------------------------------------------------------------------------------\n"
  },
  {
    "path": "src/test/resources/samples/langs/RUNOFF/contributing.rnh",
    "content": ".na\n.ll 72\n.pl 90\n.m1 4\n.m2 4\n.m3 6\n.m4 6\n.sp 8\n.ds\n.ce\nCONTRIBUTING TO LINGUIST\n.sp\n.ce\nby\n.ce\nGITHUB\n.sp\n.ce\nand the\n.sp\n.ce\nOPEN SOURCE COMMUNITY\n.sp\n.bp\n.sp 5\n.ce\n_\bI_\bN_\bT_\bR_\bO_\bD_\bU_\bC_\bT_\bI_\bO_\bN:\n.sp\n     Hi there! We're thrilled that you'd like to contribute to this\nproject. Your help is  essential for keeping it great. This project\nadheres to the Contributor Covenant Code of Conduct. By participating,\nyou are expected to uphold this code.\n.br\nThe majority of contributions won't need to touch any Ruby code at all.\n.sp 5\n.ce\n_\bA_\bd_\bd_\bi_\bn_\bg _\ba_\bn _\be_\bx_\bt_\be_\bn_\bs_\bi_\bo_\bn _\bt_\bo _\ba\n_\bl_\ba_\bn_\bg_\bu_\ba_\bg_\be\n.sp\n     We try only to add new extensions once they have some usage on\nGitHub. In most cases we prefer that extensions be in use in hundreds of\nrepositories before supporting them in Linguist.\n.sp\nTo add support for a new extension:\n.sp\n.in 5\n.un 5\n1.   Add your extension to the language entry in\n_\bl_\ba_\bn_\bg_\bu_\ba_\bg_\be_\bs_\b._\by_\bm_\bl, keeping the extensions in\nalphabetical order.\n.br\n.un 5\n2.   Add at least one sample for your extension to the samples directory\nin the correct subdirectory.\n.br\n.un 5\n3.   Open a pull request, linking to a GitHub search result showing\nin-the-wild usage.\n.in 0\n.sp\nIn addition, if this extension is already listed in\n_\bl_\ba_\bn_\bg_\bu_\ba_\bg_\be_\bs_\b._\by_\bm_\bl then sometimes a few more steps\nwill need to be taken:\n.sp\n.in 5\n.un 5\n1.   Make sure that example .yourextension files are present in the\nsamples directory for each language that uses .yourextension.\n.br\n.un 5\n2.   Test the performance of the Bayesian classifier with a relatively\nlarge number (1000s) of sample .yourextension files. (ping @arfon or\n@bkeepers to help with this) to ensure we're not misclassifying files.\n.br\n.un 5\n3.   If the Bayesian classifier does a bad job with the sample files\nthen a heuristic may need to be written to help.\n.in 0\n.sp 5\n.ce\n_\bA_\bd_\bd_\bi_\bn_\bg _\ba _\bl_\ba_\bn_\bg_\bu_\ba_\bg_\be\n.sp\n     We try only to add languages once they have some usage on GitHub.\nIn most cases we prefer that each new extension be in use in hundreds of\nrepositories before supporting them in Linguist.\n.sp\nTo add support for a new language:\n.in 5\n.un 5\n1.   Add an entry for your language to\n_\bl_\ba_\bn_\bg_\bu_\ba_\bg_\be_\bs_\b._\by_\bm_\bl.\n.br\n.un 5\n2.   Add a grammar for your language. Please only add grammars that have\na license that permits redistribution.\n.br\n.in +5\n.un 5\ni.   Add your grammar as a submodule:\n.br\n.in +4\ngit submodule add\nhttps://github.com/Alhadis/language-roff\nvendor/grammars/language-roff\n.in -4\n.un 5\nii.  Add your grammar to grammars.yml:\n.br\n.in +4\nscript/convert-grammars --add vendor/grammars/MyGrammar\n.in -4\n.un 5\niii. Download the license for the grammar by running script/licensed.\nBe careful to only commit the file for the new grammar, as this script\nmay update licenses for other grammars as well.\n.br\n.in -5\n.un 5\n3.   Add samples for your language to the samples directory in the\ncorrect subdirectory.\n.br\n.un 5\n4.   Open a pull request, linking to a GitHub search result showing\nin-the-wild usage.\n.br\n.in 0\n.sp\nIn addition, if your new language defines an extension that's already\nlisted in _\bl_\ba_\bn_\bg_\bu_\ba_\bg_\be_\bs_\b._\by_\bm_\bl (such as `.foo`) then\nsometimes a few more steps will need to be taken:\n.sp\n.in +5\n.un 5\n1.   Make sure that example .foo files are present in the samples\ndirectory for each language that uses .foo.\n.br\n.un 5\n2.   Test the performance of the Bayesian classifier with a relatively\nlarge number (1000s) of sample `.foo` files. (ping @arfon or @bkeepers\nto help with this) to ensure we're not misclassifying files.\n.br\n.un 5\n3.   If the Bayesian classifier does a bad job with the sample .foo\nfiles then a heuristic may need to be written to help.\n.br\n.in 0\n.sp\nRemember, the goal here is to try and avoid false positives!\n.sp 2\n.ce\n_\bF_\bi_\bx_\bi_\bn_\bg _\ba _\bm_\bi_\bs_\bc_\bl_\ba_\bs_\bs_\bi_\bf_\bi_\be_\bd\n_\bl_\ba_\bn_\bg_\bu_\ba_\bg_\be\n.br\n     Most languages are detected by their file extension defined in\n_\bl_\ba_\bn_\bg_\bu_\ba_\bg_\be_\bs_\b._\by_\bm_\bl.  For disambiguating between\nfiles with common extensions, linguist applies some heuristics and a\nstatistical classifier.   This process can help differentiate between,\nfor example, .h files which could be either C, C++, or Obj-C.\n.sp\n     Misclassifications can often be solved by either adding a new\nfilename or extension for the language or adding more samples to make\nthe classifier smarter.\n.sp\n.m4 -2\n.ce\n_\bF_\bi_\bx_\bi_\bn_\bg _\bs_\by_\bn_\bt_\ba_\bx\n_\bh_\bi_\bg_\bh_\bl_\bi_\bg_\bh_\bt_\bi_\bn_\bg\n.br\n     Syntax highlighting in GitHub is performed using\nTextMate-compatible grammars. These are the same grammars that TextMate,\nSublime Text and Atom use. Every language in languages.yml is mapped to\nits corresponding TM `scope`. This scope will be used when picking up a\ngrammar for highlighting.\n.sp\n     Assuming your code is being detected as the right language, in most\ncases this is due to a bug in the language grammar rather than a bug in\nLinguist. _\bg_\br_\ba_\bm_\bm_\ba_\br_\bs_\b._\by_\bm_\bl lists all the grammars\nwe use for syntax highlighting on github.com. Find the one corresponding\nto your code's programming language and submit a bug report upstream.\n.sp\nIf you can, try to reproduce the highlighting problem in the text editor\nthat the grammar is designed for (TextMate, Sublime Text, or Atom) and\ninclude that information in your bug report.\n.sp\n     You can also try to fix the bug yourself and submit a Pull Request.\nTextMate's documentation offers a good introduction on how to work with\nTextMate-compatible grammars. You can test grammars using Lightshow.\n.sp\n     Once the bug has been fixed upstream, we'll pick it up for GitHub\nin the next release of Linguist.\n.sp 2\n.ce\n_\bT_\be_\bs_\bt_\bi_\bn_\bg\n.br\n     For development you are going to want to checkout out the source.\nTo get it, clone the repo and run Bundler to install its dependencies.\n.sp\n.in 4\ngit clone https://github.com/github/linguist.git\n.br\ncd linguist/\n.br\nscript/bootstrap\n.br\n.in 0\n.sp\nTo run the tests:\n.sp\n.in 4\n    bundle exec rake test\n.in 0\n.sp\n    Sometimes getting the tests running can be too much work, especially\nif you don't have much Ruby experience.  It's okay:  be lazy and let our\nbuild bot Travis run the tests for you. Just open a pull request and the\nbot will start cranking away.\n.sp\n.ce\n_\bM_\ba_\bi_\bn_\bt_\ba_\bi_\bn_\be_\br_\bs\n.br\nLinguist is maintained with love by:\n.sp\n.in -2\n- @arfon (GitHub Staff)\n.br\n- @larsbrinkhoff\n.br\n- @pchaigno\n.in 0\n.br\n.sp\nAs Linguist is a production dependency for GitHub we have a couple of\nworkflow restrictions:\n.sp\n.in -2\n- Anyone with commit rights can merge Pull Requests provided that there\nis a :+1: from a GitHub member of staff\n.br\n- Releases are performed by GitHub staff so we can ensure GitHub.com\nalways stays up to date with the latest release of Linguist and there\nare no regressions in production.\n.in 0\n.sp\n.ce\n_\bR_\be_\bl_\be_\ba_\bs_\bi_\bn_\bg\n.sp\nIf you are the current maintainer of this gem:\n.sp\n.in 5\n.ul 5\n1.   Create a branch for the release:\n.sp\n.in +2\ngit checkout -b cut-release-vxx.xx.xx\n.in -2\n.sp\n.ul 5\n2.   Make sure your local dependencies are up to date:\n.sp\n.in +2\nscript/bootstrap\n.in -2\n.sp\n.ul 5\n3.   If grammar submodules have not been updated recently, update them:\n.sp\n.in +2\ngit submodule update --remote _&_& git commit -a\n.in -2\n.sp\n.ul 5\n4.   Ensure that samples are updated:\n.sp\n.in +2\nbundle exec rake samples\n.in -2\n.sp\n5.   Ensure that tests are green:\n.sp\n.in +2\nbundle exec rake test\n.in -2\n.sp\n.ul 5\n6.   Bump gem version in lib/linguist/version.rb\n.br\n.ul 5\n7.   Make a PR to github/linguist\n.br\n.ul 5\n8.   Build a local gem: `bundle exec rake build_gem`\n.br\n.ul 5\n9.   Test the gem:\n.sp\n.in +5\n.un 5\ni.   Bump the Gemfile and Gemfile.lock versions for an app which relies\non this gem\n.un 5\nii.  Install the new gem locally\n.un 5\niii. Test behaviour locally, branch deploy, whatever needs to happen.\n.br\n.in -5\n.sp\n.ul 5\n10. Merge github/linguist PR\n.sp\n.ul 5\n11. Tag and push:\n.sp\n.in +2\ngit tag vx.xx.xx;\n.br\ngit push --tags\n.in -2\n.sp\n12. Push to rubygems.org\n.br\n.in +2\ngem push github-linguist-3.0.0.gem\n.in -2\n.sp 2\n"
  },
  {
    "path": "src/test/resources/samples/langs/RUNOFF/longlib.rno",
    "content": ".! documentation for the LONGLIB graphics routines and library\n.! *** LAST REVISED ON 16-MAR-1988 08:22:32.49\n.! *** SOURCE FILE: [DL.GRAPHICS.LONGLIB]LONGLIB.RNO\n.lm0.rm66.ps59,66\n-\n.s12\n.flags index ~\n.c;The LONGLIB Graphics Library\n.s2\n.c;Version 5.1\n.s3\n.flags substitute\n.c;$$Month#$$Day,#$$Year\n.no flags substitute\n.no flags accept\n.s5\n.c;David Long\n.s1\n.c;Jet Propulsion Laboratory\n.c;4800 Oak Grove Drive\n.c;Pasadena, California   91109\n\n.pg\n.! note: TOC stuff is for VMS 3.x and is not required for VMS 4.0\n.style headers 6\n.send TOC .layout 1,3\n.send TOC .rm 70\n.send TOC .display number rl\n.send TOC .c;Table of Contents\n.send TOC .sk\n\n.require \"LONGLIB.RNT\"\n.display number d\n.lm0.rm66.ps59,66\n\n.pg.f.j\n.s3\n.CHAPTER Introduction\n\n.hl 1 General\n.p\nThis manual was prepared to document the LONGLIB graphics library.\nThis latest revision of the library has been extensively modified though\nevery effort has been made to make any changes or additions to the library\ncompatible with previous versions of the LONGLIB graphics library.\nIt is anticipated that additional MASTER subroutines will be incorporated\nin the future as they are needed.\n.p\nThe LONGLIB graphics library is a set of FORTRAN subroutines for vector\nplotting (line graphics).  The library is similar to CALCOMP;\nhowever, a great many extensions \nare incorporated into the LONGLIB library including viewport\nclipping, plot rotation, etc. In addition, \nthe LONGLIB library includes a large set of routines \nfor such things as 3-d plotting (with hidden line removal), extended character\nsets, MASTER routines, graphics input routines, map routines, etc.\n.p\nThe LONGLIB library is designed with three internal packages for plotting\non 3 major classes of output graphics devices: graphics terminals,\nRamtek display screens, and hardcopy devices via metafiles.\nA large variety of graphics terminals are supported.  Graphics output\nto each type of device is discussed below.  LONGLIB achieves virtual\noutput device independence by using only a minimum of low-level commands.\nThese include: initialization, a screen clear/new page command,\nand drawing a vector.  In addition, line types and color are utilized if\navailable.  Graphics terminal and Ramtek output also support additional\nfeatures.  Hardcopy devices which require rasterization are also supported\nusing the Metafile.\n.p\nThe library is principally designed for vector (i.e. line plotting).\nLines are drawn by specifying the movement of an \"electronic pen\".\nThe color, width, and pattern of up/down motions in a line (the\nline type) may be specified.  The library consists of various subroutines which,\nwhen called by a user written program, will produce line drawings on the desired\ngraphics device(s).  The system is interactive in the sense that\nthe user can see and modify plots immediately (on screen devices).\nThe library can also produce a ~metafile which can then be processed by\nprograms supplied with the LONGLIB library to produce\nhardcopy output on a variety of hardcopy devices.\nProvisions have been incorporated for device-dependent graphics input to a \nprogram (see ~CURSOR routines).\n.p\nThe library is designed with several levels of graphics routine users in mind.\nFor the user who simply wants to obtain a plot of an array of data with a\nminimum of effort, the ~MASTER routines offer a simple solution.  These routines\nhandle opening/closing the plot package, scaling, and axis generation, etc,\na wide variety of formats.\nFor the user interested in more elaborate plots, access to several levels\nof the plotting routines are provided.\n.x LINSEQ\n.x line type\n.x color\n.p\nThe LONGLIB graphics library supports both line type (such as\npen width and dot-dash patterns) and color attributes.  In general, these\nattributes are device dependent and specific line types or colors used on\none plotting device may appear differently on a second device.\nTypically, line width is simulated for graphics terminals while line\ntyping relies on hardware support.  A routine for software generation\nof line types (LINSEQ) has been provided.\n\n.hl1 Machine Dependence\n.x machine dependent\n.p\nLONGLIB was developed in a ~VAX/VMS environment and is written exclusively\nin FORTRAN.  While some machine-specific routines have been retained,\nthe present version of the library has been made as ~FORTRAN-77 compatible\nas practical.  Where the code is not FORTRAN-77 compatible, it is so noted\nin the source code.  These exceptions \nwere made for efficiency's sake and can be easily be modified or\nbe left out of the final library.  The largest FORTRAN-77 incompatibilities\n(outside of the Ramtek packages) occur when treating ~character ~string data\n(see notes below).\n.p\nThe auxilary, MASTER, and 3d plotting routines are FORTRAN-77 compatible\nwith a few minor exceptions (e.g. ~INTEGER*2 is used to save space \nand some routine names exceed 6 characters).  These exceptions\nare noted in the source code file headers.\nRoutines in ~RAMLIB and ~REFLIB tend to be very machine specific\nand may require extensive modification for use on other machines.\nUnless specificially stated, integers are all assumed to be the standard\ndefault machine length.  On the ~VAX this is INTEGER*4.  A 2's complement\nrepresentation is assumed for negative integers when specifying the\nline type bit pattern (various routines and programs) and in storing the\npen motion data in the routines SYMBOL, SYM3D, and SYM3DH.\n.x INTEGER*4\n.p\nSome machine dependent constructs are used in the library for detection\nof missing (and/or default) parameters (mainly in SYMBOL, NUMBER,\nand AXIS ROUTINES).  These can easily be modifed and/or adapted for\nother machines.\n.p\nNote that when a subroutine is called with a Hollerith constant,\nCALL SUB('string'),\n~VAX ~FORTRAN passes the string as a ~BYTE array of ascii values.  (see the\nVAX FORTRAN User's Guide).  ~CHARACTER variables are passed using a\ndifferent mechanism and can not be substituted.\nIf you wish to use a CHARACTER variable, use the %REF() function. i.e.,\nuse CALL SUB(%REF(CHARACTER_VARIABLE)).\n.x %REF()\n.x character\n.x byte\n.p\nThe ~VAX extended ~FORTRAN data type \"BYTE\" (for an 8 bit variable) is used\nin the REF and Ramtek library package.  The terminal output\nis via a WRITE(*,<format statement number>) command.\nThe ~cursor routines CURMOTION, CURRECT, CURBAND use the machine dependent\nroutine ~INXTCHR to read escape sequences from the terminal.\nNote, however, that the library can be used without these cursor routines.\n.x %loc()\n.P\nA ~VAX routine %LOC() is used in ~MVAX5D and ~VAX5D to determine the\naddress of an array.  These routines may be modified or deleted as desired.\n.p\nThe library contains files for VAX environment help libraries, etc.  These\nfiles can be deleted if not used.\n\n\n.hl1 Using Longlib with Graphics Terminals\n.p\nOne of three internal, separate packages used by LONGLIB is the\nterminal screen graphics package.\nThe LONGLIB graphics library supports a variety of graphics ~terminal \ndevices which use ~Tektronix graphics formats including:\n.x Selanar\n.x vt100\n.x vt125\n.x vt240\n.s1\n.ls0\n.le;VT100 equipped with a Selanar GR100 or GR100+\n(Selanar Corporation, Santa Clara, Ca.)\n.le;VT125 (VT100 + retrographics)\n.le;VT240 and compatibles\n.le;VT220 equipped with a Selanar SG220\n.le;Tektronix 4010/4014 and compatibles\n.le;Tektronix 4107/4109 and compatibles\n.le;Graphon GO-235\n.els\n.s1\n.x PLOTVT\n.x vtplot\n.x newvpen\n.x newvcol\nOther graphics terminals can be used by appropriate modification of the\nterminal driver routines (CTERM, VTPLOT, NEWVPEN, NEWVCOL).  The routines\n~FRAME and ~VPLOTS will also need to be modified.\nEscape sequences need for terminal initialization and mode switching are\nhandled in the subroutine CTERM.  \nWhen plotting is not done to the terminal ~CTERM and other terminal\nspecific routines are\na dummy call.  Note: plotting to the terminal is done by accumulating\na set of connected line segments created by ~PLOT or PLOTVT.\nThe line segments\nare output to ~terminal only when the buffer length of 32 is exceeded or \na \"pen up\" occurs.\nConsequently, a \"pen up\" should be issued to force all stored plot segments \nto be output to the terminal prior to viewing screen.\n.p\nIt is assumed that all terminals are configured in a standard fashion.\nBecause of the wide variety of terminal types, the specific settings\nwill not be given in this document.\n.p\nIn designing the terminal driver routines, the design philosophy has been\nto take advantage of the capability that many graphics terminals have to\ndisplay both text and graphics independently on the screen.  That is,\nthe text and graphics \"screens\" can be independently cleared, etc.\nThis feature is heavily exploited in this library.  \nOf course not all terminals support this feature.\nTerminals such as the VT240 and Tektronix 4010's do not support this feature.\nIn this case, the ~CTERM routine operates somewhat differently in that\nit sets the terminal to graphics mode and leaves it there.\n.p\nNote that in the VAX environment, the SET TERM options of the terminal\ndriver must be properly configured.  For example,\nyou must execute a SET TERM/FORM while in ~DCL to enable the screen clear\ncommand to work properly.  This permits a form feed to pass through to the\nterminal.  The NO ESCAPE qualifier should also be set to read from the \nterminal.\n.p\nA command file, LONGLOC:CLEAR.COM,\nhas been provided which, when executed, will clear the screen of a VT100\nequipped with a ~Selanar card and set the ~VT100 into text mode.  A simliar\nroutine for a ~VT125 (TCLEAR.COM) and a VT220 (VCLEAR.COM) is also provided.\nThese reset the graphics mode back to terminal mode and clear the screens.\nThe are very helpful during program development.\n.p\nLONGLIB also supports color on graphics terminals which permit color\nplotting.\n\n.hl 2 Terminal Specific Application Notes\n.p\nThe following sections describe the operation of the LONGLIB graphics\nroutines with some specific graphics terminal types.  This list is\nnot comprehensive.\n\n.hl 3 VT100 (w/Selanar Graphics Cards)\n.p\nA reference to a VT100 indicates a VT100 equipped with a Selanar\nequipped (GR100, or GR100+) VT100.\nA SG100 equipped VT100 has three modes: the terminal (VT100) mode, the Selanar\nterminal mode, and the Selanar graphics mode.  The routine ~CTERM is used\nto switch the terminal between modes.  A call to ~FRAME\nwill set the mode to the Selanar terminal mode.  Whenever a line is\nplotted to the screen the mode is change to Selanar graphics and then\nback to the Selanar terminal mode.  If a program error occurs when the terminal\nis in the Selanar graphics mode, it is possible to not see\nany output.  Running the ~CLEAR command file will reset the mode back\nto terminal.  The Selanar card does not provide linetypes or XOR capability\nin the 4010 operation mode.\n\n.hl 3 VT125\n.p\nA ~VT100 upgraded with the DEC upgrage package to a VT125 has two\nmodes used by the LONGLIB library: the normal terminal mode, and the\nTektronix 4010 graphics mode.  Both text and graphics can be displayed\non the same screen but independently manipulated by swithing between\nmodes.\nRunning the ~TCLEAR command file will reset the mode back to terminal.\n\n.hl3 VT240\n.p\nUnlike other terminals, the ~VT240 when switched between terminal modes\nclears the screen.  Thus CTERM sets the terminal mode to the Tektronix\n4010 mode when terminal graphics are initiated.  The mode is not changed.\nLimited linetypes are supported though XOR plot mode is not.\n\n.hl 3 VT220 (w/Selanar Graphics Card)\n.p\nReference to a ~VT220 terminal is intended to indicate a VT220 terminal\nequipped with a Selanar SG220 graphics upgrade board.\nThe SG220 board operates through the VT220's printer port.  In\naddition, it uses some of the keys on the VT220 keyboard.  It is possible\nto enable the graphics board when the printer port is disabled.  This causes\nsome of the keys (notably the keypad and cursor keys) to not work for editing,\netc.  To correct this, deselect the graphics board using CNTRL-SELECT.\n.p\nIn order for the graphics board to plot graphics commands from the library\nroutines, the printer port must be\nin the controller mode and the board enabled.  All this is automatically\nhandled by the LONGLIB graphics library routines.  Note, however, that\nyou will need to use the CTERM commands correctly to obtain proper operation.\n.p\nThe DCL command file ~VCLEAR will reset printer port, clear the graphics\ncard and terminal the screens under most situations.\n.x getcursor\n.p\nWhen using GETCURSOR, a large cross-hair will appear on the screen.\nUse the cursor keys and the shift key to move the intersection point to\nthe desired location and press a key.  This ends the graphics input.\nThe cross-hair will disappear, there will be a pause, and the program\nwill continue.  NOTE: DON'T USE THE RETURN KEY TO END GRAPHICS INPUT AS\nTHIS WILL CAUSE THE PROGRAM TO NOT READ THE LOCATION AND MESS UP YOUR\nTYPE-AHEAD BUFFER.\n.p\nThe SG220 board stores the starting and ending points of each vector in memory\nthen dynamically redraws the screen for each refresh (this is how it can do\nzooming and windowing).  However, this also limits the number of vectors\nthat can be drawn on the screen at once. \nIf a very large number of vectors are plotted, a zoom in/out may cause\na portion of them to not reappear.\n.p\nNote:  Since the actual SG220 screen resolution is only 832x350\nand the board is emulating a Tektronix 4014 (4096x3200) there is some\nquantization error associated with the cross-hair operation.\n.p\nNote:  When the manual zoom in/out feature is used\nthe cross-hair cursor does not work properly.  The cross-hair is initially\nplotted then erased.  When you move the cross-hair, it is replotted.\nA copy of the cross-hair stays at the start location.  Otherwise, it is\nuseable.\n\n.hl 3 Tektronix 4010/4014 Compatible Terminals\n.x 4010\n.x 4014\n.p\nA generic ~Tektronix 4010/4014 compatible terminal is defined in LONGLIB.\nLinetypes are supported.\nSince most ~Tektronix 4010/4014 compatible terminals do not support\ndual text/graphics screens, this feature\nis unavailable.\n\n.hl 3 Tektronix 4107/4109 Compatible Terminals\n.x 4107\n.x 4109\n.p\nThe ~Tektronix 4107/4109 terminals support a dual (text and graphics)\nscreen mode which is exploited by LONGLIB.  Most of the advanced features\navailable on these terminals are not exploited.  Color and linetypes\nare supported.  The command file ~TEKCLR (executed from DCL)\ncan be used to clear the screen\nand reset the terminal into the ANSI mode.\n\n.hl 3 Graphon Terminals\n.p\nThe ~Graphon GO-235 is a terminal compatible with a VT100/VT200 and\nTektronix 4014.  It permits both text and graphics on the same screen\nin separate planes when properly configured.  This configuration is\nassumed by the LONGLIB graphics library.  The Graphon terminal supports\nlinetypes, graphics input, and XOR plot mode.\nA command file GCLEAR (executed\nfrom DCL) is provided to clear the screen and reset the text mode.\n\n.hl1 The LONGLIB Metafile (Hardcopy Output)\n.p\nThe second internal package used by LONGLIB is the ~metafile or\nprinter history file package.\nThe library can optionally produce a plot metafile containing\nscaled, clipped pen motion commands.  This \"history\" file\ncan be processed by other programs to produce hardcopy output on the\nappropriate device.  Using the ~REPLOT program, the plot history file can\nbe redisplayed on a screen device.  Raster scan converter programs produce\na dot-image printable file from the metafile for printing to a dot matrix\nprinter.  Other metafile processing programs convert the LONGLIB metafile\nto other graphics description languages including POSTSCRIPT, HPGL, QUIC, etc.\n.x postscript\n.x hpgl\n.x quic\n.x stripping\n.x strips\n.p\nMany of the LONGLIB metafile processing programs permit \"striping\" of the\ngraphics image.  When the graphics image contained in the LONGLIB metafile\nexceeds the size of a single page (or whatever) of the output device, the\nthe metafile image is \"cut\" into \"strips\" which fit on the output page.\nThen each page is output.  Normally, blank pages are suppressed.  At the\nsame time redundant pen motions, changes, etc. are filtered out.\n\n.hl 2 Dot Matrix Printers\n.x raster scan\n.x dot matrix printers\n.p\nDot matrix printers, in general, require graphics data in a bit-image\nimage format.  This requires converting the LONGLIB metafile pen\nmotion file into a bit-image file using a raster scan process.\nUsing one of the supplied raster scan converter programs, the LONGLIB\nmetafile can be processed to produce a printable file of graphics for\nseveral types of dot matrix printers.  The raster scan converter programs\nsupports linetypes and widths.  Currently, raster scan\nconverter programs which including \"stripping\" exist for the following\nprinters:\n.s1\n.ls0\n.le;Printronix\n.le;Trilog TIP-300\n.le;DEC LA50 (or compatible)\n.els\n.p\nThe raster scan converter programs using \"stripping\" with a strip\nsize which depends on the printer.  Ordinarily the strip is 56.5 by\n13.2 inches (or the width of the printer page).\nTo generate a raster scan data file suitable for printing on a\ndot matrix printer from the vector plot command file, the\nraster scan converter program must be used.  Versions of this\nprogram exist for ~LA50 printers (LA50), ~Printronix printers\n(PRNTRX), and ~Trilog Printers (TRILGLO or TRILGHI--see below).\n.p\nTwo raster scan programs have been provided for the\n~Trilog printer to take advantage of its higher printing resolution.\n~TRILGLO prints the same resolution on the Trilog printer as on the\nPrintronix printer.  ~TRILGHI plots at almost twice the across-the-page\nresolution and the same down-the-page resolution.  Execution time is longer\nfor the high resolution program.\n.x raster scan conversion\n.p\nAn example of the use of the TRILGLO program in the ~VAX environment\nfollows.  The LONGLIB metafile input is FOR003.DAT.  The output\nis OUT.LIS.\n.lit\n\n     $ TRILGLO :== $LONGLOC:TRILGLO\n     $ TRILGLO FOR003.dat            ! run raster scan converter\n     $ print/que=Trilog OUT.LIS      ! print output\n\n.end lit\n.p\n~VAX ~DCL command files in the directory pointed to by the logical name\nLONGLOC: contain command files for execution of these commands.\n(PLOT183.COM = printronix printer, PLOTLO.COM = trilog printer lo-res\nPLOTHI.COM = trilog printer hi-res).\n\n.hl 3 Subprocesses\n.p\nTwo subroutines have been provided to spawn a subprocess from\na FORTRAN program (in a ~VAX ~VMS environment) to execute the raster scan\nconverter programs.\n\n.hl4 SUBROUTINE PSUBPRO\n.lit\nCALL PSUBPRO(i,opt,ip)\n\ni   (I): raster scan conversion program type\n         = 0 printronix printer \n         = 1 low res trilog printer\n         = 2 hi res trilog printer\nopt (I): concurrent process option\n         = 0 wait for completion \n         = 1 no wait\nip  (I): print flag\n         = 0 do not print \n         = 1 print\n\n.end lit\n~PSUBPRO creates a ~subprocess using ~SUBPROC to run the raster scan conversion\nprogram.  PSUBPRO should be used with FOR003.dat file after the plot package\nhas been closed.  The output is OUT.LIS which can be printed if desired.\nThe command files used are located in LONGLOC:.\n\n.hl 4 SUBROUTINE SUBPROC\n.lit\nCALL SUBPROC(in,out,i)\n\nin   (C) : input command file name (CHARACTER variable)\nout  (C) : output log file (CHARACTER variable)\ni    (I) : concurrent processing option\n           = 0 wait for completion\n           = 1 no wait\n.end lit\n.p\n~SUBPROC creates a ~subprocess which executes the command file IN.  The output\nis places in the file OUT (if OUT is NL: the output is discarded).\n\n.hl2 HPGL Compatible Pen Plotter\n.x pen plotter\n.p\nMetafile conversion programs which convert the LONGLIB metafile into\nan HPGL (~Hewlett-Packard graphics language) command data file\nare included in LONGLIB.  Three programs are available, HPGL, HPGL2,\nand HPGLS.\n.p\n~HPGL reads the LONGLIB metafile, processes it into appropriate commands\nand sends the commands to the terminal printer port (either a VT100 or VT220\ncompatible terminal or a VT100 equipped with a Selanar GR100 graphics board)\nto which is connected\nan HPGL-compatible pen plotter.  No \"stripping\" of the image is done.\nThe user is prompted for page changes. \nPen changes on the plotter occur in response to a color change in the\nmetafile.  Line types are supported but line widths are ignored.\n.p\n~HPGL2 reads the LONGLIB metafile and produces a separate output file of HPGL\ncommands for each page of LONGLIB metafile input.  HPGL2 does not\ninclude \"stripping\" of the image.  HPGL2 plots all of the vectors of a\ngiven color before changing\npens.  Line types are supported but line widths are ignored.\n.p\n~HPGLS is similar to HPGL2 but includes stripping of the image.\nHPGL2 produces a separate output file of HPGL commands for each strip\nand page of LONGLIB metafile input.\n.p\nAn example of the use of the HPGL2 program in the ~VAX environment\nfollows.  The LONGLIB metafile input is FOR003.DAT.  The output\nis a file, OUT.LIS which can then be sent to an HPGL-compatible plotter.\n.lit\n\n     $ HPGL2 :== $LONGLOC:HPGL2\n     $ HPGL2 FOR003.dat            ! run HPGL conversion program\n                                   ! several out.lis files may be produced\n     $ print/que=HPGL out.lis;*    ! send output file(s) to plotter\n.end lit\n\n.hl2 QMS QUIC Laser Printer\n.p\nThree programs, LASER, LASERS, and RLASER, are included to convert the\nLONGLIB metafile into a printable file in the ~QMS ~QUIC laser printer\ncontrol language.\nLine width and line types are supported though color is not.  \nPrograms LASERS and RLASER \"strip\" the metafile into 8.5 by 11 page strips\nwhile LASER does not do stripping.\n~LASER and ~LASERS produce\na full size, normal orientation output, while ~RLASER scales the output\nby 3/4 and rotates the page -90 deg.\n.p\nAn example of the use of the LASER program in the ~VAX environment\nfollows.  The LONGLIB metafile input is FOR003.DAT.  The output\nis OUT.LIS.\n.lit\n\n     $ QMS :== $LONGLOC:LASER\n     $ QMS FOR003.dat               ! run QMS metafile conversion\n     $ print/que=QMSLASER OUT.LIS   ! print output to printer\n.end lit\n\n.hl2 PostScript\n.x applewriter\n.p\nA program titled ~POSTSCRIPT is included which will convert the LONGLIB\nmeta file into a PostScript page language format.  This can then be printed\nto PostScript compatible printer (such as an AppleWriter).  No \"strips\"\nare used. Linetypes and width are supported.  Input color changes\nare output as grey tones.\n.p\nAn example of the use of the POSTSCRIPT program in the ~VAX environment\nfollows.  The LONGLIB metafile input is FOR003.DAT.  The output\nis OUT.LIS.\n.lit\n\n     $ POST :== $LONGLOC:POSTSCRIPT\n     $ POST FOR003.dat                ! run POSTSCRIPT conversion\n     $ print/que=POSTSCRIPT OUT.LIS   ! print output to printer\n.end lit\n\n\n.hl 2 Plotting the LONGLIB Metafile to a Screen Device\n.p\nA program ~REPLOT has been provided which will read the LONGLIB ~metafile\ncreated by an eariler program and plot the file to a screen\ndevice (terminal or Ramtek).  This program may be run from DCL in the\nVAX environment by:\n.lit\n\n     $ REPLOT :== $LONGLOC:REPLOT\n     $ REPLOT <printer graphics file name>\n\n.end lit\nNote that the default meta file name is FOR003.DAT.\n\n.hl1 Plotting on the RAMTEK Screen Graphics Device\n.x ramtek emulation\n.x ref\n.p\nThe third internal package (which will not be available in some\ninstallations) used by LONGLIB is the ~Ramtek Screen display package.\nThe plotting device is the Ramtek family of displays.\nCurrently, only some (but not all) of the \nfunctions of the Ramtek 9460 (1280x1024) or 9050 (512x512)\nRamtek screen display are supported.\nThe Ramtek screen display can be replaced by the \nRamtek Emulation File (REF) package which simulates the Ramtek display\nas an internal image array. The LONGLIB library can be configured without\nthe Ramtek package.\n.x rplots\n.x PLOTRM\n.p\nThe Ramtek package is initialized by a call to ~FRAME (which calls RPLOTS).\nWhen the Ramtek package is not being used, calls to Ramtek routines\nare dummy calls.  Note: plotting to the Ramtek is done by accumulating\na sequence of connected line segments (defined by ~PLOT or PLOTRM)\nin a storage buffer.  The line segments are output to the\n~Ramtek only when the buffer length of 128 is exceeded or a \"pen up\" occurs.\nConsequently, a final \"pen up\" should be issued to make all plot segments \nare output to the display prior to viewing screen.\n.p\nThe current version of the software drivers for the Ramtek display are\nmachine specific to VAX/VMS.  The ~REF subpackage uses some ~VAX FORTRAN\nspecific constructs (for efficiency) but could easily be modified for\nother machines.\n.x vax/vms\n.p\n~Ramtek display drivers expects the logical name \"RM\" be assigned to Ramtek\ndevice (example: assign RMA0: RM:).\nWhen the Ramtek device supports multiple diplays, interaction between the\ndisplays complicates matters.  To distiguish between different displays on\nthe same device it is suggested that the 0th device be named xxx0:, second\ndevice xxx1:, etc. \n~Color plotting is done on the Ramtek using the previously loaded color table.\nThe LONGLIB \"color\" is the color table index.\nThe default Ramtek color table index is 255.  The main LONGLIB package\nuses only vector plotting.  However, auxilary routines have been included\nwhich permit writing image mode data to the Ramtek (or REF) and for\ncolor table manipulation (see RMWRITEWORD or RMWRITECOL).\n.x RMWRITEWORD\n.x RMWRITECOL\n.p\nThe Ramtek supports line types and scale factors but simulates line widths.\n\n.hl2 Ramtek Emulation File Plotting\n.x ramtek emulation file\n.x REF\n.p\nWhen a Ramtek display is not available or\nfor off-line plotting to a \"simulated\" Ramtek device, a set of routines\nknown as the ~Ramtek Emulation File (REF) routines can be used.  \nThese routines replace the Ramtek communications routines (RAMLIB) in\na version of the LONGLIB graphics library named LONGLIBR.OLB.  This software\nemulates many (but not all) of the important functions of the Ramtek \ncommunication routines to a 9460 or 9050 Ramtek\ndisplay using an internal byte array.  \n.p\n\n.hl 3 Using the REF Routines\n.x RMWRITEWORD\n.p\nTo use the REF routines, link to the LONGLIBR version of the LONGLIB library,\nand plot to the Ramtek device.\nThe REF routines use a 1280x1024 BYTE array as the simulated Ramtek\ndisplay.  Each byte of the array stores the color table index for each\npixel of the simulated Ramtek display.  An empty \"screen\" consists\nof all zeros.  When a line is drawn to the\ndisplay using ~PLOT or ~PLOTRM the appropriate pixel bytes are set\nto the line color.  REF routines also permit image mode writing/reading\nof horizontal or vertical lines of bytes (see RMWRITEWORD, for example).\nWhen the plot package is closed (by a call to PLOTND) the user will be\nprompted to output the internal BYTE array to a specific\ndevice (a graphics terminal, a metafile, or a special REF file).  To\navoid the interative prompt, the user can call ~REFDIS  (with its appropriate\narguments) prior to the ~PLOTND call.  This will disable the prompts.\nSee REFDIS for additional details.\n.p\nNote: the Ramtek color table routines and cursor routines are dummy calls\nwhen using the REF routine library.\n\n.hl3 REF File Output\n.p\nThe REF file consists of a direct access file with a record length of\none horizontal line of pixels.  The number of records and record size\ndepends on the type of Ramtek chosen (RECL=1280, 1024 records for the\nlarge Ramtek and RECL=512, 512 records for the small Ramtek).\nREFDIS places each horizontal line of the output array into each\nrecord of the REF file.\nThe REF file can subsequently be read by the ~REFTERM program and\nplotted to the \"real\" Ramtek device.  To produce a hardcopy output\nof the REF file on a ~QMS laser printer, the program ~REFLAS reads \nthe file and produces a simulated gray scale image with 4 grey levels.\nREFLAS prompts the user for the appropriate inputs.  In the ~VAX/VMS\nenvironment, the program ~REFLAS2 can be used.  REFLAS2 provides significantly\nfaster run times by using the VAX paging utility and downloadable fonts.\n\n.hl3 REF Terminal or Metafile Output\n.p\nWhen outputing the byte array data to a terminal or printer history file,\nthe array is converted to a series of horizontal vectors.   As the array\nscanned left to right, top to bottom, all ajacent pixels of the same color\nare combined into a single vector.  When a pixel of a different color is\nencountered the vector is output.  Pixels of color \"0\" (background) are\nnot output.\nSee REFDIS for additional details.\n\n\n.hl 1 Library Location\n.p\nAll LONGLIB libraries, source files, and support programs are located in\nthe same directory.  In the ~VAX environment,\nThe logical name ~LONGLOC: should be assigned to be this directory, i.e.,\n.lit\n\n        $ assign disk:[directory] LONGLOC:\n.end lit\n.p\nThe LONGLIB object library is self contained.  In order to link to the\nnormal library use the command (see also the shareable image library\nsection below),\n.lit\n\n        $ link <your_prog>,LONGLOC:LONGLIB/LIB\n\n.end lit\nIf your installation has a Ramtek display, this link command will include\nthe Ramtek display routines.  If your installation does not have a Ramtek\ndisplay, this link command will include only dummy routines for Ramtek\nroutines.  In order to link to the REF version the library (which is normally\navailable on every installation) use the LONGLIBR.OLB object library,\n.lit\n\n        $ link <your_prog>,LONGLOC:LONGLIBR/LIB\n.end lit\n\n.hl 2 LONGLIB Source Code\n.p\n.x source code\n.x FORTRAN\n.X C\nThe source code for LONGLIB is all in FORTRAN and is included\nin the distribution package.\nSource code may be found in the following files:\n.lit\n\nLONGLIB.FOR (device dependent routines)\nAUXLIB.FOR (auxilary device independent routines)\nMLIB.FOR (MASTER routines)\nMLIB2.FOR (more MASTER routines)\nHIDELIB.FOR (3-d hidden line routines)\nLONGLIB3D.FOR (3-d w/no hidden lines)\nRAMLIB.FOR (Ramtek communication code)\nMAPLIB.FOR (map routines)\nCURSORLIB.FOR (cursor routines)\nREFLIB.FOR (Ramtek emulation file routines)\netc.\n.end lit\n.p\nIn addition, the LONGLIB support program such as the example programs, \nmetafile processing programs, etc.,  are located in LONGLOC:.\n\n.hl1 User Notes -- VAX/VMS Environment\n.p\nIn the ~VAX/VMS environment LONGLIB provides an on-line help library\naccessable from either a user program or DCL as well as a shareable\nimage library.\n\n.hl2 Using the LONGLIB VAX/VMS On-line HELP Library\n.x help library\n.p\nIn the ~VAX/VMS environment an on-line ~help library is available in addition to this\ndocumentation.  The On-line help library can be accessed from ~VAX DCL by,\n.lit\n\n        $ HELP @LONGLIB\nor\n        $ HELP @LONGLOC:LONGLIB.HLB\n\n.end lit\n.x helpme\nA subroutine for accessing the library is also included\nin the LONGLIB package HELPME.  From a user program calling HELPME with\na ~CHARACTER string corresponding to the initial help string will call\nthe VAX librarian for an interactive search through the LONGLIB help library.\n\n.hl2 Using the LONGLIB VAX/VMS Shareable Image Library\n.p\nA shareable image library for the ~VAX/VMS may be created for the LONGLIB\ngraphics library.  To obtain the most advantage from using the shareable\nimage library, the library must be \"installed\" by the system manager.\nNot all installations will have an installed LONGLIB library.\nLinking to the shareable image library\n(LONGLIB.EXE rather than LONGLIB.OLB) produces executable files which\nare small and run faster.\nThe main difference is in how they are linked.  To link to the \"normal\"\nlibrary,\n.lit\n\n        $ LINK your_file_name.OBJ,LONGLIB/LIB\n\n.end lit\nTo link to the shareable image library you have to use a linker option\nfile:\n.lit\n\n        $ LINK your_file_name.OPT/OPT\n\nwhere your_file_name.OPT contains:\n\n        your_file_name.obj,LONGLIB/SHARE\n\nor you may use the longlib linker option file:\n\n        $ LINK your_file_name,LONGLIB/OPT\n\n.end lit\nThis second option for the linker option file is the easiest to use.\nNote that the LONGLIB/OPT should be last on the link list.  On most\ninstallations, the REF version of the library, LONGLIBR, is not installed\nas a shareable image library.\n.p\nAlthough the linking is somewhat more complex, the shareable image file\ndoes allow program using the graphics library to run slightly faster and\nthe executeable to be significantly smaller.\n.p\nThe shareable image library is designed to be upwardly compatible.\n\n.hl1 Disclaimer\n.p\nLONGLIB is very powerful graphics package for line-graphics.\nUnfortunately,\nthe desire to maintain compatibility with earilier LONGLIB versions\nhas resulted in less than optimal design decisions.  There are, however,\nsome incompatibilities with earlier versions of LONGLIB; notably\nthe color array used in AXIS, AXIS2, and AXIS, the working space\nspecifications of PLT3D and NXTVU, and metafile internal format which\nresults in the fact that previous metafile processing programs will\nnot work with new metafiles and vice versa.\n.p\nLONGLIB was developed in the ~VAX ~VMS environment. \nWith the possible exception of the Ramtek package routines, every\nattempt has been to keep LONGLIB FORTRAN-77 compatible and machine\nindependent with the exceptions previously noted.   No claim is made\nregarding the transportability of LONGLIB to non-VAX machines.  It is\nfelt, however, that only small modifications would be required.\n.p\nAs with any software system, there may be bugs in either the documentation\nor software though every attempt to eliminate them has been made.\n\n.CHAPTER Programming Examples\n.p\nIn this chapter several ~examples of using some of the basic plotting\nroutines of this library are included.  The ~VAX environment permits\nthe linking of object code segments compiled from different languages.\nThus, examples for both ~FORTRAN and ~C routines are shown.\n\n.hl1 FORTRAN Programming Examples\n.p\nFor the user interested in obtaining very simple plots of curves without\nbeing concerned with the details of LONGLIB, the ~MASTER routines provide\nthe most simple approach.  Greater control of the output plot can\nbe obtained by customizing user version of MASTER-like routines from\nthe auxilary routines.\n\n.hl2 Simple MASTER Routine Example\n.p\nA very simple example of using the ~MASTER routines of this library is shown\nbelow.  For more detailed examples see the following sections.\n.p\nThis example plots a\ndamped sine wave on both the terminal screen, the Ramtek (in color),\nand the LONGLIB metafile.\nThe master routine ~PLOTSC handles all graphics intialization and\nclosing.  (See the chapter on MASTER routines for additional details).\n.TP 16\n.lit\n\n           DIMENSION X(100),Y(100)\n           DATA P,U,PL,A,B,PHI/112,85,25.,.013,.3/\n           DATA PI/3.141593/\nC  FILL DATA ARRAYS\n           DO 10 I=1,100\n             X(I)=I-1\n             Y(I)=SIN((I-1)*PI/A+PHI)*EXP(-I*B)\n     10    CONTINUE\nC CALL LONGLIB PLOTTING ROUTINE TO PLOT CURVE.\nC OUTPUT ONLY 35 OF THE 100 POINTS ON A 6X5 PLOT WITH TITLE\nC AND A GRID.  iflag IS SET TO PROMPT FOR A SCREEN OUTPUT DEVICE.\nC NOTE THAT WHEN A MASTER ROUTINE INITIALIZES LONGLIB, A\nC METAFILE IS ALWAYS PRODUCED.\n           CALL PLOTSC(X,Y,100,5,6.,5.,'X TITLE',7,'Y TITLE',7,\n         1        'TOP TITLE',-10)\n           STOP\n           END\n\n.end lit\n\n.hl2 Lower Level Routines\n.p\nAn example of using the auxilary routines of LONGLIB library from\n~FORTRAN is illustrated below.\nAn example for using this library from ~C follows.\n.p\nThis example plots a damped sine wave on both the terminal screen,\nthe Ramtek (in color), and the LONGLIB metafile.  No MASTER\nroutines are used.\n.lit\n\n       PROGRAM DEMO\n       DIMENSION X(100),Y(100),ICOL(3)\n       DATA P,U,A,B,PHI/112,85,25.,.013,.3/\nC ICOL IS THE COLOR ARRAY FOR AXES\n       DATA PI/3.141593/,ICOL/1,2,3,4/\nC FILL DATA ARRAYS WITH Y=F(X)\n       DO 10 I=1,100\n         X(I)=I-1\n         Y(I)=SIN((I-1)*PI/A+PHI)*EXP(-I*B)\n   10  CONTINUE\nC INITIALIZE LONGLIB WITH SCREEN PROMPT OPTION\nC AND CREATE METAFILE TO FORTRAN UNIT 3.\n       CALL FRAME(3,0,2.,2.,1.)\nC COMPUTE SCALING FACTORS FOR X AND Y\n       CALL SCALE(X,8.,100,1,1,XMIN,DX)\n       CALL SCALE(Y,6.,100,1,1,YMIN,DY)\n       Y0=-YMIN/DY\nC PLOT COORDINATE AXISES WITH COLOR OPTION ENABLED\n       CALL AXIS(0.,Y0,'X-AXIS',-6-100000,20.,0.,\n      1  XMIN,DX,N1,N2,ICOL)\n       CALL AXIS(0.,0.,'SINE',4+100000,17.,90.,\n      1  YMIN,DY,N1,N2,ICOL)\nC SET LINE COLOR\n       CALL PLOT(5.,0.,0)\nC PLOT DATA POINTS AS A LINE WITH SYMBOLS\n       CALL LINE(X,Y,100,1,5,2,1,1,XMIN,DX,YMIN,DY)\nC PICK UP PEN AT END OF LINE (FORCES OUTPUT TO SCREENS)\n       CALL PLOT(0.,0.,3)\nC PROMPT FOR SCREEN CLEAR ON RAMTEK/TERMINAL\n       CALL CTERM(2)\n       CALL RTERM(2)\nC CLOSE LONGLIB\n       CALL PLOTND\n       STOP\n       END\n.end lit\n\n.hl 1 C Language Programming Example\n.x c language\nThe following is an illustration of how to use lower level LONGLIB\nroutines to produce a plot from ~VAX C.\n.tp15\n.lit\n\n/* Example in VAX C */\n\nmain \n{\n  real x[100],y[100],dx,xmin,dy,ymin;\n  real exp(),sin(),y0;\n  int icol[4] = 1 , 2, 3, 4;\n  int i,n1,n2;\n  real pi = 3.141592654;\n  real p = 112., u = 85., a = 25., b = .013, phi = .3;\n\n  for (i = 1; i < 100 ; i++) {\n    x[i] = i - 1;\n    y[i] = sin( (i-1) * pi / a + phi) * exp(-i * b);\n  }\n  frame(&3,&-3,&0.,&0.,&1.);          /* Initialize */\n  scale(x,&8.,&100,&1,&1,&xmin,&dx);\n  scale(y,&6.,&100,&1,&1,&ymin,&dy);\n  y0 = -ymin / dy;\n  plot(&2.,&2.,&-3);                  /* new origin */\n  axis(&0.,&y0,\"X-AXIS\",&-6-100000,&20.,&0.,&xmin,&dx,&n1,&n2,icol);\n  axis(&0.,&0.,\"SINE\",&4+100000,&17.,&90.&ymin,&dy,&n1,&n2,icol);\n  plot(&4.,&0.,&0);                   /* new color */\n  line(x,y,&100,&1,&5,&2,&1,&1,&xmin,&dx,&ymin,&dy);\n  plot(&0.,3&0.,&3)                   /* pen up */\n  cterm(&2);                          /* ask if screen clear */\n  plotnd;                             /* terminate plotting */\n\n}\n.end lit\n\n.hl1 MASTER Routine Examples (FORTRAN)\n.P\nThe subsections that follow illustrate additional examples of how to use\nMASTER routines from FORTAN.\n\n.hl2 Adding Additional Annotation to a MASTER Routine Plot\n.X PLOTSC\n.x plottests\n.p\nThe following is an ~example of using a MASTER\nsubroutine more than once and/or adding additional text or\nanother plotting line and/or two MASTER subroutines: (see also the\nprogram PLOTTESTS)\n.TP16\n.S1\n.lit\n       ...\nC INCLUDE PLOTSC ROUTINE COMMON BLOCK WHICH RETURNS\nC SCALE FACTORS USED IN PLOTTING\n       COMMON /CPLOTSC/XMR,DXR,YMR,DYR \n       ...\nC CALL PLOTSC WITH -10000 iflag < 0 TO INITIALIZE LONGLIB\nC BEFORE CALL BUT NOT CLOSE LONGLIB AFTER CALL\nC SET iflag TO PROMPT FOR SCREEN DEVICE TYPE WITH TICKED GRID\n       CALL PLOTSC(X,Y,25,4,8.,6.,'X AXIS',6,\n     1    'Y AXIS',6,'TITLE',-5,ICOL)\nC PUT GRAPHICS TERMINAL IN GRAPHICS MODE\n       CALL CTERM(-1)\nC PLOT ADDITIONAL TEXT AFTER PLOT TITLE\n       CALL SYMBOL(999.,999.,0.15,' TEXT',0.,5,-1)\nC PLOT ADDITIONAL ANNOTATION ABOVE PLOT\n       CALL SYMBOL(0.0,6.5,0.15,'NUMBER=',0.,7,-1)\nC ADD NUMBER AFTER ANNOTATION WITH 3 DIGITS AFTER DECIMAL PT.\n       CALL NUMBER(999.0,999.0,0.15,3.1415,0.,3,-1)\nC CHANGE LINE TYPE TO DOTTED\n       CALL NEWPEN(1)\nC ADD ANOTHER LINE OF DATA ON PLOT USING PLOTSC SCALE FACTORS\n       CALL LINE(X,Y2,N,1,0,0,1,1,XMR,DXR,YMR,DYR)\n       ...\nC ASK IF SCREEN CLEAR ON TERMINAL (METAFILE NOT AFFECTED)\n       CALL CTERM(2)\n       CALL PLOTND\n       ...\n.end lit\n\n.hl2 Using Multiple MASTER Routines in the Same Program\n.x plottests\n.p\nThe following is an ~example of how to use several MASTER\nsubroutines in the same program.  (see also the program PLOTTESTS)\nThe basic idea is to use the first call to a MASTER routine to\ninitialize the LONGLIB graphics library.  On later calls to MASTER\nroutines you must use \"iflag\" to instruct the routine NOT to\nre-initialize LONGLIB.  The last call to a MASTER routine closes\nLONGLIB.\n.x PLOTLG\n.x PLOTSC\n.tp16\n.S1\n.lit\nC FIRST CALL TO MASTER ROUTINE, SET -10000 < iflag < 0\nC TO INITIALIZE LONGLIB BUT NOT CLOSE IT\nC SET iflag TO PROMPT FOR SCREEN DEVICE TYPE WITH\nC AXIS ON TOP AND SIDES AND NO GRID\n       CALL PLOTSC(X,Y,N,-1,...) \n       ...\nC SECOND CALL TO MASTER ROUTINE, SET iflag < -10000 TO\nC PREVENT INITIALIZING LONGLIB OR CLOSING IT\nC SET iflag TO PRODUCE AXIS TICKED GRID (SINCE\nC LONGLIB OPEN, NO PROMPT FOR SCREEN DEVICE)\n       CALL PLOTSC(X,Y,N,-10004,...)\n       ...\nC LAST CALL TO MASTER ROUTINE, SET iflag > 10000 TO\nC PREVENT INITIALIZING LONGLIB AND CLOSE IT AFTER PLOTTING\nC SET iflag TO PRODUCE AXIS TICKED GRID AND LOG/LOG FORM\nC (SINCE LONGLIB OPEN, NO PROMPT FOR SCREEN DEVICE)\n       CALL PLOTLG(X,Y,N,10053,...)\n.end lit\n\n.HL2 MASTER Routine Color Example\n.x PLOTSC\n.p\nThe following is a very elaborate example of how to use color in a particular\nMASTER routine (PLOTSC).\n.tp16\n.s1\n.lit\nC DIMENSION AND LOAD COLOR ARRAY\n       DIMENSION ICOL(6)\n       DATA ICOL/1,2,3,4,5,6/\n       ...\nC CALL PLOTSC WITH NUMBER OF TITLE CHARACTERS NEGATIVE TO\nC USE COLOR ARRAY.  SET iflag TO INITIALIZE/CLOSE LONGLIB\nC SET iflag TO PRODUCE AXIS TICKED GRID\n        CALL PLOTSC(X,Y,25,4,8.,6.,'X AXIS',6,\n     1    'Y AXIS',6,'TITLE',-5,ICOL)\n       ...\n.end lit\n\n.PG\n.HL2 Using Multiple MASTER Plots on Same Page/Screen\n.x PLOTSC\n.p\nThe following is a very elaborate example of how to to place several\nMASTER routine plots on the same Ramtek and terminal screen but different\nmetafile pages.\n.tp16\n.s1\n.lit\nC OPEN LONGLIB OUTSIDE OF MASTER ROUTINE\nC SELECT BOTH TERMINAL AND RAMTEK SCREEN OUTPUT WITH NO\nC SCREEN CLEAR ON RAMTEK OR TERMINAL\n       CALL FRAME(3,-3,1.,1.,1.)\nC CHANGE COLOR AND ADD A SEPARATE PLOT TITLE\n       CALL PLOT(7.,0.,0)\n       CALL SYMBOL(6.,11.5,.3,'TITLE',0.,5,-1)\nC CHANGE ORIGIN AND SHRINK SUBSEQUENT PLOTS ON RAMTEK/TERMINAL\nC BUT NOT METAFILE\n       CALL PLOT(1.,1.,-3)\n       CALL VFACTOR(.5)\n       CALL RFACTOR(.5)\nC LOOP TO PLOT FOUR MASTER PLOTS ON ONE SCREEN\n       DO 10 I=1,4\nC CALL PLOTSC WITH iflag < 10000 TO NOT INITIALIZE\nC LONGLIB OR CLOSE IT AFTER PLOT\nC SET iflag TO PRODUCE AXIS TICKED GRID \nC (SINCE LONGLIB OPEN, NO PROMPT FOR SCREEN DEVICE)\n        CALL PLOTSC(X,Y,25,-10004,8.,6.,'X AXIS',6,\n     1    'Y AXIS',6,'TITLE',5)\nC MOVE ONLY RAMTEK AND TERMINAL ORIGINS BUT NOT METAFILE\n        CALL PLOTRM(0.,2.*5.,-3)\n        CALL PLOTVT(0.,2.*5.,-3)\n        IF (I.EQ.2) CALL PLOTRM(11.,-20.,-3)\n        IF (I.EQ.2) CALL PLOTVT(11.,-20.,-3)\nC NEWPAGE ON METAFILE (DOES NOT AFFECT TERMINAL/RAMTEK)\n        CALL NEWPAGE\n10     CONTINUE\n       ...\nC PROMPT FOR SCREEN CLEAR ON RAMTEK/TERMINAL\n       CALL CTERM(2)\n       CALL RTERM(2)\nC CLOSE LONGLIB\n       CALL PLOTND\n       ...\n.end lit\n\n\n.CHAPTER Description of Plotting Routines\n.p\nThis chapter details the central LONGLIB graphics library routines.\nA brief description of each routine is shown along with an example\nof its call and a description of the required parameters.\nOptional parameters are shown in <> brackets.\n.p\nThe name of each parameter is followed by a letter indicating\nthe variable type.  Unless otherwise specified, integers are the\ndefault integer length of the machine (which is ~INTEGER*4 on the VAX).\n.x byte\n.x integer\n.x real\n.x character\n.x logical\n.LIT\n\n     B = BYTE array string (see notes in section 1.2)\n     I = INTEGER \n     R = REAL\n     C = CHARACTER \n     L = LOGICAL\n\n.end lit\n\nNOTE: In ~VAX ~FORTRAN,\nwhen a subroutine is called with a Hollerith constant such\nas 'string', CALL SUB(... ,'string', ...),\nVAX FORTRAN passes the string as a\nBYTE array of ~ASCII values.  A CHARACTER variable can not be substituted.\nIf you wish to use a CHARACTER variable, use %REF() to convert the \nCHARACTER variable to a BYTE array, i.e.,\ncall SUB(..., %REF(CHARACTER_VARIABLE), ...).\n.x %REF()\n.p\nLengths are given in the standard plot units of inches.  The routine\n~FACTOR can be used to change the plot unit length.  Angles are specified\nin degrees counter-clockwise from the x axis.\n.p\nUnless specifically\nnoted all parameters passed into a routine via the call statement will\nbe used on a \"read-only\" basis, i.e., they will not be modified by the\nroutine.\n\n.hl1 SUBROUTINE ABSPLT\n.p\nThe routine ~ABSPLT changes the ABSOLUTE (versus relative as in PLOT)\nrotation angle and scale factor of the metafile, terminal, and ~ramtek\nplot routines to the values specified.  Normally, the routine ~PLOT should be\nused to change the origin, rotation angle, or scale factor.  This routine\nis provided for a skilled user to use in error recovery.  Note, however,\nthat no error checking is provided in ABSPLT.\n.lit\n\nCALL ABSPLT (x,y,a,z)\n\nx,y  (R): coordinates of new absolute origin (in inches)\na    (R): new absolute angle CCW from horizontal in degrees\nz    (R): new absolute scale factor\n.end lit\n\n.hl1 SUBROUTINE ARROW\n.p\n~ARROW plots a vector arrow at any desired point and with any desired\nangle.  The type of arrowhead drawn may be selected.\n.lit\n\nCALL ARROW (x,y,al,a,p,b)\n\nx,y  (R): location coordinates for vector-arrow tail\nal   (R): length of arrow in plot units\n          if al=0, only a single point at (x,y) is output\na    (R): angle from horizontal at which the arrow is to be drawn\n          (deg counterclockwise)\np    (R): length of arrowhead in plot units\n          > 0 open arrowhead    ( --> )\n          = 0 no arrowhead\n          < 0 closed arrowhead  ( -|> )\nb    (R): angle between arrowhead side and arrow line (deg)\n.end lit\n\n.hl 1  SUBROUTINE AXIS\n.p\n~AXIS plots a single coordinate axis with numeric labels at any desired \nlocation and angle.  The routine has to be\ncalled separately for the x and y axis.  A possible exponent\nis determined and placed at the end of the axis title in the form\nof 10**n.  In  order  to  leave room  for the labelling the\naxis should be removed at least by 3/4 inch from the edge of the plotter page.\nThe length of the axis should be integer-valued.  The (i)th (i=0 to ml-1)\naxis major tick is labeled with the value, xm+dx*i.\nFor a log axis see LGAXS.\n.lit\n\nCALL AXIS (x,y,s,n,al,a,xm,dx<,nm,ml<,ic>>)\n\nx,y  (R): location of starting point of the axis\ns    (B): alpha string containing the axis title\nn    (I): number of characters in the string s\n          > 0 : axis labelling on positive side (anti-clockwise)\n          < 0 : axis labelling on negative side (clockwise)\n (100's digit)    = 0 : coordinate line, ticks and labels drawn\n                  = 1 : line and ticks only--no labeling\n (1000's digit)   = 0 : numeric labels paralel to axis line\n                  = 1 : numeric labels orthogonal to axis line\n (10000's digit)  = 0 : additional optional parameters ignored\n                  = 1 : additional optional parameters used\n (100000's digit) = 0 : color list ignored\n                  = 1 : color list used\nal   (R): length of axis in plot units (real number, integer-valued)\n          > 0 : tick marks placed on same side of axis as title\n          = 0 : no action (return with no plotting)\n          < 0 : tick marks placed on opposite side of axis from title\na    (R): angle at which the coordinate axis is to be drawn\nxm   (R): value of first marking on the axis\ndx   (R): increment for numeric axis labels\n(NOTE: the following optional parameters are needed only if\n the magnitude of n is > 10000)\nmn   (I): minor tick marks between labeled major ticks\n           if not specified, 0 is used\nml   (I): number of labeled major tick marks\n           if not specified, int(l) is used\nic   (I): array of color values, if color not enabled,\n           current color is unchanged\n          ic(1) : color value for axis line and ticks\n          ic(2) : color value for numbers on axis\n          ic(3) : color value for axis label \n                  (color upon return if no exponent plotted)\n          ic(4) : color for auto exponent scale\n                  (color upon return if exponent shown)\n.end lit\n\n.hl1  SUBROUTINE AXIS2\n.p\n~AXIS2 is similar to AXIS but allows additional flexibility to draw\ndifferent tick sizes and types.\nOptionally, a possible exponent\nis determined and placed at the end of the axis title in the form\nof 10**n.  In  order  to  leave room  for the labelling the\naxis should be removed at least by 3/4 inch from the edge of the plotter page.\nThe length of the axis should be integer-valued.  The (i)th (i=0 to ml-1)\naxis major tick is labeled with the value, xm+dx*i.\nAXIS2 plots a coordinate axis and its markings at any desired location \nand angle.\nFor a log axis see LGAXS.\n.lit\n\nCALL AXIS2 (x,y,s,n,al,a,xm,dx<,nm,nn,ml,ts,nd,sm<,ic>>)\n\nx,y  (R): location of starting point of the axis\ns    (B): alpha string containing the axis title\nn    (I): number of characters in the string\n          > 0 : axis labelling on positive side (anti-clockwise)\n          < 0 : axis labelling on negative side (clockwise)\n (100's digit)    = 0 : coordinate line, ticks and labels drawn\n                  = 1 : line and ticks only--no labeling\n (1000's digit)   = 0 : numeric labels paralel to axis line\n                  = 1 : numeric labels orthogonal to axis line\n (10000's digit)  = 0 : optional parameters ignored\n                  = 1 : optional parameters used\n (100000's digit) = 0 : color list ignored\n                  = 1 : color list used\nal   (R): length of axis in plot units (real number, integer-valued)\n          > 0 : tick marks placed on same side of axis as title\n          = 0 : no action (return with no plotting)\n          < 0 : tick marks placed on opposite side of axis from title\na    (R): angle at which the axis is to be drawn\nxm   (R): value of first marking on the axis\ndx   (R): increment for the axis markings\n(NOTE: the following optional paramters are needed only if\n      the magnitude of n is > 10000)\nnm   (I): number of minor tick marks between major ticks,\n           if not specified, 0 is used\nnn   (I): nn-th minor tick is high-lited in length, if\n           not specified, 0 is used (none)\nml   (I): number of labeled major tick marks, if not specified\n           then one major tick per inch is used\n          < 0 use following additional optional parameters used\n          > 0 use following additional parameters ignored\n(NOTE: the following optional paramters are needed only if\n      the magnitude of n is > 10000 and ml < 0)\nts   (R): character size of title and numbers, if not\n           specified, 0.15 is used\n          > 0 auto exponent scaling (x10 to power) is enabled\n          < 0 auto exponent scaling (x10 to power) disabled\nnd   (I): number of digits to right of decimal point, if not\n          specified 1 is used\nsm   (R): major tick length, if not specified 0.1 is used\n          note that minor tick length is 1/2 major tick length\nic   (I): array of color indexes for axis colors\n          ic(1) : color value for axis line and ticks\n          ic(2) : color value for numbers on axis\n          ic(3) : color value for axis label \n                  (color upon return if no exponent plotted)\n          ic(4) : color for auto exponent scale\n                  (color upon return if exponent shown)\n.end lit\n\n.hl 1  SUBROUTINE AXIS3\n.p\n~AXIS3 plots a single axis and its markings at any desired location and\nangle.  Optionally, a possible exponent\nis determined and placed at the end of the axis title in the form\nof 10**n.  The length of the axis can take any value.  The (i)th (i=0 to ml-1)\naxis major tick is labeled with the value, xm+i*(xx-xm)/le.\nThis version of axis is more flexible than other versions\nand permits specifying the axis number labeling format.\nFor a log axis see LGAXS.\n.lit\n\nCALL AXIS3 (x,y,s,n,al,a,xm,xx,t,c,f,ic)\n\nx,y  (R): starting location of the axis\ns    (B): alpha string containing the axis title\nn    (I): number of characters in the string\n          > 0 : axis labelling on positive side (anti-clockwise)\n          < 0 : axis labelling on negative side (clockwise)\n (100's digit)    = 0 : coordinate line, ticks and labels drawn\n                  = 1 : line and ticks only--no labeling\n (1000's digit)   = 0 : numeric labels paralel to axis line\n                  = 1 : numeric labels orthogonal to axis line\n (100000's digit) = 0 : color list ignored\n                  = 1 : color list used\nal   (R): length of axis \n          > 0 : tick marks placed on same side of axis as title\n          = 0 : no action\n          < 0 : tick marks placed on opposite side of axis from title\na    (R): angle at which the axis is to be drawn \nxm   (R): value of first marking on the axis\nxx   (R): value of last marking on the axis\nt    (R): number of tick marks \n          specification is coded in the form MMM.mmss where\n          MMM is the number of major tick marks ( MMM > 0), mm is\n          the number of minor tick marks between major tick marks\n          (100 > mm => 0), and ss is the number of subminor tick\n          marks between minor tick marks (100 > ss => 0).\n          (example 1.0102 produces I_._._i_._._I)\nc    (R): size of characters \n          < 0 auto exponent scaling (x10 to power) disabled\n          > 0 auto exponent scaling (x10 to power) enabled\nf    (R): axis number label format (see NUMBER)\n          Note: if an integer -1 is passed in place of f, AXIS3\n          will used f=1003.00 if autoscaling is enabled.  If an\n          integer 0<n<13 is passed in place of f, AXIS3 will use\n          f=2+n*1.01 if autoscaling is enabled.  \nic   (I): array of color indexes for axis colors\n          ic(1) : color value for axis line and ticks\n                  (color upon return if no labels)\n          ic(2) : color value for numbers on axis\n          ic(3) : color value for axis label \n                  (color upon return if no exponent plotted)\n          ic(4) : color for auto exponent scale\n                  (color upon return if exponent shown)\n.end lit\n\n.hl 1  SUBROUTINE CIRCLE\n.p\n~CIRCLE plots circles, arcs and spirals.  The curve is approximated by small\nstraight lines.  The radius of the curve determines the number of line\nsegments used.  A solid circle of radius 2.0 centered at the origin could\nbe generated by the call,\n.lit\n\nCALL CIRCLE(0.0,0.0,0.0,360.0,2.0,2.0,0.0).\n\n.end lit\nwhile a spiral centered at (1,1) would be created by the call,\n.lit\n\nCALL CIRCLE(1.0,1.0,90.0,800.0,3.0,1.0,0.0).\n.end lit\n.lit\n\nCALL CIRCLE (x,y,aa,ao,ra,ro,d)\n\nx,y  (R): coordinates for the center of the circle\naa   (R): angle in degrees of starting point of curve\nao   (R): angle of end point relative to start point\nra   (R): curve radius at starting point\nro   (R): curve radius at the end point\nd    (R): =  0 : solid curve\n          = .5 : dashed curve (software line type)\n.end lit\n\n\n.hl1 SUBROUTINE CSHADE\n.p\nThe ~CSHADE subroutine fills in an ~area defined by a segment of a circle\nusing equally spaced lines at a given angle with a \nspecified line type.  A full circle may be used.\n.lit\n\nCALL CSHADE (x,y,r,a1,a2,s,l,d,t,w,m1,m2)\n\nx,y   (R): location of circle center\nr     (R): segment or circle radius\na1,a2 (R): segment start and stop angles (a2>=a1)\n            if a2-a1=360 a full circle is used otherwise\n            the area is a pie segment\nl     (I): shade format control\n           = -3 : clear area and outline\n           = -2 : clear area\n           = -1 : clear outline\n           =  0 : no action\n           =  1 : draw outline\n           =  2 : shade area\n           =  3 : shade area and outline\nd     (R): distance between shading lines\nt     (R): angle of shading lines in degrees\nw     (R): working array dimensioned at least 3*n where\n            n=int((a2-a1)/(180*atan(s/r)/pi)+1)\nm1    (R): line type of shading\n            < 0 : shading done with current line type\n           => 0 : new line type (see NEWPEN)\nm2    (R): line type for area outline\n            < 0 : use prior line type\n           => 0 : new line type (see NEWPEN)\n.end lit\n\n.hl1  SUBROUTINE CTERM\n.p\n~CTERM is the central subroutine for controling the state of the graphics\nterminal.  It is used to switch a graphics terminal\nin and out of the graphics and text modes. It is a dummy call when not in\n~terminal plotting mode.  Note that not all options are available on all\nterminals.  Results of operation of this routine is thus terminal dependent.\nIn some cases the graphics and text modes are the same while in others,\nthe mode is switched only at init/de-init.\nSee the introduction to the documentation under terminal types.\n.p\nNote:  for CTERM(2), the user will be prompted for a \"clear screen\".\nThe reply may be \"Y\" for yes, \"N\" for no (the default), \"Q\" (quit), \n\"S\" (skip one), \"P\" (pass many), or \"D\" (dump).  \"Y\" and \"N\" clear\nthe screen as indicated and the program continues normally.\nA reply of \"Q\" permanently disables terminal screen plotting until\nthe package is reinitialized by FRAME.  A replot of \"S\" disables\nscreen plotting until the next CTERM(2) call whereupon the \n\"clear screen\" prompt reappears as before.  A reply of \"P\" is similar\nto \"S\", but the user will be prompted for the number of ~CTERM(2) calls\nto pass before reissuing the prompt.  In this manner multiple terminal\nscreen \"pages\" can be skipped.  A reply of \"D\" will enable a dump\nof the screen to the attached terminal printer (if supported on the\nparticular terminal/printer).  Note that during a skip that any changes\nof origin by PLOT, scale factors by FACTOR or VFACTOR, or pen color\nor linetype will NOT take place.\n.lit\n\nCALL CTERM (iarg)\n\niarg (I): terminal operation code\n          = 0 : initialize graphics mode on terminal\n          = 1 : return terminal from graphics to text mode\n          =-1 : return terminal text to graphics mode\n          = 2 : return terminal to text mode, and prompt\n                user for clear screen (see note above)\n          =-2 : return terminal to text mode, clear graphics screen\n          = 3 : clear text screen, leave in text mode\n          =-3 : clear graphics screen, leave in terminal mode\n          = 4 : dump graphics screen to printer\n          =-4 : clear text, graphics, leave in graphics mode\n          = 5 : turn off graphics screen, return to text mode\n          =-5 : turn on graphics screen, return to graphics mode\n          = 6 : toggle reverse video\n          = 8 : de-initialize graphics terminal\n.end lit\n\n.hl 1 SUBROUTINE DASHL \n.p\n.x software line type\n.x line type\n~DASHL plots a software-generated dashed  ~line through the coordinate points\nstored in x and y.  See also LINE.\n.lit\n\nCALL DASHL (x,y,n,k,j,l,ix,iy,xm,dx,ym,dy)\n\nParameter list description same as LINE.\n.end lit\n\n.hl  SUBROUTINE ELLIPSE\n.p\n~ELLIPSE will plot all or part of a parametric ellipse of the form,\n.lit\n\n        (x,y) = (maj*cos(t), min*sin(t))\n\n.end lit\nwhere maj and min are the major and minor ellipse axes, respectively\nand where t is the parametric angle specification.  Part of the ellipse\ncan be plotted by specifying only part of the range of t.\nThe major axis center line is offset by the angle am.\nThe angles ast and aend define the starting and ending\nangles for t.  Note that aend should be greater than ast.\nThe ellipse is approximated by short, straight line segments.  The number\nand length of the segments depend on the size of the ellipse.\n.lit\n\nCALL ELLIPSE (x,y,maj,min,am,ast,aend)\n\nx,y  (R): center of ellipse (halfway between foci)\nmaj  (R): length of semi-major axis (distance between center and\n          curve through one focus)\nmin  (R): length of minor axis (distance between center and\n          curve perpendicular to semi-major axis)\nam   (R): angle of semi-major axis from horizontal\n          (deg counter-clockwise)\nast  (R): start angle of curve from semi-major axis\n          (deg counter-clockwise)\naend (R): end angle of curve from semi-major axis\n          (deg counter-clockwise) note: aend > ast\n.end lit\n\n.hl  SUBROUTINE FACTOR\n.p\nPositional information is usually expressed in inches.  A conversion ~factor\ncan be given for other units, such as \"cm\". The new coordinate values are\nderived from the product \"fac*x\" where x is the input value.\nA negative value or zero resets the\nscaling factor to unity.  Note that the initial factor can be specified\nin FRAME.  The subroutine ~FACTOR calls PFACTOR, RFACTOR, and VFACTOR which\nchange the scale factors for the metafile, Ramtek, and terminal\npackages, respectively.  These routines can be called separately to \naffect only the scale factor of the particular package.\n.x FRAME\n.x PFACTOR\n.x RFACTOR\n.x VFACTOR\n.lit\n\nCALL FACTOR (fac)\n\nfac (R): new conversion factor for coordinate values (all packages)\n         <= 0 : scale factor reset to unity\n         >  0 : new scale factor\n.end lit\n\n.hl  SUBROUTINE FRAME\n.p\n.x Selanar\n.x vt100\n.x vt125\n.x vt240\n.x vt220\n.x Tektronix 4010/4014\n.x Tektronix 4107/4109\n~FRAME initializes the graphics metafile/terminal/Ramtek software  and\nresets internal  variables.  This routine is usually the first LONGLIB\nroutine called (also see ~PLOTS which calls FRAME).  FRAME must be activated\nbefore plotting calls are issued by the user program.  FRAME should\nnormally be called only once in a program.  MASTER routines optionally\nhandle the FRAME call.\n.p\nFRAME intializes the graphics output device packages.  The FORTRAN\nunit number used for the LONGLIB metafile can be specified.  Normally,\nunit 3 is used.  If unit 0 is specified, FRAME will prompt the user\nfor a yes/no response to create a metafile.  A negative unit number\ndisables the metafile package.  All calls to metafile routines (such\nas PPLOT) are dummy calls when the metafile package is disabled.\n.p\nFRAME also initializes the screen graphics device.  A screen device\ncode is used to determine whether the Ramtek or Terminal screen device\npackages are open.  If a negative value for the screen device code\nis used the screen device is not cleared prior to use, otherwise it is.\nIf the screen device code is +/- 4, no screen device package is used and\nall calls to screen\nspecific routines (such as PLOTRM or PLOTVT) are dummy calls.\nIf a screen device code of 0 is used, the user is prompted for \na screen device to use.  The screen devices may then be selected using\na character code.\nA reply of \"?\" will list the available options.\n.p\nFRAME also intializes the origin and scale factor for plotting.\nThe default origin on the ~terminal and the ~Ramtek is the lower\nleft of screen (0.,0.).  The\nX axis runs horzontally, while the Y axis runs vertically.  The\ndefault origin on the printer is the upper left corner of page.\nThe X axis runs vertically down page, while the Y axis runs\nhorizontally across the page.\n.p\nWhen the ~Ramtek Screen device is selected, FRAME opens a\ncommunications channel to the Ramtek.\nIf no channel is available or the Ramtek is in use an\nerror message is typed and the calling program is terminated.\n.lit\n\nCALL FRAME (pl,id,vpx,vpy,zom)\n\npl   (I): Fortran file unit number (normally 3) used for LONGLIB\n          Metafile.  If pl < 0 then no metafile is generated.\n          If pl = 0 then the user will be prompted for a yes/no\n          metafile.  In this case unit number used will be 3.\nid   (I): Screen device code number.\n          < 0 : Do not clear Ramtek/terminal screens prior to use.\n          > 0 : Clear Ramtek/terminal screens prior to use.\n          = 0 : Prompts user for which screen device to use.\n                A ? response will list the available devices.\n          = 1 : Use VT100 as Screen Output (only) (Selanar GR100)\n          = 2 : Use Ramtek as Screen Output (only).\n          = 3 : Use both Ramtek and VT100 as Screen Output.\n          = 4 : Do not produce Screen output.\n          = 5 : Use VT125 as Screen Output (only)\n          = 6 : Use VT100 as Screen Output (only) (Selanar GR100)\n          = 8 : Use VT240 as Screen Output (only)\n          = 9 : Use VT220 as Screen Output (only) (Selanar SG220)\n          =10 : Use Tektronix 4010/4014 as Screen Output\n          =11 : Use Tektronix 4107/4109 as Screen Output\n                (color Tektronix)\n          =12 : Use Graph-On GO-235 as Screen Output\nvpx, (R): relative x,y offset of the bottom left hand corner of\nvpy       the screen/page.  Equivalent to PLOT(vpx,vpy,-3).\nzom  (R): The value of 'zom' scale factor. (see FACTOR)\n.end lit\n\n.hl 1  SUBROUTINE GRID\n.x LGRID\n.p\n~GRID plots a ~Cartesian grid or solid lines or ticks at\ngrid intersections.  See also LGRID.\n.lit\n\nCALL GRID (x,y,dx,dy,nx,ny)\n\nx,y   (R): coordinates in the bottom left corner of grid\ndx,dy (R): spacing of grid lines in x and y directions\nnx,ny (I): number of grids in x and y direction\n           if nx > 0 and ny > 0 then solid grid plotted\n           if nx < 0  or ny < 0 then tick grid plotted\n           if nx < 0 and ny < 0 then boxed tick grid plotted\n.end lit\n\n.hl1 SUBROUTINE HLT3D\n.p\n.x PLT3D\n.x 2-d surface plotting\n~HLT3D plots a 2 dimensional array to produce a 2-d histogram similar\nto PLT3D.  Hidden lines are supressed.\nTransformation from the array indices (i,j) to (x,y,z) is:\n.lit\n\n    x = xl * .5 * float(2*j-n-1)/float(n-1)\n    y = yl * .5 * float(2*i-m-1)/float(m-1)\n    z = zs * (a(i,j) + z0)\n\nThus,\n\n    (1,1) is (-xl/2,-yl/2)   (m,1) is (-xl/2,+yl/2)\n    (1,n) is (+xl/2,-yl/2)   (m,n) is (+xl/2,+yl/2)\n\n    xplotted = x*cos(az) - y*sin(az) + x0\n    yplotted = x*sin(az)*sin(al) + y*sin(az)*sin(al) + z*cos(al) + y0\n.end lit\n.p\nThe common block ~PLT3B returns these ~transformation parameters so\nthat the plotted location (xp,yp) of the corner of the cube corresponding\nto the point (i,j,zr) may be computed as:\n.lit\n\n        xp = a1 * j + a2 * i + a3\n        yp = b1 * j + b2 * i + b3 * zr + b4\n.end lit\n.p\nThe dimension of the working array is dependent on the\nsurface complexity -- the greater the surface complexity, the greater\nl2 must be.  As a minimum, l2 > 4*min(m,n).  See also ~NXTVU and PLT3D.\n.x PLT3D\n.lit\n\nCALL HLT3D (a,md,nd,m,n,w,l,w2,l2,al,az,xl,x0,yl,y0,zs,z0,ierr)\n\na     (R): array of values to be plotted dimensioned a(md,nd)\nmd,nd (I): array dimensions\nm,n   (I): size of data in array to be plotted\nw     (R): dummy variable so that call is compatible with PLT3D\nl     (I): dummy variable so that call is compatible with PLT3D\nw2    (R): working storage array dimensioned w2(l2)\nl2    (I): working storage array dimension (see note)\nal    (R): viewing altitude angle (deg)\naz    (R): viewing azimuth angle (deg)\nxl,yl (R): length of unprojected axes in plot units\nx0,y0 (R): plot origin in plot units\nzs    (R): z coordinate scale factor\nz0    (R): z coordinate offset\nierr  (I): (returned) error code\n           = 0 : ok\n           = 1 : l2 not large enough in NXTVU\n\nCOMMON /PLT3B/ a1,a2,a3,b1,b2,b3,b4\n.end lit\n\n.hl 1 SUBROUTINE HELPME\n.p\n~HELPME calls the ~VAX ~VMS interactive ~help utility for the LONGLIB help\nlibrary with an initial help request string.  The librarian is interactive\nso that the user is prompted for additional input until a control-Z\nis typed at which point control is returned to the calling program.\n.lit\n\nCALL HELPME(s)\n\ns     (C): initial help request string\n.end lit\n\n.hl 1  SUBROUTINE JPLTAG\n.p\n~JPLTAG plots the JPL logo (JPL).  Optionally, it can produce only a line\noutline or fill the outline with a line pattern using SHADE.\n.lit\n\nCALL JPLTAG (x,y,h,a,i,d,m,sa,w)\n\nx,y   (R): coordinates of the lower left corner of the initial j\nh     (R): letter height in plot units\na     (R): angle of baseline relative to horizontal\ni     (I): option flag\n  (1's digit)  = 0 no action\n               = 1 draw outline only\n               = 2 draw shading only\n               = 3 shade area and draw outline\n  (10's digit) = pen color (if = 0, pen color is not changed)\nd     (R): distance between shading lines\nm     (I): shading line type\n           =>  0 line type (see NEWPEN)\nsa    (R): angle of shading lines\nw     (R): working array dimensioned at least w(56+54*H)\n.end lit\n\n.hl 1 SUBROUTINE  LGAXS\n.p\n~LGAXS plots a single ~logarithmic coordinate ~axis.  Complete\ndecades are produced.  See also ~AXIS and LGLIN.\n.x LGLIN\n.lit\n\nCALL LGAXS (x,y,s,n,al,a,nmin,dx<,ic>)\n\nx,y   (R): location starting point of the axis\ns     (B): axis label string\nn     (I): number of characters in string\n           > 0 :  label on positive side\n           < 0 :  label on negative side\n (100's digit)   = 0 : coordinate line, ticks and labels drawn\n                 = 1 : line and ticks only--no labeling\n (1000's digit)  = 0 : numeric labels paralel to axis line\n                 = 1 : numeric labels orthogonal to axis line\n (10000's digit) = 0 : color list ignored\n                 = 1 : color list used\nal    (R): length of axis\n           > 0 : axis ticks placed on same side of axis as title\n           = 0 : no action (return with no plotting)\n           < 0 : ticks placed on opposite side of axis from title\na     (R): angle at which the axis should be plotted\nnmin  (R): number to be printed at the first axis tick (power of ten)\ndx    (R): scaling factor in the form dx=(nmax-nmin)/l where\n           nmax, nmin are the exponent powers at the start\n           and end of the axis\nic    (I): color array (required if mag(n)>10000))\n           ic(1) : color for axis line and ticks\n           ic(2) : color for numbers\n           ic(3) : color for axis title\n.end lit\n\n.hl 1  SUBROUTINE LGLIN\n.x LINE\n.p\n~LGLIN plots a solid curve through a set of values from x to y.\nEither x or y or both may in the process be converted to\n~logarithmic form.  Symbols may be used at selected intervals.\n(see also ~SCALG and LINE).  The plotted x values are computed according to,\n.lit\n\n    for logarithmic scaling,\n\n       xplotted= (alog10(abs(x(i))+1.e-38)-xm)/dx\n\n    for linear scaling,\n\n       xplotted= (x(i)-xm)/dx\n\n.end lit\nand similarily for y.\n.lit\n\nCALL LGLIN (x,y,n,k,j,l,lg,ix,iy,xm,dx,ym,dy)\n\nx     (R): array containing the x coordinates\ny     (R): array containing the y coordinates\nn     (I): number of data points in x and y\n           (the number of data points in x,y must be equal)\nk     (I): take every first (k=1), second (k=2) value etc.\n           (normally k=1)\nj     (I): plotting symbol spacing flag\n           > 0 : symbol is plotted at every jth plotted point\n                 connected by lines\n           = 0 : no symbols, lines only\n           < 0 : symbol is plotted at every abs(j)th plotted point\n                 with no connecting lines\nl     (I): plot symbol number (see SYMBOL)\nlg    (I): log option\n           = - 2 : x and y are plotted using logarithmic scaling\n           = - 1 : x logarithmic, y linear\n           =   1 : x linear, y logarithmic\nix,iy (I): start index if arrays (normally ix,iy=1)\nxm    (R): minimum value scale factor for x array\ndx    (R): increment scale factors for x array\nym    (R): minimum value scale factor for y array\ndy    (R): increment scale factors for y array\n.end lit\n\n.hl1 SUBROUTINE  LGRID\n.p\n~LGRID plots a ~logarithmic or linear ~grid using solid lines,\ndotted lines, or ticks.  See also GRID.\n.lit\n\nCALL LGRID (x,y,dx,dy,nx,ny,i)\n\nx,y   (R): location coordinates for the bottom-left corner of grid\ndx,dy (R): spacing of major grid lines in x and y directions\nnx    (I): number of major grid lines in x direction\n           < 0 : log spacing of minor lines\n           > 0 : no minor lines/ticks\nny    (I): number of major grid lines in y direction\n           < 0 : log spacing of minor lines\n           > 0 : no minor lines/ticks\ni     (I): option flag\n           = 0 : solid major/minor lines\n           = 1 : dotted major/minor lines\n           = 2 : solid major lines with minor ticks\n.end lit\n\n.hl1  SUBROUTINE LINE\n.p\n~LINE plots a solid curve through a set of coordinate pairs\nstored in two arrays. Symbols may be inserted at selected\nintervals and points of curves may be skipped.\nThe coordinates are calculated as follows:\n.lit\n\n        xplotted(i)=(x(i)-xm)/dx, i=ix to n, step k\n        yplotted(m)=(y(m)-ym)/dy, m=iy to n, step k\n\n.end lit\nThe routine ~SCALE may be used to compute the scale factors xm, dx,\nym, and dy from the x and y arrays.\n.lit\n\nCALL LINE (x,y,n,k,j,l,ix,iy,xm,dx,ym,dy)\n\nx     (R): array containing the x coordinates\ny     (R): array containing the y coordinates\nn     (I): number of data points in x and y\n           (the number of data points in x, y should be equal)\nk     (I): plot every first (k=1), second (k=2) value etc\n           (normally k=1)\nj     (I): plotting symbol spacing flag\n           > 0 : symbol is plotted at every jth plotted point\n                 connected by lines\n           = 0 : no symbols, lines only\n           < 0 : symbol is plotted at every abs(j)th plotted point\n                 with no connecting lines\nl     (I): plot symbol number (see SYMBOL)\nix,iy (I): starting indexs in array (normally ix,iy=1)\nxm    (R): minimum value scale factor for x array\ndx    (R): increment scale factors for x array\nym    (R): minimum value scale factor for y array\ndy    (R): increment scale factors for y array\n.end lit\n\n.hl1 SUBROUTINE  LINSEQ\n.x line type\n.x software line type\n.p\n~LINSEQ plots line curves using software generated line types.\nCubic spline interpolation is used in the generation of the specified\nlong dash/short dash sequence.  The cubic spline \"smoothing\" prior\nto plotting may also be specified.  Closed curves and loops are permitted.\nA word of caution: due to the limitations of cubic splines, the\nplotted curve may not exactly represent the underlying function.\nThe code used by this routine is an adaptation of the ~COSMIC routine\nLAR-11123.\n.p\nLINSEQ can be used to plot the same curve at different locations\nby first calling LINSEQ with the desired data, then calling LINSEQ\nagain with n set to zero and h changed.\n.lit\n\nCALL LINSEQ (x,y,z,n,ns,h,s,l1,l2,l3,l4,l5)\n\nx     (R): array containing the x coordinates\ny     (R): array containing the y coordinates\nz     (R): working array dimensioned at least z(3*n+3)\nn     (I): number of points in x,y arrays\n             if n=0 then arc parameters from the last \n             call to LINESEQ are used again\n             (used to replot the same curve at different location)\nns    (I): number of smoothing passes (normally 0)\nh     (R): x axis plotting offset (normally 0).  Setting h <> 0\n             and n=0 permits replotting last curve, shifted right\n             the specifed amount.\ns     (R): approximate interval between interpolated points on\n             curve.  Actual interval is internally computed.\n             If s<0 pre-interpolation to 2*n-1 points is done.\nl1-l5 (I): dash pattern control flags\n            l1 = Number of INTERVALS BETWEEN dashes\n            l2 = Number of LONG dashes per CYCLE\n            l3 = Number of INTERVALS per LONG dash\n            l4 = Number of SHORT dashes per CYCLE\n            l5 = Number of INTERVALS per SHORT dash\nNote: if l1=0, l2-l5 are ignored and a solid curve is drawn\n      if l4=0, l5 is ignored. All dashes same length.\n.end lit\n\n.hl  SUBROUTINE NEWPAGE\n.p\n.x form feed\n.x page\n~NEWPAGE inserts a change page command into the LONGLIB metafile.  The\nhardcopy conversion program use the change page command to issue a form\nfeed to the metafile output.  Note that NEWPAGE only affects the metafile page\nand does not change origin, etc.\nIt is a dummy call for ~Ramtek or ~terminal plotting.  This command is\nequivalent to CALL PLOT(0.,0.,10).\n.lit\n\nCALL NEWPAGE\n      (no arguments)\n.end lit\n\n.hl1 SUBROUTINE NEWPEN\n.p\n.x line type\n.x ppen\n.x rmpen\n.x vpen\n~NEWPEN calls PPEN, RMPEN, and VPEN which \nchange the hardware line type and/or width of the plotting\nline for subsequent plotting on the metafile, Ramtek, and terminal\noutput devices.\nThe precise effects depend on the particular graphics device.  There are\n10 standard line types which are shown in the last chapter.  The output device\nwill use the nearest hardware-supported line type to the standard line\ntype.  Some\ndevices support additional types including permitting a specification\nof the scale factor of the line type (the length of the dot/dash pattern).\nIf a device does not support line types, the default type is used.\nLine widths are not support on the Ramtek packages and are simulated\nin softwared for the terminal.  The metafile package supports all features\nalthough the metafile processing programs may only use the\nfeatures supported by the particular hardcopy graphics output device.\nDefault line type is a solid line of width 1 dot.\n.lit\n\nCALL NEWPEN (i)\n\ni  (I): selects a line type for all additional plotting\n        for all output devices\n        < 0 : resets line type to solid line of unit width.\n        = 0 : line type 0 no change in line width\n        > 0 : line type and width changed according to,\n (1's digit)   : line type (0-9)\n (10's digit)  : line width (1-7) (value of 0 does not change width)\n (100's digit) : line type pattern scaling (1-7) (0 is no change)\n.end lit\n\n.hl1 SUBROUTINE NUMBER\n.p\n~NUMBER plots a floating point number in a specified format using\na fortran format-like specification.  It also permits\nfree-format and exponential notation formats.  The number is converted\nto an ~ASCII string plotted at a specified location and baseline angle\nusing SYMBOL.  The following table illustrates the dependence of the output\nstring on the type (integer/real) and value of the parameter e.  The table\nshows the output for an input f=103.356 and i=-1.\n.tp 17\n.lit\n\n         Output    integer e   real e\n        --------   ---------- --------\n         103          -1       1003.0\n         103.          0        0.0\n         103.          0        3.00\n         x103.36                7.02\n         103.36        2        0.02\n         103.356000    6       10.06\n         xx103                 1005.0\n         **                    1002.0 (format overflow)\n         x103.4                 6.01\n         *.****                 6.04  (format overflow)\n         .103E+02              -8.03\n         *.***                 -5.03  (format overflow)\n\nnote: x=space, * indicates overflow\n.end lit\n\n.lit\n\nCALL NUMBER (x,y,h,f,a,e,i)\n\nx,y   (R): location position (x,y returned if i=-2 or -3)\n           If x=999 then x is continued from lower right of\n           prior call to SYMBOL or NUMBER.  If y=999 then\n           y is continued.\nh     (R): size (height) of digits \nf     (R): floating point number to be plotted\na     (R): baseline angle at which to plot \ne     (R): output format (e=n.j) \n           (similar to format statement Fn.j)\n           n is the total number of characters (max 18) \n           including the decimal point and j is a two digit number\n           specifying the number of digits to the right of \n           the decimal point (to get F6.4 use e=6.04)\n             if e < 0 number is plotted in exponential notation.\n             if e = 0 then number is output in free format\n             if n = 0 then number is output in free format\n                      integer with no decimal point shown\n             The number will be shown as an m digit integer\n             if using e=1000+m.\nNOTE for VAX usage: if an integer in the range (-1 to 12) is passed\n           for e, NUMBER detects and uses the integer value\n           to specify a free-format specifying\n           the number of digits to the right of the decimal point.\n           a -1 inhibits decimal point\ni     (I): centering flag (see SYMBOL)\n           = -3 : same as -2 but string is not plotted and\n                  last position is not affected\n           = -2 : same as -1 but returns end point in x,y\n           = -1 : (x,y) is lower left corner of plotted array\n           =  0 : (x,y) is center of plotted array\n           =  1 : (x,y) is lower right corner of plotted array\n           =  2 : no action\n.end lit\n\n.hl  SUBROUTINE PFACTOR\n.p\n~PFACTOR is called by ~FACTOR to change the input scale conversion factor\nfor the LONGLIB metafile package.  It may be called separately if desired.\nOnly the metafile plotting package\nis affected.  The routines ~RFACTOR and ~VFACTOR may be separately \ncalled to change the input scale conversion factor on the Ramtek and\nterminal packages, respectively.  See FACTOR.\n.lit\n\nCALL PFACTOR (fac)\n\nfac (R): new conversion factor for coordinate values\n         (only the metafile scaling is affected)\n         <= 0 : scale factor reset to unity\n         >  0 : new scale factor\n.end lit\n\n.hl1  SUBROUTINE PLOT\n.x view port\n.x origin\n.x plotting window\n.x PLOTRM\n.x PPLOT\n.x PLOTVT\n.p\n~PLOT is the central routine for controlling the motion of the electronic\npen for all LONGLIB graphics device packages.  \nPLOT calls the Ramtek, metafile and terminal PLOT routines PLOTRM, PPLOT, PLOTVT\nbased on the graphics devices initialized by FRAME.   These individual\n\"package PLOT\" routines can be called separately if desired to affect\nonly the particular package.  Via these package-specific plot routines\nPLOT can moves the pen, change the origin or\npen color, issue a page change command, etc.  \nA relative rotation angle for all successive plotting may also be specified.\nLONGLIB defines a\nplotting ~window or viewport, the size of which is device dependent, within\nwhich pen motions are clipped.  The viewport may be set to an arbitrary\nsize within the device plotting window (e.g. terminal screen).  An attempt to\nmake the viewport bigger than the device output will force the viewport\nto be the device output window (this is the default).  \n.lit\n\nCALL PLOT (x,y,i)\n\nx,y   (R): coordinate values\ni     (I): plot function parameter\n           =  0: color control\n                  x is the new line color\n                  if x < 0 the screen is cleared\n                  if x >= 0 then plotting angle becomes y\n           =  2: draw to (x,y) with 'pen down'\n           = -2: same as i=2. (x,y) becomes new origin\n           =  3: move to (x,y) with 'pen up'\n           = -3: same as i=3. (x,y) becomes new origin\n           =  4: upper right corner of viewport set to (x,y)\n           = -4: lower left corner of viewport set to (x,y)\n           =  5: pick pen up at last point\n           =  9: erase to (x,y) (plot with color 0)\n           = -9: erase to (x,y) (x,y) becomes new origin\n           = 10: issue change page command to metafile\n           = 11: end plot (close LONGLIB)\n           =999: end plot (close LONGLIB)\n.end lit\n\n.hl1  SUBROUTINE PLOTND \n.p\n~PLOTND is used to signal LONGLIB that all plotting is complete.  It\nsends the final output buffers to the respective graphics devices, closes\nfiles and channels, and resets the terminal to the normal ~text mode.  PLOTND\nis equivalent to a CALL PLOT(0.,0.,11) command.\n.lit\n\nCALL PLOTND\n      (no arguments)\n.end lit\n\n.hl1 SUBROUTINE PLOTS\n.p\n~PLOTS initializes the LONGLIB graphics package via a call to FRAME.\nPLOTS provides compatibility with existing CALCOMP or PLOTS-10 compatible\ncode.  It simply calls ~FRAME with argurments which cause FRAME to prompt\nfor optional usage of the Longlib meta file output and a graphics\nscreen.  For new code use FRAME.\n.lit\n\nCALL PLOTS (...)\n\n(arguments are ignored)\n.end lit\n\n.hl1  SUBROUTINE PLOTRM\n.p\n~PLOTRM is the central routine for controlling the plotting of lines to\nthe Ramtek or REF package.  PLOTRM is called by the ~PLOT routine but\ncan be called separately.  Any call to PLOTRM when the Ramtek package\nis not initialized is a dummy call.  Options for PLOTRM are similar\nto PLOT (see documentation on PLOT).\nAn attempt to make the viewport bigger than the Ramtek screen window\nwill force the viewport to be the size of the Ramtek screen window\n(this is the default).  Typically the Ramtek screen window is\neither 13.75 or 11 by 11 inches depending on the type (1280x1024 and\n512x512, respectively), with the lower\nleft corner at (0,0) and the upper right corner at (13.75,11).\n.lit\n\nCALL PLOTRM (x,y,i)\n\nx,y   (R): coordinate values\ni     (I): plot function parameter\n           =  0: Ramtek color control\n                   x is the Ramtek color table index\n                   if x < 0 the Ramtek screen is cleared\n                   if x >= 0 then rotation angle becomes y\n           =  2: Ramtek draw to (x,y) with 'pen down'\n           = -2: same as i=2. point (x,y) becomes new origin\n           =  3: Ramtek move to (x,y) with 'pen up'\n           = -3: same as i=3. Point (x,y) becomes new origin\n           =  4: upper right corner of viewport set to (x,y)\n           = -4: lower left corner of viewport set to (x,y)\n           =  5: pick pen up at last point\n           =  9: draw to (x,y) 'pen down' color 0 (erase)\n           = -9: same as i=9. Point (x,y) becomes new origin\n           = 11: end plot (close Ramtek package)\n           =999: end plot (close Ramtek package)\n.end lit\n\n.hl1 SUBROUTINE PLOTVT\n.p\n~PLOTVT is the central routine for controlling the plotting of lines to\nthe terminal screen device REF package.  PLOTVT is called by the ~PLOT \nroutine but\ncan be called separately.  Any call to PLOTVT when the terminal package\nis not initialized is a dummy call.  Options for PLOTVT are similar\nto PLOT (see documentation on PLOT).\nAn attempt to make the viewport bigger than the terminal screen window\nwill force the viewport to be the size of the terminal screen window\n(this is the default).  Typically the terminal screen window is\n9.5 by either 9.5 or 7.2 inches (depending on the terminal) with the lower\nleft corner at (0,0) and the upper right corner at (9.5,9.5).\n.lit\n\nCALL PLOTVT (x,y,i)\n\nx,y   (R): coordinate values\ni     (I): plot function parameter\n           =  0: if x < 0 the terminal graphics screen is cleared\n                 if x >= 0 then rotation angle becomes y\n                 if x = 0 set terminal to erase mode plotting\n                 if x <> 0 and x <> 999 set line color to x\n                 if x = 999 set terminal to XOR mode plotting\n                             (only if terminal has capability)\n           =  2: draw to (x,y) with 'pen down' on terminal\n           = -2: same as i=2. Point (x,y) becomes new origin\n           =  3: move to (x,y) with 'pen up' on terminal\n           = -3: same as i=3. Point (x,y) becomes new origin\n           =  5: pick pen up at last point\n           =  4: upper right corner of viewport set to (x,y)\n           = -4: lower left corner of viewport set to (x,y)\n           =  9: erase to (x,y) on terminal (if supported)\n           = -9: same as i=9. Point (x,y) becomes new origin\n           = 11: end plot (close terminal package)\n           =999: end plot (close terminal package)\n.end lit\n\n.hl1 SUBROUTINE PLRAX\n.p\n.x polar axis\n~PLRAX plots a circular ~axis for plotting in polar form.  A series\nof concentric circles are drawn around (x,y) at increasing radi\nto the maximum radius.     Provisions are included for half circle,\nquarter circle, etc.  Labeling of starting points and ending points\nmay be changed.\n.lit\n\nCALL PLRAX (x,y,r,as,ae,a0,a1)\n\nx     (R): x coordinate of center of polar axis\ny     (R): y coordinate of center of polar axis\nr     (R): radius of polar axis in plot units\nas    (R): starting angle of axis in degrees from horizontal\nae    (R): ending angle of axis in degrees from horizontal\n           Note: as=0 and ae=360 yields full circle axis\na0    (R): number label of starting angle\na1    (R): number label of ending angle\n           Note: if a0=a1 then angles are not labeled.\n.end lit\n\n.hl1 SUBROUTINE PLRLN\n.p\n.x polar line\n~PLRLN plots a solid curve through the set of coordinate points\nin polar form stored in r and t arrays.  Symbols may be inserted\nat selected intervals.     Angle values stored in the t array are\nin degrees referenced to horizontal.  Coordinates are calculated\nas follows:\n.lit\n          r=(r-rmin)/dr\n          xplotted=r*cos(t*pi/180)\n          yplotted=r*sin(t*pi/180)\n\n.end lit\n.lit\n\nCALL PLRLN (r,t,n,j,l,ir,rmin,dr)\n\nr     (R): array of radial values to be plotted\nt     (R): array of angle values\nn     (I): number of points to plot\nj     (I): plotting symbol option flag\n           > 0 : symbol plotted every jth point with connecting lines\n           = 0 : line plotted only with no symbols\n           < 0 : symbols plotted only, no connecting line\nl     (I): symbol number (see SYMBOL)\nir    (I): start index in r and t arrays\nrmin  (R): minimum radius scale factor\ndr    (R): scale factor\n.end lit\n\n.hl1 SUBROUTINE PLT3D\n.p\n.x 2-d surface plotting\n~PLT3D plots a 2 dimensional array as a surface scribed with a\nlinear grid parallel to the x and y axes, i.e., a mesh.\nHidden lines are supressed.\nTransformation from the array indices (i,j) to (x,y,z) is:\n.lit\n\n    x = xl * .5 * float(2*j-n-1)/float(n-1)\n    y = yl * .5 * float(2*i-m-1)/float(m-1)\n    z = zs * (a(i,j) + z0)\n\nThus,\n\n    (1,1) is (-xl/2,-yl/2)   (m,1) is (-xl/2,+yl/2)\n    (1,n) is (+xl/2,-yl/2)   (m,n) is (+xl/2,+yl/2)\n\n    xplotted = x*cos(az) - y*sin(az) + x0\n    yplotted = x*sin(az)*sin(al) + y*sin(az)*sin(al) + z*cos(al)+y0\n.end lit\n.p\nThe common block ~PLT3B returns these ~transformation parameters so\nthat the plotted location (xp,yp) of a point (i,j,zr) may be computed as:\n.lit\n\n        xp = a1 * j + a2 * i + a3\n        yp = b1 * j + b2 * i + b3 * zr + b4\n.end lit\n.p\nThe dimension of the second set of working arrays is dependent on the\nsurface complexity -- the greater the surface complexity, the greater\nl2 must be.  As a minimum, l2 > l.  See also ~NXTVU and HLT3D.\n.x HLT3D\n.lit\n\nCALL PLT3D (a,md,nd,m,n,w,l,w2,l2,al,az,xl,x0,yl,y0,zs,z0,ierr)\n\na     (R): array of values to be plotted dimensioned a(md,nd)\nmd,nd (I): array dimensions\nm,n   (I): size of data in array to be plotted\nw     (R): working array dimensioned w(l) l=>4*min(m,n)\nl     (I): working array dimension\nw2    (R): working storage array dimensioned w2(l2)\nl2    (I): working storage array dimension (see note)\nal    (R): viewing altitude angle\naz    (R): viewing azimuth angle\nxl,yl (R): length of unprojected axes (plot units)\nx0,y0 (R): plot origin\nzs    (R): z coordinate scale factor\nz0    (R): z coordinate offset\nierr  (I): (returned) error code\n           = 0 : ok\n           = 1 : l2 not large enough in NXTVU\n           = 2 : l not large enough\n\nCOMMON /PLT3B/ a1,a2,a3,b1,b2,b3,b4\n.end lit\n\n.hl 1 SUBROUTINE PPLOT\n.p\n~PPLOT is the central routine for controlling the plotting of lines to\nthe LONGLIB metafile package.  PPLOT is called by the ~PLOT \nroutine but\ncan be called separately.  Any call to PPLOT when the metafile package\nis not initialized is a dummy call.  Options for PPLOT are similar\nto PLOT (see documentation on PLOT).\nAn attempt to make the viewport bigger than the metafile plotting window\nwill force the viewport to be the size of the metafile plotting window\n(this is the default).\nThe metafile plotting window is 56.5 by 56.5 inches with the lower\nleft corner at (0,0) and the upper right corner at (56.5,56.5).\nSince most hardcopy devices can not produce such a large output page,\nthe LONGLIB metafile processor programs which convert the metafile to\nan output file, \"strips\" the metafile window into separate, overlapping output\npages.  Only non-blank page strips are output to the device.\n.lit\n\nCALL PPLOT (x,y,i)\n\nx,y   (R): coordinate values\ni     (I): plot function parameter\n           =  0: line color control\n                  x is the new line color\n                  if x >= 0 then plotting angle becomes y\n           =  2: draw to (x,y) with 'pen down'\n           = -2: same as i=2. (x,y) becomes new origin\n           =  3: move to (x,y) with 'pen up'\n           = -3: same as i=3. (x,y) becomes new origin\n           =  4: upper right corner of viewport set to (x,y)\n           = -4: lower left corner of viewport set to (x,y)\n           =  5: pick pen up at last point\n           =  9: erase to (x,y)\n           = -9: erase to (x,y), (x,y) becomes new origin\n           = 10: issue change page command to metafile\n           = 11: end plot (close metafile package)\n           =999: end plot (close metafile package)\n.end lit\n\n.hl1 SUBROUTINE PPEN\n.p\n.x line type\n.x rmpen\n.x vpen\n~PPEN is called by ~NEWPEN to change the hardware line type and/or width of\nthe plotting line for subsequent plotting on the metafile.  It may be\ncalled separately to change only the metafile line type.\nRamtek and terminal output device line types may be changed using\nRMPEN and VPEN, respectively.  While the metafile output device supports\nline types, widths and type scale factors (the length of the linetype\ndot/dash pattern), the programs which process the LONGLIB metafile into\nthe output format required by the hardcopy device may not support all\nfeatures.  The precise effects depend on the particular graphics device.\nRaster scan converter programs for dot matrix printers support all options\nand the 10 standard line types shown in the last chapter.  On other\nhardcopy devices, the metafile processing program uses the \nthe nearest hardware-supported line type to the standard line\ntype.  Line widths are defined in terms of the minimum line widths.\nThe default line type is a solid line of width 1 dot.\n.lit\n\nCALL PPEN (i)\n\ni     (I): selects a line type for all additional plotting\n           to the LONGLIB metafile\n           < 0 : resets line type to solid line of unit width.\n           = 0 : line type 0 no change in line width\n           > 0 : line type and width changed according to,\n   (1's digit)   : line type (0-9)\n   (10's digit)  : line width (1-7) (value of 0 does not change width)\n   (100's digit) : line type pattern scaling (1-7) (0 is no change)\n.end lit\n\n.hl1  SUBROUTINE RECT\n.p\n~RECT plots a rectangle defined by the lower left and upper right hand\ncorners.  The pen moves UP to lower left hand of the rectangle, plots\nthe rectangle, and leaves the pen DOWN at the lower left corner.\n.lit\n\nCALL RECT (x1,y1,x2,y2)\n\nx1,y1 (R): lower left hand corner coordinates\nx2,y2 (R): upper right hand corner coordinates\n.end lit\n\n.hl1 SUBROUTINE RESPL\n.P\n~RESPL performs a penup, then restores the current plotting origin, color,\nline type, scale, and plotting angle saved by the ~SAVPL command. In conjunction\nwith ~SAVPL (which saves a previous condition) context changes can be easily\nmade.  RESPL calls ~PRESPL (metafile restore), ~RRESPL\n(Ramtek restore), and ~VRESPL (terminal restore)\nwhich can be independently used if desired.  If the stack is empty,\nno restore occurs.  (NOTE: graphics devices must be in the graphics\nmode when this routine is executed).  When using PRESPL, RRESPL, or VRESPL\na pen up operation should be executed imediately prior to the call. \n.lit\n\nCALL RESPL\n     (no arguments)\n.end lit\n\n.hl  SUBROUTINE RFACTOR\n.p\n~RFACTOR is called by ~FACTOR to change the input scale conversion factor\nfor the LONGLIB metafile package.  It can be called separately if desired.\nOnly the Ramtek plotting package\nis affected.  The routines ~PFACTOR and ~VFACTOR may be separately \ncalled to change the input scale conversion factor on the metafile and\nterminal packages, respectively.  See FACTOR.\n.lit\n\nCALL RFACTOR (fac)\n\nfac (R): new conversion factor for coordinate values\n         (only the Ramtek scaling is affected)\n         <= 0 : scale factor reset to unity\n         >  0 : new scale factor\n.end lit\n\n\n.hl1 SUBROUTINE RMPEN\n.p\n.x line type\n.x ppen\n.x vpen\n~RMPEN is called by ~NEWPEN to change the hardware line type and/or width of\nthe plotting line for subsequent plotting on the Ramtek.  It may be\ncalled separately to change only the Ramtek line type.\nMetafile and terminal output device line types may be changed using\nPPEN and VPEN, respectively.  While the Ramtek output device supports\nline types and type scale factors (the length of the linetype\ndot/dash pattern) it does not support line widths in hardware.\nThe default line type is a solid line of width 1 dot.\n.lit\n\nCALL RMPEN (i)\n\ni     (I): selects a line type for all additional plotting\n           to the LONGLIB Ramtek\n           < 0 : resets line type to solid line of unit width.\n           = 0 : line type 0 no change in line width\n           > 0 : line type and width changed according to,\n   (1's digit)   : line type (0-9)\n   (10's digit)  : line width (0-7) (ignored)\n   (100's digit) : line type pattern scaling (1-7) (0 is no change)\n.end lit\n\n.hl1  SUBROUTINE RTERM\n.x REFDIS\n.p\n~RTERM is designed to be similar to the ~CTERM routine but for use with the\nRamtek. It is a dummy call when not in ~Ramtek plotting mode.  When using\nthe ~REF package, it calls REFDIS.\n.lit\n\nCALL RTERM (iarg)\n\niarg (I): operation code\n          = 0 : clear Ramtek screen\n          = 2 : ask if clear screen desired. \n                reply should be: \"Y\" or \"N\".  Default is \"N\".\n                NOTE: a reply of \"Q\" will execute RTERM(3).\n                a reply of \"S\" will close channel and stop\n                Ramtek plotting until next RTERM(2) (see CTERM)\n          =-2 : clear Ramtek screen\n          = 3 : close Ramtek plotting (closes old channel)\n          =-3 : reopen Ramtek plotting (opens new channel--does\n                not reinitalize Ramtek plotting package)\n          =-4 : clear Ramtek screen\n.end lit\n\n.hl1 SUBROUTINE SAVPL\n.P\n~SAVPL performs a penup, then stores the current plotting origin, color,\nline type, scale, etc. on a stack which will store up six calls.\nIn conjunction\nwith ~RESPL (which restores previous condition) context changes can be easily\nmade.  SAVPL calls ~PSAVPL (metafile save), ~RSAVPL\n(Ramtek save), and ~VSAVPL (terminal save)\nwhich can be independently used if desired.  When the stack is\nfull no save is performed.\n.lit\n\nCALL SAVPL\n.end lit\n\n.hl1 SUBROUTINE SCALE\n.x LINE\n.p\n~SCALE calculates the minimum and a scaled (smoothed) increment from\nan array of values.  The maximum and minimum of the array are computed\nand the difference is divided by a length parameter.  The resulting\nvalues are \"smoothed\" so that numeric labels appear \"nice\" when labeled at\nxm and at one inch increments.\nThe smoothed numbers are taken from the set of values 1,2,4,5,8 * 10n\nthat equals or is smaller than the true value.  SCALE is useful\nin determaning the scale factors for LINE.  It is used extensively\nin the MASTER routines.  SCALE is not very intelligent and does not\nalways make good choices.  SCALE selects xm and dx so that the plotted\nx values may be computed using the following formula such that if\nx=xm, xplotted=0 and if x=xlen*dx+xm, xplotted=xlen.\n.lit\n\n    xplotted = ( x - xm ) / dx\n\n.end lit\n.lit\n\nCALL SCALE (x,xlen,n,k,ix,xm,dx)\n\nx     (R): array of data points from which scale is determined\nxlen  (R): scale length\nn     (I): number of data points in x (n>1)\nk     (I): use every first (k=1) value, second (k=2) value, etc.\n           normally k=1.\nix    (I): first data point index for x (normally ix=1)\nxm    (R): contains smoothed minimum after the call (returned)\ndx    (R): contains smoothed increment after call (returned)\n.end lit\n\n.hl1 SUBROUTINE SCALG\n.x LGLIN\n.p\n~SCALG calculates a scaled minimum and increment factor similar\nto ~SCALE but uses the log (actually alog10(abs(val)+1.e-38))\nof the input array.  See also SCALE and LGLIN.\nSCALG selects xm and dx so that the plotted\nx values may be computed using the following formula such that if\nalog10(abs(x)+1.e-38)=xm then xplotted=0 and if \nalog10(abs(x)+1.e-38)=xlen*dx+xm then xplotted=xlen.\n.lit\n\n    xplotted = ( alog10(abs(x)+1.e-38) - xm ) / dx\n\n.end lit\n.lit\n\nCALL SCALG (x,xlen,n,k,ix,xm,dx)\n\nx     (R): array of data points from which scale is determined\nxlen  (R): length \nn     (I): number of data points in x (n>1)\nk     (I): use every first (k=1) value, second (k=2) value, etc.\n           normally k=1\nix    (I): first data point index for x (normally ix=1)\nxm    (R): contains smoothed minimum after the call (returned)\ndx    (R): contains smoothed increment after call (returned)\n.end lit\n\n.hl1 SUBROUTINE SHADE\n.p\nThe ~SHADE subroutine fills in the ~area inclosed by the line defined\nby the x and y arrays with equally spaced lines at a given angle using\na specified line type.  The first and last\npoint of the x and y array are assumed to be connected.  \n.lit\n\nCALL SHADE (x,y,n,i,l,d,t,w,ma,xm,dx,ym,dy)\n\nx     (R): array of x values\ny     (R): array of y values\nn     (I): number of points in array\ni     (I): increment between points\nl     (I): shade format control\n           = -3 : clear area and outline\n           = -2 : clear area\n           = -1 : clear outline\n           =  0 : no action\n           =  1 : draw outline\n           =  2 : shade area\n           =  3 : shade area and outline\nd     (R): distance between shading lines\nt     (R): angle of shading lines in degrees\nw     (R): working array dimensioned at least 3*n\nma    (R): line type of shading\n            => 0 : line type (see NEWPEN)\nxm    (R): minmum scale factor for x (see LINE)\ndx    (R): x increment scale factor\nym    (R): minmum scale factor for y\ndy    (R): y increment scale factor\n.end lit\n\n.hl1 SUBROUTINE SYMBOL\n.p\nThe ~SYMBOL routine plots an ~ASCII string.  Upper and lower\ncase ~characters can be plotted as well as special plotting\nsymbols and characters.  A list of symbols is shown in the last\nchapter.\nThe plotting symbols 0 to 16 are centered vertically and horizontally,\nwhile other symbols have a reference point on the lower left edge\nof the character. Hence, i=-1 should be used for centered plot symbols\n0 thru 16. \nThe number of characters in the input string which should be plotted\ncan be specified.\nIf an ASCII null (0) is encountered in the string beyond the\nfirst position, the routine terminates.\n.p\nThe string can be plotted left-justified, centered, or right-justified.\nWhen the string is left-justified, the location of the end of the\nplotted string can be optionally returned.  The length of the\nplotted string can be computed by calling SYMBOL first with i=-3\nand computing the difference between the start and ending points of the\nstring.\n.p\nMore elaborate characters and different fonts\nmay be obtained using SYMS.  ~MASTER routines, ~AXIS routines, and ~NUMBER\nall use ~SYMBOL characters.  If the user desires to use ~SYMS in place\nof SYMBOL throughout a program, the user can add the following routine\nto the program.  The subroutine should be titled SYMBOL with the\narguments described below.  This routine\nsimply passes the arguments (in the same order) to SYMS.\n.lit\n\n        SUBROUTINE SYMBOL(x,y,h,s,a,n,i)  ! symbol replacement\n        INTEGER S(1)\n        A = SYMS(x,y,h,s,a,n,i)           ! call syms\n        RETURN\n        END\n.end lit\n.x %REF()\n.x descriptor\n.p\nNote: ~VAX ~FORTRAN ~CHARACTER types\ncan not be used directly since calling subroutines with CHARACTER types\nis done by DESCRIPTOR. Use ~BYTE or ~INTEGER arrays for s or use %REF()\nfor character variables, i.e., call SYMBOL(0., 0., .25, %REF(S), 0., 10,-1).\nSee the section on machine dependency.\n.lit\n\nCALL SYMBOL (x,y,h,s,a,n,i)\n\nx,y   (R): location position (x,y returned if i=-2 or -3)\n           If x=999 then x continued from last position in\n           prior SYMBOL or NUMBER call. If y=999 then y continued.\nh     (R): height of the string to be printed\ns     (B): alpha string containing the text to be plotted \na     (R): angle at which the string is to be plotted\nn     (I): number of characters in string s to plot\n           = -2 : draws pen down to (x,y) before symbol plotted\n           = -1 : plots a single symbol\n           >  0 : number of characters to plot\ni     (I): location flag\n            = -3 : same as -2 but string is not plotted and\n                   last position is not affected\n            = -2 : same as -1 but returns end point in x,y\n            = -1 : (x,y) is lower left corner of plotted string\n            =  0 : (x,y) is center of plotted array\n            =  1 : (x,y) is lower right corner of plotted string\n            =  2 : no action\n.end lit\n\n.hl1 REAL FUNCTION SYMS\n.p\n.x character plots\n~SYMS is similar to SYMBOL in that it will plot\nan ~ASCII string (i.e. a byte array).  However, SYMS provides additional\nmath and plotting symbols as well as several character fonts (including\n~Greek characters).  SYMS has several additional enhancements to permit\ncomplicated equations to be plotted.  All but the 9th font have variable\nwidth characters.  Several fonts are designed to produce solid characters\nwhen the plotting scale is small.\nThe number of characters in the input string s plotted and/or\ninterpreted can be specified.\nIf an ASCII null (0) is encountered in the string after the\nfirst position, the routine terminates.\n.p\nThe ASCII character \"|\" (decimal 124) is used as a control character to\nchange fonts or subscripting options.  The character following the\n\"|\" character is used according to the following table:\n.s3\n.tp 30\n.c;SYMS Options\n.lit\n\n ASCII Character  Decimal       Effect\n________________ _________     ________\n\n    0-9           48-57         Change to font (0-9)\n     W             87           Move forward one space\n     X             88           Move forward 1/2 space\n     Y             89           Move backward one space\n     Z             90           Move backward 1/2 space\n     [             91           Reset to default\n     \\             92           Begin subscripting\n     ]             93           \"Back up\" one character\n     ^             94           Begin superscripting\n     _             95           Un sub/super\n     `             96           Change scale (requires\n                                another character-- \"+\"\n                                indicates increase size by 2,\n                                \"-\" indicates shrink by 1/2.\n     a             97           Begin over printing\n     b             98           Begin under printing\n\n.end lit\nThe number of characters in the string should include control characters.\n.p\nThe width of one space is moved when moving forward or backward.\n\"Back up\" returns the positioning to the start of the last character.\nUp to 6 \"back up\" commands can be issued.  Super/sub scripting can be\ndone recursively.  Only one level is \"popped off\" by the\nun-sub/super command.  Scale changes require an additional character\n(either a \"+\" or \"-\" to indicate the direction).  Over/under printing\npermit summation and integral limits to be added.  Available fonts are listed\nin the following Table:\n.tp 15\n.s2\n.x character fonts\n.c;Fonts Available in SYMS\n.lit\n\n  Font          Characters              Description\n ______        ____________            _____________\n\n   0 [default]  ASCII 0-31              Plotting Symbols\n                ASCII 32-127            Simplex font--variable width\n   1            ASCII 32-127            Roman\n   2            ASCII 64-127            Greek Simplex\n   3            ASCII 32-127            Roman Italic\n   4            ASCII 32-127            Duplex bold\n   5            ASCII 64-127            Special math symbols\n   6            ASCII 32-127            Greek bold\n   7            ASCII 32-127            Simplex Italic\n   8            ASCII 32-127            Crude Simplex--fixed width\n.end lit\n.p\nFor example, the following summation using Greek characters, a\n~math symbol, and a super scripted variable can be wrtten:\n.TP7\n.lit\n\n  alph string = 'A = |6R a|^2|_|]|]|]|]|b|1|2n=1|]|]|]|_|a|5K'\n\n               infinity    2\n            A = SIGMA alpha\n               zeta=1\n\n.end lit\n.p\nNote: SYMS can be called as a real function.  The returned value\nis the final length of the plotted string.  When i=2 no plotting\nis done but the length is returned.  When i=-2 the string is plotted\nand the lower left corner of the next character position after\nthe end of the string is returned in x,y.\n.p\nNote: VAX FORTRAN CHARACTER types\ncan not be used directly since calling subroutines with CHARACTER types\nis done by DESCRIPTOR. Use BYTE or INTEGER arrays for s or use %REF()\nfor character variables, i.e., call SYMS(0., 0., .25, %REF(S), 0., 10, -1).\nSee the section on machine dependency.\n.lit\n\nrlen = SYMS (x,y,h,s,a,n,i)\n\nx,y    (R): string position (x,y returned if i=-2 or i=-3)\n            If x=999 then x is continued from last position in\n            prior SYMS call.  If y=999 then y continued.\nh      (R): height of the string to be printed\ns      (B): alpha array containing the text to be plotted\na      (R): angle at which the string is to be plotted \nn      (I): number of characters in string s\ni      (I): centering flag\n            = -3 : same as -2 but string is not plotted and\n                   last position is not affected\n            = -2 : same as -1 but returns end point in x,y\n            = -1 : (x,y) is lower left corner of plotted string\n            =  0 : (x,y) is center of plotted array\n            =  1 : (x,y) is lower right corner of plotted string\n            =  2 : no plotting, plotted length of string returned\n\nrlen   (R): (returned) length of plotted text string\n.end lit\n\n.hl1 REAL FUNCTION SYMSS\n.p\n.x character plots\n~SYMSS is identical to SYMS except that it plots \"smoothed\" characters\nusing the software linetype generation routine LINSEQ.\nSmoothing improves the appearance of most of the fonts\nwhen the characters are plotted at large scale.  See ~SYMS and ~LINSEQ for\nadditional details.\n.lit\n\nrlen = SYMSS (x,y,h,s,a,n,i,al,l1,l2,l3,l4,l5)\n\nx,y   (R): string position (x,y returned if i=-2 or i-3)\n           If x=999 then x continued from from last position in\n           prior SYMS call. If y=999 then y continued.\nh     (R): height of the string to be printed\ns     (B): alpha array containing the text to be plotted \na     (R): angle at which the string is to be plotted \nn     (I): number of characters in string s\ni     (I): centering flag\n           = -3 : same as -2 but string is not plotted and\n                  last position is not affected\n           = -2 : same as -1 but returns end point in x,y\n           = -1 : (x,y) is lower left corner of plotted array\n           =  0 : (x,y) is center of plotted array\n           =  1 : (x,y) is lower right corner of plotted array\n           =  2 : no plotting, plotted length of string returned\nal    (R): smoothed arc length (typically 0.05 to 0.01)\nl1-5  (I): LINSEQ arc type, use l1=0 for a solid line.\n\nrlen  (R): (returned) length of plotted text string\n.end lit\n\n.hl  SUBROUTINE VFACTOR\n.p\n~VFACTOR is called by ~FACTOR to change the input scale conversion factor\nfor the LONGLIB metafile package.  It may be called separately if desired.\nOnly the terminal plotting package\nis affected.  The routines ~PFACTOR and ~RFACTOR may be separately \ncalled to change the input scale conversion factor on the metafile and\nRamtek packages, respectively.  See FACTOR.\n.lit\n\nCALL VFACTOR (fac)\n\nfac (R): new conversion factor for coordinate values\n         (only the terminal scaling is affected)\n         <= 0 : reset scale factor to unity\n         >  0 : new scale factor\n.end lit\n\n.hl1 SUBROUTINE VPEN\n.p\n.x line type\n.x rmpen\n.x ppen\n~VPEN is called by ~NEWPEN to change the hardware line type and/or width of\nthe plotting line for subsequent plotting on the terminal screen device.\nIt may be called separately to change only the terminal line type.\nMetafile and Ramtek and terminal output device line types may be changed \nseparatly using PPEN and RMPEN, respectively.  While the terminal output\ndevice driver supports line types in hardware, line widths are supported in\nsoftware by outputing multiple single-width lines offset by one pixel.\nLine type scale factors (the length of the linetype\ndot/dash pattern) are not used.  Not all terminals support all\nstandard line types.  If a particular terminal does not support the\nrequested line type, normally a solid line is used.\nThe default line type is a solid line of width 1 dot.\n.lit\n\nCALL VPEN (i)\n\ni     (I): selects a line type for all additional plotting\n           to the terminal screen output device\n           < 0 : resets line type to solid line of unit width.\n           = 0 : line type 0 no change in line width\n           > 0 : line type and width changed according to,\n   (1's digit)   : line type (0-9)\n   (10's digit)  : line width (1-7) (0 value does not change width)\n   (100's digit) : line type pattern scaling (ignored)\n.end lit\n\n.hl1 SUBROUTINE WHERE\n.p\n~WHERE returns the location from the last call to PLOT. \nThe Zoom scale factor value is returned from the LONGLIB graphics device\npackages in the priority order: ~terminal if open or ~Ramtek if open or\nelse from the metafile.  Does nothing when no device is open.\n.lit\n\nCALL WHERE (x,y,z)\n\nx,y   (R): (returned) values of x,y from last call to plot\nz     (R): (returned) zoom value.\n.end lit\n\n.hl1 SUBROUTINE WHEREPR\n.p\n~WHEREPR returns information on the metafile plotting parameters.  If lu <= 0\nthen metafile has not been initialized.  A routine ~FIXPR0 (which\nhas the same parameters) may be used\nto set these variables to absolute values without error checking.\n.lit\n\nCALL WHEREPR (x,y,ax,ay,z,a,rx,ry,lu,m,iw,ic)\n\nx,y   (R): (returned) current origin\nax,ay (R): (returned) last scaled and shifted origin point\nz     (R): (returned) current zoom scale factor\na     (R): (returned) current plotting angle\nrx,ry (R): (returned) resolution of metafile\nlu    (I): (returned) FORTRAN file output unit number \n                      (if lu <= 0 metafile package not initialized)\nm     (I): (returned) current line type\niw    (I): (returned) current line width\nic    (I): (returned) current line color\n.end lit\n\n.hl1 SUBROUTINE WHERERM\n.p\n~WHERERM returns information on the ~Ramtek plotting parameters.  If c <= 0\nthen ramtek has not been initialized.   A routine ~FIXRM0 (with\nsame parameters) may be used\nto set these variables to absolute values without error checking.\n.lit\n\nCALL WHERERM (x,y,z,a,rx,ry,nt,ns,i,ic)\n\nx,y   (R): (returned) current origin\nz     (R): (returned) current zoom scale factor\na     (R): (returned) current plotting angle\nrx,ry (R): (returned) current pixel resolution\nnt    (I): (returned) current line bit pixel pattern\nns    (I): (returned) current line bit scale factor\ni     (I): (returned) Ramtek color \nic    (I): (returned) Ramtek channel\n             (if ic <= 0 ramtek is not initialized)\n.end lit\n\n.hl1 SUBROUTINE WHEREVT\n.x Selanar\n.x vt100\n.x vt125\n.x vt240\n.x vt220\n.p\n~WHEREVT returns information on the ~terminal plotting parameters.  If nv <= 0\nthen terminal graphics have not been initialized.  A routine\n~FIXVT0 (with same arguments) may be used to set these variables to \n~absolute values without error checking.\n.lit\n\nCALL WHEREVT (x,y,z,a,rx,ry,iv,ns,it,iw,ic)\n\nx,y   (R): (returned) current origin\nz     (R): (returned) current zoom scale factor\na     (R): (returned) current plotting angle\nrx,ry (R): (returned) current pixel resolution\niv    (I): (returned) terminal code\n              (if nv <= 0 terminal is not initialized)\nms    (I): (returned) internal terminal-type code\n           = 1 VT100 with Selanar GR100\n           = 2 VT125 \n           = 3 VT240 \n           = 4 VT220 with Selanar GR220\n           = 5 Tektronix 4010\n           = 6 Tektronix 4109\n           = 7 Graphon GO-235\nit    (I): (returned) current line type \niw    (I): (returned) current line width\nic    (I): (returned) current line color\n.end lit\n\n.CHAPTER Description of 3-d Plotting Routines\n.x 3-d plotting\n.p\nThe following paragraphs contain detailed  descriptions of the subroutines\nincluded in the LONGLIB library for 3-d plotting.  For added flexibility,\ntwo distinct families of 3-d plotting routines have been provided.\nOne family is designed for plotting with hidden line removal;\nthe other family is more flexible but does not perform hidden line removal.\nBoth options assume that ~FRAME has already been called, i.e. the plot\npackage is already opened.  The 3-d routines call ~PLOT as output so\nthat the 2-d plot origin, scaling, rotation, etc. are used in addition\nto any 3-d operations.\n.p\nThe nominal Z axis of the 3-d plot packages for plotted objects runs out\nof the screen.  The X and Y axes are defined as before.\n.p\n.x hidden line removal\nTwo separate, independent  3-d packages exist.  These are identified by\nthe initialization routines used for each package.  The hidden line\nremoval package is ~INIT3DH and is a modification of the ~COSMIC hidden\nline code package (ARC-11446).  The other is INIT3D.  ~INIT3D does\nnot perform any hidden line removal.  These package differ not only in\nhidden line removal but also in speed of operation and memory requirements.\nThe packages are completely independent.  Only routines designed for a\nparticular package will work with that package.  It is possible to\nuse both simultaneously.\n\n.hl 1 INIT3D Routines\n.p\nThe INIT3D 3d plotting package permits 3-d plotting but does not include\nhidden line removal.\nThe family of routines used with ~INIT3D include:\n.s1\n.ls0\n.le;PLOT3D -- the central plot routine for INIT3D\n.le;AXIS3D -- plots axes using PLOT3D, NUM3D, and SYM3D\n.le;NUM3D -- plots numbers using PLOT3D\n.le;SYM3D -- plots symbols using PLOT3D\n.le;WHERE3D -- returns the screen coordinates of the last point\ndrawn by PLOT3D.\n.els\n.p\nThe ~INIT3D family of 3-d plotting routines are desiged to plot\nwireframe line plots with no hidden line removal.  Memory requirements\nare modest and plotting is more rapid than for the ~INIT3DH routines.\nFor an example of the use of the INIT3D package see the ~EXAMP3D\nprogram included with the LONGLIB graphics library.\n\n.hl2 SUBROUTINE INIT3D\n.p\n~INIT3D sets the ~absolute origin, rotations, and ~scale ~factor of\nthe 3-d package.  These functions are distinct from the functions of\nPLOT.  INIT3D may be called at any time to reset these functions without\nclosing the plot package.  The plot package must be opened with ~FRAME\nprior to the call to INIT3D.\n.lit\n\nCALL INIT3D (x,y,z,xa,ya,za,t,ds,sf,i)\n\nx,y,z    (R): coordinates of view point (looking from)\nxa,ya,za (R): coordinates of center point (looking to)\nt        (R): rotation angle around line from (x,y,z) to\n              (xa,ya,za) in degrees CCW.\nds       (R): perspective scale factor (image size/viewing distance)\nsf       (R): relative scale factor\ni        (I): plotting flag ( -1 = do not plot, scaling only)\n.end lit\n\n.hl2  SUBROUTINE AXIS3D\n.x AXIS3\n.x PLOT3D\n.x NUM3D\n.x SYM3D\n.p\n~AXIS3D plots an axis and its markings in 3-d.  In order to draw a \ncoordinate system, the routine has to be called separately for the x,\ny, and z axis.  A possible exponent is determined and placed behind the\naxis label in the form of 10**n in the auto scaling mode (see AXIS3).\nAXIS3D calls PLOT3D, NUM3D, and SYM3D.  See also AXIS3.\n.lit\n\nCALL AXIS3D (x,y,x,a,b,g,s,n,ale,xm,xx,t,c,f)\n\nx,y,z (R): location of start of axis \na,b   (R): angles from the x-y, x-z planes (in deg) of the ray\n           from (x,y,z) along the character string \ng     (R): angle of rotation about the ray defined by a,b (deg)\ns     (B): alpha string containing the axis title\nn     (I): number of characters in the string\n           > 0 : axis labelling on positive side (anti-clockwise)\n           < 0 : axis labelling on negative side (clockwise)\n (100's digit) = 0 : axis is labeled\n               = 1 : line and ticks only--no labeling\nale   (R): length of axis \n           < 0 : tick marks placed on same side of axis as title\n           = 0 : no action\n           < 0 : tick marks placed opposite side of axis from title\nxm    (R): value of first marking on the axis\nxx    (R): value of last marking on the axis\nt     (R): number of tick marks \n           specification is coded in the form MMM.mmss where\n           MMM is the number of major tick marks ( MMM > 0), mm is\n           the number of minor tick marks between major tick marks\n           (100 > mm => 0), and ss is the number of subminor tick\n           marks between minor tick marks (100 > ss => 0).\n           (example 1.0102 produces I_._._i_._._I)\nc     (R): size of characters \n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nf     (R): number label format (see NUMBER) \n.end lit\n\n.hl2 SUBROUTINE NUM3D\n.x number\n.x plot3d\n.p\n~NUM3D plots a floating point number (see NUMBER) in 3-d using\nPLOT3D.  The symbols are plotted in the plane defined by a,b,g.\n.lit\n\nCALL NUM3D (x,y,z,a,b,g,f,e)\n\nx,y,z (R): lower-left corner of string\n           If x=999, y=999, z=999 then string is continued from\n           lower right of previous SYM3D or NUM3D call\na,b   (R): angles from the x-y, x-z planes (in deg) of the ray\n           from (x,y,z) along the base of the character string\ng     (R): angle of rotation about the ray defined by a,b (deg)\nh     (R): height of the number to be plotted\nf     (R): number to be plotted\ne     (R): format of number representation n.j \n           (see NUMBER for detailed description)\n.end lit\n\n.hl2 SUBROUTINE PLOT3D\n.x CPLOT3D\n.p\n~PLOT3D is the 3-d version of PLOT.  A relative ~rotation matrix and\n~origin is maintained (separate from viewing matrix and PLOT parameters).\nBy setting the plotting option flag i in ~INIT3D to -1, plotting will be\ninhibited.  A common block, CPLOT3D, returns a 4 element vector V\nwith the screen transformed coordinates. \nPLOT3D transforms the 3d input coordinates\nto 2d coordinates, clips to a 3d clipping window, and calls ~PLOT with\nthe 2d coordinates screen coordinates of the visible line segments.\n.x screen coordinates\n.lit\n\nCALL PLOT3D (x,y,z,i)\n\nx,y,z (R): coordinates of point (in 3 space)\ni     (I): plot function parameter\n           =  0: color control\n                  x is the line color \n                  if x < 0 the screen is cleared\n                  if x >= 0 2d plot angle (PLOT) becomes y\n           = -1: change relative scale factor by x\n           =  1: change relative rotation matrix\n                   rotate x degrees CCW around x axis\n                   rotate y degrees CCW around y axis\n                   rotate z degrees CCW around z axis\n           =  2: draw to (x,y,z) with 'pen down'\n           = -2: same as i=2. (x,y,z) becomes new origin\n           =  3: move to (x,y,z) with 'pen up'\n           = -3: same as i=3. (x,y,z) becomes new origin\n           =  9: erase to (x,y,z) (erase is color 0)\n           = -9: same as i=9. (x,y,z) becomes new origin\n\ncommon /CPLOT3D/V(4) : returned screen coordinates (x,y) of last\n                       call to PLOT3D  v(1)=x, v(2)=y\n.end lit\n\n.hl2 SUBROUTINE SYM3D\n.x SYMBOL\n.p\n~SYM3D plots an ~ASCII string (see SYMBOL) in 3-d using\nPLOT3D.  The ~symbols are plotted in the plane defined by a,b,g.\n.lit\n\nCALL SYM3D (x,y,z,a,b,g,s,n)\n\nx,y,z (R): lower-left corner of string\n           If x=999, y=999, z=999 then string is continued from\n           lower right of previous SYM3D or NUM3D call\na,b   (R): angles from the x-y, x-z planes (in deg) of the ray\n           from (x,y,z) along the base of the character string\ng     (R): angle of rotation about the ray defined by a,b (deg)\nh     (R): height of the string to be plotted\ns     (B): alpha array containing the text to be plotted (byte array)\nn     (I): number of characters in string s\n.end lit\n\n.hl2 SUBROUTINE WHERE3D\n.p\n~WHERE3D returns the 2d screen coordinates of the last line drawn using\nPLOT3D.\n.lit\n\nCALL WHERE3D (x,y)\n\nx,y   (R): (returned) screen coordinates of last point\n.end lit\n\n.hl1 INIT3DH Routines\n.p\nThe family of plotting routines included in the hidden line 3-d\npackge INIT3DH include:\n.s1\n.ls0\n.le;PLT3DH  -- the central visible line plot routine for INIT3DH\n.le;SKETCH  -- the central hidden line plot routine for INIT3DH\n.le;AXIS3DH -- plots axes using PLT3DH or SKETCH\n.le;CUBE    -- plots the polygons of the sides of a \"cube\"\n.le;SYM3DH  -- plots symbols using PLT3DH or SKETCH\n.le;WHERE3H -- returns the screen coordinates of the last PLT3DH call\n.le;XFRM3D  -- transforms a point (x,y,z) into the perspective point\ndefined by INIT3D.\n.els\n.x hidden line removal\n.p\nThe central hidden line plot routine SKETCH is an adaptation of the\n~COSMIC routine ARC-11446 hidden line code.  It has been modified\nand extended for additional features.  The INIT3DH can be used either\nwith or without the hidden line removal.  However, the memory and\ncomputational requirements for hidden line removal can be large for\ncomplicated scenes.  Essentially, planar polygons are defined and\nentered into the SKETCH internal list. Upon the last call to\n~SKETCH the visible lines are plotted using PLOT.  Line segments can also be\nentered into the SKETCH list prior to the last call.  They will not\n\"hide\" any other lines but can be hidden by planes.  The SKETCH\nroutine can be set to plot both visible and invisible lines.\n~PLT3DH does not use SKETCH.  Lines plotted with PLT3DH will always\nbe visible.  The auxilary routines (NUM3DH, AXIS3DH, and SYM3DH)\nhave options to either use ~SKETCH or PLT3DH.\n.p\nFor an example of the use of the ~INIT3DH package see the ~EXAMP3DH\nprogram included with the LONGLIB graphics library package \nor see the ~MASTER routines TRIG3DH, HIST3D, or T3DH.\n.x TRIG3DH\n.x T3DH\n.x HIST3D\n\n.hl2 SUBROUTINE INIT3DH\n.p\n.x hidden line removal\n~INIT3DH sets the relative ~origin and ~scale ~factor of the 3-d \npackage which includes hidden line removal. These functions are distinct\nfrom the functions of PLOT or PLOT3D.  INIT3DH may be called at any time\nto reset these functions without closing the plot package.  However, a\ncall to INIT3DH resets the internal SKETCH list of polygons.  The plot\npackage must be opened with FRAME prior to a call INIT3DH.  INIT3DH must\nbe called prior to SKETCH or PLT3DH.  ~SKETCH uses an internal common\nblock for storage of its internal list.  The user is required to provide\nsufficient common block storage space.  This common block is defined:\n.lit\n\n        COMMON /GO/ ISIZE, WORK(ISIZE)\nwhere\n        ISIZE >=(25 + 5*MNE + 4*(2+MNE+2*MNH))*NPOLYS\n        MNE   = maximum number of edges per polygon\n        MNH   = maximum number of edges per polygon\n        NPOLYS= maximum number of polygons\n\n.end lit\nIf SKETCH is not used, this common block need not be dimensioned.\nNote that ISIZE must be given a value in the user's code.\n.p\nThe angles ya,ro,pi are defined as the sequence of rotations ya-ro-pi\n(yaw, roll, and pitch)\nwhere ya is the angle or rotation about the z axis (positive is\nfrom x to y).  ro is the angle of rotation about the x axis\n(positive is from y to z). pi is the angle of roation about the y\naxis (positive is from z to x).\n.lit\n\nCALL INIT3DH (x,y,z,ya,ro,pi,zom,ds,mne,mnh)\n\nx,y,z    (R): coordinates of relative origin\nya,ro,pi (R): yaw, roll, pitch angles (Eulerian) in degrees\n              (see above for angle definitions)\nzom      (R): relative scale factor\nds       (R): viewing distance (9999. = infinity or no pespective)\nmne,mnh  (I): maximum number of edges and holes on one polygon\n.end lit\n\n\n.hl2  SUBROUTINE AXIS3DH\n.x SKETCH\n.x NUM3DH\n.x SYM3DH\n.x hidden line removal\n.x AXIS3\n.p\n~AXIS3DH plots an axis and its markings in 3-d.  In order to draw a \ncoordinate system, the routine has to be called separately for the x,\ny, and z axis.  A possible exponent is determined and placed behind the\naxis labelling in the form of 10**n in the auto scaling mode.  AXIS3DH\ncalls ~PLT3DH or SKETCH, NUM3DH, and SYM3DH.  See AXIS3.\n.lit\n\nCALL AXIS3DH (x,y,x,a,b,g,s,n,ale,xm,xx,t,c,f,i)\n\nx,y,z (R): location of start of axis \na,b   (R): angles from the x-y, x-z planes (in deg) of the ray\n           from (x,y,z) along the character string \ng     (R): angle of rotation about the ray defined by a,b (deg) \ns     (B): alpha string containing the axis title\nn     (I): number of characters in the string\n           > 0 : axis label on positive side (anti-clockwise)\n           < 0 : axis label on negative side (clockwise)\n (100's digit) = 0 : labeled axis\n               = 1 : line and ticks only--no labeling\nale   (R): length of axis \n           > 0 : tick marks placed same side of axis as title\n           = 0 : no action\n           < 0 : tick marks placed opposite side of axis from title\nxm    (R): value of first marking on the axis\nxx    (R): value of last marking on the axis\nt     (R): number of tick marks \n           specification is coded in the form MMM.mmss where\n           MMM is the number of major tick marks ( MMM > 0), mm is\n           the number of minor tick marks between major tick marks\n           (100 > mm => 0), and ss is the number of subminor tick\n           marks between minor tick marks (100 > ss => 0).\n           (example 1.0102 produces I_._._i_._._I)\nc     (R): size of characters \n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nf     (R): number label format (see NUMBER) \ni     (I): hidden line option flag\n           = 0 : use PLT3DH\n           = 1 : use SKETCH\n.end lit\n\n\n.hl2  SUBROUTINE CUBE\n.p\n~CUBE plots the 6 surface polygons of a 3-d \"cube\" into the\n~INIT3DH 3-d plotting package. Either ~SKETCH or ~PLT3DH may be used.\n.lit\n\nCALL CUBE (x1,x2,y1,y2,z1,z2,i,h)\n\nx1,y1,z1 (R): corner of cube\nx2,y2,z2 (R): oposite corner of \"cube\" from corner 1\ni        (I): SKETCH flag for last SKETCH call in routine\n              Note: (returned) value is the SKETCH return\nh        (L): hide flag\n              = .TRUE.   SKETCH routine used\n              = .FALSE.  PLT3DH routine used\n.end lit\n\n.hl2 SUBROUTINE NUM3DH\n.p\n.x SKETCH\n.x number\n.x hidden line removal\n~NUM3D plots a floating point number (see NUMBER) in 3-d using either \n~PLT3DH or SKETCH.  The symbols are plotted in the plane defined by a,b,g.\n.lit\n\nCALL NUM3DH (x,y,z,a,b,g,f,e,i)\n\nx,y,z (R): lower-left corner of string\n           If x=999, y=999, z=999 then string is continued from\n           lower right of previous SYM3DH or NUM3DH call\na,b   (R): angles from the x-y, x-z planes (in deg) of the ray\n           from (x,y,z) along the base of the character string\ng     (R): angle of rotation about the ray defined by a,b (deg)\nh     (R): height of the number to be plotted\nf     (R): alpha array containing the text to be plotted (byte array)\ne     (R): format of number representation n.j \n           (see NUMBER)\ni     (I): hidden line option flag\n           = 0 : use PLT3DH\n           = 1 : use SKETCH\n.end lit\n\n.hl2 SUBROUTINE PLT3DH\n.p\n.x hidden line removal\n~PLT3DH is a routine which operates in a similar as PLOT but in 3-d.\nIt is, however, independent of PLOT3D.  A relative ~origin is\nmaintained (separate from the PLOT routine parameters) which is\ninitalized by INIT3DH.  PLT3DH calls PLOT after transforming (x,y,z).\nPLT3DH is also independent of the ~SKETCH routine.  Lines plotted with\nPLT3DH are always completely visible.\nTo use the hidden line removal SKETCH must be used.\n.lit\n\nCALL PLT3DH (x,y,z,i)\n\nx,y,z (R): coordinates of point (in 3 space)\ni     (I): plot function parameter\n           =  0: line color control\n                  x is the line color\n                  if x < 0 screen is cleared\n                  if x >= 0 plotting angle (in PLOT) becomes y\n           =  2: draw to (x,y,z) with 'pen down'\n           = -2: same as i=2. Point (x,y,z) becomes new origin\n           =  3: move to (x,y,z) with 'pen up'\n           = -3: same as i=3. Point (x,y,z) becomes new origin\n           =  9: erase to (x,y,z) (erase on Ramtek is color 0)\n           = -9: erase to (x,y,z) becomes new origin\n.end lit\n\n.hl2 SUBROUTINE SKETCH\n.p\n.x hidden line removal\n~SKETCH is the central plot routine for hidden line removal 3-d plotting.\nSKETCH is called for each ~polygon or line segment.  Each polygon or\nline segment is described by a set of points in (x,y,z) arrays.\nFor polygons,\nthese should be in either clockwise or counter-clockwise direction with\nthe last point equal to the first.  Holes in polygons are created by\ncontinuing the last outer edge point (which is also the first outer edge\npoint) to the inner hole edges and back.  The option flag, i, should be 0\nfor all but the last polygon.  When i=0, SKETCH stores the input polygons.\nWhen i is set to be 1, the resulting scene visible lines are computed and\nplotted by calls to PLOT.  This process may take considerable cpu time\nas well as memory storage space when the number of polygons is large.\nThe maximum number of edges of a polygon is 160.\n.p\nNote that SKETCH requires a large working area in a named ~COMMON area\ndescribed in INIT3DH.  Note SKETCH will fail if the memory limits are\nexceeded.  For the most part an error flag will be set.  Ocassionally,\nthe scene will be corrupted when the memory limits are exceeded without\nthe error flag being set.\n.lit\n\nCALL SKETCH (x,y,z,np,i)\n\nx,y,z   (R): arrays contain polygon edges (max 160)\nnp      (I): number of points in x,y, and z\ni       (I): option flag.  Should be 0 for all input polygons\n             except the last, when it should be 1. \n\n             (Note: if i+10 is used for i then the first z value\n              is used for all (x,y) points.)\n\n             i set to -1 (returned) if a memory error occurs\n.end lit\n\n.hl2 SUBROUTINE SYM3DH\n.x SKETCH\n.x SYMBOL\n.x hidden line removal\n.p\n~SYM3DH plots an ASCII string (see SYMBOL) in 3-d using either ~PLT3DH\nor SKETCH.  The symbols are plotted in the plane defined by a,b,g.\n.lit\n\nCALL SYM3DH (x,y,z,a,b,g,s,n,i)\n\nx,y,z (R): lower-left corner of string\n           If x=999, y=999, z=999 then string is continued from\n           lower right of previous SYM3DH or NUM3DH call\na,b   (R): angles from the x-y, x-z planes (in deg) of the ray\n           from (x,y,z) along the base of the character string\ng     (R): angle of rotation about the ray defined by a,b (deg)\nh     (R): height of the string to be plotted in plot units\ns     (B): alpha array containing the text to be plotted\nn     (I): number of characters in string s\ni     (I): hidden line option flag\n           = 0 : use PLT3DH\n           = 1 : use SKETCH\n.end lit\n\n.hl2 SUBROUTINE WHERE3H\n.x PLT3DH\n.p\n~WHERE3H returns the 2d screen coordinates of the last point in a call to\nPLT3DH.\n.lit\n\nCALL WHERE3H (x,y)\n\nx,y      (R): screen coordinates of last point of call to PLT3DH\n.end lit\n\n.hl2 SUBROUTINE XFRM3D\n.p\n~XFRM3D uses the same scaling and origin as PLT3DH and SKETCH to\ntransform a 3-d points to screen (PLOT) coordinates.\n.lit\n\nCALL XFRM3D (x,y,z,x1,y1,z1)\n\nx,y,z    (R): input coordinates of point (in 3 space)\nx1,y1,z1 (R): (returned) transformed coordinates of point (in 3 space)\n.end lit\n\n\n.CHAPTER Cursor Routines\n.x INXTCHR\n.p\nThe routines described in this chapter provide interactive cursor control.\nWhen supported by the terminal, the Tektronix Graphics Inputs (GIN), \nBITCURSOR or GETCURSOR, routines can be used.  If the terminal has\na VT100-compatible text mode, the routines CURMOTION, CURRECT, and CURBAND,\ncan be used to simulate a GIN device.  These routines use the VT100\nkeypad and cursor keys.  They rely on a machine-dependent routine\n(INXTCHR) to read escape characters from the terminal.  CURMOTION,\nCURRECT, and CURBAND return the internal screen \"resolution\" used\nin computing the location of the cursor.  This may not correspond to the\nactual hardware resolution of the terminal screen.\n.p\nThe routine CURLOCATE provides\na technique for placing a fixed \"cursor mark\" on the screen.\n.p\nA program CURTEST is provided to test and evaluate these cursor routines.\n\n.hl1  SUBROUTINE BITCURSOR\n.x cursor\n.x graphics tablet\n.x bit pad one\n.x vt125\n.p\n~BITCURSOR moves a cross-hair cursor on a VT100 equipped with a retro-graphics\ncard (VT125) and a BIT PAD ONE graphics tablet.  The VT125 is used in the\nTek 4010 mode with a graphics point returned when a key is pressed on the\nbit pad puck (or stylus).\n.lit\n\nCALL BITCURSOR (x,y,k,rx,ry)\n\nx,y (R): (returned) selected cursor position (in plot units)\nk   (I): (returned) key code\n         = 0  (Z) key pressed on bit pad puck\n         = 1  (1) key pressed on bit pad puck\n         = 2  (2) key pressed on bit pad puck\n         = 3  (3) key pressed on bit pad puck\nrx  (R): resolution of screen in x direction (returned)\nry  (R): resolution of screen in y direction (returned)\n.end lit\n\n.x cursor\n.hl1 SUBROUTINE CURLOCATE\n.p\n~CURLOCATE produces a simulated \"x\" cursor mark on the screen graphics\ndevice (~Ramtek or ~terminal device)\nWhen only the metafile is initialized a call to CURLOCATE is a dummy call.\nThe terminal takes precidence over the Ramtek when both are in use.\nErasure of cursor on requires the correct location where it was first plotted.\nCURLOCATE uses the ~XOR capbility of graphics terminal to place and\nremove the cursor.  If the terminal has neither erase or XOR capability,\nthe graphics cursor can not be erased without clearing the entire screen.\nIf the (x,y) position is off the screen, the cursor will be located on \nclosest edge of the screen to the desired point.\n.lit\n\nCALL CURLOCATE (x,y,n,ir)\n\nx,y (R): cursor position\nn   (I): cursor number/size (0-4)\n         < 0  erase cursor\n         > 0  locate cursor\nir  (I): Ramtek cursor control (recognized if Ramtek is output)\n         = 0 Ramtek cursor device used\n         = 1 plotted Ramtek cursor mark used\n.end lit\n\n.hl1  SUBROUTINE CURMOTION\n.p\n~CURMOTION produces a graphics ~cursor on the ~Ramtek or ~terminal\nWhen no screen devices are initialized a call to CURMOTION is a dummy call.\nTerminal is used in preference to Ramtek.  \nThis routine is supported only on terminals which can emulate the VT100\nnumeric keypad.  The terminal text cursor and VT100 numeric keypad\nkeys are used to move the graphics cursor to a desired location and\na return function key is pressed to select the cursor location.  Only\n<space>, <return>, PF keys and the numeric key pad keys will be recognized\nas return command keys.  PF1 changes the cursor step movement size in three\nsizes. As this happens the cursor changes sizes on the screen.\nThe cursor position is typed to the terminal when the Ramtek is used.\nThe cursor is moved in multiples of the pixel resolution.  The\nformula below shows the conversion.  All other PF keys and the numeric\nkey pad keys will return the arguments shown below.  Other keys are\nnot recognized.  NOTE: The input buffer is 128 characters.  If you exceed\nthis buffer the program may bomb.  Each cursor key input uses 3 characters.\n.lit\n\n     pixel number = (scalefactor * x + origin)/pixelresolution\n\n.end lit\n.lit\nCALL CURMOTION (x,y,is,rx,ry)\n\nx,y (R): (returned) selected cursor position\nis  (I): (returned) status flag\n         < 0  error\n         = 0  return key pressed\n         = 1  space key pressed\n         = 2,3,4 PF2,PF3,PF4 keys on VT100 pressed\n         = 10...19 VT100 numeric key pad keys 0...9 pressed\n         = 20 numeric key pad period key pressed\n         = 21 numeric key pad enter key pressed\n         = 22 numeric key pad comma key pressed\n         = 23 numeric key pad dash key pressed\nrx  (B): resolution of screen in x direction (returned)\nry  (R): resolution of screen in y direction (returned)\n.end lit\n\n.hl1 SUBROUTINE CURBAND\n.p\nCURBAND is similar to the ~CURMOTION subroutine except that two\nlines are \"rubber banded\" with the simulated cursor motion.  This\nroutine is supported only on terminals which can emulate the VT100\nnumeric keypad.  The line segment rubberbanding can be disabled if desired.\n.lit\n\nCALL CURBAND (x,y,is,rx,ry,x1,y2,x2,y2)\n\nx,y   (R): (returned) selected cursor position\nis    (I): (returned) status flag\n           < 0  error\n           = 0  return key pressed\n           = 1  space key pressed\n           = 2,3,4 PF2,PF3,PF4 keys on VT100 pressed\n           = 10...19 VT100 numeric key pad keys 0...9 pressed\n           = 20 numeric key pad period key pressed\n           = 21 numeric key pad enter key pressed\n           = 22 numeric key pad comma key pressed\n           = 23 numeric key pad dash key pressed\nrx    (R): resolution of screen in x direction (returned)\nry    (R): resolution of screen in y direction (returned)\nx1,y1 (R): starting point of rubber banded line 1\n            if x1=999, this line segment is not used\nx2,y2 (R): starting point of rubber banded line 2\n            if x2=999, this line segment is not used\n.end lit\n\n.hl 1 SUBROUTINE CURRECT\n.p\n~CURRECT is similar to the ~CURBAND subroutine except that a\n~rectangle is moved with cursor motion.  This\nroutine is supported only on terminals which can emulate the VT100\nnumeric keypad.\n.lit\n\nCALL CURRECT (x,y,is,rx,ry,x1,y2,x2,y2)\n\nx,y   (R): (returned) selected cursor position/start position\nis    (I): (returned) status flag\n           < 0  error\n           = 0  return key pressed\n           = 1  space key pressed\n           = 2,3,4 PF2,PF3,PF4 keys on VT100 pressed\n           = 10...19 VT100 numeric key pad keys 0...9 pressed\n           = 20 numeric key pad period key pressed\n           = 21 numeric key pad enter key pressed\n           = 22 numeric key pad comma key pressed\n           = 23 numeric key pad dash key pressed\nrx    (R): resolution of screen in x direction (returned)\nry    (R): resolution of screen in y direction (returned)\nx1,y1 (R): lower left corner of rectangle\nx2,y2 (R): upper right corner of rectangle\n.end lit\n\n.hl  SUBROUTINE GETCURSOR\n.p\n~GETCURSOR inquires the ~Tektronix GIN device for the location\npointed to by the GIN device.  Return code is screen device\ndependent.  This routine is does support all screen devices.  When\na device is not supported, the routine returns without doing anything.\nScreen device must be in the graphics mode.  \nGETCURSOR assumes that the ~GIN terminator is a CR (carriage return).\nNote: When using an Alpha\nkey for the return status DO NOT use the <Return> key as this will prevent\nthe correct reading of the returned data.\n.lit\n\nCALL GETCURSOR (x,y,k,rx,ry)\n\nx,y (R): (returned) cross-hair location (in LONGLIB coordinates)\nk   (I): (returned) GIN status code return (ascii code)\nrx  (R): resolution of screen in x direction (returned)\nry  (R): resolution of screen in y direction (returned)\n.end lit\n\n.CHAPTER MAP SUBROUTINES\n\n.x map routines\n.x earth.dat\n.x lndsea1.dat\n.p\nLONGLIB also supports the plotting of maps of the physical earth's surface\nby providing map routines.\nTwo data files (EARTH.DAT and LNDSEA1.DAT) are included in the LONGLIB\ngraphics library package.  EARTH.DAT contains the digitized locations of\nthe edges of the earth's landmasses.  It forms the basis of a set of \nEARTH OUTLINE map routines discussed below.  LNDSEA1.DAT contains a bit map\nof land/sea areas.  It forms the basis of the LAND AREA map routines discusses\nin the second section.\n.p\nNote: these routines assume that the plot package has already been opened.\n\n.hl 1 EARTH OUTLINE MAPS\n.p\nTo date only a small number of routines have been generated for using this data\nfile but more will be added in the future.  Current routines allow for\nplotting the ~earth outline map in 3d or in a linear projection.\n.p\nA data file (EARTH.DAT) which contains a ~map of the land/ocean interface\nand a set of routines to access this data has been included in the LONGLIB\ngraphics library.  The data file (of unknown origin) contains a list of\nlatitudes and longitudes of the land/ocean edges at about a 10 km resolution.\nIt is only a geographic map and does not contain political boundries.\nAlthough imperfect, it is more than adequate for map drawing, etc.\nDue to the high resolution, the EARTH.DAT file contains a lot of pen\nmotions, requiring a long plotting time.\n.p\nFortran file unit 2 should be reserved for accessing the map data\nfile by these routines.  The logical name ~LONGLOC: must be assigned\nto be the location of the EARTH.DAT file.\n.p\nRoutines using the land outline file include those for plotting on\n3d spheres, flat surfaces, etc.\n\n.hl 2 SUBROUTINE EARTH3D\n.p\n~EARTH3D permits 3d plotting of the earth land map.  This routine\nuses the ~INIT3D and ~PLOT3D 3d graphics package.  It will plot the\nentire earth map with the option of either a spherical earth or\nan ellipsoidal earth.  The radius may be specified.  The transformation\nfrom a latitude/longitude pair (a,b) in radians on the earth's suface to the\n3d plotting vector v is:\n.lit\n\n        rad = r * (1 - f*sin(a))\n        call sprect1(v,b,a-pi/2,rad)\n        call plot3d(v(1),v(2),v(3),2)\nwhere\n        pi = 3.141592654\n        v is dimensioned v(3)\n.end lit\n.lit\n\nCALL EARTH3D(r,f)\n\nr   (R): nominal earth radius (in plotting units)\nf   (R): earth flatness\n         = 0 for spherical earth\n         = 3.3528132e-3 for an ellipsoidal earth\n.end lit\n\n.hl 2 SUBROUTINE LANDMAP\n.x projection\n.p\n~LANDMAP plots the earth land map using a linear projection.  The latitude\nand longitude are assumed to be a linear grid on a flat surface.\nThis routine will plot the entire map surface.  Use\nof the PLOT routine clipping option will permit plotting only limited\nof the map surface if desired.  The transformation of a latitude/longitude\npair (a,b) in degrees to an (x,y) pair for plotting is:\n.lit\n\n        x = (b - s) * long / 360\n        y = (a + 90) * lat / 180\n.end lit\n.lit\n\nCALL LANDMAP(alat,along,s)\n\nalat,along (R): latitude, longitude scale factor (degrees/plot unit)\ns          (R): longitude of left-mode edge of map (-180 to +180)\n.end lit\n\n.hl 2 SUBROUTINE POLARMAP\n.x projection\n.p\n~POLARMAP plots the earth land map using a polar projection.  The latitude\nis plotted as a linear radius. This routine will plot the entire northern\nor southern hemisphere.  The transformation from a visible point (in the\nappropriate hemisphere) latitude/longitude pair (a,b) in degrees to a\nplotted (x,y) pair is:\n.lit\n\n        a = b * sgn(r) + a\n        x = cos( a * pi / 180) * r / 90 + x0\n        y = sin( a * pi / 180) * r / 90 + y0\nwhere\n        pi = 3.141592654\n.end lit\n.lit\n\nCALL POLARMAP(x0,y0,r,a)\n\nx0,y0  (R): pole location (in plot units)\nr      (R): radius of equator (in plot units)\n            > northern hemisphere\n            < southern hemisphere\na      (R): angle of prime meridian from horizontal (deg CCW)\n.end lit\n\n.hl 2 SUBROUTINE SPRECT1\n.p\n~SPRECT1 converts a ~spherical coordinate value (in a latitude/longitude\nstyle spherical system) to ~rectangular coordinates.\nThe transformation from a latitude/longitude pair (a,b) in degrees to a\nrectangular (x,y) pair is:\n.lit\n\n        a = b * sgn(r) + a\n        x = cos( a * pi / 180) * r / 90 + x0\n        y = sin( a * pi / 180) * r / 90 + y0\nwhere\n        pi = 3.141592654\n.end lit\n.lit\n\nCALL SPRECT1(v,t,p,r)\n\nv  (R): output vector containing rectangular (z,y,z) coordinates\n        dimensioned v(3) (returned)\nt  (R): theta (longitude) angle (rad)\np  (R): phi (latitude) angle (rad)\nr  (R): radius\n.end lit\n\n.HL1 Land Area Map Routines\n.x LNDSEA\n.p\nThe LNDSEA1.DAT file contains a bit ~map of the land/sea area of the earth.\nUsing the file, a specified point of latitude and longitude can be\ndetermined to be land or sea.\nA routine, LNDSEA, opens the file and provides a flag to indicate\nif the specified point is land or sea.\n.p\nFortran file unit 1 should be reserved for accessing the map data\nfile by these routines.  The logical name ~LONGLOC: must be assigned\nto be the directory containing the LNDSEA1.DAT file.\n\n.hl 2 LNDSEA1.DAT Format\n.p\nThe LNDSEA1.DAT is a direct access file is a world land/sea map\nquantized to every 1/12 degree of\nboth latitude and longitude.  An individual bit is used to indicate whether\na particular point is land or sea.  The data is stored as 648 records\neach of which contains all of the data for a 10 degree by 10 degree square.\nEach record consists of 14400 (120*120) bits stored 30 bits per word\n(4 words per each 1/12 degree strip of data).\nThe first word of the record indicates whether the entire 10 by 10 square\nis all land or water using the following definition:\n.lit\n\n   -1 : square contains both land and sea\n    0 : square contains all land\n    1 : square contains all water\n\n.end lit\nThe next 4 words in each record are the bits for the bottom 1/12 degree\n(lowest latitude) row of the 10 degree by 10 degree square with \nlongitude bins left to right.  For each bit a 0 indicates land and a\n1 indicates water.  The records are ordered:\n.lit\n\n record #  Latitude range  Longitude range\n_________ _______________ _________________\n\n   1        -90 to -80         0 to  10\n   2        -90 to -80        10 to  20\n   .            .                .\n  35        -90 to -80       340 to 350\n  36        -90 to -80       350 to 360\n  37        -80 to -70         0 to  10\n  38        -80 to -70        10 to  20\n   .            .                .\n 648         80 to  90       350 to 360\n.end lit\n.p\nSee the source code for ~LNDSEA function for additional information.\n\n.hl 2 SUBROUTINE BITMAP\n.x projection\n.p\n~BITMAP plots a land area by testing each point of the area using LNDSEA.\nThe plotting area is segmented into (nx X ny) regions.  Each point is tested\nfor the presence of land/sea.  For each resolutoin line of latitude,\na horizontal line is drawn through all points that are land (or sea as desired).\nA linear projection is used.  The latitude\nand longitude are assumed to be a linear grid on a flat surface.\nThis routine will plot the entire map surface.  Use\nof the PLOT routine clipping option will permit plotting only limited\nof the map surface if desired.  The transformation of a latitude/longitude\npair (a,b) in degrees to an (x,y) pair for plotting is:\n.lit\n\n        x = (b - s) * along / 360\n        y = (a + 90) * alat / 180\n.end lit\n.lit\n\nCALL BITMAP(alat,along,s,nx,ny,i)\n\nalat,along (R): latitude, longitude axis length (plot units)\ns          (R): longitude of left-mode edge of map (-180 to +180)\nnx,ny      (I): x,y resolution specified as the number of lat/longs\n                to test for land/sea\ni          (I): plot flag\n                = 0 plot land area\n                = 1 plot sea area\n.end lit\n\n.hl 2 INTEGER FUNCTION LNDSEA\n.x projection\n.p\n~LNDSEA tests the point (lat, long) for land/sea using the LNDSEA1.DAT file.\nIt returns a 0 for land, 1 for sea.  Uses Fortran file unit 1.\n.lit\n\niflag = LNDSEA(alat,along)\n\nalat  (R): latitude (-90. to +90. degrees)\nalong (R): longitude (0. to +360. degrees)\niflag (I): land/sea flag (returned)\n           = -1 : error\n           =  0 : land\n           =  1 : sea (ocean, lake, sea)\n.end lit\n\n\n.chapter MASTER Subroutines\n\n.p\nBy popular request, a set of the most commonly used general-purpose\nsubroutines for complete function plots, charts, etc.,\nwere included in the LONGLIB graphics library.  \nThese subroutines are called \"MASTER\" Subroutines.\nEach of these subroutines is self contained.  When called, it\nwill initialize the plotting package, plot the required data,\nand close the plotting package.   Normally,\nonly one ~MASTER subroutine is called in a program.\nHowever, options are available for\nmultiple calls to MASTER subroutines.\nWhen the LONGLIB is initialized by a MASTER subroutine (which calls FRAME)\na metafile using Fortran file unit 3 is always created.\n.p\nProgramming examples using MASTER routines are given in the chapter\non programming examples.\n.p\nTo call a MASTER subroutine more than once in\na program the option flag must be set negative for all calls\nbut the last one which should be positive.  (See also the PLOTTESTS program.)\nTo use more than one MASTER subroutine in a program:\n.ls.dle'(',,')'\n.le; On first MASTER subroutine call \nset the option flag negative--this does not close plot package.\n.le; on all additional calls to\nMASTER subroutines set the option negative and greater than 10000--this\nprevents re-opening plot package and does not close it.\n.le; On the last call to a MASTER subroutine set option flag positive\nbut greater than zero--this closes plot package.\n.els\n.p\nIn summary, when LONGLIB is already open set the magnitude of the option flag\nto greater than 10000.  To prevent closing the plot package set option\nflag negative.\nWhen the plot package is closed in a MASTER subroutine CTERM(-2) is used\nto ask if a termina lscreen clear (terminal plotting only) should be done.\nMASTER subroutines always return the terminal to the text mode after call.\nWhen color options are enabled, the color marked \"(return)\" is\nthe color in current use after call.\n.p\nNote: when passing varables ~ASCII strings do not use ~VAX ~FORTRAN \n~CHARACTER data type.  Use ~BYTE data type arrays or use %REF(). See\nthe comments under the section on machine dependency and the introduction\nto the plot routine section.\n.x common block\n.p\nMost MASTER subroutines have\n~common blocks with the same name prefixed with the letter\n\"C\" which contain the scaling information used to plot\nthe data line. This can be useful for plotting additional annotations,\netc.\n.p\nThe following pages document the currently defined MASTER Subroutines. \nAdditional subroutines may be added as suggested by the users.\n\n.hl1 MASTER Routine Index\n.p\nThe sections that follow detail each MASTER routine.  A brief index\nof the capabilities of each Master routine is given below.  To select\na MASTER routine, determine the category of plotting needed and\nlook at the available MASTER routine capabilities.  For general purpose\nline plotting where flexibility in specifying the axes,\nthe routine GLPLOT is recommended.\n\n.tp4\n.hl 2 Pie Chart\n.ls0\n.le; PICHRT\n.els\n\n.tp4\n.hl 2 Bar Chart\n.ls0\n.le; BARCHR   (can fill area between lines)\n.els\n\n.tp4\n.hl 2 Single linear/linear line\n.ls0\n.le; PLOTSC (simple)\n.le; GLPLOT (flexible axis specification)\n.le; PLOTLGXL (allows log lines, software line types)\n.le; LSPLOT (options via array)\n.els\n\n.tp4\n.hl2 Two linear/linear lines on the same plot\n.ls0\n.le; PLOTSC2  (simple)\n.le; GLPLOT   (flexible axis specification)\n.le; PLOTLG2  (allows log lines)\n.le; PLOTLGX  (allows log lines, flexible axis specification)\n.le; PLOTLGXL (allows log lines, software line types)\n.le; BARCHR   (can fill area between lines)\n.le; LSPLOT (options via array)\n.els\n\n.tp4\n.hl2 Multiple linear/linear lines on the same plot\n.ls0\n.le; GLPLOT   (more complex but flexible axis specification)\n.le; PLOTLGX  (allows log lines, flexible axis specification)\n.le; PLOTLGXL (software line types)\n.le; SEISPL   (special options)\n.le; SPLOTS   (can show error bars)\n.le; SPLOTSX  (can show error bars with flexible axis)\n.le; BARCHR   (can fill area between lines)\n.le; LSPLOT (options via array)\n.els\n\n.tp4\n.hl2 Multiple log/linear or log/log lines on the same plot\n.ls0\n.le; PLOTLG  (relatively simple)\n.le; PLOTLGX (more complex, flexible axis specification)\n.le; LSPLOT (options via array)\n.els\n\n.tp4\n.hl2 Scatter plot\n.ls0\n.le; SCATPL\n.le; SPLOTS  (can show error bars)\n.le; SPLOTSX (can show error bars with flexible axis)\n.le; SEISPL  (special options)\n.le; LSPLOT (options via array)\n.els\n\n.tp4\n.hl2 1-d Histogram\n.ls0\n.le; PHIST  (can show mean/standard deviation)\n.le; BARCHR (bar chart)\n.els\n\n.tp4\n.hl2 Lines/points with error bars\n.ls0\n.le; SPLOTS (simple)\n.le; SPLOTSX (flexible axis specification)\n.le; LSPLOT (options via array)\n.els\n\n.tp4\n.hl2 Special plot formats\n.ls0\n.le; SEISPL (forms used in seismic data plots)\n.le; BARCHR (bar chart)\n.le; PICHRT (pie chart)\n.le; LSPLOT (options via array)\n.els\n\n.tp4\n.hl2 Contour Plot with equally spaced data\n.ls0\n.le; CNTRLN (simple, robust)\n.le; LCNTR  (simple, less-robust, contour line types and labels)\n.els\n\n.tp4\n.hl2 Contour Plot with unequally spaced data\n.ls0\n.le;CNTLN  (triangulates points then contours)\n.els\n\n.tp4\n.hl2 3-d Surface slices\n.ls0\n.le; VAX3D  (simple)\n.le; VAX3DX (more complex, with flexible axis specification)\n.els\n\n.tp4\n.hl2 3-d Surface mesh (no hidden line removal):\n.ls0\n.le; MESH3D  (simple)\n.le; MESH3DX (more complex, with flexible axis specification)\n.els\n\n.tp4\n.hl2 3-d Surface mesh (hidden line removal)\n.ls0\n.le; MVAX3D  (simple)\n.le; MVAX3DX (more complex, with flexible axis specification)\n.els\n\n.tp4\n.hl2 3-d Surface mesh with contour plot (hidden line removal)\n.ls0\n.le; CVAX3D  (simple)\n.le; CVAX3DX (more complex, with flexible axis specification)\n.els\n\n.tp4\n.hl2 3-d Surface triangular mesh (hidden line removal)\n.ls0\n.le; T3DH (uses INIT3DH)\n.els\n\n.tp4\n.hl2 Unequally sampled 3-d Surface (hidden line removal):\n.ls0\n.le; TRIG3DH (uses INIT3DH)\n.els\n\n.tp4\n.hl2 3-d Histogram with hidden line removal\n.ls0\n.le; HIST3D (uses INIT3DH)\n.le; MVAX3D (simple)\n.le; MVAX3DX (more complex, with flexible axis specification)\n.le; CVAX3D (simple, can include contour plot)\n.le; CVAX3DX (with flexible axis specification, with contour plot)\n.els\n\n.tp4\n.hl2 3-d Contour Plot with equally spaced data (no hidden line removal)\n.ls0\n.le; CNT3D  (simple, robust)\n.le; CNT3DX (more complex, with flexible axis specification)\n.els\n\n.tp4\n.hl2 4/5-d Surface plots:\n.ls0\n.le; VAX5D  (slices)\n.le; MVAX5D  (mesh/histogram with hidden line removal)\n.els\n\n\n.pg\n.hl1  SUBROUTINE BARCHR\n.p\n~BARCHR plots a bar chart with optionally shaded bar segments and\ndescriptive legends.  In addition, multiple lines with shading between\nlines can be plotted.  Legend can be automatically placed\nor the user can specify the location of the legend.  In the bar chart\nmode, bars can run vertically or horizontally.\nb(i,j) specifies the ith bar and jth segment of bar (or horizontal line\ndepending on iflag option).  Top of jth segment or height of jth line\nis computed from:\n.lit\n\n                       j\n   yplotted = ylen * (Sum b(i,k) - bm)/(bx-bm)\n                      k=1\n.end lit\n.lit\n\nCALL BARCHR(b,nb,ns,sh,iflag,xl,yl,bm,bx,f,nd,sp,sl,nsl,bl,nbl,cs\n              t,nt,bt,nbt,lt,nlt,tcs,a,d,<ip,<ic>>)\n\nb     (R): bar data array dimensioned b(nb,ns)\nnb    (I): number of bars/number of points in each line\nns    (I): number of segments in each bar/number of lines\nsh    (I): shade option for segment/area between lines\n           dimensioned sh(ns)\n              sh            shade pattern\n             ____       _________________________\n              0               no shading\n              1          -45 deg solid lines\n              2          horizontal solid lines\n              3          +45 deg solid lines\n              4          vertical deg solid lines\n              5          -45 deg dotted lines\n              6          horizontal dotted lines\n              7          +45 deg dotted lines\n              8          vertical deg dotted lines\n              9          +/- 45 deg dotted lines\n             10          vertical/horizontal dotted lines\n             11          +/- 45 deg solid lines\n             12          vertical/horizontal solid lines\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n(magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : color array not used\n                = 2 : color array used\n   (10's)       = 0 : bar chart with vertical bars\n                = 1 : bar chart with horzontal bars\n                = 2 : multiple line chart\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nxlen  (R): length of horizontal axis\n           < 0 : chart is enclosed in a box\n           > 0 : only bottom and left axes plotted\nylen  (R): length of vertical axis\nbm,bx (R): minimum and maximum values to be shown on chart\n           note: if bx=bm, values computed from b array will be used\nf     (R): format for numeric labels on axis (see NUMBER)\nnd    (I): number of divsions of bar length axis\n           < 0 : division lines shown on chart\n           = 0 : no division lines or numeric labels\n           > 0 : division lines shown\nsp    (R): width of bar (ignored for line plot)\n           = 0 : auto scaling with evenly spaced bars\n           > 0 : bars grouped in groups of int(sp).  Each\n                 bar has width frac(sp).\nsl    (C): segment legend labels (CHARACTER data type)\n           dimensioned sl(ns)\nnsl   (I): number of characters to use in plotting sl's\n           = 0 : no label plotted\nbl    (C): bar labels (CHARACTER data type) dimensioned bl(nb)\nnbl   (I): number of characters to use in plotting bl's\n           = 0 : no label plotted\ncs    (R): legend/bar label character height\nt     (B): title string placed on top of chart\nnt    (I): number of characters in t\n           = 0 : no label plotted\nbt    (B): title string placed at base of bars\nnbt   (I): number of characters in bt\n           = 0 : bt not plotted\nlt    (B): title string placed on bar length axis\nnlt   (I): number of characters in lt\n           = 0 : lt not plotted\ntcs   (R): height of title strings\na     (R): legend location/shading box size dimensioned a(3)\n            a(1) : legend box size\n                   < 0 : legend placed to right of chart, a(2)\n                         and a(3) are not used\n                   = 0 : no legend\n                   > 0 : a(2) and a(3) used to locate legend\n            a(2) : x position of lower left corner of legend\n            a(3) : y position of lower left corner of legend\nd     (R): distance between shading lines\n           < 0 : line width array used\n           > 0 : line width array not used\nip    (I): line width array (used only if d<0)\n            p(1) : axis line width\n            p(2) : division line width\n            p(3) : bar outline/data line width\n            p(4) : labeling line width\n            p(5) : title line width (bt,lt)\n            p(6) : title line width (t)\nic    (I): color array (used only if mod(|iflag|,10)=2)\n            c(1) : t title color (return)\n            c(2) : bt title color\n            c(3) : lt title color\n            c(4) : axis numberic label colors\n            c(5) : sl label color\n            c(6) : bl label color\n            c(7) : segment 1 color\n            c(8) : segment 2 color\n            ...         ...\n.end lit\n\n.pg\n.hl 1 SUBROUTINE CNT3D\n.p\nCNT3D plots a simple 3-d contour of equally spaced points with no hidden\nline removal. (see CNT3DX)\n~CNT3D calls CNT3DX using default axis parameters to simplify calling\nprocedure.\n.lit\n\nCALL CNT3D(d,ndx,ndz,nx,nz,a,b,xh,yh,zh,nl,as,ae,ie,iflag,iax,\n              <xt,nxt,xs,xe,yt,nyt,zt,nzt,zs,ze,<dm,dx<,ic>,l>>>)\n\nSee CNT3DX for parameter description.\n (iax is limited to a single digit value)\n.end lit\n.hl 1 SUBROUTINE CNT3DX\n.p\n.x 3-d contour plot\n~CNT3DX is a simple 3-d contour plotting routine.  A 3-d surface is\ncontoured by plotting slices through the surface parallel to the x-z plane\nof the surface which have the same y value.  The input consists of a 2\ndimensional grid of y values.  For each contour level the input array\nis scanned cell-by-cell.  A segment of the contour is determined by linearily\ninterpolating the edges of the square formed by 4 adjacent points (a cell).\nFor example, if the current contour value is 1, and y(1,1)=0, y(1,2)=2,\ny(2,2)=3, and y(1,2)=4, a contour line is assumed to exist for this\ncell as shown:\n.lit\n\n         y(1,2)      y(2,2)\n        *          *\n \n        +\n         \\\n        * +        *\n         y(1,1)      y(1,2)\n\n.end lit\nThis line segment is plotted using the same approach as ~VAX3DX.\nNo hidden line removal is provided.  The calling sequence is nearly\nidentical for both CNT3DX and VAX3DX. The height of plotted contours\nrelative to the y axis is calibrated to z axis so that scale can be\ntaken from the plot.  No perspective is used.  Options exist to vary\nthe plotting angle and to plot axes.  Contour values can be\ndistinguished by color and/or line type.\n.p\nOrigin of the plot is in the lower-left corner.  The x axis runs\nplotted left to right along the plot bottom.  The y axis is plotted\nas a vertical displacement offset by the z axis value.  The z axis appears\nto point into the screen.  This gives the illusion of depth in the plot.\nSee AXIS2 for detailed discription of axis parameters.\n.p\nThe pathological case of two contour lines within a cell may case the\nroutine to incorrectly trace the contour through that cell.\n.lit\n\nCALL CNT3DX(d,ndx,ndz,nx,nz,a,b,xh,yh,zh,nl,as,ae,ie,iflag,iax,\n               <xt,nxt,xs,xe,nmx,nnx,mlx,tsx,ndx,smx,\n                yt,nyt,nmy,nny,mly,tsy,ndy,smy,\n                zt,nzt,zs,ze,nmz,nnz,mlz,tsz,ndz,smz,\n               <dm,dx<,ic>,l>>>)\n\nd        (R): array of y values dimensioned d(ndx,ndz)\nndx,ndz  (I): x and z dimensions of d array\nnx,nz    (I): x and z sizes of surface to plot d array\na        (R): angle of x axis from horizontal 0-85 degrees\nb        (R): angle of z axis from horizontal 0-90 degrees\n              note: origin d(1,1) is in lower-left corner\n              x axis runs left to right on screen\n              y axis runs up to down on screen\n              z axis appears to run into the screen but is angled\n                   to the right\nxh,yh,zh (R): length of each axis\nnl    (I): number of uniformly spaced contour levels,\n           < 0 : max and min of v are used for as, ae\n                 (j)th contour is (j-1)*(ae-as)/(nl-1)+as\n           = 0 : int(ae) specifies the number of contour values\n                 where as is an array of the contour values\n           > 0 : number of uniformly space contour levels,\n                 (j)th contour is (j-1)*(ae-as)/(nl-1)+as\nas    (R): first contour level (nl > 0)\n           array of contour levels (nl=0) dimensioned as(int(ae))\nae    (R): last contour level (nl > 0)\n           number of contour levels in as (nl=0) ae>0\nie    (I): contour edge option flag\n           < 0 contour edge added when surface below contour\n           = 0 no contour edges added\n           > 0 contour edge added when surface above contour\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n(magnitude)  >10000: do not initialize LONGLIB before plotting\n   (1's digit) = 1 : ignor color and line type arrays\n                 2 : use color array but not line type array\n                 3 : ignore color array, use line type array\n                 4 : use color and line type arrays\n   (10's digit)= 0 : Ask which screen device to use\n              <> 0 : Screen Device Number (see FRAME)\niax   (I): axis format control\n           < 0 : plot axis, using input scale factors dm and dx\n           = 0 : do not plot axis, optional axis parameters not used\n                 input scaling is computed from input array\n           > 0 : plot axis, using scaling computed from input array,\n                 need optional axis parameters\n (1's digit)  = 1 : Plot actual max/min or input values for Y axis\n              = 2 : Plot smoothed values for Y axis\n (10's digit) = 0 : Use default axis type\n              = 1 : Use input AXIS2-type axis parameters\n(NOTE: the following optional parameters are used only if iax<0 or \n       mod(iflag,10)=1)\nxt    (B): title of x axis (width)\nnxt   (I): number of characters in xt\n           = 0 : no axis plotted\n           > 0 : normal\nxs,xe (R): starting and ending values displayed on x axis\n(see AXIS2 for detailed description of axis parameters)\nnmx   (I): number of minor ticks between major ticks on x axis\nnnx   (I): highlight length of nnx-th minor tick on x axis\nmlx   (I): number of major tick marks on x axis\ntsx   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndx   (I): number of digits to right of decimal point on x axis\nsmx   (R): major tick length on x axis\nyt    (B): title of y axis (depth)\nnyt   (I): number of characters in yt\n           = 0 : no y axis plotted\n           > 0 : normal\nnmy   (I): number of minor ticks between major ticks on y axis\nnny   (I): highlight length of nny-th minor tick on y axis\nmly   (I): number of major tick marks on y axis\ntsy   (R): size of title and numbers on y axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndy   (I): number of digits to right of decimal point on y axis\nsmy   (R): major tick length on y axis\nzt    (B): title of z axis (height)\nnzt   (I): number of characters in zt\n           = 0 : no z axis plotted\n           > 0 : normal\nze,ze (R): starting and ending valued displayed on z axis\nnmz   (I): number of minor ticks between major ticks on z axis\nnnz   (I): highlight length of nnz-th minor tick on z axis\nmlz   (I): number of major tick marks on z axis\ntsz   (R): size of title and numbers on z axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndz   (I): number of digits to right of decimal point on z axis\nsmz   (R): major tick length on z axis\n(NOTE: the following are required only if iax<0 or mod(iflag,10)<>0)\ndm,dx (R): minimum and maximum values of d array\n(NOTE: the following is required only if mod(iflag,10) <> 0)\nic    (I): color array\n           ic(1) : color for axis lines\n           ic(2) : color for axis numbers\n           ic(3) : color for axis titles\n           ic(4) : color for axis exponents\n           ic(5) : color for contour line 1\n           ic(6) : color for contour line 2, etc.\n            ...      ...\nl     (I): contour linetype list\n.end lit\n\n.pg\n.hl1  SUBROUTINE CNTLN\n.p\n.x contour plot\n~CNTLN plots a contour plot of a randomly scatted set of points in\nthree dimensions.  It uses INIT3dH\nThe input consists of a list of triplets of a surface\nvalue.  The triplets are triangulated using ~TRIANGC and contours\ndetermined by linearily interpolating the edges of the triangles.\nThe contour values may be uniformly spaced between the starting\nand end values or from a list.  Other than color, the\nsequence of plotting (min to max), and line typing of various contour\nlines, no contour line identification scheme is provided.  Caution\nshould be excercised when interpreting plot since the distribution of\ninput points may affect the placement of the contour lines.\n.lit\n\nCALL CNTLN(x,y,z,n,xl,yl,iflag,nc,c,ia,xt,nxt,tx,sx,fx,\n                yt,nyt,ty,sy,fy,t,nt,xm,xx,ym,yx<<,ic>,l>)\n\nx,y,z (R): array of point triplets (x,y,z)\nn     (I): number of points\nxl    (R): x axis length in inches\nyl    (R): y axis length in inches\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n(magnitude)  >10000: do not initialize LONGLIB before plotting\n   (1's digit)   = 1 : do not use color or line type arrays\n                 = 2 : use color but not line type array\n                 = 3 : do not use color but use line type array\n                 = 4 : use both color and line type arrays\n   (10's digit)  = 0 : just x,y labeled axes\n                 = 1 : axes and axis line/ticks on top and sides\n   (100's digit) = 0 : Ask which screen device to use\n                <> 0 : Screen Device Number (see FRAME)\nnc    (I): number of contour levels \n           < 0 : c(1) is the minimum contour level and c(2) is\n                 the contour step size, abs(nc) levels plotted\n           > 0 : c contains contours levels, c dimensioned c(nc)\nc     (R): list of contour levels\nia    (I): axis option flag\n          < 0 : do not plot axes\n          > 0 : plot axes\n   (1's digit)   = 1 : plot y axis using max/min of y array\n                 = 2 : plot y axis using max/min of y array\n                       smoothed by SCALE\n                 = 3 : plot y axis using input max/min\n                 = 4 : plot y axis using input max/min\n                       smoothed by SCALE\n   (10's digit)  = 1 : plot x axis using max/min of x array\n                 = 2 : plot x axis using max/min of x array\n                       smoothed by SCALE\n                 = 3 : plot x axis using input max/min\n                 = 4 : plot x axis using input max/min\n                       smoothed by SCALE\n   (100's digit) = 0 : normal contouring\n                 = 1 : show triangulation used without contours\nxt     (B): x axis title string\nnxt    (I): number of characters in title\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\ntx     (R): number and pattern of axis ticks (see AXIS3)\nsx     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nfx     (R): format of axis number labeling (see AXIS3)\nyt     (B): y axis title string\nnyt    (I): number of characters in title\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nty     (R): number and pattern of axis ticks (see AXIS3)\nsy     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nfy     (R): format of axis number labeling (see AXIS3)\nt      (B): plot title string\nnt     (I): number of characters in t (limited to 99 characters)\n            < 0 : use color array\n            = 0 : no title\n            > 0 : do not use color array\n            if |nt|/100 > 0 : use line type list\nxm     (R): minimum value of x axis\nxx     (R): maximum value of x axis\nym     (R): minimum value of y axis\nyx     (R): maximum value of y axis\nic     (I): color list (optionally used)\n            ic(1) : color for axis lines\n            ic(2) : color for axis numbers\n            ic(3) : color for axis titles\n            ic(4) : color for axis exponents\n            ic(5) : color contour (1)\n            ic(6) : color contour (2), etc.\n             ...      ...\nl      (I): line type list for contours (optionally used)\n\ncommon /ccntrplt/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl1  SUBROUTINE CNTRPLT\n.p\n.x contour plot\n~CNTRPLT plots a contour plot of a uniformly sampled 2-d input\narray.  The input consists of a 2 dimensional grid of y values.  For each\ncontour level the array is scanned cell by cell.\nA contour segment is determined by linearily interpolating the edges of the\nsquare formed by 4 adjacent points (a cell).  For example, if the current\ncontour value is 1, and y(1,1)=0, y(1,2)=2, y(2,2)=3, and y(1,2)=4,\na contour line is assumed to exist for this cell as shown:\n.lit\n\n         y(1,2)        y(2,2)\n        *          *\n\n        +\n         \\\n        * +        *\n         y(1,1)        y(1,2)\n\n.end lit\nThe contour values are uniformly spaced between the input starting\nand end values or automatically selected values.  Other than color, the\nsequence of plotting (min to max), and line typing of various contour\nlines, no contour line identification scheme is\nprovided. Log axes are available but data points are plotted using\nlinear positioning.  (Note: common block scale factors will be log values\nif the log axes are selected.)\n.p\nThe pathological case of two contour lines within a cell may case the\nroutine to incorrectly trace the contour through that cell.\n.lit\n\nCALL CNTRPLT(v,ndx,ndy,nx,ny,nl,as,ae,iflag,xl,yl,xt,nxt,yt,nyt,\n                t,nt,xm,xx,ym,yx<<,ic>,l>)\n\nv       (R): 2-d array dimensioned v(ndx,ndy)\nndx,ndy (I): dimensions of v data array\nnx,ny   (I): number of points in each array dimension\nnl      (I): number of uniformly spaced contour levels,\n             < 0 : max and min of v are used for as, ae\n                   (j)th contour is (j-1)*(ae-as)/(nl-1)+as\n             = 0 : int(ae) specifies the number of contour values\n                   where as is an array of the contour values\n             > 0 : number of uniformly space contour levels,\n                   (j)th contour is (j-1)*(ae-as)/(nl-1)+as\nas      (R): first contour level (nl > 0)\n             array of contour levels (nl=0) dimensioned as(int(ae))\nae      (R): last contour level (nl > 0)\n             number of contour levels in as (nl=0) ae>0\niflag   (I): option flag\n             < 0 : do not close LONGLIB after plotting\n             = 0 : close LONGLIB--no plot produced\n             > 0 : close LONGLIB after plotting\n(magnitude)  >10000: do not initialize LONGLIB before plotting\n   (1's digit)   = 1 : plot x linear, y logarithmic (base 10)\n                 = 2 : plot x logarithmic, y linear\n                 = 3 : plot x logarithmic, y logarithmic\n                 = 4 : plot x linear, y linear\n   (10's digit)  = 0 : no axes or title plotted\n                 = 1 : plot box with axis tick marks on top and sides\n                 = 2 : plot solid cartesian grid\n                 = 3 : plot ticked cartesian grid without box\n                 = 4 : plot ticked cartesian grid with box\n                 = 5 : plot ticked cartesian grid, box w/axis ticks\n                 = 6 : plot without box or cartesian grid\n                 = 7 : plot solid logarithmic grid\n                 = 8 : plot dotted logarithmic grid\n                 = 9 : plot ticked logarithmic grid\n   (100's digit) = 0 : Ask which screen device to use\n                <> 0 : Screen Device Number (see FRAME)\nxl    (R): x axis length in inches (integer-valued)\n           > 0 : use input scaling in xm,xx for axis\n           < 0 : use smoothed input scaling in xm,xx for axis\nyl    (R): y axis length in inches (integer valued)\n           > 0 : use input scaling in ym,yx for axis\n           < 0 : use smoothed input scaling in ym,yx for axis\nxt    (B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string\nnt    (I): number of characters in t (limited to 99 characters)\n           < 0 : use color array\n           = 0 : no title\n           > 0 : do not use color array\n           if |nt|/100 > 0 : use line type list\nxm    (R): minimum value of x axis (will be smoothed for xl < 0) \nxx    (R): maximum value of x axis (will be smoothed for xl < 0) \nym    (R): minimum value of y axis (will be smoothed for yl < 0) \nyx    (R): maximum value of y axis (will be smoothed for yl < 0) \n(NOTE: color array required if nt < 0 or |nt|/100 >0)\nic    (I): color array \n           ic(1) : color for grid\n           ic(2) : color for axis lines\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(5) : color for axis exponent\n           ic(6) : color for title (return)\n           ic(7) : color for contour line 1\n           ic(8) : color for contour line 2\n           ic(9) :    etc. ...\nl     (I): line type list for contours (required only if |nt|/100>0)\n\ncommon /ccntrplt/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl 1 SUBROUTINE CVAX3D\n.p\nCVAX3D plots a 3d surface with hidden line removal using either\na mesh or a histogram.  Optionally, a contour plot can be included\nbeneath the surface.  The vertical space may be specified.\nSee CVAX3DX.\n~CVAX3D calls CVAX3DX using default axis parameters to simplify the calling\nprocedure.\n.lit\n\nCALL CVAX3D(d,ndx,ndz,nx,nz,a,b,xh,yh,zh,iflag,\n               iax,ds,nc,cv,icl,nm,il,ip,\n               <xt,nxt,xs,xe,yt,nyt,zt,nzt,zs,ze,<dm,dx<,ic>>>)\n.end lit\n\n.hl 1 SUBROUTINE CVAX3DX\n.p\n.x 2-d surface plot\n~CVAX3DX plots a 3-d surface with hidden lines removed using ~PLT3D to\nproduce a mesh surface or ~HLT3D to produce a 2-d histogram with an optional\ncontour plot made ~GCONTR and plotted on a plane paralell to the surface\nplane.  Axes and a back panel can be optionally plotted.  Optionally,\na path surface may be plotted which connects the surface and contour plots\nover a users specified path.  The 3d surface is plotted in a manner similar\nto MVAX3DX.  The visible upper side of the surface and the visible lower\nside of the surface can be optionally shown using different colors and\nline types.\n.x MVAX3DX\n.p\nOrigin of the plot is in the upper-left corner.  The x axis runs\nleft to right along the plot bottom.  The y axis is plotted\nas a vertical displacement offset by the z axis value.  The z axis appears\nto point out of the screen.  The contour plot is plotted below the surface\nwith a user-specified vertical spacing.  The contour plot plane is plotted\nparalell to the z=0 plane of the surface with the (i,j) indicies of the\nsurface and contour plot aligned vertically.  The user may specify a\n\"path\" using \"pen\" motions.  The path is plotted as a curve along the\nsurface and the contour plot plane with vertical lines at the corresponding\nindicies.  No hidden line removal is used for the path.  The path permits\nthe user to specify a cut plane to enhance the interpretation of the\nplot.  The path is specified as a sequence of pen motion commands and\nindex points of the form,\n.TP 8\n.lit\n\n        ip(1) = 1st path command\n        ip(2) = 1st i index\n        ip(3) = 1st j index\n        ip(4) = 2n path command\n        ip(5) = 2nd i index\n        ip(6) = 2nd j index\n        ... etc.\n\n.end lit\nPath commands are interpreted according to:\n.TP 9\n.lit\n\n        path command      action\n       ______________    ___________________________\n\n            0             end of path specification\n                           (indicies ignored)\n            3             start path at these indicies\n            2             continue path though indicies\n\n.end lit\nThe path specificiation should start with a path command of 3\nand end with 0.  Note that several paths can be specified by\nusing several path command 3's.\n.P\nCVAX3DX contains an internal working storage array for use by GCONTR and\nPLT3D.  The buffer length is sufficient for most surfaces.  However, for\nvery complex surfaces the buffer length may be exceeded.  When this occurs\nan error message is written to the terminal and the routine terminates.\n.lit\n\nCALL CVAX3DX(d,ndx,ndz,nx,nz,a,b,xh,yh,zh,iflag,\n               iax,ds,nc,cv,icl,nm,il,ip,\n               <xt,nxt,xs,xe,xap,tsx,fdx,\n                yt,nyt,yap,tsy,fdy,\n                zt,nzt,zs,ze,zap,tsz,fdz,<dm,dx<,ic>>>)\n\nd        (R): array of y values dimensioned d(ndx,ndz)\nndx,ndz  (I): x and z dimensions of d array\nnx,nz    (I): x and z sizes of surface to plot d array\na        (R): angle of x axis from horizontal 0-85 degrees\nb        (R): angle of z axis from horizontal 0-90 degrees\n              note: origin (1,1) is in upper-left corner\n                    x axis runs left-to-right\n                    y axis runs down-to-up\n                    z axis appears to run outof page screen but\n                        is angled to the right\nxh,yh,zh (R): length of each axis\niflag    (I): option flag\n              < 0 : do not close LONGLIB after plotting\n              = 0 : close LONGLIB--no plot produced\n              > 0 : close LONGLIB after plotting\n(magnitude) > 10000 : do not initialize LONGLIB before plotting\n (1's digit)   = 2 : use color array (need all parameters)\n               = 1 : do not use color array\n (10's digit)  = 0 : plot surface as a mesh (PLT3D)\n               = 1 : plot surface as 2-d historgram (HLT3D)\n (100's digit) = 0 : Ask which screen device to use\n              <> 0 : Screen Device Number (see FRAME)\niax   (I): axis format control\n           < 0 : plot axis, using input scale factors dm and dx\n           = 0 : do not plot axis, axis parameters (xt...dx) not used\n                 scaling derived from d array is used\n           > 0 : plot axis, using scaling derived from d array, only\n                 axis parameters xt thru ze required.\n (1's digit)   = 1 : plot actual max/min or input values for Y axis\n               = 2 : plot smoothed values for Y axis\n (10's digit)  = 0 : plot contour, surface axes with back panel\n               = 1 : plot contour, surface axes w/o back panel\n               = 2 : plot contour axes w/o surface axes, back panel\n               = 3 : plot surface axes w/o back panel, contour axes\n               = 4 : plot surface axes, back panel w/o contour axes\n (100's digit) = 0 : use default axis type\n               = 1 : use input AXIS3 parameters\nds    (R): vertical spacing between contour plane and minimum\n           value of a plane\nnc    (I): number of contours\n           < 0 : iabs(nc) contours plotted, the (j)th contour\n                 is (max(a)-min(a))/(iabs(nc)-1). values used\n                 are returned in cv\n           > 0 : contours specified in cv used\ncv    (R): contour level array dimensioned dv(iabs(nc)\nicl   (I): contour labeling option\n           < 0 : label with contour value (number with n digits\n                 to the right of the decimal point)\n           = 0 : no labels on contours\n           > 0 : label contours with ASCII characters (nl <= 26)\nnm    (I): minimum line segments before contour labeled\n           < 0 : line type array used\n           > 0 : line type array not used\nil    (I): array of line types dimensioned il(iabs(nc)+2)\n           il(1) = underside of surface\n           il(2) = path line\n           il(3) = contour line 1\n           il(4) = contour line 2\n             ...   (solid line type on return)\nip    (I): path specification array (see notes above)\n           if ip(1) = 0, remainder of array ignored\n(NOTE: following optional axis paramters are used only if\n       iax<0 or mod(iflag,10)=1)\nxt    (B): title of x axis (width)\nnxt   (I): number of characters in xt\n           = 0 : no axis plotted\n           > 0 : normal\nxs,xe (R): starting and ending values displayed on x axis\nxap   (R): axis tick pattern (see AXIS3)\ntsx   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nfdx   (R): axis number label format (see AXIS3)\nyt    (B): title of y axis (height)\nnyt   (I): number of characters in yt\n           = 0 : no y axis plotted\n           > 0 : normal\nyap   (R): axis tick pattern (see AXIS3)\ntsy   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nfdy   (R): axis number label format (see AXIS3)\nzt    (B): title of z axis (depth)\nnzt   (I): number of characters in zt\n           = 0 : no z axis plotted\n           > 0 : normal\nze,ze (R): starting and ending valued displayed on z axis\nzap   (R): axis tick pattern (see AXIS3)\ntsz   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nfdz   (R): axis number label format (see AXIS3)\n(NOTE: the following are required only if iax<0 or mod(iflag,10)=1)\ndm,dx (R): minimum and maximum scale values for d array\nic    (I): color list\n           ic(1) : color for axis lines\n           ic(2) : color for axis numbers\n           ic(3) : color for axis titles\n           ic(4) : color for axis exponents\n           ic(5) : color for upper surface\n           ic(6) : color for lower surface\n           ic(7) : color for contour 1\n           ic(8) : color for contour 2\n            ...        ...\n                  (color for last contour on return)\n.end lit\n\n.pg\n.hl1  SUBROUTINE GLPLOT\n.p\n~GLPLOT plots the curve defined in x,y with ~log and/or ~linear scaling\nincluding appropriate axes and plot title.  Various options select the\nformat of the axes plotting. This subroutine is designed to plot one\nor more \ny value curves simultaneously.  This subroutine permits axis parameter\nflexibility (AXIS3) and dimensioning for y array.  GLPLOT is a good\ngeneral purpose plotting routine.\n.lit\n\nCALL GLPLOT(x,y,nld,npd,nl,np,iflag,isym,xl,yl,xt,xc,xf,xtitle,nxt,\n                yt,yc,yf,ytitle,nyt,t,nt,<xm,xx,ym,yx<<,ic>,l>>)\n\nx     (R): array of x values dimensioned at least x(np)\ny     (R): array of y values dimensioned y(npd,nld)\nnld   (I): dimension of y (number of lines dimensioned)\nnpd   (I): dimension of y (number of points dimensioned)\nnl    (I): number of data lines to plot from y array\nnp    (I): number of points per line\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n(magnitude)  >10000: do not initialize LONGLIB before plotting\n   (1's digit)   = 1 : plot x linear, y logarithmic (base 10)\n                 = 2 : plot x logarithmic, y linear\n                 = 3 : plot x logarithmic, y logarithmic\n                 = 4 : plot x linear, y linear\n   (10's digit)  = 0 : no axes or title plotted\n                 = 1 : axes with axis line/ticks on top and sides\n                 = 2 : plot solid cartesian grid\n                 = 3 : plot ticked cartesian grid without box\n                 = 4 : plot ticked cartesian grid with box\n                 = 5 : plot ticked cartesian grid, box w/axis ticks\n                 = 6 : plot without box or cartesian grid\n                 = 7 : plot solid logarithmic grid\n                 = 8 : plot dotted logarithmic grid\n                 = 9 : plot ticked logarithmic grid\n   (100's digit) = 0 : Ask which screen device to use\n                <> 0 : Screen Device Number (see FRAME)\nisym  (I): plot a symbol every isym'th point\n           < 0 : symbols only plotted, no line\n           = 0 : no symbols, line only\n           > 0 : symbol plotted every isym'th point\nxl    (R): x axis length in inches\n           < 0 : use input scaling in xm,xx\n           > 0 : use auto scaling computed from input array\nyl    (R): y axis length in inches\n           < 0 : use input scaling in ym,yx\n           > 0 : use auto scaling computed from input array\nxt    (R): x axis tick mark pattern (see AXIS3)\nxc    (R): x axis character size\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nxf    (R): x axis number label format (see AXIS3)\nxtitle(B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (R): y axis tick mark pattern (see AXIS3)\nyc    (R): x axis character size\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nyf    (R): y axis number label format (see AXIS3)\nytitle(B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string (limited to 99 characters)\nnt    (I): number of characters in t\n           < 0 : use color array\n           = 0 : no title\n           > 0 : do not use color array\n           if |nt|/100 > 0 : use line type list\nxm    (R): minimum value of x array (required if xl or nt < 0)\nxx    (R): maximum value of x array (required if xl or nt < 0)\nym    (R): minimum value of y array (required if xl, yl or nt<0)\nyx    (R): maximum value of y array (required if xl, yl or nt<0)\n(NOTE: color array required if nt < 0 or |nt|/100 >0)\nic    (I): color list\n           ic(1) : color for grid\n           ic(2) : color for axis lines\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(5) : color for axis exponent\n           ic(6) : color for title (return)\n           ic(7) : color for plotted line 1\n           ic(8) : color for plotted line 2\n           ic(9) :    etc.\nl     (I): line type of data lines list (required only if |nt|/100>0)\n\ncommon /cglplot/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl1  SUBROUTINE HIST3D\n.p\n.x surface plot\n~HIST3D plots a 2-d histogram as square columns plotted as z values\nfrom the x,y plane with hidden line removal.\nThe input consists of the values of the z axis for\neach (x,y) point on the plane.  Each square grid is plotted as two triangles\nusing either ~SKETCH or ~PLT3DH permitting hidden line removal if desired.\nHIST3D calls ~INIT3DH to initialize the 3-d hidden line package.  Default\nspace is provided in the INIT3DH common block.  The ISIZE variable will\nbe reset to the internal size if its value is smaller than the internal\nsize.  Sufficient space in the internal common block\nis provided for reasonably complex surfaces.\n.lit\n\nCALL HIST3D(z,ndx,ndy,nx,ny,s,p,t,dv,zref,xl,yl,zl,iflag,ia,\n                xt,nxt,tx,sx,gx,fx,\n                yt,nyt,ty,sy,gy,fy,\n                zt,nzt,tz,sz,gz,fz,\n                xm,xx,ym,yx,zm,zx<,ic>)\n\nz      (R): array of z values\nndx,ndy(I): dimensions of z array\nnx,ny  (I): number of points in each dimension to use of z array\ns,p,t  (R): yaw,roll,pitch angles of axes (see INIT3DH)\ndv     (R): perspective scale factor for INIT3DH\n            < 0 : no hidden lines in SKETCH, INIT3DH called\n            = 0 : INIT3DH not called to initialize 3d package,\n                  (INIT3DH previously called)\n            > 0 : hidden lines in SKETCH, INIT3DH called\n            = 9999 : no perspective in INIT3DH\nzref   (R): reference value from which columns are drawn from\nxl     (R): x axis length in inches\nyl     (R): y axis length in inches\nzl     (R): z axis length in inches\niflag  (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n(magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)   = 1 : do not use color array\n                 = 2 : use color array\n   (10's digit)  = 0 : hidden line removal for surface only\n                 = 1 : hidden line removal for axis and surface\n                 = 2 : no hidden line removal (SKETCH not used)\n   (100's digit) = 0 : Ask which screen device to use\n                <> 0 : Screen Device Number (see FRAME)\nia     (I): axis option flag\n            < 0 : plot axis use input z axis scale\n            = 0 : do not plot axes\n            > 0 : plot axis use computed z axis scale\n   (1's digit)  = 1 : plot y axis using input scale\n                = 2 : plot y axis using input, smoothed scale\n   (10's digit) = 1 : plot x axis using input scale\n                = 2 : plot x axis using input, smoothed scale\nxt     (B): x axis title string\nnxt    (I): number of characters in x axis title\n            < 0 : axis ticks on top of x axis\n            = 0 : no axis\n            > 0 : axis ticks on bottom of x axis (normal)\ntx     (R): number and pattern of axis ticks (see AXIS3)\nsx     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\ngx     (R): rotation angle for x axis (see AXIS3DH)\nfx     (R): format of axis number labeling (see AXIS3)\nyt     (B): y axis title string\nnyt    (I): number of characters in y axis title\n            < 0 : axis ticks on top of axis\n            = 0 : no axis\n            > 0 : axis ticks on bottom of axis (normal)\nty     (R): number and pattern of axis ticks (see AXIS3)\nsy     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\ngy     (R): rotation angle for y axis (see AXIS3DH)\nfy     (R): format of axis number labeling (see AXIS3)\nzt     (B): z axis title string\nnzt    (I): number of characters in z axis title\n            < 0 : axis ticks on top of axis\n            = 0 : no axis\n            > 0 : axis ticks on bottom of axis (normal)\ntz     (R): number and pattern of axis ticks (see AXIS3)\nsz     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\ngz     (R): rotation angle for z axis (see AXIS3DH)\nfz     (R): format of axis number labeling (see AXIS3)\nxm,xx  (R): minimum, maximum value displayed on x axis\nym,yx  (R): minimum, maximum value displayed on y axis\nzm,zx  (R): minimum, maximum value of z axis (required if ia < 0)\nic     (I): color list (required if 1's digit of iflag=2)\n            ic(1) : color for axes\n            ic(2) : color for surface\n.end lit\n\n.pg\n.hl1  SUBROUTINE LCNTR\n.p\n.x contour plot\n~LCNTR plots a contour plot of a uniformly sampled 2-d input array.\nLCNTR is similar to CNTRPLT but permits hardware line types.\nThe input consists of a 2 dimensional grid of v values.  A\ncontour is determined by linearily interpolating the edges of the square\nformed by 4 adjacent points (see CNTRPLT).  LCNTR connects the line segments\nof constant contour before plotting and can optionally label the contour lines\nwith alphabetic codes or the numerical value of the contour.\nLog axes are available but data points are plotted using\nlinear positioning.  (Note: common block scale factors will be log values\nif the log axes are selected.)\n.p\nWhen the contour levels are input (nl>0), contours can be suppressed\nin a region by setting the value of the input array greater than 1.E20.\nLCNTR uses the contouring routine GCONTR.\n.x GCONTR\n.lit\n\nCALL LCNTR(v,ndx,ndy,nx,ny,nl,cl,n,m,iflag,iw,xl,yl,xt,nxt,yt,nyt,\n                t,nt,xm,xx,ym,yx<<,ic>,l>)\n\nv       (R): 2-d array of values dimensioned v(ndx,ndy)\nndx,ndy (I): dimensions of data array\nnx,ny   (I): number of points in each array dimension\nnl      (I): number of uniformly spaced contour levels,\n             < 0 : max and min of v are used to define contours.\n                   the (j)th contour is computed from max,min of \n                   input array according to,\n                     (j-1)*(max(v)-min(v))/(nl-1)+min(v)\n             > 0 : number of contour levels specified in cl\ncl      (R): array of contour levels dimensioned cl(nl)\n             if nl < 0 contour levels used are (returned) in cl\nn       (I): contour labeling option\n             < 0 label with contour value (number with n digits\n                 to the right of the decimal point)\n             = 0 no labels on contours\n             > 0 label contours with ASCII characters (nl <= 26)\nm       (I): minimum line segments before contour labeled (m > 1)\niflag   (I): option flag\n             < 0 : do not close LONGLIB after plotting\n             = 0 : close LONGLIB--no plot produced\n             > 0 : close LONGLIB after plotting\n (magnitude) >10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : plot x linear, y logarithmic (base 10)\n                = 2 : plot x logarithmic, y linear\n                = 3 : plot x logarithmic, y logarithmic\n                = 4 : plot x linear, y linear\n   (10's digit) = 0 : no axes or title plotted\n                = 1 : axes with axis line/ticks on top and sides\n                = 2 : plot solid cartesian grid\n                = 3 : plot ticked cartesian grid without box\n                = 4 : plot ticked cartesian grid with box\n                = 5 : plot ticked cartesian grid, box w/axis ticks\n                = 6 : plot without box or cartesian grid\n                = 7 : plot solid logarithmic grid\n                = 8 : plot dotted logarithmic grid\n                = 9 : plot ticked logarithmic grid\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\niw      (I): working array dimensioned at least (2*nx*ny+1)/31\nxl      (R): x axis length in inches (integer valued)\n             > 0 : use input scaling in xm,xx for axis\n             < 0 : use smoothed input scaling in xm,xx for axis\nyl      (R): y axis length in inches (integer valued)\n             > 0 : use input scaling in ym,yx for axis\n             < 0 : use smoothed input scaling in ym,yx for axis\nxt      (B): x axis title string\nnxt     (I): number of characters in xt\n            < 0 : axis ticks on top of x axis\n            = 0 : no axis\n            > 0 : axis ticks on bottom of x axis (normal)\nyt      (B): y axis title string\nnyt     (I): number of characters in yt\n            < 0 : axis ticks on right of y axis\n            = 0 : no axis\n            > 0 : axis ticks on left of y axis (normal)\nt      (B): plot title string\nnt     (I): number of characters in t (limited to 99 characters)\n            < 0 : use color array\n            = 0 : no title\n            > 0 : do not use color array\n            if |nt|/100 > 0 : use line type list\nxm     (R): input minimum value of x axis\nxx     (R): input maximum value of x axis\nym     (R): input minimum value of y axis\nyx     (R): input maximum value of y axis\n(NOTE: color array required if nt < 0 or |nt|/100 >0)\nic     (I): color array\n            ic(1) : color for grid\n            ic(2) : color for axis lines\n            ic(3) : color for axis numbers\n            ic(4) : color for axis titles\n            ic(5) : color for axis exponent\n            ic(6) : color for title (return)\n            ic(7) : color for contour line 1\n            ic(8) : color for contour line 2\n            ic(9) :    etc.\nl       (I): line type list for contours (required if |nt|/100>0)\n\ncommon /ccntrplt/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl 1 SUBROUTINE LSPLOT\n.p\n~LSPLOT is a general single/multiple data line routine for plotting\nlines or scatterplots.  Optionally, error bars and symbols can be\nadded.  LSPLOT differs in philosophy from most other LONGLIB MASTER\nroutines in that plotting options are passed via an option array routine.\nThe routine is designed to produce a reasonable plot with the option\narray set to all zeros.  The output format is changed by initializing\nselected array elements to the values described below.\nThis permits simple but flexible specification of the plot format.\n.lit\n\nCALL LSPLOT(x,y,ndp,ndl,iflag,f,c,nc)\n\nx     (R): x input array dimensioned x(ndp,ndl).  Depending\n           on option selected, x need only be dimensioned\n           x(ndp) -- this is the default option.\ny     (R): y input array dimensioned y(ndp,ndl).  If\n           ndl=1 then y may dimensioned y(ndp)\nndp   (I): number of data points/line dimension\nndl   (I): number of data lines dimension\niflag (I): LONGLIB option flag (one's digit arbitrary)\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n(magnitude) >10000 : do not initialize LONGLIB before plotting\n (100's digit) = 0 : Ask which screen device to use\n              <> 0 : Screen Device Number (see FRAME)\nf     (R): option array dimensioned at least f(53)\n             (described below)\nc     (C): array of strings dimensioned C(3+ndl)\n           c(1) : x axis title\n           c(2) : y axis title\n           c(3) : top title\n           c(4) : line 1 legend (optionally used)\n           c(5) : line 2 legend (optionally used)\n           ...        ...\nnc    (I): array of string lengths dimensioned nc(3+ndl)\n           nc(1) : number of characters to use in C(1)\n           nc(2) : number of characters to use in C(2)\n            ...       ...\n.end lit\n.p\nThe array elements of the option array f are interpretted according\nto the following table.  Some parameters have default values (shown\nin square brackets).  These are used when the input value is zero.\nA simple plot may be produced by setting all the elements of f to\nzero.  Note that user specified input scaling factors should be\npowers of ten when the log axis specification is selected.  An optional\nlegend may be plotted.  The legend consists of a column\nof line/simple examples (if selected) and input text.\n.tp 8\n.lit\n\n  array  range of\n  index  values   action for each value\n ------- -------- ------------------------\n\n   1    0<=.<=ndp number of points/line to plot [ndp]: 0=ndp used\n   2    0<=.<=ndl number of lines to plot [nl]: 0=ndl used\n   3     -1/0/1   x scale: 0=auto,smoothed; 1=auto,nosmooth; -1=user\n   4      xmin    user supplied scale value (used if f(3)<0)\n   5      xmax    user supplied scale value (used if f(3)<0)\n   6     -1/0/1   y scale: 0=auto,smoothed; 1=auto,nosmooth; -1=user\n   7      ymin    user supplied scale value (used if f(6)<0)\n   8      ymax    user supplied scale value (used if f(6)<0)\n   9      0/1     x value usage: 0=first line of x data array\n                  used for all y lines; 1=lines of x,y paired\n   10     0/1     connect plotted points: 0=yes; 1=no\n   11     >=0     symbol plotted every ()th point: 0=no symbols\n   12     >=0     line symbol size [0.1]: 0=use default\n   13     >=0     symbol number for first data line, each line\n                  then uses next symbol in sequence\n   14     8<.<8   error bar option (see below): 0=no error bars\n   16     >=0     error bar size [0.1]: 0=default used\n   17     0/1     vertical line from points to reference value:\n                  0=no; 1=yes\n   18     rval    reference value\n   19    -1/0/1   x axis type: 0=linear; 1=log axis, -1=no axis\n   20    -1/0/1   y axis type: 0=linear; 1=log axis, -1=no axis\n   21     >=0     x axis length [7.0]: 0=default used\n   22     >=0     y axis length [5.0]: 0=default used\n   23     >=0     x axis tick pattern (see axis3) [7.00]: 0=default\n   24     >=0     y axis tick pattern (see axis3) [5.00]: 0=default\n   25     0/1     x axis title side of axis: 0=below; 1=above\n   26     0/1     y axis title side of axis: 0=left; 1=right\n   27     0/1     x axis auto exponent enable: 0=enable; 1=disable\n   28     0/1     y axis auto exponent enable: 0=enable; 1=disable\n   29     0/1     x axis tick side: 0=below; 1=above\n   30     0/1     y axis tick side: 0=left; 1=right\n   31     0/1     x axis number orientation: 0=horizontal; 1=vertical\n   32     0/1     y axis number orientation: 0=vertical; 1=horizontal\n   33     0/1     x axis numbers/title: 0=shown; 1=not shown\n   34     0/1     y axis numbers/title: 0=shown; 1=not shown\n   35     0/1     use x=log10(abs(x values)+1.e-34): 0=no; 1=yes\n   36     0/1     use y=log10(abs(y values)+1.e-34): 0=no; 1=yes\n   37   -1/0/1    add mirror x axis: 0=no; 1=w/labels; -1:w/o labels\n   38   -1/0/1    add mirror y axis: 0=no; 1=w/labels; -1:w/o labels\n                  (mirrored axes placed on opposite from normal axis)\n   39     >=0     x axis label size [0.15]: 0=use default\n   40     >=0     y axis label size [0.15]: 0=use default\n   41     >=0     top title character size [0.18]: 0=use default\n   42   0/1/2/3   grid: 0=no grid; 1=solid; 2=dotted; 3=ticked\n   43   -1/0/1    legend: 0=no legend; 1=right side; -1=user locate\n   44     xval    user specified lower-left corner of legend\n   45     yval    user specified lower-left corner of legend\n   46     0/1     show plot symbol on legend: 0=no; 1=yes\n   47     0/1     show line segment on legend: 0=no; 1=yes\n   48     >=0     legend character height [0.12]: 0=use default\n   49     >=0     legend line segment length [0.5]: 0=use default\n   50   -1/0/1    top title justify: 0=center; -1:left; 1:right\n   51    0/1      plot horizontal reference line: 0=no; 1=yes\n   52    0/1      use linetype array values: 0=no; 1=yes\n   53    0/1      use color array values: 0=no; 1=yes\n   54    >=0      color index #1: 0=color value 1 used\n   55    >=0      linetype index #1\n   56    >=0      color index #2: 0=color value 1 used\n   57    >=0      linetype index #2\n   ...   ...      ... etc ...\n.end lit\n.p\nThe optional error bar specification, when non-zero, changes\ninterpretation of lines.  The first line (and every third line)\nconidered a \"center\" line.  The second line specifies the relative\nerror (to be added to the first line) used for plotting the tops\nof the error bars.  The third line is used similarily to locate\nthe bottoms of the error bars.  When the error bar specification\nis negative the center line points are marked with a special \"x\"\n(in addition to any other option).  The absolution value of the\nspecifiation determines the type of error bar according to the\nfollowing table.\n.tp10\n.lit\n\nvalue   type of error bar\n------  ---------------------------------------------------\n  1     line connecting relative errors\n  2     1 + horizontal bars at relative errs\n  3     1 + vertical bars at relative errs\n  4     double line connecting rel. errs+horizontal bars\n  5     double line connecting rel. errs+vertical bars\n  6     vertical rectangle w/top and bottom rel. errs\n  7     rectangle with corners at relative errors\n.end lit\n.p\nThe color and line type index (when enabled) are used according to the\nfollowing table.\n.tp12\n.lit\n\n index #        color usage     linetype usage\n---------      -------------   ----------------\n  1              x axis         x axis\n  2           x axis numbers    y axis\n  3           x axis title      title\n  4           x axis exponent   legend titles\n  5              y axis         reference line\n  6           y axis numbers    error bars\n  7           y axis title      line #1 linetype\n  8           y axis exponent   line #2 linetype\n  9              title            etc.\n 10             legend titles     ...\n 11            reference line     ...\n 12               grid            ...\n 13             line #1 color     ...\n 14             line #2 color     ...\n...             ... etc. ...      ...\n.end lit\n\n.pg\n.hl 1 SUBROUTINE MESH3D\n.p\nMESH3D plots a 2-d surface as 3d mesh using the same techniques\nas ~VAX3D but without hidden line removal.\n~MESH3D calls MESH3DX using default axis parameters to simplify\nthe calling procedure.\n.lit\n\nCALL MESH3D(d,ndx,ndz,nx,nz,a,b,xh,yh,zh,iflag,iax,<xt,nxt,xs,xe,\n                yt,yzt,zt,nzt,zs,ze,<dm,dx<,ic>>>)\n\nSee MESH3DX for parameter description.\n (iax is limited to a single digit value)\n.end lit\n.hl 1 SUBROUTINE MESH3DX\n.p\n.x VAX3DX\n.x 2-d surface plot\n~MESH3DX is a simple 3-d surface plotting routine.  A 3-d surface is\nplotted as a simple mesh grid.  The plotting method is similar to\nVAX3DX. No hidden line removal is done.\nThe height of plotted surface relative to its y axis value\nis calibrated to z axis.  No perspective is used.\nOptions exist to varying the plotting angle and to plot axes.\n.p\nOrigin of the plot is in the lower-left corner.  The x axis runs\nplotted left to right along the plot bottom.  The y axis is plotted\nas a vertical displacement offset by the z axis value.  The z axis\nappears to point into the screen.  This gives the illusion of depth.\n.lit\n\nCALL MESH3DX(d,ndx,ndz,nx,nz,a,b,xh,yh,zh,iflag,iax,\n               <xt,nxt,xs,xe,nmx,nnx,mlx,tsx,ndx,smx,\n                yt,nyt,nmy,nny,mly,tsy,ndy,smy,\n                zt,nzt,zs,ze,nmz,nnz,mlz,tsz,ndz,smz,\n               <dm,dx<,ic>>>)\n\nd        (R): array of y values dimensioned d(ndx,ndz)\nndx,ndz  (I): x and z dimensions of d array\nnx,nz    (I): x and z sizes of surface to plot d array\na        (R): angle of x axis from horizontal 0-85 degrees\nb        (R): angle of z axis from horizontal 0-90 degrees\n              note: origin (1,1) is in lower-left corner\n                    x axis runs left to right on screen\n                    y axis runs up to down on screen\n                    z axis appears to run into the screen but\n                        is angled to the right\nxh,yh,zh (R): length of each axis\niflag    (I): option flag\n             < 0 : do not close LONGLIB after plotting\n             = 0 : close LONGLIB--no plot produced\n             > 0 : close LONGLIB after plotting\n(magnitude)  >10000: do not initialize LONGLIB before plotting\n (1's digit)   = 2 : use color array (need all parameters)\n               = 1 : do not use color array \n (10's digit)  = 0 : Plot sides\n               = 1 : Do not plot sides\n (100's digit) = 0 : Ask which screen device to use\n              <> 0 : Screen Device Number (see FRAME)\niax   (I): axis format control\n           < 0 : plot axes, using input scale factors dm and dx\n           = 0 : axes not plotted, parameters (yt...dx) not used.\n                 scaling derived from d array is used\n           > 0 : plot axes, use max and min of d array to compute\n                 dm and dx, need axis parameters yt thru ze\n (1's digit)  = 1 : Plot actual max/min or input values for Y axis\n              = 2 : Plot smoothed values for Y axis\n (10's digit) = 0 : Use default axis type\n              = 1 : Use input AXIS2-type axis parameters\n(NOTE: the following optional paramters are used only if\n         iax < 0 or mod(iflag,10)=1)\nxt    (B): title of x axis (width)\nnxt   (I): number of characters in xt\n           = 0 : no axis plotted\n           > 0 : axis plotted\nxs,xe (R): starting and ending values displayed on x axis\n(see AXIS2 for detailed description of axis parameters)\nnmx   (I): number of minor ticks between major ticks on x axis\nnnx   (I): highlight length of nnx-th minor tick on x axis\nmlx   (I): number of major tick marks on x axis\ntsx   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndx   (I): number of digits to right of decimal point on x axis\nsmx   (R): major tick length on x axis\nyt    (B): title of y axis (depth)\nnyt   (I): number of characters in yt\n           = 0 : no y axis plotted\n           > 0 : normal\nnmy   (I): number of minor ticks between major ticks on y axis\nnny   (I): highlight length of nny-th minor tick on y axis\nmly   (I): number of major tick marks on y axis\ntsy   (R): size of title and numbers on y axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndy   (I): number of digits to right of decimal point on y axis\nsmy   (R): major tick length on y axis\nzt    (B): title of z axis (height)\nnzt   (I): number of characters in zt\n           = 0 : no z axis plotted\n           > 0 : normal\nze,ze (R): starting and ending valued displayed on z axis\nnmz   (I): number of minor ticks between major ticks on z axis\nnnz   (I): highlight length of nnz-th minor tick on z axis\nmlz   (I): number of major tick marks on z axis\ntsz   (R): size of title and numbers on z axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndz   (I): number of digits to right of decimal point on z axis\nsmz   (R): major tick length on z axis\n(NOTE: the following optional parameters are required if \n       iax < 0 or mod(iflag,10)=1)\ndm,dx (R): minimum and maximum scale values for d array\nic    (I): color list\n           ic(1) : color for axis lines\n           ic(2) : color for axis numbers\n           ic(3) : color for axis titles\n           ic(4) : color for axis exponents\n           ic(5) : color for plot surface (return)\n.end lit\n\n.pg\n.hl 1 SUBROUTINE MVAX3D\n.p\nMVAX3D plots a 3d mesh surface or 2-d histogram with hidden line removal.\nSee MVAX3DX.  The calling format is similar to VAX3D.\n~MVAX3D calls ~MVAX3DX using default axis parameters to simplify calling\nprocedure.\n.lit\n\nCALL MVAX3D(d,ndx,ndz,nx,nz,a,b,xh,yh,zh,iflag,iax,<xt,nxt,\n               xs,xe,yt,nyt,zt,nzt,zs,ze,<dm,dx<,ic>>>)\n.end lit\n\n.hl 1 SUBROUTINE MVAX3DX\n.p\n.x 2-d surface plot\n~MVAX3DX is a 3-d surface plotting routine which plots a\n3-d surface as mesh with hidden lines removed using the ~PLT3D routine\nor a 2-d histogram with hidden lines removed using the ~HLT3D routin.\nAxes and a axis back panel can be optionally plotted as well.\nThe upper side of the visible surface can be shown with optional side\nplates on the mesh surface.\nIf the side plates are not used or for histogram plotting, the lower side of the\nvisible surface may be displayed in different colors or using a dotted line.\n.p\nOrigin of the plot is in the upper-left corner.  The x axis runs\nleft to right along the plot bottom.  The y axis is plotted\nas a vertical displacement offset by the z axis value.  The z axis appears\nto point out of the screen.\n.P\nMVAX3DX contains an internal working storage array for use by\nPLT3D and HLT3D.  The buffer length is sufficient for most surfaces. \nHowever, for\nvery complex surfaces the buffer length may be exceeded.  When this occurs\nan error message is written to the terminal and the routine terminates.\n.lit\n\nCALL MVAX3DX(d,ndx,ndz,nx,nz,a,b,xh,yh,zh,iflag,iax,\n               <xt,nxt,xs,xe,xap,tsx,fdx,\n                yt,nyt,yap,tsy,fdy,\n                zt,nzt,zs,ze,zap,tsz,fdz,<dm,dx<,ic>>>)\n\nd        (R): array of y values dimensioned d(ndx,ndz)\nndx,ndz  (I): x and z dimensions of d array\nnx,nz    (I): x and z sizes of surface to plot d array\na        (R): angle of x axis from horizontal 0-85 degrees\nb        (R): angle of z axis from horizontal 0-90 degrees\n              note: origin (1,1) is in upper-left corner\n                    x axis runs left-to-right\n                    y axis runs down-to-up\n                    z axis appears to run outof page screen but\n                        is angled to the right\nxh,yh,zh (R): length of each axis\niflag    (I): option flag\n              < 0 : do not close LONGLIB after plotting\n              = 0 : close LONGLIB--no plot produced\n              > 0 : close LONGLIB after plotting\n(magnitude) > 10000 : do not initialize LONGLIB before plotting\n (1's digit)   = 2 : use color array (need all parameters)\n               = 1 : do not use color array \n (10's digit)  = 0 : mesh surface w/side panels, lower side of\n                     surface not shown\n               = 1 : mesh surface w/no side panels, lower side of\n                     surface shown using dotted lines\n               = 2 : mesh surface w/no side panels, lower side of\n                     surface shown using solid lines\n               = 3 : mesh surface w/no side panels, lower side of\n                     surface not shown\n               = 4 : histogram surface, lower side of surface\n                     shown using dotted lines\n               = 5 : histogram surface, lower side of surface\n                     shown using solid lines\n               = 6 : histogram surface, lower side of surface\n                     shown using solid lines\n (100's digit) = 0 : Ask which screen device to use\n              <> 0 : Screen Device Number (see FRAME)\niax   (I): axis format control\n           < 0 : plot axes, using input scale factors dm and dx\n           = 0 : no axes plotted, parameters (xt...dx) not used.\n                 scaling derived from d array is used\n           > 0 : plot axes, use scaling derived from d array, only\n                 axis parameters xt thru ze required.\n (1's digit)   = 1 : Plot actual max/min or input values for Y axis\n               = 2 : Plot smoothed values for Y axis\n (10's digit)  = 0 : Use default axis type\n               = 1 : Use input AXIS3 parameters\n (100's digit) = 0 : Do not plot backplane\n               = 1 : Plot backplane\n(NOTE: following optional axis paramters are used only if\n       iax<0 or mod(iflag,10)=1)\nxt    (B): title of x axis (width)\nnxt   (I): number of characters in xt\n           = 0 : no axis plotted\n           > 0 : normal\nxs,xe (R): starting and ending values displayed on x axis\nxap   (R): axis tick pattern (see AXIS3)\ntsx   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nfdx   (R): axis number label format (see AXIS3)\nyt    (B): title of y axis (height)\nnyt   (I): number of characters in yt\n           = 0 : no y axis plotted\n           > 0 : normal\nyap   (R): axis tick pattern (see AXIS3)\ntsy   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nfdy   (R): axis number label format (see AXIS3)\nzt    (B): title of z axis (depth)\nnzt   (I): number of characters in zt\n           = 0 : no z axis plotted\n           > 0 : normal\nze,ze (R): starting and ending valued displayed on z axis\nzap   (R): axis tick pattern (see AXIS3)\ntsz   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nfdz   (R): axis number label format (see AXIS3)\n(NOTE: the following optional parameters are required if \n       iax<0 or mod(iflag,10)=1)\ndm,dx (R): minimum and maximum scale values for d array\nic    (I): color list\n           ic(1) : color for axis lines\n           ic(2) : color for axis numbers\n           ic(3) : color for axis titles\n           ic(4) : color for axis exponents\n           ic(5) : color for plot surface (return)\n.end lit\n\n.pg\n.hl 1 SUBROUTINE MVAX5D\n.p\n.x 5-d surface\n.x 4-d surface plot\n.x MVAX3D\n~MVAX5D plots a 4 or 5-d surface by plotting slices through the 3rd and\n4th dimensions in a 2-d array of of 3-d plots. Each 3-d surface\nplots d(*) as a function of 2 of the dimensions using MVAX3D.\n.p\nOrigin of the plot is in the lower-left corner.  The X axis runs\nleft to right along the subplot bottom.  The Y axis is plotted out\nthe page of the subplot (see MVAX3D).\nThe Z axis runs left to right in subplots\nwith the W axis vertical subplots.\n.tp 8\n.lit\n\n        ^ W  d\n        |   | \n        |   |__X\n        |  /\n        | Y\n        ----------> Z\n.end lit\n.p\nSince the subplots may runoff the edge of the plotting page, the routine\nincludes a page size option to issue a NEWPAGE and plot the additional\nsubplots on separate pages.  A shrinking factor is included to shrink the\nsubplots.\nLabeling of the W and Z axis is due in the lower right hand corner.\nEach subplot is further tagged with the corresponding W and Z axis\nvalue.  A multiple page plot can be pasted together to form a large\nrepresentation of a 5-d (or 4-d) surface.\n.lit\n\nCALL MVAX5D(d,nd,n,a,b,iflag,iax,iform,w,xh,yh,zh,ph,pl,fac,iw,iz,\n            st,en,t1,nt1,t2,nt2,t3,nt3,t4,nt4,dt,ndt,<dm,dx<,ic>>)\n\nd        (R): array to plot dimensioned d(nd(1),nd(2),nd(3),nd(4))\nnd       (I): array of containing dimensions of d array\nn        (I): array of number of points in each dimension to plot\na,b      (R): angles a,b for MVAX3D subplot\niflag    (I): option flag\n              < 0 : do not close LONGLIB after plotting\n              = 0 : close LONGLIB--no plot produced\n              > 0 : close LONGLIB after plotting\n(magnitude) > 10000 : do not initialize LONGLIB before plotting\n (1's digit)   = 2 : use color array (need all parameters)\n               = 1 : do not use color array\n (10's digit)  = 0 : mesh surface w/side panels, lower side of\n                     surface not shown\n               = 1 : mesh surface w/no side panels, lower side of\n                     surface shown using dotted lines\n               = 2 : mesh surface w/no side panels, lower side of\n                     surface shown using solid lines\n               = 3 : mesh surface w/no side panels, lower side of\n                     surface not shown\n               = 4 : histogram surface, lower side of surface\n                     shown using dotted lines\n               = 5 : histogram surface, lower side of surface\n                     shown using solid lines\n               = 6 : histogram surface, lower side of surface\n                     shown using solid lines\n (100's digit) = 0 : Ask which screen device to use\n              <> 0 : Screen Device Number (see FRAME)\niax      (I): axis format control\n              < 0 : plot axes, use input scale factors dm and dx\n              = 0 : no axes plotted, parameters (xt...dx) not used.\n                    scaling derived from d array \n              > 0 : plot axes, scaling derived from d array, only\n                    axis parameters xt thru ze required.\n (1's digit)  = 1 : Plot actual max/min or input values for Y axis\n              = 2 : Plot smoothed values for Y axis\n (10's digit) = 0 : Axes plotted for all subplots\n              = 1 : Axes plotted only for first subplot\niform    (I): plot format code \n              selects which dimension of d array is to become\n              which output axis \n\n          plot axis                     plot axis\nCode      X  Y  Z  W            Code    X  Y  Z  W\n_____    ____________          _____  ____________\n 1 input: 1  2  3  4             13     3  1  2  4\n 2 dimen- 1  2  4  3             14     3  1  4  2\n 3 sion   1  4  2  3             15     3  2  1  4\n 4 number 1  4  3  2             16     3  2  4  1\n 5        1  3  2  4             17     3  4  1  2\n 6        1  3  4  2             18     3  4  2  1\n 7        2  1  3  4             19     4  1  2  3\n 8        2  1  4  3             20     4  1  3  2\n 9        2  4  3  1             21     4  2  1  3\n 10       2  4  1  3             22     4  2  3  1\n 11       2  3  4  1             23     4  3  1  2\n 12       2  3  1  4             24     4  3  2  1\n\nw        (R): working array dimensioned at least n(x)*n(y)\nxh,yh,zh (R): length of each axis of MVAX3D subplot\nph,pl    (R): page height, length when multiple pages required\nfac      (R): shrink factor for subplots (2 == FACTOR(1/2))\niw,iz    (I): plot every iw'th and iz'th subplots\n(NOTE: the axis titles, number of characters, start/stop\n       values are permuted along with d array dimensions)\nst,en    (R): arrays containing axes start and end values\nt1       (B): title corresponding to 1st dimension of d\nnt1      (I): number of characters in title t1\n              = 0 : no axis plotted\n              > 0 : axis plotted\nt2       (B): title corresponding to 2st dimension of d\nnt2      (I): number of characters in title t2\n              = 0 : no axis plotted\n              > 0 : axis plotted\nt3       (B): title corresponding to 3rd dimension of d\nnt3      (I): number of characters in title t3\n              = 0 : no axis plotted\n              > 0 : axis plotted\nt4       (B): title corresponding to 4th dimension of d\nnt4      (I): number of characters in title t4\n              = 0 : no axis plotted\n              > 0 : axis plotted\nt5       (B): title corresponding to 5th dimension of d\nnt5      (I): number of characters in title t5\n              = 0 : no axis plotted\n              > 0 : axis plotted\n(NOTE: the following optional parameters are required if\n       iax<0 or mod(iflag,10)=1)\ndm,dx (R): minimum and maximum scale values of plot\nic    (I): color array\n           ic(1) : color for axis lines\n           ic(2) : color for axis numbers\n           ic(3) : color for axis titles\n           ic(4) : color for axis exponents\n           ic(5) : color for plot surface (return)\n.end lit\n\n.pg\n.hl1  SUBROUTINE PHIST\n.p\n~PHIST is a generalized ~histogram plotting program with various\nplot format controls.  Shading may done under the histogram columns.\nThe histogram height may be plotted on top of each histogram column\nvertically.  The mean and +/- sigma variations may be indicated on the\nplot output.  Note: PHIST does not do the histogramming.  This is left\nto the user.\n.lit\n\nCALL PHIST(a,n,t,nt,xl,yl,s,ns,xt,nxt,xm,xx,ax,\n             iflag,ishad,am,as<,ic>)\n\na     (R): array of heights of histogram columns\nn     (I): number of points in a array to plot\nt     (B): title string\nnt    (I): number of characters in t\n           = 0 : no title\n           < 0 : use color array\nxl    (R): length of x axis in inches (integer-valued real number)\nyl    (R): length of y axis in inches (integer-valued real number)\ns     (B): subtitle string\nns    (I): number of characters in s\nxt    (B): x axis title\nnxt   (I): number of characters in xt\nxm    (R): minimum value displayed on x axis\nxx    (R): maximum value displayed on x axis\nax    (R): maximum value of a\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n(magnitude) > 10000 : do not initialize LONGLIB before plotting\n(1's digit)  = 2 : plot number value of column on top of column\n             = 1 : no numeric values on top of histogram columns\n             = 0 : no axis or title (histogram columns only)\n(10's digit) = 0 : Ask which screen device to use\n            <> 0 : Screen Device Number (see FRAME)\nishad (I): shade option flag\n           < 0 : shade with solid line\n           = 0 : no shading\n           > 0 : shade with line of type ishad\nam    (R): mean value of histogram to plot (in relation to xm,xx)\nas    (R): standard deviation of histogram to plot\n           < 0 : neither mean nor sigma values indicated on plot\n           = 0 : only mean value indicated on plot\n           > 0 : mean and +/- sigma values indicated on plot\nic    (I): color list\n           ic(1) : color for axis lines\n           ic(2) : color for axis numbers\n           ic(3) : color for axis titles\n           ic(4) : color for axis exponents\n           ic(5) : color for mean label\n           ic(6) : color for sigma label\n           ic(7) : color for title\n           ic(8) : color for subtitle\n           ic(9) : color for histogram columns (return)\n\ncommon /cphist/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl1  SUBROUTINE PICHRT\n.p\n~PICHRT plots a circular pie chart with optionally shaded wedges, and\ndescriptive legends.  One or more of the slices may be \"exploded\" outward\nfrom the pie chart center for emphasis.  The chart legend can be character\nlabels only or can include shade legends.  Labels can be automatically placed\naround the pie chart or located at the bottom of the page.  Optionally, the\nuser can specify the locations of the legends.\n.lit\n\nCALL PICHRT(x,y,r,d,iflag,as,ae,n,a,sh,iw,l,nl,cs,sl,\n              t,nt,tcs,d,<p,<ic>>)\n\nx,y   (R): location of pie chart center\nr     (R): radius of pie chart segments (r>0)\nd     (R): distance from chart center for \"exploded\" segments\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n(magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : color array not used\n                = 2 : color array used\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nas    (R): starting angle of first segment\nn     (I): number of segments (n>0)\na     (R): array of segment sizes (angular width of jth segment\n           is a(j)*360/(Sum a(i),i=1,N))\nsh    (R): shade option for each pie segment\n              sh            shade pattern\n             ____       _________________________\n              0               no shading\n              1          -45 deg solid lines\n              2          horizontal solid lines\n              3          +45 deg solid lines\n              4          vertical deg solid lines\n              5          -45 deg dotted lines\n              6          horizontal dotted lines\n              7          +45 deg dotted lines\n              8          vertical deg dotted lines\n              9          +/- 45 deg dotted lines\n             10          vertical/horizontal dotted lines\n             11          +/- 45 deg solid lines\n             12          vertical/horizontal solid lines\niw    (I): array of segment outline linewidths (1-9)\nl     (C): array of segment labels for legend (CHARACTER)\nnc    (I): maximum number of characters in legend string\ncs    (R): legend character height\nsl    (R): legend shaded box size\n            < 98: legend located below chart w/o box\n            < 0 : legend located below chart with shaded box\n            = 0 : no legend\n            > 0 : legend located around chart with shaded box \n            > 98: legend located around chart w/o box\nt     (B): chart title string\nnt    (I): number of characters in t\n           < 1 : no title plotted\ntcs   (R): chart title string height\nd     (R): distance between shading lines\np     (R): array containing locations of lower-left corner\n           of legend box/string (used only if tc < 0)\nic    (I): color array (used only if mod(|iflag|,10)=2)\n            ic(1) : title color (return)\n            ic(2) : legend string color\n            ic(3) : segment 1 color\n            ic(4) : segment 2 color\n             ...         ...\n.end lit\n\n.pg\n.hl1  SUBROUTINE PLOTLG\n.p\n~PLOTLG is a very simple routine which\nplots a single curve defined in x,y with ~log and/or ~linear\nscaling including appropriate axes and plot title. Various options\nselect the format of plotting and type of grid.\n.lit\n\nCALL PLOTLG(x,y,n,iflag,xl,yl,xt,nxt,yt,nyt,t,nt,\n               <xm,xx,ym,yx<<,ic>,l>>)\n\nx     (R): array of x values\ny     (R): array of y values\nn     (I): number of points in x array\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n(magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : plot x linear, y logarithmic (base 10)\n                = 2 : plot x logarithmic, y linear\n                = 3 : plot x logarithmic, y logarithmic\n                = 4 : plot x linear, y linear\n   (10's digit) = 0 : no axes or title plotted\n                = 1 : axes with axis line/ticks on top and sides\n                = 2 : plot solid cartesian grid\n                = 3 : plot ticked cartesian grid without box\n                = 4 : plot ticked cartesian grid with box\n                = 5 : ticked cartesian grid, box w/axis ticks\n                = 6 : plot without box or grid\n                = 7 : plot solid logarithmic grid\n                = 8 : plot dotted logarithmic grid\n                = 9 : plot ticked logarithmic grid\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nxl    (R): x axis length in inches (integer-valued)\n           < 0 : use input scaling in xm,xx\n           > 0 : use auto scaling computed from input array\nyl    (R): y axis length in inches (integer-valued)\n           < 0 : use input scaling in ym,yx\n           > 0 : use auto scaling computed from input array\nxt    (B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string (limited to 99 characters)\nnt    (I): number of characters in t\n           < 0 : use color array\n           = 0 : no title\n           > 0 : do not use color array\n           if |nt|/100 > 0 : use line type list\nxm    (R): minimum value of x array (required if xl or nt < 0)\nxx    (R): maximum value of x array (required if xl or nt < 0)\nym    (R): minimum value of y array (required if xl, yl or nt<0)\nyx    (R): maximum value of y array (required if xl, yl or nt<0)\n(NOTE: optional color array required if nt<0 or |nt|/100>0)\nic    (I): color array\n           ic(1) : color for grid\n           ic(2) : color for axis lines\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(5) : color for axis exponents\n           ic(6) : color for plotted line\n           ic(7) : color for title (return)\n(NOTE: optional line type array only required if |nt|/100>0)\nl     (I): line type of data line\n           if |nt|/100 > 0 : use line type list\n\ncommon /cplotlg/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl1  SUBROUTINE PLOTLG2\n.p\n~PLOTLG2 is a simple routine to\nplot multiple curves defined in x,y in ~log and/or ~linear\nscaling including appropriate axes and plot title.  Various options\nselect the format of plotting. This subroutine is designed to plot\nmany y value curves which may be distinguished by color and/or line\ntype.  This routine is similar to ~PLOTLGX but uses a simpler\naxis specification.\n.lit\n\nCALL PLOTLG2(x,y,nl,np,iflag,isym,xl,yl,xt,nxt,yt,nyt,t,nt,<xm,\n                xx,ym,yx<<,ic>,l>>)\n\nx     (R): array of x values\ny     (R): array of y values dimensioned y(np,nl)\nnl    (I): number of data lines to plot from y array\nnp    (I): number of points in x array\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n (magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : plot x linear, y logarithmic (base 10)\n                = 2 : plot x logarithmic, y linear\n                = 3 : plot x logarithmic, y logarithmic\n                = 4 : plot x linear, y linear\n   (10's digit) = 0 : no axes or title plotted\n                = 1 : axes with axis line/ticks on top and sides\n                = 2 : plot solid cartesian grid\n                = 3 : plot ticked cartesian grid without box\n                = 4 : plot ticked cartesian grid with box\n                = 5 : ticked cartesian grid, box w/axis ticks\n                = 6 : plot without box or cartesian grid\n                = 7 : plot solid logarithmic grid\n                = 8 : plot dotted logarithmic grid\n                = 9 : plot ticked logarithmic grid\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nisym  (I): plot a symbol every isym'th point\n           < 0 : symbols only plotted, no line\n           = 0 : no symbols, line only\n           > 0 : symbol plotted every isym'th point\nxl    (R): x axis length in inches (integer-valued)\n           < 0 : use input scaling in xm,xx\n           > 0 : use auto scaling computed from input array\nyl    (R): y axis length in inches (integer-valued)\n           < 0 : use input scaling in ym,yx\n           > 0 : use auto scaling computed from input array\nxt    (B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string (limited to 99 characters)\nnt    (I): number of characters in t\n           < 0 : use color array\n           = 0 : no title\n           > 0 : do not use color array\n           if |nt|/100 > 0 : use line type list\nxm    (R): minimum value of x array (required if xl or nt < 0)\nxx    (R): maximum value of x array (required if xl or nt < 0)\nym    (R): minimum value of y array (required if xl, yl or nt<0)\nyx    (R): maximum value of y array (required if xl, yl or nt<0)\n(NOTE: color array required if nt < 0 or |nt|/100 >0)\nic    (I): color list\n           ic(1) : color for grid\n           ic(2) : color for axis lines\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(5) : color for axis exponents\n           ic(6) : color for title (return)\n           ic(7) : color for plotted line 1\n           ic(8) : color for plotted line 2\n           ic(9) :    etc.\n(NOTE: line type list required only if |nt|/100>0)\nl     (I): line type for data lines list \n\ncommon /cplotlg2/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n.pg\n.hl1  SUBROUTINE PLOTLGL\n.x PLOTLGX\n.x linseq\n.p\n~PLOTLGL plots multiple curves defined in x,y with ~log and/or ~linear\nscaling including appropriate axes and plot title using software line\ntypes (LINSEQ).  It is similar in character to PLOTLGX. Various options\nmay be used select the format of plotting.  This routine may be used\nto plot many y value curves simultaneously with the curves distinguished\nby symbols, color, and/or line type.  This subroutine permits axis\nparameter flexibility and dimensioning for the y array values.\n.p\nNOTE: the values in the x and y arrays are modified.  Upon return they\ncontain their original contents scaled by xm,dx,ym,dy (see LINE).\n.lit\n\nCALL PLOTLGL(x,y,w,nld,npd,nl,np,iflag,isym,xl,yl,ns,s,l,\n               nmx,nnx,mlx,tsx,ndx,smx,\n               nmy,nny,mly,tsy,ndy,smy,\n               xt,nxt,yt,nyt,t,nt,<xm,xx,ym,yx<,ic>>)\n\nx     (R): array of x values dimensioned at least x(np)\ny     (R): array of y values dimensioned y(npd,nld)\nw     (R): working array dimensioned at least d(3*np+3)\nnld   (I): dimension of y array (lines)\nnpd   (I): dimension of y array (points)\nnl    (I): number of data lines to plot from y array\nnp    (I): number of points per data line\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n (magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : plot x linear, y logarithmic (base 10)\n                = 2 : plot x logarithmic, y linear\n                = 3 : plot x logarithmic, y logarithmic\n                = 4 : plot x linear, y linear\n   (10's digit) = 0 : no axes or title plotted\n                = 1 : axes with axis line/ticks on top and sides\n                = 2 : plot solid cartesian grid\n                = 3 : plot ticked cartesian grid without box\n                = 4 : plot ticked cartesian grid with box\n                = 5 : ticked cartesian grid, box w/axis ticks\n                = 6 : plot without box or cartesian grid\n                = 7 : plot solid logarithmic grid\n                = 8 : plot dotted logarithmic grid\n                = 9 : plot ticked logarithmic grid\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nisym  (I): plot a symbol every isym'th point\n           < 0 : symbols only plotted, no line\n           = 0 : no symbols, line only\n           > 0 : symbol plotted every isym'th point\nxl    (R): x axis length in inches\n           < 0 : use input scaling in xm,xx\n           > 0 : use auto scaling computed from input array\nyl    (R): y axis length in inches\n           < 0 : use input scaling in ym,yx\n           > 0 : use auto scaling computed from input array\nns    (I): smoothing passes (normally zero--see LINSEQ)\ns     (R): nominal interval length (see LINSEQ)\nl     (I): linetype array dimensioned l(5*np) (see LINSEQ)\n           l(1): l1 for line 1\n           l(2): l2 for line 1\n              ...\n           l(5): l5 for line 1\n           l(6): l1 for line 2\n           l(7): l2 for line 2\n              ...\n(see AXIS2 for detailed description of axis parameters)\nnmx   (I): number of minor ticks between major ticks on x axis\nnnx   (I): highlight length of nnx-th minor tick on x axis\nmlx   (I): number of major tick marks on x axis\ntsx   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndx   (I): number of digits to right of decimal point on x axis\nsmx   (R): major tick length on x axis\nnmy   (I): number of minor ticks between major ticks on y axis\nnny   (I): highlight length of nny-th minor tick on y axis\nmly   (I): number of major tick marks on y axis\ntsy   (R): size of title and numbers on y axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndy   (I): number of digits to right of decimal point on y axis\nsmy   (R): major tick length on y axis\nxt    (B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string (limited to 99 characters)\nnt    (I): number of characters in t\n           < 0 : use color array\n           = 0 : no title\n           > 0 : do not use color array\n           if |nt|/100 > 0 : use line type list\nxm    (R): minimum value of x array (required if xl or nt < 0)\nxx    (R): maximum value of x array (required if xl or nt < 0)\nym    (R): minimum value of y array (required if xl, yl or nt<0)\nyx    (R): maximum value of y array (required if xl, yl or nt<0)\n(NOTE: color array required if nt < 0)\nic    (I): color array\n           ic(1) : color for grid\n           ic(2) : color for axis lines\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(5) : color for axis exponents\n           ic(6) : color for title (return)\n           ic(7) : color for plotted line 1\n           ic(8) : color for plotted line 2\n           ic(9) :    etc.\n\ncommon /cplotlgl/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl1  SUBROUTINE PLOTLGX\n.p\n~PLOTLGX is a routine for\nploting multiple curves defined in x,y with ~log and/or ~linear\nscaling including appropriate axes and plot title.  Various options\nmay be used select the format of plotting.  This routine may be used\nto plot many y value curves simultaneously with the curves distinguished\nby symbols, color, and/or line type.  This subroutine permits axis\nparameter flexibility and dimensioning for the y array values.\n.lit\n\nCALL PLOTLGX(x,y,nld,npd,nl,np,iflag,isym,xl,yl,\n                nmx,nnx,mlx,tsx,ndx,smx,\n                nmy,nny,mly,tsy,ndy,smy,\n                xt,nxt,yt,nyt,t,nt,<xm,xx,ym,yx<<,ic>,l>>)\n\nx     (R): array of x values dimensioned at least x(np)\ny     (R): array of y values dimensioned y(npd,nld)\nnld   (I): dimension of y array (lines)\nnpd   (I): dimension of y array (points)\nnl    (I): number of data lines to plot from y array\nnp    (I): number of points per line\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n (magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : plot x linear, y logarithmic (base 10)\n                = 2 : plot x logarithmic, y linear\n                = 3 : plot x logarithmic, y logarithmic\n                = 4 : plot x linear, y linear\n   (10's digit) = 0 : no axes or title plotted\n                = 1 : axes with axis line/ticks on top and sides\n                = 2 : plot solid cartesian grid\n                = 3 : plot ticked cartesian grid without box\n                = 4 : plot ticked cartesian grid with box\n                = 5 : plot ticked cartesian grid, box w/axis ticks\n                = 6 : plot without box or cartesian grid\n                = 7 : plot solid logarithmic grid\n                = 8 : plot dotted logarithmic grid\n                = 9 : plot ticked logarithmic grid\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nisym  (I): plot a symbol every isym'th point\n           < 0 : symbols only plotted, no line\n           = 0 : no symbols, line only\n           > 0 : symbol plotted every isym'th point\nxl    (R): x axis length in inches\n           < 0 : use input scaling in xm,xx\n           > 0 : use auto scaling computed from input array\nyl    (R): y axis length in inches\n           < 0 : use input scaling in ym,yx\n           > 0 : use auto scaling computed from input array\n(see AXIS2 for detailed description of axis parameters)\nnmx   (I): number of minor ticks between major ticks on x axis\nnnx   (I): highlight length of nnx-th minor tick on x axis\nmlx   (I): number of major tick marks on x axis\ntsx   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndx   (I): number of digits to right of decimal point on x axis\nsmx   (R): major tick length on x axis\nnmy   (I): number of minor ticks between major ticks on y axis\nnny   (I): highlight length of nny-th minor tick on y axis\nmly   (I): number of major tick marks on y axis\ntsy   (R): size of title and numbers on y axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndy   (I): number of digits to right of decimal point on y axis\nsmy   (R): major tick length on y axis\nxt    (B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string (limited to 99 characters)\nnt    (I): number of characters in t\n           < 0 : use color array\n           = 0 : no title\n           > 0 : do not use color array\n           if |nt|/100 > 0 : use line type list\nxm    (R): minimum value of x array (required if xl or nt < 0)\nxx    (R): maximum value of x array (required if xl or nt < 0)\nym    (R): minimum value of y array (required if xl, yl or nt<0)\nyx    (R): maximum value of y array (required if xl, yl or nt<0)\n(NOTE: color array required if nt < 0 or |nt|/100 >0)\nic    (I): color list\n           ic(1) : color for grid\n           ic(2) : color for axis lines\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(5) : color for axis exponents\n           ic(6) : color for title (return)\n           ic(7) : color for plotted line 1\n           ic(8) : color for plotted line 2\n           ic(9) :    etc.\nl     (I): data line type list  (required only if |nt|/100 > 0)\n\ncommon /cplotlgx/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n\n.pg\n.hl1  SUBROUTINE PLOTSC\n.p\n~PLOTSC is a very basic routine which plots the curve defined\nin x,y with axes and a plot title. Various options select the format\nof the plot.\n.lit\n\nCALL PLOTSC(x,y,n,iflag,xl,yl,xt,nxt,yt,nyt,t,nt,\n              <xm,xx,ym,yx<<,ic>,l>>)\n\nx     (R): array of x values\ny     (R): array of y values\nn     (I): number of points in x array\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n(magnitude) > 10000 : do not initialize LONGLIB before plotting\n     (1's digit) = 0 : no axis or title plotted\n                 = 1 : axes with axis line/ticks on top and sides\n                 = 2 : plot solid cartesian grid\n                 = 3 : plot ticked grid without box\n                 = 4 : plot ticked grid with box\n                 = 5 : ticked grid and box with axis tick marks\n                 = 6 : plot without box or grid\n     (10's)      = 0 : Ask which screen device to use\n                <> 0 : Screen Device Number (see FRAME)\nxl    (R): x axis length in inches (integer valued)\n           < 0 : use input scaling in xm,xx\n           > 0 : use auto scaling computed from input array\nyl    (R): y axis length in inches (integer valued)\n           < 0 : use input scaling in ym,yx\n           > 0 : use auto scaling computed from input array\nxt    (B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string (limited to 99 characters)\nnt    (I): number of characters in t\n           < 0 : use color array\n           = 0 : no title\n           > 0 : do not use color array\n           if |nt|/100 > 0 : use line type list\nxm    (R): minimum value of x array (required if xl or nt < 0)\nxx    (R): maximum value of x array (required if xl or nt < 0)\nym    (R): minimum value of y array (required if xl, yl or nt<0)\nyx    (R): maximum value of y array (required if xl, yl or nt<0)\n(NOTE: color array required if nt < 0 or |nt|/100 >0)\nic    (I): color array\n           ic(1) : color for grid\n           ic(2) : color for axis lines\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(5) : color for axis exponents\n           ic(6) : color for plotted line\n           ic(7) : color for title (return)\nl     (I): data line type (required if nt < 0 or |nt|/100 > 0)\n\ncommon /cplotsc/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl 1 SUBROUTINE PLOTSC2\n.x LINE\n.x DASHL\n.p\n~PLOTSC2 plots two curves defined by the x,y and x,y2 arrays with\naxes and a plot title.  An auto-scaling option scales the axes to\nplace both curves within the axes.  Curves are distinguished by line\ntype.  The y curve uses a solid line (LINE) while the y2 curve uses a dashed\nline (DASHL).  Various options select the format of plotting.\n.lit\n\nCALL PLOTSC2(x,y,y2,n,iflag,xl,yl,xt,nxt,yt,nyt,t,nt,\n                <xm,xx,ym,yx<<,ic>,l>>)\n\nx     (R): array of x values\ny     (R): array of y values (plotted solid)\ny2    (R): second array of y values (plotted dashed)\nn     (I): number of points in x array\niflag    (I): option flag\n             < 0 : do not close LONGLIB after plotting\n             = 0 : close LONGLIB--no plot produced\n             > 0 : close LONGLIB after plotting\n (magnitude) >10000 : do not initialize LONGLIB before plotting\n  (1's digit) = 0 : no axis or title plotted\n              = 1 : axes with axis line/ticks on top and sides\n              = 2 : plot solid cartesian grid\n              = 3 : plot ticked grid without box\n              = 4 : plot ticked grid with box\n              = 5 : plot ticked grid and box with axis tick marks\n              = 6 : plot without grid or box\n (1's digit)  = 0 : Ask which screen device to use\n             <> 0 : Screen Device Number (see FRAME)\nxl    (R): x axis length in inches (integer valued)\n           < 0 : use input scaling in xm,xx\n           > 0 : use auto scaling computed from input array\nyl    (R): y axis length in inches (integer valued)\n           < 0 : use input scaling in ym,yx\n           > 0 : use auto scaling computed from input array\nxt    (B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string (limited to 99 characters)\nnt    (I): number of characters in t\n           < 0 : use color array \n           = 0 : no title\n           > 0 : do not use color array\n           if |nt|/100 > 0 : use line type list\nxm    (R): minimum value of x array (required if xl or nt < 0)\nxx    (R): maximum value of x array (required if xl or nt < 0)\nym    (R): minimum value of y array (required if xl, yl or nt<0)\nyx    (R): maximum value of y array (required if xl, yl or nt<0)\n(NOTE: color array required if nt < 0 or |nt|/100 >0)\nic    (I): color list\n           ic(1) : color for grid\n           ic(2) : color for axis line\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(4) : color for axis exponents\n           ic(5) : color for plotted line 1\n           ic(6) : color for plotted line 2\n           ic(7) : color for title (return)\nl     (I): data line type list  (required only if |nt|/100 > 0)\n\ncommon /cplotsc2/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl 1  SUBROUTINE SCATPL\n.p\n.x scatter plot\n~SCATPL plots data point pairs (x,y) in a scatter plot format using\n~log and/or ~linear scaling including appropriate axes and plot title.\nSeveral different sets of data may be plotted on the same plot by\nspecifying different plotting symbols for each set of data points.\nVarious options select the format of plotting.  If nl=1 then the x\nand y arrays may be 1d arrays.\n.lit\n\nCALL SCATPL(x,y,nl,np,iflag,nsym,s,xl,yl,xt,nxt,yt,nyt,\n                t,nt,<xm,xx,ym,yx<,ic>>)\n\nx     (R): array of x values dimensioned x(np,nl)\ny     (R): array of y values dimensioned y(np,nl)\nnl    (I): number of symbol types (if nl=1, x,y may be 1d arrays)\nnp    (I): number of data point pairs (x,y) of same symbol type\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n (magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : plot x linear, y logarithmic (base 10)\n                = 2 : plot x logarithmic, y linear\n                = 3 : plot x logarithmic, y logarithmic\n                = 4 : plot x linear, y linear\n   (10's digit) = 0 : no axes or title plotted\n                = 1 : axes with axis line/ticks on top and sides\n                = 2 : plot solid cartesian grid\n                = 3 : plot ticked cartesian grid without box\n                = 4 : plot ticked cartesian grid with box\n                = 5 : plot ticked cartesian grid, box w/axis ticks\n                = 6 : plot without box or cartesian grid\n                = 7 : plot solid logarithmic grid\n                = 8 : plot dotted logarithmic grid\n                = 9 : plot ticked logarithmic grid\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nnsym  (I): array of symbols numbers dimensioned nsym(nl)\n           nsym(n) <  0 : dots only plotted, no symbols line n\n           nsym(n) >= 0 : plot symbol number for line n\ns     (R): size of symbols (if s <= 0, 0.1 is used)\nxl    (R): x axis length in inches (integer-valued)\n           < 0 : use input scaling in xm,xx\n           > 0 : use auto scaling computed from input array\nyl    (R): y axis length in inches (integer-valued)\n           < 0 : use input scaling in ym,yx\n           > 0 : use auto scaling computed from input array\nxt    (B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string\nnt    (I): number of characters in t\n           < 0 : use color array\n           = 0 : no title\n           > 0 : do not use color array\nxm    (R): minimum value of x array (required if xl or nt < 0)\nxx    (R): maximum value of x array (required if xl or nt < 0)\nym    (R): minimum value of y array (required if xl,yl or nt<0)\nyx    (R): maximum value of y array (required if xl,yl or nt<0)\n(NOTE: color array required if nt < 0 or |nt|/100 >0)\nic    (I): color list\n           ic(1) : color for grid\n           ic(2) : color for axis lines\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(5) : color for axis exponents\n           ic(6) : color for title (return)\n           ic(7) : color for plotted line 1\n           ic(8) : color for plotted line 2\n           ic(9) :    etc.\n\ncommon /cscatpl/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl 1  SUBROUTINE SEISPL\n.x seismic plotting\n~SEISPL allows for plotting data in the special formats often used in seismic\ndata processing using ~log and/or ~linear axis scaling.  Appropriate\naxes and plot titles may be included.  The plotting format may be\nselected by the value of ntype.   Possible plotting formats include:\nmultiple \"shaded\" waveforms, connected lines, vertical line plots, etc.\nEach line may be offset from the previous line by a specified value for\npresentation on the plot (z array).  A line may be added to indicate\nthe zero value, etc.  If nl=1 then the x and y arrays \nmay be 1d arrays.\n.lit\n\nCALL SEISPL(x,y,z,nld,npd,nl,np,iflag,ntype,size,zref,xl,yl,\n                xt,nxt,yt,nyt,t,nt,<xm,xx,ym,yx<,ic>>)\n\nx     (R): array of x values dimensioned x(npd)\ny     (R): array of y values dimensioned y(npd,nld)\nz     (R): array of y-offset values dimensioned z(nl).  Y value is\n           offset by the z value before plotting.  When using log\n           plotting note that offset occurs after taking logs.\nnld   (I): dimension of y array\nnpd   (I): dimension of x,y arrays\nnl    (I): number of lines plotted (if nl=1, x,y may be 1d arrays)\nnp    (I): number of data points to plot per line\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n (magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : plot x linear, y logarithmic (base 10)\n                = 2 : plot x logarithmic, y linear\n                = 3 : plot x logarithmic, y logarithmic\n                = 4 : plot x linear, y linear\n   (10's digit) = 0 : no axes or title plotted\n                = 1 : axes with axis line/ticks on top and sides\n                = 2 : plot solid cartesian grid\n                = 3 : plot ticked cartesian grid without box\n                = 4 : plot ticked cartesian grid with box\n                = 5 : plot ticked cartesian grid, box w/axis ticks\n                = 6 : plot without box or cartesian grid\n                = 7 : plot solid logarithmic grid\n                = 8 : plot dotted logarithmic grid\n                = 9 : plot ticked logarithmic grid\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nntype (I): plot format control\n          < 0 : line with zref plotted\n          = 0 : symbols only \n          > 0 : line without zref plotted\n (magnitude) =  1 : symbols only plotted\n             =  2 : points only plotted \n             =  3 : connected points plotted\n             =  4 : vertical lines from points to zref line plotted\n             =  5 : vertical lines plus symbol at point plotted\n             =  6 : vertical lines and connected points plotted\n             =  7 : connected points and lines on + side of zref\n             =  8 : connected points and lines on - side of zref\n             =  9 : area between connected points and zref filled\n             = 10 : positive area filled\n             = 11 : negative area filled\nsize  (R): size of symbols (ntype : 0,1,4)\n           spacing between area fill lines (ntype : 9,10,11)\n           < 0 : indicates center line to be dotted\n           > 0 : indicates center line solid (if plotted)\nzref  (R): offset added to all z values\nxl    (R): x axis length in inches\n           < 0 : use input scaling in xm,xx\n           > 0 : use auto scaling computed from input array\nyl    (R): y axis length in inches\n           < 0 : use input scaling in ym,yx\n           > 0 : use auto scaling computed from input array\nxt    (B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string\nnt    (I): number of characters in t\n           < 0 : use color array\n           = 0 : no title\n           > 0 : do not use color array\nxm    (R): minimum value of x array (required if xl or nt < 0)\nxx    (R): maximum value of x array (required if xl or nt < 0)\nym    (R): minimum value of y array (required if xl,yl or nt<0)\nyx    (R): maximum value of y array (required if xl,yl or nt<0)\n(NOTE: color array required if nt < 0)\nic    (I): color array\n           ic(1) : color for grid\n           ic(2) : color for axis lines\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(5) : color for axis exponents\n           ic(6) : color for title (return)\n           ic(7) : color for plotted line 1\n           ic(8) : color for plotted line 2\n           ic(9) :    etc.\n\ncommon /cseispl/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl1  SUBROUTINE SPLOTS\n.p\nSPLOTS plots points and/or curves defined by x,y pairs in log and/or\nlinear scaling with option error bars.\n~SPLOTS calls SPLOTSX and is provided to simplify axis specification.\n.lit\n\nCALL SPLOTS(x,y,nld,npd,nl,np,iflag,nopt,as,xl,yl,\n                 xt,nxt,yt,nyt,t,nt,<xm,xx,ym,yx<,ic>>)\n\nsee SPLOTSX for variable description\n\ncommon /csplots/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.hl1  SUBROUTINE SPLOTSX\n.x error bars\n.p\nAppropriate axes and plot title may be included.\nVarious options select the plotting format of plotting.  Possible plot\nformats include scatter plots, connected line points with error bars\nshown, points with error bars, a displacement line from x axis, etc. \n.p\nThis subroutine may be used to plot several sets of curves.  For a given\nset (or line) of points, the upper error bar value may be given in the \nnext set (or line) of points.  The lower error bar value may be given in\nthe following set (or line).  When the error bar option is used, the value\nof nl should be the number of points sets (or lines) to be plotted not\nincluding the error bar sets.  This subroutine permits axis parameter\nflexibility and dimensioning for y array.\n.lit\n\nCALL SPLOTSX(x,y,nld,npd,nl,np,iflag,nopt,as,xl,yl,\n                nmx,nnx,mlx,tsx,ndx,smx,nmy,nny,mly,tsy,ndy,smy,\n                xt,nxt,yt,nyt,t,nt,<xm,xx,ym,yx<,ic>>)\n\nx     (R): array of x values dimensioned at least x(np)\ny     (R): array of y values dimensioned y(npd,nld)\nnpd   (I): dimension of y\nnld   (I): dimension of y\nnl    (I): number of y lines to plot (see note below)\nnp    (I): number of points per line\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n (magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : plot x linear, y logarithmic (base 10)\n                = 2 : plot x logarithmic, y linear\n                = 3 : plot x logarithmic, y logarithmic\n                = 4 : plot x linear, y linear\n   (10's digit) = 0 : no axes or title plotted\n                = 1 : axes with axis line/ticks on top and sides\n                = 2 : plot solid cartesian grid\n                = 3 : plot ticked cartesian grid without box\n                = 4 : plot ticked cartesian grid with box\n                = 5 : ticked cartesian grid, box w/axis ticks\n                = 6 : plot without box or cartesian grid\n                = 7 : plot solid logarithmic grid\n                = 8 : plot dotted logarithmic grid\n                = 9 : plot ticked logarithmic grid\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nnopt  (I): option flag\n   (1's digit)  = 0 : disconnected points\n                = 1 : connected points\n                = 2 : disconnected symbols\n                = 3 : connected symbols\n                = 4 : vertical line from point to x axis\n                = 5 : connect points, add vertical line from each\n                      data point to x axis\n                = 6 : symbol plus vertical line from point to x axis\n   (10's digit) = 0 : no error bars\n                = 1 : error bars (see above)\n                = 2 : error bars witout end bars (see above)\n   (100's)      > 0 : every (*) point shown with a symbol\n                      (0 equivalent to 1)\nas    (R): size of plotted symbol and/or error bar\nxl    (R): x axis length in inches\n           < 0 : use input scaling in xm,xx\n           > 0 : use auto scaling computed from input array\nyl    (R): y axis length in inches\n           < 0 : use input scaling in ym,yx\n           > 0 : use auto scaling computed from input array\n(see AXIS2 for detailed description of axis parameters)\nnmx   (I): number of minor ticks between major ticks on x axis\nnnx   (I): highlight length of nnx-th minor tick on x axis\nmlx   (I): number of major tick marks on x axis\ntsx   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndx   (I): number of digits to right of decimal point on x axis\nsmx   (R): major tick length on x axis\nnmy   (I): number of minor ticks between major ticks on y axis\nnny   (I): highlight length of nny-th minor tick on y axis\nmly   (I): number of major tick marks on y axis\ntsy   (R): size of title and numbers on y axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndy   (I): number of digits to right of decimal point on y axis\nsmy   (R): major tick length on y axis\nxt    (B): x axis title string\nnxt   (I): number of characters in xt\n           < 0 : axis ticks on top of x axis\n           = 0 : no axis\n           > 0 : axis ticks on bottom of x axis (normal)\nyt    (B): y axis title string\nnyt   (I): number of characters in yt\n           < 0 : axis ticks on right of y axis\n           = 0 : no axis\n           > 0 : axis ticks on left of y axis (normal)\nt     (B): plot title string\nnt    (I): number of characters in t\n           < 0 : use color array\n           = 0 : no title\n           > 0 : do not use color array\nxm    (R): minimum value of x array (required if xl or nt < 0)\nxx    (R): maximum value of x array (required if xl or nt < 0)\nym    (R): minimum value of y array (required if xl,yl or nt<0)\nyx    (R): maximum value of y array (required if xl,yl or nt<0)\n(NOTE: color array required if nt < 0)\nic    (I): color list\n           ic(1) : color for grid\n           ic(2) : color for axis lines\n           ic(3) : color for axis numbers\n           ic(4) : color for axis titles\n           ic(5) : color for axis exponents\n           ic(6) : color for title (return)\n           ic(7) : color for points in line 1\n           ic(8) : color for symbols/error bars line 1\n           ic(9) : color for points in line 2\n           ic(10): color for symbols/error bars line 2\n           ic(11):    etc.\n\ncommon /csplotsx/xmr,dxr,ymr,dyr\n\nxmr   (R): returned value of xmin\ndxr   (R): returned value of scale factor (xmax-xmin)/xlen\nymr   (R): returned value of ymin\ndyr   (R): returned value of scale factor (ymax-ymin)/ylen\n.end lit\n\n.pg\n.hl1  SUBROUTINE T3DH\n.p\n.x surface plot\n~T3DH plots a 3-d surface defined on a uniformly spaced 2-d grid in\nthe x,y plane using a triangular mesh with hidden line removal.  The\nsurface can be viewed from any angle.\nThe input consists of the values of the z axis for each\n(x,y) point on the plane.  Each square grid is plotted as two triangles\nusing either ~SKETCH or ~PLT3DH permitting hidden line removal if desired.\nT3DH calls ~INIT3DH to initialize the 3-d hidden line package.  Default\nspace is provided in the INIT3DH common block.  The ISIZE variable will\nbe reset to the internal size if its value is smaller than the internal\nsize.  Sufficient space is provided for very complex surfaces.\n.lit\n\nCALL T3DH(z,ndx,ndy,nx,ny,s,p,t,dv,xl,yl,zl,iflag,ia,\n                xt,nxt,xm,xx,tx,sx,gx,fx,\n                yt,nyt,ym,yy,ty,sy,gy,fy,\n                zt,nzt,tz,sz,gz,fz,zm,zx<,ic>)\n\nz      (R): array of z values\nndx,ndy(I): dimensions of z array\nnx,ny  (I): number of points in each dimension to use of z array\ns,p,t  (R): yaw,roll,pitch angles of axes (see INIT3DH)\ndv     (R): perspective scale factor for INIT3DH\n            < 0 : no hidden lines in SKETCH, INIT3DH called\n            = 0 : INIT3DH not called to initialize 3d package,\n                  (INIT3DH previously called)\n            > 0 : hidden lines in SKETCH, INIT3DH called\n            = 9999 : no perspective in INIT3DH\nxl     (R): x axis length in inches\nyl     (R): y axis length in inches\nzl     (R): z axis length in inches\niflag  (I): option flag\n            < 0 : do not close LONGLIB after plotting\n            = 0 : close LONGLIB--no plot produced\n            > 0 : close LONGLIB after plotting\n (magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : do not use color array\n                = 2 : use color array\n   (10's digit) = 0 : hidden line removal for surface only\n                = 1 : hidden line removal for axis and surface\n                = 2 : no hidden line removal (SKETCH not used)\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nia     (I): axis option flag\n            < 0 : plot axis use input z axis scale\n            = 0 : do not plot axes\n            > 0 : plot axis use computed z axis scale\n   (1's digit)  = 1 : plot y axis using input scale\n                = 2 : plot y axis using input, smoothed scale\n   (10's digit) = 1 : plot x axis using input scale\n                = 2 : plot x axis using input, smoothed scale\nxt     (B): x axis title string\nnxt    (I): number of characters in x axis title\n            < 0 : axis ticks on top of x axis\n            = 0 : no axis\n            > 0 : axis ticks on bottom of x axis (normal)\ntx     (R): number and pattern of axis ticks (see AXIS3)\nsx     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\ngx     (R): rotation angle for x axis (see AXIS3DH)\nfx     (R): format of axis number labeling (see AXIS3)\nyt     (B): y axis title string\nnyt    (I): number of characters in y axis title\n            < 0 : axis ticks on top of axis\n            = 0 : no axis\n            > 0 : axis ticks on bottom of axis (normal)\nty     (R): number and pattern of axis ticks (see AXIS3)\nsy     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\ngy     (R): rotation angle for y axis (see AXIS3DH)\nfy     (R): format of axis number labeling (see AXIS3)\nzt     (B): z axis title string\nnzt    (I): number of characters in z axis title\n            < 0 : axis ticks on top of axis\n            = 0 : no axis\n            > 0 : axis ticks on bottom of axis (normal)\ntz     (R): number and pattern of axis ticks (see AXIS3)\nsz     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\ngz     (R): rotation angle for z axis (see AXIS3DH)\nfz     (R): format of axis number labeling (see AXIS3)\nxm,ym  (R): minimum value displayed on each axis\nxx,yx  (R): maximum value displayed on each axis\nzm     (R): minimum value of z axis (required if ia < 0)\nzx     (R): maximum value of z axis (required if ia < 0)\nic     (I): color array (required if 1's digit of iflag=2)\n            ic(1) : color of axis\n            ic(2) : surface color\n.end lit\n\n.pg\n.hl1  SUBROUTINE TRIG3DH\n.p\n.x surface plot\n.x triangc\n~TRIG3DH plots a 3-d surface specified by randomly scatted set of points\nas a triangular mesh with hidden line removal.  The surface may be\nviewed from any angle.\nThe input consists of a list of triplets defining the surface.\nThe triplets are triangulated using TRIANGC.  Each triangle is\nplotted using either ~SKETCH or ~PLT3DH permitting hidden line\nremoval if desired.  TRIG3DH calls ~INIT3DH to initialize the\n3-d hidden line package.  Default space is provided in the INIT3DH\ncommon block.  The ISIZE variable will be reset to the internal\nsize if its value is smaller than the internal size.  Sufficient\nspace is provided for very complex surfaces.\n.lit\n\nCALL TRIG3DH(x,y,z,n,s,p,t,dv,xl,yl,zl,iflag,ia,\n                xt,nxt,tx,sx,gx,fx,\n                yt,nyt,ty,sy,gy,fy,\n                zt,nzt,tz,sz,gz,fz,\n                xm,xx,ym,yx,zm,zx<,ic>)\n\nx,y,z (R): array of point triplets (x,y,z)\nn     (I): number of points\ns,p,t (R): yaw,roll,pitch angles of axes (see INIT3DH)\ndv    (R): perspective scale factor for INIT3DH\n            < 0 : no hidden lines in SKETCH, INIT3DH called\n            = 0 : INIT3DH not called to initialize 3d package,\n                  (INIT3DH previously called)\n            > 0 : hidden lines in SKETCH, INIT3DH called\n            = 9999 : no perspective in INIT3DH\nxl    (R): x axis length in inches\nyl    (R): y axis length in inches\nzl    (R): z axis length in inches\niflag (I): option flag\n           < 0 : do not close LONGLIB after plotting\n           = 0 : close LONGLIB--no plot produced\n           > 0 : close LONGLIB after plotting\n (magnitude) > 10000 : do not initialize LONGLIB before plotting\n   (1's digit)  = 1 : do not use color array\n                = 2 : use color array\n   (10's digit) = 0 : hidden line removal for surface only\n                = 1 : hidden line removal for axis and surface\n                = 2 : no hidden line removal (SKETCH not used)\n   (100's)      = 0 : Ask which screen device to use\n               <> 0 : Screen Device Number (see FRAME)\nia    (I): axis option flag\n           < 0 : do not plot axes\n           > 0 : plot axes according to the code,\n   (1's digit)   = 1 : plot z axis using computed scale\n                 = 2 : plot z axis using computed, smoothed scale\n                 = 3 : plot z axis using input scale\n                       input scale variables required\n                 = 4 : plot z axis using input, smoothed scale\n   (100's digit) = 1 : plot y axis using computed scale\n                 = 2 : plot y axis using computed, smoothed scale\n                 = 3 : plot y axis using input scale\n                       input scale variables required\n                 = 4 : plot y axis using input, smoothed scale\n   (100's digit) = 1 : plot x axis using computed scale\n                 = 2 : plot x axis using computed, smoothed scale\n                 = 3 : plot x axis using input scale\n                       input scale variables required\n                 = 4 : plot x axis using input, smoothed scale\nxt     (B): x axis title string\nnxt    (I): number of characters in x axis title\n            < 0 : axis ticks on top of x axis\n            = 0 : no axis\n            > 0 : axis ticks on bottom of x axis (normal)\ntx     (R): number and pattern of axis ticks (see AXIS3)\nsx     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\ngx     (R): rotation angle for x axis (see AXIS3DH)\nfx     (R): format of axis number labeling (see AXIS3)\nyt     (B): y axis title string\nnyt    (I): number of characters in y axis title\n            < 0 : axis ticks on top of axis\n            = 0 : no axis\n            > 0 : axis ticks on bottom of axis (normal)\nty     (R): number and pattern of axis ticks (see AXIS3)\nsy     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\ngy     (R): rotation angle for y axis (see AXIS3DH)\nfy     (R): format of axis number labeling (see AXIS3)\nzt     (B): z axis title string\nnzt    (I): number of characters in z axis title\n            < 0 : axis ticks on top of axis\n            = 0 : no axis\n            > 0 : axis ticks on bottom of axis (normal)\ntz     (R): number and pattern of axis ticks (see AXIS3)\nsz     (R): size of axis labeling (see AXIS3)\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\ngz     (R): rotation angle for z axis (see AXIS3DH)\nfz     (R): format of axis number labeling (see AXIS3)\nxm,xx  (R): minimum, maximum value of x axis\nym,yx  (R): minimum, maximum value of y axis\nzm,zx  (R): minimum, maximum value of z axis\nic     (I): color array (required if 1's digit of iflag=2)\n            ic(1) : color of axis\n            ic(2) : surface color\n.end lit\n\n.pg\n.hl 1 SUBROUTINE VAX3D\n.p\nVAX3D plots a 3-d surface by plotting 2-d slices of the surface paralel\nto the x-z plane with hidden line removal.  See VAX3DX.\n~VAX3D calls VAX3DX using default axis parameters to simplify calling\nprocedure.\n.lit\n\nCALL VAX3D(d,ndx,ndz,nx,nz,a,b,xh,yh,zh,iflag,iax,<xt,nxt,xs,xe,\n               yt,nyt,zt,nzt,zs,ze,<dm,dx<,ic>>>)\n\nSee VAX3DX for parameter description.\n (iax is limited to a single digit)\n.end lit\n\n.hl 1 SUBROUTINE VAX3DX\n.p\n.x 2-d surface plot\n~VAX3DX is a simple 3-d surface plotting routine.  A 3-d surface is\nplotted by plotting slices through the surface which are parallel to\nthe x-y plane.  The y value of the surface at the intersection\nof the slice plane and the y value plotted.  Hidden lines are supressed,\ngiving the illusion of a 3 dimensional surface.  The height of plotted\nsurface relative to its y axis value is calibrated to x and z axis.  No\nperspective is used.  Options exist to varying the plotting angle and \nto plot axes.\n.p\nOrigin of the plot is in the lower-left corner.  The x axis runs\nleft to right along the plot bottom.  The y axis is plotted\nas a vertical displacement offset by the z axis value.  The z axis appears\nto point into the screen.  This, with the hidden line removal, gives the\nillusion of depth.\n.P\nVAX3DX contains an internal working storage arrays dimensioned sufficiently\nlarge for most sufaces.  However, for very complex surfaces, the working\nstorage buffer length may be exceeded.  In this case\nan error message is written to the terminal and the routine terminated.\n.lit\n\nCALL VAX3DX(d,ndx,ndz,nx,nz,a,b,xh,yh,zh,iflag,iax,\n               <xt,nxt,xs,xe,nmx,nnx,mlx,tsx,ndx,smx,\n                yt,nyt,nmy,nny,mly,tsy,ndy,smy,\n                zt,nzt,zs,ze,nmz,nnz,mlz,tsz,ndz,smz,\n               <dm,dx<,ic>>>)\n\nd        (R): array of y values dimensioned d(ndx,ndz)\nndx,ndz  (I): x and z dimensions of d array\nnx,nz    (I): x and z sizes of surface to plot d array\na        (R): angle of x axis from horizontal 0-85 degrees\nb        (R): angle of z axis from horizontal 0-90 degrees\n              note: origin (1,1) is in lower-left corner\n                    x axis runs left to right on screen\n                    y axis runs up to down on screen\n                    z axis appears to run into the screen but\n                        is angled to the right\nxh,yh,zh (R): length of each axis\niflag    (I): option flag\n             < 0 : do not close LONGLIB after plotting\n             = 0 : close LONGLIB--no plot produced\n             > 0 : close LONGLIB after plotting\n (magnitude) >10000 : do not initialize LONGLIB before plotting\n  (1's digit)  = 2 : use color array (need all parameters)\n               = 1 : do not use color array\n  (10's digit) = 0 : Plot sides\n               = 1 : Do not plot sides\n  (100's)      = 0 : Ask which screen device to use\n              <> 0 : Screen Device Number (see FRAME)\niax   (I): axis format control\n           < 0 : plot axes, use input scale factors dm and dx\n           = 0 : no axes plotted, optional parameters (xt...dx) \n                 not used, scaling computed from input array\n           > 0 : plot axes, use scaling computed from input array\n                 only axis parameters xt through smz required.\n (1's digit)  = 1 : Plot actual max/min or input values for Y axis\n              = 2 : Plot smoothed values for Y axis\n (10's digit) = 0 : Use default axis type\n              = 1 : Use input AXIS2-type axis parameters\n                     (nmx, nnx, mlx, tsx, ndx, etc.)\n(NOTE: the following optional paramters are used if iax < 0 \n       or mod(iflag,10)=1)\nxt    (B): title of x axis (width)\nnxt   (I): number of characters in xt\n           = 0 : no axis plotted\n           > 0 : normal\nxs,xe (R): starting and ending values displayed on x axis\n(see AXIS2 for detailed description of axis parameters)\nnmx   (I): number of minor ticks between major ticks on x axis\nnnx   (I): highlight length of nnx-th minor tick on x axis\nmlx   (I): number of major tick marks on x axis\ntsx   (R): size of title and numbers on x axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndx   (I): number of digits to right of decimal point on x axis\nsmx   (R): major tick length on x axis\nyt    (B): title of y axis (depth)\nnyt   (I): number of characters in yt\n           = 0 : no y axis plotted\n           > 0 : normal\nnmy   (I): number of minor ticks between major ticks on y axis\nnny   (I): highlight length of nny-th minor tick on y axis\nmly   (I): number of major tick marks on y axis\ntsy   (R): size of title and numbers on y axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndy   (I): number of digits to right of decimal point on y axis\nsmy   (R): major tick length on y axis\nzt    (B): title of z axis (height)\nnzt   (I): number of characters in zt\n           = 0 : no z axis plotted\n           > 0 : normal\nze,ze (R): starting and ending valued displayed on z axis\nnmz   (I): number of minor ticks between major ticks on z axis\nnnz   (I): highlight length of nnz-th minor tick on z axis\nmlz   (I): number of major tick marks on z axis\ntsz   (R): size of title and numbers on z axis\n           < 0 auto exponent scaling (x10 to power) disabled\n           > 0 auto exponent scaling (x10 to power) enabled\nndz   (I): number of digits to right of decimal point on z axis\nsmz   (R): major tick length on z axis\n(NOTE: the following optional parameters are required only if\n       iax < 0 or mod(iflag,10)=1)\ndm,dx (R): minimum and maximum values of d array\n(NOTE: color array required only if mod(iflag,10)=1)\nic    (I): color list\n           ic(1) : color for axis lines\n           ic(2) : color for axis numbers\n           ic(3) : color for axis titles\n           ic(4) : color for axis exponents\n           ic(5) : color index for lower plot surface (return)\n           ic(6) : color index for upper plot surface (return)\n.end lit\n\n.pg\n.hl 1 SUBROUTINE VAX5D\n.p\n.x 5-d surface\n.x 4-d surface plot\n.x VAX3D\n~VAX5D plots a 4 or 5-d surface by plotting slices through the 3rd and\n4th dimensions in a 2-d array of of 3-d plots. Each 3-d surface\nplots d(*) as a function of 2 of the dimensions using VAX3D.\n.p\nOrigin of the plot is in the lower-left corner.  The X axis runs\nleft to right along the subplot bottom.  The Y axis is plotted into\nthe page of the subplot (see VAX3D).\nThe Z axis runs left to right in subplots\nwith the W axis vertical subplots.\n.tp 8\n.lit\n\n        ^ W\n        |\n        |  d  Y  \n        |  |/_ X\n        |\n        ----------> Z\n.end lit\n.p\nSince the subplots may runoff the edge of the plotting page, the routine\nincludes a page size option to issue a NEWPAGE and plot the additional\nsubplots on separate pages.  A shrinking factor is included to shrink the\nsubplots.\nLabeling of the W and Z axis is due in the lower right hand corner.\nEach subplot is further tagged with the corresponding W and Z axis\nvalue.  A multiple page plot can be pasted together to form a large\nrepresentation of a 5-d (or 4-d) surface.\n.lit\n\nCALL VAX5D(d,nd,n,a,b,iflag,iax,iform,w,xh,yh,zh,ph,pl,fac,iw,iz,\n            st,en,t1,nt1,t2,nt2,t3,nt3,t4,nt4,dt,ndt,<dm,dx<,ic>>)\n\nd        (R): array to plot dimensioned d(nd(1),nd(2),nd(3),nd(4))\nnd       (I): array of dimensions of d array\nn        (I): array of the number of points from in dimension to plot\na,b      (R): angles a,b for VAX3D subplot\niflag    (I): option flag\n              < 0 : do not close LONGLIB after plotting\n              = 0 : close LONGLIB--no plot produced\n              > 0 : close LONGLIB after plotting\n (magnitude) > 10000 : do not initialize LONGLIB before plotting\n  (1's digit)  = 2 : use color array (need all parameters)\n               = 1 : do not use color array\n  (10's digit) = 0 : Plot sides of subplots\n               = 1 : Do not plot sides\n  (100's)      = 0 : Ask which screen device to use\n              <> 0 : Screen Device Number (see FRAME)\niax   (I): axis format control\n           < 0 : plot axes, use input scale factors dm and dx\n           = 0 : no axes plotted, optional parameters (t1...dx)\n                 not used, scaling computed from input array\n           > 0 : plot axes, axis parameters t1 through nt4 used,\n                 scaling computed from input array\n (1's digit)  = 1 : Plot actual max/min or input values for Y axis\n              = 2 : Plot SCALE smoothed values for Y axis\n (10's digit) = 0 : Axes plotted for all subplots\n              = 1 : Axes plotted only for first subplot\niform    (I): plot format code \n              selects which dimension of d array is to become\n              which output axis \n\n          plot axis                     plot axis\nCode      X  Y  Z  W            Code    X  Y  Z  W\n_____    ____________          _____  ____________\n 1 input: 1  2  3  4             13     3  1  2  4\n 2 dimen- 1  2  4  3             14     3  1  4  2\n 3 sion   1  4  2  3             15     3  2  1  4\n 4 number 1  4  3  2             16     3  2  4  1\n 4        1  4  3  2             16     3  2  4  1\n 5        1  3  2  4             17     3  4  1  2\n 6        1  3  4  2             18     3  4  2  1\n 7        2  1  3  4             19     4  1  2  3\n 8        2  1  4  3             20     4  1  3  2\n 9        2  4  3  1             21     4  2  1  3\n 10       2  4  1  3             22     4  2  3  1\n 11       2  3  4  1             23     4  3  1  2\n 12       2  3  1  4             24     4  3  2  1\n\nw        (R): working array dimensioned at least n(x)*n(y)\nxh,yh,zh (R): length of each axis of subplot\nph,pl    (R): page height, length when multiple pages required\nfac      (R): shrink factor for subplots (2 == FACTOR(1/2))\niw,iz    (I): plot every iw'th and iz'th subplots\nst,en    (R): arrays containing axes start and end values (permuted\n              along with d array dimensions)\n(NOTE: titles/number of characters permuted with d array dimensions)\nt1       (B): title corresponding to 1st dimension of d\nnt1      (I): number of characters in title t1\n              = 0 : no axis plotted\n              > 0 : axis plotted\nt2       (B): title corresponding to 2st dimension of d\nnt2      (I): number of characters in title t2\n              = 0 : no axis plotted\n              > 0 : axis plotted\nt3       (B): title corresponding to 3rd dimension of d\nnt3      (I): number of characters in title t3\n              = 0 : no axis plotted\n              > 0 : axis plotted\nt4       (B): title corresponding to 4th dimension of d\nnt4      (I): number of characters in title t4\n              = 0 : no axis plotted\n              > 0 : axis plotted\nt5       (B): title corresponding to 5th dimension of d\nnt5      (I): number of characters in title t5\n              = 0 : no axis plotted\n              > 0 : axis plotted\n(NOTE: the following optional parameters are required only if \n      iax < 0 or mod(iflag,10) = 1)\ndm,dx    (R): minimum and maximum scale values for array\nic       (I): color array\n              ic(1) : color for axis lines\n              ic(2) : color for axis numbers\n              ic(3) : color for axis titles\n              ic(4) : color for axis exponents\n              ic(5) : color index for lower plot surface (return)\n              ic(6) : color index for upper plot surface (return)\n.end lit\n\n.Chapter Miscellaneous Routines\n.P\nThe subroutines listed below are ~miscellaneous functions and \nroutines used by the previously described routines.  These are low-level\nroutines documented for the use of advanced LONGLIB programers.\n\n.hl1  INTEGER FUNCTION IPCLIP\n.p\n~IPCLIP tests a point to determine if it lies in a rectangle defined by\nxm,ym,xx,yx and returns an integer value indicating where point is in relation\nto rectangle.  The value can be easily be decoded by \"anding\" return\nvalue with the binary values of 1, 2, 4, 8.\n.lit\n\n                      9 | 8  | 10\n                    --------------\n                      1 | 0  | 2\n                    --------------\n                      5 | 4  | 6\n.end lit\n.lit\n\niflag = IPCLIP(x,y,xm,ym,xx,yx)\n\nx,y   (R): point to test\nxm,ym (R): lower left corner of rectangle\nxx,yx (R): upper right corner of rectangle\niflag (I): clip flag (0-10) (see above)\n.end lit\n\n.hl1 SUBROUTINE GCONTR\n.p\n~GCONTR draws contour lines of a 2-d array using a technique which\nproduces long, connected contour lines.  It assumes that the points\nof the input array are equally spaced in each dimension.  Several\noptions for contouring are provided.  When cs, the label character size\nis positive, the origin point (1,1) is in the\nlower-left corner and the point (i,j) in the array is plotted at,\n.lit\n\n      xplot = (i-1)*xl\n      yplot = (j-1)*yl\n\n.end lit\nIf cs is negative, the x and y values plotted (xp,yp) for the point\n(i,j) in the array are computed using\nthe ~PLT3D ~transformation common block ~PLT3B (see PLT3D),\n.lit\n\n        xp = a1 * (yl * j) + a2 * (xl * i) + a3\n        yp = b1 * (yl * j) + b2 * (xl * i) + b4\n.end lit\nwhere the vertical height (z) is zero.  In this case, xl and yl\nshould be set to 1.0 and PLT3D should be called before GCONTR.\nGCONTR is used in the MASTER routine ~LCNTR and CVAX3DX.\n.x CVAX3DX\n.lit\n\nCALL GCONTR(z,ndx,ndy,nx,ny,xl,yl,cv,nv,zm,iw,n,cs,m,i,ic,il)\n\nz       (R): 2-d array of values dimensioned z(nx,ny)\nndx,ndy (I): dimensions of data array\nnx,ny   (I): number of points to use in array\nxl,yl   (R): axis length scale factors (inches/array index)\ncv      (R): array of contour levels dimensioned cl(nv)\nnv      (I): number of contour levels  (note: if nv < 0 then only\n             one contour level is used.  It will be labeled with\n             the abs(nv)'th symbol)\nzm      (R): maximum value of z for consideration.  A z value which\n             exceeds this value will be ignored. The cell edges\n             which include this point will not be included in\n             contouring.\niw      (I): workspace dimensioned at least (2*nx*ny*nv+1)/31\nn       (I): contour labeling option\n             < 0 label with contour value (number with n digits\n                 to the right of the decimal point)\n             = 0 no labelling of contours\n             > 0 label with alphabet (nl should be less than 26)\ncs      (R): size of labels\n             < 0 : plot contours using PLT3B transformation\n                   xl and yl should then be set to 1.0 (see notes)\n             > 0 : normal location specification\nm       (I): minimum number of cells crossed by contour in order\n             for contour to be labeled\ni       (I): color and line type flag\n             = 0 color and line type arrays not used\n             = 1 color array used\n             = 2 line type array used\n             = 3 color and line type array used\nic      (I): color list for each contour (only requied for i>0)\nl       (I): line type list for contours (required only for i>1)\n.end lit\n\n.hl1 INTEGER FUNCTION INXTCHR\n.x vt100\n.p\n~INXTCHR returns a single key pressed on the terminal.  In the VAX/VMS\nenvironment, it will intercept all control\nkeys (including <ESC>) except ^Y,^T,^R,^Q,^Z,^S without echoing to the\nscreen.  Opens a direct IO ~channel to the terminal driver using SYSQIO.\nThis routine is used by the ~PAUSE and ~CURMOTION routines.\n.lit\n\nkey  = INXTCHR()\n\nkey (I): (returned) terminal character (ASCII value)\n         if key < 0, an error reading terminal input has occured.\n.end lit\n\n.hl1 INTEGER FUNCTION IRMCHAN\n.p\n.x ramopen\n~IRMCHAN returns the ~channel number and the Ramtek device number\nused by the plot package (as assigned\nby RAMOPEN) for communicating with the Ramtek.\nReturns a negative value when the Ramtek package is not initialized\nor when the Ramtek channel is not yet assigned.\n.lit\n\nich = IRMCHAN(id)\n\nid  (I): (returned) Ramtek device number\nich (I): (returned) Ramtek channel number\n         if ich <=0 the Ramtek is not is use.\n.end lit\n\n.hl1 SUBROUTINE MATMUL4\n.p\n~MATMUL4 multiplies two 4x4 matrixes A and B and sets C=AB.  Does not\nchange the contents of A and B.\n.lit\n\nCALL MATMUL4 (c,a,b)\n\nc,a,b (R): 4 x 4 matrixes\n.end lit\n\n.hl1 SUBROUTINE MTV4\n.p\n~MTV4 multiplies a 4 element row vector by a 4x4 matrix and sets V2=A V1.\n.lit\n\nCALL MTV4 (v2,a,v1)\n\n\nv2  (R): 4 element row vector\na   (R): 4 x 4 matrix\nv1  (R): 4 element row vector\n.end lit\n\n.hl1 SUBROUTINE NXTVU\n.p\n.x plt3d\n~NXTVU is used internally by PLT3D.  NXTVU computes the maximum (or minimum)\nof two piecewise linear functions: the curve specified in the input d array\nand the curve stored in the working array w.\nOn return the new maximum (minimum) curve replaces the old in w.  Any line\nsegments or fractions thereof above (below) the maximum (minimum) are plotted.\nIf iabs(i)=1 the input is copied into the working array and plotted.\nSubsequent calls should use iabs(i)=2.\nUsing i positive computes the maximum while using i negative plots the\nminimum.\n.p\nA grid of lines in only one dimension may be made by calling NXTVU once\nfor each row, adjusting the d curve to offset each row by a small\namount to give the impression of a surface.\n.p\nThe dimension of the working arrays is dependent of the surface\ncomplexity -- the greater the complexity the larger n2 must be.  ier is\nused to indicate when n2 is not large enough.  As a minimum n2>2*n.\nNote: w should not be modified between calls.\n.lit\n\nCALL NXTVU (i,d,n,w,n2,ier)\n\ni     (I): initialize code\n             < 0 : plot lower side of surface\n            => 0 : plot upper side of surface\n            = -1 : first call for lower surface plot\n            = -2 : subsequent calls for lower surface plot\n            =  1 : first call for upper surface plot\n            =  2 : subsequent calls for upper surface plot\nd     (R): array of (x,y) coordinate pairs dimensioned d(2*n)\n            d(1) = x(1)\n            d(2) = y(1)\n            d(3) = x(2)\n             ...\nn     (I): number of coordinate pairs in d array\nw     (R): working storage array of dimensioned d(n2)\n            (should not be modified between calls)\nn2    (I): dimension of working array\nier   (I): (returned) error code\n            = 0 : no error\n            = 1 : out of space in w\n.end lit\n\n.hl1 SUBROUTINE PAUSE\n.x INXTCHR\n.p\n~PAUSE prompts terminal without a CTERM(1) for a keystroke to continue.\nUses INXTCHR.\n.lit\n\nCALL PAUSE\n      (no arguments)\n.end lit\n\n.hl1 SUBROUTINE PAUSEP\n.x INXTCHR\n.p\n~PAUSEP prompts terminal for a keystroke to continue.  Includes appriate\n~CTERM calls to prompt in text mode then returns terminal to plot mode.\nUses INXTCHR.\n.lit\n\nCALL PAUSEP\n      (no arguments)\n.end lit\n\n\n.hl1 SUBROUTINE RAMCLOSE\n.p\n~RAMCLOSE closes and deassigns the ~Ramtek channel and deallocates the device.\nWhen the ~REF routines are used, it interatively prompts for the output\ndevice and option.  ~REFDIS called prior to RAMCLOSE disables the prompting\nin the REF package.  Note that RAMCLOSE is call by ~PLOTRM when a\nPLOTND or PLOTRM(0.,0.,11) is called.\n.lit\n\nCALL RAMCLOSE (ic)\n\nic   (I): channel number (from RAMOPEN or IRMCHAN)\n.end lit\n\n\n.hl 1 SUBROUTINE REFDIS\n.p\n~REFDIS is used only in the ~LONGLIBR version of the longlib graphics\nlibrary.  It is a dummy call for other versions.  REFDIS is a non-interactive\nmethod of specifying the output device (REF file, terminal screen, or\nLONGLIB metafile) to be used for outputing the REF bit-map Ramtek image array.\nWhen called prior to PLOTND, it outputs the array to the device\nspecified in the call without user intervention.\nWhen REFDIS is not called prior to PLOTND, PLOTND will call REFDIS and\nthe user will be prompted for the output device and option.\nNote: REFDIS may be called multiple times to output to several devices.\n.p\nWhen the internal REF data array is output to the terminal or metafile\noutput each line of the internal array is scanned left to right.  Connected\npixels having the same color are collected and plotted (using PLOT) to the\noutput device. Pixels with 0 value are not output.  The pixel-to-inch\noutput scaling can be user selected to correspond to the actual hardware\nresolution of the output device.  Normal resolution for the terminal output\nis 9.5/1024 inch/pixel (most terminals do not actually have this resolution).\nNormal resolution for the meta file output is 1/300 inch/pixel.  \nHence, at normal resolution, the 1280x1024 pixel REF array more than\nfills the terminal screen.  The pixel image is output with the lower-left\ncorner at (0,0).  By changing the origin prior to call the user can \ndisplay any desired portion of the image.\n.lit\n\nCALL REFDIS(id,ot,n,rx,ry)\n\nid    (I): Output device\n           =-1 : graphics terminal number code (see FRAME)\n                 user-specified (rx,ry) used\n           = 1 : graphics terminal number code (see FRAME)\n                 default resolution used\n           = 2 : Ramtek emulation file (REF)\n                 (ot = 1 : absolute file write)\n                 (ot = 2 : write out only non-zero pixels)\n                 (ot = 3 : write out only zero pixels)\n           =-3 : LONGLIB metafile output\n                 user-specified (rx,ry) used\n           = 3 : LONGLIB metafile output\n                 default resolution used\not    (I): Output option code (see above)\nn     (C): REF file name\nrx,ry (R): user-specified output resolution (inch/pixel)\n.end lit\n\n.hl 1 SUBROUTINE RMCLEAR\n.p\n~RMCLEAR clears ~Ramtek screen.\n.lit\n\nCALL RMCLEAR (ic,ie)\n\nic   (I): channel number (from RAMOPEN or IRMCHAN)\nie   (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE RMDIR\n.x Ramtek image data\n.p\n~RMDIR sets the write direction for ~image array data on the\n~Ramtek display.  This routine is supported in the REF package.\n.lit\n\nCALL RMDIR (ic,is,ie)\n\nic   (I): channel number (from RAMOPEN or IRMCHAN)\nis   (I): scan sequence code\n             code pix-to-pix  line-to-line\n              0      L-R        T-B\n              1      R-L        T-B\n              2      L-R        B-T\n              3      R-L        B-T\n              4      T-B        L-R\n              5      B-T        L-R\n              6      T-B        R-L\n              7      B-T        R-L\nie   (I): (returned) error code\n.end lit\n\n.hl1  SUBROUTINE RMFNTSIZE\n.p\n~RMFNTSIZE changes the size of Ramtek ~text displayed on the ~Ramtek display.\nNot supported in REF package.\n.lit\n\nCALL RMFNTSIZE (ic,ih,iv,ihs,ivs,ie)\n\nic      (I): channel number (from RAMOPEN or IRMCHAN)\nih,iv   (I): horizontal,vertical dimension\nihs,ivs (I): horizontal,vertical spacing\nie      (I): (returned) error code\n.end lit\n\n.hl1  SUBROUTINE RAMOPEN\n.p\n~RAMOPEN (1) translates the local name \"RM\" to determine the ramtek device\nnumber, (2) allocates the ramtek device, (3) assigns a channel to the Ramtek\ndevice, and (4) opens the channel I/O.  Returns the channel number or\n-1 if device is not available.  This is routine is called by RPLOTS which\nis called by FRAME.  RAMOPEN initializes the REF array.\n.lit\n\nCALL RAMOPEN(ic,it,id,ie)\n\nic   (I): returned channel number\nit   (I): Ramtek device code input\n          = 1 1280x1024 Ramtek\n          = 2 512x512 Ramtek\nid   (I): returned Ramtek device number\nie   (I): (returned) error code\n.end lit\n\n.hl1  SUBROUTINE RAMOUT\n.p\n~RAMOUT outputs a command and data array to the ~Ramtek display.\n(see Ramtek manual for command formats).  The REF package uses RAMOUT\nfor a different purpose.\n.lit\n\nCALL RAMOUT (ic,m,n,ie)\n\nic   (I): channel number (from RAMOPEN or IRMCHAN)\nm    (B): array of bytes to output\nn    (I): number of bytes\nie   (I): (returned) error code\n.end lit\n\n.hl1  SUBROUTINE RMPAN\n.p\n~RMPAN pans Ramtek display.  Not supported in REF package.\n.lit\n\nCALL RMPAN (ic,il,ir,ie)\n\nic    (I): channel number (from RAMOPEN or IRMCHAN)\nil    (I): left x pixels\nir    (I): right y pixels\nie    (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE  RMPLOT\n.p\n~RMPLOT plots an array of connected vectors using pixel locations on Ramtek\nor REF package.  This routine is called by PLOTRM which is called by PLOT.\nRMPLOT simulates line widths using the width information stored in an\ninternal common block by RMTEXTURE by replicating the line several times\nwith pixel offsets to produce a \"thick\" line.\nNote: x is in pixels from right to left.  y is in pixels from top of display.\n.x color table\n.x RMTEXTURE\n.lit\n\nCALL RMPLOT (ic,n,ia,k,ie)\n\nic   (I): channel number (from RAMOPEN or IRMCHAN)\nn    (I): number of point pairs (<129)\nia   (I): array of point pairs (in pixels)\n             a(1)=x1,a(2)=y1,a(3)=x2,...\nk    (I): color table index to use\nie   (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE RMREADBYTE\n.x Ramtek image data\n.p\n~RMREADBYTE reads the ~Ramtek ~image array.  Supported by REF.\n.lit\n\nCALL RMREADBYTE (ic,a,n,ie)\n\nic   (I): channel number (from RAMOPEN)\na    (B): (returned) image data\nn    (I): number of words of a to read\nie   (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE  RMREADCOL\n.x color table\n.p\n~RMREADCOL reads the ~Ramtek color table from the Ramtek display.\nThe color table is ~INTEGER*4 words.\nNot supported by REF.\n.lit\n\nCALL RMREADCOL (ic,ia,n,ie)\n\nic   (I): channel number (from RAMOPEN)\nia   (I): (returned) color table array\nn    (I): number of words of a to read\nie   (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE RMREADCURSOR\n.x curmotion\n.x RMSETCURSOR\n.p\n~RMREADCURSOR reads the current ~Ramtek ~cursor device position.\nCalled by CURMOTION, etc.  See RMSETCURSOR.  Not supported on REF package.\n.lit\n\nCALL RMREADCURSOR (ic,id,ix,iy,it,iv,ien,ie)\n\nic        (I): channel number (from RAMOPEN)\nid        (I): cursor device number\nix,iy     (I): (returned) pixel location of cursor (pixels)\nit,iv,ien (I): (returned) codes for track, visible, enter\n               switches, see RMSETCURSOR\nie        (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE RMREADWORD\n.x Ramtek image data\n.p\n~RMREADWORD reads ~INTEGER*2 words from the ~Ramtek ~image array.\nSupported by REF.\n.lit\n\nCALL RMREADWORD (ic,id,n,ie)\n\nic   (I)  : channel number (from RAMOPEN)\nid   (I*2): (returned) image data\nn    (I)  : number of words to read\nie   (I)  : (returned) error code\n.end lit\n\n.hl1  SUBROUTINE RMSETCUR\n.p\n.x CURLOCATE\n~RMSETCUR moves specified ramtek ~cursor device to a specified position and\nsets it as visible and/or blinking.  Called by CURLOCATE.  Not supported\nby REF\n.lit\n\nCALL RMSETCUR (ic,i,ix,iy,ib,iv,ie)\n\nic    (I): channel number (from RAMOPEN)\ni     (I): cursor device number (0-3)\nix,iy (I): pixel position of cursor (see RMPLOT)\nib    (I): blink flag  (1=no blink,2=blink)\niv    (I): visible flag (2=visible, 0=invisible)\nie    (I): returned error code\n.end lit\n\n.hl1  SUBROUTINE RMSTART\n.x Ramtek image data\n.p\n~RMSTART sets the start pixel of ~image mode write on the ~Ramtek display.\nSupported by REF.\n.lit\n\nCALL RMSTART (ic,ix,iy,ie)\n\nic    (I): channel number (from RAMOPEN)\nix,iy (I): pixel position to start next image write\nie    (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE RMTEXT\n.p\n~RMTEXT places text on ~Ramtek display using Ramtek hardware text support.\nNot supported on REF.\n.lit\n\nCALL RMTEXT (ic,icol,ix,iy,is,t,nt,ie)\n\nic   (I): channel number (from RAMOPEN)\nicol (I): color\nix   (I): x pixel location\niy   (I): y pixel location\nis   (I): size in pixels\nt    (B): byte array of text\nnt   (I): number of bytes in the array t\nie   (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE RMTEXTURE\n.p\n~RMTEXTURE changes the bit texturing pattern for vector line drawing\non the Ramtek.  Called by ~RMPEN which is called by ~NEWPEN and\nalso by ~CURMOTION et. al. Supported by REF.\n.LIT\n\nCALL RMTEXTURE (ic,it,iw,is,ie)\n\nic    (I): opened channel number (from RAMOPEN)\nit    (I): line type number (0-15)\niw    (I): line width used in RMPLOT (1-7)\nis    (I): bit width scale factor (0-15)\n             (0= [1 bit=1 pixel], 1=[1 bit=2 pixels], etc.)\nie    (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE RMWIND\n.p\n~RMWIND sets the ~image area of the ~Ramtek display.  Supported by REF.\n.lit\n\nCALL RMWIND (ic,ix,iy,mx,my,ie)\n\nic    (I): channel number (from RAMOPEN)\nix,iy (I): starting corner of image pixels (u-r corner)\nmx,my (I): ending corner of image pixels (l-l corner)\nie    (I): (returned) error code\n.end lit\n.x Ramtek image data\n\n.hl1 SUBROUTINE RMWRITEBYTE\n.x Ramtek image data\n.p\n~RMWRITEBYTE write byte ~image data to the ~Ramtek image array.  Supported\nby REF.\n.lit\n\nCALL RMWRITEBYTE (ic,a,n,ie)\n\nic   (I): channel number (from RAMOPEN)\na    (B): image data\nn    (I): number of words of a to read\nie   (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE RMWRITECOL\n.x color table\n.p\n~RMWRITECOL writes ~Ramtek color display data to the Ramtek display\ncolor table.  The color table is ~INTEGER*4 words.\nNot supported by REF.\n.lit\n\nCALL RMWRITECOL (ic,a,n,ie)\n\nic   (I): channel number (from RAMOPEN)\na    (I): new color table array\nn    (I): number of words of array a\nie   (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE RMWRITEWORD\n.x Ramtek image data\n.p\n~RMWRITEWORD writes ~INTEGER*2 ~image data to the ~Ramtek image display.\nSupported by REF.\n.lit\n\nCALL RMWRITEWORD (ic,id,n,ie)\n\nic   (I)  : channel number (from RAMOPEN)\nid   (I*2): image data\nn    (I)  : number of words to read\nie   (I)  : (returned) error code\n.end lit\n\n.hl1 SUBROUTINE RMZOOM\n.p\n~RMZOOM zooms ~Ramtek display.  Not supported by REF.\n.lit\n\nCALL RMZOOM (ic,iz,ie)\n\nic    (I): channel number (from RAMOPEN)\niz    (I): zoom factor in powers of 2\nie    (I): (returned) error code\n.end lit\n\n.hl1 SUBROUTINE VTPLOT\n.p\n~VTPLOT plots an array of connected vectors to terminal. ~Terminal\nmust be in graphics mode prior to call.  VTPLOT is called by ~PLOTVT\nand by ~CURLOCATE and CURMOTION., et. al.  An erase flag is used\nto indicate whether vector string should be visible, erased, or\nXOR'ed.  Since not all terminal support XOR, two flags for XOR are\nprovided--one which if XOR is not supported writes visible  vectors\nwith the other which erases (if supported).  Line width is simulated\nby replotting adjacent lines.\n.lit\n\nCALL VTPLOT (n,m,ie,iw)\n\nn   (I): number of point pairs in m\nm   (I): array of points to be connected with line\n              m(1)=x1,m(2)=y1,m(3)=x2,...\nie  (I): erase flag (0=normal, 1=XOR (on), 2=erase, 3=XOR (off))\niw  (I): width\n.end lit\n\n\n.hl1 SUBROUTINE TRIANGC\n.p\n~TRIANGC triangulates a set of (x,y) points such that the boundry is a\nconvex polygon.  This routine is an adaption of ~COSMIC routine ARC-11441.\nUsed by some MASTER routines.\n.lit\n\nCALL TRIANGC(x,y,n,nt,nzz,m,i,j,ni,l,nz,ie,ibe,ite)\n\nx,y   (R): arrays of x,y points\nn     (I): number of points\n           < 0 : ie,ibe,ite arrays not used\n           > 0 : ie,ibe,ite arrays used (normal)\nnt    (I): array of indicies of triangulated points t(nzz,3)\n           corner 1 of triangle K = (x,y) = (x(t(K,1),y(t(K,1)))\n           corner 2 of triangle K = (x,y) = (x(t(K,2),y(t(K,2)))\n           corner 3 of triangle K = (x,y) = (x(t(K,3),y(t(K,3)))\nnzz   (I): dimension of t array (>3*n)\nm     (I): number of triangles stored in t\ni,j   (I): working arrays (dimensioned i(ni),j(ni))\nni    (I): dimension of i,j arrays (ni>=n)\nl     (I): number of edges in ie,ibe,ite\nnz    (I): dimension of ie,ibe,ite array (>3*n)\nnote: these arrays only needed if n>0\nie    (I): array of indicies of each triangle edge ie(nz,2)\nibe   (I): edge flag array dimensioned ibe(nz)\n           = 0 for interior edge\n           = 1 if ie is a boundry edge\nite   (I): array of indicies of the neighbor edges of\n           each triangle, dimensioned ite(nz,4)\n.end lit\n\n.hl1 REAL FUNCTION XVMUL3D\n.p\n~XVMUL3D returns one element of an input vector (x,y,z) multiplied by an input\nrotation matrix r(4,4).\n.lit\n\nvalue = XVMUL3D (n,x,y,z,v,r)\n\nn     (I) : which coordinate value to return (1=x,2=y,3=z)\nx,y,z (R) : input x,y,z\nv     (R) : working vector (4 elements)\nr     (R) : rotation matrix (4,4)\nvalue (R) : desired element value (see n)\n.end lit\n\n.chapter LONGLIB Library Names\n.p\nThis chapter lists the LONGLIB graphics library subroutine names as well\nas the subroutines (outside of the standard FORTRAN routines) called by\neach subroutine.  The calling routines (excluding MASTER routines) are\nindicated as well.  An asterick\nindicates that the routine is documented in the documentation and may\ncalled by the user.\n\n.hl 1 Subroutine Calls\n.ls1\n.dle ,,'.'\n.le;~ABSPLT\n.br;Calls:  WHEREVT, FIXVT0, WHEREPR, FIXPR0, WHERERM, FIXRM0\n.br;Called by: *\n.le;~ANXTVU\n.br;Calls:  (none)\n.br;Called by: NXTVU\n.le;~ARCALC\n.br;Calls:  (none)\n.br;Called by: LINSEQ\n.le;~ARCPLT\n.br;Calls:  SPIFUN, PLOT, SPIDER \n.br;Called by: LINSEQ\n.le;~ARCSET (Entry of ARCPLT)\n.br;Calls:  PLOT\n.br;Called by: LINSEQ\n.le;~ARROW\n.br;Calls:  PLOT\n.br;Called by: *\n.le;~ASTEXIT\n.br;Calls:\n.br;Called by: (qio -- system routine)\n.le;~ASTINTER\n.br;Calls: (none)\n.br;Called by: *, PLOT\n.le;~AXIS\n.br;Calls:  PLOT, SYMBOL, NUMBER\n.br;Called by: *\n.le;~AXIS2\n.br;Calls:  PLOT, SYMBOL, NUMBER\n.br;Called by: *\n.le;~AXIS3\n.br;Calls:  PLOT, SYMBOL, NUMBER\n.br;Called by: *\n.le;~AXIS3D\n.br;Calls:  ROTEM, MATMUL4, PLOT3D, NUM3D, SYM3D, XVMUL3D\n.br;Called by: *\n.le;~AXIS3DH\n.br;Calls:  ROTEM, MATMUL4, PLT3D, SKETCH, NUM3DH, SYM3DH, XVMUL3D\n.br;Called by: *\n.le;~BARCHR\n.br;Calls:  FRAME, CTERM, PLOT, SYMBOL, NUMBER, PLOTND, NEWPEN, SHADE\n.br;Called by: *\n.le;~BITCURSOR\n.br;Calls:  (none)\n.br;Called by: *\n.le;~BITMAP\n.br;Calls:  PLOT, LNDSEA\n.br;Called by: *\n.le;~CHECK3D\n.br;Calls:  (none)\n.br;Called by: LINHID\n.le;~CHLSKYS\n.br;Calls:  (none)\n.br;Called by: SMOOTHC\n.le;~CIRCLE\n.br;Calls:  PLOT\n.br;Called by: *, PLRAX\n.le;~CLIP3D\n.br;Calls:  (none)\n.br;Called by: IPCLP3\n.le;~CLPIT\n.br;Calls:  IPCLIP\n.br;Called by: PLOTVT, PLOTRM, PPLOT\n.le;~IPCLIP\n.br;Calls:  (none)\n.br;Called by: CLPIT, PLOTVT, PLOTRM, PPLOT\n.le;~CNCELPLT\n.br;Calls:  SEGCODE, POLY1INT, PLOT\n.br;Called by: CNTRPLT\n.le;~CNCELPLT3D\n.br;Calls:  SEGCODE, RVXPT3D, PLOT, POLY1INT\n.br;Called by: CNT3DX\n.le;~CNDRAW\n.br;Calls:  PLOT, NEWPEN, SYMBOL, NUMBER\n.br;Called by: GCONTR\n.le;~CNT3D\n.br;Calls:  CNT3DX\n.br;Called by: *\n.le;~CNT3DX\n.br;Calls:  SCALE, FRAME, CTERM, AXIS2, AXIS, VXPT3D, CNCELPLT3D, \nTRCELPLT3D, PLOTND, NEWPEN\n.br;Called by: *, CNT3D\n.le;~CNTLN\n.br;Calls:  FRAME, CTERM, SCALE, AXIS3, PLOT, SYMBOL, CNCELPLT,\nTRIANGC, INTERPC, CNTOUR, PLOTND, NEWPEN\n.br;Called by: *\n.le;~CNTOUR\n.br;Calls:  PLOT\n.br;Called by: CNTLN\n.le;~CNTRPLT\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALG, SCALE, LGRID, GRID,\nLGAXS, AXIS, CNCELPLT, PLOTND, NEWPEN\n.br;Called by: *\n.le;~CSHADE\n.br;Calls:  PLOT, NEWPEN, PICHRT\n.br;Called by: *\n.le;~CTERM\n.br;Calls:  (none)\n.br;Called by: *, PLOTVT\n.le;~CUBE\n.br;Calls:  PLT3DH, SKETCH\n.br;Called by: *, HIST3D\n.le;~CURBAND\n.br;Calls:  RMTEXTURE, RMSETCUR, RMPLOT, INXTCHR, VTPLOT\n.br;Called by: *\n.le;~CURLOCATE\n.br;Calls:  RMSETCUR, VTPLOT\n.br;Called by: *\n.le;~CURMOTION\n.br;Calls:  INXTCHR, RMSETCUR, VTPLOT\n.br;Called by: *\n.le;~CURRECT\n.br;Calls:  RMTEXTURE, RMSETCUR, RMPLOT, INXTCHR, VTPLOT\n.br;Called by: *\n.le;~CVAX3D\n.br;Calls:  CVAX3DX\n.br;Called by: *\n.le;~CVAX3DX\n.br;Calls:  NXTVU, PLOT, FRAME, GCONTR, PLT3D, HLT3D, CTERM, AXIS3\n.br;Called by: *, CVAX3D\n.le;~DASHL\n.br;Calls:  PLOT, SYMBOL\n.br;Called by: *\n.le;~DRAW3D\n.br;Calls:  PLOT\n.br;Called by: PLOT3D\n.le;~EARTH3D\n.br;Calls:  SPRECT1, PLOT3D\n.br;Called by: *\n.le;~ELLIPSE\n.br;Calls:  PLOT\n.br;Called by: *\n.le;~ENABLEAST\n.br;Calls: ENAST\n.br;Called by: *, FRAME\n.le;~ENAST\n.br;Calls: (qio system routine if control-c interrupt code is used in package)\n.br;Called by: ENABLEAST\n.le;~FACTOR\n.br;Calls:  VFACTOR, RFACTOR, PFACTOR\n.br;Called by: *\n.le;~FIXPR0\n.br;Calls:  PPLOTP\n.br;Called by: *, ABSPLT\n.le;~FIXRM0\n.br;Calls:  RMTEXTURE\n.br;Called by: *, ABSPLT\n.le;~FIXVT0\n.br;Calls:  NEWVPEN\n.br;Called by: *, ABSPLT\n.le;~FRAME\n.br;Calls:  VPLOTS, RPLOTS, PPLOTS, ENABLEAST, EXIT (system routine)\n.br;Called by: *, PLOTS\n.le;~GCONTR\n.br;Calls:  CNDRAW\n.br;Called by: *, LCNTR\n.le;~GETCURSOR\n.br;Calls:  (none)\n.br;Called by: *\n.le;~GLPLOT\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALG, SCALE, LGRID, GRID,\nLGAXS, AXIS3, LINE, LGLIN, PLOTND\n.br;Called by: *\n.le;~GRID\n.br;Calls:  PLOT\n.br;Called by: *\n.le;~HELPME\n.br;Calls: LIB$DISPLAY_OUTPUT, LIB$STATUS\n.br;Called by: *\n.le;~HIST3D\n.br;Calls:  SCALE, FRAME, CTERM, AXIS3DH, PLT3DH, SKETCH, PLOT,\nPLOTND, INIT3DH\n.br;Called by: *\n.le;~HLT3D\n.br;Calls:  NXTVU, PLOT\n.br;Called by: *, CVAX3DX, MVAX3DX\n.le;~HPLT\n.br;Calls:  PLOT\n.br;Called by: LINHID\n.le;~INIT3D\n.br;Calls:  MATMUL4, ROTEM\n.br;Called by: *\n.le;~INIT3DH\n.br;Calls:  (none)\n.br;Called by: *\n.le;~INTERPC\n.br;Calls:  (none)\n.br;Called by: CNTLN\n.le;~INTERSECT\n.br;Calls:  (none)\n.br;Called by: VAX3DX\n.le;~INXTCHR\n.br;Calls:  SYS$QIO\n.br;Called by: *, PAUSE, PAUSEP, CURMOTION, CURRECT, CURBAND\n.le;~IPCLP3\n.br;Calls:  CLIP3D\n.br;Called by: PLOT3D\n.le;~IRMCHAN\n.br;Calls:  (none)\n.br;Called by: *\n.le;~ISEGCODE\n.br;Calls:  (none)\n.br;Called by: TRCELPLT3D\n.le;~ISOL3D\n.br;Calls:  (none)\n.br;Called by: LINHID\n.le;~JPLTAG\n.br;Calls:  SHADE, PLOT\n.br;Called by: *\n.le;~LANDMAP\n.br;Calls:  PLOT\n.br;Called by: *\n.le;~LCNTR\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALG, SCALE, LGRID, GRID,\nLGAXS, AXIS, GCONTR, PLOTND, NEWPEN\n.br;Called by: *\n.le;~LCOEF\n.br;Calls:  (none)\n.br;Called by: LINHID\n.le;~LGAXS\n.br;Calls:  PLOT, SYMBOL, NUMBER\n.br;Called by: *\n.le;~LGLIN\n.br;Calls:  PLOT, SYMBOL\n.br;Called by: *\n.le;~LGRID\n.br;Calls:  PLOT\n.br;Called by: *\n.le;~LINE\n.br;Calls:  PLOT, SYMBOL\n.br;Called by: *\n.le;~LINHID\n.br;Calls:  LCOEF, VSRT1, VSRTR, HPLT, CHECK3D, ISOL3D, STAT3D\n.br;Called by: LINHID\n.le;~LINSEQ\n.br;Calls:  PRETRP, ARCALC, SMOOTHC, SPISET, ARCSET, ARCPLT\n.br;Called by: *, SYMSS\n.le;~LNDSEA\n.br;Calls:  (none)\n.br;Called by: BITMAP\n.le;~LSPLOT\n.br;Calls:  FRAME, CTERM, PLOTND, SYMBOL, SCALE, NEWPEN, PLOT\n.br;Called by: *\n.le;~MATMUL4\n.br;Calls:  (none)\n.br;Called by: PLOT3D, SYM3D, SYM3DH\n.le;~MESH3D\n.br;Calls:  MESH3DX\n.br;Called by: *\n.le;~MESH3DX\n.br;Calls:  SCALE, FRAME, CTERM, VXPT3D, AXIS2, AXIS, PLOT, PLOTND\n.br;Called by: *, MESH3D\n.le;~MIDC\n.br;Calls:  (none)\n.br;Called by: TRIANGC\n.le;~MTV4\n.br;Calls:  (none)\n.br;Called by: PLOT3D, SYM3D, SYM3DH, XVMUL3D\n.le;~MVAX3D\n.br;Calls:  MVAX3DX\n.br;Called by: *, MVAX5D\n.le;~MVAX3DX\n.br;Calls:  SCALE, FRAME, CTERM, PLT3D, HLT3D, AXIS3, PLOT, PLOTND\n.br;Called by: *, MVAX3D\n.le;~MVAX5D\n.br;Calls:  SCALE, FRAME, CTERM, RTERM, SYMBOL, NUMBER, MVAX3D, PLOT,\nFACTOR, PLOTND\n.br;Called by: *\n.le;~NEWPAGE\n.br;Calls:  PPLOT\n.br;Called by: *\n.le;~NEWPEN\n.br;Calls:  RMPEN, PPEN\n.br;Called by: *, CNDRAW, SHADE, CSHADE, GCONTR\n.le;~NEWVCOL\n.br;Calls:  (none)\n.br;Called by: VPLOTS, PLOTVT\n.le;~NEWVPEN\n.br;Calls:  (none)\n.br;Called by: VPEN\n.le;~NUM3D\n.br;Calls:  SYM3D\n.br;Called by: *, AXIS3D\n.le;~NUM3DH\n.br;Calls:  SYM3DH\n.br;Called by: *, AXIS3DH\n.le;~NUMBER\n.br;Calls:  SYMBOL\n.br;Called by: *, AXIS, AXIS2, AXIS3, CNDRAW\n.le;~NXTVU\n.br;Calls:  PLOT, NXT0VU, ANXTVU\n.br;Called by: *, PLT3D, HLT3D, MVAX3DX, CVAX3DX\n.le;~OLDNUMB\n.br;Calls:  SYMBOL\n.br;Called by: *\n.le;~NXT0VU\n.br;Calls:  (none)\n.br;Called by: NXTVU\n.le;~PAUSE\n.br;Calls:  INXTCHR\n.br;Called by: *\n.le;~PAUSEP\n.br;Calls:  INXTCHR, CTERM\n.br;Called by: *\n.le;~PFACTOR\n.br;Calls:  (none)\n.br;Called by: *, FACTOR\n.le;~PHIST\n.br;Calls:  FRAME, AXIS, PLOT, SYMBOL, SHADE, RECT, PLOTND, \nCTERM\n.br;Called by: *\n.le;~PICHRT\n.br;Calls:  FRAME, SYMBOL, PLOT, NEWPEN, CSHADE, SHADE, PLOTND, CTERM\n.br;Called by: *\n.le;~PLOT\n.br;Calls:  PLOTVT, PLOTRM, PPLOT, ASTINTER\n.br;Called by: *, AXIS, AXIS2, AXIS3, ARROW, BITMAP, CIRCLE, CNDRAW, DASHL,\nDARW3D, ELLIPSE,  FRACT, GRID, HPLT, JPLTAG, LANDMAP, LGAXS, LGLIN, LGRID,\nLINE, NXTVU, PLOTND, PLRAX, PLRLN, PLT3DH, POLARMAP, RECT, SHADE, SYMBOL,\nSYMS, SYMSS, TRCELPLT3D, CSHADE\n.le;~PLOT3D\n.br;Calls:  MTV4, ROTEM, MATMUL4, VCPY, DRAW3D, IPCLP3\n.br;Called by: *, AXIS3D, EARTH3D, SYM3D\n.le;~PLOTLG\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALE, SCALG, LGRID, GRID, PLOT, \nLGAXS, AXIS, LINE, LGLIN, PLOTND, SYMBOL, NEWPEN\n.br;Called by: *\n.le;~PLOTLG2\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALE, SCALG, LGRID, GRID, PLOT, \nLGAXS, AXIS, LINE, LGLIN, PLOTND, SYMBOL, NEWPEN\n.br;Called by: *\n.le;~PLOTLGL\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALG, SCALE, LGRID, GRID, \nLGAXS, AXIS2, LINSEQ, PLOTND, SYMBOL, NEWPEN\n.br;Called by: *\n.le;~PLOTLGX\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALG, SCALE, LGRID, GRID, \nLGAXS, AXIS2, LGLIN, LINE, PLOTND, SYMBOL, NEWPEN\n.br;Called by: *\n.le;~PLOTND\n.br;Calls:  PLOT\n.br;Called by: *\n.le;~PLOTRM\n.br;Calls:  RMCLEAR, RMPLOT, IPCLIP, RAMCLOSE, CLPIT\n.br;Called by: *, PLOT\n.le;~PLOTS\n.br;Calls:  FRAME\n.br;Called by: *\n.le;~PLOTSC\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALE, GRID, LINE, AXIS, PLOT, \nLINE, SYMBOL, PLOTND, NEWPEN\n.br;Called by: *\n.le;~PLOTSC2\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALE, GRID, LINE, AXIS, PLOT, \nLINE, SYMBOL, PLOTND, NEWPEN\n.br;Called by: *\n.le;~PLOTVT\n.br;Calls:  CTERM, VTPLOT, IPCLIP, NEWVCOL, CLPIT\n.br;Called by: *, PLOT\n.le;~PLRAX\n.br;Calls:  PLOT, SYMBOL, CIRCLE\n.br;Called by: *\n.le;~PLRLN\n.br;Calls:  PLOT, SYMBOL\n.br;Called by: *\n.le;~PLT3D\n.br;Calls:  NXTVU\n.br;Called by: *, MVAX3DX, CVAX3DX\n.le;~PLT3DH\n.br;Calls:  PLOT\n.br;Called by: *, SYM3DH, AXIS3DH, CUBE, T3DH, TRIG3DH, CNTOUR, HIST3D\n.le;~POLARMAP\n.br;Calls:  PLOT\n.br;Called by: *\n.le;~POLY1INT\n.br;Calls:  (none)\n.br;Called by: CENCELPLT, CNCELPLT3D\n.le;~PPEN\n.br;Calls:  PPLOTP\n.br;Called by: *, NEWPEN\n.le;~PPLOT\n.br;Calls:  PPLOTP, IPCLIP, CLPIT\n.br;Called by: *, PLOT\n.le;~PPLOTP\n.br;Calls:  (none)\n.br;Called by: NEWMSK, PPEN, PPLOT, PPLOTS\n.le;~PPLOTS\n.br;Calls:  PPLOTP\n.br;Called by: FRAME\n.le;~PRESPL\n.br;Calls:  PPLOTP\n.br;Called by: *, RESPL\n.le;~PRETRP\n.br;Calls:  SPISET, SPIFUN\n.br;Called by: LINSEQ\n.le;~PSAVPL\n.br;Calls:  (none)\n.br;Called by: *, SAVPL\n.le;~PSUBPRO\n.br;Calls: SUBPROC\n.br;Called by: *\n.le;~PXPCGT\n.br;Calls:  (none)\n.br;Called by: SYMBOL, SYM3D, SYM3DH\n.le;~RECT\n.br;Calls:  PLOT\n.br;Called by: *\n.le;~RESPL\n.br;Calls:  PRESPL, RRESPL, VRESPL, WHERE, PLOT\n.br;Called by: *\n.le;~RFACTOR\n.br;Calls:  (none)\n.br;Called by: *, FACTOR\n.le;~RAMOPEN \n.br;Calls: SYS$TRANSLOG, SYS$ALLOC, SYS$DALLOC, SYS$DASSGN, SYS$ASSIGN, SYS$QIOW\n.br;Called by: RPLOTS\n.le;~RAMCLOSE \n.br;Calls: SYS$DALLOC, SYS$DASSGN\n.br;Called by: PLOTRM\n.le;~RAMOUT \n.br;Calls: SYS$QIOW\n.br;Called by: RMSTART, RMWIND, RMPLOT, RMCLEAR, RMTEXTURE, RMZOOM,\nRMPAN, RMSETCUR, RMTEXT, RMFNTSIZE\n.le;~RAMOUTIN\n.br;Calls: SYS$QIOW\n.br;Called by: RMREADCURSOR, RMREADCOL, RMREADBYTE, RMREADWORD\n.le;~REFDIS (entry of RAMCLOSE)\n.br;Calls: (none)\n.br;Called by: *\n.le;~RMCLEAR \n.br;Calls:  RAMOUT\n.br;Called by: PLOTRM\n.le;~RMDIR\n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMFNTSIZE\n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMPAN\n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMPLOT \n.br;Calls:  RAMOUT\n.br;Called by: PLOTRM\n.le;~RAMOUTIN \n.br;Calls: SYS$QIOW\n.br;Called by: RMREADBYTE, RMREADCOL, RMREADWORD\n.le;~RMREADBYTE \n.br;Calls: RAMOUTIN\n.br;Called by: *\n.le;~RMREADCOL \n.br;Calls: RAMOUTIN\n.br;Called by: *\n.le;~RMREADCURSOR\n.br;Calls:  RAMOUTIN\n.br;Called by: *\n.le;~RMREADWORD \n.br;Calls: RAMOUTIN\n.br;Called by: *\n.le;~RMSETCUR \n.br;Calls: RAMOUT\n.br;Called by: CURBAND, CURRECT, CURMOTION, CURLOCATE\n.le;~RMRESET\n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMSTART \n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMTEXT \n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMTEXTURE \n.br;Calls:  RAMOUT\n.br;Called by: RMPEN, RPLOTS, FIXRM0, RRESPL\n.le;~RMWIND \n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMWRITEBYTE \n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMWRITECOL \n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMWRITEWORD \n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMZOOM \n.br;Calls:  RAMOUT\n.br;Called by: *\n.le;~RMPEN\n.br;Calls:  RMTEXTURE\n.br;Called by: NEWPEN\n.le;~ROTEM\n.br;Calls:  (none)\n.br;Called by: AXIS3D, INIT3D, PLOT3D, SYM3D, SYM3DH\n.le;~RPLOTS\n.br;Calls:  PLOTRM, RMTEXTURE\n.br;Called by: FRAME\n.le;~RRESPL\n.br;Calls:  RMTEXTURE\n.br;Called by: *, RESPL\n.le;~RSAVPL\n.br;Calls:  (none)\n.br;Called by: *, SAVPL\n.le;~RTERM\n.br;Calls:  RMCLEAR, RAMCLOSE, RAMOPEN\n.br;Called by: *\n.le;~RVXPT3D\n.br;Calls:  (none)\n.br;Called by: CNCELPLT3D\n.le;~SAVPL\n.br;Calls:  PSAVPL, RSAVPL, VSAVPL, WHERE, PLOT\n.br;Called by: *\n.le;~SCALE\n.br;Calls:  (none)\n.br;Called by: *\n.le;~SCALG\n.br;Calls:  (none)\n.br;Called by: *\n.le;~SCATPL\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALG, SCALE, LGRID, GRID, LGAXS,\nAXIS, PLOT, SYMBOL, PLOTND\n.br;Called by: *\n.le;~SEGCODE\n.br;Calls:  (none)\n.br;Called by: CNCELPLT, CNCELPLT3D\n.le;~SEISPL\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALG, SCALE, LGRID, GRID, LGAXS,\nAXIS, PLOT, NEWPEN, SYMBOL, PLOTND\n.br;Called by: *\n.le;~SFPLOT\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALG, SCALE, LGRID, GRID, LGAXS,\nAXIS, PLOT, NEWPEN, SYMBOL, PLOTND\n.br;Called by: *\n.le;~SHADE\n.br;Calls:  PLOT, NEWPEN\n.br;Called by: *, JPLTAG\n.le;~SKETCH\n.br;Calls:  LINHID\n.br;Called by: *\n.le;~SMOOTHC\n.br;Calls:  CHLSKYS\n.br;Called by: LINSEQ\n.le;~SPIDER\n.br;Calls:  (none)\n.br;Called by: ARCPLT\n.le;~SPIFUN\n.br;Calls:  (none)\n.br;Called by: ARCPLT, PRETRP\n.le;~SPISET\n.br;Calls:  (none)\n.br;Called by: LINSEQ, PRETRP\n.le;~SPLOTS\n.br;Calls:  SPLOTSX\n.br;Called by: *\n.le;~SPLOTSX\n.br;Calls:  FRAME, CTERM, NEWPAGE, SCALG, SCALE, LGRID, GRID,\nLGAXS, AXIS2, PLOT, SYMBOL, PLOTND\n.br;Called by: *, SPLOTS\n.le;~SPRECT1\n.br;Calls:  (none)\n.br;Called by: EARTH3D\n.le;~STAT3D\n.br;Calls:  (none)\n.br;Called by: LINHID\n.le;~STAT3D2\n.br;Calls:  (none)\n.br;Called by: LINHID\n.le;~SUBPROC\n.br;Calls:  LIB$SPAWN, LIB$SIGNAL\n.br;Called by: PSUBPRO\n.le;~SYM3D\n.br;Calls:  PLOT3D, ROTEM, MATMUL4, MTV4, PXPCGT\n.br;Called by: *, AXIS3D, NUM3D\n.le;~SYM3DH\n.br;Calls:  MTV4, PLT3DH, PXPCGT, ROTEM, MATMUL4\n.br;Called by: *, NUM3DH, AXIS3DH\n.le;~SYMBOL\n.br;Calls:  PLOT, PXPCGT\n.br;Called by: *, AXIS, AXIS2, AXIS3, CNDRAW, DASHL, LGAXS, LGLIN, LINE,\nNUMBER, OLDNUM, PLRAX\n.le;~SYMS\n.br;Calls:  PLOT\n.br;Called by: *\n.le;~SYMSS\n.br;Calls:  PLOT, LINSEQ\n.br;Called by: *\n.le;~TR3DH\n.br;Calls:  SCALE, FRAME, CTERM, AXIS3DH, PLT3DH, SKETCH, PLOT,\nPLOTND, INIT3DH\n.br;Called by: *\n.le;~TRCELPLT3D\n.br;Calls:  RVXPT3D, PLOT, ISEGCODE\n.br;Called by: CNT3DX\n.le;~TRIANGC\n.br;Calls:  MIDC\n.br;Called by: *, CNTLN, TRIG3DH\n.le;~TRIG3DH\n.br;Calls:  SCALE, FRAME, CTERM, AXIS3DH, PLT3DH, SKETCH, PLOT,\nPLOTND, INIT3DH\n.br;Called by: *\n.le;~VAX3D\n.br;Calls:  VAX3DX\n.br;Called by: *, VAX5D\n.le;~VAX3DX\n.br;Calls:  SCALE, FRAME, CTERM, VXPT3D, AXIS2, AXIS, PLOT, INTERSECT,\nPLOTND\n.br;Called by: *, VAX3D\n.le;~VAX5D\n.br;Calls:  SCALE, FRAME, CTERM, RTERM, SYMBOL, NUMBER, VAX3D, PLOT,\nFACTOR, PLOTND\n.br;Called by: *\n.le;~VCPY\n.br;Calls:  (none)\n.br;Called by: PLOT3D\n.le;~VFACTOR\n.br;Calls:  (none)\n.br;Called by: *, FACTOR\n.le;~VPEN\n.br;Calls:  NEWVPEM\n.br;Called by: NEWPEN\n.le;~VPLOTS\n.br;Calls:  PLOTVT, NEWVPEN, NEWVCOL\n.br;Called by: FRAME\n.le;~VRESPL (entry of VSAVPL)\n.br;Calls:  NEWVPEN, PLOTVT\n.br;Called by: *, SAVPL\n.le;~VSAVPL\n.br;Calls:  (none)\n.br;Called by: *, SAVPL\n.le;~VSRT1\n.br;Calls:  (none)\n.br;Called by: LINHID\n.le;~VSRTR\n.br;Calls:  (none)\n.br;Called by: LINHID\n.le;~VTPLOT\n.br;Calls:  (none)\n.br;Called by: CURRECT, PLOTVT\n.le;~VXPT3D\n.br;Calls:  (none)\n.br;Called by: CNT3DX, VAX3DX, MESH3DX\n.le;~WHERE\n.br;Calls:  WHEREVT, WHERERM, WHEREPR\n.br;Called by: *, SAVEPL, RESPL\n.le;~WHERE3D\n.br;Calls:  (none)\n.br;Called by: *\n.le;~WHERE3H\n.br;Calls:  (none)\n.br;Called by: *\n.le;~WHEREPR\n.br;Calls:  (none)\n.br;Called by: *, WHERE\n.le;~WHERERM\n.br;Calls:  (none)\n.br;Called by: *, WHERE\n.le;~WHEREVT\n.br;Calls:  (none)\n.br;Called by: *, WHERE\n.le;~XFRM3D\n.br;Calls:  (none)\n.br;Called by: *\n.le;~XVMUL3D\n.br;Calls:   MTV4\n.br;Called by: AXIS3D\n.els\n\n.pg\n.hl 1 Common Block Names\n.p\nThe following is a list of all the named common block used internally\nby the LONGLIB graphics library.  Those marked with an asterick are documented\nunder the first listed routine.\nand are designed to be accessable to the user.  Those\nunmarked are for internal use only and may change at later revisions.\n\n.ls1\n.dle,,'.'\n.le;~VT100 -- Accessed by: BITCURSOR, CURMOTION, CURLOCATE, CURBAND, CURRECT,\nGETCURSOR, FRAME, VTPLOTS, VTPLOT, CTERM, PLOTVT, WHEREVT,\nVFACTOR, FACTOR, FIXVT0, WHERE, VSAVPL, VRESPL, NEWVPEN, NEWVCOL\n.le;~RMTEK -- Accessed by: CURMOTION, CURLOCATE, CURBAND, CURRECT, FRAME, \nPLOTRM, RPLOTS, IRMCHAN, WHERERM, RFACTOR, RMPEN, FACTOR,\nFIXRM0, WHERE, RSAVPL, RRESPL\n.le;~PXPCOM -- Accessed by: FRAME, PPLOT, WHEREPR, PFACTOR,\nPPLOTS, PPEN, FACTOR, FIXPR0, WHERE, PSAVPL, PRESPL\n.le;~RAMTEKIO -- Accessed by: RAMOPEN, RAMOUT, RAMOUTIN, RMCLEAR\n.le;~CHIDE -- Accessed by: INIT3DH, PLT3DH, WHERE3H, SKETCH, LINHID\n.le;~HEDG -- Accessed by: LINHID, CHECK3D\n.le;~GO3 -- Accessed by: LCOEF, LINHID, STAT3D, STAT3D2, CHECK3D, ISOL3D\n.le;~GO * -- Accessed by: LINHID\n.le;~DAVE -- Accessed by: CHECK3D, ISOL3D, STAT3D2\n.le;~LSTPLT -- Accessed by: PLOT, WHERE\n.le;~PLT3B * -- Accessed by: PLT3D, HLT3D, CNDRAW, MVAX3DX, CVAX3DX\n.le;~LAST3D -- Accessed by: DRAW3D, WHERE3D\n.le;~CPLOT3D -- Accessed by: INIT3D, PLOT3D\n.le;~CGLPLOT * -- Accessed by: GLPLOT\n.le;~CPLOTLG * -- Accessed by: PLOTLG\n.le;~CPHIST * -- Accessed by: PHIST\n.le;~CPLOTSC * -- Accessed by: PLOTSC\n.le;~CPLOTSC2 * -- Accessed by: PLOTSC2\n.le;~LOCATE -- Accessed by: VXPT3D, VAX3DX, CNT3DX, RVXPT3D, MESH3DX\n.le;~CPLOTLG * -- Accessed by: PLOTLG\n.le;~CPLOTLG2 * -- Accessed by: PLOTLG2\n.le;~CPLOTLGL * -- Accessed by: PLOTLGL\n.le;~CPLOTLGX * -- Accessed by: PLOTLGX\n.le;~CCNTRPLT * -- Accessed by: CNTRPLT, CNTLN, LCNTR\n.le;~CSPLOTS * -- Accessed by: SPLOTS\n.le;~CSPLOTSX * -- Accessed by: SPLOTSX, SPLOTS\n.le;~CSEISPL * -- Accessed by: SEISPL\n.le;~CSCATPL * -- Accessed by: SCATPL\n.le;~TT_IO -- Accessed by: INXTCHR, ICHRCHK\n.le;~ASTC -- Accessed by: ASTINTER, ENAST, ASTEXIT, ENABLEAST, PLOT\n.els\n\n\n\n.chapter Plot Examples and Plotting Symbols\n.p\nShown in the sections that follow are outputs (and listings) of various\nprograms included with LONGLIB.  This include programs which produce\nplotting symbols and line types/widths.\n\n.hl1 Plotting Symbols and Character Fonts Examples\n.x SYMBOLS\n.x SYMS\n.x SYMSS\n.p\nThe program ~SYMBOLS was used to create a table of the \navailable plotting symbols and character fonts available using the\nsubroutines SYMBOLS, SYMS and SYMSS.  These tables are shown on the\nsucceeding pages.  A listing of SYMBOLS follows the tables.\n\n.pg\n.hl1 Line Type/Width Examples\n.x line type\n.x line width\n.x color\n.p\nThe program ~LINETYPE was to create a table of the available line types,\nwidths, and colors for each plotting device. These are shown on the\nsucceding pages.  A listing of LINETYPE follows the tables.\n\n.pg\n.hl1 MASTER Routine Output Examples\n.p\nThe program ~PLOTTESTS was used to obtain examples of some of the MASTER\nroutine outputs.  A listing follows the output pages.\n\n.pg\n.hl1 3-d Routine Output Examples\n.p\nEXAMP3D and EXAMP3DH demonstrate the 3d routines while WORLD demonstrates\nthe some of the 3d map capabilities.  Output and listings follow.\n\n.pg\n.hl1 Cursor Routine Test Program\n.p\nA listing of the program ~CURTEST follows.  The program can be used\nto test the operation of the graphics input cursor routines.  Only a listing\nis given.\n\n.pg\n.hl1 REF Output Example\n.p\nThis section describes an example of how the Ramtek REF subpackage can\nbe used to produce a grey scale \"image\".  An example of the output image\nproduced by first running the example program REFTEST, outputing the result to\na REF file, then using the program ~REFLAS to produce a grey scale\nimage on the ~QMS laser printer.  A listing of the ~REFTEST program\nis also provided.  Note that REFTEST must be linked to the REF version\nof the library (LONGLIBR) rather than the \"normal\" version.  Also\nnote that REFTEST, when linked to the \"normal\" LONGLIB, will produce\na color image on the Ramtek display.\n\n.! FOR VAX VMS 3.x REMOVE THE \"!\" FROM THE NEXT LINE\n.!do index\n.chapter INDEX\n.pg\n"
  },
  {
    "path": "src/test/resources/samples/langs/RUNOFF/mcp_help.rnh",
    "content": ".!++\n.!\n.! Copyright (c) 2008, Matthew Madison.\n.! Copyright (c) 2012, Endless Software Solutions.\n.! \n.! All rights reserved.\n.! \n.! Redistribution and use in source and binary forms, with or without\n.! modification, are permitted provided that the following conditions\n.! are met:\n.! \n.!     * Redistributions of source code must retain the above\n.!       copyright notice, this list of conditions and the following\n.!       disclaimer.\n.!     * Redistributions in binary form must reproduce the above\n.!       copyright notice, this list of conditions and the following\n.!       disclaimer in the documentation and/or other materials provided\n.!       with the distribution.\n.!     * Neither the name of the copyright owner nor the names of any\n.!       other contributors may be used to endorse or promote products\n.!       derived from this software without specific prior written\n.!       permission.\n.! \n.! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n.! \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n.! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n.! A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n.! OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n.! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n.! LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n.! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n.! THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n.! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n.! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n.!\n.! NAME:\t    MCP_HELP.RNH\n.!\n.! ABSTRACT: MCP help file.\n.!\n.! FACILITY: MX Control Program\n.!\n.! DESCRIPTION:\n.!\n.!   This is the RUNOFF source for the help library for MCP.\n.!   To create the help library, use the following commands:\n.!\n.!   \t$ RUNOFF MCP_HELP.RNH\n.!   \t$ LIB/CREATE/HELP MCP_HELPLIB MCP_HELP\n.!\n.! MODIFICATION HISTORY:\n.!\n.!   30-SEP-1990    V1.3    Madison \tUpdate for MX V1.3.\n.!   04-OCT-1990    V1.3-1  Madison\tFurther file server-related changes.\n.!   05-DEC-1990    V2.1    Madison\tAdd SET JNET.\n.!   10-DEC-1990    V2.1-1  Madison\tNew qualifiers for DEFINE LIST.\n.!   12-DEC-1990    V2.1-2  Madison\tOne more DEFINE LIST qualifier.\n.!   11-FEB-1991    V2.2    Madison\tVarious new command options.\n.!   27-MAR-1991    V2.2-1  Madison\tMention SHUT SMTP.\n.!   07-NOV-1991    T2.4    Madison\tNew commands.\n.!   11-NOV-1991    T2.4-1  Madison\tForgot QUEUE SHOW. SET JNET/LENIENT. REVIEW.\n.!   05-DEC-1991    V3.0    Madison\tSHOW VERSION.\n.!   03-JAN-1992    V3.0-1  Madison\tDEFINE LIST/REPLY_TO wasn't correct.\n.!   14-FEB-1992    V3.1    Madison \tSET JNET/USERNAME.\n.!   05-MAR-1992    V3.1-1  Madison \tSHUTDOWN, RESET changes.  STATUS.\n.!   13-MAR-1992    V3.1-2  Madison \tForgot SET X25_SMTP.\n.!   15-FEB-1993    V3.2    Goatley     DEFINE LIST/FILE changes, fix typos.\n.!   19-MAR-1993    V3.3    Goatley\tDEFINE LIST/PRIVATE, QUEUE SHOW/BRIEF.\n.!   16-APR-1993    V3.3-1  Goatley\tSET LOCAL/MULTIPLE_FROM.\n.!    7-AUG-1993    V3.4    Goatley     Fix missing double \"_\" in qualifiers.\n.!   29-AUG-1993    V3.4-1  Goatley\tSET LOCAL/MM_DELIVER.\n.!   17-DEC-1993    V3.4-2  Goatley\tDEFINE LIST/STRIP=OTHER, SET LOCAL/CC.\n.!   10-JAN-1994    V3.4-3  Goatley     DEF LIST/CASE, - Q RECLAIM, + Q SYNCH.\n.!   16-FEB-1994    V4.0    Goatley     QUEUE CREATE, QUEUE EXTEND.\n.!   10-DEC-1995    V4.2    Goatley\t/NODE, /DIGEST.\n.!    7-OCT-1996    V4.3    Goatley\tSPAWN.\n.!  14-JAN-1997\t    V4.4    Madison \tSET MLF.\n.!  17-FEB-1997\t    V4.5    Madison \tDEFINE/MODIFY/REMOVE/SHOW REJECTION.\n.!  02-APR-1997\t    V4.6    Madison \tLOCAL_DOMAIN, SMTP/RELAY, LIST/RECIP/HIDE.\n.!  13-APR-1997\t    V4.6-1  Madison \tSET MLF/DELAY_DAYS.\n.!   2-MAY-1997\t    V4.7    Goatley     Added DEF LIST/XHEADERS, /LIST_HEADERS, /HOSTNAME\n.!   5-MAY-1997\t    V4.7-1  Goatley\tAdded DEF LIST/SETTINGS.\n.!   4-AUG-1997\t    V4.7-2  Goatley     Add REJECTION to SHOW.\n.!   8-SEP-1997\t    V4.7-2  Goatley     Add multiple addrs to DEFINE ALIAS.\n.!   3-OCT-1997\t    V4.7-3  Goatley     Add /CC_POST_ERRORS, /SUBJECT_PREFIX.\n.!  05-OCT-1997\t    V4.7-4  Madison \tRemoved REJECTION due to inclusion of REJMAN utility;\n.!  \t    \t    \t    \t    \tadded SET SMTP/VALIDATE_SENDER_DOMAIN.\n.!  29-OCT-1997\t    V4.7-5  Goatley     Fix /LIST_HEADERS description.\n.!  21-NOV-1997\t    V4.7-6  Goatley\tAdd /QP_DECODE to SET LOCAL.\n.!  19-APR-1998\t    V4.7-7  Madison \tAdd SET LOCAL/DISABLE_EXQUOTA; remove /MM_DELIVER.\n.!  24-APR-1998\t    V4.8    Madison \tAdd SET SMTP/RBL, SET ROUTER/ACC.\n.!  15-JUN-1998\t    V4.9    Madison \tAdd INSIDE_NETWORK_ADDRESS settings.\n.!  26-JUN-1998\t    V4.9-1  Madison \tAdd /RELAY_ALLOWED to DEFINE INSIDE.\n.!  03-AUG-1998\t    V4.9-2  Madison \tREMOVE INSIDE_NETWORK_ADDRESS was missing.\n.!  15-AUG-1998\t    V4.9-3  Madison \tDocument /RBL_CHECK=domain-name; add MODIFY INSIDE.\n.!  27-AUG-1998\t    V4.9-4  Madison \tNew HOLDING_QUEUE paths.\n.!  30-JAN-2000\t    V4.9-5  Madison \tMore holding queues.\n.!  25-NOV-2000\t    V4.9-6  Madison \tlist ignore flags; remove Jnet support; set local/long.\n.!  22-DEC-2000\t    V4.10   Madison \tSHOW LIST/BRIEF.\n.!  13-JAN-2001\t    V4.11   Madison \tQUEUE SELECT.\n.!  14-FEB-2002     V4.12   Madison     SET SMTP/[NO]PERCENT, regex, QUEUE DUMP.\n.!  03-Feb-2008     V5.0    Madison     Cleanup of obsolete keywords.\n.!  12-Mar-2012     V5.1    Sneddon\tSET SMTP/[NO]TLS.\n.!--\n.P0\n.AP\n.LM1\n.RM70\n.I-1\n1 @\n @\n You can create MCP command files and execute them with the \"@\"\n(input-indirection) function.\n.NJ\n Format:\n @ file-spec\n.J\n You can use the command SHOW/OUTPUT=file/COMMAND ALL to create a command\nfile out of the current MX configuration, edit it outside of MCP, and then\nload in the commands with @file to create a new MX configuration.\n.I-1\n1 ADD\n See the help text for ADD USER.\n.I-1\n2 USER\n ADD USER adds a username and password to the authentication database\nused by the SMTP server.\n.NJ\n Format:\n ADD USER username\n.J\n A username may be up to 16 characters in length, and are case-sensitive.\nUse quotation marks to specify a username that contains lower-case letters.\n.I-1\n3 Qualifiers\n.I-1\n/PASSWORD\n /PASSWORD=password-text\n Specifies a password for this username.  The password may be up to 64\ncharacters in length, and may contain any characters.  To specify lower case\nletters or blanks in the password, surround it with quotation marks.\n If this qualifier is omitted, a default password, \"PASSWORD\", is assigned\nto the username.\n.I-1\n1 CREATE\n See the help text for CREATE USER__DATABASE__FILE.\n.I-1\n2 USER__DATABASE__FILE\n The CREATE USER__DATABASE_FILE command creates an empty file for the SMTP\nauthentication database.  This database is used in conjunction with the\nCRAM-MD5 authentication extension (see SET SMTP/AUTHENTICATION).\n.NJ\n Format:\n CREATE USER__DATABASE__FILE [file-spec]\n.J\n If a file-spec is omitted, a new (empty) version of MX__DIR:MX__USERAUTH__DB.DAT, the\nstandard location for the SMTP authentication database, is created.  In general,\nthis command is used only once, to create the initial database for population using\nthe ADD USER command.\n.I-1\n1 DEFINE\n The DEFINE command is used to add new alias and path entries,\nnew rewrite-rules, mailing lists, and file servers, as well as identify\nprivileged users.\n.I-1\n2 ALIAS\n DEFINE ALIAS adds a new alias definition to the alias list.  The\nnew alias always goes at the end of the list.\n.NJ\n Format:\n DEFINE ALIAS alias real-address[,...]\n.J\n Real-address must be a full address, not just a username.  Alias\nmatching is case-insensitive.  If case is important in the substitution,\nplace quotation marks around real-address.\n The maximum size of the real-address (including all addresses, if multiple\nreal-addresses are specified) is 255 characters.\n.I-1\n2 FILE__SERVER\n DEFINE FILE__SERVER is used to create a file server.\n.NJ\n Format:\n DEFINE FILE__SERVER name\n.J\n The name given must be 32 characters or less in length, and should not\nbe the same as an existing username or mailing list.\n.I-1\n3 Qualifiers\n.I-1\n/BEGIN__SEND__PERIOD\n /BEGIN__SEND__PERIOD=hh:mm\n This qualifier identifies the hour of the day when the off-peak sending\nperiod begins.  It is only meaningful when a delay threshold is specified.\nThe default send period begins at 17:00.\n.I-1\n/DELAY__THRESHOLD\n /DELAY__THRESHOLD=size\n /NODELAY__THRESHOLD\n This qualifier identifies the largest size, in bytes, that a file service\nresponse can be to be sent during prime time.  Responses exceeding that size\nare delayed until the off-peak sending period.  /NODELAY__THRESHOLD lets\nresponses  of any size be sent at any time.  Omitting \"size\" sets a default\nsize of 16,384 bytes.\n.I-1\n/DESCRIPTION\n /DESCRIPTION=text\n /NODESCRIPTION (default)\n The /DESCRIPTION qualifier defines a brief description for the file server.\nThis description is added to the file server address in the\nX-FileServer header on outgoing file server messages.\n.I-1\n/END__SEND__PERIOD\n /END__SEND__PERIOD=hh:mm\n This qualifier identifies the hour of the day when the off-peak sending\nperiod ends.  It is only meaningful when a delay threshold is specified.\nThe default send period ends at 09:00.\n.I-1\n/HOST__LIMIT\n /[NO]HOST__LIMIT=n\n This qualifier specifies a daily per-host byte count limit on requests\nto the file server.  If a requested file's size plus the current byte\ncount exceeds the daily limit, the file is not sent.  This limit is\nkept on a per-host basis.\n.I-1\n/MAILING__LIST\n /[NO]MAILING__LIST=list-name\n This qualifier specifies that only those users who subscribe to the\nspecified mailing list (which must be a list on the local system) may\nhave access to the file server.\n.I-1\n/MANAGER\n /MANAGER=address\n The /MANAGER qualifier identifies the address to which file service management\nrequests are forwarded (when sent to user {file-server-username}-Mgr).\nIf omitted, Postmaster on the local system is used.\n.I-1\n/ROOT\n /ROOT=root-spec\n The /ROOT qualifier identifies the root for the file server.  Root-spec\nmust be a rooted logical name or a device and root directory specification.\n.I-1\n/SERVER__LIMIT\n /[NO]SERVER__LIMIT=n\n This qualifier specifies a daily server byte count limit on requests\nto the file server.  If a requested file's size plus the current byte\ncount exceeds the daily limit, the file is not sent.  This limit applies\nto all requests to the server.\n.I-1\n/USER__LIMIT\n /[NO]USER__LIMIT=n\n This qualifier specifies a daily per-user byte count limit on requests\nto the file server.  If a requested file's size plus the current byte\ncount exceeds the daily limit, the file is not sent.  This limit is\nkept on a per-destination-user basis.\n.I-1\n2 INSIDE__NETWORK__ADDRESS\n The DEFINE INSIDE__NETWORK__ADDRESS command establishes an IP address or\nnetwork that is in one of the local domains, is permitted to use your SMTP\nserver as a relay, or to reject a particular host or network from being\nconsidered as part of your local domain.\n.NJ\n Format:\n DEFINE INSIDE__NETWORK__ADDRESS ip-address\n.J\n Inside network address definitions are only used with the SMTP server\nis set to disallow relays with SET SMTP/NORELAY__ALLOWED.  When at least\none inside address is defined, messages coming in via SMTP are allowed\nto have recipients outside of the local domain(s) only if the sending\nsystem's IP address is on the inside network address list.\n By default, the SMTP server will still reject a message that contains\nnon-local addresses for both the sender and the receiver, even from\nhosts on the inside network address list.  You can ease that restriction\nwith the /RELAY__ALLOWED qualifier.\n.I-1\n3 ip-address\n IP address, in dotted-decimal form, of the host or network.  If this is\na network address, you must also specify the /NETMASK qualifier.\n.I-1\n3 Qualifiers\n.I-1\n/NETMASK\n /NETMASK=ip-netmask\n Specifies the network mask to be applied to the address, in dotted-decimal\nform.  The default is 255.255.255.255, which indicates that the IP address\nis for a host, not a network.\n.I-1\n/REJECT\n /REJECT\n /NOREJECT (default)\n Indicates whether relay is to be rejected from the specified\nhost or network.  This qualifier can be used to reject SMTP relay\nfrom particular hosts or subnetworks that are below a parent network\nthat is already on the inside network address list.\n.I-1\n/RELAY__ALLOWED\n /RELAY__ALLOWED\n /NORELAY__ALLOWED (default)\n Indicates that the host(s) should be allowed full relay permission; that\nis, messages sent from the host(s) are allowed to contain non-local addresses\nfor both sender and receiver.\n This qualifier is useful when your system is acting as a central mail hub,\nand there are hosts on your local network that automatically forward messages\nfor their local users to hosts outside your domain via an alias.  When such\nmessages are sent back to your system (as the mail hub), they will contain\nnon-local addresses for both the sender and the recipient.\n.I-1\n2 LIST\n The DEFINE LIST command is used to create a mailing list.\n.NJ\n Format:\n DEFINE LIST listname\n.J\n DEFINE LIST creates three addresses on the local system: the mailing list\nitself, a control address (listname-REQUEST), and a sender address\n(listname-SENDER).\n.I-1\n3 Qualifiers\n.I-1\n/ADD__MESSAGE\n /ADD__MESSAGE=fspec\n /NOADD__MESSAGE (default)\n The /ADD__MESSAGE qualifier is used to specify a file whose contents\nare to be sent when a user subscribes to the list.  If you omit\nthe device and directory parts of the file specification, they default\nto MX__MLIST__DIR.  If you omit the file type, it defaults to TXT.\n If no add message is specified, the system default add message, contained\nin file MX__MLIST__DIR:MLIST__ADD__MESSAGE.TXT, is used.\n.I-1\n/ARCHIVE\n /ARCHIVE=fspec\n /NOARCHIVE (default)\n The /ARCHIVE qualifier  is used to establish a file into which mailing list\nmessages are archived.  You may specify just parts of a file specification,\nto allow the following defaults to take effect:\n.NJ\n Device, directory: MX__MLIST__DIR:\n File name: same as mailing list name\n File type: yyyy-mm (four-digit year, a hyphen, two-digit month)\n.J\n This setup allows for easy monthly disposal of the mailing list archives.\n.I-1\n/CASE__SENSITIVE\n /CASE__SENSITIVE (default)\n /NOCASE__SENSITIVE\n Enables or disables case-sensitivity with regard to mailing list\nsubscribers.  By default, MX treats the left-hand side of subscriber\naddresses in a case-sensitive manner with regard to SIGNOFF and SET\ncommands.  If a list is defined /NOCASE__SENSITIVE, then the case of\nsubscriber addresses will be ignored.\n.I-1\n/CC__POST__ERRORS\n /CC__POST__ERRORS\n /NOCC__POST__ERRORS (default)\n Enables or disables copying mailing post failure messages to the /ERRORS__TO\naddress.  By default, if a message cannot be forwarded to a list, an error\nmessage is sent back to the sender of the message.  If /CC__POST__ERRORS\nis set, those error messages are also sent to the /ERRORS__TO address.\nThis lets the list owner see attempted posts from non-subscribers and other\nposting failures.\n.I-1\n/CONFIRMATION__MESSAGE\n /CONFIRMATION__MESSAGE=fspec\n /NOCONFIRMATION__MESSAGE (default)\n The /CONFIRMATION__MESSAGE qualifier is used to specify a file whose contents\nare to be sent when the mailing list processor requests confirmation of\na subscription request (see DEFINE LIST /REQUEST__CONFIRMATION).  If you omit\nthe device and directory parts of the file specification, they default\nto MX__MLIST__DIR.  If you omit the file type, it defaults to TXT.\n If the NO form is specified, the system default confirmation message, contained\nin file MX__MLIST__DIR:MLIST__CONFIRM__MESSAGE.TXT, is used.\n.I-1\n/DESCRIPTION\n /DESCRIPTION=text\n /NODESCRIPTION (default)\n The /DESCRIPTION qualifier defines a brief description for the\nmailing list. This description is added to the mailing list address in the\nX-Listname header on outgoing mailing list messages.\n.I-1\n/DIGEST\n /DIGEST\n /NODIGEST (default)\n The /DIGEST qualifier enables or disables the support for digest subscribers\nfor the given mailing list.\n.I-1\n/ERRORS__TO\n /ERRORS__TO=address\n This qualifier identifies the address that messages sent to the\nlistname-SENDER sending address (which are usually delivery error messages)\nare sent.  If omitted, the first owner specified with /OWNER will be\nused.\n.I-1\n/FORWARD__MESSAGE\n /FORWARD__MESSAGE=fspec\n /NOFORWARD__MESSAGE (default)\n The /FORWARD__MESSAGE qualifier is used to specify a file whose contents\nare to be sent when the list is set to no E (enroll) access for WORLD and\na user attempts to subscribe to the list.  The message should inform the\nuser that the subscription request was forwarded to the mailing list's\nowner.  If you omit the device and\ndirectory parts of the file specification, they default to MX__MLIST__DIR. \nIf you omit the file type, it defaults to TXT.\n If no forward-to-owner message is specified, the system default message,\ncontained in file MX__MLIST__DIR:MLIST__FORWARD__MESSAGE.TXT, is used.\n.I-1\n/HIDE__ERRORS__TO\n /HIDE__ERRORS__TO (default)\n /NOHIDE__ERRORS__TO\n The /HIDE__ERRORS__TO qualifier instructs MLF to hide the error-returns\naddress in outbound messages to the mailing list, even when the return\naddress is specified with /ERRORS__TO. When /HIDE__ERRORS__TO is set on\na list, MLF uses the automatically-created owner-{listname} alias as\nthe envelope FROM and Errors-To address in outbound list messages.\nThis is the default setting.\n If you have set up a special address or alias for receiving mailing\nlist-related error messages, and the address can be externally visible,\nyou should specify that address with the /ERRORS__TO qualifier and\nspecify /NOHIDE__ERRORS__TO to have the address you specify\nappear in the envelope FROM and Errors-To headers.\n.I-1\n/HOSTNAME\n /HOSTNAME=hostname\n /NOHOSTNAME (default)\n The /HOSTNAME qualifier instructs MLF to use the supplied hostname\nfor all addresses generated by MLF for the mailing list.  The supplied\nhostname is used instead of the actual running host's name.\n For example, specifying /HOSTNAME=\"YYZ.COM\" will cause all MLF-generated\nmailing list addresses to include \"@YYZ.COM\" instead of the actual host name.\nIt is assumed that MX has been properly configured to handle mail addressed\nusing the supplied hostname (i.e., that MX records for YYZ.COM point to\nthe node running MX, and that it recognizes that YYZ.COM is a LOCAL path,\netc.).\n.I-1\n/IGNORE\n /IGNORE=(keyword[=value],...)\n The /IGNORE qualifier instructs MLF to ignore postings to the mailing list\nif they match the specified criteria.  The criteria keywords are\nMISSING__LIST__ADDRESS and JUNK__MAIL.  These keywords are negatable.  By default,\nno postings are ignored.\n Specifying the MISSING__LIST__ADDRESS criterion causes MLF to ignore\npostings to the list that do not explicitly include the list's address in either\nthe To: or CC: header of the message.  This keyword does not take a value.\n Specifying the JUNK__MAIL criterion causes MLF to ignore postings that\ncontain the X-Junk-Mail-Rating: header that is inserted by the heuristic\njunk-mail filter in the SMTP server.  This keyword takes a value: LOW,\nMEDIUM, or HIGH, corresponding to the confidence level of the likelihood\nthat the message is junk mail, as entered in the\nX-Junk-Mail-Rating: header by the SMTP server.  Only those messages with\nthe specified or higher rating are ignored; i.e., if MEDIUM is specified\nas the keyword value, only those messages with MEDIUM or HIGH ratings are\nignored.\n \n.I-1\n/LIST__HEADERS\n /LIST__HEADERS=(keyword=value[,...])\n /NOLIST__HEADERS (default)\n The /LIST__HEADERS qualifier instructs MLF to include or omit special\nList-* headers that provide URLs for subscribing to a list,\nunsubscribing from a list, and getting help for that list.\n There are three valid keywords: SUBSCRIBE, UNSUBSCRIBE, and HELP.\nAll three accept values that are used in the creation of the actual headers,\nwhich will be added to each message posted to the mailing list.  However,\nonly HELP requires a value.  If the value is omitted for SUBSCRIBE and\nUNSUBSCRIBE, the proper URLs for those actions will be automatically generated\nby MLF.\n Clients that support these headers (both X-List-* and List-*) will provide\nclick buttons to perform the specified actions (usually \"mailto\" URLs).\n.I-1\n/MAXIMUM__MESSAGE__SIZE\n /MAXIMUM__MESSAGE__SIZE=size-in-Kbytes\n /NOMAXIMUM__MESSAGE__SIZE (default)\n Specifies a limit on the size of a message posted to the list, expressed\nin kilobytes.  Messages with contents (excluding headers) that exceed the\nspecified limit are rejected and returned to sender.\n Specifying zero as the value is identical to specifying /NOMAXIMUM__MESSAGE__SIZE.\n.I-1\n/NOTIFY\n /NOTIFY=(type,...)\n /NONOTIFY (default)\n Specifies that the owner(s) of the mailing list should be sent a\nnotification message for control transactions.  Valid type keywords are\nALL (for all transaction types), ADD, REMOVE, REQUEST, and SET.\n By default, no owner notifications are sent.\n.I-1\n/OWNER\n /OWNER=(address[,...])\n The /OWNER qualifier identifies the address(es) of the owner(s) of the\nmailing list.  Messages coming to the mailing list or the listname-REQUEST\ncontrol address will be granted OWNER access to the mailing list.\n.I-1\n/PRIVATE\n /PRIVATE\n /NOPRIVATE (default)\n The /PRIVATE qualifier is used prevent a list from being displayed in\nresponse to a LIST command sent to ListServ.  The list protection mask\nis not affected by this qualifier.\n.I-1\n/PROTECTION\n /PROTECTION=(class:code[,...])\n This qualifier allows you to grant or deny certain types of access to\nvarious users.  The protection code is of the same form as a normal VMS\nfile protection specification.\n \"Class\" can be one of SYSTEM, OWNER, GROUP, or WORLD.  The SYSTEM class\nincludes only those addresses identified as system users with DEFINE\nSYSTEM__USERS. The OWNER class includes only the owners of the mailing list.\nThe GROUP class consists of the subscribers of the mailing list.  The WORLD\nclass consists of those addresses that are not subscribers of the mailing\nlist.\n \"Code\" can consist of the letters R,W,E, and D.  R (Read or Review) access\nallows the user to request a listing of the addresses on the mailing list\nwith the REVIEW command.  W (Write) access allows the user to send a message\nto the mailing list.  E (Execute) access allows the user to use the automatic\nsubscription facility to subscribe to the mailing list (meaningful only for\nthe WORLD class, of course).  D (Delete) access allows the user to use the\nautomatic subscription facility to sign off the mailing list (meaningful only\nfor the GROUP class).\n If E access is denied to WORLD, subscription requests are forwarded to the\nmailing list owner(s).  If D access is denied to GROUP, signoff requests\nare forwarded to the mailing list owner(s).\n Note that protection codes are checked just like VMS protection codes,\nso that you cannot grant some kind of access to WORLD and exclude that\naccess from GROUP, SYSTEM, or OWNER.  Also, SYSTEM and OWNER classes are\ngranted CONTROL access implicitly (just as with VMS file protection), which\nallows them to add and remove other users from the mailing list.\n.I-1\n/RECIPIENT__MAXIMUM\n /RECIPIENT__MAXIMUM=DEFAULT (default)\n /RECIPEIENT__MAXIMUM=count\n /NORECIPIENT__MAXIMUM\n The /RECIPIENT__MAXIMUM qualifier controls how the mailing list\nprocessor sets the maximum number of recipients per outbound message\nfor the list.  The default setting is DEFAULT, which causes the\nmailing list processor to set the maximum number based on the\nSET MLF/RECIPIENT__MAXIMUM setting.  You may override the SET MLF\ndefault by specifying a number, or by specifying /NORECIPIENT__MAXIMUM,\nwhich prevents MLF from breaking up long lists of recipients into\nsmaller chunks for this list.\n.I-1\n/REMOVE__MESSAGE\n /REMOVE__MESSAGE=fspec\n /NOREMOVE__MESSAGE (default)\n The /REMOVE__MESSAGE qualifier is used to specify a file whose contents\nare to be sent when a user signs off of the list.  If you omit\nthe device and directory parts of the file specification, they default\nto MX__MLIST__DIR.  If you omit the file type, it defaults to TXT.\n If no removal message is specified, the system default removal message,\ncontained in file MX__MLIST__DIR:MLIST__REMOVE__MESSAGE.TXT, is used.\n.I-1\n/REPLY__TO\n /REPLY__TO=(kwd[,...])\n Specifies how the mailing list processor should handle Reply-To headers.\nAvailable reply-to types are SENDER and LIST, which may be combined.\nThe default is\nSENDER, which prevents the mailing list processor from modifying the headers.\nIf LIST is specified, a Reply-To header is added to list messages to re-direct\nreplies to the mailing list, eliminating any existing Reply-To header in the\noriginal message.  If LIST and SENDER are both specified, a Reply-To header\ncontaining both the mailing list address and the original Reply-To address\nis added to list messages (using the From address if no Reply-To header\nexisted in the original message).\n.I-1\n/REQUEST__CONFIRMATION\n /REQUEST__CONFIRMATION[=INTERVAL=delta-time]\n /NOREQUEST__CONFIRMATION (default)\n The /REQUEST__CONFIRMATION qualifier is used to specify whether or not\nthe mailing list processor should request confirmation of a subscription\nrequest from a user being added to a list via the SUBSCRIBE or ADD list\nprocessor command.  By default, confirmations are not requested.\n You can control the length of time that the mailing list processor will\nwait for a subscription request to be confirmed by specifying the INTERVAL\nkeyword and a VMS delta-time string for its value.  If not specified,\nthe default confirmation interval is 3 days.\n.I-1\n/RETURN__ADDRESS\n /RETURN__ADDRESS=address\n /NORETURN__ADDRESS (default)\n The /RETURN__ADDRESS qualifier is used to specify an alternate address\nthat is to be used as\nthe Reply-To address when /REPLY__TO=LIST is specified.\nThis qualifier is most useful when multiple lists should have a common\nreturn address.  For example, it can be used to redirect replies to a\n\"-Digest\" list back to the non-digest address.\n.I-1\n/SETTINGS\n /SETTINGS=(keyword[,...])\n /SETTINGS=DEFAULT  (default)\n The /SETTINGS qualifier is used to override the default subscriber settings\nfor a list.  The valid keywords are MAIL, REPRO, CONCEAL, DIGEST, POST, and\ntheir \"NO\" forms.\n A special keyword, DEFAULT, can be used to reset the settings\nto the MLF default for a mailing list.  The default settings for a list\nare MAIL, REPRO, NOCONCEAL, NODIGEST, and POST.\n.I-1\n/STRIP__HEADERS\n /STRIP__HEADERS=(RECEIVED[,OTHER])\n /STRIP__HEADERS=(NORECEIVED,NOOTHER) (default)\n The /STRIP__HEADERS qualifier is used to strip certain RFC822 headers from\nmessages posted to a mailing list.  Currently, only the keywords RECEIVED and\nOTHER (and NORECEIVED and NOOTHER) are supported.\n When /STRIP__HEADERS=RECEIVED is set, the \"Received:\" headers are stripped from\nthe incoming message before it is mailed out to the list subscribers, thereby\nreducing the total number of \"Received:\" headers in the final message.  This is\nespecially beneficial to BITNET hosts because there can be a substantial number\nof \"Received:\" headers added to a message that must pass through one or more\nInternet/BITNET gateways.\n When /STRIP__HEADERS=OTHER is set, all \"other\" headers are stripped from\nthe incoming message before it is mailed out.  \"Other\" headers are any headers\nnot listed under HELP SET LOCAL/HEADERS.  This includes return-receipt\nheaders, X-400 headers, etc.\n.I-1\n/SUBJECT__PREFIX\n /SUBJECT__PREFIX=\"string\"\n /NOSUBJECT__PREFIX (default)\n Enables or disables the addition of a prefix to the Subject line of\nmessages posted to the list.  By default, no prefix is added.  When\nthe list is set to /REPLY__TO=(SENDER), a short prefix string may be\nsupplied to help subscribers recognize mailing list messages.  The\ngiven string is bracketed by square brackets ([]) when it is prefixed\nto the subject lines.  The maximum length for the prefix string is 32\ncharacters.  Prefix strings should be kept short to avoid generating\nextremely long subject lines.\n.I-1\n/TEXT__ONLY\n /TEXT__ONLY\n /NOTEXT__ONLY (default)\n The /TEXT__ONLY qualifier is used to specify whether or not the\nmailing list processor should accept only those messages with plain\ntext content.  By default, any content type is accepted for list postings.\n.I-1\n/XHEADERS\n /XHEADERS=(\"string\"[,...])\n /NOXHEADERS (default)\n The /XHEADERS qualifier can be used to add additional site-specific headers\nto mailing list posts.  For example, you can use /XHEADERS to add additional\nnon-standard \"X-List-\" headers such as \"X-List-Archives\".  The format of the\nheader string is: \"Keyword: text\".  For example, \"Precedence: Bulk\", which\nis a non-standard header used by some mailers.\n Extreme care should be taken when adding additional headers to mailing lists\nto ensure that duplicate headers or improperly formatted headers\n(those that don't comply with RFC 822) aren't added to mailing list posts.\n.I-1\n2 LOCAL__DOMAIN\n The DEFINE LOCAL__DOMAIN command adds a domain name or pattern\nto the list of recognized \"local\" domains considered by the SMTP\nserver when determining relay rejection.\n.NJ\n Format:\n DEFINE LOCAL__DOMAIN domain-name-or-pattern\n.J\n The LOCAL__DOMAIN list is only used when the SMTP server is set\nto reject \"relayed\" SMTP messages with SET SMTP/NORELAY__ALLOWED.\n A \"relayed\" message is one that originates on a remote system and\nis sent to another remote recipient, using your system as an\nintermediate relay.\n When the SMTP server is set /NORELAY__ALLOWED, it checks the\nenvelope FROM and TO addresses, and if neither is local, refuses\nto deliver the message.  By default, any host in your local domain\n(based on your TCP/IP host name and your MX host name) is considered\n\"local\".  You may use this command to add other hosts or domains\nto this list.\n.I-1\n3 Parameter\n domain-name-or-pattern\n Either a fully-qualified domain name of a single host, or a VMS-style\nwildcard pattern.  Host names in envelope addresses that match the\nspecified name or pattern will be considered local by the relay\nchecker.\n.I-1\n2 PATH\n The DEFINE PATH command is used to map a domain to a delivery path.\n.NJ\n Format:\n DEFINE PATH domain-pat path-name\n.J\n.I-1\n3 Qualifiers\n.I-1\n/ROUTE\n /ROUTE=host-name\n\n Specifies the name of a host through which messages matching the domain\npattern should be routed.\n.I-1\n3 domain-pat\n This can be a specific domain name or a pattern containing wildcards to\nmatch a domain name.  For example: \"specific.host.EDU\", \"*.BITNET\".\n.I-1\n3 path-name\n This is one of DECNET__SMTP, HOLDING__QUEUE=n, LOCAL, SITE, SMTP.\nYou MUST have at least one LOCAL path defined; other paths will depend on the\nnetwork transports you have installed.  For the HOLDING__QUEUE path, you must\nspecify an integer from 1 to 32 for \"n\".\n.I-1\n2 REWRITE__RULE\n The DEFINE REWRITE__RULE command establishes an address rewriting rule to\nbe used by the Router.\n.NJ\n Format:\n DEFINE REWRITE__RULE  old-addr  new-addr\n.J\n When the router rewrites an address, it tries each rewrite rule, in the\norder you define them, until one matches.  It then applies the one rule\nto that address.\n.I-1\n3 Qualifiers\n.I-1\n/REGEX\n /REGEX\n Specifies use of regular-expression matching and substitution instead\nof substitution variables.\n.I-1\n3 old-addr\n The address-specification to be rewritten.  All addresses must conform\nto RFC821 and therefore will always contain a leading and closing angle\nbracket.  To create a substitution variable, surround the variable with\ncurly braces.  Matching is done from right to left.  Substitution variables\nmatch all characters.\n Example: <{user}@{host}.CSNET>\n Substitution variables are not used with regular-expression matching\n(when /REGEX is specified); instead, use subexpressions enclosed in\nparentheses.\n.I-1\n3 new-addr\n The resulting address pattern.  Substitution variables created in the\nold-addr specification can be used here.\n Example: <@relay.cs.net:{user}@{host}.CSNET>\n When using regular-expression matching, replacements are specified\nwith a backslash followed by a single digit (1 through 9), representing\nthe 1st through the 9th matching subexpression.\n.I-1\n2 SYSTEM__USERS\n The DEFINE SYSTEM__USERS command identifies addresses that the mailing list\nprocessor should treat as SYSTEM-class users for protection purposes.\n.NJ\n Format:\n DEFINE SYSTEM__USERS address[,...]\n.I-1\n1 EXIT\n The EXIT command leaves MCP.  If you were using MCP to edit an existing\nMX configuration, a new version of the configuration file is saved before\nMCP exits.  If the configuration file name is unknown, you are prompted\nfor a file name before exiting.\n.I-1\n1 HELP\n The HELP command displays information on MCP commands.\n.I-1\n1 MODIFY\n The MODIFY command is used to change definitions of mailing lists, aliases,\npaths, etc.  The following MODIFY commands are supported, and take the same\nqualifiers as their DEFINE counterparts (see the help information on DEFINE\nfor more information):\n.NJ\n MODIFY ALIAS  alias\n MODIFY FILE__SERVER  fsrv-name\n MODIFY INSIDE__NETWORK__ADDRESS  ip-address\n MODIFY LIST  list-name\n MODIFY PATH  domain-pattern\n MODIFY REWRITE__RULE  lhs\n.J\n The MODIFY USER command is documented here.\n.I-1\n2 USER\n The MODIFY USER command is used to set a new password for a username in the\nSMTP authentication database.\n.NJ\n Format:\n MODIFY USER username\n.J\n Usernames may be up to 16 characters in length, and are case-sensitive.\n.I-1\n3 Qualifiers\n.I-1\n/PASSWORD\n /PASSWORD=password-text\n Specifies a password for this username.  The password may be up to 64\ncharacters in length, and may contain any characters.  To specify lower case\nletters or blanks in the password, surround it with quotation marks.\n If this qualifier is omitted, a default password, \"PASSWORD\", is assigned\nto the username.\n\n.I-1\n1 QUIT\n Quits out of MCP without saving the configuration.  If you have changed\nthe configuration, QUIT will ask for confirmation before exiting.\n.I-1\n1 REMOVE\n The REMOVE command is used to remove an alias, mailing list, path, or\nrewrite rule from the configuration.  The following REMOVE commands\nare supported:\n.NJ\n REMOVE ALIAS  alias\n REMOVE FILE__SERVER  fsrv-name\n REMOVE INSIDE__NETWORK__ADDRESS  ip-address\n REMOVE LIST  listname\n REMOVE LOCAL__DOMAIN domain-name-or-pattern\n REMOVE PATH  domain-spec\n REMOVE REWRITE__RULE  old-addr\n.J\n The REMOVE INSIDE__NETWORK__ADDRESS command also takes a qualifier,\n/NETMASK.  The combination of the IP address and the netmask must\nmatch the combination in the inside address list.\n The REMOVE USER command is documented here.\n.J\n The MODIFY USER command is documented here.\n.I-1\n2 USER\n The REMOVE USER command removes a username from the\nSMTP authentication database.\n.NJ\n Format:\n REMOVE USER username\n.J\n Usernames may be up to 16 characters in length, and are case-sensitive.\n.I-1\n1 QUEUE\n The QUEUE suite of commands is used to control the system message queue.\n.I-1\n2 CANCEL\n Cancels one or more messages.\n.NJ\n Format:\n QUEUE CANCEL [entry-number,...]\n.J\n If you cancel the main entry for a message, all entries related to that\nmessage will also be cancelled.  If no entry numbers are specified, the\nentries selected by the last QUEUE SELECT command are cancelled.\n.I-1\n3 Qualifiers\n.I-1\n/LOG\n /LOG\n /NOLOG (default)\n Displays a log message for each successful operation.\n.I-1\n2 COMPRESS\n Shrinks the message queue file by creating a new file and renumbering\nall the existing entries in the file.\n.NJ\n Format:\n QUEUE COMPRESS/LOG\n.J\n.I-1\n3 Qualifiers\n.I-1\n/MAXIMUM__ENTRIES\n /MAXIMUM__ENTRIES=number-of-entries\n Specifies the maximum number of queue entries to be allowed.  MX will not\nallow more entries to be added to the queue than the specified value.\nMCP QUEUE EXTEND can be used to increase the number of allowed entries.\n The size of the queue file in blocks is equal to the maximum number of\nentries, plus 10 blocks plus whatever is added for the disk cluster.\n.I-1\n/LOG\n /LOG\n /NOLOG (default)\n Displays a log message for each successful operation.\n.I-1\n2 CREATE\n Creates a new, empty, MX message queue control file.\n.NJ\n Format:\n QUEUE CREATE [filespec]\n.J\n.I-1\n3 Parameters\n filespec\n Name of the queue control file to be created.  If omitted, the\ndefault name, MX_FLQ_DIR:MX_SYSTEM_QUEUE.FLQ_CTL, is used.\n.I-1\n3 Qualifiers\n.I-1\n/MAXIMUM__ENTRIES\n /MAXIMUM__ENTRIES=number-of-entries\n Specifies the maximum number of queue entries to be allowed for the queue.\nThe message queue will be extended to allow the specified number of entries.\n The size of the queue file in blocks is equal to the maximum number of\nentries, plus 10 blocks plus whatever is added for the disk cluster.\n.I-1\n2 DUMP\n Dumps an enqueued message to a set of files suitable for modifying\nrecipient addresses and requeuing with MX_SITE_IN.\n.NJ\n Format:\n QUEUE DUMP entry-number\n.J\n.I-1\n3 Qualifiers\n.I-1\n/CANCEL\n /CANCEL (default)\n /NOCANCEL\n By default, MCP cancels the queue entry for the dumped message.\nSpecify /NOCANCEL to keep the dumped entry in the queue.\n.I-1\n/OUTPUT\n /OUTPUT=file-spec\n Specifies the location for the three output files generated by\nthis command.  By default, the files are written to the current\ndefault directory with the filename for the message text and recipient\nfiles as ENTRY_n and the filename for the command procedure as\nREQUEUE_n (where \"n\" is the entry number).\n Do not specify a file type or version in the file specification;\nQUEUE DUMP always uses the file types .MSG__TEXT, .RECIPIENTS, and .COM for \nthe message text, recipient, and command procedure files, respectively.\n.I-1\n3 Parameter\n entry-number\n Queue entry number for the message to be dumped.  The queue entry\nmust be in READY or IN-PROGRESS state.\n QUEUE DUMP creates three output files for the message: one\ncontaining the message text, one containing the list of recipients,\nand a command procedure for invoking MX_SITE_IN to requeue the\nmessage.\n.I-1\n2 EXTEND\n Extends the existing message queue file to allow more entries to be in\nthe queue at any given time.\n.NJ\n Format:\n QUEUE EXTEND\n.J\n.I-1\n3 Qualifiers\n.I-1\n/MAXIMUM__ENTRIES\n /MAXIMUM__ENTRIES=number-of-entries\n Specifies the maximum number of queue entries to be allowed.  MX will not\nallow more entries to be added to the queue than the specified value.\nMCP QUEUE EXTEND can be used to increase the number of allowed entries.\n The size of the queue file in blocks is equal to the maximum number of\nentries, plus 10 blocks plus whatever is added for the disk cluster.\n.I-1\n2 HOLD\n Places one or more queue entries on hold.\n.NJ\n Format:\n QUEUE HOLD [entry-number,...]\n.J\n This command places the specified queue entry or entries on hold,\nso they will not be processed.  Use the QUEUE READY command to release\nthe entries for processing.  If no entry numbers are specified, the\nentries selected by the last QUEUE SELECT command are held.\n.I-1\n2 PURGE\n Purges the message queue of all finished and cancelled entries.\n.NJ\n Format:\n QUEUE PURGE\n.J\n The Router process automatically purges the queue of finished and cancelled\nentries, periodically.  This command can be used to force an immediate\npurge of the queue.\n.I-1\n3 Qualifiers\n.I-1\n/LOG\n /LOG\n /NOLOG (default)\n Displays a log message for each entry purged from the queue.\n.I-1\n2 READY\n Readies one or more queue entries for processing.\n.NJ\n Format:\n QUEUE READY [entry-number,...]\n.J\n This command can be used to ready a destination-specific entry or the main\nentry for a message (in which case all previous destination-specific entries\nare automatically cancelled).  If no entry numbers are specified, the queue\nentries selected by the last QUEUE SELECT command are readied.\n.I-1\n3 Qualifiers\n.I-1\n/AFTER\n /AFTER=date-time\n Specifies a date and time after which the entry should be processed. If\nnot specified, the entry is readied for immediate processing.\n.I-1\n/FINAL\n /FINAL\n /NOFINAL (default)\n Sets the error count for all recipients associated with this entry\nto 32767.  This causes the delivery agent to process the entry\nonly once for each recipient.\n.I-1\n/LOG\n /LOG\n /NOLOG (default)\n Displays a log message for each successful operation.\n.I-1\n2 SELECT\n Selects queue entries.\n.NJ\n Format:\n QUEUE SELECT\n.J\n This command builds a list of queue entries based on selection\ncriteria that you specify with qualifiers on the command.  Subsequent\nQUEUE CANCEL, HOLD, and READY commands will use this selection list\nby default if you do not specify entry numbers on those commands.\n You can display the selected entries with the QUEUE SHOW/SELECTED\ncommand.\n.I-1\n3 Qualifiers\n.I-1\n/BEFORE\n /BEFORE[=time]\n Selects only those entries dated before the specified time.   You can\nspecify time as an absolute time, a combination of absolute and delta\ntimes, or as one of the following keywords: TODAY (default), TOMORROW,\nor YESTERDAY. Specify one of the following qualifiers with the /BEFORE\nqualifier to indicate the time attribute to be used as the basis for\nselection: /CREATED (default), /DELAY, /EXPIRE, or /MODIFIED.\n.I-1\n/CREATED\n /CREATED\n Modifies the time value specified with the /BEFORE or the /SINCE\nqualifier. The /CREATED qualifier selects entries based on their\ndates of creation. \n.I-1\n/DELAY\n /DELAY\n Modifies the time value specified with the /BEFORE or the /SINCE\nqualifier. The /DELAY qualifier selects entries based on their\ndelay dates.\n.I-1\n/DESTINATION__AGENT\n /DESTINATION__AGENT=agent\n Selects only those entries that are to be or have been processed by the\nspecified MX agent.  Valid keywords are: ROUTER, MLF, LOCAL, SMTP, SITE,\nDNSMTP, and HOLDING__QUEUE=n (where n ranges from 1 to 32,\nthe maximum number of holding queues).  HOLD1 through HOLD8 are obsolte,\nbut still supported for backward compatibility with prior versions of MX.\nThis qualifier is most useful when used with /BRIEF.\n.I-1\n/EXPIRE\n /EXPIRE\n Modifies the time value specified with the /BEFORE or the /SINCE\nqualifier. The /EXPIRE qualifier selects entries based on their\ndates of expiration. \n.I-1\n/HELD\n /HELD\n Selects only those entries that are in USER-HOLD or OPER-HOLD state.\n.I-1\n/IN__PROGRESS\n /IN__PROGRESS\n Selects only entries marked as being in-progress (INPROG).\n.I-1\n/MODIFIED\n /MODIFIED\n Modifies the time value specified with the /BEFORE or the /SINCE\nqualifier. The /MODIFIED qualifier selects entries based on their\ndates of modification. \n.I-1\n/ORIGIN__AGENT\n /ORIGIN__AGENT=agent\n Selects only those entries that were entered into the queue by the\nspecified MX agent.  Valid keywords are: LOCAL, SMTP, SITE,\nMAIL, and DNSMTP.\n.I-1\n/SINCE\n /SINCE[=time]\n Selects only those entries dated after the specified time.   You can\nspecify time as an absolute time, a combination of absolute and delta\ntimes, or as one of the following keywords: TODAY (default), TOMORROW,\nor YESTERDAY. Specify one of the following qualifiers with the /SINCE\nqualifier to indicate the time attribute to be used as the basis for\nselection: /CREATED (default), /DELAY, /EXPIRE, or /MODIFIED.\n.I-1\n/WAITING\n /WAITING\n Selects only those entries that are waiting for processing.\n.I-1\n2 SHOW\n Displays queue entries.\n.NJ\n Format:\n QUEUE SHOW [entry-number,...]\n.J\n With no qualifiers, QUEUE SHOW gives a brief display for each active\n(READY or IN-PROGRESS) queue entry.\n.I-1\n3 Qualifiers\n.I-1\n/ALL\n /ALL\n Causes the display of all queue entries, including those that have been\nfinished or cancelled.\n.I-1\n/BEFORE\n /BEFORE[=time]\n Selects only those entries dated before the specified time.   You can\nspecify time as an absolute time, a combination of absolute and delta\ntimes, or as one of the following keywords: TODAY (default), TOMORROW,\nor YESTERDAY. Specify one of the following qualifiers with the /BEFORE\nqualifier to indicate the time attribute to be used as the basis for\nselection: /CREATED (default), /DELAY, /EXPIRE, or /MODIFIED.\n.I-1\n/BRIEF\n /BRIEF\n Causes a brief display of all queue entries, including those that have\nbeen finished or cancelled.  The information displayed\nis taken only from the MX queue file and includes the target MX process\nfor each entry.\n.I-1\n/CREATED\n /CREATED\n Modifies the time value specified with the /BEFORE or the /SINCE\nqualifier. The /CREATED qualifier selects entries based on their\ndates of creation. \n.I-1\n/DATE\n /DATE\n Causes the creation and modification dates to be displayed for each queue\nentry.\n.I-1\n/DELAY\n /DELAY\n Modifies the time value specified with the /BEFORE or the /SINCE\nqualifier. The /DELAY qualifier selects entries based on their\ndelay dates.\n.I-1\n/DESTINATION__AGENT\n /DESTINATION__AGENT=agent\n Selects only those entries that are to be or have been processed by the\nspecified MX agent.  Valid keywords are: ROUTER, MLF, LOCAL, SMTP, SITE,\nDNSMTP, and HOLDING__QUEUE=n (where n ranges from 1 to 32,\nthe maximum number of holding queues).  HOLD1 through HOLD8 are obsolte,\nbut still supported for backward compatibility with prior versions of MX.\nThis qualifier is most useful when used with /BRIEF.\n.I-1\n/EXPIRE\n /EXPIRE\n Modifies the time value specified with the /BEFORE or the /SINCE\nqualifier. The /EXPIRE qualifier selects entries based on their\ndates of expiration. \n.I-1\n/FULL\n /FULL\n Provides a more detailed display of each queue entry.\n.I-1\n/HELD\n /HELD\n Selects only those entries that are in USER-HOLD or OPER-HOLD state.\n.I-1\n/IN__PROGRESS\n /IN__PROGRESS\n Displays only entries marked as being in-progress (INPROG).\n.I-1\n/MODIFIED\n /MODIFIED\n Modifies the time value specified with the /BEFORE or the /SINCE\nqualifier. The /MODIFIED qualifier selects entries based on their\ndates of modification. \n.I-1\n/ORIGIN__AGENT\n /ORIGIN__AGENT=agent\n Selects only those entries that were entered into the queue by the\nspecified MX agent.  Valid keywords are: LOCAL, SMTP, SITE,\nMAIL, and DNSMTP.\n.I-1\n/OUTPUT\n /OUTPUT=file-spec\n Directs the output of the command to the specified file.\n.I-1\n/SELECTED\n /SELECTED\n Displays the entries that were selected by the last QUEUE SELECT\ncommand.\n.I-1\n/SINCE\n /SINCE[=time]\n Selects only those entries dated after the specified time.   You can\nspecify time as an absolute time, a combination of absolute and delta\ntimes, or as one of the following keywords: TODAY (default), TOMORROW,\nor YESTERDAY. Specify one of the following qualifiers with the /SINCE\nqualifier to indicate the time attribute to be used as the basis for\nselection: /CREATED (default), /DELAY, /EXPIRE, or /MODIFIED.\n.I-1\n/WAITING\n /WAITING\n Causes only those entries that are waiting for processing to be displayed.\n.I-1\n2 STATISTICS\n Displays statistics concerning the number of entries in the MX message queue.\n.NJ\n Format:\n QUEUE STATISTICS\n.J\n.I-1\n2 SYNCHRONIZE\n Synchronizes the message queue bitmap with the actual entries in the queue.\n.NJ\n Format:\n QUEUE SYNCHRONIZE\n.J\n.I-1\n3 Qualifiers\n.I-1\n/LOG\n /LOG\n Displays a log message about the synchronization.\n.I-1\n/RESET\n /RESET\n Resets the \"Highest entry used\" counter displayed by QUEUE\nSTATISTICS.  By default, the counter is not reset.\n.I-1\n1 RESET\n Sends a reset signal to one or more MX delivery agent processes, causing\nthem to reload their configuration information.\n.NJ\n Format:\n RESET [agent,...]\n.J\n Accepted agent names are: DECNET__SMTP, LOCAL, MLF, ROUTER, SITE,\nSMTP, and SMTP__SERVER.\nIf omitted, all agents are reset.\n.I-1\n2 Qualifiers\n.I-1\n/ACCOUNTING\n /ACCOUNTING\n Causes a new accounting file to be opened, for those agents supporting\naccounting (DECNET__SMTP, LOCAL, MLF, ROUTER, and SMTP).\nNo reloading of configuration occurs when RESET/ACCOUNTING is used.\n.I-1\n/CLUSTER\n /CLUSTER\n Causes the reset to affect agents cluster-wide; this is the default\nbehavior.  Use the /NODE qualifier to restrict the reset action to\nspecific nodes in the cluster.\n.I-1\n/NODE\n /NODE[=(node[,...])]\n Causes the specified agent resets to occur only on the specified nodes.\nIf no node names are specified, the local node is used by default.\n.I-1\n1 REVIEW\n Displays the subscribers of a locally-managed mailing list.\n.NJ\n Format:\n REVIEW list-name\n.J\n.I-1\n2 Qualifier\n.I-1\n/OUTPUT\n /OUTPUT=file-spec\n Directs the output of the REVIEW command to the specified file.\n.I-1\n1 SAVE\n Saves the current MX configuration to a file.  To be used by the Router\nand other processing agents, the file must be called MX__CONFIG.MXCFG and\nreside in the MX__DIR directory.  Alternatively, you can define the system-wide\nlogical name MX__CONFIG (in exec mode) to point to the real location of the\nMX configuration file to be used by the processing agents.\n.NJ\n Format:\n SAVE file-spec\n.J\n.I-1\n1 SET\n The SET command sets flags for use by some of the delivery agents.\n.NJ\n Format:\n SET  option\n.J\n.I-1\n2 DECNET__SMTP\n The SET DECNET__SMTP command sets flags for use by the SMTP-over-DECnet\ndelivery agent.\n.NJ\n Format:\n SET DECNET__SMTP\n.I-1\n3 Qualifiers\n.I-1\n/ACCOUNTING\n /ACCOUNTING\n /NOACCOUNTING  (default)\n.J\n Controls whether accounting records are written by the delivery agent.\nIf enabled, accounting records are written to the file MX__DNSMTP__ACC\n(with a default directory of MX__DNSMTP__DIR: and a default type of DAT).\n.I-1\n/MAXIMUM__RETRIES\n /MAXIMUM__RETRIES=n\n Specifies the maximum number of times the DECnet-SMTP agent should\ntry to deliver a message if the message cannot be delivered (due to\nnetwork failure).  The default is 96.\n.I-1\n/RETRY__INTERVAL\n /RETRY__INTERVAL=hh:mm:ss\n Specifies the minimum amount of time that should elapse between attempts\nto deliver a message.  The default is 00:30:00 (30 minutes).\n.I-1\n2 LOCAL\n The SET LOCAL command sets flags for use by the local delivery agent.\n.NJ\n Format:\n SET LOCAL\n.I-1\n3 Qualifiers\n.I-1\n/ACCOUNTING\n /ACCOUNTING\n /NOACCOUNTING  (default)\n.J\n Controls whether accounting records are written by the delivery agent.\nIf enabled, accounting records are written to the file MX__LOCAL__ACC\n(with a default directory of MX__LOCAL__DIR: and a default type of DAT).\n.I-1\n/CC__POSTMASTER\n /CC__POSTMASTER\n /NOCC__POSTMASTER\n Specifies whether or not error messages resulting from LOCAL delivery\nerrors are mailed to the local POSTMASTER, in addition to the original\nmessage sender.\n.I-1\n/DISABLE__EXQUOTA\n /DISABLE__EXQUOTA[=[NO]FATAL]\n /NODISABLE__EXQUOTA\n Specifies whether the EXQUOTA privilege should be disabled during\nlocal delivery attempts.  By default, EXQUOTA remains enabled during\nlocal message delivery.  Specifying /DISABLE__EXQUOTA=FATAL causes messages\nthat exceed the recipient's diskquota to be returned to sender immediately,\nrather than going through normal retry procedures.\n.I-1\n/HEADERS\n /HEADERS=(TOP:([NO]hdrname[,...]),BOTTOM:([NO]hdrname[,...]))\n.J\n Controls the placement of message headers in local delivery of messages.\nAny or all headers may be placed at the top and/or bottom of the message,\nor not added to the message at all.  Valid values for hdrname are:\n.i+10;ALL\n.i+10;BCC\n.i+10;CC\n.i+10;DATE\n.i+10;ENCRYPTED\n.i+10;FROM\n.i+10;IN__REPLY__TO\n.i+10;KEYWORDS\n.i+10;MESSAGE__ID\n.i+10;OTHER\n.i+10;RECEIVED\n.i+10;REFERENCES\n.i+10;REPLY__TO\n.i+10;RESENT__BCC\n.i+10;RESENT__CC\n.i+10;RESENT__DATE\n.i+10;RESENT__FROM\n.i+10;RESENT__MESSAGE__ID\n.i+10;RESENT__REPLY__TO\n.i+10;RESENT__SENDER\n.i+10;RESENT__TO\n.i+10;RETURN__PATH\n.i+10;SENDER\n.i+10;SUBJECT\n.i+10;TO\n The hdrname keywords may be negated.  ALL specifies all headers;\nNOALL specifies no headers.  OTHER specifies all headers with a header\nname not matching one of the other keywords.\n.I-1\n/LONG__LINES\n /LONG__LINES\n /NOLONG__LINES (default)\n Specifies that lines exceeding the MAIL-11 255 character maximum\nshould not be wrapped during delivery to what appears to be a\nlocal user.  This setting is disabled by default, so lines exceeding\nthe maximum length get wrapped at the nearest whitespace character\nto the limit (if there are any).  Enabling this\nsetting could cause mail delivery via VMS MAIL's DECnet support to\nfail when MX cannot determine that a recipient is a DECnet\naddress.\n.I-1\n/MAXIMUM__RETRIES\n /MAXIMUM__RETRIES=n\n Specifies the maximum number of times the local delivery agent should\ntry to deliver a message if the message cannot be delivered (due to\nDECnet outage or locked mail file).  The default is 96.\n.I-1\n/MULTIPLE__FROM\n /MULTIPLE__FROM (default)\n /NOMULTIPLE__FROM\n Controls whether or not the VMS Mail ``From:'' line on incoming\nmessages can contain multiple return addresses.  By default, if an\nRFC822 From: or Reply-To: line contains more than one address, as many\nof those addresses as will fit are included on the VMS Mail ``From:''\nline (up to 255 characters).  Specifying /NOMULTIPLE__FROM limits the\n``From:'' line to a single address.\n.I-1\n/OMIT__RESENT__HEADERS\n /OMIT__RESENT_HEADERS\n /NOOMIT__RESENT_HEADERS (default)\n Specifies that MX forwarding using VMS Mail SET FORWARD should\nomit the Resent- headers MX normally uses to detect forwarding loops.\nThis setting is disabled by default, and should only be enabled if\nusers' mail clients have trouble interpreting Resent- headers.\n.I-1\n/QP__DECODE\n /QP__DECODE\n /NOQP__DECODE\n Specifies whether or not incoming MIME quoted-printable messages are\nautomatically decoded by MX Local before delivery through VMS Mail.  By\ndefault, such messages are decoded.  If your users read their mail via\nPOP or IMAP, you might want to disable the decoding to let the users'\nbrowsers do the decoding.\n.I-1\n/RETRY__INTERVAL\n /RETRY__INTERVAL=hh:mm:ss\n Specifies the minimum amount of time that should elapse between attempts\nto deliver a message.  The default is 00:30:00 (30 minutes).\n.I-1\n2 MLF\n The SET MLF command sets global parameters for the MLF\nMailing List/File Server agent.\n.NJ\n Format:\n SET MLF [qualifiers]\n.I-1\n3 Qualifiers\n.I-1\n/DELAY__DAYS\n /DELAY__DAYS=(dow[,...])\n /NODELAY__DAYS\n Sets the days of the week on which all file servers'\ndelayed-send threshold should be honored.  Defaults\nto all days of the week.\n.I-1\n/RECIPIENT__MAXIMUM\n /RECIPIENT__MAXIMUM=number\n /NORECIPIENT__MAXIMUM\n Sets the maximum number of recipients per message generated\nby the MLF agent.  If your MLF agent services large mailing\nlists with many remote subscribers, you may want to use this\nsetting to limit the number of recipients per message generated\nby MLF.  This will break up the distribution to the mailing list\ninto smaller chunks, allowing for more parallelism in delivery.\n Setting too small a value, however, could create a lengthy backlog\nin your MX message queue, depending on the number of subscribers\non your mailing list(s) and the number of messages the list receives\neach day.\n The default is /NORECIPIENT__MAXIMUM, which forces each incoming\nmailing list message to be forwarded as just one outbound message.\n.I-1\n2 ROUTER\n The SET ROUTER command sets flags for use by the Router.\n.NJ\n Format:\n SET ROUTER [qualifiers]\n.I-1\n3 Qualifiers\n.I-1\n/ACCOUNTING\n /ACCOUNTING\n /NOACCOUNTING  (default)\n.J\n Controls whether accounting records are written by the Rourter.\nIf enabled, accounting records are written to the file MX__ROUTER__ACC\n(with a default directory of MX__ROUTER__DIR: and a default type of DAT).\n One accounting record is written for each recipient of each routed message,\neither successful or unsuccessful.\n.I-1\n/OMIT__VMSMAIL__SENDER\n /OMIT__VMSMAIL__SENDER\n /NOOMIT__VMSMAIL__SENDER (D)\n Enables or disables the omission of the Sender: header for messages\nsent from VMS Mail.  Needed by some sites to work with other mailers that\ndon't adhere to RFC822.\n.I-1\n/PERCENT__HACK\n /PERCENT__HACK (D)\n /NOPERCENT__HACK\n Specify /NOPERCENT__HACK when you want to disable the automatic resolution\nof percent-hacked addresses.  It is enabled by default, and automatically\ntranslates addresses of the form \"user%host@localhost\" to \"user@host\".\nPercent-hack resolution may need to be disabled when you need to pass\nMX mail through the VMS Mail interface and into another mail system.\n.I-1\n2 SITE\n The SET SITE command sets flags for use by the SITE delivery agent.\n.NJ\n Format:\n SET SITE\n.I-1\n3 Qualifiers\n.I-1\n/MAXIMUM__RETRIES\n /MAXIMUM__RETRIES=n\n Specifies the maximum number of times the SITE agent should\ntry to deliver a message if the message cannot be delivered (due to\nnetwork failure).  The default is 96.\n.I-1\n/RETRY__INTERVAL\n /RETRY__INTERVAL=hh:mm:ss\n Specifies the minimum amount of time that should elapse between attempts\nto deliver a message.  The default is 00:30:00 (30 minutes).\n.I-1\n2 SMTP\n The SET SMTP command sets flags for use by the SMTP delivery agent\nand SMTP server.\n.NJ\n Format:\n SET SMTP\n.I-1\n3 Qualifiers\n.I-1\n/ACCOUNTING\n /ACCOUNTING\n /NOACCOUNTING  (default)\n.J\n Controls whether accounting records are written by the delivery agent.\nIf enabled, accounting records are written to the file MX__SMTP__ACC\n(with a default directory of MX__SMTP__DIR: and a default type of DAT).\n.I-1\n/AUTHENTICATION\n /AUTHENTICATION=(type,...)\n /NOAUTHENTICATION (default)\n.J\n Enables or disables the authentication extension in the SMTP server.\nThe \"type\" keyword can be CRAM__MD5, which enables the use of MX's\nprivate authentication database (see CREATE USER__DATABASE__FILE),\nor PLAIN, which enables the use of the VMS user authorization file.\n Specifying /NOAUTHENTICATION disables the authentication completely.\n.I-1\n/DEFAULT__ROUTER\n /DEFAULT__ROUTER=domain-name\n Specifies the name of a host through which all SMTP-bound mail should\nbe sent if a host name lookup fails.\n.I-1\n/DNS__RETRIES\n /DNS__RETRIES=n\n Specifies the maximum number of attempts to deliver a message when the\nhost name in a destination address cannot be resolved.  The default is\n12.\n.I-1\n/MAXIMUM__RETRIES\n /MAXIMUM__RETRIES=n\n Specifies the maximum number of times the SMTP agent should\ntry to deliver a message if the message cannot be delivered (due to\nnetwork failure).  The default is 96.\n.I-1\n/PERCENT__HACK\n /PERCENT__HACK (D)\n /NOPERCENT__HACK\n Specify /NOPERCENT__HACK when you want to reject any addresses containing\na percent-sign in the username portion of the address.  Such addresses\nare accepted by default.  Disabling the percent hack may be necessary to\nprevent other sites from using this feature to relay e-mail through your\nsystem.\n.I-1\n/RBL__CHECK\n /RBL__CHECK[=(domain-name,...)]\n /NORBL__CHECK (default)\n Specifies whether the SMTP server should check to see if a\nsystem connecting to it is on an Internet Realtime Blackhole List (RBL).\nRBL checking is disabled by default.\n You must specify one or more domain names as values for this qualifier;\nconsult your RBL provider for information on the domain names to use.\n.I-1\n/RELAY__ALLOWED\n /RELAY__ALLOWED (default)\n /NORELAY__ALLOWED\n Specifies whether the SMTP server will allow messages to be relayed\nthrough your system from one outside system to another.  This is\nallowed by default.  If you disable the relay function with\n/NORELAY__ALLOWED, you may also need to tell MX which domains\nit should consider \"local\" for the purposes of this check.  See\nthe DEFINE LOCAL__DOMAIN command for more information.\n.I-1\n/RETRY__INTERVAL\n /RETRY__INTERVAL=hh:mm:ss\n Specifies the minimum amount of time that should elapse between attempts\nto deliver a message.  The default is 00:30:00 (30 minutes).\n.I-1\n/TLS\n /TLS\n /NOTLS  (default)\n.J\n Controls whether SMTP_SERVER advertises and supports the STARTTLS\nESMTP command documented in RFC3207.\n.I-1\n/VALIDATE__SENDER__DOMAIN\n /[NO]VALIDATE__SENDER__DOMAIN\n Enables or disables a check in the SMTP server on whether the\ndomain name appearing in an SMTP MAIL FROM command appears in the Domain Name System.\nWhen enabled, a message from a sender whose domain name is invalid is\nrejected.  This setting is disabled by default.\n.I-1\n/VERIFY__ALLOWED\n /[NO]VERIFY__ALLOWED\n Enables or disables the processing of VRFY commands by the SMTP server.\nBy default, VRFY is enabled.  System administrators concerned about\nnetwork security should specify /NOVERIFY__ALLOWED to disable the VRFY\ncommand in the SMTP server.\n.I-1\n1 SHOW\n The SHOW command displays all or part of the MX configuration.\n.NJ\n Format:\n SHOW ALIASES [pattern]\n SHOW CONFIGURATION__FILE\n SHOW DECNET__SMTP\n SHOW FILE__SERVER [pattern]\n SHOW LISTS [pattern]\n SHOW LOCAL\n SHOW LOCAL__DOMAINS\n SHOW PATHS [pattern]\n SHOW REWRITE__RULES [pattern]\n SHOW ROUTER\n SHOW SITE\n SHOW SMTP\n SHOW SYSTEM__USERS\n SHOW USERS [pattern]\n SHOW VERSION\n SHOW ALL\n.J\n Those commands taking a pattern will display all entries matching the specified\npattern, which defaults to \"*\".  SHOW ALL displays all of the configuration\ninformation.\n.I-1\n2 Qualifiers\n.I-1\n/BRIEF\n /BRIEF\n The /BRIEF qualifier causes SHOW to display information in an\nabbreviated format.  Only SHOW LISTS has a brief display; for all\nother commands, the brief and full displays are identical.\n.I-1\n/COMMAND\n /COMMAND\n /NOCOMMAND (default)\n The /COMMAND qualifier causes the SHOW output to be formatted as MCP\ncommands, which could be executed later to reconstruct the configuration.\nBy default, the configuration information is displayed in a more\neye-pleasing and descriptive format.\n.I-1\n/FULL\n /FULL (default)\n The /FULL qualifier causes SHOW to display information in its\nnormal, full format.  Only SHOW LISTS has a brief display; for all\nother commands, the brief and full displays are identical.\n.I-1\n/OUTPUT\n /OUTPUT=file-spec\n The /OUTPUT qualifier can be used to direct the SHOW output into a file.\nWhen used with the /COMMAND qualifier, SHOW/OUTPUT can be used to create\na command file that can be edited and then read back in with the \"@\"\ninput-indirection function to create a new configuration file from scratch.\n.I-1\n1 SHUTDOWN\n Sends a shutdown signal to one or more MX delivery agent processes, causing\nthem to exit cleanly.\n.NJ\n Format:\n SHUTDOWN [agent,...]\n.J\n Accepted agent names are: DECNET__SMTP, LOCAL, MLF, ROUTER, SITE,\nSMTP, SMTP__SERVER, and HOLDING__QUEUE=n (where n ranges\nfrom 1 to 32, the maximum number of holding queues).  HOLD1 through HOLD8 are\nobsolete but still supported for backward compatibility with prior versions\nof MX.\nIf omitted, all agents are shut down.\n.I-1\n2 Qualifiers\n.I-1\n/CLUSTER\n /CLUSTER\n Causes the specified agent shutdowns to occur cluster-wide.  By default,\nSHUTDOWN affects only agents on the local node.\n.I-1\n/NODE\n /NODE[=(node[,...])]\n Causes the specified agent shutdowns to occur only on the specified nodes.\nIf no node names are specified, only agents on the local node are affected.\n.I-1\n/WAIT\n /WAIT\n /NOWAIT (default)\n Waits for the specified agent to exit before returning (up to 30 seconds).\n.I-1\n1 STATUS\n Displays the status of one or more MX agent processes.\n.NJ\n Format:\n STATUS [agent,...]\n.J\n Accepted agent names are: DECNET__SMTP, LOCAL, MLF, ROUTER, SITE,\nSMTP, SMTP__SERVER, and HOLDING__QUEUE=n (where n ranges\nfrom 1 to 32, the maximum number of holding queues).  HOLD1 through HOLD8 are\nobsolete but still supported for backward compatibility with prior versions\nof MX.\nIf omitted, status of all running agent processes is displayed.  For each\nprocess, the process ID, node name (on VMScluster systems), process name,\nand agent type are displayed.\n.I-1\n2 Qualifier\n.I-1\n/NODE\n /NODE=(node[,...])\n Causes the display of only those specified agents running on the specified\nnodes.\n.!\n.I-1\n1 SPAWN\n SPAWN is used to create a subprocess and transfer control to it.\n.NJ\n Format:\n SPAWN [command]\n.J\n.I-1\n2 Parameter\n command\n Specifies a command line to be executed within the spawned subprocess. \nIf a command is given, then the spawned process will be deleted after\nthat command is executed.\n.I-1\n2 Examples\n.LITERAL\n   1.  prompt> SPAWN DIRECTORY\n       [Output of the DIRECTORY command]\n          .\n          .\n          .\n       prompt>\n\n     The command above demonstrates spawning a subprocess to execute\n     a particular command.\n\n   2.  prompt> SPAWN\n       sub_prompt>  dir\n          .\n          .\n          .\n\n     The spawned process created above will stick around until it\n     is explictly deleted (or its parent process is deleted). Once\n     you SPAWN a subprocess, you can transfer control between it and\n     program by using the DCL and program ATTACH commands.\n.END LITERAL\n.!\n.I-1\n1 ATTACH\n ATTACH is used to transfer control to another process in the current\nprocess tree.\n.NJ\n Format:\n ATTACH [process]\n.J\n.I-1\n2 Parameter\n process\n Specifies the process name of the process to which to attach.  Not\nrequired if one of the ATTACH qualifiers is used.\n.I-1\n2 Qualifiers\n.I-1\n/IDENTIFICATION\n /IDENTIFICATION=pid\n Specifies the PID of the process to which to attach.\n.I-1\n/PARENT\n /PARENT\n Transfers control to the parent process of the process running MCP.\nReturns an error if MCP is not running in a subprocess.\n.I-1\n2 Examples\n.LITERAL\n     MCP> ATTACH GOATHUNTER_1\n\n     The command above demonstrates attaching to the subprocess\n     named \"GOATHUNTER_1\".\n.END LITERAL\n"
  },
  {
    "path": "src/test/resources/samples/langs/Racket/99-bottles-of-beer.scrbl",
    "content": "; Clean, simple and efficient code -- that's the power of Racket!\n; http://racket-lang.org/\n\n(define (bottles n more)\n  (printf \"~a bottle~a of beer~a\"\n          (case n [(0) \"no more\"] [(1) \"1\"] [else n])\n          (if (= n 1) \"\" \"s\")\n          more))\n\n(for ([n (in-range 99 0 -1)])\n  (bottles n \" on the wall, \")\n  (bottles n \".\\n\")\n  (printf \"Take one down and pass it around, \")\n  (bottles (sub1 n) \" on the wall.\\n\\n\"))\n\n(displayln \"No more bottles of beer on the wall, no more bottles of beer.\")\n(displayln \"Go to the store and buy some more, 99 bottles of beer on the wall.\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Racket/scribble.scrbl",
    "content": "#lang scribble/manual\n@(require scribble/bnf \"utils.rkt\")\n\n@title{Scribble: The Racket Documentation Tool}\n\n@author[\"Matthew Flatt\" \"Eli Barzilay\"]\n\nScribble is a collection of tools for creating prose\ndocuments---papers, books, library documentation, etc.---in HTML or\nPDF (via Latex) form. More generally, Scribble helps you write\nprograms that are rich in textual content, whether the content is\nprose to be typeset or any other form of text to be generated\nprogrammatically.\n\nThis document is itself written using Scribble. You can see its source\nat\n@(let ([url \"http://git.racket-lang.org/plt/tree/HEAD:/collects/scribblings/scribble\"])\n   (link url url)),\nstarting with the @filepath{scribble.scrbl} file.\n\n@table-of-contents[]\n\n@; ------------------------------------------------------------------------\n@include-section[\"how-to-paper.scrbl\"]\n@include-section[\"reader.scrbl\"]\n@include-section[\"generic.scrbl\"]\n@include-section[\"plt.scrbl\"]\n@include-section[\"lp.scrbl\"]\n@include-section[\"text.scrbl\"]\n@include-section[\"internals.scrbl\"]\n@include-section[\"running.scrbl\"]\n\n@index-section[]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ragel/ephemeris_parser.rl",
    "content": "=begin\n%%{\n\n  machine ephemeris_parser;\n\n  action mark { mark = p }\n\n  action parse_start_time {\n    parser.start_time = data[mark..p].pack('c*')\n  }\n\n  action parse_stop_time {\n    parser.stop_time = data[mark..p].pack('c*')\n  }\n\n  action parse_step_size {\n    parser.step_size = data[mark..p].pack('c*')\n  }\n\n  action parse_ephemeris_table {\n    fhold;\n    parser.ephemeris_table = data[mark..p].pack('c*')\n  }\n\n  ws = [ \\t\\r\\n];\n\n  adbc = ('A.D.'|'B.C.');\n  year = digit{4};\n  month = upper lower{2};\n  date = digit{2};\n  hours =  digit{2};\n  minutes = digit{2};\n  seconds = digit{2} '.' digit{4};\n  tz = 'UT';\n  datetime = adbc ' ' year '-' month '-' date ' ' hours ':' minutes ':' seconds ' ' tz;\n\n  time_unit = ('minute' [s]? | 'calendar year' [s]?);\n\n  soe = '$$SOE' '\\n';\n  eoe = '$$EOE' '\\n';\n  ephemeris_table = (alnum | ws | [*-./:])*;\n\n  start_time = 'Start time' ' '* ':' ' ' datetime >mark %parse_start_time space* '\\n';\n  stop_time  = 'Stop  time' ' '* ':' ' ' datetime >mark %parse_stop_time space* '\\n';\n  step_size  = 'Step-size' ' '* ':' ' ' (digit+ ' '* time_unit) >mark $parse_step_size '\\n';\n\n  ephemeris = soe ephemeris_table >mark %parse_ephemeris_table eoe;\n\n  main := (\n    any*\n    start_time\n    stop_time\n    step_size\n    any*\n    ephemeris\n    any*\n  );\n\n}%%\n=end\n\nrequire 'date'\n\nmodule Tengai\n  EPHEMERIS_DATA = Struct.new(:start_time, :stop_time, :step_size, :ephemeris_table).freeze\n\n  class EphemerisParser < EPHEMERIS_DATA\n    def self.parse(data)\n      parser = new\n      data = data.unpack('c*') if data.is_a? String\n      eof = data.length\n\n      %% write init;\n      %% write exec;\n\n      parser\n    end\n\n    def start_time=(time)\n      super parse_time(time)\n    end\n\n    def stop_time=(time)\n      super parse_time(time)\n    end\n\n    %% write data;\n\n    # % fix syntax highlighting\n\n    private\n    def parse_time(time)\n      DateTime.parse(time)\n    end\n  end\nend"
  },
  {
    "path": "src/test/resources/samples/langs/Ragel/simple_scanner.rl",
    "content": "=begin\n%%{\n  machine simple_scanner;\n\n  action Emit {\n    emit data[(ts+8)..(te-7)].pack('c*')\n  }\n\n  foo = 'STARTFOO' any+ :>> 'ENDFOO';\n  \n  main := |*\n    foo => Emit;\n    any;\n  *|;\n}%%\n=end\n\n\n# Scans a file for \"STARTFOO[...]ENDFOO\" blocks and outputs their contents.\n#\n# ENV['CHUNK_SIZE'] determines how much of the file to read in at a time, allowing you to control memory usage.\n#\n# Uses ragel's scanner functionality even though it's not strictly necessary.\nclass SimpleScanner\n  attr_reader :path\n\n  def initialize(path)\n    @path = path\n    %% write data;\n    # % (this fixes syntax highlighting)\n  end\n\n  def emit(foo)\n    $stdout.puts foo\n  end\n  \n  def perform\n    # So that ragel doesn't try to get it from data.length\n    pe = :ignored\n    eof = :ignored\n\n    %% write init;\n    # % (this fixes syntax highlighting)\n\n    leftover = []\n    \n    File.open(path) do |f|\n      while chunk = f.read(ENV['CHUNK_SIZE'].to_i)\n        data = leftover + chunk.unpack('c*')\n        p ||= 0\n        pe = data.length\n\n        %% write exec;\n        # % (this fixes syntax highlighting)\n        if ts\n          leftover = data[ts..pe]\n          p = p - ts\n          ts = 0\n        else\n          leftover = []\n          p = 0\n        end\n      end\n    end\n  end\nend\n\ns = SimpleScanner.new ARGV[0]\ns.perform"
  },
  {
    "path": "src/test/resources/samples/langs/Ragel/simple_tokenizer.rl",
    "content": "=begin\n%%{\n  machine simple_tokenizer;\n\n  action MyTs {\n    my_ts = p\n  }\n  action MyTe {\n    my_te = p\n  }\n  action Emit {\n    emit data[my_ts...my_te].pack('c*')\n    my_ts = nil\n    my_te = nil    \n  }\n\n  foo = 'STARTFOO' any+ >MyTs :>> 'ENDFOO' >MyTe %Emit;\n  main := ( foo | any+ )*;\n\n}%%\n=end\n\n# Scans a file for \"STARTFOO[...]ENDFOO\" blocks and outputs their contents.\n#\n# ENV['CHUNK_SIZE'] determines how much of the file to read in at a time, allowing you to control memory usage.\n#\n# Does not use ragel's scanner functionality because no backtracking is needed.\nclass SimpleTokenizer\n  attr_reader :path\n\n  def initialize(path)\n    @path = path\n    %% write data;\n    # % (this fixes syntax highlighting)\n  end\n\n  def emit(foo)\n    $stdout.puts foo\n  end\n\n  def perform\n    # So that ragel doesn't try to get it from data.length\n    pe = :ignored\n    eof = :ignored\n\n    %% write init;\n    # % (this fixes syntax highlighting)\n\n    leftover = []\n    my_ts = nil\n    my_te = nil\n    \n    File.open(path) do |f|\n      while chunk = f.read(ENV['CHUNK_SIZE'].to_i)\n        data = leftover + chunk.unpack('c*')\n        p = 0\n        pe = data.length\n        %% write exec;\n        # % (this fixes syntax highlighting)\n        if my_ts\n          leftover = data[my_ts..-1]\n          my_te = my_te - my_ts if my_te\n          my_ts = 0\n        else\n          leftover = []\n        end\n      end\n    end\n  end\nend\n\ns = SimpleTokenizer.new ARGV[0]\ns.perform\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rascal/Analyze.rsc",
    "content": "module Analyze\n\nimport Syntax;\n\nset[Id] unreachable(Machine m) {\n  r = { <q1,q2> | (State)`state <Id q1> <Trans* ts>` <- m.states, \n\t\t\t\t  (Trans)`<Id _>: <Id q2>` <- ts }+;\n  qs = [ q.name | /State q := m ];\n  return { q | q <- qs, q notin r[qs[0]] };\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rascal/Compile.rsc",
    "content": "module Compile\n\nimport Syntax;\n\nstr compile(Machine m) =\n  \"while (true) {\n  '  event = input.next();\n  '  switch (current) { \n  '    <for (q <- m.states) {>\n  '    case \\\"<q.name>\\\":\n  '      <for (t <- q.out) {>\n  '      if (event.equals(\\\"<t.event>\\\"))\n  '        current = \\\"<t.to>\\\";\n  '      <}>\n  '      break;\n  '    <}>\n  '  }\n  '}\"; \n"
  },
  {
    "path": "src/test/resources/samples/langs/Rascal/Rascal.rsc",
    "content": " @license{\n  Copyright (c) 2009-2015 CWI\n  All rights reserved. This program and the accompanying materials\n  are made available under the terms of the Eclipse Public License v1.0\n  which accompanies this distribution, and is available at\n  http://www.eclipse.org/legal/epl-v10.html\n}\n@contributor{Jurgen J. Vinju - Jurgen.Vinju@cwi.nl - CWI}\n@contributor{Tijs van der Storm - Tijs.van.der.Storm@cwi.nl}\n@contributor{Paul Klint - Paul.Klint@cwi.nl - CWI}\n@contributor{Arnold Lankamp - Arnold.Lankamp@cwi.nl}\n@contributor{Michael Steindorfer - Michael.Steindorfer@cwi.nl - CWI}\n@doc{The syntax definition of Rascal, excluding concrete syntax fragments}\nmodule lang::rascal::\\syntax::Rascal\n\nlexical BooleanLiteral\n\t= \"true\" \n\t| \"false\" ;\n\nsyntax Literal\n\t= integer: IntegerLiteral integerLiteral \n\t| regExp: RegExpLiteral regExpLiteral \n\t| \\real: RealLiteral realLiteral \n\t| boolean: BooleanLiteral booleanLiteral \n\t| string: StringLiteral stringLiteral \n\t| dateTime: DateTimeLiteral dateTimeLiteral \n\t| location: LocationLiteral locationLiteral\n\t| rational: RationalLiteral rationalLiteral\n\t;\n\nsyntax Expression = concrete: Concrete concrete;\nsyntax Pattern    = concrete: Concrete concrete;\n\nlexical Concrete \n  = typed: \"(\" LAYOUTLIST l1 Sym symbol LAYOUTLIST l2 \")\" LAYOUTLIST l3 \"`\" ConcretePart* parts \"`\";\n\nlexical ConcretePart\n  = @category=\"MetaSkipped\" text   : ![`\\<\\>\\\\\\n]+ !>> ![`\\<\\>\\\\\\n]\n  | newline: \"\\n\" [\\ \\t \\u00A0 \\u1680 \\u2000-\\u200A \\u202F \\u205F \\u3000]* \"\\'\"\n  | @category=\"MetaVariable\" hole : ConcreteHole hole\n  | @category=\"MetaSkipped\" lt: \"\\\\\\<\"\n  | @category=\"MetaSkipped\" gt: \"\\\\\\>\"\n  | @category=\"MetaSkipped\" bq: \"\\\\`\"\n  | @category=\"MetaSkipped\" bs: \"\\\\\\\\\"\n  ;\n  \nsyntax ConcreteHole \n  = \\one: \"\\<\" Sym symbol Name name \"\\>\"\n  ;\n  \nstart syntax Module\n\t= \\default: Header header Body body ;\n\nsyntax ModuleParameters\n\t= \\default: \"[\" {TypeVar \",\"}+ parameters \"]\" ;\n\nlexical DateAndTime\n\t= \"$\" DatePart \"T\" TimePartNoTZ !>> [+\\-] \"$\"\n\t| \"$\" DatePart \"T\" TimePartNoTZ TimeZonePart \"$\";\n\nsyntax Strategy\n\t= topDownBreak: \"top-down-break\" \n\t| topDown: \"top-down\" \n\t| bottomUp: \"bottom-up\" \n\t| bottomUpBreak: \"bottom-up-break\" \n\t| outermost: \"outermost\" \n\t| innermost: \"innermost\" ;\n\nlexical UnicodeEscape\n\t  = utf16: \"\\\\\" [u] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] \n    | utf32: \"\\\\\" [U] ((\"0\" [0-9 A-F a-f]) | \"10\") [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] // 24 bits \n    | ascii: \"\\\\\" [a] [0-7] [0-9A-Fa-f]\n    ;\n    \nsyntax Variable\n\t= initialized: Name name \"=\" Expression initial \n\t| unInitialized: Name name ;\n\nlexical OctalIntegerLiteral\n\t= [0] [0-7]+ !>> [0-9 A-Z _ a-z] ;\n\nsyntax TypeArg\n\t= \\default: Type type \n\t| named: Type type Name name ;\n\nsyntax Renaming\n\t= \\default: Name from \"=\\>\" Name to ;\n\nsyntax Catch\n\t= \\default: \"catch\" \":\" Statement body \n\t| binding: \"catch\" Pattern pattern \":\" Statement body ;\n\nlexical PathChars\n\t= URLChars [|] ;\n\nsyntax Signature\n\t= withThrows: FunctionModifiers modifiers Type type  Name name Parameters parameters \"throws\" {Type \",\"}+ exceptions \n\t| noThrows: FunctionModifiers modifiers Type type  Name name Parameters parameters ;\n\nsyntax Sym\n// named non-terminals\n\t= nonterminal: Nonterminal nonterminal !>> \"[\"\n\t| parameter: \"&\" Nonterminal nonterminal \n\t| parametrized: Nonterminal nonterminal >> \"[\" \"[\" {Sym \",\"}+ parameters \"]\"\n\t| \\start: \"start\" \"[\" Nonterminal nonterminal \"]\"\n\t| labeled: Sym symbol NonterminalLabel label\n// literals \n\t| characterClass: Class charClass \n\t| literal: StringConstant string \n\t| caseInsensitiveLiteral: CaseInsensitiveStringConstant cistring\n// regular expressions\n\t| iter: Sym symbol \"+\" \n\t| iterStar: Sym symbol \"*\" \n\t| iterSep: \"{\" Sym symbol Sym sep \"}\" \"+\" \n\t| iterStarSep: \"{\" Sym symbol Sym sep \"}\" \"*\" \n\t| optional: Sym symbol \"?\" \n\t| alternative: \"(\" Sym first \"|\" {Sym \"|\"}+ alternatives \")\"\n\t| sequence: \"(\" Sym first Sym+ sequence \")\"\n\t// TODO: MinimalIter: Sym symbol IntegerConstant minimal \"+\"\n\t// TODO: MinimalIterSep: \"{\" Sym symbol Symbol sep \"}\" IntegerConstant minimal \"+\"\n\t// TODO | Permutation: \"(\" Sym first \"~\" {Sym \"~\"}+ participants \")\"\n\t// TODO | Combination: \"(\" Sym first \"#\" {Sym \"#\"}+ elements \")\"\n\t| empty: \"(\" \")\"\n// conditionals\n\t| column: Sym symbol \"@\" IntegerLiteral column \n\t| endOfLine: Sym symbol \"$\" \n\t| startOfLine: \"^\" Sym symbol\n\t| except:   Sym symbol \"!\" NonterminalLabel label\n\t>  \n\tassoc ( \n\t  left  ( follow:     Sym symbol  \"\\>\\>\" Sym match\n\t        | notFollow:  Sym symbol \"!\\>\\>\" Sym match\n\t        )\n\t  | \n\t  right ( precede:    Sym match \"\\<\\<\" Sym symbol \n\t        | notPrecede: Sym match \"!\\<\\<\" Sym symbol\n\t        )\n\t)\n\t> \n\tleft unequal:  Sym symbol \"\\\\\" Sym match\n\t;\n\nlexical TimePartNoTZ\n\t= [0-2] [0-9] [0-5] [0-9] [0-5] [0-9] ([, .] [0-9] ([0-9] [0-9]?)?)? \n\t| [0-2] [0-9] \":\" [0-5] [0-9] \":\" [0-5] [0-9] ([, .] [0-9] ([0-9] [0-9]?)?)? \n\t;\n\nsyntax Header\n\t= parameters: Tags tags \"module\" QualifiedName name ModuleParameters params Import* imports \n\t| \\default: Tags tags \"module\" QualifiedName name Import* imports ;\n\nlexical Name\n    // Names are surrounded by non-alphabetical characters, i.e. we want longest match.\n\t=  ([A-Z a-z _] !<< [A-Z _ a-z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z]) \\ RascalKeywords \n\t| [\\\\] [A-Z _ a-z] [\\- 0-9 A-Z _ a-z]* !>> [\\- 0-9 A-Z _ a-z] \n\t;\n\nsyntax SyntaxDefinition\n\t=  @Foldable \\layout  : Visibility vis \"layout\"  Sym defined \"=\" Prod production \";\" \n\t|  @Foldable \\lexical : \"lexical\" Sym defined \"=\" Prod production \";\" \n\t|  @Foldable \\keyword : \"keyword\" Sym defined \"=\" Prod production \";\"\n\t|  @Foldable language: Start start \"syntax\" Sym defined \"=\" Prod production \";\" ;\n\nsyntax Kind\n\t= function: \"function\" \n\t| variable: \"variable\" \n\t| \\all: \"all\" \n\t| \\anno: \"anno\" \n\t| \\data: \"data\" \n\t| view: \"view\" \n\t| \\alias: \"alias\" \n\t| \\module: \"module\" \n\t| \\tag: \"tag\" ;\n\nsyntax ImportedModule\n\t= \\default: QualifiedName name \n\t| actualsRenaming: QualifiedName name ModuleActuals actuals Renamings renamings \n\t| renamings: QualifiedName name Renamings renamings \n\t| actuals: QualifiedName name ModuleActuals actuals \n\t;\n\nsyntax Target\n\t= empty: \n\t| labeled: Name name ;\n\nsyntax IntegerLiteral\n\t= /*prefer()*/ decimalIntegerLiteral: DecimalIntegerLiteral decimal \n\t| /*prefer()*/ hexIntegerLiteral: HexIntegerLiteral hex \n\t| /*prefer()*/ octalIntegerLiteral: OctalIntegerLiteral octal ;\n\nsyntax FunctionBody\n\t= \\default: \"{\" Statement* statements \"}\" ;\n    \nsyntax Expression\n\t= nonEmptyBlock  : \"{\" Statement+ statements \"}\" \n\t| bracket \\bracket: \"(\" Expression expression \")\" \n\t| closure        : Type type Parameters parameters \"{\" Statement+ statements \"}\" \n\t| stepRange      : \"[\" Expression first \",\" Expression second \"..\" Expression last \"]\" \n\t| voidClosure    : Parameters parameters \"{\" Statement* statements0 \"}\" \n\t| \\visit          : Label label Visit visit \n\t| reducer        : \"(\" Expression init \"|\" Expression result \"|\" {Expression \",\"}+ generators \")\" \n\t| reifiedType    : \"type\" \"(\" Expression symbol \",\" Expression definitions \")\"  \n\t| callOrTree     : Expression!transitiveClosure!transitiveReflexiveClosure!isDefined expression \"(\" {Expression \",\"}* arguments KeywordArguments[Expression] keywordArguments \")\"\n\t| literal        : Literal literal \n\t| \\any            : \"any\" \"(\" {Expression \",\"}+ generators \")\" \n\t| \\all            : \"all\" \"(\" {Expression \",\"}+ generators \")\" \n\t| comprehension  : Comprehension comprehension \n\t| \\set            : \"{\" {Expression \",\"}* elements0 \"}\" \n\t| \\list           : \"[\" {Expression \",\"}* elements0 \"]\"\n\t| reifyType      : \"#\" Type type !>> \"[\" !selector\n\t| range          : \"[\" Expression first \"..\" Expression last \"]\"\n\t| \\tuple          : \"\\<\" {Expression \",\"}+ elements \"\\>\" \n\t| \\map            : \"(\" {Mapping[Expression] \",\"}* mappings \")\" \n\t| \\it             : [A-Z a-z _] !<< \"it\" !>> [A-Z a-z _]\n\t| qualifiedName  : QualifiedName qualifiedName \n\t| subscript    : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined \"[\" {Expression \",\"}+ subscripts \"]\"\n\t| slice        : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined \"[\" OptionalExpression optFirst \"..\" OptionalExpression optLast \"]\" \n    | sliceStep    : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined \"[\" OptionalExpression optFirst \",\" Expression second \"..\" OptionalExpression optLast \"]\" \n\t| fieldAccess  : Expression expression \".\" Name field \n\t| fieldUpdate  : Expression expression \"[\" Name key \"=\" Expression replacement \"]\" \n\t| fieldProject : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined \"\\<\" {Field \",\"}+ fields \"\\>\" \n\t| setAnnotation: Expression expression \"[\" \"@\" Name name \"=\" Expression value \"]\" \n    | getAnnotation: Expression expression >> \"@\" \"@\" Name name \n\t| is           : Expression expression \"is\" Name name\n\t| has          : Expression expression \"has\" Name name\n\t| transitiveClosure: Expression argument \"+\" !>> \"=\"\n    | transitiveReflexiveClosure: Expression argument \"*\" !>> \"=\" \n\t> isDefined    : Expression argument \"?\" \n\t> negation     : \"!\" Expression!match!noMatch argument \n\t| negative     : \"-\" Expression argument \n\t| non-assoc splice : \"*\" Expression argument\n\t| asType       : \"[\" Type type \"]\" Expression!match!noMatch argument\n\t> left composition: Expression lhs \"o\" Expression rhs \n\t> left ( product: Expression lhs \"*\" () !>> \"*\" Expression!noMatch!match rhs  \n\t\t   | \\join   : Expression lhs \"join\" Expression rhs \n\t       | remainder: Expression lhs \"%\" Expression rhs\n\t\t   | division: Expression lhs \"/\" Expression rhs \n\t     )\n\t> left intersection: Expression lhs \"&\" !>> \"&\" Expression rhs \n\t> left ( addition   : Expression lhs \"+\" Expression!noMatch!match rhs  \n\t\t   | subtraction: Expression!transitiveClosure!transitiveReflexiveClosure lhs \"-\" Expression rhs\n\t\t   | appendAfter: Expression lhs \"\\<\\<\" !>> \"=\" Expression rhs\n\t\t   | insertBefore: Expression lhs \"\\>\\>\" Expression rhs \n\t       )\n\t> left modulo: Expression lhs \"mod\" Expression rhs\n\t> non-assoc ( notIn: Expression lhs \"notin\" Expression rhs  \n\t\t        | \\in: Expression lhs \"in\" Expression rhs \n\t)\n\t> non-assoc ( greaterThanOrEq: Expression lhs \"\\>=\" Expression rhs  \n\t\t        | lessThanOrEq   : Expression lhs \"\\<=\" Expression rhs \n\t\t        | lessThan       : Expression lhs \"\\<\" !>> \"-\" Expression rhs \n\t\t        | greaterThan    : Expression lhs \"\\>\" Expression rhs \n\t            )\n\t> non-assoc ( equals         : Expression lhs \"==\" Expression rhs\n\t            | nonEquals      : Expression lhs \"!=\" Expression rhs \n\t            )\n\t> non-assoc ifDefinedOtherwise: Expression lhs \"?\" Expression rhs\n\t> non-assoc ( noMatch: Pattern pattern \"!:=\" Expression expression  \n\t\t        | match: Pattern pattern \":=\" Expression expression \n\t\t        | enumerator: Pattern pattern \"\\<-\" Expression expression \n\t            ) \n\t> non-assoc ( implication: Expression lhs \"==\\>\" Expression rhs  \n\t\t        | equivalence: Expression lhs \"\\<==\\>\" Expression rhs \n\t            )\n\t> left and: Expression lhs \"&&\" Expression rhs \n\t> left or: Expression lhs \"||\" Expression rhs \n\t> right ifThenElse: Expression condition \"?\" Expression thenExp \":\" Expression elseExp\n\t; \n\nsyntax OptionalExpression \n  = expression: Expression expression\n  | noExpression: ()\n  ;\n    \nsyntax UserType\n\t= name: QualifiedName name \n\t| parametric: QualifiedName name >> \"[\" \"[\" {Type \",\"}+ parameters \"]\" ;\n\nsyntax Import\n\t= \\extend: \"extend\" ImportedModule module \";\" \n\t| \\default: \"import\" ImportedModule module \";\"\n\t| \\external: \"import\" QualifiedName name \"=\" LocationLiteral at \";\"\n\t| \\syntax: SyntaxDefinition syntax ;\n\nsyntax Body\n\t= toplevels: Toplevel* toplevels ;\n\nlexical URLChars\n\t= ![\\t-\\n \\r \\  \\< |]* ;\n\nlexical TimeZonePart\n\t= [+ \\-] [0-1] [0-9] \":\" [0-5] [0-9] \n\t| \"Z\" \n\t| [+ \\-] [0-1] [0-9] \n\t| [+ \\-] [0-1] [0-9] [0-5] [0-9] \n\t;\n\nsyntax ProtocolPart\n\t= nonInterpolated: ProtocolChars protocolChars \n\t| interpolated: PreProtocolChars pre Expression expression ProtocolTail tail ;\n\nsyntax StringTemplate\n\t= ifThen    : \"if\"    \"(\" {Expression \",\"}+ conditions \")\" \"{\" Statement* preStats StringMiddle body Statement* postStats \"}\" \n\t| ifThenElse: \"if\"    \"(\" {Expression \",\"}+ conditions \")\" \"{\" Statement* preStatsThen StringMiddle thenString Statement* postStatsThen \"}\" \"else\" \"{\" Statement* preStatsElse StringMiddle elseString Statement* postStatsElse \"}\" \n\t| \\for       : \"for\"   \"(\" {Expression \",\"}+ generators \")\" \"{\" Statement* preStats StringMiddle body Statement* postStats \"}\" \n\t| doWhile   : \"do\"    \"{\" Statement* preStats StringMiddle body Statement* postStats \"}\" \"while\" \"(\" Expression condition \")\" \n\t| \\while     : \"while\" \"(\" Expression condition \")\" \"{\" Statement* preStats StringMiddle body Statement* postStats \"}\" ;\n\nlexical PreStringChars\n\t= @category=\"Constant\" [\\\"] StringCharacter* [\\<] ;\n\nlexical CaseInsensitiveStringConstant\n\t= @category=\"Constant\" \"\\'\" StringCharacter* chars \"\\'\" ;\n\nlexical Backslash\n\t= [\\\\] !>> [/ \\< \\> \\\\] ;\n\nsyntax Label\n\t= \\default: Name name \":\" \n\t| empty: ;\n\nlexical MidProtocolChars\n\t= \"\\>\" URLChars \"\\<\" ;\n\nlexical NamedBackslash\n\t= [\\\\] !>> [\\< \\> \\\\] ;\n\nsyntax Field\n\t= index: IntegerLiteral fieldIndex \n\t| name: Name fieldName ;\n\nlexical JustDate\n\t= \"$\" DatePart \"$\";\n\nlexical PostPathChars\n\t=  \"\\>\" URLChars \"|\" ;\n\nsyntax PathPart\n\t= nonInterpolated: PathChars pathChars \n\t| interpolated: PrePathChars pre Expression expression PathTail tail ;\n\nlexical DatePart\n\t= [0-9] [0-9] [0-9] [0-9] \"-\" [0-1] [0-9] \"-\" [0-3] [0-9] \n\t| [0-9] [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [0-9] ;\n\nsyntax FunctionModifier\n\t= java: \"java\" \n\t| \\test: \"test\" \n\t| \\default: \"default\";\n\nsyntax Assignment\n\t= ifDefined: \"?=\" \n\t| division: \"/=\" \n\t| product: \"*=\" \n\t| intersection: \"&=\" \n\t| subtraction: \"-=\" \n\t| \\default: \"=\" \n\t| addition: \"+=\" \n\t| \\append: \"\\<\\<=\"\n\t;\n\nsyntax Assignable\n\t= bracket \\bracket   : \"(\" Assignable arg \")\"\n\t| variable          : QualifiedName qualifiedName\n    | subscript         : Assignable receiver \"[\" Expression subscript \"]\" \n    | slice             : Assignable receiver \"[\" OptionalExpression optFirst \"..\" OptionalExpression optLast \"]\" \n    | sliceStep         : Assignable receiver \"[\" OptionalExpression optFirst \",\" Expression second \"..\" OptionalExpression optLast \"]\"     \n\t| fieldAccess       : Assignable receiver \".\" Name field \n\t| ifDefinedOrDefault: Assignable receiver \"?\" Expression defaultExpression \n\t| constructor       : Name name \"(\" {Assignable \",\"}+ arguments \")\"  \n\t| \\tuple             : \"\\<\" {Assignable \",\"}+ elements \"\\>\" \n\t| annotation        : Assignable receiver \"@\" Name annotation  ;\n\nlexical StringConstant\n\t= @category=\"Constant\" \"\\\"\" StringCharacter* chars \"\\\"\" ;\n\n\n\nsyntax Assoc\n\t= associative: \"assoc\" \n\t| left: \"left\" \n\t| nonAssociative: \"non-assoc\" \n\t| right: \"right\" ;\n\nsyntax Replacement\n\t= unconditional: Expression replacementExpression \n\t| conditional: Expression replacementExpression \"when\" {Expression \",\"}+ conditions ;\n\nsyntax DataTarget\n\t= empty: \n\t| labeled: Name label \":\" ;\n\nlexical StringCharacter\n\t= \"\\\\\" [\\\" \\' \\< \\> \\\\ b f n r t] \n\t| UnicodeEscape \n\t| ![\\\" \\' \\< \\> \\\\]\n\t| [\\n][\\ \\t \\u00A0 \\u1680 \\u2000-\\u200A \\u202F \\u205F \\u3000]* [\\'] // margin \n\t;\n\nlexical JustTime\n\t= \"$T\" TimePartNoTZ !>> [+\\-] \"$\"\n\t| \"$T\" TimePartNoTZ TimeZonePart \"$\"\n\t;\n\nlexical MidStringChars\n\t= @category=\"Constant\" [\\>] StringCharacter* [\\<] ;\n\nlexical ProtocolChars\n\t= [|] URLChars \"://\" !>> [\\t-\\n \\r \\ \\u00A0 \\u1680 \\u2000-\\u200A \\u202F \\u205F \\u3000];\n\nlexical RegExpModifier\n\t= [d i m s]* ;\n\nsyntax CommonKeywordParameters \n  = absent: ()\n  | present: \"(\" {KeywordFormal \",\"}+ keywordFormalList \")\"\n  ;\n    \nsyntax Parameters\n\t= \\default: \"(\" Formals formals KeywordFormals keywordFormals \")\" \n\t| varArgs: \"(\" Formals formals \"...\" KeywordFormals keywordFormals \")\" ;\n\nlexical OptionalComma = \\default: \",\"? ;\n\nsyntax KeywordFormals\n    = \\default: OptionalComma optionalComma [,\\ (\\t\\n] << {KeywordFormal \",\"}+ keywordFormalList\n    | none: ()\n    ;\n    \nsyntax KeywordFormal \n    = \\default: Type type Name name \"=\" Expression expression\n    ;\n    \nsyntax KeywordArguments[&T]\n    = \\default:  OptionalComma optionalComma [,\\ (\\t\\n] << {KeywordArgument[&T] \",\"}+ keywordArgumentList\n    | none: ()\n    ;\n    \nsyntax KeywordArgument[&T] = \\default: Name name \"=\" &T expression ;\n\nlexical RegExp\n\t= ![/ \\< \\> \\\\] \n\t| \"\\<\" Name \"\\>\" \n\t| [\\\\] [/ \\< \\> \\\\] \n\t| \"\\<\" Name \":\" NamedRegExp* \"\\>\" \n\t| Backslash \n\t// | @category=\"MetaVariable\" [\\<]  Expression expression [\\>] TODO: find out why this production existed \n\t;\n\t\n\nlayout LAYOUTLIST\n\t= LAYOUT* !>> [\\u0009-\\u000D \\u0020 \\u0085 \\u00A0 \\u1680 \\u180E \\u2000-\\u200A \\u2028 \\u2029 \\u202F \\u205F \\u3000] !>> \"//\" !>> \"/*\";\n\nsyntax LocalVariableDeclaration\n\t= \\default: Declarator declarator \n\t| \\dynamic: \"dynamic\" Declarator declarator ;\n\nlexical RealLiteral\n\t= [0-9]+ [D F d f] \n\t| [0-9]+ [E e] [+ \\-]? [0-9]+ [D F d f]?\n\t| [0-9]+ \".\" !>> \".\" [0-9]* [D F d f]?  \n\t| [0-9]+ \".\" [0-9]* [E e] [+ \\-]? [0-9]+ [D F d f]? \n\t| [.] !<< \".\" [0-9]+ [D F d f]? \n\t| [.] !<< \".\" [0-9]+ [E e] [+ \\-]? [0-9]+ [D F d f]? \n\t;\n\nsyntax Range\n\t= fromTo: Char start \"-\" Char end \n\t| character: Char character ;\n\nsyntax LocationLiteral\n\t= \\default: ProtocolPart protocolPart PathPart pathPart ;\n\nsyntax ShellCommand\n\t= setOption: \"set\" QualifiedName name Expression expression \n\t| undeclare: \"undeclare\" QualifiedName name \n\t| help: \"help\" \n\t| edit: \"edit\" QualifiedName name \n\t| unimport: \"unimport\" QualifiedName name \n\t| listDeclarations: \"declarations\" \n\t| quit: \"quit\" \n\t| history: \"history\" \n\t| \\test: \"test\" \n\t| listModules: \"modules\" \n\t| clear: \"clear\";\n\nsyntax StringMiddle\n\t= mid: MidStringChars mid \n\t| template: MidStringChars mid StringTemplate template StringMiddle tail \n\t| interpolated: MidStringChars mid Expression expression StringMiddle tail ;\n\nsyntax QualifiedName\n\t= \\default: {Name \"::\"}+ names !>> \"::\" ;\n\nlexical RationalLiteral\n   = [0-9][0-9]* [r]\n   | [1-9][0-9]* [r] [0-9][0-9]* !>> [0-9 A-Z _ a-z]\n   ;\n\nlexical DecimalIntegerLiteral\n\t= \"0\" !>> [0-9 A-Z _ a-z] \n\t| [1-9] [0-9]* !>> [0-9 A-Z _ a-z] ;\n\nsyntax DataTypeSelector\n\t= selector: QualifiedName sort \".\" Name production ;\n\nsyntax StringTail\n\t= midInterpolated: MidStringChars mid Expression expression StringTail tail \n\t| post: PostStringChars post \n\t| midTemplate: MidStringChars mid StringTemplate template StringTail tail ;\n\nsyntax PatternWithAction\n\t= replacing: Pattern pattern \"=\\>\" Replacement replacement \n\t| arbitrary: Pattern pattern \":\" Statement statement ;\n\nlexical LAYOUT\n\t= Comment \n\t// all the white space chars defined in Unicode 6.0 \n\t| [\\u0009-\\u000D \\u0020 \\u0085 \\u00A0 \\u1680 \\u180E \\u2000-\\u200A \\u2028 \\u2029 \\u202F \\u205F \\u3000] \n\t;\n\nsyntax Visit\n\t= givenStrategy: Strategy strategy \"visit\" \"(\" Expression subject \")\" \"{\" Case+ cases \"}\" \n\t| defaultStrategy: \"visit\" \"(\" Expression subject \")\" \"{\" Case+ cases \"}\" ;\n\nstart syntax Commands\n\t= \\commandlist: EvalCommand+ commands\n\t;\n\nstart syntax EvalCommand\n  = declaration: Declaration declaration  \n  | statement: Statement!variableDeclaration!functionDeclaration!visit statement \n  | \\import: Import imported\n  | output: Output\n  ;\n \nlexical Output   \n  = @category=\"Result\" resultOutput: \"⇨\" ![\\n\\r]* [\\n] \n  | @category=\"StdOut\" stdoutOutput: ^ \"≫\" ![\\n\\r]* [\\n]\n  | @category=\"StdErr\" stderrOutput: ^ \"⚠\" ![\\n\\r]* [\\n]\n  ;\n  \nstart syntax Command\n\t= expression: Expression!nonEmptyBlock expression \n\t| declaration: Declaration declaration \n\t| shell: \":\" ShellCommand command \n\t| statement: Statement!variableDeclaration!functionDeclaration!visit statement \n\t| \\import: Import imported ;\n\nlexical TagString\n\t= \"\\\\\" !<< \"{\" ( ![{}] | (\"\\\\\" [{}]) | TagString)* contents \"\\\\\" !<< \"}\";\n\nsyntax ProtocolTail\n\t= mid: MidProtocolChars mid Expression expression ProtocolTail tail \n\t| post: PostProtocolChars post ;\n\nlexical Nonterminal\n\t= ([A-Z] !<< [A-Z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z]) \\ RascalKeywords;\n\nsyntax PathTail\n\t= mid: MidPathChars mid Expression expression PathTail tail \n\t| post: PostPathChars post ;\n\nsyntax Visibility\n\t= \\private: \"private\" \n\t| \\default: \n\t| \\public: \"public\" ;\n\nsyntax StringLiteral\n\t= template: PreStringChars pre StringTemplate template StringTail tail \n\t| interpolated: PreStringChars pre Expression expression StringTail tail \n\t| nonInterpolated: StringConstant constant ;\n\nlexical Comment\n\t= @category=\"Comment\" \"/*\" (![*] | [*] !>> [/])* \"*/\" \n\t| @category=\"Comment\" \"//\" ![\\n]* !>> [\\ \\t\\r \\u00A0 \\u1680 \\u2000-\\u200A \\u202F \\u205F \\u3000] $ // the restriction helps with parsing speed\n\t;\n\t\n\nsyntax Renamings\n\t= \\default: \"renaming\" {Renaming \",\"}+ renamings ;\n\nsyntax Tags\n\t= \\default: Tag* tags ;\n\nsyntax Formals\n\t= \\default: {Pattern \",\"}* formals ;\n\nlexical PostProtocolChars\n\t= \"\\>\" URLChars \"://\" ;\n\nsyntax Start\n\t= absent: \n\t| present: \"start\" ;\n\nsyntax Statement\n\t= @breakable \\assert: \"assert\" Expression expression \";\" \n\t| @breakable assertWithMessage: \"assert\" Expression expression \":\" Expression message \";\" \n\t| @breakable expression: Expression!visit!nonEmptyBlock expression \";\" \n\t| @breakable \\visit: Label label Visit visit \n\t| @breakable \\while: Label label \"while\" \"(\" {Expression \",\"}+ conditions \")\" Statement!variableDeclaration!functionDeclaration body \n\t| @breakable doWhile: Label label \"do\" Statement body \"while\" \"(\" Expression condition \")\" \";\" \n\t| @breakable @breakable{generators} \\for: Label label \"for\" \"(\" {Expression \",\"}+ generators \")\" Statement body \n\t| @breakable ifThen: Label label \"if\" \"(\" {Expression \",\"}+ conditions \")\" Statement!variableDeclaration!functionDeclaration thenStatement () !>> \"else\" \n\t| @breakable ifThenElse: Label label \"if\" \"(\" {Expression \",\"}+ conditions \")\" Statement thenStatement \"else\" Statement!variableDeclaration!functionDeclaration elseStatement \n\t| @breakable \\switch: Label label \"switch\" \"(\" Expression expression \")\" \"{\" Case+ cases \"}\" \n\t| @breakable \\fail: \"fail\" Target target \";\" \n\t| @breakable \\break: \"break\" Target target \";\" \n\t| @breakable \\continue: \"continue\" Target target \";\" \n    | @breakable \\filter: \"filter\" \";\"\n\t| @breakable \\solve: \"solve\" \"(\" {QualifiedName \",\"}+ variables Bound bound \")\" Statement!variableDeclaration!functionDeclaration body \n\t| @breakable non-assoc \\try: \"try\" Statement body Catch+ handlers \n\t| @breakable tryFinally: \"try\" Statement body Catch+ handlers \"finally\" Statement!variableDeclaration!functionDeclaration finallyBody \n\t| nonEmptyBlock: Label label \"{\" Statement+ statements \"}\" \n\t| emptyStatement: \";\" \n\t| @breakable globalDirective: \"global\" Type type {QualifiedName \",\"}+ names \";\" \n\t| @breakable assignment: Assignable assignable Assignment operator Statement!functionDeclaration!variableDeclaration statement\n\t| non-assoc  ( \n\t\t          @breakable \\return    : \"return\" Statement!functionDeclaration!variableDeclaration statement  \n\t\t        | @breakable \\throw     : \"throw\" Statement!functionDeclaration!variableDeclaration statement \n\t\t        | @breakable \\insert    : \"insert\" DataTarget dataTarget Statement!functionDeclaration!variableDeclaration statement \n\t\t        | @breakable \\append    : \"append\" DataTarget dataTarget Statement!functionDeclaration!variableDeclaration statement \n\t            )\n    | @breakable functionDeclaration: FunctionDeclaration functionDeclaration \n\t| @breakable variableDeclaration: LocalVariableDeclaration declaration \";\"\n\t; \n\t\n    \nsyntax StructuredType\n\t= \\default: BasicType basicType \"[\" {TypeArg \",\"}+ arguments \"]\" ;\n\nlexical NonterminalLabel\n\t= [a-z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z] ;\n\nsyntax FunctionType\n\t= typeArguments: Type type \"(\" {TypeArg \",\"}* arguments \")\" ;\n\nsyntax Case\n\t= @Foldable patternWithAction: \"case\" PatternWithAction patternWithAction \n\t| @Foldable \\default: \"default\" \":\" Statement statement ;\n\nsyntax Declarator\n\t= \\default: Type type {Variable \",\"}+ variables ;\n\nsyntax Bound\n\t= \\default: \";\" Expression expression \n\t| empty: ;\n\nkeyword RascalKeywords\n\t= \"o\"\n\t| \"syntax\"\n\t| \"keyword\"\n\t| \"lexical\"\n\t| \"int\"\n\t| \"break\"\n\t| \"continue\"\n\t| \"rat\" \n\t| \"true\" \n\t| \"bag\" \n\t| \"num\" \n\t| \"node\" \n\t| \"finally\" \n\t| \"private\" \n\t| \"real\" \n\t| \"list\" \n\t| \"fail\" \n\t| \"filter\" \n\t| \"if\" \n\t| \"tag\" \n\t| BasicType\n\t| \"extend\" \n\t| \"append\" \n\t| \"rel\" \n\t| \"lrel\"\n\t| \"void\" \n\t| \"non-assoc\" \n\t| \"assoc\" \n\t| \"test\" \n\t| \"anno\" \n\t| \"layout\" \n\t| \"data\" \n\t| \"join\" \n\t| \"it\" \n\t| \"bracket\" \n\t| \"in\" \n\t| \"import\" \n\t| \"false\" \n\t| \"all\" \n\t| \"dynamic\" \n\t| \"solve\" \n\t| \"type\" \n\t| \"try\" \n\t| \"catch\" \n\t| \"notin\" \n\t| \"else\" \n\t| \"insert\" \n\t| \"switch\" \n\t| \"return\" \n\t| \"case\" \n\t| \"while\" \n\t| \"str\" \n\t| \"throws\" \n\t| \"visit\" \n\t| \"tuple\" \n\t| \"for\" \n\t| \"assert\" \n\t| \"loc\" \n\t| \"default\" \n\t| \"map\" \n\t| \"alias\" \n\t| \"any\" \n\t| \"module\" \n\t| \"mod\"\n\t| \"bool\" \n\t| \"public\" \n\t| \"one\" \n\t| \"throw\" \n\t| \"set\" \n\t| \"start\"\n\t| \"datetime\" \n\t| \"value\" \n\t;\n\nsyntax Type\n\t= bracket \\bracket: \"(\" Type type \")\" \n\t| user: UserType user\n\t| function: FunctionType function \n\t| structured: StructuredType structured \n\t| basic: BasicType basic \n\t| selector: DataTypeSelector selector \n\t| variable: TypeVar typeVar \n\t| symbol: Sym!nonterminal!labeled!parametrized!parameter symbol\n\t;\n\nsyntax Declaration\n\t= variable    : Tags tags Visibility visibility Type type {Variable \",\"}+ variables \";\" \n\t| annotation  : Tags tags Visibility visibility \"anno\" Type annoType Type onType \"@\" Name name \";\" \n\t| \\alias       : Tags tags Visibility visibility \"alias\" UserType user \"=\" Type base \";\" \n\t| \\tag         : Tags tags Visibility visibility \"tag\" Kind kind Name name \"on\" {Type \",\"}+ types \";\" \n\t| dataAbstract: Tags tags Visibility visibility \"data\" UserType user CommonKeywordParameters commonKeywordParameters \";\" \n\t| @Foldable \\data : Tags tags Visibility visibility \"data\" UserType user CommonKeywordParameters commonKeywordParameters\"=\" {Variant \"|\"}+ variants \";\"\n\t| function       : FunctionDeclaration functionDeclaration \n\t;\n\nsyntax Class\n\t= simpleCharclass: \"[\" Range* ranges \"]\" \n\t| complement: \"!\" Class charClass \n\t> left difference: Class lhs \"-\" Class rhs \n\t> left intersection: Class lhs \"&&\" Class rhs \n\t> left union: Class lhs \"||\" Class rhs \n\t| bracket \\bracket: \"(\" Class charclass \")\" ;\n\nlexical RegExpLiteral\n\t= \"/\" RegExp* \"/\" RegExpModifier ;\n\nsyntax FunctionModifiers\n\t= \\modifierlist: FunctionModifier* modifiers ;\n\nsyntax Comprehension\n\t= @breakable{results,generators} \\set: \"{\" {Expression \",\"}+ results \"|\" {Expression \",\"}+ generators \"}\" \n\t| @breakable{from,to,generators} \\map: \"(\" Expression from \":\" Expression to \"|\" {Expression \",\"}+ generators \")\" \n\t| @breakable{results,generators} \\list: \"[\" {Expression \",\"}+ results \"|\" {Expression \",\"}+ generators \"]\" ;\n\nsyntax Variant\n\t= nAryConstructor: Name name \"(\" {TypeArg \",\"}* arguments  KeywordFormals keywordArguments \")\" ;\n\nsyntax FunctionDeclaration\n\t= abstract: Tags tags Visibility visibility Signature signature \";\" \n\t| @Foldable @breakable{expression} expression: Tags tags Visibility visibility Signature signature \"=\" Expression expression \";\"\n\t| @Foldable @breakable{expression,conditions} conditional: Tags tags Visibility visibility Signature signature \"=\" Expression expression \"when\" {Expression \",\"}+ conditions \";\"\n\t| @Foldable \\default: Tags tags Visibility visibility Signature signature FunctionBody body ;\n\nlexical PreProtocolChars\n\t= \"|\" URLChars \"\\<\" ;\n\nlexical NamedRegExp\n\t= \"\\<\" Name \"\\>\" \n\t| [\\\\] [/ \\< \\> \\\\] \n\t| NamedBackslash \n\t| ![/ \\< \\> \\\\] ;\n\nsyntax ProdModifier\n\t= associativity: Assoc associativity \n\t| \\bracket: \"bracket\" \n\t| \\tag: Tag tag;\n\nsyntax Toplevel\n\t= givenVisibility: Declaration declaration ;\n\nlexical PostStringChars\n\t= @category=\"Constant\" [\\>] StringCharacter* [\\\"] ;\n\nlexical HexIntegerLiteral\n\t= [0] [X x] [0-9 A-F a-f]+ !>> [0-9 A-Z _ a-z] ;\n\nsyntax TypeVar\n\t= free: \"&\" Name name \n\t| bounded: \"&\" Name name \"\\<:\" Type bound ;\n\n\n\nsyntax BasicType\n\t= \\value: \"value\" \n\t| \\loc: \"loc\" \n\t| \\node: \"node\" \n\t| \\num: \"num\" \n\t| \\type: \"type\" \n\t| \\bag: \"bag\" \n\t| \\int: \"int\"\n\t| rational: \"rat\" \n\t| relation: \"rel\" \n\t| listRelation: \"lrel\"\n\t| \\real: \"real\" \n\t| \\tuple: \"tuple\" \n\t| string: \"str\" \n\t| \\bool: \"bool\" \n\t| \\void: \"void\" \n\t| dateTime: \"datetime\" \n\t| \\set: \"set\" \n\t| \\map: \"map\" \n\t| \\list: \"list\" \n\t;\n\nlexical Char\n\t= @category=\"Constant\" \"\\\\\" [\\  \\\" \\' \\- \\< \\> \\[ \\\\ \\] b f n r t] \n\t| @category=\"Constant\" ![\\  \\\" \\' \\- \\< \\> \\[ \\\\ \\]] \n\t| @category=\"Constant\" UnicodeEscape \n    ; \n    \nsyntax Prod\n\t= reference: \":\" Name referenced\n\t| labeled: ProdModifier* modifiers Name name \":\" Sym* syms \n\t| others: \"...\" \n\t| unlabeled: ProdModifier* modifiers Sym* syms\n\t| @Foldable associativityGroup: Assoc associativity \"(\" Prod group \")\" \n\t// | TODO add bracket rule for easy readability\n\t> left \\all   : Prod lhs \"|\" Prod rhs \n\t> left first : Prod lhs \"\\>\" !>> \"\\>\" Prod rhs\n\t;\n\nsyntax DateTimeLiteral\n\t= /*prefer()*/ dateLiteral: JustDate date \n\t| /*prefer()*/ timeLiteral: JustTime time \n\t| /*prefer()*/ dateAndTimeLiteral: DateAndTime dateAndTime ;\n\nlexical PrePathChars\n\t= URLChars \"\\<\" ;\n\nsyntax Mapping[&T]\n\t= \\default: &T!ifDefinedOtherwise from \":\" &T to \n\t;\n\nlexical MidPathChars\n\t= \"\\>\" URLChars \"\\<\" ;\n\n/*\n  Note that Pattern must closely follow the definitions of Expression because eventually\n  these two non-terminals will be fused just before AST generation.\n*/\nsyntax Pattern\n\t= \\set                 : \"{\" {Pattern \",\"}* elements0 \"}\" \n\t| \\list                : \"[\" {Pattern \",\"}* elements0 \"]\" \n\t| qualifiedName       : QualifiedName qualifiedName \n\t| multiVariable       : QualifiedName qualifiedName \"*\"\n\t| splice              : \"*\" Pattern argument\n\t| splicePlus          : \"+\" Pattern argument \n\t| negative            : \"-\" Pattern argument\n\t| literal             : Literal literal \n\t| \\tuple               : \"\\<\" {Pattern \",\"}+ elements \"\\>\" \n\t| typedVariable       : Type type Name name \n\t| \\map                 : \"(\" {Mapping[Pattern] \",\"}* mappings \")\" \n\t| reifiedType         : \"type\" \"(\" Pattern symbol \",\" Pattern definitions \")\" \n\t| callOrTree          : Pattern expression \"(\" {Pattern \",\"}* arguments KeywordArguments[Pattern] keywordArguments \")\" \n\t> variableBecomes     : Name name \":\" Pattern pattern\n\t| asType              : \"[\" Type type \"]\" Pattern argument \n\t| descendant          : \"/\" Pattern pattern \n\t| anti                : \"!\" Pattern pattern \n\t| typedVariableBecomes: Type type Name name \":\" Pattern pattern \n    ;\n    \nsyntax Tag\n\t= @Folded @category=\"Comment\" \\default   : \"@\" Name name TagString contents \n\t| @Folded @category=\"Comment\" empty     : \"@\" Name name \n\t| @Folded @category=\"Comment\" expression: \"@\" Name name \"=\" Expression expression !>> \"@\";\n\nsyntax ModuleActuals\n\t= \\default: \"[\" {Type \",\"}+ types \"]\" ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rascal/Syntax.rsc",
    "content": "module Syntax\n\nextend lang::std::Layout;\nextend lang::std::Id;\n\nstart syntax Machine = machine: State+ states;\nsyntax State = @Foldable state: \"state\" Id name Trans* out;\nsyntax Trans = trans: Id event \":\" Id to;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Reason/JSX.re",
    "content": "type component = {displayName: string};\n\nlet module Bar = {\n  let createElement c::c=? children => {\n    displayName: \"test\"\n  };\n};\n\nlet module Nesting = {\n  let createElement children => {\n    displayName: \"test\"\n  };\n};\n\nlet module Much = {\n  let createElement children => {\n    displayName: \"test\"\n  };\n};\n\nlet module Foo = {\n  let createElement a::a=? b::b=? children => {\n    displayName: \"test\"\n  };\n};\n\nlet module One = {\n  let createElement\n      test::test=?\n      foo::foo=?\n      children => {\n    displayName: \"test\"\n  };\n  let createElementobvioustypo\n      test::test\n      children => {\n    displayName: \"test\"\n  };\n};\n\nlet module Two = {\n  let createElement foo::foo=? children => {\n    displayName: \"test\"\n  };\n};\n\nlet module Sibling = {\n  let createElement\n      foo::foo=?\n      (children: list component) => {\n    displayName: \"test\"\n  };\n};\n\nlet module Test = {\n  let createElement yo::yo=? children => {\n    displayName: \"test\"\n  };\n};\n\nlet module So = {\n  let createElement children => {\n    displayName: \"test\"\n  };\n};\n\nlet module Foo2 = {\n  let createElement children => {\n    displayName: \"test\"\n  };\n};\n\nlet module Text = {\n  let createElement children => {\n    displayName: \"test\"\n  };\n};\n\nlet module Exp = {\n  let createElement children => {\n    displayName: \"test\"\n  };\n};\n\nlet module Pun = {\n  let createElement intended::intended=? children => {\n    displayName: \"test\"\n  };\n};\n\nlet module Namespace = {\n  let module Foo = {\n    let createElement\n        intended::intended=?\n        anotherOptional::x=100\n        children => {\n      displayName: \"test\"\n    };\n  };\n};\n\nlet module LotsOfArguments = {\n  let createElement\n      argument1::argument1=?\n      argument2::argument2=?\n      argument3::argument3=?\n      argument4::argument4=?\n      argument5::argument5=?\n      argument6::argument6=?\n      children => {\n    displayName: \"test\"\n  };\n};\n\nlet div argument1::argument1=? children => {\n  displayName: \"test\"\n};\n\nlet module List1 = {\n  let createElement children => {\n    displayName: \"test\"\n  };\n};\n\nlet module List2 = {\n  let createElement children => {\n    displayName: \"test\"\n  };\n};\n\nlet module List3 = {\n  let createElement children => {\n    displayName: \"test\"\n  };\n};\n\nlet (/><) a b => a + b;\n\nlet (><) a b => a + b;\n\nlet (/>) a b => a + b;\n\nlet (><\\/) a b => a + b;\n\nlet tag1 = 5 />< 6;\n\nlet tag2 = 5 >< 7;\n\nlet tag3 = 5 /> 7;\n\nlet tag4 = 5 ><\\/ 7;\n\nlet b = 2;\n\nlet selfClosing = <Foo />;\n\nlet selfClosing2 = <Foo a=1 b=true />;\n\nlet selfClosing3 =\n  <Foo\n    a=\"really long values that should\"\n    b=\"cause the entire thing to wrap\"\n  />;\n\nlet a = <Foo> <Bar c=(fun a => a + 2) /> </Foo>;\n\nlet a3 = <So> <Much> <Nesting /> </Much> </So>;\n\nlet a4 =\n  <Sibling>\n    <One test=true foo=b />\n    <Two foo=b />\n  </Sibling>;\n\nlet a5 = <Foo> \"testing a string here\" </Foo>;\n\nlet a6 =\n  <Foo2>\n    <Text> \"testing a string here\" </Text>\n    <Test yo=1 />\n    <Text> \"another string\" </Text>\n    <Bar />\n    <Exp> (2 + 4) </Exp>\n  </Foo2>;\n\nlet intended = true;\n\nlet punning = <Pun intended />;\n\nlet namespace = <Namespace.Foo />;\n\nlet c = <Foo />;\n\nlet d = <Foo />;\n\nlet spaceBefore =\n  <So> <Much> <Nesting /> </Much> </So>;\n\nlet spaceBefore2 = <So> <Much /> </So>;\n\nlet siblingNotSpaced =\n  <So> <Much /> <Much /> </So>;\n\nlet jsxInList = [<Foo />];\n\nlet jsxInList2 = [<Foo />];\n\nlet jsxInListA = [<Foo />];\n\nlet jsxInListB = [<Foo />];\n\nlet jsxInListC = [<Foo />];\n\nlet jsxInListD = [<Foo />];\n\nlet jsxInList3 = [<Foo />, <Foo />, <Foo />];\n\nlet jsxInList4 = [<Foo />, <Foo />, <Foo />];\n\nlet jsxInList5 = [<Foo />, <Foo />];\n\nlet jsxInList6 = [<Foo />, <Foo />];\n\nlet jsxInList7 = [<Foo />, <Foo />];\n\nlet jsxInList8 = [<Foo />, <Foo />];\n\nlet testFunc b => b;\n\nlet jsxInFnCall = testFunc <Foo />;\n\nlet lotsOfArguments =\n  <LotsOfArguments\n    argument1=1\n    argument2=2\n    argument3=3\n    argument4=4\n    argument5=5\n    argument6=\"test\">\n    <Namespace.Foo />\n  </LotsOfArguments>;\n\nlet lowerCase = <div argument1=1 />;\n\nlet b = 0;\n\nlet d = 0;\n\n/*\n * Should pun the first example:\n */\nlet a = <Foo a> 5 </Foo>;\n\nlet a = <Foo a=b> 5 </Foo>;\n\nlet a = <Foo a=b b=d> 5 </Foo>;\n\nlet a = <Foo a> 0.55 </Foo>;\n\nlet a = Foo.createElement \"\" [@JSX];\n\nlet ident = <Foo> a </Foo>;\n\nlet fragment1 = <> <Foo /> <Foo /> </>;\n\nlet fragment2 = <> <Foo /> <Foo /> </>;\n\nlet fragment3 = <> <Foo /> <Foo /> </>;\n\nlet fragment4 = <> <Foo /> <Foo /> </>;\n\nlet fragment5 = <> <Foo /> <Foo /> </>;\n\nlet fragment6 = <> <Foo /> <Foo /> </>;\n\nlet fragment7 = <> <Foo /> <Foo /> </>;\n\nlet fragment8 = <> <Foo /> <Foo /> </>;\n\nlet fragment9 = <> 2 2 2 2 </>;\n\nlet fragment10 = <> 2.2 3.2 4.6 1.2 </>;\n\nlet fragment11 = <> \"str\" </>;\n\nlet fragment12 = <> (6 + 2) (6 + 2) (6 + 2) </>;\n\nlet fragment13 = <> fragment11 fragment11 </>;\n\nlet listOfItems1 = <List1> 1 2 3 4 5 </List1>;\n\nlet listOfItems2 =\n  <List2> 1.0 2.8 3.8 4.0 5.1 </List2>;\n\nlet listOfItems3 =\n  <List3> fragment11 fragment11 </List3>;\n\n/*\n * Several sequential simple jsx expressions must be separated with a space.\n */\nlet thisIsRight a b => ();\n\nlet tagOne children => ();\n\nlet tagTwo children => ();\n\n/* thisIsWrong <tagOne /><tagTwo />; */\nthisIsRight <tagOne /> <tagTwo />;\n\n/* thisIsWrong <tagOne> </tagOne><tagTwo> </tagTwo>; */\nthisIsRight <tagOne /> <tagTwo />;\n\nlet a children => ();\n\nlet b children => ();\n\nlet thisIsOkay =\n  <List1> <a /> <b /> <a /> <b /> </List1>;\n\nlet thisIsAlsoOkay =\n  <List1> <a /> <b /> </List1>;\n\n/* Doesn't make any sense, but suppose you defined an\n   infix operator to compare jsx */\n<a /> < <b />;\n\n<a /> > <b />;\n\n<a /> < <b />;\n\n<a /> > <b />;\n\nlet listOfListOfJsx = [<> </>];\n\nlet listOfListOfJsx = [<> <Foo /> </>];\n\nlet listOfListOfJsx = [\n  <> <Foo /> </>,\n  <> <Bar /> </>\n];\n\nlet listOfListOfJsx = [\n  <> <Foo /> </>,\n  <> <Bar /> </>,\n  ...listOfListOfJsx\n];\n\nlet sameButWithSpaces = [<> </>];\n\nlet sameButWithSpaces = [<> <Foo /> </>];\n\nlet sameButWithSpaces = [\n  <> <Foo /> </>,\n  <> <Bar /> </>\n];\n\nlet sameButWithSpaces = [\n  <> <Foo /> </>,\n  <> <Bar /> </>,\n  ...sameButWithSpaces\n];\n\n/*\n * Test named tag right next to an open bracket.\n */\nlet listOfJsx = [];\n\nlet listOfJsx = [<Foo />];\n\nlet listOfJsx = [<Foo />, <Bar />];\n\nlet listOfJsx = [<Foo />, <Bar />, ...listOfJsx];\n\nlet sameButWithSpaces = [];\n\nlet sameButWithSpaces = [<Foo />];\n\nlet sameButWithSpaces = [<Foo />, <Bar />];\n\nlet sameButWithSpaces = [\n  <Foo />,\n  <Bar />,\n  ...sameButWithSpaces\n];\n\n\n/**\n * Test no conflict with polymorphic variant types.\n */\ntype thisType = [ | `Foo | `Bar];\n\ntype t 'a = [< thisType] as 'a;\n\nlet asd =\n  <One test=true foo=2> \"a\" \"b\" </One> [@foo];\n\nlet asd2 =\n  One.createElementobvioustypo\n  test::false\n  [\"a\", \"b\"]\n  [@JSX]\n  [@foo];\n\nlet span\n    test::(test: bool)\n    foo::(foo: int)\n    children => 1;\n\nlet asd =\n  <span test=true foo=2> \"a\" \"b\" </span> [@foo];\n\n/* \"video\" call doesn't end with a list, so the expression isn't converted to JSX */\nlet video test::(test: bool) children => children;\n\nlet asd2 = video test::false 10 [@JSX] [@foo];\n\nlet div children => 1;\n\n((fun () => div) ()) [] [@JSX];\n\nlet myFun () =>\n  <>\n    <Namespace.Foo\n      intended=true\n      anotherOptional=200\n    />\n    <Namespace.Foo\n      intended=true\n      anotherOptional=200\n    />\n    <Namespace.Foo\n      intended=true anotherOptional=200>\n      <Foo />\n      <Foo />\n      <Foo />\n      <Foo />\n      <Foo />\n      <Foo />\n      <Foo />\n    </Namespace.Foo>\n  </>;\n\nlet myFun () => <> </>;\n\nlet myFun () =>\n  <>\n    <Namespace.Foo\n      intended=true\n      anotherOptional=200\n    />\n    <Namespace.Foo\n      intended=true\n      anotherOptional=200\n    />\n    <Namespace.Foo\n      intended=true anotherOptional=200>\n      <Foo />\n      <Foo />\n      <Foo />\n      <Foo />\n      <Foo />\n      <Foo />\n      <Foo />\n    </Namespace.Foo>\n  </>;\n\n\n/**\n * Children should wrap without forcing attributes to.\n */\n<Foo a=10 b=0>\n  <Bar />\n  <Bar />\n  <Bar />\n  <Bar />\n</Foo>;\n/**\n * Failing test cases:\n */\n/* let res = <Foo a=10 b=(<Foo a=200 />) > */\n/*   <Bar /> */\n/* </Foo>; */\n/* let res = <Foo a=10 b=(<Foo a=200 />) />; */\n"
  },
  {
    "path": "src/test/resources/samples/langs/Reason/Layout.re",
    "content": "/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n/*\n * From css-layout comments:\n * The spec describes four different layout modes: \"fill available\", \"max\n * content\", \"min content\", and \"fit content\". Of these, we don't use\n * \"min content\" because we don't support default minimum main sizes (see\n * above for details). Each of our measure modes maps to a layout mode\n * from the spec (https://www.w3.org/TR/css3-sizing/#terms):\n *\n *   -.CssMeasureModeUndefined: `max-content`\n *   -.CssMeasureModeExactly: `fill-available`\n *   -.CssMeasureModeAtMost: `fit-content`\n *      If infinite space available in that axis, then `max-content.`\n *      Else, `min(max-content size, max(min-content size, fill-available size))`\n *      (Although, we don't support min-content)\n */\nopen LayoutTypes;\n\nopen LayoutValue;\n\nopen LayoutSupport;\n\nlet gCurrentGenerationCount = ref 0;\n\nlet gDepth = ref 0;\n\nlet gPrintTree = {contents: false};\n\nlet gPrintChanges = {contents: false};\n\nlet gPrintSkips = {contents: false};\n\nlet measureString = \"measure\";\n\nlet stretchString = \"stretch\";\n\nlet absMeasureString = \"abs-measure\";\n\nlet absLayoutString = \"abs-layout\";\n\nlet initialString = \"initial\";\n\nlet flexString = \"flex\";\n\nlet spacer = \"                                                            \";\n\nlet getSpacer level => {\n  let spacerLen = String.length spacer;\n  let lvl = level > spacerLen ? level : spacerLen;\n  String.sub spacer lvl (String.length spacer)\n};\n\nlet getModeName (mode, isLayoutInsteadOfMeasure) =>\n  switch mode {\n  | CSS_MEASURE_MODE_NEGATIVE_ONE_WHATEVER_THAT_MEANS =>\n    isLayoutInsteadOfMeasure ?\n      \"CSS_MEASURE_MODE_NEGATIVE_ONE_WHATEVER_THAT_MEANS\" :\n      \"CSS_MEASURE_MODE_NEGATIVE_ONE_WHATEVER_THAT_MEANS\"\n  | CssMeasureModeUndefined => isLayoutInsteadOfMeasure ? \"LAY_UNDEFINED\" : \"UNDEFINED\"\n  | CssMeasureModeExactly => isLayoutInsteadOfMeasure ? \"LAY_EXACTLY\" : \"EXACTLY\"\n  | CssMeasureModeAtMost => isLayoutInsteadOfMeasure ? \"LAY_AT_MOST\" : \"AT_MOST\"\n  };\n\nlet canUseCachedMeasurement\n    (\n      availableWidth,\n      availableHeight,\n      marginRow,\n      marginColumn,\n      widthMeasureMode,\n      heightMeasureMode,\n      cachedLayout\n    ) =>\n  if (\n    cachedLayout.availableWidth == availableWidth &&\n    cachedLayout.availableHeight == availableHeight &&\n    cachedLayout.widthMeasureMode == widthMeasureMode && cachedLayout.heightMeasureMode == heightMeasureMode\n  ) {\n    true\n  } else if\n    /* Is it an exact match?*/\n    /* If the width is an exact match, try a fuzzy match on the height.*/\n    (\n      cachedLayout.widthMeasureMode == widthMeasureMode &&\n      cachedLayout.availableWidth == availableWidth &&\n      heightMeasureMode === CssMeasureModeExactly &&\n      availableHeight -. marginColumn == cachedLayout.computedHeight\n    ) {\n    true\n  } else if\n    /* If the height is an exact match, try a fuzzy match on the width.*/\n    (\n      cachedLayout.heightMeasureMode == heightMeasureMode &&\n      cachedLayout.availableHeight == availableHeight &&\n      widthMeasureMode === CssMeasureModeExactly && availableWidth -. marginRow == cachedLayout.computedWidth\n    ) {\n    true\n  } else {\n    false\n  };\n\nlet cachedMeasurementAt layout i =>\n  switch i {\n  | 0 => layout.cachedMeasurement1\n  | 1 => layout.cachedMeasurement2\n  | 2 => layout.cachedMeasurement3\n  | 3 => layout.cachedMeasurement4\n  | 4 => layout.cachedMeasurement5\n  | 5 => layout.cachedMeasurement6\n  | _ => raise (Invalid_argument (\"No cached measurement at \" ^ string_of_int i))\n  };\n\n\n/**\n * This is a wrapper around the layoutNodeImpl function. It determines\n * whether the layout request is redundant and can be skipped.\n *\n * Parameters:\n *  Input parameters are the same as layoutNodeImpl (see above)\n *  Return parameter is true if layout was performed, false if skipped\n */\nlet rec layoutNodeInternal\n        node\n        availableWidth\n        availableHeight\n        parentDirection\n        widthMeasureMode\n        heightMeasureMode\n        performLayout\n        reason => {\n  let layout = node.layout;\n  gDepth.contents = gDepth.contents + 1;\n  let needToVisitNode =\n    node.isDirty node.context && layout.generationCount != gCurrentGenerationCount.contents ||\n    layout.lastParentDirection != parentDirection;\n  if needToVisitNode {\n    /* Invalidate the cached results.*/\n    layout.nextCachedMeasurementsIndex = 0;\n    layout.cachedLayout.widthMeasureMode = CSS_MEASURE_MODE_NEGATIVE_ONE_WHATEVER_THAT_MEANS;\n    layout.cachedLayout.heightMeasureMode = CSS_MEASURE_MODE_NEGATIVE_ONE_WHATEVER_THAT_MEANS\n  };\n  let cachedResults = ref None;\n  /* Determine whether the results are already cached. We maintain a separate*/\n  /* cache for layouts and measurements. A layout operation modifies the positions*/\n  /* and dimensions for nodes in the subtree. The algorithm assumes that each node*/\n  /* gets layed out a maximum of one time per tree layout, but multiple measurements*/\n  /* may be required to resolve all of the flex dimensions.*/\n  /* We handle nodes with measure functions specially here because they are the most\n   * expensive to measure, so it's worth avoiding redundant measurements if at all possible.*/\n  if (node.measure !== dummyMeasure && node.childrenCount === 0) {\n    let marginAxisRow = getMarginAxis node CssFlexDirectionRow;\n    let marginAxisColumn = getMarginAxis node CssFlexDirectionColumn;\n    /* First, try to use the layout cache.*/\n    if (\n      canUseCachedMeasurement (\n        availableWidth,\n        availableHeight,\n        marginAxisRow,\n        marginAxisColumn,\n        widthMeasureMode,\n        heightMeasureMode,\n        layout.cachedLayout\n      )\n    ) {\n      cachedResults.contents = Some layout.cachedLayout\n    } else {\n      /* Try to use the measurement cache.*/\n      let foundCached = {contents: false};\n      for i in 0 to (layout.nextCachedMeasurementsIndex - 1) {\n        /* This is basically the \"break\" */\n        if (not foundCached.contents) {\n          let cachedMeasurementAtIndex = cachedMeasurementAt layout i;\n          if (\n            canUseCachedMeasurement (\n              availableWidth,\n              availableHeight,\n              marginAxisRow,\n              marginAxisColumn,\n              widthMeasureMode,\n              heightMeasureMode,\n              cachedMeasurementAtIndex\n            )\n          ) {\n            cachedResults.contents = Some cachedMeasurementAtIndex;\n            foundCached.contents = true\n          }\n        }\n      }\n    }\n  } else if performLayout {\n    if (\n      layout.cachedLayout.availableWidth == availableWidth &&\n      layout.cachedLayout.availableHeight == availableHeight &&\n      layout.cachedLayout.widthMeasureMode == widthMeasureMode &&\n      layout.cachedLayout.heightMeasureMode == heightMeasureMode\n    ) {\n      cachedResults.contents = Some layout.cachedLayout\n    }\n  } else {\n    let foundCached = {contents: false};\n    for i in 0 to (layout.nextCachedMeasurementsIndex - 1) {\n      /* This is basically the \"break\" */\n      if (not foundCached.contents) {\n        let cachedMeasurementAtIndex = cachedMeasurementAt layout i;\n        if (\n          cachedMeasurementAtIndex.availableWidth == availableWidth &&\n          cachedMeasurementAtIndex.availableHeight == availableHeight &&\n          cachedMeasurementAtIndex.widthMeasureMode == widthMeasureMode &&\n          cachedMeasurementAtIndex.heightMeasureMode == heightMeasureMode\n        ) {\n          cachedResults.contents = Some cachedMeasurementAtIndex;\n          foundCached.contents = true\n        }\n      }\n    }\n  };\n  if (not needToVisitNode && cachedResults.contents != None) {\n    let cachedResults_ =\n      switch cachedResults.contents {\n      | None => raise (Invalid_argument \"Not possible\")\n      | Some cr => cr\n      };\n    layout.measuredWidth = cachedResults_.computedWidth;\n    layout.measuredHeight = cachedResults_.computedHeight;\n    if (gPrintChanges.contents && gPrintSkips.contents) {\n      Printf.printf \"%s%d.{[skipped] \" (getSpacer gDepth.contents) gDepth.contents;\n      switch node.print {\n      | None => ()\n      | Some printer => printer node.context\n      };\n      Printf.printf\n        \"wm: %s, hm: %s, aw: %s ah: %s => d: (%s, %s) %s\\n\"\n        (getModeName (widthMeasureMode, performLayout))\n        (getModeName (heightMeasureMode, performLayout))\n        (scalarToString availableWidth)\n        (scalarToString availableHeight)\n        (scalarToString cachedResults_.computedWidth)\n        (scalarToString cachedResults_.computedHeight)\n        reason\n    }\n  } else {\n    if gPrintChanges.contents {\n      Printf.printf \"%s%d.{%s\" (getSpacer gDepth.contents) gDepth.contents (needToVisitNode ? \"*\" : \"\");\n      switch node.print {\n      | None => ()\n      | Some printer => printer node.context\n      };\n      Printf.printf\n        \"wm: %s, hm: %s, aw: %s ah: %s %s\\n\"\n        (getModeName (widthMeasureMode, performLayout))\n        (getModeName (heightMeasureMode, performLayout))\n        (scalarToString availableWidth)\n        (scalarToString availableHeight)\n        reason\n    };\n    layoutNodeImpl (\n      node,\n      availableWidth,\n      availableHeight,\n      parentDirection,\n      widthMeasureMode,\n      heightMeasureMode,\n      performLayout\n    );\n    if gPrintChanges.contents {\n      Printf.printf \"%s%d.}%s\" (getSpacer gDepth.contents) gDepth.contents (needToVisitNode ? \"*\" : \"\");\n      switch node.print {\n      | None => ()\n      | Some printer => printer node.context\n      };\n      Printf.printf\n        \"wm: %s, hm: %s, d: (%s, %s) %s\\n\"\n        (getModeName (widthMeasureMode, performLayout))\n        (getModeName (heightMeasureMode, performLayout))\n        (scalarToString layout.measuredWidth)\n        (scalarToString layout.measuredHeight)\n        reason\n    };\n    layout.lastParentDirection = parentDirection;\n    if (cachedResults.contents === None) {\n      if (layout.nextCachedMeasurementsIndex == css_max_cached_result_count) {\n        if gPrintChanges.contents {\n          Printf.printf \"Out of cache entries!\\n\"\n        };\n        layout.nextCachedMeasurementsIndex = 0\n      };\n      let newCacheEntry =\n        performLayout ?\n          /* Use the single layout cache entry.*/\n          layout.cachedLayout :\n          {\n            /* Allocate a new measurement cache entry.*/\n            let newCacheEntry_ = cachedMeasurementAt layout layout.nextCachedMeasurementsIndex;\n            layout.nextCachedMeasurementsIndex = layout.nextCachedMeasurementsIndex + 1;\n            newCacheEntry_\n          };\n      newCacheEntry.availableWidth = availableWidth;\n      newCacheEntry.availableHeight = availableHeight;\n      newCacheEntry.widthMeasureMode = widthMeasureMode;\n      newCacheEntry.heightMeasureMode = heightMeasureMode;\n      newCacheEntry.computedWidth = layout.measuredWidth;\n      newCacheEntry.computedHeight = layout.measuredHeight\n    }\n  };\n  if performLayout {\n    node.layout.width = node.layout.measuredWidth;\n    node.layout.height = node.layout.measuredHeight;\n    layout.hasNewLayout = true\n  };\n  gDepth.contents = gDepth.contents - 1;\n  layout.generationCount = gCurrentGenerationCount.contents;\n  needToVisitNode || cachedResults.contents === None\n}\nand computeChildFlexBasis node child width widthMode height heightMode direction => {\n  let mainAxis = resolveAxis node.style.flexDirection direction;\n  let isMainAxisRow = isRowDirection mainAxis;\n  let childWidth = {contents: zero};\n  let childHeight = {contents: zero};\n  let childWidthMeasureMode = {contents: CssMeasureModeUndefined};\n  let childHeightMeasureMode = {contents: CssMeasureModeUndefined};\n  if (isMainAxisRow && isStyleDimDefined child.contents CssFlexDirectionRow) {\n    child.contents.layout.computedFlexBasis =\n      fmaxf child.contents.style.width (getPaddingAndBorderAxis child.contents CssFlexDirectionRow)\n  } else if (\n    not isMainAxisRow && isStyleDimDefined child.contents CssFlexDirectionColumn\n  ) {\n    child.contents.layout.computedFlexBasis =\n      fmaxf child.contents.style.height (getPaddingAndBorderAxis child.contents CssFlexDirectionColumn)\n  } else if (\n    not (isUndefined child.contents.style.flexBasis)\n  ) {\n    if (isUndefined child.contents.layout.computedFlexBasis) {\n      child.contents.layout.computedFlexBasis =\n        fmaxf child.contents.style.flexBasis (getPaddingAndBorderAxis child.contents mainAxis)\n    }\n  } else {\n    childWidth.contents = cssUndefined;\n    childHeight.contents = cssUndefined;\n    childWidthMeasureMode.contents = CssMeasureModeUndefined;\n    childHeightMeasureMode.contents = CssMeasureModeUndefined;\n    if (isStyleDimDefined child.contents CssFlexDirectionRow) {\n      childWidth.contents = child.contents.style.width +. getMarginAxis child.contents CssFlexDirectionRow;\n      childWidthMeasureMode.contents = CssMeasureModeExactly\n    };\n\n    /**\n     * Why can't this just be inlined to .height !== cssUndefined.\n     */\n    if (isStyleDimDefined child.contents CssFlexDirectionColumn) {\n      childHeight.contents =\n        child.contents.style.height +. getMarginAxis child.contents CssFlexDirectionColumn;\n      childHeightMeasureMode.contents = CssMeasureModeExactly\n    };\n    if (not isMainAxisRow && node.style.overflow === Scroll || node.style.overflow !== Scroll) {\n      if (isUndefined childWidth.contents && not (isUndefined width)) {\n        childWidth.contents = width;\n        childWidthMeasureMode.contents = CssMeasureModeAtMost\n      }\n    };\n    if (isMainAxisRow && node.style.overflow === Scroll || node.style.overflow !== Scroll) {\n      if (isUndefined childHeight.contents && not (isUndefined height)) {\n        childHeight.contents = height;\n        childHeightMeasureMode.contents = CssMeasureModeAtMost\n      }\n    };\n    /*\n     * If child has no defined size in the cross axis and is set to\n     * stretch, set the cross axis to be measured exactly with the\n     * available inner width.\n     */\n    if (\n      not isMainAxisRow &&\n      not (isUndefined width) &&\n      not (isStyleDimDefined child.contents CssFlexDirectionRow) &&\n      widthMode === CssMeasureModeExactly && getAlignItem node child.contents === CssAlignStretch\n    ) {\n      childWidth.contents = width;\n      childWidthMeasureMode.contents = CssMeasureModeExactly\n    };\n    if (\n      isMainAxisRow &&\n      not (isUndefined height) &&\n      not (isStyleDimDefined child.contents CssFlexDirectionColumn) &&\n      heightMode === CssMeasureModeExactly && getAlignItem node child.contents === CssAlignStretch\n    ) {\n      childHeight.contents = height;\n      childHeightMeasureMode.contents = CssMeasureModeExactly\n    };\n    let _ =\n      layoutNodeInternal\n        child.contents\n        childWidth.contents\n        childHeight.contents\n        direction\n        childWidthMeasureMode.contents\n        childHeightMeasureMode.contents\n        false\n        measureString;\n    child.contents.layout.computedFlexBasis =\n      fmaxf\n        (isMainAxisRow ? child.contents.layout.measuredWidth : child.contents.layout.measuredHeight)\n        (getPaddingAndBorderAxis child.contents mainAxis)\n  }\n}\n/**\n * By default, mathematical operations are floating point.\n */\nand layoutNodeImpl\n    (\n      node,\n      availableWidth,\n      availableHeight,\n      parentDirection,\n      widthMeasureMode,\n      heightMeasureMode,\n      performLayout\n    ) => {\n\n  /** START_GENERATED **/\n  /* re_assert */\n  /*   (isUndefined availableWidth ? widthMeasureMode === CssMeasureModeUndefined : true) */\n  /*   \"availableWidth is indefinite so widthMeasureMode must be CssMeasureModeUndefined\"; */\n  /* re_assert */\n  /*   (isUndefined availableHeight ? heightMeasureMode === CssMeasureModeUndefined : true) */\n  /*   \"availableHeight is indefinite so heightMeasureMode must be CssMeasureModeUndefined\"; */\n  let paddingAndBorderAxisRow = getPaddingAndBorderAxis node CssFlexDirectionRow;\n  let paddingAndBorderAxisColumn = getPaddingAndBorderAxis node CssFlexDirectionColumn;\n  let marginAxisRow = getMarginAxis node CssFlexDirectionRow;\n  let marginAxisColumn = getMarginAxis node CssFlexDirectionColumn;\n  let direction = resolveDirection node parentDirection;\n  node.layout.direction = direction;\n  /* For content (text) nodes, determine the dimensions based on the text\n     contents. */\n  if (node.measure !== dummyMeasure && node.childrenCount === 0) {\n    let innerWidth = availableWidth -. marginAxisRow -. paddingAndBorderAxisRow;\n    let innerHeight = availableHeight -. marginAxisColumn -. paddingAndBorderAxisColumn;\n    if (widthMeasureMode === CssMeasureModeExactly && heightMeasureMode === CssMeasureModeExactly) {\n      node.layout.measuredWidth = boundAxis node CssFlexDirectionRow (availableWidth -. marginAxisRow);\n      node.layout.measuredHeight =\n        boundAxis node CssFlexDirectionColumn (availableHeight -. marginAxisColumn)\n    } else if (\n      not (isUndefined innerWidth) && innerWidth <= zero ||\n      not (isUndefined innerHeight) && innerHeight <= zero\n    ) {\n      node.layout.measuredWidth = boundAxis node CssFlexDirectionRow zero;\n      node.layout.measuredHeight = boundAxis node CssFlexDirectionColumn zero\n    } else {\n      let measureDim = node.measure node innerWidth widthMeasureMode innerHeight heightMeasureMode;\n      node.layout.measuredWidth =\n        boundAxis\n          node\n          CssFlexDirectionRow\n          (\n            widthMeasureMode === CssMeasureModeUndefined || widthMeasureMode === CssMeasureModeAtMost ?\n              measureDim.width +. paddingAndBorderAxisRow : availableWidth -. marginAxisRow\n          );\n      node.layout.measuredHeight =\n        boundAxis\n          node\n          CssFlexDirectionColumn\n          (\n            heightMeasureMode === CssMeasureModeUndefined || heightMeasureMode === CssMeasureModeAtMost ?\n              measureDim.height +. paddingAndBorderAxisColumn : availableHeight -. marginAxisColumn\n          )\n    }\n  } else {\n    let childCount = Array.length node.children;\n    if (childCount === 0) {\n      node.layout.measuredWidth =\n        boundAxis\n          node\n          CssFlexDirectionRow\n          (\n            widthMeasureMode === CssMeasureModeUndefined || widthMeasureMode === CssMeasureModeAtMost ?\n              paddingAndBorderAxisRow : availableWidth -. marginAxisRow\n          );\n      node.layout.measuredHeight =\n        boundAxis\n          node\n          CssFlexDirectionColumn\n          (\n            heightMeasureMode === CssMeasureModeUndefined || heightMeasureMode === CssMeasureModeAtMost ?\n              paddingAndBorderAxisColumn : availableHeight -. marginAxisColumn\n          )\n    } else {\n      let shouldContinue = {contents: true};\n      if (not performLayout) {\n        if (\n          (\n            (\n              widthMeasureMode === CssMeasureModeAtMost &&\n              not (isUndefined availableWidth) && availableWidth <= zero\n            ) &&\n            heightMeasureMode === CssMeasureModeAtMost\n          ) &&\n          not (isUndefined availableHeight) && availableHeight <= zero\n        ) {\n          node.layout.measuredWidth = boundAxis node CssFlexDirectionRow zero;\n          node.layout.measuredHeight = boundAxis node CssFlexDirectionColumn zero;\n          shouldContinue.contents = false\n        } else if (\n          widthMeasureMode === CssMeasureModeAtMost &&\n          not (isUndefined availableWidth) && availableWidth <= zero\n        ) {\n          node.layout.measuredWidth = boundAxis node CssFlexDirectionRow zero;\n          node.layout.measuredHeight =\n            boundAxis\n              node\n              CssFlexDirectionColumn\n              (isUndefined availableHeight ? zero : availableHeight -. marginAxisColumn);\n          shouldContinue.contents = false\n        } else if (\n          heightMeasureMode === CssMeasureModeAtMost &&\n          not (isUndefined availableHeight) && availableHeight <= zero\n        ) {\n          node.layout.measuredWidth =\n            boundAxis\n              node CssFlexDirectionRow (isUndefined availableWidth ? zero : availableWidth -. marginAxisRow);\n          node.layout.measuredHeight = boundAxis node CssFlexDirectionColumn zero;\n          shouldContinue.contents = false\n        } else if (\n          widthMeasureMode === CssMeasureModeExactly && heightMeasureMode === CssMeasureModeExactly\n        ) {\n          node.layout.measuredWidth = boundAxis node CssFlexDirectionRow (availableWidth -. marginAxisRow);\n          node.layout.measuredHeight =\n            boundAxis node CssFlexDirectionColumn (availableHeight -. marginAxisColumn);\n          shouldContinue.contents = false\n        }\n      };\n      if shouldContinue.contents {\n        let mainAxis = resolveAxis node.style.flexDirection direction;\n        let crossAxis = getCrossFlexDirection mainAxis direction;\n        let isMainAxisRow = isRowDirection mainAxis;\n        let justifyContent = node.style.justifyContent;\n        let isNodeFlexWrap = node.style.flexWrap === CssWrap;\n        let firstAbsoluteChild = {contents: theNullNode};\n        let currentAbsoluteChild = {contents: theNullNode};\n        let leadingPaddingAndBorderMain = getLeadingPaddingAndBorder node mainAxis;\n        let trailingPaddingAndBorderMain = getTrailingPaddingAndBorder node mainAxis;\n        let leadingPaddingAndBorderCross = getLeadingPaddingAndBorder node crossAxis;\n        let paddingAndBorderAxisMain = getPaddingAndBorderAxis node mainAxis;\n        let paddingAndBorderAxisCross = getPaddingAndBorderAxis node crossAxis;\n        let measureModeMainDim = isMainAxisRow ? widthMeasureMode : heightMeasureMode;\n        let measureModeCrossDim = isMainAxisRow ? heightMeasureMode : widthMeasureMode;\n        let availableInnerWidth = availableWidth -. marginAxisRow -. paddingAndBorderAxisRow;\n        let availableInnerHeight = availableHeight -. marginAxisColumn -. paddingAndBorderAxisColumn;\n        let availableInnerMainDim = isMainAxisRow ? availableInnerWidth : availableInnerHeight;\n        let availableInnerCrossDim = isMainAxisRow ? availableInnerHeight : availableInnerWidth;\n        let child = {contents: theNullNode};\n        /* let i = 0; */\n        /* STEP 3: DETERMINE FLEX BASIS FOR EACH ITEM */\n        for i in 0 to (childCount - 1) {\n          child.contents = node.children.(i);\n          if performLayout {\n            let childDirection = resolveDirection child.contents direction;\n            setPosition child.contents childDirection\n          };\n          if (child.contents.style.positionType === CssPositionAbsolute) {\n            if (firstAbsoluteChild.contents === theNullNode) {\n              firstAbsoluteChild.contents = child.contents\n            };\n            if (currentAbsoluteChild.contents !== theNullNode) {\n              currentAbsoluteChild.contents.nextChild = child.contents\n            };\n            currentAbsoluteChild.contents = child.contents;\n            child.contents.nextChild = theNullNode\n          } else {\n            computeChildFlexBasis\n              node\n              child\n              availableInnerWidth\n              widthMeasureMode\n              availableInnerHeight\n              heightMeasureMode\n              direction\n          }\n        };\n        /* STEP 4: COLLECT FLEX ITEMS INTO FLEX LINES */\n        let startOfLineIndex = {contents: 0};\n        let endOfLineIndex = {contents: 0};\n        let lineCount = {contents: 0};\n        let totalLineCrossDim = {contents: zero};\n        let maxLineMainDim = {contents: zero};\n        while (endOfLineIndex.contents < childCount) {\n          let itemsOnLine = {contents: 0};\n          let sizeConsumedOnCurrentLine = {contents: zero};\n          let totalFlexGrowFactors = {contents: zero};\n          let totalFlexShrinkScaledFactors = {contents: zero};\n          let curIndex = {contents: startOfLineIndex.contents};\n          let firstRelativeChild = {contents: theNullNode};\n          let currentRelativeChild = {contents: theNullNode};\n          let shouldContinue = {contents: true};\n          while (curIndex.contents < childCount && shouldContinue.contents) {\n            child.contents = node.children.(curIndex.contents);\n            child.contents.lineIndex = lineCount.contents;\n            if (child.contents.style.positionType !== CssPositionAbsolute) {\n              let outerFlexBasis =\n                child.contents.layout.computedFlexBasis +. getMarginAxis child.contents mainAxis;\n              if (\n                (\n                  sizeConsumedOnCurrentLine.contents +. outerFlexBasis > availableInnerMainDim && isNodeFlexWrap\n                ) &&\n                itemsOnLine.contents > 0\n              ) {\n                shouldContinue.contents = false\n              } else {\n                sizeConsumedOnCurrentLine.contents = sizeConsumedOnCurrentLine.contents +. outerFlexBasis;\n                itemsOnLine.contents = itemsOnLine.contents + 1;\n                if (isFlex child.contents) {\n                  totalFlexGrowFactors.contents =\n                    totalFlexGrowFactors.contents +. child.contents.style.flexGrow;\n                  totalFlexShrinkScaledFactors.contents =\n                    totalFlexShrinkScaledFactors.contents +.\n                    -. child.contents.style.flexShrink *. child.contents.layout.computedFlexBasis\n                };\n                if (firstRelativeChild.contents === theNullNode) {\n                  firstRelativeChild.contents = child.contents\n                };\n                if (currentRelativeChild.contents !== theNullNode) {\n                  currentRelativeChild.contents.nextChild = child.contents\n                };\n                currentRelativeChild.contents = child.contents;\n                child.contents.nextChild = theNullNode;\n                curIndex.contents = curIndex.contents + 1;\n                endOfLineIndex.contents = endOfLineIndex.contents + 1\n              }\n            } else {\n              curIndex.contents = curIndex.contents + 1;\n              endOfLineIndex.contents = endOfLineIndex.contents + 1\n            }\n          };\n          let canSkipFlex = not performLayout && measureModeCrossDim === CssMeasureModeExactly;\n          let leadingMainDim = {contents: zero};\n          let betweenMainDim = {contents: zero};\n          let remainingFreeSpace = {contents: zero};\n          if (not (isUndefined availableInnerMainDim)) {\n            remainingFreeSpace.contents = availableInnerMainDim -. sizeConsumedOnCurrentLine.contents\n          } else if (\n            sizeConsumedOnCurrentLine.contents < zero\n          ) {\n            remainingFreeSpace.contents = -. sizeConsumedOnCurrentLine.contents\n          };\n          let originalRemainingFreeSpace = remainingFreeSpace.contents;\n          let deltaFreeSpace = {contents: zero};\n          if (not canSkipFlex) {\n            let childFlexBasis = {contents: zero};\n            let flexShrinkScaledFactor = {contents: zero};\n            let flexGrowFactor = {contents: zero};\n            let baseMainSize = {contents: zero};\n            let boundMainSize = {contents: zero};\n            let deltaFlexShrinkScaledFactors = {contents: zero};\n            let deltaFlexGrowFactors = {contents: zero};\n            currentRelativeChild.contents = firstRelativeChild.contents;\n            while (currentRelativeChild.contents !== theNullNode) {\n              childFlexBasis.contents = currentRelativeChild.contents.layout.computedFlexBasis;\n              if (remainingFreeSpace.contents < zero) {\n                flexShrinkScaledFactor.contents =\n                  -. currentRelativeChild.contents.style.flexShrink *. childFlexBasis.contents;\n                if (flexShrinkScaledFactor.contents != zero) {\n                  baseMainSize.contents =\n                    childFlexBasis.contents +.\n                    /*\n                     * Important to first scale, then divide - to support fixed\n                     * point encoding.\n                     */\n                    flexShrinkScaledFactor.contents *. remainingFreeSpace.contents /.\n                    totalFlexShrinkScaledFactors.contents;\n                  boundMainSize.contents =\n                    boundAxis currentRelativeChild.contents mainAxis baseMainSize.contents;\n                  if (baseMainSize.contents != boundMainSize.contents) {\n                    deltaFreeSpace.contents =\n                      deltaFreeSpace.contents -. (boundMainSize.contents -. childFlexBasis.contents);\n                    deltaFlexShrinkScaledFactors.contents =\n                      deltaFlexShrinkScaledFactors.contents -. flexShrinkScaledFactor.contents\n                  }\n                }\n              } else if (\n                remainingFreeSpace.contents > zero\n              ) {\n                flexGrowFactor.contents = currentRelativeChild.contents.style.flexGrow;\n                if (flexGrowFactor.contents != zero) {\n                  baseMainSize.contents =\n                    childFlexBasis.contents +.\n                    /*\n                     * Important to first scale, then divide - to support fixed\n                     * point encoding.\n                     */\n                    flexGrowFactor.contents *. remainingFreeSpace.contents /. totalFlexGrowFactors.contents;\n                  boundMainSize.contents =\n                    boundAxis currentRelativeChild.contents mainAxis baseMainSize.contents;\n                  if (baseMainSize.contents != boundMainSize.contents) {\n                    deltaFreeSpace.contents =\n                      deltaFreeSpace.contents -. (boundMainSize.contents -. childFlexBasis.contents);\n                    deltaFlexGrowFactors.contents = deltaFlexGrowFactors.contents -. flexGrowFactor.contents\n                  }\n                }\n              };\n              currentRelativeChild.contents = currentRelativeChild.contents.nextChild\n            };\n            totalFlexShrinkScaledFactors.contents =\n              totalFlexShrinkScaledFactors.contents +. deltaFlexShrinkScaledFactors.contents;\n            totalFlexGrowFactors.contents = totalFlexGrowFactors.contents +. deltaFlexGrowFactors.contents;\n            remainingFreeSpace.contents = remainingFreeSpace.contents +. deltaFreeSpace.contents;\n            deltaFreeSpace.contents = zero;\n            currentRelativeChild.contents = firstRelativeChild.contents;\n            while (currentRelativeChild.contents !== theNullNode) {\n              childFlexBasis.contents = currentRelativeChild.contents.layout.computedFlexBasis;\n              let updatedMainSize = {contents: childFlexBasis.contents};\n              if (remainingFreeSpace.contents < zero) {\n                flexShrinkScaledFactor.contents =\n                  -. currentRelativeChild.contents.style.flexShrink *. childFlexBasis.contents;\n                if (flexShrinkScaledFactor.contents != zero) {\n                  updatedMainSize.contents =\n                    boundAxis\n                      currentRelativeChild.contents\n                      mainAxis\n                      (\n                        childFlexBasis.contents +.\n                        /*\n                         * Important to first scale, then divide - to support\n                         * fixed point encoding.\n                         */\n                        flexShrinkScaledFactor.contents *. remainingFreeSpace.contents /.\n                        totalFlexShrinkScaledFactors.contents\n                      )\n                }\n              } else if (\n                remainingFreeSpace.contents > zero\n              ) {\n                flexGrowFactor.contents = currentRelativeChild.contents.style.flexGrow;\n                if (flexGrowFactor.contents != zero) {\n                  updatedMainSize.contents =\n                    boundAxis\n                      currentRelativeChild.contents\n                      mainAxis\n                      (\n                        childFlexBasis.contents +.\n                        /*\n                         * Important to first scale, then divide - to support\n                         * fixed point encoding.\n                         */\n                        flexGrowFactor.contents *. remainingFreeSpace.contents /.\n                        totalFlexGrowFactors.contents\n                      )\n                }\n              };\n              deltaFreeSpace.contents =\n                deltaFreeSpace.contents -. (updatedMainSize.contents -. childFlexBasis.contents);\n              let childWidth = {contents: zero};\n              let childHeight = {contents: zero};\n              let childWidthMeasureMode = {contents: CssMeasureModeUndefined};\n              let childHeightMeasureMode = {contents: CssMeasureModeUndefined};\n              if isMainAxisRow {\n                childWidth.contents =\n                  updatedMainSize.contents +.\n                  getMarginAxis currentRelativeChild.contents CssFlexDirectionRow;\n                childWidthMeasureMode.contents = CssMeasureModeExactly;\n                if (\n                  not (isUndefined availableInnerCrossDim) &&\n                  not (isStyleDimDefined currentRelativeChild.contents CssFlexDirectionColumn) &&\n                  heightMeasureMode === CssMeasureModeExactly &&\n                  getAlignItem node currentRelativeChild.contents === CssAlignStretch\n                ) {\n                  childHeight.contents = availableInnerCrossDim;\n                  childHeightMeasureMode.contents = CssMeasureModeExactly\n                } else if (\n                  not (isStyleDimDefined currentRelativeChild.contents CssFlexDirectionColumn)\n                ) {\n                  childHeight.contents = availableInnerCrossDim;\n                  childHeightMeasureMode.contents =\n                    isUndefined childHeight.contents ? CssMeasureModeUndefined : CssMeasureModeAtMost\n                } else {\n                  childHeight.contents =\n                    currentRelativeChild.contents.style.height +.\n                    getMarginAxis currentRelativeChild.contents CssFlexDirectionColumn;\n                  childHeightMeasureMode.contents = CssMeasureModeExactly\n                }\n              } else {\n                childHeight.contents =\n                  updatedMainSize.contents +.\n                  getMarginAxis currentRelativeChild.contents CssFlexDirectionColumn;\n                childHeightMeasureMode.contents = CssMeasureModeExactly;\n                if (\n                  not (isUndefined availableInnerCrossDim) &&\n                  not (isStyleDimDefined currentRelativeChild.contents CssFlexDirectionRow) &&\n                  widthMeasureMode === CssMeasureModeExactly &&\n                  getAlignItem node currentRelativeChild.contents === CssAlignStretch\n                ) {\n                  childWidth.contents = availableInnerCrossDim;\n                  childWidthMeasureMode.contents = CssMeasureModeExactly\n                } else if (\n                  not (isStyleDimDefined currentRelativeChild.contents CssFlexDirectionRow)\n                ) {\n                  childWidth.contents = availableInnerCrossDim;\n                  childWidthMeasureMode.contents =\n                    isUndefined childWidth.contents ? CssMeasureModeUndefined : CssMeasureModeAtMost\n                } else {\n                  childWidth.contents =\n                    currentRelativeChild.contents.style.width +.\n                    getMarginAxis currentRelativeChild.contents CssFlexDirectionRow;\n                  childWidthMeasureMode.contents = CssMeasureModeExactly\n                }\n              };\n              let requiresStretchLayout =\n                not (isStyleDimDefined currentRelativeChild.contents crossAxis) &&\n                getAlignItem node currentRelativeChild.contents === CssAlignStretch;\n              let _ =\n                layoutNodeInternal\n                  currentRelativeChild.contents\n                  childWidth.contents\n                  childHeight.contents\n                  direction\n                  childWidthMeasureMode.contents\n                  childHeightMeasureMode.contents\n                  (performLayout && not requiresStretchLayout)\n                  flexString;\n              currentRelativeChild.contents = currentRelativeChild.contents.nextChild\n            }\n          };\n          remainingFreeSpace.contents = originalRemainingFreeSpace +. deltaFreeSpace.contents;\n          /* If we are using \"at most\" rules in the main axis. Calculate the remaining space when\n             constraint by the min size defined for the main axis. */\n          if (measureModeMainDim === CssMeasureModeAtMost) {\n            let minDim = styleMinDimensionForAxis node mainAxis;\n            if (not (isUndefined minDim) && minDim >= 0) {\n              remainingFreeSpace.contents =\n                fmaxf 0 (minDim - (availableInnerMainDim -. remainingFreeSpace.contents))\n            } else {\n              remainingFreeSpace.contents = zero\n            }\n          };\n          switch justifyContent {\n          | CssJustifyCenter => leadingMainDim.contents = divideScalarByInt remainingFreeSpace.contents 2\n          | CssJustifyFlexEnd => leadingMainDim.contents = remainingFreeSpace.contents\n          | CssJustifySpaceBetween =>\n            if (itemsOnLine.contents > 1) {\n              betweenMainDim.contents =\n                divideScalarByInt (fmaxf remainingFreeSpace.contents zero) (itemsOnLine.contents - 1)\n            } else {\n              betweenMainDim.contents = zero\n            }\n          | CssJustifySpaceAround =>\n            betweenMainDim.contents = divideScalarByInt remainingFreeSpace.contents itemsOnLine.contents;\n            leadingMainDim.contents = divideScalarByInt betweenMainDim.contents 2\n          | CssJustifyFlexStart => ()\n          };\n          let mainDim = {contents: leadingPaddingAndBorderMain +. leadingMainDim.contents};\n          let crossDim = {contents: zero};\n          for i in startOfLineIndex.contents to (endOfLineIndex.contents - 1) {\n            child.contents = node.children.(i);\n            if (\n              child.contents.style.positionType === CssPositionAbsolute &&\n              isLeadingPosDefinedWithFallback child.contents mainAxis\n            ) {\n              if performLayout {\n                setLayoutLeadingPositionForAxis\n                  child.contents\n                  mainAxis\n                  (\n                    getLeadingPositionWithFallback child.contents mainAxis +. getLeadingBorder node mainAxis +.\n                    getLeadingMargin child.contents mainAxis\n                  )\n              }\n            } else {\n              if performLayout {\n                setLayoutLeadingPositionForAxis\n                  child.contents\n                  mainAxis\n                  (layoutPosPositionForAxis child.contents mainAxis +. mainDim.contents)\n              };\n              if (child.contents.style.positionType === CssPositionRelative) {\n                if canSkipFlex {\n                  mainDim.contents =\n                    mainDim.contents +. betweenMainDim.contents +. getMarginAxis child.contents mainAxis +.\n                    child.contents.layout.computedFlexBasis;\n                  crossDim.contents = availableInnerCrossDim\n                } else {\n                  mainDim.contents =\n                    mainDim.contents +. betweenMainDim.contents +. getDimWithMargin child.contents mainAxis;\n                  crossDim.contents = fmaxf crossDim.contents (getDimWithMargin child.contents crossAxis)\n                }\n              }\n            }\n          };\n          mainDim.contents = mainDim.contents +. trailingPaddingAndBorderMain;\n          let containerCrossAxis = {contents: availableInnerCrossDim};\n          if (\n            measureModeCrossDim === CssMeasureModeUndefined || measureModeCrossDim === CssMeasureModeAtMost\n          ) {\n            containerCrossAxis.contents =\n              boundAxis node crossAxis (crossDim.contents +. paddingAndBorderAxisCross) -. paddingAndBorderAxisCross;\n            if (measureModeCrossDim === CssMeasureModeAtMost) {\n              containerCrossAxis.contents = fminf containerCrossAxis.contents availableInnerCrossDim\n            }\n          };\n          if (not isNodeFlexWrap && measureModeCrossDim === CssMeasureModeExactly) {\n            crossDim.contents = availableInnerCrossDim\n          };\n          crossDim.contents =\n            boundAxis node crossAxis (crossDim.contents +. paddingAndBorderAxisCross) -. paddingAndBorderAxisCross;\n          /*\n           * STEP 7: CROSS-AXIS ALIGNMENT We can skip child alignment if we're\n           * just measuring the container.\n           */\n          if performLayout {\n            for i in startOfLineIndex.contents to (endOfLineIndex.contents - 1) {\n              child.contents = node.children.(i);\n              if (child.contents.style.positionType === CssPositionAbsolute) {\n                if (isLeadingPosDefinedWithFallback child.contents crossAxis) {\n                  setLayoutLeadingPositionForAxis\n                    child.contents\n                    crossAxis\n                    (\n                      getLeadingPositionWithFallback child.contents crossAxis +.\n                      getLeadingBorder node crossAxis +.\n                      getLeadingMargin child.contents crossAxis\n                    )\n                } else {\n                  setLayoutLeadingPositionForAxis\n                    child.contents\n                    crossAxis\n                    (leadingPaddingAndBorderCross +. getLeadingMargin child.contents crossAxis)\n                }\n              } else {\n                let leadingCrossDim = {contents: leadingPaddingAndBorderCross};\n                let alignItem = getAlignItem node child.contents;\n                if (alignItem === CssAlignStretch) {\n                  let childWidth = {contents: zero};\n                  let childHeight = {contents: zero};\n                  let childWidthMeasureMode = {contents: CssMeasureModeUndefined};\n                  let childHeightMeasureMode = {contents: CssMeasureModeUndefined};\n                  childWidth.contents =\n                    child.contents.layout.measuredWidth +. getMarginAxis child.contents CssFlexDirectionRow;\n                  childHeight.contents =\n                    child.contents.layout.measuredHeight +.\n                    getMarginAxis child.contents CssFlexDirectionColumn;\n                  let isCrossSizeDefinite = {contents: false};\n                  if isMainAxisRow {\n                    isCrossSizeDefinite.contents = isStyleDimDefined child.contents CssFlexDirectionColumn;\n                    childHeight.contents = crossDim.contents\n                  } else {\n                    isCrossSizeDefinite.contents = isStyleDimDefined child.contents CssFlexDirectionRow;\n                    childWidth.contents = crossDim.contents\n                  };\n                  if (not isCrossSizeDefinite.contents) {\n                    childWidthMeasureMode.contents =\n                      isUndefined childWidth.contents ? CssMeasureModeUndefined : CssMeasureModeExactly;\n                    childHeightMeasureMode.contents =\n                      isUndefined childHeight.contents ? CssMeasureModeUndefined : CssMeasureModeExactly;\n                    let _ =\n                      layoutNodeInternal\n                        child.contents\n                        childWidth.contents\n                        childHeight.contents\n                        direction\n                        childWidthMeasureMode.contents\n                        childHeightMeasureMode.contents\n                        true\n                        stretchString;\n                    ()\n                  }\n                } else if (\n                  alignItem !== CssAlignFlexStart\n                ) {\n                  let remainingCrossDim =\n                    containerCrossAxis.contents -. getDimWithMargin child.contents crossAxis;\n                  if (alignItem === CssAlignCenter) {\n                    leadingCrossDim.contents =\n                      leadingCrossDim.contents +. divideScalarByInt remainingCrossDim 2\n                  } else {\n                    leadingCrossDim.contents = leadingCrossDim.contents +. remainingCrossDim\n                  }\n                };\n                setLayoutLeadingPositionForAxis\n                  child.contents\n                  crossAxis\n                  (\n                    layoutPosPositionForAxis child.contents crossAxis +. totalLineCrossDim.contents +.\n                    leadingCrossDim.contents\n                  )\n              }\n            }\n          };\n          totalLineCrossDim.contents = totalLineCrossDim.contents +. crossDim.contents;\n          maxLineMainDim.contents = fmaxf maxLineMainDim.contents mainDim.contents;\n          lineCount.contents = lineCount.contents + 1;\n          startOfLineIndex.contents = endOfLineIndex.contents\n        };\n        if (lineCount.contents > 1 && performLayout && not (isUndefined availableInnerCrossDim)) {\n          let remainingAlignContentDim = availableInnerCrossDim -. totalLineCrossDim.contents;\n          let crossDimLead = {contents: zero};\n          let currentLead = {contents: leadingPaddingAndBorderCross};\n          let alignContent = node.style.alignContent;\n          if (alignContent === CssAlignFlexEnd) {\n            currentLead.contents = currentLead.contents +. remainingAlignContentDim\n          } else if (\n            alignContent === CssAlignCenter\n          ) {\n            currentLead.contents = currentLead.contents +. divideScalarByInt remainingAlignContentDim 2\n          } else if (\n            alignContent === CssAlignStretch\n          ) {\n            if (availableInnerCrossDim > totalLineCrossDim.contents) {\n              crossDimLead.contents = divideScalarByInt remainingAlignContentDim lineCount.contents\n            }\n          };\n          let endIndex = {contents: 0};\n          for i in 0 to (lineCount.contents - 1) {\n            let startIndex = endIndex.contents;\n            let j = {contents: startIndex};\n            let lineHeight = {contents: zero};\n            let shouldContinue = {contents: false};\n            while (j.contents < childCount && shouldContinue.contents) {\n              child.contents = node.children.(j.contents);\n              if (child.contents.style.positionType === CssPositionRelative) {\n                if (child.contents.lineIndex !== i) {\n                  shouldContinue.contents = false\n                } else if (\n                  isLayoutDimDefined child.contents crossAxis\n                ) {\n                  lineHeight.contents =\n                    fmaxf\n                      lineHeight.contents\n                      (\n                        layoutMeasuredDimensionForAxis child.contents crossAxis +.\n                        getMarginAxis child.contents crossAxis\n                      )\n                }\n              };\n              j.contents = j.contents + 1\n            };\n            endIndex.contents = j.contents;\n            lineHeight.contents = lineHeight.contents +. crossDimLead.contents;\n            if performLayout {\n              for j in startIndex to (endIndex.contents - 1) {\n                child.contents = node.children.(j);\n                if (child.contents.style.positionType === CssPositionRelative) {\n                  switch (getAlignItem node child.contents) {\n                  | CssAlignFlexStart =>\n                    setLayoutLeadingPositionForAxis\n                      child.contents\n                      crossAxis\n                      (currentLead.contents +. getLeadingMargin child.contents crossAxis)\n                  | CssAlignFlexEnd =>\n                    setLayoutLeadingPositionForAxis\n                      child.contents\n                      crossAxis\n                      (\n                        currentLead.contents +. lineHeight.contents -.\n                        getTrailingMargin child.contents crossAxis -.\n                        layoutMeasuredDimensionForAxis child.contents crossAxis\n                      )\n                  | CssAlignCenter =>\n                    let childHeight = layoutMeasuredDimensionForAxis child.contents crossAxis;\n                    setLayoutLeadingPositionForAxis\n                      child.contents\n                      crossAxis\n                      (currentLead.contents +. divideScalarByInt (lineHeight.contents -. childHeight) 2)\n                  | CssAlignStretch =>\n                    setLayoutLeadingPositionForAxis\n                      child.contents\n                      crossAxis\n                      (currentLead.contents +. getLeadingMargin child.contents crossAxis)\n                  | CssAlignAuto => raise (Invalid_argument \"getAlignItem should never return auto\")\n                  }\n                }\n              }\n            };\n            currentLead.contents = currentLead.contents +. lineHeight.contents\n          }\n        };\n        /* STEP 9: COMPUTING FINAL DIMENSIONS */\n        node.layout.measuredWidth = boundAxis node CssFlexDirectionRow (availableWidth -. marginAxisRow);\n        node.layout.measuredHeight =\n          boundAxis node CssFlexDirectionColumn (availableHeight -. marginAxisColumn);\n        /* If the user didn't specify a width or height for the node, set the\n         * dimensions based on the children. */\n        if (measureModeMainDim === CssMeasureModeUndefined) {\n          setLayoutMeasuredDimensionForAxis node mainAxis (boundAxis node mainAxis maxLineMainDim.contents)\n        } else if (\n          measureModeMainDim === CssMeasureModeAtMost\n        ) {\n          setLayoutMeasuredDimensionForAxis\n            node\n            mainAxis\n            (\n              fmaxf\n                (\n                  fminf\n                    (availableInnerMainDim +. paddingAndBorderAxisMain)\n                    (boundAxisWithinMinAndMax node mainAxis maxLineMainDim.contents)\n                )\n                paddingAndBorderAxisMain\n            )\n        };\n        if (measureModeCrossDim === CssMeasureModeUndefined) {\n          setLayoutMeasuredDimensionForAxis\n            node\n            crossAxis\n            (boundAxis node crossAxis (totalLineCrossDim.contents +. paddingAndBorderAxisCross))\n        } else if (\n          measureModeCrossDim === CssMeasureModeAtMost\n        ) {\n          setLayoutMeasuredDimensionForAxis\n            node\n            crossAxis\n            (\n              fmaxf\n                (\n                  fminf\n                    (availableInnerCrossDim +. paddingAndBorderAxisCross)\n                    (\n                      boundAxisWithinMinAndMax\n                        node crossAxis (totalLineCrossDim.contents +. paddingAndBorderAxisCross)\n                    )\n                )\n                paddingAndBorderAxisCross\n            )\n        };\n        currentAbsoluteChild.contents = firstAbsoluteChild.contents;\n        while (currentAbsoluteChild.contents !== theNullNode) {\n          if performLayout {\n            let childWidth = {contents: cssUndefined};\n            let childHeight = {contents: cssUndefined};\n            let childWidthMeasureMode = {contents: CssMeasureModeUndefined};\n            let childHeightMeasureMode = {contents: CssMeasureModeUndefined};\n            if (isStyleDimDefined currentAbsoluteChild.contents CssFlexDirectionRow) {\n              childWidth.contents =\n                currentAbsoluteChild.contents.style.width +.\n                getMarginAxis currentAbsoluteChild.contents CssFlexDirectionRow\n            } else if (\n              isLeadingPosDefinedWithFallback currentAbsoluteChild.contents CssFlexDirectionRow &&\n              isTrailingPosDefinedWithFallback currentAbsoluteChild.contents CssFlexDirectionRow\n            ) {\n              childWidth.contents =\n                node.layout.measuredWidth -. (\n                  getLeadingBorder node CssFlexDirectionRow +. getTrailingBorder node CssFlexDirectionRow\n                ) -. (\n                  getLeadingPositionWithFallback currentAbsoluteChild.contents CssFlexDirectionRow +.\n                  getTrailingPositionWithFallback currentAbsoluteChild.contents CssFlexDirectionRow\n                );\n              childWidth.contents =\n                boundAxis currentAbsoluteChild.contents CssFlexDirectionRow childWidth.contents\n            };\n            if (isStyleDimDefined currentAbsoluteChild.contents CssFlexDirectionColumn) {\n              childHeight.contents =\n                currentAbsoluteChild.contents.style.height +.\n                getMarginAxis currentAbsoluteChild.contents CssFlexDirectionColumn\n            } else if (\n              /* If the child doesn't have a specified height, compute the height based on the top/bottom offsets if they're defined. */\n              isLeadingPosDefinedWithFallback currentAbsoluteChild.contents CssFlexDirectionColumn &&\n              isTrailingPosDefinedWithFallback currentAbsoluteChild.contents CssFlexDirectionColumn\n            ) {\n              childHeight.contents =\n                node.layout.measuredHeight -. (\n                  getLeadingBorder node CssFlexDirectionColumn +.\n                  getTrailingBorder node CssFlexDirectionColumn\n                ) -. (\n                  getLeadingPositionWithFallback currentAbsoluteChild.contents CssFlexDirectionColumn +.\n                  getTrailingPositionWithFallback currentAbsoluteChild.contents CssFlexDirectionColumn\n                );\n              childHeight.contents =\n                boundAxis currentAbsoluteChild.contents CssFlexDirectionColumn childHeight.contents\n            };\n            if (isUndefined childWidth.contents || isUndefined childHeight.contents) {\n              childWidthMeasureMode.contents =\n                isUndefined childWidth.contents ? CssMeasureModeUndefined : CssMeasureModeExactly;\n              childHeightMeasureMode.contents =\n                isUndefined childHeight.contents ? CssMeasureModeUndefined : CssMeasureModeExactly;\n              /*\n               * According to the spec, if the main size is not definite and the\n               * child's inline axis is parallel to the main axis (i.e. it's\n               * horizontal), the child should be sized using \"UNDEFINED\" in\n               * the main size. Otherwise use \"AT_MOST\" in the cross axis.\n               */\n              if (\n                (not isMainAxisRow && isUndefined childWidth.contents) &&\n                not (isUndefined availableInnerWidth)\n              ) {\n                childWidth.contents = availableInnerWidth;\n                childWidthMeasureMode.contents = CssMeasureModeAtMost\n              };\n              /*\n               * If child has no defined size in the cross axis and is set to stretch, set the cross\n               * axis to be measured exactly with the available inner width\n               */\n              let _ =\n                layoutNodeInternal\n                  currentAbsoluteChild.contents\n                  childWidth.contents\n                  childHeight.contents\n                  direction\n                  childWidthMeasureMode.contents\n                  childHeightMeasureMode.contents\n                  false\n                  absMeasureString;\n              childWidth.contents =\n                currentAbsoluteChild.contents.layout.measuredWidth +.\n                getMarginAxis currentAbsoluteChild.contents CssFlexDirectionRow;\n              childHeight.contents =\n                currentAbsoluteChild.contents.layout.measuredHeight +.\n                getMarginAxis currentAbsoluteChild.contents CssFlexDirectionColumn\n            };\n            let _ =\n              layoutNodeInternal\n                currentAbsoluteChild.contents\n                childWidth.contents\n                childHeight.contents\n                direction\n                CssMeasureModeExactly\n                CssMeasureModeExactly\n                true\n                absLayoutString;\n            if (\n              isTrailingPosDefinedWithFallback currentAbsoluteChild.contents mainAxis &&\n              not (isLeadingPosDefinedWithFallback currentAbsoluteChild.contents mainAxis)\n            ) {\n              setLayoutLeadingPositionForAxis\n                currentAbsoluteChild.contents\n                mainAxis\n                (\n                  layoutMeasuredDimensionForAxis node mainAxis -.\n                  layoutMeasuredDimensionForAxis currentAbsoluteChild.contents mainAxis -.\n                  getTrailingPositionWithFallback currentAbsoluteChild.contents mainAxis\n                )\n            };\n            if (\n              isTrailingPosDefinedWithFallback currentAbsoluteChild.contents crossAxis &&\n              not (isLeadingPosDefinedWithFallback currentAbsoluteChild.contents crossAxis)\n            ) {\n              setLayoutLeadingPositionForAxis\n                currentAbsoluteChild.contents\n                crossAxis\n                (\n                  layoutMeasuredDimensionForAxis node crossAxis -.\n                  layoutMeasuredDimensionForAxis currentAbsoluteChild.contents crossAxis -.\n                  getTrailingPositionWithFallback currentAbsoluteChild.contents crossAxis\n                )\n            }\n          };\n          currentAbsoluteChild.contents = currentAbsoluteChild.contents.nextChild\n        };\n        /* STEP 11: SETTING TRAILING POSITIONS FOR CHILDREN */\n        if performLayout {\n          let needsMainTrailingPos =\n            mainAxis == CssFlexDirectionRowReverse || mainAxis == CssFlexDirectionColumnReverse;\n          let needsCrossTrailingPos =\n            crossAxis == CssFlexDirectionRowReverse || crossAxis == CssFlexDirectionColumnReverse;\n          /* Set trailing position if necessary. */\n          if (needsMainTrailingPos || needsCrossTrailingPos) {\n            for i in 0 to (childCount - 1) {\n              let child = node.children.(i);\n              if needsMainTrailingPos {\n                setTrailingPosition node child mainAxis\n              };\n              if needsCrossTrailingPos {\n                setTrailingPosition node child crossAxis\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n  /** END_GENERATED **/\n};\n\nlet layoutNode node availableWidth availableHeight parentDirection => {\n  /* Increment the generation count. This will force the recursive routine to visit*/\n  /* all dirty nodes at least once. Subsequent visits will be skipped if the input*/\n  /* parameters don't change.*/\n  gCurrentGenerationCount.contents = gCurrentGenerationCount.contents + 1;\n  /* If the caller didn't specify a height/width, use the dimensions*/\n  /* specified in the style.*/\n  let (availableWidth, widthMeasureMode) =\n    if (not (isUndefined availableWidth)) {\n      (availableWidth, CssMeasureModeExactly)\n    } else if (\n      isStyleDimDefined node CssFlexDirectionRow\n    ) {\n      (node.style.width +. getMarginAxis node CssFlexDirectionRow, CssMeasureModeExactly)\n    } else if (\n      node.style.maxWidth >= zero\n    ) {\n      (node.style.maxWidth, CssMeasureModeAtMost)\n    } else {\n      (availableWidth, CssMeasureModeUndefined)\n    };\n  let (availableHeight, heightMeasureMode) =\n    if (not (isUndefined availableHeight)) {\n      (availableHeight, CssMeasureModeExactly)\n    } else if (\n      isStyleDimDefined node CssFlexDirectionColumn\n    ) {\n      (node.style.height +. getMarginAxis node CssFlexDirectionColumn, CssMeasureModeExactly)\n    } else if (\n      node.style.maxHeight >= zero\n    ) {\n      (node.style.maxHeight, CssMeasureModeAtMost)\n    } else {\n      (availableHeight, CssMeasureModeUndefined)\n    };\n  if (\n    layoutNodeInternal\n      node\n      availableWidth\n      availableHeight\n      parentDirection\n      widthMeasureMode\n      heightMeasureMode\n      true\n      initialString\n  ) {\n    setPosition node node.layout.direction;\n    if gPrintTree.contents {\n      LayoutPrint.printCssNode (node, {printLayout: true, printChildren: true, printStyle: true})\n    }\n  }\n};"
  },
  {
    "path": "src/test/resources/samples/langs/Reason/Machine.re",
    "content": "open Format;\n\nlet module Endo = {\n  type t 'a = 'a => 'a;\n};\n\nlet module Syntax = {\n  let module Var = {\n    type t = int;\n  };\n  let module Term = {\n    type t =\n      | App t t\n      | Lam t\n      | Var Var.t\n      ;\n  };\n  let module Sub = {\n    type t 'a =\n      | Cmp (t 'a) (t 'a)\n      | Dot 'a (t 'a)\n      | Id\n      | Shift\n      ;\n\n    let map f sgm => {\n      let rec go = fun\n      | Cmp sgm0 sgm1 => Cmp (go sgm0) (go sgm1)\n      | Dot a sgm => Dot (f a) (go sgm)\n      | Id => Id\n      | Shift => Shift\n      ;\n      go sgm;\n    };\n\n    let rec apply sgm e =>\n      switch (sgm, e) {\n      | (sgm, Term.App e0 e1) => Term.App (apply sgm e0) (apply sgm e1)\n      | (sgm, Term.Lam e) => Term.Lam (apply (Dot (Term.Var 0) (Cmp sgm Shift)) e)\n      | (Dot e _, Term.Var 0) => e\n      | (Dot _ sgm, Term.Var i) => apply sgm (Term.Var (i - 1))\n      | (Id, Term.Var i) => Term.Var i\n      | (Shift, Term.Var i) => Term.Var (i + 1)\n      | (Cmp rho sgm, e) => apply sgm (apply rho e)\n      };\n  };\n};\n\nlet module Zip = {\n  open Syntax;\n  type t 'a =\n    | App0 (t 'a) 'a\n    | App1 'a (t 'a)\n    | Halt\n    | Lam (t 'a)\n    ;\n\n  let map f sgm => {\n    let rec go = fun\n    | App0 zip e1 => App0 (go zip) (f e1)\n    | App1 e0 zip => App1 (f e0) (go zip)\n    | Halt => Halt\n    | Lam zip => Lam (go zip)\n    ;\n    go sgm;\n  };\n\n  let rec apply zip acc => switch zip {\n    | App0 zip e1 => apply zip (Term.App acc e1)\n    | App1 e0 zip => apply zip (Term.App e0 acc)\n    | Halt => acc\n    | Lam zip => apply zip (Term.Lam acc)\n  };\n};\n\nlet module Clo = {\n  open Syntax;\n  type t =\n    | Clo Term.t (Sub.t t);\n  let rec from (Clo term sgm) => Sub.apply (Sub.map from sgm) term;\n};\n\nlet module Pretty = {\n  let module Delim = {\n    type t = string;\n    let pp prev next fmt token => if (prev < next) { fprintf fmt \"%s\" token };\n  };\n  let module Prec = {\n    type t = int;\n    open Syntax.Term;\n    let calc = fun\n      | App _ _ => 1\n      | Lam _ => 2\n      | Var _ => 0\n      ;\n  };\n  let module Name = {\n    type t = string;\n\n    let suffix = {\n      let script = fun\n        | 0 => \"₀\"\n        | 1 => \"₁\"\n        | 2 => \"₂\"\n        | 3 => \"₃\"\n        | 4 => \"₄\"\n        | 5 => \"₅\"\n        | 6 => \"₆\"\n        | 7 => \"₇\"\n        | 8 => \"₈\"\n        | 9 => \"₉\"\n        | _ => failwith \"bad subscript\";\n      let rec go acc => fun\n        | 0 => acc\n        | n => go (script (n mod 10) ^ acc) (n / 10);\n      go \"\"\n    };\n\n    let gen = {\n      let offset = 97;\n      let width = 26;\n      fun () i => {\n        let code = i mod width + offset;\n        let char = Char.chr code;\n        let prime = i / width;\n        let suffix = suffix prime;\n        let name = Char.escaped char ^ suffix;\n        Some name;\n      }\n    };\n  };\n\n  let module Env = {\n    type t = {\n      used: list Name.t,\n      rest: Stream.t Name.t,\n    };\n    let mk () => {\n      let used = [];\n      let rest = Stream.from @@ Name.gen ();\n      { used, rest };\n    };\n  };\n\n  type printer 'a = Env.t => Prec.t => formatter => 'a => unit;\n\n  let module Term = {\n    open Syntax.Term;\n    let rec pp ({ Env.used: used, rest } as env) prev fmt e => {\n      let next = Prec.calc e;\n      switch e {\n      | App e0 e1 =>\n        fprintf fmt \"@[%a%a@ %a%a@]\"\n          (Delim.pp prev next) \"(\"\n          (pp env 1) e0\n          (pp env 0) e1\n          (Delim.pp prev next) \")\"\n      | Lam e =>\n        let name = Stream.next rest;\n        let env = { ...env, Env.used: [name, ...used] };\n        fprintf fmt \"%aλ%a.%a%a\"\n          (Delim.pp prev next) \"(\"\n          (pp_print_string) name\n          (pp env next) e\n          (Delim.pp prev next) \")\"\n      | Var index =>\n        fprintf fmt \"%s\" @@ try (List.nth used index) {\n          | _ => \"#\" ^ string_of_int index\n          }\n      }\n    };\n  };\n\n  let module Sub = {\n    open Syntax.Sub;\n    let rec pp pp_elem env prev fmt => fun\n    | Cmp sgm1 sgm0 =>\n      fprintf fmt \"@[%a;@ %a@]\"\n        (pp pp_elem env prev) sgm1\n        (pp pp_elem env prev) sgm0\n    | Dot e sgm =>\n      fprintf fmt \"@[%a@ ·@ %a@]\"\n        (pp_elem env prev) e\n        (pp pp_elem env prev) sgm\n    | Id =>\n      fprintf fmt \"ι\"\n    | Shift =>\n      fprintf fmt \"↑\"\n    ;\n  };\n\n  let module Clo = {\n    let rec pp env prev fmt (Clo.Clo e sgm) => {\n      let next = Prec.calc e;\n      fprintf fmt \"@[%a%a%a[%a]@]\"\n        (Delim.pp prev next) \"(\"\n        (Term.pp env next) e\n        (Delim.pp prev next) \")\"\n        (Sub.pp pp env next) sgm\n    };\n  };\n\n  let module Zip = {\n    open Zip;\n    let rec pp pp_elem env prev fmt => fun\n    | App0 zip elem =>\n      fprintf fmt \"inl@[<v -1>⟨@,%a@,%a⟩@]\"\n        (pp pp_elem env prev) zip\n        (pp_elem env prev) elem\n    | App1 elem zip =>\n      fprintf fmt \"inr@[<v -1>⟨@,%a@,%a⟩@]\"\n        (pp_elem env prev) elem\n        (pp pp_elem env prev) zip\n    | Halt =>\n      fprintf fmt \"halt\"\n    | Lam zip =>\n      fprintf fmt \"lam@[<v -1>⟨@,%a⟩@]\"\n        (pp pp_elem env prev) zip\n    ;\n  };\n};\n\nlet module Machine = {\n  type t = {\n    clo: Clo.t,\n    ctx: Zip.t Clo.t,\n  };\n\n  let into e => {\n    open Clo;\n    open Syntax.Sub;\n    let clo = Clo e Id;\n    let ctx = Zip.Halt;\n    { clo, ctx }\n  };\n\n  let from { clo, ctx } => Zip.apply (Zip.map Clo.from ctx) (Clo.from clo);\n\n  let pp fmt rule state => {\n    fprintf fmt \"@[<v>ctx  ::@[<v -5>@,%a@]@,clo  ::@[<v -5>@,%a@]@,rule ::@[<v -5>@,%a@]@,term ::@[<v -5>@,%a@]@]@.\"\n      (Pretty.Zip.pp Pretty.Clo.pp (Pretty.Env.mk ()) 2) state.ctx\n                    (Pretty.Clo.pp (Pretty.Env.mk ()) 2) state.clo\n                                       (pp_print_string) rule\n                   (Pretty.Term.pp (Pretty.Env.mk ()) 2) (from state)\n  };\n\n  let halted state => {\n    open Clo;\n    open Syntax.Sub;\n    open Syntax.Term;\n    switch state {\n    | { clo: Clo (Var _) Id, _ } => true\n    | _ => false\n    } [@warning \"-4\"];\n  };\n\n  let step state => {\n    open Clo;\n    open Syntax.Sub;\n    open Syntax.Term;\n    let rule = ref \"\";\n    let state = switch state {\n    /* left */\n    | { clo: Clo (App e0 e1) sgm, ctx } =>\n      let clo = Clo e0 sgm;\n      let ctx = Zip.App0 ctx (Clo e1 sgm);\n      rule := \"LEFT\";\n      { clo, ctx };\n    /* beta */\n    | { clo: Clo (Lam e) sgm, ctx: Zip.App0 ctx c0 } =>\n      let clo = Clo e (Cmp (Dot c0 sgm) Id);\n      rule := \"BETA\";\n      { clo, ctx };\n    /* lambda */\n    | { clo: Clo (Lam e) sgm, ctx } =>\n      let clo = Clo e (Cmp (Dot (Clo (Var 0) Id) (Cmp sgm Shift)) Id);\n      let ctx = Zip.Lam ctx;\n      rule := \"LAMBDA\";\n      { clo, ctx };\n    /* associate */\n    | { clo: Clo (Var n) (Cmp (Cmp pi rho) sgm), ctx } =>\n      let clo = Clo (Var n) (Cmp pi (Cmp rho sgm));\n      rule := \"ASSOCIATE\";\n      { clo, ctx };\n    /* head */\n    | { clo: Clo (Var 0) (Cmp (Dot (Clo e pi) _) sgm), ctx } =>\n      let clo = Clo e (Cmp pi sgm);\n      rule := \"HEAD\";\n      { clo, ctx };\n    /* tail */\n    | { clo: Clo (Var n) (Cmp (Dot (Clo _ _) rho) sgm), ctx } =>\n      let clo = Clo (Var (n - 1)) (Cmp rho sgm);\n      rule := \"TAIL\";\n      { clo, ctx };\n    /* shift */\n    | { clo: Clo (Var n) (Cmp Shift sgm), ctx } =>\n      let clo = Clo (Var (n + 1)) sgm;\n      rule := \"SHIFT\";\n      { clo, ctx };\n    /* id */\n    | { clo: Clo (Var n) (Cmp Id sgm), ctx } =>\n      let clo = Clo (Var n) sgm;\n      rule := \"ID\";\n      { clo, ctx };\n    | _ =>\n      pp std_formatter !rule state;\n      failwith \"bad state\";\n    } [@warning \"-4\"];\n    pp std_formatter !rule state;\n    state;\n  };\n\n  let norm e => {\n    let count = ref 0;\n    let state = ref (into e);\n    while (not (halted !state)) {\n      fprintf std_formatter \"@\\n--- step[%d] ---@\\n\" !count;\n      incr count;\n      state := step !state;\n    };\n    from !state;\n  };\n};\n\nlet module Test = {\n  open Syntax.Term;\n  let l e => Lam e;\n  let ( *@ ) e0 e1 => App e0 e1;\n  let ff = l (l (Var 1));\n  let tt = l (l (Var 0));\n  let zero = l (l (Var 1));\n  let succ = l (l (l (Var 0 *@ Var 2)));\n  let one = succ *@ zero;\n  let two = succ *@ one;\n  let three = succ *@ two;\n  let const = l (l (Var 1));\n  let fix = l (l (Var 1 *@ (Var 0 *@ Var 0)) *@ l (Var 1 *@ (Var 0 *@ Var 0)));\n  let add = fix *@ l (l (l (Var 1 *@ Var 0 *@ l (succ *@ Var 3 *@ Var 0 *@ Var 1))));\n  let init = l (l (Var 0) *@ l (l (Var 1)));\n};\n\nlet module Run = {\n  let go () => Machine.norm Test.init;\n};"
  },
  {
    "path": "src/test/resources/samples/langs/Reason/SuperMerlin.re",
    "content": "/*\n * Copyright (c) 2015-present, Facebook, Inc.\n * All rights reserved.\n *\n */\nlet startedMerlin: ref (option Js.Unsafe.any) = {contents: None};\n\nlet fixedEnv = Js.Unsafe.js_expr \"require('../lib/fixedEnv')\";\n\n/* This and the subsequent big js blocks are copied over from Nuclide. More convenient for now. */\nlet findNearestMerlinFile' = Js.Unsafe.js_expr {|\n  function findNearestMerlinFile(beginAtFilePath) {\n    var path = require('path');\n    var fs = require('fs');\n    var fileDir = path.dirname(beginAtFilePath);\n    var currentPath = path.resolve(fileDir);\n    do {\n      var fileToFind = path.join(currentPath, '.merlin');\n      var hasFile = fs.existsSync(fileToFind);\n      if (hasFile) {\n        return path.dirname(currentPath);\n      }\n\n      if (path.dirname(currentPath) === currentPath) {\n        // Bail\n        return '.';\n      }\n      currentPath = path.dirname(currentPath);\n    } while (true);\n  }\n|};\n\nlet findNearestMerlinFile beginAtFilePath::path => {\n  let result = Js.Unsafe.fun_call findNearestMerlinFile' [|Js.Unsafe.inject (Js.string path)|];\n  Js.to_string result\n};\n\nlet createMerlinReaderFnOnce' = Js.Unsafe.js_expr {|\n  function(ocamlMerlinPath, ocamlMerlinFlags, dotMerlinDir, fixedEnv) {\n    var spawn = require('child_process').spawn;\n    // To split while stripping out any leading/trailing space, we match on all\n    // *non*-whitespace.\n    var items = ocamlMerlinFlags === '' ? [] : ocamlMerlinFlags.split(/\\s+/);\n    var merlinProcess = spawn(ocamlMerlinPath, items, {cwd: dotMerlinDir});\n    merlinProcess.stderr.on('data', function(d) {\n      console.error('Ocamlmerlin: something wrong happened:');\n      console.error(d.toString());\n    });\n\n    merlinProcess.stdout.on('close', function(d) {\n      console.error('Ocamlmerlin: closed.');\n    });\n\n    var cmdQueue = [];\n    var hasStartedReading = false;\n\n    var readline = require('readline');\n    var reader = readline.createInterface({\n      input: merlinProcess.stdout,\n      terminal: false,\n    });\n\n    return function(cmd, resolve, reject) {\n      cmdQueue.push([resolve, reject]);\n\n      if (!hasStartedReading) {\n        hasStartedReading = true;\n        reader.on('line', function(line) {\n          var response;\n          try {\n            response = JSON.parse(line);\n          } catch (err) {\n            response = null;\n          }\n          var resolveReject = cmdQueue.shift();\n          var resolve = resolveReject[0];\n          var reject = resolveReject[1];\n\n          if (!response || !Array.isArray(response) || response.length !== 2) {\n            reject(new Error('Unexpected ocamlmerlin output format: ' + line));\n            return;\n          }\n\n          var status = response[0];\n          var content = response[1];\n\n          var errorResponses = {\n            'failure': true,\n            'error': true,\n            'exception': true,\n          };\n\n          if (errorResponses[status]) {\n            reject(new Error('Ocamlmerlin returned an error: ' + line));\n            return;\n          }\n\n          resolve(content);\n        });\n      }\n\n      merlinProcess.stdin.write(JSON.stringify(cmd));\n    };\n  }\n|};\n\nlet createMerlinReaderFnOnce\n    pathToMerlin::pathToMerlin\n    merlinFlags::merlinFlags\n    dotMerlinPath::dotMerlinPath =>\n  Js.Unsafe.fun_call\n    createMerlinReaderFnOnce'\n    [|\n      Js.Unsafe.inject (Js.string pathToMerlin),\n      Js.Unsafe.inject (Js.string merlinFlags),\n      Js.Unsafe.inject (Js.string dotMerlinPath),\n      Js.Unsafe.inject fixedEnv\n    |];\n\nlet startMerlinProcess path::path =>\n  switch startedMerlin.contents {\n  | Some readerFn => ()\n  | None =>\n    let atomReasonPathToMerlin = Atom.Config.get \"atom-reason.pathToMerlin\";\n    let atomReasonMerlinFlags = Atom.Config.get \"atom-reason.merlinFlags\";\n    let atomReasonMerlinLogFile = Atom.Config.get \"atom-reason.merlinLogFile\";\n    switch atomReasonMerlinLogFile {\n    | JsonString \"\" => ()\n    | JsonString s => Atom.Env.setEnvVar \"MERLIN_LOG\" s\n    | _ => ()\n    };\n    let readerFn =\n      createMerlinReaderFnOnce\n        pathToMerlin::(Atom.JsonValue.unsafeExtractString atomReasonPathToMerlin)\n        merlinFlags::(Atom.JsonValue.unsafeExtractString atomReasonMerlinFlags)\n        dotMerlinPath::(findNearestMerlinFile beginAtFilePath::path);\n    startedMerlin.contents = Some readerFn\n  };\n\nlet readOneLine cmd::cmd resolve reject =>\n  switch startedMerlin.contents {\n  | None => raise Not_found\n  | Some readerFn =>\n    Js.Unsafe.fun_call\n      readerFn\n      [|\n        Js.Unsafe.inject cmd,\n        Js.Unsafe.inject (Js.wrap_callback resolve),\n        Js.Unsafe.inject (Js.wrap_callback reject)\n      |]\n  };\n\n/* contextify is important for avoiding different buffers calling the backing merlin at the same time. */\n/* https://github.com/the-lambda-church/merlin/blob/d98a08d318ca14d9c702bbd6eeadbb762d325ce7/doc/dev/PROTOCOL.md#contextual-commands */\nlet contextify query::query path::path => Js.Unsafe.obj [|\n  (\"query\", Js.Unsafe.inject query),\n  (\"context\", Js.Unsafe.inject (Js.array [|Js.string \"auto\", Js.string path|]))\n|];\n\nlet prepareCommand text::text path::path query::query resolve reject => {\n  startMerlinProcess path;\n  /* These two commands should be run before every main command. */\n  readOneLine\n    cmd::(\n      contextify\n        /* The protocol command tells Merlin which API version we want to use. (2 for us) */\n        query::(\n          Js.array [|\n            Js.Unsafe.inject (Js.string \"protocol\"),\n            Js.Unsafe.inject (Js.string \"version\"),\n            Js.Unsafe.inject (Js.number_of_float 2.)\n          |]\n        )\n        path::path\n    )\n    (\n      fun _ =>\n        readOneLine\n          cmd::(\n            contextify\n              /* The tell command allows us to synchronize our text with Merlin's internal buffer. */\n              query::(\n                Js.array [|Js.string \"tell\", Js.string \"start\", Js.string \"end\", Js.string text|]\n              )\n              path::path\n          )\n          (fun _ => readOneLine cmd::(contextify query::query path::path) resolve reject)\n          reject\n    )\n    reject\n};\n\nlet positionToJsMerlinPosition (line, col) => Js.Unsafe.obj [|\n  /* lines (rows) are 1-based for merlin, not 0-based, like for Atom */\n  (\"line\", Js.Unsafe.inject (Js.number_of_float (float_of_int (line + 1)))),\n  (\"col\", Js.Unsafe.inject (Js.number_of_float (float_of_int col)))\n|];\n\n/* Actual merlin commands we'll use. */\nlet getTypeHint path::path text::text position::position resolve reject =>\n  prepareCommand\n    text::text\n    path::path\n    query::(\n      Js.array [|\n        Js.Unsafe.inject (Js.string \"type\"),\n        Js.Unsafe.inject (Js.string \"enclosing\"),\n        Js.Unsafe.inject (Js.string \"at\"),\n        Js.Unsafe.inject (positionToJsMerlinPosition position)\n      |]\n    )\n    resolve\n    reject;\n\nlet getAutoCompleteSuggestions\n    path::path\n    text::text\n    position::position\n    prefix::prefix\n    resolve\n    reject =>\n  prepareCommand\n    text::text\n    path::path\n    query::(\n      Js.array [|\n        Js.Unsafe.inject (Js.string \"complete\"),\n        Js.Unsafe.inject (Js.string \"prefix\"),\n        Js.Unsafe.inject (Js.string prefix),\n        Js.Unsafe.inject (Js.string \"at\"),\n        Js.Unsafe.inject (positionToJsMerlinPosition position),\n        Js.Unsafe.inject (Js.string \"with\"),\n        Js.Unsafe.inject (Js.string \"doc\")\n      |]\n    )\n    resolve\n    reject;\n\nlet getDiagnostics path::path text::text resolve reject =>\n  prepareCommand\n    text::text\n    path::path\n    query::(Js.array [|Js.Unsafe.inject (Js.string \"errors\")|])\n    resolve\n    reject;\n\nlet locate path::path text::text extension::extension position::position resolve reject =>\n  prepareCommand\n    text::text\n    path::path\n    query::(\n      Js.array [|\n        Js.Unsafe.inject (Js.string \"locate\"),\n        Js.Unsafe.inject (Js.string \"\"),\n        Js.Unsafe.inject (Js.string extension),\n        Js.Unsafe.inject (Js.string \"at\"),\n        Js.Unsafe.inject (positionToJsMerlinPosition position)\n      |]\n    )\n    resolve\n    reject;\n\n/* reject */\nlet getOccurrences path::path text::text position::position resolve reject =>\n  prepareCommand\n    text::text\n    path::path\n    query::(\n      Js.array [|\n        Js.Unsafe.inject (Js.string \"occurrences\"),\n        Js.Unsafe.inject (Js.string \"ident\"),\n        Js.Unsafe.inject (Js.string \"at\"),\n        Js.Unsafe.inject (positionToJsMerlinPosition position)\n      |]\n    )\n    resolve\n    reject;\n\nlet destruct\n    path::path\n    text::text\n    startPosition::startPosition\n    endPosition::endPosition\n    resolve\n    reject =>\n  prepareCommand\n    text::text\n    path::path\n    query::(\n      Js.array [|\n        Js.Unsafe.inject (Js.string \"case\"),\n        Js.Unsafe.inject (Js.string \"analysis\"),\n        Js.Unsafe.inject (Js.string \"from\"),\n        Js.Unsafe.inject (positionToJsMerlinPosition startPosition),\n        Js.Unsafe.inject (Js.string \"to\"),\n        Js.Unsafe.inject (positionToJsMerlinPosition endPosition)\n      |]\n    )\n    resolve\n    reject;\n\nlet getOutline path::path text::text resolve reject =>\n  prepareCommand\n    text::text\n    path::path\n    query::(Js.array [|Js.Unsafe.inject (Js.string \"outline\")|])\n    resolve\n    reject;"
  },
  {
    "path": "src/test/resources/samples/langs/Reason/Syntax.re",
    "content": "/* Copyright (c) 2015-present, Facebook, Inc. All rights reserved. */\n[@@@autoFormat let wrap = 80; let shift = 2];\n\nModules.run ();\n\nPolymorphism.run ();\n\nVariants.run ();\n\nBasicStructures.run ();\n\nTestUtils.printSection \"General Syntax\";\n\n/* Won't work! */\n/* let matchingFunc a = match a with */\n/*   `Thingy x => (print_string \"matched thingy x\"); x */\n/*   | `Other x => (print_string \"matched other x\"); x;; */\n/*  */\nlet matchingFunc a =>\n  switch a {\n  | `Thingy x =>\n    print_string \"matched thingy x\";\n    let zz = 10;\n    zz\n  | `Other x =>\n    print_string \"matched other x\";\n    x\n  };\n\ntype firstTwoShouldBeGroupedInParens =\n  (int => int) => int => int;\n\ntype allParensCanBeRemoved =\n  int => int => int => int;\n\ntype firstTwoShouldBeGroupedAndFirstThree =\n  ((int => int) => int) => int;\n\n/* Same thing now but with type constructors instead of each int */\ntype firstTwoShouldBeGroupedInParens =\n  (list int => list int) => list int => list int;\n\ntype allParensCanBeRemoved =\n  list int => list int => list int => list int;\n\ntype firstTwoShouldBeGroupedAndFirstThree =\n  ((list int => list int) => list int) =>\n  list int;\n\ntype myRecordType = {\n  firstTwoShouldBeGroupedInParens:\n    (int => int) => int => int,\n  allParensCanBeRemoved:\n    int => int => int => int,\n  firstTwoShouldBeGroupedAndFirstThree:\n    ((int => int) => int) => int\n};\n\ntype firstNamedArgShouldBeGroupedInParens =\n  first::(int => int) => second::int => int;\n\ntype allParensCanBeRemoved =\n  first::int => second::int => third::int => int;\n\ntype firstTwoShouldBeGroupedAndFirstThree =\n  first::((int => int) => int) => int;\n\n/* Same thing now, but with type constructors instead of int */\ntype firstNamedArgShouldBeGroupedInParens =\n  first::(list int => list int) =>\n  second::list int =>\n  list int;\n\ntype allParensCanBeRemoved =\n  first::list int =>\n  second::list int =>\n  third::list int =>\n  list int;\n\ntype firstTwoShouldBeGroupedAndFirstThree =\n  first::((list int => list int) => list int) =>\n  list int;\n\ntype firstNamedArgShouldBeGroupedInParens =\n  first::(int => int)? =>\n  second::int list? =>\n  int;\n\n/* The arrow necessitates parens around the next two args. The ? isn't what\n * makes the parens necessary. */\ntype firstNamedArgShouldBeGroupedInParensAndSecondNamedArg =\n  first::(int => int)? =>\n  second::(int => int)? =>\n  int;\n\ntype allParensCanBeRemoved =\n  first::int? =>\n  second::int? =>\n  third::int? =>\n  int;\n\ntype firstTwoShouldBeGroupedAndFirstThree =\n  first::((int => int) => int) => int;\n\ntype noParens =\n  one::int => int => int => two::int => int;\n\ntype noParensNeeded =\n  one::int => int => int => two::int => int;\n\ntype firstNamedArgNeedsParens =\n  one::(int => int => int) => two::int => int;\n\n/* Now, let's try type aliasing */\n/* Unless wrapped in parens, types between arrows may not be aliased, may not\n * themselves be arrows. */\ntype parensRequiredAroundFirstArg =\n  (list int as 'a) => int as 'a;\n\ntype parensRequiredAroundReturnType =\n  (list int as 'a) => (int as 'a);\n\ntype parensRequiredAroundReturnType =\n  (list int as 'a) => (int as 'a) as 'b;\n\ntype noParensNeededWhenInTuple =\n  (list int as 'a, list int as 'b) as 'entireThing;\n\ntype myTypeDef 'a = list 'a;\n\ntype instatiatedTypeDef = myTypeDef int => int;\n\n/* Test a type attribute for good measure */\n/* We should clean up all of the attribute tagging eventually, but for now,\n * let's make it super ugly to get out of the way of all the formatting/parsing\n * implementations (fewer conflicts during parsing, fewer edge cases during\n * printing).\n */\ntype something = (\n  int,\n  int [@lookAtThisAttribute]\n);\n\ntype longWrappingTypeDefinitionExample =\n  M_RK__G.Types.instance\n    (TGRecognizer.tGFields unit unit)\n    (TGRecognizer.tGMethods unit unit);\n\ntype semiLongWrappingTypeDefinitionExample =\n  M_RK__Gesture.Types.instance\n    TGRecognizerFinal.tGFields\n    TGRecognizerFinal.tGMethods;\n\ntype semiLongWrappingTypeWithConstraint =\n  M_RK__Gesture.Types.instance\n    'a\n    TGRecognizerFinal.tGFields\n    TGRecognizerFinal.tGMethods\nconstraint 'a = (unit, unit);\n\ntype onelineConstrain = 'a constraint 'a = int;\n\n/* This must be in trunk but not in this branch of OCaml */\n/* type withNestedRecords = MyConstructor {myField: int} */\ntype colors =\n  | Red int\n  | Black int\n  | Green int;\n\n/* Another approach is to require declared variants to wrap any record */\n/* type myRecord = MyRecord {name: int}; */\n/* let myValue = MyRecord {name: int}; */\n/* This would force importing of the module */\n/* This would also lend itself naturally to pattern matching - and avoid having\n   to use `.` operator at all since you normally destructure. */\ntype nameBlahType = {nameBlah: int};\n\nlet myRecord = {nameBlah: 20};\n\nlet myRecordName = myRecord.nameBlah;\n\nlet {nameBlah}: nameBlahType = {nameBlah: 20};\n\nprint_int nameBlah;\n\nlet {nameBlah: aliasedToThisVar}: nameBlahType = {\n  nameBlah: 20\n};\n\nprint_int aliasedToThisVar;\n\nlet desiredFormattingForWrappedLambda:\n  int => int => int => nameBlahType =\n  /*\n\n   fun is\n   pre-   /firstarg\\\n   fix   /-coupled--\\\n    |-\\ /-to-prefix--\\       */\n  fun curriedArg anotherArg lastArg => {\n    nameBlah: 10\n  };\n\ntype longerInt = int;\n\nlet desiredFormattingForWrappedLambdaWrappedArrow:\n  longerInt =>\n  longerInt =>\n  longerInt =>\n  nameBlahType =\n  /*\n\n   fun is\n   pre-   /firstarg\\\n   fix   /-coupled--\\\n    |-\\ /-to-prefix--\\       */\n  fun curriedArg anotherArg lastArg => {\n    nameBlah: 10\n  };\n\nlet desiredFormattingForWrappedLambdaReturnOnNewLine\n    /*\n\n     fun is\n     pre-   /firstarg\\\n     fix   /-coupled--\\\n      |-\\ /-to-prefix--\\       */\n    curriedArg\n    anotherArg\n    lastArg => {\n  nameBlah: 10\n};\n\n/*\n let is\n pre-\n fix    /-function binding name---\\\n |-\\   / is coupled to prefix      \\   */\nlet desiredFormattingForWrappedSugar\n    curriedArg\n    anotherArg\n    lastArg => {\n  nameBlah: 10\n};\n\n/*\n let is\n pre-\n fix    /-function binding name---\\\n |-\\   / is coupled to prefix      \\   */\nlet desiredFormattingForWrappedSugarReturnOnNewLine\n    curriedArg\n    anotherArg\n    lastArg => {\n  nameBlah: 10\n};\n\n/*\n   let  : type t1 t2. t1 * t2 list -> t1 = ...\n   let rec f : 't1 't2. 't1 * 't2 list -> 't1 =\n     fun (type t1) (type t2) -> (... : t1 * t2 list -> t1)\n */\ntype point = {x: int, y: int};\n\ntype point3D = {x: int, y: int, z: int};\n\nlet point2D = {x: 20, y: 30};\n\nlet point3D: point3D = {\n  x: 10,\n  y: 11,\n  z: 80 /* Optional Comma */\n};\n\nlet printPoint (p: point) => {\n  print_int p.x;\n  print_int p.y\n};\n\nlet addPoints (p1: point, p2: point) => {\n  x: p1.x + p2.x,\n  y: p1.y + p2.y\n};\n\nlet res1 = printPoint point2D;\n\nlet res2 =\n  printPoint {x: point3D.x, y: point3D.y};\n\n/*\n    When () were used to indicate sequences, the parser used seq_expr not only\n    for grouping sequences, but also to form standard precedences.\n                          /------- sequence_expr ------\\\n    let res3 = printPoint (addPoints (point2D, point3D));\n\n    Interestingly, it knew that tuples aren't sequences.\n\n    To move towards semi delimited, semi-terminated, braces-grouped sequences:\n    while allowing any non-sequence expression to be grouped on parens, we make\n    an explicit rule that allows one single non-semi ended expression to be\n    grouped in parens.\n\n    Actually: We will allow an arbitrary number of semi-delimited expressions to\n    be wrapped in parens, but the braces grouped semi delimited (sequence)\n    expressions must *also* be terminated with a semicolon.\n\n    This allows the parser to distinguish between\n\n        let x = {a};    /* Record {a:a} */\n        let x = {a;};   /* Single item sequence returning identifier {a} */\n */\nlet res3 =\n  printPoint (\n    addPoints (\n      point2D,\n      {x: point3D.x, y: point3D.y}\n    )\n  );\n\ntype person = {age: int, name: string};\n\ntype hiredPerson = {\n  age: string,\n  name: string,\n  dateHired: int\n};\n\nlet o: person = {name: \"bob\", age: 10};\n\n/* Parens needed? Nope! */\nlet o: person = {name: \"bob\", age: 10};\n\nlet printPerson (p: person) => {\n  let q: person = p;\n  p.name ^ p.name\n};\n\n/* let dontParseMeBro x y:int = x = y;*/\n/* With this unification, anywhere eyou see `= fun` you can just ommit it */\nlet blah a => a; /* Done */\n\nlet blah a => a; /* Done (almost) */\n\nlet blah a b => a; /* Done */\n\nlet blah a b => a; /* Done (almost) */\n\n/* More than one consecutive pattern must have a single case */\ntype blah = {blahBlah: int};\n\nlet blah a {blahBlah} => a;\n\nlet blah a {blahBlah} => a;\n\nlet module TryToExportTwice = {\n  let myVal = \"hello\";\n};\n\n/*\n   Unifying top level module syntax with local module syntax is probably a bad\n   idea at the moment because it makes it more difficult to continue to support\n   `let .. in` bindings. We can distinguish local modules for `let..in` that\n   just happen to be defined at the top level (but not exported).\n\n     let MyModule = {let myVal = 20;} in\n     MyModule.x\n\n   Wait, where would this ever be valid, even if we continued to support\n   `let..in`?\n */\nlet onlyDoingThisTopLevelLetToBypassTopLevelSequence = {\n  let x = {\n    print_int 1;\n    print_int 20 /* Missing trailing SEMI */\n  };\n  let x = {\n    print_int 1;\n    print_int 20; /* Ensure missing middle SEMI reported well */\n    print_int 20\n  };\n  let x = {\n    print_int 1;\n    print_int 20;\n    10\n    /* Comment in final position */\n  }; /* Missing final SEMI */\n  x + x\n};\n\ntype hasA = {a: int};\n\nlet a = 10;\n\nlet returnsASequenceExpressionWithASingleIdentifier\n    () => a;\n\nlet thisReturnsA () => a;\n\nlet thisReturnsAAsWell () => a;\n\nlet recordVal: int = (thisReturnsARecord ()).a;\n\nPrintf.printf\n  \"\\nproof that thisReturnsARecord: %n\\n\"\n  recordVal;\n\nPrintf.printf\n  \"\\nproof that thisReturnsA: %n\\n\"\n  (thisReturnsA ());\n\n/* Pattern matching */\nlet blah arg =>\n  switch arg {\n  /* Comment before Bar */\n  | /* Comment between bar/pattern */ Red _ => 1\n  /* Comment Before non-first bar */\n  | /* Comment betwen bar/pattern */ Black _ => 0\n  | Green _ => 0\n  };\n\n/* Any function that pattern matches a multicase match is interpretted as a\n * single arg that is then matched on. Instead of the above `blah` example:*/\nlet blah =\n  fun\n  | Red _ => 1\n  | Black _ => 0\n  | Green _ => 1;\n\n/* `fun a => a` is read as \"a function that maps a to a\". Then the */\n/* above example is read: \"a function that 'either maps' Red to.. or maps ..\" */\n/* Thc00f564e first bar is read as \"either maps\" */\n/* Curried form is not supported:\n      let blah x | Red _ => 1 | Black _ => 0;\n      Theres no sugar rule for dropping => fun, only = fun\n   */\n/* let blahCurriedX x => fun  /* See, nothing says we can drop the => fun */ */\n/*   |(Red x | Black x | Green x) => 1     /* With some effort, we can ammend the sugar rule that would */ */\n/*   | Black x => 0                       /* Allow us to drop any => fun.. Just need to make pattern matching */ */\n/*   | Green x => 0;                      /* Support that */ */\n/*  */\nlet blahCurriedX x =>\n  fun\n  | Red x\n  | Black x\n  | Green x =>\n    1 /* With some effort, we can ammend the sugar rule that would */\n  | Black x => 0 /* Allow us to drop any => fun.. Just need to make pattern matching */\n  | Green x => 0; /* Support that */\n\nlet sameThingInLocal = {\n  let blahCurriedX x =>\n    fun\n    | Red x\n    | Black x\n    | Green x =>\n      1 /* With some effort, we can ammend the sugar rule that would */\n    | Black x => 0 /* Allow us to drop any => fun.. Just need to make pattern matching */\n    | Green x => 0; /* Support that */\n  blahCurriedX\n};\n\n/* This should be parsed/printed exactly as the previous */\nlet blahCurriedX x =>\n  fun\n  | Red x\n  | Black x\n  | Green x => 1\n  | Black x => 0\n  | Green x => 0;\n\n/* Any time there are multiple match cases we require a leading BAR */\nlet v = Red 10;\n\nlet Black x | Red x | Green x = v; /* So this NON-function still parses */\n\n/* This doesn't parse, however (and it doesn't in OCaml either):\n     let | Black x | Red x | Green x = v;\n   */\nprint_int x;\n\n/* Scoping: Let sequences. Familiar syntax for lexical ML style scope and\n   sequences. */\nlet res = {\n  let a = \"a starts out as\";\n  {\n    print_string a;\n    let a = 20;\n    print_int a\n  };\n  print_string a\n};\n\nlet res = {\n  let a = \"first its a string\";\n  let a = 20;\n  print_int a;\n  print_int a;\n  print_int a\n};\n\nlet res = {\n  let a = \"a is always a string\";\n  print_string a;\n  let b = 30;\n  print_int b\n};\n\n/* let result = LyList.map (fun | [] => true | _ => false) []; */\n/* OTHERWISE: You cannot tell if a is the first match case falling through or\n * a curried first arg */\n/* let blah = fun a | patt => 0 | anotherPatt => 1; */\n/* let blah a patt => 0 | anotherPatt => 1; */\n/*simple pattern  EQUALGREATER      expr */\nlet blah a {blahBlah} => a;\n\n/*            match_case             */\n/*     pattern EQUALGREATER  expr */\nlet blah =\n  fun\n  | Red _ => 1\n  | Black _ => 0\n  | Green _ => 0;\n\n/* Won't work! */\n/* let arrowFunc = fun a b => print_string \"returning aplusb from arrow\"; a + b;;  */\nlet arrowFunc a b => {\n  print_string \"returning aplusb from arrow\";\n  a + b\n};\n\nlet add a b => {\n  let extra = {\n    print_string \"adding\";\n    0\n  };\n  let anotherExtra = 0;\n  extra + a + b + anotherExtra\n};\n\nprint_string (string_of_int (add 4 34));\n\nlet dummy _ => 10;\n\ndummy res1;\n\ndummy res2;\n\ndummy res3;\n\n/* Some edge cases */\nlet myFun firstArg (Red x | Black x | Green x) =>\n  firstArg + x;\n\nlet matchesWithWhen a =>\n  switch a {\n  | Red x when 1 > 0 => 10\n  | Red _ => 10\n  | Black x => 10\n  | Green x => 10\n  };\n\nlet matchesWithWhen =\n  fun\n  | Red x when 1 > 0 => 10\n  | Red _ => 10\n  | Black x => 10\n  | Green x => 10;\n\nlet matchesOne (`Red x) => 10;\n\n/*\n Typical OCaml would make you *wrap the functions in parens*! This is because it\n can't tell if a semicolon is a sequence operator. Even if we had records use\n commas to separate fields,\n */\ntype adders = {\n  addTwoNumbers: int => int => int,\n  addThreeNumbers: int => int => int => int,\n  addThreeNumbersTupled: (int, int, int) => int\n};\n\nlet myRecordWithFunctions = {\n  addTwoNumbers: fun a b => a + b,\n  addThreeNumbers: fun a b c => a + b + c,\n  addThreeNumbersTupled: fun (a, b, c) =>\n    a + b + c\n};\n\nlet result =\n  myRecordWithFunctions.addThreeNumbers 10 20 30;\n\nlet result =\n  myRecordWithFunctions.addThreeNumbersTupled (\n    10,\n    20,\n    30\n  );\n\nlet lookTuplesRequireParens = (1, 2);\n\n/* let thisDoesntParse = 1, 2;  */\nlet tupleInsideAParenSequence = {\n  print_string \"look, a tuple inside a sequence\";\n  let x = 10;\n  (x, x)\n};\n\nlet tupleInsideALetSequence = {\n  print_string \"look, a tuple inside a sequence\";\n  let x = 10;\n  (x, x)\n};\n\n/* We *require* that function return types be wrapped in\n   parenthesis. In this example, there's no ambiguity */\nlet makeIncrementer (delta: int) :(int => int) =>\n  fun a => a + delta;\n\n/* We could even force that consistency with let bindings - it's allowed\n      currently but not forced.\n   */\nlet myAnnotatedValBinding: int = 10;\n\n/* Class functions (constructors) and methods are unified in the same way */\nclass classWithNoArg = {\n  method x = 0;\n  method y = 0;\n};\n\n/* This parses but doesn't type check\n     class myClass init => object\n       method x => init\n       method y => init\n     end;\n   */\nlet myFunc (a: int) (b: int) :(int, int) => (\n  a,\n  b\n);\n\nlet myFunc (a: int) (b: int) :list int => [1];\n\nlet myFunc (a: int) (b: int) :point => {\n  x: a,\n  y: b\n};\n\nlet myFunc (a: int, b: int) :point => {\n  x: a,\n  y: b\n};\n\ntype myThing = (int, int);\n\ntype stillARecord = {name: string, age: int};\n\n/* Rebase latest OCaml to get the following: And fixup\n   `generalized_constructor_arguments` according to master. */\n/* type ('a, 'b) myOtherThing = Leaf {first:'a, second: 'b} | Null; */\ntype branch 'a 'b = {first: 'a, second: 'b};\n\ntype myOtherThing 'a 'b =\n  | Leaf (branch 'a 'b)\n  | Null;\n\ntype yourThing = myOtherThing int int;\n\n/* Conveniently - this parses exactly how you would intend! No *need* to wrap\n   in an extra [], but it doesn't hurt */\n/* FIXME type lookAtThesePolyVariants = list [`Red] ; */\n/* FIXME type bracketsGroupMultipleParamsAndPrecedence = list (list (list [`Red])); */\n/* FIXME type youCanWrapExtraIfYouWant = (list [`Red]); */\n/* FIXME type hereAreMultiplePolyVariants = list [`Red | `Black]; */\n/* FIXME type hereAreMultiplePolyVariantsWithOptionalWrapping = list ([`Red | `Black]); */\n/*\n   /* Proposal: ES6 style lambdas: */\n\n   /* Currying */\n   let lookES6Style = (`Red x) (`Black y) => { };\n   let lookES6Style (`Red x) (`Black y) => { };\n\n   /* Matching the single argument */\n   let lookES6Style = oneArg => match oneArg with\n     | `Red x => x\n     | `Black x => x;\n\n   /* The \"trick\" to currying that we already have is basically the same - we just\n    * have to reword it a bit:\n    * From:\n    * \"Any time you see [let x = fun ...] just replace it with [let x ...]\"\n    * To:\n    * \"Any time you see [let x = ... => ] just replace it with [let x ... => ]\"\n    */\n   let lookES6Style oneArg => match oneArg with\n     | `Red x => x\n     | `Black x => x;\n\n */\n\n/** Current OCaml Named Arguments. Any aliasing is more than just aliasing!\n    OCaml allows full on pattern matching of named args. */\n/*\n A: let named              ~a    ~b                = aa + bb in\n B: let namedAlias         ~a:aa ~b:bb             = aa + bb in\n C: let namedAnnot         ~(a:int) ~(b:int)       = a + b in\n D: let namedAliasAnnot    ~a:(aa:int) ~b:(bb:int) = aa + bb in\n E: let optional           ?a    ?b                              = 10 in\n F: let optionalAlias      ?a:aa ?b:bb                           = 10 in\n G: let optionalAnnot      ?(a:int option) ?(b:int option)       = 10 in\n H: let optionalAliasAnnot ?a:(aa:int option) ?b:(bb:int option) = 10 in\n /*\n Look! When a default is provided, annotation causes inferred type of argument\n to not be \"option\" since it's automatically destructured (because we know it\n will always be available one way or another.)\n */\n I: let defOptional           ?(a=10)    ?(b=10)                 = 10 in\n J: let defOptionalAlias      ?a:(aa=10) ?b:(bb=10)              = 10 in\n K: let defOptionalAnnot      ?(a:int=10) ?(b:int=10)            = 10 in\n                             \\       \\\n                              \\label_let_pattern opt_default: no longer needed in SugarML\n\n L: let defOptionalAliasAnnot ?a:(aa:int=10) ?b:(bb:int=10)      = 10 in\n                               \\        \\\n                                \\let_pattern: still a useful syntactic building block in SugarML\n */\n\n/**\n * In Reason, the syntax for named args uses double semicolon, since\n * the syntax for lists uses ES6 style [], freeing up the ::.\n */\nlet a = 10;\n\nlet b = 20;\n\n/*A*/\nlet named a::a b::b => a + b;\n\ntype named = a::int => b::int => int;\n\n/*B*/\nlet namedAlias a::aa b::bb => aa + bb;\n\nlet namedAlias a::aa b::bb => aa + bb;\n\ntype namedAlias = a::int => b::int => int;\n\n/*C*/\nlet namedAnnot a::(a: int) b::(b: int) => 20;\n\n/*D*/\nlet namedAliasAnnot a::(aa: int) b::(bb: int) => 20;\n\n/*E*/\nlet myOptional a::a=? b::b=? () => 10;\n\ntype named = a::int? => b::int? => unit => int;\n\n/*F*/\nlet optionalAlias a::aa=? b::bb=? () => 10;\n\n/*G*/\nlet optionalAnnot a::(a: int)=? b::(b: int)=? () => 10;\n\n/*H*/\nlet optionalAliasAnnot\n    a::(aa: int)=?\n    b::(bb: int)=?\n    () => 10;\n\n/*I: */\nlet defOptional a::a=10 b::b=10 () => 10;\n\ntype named = a::int? => b::int? => unit => int;\n\n/*J*/\nlet defOptionalAlias a::aa=10 b::bb=10 () => 10;\n\n/*K*/\nlet defOptionalAnnot\n    a::(a: int)=10\n    b::(b: int)=10\n    () => 10;\n\n/*L*/\nlet defOptionalAliasAnnot\n    a::(aa: int)=10\n    b::(bb: int)=10\n    () => 10;\n\n/*M: Invoking them - Punned */\nlet resNotAnnotated = named a::a b::b;\n\n/*N:*/\nlet resAnnotated: int = named a::a b::b;\n\n/*O: Invoking them */\nlet resNotAnnotated = named a::a b::b;\n\n/*P: Invoking them */\nlet resAnnotated: int = named a::a b::b;\n\n/*Q: Here's why \"punning\" doesn't work!  */\n/* Is b:: punned with a final non-named arg, or is b:: supplied b as one named arg? */\nlet b = 20;\n\nlet resAnnotated = named a::a b::b;\n\n/*R: Proof that there are no ambiguities with return values being annotated */\nlet resAnnotated: ty = named a::a b;\n\n/*S: Explicitly passed optionals are a nice way to say \"use the default value\"*/\nlet explictlyPassed =\n  myOptional a::?None b::?None;\n\n/*T: Annotating the return value of the entire function call */\nlet explictlyPassedAnnotated: int =\n  myOptional a::?None b::?None;\n\n/*U: Explicitly passing optional with identifier expression */\nlet a = None;\n\nlet explictlyPassed = myOptional a::?a b::?None;\n\nlet explictlyPassedAnnotated: int =\n  myOptional a::?a b::?None;\n\nlet nestedLet = {\n  let _ = 1;\n  ()\n};\n\nlet nestedLet = {\n  let _ = 1;\n  ()\n};\n\nlet nestedLet = {\n  let _ = 1;\n  ()\n};\n\nlet nestedLet = {\n  let _ = 1;\n  2\n};\n\n/*\n * Showing many combinations of type annotations and named arguments.\n */\ntype typeWithNestedNamedArgs =\n  outerOne::(\n    innerOne::int => innerTwo::int => int\n  ) =>\n  outerTwo::int =>\n  int;\n\ntype typeWithNestedOptionalNamedArgs =\n  outerOne::\n    (innerOne::int => innerTwo::int => int)? =>\n  outerTwo::int? =>\n  int;\n\ntype typeWithNestedOptionalNamedArgs =\n  outerOne::list string? => outerTwo::int? => int;\n\nlet x =\n  callSomeFunction\n    withArg::10 andOtherArg::wrappedArg;\n\nlet res = {\n  (constraintedSequenceItem: string);\n  (dontKnowWheYoudWantToActuallyDoThis: string)\n};\n\nlet res = {\n  (\n    butTheyWillBePrintedWithAppropriateSpacing: string\n  );\n  (soAsToInstillBestDevelopmentPractices: string)\n};\n\nlet x = [\n  (eachItemInListCanBeAnnotated: int),\n  (typeConstraints: float),\n  (\n    tupleConstraints: int,\n    andNotFunctionInvocations: int\n  )\n];\n\nlet x = [\n  (butWeWillPrint: int),\n  (themAsSpaceSeparated: float),\n  (toInfluenceYour: int, developmentHabbits: int)\n];\n\nlet newRecord = {\n  ...(annotatedSpreadRecord: someRec),\n  x: y\n};\n\nlet newRecord = {\n  ...(annotatedSpreadRecord: someRec),\n  blah: 0,\n  foo: 1\n};\n\nlet newRecord = {\n  ...(\n    youCanEvenCallMethodsHereAndAnnotate them: someRec\n  ),\n  blah: 0,\n  foo: 1\n};\n\nlet newRecord = {\n  ...(\n    youCanEvenCallMethodsHereAndAnnotate\n      them named::10: someRec\n  ),\n  blah: 0,\n  foo: 1\n};\n\nlet something: thing blah = aTypeAnnotation;\n\nlet something: thing blah = thisIsANamedArg;\n\nlet something: thing blah = aTypeAnnotation;\n\nlet something: blah = thisIsANamedArg thing;\n\nlet something: blah = typeAnnotation thing;\n\nlet newRecord = {\n  ...(\n    heresAFunctionWithNamedArgs argOne::i: annotatedResult\n  ),\n  soAsToInstill: 0,\n  developmentHabbits: 1\n};\n\n[@@@thisIsAThing];\n\nlet x = 10;\n\n/* Ensure that the parenthesis are preserved here because they are\n * important:\n */\nlet something =\n  fun\n  | None => (\n      fun\n      | [] => \"emptyList\"\n      | [_, ..._] => \"nonEmptyList\"\n    )\n  | Some _ => (\n      fun\n      | [] => \"emptyList\"\n      | [_, ..._] => \"nonEmptyList\"\n    );\n\n/*  A | B = X; */\nlet A | B = X;\n\n/*  A | (B | C) = X; */\nlet A | (B | C) = X;\n\n/* (A | B) | (C | D) = X; */\nlet A | B | (C | D) = X;\n\n/*  A | B | (C | D) = X; */\nlet A | B | (C | D) = X;\n\n/* (A | B) | C = X; */\nlet A | B | C = X;\n\n/*  A | B | C = X; */\nlet A | B | C = X;\n\n\n/** External function declaration\n *\n */\nexternal f : int => int = \"foo\";\n\nlet x = {contents: 0};\n\nlet unitVal = x.contents = 210;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rebol/GCP-datatypes.r",
    "content": "Rebol [Title: \"Google Code Prettify Datatypes\"]\n\nre: func [s /i] [rejoin compose [\"/^^\" (s) \"/\" either i [\"i\"][\"\"]]]   ; little helper for standard grammar regex used\n\ndate-re: \"\\d{1,2}[\\-\\/](\\d{1,2}|\\w{3,9})[\\-\\/]\\d{2,4}\"  ; naive date! regex\n\nstring-re: {\\\"(?:[^^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)}\nbrace-re:  \"\\{(?:[^^\\}\\^^]|\\^^[\\s\\S])*(?:\\}|$)\"   ; TODO - could build this from string-re\nblock-re:  \"\\[(?:[^^\\]\\\\]|\\\\[\\s\\S])*(?:\\]|$)\"\ntag-re:    \"\\<(?:[^^\\>\\\\]|\\\\[\\s\\S])*(?:\\>|$)\"   ; TODO - could build this from string-re\nnumber-re: \"(?:[.,]\\d+|\\d+['\\d]*(?:[.,]\\d*)?)(?:e[-+]?\\d+)?\"\nword-re: \"[A-Za-z=\\-?!_*+.`~&][A-Za-z0-9=\\-!?_*+.`~&]*\"\n\n|: \"|\"\n\ntypes: compose/deep [\n    ;  comments\n    comment! [\n        PR_LITERAL\n    ;      comment_shebang -- Script tag (shebang!)\n        (re/i \"#![^^\\r\\n]+\")\n    ;      comment_line -- A line comment that starts with ;\n        (re \";[^^\\r\\n]*\")\n    ;      comment_multiline_string -- Multi-line comment\n        (re [\"comment\\s*\" brace-re])\n    ;      comment_multiline_block\n        (re [\"comment\\s*\" block-re])\n    ]\n    ;  type_literal\n    \n    ;  logic\n    logic! [\n        PR_LITERAL\n        (re \"#\\[(?:true|false|yes|no|on|off)\\]\")\n    ]\n    \n    ;  none\n    none! [\n        PR_LITERAL\n        (re \"#\\[none\\]\")\n    ]\n    \n    ;  strings\n    ;      character\n    char! [\n        PR_LITERAL\n        (re/i \"#^\"(?:[^^^^^\"]|\\^^(?:[\\^^^\"\\/\\-A-Z]|\\((?:[0-9A-F]{2,4}|tab|newline)\\)))^\"\")\n    ]\n    \n    string! [\n        PR_LITERAL\n    ;      string_quoted\n        (re \"^\"(?:[^^^\"\\\\]|\\\\[\\s\\S])*(?:^\"|$)\")\n    ;      string_multiline -- Multi-line string {braces} - allowed within:  { ^{ ^}\n        (re brace-re)\n    ]\n    \n    ;      string_tag_comment\n    comment! [\n        PR_LITERAL\n        (re \"<!--(?:[^^-]|-(?!->))+-->\")\n    ]\n    \n    ;      string_tag\n    tag! [\n        PR_LITERAL\n        (re \"<[^^^\"<=>\\x00\\x09\\x0A\\x0D\\x20\\u005D\\u007F][^^>\\x00]*>\")\n    ]\n    \n    file! [\n        PR_LITERAL\n    ;      string_file\n        (re \"%(?:[a-zA-Z?!.*&|=_~0-9'+\\-,:\\/\\\\@]|%[0-9A-F]{2})+\")\n    ;      string_file_quoted\n        (re \"%^\"(?:[^^^\"])*^\"\")\n    ]\n    \n    url! [\n        PR_LITERAL\n    ;      string_url\n        (re \"[a-zA-Z?!.*&|=_~][a-zA-Z?!.*&|=_~0-9'+-,]*:(?:[a-zA-Z?!.*&|=_~0-9'+\\-,:\\/@]|%[0-9A-F]{2})+\")\n    ]\n    \n    email! [\n        PR_LITERAL\n    ;      string_email\n        (re \"[\\w\\d\\+\\-\\.]+\\@[\\w\\d\\+\\-\\.]+\\b\")\n    ]\n    \n    binary! [\n        PR_LITERAL\n    ;      binary_base_two\n        (re \"2#\\{(?:[01\\r\\n\\t ])*\\}\")\n    ;      binary_base_sixty_four\n        (re \"64#\\{(?:[0-9+\\/a-yA-Z=\\r\\n\\t ])*\\}\")\n    ;      binary_base_sixteen\n        (re/i \"(?:16)?#\\{(?:[0-9a-f\\r\\n\\t ])*\\}\")\n    ]\n    \n    issue! [\n        PR_LITERAL\n    ;      string_issue\n        (re \"#[\\w\\d\\-]+(?=[\\s\\n\\t]|$)\")\n    ]\n    \n    ;  values\n    date! [\n        PR_LITERAL\n    ;      value_date\n        (re [date-re \"\\/\\d{1,2}\\:\\d{1,2}\\:\\d{1,2}(\\+|\\-)\\d{1,2}\\:(00|30)\\b\"])\n        (re [date-re \"\\/\\d{1,2}\\:\\d{1,2}\\:\\d{1,2}\\b\"])\n        (re [date-re \"\\b\"])\n        (re \"\\d{2,4}[\\/\\-](\\d{1,2}|\\w{3,9})[\\/\\-]\\d{1,2}(?:\\/\\d{1,2}\\:\\d{1,2}(?:\\:\\d{1,2})?(?:[-+]\\d{1,2}:[03]0)?)?\")\n    ]\n    \n    time! [\n        PR_LITERAL\n    ;      value_time\n        (re \"[-+]?\\d{1,2}:\\d{1,2}(?::\\d{1,2}(?:\\.\\d+)?)?\\b\")\n    ]\n    \n    tuple! [\n        PR_LITERAL\n    ;      value_tuple\n        (re \"\\d+(?:\\.\\d+){2,9}\")\n    ]\n    \n    pair! [\n        PR_LITERAL\n    ;      value_pair\n        (re/i [\"[-+]?\" number-re \"x[-+]?\" number-re])\n    ]\n    ;  [PR['PR_LITERAL'], /^\\d(?:[\\.\\,\\'\\d]*)x\\d(?:[\\.\\,\\'\\d]*)\\b/]\n    \n    money! [\n        PR_LITERAL\n    ;      value_money\n        (re [\"[-+]?[A-Z]{0,3}\\$\" number-re])\n        ;  [PR['PR_LITERAL'], /^\\$\\d[\\d\\.\\,\\']*\\b/]\n        ;  [PR['PR_LITERAL'], /^[\\+\\-\\w]{1,4}\\$\\d[\\d\\.\\,\\']*\\b/]\n    ]\n    \n    ;      value_number\n    number! [\n        PR_LITERAL\n        (re/i [\"[-+]?\" number-re \"%?\"])\n        ;  percent! [PR_LITERAL (re \"(\\+|\\-|\\d)(?:[\\.\\,\\'\\d]*)\\%\\b\")]\n        ;  decimal! [PR_LITERAL (re \"(\\+|\\-|\\d)\\d*(?:[\\.\\,]\\d+)\\b\")]\n        ;  integer! [PR_LITERAL (re \"(\\+|\\-|\\d)\\d*\\b\")]\n    ]\n    \n    ;  words\n    datatype! [\n        PR_LITERAL\n    ;      word_datatype\n        (re \"(?:[A-Za-z\\-]+)\\!(?![A-Za-z0-9\\-])\")\n    ]\n    \n    set-word! [\n        PR_LITERAL\n    ;      word_set\n        (re [word-re \"(?:\\/\" word-re \"|\\/\\d+)*:\"])\n    ]\n    \n    ;  -- get-word!\n    get-word! [\n        PR_LITERAL\n    ;      word_get\n        (re [\":\" word-re])\n    ]\n    \n    ;  -- lit-word!\n    lit-word! [\n        PR_LITERAL\n    ;      word_lit\n        (re [\"'\" word-re])\n    ]\n    \n    refinement! [\n        PR_LITERAL\n    ;      word_refine\n        (re reduce [\"\\/\" replace copy find next word-re \"[\" \"]*\" \"]+\" \"(?![A-Za-z0-9\\-])\"])\n    ]\n\n    op! [\n        PR_LITERAL\n    ;      word_native\n        (re \"(?:!=?=?|\\*\\*?|[+-]|\\/\\/?|<[=>]?|=[=?]?|>=?)(?![A-Za-z0-9\\-])\")\n    ]\n    \n    function! [\n        PR_LITERAL\n        (re make-keywords-string)\n        ; [REB['function!'], /\\b(?:to\\-relative\\-file\\/as\\-local|or\\~|pwd|abs|map|not|rm|at|do|dp|ds|dt|cd|in|ls|to|or|if)\\s/]\n    ]\n    \n    rebol! [\n        PR_LITERAL\n    ;      word_header\n        (re/i \"(?:rebol|red(?:\\/system)?|world|topaz)$\")\n    ]\n    \n    logic! [\n        PR_LITERAL\n    ;      word_logic\n        (re \"(?:true|false|yes|no|on|off)$\")\n    ]\n    \n    ;      word_none\n    none! [PR_LITERAL (re \"none$\")]\n    \n    ;      word\n    word! [PR_LITERAL (re word-re)]\n\n    ;  -- literal!\n    ; literal! [PR_LITERAL (re [\"#\" block-re])]\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rebol/booters.r",
    "content": "REBOL [\n\tSystem: \"REBOL [R3] Language Interpreter and Run-time Environment\"\n\tTitle: \"Special boot native function specs\"\n\tRights: {\n\t\tCopyright 2012 REBOL Technologies\n\t\tREBOL is a trademark of REBOL Technologies\n\t}\n\tLicense: {\n\t\tLicensed under the Apache License, Version 2.0.\n\t\tSee: http://www.apache.org/licenses/LICENSE-2.0\n\t}\n\tPurpose: {\n\t\tThese are used to define natives and actions.\n\t\tBind attributes for this block are: BIND_SET and SHALLOW\n\t}\n]\n\n; Special block used as spec to the datatype test functions (e.g. time?):\n[\"Returns TRUE if it is this type.\" value [any-type!] 0]\n\n; The native function must be defined first. This is a\n; special boot function created manually within the C code.\nnative: native [\n\t{Creates native function (for internal usage only).}\n\tspec ; [block!] -- no check required, we know it is correct\n]\n\naction: native [\n\t{Creates datatype action (for internal usage only).}\n\tspec ; [block!] -- no check required, we know it is correct\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rebol/hello-world.r2",
    "content": "REBOL []\n\nhello: func [] [\n    print \"hello, world!\"\n]\n\nhello\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rebol/hello-world.r3",
    "content": "Rebol []\n\nhello: func [] [\n    print \"hello, world!\"\n]\n\nhello\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rebol/hello-world.reb",
    "content": "Rebol []\nhello: func [] [\n    print \"hello, world!\"\n]\nhello\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rebol/hello-world.rebol",
    "content": "Rebol [\n  author: \"Rebol user\"\n]\n\nhello: func [] [\n  print \"hello, world!\"\n]\n\nhello\n"
  },
  {
    "path": "src/test/resources/samples/langs/Red/example.red",
    "content": "Red [\n    Title:  \"Red console\"\n    Author: [\"Nenad Rakocevic\" \"Kaj de Vos\"]\n    File:   %console.red\n    Tabs:   4\n    Rights: \"Copyright (C) 2012-2013 Nenad Rakocevic. All rights reserved.\"\n    License: {\n        Distributed under the Boost Software License, Version 1.0.\n        See https://github.com/dockimbel/Red/blob/master/BSL-License.txt\n    }\n    Purpose:    \"Just some code for testing Pygments colorizer\"\n    Language:   http://www.red-lang.org/\n]\n\n#system-global [\n    #either OS = 'Windows [\n        #import [\n            \"kernel32.dll\" stdcall [\n                AttachConsole:   \"AttachConsole\" [\n                    processID       [integer!]\n                    return:         [integer!]\n                ]\n                SetConsoleTitle: \"SetConsoleTitleA\" [\n                    title           [c-string!]\n                    return:         [integer!]\n                ]\n                ReadConsole:     \"ReadConsoleA\" [\n                    consoleInput    [integer!]\n                    buffer          [byte-ptr!]\n                    charsToRead     [integer!]\n                    numberOfChars   [int-ptr!]\n                    inputControl    [int-ptr!]\n                    return:         [integer!]\n                ]\n            ]\n        ]\n        line-buffer-size: 16 * 1024\n        line-buffer: allocate line-buffer-size\n    ][\n        #switch OS [\n            MacOSX [\n                #define ReadLine-library \"libreadline.dylib\"\n            ]\n            #default [\n                #define ReadLine-library \"libreadline.so.6\"\n                #define History-library  \"libhistory.so.6\"\n            ]\n        ]\n        #import [\n            ReadLine-library cdecl [\n                read-line: \"readline\" [  ; Read a line from the console.\n                    prompt          [c-string!]\n                    return:         [c-string!]\n                ]\n                rl-bind-key: \"rl_bind_key\" [\n                    key             [integer!]\n                    command         [integer!]\n                    return:         [integer!]\n                ]\n                rl-insert:   \"rl_insert\" [\n                    count           [integer!]\n                    key             [integer!]\n                    return:         [integer!]\n                ]\n            ]\n            #if OS <> 'MacOSX [\n                History-library cdecl [\n                    add-history: \"add_history\" [  ; Add line to the history.\n                        line        [c-string!]\n                    ]\n                ]\n            ]\n        ]\n\n        rl-insert-wrapper: func [\n            [cdecl]\n            count   [integer!]\n            key     [integer!]\n            return: [integer!]\n        ][\n            rl-insert count key\n        ]\n        \n    ]\n]\n\nWindows?: system/platform = 'Windows\n\nread-argument: routine [\n    /local\n        args [str-array!]\n        str  [red-string!]\n][\n    if system/args-count <> 2 [\n        SET_RETURN(none-value)\n        exit\n    ]\n    args: system/args-list + 1                          ;-- skip binary filename\n    str: simple-io/read-txt args/item\n    SET_RETURN(str)\n]\n\ninit-console: routine [\n    str [string!]\n    /local\n        ret\n][\n    #either OS = 'Windows [\n        ;ret: AttachConsole -1\n        ;if zero? ret [print-line \"ReadConsole failed!\" halt]\n        \n        ret: SetConsoleTitle as c-string! string/rs-head str\n        if zero? ret [print-line \"SetConsoleTitle failed!\" halt]\n    ][\n        rl-bind-key as-integer tab as-integer :rl-insert-wrapper\n    ]\n]\n\ninput: routine [\n    prompt [string!]\n    /local\n        len ret str buffer line\n][\n    #either OS = 'Windows [\n        len: 0\n        print as c-string! string/rs-head prompt\n        ret: ReadConsole stdin line-buffer line-buffer-size :len null\n        if zero? ret [print-line \"ReadConsole failed!\" halt]\n        len: len + 1\n        line-buffer/len: null-byte\n        str: string/load as c-string! line-buffer len\n    ][\n        line: read-line as c-string! string/rs-head prompt\n        if line = null [halt]  ; EOF\n\n         #if OS <> 'MacOSX [add-history line]\n\n        str: string/load line  1 + length? line\n;       free as byte-ptr! line\n    ]\n    SET_RETURN(str)\n]\n\ncount-delimiters: function [\n    buffer  [string!]\n    return: [block!]\n][\n    list: copy [0 0]\n    c: none\n    \n    foreach c buffer [\n        case [\n            escaped? [\n                escaped?: no\n            ]\n            in-comment? [\n                switch c [\n                    #\"^/\" [in-comment?: no]\n                ]\n            ]\n            'else [\n                switch c [\n                    #\"^^\" [escaped?: yes]\n                    #\";\"  [if zero? list/2 [in-comment?: yes]]\n                    #\"[\"  [list/1: list/1 + 1]\n                    #\"]\"  [list/1: list/1 - 1]\n                    #\"{\"  [list/2: list/2 + 1]\n                    #\"}\"  [list/2: list/2 - 1]\n                ]\n            ]\n        ]\n    ]\n    list\n]\n\ndo-console: function [][\n    buffer: make string! 10000\n    prompt: red-prompt: \"red>> \"\n    mode:  'mono\n    \n    switch-mode: [\n        mode: case [\n            cnt/1 > 0 ['block]\n            cnt/2 > 0 ['string]\n            'else     [\n                prompt: red-prompt\n                do eval\n                'mono\n            ]\n        ]\n        prompt: switch mode [\n            block  [\"[^-\"]\n            string [\"{^-\"]\n            mono   [red-prompt]\n        ]\n    ]\n    \n    eval: [\n        code: load/all buffer\n        \n        unless tail? code [\n            set/any 'result do code\n            \n            unless unset? :result [\n                if 67 = length? result: mold/part :result 67 [  ;-- optimized for width = 72\n                    clear back tail result\n                    append result \"...\"\n                ]\n                print [\"==\" result]\n            ]\n        ]\n        clear buffer\n    ]\n\n    while [true][\n        unless tail? line: input prompt [\n            append buffer line\n            cnt: count-delimiters buffer\n\n            either Windows? [\n                remove skip tail buffer -2          ;-- clear extra CR (Windows)\n            ][\n                append buffer lf                    ;-- Unix\n            ]\n            \n            switch mode [\n                block  [if cnt/1 <= 0 [do switch-mode]]\n                string [if cnt/2 <= 0 [do switch-mode]]\n                mono   [do either any [cnt/1 > 0 cnt/2 > 0][switch-mode][eval]]\n            ]\n        ]\n    ]\n]\n\nq: :quit\n\nif script: read-argument [\n    script: load script\n    either any [\n        script/1 <> 'Red\n        not block? script/2 \n    ][\n        print \"*** Error: not a Red program!\"\n    ][\n        do skip script 2\n    ]\n    quit\n]\n\ninit-console \"Red Console\"\n\nprint {\n-=== Red Console alpha version ===-\n(only ASCII input supported)\n}\n\ndo-console"
  },
  {
    "path": "src/test/resources/samples/langs/Red/example.reds",
    "content": "Red/System [\n    Title:      \"Red/System example file\"\n    Purpose:    \"Just some code for testing Pygments colorizer\"\n    Language:   http://www.red-lang.org/\n]\n\n#include %../common/FPU-configuration.reds\n\n; C types\n\n#define time!                   long!\n#define clock!                  long!\n\ndate!: alias struct! [\n    second                      [integer!]  ; 0-61 (60?)\n    minute                      [integer!]  ; 0-59\n    hour                        [integer!]  ; 0-23\n\n    day                         [integer!]  ; 1-31\n    month                       [integer!]  ; 0-11\n    year                        [integer!]  ; Since 1900\n\n    weekday                     [integer!]  ; 0-6 since Sunday\n    yearday                     [integer!]  ; 0-365\n    daylight-saving-time?       [integer!]  ; Negative: unknown\n]\n\n#either OS = 'Windows [\n    #define clocks-per-second   1000\n][\n    ; CLOCKS_PER_SEC value for Syllable, Linux (XSI-conformant systems)\n    ; TODO: check for other systems\n    #define clocks-per-second   1000'000\n] \n\n#import [LIBC-file cdecl [\n\n    ; Error handling\n\n    form-error: \"strerror\" [  ; Return error description.\n        code            [integer!]\n        return:         [c-string!]\n    ]\n    print-error: \"perror\" [  ; Print error to standard error output.\n        string          [c-string!]\n    ]\n\n\n    ; Memory management\n\n    make: \"calloc\" [  ; Allocate zero-filled memory.\n        chunks          [size!]\n        size            [size!]\n        return:         [binary!]\n    ]\n    resize: \"realloc\" [  ; Resize memory allocation.\n        memory          [binary!]\n        size            [size!]\n        return:         [binary!]\n    ]\n ]\n \n JVM!: alias struct! [\n    reserved0                   [int-ptr!]\n    reserved1                   [int-ptr!]\n    reserved2                   [int-ptr!]\n    \n    DestroyJavaVM               [function! [[JNICALL] vm [JVM-ptr!] return: [jint!]]]\n    AttachCurrentThread         [function! [[JNICALL] vm [JVM-ptr!] penv [struct! [p [int-ptr!]]] args [byte-ptr!] return: [jint!]]]\n    DetachCurrentThread         [function! [[JNICALL] vm [JVM-ptr!] return: [jint!]]]\n    GetEnv                      [function! [[JNICALL] vm [JVM-ptr!] penv [struct! [p [int-ptr!]]] version [integer!] return: [jint!]]]\n    AttachCurrentThreadAsDaemon [function! [[JNICALL] vm [JVM-ptr!] penv [struct! [p [int-ptr!]]] args [byte-ptr!] return: [jint!]]]\n]\n\n ;just some datatypes for testing:\n \n #some-hash\n 10-1-2013\n quit\n \n ;binary:\n #{00FF0000}\n #{00FF0000 FF000000}\n #{00FF0000\tFF000000} ;with tab instead of space\n 2#{00001111}\n 64#{/wAAAA==}\n 64#{/wAAA A==} ;with space\t inside\n 64#{/wAAA\tA==} ;with tab inside\n \n \n ;string with char\n {bla ^(ff) foo}\n {bla ^(( foo}\n ;some numbers:\n 12\n 1'000\n 1.2\n FF00FF00h\n \n ;some tests of hexa number notation with not common ending\n [ff00h ff00h] ff00h{} FFh\"foo\" 00h(1 + 2) (AEh)\n\n;normal words:\nfoo char\n\n;get-word\n:foo\n \n;lit-word:\n'foo 'foo\n\nto-integer foo\nfoo/(a + 1)/b\n\ncall/output reform ['which interpreter] path: copy \"\"\n\n version-1.1:   00010001h\n \n #if type = 'exe [\n    push system/stack/frame                 ;-- save previous frame pointer\n    system/stack/frame: system/stack/top    ;-- @@ reposition frame pointer just after the catch flag\n]\npush CATCH_ALL                              ;-- exceptions root barrier\npush 0                                      ;-- keep stack aligned on 64-bit"
  },
  {
    "path": "src/test/resources/samples/langs/Regular Expression/modeline-emacs.regexp",
    "content": "-\\*-\n(?:\n\t\\s*\n\t(?= [^:;\\s]+ \\s* -\\*-)\n\t|\n\t(?:\n\t\t.*?[;\\s]\n\t\t|\n\t\t(?<=-\\*-)\n\t)\n\tmode\\s*:\\s*\n)\n([^:;\\s]+)\n\n(?=\n\t[\\s;] | (?<![-*]) -\\*-\n)\n.*?\n-\\*-\n"
  },
  {
    "path": "src/test/resources/samples/langs/Regular Expression/modeline-vim.regexp",
    "content": "(?:\n\t(?:\\s|^)\n\tvi\n\t(?:m[<=>]?\\d+|m)?\n\t|\n\t[\\t\\x20]\n\tex\n)\n(?=\n\t: (?=\\s* set? \\s [^\\n:]+ :) |\n\t: (?!\\s* set? \\s)\n)\n\n(?:\n\t(?:\\s|\\s*:\\s*)\n\t\\w*\n\t(?:\n\t\t\\s*=\n\t\t(?:[^\\n\\\\\\s]|\\\\.)*\n\t)?\n)*\n\n[\\s:]\n(?:filetype|ft|syntax)\n\\s*=\n(MODE_NAME_HERE)\n(?=\\s|:|$)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Regular Expression/ordinal.regex",
    "content": "\\b(\\d*1[1-3]th|\\d*0th|(?:(?!11st)\\d)*1st|\\d*2nd|(?:(?!13rd)\\d*)3rd|\\d*[4-9]th)\\b\n"
  },
  {
    "path": "src/test/resources/samples/langs/Regular Expression/url.regex",
    "content": "/^([^\\/#\\?]*:?\\/\\/)?(\\/?(?:[^\\/#\\?]+\\/)*)?([^\\/#\\?]+)?(?:\\/(?=$))?(\\?[^#]*)?(#.*)?$/\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ren'Py/example.rpy",
    "content": "###     Demo Script Example     ###\n\n﻿# This script, but not the artwork associated with it, is in the\n# public domain. Feel free to use it as the basis for your own\n# game.\n\n# If you're trying to understand this script, I recommend skipping\n# down to the line beginning with 'label start:', at least on your\n# first read-through.\n\n# This init block runs first, and sets up all sorts of things that\n# are used by the rest of the game. Variables that are set in init\n# blocks are _not_ saved, unless they are changed later on in the\n# program.\n\ninit:\n\n    # Set up the size of the screen, and the window title.\n    $ config.screen_width = 800\n    $ config.screen_height = 600\n    $ config.window_title = \"The Ren'Py Demo Game\"\n\n    # Declare the images that are used in the program.\n\n    # Backgrounds.\n    image bg carillon = \"carillon.jpg\"\n    image bg whitehouse = \"whitehouse.jpg\"\n    image bg washington = \"washington.jpg\"\n    image bg onememorial = \"1memorial.jpg\"\n    image black = Solid((0, 0, 0, 255))\n\n    # Character pictures.\n    image eileen happy = \"9a_happy.png\"\n    image eileen vhappy = \"9a_vhappy.png\"\n    image eileen concerned = \"9a_concerned.png\"\n\n    # A character object. This object lets us have the character say\n    # dialogue without us having to repeatedly type her name. It also\n    # lets us change the color of her name.\n\n    $ e = Character('Eileen', color=(200, 255, 200, 255))\n\n# The start label marks the place where the main menu jumps to to\n# begin the actual game.\n\nlabel start:\n\n    # The save_name variable sets the name of the save game. Like all\n    # variables declared outside of init blocks, this variable is\n    # saved and restored with a save file.\n    $ save_name = \"Introduction\"\n\n    # This variable is only used by our game. If it's true, it means\n    # that we won the date.\n    $ date = False\n\n    # Clear the game runtime timer, so it doesn't reflect time spent\n    # sitting at the main menu.\n    $ renpy.clear_game_runtime()\n\n    # Start some music playing in the background.\n    $ renpy.music_start('sun-flower-slow-drag.mid')\n\n    # Now, set up the first scene. We first fade in our washington\n    # background, and then we dissolve in the image of Eileen on top\n    # of it.\n    scene bg washington with fade\n    show eileen vhappy with dissolve\n\n    # Store the current version of Ren'Py into a variable, so we can\n    # interpolate it into the next line.\n    $ version = renpy.version()\n\n    # Display a line of dialogue. In this case, we manually specify\n    # who's saying the line of dialogue. We also interpolate in the\n    # version of Ren'Py we're using.\n    \"Girl\" \"Hi, and welcome to the %(version)s demo program.\"\n\n    # This instantly replaces the very happy picture of Eileen with\n    # one showing her merely happy. It demonstrates how the show\n    # statement lets characters change emotions.\n    show eileen happy\n\n    # Another line of dialogue.\n    \"Girl\" \"My name is Eileen, and while I plan to one day star in a\n            real game, for now I'm here to tell you about Ren'Py.\"\n\n    # This line used the e character object, which displays Eileen's\n    # name in green. The use of a short name for a character object\n    # lets us save typing when writing the bulk of the dialogue.\n    e \"Ren'Py is a language and engine for writing and playing visual\n       novel games.\"\n\n    e \"Our goal is to allow people to be able to write the script for\n       a game, and with very little effort, turn that script into\n       a working game.\"\n\n    e \"I can tell you about the features of Ren'Py games, or how to write\n       your own game. What do you want to know about?\"\n\n    # This variable is used to save the choices that have been made in\n    # the main menu.\n    $ seen_set = [ ]\n\nlabel choices:\n\n    # We change the save name here.\n    $ save_name = \"Question Menu\"\n\n    # This is the main menu, that lets the user decide what he wants\n    # to hear about.\n    menu:\n\n        # The set menu clause ensures that each menu choice can only\n        # be chosen once.\n        set seen_set\n\n        # This is a menu choice. When chosen, the statements in its\n        # block are executed.\n        \"What are some user-visible features of Ren'Py games?\":\n\n            # We call the features label. The from clause needs to be\n            # here to ensure that save games work, even after we\n            # change the script. It was added automatically.\n            call features from _call_features_1\n\n            # When we're done talking about features, jump back up\n            # to choices.\n            jump choices\n\n        # Another choice.\n        \"How do I write my own games with it?\":\n            call writing from _call_writing_1\n            jump choices\n\n        \"Can you demonstrate more features to me?\":\n            call demonstrate from _call_demonstrate_1\n            jump choices\n\n        # This choice has a condition associated with it. It is only\n        # displayed if the condition is true (in this case, if we have\n        # selected at least one other choice has been chosen.)\n        \"Where can I find out more?\" if seen_set:\n            call find_out_more from _call_find_out_more_1\n            jump choices\n\n        \"Why are we in Washington, DC?\":\n            call washington from _call_washington_1\n            jump choices\n\n        \"I think I've heard enough.\" if seen_set:\n            jump ending\n\n\n# This is the section on writing games.\nlabel writing:\n\n    # Change the title of the save games.\n    $ save_name = \"Writing Games\"\n\n    # We start off with a bunch of dialogue.\n    e \"If you want to write a game, we recommend that you read the\n       Ren'Py reference, which you can get from our web page,\n       http://www.bishoujo.us/renpy/.\"\n\n    e \"But here, we'll go over some of the basics of writing Ren'Py\n       scripts. It might make sense if you open the source for this\n       game.\"\n\n    e \"The source for this game can be found in the file\n       game/script.rpy.\"\n\n    e \"The goal of Ren'Py is to make writing the game similar to\n       typing up the script on the computer.\"\n\n    e \"For example, a line of dialogue is expressed by putting the\n       character's name next to the dialogue string.\"\n\n    # A string by itself like this displays without a name associated\n    # with it. So it's useful for dialogue and narration.\n    \"I somehow remember that strings by themselves are displayed as\n     thoughts or narration.\"\n\n    e \"The menu statement makes it easy to create menus.\"\n\n    e \"A number of statements let you control what is shown on the\n       screen.\"\n\n    # This scene statement has a with clause associated with it. In\n    # this case (based on what is defined in the init clause at the\n    # top of this script), it causes a fade to black, and then back\n    # to the new scene.\n    scene bg whitehouse with fade\n\n    e \"The scene statement clears the scene list, which is the list of\n       things that are shown on the screen.\"\n\n    # This shows an image, and dissolves it in.\n    show eileen happy with dissolve\n\n    e \"The show statement shows another image on the screen.\"\n\n    # The at clause here, displays the character on the left side of\n    # the screen. The with clause causes us to slide from the old\n    # position to the new position.\n    show eileen happy at left with move\n\n    e \"Images can take at clauses that specify where on the screen\n       they are shown.\"\n\n    show eileen vhappy at left\n\n    e \"Showing a new image with the same first part of the name\n       replaces the image in the scene list.\"\n\n    hide eileen with dissolve\n\n    e \"Finally, the hide statement hides an image, which is useful\n       when a character leaves the scene.\"\n\n    show eileen happy with dissolve\n\n    e \"Don't worry, I'm not going anywhere.\"\n\n    e \"The with statement is used to cause transitions to\n       happen. Transitions like fade...\"\n\n    # This statement hides the transient stuff from being included\n    # in the next fade.\n    with None\n\n    # This with statement causes things to fade without changing the\n    # scene.\n    with fade\n\n    e \"... or dissolve ...\"\n\n    # In this block, the scene statement clears the scene list. So we\n    # have to reshow the eileen happy image, so that it appears that\n    # just the background is dissolving. Sneaky.\n    with None\n    scene bg washington\n    show eileen happy\n    with dissolve\n\n    e \"... are easily invoked.\"\n\n    e \"We now provide a series of user-interface functions, that allow\n       the programmer to create fairly complex interfaces.\"\n\n    e \"Ren'Py also includes a number of control statements, and even\n       lets you include python code.\"\n\n    e \"Rather than go into this here, you can read all about it in the\n       reference.\"\n\n    e \"You can see a number of features in action by asking me to\n       demonstrate them at the next menu.\"\n\n    e \"If you want to make changes, you can edit the script for this\n       game by editing game/script.rpy\"\n\n    e \"When you've made a change, just re-run the game to see your\n       change in action.\"\n\n    e \"Would you like to know about something else?\"\n\n    # We return back up to the menu that lets the user pick a topic.\n    return\n\n# This ends the well-commented portion of this script.\n\nlabel features:\n\n    $ save_name = \"Features\"\n\n    e \"Ren'Py provides a number of gameplay features, giving the user\n       a good experience while freeing up the game author to write his\n       game.\"\n\n    e \"What are some of these features? Well, first of all, we take\n       care of displaying the screen, as well as dialogue and menus.\"\n\n    e \"You can navigate through the game using the keyboard or the\n       mouse. If you've gotten this far, you've probably figured that\n       out already.\"\n\n    e \"Right-clicking or pressing escape will bring you to the game\n       menu.\"\n\n    e \"The game menu lets you save or load the game. Ren'Py doesn't\n       limit the number of save slots available. You can create as\n       many slots as you can stand.\"\n\n    e \"A preferences screen on the game menu lets you change the\n       fullscreen mode, control skipping, text speed, and\n       transitions, and turn sound and music on and off.\"\n\n    e \"The game menu also lets you restart or quit the game. But you\n       wouldn't want to do that, would you?\"\n\n    e \"Finally, the game menu lets you set up the game\n       preferences. These preferences are saved between games.\"\n\n    show eileen vhappy\n\n    e \"The next feature is really neat.\"\n\n    show eileen happy\n\n    menu rollback_menu:\n        \"Would you like to hear about rollback?\"\n\n        \"Yes.\":\n            pass\n\n        \"No.\":\n            jump after_rollback\n\n\n    e \"Rollback is a feature that only Ren'Py has. It lets you go back\n       in time in a game.\"\n\n    e \"For example, you can go back to a menu and save or make a\n       different choice.\"\n\n    e \"You can access it by pressing page up or scrolling up on your\n       mouse wheel.\"\n\n    e \"Why don't you try it by going back to the last menu and\n       choosing 'No.' instead of 'Yes.'\"\n\n    e \"Press page up or scroll up the mouse wheel.\"\n\n    show eileen concerned\n\n    e \"Well, are you going to try it?\"\n\n    e \"Your loss.\"\n\n    e \"Moving on.\"\n\nlabel after_rollback:\n\n    show eileen happy\n\n    e \"Ren'Py gives you a few ways of skipping dialogue. Pressing\n       control quickly skips dialogue you've seen at least once.\"\n\n    e \"Pressing Tab toggles the skipping of dialogue you've seen at\n       least once.\"\n\n    e \"Pressing page down or scrolling the mouse wheel down will let\n       you skip dialogue you've seen this session. This is useful\n       after a rollback.\"\n\n    e \"If you want to try these, you might want to rollback a bit\n       first, so you can skip over something you've seen already.\"\n\n    e \"Finally, Ren'Py has predictive image loading, so you rarely\n       have to wait for a new image to load.\"\n\n    e \"Remember, all these features are built into the engine or\n       standard library. So every game written with Ren'Py has them.\"\n\n    e \"Is there anything else you'd like to know about?\"\n\n    return\n\n\nlabel find_out_more:\n\n    $ save_name = \"Find Out More\"\n\n    e \"There are a few places you can go to find out more about\n       Ren'Py.\"\n\n    e \"The Ren'Py homepage, http://www.bishoujo.us/renpy/, is probably\n       the best place to start.\"\n\n    e \"There, you can download new versions of Ren'Py, and read the\n       tutorial online.\"\n\n    e \"If you have questions, the best place to ask them is the Ren'Py\n       forum of the Lemmasoft forums.\"\n\n    e \"Just go to http://lemmasoft.renai.us/forums/, and click on\n       Ren'Py.\"\n\n    e \"We thank Blue Lemma for hosting our forum.\"\n\n    e \"Finally, feel free to email or IM us if you need help. You can\n       get the addresses to use from http://www.bishoujo.us/renpy/.\"\n\n    e \"We really want people to make their own games with Ren'Py, and\n       if there's anything we can do to help, just tell us.\"\n\n    e \"Is there anything I can help you with now?\"\n\n    return\n\nlabel washington:\n\n    $ save_name = \"Washington, DC\"\n\n    e \"We're in Washington, DC because over Summer 2004 American\n       Bishoujo's home base was just outside of DC.\"\n\n    scene bg whitehouse\n    show eileen happy at left\n    with fade\n\n    e \"Even though we've moved back to New York, we took a bunch of\n       pictures, and decided to use them.\"\n\n    show eileen concerned at left\n\n    e \"It was easier than drawing new pictures for this demo.\"\n\n    show eileen happy at left\n\n    e \"Do you have a favorite landmark in or around DC?\"\n\n    menu:\n\n        \"The White House.\":\n\n            e \"I was supposed to go on a tour of the West Wing, once.\"\n\n            show eileen concerned\n\n            e \"They wouldn't let us in.\"\n\n            e \"The secret service guy who was supposed to show us\n               around was out of town that day.\"\n\n            e \"Too bad.\"\n\n        \"The National Mall.\":\n\n            e \"It's always fun to go down to the national mall.\"\n\n            e \"You can visit the monuments, or see one of the\n               museums.\"\n\n            e \"I guess you could run out of things to do after a while\n               but I didn't over the course of a summer.\"\n\n        \"The Netherlands Carillon.\":\n            jump netherlands\n\n    jump post_netherlands\n\nlabel netherlands:\n\n    show eileen vhappy at left\n\n    e \"You've been to the Netherlands Carillon?\"\n\n    scene bg carillon\n    show eileen vhappy at left\n    with dissolve\n\n    e \"It may not be much to look at but the sound of the bells is\n       really neat.\"\n\n    e \"I love going there. Saturdays during the summer, they have\n       these recitals in the park where a guy comes and plays the\n       bells live.\"\n\n    e \"You can climb to the top and talk to him, if you're not afraid\n       of heights.\"\n\n    e \"Once, I saw a little girl there, maybe three or four years old.\n       The guy played the bumblebee song for here, and he even let her play the last\n       note. It was so cute!\"\n\n    e \"I haven't been there for so long.\"\n\n    menu:\n        \"Would you like to go there sometime?\":\n\n            e \"You mean, together?\"\n\n            e \"Sure, why not. How does next Saturday sound?\"\n\n            e \"It's a date.\"\n\n            $ date = True\n\n        \"That sounds nice.\":\n\n            show eileen happy at left\n\n            e \"Well, it is.\"\n\nlabel post_netherlands:\n\n    scene bg washington\n    show eileen happy\n    with fade\n\n    e \"Anyway, is there anything else you want to know about Ren'Py?\"\n\n    return\n\nlabel ending:\n\n    $ save_name = \"Ending\"\n\n    e \"Well, that's okay.\"\n\n    e \"I hope you'll consider using Ren'Py for your next game\n       project.\"\n\n    show eileen vhappy\n\n    e \"Thanks for viewing this demo!\"\n\n    if date:\n        e \"And I'll see you on Saturday.\"\n\n    scene black with dissolve\n\n    \"Ren'Py and the Ren'Py demo were written by PyTom.\"\n\n    'The background music is \"Sun Flower Slow Drag\" by S. Joplin\n     (1868-1917). Thanks to the Mutopia project for making it\n       available.'\n\n    'The author would like to thank everyone who makes original\n     English-language bishoujo games, and the people on the Lemmasoft forums\n     who encouraged him.'\n\n    \"We can't wait to see what you do with this. Good luck!\"\n\n    $ minutes, seconds = divmod(int(renpy.get_game_runtime()), 60)\n    \"It took you %(minutes)d minutes and %(seconds)d seconds to\n     finish this demo.\"\n\n    $ renpy.full_restart()\n\n\nlabel speedtest:\n\n    with None\n    scene bg whitehouse\n    show eileen happy\n    with dissolve\n\n    e \"Okay, I'm going to run the speedtest on your system.\"\n\n    e \"I'll only be testing the performance of the dissolve\n       transition. It taxes your system the most, as it needs to\n       redraw the entire screen each frame.\"\n\n    $ frames = config.frames\n\n    with None\n    scene bg washington\n    show eileen happy\n    with Dissolve(5.0)\n\n    $ frames = config.frames - frames\n    $ fps = frames / 5.0\n\n    e \"Well, your system displayed %(frames)d frames in five\n       seconds. That's %(fps).1f fps.\"\n\n    e \"Remember, this is the worst-case speed, as usually we can just\n       draw the parts of the screen that have changed.\"\n\n    e \"Thanks for viewing the secret speed test.\"\n\n    return\n\n# Setup the secret key for the speedtest.\ninit:\n    python:\n        config.keymap['speedtest'] = [ 'S' ]\n        config.underlay.append(renpy.Keymap(speedtest=renpy.curried_call_in_new_context('speedtest')))\n\n\ninit:\n\n    # This is just some example code to show the ui functions in\n    # action. You probably want to delete this (and the call to\n    # day_planner above) from your game. This code isn't really all\n    # that useful except as an example.\n\n    python:\n        def day_planner():\n\n            periods = [ 'Morning', 'Afternoon', 'Evening' ]\n            choices = [ 'Study', 'Exercise',\n                        'Eat', 'Drink', 'Be Merry' ]\n\n            plan = { 'Morning' : 'Eat',\n                     'Afternoon' : 'Drink',\n                     'Evening' : 'Be Merry' }\n\n            day = 'March 25th'\n\n            stats = [\n                ('Strength', 100, 10),\n                ('Intelligence', 100, 25),\n                ('Moxie', 100, 100),\n                ('Chutzpah', 100, 75),\n                ]\n\n            editing = None\n\n            def button(text, selected, returns, **properties):\n                style = 'button'\n                style_text = 'button_text'\n\n                if selected:\n                    style='selected_button'\n                    style_text='selected_button_text'\n\n                ui.button(clicked=ui.returns(returns),\n                          style=style, **properties)\n                ui.text(text, style=style_text)\n\n\n            while True:\n\n                # Stats Window\n                ui.window(xpos=0,\n                          ypos=0,\n                          xanchor='left',\n                          yanchor='top',\n                          xfill=True,\n                          yminimum=200,\n                          )\n\n                ui.vbox()\n\n                ui.text('Statistics')\n                ui.null(height=20)\n\n                for name, range, value in stats:\n\n                    ui.hbox()\n                    ui.text(name, minwidth=150)\n                    ui.bar(600, 22, range, value, ypos=0.5, yanchor='center')\n                    ui.close()\n\n                ui.close()\n\n\n\n\n                # Period Selection Window.\n                ui.window(xpos=0,\n                          ypos=200,\n                          xanchor='left',\n                          yanchor='top',\n                          xfill=False,\n                          xminimum=300\n                          )\n\n                ui.vbox(xpos=0.5, xanchor='center')\n                ui.text(day, xpos=0.5, xanchor='center', textalign=0.5)\n                ui.null(height=20)\n\n                for i in periods:\n                    face = i + \": \" + plan[i]\n                    button(face, editing == i, (\"edit\", i))\n\n                ui.null(height=20)\n                ui.textbutton(\"Continue\", clicked=ui.returns((\"done\", True)))\n                ui.null(height=20)\n                ui.close()\n\n\n                # Choice window.\n                if editing:\n                    ui.window(xpos=300,\n                              ypos=200,\n                              xanchor='left',\n                              yanchor='top',\n                              xfill=False,\n                              xminimum=500\n                              )\n\n                    ui.vbox()\n                    ui.text(\"What will you do in the %s?\" % editing.lower())\n                    ui.null(height=20)\n\n                    for i in choices:\n                        button(i, plan[editing] == i, (\"set\", i),\n                               xpos=0, xanchor='left')\n\n                    ui.close()\n\n                # Window at the bottom.\n                ui.window()\n                ui.vbox()\n                ui.text(\"To get to the next screen, click the 'Continue' button.\")\n                ui.close()\n\n                type, value = ui.interact()\n\n                if type == \"done\":\n                    break\n\n                if type == \"edit\":\n                    editing = value\n\n                if type == \"set\":\n                    plan[editing] = value\n                    editing = None\n\n            return plan\n\ninit:\n    image movie = Movie()\n\n    python:\n        povname = \"\"\n        pov = DynamicCharacter(\"povname\", color=(255, 0, 0, 255))\n\n    $ ectc = Character('Eileen', color=(200, 255, 200, 255),\n                       ctc = anim.Blink(\"arrow.png\"))\n\n    $ ectcf = Character('Eileen', color=(200, 255, 200, 255),\n                        ctc = anim.Blink(\"arrow.png\", xpos=760, ypos=560),\n                        ctc_position=\"fixed\")\n\n    image eileen animated = Animation(\n        \"9a_vhappy.png\", 1.0,\n        \"9a_happy.png\", 1.0)\n\n    image smanim = anim.SMAnimation(\n        \"r\",\n        anim.State(\"r\", Solid((255, 0, 0, 255))),\n        anim.State(\"g\", Solid((0, 255, 0, 255))),\n        anim.State(\"b\", Solid((0, 0, 255, 255))),\n\n        anim.Edge(\"r\", .5, \"g\", dissolve),\n        anim.Edge(\"r\", .5, \"b\", dissolve),\n\n        anim.Edge(\"g\", .5, \"r\", dissolve),\n        anim.Edge(\"g\", .5, \"b\", dissolve),\n\n        anim.Edge(\"b\", .5, \"r\", dissolve),\n        anim.Edge(\"b\", .5, \"g\", dissolve),\n        )\n\n    image cyan base = Image(\"cyan.png\")\n\n    image cyan crop = im.Crop(\"cyan.png\", 100, 0, 100, 200)\n\n    image cyan composite = im.Composite((200, 300),\n                                        (0, 0), \"cyan.png\",\n                                        (0, 50), \"cyan.png\",\n                                        (0, 100), \"cyan.png\")\n\n    image cyan green = im.Map(\"cyan.png\", bmap=im.ramp(0, 0))\n\n    image cyan alpha = im.Alpha(\"cyan.png\", 0.5)\n    image eileen alpha = im.Alpha(\"9a_happy.png\", 0.5)\n\n    $ cyanpos = Position(xpos=700, xanchor='right', ypos=100, yanchor='top')\n\ninit:\n\n    $ slowcirciris = ImageDissolve(\"circiris.png\", 5.0, 8)\n    $ circirisout = ImageDissolve(\"circiris.png\", 1.0, 8)\n    $ circirisin = ImageDissolve(\"circiris.png\", 1.0, 8, reverse=True)\n    $ demotrans = ImageDissolve(\"demotrans.png\", 3.0, 128)\n\n    image circiris = \"circiris.png\"\n\nlabel demonstrate:\n\n    scene bg washington\n    show eileen happy\n\n    e \"I can give you a demonstration of some of the features in\n       Ren'Py, but you'll have to tell me what it is you'd like to\n       have demonstrated.\"\n\n    menu demo_menu:\n\n        \"Simple transitions, updated in 4.8.5\":\n\n            e \"Okay, I can tell you about simple transitions. We call\n               them simple because they aren't that flexible.\"\n\n            e \"But don't let that get you down, since they're the\n               transitions you'll probably use the most.\"\n\n            with None\n            scene bg whitehouse\n            show eileen happy\n            with dissolve\n\n            e \"The dissolve transition is probably the most useful,\n               blending one scene into another.\"\n\n            with None\n            with fade\n\n            e \"The fade transition fades to black, and then fades back\n               in to the new scene.\"\n\n            e \"If you're going to stay at a black screen, you'll\n               probably want to use dissolve rather than fade.\"\n\n            with None\n            scene bg washington\n            show eileen happy\n            with pixellate\n\n            e \"The pixellate transition pixellates out the old scene,\n               switches to the new scene, and then unpixellates that.\"\n\n            e \"It's probably not appropriate for most games, but we\n               think it's kind of neat.\"\n\n            e \"Finally, we can point out that motions can be used as\n               transitions.\"\n\n            \"...\"\n\n            \"......\"\n\n            $ renpy.play('punch.wav')\n            with vpunch\n\n            e \"Hey! Pay attention.\"\n\n            e \"I was about to demonstrate vpunch... well, I guess I just\n               did.\"\n\n            $ renpy.play('punch.wav')\n            with hpunch\n\n            e \"We can also shake the screen horizontally, with hpunch.\"\n\n        \"ImageDissolve transitions, added in 4.8.7.\":\n\n            e \"ImageDissolve allows us to have dissolve transitions that are\n               controlled by images.\"\n\n            e \"This lets us specify very complex transitions, fairly\n               simply.\"\n\n            e \"Let's try some, and then I'll show how they work.\"\n\n            e \"There are two ImageDissolve transitions present by\n               default in the standard library.\"\n\n            scene black with blinds\n            scene bg washington\n            show eileen happy\n            with blinds\n\n            e \"The blinds transition opens and closes what looks like\n               vertical blinds.\"\n\n            scene black with squares\n            scene bg washington\n            show eileen happy\n            with squares\n\n            e \"The squares transition uses these squares to show\n               things.\"\n\n            e \"I'm not sure why anyone would want to use it, but it\n               was used in some translated games, so we added it.\"\n\n            e \"There are also a few transitions that aren't in the\n               standard library.\"\n\n            e \"These ones require images the size of the screen, and\n               so we couldn't include them as the size of the screen\n               can change from game to game.\"\n\n            e \"You can find them defined in the source of the demo\n               script.\"\n\n            scene black with circirisin\n\n            e \"We can hide things with a circirisin...\"\n\n            with None\n            scene bg washington\n            show eileen happy\n            with circirisout\n\n            e \"... and show them again with a circirisout.\"\n\n            e \"It's even possible to have weird custom transitions.\"\n\n            scene circiris with demotrans\n\n            e \"What we're showing here is the picture that's used in\n               the circiris transitions.\"\n\n            e \"If you take a look, the center of it is white, while\n               the edges are darker.\"\n\n            e \"When we use an ImageDissolve, the white will dissolve\n               in first, followed by progressively darker colors.\"\n\n            e \"Let's try it.\"\n\n            with None\n            scene bg washington\n            show eileen happy\n            with slowcirciris\n\n\n            e \"It's also possible to reverse the transition, so that\n               the black pixels are dissolved in first.\"\n\n        \"CropMove transitions, added in 4.5.\":\n\n            e \"The CropMove transition class lets us provide a wide\n               range of transition effects.\"\n\n            hide eileen with dissolve\n\n            e \"I'll stand offscreen, so you can see some of its modes. I'll read\n               out the mode name after each transition.\"\n\n            scene bg whitehouse with wiperight\n\n            e \"We first have wiperight...\"\n\n            scene bg washington with wipeleft\n\n            e \"...followed by wipeleft... \"\n\n            scene bg whitehouse with wipeup\n\n            e \"...wipeup...\"\n\n            scene bg washington with wipedown\n\n            e \"...and wipedown.\"\n\n            e \"Next, the slides.\"\n\n            scene bg whitehouse with slideright\n\n            e \"Slideright...\"\n\n            scene bg washington with slideleft\n\n            e \"...slideleft...\"\n\n            scene bg whitehouse with slideup\n\n            e \"...slideup...\"\n\n            scene bg washington with slidedown\n\n            e \"and slidedown.\"\n\n            e \"While the slide transitions slide in the new scene, the\n               slideaways slide out the old scene.\"\n\n            scene bg whitehouse with slideawayright\n\n            e \"Slideawayright...\"\n\n            scene bg washington with slideawayleft\n\n            e \"...slideawayleft...\"\n\n            scene bg whitehouse with slideawayup\n\n            e \"...slideawayup...\"\n\n            scene bg washington with slideawaydown\n\n            e \"and slideawaydown.\"\n\n            e \"We also have a couple of transitions that use a\n               rectangular iris.\"\n\n            scene bg whitehouse with irisout\n\n            e \"There's irisout...\"\n\n            with None\n            scene bg washington\n            show eileen happy\n            with irisin\n\n            e \"... and irisin.\"\n\n            e \"It's enough to make you feel a bit dizzy.\"\n\n        \"Positions and movement, updated in 4.8.\":\n\n            e \"I'm not stuck standing in the middle of the screen,\n               even though I like being the center of attention.\"\n\n            e \"Positions, given with an at clause, specify where I'm\n               standing.\"\n\n            e \"The move transition moves around images that have\n               changed position.\"\n\n            e \"For example...\"\n\n            show eileen happy at offscreenleft with move\n\n            e \"I can move over to the offscreenleft position, just off\n               the left side of the screen.\"\n\n            show eileen happy at left with move\n\n            e \"The left position has my left side border the left\n               margin of the screen.\"\n\n            show eileen happy at center with move\n\n            e \"I can also move to the center...\"\n\n            show eileen happy at right with move\n\n            e \"... the right ...\"\n\n            show eileen happy at offscreenright with move\n\n            e \"... or even to offscreenright, off the right-hand side\n               of the screen.\"\n\n            show eileen happy at right with move\n\n            e \"We don't limit you to these five positions either. You\n               can always create your own Position objects.\"\n\n            # This is necessary to restart the time at which we are\n            # shown.\n            hide eileen happy\n\n            show eileen happy at Move((1.0, 1.0, 'right', 'bottom'),\n                                      (0.0, 1.0, 'left', 'bottom'),\n                                      4.0, repeat=True, bounce=True)\n\n            e \"It's also possible to have a movement happen while\n               showing dialogue on the screen, using the Move function.\"\n\n            e \"Move can repeat a movement, and even have it bounce\n               back and forth, like I'm doing now.\"\n\n            scene bg onememorial at Pan((0, 800), (0, 0), 10.0) with dissolve\n\n            e \"Finally, we can pan around an image larger than the\n               screen, using the Pan function in an at\n               clause.\"\n\n            e \"That's what we're doing now, panning up a picture of\n               the memorial to the Big Red One.\"\n\n            with None\n            scene bg washington\n            show eileen happy\n            with dissolve\n\n        \"Animation, updated in 4.8.5\":\n\n            e \"Ren'Py supports a number of ways of creating\n               animations.\"\n\n            e \"These animations let you vary images, independent of\n               the user's clicks.\"\n\n            show eileen animated\n\n            e \"For example, I'm switching my expression back and\n               forth, once a second.\"\n\n            e \"Even though you clicked, I'm still doing it.\"\n\n            e \"This is an example of the Animation function at work.\"\n\n            show eileen happy\n\n            e \"The Animation function is limited to simple lists of\n               images, with fixed delays between them.\"\n\n            e \"The sequence can repeat, or can stop after one\n               go-through.\"\n\n            e \"If you want more control, you can use the\n               anim.SMAnimation function.\"\n\n            e \"It can randomly change images, and even apply\n               transitions to changes.\"\n\n            with None\n            scene smanim\n            show eileen happy\n            with dissolve\n\n            e \"Here, we randomly dissolve the background between red,\n               green, and blue images.\"\n\n            e \"Psychadelic.\"\n\n            with None\n            scene bg washington\n            show eileen happy\n            with dissolve\n\n            e \"It's probably best if we stop here, before somebody's\n               brain explodes.\"\n\n        \"Text tags, updated in 5.1.4.\":\n\n            e \"Text tags let us control the appearance of text that is\n               shown to the user.\"\n\n            e \"Text tags can make text {b}bold{/b}, {i}italic{/i}, or\n               {u}underlined{/u}.\"\n\n            e \"They can make the font size {size=+12}bigger{/size} or\n               {size=-8}smaller{/size}.\"\n\n            e \"They let you pause{w} the display of the text,\n               optionally with{p}line breaks.\"\n\n            e \"They let you include {image=slider_idle.png} images\n               inside text.\"\n\n            e \"They can even change the\n               {color=#f00}color{/color}\n               {color=#ff0}of{/color}\n               {color=#0f0}the{/color}\n               {color=#0ff}text{/color}.\"\n\n            e \"There are also bold, italic, and underline style properties, which can\n               be styled onto any text.\"\n\n            e \"If you find yourself using text tags on every line, you\n               should probably look at style properties instead.\"\n\n            e \"Used with care, text tags can enhance {b}your{/b} game.\"\n\n            e \"{u}Used{/u} with {i}abandon,{/i} they {b}can{/b} make {b}your{/b}\n               game {color=#333}hard{/color} {color=#888}to{/color} {color=#ccc}read{/color}.\"\n\n            e \"With great power comes great responsibility, after all.\"\n\n            e \"And we want to give you all the power you need.\"\n\n\n        \"Music, sound and movies, updated in 4.5.\":\n\n            e \"Ren'Py supports a number of multimedia functions.\"\n\n            e \"You're probably hearing music playing in the\n               background.\"\n\n\n            $ renpy.music_stop(fadeout=0.5)\n            e \"We can stop it...\"\n\n\n            $ renpy.music_start('sun-flower-slow-drag.mid')\n            e \"... and start it playing again.\"\n\n            # This plays a sound effect.\n            $ renpy.play(\"18005551212.wav\")\n\n            e \"We can also play up to eight channels of sound effects\n               on top of the music.\"\n\n            e \"We ship, in the extras/ directory, code to support\n               characters having voice.\"\n\n            e \"Finally, we support playing mpeg movies.\"\n\n            if renpy.exists('Eisenhow1952.mpg'):\n\n                e \"Since you downloaded the Eisenhower commercial, I can show\n                   it to you as a cutscene.\"\n\n                e \"You can click to continue if it gets on your nerves too\n                   much.\"\n\n                $ renpy.movie_cutscene('Eisenhow1952.mpg', 63.0)\n\n                hide eileen\n                show movie at Position(xpos=420, ypos=25, xanchor='left', yanchor='top')\n                show eileen happy\n\n                $ renpy.movie_start_displayable('Eisenhow1952.mpg', (352, 240))\n\n                e \"Ren'Py can even overlay rendered images on top of a movie,\n                   although that's more taxing for your CPU.\"\n\n                e \"It's like I'm some sort of newscaster or something.\"\n\n                $ renpy.movie_stop()\n                hide movie\n\n            else:\n\n                e \"You haven't downloaded the Eisenhower commercial, so we\n                   can't demonstrate it.\"\n\n            e \"That's it for multimedia.\"\n\n        \"Image Operations, added in 4.8.5\":\n\n            e \"Image operations allow one to manipulate images as they\n               are loaded in.\"\n\n            e \"These are efficent, as they are only evaluated when an\n               image is first loaded.\"\n\n            e \"This way, there's no extra work that needs to be done\n               when each frame is drawn to the screen.\"\n\n            show eileen happy at left with move\n            show cyan base at cyanpos with dissolve\n\n            e \"Let me show you a test image, a simple cyan circle.\"\n\n            e \"We'll be applying some image operations to it, to see\n               how they can be used.\"\n\n            show cyan crop at cyanpos with dissolve\n\n            e \"The im.Crop operation can take the image, and chop it\n               up into a smaller image.\"\n\n            show cyan composite at cyanpos with dissolve\n\n            e \"The im.Composite operation lets us take multiple images,\n               and draw them into a single image.\"\n\n            e \"While you can do this by showing multiple images, this\n               is more efficent, if more complex.\"\n\n            show cyan green at cyanpos with dissolve\n\n            e \"The im.Map operation lets us mess with the red, green,\n               blue, and alpha channels of an image.\"\n\n            e \"In this case, we removed all the blue from the image,\n               leaving only the green component of cyan.\"\n\n            show cyan alpha at cyanpos with dissolve\n\n            e \"The im.Alpha operation can adjust the alpha channel on\n               an image, making things partially transparent.\"\n\n            show eileen alpha at left with dissolve\n\n            e \"It's useful if a character just happens to be ghost.\"\n\n            with None\n            hide cyan\n            show eileen happy at left\n            with dissolve\n\n            e \"But that's not the case with me.\"\n\n            show eileen happy with move\n\n\n        \"User interaction.\":\n\n            e \"Ren'Py gives a number of ways of interacting with the\n               user.\"\n\n            e \"You've already seen say statements and menus.\"\n\n            e \"We can also prompt the user to enter some text.\"\n\n            $ povname = renpy.input(\"What is your name?\")\n\n            pov \"My name is %(povname)s.\"\n\n\n            e \"Imagemaps let the user click on an image to make a\n               choice.\"\n\n            # This is an imagemap. It consists of two images, and a list of\n            # hotspots. For each hotspot we give the coordinates of the left,\n            # top, right, and bottom sides, and the value to return if it is\n            # picked.\n\n            $ result = renpy.imagemap(\"ground.png\", \"selected.png\", [\n                (100, 100, 300, 400, \"eileen\"),\n                (500, 100, 700, 400, \"lucy\")\n                ])\n\n            # We've assigned the chosen result from the imagemap to the\n            # result variable. We can use an if statement to vary what\n            # happens based on the user's choice.\n\n            if result == \"eileen\":\n                show eileen vhappy\n                e \"You picked me!\"\n\n            elif result == \"lucy\":\n                show eileen concerned\n                e \"It looks like you picked Lucy.\"\n\n                # Eileen is being a bit possesive here. :-P\n                if date:\n                    e \"You can forget about Saturday.\"\n                    $ date = False\n\n            show eileen happy\n\n            e \"While these constructs are probably enough for most\n               visual novels, dating simulations may be more\n               complicated.\"\n\n            e \"The ui functions allow you to create quite complicated\n               interfaces.\"\n\n            e \"For example, try the following scheduling and stats screen,\n               which could be used by a stat-based dating simulation.\"\n\n            $ day_planner()\n\n            e \"The ui functions can be used to rewrite many parts of\n               the interface.\"\n\n            e \"Hopefully, this gives you enough power to write any\n               visual novel you want.\"\n\n        \"Potpourri, added in 5.1.2.\":\n\n            e \"Welcome to the potpourri section of the demo.\"\n\n            e \"Here, we demonstrate features that don't fit in any of\n               the other sections, but don't warrant their own\n               section.\"\n\n            ectc \"Here, we demonstrate a click to continue\n                  indicator. In this example, it's nestled in with the\n                  text.\"\n\n            ectc \"This also demonstrates the use of the anim.Blink\n                  function.\"\n\n            ectcf \"A click to continue image can also be placed at a\n                   fixed location on the screen.\"\n\n            e \"That's it for now.\"\n\n\n        \" \" # Empty, so we have a blank line.\n\n        \"That's enough for me.\":\n\n            return\n\n    e \"Is there anything else you want demonstrated?\"\n\n    jump demo_menu\n\n\n# Here, are a number of customizations that make the game look\n# better. We place them down here at the bottom, to make the first few\n# lines of the script look better.\n#\n# These can be deleted without issue, if you do not want them.\n\ninit:\n\n    # Change some styles, to add images in the background of\n    # the menus and windows.\n    $ style.mm_root_window.background = Image(\"mainmenu.jpg\")\n    $ style.gm_root_window.background = Image(\"gamemenu.jpg\")\n    $ style.window.background = Frame(\"frame.png\", 25, 25)\n\n    # Change the look of the slider.\n    $ style.bar.left_gutter = 10\n    $ style.bar.right_gutter = 12\n    $ style.bar.left_bar = Frame(\"slider_full.png\", 10, 0)\n    $ style.bar.right_bar = Frame(\"slider_empty.png\", 12, 0)\n    $ style.bar.thumb = Image(\"slider_idle.png\")\n    $ style.bar.hover_thumb = Image(\"slider_hover.png\")\n    $ style.bar.thumb_shadow = Image(\"slider_shadow.png\")\n    $ style.bar.thumb_offset = -10\n\n    # Change some styles involving the margins and padding of the\n    # default window. (We need this, as we use a frame image that\n    # includes a drop-shadow.)\n    $ style.window.xmargin = 0\n    $ style.window.ymargin = 0\n    $ style.window.xpadding = 20\n    $ style.window.top_padding = 5\n    $ style.window.bottom_padding = 15\n\n    # Interface sounds, just for the heck of it.\n    $ style.button.activate_sound = 'click.wav'\n    $ style.imagemap.activate_sound = 'click.wav'\n    $ library.enter_sound = 'click.wav'\n    $ library.exit_sound = 'click.wav'\n    $ library.sample_sound = \"18005551212.wav\"\n\n    # Select the transitions that are used when entering and exiting\n    # the game menu.\n    $ library.enter_transition = pixellate\n    $ library.exit_transition = pixellate\n\n# The splashscreen is called, if it exists, before the main menu is\n# shown the first time. It is not called if the game has restarted.\n\n# We'll comment it out for now.\n#\n# label splashscreen:\n#     scene black\n#     show text \"American Bishoujo Presents...\" with dissolve\n#     $ renpy.pause(1.0)\n#     hide text with dissolve\n#\n#     return"
  },
  {
    "path": "src/test/resources/samples/langs/RenderScript/convolve3x3.rs",
    "content": "/*\n * Copyright (C) 2012 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma version(1)\n#pragma rs java_package_name(com.android.gallery3d.filtershow.filters)\n#pragma rs_fp_relaxed\n\nint32_t gWidth;\nint32_t gHeight;\nconst uchar4 *gPixels;\nrs_allocation gIn;\n\nfloat gCoeffs[9];\n\nvoid root(const uchar4 *in, uchar4 *out, const void *usrData, uint32_t x, uint32_t y) {\n    uint32_t x1 = min((int32_t)x+1, gWidth-1);\n    uint32_t x2 = max((int32_t)x-1, 0);\n    uint32_t y1 = min((int32_t)y+1, gHeight-1);\n    uint32_t y2 = max((int32_t)y-1, 0);\n\n    float4 p00 = rsUnpackColor8888(gPixels[x1 + gWidth * y1]);\n    float4 p01 = rsUnpackColor8888(gPixels[x + gWidth * y1]);\n    float4 p02 = rsUnpackColor8888(gPixels[x2 + gWidth * y1]);\n    float4 p10 = rsUnpackColor8888(gPixels[x1 + gWidth * y]);\n    float4 p11 = rsUnpackColor8888(gPixels[x + gWidth * y]);\n    float4 p12 = rsUnpackColor8888(gPixels[x2 + gWidth * y]);\n    float4 p20 = rsUnpackColor8888(gPixels[x1 + gWidth * y2]);\n    float4 p21 = rsUnpackColor8888(gPixels[x + gWidth * y2]);\n    float4 p22 = rsUnpackColor8888(gPixels[x2 + gWidth * y2]);\n\n    p00 *= gCoeffs[0];\n    p01 *= gCoeffs[1];\n    p02 *= gCoeffs[2];\n    p10 *= gCoeffs[3];\n    p11 *= gCoeffs[4];\n    p12 *= gCoeffs[5];\n    p20 *= gCoeffs[6];\n    p21 *= gCoeffs[7];\n    p22 *= gCoeffs[8];\n\n    p00 += p01;\n    p02 += p10;\n    p11 += p12;\n    p20 += p21;\n\n    p22 += p00;\n    p02 += p11;\n\n    p20 += p22;\n    p20 += p02;\n\n    p20 = clamp(p20, 0.f, 1.f);\n    *out = rsPackColorTo8888(p20.r, p20.g, p20.b);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/RenderScript/scenegraph_objects.rsh",
    "content": "// Copyright (C) 2011-2012 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#pragma version(1)\n\n#pragma rs java_package_name(com.android.scenegraph)\n\n#ifndef _TRANSFORM_DEF_\n#define _TRANSFORM_DEF_\n\n#include \"rs_graphics.rsh\"\n\n#define TRANSFORM_NONE      0\n#define TRANSFORM_TRANSLATE 1\n#define TRANSFORM_ROTATE    2\n#define TRANSFORM_SCALE     3\n\n#define CULL_FRUSTUM 0\n#define CULL_ALWAYS  2\n\n#define LIGHT_POINT       0\n#define LIGHT_DIRECTIONAL 1\n\n// Shader params that involve only data\n#define SHADER_PARAM_DATA_ONLY                 10000\n#define SHADER_PARAM_FLOAT4_DATA               10001\n#define SHADER_PARAM_TRANSFORM_DATA            10002\n#define SHADER_PARAM_TRANSFORM_MODEL           10003\n\n// Shader params that involve camera\n#define SHADER_PARAM_CAMERA                    1000\n#define SHADER_PARAM_FLOAT4_CAMERA_POS         1001\n#define SHADER_PARAM_FLOAT4_CAMERA_DIR         1002\n#define SHADER_PARAM_TRANSFORM_VIEW            1003\n#define SHADER_PARAM_TRANSFORM_PROJ            1004\n#define SHADER_PARAM_TRANSFORM_VIEW_PROJ       1005\n#define SHADER_PARAM_TRANSFORM_MODEL_VIEW      1006\n#define SHADER_PARAM_TRANSFORM_MODEL_VIEW_PROJ 1007\n\n// Shader Params that only involve lights\n#define SHADER_PARAM_LIGHT                     100\n#define SHADER_PARAM_FLOAT4_LIGHT_COLOR        103\n#define SHADER_PARAM_FLOAT4_LIGHT_POS          104\n#define SHADER_PARAM_FLOAT4_LIGHT_DIR          105\n\n#define SHADER_PARAM_TEXTURE                   10\n\n#define TEXTURE_NONE          0\n#define TEXTURE_2D            1\n#define TEXTURE_CUBE          2\n#define TEXTURE_RENDER_TARGET 3\n\ntypedef struct TransformComponent_s {\n    float4 value;\n    int type;\n    rs_allocation name;\n} SgTransformComponent;\n\ntypedef struct __attribute__((packed, aligned(4))) SgTransform {\n    rs_matrix4x4 globalMat;\n    rs_matrix4x4 localMat;\n\n    rs_allocation components;\n    int isDirty;\n\n    rs_allocation children;\n    rs_allocation name;\n\n    // Used to check whether transform params need to be updated\n    uint32_t timestamp;\n} SgTransform;\n\ntypedef struct VertexShader_s {\n    rs_program_vertex program;\n    // Buffer with vertex constant data\n    rs_allocation shaderConst;\n    // ShaderParam's that populate data\n    rs_allocation shaderConstParams;\n    // location of the per object constants on the buffer\n    int objectConstIndex;\n} SgVertexShader;\n\ntypedef struct FragmentShader_s {\n    rs_program_fragment program;\n    // Buffer with vertex constant data\n    rs_allocation shaderConst;\n    // ShaderParam's that populate data\n    rs_allocation shaderConstParams;\n    // ShaderParam's that set textures\n    rs_allocation shaderTextureParams;\n    // location of the per object constants on the buffer\n    int objectConstIndex;\n} SgFragmentShader;\n\ntypedef struct RenderState_s {\n    rs_allocation pv; // VertexShader struct\n    rs_allocation pf; // FragmentShader struct\n    rs_program_store ps;\n    rs_program_raster pr;\n} SgRenderState;\n\ntypedef struct Renderable_s {\n    rs_allocation render_state;\n    // Buffer with vertex constant data\n    rs_allocation pv_const;\n    // ShaderParam's that populate data\n    rs_allocation pv_constParams;\n    // Buffer with fragment constant data\n    rs_allocation pf_const;\n    // ShaderParam's that populate data\n    rs_allocation pf_constParams;\n    rs_allocation pf_textures[8];\n    int pf_num_textures;\n    rs_mesh mesh;\n    int meshIndex;\n    rs_allocation transformMatrix;\n    rs_allocation name;\n    float4 boundingSphere;\n    float4 worldBoundingSphere;\n    int bVolInitialized;\n    int cullType; // specifies whether to frustum cull\n    int isVisible;\n} SgRenderable;\n\ntypedef struct RenderPass_s {\n    rs_allocation color_target;\n    rs_allocation depth_target;\n    rs_allocation camera;\n    rs_allocation objects;\n\n    float4 clear_color;\n    float clear_depth;\n    bool should_clear_color;\n    bool should_clear_depth;\n} SgRenderPass;\n\ntypedef struct Camera_s {\n    rs_matrix4x4 proj;\n    rs_matrix4x4 view;\n    rs_matrix4x4 viewProj;\n    float4 position;\n    float near;\n    float far;\n    float horizontalFOV;\n    float aspect;\n    rs_allocation name;\n    rs_allocation transformMatrix;\n    float4 frustumPlanes[6];\n\n    int isDirty;\n    // Timestamp of the camera itself to signal params if anything changes\n    uint32_t timestamp;\n    // Timestamp of our transform\n    uint32_t transformTimestamp;\n} SgCamera;\n\ntypedef struct Light_s {\n    float4 position;\n    float4 color;\n    float intensity;\n    int type;\n    rs_allocation name;\n    rs_allocation transformMatrix;\n} SgLight;\n\n// This represents the shader parameter data needed to set a float or transform data\ntypedef struct ShaderParamData_s {\n    int type;\n    float4 float_value;\n    uint32_t timestamp;\n    rs_allocation paramName;\n    rs_allocation camera;\n    rs_allocation light;\n    rs_allocation transform;\n    rs_allocation texture;\n} SgShaderParamData;\n\n// This represents a shader parameter that knows how to update itself for a given\n// renderable or shader and contains a timestamp for the last time this buffer was updated\ntypedef struct ShaderParam_s {\n    // Used to check whether transform params need to be updated\n    uint32_t transformTimestamp;\n    // Used to check whether data params need to be updated\n    // These are used when somebody set the matrix of float value directly in java\n    uint32_t dataTimestamp;\n    // Specifies where in the constant buffer data gets written to\n    int bufferOffset;\n    // An instance of SgShaderParamData that could be shared by multiple objects\n    rs_allocation data;\n    // How many components of the vector we need to write\n    int float_vecSize;\n} SgShaderParam;\n\n// This represents a texture object\ntypedef struct Texture_s {\n    uint32_t type;\n    rs_allocation texture;\n} SgTexture;\n\nstatic void printName(rs_allocation name) {\n    if (!rsIsObject(name)) {\n        rsDebug(\"no name\", 0);\n        return;\n    }\n\n    rsDebug((const char*)rsGetElementAt(name, 0), 0);\n}\n\nstatic void printCameraInfo(const SgCamera *cam) {\n    rsDebug(\"***** Camera information. ptr:\", cam);\n    printName(cam->name);\n    const SgTransform *camTransform = (const SgTransform *)rsGetElementAt(cam->transformMatrix, 0);\n    rsDebug(\"Transform name:\", camTransform);\n    printName(camTransform->name);\n\n    rsDebug(\"Aspect: \", cam->aspect);\n    rsDebug(\"Near: \", cam->near);\n    rsDebug(\"Far: \", cam->far);\n    rsDebug(\"Fov: \", cam->horizontalFOV);\n    rsDebug(\"Position: \", cam->position);\n    rsDebug(\"Proj: \", &cam->proj);\n    rsDebug(\"View: \", &cam->view);\n}\n\nstatic void printLightInfo(const SgLight *light) {\n    rsDebug(\"***** Light information. ptr:\", light);\n    printName(light->name);\n    const SgTransform *lTransform = (const SgTransform *)rsGetElementAt(light->transformMatrix, 0);\n    rsDebug(\"Transform name:\", lTransform);\n    printName(lTransform->name);\n\n    rsDebug(\"Position: \", light->position);\n    rsDebug(\"Color : \", light->color);\n    rsDebug(\"Intensity: \", light->intensity);\n    rsDebug(\"Type: \", light->type);\n}\n\nstatic void getCameraRay(const SgCamera *cam, int screenX, int screenY, float3 *pnt, float3 *vec) {\n    rsDebug(\"=================================\", screenX);\n    rsDebug(\"Point X\", screenX);\n    rsDebug(\"Point Y\", screenY);\n\n    rs_matrix4x4 mvpInv;\n    rsMatrixLoad(&mvpInv, &cam->viewProj);\n    rsMatrixInverse(&mvpInv);\n\n    float width = (float)rsgGetWidth();\n    float height = (float)rsgGetHeight();\n\n    float4 pos = {(float)screenX, height - (float)screenY, 0.0f, 1.0f};\n\n    pos.x /= width;\n    pos.y /= height;\n\n    rsDebug(\"Pre Norm X\", pos.x);\n    rsDebug(\"Pre Norm Y\", pos.y);\n\n    pos.xy = pos.xy * 2.0f - 1.0f;\n\n    rsDebug(\"Norm X\", pos.x);\n    rsDebug(\"Norm Y\", pos.y);\n\n    pos = rsMatrixMultiply(&mvpInv, pos);\n    float oneOverW = 1.0f / pos.w;\n    pos.xyz *= oneOverW;\n\n    rsDebug(\"World X\", pos.x);\n    rsDebug(\"World Y\", pos.y);\n    rsDebug(\"World Z\", pos.z);\n\n    rsDebug(\"Cam X\", cam->position.x);\n    rsDebug(\"Cam Y\", cam->position.y);\n    rsDebug(\"Cam Z\", cam->position.z);\n\n    *vec = normalize(pos.xyz - cam->position.xyz);\n    rsDebug(\"Vec X\", vec->x);\n    rsDebug(\"Vec Y\", vec->y);\n    rsDebug(\"Vec Z\", vec->z);\n    *pnt = cam->position.xyz;\n}\n\nstatic bool intersect(const SgRenderable *obj, float3 pnt, float3 vec) {\n    // Solving for t^2 + Bt + C = 0\n    float3 originMinusCenter = pnt - obj->worldBoundingSphere.xyz;\n    float B = dot(originMinusCenter, vec) * 2.0f;\n    float C = dot(originMinusCenter, originMinusCenter) -\n              obj->worldBoundingSphere.w * obj->worldBoundingSphere.w;\n\n    float discriminant = B * B - 4.0f * C;\n    if (discriminant < 0.0f) {\n        return false;\n    }\n    discriminant = sqrt(discriminant);\n\n    float t0 = (-B - discriminant) * 0.5f;\n    float t1 = (-B + discriminant) * 0.5f;\n\n    if (t0 > t1) {\n        float temp = t0;\n        t0 = t1;\n        t1 = temp;\n    }\n\n    // The sphere is behind us\n    if (t1 < 0.0f) {\n        return false;\n    }\n    return true;\n}\n\n\n#endif // _TRANSFORM_DEF_\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ring/hello.ring",
    "content": "# The Ring Standard Library\n# Game Engine for 2D Games\n# Flappy Bird 3000 Game\n# 2016, Mahmoud Fayed <msfclipper@yahoo.com>\n\noGameState = NULL\n\nLoad \"gameengine.ring\"\n\nfunc main\n\n\toGame = New Game  \n\n\twhile true\n\n\toGameState = New GameState\n\n\toGame {\n\t\ttitle = \"Flappy Bird 3000\"\n\t\tsprite\n\t\t{\n\t\t\tfile = \"images/fbback.png\"\n\t\t\tx = 0 y=0 width=800 height = 600 scaled = true animate = false\n\t\t\tkeypress = func ogame,oself,nKey {\n\t\t\t\tif nkey = key_esc or nKey = GE_AC_BACK\n\t\t\t\t\togame.shutdown()\n\t\t\t\tbut nKey = key_space\n\t\t\t\t\toGameState.startplay=true\n\t\t\t\t\togame.shutdown=true\n\t\t\t\tok\n\t\t\t}\n\t\t\tmouse = func ogame,oself,nType,aMouseList {\n\t\t\t\tif nType = GE_MOUSE_UP\n\t\t\t\t\tcall oself.keypress(oGame,oSelf,Key_Space)\n\t\t\t\tok\n\t\t\t}\n\t\t}\n\t\ttext {\n\t\t\tanimate = false\n\t\t\tsize = 35\n\t\t\tfile = \"fonts/pirulen.ttf\"\n\t\t\ttext = \"Flappy Bird 3000\"\n\t\t\tx = 150\ty=50\n\t\t}\n\t\ttext {\n\t\t\tanimate = false\n\t\t\tsize = 25\n\t\t\tfile = \"fonts/pirulen.ttf\"\n\t\t\ttext = \"Version 1.0\"\n\t\t\tx = 280\ty=100\n\t\t}\n\t\ttext {\n\t\t\tanimate = false\n\t\t\tsize = 16\n\t\t\tfile = \"fonts/pirulen.ttf\"\n\t\t\ttext = \"(C) 2016, Mahmoud Fayed\"\n\t\t\tx = 245\ty=140\n\t\t}\n\n\t\ttext {\n\t\t\tanimate = false\n\t\t\tsize = 25\n\t\t\tfile = \"fonts/pirulen.ttf\"\n\t\t\ttext = \"To Win Get Score = 3000\"\n\t\t\tx = 150\ty=270\n\t\t}\n\n\t\ttext {\n\t\t\tanimate = false\n\t\t\tsize = 25\n\t\t\tfile = \"fonts/pirulen.ttf\"\n\t\t\ttext = \"Press Space to start\"\n\t\t\tx = 190\ty=470\n\t\t}\n\t\ttext {\n\t\t\tanimate = false\n\t\t\tsize = 20\n\t\t\tfile = \"fonts/pirulen.ttf\"\n\t\t\ttext = \"Press Esc to Exit\"\n\t\t\tx = 260\ty=510\n\t\t}\n\n\t\tanimate {\n\t\t\tfile = \"images/fbbird.png\"\n\t\t\tx = 200\n\t\t\ty = 200\n\t\t\tframewidth = 20\n\t\t\tscaled = true\n\t\t\theight = 50\n\t\t\twidth = 50\n\t\t\tnStep = 3\n\t\t\ttransparent = true\n\t\t\tanimate = true\n\t\t\tdirection = ge_direction_random\n\t\t\tstate = func oGame,oSelf {\n\t\t\t\toSelf {\n\t\t\t\t\tnStep--\n\t\t\t\t\tif nStep = 0\n\t\t\t\t\t\tnStep = 3\n\t\t\t\t\t\tif frame < 3\n\t\t\t\t\t\t\tframe++\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tframe=1\n\t\t\t\t\t\tok\n\t\t\t\t\tok\n\t\t\t\t\tif x <= 0 x=0 ok\n\t\t\t\t\tif y <= 0 y=0 ok\n\t\t\t\t\tif x >= 750 x= 750 ok\n\t\t\t\t\tif y > 550 y=550 ok\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSound {\n\t\t\tfile = \"sound/music2.wav\"\n\t\t}\n\t}\n\tif oGameState.startplay\n\t\toGame.refresh()\n\t\tplaystart(oGame)\n\t\toGame.refresh()\n\tok\n\n\tend\n\n\nfunc playstart oGame\n\n\toGame {\n\t\tFPS = 60\n\t\tFixedFPS = 120\n\t\tTitle = \"Flappy Bird 3000\"\n\t\tSprite {\n\t\t\tfile = \"images/fbback.png\"\n\t\t\tx = 0 y=0 width=800 height = 600 scaled = true animate = false\n\t\t\tkeypress = func ogame,oself,nKey {\n\t\t\t\tif nkey = key_esc or nKey = GE_AC_BACK\n\t\t\t\t\togame.shutdown()\n\t\t\t\tok\n\t\t\t}\n\t\t}\n\n\t\tMap {\n\t\t\tblockwidth = 80\n\t\t\tblockheight = 80\n\t\t\taMap = [\n\t\t\t\t \t[0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0],\n\t\t\t\t\t[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0],\n\t\t\t\t\t[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0],\n\t\t\t\t\t[0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0],\n\t\t\t\t\t[0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0],\n\t\t\t\t\t[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],\n\t\t\t\t\t[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],\n\t\t\t\t\t[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]\n\t\t\t\t]\n\t\t\tnewmap(aMap)\n\t\t\taImages = [\"images/fbwall.png\",\"images/fbwallup.png\",\n\t\t\t\t\t\"images/fbwalldown.png\"]\n\t\t\tstate = func oGame,oSelf {\n\t\t\t\tif oGameState.gameresult = false\n\t\t\t\t\tpx = oGame.aObjects[3].x\n\t\t\t\t\tpy = oGame.aObjects[3].y\n\t\t\t\t\toSelf {\n\t\t\t\t\t\tx -=  3\n\t\t\t\t\t\tif x < - 2100\n\t\t\t\t\t\t\tx = 0\n\t\t\t\t\t\t\tnewmap(aMap)\n\t\t\t\t\t\tok\n\t\t\t\t\t\tnCol =  getcol(px,0)\n\t\t\t\t\t\tif nCol=11 or nCol=15 or nCol=19 or nCol=23 or nCol=27\n\t\t\t\t\t\t\tif nCol != oGameState.lastcol\n\t\t\t\t\t\t\t\toGameState.lastcol = nCol\n\t\t\t\t\t\t\t\toGameState.Score += 100\n\t\t\t\t\t\t\t\toGame { Sound {\n\t\t\t\t\t\t\t\t\tonce = true\n\t\t\t\t\t\t\t\t\tfile = \"sound/sfx_point.wav\"\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\tcheckwin(oGame)\n\t\t\t\t\t\t\tok\n\t\t\t\t\t\tok\n\t\t\t\t\t}\n\t\t\t\t\tif  oSelf.getvalue(px+40,py) != 0 or\n\t\t\t\t\t    oSelf.getvalue(px+40,py+40) != 0 or\n\t\t\t\t\t    oSelf.getvalue(px,py) != 0 or\n\t\t\t\t\t    oSelf.getvalue(px,py+40) != 0\n\t\t\t\t\t\toGameState.gameresult = true\n\t\t\t\t\t\toGame {\n\t\t\t\t\t\t\ttext {\n\t\t\t\t\t\t\t\tpoint = 550\n\t\t\t\t\t\t\t\tsize = 30\n\t\t\t\t\t\t\t\tnStep = 3\n\t\t\t\t\t\t\t\tfile = \"fonts/pirulen.ttf\"\n\t\t\t\t\t\t\t\ttext = \"Game Over !!!\"\n\t\t\t\t\t\t\t\tx = 500\ty=10\n\t\t\t\t\t\t\t\tstate = func ogame,oself {\n\t\t\t\t\t\t\t\t\tif oself.y >= 550\n\t\t\t\t\t\t\t\t\t\t\togame.shutdown = true\n\t\t\t\t\t\t\t\t\tok\n\t\t\t\t\t\t\t\t\t\tif oself.y = 90\n\t\t\t\t\t\t\t\t\t\togame {\n\t\t\t\t\t\t\t\t\t\t\tSound {\n\t\t\t\t\t\t\t\t\t\t\t\tonce = true\n\t\t\t\t\t\t\t\t\t\t\t\tfile = \"sound/sfx_die.wav\"\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tok\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tSound {\n\t\t\t\t\t\t\t\tonce = true\n\t\t\t\t\t\t\t\tfile = \"sound/sfx_hit.wav\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tok\n\t\t\t\tok\n\t\t\t}\n\t\t}\n\n\t\tanimate {\n\t\t\tfile = \"images/fbbird.png\"\n\t\t\tx = 10\n\t\t\ty = 10\n\t\t\tframewidth = 20\n\t\t\tscaled = true\n\t\t\theight = 50\n\t\t\twidth = 50\n\t\t\tnStep = 3\n\t\t\ttransparent = true\n\t\t\tstate = func oGame,oSelf {\n\t\t\t\toSelf {\n\t\t\t\t\tnStep--\n\t\t\t\t\tif nStep = 0\n\t\t\t\t\t\tnStep = 3\n\t\t\t\t\t\tif frame < 3\n\t\t\t\t\t\t\tframe++\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tframe=1\n\t\t\t\t\t\tok\n\t\t\t\t\tok\n\t\t\t\t}\n\n\t\t\t\tif not oGameState.playerwin\n\t\t\t\t\toGameState.down --\n\t\t\t\t\tif oGameState.down = 0\n\t\t\t\t\t\toGameState.down = 3\n\t\t\t\t\t\toself {\n\t\t\t\t\t\t\ty += 25\n\t\t\t\t\t\t\tif y > 550 y=550 ok\n\t\t\t\t\t\t}\n\t\t\t\t\tok\n\t\t\t\tok\n\n\t\t\t}\n\t\t\tkeypress = func ogame,oself,nKey {\n\t\t\t\tif oGameState.gameresult = false\n\t\t\t\t\toself {\n\t\t\t\t\t\tif nkey = key_space\n\t\t\t\t\t\t\ty -= 55\n\t\t\t\t\t\t\toGameState.down = 60\n\t\t\t\t\t\t\tif y<=0 y=0 ok\n\t\t\t\t\t\tok\n\t\t\t\t\t}\n\t\t\t\tok\n\t\t\t}\n\t\t\tmouse = func ogame,oself,nType,aMouseList {\n\t\t\t\tif nType = GE_MOUSE_UP\n\t\t\t\t\tcall oself.keypress(oGame,oSelf,Key_Space)\n\t\t\t\tok\n\t\t\t}\n\t\t}\n\n\t\ttext {\n\t\t\tanimate = false\n\t\t\tpoint = 400\n\t\t\tsize = 30\n\t\t\tfile = \"fonts/pirulen.ttf\"\n\t\t\ttext = \"Score : \" + oGameState.score\n\t\t\tx = 500\ty=10\n\t\t\tstate = func oGame,oSelf {\n\t\t\t\toSelf { text = \"Score : \" + oGameState.score }\n\t\t\t}\n\t\t}\n\n\t}\n\nfunc newmap aMap\n\taV = [\n\t[1,1,3,0,0,2,1,1],\n\t[1,3,0,0,0,2,1,1],\n\t[1,1,1,3,0,2,1,1],\n\t[1,1,1,3,0,0,0,0],\n\t[0,0,0,0,2,1,1,1],\n\t[0,0,2,1,1,1,1,1],\n\t[0,0,0,2,1,1,1,1],\n\t[1,1,1,3,0,2,1,1],\n\t[1,1,1,1,1,3,0,0],\n\t[3,0,0,2,1,1,1,1],\n\t[3,0,0,2,3,0,0,2]\n\t]\n\tfor x = 10 to 24 step 4\n\t\taVar = aV[ (random(10)+1) ]\n\t\tfor y = 1 to 8\n\t\t\taMap[y][x] = aVar[y]\n\t\tnext\n\tnext\n\nfunc checkwin ogame\n\tif oGameState.score = 3000\n\t\toGameState.gameresult = true\n\t\toGameState.playerwin = true\n\t\toGame {\n\t\t\ttext {\n\t\t\t\tpoint = 400\n\t\t\t\tsize = 30\n\t\t\t\tnStep = 3\n\t\t\t\tfile = \"fonts/pirulen.ttf\"\n\t\t\t\ttext = \"You Win !!!\"\n\t\t\t\tx = 500\ty=10\n\t\t\t\tstate = func ogame,oself {\n\t\t\t\t\tif oself.y >= 400\n\t\t\t\t\t\togame.shutdown = true\n\t\t\t\t\t\toGameState.Score = 0\n\t\t\t\t\tok\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tok\n\nClass GameState\n\tdown = 3\n\tgameresult = false\n\tScore = 0\n\tstartplay=false\n\tlastcol = 0\n\tplayerwin = false\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ring/natural.ring",
    "content": "New App\n{\n        I want window\n        The window title = \"hello world\"\n}\n\nClass App\n\n        func geti\n                if nIwantwindow = 0\n                        nIwantwindow++\n                ok\n\n        func getwant\n                if nIwantwindow = 1\n                        nIwantwindow++\n                ok\n\n        func getwindow\n                if nIwantwindow = 2\n                        nIwantwindow= 0\n                        see \"Instruction : I want window\" + nl\n                ok\n                if nWindowTitle = 0\n                        nWindowTitle++\n                ok\n\n        func settitle cValue\n                if nWindowTitle = 1\n                        nWindowTitle=0\n                        see \"Instruction : Window Title = \" + cValue + nl\n                ok\n\n        private\n\n                # Attributes for the instruction I want window\n                        i want window\n                        nIwantwindow = 0\n                # Attributes for the instruction Window title\n                # Here we don't define the window attribute again\n                        title\n                        nWindowTitle = 0\n                # Keywords to ignore, just give them any value\n                        the=0\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ring/weblib.ring",
    "content": "# Sample : Using the Web Library\n\nLoad \"weblib.ring\"\nLoad \"datalib.ring\"\nImport System.Web\n\nwebsite = \"ex24.ring\"\n\nNew SalaryController { Routing() }\n\nClass SalaryModel from ModelBase\n\nClass SalaryController From ControllerBase\n\nClass SalaryView From ViewBase\n\n  oLanguage = new SalaryLanguageEnglish\n\n  Func AddFuncScript oPage,oController\n        return   oPage.scriptfuncajax(\"myadd\",oController.cMainURL+\n                 oController.cOperation+\"=add\",\"mysubpage\")\n\n  Func FormViewContent oController,oTranslation,oPage\n        return [\n                        [ oTranslation.aColumnsTitles[2], \"textbox\", \"name\",\n                          oController.oModel.Name, oPage.stylewidth(\"100%\")    ],\n                        [ oTranslation.aColumnsTitles[3], \"textbox\", \"salary\",\n                          oController.oModel.Salary, oPage.stylewidth(\"50%\") ]\n                   ]\n\nClass SalaryLanguageEnglish\n  cTitle = \"Salary Table\"\n  cBack = \"back\"\n  aColumnsTitles = [\"ID\",\"Name\",\"Salary\"]\n  cOptions = \"Options\"\n  cSearch = \"Search\"\n  comboitems = [\"Select Option...\",\"Edit\",\"Delete\"]\n  cAddRecord = \"Add Record\"\n  cEditRecord = \"Edit Record\"\n  cRecordDeleted = \"Record Deleted!\"\n  aMovePages = [\"First\",\"Prev\",\"Next\",\"Last\"]\n  cPage = \"Page\"\n  cOf = \"of\"\n  cRecordsCount = \"Records Count\"\n  cSave = \"Save\"\n  temp = new page\n  cTextAlign = temp.StyleTextRight()\n  cNoRecords = \"No records!\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ring/weighthistory.ring",
    "content": "Load \"guilib.ring\"\n\nMyApp = new qApp\n{\n  $ApplicationObject = \"oApp\"   # To be used when calling events\n  oApp = new App\n  exec()\n  oApp.CloseDatabase()\n}\n\nclass App\n\n  cDir = currentdir() + \"/\"\n  oCon\n  aIDs = []\n\n  win1 = new qWidget()\n  {\n        setWindowTitle(\"Weight History\")\n        resize(600,600)\n        layoutButtons = new qhboxlayout()\n        {\n          label1 = new qLabel(win1) { setText(\"Weight\") }\n          text1 = new qlineedit(win1)\n          btnAdd = new qpushbutton(win1) {\n                  setText(\"Add\")\n                  setClickEvent($ApplicationObject+\".AddWeight()\")\n          }\n          btnDelete = new qpushbutton(win1) {\n                  setText(\"Delete\")\n                  setClickEvent($ApplicationObject+\".Deleteweight()\")\n          }\n          addwidget(label1)\n          addwidget(text1)\n          addwidget(btnAdd)\n          addwidget(btnDelete)\n        }\n        layoutData  = new qhboxlayout()\n        {\n          Table1 = new qTableWidget(win1) {\n                setrowcount(0)\n                setcolumncount(3)\n                setselectionbehavior(QAbstractItemView_SelectRows)\n                setHorizontalHeaderItem(0, new QTableWidgetItem(\"Date\"))\n                setHorizontalHeaderItem(1, new QTableWidgetItem(\"Time\"))\n                setHorizontalHeaderItem(2, new QTableWidgetItem(\"Weight\"))\n                setitemChangedEvent($ApplicationObject+\".ItemChanged()\")\n                                   setAlternatingRowColors(true)\n                                   horizontalHeader().setStyleSheet(\"color: blue\")\n                                   verticalHeader().setStyleSheet(\"color: red\")\n          }\n          addWidget(Table1)\n        }\n        layoutClose = new qhboxlayout()\n        {\n          btnclose = new qpushbutton(win1) {\n            setText(\"Close\")\n            setClickEvent(\"MyApp.Quit()\")\n          }\n          addwidget(btnClose)\n        }\n        layoutMain = new qvboxlayout()\n        {\n          addlayout(layoutButtons)\n          addLayout(LayoutData)\n          addLayout(layoutClose)\n        }\n        setlayout(layoutMain)\n        self.OpenDatabase()\n        self.ShowRecords()\n        show()\n  }\n\n  Func OpenDatabase\n        lCreate = False\n        if not fexists(cDir + \"weighthistory.db\")\n          lCreate = True\n        ok\n        new QSqlDatabase() {\n          this.oCon = addDatabase(\"QSQLITE\") {\n                setDatabaseName(\"weighthistory.db\")\n                Open()\n          }\n        }\n        if lCreate\n          new QSqlQuery( ) {\n                exec(\"create table weighthistory (id integer primary key,\"+\n                     \" f_date varchar(10),\"+\n                     \" f_time varchar(8), f_weight varchar(8) );\")\n                delete()\n          }\n        ok\n\n\n  Func CloseDatabase\n        oCon.Close()\n\n  Func AddWeight\n        cWeight = text1.text()\n        AddRecord(cWeight)\n\n  Func DeleteWeight\n        Table1 {\n           nRow = CurrentRow()\n          if nRow >= 0\n                nID = this.aIDs[nROW+1]\n                new QSqlQuery( ) {\n                  exec(\"delete from weighthistory where id = \" + nID )\n                }\n                Del(this.aIDs,nRow+1)\n                removerow(nRow)\n                selectrow(nRow)\n          ok\n        }\n\n\n  Func AddRecord cWeight\n        new QSqlQuery( ) {\n          cStr = \"insert into weighthistory (f_date,f_time,f_weight) values\"+\n          \" ('%f1','%f2','%f3')\"\n          cDate = Date()\n          cTime = Time()\n          cStr = substr(cStr,\"%f1\",cDate)\n          cStr = substr(cStr,\"%f2\",cTime)\n          cStr = substr(cStr,\"%f3\",cWeight)\n          exec(cStr)\n          delete()\n        }\n        ShowRecords()\n        Table1.selectrow(table1.rowcount()-1)\n\n\n  Func ShowRecords\n        table1.setitemChangedEvent(\"\")\n        aIDs = []\n        query = new QSqlQuery() {\n          exec(\"select * from weighthistory\")\n          nRows = 0\n          this.Table1.setrowcount(0)\n          while movenext()\n                this.table1 {\n                  insertRow(nRows)\n                  this.aIDs + query.value(0).tostring()\n                  for x = 1 to 3\n                        cStr = query.value(x).tostring()\n                        item = new qTableWidgetItem(cStr)\n                        setItem(nRows,x-1,item)\n                  next\n                }\n                nRows++\n          end\n          delete()\n        }\n        table1.setitemChangedEvent($ApplicationObject+\".ItemChanged()\")\n\n  Func ItemChanged\n        nRow =  table1.currentrow()\n        if nRow >= 0\n          myitem = Table1.item(table1.currentrow(),0)\n          cDate = myitem.text()\n          myitem = Table1.item(table1.currentrow(),1)\n          cTime = myitem.text()\n          myitem = Table1.item(table1.currentrow(),2)\n          cWeight = myitem.text()\n          new QSqlQuery( ) {\n                cStr = \"update weighthistory set f_date ='%f1' , f_time = '%f2' , \"+\n                \"f_weight ='%f3' where id = \" +  this.aIDs[nROW+1]\n                cStr = substr(cStr,\"%f1\",cDate)\n                cStr = substr(cStr,\"%f2\",cTime)\n                cStr = substr(cStr,\"%f3\",cWeight)\n                exec(cStr)\n                delete()\n          }\n        ok\n"
  },
  {
    "path": "src/test/resources/samples/langs/RobotFramework/data_driven.robot",
    "content": "*** Settings ***\nDocumentation     Example test cases using the data-driven testing approach.\n...\n...               Tests use `Calculate` keyword created in this file, that in\n...               turn uses keywords in `CalculatorLibrary`. An exception is\n...               the last test that has a custom _template keyword_.\n...\n...               The data-driven style works well when you need to repeat\n...               the same workflow multiple times.\n...\n...               Notice that one of these tests fails on purpose to show how\n...               failures look like.\nTest Template     Calculate\nLibrary           CalculatorLibrary\n\n*** Test Cases ***    Expression    Expected\nAddition              12 + 2 + 2    16\n                      2 + -3        -1\n\nSubtraction           12 - 2 - 2    8\n                      2 - -3        5\n\nMultiplication        12 * 2 * 2    48\n                      2 * -3        -6\n\nDivision              12 / 2 / 2    3\n                      2 / -3        -1\n\nFailing               1 + 1         3\n\nCalculation error     [Template]    Calculation should fail\n                      kekkonen      Invalid button 'k'.\n                      ${EMPTY}      Invalid expression.\n                      1 / 0         Division by zero.\n\n*** Keywords ***\nCalculate\n    [Arguments]    ${expression}    ${expected}\n    Push buttons    C${expression}=\n    Result should be    ${expected}\n\nCalculation should fail\n    [Arguments]    ${expression}    ${expected}\n    ${error} =    Should cause error    C${expression}=\n    Should be equal    ${expected}    ${error}    # Using `BuiltIn` keyword\n"
  },
  {
    "path": "src/test/resources/samples/langs/RobotFramework/gherkin.robot",
    "content": "*** Settings ***\nDocumentation     Example test case using the gherkin syntax.\n...\n...               This test has a workflow similar to the keyword-driven\n...               examples. The difference is that the keywords use higher\n...               abstraction level and their arguments are embedded into\n...               the keyword names.\n...\n...               This kind of _gherkin_ syntax has been made popular by\n...               [http://cukes.info|Cucumber]. It works well especially when\n...               tests act as examples that need to be easily understood also\n...               by the business people.\nLibrary           CalculatorLibrary\n\n*** Test Cases ***\nAddition\n    Given calculator has been cleared\n    When user types \"1 + 1\"\n    and user pushes equals\n    Then result is \"2\"\n\n*** Keywords ***\nCalculator has been cleared\n    Push button    C\n\nUser types \"${expression}\"\n    Push buttons    ${expression}\n\nUser pushes equals\n    Push button    =\n\nResult is \"${result}\"\n    Result should be    ${result}\n"
  },
  {
    "path": "src/test/resources/samples/langs/RobotFramework/keyword_driven.robot",
    "content": "*** Settings ***\nDocumentation     Example test cases using the keyword-driven testing approach.\n...\n...               All tests contain a workflow constructed from keywords in\n...               `CalculatorLibrary`. Creating new tests or editing existing\n...               is easy even for people without programming skills.\n...\n...               This kind of style works well for normal test automation.\n...               If also business people need to understand tests, using\n...               _gherkin_ style may work better.\nLibrary           CalculatorLibrary\n\n*** Test Cases ***\nPush button\n    Push button    1\n    Result should be    1\n\nPush multiple buttons\n    Push button    1\n    Push button    2\n    Result should be    12\n\nSimple calculation\n    Push button    1\n    Push button    +\n    Push button    2\n    Push button    =\n    Result should be    3\n\nLonger calculation\n    Push buttons    5 + 4 - 3 * 2 / 1 =\n    Result should be    3\n\nClear\n    Push button    1\n    Push button    C\n    Result should be    ${EMPTY}    # ${EMPTY} is a built-in variable\n"
  },
  {
    "path": "src/test/resources/samples/langs/Roff/Tcl.n",
    "content": "'\\\"\n'\\\" Copyright (c) 1993 The Regents of the University of California.\n'\\\" Copyright (c) 1994-1996 Sun Microsystems, Inc.\n'\\\"\n'\\\" See the file \"license.terms\" for information on usage and redistribution\n'\\\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.\n'\\\"\n.TH Tcl n \"8.6\" Tcl \"Tcl Built-In Commands\"\n.so man.macros\n.BS\n.SH NAME\nTcl \\- Tool Command Language\n.SH SYNOPSIS\nSummary of Tcl language syntax.\n.BE\n.SH DESCRIPTION\n.PP\nThe following rules define the syntax and semantics of the Tcl language:\n.IP \"[1] \\fBCommands.\\fR\"\nA Tcl script is a string containing one or more commands.\nSemi-colons and newlines are command separators unless quoted as\ndescribed below.\nClose brackets are command terminators during command substitution\n(see below) unless quoted.\n.IP \"[2] \\fBEvaluation.\\fR\"\nA command is evaluated in two steps.\nFirst, the Tcl interpreter breaks the command into \\fIwords\\fR\nand performs substitutions as described below.\nThese substitutions are performed in the same way for all\ncommands.\nSecondly, the first word is used to locate a command procedure to\ncarry out the command, then all of the words of the command are\npassed to the command procedure.\nThe command procedure is free to interpret each of its words\nin any way it likes, such as an integer, variable name, list,\nor Tcl script.\nDifferent commands interpret their words differently.\n.IP \"[3] \\fBWords.\\fR\"\nWords of a command are separated by white space (except for\nnewlines, which are command separators).\n.IP \"[4] \\fBDouble quotes.\\fR\"\nIf the first character of a word is double-quote\n.PQ \\N'34'\nthen the word is terminated by the next double-quote character.\nIf semi-colons, close brackets, or white space characters\n(including newlines) appear between the quotes then they are treated\nas ordinary characters and included in the word.\nCommand substitution, variable substitution, and backslash substitution\nare performed on the characters between the quotes as described below.\nThe double-quotes are not retained as part of the word.\n.IP \"[5] \\fBArgument expansion.\\fR\"\nIf a word starts with the string\n.QW {*}\nfollowed by a non-whitespace character, then the leading\n.QW {*}\nis removed and the rest of the word is parsed and substituted as any other\nword. After substitution, the word is parsed as a list (without command or\nvariable substitutions; backslash substitutions are performed as is normal for\na list and individual internal words may be surrounded by either braces or\ndouble-quote characters), and its words are added to the command being\nsubstituted. For instance,\n.QW \"cmd a {*}{b [c]} d {*}{$e f {g h}}\"\nis equivalent to\n.QW \"cmd a b {[c]} d {$e} f {g h}\" .\n.IP \"[6] \\fBBraces.\\fR\"\nIf the first character of a word is an open brace\n.PQ {\nand rule [5] does not apply, then\nthe word is terminated by the matching close brace\n.PQ } \"\" .\nBraces nest within the word: for each additional open\nbrace there must be an additional close brace (however,\nif an open brace or close brace within the word is\nquoted with a backslash then it is not counted in locating the\nmatching close brace).\nNo substitutions are performed on the characters between the\nbraces except for backslash-newline substitutions described\nbelow, nor do semi-colons, newlines, close brackets,\nor white space receive any special interpretation.\nThe word will consist of exactly the characters between the\nouter braces, not including the braces themselves.\n.IP \"[7] \\fBCommand substitution.\\fR\"\nIf a word contains an open bracket\n.PQ [\nthen Tcl performs \\fIcommand substitution\\fR.\nTo do this it invokes the Tcl interpreter recursively to process\nthe characters following the open bracket as a Tcl script.\nThe script may contain any number of commands and must be terminated\nby a close bracket\n.PQ ] \"\" .\nThe result of the script (i.e. the result of its last command) is\nsubstituted into the word in place of the brackets and all of the\ncharacters between them.\nThere may be any number of command substitutions in a single word.\nCommand substitution is not performed on words enclosed in braces.\n.IP \"[8] \\fBVariable substitution.\\fR\"\nIf a word contains a dollar-sign\n.PQ $\nfollowed by one of the forms\ndescribed below, then Tcl performs \\fIvariable\nsubstitution\\fR:  the dollar-sign and the following characters are\nreplaced in the word by the value of a variable.\nVariable substitution may take any of the following forms:\n.RS\n.TP 15\n\\fB$\\fIname\\fR\n.\n\\fIName\\fR is the name of a scalar variable;  the name is a sequence\nof one or more characters that are a letter, digit, underscore,\nor namespace separators (two or more colons).\nLetters and digits are \\fIonly\\fR the standard ASCII ones (\\fB0\\fR\\(en\\fB9\\fR,\n\\fBA\\fR\\(en\\fBZ\\fR and \\fBa\\fR\\(en\\fBz\\fR).\n.TP 15\n\\fB$\\fIname\\fB(\\fIindex\\fB)\\fR\n.\n\\fIName\\fR gives the name of an array variable and \\fIindex\\fR gives\nthe name of an element within that array.\n\\fIName\\fR must contain only letters, digits, underscores, and\nnamespace separators, and may be an empty string.\nLetters and digits are \\fIonly\\fR the standard ASCII ones (\\fB0\\fR\\(en\\fB9\\fR,\n\\fBA\\fR\\(en\\fBZ\\fR and \\fBa\\fR\\(en\\fBz\\fR).\nCommand substitutions, variable substitutions, and backslash\nsubstitutions are performed on the characters of \\fIindex\\fR.\n.TP 15\n\\fB${\\fIname\\fB}\\fR\n.\n\\fIName\\fR is the name of a scalar variable or array element.  It may contain\nany characters whatsoever except for close braces.  It indicates an array\nelement if \\fIname\\fR is in the form\n.QW \\fIarrayName\\fB(\\fIindex\\fB)\\fR\nwhere \\fIarrayName\\fR does not contain any open parenthesis characters,\n.QW \\fB(\\fR ,\nor close brace characters,\n.QW \\fB}\\fR ,\nand \\fIindex\\fR can be any sequence of characters except for close brace\ncharacters.  No further\nsubstitutions are performed during the parsing of \\fIname\\fR.\n.PP\nThere may be any number of variable substitutions in a single word.\nVariable substitution is not performed on words enclosed in braces.\n.PP\nNote that variables may contain character sequences other than those listed\nabove, but in that case other mechanisms must be used to access them (e.g.,\nvia the \\fBset\\fR command's single-argument form).\n.RE\n.IP \"[9] \\fBBackslash substitution.\\fR\"\nIf a backslash\n.PQ \\e\nappears within a word then \\fIbackslash substitution\\fR occurs.\nIn all cases but those described below the backslash is dropped and\nthe following character is treated as an ordinary\ncharacter and included in the word.\nThis allows characters such as double quotes, close brackets,\nand dollar signs to be included in words without triggering\nspecial processing.\nThe following table lists the backslash sequences that are\nhandled specially, along with the value that replaces each sequence.\n.RS\n.TP 7\n\\e\\fBa\\fR\nAudible alert (bell) (Unicode U+000007).\n.TP 7\n\\e\\fBb\\fR\nBackspace (Unicode U+000008).\n.TP 7\n\\e\\fBf\\fR\nForm feed (Unicode U+00000C).\n.TP 7\n\\e\\fBn\\fR\nNewline (Unicode U+00000A).\n.TP 7\n\\e\\fBr\\fR\nCarriage-return (Unicode U+00000D).\n.TP 7\n\\e\\fBt\\fR\nTab (Unicode U+000009).\n.TP 7\n\\e\\fBv\\fR\nVertical tab (Unicode U+00000B).\n.TP 7\n\\e\\fB<newline>\\fIwhiteSpace\\fR\n.\nA single space character replaces the backslash, newline, and all spaces\nand tabs after the newline.  This backslash sequence is unique in that it\nis replaced in a separate pre-pass before the command is actually parsed.\nThis means that it will be replaced even when it occurs between braces,\nand the resulting space will be treated as a word separator if it is not\nin braces or quotes.\n.TP 7\n\\e\\e\nBackslash\n.PQ \\e \"\" .\n.TP 7\n\\e\\fIooo\\fR \n.\nThe digits \\fIooo\\fR (one, two, or three of them) give a eight-bit octal \nvalue for the Unicode character that will be inserted, in the range\n\\fI000\\fR\\(en\\fI377\\fR (i.e., the range U+000000\\(enU+0000FF).\nThe parser will stop just before this range overflows, or when\nthe maximum of three digits is reached.  The upper bits of the Unicode\ncharacter will be 0.\n.TP 7\n\\e\\fBx\\fIhh\\fR \n.\nThe hexadecimal digits \\fIhh\\fR (one or two of them) give an eight-bit\nhexadecimal value for the Unicode character that will be inserted.  The upper\nbits of the Unicode character will be 0 (i.e., the character will be in the\nrange U+000000\\(enU+0000FF).\n.TP 7\n\\e\\fBu\\fIhhhh\\fR \n.\nThe hexadecimal digits \\fIhhhh\\fR (one, two, three, or four of them) give a\nsixteen-bit hexadecimal value for the Unicode character that will be\ninserted.  The upper bits of the Unicode character will be 0 (i.e., the\ncharacter will be in the range U+000000\\(enU+00FFFF).\n.TP 7\n\\e\\fBU\\fIhhhhhhhh\\fR \n.\nThe hexadecimal digits \\fIhhhhhhhh\\fR (one up to eight of them) give a\ntwenty-one-bit hexadecimal value for the Unicode character that will be\ninserted, in the range U+000000\\(enU+10FFFF.  The parser will stop just\nbefore this range overflows, or when the maximum of eight digits\nis reached.  The upper bits of the Unicode character will be 0.\n.RS\n.PP\nThe range U+010000\\(enU+10FFFD is reserved for the future.\n.RE\n.PP\nBackslash substitution is not performed on words enclosed in braces,\nexcept for backslash-newline as described above.\n.RE\n.IP \"[10] \\fBComments.\\fR\"\nIf a hash character\n.PQ #\nappears at a point where Tcl is\nexpecting the first character of the first word of a command,\nthen the hash character and the characters that follow it, up\nthrough the next newline, are treated as a comment and ignored.\nThe comment character only has significance when it appears\nat the beginning of a command.\n.IP \"[11] \\fBOrder of substitution.\\fR\"\nEach character is processed exactly once by the Tcl interpreter\nas part of creating the words of a command.\nFor example, if variable substitution occurs then no further\nsubstitutions are performed on the value of the variable;  the\nvalue is inserted into the word verbatim.\nIf command substitution occurs then the nested command is\nprocessed entirely by the recursive call to the Tcl interpreter;\nno substitutions are performed before making the recursive\ncall and no additional substitutions are performed on the result\nof the nested script.\n.RS\n.PP\nSubstitutions take place from left to right, and each substitution is\nevaluated completely before attempting to evaluate the next.  Thus, a\nsequence like\n.PP\n.CS\nset y [set x 0][incr x][incr x]\n.CE\n.PP\nwill always set the variable \\fIy\\fR to the value, \\fI012\\fR.\n.RE\n.IP \"[12] \\fBSubstitution and word boundaries.\\fR\"\nSubstitutions do not affect the word boundaries of a command,\nexcept for argument expansion as specified in rule [5].\nFor example, during variable substitution the entire value of\nthe variable becomes part of a single word, even if the variable's\nvalue contains spaces.\n.SH KEYWORDS\nbackslash, command, comment, script, substitution, variable\n'\\\" Local Variables:\n'\\\" mode: nroff\n'\\\" fill-column: 78\n'\\\" End:\n"
  },
  {
    "path": "src/test/resources/samples/langs/Roff/an-ext.tmac",
    "content": ".\\\" -*- nroff -*-\n.\\\"\n.\\\" an-ext.tmac\n.\\\"\n.\\\" Copyright (C) 2007-2014  Free Software Foundation, Inc.\n.\\\"\n.\\\" Written by Eric S. Raymond <esr@thyrsus.com>\n.\\\"            Werner Lemberg <wl@gnu.org>\n.\\\"\n.\\\" You may freely use, modify and/or distribute this file.\n.\\\"\n.\\\" The code below provides extension macros for the `man' macro package.\n.\\\" Care has been taken to make the code portable; groff extensions are\n.\\\" properly hidden so that all troff implementations can use it without\n.\\\" changes.\n.\\\"\n.\\\" With groff, this file is sourced by the `man' macro package itself.\n.\\\" Man page authors who are concerned about portability might add the\n.\\\" used macros directly to the prologue of the man page(s).\n.\n.\n.\\\" Convention: Auxiliary macros and registers start with `m' followed\n.\\\"             by an uppercase letter or digit.\n.\n.\n.\\\" Protect against being sourced twice.\n.nr mX +1\n.if \\n(mX>1 \\\n.  nx\n.\n.\\\" Check whether we are using grohtml.\n.nr mH 0\n.if \\n(.g \\\n.  if '\\*(.T'html' \\\n.    nr mH 1\n.\n.\n.\\\" Map mono-width fonts to standard fonts for groff's TTY device.\n.if n \\{\\\n.  do ftr CR R\n.  do ftr CI I\n.  do ftr CB B\n.\\}\n.\n.\\\" groff has glyph entities for angle brackets.\n.ie \\n(.g \\{\\\n.  ds la \\(la\\\"\n.  ds ra \\(ra\\\"\n.\\}\n.el \\{\\\n.  ds la <\\\"\n.  ds ra >\\\"\n.  \\\" groff's man macros control hyphenation with this register.\n.  nr HY 1\n.\\}\n.\n.nr mS 0\n.\n.\n.\\\" Declare start of command synopsis.  Sets up hanging indentation.\n.de SY\n.  ie !\\\\n(mS \\{\\\n.    nh\n.    nr mS 1\n.    nr mA \\\\n(.j\n.    ad l\n.    nr mI \\\\n(.i\n.  \\}\n.  el \\{\\\n.    br\n.    ns\n.  \\}\n.\n.  nr mT \\w'\\fB\\\\$1\\fP\\ '\n.  HP \\\\n(mTu\n.  B \"\\\\$1\"\n..\n.\n.\n.\\\" End of command synopsis.  Restores adjustment.\n.de YS\n.  in \\\\n(mIu\n.  ad \\\\n(mA\n.  hy \\\\n(HY\n.  nr mS 0\n..\n.\n.\n.\\\" Declare optional option.\n.de OP\n.  ie \\\\n(.$-1 \\\n.    RI \"[\\fB\\\\$1\\fP\" \"\\ \\\\$2\" \"]\"\n.  el \\\n.    RB \"[\" \"\\\\$1\" \"]\"\n..\n.\n.\n.\\\" Start URL.\n.de UR\n.  ds m1 \\\\$1\\\"\n.  nh\n.  if \\\\n(mH \\{\\\n.    \\\" Start diversion in a new environment.\n.    do ev URL-div\n.    do di URL-div\n.  \\}\n..\n.\n.\n.\\\" End URL.\n.de UE\n.  ie \\\\n(mH \\{\\\n.    br\n.    di\n.    ev\n.\n.    \\\" Has there been one or more input lines for the link text?\n.    ie \\\\n(dn \\{\\\n.      do HTML-NS \"<a href=\"\"\\\\*(m1\"\">\"\n.      \\\" Yes, strip off final newline of diversion and emit it.\n.      do chop URL-div\n.      do URL-div\n\\c\n.      do HTML-NS </a>\n.    \\}\n.    el \\\n.      do HTML-NS \"<a href=\"\"\\\\*(m1\"\">\\\\*(m1</a>\"\n\\&\\\\$*\\\"\n.  \\}\n.  el \\\n\\\\*(la\\\\*(m1\\\\*(ra\\\\$*\\\"\n.\n.  hy \\\\n(HY\n..\n.\n.\n.\\\" Start email address.\n.de MT\n.  ds m1 \\\\$1\\\"\n.  nh\n.  if \\\\n(mH \\{\\\n.    \\\" Start diversion in a new environment.\n.    do ev URL-div\n.    do di URL-div\n.  \\}\n..\n.\n.\n.\\\" End email address.\n.de ME\n.  ie \\\\n(mH \\{\\\n.    br\n.    di\n.    ev\n.\n.    \\\" Has there been one or more input lines for the link text?\n.    ie \\\\n(dn \\{\\\n.      do HTML-NS \"<a href=\"\"mailto:\\\\*(m1\"\">\"\n.      \\\" Yes, strip off final newline of diversion and emit it.\n.      do chop URL-div\n.      do URL-div\n\\c\n.      do HTML-NS </a>\n.    \\}\n.    el \\\n.      do HTML-NS \"<a href=\"\"mailto:\\\\*(m1\"\">\\\\*(m1</a>\"\n\\&\\\\$*\\\"\n.  \\}\n.  el \\\n\\\\*(la\\\\*(m1\\\\*(ra\\\\$*\\\"\n.\n.  hy \\\\n(HY\n..\n.\n.\n.\\\" Continuation line for .TP header.\n.de TQ\n.  br\n.  ns\n.  TP \\\\$1\\\" no doublequotes around argument!\n..\n.\n.\n.\\\" Start example.\n.de EX\n.  do ds mF \\\\n[.fam]\n.  nr mE \\\\n(.f\n.  nf\n.  nh\n.  do fam C\n.  ft CW\n..\n.\n.\n.\\\" End example.\n.de EE\n.  do fam \\\\*(mF\n.  ft \\\\n(mE\n.  fi\n.  hy \\\\n(HY\n..\n.\n.\n.\\\" Start display.\n.de DS\n.  \\\" XXX to be written\n..\n.\n.\n.\\\" End display.\n.de DE\n.  \\\" XXX to be written\n..\n.\n.\\\" EOF\n"
  },
  {
    "path": "src/test/resources/samples/langs/Roff/create_view.l",
    "content": ".\\\\\" auto-generated by docbook2man-spec $Revision: 1.1.1.1 $\n.TH \"CREATE VIEW\" \"\" \"2005-11-05\" \"SQL - Language Statements\" \"SQL Commands\"\n.SH NAME\nCREATE VIEW \\- define a new view\n\n.SH SYNOPSIS\n.sp\n.nf\nCREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW \\fIname\\fR [ ( \\fIcolumn_name\\fR [, ...] ) ]\n    AS \\fIquery\\fR\n.sp\n.fi\n.SH \"DESCRIPTION\"\n.PP\n\\fBCREATE VIEW\\fR defines a view of a query. The view\nis not physically materialized. Instead, the query is run every time\nthe view is referenced in a query.\n.PP\n\\fBCREATE OR REPLACE VIEW\\fR is similar, but if a view\nof the same name already exists, it is replaced. You can only replace\na view with a new query that generates the identical set of columns\n(i.e., same column names and data types).\n.PP\nIf a schema name is given (for example, CREATE VIEW\nmyschema.myview ...) then the view is created in the specified\nschema. Otherwise it is created in the current schema. Temporary\nviews exist in a special schema, so a schema name may not be given\nwhen creating a temporary view. The name of the view must be\ndistinct from the name of any other view, table, sequence, or index\nin the same schema.\n.SH \"PARAMETERS\"\n.TP\n\\fBTEMPORARY or TEMP\\fR\nIf specified, the view is created as a temporary view.\nTemporary views are automatically dropped at the end of the\ncurrent session. Existing\npermanent relations with the same name are not visible to the\ncurrent session while the temporary view exists, unless they are\nreferenced with schema-qualified names.\n\nIf any of the tables referenced by the view are temporary,\nthe view is created as a temporary view (whether\nTEMPORARY is specified or not).\n.TP\n\\fB\\fIname\\fB\\fR\nThe name (optionally schema-qualified) of a view to be created.\n.TP\n\\fB\\fIcolumn_name\\fB\\fR\nAn optional list of names to be used for columns of the view.\nIf not given, the column names are deduced from the query.\n.TP\n\\fB\\fIquery\\fB\\fR\nA query (that is, a \\fBSELECT\\fR statement) which will\nprovide the columns and rows of the view.\n\nRefer to SELECT [\\fBselect\\fR(l)]\nfor more information about valid queries.\n.SH \"NOTES\"\n.PP\nCurrently, views are read only: the system will not allow an insert,\nupdate, or delete on a view. You can get the effect of an updatable\nview by creating rules that rewrite inserts, etc. on the view into\nappropriate actions on other tables. For more information see\nCREATE RULE [\\fBcreate_rule\\fR(l)].\n.PP\nUse the DROP VIEW [\\fBdrop_view\\fR(l)]\nstatement to drop views.\n.PP\nBe careful that the names and types of the view's columns will be\nassigned the way you want. For example,\n.sp\n.nf\nCREATE VIEW vista AS SELECT 'Hello World';\n.sp\n.fi\nis bad form in two ways: the column name defaults to ?column?,\nand the column data type defaults to \\fBunknown\\fR. If you want a\nstring literal in a view's result, use something like\n.sp\n.nf\nCREATE VIEW vista AS SELECT text 'Hello World' AS hello;\n.sp\n.fi\n.PP\nAccess to tables referenced in the view is determined by permissions of\nthe view owner. However, functions called in the view are treated the\nsame as if they had been called directly from the query using the view.\nTherefore the user of a view must have permissions to call all functions\nused by the view.\n.SH \"EXAMPLES\"\n.PP\nCreate a view consisting of all comedy films:\n.sp\n.nf\nCREATE VIEW comedies AS\n    SELECT *\n    FROM films\n    WHERE kind = 'Comedy';\n.sp\n.fi\n.SH \"COMPATIBILITY\"\n.PP\nThe SQL standard specifies some additional capabilities for the\n\\fBCREATE VIEW\\fR statement:\n.sp\n.nf\nCREATE VIEW \\fIname\\fR [ ( \\fIcolumn_name\\fR [, ...] ) ]\n    AS \\fIquery\\fR\n    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]\n.sp\n.fi\n.PP\nThe optional clauses for the full SQL command are:\n.TP\n\\fBCHECK OPTION\\fR\nThis option has to do with updatable views. All\n\\fBINSERT\\fR and \\fBUPDATE\\fR commands on the view\nwill be checked to ensure data satisfy the view-defining\ncondition (that is, the new data would be visible through the\nview). If they do not, the update will be rejected.\n.TP\n\\fBLOCAL\\fR\nCheck for integrity on this view.\n.TP\n\\fBCASCADED\\fR\nCheck for integrity on this view and on any dependent\nview. CASCADED is assumed if neither\nCASCADED nor LOCAL is specified.\n.PP\n.PP\n\\fBCREATE OR REPLACE VIEW\\fR is a\nPostgreSQL language extension.\nSo is the concept of a temporary view.\n.SH \"SEE ALSO\"\nDROP VIEW [\\fBdrop_view\\fR(l)]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Roff/fsinterface.ms",
    "content": ".\\\"\t$NetBSD: fsinterface.ms,v 1.4 2003/08/07 10:30:42 agc Exp $\n.\\\"\n.\\\" Copyright (c) 1986 The Regents of the University of California.\n.\\\" All rights reserved.\n.\\\"\n.\\\" Redistribution and use in source and binary forms, with or without\n.\\\" modification, are permitted provided that the following conditions\n.\\\" are met:\n.\\\" 1. Redistributions of source code must retain the above copyright\n.\\\"    notice, this list of conditions and the following disclaimer.\n.\\\" 2. Redistributions in binary form must reproduce the above copyright\n.\\\"    notice, this list of conditions and the following disclaimer in the\n.\\\"    documentation and/or other materials provided with the distribution.\n.\\\" 3. Neither the name of the University nor the names of its contributors\n.\\\"    may be used to endorse or promote products derived from this software\n.\\\"    without specific prior written permission.\n.\\\"\n.\\\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\n.\\\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n.\\\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n.\\\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\n.\\\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n.\\\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n.\\\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n.\\\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n.\\\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n.\\\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n.\\\" SUCH DAMAGE.\n.\\\"\n.\\\"\t@(#)fsinterface.ms\t1.4 (Berkeley) 4/16/91\n.\\\"\n.if \\nv .rm CM\n.de UX\n.ie \\\\n(UX \\s-1UNIX\\s0\\\\$1\n.el \\{\\\n\\s-1UNIX\\s0\\\\$1\\(dg\n.FS\n\\(dg \\s-1UNIX\\s0 is a registered trademark of AT&T.\n.FE\n.nr UX 1\n.\\}\n..\n.TL\nToward a Compatible Filesystem Interface\n.AU\nMichael J. Karels\nMarshall Kirk McKusick\n.AI\nComputer Systems Research Group\nComputer Science Division\nDepartment of Electrical Engineering and Computer Science\nUniversity of California, Berkeley\nBerkeley, California  94720\n.AB\n.LP\nAs network or remote filesystems have been implemented for\n.UX ,\nseveral stylized interfaces between the filesystem implementation\nand the rest of the kernel have been developed.\n.FS\nThis is an update of a paper originally presented\nat the September 1986 conference of the European\n.UX\nUsers' Group.\nLast modified April 16, 1991.\n.FE\nNotable among these are Sun Microsystems' Virtual Filesystem interface (VFS)\nusing vnodes, Digital Equipment's Generic File System (GFS) architecture,\nand AT&T's File System Switch (FSS).\nEach design attempts to isolate filesystem-dependent details\nbelow a generic interface and to provide a framework within which\nnew filesystems may be incorporated.\nHowever, each of these interfaces is different from\nand incompatible with the others.\nEach of them addresses somewhat different design goals.\nEach was based on a different starting version of\n.UX ,\ntargetted a different set of filesystems with varying characteristics,\nand uses a different set of primitive operations provided by the filesystem.\nThe current study compares the various filesystem interfaces.\nCriteria for comparison include generality, completeness, robustness,\nefficiency and esthetics.\nSeveral of the underlying design issues are examined in detail.\nAs a result of this comparison, a proposal for a new filesystem interface\nis advanced that includes the best features of the existing implementations.\nThe proposal adopts the calling convention for name lookup introduced\nin 4.3BSD, but is otherwise closely related to Sun's VFS.\nA prototype implementation is now being developed at Berkeley.\nThis proposal and the rationale underlying its development\nhave been presented to major software vendors\nas an early step toward convergence on a compatible filesystem interface.\n.AE\n.SH\nIntroduction\n.PP\nAs network communications and workstation environments\nbecame common elements in\n.UX\nsystems, several vendors of\n.UX\nsystems have designed and built network file systems\nthat allow client process on one\n.UX\nmachine to access files on a server machine.\nExamples include Sun's Network File System, NFS [Sandberg85],\nAT&T's recently-announced Remote File Sharing, RFS [Rifkin86],\nthe LOCUS distributed filesystem [Walker85],\nand Masscomp's extended filesystem [Cole85].\nOther remote filesystems have been implemented in research or university groups\nfor internal use, notably the network filesystem in the Eighth Edition\n.UX\nsystem [Weinberger84] and two different filesystems used at Carnegie-Mellon\nUniversity [Satyanarayanan85].\nNumerous other remote file access methods have been devised for use\nwithin individual\n.UX\nprocesses,\nmany of them by modifications to the C I/O library\nsimilar to those in the Newcastle Connection [Brownbridge82].\n.PP\nMultiple network filesystems may frequently\nbe found in use within a single organization.\nThese circumstances make it highly desirable to be able to transport filesystem\nimplementations from one system to another.\nSuch portability is considerably enhanced by the use of a stylized interface\nwith carefully-defined entry points to separate the filesystem from the rest\nof the operating system.\nThis interface should be similar to the interface between device drivers\nand the kernel.\nAlthough varying somewhat among the common versions of\n.UX ,\nthe device driver interfaces are sufficiently similar that device drivers\nmay be moved from one system to another without major problems.\nA clean, well-defined interface to the filesystem also allows a single\nsystem to support multiple local filesystem types.\n.PP\nFor reasons such as these, several filesystem interfaces have been used\nwhen integrating new filesystems into the system.\nThe best-known of these are Sun Microsystems' Virtual File System interface,\nVFS [Kleiman86], and AT&T's File System Switch, FSS.\nAnother interface, known as the Generic File System, GFS,\nhas been implemented for the ULTRIX\\(dd\n.FS\n\\(dd ULTRIX is a trademark of Digital Equipment Corp.\n.FE\nsystem by Digital [Rodriguez86].\nThere are numerous differences among these designs.\nThe differences may be understood from the varying philosophies\nand design goals of the groups involved, from the systems under which\nthe implementations were done, and from the filesystems originally targetted\nby the designs.\nThese differences are summarized in the following sections\nwithin the limitations of the published specifications.\n.SH\nDesign goals\n.PP\nThere are several design goals which, in varying degrees,\nhave driven the various designs.\nEach attempts to divide the filesystem into a filesystem-type-independent\nlayer and individual filesystem implementations.\nThe division between these layers occurs at somewhat different places\nin these systems, reflecting different views of the diversity and types\nof the filesystems that may be accommodated.\nCompatibility with existing local filesystems has varying importance;\nat the user-process level, each attempts to be completely transparent\nexcept for a few filesystem-related system management programs.\nThe AT&T interface also makes a major effort to retain familiar internal\nsystem interfaces, and even to retain object-file-level binary compatibility\nwith operating system modules such as device drivers.\nBoth Sun and DEC were willing to change internal data structures and interfaces\nso that other operating system modules might require recompilation\nor source-code modification.\n.PP\nAT&T's interface both allows and requires filesystems to support the full\nand exact semantics of their previous filesystem,\nincluding interruptions of system calls on slow operations.\nSystem calls that deal with remote files are encapsulated\nwith their environment and sent to a server where execution continues.\nThe system call may be aborted by either client or server, returning\ncontrol to the client.\nMost system calls that descend into the file-system dependent layer\nof a filesystem other than the standard local filesystem do not return\nto the higher-level kernel calling routines.\nInstead, the filesystem-dependent code completes the requested\noperation and then executes a non-local goto (\\fIlongjmp\\fP) to exit the\nsystem call.\nThese efforts to avoid modification of main-line kernel code\nindicate a far greater emphasis on internal compatibility than on modularity,\nclean design, or efficiency.\n.PP\nIn contrast, the Sun VFS interface makes major modifications to the internal\ninterfaces in the kernel, with a very clear separation\nof filesystem-independent and -dependent data structures and operations.\nThe semantics of the filesystem are largely retained for local operations,\nalthough this is achieved at some expense where it does not fit the internal\nstructuring well.\nThe filesystem implementations are not required to support the same\nsemantics as local\n.UX\nfilesystems.\nSeveral historical features of\n.UX\nfilesystem behavior are difficult to achieve using the VFS interface,\nincluding the atomicity of file and link creation and the use of open files\nwhose names have been removed.\n.PP\nA major design objective of Sun's network filesystem,\nstatelessness,\npermeates the VFS interface.\nNo locking may be done in the filesystem-independent layer,\nand locking in the filesystem-dependent layer may occur only during\na single call into that layer.\n.PP\nA final design goal of most implementors is performance.\nFor remote filesystems,\nthis goal tends to be in conflict with the goals of complete semantic\nconsistency, compatibility and modularity.\nSun has chosen performance over modularity in some areas,\nbut has emphasized clean separation of the layers within the filesystem\nat the expense of performance.\nAlthough the performance of RFS is yet to be seen,\nAT&T seems to have considered compatibility far more important than modularity\nor performance.\n.SH\nDifferences among filesystem interfaces\n.PP\nThe existing filesystem interfaces may be characterized\nin several ways.\nEach system is centered around a few data structures or objects,\nalong with a set of primitives for performing operations upon these objects.\nIn the original\n.UX\nfilesystem [Ritchie74],\nthe basic object used by the filesystem is the inode, or index node.\nThe inode contains all of the information about a file except its name:\nits type, identification, ownership, permissions, timestamps and location.\nInodes are identified by the filesystem device number and the index within\nthe filesystem.\nThe major entry points to the filesystem are \\fInamei\\fP,\nwhich translates a filesystem pathname into the underlying inode,\nand \\fIiget\\fP, which locates an inode by number and installs it in the in-core\ninode table.\n\\fINamei\\fP performs name translation by iterative lookup\nof each component name in its directory to find its inumber,\nthen using \\fIiget\\fP to return the actual inode.\nIf the last component has been reached, this inode is returned;\notherwise, the inode describes the next directory to be searched.\nThe inode returned may be used in various ways by the caller;\nit may be examined, the file may be read or written,\ntypes and access may be checked, and fields may be modified.\nModified inodes are automatically written back the filesystem\non disk when the last reference is released with \\fIiput\\fP.\nAlthough the details are considerably different,\nthe same general scheme is used in the faster filesystem in 4.2BSD\n.UX\n[Mckusick85].\n.PP\nBoth the AT&T interface and, to a lesser extent, the DEC interface\nattempt to preserve the inode-oriented interface.\nEach modify the inode to allow different varieties of the structure\nfor different filesystem types by separating the filesystem-dependent\nparts of the inode into a separate structure or one arm of a union.\nBoth interfaces allow operations\nequivalent to the \\fInamei\\fP and \\fIiget\\fP operations\nof the old filesystem to be performed in the filesystem-independent\nlayer, with entry points to the individual filesystem implementations to support\nthe type-specific parts of these operations.  Implicit in this interface\nis that files may be conveniently be named by and located using a single\nindex within a filesystem.\nThe GFS provides specific entry points to the filesystems\nto change most file properties rather than allowing arbitrary changes\nto be made to the generic part of the inode.\n.PP\nIn contrast, the Sun VFS interface replaces the inode as the primary object\nwith the vnode.\nThe vnode contains no filesystem-dependent fields except the pointer\nto the set of operations implemented by the filesystem.\nProperties of a vnode that might be transient, such as the ownership,\npermissions, size and timestamps, are maintained by the lower layer.\nThese properties may be presented in a generic format upon request;\ncallers are expected not to hold this information for any length of time,\nas they may not be up-to-date later on.\nThe vnode operations do not include a corollary for \\fIiget\\fP;\nthe only external interface for obtaining vnodes for specific files\nis the name lookup operation.\n(Separate procedures are provided outside of this interface\nthat obtain a ``file handle'' for a vnode which may be given\nto a client by a server, such that the vnode may be retrieved\nupon later presentation of the file handle.)\n.SH\nName translation issues\n.PP\nEach of the systems described include a mechanism for performing\npathname-to-internal-representation translation.\nThe style of the name translation function is very different in all\nthree systems.\nAs described above, the AT&T and DEC systems retain the \\fInamei\\fP function.\nThe two are quite different, however, as the ULTRIX interface uses\nthe \\fInamei\\fP calling convention introduced in 4.3BSD.\nThe parameters and context for the name lookup operation\nare collected in a \\fInameidata\\fP structure which is passed to \\fInamei\\fP\nfor operation.\nIntent to create or delete the named file is declared in advance,\nso that the final directory scan in \\fInamei\\fP may retain information\nsuch as the offset in the directory at which the modification will be made.\nFilesystems that use such mechanisms to avoid redundant work\nmust therefore lock the directory to be modified so that it may not\nbe modified by another process before completion.\nIn the System V filesystem, as in previous versions of\n.UX ,\nthis information is stored in the per-process \\fIuser\\fP structure\nby \\fInamei\\fP for use by a low-level routine called after performing\nthe actual creation or deletion of the file itself.\nIn 4.3BSD and in the GFS interface, these side effects of \\fInamei\\fP\nare stored in the \\fInameidata\\fP structure given as argument to \\fInamei\\fP,\nwhich is also presented to the routine implementing file creation or deletion.\n.PP\nThe ULTRIX \\fInamei\\fP routine is responsible for the generic\nparts of the name translation process, such as copying the name into\nan internal buffer, validating it, interpolating\nthe contents of symbolic links, and indirecting at mount points.\nAs in 4.3BSD, the name is copied into the buffer in a single call,\naccording to the location of the name.\nAfter determining the type of the filesystem at the start of translation\n(the current directory or root directory), it calls the filesystem's\n\\fInamei\\fP entry with the same structure it received from its caller.\nThe filesystem-specific routine translates the name, component by component,\nas long as no mount points are reached.\nIt may return after any number of components have been processed.\n\\fINamei\\fP performs any processing at mount points, then calls\nthe correct translation routine for the next filesystem.\nNetwork filesystems may pass the remaining pathname to a server for translation,\nor they may look up the pathname components one at a time.\nThe former strategy would be more efficient,\nbut the latter scheme allows mount points within a remote filesystem\nwithout server knowledge of all client mounts.\n.PP\nThe AT&T \\fInamei\\fP interface is presumably the same as that in previous\n.UX\nsystems, accepting the name of a routine to fetch pathname characters\nand an operation (one of: lookup, lookup for creation, or lookup for deletion).\nIt translates, component by component, as before.\nIf it detects that a mount point crosses to a remote filesystem,\nit passes the remainder of the pathname to the remote server.\nA pathname-oriented request other than open may be completed\nwithin the \\fInamei\\fP call,\navoiding return to the (unmodified) system call handler\nthat called \\fInamei\\fP.\n.PP\nIn contrast to the first two systems, Sun's VFS interface has replaced\n\\fInamei\\fP with \\fIlookupname\\fP.\nThis routine simply calls a new pathname-handling module to allocate\na pathname buffer and copy in the pathname (copying a character per call),\nthen calls \\fIlookuppn\\fP.\n\\fILookuppn\\fP performs the iteration over the directories leading\nto the destination file; it copies each pathname component to a local buffer,\nthen calls the filesystem \\fIlookup\\fP entry to locate the vnode\nfor that file in the current directory.\nPer-filesystem \\fIlookup\\fP routines may translate only one component\nper call.\nFor creation and deletion of new files, the lookup operation is unmodified;\nthe lookup of the final component only serves to check for the existence\nof the file.\nThe subsequent creation or deletion call, if any, must repeat the final\nname translation and associated directory scan.\nFor new file creation in particular, this is rather inefficient,\nas file creation requires two complete scans of the directory.\n.PP\nSeveral of the important performance improvements in 4.3BSD\nwere related to the name translation process [McKusick85][Leffler84].\nThe following changes were made:\n.IP 1. 4\nA system-wide cache of recent translations is maintained.\nThe cache is separate from the inode cache, so that multiple names\nfor a file may be present in the cache.\nThe cache does not hold ``hard'' references to the inodes,\nso that the normal reference pattern is not disturbed.\n.IP 2.\nA per-process cache is kept of the directory and offset\nat which the last successful name lookup was done.\nThis allows sequential lookups of all the entries in a directory to be done\nin linear time.\n.IP 3.\nThe entire pathname is copied into a kernel buffer in a single operation,\nrather than using two subroutine calls per character.\n.IP 4.\nA pool of pathname buffers are held by \\fInamei\\fP, avoiding allocation\noverhead.\n.LP\nAll of these performance improvements from 4.3BSD are well worth using\nwithin a more generalized filesystem framework.\nThe generalization of the structure may otherwise make an already-expensive\nfunction even more costly.\nMost of these improvements are present in the GFS system, as it derives\nfrom the beta-test version of 4.3BSD.\nThe Sun system uses a name-translation cache generally like that in 4.3BSD.\nThe name cache is a filesystem-independent facility provided for the use\nof the filesystem-specific lookup routines.\nThe Sun cache, like that first used at Berkeley but unlike that in 4.3,\nholds a ``hard'' reference to the vnode (increments the reference count).\nThe ``soft'' reference scheme in 4.3BSD cannot be used with the current\nNFS implementation, as NFS allocates vnodes dynamically and frees them\nwhen the reference count returns to zero rather than caching them.\nAs a result, fewer names may be held in the cache\nthan (local filesystem) vnodes, and the cache distorts the normal reference\npatterns otherwise seen by the LRU cache.\nAs the name cache references overflow the local filesystem inode table,\nthe name cache must be purged to make room in the inode table.\nAlso, to determine whether a vnode is in use (for example,\nbefore mounting upon it), the cache must be flushed to free any\ncache reference.\nThese problems should be corrected\nby the use of the soft cache reference scheme.\n.PP\nA final observation on the efficiency of name translation in the current\nSun VFS architecture is that the number of subroutine calls used\nby a multi-component name lookup is dramatically larger\nthan in the other systems.\nThe name lookup scheme in GFS suffers from this problem much less,\nat no expense in violation of layering.\n.PP\nA final problem to be considered is synchronization and consistency.\nAs the filesystem operations are more stylized and broken into separate\nentry points for parts of operations, it is more difficult to guarantee\nconsistency throughout an operation and/or to synchronize with other\nprocesses using the same filesystem objects.\nThe Sun interface suffers most severely from this,\nas it forbids the filesystems from locking objects across calls\nto the filesystem.\nIt is possible that a file may be created between the time that a lookup\nis performed and a subsequent creation is requested.\nPerhaps more strangely, after a lookup fails to find the target\nof a creation attempt, the actual creation might find that the target\nnow exists and is a symbolic link.\nThe call will either fail unexpectedly, as the target is of the wrong type,\nor the generic creation routine will have to note the error\nand restart the operation from the lookup.\nThis problem will always exist in a stateless filesystem,\nbut the VFS interface forces all filesystems to share the problem.\nThis restriction against locking between calls also\nforces duplication of work during file creation and deletion.\nThis is considered unacceptable.\n.SH\nSupport facilities and other interactions\n.PP\nSeveral support facilities are used by the current\n.UX\nfilesystem and require generalization for use by other filesystem types.\nFor filesystem implementations to be portable,\nit is desirable that these modified support facilities\nshould also have a uniform interface and \nbehave in a consistent manner in target systems.\nA prominent example is the filesystem buffer cache.\nThe buffer cache in a standard (System V or 4.3BSD)\n.UX\nsystem contains physical disk blocks with no reference to the files containing\nthem.\nThis works well for the local filesystem, but has obvious problems\nfor remote filesystems.\nSun has modified the buffer cache routines to describe buffers by vnode\nrather than by device.\nFor remote files, the vnode used is that of the file, and the block\nnumbers are virtual data blocks.\nFor local filesystems, a vnode for the block device is used for cache reference,\nand the block numbers are filesystem physical blocks.\nUse of per-file cache description does not easily accommodate\ncaching of indirect blocks, inode blocks, superblocks or cylinder group blocks.\nHowever, the vnode describing the block device for the cache\nis one created internally,\nrather than the vnode for the device looked up when mounting,\nand it is located by searching a private list of vnodes\nrather than by holding it in the mount structure.\nAlthough the Sun modification makes it possible to use the buffer\ncache for data blocks of remote files, a better generalization\nof the buffer cache is needed.\n.PP\nThe RFS filesystem used by AT&T does not currently cache data blocks\non client systems, thus the buffer cache is probably unmodified.\nThe form of the buffer cache in ULTRIX is unknown to us.\n.PP\nAnother subsystem that has a large interaction with the filesystem\nis the virtual memory system.\nThe virtual memory system must read data from the filesystem\nto satisfy fill-on-demand page faults.\nFor efficiency, this read call is arranged to place the data directly\ninto the physical pages assigned to the process (a ``raw'' read) to avoid\ncopying the data.\nAlthough the read operation normally bypasses the filesystem buffer cache,\nconsistency must be maintained by checking the buffer cache and copying\nor flushing modified data not yet stored on disk.\nThe 4.2BSD virtual memory system, like that of Sun and ULTRIX,\nmaintains its own cache of reusable text pages.\nThis creates additional complications.\nAs the virtual memory systems are redesigned, these problems should be\nresolved by reading through the buffer cache, then mapping the cached\ndata into the user address space.\nIf the buffer cache or the process pages are changed while the other reference\nremains, the data would have to be copied (``copy-on-write'').\n.PP\nIn the meantime, the current virtual memory systems must be used\nwith the new filesystem framework.\nBoth the Sun and AT&T filesystem interfaces\nprovide entry points to the filesystem for optimization of the virtual\nmemory system by performing logical-to-physical block number translation\nwhen setting up a fill-on-demand image for a process.\nThe VFS provides a vnode operation analogous to the \\fIbmap\\fP function of the\n.UX\nfilesystem.\nGiven a vnode and logical block number, it returns a vnode and block number\nwhich may be read to obtain the data.\nIf the filesystem is local, it returns the private vnode for the block device\nand the physical block number.\nAs the \\fIbmap\\fP operations are all performed at one time, during process\nstartup, any indirect blocks for the file will remain in the cache\nafter they are once read.\nIn addition, the interface provides a \\fIstrategy\\fP entry that may be used\nfor ``raw'' reads from a filesystem device,\nused to read data blocks into an address space without copying.\nThis entry uses a buffer header (\\fIbuf\\fP structure)\nto describe the I/O operation\ninstead of a \\fIuio\\fP structure.\nThe buffer-style interface is the same as that used by disk drivers internally.\nThis difference allows the current \\fIuio\\fP primitives to be avoided,\nas they copy all data to/from the current user process address space.\nInstead, for local filesystems these operations could be done internally\nwith the standard raw disk read routines,\nwhich use a \\fIuio\\fP interface.\nWhen loading from a remote filesystems,\nthe data will be received in a network buffer.\nIf network buffers are suitably aligned,\nthe data may be mapped into the process address space by a page swap\nwithout copying.\nIn either case, it should be possible to use the standard filesystem\nread entry from the virtual memory system.\n.PP\nOther issues that must be considered in devising a portable\nfilesystem implementation include kernel memory allocation,\nthe implicit use of user-structure global context,\nwhich may create problems with reentrancy,\nthe style of the system call interface,\nand the conventions for synchronization\n(sleep/wakeup, handling of interrupted system calls, semaphores).\n.SH\nThe Berkeley Proposal\n.PP\nThe Sun VFS interface has been most widely used of the three described here.\nIt is also the most general of the three, in that filesystem-specific\ndata and operations are best separated from the generic layer.\nAlthough it has several disadvantages which were described above,\nmost of them may be corrected with minor changes to the interface\n(and, in a few areas, philosophical changes).\nThe DEC GFS has other advantages, in particular the use of the 4.3BSD\n\\fInamei\\fP interface and optimizations.\nIt allows single or multiple components of a pathname\nto be translated in a single call to the specific filesystem\nand thus accommodates filesystems with either preference.\nThe FSS is least well understood, as there is little public information\nabout the interface.\nHowever, the design goals are the least consistent with those of the Berkeley\nresearch groups.\nAccordingly, a new filesystem interface has been devised to avoid\nsome of the problems in the other systems.\nThe proposed interface derives directly from Sun's VFS,\nbut, like GFS, uses a 4.3BSD-style name lookup interface.\nAdditional context information has been moved from the \\fIuser\\fP structure\nto the \\fInameidata\\fP structure so that name translation may be independent\nof the global context of a user process.\nThis is especially desired in any system where kernel-mode servers\noperate as light-weight or interrupt-level processes,\nor where a server may store or cache context for several clients.\nThis calling interface has the additional advantage\nthat the call parameters need not all be pushed onto the stack for each call\nthrough the filesystem interface,\nand they may be accessed using short offsets from a base pointer\n(unlike global variables in the \\fIuser\\fP structure).\n.PP\nThe proposed filesystem interface is described very tersely here.\nFor the most part, data structures and procedures are analogous\nto those used by VFS, and only the changes will be be treated here.\nSee [Kleiman86] for complete descriptions of the vfs and vnode operations\nin Sun's interface.\n.PP\nThe central data structure for name translation is the \\fInameidata\\fP\nstructure.\nThe same structure is used to pass parameters to \\fInamei\\fP,\nto pass these same parameters to filesystem-specific lookup routines,\nto communicate completion status from the lookup routines back to \\fInamei\\fP,\nand to return completion status to the calling routine.\nFor creation or deletion requests, the parameters to the filesystem operation\nto complete the request are also passed in this same structure.\nThe form of the \\fInameidata\\fP structure is:\n.br\n.ne 2i\n.ID\n.nf\n.ta .5i +\\w'caddr_t\\0\\0\\0'u +\\w'struct\\0\\0'u +\\w'vnode *nc_prevdir;\\0\\0\\0\\0\\0'u\n/*\n * Encapsulation of namei parameters.\n * One of these is located in the u. area to\n * minimize space allocated on the kernel stack\n * and to retain per-process context.\n */\nstruct nameidata {\n\t\t/* arguments to namei and related context: */\n\tcaddr_t\tni_dirp;\t\t/* pathname pointer */\n\tenum\tuio_seg ni_seg;\t\t/* location of pathname */\n\tshort\tni_nameiop;\t\t/* see below */\n\tstruct\tvnode *ni_cdir;\t\t/* current directory */\n\tstruct\tvnode *ni_rdir;\t\t/* root directory, if not normal root */\n\tstruct\tucred *ni_cred;\t\t/* credentials */\n\n\t\t/* shared between namei, lookup routines and commit routines: */\n\tcaddr_t\tni_pnbuf;\t\t/* pathname buffer */\n\tchar\t*ni_ptr;\t\t/* current location in pathname */\n\tint\tni_pathlen;\t\t/* remaining chars in path */\n\tshort\tni_more;\t\t/* more left to translate in pathname */\n\tshort\tni_loopcnt;\t\t/* count of symlinks encountered */\n\n\t\t/* results: */\n\tstruct\tvnode *ni_vp;\t\t/* vnode of result */\n\tstruct\tvnode *ni_dvp;\t\t/* vnode of intermediate directory */\n\n/* BEGIN UFS SPECIFIC */\n\tstruct diroffcache {\t\t/* last successful directory search */\n\t\tstruct\tvnode *nc_prevdir;\t/* terminal directory */\n\t\tlong\tnc_id;\t\t\t/* directory's unique id */\n\t\toff_t\tnc_prevoffset;\t\t/* where last entry found */\n\t} ni_nc;\n/* END UFS SPECIFIC */\n};\n.DE\n.DS\n.ta \\w'#define\\0\\0'u +\\w'WANTPARENT\\0\\0'u +\\w'0x40\\0\\0\\0\\0\\0\\0\\0'u\n/*\n * namei operations and modifiers\n */\n#define\tLOOKUP\t0\t/* perform name lookup only */\n#define\tCREATE\t1\t/* setup for file creation */\n#define\tDELETE\t2\t/* setup for file deletion */\n#define\tWANTPARENT\t0x10\t/* return parent directory vnode also */\n#define\tNOCACHE\t0x20\t/* name must not be left in cache */\n#define\tFOLLOW\t0x40\t/* follow symbolic links */\n#define\tNOFOLLOW\t0x0\t/* don't follow symbolic links (pseudo) */\n.DE\nAs in current systems other than Sun's VFS, \\fInamei\\fP is called\nwith an operation request, one of LOOKUP, CREATE or DELETE.\nFor a LOOKUP, the operation is exactly like the lookup in VFS.\nCREATE and DELETE allow the filesystem to ensure consistency\nby locking the parent inode (private to the filesystem),\nand (for the local filesystem) to avoid duplicate directory scans\nby storing the new directory entry and its offset in the directory\nin the \\fIndirinfo\\fP structure.\nThis is intended to be opaque to the filesystem-independent levels.\nNot all lookups for creation or deletion are actually followed\nby the intended operation; permission may be denied, the filesystem\nmay be read-only, etc.\nTherefore, an entry point to the filesystem is provided\nto abort a creation or deletion operation\nand allow release of any locked internal data.\nAfter a \\fInamei\\fP with a CREATE or DELETE flag, the pathname pointer\nis set to point to the last filename component.\nFilesystems that choose to implement creation or deletion entirely\nwithin the subsequent call to a create or delete entry\nare thus free to do so.\n.PP\nThe \\fInameidata\\fP is used to store context used during name translation.\nThe current and root directories for the translation are stored here.\nFor the local filesystem, the per-process directory offset cache\nis also kept here.\nA file server could leave the directory offset cache empty,\ncould use a single cache for all clients,\nor could hold caches for several recent clients.\n.PP\nSeveral other data structures are used in the filesystem operations.\nOne is the \\fIucred\\fP structure which describes a client's credentials\nto the filesystem.\nThis is modified slightly from the Sun structure;\nthe ``accounting'' group ID has been merged into the groups array.\nThe actual number of groups in the array is given explicitly\nto avoid use of a reserved group ID as a terminator.\nAlso, typedefs introduced in 4.3BSD for user and group ID's have been used.\nThe \\fIucred\\fP structure is thus:\n.DS\n.ta .5i +\\w'caddr_t\\0\\0\\0'u +\\w'struct\\0\\0'u +\\w'vnode *nc_prevdir;\\0\\0\\0\\0\\0'u\n/*\n * Credentials.\n */\nstruct ucred {\n\tu_short\tcr_ref;\t\t\t/* reference count */\n\tuid_t\tcr_uid;\t\t\t/* effective user id */\n\tshort\tcr_ngroups;\t\t/* number of groups */\n\tgid_t\tcr_groups[NGROUPS];\t/* groups */\n\t/*\n\t * The following either should not be here,\n\t * or should be treated as opaque.\n\t */\n\tuid_t   cr_ruid;\t\t/* real user id */\n\tgid_t   cr_svgid;\t\t/* saved set-group id */\n};\n.DE\n.PP\nA final structure used by the filesystem interface is the \\fIuio\\fP\nstructure mentioned earlier.\nThis structure describes the source or destination of an I/O\noperation, with provision for scatter/gather I/O.\nIt is used in the read and write entries to the filesystem.\nThe \\fIuio\\fP structure presented here is modified from the one\nused in 4.2BSD to specify the location of each vector of the operation\n(user or kernel space)\nand to allow an alternate function to be used to implement the data movement.\nThe alternate function might perform page remapping rather than a copy,\nfor example.\n.DS\n.ta .5i +\\w'caddr_t\\0\\0\\0'u +\\w'struct\\0\\0'u +\\w'vnode *nc_prevdir;\\0\\0\\0\\0\\0'u\n/*\n * Description of an I/O operation which potentially\n * involves scatter-gather, with individual sections\n * described by iovec, below.  uio_resid is initially\n * set to the total size of the operation, and is\n * decremented as the operation proceeds.  uio_offset\n * is incremented by the amount of each operation.\n * uio_iov is incremented and uio_iovcnt is decremented\n * after each vector is processed.\n */\nstruct uio {\n\tstruct\tiovec *uio_iov;\n\tint\tuio_iovcnt;\n\toff_t\tuio_offset;\n\tint\tuio_resid;\n\tenum\tuio_rw uio_rw;\n};\n\nenum\tuio_rw { UIO_READ, UIO_WRITE };\n.DE\n.DS\n.ta .5i +\\w'caddr_t\\0\\0\\0'u +\\w'vnode *nc_prevdir;\\0\\0\\0\\0\\0'u\n/*\n * Description of a contiguous section of an I/O operation.\n * If iov_op is non-null, it is called to implement the copy\n * operation, possibly by remapping, with the call\n *\t(*iov_op)(from, to, count);\n * where from and to are caddr_t and count is int.\n * Otherwise, the copy is done in the normal way,\n * treating base as a user or kernel virtual address\n * according to iov_segflg.\n */\nstruct iovec {\n\tcaddr_t\tiov_base;\n\tint\tiov_len;\n\tenum\tuio_seg iov_segflg;\n\tint\t(*iov_op)();\n};\n.DE\n.DS\n.ta .5i +\\w'UIO_USERISPACE\\0\\0\\0\\0\\0'u\n/*\n * Segment flag values.\n */\nenum\tuio_seg {\n\tUIO_USERSPACE,\t\t/* from user data space */\n\tUIO_SYSSPACE,\t\t/* from system space */\n\tUIO_USERISPACE\t\t/* from user I space */\n};\n.DE\n.SH\nFile and filesystem operations\n.PP\nWith the introduction of the data structures used by the filesystem\noperations, the complete list of filesystem entry points may be listed.\nAs noted, they derive mostly from the Sun VFS interface.\nLines marked with \\fB+\\fP are additions to the Sun definitions;\nlines marked with \\fB!\\fP are modified from VFS.\n.PP\nThe structure describing the externally-visible features of a mounted\nfilesystem, \\fIvfs\\fP, is:\n.DS\n.ta .5i +\\w'struct vfsops\\0\\0\\0'u +\\w'*vfs_vnodecovered;\\0\\0\\0\\0\\0'u\n/*\n * Structure per mounted file system.\n * Each mounted file system has an array of\n * operations and an instance record.\n * The file systems are put on a doubly linked list.\n */\nstruct vfs {\n\tstruct vfs\t*vfs_next;\t\t/* next vfs in vfs list */\n\\fB+\\fP\tstruct vfs\t*vfs_prev;\t\t/* prev vfs in vfs list */\n\tstruct vfsops\t*vfs_op;\t\t/* operations on vfs */\n\tstruct vnode\t*vfs_vnodecovered;\t/* vnode we mounted on */\n\tint\tvfs_flag;\t\t/* flags */\n\\fB!\\fP\tint\tvfs_fsize;\t\t/* fundamental block size */\n\\fB+\\fP\tint\tvfs_bsize;\t\t/* optimal transfer size */\n\\fB!\\fP\tuid_t\tvfs_exroot;\t\t/* exported fs uid 0 mapping */\n\tshort\tvfs_exflags;\t\t/* exported fs flags */\n\tcaddr_t\tvfs_data;\t\t/* private data */\n};\n.DE\n.DS\n.ta \\w'\\fB+\\fP 'u +\\w'#define\\0\\0'u +\\w'VFS_EXPORTED\\0\\0'u +\\w'0x40\\0\\0\\0\\0\\0'u\n\t/*\n\t * vfs flags.\n\t * VFS_MLOCK lock the vfs so that name lookup cannot proceed past the vfs.\n\t * This keeps the subtree stable during mounts and unmounts.\n\t */\n\t#define\tVFS_RDONLY\t0x01\t\t/* read only vfs */\n\\fB+\\fP\t#define\tVFS_NOEXEC\t0x02\t\t/* can't exec from filesystem */\n\t#define\tVFS_MLOCK\t0x04\t\t/* lock vfs so that subtree is stable */\n\t#define\tVFS_MWAIT\t0x08\t\t/* someone is waiting for lock */\n\t#define\tVFS_NOSUID\t0x10\t\t/* don't honor setuid bits on vfs */\n\t#define\tVFS_EXPORTED\t0x20\t\t/* file system is exported (NFS) */\n\n\t/*\n\t * exported vfs flags.\n\t */\n\t#define\tEX_RDONLY\t0x01\t\t/* exported read only */\n.DE\n.LP\nThe operations supported by the filesystem-specific layer\non an individual filesystem are:\n.DS\n.ta .5i +\\w'struct vfsops\\0\\0\\0'u +\\w'*vfs_vnodecovered;\\0\\0\\0\\0\\0'u\n/*\n * Operations supported on virtual file system.\n */\nstruct vfsops {\n\\fB!\\fP\tint\t(*vfs_mount)(\t\t/* vfs, path, data, datalen */ );\n\\fB!\\fP\tint\t(*vfs_unmount)(\t\t/* vfs, forcibly */ );\n\\fB+\\fP\tint\t(*vfs_mountroot)();\n\tint\t(*vfs_root)(\t\t/* vfs, vpp */ );\n\\fB!\\fP\tint\t(*vfs_statfs)(\t\t/* vfs, vp, sbp */ );\n\\fB!\\fP\tint\t(*vfs_sync)(\t\t/* vfs, waitfor */ );\n\\fB+\\fP\tint\t(*vfs_fhtovp)(\t\t/* vfs, fhp, vpp */ );\n\\fB+\\fP\tint\t(*vfs_vptofh)(\t\t/* vp, fhp */ );\n};\n.DE\n.LP\nThe \\fIvfs_statfs\\fP entry returns a structure of the form:\n.DS\n.ta .5i +\\w'struct vfsops\\0\\0\\0'u +\\w'*vfs_vnodecovered;\\0\\0\\0\\0\\0'u\n/*\n * file system statistics\n */\nstruct statfs {\n\\fB!\\fP\tshort\tf_type;\t\t\t/* type of filesystem */\n\\fB+\\fP\tshort\tf_flags;\t\t/* copy of vfs (mount) flags */\n\\fB!\\fP\tlong\tf_fsize;\t\t/* fundamental file system block size */\n\\fB+\\fP\tlong\tf_bsize;\t\t/* optimal transfer block size */\n\tlong\tf_blocks;\t\t/* total data blocks in file system */\n\tlong\tf_bfree;\t\t/* free blocks in fs */\n\tlong\tf_bavail;\t\t/* free blocks avail to non-superuser */\n\tlong\tf_files;\t\t/* total file nodes in file system */\n\tlong\tf_ffree;\t\t/* free file nodes in fs */\n\tfsid_t\tf_fsid;\t\t\t/* file system id */\n\\fB+\\fP\tchar\t*f_mntonname;\t\t/* directory on which mounted */\n\\fB+\\fP\tchar\t*f_mntfromname;\t\t/* mounted filesystem */\n\tlong\tf_spare[7];\t\t/* spare for later */\n};\n\ntypedef long fsid_t[2];\t\t\t/* file system id type */\n.DE\n.LP\nThe modifications to Sun's interface at this level are minor.\nAdditional arguments are present for the \\fIvfs_mount\\fP and \\fIvfs_umount\\fP\nentries.\n\\fIvfs_statfs\\fP accepts a vnode as well as filesystem identifier,\nas the information may not be uniform throughout a filesystem.\nFor example,\nif a client may mount a file tree that spans multiple physical\nfilesystems on a server, different sections may have different amounts\nof free space.\n(NFS does not allow remotely-mounted file trees to span physical filesystems\non the server.)\nThe final additions are the entries that support file handles.\n\\fIvfs_vptofh\\fP is provided for the use of file servers,\nwhich need to obtain an opaque\nfile handle to represent the current vnode for transmission to clients.\nThis file handle may later be used to relocate the vnode using \\fIvfs_fhtovp\\fP\nwithout requiring the vnode to remain in memory.\n.PP\nFinally, the external form of a filesystem object, the \\fIvnode\\fP, is:\n.DS\n.ta .5i +\\w'struct vnodeops\\0\\0'u +\\w'*v_vfsmountedhere;\\0\\0\\0'u\n/*\n * vnode types. VNON means no type.\n */\nenum vtype \t{ VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK };\n\nstruct vnode {\n\tu_short\tv_flag;\t\t\t/* vnode flags (see below) */\n\tu_short\tv_count;\t\t/* reference count */\n\tu_short\tv_shlockc;\t\t/* count of shared locks */\n\tu_short\tv_exlockc;\t\t/* count of exclusive locks */\n\tstruct vfs\t*v_vfsmountedhere;\t/* ptr to vfs mounted here */\n\tstruct vfs\t*v_vfsp;\t\t/* ptr to vfs we are in */\n\tstruct vnodeops\t*v_op;\t\t\t/* vnode operations */\n\\fB+\\fP\tstruct text\t*v_text;\t\t/* text/mapped region */\n\tenum vtype\tv_type;\t\t\t/* vnode type */\n\tcaddr_t\tv_data;\t\t\t/* private data for fs */\n};\n.DE\n.DS\n.ta \\w'#define\\0\\0'u +\\w'NOFOLLOW\\0\\0'u +\\w'0x40\\0\\0\\0\\0\\0\\0\\0'u\n/*\n * vnode flags.\n */\n#define\tVROOT\t0x01\t/* root of its file system */\n#define\tVTEXT\t0x02\t/* vnode is a pure text prototype */\n#define\tVEXLOCK\t0x10\t/* exclusive lock */\n#define\tVSHLOCK\t0x20\t/* shared lock */\n#define\tVLWAIT\t0x40\t/* proc is waiting on shared or excl. lock */\n.DE\n.LP\nThe operations supported by the filesystems on individual \\fIvnode\\fP\\^s\nare:\n.DS\n.ta .5i +\\w'int\\0\\0\\0\\0\\0'u  +\\w'(*vn_getattr)(\\0\\0\\0\\0\\0'u\n/*\n * Operations on vnodes.\n */\nstruct vnodeops {\n\\fB!\\fP\tint\t(*vn_lookup)(\t\t/* ndp */ );\n\\fB!\\fP\tint\t(*vn_create)(\t\t/* ndp, vap, fflags */ );\n\\fB+\\fP\tint\t(*vn_mknod)(\t\t/* ndp, vap, fflags */ );\n\\fB!\\fP\tint\t(*vn_open)(\t\t/* vp, fflags, cred */ );\n\tint\t(*vn_close)(\t\t/* vp, fflags, cred */ );\n\tint\t(*vn_access)(\t\t/* vp, fflags, cred */ );\n\tint\t(*vn_getattr)(\t\t/* vp, vap, cred */ );\n\tint\t(*vn_setattr)(\t\t/* vp, vap, cred */ );\n\n\\fB+\\fP\tint\t(*vn_read)(\t\t/* vp, uiop, offp, ioflag, cred */ );\n\\fB+\\fP\tint\t(*vn_write)(\t\t/* vp, uiop, offp, ioflag, cred */ );\n\\fB!\\fP\tint\t(*vn_ioctl)(\t\t/* vp, com, data, fflag, cred */ );\n\tint\t(*vn_select)(\t\t/* vp, which, cred */ );\n\\fB+\\fP\tint\t(*vn_mmap)(\t\t/* vp, ..., cred */ );\n\tint\t(*vn_fsync)(\t\t/* vp, cred */ );\n\\fB+\\fP\tint\t(*vn_seek)(\t\t/* vp, offp, off, whence */ );\n\n\\fB!\\fP\tint\t(*vn_remove)(\t\t/* ndp */ );\n\\fB!\\fP\tint\t(*vn_link)(\t\t/* vp, ndp */ );\n\\fB!\\fP\tint\t(*vn_rename)(\t\t/* src ndp, target ndp */ );\n\\fB!\\fP\tint\t(*vn_mkdir)(\t\t/* ndp, vap */ );\n\\fB!\\fP\tint\t(*vn_rmdir)(\t\t/* ndp */ );\n\\fB!\\fP\tint\t(*vn_symlink)(\t\t/* ndp, vap, nm */ );\n\tint\t(*vn_readdir)(\t\t/* vp, uiop, offp, ioflag, cred */ );\n\tint\t(*vn_readlink)(\t\t/* vp, uiop, ioflag, cred */ );\n\n\\fB+\\fP\tint\t(*vn_abortop)(\t\t/* ndp */ );\n\\fB+\\fP\tint\t(*vn_lock)(\t\t/* vp */ );\n\\fB+\\fP\tint\t(*vn_unlock)(\t\t/* vp */ );\n\\fB!\\fP\tint\t(*vn_inactive)(\t\t/* vp */ );\n};\n.DE\n.DS\n.ta \\w'#define\\0\\0'u +\\w'NOFOLLOW\\0\\0'u +\\w'0x40\\0\\0\\0\\0\\0'u\n/*\n * flags for ioflag\n */\n#define\tIO_UNIT\t0x01\t\t/* do io as atomic unit for VOP_RDWR */\n#define\tIO_APPEND\t0x02\t\t/* append write for VOP_RDWR */\n#define\tIO_SYNC\t0x04\t\t/* sync io for VOP_RDWR */\n.DE\n.LP\nThe argument types listed in the comments following each operation are:\n.sp\n.IP ndp 10\nA pointer to a \\fInameidata\\fP structure.\n.IP vap\nA pointer to a \\fIvattr\\fP structure (vnode attributes; see below).\n.IP fflags\nFile open flags, possibly including O_APPEND, O_CREAT, O_TRUNC and O_EXCL.\n.IP vp\nA pointer to a \\fIvnode\\fP previously obtained with \\fIvn_lookup\\fP.\n.IP cred\nA pointer to a \\fIucred\\fP credentials structure.\n.IP uiop\nA pointer to a \\fIuio\\fP structure.\n.IP ioflag\nAny of the IO flags defined above.\n.IP com\nAn \\fIioctl\\fP command, with type \\fIunsigned long\\fP.\n.IP data\nA pointer to a character buffer used to pass data to or from an \\fIioctl\\fP.\n.IP which\nOne of FREAD, FWRITE or 0 (select for exceptional conditions).\n.IP off\nA file offset of type \\fIoff_t\\fP.\n.IP offp\nA pointer to file offset of type \\fIoff_t\\fP.\n.IP whence\nOne of L_SET, L_INCR, or L_XTND.\n.IP fhp\nA pointer to a file handle buffer.\n.sp\n.PP\nSeveral changes have been made to Sun's set of vnode operations.\nMost obviously, the \\fIvn_lookup\\fP receives a \\fInameidata\\fP structure\ncontaining its arguments and context as described.\nThe same structure is also passed to one of the creation or deletion\nentries if the lookup operation is for CREATE or DELETE to complete\nan operation, or to the \\fIvn_abortop\\fP entry if no operation\nis undertaken.\nFor filesystems that perform no locking between lookup for creation\nor deletion and the call to implement that action,\nthe final pathname component may be left untranslated by the lookup\nroutine.\nIn any case, the pathname pointer points at the final name component,\nand the \\fInameidata\\fP contains a reference to the vnode of the parent\ndirectory.\nThe interface is thus flexible enough to accommodate filesystems\nthat are fully stateful or fully stateless, while avoiding redundant\noperations whenever possible.\nOne operation remains problematical, the \\fIvn_rename\\fP call.\nIt is tempting to look up the source of the rename for deletion\nand the target for creation.\nHowever, filesystems that lock directories during such lookups must avoid\ndeadlock if the two paths cross.\nFor that reason, the source is translated for LOOKUP only,\nwith the WANTPARENT flag set;\nthe target is then translated with an operation of CREATE.\n.PP\nIn addition to the changes concerned with the \\fInameidata\\fP interface,\nseveral other changes were made in the vnode operations.\nThe \\fIvn_rdrw\\fP entry was split into \\fIvn_read\\fP and \\fIvn_write\\fP;\nfrequently, the read/write entry amounts to a routine that checks\nthe direction flag, then calls either a read routine or a write routine.\nThe two entries may be identical for any given filesystem;\nthe direction flag is contained in the \\fIuio\\fP given as an argument.\n.PP\nAll of the read and write operations use a \\fIuio\\fP to describe\nthe file offset and buffer locations.\nAll of these fields must be updated before return.\nIn particular, the \\fIvn_readdir\\fP entry uses this\nto return a new file offset token for its current location.\n.PP\nSeveral new operations have been added.\nThe first, \\fIvn_seek\\fP, is a concession to record-oriented files\nsuch as directories.\nIt allows the filesystem to verify that a seek leaves a file at a sensible\noffset, or to return a new offset token relative to an earlier one.\nFor most filesystems and files, this operation amounts to performing\nsimple arithmetic.\nAnother new entry point is \\fIvn_mmap\\fP, for use in mapping device memory\ninto a user process address space.\nIts semantics are not yet decided.\nThe final additions are the \\fIvn_lock\\fP and \\fIvn_unlock\\fP entries.\nThese are used to request that the underlying file be locked against\nchanges for short periods of time if the filesystem implementation allows it.\nThey are used to maintain consistency\nduring internal operations such as \\fIexec\\fP,\nand may not be used to construct atomic operations from other filesystem\noperations.\n.PP\nThe attributes of a vnode are not stored in the vnode,\nas they might change with time and may need to be read from a remote\nsource.\nAttributes have the form:\n.DS\n.ta .5i +\\w'struct vnodeops\\0\\0'u +\\w'*v_vfsmountedhere;\\0\\0\\0'u\n/*\n * Vnode attributes.  A field value of -1\n * represents a field whose value is unavailable\n * (getattr) or which is not to be changed (setattr).\n */\nstruct vattr {\n\tenum vtype\tva_type;\t/* vnode type (for create) */\n\tu_short\tva_mode;\t/* files access mode and type */\n\\fB!\\fP\tuid_t\tva_uid;\t\t/* owner user id */\n\\fB!\\fP\tgid_t\tva_gid;\t\t/* owner group id */\n\tlong\tva_fsid;\t/* file system id (dev for now) */\n\\fB!\\fP\tlong\tva_fileid;\t/* file id */\n\tshort\tva_nlink;\t/* number of references to file */\n\tu_long\tva_size;\t/* file size in bytes (quad?) */\n\\fB+\\fP\tu_long\tva_size1;\t/* reserved if not quad */\n\tlong\tva_blocksize;\t/* blocksize preferred for i/o */\n\tstruct timeval\tva_atime;\t/* time of last access */\n\tstruct timeval\tva_mtime;\t/* time of last modification */\n\tstruct timeval\tva_ctime;\t/* time file changed */\n\tdev_t\tva_rdev;\t/* device the file represents */\n\tu_long\tva_bytes;\t/* bytes of disk space held by file */\n\\fB+\\fP\tu_long\tva_bytes1;\t/* reserved if va_bytes not a quad */\n};\n.DE\n.SH\nConclusions\n.PP\nThe Sun VFS filesystem interface is the most widely used generic\nfilesystem interface.\nOf the interfaces examined, it creates the cleanest separation\nbetween the filesystem-independent and -dependent layers and data structures.\nIt has several flaws, but it is felt that certain changes in the interface\ncan ameliorate most of them.\nThe interface proposed here includes those changes.\nThe proposed interface is now being implemented by the Computer Systems\nResearch Group at Berkeley.\nIf the design succeeds in improving the flexibility and performance\nof the filesystem layering, it will be advanced as a model interface.\n.SH\nAcknowledgements\n.PP\nThe filesystem interface described here is derived from Sun's VFS interface.\nIt also includes features similar to those of DEC's GFS interface.\nWe are indebted to members of the Sun and DEC system groups\nfor long discussions of the issues involved.\n.br\n.ne 2i\n.SH\nReferences\n\n.IP Brownbridge82 \\w'Satyanarayanan85\\0\\0'u\nBrownbridge, D.R., L.F. Marshall, B. Randell,\n``The Newcastle Connection, or UNIXes of the World Unite!,''\n\\fISoftware\\- Practice and Experience\\fP, Vol. 12, pp. 1147-1162, 1982.\n\n.IP Cole85\nCole, C.T., P.B. Flinn, A.B. Atlas,\n``An Implementation of an Extended File System for UNIX,''\n\\fIUsenix Conference Proceedings\\fP,\npp. 131-150, June, 1985.\n\n.IP Kleiman86\n``Vnodes: An Architecture for Multiple File System Types in Sun UNIX,''\n\\fIUsenix Conference Proceedings\\fP,\npp. 238-247, June, 1986.\n\n.IP Leffler84\nLeffler, S., M.K. McKusick, M. Karels,\n``Measuring and Improving the Performance of 4.2BSD,''\n\\fIUsenix Conference Proceedings\\fP, pp. 237-252, June, 1984.\n\n.IP McKusick84\nMcKusick, M.K., W.N. Joy, S.J. Leffler, R.S. Fabry,\n``A Fast File System for UNIX,'' \\fITransactions on Computer Systems\\fP,\nVol. 2, pp. 181-197,\nACM, August, 1984.\n\n.IP McKusick85\nMcKusick, M.K., M. Karels, S. Leffler,\n``Performance Improvements and Functional Enhancements in 4.3BSD,''\n\\fIUsenix Conference Proceedings\\fP, pp. 519-531, June, 1985.\n\n.IP Rifkin86\nRifkin, A.P., M.P. Forbes, R.L. Hamilton, M. Sabrio, S. Shah, and K. Yueh,\n``RFS Architectural Overview,'' \\fIUsenix Conference Proceedings\\fP,\npp. 248-259, June, 1986.\n\n.IP Ritchie74\nRitchie, D.M. and K. Thompson, ``The Unix Time-Sharing System,''\n\\fICommunications of the ACM\\fP, Vol. 17, pp. 365-375, July, 1974.\n\n.IP Rodriguez86\nRodriguez, R., M. Koehler, R. Hyde,\n``The Generic File System,'' \\fIUsenix Conference Proceedings\\fP,\npp. 260-269, June, 1986.\n\n.IP Sandberg85\nSandberg, R., D. Goldberg, S. Kleiman, D. Walsh, B. Lyon,\n``Design and Implementation of the Sun Network Filesystem,''\n\\fIUsenix Conference Proceedings\\fP,\npp. 119-130, June, 1985.\n\n.IP Satyanarayanan85\nSatyanarayanan, M., \\fIet al.\\fP,\n``The ITC Distributed File System: Principles and Design,''\n\\fIProc. 10th Symposium on Operating Systems Principles\\fP, pp. 35-50,\nACM, December, 1985.\n\n.IP Walker85\nWalker, B.J. and S.H. Kiser, ``The LOCUS Distributed Filesystem,''\n\\fIThe LOCUS Distributed System Architecture\\fP,\nG.J. Popek and B.J. Walker, ed., The MIT Press, Cambridge, MA, 1985.\n\n.IP Weinberger84\nWeinberger, P.J., ``The Version 8 Network File System,''\n\\fIUsenix Conference presentation\\fP,\nJune, 1984.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Roff/refs.rno",
    "content": ".\\\" Copyright (c) 1980 Regents of the University of California.\n.\\\" All rights reserved.  The Berkeley software License Agreement\n.\\\" specifies the terms and conditions for redistribution.\n.\\\"\n.\\\"\t@(#)refs.rno\t6.1 (Berkeley) 4/29/86\n.\\\"\n.NS 1 \"References\"\n.sp\n.ip \"[Bac78]\"\nJohn Backus, \\*(lqCan Programming Be Liberated from the von Neumann Style?\nA Functional Style and Its Algebra of Programs,\\*(rq \\fICACM\\fP, Turing\nAward Lecture,  21, 8 (August 1978), 613-641.\n.sp 6p\n.ip \"[Fod80]\"\nJohn K. Foderaro, \\*(lqThe \\s-2FRANZ LISP\\s+2\nManual,\\*(rq University of California,\nBerkeley, California, 1980.\n.sp 6p\n.ip \"[Joy79]\"\nW.N. Joy, O. Babaoglu, \\*(lqUNIX Programmer's Manual,\\*(rq November 7,\n1979, Computer Science Division, University of California, Berkeley,\nCalifornia.\n.sp 6p\n.ip \"[Mc60]\"\nJ. McCarthy, \\*(lqRecursive Functions of Symbolic expressions and their\nComputation by Machine,\\*(rq Part I, \\fICACM\\fP 3, 4 (April 1960), 184-195.\n.sp 6p\n.ip \"[Pat80]\"\nDorab Ratan Patel, \\*(lqA System Organization for Applicative Programming,\\*(rq\nM.S Thesis, University of California, Los Angeles, California, 1980.\n.sp 6p\n.ip \"[Pat81]\"\nDorab Patel, \\*(lqFunctional Language Interpreter User Manual,\\*(rq\nUniversity of California, Los Angeles, California, 1981.\n.bp\n"
  },
  {
    "path": "src/test/resources/samples/langs/Roff/sample.4",
    "content": ".TH FOO 1\n.SH NAME\nfoo \\- bar\n.SH SYNOPSIS\n.B foo\n.I bar\n.SH DESCRIPTION\nFoo bar\n.BR baz\nquux.\n.PP\n.B Foo\nbar baz.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Roff/trekmanual.nr",
    "content": ".\\\" $FreeBSD: src/games/trek/DOC/trekmanual.nr,v 1.1.1.1.14.1 2002/08/15 18:10:56 schweikh Exp $\n.\\\" $DragonFly: src/games/trek/DOC/trekmanual.nr,v 1.2 2003/06/17 04:25:25 dillon Exp $\n.br\n.po 10\n.if n \\!.\n.sp 15\n.tr ^ \\\"\n.ce 88\n^****^^^^*****^^^^^^*^^^^^^****^\n*^^^^^^^^^^*^^^^^^^*^*^^^^^*^^^*\n^***^^^^^^^*^^^^^^*****^^^^****^\n^^^^*^^^^^^*^^^^^^*^^^*^^^^*^^*^\n****^^^^^^^*^^^^^^*^^^*^^^^*^^^*\n\n\n*****^^^^****^^^^^*****^^^^*^^^*\n^^*^^^^^^*^^^*^^^^*^^^^^^^^*^^*^\n^^*^^^^^^****^^^^^***^^^^^^***^^\n^^*^^^^^^*^^*^^^^^*^^^^^^^^*^^*^\n^^*^^^^^^*^^^*^^^^*****^^^^*^^^*\n\n\nby\n\nEric Allman\nUniversity of California\nBerkeley\n.ce 0\n.tr ^^\n.de HE\n'sp 4\n'tl 'STAR TREK''%'\n'sp 3\n..\n.de FO\n'bp\n..\n.wh 0 HE\n.wh -5 FO\n.de pp\n.sp\n.ti +4\n..\n.bp 1\n.ce\nINTRODUCTION\n.pp\nWell, the federation is once again at war with the Klingon empire.\nIt is up to you,\nas captain of the U.S.S. Enterprise,\nto wipe out the invasion fleet and save the Federation.\n.pp\nFor the purposes of the game\nthe galaxy is divided into 64 quadrants\non an eight by eight grid,\nwith quadrant 0,0 in the upper left hand corner.\nEach quadrant is divided into 100 sectors\non a ten by ten grid.\nEach sector contains one object\n(e.g., the Enterprise, a Klingon, or a star).\n.pp\nNavigation is handled in degrees,\nwith zero being straight up\nand ninety being to the right.\nDistances are measured in quadrants.\nOne tenth quadrant is one sector.\n.pp\nThe galaxy contains starbases,\nat which you can dock to refuel,\nrepair damages, etc.\nThe galaxy also contains stars.\nStars usually have a knack for getting in your way,\nbut they can be triggered into going nova\nby shooting a photon torpedo at one,\nthereby (hopefully) destroying any adjacent Klingons.\nThis is not a good practice however,\nbecause you are penalized for destroying stars.\nAlso, a star will sometimes go supernova,\nwhich obliterates an entire quadrant.\nYou must never stop in a supernova quadrant,\nalthough you may \"jump over\" one.\n.pp\nSome starsystems\nhave inhabited planets.\nKlingons can attack inhabited planets\nand enslave the populace,\nwhich they then put to work building more Klingon battle cruisers.\n.bp\n.ce\nSTARTING UP THE GAME\n.pp\nTo request the game, issue the command\n.sp\n.ti +12\n/usr/games/trek\n.sp\nfrom the shell.\nIf a filename is stated,\na log of the game is written\nonto that file.\nIf omitted,\nthe file is not written.\nIf the \"-a\" flag is stated before the filename,\nthat file is appended to\nrather than created.\n.pp\nThe game will ask you what length game\nyou would like.\nValid responses are \"short\", \"medium\", and \"long\".\nIdeally the length of the game does not\naffect the difficulty,\nbut currently the shorter games\ntend to be harder than the longer ones.\nYou may also type \"restart\",\nwhich restarts a previously saved game.\n.pp\nYou will then be prompted for the skill,\nto which you must respond\n\"novice\", \"fair\", \"good\", \"expert\",\n\"commodore\", or \"impossible\".\nYou should start out with a novice\nand work up,\nbut if you really want to see how fast\nyou can be slaughtered,\nstart out with an impossible game.\n.pp\nIn general,\nthroughout the game,\nif you forget what is appropriate\nthe game will tell you what it expects\nif you just type in\na question mark.\n.pp\nTo get a copy of these rules,\nexecute the command\n.sp\n.ti +12\nnroff /usr/games/trekmanual.nr\n.sp\n.bp\n.ce\nISSUING COMMANDS\n.pp\nIf the game expects you to enter a command,\n.hc ^\nit will say ^\"Command:\\ \"\nand wait for your response.\nMost commands can be abbreviated.\n.pp\nAt almost any time you can type more than one thing on a line.\nFor example,\nto move straight up one quadrant,\nyou can type\n.ti +12\nmove 0 1\n.br\nor you could just type\n.ti +12\nmove\n.br\nand the game would prompt you with\n.ti +12\nCourse:\n.br\nto which you could type\n.ti +12\n0 1\n.br\nThe \"1\" is the distance,\nwhich could be put on still another line.\nAlso, the \"move\" command\ncould have been abbreviated\n\"mov\", \"mo\", or just \"m\".\n.pp\nIf you are partway through a command\nand you change your mind,\nyou can usually type \"-1\"\nto cancel the command.\n.pp\nKlingons generally cannot hit you\nif you don't consume anything\n(e.g., time or energy),\nso some commands are considered \"free\".\nAs soon as you consume anything though -- POW!\n.bp\n.de **\n.if \\\\n+l .**\n.as x *\n..\n.de bl\n.nr l \\\\w'\\\\$1' -\\\\w'*'\n.ds x ****\n.**\n.sp 3\n.ne 3\n\\\\*x\n.br\n.if t *\\h'\\w'*'u'\\fB\\\\$1\\fP\\h'\\w'*'u'*\n.if n * \\\\$1 *\n.br\n\\\\*x\n.sp\n.in +8\n.nf\n..\n.de FF\n.in -8\n.fi\n..\n.if !\\n(.V .ta \\w'Full Commands: '+1\n.if \\n(.V .ta \\w'Full Commands: 'u\n.ce\nTHE COMMANDS\n.bl \"Short Range Scan\"\nMnemonic: srscan\nShortest Abbreviation: s\nFull Commands: srscan\n\tsrscan yes/no\nConsumes: nothing\n.FF\n.pp\nThe short range scan\ngives you a picture\nof the quadrant you are in,\nand (if you say \"yes\")\na status report\nwhich tells you\na whole bunch\nof interesting stuff.\nYou can get a status report alone\nby using the\n.ul\nstatus\ncommand.\nAn example follows:\n.sp\n.nf\n.in +4\nShort range sensor scan\n  0 1 2 3 4 5 6 7 8 9\n0 . . . . . . . * . * 0   stardate      3702.16\n1 . . E . . . . . . . 1   condition     RED\n2 . . . . . . . . . * 2   position      0,3/1,2\n3 * . . . . # . . . . 3   warp factor   5.0\n4 . . . . . . . . . . 4   total energy  4376\n5 . . * . * . . . . . 5   torpedoes     9\n6 . . . @ . .   . . . 6   shields       down, 78%\n7 . . . . . . . . . . 7   Klingons left 3\n8 . . . K . . . . . . 8   time left     6.43\n9 . . . . . . * . . . 9   life support  damaged, reserves = 2.4\n  0 1 2 3 4 5 6 7 8 9\nDistressed Starsystem Marcus XII\n\n.in +8\n.ti -8\nThe cast of characters is as follows:\nE  the hero\nK  the villain\n#  the starbase\n*  stars\n@  inhabited starsystem\n\\&.  empty space\n   a black hole\n.in -12\n.fi\n.pp\nThe name of the starsystem is listed underneath\nthe short range scan.\nThe word \"distressed\", if present,\nmeans that the starsystem\nis under attack.\n.pp\nShort range scans are absolutely free.\nThey use no time, no energy,\nand they don't give the Klingons\nanother chance to hit you.\n.bl \"Status Report\"\nMnemonic: status\nShortest Abbreviation: st\nConsumes: nothing\n.FF\n.pp\nThis command gives you information\nabout the current status\nof the game and your ship, as follows:\n.in +8\n.de qq\n.sp\n.ti -4\n..\n.qq\nStardate -- The current stardate.\n.qq\nCondition -- as follows:\n.in +4\n.nf\nRED -- in battle\nYELLOW -- low on energy\nGREEN -- normal state\nDOCKED -- docked at starbase\nCLOAKED -- the cloaking device is activated\n.fi\n.in -4\n.qq\nPosition -- Your current quadrant and sector.\n.qq\nWarp Factor -- The speed you will move at\nwhen you move under warp power\n(with the\n.ul\nmove\ncommand).\n.qq\nTotal Energy -- Your energy reserves.\nIf they drop to zero,\nyou die.\nEnergy regenerates,\nbut the higher the skill of the game,\nthe slower it regenerates.\n.qq\nTorpedoes -- How many photon torpedoes you have left.\n.qq\nShields -- Whether your shields are up or down,\nand how effective they are if up\n(what percentage of a hit they will absorb).\n.qq\nKlingons Left -- Guess.\n.qq\nTime Left -- How long the Federation can hold out\nif you sit on your fat ass and do nothing.\nIf you kill Klingons quickly,\nthis number goes up,\notherwise,\nit goes down.\nIf it hits zero,\nthe Federation is conquered.\n.qq\nLife Support -- If \"active\", everything is fine.\nIf \"damaged\", your reserves tell you\nhow long you have\nto repair your life support\nor get to a starbase\nbefore you starve, suffocate,\nor something equally unpleasant.\n.qq\nCurrent Crew -- The number of crew members\nleft.\nThis figures does not include officers.\n.qq\nBrig Space -- The space left in your brig\nfor Klingon captives.\n.qq\nKlingon Power -- The number of units\nneeded to kill a Klingon.\nRemember, as Klingons fire at you\nthey use up their own energy,\nso you probably need somewhat less\nthan this.\n.qq\nSkill, Length -- The skill and length\nof the game you are playing.\n.in -8\n.pp\nStatus information is absolutely free.\n.bl \"Long Range Scan\"\nMnemonic: lrscan\nShortest Abbreviation: l\nConsumes: nothing\n.FF\n.pp\nLong range scan gives you information about the\neight quadrants\nthat surround the quadrant\nyou're in.\nA sample long range scan follows:\n.sp\n.in +12\n.nf\nLong range scan for quadrant 0,3\n\n     2     3     4\n  -------------------\n  !  *  !  *  !  *  !\n  -------------------\n0 ! 108 !   6 !  19 !\n  -------------------\n1 !   9 ! /// !   8 !\n  -------------------\n.sp\n.in -12\n.fi\n.pp\nThe three digit numbers\ntell the number of objects\nin the quadrants.\nThe units digit tells the number of stars,\nthe tens digit the number of starbases,\nand the hundreds digit is the number of Klingons.\n\"*\" indicates the negative energy barrier\nat the edge of the galaxy,\nwhich you cannot enter.\n\"///\" means that that is a supernova quadrant\nand must not be entered.\n.bl \"Damage Report\"\nMnemonic: damages\nShortest Abbreviation: da\nConsumes: nothing\n.FF\n.pp\nA damage report tells you what devices are damaged\nand how long it will take to repair them.\nRepairs proceed faster\nwhen you are docked\nat a starbase.\n.bl \"Set Warp Factor\"\nMnemonic: warp\nShortest Abbreviation: w\nFull Command: warp factor\nConsumes: nothing\n.FF\n.pp\nThe warp factor tells the speed of your starship\nwhen you move under warp power\n(with the\n.ul\nmove\ncommand).\nThe higher the warp factor,\nthe faster you go,\nand the more energy you use.\n.pp\nThe minimum warp factor is 1.0\nand the maximum is 10.0.\nAt speeds above warp 6\nthere is danger of the warp engines\nbeing damaged.\nThe probability of this\nincreases at higher warp speeds.\nAbove warp 9.0 there is a chance of entering\na time warp.\n.bl \"Move Under Warp Power\"\nMnemonic: move\nShortest Abbreviation: m\nFull Command: move course distance\nConsumes: time and energy\n.FF\n.pp\nThis is the usual way of moving.\nThe course is in degrees and the distance is in quadrants.\nTo move one sector specify a distance of 0.1.\n.pp\nTime is consumed proportionately to\nthe inverse of the warp factor squared,\nand directly to the distance.\nEnergy is consumed as the warp factor cubed,\nand directly to the distance.\nIf you move with your shields up\nit doubles the amount of energy consumed.\n.pp\nWhen you move in a quadrant containing Klingons,\nthey get a chance to attack you.\n.pp\nThe computer detects navigation errors.\nIf the computer is out,\nyou run the risk of running into things.\n.pp\nThe course is determined by the\nSpace Inertial Navigation System\n[SINS].\nAs described in\nStar Fleet Technical Order TO:02:06:12,\nthe SINS is calibrated,\nafter which it becomes the base for navigation.\nIf damaged,\nnavigation becomes inaccurate.\nWhen it is fixed,\nSpock recalibrates it,\nhowever,\nit cannot be calibrated extremely accurately\nuntil you dock at starbase.\n.bl \"Move Under Impulse Power\"\nMnemonic: impulse\nShortest Abbreviation: i\nFull Command: impulse course distance\nConsumes: time and energy\n.FF\n.pp\nThe impulse engines give you a chance to maneuver\nwhen your warp engines are damaged;\nhowever, they are incredibly slow\n(0.095 quadrants/stardate).\nThey require 20 units of energy to engage,\nand ten units per sector to move.\n.pp\nThe same comments about the computer and the SINS\napply as above.\n.pp\nThere is no penalty to move under impulse power\nwith shields up.\n.bl \"Deflector Shields\"\nMnemonic: shields\nShortest Abbreviation: sh\nFull Command: shields up/down\nConsumes: energy\n.FF\n.pp\nShields protect you from Klingon attack\nand nearby novas.\nAs they protect you,\nthey weaken.\nA shield which is 78% effective\nwill absorb 78% of a hit\nand let 22% in to hurt you.\n.pp\nThe Klingons have a chance to attack you\nevery time you raise or lower shields.\nShields do not rise and lower\ninstantaneously,\nso the hit you receive\nwill be computed with the shields\nat an intermediate effectiveness.\n.pp\nIt takes energy to raise shields,\nbut not to drop them.\n.bl \"Cloaking Device\"\nMnemonic: cloak\nShortest Abbreviation: cl\nFull Command: cloak up/down\nConsumes: energy\n.FF\n.pp\nWhen you are cloaked,\nKlingons cannot see you,\nand hence they do not fire at you.\nThey are useful for entering\na quadrant\nand selecting a good position,\nhowever,\nweapons cannot be fired through\nthe cloak\ndue to the huge energy drain\nthat it requires.\n.pp\nThe cloak up command\nonly starts the cloaking process;\nKlingons will continue\nto fire at you\nuntil you do something\nwhich consumes time.\n.bl \"Fire Phasers\"\nMnemonic: phasers\nShortest Abbreviation: p\nFull Commands: phasers automatic amount\n\tphasers manual amt1 course1 spread1 ...\nConsumes: energy\n.FF\n.pp\nPhasers are energy weapons;\nthe energy comes from your ship's reserves\n(\"total energy\" on a srscan).\nIt takes about 250 units of hits\nto kill a Klingon.\nHits are cumulative as long as you stay\nin the quadrant.\n.pp\nPhasers become less effective\nthe further from a Klingon you are.\nAdjacent Klingons receive about\n90% of what you fire,\nat five sectors about 60%,\nand at ten sectors about 35%.\nThey have no effect outside of the quadrant.\n.pp\nPhasers cannot be fired while shields are up;\nto do so would fry you.\nThey have no effect on starbases or stars.\n.pp\nIn automatic mode\nthe computer decides how to divide up the energy\namong the Klingons present;\nin manual mode you do that yourself.\n.pp\nIn manual mode firing\nyou specify a direction,\namount (number of units to fire)\nand spread (0 -> 1.0)\nfor each of the six phaser banks.\nA zero amount\nterminates the manual input.\n.bl \"Fire Photon Torpedoes\"\nMnemonic: torpedo\nShortest Abbreviation: t\nFull Command: torpedo course [yes/no] [burst angle]\nConsumes: torpedoes\n.FF\n.pp\nTorpedoes are projectile weapons -- there are no partial hits.\nYou either hit your target or you don't.\nA hit on a Klingon destroys him.\nA hit on a starbase destroys that starbase\n(woops!).\nHitting a star usually causes it to go nova,\nand occasionally supernova.\n.pp\nPhoton torpedoes cannot be aimed precisely.\nThey can be fired with shields up,\nbut they get even more random\nas they pass through the shields.\n.pp\nTorpedoes may be fired in bursts of three.\nIf this is desired,\nthe burst angle is the angle\nbetween the three shots,\nwhich may vary from one to fifteen.\nThe word \"no\"\nsays that a burst is not wanted;\nthe word \"yes\"\n(which may be omitted\nif stated on the same line as the course)\nsays that a burst is wanted.\n.pp\nPhoton torpedoes\nhave no effect\noutside the quadrant.\n.bl \"Onboard Computer Request\"\nMnemonic: computer\nShortest Abbreviation: c\nFull Command: computer request; request;...\nConsumes: nothing\n.FF\n.pp\nThe computer command gives you access to the facilities\nof the onboard computer,\nwhich allows you to do all sorts of fascinating stuff.\nComputer requests are:\n.in +8\n.qq\nscore -- Shows your current score.\n.qq\ncourse quad/sect -- Computes the course and distance from wherever\nyou are to the given location.\nIf you type \"course /x,y\"\nyou will be given the course\nto sector x,y in the current quadrant.\n.qq\nmove quad/sect -- Identical to the course\nrequest,\nexcept that the move is executed.\n.qq\nchart -- prints a chart of the known galaxy,\ni.e.,\neverything that you have seen with a long range scan.\nThe format is the same as on a long range scan,\nexcept that \"...\" means\nthat you don't yet know what is there,\nand \".1.\" means that you know that a starbase\nexists, but you don't know anything else.\n\"$$$\" mans the quadrant\nthat you are currently in.\n.qq\ntrajectory -- prints the course and distance\nto all the Klingons in the quadrant.\n.qq\nwarpcost dist warp_factor -- computes the cost in time and energy\nto move `dist' quadrants at warp `warp_factor'.\n.qq\nimpcost dist -- same as warpcost for impulse engines.\n.qq\npheff range -- tells how effective your phasers are\nat a given range.\n.qq\ndistresslist -- gives a list of currently distressed\nstarbases\nand starsystems.\n.in -8\n.pp\nMore than one request may be stated\non a line\nby separating them\nwith semicolons.\n.bl \"Dock at Starbase\"\nMnemonic: dock\nShortest Abbreviation: do\nConsumes: nothing\n.FF\n.pp\nYou may dock at a starbase\nwhen you are in one of the eight\nadjacent sectors.\n.pp\nWhen you dock you are resupplied\nwith energy, photon torpedoes, and life support reserves.\nRepairs are also done faster at starbase.\nAny prisoners you have taken\nare unloaded.\nYou do not receive points\nfor taking prisoners\nuntil this time.\n.pp\nStarbases have their own deflector shields,\nso you are safe from attack while docked.\n.bl \"Undock from Starbase\"\nMnemonic: undock\nShortest Abbreviation: u\nConsumes: nothing\n.FF\n.pp\nThis just allows you to leave starbase\nso that you may proceed on your way.\n.bl \"Rest\"\nMnemonic: rest\nShortest Abbreviation: r\nFull Command: rest time\nConsumes: time\n.FF\n.pp\nThis command allows you to rest to repair damages.\nIt is not advisable to rest while under attack.\n.bl \"Call Starbase For Help\"\nMnemonic: help\nShortest Abbreviation: help\nConsumes: nothing\n.FF\n.pp\nYou may call starbase for help via your subspace radio.\nStarbase has long range transporter beams to get you.\nProblem is,\nthey can't always rematerialize you.\n.pp\nYou should avoid using this command unless absolutely necessary,\nfor the above reason and because it counts heavily against you\nin the scoring.\n.bl \"Capture Klingon\"\nMnemonic: capture\nShortest Abbreviation: ca\nConsumes: time\n.FF\n.pp\nYou may request that a Klingon surrender\nto you.\nIf he accepts,\nyou get to take captives\n(but only as many as your brig\ncan hold).\nIt is good if you do this,\nbecause you get points for captives.\nAlso,\nif you ever get captured,\nyou want to be sure that the Federation\nhas prisoners to exchange for you.\n.pp\nYou must go to a starbase\nto turn over your prisoners\nto Federation authorities.\n.bl \"Visual Scan\"\nMnemonic: visual\nShortest Abbreviation: v\nFull Command: visual course\nConsumes: time\n.FF\n.pp\nWhen your short range scanners are out,\nyou can still see what is out \"there\"\nby doing a visual scan.\nUnfortunately,\nyou can only see three sectors at one time,\nand it takes 0.005 stardates to perform.\n.pp\nThe three sectors in the general direction\nof the course specified\nare examined\nand displayed.\n.bl \"Abandon Ship\"\nMnemonic: abandon\nShortest Abbreviation: abandon\nConsumes: nothing\n.FF\n.pp\nThe officers escape the Enterprise in the shuttlecraft.\nIf the transporter is working\nand there is an inhabitable starsystem\nin the area,\nthe crew beams down,\notherwise you leave them to die.\nYou are given an old but still usable ship,\nthe Faire Queene.\n.bl \"Ram\"\nMnemonic: ram\nShortest Abbreviation: ram\nFull Command: ram course distance\nConsumes: time and energy\n.FF\n.pp\nThis command is identical to \"move\",\nexcept that the computer\ndoesn't stop you\nfrom making navigation errors.\n.pp\nYou get very nearly slaughtered\nif you ram anything.\n.bl \"Self Destruct\"\nMnemonic: destruct\nShortest Abbreviation: destruct\nConsumes: everything\n.FF\n.pp\nYour starship is self-destructed.\nChances are you will destroy\nany Klingons\n(and stars,\nand starbases)\nleft in your quadrant.\n.bl \"Terminate the Game\"\nMnemonic: terminate\nShortest Abbreviation: terminate\nFull Command: terminate yes/no\n.FF\n.pp\nCancels the current game.\nNo score is computed.\nIf you answer yes,\na new game will be started,\notherwise trek exits.\n.bl \"Call the Shell\"\nMnemonic: shell\nShortest Abbreviation: shell\n.FF\n.pp\nTemporarily escapes to the shell.\nWhen you log out of the shell\nyou will return to the game.\n.bp\n.ce\nSCORING\n.in +4\n.pp\nThe scoring algorithm is rather complicated.\nBasically,\nyou get points for each Klingon you kill,\nfor your Klingon per stardate kill rate,\nand a bonus if you win the game.\nYou lose\npoints for the number of Klingons left\nin the galaxy\nat the end of the game,\nfor getting killed,\nfor each star, starbase, or inhabited starsystem\nyou destroy,\nfor calling for help,\nand for each casualty you incur.\n.pp\nYou will be promoted\nif you play very well.\nYou will never get a promotion if you\ncall for help,\nabandon the Enterprise,\nget killed,\ndestroy a starbase or inhabited starsystem,\nor destroy too many stars.\n.bp\n.ce\nREFERENCE PAGE\n.sp 2\n.ta 36 56\n.nf\n.ul\nCommand\tUses\tConsumes\n\nABANDON\tshuttlecraft,\t-\n\t  transporter\nCApture\tsubspace radio\ttime\nCLoak Up/Down\tcloaking device\tenergy\nComputer request; request;...\tcomputer\t-\nDAmages\t-\t-\nDESTRUCT\tcomputer\t-\nDOck\t-\t-\nHELP\tsubspace radio\t-\nImpulse course distance\timpulse engines,\ttime, energy\n\t computer, SINS\nLrscan\tL.R. sensors\t-\nMove course distance\twarp engines,\ttime, energy\n\t  computer, SINS\nPhasers Automatic amount\tphasers, computer\tenergy\nPhasers Manual amt1 course1 spread1 ...\tphasers\tenergy\nTorpedo course [Yes] angle/No\ttorpedo tubes\ttorpedoes\nRAM course distance\twarp engines,\ttime, energy\n\t  computer, SINS\nRest time\t-\ttime\nSHELL\t-\t-\nSHields Up/Down\tshields\tenergy\nSrscan [Yes/No]\tS.R. sensors\t-\nSTatus\t-\t-\nTERMINATE Yes/No\t-\t-\nUndock\t-\t-\nVisual course\t-\ttime\nWarp warp_factor\t-\t-\n.fi\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/any.spec",
    "content": "require File.dirname(File.expand_path(__FILE__)) + '/../spec_helper'\n\ndescribe Spira::Types::Any do\n\n  before :all do\n    @uri = RDF::URI('http://example.org')\n  end\n\n  # this spec is going to be necessarily loose.  The 'Any' type is defined to\n  # use RDF.rb's automatic RDF Literal boxing and unboxing, which may or may\n  # not change between verions.\n  #\n  context \"when serializing\" do\n    it \"should serialize literals to RDF Literals\" do\n      serialized = Spira::Types::Any.serialize(15)\n      serialized.should be_a RDF::Literal\n      serialized = Spira::Types::Any.serialize(\"test\")\n      serialized.should be_a RDF::Literal\n    end\n\n    it \"should keep RDF::URIs as URIs\" do\n      Spira::Types::Any.serialize(@uri).should == @uri\n    end\n\n    it \"should fail to serialize collections\" do\n      lambda { Spira::Types::Any.serialize([]) }.should raise_error TypeError\n    end\n  end\n\n  context \"when unserializing\" do\n    it \"should unserialize to ruby types\" do\n      value = Spira::Types::Any.unserialize(RDF::Literal.new(5, :datatype => RDF::XSD.integer))\n      value.should == 5\n      value = Spira::Types::Any.unserialize(RDF::Literal.new(\"a string\"))\n      value.should == \"a string\"\n    end\n\n    it \"should unserialize URIs to URIs\" do\n      Spira::Types::Any.unserialize(@uri).should == @uri\n    end\n  end\n\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/.irbrc",
    "content": "require \"pp\"\nIRB.conf[:AUTO_INDENT] = true\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/.pryrc",
    "content": "Pry.config.commands.import Pry::ExtendedCommands::Experimental\n\nPry.config.pager = false\n\nPry.config.color = false\n\nPry.config.commands.alias_command \"lM\", \"ls -M\"\n\nPry.config.commands.command \"add\", \"Add a list of numbers together\" do |*args|\n  output.puts \"Result is: #{args.map(&:to_i).inject(&:+)}\"\nend\n\nPry.config.history.should_save = false\n\nPry.config.prompt = [proc { \"input> \" },\n                     proc { \"     | \" }]\n\n# Disable pry-buggy-plug:\nPry.plugins[\"buggy-plug\"].disable!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/Appraisals",
    "content": "appraise \"rails32\" do\n  gem 'rails', '~> 3.2.0'\nend\n\nappraise \"rails40\" do\n  gem 'rails', '~> 4.0.0'\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/Brewfile",
    "content": "tap 'caskroom/cask'\ntap 'telemachus/brew', 'https://telemachus@bitbucket.org/telemachus/brew.git'\nbrew 'emacs', args: ['with-cocoa', 'with-gnutls']\nbrew 'redis', restart_service: true\nbrew 'mongodb'\nbrew 'sphinx'\nbrew 'imagemagick'\nbrew 'mysql'\ncask 'google-chrome'\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/Capfile",
    "content": "load 'deploy'\nDir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }\nload 'config/deploy'\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/Dangerfile",
    "content": "# Sometimes its a README fix, or something like that - which isn't relevant for\n# including in a CHANGELOG for example\n# From https://github.com/danger/danger/blob/master/Dangerfile\n\nhas_app_changes = !git.modified_files.grep(/lib/).empty?\nhas_test_changes = !git.modified_files.grep(/spec/).empty?\nis_version_bump = git.modified_files.sort == [\"CHANGELOG.md\", \"lib/danger/version.rb\"].sort\n\nif has_app_changes && !has_test_changes && !is_version_bump\n  warn(\"Tests were not updated\", sticky: false)\nend\n\n# Thanks other people!\nmessage(\":tada:\") if is_version_bump && github.pr_author != \"orta\"\n\n# Make a note about contributors not in the organization\nunless github.api.organization_member?('danger', github.pr_author)\n  message \"@#{github.pr_author} is not a contributor yet, would you like to join the Danger org?\"\n\n  # Pay extra attention if they modify the gemspec\n  if git.modified_files.include?(\"*.gemspec\")\n    warn \"External contributor has edited the Gemspec\"\n  end\nend\n\n# Mainly to encourage writing up some reasoning about the PR, rather than\n# just leaving a title\nif github.pr_body.length < 5\n  fail \"Please provide a summary in the Pull Request description\"\nend\n\n# Let people say that this isn't worth a CHANGELOG entry in the PR if they choose\ndeclared_trivial = (github.pr_title + github.pr_body).include?(\"#trivial\") || !has_app_changes\n\nif !git.modified_files.include?(\"CHANGELOG.md\") && !declared_trivial\n  fail(\"Please include a CHANGELOG entry. \\nYou can find it at [CHANGELOG.md](https://github.com/danger/danger/blob/master/CHANGELOG.md).\", sticky: false)\nend\n\n# Docs are critical, so let's re-run the docs part of the specs and show any issues:\ncore_plugins_docs = `bundle exec danger plugins lint lib/danger/danger_core/plugins/*.rb --warnings-as-errors`\n\n# If it failed, fail the build, and include markdown with the output error.\nunless $?.success?\n  # We want to strip ANSI colors for our markdown, and make paths relative\n  colourless_error = core_plugins_docs.gsub(/\\e\\[(\\d+)(;\\d+)*m/, \"\")\n  markdown(\"### Core Docs Errors \\n\\n#{colourless_error}\")\n  fail(\"Failing due to documentation issues, see below.\", sticky: false)\nend\n\n# Oddly enough, it's quite possible to do some testing of Danger, inside Danger\n# So, you can ignore these, if you're looking at the Dangerfile to get ideas.\n#\n# If these are all empty something has gone wrong, better to raise it in a comment\nif git.modified_files.empty? && git.added_files.empty? && git.deleted_files.empty?\n  fail \"This PR has no changes at all, this is likely an issue during development.\"\nend\n\n# This comes from `./danger_plugins/protect_files.rb` which is automatically parsed by Danger\nfiles.protect_files(path: \"danger.gemspec\", message: \".gemspec modified\", fail_build: false)\n\n# Ensure that our core plugins all have 100% documentation\ncore_plugins = Dir.glob(\"lib/danger/danger_core/plugins/*.rb\")\ncore_lint_output = `bundle exec yard stats #{core_plugins.join ' '} --list-undoc --tag tags`\n\nif !core_lint_output.include?(\"100.00%\")\n  fail \"The core plugins are not at 100% doc'd - see below:\", sticky: false\n  markdown \"```\\n#{core_lint_output}```\"\nelsif core_lint_output.include? \"warning\"\n  warn \"The core plugins are have yard warnings - see below\", sticky: false\n  markdown \"```\\n#{core_lint_output}```\"\nend\n\njunit.parse \"junit-results.xml\"\njunit.headers = [:file, :name]\njunit.report\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/Deliverfile",
    "content": "require 'open-uri'\n\nframework_version = JSON.parse(open(url).read)\n\n# The URL below is password protected\napps = JSON.parse(open(url).read)\n\napp_id = Dir.pwd.split(\"/\")[-2].to_i\napp = apps[app_id.to_s]\n\n# The app identifier is required\napp_identifier \"net.sunapps.#{app_id}\"\n\nversion framework_version['version_number']\n\ntitle(\n  'de-DE' => app[\"fullName\"]\n)\n\ndescription(\n  'de-DE' => app[\"description\"][\"de\"]\n)\n\nchangelog(\n  'de-DE' => framework_version[\"public_description\"][\"de\"]\n)\n\nkeywords(\n  'de-DE' => app[\"keywords\"][\"de\"].split(\",\")\n)\n\napp_icon \"../Submission/AppIconFull.png\"\n\nprice_tier 0 # free app\n\nprimary_category \"Reference\"\n\nsecondary_category \"Business\"\n\nautomatic_release true\n\nratings_config_path \"./ratings_config.json\"\n\napp_review_information({\n  first_name: \"Felix\",\n  phone_number: \"My Phone Number\",\n  demo_user: \"\",\n  demo_password: \"\",\n  notes: \"\"\n})"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/Fastfile",
    "content": "# Customise this file, documentation can be found here:\n# https://github.com/KrauseFx/fastlane/tree/master/docs\n\n$:.unshift File.dirname(__FILE__)\nrequire 'lib/utils.rb'\n\nfastlane_version \"1.0.0\"\n\ndefault_platform :ios\n\nplatform :ios do\n  before_all do\n     ENV['DELIVER_WHAT_TO_TEST'] = git_commit_log\n     ensure_git_status_clean\n  end\n\n  desc \"Runs linting (and eventually static analysis)\"\n  lane :analyze do\n    return if test_disabled?\n    make 'lint'\n  end\n\n  desc \"Runs all the unit tests.\"\n  lane :test do\n    return if test_disabled?\n    # TODO: lint & test JS code\n    xctest(\n      scheme: 'Wikipedia',\n      destination: \"platform=iOS Simulator,name=iPhone 6,OS=8.3\",\n      reports: [\n        {\n          report: \"html\",\n          output: \"build/reports/unit-tests.html\"\n        },\n        {\n          report: \"junit\",\n          output: \"build/reports/unit-tests.xml\"\n        }\n      ],\n      clean: nil\n    )\n  end\n\n  desc \"Bump the version, and submit a new **Wikipedia Alpha** Build to Apple TestFlight\"\n  lane :alpha do\n    # snapshot\n    sigh\n    increment_build_number\n\n    # uncomment when CI is able to push tags\n    if ENV['WMF_BUMP']\n      commit_version_bump\n      plist_version = get_version_short_string File.expand_path(File.join(ENV['PWD'], 'Wikipedia/Wikipedia-Info.plist'))\n      # tag must be added after the version bump is committed\n      add_git_tag(tag: \"#{plist_version}.#{Actions.lane_context[Actions::SharedValues::BUILD_NUMBER]}\")\n    end\n\n    ipa(\n      configuration: \"Alpha\",\n      scheme: \"Wikipedia Alpha\",\n    )\n    hockey(\n      notes: '',\n      notify: '0', # Means do not notify\n      status: '1', # Means do not make available for download\n    )\n    deliver skip_deploy: true, beta: true\n\n    # uncomment when CI is able to push tags\n    if ENV['WMF_BUMP']\n      # only push after everything else has succeeded\n      push_to_git_remote\n    end\n  end\n\n  desc \"Submit a new **Wikipedia Beta** build to Apple TestFlight\"\n  lane :beta do\n    # snapshot\n    sigh\n    ipa(\n      configuration: \"Beta\",\n      scheme: \"Wikipedia Beta\",\n    )\n    hockey(\n      notes: '',\n      notify: '0', # Means do not notify\n      status: '1', # Means do not make available for download\n    )\n    deliver skip_deploy: true, beta: true\n  end\n\n  desc \"Deploy a new version to the App Store\"\n  lane :store do\n    # snapshot\n    sigh\n    ipa(\n      configuration: \"Wikipedia\",\n      scheme: \"Wikipedia\",\n    )\n    hockey(\n      notes: '',\n      notify: '0', # Means do not notify\n      status: '1', # Means do not make available for download\n    )\n    deliver skip_deploy: true, force: true\n  end\n\n  after_all do |lane|\n  \n  end\n\n  error do |lane, exception|\n  \n  end\nend"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/Podfile",
    "content": "source 'https://github.com/CocoaPods/Specs.git'\n\nplatform :ios, :deployment_target => '6.0'\n\ninhibit_all_warnings!\n\nxcodeproj 'Wikipedia'\n\npod 'AFNetworking/NSURLConnection', '~> 2.5'\npod 'hpple', '~> 0.2'\npod 'blockskit/Core', '~> 2.2'\npod 'Masonry', '~> 0.6'\npod 'HockeySDK', '3.6.2'\n\ntarget 'WikipediaUnitTests', :exclusive => false do\n  pod 'OCMockito', '~> 1.4'\n  pod 'OCHamcrest', '~> 4.1'\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/Rakefile",
    "content": "task :default do\n  puts \"Rake\"\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/filenames/Snapfile",
    "content": "\n# Download the latest screenshot information from the CMS\napp_id = Dir.pwd.split(\"/\")[-2].to_i\nFile.write(\"./screenshots.json\", open(\"https://...amazonaws.com/1.0/#{app_id}/....json\").read) rescue nil\n\n\n# A list of devices you want to take the screenshots from\ndevices([\n  \"iPhone 6\",\n  \"iPhone 6 Plus\",\n  \"iPhone 5\",\n  \"iPhone 4s\"\n])\n\nlanguages([\n  'de-DE'\n])\n\n# Where should the resulting screenshots be stored?\nscreenshots_path \"./screenshots\"\n\n# JavaScript UIAutomation file\njs_file './snapshot.js'\n\n# The name of the project's scheme\nscheme 'Release'"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/foo.rb",
    "content": "module Foo\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/formula.rb",
    "content": "require 'download_strategy'\nrequire 'dependencies'\nrequire 'formula_support'\nrequire 'hardware'\nrequire 'bottles'\nrequire 'extend/fileutils'\nrequire 'patches'\nrequire 'compilers'\n\n# Derive and define at least @url, see Library/Formula for examples\nclass Formula\n  include FileUtils\n\n  attr_reader :name, :path, :url, :version, :homepage, :specs, :downloader\n  attr_reader :standard, :unstable, :head\n  attr_reader :bottle_version, :bottle_url, :bottle_sha1\n\n  # The build folder, usually in /tmp.\n  # Will only be non-nil during the stage method.\n  attr_reader :buildpath\n\n  # Homebrew determines the name\n  def initialize name='__UNKNOWN__', path=nil\n    set_instance_variable 'homepage'\n    set_instance_variable 'url'\n    set_instance_variable 'bottle_version'\n    set_instance_variable 'bottle_url'\n    set_instance_variable 'bottle_sha1'\n    set_instance_variable 'head'\n    set_instance_variable 'specs'\n    set_instance_variable 'standard'\n    set_instance_variable 'unstable'\n\n    if @head and (not @url or ARGV.build_head?)\n      @url = @head\n      @version = 'HEAD'\n      @spec_to_use = @unstable\n    else\n      if @standard.nil?\n        @spec_to_use = SoftwareSpecification.new(@url, @specs)\n      else\n        @spec_to_use = @standard\n      end\n    end\n\n    raise \"No url provided for formula #{name}\" if @url.nil?\n    @name = name\n    validate_variable :name\n\n    # If we got an explicit path, use that, else determine from the name\n    @path = path.nil? ? self.class.path(name) : Pathname.new(path)\n\n    # Use a provided version, if any\n    set_instance_variable 'version'\n    # Otherwise detect the version from the URL\n    @version ||= @spec_to_use.detect_version\n    # Only validate if a version was set; GitHubGistFormula needs to get\n    # the URL to determine the version\n    validate_variable :version if @version\n\n    CHECKSUM_TYPES.each { |type| set_instance_variable type }\n\n    @downloader = download_strategy.new @spec_to_use.url, name, version, @spec_to_use.specs\n\n    @bottle_url ||= bottle_base_url + bottle_filename(self) if @bottle_sha1\n  end\n\n  # if the dir is there, but it's empty we consider it not installed\n  def installed?\n    return installed_prefix.children.length > 0\n  rescue\n    return false\n  end\n\n  def explicitly_requested?\n    # `ARGV.formulae` will throw an exception if it comes up with an empty list.\n    # FIXME: `ARGV.formulae` shouldn't be throwing exceptions, see issue #8823\n   return false if ARGV.named.empty?\n   ARGV.formulae.include? self\n  end\n\n  def linked_keg\n    HOMEBREW_REPOSITORY/'Library/LinkedKegs'/@name\n  end\n\n  def installed_prefix\n    head_prefix = HOMEBREW_CELLAR+@name+'HEAD'\n    if @version == 'HEAD' || head_prefix.directory?\n      head_prefix\n    else\n      prefix\n    end\n  end\n\n  def prefix\n    validate_variable :name\n    validate_variable :version\n    HOMEBREW_CELLAR+@name+@version\n  end\n  def rack; prefix.parent end\n\n  def bin;     prefix+'bin'            end\n  def doc;     prefix+'share/doc'+name end\n  def include; prefix+'include'        end\n  def info;    prefix+'share/info'     end\n  def lib;     prefix+'lib'            end\n  def libexec; prefix+'libexec'        end\n  def man;     prefix+'share/man'      end\n  def man1;    man+'man1'              end\n  def man2;    man+'man2'              end\n  def man3;    man+'man3'              end\n  def man4;    man+'man4'              end\n  def man5;    man+'man5'              end\n  def man6;    man+'man6'              end\n  def man7;    man+'man7'              end\n  def man8;    man+'man8'              end\n  def sbin;    prefix+'sbin'           end\n  def share;   prefix+'share'          end\n\n  # configuration needs to be preserved past upgrades\n  def etc; HOMEBREW_PREFIX+'etc' end\n  # generally we don't want var stuff inside the keg\n  def var; HOMEBREW_PREFIX+'var' end\n\n  # plist name, i.e. the name of the launchd service\n  def plist_name; 'homebrew.mxcl.'+name end\n  def plist_path; prefix+(plist_name+'.plist') end\n\n  # Use the @spec_to_use to detect the download strategy.\n  # Can be overriden to force a custom download strategy\n  def download_strategy\n    @spec_to_use.download_strategy\n  end\n\n  def cached_download\n    @downloader.cached_location\n  end\n\n  # tell the user about any caveats regarding this package, return a string\n  def caveats; nil end\n\n  # any e.g. configure options for this package\n  def options; [] end\n\n  # patches are automatically applied after extracting the tarball\n  # return an array of strings, or if you need a patch level other than -p1\n  # return a Hash eg.\n  #   {\n  #     :p0 => ['http://foo.com/patch1', 'http://foo.com/patch2'],\n  #     :p1 =>  'http://bar.com/patch2',\n  #     :p2 => ['http://moo.com/patch5', 'http://moo.com/patch6']\n  #   }\n  # The final option is to return DATA, then put a diff after __END__. You\n  # can still return a Hash with DATA as the value for a patch level key.\n  def patches; end\n\n  # rarely, you don't want your library symlinked into the main prefix\n  # see gettext.rb for an example\n  def keg_only?\n    self.class.keg_only_reason || false\n  end\n\n  def fails_with? cc\n    return false if self.class.cc_failures.nil?\n    cc = Compiler.new(cc) unless cc.is_a? Compiler\n    return self.class.cc_failures.find do |failure|\n      next unless failure.compiler == cc.name\n      failure.build.zero? or failure.build >= cc.build\n    end\n  end\n\n  # sometimes the clean process breaks things\n  # skip cleaning paths in a formula with a class method like this:\n  #   skip_clean [bin+\"foo\", lib+\"bar\"]\n  # redefining skip_clean? now deprecated\n  def skip_clean? path\n    return true if self.class.skip_clean_all?\n    to_check = path.relative_path_from(prefix).to_s\n    self.class.skip_clean_paths.include? to_check\n  end\n\n  # yields self with current working directory set to the uncompressed tarball\n  def brew\n    validate_variable :name\n    validate_variable :version\n\n    stage do\n      begin\n        patch\n        # we allow formulas to do anything they want to the Ruby process\n        # so load any deps before this point! And exit asap afterwards\n        yield self\n      rescue Interrupt, RuntimeError, SystemCallError => e\n        puts if Interrupt === e # don't print next to the ^C\n        unless ARGV.debug?\n          %w(config.log CMakeCache.txt).select{|f| File.exist? f}.each do |f|\n            HOMEBREW_LOGS.install f\n            puts \"#{f} was copied to #{HOMEBREW_LOGS}\"\n          end\n          raise\n        end\n        onoe e.inspect\n        puts e.backtrace\n\n        ohai \"Rescuing build...\"\n        if (e.was_running_configure? rescue false) and File.exist? 'config.log'\n          puts \"It looks like an autotools configure failed.\"\n          puts \"Gist 'config.log' and any error output when reporting an issue.\"\n          puts\n        end\n\n        puts \"When you exit this shell Homebrew will attempt to finalise the installation.\"\n        puts \"If nothing is installed or the shell exits with a non-zero error code,\"\n        puts \"Homebrew will abort. The installation prefix is:\"\n        puts prefix\n        interactive_shell self\n      end\n    end\n  end\n\n  def == b\n    name == b.name\n  end\n  def eql? b\n    self == b and self.class.equal? b.class\n  end\n  def hash\n    name.hash\n  end\n  def <=> b\n    name <=> b.name\n  end\n  def to_s\n    name\n  end\n\n  # Standard parameters for CMake builds.\n  # Using Build Type \"None\" tells cmake to use our CFLAGS,etc. settings.\n  # Setting it to Release would ignore our flags.\n  # Setting CMAKE_FIND_FRAMEWORK to \"LAST\" tells CMake to search for our\n  # libraries before trying to utilize Frameworks, many of which will be from\n  # 3rd party installs.\n  # Note: there isn't a std_autotools variant because autotools is a lot\n  # less consistent and the standard parameters are more memorable.\n  def std_cmake_args\n    %W[\n      -DCMAKE_INSTALL_PREFIX=#{prefix}\n      -DCMAKE_BUILD_TYPE=None\n      -DCMAKE_FIND_FRAMEWORK=LAST\n      -Wno-dev\n    ]\n  end\n\n  def self.class_s name\n    #remove invalid characters and then camelcase it\n    name.capitalize.gsub(/[-_.\\s]([a-zA-Z0-9])/) { $1.upcase } \\\n                   .gsub('+', 'x')\n  end\n\n  # an array of all Formula names\n  def self.names\n    Dir[\"#{HOMEBREW_REPOSITORY}/Library/Formula/*.rb\"].map{ |f| File.basename f, '.rb' }.sort\n  end\n\n  # an array of all Formula, instantiated\n  def self.all\n    map{ |f| f }\n  end\n  def self.map\n    rv = []\n    each{ |f| rv << yield(f) }\n    rv\n  end\n  def self.each\n    names.each do |n|\n      begin\n        yield Formula.factory(n)\n      rescue\n        # Don't let one broken formula break commands. But do complain.\n        onoe \"Formula #{n} will not import.\"\n      end\n    end\n  end\n\n  def inspect\n    name\n  end\n\n  def self.aliases\n    Dir[\"#{HOMEBREW_REPOSITORY}/Library/Aliases/*\"].map{ |f| File.basename f }.sort\n  end\n\n  def self.canonical_name name\n    name = name.to_s if name.kind_of? Pathname\n\n    formula_with_that_name = HOMEBREW_REPOSITORY+\"Library/Formula/#{name}.rb\"\n    possible_alias = HOMEBREW_REPOSITORY+\"Library/Aliases/#{name}\"\n    possible_cached_formula = HOMEBREW_CACHE_FORMULA+\"#{name}.rb\"\n\n    if name.include? \"/\"\n      if name =~ %r{(.+)/(.+)/(.+)}\n        tapd = HOMEBREW_REPOSITORY/\"Library/Taps\"/\"#$1-#$2\".downcase\n        tapd.find_formula do |relative_pathname|\n          return \"#{tapd}/#{relative_pathname}\" if relative_pathname.stem.to_s == $3\n        end if tapd.directory?\n      end\n      # Otherwise don't resolve paths or URLs\n      name\n    elsif formula_with_that_name.file? and formula_with_that_name.readable?\n      name\n    elsif possible_alias.file?\n      possible_alias.realpath.basename('.rb').to_s\n    elsif possible_cached_formula.file?\n      possible_cached_formula.to_s\n    else\n      name\n    end\n  end\n\n  def self.factory name\n    # If an instance of Formula is passed, just return it\n    return name if name.kind_of? Formula\n\n    # Otherwise, convert to String in case a Pathname comes in\n    name = name.to_s\n\n    # If a URL is passed, download to the cache and install\n    if name =~ %r[(https?|ftp)://]\n      url = name\n      name = Pathname.new(name).basename\n      target_file = HOMEBREW_CACHE_FORMULA+name\n      name = name.basename(\".rb\").to_s\n\n      HOMEBREW_CACHE_FORMULA.mkpath\n      FileUtils.rm target_file, :force => true\n      curl url, '-o', target_file\n\n      require target_file\n      install_type = :from_url\n    else\n      name = Formula.canonical_name(name)\n      # If name was a path or mapped to a cached formula\n      if name.include? \"/\"\n        require name\n\n        # require allows filenames to drop the .rb extension, but everything else\n        # in our codebase will require an exact and fullpath.\n        name = \"#{name}.rb\" unless name =~ /\\.rb$/\n\n        path = Pathname.new(name)\n        name = path.stem\n        install_type = :from_path\n        target_file = path.to_s\n      else\n        # For names, map to the path and then require\n        require Formula.path(name)\n        install_type = :from_name\n      end\n    end\n\n    begin\n      klass_name = self.class_s(name)\n      klass = Object.const_get klass_name\n    rescue NameError\n      # TODO really this text should be encoded into the exception\n      # and only shown if the UI deems it correct to show it\n      onoe \"class \\\"#{klass_name}\\\" expected but not found in #{name}.rb\"\n      puts \"Double-check the name of the class in that formula.\"\n      raise LoadError\n    end\n\n    return klass.new(name) if install_type == :from_name\n    return klass.new(name, target_file)\n  rescue LoadError\n    raise FormulaUnavailableError.new(name)\n  end\n\n  def tap\n    if path.realpath.to_s =~ %r{#{HOMEBREW_REPOSITORY}/Library/Taps/(\\w+)-(\\w+)}\n      \"#$1/#$2\"\n    else\n      # remotely installed formula are not mxcl/master but this will do for now\n      \"mxcl/master\"\n    end\n  end\n\n  def self.path name\n    HOMEBREW_REPOSITORY+\"Library/Formula/#{name.downcase}.rb\"\n  end\n\n  def mirrors;       self.class.mirrors or []; end\n\n  def deps;          self.class.dependencies.deps;          end\n  def external_deps; self.class.dependencies.external_deps; end\n\n  # deps are in an installable order\n  # which means if a depends on b then b will be ordered before a in this list\n  def recursive_deps\n    Formula.expand_deps(self).flatten.uniq\n  end\n\n  def self.expand_deps f\n    f.deps.map do |dep|\n      f_dep = Formula.factory dep.to_s\n      expand_deps(f_dep) << f_dep\n    end\n  end\n\nprotected\n\n  # Pretty titles the command and buffers stdout/stderr\n  # Throws if there's an error\n  def system cmd, *args\n    # remove \"boring\" arguments so that the important ones are more likely to\n    # be shown considering that we trim long ohai lines to the terminal width\n    pretty_args = args.dup\n    pretty_args.delete \"--disable-dependency-tracking\" if cmd == \"./configure\" and not ARGV.verbose?\n    ohai \"#{cmd} #{pretty_args*' '}\".strip\n\n    removed_ENV_variables = case if args.empty? then cmd.split(' ').first else cmd end\n    when \"xcodebuild\"\n      ENV.remove_cc_etc\n    end\n\n    if ARGV.verbose?\n      safe_system cmd, *args\n    else\n      rd, wr = IO.pipe\n      pid = fork do\n        rd.close\n        $stdout.reopen wr\n        $stderr.reopen wr\n        args.collect!{|arg| arg.to_s}\n        exec(cmd, *args) rescue nil\n        exit! 1 # never gets here unless exec threw or failed\n      end\n      wr.close\n      out = ''\n      out << rd.read until rd.eof?\n      Process.wait\n      unless $?.success?\n        puts out\n        raise\n      end\n    end\n\n    removed_ENV_variables.each do |key, value|\n      ENV[key] = value # ENV.kind_of? Hash  # => false\n    end if removed_ENV_variables\n\n  rescue\n    raise BuildError.new(self, cmd, args, $?)\n  end\n\npublic\n\n  # For brew-fetch and others.\n  def fetch\n    if install_bottle? self\n      downloader = CurlBottleDownloadStrategy.new bottle_url, name, version, nil\n      mirror_list = []\n    else\n      downloader = @downloader\n      # Don't attempt mirrors if this install is not pointed at a \"stable\" URL.\n      # This can happen when options like `--HEAD` are invoked.\n      mirror_list =  @spec_to_use == @standard ? mirrors : []\n    end\n\n    # Ensure the cache exists\n    HOMEBREW_CACHE.mkpath\n\n    begin\n      fetched = downloader.fetch\n    rescue CurlDownloadStrategyError => e\n      raise e if mirror_list.empty?\n      puts \"Trying a mirror...\"\n      url, specs = mirror_list.shift.values_at :url, :specs\n      downloader = download_strategy.new url, name, version, specs\n      retry\n    end\n\n    return fetched, downloader\n  end\n\n  # Detect which type of checksum is being used, or nil if none\n  def checksum_type\n    CHECKSUM_TYPES.detect { |type| instance_variable_defined?(\"@#{type}\") }\n  end\n\n  # For FormulaInstaller.\n  def verify_download_integrity fn, *args\n    require 'digest'\n    if args.length != 2\n      type = checksum_type || :md5\n      supplied = instance_variable_get(\"@#{type}\")\n      # Convert symbol to readable string\n      type = type.to_s.upcase\n    else\n      supplied, type = args\n    end\n\n    hasher = Digest.const_get(type)\n    hash = fn.incremental_hash(hasher)\n\n    if supplied and not supplied.empty?\n      message = <<-EOF\n#{type} mismatch\nExpected: #{supplied}\nGot: #{hash}\nArchive: #{fn}\n(To retry an incomplete download, remove the file above.)\nEOF\n      raise message unless supplied.upcase == hash.upcase\n    else\n      opoo \"Cannot verify package integrity\"\n      puts \"The formula did not provide a download checksum\"\n      puts \"For your reference the #{type} is: #{hash}\"\n    end\n  end\n\nprivate\n\n  CHECKSUM_TYPES=[:md5, :sha1, :sha256].freeze\n\n  def stage\n    fetched, downloader = fetch\n    verify_download_integrity fetched if fetched.kind_of? Pathname\n    mktemp do\n      downloader.stage\n      # Set path after the downloader changes the working folder.\n      @buildpath = Pathname.pwd\n      yield\n      @buildpath = nil\n    end\n  end\n\n  def patch\n    patch_list = Patches.new(patches)\n    return if patch_list.empty?\n\n    if patch_list.external_patches?\n      ohai \"Downloading patches\"\n      patch_list.download!\n    end\n\n    ohai \"Patching\"\n    patch_list.each do |p|\n      case p.compression\n        when :gzip  then safe_system \"/usr/bin/gunzip\",  p.compressed_filename\n        when :bzip2 then safe_system \"/usr/bin/bunzip2\", p.compressed_filename\n      end\n      # -f means don't prompt the user if there are errors; just exit with non-zero status\n      safe_system '/usr/bin/patch', '-f', *(p.patch_args)\n    end\n  end\n\n  def validate_variable name\n    v = instance_variable_get(\"@#{name}\")\n    raise \"Invalid @#{name}\" if v.to_s.empty? or v =~ /\\s/\n  end\n\n  def set_instance_variable(type)\n    return if instance_variable_defined? \"@#{type}\"\n    class_value = self.class.send(type)\n    instance_variable_set(\"@#{type}\", class_value) if class_value\n  end\n\n  def self.method_added method\n    raise 'You cannot override Formula.brew' if method == :brew\n  end\n\n  class << self\n    # The methods below define the formula DSL.\n    attr_reader :standard, :unstable\n\n    def self.attr_rw(*attrs)\n      attrs.each do |attr|\n        class_eval %Q{\n          def #{attr}(val=nil)\n            val.nil? ? @#{attr} : @#{attr} = val\n          end\n        }\n      end\n    end\n\n    attr_rw :version, :homepage, :mirrors, :specs\n    attr_rw :keg_only_reason, :skip_clean_all, :cc_failures\n    attr_rw :bottle_version, :bottle_url, :bottle_sha1\n    attr_rw(*CHECKSUM_TYPES)\n\n    def head val=nil, specs=nil\n      return @head if val.nil?\n      @unstable = SoftwareSpecification.new(val, specs)\n      @head = val\n      @specs = specs\n    end\n\n    def url val=nil, specs=nil\n      return @url if val.nil?\n      @standard = SoftwareSpecification.new(val, specs)\n      @url = val\n      @specs = specs\n    end\n\n    def stable &block\n      raise \"url and md5 must be specified in a block\" unless block_given?\n      instance_eval(&block) unless ARGV.build_devel? or ARGV.build_head?\n    end\n\n    def devel &block\n      raise \"url and md5 must be specified in a block\" unless block_given?\n      if ARGV.build_devel?\n        @mirrors = nil # clear out mirrors from the stable release\n        instance_eval(&block)\n      end\n    end\n\n    def bottle url=nil, &block\n      return unless block_given?\n\n      bottle_block = Class.new do\n        def self.version version\n          @version = version\n        end\n\n        def self.url url\n          @url = url\n        end\n\n        def self.sha1 sha1\n          case sha1\n          when Hash\n            key, value = sha1.shift\n            @sha1 = key if value == MacOS.cat\n          when String\n            @sha1 = sha1 if MacOS.lion?\n          end\n        end\n\n        def self.data\n          @version = 0 unless @version\n          return @version, @url, @sha1 if @sha1 && @url\n          return @version, nil, @sha1 if @sha1\n        end\n      end\n\n      bottle_block.instance_eval(&block)\n      @bottle_version, @bottle_url, @bottle_sha1 = bottle_block.data\n    end\n\n    def mirror val, specs=nil\n      @mirrors ||= []\n      @mirrors << {:url => val, :specs => specs}\n      # Added the uniq after some inspection with Pry---seems `mirror` gets\n      # called three times. The first two times only one copy of the input is\n      # left in `@mirrors`. On the final call, two copies are present. This\n      # happens with `@deps` as well. Odd.\n      @mirrors.uniq!\n    end\n\n    def dependencies\n      @dependencies ||= DependencyCollector.new\n    end\n\n    def depends_on dep\n      dependencies.add(dep)\n    end\n\n    def skip_clean paths\n      if paths == :all\n        @skip_clean_all = true\n        return\n      end\n      @skip_clean_paths ||= []\n      [paths].flatten.each do |p|\n        @skip_clean_paths << p.to_s unless @skip_clean_paths.include? p.to_s\n      end\n    end\n\n    def skip_clean_all?\n      @skip_clean_all\n    end\n\n    def skip_clean_paths\n      @skip_clean_paths or []\n    end\n\n    def keg_only reason, explanation=nil\n      @keg_only_reason = KegOnlyReason.new(reason, explanation.to_s.chomp)\n    end\n\n    def fails_with compiler, &block\n      @cc_failures ||= CompilerFailures.new\n      @cc_failures << if block_given?\n        CompilerFailure.new(compiler, &block)\n      else\n        CompilerFailure.new(compiler)\n      end\n    end\n  end\nend\n\nrequire 'formula_specialties'\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/gen-rb-linguist-thrift.rb",
    "content": "#\n# Autogenerated by Thrift Compiler (1.0.0-dev)\n#\n# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n#\n\nrequire 'thrift'\nrequire 'linguist_types'\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/grit.rb",
    "content": "module Grit\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/index.json.jbuilder",
    "content": "json.array!(@courts) do |court|\n  json.extract! court, :id, :name_r, :region, :region_r, :email, :website\n  json.url court_url(court, format: :json)\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/inflector.rb",
    "content": "# encoding: utf-8\n\nrequire 'active_support/inflector/inflections'\n\nmodule ActiveSupport\n  # The Inflector transforms words from singular to plural, class names to table names, modularized class names to ones without,\n  # and class names to foreign keys. The default inflections for pluralization, singularization, and uncountable words are kept\n  # in inflections.rb.\n  #\n  # The Rails core team has stated patches for the inflections library will not be accepted\n  # in order to avoid breaking legacy applications which may be relying on errant inflections.\n  # If you discover an incorrect inflection and require it for your application, you'll need\n  # to correct it yourself (explained below).\n  module Inflector\n    extend self\n\n    # Returns the plural form of the word in the string.\n    #\n    #   \"post\".pluralize             # => \"posts\"\n    #   \"octopus\".pluralize          # => \"octopi\"\n    #   \"sheep\".pluralize            # => \"sheep\"\n    #   \"words\".pluralize            # => \"words\"\n    #   \"CamelOctopus\".pluralize     # => \"CamelOctopi\"\n    def pluralize(word)\n      apply_inflections(word, inflections.plurals)\n    end\n\n    # The reverse of +pluralize+, returns the singular form of a word in a string.\n    #\n    #   \"posts\".singularize            # => \"post\"\n    #   \"octopi\".singularize           # => \"octopus\"\n    #   \"sheep\".singularize            # => \"sheep\"\n    #   \"word\".singularize             # => \"word\"\n    #   \"CamelOctopi\".singularize      # => \"CamelOctopus\"\n    def singularize(word)\n      apply_inflections(word, inflections.singulars)\n    end\n\n    # By default, +camelize+ converts strings to UpperCamelCase. If the argument to +camelize+\n    # is set to <tt>:lower</tt> then +camelize+ produces lowerCamelCase.\n    #\n    # +camelize+ will also convert '/' to '::' which is useful for converting paths to namespaces.\n    #\n    #   \"active_model\".camelize                # => \"ActiveModel\"\n    #   \"active_model\".camelize(:lower)        # => \"activeModel\"\n    #   \"active_model/errors\".camelize         # => \"ActiveModel::Errors\"\n    #   \"active_model/errors\".camelize(:lower) # => \"activeModel::Errors\"\n    #\n    # As a rule of thumb you can think of +camelize+ as the inverse of +underscore+,\n    # though there are cases where that does not hold:\n    #\n    #   \"SSLError\".underscore.camelize # => \"SslError\"\n    def camelize(term, uppercase_first_letter = true)\n      string = term.to_s\n      if uppercase_first_letter\n        string = string.sub(/^[a-z\\d]*/) { inflections.acronyms[$&] || $&.capitalize }\n      else\n        string = string.sub(/^(?:#{inflections.acronym_regex}(?=\\b|[A-Z_])|\\w)/) { $&.downcase }\n      end\n      string.gsub(/(?:_|(\\/))([a-z\\d]*)/i) { \"#{$1}#{inflections.acronyms[$2] || $2.capitalize}\" }.gsub('/', '::')\n    end\n\n    # Makes an underscored, lowercase form from the expression in the string.\n    #\n    # Changes '::' to '/' to convert namespaces to paths.\n    #\n    #   \"ActiveModel\".underscore         # => \"active_model\"\n    #   \"ActiveModel::Errors\".underscore # => \"active_model/errors\"\n    #\n    # As a rule of thumb you can think of +underscore+ as the inverse of +camelize+,\n    # though there are cases where that does not hold:\n    #\n    #   \"SSLError\".underscore.camelize # => \"SslError\"\n    def underscore(camel_cased_word)\n      word = camel_cased_word.to_s.dup\n      word.gsub!('::', '/')\n      word.gsub!(/(?:([A-Za-z\\d])|^)(#{inflections.acronym_regex})(?=\\b|[^a-z])/) { \"#{$1}#{$1 && '_'}#{$2.downcase}\" }\n      word.gsub!(/([A-Z\\d]+)([A-Z][a-z])/,'\\1_\\2')\n      word.gsub!(/([a-z\\d])([A-Z])/,'\\1_\\2')\n      word.tr!(\"-\", \"_\")\n      word.downcase!\n      word\n    end\n\n    # Capitalizes the first word and turns underscores into spaces and strips a\n    # trailing \"_id\", if any. Like +titleize+, this is meant for creating pretty output.\n    #\n    #   \"employee_salary\" # => \"Employee salary\"\n    #   \"author_id\"       # => \"Author\"\n    def humanize(lower_case_and_underscored_word)\n      result = lower_case_and_underscored_word.to_s.dup\n      inflections.humans.each { |(rule, replacement)| break if result.sub!(rule, replacement) }\n      result.gsub!(/_id$/, \"\")\n      result.tr!('_', ' ')\n      result.gsub(/([a-z\\d]*)/i) { |match|\n        \"#{inflections.acronyms[match] || match.downcase}\"\n      }.gsub(/^\\w/) { $&.upcase }\n    end\n\n    # Capitalizes all the words and replaces some characters in the string to create\n    # a nicer looking title. +titleize+ is meant for creating pretty output. It is not\n    # used in the Rails internals.\n    #\n    # +titleize+ is also aliased as +titlecase+.\n    #\n    #   \"man from the boondocks\".titleize   # => \"Man From The Boondocks\"\n    #   \"x-men: the last stand\".titleize    # => \"X Men: The Last Stand\"\n    #   \"TheManWithoutAPast\".titleize       # => \"The Man Without A Past\"\n    #   \"raiders_of_the_lost_ark\".titleize  # => \"Raiders Of The Lost Ark\"\n    def titleize(word)\n      humanize(underscore(word)).gsub(/\\b(?<!['’`])[a-z]/) { $&.capitalize }\n    end\n\n    # Create the name of a table like Rails does for models to table names. This method\n    # uses the +pluralize+ method on the last word in the string.\n    #\n    #   \"RawScaledScorer\".tableize # => \"raw_scaled_scorers\"\n    #   \"egg_and_ham\".tableize     # => \"egg_and_hams\"\n    #   \"fancyCategory\".tableize   # => \"fancy_categories\"\n    def tableize(class_name)\n      pluralize(underscore(class_name))\n    end\n\n    # Create a class name from a plural table name like Rails does for table names to models.\n    # Note that this returns a string and not a Class. (To convert to an actual class\n    # follow +classify+ with +constantize+.)\n    #\n    #   \"egg_and_hams\".classify # => \"EggAndHam\"\n    #   \"posts\".classify        # => \"Post\"\n    #\n    # Singular names are not handled correctly:\n    #   \"business\".classify     # => \"Busines\"\n    def classify(table_name)\n      # strip out any leading schema name\n      camelize(singularize(table_name.to_s.sub(/.*\\./, '')))\n    end\n\n    # Replaces underscores with dashes in the string.\n    #\n    #   \"puni_puni\".dasherize # => \"puni-puni\"\n    def dasherize(underscored_word)\n      underscored_word.tr('_', '-')\n    end\n\n    # Removes the module part from the expression in the string:\n    #\n    #   \"ActiveRecord::CoreExtensions::String::Inflections\".demodulize # => \"Inflections\"\n    #   \"Inflections\".demodulize                                       # => \"Inflections\"\n    #\n    # See also +deconstantize+.\n    def demodulize(path)\n      path = path.to_s\n      if i = path.rindex('::')\n        path[(i+2)..-1]\n      else\n        path\n      end\n    end\n\n    # Removes the rightmost segment from the constant expression in the string:\n    #\n    #   \"Net::HTTP\".deconstantize   # => \"Net\"\n    #   \"::Net::HTTP\".deconstantize # => \"::Net\"\n    #   \"String\".deconstantize      # => \"\"\n    #   \"::String\".deconstantize    # => \"\"\n    #   \"\".deconstantize            # => \"\"\n    #\n    # See also +demodulize+.\n    def deconstantize(path)\n      path.to_s[0...(path.rindex('::') || 0)] # implementation based on the one in facets' Module#spacename\n    end\n\n    # Creates a foreign key name from a class name.\n    # +separate_class_name_and_id_with_underscore+ sets whether\n    # the method should put '_' between the name and 'id'.\n    #\n    #   \"Message\".foreign_key        # => \"message_id\"\n    #   \"Message\".foreign_key(false) # => \"messageid\"\n    #   \"Admin::Post\".foreign_key    # => \"post_id\"\n    def foreign_key(class_name, separate_class_name_and_id_with_underscore = true)\n      underscore(demodulize(class_name)) + (separate_class_name_and_id_with_underscore ? \"_id\" : \"id\")\n    end\n\n    # Tries to find a constant with the name specified in the argument string:\n    #\n    #   \"Module\".constantize     # => Module\n    #   \"Test::Unit\".constantize # => Test::Unit\n    #\n    # The name is assumed to be the one of a top-level constant, no matter whether\n    # it starts with \"::\" or not. No lexical context is taken into account:\n    #\n    #   C = 'outside'\n    #   module M\n    #     C = 'inside'\n    #     C               # => 'inside'\n    #     \"C\".constantize # => 'outside', same as ::C\n    #   end\n    #\n    # NameError is raised when the name is not in CamelCase or the constant is\n    # unknown.\n    def constantize(camel_cased_word)\n      names = camel_cased_word.split('::')\n      names.shift if names.empty? || names.first.empty?\n\n      names.inject(Object) do |constant, name|\n        if constant == Object\n          constant.const_get(name)\n        else\n          candidate = constant.const_get(name)\n          next candidate if constant.const_defined?(name, false)\n          next candidate unless Object.const_defined?(name)\n\n          # Go down the ancestors to check it it's owned\n          # directly before we reach Object or the end of ancestors.\n          constant = constant.ancestors.inject do |const, ancestor|\n            break const    if ancestor == Object\n            break ancestor if ancestor.const_defined?(name, false)\n            const\n          end\n\n          # owner is in Object, so raise\n          constant.const_get(name, false)\n        end\n      end\n    end\n\n    # Tries to find a constant with the name specified in the argument string:\n    #\n    #   \"Module\".safe_constantize     # => Module\n    #   \"Test::Unit\".safe_constantize # => Test::Unit\n    #\n    # The name is assumed to be the one of a top-level constant, no matter whether\n    # it starts with \"::\" or not. No lexical context is taken into account:\n    #\n    #   C = 'outside'\n    #   module M\n    #     C = 'inside'\n    #     C                    # => 'inside'\n    #     \"C\".safe_constantize # => 'outside', same as ::C\n    #   end\n    #\n    # nil is returned when the name is not in CamelCase or the constant (or part of it) is\n    # unknown.\n    #\n    #   \"blargle\".safe_constantize  # => nil\n    #   \"UnknownModule\".safe_constantize  # => nil\n    #   \"UnknownModule::Foo::Bar\".safe_constantize  # => nil\n    #\n    def safe_constantize(camel_cased_word)\n      begin\n        constantize(camel_cased_word)\n      rescue NameError => e\n        raise unless e.message =~ /(uninitialized constant|wrong constant name) #{const_regexp(camel_cased_word)}$/ ||\n          e.name.to_s == camel_cased_word.to_s\n      rescue ArgumentError => e\n        raise unless e.message =~ /not missing constant #{const_regexp(camel_cased_word)}\\!$/\n      end\n    end\n\n    # Returns the suffix that should be added to a number to denote the position\n    # in an ordered sequence such as 1st, 2nd, 3rd, 4th.\n    #\n    #   ordinal(1)     # => \"st\"\n    #   ordinal(2)     # => \"nd\"\n    #   ordinal(1002)  # => \"nd\"\n    #   ordinal(1003)  # => \"rd\"\n    #   ordinal(-11)   # => \"th\"\n    #   ordinal(-1021) # => \"st\"\n    def ordinal(number)\n      if (11..13).include?(number.to_i.abs % 100)\n        \"th\"\n      else\n        case number.to_i.abs % 10\n          when 1; \"st\"\n          when 2; \"nd\"\n          when 3; \"rd\"\n          else    \"th\"\n        end\n      end\n    end\n\n    # Turns a number into an ordinal string used to denote the position in an\n    # ordered sequence such as 1st, 2nd, 3rd, 4th.\n    #\n    #   ordinalize(1)     # => \"1st\"\n    #   ordinalize(2)     # => \"2nd\"\n    #   ordinalize(1002)  # => \"1002nd\"\n    #   ordinalize(1003)  # => \"1003rd\"\n    #   ordinalize(-11)   # => \"-11th\"\n    #   ordinalize(-1021) # => \"-1021st\"\n    def ordinalize(number)\n      \"#{number}#{ordinal(number)}\"\n    end\n\n    private\n\n    # Mount a regular expression that will match part by part of the constant.\n    # For instance, Foo::Bar::Baz will generate Foo(::Bar(::Baz)?)?\n    def const_regexp(camel_cased_word) #:nodoc:\n      parts = camel_cased_word.split(\"::\")\n      last  = parts.pop\n\n      parts.reverse.inject(last) do |acc, part|\n        part.empty? ? acc : \"#{part}(::#{acc})?\"\n      end\n    end\n\n    # Applies inflection rules for +singularize+ and +pluralize+.\n    #\n    #  apply_inflections(\"post\", inflections.plurals) # => \"posts\"\n    #  apply_inflections(\"posts\", inflections.singulars) # => \"post\"\n    def apply_inflections(word, rules)\n      result = word.to_s.dup\n\n      if word.empty? || inflections.uncountables.include?(result.downcase[/\\b\\w+\\Z/])\n        result\n      else\n        rules.each { |(rule, replacement)| break if result.sub!(rule, replacement) }\n        result\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/jekyll.rb",
    "content": "$:.unshift File.dirname(__FILE__) # For use/testing when no gem is installed\n\n# Require all of the Ruby files in the given directory.\n#\n# path - The String relative path from here to the directory.\n#\n# Returns nothing.\ndef require_all(path)\n  glob = File.join(File.dirname(__FILE__), path, '*.rb')\n  Dir[glob].each do |f|\n    require f\n  end\nend\n\n# rubygems\nrequire 'rubygems'\n\n# stdlib\nrequire 'fileutils'\nrequire 'time'\nrequire 'yaml'\nrequire 'English'\n\n# 3rd party\nrequire 'liquid'\nrequire 'maruku'\nrequire 'albino'\n\n# internal requires\nrequire 'jekyll/core_ext'\nrequire 'jekyll/site'\nrequire 'jekyll/convertible'\nrequire 'jekyll/layout'\nrequire 'jekyll/page'\nrequire 'jekyll/post'\nrequire 'jekyll/filters'\nrequire 'jekyll/static_file'\nrequire 'jekyll/errors'\n\n# extensions\nrequire 'jekyll/plugin'\nrequire 'jekyll/converter'\nrequire 'jekyll/generator'\nrequire_all 'jekyll/converters'\nrequire_all 'jekyll/generators'\nrequire_all 'jekyll/tags'\n\nmodule Jekyll\n  VERSION = '0.11.2'\n\n  # Default options. Overriden by values in _config.yml or command-line opts.\n  # (Strings rather symbols used for compatability with YAML).\n  DEFAULTS = {\n    'safe'          => false,\n    'auto'          => false,\n    'server'        => false,\n    'server_port'   => 4000,\n\n    'source'       => Dir.pwd,\n    'destination'  => File.join(Dir.pwd, '_site'),\n    'plugins'      => File.join(Dir.pwd, '_plugins'),\n\n    'future'       => true,\n    'lsi'          => false,\n    'pygments'     => false,\n    'markdown'     => 'maruku',\n    'permalink'    => 'date',\n    'include'      => ['.htaccess'],\n    'paginate_path' => 'page:num',\n\n    'markdown_ext' => 'markdown,mkd,mkdn,md',\n    'textile_ext'  => 'textile',\n\n    'maruku'       => {\n      'use_tex'    => false,\n      'use_divs'   => false,\n      'png_engine' => 'blahtex',\n      'png_dir'    => 'images/latex',\n      'png_url'    => '/images/latex'\n    },\n    'rdiscount'    => {\n      'extensions' => []\n    },\n    'redcarpet'    => {\n      'extensions' => []\n    },\n    'kramdown'        => {\n      'auto_ids'      => true,\n      'footnote_nr'   => 1,\n      'entity_output' => 'as_char',\n      'toc_levels'    => '1..6',\n      'smart_quotes'  => 'lsquo,rsquo,ldquo,rdquo',\n      'use_coderay'   => false,\n\n      'coderay' => {\n        'coderay_wrap'              => 'div',\n        'coderay_line_numbers'      => 'inline',\n        'coderay_line_number_start' => 1,\n        'coderay_tab_width'         => 4,\n        'coderay_bold_every'        => 10,\n        'coderay_css'               => 'style'\n      }\n    },\n    'redcloth'        => {\n      'hard_breaks'   => true\n    }\n  }\n\n  # Public: Generate a Jekyll configuration Hash by merging the default\n  # options with anything in _config.yml, and adding the given options on top.\n  #\n  # override - A Hash of config directives that override any options in both\n  #            the defaults and the config file. See Jekyll::DEFAULTS for a\n  #            list of option names and their defaults.\n  #\n  # Returns the final configuration Hash.\n  def self.configuration(override)\n    # _config.yml may override default source location, but until\n    # then, we need to know where to look for _config.yml\n    source = override['source'] || Jekyll::DEFAULTS['source']\n\n    # Get configuration from <source>/_config.yml\n    config_file = File.join(source, '_config.yml')\n    begin\n      config = YAML.load_file(config_file)\n      raise \"Invalid configuration - #{config_file}\" if !config.is_a?(Hash)\n      $stdout.puts \"Configuration from #{config_file}\"\n    rescue => err\n      $stderr.puts \"WARNING: Could not read configuration. \" +\n                   \"Using defaults (and options).\"\n      $stderr.puts \"\\t\" + err.to_s\n      config = {}\n    end\n\n    # Merge DEFAULTS < _config.yml < override\n    Jekyll::DEFAULTS.deep_merge(config).deep_merge(override)\n  end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/jenkinsci.pluginspec",
    "content": "Jenkins::Plugin::Specification.new do |plugin|\n  plugin.name = \"foo\"\n  plugin.display_name = \"Foo Plugin\"\n  plugin.version = '0.0.1'\n  plugin.description = 'TODO: enter description here'\n\n  # You should create a wiki-page for your plugin when you publish it, see\n  # https://wiki.jenkins-ci.org/display/JENKINS/Hosting+Plugins#HostingPlugins-AddingaWikipage\n  # This line makes sure it's listed in your POM.\n  plugin.url = 'https://wiki.jenkins-ci.org/display/JENKINS/Foo+Plugin'\n\n  # The first argument is your user name for jenkins-ci.org.\n  plugin.developed_by \"david.calavera\", \"David Calavera <david.calavera@gmail.com>\"\n\n  # This specifies where your code is hosted.\n  # Alternatives include:\n  #  :github => 'myuser/foo-plugin' (without myuser it defaults to jenkinsci)\n  #  :git => 'git://repo.or.cz/foo-plugin.git'\n  #  :svn => 'https://svn.jenkins-ci.org/trunk/hudson/plugins/foo-plugin'\n  plugin.uses_repository :github => \"foo-plugin\"\n\n  # This is a required dependency for every ruby plugin.\n  plugin.depends_on 'ruby-runtime', '0.10'\n\n  # This is a sample dependency for a Jenkins plugin, 'git'.\n  #plugin.depends_on 'git', '1.1.11'\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/macruby",
    "content": "#!/usr/bin/env macruby\nputs \"MacRuby\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/mdata_server.fcgi",
    "content": "#!/usr/bin/env ruby\nrequire \"xmlrpc/server\"\n\n# NOTE: force the usage of the pure-ruby version of fcgi. \n# - this is required by the workaround to get fcgi+xmlrpc working together\nFCGI_PURE_RUBY=true\nrequire 'fcgi'\n\nrequire File.join(File.dirname(__FILE__), '../bt_cast/mdata_echo_server/bt_cast_mdata_server_t.rb')\n\n################################################################################\n################################################################################\n#\t\t\tCGI handling for xmlrpc\n################################################################################\n################################################################################\n# - for basic xmlrpc via CGI example\n#   - see http://www.ntecs.de/projects/xmlrpc4r/server.html#label-19\n\n# create the directory needed for Neoip::Cast_mdata_server_t\nNeoip::Cast_mdata_server_t.create_dir_ifneeded();\n\n# init the cgi_server\ncgi_server\t= XMLRPC::CGIServer.new     \n# register all the xmlrpc function\ncgi_server.add_handler(\"set_cast_mdata_pull\") do |web2srv_str, cast_name, cast_privtext, cast_id, \n\t\t\t\t\t\tport_lview, port_pview, uri_pathquery|\n\tNeoip::Cast_mdata_server_t.set_cast_mdata_pull(web2srv_str, cast_name, cast_privtext, cast_id,\n\t\t\t\t\t\tport_lview, port_pview, uri_pathquery, ENV['REMOTE_ADDR']);\nend \ncgi_server.add_handler(\"set_cast_mdata_push\") do |web2srv_str, cast_name, cast_privtext, cast_mdata|\n\tNeoip::Cast_mdata_server_t.set_cast_mdata_push(web2srv_str, cast_name, cast_privtext, cast_mdata);\nend \ncgi_server.add_handler(\"get_cast_mdata\") do |cast_name, cast_privhash|\n\tNeoip::Cast_mdata_server_t.get_cast_mdata(cast_name, cast_privhash);\nend \ncgi_server.add_handler(\"del_cast_mdata\") do |cast_name, cast_privtext|\n\tNeoip::Cast_mdata_server_t.del_cast_mdata(cast_name, cast_privtext);\nend\n\n# handle the unknown/bad formered calls\ncgi_server.set_default_handler do |name, *args|\n\traise XMLRPC::FaultException.new(-99, \"Method #{name} missing\" +\n                                   \" or wrong number of parameters!\")\nend\n\n# server the cgi_server\n#cgi_server.serve\n#exit\n  \n# experiment at using fast-cgi\nFCGI.each_request do |request|\n\t# XMLRPC::CGIServer expect some value in ENV[] but FCGI doesnt provides them\n\t# - so working around by copying them by hand... dirty \n\tENV['REMOTE_ADDR']\t= request.env['REMOTE_ADDR'];\n\tENV['REQUEST_METHOD']\t= request.env['REQUEST_METHOD'];\n\tENV['CONTENT_TYPE']\t= \"text/xml\";\n\tENV['CONTENT_LENGTH']\t= \"#{request.in.length}\";\n\n\t# copy the request in/out into the stdin/stdout to act as a CGI\n\t$stdin\t= request.in\n\t$stdout\t= request.out\n\n\t# process the cgi itself\n\tcgi_server.serve\n\n\t# mark the request as finished\n\trequest.finish\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/rabl.rabl",
    "content": "object @user => :person\n\nattributes :username, :email, :location\nattributes :created_at => :registered_at\n\nnode :role do |user|\n  user.is_admin ? 'admin' : 'normal'\nend\n\nchild :phone_numbers => :pnumbers do\n  extends \"users/phone_number\"\nend\n\nnode :node_numbers do |u|\n  partial(\"users/phone_number\", :object => u.phone_numbers)\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/racc.rb",
    "content": "#\n# DO NOT MODIFY!!!!\n# This file is automatically generated by Racc 1.4.7\n# from Racc grammer file \"\".\n#\n\nrequire 'racc/parser.rb'\nmodule RJSON\n  class Parser < Racc::Parser\n\n\n  require 'rjson/handler'\n\n  attr_reader :handler\n\n  def initialize tokenizer, handler = Handler.new\n    @tokenizer = tokenizer\n    @handler   = handler\n    super()\n  end\n\n  def next_token\n    @tokenizer.next_token\n  end\n\n  def parse\n    do_parse\n    handler\n  end\n##### State transition tables begin ###\n\nracc_action_table = [\n     9,    33,     9,    11,    13,    16,    19,    22,     9,     7,\n    23,     1,     9,    11,    13,    16,    19,    29,    30,     7,\n    21,     1,     9,    11,    13,    16,    19,    31,   nil,     7,\n    21,     1,    23,     7,   nil,     1 ]\n\nracc_action_check = [\n     6,    27,    33,    33,    33,    33,    33,     3,    31,    33,\n     6,    33,    29,    29,    29,    29,    29,    12,    22,    29,\n    12,    29,     2,     2,     2,     2,     2,    25,   nil,     2,\n     2,     2,    25,     0,   nil,     0 ]\n\nracc_action_pointer = [\n    24,   nil,    20,     7,   nil,   nil,    -2,   nil,   nil,   nil,\n   nil,   nil,    10,   nil,   nil,   nil,   nil,   nil,   nil,   nil,\n   nil,   nil,    18,   nil,   nil,    20,   nil,    -7,   nil,    10,\n   nil,     6,   nil,     0,   nil,   nil,   nil ]\n\nracc_action_default = [\n   -27,   -12,   -21,   -27,    -1,    -2,   -27,   -10,   -15,   -26,\n    -8,   -22,   -27,   -23,   -17,   -16,   -24,   -20,   -18,   -25,\n   -19,   -11,   -27,   -13,    -3,   -27,    -6,   -27,    -9,   -21,\n    37,   -27,    -4,   -21,   -14,    -5,    -7 ]\n\nracc_goto_table = [\n     8,    26,    24,    27,    10,     3,    25,     5,     4,    12,\n   nil,   nil,   nil,   nil,    28,   nil,   nil,   nil,   nil,   nil,\n   nil,    32,   nil,   nil,   nil,   nil,    35,    34,    27,   nil,\n   nil,    36 ]\n\nracc_goto_check = [\n     9,     7,     5,     8,    11,     1,     6,     3,     2,    12,\n   nil,   nil,   nil,   nil,    11,   nil,   nil,   nil,   nil,   nil,\n   nil,     5,   nil,   nil,   nil,   nil,     7,     9,     8,   nil,\n   nil,     9 ]\n\nracc_goto_pointer = [\n   nil,     5,     8,     7,   nil,    -4,     0,    -5,    -3,    -2,\n   nil,     2,     7,   nil,   nil ]\n\nracc_goto_default = [\n   nil,   nil,    14,    18,     6,   nil,   nil,   nil,    20,   nil,\n     2,   nil,   nil,    15,    17 ]\n\nracc_reduce_table = [\n  0, 0, :racc_error,\n  1, 14, :_reduce_none,\n  1, 14, :_reduce_none,\n  2, 15, :_reduce_none,\n  3, 15, :_reduce_none,\n  3, 19, :_reduce_none,\n  1, 19, :_reduce_none,\n  3, 20, :_reduce_none,\n  2, 16, :_reduce_none,\n  3, 16, :_reduce_none,\n  1, 23, :_reduce_10,\n  1, 24, :_reduce_11,\n  1, 17, :_reduce_12,\n  1, 18, :_reduce_13,\n  3, 25, :_reduce_none,\n  1, 25, :_reduce_none,\n  1, 22, :_reduce_none,\n  1, 22, :_reduce_none,\n  1, 22, :_reduce_none,\n  1, 26, :_reduce_none,\n  1, 26, :_reduce_20,\n  0, 27, :_reduce_none,\n  1, 27, :_reduce_22,\n  1, 27, :_reduce_23,\n  1, 27, :_reduce_24,\n  1, 27, :_reduce_25,\n  1, 21, :_reduce_26 ]\n\nracc_reduce_n = 27\n\nracc_shift_n = 37\n\nracc_token_table = {\n  false => 0,\n  :error => 1,\n  :STRING => 2,\n  :NUMBER => 3,\n  :TRUE => 4,\n  :FALSE => 5,\n  :NULL => 6,\n  \",\" => 7,\n  \":\" => 8,\n  \"[\" => 9,\n  \"]\" => 10,\n  \"{\" => 11,\n  \"}\" => 12 }\n\nracc_nt_base = 13\n\nracc_use_result_var = true\n\nRacc_arg = [\n  racc_action_table,\n  racc_action_check,\n  racc_action_default,\n  racc_action_pointer,\n  racc_goto_table,\n  racc_goto_check,\n  racc_goto_default,\n  racc_goto_pointer,\n  racc_nt_base,\n  racc_reduce_table,\n  racc_token_table,\n  racc_shift_n,\n  racc_reduce_n,\n  racc_use_result_var ]\n\nRacc_token_to_s_table = [\n  \"$end\",\n  \"error\",\n  \"STRING\",\n  \"NUMBER\",\n  \"TRUE\",\n  \"FALSE\",\n  \"NULL\",\n  \"\\\",\\\"\",\n  \"\\\":\\\"\",\n  \"\\\"[\\\"\",\n  \"\\\"]\\\"\",\n  \"\\\"{\\\"\",\n  \"\\\"}\\\"\",\n  \"$start\",\n  \"document\",\n  \"object\",\n  \"array\",\n  \"start_object\",\n  \"end_object\",\n  \"pairs\",\n  \"pair\",\n  \"string\",\n  \"value\",\n  \"start_array\",\n  \"end_array\",\n  \"values\",\n  \"scalar\",\n  \"literal\" ]\n\nRacc_debug_parser = false\n\n##### State transition tables end #####\n\n# reduce 0 omitted\n\n# reduce 1 omitted\n\n# reduce 2 omitted\n\n# reduce 3 omitted\n\n# reduce 4 omitted\n\n# reduce 5 omitted\n\n# reduce 6 omitted\n\n# reduce 7 omitted\n\n# reduce 8 omitted\n\n# reduce 9 omitted\n\ndef _reduce_10(val, _values, result)\n @handler.start_array  \n    result\nend\n\ndef _reduce_11(val, _values, result)\n @handler.end_array    \n    result\nend\n\ndef _reduce_12(val, _values, result)\n @handler.start_object \n    result\nend\n\ndef _reduce_13(val, _values, result)\n @handler.end_object   \n    result\nend\n\n# reduce 14 omitted\n\n# reduce 15 omitted\n\n# reduce 16 omitted\n\n# reduce 17 omitted\n\n# reduce 18 omitted\n\n# reduce 19 omitted\n\ndef _reduce_20(val, _values, result)\n @handler.scalar val[0] \n    result\nend\n\n# reduce 21 omitted\n\ndef _reduce_22(val, _values, result)\n n = val[0]; result = n.count('.') > 0 ? n.to_f : n.to_i \n    result\nend\n\ndef _reduce_23(val, _values, result)\n result = true \n    result\nend\n\ndef _reduce_24(val, _values, result)\n result = false \n    result\nend\n\ndef _reduce_25(val, _values, result)\n result = nil \n    result\nend\n\ndef _reduce_26(val, _values, result)\n @handler.scalar val[0].gsub(/^\"|\"$/, '') \n    result\nend\n\ndef _reduce_none(val, _values, result)\n  val[0]\nend\n\n  end   # class Parser\n  end   # module RJSON\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/resque.rb",
    "content": "require 'redis/namespace'\n\nrequire 'resque/version'\n\nrequire 'resque/errors'\n\nrequire 'resque/failure'\nrequire 'resque/failure/base'\n\nrequire 'resque/helpers'\nrequire 'resque/stat'\nrequire 'resque/job'\nrequire 'resque/worker'\nrequire 'resque/plugin'\nrequire 'resque/queue'\nrequire 'resque/multi_queue'\nrequire 'resque/coder'\nrequire 'resque/multi_json_coder'\n\nmodule Resque\n  include Helpers\n  extend self\n\n  # Accepts:\n  #   1. A 'hostname:port' String\n  #   2. A 'hostname:port:db' String (to select the Redis db)\n  #   3. A 'hostname:port/namespace' String (to set the Redis namespace)\n  #   4. A Redis URL String 'redis://host:port'\n  #   5. An instance of `Redis`, `Redis::Client`, `Redis::DistRedis`,\n  #      or `Redis::Namespace`.\n  def redis=(server)\n    case server\n    when String\n      if server =~ /redis\\:\\/\\//\n        redis = Redis.connect(:url => server, :thread_safe => true)\n      else\n        server, namespace = server.split('/', 2)\n        host, port, db = server.split(':')\n        redis = Redis.new(:host => host, :port => port,\n          :thread_safe => true, :db => db)\n      end\n      namespace ||= :resque\n\n      @redis = Redis::Namespace.new(namespace, :redis => redis)\n    when Redis::Namespace\n      @redis = server\n    else\n      @redis = Redis::Namespace.new(:resque, :redis => server)\n    end\n    @queues = Hash.new { |h,name|\n      h[name] = Resque::Queue.new(name, @redis, coder)\n    }\n  end\n\n  # Encapsulation of encode/decode. Overwrite this to use it across Resque.\n  # This defaults to MultiJson for backwards compatibilty.\n  def coder\n    @coder ||= MultiJsonCoder.new\n  end\n  attr_writer :coder\n\n  # Returns the current Redis connection. If none has been created, will\n  # create a new one.\n  def redis\n    return @redis if @redis\n    self.redis = Redis.respond_to?(:connect) ? Redis.connect : \"localhost:6379\"\n    self.redis\n  end\n\n  def redis_id\n    # support 1.x versions of redis-rb\n    if redis.respond_to?(:server)\n      redis.server\n    elsif redis.respond_to?(:nodes) # distributed\n      redis.nodes.map { |n| n.id }.join(', ')\n    else\n      redis.client.id\n    end\n  end\n\n  # The `before_first_fork` hook will be run in the **parent** process\n  # only once, before forking to run the first job. Be careful- any\n  # changes you make will be permanent for the lifespan of the\n  # worker.\n  #\n  # Call with a block to set the hook.\n  # Call with no arguments to return the hook.\n  def before_first_fork(&block)\n    block ? (@before_first_fork = block) : @before_first_fork\n  end\n\n  # Set a proc that will be called in the parent process before the\n  # worker forks for the first time.\n  attr_writer :before_first_fork\n\n  # The `before_fork` hook will be run in the **parent** process\n  # before every job, so be careful- any changes you make will be\n  # permanent for the lifespan of the worker.\n  #\n  # Call with a block to set the hook.\n  # Call with no arguments to return the hook.\n  def before_fork(&block)\n    block ? (@before_fork = block) : @before_fork\n  end\n\n  # Set the before_fork proc.\n  attr_writer :before_fork\n\n  # The `after_fork` hook will be run in the child process and is passed\n  # the current job. Any changes you make, therefore, will only live as\n  # long as the job currently being processed.\n  #\n  # Call with a block to set the hook.\n  # Call with no arguments to return the hook.\n  def after_fork(&block)\n    block ? (@after_fork = block) : @after_fork\n  end\n\n  # Set the after_fork proc.\n  attr_writer :after_fork\n\n  def to_s\n    \"Resque Client connected to #{redis_id}\"\n  end\n\n  attr_accessor :inline\n\n  # If 'inline' is true Resque will call #perform method inline\n  # without queuing it into Redis and without any Resque callbacks.\n  # The 'inline' is false Resque jobs will be put in queue regularly.\n  alias :inline? :inline\n\n  #\n  # queue manipulation\n  #\n\n  # Pushes a job onto a queue. Queue name should be a string and the\n  # item should be any JSON-able Ruby object.\n  #\n  # Resque works generally expect the `item` to be a hash with the following\n  # keys:\n  #\n  #   class - The String name of the job to run.\n  #    args - An Array of arguments to pass the job. Usually passed\n  #           via `class.to_class.perform(*args)`.\n  #\n  # Example\n  #\n  #   Resque.push('archive', :class => 'Archive', :args => [ 35, 'tar' ])\n  #\n  # Returns nothing\n  def push(queue, item)\n    queue(queue) << item\n  end\n\n  # Pops a job off a queue. Queue name should be a string.\n  #\n  # Returns a Ruby object.\n  def pop(queue)\n    begin\n      queue(queue).pop(true)\n    rescue ThreadError\n      nil\n    end\n  end\n\n  # Returns an integer representing the size of a queue.\n  # Queue name should be a string.\n  def size(queue)\n    queue(queue).size\n  end\n\n  # Returns an array of items currently queued. Queue name should be\n  # a string.\n  #\n  # start and count should be integer and can be used for pagination.\n  # start is the item to begin, count is how many items to return.\n  #\n  # To get the 3rd page of a 30 item, paginatied list one would use:\n  #   Resque.peek('my_list', 59, 30)\n  def peek(queue, start = 0, count = 1)\n    queue(queue).slice start, count\n  end\n\n  # Does the dirty work of fetching a range of items from a Redis list\n  # and converting them into Ruby objects.\n  def list_range(key, start = 0, count = 1)\n    if count == 1\n      decode redis.lindex(key, start)\n    else\n      Array(redis.lrange(key, start, start+count-1)).map do |item|\n        decode item\n      end\n    end\n  end\n\n  # Returns an array of all known Resque queues as strings.\n  def queues\n    Array(redis.smembers(:queues))\n  end\n\n  # Given a queue name, completely deletes the queue.\n  def remove_queue(queue)\n    queue(queue).destroy\n    @queues.delete(queue.to_s)\n  end\n\n  # Return the Resque::Queue object for a given name\n  def queue(name)\n    @queues[name.to_s]\n  end\n\n\n  #\n  # job shortcuts\n  #\n\n  # This method can be used to conveniently add a job to a queue.\n  # It assumes the class you're passing it is a real Ruby class (not\n  # a string or reference) which either:\n  #\n  #   a) has a @queue ivar set\n  #   b) responds to `queue`\n  #\n  # If either of those conditions are met, it will use the value obtained\n  # from performing one of the above operations to determine the queue.\n  #\n  # If no queue can be inferred this method will raise a `Resque::NoQueueError`\n  #\n  # Returns true if the job was queued, nil if the job was rejected by a\n  # before_enqueue hook.\n  #\n  # This method is considered part of the `stable` API.\n  def enqueue(klass, *args)\n    enqueue_to(queue_from_class(klass), klass, *args)\n  end\n\n  # Just like `enqueue` but allows you to specify the queue you want to\n  # use. Runs hooks.\n  #\n  # `queue` should be the String name of the queue you're targeting.\n  #\n  # Returns true if the job was queued, nil if the job was rejected by a\n  # before_enqueue hook.\n  #\n  # This method is considered part of the `stable` API.\n  def enqueue_to(queue, klass, *args)\n    # Perform before_enqueue hooks. Don't perform enqueue if any hook returns false\n    before_hooks = Plugin.before_enqueue_hooks(klass).collect do |hook|\n      klass.send(hook, *args)\n    end\n    return nil if before_hooks.any? { |result| result == false }\n\n    Job.create(queue, klass, *args)\n\n    Plugin.after_enqueue_hooks(klass).each do |hook|\n      klass.send(hook, *args)\n    end\n\n    return true\n  end\n\n  # This method can be used to conveniently remove a job from a queue.\n  # It assumes the class you're passing it is a real Ruby class (not\n  # a string or reference) which either:\n  #\n  #   a) has a @queue ivar set\n  #   b) responds to `queue`\n  #\n  # If either of those conditions are met, it will use the value obtained\n  # from performing one of the above operations to determine the queue.\n  #\n  # If no queue can be inferred this method will raise a `Resque::NoQueueError`\n  #\n  # If no args are given, this method will dequeue *all* jobs matching\n  # the provided class. See `Resque::Job.destroy` for more\n  # information.\n  #\n  # Returns the number of jobs destroyed.\n  #\n  # Example:\n  #\n  #   # Removes all jobs of class `UpdateNetworkGraph`\n  #   Resque.dequeue(GitHub::Jobs::UpdateNetworkGraph)\n  #\n  #   # Removes all jobs of class `UpdateNetworkGraph` with matching args.\n  #   Resque.dequeue(GitHub::Jobs::UpdateNetworkGraph, 'repo:135325')\n  #\n  # This method is considered part of the `stable` API.\n  def dequeue(klass, *args)\n    # Perform before_dequeue hooks. Don't perform dequeue if any hook returns false\n    before_hooks = Plugin.before_dequeue_hooks(klass).collect do |hook|\n      klass.send(hook, *args)\n    end\n    return if before_hooks.any? { |result| result == false }\n\n    Job.destroy(queue_from_class(klass), klass, *args)\n\n    Plugin.after_dequeue_hooks(klass).each do |hook|\n      klass.send(hook, *args)\n    end\n  end\n\n  # Given a class, try to extrapolate an appropriate queue based on a\n  # class instance variable or `queue` method.\n  def queue_from_class(klass)\n    klass.instance_variable_get(:@queue) ||\n      (klass.respond_to?(:queue) and klass.queue)\n  end\n\n  # This method will return a `Resque::Job` object or a non-true value\n  # depending on whether a job can be obtained. You should pass it the\n  # precise name of a queue: case matters.\n  #\n  # This method is considered part of the `stable` API.\n  def reserve(queue)\n    Job.reserve(queue)\n  end\n\n  # Validates if the given klass could be a valid Resque job\n  #\n  # If no queue can be inferred this method will raise a `Resque::NoQueueError`\n  #\n  # If given klass is nil this method will raise a `Resque::NoClassError`\n  def validate(klass, queue = nil)\n    queue ||= queue_from_class(klass)\n\n    if !queue\n      raise NoQueueError.new(\"Jobs must be placed onto a queue.\")\n    end\n\n    if klass.to_s.empty?\n      raise NoClassError.new(\"Jobs must be given a class.\")\n    end\n  end\n\n\n  #\n  # worker shortcuts\n  #\n\n  # A shortcut to Worker.all\n  def workers\n    Worker.all\n  end\n\n  # A shortcut to Worker.working\n  def working\n    Worker.working\n  end\n\n  # A shortcut to unregister_worker\n  # useful for command line tool\n  def remove_worker(worker_id)\n    worker = Resque::Worker.find(worker_id)\n    worker.unregister_worker\n  end\n\n  #\n  # stats\n  #\n\n  # Returns a hash, similar to redis-rb's #info, of interesting stats.\n  def info\n    return {\n      :pending   => queues.inject(0) { |m,k| m + size(k) },\n      :processed => Stat[:processed],\n      :queues    => queues.size,\n      :workers   => workers.size.to_i,\n      :working   => working.size,\n      :failed    => Stat[:failed],\n      :servers   => [redis_id],\n      :environment  => ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development'\n    }\n  end\n\n  # Returns an array of all known Resque keys in Redis. Redis' KEYS operation\n  # is O(N) for the keyspace, so be careful - this can be slow for big databases.\n  def keys\n    redis.keys(\"*\").map do |key|\n      key.sub(\"#{redis.namespace}:\", '')\n    end\n  end\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/rexpl",
    "content": "#!/usr/bin/env rbx\n$: << 'lib'\nrequire 'rexpl'\nRexpl::Environment.run\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/ruby",
    "content": "#!/usr/bin/env ruby\nputs \"Ruby\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/ruby2",
    "content": "#! /usr/bin/env ruby -w -Ilib:test\nputs \"Ruby\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/script.rake",
    "content": "#!/usr/bin/env rake\ntask :default do\n  puts \"Rake\"\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/shoes-swt",
    "content": "#!/usr/bin/env jruby\nlib_directory = File.expand_path('../../lib', __FILE__)\n$LOAD_PATH << lib_directory\n\nif File.exist?(\"Gemfile\")\n  require \"bundler/setup\"\n  Bundler.require\nend\n\nrequire 'shoes/ui/cli'\nShoes::CLI.new(\"swt\").run ARGV\n"
  },
  {
    "path": "src/test/resources/samples/langs/Ruby/sinatra.rb",
    "content": "# external dependencies\nrequire 'rack'\nrequire 'tilt'\nrequire \"rack/protection\"\n\n# stdlib dependencies\nrequire 'thread'\nrequire 'time'\nrequire 'uri'\n\n# other files we need\nrequire 'sinatra/showexceptions'\nrequire 'sinatra/version'\n\nmodule Sinatra\n  # The request object. See Rack::Request for more info:\n  # http://rack.rubyforge.org/doc/classes/Rack/Request.html\n  class Request < Rack::Request\n    # Returns an array of acceptable media types for the response\n    def accept\n      @env['sinatra.accept'] ||= begin\n        entries = @env['HTTP_ACCEPT'].to_s.split(',')\n        entries.map { |e| accept_entry(e) }.sort_by(&:last).map(&:first)\n      end\n    end\n\n    def preferred_type(*types)\n      return accept.first if types.empty?\n      types.flatten!\n      accept.detect do |pattern|\n        type = types.detect { |t| File.fnmatch(pattern, t) }\n        return type if type\n      end\n    end\n\n    alias accept? preferred_type\n    alias secure? ssl?\n\n    def forwarded?\n      @env.include? \"HTTP_X_FORWARDED_HOST\"\n    end\n\n    def safe?\n      get? or head? or options? or trace?\n    end\n\n    def idempotent?\n      safe? or put? or delete?\n    end\n\n    private\n\n    def accept_entry(entry)\n      type, *options = entry.delete(' ').split(';')\n      quality = 0 # we sort smallest first\n      options.delete_if { |e| quality = 1 - e[2..-1].to_f if e.start_with? 'q=' }\n      [type, [quality, type.count('*'), 1 - options.size]]\n    end\n  end\n\n  # The response object. See Rack::Response and Rack::ResponseHelpers for\n  # more info:\n  # http://rack.rubyforge.org/doc/classes/Rack/Response.html\n  # http://rack.rubyforge.org/doc/classes/Rack/Response/Helpers.html\n  class Response < Rack::Response\n    def body=(value)\n      value = value.body while Rack::Response === value\n      @body = String === value ? [value.to_str] : value\n    end\n\n    def each\n      block_given? ? super : enum_for(:each)\n    end\n\n    def finish\n      if status.to_i / 100 == 1\n        headers.delete \"Content-Length\"\n        headers.delete \"Content-Type\"\n      elsif Array === body and not [204, 304].include?(status.to_i)\n        # if some other code has already set Content-Length, don't muck with it\n        # currently, this would be the static file-handler\n        headers[\"Content-Length\"] ||= body.inject(0) { |l, p| l + Rack::Utils.bytesize(p) }.to_s\n      end\n\n      # Rack::Response#finish sometimes returns self as response body. We don't want that.\n      status, headers, result = super\n      result = body if result == self\n      [status, headers, result]\n    end\n  end\n\n  # Some Rack handlers (Thin, Rainbows!) implement an extended body object protocol, however,\n  # some middleware (namely Rack::Lint) will break it by not mirroring the methods in question.\n  # This middleware will detect an extended body object and will make sure it reaches the\n  # handler directly. We do this here, so our middleware and middleware set up by the app will\n  # still be able to run.\n  class ExtendedRack < Struct.new(:app)\n    def call(env)\n      result, callback = app.call(env), env['async.callback']\n      return result unless callback and async?(*result)\n      after_response { callback.call result }\n      setup_close(env, *result)\n      throw :async\n    end\n\n    private\n\n    def setup_close(env, status, header, body)\n      return unless body.respond_to? :close and env.include? 'async.close'\n      env['async.close'].callback { body.close }\n      env['async.close'].errback { body.close }\n    end\n\n    def after_response(&block)\n      raise NotImplementedError, \"only supports EventMachine at the moment\" unless defined? EventMachine\n      EventMachine.next_tick(&block)\n    end\n\n    def async?(status, headers, body)\n      return true if status == -1\n      body.respond_to? :callback and body.respond_to? :errback\n    end\n  end\n\n  # Behaves exactly like Rack::CommonLogger with the notable exception that it does nothing,\n  # if another CommonLogger is already in the middleware chane.\n  class CommonLogger < Rack::CommonLogger\n    def call(env)\n      env['sinatra.commonlogger'] ? @app.call(env) : super\n    end\n\n    superclass.class_eval do\n      alias call_without_check call unless method_defined? :call_without_check\n      def call(env)\n        env['sinatra.commonlogger'] = true\n        call_without_check(env)\n      end\n    end\n  end\n\n  class NotFound < NameError #:nodoc:\n    def http_status; 404 end\n  end\n\n  # Methods available to routes, before/after filters, and views.\n  module Helpers\n    # Set or retrieve the response status code.\n    def status(value=nil)\n      response.status = value if value\n      response.status\n    end\n\n    # Set or retrieve the response body. When a block is given,\n    # evaluation is deferred until the body is read with #each.\n    def body(value=nil, &block)\n      if block_given?\n        def block.each; yield(call) end\n        response.body = block\n      elsif value\n        response.body = value\n      else\n        response.body\n      end\n    end\n\n    # Halt processing and redirect to the URI provided.\n    def redirect(uri, *args)\n      if env['HTTP_VERSION'] == 'HTTP/1.1' and env[\"REQUEST_METHOD\"] != 'GET'\n        status 303\n      else\n        status 302\n      end\n\n      # According to RFC 2616 section 14.30, \"the field value consists of a\n      # single absolute URI\"\n      response['Location'] = uri(uri, settings.absolute_redirects?, settings.prefixed_redirects?)\n      halt(*args)\n    end\n\n    # Generates the absolute URI for a given path in the app.\n    # Takes Rack routers and reverse proxies into account.\n    def uri(addr = nil, absolute = true, add_script_name = true)\n      return addr if addr =~ /\\A[A-z][A-z0-9\\+\\.\\-]*:/\n      uri = [host = \"\"]\n      if absolute\n        host << \"http#{'s' if request.secure?}://\"\n        if request.forwarded? or request.port != (request.secure? ? 443 : 80)\n          host << request.host_with_port\n        else\n          host << request.host\n        end\n      end\n      uri << request.script_name.to_s if add_script_name\n      uri << (addr ? addr : request.path_info).to_s\n      File.join uri\n    end\n\n    alias url uri\n    alias to uri\n\n    # Halt processing and return the error status provided.\n    def error(code, body=nil)\n      code, body    = 500, code.to_str if code.respond_to? :to_str\n      response.body = body unless body.nil?\n      halt code\n    end\n\n    # Halt processing and return a 404 Not Found.\n    def not_found(body=nil)\n      error 404, body\n    end\n\n    # Set multiple response headers with Hash.\n    def headers(hash=nil)\n      response.headers.merge! hash if hash\n      response.headers\n    end\n\n    # Access the underlying Rack session.\n    def session\n      request.session\n    end\n\n    # Access shared logger object.\n    def logger\n      request.logger\n    end\n\n    # Look up a media type by file extension in Rack's mime registry.\n    def mime_type(type)\n      Base.mime_type(type)\n    end\n\n    # Set the Content-Type of the response body given a media type or file\n    # extension.\n    def content_type(type = nil, params={})\n      return response['Content-Type'] unless type\n      default = params.delete :default\n      mime_type = mime_type(type) || default\n      fail \"Unknown media type: %p\" % type if mime_type.nil?\n      mime_type = mime_type.dup\n      unless params.include? :charset or settings.add_charset.all? { |p| not p === mime_type }\n        params[:charset] = params.delete('charset') || settings.default_encoding\n      end\n      params.delete :charset if mime_type.include? 'charset'\n      unless params.empty?\n        mime_type << (mime_type.include?(';') ? ', ' : ';')\n        mime_type << params.map { |kv| kv.join('=') }.join(', ')\n      end\n      response['Content-Type'] = mime_type\n    end\n\n    # Set the Content-Disposition to \"attachment\" with the specified filename,\n    # instructing the user agents to prompt to save.\n    def attachment(filename=nil)\n      response['Content-Disposition'] = 'attachment'\n      if filename\n        params = '; filename=\"%s\"' % File.basename(filename)\n        response['Content-Disposition'] << params\n        ext = File.extname(filename)\n        content_type(ext) unless response['Content-Type'] or ext.empty?\n      end\n    end\n\n    # Use the contents of the file at +path+ as the response body.\n    def send_file(path, opts={})\n      if opts[:type] or not response['Content-Type']\n        content_type opts[:type] || File.extname(path), :default => 'application/octet-stream'\n      end\n\n      if opts[:disposition] == 'attachment' || opts[:filename]\n        attachment opts[:filename] || path\n      elsif opts[:disposition] == 'inline'\n        response['Content-Disposition'] = 'inline'\n      end\n\n      last_modified opts[:last_modified] if opts[:last_modified]\n\n      file      = Rack::File.new nil\n      file.path = path\n      result    = file.serving env\n      result[1].each { |k,v| headers[k] ||= v }\n      headers['Content-Length'] = result[1]['Content-Length']\n      halt opts[:status] || result[0], result[2]\n    rescue Errno::ENOENT\n      not_found\n    end\n\n    # Class of the response body in case you use #stream.\n    #\n    # Three things really matter: The front and back block (back being the\n    # blog generating content, front the one sending it to the client) and\n    # the scheduler, integrating with whatever concurrency feature the Rack\n    # handler is using.\n    #\n    # Scheduler has to respond to defer and schedule.\n    class Stream\n      def self.schedule(*) yield end\n      def self.defer(*)    yield end\n\n      def initialize(scheduler = self.class, keep_open = false, &back)\n        @back, @scheduler, @keep_open = back.to_proc, scheduler, keep_open\n        @callbacks, @closed = [], false\n      end\n\n      def close\n        return if @closed\n        @closed = true\n        @scheduler.schedule { @callbacks.each { |c| c.call }}\n      end\n\n      def each(&front)\n        @front = front\n        @scheduler.defer do\n          begin\n            @back.call(self)\n          rescue Exception => e\n            @scheduler.schedule { raise e }\n          end\n          close unless @keep_open\n        end\n      end\n\n      def <<(data)\n        @scheduler.schedule { @front.call(data.to_s) }\n        self\n      end\n\n      def callback(&block)\n        return yield if @closed\n        @callbacks << block\n      end\n\n      alias errback callback\n    end\n\n    # Allows to start sending data to the client even though later parts of\n    # the response body have not yet been generated.\n    #\n    # The close parameter specifies whether Stream#close should be called\n    # after the block has been executed. This is only relevant for evented\n    # servers like Thin or Rainbows.\n    def stream(keep_open = false)\n      scheduler = env['async.callback'] ? EventMachine : Stream\n      current   = @params.dup\n      body Stream.new(scheduler, keep_open) { |out| with_params(current) { yield(out) } }\n    end\n\n    # Specify response freshness policy for HTTP caches (Cache-Control header).\n    # Any number of non-value directives (:public, :private, :no_cache,\n    # :no_store, :must_revalidate, :proxy_revalidate) may be passed along with\n    # a Hash of value directives (:max_age, :min_stale, :s_max_age).\n    #\n    #   cache_control :public, :must_revalidate, :max_age => 60\n    #   => Cache-Control: public, must-revalidate, max-age=60\n    #\n    # See RFC 2616 / 14.9 for more on standard cache control directives:\n    # http://tools.ietf.org/html/rfc2616#section-14.9.1\n    def cache_control(*values)\n      if values.last.kind_of?(Hash)\n        hash = values.pop\n        hash.reject! { |k,v| v == false }\n        hash.reject! { |k,v| values << k if v == true }\n      else\n        hash = {}\n      end\n\n      values.map! { |value| value.to_s.tr('_','-') }\n      hash.each do |key, value|\n        key = key.to_s.tr('_', '-')\n        value = value.to_i if key == \"max-age\"\n        values << [key, value].join('=')\n      end\n\n      response['Cache-Control'] = values.join(', ') if values.any?\n    end\n\n    # Set the Expires header and Cache-Control/max-age directive. Amount\n    # can be an integer number of seconds in the future or a Time object\n    # indicating when the response should be considered \"stale\". The remaining\n    # \"values\" arguments are passed to the #cache_control helper:\n    #\n    #   expires 500, :public, :must_revalidate\n    #   => Cache-Control: public, must-revalidate, max-age=60\n    #   => Expires: Mon, 08 Jun 2009 08:50:17 GMT\n    #\n    def expires(amount, *values)\n      values << {} unless values.last.kind_of?(Hash)\n\n      if amount.is_a? Integer\n        time    = Time.now + amount.to_i\n        max_age = amount\n      else\n        time    = time_for amount\n        max_age = time - Time.now\n      end\n\n      values.last.merge!(:max_age => max_age)\n      cache_control(*values)\n\n      response['Expires'] = time.httpdate\n    end\n\n    # Set the last modified time of the resource (HTTP 'Last-Modified' header)\n    # and halt if conditional GET matches. The +time+ argument is a Time,\n    # DateTime, or other object that responds to +to_time+.\n    #\n    # When the current request includes an 'If-Modified-Since' header that is\n    # equal or later than the time specified, execution is immediately halted\n    # with a '304 Not Modified' response.\n    def last_modified(time)\n      return unless time\n      time = time_for time\n      response['Last-Modified'] = time.httpdate\n      return if env['HTTP_IF_NONE_MATCH']\n\n      if status == 200 and env['HTTP_IF_MODIFIED_SINCE']\n        # compare based on seconds since epoch\n        since = Time.httpdate(env['HTTP_IF_MODIFIED_SINCE']).to_i\n        halt 304 if since >= time.to_i\n      end\n\n      if (success? or status == 412) and env['HTTP_IF_UNMODIFIED_SINCE']\n        # compare based on seconds since epoch\n        since = Time.httpdate(env['HTTP_IF_UNMODIFIED_SINCE']).to_i\n        halt 412 if since < time.to_i\n      end\n    rescue ArgumentError\n    end\n\n    # Set the response entity tag (HTTP 'ETag' header) and halt if conditional\n    # GET matches. The +value+ argument is an identifier that uniquely\n    # identifies the current version of the resource. The +kind+ argument\n    # indicates whether the etag should be used as a :strong (default) or :weak\n    # cache validator.\n    #\n    # When the current request includes an 'If-None-Match' header with a\n    # matching etag, execution is immediately halted. If the request method is\n    # GET or HEAD, a '304 Not Modified' response is sent.\n    def etag(value, options = {})\n      # Before touching this code, please double check RFC 2616 14.24 and 14.26.\n      options      = {:kind => options} unless Hash === options\n      kind         = options[:kind] || :strong\n      new_resource = options.fetch(:new_resource) { request.post? }\n\n      unless [:strong, :weak].include?(kind)\n        raise ArgumentError, \":strong or :weak expected\"\n      end\n\n      value = '\"%s\"' % value\n      value = 'W/' + value if kind == :weak\n      response['ETag'] = value\n\n      if success? or status == 304\n        if etag_matches? env['HTTP_IF_NONE_MATCH'], new_resource\n          halt(request.safe? ? 304 : 412)\n        end\n\n        if env['HTTP_IF_MATCH']\n          halt 412 unless etag_matches? env['HTTP_IF_MATCH'], new_resource\n        end\n      end\n    end\n\n    # Sugar for redirect (example:  redirect back)\n    def back\n      request.referer\n    end\n\n    # whether or not the status is set to 1xx\n    def informational?\n      status.between? 100, 199\n    end\n\n    # whether or not the status is set to 2xx\n    def success?\n      status.between? 200, 299\n    end\n\n    # whether or not the status is set to 3xx\n    def redirect?\n      status.between? 300, 399\n    end\n\n    # whether or not the status is set to 4xx\n    def client_error?\n      status.between? 400, 499\n    end\n\n    # whether or not the status is set to 5xx\n    def server_error?\n      status.between? 500, 599\n    end\n\n    # whether or not the status is set to 404\n    def not_found?\n      status == 404\n    end\n\n    # Generates a Time object from the given value.\n    # Used by #expires and #last_modified.\n    def time_for(value)\n      if value.respond_to? :to_time\n        value.to_time\n      elsif value.is_a? Time\n        value\n      elsif value.respond_to? :new_offset\n        # DateTime#to_time does the same on 1.9\n        d = value.new_offset 0\n        t = Time.utc d.year, d.mon, d.mday, d.hour, d.min, d.sec + d.sec_fraction\n        t.getlocal\n      elsif value.respond_to? :mday\n        # Date#to_time does the same on 1.9\n        Time.local(value.year, value.mon, value.mday)\n      elsif value.is_a? Numeric\n        Time.at value\n      else\n        Time.parse value.to_s\n      end\n    rescue ArgumentError => boom\n      raise boom\n    rescue Exception\n      raise ArgumentError, \"unable to convert #{value.inspect} to a Time object\"\n    end\n\n    private\n\n    # Helper method checking if a ETag value list includes the current ETag.\n    def etag_matches?(list, new_resource = request.post?)\n      return !new_resource if list == '*'\n      list.to_s.split(/\\s*,\\s*/).include? response['ETag']\n    end\n\n    def with_params(temp_params)\n      original, @params = @params, temp_params\n      yield\n    ensure\n      @params = original if original\n    end\n  end\n\n  private\n\n  # Template rendering methods. Each method takes the name of a template\n  # to render as a Symbol and returns a String with the rendered output,\n  # as well as an optional hash with additional options.\n  #\n  # `template` is either the name or path of the template as symbol\n  # (Use `:'subdir/myview'` for views in subdirectories), or a string\n  # that will be rendered.\n  #\n  # Possible options are:\n  #   :content_type   The content type to use, same arguments as content_type.\n  #   :layout         If set to false, no layout is rendered, otherwise\n  #                   the specified layout is used (Ignored for `sass` and `less`)\n  #   :layout_engine  Engine to use for rendering the layout.\n  #   :locals         A hash with local variables that should be available\n  #                   in the template\n  #   :scope          If set, template is evaluate with the binding of the given\n  #                   object rather than the application instance.\n  #   :views          Views directory to use.\n  module Templates\n    module ContentTyped\n      attr_accessor :content_type\n    end\n\n    def initialize\n      super\n      @default_layout = :layout\n    end\n\n    def erb(template, options={}, locals={})\n      render :erb, template, options, locals\n    end\n\n    def erubis(template, options={}, locals={})\n      warn \"Sinatra::Templates#erubis is deprecated and will be removed, use #erb instead.\\n\" \\\n        \"If you have Erubis installed, it will be used automatically.\"\n      render :erubis, template, options, locals\n    end\n\n    def haml(template, options={}, locals={})\n      render :haml, template, options, locals\n    end\n\n    def sass(template, options={}, locals={})\n      options.merge! :layout => false, :default_content_type => :css\n      render :sass, template, options, locals\n    end\n\n    def scss(template, options={}, locals={})\n      options.merge! :layout => false, :default_content_type => :css\n      render :scss, template, options, locals\n    end\n\n    def less(template, options={}, locals={})\n      options.merge! :layout => false, :default_content_type => :css\n      render :less, template, options, locals\n    end\n\n    def builder(template=nil, options={}, locals={}, &block)\n      options[:default_content_type] = :xml\n      render_ruby(:builder, template, options, locals, &block)\n    end\n\n    def liquid(template, options={}, locals={})\n      render :liquid, template, options, locals\n    end\n\n    def markdown(template, options={}, locals={})\n      render :markdown, template, options, locals\n    end\n\n    def textile(template, options={}, locals={})\n      render :textile, template, options, locals\n    end\n\n    def rdoc(template, options={}, locals={})\n      render :rdoc, template, options, locals\n    end\n\n    def radius(template, options={}, locals={})\n      render :radius, template, options, locals\n    end\n\n    def markaby(template=nil, options={}, locals={}, &block)\n      render_ruby(:mab, template, options, locals, &block)\n    end\n\n    def coffee(template, options={}, locals={})\n      options.merge! :layout => false, :default_content_type => :js\n      render :coffee, template, options, locals\n    end\n\n    def nokogiri(template=nil, options={}, locals={}, &block)\n      options[:default_content_type] = :xml\n      render_ruby(:nokogiri, template, options, locals, &block)\n    end\n\n    def slim(template, options={}, locals={})\n      render :slim, template, options, locals\n    end\n\n    def creole(template, options={}, locals={})\n      render :creole, template, options, locals\n    end\n\n    def yajl(template, options={}, locals={})\n      options[:default_content_type] = :json\n      render :yajl, template, options, locals\n    end\n\n    # Calls the given block for every possible template file in views,\n    # named name.ext, where ext is registered on engine.\n    def find_template(views, name, engine)\n      yield ::File.join(views, \"#{name}.#{@preferred_extension}\")\n      Tilt.mappings.each do |ext, engines|\n        next unless ext != @preferred_extension and engines.include? engine\n        yield ::File.join(views, \"#{name}.#{ext}\")\n      end\n    end\n\n  private\n    # logic shared between builder and nokogiri\n    def render_ruby(engine, template, options={}, locals={}, &block)\n      options, template = template, nil if template.is_a?(Hash)\n      template = Proc.new { block } if template.nil?\n      render engine, template, options, locals\n    end\n\n    def render(engine, data, options={}, locals={}, &block)\n      # merge app-level options\n      options = settings.send(engine).merge(options) if settings.respond_to?(engine)\n      options[:outvar]           ||= '@_out_buf'\n      options[:default_encoding] ||= settings.default_encoding\n\n      # extract generic options\n      locals          = options.delete(:locals) || locals         || {}\n      views           = options.delete(:views)  || settings.views || \"./views\"\n      layout          = options.delete(:layout)\n      eat_errors      = layout.nil?\n      layout          = @default_layout if layout.nil? or layout == true\n      content_type    = options.delete(:content_type)  || options.delete(:default_content_type)\n      layout_engine   = options.delete(:layout_engine) || engine\n      scope           = options.delete(:scope)         || self\n\n      # compile and render template\n      begin\n        layout_was      = @default_layout\n        @default_layout = false\n        template        = compile_template(engine, data, options, views)\n        output          = template.render(scope, locals, &block)\n      ensure\n        @default_layout = layout_was\n      end\n\n      # render layout\n      if layout\n        options = options.merge(:views => views, :layout => false, :eat_errors => eat_errors, :scope => scope)\n        catch(:layout_missing) { return render(layout_engine, layout, options, locals) { output } }\n      end\n\n      output.extend(ContentTyped).content_type = content_type if content_type\n      output\n    end\n\n    def compile_template(engine, data, options, views)\n      eat_errors = options.delete :eat_errors\n      template_cache.fetch engine, data, options do\n        template = Tilt[engine]\n        raise \"Template engine not found: #{engine}\" if template.nil?\n\n        case data\n        when Symbol\n          body, path, line = settings.templates[data]\n          if body\n            body = body.call if body.respond_to?(:call)\n            template.new(path, line.to_i, options) { body }\n          else\n            found = false\n            @preferred_extension = engine.to_s\n            find_template(views, data, template) do |file|\n              path ||= file # keep the initial path rather than the last one\n              if found = File.exists?(file)\n                path = file\n                break\n              end\n            end\n            throw :layout_missing if eat_errors and not found\n            template.new(path, 1, options)\n          end\n        when Proc, String\n          body = data.is_a?(String) ? Proc.new { data } : data\n          path, line = settings.caller_locations.first\n          template.new(path, line.to_i, options, &body)\n        else\n          raise ArgumentError, \"Sorry, don't know how to render #{data.inspect}.\"\n        end\n      end\n    end\n  end\n\n  # Base class for all Sinatra applications and middleware.\n  class Base\n    include Rack::Utils\n    include Helpers\n    include Templates\n\n    attr_accessor :app\n    attr_reader   :template_cache\n\n    def initialize(app=nil)\n      super()\n      @app = app\n      @template_cache = Tilt::Cache.new\n      yield self if block_given?\n    end\n\n    # Rack call interface.\n    def call(env)\n      dup.call!(env)\n    end\n\n    attr_accessor :env, :request, :response, :params\n\n    def call!(env) # :nodoc:\n      @env      = env\n      @request  = Request.new(env)\n      @response = Response.new\n      @params   = indifferent_params(@request.params)\n      template_cache.clear if settings.reload_templates\n      force_encoding(@params)\n\n      @response['Content-Type'] = nil\n      invoke { dispatch! }\n      invoke { error_block!(response.status) }\n\n      unless @response['Content-Type']\n        if Array === body and body[0].respond_to? :content_type\n          content_type body[0].content_type\n        else\n          content_type :html\n        end\n      end\n\n      @response.finish\n    end\n\n    # Access settings defined with Base.set.\n    def self.settings\n      self\n    end\n\n    # Access settings defined with Base.set.\n    def settings\n      self.class.settings\n    end\n\n    def options\n      warn \"Sinatra::Base#options is deprecated and will be removed, \" \\\n        \"use #settings instead.\"\n      settings\n    end\n\n    # Exit the current block, halts any further processing\n    # of the request, and returns the specified response.\n    def halt(*response)\n      response = response.first if response.length == 1\n      throw :halt, response\n    end\n\n    # Pass control to the next matching route.\n    # If there are no more matching routes, Sinatra will\n    # return a 404 response.\n    def pass(&block)\n      throw :pass, block\n    end\n\n    # Forward the request to the downstream app -- middleware only.\n    def forward\n      fail \"downstream app not set\" unless @app.respond_to? :call\n      status, headers, body = @app.call env\n      @response.status = status\n      @response.body = body\n      @response.headers.merge! headers\n      nil\n    end\n\n  private\n    # Run filters defined on the class and all superclasses.\n    def filter!(type, base = settings)\n      filter! type, base.superclass if base.superclass.respond_to?(:filters)\n      base.filters[type].each { |args| process_route(*args) }\n    end\n\n    # Run routes defined on the class and all superclasses.\n    def route!(base = settings, pass_block=nil)\n      if routes = base.routes[@request.request_method]\n        routes.each do |pattern, keys, conditions, block|\n          pass_block = process_route(pattern, keys, conditions) do |*args|\n            route_eval { block[*args] }\n          end\n        end\n      end\n\n      # Run routes defined in superclass.\n      if base.superclass.respond_to?(:routes)\n        return route!(base.superclass, pass_block)\n      end\n\n      route_eval(&pass_block) if pass_block\n      route_missing\n    end\n\n    # Run a route block and throw :halt with the result.\n    def route_eval\n      throw :halt, yield\n    end\n\n    # If the current request matches pattern and conditions, fill params\n    # with keys and call the given block.\n    # Revert params afterwards.\n    #\n    # Returns pass block.\n    def process_route(pattern, keys, conditions, block = nil, values = [])\n      route = @request.path_info\n      route = '/' if route.empty? and not settings.empty_path_info?\n      return unless match = pattern.match(route)\n      values += match.captures.to_a.map { |v| force_encoding URI.decode_www_form_component(v) if v }\n\n      if values.any?\n        original, @params = params, params.merge('splat' => [], 'captures' => values)\n        keys.zip(values) { |k,v| Array === @params[k] ? @params[k] << v : @params[k] = v if v }\n      end\n\n      catch(:pass) do\n        conditions.each { |c| throw :pass if c.bind(self).call == false }\n        block ? block[self, values] : yield(self, values)\n      end\n    ensure\n      @params = original if original\n    end\n\n    # No matching route was found or all routes passed. The default\n    # implementation is to forward the request downstream when running\n    # as middleware (@app is non-nil); when no downstream app is set, raise\n    # a NotFound exception. Subclasses can override this method to perform\n    # custom route miss logic.\n    def route_missing\n      if @app\n        forward\n      else\n        raise NotFound\n      end\n    end\n\n    # Attempt to serve static files from public directory. Throws :halt when\n    # a matching file is found, returns nil otherwise.\n    def static!\n      return if (public_dir = settings.public_folder).nil?\n      public_dir = File.expand_path(public_dir)\n\n      path = File.expand_path(public_dir + unescape(request.path_info))\n      return unless path.start_with?(public_dir) and File.file?(path)\n\n      env['sinatra.static_file'] = path\n      cache_control(*settings.static_cache_control) if settings.static_cache_control?\n      send_file path, :disposition => nil\n    end\n\n    # Enable string or symbol key access to the nested params hash.\n    def indifferent_params(object)\n      case object\n      when Hash\n        new_hash = indifferent_hash\n        object.each { |key, value| new_hash[key] = indifferent_params(value) }\n        new_hash\n      when Array\n        object.map { |item| indifferent_params(item) }\n      else\n        object\n      end\n    end\n\n    # Creates a Hash with indifferent access.\n    def indifferent_hash\n      Hash.new {|hash,key| hash[key.to_s] if Symbol === key }\n    end\n\n    # Run the block with 'throw :halt' support and apply result to the response.\n    def invoke\n      res = catch(:halt) { yield }\n      res = [res] if Fixnum === res or String === res\n      if Array === res and Fixnum === res.first\n        status(res.shift)\n        body(res.pop)\n        headers(*res)\n      elsif res.respond_to? :each\n        body res\n      end\n      nil # avoid double setting the same response tuple twice\n    end\n\n    # Dispatch a request with error handling.\n    def dispatch!\n      invoke do\n        static! if settings.static? && (request.get? || request.head?)\n        filter! :before\n        route!\n      end\n    rescue ::Exception => boom\n      invoke { handle_exception!(boom) }\n    ensure\n      filter! :after unless env['sinatra.static_file']\n    end\n\n    # Error handling during requests.\n    def handle_exception!(boom)\n      @env['sinatra.error'] = boom\n\n      if boom.respond_to? :http_status\n        status(boom.http_status)\n      elsif settings.use_code? and boom.respond_to? :code and boom.code.between? 400, 599\n        status(boom.code)\n      else\n        status(500)\n      end\n\n      status(500) unless status.between? 400, 599\n\n      if server_error?\n        dump_errors! boom if settings.dump_errors?\n        raise boom if settings.show_exceptions? and settings.show_exceptions != :after_handler\n      end\n\n      if not_found?\n        headers['X-Cascade'] = 'pass'\n        body '<h1>Not Found</h1>'\n      end\n\n      res = error_block!(boom.class, boom) || error_block!(status, boom)\n      return res if res or not server_error?\n      raise boom if settings.raise_errors? or settings.show_exceptions?\n      error_block! Exception, boom\n    end\n\n    # Find an custom error block for the key(s) specified.\n    def error_block!(key, *block_params)\n      base = settings\n      while base.respond_to?(:errors)\n        next base = base.superclass unless args_array = base.errors[key]\n        args_array.reverse_each do |args|\n          first = args == args_array.first\n          args += [block_params]\n          resp = process_route(*args)\n          return resp unless resp.nil? && !first\n        end\n      end\n      return false unless key.respond_to? :superclass and key.superclass < Exception\n      error_block!(key.superclass, *block_params)\n    end\n\n    def dump_errors!(boom)\n      msg = [\"#{boom.class} - #{boom.message}:\", *boom.backtrace].join(\"\\n\\t\")\n      @env['rack.errors'].puts(msg)\n    end\n\n    class << self\n      attr_reader :routes, :filters, :templates, :errors\n\n      # Removes all routes, filters, middleware and extension hooks from the\n      # current class (not routes/filters/... defined by its superclass).\n      def reset!\n        @conditions     = []\n        @routes         = {}\n        @filters        = {:before => [], :after => []}\n        @errors         = {}\n        @middleware     = []\n        @prototype      = nil\n        @extensions     = []\n\n        if superclass.respond_to?(:templates)\n          @templates = Hash.new { |hash,key| superclass.templates[key] }\n        else\n          @templates = {}\n        end\n      end\n\n      # Extension modules registered on this class and all superclasses.\n      def extensions\n        if superclass.respond_to?(:extensions)\n          (@extensions + superclass.extensions).uniq\n        else\n          @extensions\n        end\n      end\n\n      # Middleware used in this class and all superclasses.\n      def middleware\n        if superclass.respond_to?(:middleware)\n          superclass.middleware + @middleware\n        else\n          @middleware\n        end\n      end\n\n      # Sets an option to the given value.  If the value is a proc,\n      # the proc will be called every time the option is accessed.\n      def set(option, value = (not_set = true), ignore_setter = false, &block)\n        raise ArgumentError if block and !not_set\n        value, not_set = block, false if block\n\n        if not_set\n          raise ArgumentError unless option.respond_to?(:each)\n          option.each { |k,v| set(k, v) }\n          return self\n        end\n\n        if respond_to?(\"#{option}=\") and not ignore_setter\n          return __send__(\"#{option}=\", value)\n        end\n\n        setter = proc { |val| set option, val, true }\n        getter = proc { value }\n\n        case value\n        when Proc\n          getter = value\n        when Symbol, Fixnum, FalseClass, TrueClass, NilClass\n          getter = value.inspect\n        when Hash\n          setter = proc do |val|\n            val = value.merge val if Hash === val\n            set option, val, true\n          end\n        end\n\n        define_singleton_method(\"#{option}=\", setter) if setter\n        define_singleton_method(option, getter) if getter\n        define_singleton_method(\"#{option}?\", \"!!#{option}\") unless method_defined? \"#{option}?\"\n        self\n      end\n\n      # Same as calling `set :option, true` for each of the given options.\n      def enable(*opts)\n        opts.each { |key| set(key, true) }\n      end\n\n      # Same as calling `set :option, false` for each of the given options.\n      def disable(*opts)\n        opts.each { |key| set(key, false) }\n      end\n\n      # Define a custom error handler. Optionally takes either an Exception\n      # class, or an HTTP status code to specify which errors should be\n      # handled.\n      def error(*codes, &block)\n        args  = compile! \"ERROR\", //, block\n        codes = codes.map { |c| Array(c) }.flatten\n        codes << Exception if codes.empty?\n        codes.each { |c| (@errors[c] ||= []) << args }\n      end\n\n      # Sugar for `error(404) { ... }`\n      def not_found(&block)\n        error 404, &block\n      end\n\n      # Define a named template. The block must return the template source.\n      def template(name, &block)\n        filename, line = caller_locations.first\n        templates[name] = [block, filename, line.to_i]\n      end\n\n      # Define the layout template. The block must return the template source.\n      def layout(name=:layout, &block)\n        template name, &block\n      end\n\n      # Load embeded templates from the file; uses the caller's __FILE__\n      # when no file is specified.\n      def inline_templates=(file=nil)\n        file = (file.nil? || file == true) ? (caller_files.first || File.expand_path($0)) : file\n\n        begin\n          io = ::IO.respond_to?(:binread) ? ::IO.binread(file) : ::IO.read(file)\n          app, data = io.gsub(\"\\r\\n\", \"\\n\").split(/^__END__$/, 2)\n        rescue Errno::ENOENT\n          app, data = nil\n        end\n\n        if data\n          if app and app =~ /([^\\n]*\\n)?#[^\\n]*coding: *(\\S+)/m\n            encoding = $2\n          else\n            encoding = settings.default_encoding\n          end\n          lines = app.count(\"\\n\") + 1\n          template = nil\n          force_encoding data, encoding\n          data.each_line do |line|\n            lines += 1\n            if line =~ /^@@\\s*(.*\\S)\\s*$/\n              template = force_encoding('', encoding)\n              templates[$1.to_sym] = [template, file, lines]\n            elsif template\n              template << line\n            end\n          end\n        end\n      end\n\n      # Lookup or register a mime type in Rack's mime registry.\n      def mime_type(type, value=nil)\n        return type if type.nil? || type.to_s.include?('/')\n        type = \".#{type}\" unless type.to_s[0] == ?.\n        return Rack::Mime.mime_type(type, nil) unless value\n        Rack::Mime::MIME_TYPES[type] = value\n      end\n\n      # provides all mime types matching type, including deprecated types:\n      #   mime_types :html # => ['text/html']\n      #   mime_types :js   # => ['application/javascript', 'text/javascript']\n      def mime_types(type)\n        type = mime_type type\n        type =~ /^application\\/(xml|javascript)$/ ? [type, \"text/#$1\"] : [type]\n      end\n\n      # Define a before filter; runs before all requests within the same\n      # context as route handlers and may access/modify the request and\n      # response.\n      def before(path = nil, options = {}, &block)\n        add_filter(:before, path, options, &block)\n      end\n\n      # Define an after filter; runs after all requests within the same\n      # context as route handlers and may access/modify the request and\n      # response.\n      def after(path = nil, options = {}, &block)\n        add_filter(:after, path, options, &block)\n      end\n\n      # add a filter\n      def add_filter(type, path = nil, options = {}, &block)\n        path, options = //, path if path.respond_to?(:each_pair)\n        filters[type] << compile!(type, path || //, block, options)\n      end\n\n      # Add a route condition. The route is considered non-matching when the\n      # block returns false.\n      def condition(name = \"#{caller.first[/`.*'/]} condition\", &block)\n        @conditions << generate_method(name, &block)\n      end\n\n      def public=(value)\n        warn \":public is no longer used to avoid overloading Module#public, use :public_dir instead\"\n        set(:public_folder, value)\n      end\n\n      def public_dir=(value)\n        self.public_folder = value\n      end\n\n      def public_dir\n        public_folder\n      end\n\n    private\n      # Dynamically defines a method on settings.\n      def define_singleton_method(name, content = Proc.new)\n        # replace with call to singleton_class once we're 1.9 only\n        (class << self; self; end).class_eval do\n          undef_method(name) if method_defined? name\n          String === content ? class_eval(\"def #{name}() #{content}; end\") : define_method(name, &content)\n        end\n      end\n\n      # Condition for matching host name. Parameter might be String or Regexp.\n      def host_name(pattern)\n        condition { pattern === request.host }\n      end\n\n      # Condition for matching user agent. Parameter should be Regexp.\n      # Will set params[:agent].\n      def user_agent(pattern)\n        condition do\n          if request.user_agent.to_s =~ pattern\n            @params[:agent] = $~[1..-1]\n            true\n          else\n            false\n          end\n        end\n      end\n      alias_method :agent, :user_agent\n\n      # Condition for matching mimetypes. Accepts file extensions.\n      def provides(*types)\n        types.map! { |t| mime_types(t) }\n        types.flatten!\n        condition do\n          if type = response['Content-Type']\n            types.include? type or types.include? type[/^[^;]+/]\n          elsif type = request.preferred_type(types)\n            content_type(type)\n            true\n          else\n            false\n          end\n        end\n      end\n\n    public\n      # Defining a `GET` handler also automatically defines\n      # a `HEAD` handler.\n      def get(path, opts={}, &block)\n        conditions = @conditions.dup\n        route('GET', path, opts, &block)\n\n        @conditions = conditions\n        route('HEAD', path, opts, &block)\n      end\n\n      def put(path, opts={}, &bk)     route 'PUT',     path, opts, &bk end\n      def post(path, opts={}, &bk)    route 'POST',    path, opts, &bk end\n      def delete(path, opts={}, &bk)  route 'DELETE',  path, opts, &bk end\n      def head(path, opts={}, &bk)    route 'HEAD',    path, opts, &bk end\n      def options(path, opts={}, &bk) route 'OPTIONS', path, opts, &bk end\n      def patch(path, opts={}, &bk)   route 'PATCH',   path, opts, &bk end\n\n    private\n      def route(verb, path, options={}, &block)\n        # Because of self.options.host\n        host_name(options.delete(:host)) if options.key?(:host)\n        enable :empty_path_info if path == \"\" and empty_path_info.nil?\n        signature = compile!(verb, path, block, options)\n        (@routes[verb] ||= []) << signature\n        invoke_hook(:route_added, verb, path, block)\n        signature\n      end\n\n      def invoke_hook(name, *args)\n        extensions.each { |e| e.send(name, *args) if e.respond_to?(name) }\n      end\n\n      def generate_method(method_name, &block)\n        define_method(method_name, &block)\n        method = instance_method method_name\n        remove_method method_name\n        method\n      end\n\n      def compile!(verb, path, block, options = {})\n        options.each_pair { |option, args| send(option, *args) }\n        method_name             = \"#{verb} #{path}\"\n        unbound_method          = generate_method(method_name, &block)\n        pattern, keys           = compile path\n        conditions, @conditions = @conditions, []\n\n        [ pattern, keys, conditions, block.arity != 0 ?\n            proc { |a,p| unbound_method.bind(a).call(*p) } :\n            proc { |a,p| unbound_method.bind(a).call } ]\n      end\n\n      def compile(path)\n        keys = []\n        if path.respond_to? :to_str\n          pattern = path.to_str.gsub(/[^\\?\\%\\\\\\/\\:\\*\\w]/) { |c| encoded(c) }\n          pattern.gsub!(/((:\\w+)|\\*)/) do |match|\n            if match == \"*\"\n              keys << 'splat'\n              \"(.*?)\"\n            else\n              keys << $2[1..-1]\n              \"([^/?#]+)\"\n            end\n          end\n          [/^#{pattern}$/, keys]\n        elsif path.respond_to?(:keys) && path.respond_to?(:match)\n          [path, path.keys]\n        elsif path.respond_to?(:names) && path.respond_to?(:match)\n          [path, path.names]\n        elsif path.respond_to? :match\n          [path, keys]\n        else\n          raise TypeError, path\n        end\n      end\n\n      URI = ::URI.const_defined?(:Parser) ? ::URI::Parser.new : ::URI\n\n      def encoded(char)\n        enc = URI.escape(char)\n        enc = \"(?:#{Regexp.escape enc}|#{URI.escape char, /./})\" if enc == char\n        enc = \"(?:#{enc}|#{encoded('+')})\" if char == \" \"\n        enc\n      end\n\n    public\n      # Makes the methods defined in the block and in the Modules given\n      # in `extensions` available to the handlers and templates\n      def helpers(*extensions, &block)\n        class_eval(&block)   if block_given?\n        include(*extensions) if extensions.any?\n      end\n\n      # Register an extension. Alternatively take a block from which an\n      # extension will be created and registered on the fly.\n      def register(*extensions, &block)\n        extensions << Module.new(&block) if block_given?\n        @extensions += extensions\n        extensions.each do |extension|\n          extend extension\n          extension.registered(self) if extension.respond_to?(:registered)\n        end\n      end\n\n      def development?; environment == :development end\n      def production?;  environment == :production  end\n      def test?;        environment == :test        end\n\n      # Set configuration options for Sinatra and/or the app.\n      # Allows scoping of settings for certain environments.\n      def configure(*envs, &block)\n        yield self if envs.empty? || envs.include?(environment.to_sym)\n      end\n\n      # Use the specified Rack middleware\n      def use(middleware, *args, &block)\n        @prototype = nil\n        @middleware << [middleware, args, block]\n      end\n\n      def quit!(server, handler_name)\n        # Use Thin's hard #stop! if available, otherwise just #stop.\n        server.respond_to?(:stop!) ? server.stop! : server.stop\n        $stderr.puts \"\\n== Sinatra has ended his set (crowd applauds)\" unless handler_name =~/cgi/i\n      end\n\n      # Run the Sinatra app as a self-hosted server using\n      # Thin, Puma, Mongrel, or WEBrick (in that order). If given a block, will call\n      # with the constructed handler once we have taken the stage.\n      def run!(options={})\n        set options\n        handler         = detect_rack_handler\n        handler_name    = handler.name.gsub(/.*::/, '')\n        server_settings = settings.respond_to?(:server_settings) ? settings.server_settings : {}\n        handler.run self, server_settings.merge(:Port => port, :Host => bind) do |server|\n          unless handler_name =~ /cgi/i\n            $stderr.puts \"== Sinatra/#{Sinatra::VERSION} has taken the stage \" +\n            \"on #{port} for #{environment} with backup from #{handler_name}\"\n          end\n          [:INT, :TERM].each { |sig| trap(sig) { quit!(server, handler_name) } }\n          server.threaded = settings.threaded if server.respond_to? :threaded=\n          set :running, true\n          yield server if block_given?\n        end\n      rescue Errno::EADDRINUSE\n        $stderr.puts \"== Someone is already performing on port #{port}!\"\n      end\n\n      # The prototype instance used to process requests.\n      def prototype\n        @prototype ||= new\n      end\n\n      # Create a new instance without middleware in front of it.\n      alias new! new unless method_defined? :new!\n\n      # Create a new instance of the class fronted by its middleware\n      # pipeline. The object is guaranteed to respond to #call but may not be\n      # an instance of the class new was called on.\n      def new(*args, &bk)\n        instance = new!(*args, &bk)\n        Wrapper.new(build(instance).to_app, instance)\n      end\n\n      # Creates a Rack::Builder instance with all the middleware set up and\n      # the given +app+ as end point.\n      def build(app)\n        builder = Rack::Builder.new\n        setup_default_middleware builder\n        setup_middleware builder\n        builder.run app\n        builder\n      end\n\n      def call(env)\n        synchronize { prototype.call(env) }\n      end\n\n    private\n      def setup_default_middleware(builder)\n        builder.use ExtendedRack\n        builder.use ShowExceptions       if show_exceptions?\n        builder.use Rack::MethodOverride if method_override?\n        builder.use Rack::Head\n        setup_logging    builder\n        setup_sessions   builder\n        setup_protection builder\n      end\n\n      def setup_middleware(builder)\n        middleware.each { |c,a,b| builder.use(c, *a, &b) }\n      end\n\n      def setup_logging(builder)\n        if logging?\n          setup_common_logger(builder)\n          setup_custom_logger(builder)\n        elsif logging == false\n          setup_null_logger(builder)\n        end\n      end\n\n      def setup_null_logger(builder)\n        builder.use Rack::NullLogger\n      end\n\n      def setup_common_logger(builder)\n        builder.use Sinatra::CommonLogger\n      end\n\n      def setup_custom_logger(builder)\n        if logging.respond_to? :to_int\n          builder.use Rack::Logger, logging\n        else\n          builder.use Rack::Logger\n        end\n      end\n\n      def setup_protection(builder)\n        return unless protection?\n        options = Hash === protection ? protection.dup : {}\n        options[:except] = Array options[:except]\n        options[:except] += [:session_hijacking, :remote_token] unless sessions?\n        options[:reaction] ||= :drop_session\n        builder.use Rack::Protection, options\n      end\n\n      def setup_sessions(builder)\n        return unless sessions?\n        options = {}\n        options[:secret] = session_secret if session_secret?\n        options.merge! sessions.to_hash if sessions.respond_to? :to_hash\n        builder.use Rack::Session::Cookie, options\n      end\n\n      def detect_rack_handler\n        servers = Array(server)\n        servers.each do |server_name|\n          begin\n            return Rack::Handler.get(server_name.to_s)\n          rescue LoadError, NameError\n          end\n        end\n        fail \"Server handler (#{servers.join(',')}) not found.\"\n      end\n\n      def inherited(subclass)\n        subclass.reset!\n        subclass.set :app_file, caller_files.first unless subclass.app_file?\n        super\n      end\n\n      @@mutex = Mutex.new\n      def synchronize(&block)\n        if lock?\n          @@mutex.synchronize(&block)\n        else\n          yield\n        end\n      end\n\n    public\n      CALLERS_TO_IGNORE = [ # :nodoc:\n        /\\/sinatra(\\/(base|main|showexceptions))?\\.rb$/, # all sinatra code\n        /lib\\/tilt.*\\.rb$/,                              # all tilt code\n        /^\\(.*\\)$/,                                      # generated code\n        /rubygems\\/custom_require\\.rb$/,                 # rubygems require hacks\n        /active_support/,                                # active_support require hacks\n        /bundler(\\/runtime)?\\.rb/,                       # bundler require hacks\n        /<internal:/,                                    # internal in ruby >= 1.9.2\n        /src\\/kernel\\/bootstrap\\/[A-Z]/                  # maglev kernel files\n      ]\n\n      # contrary to what the comment said previously, rubinius never supported this\n      if defined?(RUBY_IGNORE_CALLERS)\n        warn \"RUBY_IGNORE_CALLERS is deprecated and will no longer be supported by Sinatra 2.0\"\n        CALLERS_TO_IGNORE.concat(RUBY_IGNORE_CALLERS)\n      end\n\n      # Like Kernel#caller but excluding certain magic entries and without\n      # line / method information; the resulting array contains filenames only.\n      def caller_files\n        cleaned_caller(1).flatten\n      end\n\n      # Like caller_files, but containing Arrays rather than strings with the\n      # first element being the file, and the second being the line.\n      def caller_locations\n        cleaned_caller 2\n      end\n\n    private\n      # used for deprecation warnings\n      def warn(message)\n        super message + \"\\n\\tfrom #{cleaned_caller.first.join(':')}\"\n      end\n\n      # Like Kernel#caller but excluding certain magic entries\n      def cleaned_caller(keep = 3)\n        caller(1).\n          map    { |line| line.split(/:(?=\\d|in )/, 3)[0,keep] }.\n          reject { |file, *_| CALLERS_TO_IGNORE.any? { |pattern| file =~ pattern } }\n      end\n    end\n\n    # Fixes encoding issues by\n    # * defaulting to UTF-8\n    # * casting params to Encoding.default_external\n    #\n    # The latter might not be necessary if Rack handles it one day.\n    # Keep an eye on Rack's LH #100.\n    def force_encoding(*args) settings.force_encoding(*args) end\n    if defined? Encoding\n      def self.force_encoding(data, encoding = default_encoding)\n        return if data == settings || data.is_a?(Tempfile)\n        if data.respond_to? :force_encoding\n          data.force_encoding(encoding).encode!\n        elsif data.respond_to? :each_value\n          data.each_value { |v| force_encoding(v, encoding) }\n        elsif data.respond_to? :each\n          data.each { |v| force_encoding(v, encoding) }\n        end\n        data\n      end\n    else\n      def self.force_encoding(data, *) data end\n    end\n\n    reset!\n\n    set :environment, (ENV['RACK_ENV'] || :development).to_sym\n    set :raise_errors, Proc.new { test? }\n    set :dump_errors, Proc.new { !test? }\n    set :show_exceptions, Proc.new { development? }\n    set :sessions, false\n    set :logging, false\n    set :protection, true\n    set :method_override, false\n    set :use_code, false\n    set :default_encoding, \"utf-8\"\n    set :add_charset, %w[javascript xml xhtml+xml json].map { |t| \"application/#{t}\" }\n    settings.add_charset << /^text\\//\n\n    # explicitly generating a session secret eagerly to play nice with preforking\n    begin\n      require 'securerandom'\n      set :session_secret, SecureRandom.hex(64)\n    rescue LoadError, NotImplementedError\n      # SecureRandom raises a NotImplementedError if no random device is available\n      set :session_secret, \"%064x\" % Kernel.rand(2**256-1)\n    end\n\n    class << self\n      alias_method :methodoverride?, :method_override?\n      alias_method :methodoverride=, :method_override=\n    end\n\n    set :run, false                       # start server via at-exit hook?\n    set :running, false                   # is the built-in server running now?\n    set :server, %w[http webrick]\n    set :bind, '0.0.0.0'\n    set :port, 4567\n\n    ruby_engine = defined?(RUBY_ENGINE) && RUBY_ENGINE\n\n    if ruby_engine == 'macruby'\n      server.unshift 'controll_tower'\n    else\n      server.unshift 'mongrel'  if ruby_engine.nil?\n      server.unshift 'puma'     if ruby_engine != 'rbx'\n      server.unshift 'thin'     if ruby_engine != 'jruby'\n      server.unshift 'puma'     if ruby_engine == 'rbx'\n      server.unshift 'trinidad' if ruby_engine =='jruby'\n    end\n\n    set :absolute_redirects, true\n    set :prefixed_redirects, false\n    set :empty_path_info, nil\n\n    set :app_file, nil\n    set :root, Proc.new { app_file && File.expand_path(File.dirname(app_file)) }\n    set :views, Proc.new { root && File.join(root, 'views') }\n    set :reload_templates, Proc.new { development? }\n    set :lock, false\n    set :threaded, true\n\n    set :public_folder, Proc.new { root && File.join(root, 'public') }\n    set :static, Proc.new { public_folder && File.exist?(public_folder) }\n    set :static_cache_control, false\n\n    error ::Exception do\n      response.status = 500\n      content_type 'text/html'\n      '<h1>Internal Server Error</h1>'\n    end\n\n    configure :development do\n      get '/__sinatra__/:image.png' do\n        filename = File.dirname(__FILE__) + \"/images/#{params[:image]}.png\"\n        content_type :png\n        send_file filename\n      end\n\n      error NotFound do\n        content_type 'text/html'\n\n        (<<-HTML).gsub(/^ {8}/, '')\n        <!DOCTYPE html>\n        <html>\n        <head>\n          <style type=\"text/css\">\n          body { text-align:center;font-family:helvetica,arial;font-size:22px;\n            color:#888;margin:20px}\n          #c {margin:0 auto;width:500px;text-align:left}\n          </style>\n        </head>\n        <body>\n          <h2>Sinatra doesn&rsquo;t know this ditty.</h2>\n          <img src='#{uri \"/__sinatra__/404.png\"}'>\n          <div id=\"c\">\n            Try this:\n            <pre>#{request.request_method.downcase} '#{request.path_info}' do\\n  \"Hello World\"\\nend</pre>\n          </div>\n        </body>\n        </html>\n        HTML\n      end\n    end\n  end\n\n  # Execution context for classic style (top-level) applications. All\n  # DSL methods executed on main are delegated to this class.\n  #\n  # The Application class should not be subclassed, unless you want to\n  # inherit all settings, routes, handlers, and error pages from the\n  # top-level. Subclassing Sinatra::Base is highly recommended for\n  # modular applications.\n  class Application < Base\n    set :logging, Proc.new { ! test? }\n    set :method_override, true\n    set :run, Proc.new { ! test? }\n    set :session_secret, Proc.new { super() unless development? }\n    set :app_file, nil\n\n    def self.register(*extensions, &block) #:nodoc:\n      added_methods = extensions.map {|m| m.public_instance_methods }.flatten\n      Delegator.delegate(*added_methods)\n      super(*extensions, &block)\n    end\n  end\n\n  # Sinatra delegation mixin. Mixing this module into an object causes all\n  # methods to be delegated to the Sinatra::Application class. Used primarily\n  # at the top-level.\n  module Delegator #:nodoc:\n    def self.delegate(*methods)\n      methods.each do |method_name|\n        define_method(method_name) do |*args, &block|\n          return super(*args, &block) if respond_to? method_name\n          Delegator.target.send(method_name, *args, &block)\n        end\n        private method_name\n      end\n    end\n\n    delegate :get, :patch, :put, :post, :delete, :head, :options, :template, :layout,\n             :before, :after, :error, :not_found, :configure, :set, :mime_type,\n             :enable, :disable, :use, :development?, :test?, :production?,\n             :helpers, :settings\n\n    class << self\n      attr_accessor :target\n    end\n\n    self.target = Application\n  end\n\n  class Wrapper\n    def initialize(stack, instance)\n      @stack, @instance = stack, instance\n    end\n\n    def settings\n      @instance.settings\n    end\n\n    def helpers\n      @instance\n    end\n\n    def call(env)\n      @stack.call(env)\n    end\n\n    def inspect\n      \"#<#{@instance.class} app_file=#{settings.app_file.inspect}>\"\n    end\n  end\n\n  # Create a new Sinatra application. The block is evaluated in the new app's\n  # class scope.\n  def self.new(base=Base, options={}, &block)\n    base = Class.new(base)\n    base.class_eval(&block) if block_given?\n    base\n  end\n\n  # Extend the top-level DSL with the modules provided.\n  def self.register(*extensions, &block)\n    Delegator.target.register(*extensions, &block)\n  end\n\n  # Include the helper modules provided in Sinatra's request context.\n  def self.helpers(*extensions, &block)\n    Delegator.target.helpers(*extensions, &block)\n  end\n\n  # Use the middleware for classic applications.\n  def self.use(*args, &block)\n    Delegator.target.use(*args, &block)\n  end\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rust/hashmap.rs",
    "content": "// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT\n// file at the top-level directory of this distribution and at\n// http://rust-lang.org/COPYRIGHT.\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse self::Entry::*;\nuse self::SearchResult::*;\nuse self::VacantEntryState::*;\n\nuse borrow::Borrow;\nuse clone::Clone;\nuse cmp::{max, Eq, PartialEq};\nuse default::Default;\nuse fmt::{self, Debug};\nuse hash::{Hash, SipHasher};\nuse iter::{self, Iterator, ExactSizeIterator, IntoIterator, FromIterator, Extend, Map};\nuse marker::Sized;\nuse mem::{self, replace};\nuse ops::{Deref, FnMut, FnOnce, Index};\nuse option::Option::{self, Some, None};\nuse rand::{self, Rng};\nuse result::Result::{self, Ok, Err};\n\nuse super::table::{\n    self,\n    Bucket,\n    EmptyBucket,\n    FullBucket,\n    FullBucketImm,\n    FullBucketMut,\n    RawTable,\n    SafeHash\n};\nuse super::table::BucketState::{\n    Empty,\n    Full,\n};\nuse super::state::HashState;\n\nconst INITIAL_LOG2_CAP: usize = 5;\n#[unstable(feature = \"std_misc\")]\npub const INITIAL_CAPACITY: usize = 1 << INITIAL_LOG2_CAP; // 2^5\n\n/// The default behavior of HashMap implements a load factor of 90.9%.\n/// This behavior is characterized by the following condition:\n///\n/// - if size > 0.909 * capacity: grow the map\n#[derive(Clone)]\nstruct DefaultResizePolicy;\n\nimpl DefaultResizePolicy {\n    fn new() -> DefaultResizePolicy {\n        DefaultResizePolicy\n    }\n\n    #[inline]\n    fn min_capacity(&self, usable_size: usize) -> usize {\n        // Here, we are rephrasing the logic by specifying the lower limit\n        // on capacity:\n        //\n        // - if `cap < size * 1.1`: grow the map\n        usable_size * 11 / 10\n    }\n\n    /// An inverse of `min_capacity`, approximately.\n    #[inline]\n    fn usable_capacity(&self, cap: usize) -> usize {\n        // As the number of entries approaches usable capacity,\n        // min_capacity(size) must be smaller than the internal capacity,\n        // so that the map is not resized:\n        // `min_capacity(usable_capacity(x)) <= x`.\n        // The left-hand side can only be smaller due to flooring by integer\n        // division.\n        //\n        // This doesn't have to be checked for overflow since allocation size\n        // in bytes will overflow earlier than multiplication by 10.\n        cap * 10 / 11\n    }\n}\n\n#[test]\nfn test_resize_policy() {\n    let rp = DefaultResizePolicy;\n    for n in 0..1000 {\n        assert!(rp.min_capacity(rp.usable_capacity(n)) <= n);\n        assert!(rp.usable_capacity(rp.min_capacity(n)) <= n);\n    }\n}\n\n// The main performance trick in this hashmap is called Robin Hood Hashing.\n// It gains its excellent performance from one essential operation:\n//\n//    If an insertion collides with an existing element, and that element's\n//    \"probe distance\" (how far away the element is from its ideal location)\n//    is higher than how far we've already probed, swap the elements.\n//\n// This massively lowers variance in probe distance, and allows us to get very\n// high load factors with good performance. The 90% load factor I use is rather\n// conservative.\n//\n// > Why a load factor of approximately 90%?\n//\n// In general, all the distances to initial buckets will converge on the mean.\n// At a load factor of α, the odds of finding the target bucket after k\n// probes is approximately 1-α^k. If we set this equal to 50% (since we converge\n// on the mean) and set k=8 (64-byte cache line / 8-byte hash), α=0.92. I round\n// this down to make the math easier on the CPU and avoid its FPU.\n// Since on average we start the probing in the middle of a cache line, this\n// strategy pulls in two cache lines of hashes on every lookup. I think that's\n// pretty good, but if you want to trade off some space, it could go down to one\n// cache line on average with an α of 0.84.\n//\n// > Wait, what? Where did you get 1-α^k from?\n//\n// On the first probe, your odds of a collision with an existing element is α.\n// The odds of doing this twice in a row is approximately α^2. For three times,\n// α^3, etc. Therefore, the odds of colliding k times is α^k. The odds of NOT\n// colliding after k tries is 1-α^k.\n//\n// The paper from 1986 cited below mentions an implementation which keeps track\n// of the distance-to-initial-bucket histogram. This approach is not suitable\n// for modern architectures because it requires maintaining an internal data\n// structure. This allows very good first guesses, but we are most concerned\n// with guessing entire cache lines, not individual indexes. Furthermore, array\n// accesses are no longer linear and in one direction, as we have now. There\n// is also memory and cache pressure that this would entail that would be very\n// difficult to properly see in a microbenchmark.\n//\n// ## Future Improvements (FIXME!)\n//\n// Allow the load factor to be changed dynamically and/or at initialization.\n//\n// Also, would it be possible for us to reuse storage when growing the\n// underlying table? This is exactly the use case for 'realloc', and may\n// be worth exploring.\n//\n// ## Future Optimizations (FIXME!)\n//\n// Another possible design choice that I made without any real reason is\n// parameterizing the raw table over keys and values. Technically, all we need\n// is the size and alignment of keys and values, and the code should be just as\n// efficient (well, we might need one for power-of-two size and one for not...).\n// This has the potential to reduce code bloat in rust executables, without\n// really losing anything except 4 words (key size, key alignment, val size,\n// val alignment) which can be passed in to every call of a `RawTable` function.\n// This would definitely be an avenue worth exploring if people start complaining\n// about the size of rust executables.\n//\n// Annotate exceedingly likely branches in `table::make_hash`\n// and `search_hashed` to reduce instruction cache pressure\n// and mispredictions once it becomes possible (blocked on issue #11092).\n//\n// Shrinking the table could simply reallocate in place after moving buckets\n// to the first half.\n//\n// The growth algorithm (fragment of the Proof of Correctness)\n// --------------------\n//\n// The growth algorithm is basically a fast path of the naive reinsertion-\n// during-resize algorithm. Other paths should never be taken.\n//\n// Consider growing a robin hood hashtable of capacity n. Normally, we do this\n// by allocating a new table of capacity `2n`, and then individually reinsert\n// each element in the old table into the new one. This guarantees that the\n// new table is a valid robin hood hashtable with all the desired statistical\n// properties. Remark that the order we reinsert the elements in should not\n// matter. For simplicity and efficiency, we will consider only linear\n// reinsertions, which consist of reinserting all elements in the old table\n// into the new one by increasing order of index. However we will not be\n// starting our reinsertions from index 0 in general. If we start from index\n// i, for the purpose of reinsertion we will consider all elements with real\n// index j < i to have virtual index n + j.\n//\n// Our hash generation scheme consists of generating a 64-bit hash and\n// truncating the most significant bits. When moving to the new table, we\n// simply introduce a new bit to the front of the hash. Therefore, if an\n// elements has ideal index i in the old table, it can have one of two ideal\n// locations in the new table. If the new bit is 0, then the new ideal index\n// is i. If the new bit is 1, then the new ideal index is n + i. Intuitively,\n// we are producing two independent tables of size n, and for each element we\n// independently choose which table to insert it into with equal probability.\n// However the rather than wrapping around themselves on overflowing their\n// indexes, the first table overflows into the first, and the first into the\n// second. Visually, our new table will look something like:\n//\n// [yy_xxx_xxxx_xxx|xx_yyy_yyyy_yyy]\n//\n// Where x's are elements inserted into the first table, y's are elements\n// inserted into the second, and _'s are empty sections. We now define a few\n// key concepts that we will use later. Note that this is a very abstract\n// perspective of the table. A real resized table would be at least half\n// empty.\n//\n// Theorem: A linear robin hood reinsertion from the first ideal element\n// produces identical results to a linear naive reinsertion from the same\n// element.\n//\n// FIXME(Gankro, pczarn): review the proof and put it all in a separate README.md\n\n/// A hash map implementation which uses linear probing with Robin\n/// Hood bucket stealing.\n///\n/// The hashes are all keyed by the thread-local random number generator\n/// on creation by default. This means that the ordering of the keys is\n/// randomized, but makes the tables more resistant to\n/// denial-of-service attacks (Hash DoS). This behaviour can be\n/// overridden with one of the constructors.\n///\n/// It is required that the keys implement the `Eq` and `Hash` traits, although\n/// this can frequently be achieved by using `#[derive(PartialEq, Eq, Hash)]`.\n/// If you implement these yourself, it is important that the following\n/// property holds:\n///\n/// ```text\n/// k1 == k2 -> hash(k1) == hash(k2)\n/// ```\n///\n/// In other words, if two keys are equal, their hashes must be equal.\n///\n/// It is a logic error for a key to be modified in such a way that the key's\n/// hash, as determined by the `Hash` trait, or its equality, as determined by\n/// the `Eq` trait, changes while it is in the map. This is normally only\n/// possible through `Cell`, `RefCell`, global state, I/O, or unsafe code.\n///\n/// Relevant papers/articles:\n///\n/// 1. Pedro Celis. [\"Robin Hood Hashing\"](https://cs.uwaterloo.ca/research/tr/1986/CS-86-14.pdf)\n/// 2. Emmanuel Goossaert. [\"Robin Hood\n///    hashing\"](http://codecapsule.com/2013/11/11/robin-hood-hashing/)\n/// 3. Emmanuel Goossaert. [\"Robin Hood hashing: backward shift\n///    deletion\"](http://codecapsule.com/2013/11/17/robin-hood-hashing-backward-shift-deletion/)\n///\n/// # Examples\n///\n/// ```\n/// use std::collections::HashMap;\n///\n/// // type inference lets us omit an explicit type signature (which\n/// // would be `HashMap<&str, &str>` in this example).\n/// let mut book_reviews = HashMap::new();\n///\n/// // review some books.\n/// book_reviews.insert(\"Adventures of Huckleberry Finn\",    \"My favorite book.\");\n/// book_reviews.insert(\"Grimms' Fairy Tales\",               \"Masterpiece.\");\n/// book_reviews.insert(\"Pride and Prejudice\",               \"Very enjoyable.\");\n/// book_reviews.insert(\"The Adventures of Sherlock Holmes\", \"Eye lyked it alot.\");\n///\n/// // check for a specific one.\n/// if !book_reviews.contains_key(\"Les Misérables\") {\n///     println!(\"We've got {} reviews, but Les Misérables ain't one.\",\n///              book_reviews.len());\n/// }\n///\n/// // oops, this review has a lot of spelling mistakes, let's delete it.\n/// book_reviews.remove(\"The Adventures of Sherlock Holmes\");\n///\n/// // look up the values associated with some keys.\n/// let to_find = [\"Pride and Prejudice\", \"Alice's Adventure in Wonderland\"];\n/// for book in &to_find {\n///     match book_reviews.get(book) {\n///         Some(review) => println!(\"{}: {}\", book, review),\n///         None => println!(\"{} is unreviewed.\", book)\n///     }\n/// }\n///\n/// // iterate over everything.\n/// for (book, review) in &book_reviews {\n///     println!(\"{}: \\\"{}\\\"\", book, review);\n/// }\n/// ```\n///\n/// The easiest way to use `HashMap` with a custom type as key is to derive `Eq` and `Hash`.\n/// We must also derive `PartialEq`.\n///\n/// ```\n/// use std::collections::HashMap;\n///\n/// #[derive(Hash, Eq, PartialEq, Debug)]\n/// struct Viking {\n///     name: String,\n///     country: String,\n/// }\n///\n/// impl Viking {\n///     /// Create a new Viking.\n///     fn new(name: &str, country: &str) -> Viking {\n///         Viking { name: name.to_string(), country: country.to_string() }\n///     }\n/// }\n///\n/// // Use a HashMap to store the vikings' health points.\n/// let mut vikings = HashMap::new();\n///\n/// vikings.insert(Viking::new(\"Einar\", \"Norway\"), 25);\n/// vikings.insert(Viking::new(\"Olaf\", \"Denmark\"), 24);\n/// vikings.insert(Viking::new(\"Harald\", \"Iceland\"), 12);\n///\n/// // Use derived implementation to print the status of the vikings.\n/// for (viking, health) in &vikings {\n///     println!(\"{:?} has {} hp\", viking, health);\n/// }\n/// ```\n#[derive(Clone)]\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct HashMap<K, V, S = RandomState> {\n    // All hashes are keyed on these values, to prevent hash collision attacks.\n    hash_state: S,\n\n    table: RawTable<K, V>,\n\n    resize_policy: DefaultResizePolicy,\n}\n\n/// Search for a pre-hashed key.\nfn search_hashed<K, V, M, F>(table: M,\n                             hash: SafeHash,\n                             mut is_match: F)\n                             -> SearchResult<K, V, M> where\n    M: Deref<Target=RawTable<K, V>>,\n    F: FnMut(&K) -> bool,\n{\n    // This is the only function where capacity can be zero. To avoid\n    // undefined behaviour when Bucket::new gets the raw bucket in this\n    // case, immediately return the appropriate search result.\n    if table.capacity() == 0 {\n        return TableRef(table);\n    }\n\n    let size = table.size();\n    let mut probe = Bucket::new(table, hash);\n    let ib = probe.index();\n\n    while probe.index() != ib + size {\n        let full = match probe.peek() {\n            Empty(b) => return TableRef(b.into_table()), // hit an empty bucket\n            Full(b) => b\n        };\n\n        if full.distance() + ib < full.index() {\n            // We can finish the search early if we hit any bucket\n            // with a lower distance to initial bucket than we've probed.\n            return TableRef(full.into_table());\n        }\n\n        // If the hash doesn't match, it can't be this one..\n        if hash == full.hash() {\n            // If the key doesn't match, it can't be this one..\n            if is_match(full.read().0) {\n                return FoundExisting(full);\n            }\n        }\n\n        probe = full.next();\n    }\n\n    TableRef(probe.into_table())\n}\n\nfn pop_internal<K, V>(starting_bucket: FullBucketMut<K, V>) -> (K, V) {\n    let (empty, retkey, retval) = starting_bucket.take();\n    let mut gap = match empty.gap_peek() {\n        Some(b) => b,\n        None => return (retkey, retval)\n    };\n\n    while gap.full().distance() != 0 {\n        gap = match gap.shift() {\n            Some(b) => b,\n            None => break\n        };\n    }\n\n    // Now we've done all our shifting. Return the value we grabbed earlier.\n    (retkey, retval)\n}\n\n/// Perform robin hood bucket stealing at the given `bucket`. You must\n/// also pass the position of that bucket's initial bucket so we don't have\n/// to recalculate it.\n///\n/// `hash`, `k`, and `v` are the elements to \"robin hood\" into the hashtable.\nfn robin_hood<'a, K: 'a, V: 'a>(mut bucket: FullBucketMut<'a, K, V>,\n                        mut ib: usize,\n                        mut hash: SafeHash,\n                        mut k: K,\n                        mut v: V)\n                        -> &'a mut V {\n    let starting_index = bucket.index();\n    let size = {\n        let table = bucket.table(); // FIXME \"lifetime too short\".\n        table.size()\n    };\n    // There can be at most `size - dib` buckets to displace, because\n    // in the worst case, there are `size` elements and we already are\n    // `distance` buckets away from the initial one.\n    let idx_end = starting_index + size - bucket.distance();\n\n    loop {\n        let (old_hash, old_key, old_val) = bucket.replace(hash, k, v);\n        loop {\n            let probe = bucket.next();\n            assert!(probe.index() != idx_end);\n\n            let full_bucket = match probe.peek() {\n                Empty(bucket) => {\n                    // Found a hole!\n                    let b = bucket.put(old_hash, old_key, old_val);\n                    // Now that it's stolen, just read the value's pointer\n                    // right out of the table!\n                    return Bucket::at_index(b.into_table(), starting_index)\n                               .peek()\n                               .expect_full()\n                               .into_mut_refs()\n                               .1;\n                },\n                Full(bucket) => bucket\n            };\n\n            let probe_ib = full_bucket.index() - full_bucket.distance();\n\n            bucket = full_bucket;\n\n            // Robin hood! Steal the spot.\n            if ib < probe_ib {\n                ib = probe_ib;\n                hash = old_hash;\n                k = old_key;\n                v = old_val;\n                break;\n            }\n        }\n    }\n}\n\n/// A result that works like Option<FullBucket<..>> but preserves\n/// the reference that grants us access to the table in any case.\nenum SearchResult<K, V, M> {\n    // This is an entry that holds the given key:\n    FoundExisting(FullBucket<K, V, M>),\n\n    // There was no such entry. The reference is given back:\n    TableRef(M)\n}\n\nimpl<K, V, M> SearchResult<K, V, M> {\n    fn into_option(self) -> Option<FullBucket<K, V, M>> {\n        match self {\n            FoundExisting(bucket) => Some(bucket),\n            TableRef(_) => None\n        }\n    }\n}\n\nimpl<K, V, S> HashMap<K, V, S>\n    where K: Eq + Hash, S: HashState\n{\n    fn make_hash<X: ?Sized>(&self, x: &X) -> SafeHash where X: Hash {\n        table::make_hash(&self.hash_state, x)\n    }\n\n    /// Search for a key, yielding the index if it's found in the hashtable.\n    /// If you already have the hash for the key lying around, use\n    /// search_hashed.\n    fn search<'a, Q: ?Sized>(&'a self, q: &Q) -> Option<FullBucketImm<'a, K, V>>\n        where K: Borrow<Q>, Q: Eq + Hash\n    {\n        let hash = self.make_hash(q);\n        search_hashed(&self.table, hash, |k| q.eq(k.borrow()))\n            .into_option()\n    }\n\n    fn search_mut<'a, Q: ?Sized>(&'a mut self, q: &Q) -> Option<FullBucketMut<'a, K, V>>\n        where K: Borrow<Q>, Q: Eq + Hash\n    {\n        let hash = self.make_hash(q);\n        search_hashed(&mut self.table, hash, |k| q.eq(k.borrow()))\n            .into_option()\n    }\n\n    // The caller should ensure that invariants by Robin Hood Hashing hold.\n    fn insert_hashed_ordered(&mut self, hash: SafeHash, k: K, v: V) {\n        let cap = self.table.capacity();\n        let mut buckets = Bucket::new(&mut self.table, hash);\n        let ib = buckets.index();\n\n        while buckets.index() != ib + cap {\n            // We don't need to compare hashes for value swap.\n            // Not even DIBs for Robin Hood.\n            buckets = match buckets.peek() {\n                Empty(empty) => {\n                    empty.put(hash, k, v);\n                    return;\n                }\n                Full(b) => b.into_bucket()\n            };\n            buckets.next();\n        }\n        panic!(\"Internal HashMap error: Out of space.\");\n    }\n}\n\nimpl<K: Hash + Eq, V> HashMap<K, V, RandomState> {\n    /// Creates an empty HashMap.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    /// let mut map: HashMap<&str, isize> = HashMap::new();\n    /// ```\n    #[inline]\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn new() -> HashMap<K, V, RandomState> {\n        Default::default()\n    }\n\n    /// Creates an empty hash map with the given initial capacity.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    /// let mut map: HashMap<&str, isize> = HashMap::with_capacity(10);\n    /// ```\n    #[inline]\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn with_capacity(capacity: usize) -> HashMap<K, V, RandomState> {\n        HashMap::with_capacity_and_hash_state(capacity, Default::default())\n    }\n}\n\nimpl<K, V, S> HashMap<K, V, S>\n    where K: Eq + Hash, S: HashState\n{\n    /// Creates an empty hashmap which will use the given hasher to hash keys.\n    ///\n    /// The created map has the default initial capacity.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// # #![feature(std_misc)]\n    /// use std::collections::HashMap;\n    /// use std::collections::hash_map::RandomState;\n    ///\n    /// let s = RandomState::new();\n    /// let mut map = HashMap::with_hash_state(s);\n    /// map.insert(1, 2);\n    /// ```\n    #[inline]\n    #[unstable(feature = \"std_misc\", reason = \"hasher stuff is unclear\")]\n    pub fn with_hash_state(hash_state: S) -> HashMap<K, V, S> {\n        HashMap {\n            hash_state:    hash_state,\n            resize_policy: DefaultResizePolicy::new(),\n            table:         RawTable::new(0),\n        }\n    }\n\n    /// Creates an empty HashMap with space for at least `capacity`\n    /// elements, using `hasher` to hash the keys.\n    ///\n    /// Warning: `hasher` is normally randomly generated, and\n    /// is designed to allow HashMaps to be resistant to attacks that\n    /// cause many collisions and very poor performance. Setting it\n    /// manually using this function can expose a DoS attack vector.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// # #![feature(std_misc)]\n    /// use std::collections::HashMap;\n    /// use std::collections::hash_map::RandomState;\n    ///\n    /// let s = RandomState::new();\n    /// let mut map = HashMap::with_capacity_and_hash_state(10, s);\n    /// map.insert(1, 2);\n    /// ```\n    #[inline]\n    #[unstable(feature = \"std_misc\", reason = \"hasher stuff is unclear\")]\n    pub fn with_capacity_and_hash_state(capacity: usize, hash_state: S)\n                                        -> HashMap<K, V, S> {\n        let resize_policy = DefaultResizePolicy::new();\n        let min_cap = max(INITIAL_CAPACITY, resize_policy.min_capacity(capacity));\n        let internal_cap = min_cap.checked_next_power_of_two().expect(\"capacity overflow\");\n        assert!(internal_cap >= capacity, \"capacity overflow\");\n        HashMap {\n            hash_state:    hash_state,\n            resize_policy: resize_policy,\n            table:         RawTable::new(internal_cap),\n        }\n    }\n\n    /// Returns the number of elements the map can hold without reallocating.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    /// let map: HashMap<isize, isize> = HashMap::with_capacity(100);\n    /// assert!(map.capacity() >= 100);\n    /// ```\n    #[inline]\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn capacity(&self) -> usize {\n        self.resize_policy.usable_capacity(self.table.capacity())\n    }\n\n    /// Reserves capacity for at least `additional` more elements to be inserted\n    /// in the `HashMap`. The collection may reserve more space to avoid\n    /// frequent reallocations.\n    ///\n    /// # Panics\n    ///\n    /// Panics if the new allocation size overflows `usize`.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    /// let mut map: HashMap<&str, isize> = HashMap::new();\n    /// map.reserve(10);\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn reserve(&mut self, additional: usize) {\n        let new_size = self.len().checked_add(additional).expect(\"capacity overflow\");\n        let min_cap = self.resize_policy.min_capacity(new_size);\n\n        // An invalid value shouldn't make us run out of space. This includes\n        // an overflow check.\n        assert!(new_size <= min_cap);\n\n        if self.table.capacity() < min_cap {\n            let new_capacity = max(min_cap.next_power_of_two(), INITIAL_CAPACITY);\n            self.resize(new_capacity);\n        }\n    }\n\n    /// Resizes the internal vectors to a new capacity. It's your responsibility to:\n    ///   1) Make sure the new capacity is enough for all the elements, accounting\n    ///      for the load factor.\n    ///   2) Ensure new_capacity is a power of two or zero.\n    fn resize(&mut self, new_capacity: usize) {\n        assert!(self.table.size() <= new_capacity);\n        assert!(new_capacity.is_power_of_two() || new_capacity == 0);\n\n        let mut old_table = replace(&mut self.table, RawTable::new(new_capacity));\n        let old_size = old_table.size();\n\n        if old_table.capacity() == 0 || old_table.size() == 0 {\n            return;\n        }\n\n        // Grow the table.\n        // Specialization of the other branch.\n        let mut bucket = Bucket::first(&mut old_table);\n\n        // \"So a few of the first shall be last: for many be called,\n        // but few chosen.\"\n        //\n        // We'll most likely encounter a few buckets at the beginning that\n        // have their initial buckets near the end of the table. They were\n        // placed at the beginning as the probe wrapped around the table\n        // during insertion. We must skip forward to a bucket that won't\n        // get reinserted too early and won't unfairly steal others spot.\n        // This eliminates the need for robin hood.\n        loop {\n            bucket = match bucket.peek() {\n                Full(full) => {\n                    if full.distance() == 0 {\n                        // This bucket occupies its ideal spot.\n                        // It indicates the start of another \"cluster\".\n                        bucket = full.into_bucket();\n                        break;\n                    }\n                    // Leaving this bucket in the last cluster for later.\n                    full.into_bucket()\n                }\n                Empty(b) => {\n                    // Encountered a hole between clusters.\n                    b.into_bucket()\n                }\n            };\n            bucket.next();\n        }\n\n        // This is how the buckets might be laid out in memory:\n        // ($ marks an initialized bucket)\n        //  ________________\n        // |$$$_$$$$$$_$$$$$|\n        //\n        // But we've skipped the entire initial cluster of buckets\n        // and will continue iteration in this order:\n        //  ________________\n        //     |$$$$$$_$$$$$\n        //                  ^ wrap around once end is reached\n        //  ________________\n        //  $$$_____________|\n        //    ^ exit once table.size == 0\n        loop {\n            bucket = match bucket.peek() {\n                Full(bucket) => {\n                    let h = bucket.hash();\n                    let (b, k, v) = bucket.take();\n                    self.insert_hashed_ordered(h, k, v);\n                    {\n                        let t = b.table(); // FIXME \"lifetime too short\".\n                        if t.size() == 0 { break }\n                    };\n                    b.into_bucket()\n                }\n                Empty(b) => b.into_bucket()\n            };\n            bucket.next();\n        }\n\n        assert_eq!(self.table.size(), old_size);\n    }\n\n    /// Shrinks the capacity of the map as much as possible. It will drop\n    /// down as much as possible while maintaining the internal rules\n    /// and possibly leaving some space in accordance with the resize policy.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map: HashMap<isize, isize> = HashMap::with_capacity(100);\n    /// map.insert(1, 2);\n    /// map.insert(3, 4);\n    /// assert!(map.capacity() >= 100);\n    /// map.shrink_to_fit();\n    /// assert!(map.capacity() >= 2);\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn shrink_to_fit(&mut self) {\n        let min_capacity = self.resize_policy.min_capacity(self.len());\n        let min_capacity = max(min_capacity.next_power_of_two(), INITIAL_CAPACITY);\n\n        // An invalid value shouldn't make us run out of space.\n        debug_assert!(self.len() <= min_capacity);\n\n        if self.table.capacity() != min_capacity {\n            let old_table = replace(&mut self.table, RawTable::new(min_capacity));\n            let old_size = old_table.size();\n\n            // Shrink the table. Naive algorithm for resizing:\n            for (h, k, v) in old_table.into_iter() {\n                self.insert_hashed_nocheck(h, k, v);\n            }\n\n            debug_assert_eq!(self.table.size(), old_size);\n        }\n    }\n\n    /// Insert a pre-hashed key-value pair, without first checking\n    /// that there's enough room in the buckets. Returns a reference to the\n    /// newly insert value.\n    ///\n    /// If the key already exists, the hashtable will be returned untouched\n    /// and a reference to the existing element will be returned.\n    fn insert_hashed_nocheck(&mut self, hash: SafeHash, k: K, v: V) -> &mut V {\n        self.insert_or_replace_with(hash, k, v, |_, _, _| ())\n    }\n\n    fn insert_or_replace_with<'a, F>(&'a mut self,\n                                     hash: SafeHash,\n                                     k: K,\n                                     v: V,\n                                     mut found_existing: F)\n                                     -> &'a mut V where\n        F: FnMut(&mut K, &mut V, V),\n    {\n        // Worst case, we'll find one empty bucket among `size + 1` buckets.\n        let size = self.table.size();\n        let mut probe = Bucket::new(&mut self.table, hash);\n        let ib = probe.index();\n\n        loop {\n            let mut bucket = match probe.peek() {\n                Empty(bucket) => {\n                    // Found a hole!\n                    return bucket.put(hash, k, v).into_mut_refs().1;\n                }\n                Full(bucket) => bucket\n            };\n\n            // hash matches?\n            if bucket.hash() == hash {\n                // key matches?\n                if k == *bucket.read_mut().0 {\n                    let (bucket_k, bucket_v) = bucket.into_mut_refs();\n                    debug_assert!(k == *bucket_k);\n                    // Key already exists. Get its reference.\n                    found_existing(bucket_k, bucket_v, v);\n                    return bucket_v;\n                }\n            }\n\n            let robin_ib = bucket.index() as isize - bucket.distance() as isize;\n\n            if (ib as isize) < robin_ib {\n                // Found a luckier bucket than me. Better steal his spot.\n                return robin_hood(bucket, robin_ib as usize, hash, k, v);\n            }\n\n            probe = bucket.next();\n            assert!(probe.index() != ib + size + 1);\n        }\n    }\n\n    /// An iterator visiting all keys in arbitrary order.\n    /// Iterator element type is `&'a K`.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map = HashMap::new();\n    /// map.insert(\"a\", 1);\n    /// map.insert(\"b\", 2);\n    /// map.insert(\"c\", 3);\n    ///\n    /// for key in map.keys() {\n    ///     println!(\"{}\", key);\n    /// }\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn keys<'a>(&'a self) -> Keys<'a, K, V> {\n        fn first<A, B>((a, _): (A, B)) -> A { a }\n        let first: fn((&'a K,&'a V)) -> &'a K = first; // coerce to fn ptr\n\n        Keys { inner: self.iter().map(first) }\n    }\n\n    /// An iterator visiting all values in arbitrary order.\n    /// Iterator element type is `&'a V`.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map = HashMap::new();\n    /// map.insert(\"a\", 1);\n    /// map.insert(\"b\", 2);\n    /// map.insert(\"c\", 3);\n    ///\n    /// for val in map.values() {\n    ///     println!(\"{}\", val);\n    /// }\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn values<'a>(&'a self) -> Values<'a, K, V> {\n        fn second<A, B>((_, b): (A, B)) -> B { b }\n        let second: fn((&'a K,&'a V)) -> &'a V = second; // coerce to fn ptr\n\n        Values { inner: self.iter().map(second) }\n    }\n\n    /// An iterator visiting all key-value pairs in arbitrary order.\n    /// Iterator element type is `(&'a K, &'a V)`.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map = HashMap::new();\n    /// map.insert(\"a\", 1);\n    /// map.insert(\"b\", 2);\n    /// map.insert(\"c\", 3);\n    ///\n    /// for (key, val) in map.iter() {\n    ///     println!(\"key: {} val: {}\", key, val);\n    /// }\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn iter(&self) -> Iter<K, V> {\n        Iter { inner: self.table.iter() }\n    }\n\n    /// An iterator visiting all key-value pairs in arbitrary order,\n    /// with mutable references to the values.\n    /// Iterator element type is `(&'a K, &'a mut V)`.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map = HashMap::new();\n    /// map.insert(\"a\", 1);\n    /// map.insert(\"b\", 2);\n    /// map.insert(\"c\", 3);\n    ///\n    /// // Update all values\n    /// for (_, val) in map.iter_mut() {\n    ///     *val *= 2;\n    /// }\n    ///\n    /// for (key, val) in map.iter() {\n    ///     println!(\"key: {} val: {}\", key, val);\n    /// }\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn iter_mut(&mut self) -> IterMut<K, V> {\n        IterMut { inner: self.table.iter_mut() }\n    }\n\n    /// Gets the given key's corresponding entry in the map for in-place manipulation.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut letters = HashMap::new();\n    ///\n    /// for ch in \"a short treatise on fungi\".chars() {\n    ///     let counter = letters.entry(ch).or_insert(0);\n    ///     *counter += 1;\n    /// }\n    ///\n    /// assert_eq!(letters[&'s'], 2);\n    /// assert_eq!(letters[&'t'], 3);\n    /// assert_eq!(letters[&'u'], 1);\n    /// assert_eq!(letters.get(&'y'), None);\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn entry(&mut self, key: K) -> Entry<K, V> {\n        // Gotta resize now.\n        self.reserve(1);\n\n        let hash = self.make_hash(&key);\n        search_entry_hashed(&mut self.table, hash, key)\n    }\n\n    /// Returns the number of elements in the map.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut a = HashMap::new();\n    /// assert_eq!(a.len(), 0);\n    /// a.insert(1, \"a\");\n    /// assert_eq!(a.len(), 1);\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn len(&self) -> usize { self.table.size() }\n\n    /// Returns true if the map contains no elements.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut a = HashMap::new();\n    /// assert!(a.is_empty());\n    /// a.insert(1, \"a\");\n    /// assert!(!a.is_empty());\n    /// ```\n    #[inline]\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn is_empty(&self) -> bool { self.len() == 0 }\n\n    /// Clears the map, returning all key-value pairs as an iterator. Keeps the\n    /// allocated memory for reuse.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// # #![feature(std_misc)]\n    /// use std::collections::HashMap;\n    ///\n    /// let mut a = HashMap::new();\n    /// a.insert(1, \"a\");\n    /// a.insert(2, \"b\");\n    ///\n    /// for (k, v) in a.drain().take(1) {\n    ///     assert!(k == 1 || k == 2);\n    ///     assert!(v == \"a\" || v == \"b\");\n    /// }\n    ///\n    /// assert!(a.is_empty());\n    /// ```\n    #[inline]\n    #[unstable(feature = \"std_misc\",\n               reason = \"matches collection reform specification, waiting for dust to settle\")]\n    pub fn drain(&mut self) -> Drain<K, V> {\n        fn last_two<A, B, C>((_, b, c): (A, B, C)) -> (B, C) { (b, c) }\n        let last_two: fn((SafeHash, K, V)) -> (K, V) = last_two; // coerce to fn pointer\n\n        Drain {\n            inner: self.table.drain().map(last_two),\n        }\n    }\n\n    /// Clears the map, removing all key-value pairs. Keeps the allocated memory\n    /// for reuse.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut a = HashMap::new();\n    /// a.insert(1, \"a\");\n    /// a.clear();\n    /// assert!(a.is_empty());\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    #[inline]\n    pub fn clear(&mut self) {\n        self.drain();\n    }\n\n    /// Returns a reference to the value corresponding to the key.\n    ///\n    /// The key may be any borrowed form of the map's key type, but\n    /// `Hash` and `Eq` on the borrowed form *must* match those for\n    /// the key type.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map = HashMap::new();\n    /// map.insert(1, \"a\");\n    /// assert_eq!(map.get(&1), Some(&\"a\"));\n    /// assert_eq!(map.get(&2), None);\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>\n        where K: Borrow<Q>, Q: Hash + Eq\n    {\n        self.search(k).map(|bucket| bucket.into_refs().1)\n    }\n\n    /// Returns true if the map contains a value for the specified key.\n    ///\n    /// The key may be any borrowed form of the map's key type, but\n    /// `Hash` and `Eq` on the borrowed form *must* match those for\n    /// the key type.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map = HashMap::new();\n    /// map.insert(1, \"a\");\n    /// assert_eq!(map.contains_key(&1), true);\n    /// assert_eq!(map.contains_key(&2), false);\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool\n        where K: Borrow<Q>, Q: Hash + Eq\n    {\n        self.search(k).is_some()\n    }\n\n    /// Returns a mutable reference to the value corresponding to the key.\n    ///\n    /// The key may be any borrowed form of the map's key type, but\n    /// `Hash` and `Eq` on the borrowed form *must* match those for\n    /// the key type.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map = HashMap::new();\n    /// map.insert(1, \"a\");\n    /// if let Some(x) = map.get_mut(&1) {\n    ///     *x = \"b\";\n    /// }\n    /// assert_eq!(map[&1], \"b\");\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V>\n        where K: Borrow<Q>, Q: Hash + Eq\n    {\n        self.search_mut(k).map(|bucket| bucket.into_mut_refs().1)\n    }\n\n    /// Inserts a key-value pair into the map. If the key already had a value\n    /// present in the map, that value is returned. Otherwise, `None` is returned.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map = HashMap::new();\n    /// assert_eq!(map.insert(37, \"a\"), None);\n    /// assert_eq!(map.is_empty(), false);\n    ///\n    /// map.insert(37, \"b\");\n    /// assert_eq!(map.insert(37, \"c\"), Some(\"b\"));\n    /// assert_eq!(map[&37], \"c\");\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn insert(&mut self, k: K, v: V) -> Option<V> {\n        let hash = self.make_hash(&k);\n        self.reserve(1);\n\n        let mut retval = None;\n        self.insert_or_replace_with(hash, k, v, |_, val_ref, val| {\n            retval = Some(replace(val_ref, val));\n        });\n        retval\n    }\n\n    /// Removes a key from the map, returning the value at the key if the key\n    /// was previously in the map.\n    ///\n    /// The key may be any borrowed form of the map's key type, but\n    /// `Hash` and `Eq` on the borrowed form *must* match those for\n    /// the key type.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map = HashMap::new();\n    /// map.insert(1, \"a\");\n    /// assert_eq!(map.remove(&1), Some(\"a\"));\n    /// assert_eq!(map.remove(&1), None);\n    /// ```\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn remove<Q: ?Sized>(&mut self, k: &Q) -> Option<V>\n        where K: Borrow<Q>, Q: Hash + Eq\n    {\n        if self.table.size() == 0 {\n            return None\n        }\n\n        self.search_mut(k).map(|bucket| pop_internal(bucket).1)\n    }\n}\n\nfn search_entry_hashed<'a, K: Eq, V>(table: &'a mut RawTable<K,V>, hash: SafeHash, k: K)\n        -> Entry<'a, K, V>\n{\n    // Worst case, we'll find one empty bucket among `size + 1` buckets.\n    let size = table.size();\n    let mut probe = Bucket::new(table, hash);\n    let ib = probe.index();\n\n    loop {\n        let bucket = match probe.peek() {\n            Empty(bucket) => {\n                // Found a hole!\n                return Vacant(VacantEntry {\n                    hash: hash,\n                    key: k,\n                    elem: NoElem(bucket),\n                });\n            },\n            Full(bucket) => bucket\n        };\n\n        // hash matches?\n        if bucket.hash() == hash {\n            // key matches?\n            if k == *bucket.read().0 {\n                return Occupied(OccupiedEntry{\n                    elem: bucket,\n                });\n            }\n        }\n\n        let robin_ib = bucket.index() as isize - bucket.distance() as isize;\n\n        if (ib as isize) < robin_ib {\n            // Found a luckier bucket than me. Better steal his spot.\n            return Vacant(VacantEntry {\n                hash: hash,\n                key: k,\n                elem: NeqElem(bucket, robin_ib as usize),\n            });\n        }\n\n        probe = bucket.next();\n        assert!(probe.index() != ib + size + 1);\n    }\n}\n\nimpl<K, V, S> PartialEq for HashMap<K, V, S>\n    where K: Eq + Hash, V: PartialEq, S: HashState\n{\n    fn eq(&self, other: &HashMap<K, V, S>) -> bool {\n        if self.len() != other.len() { return false; }\n\n        self.iter().all(|(key, value)|\n            other.get(key).map_or(false, |v| *value == *v)\n        )\n    }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<K, V, S> Eq for HashMap<K, V, S>\n    where K: Eq + Hash, V: Eq, S: HashState\n{}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<K, V, S> Debug for HashMap<K, V, S>\n    where K: Eq + Hash + Debug, V: Debug, S: HashState\n{\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        f.debug_map().entries(self.iter()).finish()\n    }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<K, V, S> Default for HashMap<K, V, S>\n    where K: Eq + Hash,\n          S: HashState + Default,\n{\n    fn default() -> HashMap<K, V, S> {\n        HashMap::with_hash_state(Default::default())\n    }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, Q: ?Sized, V, S> Index<&'a Q> for HashMap<K, V, S>\n    where K: Eq + Hash + Borrow<Q>,\n          Q: Eq + Hash,\n          S: HashState,\n{\n    type Output = V;\n\n    #[inline]\n    fn index(&self, index: &Q) -> &V {\n        self.get(index).expect(\"no entry found for key\")\n    }\n}\n\n/// HashMap iterator.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct Iter<'a, K: 'a, V: 'a> {\n    inner: table::Iter<'a, K, V>\n}\n\n// FIXME(#19839) Remove in favor of `#[derive(Clone)]`\nimpl<'a, K, V> Clone for Iter<'a, K, V> {\n    fn clone(&self) -> Iter<'a, K, V> {\n        Iter {\n            inner: self.inner.clone()\n        }\n    }\n}\n\n/// HashMap mutable values iterator.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct IterMut<'a, K: 'a, V: 'a> {\n    inner: table::IterMut<'a, K, V>\n}\n\n/// HashMap move iterator.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct IntoIter<K, V> {\n    inner: iter::Map<table::IntoIter<K, V>, fn((SafeHash, K, V)) -> (K, V)>\n}\n\n/// HashMap keys iterator.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct Keys<'a, K: 'a, V: 'a> {\n    inner: Map<Iter<'a, K, V>, fn((&'a K, &'a V)) -> &'a K>\n}\n\n// FIXME(#19839) Remove in favor of `#[derive(Clone)]`\nimpl<'a, K, V> Clone for Keys<'a, K, V> {\n    fn clone(&self) -> Keys<'a, K, V> {\n        Keys {\n            inner: self.inner.clone()\n        }\n    }\n}\n\n/// HashMap values iterator.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct Values<'a, K: 'a, V: 'a> {\n    inner: Map<Iter<'a, K, V>, fn((&'a K, &'a V)) -> &'a V>\n}\n\n// FIXME(#19839) Remove in favor of `#[derive(Clone)]`\nimpl<'a, K, V> Clone for Values<'a, K, V> {\n    fn clone(&self) -> Values<'a, K, V> {\n        Values {\n            inner: self.inner.clone()\n        }\n    }\n}\n\n/// HashMap drain iterator.\n#[unstable(feature = \"std_misc\",\n           reason = \"matches collection reform specification, waiting for dust to settle\")]\npub struct Drain<'a, K: 'a, V: 'a> {\n    inner: iter::Map<table::Drain<'a, K, V>, fn((SafeHash, K, V)) -> (K, V)>\n}\n\n/// A view into a single occupied location in a HashMap.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct OccupiedEntry<'a, K: 'a, V: 'a> {\n    elem: FullBucket<K, V, &'a mut RawTable<K, V>>,\n}\n\n/// A view into a single empty location in a HashMap.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct VacantEntry<'a, K: 'a, V: 'a> {\n    hash: SafeHash,\n    key: K,\n    elem: VacantEntryState<K, V, &'a mut RawTable<K, V>>,\n}\n\n/// A view into a single location in a map, which may be vacant or occupied.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub enum Entry<'a, K: 'a, V: 'a> {\n    /// An occupied Entry.\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    Occupied(OccupiedEntry<'a, K, V>),\n\n    /// A vacant Entry.\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    Vacant(VacantEntry<'a, K, V>),\n}\n\n/// Possible states of a VacantEntry.\nenum VacantEntryState<K, V, M> {\n    /// The index is occupied, but the key to insert has precedence,\n    /// and will kick the current one out on insertion.\n    NeqElem(FullBucket<K, V, M>, usize),\n    /// The index is genuinely vacant.\n    NoElem(EmptyBucket<K, V, M>),\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V, S> IntoIterator for &'a HashMap<K, V, S>\n    where K: Eq + Hash, S: HashState\n{\n    type Item = (&'a K, &'a V);\n    type IntoIter = Iter<'a, K, V>;\n\n    fn into_iter(self) -> Iter<'a, K, V> {\n        self.iter()\n    }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V, S> IntoIterator for &'a mut HashMap<K, V, S>\n    where K: Eq + Hash, S: HashState\n{\n    type Item = (&'a K, &'a mut V);\n    type IntoIter = IterMut<'a, K, V>;\n\n    fn into_iter(mut self) -> IterMut<'a, K, V> {\n        self.iter_mut()\n    }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<K, V, S> IntoIterator for HashMap<K, V, S>\n    where K: Eq + Hash, S: HashState\n{\n    type Item = (K, V);\n    type IntoIter = IntoIter<K, V>;\n\n    /// Creates a consuming iterator, that is, one that moves each key-value\n    /// pair out of the map in arbitrary order. The map cannot be used after\n    /// calling this.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::collections::HashMap;\n    ///\n    /// let mut map = HashMap::new();\n    /// map.insert(\"a\", 1);\n    /// map.insert(\"b\", 2);\n    /// map.insert(\"c\", 3);\n    ///\n    /// // Not possible with .iter()\n    /// let vec: Vec<(&str, isize)> = map.into_iter().collect();\n    /// ```\n    fn into_iter(self) -> IntoIter<K, V> {\n        fn last_two<A, B, C>((_, b, c): (A, B, C)) -> (B, C) { (b, c) }\n        let last_two: fn((SafeHash, K, V)) -> (K, V) = last_two;\n\n        IntoIter {\n            inner: self.table.into_iter().map(last_two)\n        }\n    }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V> Iterator for Iter<'a, K, V> {\n    type Item = (&'a K, &'a V);\n\n    #[inline] fn next(&mut self) -> Option<(&'a K, &'a V)> { self.inner.next() }\n    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }\n}\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {\n    #[inline] fn len(&self) -> usize { self.inner.len() }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V> Iterator for IterMut<'a, K, V> {\n    type Item = (&'a K, &'a mut V);\n\n    #[inline] fn next(&mut self) -> Option<(&'a K, &'a mut V)> { self.inner.next() }\n    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }\n}\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {\n    #[inline] fn len(&self) -> usize { self.inner.len() }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<K, V> Iterator for IntoIter<K, V> {\n    type Item = (K, V);\n\n    #[inline] fn next(&mut self) -> Option<(K, V)> { self.inner.next() }\n    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }\n}\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<K, V> ExactSizeIterator for IntoIter<K, V> {\n    #[inline] fn len(&self) -> usize { self.inner.len() }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V> Iterator for Keys<'a, K, V> {\n    type Item = &'a K;\n\n    #[inline] fn next(&mut self) -> Option<(&'a K)> { self.inner.next() }\n    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }\n}\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {\n    #[inline] fn len(&self) -> usize { self.inner.len() }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V> Iterator for Values<'a, K, V> {\n    type Item = &'a V;\n\n    #[inline] fn next(&mut self) -> Option<(&'a V)> { self.inner.next() }\n    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }\n}\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {\n    #[inline] fn len(&self) -> usize { self.inner.len() }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V> Iterator for Drain<'a, K, V> {\n    type Item = (K, V);\n\n    #[inline] fn next(&mut self) -> Option<(K, V)> { self.inner.next() }\n    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }\n}\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, K, V> ExactSizeIterator for Drain<'a, K, V> {\n    #[inline] fn len(&self) -> usize { self.inner.len() }\n}\n\nimpl<'a, K, V> Entry<'a, K, V> {\n    #[unstable(feature = \"std_misc\",\n               reason = \"will soon be replaced by or_insert\")]\n    #[deprecated(since = \"1.0\",\n                reason = \"replaced with more ergonomic `or_insert` and `or_insert_with`\")]\n    /// Returns a mutable reference to the entry if occupied, or the VacantEntry if vacant\n    pub fn get(self) -> Result<&'a mut V, VacantEntry<'a, K, V>> {\n        match self {\n            Occupied(entry) => Ok(entry.into_mut()),\n            Vacant(entry) => Err(entry),\n        }\n    }\n\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    /// Ensures a value is in the entry by inserting the default if empty, and returns\n    /// a mutable reference to the value in the entry.\n    pub fn or_insert(self, default: V) -> &'a mut V {\n        match self {\n            Occupied(entry) => entry.into_mut(),\n            Vacant(entry) => entry.insert(default),\n        }\n    }\n\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    /// Ensures a value is in the entry by inserting the result of the default function if empty,\n    /// and returns a mutable reference to the value in the entry.\n    pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {\n        match self {\n            Occupied(entry) => entry.into_mut(),\n            Vacant(entry) => entry.insert(default()),\n        }\n    }\n}\n\nimpl<'a, K, V> OccupiedEntry<'a, K, V> {\n    /// Gets a reference to the value in the entry.\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn get(&self) -> &V {\n        self.elem.read().1\n    }\n\n    /// Gets a mutable reference to the value in the entry.\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn get_mut(&mut self) -> &mut V {\n        self.elem.read_mut().1\n    }\n\n    /// Converts the OccupiedEntry into a mutable reference to the value in the entry\n    /// with a lifetime bound to the map itself\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn into_mut(self) -> &'a mut V {\n        self.elem.into_mut_refs().1\n    }\n\n    /// Sets the value of the entry, and returns the entry's old value\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn insert(&mut self, mut value: V) -> V {\n        let old_value = self.get_mut();\n        mem::swap(&mut value, old_value);\n        value\n    }\n\n    /// Takes the value out of the entry, and returns it\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn remove(self) -> V {\n        pop_internal(self.elem).1\n    }\n}\n\nimpl<'a, K: 'a, V: 'a> VacantEntry<'a, K, V> {\n    /// Sets the value of the entry with the VacantEntry's key,\n    /// and returns a mutable reference to it\n    #[stable(feature = \"rust1\", since = \"1.0.0\")]\n    pub fn insert(self, value: V) -> &'a mut V {\n        match self.elem {\n            NeqElem(bucket, ib) => {\n                robin_hood(bucket, ib, self.hash, self.key, value)\n            }\n            NoElem(bucket) => {\n                bucket.put(self.hash, self.key, value).into_mut_refs().1\n            }\n        }\n    }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S>\n    where K: Eq + Hash, S: HashState + Default\n{\n    fn from_iter<T: IntoIterator<Item=(K, V)>>(iterable: T) -> HashMap<K, V, S> {\n        let iter = iterable.into_iter();\n        let lower = iter.size_hint().0;\n        let mut map = HashMap::with_capacity_and_hash_state(lower,\n                                                            Default::default());\n        map.extend(iter);\n        map\n    }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<K, V, S> Extend<(K, V)> for HashMap<K, V, S>\n    where K: Eq + Hash, S: HashState\n{\n    fn extend<T: IntoIterator<Item=(K, V)>>(&mut self, iter: T) {\n        for (k, v) in iter {\n            self.insert(k, v);\n        }\n    }\n}\n\n\n/// `RandomState` is the default state for `HashMap` types.\n///\n/// A particular instance `RandomState` will create the same instances of\n/// `Hasher`, but the hashers created by two different `RandomState`\n/// instances are unlikely to produce the same result for the same values.\n#[derive(Clone)]\n#[unstable(feature = \"std_misc\",\n           reason = \"hashing an hash maps may be altered\")]\npub struct RandomState {\n    k0: u64,\n    k1: u64,\n}\n\n#[unstable(feature = \"std_misc\",\n           reason = \"hashing an hash maps may be altered\")]\nimpl RandomState {\n    /// Constructs a new `RandomState` that is initialized with random keys.\n    #[inline]\n    #[allow(deprecated)]\n    pub fn new() -> RandomState {\n        let mut r = rand::thread_rng();\n        RandomState { k0: r.gen(), k1: r.gen() }\n    }\n}\n\n#[unstable(feature = \"std_misc\",\n           reason = \"hashing an hash maps may be altered\")]\nimpl HashState for RandomState {\n    type Hasher = SipHasher;\n    #[inline]\n    fn hasher(&self) -> SipHasher {\n        SipHasher::new_with_keys(self.k0, self.k1)\n    }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl Default for RandomState {\n    #[inline]\n    fn default() -> RandomState {\n        RandomState::new()\n    }\n}\n\n#[cfg(test)]\nmod test_map {\n    use prelude::v1::*;\n\n    use super::HashMap;\n    use super::Entry::{Occupied, Vacant};\n    use iter::{range_inclusive, repeat};\n    use cell::RefCell;\n    use rand::{thread_rng, Rng};\n\n    #[test]\n    fn test_create_capacity_zero() {\n        let mut m = HashMap::with_capacity(0);\n\n        assert!(m.insert(1, 1).is_none());\n\n        assert!(m.contains_key(&1));\n        assert!(!m.contains_key(&0));\n    }\n\n    #[test]\n    fn test_insert() {\n        let mut m = HashMap::new();\n        assert_eq!(m.len(), 0);\n        assert!(m.insert(1, 2).is_none());\n        assert_eq!(m.len(), 1);\n        assert!(m.insert(2, 4).is_none());\n        assert_eq!(m.len(), 2);\n        assert_eq!(*m.get(&1).unwrap(), 2);\n        assert_eq!(*m.get(&2).unwrap(), 4);\n    }\n\n    thread_local! { static DROP_VECTOR: RefCell<Vec<isize>> = RefCell::new(Vec::new()) }\n\n    #[derive(Hash, PartialEq, Eq)]\n    struct Dropable {\n        k: usize\n    }\n\n    impl Dropable {\n        fn new(k: usize) -> Dropable {\n            DROP_VECTOR.with(|slot| {\n                slot.borrow_mut()[k] += 1;\n            });\n\n            Dropable { k: k }\n        }\n    }\n\n    impl Drop for Dropable {\n        fn drop(&mut self) {\n            DROP_VECTOR.with(|slot| {\n                slot.borrow_mut()[self.k] -= 1;\n            });\n        }\n    }\n\n    impl Clone for Dropable {\n        fn clone(&self) -> Dropable {\n            Dropable::new(self.k)\n        }\n    }\n\n    #[test]\n    fn test_drops() {\n        DROP_VECTOR.with(|slot| {\n            *slot.borrow_mut() = repeat(0).take(200).collect();\n        });\n\n        {\n            let mut m = HashMap::new();\n\n            DROP_VECTOR.with(|v| {\n                for i in 0..200 {\n                    assert_eq!(v.borrow()[i], 0);\n                }\n            });\n\n            for i in 0..100 {\n                let d1 = Dropable::new(i);\n                let d2 = Dropable::new(i+100);\n                m.insert(d1, d2);\n            }\n\n            DROP_VECTOR.with(|v| {\n                for i in 0..200 {\n                    assert_eq!(v.borrow()[i], 1);\n                }\n            });\n\n            for i in 0..50 {\n                let k = Dropable::new(i);\n                let v = m.remove(&k);\n\n                assert!(v.is_some());\n\n                DROP_VECTOR.with(|v| {\n                    assert_eq!(v.borrow()[i], 1);\n                    assert_eq!(v.borrow()[i+100], 1);\n                });\n            }\n\n            DROP_VECTOR.with(|v| {\n                for i in 0..50 {\n                    assert_eq!(v.borrow()[i], 0);\n                    assert_eq!(v.borrow()[i+100], 0);\n                }\n\n                for i in 50..100 {\n                    assert_eq!(v.borrow()[i], 1);\n                    assert_eq!(v.borrow()[i+100], 1);\n                }\n            });\n        }\n\n        DROP_VECTOR.with(|v| {\n            for i in 0..200 {\n                assert_eq!(v.borrow()[i], 0);\n            }\n        });\n    }\n\n    #[test]\n    fn test_move_iter_drops() {\n        DROP_VECTOR.with(|v| {\n            *v.borrow_mut() = repeat(0).take(200).collect();\n        });\n\n        let hm = {\n            let mut hm = HashMap::new();\n\n            DROP_VECTOR.with(|v| {\n                for i in 0..200 {\n                    assert_eq!(v.borrow()[i], 0);\n                }\n            });\n\n            for i in 0..100 {\n                let d1 = Dropable::new(i);\n                let d2 = Dropable::new(i+100);\n                hm.insert(d1, d2);\n            }\n\n            DROP_VECTOR.with(|v| {\n                for i in 0..200 {\n                    assert_eq!(v.borrow()[i], 1);\n                }\n            });\n\n            hm\n        };\n\n        // By the way, ensure that cloning doesn't screw up the dropping.\n        drop(hm.clone());\n\n        {\n            let mut half = hm.into_iter().take(50);\n\n            DROP_VECTOR.with(|v| {\n                for i in 0..200 {\n                    assert_eq!(v.borrow()[i], 1);\n                }\n            });\n\n            for _ in half.by_ref() {}\n\n            DROP_VECTOR.with(|v| {\n                let nk = (0..100).filter(|&i| {\n                    v.borrow()[i] == 1\n                }).count();\n\n                let nv = (0..100).filter(|&i| {\n                    v.borrow()[i+100] == 1\n                }).count();\n\n                assert_eq!(nk, 50);\n                assert_eq!(nv, 50);\n            });\n        };\n\n        DROP_VECTOR.with(|v| {\n            for i in 0..200 {\n                assert_eq!(v.borrow()[i], 0);\n            }\n        });\n    }\n\n    #[test]\n    fn test_empty_pop() {\n        let mut m: HashMap<isize, bool> = HashMap::new();\n        assert_eq!(m.remove(&0), None);\n    }\n\n    #[test]\n    fn test_lots_of_insertions() {\n        let mut m = HashMap::new();\n\n        // Try this a few times to make sure we never screw up the hashmap's\n        // internal state.\n        for _ in 0..10 {\n            assert!(m.is_empty());\n\n            for i in range_inclusive(1, 1000) {\n                assert!(m.insert(i, i).is_none());\n\n                for j in range_inclusive(1, i) {\n                    let r = m.get(&j);\n                    assert_eq!(r, Some(&j));\n                }\n\n                for j in range_inclusive(i+1, 1000) {\n                    let r = m.get(&j);\n                    assert_eq!(r, None);\n                }\n            }\n\n            for i in range_inclusive(1001, 2000) {\n                assert!(!m.contains_key(&i));\n            }\n\n            // remove forwards\n            for i in range_inclusive(1, 1000) {\n                assert!(m.remove(&i).is_some());\n\n                for j in range_inclusive(1, i) {\n                    assert!(!m.contains_key(&j));\n                }\n\n                for j in range_inclusive(i+1, 1000) {\n                    assert!(m.contains_key(&j));\n                }\n            }\n\n            for i in range_inclusive(1, 1000) {\n                assert!(!m.contains_key(&i));\n            }\n\n            for i in range_inclusive(1, 1000) {\n                assert!(m.insert(i, i).is_none());\n            }\n\n            // remove backwards\n            for i in (1..1001).rev() {\n                assert!(m.remove(&i).is_some());\n\n                for j in range_inclusive(i, 1000) {\n                    assert!(!m.contains_key(&j));\n                }\n\n                for j in range_inclusive(1, i-1) {\n                    assert!(m.contains_key(&j));\n                }\n            }\n        }\n    }\n\n    #[test]\n    fn test_find_mut() {\n        let mut m = HashMap::new();\n        assert!(m.insert(1, 12).is_none());\n        assert!(m.insert(2, 8).is_none());\n        assert!(m.insert(5, 14).is_none());\n        let new = 100;\n        match m.get_mut(&5) {\n            None => panic!(), Some(x) => *x = new\n        }\n        assert_eq!(m.get(&5), Some(&new));\n    }\n\n    #[test]\n    fn test_insert_overwrite() {\n        let mut m = HashMap::new();\n        assert!(m.insert(1, 2).is_none());\n        assert_eq!(*m.get(&1).unwrap(), 2);\n        assert!(!m.insert(1, 3).is_none());\n        assert_eq!(*m.get(&1).unwrap(), 3);\n    }\n\n    #[test]\n    fn test_insert_conflicts() {\n        let mut m = HashMap::with_capacity(4);\n        assert!(m.insert(1, 2).is_none());\n        assert!(m.insert(5, 3).is_none());\n        assert!(m.insert(9, 4).is_none());\n        assert_eq!(*m.get(&9).unwrap(), 4);\n        assert_eq!(*m.get(&5).unwrap(), 3);\n        assert_eq!(*m.get(&1).unwrap(), 2);\n    }\n\n    #[test]\n    fn test_conflict_remove() {\n        let mut m = HashMap::with_capacity(4);\n        assert!(m.insert(1, 2).is_none());\n        assert_eq!(*m.get(&1).unwrap(), 2);\n        assert!(m.insert(5, 3).is_none());\n        assert_eq!(*m.get(&1).unwrap(), 2);\n        assert_eq!(*m.get(&5).unwrap(), 3);\n        assert!(m.insert(9, 4).is_none());\n        assert_eq!(*m.get(&1).unwrap(), 2);\n        assert_eq!(*m.get(&5).unwrap(), 3);\n        assert_eq!(*m.get(&9).unwrap(), 4);\n        assert!(m.remove(&1).is_some());\n        assert_eq!(*m.get(&9).unwrap(), 4);\n        assert_eq!(*m.get(&5).unwrap(), 3);\n    }\n\n    #[test]\n    fn test_is_empty() {\n        let mut m = HashMap::with_capacity(4);\n        assert!(m.insert(1, 2).is_none());\n        assert!(!m.is_empty());\n        assert!(m.remove(&1).is_some());\n        assert!(m.is_empty());\n    }\n\n    #[test]\n    fn test_pop() {\n        let mut m = HashMap::new();\n        m.insert(1, 2);\n        assert_eq!(m.remove(&1), Some(2));\n        assert_eq!(m.remove(&1), None);\n    }\n\n    #[test]\n    fn test_iterate() {\n        let mut m = HashMap::with_capacity(4);\n        for i in 0..32 {\n            assert!(m.insert(i, i*2).is_none());\n        }\n        assert_eq!(m.len(), 32);\n\n        let mut observed: u32 = 0;\n\n        for (k, v) in &m {\n            assert_eq!(*v, *k * 2);\n            observed |= 1 << *k;\n        }\n        assert_eq!(observed, 0xFFFF_FFFF);\n    }\n\n    #[test]\n    fn test_keys() {\n        let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];\n        let map: HashMap<_, _> = vec.into_iter().collect();\n        let keys: Vec<_> = map.keys().cloned().collect();\n        assert_eq!(keys.len(), 3);\n        assert!(keys.contains(&1));\n        assert!(keys.contains(&2));\n        assert!(keys.contains(&3));\n    }\n\n    #[test]\n    fn test_values() {\n        let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];\n        let map: HashMap<_, _> = vec.into_iter().collect();\n        let values: Vec<_> = map.values().cloned().collect();\n        assert_eq!(values.len(), 3);\n        assert!(values.contains(&'a'));\n        assert!(values.contains(&'b'));\n        assert!(values.contains(&'c'));\n    }\n\n    #[test]\n    fn test_find() {\n        let mut m = HashMap::new();\n        assert!(m.get(&1).is_none());\n        m.insert(1, 2);\n        match m.get(&1) {\n            None => panic!(),\n            Some(v) => assert_eq!(*v, 2)\n        }\n    }\n\n    #[test]\n    fn test_eq() {\n        let mut m1 = HashMap::new();\n        m1.insert(1, 2);\n        m1.insert(2, 3);\n        m1.insert(3, 4);\n\n        let mut m2 = HashMap::new();\n        m2.insert(1, 2);\n        m2.insert(2, 3);\n\n        assert!(m1 != m2);\n\n        m2.insert(3, 4);\n\n        assert_eq!(m1, m2);\n    }\n\n    #[test]\n    fn test_show() {\n        let mut map = HashMap::new();\n        let empty: HashMap<i32, i32> = HashMap::new();\n\n        map.insert(1, 2);\n        map.insert(3, 4);\n\n        let map_str = format!(\"{:?}\", map);\n\n        assert!(map_str == \"{1: 2, 3: 4}\" ||\n                map_str == \"{3: 4, 1: 2}\");\n        assert_eq!(format!(\"{:?}\", empty), \"{}\");\n    }\n\n    #[test]\n    fn test_expand() {\n        let mut m = HashMap::new();\n\n        assert_eq!(m.len(), 0);\n        assert!(m.is_empty());\n\n        let mut i = 0;\n        let old_cap = m.table.capacity();\n        while old_cap == m.table.capacity() {\n            m.insert(i, i);\n            i += 1;\n        }\n\n        assert_eq!(m.len(), i);\n        assert!(!m.is_empty());\n    }\n\n    #[test]\n    fn test_behavior_resize_policy() {\n        let mut m = HashMap::new();\n\n        assert_eq!(m.len(), 0);\n        assert_eq!(m.table.capacity(), 0);\n        assert!(m.is_empty());\n\n        m.insert(0, 0);\n        m.remove(&0);\n        assert!(m.is_empty());\n        let initial_cap = m.table.capacity();\n        m.reserve(initial_cap);\n        let cap = m.table.capacity();\n\n        assert_eq!(cap, initial_cap * 2);\n\n        let mut i = 0;\n        for _ in 0..cap * 3 / 4 {\n            m.insert(i, i);\n            i += 1;\n        }\n        // three quarters full\n\n        assert_eq!(m.len(), i);\n        assert_eq!(m.table.capacity(), cap);\n\n        for _ in 0..cap / 4 {\n            m.insert(i, i);\n            i += 1;\n        }\n        // half full\n\n        let new_cap = m.table.capacity();\n        assert_eq!(new_cap, cap * 2);\n\n        for _ in 0..cap / 2 - 1 {\n            i -= 1;\n            m.remove(&i);\n            assert_eq!(m.table.capacity(), new_cap);\n        }\n        // A little more than one quarter full.\n        m.shrink_to_fit();\n        assert_eq!(m.table.capacity(), cap);\n        // again, a little more than half full\n        for _ in 0..cap / 2 - 1 {\n            i -= 1;\n            m.remove(&i);\n        }\n        m.shrink_to_fit();\n\n        assert_eq!(m.len(), i);\n        assert!(!m.is_empty());\n        assert_eq!(m.table.capacity(), initial_cap);\n    }\n\n    #[test]\n    fn test_reserve_shrink_to_fit() {\n        let mut m = HashMap::new();\n        m.insert(0, 0);\n        m.remove(&0);\n        assert!(m.capacity() >= m.len());\n        for i in 0..128 {\n            m.insert(i, i);\n        }\n        m.reserve(256);\n\n        let usable_cap = m.capacity();\n        for i in 128..(128 + 256) {\n            m.insert(i, i);\n            assert_eq!(m.capacity(), usable_cap);\n        }\n\n        for i in 100..(128 + 256) {\n            assert_eq!(m.remove(&i), Some(i));\n        }\n        m.shrink_to_fit();\n\n        assert_eq!(m.len(), 100);\n        assert!(!m.is_empty());\n        assert!(m.capacity() >= m.len());\n\n        for i in 0..100 {\n            assert_eq!(m.remove(&i), Some(i));\n        }\n        m.shrink_to_fit();\n        m.insert(0, 0);\n\n        assert_eq!(m.len(), 1);\n        assert!(m.capacity() >= m.len());\n        assert_eq!(m.remove(&0), Some(0));\n    }\n\n    #[test]\n    fn test_from_iter() {\n        let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];\n\n        let map: HashMap<_, _> = xs.iter().cloned().collect();\n\n        for &(k, v) in &xs {\n            assert_eq!(map.get(&k), Some(&v));\n        }\n    }\n\n    #[test]\n    fn test_size_hint() {\n        let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];\n\n        let map: HashMap<_, _>  = xs.iter().cloned().collect();\n\n        let mut iter = map.iter();\n\n        for _ in iter.by_ref().take(3) {}\n\n        assert_eq!(iter.size_hint(), (3, Some(3)));\n    }\n\n    #[test]\n    fn test_iter_len() {\n        let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];\n\n        let map: HashMap<_, _>  = xs.iter().cloned().collect();\n\n        let mut iter = map.iter();\n\n        for _ in iter.by_ref().take(3) {}\n\n        assert_eq!(iter.len(), 3);\n    }\n\n    #[test]\n    fn test_mut_size_hint() {\n        let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];\n\n        let mut map: HashMap<_, _>  = xs.iter().cloned().collect();\n\n        let mut iter = map.iter_mut();\n\n        for _ in iter.by_ref().take(3) {}\n\n        assert_eq!(iter.size_hint(), (3, Some(3)));\n    }\n\n    #[test]\n    fn test_iter_mut_len() {\n        let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];\n\n        let mut map: HashMap<_, _>  = xs.iter().cloned().collect();\n\n        let mut iter = map.iter_mut();\n\n        for _ in iter.by_ref().take(3) {}\n\n        assert_eq!(iter.len(), 3);\n    }\n\n    #[test]\n    fn test_index() {\n        let mut map = HashMap::new();\n\n        map.insert(1, 2);\n        map.insert(2, 1);\n        map.insert(3, 4);\n\n        assert_eq!(map[&2], 1);\n    }\n\n    #[test]\n    #[should_panic]\n    fn test_index_nonexistent() {\n        let mut map = HashMap::new();\n\n        map.insert(1, 2);\n        map.insert(2, 1);\n        map.insert(3, 4);\n\n        map[&4];\n    }\n\n    #[test]\n    fn test_entry(){\n        let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];\n\n        let mut map: HashMap<_, _> = xs.iter().cloned().collect();\n\n        // Existing key (insert)\n        match map.entry(1) {\n            Vacant(_) => unreachable!(),\n            Occupied(mut view) => {\n                assert_eq!(view.get(), &10);\n                assert_eq!(view.insert(100), 10);\n            }\n        }\n        assert_eq!(map.get(&1).unwrap(), &100);\n        assert_eq!(map.len(), 6);\n\n\n        // Existing key (update)\n        match map.entry(2) {\n            Vacant(_) => unreachable!(),\n            Occupied(mut view) => {\n                let v = view.get_mut();\n                let new_v = (*v) * 10;\n                *v = new_v;\n            }\n        }\n        assert_eq!(map.get(&2).unwrap(), &200);\n        assert_eq!(map.len(), 6);\n\n        // Existing key (take)\n        match map.entry(3) {\n            Vacant(_) => unreachable!(),\n            Occupied(view) => {\n                assert_eq!(view.remove(), 30);\n            }\n        }\n        assert_eq!(map.get(&3), None);\n        assert_eq!(map.len(), 5);\n\n\n        // Inexistent key (insert)\n        match map.entry(10) {\n            Occupied(_) => unreachable!(),\n            Vacant(view) => {\n                assert_eq!(*view.insert(1000), 1000);\n            }\n        }\n        assert_eq!(map.get(&10).unwrap(), &1000);\n        assert_eq!(map.len(), 6);\n    }\n\n    #[test]\n    fn test_entry_take_doesnt_corrupt() {\n        #![allow(deprecated)] //rand\n        // Test for #19292\n        fn check(m: &HashMap<isize, ()>) {\n            for k in m.keys() {\n                assert!(m.contains_key(k),\n                        \"{} is in keys() but not in the map?\", k);\n            }\n        }\n\n        let mut m = HashMap::new();\n        let mut rng = thread_rng();\n\n        // Populate the map with some items.\n        for _ in 0..50 {\n            let x = rng.gen_range(-10, 10);\n            m.insert(x, ());\n        }\n\n        for i in 0..1000 {\n            let x = rng.gen_range(-10, 10);\n            match m.entry(x) {\n                Vacant(_) => {},\n                Occupied(e) => {\n                    println!(\"{}: remove {}\", i, x);\n                    e.remove();\n                },\n            }\n\n            check(&m);\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rust/main.rs",
    "content": "extern crate foo;\nextern crate bar;\n\nuse foo::{self, quix};\nuse bar::car::*;\nuse bar;\n\nfn main() {\n    println!(\"Hello {}\", \"World\");\n\n    panic!(\"Goodbye\")\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Rust/task.rs",
    "content": "// Copyright 2012 The Rust Project Developers. See the COPYRIGHT\n// file at the top-level directory of this distribution and at\n// http://rust-lang.org/COPYRIGHT.\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\n/*!\n * Task management.\n *\n * An executing Rust program consists of a tree of tasks, each with their own\n * stack, and sole ownership of their allocated heap data. Tasks communicate\n * with each other using ports and channels.\n *\n * When a task fails, that failure will propagate to its parent (the task\n * that spawned it) and the parent will fail as well. The reverse is not\n * true: when a parent task fails its children will continue executing. When\n * the root (main) task fails, all tasks fail, and then so does the entire\n * process.\n *\n * Tasks may execute in parallel and are scheduled automatically by the\n * runtime.\n *\n * # Example\n *\n * ~~~\n * do spawn {\n *     log(error, \"Hello, World!\");\n * }\n * ~~~\n */\n\nuse cell::Cell;\nuse cmp::Eq;\nuse option;\nuse result::Result;\nuse comm::{stream, Chan, GenericChan, GenericPort, Port, SharedChan};\nuse prelude::*;\nuse result;\nuse task::rt::{task_id, sched_id, rust_task};\nuse util;\nuse util::replace;\n\nmod local_data_priv;\npub mod local_data;\npub mod rt;\npub mod spawn;\n\n/// A handle to a scheduler\n#[deriving_eq]\npub enum Scheduler {\n    SchedulerHandle(sched_id)\n}\n\n/// A handle to a task\n#[deriving_eq]\npub enum Task {\n    TaskHandle(task_id)\n}\n\n/**\n * Indicates the manner in which a task exited.\n *\n * A task that completes without failing is considered to exit successfully.\n * Supervised ancestors and linked siblings may yet fail after this task\n * succeeds. Also note that in such a case, it may be nondeterministic whether\n * linked failure or successful exit happen first.\n *\n * If you wish for this result's delivery to block until all linked and/or\n * children tasks complete, recommend using a result future.\n */\npub enum TaskResult {\n    Success,\n    Failure,\n}\n\nimpl Eq for TaskResult {\n    pure fn eq(&self, other: &TaskResult) -> bool {\n        match ((*self), (*other)) {\n            (Success, Success) | (Failure, Failure) => true,\n            (Success, _) | (Failure, _) => false\n        }\n    }\n    pure fn ne(&self, other: &TaskResult) -> bool { !(*self).eq(other) }\n}\n\n/// Scheduler modes\n#[deriving_eq]\npub enum SchedMode {\n    /// Run task on the default scheduler\n    DefaultScheduler,\n    /// Run task on the current scheduler\n    CurrentScheduler,\n    /// Run task on a specific scheduler\n    ExistingScheduler(Scheduler),\n    /**\n     * Tasks are scheduled on the main OS thread\n     *\n     * The main OS thread is the thread used to launch the runtime which,\n     * in most cases, is the process's initial thread as created by the OS.\n     */\n    PlatformThread,\n    /// All tasks run in the same OS thread\n    SingleThreaded,\n    /// Tasks are distributed among available CPUs\n    ThreadPerCore,\n    /// Each task runs in its own OS thread\n    ThreadPerTask,\n    /// Tasks are distributed among a fixed number of OS threads\n    ManualThreads(uint),\n}\n\n/**\n * Scheduler configuration options\n *\n * # Fields\n *\n * * sched_mode - The operating mode of the scheduler\n *\n * * foreign_stack_size - The size of the foreign stack, in bytes\n *\n *     Rust code runs on Rust-specific stacks. When Rust code calls foreign\n *     code (via functions in foreign modules) it switches to a typical, large\n *     stack appropriate for running code written in languages like C. By\n *     default these foreign stacks have unspecified size, but with this\n *     option their size can be precisely specified.\n */\npub struct SchedOpts {\n    mode: SchedMode,\n    foreign_stack_size: Option<uint>,\n}\n\n/**\n * Task configuration options\n *\n * # Fields\n *\n * * linked - Propagate failure bidirectionally between child and parent.\n *            True by default. If both this and 'supervised' are false, then\n *            either task's failure will not affect the other (\"unlinked\").\n *\n * * supervised - Propagate failure unidirectionally from parent to child,\n *                but not from child to parent. False by default.\n *\n * * notify_chan - Enable lifecycle notifications on the given channel\n *\n * * sched - Specify the configuration of a new scheduler to create the task\n *           in\n *\n *     By default, every task is created in the same scheduler as its\n *     parent, where it is scheduled cooperatively with all other tasks\n *     in that scheduler. Some specialized applications may want more\n *     control over their scheduling, in which case they can be spawned\n *     into a new scheduler with the specific properties required.\n *\n *     This is of particular importance for libraries which want to call\n *     into foreign code that blocks. Without doing so in a different\n *     scheduler other tasks will be impeded or even blocked indefinitely.\n */\npub struct TaskOpts {\n    linked: bool,\n    supervised: bool,\n    mut notify_chan: Option<Chan<TaskResult>>,\n    sched: SchedOpts\n}\n\n/**\n * The task builder type.\n *\n * Provides detailed control over the properties and behavior of new tasks.\n */\n// NB: Builders are designed to be single-use because they do stateful\n// things that get weird when reusing - e.g. if you create a result future\n// it only applies to a single task, so then you have to maintain Some\n// potentially tricky state to ensure that everything behaves correctly\n// when you try to reuse the builder to spawn a new task. We'll just\n// sidestep that whole issue by making builders uncopyable and making\n// the run function move them in.\n\n// FIXME (#3724): Replace the 'consumed' bit with move mode on self\npub struct TaskBuilder {\n    opts: TaskOpts,\n    gen_body: @fn(v: ~fn()) -> ~fn(),\n    can_not_copy: Option<util::NonCopyable>,\n    mut consumed: bool,\n}\n\n/**\n * Generate the base configuration for spawning a task, off of which more\n * configuration methods can be chained.\n * For example, task().unlinked().spawn is equivalent to spawn_unlinked.\n */\npub fn task() -> TaskBuilder {\n    TaskBuilder {\n        opts: default_task_opts(),\n        gen_body: |body| body, // Identity function\n        can_not_copy: None,\n        mut consumed: false,\n    }\n}\n\n#[doc(hidden)] // FIXME #3538\npriv impl TaskBuilder {\n    fn consume(&self) -> TaskBuilder {\n        if self.consumed {\n            fail!(~\"Cannot copy a task_builder\"); // Fake move mode on self\n        }\n        self.consumed = true;\n        let notify_chan = replace(&mut self.opts.notify_chan, None);\n        TaskBuilder {\n            opts: TaskOpts {\n                linked: self.opts.linked,\n                supervised: self.opts.supervised,\n                notify_chan: notify_chan,\n                sched: self.opts.sched\n            },\n            gen_body: self.gen_body,\n            can_not_copy: None,\n            consumed: false\n        }\n    }\n}\n\npub impl TaskBuilder {\n    /**\n     * Decouple the child task's failure from the parent's. If either fails,\n     * the other will not be killed.\n     */\n    fn unlinked(&self) -> TaskBuilder {\n        let notify_chan = replace(&mut self.opts.notify_chan, None);\n        TaskBuilder {\n            opts: TaskOpts {\n                linked: false,\n                supervised: self.opts.supervised,\n                notify_chan: notify_chan,\n                sched: self.opts.sched\n            },\n            can_not_copy: None,\n            .. self.consume()\n        }\n    }\n    /**\n     * Unidirectionally link the child task's failure with the parent's. The\n     * child's failure will not kill the parent, but the parent's will kill\n     * the child.\n     */\n    fn supervised(&self) -> TaskBuilder {\n        let notify_chan = replace(&mut self.opts.notify_chan, None);\n        TaskBuilder {\n            opts: TaskOpts {\n                linked: false,\n                supervised: true,\n                notify_chan: notify_chan,\n                sched: self.opts.sched\n            },\n            can_not_copy: None,\n            .. self.consume()\n        }\n    }\n    /**\n     * Link the child task's and parent task's failures. If either fails, the\n     * other will be killed.\n     */\n    fn linked(&self) -> TaskBuilder {\n        let notify_chan = replace(&mut self.opts.notify_chan, None);\n        TaskBuilder {\n            opts: TaskOpts {\n                linked: true,\n                supervised: false,\n                notify_chan: notify_chan,\n                sched: self.opts.sched\n            },\n            can_not_copy: None,\n            .. self.consume()\n        }\n    }\n\n    /**\n     * Get a future representing the exit status of the task.\n     *\n     * Taking the value of the future will block until the child task\n     * terminates. The future-receiving callback specified will be called\n     * *before* the task is spawned; as such, do not invoke .get() within the\n     * closure; rather, store it in an outer variable/list for later use.\n     *\n     * Note that the future returning by this function is only useful for\n     * obtaining the value of the next task to be spawning with the\n     * builder. If additional tasks are spawned with the same builder\n     * then a new result future must be obtained prior to spawning each\n     * task.\n     *\n     * # Failure\n     * Fails if a future_result was already set for this task.\n     */\n    fn future_result(&self, blk: fn(v: Port<TaskResult>)) -> TaskBuilder {\n        // FIXME (#3725): Once linked failure and notification are\n        // handled in the library, I can imagine implementing this by just\n        // registering an arbitrary number of task::on_exit handlers and\n        // sending out messages.\n\n        if self.opts.notify_chan.is_some() {\n            fail!(~\"Can't set multiple future_results for one task!\");\n        }\n\n        // Construct the future and give it to the caller.\n        let (notify_pipe_po, notify_pipe_ch) = stream::<TaskResult>();\n\n        blk(notify_pipe_po);\n\n        // Reconfigure self to use a notify channel.\n        TaskBuilder {\n            opts: TaskOpts {\n                linked: self.opts.linked,\n                supervised: self.opts.supervised,\n                notify_chan: Some(notify_pipe_ch),\n                sched: self.opts.sched\n            },\n            can_not_copy: None,\n            .. self.consume()\n        }\n    }\n    /// Configure a custom scheduler mode for the task.\n    fn sched_mode(&self, mode: SchedMode) -> TaskBuilder {\n        let notify_chan = replace(&mut self.opts.notify_chan, None);\n        TaskBuilder {\n            opts: TaskOpts {\n                linked: self.opts.linked,\n                supervised: self.opts.supervised,\n                notify_chan: notify_chan,\n                sched: SchedOpts { mode: mode, foreign_stack_size: None}\n            },\n            can_not_copy: None,\n            .. self.consume()\n        }\n    }\n\n    /**\n     * Add a wrapper to the body of the spawned task.\n     *\n     * Before the task is spawned it is passed through a 'body generator'\n     * function that may perform local setup operations as well as wrap\n     * the task body in remote setup operations. With this the behavior\n     * of tasks can be extended in simple ways.\n     *\n     * This function augments the current body generator with a new body\n     * generator by applying the task body which results from the\n     * existing body generator to the new body generator.\n     */\n    fn add_wrapper(&self, wrapper: @fn(v: ~fn()) -> ~fn()) -> TaskBuilder {\n        let prev_gen_body = self.gen_body;\n        let notify_chan = replace(&mut self.opts.notify_chan, None);\n        TaskBuilder {\n            opts: TaskOpts {\n                linked: self.opts.linked,\n                supervised: self.opts.supervised,\n                notify_chan: notify_chan,\n                sched: self.opts.sched\n            },\n            gen_body: |body| { wrapper(prev_gen_body(body)) },\n            can_not_copy: None,\n            .. self.consume()\n        }\n    }\n\n    /**\n     * Creates and executes a new child task\n     *\n     * Sets up a new task with its own call stack and schedules it to run\n     * the provided unique closure. The task has the properties and behavior\n     * specified by the task_builder.\n     *\n     * # Failure\n     *\n     * When spawning into a new scheduler, the number of threads requested\n     * must be greater than zero.\n     */\n    fn spawn(&self, f: ~fn()) {\n        let notify_chan = replace(&mut self.opts.notify_chan, None);\n        let x = self.consume();\n        let opts = TaskOpts {\n            linked: x.opts.linked,\n            supervised: x.opts.supervised,\n            notify_chan: notify_chan,\n            sched: x.opts.sched\n        };\n        spawn::spawn_raw(opts, (x.gen_body)(f));\n    }\n    /// Runs a task, while transfering ownership of one argument to the child.\n    fn spawn_with<A:Owned>(&self, arg: A, f: ~fn(v: A)) {\n        let arg = Cell(arg);\n        do self.spawn {\n            f(arg.take());\n        }\n    }\n\n    /**\n     * Execute a function in another task and return either the return value\n     * of the function or result::err.\n     *\n     * # Return value\n     *\n     * If the function executed successfully then try returns result::ok\n     * containing the value returned by the function. If the function fails\n     * then try returns result::err containing nil.\n     *\n     * # Failure\n     * Fails if a future_result was already set for this task.\n     */\n    fn try<T:Owned>(&self, f: ~fn() -> T) -> Result<T,()> {\n        let (po, ch) = stream::<T>();\n        let mut result = None;\n\n        let fr_task_builder = self.future_result(|+r| {\n            result = Some(r);\n        });\n        do fr_task_builder.spawn || {\n            ch.send(f());\n        }\n        match option::unwrap(result).recv() {\n            Success => result::Ok(po.recv()),\n            Failure => result::Err(())\n        }\n    }\n}\n\n\n/* Task construction */\n\npub fn default_task_opts() -> TaskOpts {\n    /*!\n     * The default task options\n     *\n     * By default all tasks are supervised by their parent, are spawned\n     * into the same scheduler, and do not post lifecycle notifications.\n     */\n\n    TaskOpts {\n        linked: true,\n        supervised: false,\n        notify_chan: None,\n        sched: SchedOpts {\n            mode: DefaultScheduler,\n            foreign_stack_size: None\n        }\n    }\n}\n\n/* Spawn convenience functions */\n\npub fn spawn(f: ~fn()) {\n    /*!\n     * Creates and executes a new child task\n     *\n     * Sets up a new task with its own call stack and schedules it to run\n     * the provided unique closure.\n     *\n     * This function is equivalent to `task().spawn(f)`.\n     */\n\n    task().spawn(f)\n}\n\npub fn spawn_unlinked(f: ~fn()) {\n    /*!\n     * Creates a child task unlinked from the current one. If either this\n     * task or the child task fails, the other will not be killed.\n     */\n\n    task().unlinked().spawn(f)\n}\n\npub fn spawn_supervised(f: ~fn()) {\n    /*!\n     * Creates a child task unlinked from the current one. If either this\n     * task or the child task fails, the other will not be killed.\n     */\n\n    task().supervised().spawn(f)\n}\n\npub fn spawn_with<A:Owned>(arg: A, f: ~fn(v: A)) {\n    /*!\n     * Runs a task, while transfering ownership of one argument to the\n     * child.\n     *\n     * This is useful for transfering ownership of noncopyables to\n     * another task.\n     *\n     * This function is equivalent to `task().spawn_with(arg, f)`.\n     */\n\n    task().spawn_with(arg, f)\n}\n\npub fn spawn_sched(mode: SchedMode, f: ~fn()) {\n    /*!\n     * Creates a new task on a new or existing scheduler\n\n     * When there are no more tasks to execute the\n     * scheduler terminates.\n     *\n     * # Failure\n     *\n     * In manual threads mode the number of threads requested must be\n     * greater than zero.\n     */\n\n    task().sched_mode(mode).spawn(f)\n}\n\npub fn try<T:Owned>(f: ~fn() -> T) -> Result<T,()> {\n    /*!\n     * Execute a function in another task and return either the return value\n     * of the function or result::err.\n     *\n     * This is equivalent to task().supervised().try.\n     */\n\n    task().supervised().try(f)\n}\n\n\n/* Lifecycle functions */\n\npub fn yield() {\n    //! Yield control to the task scheduler\n\n    unsafe {\n        let task_ = rt::rust_get_task();\n        let killed = rt::rust_task_yield(task_);\n        if killed && !failing() {\n            fail!(~\"killed\");\n        }\n    }\n}\n\npub fn failing() -> bool {\n    //! True if the running task has failed\n\n    unsafe {\n        rt::rust_task_is_unwinding(rt::rust_get_task())\n    }\n}\n\npub fn get_task() -> Task {\n    //! Get a handle to the running task\n\n    unsafe {\n        TaskHandle(rt::get_task_id())\n    }\n}\n\npub fn get_scheduler() -> Scheduler {\n    SchedulerHandle(unsafe { rt::rust_get_sched_id() })\n}\n\n/**\n * Temporarily make the task unkillable\n *\n * # Example\n *\n * ~~~\n * do task::unkillable {\n *     // detach / yield / destroy must all be called together\n *     rustrt::rust_port_detach(po);\n *     // This must not result in the current task being killed\n *     task::yield();\n *     rustrt::rust_port_destroy(po);\n * }\n * ~~~\n */\npub unsafe fn unkillable<U>(f: fn() -> U) -> U {\n    struct AllowFailure {\n        t: *rust_task,\n        drop {\n            unsafe {\n                rt::rust_task_allow_kill(self.t);\n            }\n        }\n    }\n\n    fn AllowFailure(t: *rust_task) -> AllowFailure{\n        AllowFailure {\n            t: t\n        }\n    }\n\n    unsafe {\n        let t = rt::rust_get_task();\n        let _allow_failure = AllowFailure(t);\n        rt::rust_task_inhibit_kill(t);\n        f()\n    }\n}\n\n/// The inverse of unkillable. Only ever to be used nested in unkillable().\npub unsafe fn rekillable<U>(f: fn() -> U) -> U {\n    struct DisallowFailure {\n        t: *rust_task,\n        drop {\n            unsafe {\n                rt::rust_task_inhibit_kill(self.t);\n            }\n        }\n    }\n\n    fn DisallowFailure(t: *rust_task) -> DisallowFailure {\n        DisallowFailure {\n            t: t\n        }\n    }\n\n    unsafe {\n        let t = rt::rust_get_task();\n        let _allow_failure = DisallowFailure(t);\n        rt::rust_task_allow_kill(t);\n        f()\n    }\n}\n\n/**\n * A stronger version of unkillable that also inhibits scheduling operations.\n * For use with exclusive ARCs, which use pthread mutexes directly.\n */\npub unsafe fn atomically<U>(f: fn() -> U) -> U {\n    struct DeferInterrupts {\n        t: *rust_task,\n        drop {\n            unsafe {\n                rt::rust_task_allow_yield(self.t);\n                rt::rust_task_allow_kill(self.t);\n            }\n        }\n    }\n\n    fn DeferInterrupts(t: *rust_task) -> DeferInterrupts {\n        DeferInterrupts {\n            t: t\n        }\n    }\n\n    unsafe {\n        let t = rt::rust_get_task();\n        let _interrupts = DeferInterrupts(t);\n        rt::rust_task_inhibit_kill(t);\n        rt::rust_task_inhibit_yield(t);\n        f()\n    }\n}\n\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_cant_dup_task_builder() {\n    let b = task().unlinked();\n    do b.spawn { }\n    // FIXME(#3724): For now, this is a -runtime- failure, because we haven't\n    // got move mode on self. When 3724 is fixed, this test should fail to\n    // compile instead, and should go in tests/compile-fail.\n    do b.spawn { } // b should have been consumed by the previous call\n}\n\n// The following 8 tests test the following 2^3 combinations:\n// {un,}linked {un,}supervised failure propagation {up,down}wards.\n\n// !!! These tests are dangerous. If Something is buggy, they will hang, !!!\n// !!! instead of exiting cleanly. This might wedge the buildbots.       !!!\n\n#[test] #[ignore(cfg(windows))]\nfn test_spawn_unlinked_unsup_no_fail_down() { // grandchild sends on a port\n    let (po, ch) = stream();\n    let ch = SharedChan(ch);\n    do spawn_unlinked {\n        let ch = ch.clone();\n        do spawn_unlinked {\n            // Give middle task a chance to fail-but-not-kill-us.\n            for iter::repeat(16) { task::yield(); }\n            ch.send(()); // If killed first, grandparent hangs.\n        }\n        fail!(); // Shouldn't kill either (grand)parent or (grand)child.\n    }\n    po.recv();\n}\n#[test] #[ignore(cfg(windows))]\nfn test_spawn_unlinked_unsup_no_fail_up() { // child unlinked fails\n    do spawn_unlinked { fail!(); }\n}\n#[test] #[ignore(cfg(windows))]\nfn test_spawn_unlinked_sup_no_fail_up() { // child unlinked fails\n    do spawn_supervised { fail!(); }\n    // Give child a chance to fail-but-not-kill-us.\n    for iter::repeat(16) { task::yield(); }\n}\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_spawn_unlinked_sup_fail_down() {\n    do spawn_supervised { loop { task::yield(); } }\n    fail!(); // Shouldn't leave a child hanging around.\n}\n\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_spawn_linked_sup_fail_up() { // child fails; parent fails\n    let (po, _ch) = stream::<()>();\n    // Unidirectional \"parenting\" shouldn't override bidirectional linked.\n    // We have to cheat with opts - the interface doesn't support them because\n    // they don't make sense (redundant with task().supervised()).\n    let opts = {\n        let mut opts = default_task_opts();\n        opts.linked = true;\n        opts.supervised = true;\n        opts\n    };\n\n    let b0 = task();\n    let b1 = TaskBuilder {\n        opts: opts,\n        can_not_copy: None,\n        .. b0\n    };\n    do b1.spawn { fail!(); }\n    po.recv(); // We should get punted awake\n}\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_spawn_linked_sup_fail_down() { // parent fails; child fails\n    // We have to cheat with opts - the interface doesn't support them because\n    // they don't make sense (redundant with task().supervised()).\n    let opts = {\n        let mut opts = default_task_opts();\n        opts.linked = true;\n        opts.supervised = true;\n        opts\n    };\n\n    let b0 = task();\n    let b1 = TaskBuilder {\n        opts: opts,\n        can_not_copy: None,\n        .. b0\n    };\n    do b1.spawn { loop { task::yield(); } }\n    fail!(); // *both* mechanisms would be wrong if this didn't kill the child\n}\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_spawn_linked_unsup_fail_up() { // child fails; parent fails\n    let (po, _ch) = stream::<()>();\n    // Default options are to spawn linked & unsupervised.\n    do spawn { fail!(); }\n    po.recv(); // We should get punted awake\n}\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_spawn_linked_unsup_fail_down() { // parent fails; child fails\n    // Default options are to spawn linked & unsupervised.\n    do spawn { loop { task::yield(); } }\n    fail!();\n}\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_spawn_linked_unsup_default_opts() { // parent fails; child fails\n    // Make sure the above test is the same as this one.\n    do task().linked().spawn { loop { task::yield(); } }\n    fail!();\n}\n\n// A couple bonus linked failure tests - testing for failure propagation even\n// when the middle task exits successfully early before kill signals are sent.\n\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_spawn_failure_propagate_grandchild() {\n    // Middle task exits; does grandparent's failure propagate across the gap?\n    do spawn_supervised {\n        do spawn_supervised {\n            loop { task::yield(); }\n        }\n    }\n    for iter::repeat(16) { task::yield(); }\n    fail!();\n}\n\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_spawn_failure_propagate_secondborn() {\n    // First-born child exits; does parent's failure propagate to sibling?\n    do spawn_supervised {\n        do spawn { // linked\n            loop { task::yield(); }\n        }\n    }\n    for iter::repeat(16) { task::yield(); }\n    fail!();\n}\n\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_spawn_failure_propagate_nephew_or_niece() {\n    // Our sibling exits; does our failure propagate to sibling's child?\n    do spawn { // linked\n        do spawn_supervised {\n            loop { task::yield(); }\n        }\n    }\n    for iter::repeat(16) { task::yield(); }\n    fail!();\n}\n\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_spawn_linked_sup_propagate_sibling() {\n    // Middle sibling exits - does eldest's failure propagate to youngest?\n    do spawn { // linked\n        do spawn { // linked\n            loop { task::yield(); }\n        }\n    }\n    for iter::repeat(16) { task::yield(); }\n    fail!();\n}\n\n#[test]\nfn test_run_basic() {\n    let (po, ch) = stream::<()>();\n    do task().spawn {\n        ch.send(());\n    }\n    po.recv();\n}\n\n#[test]\nstruct Wrapper {\n    mut f: Option<Chan<()>>\n}\n\n#[test]\nfn test_add_wrapper() {\n    let (po, ch) = stream::<()>();\n    let b0 = task();\n    let ch = Wrapper { f: Some(ch) };\n    let b1 = do b0.add_wrapper |body| {\n        let ch = Wrapper { f: Some(ch.f.swap_unwrap()) };\n        let result: ~fn() = || {\n            let ch = ch.f.swap_unwrap();\n            body();\n            ch.send(());\n        };\n        result\n    };\n    do b1.spawn { }\n    po.recv();\n}\n\n#[test]\n#[ignore(cfg(windows))]\nfn test_future_result() {\n    let mut result = None;\n    do task().future_result(|+r| { result = Some(r); }).spawn { }\n    assert option::unwrap(result).recv() == Success;\n\n    result = None;\n    do task().future_result(|+r|\n        { result = Some(r); }).unlinked().spawn {\n        fail!();\n    }\n    assert option::unwrap(result).recv() == Failure;\n}\n\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_back_to_the_future_result() {\n    let _ = task().future_result(util::ignore).future_result(util::ignore);\n}\n\n#[test]\nfn test_try_success() {\n    match do try {\n        ~\"Success!\"\n    } {\n        result::Ok(~\"Success!\") => (),\n        _ => fail!()\n    }\n}\n\n#[test]\n#[ignore(cfg(windows))]\nfn test_try_fail() {\n    match do try {\n        fail!()\n    } {\n        result::Err(()) => (),\n        result::Ok(()) => fail!()\n    }\n}\n\n#[test]\n#[should_fail]\n#[ignore(cfg(windows))]\nfn test_spawn_sched_no_threads() {\n    do spawn_sched(ManualThreads(0u)) { }\n}\n\n#[test]\nfn test_spawn_sched() {\n    let (po, ch) = stream::<()>();\n    let ch = SharedChan(ch);\n\n    fn f(i: int, ch: SharedChan<()>) {\n        let parent_sched_id = unsafe { rt::rust_get_sched_id() };\n\n        do spawn_sched(SingleThreaded) {\n            let child_sched_id = unsafe { rt::rust_get_sched_id() };\n            assert parent_sched_id != child_sched_id;\n\n            if (i == 0) {\n                ch.send(());\n            } else {\n                f(i - 1, ch.clone());\n            }\n        };\n\n    }\n    f(10, ch);\n    po.recv();\n}\n\n#[test]\nfn test_spawn_sched_childs_on_default_sched() {\n    let (po, ch) = stream();\n\n    // Assuming tests run on the default scheduler\n    let default_id = unsafe { rt::rust_get_sched_id() };\n\n    let ch = Wrapper { f: Some(ch) };\n    do spawn_sched(SingleThreaded) {\n        let parent_sched_id = unsafe { rt::rust_get_sched_id() };\n        let ch = Wrapper { f: Some(ch.f.swap_unwrap()) };\n        do spawn {\n            let ch = ch.f.swap_unwrap();\n            let child_sched_id = unsafe { rt::rust_get_sched_id() };\n            assert parent_sched_id != child_sched_id;\n            assert child_sched_id == default_id;\n            ch.send(());\n        };\n    };\n\n    po.recv();\n}\n\n#[nolink]\n#[cfg(test)]\nextern mod testrt {\n    unsafe fn rust_dbg_lock_create() -> *libc::c_void;\n    unsafe fn rust_dbg_lock_destroy(lock: *libc::c_void);\n    unsafe fn rust_dbg_lock_lock(lock: *libc::c_void);\n    unsafe fn rust_dbg_lock_unlock(lock: *libc::c_void);\n    unsafe fn rust_dbg_lock_wait(lock: *libc::c_void);\n    unsafe fn rust_dbg_lock_signal(lock: *libc::c_void);\n}\n\n#[test]\nfn test_spawn_sched_blocking() {\n    unsafe {\n\n        // Testing that a task in one scheduler can block in foreign code\n        // without affecting other schedulers\n        for iter::repeat(20u) {\n\n            let (start_po, start_ch) = stream();\n            let (fin_po, fin_ch) = stream();\n\n            let lock = testrt::rust_dbg_lock_create();\n\n            do spawn_sched(SingleThreaded) {\n                unsafe {\n                    testrt::rust_dbg_lock_lock(lock);\n\n                    start_ch.send(());\n\n                    // Block the scheduler thread\n                    testrt::rust_dbg_lock_wait(lock);\n                    testrt::rust_dbg_lock_unlock(lock);\n\n                    fin_ch.send(());\n                }\n            };\n\n            // Wait until the other task has its lock\n            start_po.recv();\n\n            fn pingpong(po: &Port<int>, ch: &Chan<int>) {\n                let mut val = 20;\n                while val > 0 {\n                    val = po.recv();\n                    ch.send(val - 1);\n                }\n            }\n\n            let (setup_po, setup_ch) = stream();\n            let (parent_po, parent_ch) = stream();\n            do spawn {\n                let (child_po, child_ch) = stream();\n                setup_ch.send(child_ch);\n                pingpong(&child_po, &parent_ch);\n            };\n\n            let child_ch = setup_po.recv();\n            child_ch.send(20);\n            pingpong(&parent_po, &child_ch);\n            testrt::rust_dbg_lock_lock(lock);\n            testrt::rust_dbg_lock_signal(lock);\n            testrt::rust_dbg_lock_unlock(lock);\n            fin_po.recv();\n            testrt::rust_dbg_lock_destroy(lock);\n        }\n    }\n}\n\n#[cfg(test)]\nfn avoid_copying_the_body(spawnfn: &fn(v: ~fn())) {\n    let (p, ch) = stream::<uint>();\n\n    let x = ~1;\n    let x_in_parent = ptr::addr_of(&(*x)) as uint;\n\n    do spawnfn || {\n        let x_in_child = ptr::addr_of(&(*x)) as uint;\n        ch.send(x_in_child);\n    }\n\n    let x_in_child = p.recv();\n    assert x_in_parent == x_in_child;\n}\n\n#[test]\nfn test_avoid_copying_the_body_spawn() {\n    avoid_copying_the_body(spawn);\n}\n\n#[test]\nfn test_avoid_copying_the_body_task_spawn() {\n    do avoid_copying_the_body |f| {\n        do task().spawn || {\n            f();\n        }\n    }\n}\n\n#[test]\nfn test_avoid_copying_the_body_try() {\n    do avoid_copying_the_body |f| {\n        do try || {\n            f()\n        };\n    }\n}\n\n#[test]\nfn test_avoid_copying_the_body_unlinked() {\n    do avoid_copying_the_body |f| {\n        do spawn_unlinked || {\n            f();\n        }\n    }\n}\n\n#[test]\nfn test_platform_thread() {\n    let (po, ch) = stream();\n    do task().sched_mode(PlatformThread).spawn {\n        ch.send(());\n    }\n    po.recv();\n}\n\n#[test]\n#[ignore(cfg(windows))]\n#[should_fail]\nfn test_unkillable() {\n    let (po, ch) = stream();\n\n    // We want to do this after failing\n    do spawn_unlinked {\n        for iter::repeat(10) { yield() }\n        ch.send(());\n    }\n\n    do spawn {\n        yield();\n        // We want to fail after the unkillable task\n        // blocks on recv\n        fail!();\n    }\n\n    unsafe {\n        do unkillable {\n            let p = ~0;\n            let pp: *uint = cast::transmute(p);\n\n            // If we are killed here then the box will leak\n            po.recv();\n\n            let _p: ~int = cast::transmute(pp);\n        }\n    }\n\n    // Now we can be killed\n    po.recv();\n}\n\n#[test]\n#[ignore(cfg(windows))]\n#[should_fail]\nfn test_unkillable_nested() {\n    let (po, ch) = comm::stream();\n\n    // We want to do this after failing\n    do spawn_unlinked || {\n        for iter::repeat(10) { yield() }\n        ch.send(());\n    }\n\n    do spawn {\n        yield();\n        // We want to fail after the unkillable task\n        // blocks on recv\n        fail!();\n    }\n\n    unsafe {\n        do unkillable {\n            do unkillable {} // Here's the difference from the previous test.\n            let p = ~0;\n            let pp: *uint = cast::transmute(p);\n\n            // If we are killed here then the box will leak\n            po.recv();\n\n            let _p: ~int = cast::transmute(pp);\n        }\n    }\n\n    // Now we can be killed\n    po.recv();\n}\n\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_atomically() {\n    unsafe { do atomically { yield(); } }\n}\n\n#[test]\nfn test_atomically2() {\n    unsafe { do atomically { } } yield(); // shouldn't fail\n}\n\n#[test] #[should_fail] #[ignore(cfg(windows))]\nfn test_atomically_nested() {\n    unsafe { do atomically { do atomically { } yield(); } }\n}\n\n#[test]\nfn test_child_doesnt_ref_parent() {\n    // If the child refcounts the parent task, this will stack overflow when\n    // climbing the task tree to dereference each ancestor. (See #1789)\n    // (well, it would if the constant were 8000+ - I lowered it to be more\n    // valgrind-friendly. try this at home, instead..!)\n    const generations: uint = 16;\n    fn child_no(x: uint) -> ~fn() {\n        return || {\n            if x < generations {\n                task::spawn(child_no(x+1));\n            }\n        }\n    }\n    task::spawn(child_no(0));\n}\n\n#[test]\nfn test_sched_thread_per_core() {\n    let (port, chan) = comm::stream();\n\n    do spawn_sched(ThreadPerCore) || {\n        unsafe {\n            let cores = rt::rust_num_threads();\n            let reported_threads = rt::rust_sched_threads();\n            assert(cores as uint == reported_threads as uint);\n            chan.send(());\n        }\n    }\n\n    port.recv();\n}\n\n#[test]\nfn test_spawn_thread_on_demand() {\n    let (port, chan) = comm::stream();\n\n    do spawn_sched(ManualThreads(2)) || {\n        unsafe {\n            let max_threads = rt::rust_sched_threads();\n            assert(max_threads as int == 2);\n            let running_threads = rt::rust_sched_current_nonlazy_threads();\n            assert(running_threads as int == 1);\n\n            let (port2, chan2) = comm::stream();\n\n            do spawn_sched(CurrentScheduler) || {\n                chan2.send(());\n            }\n\n            let running_threads2 = rt::rust_sched_current_nonlazy_threads();\n            assert(running_threads2 as int == 2);\n\n            port2.recv();\n            chan.send(());\n        }\n    }\n\n    port.recv();\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/SAS/data.sas",
    "content": "/* Example DATA step code for linguist */\n\nlibname source 'C:\\path\\to\\file'\n\ndata work.working_copy;\n\tset source.original_file.sas7bdat;\nrun;\n\ndata work.working_copy;\n\tset work.working_copy;\n\tif Purge = 1 then delete;\nrun;\n\ndata work.working_copy;\n\tset work.working_copy;\n\tif ImportantVariable = . then MissingFlag = 1;\nrun;"
  },
  {
    "path": "src/test/resources/samples/langs/SAS/detect_phi.sas",
    "content": "%macro check_dataset(dset =, obs_lim = max, eldest_age = 89) ;\n  %local i ;\n  %local inset_name ;\n  %let inset_name = &dset ;\n\n  %if %lowcase(&obs_lim) = max %then %do ;\n    %** Nothing ;\n  %end ;\n  %else %do ;\n    proc surveyselect\n      data      = &inset_name\n      out       = __sub_dset\n      method    = srs\n      sampsize  = &obs_lim SELECTALL\n      seed      = 1234567\n      noprint\n    ;\n    run;\n    %let dset = __sub_dset ;\n  %end ;\n\n  %macro check_varname(regx, msg) ;\n    create table possible_bad_vars as\n    select name, label\n    from these_vars\n    where prxmatch(compress(\"/(&regx)/i\"), name)\n    ;\n\n    %if &sqlobs > 0 %then %do ;\n      insert into phi_warnings(dset, variable, label, warning)\n      select \"&inset_name\" as dset, name, label, \"&msg\"\n      from possible_bad_vars\n      ;\n    %end ;\n\n  %mend check_varname ;\n\n  %macro check_vars_for_mrn(length_limit = 6, obs_lim = max) ;\n    %local char ;\n    %let char = 2 ;\n    proc sql noprint ;\n      select name\n      into :mrn_array separated by ' '\n      from these_vars\n      where type = &char and length ge &length_limit\n      ;\n    quit ;\n    %if &sqlobs > 0 %then %do ;\n      %put Checking these vars for possible MRN contents: &mrn_array ;\n      data __gnu ;\n        retain\n          mrn_regex_handle\n          badcount\n        ;\n        set &inset_name (obs = &obs_lim keep = &mrn_array) ;\n        if _n_ = 1 then do ;\n          mrn_regex_handle = prxparse(\"/&mrn_regex/\") ;\n          badcount = 0 ;\n        end ;\n        array p &mrn_array ;\n        do i = 1 to dim(p) ;\n          if prxmatch(mrn_regex_handle, p{i}) then do ;\n            badvar = vname(p{i}) ;\n            badvalue = p{i} ;\n            badcount = _n_ ;\n            output ;\n          end ;\n          keep badvar badvalue badcount ;\n        end ;\n      run ;\n      proc sql noprint ;\n        select compress(put(max(badcount), best.))\n        into :badcount\n        from __gnu\n        ;\n        insert into phi_warnings(dset, variable, warning)\n        select distinct \"&inset_name\", badvar, \"Could this var hold MRN values?  Contents of %trim(&badcount) records match the pattern given for MRN values.  MRNs should never move across sites.\"\n        from __gnu ;\n        drop table __gnu ;\n      quit ;\n    %end ;\n  %mend check_vars_for_mrn ;\n\n  %macro check_vars_for_oldsters(eldest_age = 89, obs_lim = max) ;\n    %local dtfmts ;\n    %let dtfmts = 'B8601DA','B8601DN','B8601DT','B8601DZ','B8601LZ','B8601TM','B8601TZ','DATE','DATEAMPM','DATETIME','DAY','DDMMYY',\n                  'DDMMYYB','DDMMYYC','DDMMYYD','DDMMYYN','DDMMYYP','DDMMYYS','DOWNAME','DTDATE','DTMONYY','DTWKDATX','DTYEAR',\n                  'DTYYQC','E8601DA','E8601DN','E8601DT','E8601DZ','E8601LZ','E8601TM','E8601TZ','HHMM','HOUR','JULDAY','JULIAN',\n                  'MMDDYY','MMDDYYB','MMDDYYC','MMDDYYD','MMDDYYN','MMDDYYP','MMDDYYS','MMSS','MMYY','MMYY','MONNAME','MONTH','MONYY',\n                  'PDJULG','PDJULI','QTR','QTRR','WEEKDATE','WEEKDATX','WEEKDAY','WEEKU','WEEKV','WEEKW','WORDDATE','WORDDATX',\n                  'YEAR','YYMM','YYMMC','YYMMD','YYMMN','YYMMP','YYMMS','YYMMDD','YYMMDDB','YYMMDDC','YYMMDDD','YYMMDDN','YYMMDDP',\n                  'YYMMDDS','YYMON','YYQ','YYQC','YYQD','YYQN','YYQP','YYQS','YYQR','YYQRC','YYQRD','YYQRN','YYQRP','YYQRS' ;\n\n    %local num ;\n    %let num = 1 ;\n\n    proc sql noprint ;\n      select name\n      into :dat_array separated by ' '\n      from these_vars\n      where type = &num and (format in (&dtfmts) or lowcase(name) like '%date%')\n      ;\n      /* added by cb to shorten the process of looking at all dates */\n      %if &sqlobs > 0 %then %do ;\n        %put Checking these vars for possible DOB contents: &dat_array ;\n        select 'min(' || trim(name) || ') as ' || name into :var_list separated by ','\n        from these_vars\n        where type = &num and (format in (&dtfmts) or lowcase(name) like '%date%')\n        ;\n        create table __gnu as\n        select &var_list from &inset_name\n        ;\n      /* end cb additions */\n    quit ;\n      data __gnu ;\n        set __gnu (obs = &obs_lim keep = &dat_array) ;\n        array d &dat_array ;\n        do i = 1 to dim(d) ;\n          if n(d{i}) then maybe_age = %calcage(bdtvar = d{i}, refdate = \"&sysdate9.\"d) ;\n          if maybe_age ge &eldest_age then do ;\n            badvar = vname(d{i}) ;\n            badvalue = d{i} ;\n            output ;\n          end ;\n          keep badvar badvalue maybe_age ;\n        end ;\n      run ;\n      proc sql outobs = 30 nowarn ;\n        insert into phi_warnings(dset, variable, warning)\n        select distinct \"&inset_name\", badvar, \"If this is a date, at least one value is \" || compress(put(maybe_age, best.)) || \" years ago, which is older than &eldest_age..  \" ||\n        \"If this date applies to a person, the record is probably PHI.\"\n        from __gnu ;\n        drop table __gnu ;\n      quit ;\n    %end ;\n    %else %do ;\n      %put No obvious date variables found in &inset_name.--skipping age checks. ;\n    %end ;\n  %mend check_vars_for_oldsters ;\n\n  proc contents noprint data = &inset_name out = these_vars ;\n  run ;\n\n  proc sql noprint ;\n    create table phi_warnings (dset char(50), variable char(256), label char(256), warning char(200)) ;\n\n    %check_varname(regx = mrn|hrn                                               , msg = %str(Name suggests this var may be an MRN, which should never move across sites.)) ;\n    %check_varname(regx = birth_date|BirthDate|DOB|BDate                        , msg = %str(Name suggests this var may be a date of birth.)) ;\n    %check_varname(regx = SSN|SocialSecurityNumber|social_security_number|socsec, msg = %str(Name suggests this var may be a social security number.)) ;\n\n    %if %symexist(locally_forbidden_varnames) %then %do ;\n      %check_varname(regx = &locally_forbidden_varnames, msg = %str(May be on the locally defined list of variables not allowed to be sent to other sites.)) ;\n    %end ;\n\n  quit ;\n\n  %check_vars_for_mrn(obs_lim = &obs_lim) ;\n  %check_vars_for_oldsters(obs_lim = &obs_lim, eldest_age = &eldest_age) ;\n\n  title3 \"WARNINGS for dataset &inset_name:\" ;\n\n  proc sql noprint ;\n    select count(*) as num_warns into :num_warns from phi_warnings ;\n\n    %if &num_warns = 0 %then %do ;\n      reset print outobs = 5 NOWARN ;\n      select \"No obvious PHI-like data elements in &inset_name--BUT PLEASE INSPECT THE CONTENTS AND PRINTs TO FOLLOW\" as x label = \"No warnings for &inset_name\"\n      from &inset_name\n      ;\n      %do i = 1 %to 5 ;\n        %put No obvious phi-like data elements in &inset_name.  BUT PLEASE INSPECT THE CONTENTS AND PRINTs CAREFULLY TO MAKE SURE OF THIS! ;\n      %end ;\n    %end ;\n    %else %do ;\n      reset print ;\n      select variable, warning from phi_warnings\n      order by variable, warning\n      ;\n      quit ;\n    %end ;\n    title3 \"Dataset &inset_name\" ;\n    proc contents data = &inset_name varnum ;\n    run ;\n  /*\n    proc print data = &inset_name (obs = 20) ;\n    run ;\n  */\n    ** TODO: make the print print out recs that trip the value warnings. ;\n    proc sql number ;\n      select *\n      from &inset_name (obs = 20)\n      ;\n    quit ;\n\n  quit ;\n\n  %RemoveDset(dset = __sub_dset) ;\n  %RemoveDset(dset = possible_bad_vars) ;\n  %RemoveDset(dset = phi_warnings) ;\n  %RemoveDset(dset = these_vars) ;\n\n%mend check_dataset ;\n\n%macro detect_phi(transfer_lib, obs_lim = max, eldest_age = 89) ;\n\n  %put ;\n  %put ;\n  %put ============================================================== ;\n  %put ;\n  %put Macro detect_phi: ;\n  %put ;\n  %put Checking all datasets found in %sysfunc(pathname(&transfer_lib)) for the following signs of PHI: ;\n  %put   - Variable names signifying sensitive items like 'MRN', 'birth_date', 'SSN' and so forth. ;\n  %if %symexist(locally_forbidden_varnames) %then %do ;\n    %put   - Variable names on the list defined in the standard macro variable locally_forbidden_varnames (here those names are: &locally_forbidden_varnames). ;\n  %end ;\n  %put   - Contents of CHARACTER variables that match the pattern given in the standard macro variable mrn_regex (here that var is &mrn_regex) ;\n  %put     Please note that numeric variables ARE NOT CHECKED FOR MRN-LIKE CONTENT. ;\n  %put   - The contents of date variables (as divined by their formats) for values that, if they were DOBs, would indicate a person older than &eldest_age years. ;\n  %put ;\n  %put THIS IS BETA SOFTWARE-PLEASE SCRUTINIZE THE RESULTS AND REPORT PROBLEMS TO pardee.r@ghc.org. ;\n  %put ;\n  %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ;\n  %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ;\n  %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ;\n  %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ;\n  %put ;\n  %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ;\n  %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ;\n  %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ;\n  %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ;\n  %put ;\n  %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ;\n  %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ;\n  %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ;\n  %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ;\n  %put ;\n  %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ;\n  %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ;\n  %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ;\n  %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ;\n  %put ;\n  %put ;\n  %put ============================================================== ;\n  %put ;\n  %put ;\n\n  title1 \"PHI-Detection Report for the datasets in %sysfunc(pathname(&transfer_lib)).\" ;\n  title2 \"please inspect all output carefully to make sure it comports with your data sharing agreement!!!\" ;\n\n  proc sql noprint ;\n    ** describe table dictionary.tables ;\n\n    select trim(libname) || '.' || memname as dset\n    into   :d1-:d999\n    from dictionary.tables\n    where libname = \"%upcase(&transfer_lib)\" AND\n          memtype = 'DATA'\n    ;\n    %local num_dsets ;\n    %let num_dsets = &sqlobs ;\n  quit ;\n\n  %local i ;\n\n  %if &num_dsets = 0 %then %do i = 1 %to 10 ;\n    %put ERROR: NO DATASETS FOUND IN &transfer_lib!!!! ;\n  %end ;\n\n  %do i = 1 %to &num_dsets ;\n    %put about to check &&d&i ;\n    %check_dataset(dset = &&d&i, obs_lim = &obs_lim, eldest_age = &eldest_age) ;\n  %end ;\n\n%mend detect_phi ;\n"
  },
  {
    "path": "src/test/resources/samples/langs/SAS/proc.sas",
    "content": "/* PROC examples for Linguist */\n\nproc surveyselect data=work.data out=work.boot method=urs reps=20000 seed=2156 sampsize=28 outhits;\n\tsamplingunit Site;\t\nrun;\n\nPROC MI data=work.boot out=work.bootmi nimpute=30 seed=5686 round = 1;\n\tBy Replicate;\n\tVAR Variable1 Variable2;\nrun;\n\nproc logistic data=work.bootmi descending;\n\tBy Replicate _Imputation_;\n\tmodel Outcome = Variable1 Variable2 / risklimits;\nrun;"
  },
  {
    "path": "src/test/resources/samples/langs/SCSS/screen.scss",
    "content": "$blue: #3bbfce;\n$margin: 16px;\n\n.content-navigation {\n  border-color: $blue;\n  color:\n    darken($blue, 9%);\n}\n\n.border {\n  padding: $margin / 2;\n  margin: $margin / 2;\n  border-color: $blue;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/SMT/bignum_lia1.smt2",
    "content": "(set-logic QF_LIA)\n(set-info :source | SMT-COMP'06 organizers |)\n(set-info :smt-lib-version 2.0)\n(set-info :category \"check\")\n(set-info :status unsat)\n(set-info :notes |This benchmark is designed to check if the DP supports bignumbers.|)\n(declare-fun x1 () Int)\n(declare-fun x2 () Int)\n(declare-fun x3 () Int)\n(declare-fun x4 () Int)\n(declare-fun x5 () Int)\n(declare-fun x6 () Int)\n(assert (and (or (>= x1 1000) (>= x1 1002)) \n             (or (>= x2 (* 1230 x1)) (>= x2 (* 1003 x1))) \n\t\t\t (or (>= x3 (* 1310 x2)) (>= x3 (* 1999 x2)))\n\t\t\t (or (>= x4 (* 4000 x3)) (>= x4 (* 8000 x3))) \n\t\t\t (or (<= x5 (* (- 4000) x4)) (<= x5 (* (- 8000) x4)))\n\t\t\t (or (>= x6 (* (- 3) x5)) (>= x6 (* (- 2) x5))) (< x6 0)))\n(check-sat)\n(exit)\n"
  },
  {
    "path": "src/test/resources/samples/langs/SMT/list4.smt2",
    "content": "(set-logic AUFLIRA)\n(set-info :source | Buggy list theorem |)\n(set-info :smt-lib-version 2.0)\n(set-info :category \"crafted\")\n(set-info :status sat)\n(declare-sort List 0)\n(declare-fun cons (Real List) List)\n(declare-fun nil () List)\n(declare-fun car (List) Real)\n(declare-fun cdr (List) List)\n(declare-fun len (List) Int)\n(assert (forall ((?x Real) (?y List)) (= (car (cons ?x ?y)) ?x)))\n(assert (forall ((?x Real) (?y List)) (= (cdr (cons ?x ?y)) ?y)))\n(assert (= (len nil) 0))\n(assert (forall ((?x Real) (?y List)) (= (len (cons ?x ?y)) (+ (len ?y) 1))))\n(declare-fun append (List List) List)\n(assert (forall ((?x Real) (?y1 List) (?y2 List)) (= (append (cons ?x ?y1) ?y2) (cons ?x (append ?y1 ?y2)))))\n(assert (not (forall ((?x Real) (?y List)) (= (append (cons ?x nil) ?y) (cons ?x ?y)))))\n(check-sat)\n(exit)\n"
  },
  {
    "path": "src/test/resources/samples/langs/SMT/queen10-1.smt2",
    "content": "(set-logic QF_IDL)\n(set-info :source |\nQueens benchmarks generated by Hyondeuk Kim in SMT-LIB format.\n|)\n(set-info :smt-lib-version 2.0)\n(set-info :category \"crafted\")\n(set-info :status sat)\n(declare-fun x0 () Int)\n(declare-fun x1 () Int)\n(declare-fun x2 () Int)\n(declare-fun x3 () Int)\n(declare-fun x4 () Int)\n(declare-fun x5 () Int)\n(declare-fun x6 () Int)\n(declare-fun x7 () Int)\n(declare-fun x8 () Int)\n(declare-fun x9 () Int)\n(declare-fun x10 () Int)\n(assert \n  (let \n    ((?v_0 (- x0 x10)) \n     (?v_1 (- x1 x10)) \n     (?v_2 (- x2 x10))\n     (?v_3 (- x3 x10))\n     (?v_4 (- x4 x10))\n     (?v_5 (- x5 x10))\n     (?v_6 (- x6 x10))\n     (?v_7 (- x7 x10))\n     (?v_8 (- x8 x10)) \n     (?v_9 (- x9 x10)) \n     (?v_10 (- x0 x1))\n     (?v_11 (- x0 x2))\n     (?v_12 (- x0 x3)) \n     (?v_13 (- x0 x4))\n     (?v_14 (- x0 x5))\n     (?v_15 (- x0 x6))\n     (?v_16 (- x0 x7))\n     (?v_17 (- x0 x8))\n     (?v_18 (- x0 x9))\n     (?v_19 (- x1 x2))\n     (?v_20 (- x1 x3))\n     (?v_21 (- x1 x4))\n     (?v_22 (- x1 x5))\n     (?v_23 (- x1 x6))\n     (?v_24 (- x1 x7)) \n     (?v_25 (- x1 x8)) \n     (?v_26 (- x1 x9))\n     (?v_27 (- x2 x3)) \n     (?v_28 (- x2 x4))\n     (?v_29 (- x2 x5))\n     (?v_30 (- x2 x6))\n     (?v_31 (- x2 x7))\n     (?v_32 (- x2 x8))\n     (?v_33 (- x2 x9))\n     (?v_34 (- x3 x4))\n     (?v_35 (- x3 x5))\n     (?v_36 (- x3 x6))\n     (?v_37 (- x3 x7))\n     (?v_38 (- x3 x8))\n     (?v_39 (- x3 x9))\n     (?v_40 (- x4 x5))\n     (?v_41 (- x4 x6))\n     (?v_42 (- x4 x7))\n     (?v_43 (- x4 x8))\n     (?v_44 (- x4 x9))\n     (?v_45 (- x5 x6))\n     (?v_46 (- x5 x7))\n     (?v_47 (- x5 x8)) \n     (?v_48 (- x5 x9))\n     (?v_49 (- x6 x7))\n     (?v_50 (- x6 x8))\n     (?v_51 (- x6 x9))\n     (?v_52 (- x7 x8))\n     (?v_53 (- x7 x9)) \n     (?v_54 (- x8 x9))) \n  (and (<= ?v_0 9) (>= ?v_0 0) (<= ?v_1 9) (>= ?v_1 0) (<= ?v_2 9) (>= ?v_2 0) \n       (<= ?v_3 9) (>= ?v_3 0) (<= ?v_4 9) (>= ?v_4 0) (<= ?v_5 9) (>= ?v_5 0) \n       (<= ?v_6 9) (>= ?v_6 0) (<= ?v_7 9) (>= ?v_7 0) (<= ?v_8 9) (>= ?v_8 0) \n       (<= ?v_9 9) (>= ?v_9 0)\n       (not (= x0 x1)) (not (= x0 x2)) (not (= x0 x3)) (not (= x0 x4))\n       (not (= x0 x5)) (not (= x0 x6)) (not (= x0 x7)) (not (= x0 x8)) \n       (not (= x0 x9)) (not (= x1 x2)) (not (= x1 x3)) (not (= x1 x4)) \n       (not (= x1 x5)) (not (= x1 x6)) (not (= x1 x7)) (not (= x1 x8)) \n       (not (= x1 x9)) (not (= x2 x3)) (not (= x2 x4)) (not (= x2 x5)) \n       (not (= x2 x6)) (not (= x2 x7)) (not (= x2 x8)) (not (= x2 x9))\n       (not (= x3 x4)) (not (= x3 x5)) (not (= x3 x6)) (not (= x3 x7)) \n       (not (= x3 x8)) (not (= x3 x9)) (not (= x4 x5)) (not (= x4 x6)) \n       (not (= x4 x7)) (not (= x4 x8)) (not (= x4 x9)) (not (= x5 x6)) \n       (not (= x5 x7)) (not (= x5 x8)) (not (= x5 x9)) (not (= x6 x7)) \n       (not (= x6 x8)) (not (= x6 x9)) (not (= x7 x8)) (not (= x7 x9)) \n       (not (= x8 x9)) \n       (not (= ?v_10 1)) (not (= ?v_10 (- 1))) (not (= ?v_11 2)) \n       (not (= ?v_11 (- 2))) (not (= ?v_12 3)) (not (= ?v_12 (- 3))) \n       (not (= ?v_13 4)) (not (= ?v_13 (- 4))) (not (= ?v_14 5)) \n       (not (= ?v_14 (- 5))) (not (= ?v_15 6)) (not (= ?v_15 (- 6)))\n       (not (= ?v_16 7)) (not (= ?v_16 (- 7))) (not (= ?v_17 8)) \n       (not (= ?v_17 (- 8))) (not (= ?v_18 9)) (not (= ?v_18 (- 9))) \n       (not (= ?v_19 1)) (not (= ?v_19 (- 1))) (not (= ?v_20 2)) \n       (not (= ?v_20 (- 2))) (not (= ?v_21 3)) (not (= ?v_21 (- 3))) \n       (not (= ?v_22 4)) (not (= ?v_22 (- 4))) (not (= ?v_23 5)) \n       (not (= ?v_23 (- 5))) (not (= ?v_24 6)) (not (= ?v_24 (- 6))) \n       (not (= ?v_25 7)) (not (= ?v_25 (- 7))) (not (= ?v_26 8)) \n       (not (= ?v_26 (- 8))) (not (= ?v_27 1)) (not (= ?v_27 (- 1))) \n       (not (= ?v_28 2)) (not (= ?v_28 (- 2))) (not (= ?v_29 3)) \n       (not (= ?v_29 (- 3))) (not (= ?v_30 4)) (not (= ?v_30 (- 4))) \n       (not (= ?v_31 5)) (not (= ?v_31 (- 5))) (not (= ?v_32 6))\n       (not (= ?v_32 (- 6))) (not (= ?v_33 7)) (not (= ?v_33 (- 7))) \n       (not (= ?v_34 1)) (not (= ?v_34 (- 1))) (not (= ?v_35 2)) \n       (not (= ?v_35 (- 2))) (not (= ?v_36 3)) (not (= ?v_36 (- 3)))\n       (not (= ?v_37 4)) (not (= ?v_37 (- 4))) (not (= ?v_38 5)) \n       (not (= ?v_38 (- 5))) (not (= ?v_39 6)) (not (= ?v_39 (- 6))) \n       (not (= ?v_40 1)) (not (= ?v_40 (- 1))) (not (= ?v_41 2)) \n       (not (= ?v_41 (- 2))) (not (= ?v_42 3)) (not (= ?v_42 (- 3)))\n       (not (= ?v_43 4)) (not (= ?v_43 (- 4))) (not (= ?v_44 5))\n       (not (= ?v_44 (- 5))) (not (= ?v_45 1)) (not (= ?v_45 (- 1))) \n       (not (= ?v_46 2)) (not (= ?v_46 (- 2))) (not (= ?v_47 3)) \n       (not (= ?v_47 (- 3))) (not (= ?v_48 4)) (not (= ?v_48 (- 4))) \n       (not (= ?v_49 1)) (not (= ?v_49 (- 1))) (not (= ?v_50 2)) \n       (not (= ?v_50 (- 2))) (not (= ?v_51 3)) (not (= ?v_51 (- 3))) \n       (not (= ?v_52 1)) (not (= ?v_52 (- 1))) (not (= ?v_53 2)) \n       (not (= ?v_53 (- 2))) (not (= ?v_54 1)) (not (= ?v_54 (- 1))))))\n(check-sat)\n(exit)\n"
  },
  {
    "path": "src/test/resources/samples/langs/SMT/shufflevector.smt",
    "content": "(set-logic QF_ABV)\n(define-sort Address () (_ BitVec 64))\n(define-sort Byte () (_ BitVec 8))\n(define-sort Mem () (Array Address Byte))\n\n(define-sort I8 () (_ BitVec 8))\n(define-sort I16 () (_ BitVec 16))\n(define-sort I32 () (_ BitVec 32))\n(define-sort I64 () (_ BitVec 64))\n(define-sort I128 () (_ BitVec 128))\n\n\n;;\n;;constants\n;;\n(define-fun zero  () Address (_ bv0 64))\n(define-fun one   () Address (_ bv1 64))\n(define-fun two   () Address (_ bv2 64))\n(define-fun three () Address (_ bv3 64))\n(define-fun four  () Address (_ bv4 64))\n(define-fun five  () Address (_ bv5 64))\n(define-fun six   () Address (_ bv6 64))\n(define-fun seven () Address (_ bv7 64))\n(define-fun eight () Address (_ bv8 64))\n\n\n;;\n;; Write a little endian 1 bit value (8 bit aligned) at address x in mem\n;;\n(define-fun write1 ((mem Mem) (x Address) (v Bool)) Mem\n  (store mem x (ite v #x01 #x00)))\n\n;;\n;; Write a little endian 8bit value at address x in mem\n;;\n(define-fun write8 ((mem Mem) (x Address) (v I8)) Mem\n  (store mem x v))\n\n;;\n;; Write a little endian 16bit value at address x in mem\n;;\n(define-fun write16 ((mem Mem) (x Address) (v I16)) Mem\n  (let ((b0 ((_ extract 7 0) v))\n\t(b1 ((_ extract 15 8) v)))\n    (store (store mem x b0) (bvadd x one) b1)))\n\n;;\n;; Write a little endian 32bit value at address x in mem\n;;\n(define-fun write32 ((mem Mem) (x Address) (v I32)) Mem\n  (let ((b0 ((_ extract 7 0) v))\n\t(b1 ((_ extract 15 8) v))\n\t(b2 ((_ extract 23 16) v))\n\t(b3 ((_ extract 31 24) v)))\n    (store (store (store (store mem x b0) (bvadd x one) b1) (bvadd x two) b2) (bvadd x three) b3)))\n\n;;\n;; Write a little endian 64bit value at address x in mem\n;;\n(define-fun write64 ((mem Mem) (x Address) (v I64)) Mem\n  (let ((b0 ((_ extract 31 0) v))\n\t(b1 ((_ extract 63 32) v)))\n    (write32 (write32 mem x b0) (bvadd x four) b1)))\n\n;;\n;; Write a little endian 128bit value at address x in mem\n;;\n(define-fun write128 ((mem Mem) (x Address) (v I128)) Mem\n  (let ((b0 ((_ extract 63 0) v))\n\t(b1 ((_ extract 127 64) v)))\n    (write64 (write64 mem x b0) (bvadd x eight) b1)))\n\n\n;;\n;; Read a little endian 1 bit value (8 bit aligned) at address x in mem\n;; - returns a Boolean: true if what's stored at address x is non-zero\n;;\n(define-fun read1 ((mem Mem) (x Address)) Bool\n   (not (= (select mem x) #x00)))\n\n;;\n;; Read a little endian 8bit value at address x in mem\n;;\n(define-fun read8 ((mem Mem) (x Address)) I8\n  (select mem x))\n\n;;\n;; Read a little endian 16bit value at address x in mem\n;;\n(define-fun read16 ((mem Mem) (x Address)) I16\n  (let ((b0 (select mem x))\n\t(b1 (select mem (bvadd x one))))\n    (concat b1 b0))) \n\n;;\n;; Read a little endian 32bit value at address x in mem\n;;\n(define-fun read32 ((mem Mem) (x Address)) I32\n  (let ((b0 (select mem x))\n\t(b1 (select mem (bvadd x one)))\n\t(b2 (select mem (bvadd x two)))\n\t(b3 (select mem (bvadd x three))))\n    (concat b3 (concat b2 (concat b1 b0)))))\n\n;;\n;; Read a little endian 64bit value at address x in mem\n;;\n(define-fun read64 ((mem Mem) (x Address)) I64\n  (let ((b0 (read32 mem x))\n        (b1 (read32 mem (bvadd x four))))\n    (concat b1 b0)))\n\n;;\n;; Read a little endian 128bit value at address x in mem\n;;\n(define-fun read128 ((mem Mem) (x Address)) I128\n  (let ((b0 (read64 mem x))\n        (b1 (read64 mem (bvadd x eight))))\n    (concat b1 b0)))\n\n\n;;\n;; Vectors of (2^1) int4 elements\n;;\n(define-sort vector_1_4 () (Array (_ BitVec 1) (_ BitVec 4)))\n\n(declare-fun vundef_1_4 () vector_1_4)\n\n\n;;\n;; Vectors of (2^1) int8 elements\n;;\n(define-sort vector_1_8 () (Array (_ BitVec 1) (_ BitVec 8)))\n\n(declare-fun vundef_1_8 () vector_1_8)\n\n\n;;\n;; Vectors of (2^1) int16 elements\n;;\n(define-sort vector_1_16 () (Array (_ BitVec 1) (_ BitVec 16)))\n\n(declare-fun vundef_1_16 () vector_1_16)\n\n\n;;\n;; Vectors of (2^1) int32 elements\n;;\n(define-sort vector_1_32 () (Array (_ BitVec 1) (_ BitVec 32)))\n\n(declare-fun vundef_1_32 () vector_1_32)\n\n\n;;\n;; Vectors of (2^1) int64 elements\n;;\n(define-sort vector_1_64 () (Array (_ BitVec 1) (_ BitVec 64)))\n\n(declare-fun vundef_1_64 () vector_1_64)\n\n\n;;\n;; Vectors of (2^2) int4 elements\n;;\n(define-sort vector_2_4 () (Array (_ BitVec 2) (_ BitVec 4)))\n\n(declare-fun vundef_2_4 () vector_2_4)\n\n\n;;\n;; Vectors of (2^2) int8 elements\n;;\n(define-sort vector_2_8 () (Array (_ BitVec 2) (_ BitVec 8)))\n\n(declare-fun vundef_2_8 () vector_2_8)\n\n\n;;\n;; Vectors of (2^2) int16 elements\n;;\n(define-sort vector_2_16 () (Array (_ BitVec 2) (_ BitVec 16)))\n\n(declare-fun vundef_2_16 () vector_2_16)\n\n\n;;\n;; Vectors of (2^2) int32 elements\n;;\n(define-sort vector_2_32 () (Array (_ BitVec 2) (_ BitVec 32)))\n\n(declare-fun vundef_2_32 () vector_2_32)\n\n\n;;\n;; Vectors of (2^2) int64 elements\n;;\n(define-sort vector_2_64 () (Array (_ BitVec 2) (_ BitVec 64)))\n\n(declare-fun vundef_2_64 () vector_2_64)\n\n\n;;\n;; Vectors of (2^3) int4 elements\n;;\n(define-sort vector_3_4 () (Array (_ BitVec 3) (_ BitVec 4)))\n\n(declare-fun vundef_3_4 () vector_3_4)\n\n\n;;\n;; Vectors of (2^3) int8 elements\n;;\n(define-sort vector_3_8 () (Array (_ BitVec 3) (_ BitVec 8)))\n\n(declare-fun vundef_3_8 () vector_3_8)\n\n\n;;\n;; Vectors of (2^3) int16 elements\n;;\n(define-sort vector_3_16 () (Array (_ BitVec 3) (_ BitVec 16)))\n\n(declare-fun vundef_3_16 () vector_3_16)\n\n\n;;\n;; Vectors of (2^3) int32 elements\n;;\n(define-sort vector_3_32 () (Array (_ BitVec 3) (_ BitVec 32)))\n\n(declare-fun vundef_3_32 () vector_3_32)\n\n\n;;\n;; Vectors of (2^3) int64 elements\n;;\n(define-sort vector_3_64 () (Array (_ BitVec 3) (_ BitVec 64)))\n\n(declare-fun vundef_3_64 () vector_3_64)\n\n;; Special case where we use Bool rather than bitvectors of size 1 \n\n(define-sort vector_1_1 () (Array (_ BitVec 1) Bool))\n\n(declare-fun vundef_1_1 () vector_1_1)\n\n(define-fun vmake_1_1 ((x0 Bool) (x1 Bool)) vector_1_1\n   (store (store vundef_1_1 #b0 x0) #b1 x1))\n\n(define-sort vector_2_1 () (Array (_ BitVec 2) Bool))\n\n(declare-fun vundef_2_1 () vector_2_1)\n\n(define-fun vmake_2_1 \n  ((x0 Bool) (x1 Bool) (x2 Bool) (x3 Bool)) vector_2_1\n   (store (store (store (store vundef_2_1 #b00 x0) #b01 x1) #b10 x2) #b11 x3))\n\n(define-sort vector_3_1 () (Array (_ BitVec 3) Bool))\n\n(declare-fun vundef_3_1 () vector_3_1)\n\n(define-fun vmake_3_1 \n  ((x0 Bool) (x1 Bool) (x2 Bool) (x3 Bool) (x4 Bool) (x5 Bool) (x6 Bool) (x7 Bool)) vector_3_1\n   (store (store (store (store (store (store (store (store vundef_3_1 #b000 x0) #b001 x1) #b010 x2) #b011 x3) #b100 x4) #b101 x5) #b110 x6) #b111 x7))\n\n\n;;\n;; Vectors of (2^1) i.e. two int4 elements\n;;\n(define-fun vmake_1_4 ((x0 (_ BitVec 4)) (x1 (_ BitVec 4))) vector_1_4\n   (store (store vundef_1_4 #b0 x0) #b1 x1))\n\n;;\n;; Vectors of (2^2) i.e. four int4 elements\n;;\n(define-fun vmake_2_4 \n  ((x0 (_ BitVec 4)) (x1 (_ BitVec 4)) (x2 (_ BitVec 4)) (x3 (_ BitVec 4))) vector_2_4\n   (store (store (store (store vundef_2_4 #b00 x0) #b01 x1) #b10 x2) #b11 x3))\n\n;;\n;; Vectors of (2^3) i.e. eight int4 elements\n;;\n(define-fun vmake_3_4 \n  ((x0 (_ BitVec 4)) (x1 (_ BitVec 4)) (x2 (_ BitVec 4)) (x3 (_ BitVec 4))(x4 (_ BitVec 4)) (x5 (_ BitVec 4)) (x6 (_ BitVec 4)) (x7 (_ BitVec 4))) vector_3_4\n   (store (store (store (store (store (store (store (store vundef_3_4 #b000 x0) #b001 x1) #b010 x2) #b011 x3) #b100 x4) #b101 x5) #b110 x6) #b111 x7))\n\n\n;; zero vectors with int4 elements\n\n (define-fun vzero_1_4 () vector_1_4 (vmake_1_4 (_ bv0 4) (_ bv0 4)))\n\n (define-fun vzero_2_4 () vector_2_4 (vmake_2_4 (_ bv0 4) (_ bv0 4) (_ bv0 4) (_ bv0 4)))\n \n (define-fun vzero_3_4 () vector_3_4 (vmake_3_4 (_ bv0 4) (_ bv0 4) (_ bv0 4) (_ bv0 4) (_ bv0 4) (_ bv0 4) (_ bv0 4) (_ bv0 4)))\n \n\n;;\n;; Vectors of (2^1) i.e. two int8 elements\n;;\n(define-fun vmake_1_8 ((x0 (_ BitVec 8)) (x1 (_ BitVec 8))) vector_1_8\n   (store (store vundef_1_8 #b0 x0) #b1 x1))\n\n;;\n;; Vectors of (2^2) i.e. four int8 elements\n;;\n(define-fun vmake_2_8 \n  ((x0 (_ BitVec 8)) (x1 (_ BitVec 8)) (x2 (_ BitVec 8)) (x3 (_ BitVec 8))) vector_2_8\n   (store (store (store (store vundef_2_8 #b00 x0) #b01 x1) #b10 x2) #b11 x3))\n\n;;\n;; Vectors of (2^3) i.e. eight int8 elements\n;;\n(define-fun vmake_3_8 \n  ((x0 (_ BitVec 8)) (x1 (_ BitVec 8)) (x2 (_ BitVec 8)) (x3 (_ BitVec 8))(x4 (_ BitVec 8)) (x5 (_ BitVec 8)) (x6 (_ BitVec 8)) (x7 (_ BitVec 8))) vector_3_8\n   (store (store (store (store (store (store (store (store vundef_3_8 #b000 x0) #b001 x1) #b010 x2) #b011 x3) #b100 x4) #b101 x5) #b110 x6) #b111 x7))\n\n\n;; zero vectors with int8 elements\n\n (define-fun vzero_1_8 () vector_1_8 (vmake_1_8 (_ bv0 8) (_ bv0 8)))\n\n (define-fun vzero_2_8 () vector_2_8 (vmake_2_8 (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8)))\n \n (define-fun vzero_3_8 () vector_3_8 (vmake_3_8 (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8)))\n \n\n;;\n;; Vectors of (2^1) i.e. two int16 elements\n;;\n(define-fun vmake_1_16 ((x0 (_ BitVec 16)) (x1 (_ BitVec 16))) vector_1_16\n   (store (store vundef_1_16 #b0 x0) #b1 x1))\n\n;;\n;; Vectors of (2^2) i.e. four int16 elements\n;;\n(define-fun vmake_2_16 \n  ((x0 (_ BitVec 16)) (x1 (_ BitVec 16)) (x2 (_ BitVec 16)) (x3 (_ BitVec 16))) vector_2_16\n   (store (store (store (store vundef_2_16 #b00 x0) #b01 x1) #b10 x2) #b11 x3))\n\n;;\n;; Vectors of (2^3) i.e. eight int16 elements\n;;\n(define-fun vmake_3_16 \n  ((x0 (_ BitVec 16)) (x1 (_ BitVec 16)) (x2 (_ BitVec 16)) (x3 (_ BitVec 16))(x4 (_ BitVec 16)) (x5 (_ BitVec 16)) (x6 (_ BitVec 16)) (x7 (_ BitVec 16))) vector_3_16\n   (store (store (store (store (store (store (store (store vundef_3_16 #b000 x0) #b001 x1) #b010 x2) #b011 x3) #b100 x4) #b101 x5) #b110 x6) #b111 x7))\n\n\n;; zero vectors with int16 elements\n\n (define-fun vzero_1_16 () vector_1_16 (vmake_1_16 (_ bv0 16) (_ bv0 16)))\n\n (define-fun vzero_2_16 () vector_2_16 (vmake_2_16 (_ bv0 16) (_ bv0 16) (_ bv0 16) (_ bv0 16)))\n \n (define-fun vzero_3_16 () vector_3_16 (vmake_3_16 (_ bv0 16) (_ bv0 16) (_ bv0 16) (_ bv0 16) (_ bv0 16) (_ bv0 16) (_ bv0 16) (_ bv0 16)))\n \n\n;;\n;; Vectors of (2^1) i.e. two int32 elements\n;;\n(define-fun vmake_1_32 ((x0 (_ BitVec 32)) (x1 (_ BitVec 32))) vector_1_32\n   (store (store vundef_1_32 #b0 x0) #b1 x1))\n\n;;\n;; Vectors of (2^2) i.e. four int32 elements\n;;\n(define-fun vmake_2_32 \n  ((x0 (_ BitVec 32)) (x1 (_ BitVec 32)) (x2 (_ BitVec 32)) (x3 (_ BitVec 32))) vector_2_32\n   (store (store (store (store vundef_2_32 #b00 x0) #b01 x1) #b10 x2) #b11 x3))\n\n;;\n;; Vectors of (2^3) i.e. eight int32 elements\n;;\n(define-fun vmake_3_32 \n  ((x0 (_ BitVec 32)) (x1 (_ BitVec 32)) (x2 (_ BitVec 32)) (x3 (_ BitVec 32))(x4 (_ BitVec 32)) (x5 (_ BitVec 32)) (x6 (_ BitVec 32)) (x7 (_ BitVec 32))) vector_3_32\n   (store (store (store (store (store (store (store (store vundef_3_32 #b000 x0) #b001 x1) #b010 x2) #b011 x3) #b100 x4) #b101 x5) #b110 x6) #b111 x7))\n\n\n;; zero vectors with int32 elements\n\n (define-fun vzero_1_32 () vector_1_32 (vmake_1_32 (_ bv0 32) (_ bv0 32)))\n\n (define-fun vzero_2_32 () vector_2_32 (vmake_2_32 (_ bv0 32) (_ bv0 32) (_ bv0 32) (_ bv0 32)))\n \n (define-fun vzero_3_32 () vector_3_32 (vmake_3_32 (_ bv0 32) (_ bv0 32) (_ bv0 32) (_ bv0 32) (_ bv0 32) (_ bv0 32) (_ bv0 32) (_ bv0 32)))\n \n\n;;\n;; Vectors of (2^1) i.e. two int64 elements\n;;\n(define-fun vmake_1_64 ((x0 (_ BitVec 64)) (x1 (_ BitVec 64))) vector_1_64\n   (store (store vundef_1_64 #b0 x0) #b1 x1))\n\n;;\n;; Vectors of (2^2) i.e. four int64 elements\n;;\n(define-fun vmake_2_64 \n  ((x0 (_ BitVec 64)) (x1 (_ BitVec 64)) (x2 (_ BitVec 64)) (x3 (_ BitVec 64))) vector_2_64\n   (store (store (store (store vundef_2_64 #b00 x0) #b01 x1) #b10 x2) #b11 x3))\n\n;;\n;; Vectors of (2^3) i.e. eight int64 elements\n;;\n(define-fun vmake_3_64 \n  ((x0 (_ BitVec 64)) (x1 (_ BitVec 64)) (x2 (_ BitVec 64)) (x3 (_ BitVec 64))(x4 (_ BitVec 64)) (x5 (_ BitVec 64)) (x6 (_ BitVec 64)) (x7 (_ BitVec 64))) vector_3_64\n   (store (store (store (store (store (store (store (store vundef_3_64 #b000 x0) #b001 x1) #b010 x2) #b011 x3) #b100 x4) #b101 x5) #b110 x6) #b111 x7))\n\n\n;; zero vectors with int64 elements\n\n (define-fun vzero_1_64 () vector_1_64 (vmake_1_64 (_ bv0 64) (_ bv0 64)))\n\n (define-fun vzero_2_64 () vector_2_64 (vmake_2_64 (_ bv0 64) (_ bv0 64) (_ bv0 64) (_ bv0 64)))\n \n (define-fun vzero_3_64 () vector_3_64 (vmake_3_64 (_ bv0 64) (_ bv0 64) (_ bv0 64) (_ bv0 64) (_ bv0 64) (_ bv0 64) (_ bv0 64) (_ bv0 64)))\n \n\n(define-fun vbvadd_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvadd (select x #b0) (select y #b0)))\n         (z1 (bvadd (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvadd_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvadd (select x #b0) (select y #b0)))\n         (z1 (bvadd (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvadd_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvadd (select x #b0) (select y #b0)))\n         (z1 (bvadd (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvadd_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvadd (select x #b0) (select y #b0)))\n         (z1 (bvadd (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvsub_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvsub (select x #b0) (select y #b0)))\n         (z1 (bvsub (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvsub_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvsub (select x #b0) (select y #b0)))\n         (z1 (bvsub (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvsub_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvsub (select x #b0) (select y #b0)))\n         (z1 (bvsub (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvsub_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvsub (select x #b0) (select y #b0)))\n         (z1 (bvsub (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvmul_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvmul (select x #b0) (select y #b0)))\n         (z1 (bvmul (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvmul_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvmul (select x #b0) (select y #b0)))\n         (z1 (bvmul (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvmul_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvmul (select x #b0) (select y #b0)))\n         (z1 (bvmul (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvmul_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvmul (select x #b0) (select y #b0)))\n         (z1 (bvmul (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvshl_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvshl (select x #b0) (select y #b0)))\n         (z1 (bvshl (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvshl_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvshl (select x #b0) (select y #b0)))\n         (z1 (bvshl (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvshl_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvshl (select x #b0) (select y #b0)))\n         (z1 (bvshl (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvshl_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvshl (select x #b0) (select y #b0)))\n         (z1 (bvshl (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvsdiv_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvsdiv (select x #b0) (select y #b0)))\n         (z1 (bvsdiv (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvsdiv_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvsdiv (select x #b0) (select y #b0)))\n         (z1 (bvsdiv (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvsdiv_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvsdiv (select x #b0) (select y #b0)))\n         (z1 (bvsdiv (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvsdiv_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvsdiv (select x #b0) (select y #b0)))\n         (z1 (bvsdiv (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvudiv_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvudiv (select x #b0) (select y #b0)))\n         (z1 (bvudiv (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvudiv_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvudiv (select x #b0) (select y #b0)))\n         (z1 (bvudiv (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvudiv_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvudiv (select x #b0) (select y #b0)))\n         (z1 (bvudiv (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvudiv_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvudiv (select x #b0) (select y #b0)))\n         (z1 (bvudiv (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvlshr_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvlshr (select x #b0) (select y #b0)))\n         (z1 (bvlshr (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvlshr_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvlshr (select x #b0) (select y #b0)))\n         (z1 (bvlshr (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvlshr_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvlshr (select x #b0) (select y #b0)))\n         (z1 (bvlshr (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvlshr_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvlshr (select x #b0) (select y #b0)))\n         (z1 (bvlshr (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvashr_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvashr (select x #b0) (select y #b0)))\n         (z1 (bvashr (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvashr_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvashr (select x #b0) (select y #b0)))\n         (z1 (bvashr (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvashr_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvashr (select x #b0) (select y #b0)))\n         (z1 (bvashr (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvashr_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvashr (select x #b0) (select y #b0)))\n         (z1 (bvashr (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvurem_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvurem (select x #b0) (select y #b0)))\n         (z1 (bvurem (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvurem_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvurem (select x #b0) (select y #b0)))\n         (z1 (bvurem (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvurem_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvurem (select x #b0) (select y #b0)))\n         (z1 (bvurem (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvurem_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvurem (select x #b0) (select y #b0)))\n         (z1 (bvurem (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvsrem_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvsrem (select x #b0) (select y #b0)))\n         (z1 (bvsrem (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvsrem_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvsrem (select x #b0) (select y #b0)))\n         (z1 (bvsrem (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvsrem_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvsrem (select x #b0) (select y #b0)))\n         (z1 (bvsrem (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvsrem_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvsrem (select x #b0) (select y #b0)))\n         (z1 (bvsrem (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvand_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvand (select x #b0) (select y #b0)))\n         (z1 (bvand (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvand_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvand (select x #b0) (select y #b0)))\n         (z1 (bvand (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvand_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvand (select x #b0) (select y #b0)))\n         (z1 (bvand (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvand_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvand (select x #b0) (select y #b0)))\n         (z1 (bvand (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvor_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvor (select x #b0) (select y #b0)))\n         (z1 (bvor (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvor_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvor (select x #b0) (select y #b0)))\n         (z1 (bvor (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvor_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvor (select x #b0) (select y #b0)))\n         (z1 (bvor (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvor_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvor (select x #b0) (select y #b0)))\n         (z1 (bvor (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n(define-fun vbvxor_1_8 ((x vector_1_8) (y vector_1_8)) vector_1_8\n   (let ((z0 (bvxor (select x #b0) (select y #b0)))\n         (z1 (bvxor (select x #b1) (select y #b1))))\n      (vmake_1_8 z0 z1)))\n\n(define-fun vbvxor_1_16 ((x vector_1_16) (y vector_1_16)) vector_1_16\n   (let ((z0 (bvxor (select x #b0) (select y #b0)))\n         (z1 (bvxor (select x #b1) (select y #b1))))\n      (vmake_1_16 z0 z1)))\n\n(define-fun vbvxor_1_32 ((x vector_1_32) (y vector_1_32)) vector_1_32\n   (let ((z0 (bvxor (select x #b0) (select y #b0)))\n         (z1 (bvxor (select x #b1) (select y #b1))))\n      (vmake_1_32 z0 z1)))\n\n(define-fun vbvxor_1_64 ((x vector_1_64) (y vector_1_64)) vector_1_64\n   (let ((z0 (bvxor (select x #b0) (select y #b0)))\n         (z1 (bvxor (select x #b1) (select y #b1))))\n      (vmake_1_64 z0 z1)))\n\n (define-fun vbvadd_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvadd (select x #b00) (select y #b00)))\n         (z1 (bvadd (select x #b01) (select y #b01)))\n         (z2 (bvadd (select x #b10) (select y #b10)))\n         (z3 (bvadd (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvadd_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvadd (select x #b00) (select y #b00)))\n         (z1 (bvadd (select x #b01) (select y #b01)))\n         (z2 (bvadd (select x #b10) (select y #b10)))\n         (z3 (bvadd (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvadd_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvadd (select x #b00) (select y #b00)))\n         (z1 (bvadd (select x #b01) (select y #b01)))\n         (z2 (bvadd (select x #b10) (select y #b10)))\n         (z3 (bvadd (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvadd_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvadd (select x #b00) (select y #b00)))\n         (z1 (bvadd (select x #b01) (select y #b01)))\n         (z2 (bvadd (select x #b10) (select y #b10)))\n         (z3 (bvadd (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvsub_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvsub (select x #b00) (select y #b00)))\n         (z1 (bvsub (select x #b01) (select y #b01)))\n         (z2 (bvsub (select x #b10) (select y #b10)))\n         (z3 (bvsub (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvsub_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvsub (select x #b00) (select y #b00)))\n         (z1 (bvsub (select x #b01) (select y #b01)))\n         (z2 (bvsub (select x #b10) (select y #b10)))\n         (z3 (bvsub (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvsub_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvsub (select x #b00) (select y #b00)))\n         (z1 (bvsub (select x #b01) (select y #b01)))\n         (z2 (bvsub (select x #b10) (select y #b10)))\n         (z3 (bvsub (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvsub_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvsub (select x #b00) (select y #b00)))\n         (z1 (bvsub (select x #b01) (select y #b01)))\n         (z2 (bvsub (select x #b10) (select y #b10)))\n         (z3 (bvsub (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvmul_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvmul (select x #b00) (select y #b00)))\n         (z1 (bvmul (select x #b01) (select y #b01)))\n         (z2 (bvmul (select x #b10) (select y #b10)))\n         (z3 (bvmul (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvmul_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvmul (select x #b00) (select y #b00)))\n         (z1 (bvmul (select x #b01) (select y #b01)))\n         (z2 (bvmul (select x #b10) (select y #b10)))\n         (z3 (bvmul (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvmul_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvmul (select x #b00) (select y #b00)))\n         (z1 (bvmul (select x #b01) (select y #b01)))\n         (z2 (bvmul (select x #b10) (select y #b10)))\n         (z3 (bvmul (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvmul_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvmul (select x #b00) (select y #b00)))\n         (z1 (bvmul (select x #b01) (select y #b01)))\n         (z2 (bvmul (select x #b10) (select y #b10)))\n         (z3 (bvmul (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvshl_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvshl (select x #b00) (select y #b00)))\n         (z1 (bvshl (select x #b01) (select y #b01)))\n         (z2 (bvshl (select x #b10) (select y #b10)))\n         (z3 (bvshl (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvshl_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvshl (select x #b00) (select y #b00)))\n         (z1 (bvshl (select x #b01) (select y #b01)))\n         (z2 (bvshl (select x #b10) (select y #b10)))\n         (z3 (bvshl (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvshl_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvshl (select x #b00) (select y #b00)))\n         (z1 (bvshl (select x #b01) (select y #b01)))\n         (z2 (bvshl (select x #b10) (select y #b10)))\n         (z3 (bvshl (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvshl_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvshl (select x #b00) (select y #b00)))\n         (z1 (bvshl (select x #b01) (select y #b01)))\n         (z2 (bvshl (select x #b10) (select y #b10)))\n         (z3 (bvshl (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvsdiv_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvsdiv (select x #b00) (select y #b00)))\n         (z1 (bvsdiv (select x #b01) (select y #b01)))\n         (z2 (bvsdiv (select x #b10) (select y #b10)))\n         (z3 (bvsdiv (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvsdiv_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvsdiv (select x #b00) (select y #b00)))\n         (z1 (bvsdiv (select x #b01) (select y #b01)))\n         (z2 (bvsdiv (select x #b10) (select y #b10)))\n         (z3 (bvsdiv (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvsdiv_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvsdiv (select x #b00) (select y #b00)))\n         (z1 (bvsdiv (select x #b01) (select y #b01)))\n         (z2 (bvsdiv (select x #b10) (select y #b10)))\n         (z3 (bvsdiv (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvsdiv_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvsdiv (select x #b00) (select y #b00)))\n         (z1 (bvsdiv (select x #b01) (select y #b01)))\n         (z2 (bvsdiv (select x #b10) (select y #b10)))\n         (z3 (bvsdiv (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvudiv_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvudiv (select x #b00) (select y #b00)))\n         (z1 (bvudiv (select x #b01) (select y #b01)))\n         (z2 (bvudiv (select x #b10) (select y #b10)))\n         (z3 (bvudiv (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvudiv_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvudiv (select x #b00) (select y #b00)))\n         (z1 (bvudiv (select x #b01) (select y #b01)))\n         (z2 (bvudiv (select x #b10) (select y #b10)))\n         (z3 (bvudiv (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvudiv_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvudiv (select x #b00) (select y #b00)))\n         (z1 (bvudiv (select x #b01) (select y #b01)))\n         (z2 (bvudiv (select x #b10) (select y #b10)))\n         (z3 (bvudiv (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvudiv_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvudiv (select x #b00) (select y #b00)))\n         (z1 (bvudiv (select x #b01) (select y #b01)))\n         (z2 (bvudiv (select x #b10) (select y #b10)))\n         (z3 (bvudiv (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvlshr_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvlshr (select x #b00) (select y #b00)))\n         (z1 (bvlshr (select x #b01) (select y #b01)))\n         (z2 (bvlshr (select x #b10) (select y #b10)))\n         (z3 (bvlshr (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvlshr_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvlshr (select x #b00) (select y #b00)))\n         (z1 (bvlshr (select x #b01) (select y #b01)))\n         (z2 (bvlshr (select x #b10) (select y #b10)))\n         (z3 (bvlshr (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvlshr_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvlshr (select x #b00) (select y #b00)))\n         (z1 (bvlshr (select x #b01) (select y #b01)))\n         (z2 (bvlshr (select x #b10) (select y #b10)))\n         (z3 (bvlshr (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvlshr_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvlshr (select x #b00) (select y #b00)))\n         (z1 (bvlshr (select x #b01) (select y #b01)))\n         (z2 (bvlshr (select x #b10) (select y #b10)))\n         (z3 (bvlshr (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvashr_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvashr (select x #b00) (select y #b00)))\n         (z1 (bvashr (select x #b01) (select y #b01)))\n         (z2 (bvashr (select x #b10) (select y #b10)))\n         (z3 (bvashr (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvashr_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvashr (select x #b00) (select y #b00)))\n         (z1 (bvashr (select x #b01) (select y #b01)))\n         (z2 (bvashr (select x #b10) (select y #b10)))\n         (z3 (bvashr (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvashr_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvashr (select x #b00) (select y #b00)))\n         (z1 (bvashr (select x #b01) (select y #b01)))\n         (z2 (bvashr (select x #b10) (select y #b10)))\n         (z3 (bvashr (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvashr_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvashr (select x #b00) (select y #b00)))\n         (z1 (bvashr (select x #b01) (select y #b01)))\n         (z2 (bvashr (select x #b10) (select y #b10)))\n         (z3 (bvashr (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvurem_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvurem (select x #b00) (select y #b00)))\n         (z1 (bvurem (select x #b01) (select y #b01)))\n         (z2 (bvurem (select x #b10) (select y #b10)))\n         (z3 (bvurem (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvurem_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvurem (select x #b00) (select y #b00)))\n         (z1 (bvurem (select x #b01) (select y #b01)))\n         (z2 (bvurem (select x #b10) (select y #b10)))\n         (z3 (bvurem (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvurem_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvurem (select x #b00) (select y #b00)))\n         (z1 (bvurem (select x #b01) (select y #b01)))\n         (z2 (bvurem (select x #b10) (select y #b10)))\n         (z3 (bvurem (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvurem_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvurem (select x #b00) (select y #b00)))\n         (z1 (bvurem (select x #b01) (select y #b01)))\n         (z2 (bvurem (select x #b10) (select y #b10)))\n         (z3 (bvurem (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvsrem_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvsrem (select x #b00) (select y #b00)))\n         (z1 (bvsrem (select x #b01) (select y #b01)))\n         (z2 (bvsrem (select x #b10) (select y #b10)))\n         (z3 (bvsrem (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvsrem_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvsrem (select x #b00) (select y #b00)))\n         (z1 (bvsrem (select x #b01) (select y #b01)))\n         (z2 (bvsrem (select x #b10) (select y #b10)))\n         (z3 (bvsrem (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvsrem_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvsrem (select x #b00) (select y #b00)))\n         (z1 (bvsrem (select x #b01) (select y #b01)))\n         (z2 (bvsrem (select x #b10) (select y #b10)))\n         (z3 (bvsrem (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvsrem_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvsrem (select x #b00) (select y #b00)))\n         (z1 (bvsrem (select x #b01) (select y #b01)))\n         (z2 (bvsrem (select x #b10) (select y #b10)))\n         (z3 (bvsrem (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvand_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvand (select x #b00) (select y #b00)))\n         (z1 (bvand (select x #b01) (select y #b01)))\n         (z2 (bvand (select x #b10) (select y #b10)))\n         (z3 (bvand (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvand_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvand (select x #b00) (select y #b00)))\n         (z1 (bvand (select x #b01) (select y #b01)))\n         (z2 (bvand (select x #b10) (select y #b10)))\n         (z3 (bvand (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvand_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvand (select x #b00) (select y #b00)))\n         (z1 (bvand (select x #b01) (select y #b01)))\n         (z2 (bvand (select x #b10) (select y #b10)))\n         (z3 (bvand (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvand_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvand (select x #b00) (select y #b00)))\n         (z1 (bvand (select x #b01) (select y #b01)))\n         (z2 (bvand (select x #b10) (select y #b10)))\n         (z3 (bvand (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvor_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvor (select x #b00) (select y #b00)))\n         (z1 (bvor (select x #b01) (select y #b01)))\n         (z2 (bvor (select x #b10) (select y #b10)))\n         (z3 (bvor (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvor_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvor (select x #b00) (select y #b00)))\n         (z1 (bvor (select x #b01) (select y #b01)))\n         (z2 (bvor (select x #b10) (select y #b10)))\n         (z3 (bvor (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvor_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvor (select x #b00) (select y #b00)))\n         (z1 (bvor (select x #b01) (select y #b01)))\n         (z2 (bvor (select x #b10) (select y #b10)))\n         (z3 (bvor (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvor_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvor (select x #b00) (select y #b00)))\n         (z1 (bvor (select x #b01) (select y #b01)))\n         (z2 (bvor (select x #b10) (select y #b10)))\n         (z3 (bvor (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvxor_2_8 ((x vector_2_8) (y vector_2_8)) vector_2_8\n   (let ((z0 (bvxor (select x #b00) (select y #b00)))\n         (z1 (bvxor (select x #b01) (select y #b01)))\n         (z2 (bvxor (select x #b10) (select y #b10)))\n         (z3 (bvxor (select x #b11) (select y #b11))))\n      (vmake_2_8 z0 z1 z2 z3)))\n\n\n (define-fun vbvxor_2_16 ((x vector_2_16) (y vector_2_16)) vector_2_16\n   (let ((z0 (bvxor (select x #b00) (select y #b00)))\n         (z1 (bvxor (select x #b01) (select y #b01)))\n         (z2 (bvxor (select x #b10) (select y #b10)))\n         (z3 (bvxor (select x #b11) (select y #b11))))\n      (vmake_2_16 z0 z1 z2 z3)))\n\n\n (define-fun vbvxor_2_32 ((x vector_2_32) (y vector_2_32)) vector_2_32\n   (let ((z0 (bvxor (select x #b00) (select y #b00)))\n         (z1 (bvxor (select x #b01) (select y #b01)))\n         (z2 (bvxor (select x #b10) (select y #b10)))\n         (z3 (bvxor (select x #b11) (select y #b11))))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n\n (define-fun vbvxor_2_64 ((x vector_2_64) (y vector_2_64)) vector_2_64\n   (let ((z0 (bvxor (select x #b00) (select y #b00)))\n         (z1 (bvxor (select x #b01) (select y #b01)))\n         (z2 (bvxor (select x #b10) (select y #b10)))\n         (z3 (bvxor (select x #b11) (select y #b11))))\n      (vmake_2_64 z0 z1 z2 z3)))\n\n\n (define-fun vbvadd_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvadd (select x #b000) (select y #b000)))\n         (z1 (bvadd (select x #b001) (select y #b001)))\n         (z2 (bvadd (select x #b010) (select y #b010)))\n         (z3 (bvadd (select x #b011) (select y #b011)))\n         (z4 (bvadd (select x #b100) (select y #b100)))\n         (z5 (bvadd (select x #b101) (select y #b101)))\n         (z6 (bvadd (select x #b110) (select y #b110)))\n         (z7 (bvadd (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvadd_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvadd (select x #b000) (select y #b000)))\n         (z1 (bvadd (select x #b001) (select y #b001)))\n         (z2 (bvadd (select x #b010) (select y #b010)))\n         (z3 (bvadd (select x #b011) (select y #b011)))\n         (z4 (bvadd (select x #b100) (select y #b100)))\n         (z5 (bvadd (select x #b101) (select y #b101)))\n         (z6 (bvadd (select x #b110) (select y #b110)))\n         (z7 (bvadd (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvadd_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvadd (select x #b000) (select y #b000)))\n         (z1 (bvadd (select x #b001) (select y #b001)))\n         (z2 (bvadd (select x #b010) (select y #b010)))\n         (z3 (bvadd (select x #b011) (select y #b011)))\n         (z4 (bvadd (select x #b100) (select y #b100)))\n         (z5 (bvadd (select x #b101) (select y #b101)))\n         (z6 (bvadd (select x #b110) (select y #b110)))\n         (z7 (bvadd (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvadd_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvadd (select x #b000) (select y #b000)))\n         (z1 (bvadd (select x #b001) (select y #b001)))\n         (z2 (bvadd (select x #b010) (select y #b010)))\n         (z3 (bvadd (select x #b011) (select y #b011)))\n         (z4 (bvadd (select x #b100) (select y #b100)))\n         (z5 (bvadd (select x #b101) (select y #b101)))\n         (z6 (bvadd (select x #b110) (select y #b110)))\n         (z7 (bvadd (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsub_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvsub (select x #b000) (select y #b000)))\n         (z1 (bvsub (select x #b001) (select y #b001)))\n         (z2 (bvsub (select x #b010) (select y #b010)))\n         (z3 (bvsub (select x #b011) (select y #b011)))\n         (z4 (bvsub (select x #b100) (select y #b100)))\n         (z5 (bvsub (select x #b101) (select y #b101)))\n         (z6 (bvsub (select x #b110) (select y #b110)))\n         (z7 (bvsub (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsub_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvsub (select x #b000) (select y #b000)))\n         (z1 (bvsub (select x #b001) (select y #b001)))\n         (z2 (bvsub (select x #b010) (select y #b010)))\n         (z3 (bvsub (select x #b011) (select y #b011)))\n         (z4 (bvsub (select x #b100) (select y #b100)))\n         (z5 (bvsub (select x #b101) (select y #b101)))\n         (z6 (bvsub (select x #b110) (select y #b110)))\n         (z7 (bvsub (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsub_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvsub (select x #b000) (select y #b000)))\n         (z1 (bvsub (select x #b001) (select y #b001)))\n         (z2 (bvsub (select x #b010) (select y #b010)))\n         (z3 (bvsub (select x #b011) (select y #b011)))\n         (z4 (bvsub (select x #b100) (select y #b100)))\n         (z5 (bvsub (select x #b101) (select y #b101)))\n         (z6 (bvsub (select x #b110) (select y #b110)))\n         (z7 (bvsub (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsub_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvsub (select x #b000) (select y #b000)))\n         (z1 (bvsub (select x #b001) (select y #b001)))\n         (z2 (bvsub (select x #b010) (select y #b010)))\n         (z3 (bvsub (select x #b011) (select y #b011)))\n         (z4 (bvsub (select x #b100) (select y #b100)))\n         (z5 (bvsub (select x #b101) (select y #b101)))\n         (z6 (bvsub (select x #b110) (select y #b110)))\n         (z7 (bvsub (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvmul_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvmul (select x #b000) (select y #b000)))\n         (z1 (bvmul (select x #b001) (select y #b001)))\n         (z2 (bvmul (select x #b010) (select y #b010)))\n         (z3 (bvmul (select x #b011) (select y #b011)))\n         (z4 (bvmul (select x #b100) (select y #b100)))\n         (z5 (bvmul (select x #b101) (select y #b101)))\n         (z6 (bvmul (select x #b110) (select y #b110)))\n         (z7 (bvmul (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvmul_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvmul (select x #b000) (select y #b000)))\n         (z1 (bvmul (select x #b001) (select y #b001)))\n         (z2 (bvmul (select x #b010) (select y #b010)))\n         (z3 (bvmul (select x #b011) (select y #b011)))\n         (z4 (bvmul (select x #b100) (select y #b100)))\n         (z5 (bvmul (select x #b101) (select y #b101)))\n         (z6 (bvmul (select x #b110) (select y #b110)))\n         (z7 (bvmul (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvmul_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvmul (select x #b000) (select y #b000)))\n         (z1 (bvmul (select x #b001) (select y #b001)))\n         (z2 (bvmul (select x #b010) (select y #b010)))\n         (z3 (bvmul (select x #b011) (select y #b011)))\n         (z4 (bvmul (select x #b100) (select y #b100)))\n         (z5 (bvmul (select x #b101) (select y #b101)))\n         (z6 (bvmul (select x #b110) (select y #b110)))\n         (z7 (bvmul (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvmul_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvmul (select x #b000) (select y #b000)))\n         (z1 (bvmul (select x #b001) (select y #b001)))\n         (z2 (bvmul (select x #b010) (select y #b010)))\n         (z3 (bvmul (select x #b011) (select y #b011)))\n         (z4 (bvmul (select x #b100) (select y #b100)))\n         (z5 (bvmul (select x #b101) (select y #b101)))\n         (z6 (bvmul (select x #b110) (select y #b110)))\n         (z7 (bvmul (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvshl_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvshl (select x #b000) (select y #b000)))\n         (z1 (bvshl (select x #b001) (select y #b001)))\n         (z2 (bvshl (select x #b010) (select y #b010)))\n         (z3 (bvshl (select x #b011) (select y #b011)))\n         (z4 (bvshl (select x #b100) (select y #b100)))\n         (z5 (bvshl (select x #b101) (select y #b101)))\n         (z6 (bvshl (select x #b110) (select y #b110)))\n         (z7 (bvshl (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvshl_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvshl (select x #b000) (select y #b000)))\n         (z1 (bvshl (select x #b001) (select y #b001)))\n         (z2 (bvshl (select x #b010) (select y #b010)))\n         (z3 (bvshl (select x #b011) (select y #b011)))\n         (z4 (bvshl (select x #b100) (select y #b100)))\n         (z5 (bvshl (select x #b101) (select y #b101)))\n         (z6 (bvshl (select x #b110) (select y #b110)))\n         (z7 (bvshl (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvshl_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvshl (select x #b000) (select y #b000)))\n         (z1 (bvshl (select x #b001) (select y #b001)))\n         (z2 (bvshl (select x #b010) (select y #b010)))\n         (z3 (bvshl (select x #b011) (select y #b011)))\n         (z4 (bvshl (select x #b100) (select y #b100)))\n         (z5 (bvshl (select x #b101) (select y #b101)))\n         (z6 (bvshl (select x #b110) (select y #b110)))\n         (z7 (bvshl (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvshl_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvshl (select x #b000) (select y #b000)))\n         (z1 (bvshl (select x #b001) (select y #b001)))\n         (z2 (bvshl (select x #b010) (select y #b010)))\n         (z3 (bvshl (select x #b011) (select y #b011)))\n         (z4 (bvshl (select x #b100) (select y #b100)))\n         (z5 (bvshl (select x #b101) (select y #b101)))\n         (z6 (bvshl (select x #b110) (select y #b110)))\n         (z7 (bvshl (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsdiv_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvsdiv (select x #b000) (select y #b000)))\n         (z1 (bvsdiv (select x #b001) (select y #b001)))\n         (z2 (bvsdiv (select x #b010) (select y #b010)))\n         (z3 (bvsdiv (select x #b011) (select y #b011)))\n         (z4 (bvsdiv (select x #b100) (select y #b100)))\n         (z5 (bvsdiv (select x #b101) (select y #b101)))\n         (z6 (bvsdiv (select x #b110) (select y #b110)))\n         (z7 (bvsdiv (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsdiv_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvsdiv (select x #b000) (select y #b000)))\n         (z1 (bvsdiv (select x #b001) (select y #b001)))\n         (z2 (bvsdiv (select x #b010) (select y #b010)))\n         (z3 (bvsdiv (select x #b011) (select y #b011)))\n         (z4 (bvsdiv (select x #b100) (select y #b100)))\n         (z5 (bvsdiv (select x #b101) (select y #b101)))\n         (z6 (bvsdiv (select x #b110) (select y #b110)))\n         (z7 (bvsdiv (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsdiv_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvsdiv (select x #b000) (select y #b000)))\n         (z1 (bvsdiv (select x #b001) (select y #b001)))\n         (z2 (bvsdiv (select x #b010) (select y #b010)))\n         (z3 (bvsdiv (select x #b011) (select y #b011)))\n         (z4 (bvsdiv (select x #b100) (select y #b100)))\n         (z5 (bvsdiv (select x #b101) (select y #b101)))\n         (z6 (bvsdiv (select x #b110) (select y #b110)))\n         (z7 (bvsdiv (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsdiv_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvsdiv (select x #b000) (select y #b000)))\n         (z1 (bvsdiv (select x #b001) (select y #b001)))\n         (z2 (bvsdiv (select x #b010) (select y #b010)))\n         (z3 (bvsdiv (select x #b011) (select y #b011)))\n         (z4 (bvsdiv (select x #b100) (select y #b100)))\n         (z5 (bvsdiv (select x #b101) (select y #b101)))\n         (z6 (bvsdiv (select x #b110) (select y #b110)))\n         (z7 (bvsdiv (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvudiv_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvudiv (select x #b000) (select y #b000)))\n         (z1 (bvudiv (select x #b001) (select y #b001)))\n         (z2 (bvudiv (select x #b010) (select y #b010)))\n         (z3 (bvudiv (select x #b011) (select y #b011)))\n         (z4 (bvudiv (select x #b100) (select y #b100)))\n         (z5 (bvudiv (select x #b101) (select y #b101)))\n         (z6 (bvudiv (select x #b110) (select y #b110)))\n         (z7 (bvudiv (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvudiv_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvudiv (select x #b000) (select y #b000)))\n         (z1 (bvudiv (select x #b001) (select y #b001)))\n         (z2 (bvudiv (select x #b010) (select y #b010)))\n         (z3 (bvudiv (select x #b011) (select y #b011)))\n         (z4 (bvudiv (select x #b100) (select y #b100)))\n         (z5 (bvudiv (select x #b101) (select y #b101)))\n         (z6 (bvudiv (select x #b110) (select y #b110)))\n         (z7 (bvudiv (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvudiv_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvudiv (select x #b000) (select y #b000)))\n         (z1 (bvudiv (select x #b001) (select y #b001)))\n         (z2 (bvudiv (select x #b010) (select y #b010)))\n         (z3 (bvudiv (select x #b011) (select y #b011)))\n         (z4 (bvudiv (select x #b100) (select y #b100)))\n         (z5 (bvudiv (select x #b101) (select y #b101)))\n         (z6 (bvudiv (select x #b110) (select y #b110)))\n         (z7 (bvudiv (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvudiv_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvudiv (select x #b000) (select y #b000)))\n         (z1 (bvudiv (select x #b001) (select y #b001)))\n         (z2 (bvudiv (select x #b010) (select y #b010)))\n         (z3 (bvudiv (select x #b011) (select y #b011)))\n         (z4 (bvudiv (select x #b100) (select y #b100)))\n         (z5 (bvudiv (select x #b101) (select y #b101)))\n         (z6 (bvudiv (select x #b110) (select y #b110)))\n         (z7 (bvudiv (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvlshr_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvlshr (select x #b000) (select y #b000)))\n         (z1 (bvlshr (select x #b001) (select y #b001)))\n         (z2 (bvlshr (select x #b010) (select y #b010)))\n         (z3 (bvlshr (select x #b011) (select y #b011)))\n         (z4 (bvlshr (select x #b100) (select y #b100)))\n         (z5 (bvlshr (select x #b101) (select y #b101)))\n         (z6 (bvlshr (select x #b110) (select y #b110)))\n         (z7 (bvlshr (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvlshr_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvlshr (select x #b000) (select y #b000)))\n         (z1 (bvlshr (select x #b001) (select y #b001)))\n         (z2 (bvlshr (select x #b010) (select y #b010)))\n         (z3 (bvlshr (select x #b011) (select y #b011)))\n         (z4 (bvlshr (select x #b100) (select y #b100)))\n         (z5 (bvlshr (select x #b101) (select y #b101)))\n         (z6 (bvlshr (select x #b110) (select y #b110)))\n         (z7 (bvlshr (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvlshr_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvlshr (select x #b000) (select y #b000)))\n         (z1 (bvlshr (select x #b001) (select y #b001)))\n         (z2 (bvlshr (select x #b010) (select y #b010)))\n         (z3 (bvlshr (select x #b011) (select y #b011)))\n         (z4 (bvlshr (select x #b100) (select y #b100)))\n         (z5 (bvlshr (select x #b101) (select y #b101)))\n         (z6 (bvlshr (select x #b110) (select y #b110)))\n         (z7 (bvlshr (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvlshr_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvlshr (select x #b000) (select y #b000)))\n         (z1 (bvlshr (select x #b001) (select y #b001)))\n         (z2 (bvlshr (select x #b010) (select y #b010)))\n         (z3 (bvlshr (select x #b011) (select y #b011)))\n         (z4 (bvlshr (select x #b100) (select y #b100)))\n         (z5 (bvlshr (select x #b101) (select y #b101)))\n         (z6 (bvlshr (select x #b110) (select y #b110)))\n         (z7 (bvlshr (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvashr_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvashr (select x #b000) (select y #b000)))\n         (z1 (bvashr (select x #b001) (select y #b001)))\n         (z2 (bvashr (select x #b010) (select y #b010)))\n         (z3 (bvashr (select x #b011) (select y #b011)))\n         (z4 (bvashr (select x #b100) (select y #b100)))\n         (z5 (bvashr (select x #b101) (select y #b101)))\n         (z6 (bvashr (select x #b110) (select y #b110)))\n         (z7 (bvashr (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvashr_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvashr (select x #b000) (select y #b000)))\n         (z1 (bvashr (select x #b001) (select y #b001)))\n         (z2 (bvashr (select x #b010) (select y #b010)))\n         (z3 (bvashr (select x #b011) (select y #b011)))\n         (z4 (bvashr (select x #b100) (select y #b100)))\n         (z5 (bvashr (select x #b101) (select y #b101)))\n         (z6 (bvashr (select x #b110) (select y #b110)))\n         (z7 (bvashr (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvashr_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvashr (select x #b000) (select y #b000)))\n         (z1 (bvashr (select x #b001) (select y #b001)))\n         (z2 (bvashr (select x #b010) (select y #b010)))\n         (z3 (bvashr (select x #b011) (select y #b011)))\n         (z4 (bvashr (select x #b100) (select y #b100)))\n         (z5 (bvashr (select x #b101) (select y #b101)))\n         (z6 (bvashr (select x #b110) (select y #b110)))\n         (z7 (bvashr (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvashr_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvashr (select x #b000) (select y #b000)))\n         (z1 (bvashr (select x #b001) (select y #b001)))\n         (z2 (bvashr (select x #b010) (select y #b010)))\n         (z3 (bvashr (select x #b011) (select y #b011)))\n         (z4 (bvashr (select x #b100) (select y #b100)))\n         (z5 (bvashr (select x #b101) (select y #b101)))\n         (z6 (bvashr (select x #b110) (select y #b110)))\n         (z7 (bvashr (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvurem_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvurem (select x #b000) (select y #b000)))\n         (z1 (bvurem (select x #b001) (select y #b001)))\n         (z2 (bvurem (select x #b010) (select y #b010)))\n         (z3 (bvurem (select x #b011) (select y #b011)))\n         (z4 (bvurem (select x #b100) (select y #b100)))\n         (z5 (bvurem (select x #b101) (select y #b101)))\n         (z6 (bvurem (select x #b110) (select y #b110)))\n         (z7 (bvurem (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvurem_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvurem (select x #b000) (select y #b000)))\n         (z1 (bvurem (select x #b001) (select y #b001)))\n         (z2 (bvurem (select x #b010) (select y #b010)))\n         (z3 (bvurem (select x #b011) (select y #b011)))\n         (z4 (bvurem (select x #b100) (select y #b100)))\n         (z5 (bvurem (select x #b101) (select y #b101)))\n         (z6 (bvurem (select x #b110) (select y #b110)))\n         (z7 (bvurem (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvurem_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvurem (select x #b000) (select y #b000)))\n         (z1 (bvurem (select x #b001) (select y #b001)))\n         (z2 (bvurem (select x #b010) (select y #b010)))\n         (z3 (bvurem (select x #b011) (select y #b011)))\n         (z4 (bvurem (select x #b100) (select y #b100)))\n         (z5 (bvurem (select x #b101) (select y #b101)))\n         (z6 (bvurem (select x #b110) (select y #b110)))\n         (z7 (bvurem (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvurem_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvurem (select x #b000) (select y #b000)))\n         (z1 (bvurem (select x #b001) (select y #b001)))\n         (z2 (bvurem (select x #b010) (select y #b010)))\n         (z3 (bvurem (select x #b011) (select y #b011)))\n         (z4 (bvurem (select x #b100) (select y #b100)))\n         (z5 (bvurem (select x #b101) (select y #b101)))\n         (z6 (bvurem (select x #b110) (select y #b110)))\n         (z7 (bvurem (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsrem_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvsrem (select x #b000) (select y #b000)))\n         (z1 (bvsrem (select x #b001) (select y #b001)))\n         (z2 (bvsrem (select x #b010) (select y #b010)))\n         (z3 (bvsrem (select x #b011) (select y #b011)))\n         (z4 (bvsrem (select x #b100) (select y #b100)))\n         (z5 (bvsrem (select x #b101) (select y #b101)))\n         (z6 (bvsrem (select x #b110) (select y #b110)))\n         (z7 (bvsrem (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsrem_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvsrem (select x #b000) (select y #b000)))\n         (z1 (bvsrem (select x #b001) (select y #b001)))\n         (z2 (bvsrem (select x #b010) (select y #b010)))\n         (z3 (bvsrem (select x #b011) (select y #b011)))\n         (z4 (bvsrem (select x #b100) (select y #b100)))\n         (z5 (bvsrem (select x #b101) (select y #b101)))\n         (z6 (bvsrem (select x #b110) (select y #b110)))\n         (z7 (bvsrem (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsrem_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvsrem (select x #b000) (select y #b000)))\n         (z1 (bvsrem (select x #b001) (select y #b001)))\n         (z2 (bvsrem (select x #b010) (select y #b010)))\n         (z3 (bvsrem (select x #b011) (select y #b011)))\n         (z4 (bvsrem (select x #b100) (select y #b100)))\n         (z5 (bvsrem (select x #b101) (select y #b101)))\n         (z6 (bvsrem (select x #b110) (select y #b110)))\n         (z7 (bvsrem (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvsrem_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvsrem (select x #b000) (select y #b000)))\n         (z1 (bvsrem (select x #b001) (select y #b001)))\n         (z2 (bvsrem (select x #b010) (select y #b010)))\n         (z3 (bvsrem (select x #b011) (select y #b011)))\n         (z4 (bvsrem (select x #b100) (select y #b100)))\n         (z5 (bvsrem (select x #b101) (select y #b101)))\n         (z6 (bvsrem (select x #b110) (select y #b110)))\n         (z7 (bvsrem (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvand_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvand (select x #b000) (select y #b000)))\n         (z1 (bvand (select x #b001) (select y #b001)))\n         (z2 (bvand (select x #b010) (select y #b010)))\n         (z3 (bvand (select x #b011) (select y #b011)))\n         (z4 (bvand (select x #b100) (select y #b100)))\n         (z5 (bvand (select x #b101) (select y #b101)))\n         (z6 (bvand (select x #b110) (select y #b110)))\n         (z7 (bvand (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvand_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvand (select x #b000) (select y #b000)))\n         (z1 (bvand (select x #b001) (select y #b001)))\n         (z2 (bvand (select x #b010) (select y #b010)))\n         (z3 (bvand (select x #b011) (select y #b011)))\n         (z4 (bvand (select x #b100) (select y #b100)))\n         (z5 (bvand (select x #b101) (select y #b101)))\n         (z6 (bvand (select x #b110) (select y #b110)))\n         (z7 (bvand (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvand_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvand (select x #b000) (select y #b000)))\n         (z1 (bvand (select x #b001) (select y #b001)))\n         (z2 (bvand (select x #b010) (select y #b010)))\n         (z3 (bvand (select x #b011) (select y #b011)))\n         (z4 (bvand (select x #b100) (select y #b100)))\n         (z5 (bvand (select x #b101) (select y #b101)))\n         (z6 (bvand (select x #b110) (select y #b110)))\n         (z7 (bvand (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvand_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvand (select x #b000) (select y #b000)))\n         (z1 (bvand (select x #b001) (select y #b001)))\n         (z2 (bvand (select x #b010) (select y #b010)))\n         (z3 (bvand (select x #b011) (select y #b011)))\n         (z4 (bvand (select x #b100) (select y #b100)))\n         (z5 (bvand (select x #b101) (select y #b101)))\n         (z6 (bvand (select x #b110) (select y #b110)))\n         (z7 (bvand (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvor_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvor (select x #b000) (select y #b000)))\n         (z1 (bvor (select x #b001) (select y #b001)))\n         (z2 (bvor (select x #b010) (select y #b010)))\n         (z3 (bvor (select x #b011) (select y #b011)))\n         (z4 (bvor (select x #b100) (select y #b100)))\n         (z5 (bvor (select x #b101) (select y #b101)))\n         (z6 (bvor (select x #b110) (select y #b110)))\n         (z7 (bvor (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvor_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvor (select x #b000) (select y #b000)))\n         (z1 (bvor (select x #b001) (select y #b001)))\n         (z2 (bvor (select x #b010) (select y #b010)))\n         (z3 (bvor (select x #b011) (select y #b011)))\n         (z4 (bvor (select x #b100) (select y #b100)))\n         (z5 (bvor (select x #b101) (select y #b101)))\n         (z6 (bvor (select x #b110) (select y #b110)))\n         (z7 (bvor (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvor_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvor (select x #b000) (select y #b000)))\n         (z1 (bvor (select x #b001) (select y #b001)))\n         (z2 (bvor (select x #b010) (select y #b010)))\n         (z3 (bvor (select x #b011) (select y #b011)))\n         (z4 (bvor (select x #b100) (select y #b100)))\n         (z5 (bvor (select x #b101) (select y #b101)))\n         (z6 (bvor (select x #b110) (select y #b110)))\n         (z7 (bvor (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvor_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvor (select x #b000) (select y #b000)))\n         (z1 (bvor (select x #b001) (select y #b001)))\n         (z2 (bvor (select x #b010) (select y #b010)))\n         (z3 (bvor (select x #b011) (select y #b011)))\n         (z4 (bvor (select x #b100) (select y #b100)))\n         (z5 (bvor (select x #b101) (select y #b101)))\n         (z6 (bvor (select x #b110) (select y #b110)))\n         (z7 (bvor (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvxor_3_8 ((x vector_3_8) (y vector_3_8)) vector_3_8\n   (let (\n         (z0 (bvxor (select x #b000) (select y #b000)))\n         (z1 (bvxor (select x #b001) (select y #b001)))\n         (z2 (bvxor (select x #b010) (select y #b010)))\n         (z3 (bvxor (select x #b011) (select y #b011)))\n         (z4 (bvxor (select x #b100) (select y #b100)))\n         (z5 (bvxor (select x #b101) (select y #b101)))\n         (z6 (bvxor (select x #b110) (select y #b110)))\n         (z7 (bvxor (select x #b111) (select y #b111)))\n         )\n      (vmake_3_8 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvxor_3_16 ((x vector_3_16) (y vector_3_16)) vector_3_16\n   (let (\n         (z0 (bvxor (select x #b000) (select y #b000)))\n         (z1 (bvxor (select x #b001) (select y #b001)))\n         (z2 (bvxor (select x #b010) (select y #b010)))\n         (z3 (bvxor (select x #b011) (select y #b011)))\n         (z4 (bvxor (select x #b100) (select y #b100)))\n         (z5 (bvxor (select x #b101) (select y #b101)))\n         (z6 (bvxor (select x #b110) (select y #b110)))\n         (z7 (bvxor (select x #b111) (select y #b111)))\n         )\n      (vmake_3_16 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvxor_3_32 ((x vector_3_32) (y vector_3_32)) vector_3_32\n   (let (\n         (z0 (bvxor (select x #b000) (select y #b000)))\n         (z1 (bvxor (select x #b001) (select y #b001)))\n         (z2 (bvxor (select x #b010) (select y #b010)))\n         (z3 (bvxor (select x #b011) (select y #b011)))\n         (z4 (bvxor (select x #b100) (select y #b100)))\n         (z5 (bvxor (select x #b101) (select y #b101)))\n         (z6 (bvxor (select x #b110) (select y #b110)))\n         (z7 (bvxor (select x #b111) (select y #b111)))\n         )\n      (vmake_3_32 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n (define-fun vbvxor_3_64 ((x vector_3_64) (y vector_3_64)) vector_3_64\n   (let (\n         (z0 (bvxor (select x #b000) (select y #b000)))\n         (z1 (bvxor (select x #b001) (select y #b001)))\n         (z2 (bvxor (select x #b010) (select y #b010)))\n         (z3 (bvxor (select x #b011) (select y #b011)))\n         (z4 (bvxor (select x #b100) (select y #b100)))\n         (z5 (bvxor (select x #b101) (select y #b101)))\n         (z6 (bvxor (select x #b110) (select y #b110)))\n         (z7 (bvxor (select x #b111) (select y #b111)))\n         )\n      (vmake_3_64 z0 z1 z2 z3 z4 z5 z6 z7)))\n\n\n\n\n;; conversion to and from (Bitvector 64)\n;; this assumes little endian representation\n(define-fun cast_vector_1_32_to_bits ((x vector_1_32)) (_ BitVec 64)\n   (concat (select x #b1) (select x #b0)))\n\n(define-fun cast_bits_to_vector_1_32 ((w (_ BitVec 64))) vector_1_32\n   (let ((z0 ((_ extract 31 0) w))\n         (z1 ((_ extract 63 32) w)))\n      (vmake_1_32 z0 z1)))\n\n;; conversion to and from (Bitvector 128)\n;; this assumes little endian representation\n(define-fun cast_vector_2_32_to_bits ((x vector_2_32)) (_ BitVec 128)\n   (concat (concat (concat (select x #b11) (select x #b10)) (select x #b01)) (select x #b00)))\n\n(define-fun cast_bits_to_vector_2_32 ((w (_ BitVec 128))) vector_2_32\n   (let ((z0 ((_ extract 31 0) w))\n         (z1 ((_ extract 63 32) w))\n         (z2 ((_ extract 95 64) w))\n         (z3 ((_ extract 127 96) w)))\n      (vmake_2_32 z0 z1 z2 z3)))\n\n;; conversion to and from (Bitvector 128) to vectors 2 x i64\n(define-fun cast_vector_1_64_to_bits ((x vector_1_64)) (_ BitVec 128)\n   (concat (select x #b1) (select x #b0)))\n\n(define-fun cast_bits_to_vector_1_64 ((w (_ BitVec 128))) vector_1_64\n   (let ((z0 ((_ extract 63 0) w))\n         (z1 ((_ extract 127 64) w)))\n      (vmake_1_64 z0 z1)))\n\n\n\n\n;; end of prelude\n\n\n;; @.str [16 x i8] = c\"lhs == rhs: %d\\0A\\00\"\n(declare-fun |-@.str| () (_ BitVec 64))\n;; @.str1 [22 x i8] = c\"lhs = %d != rhs = %d\\0A\\00\"\n(declare-fun |-@.str1| () (_ BitVec 64))\n(declare-fun -@lhs () (_ BitVec 64))\n(declare-fun -@rhs () (_ BitVec 64))\n(declare-fun -@main () (_ BitVec 64))\n(declare-fun -@atoi () (_ BitVec 64))\n(declare-fun -@printf () (_ BitVec 64))\n\n\n;; Function: |-@lhs|\n;; (i32 %a, i32 %b)\n(declare-fun memory1 () Mem)\n(define-fun rsp1 () (_ BitVec 64) (_ bv0 64))\n(declare-fun |%a-@lhs| () (_ BitVec 32))\n(declare-fun |%b-@lhs| () (_ BitVec 32))\n\n;; BLOCK %0 with index 0 and rank = 1\n;; Predecessors:\n;; |-@lhs_block_0_entry_condition| \n(define-fun |-@lhs_block_0_entry_condition| () Bool true)\n;; %1 = insertelement <2 x i32> undef, i32 %a, i32 0\n(define-fun |%1-@lhs| () (Array (_ BitVec 1) (_ BitVec 32)) (store vzero_1_32 ((_ extract 0 0) (_ bv0 32)) |%a-@lhs|))\n;; %2 = insertelement <2 x i32> %1, i32 %b, i32 1\n(define-fun |%2-@lhs| () (Array (_ BitVec 1) (_ BitVec 32)) (store |%1-@lhs| ((_ extract 0 0) (_ bv1 32)) |%b-@lhs|))\n;; %3 = shufflevector <2 x i32> %2, <2 x i32> undef, <2 x i32> <i32 1, i32 0>\n(define-fun |%3-@lhs| () (Array (_ BitVec 1) (_ BitVec 32)) \n(let ((x0 vundef_1_32))\n(let ((x1 (store x0 ((_ extract 0 0) (_ bv0 32)) (select |%2-@lhs| ((_ extract 0 0) (_ bv1 32))))))\n (let ((x2 (store x1 ((_ extract 0 0) (_ bv1 32)) (select |%2-@lhs| ((_ extract 0 0) (_ bv0 32))))))\n  x2))))\n;; %4 = shufflevector <2 x i32> %3, <2 x i32> undef, <2 x i32> <i32 1, i32 0>\n(define-fun |%4-@lhs| () (Array (_ BitVec 1) (_ BitVec 32)) \n(let ((x0 vundef_1_32))\n(let ((x1 (store x0 ((_ extract 0 0) (_ bv0 32)) (select |%3-@lhs| ((_ extract 0 0) (_ bv1 32))))))\n (let ((x2 (store x1 ((_ extract 0 0) (_ bv1 32)) (select |%3-@lhs| ((_ extract 0 0) (_ bv0 32))))))\n  x2))))\n;; %5 = extractelement <2 x i32> %4, i32 0\n(define-fun |%5-@lhs| () (_ BitVec 32) (select |%4-@lhs| ((_ extract 0 0) (_ bv0 32))))\n;; ret i32 %5\n;; No backward arrows\n\n\n(define-fun |-@lhs_result| () (_ BitVec 32) |%5-@lhs|)\n\n;; Function: |-@rhs|\n;; (i32 %a, i32 %b)\n(declare-fun memory2 () Mem)\n(define-fun rsp2 () (_ BitVec 64) (_ bv0 64))\n(declare-fun |%a-@rhs| () (_ BitVec 32))\n(declare-fun |%b-@rhs| () (_ BitVec 32))\n\n;; BLOCK %0 with index 0 and rank = 1\n;; Predecessors:\n;; |-@rhs_block_0_entry_condition| \n(define-fun |-@rhs_block_0_entry_condition| () Bool true)\n;; %1 = insertelement <2 x i32> undef, i32 %a, i32 0\n(define-fun |%1-@rhs| () (Array (_ BitVec 1) (_ BitVec 32)) (store vzero_1_32 ((_ extract 0 0) (_ bv0 32)) |%a-@rhs|))\n;; %2 = insertelement <2 x i32> %1, i32 %b, i32 1\n(define-fun |%2-@rhs| () (Array (_ BitVec 1) (_ BitVec 32)) (store |%1-@rhs| ((_ extract 0 0) (_ bv1 32)) |%b-@rhs|))\n;; %3 = extractelement <2 x i32> %2, i32 0\n(define-fun |%3-@rhs| () (_ BitVec 32) (select |%2-@rhs| ((_ extract 0 0) (_ bv0 32))))\n;; ret i32 %3\n;; No backward arrows\n\n\n(define-fun |-@rhs_result| () (_ BitVec 32) |%3-@rhs|)\n\n;; Function: |-@main|\n;; (i32 %argc, i8** %argv)\n(declare-fun memory3 () Mem)\n(define-fun rsp3 () (_ BitVec 64) (_ bv0 64))\n(declare-fun |%argc-@main| () (_ BitVec 32))\n(declare-fun |%argv-@main| () (_ BitVec 64))\n\n;; BLOCK %0 with index 0 and rank = 1\n;; Predecessors:\n;; |-@main_block_0_entry_condition| \n(define-fun |-@main_block_0_entry_condition| () Bool true)\n;; %1 = alloca i32, align 4\n(define-fun rsp4 () Address (bvsub rsp3 (_ bv4 64)))\n(define-fun |%1-@main| () (_ BitVec 64) rsp4)\n;; %2 = alloca i32, align 4\n(define-fun rsp5 () Address (bvsub rsp4 (_ bv4 64)))\n(define-fun |%2-@main| () (_ BitVec 64) rsp5)\n;; %3 = alloca i8**, align 8\n(define-fun rsp6 () Address (bvsub rsp5 (_ bv8 64)))\n(define-fun |%3-@main| () (_ BitVec 64) rsp6)\n;; %a = alloca i32, align 4\n(define-fun rsp7 () Address (bvsub rsp6 (_ bv4 64)))\n(define-fun |%a-@main| () (_ BitVec 64) rsp7)\n;; %b = alloca i32, align 4\n(define-fun rsp8 () Address (bvsub rsp7 (_ bv4 64)))\n(define-fun |%b-@main| () (_ BitVec 64) rsp8)\n;; %lhs = alloca i32, align 4\n(define-fun rsp9 () Address (bvsub rsp8 (_ bv4 64)))\n(define-fun |%lhs-@main| () (_ BitVec 64) rsp9)\n;; %rhs = alloca i32, align 4\n(define-fun rsp10 () Address (bvsub rsp9 (_ bv4 64)))\n(define-fun |%rhs-@main| () (_ BitVec 64) rsp10)\n;; store i32 0, i32* %1\n(define-fun memory4 () Mem (write32 memory3 |%1-@main| (_ bv0 32)))\n;; store i32 %argc, i32* %2, align 4\n(define-fun memory5 () Mem (write32 memory4 |%2-@main| |%argc-@main|))\n;; store i8** %argv, i8*** %3, align 8\n(define-fun memory6 () Mem (write64 memory5 |%3-@main| |%argv-@main|))\n;; %4 = load i32* %2, align 4\n(define-fun |%4-@main| () (_ BitVec 32) (read32 memory6 |%2-@main|))\n;; %5 = icmp eq i32 %4, 3\n(define-fun |%5-@main| () Bool (= |%4-@main| (_ bv3 32)))\n;; br i1 %5, label %6, label %32\n;; No backward arrows\n\n;; BLOCK %6 with index 1 and rank = 2\n;; Predecessors: %0\n;; |-@main_block_1_entry_condition| \n(define-fun |-@main_block_1_entry_condition| () Bool\n    (and |-@main_block_0_entry_condition| |%5-@main|)\n)\n;;Memory PHI\n(define-fun memory7 () Mem memory6)\n;; %7 = load i8*** %3, align 8\n(define-fun |%7-@main| () (_ BitVec 64) (read64 memory7 |%3-@main|))\n;; %8 = getelementptr inbounds i8** %7, i64 1\n(define-fun |%8-@main| () (_ BitVec 64) (bvadd |%7-@main| (_ bv8 64)))\n;; %9 = load i8** %8, align 8\n(define-fun |%9-@main| () (_ BitVec 64) (read64 memory7 |%8-@main|))\n;; %10 = call i32 @atoi(i8* %9)\n(declare-fun |%10-@main| () (_ BitVec 32))\n;; store i32 %10, i32* %a, align 4\n(define-fun memory8 () Mem (write32 memory7 |%a-@main| |%10-@main|))\n;; %11 = load i8*** %3, align 8\n(define-fun |%11-@main| () (_ BitVec 64) (read64 memory8 |%3-@main|))\n;; %12 = getelementptr inbounds i8** %11, i64 2\n(define-fun |%12-@main| () (_ BitVec 64) (bvadd |%11-@main| (_ bv16 64)))\n;; %13 = load i8** %12, align 8\n(define-fun |%13-@main| () (_ BitVec 64) (read64 memory8 |%12-@main|))\n;; %14 = call i32 @atoi(i8* %13)\n(declare-fun |%14-@main| () (_ BitVec 32))\n;; store i32 %14, i32* %b, align 4\n(define-fun memory9 () Mem (write32 memory8 |%b-@main| |%14-@main|))\n;; %15 = load i32* %a, align 4\n(define-fun |%15-@main| () (_ BitVec 32) (read32 memory9 |%a-@main|))\n;; %16 = load i32* %b, align 4\n(define-fun |%16-@main| () (_ BitVec 32) (read32 memory9 |%b-@main|))\n;; %17 = call i32 @lhs(i32 %15, i32 %16)\n(declare-fun |%17-@main| () (_ BitVec 32))\n;; store i32 %17, i32* %lhs, align 4\n(define-fun memory10 () Mem (write32 memory9 |%lhs-@main| |%17-@main|))\n;; %18 = load i32* %a, align 4\n(define-fun |%18-@main| () (_ BitVec 32) (read32 memory10 |%a-@main|))\n;; %19 = load i32* %b, align 4\n(define-fun |%19-@main| () (_ BitVec 32) (read32 memory10 |%b-@main|))\n;; %20 = call i32 @rhs(i32 %18, i32 %19)\n(declare-fun |%20-@main| () (_ BitVec 32))\n;; store i32 %20, i32* %rhs, align 4\n(define-fun memory11 () Mem (write32 memory10 |%rhs-@main| |%20-@main|))\n;; %21 = load i32* %lhs, align 4\n(define-fun |%21-@main| () (_ BitVec 32) (read32 memory11 |%lhs-@main|))\n;; %22 = load i32* %rhs, align 4\n(define-fun |%22-@main| () (_ BitVec 32) (read32 memory11 |%rhs-@main|))\n;; %23 = icmp eq i32 %21, %22\n(define-fun |%23-@main| () Bool (= |%21-@main| |%22-@main|))\n;; br i1 %23, label %24, label %27\n;; No backward arrows\n\n;; BLOCK %24 with index 2 and rank = 3\n;; Predecessors: %6\n;; |-@main_block_2_entry_condition| \n(define-fun |-@main_block_2_entry_condition| () Bool\n    (and |-@main_block_1_entry_condition| |%23-@main|)\n)\n;;Memory PHI\n(define-fun memory12 () Mem memory11)\n;; %25 = load i32* %lhs, align 4\n(define-fun |%25-@main| () (_ BitVec 32) (read32 memory12 |%lhs-@main|))\n;; %26 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([16 x i8]* @.str, i32 0, i32 0), i32 %25)\n(declare-fun |%26-@main| () (_ BitVec 32))\n;; br label %31\n;; No backward arrows\n\n;; BLOCK %27 with index 3 and rank = 3\n;; Predecessors: %6\n;; |-@main_block_3_entry_condition| \n(define-fun |-@main_block_3_entry_condition| () Bool\n    (and |-@main_block_1_entry_condition| (not |%23-@main|))\n)\n;;Memory PHI\n(define-fun memory13 () Mem memory11)\n;; %28 = load i32* %lhs, align 4\n(define-fun |%28-@main| () (_ BitVec 32) (read32 memory13 |%lhs-@main|))\n;; %29 = load i32* %rhs, align 4\n(define-fun |%29-@main| () (_ BitVec 32) (read32 memory13 |%rhs-@main|))\n;; %30 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str1, i32 0, i32 0), i32 %28, i32 %29)\n(declare-fun |%30-@main| () (_ BitVec 32))\n;; br label %31\n;; No backward arrows\n\n;; BLOCK %31 with index 4 and rank = 4\n;; Predecessors: %27 %24\n;; |-@main_block_4_entry_condition| \n(define-fun |-@main_block_4_entry_condition| () Bool\n    (or\n        |-@main_block_3_entry_condition|\n        |-@main_block_2_entry_condition|\n    )\n)\n;;Memory PHI\n(define-fun memory14 () Mem \n    (ite |-@main_block_3_entry_condition| memory13 memory12\n    ))\n;; br label %32\n;; No backward arrows\n\n;; BLOCK %32 with index 5 and rank = 5\n;; Predecessors: %31 %0\n;; |-@main_block_5_entry_condition| \n(define-fun |-@main_block_5_entry_condition| () Bool\n    (or\n        |-@main_block_4_entry_condition|\n        (and |-@main_block_0_entry_condition| (not |%5-@main|))\n    )\n)\n;;Memory PHI\n(define-fun memory15 () Mem \n    (ite |-@main_block_4_entry_condition| memory14 memory6\n    ))\n;; ret i32 0\n;; No backward arrows\n\n\n(define-fun |-@main_result| () (_ BitVec 32) (_ bv0 32))\n\n;; Function: |-@atoi|\n;; (i8*)\n\n\n;; Function: |-@printf|\n;; (i8*, ...)\n\n\n(assert (and (= |%a-@lhs| |%a-@rhs|) (= |%b-@lhs| |%b-@rhs|) (not (= |-@lhs_result| |-@rhs_result|))))\n\n(check-sat)\n"
  },
  {
    "path": "src/test/resources/samples/langs/SPARQL/foaf.sparql",
    "content": "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\nSELECT ?name ?email\nWHERE {\n  ?person a foaf:Person.\n  ?person foaf:name ?name.\n  ?person foaf:mbox ?email.\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/SPARQL/string-matching.sparql",
    "content": "PREFIX owl: <http://www.w3.org/2002/07/owl#>\nPREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\nPREFIX skos: <http://www.w3.org/2004/02/skos/core#>\n\nSELECT DISTINCT ?s ?label\nWHERE {\n  SERVICE <http://api.finto.fi/sparql>\n  {\n    SELECT DISTINCT ?s ?label ?plabel ?alabel ?hlabel (GROUP_CONCAT(DISTINCT STR(?type)) as ?types)\n    WHERE {\n      GRAPH <http://www.yso.fi/onto/kauno/>\n      {\n      ?s rdf:type <http://www.w3.org/2004/02/skos/core#Concept>\n      {\n       ?s rdf:type ?type .\n       ?s ?prop ?match .\n       FILTER (\n        strstarts(lcase(str(?match)), \"test\") && !(?match != ?label && strstarts(lcase(str(?label)), \"test\"))\n       )\n       OPTIONAL {\n        ?s skos:prefLabel ?label .\n        FILTER (langMatches(lang(?label), \"en\"))\n       }\n       OPTIONAL { # in case previous OPTIONAL block gives no labels\n         ?s ?prop ?match .\n         ?s skos:prefLabel ?label .\n         FILTER (langMatches(lang(?label), lang(?match))) }\n      }\n      FILTER NOT EXISTS { ?s owl:deprecated true }\n     }\n     BIND(IF(?prop = skos:prefLabel && ?match != ?label, ?match, \"\") as ?plabel)\n     BIND(IF(?prop = skos:altLabel, ?match, \"\") as ?alabel)\n     BIND(IF(?prop = skos:hiddenLabel, ?match, \"\") as ?hlabel)\n     VALUES (?prop) { (skos:prefLabel) (skos:altLabel) (skos:hiddenLabel) }\n    }\n    GROUP BY ?match ?s ?label ?plabel ?alabel ?hlabel ?prop\n    ORDER BY lcase(str(?match)) lang(?match)\n    LIMIT 10\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQF/fn_remoteExecFnc.sqf",
    "content": "/*\n * Author: commy2\n *\n * Execute a function on a remote machine in mp.\n * \n * Argument:\n * 0: Function arguments (Array)\n * 1: Function to execute, has to be defined on the remote machine first (String)\n * 2: The function will be executed where this unit is local OR the mode were this function should be executed. (Object OR Number, optional default: 2)\n * \t\tMode 0: execute on this machine only\n * \t\tMode 1: execute on server\n * \t\tMode 2: execute on all clients + server\n * \t\tMode 3: execute on dedicated only\n * \n * Return value:\n * Nothing\n */\n\nprivate [\"_arguments\", \"_function\", \"_unit\", \"_id\"];\n\nAGM_Core_remoteFnc = _this;\n\n_arguments = _this select 0;\n_function = call compile (_this select 1);\n_unit = _this select 2;\n\nif (isNil \"_unit\") then {\n\t_unit = 2;\n};\n\nif (typeName _unit == \"SCALAR\") exitWith {\n\tswitch (_unit) do {\n\t\tcase 0 : {\n\t\t\t_arguments call _function;\n\t\t};\n\t\tcase 1 : {\n\t\t\tif (isServer) then {\n\t\t\t\t_arguments call _function;\n\t\t\t} else {\n\t\t\t\tpublicVariableServer \"AGM_Core_remoteFnc\";\n\t\t\t};\n\t\t};\n\t\tcase 2 : {\n\t\t\t_arguments call _function;\n\n\t\t\tAGM_Core_remoteFnc set [2, 0];\n\t\t\tpublicVariable \"AGM_Core_remoteFnc\";\n\t\t};\n\t\tcase 3 : {\n\t\t\tif (isDedicated) then {\n\t\t\t\t_arguments call _function;\n\t\t\t} else {\n\t\t\t\tif (!isServer) then {publicVariableServer \"AGM_Core_remoteFnc\"};\n\t\t\t};\n\t\t};\n\t};\n};\n\nif (local _unit) then {\n\t_arguments call _function;\n} else {\n\tif (isServer) then {\n\t\t_id = owner _unit;\n\t\t_id publicVariableClient \"AGM_Core_remoteFnc\";\n\t} else {\n\t\tpublicVariableServer \"AGM_Core_remoteFnc\";\n\t};\n};"
  },
  {
    "path": "src/test/resources/samples/langs/SQF/macros.hqf",
    "content": "#include <version.hqf>\n\n#define SET(VAR,VALUE) private #VAR; VAR = VALUE;\n#define CONV(VAR,ARRAY,POOL) VAR = ARRAY select (POOL find VAR);\n\n#define ALL_HITPOINTS_MAN [ \\\n  \"HitHead\", \"HitBody\", \\\n  \"HitLeftArm\", \"HitRightArm\", \\\n  \"HitLeftLeg\",\"HitRightLeg\" \\\n]\n\n#define ALL_HITPOINTS_VEH [ \\\n  \"HitBody\", \"HitHull\", \"HitEngine\", \"HitFuel\", \\\n  \"HitTurret\", \"HitGun\", \\\n  \"HitLTrack\", \"HitRTrack\", \\\n  \"HitLFWheel\", \"HitRFWheel\", \"HitLF2Wheel\", \"HitRF2Wheel\", \"HitLMWheel\", \"HitRMWheel\", \"HitLBWheel\", \"HitRBWheel\", \\\n  \"HitAvionics\", \"HitHRotor\", \"HitVRotor\", \\\n  \"HitRGlass\", \"HitLGlass\", \"HitGlass1\", \"HitGlass2\", \"HitGlass3\", \"HitGlass4\", \"HitGlass5\", \"HitGlass6\" \\\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/AvailableInSearchSel.prc",
    "content": "IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N'dbo.AvailableInSearchSel') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)\n    DROP PROCEDURE dbo.AvailableInSearchSel\nGO\nCREATE Procedure AvailableInSearchSel\nAS\n\n    SELECT    '-1',\n            'Select...'\n    UNION ALL\n    SELECT    '1',\n            'Yes'\n    UNION ALL\n    SELECT    '0',\n            'No'\nGO\nIF DB_NAME() = 'Diebold' BEGIN\n    GRANT EXECUTE ON dbo.AvailableInSearchSel TO [rv]\nEND\nGO\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/create_stuff.sql",
    "content": "\nCREATE TABLE x AS SELECT * FROM DUAL;\n\nCREATE TABLE y (\ncol1 NUMBER NOT NULL ,\ncol2 VARCHAR2(200),\ncol3 DATE,\ncol4 TIMESTAMP WITH TIME ZONE NOT NULL\n);\n\n\nCREATE USER username IDENTIFIED BY password;\n\nGRANT CONNECT, RESOURCE TO username;\n\n\nGRANT CREATE TYPE TO username;\nGRANT CREATE PROCEDURE TO username;\nGRANT CREATE TABLE TO username;\nGRANT CREATE VIEW TO username;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/db.sql",
    "content": "SHOW WARNINGS;\r\n--\r\n-- Table structure for table `articles`\r\n--\r\nCREATE TABLE IF NOT EXISTS `articles` (\r\n  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n  `title` varchar(255) DEFAULT NULL,\r\n  `content` longtext,\r\n  `date_posted` datetime NOT NULL,\r\n  `created_by` varchar(255) NOT NULL,\r\n  `last_modified` datetime DEFAULT NULL,\r\n  `last_modified_by` varchar(255) DEFAULT NULL,\r\n  `ordering` int(10) DEFAULT '0',\r\n  `is_published` int(1) DEFAULT '1',\r\n  PRIMARY KEY (`id`)\r\n);\r\n\r\n--\r\n-- Dumping data for table `articles`\r\n--\r\n\r\nINSERT INTO `articles` (`title`, `content`, `date_posted`, `created_by`, `last_modified`, `last_modified_by`, `ordering`, `is_published`) VALUES\r\n('Welcome', '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed interdum, felis ac pellentesque feugiat, massa enim sagittis elit, sed dignissim sem ligula non nisl. Sed pulvinar nunc nec eros aliquet non tempus diam vehicula. Nunc tincidunt, leo ut interdum tristique, quam ligula porttitor tellus, at tincidunt magna enim nec arcu. Nunc tempor egestas libero. Vivamus nulla ligula, vehicula vitae mattis quis, laoreet eget urna. Proin eget est quis urna venenatis dictum nec vel lectus. Nullam sit amet vehicula leo. Sed commodo, orci vitae facilisis accumsan, arcu justo sagittis risus, quis aliquet purus neque eu odio. Mauris lectus orci, tincidunt in varius quis, dictum sed nibh. Quisque dapibus mollis blandit. Donec vel tellus nisl, sed scelerisque felis. Praesent ut eros tortor, sed molestie nunc. Duis eu massa at justo iaculis gravida.</p>\\r\\n<p>In adipiscing dictum risus a tincidunt. Sed nisi ipsum, rutrum sed ornare in, bibendum at augue. Integer ornare semper varius. Integer luctus vehicula elementum. Donec cursus elit quis erat laoreet elementum. Praesent eget justo purus, vitae accumsan massa. Ut tristique, mauris non dignissim luctus, velit justo sollicitudin odio, vel rutrum purus enim eu felis. In adipiscing elementum sagittis. Nam sed dui ante. Nunc laoreet hendrerit nisl vitae porta. Praesent sit amet ligula et nisi vulputate volutpat. Maecenas venenatis iaculis sapien sit amet auctor. Curabitur euismod venenatis velit non tempor. Cras vel sapien purus, mollis fermentum nulla. Mauris sed elementum enim. Donec ultrices urna at justo adipiscing rutrum.</p>', '2012-08-09 01:19:59', 'admin',NULL, NULL, 0, 1);\r\n\r\n\r\n-- --------------------------------------------------------\r\n\r\n--\r\n-- Table structure for table `challenges`\r\n--\r\n\r\nCREATE TABLE IF NOT EXISTS `challenges` (\r\n  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n  `title` varchar(255) DEFAULT NULL,\r\n  `pkg_name` varchar(255) NOT NULL,\r\n  `description` text,\r\n  `author` varchar(255) NOT NULL,\r\n  `category` varchar(255) NOT NULL,\r\n  `date_posted` datetime NOT NULL,\r\n  `visibility` varchar(255) DEFAULT 'private',\r\n  `publish` int(10) DEFAULT '0',\r\n  `abstract` varchar(255) DEFAULT NULL,\r\n  `level` varchar(255) DEFAULT NULL,\r\n  `duration` int(11) DEFAULT NULL,\r\n  `goal` varchar(255) DEFAULT NULL,\r\n  `solution` varchar(255) DEFAULT NULL,\r\n  `availability` varchar(255) DEFAULT 'private',\r\n  `default_points` int(11) DEFAULT NULL,\r\n  `default_duration` int(11) DEFAULT NULL,\r\n  PRIMARY KEY (`id`)\r\n);\r\n\r\n--\r\n-- Dumping data for table `challenges`\r\n--\r\n\r\nINSERT INTO `challenges` (`title`, `pkg_name`, `description`, `author`, `category`, `date_posted`, `visibility`, `publish`, `abstract`, `level`, `duration`, `goal`, `solution`, `availability`, `default_points`, `default_duration`) VALUES\r\n('Challenge 1', 'ch001', 'Our agents (hackers) informed us that there reasonable suspicion \\r\\nthat the site of this <a href=\"ch001/\" target=\"_blank\">Logistics Company</a> is a blind \\r\\nfor a human organs''  smuggling organisation.<br /> <br /> This organisation attracts its \\r\\nvictims through advertisments for jobs with very high salaries. They choose those ones who \\r\\ndo not have many relatives, they assasinate them and then sell their organs to very rich \\r\\nclients, at very high prices.<br /> <br /> These employees are registered in the secret \\r\\nfiles of the company as \"special clients\"!<br /> <br /> One of our agents has been hired \\r\\nas by the particular company. Unfortunately, since 01/01/2007 he has gone missing.<br /> \\r\\n<br /> We know that our agent is alive, but we cannot contact him. Last time he  \\r\\ncommunicated with us, he mentioned that we could contact him at the  e-mail address the \\r\\ncompany has supplied him with, should there a problem  arise.<br /> <br /> The problem is \\r\\nthat when we last talked to him, he had not a company  e-mail address yet, but he told us \\r\\nthat his e-mail can be found through  the company''s site. <br /> <br /> The only thing we \\r\\nremember is that he was hired on Friday the 13th! <br /> <br /> You have to find his e-mail \\r\\naddress and send it to us by using the central communication panel of the company''s \\r\\nsite.<br /> <br /> Good luck!!!', 'Andreas Venieris,\\n        Konstantinos Papapanagiotou,\\n \\n       Anastasios Stasinopoulos,\\n        Vasilios Vlachos,\\n        Alexandros \\nPapanikolaou', 'web', '2012-08-09 00:23:14', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Challenge 2', 'ch002', 'Your Country needs your help for finding the password of an enemy \\r\\n\\r\\nsite  that contains useful information, which if is not acquired on time,  peace in our \\r\\n\\r\\narea will be at stake.<br /> <br />\\n        You must therefore succeed in finding the \\r\\n\\r\\npassword of this military <a href=\"ch002/index.php\" target=\"_blank\">SITE</a>.<br /> <br \\r\\n\\r\\n/> Good luck!', 'Andreas Venieris,\\n        Konstantinos Papapanagiotou,\\n        Anastasios \\r\\n\\r\\nStasinopoulos,\\n        Vasilios Vlachos,\\n        Alexandros Papanikolaou', 'web', '0000-00-00 00:00:00', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Challenge 3', 'ch003', 'XSS permits a malevolent user to inject his own code in vulnerable \\r\\n\\r\\nweb  pages. According to the OWASP 2010 Top 10 Application Security Risks,  XSS attacks \\r\\n\\r\\nrank 2nd in the \"most dangerous\" list.<br /> <br /> Your objective is to make an alert \\r\\n\\r\\nbox appear  <a href=\"ch003/index.php\" target=\"_blank\">HERE</a> bearing the message: \\r\\n\\r\\n\"<strong>XSS!</strong>\".', 'Andreas Venieris,\\n        Konstantinos Papapanagiotou,\\n      \\r\\n\\r\\n  Anastasios Stasinopoulos,\\n        Vasilios Vlachos,\\n        Alexandros \\r\\n\\r\\nPapanikolaou', 'web', '2012-08-09 00:24:46', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Challenge 4', 'ch004', 'A hacker informed us that <a href=\"ch004/index.php\" target=\\r\\n\\r\\n\"_blank\">this</a> site suffers from an XSS-like type of  vulnerability. Unfortunately, he \\r\\n\\r\\nlost the notes he had written regarding  how exactly did he exploit the aforementioned \\r\\n\\r\\nvulnerability.<br /> Your objective is to make an alert box appear, bearing the message \\r\\n\\r\\n\"<strong>XSS!</strong>\". It should be noted, however, that this site has some protection \\r\\n\\r\\nagainst such attacks.', 'Andreas Venieris,\\n        Konstantinos Papapanagiotou,\\n        \\r\\n\\r\\nAnastasios Stasinopoulos,\\n        Vasilios Vlachos,\\n        Alexandros \\r\\n\\r\\nPapanikolaou', 'web', '2012-08-09 00:25:25', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Challenge 5', 'ch005', 'You need to get access to the contents of this <a href=\\r\\n\\r\\n\"ch005/index.php\" target=\"_blank\">SITE</a>. In order to achieve  this, however, you \\r\\n\\r\\nmust buy the \"p0wnBrowser\" web browser. Since it is  too expensive, you will have to \\r\\n\\r\\n\"fool\" the system in some way, so that  it let you read the site''s contents.', 'Andreas \\r\\n\\r\\nVenieris,\\n        Konstantinos Papapanagiotou,\\n        Anastasios Stasinopoulos,\\n        \\r\\n\\r\\nVasilios Vlachos,\\n        Alexandros Papanikolaou', 'web', '2012-08-09 00:26:09', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Challenge 6', 'ch006', 'In this assignment you must prove your... knightly skills! Real \\r\\n\\r\\nknights  have not disappeared.They still exist, keeping their secrets well  hidden.<br /> \\r\\n\\r\\nYour mission is to infiltrate their <a href=\"ch006/index.php\" target=\"_blank\">SITE</a>. \\r\\n\\r\\nThere is a small problem, however... We don''t know the password!<br /> Perhaps you could \\r\\n\\r\\nfind it?<br /> Let''s see!<br /> g00d luck dudes!', 'Andreas Venieris,\\n        Konstantinos \\r\\n\\r\\nPapapanagiotou,\\n        Anastasios Stasinopoulos,\\n        Vasilios Vlachos,\\n        \\r\\n\\r\\nAlexandros Papanikolaou', 'web', '2012-08-09 00:26:52', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Challenge 7', 'ch007', 'A good friend of mine studies at Acme University, in the <a href=\\r\\n\\r\\n\"ch007/index.php\" target=\"_blank\">Computer  Science and Telecomms Department</a>. \\r\\n\\r\\nUnfortunately, her grades are not that  good. You are now thinking \"This is big news!\"... \\r\\n\\r\\nHmmm, maybe not. What  is big news, however, is this: The network administrator asked for  \\r\\n\\r\\n3,000 euros to change her marks into A''s. This is obviously a case of  administrative \\r\\n\\r\\nauthority abuse. Hence... a good chance for D-phase and  public exposure...<br /> I need to \\r\\n\\r\\nget into the site as admin and upload an index.htm  file in the web-root directory, that \\r\\n\\r\\nwill present all required evidence  for the University''s latest \"re-marking\" practices!\\r\\n\\r\\n<br /> I only need you to find the admin password for me...<br /> <br /> Good \\r\\n\\r\\nLuck!', 'Andreas Venieris,\\n        Konstantinos Papapanagiotou,\\n        Anastasios \\r\\n\\r\\nStasinopoulos,\\n        Vasilios Vlachos,\\n        Alexandros Papanikolaou', 'web', '0000-00-00 00:00:00', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Challenge 8', 'ch008', 'You have managed, after several tries, to install a backdoor shell \\r\\n\\r\\n(Locus7Shell) to <a href=\"ch008/\" target=\"_blank\">trytohack.gr<br /></a> <br /> The \\r\\n\\r\\nproblem is that, in order to execute the majority of the commands  (on the machine running \\r\\n\\r\\nthe backdoor) you must have super-user rights  (root).<br /> <br /> Your aim is to obtain \\r\\n\\r\\nroot rights.', 'Andreas Venieris,\\n        Konstantinos Papapanagiotou,\\n        Anastasios \\r\\n\\r\\nStasinopoulos,\\n        Vasilios Vlachos,\\n        Alexandros Papanikolaou', 'web', '0000-00-00 00:00:00', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Challenge 9', 'ch009', 'A friend of yours has set up a news blog at <a href=\\r\\n\\r\\n\"ch009/index.php\" target=\"_blank\">slagoff.com</a>.  However, he is kind of worried \\r\\n\\r\\nregarding the security of the news that  gets posted on the blog and has asked you to check \\r\\n\\r\\nhow secure it is.<br /> <br /> Your objective is to determine whether any vulnerabilities \\r\\n\\r\\nexist that, if exploited, can grant access to the blog''s server.<br /> <br /> Hint: A \\r\\n\\r\\nspecially-tailored backdoor shell can be found at \"<a href=\\r\\n\\r\\n\"http://www.really_nasty_hacker.com/shell.txt\" target=\"_blank\\r\\n\\r\\n\">http://www.really_nasty_hacker.com/shell.txt</a>\".', 'Andreas Venieris,\\n        \\r\\n\\r\\nKonstantinos Papapanagiotou,\\n        Anastasios Stasinopoulos,\\n        Vasilios Vlachos,\\r\\n\\r\\n\\n        Alexandros Papanikolaou', 'web', '2012-08-09 00:31:31', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Challenge 10', 'ch010', 'Would you like to become an active hacker ?<br /> How about \\r\\n\\r\\nbecoming a member of the world''s largest hacker group:<br /> The n1nJ4.n4x0rZ.CreW!<br /> \\r\\n\\r\\n<br /> Before you can join though, you ''ll have to prove yourself worthy by passing the \\r\\n\\r\\ntest that can be found at: <a href=\"ch010/\" target=\"_blank\\r\\n\\r\\n\">http://n1nj4h4x0rzcr3w.com</a><br /> <br /> If you succeed in completing the challenge, \\r\\n\\r\\nyou will get a serial  number, which you will use for obtaining the password that will \\r\\n\\r\\nenable  you to join the group.<br /> <br /> Your objective is to bypass the authentication \\r\\n\\r\\nmechanism, find the  serial number and be supplied with your own username and password from \\r\\n\\r\\n the admin team of the site.', 'Andreas Venieris,\\n        Konstantinos Papapanagiotou,\\n    \\r\\n\\r\\n    Anastasios Stasinopoulos,\\n        Vasilios Vlachos,\\n        Alexandros \\r\\n\\r\\nPapanikolaou', 'web', '2012-08-09 00:32:07', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Example Template For Challenge xml Files creation', 'example', '<p>Insert some text describing the scenario of the challenge(what the users are supposed to do and if there is any fictional story)</p>', 'Name or email or both', 'In what category does your challenge belong?(web? crypto? networks?)', '2012-10-16 22:35:01', 'private', 0, NULL, '1', 60, NULL, NULL, 'private', 1, 0),\r\n('cookiEng', 'cookiEng', '<p>Hello, we have heard that you are one of the best hackers in our country. We need your services.<br>You must visit an underground site and find<br> the right password. With this password we will cancel 100k+ illegal gun and drug deals!\\n The good news are that we have the  directory where the password is stored. Its here \\\\\\\"/t0psec.php\\\\\\\".\\n The bad news are that we have no access there. Only the administrator does. Go and find the password for us!<br><br><br>Good luck!</p>', 'Nikos Danopoulos', 'web', '2012-08-09 00:32:07', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 1, 60),\r\n('Izon Challenge', 'izon', '<p>After the mysterious disappearance of your best friend, you are contacted by an unknown individual who claims to have information about your friend. This individual identifies himself as \\\"Mister Jax\\\" and claims that is a former colleague of your friend.</p><p>Your friend was working at Izon Corporation, a weapons manufactured and government contractor as a systems engineer. Mister Jax didn\\'t tell you his role in Izon, but wants you to pass through a series of tests to infiltrate Izon\\'s web security to find the truth about your friend</p><p>After much consideration you agree with Mister Jax and he, remotely, sets up your computer to look like as if it is a part of Izon\\'s Virtual Private Network in order to access their site. He also said that he\\'ll guide you while you work your way to uncover the truth about your lost friend</p><p>Here is a copy of Mister Jax\\'s last email:</p><p><pre>The task is simple: You get in, get your information and get out.\\r\\nYour friend was either a dumb programmer or a brilliant one, he left\\r\\nmany holes to be exploited in order to gain higher access to the site.\\r\\nI\\'ll be guiding you with tips while you try to hack through Izon\\'s site.\\r\\nThere are four tasks, some related to each other, some not.\\r\\nYou need to use your skills to overcome the obstacles, knowledge will come along.\\r\\nSixty minutes will suffice. When they\\'re over, I won\\'t be able to offer any\\r\\ncover to you, and you\\'ll be compromised, with unknown consequences, I\\'m afraid.\\r\\nI\\'ll be seeing you there.\\r\\n\\r\\   - Jax</pre></p>\t<p>Once you get in, you\\'ll have sixty minutes to complete this challenge. Use common sense, remember that the most obvious place hides the most important stuff and try to behave as if you were hacking a real system.</p><p>Good Luck!</p>', 'Vasileios Mplanas', 'web', '2014-03-27 00:00:00', 'public', 1, NULL, '1', 60, NULL, NULL, 'public', 10, 60);\r\n-- --------------------------------------------------------\r\n\r\n--\r\n-- Table structure for table `challenge_attempts`\r\n--\r\n\r\nCREATE TABLE IF NOT EXISTS `challenge_attempts` (\r\n  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n  `user_id` int(11) NOT NULL,\r\n  `challenge_id` int(11) NOT NULL,\r\n  `time` datetime NOT NULL,\r\n  `status` varchar(255) NOT NULL,\r\n  PRIMARY KEY (`id`)\r\n);\r\n\r\n-- --------------------------------------------------------\r\n\r\n--\r\n-- Table structure for table `challenge_attempt_count`\r\n--\r\n\r\nCREATE TABLE IF NOT EXISTS `challenge_attempt_count` (\r\n  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n  `user_id` int(11) NOT NULL,\r\n  `challenge_id` int(11) NOT NULL,\r\n  `tries` int(11) DEFAULT NULL,\r\n  PRIMARY KEY (`id`),\r\n  UNIQUE KEY `user_id` (`user_id`),\r\n  UNIQUE KEY `challenge_id` (`challenge_id`)\r\n);\r\n-- --------------------------------------------------------\r\n\r\n--\r\n-- Table structure for table `classes`\r\n--\r\n\r\nCREATE TABLE IF NOT EXISTS `classes` (\r\n  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n  `name` varchar(255) NOT NULL,\r\n  `date_created` datetime NOT NULL,\r\n  `archive` int(1) DEFAULT '0',\r\n  PRIMARY KEY (`id`)\r\n);\r\n\r\n--\r\n-- Dumping data for table `classes`\r\n--\r\n\r\nINSERT INTO `classes` (`name`, `date_created`, `archive`) VALUES\r\n('Sample Class', '2012-08-09 00:43:48', 0),\r\n('fooClass', '2012-10-16 22:32:43', 0);\r\n\r\n-- --------------------------------------------------------\r\n\r\n--\r\n-- Table structure for table `class_challenges`\r\n--\r\n\r\nCREATE TABLE IF NOT EXISTS `class_challenges` (\r\n  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n  `challenge_id` int(11) NOT NULL,\r\n  `class_id` int(11) NOT NULL,\r\n  `date_created` datetime NOT NULL,\r\n  PRIMARY KEY (`id`)\r\n);\r\n\r\n--\r\n-- Dumping data for table `class_challenges`\r\n--\r\n\r\nINSERT INTO `class_challenges` (`challenge_id`, `class_id`, `date_created`) VALUES\r\n(1, 1, '2012-08-09 01:01:07'),\r\n(2, 1, '2012-08-09 01:01:07'),\r\n(3, 1, '2012-08-09 01:01:07'),\r\n(4, 1, '2012-08-09 01:01:07'),\r\n(5, 1, '2012-08-09 01:01:07'),\r\n(6, 1, '2012-08-09 01:01:07'),\r\n(7, 1, '2012-08-09 01:01:07'),\r\n(9, 1, '2012-08-09 01:01:07'),\r\n(10, 1, '2012-08-09 01:01:07'),\r\n(1, 2, '2012-10-16 22:32:49'),\r\n(4, 2, '2012-10-16 22:32:52'),\r\n(9, 2, '2012-10-16 22:32:53'),\r\n(10, 2, '2012-10-16 22:32:55'),\r\n(8, 2, '2012-10-16 22:32:58');\r\n\r\n-- --------------------------------------------------------\r\n\r\n--\r\n-- Table structure for table `class_memberships`\r\n--\r\n\r\nCREATE TABLE IF NOT EXISTS `class_memberships` (\r\n  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n  `user_id` int(11) NOT NULL,\r\n  `class_id` int(11) NOT NULL,\r\n  `date_created` datetime NOT NULL,\r\n  PRIMARY KEY (`user_id`,`class_id`),\r\n  UNIQUE KEY `id` (`id`)\r\n);\r\n\r\n--\r\n-- Dumping data for table `class_memberships`\r\n--\r\n\r\nINSERT INTO `class_memberships` (`user_id`, `class_id`, `date_created`) VALUES\r\n( 1, 1, '2012-08-09 00:59:00'),\r\n( 2, 1, '2012-08-09 00:59:00'),\r\n( 3, 1, '2012-08-09 00:59:00'),\r\n( 4, 2, '2012-10-16 22:33:07'),\r\n( 5, 2, '2012-10-16 22:33:13');\r\n\r\n-- --------------------------------------------------------\r\n\r\n--\r\n-- Table structure for table `users`\r\n--\r\n\r\nCREATE TABLE IF NOT EXISTS `users` (\r\n  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n  `username` varchar(255) NOT NULL,\r\n  `full_name` varchar(255) NOT NULL,\r\n  `email` varchar(100) NOT NULL,\r\n  `password` varchar(255) NOT NULL,\r\n  `joined` datetime NOT NULL,\r\n  `last_visit` datetime DEFAULT NULL,\r\n  `is_activated` int(1) DEFAULT '0',\r\n  `type` int(10) DEFAULT '0',\r\n  `token` int(10) DEFAULT '0',\r\n  PRIMARY KEY (`username`),\r\n  UNIQUE KEY `id` (`id`)\r\n);\r\n\r\n--\r\n-- Dumping data for table `users`\r\n--\r\n\r\nINSERT INTO `users` (`username`, `full_name`, `email`, `password`, `joined`, `last_visit`, `is_activated`, `type`, `token`) VALUES\r\n('bar', 'mr. bar', 'bar@owasp.com', '$P$BJ8UtXZYqS/Lokm8zFMwcxO8dq797P.', '2012-10-16 22:12:52', '2012-10-16 22:22:39', 0, 0, 0),\r\n('foo', 'mr. foo', 'foo@owasp.com', '$P$BxCHeVG1RMF06UxwRbrVQtPA1yOwAq.', '2012-10-16 22:12:34', '2012-10-16 22:59:29', 0, 0, 0),\r\n('sensei', 'waspy sifu', 'waspy@owasp.sifu', '$P$Bj/JtLJJR3bUD0LLWXL2UW9DuRVo0I.', '2012-10-16 22:36:06', '2012-10-16 22:37:04', 1, 2, 0);\r\n\r\n--\r\n-- Table structure for table `user_has_challenge_token`\r\n--\r\nDROP TABLE IF EXISTS `user_has_challenge_token`;\r\nCREATE TABLE IF NOT EXISTS `user_has_challenge_token` (\r\n  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n  `user_id` varchar(512) NOT NULL,\r\n  `challenge_id` varchar(512) NOT NULL,\r\n  `token` varchar(256) NOT NULL,\r\n  PRIMARY KEY (`id`)\r\n);\r\n\r\nSHOW WARNINGS;\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/drop_stuff.sql",
    "content": "drop procedure who_called_me;\ndrop package body linguist_package;\ndrop package linguist_package;\ndrop function functionname1;\n\ndrop table x;\ndrop table y cascade;\n\ndrop type typename1;\ndrop type typename2;\n\ndrop view viewname1;\ndrop view viewname2;\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/dual.sql",
    "content": "--this is the most basic oracle sql command\nselect * from dual;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/filial.tab",
    "content": "create table FILIAL\n(\n  id          NUMBER not null,\n  title_ua    VARCHAR2(128) not null,\n  title_ru    VARCHAR2(128) not null,\n  title_eng   VARCHAR2(128) not null,\n  remove_date DATE,\n  modify_date DATE,\n  modify_user VARCHAR2(128)\n)\n;\nalter table FILIAL\n  add constraint PK_ID primary key (ID);\ngrant select on FILIAL to ATOLL;\ngrant select on FILIAL to CRAMER2GIS;\ngrant select on FILIAL to DMS;\ngrant select on FILIAL to HPSM2GIS;\ngrant select on FILIAL to PLANMONITOR;\ngrant select on FILIAL to SIEBEL;\ngrant select on FILIAL to VBIS;\ngrant select on FILIAL to VPORTAL;\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/hostcache_set_state.inc",
    "content": "# Helper for hostcache_*.test\n\n# Set a known initial state for the test\n\nflush status;\nflush hosts;\nflush user_resources;\nflush privileges;\n\n# Print critical setup\n\nselect @@global.debug;\nselect @@global.max_connect_errors;\nselect @@global.max_user_connections;\nselect @@global.max_connections;\n\n# Make sure there are no remaining records that can change the test outcome\n\nselect `User`, `Host` from mysql.`user` where `host` like '%\\\\%%';\nselect `User`, `Host` from mysql.`user` where `user` like '192.%';\nselect `User`, `Host` from mysql.`user` where `user` like '2001:%';\nselect `User`, `Host` from mysql.`user` where `user` like 'santa.claus.%';\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/object-update.udf",
    "content": "\r\nif not exists(select * from sysobjects where name = '%object_name%' and type in (N'FN', N'IF', N'TF', N'FS', N'FT'))\r\n  exec('create FUNCTION dbo.%object_name%() returns int as begin return null end')\r\nGO\r\n\r\n%object_ddl%\r\n\r\ngo\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/suspendedtoday.viw",
    "content": "use translog;\nDROP VIEW IF EXISTS `suspendedtoday`;\n\ncreate view suspendedtoday as\nselect * from suspended \nwhere datediff(datetime, now()) = 0; \n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/videodb.cql",
    "content": "CREATE KEYSPACE videodb WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };\n\nuse videodb;\n\n// Basic entity table\n// Object mapping ?\nCREATE TABLE users (\n   username varchar,\n   firstname varchar,\n   lastname varchar,\n   email varchar,\n   password varchar,\n   created_date timestamp,\n   total_credits int,\n   credit_change_date timeuuid,\n   PRIMARY KEY (username)\n);\n\n// One-to-many entity table\nCREATE TABLE videos (\n   videoid uuid,\n   videoname varchar,\n   username varchar,\n   description varchar, \n   tags list<varchar>,\n   upload_date timestamp,\n   PRIMARY KEY (videoid)\n);\n\n// One-to-many from the user point of view\n// Also know as a lookup table\nCREATE TABLE username_video_index (\n   username varchar,\n   videoid uuid,\n   upload_date timestamp,\n   videoname varchar,\n   PRIMARY KEY (username, videoid)\n);\n\n// Counter table\nCREATE TABLE video_rating (\n   videoid uuid,\n   rating_counter counter,\n   rating_total counter,\n   PRIMARY KEY (videoid)\n);\n\n// Creating index tables for tab keywords\nCREATE TABLE tag_index (\n   tag varchar, \n   videoid uuid,\n   timestamp timestamp,\n   PRIMARY KEY (tag, videoid)\n);\n\n// Comments as a many-to-many \n// Looking from the video side to many users\nCREATE TABLE comments_by_video (\n   videoid uuid,\n   username varchar,\n   comment_ts timestamp,\n   comment varchar,\n   PRIMARY KEY (videoid,comment_ts,username)\n) WITH CLUSTERING ORDER BY (comment_ts DESC, username ASC);\n\n// looking from the user side to many videos\nCREATE TABLE comments_by_user (\n   username varchar,\n   videoid uuid,\n   comment_ts timestamp,\n   comment varchar,\n   PRIMARY KEY (username,comment_ts,videoid)\n) WITH CLUSTERING ORDER BY (comment_ts DESC, videoid ASC);\n\n\n// Time series wide row with reverse comparator\nCREATE TABLE video_event (\n   videoid uuid,\n   username varchar,\n   event varchar,\n   event_timestamp timeuuid,\n   video_timestamp bigint,\n   PRIMARY KEY ((videoid,username), event_timestamp,event)\n) WITH CLUSTERING ORDER BY (event_timestamp DESC,event ASC);\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/videodb.ddl",
    "content": "CREATE KEYSPACE videodb WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };\n\nuse videodb;\n\n// Basic entity table\n// Object mapping ?\nCREATE TABLE users (\n   username varchar,\n   firstname varchar,\n   lastname varchar,\n   email varchar,\n   password varchar,\n   created_date timestamp,\n   total_credits int,\n   credit_change_date timeuuid,\n   PRIMARY KEY (username)\n);\n\n// One-to-many entity table\nCREATE TABLE videos (\n   videoid uuid,\n   videoname varchar,\n   username varchar,\n   description varchar, \n   tags list<varchar>,\n   upload_date timestamp,\n   PRIMARY KEY (videoid)\n);\n\n// One-to-many from the user point of view\n// Also know as a lookup table\nCREATE TABLE username_video_index (\n   username varchar,\n   videoid uuid,\n   upload_date timestamp,\n   videoname varchar,\n   PRIMARY KEY (username, videoid)\n);\n\n// Counter table\nCREATE TABLE video_rating (\n   videoid uuid,\n   rating_counter counter,\n   rating_total counter,\n   PRIMARY KEY (videoid)\n);\n\n// Creating index tables for tab keywords\nCREATE TABLE tag_index (\n   tag varchar, \n   videoid uuid,\n   timestamp timestamp,\n   PRIMARY KEY (tag, videoid)\n);\n\n// Comments as a many-to-many \n// Looking from the video side to many users\nCREATE TABLE comments_by_video (\n   videoid uuid,\n   username varchar,\n   comment_ts timestamp,\n   comment varchar,\n   PRIMARY KEY (videoid,comment_ts,username)\n) WITH CLUSTERING ORDER BY (comment_ts DESC, username ASC);\n\n// looking from the user side to many videos\nCREATE TABLE comments_by_user (\n   username varchar,\n   videoid uuid,\n   comment_ts timestamp,\n   comment varchar,\n   PRIMARY KEY (username,comment_ts,videoid)\n) WITH CLUSTERING ORDER BY (comment_ts DESC, videoid ASC);\n\n\n// Time series wide row with reverse comparator\nCREATE TABLE video_event (\n   videoid uuid,\n   username varchar,\n   event varchar,\n   event_timestamp timeuuid,\n   video_timestamp bigint,\n   PRIMARY KEY ((videoid,username), event_timestamp,event)\n) WITH CLUSTERING ORDER BY (event_timestamp DESC,event ASC);\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQL/zipcodes.uk.mysql",
    "content": "-- This information is public domain and comes from http://www.npemap.org.uk/ see http://drupal.org/node/19482\n-- This script was built using data from http://www.jibble.org/ukpostcodes/ and http://www.npemap.org.uk/data/outward1list\n\nINSERT INTO zipcodes (zip, city, state, latitude, longitude, timezone, dst, country) VALUES\n('AB10', '', '', '57.135', '-2.117', 0, 1, 'uk'),\n('AB11', '', '', '57.138', '-2.092', 0, 1, 'uk'),\n('AB12', '', '', '57.101', '-2.111', 0, 1, 'uk'),\n('AB13', '', '', '57.108', '-2.237', 0, 1, 'uk'),\n('AB14', '', '', '57.101', '-2.27', 0, 1, 'uk'),\n('AB15', '', '', '57.138', '-2.164', 0, 1, 'uk'),\n('AB16', '', '', '57.161', '-2.156', 0, 1, 'uk'),\n('AB21', '', '', '57.21', '-2.2', 0, 1, 'uk'),\n('AB22', '', '', '57.187', '-2.119', 0, 1, 'uk'),\n('AB23', '', '', '57.212', '-2.088', 0, 1, 'uk'),\n('AB24', '', '', '57.174638', '-2.036434', 0, 1, 'uk'),\n('AB25', '', '', '57.153', '-2.112', 0, 1, 'uk'),\n('AB3', '', '', '56.966462', '-2.225953', 0, 1, 'uk'),\n('AB30', '', '', '56.847', '-2.477', 0, 1, 'uk'),\n('AB31', '', '', '57.074', '-2.527', 0, 1, 'uk'),\n('AB32', '', '', '57.156', '-2.317', 0, 1, 'uk'),\n('AB33', '', '', '57.225', '-2.741', 0, 1, 'uk'),\n('AB34', '', '', '57.094', '-2.812', 0, 1, 'uk'),\n('AB35', '', '', '57.038', '-3.149', 0, 1, 'uk'),\n('AB36', '', '', '57.197', '-3.067', 0, 1, 'uk'),\n('AB37', '', '', '57.331', '-3.351', 0, 1, 'uk'),\n('AB38', '', '', '57.486', '-3.225', 0, 1, 'uk'),\n('AB39', '', '', '56.978', '-2.217', 0, 1, 'uk'),\n('AB41', '', '', '57.376', '-2.105', 0, 1, 'uk'),\n('AB42', '', '', '57.501', '-1.888', 0, 1, 'uk'),\n('AB43', '', '', '57.658', '-2.043', 0, 1, 'uk'),\n('AB44', '', '', '57.669', '-2.492', 0, 1, 'uk'),\n('AB45', '', '', '57.651', '-2.566', 0, 1, 'uk'),\n('AB51', '', '', '57.289', '-2.405', 0, 1, 'uk'),\n('AB52', '', '', '57.344', '-2.607', 0, 1, 'uk'),\n('AB53', '', '', '57.525', '-2.393', 0, 1, 'uk'),\n('AB54', '', '', '57.454', '-2.763', 0, 1, 'uk'),\n('AB55', '', '', '57.524', '-2.99', 0, 1, 'uk'),\n('AB56', '', '', '57.675', '-2.926', 0, 1, 'uk'),\n('AB64', '', '', '57.356073', '-2.764582', 0, 1, 'uk'),\n('AL1', '', '', '51.748', '-0.322', 0, 1, 'uk'),\n('AL10', '', '', '51.76', '-0.23', 0, 1, 'uk'),\n('AL2', '', '', '51.72', '-0.333', 0, 1, 'uk'),\n('AL3', '', '', '51.778', '-0.37', 0, 1, 'uk'),\n('AL4', '', '', '51.772', '-0.294', 0, 1, 'uk'),\n('AL5', '', '', '51.816', '-0.351', 0, 1, 'uk'),\n('AL6', '', '', '51.831', '-0.197', 0, 1, 'uk'),\n('AL7', '', '', '51.797', '-0.186', 0, 1, 'uk'),\n('AL8', '', '', '51.803', '-0.209', 0, 1, 'uk'),\n('AL9', '', '', '51.745', '-0.199', 0, 1, 'uk'),\n('B1', '', '', '52.478', '-1.907', 0, 1, 'uk'),\n('B10', '', '', '52.47', '-1.851', 0, 1, 'uk'),\n('B11', '', '', '52.454', '-1.858', 0, 1, 'uk'),\n('B12', '', '', '52.46', '-1.882', 0, 1, 'uk'),\n('B13', '', '', '52.437', '-1.878', 0, 1, 'uk'),\n('B14', '', '', '52.417', '-1.889', 0, 1, 'uk'),\n('B15', '', '', '52.467', '-1.924', 0, 1, 'uk'),\n('B16', '', '', '52.476', '-1.933', 0, 1, 'uk'),\n('B17', '', '', '52.461', '-1.961', 0, 1, 'uk'),\n('B18', '', '', '52.491', '-1.924', 0, 1, 'uk'),\n('B19', '', '', '52.496', '-1.905', 0, 1, 'uk'),\n('B2', '', '', '52.479', '-1.897', 0, 1, 'uk'),\n('B20', '', '', '52.514', '-1.918', 0, 1, 'uk'),\n('B21', '', '', '52.506', '-1.939', 0, 1, 'uk'),\n('B23', '', '', '52.528', '-1.854', 0, 1, 'uk'),\n('B24', '', '', '52.519', '-1.827', 0, 1, 'uk'),\n('B25', '', '', '52.465', '-1.82', 0, 1, 'uk'),\n('B26', '', '', '52.461', '-1.79', 0, 1, 'uk'),\n('B27', '', '', '52.445', '-1.822', 0, 1, 'uk'),\n('B28', '', '', '52.427', '-1.842', 0, 1, 'uk'),\n('B29', '', '', '52.437', '-1.947', 0, 1, 'uk'),\n('B3', '', '', '52.48', '-1.902', 0, 1, 'uk'),\n('B30', '', '', '52.422', '-1.927', 0, 1, 'uk'),\n('B31', '', '', '52.408', '-1.972', 0, 1, 'uk'),\n('B32', '', '', '52.448', '-1.993', 0, 1, 'uk'),\n('B33', '', '', '52.48', '-1.787', 0, 1, 'uk'),\n('B34', '', '', '52.496', '-1.781', 0, 1, 'uk'),\n('B35', '', '', '52.519', '-1.788', 0, 1, 'uk'),\n('B36', '', '', '52.504', '-1.779', 0, 1, 'uk'),\n('B37', '', '', '52.478', '-1.741', 0, 1, 'uk'),\n('B38', '', '', '52.4', '-1.933', 0, 1, 'uk'),\n('B4', '', '', '52.482', '-1.894', 0, 1, 'uk'),\n('B40', '', '', '52.459', '-1.722', 0, 1, 'uk'),\n('B42', '', '', '52.533', '-1.911', 0, 1, 'uk'),\n('B43', '', '', '52.548', '-1.929', 0, 1, 'uk'),\n('B44', '', '', '52.545', '-1.884', 0, 1, 'uk'),\n('B45', '', '', '52.388', '-2.009', 0, 1, 'uk'),\n('B46', '', '', '52.508', '-1.694', 0, 1, 'uk'),\n('B47', '', '', '52.387', '-1.88', 0, 1, 'uk'),\n('B48', '', '', '52.355', '-1.948', 0, 1, 'uk'),\n('B49', '', '', '52.217', '-1.867', 0, 1, 'uk'),\n('B5', '', '', '52.47', '-1.896', 0, 1, 'uk'),\n('B50', '', '', '52.169', '-1.854', 0, 1, 'uk'),\n('B6', '', '', '52.504', '-1.885', 0, 1, 'uk'),\n('B60', '', '', '52.326', '-2.049', 0, 1, 'uk'),\n('B61', '', '', '52.345', '-2.067', 0, 1, 'uk'),\n('B62', '', '', '52.456', '-2.032', 0, 1, 'uk'),\n('B63', '', '', '52.452', '-2.067', 0, 1, 'uk'),\n('B64', '', '', '52.472', '-2.068', 0, 1, 'uk'),\n('B65', '', '', '52.483', '-2.042', 0, 1, 'uk'),\n('B66', '', '', '52.493', '-1.964', 0, 1, 'uk'),\n('B67', '', '', '52.486', '-1.977', 0, 1, 'uk'),\n('B68', '', '', '52.479', '-2', 0, 1, 'uk'),\n('B69', '', '', '52.502', '-2.028', 0, 1, 'uk'),\n('B7', '', '', '52.493', '-1.873', 0, 1, 'uk'),\n('B70', '', '', '52.52', '-2.003', 0, 1, 'uk'),\n('B71', '', '', '52.535', '-1.989', 0, 1, 'uk'),\n('B72', '', '', '52.552', '-1.821', 0, 1, 'uk'),\n('B73', '', '', '52.552', '-1.841', 0, 1, 'uk'),\n('B74', '', '', '52.583', '-1.858', 0, 1, 'uk'),\n('B75', '', '', '52.578', '-1.809', 0, 1, 'uk'),\n('B76', '', '', '52.545', '-1.785', 0, 1, 'uk'),\n('B77', '', '', '52.618', '-1.667', 0, 1, 'uk'),\n('B78', '', '', '52.606', '-1.673', 0, 1, 'uk'),\n('B79', '', '', '52.65', '-1.681', 0, 1, 'uk'),\n('B8', '', '', '52.49', '-1.84', 0, 1, 'uk'),\n('B80', '', '', '52.277', '-1.895', 0, 1, 'uk'),\n('B9', '', '', '52.478', '-1.849', 0, 1, 'uk'),\n('B90', '', '', '52.4', '-1.824', 0, 1, 'uk'),\n('B91', '', '', '52.413', '-1.782', 0, 1, 'uk'),\n('B92', '', '', '52.436', '-1.774', 0, 1, 'uk'),\n('B93', '', '', '52.38', '-1.743', 0, 1, 'uk'),\n('B94', '', '', '52.351', '-1.791', 0, 1, 'uk'),\n('B95', '', '', '52.285', '-1.779', 0, 1, 'uk'),\n('B96', '', '', '52.252', '-1.96', 0, 1, 'uk'),\n('B97', '', '', '52.299', '-1.954', 0, 1, 'uk'),\n('B98', '', '', '52.303', '-1.914', 0, 1, 'uk'),\n('BA1', '', '', '51.391', '-2.36', 0, 1, 'uk'),\n('BA10', '', '', '51.113', '-2.446', 0, 1, 'uk'),\n('BA11', '', '', '51.236', '-2.325', 0, 1, 'uk'),\n('BA12', '', '', '51.171', '-2.187', 0, 1, 'uk'),\n('BA13', '', '', '51.262', '-2.179', 0, 1, 'uk'),\n('BA14', '', '', '51.318', '-2.201', 0, 1, 'uk'),\n('BA15', '', '', '51.351', '-2.265', 0, 1, 'uk'),\n('BA16', '', '', '51.125', '-2.743', 0, 1, 'uk'),\n('BA2', '', '', '51.36', '-2.377', 0, 1, 'uk'),\n('BA20', '', '', '50.938', '-2.642', 0, 1, 'uk'),\n('BA21', '', '', '50.951', '-2.633', 0, 1, 'uk'),\n('BA22', '', '', '50.968', '-2.637', 0, 1, 'uk'),\n('BA3', '', '', '51.275', '-2.473', 0, 1, 'uk'),\n('BA4', '', '', '51.171', '-2.531', 0, 1, 'uk'),\n('BA5', '', '', '51.212', '-2.653', 0, 1, 'uk'),\n('BA6', '', '', '51.141', '-2.705', 0, 1, 'uk'),\n('BA7', '', '', '51.089', '-2.518', 0, 1, 'uk'),\n('BA8', '', '', '50.999', '-2.411', 0, 1, 'uk'),\n('BA9', '', '', '51.057', '-2.409', 0, 1, 'uk'),\n('BB1', '', '', '53.756', '-2.462', 0, 1, 'uk'),\n('BB10', '', '', '53.799', '-2.219', 0, 1, 'uk'),\n('BB11', '', '', '53.783', '-2.252', 0, 1, 'uk'),\n('BB12', '', '', '53.803', '-2.29', 0, 1, 'uk'),\n('BB18', '', '', '53.914', '-2.171', 0, 1, 'uk'),\n('BB2', '', '', '53.741', '-2.5', 0, 1, 'uk'),\n('BB3', '', '', '53.698', '-2.465', 0, 1, 'uk'),\n('BB4', '', '', '53.703', '-2.29', 0, 1, 'uk'),\n('BB5', '', '', '53.754', '-2.371', 0, 1, 'uk'),\n('BB6', '', '', '53.792', '-2.417', 0, 1, 'uk'),\n('BB7', '', '', '53.874', '-2.386', 0, 1, 'uk'),\n('BB8', '', '', '53.858', '-2.163', 0, 1, 'uk'),\n('BB9', '', '', '53.837', '-2.214', 0, 1, 'uk'),\n('BD1', '', '', '53.796', '-1.752', 0, 1, 'uk'),\n('BD10', '', '', '53.832', '-1.725', 0, 1, 'uk'),\n('BD11', '', '', '53.751', '-1.676', 0, 1, 'uk'),\n('BD12', '', '', '53.746', '-1.761', 0, 1, 'uk'),\n('BD13', '', '', '53.786', '-1.859', 0, 1, 'uk'),\n('BD14', '', '', '53.782', '-1.816', 0, 1, 'uk'),\n('BD15', '', '', '53.81', '-1.836', 0, 1, 'uk'),\n('BD16', '', '', '53.849', '-1.833', 0, 1, 'uk'),\n('BD17', '', '', '53.847', '-1.767', 0, 1, 'uk'),\n('BD18', '', '', '53.831', '-1.776', 0, 1, 'uk'),\n('BD19', '', '', '53.727', '-1.712', 0, 1, 'uk'),\n('BD2', '', '', '53.814', '-1.734', 0, 1, 'uk'),\n('BD20', '', '', '53.897', '-1.947', 0, 1, 'uk'),\n('BD21', '', '', '53.864', '-1.906', 0, 1, 'uk'),\n('BD22', '', '', '53.846', '-1.952', 0, 1, 'uk'),\n('BD23', '', '', '53.993', '-2.054', 0, 1, 'uk'),\n('BD24', '', '', '54.077', '-2.274', 0, 1, 'uk'),\n('BD3', '', '', '53.798', '-1.727', 0, 1, 'uk'),\n('BD4', '', '', '53.776', '-1.718', 0, 1, 'uk'),\n('BD5', '', '', '53.778', '-1.758', 0, 1, 'uk'),\n('BD6', '', '', '53.765', '-1.783', 0, 1, 'uk'),\n('BD7', '', '', '53.783', '-1.782', 0, 1, 'uk'),\n('BD8', '', '', '53.801', '-1.781', 0, 1, 'uk'),\n('BD9', '', '', '53.812', '-1.789', 0, 1, 'uk'),\n('BH1', '', '', '50.724', '-1.86', 0, 1, 'uk'),\n('BH10', '', '', '50.759', '-1.891', 0, 1, 'uk'),\n('BH11', '', '', '50.761', '-1.917', 0, 1, 'uk'),\n('BH12', '', '', '50.737', '-1.926', 0, 1, 'uk'),\n('BH13', '', '', '50.71', '-1.917', 0, 1, 'uk'),\n('BH14', '', '', '50.721', '-1.944', 0, 1, 'uk'),\n('BH15', '', '', '50.722', '-1.984', 0, 1, 'uk'),\n('BH16', '', '', '50.738', '-2.044', 0, 1, 'uk'),\n('BH17', '', '', '50.746', '-1.975', 0, 1, 'uk'),\n('BH18', '', '', '50.758', '-1.993', 0, 1, 'uk'),\n('BH19', '', '', '50.611', '-1.97', 0, 1, 'uk'),\n('BH2', '', '', '50.721', '-1.881', 0, 1, 'uk'),\n('BH20', '', '', '50.686', '-2.146', 0, 1, 'uk'),\n('BH21', '', '', '50.812', '-1.973', 0, 1, 'uk'),\n('BH22', '', '', '50.805', '-1.887', 0, 1, 'uk'),\n('BH23', '', '', '50.746', '-1.754', 0, 1, 'uk'),\n('BH24', '', '', '50.844', '-1.786', 0, 1, 'uk'),\n('BH25', '', '', '50.752', '-1.657', 0, 1, 'uk'),\n('BH3', '', '', '50.735', '-1.88', 0, 1, 'uk'),\n('BH31', '', '', '50.876', '-1.872', 0, 1, 'uk'),\n('BH4', '', '', '50.721', '-1.898', 0, 1, 'uk'),\n('BH5', '', '', '50.725', '-1.834', 0, 1, 'uk'),\n('BH6', '', '', '50.727', '-1.804', 0, 1, 'uk'),\n('BH7', '', '', '50.735', '-1.831', 0, 1, 'uk'),\n('BH8', '', '', '50.74', '-1.851', 0, 1, 'uk'),\n('BH9', '', '', '50.749', '-1.871', 0, 1, 'uk'),\n('BL0', '', '', '53.646', '-2.315', 0, 1, 'uk'),\n('BL1', '', '', '53.59', '-2.444', 0, 1, 'uk'),\n('BL2', '', '', '53.588', '-2.395', 0, 1, 'uk'),\n('BL3', '', '', '53.565', '-2.431', 0, 1, 'uk'),\n('BL4', '', '', '53.547', '-2.4', 0, 1, 'uk'),\n('BL5', '', '', '53.549', '-2.515', 0, 1, 'uk'),\n('BL6', '', '', '53.592', '-2.539', 0, 1, 'uk'),\n('BL7', '', '', '53.63', '-2.421', 0, 1, 'uk'),\n('BL8', '', '', '53.605', '-2.327', 0, 1, 'uk'),\n('BL9', '', '', '53.592', '-2.286', 0, 1, 'uk'),\n('BN1', '', '', '50.839', '-0.138', 0, 1, 'uk'),\n('BN10', '', '', '50.795', '0.003', 0, 1, 'uk'),\n('BN11', '', '', '50.813', '-0.376', 0, 1, 'uk'),\n('BN12', '', '', '50.813', '-0.425', 0, 1, 'uk'),\n('BN13', '', '', '50.83', '-0.405', 0, 1, 'uk'),\n('BN14', '', '', '50.832', '-0.38', 0, 1, 'uk'),\n('BN15', '', '', '50.83', '-0.324', 0, 1, 'uk'),\n('BN16', '', '', '50.814', '-0.494', 0, 1, 'uk'),\n('BN17', '', '', '50.814', '-0.535', 0, 1, 'uk'),\n('BN18', '', '', '50.848', '-0.579', 0, 1, 'uk'),\n('BN2', '', '', '50.824', '-0.103', 0, 1, 'uk'),\n('BN20', '', '', '50.774', '0.255', 0, 1, 'uk'),\n('BN21', '', '', '50.773', '0.277', 0, 1, 'uk'),\n('BN22', '', '', '50.788', '0.284', 0, 1, 'uk'),\n('BN23', '', '', '50.798', '0.314', 0, 1, 'uk'),\n('BN24', '', '', '50.816', '0.331', 0, 1, 'uk'),\n('BN25', '', '', '50.776', '0.11', 0, 1, 'uk'),\n('BN26', '', '', '50.821', '0.223', 0, 1, 'uk'),\n('BN27', '', '', '50.871', '0.265', 0, 1, 'uk'),\n('BN3', '', '', '50.835', '-0.174', 0, 1, 'uk'),\n('BN4', '', '', '50.833577', '-0.220172', 0, 1, 'uk'),\n('BN41', '', '', '50.84', '-0.215', 0, 1, 'uk'),\n('BN42', '', '', '50.837', '-0.231', 0, 1, 'uk'),\n('BN43', '', '', '50.836', '-0.266', 0, 1, 'uk'),\n('BN44', '', '', '50.89', '-0.322', 0, 1, 'uk'),\n('BN45', '', '', '50.889', '-0.185', 0, 1, 'uk'),\n('BN5', '', '', '50.927', '-0.268', 0, 1, 'uk'),\n('BN6', '', '', '50.929', '-0.152', 0, 1, 'uk'),\n('BN7', '', '', '50.877', '0.001', 0, 1, 'uk'),\n('BN8', '', '', '50.913', '0.052', 0, 1, 'uk'),\n('BN9', '', '', '50.795', '0.051', 0, 1, 'uk'),\n('BR1', '', '', '51.411', '0.022', 0, 1, 'uk'),\n('BR2', '', '', '51.389', '0.023', 0, 1, 'uk'),\n('BR3', '', '', '51.403', '-0.031', 0, 1, 'uk'),\n('BR4', '', '', '51.375', '-0.007', 0, 1, 'uk'),\n('BR5', '', '', '51.39', '0.104', 0, 1, 'uk'),\n('BR6', '', '', '51.366', '0.094', 0, 1, 'uk'),\n('BR7', '', '', '51.41', '0.072', 0, 1, 'uk'),\n('BR8', '', '', '51.398', '0.176', 0, 1, 'uk'),\n('BS1', '', '', '51.453', '-2.593', 0, 1, 'uk'),\n('BS10', '', '', '51.506', '-2.61', 0, 1, 'uk'),\n('BS11', '', '', '51.497', '-2.675', 0, 1, 'uk'),\n('BS12', '', '', '51.513976', '-2.54646', 0, 1, 'uk'),\n('BS13', '', '', '51.412', '-2.611', 0, 1, 'uk'),\n('BS14', '', '', '51.413', '-2.561', 0, 1, 'uk'),\n('BS15', '', '', '51.459', '-2.506', 0, 1, 'uk'),\n('BS16', '', '', '51.485', '-2.51', 0, 1, 'uk'),\n('BS17', '', '', '51.462518', '-2.520625', 0, 1, 'uk'),\n('BS18', '', '', '51.379781', '-2.507386', 0, 1, 'uk'),\n('BS19', '', '', '51.246836', '-2.443326', 0, 1, 'uk'),\n('BS2', '', '', '51.46', '-2.581', 0, 1, 'uk'),\n('BS20', '', '', '51.479', '-2.752', 0, 1, 'uk'),\n('BS21', '', '', '51.435', '-2.849', 0, 1, 'uk'),\n('BS22', '', '', '51.36', '-2.929', 0, 1, 'uk'),\n('BS23', '', '', '51.343', '-2.97', 0, 1, 'uk'),\n('BS24', '', '', '51.327', '-2.932', 0, 1, 'uk'),\n('BS25', '', '', '51.32', '-2.826', 0, 1, 'uk'),\n('BS26', '', '', '51.279', '-2.855', 0, 1, 'uk'),\n('BS27', '', '', '51.271', '-2.77', 0, 1, 'uk'),\n('BS28', '', '', '51.225', '-2.814', 0, 1, 'uk'),\n('BS29', '', '', '51.331', '-2.878', 0, 1, 'uk'),\n('BS3', '', '', '51.438', '-2.602', 0, 1, 'uk'),\n('BS30', '', '', '51.445', '-2.472', 0, 1, 'uk'),\n('BS31', '', '', '51.408', '-2.491', 0, 1, 'uk'),\n('BS32', '', '', '51.542', '-2.559', 0, 1, 'uk'),\n('BS34', '', '', '51.523', '-2.564', 0, 1, 'uk'),\n('BS35', '', '', '51.596', '-2.549', 0, 1, 'uk'),\n('BS36', '', '', '51.526', '-2.486', 0, 1, 'uk'),\n('BS37', '', '', '51.539', '-2.416', 0, 1, 'uk'),\n('BS39', '', '', '51.328', '-2.532', 0, 1, 'uk'),\n('BS4', '', '', '51.435', '-2.561', 0, 1, 'uk'),\n('BS40', '', '', '51.346', '-2.691', 0, 1, 'uk'),\n('BS41', '', '', '51.422', '-2.651', 0, 1, 'uk'),\n('BS43', '', '', '51.44008', '-2.595185', 0, 1, 'uk'),\n('BS48', '', '', '51.425', '-2.747', 0, 1, 'uk'),\n('BS49', '', '', '51.38', '-2.817', 0, 1, 'uk'),\n('BS5', '', '', '51.462', '-2.551', 0, 1, 'uk'),\n('BS6', '', '', '51.47', '-2.599', 0, 1, 'uk'),\n('BS7', '', '', '51.486', '-2.58', 0, 1, 'uk'),\n('BS8', '', '', '51.457', '-2.621', 0, 1, 'uk'),\n('BS9', '', '', '51.487', '-2.625', 0, 1, 'uk'),\n('BS99', '', '', '51.458', '-2.573', 0, 1, 'uk'),\n('BT1', '', '', '54.599', '-5.928', 0, 1, 'uk'),\n('BT10', '', '', '54.56', '-5.984', 0, 1, 'uk'),\n('BT11', '', '', '54.576', '-5.997', 0, 1, 'uk'),\n('BT12', '', '', '54.592', '-5.956', 0, 1, 'uk'),\n('BT13', '', '', '54.606', '-5.958', 0, 1, 'uk'),\n('BT14', '', '', '54.621', '-5.961', 0, 1, 'uk'),\n('BT15', '', '', '54.623', '-5.931', 0, 1, 'uk'),\n('BT16', '', '', '54.591', '-5.797', 0, 1, 'uk'),\n('BT17', '', '', '54.554', '-6.017', 0, 1, 'uk'),\n('BT18', '', '', '54.641', '-5.82', 0, 1, 'uk'),\n('BT19', '', '', '54.652', '-5.666', 0, 1, 'uk'),\n('BT2', '', '', '54.593', '-5.93', 0, 1, 'uk'),\n('BT20', '', '', '54.658', '-5.664', 0, 1, 'uk'),\n('BT21', '', '', '54.639', '-5.545', 0, 1, 'uk'),\n('BT22', '', '', '54.503', '-5.519', 0, 1, 'uk'),\n('BT23', '', '', '54.563', '-5.715', 0, 1, 'uk'),\n('BT24', '', '', '54.417', '-5.872', 0, 1, 'uk'),\n('BT25', '', '', '54.395', '-6.111', 0, 1, 'uk'),\n('BT26', '', '', '54.452', '-6.06', 0, 1, 'uk'),\n('BT27', '', '', '54.51', '-6.02', 0, 1, 'uk'),\n('BT28', '', '', '54.523', '-6.088', 0, 1, 'uk'),\n('BT29', '', '', '54.62', '-6.195', 0, 1, 'uk'),\n('BT3', '', '', '54.62', '-5.904', 0, 1, 'uk'),\n('BT30', '', '', '54.334', '-5.704', 0, 1, 'uk'),\n('BT31', '', '', '54.278', '-5.97', 0, 1, 'uk'),\n('BT32', '', '', '54.335', '-6.244', 0, 1, 'uk'),\n('BT33', '', '', '54.221', '-5.893', 0, 1, 'uk'),\n('BT34', '', '', '54.155', '-6.18', 0, 1, 'uk'),\n('BT35', '', '', '54.165', '-6.444', 0, 1, 'uk'),\n('BT36', '', '', '54.677', '-5.955', 0, 1, 'uk'),\n('BT37', '', '', '54.677', '-5.907', 0, 1, 'uk'),\n('BT38', '', '', '54.73', '-5.799', 0, 1, 'uk'),\n('BT39', '', '', '54.745', '-6.017', 0, 1, 'uk'),\n('BT4', '', '', '54.603', '-5.867', 0, 1, 'uk'),\n('BT40', '', '', '54.846', '-5.822', 0, 1, 'uk'),\n('BT41', '', '', '54.733', '-6.26', 0, 1, 'uk'),\n('BT42', '', '', '54.854', '-6.282', 0, 1, 'uk'),\n('BT43', '', '', '54.89', '-6.265', 0, 1, 'uk'),\n('BT44', '', '', '54.974', '-6.284', 0, 1, 'uk'),\n('BT45', '', '', '54.76', '-6.639', 0, 1, 'uk'),\n('BT46', '', '', '54.866', '-6.664', 0, 1, 'uk'),\n('BT47', '', '', '54.974', '-7.211', 0, 1, 'uk'),\n('BT48', '', '', '55.009', '-7.328', 0, 1, 'uk'),\n('BT49', '', '', '55.048', '-6.952', 0, 1, 'uk'),\n('BT5', '', '', '54.589', '-5.87', 0, 1, 'uk'),\n('BT51', '', '', '55.058', '-6.681', 0, 1, 'uk'),\n('BT52', '', '', '55.134', '-6.653', 0, 1, 'uk'),\n('BT53', '', '', '55.085', '-6.473', 0, 1, 'uk'),\n('BT54', '', '', '55.2', '-6.258', 0, 1, 'uk'),\n('BT55', '', '', '55.18', '-6.71', 0, 1, 'uk'),\n('BT56', '', '', '55.198', '-6.649', 0, 1, 'uk'),\n('BT57', '', '', '55.202', '-6.517', 0, 1, 'uk'),\n('BT6', '', '', '54.58', '-5.896', 0, 1, 'uk'),\n('BT60', '', '', '54.292', '-6.65', 0, 1, 'uk'),\n('BT61', '', '', '54.368', '-6.623', 0, 1, 'uk'),\n('BT62', '', '', '54.412', '-6.464', 0, 1, 'uk'),\n('BT63', '', '', '54.404', '-6.389', 0, 1, 'uk'),\n('BT64', '', '', '54.45', '-6.392', 0, 1, 'uk'),\n('BT65', '', '', '54.445', '-6.366', 0, 1, 'uk'),\n('BT66', '', '', '54.455', '-6.333', 0, 1, 'uk'),\n('BT67', '', '', '54.487', '-6.268', 0, 1, 'uk'),\n('BT68', '', '', '54.366', '-6.848', 0, 1, 'uk'),\n('BT69', '', '', '54.424', '-6.949', 0, 1, 'uk'),\n('BT7', '', '', '54.582', '-5.924', 0, 1, 'uk'),\n('BT70', '', '', '54.515', '-6.887', 0, 1, 'uk'),\n('BT71', '', '', '54.513', '-6.704', 0, 1, 'uk'),\n('BT74', '', '', '54.343', '-7.665', 0, 1, 'uk'),\n('BT75', '', '', '54.375', '-7.315', 0, 1, 'uk'),\n('BT76', '', '', '54.419', '-7.191', 0, 1, 'uk'),\n('BT77', '', '', '54.427', '-7.117', 0, 1, 'uk'),\n('BT78', '', '', '54.571', '-7.374', 0, 1, 'uk'),\n('BT79', '', '', '54.624', '-7.201', 0, 1, 'uk'),\n('BT8', '', '', '54.54', '-5.905', 0, 1, 'uk'),\n('BT80', '', '', '54.645', '-6.748', 0, 1, 'uk'),\n('BT81', '', '', '54.694', '-7.614', 0, 1, 'uk'),\n('BT82', '', '', '54.826', '-7.427', 0, 1, 'uk'),\n('BT9', '', '', '54.572', '-5.949', 0, 1, 'uk'),\n('BT92', '', '', '54.223', '-7.462', 0, 1, 'uk'),\n('BT93', '', '', '54.465', '-7.826', 0, 1, 'uk'),\n('BT94', '', '', '54.376', '-7.541', 0, 1, 'uk'),\n('C03', '', '', '51.876799', '0.854968', 0, 1, 'uk'),\n('CA1', '', '', '54.886', '-2.911', 0, 1, 'uk'),\n('CA10', '', '', '54.611', '-2.659', 0, 1, 'uk'),\n('CA11', '', '', '54.664', '-2.786', 0, 1, 'uk'),\n('CA12', '', '', '54.602', '-3.133', 0, 1, 'uk'),\n('CA13', '', '', '54.66', '-3.366', 0, 1, 'uk'),\n('CA14', '', '', '54.634', '-3.537', 0, 1, 'uk'),\n('CA15', '', '', '54.712', '-3.481', 0, 1, 'uk'),\n('CA16', '', '', '54.574', '-2.483', 0, 1, 'uk'),\n('CA17', '', '', '54.479', '-2.35', 0, 1, 'uk'),\n('CA18', '', '', '54.354', '-3.39', 0, 1, 'uk'),\n('CA19', '', '', '54.387', '-3.382', 0, 1, 'uk'),\n('CA2', '', '', '54.884', '-2.949', 0, 1, 'uk'),\n('CA20', '', '', '54.41', '-3.461', 0, 1, 'uk'),\n('CA21', '', '', '54.445', '-3.515', 0, 1, 'uk'),\n('CA22', '', '', '54.48', '-3.531', 0, 1, 'uk'),\n('CA23', '', '', '54.514', '-3.493', 0, 1, 'uk'),\n('CA24', '', '', '54.515', '-3.542', 0, 1, 'uk'),\n('CA25', '', '', '54.523', '-3.517', 0, 1, 'uk'),\n('CA26', '', '', '54.544', '-3.481', 0, 1, 'uk'),\n('CA27', '', '', '54.491', '-3.592', 0, 1, 'uk'),\n('CA28', '', '', '54.544', '-3.577', 0, 1, 'uk'),\n('CA3', '', '', '54.907', '-2.939', 0, 1, 'uk'),\n('CA4', '', '', '54.847', '-2.833', 0, 1, 'uk'),\n('CA5', '', '', '54.855', '-3.015', 0, 1, 'uk'),\n('CA6', '', '', '54.994', '-2.892', 0, 1, 'uk'),\n('CA7', '', '', '54.807', '-3.237', 0, 1, 'uk'),\n('CA8', '', '', '54.939', '-2.685', 0, 1, 'uk'),\n('CA9', '', '', '54.802', '-2.419', 0, 1, 'uk'),\n('CB1', '', '', '52.176', '0.19', 0, 1, 'uk'),\n('CB10', '', '', '52.03', '0.266', 0, 1, 'uk'),\n('CB11', '', '', '52', '0.214', 0, 1, 'uk'),\n('CB2', '', '', '52.163', '0.133', 0, 1, 'uk'),\n('CB21', '', '', '52.119036', '0.315929', 0, 1, 'uk'),\n('CB22', '', '', '52.122344', '0.184663', 0, 1, 'uk'),\n('CB23', '', '', '52.149782', '0.056357', 0, 1, 'uk'),\n('CB24', '', '', '52.279289', '0.053552', 0, 1, 'uk'),\n('CB25', '', '', '52.269251', '0.330103', 0, 1, 'uk'),\n('CB3', '', '', '52.213', '0.025', 0, 1, 'uk'),\n('CB4', '', '', '52.243', '0.115', 0, 1, 'uk'),\n('CB5', '', '', '52.239', '0.211', 0, 1, 'uk'),\n('CB6', '', '', '52.404', '0.224', 0, 1, 'uk'),\n('CB7', '', '', '52.366', '0.322', 0, 1, 'uk'),\n('CB8', '', '', '52.231', '0.427', 0, 1, 'uk'),\n('CB9', '', '', '52.082', '0.441', 0, 1, 'uk'),\n('CF1', '', '', '51.483211', '-3.171682', 0, 1, 'uk'),\n('CF10', '', '', '51.474', '-3.176', 0, 1, 'uk'),\n('CF11', '', '', '51.473', '-3.192', 0, 1, 'uk'),\n('CF14', '', '', '51.519', '-3.203', 0, 1, 'uk'),\n('CF15', '', '', '51.534', '-3.273', 0, 1, 'uk'),\n('CF23', '', '', '51.515', '-3.151', 0, 1, 'uk'),\n('CF24', '', '', '51.485', '-3.164', 0, 1, 'uk'),\n('CF3', '', '', '51.519', '-3.111', 0, 1, 'uk'),\n('CF31', '', '', '51.509', '-3.576', 0, 1, 'uk'),\n('CF32', '', '', '51.56', '-3.583', 0, 1, 'uk'),\n('CF33', '', '', '51.524', '-3.69', 0, 1, 'uk'),\n('CF34', '', '', '51.61', '-3.651', 0, 1, 'uk'),\n('CF35', '', '', '51.522', '-3.519', 0, 1, 'uk'),\n('CF36', '', '', '51.485', '-3.698', 0, 1, 'uk'),\n('CF37', '', '', '51.603', '-3.333', 0, 1, 'uk'),\n('CF38', '', '', '51.56', '-3.332', 0, 1, 'uk'),\n('CF39', '', '', '51.601', '-3.423', 0, 1, 'uk'),\n('CF4', '', '', '51.516953', '-3.206791', 0, 1, 'uk'),\n('CF40', '', '', '51.62', '-3.45', 0, 1, 'uk'),\n('CF41', '', '', '51.647', '-3.481', 0, 1, 'uk'),\n('CF42', '', '', '51.667', '-3.522', 0, 1, 'uk'),\n('CF43', '', '', '51.658', '-3.449', 0, 1, 'uk'),\n('CF44', '', '', '51.718', '-3.458', 0, 1, 'uk'),\n('CF45', '', '', '51.669', '-3.361', 0, 1, 'uk'),\n('CF46', '', '', '51.665', '-3.3', 0, 1, 'uk'),\n('CF47', '', '', '51.751', '-3.374', 0, 1, 'uk'),\n('CF48', '', '', '51.741', '-3.369', 0, 1, 'uk'),\n('CF5', '', '', '51.482', '-3.242', 0, 1, 'uk'),\n('CF61', '', '', '51.408', '-3.48', 0, 1, 'uk'),\n('CF62', '', '', '51.404', '-3.308', 0, 1, 'uk'),\n('CF63', '', '', '51.412', '-3.256', 0, 1, 'uk'),\n('CF64', '', '', '51.433', '-3.189', 0, 1, 'uk'),\n('CF71', '', '', '51.461', '-3.454', 0, 1, 'uk'),\n('CF72', '', '', '51.53', '-3.398', 0, 1, 'uk'),\n('CF77', '', '', '51.450009', '-3.416403', 0, 1, 'uk'),\n('CF81', '', '', '51.7', '-3.243', 0, 1, 'uk'),\n('CF82', '', '', '51.652', '-3.236', 0, 1, 'uk'),\n('CF83', '', '', '51.586', '-3.217', 0, 1, 'uk'),\n('CH1', '', '', '53.202', '-2.908', 0, 1, 'uk'),\n('CH2', '', '', '53.216', '-2.868', 0, 1, 'uk'),\n('CH3', '', '', '53.167', '-2.822', 0, 1, 'uk'),\n('CH4', '', '', '53.168', '-2.939', 0, 1, 'uk'),\n('CH41', '', '', '53.394', '-3.03', 0, 1, 'uk'),\n('CH42', '', '', '53.374', '-3.021', 0, 1, 'uk'),\n('CH43', '', '', '53.383', '-3.058', 0, 1, 'uk'),\n('CH44', '', '', '53.415', '-3.036', 0, 1, 'uk'),\n('CH45', '', '', '53.428', '-3.05', 0, 1, 'uk'),\n('CH46', '', '', '53.404', '-3.11', 0, 1, 'uk'),\n('CH47', '', '', '53.396', '-3.168', 0, 1, 'uk'),\n('CH48', '', '', '53.372', '-3.169', 0, 1, 'uk'),\n('CH49', '', '', '53.381', '-3.103', 0, 1, 'uk'),\n('CH5', '', '', '53.204', '-3.041', 0, 1, 'uk'),\n('CH6', '', '', '53.25', '-3.145', 0, 1, 'uk'),\n('CH60', '', '', '53.326', '-3.095', 0, 1, 'uk'),\n('CH61', '', '', '53.348', '-3.101', 0, 1, 'uk'),\n('CH62', '', '', '53.334', '-2.981', 0, 1, 'uk'),\n('CH63', '', '', '53.345', '-3.011', 0, 1, 'uk'),\n('CH64', '', '', '53.288', '-3.047', 0, 1, 'uk'),\n('CH65', '', '', '53.277', '-2.902', 0, 1, 'uk'),\n('CH66', '', '', '53.277', '-2.934', 0, 1, 'uk'),\n('CH7', '', '', '53.169', '-3.133', 0, 1, 'uk'),\n('CH8', '', '', '53.281', '-3.241', 0, 1, 'uk'),\n('CM0', '', '', '51.663', '0.837', 0, 1, 'uk'),\n('CM1', '', '', '51.745', '0.457', 0, 1, 'uk'),\n('CM10', '', '', '51.637021', '0.790966', 0, 1, 'uk'),\n('CM11', '', '', '51.623', '0.446', 0, 1, 'uk'),\n('CM12', '', '', '51.628', '0.416', 0, 1, 'uk'),\n('CM13', '', '', '51.615', '0.338', 0, 1, 'uk'),\n('CM14', '', '', '51.618', '0.293', 0, 1, 'uk'),\n('CM15', '', '', '51.643', '0.306', 0, 1, 'uk'),\n('CM16', '', '', '51.7', '0.122', 0, 1, 'uk'),\n('CM17', '', '', '51.771', '0.146', 0, 1, 'uk'),\n('CM18', '', '', '51.756', '0.107', 0, 1, 'uk'),\n('CM19', '', '', '51.76', '0.075', 0, 1, 'uk'),\n('CM2', '', '', '51.722', '0.487', 0, 1, 'uk'),\n('CM20', '', '', '51.775', '0.105', 0, 1, 'uk'),\n('CM21', '', '', '51.812', '0.147', 0, 1, 'uk'),\n('CM22', '', '', '51.862', '0.222', 0, 1, 'uk'),\n('CM23', '', '', '51.871', '0.16', 0, 1, 'uk'),\n('CM24', '', '', '51.899', '0.207', 0, 1, 'uk'),\n('CM3', '', '', '51.72', '0.585', 0, 1, 'uk'),\n('CM4', '', '', '51.674', '0.392', 0, 1, 'uk'),\n('CM5', '', '', '51.721', '0.249', 0, 1, 'uk'),\n('CM6', '', '', '51.877', '0.367', 0, 1, 'uk'),\n('CM7', '', '', '51.897', '0.539', 0, 1, 'uk'),\n('CM8', '', '', '51.805', '0.639', 0, 1, 'uk'),\n('CM9', '', '', '51.741', '0.702', 0, 1, 'uk'),\n('CM99', '', '', '51.736822', '0.476129', 0, 1, 'uk'),\n('CO1', '', '', '51.889', '0.91', 0, 1, 'uk'),\n('CO10', '', '', '52.057', '0.724', 0, 1, 'uk'),\n('CO11', '', '', '51.942', '1.079', 0, 1, 'uk'),\n('CO12', '', '', '51.931', '1.255', 0, 1, 'uk'),\n('CO13', '', '', '51.838', '1.239', 0, 1, 'uk'),\n('CO14', '', '', '51.85', '1.269', 0, 1, 'uk'),\n('CO15', '', '', '51.796', '1.157', 0, 1, 'uk'),\n('CO16', '', '', '51.821', '1.126', 0, 1, 'uk'),\n('CO2', '', '', '51.869', '0.895', 0, 1, 'uk'),\n('CO3', '', '', '51.884', '0.863', 0, 1, 'uk'),\n('CO4', '', '', '51.907', '0.924', 0, 1, 'uk'),\n('CO5', '', '', '51.814', '0.822', 0, 1, 'uk'),\n('CO6', '', '', '51.924', '0.79', 0, 1, 'uk'),\n('CO7', '', '', '51.884', '1.005', 0, 1, 'uk'),\n('CO8', '', '', '51.973', '0.767', 0, 1, 'uk'),\n('CO9', '', '', '51.969', '0.611', 0, 1, 'uk'),\n('CR0', '', '', '51.372', '-0.074', 0, 1, 'uk'),\n('CR1', '', '', '51.375444', '-0.102335', 0, 1, 'uk'),\n('CR2', '', '', '51.35', '-0.08', 0, 1, 'uk'),\n('CR3', '', '', '51.287', '-0.08', 0, 1, 'uk'),\n('CR4', '', '', '51.404', '-0.159', 0, 1, 'uk'),\n('CR5', '', '', '51.312', '-0.139', 0, 1, 'uk'),\n('CR6', '', '', '51.308', '-0.052', 0, 1, 'uk'),\n('CR7', '', '', '51.395', '-0.103', 0, 1, 'uk'),\n('CR8', '', '', '51.336', '-0.11', 0, 1, 'uk'),\n('CR9', '', '', '51.374944', '-0.097011', 0, 1, 'uk'),\n('CT1', '', '', '51.277', '1.087', 0, 1, 'uk'),\n('CT10', '', '', '51.362', '1.431', 0, 1, 'uk'),\n('CT11', '', '', '51.336', '1.415', 0, 1, 'uk'),\n('CT12', '', '', '51.343', '1.373', 0, 1, 'uk'),\n('CT13', '', '', '51.267', '1.33', 0, 1, 'uk'),\n('CT14', '', '', '51.216', '1.387', 0, 1, 'uk'),\n('CT15', '', '', '51.171', '1.284', 0, 1, 'uk'),\n('CT16', '', '', '51.14', '1.302', 0, 1, 'uk'),\n('CT17', '', '', '51.128', '1.296', 0, 1, 'uk'),\n('CT18', '', '', '51.114', '1.15', 0, 1, 'uk'),\n('CT19', '', '', '51.088', '1.17', 0, 1, 'uk'),\n('CT2', '', '', '51.293', '1.082', 0, 1, 'uk'),\n('CT20', '', '', '51.079', '1.166', 0, 1, 'uk'),\n('CT21', '', '', '51.073', '1.078', 0, 1, 'uk'),\n('CT3', '', '', '51.278', '1.212', 0, 1, 'uk'),\n('CT4', '', '', '51.225', '1.068', 0, 1, 'uk'),\n('CT5', '', '', '51.353', '1.037', 0, 1, 'uk'),\n('CT6', '', '', '51.364', '1.131', 0, 1, 'uk'),\n('CT7', '', '', '51.371', '1.301', 0, 1, 'uk'),\n('CT8', '', '', '51.38', '1.341', 0, 1, 'uk'),\n('CT9', '', '', '51.383', '1.391', 0, 1, 'uk'),\n('CV1', '', '', '52.41', '-1.507', 0, 1, 'uk'),\n('CV10', '', '', '52.525', '-1.5', 0, 1, 'uk'),\n('CV11', '', '', '52.519', '-1.453', 0, 1, 'uk'),\n('CV12', '', '', '52.474', '-1.473', 0, 1, 'uk'),\n('CV13', '', '', '52.612', '-1.414', 0, 1, 'uk'),\n('CV2', '', '', '52.423', '-1.464', 0, 1, 'uk'),\n('CV21', '', '', '52.368', '-1.274', 0, 1, 'uk'),\n('CV22', '', '', '52.355', '-1.287', 0, 1, 'uk'),\n('CV23', '', '', '52.361', '-1.308', 0, 1, 'uk'),\n('CV3', '', '', '52.393', '-1.482', 0, 1, 'uk'),\n('CV31', '', '', '52.278', '-1.524', 0, 1, 'uk'),\n('CV32', '', '', '52.296', '-1.53', 0, 1, 'uk'),\n('CV33', '', '', '52.257', '-1.484', 0, 1, 'uk'),\n('CV34', '', '', '52.283', '-1.579', 0, 1, 'uk'),\n('CV35', '', '', '52.229', '-1.595', 0, 1, 'uk'),\n('CV36', '', '', '52.067', '-1.625', 0, 1, 'uk'),\n('CV37', '', '', '52.185', '-1.713', 0, 1, 'uk'),\n('CV4', '', '', '52.398', '-1.565', 0, 1, 'uk'),\n('CV47', '', '', '52.234', '-1.385', 0, 1, 'uk'),\n('CV5', '', '', '52.412', '-1.551', 0, 1, 'uk'),\n('CV6', '', '', '52.432', '-1.507', 0, 1, 'uk'),\n('CV7', '', '', '52.444', '-1.563', 0, 1, 'uk'),\n('CV8', '', '', '52.351', '-1.543', 0, 1, 'uk'),\n('CV9', '', '', '52.585', '-1.558', 0, 1, 'uk'),\n('CW1', '', '', '53.103', '-2.434', 0, 1, 'uk'),\n('CW10', '', '', '53.189', '-2.445', 0, 1, 'uk'),\n('CW11', '', '', '53.142', '-2.365', 0, 1, 'uk'),\n('CW12', '', '', '53.165', '-2.212', 0, 1, 'uk'),\n('CW2', '', '', '53.081', '-2.446', 0, 1, 'uk'),\n('CW3', '', '', '53', '-2.406', 0, 1, 'uk'),\n('CW4', '', '', '53.207', '-2.347', 0, 1, 'uk'),\n('CW5', '', '', '53.062', '-2.521', 0, 1, 'uk'),\n('CW6', '', '', '53.162', '-2.666', 0, 1, 'uk'),\n('CW7', '', '', '53.19', '-2.526', 0, 1, 'uk'),\n('CW8', '', '', '53.254', '-2.563', 0, 1, 'uk'),\n('CW9', '', '', '53.259', '-2.501', 0, 1, 'uk'),\n('DA1', '', '', '51.447', '0.21', 0, 1, 'uk'),\n('DA10', '', '', '51.444', '0.308', 0, 1, 'uk'),\n('DA11', '', '', '51.434', '0.354', 0, 1, 'uk'),\n('DA12', '', '', '51.427', '0.389', 0, 1, 'uk'),\n('DA13', '', '', '51.382', '0.355', 0, 1, 'uk'),\n('DA14', '', '', '51.425', '0.113', 0, 1, 'uk'),\n('DA15', '', '', '51.44', '0.1', 0, 1, 'uk'),\n('DA16', '', '', '51.464', '0.109', 0, 1, 'uk'),\n('DA17', '', '', '51.487', '0.149', 0, 1, 'uk'),\n('DA18', '', '', '51.492', '0.144', 0, 1, 'uk'),\n('DA2', '', '', '51.432', '0.234', 0, 1, 'uk'),\n('DA3', '', '', '51.385', '0.31', 0, 1, 'uk'),\n('DA4', '', '', '51.391', '0.233', 0, 1, 'uk'),\n('DA5', '', '', '51.44', '0.146', 0, 1, 'uk'),\n('DA6', '', '', '51.455', '0.14', 0, 1, 'uk'),\n('DA7', '', '', '51.466', '0.147', 0, 1, 'uk'),\n('DA8', '', '', '51.475', '0.178', 0, 1, 'uk'),\n('DA9', '', '', '51.447', '0.28', 0, 1, 'uk'),\n('DB23', '', '', '53.975871', '-1.993317', 0, 1, 'uk'),\n('DD1', '', '', '56.461', '-2.977', 0, 1, 'uk'),\n('DD10', '', '', '56.747', '-2.427', 0, 1, 'uk'),\n('DD11', '', '', '56.573', '-2.598', 0, 1, 'uk'),\n('DD2', '', '', '56.47', '-3.027', 0, 1, 'uk'),\n('DD3', '', '', '56.482', '-2.988', 0, 1, 'uk'),\n('DD4', '', '', '56.482', '-2.935', 0, 1, 'uk'),\n('DD5', '', '', '56.478', '-2.862', 0, 1, 'uk'),\n('DD6', '', '', '56.437', '-2.925', 0, 1, 'uk'),\n('DD7', '', '', '56.503', '-2.718', 0, 1, 'uk'),\n('DD8', '', '', '56.656', '-2.922', 0, 1, 'uk'),\n('DD9', '', '', '56.748', '-2.667', 0, 1, 'uk'),\n('DE1', '', '', '52.92', '-1.475', 0, 1, 'uk'),\n('DE11', '', '', '52.773', '-1.554', 0, 1, 'uk'),\n('DE12', '', '', '52.725', '-1.553', 0, 1, 'uk'),\n('DE13', '', '', '52.808', '-1.688', 0, 1, 'uk'),\n('DE14', '', '', '52.805', '-1.64', 0, 1, 'uk'),\n('DE15', '', '', '52.799', '-1.608', 0, 1, 'uk'),\n('DE21', '', '', '52.933', '-1.432', 0, 1, 'uk'),\n('DE22', '', '', '52.934', '-1.496', 0, 1, 'uk'),\n('DE23', '', '', '52.901', '-1.494', 0, 1, 'uk'),\n('DE24', '', '', '52.89', '-1.451', 0, 1, 'uk'),\n('DE3', '', '', '52.909', '-1.54', 0, 1, 'uk'),\n('DE4', '', '', '53.127', '-1.564', 0, 1, 'uk'),\n('DE45', '', '', '53.215', '-1.676', 0, 1, 'uk'),\n('DE5', '', '', '53.045', '-1.401', 0, 1, 'uk'),\n('DE55', '', '', '53.101', '-1.371', 0, 1, 'uk'),\n('DE56', '', '', '53.022', '-1.474', 0, 1, 'uk'),\n('DE6', '', '', '52.993', '-1.717', 0, 1, 'uk'),\n('DE65', '', '', '52.867', '-1.61', 0, 1, 'uk'),\n('DE7', '', '', '52.973', '-1.321', 0, 1, 'uk'),\n('DE72', '', '', '52.894', '-1.359', 0, 1, 'uk'),\n('DE73', '', '', '52.847', '-1.435', 0, 1, 'uk'),\n('DE74', '', '', '52.844', '-1.33', 0, 1, 'uk'),\n('DE75', '', '', '53.013', '-1.353', 0, 1, 'uk'),\n('DG1', '', '', '55.073', '-3.58', 0, 1, 'uk'),\n('DG10', '', '', '55.32', '-3.437', 0, 1, 'uk'),\n('DG11', '', '', '55.114', '-3.336', 0, 1, 'uk'),\n('DG12', '', '', '54.99', '-3.251', 0, 1, 'uk'),\n('DG13', '', '', '55.173', '-3.029', 0, 1, 'uk'),\n('DG14', '', '', '55.081', '-2.985', 0, 1, 'uk'),\n('DG16', '', '', '54.997', '-3.068', 0, 1, 'uk'),\n('DG2', '', '', '55.065', '-3.657', 0, 1, 'uk'),\n('DG3', '', '', '55.237', '-3.799', 0, 1, 'uk'),\n('DG4', '', '', '55.375', '-3.952', 0, 1, 'uk'),\n('DG5', '', '', '54.922', '-3.81', 0, 1, 'uk'),\n('DG6', '', '', '54.837', '-4.055', 0, 1, 'uk'),\n('DG7', '', '', '54.968', '-4.012', 0, 1, 'uk'),\n('DG8', '', '', '54.873', '-4.516', 0, 1, 'uk'),\n('DG9', '', '', '54.878', '-5.021', 0, 1, 'uk'),\n('DH1', '', '', '54.781', '-1.566', 0, 1, 'uk'),\n('DH2', '', '', '54.86', '-1.597', 0, 1, 'uk'),\n('DH3', '', '', '54.872', '-1.567', 0, 1, 'uk'),\n('DH4', '', '', '54.854', '-1.49', 0, 1, 'uk'),\n('DH5', '', '', '54.824', '-1.454', 0, 1, 'uk'),\n('DH6', '', '', '54.753', '-1.464', 0, 1, 'uk'),\n('DH7', '', '', '54.79', '-1.664', 0, 1, 'uk'),\n('DH8', '', '', '54.856', '-1.844', 0, 1, 'uk'),\n('DH9', '', '', '54.868', '-1.708', 0, 1, 'uk'),\n('DL1', '', '', '54.53', '-1.536', 0, 1, 'uk'),\n('DL10', '', '', '54.414', '-1.69', 0, 1, 'uk'),\n('DL11', '', '', '54.439', '-1.875', 0, 1, 'uk'),\n('DL12', '', '', '54.572', '-1.985', 0, 1, 'uk'),\n('DL13', '', '', '54.716', '-1.954', 0, 1, 'uk'),\n('DL14', '', '', '54.652', '-1.69', 0, 1, 'uk'),\n('DL15', '', '', '54.71', '-1.728', 0, 1, 'uk'),\n('DL16', '', '', '54.699', '-1.604', 0, 1, 'uk'),\n('DL17', '', '', '54.681', '-1.54', 0, 1, 'uk'),\n('DL18', '', '', '54.692056', '-1.546906', 0, 1, 'uk'),\n('DL2', '', '', '54.529', '-1.601', 0, 1, 'uk'),\n('DL3', '', '', '54.532', '-1.57', 0, 1, 'uk'),\n('DL4', '', '', '54.63', '-1.643', 0, 1, 'uk'),\n('DL5', '', '', '54.617', '-1.576', 0, 1, 'uk'),\n('DL6', '', '', '54.371', '-1.389', 0, 1, 'uk'),\n('DL7', '', '', '54.338', '-1.485', 0, 1, 'uk'),\n('DL8', '', '', '54.293', '-1.786', 0, 1, 'uk'),\n('DL9', '', '', '54.375', '-1.709', 0, 1, 'uk'),\n('DN1', '', '', '53.522', '-1.129', 0, 1, 'uk'),\n('DN10', '', '', '53.427', '-0.943', 0, 1, 'uk'),\n('DN11', '', '', '53.451', '-1.082', 0, 1, 'uk'),\n('DN12', '', '', '53.483', '-1.221', 0, 1, 'uk'),\n('DN14', '', '', '53.708', '-0.936', 0, 1, 'uk'),\n('DN15', '', '', '53.614', '-0.65', 0, 1, 'uk'),\n('DN16', '', '', '53.568', '-0.64', 0, 1, 'uk'),\n('DN17', '', '', '53.572', '-0.701', 0, 1, 'uk'),\n('DN18', '', '', '53.68', '-0.446', 0, 1, 'uk'),\n('DN19', '', '', '53.684', '-0.359', 0, 1, 'uk'),\n('DN2', '', '', '53.533', '-1.102', 0, 1, 'uk'),\n('DN20', '', '', '53.558', '-0.505', 0, 1, 'uk'),\n('DN21', '', '', '53.419', '-0.701', 0, 1, 'uk'),\n('DN22', '', '', '53.323', '-0.927', 0, 1, 'uk'),\n('DN3', '', '', '53.546', '-1.059', 0, 1, 'uk'),\n('DN31', '', '', '53.57', '-0.086', 0, 1, 'uk'),\n('DN32', '', '', '53.562', '-0.069', 0, 1, 'uk'),\n('DN33', '', '', '53.54', '-0.097', 0, 1, 'uk'),\n('DN34', '', '', '53.557', '-0.112', 0, 1, 'uk'),\n('DN35', '', '', '53.555', '-0.035', 0, 1, 'uk'),\n('DN36', '', '', '53.511', '-0.037', 0, 1, 'uk'),\n('DN37', '', '', '53.541', '-0.135', 0, 1, 'uk'),\n('DN38', '', '', '53.561', '-0.392', 0, 1, 'uk'),\n('DN39', '', '', '53.617', '-0.334', 0, 1, 'uk'),\n('DN4', '', '', '53.506', '-1.121', 0, 1, 'uk'),\n('DN40', '', '', '53.621', '-0.224', 0, 1, 'uk'),\n('DN41', '', '', '53.583', '-0.195', 0, 1, 'uk'),\n('DN5', '', '', '53.537', '-1.172', 0, 1, 'uk'),\n('DN6', '', '', '53.596', '-1.176', 0, 1, 'uk'),\n('DN7', '', '', '53.582', '-1.015', 0, 1, 'uk'),\n('DN8', '', '', '53.614', '-0.956', 0, 1, 'uk'),\n('DN9', '', '', '53.506', '-0.894', 0, 1, 'uk'),\n('DT1', '', '', '50.711', '-2.44', 0, 1, 'uk'),\n('DT10', '', '', '50.937', '-2.333', 0, 1, 'uk'),\n('DT11', '', '', '50.86', '-2.181', 0, 1, 'uk'),\n('DT2', '', '', '50.749', '-2.453', 0, 1, 'uk'),\n('DT3', '', '', '50.641', '-2.466', 0, 1, 'uk'),\n('DT4', '', '', '50.609', '-2.464', 0, 1, 'uk'),\n('DT5', '', '', '50.548', '-2.441', 0, 1, 'uk'),\n('DT6', '', '', '50.739', '-2.775', 0, 1, 'uk'),\n('DT7', '', '', '50.729', '-2.946', 0, 1, 'uk'),\n('DT8', '', '', '50.816', '-2.758', 0, 1, 'uk'),\n('DT9', '', '', '50.941', '-2.515', 0, 1, 'uk'),\n('DY1', '', '', '52.516', '-2.096', 0, 1, 'uk'),\n('DY10', '', '', '52.386', '-2.224', 0, 1, 'uk'),\n('DY11', '', '', '52.385', '-2.261', 0, 1, 'uk'),\n('DY12', '', '', '52.385', '-2.329', 0, 1, 'uk'),\n('DY13', '', '', '52.336', '-2.28', 0, 1, 'uk'),\n('DY14', '', '', '52.38', '-2.462', 0, 1, 'uk'),\n('DY2', '', '', '52.496', '-2.08', 0, 1, 'uk'),\n('DY3', '', '', '52.53', '-2.128', 0, 1, 'uk'),\n('DY4', '', '', '52.532', '-2.053', 0, 1, 'uk'),\n('DY5', '', '', '52.48', '-2.122', 0, 1, 'uk'),\n('DY6', '', '', '52.498', '-2.164', 0, 1, 'uk'),\n('DY7', '', '', '52.466', '-2.224', 0, 1, 'uk'),\n('DY8', '', '', '52.46', '-2.154', 0, 1, 'uk'),\n('DY9', '', '', '52.435', '-2.122', 0, 1, 'uk'),\n('E1', '', '', '51.517', '-0.058', 0, 1, 'uk'),\n('E10', '', '', '51.568', '-0.012', 0, 1, 'uk'),\n('E11', '', '', '51.568', '0.014', 0, 1, 'uk'),\n('E12', '', '', '51.55', '0.054', 0, 1, 'uk'),\n('E13', '', '', '51.527', '0.027', 0, 1, 'uk'),\n('E14', '', '', '51.506', '-0.019', 0, 1, 'uk'),\n('E15', '', '', '51.539', '0.003', 0, 1, 'uk'),\n('E16', '', '', '51.511', '0.026', 0, 1, 'uk'),\n('E17', '', '', '51.586', '-0.019', 0, 1, 'uk'),\n('E18', '', '', '51.592', '0.027', 0, 1, 'uk'),\n('E1W', '', '', '51.508', '-0.058', 0, 1, 'uk'),\n('E2', '', '', '51.529', '-0.061', 0, 1, 'uk'),\n('E3', '', '', '51.528', '-0.025', 0, 1, 'uk'),\n('E4', '', '', '51.622', '-0.003', 0, 1, 'uk'),\n('E5', '', '', '51.559', '-0.053', 0, 1, 'uk'),\n('E6', '', '', '51.526', '0.056', 0, 1, 'uk'),\n('E7', '', '', '51.547', '0.028', 0, 1, 'uk'),\n('E8', '', '', '51.542', '-0.064', 0, 1, 'uk'),\n('E9', '', '', '51.543', '-0.043', 0, 1, 'uk'),\n('EA11', '', '', '50.712947', '-3.30738', 0, 1, 'uk'),\n('EC1', '', '', '51.523', '-0.102', 0, 1, 'uk'),\n('EC1A', '', '', '51.52', '-0.103', 0, 1, 'uk'),\n('EC1E', '', '', '51.52297', '-0.102436', 0, 1, 'uk'),\n('EC1M', '', '', '51.521', '-0.102', 0, 1, 'uk'),\n('EC1N', '', '', '51.52', '-0.108', 0, 1, 'uk'),\n('EC1R', '', '', '51.524', '-0.107', 0, 1, 'uk'),\n('EC1V', '', '', '51.526', '-0.097', 0, 1, 'uk'),\n('EC1Y', '', '', '51.523', '-0.093', 0, 1, 'uk'),\n('EC2', '', '', '51.52', '-0.089', 0, 1, 'uk'),\n('EC2A', '', '', '51.523', '-0.085', 0, 1, 'uk'),\n('EC2M', '', '', '51.518', '-0.086', 0, 1, 'uk'),\n('EC2N', '', '', '51.516', '-0.086', 0, 1, 'uk'),\n('EC2R', '', '', '51.517', '-0.092', 0, 1, 'uk'),\n('EC2V', '', '', '51.516', '-0.093', 0, 1, 'uk'),\n('EC2Y', '', '', '51.52', '-0.096', 0, 1, 'uk'),\n('EC3', '', '', '51.513', '-0.083', 0, 1, 'uk'),\n('EC3A', '', '', '51.515', '-0.081', 0, 1, 'uk'),\n('EC3M', '', '', '51.512', '-0.083', 0, 1, 'uk'),\n('EC3N', '', '', '51.513', '-0.079', 0, 1, 'uk'),\n('EC3P', '', '', '51.52', '-0.101', 0, 1, 'uk'),\n('EC3R', '', '', '51.512', '-0.085', 0, 1, 'uk'),\n('EC3V', '', '', '51.513', '-0.086', 0, 1, 'uk'),\n('EC4', '', '', '51.514', '-0.101', 0, 1, 'uk'),\n('EC4A', '', '', '51.516', '-0.107', 0, 1, 'uk'),\n('EC4M', '', '', '51.515', '-0.1', 0, 1, 'uk'),\n('EC4N', '', '', '51.514', '-0.093', 0, 1, 'uk'),\n('EC4R', '', '', '51.512', '-0.091', 0, 1, 'uk'),\n('EC4V', '', '', '51.513', '-0.1', 0, 1, 'uk'),\n('EC4Y', '', '', '51.514', '-0.107', 0, 1, 'uk'),\n('EH1', '', '', '55.952', '-3.188', 0, 1, 'uk'),\n('EH10', '', '', '55.92', '-3.21', 0, 1, 'uk'),\n('EH11', '', '', '55.934', '-3.249', 0, 1, 'uk'),\n('EH12', '', '', '55.943', '-3.272', 0, 1, 'uk'),\n('EH13', '', '', '55.908', '-3.241', 0, 1, 'uk'),\n('EH14', '', '', '55.91', '-3.283', 0, 1, 'uk'),\n('EH15', '', '', '55.946', '-3.111', 0, 1, 'uk'),\n('EH16', '', '', '55.923', '-3.153', 0, 1, 'uk'),\n('EH17', '', '', '55.907', '-3.142', 0, 1, 'uk'),\n('EH18', '', '', '55.876', '-3.121', 0, 1, 'uk'),\n('EH19', '', '', '55.873', '-3.104', 0, 1, 'uk'),\n('EH2', '', '', '55.954', '-3.195', 0, 1, 'uk'),\n('EH20', '', '', '55.879', '-3.155', 0, 1, 'uk'),\n('EH21', '', '', '55.939', '-3.045', 0, 1, 'uk'),\n('EH22', '', '', '55.884', '-3.06', 0, 1, 'uk'),\n('EH23', '', '', '55.839', '-3.051', 0, 1, 'uk'),\n('EH24', '', '', '55.851', '-3.133', 0, 1, 'uk'),\n('EH25', '', '', '55.858', '-3.175', 0, 1, 'uk'),\n('EH26', '', '', '55.833', '-3.224', 0, 1, 'uk'),\n('EH27', '', '', '55.89', '-3.422', 0, 1, 'uk'),\n('EH28', '', '', '55.931', '-3.387', 0, 1, 'uk'),\n('EH29', '', '', '55.956', '-3.399', 0, 1, 'uk'),\n('EH3', '', '', '55.954', '-3.2', 0, 1, 'uk'),\n('EH30', '', '', '55.985', '-3.384', 0, 1, 'uk'),\n('EH31', '', '', '56.037', '-2.827', 0, 1, 'uk'),\n('EH32', '', '', '55.968', '-2.948', 0, 1, 'uk'),\n('EH33', '', '', '55.942', '-2.944', 0, 1, 'uk'),\n('EH34', '', '', '55.909', '-2.88', 0, 1, 'uk'),\n('EH35', '', '', '55.911', '-2.942', 0, 1, 'uk'),\n('EH36', '', '', '55.856', '-2.851', 0, 1, 'uk'),\n('EH37', '', '', '55.862', '-2.96', 0, 1, 'uk'),\n('EH38', '', '', '55.786', '-2.96', 0, 1, 'uk'),\n('EH39', '', '', '56.047', '-2.731', 0, 1, 'uk'),\n('EH4', '', '', '55.962', '-3.258', 0, 1, 'uk'),\n('EH40', '', '', '55.99', '-2.655', 0, 1, 'uk'),\n('EH41', '', '', '55.948', '-2.774', 0, 1, 'uk'),\n('EH42', '', '', '55.994', '-2.525', 0, 1, 'uk'),\n('EH43', '', '', '55.624', '-3.01', 0, 1, 'uk'),\n('EH44', '', '', '55.62', '-3.065', 0, 1, 'uk'),\n('EH45', '', '', '55.655', '-3.191', 0, 1, 'uk'),\n('EH46', '', '', '55.737', '-3.35', 0, 1, 'uk'),\n('EH47', '', '', '55.86', '-3.663', 0, 1, 'uk'),\n('EH48', '', '', '55.901', '-3.664', 0, 1, 'uk'),\n('EH49', '', '', '55.976', '-3.598', 0, 1, 'uk'),\n('EH5', '', '', '55.975', '-3.216', 0, 1, 'uk'),\n('EH51', '', '', '56.011', '-3.605', 0, 1, 'uk'),\n('EH52', '', '', '55.938', '-3.483', 0, 1, 'uk'),\n('EH53', '', '', '55.894', '-3.476', 0, 1, 'uk'),\n('EH54', '', '', '55.892', '-3.523', 0, 1, 'uk'),\n('EH55', '', '', '55.848', '-3.572', 0, 1, 'uk'),\n('EH6', '', '', '55.971', '-3.174', 0, 1, 'uk'),\n('EH7', '', '', '55.961', '-3.165', 0, 1, 'uk'),\n('EH8', '', '', '55.949', '-3.163', 0, 1, 'uk'),\n('EH9', '', '', '55.933', '-3.185', 0, 1, 'uk'),\n('EN1', '', '', '51.653', '-0.066', 0, 1, 'uk'),\n('EN10', '', '', '51.74', '-0.02', 0, 1, 'uk'),\n('EN11', '', '', '51.765', '-0.007', 0, 1, 'uk'),\n('EN2', '', '', '51.659', '-0.091', 0, 1, 'uk'),\n('EN3', '', '', '51.659', '-0.038', 0, 1, 'uk'),\n('EN4', '', '', '51.648', '-0.16', 0, 1, 'uk'),\n('EN5', '', '', '51.649', '-0.195', 0, 1, 'uk'),\n('EN52', '', '', '51.648861', '-0.201028', 0, 1, 'uk'),\n('EN6', '', '', '51.699', '-0.176', 0, 1, 'uk'),\n('EN7', '', '', '51.71', '-0.065', 0, 1, 'uk'),\n('EN8', '', '', '51.698', '-0.032', 0, 1, 'uk'),\n('EN9', '', '', '51.695', '0.014', 0, 1, 'uk'),\n('EN91', '', '', '51.702791', '0.034057', 0, 1, 'uk'),\n('EX1', '', '', '50.726', '-3.505', 0, 1, 'uk'),\n('EX10', '', '', '50.693', '-3.245', 0, 1, 'uk'),\n('EX11', '', '', '50.746', '-3.288', 0, 1, 'uk'),\n('EX12', '', '', '50.706', '-3.081', 0, 1, 'uk'),\n('EX13', '', '', '50.786', '-3.007', 0, 1, 'uk'),\n('EX14', '', '', '50.813', '-3.189', 0, 1, 'uk'),\n('EX15', '', '', '50.877', '-3.338', 0, 1, 'uk'),\n('EX16', '', '', '50.923', '-3.491', 0, 1, 'uk'),\n('EX17', '', '', '50.812', '-3.702', 0, 1, 'uk'),\n('EX18', '', '', '50.901', '-3.887', 0, 1, 'uk'),\n('EX19', '', '', '50.877', '-4.004', 0, 1, 'uk'),\n('EX2', '', '', '50.71', '-3.517', 0, 1, 'uk'),\n('EX20', '', '', '50.75', '-4.019', 0, 1, 'uk'),\n('EX21', '', '', '50.805', '-4.208', 0, 1, 'uk'),\n('EX22', '', '', '50.828', '-4.367', 0, 1, 'uk'),\n('EX23', '', '', '50.824', '-4.533', 0, 1, 'uk'),\n('EX24', '', '', '50.739', '-3.088', 0, 1, 'uk'),\n('EX29', '', '', '50.704703', '-3.792061', 0, 1, 'uk'),\n('EX3', '', '', '50.686', '-3.458', 0, 1, 'uk'),\n('EX31', '', '', '51.086', '-4.064', 0, 1, 'uk'),\n('EX32', '', '', '51.071', '-4.018', 0, 1, 'uk'),\n('EX33', '', '', '51.114', '-4.169', 0, 1, 'uk'),\n('EX34', '', '', '51.199', '-4.103', 0, 1, 'uk'),\n('EX35', '', '', '51.224', '-3.828', 0, 1, 'uk'),\n('EX36', '', '', '51.016', '-3.792', 0, 1, 'uk'),\n('EX37', '', '', '50.979', '-3.951', 0, 1, 'uk'),\n('EX38', '', '', '50.943', '-4.151', 0, 1, 'uk'),\n('EX39', '', '', '51.014', '-4.246', 0, 1, 'uk'),\n('EX4', '', '', '50.73', '-3.526', 0, 1, 'uk'),\n('EX5', '', '', '50.757', '-3.439', 0, 1, 'uk'),\n('EX6', '', '', '50.677', '-3.597', 0, 1, 'uk'),\n('EX7', '', '', '50.592', '-3.473', 0, 1, 'uk'),\n('EX8', '', '', '50.629', '-3.401', 0, 1, 'uk'),\n('EX9', '', '', '50.639', '-3.323', 0, 1, 'uk'),\n('FK1', '', '', '55.985', '-3.793', 0, 1, 'uk'),\n('FK10', '', '', '56.115', '-3.781', 0, 1, 'uk'),\n('FK11', '', '', '56.15', '-3.85', 0, 1, 'uk'),\n('FK12', '', '', '56.152', '-3.8', 0, 1, 'uk'),\n('FK13', '', '', '56.151', '-3.74', 0, 1, 'uk'),\n('FK14', '', '', '56.166', '-3.66', 0, 1, 'uk'),\n('FK15', '', '', '56.203', '-3.949', 0, 1, 'uk'),\n('FK16', '', '', '56.191', '-4.059', 0, 1, 'uk'),\n('FK17', '', '', '56.24', '-4.219', 0, 1, 'uk'),\n('FK18', '', '', '56.325', '-4.328', 0, 1, 'uk'),\n('FK19', '', '', '56.371', '-4.313', 0, 1, 'uk'),\n('FK2', '', '', '56.005', '-3.754', 0, 1, 'uk'),\n('FK20', '', '', '56.406', '-4.63', 0, 1, 'uk'),\n('FK21', '', '', '56.466', '-4.319', 0, 1, 'uk'),\n('FK3', '', '', '56.011', '-3.719', 0, 1, 'uk'),\n('FK4', '', '', '55.997', '-3.906', 0, 1, 'uk'),\n('FK5', '', '', '56.025', '-3.818', 0, 1, 'uk'),\n('FK6', '', '', '56.022', '-3.915', 0, 1, 'uk'),\n('FK7', '', '', '56.097', '-3.917', 0, 1, 'uk'),\n('FK8', '', '', '56.131', '-4.051', 0, 1, 'uk'),\n('FK9', '', '', '56.142', '-3.94', 0, 1, 'uk'),\n('FY1', '', '', '53.815', '-3.046', 0, 1, 'uk'),\n('FY2', '', '', '53.845', '-3.039', 0, 1, 'uk'),\n('FY3', '', '', '53.821', '-3.021', 0, 1, 'uk'),\n('FY4', '', '', '53.791', '-3.028', 0, 1, 'uk'),\n('FY5', '', '', '53.874', '-3.021', 0, 1, 'uk'),\n('FY6', '', '', '53.868', '-2.981', 0, 1, 'uk'),\n('FY7', '', '', '53.916', '-3.026', 0, 1, 'uk'),\n('FY8', '', '', '53.751', '-3.002', 0, 1, 'uk'),\n('G1', '', '', '55.86', '-4.247', 0, 1, 'uk'),\n('G11', '', '', '55.874', '-4.312', 0, 1, 'uk'),\n('G12', '', '', '55.88', '-4.3', 0, 1, 'uk'),\n('G13', '', '', '55.894', '-4.347', 0, 1, 'uk'),\n('G14', '', '', '55.881', '-4.349', 0, 1, 'uk'),\n('G15', '', '', '55.91', '-4.365', 0, 1, 'uk'),\n('G2', '', '', '55.864', '-4.255', 0, 1, 'uk'),\n('G20', '', '', '55.886', '-4.282', 0, 1, 'uk'),\n('G21', '', '', '55.881', '-4.22', 0, 1, 'uk'),\n('G22', '', '', '55.89', '-4.251', 0, 1, 'uk'),\n('G23', '', '', '55.902', '-4.284', 0, 1, 'uk'),\n('G3', '', '', '55.866', '-4.272', 0, 1, 'uk'),\n('G31', '', '', '55.857', '-4.208', 0, 1, 'uk'),\n('G32', '', '', '55.849', '-4.163', 0, 1, 'uk'),\n('G33', '', '', '55.873', '-4.165', 0, 1, 'uk'),\n('G34', '', '', '55.868', '-4.111', 0, 1, 'uk'),\n('G4', '', '', '55.868', '-4.252', 0, 1, 'uk'),\n('G40', '', '', '55.848', '-4.222', 0, 1, 'uk'),\n('G41', '', '', '55.838', '-4.282', 0, 1, 'uk'),\n('G42', '', '', '55.833', '-4.256', 0, 1, 'uk'),\n('G43', '', '', '55.818', '-4.29', 0, 1, 'uk'),\n('G44', '', '', '55.814', '-4.255', 0, 1, 'uk'),\n('G45', '', '', '55.805', '-4.231', 0, 1, 'uk'),\n('G46', '', '', '55.804', '-4.307', 0, 1, 'uk'),\n('G5', '', '', '55.848', '-4.252', 0, 1, 'uk'),\n('G51', '', '', '55.858', '-4.314', 0, 1, 'uk'),\n('G52', '', '', '55.848', '-4.348', 0, 1, 'uk'),\n('G53', '', '', '55.822', '-4.351', 0, 1, 'uk'),\n('G60', '', '', '55.922', '-4.453', 0, 1, 'uk'),\n('G61', '', '', '55.919', '-4.33', 0, 1, 'uk'),\n('G62', '', '', '55.943', '-4.32', 0, 1, 'uk'),\n('G63', '', '', '56.042', '-4.364', 0, 1, 'uk'),\n('G64', '', '', '55.911', '-4.217', 0, 1, 'uk'),\n('G65', '', '', '55.973', '-4.057', 0, 1, 'uk'),\n('G66', '', '', '55.941', '-4.153', 0, 1, 'uk'),\n('G67', '', '', '55.947', '-3.985', 0, 1, 'uk'),\n('G68', '', '', '55.953', '-4.01', 0, 1, 'uk'),\n('G69', '', '', '55.874', '-4.102', 0, 1, 'uk'),\n('G71', '', '', '55.822', '-4.073', 0, 1, 'uk'),\n('G72', '', '', '55.804', '-4.128', 0, 1, 'uk'),\n('G73', '', '', '55.82', '-4.206', 0, 1, 'uk'),\n('G74', '', '', '55.769', '-4.173', 0, 1, 'uk'),\n('G75', '', '', '55.771341', '-4.155749', 0, 1, 'uk'),\n('G76', '', '', '55.778', '-4.272', 0, 1, 'uk'),\n('G77', '', '', '55.774', '-4.33', 0, 1, 'uk'),\n('G78', '', '', '55.793', '-4.409', 0, 1, 'uk'),\n('G81', '', '', '55.913', '-4.406', 0, 1, 'uk'),\n('G82', '', '', '55.952', '-4.574', 0, 1, 'uk'),\n('G83', '', '', '56.012', '-4.585', 0, 1, 'uk'),\n('G84', '', '', '56.014', '-4.754', 0, 1, 'uk'),\n('GL1', '', '', '51.86', '-2.239', 0, 1, 'uk'),\n('GL10', '', '', '51.743', '-2.284', 0, 1, 'uk'),\n('GL11', '', '', '51.689', '-2.356', 0, 1, 'uk'),\n('GL12', '', '', '51.625', '-2.385', 0, 1, 'uk'),\n('GL13', '', '', '51.693', '-2.459', 0, 1, 'uk'),\n('GL14', '', '', '51.817', '-2.479', 0, 1, 'uk'),\n('GL15', '', '', '51.736', '-2.551', 0, 1, 'uk'),\n('GL16', '', '', '51.795', '-2.611', 0, 1, 'uk'),\n('GL17', '', '', '51.856', '-2.514', 0, 1, 'uk'),\n('GL18', '', '', '51.941', '-2.414', 0, 1, 'uk'),\n('GL19', '', '', '51.943', '-2.286', 0, 1, 'uk'),\n('GL2', '', '', '51.846', '-2.267', 0, 1, 'uk'),\n('GL20', '', '', '52.003', '-2.13', 0, 1, 'uk'),\n('GL29', '', '', '52.091444', '-2.351365', 0, 1, 'uk'),\n('GL3', '', '', '51.865', '-2.177', 0, 1, 'uk'),\n('GL4', '', '', '51.842', '-2.216', 0, 1, 'uk'),\n('GL5', '', '', '51.738', '-2.219', 0, 1, 'uk'),\n('GL50', '', '', '51.9', '-2.08', 0, 1, 'uk'),\n('GL51', '', '', '51.899', '-2.107', 0, 1, 'uk'),\n('GL52', '', '', '51.916', '-2.058', 0, 1, 'uk'),\n('GL53', '', '', '51.881', '-2.067', 0, 1, 'uk'),\n('GL54', '', '', '51.897', '-1.864', 0, 1, 'uk'),\n('GL55', '', '', '52.061', '-1.768', 0, 1, 'uk'),\n('GL56', '', '', '51.988', '-1.704', 0, 1, 'uk'),\n('GL6', '', '', '51.735', '-2.192', 0, 1, 'uk'),\n('GL7', '', '', '51.713', '-1.897', 0, 1, 'uk'),\n('GL8', '', '', '51.642', '-2.171', 0, 1, 'uk'),\n('GL9', '', '', '51.557', '-2.298', 0, 1, 'uk'),\n('GU1', '', '', '51.243', '-0.564', 0, 1, 'uk'),\n('GU10', '', '', '51.197', '-0.796', 0, 1, 'uk'),\n('GU11', '', '', '51.248', '-0.761', 0, 1, 'uk'),\n('GU12', '', '', '51.251', '-0.731', 0, 1, 'uk'),\n('GU13', '', '', '51.274', '-0.837', 0, 1, 'uk'),\n('GU14', '', '', '51.293', '-0.761', 0, 1, 'uk'),\n('GU15', '', '', '51.334', '-0.739', 0, 1, 'uk'),\n('GU16', '', '', '51.311', '-0.729', 0, 1, 'uk'),\n('GU17', '', '', '51.329', '-0.785', 0, 1, 'uk'),\n('GU18', '', '', '51.349', '-0.67', 0, 1, 'uk'),\n('GU19', '', '', '51.36', '-0.69', 0, 1, 'uk'),\n('GU2', '', '', '51.245', '-0.592', 0, 1, 'uk'),\n('GU20', '', '', '51.368', '-0.656', 0, 1, 'uk'),\n('GU21', '', '', '51.32', '-0.577', 0, 1, 'uk'),\n('GU22', '', '', '51.312', '-0.55', 0, 1, 'uk'),\n('GU23', '', '', '51.297', '-0.508', 0, 1, 'uk'),\n('GU24', '', '', '51.329', '-0.626', 0, 1, 'uk'),\n('GU25', '', '', '51.401', '-0.57', 0, 1, 'uk'),\n('GU26', '', '', '51.112', '-0.746', 0, 1, 'uk'),\n('GU27', '', '', '51.082', '-0.718', 0, 1, 'uk'),\n('GU28', '', '', '50.99', '-0.63', 0, 1, 'uk'),\n('GU29', '', '', '50.984', '-0.746', 0, 1, 'uk'),\n('GU3', '', '', '51.246', '-0.624', 0, 1, 'uk'),\n('GU30', '', '', '51.074', '-0.803', 0, 1, 'uk'),\n('GU31', '', '', '50.996', '-0.902', 0, 1, 'uk'),\n('GU32', '', '', '51.008', '-0.97', 0, 1, 'uk'),\n('GU33', '', '', '51.049', '-0.891', 0, 1, 'uk'),\n('GU34', '', '', '51.139', '-0.983', 0, 1, 'uk'),\n('GU35', '', '', '51.116', '-0.846', 0, 1, 'uk'),\n('GU4', '', '', '51.243', '-0.541', 0, 1, 'uk'),\n('GU46', '', '', '51.337', '-0.825', 0, 1, 'uk'),\n('GU47', '', '', '51.348', '-0.788', 0, 1, 'uk'),\n('GU5', '', '', '51.203', '-0.515', 0, 1, 'uk'),\n('GU51', '', '', '51.283', '-0.84', 0, 1, 'uk'),\n('GU52', '', '', '51.264', '-0.838', 0, 1, 'uk'),\n('GU6', '', '', '51.141', '-0.482', 0, 1, 'uk'),\n('GU7', '', '', '51.189', '-0.61', 0, 1, 'uk'),\n('GU8', '', '', '51.151', '-0.64', 0, 1, 'uk'),\n('GU9', '', '', '51.218', '-0.793', 0, 1, 'uk'),\n('GY1', '', '', '49.459269', '-2.538099', 0, 1, 'uk'),\n('H10', '', '', '51.112343', '-0.187082', 0, 1, 'uk'),\n('HA0', '', '', '51.55', '-0.304', 0, 1, 'uk'),\n('HA1', '', '', '51.58', '-0.336', 0, 1, 'uk'),\n('HA2', '', '', '51.574', '-0.357', 0, 1, 'uk'),\n('HA3', '', '', '51.592', '-0.32', 0, 1, 'uk'),\n('HA4', '', '', '51.57', '-0.409', 0, 1, 'uk'),\n('HA5', '', '', '51.594', '-0.385', 0, 1, 'uk'),\n('HA6', '', '', '51.61', '-0.42', 0, 1, 'uk'),\n('HA7', '', '', '51.61', '-0.307', 0, 1, 'uk'),\n('HA8', '', '', '51.611', '-0.272', 0, 1, 'uk'),\n('HA9', '', '', '51.559', '-0.287', 0, 1, 'uk'),\n('HD1', '', '', '53.647', '-1.788', 0, 1, 'uk'),\n('HD2', '', '', '53.668', '-1.775', 0, 1, 'uk'),\n('HD3', '', '', '53.653', '-1.828', 0, 1, 'uk'),\n('HD4', '', '', '53.626', '-1.796', 0, 1, 'uk'),\n('HD5', '', '', '53.647', '-1.746', 0, 1, 'uk'),\n('HD6', '', '', '53.702', '-1.782', 0, 1, 'uk'),\n('HD7', '', '', '53.624', '-1.877', 0, 1, 'uk'),\n('HD8', '', '', '53.601', '-1.679', 0, 1, 'uk'),\n('HD80', '', '', '53.633649', '-1.722611', 0, 1, 'uk'),\n('HD9', '', '', '53.58', '-1.795', 0, 1, 'uk'),\n('HG1', '', '', '54', '-1.533', 0, 1, 'uk'),\n('HG2', '', '', '53.987', '-1.526', 0, 1, 'uk'),\n('HG3', '', '', '54.031', '-1.616', 0, 1, 'uk'),\n('HG4', '', '', '54.156', '-1.566', 0, 1, 'uk'),\n('HG41', '', '', '54.141875', '-1.521458', 0, 1, 'uk'),\n('HG5', '', '', '54.013', '-1.457', 0, 1, 'uk'),\n('HP1', '', '', '51.755', '-0.488', 0, 1, 'uk'),\n('HP10', '', '', '51.609', '-0.702', 0, 1, 'uk'),\n('HP11', '', '', '51.624', '-0.744', 0, 1, 'uk'),\n('HP12', '', '', '51.625', '-0.778', 0, 1, 'uk'),\n('HP13', '', '', '51.633', '-0.741', 0, 1, 'uk'),\n('HP14', '', '', '51.649', '-0.828', 0, 1, 'uk'),\n('HP15', '', '', '51.656', '-0.712', 0, 1, 'uk'),\n('HP16', '', '', '51.702', '-0.717', 0, 1, 'uk'),\n('HP17', '', '', '51.776', '-0.87', 0, 1, 'uk'),\n('HP18', '', '', '51.814', '-0.982', 0, 1, 'uk'),\n('HP19', '', '', '51.822', '-0.825', 0, 1, 'uk'),\n('HP2', '', '', '51.762', '-0.452', 0, 1, 'uk'),\n('HP20', '', '', '51.819', '-0.803', 0, 1, 'uk'),\n('HP21', '', '', '51.806', '-0.805', 0, 1, 'uk'),\n('HP22', '', '', '51.806', '-0.766', 0, 1, 'uk'),\n('HP23', '', '', '51.795', '-0.66', 0, 1, 'uk'),\n('HP27', '', '', '51.719', '-0.83', 0, 1, 'uk'),\n('HP3', '', '', '51.737', '-0.47', 0, 1, 'uk'),\n('HP4', '', '', '51.767', '-0.567', 0, 1, 'uk'),\n('HP5', '', '', '51.712', '-0.608', 0, 1, 'uk'),\n('HP6', '', '', '51.678', '-0.598', 0, 1, 'uk'),\n('HP7', '', '', '51.665', '-0.608', 0, 1, 'uk'),\n('HP8', '', '', '51.642', '-0.573', 0, 1, 'uk'),\n('HP9', '', '', '51.61', '-0.639', 0, 1, 'uk'),\n('HR1', '', '', '52.064', '-2.669', 0, 1, 'uk'),\n('HR2', '', '', '52.01', '-2.783', 0, 1, 'uk'),\n('HR3', '', '', '52.094', '-3.075', 0, 1, 'uk'),\n('HR4', '', '', '52.088', '-2.766', 0, 1, 'uk'),\n('HR5', '', '', '52.192', '-3.027', 0, 1, 'uk'),\n('HR6', '', '', '52.233', '-2.771', 0, 1, 'uk'),\n('HR7', '', '', '52.186', '-2.521', 0, 1, 'uk'),\n('HR8', '', '', '52.044', '-2.444', 0, 1, 'uk'),\n('HR9', '', '', '51.908', '-2.582', 0, 1, 'uk'),\n('HS1', '', '', '58.213', '-6.381', 0, 1, 'uk'),\n('HS2', '', '', '58.249', '-6.468', 0, 1, 'uk'),\n('HS3', '', '', '57.879', '-6.853', 0, 1, 'uk'),\n('HS4', '', '', '57.87', '-6.69', 0, 1, 'uk'),\n('HS5', '', '', '57.8', '-6.961', 0, 1, 'uk'),\n('HS6', '', '', '57.601', '-7.299', 0, 1, 'uk'),\n('HS7', '', '', '57.447', '-7.34', 0, 1, 'uk'),\n('HS8', '', '', '57.233', '-7.346', 0, 1, 'uk'),\n('HS9', '', '', '56.972', '-7.472', 0, 1, 'uk'),\n('HU1', '', '', '53.743', '-0.335', 0, 1, 'uk'),\n('HU10', '', '', '53.752', '-0.441', 0, 1, 'uk'),\n('HU11', '', '', '53.826', '-0.22', 0, 1, 'uk'),\n('HU12', '', '', '53.724', '-0.13', 0, 1, 'uk'),\n('HU13', '', '', '53.725', '-0.435', 0, 1, 'uk'),\n('HU14', '', '', '53.728', '-0.5', 0, 1, 'uk'),\n('HU15', '', '', '53.749', '-0.622', 0, 1, 'uk'),\n('HU16', '', '', '53.781', '-0.419', 0, 1, 'uk'),\n('HU17', '', '', '53.847', '-0.427', 0, 1, 'uk'),\n('HU18', '', '', '53.909', '-0.167', 0, 1, 'uk'),\n('HU19', '', '', '53.723', '0.036', 0, 1, 'uk'),\n('HU2', '', '', '53.75', '-0.338', 0, 1, 'uk'),\n('HU20', '', '', '53.788', '-0.513', 0, 1, 'uk'),\n('HU3', '', '', '53.742', '-0.365', 0, 1, 'uk'),\n('HU4', '', '', '53.736', '-0.4', 0, 1, 'uk'),\n('HU5', '', '', '53.76', '-0.375', 0, 1, 'uk'),\n('HU6', '', '', '53.781', '-0.369', 0, 1, 'uk'),\n('HU7', '', '', '53.789', '-0.325', 0, 1, 'uk'),\n('HU8', '', '', '53.769', '-0.299', 0, 1, 'uk'),\n('HU9', '', '', '53.756', '-0.286', 0, 1, 'uk'),\n('HW8', '', '', '51.607185', '-0.276155', 0, 1, 'uk'),\n('HX1', '', '', '53.721', '-1.87', 0, 1, 'uk'),\n('HX2', '', '', '53.738', '-1.904', 0, 1, 'uk'),\n('HX3', '', '', '53.726', '-1.844', 0, 1, 'uk'),\n('HX4', '', '', '53.679', '-1.88', 0, 1, 'uk'),\n('HX5', '', '', '53.686', '-1.835', 0, 1, 'uk'),\n('HX6', '', '', '53.698', '-1.924', 0, 1, 'uk'),\n('HX7', '', '', '53.739', '-2.007', 0, 1, 'uk'),\n('IG1', '', '', '51.559', '0.075', 0, 1, 'uk'),\n('IG10', '', '', '51.648', '0.066', 0, 1, 'uk'),\n('IG11', '', '', '51.535', '0.094', 0, 1, 'uk'),\n('IG2', '', '', '51.574', '0.082', 0, 1, 'uk'),\n('IG3', '', '', '51.562', '0.101', 0, 1, 'uk'),\n('IG4', '', '', '51.577', '0.055', 0, 1, 'uk'),\n('IG5', '', '', '51.588', '0.066', 0, 1, 'uk'),\n('IG6', '', '', '51.593', '0.089', 0, 1, 'uk'),\n('IG7', '', '', '51.613', '0.089', 0, 1, 'uk'),\n('IG8', '', '', '51.607', '0.034', 0, 1, 'uk'),\n('IG9', '', '', '51.623', '0.04', 0, 1, 'uk'),\n('IM1', '', '', '54.149847', '-4.48465', 0, 1, 'uk'),\n('IM2', '', '', '54.150778', '-4.506451', 0, 1, 'uk'),\n('IM3', '', '', '54.170601', '-4.455229', 0, 1, 'uk'),\n('IM4', '', '', '54.136934', '-4.547301', 0, 1, 'uk'),\n('IM5', '', '', '54.223595', '-4.696299', 0, 1, 'uk'),\n('IM6', '', '', '54.279755', '-4.588495', 0, 1, 'uk'),\n('IM7', '', '', '54.283903', '-4.350988', 0, 1, 'uk'),\n('IM8', '', '', '54.324059', '-4.382609', 0, 1, 'uk'),\n('IM9', '', '', '54.074537', '-4.643028', 0, 1, 'uk'),\n('IO6', '', '', '52.11206', '1.116439', 0, 1, 'uk'),\n('IP1', '', '', '52.067', '1.142', 0, 1, 'uk'),\n('IP10', '', '', '52.019', '1.27', 0, 1, 'uk'),\n('IP11', '', '', '51.97', '1.334', 0, 1, 'uk'),\n('IP12', '', '', '52.092', '1.373', 0, 1, 'uk'),\n('IP13', '', '', '52.185', '1.321', 0, 1, 'uk'),\n('IP14', '', '', '52.206', '1.035', 0, 1, 'uk'),\n('IP15', '', '', '52.157', '1.597', 0, 1, 'uk'),\n('IP16', '', '', '52.204', '1.586', 0, 1, 'uk'),\n('IP17', '', '', '52.23', '1.503', 0, 1, 'uk'),\n('IP18', '', '', '52.33', '1.673', 0, 1, 'uk'),\n('IP19', '', '', '52.34', '1.495', 0, 1, 'uk'),\n('IP2', '', '', '52.045', '1.136', 0, 1, 'uk'),\n('IP20', '', '', '52.406', '1.321', 0, 1, 'uk'),\n('IP21', '', '', '52.364', '1.236', 0, 1, 'uk'),\n('IP22', '', '', '52.376', '1.053', 0, 1, 'uk'),\n('IP23', '', '', '52.307', '1.125', 0, 1, 'uk'),\n('IP24', '', '', '52.419', '0.759', 0, 1, 'uk'),\n('IP25', '', '', '52.586', '0.84', 0, 1, 'uk'),\n('IP26', '', '', '52.508', '0.577', 0, 1, 'uk'),\n('IP27', '', '', '52.43', '0.586', 0, 1, 'uk'),\n('IP28', '', '', '52.326', '0.549', 0, 1, 'uk'),\n('IP29', '', '', '52.193', '0.663', 0, 1, 'uk'),\n('IP3', '', '', '52.041', '1.188', 0, 1, 'uk'),\n('IP30', '', '', '52.209', '0.837', 0, 1, 'uk'),\n('IP31', '', '', '52.291', '0.828', 0, 1, 'uk'),\n('IP32', '', '', '52.254', '0.717', 0, 1, 'uk'),\n('IP33', '', '', '52.242', '0.708', 0, 1, 'uk'),\n('IP4', '', '', '52.06', '1.181', 0, 1, 'uk'),\n('IP5', '', '', '52.061', '1.242', 0, 1, 'uk'),\n('IP6', '', '', '52.131', '1.116', 0, 1, 'uk'),\n('IP7', '', '', '52.068', '0.95', 0, 1, 'uk'),\n('IP8', '', '', '52.062', '1.083', 0, 1, 'uk'),\n('IP9', '', '', '51.99', '1.149', 0, 1, 'uk'),\n('IV1', '', '', '57.487', '-4.231', 0, 1, 'uk'),\n('IV10', '', '', '57.585', '-4.126', 0, 1, 'uk'),\n('IV11', '', '', '57.677', '-4.038', 0, 1, 'uk'),\n('IV12', '', '', '57.574', '-3.864', 0, 1, 'uk'),\n('IV13', '', '', '57.343', '-4.013', 0, 1, 'uk'),\n('IV14', '', '', '57.586', '-4.547', 0, 1, 'uk'),\n('IV15', '', '', '57.599', '-4.43', 0, 1, 'uk'),\n('IV16', '', '', '57.665', '-4.337', 0, 1, 'uk'),\n('IV17', '', '', '57.7', '-4.26', 0, 1, 'uk'),\n('IV18', '', '', '57.702', '-4.155', 0, 1, 'uk'),\n('IV19', '', '', '57.805', '-4.061', 0, 1, 'uk'),\n('IV2', '', '', '57.468', '-4.19', 0, 1, 'uk'),\n('IV20', '', '', '57.786', '-3.907', 0, 1, 'uk'),\n('IV21', '', '', '57.724', '-5.72', 0, 1, 'uk'),\n('IV22', '', '', '57.742', '-5.506', 0, 1, 'uk'),\n('IV23', '', '', '57.773', '-5.01', 0, 1, 'uk'),\n('IV24', '', '', '57.891', '-4.355', 0, 1, 'uk'),\n('IV25', '', '', '57.891', '-4.042', 0, 1, 'uk'),\n('IV26', '', '', '57.916', '-5.173', 0, 1, 'uk'),\n('IV27', '', '', '58.277', '-4.8', 0, 1, 'uk'),\n('IV28', '', '', '58.015', '-4.157', 0, 1, 'uk'),\n('IV3', '', '', '57.477', '-4.245', 0, 1, 'uk'),\n('IV30', '', '', '57.654', '-3.327', 0, 1, 'uk'),\n('IV31', '', '', '57.717', '-3.289', 0, 1, 'uk'),\n('IV32', '', '', '57.632', '-3.11', 0, 1, 'uk'),\n('IV33', '', '', '57.528877', '-3.209202', 0, 1, 'uk'),\n('IV35', '', '', '57.458131', '-3.346743', 0, 1, 'uk'),\n('IV36', '', '', '57.611', '-3.604', 0, 1, 'uk'),\n('IV4', '', '', '57.448', '-4.533', 0, 1, 'uk'),\n('IV40', '', '', '57.275', '-5.65', 0, 1, 'uk'),\n('IV41', '', '', '57.274', '-5.735', 0, 1, 'uk'),\n('IV42', '', '', '57.239', '-5.829', 0, 1, 'uk'),\n('IV43', '', '', '57.156', '-5.81', 0, 1, 'uk'),\n('IV44', '', '', '57.115', '-5.874', 0, 1, 'uk'),\n('IV45', '', '', '57.067', '-5.906', 0, 1, 'uk'),\n('IV46', '', '', '57.114', '-5.984', 0, 1, 'uk'),\n('IV47', '', '', '57.294', '-6.344', 0, 1, 'uk'),\n('IV48', '', '', '57.311', '-6.098', 0, 1, 'uk'),\n('IV49', '', '', '57.228', '-5.946', 0, 1, 'uk'),\n('IV5', '', '', '57.468', '-4.411', 0, 1, 'uk'),\n('IV51', '', '', '57.481', '-6.246', 0, 1, 'uk'),\n('IV52', '', '', '57.337', '-5.651', 0, 1, 'uk'),\n('IV53', '', '', '57.344', '-5.554', 0, 1, 'uk'),\n('IV54', '', '', '57.431', '-5.616', 0, 1, 'uk'),\n('IV55', '', '', '57.459', '-6.611', 0, 1, 'uk'),\n('IV56', '', '', '57.366', '-6.429', 0, 1, 'uk'),\n('IV6', '', '', '57.526', '-4.458', 0, 1, 'uk'),\n('IV63', '', '', '57.323', '-4.505', 0, 1, 'uk'),\n('IV7', '', '', '57.584', '-4.384', 0, 1, 'uk'),\n('IV8', '', '', '57.554', '-4.265', 0, 1, 'uk'),\n('IV9', '', '', '57.569', '-4.177', 0, 1, 'uk'),\n('JE2', '', '', '49.201412', '-2.115852', 0, 1, 'uk'),\n('JE3', '', '', '49.187959', '-2.170604', 0, 1, 'uk'),\n('KA1', '', '', '55.596', '-4.496', 0, 1, 'uk'),\n('KA10', '', '', '55.549', '-4.648', 0, 1, 'uk'),\n('KA11', '', '', '55.618', '-4.626', 0, 1, 'uk'),\n('KA12', '', '', '55.619', '-4.664', 0, 1, 'uk'),\n('KA13', '', '', '55.655', '-4.699', 0, 1, 'uk'),\n('KA14', '', '', '55.74', '-4.671', 0, 1, 'uk'),\n('KA15', '', '', '55.748', '-4.625', 0, 1, 'uk'),\n('KA16', '', '', '55.607', '-4.33', 0, 1, 'uk'),\n('KA17', '', '', '55.611', '-4.282', 0, 1, 'uk'),\n('KA18', '', '', '55.451', '-4.239', 0, 1, 'uk'),\n('KA19', '', '', '55.346', '-4.667', 0, 1, 'uk'),\n('KA2', '', '', '55.596', '-4.563', 0, 1, 'uk'),\n('KA20', '', '', '55.641', '-4.751', 0, 1, 'uk'),\n('KA21', '', '', '55.641', '-4.783', 0, 1, 'uk'),\n('KA22', '', '', '55.65', '-4.807', 0, 1, 'uk'),\n('KA23', '', '', '55.691', '-4.855', 0, 1, 'uk'),\n('KA24', '', '', '55.71', '-4.715', 0, 1, 'uk'),\n('KA25', '', '', '55.753', '-4.688', 0, 1, 'uk'),\n('KA26', '', '', '55.219', '-4.834', 0, 1, 'uk'),\n('KA27', '', '', '55.539', '-5.172', 0, 1, 'uk'),\n('KA28', '', '', '55.755', '-4.924', 0, 1, 'uk'),\n('KA29', '', '', '55.757', '-4.853', 0, 1, 'uk'),\n('KA3', '', '', '55.644', '-4.495', 0, 1, 'uk'),\n('KA30', '', '', '55.797', '-4.862', 0, 1, 'uk'),\n('KA4', '', '', '55.599', '-4.382', 0, 1, 'uk'),\n('KA5', '', '', '55.51', '-4.386', 0, 1, 'uk'),\n('KA6', '', '', '55.415', '-4.505', 0, 1, 'uk'),\n('KA7', '', '', '55.448', '-4.628', 0, 1, 'uk'),\n('KA8', '', '', '55.472', '-4.612', 0, 1, 'uk'),\n('KA9', '', '', '55.497', '-4.604', 0, 1, 'uk'),\n('KT1', '', '', '51.407', '-0.297', 0, 1, 'uk'),\n('KT10', '', '', '51.368', '-0.354', 0, 1, 'uk'),\n('KT11', '', '', '51.328', '-0.402', 0, 1, 'uk'),\n('KT12', '', '', '51.377', '-0.407', 0, 1, 'uk'),\n('KT13', '', '', '51.368', '-0.449', 0, 1, 'uk'),\n('KT14', '', '', '51.339', '-0.486', 0, 1, 'uk'),\n('KT15', '', '', '51.363', '-0.494', 0, 1, 'uk'),\n('KT16', '', '', '51.383', '-0.514', 0, 1, 'uk'),\n('KT17', '', '', '51.341', '-0.248', 0, 1, 'uk'),\n('KT18', '', '', '51.317', '-0.262', 0, 1, 'uk'),\n('KT19', '', '', '51.351', '-0.267', 0, 1, 'uk'),\n('KT2', '', '', '51.416', '-0.289', 0, 1, 'uk'),\n('KT20', '', '', '51.286', '-0.23', 0, 1, 'uk'),\n('KT21', '', '', '51.311', '-0.301', 0, 1, 'uk'),\n('KT22', '', '', '51.301', '-0.337', 0, 1, 'uk'),\n('KT23', '', '', '51.281', '-0.37', 0, 1, 'uk'),\n('KT24', '', '', '51.269', '-0.429', 0, 1, 'uk'),\n('KT3', '', '', '51.399', '-0.256', 0, 1, 'uk'),\n('KT4', '', '', '51.378', '-0.242', 0, 1, 'uk'),\n('KT5', '', '', '51.392', '-0.286', 0, 1, 'uk'),\n('KT6', '', '', '51.389', '-0.299', 0, 1, 'uk'),\n('KT7', '', '', '51.389', '-0.328', 0, 1, 'uk'),\n('KT8', '', '', '51.401', '-0.363', 0, 1, 'uk'),\n('KT9', '', '', '51.364', '-0.301', 0, 1, 'uk'),\n('KW1', '', '', '58.458', '-3.121', 0, 1, 'uk'),\n('KW10', '', '', '57.975', '-3.975', 0, 1, 'uk'),\n('KW11', '', '', '58.305', '-4.13', 0, 1, 'uk'),\n('KW12', '', '', '58.506', '-3.491', 0, 1, 'uk'),\n('KW13', '', '', '58.455', '-3.895', 0, 1, 'uk'),\n('KW14', '', '', '58.589', '-3.556', 0, 1, 'uk'),\n('KW15', '', '', '58.981', '-2.959', 0, 1, 'uk'),\n('KW16', '', '', '58.96', '-3.274', 0, 1, 'uk'),\n('KW17', '', '', '59.042', '-3.003', 0, 1, 'uk'),\n('KW2', '', '', '58.349', '-3.163', 0, 1, 'uk'),\n('KW3', '', '', '58.308', '-3.279', 0, 1, 'uk'),\n('KW5', '', '', '58.287', '-3.382', 0, 1, 'uk'),\n('KW6', '', '', '58.249', '-3.442', 0, 1, 'uk'),\n('KW7', '', '', '58.187', '-3.5', 0, 1, 'uk'),\n('KW8', '', '', '58.116', '-3.664', 0, 1, 'uk'),\n('KW9', '', '', '58.014', '-3.858', 0, 1, 'uk'),\n('KY1', '', '', '56.128', '-3.137', 0, 1, 'uk'),\n('KY10', '', '', '56.231', '-2.7', 0, 1, 'uk'),\n('KY11', '', '', '56.047', '-3.415', 0, 1, 'uk'),\n('KY12', '', '', '56.077', '-3.492', 0, 1, 'uk'),\n('KY13', '', '', '56.208', '-3.432', 0, 1, 'uk'),\n('KY14', '', '', '56.31', '-3.239', 0, 1, 'uk'),\n('KY15', '', '', '56.3', '-3.051', 0, 1, 'uk'),\n('KY16', '', '', '56.342', '-2.819', 0, 1, 'uk'),\n('KY2', '', '', '56.123', '-3.182', 0, 1, 'uk'),\n('KY3', '', '', '56.064', '-3.23', 0, 1, 'uk'),\n('KY4', '', '', '56.115', '-3.361', 0, 1, 'uk'),\n('KY5', '', '', '56.145', '-3.294', 0, 1, 'uk'),\n('KY6', '', '', '56.197', '-3.197', 0, 1, 'uk'),\n('KY7', '', '', '56.197', '-3.154', 0, 1, 'uk'),\n('KY8', '', '', '56.197', '-3.011', 0, 1, 'uk'),\n('KY9', '', '', '56.21', '-2.833', 0, 1, 'uk'),\n('L1', '', '', '53.402', '-2.979', 0, 1, 'uk'),\n('L10', '', '', '53.474', '-2.926', 0, 1, 'uk'),\n('L11', '', '', '53.448', '-2.914', 0, 1, 'uk'),\n('L12', '', '', '53.435', '-2.895', 0, 1, 'uk'),\n('L13', '', '', '53.417', '-2.919', 0, 1, 'uk'),\n('L14', '', '', '53.418', '-2.879', 0, 1, 'uk'),\n('L15', '', '', '53.397', '-2.919', 0, 1, 'uk'),\n('L16', '', '', '53.398', '-2.887', 0, 1, 'uk'),\n('L17', '', '', '53.378', '-2.94', 0, 1, 'uk'),\n('L18', '', '', '53.38', '-2.907', 0, 1, 'uk'),\n('L19', '', '', '53.359', '-2.902', 0, 1, 'uk'),\n('L2', '', '', '53.407', '-2.989', 0, 1, 'uk'),\n('L20', '', '', '53.452', '-2.988', 0, 1, 'uk'),\n('L21', '', '', '53.471', '-2.999', 0, 1, 'uk'),\n('L22', '', '', '53.477', '-3.026', 0, 1, 'uk'),\n('L23', '', '', '53.491', '-3.022', 0, 1, 'uk'),\n('L24', '', '', '53.343', '-2.836', 0, 1, 'uk'),\n('L25', '', '', '53.378', '-2.862', 0, 1, 'uk'),\n('L26', '', '', '53.364', '-2.832', 0, 1, 'uk'),\n('L27', '', '', '53.388', '-2.837', 0, 1, 'uk'),\n('L28', '', '', '53.435', '-2.864', 0, 1, 'uk'),\n('L29', '', '', '53.507', '-2.983', 0, 1, 'uk'),\n('L3', '', '', '53.409', '-2.983', 0, 1, 'uk'),\n('L30', '', '', '53.484', '-2.971', 0, 1, 'uk'),\n('L31', '', '', '53.513', '-2.937', 0, 1, 'uk'),\n('L32', '', '', '53.478', '-2.888', 0, 1, 'uk'),\n('L33', '', '', '53.489', '-2.875', 0, 1, 'uk'),\n('L34', '', '', '53.437', '-2.815', 0, 1, 'uk'),\n('L35', '', '', '53.415', '-2.782', 0, 1, 'uk'),\n('L36', '', '', '53.414', '-2.84', 0, 1, 'uk'),\n('L37', '', '', '53.557', '-3.062', 0, 1, 'uk'),\n('L38', '', '', '53.524', '-3.05', 0, 1, 'uk'),\n('L39', '', '', '53.562', '-2.896', 0, 1, 'uk'),\n('L4', '', '', '53.438', '-2.96', 0, 1, 'uk'),\n('L40', '', '', '53.602', '-2.841', 0, 1, 'uk'),\n('L5', '', '', '53.425', '-2.975', 0, 1, 'uk'),\n('L6', '', '', '53.419', '-2.95', 0, 1, 'uk'),\n('L69', '', '', '53.407', '-2.974', 0, 1, 'uk'),\n('L7', '', '', '53.406', '-2.948', 0, 1, 'uk'),\n('L70', '', '', '53.409', '-2.97', 0, 1, 'uk'),\n('L8', '', '', '53.39', '-2.962', 0, 1, 'uk'),\n('L9', '', '', '53.461', '-2.952', 0, 1, 'uk'),\n('LA1', '', '', '54.046', '-2.799', 0, 1, 'uk'),\n('LA10', '', '', '54.314', '-2.493', 0, 1, 'uk'),\n('LA11', '', '', '54.2', '-2.924', 0, 1, 'uk'),\n('LA12', '', '', '54.203', '-3.082', 0, 1, 'uk'),\n('LA13', '', '', '54.118', '-3.198', 0, 1, 'uk'),\n('LA14', '', '', '54.118', '-3.23', 0, 1, 'uk'),\n('LA15', '', '', '54.156', '-3.178', 0, 1, 'uk'),\n('LA16', '', '', '54.186', '-3.202', 0, 1, 'uk'),\n('LA17', '', '', '54.239', '-3.175', 0, 1, 'uk'),\n('LA18', '', '', '54.215', '-3.275', 0, 1, 'uk'),\n('LA19', '', '', '54.293', '-3.375', 0, 1, 'uk'),\n('LA2', '', '', '54.066', '-2.673', 0, 1, 'uk'),\n('LA20', '', '', '54.294', '-3.205', 0, 1, 'uk'),\n('LA21', '', '', '54.364', '-3.072', 0, 1, 'uk'),\n('LA22', '', '', '54.422', '-2.987', 0, 1, 'uk'),\n('LA23', '', '', '54.371', '-2.911', 0, 1, 'uk'),\n('LA3', '', '', '54.051', '-2.877', 0, 1, 'uk'),\n('LA4', '', '', '54.07', '-2.852', 0, 1, 'uk'),\n('LA5', '', '', '54.143', '-2.79', 0, 1, 'uk'),\n('LA50', '', '', '54.202028', '-2.827829', 0, 1, 'uk'),\n('LA6', '', '', '54.176', '-2.611', 0, 1, 'uk'),\n('LA63', '', '', '54.205629', '-2.359995', 0, 1, 'uk'),\n('LA7', '', '', '54.226', '-2.772', 0, 1, 'uk'),\n('LA8', '', '', '54.323', '-2.759', 0, 1, 'uk'),\n('LA9', '', '', '54.325', '-2.742', 0, 1, 'uk'),\n('LD1', '', '', '52.261', '-3.365', 0, 1, 'uk'),\n('LD2', '', '', '52.141', '-3.393', 0, 1, 'uk'),\n('LD3', '', '', '51.96', '-3.371', 0, 1, 'uk'),\n('LD4', '', '', '52.118', '-3.555', 0, 1, 'uk'),\n('LD5', '', '', '52.127', '-3.616', 0, 1, 'uk'),\n('LD6', '', '', '52.309', '-3.508', 0, 1, 'uk'),\n('LD7', '', '', '52.352', '-3.085', 0, 1, 'uk'),\n('LD8', '', '', '52.268', '-3.043', 0, 1, 'uk'),\n('LE1', '', '', '52.634', '-1.128', 0, 1, 'uk'),\n('LE10', '', '', '52.537', '-1.368', 0, 1, 'uk'),\n('LE11', '', '', '52.769', '-1.216', 0, 1, 'uk'),\n('LE12', '', '', '52.766', '-1.192', 0, 1, 'uk'),\n('LE13', '', '', '52.765', '-0.885', 0, 1, 'uk'),\n('LE14', '', '', '52.784', '-0.895', 0, 1, 'uk'),\n('LE15', '', '', '52.656', '-0.701', 0, 1, 'uk'),\n('LE16', '', '', '52.486', '-0.892', 0, 1, 'uk'),\n('LE17', '', '', '52.467', '-1.177', 0, 1, 'uk'),\n('LE18', '', '', '52.583', '-1.111', 0, 1, 'uk'),\n('LE19', '', '', '52.5834', '-1.194065', 0, 1, 'uk'),\n('LE2', '', '', '52.609', '-1.115', 0, 1, 'uk'),\n('LE3', '', '', '52.628', '-1.181', 0, 1, 'uk'),\n('LE4', '', '', '52.663', '-1.123', 0, 1, 'uk'),\n('LE42', '', '', '52.661927', '-1.141522', 0, 1, 'uk'),\n('LE5', '', '', '52.636', '-1.086', 0, 1, 'uk'),\n('LE6', '', '', '52.663', '-1.242', 0, 1, 'uk'),\n('LE65', '', '', '52.748', '-1.468', 0, 1, 'uk'),\n('LE67', '', '', '52.716', '-1.36', 0, 1, 'uk'),\n('LE7', '', '', '52.678', '-1.068', 0, 1, 'uk'),\n('LE8', '', '', '52.553', '-1.098', 0, 1, 'uk'),\n('LE9', '', '', '52.57', '-1.287', 0, 1, 'uk'),\n('LL11', '', '', '53.063', '-3.035', 0, 1, 'uk'),\n('LL12', '', '', '53.086', '-2.988', 0, 1, 'uk'),\n('LL13', '', '', '53.036', '-2.96', 0, 1, 'uk'),\n('LL14', '', '', '52.992', '-3.051', 0, 1, 'uk'),\n('LL15', '', '', '53.103', '-3.315', 0, 1, 'uk'),\n('LL16', '', '', '53.185', '-3.432', 0, 1, 'uk'),\n('LL17', '', '', '53.253', '-3.435', 0, 1, 'uk'),\n('LL18', '', '', '53.31', '-3.475', 0, 1, 'uk'),\n('LL19', '', '', '53.331', '-3.408', 0, 1, 'uk'),\n('LL20', '', '', '52.959', '-3.159', 0, 1, 'uk'),\n('LL21', '', '', '52.99', '-3.409', 0, 1, 'uk'),\n('LL22', '', '', '53.269', '-3.593', 0, 1, 'uk'),\n('LL23', '', '', '52.905', '-3.6', 0, 1, 'uk'),\n('LL24', '', '', '53.057', '-3.785', 0, 1, 'uk'),\n('LL25', '', '', '53.054', '-3.878', 0, 1, 'uk'),\n('LL26', '', '', '53.139', '-3.785', 0, 1, 'uk'),\n('LL27', '', '', '53.147', '-3.824', 0, 1, 'uk'),\n('LL28', '', '', '53.288', '-3.76', 0, 1, 'uk'),\n('LL29', '', '', '53.289', '-3.708', 0, 1, 'uk'),\n('LL30', '', '', '53.318', '-3.815', 0, 1, 'uk'),\n('LL31', '', '', '53.291', '-3.81', 0, 1, 'uk'),\n('LL32', '', '', '53.26', '-3.839', 0, 1, 'uk'),\n('LL33', '', '', '53.25', '-3.98', 0, 1, 'uk'),\n('LL34', '', '', '53.271', '-3.912', 0, 1, 'uk'),\n('LL35', '', '', '52.547', '-4.041', 0, 1, 'uk'),\n('LL36', '', '', '52.604', '-4.063', 0, 1, 'uk'),\n('LL37', '', '', '52.666', '-4.083', 0, 1, 'uk'),\n('LL38', '', '', '52.698', '-4.039', 0, 1, 'uk'),\n('LL39', '', '', '52.711', '-4.011', 0, 1, 'uk'),\n('LL40', '', '', '52.756', '-3.875', 0, 1, 'uk'),\n('LL41', '', '', '52.969', '-3.938', 0, 1, 'uk'),\n('LL42', '', '', '52.725', '-4.054', 0, 1, 'uk'),\n('LL43', '', '', '52.774', '-4.092', 0, 1, 'uk'),\n('LL44', '', '', '52.791', '-4.096', 0, 1, 'uk'),\n('LL45', '', '', '52.82', '-4.095', 0, 1, 'uk'),\n('LL46', '', '', '52.854', '-4.106', 0, 1, 'uk'),\n('LL47', '', '', '52.902', '-4.062', 0, 1, 'uk'),\n('LL48', '', '', '52.936', '-4.07', 0, 1, 'uk'),\n('LL49', '', '', '52.929', '-4.138', 0, 1, 'uk'),\n('LL4O', '', '', '52.756458', '-3.944837', 0, 1, 'uk'),\n('LL51', '', '', '52.974', '-4.238', 0, 1, 'uk'),\n('LL52', '', '', '52.925', '-4.24', 0, 1, 'uk'),\n('LL53', '', '', '52.884', '-4.491', 0, 1, 'uk'),\n('LL54', '', '', '53.059', '-4.285', 0, 1, 'uk'),\n('LL55', '', '', '53.134', '-4.204', 0, 1, 'uk'),\n('LL56', '', '', '53.187', '-4.199', 0, 1, 'uk'),\n('LL57', '', '', '53.207', '-4.111', 0, 1, 'uk'),\n('LL58', '', '', '53.28', '-4.099', 0, 1, 'uk'),\n('LL59', '', '', '53.235', '-4.159', 0, 1, 'uk'),\n('LL60', '', '', '53.215', '-4.27', 0, 1, 'uk'),\n('LL61', '', '', '53.195', '-4.262', 0, 1, 'uk'),\n('LL62', '', '', '53.21', '-4.385', 0, 1, 'uk'),\n('LL63', '', '', '53.219', '-4.471', 0, 1, 'uk'),\n('LL64', '', '', '53.228', '-4.517', 0, 1, 'uk'),\n('LL65', '', '', '53.301', '-4.569', 0, 1, 'uk'),\n('LL66', '', '', '53.381', '-4.405', 0, 1, 'uk'),\n('LL67', '', '', '53.411', '-4.456', 0, 1, 'uk'),\n('LL68', '', '', '53.398', '-4.377', 0, 1, 'uk'),\n('LL69', '', '', '53.386', '-4.318', 0, 1, 'uk'),\n('LL70', '', '', '53.364', '-4.287', 0, 1, 'uk'),\n('LL71', '', '', '53.327', '-4.368', 0, 1, 'uk'),\n('LL72', '', '', '53.35', '-4.24', 0, 1, 'uk'),\n('LL73', '', '', '53.335', '-4.244', 0, 1, 'uk'),\n('LL74', '', '', '53.316', '-4.232', 0, 1, 'uk'),\n('LL75', '', '', '53.283', '-4.218', 0, 1, 'uk'),\n('LL76', '', '', '53.301', '-4.238', 0, 1, 'uk'),\n('LL77', '', '', '53.26', '-4.311', 0, 1, 'uk'),\n('LL78', '', '', '53.317', '-4.262', 0, 1, 'uk'),\n('LN1', '', '', '53.259', '-0.587', 0, 1, 'uk'),\n('LN10', '', '', '53.158', '-0.217', 0, 1, 'uk'),\n('LN11', '', '', '53.373', '0.024', 0, 1, 'uk'),\n('LN12', '', '', '53.329', '0.266', 0, 1, 'uk'),\n('LN13', '', '', '53.265', '0.184', 0, 1, 'uk'),\n('LN2', '', '', '53.255', '-0.508', 0, 1, 'uk'),\n('LN3', '', '', '53.243', '-0.419', 0, 1, 'uk'),\n('LN4', '', '', '53.15', '-0.384', 0, 1, 'uk'),\n('LN5', '', '', '53.172', '-0.556', 0, 1, 'uk'),\n('LN6', '', '', '53.203', '-0.594', 0, 1, 'uk'),\n('LN7', '', '', '53.492', '-0.343', 0, 1, 'uk'),\n('LN8', '', '', '53.373', '-0.324', 0, 1, 'uk'),\n('LN9', '', '', '53.217', '-0.111', 0, 1, 'uk'),\n('LS1', '', '', '53.797', '-1.548', 0, 1, 'uk'),\n('LS10', '', '', '53.762', '-1.531', 0, 1, 'uk'),\n('LS11', '', '', '53.776', '-1.556', 0, 1, 'uk'),\n('LS12', '', '', '53.791', '-1.596', 0, 1, 'uk'),\n('LS13', '', '', '53.81', '-1.634', 0, 1, 'uk'),\n('LS14', '', '', '53.828', '-1.456', 0, 1, 'uk'),\n('LS15', '', '', '53.806', '-1.444', 0, 1, 'uk'),\n('LS16', '', '', '53.851', '-1.602', 0, 1, 'uk'),\n('LS17', '', '', '53.859', '-1.527', 0, 1, 'uk'),\n('LS18', '', '', '53.841', '-1.641', 0, 1, 'uk'),\n('LS19', '', '', '53.86', '-1.683', 0, 1, 'uk'),\n('LS2', '', '', '53.801', '-1.545', 0, 1, 'uk'),\n('LS20', '', '', '53.873', '-1.713', 0, 1, 'uk'),\n('LS21', '', '', '53.911', '-1.679', 0, 1, 'uk'),\n('LS22', '', '', '53.932', '-1.394', 0, 1, 'uk'),\n('LS23', '', '', '53.904', '-1.354', 0, 1, 'uk'),\n('LS24', '', '', '53.87', '-1.252', 0, 1, 'uk'),\n('LS25', '', '', '53.785', '-1.33', 0, 1, 'uk'),\n('LS26', '', '', '53.752', '-1.448', 0, 1, 'uk'),\n('LS27', '', '', '53.749', '-1.602', 0, 1, 'uk'),\n('LS28', '', '', '53.802', '-1.669', 0, 1, 'uk'),\n('LS29', '', '', '53.92', '-1.803', 0, 1, 'uk'),\n('LS3', '', '', '53.801', '-1.56', 0, 1, 'uk'),\n('LS4', '', '', '53.809', '-1.581', 0, 1, 'uk'),\n('LS5', '', '', '53.819', '-1.601', 0, 1, 'uk'),\n('LS6', '', '', '53.82', '-1.568', 0, 1, 'uk'),\n('LS7', '', '', '53.818', '-1.539', 0, 1, 'uk'),\n('LS72', '', '', '53.765618', '-1.58157', 0, 1, 'uk'),\n('LS8', '', '', '53.824', '-1.509', 0, 1, 'uk'),\n('LS9', '', '', '53.799', '-1.509', 0, 1, 'uk'),\n('LU1', '', '', '51.874', '-0.424', 0, 1, 'uk'),\n('LU2', '', '', '51.892', '-0.395', 0, 1, 'uk'),\n('LU3', '', '', '51.909', '-0.442', 0, 1, 'uk'),\n('LU4', '', '', '51.898', '-0.467', 0, 1, 'uk'),\n('LU49', '', '', '51.92918', '-0.502956', 0, 1, 'uk'),\n('LU5', '', '', '51.909', '-0.513', 0, 1, 'uk'),\n('LU6', '', '', '51.877', '-0.536', 0, 1, 'uk'),\n('LU7', '', '', '51.909', '-0.664', 0, 1, 'uk'),\n('M1', '', '', '53.477', '-2.235', 0, 1, 'uk'),\n('M11', '', '', '53.479', '-2.18', 0, 1, 'uk'),\n('M12', '', '', '53.464', '-2.201', 0, 1, 'uk'),\n('M13', '', '', '53.461', '-2.215', 0, 1, 'uk'),\n('M14', '', '', '53.448', '-2.224', 0, 1, 'uk'),\n('M15', '', '', '53.466', '-2.25', 0, 1, 'uk'),\n('M16', '', '', '53.455', '-2.263', 0, 1, 'uk'),\n('M17', '', '', '53.469', '-2.318', 0, 1, 'uk'),\n('M18', '', '', '53.461', '-2.169', 0, 1, 'uk'),\n('M19', '', '', '53.437', '-2.195', 0, 1, 'uk'),\n('M2', '', '', '53.48', '-2.243', 0, 1, 'uk'),\n('M20', '', '', '53.425', '-2.23', 0, 1, 'uk'),\n('M21', '', '', '53.438', '-2.271', 0, 1, 'uk'),\n('M22', '', '', '53.386', '-2.258', 0, 1, 'uk'),\n('M23', '', '', '53.399', '-2.287', 0, 1, 'uk'),\n('M24', '', '', '53.551', '-2.196', 0, 1, 'uk'),\n('M25', '', '', '53.528', '-2.275', 0, 1, 'uk'),\n('M26', '', '', '53.562', '-2.333', 0, 1, 'uk'),\n('M27', '', '', '53.512', '-2.337', 0, 1, 'uk'),\n('M28', '', '', '53.514', '-2.397', 0, 1, 'uk'),\n('M29', '', '', '53.508', '-2.457', 0, 1, 'uk'),\n('M3', '', '', '53.483', '-2.251', 0, 1, 'uk'),\n('M30', '', '', '53.484', '-2.354', 0, 1, 'uk'),\n('M31', '', '', '53.419', '-2.422', 0, 1, 'uk'),\n('M32', '', '', '53.45', '-2.309', 0, 1, 'uk'),\n('M33', '', '', '53.421', '-2.324', 0, 1, 'uk'),\n('M34', '', '', '53.456', '-2.117', 0, 1, 'uk'),\n('M35', '', '', '53.507', '-2.153', 0, 1, 'uk'),\n('M38', '', '', '53.532', '-2.421', 0, 1, 'uk'),\n('M4', '', '', '53.485', '-2.229', 0, 1, 'uk'),\n('M40', '', '', '53.504', '-2.19', 0, 1, 'uk'),\n('M41', '', '', '53.451', '-2.364', 0, 1, 'uk'),\n('M43', '', '', '53.483', '-2.148', 0, 1, 'uk'),\n('M44', '', '', '53.441', '-2.426', 0, 1, 'uk'),\n('M45', '', '', '53.547', '-2.289', 0, 1, 'uk'),\n('M46', '', '', '53.526', '-2.49', 0, 1, 'uk'),\n('M5', '', '', '53.479', '-2.284', 0, 1, 'uk'),\n('M50', '', '', '53.480982', '-2.309948', 0, 1, 'uk'),\n('M6', '', '', '53.492', '-2.297', 0, 1, 'uk'),\n('M60', '', '', '53.486', '-2.228', 0, 1, 'uk'),\n('M7', '', '', '53.505', '-2.26', 0, 1, 'uk'),\n('M8', '', '', '53.509', '-2.239', 0, 1, 'uk'),\n('M9', '', '', '53.522', '-2.213', 0, 1, 'uk'),\n('M90', '', '', '53.363', '-2.277', 0, 1, 'uk'),\n('ME1', '', '', '51.372', '0.5', 0, 1, 'uk'),\n('ME10', '', '', '51.343', '0.736', 0, 1, 'uk'),\n('ME11', '', '', '51.413', '0.749', 0, 1, 'uk'),\n('ME12', '', '', '51.423', '0.805', 0, 1, 'uk'),\n('ME13', '', '', '51.303', '0.896', 0, 1, 'uk'),\n('ME14', '', '', '51.28', '0.542', 0, 1, 'uk'),\n('ME15', '', '', '51.254', '0.534', 0, 1, 'uk'),\n('ME16', '', '', '51.274', '0.5', 0, 1, 'uk'),\n('ME17', '', '', '51.235', '0.61', 0, 1, 'uk'),\n('ME18', '', '', '51.244', '0.423', 0, 1, 'uk'),\n('ME19', '', '', '51.293', '0.411', 0, 1, 'uk'),\n('ME2', '', '', '51.392', '0.486', 0, 1, 'uk'),\n('ME20', '', '', '51.305', '0.46', 0, 1, 'uk'),\n('ME3', '', '', '51.433', '0.547', 0, 1, 'uk'),\n('ME4', '', '', '51.38', '0.53', 0, 1, 'uk'),\n('ME5', '', '', '51.349', '0.534', 0, 1, 'uk'),\n('ME6', '', '', '51.327', '0.441', 0, 1, 'uk'),\n('ME7', '', '', '51.379', '0.557', 0, 1, 'uk'),\n('ME8', '', '', '51.361', '0.599', 0, 1, 'uk'),\n('ME9', '', '', '51.333', '0.725', 0, 1, 'uk'),\n('MK1', '', '', '52.005', '-0.726', 0, 1, 'uk'),\n('MK10', '', '', '52.039', '-0.698', 0, 1, 'uk'),\n('MK11', '', '', '52.052', '-0.84', 0, 1, 'uk'),\n('MK12', '', '', '52.057', '-0.816', 0, 1, 'uk'),\n('MK13', '', '', '52.052', '-0.784', 0, 1, 'uk'),\n('MK14', '', '', '52.059', '-0.762', 0, 1, 'uk'),\n('MK15', '', '', '52.058', '-0.728', 0, 1, 'uk'),\n('MK16', '', '', '52.089', '-0.721', 0, 1, 'uk'),\n('MK17', '', '', '51.992', '-0.7', 0, 1, 'uk'),\n('MK18', '', '', '51.98', '-0.969', 0, 1, 'uk'),\n('MK19', '', '', '52.072', '-0.852', 0, 1, 'uk'),\n('MK2', '', '', '51.99', '-0.724', 0, 1, 'uk'),\n('MK3', '', '', '51.997', '-0.753', 0, 1, 'uk'),\n('MK31', '', '', '52.14609', '-0.423086', 0, 1, 'uk'),\n('MK4', '', '', '52.004', '-0.777', 0, 1, 'uk'),\n('MK40', '', '', '52.138', '-0.472', 0, 1, 'uk'),\n('MK41', '', '', '52.151', '-0.447', 0, 1, 'uk'),\n('MK42', '', '', '52.12', '-0.473', 0, 1, 'uk'),\n('MK43', '', '', '52.118', '-0.557', 0, 1, 'uk'),\n('MK44', '', '', '52.194', '-0.426', 0, 1, 'uk'),\n('MK45', '', '', '52.024', '-0.468', 0, 1, 'uk'),\n('MK46', '', '', '52.154', '-0.691', 0, 1, 'uk'),\n('MK5', '', '', '52.02', '-0.783', 0, 1, 'uk'),\n('MK6', '', '', '52.03', '-0.742', 0, 1, 'uk'),\n('MK7', '', '', '52.019', '-0.69', 0, 1, 'uk'),\n('MK8', '', '', '52.036', '-0.803', 0, 1, 'uk'),\n('MK9', '', '', '52.041', '-0.759', 0, 1, 'uk'),\n('ML1', '', '', '55.799', '-3.976', 0, 1, 'uk'),\n('ML10', '', '', '55.68', '-4.069', 0, 1, 'uk'),\n('ML11', '', '', '55.667', '-3.786', 0, 1, 'uk'),\n('ML12', '', '', '55.566', '-3.596', 0, 1, 'uk'),\n('ML2', '', '', '55.777', '-3.913', 0, 1, 'uk'),\n('ML3', '', '', '55.77', '-4.054', 0, 1, 'uk'),\n('ML4', '', '', '55.818', '-4.02', 0, 1, 'uk'),\n('ML5', '', '', '55.86', '-4.03', 0, 1, 'uk'),\n('ML6', '', '', '55.867', '-3.962', 0, 1, 'uk'),\n('ML7', '', '', '55.83', '-3.793', 0, 1, 'uk'),\n('ML8', '', '', '55.731', '-3.841', 0, 1, 'uk'),\n('ML9', '', '', '55.725', '-3.967', 0, 1, 'uk'),\n('N1', '', '', '51.537', '-0.097', 0, 1, 'uk'),\n('N10', '', '', '51.594', '-0.143', 0, 1, 'uk'),\n('N11', '', '', '51.613', '-0.138', 0, 1, 'uk'),\n('N12', '', '', '51.615', '-0.176', 0, 1, 'uk'),\n('N13', '', '', '51.619', '-0.102', 0, 1, 'uk'),\n('N14', '', '', '51.634', '-0.129', 0, 1, 'uk'),\n('N15', '', '', '51.582', '-0.081', 0, 1, 'uk'),\n('N16', '', '', '51.563', '-0.075', 0, 1, 'uk'),\n('N17', '', '', '51.597', '-0.07', 0, 1, 'uk'),\n('N18', '', '', '51.613', '-0.065', 0, 1, 'uk'),\n('N19', '', '', '51.565', '-0.128', 0, 1, 'uk'),\n('N2', '', '', '51.59', '-0.167', 0, 1, 'uk'),\n('N20', '', '', '51.629', '-0.173', 0, 1, 'uk'),\n('N21', '', '', '51.636', '-0.098', 0, 1, 'uk'),\n('N22', '', '', '51.599', '-0.11', 0, 1, 'uk'),\n('N3', '', '', '51.6', '-0.193', 0, 1, 'uk'),\n('N4', '', '', '51.571', '-0.101', 0, 1, 'uk'),\n('N5', '', '', '51.553', '-0.097', 0, 1, 'uk'),\n('N6', '', '', '51.572', '-0.141', 0, 1, 'uk'),\n('N7', '', '', '51.553', '-0.116', 0, 1, 'uk'),\n('N8', '', '', '51.584', '-0.116', 0, 1, 'uk'),\n('N9', '', '', '51.628', '-0.057', 0, 1, 'uk'),\n('NE1', '', '', '54.973', '-1.611', 0, 1, 'uk'),\n('NE10', '', '', '54.947', '-1.553', 0, 1, 'uk'),\n('NE11', '', '', '54.941', '-1.631', 0, 1, 'uk'),\n('NE12', '', '', '55.024', '-1.569', 0, 1, 'uk'),\n('NE13', '', '', '55.046', '-1.645', 0, 1, 'uk'),\n('NE14', '', '', '54.964911', '-1.665544', 0, 1, 'uk'),\n('NE15', '', '', '54.984', '-1.72', 0, 1, 'uk'),\n('NE16', '', '', '54.932', '-1.691', 0, 1, 'uk'),\n('NE17', '', '', '54.913', '-1.816', 0, 1, 'uk'),\n('NE18', '', '', '55.038', '-1.861', 0, 1, 'uk'),\n('NE19', '', '', '55.179', '-2.096', 0, 1, 'uk'),\n('NE2', '', '', '54.987', '-1.605', 0, 1, 'uk'),\n('NE20', '', '', '55.053', '-1.786', 0, 1, 'uk'),\n('NE21', '', '', '54.958', '-1.719', 0, 1, 'uk'),\n('NE22', '', '', '55.136', '-1.584', 0, 1, 'uk'),\n('NE23', '', '', '55.08', '-1.581', 0, 1, 'uk'),\n('NE24', '', '', '55.122', '-1.521', 0, 1, 'uk'),\n('NE25', '', '', '55.05', '-1.486', 0, 1, 'uk'),\n('NE26', '', '', '55.052', '-1.456', 0, 1, 'uk'),\n('NE27', '', '', '55.033', '-1.511', 0, 1, 'uk'),\n('NE28', '', '', '55', '-1.519', 0, 1, 'uk'),\n('NE29', '', '', '55.012', '-1.464', 0, 1, 'uk'),\n('NE3', '', '', '55.01', '-1.633', 0, 1, 'uk'),\n('NE30', '', '', '55.021', '-1.44', 0, 1, 'uk'),\n('NE31', '', '', '54.971', '-1.512', 0, 1, 'uk'),\n('NE32', '', '', '54.968', '-1.483', 0, 1, 'uk'),\n('NE33', '', '', '54.991', '-1.428', 0, 1, 'uk'),\n('NE34', '', '', '54.972', '-1.421', 0, 1, 'uk'),\n('NE35', '', '', '54.952', '-1.46', 0, 1, 'uk'),\n('NE36', '', '', '54.945', '-1.439', 0, 1, 'uk'),\n('NE37', '', '', '54.913', '-1.526', 0, 1, 'uk'),\n('NE38', '', '', '54.894', '-1.524', 0, 1, 'uk'),\n('NE39', '', '', '54.924', '-1.759', 0, 1, 'uk'),\n('NE4', '', '', '54.974', '-1.643', 0, 1, 'uk'),\n('NE40', '', '', '54.966', '-1.772', 0, 1, 'uk'),\n('NE41', '', '', '54.976', '-1.819', 0, 1, 'uk'),\n('NE42', '', '', '54.962', '-1.854', 0, 1, 'uk'),\n('NE43', '', '', '54.948', '-1.905', 0, 1, 'uk'),\n('NE44', '', '', '54.943', '-1.978', 0, 1, 'uk'),\n('NE45', '', '', '54.976', '-2.016', 0, 1, 'uk'),\n('NE46', '', '', '54.979', '-2.106', 0, 1, 'uk'),\n('NE47', '', '', '54.929', '-2.251', 0, 1, 'uk'),\n('NE48', '', '', '55.132', '-2.257', 0, 1, 'uk'),\n('NE49', '', '', '54.967', '-2.459', 0, 1, 'uk'),\n('NE5', '', '', '54.996', '-1.687', 0, 1, 'uk'),\n('NE6', '', '', '54.977', '-1.564', 0, 1, 'uk'),\n('NE61', '', '', '55.181', '-1.688', 0, 1, 'uk'),\n('NE62', '', '', '55.161', '-1.592', 0, 1, 'uk'),\n('NE63', '', '', '55.178', '-1.562', 0, 1, 'uk'),\n('NE64', '', '', '55.184', '-1.514', 0, 1, 'uk'),\n('NE65', '', '', '55.313', '-1.751', 0, 1, 'uk'),\n('NE66', '', '', '55.428', '-1.731', 0, 1, 'uk'),\n('NE67', '', '', '55.534', '-1.693', 0, 1, 'uk'),\n('NE68', '', '', '55.574', '-1.658', 0, 1, 'uk'),\n('NE69', '', '', '55.605', '-1.716', 0, 1, 'uk'),\n('NE7', '', '', '55', '-1.578', 0, 1, 'uk'),\n('NE70', '', '', '55.594', '-1.815', 0, 1, 'uk'),\n('NE71', '', '', '55.555', '-2.044', 0, 1, 'uk'),\n('NE8', '', '', '54.955', '-1.603', 0, 1, 'uk'),\n('NE88', '', '', '54.941686', '-1.61541', 0, 1, 'uk'),\n('NE9', '', '', '54.931', '-1.584', 0, 1, 'uk'),\n('NE99', '', '', '54.967', '-1.613', 0, 1, 'uk'),\n('NG1', '', '', '52.954', '-1.147', 0, 1, 'uk'),\n('NG10', '', '', '52.9', '-1.282', 0, 1, 'uk'),\n('NG11', '', '', '52.899', '-1.173', 0, 1, 'uk'),\n('NG12', '', '', '52.911', '-1.054', 0, 1, 'uk'),\n('NG13', '', '', '52.947', '-0.92', 0, 1, 'uk'),\n('NG14', '', '', '53.015', '-1.037', 0, 1, 'uk'),\n('NG15', '', '', '53.045', '-1.203', 0, 1, 'uk'),\n('NG16', '', '', '53.027', '-1.294', 0, 1, 'uk'),\n('NG17', '', '', '53.116', '-1.26', 0, 1, 'uk'),\n('NG18', '', '', '53.138', '-1.183', 0, 1, 'uk'),\n('NG19', '', '', '53.16', '-1.197', 0, 1, 'uk'),\n('NG2', '', '', '52.935', '-1.131', 0, 1, 'uk'),\n('NG20', '', '', '53.21', '-1.183', 0, 1, 'uk'),\n('NG21', '', '', '53.141', '-1.104', 0, 1, 'uk'),\n('NG22', '', '', '53.178', '-0.971', 0, 1, 'uk'),\n('NG23', '', '', '53.116', '-0.801', 0, 1, 'uk'),\n('NG24', '', '', '53.07', '-0.799', 0, 1, 'uk'),\n('NG25', '', '', '53.073', '-0.955', 0, 1, 'uk'),\n('NG3', '', '', '52.968', '-1.128', 0, 1, 'uk'),\n('NG31', '', '', '52.914', '-0.64', 0, 1, 'uk'),\n('NG32', '', '', '52.949', '-0.649', 0, 1, 'uk'),\n('NG33', '', '', '52.818', '-0.579', 0, 1, 'uk'),\n('NG34', '', '', '52.988', '-0.391', 0, 1, 'uk'),\n('NG4', '', '', '52.97', '-1.086', 0, 1, 'uk'),\n('NG5', '', '', '52.997', '-1.143', 0, 1, 'uk'),\n('NG6', '', '', '52.997', '-1.191', 0, 1, 'uk'),\n('NG7', '', '', '52.958', '-1.175', 0, 1, 'uk'),\n('NG8', '', '', '52.964', '-1.212', 0, 1, 'uk'),\n('NG9', '', '', '52.926', '-1.236', 0, 1, 'uk'),\n('NN1', '', '', '52.241', '-0.887', 0, 1, 'uk'),\n('NN10', '', '', '52.292', '-0.597', 0, 1, 'uk'),\n('NN11', '', '', '52.241', '-1.179', 0, 1, 'uk'),\n('NN12', '', '', '52.128', '-0.998', 0, 1, 'uk'),\n('NN13', '', '', '52.032', '-1.147', 0, 1, 'uk'),\n('NN14', '', '', '52.41', '-0.692', 0, 1, 'uk'),\n('NN15', '', '', '52.384', '-0.706', 0, 1, 'uk'),\n('NN16', '', '', '52.406', '-0.721', 0, 1, 'uk'),\n('NN17', '', '', '52.5', '-0.688', 0, 1, 'uk'),\n('NN18', '', '', '52.48', '-0.715', 0, 1, 'uk'),\n('NN2', '', '', '52.262', '-0.895', 0, 1, 'uk'),\n('NN29', '', '', '52.26', '-0.663', 0, 1, 'uk'),\n('NN3', '', '', '52.261', '-0.846', 0, 1, 'uk'),\n('NN4', '', '', '52.216', '-0.896', 0, 1, 'uk'),\n('NN5', '', '', '52.248', '-0.93', 0, 1, 'uk'),\n('NN51', '', '', '52.391769', '-0.685219', 0, 1, 'uk'),\n('NN6', '', '', '52.322', '-0.944', 0, 1, 'uk'),\n('NN7', '', '', '52.21', '-0.927', 0, 1, 'uk'),\n('NN8', '', '', '52.303', '-0.698', 0, 1, 'uk'),\n('NN9', '', '', '52.333', '-0.599', 0, 1, 'uk'),\n('NP10', '', '', '51.579', '-3.045', 0, 1, 'uk'),\n('NP11', '', '', '51.643', '-3.13', 0, 1, 'uk'),\n('NP12', '', '', '51.668', '-3.197', 0, 1, 'uk'),\n('NP13', '', '', '51.734', '-3.14', 0, 1, 'uk'),\n('NP15', '', '', '51.726', '-2.886', 0, 1, 'uk'),\n('NP16', '', '', '51.65', '-2.688', 0, 1, 'uk'),\n('NP18', '', '', '51.607', '-2.943', 0, 1, 'uk'),\n('NP19', '', '', '51.589', '-2.963', 0, 1, 'uk'),\n('NP2', '', '', '51.759071', '-3.289044', 0, 1, 'uk'),\n('NP20', '', '', '51.591', '-3.005', 0, 1, 'uk'),\n('NP22', '', '', '51.771', '-3.257', 0, 1, 'uk'),\n('NP23', '', '', '51.785', '-3.196', 0, 1, 'uk'),\n('NP24', '', '', '51.72', '-3.237', 0, 1, 'uk'),\n('NP25', '', '', '51.803', '-2.722', 0, 1, 'uk'),\n('NP26', '', '', '51.59', '-2.777', 0, 1, 'uk'),\n('NP3', '', '', '51.739616', '-3.175639', 0, 1, 'uk'),\n('NP4', '', '', '51.719', '-3.046', 0, 1, 'uk'),\n('NP44', '', '', '51.651', '-3.027', 0, 1, 'uk'),\n('NP6', '', '', '51.584213', '-2.760448', 0, 1, 'uk'),\n('NP7', '', '', '51.829', '-3.009', 0, 1, 'uk'),\n('NP8', '', '', '51.86', '-3.146', 0, 1, 'uk'),\n('NP9', '', '', '51.589122', '-2.972316', 0, 1, 'uk'),\n('NR1', '', '', '52.626', '1.31', 0, 1, 'uk'),\n('NR10', '', '', '52.736', '1.246', 0, 1, 'uk'),\n('NR11', '', '', '52.841', '1.275', 0, 1, 'uk'),\n('NR12', '', '', '52.76', '1.472', 0, 1, 'uk'),\n('NR13', '', '', '52.634', '1.473', 0, 1, 'uk'),\n('NR14', '', '', '52.565', '1.381', 0, 1, 'uk'),\n('NR15', '', '', '52.506', '1.271', 0, 1, 'uk'),\n('NR16', '', '', '52.476', '1.061', 0, 1, 'uk'),\n('NR17', '', '', '52.515', '0.996', 0, 1, 'uk'),\n('NR18', '', '', '52.571', '1.11', 0, 1, 'uk'),\n('NR19', '', '', '52.675', '0.929', 0, 1, 'uk'),\n('NR2', '', '', '52.63', '1.285', 0, 1, 'uk'),\n('NR20', '', '', '52.724', '0.981', 0, 1, 'uk'),\n('NR21', '', '', '52.841', '0.853', 0, 1, 'uk'),\n('NR22', '', '', '52.894', '0.867', 0, 1, 'uk'),\n('NR23', '', '', '52.949', '0.86', 0, 1, 'uk'),\n('NR24', '', '', '52.859', '1.051', 0, 1, 'uk'),\n('NR25', '', '', '52.92', '1.085', 0, 1, 'uk'),\n('NR26', '', '', '52.935', '1.215', 0, 1, 'uk'),\n('NR27', '', '', '52.924', '1.302', 0, 1, 'uk'),\n('NR28', '', '', '52.822', '1.4', 0, 1, 'uk'),\n('NR29', '', '', '52.692', '1.639', 0, 1, 'uk'),\n('NR3', '', '', '52.643', '1.296', 0, 1, 'uk'),\n('NR30', '', '', '52.619', '1.729', 0, 1, 'uk'),\n('NR31', '', '', '52.576', '1.711', 0, 1, 'uk'),\n('NR32', '', '', '52.489', '1.734', 0, 1, 'uk'),\n('NR33', '', '', '52.454', '1.719', 0, 1, 'uk'),\n('NR34', '', '', '52.438', '1.585', 0, 1, 'uk'),\n('NR35', '', '', '52.462', '1.435', 0, 1, 'uk'),\n('NR4', '', '', '52.614', '1.265', 0, 1, 'uk'),\n('NR5', '', '', '52.64', '1.235', 0, 1, 'uk'),\n('NR50', '', '', '52.649625', '1.22766', 0, 1, 'uk'),\n('NR6', '', '', '52.661', '1.283', 0, 1, 'uk'),\n('NR7', '', '', '52.635954', '1.350276', 0, 1, 'uk'),\n('NR8', '', '', '52.678', '1.212', 0, 1, 'uk'),\n('NR9', '', '', '52.636', '1.109', 0, 1, 'uk'),\n('NW1', '', '', '51.532', '-0.143', 0, 1, 'uk'),\n('NW10', '', '', '51.54', '-0.246', 0, 1, 'uk'),\n('NW11', '', '', '51.578', '-0.196', 0, 1, 'uk'),\n('NW2', '', '', '51.558', '-0.218', 0, 1, 'uk'),\n('NW3', '', '', '51.552', '-0.171', 0, 1, 'uk'),\n('NW4', '', '', '51.587', '-0.223', 0, 1, 'uk'),\n('NW5', '', '', '51.551', '-0.143', 0, 1, 'uk'),\n('NW6', '', '', '51.541', '-0.194', 0, 1, 'uk'),\n('NW7', '', '', '51.615', '-0.235', 0, 1, 'uk'),\n('NW8', '', '', '51.531', '-0.171', 0, 1, 'uk'),\n('NW9', '', '', '51.586', '-0.254', 0, 1, 'uk'),\n('OL1', '', '', '53.549', '-2.105', 0, 1, 'uk'),\n('OL10', '', '', '53.59', '-2.222', 0, 1, 'uk'),\n('OL11', '', '', '53.606', '-2.174', 0, 1, 'uk'),\n('OL12', '', '', '53.635', '-2.164', 0, 1, 'uk'),\n('OL13', '', '', '53.701', '-2.203', 0, 1, 'uk'),\n('OL14', '', '', '53.714', '-2.099', 0, 1, 'uk'),\n('OL15', '', '', '53.644', '-2.1', 0, 1, 'uk'),\n('OL16', '', '', '53.612', '-2.131', 0, 1, 'uk'),\n('OL2', '', '', '53.572', '-2.108', 0, 1, 'uk'),\n('OL3', '', '', '53.553', '-2.009', 0, 1, 'uk'),\n('OL4', '', '', '53.542', '-2.073', 0, 1, 'uk'),\n('OL5', '', '', '53.517', '-2.038', 0, 1, 'uk'),\n('OL6', '', '', '53.494', '-2.085', 0, 1, 'uk'),\n('OL7', '', '', '53.49', '-2.105', 0, 1, 'uk'),\n('OL8', '', '', '53.526', '-2.116', 0, 1, 'uk'),\n('OL9', '', '', '53.539', '-2.142', 0, 1, 'uk'),\n('OX1', '', '', '51.745', '-1.259', 0, 1, 'uk'),\n('OX10', '', '', '51.608', '-1.127', 0, 1, 'uk'),\n('OX11', '', '', '51.599', '-1.246', 0, 1, 'uk'),\n('OX12', '', '', '51.594', '-1.425', 0, 1, 'uk'),\n('OX13', '', '', '51.678', '-1.347', 0, 1, 'uk'),\n('OX14', '', '', '51.668', '-1.275', 0, 1, 'uk'),\n('OX15', '', '', '52.032', '-1.407', 0, 1, 'uk'),\n('OX16', '', '', '52.062', '-1.34', 0, 1, 'uk'),\n('OX17', '', '', '52.073', '-1.289', 0, 1, 'uk'),\n('OX18', '', '', '51.762', '-1.591', 0, 1, 'uk'),\n('OX2', '', '', '51.764', '-1.277', 0, 1, 'uk'),\n('OX20', '', '', '51.856', '-1.358', 0, 1, 'uk'),\n('OX25', '', '', '51.901', '-1.213', 0, 1, 'uk'),\n('OX26', '', '', '51.901', '-1.151', 0, 1, 'uk'),\n('OX27', '', '', '51.937', '-1.147', 0, 1, 'uk'),\n('OX28', '', '', '51.785', '-1.487', 0, 1, 'uk'),\n('OX29', '', '', '51.794', '-1.432', 0, 1, 'uk'),\n('OX3', '', '', '51.761', '-1.214', 0, 1, 'uk'),\n('OX33', '', '', '51.758', '-1.147', 0, 1, 'uk'),\n('OX39', '', '', '51.701', '-0.913', 0, 1, 'uk'),\n('OX4', '', '', '51.73', '-1.215', 0, 1, 'uk'),\n('OX44', '', '', '51.7', '-1.13', 0, 1, 'uk'),\n('OX49', '', '', '51.65', '-1', 0, 1, 'uk'),\n('OX5', '', '', '51.829', '-1.281', 0, 1, 'uk'),\n('OX6', '', '', '51.909', '-1.168', 0, 1, 'uk'),\n('OX7', '', '', '51.911', '-1.528', 0, 1, 'uk'),\n('OX8', '', '', '51.79', '-1.455', 0, 1, 'uk'),\n('OX9', '', '', '51.738', '-0.982', 0, 1, 'uk'),\n('PA1', '', '', '55.845', '-4.417', 0, 1, 'uk'),\n('PA10', '', '', '55.833', '-4.551', 0, 1, 'uk'),\n('PA11', '', '', '55.857', '-4.582', 0, 1, 'uk'),\n('PA12', '', '', '55.796', '-4.623', 0, 1, 'uk'),\n('PA13', '', '', '55.893', '-4.629', 0, 1, 'uk'),\n('PA14', '', '', '55.927', '-4.663', 0, 1, 'uk'),\n('PA15', '', '', '55.942', '-4.748', 0, 1, 'uk'),\n('PA16', '', '', '55.944', '-4.796', 0, 1, 'uk'),\n('PA17', '', '', '55.865', '-4.882', 0, 1, 'uk'),\n('PA18', '', '', '55.889', '-4.887', 0, 1, 'uk'),\n('PA19', '', '', '55.953', '-4.822', 0, 1, 'uk'),\n('PA2', '', '', '55.829', '-4.434', 0, 1, 'uk'),\n('PA20', '', '', '55.835', '-5.057', 0, 1, 'uk'),\n('PA21', '', '', '55.901', '-5.248', 0, 1, 'uk'),\n('PA22', '', '', '55.97', '-5.157', 0, 1, 'uk'),\n('PA23', '', '', '55.955', '-4.932', 0, 1, 'uk'),\n('PA24', '', '', '56.157', '-4.904', 0, 1, 'uk'),\n('PA25', '', '', '56.216', '-5.04', 0, 1, 'uk'),\n('PA26', '', '', '56.258', '-4.938', 0, 1, 'uk'),\n('PA27', '', '', '56.154', '-5.084', 0, 1, 'uk'),\n('PA28', '', '', '55.436', '-5.603', 0, 1, 'uk'),\n('PA29', '', '', '55.804', '-5.477', 0, 1, 'uk'),\n('PA3', '', '', '55.852', '-4.447', 0, 1, 'uk'),\n('PA30', '', '', '56.014', '-5.448', 0, 1, 'uk'),\n('PA31', '', '', '56.053', '-5.463', 0, 1, 'uk'),\n('PA32', '', '', '56.203', '-5.117', 0, 1, 'uk'),\n('PA33', '', '', '56.37', '-5.055', 0, 1, 'uk'),\n('PA34', '', '', '56.403', '-5.499', 0, 1, 'uk'),\n('PA35', '', '', '56.405', '-5.224', 0, 1, 'uk'),\n('PA36', '', '', '56.521', '-4.771', 0, 1, 'uk'),\n('PA37', '', '', '56.469', '-5.386', 0, 1, 'uk'),\n('PA38', '', '', '56.592', '-5.335', 0, 1, 'uk'),\n('PA39', '', '', '56.929557', '-5.849203', 0, 1, 'uk'),\n('PA4', '', '', '55.875', '-4.396', 0, 1, 'uk'),\n('PA40', '', '', '56.712968', '-4.971533', 0, 1, 'uk'),\n('PA41', '', '', '55.674', '-5.742', 0, 1, 'uk'),\n('PA42', '', '', '55.64', '-6.186', 0, 1, 'uk'),\n('PA43', '', '', '55.756', '-6.283', 0, 1, 'uk'),\n('PA44', '', '', '55.798', '-6.292', 0, 1, 'uk'),\n('PA45', '', '', '55.82', '-6.166', 0, 1, 'uk'),\n('PA46', '', '', '55.862', '-6.119', 0, 1, 'uk'),\n('PA47', '', '', '55.682', '-6.503', 0, 1, 'uk'),\n('PA48', '', '', '55.738', '-6.384', 0, 1, 'uk'),\n('PA49', '', '', '55.782', '-6.394', 0, 1, 'uk'),\n('PA5', '', '', '55.831', '-4.509', 0, 1, 'uk'),\n('PA6', '', '', '55.864', '-4.534', 0, 1, 'uk'),\n('PA60', '', '', '55.88', '-5.913', 0, 1, 'uk'),\n('PA61', '', '', '56.072', '-6.202', 0, 1, 'uk'),\n('PA62', '', '', '56.359', '-5.85', 0, 1, 'uk'),\n('PA63', '', '', '56.382', '-5.715', 0, 1, 'uk'),\n('PA64', '', '', '56.439', '-5.675', 0, 1, 'uk'),\n('PA65', '', '', '56.469', '-5.728', 0, 1, 'uk'),\n('PA66', '', '', '56.329', '-6.354', 0, 1, 'uk'),\n('PA67', '', '', '56.314', '-6.232', 0, 1, 'uk'),\n('PA68', '', '', '56.437', '-6.141', 0, 1, 'uk'),\n('PA69', '', '', '56.38', '-6.088', 0, 1, 'uk'),\n('PA7', '', '', '55.909', '-4.5', 0, 1, 'uk'),\n('PA70', '', '', '56.364', '-6.033', 0, 1, 'uk'),\n('PA71', '', '', '56.481', '-5.98', 0, 1, 'uk'),\n('PA72', '', '', '56.518', '-5.964', 0, 1, 'uk'),\n('PA73', '', '', '56.497', '-6.183', 0, 1, 'uk'),\n('PA74', '', '', '56.533', '-6.229', 0, 1, 'uk'),\n('PA75', '', '', '56.612', '-6.123', 0, 1, 'uk'),\n('PA76', '', '', '56.334', '-6.394', 0, 1, 'uk'),\n('PA77', '', '', '56.494', '-6.884', 0, 1, 'uk'),\n('PA78', '', '', '56.625', '-6.545', 0, 1, 'uk'),\n('PA8', '', '', '55.901', '-4.452', 0, 1, 'uk'),\n('PA80', '', '', '56.954376', '-7.486023', 0, 1, 'uk'),\n('PA81', '', '', '57.159642', '-7.321168', 0, 1, 'uk'),\n('PA82', '', '', '57.603448', '-7.162478', 0, 1, 'uk'),\n('PA9', '', '', '55.81', '-4.552', 0, 1, 'uk'),\n('PE1', '', '', '52.587', '-0.238', 0, 1, 'uk'),\n('PE10', '', '', '52.777', '-0.376', 0, 1, 'uk'),\n('PE11', '', '', '52.807', '-0.166', 0, 1, 'uk'),\n('PE12', '', '', '52.784', '0.029', 0, 1, 'uk'),\n('PE13', '', '', '52.669', '0.139', 0, 1, 'uk'),\n('PE14', '', '', '52.639', '0.211', 0, 1, 'uk'),\n('PE15', '', '', '52.536', '0.087', 0, 1, 'uk'),\n('PE16', '', '', '52.454', '0.05', 0, 1, 'uk'),\n('PE17', '', '', '52.385017', '-0.003028', 0, 1, 'uk'),\n('PE18', '', '', '52.320399', '-0.222161', 0, 1, 'uk'),\n('PE19', '', '', '52.242', '-0.258', 0, 1, 'uk'),\n('PE2', '', '', '52.561', '-0.263', 0, 1, 'uk'),\n('PE20', '', '', '52.932', '-0.102', 0, 1, 'uk'),\n('PE21', '', '', '52.975', '-0.021', 0, 1, 'uk'),\n('PE22', '', '', '53.048', '0.045', 0, 1, 'uk'),\n('PE23', '', '', '53.173', '0.091', 0, 1, 'uk'),\n('PE24', '', '', '53.165', '0.268', 0, 1, 'uk'),\n('PE25', '', '', '53.153', '0.337', 0, 1, 'uk'),\n('PE26', '', '', '52.453', '-0.113', 0, 1, 'uk'),\n('PE27', '', '', '52.334', '-0.076', 0, 1, 'uk'),\n('PE28', '', '', '52.358', '-0.186', 0, 1, 'uk'),\n('PE29', '', '', '52.334', '-0.178', 0, 1, 'uk'),\n('PE3', '', '', '52.587', '-0.275', 0, 1, 'uk'),\n('PE30', '', '', '52.759', '0.418', 0, 1, 'uk'),\n('PE31', '', '', '52.876', '0.567', 0, 1, 'uk'),\n('PE32', '', '', '52.73', '0.628', 0, 1, 'uk'),\n('PE33', '', '', '52.649', '0.469', 0, 1, 'uk'),\n('PE34', '', '', '52.724', '0.34', 0, 1, 'uk'),\n('PE35', '', '', '52.825', '0.512', 0, 1, 'uk'),\n('PE36', '', '', '52.936', '0.508', 0, 1, 'uk'),\n('PE37', '', '', '52.644', '0.693', 0, 1, 'uk'),\n('PE38', '', '', '52.589', '0.377', 0, 1, 'uk'),\n('PE39', '', '', '52.527768', '0.397726', 0, 1, 'uk'),\n('PE4', '', '', '52.612', '-0.266', 0, 1, 'uk'),\n('PE5', '', '', '52.579', '-0.344', 0, 1, 'uk'),\n('PE6', '', '', '52.656', '-0.255', 0, 1, 'uk'),\n('PE7', '', '', '52.538', '-0.198', 0, 1, 'uk'),\n('PE8', '', '', '52.527', '-0.442', 0, 1, 'uk'),\n('PE9', '', '', '52.654', '-0.48', 0, 1, 'uk'),\n('PH1', '', '', '56.421', '-3.475', 0, 1, 'uk'),\n('PH10', '', '', '56.609', '-3.36', 0, 1, 'uk'),\n('PH11', '', '', '56.639', '-3.234', 0, 1, 'uk'),\n('PH12', '', '', '56.576', '-3.152', 0, 1, 'uk'),\n('PH13', '', '', '56.537', '-3.274', 0, 1, 'uk'),\n('PH14', '', '', '56.453', '-3.186', 0, 1, 'uk'),\n('PH15', '', '', '56.61', '-3.941', 0, 1, 'uk'),\n('PH16', '', '', '56.707', '-3.809', 0, 1, 'uk'),\n('PH17', '', '', '56.688', '-4.382', 0, 1, 'uk'),\n('PH18', '', '', '56.774', '-3.889', 0, 1, 'uk'),\n('PH19', '', '', '56.935', '-4.255', 0, 1, 'uk'),\n('PH2', '', '', '56.387', '-3.404', 0, 1, 'uk'),\n('PH20', '', '', '57.054', '-4.155', 0, 1, 'uk'),\n('PH21', '', '', '57.089', '-4.022', 0, 1, 'uk'),\n('PH22', '', '', '57.198', '-3.806', 0, 1, 'uk'),\n('PH23', '', '', '57.287', '-3.801', 0, 1, 'uk'),\n('PH24', '', '', '57.254', '-3.748', 0, 1, 'uk'),\n('PH25', '', '', '57.262', '-3.647', 0, 1, 'uk'),\n('PH26', '', '', '57.33', '-3.605', 0, 1, 'uk'),\n('PH3', '', '', '56.302', '-3.704', 0, 1, 'uk'),\n('PH30', '', '', '56.792', '-4.6', 0, 1, 'uk'),\n('PH31', '', '', '56.892', '-4.816', 0, 1, 'uk'),\n('PH32', '', '', '57.145', '-4.683', 0, 1, 'uk'),\n('PH33', '', '', '56.822', '-5.112', 0, 1, 'uk'),\n('PH34', '', '', '56.926', '-4.926', 0, 1, 'uk'),\n('PH35', '', '', '57.076', '-4.93', 0, 1, 'uk'),\n('PH36', '', '', '56.721', '-5.866', 0, 1, 'uk'),\n('PH37', '', '', '56.872395', '-5.449192', 0, 1, 'uk'),\n('PH38', '', '', '56.845', '-5.747', 0, 1, 'uk'),\n('PH39', '', '', '56.913', '-5.841', 0, 1, 'uk'),\n('PH4', '', '', '56.261', '-3.783', 0, 1, 'uk'),\n('PH40', '', '', '56.964', '-5.786', 0, 1, 'uk'),\n('PH41', '', '', '57.004', '-5.832', 0, 1, 'uk'),\n('PH42', '', '', '56.902', '-6.142', 0, 1, 'uk'),\n('PH43', '', '', '57.016', '-6.28', 0, 1, 'uk'),\n('PH44', '', '', '57.057', '-6.503', 0, 1, 'uk'),\n('PH49', '', '', '56.675', '-5.11', 0, 1, 'uk'),\n('PH5', '', '', '56.329', '-3.828', 0, 1, 'uk'),\n('PH50', '', '', '56.714', '-4.964', 0, 1, 'uk'),\n('PH6', '', '', '56.372', '-3.995', 0, 1, 'uk'),\n('PH7', '', '', '56.373', '-3.826', 0, 1, 'uk'),\n('PH8', '', '', '56.562', '-3.598', 0, 1, 'uk'),\n('PH9', '', '', '56.651', '-3.691', 0, 1, 'uk'),\n('PL1', '', '', '50.371', '-4.153', 0, 1, 'uk'),\n('PL10', '', '', '50.345', '-4.211', 0, 1, 'uk'),\n('PL11', '', '', '50.373', '-4.25', 0, 1, 'uk'),\n('PL12', '', '', '50.419', '-4.248', 0, 1, 'uk'),\n('PL13', '', '', '50.357', '-4.475', 0, 1, 'uk'),\n('PL14', '', '', '50.463', '-4.465', 0, 1, 'uk'),\n('PL15', '', '', '50.632', '-4.399', 0, 1, 'uk'),\n('PL16', '', '', '50.646', '-4.267', 0, 1, 'uk'),\n('PL17', '', '', '50.516', '-4.305', 0, 1, 'uk'),\n('PL18', '', '', '50.515', '-4.219', 0, 1, 'uk'),\n('PL19', '', '', '50.556', '-4.154', 0, 1, 'uk'),\n('PL2', '', '', '50.389', '-4.162', 0, 1, 'uk'),\n('PL20', '', '', '50.501', '-4.1', 0, 1, 'uk'),\n('PL21', '', '', '50.385', '-3.918', 0, 1, 'uk'),\n('PL22', '', '', '50.403', '-4.651', 0, 1, 'uk'),\n('PL23', '', '', '50.337', '-4.635', 0, 1, 'uk'),\n('PL24', '', '', '50.355', '-4.71', 0, 1, 'uk'),\n('PL25', '', '', '50.341', '-4.778', 0, 1, 'uk'),\n('PL26', '', '', '50.342', '-4.825', 0, 1, 'uk'),\n('PL27', '', '', '50.522', '-4.874', 0, 1, 'uk'),\n('PL28', '', '', '50.533', '-4.966', 0, 1, 'uk'),\n('PL29', '', '', '50.585', '-4.829', 0, 1, 'uk'),\n('PL3', '', '', '50.387', '-4.125', 0, 1, 'uk'),\n('PL30', '', '', '50.5', '-4.728', 0, 1, 'uk'),\n('PL31', '', '', '50.469', '-4.721', 0, 1, 'uk'),\n('PL32', '', '', '50.633', '-4.66', 0, 1, 'uk'),\n('PL33', '', '', '50.621', '-4.731', 0, 1, 'uk'),\n('PL34', '', '', '50.659', '-4.742', 0, 1, 'uk'),\n('PL35', '', '', '50.684', '-4.684', 0, 1, 'uk'),\n('PL3O', '', '', '50.430824', '-4.696304', 0, 1, 'uk'),\n('PL4', '', '', '50.375', '-4.128', 0, 1, 'uk'),\n('PL5', '', '', '50.41', '-4.166', 0, 1, 'uk'),\n('PL6', '', '', '50.418', '-4.116', 0, 1, 'uk'),\n('PL7', '', '', '50.392', '-4.045', 0, 1, 'uk'),\n('PL8', '', '', '50.335', '-4.012', 0, 1, 'uk'),\n('PL9', '', '', '50.354', '-4.088', 0, 1, 'uk'),\n('PO1', '', '', '50.799', '-1.088', 0, 1, 'uk'),\n('PO10', '', '', '50.851', '-0.929', 0, 1, 'uk'),\n('PO11', '', '', '50.791', '-0.975', 0, 1, 'uk'),\n('PO12', '', '', '50.797', '-1.141', 0, 1, 'uk'),\n('PO13', '', '', '50.812', '-1.177', 0, 1, 'uk'),\n('PO14', '', '', '50.837', '-1.218', 0, 1, 'uk'),\n('PO15', '', '', '50.862', '-1.219', 0, 1, 'uk'),\n('PO16', '', '', '50.85', '-1.159', 0, 1, 'uk'),\n('PO17', '', '', '50.889', '-1.169', 0, 1, 'uk'),\n('PO18', '', '', '50.864', '-0.814', 0, 1, 'uk'),\n('PO19', '', '', '50.837', '-0.777', 0, 1, 'uk'),\n('PO1O', '', '', '50.844491', '-0.927811', 0, 1, 'uk'),\n('PO2', '', '', '50.816', '-1.077', 0, 1, 'uk'),\n('PO20', '', '', '50.783', '-0.786', 0, 1, 'uk'),\n('PO21', '', '', '50.784', '-0.696', 0, 1, 'uk'),\n('PO22', '', '', '50.798', '-0.648', 0, 1, 'uk'),\n('PO3', '', '', '50.816', '-1.059', 0, 1, 'uk'),\n('PO30', '', '', '50.691', '-1.313', 0, 1, 'uk'),\n('PO31', '', '', '50.753', '-1.306', 0, 1, 'uk'),\n('PO32', '', '', '50.75', '-1.28', 0, 1, 'uk'),\n('PO33', '', '', '50.721', '-1.169', 0, 1, 'uk'),\n('PO34', '', '', '50.716', '-1.112', 0, 1, 'uk'),\n('PO35', '', '', '50.686', '-1.084', 0, 1, 'uk'),\n('PO36', '', '', '50.658', '-1.162', 0, 1, 'uk'),\n('PO37', '', '', '50.632', '-1.177', 0, 1, 'uk'),\n('PO38', '', '', '50.604', '-1.241', 0, 1, 'uk'),\n('PO39', '', '', '50.68', '-1.538', 0, 1, 'uk'),\n('PO4', '', '', '50.79', '-1.062', 0, 1, 'uk'),\n('PO40', '', '', '50.682', '-1.52', 0, 1, 'uk'),\n('PO41', '', '', '50.699', '-1.477', 0, 1, 'uk'),\n('PO5', '', '', '50.789', '-1.085', 0, 1, 'uk'),\n('PO6', '', '', '50.846', '-1.069', 0, 1, 'uk'),\n('PO7', '', '', '50.882', '-1.038', 0, 1, 'uk'),\n('PO8', '', '', '50.911', '-1.012', 0, 1, 'uk'),\n('PO9', '', '', '50.863', '-0.982', 0, 1, 'uk'),\n('PR1', '', '', '53.757', '-2.701', 0, 1, 'uk'),\n('PR2', '', '', '53.778', '-2.708', 0, 1, 'uk'),\n('PR25', '', '', '53.694', '-2.693', 0, 1, 'uk'),\n('PR26', '', '', '53.687', '-2.74', 0, 1, 'uk'),\n('PR3', '', '', '53.869', '-2.716', 0, 1, 'uk'),\n('PR4', '', '', '53.754', '-2.833', 0, 1, 'uk'),\n('PR5', '', '', '53.731', '-2.656', 0, 1, 'uk'),\n('PR6', '', '', '53.667', '-2.609', 0, 1, 'uk'),\n('PR7', '', '', '53.645', '-2.652', 0, 1, 'uk'),\n('PR8', '', '', '53.626', '-3.01', 0, 1, 'uk'),\n('PR9', '', '', '53.66', '-2.968', 0, 1, 'uk'),\n('PR98', '', '', '53.678584', '-2.923502', 0, 1, 'uk'),\n('RG1', '', '', '51.454', '-0.969', 0, 1, 'uk'),\n('RG10', '', '', '51.48', '-0.862', 0, 1, 'uk'),\n('RG11', '', '', '51.405487', '-0.846081', 0, 1, 'uk'),\n('RG12', '', '', '51.407', '-0.749', 0, 1, 'uk'),\n('RG13', '', '', '51.408329', '-1.295515', 0, 1, 'uk'),\n('RG14', '', '', '51.399', '-1.322', 0, 1, 'uk'),\n('RG16', '', '', '51.449824', '-1.311736', 0, 1, 'uk'),\n('RG17', '', '', '51.44', '-1.488', 0, 1, 'uk'),\n('RG18', '', '', '51.433', '-1.242', 0, 1, 'uk'),\n('RG19', '', '', '51.394', '-1.241', 0, 1, 'uk'),\n('RG2', '', '', '51.427', '-0.955', 0, 1, 'uk'),\n('RG20', '', '', '51.403', '-1.335', 0, 1, 'uk'),\n('RG21', '', '', '51.266', '-1.089', 0, 1, 'uk'),\n('RG22', '', '', '51.25', '-1.122', 0, 1, 'uk'),\n('RG23', '', '', '51.26', '-1.146', 0, 1, 'uk'),\n('RG24', '', '', '51.281', '-1.071', 0, 1, 'uk'),\n('RG25', '', '', '51.228', '-1.162', 0, 1, 'uk'),\n('RG26', '', '', '51.35', '-1.119', 0, 1, 'uk'),\n('RG27', '', '', '51.3', '-0.941', 0, 1, 'uk'),\n('RG28', '', '', '51.234', '-1.334', 0, 1, 'uk'),\n('RG29', '', '', '51.247', '-0.946', 0, 1, 'uk'),\n('RG3', '', '', '51.455313', '-0.99163', 0, 1, 'uk'),\n('RG30', '', '', '51.451', '-1.012', 0, 1, 'uk'),\n('RG31', '', '', '51.456', '-1.041', 0, 1, 'uk'),\n('RG4', '', '', '51.48', '-0.968', 0, 1, 'uk'),\n('RG40', '', '', '51.399', '-0.835', 0, 1, 'uk'),\n('RG41', '', '', '51.415', '-0.857', 0, 1, 'uk'),\n('RG42', '', '', '51.427', '-0.754', 0, 1, 'uk'),\n('RG45', '', '', '51.375', '-0.8', 0, 1, 'uk'),\n('RG5', '', '', '51.452', '-0.906', 0, 1, 'uk'),\n('RG54', '', '', '51.450141', '-0.904247', 0, 1, 'uk'),\n('RG6', '', '', '51.439', '-0.931', 0, 1, 'uk'),\n('RG7', '', '', '51.398', '-1.077', 0, 1, 'uk'),\n('RG8', '', '', '51.505', '-1.105', 0, 1, 'uk'),\n('RG9', '', '', '51.544', '-0.922', 0, 1, 'uk'),\n('RG91', '', '', '51.529774', '-0.904412', 0, 1, 'uk'),\n('RG92', '', '', '51.417732', '-1.004882', 0, 1, 'uk'),\n('RH1', '', '', '51.237', '-0.157', 0, 1, 'uk'),\n('RH10', '', '', '51.117', '-0.157', 0, 1, 'uk'),\n('RH11', '', '', '51.111', '-0.205', 0, 1, 'uk'),\n('RH12', '', '', '51.076', '-0.333', 0, 1, 'uk'),\n('RH13', '', '', '51.037', '-0.325', 0, 1, 'uk'),\n('RH14', '', '', '51.032', '-0.483', 0, 1, 'uk'),\n('RH15', '', '', '50.957', '-0.133', 0, 1, 'uk'),\n('RH16', '', '', '51.002', '-0.097', 0, 1, 'uk'),\n('RH17', '', '', '51.021', '-0.115', 0, 1, 'uk'),\n('RH18', '', '', '51.097', '0.031', 0, 1, 'uk'),\n('RH19', '', '', '51.125', '-0.012', 0, 1, 'uk'),\n('RH2', '', '', '51.235', '-0.202', 0, 1, 'uk'),\n('RH20', '', '', '50.937', '-0.47', 0, 1, 'uk'),\n('RH3', '', '', '51.232', '-0.279', 0, 1, 'uk'),\n('RH4', '', '', '51.229', '-0.334', 0, 1, 'uk'),\n('RH5', '', '', '51.194', '-0.341', 0, 1, 'uk'),\n('RH6', '', '', '51.171', '-0.162', 0, 1, 'uk'),\n('RH7', '', '', '51.174', '-0.016', 0, 1, 'uk'),\n('RH8', '', '', '51.251', '0.003', 0, 1, 'uk'),\n('RH9', '', '', '51.236', '-0.068', 0, 1, 'uk'),\n('RM1', '', '', '51.581', '0.184', 0, 1, 'uk'),\n('RM10', '', '', '51.545', '0.159', 0, 1, 'uk'),\n('RM11', '', '', '51.57', '0.22', 0, 1, 'uk'),\n('RM12', '', '', '51.553', '0.209', 0, 1, 'uk'),\n('RM13', '', '', '51.524', '0.195', 0, 1, 'uk'),\n('RM14', '', '', '51.556', '0.264', 0, 1, 'uk'),\n('RM15', '', '', '51.508', '0.278', 0, 1, 'uk'),\n('RM16', '', '', '51.492', '0.341', 0, 1, 'uk'),\n('RM17', '', '', '51.479', '0.33', 0, 1, 'uk'),\n('RM18', '', '', '51.467', '0.377', 0, 1, 'uk'),\n('RM19', '', '', '51.482', '0.249', 0, 1, 'uk'),\n('RM2', '', '', '51.583', '0.202', 0, 1, 'uk'),\n('RM20', '', '', '51.478', '0.289', 0, 1, 'uk'),\n('RM3', '', '', '51.602', '0.226', 0, 1, 'uk'),\n('RM4', '', '', '51.633', '0.16', 0, 1, 'uk'),\n('RM5', '', '', '51.599', '0.167', 0, 1, 'uk'),\n('RM6', '', '', '51.575', '0.133', 0, 1, 'uk'),\n('RM7', '', '', '51.574', '0.17', 0, 1, 'uk'),\n('RM8', '', '', '51.556', '0.132', 0, 1, 'uk'),\n('RM9', '', '', '51.54', '0.136', 0, 1, 'uk'),\n('S02', '', '', '50.944133', '-1.400936', 0, 1, 'uk'),\n('S05', '', '', '50.973919', '-1.408643', 0, 1, 'uk'),\n('S1', '', '', '53.38', '-1.468', 0, 1, 'uk'),\n('S10', '', '', '53.377', '-1.517', 0, 1, 'uk'),\n('S11', '', '', '53.361', '-1.506', 0, 1, 'uk'),\n('S12', '', '', '53.348', '-1.405', 0, 1, 'uk'),\n('S13', '', '', '53.364', '-1.383', 0, 1, 'uk'),\n('S14', '', '', '53.346', '-1.443', 0, 1, 'uk'),\n('S17', '', '', '53.321', '-1.526', 0, 1, 'uk'),\n('S18', '', '', '53.299', '-1.472', 0, 1, 'uk'),\n('S2', '', '', '53.37', '-1.446', 0, 1, 'uk'),\n('S20', '', '', '53.335', '-1.35', 0, 1, 'uk'),\n('S21', '', '', '53.312', '-1.339', 0, 1, 'uk'),\n('S25', '', '', '53.369', '-1.214', 0, 1, 'uk'),\n('S26', '', '', '53.357', '-1.287', 0, 1, 'uk'),\n('S3', '', '', '53.387', '-1.472', 0, 1, 'uk'),\n('S30', '', '', '53.412234', '-1.831287', 0, 1, 'uk'),\n('S31', '', '', '53.338184', '-1.25374', 0, 1, 'uk'),\n('S32', '', '', '53.295', '-1.638', 0, 1, 'uk'),\n('S33', '', '', '53.341', '-1.721', 0, 1, 'uk'),\n('S35', '', '', '53.457', '-1.495', 0, 1, 'uk'),\n('S36', '', '', '53.503', '-1.613', 0, 1, 'uk'),\n('S4', '', '', '53.399', '-1.45', 0, 1, 'uk'),\n('S40', '', '', '53.234', '-1.446', 0, 1, 'uk'),\n('S41', '', '', '53.247', '-1.427', 0, 1, 'uk'),\n('S42', '', '', '53.201', '-1.422', 0, 1, 'uk'),\n('S43', '', '', '53.267', '-1.342', 0, 1, 'uk'),\n('S44', '', '', '53.225', '-1.313', 0, 1, 'uk'),\n('S45', '', '', '53.166', '-1.421', 0, 1, 'uk'),\n('S5', '', '', '53.422', '-1.462', 0, 1, 'uk'),\n('S6', '', '', '53.402', '-1.51', 0, 1, 'uk'),\n('S60', '', '', '53.414', '-1.348', 0, 1, 'uk'),\n('S61', '', '', '53.443', '-1.393', 0, 1, 'uk'),\n('S62', '', '', '53.465', '-1.347', 0, 1, 'uk'),\n('S63', '', '', '53.518', '-1.329', 0, 1, 'uk'),\n('S64', '', '', '53.491', '-1.298', 0, 1, 'uk'),\n('S65', '', '', '53.436', '-1.32', 0, 1, 'uk'),\n('S66', '', '', '53.42', '-1.242', 0, 1, 'uk'),\n('S7', '', '', '53.354', '-1.489', 0, 1, 'uk'),\n('S70', '', '', '53.541', '-1.473', 0, 1, 'uk'),\n('S71', '', '', '53.573', '-1.456', 0, 1, 'uk'),\n('S72', '', '', '53.578', '-1.391', 0, 1, 'uk'),\n('S73', '', '', '53.524', '-1.393', 0, 1, 'uk'),\n('S74', '', '', '53.501', '-1.439', 0, 1, 'uk'),\n('S75', '', '', '53.562', '-1.519', 0, 1, 'uk'),\n('S8', '', '', '53.34', '-1.476', 0, 1, 'uk'),\n('S80', '', '', '53.292', '-1.15', 0, 1, 'uk'),\n('S81', '', '', '53.338', '-1.122', 0, 1, 'uk'),\n('S9', '', '', '53.398', '-1.417', 0, 1, 'uk'),\n('SA1', '', '', '51.627', '-3.939', 0, 1, 'uk'),\n('SA10', '', '', '51.687', '-3.799', 0, 1, 'uk'),\n('SA11', '', '', '51.674', '-3.761', 0, 1, 'uk'),\n('SA12', '', '', '51.607', '-3.794', 0, 1, 'uk'),\n('SA13', '', '', '51.606', '-3.725', 0, 1, 'uk'),\n('SA14', '', '', '51.733', '-4.107', 0, 1, 'uk'),\n('SA15', '', '', '51.7', '-4.167', 0, 1, 'uk'),\n('SA16', '', '', '51.689', '-4.255', 0, 1, 'uk'),\n('SA17', '', '', '51.758', '-4.286', 0, 1, 'uk'),\n('SA18', '', '', '51.798', '-3.958', 0, 1, 'uk'),\n('SA19', '', '', '51.952', '-3.948', 0, 1, 'uk'),\n('SA2', '', '', '51.62', '-3.994', 0, 1, 'uk'),\n('SA20', '', '', '52.01', '-3.786', 0, 1, 'uk'),\n('SA3', '', '', '51.58', '-4.051', 0, 1, 'uk'),\n('SA31', '', '', '51.856', '-4.307', 0, 1, 'uk'),\n('SA32', '', '', '51.886', '-4.171', 0, 1, 'uk'),\n('SA33', '', '', '51.85', '-4.436', 0, 1, 'uk'),\n('SA34', '', '', '51.853', '-4.619', 0, 1, 'uk'),\n('SA35', '', '', '51.973', '-4.56', 0, 1, 'uk'),\n('SA36', '', '', '51.958', '-4.607', 0, 1, 'uk'),\n('SA37', '', '', '52.017', '-4.592', 0, 1, 'uk'),\n('SA38', '', '', '52.04', '-4.474', 0, 1, 'uk'),\n('SA39', '', '', '52.02', '-4.241', 0, 1, 'uk'),\n('SA4', '', '', '51.671', '-4.048', 0, 1, 'uk'),\n('SA40', '', '', '52.084', '-4.174', 0, 1, 'uk'),\n('SA41', '', '', '51.997', '-4.706', 0, 1, 'uk'),\n('SA42', '', '', '52.015', '-4.852', 0, 1, 'uk'),\n('SA43', '', '', '52.086', '-4.629', 0, 1, 'uk'),\n('SA44', '', '', '52.086', '-4.371', 0, 1, 'uk'),\n('SA45', '', '', '52.208', '-4.358', 0, 1, 'uk'),\n('SA46', '', '', '52.233', '-4.249', 0, 1, 'uk'),\n('SA47', '', '', '52.191', '-4.295', 0, 1, 'uk'),\n('SA48', '', '', '52.144', '-4.111', 0, 1, 'uk'),\n('SA5', '', '', '51.649', '-3.969', 0, 1, 'uk'),\n('SA6', '', '', '51.675', '-3.921', 0, 1, 'uk'),\n('SA61', '', '', '51.8', '-4.973', 0, 1, 'uk'),\n('SA62', '', '', '51.841', '-5.063', 0, 1, 'uk'),\n('SA63', '', '', '51.874', '-4.854', 0, 1, 'uk'),\n('SA64', '', '', '52.001', '-5.011', 0, 1, 'uk'),\n('SA65', '', '', '51.988', '-4.968', 0, 1, 'uk'),\n('SA66', '', '', '51.881', '-4.744', 0, 1, 'uk'),\n('SA67', '', '', '51.782', '-4.732', 0, 1, 'uk'),\n('SA68', '', '', '51.729', '-4.767', 0, 1, 'uk'),\n('SA69', '', '', '51.71', '-4.705', 0, 1, 'uk'),\n('SA7', '', '', '51.662', '-3.89', 0, 1, 'uk'),\n('SA70', '', '', '51.672', '-4.738', 0, 1, 'uk'),\n('SA71', '', '', '51.667', '-4.929', 0, 1, 'uk'),\n('SA72', '', '', '51.692', '-4.934', 0, 1, 'uk'),\n('SA73', '', '', '51.717', '-5.012', 0, 1, 'uk'),\n('SA8', '', '', '51.721', '-3.847', 0, 1, 'uk'),\n('SA9', '', '', '51.781', '-3.767', 0, 1, 'uk'),\n('SE1', '', '', '51.498', '-0.089', 0, 1, 'uk'),\n('SE10', '', '', '51.481', '-0.001', 0, 1, 'uk'),\n('SE11', '', '', '51.489', '-0.109', 0, 1, 'uk'),\n('SE12', '', '', '51.445', '0.025', 0, 1, 'uk'),\n('SE13', '', '', '51.459', '-0.008', 0, 1, 'uk'),\n('SE14', '', '', '51.475', '-0.041', 0, 1, 'uk'),\n('SE15', '', '', '51.472', '-0.064', 0, 1, 'uk'),\n('SE16', '', '', '51.496', '-0.052', 0, 1, 'uk'),\n('SE17', '', '', '51.488', '-0.092', 0, 1, 'uk'),\n('SE18', '', '', '51.484', '0.074', 0, 1, 'uk'),\n('SE19', '', '', '51.418', '-0.084', 0, 1, 'uk'),\n('SE2', '', '', '51.489', '0.117', 0, 1, 'uk'),\n('SE20', '', '', '51.412', '-0.057', 0, 1, 'uk'),\n('SE21', '', '', '51.438', '-0.087', 0, 1, 'uk'),\n('SE22', '', '', '51.454', '-0.071', 0, 1, 'uk'),\n('SE23', '', '', '51.44', '-0.048', 0, 1, 'uk'),\n('SE24', '', '', '51.454', '-0.099', 0, 1, 'uk'),\n('SE25', '', '', '51.397', '-0.075', 0, 1, 'uk'),\n('SE26', '', '', '51.427', '-0.053', 0, 1, 'uk'),\n('SE27', '', '', '51.43', '-0.1', 0, 1, 'uk'),\n('SE28', '', '', '51.502', '0.109', 0, 1, 'uk'),\n('SE3', '', '', '51.469', '0.02', 0, 1, 'uk'),\n('SE4', '', '', '51.461', '-0.033', 0, 1, 'uk'),\n('SE5', '', '', '51.473', '-0.091', 0, 1, 'uk'),\n('SE6', '', '', '51.438', '-0.015', 0, 1, 'uk'),\n('SE7', '', '', '51.484', '0.036', 0, 1, 'uk'),\n('SE8', '', '', '51.481', '-0.028', 0, 1, 'uk'),\n('SE9', '', '', '51.445', '0.057', 0, 1, 'uk'),\n('SG1', '', '', '51.911', '-0.195', 0, 1, 'uk'),\n('SG10', '', '', '51.845', '0.072', 0, 1, 'uk'),\n('SG11', '', '', '51.881', '0.032', 0, 1, 'uk'),\n('SG12', '', '', '51.813', '-0.016', 0, 1, 'uk'),\n('SG13', '', '', '51.787', '-0.069', 0, 1, 'uk'),\n('SG14', '', '', '51.807', '-0.091', 0, 1, 'uk'),\n('SG15', '', '', '52.013', '-0.262', 0, 1, 'uk'),\n('SG16', '', '', '52.015', '-0.296', 0, 1, 'uk'),\n('SG17', '', '', '52.034', '-0.33', 0, 1, 'uk'),\n('SG18', '', '', '52.082', '-0.266', 0, 1, 'uk'),\n('SG19', '', '', '52.139', '-0.241', 0, 1, 'uk'),\n('SG2', '', '', '51.896', '-0.165', 0, 1, 'uk'),\n('SG3', '', '', '51.86', '-0.181', 0, 1, 'uk'),\n('SG4', '', '', '51.921', '-0.259', 0, 1, 'uk'),\n('SG5', '', '', '51.967', '-0.286', 0, 1, 'uk'),\n('SG6', '', '', '51.979', '-0.221', 0, 1, 'uk'),\n('SG7', '', '', '52.004', '-0.174', 0, 1, 'uk'),\n('SG8', '', '', '52.064', '-0.014', 0, 1, 'uk'),\n('SG9', '', '', '51.946', '-0.007', 0, 1, 'uk'),\n('SK1', '', '', '53.408', '-2.15', 0, 1, 'uk'),\n('SK10', '', '', '53.278', '-2.129', 0, 1, 'uk'),\n('SK11', '', '', '53.247', '-2.143', 0, 1, 'uk'),\n('SK12', '', '', '53.351', '-2.091', 0, 1, 'uk'),\n('SK13', '', '', '53.448', '-1.963', 0, 1, 'uk'),\n('SK14', '', '', '53.451', '-2.055', 0, 1, 'uk'),\n('SK15', '', '', '53.486', '-2.046', 0, 1, 'uk'),\n('SK16', '', '', '53.474', '-2.082', 0, 1, 'uk'),\n('SK17', '', '', '53.244', '-1.879', 0, 1, 'uk'),\n('SK2', '', '', '53.394', '-2.132', 0, 1, 'uk'),\n('SK22', '', '', '53.373', '-1.985', 0, 1, 'uk'),\n('SK23', '', '', '53.328', '-1.949', 0, 1, 'uk'),\n('SK3', '', '', '53.398', '-2.17', 0, 1, 'uk'),\n('SK4', '', '', '53.419', '-2.179', 0, 1, 'uk'),\n('SK43', '', '', '53.418512', '-2.200317', 0, 1, 'uk'),\n('SK5', '', '', '53.434', '-2.152', 0, 1, 'uk'),\n('SK6', '', '', '53.405', '-2.08', 0, 1, 'uk'),\n('SK7', '', '', '53.37', '-2.141', 0, 1, 'uk'),\n('SK8', '', '', '53.38', '-2.207', 0, 1, 'uk'),\n('SK9', '', '', '53.327', '-2.23', 0, 1, 'uk'),\n('SL0', '', '', '51.524', '-0.514', 0, 1, 'uk'),\n('SL1', '', '', '51.517', '-0.619', 0, 1, 'uk'),\n('SL2', '', '', '51.534', '-0.603', 0, 1, 'uk'),\n('SL3', '', '', '51.499', '-0.552', 0, 1, 'uk'),\n('SL4', '', '', '51.475', '-0.625', 0, 1, 'uk'),\n('SL5', '', '', '51.405', '-0.661', 0, 1, 'uk'),\n('SL6', '', '', '51.523', '-0.726', 0, 1, 'uk'),\n('SL7', '', '', '51.574', '-0.776', 0, 1, 'uk'),\n('SL8', '', '', '51.578', '-0.707', 0, 1, 'uk'),\n('SL9', '', '', '51.597', '-0.554', 0, 1, 'uk'),\n('SM1', '', '', '51.366', '-0.191', 0, 1, 'uk'),\n('SM2', '', '', '51.352', '-0.197', 0, 1, 'uk'),\n('SM3', '', '', '51.37', '-0.213', 0, 1, 'uk'),\n('SM4', '', '', '51.392', '-0.199', 0, 1, 'uk'),\n('SM5', '', '', '51.368', '-0.166', 0, 1, 'uk'),\n('SM6', '', '', '51.36', '-0.143', 0, 1, 'uk'),\n('SM7', '', '', '51.323', '-0.2', 0, 1, 'uk'),\n('SN1', '', '', '51.557', '-1.774', 0, 1, 'uk'),\n('SN10', '', '', '51.336', '-1.986', 0, 1, 'uk'),\n('SN11', '', '', '51.439', '-1.999', 0, 1, 'uk'),\n('SN12', '', '', '51.372', '-2.137', 0, 1, 'uk'),\n('SN13', '', '', '51.424', '-2.211', 0, 1, 'uk'),\n('SN14', '', '', '51.475', '-2.194', 0, 1, 'uk'),\n('SN15', '', '', '51.473', '-2.079', 0, 1, 'uk'),\n('SN16', '', '', '51.593', '-2.09', 0, 1, 'uk'),\n('SN2', '', '', '51.579', '-1.782', 0, 1, 'uk'),\n('SN25', '', '', '51.591', '-1.796', 0, 1, 'uk'),\n('SN26', '', '', '51.611', '-1.783', 0, 1, 'uk'),\n('SN3', '', '', '51.561', '-1.743', 0, 1, 'uk'),\n('SN4', '', '', '51.531', '-1.819', 0, 1, 'uk'),\n('SN5', '', '', '51.565', '-1.837', 0, 1, 'uk'),\n('SN6', '', '', '51.62', '-1.741', 0, 1, 'uk'),\n('SN7', '', '', '51.649', '-1.564', 0, 1, 'uk'),\n('SN8', '', '', '51.407', '-1.685', 0, 1, 'uk'),\n('SN9', '', '', '51.324', '-1.786', 0, 1, 'uk'),\n('SO1', '', '', '50.96954', '-1.58632', 0, 1, 'uk'),\n('SO14', '', '', '50.908', '-1.395', 0, 1, 'uk'),\n('SO15', '', '', '50.916', '-1.423', 0, 1, 'uk'),\n('SO16', '', '', '50.935', '-1.431', 0, 1, 'uk'),\n('SO17', '', '', '50.926', '-1.394', 0, 1, 'uk'),\n('SO18', '', '', '50.924', '-1.36', 0, 1, 'uk'),\n('SO19', '', '', '50.902', '-1.354', 0, 1, 'uk'),\n('SO2', '', '', '50.92018', '-1.401528', 0, 1, 'uk'),\n('SO20', '', '', '51.114', '-1.505', 0, 1, 'uk'),\n('SO21', '', '', '51.075', '-1.314', 0, 1, 'uk'),\n('SO22', '', '', '51.065', '-1.331', 0, 1, 'uk'),\n('SO23', '', '', '51.067', '-1.308', 0, 1, 'uk'),\n('SO24', '', '', '51.084', '-1.147', 0, 1, 'uk'),\n('SO30', '', '', '50.919', '-1.306', 0, 1, 'uk'),\n('SO31', '', '', '50.869', '-1.296', 0, 1, 'uk'),\n('SO32', '', '', '50.948', '-1.208', 0, 1, 'uk'),\n('SO4', '', '', '50.819376', '-1.307477', 0, 1, 'uk'),\n('SO40', '', '', '50.915', '-1.5', 0, 1, 'uk'),\n('SO41', '', '', '50.755', '-1.565', 0, 1, 'uk'),\n('SO42', '', '', '50.81', '-1.534', 0, 1, 'uk'),\n('SO43', '', '', '50.887', '-1.583', 0, 1, 'uk'),\n('SO45', '', '', '50.847', '-1.394', 0, 1, 'uk'),\n('SO50', '', '', '50.969', '-1.339', 0, 1, 'uk'),\n('SO51', '', '', '50.994', '-1.503', 0, 1, 'uk'),\n('SO52', '', '', '50.977', '-1.441', 0, 1, 'uk'),\n('SO53', '', '', '50.984', '-1.38', 0, 1, 'uk'),\n('SP1', '', '', '51.074', '-1.789', 0, 1, 'uk'),\n('SP10', '', '', '51.211', '-1.483', 0, 1, 'uk'),\n('SP11', '', '', '51.227', '-1.514', 0, 1, 'uk'),\n('SP2', '', '', '51.074', '-1.825', 0, 1, 'uk'),\n('SP3', '', '', '51.101', '-2.006', 0, 1, 'uk'),\n('SP4', '', '', '51.165', '-1.764', 0, 1, 'uk'),\n('SP5', '', '', '51.023', '-1.772', 0, 1, 'uk'),\n('SP6', '', '', '50.936', '-1.801', 0, 1, 'uk'),\n('SP7', '', '', '51.004', '-2.183', 0, 1, 'uk'),\n('SP8', '', '', '51.037', '-2.289', 0, 1, 'uk'),\n('SP9', '', '', '51.23', '-1.66', 0, 1, 'uk'),\n('SQ2', '', '', '51.620921', '-4.017007', 0, 1, 'uk'),\n('SR1', '', '', '54.907', '-1.379', 0, 1, 'uk'),\n('SR2', '', '', '54.887', '-1.376', 0, 1, 'uk'),\n('SR3', '', '', '54.877', '-1.415', 0, 1, 'uk'),\n('SR4', '', '', '54.901', '-1.424', 0, 1, 'uk'),\n('SR5', '', '', '54.924', '-1.424', 0, 1, 'uk'),\n('SR6', '', '', '54.935', '-1.378', 0, 1, 'uk'),\n('SR7', '', '', '54.83', '-1.362', 0, 1, 'uk'),\n('SR8', '', '', '54.766', '-1.335', 0, 1, 'uk'),\n('SR9', '', '', '54.902', '-1.374', 0, 1, 'uk'),\n('SS0', '', '', '51.546', '0.692', 0, 1, 'uk'),\n('SS1', '', '', '51.537', '0.733', 0, 1, 'uk'),\n('SS11', '', '', '51.615', '0.538', 0, 1, 'uk'),\n('SS12', '', '', '51.605', '0.522', 0, 1, 'uk'),\n('SS13', '', '', '51.574', '0.51', 0, 1, 'uk'),\n('SS14', '', '', '51.575', '0.476', 0, 1, 'uk'),\n('SS15', '', '', '51.577', '0.431', 0, 1, 'uk'),\n('SS16', '', '', '51.562', '0.454', 0, 1, 'uk'),\n('SS17', '', '', '51.521', '0.441', 0, 1, 'uk'),\n('SS2', '', '', '51.55', '0.717', 0, 1, 'uk'),\n('SS3', '', '', '51.543', '0.793', 0, 1, 'uk'),\n('SS4', '', '', '51.594', '0.715', 0, 1, 'uk'),\n('SS5', '', '', '51.607', '0.65', 0, 1, 'uk'),\n('SS6', '', '', '51.588', '0.609', 0, 1, 'uk'),\n('SS7', '', '', '51.562', '0.579', 0, 1, 'uk'),\n('SS8', '', '', '51.522', '0.591', 0, 1, 'uk'),\n('SS9', '', '', '51.554', '0.652', 0, 1, 'uk'),\n('ST1', '', '', '53.026', '-2.172', 0, 1, 'uk'),\n('ST10', '', '', '52.989', '-1.963', 0, 1, 'uk'),\n('ST11', '', '', '52.967', '-2.065', 0, 1, 'uk'),\n('ST12', '', '', '52.948', '-2.171', 0, 1, 'uk'),\n('ST13', '', '', '53.101', '-2.018', 0, 1, 'uk'),\n('ST14', '', '', '52.903', '-1.868', 0, 1, 'uk'),\n('ST15', '', '', '52.9', '-2.148', 0, 1, 'uk'),\n('ST16', '', '', '52.813', '-2.118', 0, 1, 'uk'),\n('ST17', '', '', '52.789', '-2.099', 0, 1, 'uk'),\n('ST18', '', '', '52.814', '-2.081', 0, 1, 'uk'),\n('ST19', '', '', '52.713', '-2.147', 0, 1, 'uk'),\n('ST2', '', '', '53.027', '-2.135', 0, 1, 'uk'),\n('ST20', '', '', '52.798', '-2.263', 0, 1, 'uk'),\n('ST21', '', '', '52.868', '-2.259', 0, 1, 'uk'),\n('ST3', '', '', '52.981', '-2.122', 0, 1, 'uk'),\n('ST4', '', '', '52.995', '-2.183', 0, 1, 'uk'),\n('ST5', '', '', '53.015', '-2.237', 0, 1, 'uk'),\n('ST6', '', '', '53.057', '-2.189', 0, 1, 'uk'),\n('ST7', '', '', '53.088', '-2.265', 0, 1, 'uk'),\n('ST8', '', '', '53.115', '-2.167', 0, 1, 'uk'),\n('ST9', '', '', '53.05', '-2.099', 0, 1, 'uk'),\n('SW1', '', '', '51.496', '-0.139', 0, 1, 'uk'),\n('SW10', '', '', '51.483', '-0.181', 0, 1, 'uk'),\n('SW11', '', '', '51.466', '-0.164', 0, 1, 'uk'),\n('SW12', '', '', '51.446', '-0.148', 0, 1, 'uk'),\n('SW13', '', '', '51.475', '-0.244', 0, 1, 'uk'),\n('SW14', '', '', '51.465', '-0.265', 0, 1, 'uk'),\n('SW15', '', '', '51.457', '-0.226', 0, 1, 'uk'),\n('SW16', '', '', '51.422', '-0.128', 0, 1, 'uk'),\n('SW17', '', '', '51.43', '-0.163', 0, 1, 'uk'),\n('SW18', '', '', '51.45', '-0.19', 0, 1, 'uk'),\n('SW19', '', '', '51.423', '-0.203', 0, 1, 'uk'),\n('SW1A', '', '', '51.503', '-0.132', 0, 1, 'uk'),\n('SW1E', '', '', '51.497', '-0.138', 0, 1, 'uk'),\n('SW1H', '', '', '51.498', '-0.133', 0, 1, 'uk'),\n('SW1P', '', '', '51.495', '-0.132', 0, 1, 'uk'),\n('SW1V', '', '', '51.49', '-0.138', 0, 1, 'uk'),\n('SW1W', '', '', '51.493', '-0.147', 0, 1, 'uk'),\n('SW1X', '', '', '51.498', '-0.153', 0, 1, 'uk'),\n('SW1Y', '', '', '51.505', '-0.133', 0, 1, 'uk'),\n('SW2', '', '', '51.449', '-0.119', 0, 1, 'uk'),\n('SW20', '', '', '51.411', '-0.225', 0, 1, 'uk'),\n('SW3', '', '', '51.489', '-0.165', 0, 1, 'uk'),\n('SW4', '', '', '51.461', '-0.135', 0, 1, 'uk'),\n('SW5', '', '', '51.49', '-0.189', 0, 1, 'uk'),\n('SW6', '', '', '51.476', '-0.2', 0, 1, 'uk'),\n('SW7', '', '', '51.496', '-0.175', 0, 1, 'uk'),\n('SW8', '', '', '51.476', '-0.131', 0, 1, 'uk'),\n('SW9', '', '', '51.469', '-0.112', 0, 1, 'uk'),\n('SY1', '', '', '52.723', '-2.74', 0, 1, 'uk'),\n('SY10', '', '', '52.836', '-3.121', 0, 1, 'uk'),\n('SY11', '', '', '52.867', '-3.029', 0, 1, 'uk'),\n('SY12', '', '', '52.903', '-2.893', 0, 1, 'uk'),\n('SY13', '', '', '52.952', '-2.689', 0, 1, 'uk'),\n('SY14', '', '', '53.03', '-2.763', 0, 1, 'uk'),\n('SY15', '', '', '52.555', '-3.13', 0, 1, 'uk'),\n('SY16', '', '', '52.52', '-3.311', 0, 1, 'uk'),\n('SY17', '', '', '52.517', '-3.465', 0, 1, 'uk'),\n('SY18', '', '', '52.441', '-3.548', 0, 1, 'uk'),\n('SY19', '', '', '52.574', '-3.611', 0, 1, 'uk'),\n('SY2', '', '', '52.707', '-2.728', 0, 1, 'uk'),\n('SY20', '', '', '52.614', '-3.819', 0, 1, 'uk'),\n('SY21', '', '', '52.658', '-3.205', 0, 1, 'uk'),\n('SY22', '', '', '52.756', '-3.186', 0, 1, 'uk'),\n('SY23', '', '', '52.381', '-4.051', 0, 1, 'uk'),\n('SY24', '', '', '52.47', '-4.023', 0, 1, 'uk'),\n('SY25', '', '', '52.238', '-3.936', 0, 1, 'uk'),\n('SY3', '', '', '52.699', '-2.77', 0, 1, 'uk'),\n('SY4', '', '', '52.795', '-2.751', 0, 1, 'uk'),\n('SY5', '', '', '52.653', '-2.827', 0, 1, 'uk'),\n('SY6', '', '', '52.539', '-2.79', 0, 1, 'uk'),\n('SY7', '', '', '52.425', '-2.887', 0, 1, 'uk'),\n('SY8', '', '', '52.365', '-2.695', 0, 1, 'uk'),\n('SY9', '', '', '52.498', '-2.986', 0, 1, 'uk'),\n('TA1', '', '', '51.013', '-3.101', 0, 1, 'uk'),\n('TA10', '', '', '51.033', '-2.825', 0, 1, 'uk'),\n('TA11', '', '', '51.06', '-2.702', 0, 1, 'uk'),\n('TA12', '', '', '50.974', '-2.772', 0, 1, 'uk'),\n('TA13', '', '', '50.946', '-2.81', 0, 1, 'uk'),\n('TA14', '', '', '50.946', '-2.75', 0, 1, 'uk'),\n('TA15', '', '', '50.951', '-2.718', 0, 1, 'uk'),\n('TA16', '', '', '50.907', '-2.792', 0, 1, 'uk'),\n('TA17', '', '', '50.908', '-2.835', 0, 1, 'uk'),\n('TA18', '', '', '50.882', '-2.786', 0, 1, 'uk'),\n('TA19', '', '', '50.934', '-2.914', 0, 1, 'uk'),\n('TA2', '', '', '51.033', '-3.102', 0, 1, 'uk'),\n('TA20', '', '', '50.873', '-2.962', 0, 1, 'uk'),\n('TA21', '', '', '50.977', '-3.245', 0, 1, 'uk'),\n('TA22', '', '', '51.045', '-3.545', 0, 1, 'uk'),\n('TA23', '', '', '51.162', '-3.352', 0, 1, 'uk'),\n('TA24', '', '', '51.182', '-3.51', 0, 1, 'uk'),\n('TA3', '', '', '50.994', '-3.039', 0, 1, 'uk'),\n('TA4', '', '', '51.071', '-3.268', 0, 1, 'uk'),\n('TA5', '', '', '51.146', '-3.104', 0, 1, 'uk'),\n('TA6', '', '', '51.125', '-3', 0, 1, 'uk'),\n('TA7', '', '', '51.13', '-2.912', 0, 1, 'uk'),\n('TA8', '', '', '51.244', '-2.994', 0, 1, 'uk'),\n('TA81', '', '', '51.235366', '-2.995549', 0, 1, 'uk'),\n('TA9', '', '', '51.226', '-2.956', 0, 1, 'uk'),\n('TD1', '', '', '55.624', '-2.811', 0, 1, 'uk'),\n('TD10', '', '', '55.712', '-2.449', 0, 1, 'uk'),\n('TD11', '', '', '55.788', '-2.316', 0, 1, 'uk'),\n('TD12', '', '', '55.653', '-2.239', 0, 1, 'uk'),\n('TD13', '', '', '55.93', '-2.37', 0, 1, 'uk'),\n('TD14', '', '', '55.868', '-2.124', 0, 1, 'uk'),\n('TD15', '', '', '55.747', '-2.012', 0, 1, 'uk'),\n('TD2', '', '', '55.733', '-2.753', 0, 1, 'uk'),\n('TD3', '', '', '55.7', '-2.572', 0, 1, 'uk'),\n('TD4', '', '', '55.642', '-2.671', 0, 1, 'uk'),\n('TD5', '', '', '55.587', '-2.416', 0, 1, 'uk'),\n('TD6', '', '', '55.583', '-2.694', 0, 1, 'uk'),\n('TD7', '', '', '55.537', '-2.871', 0, 1, 'uk'),\n('TD8', '', '', '55.475', '-2.541', 0, 1, 'uk'),\n('TD9', '', '', '55.397', '-2.776', 0, 1, 'uk'),\n('TF1', '', '', '52.703', '-2.503', 0, 1, 'uk'),\n('TF10', '', '', '52.769', '-2.385', 0, 1, 'uk'),\n('TF11', '', '', '52.663', '-2.36', 0, 1, 'uk'),\n('TF12', '', '', '52.612', '-2.48', 0, 1, 'uk'),\n('TF13', '', '', '52.578', '-2.582', 0, 1, 'uk'),\n('TF2', '', '', '52.7', '-2.439', 0, 1, 'uk'),\n('TF3', '', '', '52.664', '-2.444', 0, 1, 'uk'),\n('TF4', '', '', '52.661', '-2.467', 0, 1, 'uk'),\n('TF5', '', '', '52.715', '-2.536', 0, 1, 'uk'),\n('TF6', '', '', '52.735', '-2.554', 0, 1, 'uk'),\n('TF7', '', '', '52.636', '-2.449', 0, 1, 'uk'),\n('TF8', '', '', '52.63', '-2.479', 0, 1, 'uk'),\n('TF9', '', '', '52.897', '-2.469', 0, 1, 'uk'),\n('TN1', '', '', '51.135', '0.269', 0, 1, 'uk'),\n('TN10', '', '', '51.21', '0.286', 0, 1, 'uk'),\n('TN11', '', '', '51.206', '0.269', 0, 1, 'uk'),\n('TN12', '', '', '51.172', '0.44', 0, 1, 'uk'),\n('TN13', '', '', '51.276', '0.186', 0, 1, 'uk'),\n('TN14', '', '', '51.295', '0.162', 0, 1, 'uk'),\n('TN15', '', '', '51.3', '0.27', 0, 1, 'uk'),\n('TN16', '', '', '51.294', '0.052', 0, 1, 'uk'),\n('TN17', '', '', '51.096', '0.538', 0, 1, 'uk'),\n('TN18', '', '', '51.043', '0.526', 0, 1, 'uk'),\n('TN19', '', '', '51.002', '0.408', 0, 1, 'uk'),\n('TN2', '', '', '51.138', '0.287', 0, 1, 'uk'),\n('TN20', '', '', '51.026', '0.256', 0, 1, 'uk'),\n('TN21', '', '', '50.959', '0.265', 0, 1, 'uk'),\n('TN22', '', '', '50.981', '0.101', 0, 1, 'uk'),\n('TN23', '', '', '51.139', '0.86', 0, 1, 'uk'),\n('TN24', '', '', '51.15', '0.887', 0, 1, 'uk'),\n('TN25', '', '', '51.144', '0.94', 0, 1, 'uk'),\n('TN26', '', '', '51.1', '0.806', 0, 1, 'uk'),\n('TN27', '', '', '51.166', '0.707', 0, 1, 'uk'),\n('TN28', '', '', '50.982', '0.953', 0, 1, 'uk'),\n('TN29', '', '', '50.993', '0.934', 0, 1, 'uk'),\n('TN3', '', '', '51.122', '0.252', 0, 1, 'uk'),\n('TN30', '', '', '51.062', '0.698', 0, 1, 'uk'),\n('TN31', '', '', '50.963', '0.687', 0, 1, 'uk'),\n('TN32', '', '', '50.98', '0.49', 0, 1, 'uk'),\n('TN33', '', '', '50.91', '0.477', 0, 1, 'uk'),\n('TN34', '', '', '50.864', '0.583', 0, 1, 'uk'),\n('TN35', '', '', '50.88', '0.612', 0, 1, 'uk'),\n('TN36', '', '', '50.921', '0.702', 0, 1, 'uk'),\n('TN37', '', '', '50.871', '0.558', 0, 1, 'uk'),\n('TN38', '', '', '50.863', '0.546', 0, 1, 'uk'),\n('TN39', '', '', '50.846', '0.455', 0, 1, 'uk'),\n('TN4', '', '', '51.146', '0.259', 0, 1, 'uk'),\n('TN40', '', '', '50.844', '0.484', 0, 1, 'uk'),\n('TN5', '', '', '51.064', '0.362', 0, 1, 'uk'),\n('TN6', '', '', '51.053', '0.175', 0, 1, 'uk'),\n('TN7', '', '', '51.092', '0.109', 0, 1, 'uk'),\n('TN8', '', '', '51.195', '0.079', 0, 1, 'uk'),\n('TN9', '', '', '51.191', '0.276', 0, 1, 'uk'),\n('TQ1', '', '', '50.471', '-3.521', 0, 1, 'uk'),\n('TQ10', '', '', '50.424', '-3.819', 0, 1, 'uk'),\n('TQ11', '', '', '50.481', '-3.782', 0, 1, 'uk'),\n('TQ12', '', '', '50.529', '-3.612', 0, 1, 'uk'),\n('TQ13', '', '', '50.593', '-3.718', 0, 1, 'uk'),\n('TQ14', '', '', '50.55', '-3.507', 0, 1, 'uk'),\n('TQ2', '', '', '50.474', '-3.543', 0, 1, 'uk'),\n('TQ3', '', '', '50.443', '-3.575', 0, 1, 'uk'),\n('TQ4', '', '', '50.423', '-3.57', 0, 1, 'uk'),\n('TQ5', '', '', '50.391', '-3.522', 0, 1, 'uk'),\n('TQ6', '', '', '50.347', '-3.589', 0, 1, 'uk'),\n('TQ7', '', '', '50.282', '-3.783', 0, 1, 'uk'),\n('TQ8', '', '', '50.237', '-3.771', 0, 1, 'uk'),\n('TQ9', '', '', '50.416', '-3.69', 0, 1, 'uk'),\n('TR1', '', '', '50.263', '-5.054', 0, 1, 'uk'),\n('TR10', '', '', '50.166', '-5.118', 0, 1, 'uk'),\n('TR11', '', '', '50.149', '-5.086', 0, 1, 'uk'),\n('TR12', '', '', '50.043', '-5.179', 0, 1, 'uk'),\n('TR13', '', '', '50.109', '-5.285', 0, 1, 'uk'),\n('TR14', '', '', '50.21', '-5.296', 0, 1, 'uk'),\n('TR15', '', '', '50.233', '-5.237', 0, 1, 'uk'),\n('TR16', '', '', '50.232', '-5.221', 0, 1, 'uk'),\n('TR17', '', '', '50.125', '-5.468', 0, 1, 'uk'),\n('TR18', '', '', '50.117', '-5.541', 0, 1, 'uk'),\n('TR19', '', '', '50.1', '-5.627', 0, 1, 'uk'),\n('TR2', '', '', '50.253', '-4.952', 0, 1, 'uk'),\n('TR20', '', '', '50.131', '-5.488', 0, 1, 'uk'),\n('TR21', '', '', '49.93', '-6.256', 0, 1, 'uk'),\n('TR22', '', '', '49.892', '-6.344', 0, 1, 'uk'),\n('TR23', '', '', '49.953', '-6.352', 0, 1, 'uk'),\n('TR24', '', '', '49.955', '-6.334', 0, 1, 'uk'),\n('TR25', '', '', '49.964', '-6.293', 0, 1, 'uk'),\n('TR26', '', '', '50.202', '-5.478', 0, 1, 'uk'),\n('TR27', '', '', '50.182', '-5.403', 0, 1, 'uk'),\n('TR3', '', '', '50.217', '-5.109', 0, 1, 'uk'),\n('TR36', '', '', '50.248109', '-5.056774', 0, 1, 'uk'),\n('TR4', '', '', '50.283', '-5.136', 0, 1, 'uk'),\n('TR5', '', '', '50.308', '-5.191', 0, 1, 'uk'),\n('TR6', '', '', '50.342', '-5.152', 0, 1, 'uk'),\n('TR7', '', '', '50.413', '-5.074', 0, 1, 'uk'),\n('TR8', '', '', '50.399', '-5.037', 0, 1, 'uk'),\n('TR9', '', '', '50.414', '-4.936', 0, 1, 'uk'),\n('TS1', '', '', '54.572', '-1.238', 0, 1, 'uk'),\n('TS10', '', '', '54.607', '-1.068', 0, 1, 'uk'),\n('TS11', '', '', '54.588', '-1.026', 0, 1, 'uk'),\n('TS12', '', '', '54.562', '-0.965', 0, 1, 'uk'),\n('TS13', '', '', '54.55', '-0.854', 0, 1, 'uk'),\n('TS14', '', '', '54.532', '-1.06', 0, 1, 'uk'),\n('TS15', '', '', '54.491', '-1.331', 0, 1, 'uk'),\n('TS16', '', '', '54.524', '-1.353', 0, 1, 'uk'),\n('TS17', '', '', '54.537', '-1.302', 0, 1, 'uk'),\n('TS18', '', '', '54.562', '-1.323', 0, 1, 'uk'),\n('TS19', '', '', '54.577', '-1.345', 0, 1, 'uk'),\n('TS2', '', '', '54.585', '-1.235', 0, 1, 'uk'),\n('TS20', '', '', '54.586', '-1.313', 0, 1, 'uk'),\n('TS21', '', '', '54.627', '-1.425', 0, 1, 'uk'),\n('TS22', '', '', '54.618', '-1.313', 0, 1, 'uk'),\n('TS23', '', '', '54.608', '-1.285', 0, 1, 'uk'),\n('TS24', '', '', '54.696', '-1.21', 0, 1, 'uk'),\n('TS25', '', '', '54.663', '-1.223', 0, 1, 'uk'),\n('TS26', '', '', '54.688', '-1.229', 0, 1, 'uk'),\n('TS27', '', '', '54.723', '-1.288', 0, 1, 'uk'),\n('TS28', '', '', '54.725', '-1.373', 0, 1, 'uk'),\n('TS29', '', '', '54.71', '-1.419', 0, 1, 'uk'),\n('TS3', '', '', '54.561', '-1.196', 0, 1, 'uk'),\n('TS4', '', '', '54.556', '-1.222', 0, 1, 'uk'),\n('TS5', '', '', '54.551', '-1.251', 0, 1, 'uk'),\n('TS6', '', '', '54.566', '-1.153', 0, 1, 'uk'),\n('TS7', '', '', '54.534', '-1.183', 0, 1, 'uk'),\n('TS8', '', '', '54.522', '-1.23', 0, 1, 'uk'),\n('TS9', '', '', '54.466', '-1.163', 0, 1, 'uk'),\n('TW0', '', '', '51.465384', '-0.300162', 0, 1, 'uk'),\n('TW1', '', '', '51.45', '-0.325', 0, 1, 'uk'),\n('TW10', '', '', '51.45', '-0.302', 0, 1, 'uk'),\n('TW11', '', '', '51.426', '-0.331', 0, 1, 'uk'),\n('TW12', '', '', '51.422', '-0.368', 0, 1, 'uk'),\n('TW13', '', '', '51.438', '-0.4', 0, 1, 'uk'),\n('TW14', '', '', '51.452', '-0.419', 0, 1, 'uk'),\n('TW15', '', '', '51.43', '-0.456', 0, 1, 'uk'),\n('TW16', '', '', '51.416', '-0.416', 0, 1, 'uk'),\n('TW17', '', '', '51.397', '-0.447', 0, 1, 'uk'),\n('TW18', '', '', '51.428', '-0.506', 0, 1, 'uk'),\n('TW19', '', '', '51.452', '-0.502', 0, 1, 'uk'),\n('TW2', '', '', '51.446', '-0.35', 0, 1, 'uk'),\n('TW20', '', '', '51.427', '-0.55', 0, 1, 'uk'),\n('TW3', '', '', '51.467', '-0.362', 0, 1, 'uk'),\n('TW4', '', '', '51.466', '-0.383', 0, 1, 'uk'),\n('TW5', '', '', '51.48', '-0.381', 0, 1, 'uk'),\n('TW6', '', '', '51.47', '-0.446', 0, 1, 'uk'),\n('TW7', '', '', '51.473', '-0.332', 0, 1, 'uk'),\n('TW8', '', '', '51.486', '-0.307', 0, 1, 'uk'),\n('TW81', '', '', '51.477214', '-0.312279', 0, 1, 'uk'),\n('TW9', '', '', '51.468', '-0.293', 0, 1, 'uk'),\n('UB1', '', '', '51.514', '-0.372', 0, 1, 'uk'),\n('UB10', '', '', '51.548', '-0.453', 0, 1, 'uk'),\n('UB11', '', '', '51.519', '-0.458', 0, 1, 'uk'),\n('UB2', '', '', '51.499', '-0.378', 0, 1, 'uk'),\n('UB3', '', '', '51.505', '-0.422', 0, 1, 'uk'),\n('UB4', '', '', '51.524', '-0.407', 0, 1, 'uk'),\n('UB5', '', '', '51.543', '-0.375', 0, 1, 'uk'),\n('UB6', '', '', '51.539', '-0.342', 0, 1, 'uk'),\n('UB7', '', '', '51.506', '-0.469', 0, 1, 'uk'),\n('UB8', '', '', '51.535', '-0.473', 0, 1, 'uk'),\n('UB9', '', '', '51.581', '-0.49', 0, 1, 'uk'),\n('W1', '', '', '51.515', '-0.142', 0, 1, 'uk'),\n('W10', '', '', '51.521', '-0.213', 0, 1, 'uk'),\n('W11', '', '', '51.512', '-0.204', 0, 1, 'uk'),\n('W12', '', '', '51.508', '-0.23', 0, 1, 'uk'),\n('W13', '', '', '51.513', '-0.32', 0, 1, 'uk'),\n('W14', '', '', '51.494', '-0.209', 0, 1, 'uk'),\n('W1A', '', '', '51.519399', '-0.14057', 0, 1, 'uk'),\n('W1B', '', '', '51.514', '-0.139', 0, 1, 'uk'),\n('W1C', '', '', '51.514', '-0.148', 0, 1, 'uk'),\n('W1D', '', '', '51.513', '-0.131', 0, 1, 'uk'),\n('W1E', '', '', '51.512877', '-0.136464', 0, 1, 'uk'),\n('W1F', '', '', '51.513', '-0.135', 0, 1, 'uk'),\n('W1G', '', '', '51.519', '-0.147', 0, 1, 'uk'),\n('W1H', '', '', '51.517', '-0.159', 0, 1, 'uk'),\n('W1J', '', '', '51.507', '-0.143', 0, 1, 'uk'),\n('W1K', '', '', '51.511', '-0.149', 0, 1, 'uk'),\n('W1M', '', '', '51.518', '-0.149', 0, 1, 'uk'),\n('W1P', '', '', '51.51761', '-0.134368', 0, 1, 'uk'),\n('W1S', '', '', '51.511', '-0.141', 0, 1, 'uk'),\n('W1T', '', '', '51.52', '-0.135', 0, 1, 'uk'),\n('W1U', '', '', '51.518', '-0.152', 0, 1, 'uk'),\n('W1W', '', '', '51.519', '-0.14', 0, 1, 'uk'),\n('W2', '', '', '51.515', '-0.178', 0, 1, 'uk'),\n('W3', '', '', '51.509', '-0.268', 0, 1, 'uk'),\n('W4', '', '', '51.491', '-0.262', 0, 1, 'uk'),\n('W5', '', '', '51.512', '-0.301', 0, 1, 'uk'),\n('W6', '', '', '51.492', '-0.229', 0, 1, 'uk'),\n('W7', '', '', '51.511', '-0.334', 0, 1, 'uk'),\n('W8', '', '', '51.5', '-0.193', 0, 1, 'uk'),\n('W9', '', '', '51.526', '-0.191', 0, 1, 'uk'),\n('WA1', '', '', '53.394', '-2.569', 0, 1, 'uk'),\n('WA10', '', '', '53.454', '-2.755', 0, 1, 'uk'),\n('WA11', '', '', '53.477', '-2.719', 0, 1, 'uk'),\n('WA12', '', '', '53.454', '-2.632', 0, 1, 'uk'),\n('WA13', '', '', '53.382', '-2.468', 0, 1, 'uk'),\n('WA14', '', '', '53.386', '-2.359', 0, 1, 'uk'),\n('WA15', '', '', '53.384', '-2.325', 0, 1, 'uk'),\n('WA16', '', '', '53.303', '-2.371', 0, 1, 'uk'),\n('WA2', '', '', '53.41', '-2.58', 0, 1, 'uk'),\n('WA3', '', '', '53.453', '-2.548', 0, 1, 'uk'),\n('WA4', '', '', '53.365', '-2.574', 0, 1, 'uk'),\n('WA5', '', '', '53.399', '-2.636', 0, 1, 'uk'),\n('WA6', '', '', '53.273', '-2.722', 0, 1, 'uk'),\n('WA7', '', '', '53.33', '-2.703', 0, 1, 'uk'),\n('WA8', '', '', '53.372', '-2.741', 0, 1, 'uk'),\n('WA9', '', '', '53.436', '-2.718', 0, 1, 'uk'),\n('WC1', '', '', '51.521', '-0.122', 0, 1, 'uk'),\n('WC1A', '', '', '51.517', '-0.125', 0, 1, 'uk'),\n('WC1B', '', '', '51.518', '-0.126', 0, 1, 'uk'),\n('WC1E', '', '', '51.52', '-0.131', 0, 1, 'uk'),\n('WC1H', '', '', '51.524', '-0.126', 0, 1, 'uk'),\n('WC1N', '', '', '51.522', '-0.12', 0, 1, 'uk'),\n('WC1R', '', '', '51.519', '-0.116', 0, 1, 'uk'),\n('WC1V', '', '', '51.517', '-0.118', 0, 1, 'uk'),\n('WC1X', '', '', '51.525', '-0.116', 0, 1, 'uk'),\n('WC2', '', '', '51.513', '-0.123', 0, 1, 'uk'),\n('WC2A', '', '', '51.516', '-0.115', 0, 1, 'uk'),\n('WC2B', '', '', '51.515', '-0.121', 0, 1, 'uk'),\n('WC2E', '', '', '51.512', '-0.123', 0, 1, 'uk'),\n('WC2H', '', '', '51.513', '-0.127', 0, 1, 'uk'),\n('WC2N', '', '', '51.51', '-0.125', 0, 1, 'uk'),\n('WC2R', '', '', '51.512', '-0.119', 0, 1, 'uk'),\n('WD1', '', '', '51.647', '-0.4', 0, 1, 'uk'),\n('WD17', '', '', '51.661', '-0.405', 0, 1, 'uk'),\n('WD18', '', '', '51.648', '-0.414', 0, 1, 'uk'),\n('WD19', '', '', '51.631', '-0.391', 0, 1, 'uk'),\n('WD2', '', '', '51.667', '-0.377', 0, 1, 'uk'),\n('WD23', '', '', '51.645', '-0.365', 0, 1, 'uk'),\n('WD24', '', '', '51.67', '-0.398', 0, 1, 'uk'),\n('WD25', '', '', '51.684', '-0.389', 0, 1, 'uk'),\n('WD3', '', '', '51.645', '-0.481', 0, 1, 'uk'),\n('WD4', '', '', '51.709', '-0.456', 0, 1, 'uk'),\n('WD5', '', '', '51.705', '-0.417', 0, 1, 'uk'),\n('WD6', '', '', '51.657', '-0.275', 0, 1, 'uk'),\n('WD7', '', '', '51.686', '-0.309', 0, 1, 'uk'),\n('WF1', '', '', '53.687', '-1.492', 0, 1, 'uk'),\n('WF10', '', '', '53.724', '-1.344', 0, 1, 'uk'),\n('WF11', '', '', '53.711', '-1.256', 0, 1, 'uk'),\n('WF12', '', '', '53.684', '-1.62', 0, 1, 'uk'),\n('WF13', '', '', '53.692', '-1.645', 0, 1, 'uk'),\n('WF14', '', '', '53.68', '-1.693', 0, 1, 'uk'),\n('WF15', '', '', '53.708', '-1.698', 0, 1, 'uk'),\n('WF16', '', '', '53.71', '-1.669', 0, 1, 'uk'),\n('WF17', '', '', '53.719', '-1.641', 0, 1, 'uk'),\n('WF2', '', '', '53.673', '-1.511', 0, 1, 'uk'),\n('WF3', '', '', '53.723', '-1.524', 0, 1, 'uk'),\n('WF4', '', '', '53.647', '-1.519', 0, 1, 'uk'),\n('WF5', '', '', '53.68', '-1.576', 0, 1, 'uk'),\n('WF6', '', '', '53.7', '-1.414', 0, 1, 'uk'),\n('WF7', '', '', '53.667', '-1.35', 0, 1, 'uk'),\n('WF8', '', '', '53.685', '-1.299', 0, 1, 'uk'),\n('WF9', '', '', '53.606', '-1.32', 0, 1, 'uk'),\n('WN1', '', '', '53.554', '-2.626', 0, 1, 'uk'),\n('WN2', '', '', '53.537', '-2.582', 0, 1, 'uk'),\n('WN3', '', '', '53.529', '-2.645', 0, 1, 'uk'),\n('WN4', '', '', '53.495', '-2.643', 0, 1, 'uk'),\n('WN5', '', '', '53.532', '-2.685', 0, 1, 'uk'),\n('WN6', '', '', '53.574', '-2.669', 0, 1, 'uk'),\n('WN7', '', '', '53.498', '-2.517', 0, 1, 'uk'),\n('WN8', '', '', '53.553', '-2.768', 0, 1, 'uk'),\n('WR1', '', '', '52.197', '-2.217', 0, 1, 'uk'),\n('WR10', '', '', '52.114', '-2.064', 0, 1, 'uk'),\n('WR11', '', '', '52.095', '-1.929', 0, 1, 'uk'),\n('WR12', '', '', '52.043', '-1.874', 0, 1, 'uk'),\n('WR13', '', '', '52.094', '-2.342', 0, 1, 'uk'),\n('WR14', '', '', '52.113', '-2.319', 0, 1, 'uk'),\n('WR15', '', '', '52.305', '-2.568', 0, 1, 'uk'),\n('WR2', '', '', '52.19', '-2.241', 0, 1, 'uk'),\n('WR3', '', '', '52.216', '-2.21', 0, 1, 'uk'),\n('WR4', '', '', '52.205', '-2.184', 0, 1, 'uk'),\n('WR5', '', '', '52.177', '-2.199', 0, 1, 'uk'),\n('WR6', '', '', '52.228', '-2.37', 0, 1, 'uk'),\n('WR7', '', '', '52.197', '-2.052', 0, 1, 'uk'),\n('WR8', '', '', '52.082', '-2.203', 0, 1, 'uk'),\n('WR9', '', '', '52.268', '-2.157', 0, 1, 'uk'),\n('WS1', '', '', '52.579', '-1.977', 0, 1, 'uk'),\n('WS10', '', '', '52.56', '-2.021', 0, 1, 'uk'),\n('WS11', '', '', '52.689', '-2.017', 0, 1, 'uk'),\n('WS12', '', '', '52.706', '-1.999', 0, 1, 'uk'),\n('WS13', '', '', '52.692', '-1.818', 0, 1, 'uk'),\n('WS14', '', '', '52.663', '-1.814', 0, 1, 'uk'),\n('WS15', '', '', '52.758', '-1.917', 0, 1, 'uk'),\n('WS19', '', '', '52.556436', '-2.020665', 0, 1, 'uk'),\n('WS2', '', '', '52.588', '-2.002', 0, 1, 'uk'),\n('WS3', '', '', '52.618', '-1.99', 0, 1, 'uk'),\n('WS4', '', '', '52.605', '-1.959', 0, 1, 'uk'),\n('WS5', '', '', '52.567', '-1.959', 0, 1, 'uk'),\n('WS6', '', '', '52.658', '-2.022', 0, 1, 'uk'),\n('WS7', '', '', '52.68', '-1.913', 0, 1, 'uk'),\n('WS8', '', '', '52.646', '-1.933', 0, 1, 'uk'),\n('WS9', '', '', '52.609', '-1.917', 0, 1, 'uk'),\n('WV1', '', '', '52.586', '-2.115', 0, 1, 'uk'),\n('WV10', '', '', '52.617', '-2.112', 0, 1, 'uk'),\n('WV11', '', '', '52.61', '-2.071', 0, 1, 'uk'),\n('WV12', '', '', '52.606', '-2.039', 0, 1, 'uk'),\n('WV13', '', '', '52.585', '-2.06', 0, 1, 'uk'),\n('WV14', '', '', '52.557', '-2.078', 0, 1, 'uk'),\n('WV15', '', '', '52.516', '-2.375', 0, 1, 'uk'),\n('WV16', '', '', '52.511', '-2.44', 0, 1, 'uk'),\n('WV2', '', '', '52.574', '-2.118', 0, 1, 'uk'),\n('WV3', '', '', '52.58', '-2.151', 0, 1, 'uk'),\n('WV4', '', '', '52.563', '-2.142', 0, 1, 'uk'),\n('WV5', '', '', '52.533', '-2.209', 0, 1, 'uk'),\n('WV6', '', '', '52.596', '-2.181', 0, 1, 'uk'),\n('WV7', '', '', '52.633', '-2.27', 0, 1, 'uk'),\n('WV8', '', '', '52.623', '-2.183', 0, 1, 'uk'),\n('WV9', '', '', '52.633', '-2.14', 0, 1, 'uk'),\n('Y03', '', '', '53.971664', '-1.047148', 0, 1, 'uk'),\n('YO1', '', '', '53.958', '-1.081', 0, 1, 'uk'),\n('YO10', '', '', '53.95', '-1.058', 0, 1, 'uk'),\n('YO11', '', '', '54.265', '-0.395', 0, 1, 'uk'),\n('YO12', '', '', '54.274', '-0.422', 0, 1, 'uk'),\n('YO13', '', '', '54.288', '-0.496', 0, 1, 'uk'),\n('YO14', '', '', '54.199', '-0.297', 0, 1, 'uk'),\n('YO15', '', '', '54.094', '-0.177', 0, 1, 'uk'),\n('YO16', '', '', '54.095', '-0.201', 0, 1, 'uk'),\n('YO17', '', '', '54.136', '-0.753', 0, 1, 'uk'),\n('YO18', '', '', '54.258', '-0.767', 0, 1, 'uk'),\n('YO19', '', '', '53.91', '-1.021', 0, 1, 'uk'),\n('YO2', '', '', '54.272252', '-0.935131', 0, 1, 'uk'),\n('YO21', '', '', '54.477', '-0.712', 0, 1, 'uk'),\n('YO22', '', '', '54.451', '-0.621', 0, 1, 'uk'),\n('YO23', '', '', '53.925', '-1.121', 0, 1, 'uk'),\n('YO24', '', '', '53.946', '-1.114', 0, 1, 'uk'),\n('YO25', '', '', '54.005', '-0.413', 0, 1, 'uk'),\n('YO26', '', '', '53.975', '-1.172', 0, 1, 'uk'),\n('YO3', '', '', '53.963055', '-1.085481', 0, 1, 'uk'),\n('YO30', '', '', '53.986', '-1.114', 0, 1, 'uk'),\n('YO31', '', '', '53.969', '-1.063', 0, 1, 'uk'),\n('YO32', '', '', '54.011', '-1.059', 0, 1, 'uk'),\n('YO41', '', '', '53.969', '-0.902', 0, 1, 'uk'),\n('YO42', '', '', '53.923', '-0.79', 0, 1, 'uk'),\n('YO43', '', '', '53.85', '-0.69', 0, 1, 'uk'),\n('YO5', '', '', '53.996416', '-1.300782', 0, 1, 'uk'),\n('YO51', '', '', '54.082', '-1.376', 0, 1, 'uk'),\n('YO60', '', '', '54.082', '-0.941', 0, 1, 'uk'),\n('YO61', '', '', '54.115', '-1.193', 0, 1, 'uk'),\n('YO62', '', '', '54.242', '-0.993', 0, 1, 'uk'),\n('YO7', '', '', '54.224', '-1.35', 0, 1, 'uk'),\n('YO8', '', '', '53.781', '-1.058', 0, 1, 'uk'),\n('YO91', '', '', '53.975436', '-1.07902', 0, 1, 'uk'),\n('ZE1', '', '', '60.152', '-1.168', 0, 1, 'uk'),\n('ZE2', '', '', '60.331', '-1.226', 0, 1, 'uk'),\n('ZE3', '', '', '59.884', '-1.302', 0, 1, 'uk');"
  },
  {
    "path": "src/test/resources/samples/langs/SQLPL/check_reorg.sql",
    "content": "create procedure check_reorg_tables (in v_schema varchar(128), out v_reorg_counter integer)\nbegin\n\n  declare loc result_set_locator varying;\n\n  declare schema_out        varchar(128);\n  declare table_out         varchar(128);\n  declare card_out          integer;\n  declare overflow_out      integer;\n  declare npages_out        integer;\n  declare fpages_out        integer;\n  declare active_blocks_out integer;\n  declare tsize_out         integer;\n  declare f1_out            integer;\n  declare f2_out            integer;\n  declare f3_out            integer;\n  declare reorg_out         varchar(3);\n  declare cursor_end        smallint default 0;\n\n  declare continue handler for NOT FOUND\n \n  set cursor_end = 1;\n  set v_reorg_counter = 0;\n\n  call reorgchk_tb_stats('S', v_schema);\n  associate result set locator(loc) with procedure reorgchk_tb_stats;\n  allocate mycursor cursor for result set loc;\n\n  open mycursor;\n  repeat\n    fetch from mycursor into schema_out, table_out, card_out, overflow_out, npages_out, fpages_out, active_blocks_out, tsize_out, f1_out, f2_out, f3_out, reorg_out;\n     if reorg_out <> '---' then\n        set v_reorg_counter = v_reorg_counter + 1;\n     end if;\n     until cursor_end = 1\n  end repeat;\n  close mycursor;\n\nend!\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQLPL/comm_amount.db2",
    "content": "DROP FUNCTION COMM_AMOUNT;\nCREATE FUNCTION COMM_AMOUNT(SALARY DEC(9,2))\n  RETURNS DEC(9,2)\n  LANGUAGE SQL READS SQL DATA\n  BEGIN ATOMIC\n    DECLARE REMAINDER DEC(9,2) DEFAULT 0.0;--\n    DECLARE COMM_PAID DEC(9,2) DEFAULT 0.0;--\n    DECLARE COMM_INCR INT      DEFAULT 1;--\n    DECLARE MAX_COMM  DEC(9,2) DEFAULT 0.0;--\n\n    IF (SALARY <= 0) THEN\n       SIGNAL SQLSTATE '75000'\n         SET MESSAGE_TEXT = 'Bad Salary';--\n    END IF;--\n\n    SET REMAINDER = SALARY;--\n\nL1: WHILE REMAINDER > 0.0 DO\n      SET COMM_PAID = COMM_PAID + (COMM_INCR * 500.00);--\n      SET REMAINDER = REMAINDER-(COMM_INCR * 5000.00);--\n      SET COMM_INCR = COMM_INCR + 1;--\n    END WHILE L1;--\n\n    SET MAX_COMM =\n       (SELECT SUM(SALARY)/100.00 FROM EMPLOYEE);--\n    IF (COMM_PAID > MAX_COMM) THEN\n       SET COMM_PAID = MAX_COMM;--\n    END IF;--\n    RETURN COMM_PAID;--\nEND;\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQLPL/drop_table.db2",
    "content": "DROP TABLE TDEPT;\nCREATE TABLE TDEPT (DEPTNO CHAR(4));\n\n--#SET TERMINATOR @\nBEGIN ATOMIC\n  DECLARE COUNT INT DEFAULT 5;\n\n  WHILE COUNT > 0 DO\n    INSERT INTO TDEPT VALUES 'F'||\n       RTRIM(CHAR(COUNT));\n    SET COUNT = COUNT - 1;\n  END WHILE;\nEND@\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQLPL/runstats.sql",
    "content": "create procedure runstats (out nr_tables integer, out nr_ok integer)\nbegin\n  declare SQLCODE integer;\n  declare stmt varchar(100);\n\n  set nr_tables = 0;\n  set nr_ok = 0;\n\n  for line as select tabschema, tabname from syscat.tables where type='T' and tabschema='SPODEN'\n  do\n    set nr_tables = nr_tables + 1;\n    set stmt = 'CALL SYSPROC.ADMIN_CMD (RUNSTATS ON TABLE ' concat rtrim(line.tabschema) concat '.' concat line.tabname concat ')';\n    execute immediate stmt;\n    if SQLCODE = 0 then\n       set nr_ok = nr_ok + 1;\n    end if;\n  end for;\nend!\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQLPL/sleep.sql",
    "content": "create procedure sleep (in sleeptime integer)\nbegin\n  declare wait_until timestamp;\n\n  set wait_until = (current timestamp + sleeptime seconds);\n  while (wait_until > current timestamp)\n    do\n    end while;\nend!\n"
  },
  {
    "path": "src/test/resources/samples/langs/SQLPL/trigger.sql",
    "content": "create trigger CHECK_HIREDATE\nno cascade before insert on EMPLOYEE\nreferencing new as N\nfor each row mode db2sql\nif n.hiredate > current date\nthen\n  signal SQLSTATE '75000'\n  set MESSAGE_TEXT = 'Hire date must be in the past';\nend if!\n"
  },
  {
    "path": "src/test/resources/samples/langs/SRecode Template/linguist.srt",
    "content": ";;; linguist.srt --- Template for linguist-example-mode\n\n;; Not copyrighted whatsoever.\n;;\n;; GPL can bite my shiny metal ass.\n;;\n;; GitHub:   1\n;; Stallman: 0\n\nset mode \"default\"\n\nset comment_start \";\"\n\nset LICENSE \"It's public domain, baby. This was written for the sole\npurpose of the format's inclusion and recognition by GitHub Linguist.\nThis block of multiline text was added because every other .srt file\nI could find was GPL-licensed and had long-winded copyright blobs in\nthe file's header. Also, check out my sick line-wrapping abilities.\"\n\nset DOLLAR \"$\"\n\ncontext file\n\n\ntemplate license\n----\n{{LICENSE:srecode-comment-prefix}}\n----\n\n\ntemplate filecomment :file :user :time\n----\n{{comment_start}} {{FILENAME}} --- {{^}}\n{{comment_prefix}} YUO WAN GPL?\n{{comment_prefix}} \n{{comment_prefix}} Copyright (C) {{YEAR}} {{?AUTHOR}}\n{{comment_prefix}}\n{{comment_prefix}} TUO BAD\n{{comment_prefix}} WE EXPAT PEOPLE\n{{comment_prefix}} {{EXPLETIVE}} YOU!\n{{>:copyright}}\n{{comment_end}}\n----\n\n;; end\n"
  },
  {
    "path": "src/test/resources/samples/langs/STON/Array.ston",
    "content": "[1, 2, 3]\n"
  },
  {
    "path": "src/test/resources/samples/langs/STON/Dictionary.ston",
    "content": "{#a : 1, #b : 2}\n"
  },
  {
    "path": "src/test/resources/samples/langs/STON/Rectangle.ston",
    "content": "Rectangle {\n   #origin : Point [ -40, -15 ],\n   #corner : Point [ 60, 35 ]\n }\n"
  },
  {
    "path": "src/test/resources/samples/langs/STON/TestDomainObject.ston",
    "content": "TestDomainObject {\n  #created : DateAndTime [ '2012-02-14T16:40:15+01:00' ],\n  #modified : DateAndTime [ '2012-02-14T16:40:18+01:00' ],\n  #integer : 39581,\n  #float : 73.84789359463944,\n  #description : 'This is a test',\n  #color : #green,\n  #tags : [\n    #two,\n    #beta,\n    #medium\n  ],\n  #bytes : ByteArray [ 'afabfdf61d030f43eb67960c0ae9f39f' ],\n  #boolean : false\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/STON/ZNResponse.ston",
    "content": "ZnResponse {\n   #headers : ZnHeaders {\n     #headers : ZnMultiValueDictionary {\n        'Date' : 'Fri, 04 May 2012 20:09:23 GMT',\n        'Modification-Date' : 'Thu, 10 Feb 2011 08:32:30 GMT',\n        'Content-Length' : '113',\n        'Server' : 'Zinc HTTP Components 1.0',\n        'Vary' : 'Accept-Encoding',\n        'Connection' : 'close',\n        'Content-Type' : 'text/html;charset=utf-8'\n     }\n   },\n   #entity : ZnStringEntity {\n     #contentType : ZnMimeType {\n        #main : 'text',\n        #sub : 'html',\n        #parameters : {\n            'charset' : 'utf-8'\n        }\n     },\n     #contentLength : 113,\n     #string : '<html>\\n<head><title>Small</title></head>\\n<body><h1>Small</h1><p>This is a small HTML document</p></body>\\n</html>\\n',\n     #encoder : ZnUTF8Encoder { }\n   },\n   #statusLine : ZnStatusLine {\n     #version : 'HTTP/1.1',\n     #code : 200,\n     #reason : 'OK'\n   }\n }\n"
  },
  {
    "path": "src/test/resources/samples/langs/STON/methodProperties.ston",
    "content": "{\n\t\"class\" : {\n\t\t },\n\t\"instance\" : {\n\t\t\"clientList:listElement:\" : \"dkh 03/20/2014 16:27\",\n\t\t\"copyObjectMenuAction:selectionIndex:\" : \"dkh 10/13/2013 10:20\",\n\t\t\"definitionForSelection:\" : \"dkh 10/13/2013 10:15\",\n\t\t\"editMenuActionSpec\" : \"dkh 10/13/2013 10:19\",\n\t\t\"itemSelected:listElement:selectedIndex:shiftPressed:\" : \"dkh 10/20/2013 11:06\",\n\t\t\"menuActionSpec:\" : \"dkh 10/19/2013 17:12\",\n\t\t\"repository:\" : \"dkh 10/19/2013 17:36\",\n\t\t\"theList\" : \"dkh 10/12/2013 15:51\",\n\t\t\"versionInfoBlock:\" : \"dkh 10/19/2013 17:08\",\n\t\t\"versionInfoDiffVsSelection:selectedIndex:\" : \"dkh 10/19/2013 17:48\",\n\t\t\"versionInfoDiffVsWorkingCopy:selectedIndex:\" : \"dkh 10/20/2013 12:36\",\n\t\t\"versionInfoSelect:selectedIndex:\" : \"dkh 10/12/2013 17:04\",\n\t\t\"versionInfos\" : \"dkh 10/19/2013 17:13\",\n\t\t\"versionSummaryIsClosing\" : \"dkh 10/20/2013 10:19\",\n\t\t\"windowIsClosing:\" : \"dkh 10/20/2013 10:39\",\n\t\t\"windowLabel\" : \"dkh 05/20/2014 11:00\",\n\t\t\"windowLocation\" : \"dkh 05/23/2014 10:17\",\n\t\t\"windowName\" : \"dkh 10/12/2013 16:00\",\n\t\t\"workingCopy\" : \"dkh 10/12/2013 16:16\",\n\t\t\"workingCopy:\" : \"dkh 10/12/2013 16:17\" } }\n"
  },
  {
    "path": "src/test/resources/samples/langs/STON/properties.ston",
    "content": "{\n\t\"category\" : \"Topez-Server-Core\",\n\t\"classinstvars\" : [\n\t\t ],\n\t\"classvars\" : [\n\t\t ],\n\t\"commentStamp\" : \"\",\n\t\"instvars\" : [\n\t\t\"workingCopy\",\n\t\t\"repository\",\n\t\t\"versionInfos\",\n\t\t\"versionInfoBlock\",\n\t\t\"selectedVersionInfo\",\n\t\t\"versionInfoSummaryWindowId\" ],\n\t\"name\" : \"TDVersionInfoBrowser\",\n\t\"pools\" : [\n\t\t ],\n\t\"super\" : \"TDAbstractMonticelloToolBuilder\",\n\t\"type\" : \"normal\" }\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sage/polinomios.sagews",
    "content": "# -*- coding: utf-8 -*-\n#\n#   Funciones en Python/Sage para el trabajo con polinomios con una\n#   incógnita (x).\n#\n#   Copyright (C) 2014-2015, David Abián <davidabian [at] davidabian.com>\n#\n#   This program is free software: you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the Free\n#   Software Foundation, either version 3 of the License, or (at your option)\n#   any later version.\n#\n#   This program is distributed in the hope that it will be useful, but WITHOUT\n#   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n#   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n#   more details.\n#\n#   You should have received a copy of the GNU General Public License along with\n#   this program.  If not, see <http://www.gnu.org/licenses/>.\n\ndef pols (grado=-1, K=GF(2), mostrar=False):\n    \"\"\"Devuelve la lista de polinomios constantes y no constantes de\n    coeficientes mónicos y grado igual o menor que el especificado.\n    Si el grado indicado no es válido, devuelve una lista vacía.\n    \"\"\"\n    lpols = []\n    if not grado.is_integer():\n        grado = grado.round()\n    if grado >= 0:\n        var('x')\n        xs = vector([(x^i) for i in range(grado+1)])\n        V = VectorSpace(K,grado+1)\n        lpols = [cs*xs for cs in V]\n        if mostrar:\n            for pol in lpols:\n                print pol\n    return lpols\n\ndef polsNoCtes (grado=-1, K=GF(2), mostrar=False):\n    \"\"\"Devuelve la lista de polinomios no constantes de coeficientes mónicos y\n    grado igual o menor que el especificado.\n    Si el grado indicado no es válido, devuelve una lista vacía.\n    \"\"\"\n    lpols = []\n    if not grado.is_integer():\n        grado = grado.round()\n    if grado >= 0:\n        var('x')\n        xs = vector([(x^i) for i in range(grado+1)])\n        for cs in K^(grado+1):\n            if cs[:grado] != vector(grado*[0]): # no constantes\n                lpols += [cs*xs]\n        if mostrar:\n            for pol in lpols:\n                print pol\n    return lpols\n\ndef polsMismoGrado (grado=-1, K=GF(2), mostrar=False):\n    \"\"\"Devuelve la lista de polinomios de coeficientes mónicos del grado\n    especificado.\n    Si el grado indicado no es válido, devuelve una lista vacía.\n    \"\"\"\n    lpols = []\n    if not grado.is_integer():\n        grado = grado.round()\n    if grado >= 0:\n        var('x')\n        xs = vector([(x^(grado-i)) for i in [0..grado]])\n        for cs in K^(grado+1):\n            if cs[0] != 0: # polinomios del mismo grado\n                lpols += [cs*xs]\n        if mostrar:\n            for pol in lpols:\n                print pol\n    return lpols\n\ndef excluirReducibles (lpols=[], mostrar=False):\n    \"\"\"Filtra una lista dada de polinomios de coeficientes mónicos y devuelve\n    aquellos irreducibles.\n    \"\"\"\n    var('x')\n    irreds = []\n    for p in lpols:\n        fp = (p.factor_list())\n        if len(fp) == 1 and fp[0][1] == 1:\n            irreds += [p]\n    if mostrar:\n        for pol in irreds:\n            print pol\n    return irreds\n\ndef vecPol (vec=random_vector(GF(2),0)):\n    \"\"\"Transforma los coeficientes dados en forma de vector en el polinomio\n    que representan.\n    \n    Por ejemplo, con vecPol(vector([1,0,3,1])) se obtiene x³ + 3*x + 1.\n    \n    Para la función opuesta, véase polVec().\n    \"\"\"\n    var('x')\n    xs = vector([x^(len(vec)-1-i) for i in range(len(vec))])\n    return vec*xs\n\ndef polVec (p=None):\n    \"\"\"Devuelve el vector de coeficientes del polinomio dado que acompañan a la\n    incógnita x, de mayor a menor grado.\n    \n    Por ejemplo, con polVec(x^3 + 3*x + 1) se obtiene el vector (1, 0, 3, 1).\n    \n    Para la función opuesta, véase vecPol().\n    \"\"\"\n    cs = []\n    if p != None:\n        var('x')\n        p(x) = p\n        for i in [0..p(x).degree(x)]:\n            cs.append(p(x).coefficient(x,i))\n        cs = list(reversed(cs))\n    return vector(cs)\n\ndef completar2 (p=0):\n    \"\"\"Aplica el método de completar cuadrados en parábolas al polinomio dado de\n    grado 2 y lo devuelve en su nueva forma.\n    \n    Si el polinomio dado no es válido, devuelve 0.\n    \n    Por ejemplo, con complCuad(3*x^2 + 12*x + 5) se obtiene 3*(x + 2)^2 - 7.\n    \"\"\"\n    var('x')\n    p(x) = p.expand()\n    if p(x).degree(x) != 2:\n        p(x) = 0\n    else:\n        cs = polVec(p(x))\n        p(x) = cs[0]*(x+(cs[1]/(2*cs[0])))^2+(4*cs[0]*cs[2]-cs[1]^2)/(4*cs[0])\n    return p(x)\n"
  },
  {
    "path": "src/test/resources/samples/langs/SaltStack/eval.sls",
    "content": "ceph:\n  pkg.installed:\n    - refresh: True\n  service:\n    - dead\n    - enable: False\n    - require:\n      - file: /etc/eval.conf\n   {% if grains['os'] == 'Ubuntu'%}\n      - file: /etc/apt/sources.list.d/ceph.list\n   {% endif %}\n\nceph-mds:\n  pkg.installed:\n    - require:\n      - pkg: ceph\n\ninclude:\n  - ceph.extras\n\n{% if grains['os'] == 'Ubuntu'%}\n/etc/apt/sources.list.d/ceph.list:\n  file.managed:\n    - source: salt://ceph/apt.list\n    - template: jinja\n    - require: \n      - cmd: repo-key\n\nrepo-key:\n  cmd.run:\n    - name: 'wget -q -O - https://raw.github.com/release.asc | sudo apt-key add -'\n    - unless: 'apt-key list | grep -q -i ceph' \n{% endif %}\n\n/etc/ceph/ceph.conf:\n  file.managed:\n    - source: salt://ceph/eval.conf\n    - template: jinja\n    - makedirs: true\n\n/var/lib/ceph:\n  file.directory:\n    - names:\n     {% for dir in 'mon.a','osd.0','osd.1','mds.a' %}\n      - /var/lib/ceph/{{ dir.split('.')[0] }}/ceph-{{ dir.split('.')[1] }}\n     {% endfor %}\n    - require:\n      - pkg: ceph\n"
  },
  {
    "path": "src/test/resources/samples/langs/SaltStack/gimp.sls",
    "content": "gimp:\n  2.8.14:\n    installer: 'http://gimper.net/downloads/pub/gimp/stable/windows/gimp-2.8.14-setup-1.exe'\n    install_flags: 'SP- /SILENT /NORESTART'\n    full_name: 'GIMP 2.8.14'\n    uninstaller: '%ProgramFiles%\\Gimp 2\\uninst\\unins000.exe'\n    uninstall_flags: 'SP- /SILENT /NORESTART'\n"
  },
  {
    "path": "src/test/resources/samples/langs/SaltStack/gpg4win-light.sls",
    "content": "gpg4win-light:\n  2.2.3:\n    installer: 'http://files.gpg4win.org/gpg4win-light-2.2.3.exe'\n    full_name: 'Gpg4Win (2.2.3)'\n    reboot: False\n    install_flags: '/S'\n    uninstaller: '%ProgramFiles%\\GNU\\GnuPG\\gpg4win-uninstall.exe'\n    uninstall_flags: '/S'\n#\n# Note: this 2.2.3 light installer has a bug and it needs to be fixed upstream \n# Here are work around instructions under Issue #113 in the meantime\n# https://github.com/saltstack/salt-winrepo/issues/113#issuecomment-72837987\n#\n"
  },
  {
    "path": "src/test/resources/samples/langs/SaltStack/openoffice.sls",
    "content": "openoffice:\n  4.1.1: \n    installer: 'http://downloads.sourceforge.net/project/openofficeorg.mirror/4.1.1/binaries/en-US/Apache_OpenOffice_4.1.1_Win_x86_install_en-US.exe'\n    full_name: 'OpenOffice 4.1.1'\n    reboot: False\n    install_flags: '/S'\n    uninstaller: 'msiexec.exe'\n    uninstall_flags: '/qn /x {9395F41D-0F80-432E-9A59-B8E477E7E163}'\n\n#\n# for other languages replace the two occurrences of 'en-US' \n# in the download URL with your local two or four letter code below:\n#\n# 'el', 'en-GB', 'es', 'eu', 'ca',\n# 'ca-XR', 'ca-XV', 'cs', 'ru', 'zh-CN', \n# 'zh-TW', 'vi', 'ta', 'th', 'tr', 'sk', \n# 'sl', 'sr', 'sv', 'pl', 'pt', 'pt-BR',\n# 'nb', 'nl', 'lt', 'km', 'ko', 'ja',\n# 'it', 'he', 'hi', 'hu', 'gd', 'gl',\n# 'fi', 'fr', 'da', 'de', 'bg', 'ast'\n#\n"
  },
  {
    "path": "src/test/resources/samples/langs/SaltStack/top.sls",
    "content": "base:\n  '*':\n    - packages\n    - coffeestats\n"
  },
  {
    "path": "src/test/resources/samples/langs/SaltStack/truecrypt.sls",
    "content": "truecrypt:\n  7.1a:\n    installer: 'https://download.truecrypt.ch/current/TrueCrypt%20Setup%207.1a.exe'\n    full_name: 'TrueCrypt 7.1a'\n    reboot: False\n    install_flags: '/S'\n    uninstaller: '%ProgramFiles(x86)%\\Truecrypt\\uninstall.exe'\n    uninstall_flags: '/S'\n \n"
  },
  {
    "path": "src/test/resources/samples/langs/Sass/screen.sass",
    "content": "$blue: #3bbfce\n$margin: 16px\n\n.content-navigation\n  border-color: $blue\n  color: darken($blue, 9%)\n\n.border\n  padding: $margin / 2\n  margin: $margin / 2\n  border-color: $blue\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scala/99-bottles-of-beer",
    "content": "#!/bin/sh\nexec scala \"$0\" \"$@\"\n!#\n\nobject Beers extends Application {\n\n\tdef bottles(qty : Int, f : => String) = // higher-order functions\n\t\tqty match {\n\t\t\tcase 0 => \"no more bottles of beer\" + f\n\t\t\tcase 1 => \"1 bottle of beer\" + f\n\t\t\tcase x => x + \" bottles of beer\" + f\n\t\t}\n\n\tdef beers(qty : Int) = bottles(qty, \" on the wall.\")\n\n\tdef sing(qty : Int)(implicit song : String) : String = {\n\t\tdef takeOne =\n\t\t\tqty match {\n\t\t\t\tcase 0 => \"Go to the store and buy some more.\"\n\t\t\t\tcase x => \"Take one down and pass it around.\"\n\t\t\t}\n\n\t\tdef nextQty = // nested functions\n\t\t\tif (qty == 0) 99\n\t\t\telse qty - 1\n\n\t\tdef refrain = {\n\t\t\tbeers(qty).capitalize + \" \" + bottles(qty, \"\") + \".\\n\" +\n\t\t\ttakeOne + \" \" + beers(nextQty) + \"\\n\\n\"\n\t\t}\n\n\t\tif (qty == -1) song\n\t\telse sing(qty - 1)(song + refrain) // tail recursion\n\t}\n\n\timplicit val headOfSong : String = \"\"\n\n\tprintln(sing(99)) // implicit parameter\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scala/build.sbt",
    "content": "// set the name of the project\nname := \"My Project\"\n\nversion := \"1.0\"\n\norganization := \"org.myproject\"\n\n// add a test dependency on ScalaCheck\nlibraryDependencies += \"org.scala-tools.testing\" %% \"scalacheck\" % \"1.8\" % \"test\"\n\n// add compile dependencies on some dispatch modules\nlibraryDependencies ++= Seq(\n                    \"net.databinder\" %% \"dispatch-meetup\" % \"0.7.8\",\n                    \"net.databinder\" %% \"dispatch-twitter\" % \"0.7.8\"\n)\n\n// Set a dependency based partially on a val.\n{\n  val libosmVersion = \"2.5.2-RC1\"\n  libraryDependencies += \"net.sf.travelingsales\" % \"osmlib\" % libosmVersion from \"http://downloads.sourceforge.net/project/travelingsales/libosm/\"+libosmVersion+\"/libosm-\"+libosmVersion+\".jar\"\n}\n\n// reduce the maximum number of errors shown by the Scala compiler\nmaxErrors := 20\n\n// increase the time between polling for file changes when using continuous execution\npollInterval := 1000\n\n// append several options to the list of options passed to the Java compiler\njavacOptions ++= Seq(\"-source\", \"1.5\", \"-target\", \"1.5\")\n\n// append -deprecation to the options passed to the Scala compiler\nscalacOptions += \"-deprecation\"\n\n// set the Scala version used for the project\nscalaVersion := \"2.9.0-SNAPSHOT\"\n\n// define the statements initially evaluated when entering 'console', 'console-quick', or 'console-project'\ninitialCommands := \"\"\"\n  import System.{currentTimeMillis => now}\n  def time[T](f: => T): T = {\n    val start = now\n    try { f } finally { println(\"Elapsed: \" + (now - start)/1000.0 + \" s\") }\n  }\n\"\"\"\n\n// set the initial commands when entering 'console' only\ninitialCommands in console := \"import myproject._\"\n\n// set the main class for packaging the main jar\n// 'run' will still auto-detect and prompt\n// change Compile to Test to set it for the test jar\nmainClass in (Compile, packageBin) := Some(\"myproject.MyMain\")\n\n// set the main class for the main 'run' task\n// change Compile to Test to set it for 'test:run'\nmainClass in (Compile, run) := Some(\"myproject.MyMain\")\n\n// add <base>/input to the files that '~' triggers on\nwatchSources <+= baseDirectory map { _ / \"input\" }\n\n// add a maven-style repository\nresolvers += \"name\" at \"url\"\n\n// add a sequence of maven-style repositories\nresolvers ++= Seq(\"name\" at \"url\")\n\n// define the repository to publish to\npublishTo := Some(\"name\" at \"url\")\n\n// set Ivy logging to be at the highest level\nivyLoggingLevel := UpdateLogging.Full\n\n// disable updating dynamic revisions (including -SNAPSHOT versions)\noffline := true\n\n// set the prompt (for this build) to include the project id.\nshellPrompt in ThisBuild := { state => Project.extract(state).currentRef.project + \"> \" }\n\n// set the prompt (for the current project) to include the username\nshellPrompt := { state => System.getProperty(\"user.name\") + \"> \" }\n\n// disable printing timing information, but still print [success]\nshowTiming := false\n\n// disable printing a message indicating the success or failure of running a task\nshowSuccess := false\n\n// change the format used for printing task completion time\ntimingFormat := {\n             import java.text.DateFormat\n             DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT)\n}\n\n// disable using the Scala version in output paths and artifacts\ncrossPaths := false\n\n// fork a new JVM for 'run' and 'test:run'\nfork := true\n\n// fork a new JVM for 'test:run', but not 'run'\nfork in Test := true\n\n// add a JVM option to use when forking a JVM for 'run'\njavaOptions += \"-Xmx2G\"\n\n// only use a single thread for building\nparallelExecution := false\n\n// Execute tests in the current project serially\n//   Tests from other projects may still run concurrently.\nparallelExecution in Test := false\n\n// set the location of the JDK to use for compiling Java code.\n// if 'fork' is true, this is used for 'run' as well\njavaHome := Some(file(\"/usr/lib/jvm/sun-jdk-1.6\"))\n\n// Use Scala from a directory on the filesystem instead of retrieving from a repository\nscalaHome := Some(file(\"/home/user/scala/trunk/\"))\n\n// don't aggregate clean (See FullConfiguration for aggregation details)\naggregate in clean := false\n\n// only show warnings and errors on the screen for compilations.\n//  this applies to both test:compile and compile and is Info by default\nlogLevel in compile := Level.Warn\n\n// only show warnings and errors on the screen for all tasks (the default is Info)\n//  individual tasks can then be more verbose using the previous setting\nlogLevel := Level.Warn\n\n// only store messages at info and above (the default is Debug)\n//   this is the logging level for replaying logging with 'last'\npersistLogLevel := Level.Debug\n\n// only show 10 lines of stack traces\ntraceLevel := 10\n\n// only show stack traces up to the first sbt stack frame\ntraceLevel := 0\n\n// add SWT to the unmanaged classpath\nunmanagedJars in Compile += file(\"/usr/share/java/swt.jar\")\n\n// publish test jar, sources, and docs\npublishArtifact in Test := true\n\n// disable publishing of main docs\npublishArtifact in (Compile, packageDoc) := false\n\n// change the classifier for the docs artifact\nartifactClassifier in packageDoc := Some(\"doc\")\n\n// Copy all managed dependencies to <build-root>/lib_managed/\n//   This is essentially a project-local cache and is different\n//   from the lib_managed/ in sbt 0.7.x.  There is only one\n//   lib_managed/ in the build root (not per-project).\nretrieveManaged := true\n\n/* Specify a file containing credentials for publishing. The format is:\nrealm=Sonatype Nexus Repository Manager\nhost=nexus.scala-tools.org\nuser=admin\npassword=admin123\n*/\ncredentials += Credentials(Path.userHome / \".ivy2\" / \".credentials\")\n\n// Directly specify credentials for publishing.\ncredentials += Credentials(\"Sonatype Nexus Repository Manager\", \"nexus.scala-tools.org\", \"admin\", \"admin123\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scala/car-ride.kojo",
    "content": "// Kojo examples (files ending in .kojo) are licensed under The MIT License:\n\n// Copyright (C) 2009-2018 Lalit Pant <pant.lalit@gmail.com> and the Kojo Dev Team.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n// Use the four arrow keys to avoid the blue cars\n// You gain energy every second, and lose energy for every collision\n// You lose if your energy drops below zero, or you hit the edges of the screen\n// You win if you stay alive for a minute\nswitchToDefault2Perspective()\nval carHeight = 100\nval markerHeight = 80\n// The collision polygon for the (very similarly sized) car images car1.png and car2.png\nval carE = trans(2, 14) -> Picture {\n    repeat(2) {\n        forward(70); right(45); forward(20); right(45)\n        forward(18); right(45); forward(20); right(45)\n    }\n}\ndef car(img: String) = PicShape.image(img, carE)\n\nval cars = collection.mutable.Map.empty[Picture, Vector2D]\nval carSpeed = 3\nval pResponse = 3\nvar pVel = Vector2D(0, 0)\nvar disabledTime = 0L\n\nval bplayer = newMp3Player\nval cplayer = newMp3Player\n\ndef createCar() {\n    val c = trans(cb.x + random(cb.width.toInt), cb.y + cb.height) -> car(\"/media/car-ride/car2.png\")\n    draw(c)\n    cars += c -> Vector2D(0, -carSpeed)\n}\nval markers = collection.mutable.Set.empty[Picture]\ndef createMarker() {\n    val mwidth = 20\n    val m = fillColor(white) * penColor(white) *\n        trans(cb.x + cb.width / 2 - mwidth / 2, cb.y + cb.height) -> PicShape.rect(markerHeight, mwidth)\n    draw(m)\n    markers += m\n}\n\ncleari()\ndrawStage(darkGray)\nval cb = canvasBounds\nval player = car(\"/media/car-ride/car1.png\")\ndraw(player)\ndrawAndHide(carE)\n\ntimer(1200) {\n    createMarker()\n    createCar()\n}\n\nanimate {\n    player.moveToFront()\n    val enabled = epochTimeMillis - disabledTime > 300\n    if (enabled) {\n        if (isKeyPressed(Kc.VK_LEFT)) {\n            pVel = Vector2D(-pResponse, 0)\n            player.transv(pVel)\n        }\n        if (isKeyPressed(Kc.VK_RIGHT)) {\n            pVel = Vector2D(pResponse, 0)\n            player.transv(pVel)\n        }\n        if (isKeyPressed(Kc.VK_UP)) {\n            pVel = Vector2D(0, pResponse)\n            player.transv(pVel)\n            if (!isMp3Playing) {\n                playMp3Sound(\"/media/car-ride/car-accel.mp3\")\n            }\n        }\n        else {\n            stopMp3()\n        }\n        if (isKeyPressed(Kc.VK_DOWN)) {\n            pVel = Vector2D(0, -pResponse)\n            player.transv(pVel)\n            if (!bplayer.isMp3Playing) {\n                bplayer.playMp3Sound(\"/media/car-ride/car-brake.mp3\")\n            }\n        }\n        else {\n            bplayer.stopMp3()\n        }\n    }\n    else {\n        player.transv(pVel)\n    }\n\n    if (player.collidesWith(stageLeft) || player.collidesWith(stageRight)) {\n        cplayer.playMp3Sound(\"/media/car-ride/car-crash.mp3\")\n        player.setOpacity(0.5)\n        drawMessage(\"You Crashed!\", red)\n        stopAnimation()\n    }\n    else if (player.collidesWith(stageTop)) {\n        pVel = Vector2D(0, -pResponse)\n        player.transv(pVel * 2)\n        disabledTime = epochTimeMillis\n    }\n    else if (player.collidesWith(stageBot)) {\n        pVel = Vector2D(0, pResponse)\n        player.transv(pVel * 2)\n        disabledTime = epochTimeMillis\n    }\n\n    cars.foreach { cv =>\n        val (c, vel) = cv\n        c.moveToFront()\n        if (player.collidesWith(c)) {\n            cplayer.playMp3Sound(\"/media/car-ride/car-crash.mp3\")\n            pVel = bouncePicVectorOffPic(player, pVel - vel, c) / 2\n            player.transv(pVel * 3)\n            c.transv(-pVel * 3)\n            disabledTime = epochTimeMillis\n            updateEnergyCrash()\n        }\n        else {\n            val newVel = Vector2D(vel.x + randomDouble(1) / 2 - 0.25, vel.y)\n            cars += c -> newVel\n            c.transv(newVel)\n        }\n        if (c.position.y + carHeight < cb.y) {\n            c.erase()\n            cars -= c\n        }\n    }\n    markers.foreach { m =>\n        m.translate(0, -carSpeed * 2)\n        if (m.position.y + markerHeight < cb.y) {\n            m.erase()\n            markers -= m\n        }\n    }\n}\n\nvar energyLevel = 0\ndef energyText = s\"Energy: $energyLevel\"\nval energyLabel = trans(cb.x + 10, cb.y + cb.height - 10) -> PicShape.textu(energyText, 20, blue)\ndef updateEnergyTick() {\n    energyLevel += 2\n    energyLabel.update(energyText)\n}\ndef updateEnergyCrash() {\n    energyLevel -= 10\n    energyLabel.update(energyText)\n    if (energyLevel < 0) {\n        drawMessage(\"You're out of energy! You Lose\", red)\n        stopAnimation()\n    }\n}\n\ndef drawMessage(m: String, c: Color) {\n    val te = textExtent(m, 30)\n    val pic = penColor(c) * trans(cb.x + (cb.width - te.width) / 2, 0) -> PicShape.text(m, 30)\n    draw(pic)\n}\n\ndef manageGameScore() {\n    var gameTime = 0\n    val timeLabel = trans(cb.x + 10, cb.y + 50) -> PicShape.textu(gameTime, 20, blue)\n    draw(timeLabel)\n    draw(energyLabel)\n    timeLabel.forwardInputTo(stageArea)\n\n    timer(1000) {\n        gameTime += 1\n        timeLabel.update(gameTime)\n        updateEnergyTick()\n\n        if (gameTime == 60) {\n            drawMessage(\"Time up! You Win\", green)\n            stopAnimation()\n        }\n    }\n}\n\nmanageGameScore()\nplayMp3Loop(\"/media/car-ride/car-move.mp3\")\nactivateCanvas()\n\n// Car images, via google images, from http://motor-kid.com/race-cars-top-view.html \n// and www.carinfopic.com\n// Car sounds from http://soundbible.com\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scala/fib-tree.kojo",
    "content": "// Kojo examples (files ending in .kojo) are licensed under The MIT License:\n\n// Copyright (C) 2009-2018 Lalit Pant <pant.lalit@gmail.com> and the Kojo Dev Team.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n\n// Example from http://lalitpant.blogspot.in/2012/05/recursive-drawing-with-kojo.html\n// This example is based on Kojo Pictures\nval size = 100\ndef S = Picture {\n    repeat (4) {\n        forward(size)\n        right()\n    }\n}\n\ndef stem = scale(0.13, 1) * penColor(noColor) * fillColor(black) -> S\n\nclear()\nsetBackground(Color(255, 170, 29))\ninvisible()\n\ndef drawing(n: Int): Picture = {\n    if (n == 1) \n        stem\n    else \n        GPics(stem,\n              trans(2, size-5) * brit(0.05) -> GPics(\n                rot(25) * scale(0.72) -> drawing(n-1),\n                rot(25) * trans(0, size * 0.72) * rot(-75) * scale(0.55) -> drawing(n-1)\n            )\n        )\n}\n\nval pic = trans(0, -100) -> drawing(10)\ndraw(pic)"
  },
  {
    "path": "src/test/resources/samples/langs/Scala/node11.sc",
    "content": "import math.random\nimport scala.language.postfixOps\nimport scala.util._\nimport scala.util.{Try, Success, Failure}\nimport scala.concurrent._\nimport duration._\nimport ExecutionContext.Implicits.global\nimport scala.concurrent.{ ExecutionContext, CanAwait, OnCompleteRunnable, TimeoutException, ExecutionException, blocking }\n/* This worksheet demonstrates some of the code snippets from\n* Week3, Lecture 4, \"Composing Futures\".\n*/\n\n\nobject node11 {\n  println(\"Welcome to the Scala worksheet\")       //> Welcome to the Scala worksheet\n\n  /**\n  * Retry successfully completing block at most noTimes\n  * and give up after that\n  */\n\n   def retry[T](n: Int)(block: =>Future[T]): Future[T] = {\n    val ns: Iterator[Int] = (1 to n).iterator\n    val attempts: Iterator[()=>Future[T]] = ns.map(_ => ()=>block)\n    val failed: Future[T] = Future.failed(new Exception)\n    attempts.foldLeft(failed)((a, block) => a fallbackTo { block() })\n  }                                               //> retry: [T](n: Int)(block: => scala.concurrent.Future[T])scala.concurrent.Fut\n                                                  //| ure[T]\n  def rb(i: Int) = {\n    blocking{Thread.sleep(100*random.toInt)}\n    println(\"Hi \" ++ i.toString)\n    i + 10\n  }                                               //> rb: (i: Int)Int\n  def block(i: Int) = {\n    println(\"Iteration: \" + i.toString)\n\n    val ri = retry(i)( Future {rb(i)} )\n\n    ri onComplete {\n      case Success(s) => println(s.toString  ++ \" = 10 + \" ++ i.toString)\n      case Failure(t:Exception) => println(t.toString  ++ \" \" ++ i.toString)\n      case r => println(r.toString  ++ \" \" ++ i.toString)\n    }\n\n\t}                                         //> block: (i: Int)Unit\n  /* Multiple executions of a block of commands where\n   * each block contains one collectCoins and\n   * one buyTreasure. If either call fails, the whole iteration does not fail,\n   * because we are catching exceptions (with flatMap) in this implementation.\n   * Note that these blocks execute synchrounsly.\n   */\n  (0 to 4 toList).foreach(i =>block(i))           //> Iteration: 0\n                                                  //| Iteration: 1\n                                                  //| java.lang.Exception 0\n                                                  //| Hi 1\n                                                  //| Iteration: 2\n                                                  //| 11 = 10 + 1\n                                                  //| Hi 2\n                                                  //| Iteration: 3\n                                                  //| Hi 3\n                                                  //| Hi 2\n                                                  //| Iteration: 4\n                                                  //| 12 = 10 + 2\n    blocking{Thread.sleep(3000)}                  //> Hi 4\n                                                  //| Hi 3\n                                                  //| 13 = 10 + 3\n                                                  //| Hi 3\n                                                  //| 14 = 10 + 4\n                                                  //| Hi 4\n                                                  //| Hi 4\n                                                  //| Hi 4-\n\n\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scala/scala",
    "content": "#!/bin/sh\nexec scala \"$0\" \"$@\"\n!#\n\nobject HelloWorld {\n  def main(args: Array[String]) {\n    println(\"Hello, world!\")\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scala/turtle-controller.kojo",
    "content": "// Kojo examples (files ending in .kojo) are licensed under The MIT License:\n\n// Copyright (C) 2009-2018 Lalit Pant <pant.lalit@gmail.com> and the Kojo Dev Team.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n// Run this program to get basic control over the turtle via some buttons\n// Useful for smaller kids\n\n// Change these value to tweak the behavior of the buttons\nval fdStep = 50\nval fdStep2 = 10\nval rtStep = 90\nval rtStep2 = 10\nval bgColor = white\nval sBgColor = \"white\"\n// End tweak region\n\nclear()\nclearOutput()\nbeamsOn()\nval width = canvasBounds.width\nval height = canvasBounds.height\n\nsetBackground(bgColor)\nsetPenColor(purple)\n\ndef action(code: String) {\n    interpret(code); println(code)\n}\n\nval cmd = Map(\n    \"forward1\" -> s\"forward($fdStep)\",\n    \"forward2\" -> s\"forward($fdStep2)\",\n    \"hop1\" -> s\"hop($fdStep)\",\n    \"hop2\" -> s\"hop($fdStep2)\",\n    \"right1\" -> s\"right($rtStep)\",\n    \"right2\" -> s\"right($rtStep2)\",\n    \"left1\" -> s\"left($rtStep)\",\n    \"left2\" -> s\"left($rtStep2)\"\n)\n\ndef eraseCmds(n: Int) =\n    s\"saveStyle(); setPenColor($sBgColor); setPenThickness(4); back($n); restoreStyle()\"\n\ndef button(forcmd: String) = PicShape.button(cmd(forcmd)) { action(cmd(forcmd)) }\n\nval panel = trans(-width / 2, -height / 2) * scale(1.4) -> VPics(\n    HPics(\n        button(\"left2\"),\n        button(\"forward2\"),\n        button(\"right2\"),\n        button(\"hop2\"),\n        PicShape.button(s\"erase($fdStep2)\") { action(eraseCmds(fdStep2)) }\n    ),\n    HPics(\n        button(\"left1\"),\n        button(\"forward1\"),\n        button(\"right1\"),\n        button(\"hop1\"),\n        PicShape.button(s\"erase($fdStep)\") { action(eraseCmds(fdStep)) }\n    )\n)\n\ndraw(panel)\nprintln(\"// Paste the generated program below into the script editor\")\nprintln(\"// and run it -- to reproduce your drawing\")\nprintln(\"clear()\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scaml/hello.scaml",
    "content": "%p\n  Hello,\n  World!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scheme/asteroids.sps",
    "content": "(import (rnrs)\n        (only (surfage s1 lists) filter-map)\n        (gl)\n        (glut)\n        (dharmalab records define-record-type)\n        (dharmalab math basic)\n        (agave glu compat)\n        (agave geometry pt)\n        (agave glamour window)\n        (agave glamour misc)\n        (surfage s19 time)\n        (surfage s27 random-bits)\n        (surfage s42 eager-comprehensions))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; utilities\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define (say . args)\n  (for-each display args)\n  (newline))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define (gl-translate-pt p)\n  (glTranslated (pt-x p) (pt-y p) 0.0))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define (radians x) (* x (/ pi 180)))\n\n(define (degrees x) (* x (/ 180 pi)))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define (angle->pt a)\n  (pt (cos a)\n      (sin a)))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define (current-time-in-nanoseconds)\n  (let ((val (current-time)))\n    (+ (* (time-second val) 1000000000)\n       (time-nanosecond val))))\n\n(define (current-time-in-seconds)\n  (/ (current-time-in-nanoseconds)\n     1000.0 ;; micro\n     1000.0 ;; milli\n     1000.0))\n\n(define base-time (current-time-in-seconds))\n\n(define (time-step) (- (current-time-in-seconds) base-time))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define score 0)\n\n(define level 1)\n\n(define ships 3)\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; spaceship\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define-record-type++ spaceship\n  (fields (mutable pos)\n          (mutable vel)\n          (mutable theta)\n          (mutable force)))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; particle\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define-record-type++ particle\n  (fields (mutable pos)\n          (mutable vel)\n          (mutable birth)\n          (mutable lifetime)\n          (mutable color)))\n\n(define particles '())\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; bullet\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define-record-type++ bullet\n  (fields (mutable pos)\n          (mutable vel)\n          (mutable birth)))\n\n(define bullets '())\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; asteroid\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define-record-type++ asteroid\n  (fields (mutable pos)\n          (mutable vel)\n          (mutable radius)))\n\n(define number-of-starting-asteroids 4)\n\n(define asteroids #f)\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; bullet-pack\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define-record-type++ bullet-pack\n  (fields (mutable pos)\n          (mutable vel)))\n\n(define pack #f)\n\n(is-bullet-pack pack)\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(initialize-glut)\n\n(window (size 800 400)\n        (title \"Asteroids\")\n        (reshape (width height)))\n\n(random-source-randomize! default-random-source)\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define (pt-wrap p)\n  (pt (mod (pt-x p) width)\n      (mod (pt-y p) height)))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define ship\n  (make-spaceship (pt (/ width 2.0) (/ height 2.0))\n                  (pt 0.0 0.0)\n                  0.0\n                  0.0))\n\n(is-spaceship ship)\n\n(define ammo 0)\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(set! asteroids\n      (list-ec (: i number-of-starting-asteroids)\n        (make-asteroid (pt (inexact (random-integer width))\n                           (inexact (random-integer height)))\n                       (pt (inexact (+ -50 (random-integer 100)))\n                           (inexact (+ -50 (random-integer 100))))\n                       50.0)))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(set! pack (make-bullet-pack (pt (inexact (random-integer width))\n                                 (inexact (random-integer height)))\n                             (pt (inexact (+ -50 (random-integer 100)))\n                                 (inexact (+ -50 (random-integer 100))))))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(buffered-display-procedure\n (lambda ()\n   (background 0.0)\n\n   ;; ship\n\n   (glColor3f 0.0 1.0 0.0)\n\n   (gl-matrix-excursion\n    (gl-translate-pt ship.pos)\n    (glRotated 90.0 0.0 1.0 0.0)\n    (glRotated (degrees ship.theta) -1.0 0.0 0.0)\n    (glutWireCone 10.0 30.0 5 5))\n\n   ;; particles\n\n   (for-each\n    (lambda (par)\n\n      (let ((c (particle-color par)))\n        (glColor3f (vector-ref c 0)\n                   (vector-ref c 1)\n                   (vector-ref c 2)))\n      \n      (gl-matrix-excursion\n       (gl-translate-pt (particle-pos par))\n       (glutWireSphere 2.0 5 5)))\n    particles)\n\n   ;; bullets\n\n   (glColor3f 0.0 0.0 1.0)\n   \n   (for-each\n    (lambda (bullet)\n      (gl-matrix-excursion\n       (gl-translate-pt (bullet-pos bullet))\n       (glutWireSphere 5.0 10 10)))\n    bullets)\n\n   ;; asteroids\n\n   (glColor3f 1.0 0.0 0.0)\n\n   (for-each\n    (lambda (asteroid)\n      (gl-matrix-excursion\n       (gl-translate-pt (asteroid-pos asteroid))\n       (glutWireSphere (asteroid-radius asteroid) 10 10)))\n    asteroids)\n\n   ;; bullet-pack\n\n   (glColor3f 0.0 0.0 1.0)\n\n   (gl-matrix-excursion\n    (gl-translate-pt pack.pos)\n    (glutWireCube 10.0))\n\n   ))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(define last-time (current-time-in-seconds))\n\n(define dt 0)\n\n(define (update-system)\n\n  (set! dt (- (current-time-in-seconds) last-time))\n\n  (set! last-time (current-time-in-seconds))\n\n  (ship.pos! (pt-wrap (pt+ ship.pos (pt*n ship.vel dt))))\n\n  (pack.pos! (pt-wrap (pt+ pack.pos (pt*n pack.vel dt))))\n\n  (set! particles\n        (filter-map\n         (lambda (par)\n           (is-particle par)\n           (cond ((> (- (current-time-in-seconds) par.birth) par.lifetime) #f)\n                 (else (par.pos! (pt+ par.pos (pt*n par.vel dt)))\n                       par)))\n         particles))\n\n  (set! bullets\n        (filter-map\n         (lambda (bullet)\n           (is-bullet bullet)\n           (cond ((> (- (current-time-in-seconds) bullet.birth) 2.0) #f)\n                 (else (bullet.pos! (pt+ bullet.pos (pt*n bullet.vel dt)))\n                       bullet)))\n         bullets))\n\n  (set! asteroids\n        (filter-map\n         (lambda (a)\n           (is-asteroid a)\n           (a.pos! (pt-wrap (pt+ a.pos (pt*n a.vel dt))))\n           (if (< a.radius 10.0) #f a))\n         asteroids))\n\n  ;; bullet asteroid contact\n\n  (for-each\n   (lambda (b)\n     (is-bullet b)\n     (for-each\n      (lambda (a)\n        (is-asteroid a)\n        (when (<= (pt-distance b.pos a.pos)\n                  a.radius)\n          \n          (begin (set! score (+ score 1))\n                 (say \"score: \" score)\n                 #f)\n          \n          (set! asteroids\n                (append \n                 (list-ec (: i 4)\n                   (make-asteroid a.pos\n                                  (pt (+ -50.0 (random-integer 100))\n                                      (+ -50.0 (random-integer 100)))\n                                  (/ a.radius 2.0)))\n                 asteroids))\n          (a.radius! 0.1)\n          (b.birth! 0.0)\n\n          (set! particles\n                (append (list-ec (: i 100)\n                          (make-particle a.pos\n                                         (pt*n (angle->pt\n                                                (radians\n                                                 (random-integer 360)))\n\n                                               (random-integer 100)\n\n                                               )\n                                         (current-time-in-seconds)\n                                         1.0\n                                         (vector 1.0 1.0 1.0)))\n                        particles))))\n      asteroids))\n   bullets)\n\n  (for-each\n   (lambda (a)\n     (is-asteroid a)\n     (when (<= (pt-distance a.pos ship.pos) a.radius)\n\n       (set! particles\n             (append (list-ec (: i 100)\n                       (make-particle ship.pos\n                                      (pt*n (angle->pt\n                                             (radians\n                                              (random-integer 360)))\n                                            (random-integer 100))\n                                      (current-time-in-seconds)\n                                      1.0\n                                      (vector 0.0 1.0 1.0)))\n                     particles))\n\n       (set! ship (make-spaceship (pt (/ width 2.0) (/ height 2.0))\n                                  (pt 0.0 0.0)\n                                  0.0\n                                  0.0))\n\n       ))\n   asteroids)\n\n  (when (null? asteroids)\n    (set! level (+ level 1))\n    (display \"level: \")\n    (display level)\n    (newline)\n    (set! asteroids\n          (list-ec (: i (+ number-of-starting-asteroids level))\n            (make-asteroid (pt (inexact (random-integer width))\n                               (inexact (random-integer height)))\n                           (pt (inexact (+ -50 (random-integer 100)))\n                               (inexact (+ -50 (random-integer 100))))\n                           50.0))))\n\n  ;; ship pack contact\n\n  (when (<= (pt-distance ship.pos pack.pos) 10.0)\n    (set! ammo (+ ammo 5))\n    (set! pack (make-bullet-pack (pt (inexact (random-integer width))\n                                     (inexact (random-integer height)))\n                                 (pt (inexact (+ -50 (random-integer 100)))\n                                     (inexact (+ -50 (random-integer 100))))))\n    (say \"ammo: \" ammo))\n\n  )\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(glutIdleFunc\n (lambda ()\n   (update-system)\n   (glutPostRedisplay)))\n\n(glutKeyboardFunc\n (lambda (key x y)\n   (case (integer->char key)\n\n     ((#\\w)\n\n      (ship.vel! (pt+ ship.vel (pt*n (angle->pt ship.theta) 50.0)))\n\n      (set! particles\n            (append (list-ec (: i 10)\n                      (make-particle ship.pos\n                                     (pt*n\n                                      (angle->pt\n                                       (+ ship.theta\n                                          (radians 180.0)\n                                          (radians (+ -45 (random-integer 90)))\n                                          ))\n                                      (random-integer 50)\n                                      )\n                                     (current-time-in-seconds)\n                                     1.0\n                                     (vector 1.0 1.0 0.0)))\n                    particles))\n\n      )\n\n     ((#\\a) (ship.theta! (+ ship.theta (radians 20.0))))\n     ((#\\d) (ship.theta! (- ship.theta (radians 20.0))))\n\n     ((#\\s) (ship.vel! (pt 0.0 0.0)))\n\n     ((#\\x) (ship.theta! (+ ship.theta (radians 180.0))))\n\n     ((#\\space)\n\n      (when (> ammo 0)\n\n        (set! ammo (- ammo 1))\n      \n        (set! bullets\n              (cons\n               (make-bullet ship.pos\n                            (pt+ ship.vel\n                                 (pt*n (angle->pt ship.theta) 400.0))\n                            (current-time-in-seconds))\n               bullets)))\n\n      (say \"ammo: \" ammo)\n      )\n     )))\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(say \"w   - Thrusters\")\n(say \"a/d - Left/Right\")\n(say \"s   - Stop\")\n(say \"x   - Flip\")\n(say \"spc - Laser\")\n\n;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(glutMainLoop)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scheme/basic.sld",
    "content": "(define-library (libs basic)\n    (export list2 x)\n    (begin\n        (define (list2 . objs)  objs)\n        (define x 'libs-basic)\n        (define not-exported 'should-not-be-exported)\n        ))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scheme/lambdastar.sls",
    "content": "(library (lambdastar)\n  (export (rename (lambda* lambda)))\n  (import (rnrs))\n\n(define-syntax lambda*\n  (syntax-rules ()\n    ((_ a* e* ...)\n     ( lambda*-h a* (let () e* ...)))))\n  \n(define-syntax lambda*-h\n  (syntax-rules ()\n    ((_ () e)\n     (lambda a* (if (null? a*) e (apply (e) a*))))\n    ((_ (a a* ...) e) (posary-h (a a* ...) e))\n    ((_ (a a* ... . rest) e)\n     (polyvariadic-h (a a* ... . rest) e))\n    ((_ a* e) (lambda a* e))))\n\n(define-syntax posary-h\n  (syntax-rules ()\n    ((_ (a a* ...) e)\n     (letrec\n         ((rec\n           (case-lambda\n               (() rec)\n             ((a a* ...) e)\n             ((a a* ... . rest)\n              (apply (rec a a* ...) rest))\n             (some (get-more rec some)))))\n       rec))))\n\n(define-syntax polyvariadic-h\n  (syntax-rules ()\n    ((_ (a a* ... . rest) e)\n     (letrec\n       ((rec\n         (case-lambda\n           (() rec)\n           ((a a* ... . rest) e)\n           (some (get-more rec some)))))\n       rec))))\n\n(define get-more\n  (lambda (rec some)\n     (lambda more \n       (apply rec (append some more))))))"
  },
  {
    "path": "src/test/resources/samples/langs/Scheme/sboyer.sch",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; File:         sboyer.sch\n; Description:  The Boyer benchmark\n; Author:       Bob Boyer\n; Created:      5-Apr-85\n; Modified:     10-Apr-85 14:52:20 (Bob Shaw)\n;               22-Jul-87 (Will Clinger)\n;               2-Jul-88 (Will Clinger -- distinguished #f and the empty list)\n;               13-Feb-97 (Will Clinger -- fixed bugs in unifier and rules,\n;                          rewrote to eliminate property lists, and added\n;                          a scaling parameter suggested by Bob Boyer)\n;               19-Mar-99 (Will Clinger -- cleaned up comments)\n;               4-Apr-01 (Will Clinger -- changed four 1- symbols to sub1)\n; Language:     Scheme\n; Status:       Public Domain\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;;; SBOYER -- Logic programming benchmark, originally written by Bob Boyer.\n;;; Much less CONS-intensive than NBOYER because it uses Henry Baker's\n;;; \"sharing cons\".\n\n; Note:  The version of this benchmark that appears in Dick Gabriel's book\n; contained several bugs that are corrected here.  These bugs are discussed\n; by Henry Baker, \"The Boyer Benchmark Meets Linear Logic\", ACM SIGPLAN Lisp\n; Pointers 6(4), October-December 1993, pages 3-10.  The fixed bugs are:\n;\n;    The benchmark now returns a boolean result.\n;    FALSEP and TRUEP use TERM-MEMBER? rather than MEMV (which is called MEMBER\n;         in Common Lisp)\n;    ONE-WAY-UNIFY1 now treats numbers correctly\n;    ONE-WAY-UNIFY1-LST now treats empty lists correctly\n;    Rule 19 has been corrected (this rule was not touched by the original\n;         benchmark, but is used by this version)\n;    Rules 84 and 101 have been corrected (but these rules are never touched\n;         by the benchmark)\n;\n; According to Baker, these bug fixes make the benchmark 10-25% slower.\n; Please do not compare the timings from this benchmark against those of\n; the original benchmark.\n;\n; This version of the benchmark also prints the number of rewrites as a sanity\n; check, because it is too easy for a buggy version to return the correct\n; boolean result.  The correct number of rewrites is\n;\n;     n      rewrites       peak live storage (approximate, in bytes)\n;     0         95024\n;     1        591777\n;     2       1813975\n;     3       5375678\n;     4      16445406\n;     5      51507739\n\n; Sboyer is a 2-phase benchmark.\n; The first phase attaches lemmas to symbols.  This phase is not timed,\n; but it accounts for very little of the runtime anyway.\n; The second phase creates the test problem, and tests to see\n; whether it is implied by the lemmas.\n\n(define (sboyer-benchmark . args)\n  (let ((n (if (null? args) 0 (car args))))\n    (setup-boyer)\n    (run-benchmark (string-append \"sboyer\"\n                                  (number->string n))\n                   1\n                   (lambda () (test-boyer n))\n                   (lambda (rewrites)\n                     (and (number? rewrites)\n                          (case n\n                           ((0)  (= rewrites 95024))\n                           ((1)  (= rewrites 591777))\n                           ((2)  (= rewrites 1813975))\n                           ((3)  (= rewrites 5375678))\n                           ((4)  (= rewrites 16445406))\n                           ((5)  (= rewrites 51507739))\n                           ; If it works for n <= 5, assume it works.\n                           (else #t)))))))\n\n(define (setup-boyer) #t) ; assigned below\n(define (test-boyer) #t)  ; assigned below\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;\n; The first phase.\n;\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n; In the original benchmark, it stored a list of lemmas on the\n; property lists of symbols.\n; In the new benchmark, it maintains an association list of\n; symbols and symbol-records, and stores the list of lemmas\n; within the symbol-records.\n\n(let ()\n  \n  (define (setup)\n    (add-lemma-lst\n     (quote ((equal (compile form)\n                    (reverse (codegen (optimize form)\n                                      (nil))))\n             (equal (eqp x y)\n                    (equal (fix x)\n                           (fix y)))\n             (equal (greaterp x y)\n                    (lessp y x))\n             (equal (lesseqp x y)\n                    (not (lessp y x)))\n             (equal (greatereqp x y)\n                    (not (lessp x y)))\n             (equal (boolean x)\n                    (or (equal x (t))\n                        (equal x (f))))\n             (equal (iff x y)\n                    (and (implies x y)\n                         (implies y x)))\n             (equal (even1 x)\n                    (if (zerop x)\n                        (t)\n                        (odd (sub1 x))))\n             (equal (countps- l pred)\n                    (countps-loop l pred (zero)))\n             (equal (fact- i)\n                    (fact-loop i 1))\n             (equal (reverse- x)\n                    (reverse-loop x (nil)))\n             (equal (divides x y)\n                    (zerop (remainder y x)))\n             (equal (assume-true var alist)\n                    (cons (cons var (t))\n                          alist))\n             (equal (assume-false var alist)\n                    (cons (cons var (f))\n                          alist))\n             (equal (tautology-checker x)\n                    (tautologyp (normalize x)\n                                (nil)))\n             (equal (falsify x)\n                    (falsify1 (normalize x)\n                              (nil)))\n             (equal (prime x)\n                    (and (not (zerop x))\n                         (not (equal x (add1 (zero))))\n                         (prime1 x (sub1 x))))\n             (equal (and p q)\n                    (if p (if q (t)\n                                (f))\n                          (f)))\n             (equal (or p q)\n                    (if p (t)\n                          (if q (t)\n                                (f))))\n             (equal (not p)\n                    (if p (f)\n                          (t)))\n             (equal (implies p q)\n                    (if p (if q (t)\n                                (f))\n                          (t)))\n             (equal (fix x)\n                    (if (numberp x)\n                        x\n                        (zero)))\n             (equal (if (if a b c)\n                        d e)\n                    (if a (if b d e)\n                          (if c d e)))\n             (equal (zerop x)\n                    (or (equal x (zero))\n                        (not (numberp x))))\n             (equal (plus (plus x y)\n                          z)\n                    (plus x (plus y z)))\n             (equal (equal (plus a b)\n                           (zero))\n                    (and (zerop a)\n                         (zerop b)))\n             (equal (difference x x)\n                    (zero))\n             (equal (equal (plus a b)\n                           (plus a c))\n                    (equal (fix b)\n                           (fix c)))\n             (equal (equal (zero)\n                           (difference x y))\n                    (not (lessp y x)))\n             (equal (equal x (difference x y))\n                    (and (numberp x)\n                         (or (equal x (zero))\n                             (zerop y))))\n             (equal (meaning (plus-tree (append x y))\n                             a)\n                    (plus (meaning (plus-tree x)\n                                   a)\n                          (meaning (plus-tree y)\n                                   a)))\n             (equal (meaning (plus-tree (plus-fringe x))\n                             a)\n                    (fix (meaning x a)))\n             (equal (append (append x y)\n                            z)\n                    (append x (append y z)))\n             (equal (reverse (append a b))\n                    (append (reverse b)\n                            (reverse a)))\n             (equal (times x (plus y z))\n                    (plus (times x y)\n                          (times x z)))\n             (equal (times (times x y)\n                           z)\n                    (times x (times y z)))\n             (equal (equal (times x y)\n                           (zero))\n                    (or (zerop x)\n                        (zerop y)))\n             (equal (exec (append x y)\n                          pds envrn)\n                    (exec y (exec x pds envrn)\n                            envrn))\n             (equal (mc-flatten x y)\n                    (append (flatten x)\n                            y))\n             (equal (member x (append a b))\n                    (or (member x a)\n                        (member x b)))\n             (equal (member x (reverse y))\n                    (member x y))\n             (equal (length (reverse x))\n                    (length x))\n             (equal (member a (intersect b c))\n                    (and (member a b)\n                         (member a c)))\n             (equal (nth (zero)\n                         i)\n                    (zero))\n             (equal (exp i (plus j k))\n                    (times (exp i j)\n                           (exp i k)))\n             (equal (exp i (times j k))\n                    (exp (exp i j)\n                         k))\n             (equal (reverse-loop x y)\n                    (append (reverse x)\n                            y))\n             (equal (reverse-loop x (nil))\n                    (reverse x))\n             (equal (count-list z (sort-lp x y))\n                    (plus (count-list z x)\n                          (count-list z y)))\n             (equal (equal (append a b)\n                           (append a c))\n                    (equal b c))\n             (equal (plus (remainder x y)\n                          (times y (quotient x y)))\n                    (fix x))\n             (equal (power-eval (big-plus1 l i base)\n                                base)\n                    (plus (power-eval l base)\n                          i))\n             (equal (power-eval (big-plus x y i base)\n                                base)\n                    (plus i (plus (power-eval x base)\n                                  (power-eval y base))))\n             (equal (remainder y 1)\n                    (zero))\n             (equal (lessp (remainder x y)\n                           y)\n                    (not (zerop y)))\n             (equal (remainder x x)\n                    (zero))\n             (equal (lessp (quotient i j)\n                           i)\n                    (and (not (zerop i))\n                         (or (zerop j)\n                             (not (equal j 1)))))\n             (equal (lessp (remainder x y)\n                           x)\n                    (and (not (zerop y))\n                         (not (zerop x))\n                         (not (lessp x y))))\n             (equal (power-eval (power-rep i base)\n                                base)\n                    (fix i))\n             (equal (power-eval (big-plus (power-rep i base)\n                                          (power-rep j base)\n                                          (zero)\n                                          base)\n                                base)\n                    (plus i j))\n             (equal (gcd x y)\n                    (gcd y x))\n             (equal (nth (append a b)\n                         i)\n                    (append (nth a i)\n                            (nth b (difference i (length a)))))\n             (equal (difference (plus x y)\n                                x)\n                    (fix y))\n             (equal (difference (plus y x)\n                                x)\n                    (fix y))\n             (equal (difference (plus x y)\n                                (plus x z))\n                    (difference y z))\n             (equal (times x (difference c w))\n                    (difference (times c x)\n                                (times w x)))\n             (equal (remainder (times x z)\n                               z)\n                    (zero))\n             (equal (difference (plus b (plus a c))\n                                a)\n                    (plus b c))\n             (equal (difference (add1 (plus y z))\n                                z)\n                    (add1 y))\n             (equal (lessp (plus x y)\n                           (plus x z))\n                    (lessp y z))\n             (equal (lessp (times x z)\n                           (times y z))\n                    (and (not (zerop z))\n                         (lessp x y)))\n             (equal (lessp y (plus x y))\n                    (not (zerop x)))\n             (equal (gcd (times x z)\n                         (times y z))\n                    (times z (gcd x y)))\n             (equal (value (normalize x)\n                           a)\n                    (value x a))\n             (equal (equal (flatten x)\n                           (cons y (nil)))\n                    (and (nlistp x)\n                         (equal x y)))\n             (equal (listp (gopher x))\n                    (listp x))\n             (equal (samefringe x y)\n                    (equal (flatten x)\n                           (flatten y)))\n             (equal (equal (greatest-factor x y)\n                           (zero))\n                    (and (or (zerop y)\n                             (equal y 1))\n                         (equal x (zero))))\n             (equal (equal (greatest-factor x y)\n                           1)\n                    (equal x 1))\n             (equal (numberp (greatest-factor x y))\n                    (not (and (or (zerop y)\n                                  (equal y 1))\n                              (not (numberp x)))))\n             (equal (times-list (append x y))\n                    (times (times-list x)\n                           (times-list y)))\n             (equal (prime-list (append x y))\n                    (and (prime-list x)\n                         (prime-list y)))\n             (equal (equal z (times w z))\n                    (and (numberp z)\n                         (or (equal z (zero))\n                             (equal w 1))))\n             (equal (greatereqp x y)\n                    (not (lessp x y)))\n             (equal (equal x (times x y))\n                    (or (equal x (zero))\n                        (and (numberp x)\n                             (equal y 1))))\n             (equal (remainder (times y x)\n                               y)\n                    (zero))\n             (equal (equal (times a b)\n                           1)\n                    (and (not (equal a (zero)))\n                         (not (equal b (zero)))\n                         (numberp a)\n                         (numberp b)\n                         (equal (sub1 a)\n                                (zero))\n                         (equal (sub1 b)\n                                (zero))))\n             (equal (lessp (length (delete x l))\n                           (length l))\n                    (member x l))\n             (equal (sort2 (delete x l))\n                    (delete x (sort2 l)))\n             (equal (dsort x)\n                    (sort2 x))\n             (equal (length (cons x1\n                                  (cons x2\n                                        (cons x3 (cons x4\n                                                       (cons x5\n                                                             (cons x6 x7)))))))\n                    (plus 6 (length x7)))\n             (equal (difference (add1 (add1 x))\n                                2)\n                    (fix x))\n             (equal (quotient (plus x (plus x y))\n                              2)\n                    (plus x (quotient y 2)))\n             (equal (sigma (zero)\n                           i)\n                    (quotient (times i (add1 i))\n                              2))\n             (equal (plus x (add1 y))\n                    (if (numberp y)\n                        (add1 (plus x y))\n                        (add1 x)))\n             (equal (equal (difference x y)\n                           (difference z y))\n                    (if (lessp x y)\n                        (not (lessp y z))\n                        (if (lessp z y)\n                            (not (lessp y x))\n                            (equal (fix x)\n                                   (fix z)))))\n             (equal (meaning (plus-tree (delete x y))\n                             a)\n                    (if (member x y)\n                        (difference (meaning (plus-tree y)\n                                             a)\n                                    (meaning x a))\n                        (meaning (plus-tree y)\n                                 a)))\n             (equal (times x (add1 y))\n                    (if (numberp y)\n                        (plus x (times x y))\n                        (fix x)))\n             (equal (nth (nil)\n                         i)\n                    (if (zerop i)\n                        (nil)\n                        (zero)))\n             (equal (last (append a b))\n                    (if (listp b)\n                        (last b)\n                        (if (listp a)\n                            (cons (car (last a))\n                                  b)\n                            b)))\n             (equal (equal (lessp x y)\n                           z)\n                    (if (lessp x y)\n                        (equal (t) z)\n                        (equal (f) z)))\n             (equal (assignment x (append a b))\n                    (if (assignedp x a)\n                        (assignment x a)\n                        (assignment x b)))\n             (equal (car (gopher x))\n                    (if (listp x)\n                        (car (flatten x))\n                        (zero)))\n             (equal (flatten (cdr (gopher x)))\n                    (if (listp x)\n                        (cdr (flatten x))\n                        (cons (zero)\n                              (nil))))\n             (equal (quotient (times y x)\n                              y)\n                    (if (zerop y)\n                        (zero)\n                        (fix x)))\n             (equal (get j (set i val mem))\n                    (if (eqp j i)\n                        val\n                        (get j mem)))))))\n  \n  (define (add-lemma-lst lst)\n    (cond ((null? lst)\n           #t)\n          (else (add-lemma (car lst))\n                (add-lemma-lst (cdr lst)))))\n  \n  (define (add-lemma term)\n    (cond ((and (pair? term)\n                (eq? (car term)\n                     (quote equal))\n                (pair? (cadr term)))\n           (put (car (cadr term))\n                (quote lemmas)\n                (cons\n                 (translate-term term)\n                 (get (car (cadr term)) (quote lemmas)))))\n          (else (error \"ADD-LEMMA did not like term:  \" term))))\n  \n  ; Translates a term by replacing its constructor symbols by symbol-records.\n  \n  (define (translate-term term)\n    (cond ((not (pair? term))\n           term)\n          (else (cons (symbol->symbol-record (car term))\n                      (translate-args (cdr term))))))\n  \n  (define (translate-args lst)\n    (cond ((null? lst)\n           '())\n          (else (cons (translate-term (car lst))\n                      (translate-args (cdr lst))))))\n  \n  ; For debugging only, so the use of MAP does not change\n  ; the first-order character of the benchmark.\n  \n  (define (untranslate-term term)\n    (cond ((not (pair? term))\n           term)\n          (else (cons (get-name (car term))\n                      (map untranslate-term (cdr term))))))\n  \n  ; A symbol-record is represented as a vector with two fields:\n  ; the symbol (for debugging) and\n  ; the list of lemmas associated with the symbol.\n  \n  (define (put sym property value)\n    (put-lemmas! (symbol->symbol-record sym) value))\n  \n  (define (get sym property)\n    (get-lemmas (symbol->symbol-record sym)))\n  \n  (define (symbol->symbol-record sym)\n    (let ((x (assq sym *symbol-records-alist*)))\n      (if x\n          (cdr x)\n          (let ((r (make-symbol-record sym)))\n            (set! *symbol-records-alist*\n                  (cons (cons sym r)\n                        *symbol-records-alist*))\n            r))))\n  \n  ; Association list of symbols and symbol-records.\n  \n  (define *symbol-records-alist* '())\n  \n  ; A symbol-record is represented as a vector with two fields:\n  ; the symbol (for debugging) and\n  ; the list of lemmas associated with the symbol.\n  \n  (define (make-symbol-record sym)\n    (vector sym '()))\n  \n  (define (put-lemmas! symbol-record lemmas)\n    (vector-set! symbol-record 1 lemmas))\n  \n  (define (get-lemmas symbol-record)\n    (vector-ref symbol-record 1))\n  \n  (define (get-name symbol-record)\n    (vector-ref symbol-record 0))\n  \n  (define (symbol-record-equal? r1 r2)\n    (eq? r1 r2))\n  \n  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n  ;\n  ; The second phase.\n  ;\n  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n  \n  (define (test n)\n    (let ((term\n           (apply-subst\n            (translate-alist\n             (quote ((x f (plus (plus a b)\n                                (plus c (zero))))\n                     (y f (times (times a b)\n                                 (plus c d)))\n                     (z f (reverse (append (append a b)\n                                           (nil))))\n                     (u equal (plus a b)\n                              (difference x y))\n                     (w lessp (remainder a b)\n                              (member a (length b))))))\n            (translate-term\n             (do ((term\n                   (quote (implies (and (implies x y)\n                                        (and (implies y z)\n                                             (and (implies z u)\n                                                  (implies u w))))\n                                   (implies x w)))\n                   (list 'or term '(f)))\n                  (n n (- n 1)))\n                 ((zero? n) term))))))\n    (tautp term)))\n  \n  (define (translate-alist alist)\n    (cond ((null? alist)\n           '())\n          (else (cons (cons (caar alist)\n                            (translate-term (cdar alist)))\n                      (translate-alist (cdr alist))))))\n  \n  (define (apply-subst alist term)\n    (cond ((not (pair? term))\n           (let ((temp-temp (assq term alist)))\n             (if temp-temp\n                 (cdr temp-temp)\n                 term)))\n          (else (cons (car term)\n                      (apply-subst-lst alist (cdr term))))))\n  \n  (define (apply-subst-lst alist lst)\n    (cond ((null? lst)\n           '())\n          (else (cons (apply-subst alist (car lst))\n                      (apply-subst-lst alist (cdr lst))))))\n  \n  (define (tautp x)\n    (tautologyp (rewrite x)\n                '() '()))\n  \n  (define (tautologyp x true-lst false-lst)\n    (cond ((truep x true-lst)\n           #t)\n          ((falsep x false-lst)\n           #f)\n          ((not (pair? x))\n           #f)\n          ((eq? (car x) if-constructor)\n           (cond ((truep (cadr x)\n                         true-lst)\n                  (tautologyp (caddr x)\n                              true-lst false-lst))\n                 ((falsep (cadr x)\n                          false-lst)\n                  (tautologyp (cadddr x)\n                              true-lst false-lst))\n                 (else (and (tautologyp (caddr x)\n                                        (cons (cadr x)\n                                              true-lst)\n                                        false-lst)\n                            (tautologyp (cadddr x)\n                                        true-lst\n                                        (cons (cadr x)\n                                              false-lst))))))\n          (else #f)))\n  \n  (define if-constructor '*) ; becomes (symbol->symbol-record 'if)\n  \n  (define rewrite-count 0) ; sanity check\n  \n  ; The next procedure is Henry Baker's sharing CONS, which avoids\n  ; allocation if the result is already in hand.\n  ; The REWRITE and REWRITE-ARGS procedures have been modified to\n  ; use SCONS instead of CONS.\n  \n  (define (scons x y original)\n    (if (and (eq? x (car original))\n             (eq? y (cdr original)))\n        original\n        (cons x y)))\n  \n  (define (rewrite term)\n    (set! rewrite-count (+ rewrite-count 1))\n    (cond ((not (pair? term))\n           term)\n          (else (rewrite-with-lemmas (scons (car term)\n                                            (rewrite-args (cdr term))\n                                            term)\n                                     (get-lemmas (car term))))))\n  \n  (define (rewrite-args lst)\n    (cond ((null? lst)\n           '())\n          (else (scons (rewrite (car lst))\n                       (rewrite-args (cdr lst))\n                       lst))))\n  \n  (define (rewrite-with-lemmas term lst)\n    (cond ((null? lst)\n           term)\n          ((one-way-unify term (cadr (car lst)))\n           (rewrite (apply-subst unify-subst (caddr (car lst)))))\n          (else (rewrite-with-lemmas term (cdr lst)))))\n  \n  (define unify-subst '*)\n  \n  (define (one-way-unify term1 term2)\n    (begin (set! unify-subst '())\n           (one-way-unify1 term1 term2)))\n  \n  (define (one-way-unify1 term1 term2)\n    (cond ((not (pair? term2))\n           (let ((temp-temp (assq term2 unify-subst)))\n             (cond (temp-temp\n                    (term-equal? term1 (cdr temp-temp)))\n                   ((number? term2)          ; This bug fix makes\n                    (equal? term1 term2))    ; nboyer 10-25% slower!\n                   (else\n                    (set! unify-subst (cons (cons term2 term1)\n                                            unify-subst))\n                    #t))))\n          ((not (pair? term1))\n           #f)\n          ((eq? (car term1)\n                (car term2))\n           (one-way-unify1-lst (cdr term1)\n                               (cdr term2)))\n          (else #f)))\n  \n  (define (one-way-unify1-lst lst1 lst2)\n    (cond ((null? lst1)\n           (null? lst2))\n          ((null? lst2)\n           #f)\n          ((one-way-unify1 (car lst1)\n                           (car lst2))\n           (one-way-unify1-lst (cdr lst1)\n                               (cdr lst2)))\n          (else #f)))\n  \n  (define (falsep x lst)\n    (or (term-equal? x false-term)\n        (term-member? x lst)))\n  \n  (define (truep x lst)\n    (or (term-equal? x true-term)\n        (term-member? x lst)))\n  \n  (define false-term '*)  ; becomes (translate-term '(f))\n  (define true-term '*)   ; becomes (translate-term '(t))\n  \n  ; The next two procedures were in the original benchmark\n  ; but were never used.\n  \n  (define (trans-of-implies n)\n    (translate-term\n     (list (quote implies)\n           (trans-of-implies1 n)\n           (list (quote implies)\n                 0 n))))\n  \n  (define (trans-of-implies1 n)\n    (cond ((equal? n 1)\n           (list (quote implies)\n                 0 1))\n          (else (list (quote and)\n                      (list (quote implies)\n                            (- n 1)\n                            n)\n                      (trans-of-implies1 (- n 1))))))\n  \n  ; Translated terms can be circular structures, which can't be\n  ; compared using Scheme's equal? and member procedures, so we\n  ; use these instead.\n  \n  (define (term-equal? x y)\n    (cond ((pair? x)\n           (and (pair? y)\n                (symbol-record-equal? (car x) (car y))\n                (term-args-equal? (cdr x) (cdr y))))\n          (else (equal? x y))))\n  \n  (define (term-args-equal? lst1 lst2)\n    (cond ((null? lst1)\n           (null? lst2))\n          ((null? lst2)\n           #f)\n          ((term-equal? (car lst1) (car lst2))\n           (term-args-equal? (cdr lst1) (cdr lst2)))\n          (else #f)))\n  \n  (define (term-member? x lst)\n    (cond ((null? lst)\n           #f)\n          ((term-equal? x (car lst))\n           #t)\n          (else (term-member? x (cdr lst)))))\n  \n  (set! setup-boyer\n        (lambda ()\n          (set! *symbol-records-alist* '())\n          (set! if-constructor (symbol->symbol-record 'if))\n          (set! false-term (translate-term '(f)))\n          (set! true-term  (translate-term '(t)))\n          (setup)))\n  \n  (set! test-boyer\n        (lambda (n)\n          (set! rewrite-count 0)\n          (let ((answer (test n)))\n            (write rewrite-count)\n            (display \" rewrites\")\n            (newline)\n            (if answer\n                rewrite-count\n                #f)))))\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scilab/scilab_function.sci",
    "content": "// A comment with whites    and tabulations\n// Email: <scilab.support@scilab.org>\n// Scilab editor: http://www.scilab.org/\nfunction [a, b] = myfunction(d, e, f)\n\ta = 2.71828 + %pi + f($, :);\n\tb = cos(a) + cosh(a);\n\tif d == e then\n\t\tb = 10 - e.field;\n\telse\n\t\tb = \"\t\ttest     \" + home\n\t\treturn\n\tend\n\tmyvar = 1.23e-45;\nendfunction\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scilab/scilab_script.sce",
    "content": "disp(%pi);\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Scilab/scilab_test.tst",
    "content": "assert_checkequal(1+1,2);\nassert_checkfalse(%pi==%e);\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/ShaderLab/DepthOfField.shader",
    "content": "// From https://github.com/Unity-Technologies/PostProcessing,\n// licensed under MIT licence.\n\nShader \"Hidden/Post FX/Depth Of Field\"\n{\n    Properties\n    {\n        _MainTex (\"\", 2D) = \"black\"\n    }\n\n    CGINCLUDE\n        #pragma exclude_renderers d3d11_9x\n        #pragma target 3.0\n    ENDCG\n\n    SubShader\n    {\n        Cull Off ZWrite Off ZTest Always\n\n        // (0) Downsampling, prefiltering & CoC\n        Pass\n        {\n            CGPROGRAM\n                #pragma multi_compile __ UNITY_COLORSPACE_GAMMA\n                #pragma vertex VertDOF\n                #pragma fragment FragPrefilter\n                #include \"DepthOfField.cginc\"\n            ENDCG\n        }\n\n        // (1) Pass 0 + temporal antialiasing\n        Pass\n        {\n            CGPROGRAM\n                #pragma vertex VertDOF\n                #pragma fragment FragPrefilter\n                #define PREFILTER_TAA\n                #include \"DepthOfField.cginc\"\n            ENDCG\n        }\n\n        // (2-5) Bokeh filter with disk-shaped kernels\n        Pass\n        {\n            CGPROGRAM\n                #pragma vertex VertDOF\n                #pragma fragment FragBlur\n                #define KERNEL_SMALL\n                #include \"DepthOfField.cginc\"\n            ENDCG\n        }\n\n        Pass\n        {\n            CGPROGRAM\n                #pragma vertex VertDOF\n                #pragma fragment FragBlur\n                #define KERNEL_MEDIUM\n                #include \"DepthOfField.cginc\"\n            ENDCG\n        }\n\n        Pass\n        {\n            CGPROGRAM\n                #pragma vertex VertDOF\n                #pragma fragment FragBlur\n                #define KERNEL_LARGE\n                #include \"DepthOfField.cginc\"\n            ENDCG\n        }\n\n        Pass\n        {\n            CGPROGRAM\n                #pragma vertex VertDOF\n                #pragma fragment FragBlur\n                #define KERNEL_VERYLARGE\n                #include \"DepthOfField.cginc\"\n            ENDCG\n        }\n\n        // (6) Postfilter blur\n        Pass\n        {\n            CGPROGRAM\n                #pragma vertex VertDOF\n                #pragma fragment FragPostBlur\n                #include \"DepthOfField.cginc\"\n            ENDCG\n        }\n    }\n\n    FallBack Off\n}"
  },
  {
    "path": "src/test/resources/samples/langs/ShaderLab/Fog.shader",
    "content": "// From https://github.com/Unity-Technologies/PostProcessing,\n// licensed under MIT licence.\n\nShader \"Hidden/Post FX/Fog\"\n{\n    Properties\n    {\n        _MainTex(\"Main Texture\", 2D) = \"white\" {}\n    }\n\n    CGINCLUDE\n\n        #pragma multi_compile __ FOG_LINEAR FOG_EXP FOG_EXP2\n        #include \"UnityCG.cginc\"\n        #include \"Common.cginc\"\n\n        #define SKYBOX_THREASHOLD_VALUE 0.9999\n\n        struct Varyings\n        {\n            float2 uv : TEXCOORD0;\n            float4 vertex : SV_POSITION;\n        };\n\n        Varyings VertFog(AttributesDefault v)\n        {\n            Varyings o;\n            o.vertex = UnityObjectToClipPos(v.vertex);\n            o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);\n            return o;\n        }\n\n        sampler2D _CameraDepthTexture;\n\n        half4 _FogColor;\n        float _Density;\n        float _Start;\n        float _End;\n\n        half ComputeFog(float z)\n        {\n            half fog = 0.0;\n        #if FOG_LINEAR\n            fog = (_End - z) / (_End - _Start);\n        #elif FOG_EXP\n            fog = exp2(-_Density * z);\n        #else // FOG_EXP2\n            fog = _Density * z;\n            fog = exp2(-fog * fog);\n        #endif\n            return saturate(fog);\n        }\n\n        float ComputeDistance(float depth)\n        {\n            float dist = depth * _ProjectionParams.z;\n            dist -= _ProjectionParams.y;\n            return dist;\n        }\n\n        half4 FragFog(Varyings i) : SV_Target\n        {\n            half4 color = tex2D(_MainTex, i.uv);\n\n            float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);\n            depth = Linear01Depth(depth);\n            float dist = ComputeDistance(depth) - _Start;\n            half fog = 1.0 - ComputeFog(dist);\n\n            return lerp(color, _FogColor, fog);\n        }\n\n        half4 FragFogExcludeSkybox(Varyings i) : SV_Target\n        {\n            half4 color = tex2D(_MainTex, i.uv);\n\n            float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);\n            depth = Linear01Depth(depth);\n            float skybox = depth < SKYBOX_THREASHOLD_VALUE;\n            float dist = ComputeDistance(depth) - _Start;\n            half fog = 1.0 - ComputeFog(dist);\n\n            return lerp(color, _FogColor, fog * skybox);\n        }\n\n    ENDCG\n\n    SubShader\n    {\n        Cull Off ZWrite Off ZTest Always\n\n        Pass\n        {\n            CGPROGRAM\n\n                #pragma vertex VertFog\n                #pragma fragment FragFog\n\n            ENDCG\n        }\n\n        Pass\n        {\n            CGPROGRAM\n\n                #pragma vertex VertFog\n                #pragma fragment FragFogExcludeSkybox\n\n            ENDCG\n        }\n    }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/ShaderLab/Uber.shader",
    "content": "// From https://github.com/Unity-Technologies/PostProcessing,\n// licensed under MIT licence.\n\nShader \"Hidden/Post FX/Uber Shader\"\n{\n    Properties\n    {\n        _MainTex (\"Texture\", 2D) = \"white\" {}\n        _AutoExposure (\"\", 2D) = \"\" {}\n        _BloomTex (\"\", 2D) = \"\" {}\n        _Bloom_DirtTex (\"\", 2D) = \"\" {}\n        _GrainTex (\"\", 2D) = \"\" {}\n        _LogLut (\"\", 2D) = \"\" {}\n        _UserLut (\"\", 2D) = \"\" {}\n        _Vignette_Mask (\"\", 2D) = \"\" {}\n        _ChromaticAberration_Spectrum (\"\", 2D) = \"\" {}\n        _DitheringTex (\"\", 2D) = \"\" {}\n    }\n\n    CGINCLUDE\n\n        #pragma target 3.0\n\n        #pragma multi_compile __ UNITY_COLORSPACE_GAMMA\n        #pragma multi_compile __ EYE_ADAPTATION\n        #pragma multi_compile __ CHROMATIC_ABERRATION\n        #pragma multi_compile __ DEPTH_OF_FIELD DEPTH_OF_FIELD_COC_VIEW\n        #pragma multi_compile __ BLOOM\n        #pragma multi_compile __ BLOOM_LENS_DIRT\n        #pragma multi_compile __ COLOR_GRADING COLOR_GRADING_LOG_VIEW\n        #pragma multi_compile __ USER_LUT\n        #pragma multi_compile __ GRAIN\n        #pragma multi_compile __ VIGNETTE_CLASSIC VIGNETTE_ROUND VIGNETTE_MASKED\n        #pragma multi_compile __ DITHERING\n\n        #include \"UnityCG.cginc\"\n        #include \"Bloom.cginc\"\n        #include \"ColorGrading.cginc\"\n        #include \"UberSecondPass.cginc\"\n\n        // Auto exposure / eye adaptation\n        sampler2D _AutoExposure;\n\n        // Chromatic aberration\n        half _ChromaticAberration_Amount;\n        sampler2D _ChromaticAberration_Spectrum;\n\n        // Depth of field\n        sampler2D_float _CameraDepthTexture;\n        sampler2D _DepthOfFieldTex;\n        float4 _DepthOfFieldTex_TexelSize;\n        float2 _DepthOfFieldParams; // x: distance, y: f^2 / (N * (S1 - f) * film_width * 2)\n\n        // Bloom\n        sampler2D _BloomTex;\n        float4 _BloomTex_TexelSize;\n        half2 _Bloom_Settings; // x: sampleScale, y: bloom.intensity\n\n        sampler2D _Bloom_DirtTex;\n        half _Bloom_DirtIntensity;\n\n        // Color grading & tonemapping\n        sampler2D _LogLut;\n        half3 _LogLut_Params; // x: 1 / lut_width, y: 1 / lut_height, z: lut_height - 1\n        half _ExposureEV; // EV (exp2)\n\n        // User lut\n        sampler2D _UserLut;\n        half4 _UserLut_Params; // @see _LogLut_Params\n\n        // Vignette\n        half3 _Vignette_Color;\n        half2 _Vignette_Center; // UV space\n        half3 _Vignette_Settings; // x: intensity, y: smoothness, z: roundness\n        sampler2D _Vignette_Mask;\n        half _Vignette_Opacity; // [0;1]\n\n        struct VaryingsFlipped\n        {\n            float4 pos : SV_POSITION;\n            float2 uv : TEXCOORD0;\n            float2 uvSPR : TEXCOORD1; // Single Pass Stereo UVs\n            float2 uvFlipped : TEXCOORD2; // Flipped UVs (DX/MSAA/Forward)\n            float2 uvFlippedSPR : TEXCOORD3; // Single Pass Stereo flipped UVs\n        };\n\n        VaryingsFlipped VertUber(AttributesDefault v)\n        {\n            VaryingsFlipped o;\n            o.pos = UnityObjectToClipPos(v.vertex);\n            o.uv = v.texcoord.xy;\n            o.uvSPR = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST);\n            o.uvFlipped = v.texcoord.xy;\n\n        #if UNITY_UV_STARTS_AT_TOP\n            if (_MainTex_TexelSize.y < 0.0)\n                o.uvFlipped.y = 1.0 - o.uvFlipped.y;\n        #endif\n\n            o.uvFlippedSPR = UnityStereoScreenSpaceUVAdjust(o.uvFlipped, _MainTex_ST);\n\n            return o;\n        }\n\n        half4 FragUber(VaryingsFlipped i) : SV_Target\n        {\n            float2 uv = i.uv;\n            half autoExposure = 1.0;\n\n            // Store the auto exposure value for later\n            #if EYE_ADAPTATION\n            {\n                autoExposure = tex2D(_AutoExposure, uv).r;\n            }\n            #endif\n\n            half3 color = (0.0).xxx;\n            #if DEPTH_OF_FIELD && CHROMATIC_ABERRATION\n            half4 dof = (0.0).xxxx;\n            #endif\n\n            //\n            // HDR effects\n            // ---------------------------------------------------------\n\n            // Chromatic Aberration\n            // Inspired by the method described in \"Rendering Inside\" [Playdead 2016]\n            // https://twitter.com/pixelmager/status/717019757766123520\n            #if CHROMATIC_ABERRATION\n            {\n                float2 coords = 2.0 * uv - 1.0;\n                float2 end = uv - coords * dot(coords, coords) * _ChromaticAberration_Amount;\n\n                float2 diff = end - uv;\n                int samples = clamp(int(length(_MainTex_TexelSize.zw * diff / 2.0)), 3, 16);\n                float2 delta = diff / samples;\n                float2 pos = uv;\n                half3 sum = (0.0).xxx, filterSum = (0.0).xxx;\n\n                #if DEPTH_OF_FIELD\n                float2 dofDelta = delta;\n                float2 dofPos = pos;\n                if (_MainTex_TexelSize.y < 0.0)\n                {\n                    dofDelta.y = -dofDelta.y;\n                    dofPos.y = 1.0 - dofPos.y;\n                }\n                half4 dofSum = (0.0).xxxx;\n                #endif\n\n                for (int i = 0; i < samples; i++)\n                {\n                    half t = (i + 0.5) / samples;\n                    half3 s = tex2Dlod(_MainTex, float4(UnityStereoScreenSpaceUVAdjust(pos, _MainTex_ST), 0, 0)).rgb;\n                    half3 filter = tex2Dlod(_ChromaticAberration_Spectrum, float4(t, 0, 0, 0)).rgb;\n\n                    sum += s * filter;\n                    filterSum += filter;\n                    pos += delta;\n\n                    #if DEPTH_OF_FIELD\n                    half4 sdof = tex2Dlod(_DepthOfFieldTex, float4(UnityStereoScreenSpaceUVAdjust(dofPos, _MainTex_ST), 0, 0)).rgba;\n                    dofSum += sdof * half4(filter, 1);\n                    dofPos += dofDelta;\n                    #endif\n                }\n\n                color = sum / filterSum;\n                #if DEPTH_OF_FIELD\n                dof = dofSum / half4(filterSum, samples);\n                #endif\n            }\n            #else\n            {\n                color = tex2D(_MainTex, i.uvSPR).rgb;\n            }\n            #endif\n\n            // Apply auto exposure if any\n            color *= autoExposure;\n\n            // Gamma space... Gah.\n            #if UNITY_COLORSPACE_GAMMA\n            {\n                color = GammaToLinearSpace(color);\n            }\n            #endif\n\n            // Depth of field\n            #if DEPTH_OF_FIELD\n            {\n                #if !CHROMATIC_ABERRATION\n                half4 dof = tex2D(_DepthOfFieldTex, i.uvFlippedSPR);\n                #endif\n                color = color * dof.a + dof.rgb * autoExposure;\n            }\n            #elif DEPTH_OF_FIELD_COC_VIEW\n            {\n                // Calculate the radiuses of CoC.\n                half4 src = tex2D(_DepthOfFieldTex, uv);\n                float depth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uvFlippedSPR));\n                float coc = (depth - _DepthOfFieldParams.x) * _DepthOfFieldParams.y / depth;\n                coc *= 80;\n\n                // Visualize CoC (white -> red -> gray)\n                half3 rgb = lerp(half3(1, 0, 0), half3(1.0, 1.0, 1.0), saturate(-coc));\n                rgb = lerp(rgb, half3(0.4, 0.4, 0.4), saturate(coc));\n\n                // Black and white image overlay\n                rgb *= AcesLuminance(color) + 0.5;\n\n                // Gamma correction\n                #if !UNITY_COLORSPACE_GAMMA\n                {\n                    rgb = GammaToLinearSpace(rgb);\n                }\n                #endif\n\n                color = rgb;\n            }\n            #endif\n\n            // HDR Bloom\n            #if BLOOM\n            {\n                half3 bloom = UpsampleFilter(_BloomTex, i.uvFlippedSPR, _BloomTex_TexelSize.xy, _Bloom_Settings.x) * _Bloom_Settings.y;\n                color += bloom;\n\n                #if BLOOM_LENS_DIRT\n                {\n                    half3 dirt = tex2D(_Bloom_DirtTex, i.uvFlipped).rgb * _Bloom_DirtIntensity;\n                    color += bloom * dirt;\n                }\n                #endif\n            }\n            #endif\n\n            // Procedural vignette\n            #if VIGNETTE_CLASSIC\n            {\n                half2 d = abs(uv - _Vignette_Center) * _Vignette_Settings.x;\n                d = pow(d, _Vignette_Settings.z); // Roundness\n                half vfactor = pow(saturate(1.0 - dot(d, d)), _Vignette_Settings.y);\n                color *= lerp(_Vignette_Color, (1.0).xxx, vfactor);\n            }\n\n            // Perfectly round vignette\n            #elif VIGNETTE_ROUND\n            {\n                half2 d = abs(uv - _Vignette_Center) * _Vignette_Settings.x;\n                d.x *= _ScreenParams.x / _ScreenParams.y;\n                half vfactor = pow(saturate(1.0 - dot(d, d)), _Vignette_Settings.y);\n                color *= lerp(_Vignette_Color, (1.0).xxx, vfactor);\n            }\n\n            // Masked vignette\n            #elif VIGNETTE_MASKED\n            {\n                half vfactor = tex2D(_Vignette_Mask, uv).a;\n                half3 new_color = color * lerp(_Vignette_Color, (1.0).xxx, vfactor);\n                color = lerp(color, new_color, _Vignette_Opacity);\n            }\n            #endif\n\n            // HDR color grading & tonemapping\n            #if COLOR_GRADING\n            {\n                color *= _ExposureEV; // Exposure is in ev units (or 'stops')\n\n                half3 colorLogC = saturate(LinearToLogC(color));\n                color = ApplyLut2d(_LogLut, colorLogC, _LogLut_Params);\n            }\n            #elif COLOR_GRADING_LOG_VIEW\n            {\n                color *= _ExposureEV;\n                color = saturate(LinearToLogC(color));\n            }\n            #endif\n\n            //\n            // All the following effects happen in LDR\n            // ---------------------------------------------------------\n\n            color = saturate(color);\n\n            // Back to gamma space if needed\n            #if UNITY_COLORSPACE_GAMMA\n            {\n                color = LinearToGammaSpace(color);\n            }\n            #endif\n\n            // LDR user lut\n            #if USER_LUT\n            {\n                color = saturate(color);\n                half3 colorGraded;\n\n                #if !UNITY_COLORSPACE_GAMMA\n                {\n                    colorGraded = ApplyLut2d(_UserLut, LinearToGammaSpace(color), _UserLut_Params.xyz);\n                    colorGraded = GammaToLinearSpace(colorGraded);\n                }\n                #else\n                {\n                    colorGraded = ApplyLut2d(_UserLut, color, _UserLut_Params.xyz);\n                }\n                #endif\n\n                color = lerp(color, colorGraded, _UserLut_Params.w);\n            }\n            #endif\n\n            color = UberSecondPass(color, uv);\n\n            // Done !\n            return half4(color, 1.0);\n        }\n\n    ENDCG\n\n    SubShader\n    {\n        Cull Off ZWrite Off ZTest Always\n\n        // (0)\n        Pass\n        {\n            CGPROGRAM\n\n                #pragma vertex VertUber\n                #pragma fragment FragUber\n\n            ENDCG\n        }\n    }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/99-bottles-of-beer",
    "content": "#!/bin/bash\n# Bourne Again shell version of 99 Bottles\n# Dave Plonka - plonka@carroll1.cc.edu\n\ntypeset -i n=99\ntypeset bottles=bottles\ntypeset no\n\nwhile [ 0 != $[ n ] ]\ndo\n   echo \"${n?} ${bottles?} of beer on the wall,\"\n   echo \"${n?} ${bottles?} of beer,\"\n   echo \"take one down, pass it around,\"\n   n=n-1\n   case ${n?} in\n   0)\n      no=no\n      bottles=${bottles%s}s\n      ;;\n   1)\n      bottles=${bottles%s}\n      ;;\n   esac\n   echo \"${no:-${n}} ${bottles?} of beer on the wall.\"\n   echo\ndone\n\nexit\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/bash",
    "content": "#!/bin/bash\necho \"bash\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/build.command",
    "content": "set -e\n\necho \"/************/\"\necho \"/* BUILDING */\"\necho \"/************/\"\necho \"\"\n\ncd `dirname $0`\n\ncd build\n\ncmake ..\n\nmake\n\necho \"\"\necho \"/***********/\"\necho \"/* TESTING */\"\necho \"/***********/\"\necho \"\"\n\n# ctest ..\n\nmake Experimental\n\necho \"\"\necho \"/***********/\"\necho \"/* SUCCESS */\"\necho \"/***********/\"\necho \"\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.bash_logout",
    "content": "/usr/bin/clear\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.bash_profile",
    "content": "##\n# Environment...\n##\n# Set up some variables for 'screen'\nif [ -z \"${SCREENDIR}\" ];then echo -n\n        export SCREENDIR=\"${HOME}/.screen\"\n                # Save my screen sockets within my $HOME dir\nfi\n## PATH\nexport PATH=/usr/local/bin:/usr/local/sbin:/usr/xpg4/bin:/usr/sbin:/usr/bin:/usr/sfw/bin:/usr/ccs/bin:/usr/openwin/bin:/opt/mysql/current/bin\nexport MANPATH=/usr/local/man:/usr/share/man\n\n## Random ENV...\n# Set $TERM to 'vt100' (a safe default) if, for some\n# reason, it is set to 'network' (which is not valid!)\nif [ ${TERM} == 'network' ];then echo -n\n        export TERM='vt100'\n                # not 'nsterm' because if its 'network' we're\n                # probly not in Terminal.app\nfi\n# Set $COLORTERM, all this does is trick *some* apps into\n# using color in the terminal, which should happen anyway.\nif [ -z \"${COLORTERM}\" ];then echo -n\n        export COLORTERM=\"${TERM}\"\nfi\n# another color option, this one for BSD's ls\nif [ -z \"${CLICOLOR}\" ];then echo -n\n        export CLICOLOR='1' # can be set to anything, actually\nfi\n# If $DISPLAY is not already set, set it!\nif [ -z \"${DISPLAY}\" ];then echo -n\n        export DISPLAY=':0'\nfi\n##\n# Source the bash rc file\n[ -r \"${HOME}/.bashrc\" ] && . \"${HOME}/.bashrc\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.bashrc",
    "content": "##\n# Functions... *MUCH* better than aliases, and they do more too!\n# but they clutter the environment... (try typing just 'set' at the prompt)\n##\n# The reason that some of these are... odd... is because\n# I had to convert them early because bash can't do positional\n# arguments in aliases! functionName () { do something $@<-arguments ; }\n function ls    { command ls -Fh \"$@\"; }\n        # 'command ls' to prevent loop; -A for .file, -F for dir/ link@,\n        # -h for 5k 3m 1g, -o for printing flags (uchg)...\n function l     { ls -l \"$@\"; } # -l to list in long format...\n function ll    { l \"$@\" | less -XF ; } # pipe into 'more'\n\n##\n# Tips and Ticks... from http://www.caliban.org/bash/index.shtml\n##\n# The $CDPATH variable is so that you can be in /path/to/something and 'cd'\n# to 'somethingElse' and end up in /not/the/same/path/to/somethingElse.\n# iWould use it if it didn't ALWAYS echo the directory it changes to!\n#CDPATH='.:~'\n#\n# HISTIGNORE=\"&:l:ls:ls *:l *:cd:cd *:[bf]g:exit:quit:q:sleep *\"\n        # History ignores commands that include any l/ls/cd etc\n        # This kicks-ass! It drops repeats and other useless\n        # things from the command history!\n HISTIGNORE=\"[bf]g:exit:quit:q:sleep *\"\n        # I want to see l/ls/cd in my history\n HISTCONTROL=ignoreboth\n        # ignores both commands that start with a space or a tab, and duplicates\n        # other options are as follows:\n        # `ignorespace' means to not enter lines which begin with a space or tab into the history list.\n        # `ignoredups' means to not enter lines which match the last entered line.\n        # `ignoreboth' combines the two options.\n\n shopt -s cdspell extglob progcomp\n        # Spell check for 'cd', extended globbing, programmable completion\n\n##\n# Bash Completion... Cannibalised from bash_completion 20030929\n# Completion defaults... Yes, its long...\n# Basically this sets up many useful defaults for command completion, these\n#  should probly be built into bash. Use bash_completions itself if you want\n#  more functionality and don't mind the hacks it uses.\n complete -f -X '!*.?(t)bz2' bunzip2 bzcat bzcmp bzdiff bzegrep bzfgrep bzgrep\n complete -f -X '!*.@(zip|ZIP|jar|JAR|exe|EXE|pk3|war|wsz|ear|zargo|xpi)' unzip zipinfo\n complete -f -X '*.Z' compress znew\n complete -f -X '!*.@(Z|gz|tgz|Gz|dz)' gunzip zcmp zdiff zcat zegrep zfgrep zgrep zless zmore\n complete -f -X '!*.Z' uncompress\n complete -f -X '!*.@(gif|jp?(e)g|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|GIF|JP?(E)G|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA)' ee  display\n complete -f -X '!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|GIF|JPG|JP?(E)G|TIF?(F)|PNG|P[BGP]M|BMP|X[BP]M|RLE|RGB|PCX|FITS|PM)' xv qiv\n complete -f -X '!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.Z))' gv ggv\n complete -f -X '!*.@(dvi|DVI)?(.@(gz|Z|bz2))' xdvi\n complete -f -X '!*.@(dvi|DVI)' dvips dviselect dvitype\n complete -f -X '!*.@(pdf|PDF)' acroread xpdf\n complete -f -X '!*.texi*' makeinfo texi2html\n complete -f -X '!*.@(?(la)tex|?(LA)TEX|texi|TEXI|dtx|DTX|ins|INS)' tex latex slitex jadetex pdfjadetex pdftex pdflatex texi2dvi\n complete -f -X '!*.@(mp3|MP3|m3u)' mpg123 mpg321\n complete -f -X '!*.@(mp?(e)g|MP?(E)G|wma|avi|AVI|asf|vob|bin|dat|vcd|ps|pes|fli|viv|rm|ram|yuv|mov|MOV|qt|QT|wmv|mp3|MP3|ogg|OGG|ogm|OGM|mp4|MP4|wav|WAV)' xine\n complete -f -X '!*.@(avi|asf|wmv)' aviplay\n complete -f -X '!*.@(rm|ram|smi?(l))' realplay\n complete -f -X '!*.@(mp?(e)g|avi|mov|qt)' xanim\n complete -f -X '!*.@(ogg|OGG|m3u)' ogg123\n complete -f -X '!*.@(mp3|MP3|ogg|OGG|pls|m3u)' gqmpeg freeamp\n complete -f -X '!*.@(mp[23]|MP[23]|ogg|OGG|wav|WAV|pls|m3u|xm|mod|s[3t]m|it|mtm|ult|flac)' xmms\n complete -f -X '!*.fig' xfig\n complete -f -X '!*.@(mid?(i))' timidity playmidi\n complete -f -X '.*|*.@(o|so|so.!(conf)|a|tar?(.@(gz|bz2))|tgz|tbz2|rpm|zip|ZIP|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' vi vim gvim rvim view rview rgvim rgview gview emacs\n complete -f -X '!*.@(exe|EXE|com|COM|scr|SCR)' wine\n complete -f -X '!*.@(zip|ZIP|z|Z|gz|GZ|tgz|TGZ)' bzme\n complete -f -X '!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))' netscape mozilla lynx opera w3m galeon curl dillo elinks links\n#\n complete -u su passwd groups # user commands see only users\n complete -A stopped -P '%' bg # bg completes with stopped jobs\n complete -j -P '%' fg jobs disown # other job commands\n complete -v readonly unset export # readonly and unset complete with shell variables\n complete -A setopt set # set completes with set options\n complete -A shopt shopt # shopt completes with shopt options\n complete -A helptopic help # helptopics\n complete -a unalias # unalias completes with aliases\n complete -A binding bind # bind completes with readline bindings (make this more intelligent)\n complete -c command type which man #sudo # type, which, man complete on commands\n complete -d pushd cd rmdir # Make directory commands see only directories\n complete -W ' ' alias # no filenames for alias,\n\n##\n# Set the prompt\n##\n PS1=\"[\\h:\\w] \\[\\033[1;34m\\]\\u\\[\\033[0m\\]\\\\$ \"\n        # My prompt line:       \"[gaelicWizard:~/Documents] user$ \" user is in blue\n        # Or:                   \"[gaelicWizard:~/Documents] root# \" root is in blue\n##\n# Aliases:\n##\n# Aliases frequently used...\n alias ..='cd ..;l'\n alias cd..='cd ..'\n alias which='type' # 'which' in (t)csh is same(?) as 'type' in bash...\n alias quit='exit'\n alias q='quit' # and 'q' is even shorter! :-D\n alias v='vim'\n alias rehash='. ~/.bashrc;' # source ~/.bashrc after I edit it\n alias pg='ps -afe|grep -v grep|grep'\n alias make='gmake'\n alias patch='gpatch'\n alias sed='gsed'\n alias awk='nawk'\n alias diff='gdiff'\n alias grep='ggrep'\n alias find='gfind'\n alias ps='/usr/ucb/ps'\n alias whoami='/usr/ucb/whoami'\n alias ping='ping -s'\n alias man='GROFF_NO_SGR= TCAT=\"less -s\" TROFF=\"groff -Tascii\" man -t'\n\n\n# The rest are uncategorised and fairly random... :-)\nshopt -s histappend\nPROMPT_COMMAND='echo -ne \"\\033]0;${USER} on ${HOSTNAME} at ${PWD}\\007\" && history -a'\nexport PATH=/usr/local/bin:/usr/local/sbin:/usr/xpg4/bin:/usr/sbin:/usr/bin:/usr/sfw/bin:/usr/ccs/bin:/usr/openwin/bin:/opt/mysql/current/bin\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.cshrc",
    "content": "umask 022\nset path=(/opt/local/bin /opt/local/sbin /bin /usr/bin)\nif ( $?prompt ) then\n        set history=32\nendif\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.login",
    "content": "stty -istrip\n# setenv TERM `tset -Q -`\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.profile",
    "content": "export PATH=\"/usr/local/bin:/usr/bin:/bin\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.zlogin",
    "content": "export PATH=\"/usr/local/bin:/usr/bin:/bin\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.zlogout",
    "content": "# Store dirs stack\n# See ~/.dotfiles/oh-my-zsh/plugins/dirspersist.plugin.zsh\ndirpersiststore\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.zprofile",
    "content": "##############################################################################\n#Import the shell-agnostic (Bash or Zsh) environment config\n##############################################################################\nsource ~/.profile\n\n##############################################################################\n# History Configuration\n##############################################################################\nHISTSIZE=5000               #How many lines of history to keep in memory\nHISTFILE=~/.zsh_history     #Where to save history to disk\nSAVEHIST=5000               #Number of history entries to save to disk\nHISTDUP=erase               #Erase duplicates in the history file\nsetopt    appendhistory     #Append history to the history file (no overwriting)\nsetopt    sharehistory      #Share history across terminals\nsetopt    incappendhistory  #Immediately append to the history file, not just when a term is killed\n\n##############################################################################\n# sjl/z-zsh setup\n##############################################################################\n#. ~/.dotfiles/z-zsh/z.sh\n#function precmd () {\n#  z --add \"$(pwd -P)\"\n#}\n\n##############################################################################\n# rupa/z setup\n##############################################################################\n. ~/.dotfiles/z-rupa/z.sh\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.zshenv",
    "content": "fpath=($fpath $HOME/.zsh/func)\ntypeset -U fpath\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/.zshrc",
    "content": "export PATH=\"/usr/local/bin:/usr/bin:/bin\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/9fs",
    "content": "#!/bin/rc\n# 9fs filesystem [mountpoint] - srv & mount filesystem, usually from plan 9\n\nrfork e\nswitch($1){\ncase ''\n\techo usage: 9fs service '[mountpoint]' >[1=2]\n\texit usage\ncase kfs\n\tif(! test -f /srv/kfs)\n\t\tdisk/kfs\n\tmount -c /srv/kfs /n/kfs\ncase dump\n\tmount /srv/boot /n/dump dump >[2]/dev/null ||\n\t\tmount /srv/boot /n/dump main/archive ||\n\t\tmount /srv/boot /n/dump dump\t# again to print error\ncase snap\n\tmount /srv/boot /n/snap main/snapshot\ncase other\n\tmount -C /srv/boot /n/other other\ncase juke\t\t\t\t\t# ye olde file server\n\tsrv -q il!jukefs && mount /srv/il!jukefs /n/juke\ncase sources\n\tsrv -nq tcp!sources.cs.bell-labs.com sources /n/sources\ncase sourcesdump\n\t9fs sources\n\tmount -n /srv/sources /n/sourcesdump main/archive\ncase sourcessnap\n\t9fs sources\n\tmount -n /srv/sources /n/sourcessnap main/snapshot\n# arbitrary venti archives\ncase vac:*\n\tvacfs <{echo $1}\ncase *.vac\n\tif (test -e $1)\n\t\tscore=$1\n\tif not if (! ~ $1 /* && test -e $home/lib/vac/$1)\n\t\tscore=$home/lib/vac/$1\n\tif not if (! ~ $1 /* && test -e /lib/vac/$1)\n\t\tscore=/lib/vac/$1\n\tif not {\n\t\techo $0: $1: no such score file >[1=2]\n\t\texit 'no score file'\n\t}\n\tvacfs -m /n/`{basename $1 .vac} `{cat $score}\ncase wiki\n\tsrv -m 'net!plan9.bell-labs.com!wiki' wiki /mnt/wiki\ncase *\n\tswitch($#*){\n\tcase 1\n\t\tsrv -m $1\n\tcase *\n\t\tsrv -m $1 $1 $2\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/PKGBUILD",
    "content": "# Maintainer: Daniel Micay <danielmicay@gmail.com>\npkgname=stud-git\npkgver=20120316\npkgrel=1\npkgdesc=\"The Scalable TLS Unwrapping Daemon\"\narch=(i686 x86_64)\nurl=\"https://github.com/bumptech/stud\"\nlicense=('BSD')\ndepends=(libev openssl)\nmakedepends=(git)\nprovides=(stud)\nconflicts=(stud)\n\n_gitroot=https://github.com/bumptech/stud.git\n_gitname=stud\n\nbuild() {\n  cd \"$srcdir\"\n  msg \"Connecting to GIT server....\"\n\n  if [[ -d \"$_gitname\" ]]; then\n    cd \"$_gitname\" && git pull origin\n    msg \"The local files are updated.\"\n  else\n    git clone \"$_gitroot\" \"$_gitname\"\n  fi\n\n  msg \"GIT checkout done or server timeout\"\n  msg \"Starting build...\"\n\n  rm -rf \"$srcdir/$_gitname-build\"\n  git clone \"$srcdir/$_gitname\" \"$srcdir/$_gitname-build\"\n  cd \"$srcdir/$_gitname-build\"\n\n  make\n}\n\npackage() {\n  cd \"$srcdir/$_gitname-build\"\n  make PREFIX=/usr DESTDIR=\"$pkgdir/\" install\n  install -Dm755 init.stud \"$pkgdir/etc/rc.d/stud\"\n  mkdir -p \"$pkgdir/etc/stud\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/bash_logout",
    "content": "/usr/bin/clear\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/bash_profile",
    "content": "##\n# Environment...\n##\n# Set up some variables for 'screen'\nif [ -z \"${SCREENDIR}\" ];then echo -n\n        export SCREENDIR=\"${HOME}/.screen\"\n                # Save my screen sockets within my $HOME dir\nfi\n## PATH\nexport PATH=/usr/local/bin:/usr/local/sbin:/usr/xpg4/bin:/usr/sbin:/usr/bin:/usr/sfw/bin:/usr/ccs/bin:/usr/openwin/bin:/opt/mysql/current/bin\nexport MANPATH=/usr/local/man:/usr/share/man\n\n## Random ENV...\n# Set $TERM to 'vt100' (a safe default) if, for some\n# reason, it is set to 'network' (which is not valid!)\nif [ ${TERM} == 'network' ];then echo -n\n        export TERM='vt100'\n                # not 'nsterm' because if its 'network' we're\n                # probly not in Terminal.app\nfi\n# Set $COLORTERM, all this does is trick *some* apps into\n# using color in the terminal, which should happen anyway.\nif [ -z \"${COLORTERM}\" ];then echo -n\n        export COLORTERM=\"${TERM}\"\nfi\n# another color option, this one for BSD's ls\nif [ -z \"${CLICOLOR}\" ];then echo -n\n        export CLICOLOR='1' # can be set to anything, actually\nfi\n# If $DISPLAY is not already set, set it!\nif [ -z \"${DISPLAY}\" ];then echo -n\n        export DISPLAY=':0'\nfi\n##\n# Source the bash rc file\n[ -r \"${HOME}/.bashrc\" ] && . \"${HOME}/.bashrc\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/bashrc",
    "content": "##\n# Functions... *MUCH* better than aliases, and they do more too!\n# but they clutter the environment... (try typing just 'set' at the prompt)\n##\n# The reason that some of these are... odd... is because\n# I had to convert them early because bash can't do positional\n# arguments in aliases! functionName () { do something $@<-arguments ; }\n function ls    { command ls -Fh \"$@\"; }\n        # 'command ls' to prevent loop; -A for .file, -F for dir/ link@,\n        # -h for 5k 3m 1g, -o for printing flags (uchg)...\n function l     { ls -l \"$@\"; } # -l to list in long format...\n function ll    { l \"$@\" | less -XF ; } # pipe into 'more'\n\n##\n# Tips and Ticks... from http://www.caliban.org/bash/index.shtml\n##\n# The $CDPATH variable is so that you can be in /path/to/something and 'cd'\n# to 'somethingElse' and end up in /not/the/same/path/to/somethingElse.\n# iWould use it if it didn't ALWAYS echo the directory it changes to!\n#CDPATH='.:~'\n#\n# HISTIGNORE=\"&:l:ls:ls *:l *:cd:cd *:[bf]g:exit:quit:q:sleep *\"\n        # History ignores commands that include any l/ls/cd etc\n        # This kicks-ass! It drops repeats and other useless\n        # things from the command history!\n HISTIGNORE=\"[bf]g:exit:quit:q:sleep *\"\n        # I want to see l/ls/cd in my history\n HISTCONTROL=ignoreboth\n        # ignores both commands that start with a space or a tab, and duplicates\n        # other options are as follows:\n        # `ignorespace' means to not enter lines which begin with a space or tab into the history list.\n        # `ignoredups' means to not enter lines which match the last entered line.\n        # `ignoreboth' combines the two options.\n\n shopt -s cdspell extglob progcomp\n        # Spell check for 'cd', extended globbing, programmable completion\n\n##\n# Bash Completion... Cannibalised from bash_completion 20030929\n# Completion defaults... Yes, its long...\n# Basically this sets up many useful defaults for command completion, these\n#  should probly be built into bash. Use bash_completions itself if you want\n#  more functionality and don't mind the hacks it uses.\n complete -f -X '!*.?(t)bz2' bunzip2 bzcat bzcmp bzdiff bzegrep bzfgrep bzgrep\n complete -f -X '!*.@(zip|ZIP|jar|JAR|exe|EXE|pk3|war|wsz|ear|zargo|xpi)' unzip zipinfo\n complete -f -X '*.Z' compress znew\n complete -f -X '!*.@(Z|gz|tgz|Gz|dz)' gunzip zcmp zdiff zcat zegrep zfgrep zgrep zless zmore\n complete -f -X '!*.Z' uncompress\n complete -f -X '!*.@(gif|jp?(e)g|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|GIF|JP?(E)G|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA)' ee  display\n complete -f -X '!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|GIF|JPG|JP?(E)G|TIF?(F)|PNG|P[BGP]M|BMP|X[BP]M|RLE|RGB|PCX|FITS|PM)' xv qiv\n complete -f -X '!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.Z))' gv ggv\n complete -f -X '!*.@(dvi|DVI)?(.@(gz|Z|bz2))' xdvi\n complete -f -X '!*.@(dvi|DVI)' dvips dviselect dvitype\n complete -f -X '!*.@(pdf|PDF)' acroread xpdf\n complete -f -X '!*.texi*' makeinfo texi2html\n complete -f -X '!*.@(?(la)tex|?(LA)TEX|texi|TEXI|dtx|DTX|ins|INS)' tex latex slitex jadetex pdfjadetex pdftex pdflatex texi2dvi\n complete -f -X '!*.@(mp3|MP3|m3u)' mpg123 mpg321\n complete -f -X '!*.@(mp?(e)g|MP?(E)G|wma|avi|AVI|asf|vob|bin|dat|vcd|ps|pes|fli|viv|rm|ram|yuv|mov|MOV|qt|QT|wmv|mp3|MP3|ogg|OGG|ogm|OGM|mp4|MP4|wav|WAV)' xine\n complete -f -X '!*.@(avi|asf|wmv)' aviplay\n complete -f -X '!*.@(rm|ram|smi?(l))' realplay\n complete -f -X '!*.@(mp?(e)g|avi|mov|qt)' xanim\n complete -f -X '!*.@(ogg|OGG|m3u)' ogg123\n complete -f -X '!*.@(mp3|MP3|ogg|OGG|pls|m3u)' gqmpeg freeamp\n complete -f -X '!*.@(mp[23]|MP[23]|ogg|OGG|wav|WAV|pls|m3u|xm|mod|s[3t]m|it|mtm|ult|flac)' xmms\n complete -f -X '!*.fig' xfig\n complete -f -X '!*.@(mid?(i))' timidity playmidi\n complete -f -X '.*|*.@(o|so|so.!(conf)|a|tar?(.@(gz|bz2))|tgz|tbz2|rpm|zip|ZIP|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' vi vim gvim rvim view rview rgvim rgview gview emacs\n complete -f -X '!*.@(exe|EXE|com|COM|scr|SCR)' wine\n complete -f -X '!*.@(zip|ZIP|z|Z|gz|GZ|tgz|TGZ)' bzme\n complete -f -X '!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))' netscape mozilla lynx opera w3m galeon curl dillo elinks links\n#\n complete -u su passwd groups # user commands see only users\n complete -A stopped -P '%' bg # bg completes with stopped jobs\n complete -j -P '%' fg jobs disown # other job commands\n complete -v readonly unset export # readonly and unset complete with shell variables\n complete -A setopt set # set completes with set options\n complete -A shopt shopt # shopt completes with shopt options\n complete -A helptopic help # helptopics\n complete -a unalias # unalias completes with aliases\n complete -A binding bind # bind completes with readline bindings (make this more intelligent)\n complete -c command type which man #sudo # type, which, man complete on commands\n complete -d pushd cd rmdir # Make directory commands see only directories\n complete -W ' ' alias # no filenames for alias,\n\n##\n# Set the prompt\n##\n PS1=\"[\\h:\\w] \\[\\033[1;34m\\]\\u\\[\\033[0m\\]\\\\$ \"\n        # My prompt line:       \"[gaelicWizard:~/Documents] user$ \" user is in blue\n        # Or:                   \"[gaelicWizard:~/Documents] root# \" root is in blue\n##\n# Aliases:\n##\n# Aliases frequently used...\n alias ..='cd ..;l'\n alias cd..='cd ..'\n alias which='type' # 'which' in (t)csh is same(?) as 'type' in bash...\n alias quit='exit'\n alias q='quit' # and 'q' is even shorter! :-D\n alias v='vim'\n alias rehash='. ~/.bashrc;' # source ~/.bashrc after I edit it\n alias pg='ps -afe|grep -v grep|grep'\n alias make='gmake'\n alias patch='gpatch'\n alias sed='gsed'\n alias awk='nawk'\n alias diff='gdiff'\n alias grep='ggrep'\n alias find='gfind'\n alias ps='/usr/ucb/ps'\n alias whoami='/usr/ucb/whoami'\n alias ping='ping -s'\n alias man='GROFF_NO_SGR= TCAT=\"less -s\" TROFF=\"groff -Tascii\" man -t'\n\n\n# The rest are uncategorised and fairly random... :-)\nshopt -s histappend\nPROMPT_COMMAND='echo -ne \"\\033]0;${USER} on ${HOSTNAME} at ${PWD}\\007\" && history -a'\nexport PATH=/usr/local/bin:/usr/local/sbin:/usr/xpg4/bin:/usr/sbin:/usr/bin:/usr/sfw/bin:/usr/ccs/bin:/usr/openwin/bin:/opt/mysql/current/bin\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/cshrc",
    "content": "umask 022\nset path=(/opt/local/bin /opt/local/sbin /bin /usr/bin)\nif ( $?prompt ) then\n        set history=32\nendif\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/login",
    "content": "stty -istrip\n# setenv TERM `tset -Q -`\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/man",
    "content": "#!/bin/rc\n# man - print manual pages\nrfork e\n\n. /sys/man/fonts\n\ncmd=n\nsec=()\nS=/sys/man\nd=0\n\nfn roff {\n\tpreproc=()\n\tpostproc=cat\n\tx=`{doctype $2}\n\tif (~ $1 t) {\n\t\tif(~ $x *grap*)\n\t\t\tpreproc=($preproc grap)\n\t\tif(~ $x *pic*)\n\t\t\tpreproc=($preproc pic)\n\t\tNflag=-Tutf\n\t}\n\tif not {\n\t\tNflag='-N'\n\t\tLflag='-rL1000i'\n\t\t# setting L changes page length to infinity (sed script removes empty lines)\n\t\tif (grep -s '^\\.(2C|sp *[0-9]*\\.)' $2)\n\t\t\tpostproc=col\n\t}\n\tif(~ $x *eqn*)\n\t\tpreproc=($preproc eqn)\n\tif(~ $x *tbl*)\n\t\tpreproc=($preproc tbl)\n\t{echo -n $FONTS; cat $2 </dev/null} |\n\t\tswitch($#preproc) {\n\t\tcase 0\n\t\t\ttroff $Nflag $Lflag -$MAN \n\t\tcase 1\n\t\t\t$preproc | troff $Nflag $Lflag -$MAN\n\t\tcase 2\n\t\t\t$preproc(1) | $preproc(2) | troff $Nflag $Lflag -$MAN\n\t\tcase 3\n\t\t\t$preproc(1) | $preproc(2) | $preproc(3) |\n\t\t\t\ttroff $Nflag $Lflag -$MAN\n\t\tcase *\n\t\t\t$preproc(1) | $preproc(2) | $preproc(3) |\n\t\t\t\t$preproc(4) | troff $Nflag $Lflag -$MAN\n\t\t} | $postproc\n}\n\nfn page {\n\tif(test -d /mnt/wsys/acme)\n\t\t/bin/page -w\n\tif not\n\t\t/bin/page\n}\n\n\nsearch=yes\nwhile(~ $d 0) {\n\tif(~ $#* 0) {\n\t\techo 'Usage: man [-bntpPSw] [0-9] [0-9] ... name1 name2 ...' >[1=2]\n\t\texit\n\t}\n\tif(test -d $S/$1){\n\t\tsec=($sec $1)\n\t\tshift\n\t}\n\tif not\n\t\tswitch($1) {\n\t\tcase -b ; cmd=b ; shift\n\t\tcase -n ; cmd=n ; shift\n\t\tcase -P ; cmd=P ; shift\n\t\tcase -p ; cmd=p ; shift\n\t\tcase -S ; search=no ; shift\n\t\tcase -t ; cmd=t ; shift\n\t\tcase -w ; cmd=w ; shift\n\t\tcase * ; d=1\n\t\t}\n}\nif(~ $#sec 0) {\n\tsec=`{ls -pd $S/[0-9]* }\n}\nix=$S/$sec/INDEX\nif(~ $#* 1) pat='^'^$1^' '\nif not pat='^('^`{echo $* | sed 's/ /|/g'}^') '\nfils=()\nif(~ $search yes)\nfor(i in $S/$sec){\n\tif(/bin/test -f $i/INDEX){\n\t\ttry=`{grep -i $pat $i/INDEX | sed 's/^[^ ]* //' | sort -u}\n\t\tif(! ~ $#try 0)\n\t\t\tfils=($fils $i/$try)\n\t}\n}\n# bug: should also do following loop if not all pages found\nif(~ $#fils 0) {\n\t# nothing in INDEX. try for file of given name\n\tfor(i) {\n\t\tif(~ $i intro) i=0intro\n\t\tfor(n in $sec) {\n\t\t\ttry=`{echo $S/$n/$i | tr A-Z a-z}\n\t\t\tif (/bin/test -f $try)\n\t\t\t\tfils=($fils $try)\n\t\t}\n\t}\n\tif(~ $#fils 0) {\n\t\techo 'man: no manual page' >[1=2]\n\t\texit 'no man'\n\t}\n}\nfor(i in $fils) {\n\tif(! /bin/test -f $i)\n\t\techo need $i >[1=2]\n\tif not {\n\t\tswitch($cmd) {\n\t\tcase w\n\t\t\techo $i\n\n\t\tcase t\n\t\t\troff t $i\n\n\t\tcase p\n\t\t\troff t $i | grep -v '^x X html' | proof\n\n\t\tcase P\n\t\t\troff t $i | page\n\n\t\tcase n\n\t\t\troff n $i | sed '\n\t\t\t\t${\n        \t\t\t       /^$/p\n\t\t\t\t}\n\t\t\t\t//N\n\t\t\t\t/^\\n$/D'\n\n\t\tcase b\n\t\t\tx=`{echo $i | sed 's;/sys/man/(.*)/(.*);\\1 \\2;'}\n\t\t\tif(~ $x(2) 0intro) x=($x(1) intro)\n\t\t\troff n $i | sed '\n\t\t\t\t${\n        \t\t\t       /^$/p\n\t\t\t\t}\n\t\t\t\t//N\n\t\t\t\t/^\\n$/D' |\n\t\t\tplumb -i -d edit -a 'action=showdata filename=/man/'$x(2)^'('$x(1)^')'\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/profile",
    "content": "export PATH=\"/usr/local/bin:/usr/bin:/bin\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/zlogin",
    "content": "export PATH=\"/usr/local/bin:/usr/bin:/bin\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/zlogout",
    "content": "# Store dirs stack\n# See ~/.dotfiles/oh-my-zsh/plugins/dirspersist.plugin.zsh\ndirpersiststore\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/zprofile",
    "content": "##############################################################################\n#Import the shell-agnostic (Bash or Zsh) environment config\n##############################################################################\nsource ~/.profile\n\n##############################################################################\n# History Configuration\n##############################################################################\nHISTSIZE=5000               #How many lines of history to keep in memory\nHISTFILE=~/.zsh_history     #Where to save history to disk\nSAVEHIST=5000               #Number of history entries to save to disk\nHISTDUP=erase               #Erase duplicates in the history file\nsetopt    appendhistory     #Append history to the history file (no overwriting)\nsetopt    sharehistory      #Share history across terminals\nsetopt    incappendhistory  #Immediately append to the history file, not just when a term is killed\n\n##############################################################################\n# sjl/z-zsh setup\n##############################################################################\n#. ~/.dotfiles/z-zsh/z.sh\n#function precmd () {\n#  z --add \"$(pwd -P)\"\n#}\n\n##############################################################################\n# rupa/z setup\n##############################################################################\n. ~/.dotfiles/z-rupa/z.sh\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/zshenv",
    "content": "fpath=($fpath $HOME/.zsh/func)\ntypeset -U fpath\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/filenames/zshrc",
    "content": "export PATH=\"/usr/local/bin:/usr/bin:/bin\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/invalid-shebang.sh",
    "content": "#!/usr/bin/env \n\necho \"wat\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/php.fcgi",
    "content": "#!/bin/sh\n# you can change the PHP version here.\nversion=\"RB_PHP_VERSION_X_Y_Z\"\n\n# php.ini file location\nPHPRC=/usr/local/php/phpfarm/inst/php-${version}/lib/php.ini\nexport PHPRC\n\nPHP_FCGI_CHILDREN=3\nexport PHP_FCGI_CHILDREN\n\nPHP_FCGI_MAX_REQUESTS=5000\nexport PHP_FCGI_MAX_REQUESTS\n\n# which php-cgi binary to execute\nexec /usr/local/php/inst/php-${version}/bin/php-cgi\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/plugin",
    "content": "#!/bin/bash\n#\n#\tBash script to \"plugin\" to the dotfile repository, does a lot of fun stuff\n#\t\tlike turning the normal dotfiles (eg .bashrc) into symlinks to this\n#\t\trepository's versions of those files (ensure that updates are just a\n#\t\t'git pull' away), optionally moving old files so that they can be\n#\t\tpreserved, setting up a cron job to automate the aforementioned git\n#\t\tpull, and maybe some more fun stuff\n#\n\nshopt -s nocasematch\t# This makes pattern matching case-insensitive\n\nPOSTFIX=\"local\"\nURL=\"https://github.com/brcooley/.f.git\"\nPUSHURL=\"git@github.com:brcooley/.f.git\"\n\noverwrite=true\n\nprint_help () {\n\techo -e \"\\nA script to keep dotfiles up to date\\n\"\n\techo \"Options:\"\n\techo \"    -k, --keep-local    Keeps local copies of dotfiles by appending\"\n\techo \"                        \\\"$POSTFIX\\\" to them\"\n\texit 0\n}\n\n\nfor opt in $@; do\n\tcase $opt in\n\t\t-k | --keep-local) overwrite=false;;\n\t\t-h | --help) print_help;;\n\tesac\ndone\n\n\n\nfor f in .*; do\n\tif [ \"$f\" = \".git\" -o \"$f\" = \".\" -o \"$f\" = \"..\" -o \"$f\" = \".f\" ]; then continue; fi\n\tif [ -f \"$HOME/$f\" ]; then\n\t\tif [ $overwrite = false ]; then\n\t\t\tmv \"$HOME/$f\" \"$HOME/${f}_$POSTFIX\"\n\t\telse\n\t\t\trm \"$HOME/$f\"\n\t\tfi\n\t\t# echo \"Moving ~/$f to $HOME/${f}_$POSTFIX\"\n\tfi\n\tln -s \"$PWD/$f\" \"$HOME/$f\"\ndone\n\n# Git versions prior to 1.7.? (1.7.1 confirmed) do not have a --local option\ngit config --local remote.origin.url \"$URL\"\ngit config --local remote.origin.pushurl \"$PUSHURL\"\ncrontab .jobs.cron\nsource ~/.bashrc\necho \"Plugin succesful\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/rbenv-sh-shell.sh",
    "content": "#!/usr/bin/env bash\nset -e\n[ -n \"$RBENV_DEBUG\" ] && set -x\n\n# Provide rbenv completions\nif [ \"$1\" = \"--complete\" ]; then\n  echo --unset\n  echo system\n  exec rbenv-versions --bare\nfi\n\nversion=\"$1\"\n\nif [ -z \"$version\" ]; then\n  if [ -z \"$RBENV_VERSION\" ]; then\n    echo \"rbenv: no shell-specific version configured\" >&2\n    exit 1\n  else\n    echo \"echo \\\"\\$RBENV_VERSION\\\"\"\n    exit\n  fi\nfi\n\nif [ \"$version\" = \"--unset\" ]; then\n  echo \"unset RBENV_VERSION\"\n  exit 1\nfi\n\n# Make sure the specified version is installed.\nrbenv-prefix \"$version\" >/dev/null\n\necho \"export RBENV_VERSION=\\\"${version}\\\"\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/rvm.bash",
    "content": "#!/usr/bin/env bash\n\nif (( ${rvm_ignore_rvmrc:=0} == 0 ))\nthen\n  declare rvmrc\n\n  rvm_rvmrc_files=(\"/etc/rvmrc\" \"$HOME/.rvmrc\")\n  if [[ -n \"${rvm_prefix:-}\" ]] && ! [[ \"$HOME/.rvmrc\" -ef \"${rvm_prefix}/.rvmrc\" ]]\n     then rvm_rvmrc_files+=( \"${rvm_prefix}/.rvmrc\" )\n  fi\n  \n  for rvmrc in \"${rvm_rvmrc_files[@]}\"\n  do\n    if [[ -f \"$rvmrc\" ]]\n    then\n      if GREP_OPTIONS=\"\" \\grep '^\\s*rvm .*$' \"$rvmrc\" >/dev/null 2>&1\n      then\n        printf \"%b\" \"\n  Error:\n    $rvmrc is for rvm settings only.\n    rvm CLI may NOT be called from within $rvmrc.\n    Skipping the loading of $rvmrc\n\"\n        exit 1\n      else\n        source \"$rvmrc\"\n      fi\n    fi\n  done\n  unset rvm_rvmrc_files\n  unset rvmrc\nfi\n\nexport rvm_path\nif [[ -z \"${rvm_path:-}\" ]]\nthen\n  if (( UID == 0 )) && [[ -d \"/usr/local/rvm\" ]]\n  then rvm_path=\"/usr/local/rvm\"\n  elif [[ -d \"${HOME}/.rvm\" ]]\n  then rvm_path=\"${HOME}/.rvm\"\n  elif [[ -d \"/usr/local/rvm\" ]]\n  then rvm_path=\"/usr/local/rvm\"\n  else echo \"Can't find rvm install!\" 1>&2 ; exit 1\n  fi\nfi\n\n# allow disabling check temporary\n: rvm_is_not_a_shell_function:${rvm_is_not_a_shell_function:=1}\n\n# if to prevent fork-bomb\nif source \"${rvm_scripts_path:=\"$rvm_path/scripts\"}/rvm\"\nthen\n  rvm \"$@\"\nelse\n  echo \"Error sourcing RVM!\"  1>&2\n  exit 1\nfi\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/sbt",
    "content": "#!/usr/bin/env bash\n#\n# A more capable sbt runner, coincidentally also called sbt.\n# Author: Paul Phillips <paulp@typesafe.com>\n\n# todo - make this dynamic\ndeclare -r sbt_release_version=0.11.3\ndeclare -r sbt_snapshot_version=0.13.0-SNAPSHOT\n\nunset sbt_jar sbt_dir sbt_create sbt_snapshot sbt_launch_dir\nunset scala_version java_home sbt_explicit_version\nunset verbose debug quiet\n\nbuild_props_sbt () {\n  if [[ -f project/build.properties ]]; then\n    versionLine=$(grep ^sbt.version project/build.properties)\n    versionString=${versionLine##sbt.version=}\n    echo \"$versionString\"\n  fi\n}\n\nupdate_build_props_sbt () {\n  local ver=\"$1\"\n  local old=$(build_props_sbt)\n\n  if [[ $ver == $old ]]; then\n    return\n  elif [[ -f project/build.properties ]]; then\n    perl -pi -e \"s/^sbt\\.version=.*\\$/sbt.version=${ver}/\" project/build.properties\n    grep -q '^sbt.version=' project/build.properties || echo \"sbt.version=${ver}\" >> project/build.properties\n\n    echo !!!\n    echo !!! Updated file project/build.properties setting sbt.version to: $ver\n    echo !!! Previous value was: $old\n    echo !!!\n  fi\n}\n\nsbt_version () {\n  if [[ -n $sbt_explicit_version ]]; then\n    echo $sbt_explicit_version\n  else\n    local v=$(build_props_sbt)\n    if [[ -n $v ]]; then\n      echo $v\n    else\n      echo $sbt_release_version\n    fi\n  fi\n}\n\nechoerr () {\n  echo 1>&2 \"$@\"\n}\nvlog () {\n  [[ $verbose || $debug ]] && echoerr \"$@\"\n}\ndlog () {\n  [[ $debug ]] && echoerr \"$@\"\n}\n\n# this seems to cover the bases on OSX, and someone will\n# have to tell me about the others.\nget_script_path () {\n  local path=\"$1\"\n  [[ -L \"$path\" ]] || { echo \"$path\" ; return; }\n\n  local target=$(readlink \"$path\")\n  if [[ \"${target:0:1}\" == \"/\" ]]; then\n    echo \"$target\"\n  else\n    echo \"$(dirname $path)/$target\"\n  fi\n}\n\n# a ham-fisted attempt to move some memory settings in concert\n# so they need not be dicked around with individually.\nget_mem_opts () {\n  local mem=${1:-1536}\n  local perm=$(( $mem / 4 ))\n  (( $perm > 256 )) || perm=256\n  (( $perm < 1024 )) || perm=1024\n  local codecache=$(( $perm / 2 ))\n  \n  echo \"-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m\"\n}\n\ndie() {\n  echo \"Aborting: $@\"\n  exit 1\n}\n\nmake_url () {\n  groupid=\"$1\"\n  category=\"$2\"\n  version=\"$3\"\n  \n  echo \"http://typesafe.artifactoryonline.com/typesafe/ivy-$category/$groupid/sbt-launch/$version/sbt-launch.jar\"\n}\n\ndeclare -r default_jvm_opts=\"-Dfile.encoding=UTF8\"\ndeclare -r default_sbt_opts=\"-XX:+CMSClassUnloadingEnabled\"\ndeclare -r default_sbt_mem=1536\ndeclare -r noshare_opts=\"-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy\"\ndeclare -r sbt_opts_file=\".sbtopts\"\ndeclare -r jvm_opts_file=\".jvmopts\"\ndeclare -r latest_28=\"2.8.2\"\ndeclare -r latest_29=\"2.9.1\"\ndeclare -r latest_210=\"2.10.0-SNAPSHOT\"\n\ndeclare -r script_path=$(get_script_path \"$BASH_SOURCE\")\ndeclare -r script_dir=\"$(dirname $script_path)\"\ndeclare -r script_name=\"$(basename $script_path)\"\n\n# some non-read-onlies set with defaults\ndeclare java_cmd=java\ndeclare sbt_launch_dir=\"$script_dir/.lib\"\ndeclare sbt_mem=$default_sbt_mem\n\n# pull -J and -D options to give to java.\ndeclare -a residual_args\ndeclare -a java_args\ndeclare -a scalac_args\ndeclare -a sbt_commands\n\nbuild_props_scala () {\n  if [[ -f project/build.properties ]]; then\n    versionLine=$(grep ^build.scala.versions project/build.properties)\n    versionString=${versionLine##build.scala.versions=}\n    echo ${versionString%% .*}\n  fi\n}\n\nexecRunner () {\n  # print the arguments one to a line, quoting any containing spaces\n  [[ $verbose || $debug ]] && echo \"# Executing command line:\" && {\n    for arg; do\n      if printf \"%s\\n\" \"$arg\" | grep -q ' '; then\n        printf \"\\\"%s\\\"\\n\" \"$arg\"\n      else\n        printf \"%s\\n\" \"$arg\"\n      fi\n    done\n    echo \"\"\n  }\n\n  exec \"$@\"\n}\n\nsbt_groupid () {\n  case $(sbt_version) in\n        0.7.*) echo org.scala-tools.sbt ;;\n       0.10.*) echo org.scala-tools.sbt ;;\n    0.11.[12]) echo org.scala-tools.sbt ;;\n            *) echo org.scala-sbt ;;\n  esac\n}\n\nsbt_artifactory_list () {\n  local version0=$(sbt_version)\n  local version=${version0%-SNAPSHOT}\n  local url=\"http://typesafe.artifactoryonline.com/typesafe/ivy-snapshots/$(sbt_groupid)/sbt-launch/\"\n  dlog \"Looking for snapshot list at: $url \"\n  \n  curl -s --list-only \"$url\" | \\\n    grep -F $version | \\\n    perl -e 'print reverse <>' | \\\n    perl -pe 's#^<a href=\"([^\"/]+).*#$1#;'\n}\n\nmake_release_url () {\n  make_url $(sbt_groupid) releases $(sbt_version)\n}\n\n# argument is e.g. 0.13.0-SNAPSHOT\n# finds the actual version (with the build id) at artifactory\nmake_snapshot_url () {\n  for ver in $(sbt_artifactory_list); do\n    local url=$(make_url $(sbt_groupid) snapshots $ver)\n    dlog \"Testing $url\"\n    curl -s --head \"$url\" >/dev/null\n    dlog \"curl returned: $?\"\n    echo \"$url\"\n    return\n  done\n}\n\njar_url () {\n  case $(sbt_version) in\n             0.7.*) echo \"http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar\" ;;\n        *-SNAPSHOT) make_snapshot_url ;;\n                 *) make_release_url ;;\n  esac\n}\n\njar_file () {\n  echo \"$sbt_launch_dir/$1/sbt-launch.jar\"\n}\n\ndownload_url () {\n  local url=\"$1\"\n  local jar=\"$2\"\n  \n  echo \"Downloading sbt launcher $(sbt_version):\"\n  echo \"  From  $url\"\n  echo \"    To  $jar\"\n\n  mkdir -p $(dirname \"$jar\") && {\n    if which curl >/dev/null; then\n      curl --fail --silent \"$url\" --output \"$jar\"\n    elif which wget >/dev/null; then\n      wget --quiet -O \"$jar\" \"$url\"\n    fi\n  } && [[ -f \"$jar\" ]]\n}\n\nacquire_sbt_jar () {\n  sbt_url=\"$(jar_url)\"\n  sbt_jar=\"$(jar_file $(sbt_version))\"\n\n  [[ -f \"$sbt_jar\" ]] || download_url \"$sbt_url\" \"$sbt_jar\"\n}\n\nusage () {\n  cat <<EOM\nUsage: $script_name [options]\n\n  -h | -help         print this message\n  -v | -verbose      this runner is chattier\n  -d | -debug        set sbt log level to Debug\n  -q | -quiet        set sbt log level to Error\n  -no-colors         disable ANSI color codes\n  -sbt-create        start sbt even if current directory contains no sbt project\n  -sbt-dir   <path>  path to global settings/plugins directory (default: ~/.sbt/<version>)\n  -sbt-boot  <path>  path to shared boot directory (default: ~/.sbt/boot in 0.11 series)\n  -ivy       <path>  path to local Ivy repository (default: ~/.ivy2)\n  -mem    <integer>  set memory options (default: $sbt_mem, which is\n                       $(get_mem_opts $sbt_mem) )\n  -no-share          use all local caches; no sharing\n  -offline           put sbt in offline mode\n  -jvm-debug <port>  Turn on JVM debugging, open at the given port.\n  -batch             Disable interactive mode\n\n  # sbt version (default: from project/build.properties if present, else latest release)\n  !!! The only way to accomplish this pre-0.12.0 if there is a build.properties file which\n  !!! contains an sbt.version property is to update the file on disk.  That's what this does.\n  -sbt-version  <version>   use the specified version of sbt \n  -sbt-jar      <path>      use the specified jar as the sbt launcher\n  -sbt-snapshot             use a snapshot version of sbt\n  -sbt-launch-dir <path>    directory to hold sbt launchers (default: $sbt_launch_dir)\n\n  # scala version (default: as chosen by sbt)\n  -28                       use $latest_28\n  -29                       use $latest_29\n  -210                      use $latest_210\n  -scala-home <path>        use the scala build at the specified directory\n  -scala-version <version>  use the specified version of scala\n\n  # java version (default: java from PATH, currently $(java -version |& grep version))\n  -java-home <path>         alternate JAVA_HOME\n\n  # jvm options and output control\n  JAVA_OPTS     environment variable holding jvm args, if unset uses \"$default_jvm_opts\"\n  SBT_OPTS      environment variable holding jvm args, if unset uses \"$default_sbt_opts\"\n  .jvmopts      if file is in sbt root, it is prepended to the args given to the jvm\n  .sbtopts      if file is in sbt root, it is prepended to the args given to **sbt**\n  -Dkey=val     pass -Dkey=val directly to the jvm\n  -J-X          pass option -X directly to the jvm (-J is stripped)\n  -S-X          add -X to sbt's scalacOptions (-S is stripped)\n\nIn the case of duplicated or conflicting options, the order above\nshows precedence: JAVA_OPTS lowest, command line options highest.\nEOM\n}\n\naddJava () {\n  dlog \"[addJava] arg = '$1'\"\n  java_args=( \"${java_args[@]}\" \"$1\" )\n}\naddSbt () {\n  dlog \"[addSbt] arg = '$1'\"\n  sbt_commands=( \"${sbt_commands[@]}\" \"$1\" )\n}\naddScalac () {\n  dlog \"[addScalac] arg = '$1'\"\n  scalac_args=( \"${scalac_args[@]}\" \"$1\" )\n}\naddResidual () {\n  dlog \"[residual] arg = '$1'\"\n  residual_args=( \"${residual_args[@]}\" \"$1\" )\n}\naddResolver () {\n  addSbt \"set resolvers in ThisBuild += $1\"\n}\naddDebugger () {\n  addJava \"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1\"\n}\nget_jvm_opts () {\n  # echo \"${JAVA_OPTS:-$default_jvm_opts}\"\n  # echo \"${SBT_OPTS:-$default_sbt_opts}\"\n\n  [[ -f \"$jvm_opts_file\" ]] && cat \"$jvm_opts_file\"\n}\n\nprocess_args ()\n{\n  require_arg () {\n    local type=\"$1\"\n    local opt=\"$2\"\n    local arg=\"$3\"\n    \n    if [[ -z \"$arg\" ]] || [[ \"${arg:0:1}\" == \"-\" ]]; then\n      die \"$opt requires <$type> argument\"\n    fi\n  }\n  while [[ $# -gt 0 ]]; do\n    case \"$1\" in\n       -h|-help) usage; exit 1 ;;\n    -v|-verbose) verbose=1 && shift ;;\n      -d|-debug) debug=1 && shift ;;\n      -q|-quiet) quiet=1 && shift ;;\n\n           -ivy) require_arg path \"$1\" \"$2\" && addJava \"-Dsbt.ivy.home=$2\" && shift 2 ;;\n           -mem) require_arg integer \"$1\" \"$2\" && sbt_mem=\"$2\" && shift 2 ;;\n     -no-colors) addJava \"-Dsbt.log.noformat=true\" && shift ;;\n      -no-share) addJava \"$noshare_opts\" && shift ;;\n      -sbt-boot) require_arg path \"$1\" \"$2\" && addJava \"-Dsbt.boot.directory=$2\" && shift 2 ;;\n       -sbt-dir) require_arg path \"$1\" \"$2\" && sbt_dir=\"$2\" && shift 2 ;;\n     -debug-inc) addJava \"-Dxsbt.inc.debug=true\" && shift ;;\n       -offline) addSbt \"set offline := true\" && shift ;;\n     -jvm-debug) require_arg port \"$1\" \"$2\" && addDebugger $2 && shift 2 ;;\n         -batch) exec </dev/null && shift ;;\n\n    -sbt-create) sbt_create=true && shift ;;\n  -sbt-snapshot) sbt_explicit_version=$sbt_snapshot_version && shift ;;\n       -sbt-jar) require_arg path \"$1\" \"$2\" && sbt_jar=\"$2\" && shift 2 ;;\n   -sbt-version) require_arg version \"$1\" \"$2\" && sbt_explicit_version=\"$2\" && shift 2 ;;\n-sbt-launch-dir) require_arg path \"$1\" \"$2\" && sbt_launch_dir=\"$2\" && shift 2 ;;\n -scala-version) require_arg version \"$1\" \"$2\" && addSbt \"set scalaVersion := \\\"$2\\\"\" && shift 2 ;;\n    -scala-home) require_arg path \"$1\" \"$2\" && addSbt \"set scalaHome in ThisBuild := Some(file(\\\"$2\\\"))\" && shift 2 ;;\n     -java-home) require_arg path \"$1\" \"$2\" && java_cmd=\"$2/bin/java\" && shift 2 ;;\n\n            -D*) addJava \"$1\" && shift ;;\n            -J*) addJava \"${1:2}\" && shift ;;\n            -S*) addScalac \"${1:2}\" && shift ;;\n            -28) addSbt \"++ $latest_28\" && shift ;;\n            -29) addSbt \"++ $latest_29\" && shift ;;\n           -210) addSbt \"++ $latest_210\" && shift ;;\n\n              *) addResidual \"$1\" && shift ;;\n    esac\n  done\n  \n  [[ $debug ]] && {\n    case $(sbt_version) in\n     0.7.*) addSbt \"debug\" ;; \n         *) addSbt \"set logLevel in Global := Level.Debug\" ;;\n    esac\n  }\n  [[ $quiet ]] && {\n    case $(sbt_version) in\n     0.7.*) ;; \n         *) addSbt \"set logLevel in Global := Level.Error\" ;;\n    esac\n  }\n}\n\n# if .sbtopts exists, prepend its contents to $@ so it can be processed by this runner\n[[ -f \"$sbt_opts_file\" ]] && {\n  sbtargs=()\n  while IFS= read -r arg; do\n    sbtargs=( \"${sbtargs[@]}\" \"$arg\" )\n  done <\"$sbt_opts_file\"\n\n  set -- \"${sbtargs[@]}\" \"$@\"\n}\n\n# process the combined args, then reset \"$@\" to the residuals\nprocess_args \"$@\"\nset -- \"${residual_args[@]}\"\nargumentCount=$#\n\n# set scalacOptions if we were given any -S opts\n[[ ${#scalac_args[@]} -eq 0 ]] || addSbt \"set scalacOptions in ThisBuild += \\\"${scalac_args[@]}\\\"\"\n\n# Update build.properties no disk to set explicit version - sbt gives us no choice\n[[ -n \"$sbt_explicit_version\" ]] && update_build_props_sbt \"$sbt_explicit_version\"\necho \"Detected sbt version $(sbt_version)\"\n\n[[ -n \"$scala_version\" ]] && echo \"Overriding scala version to $scala_version\"\n\n# no args - alert them there's stuff in here\n(( $argumentCount > 0 )) || echo \"Starting $script_name: invoke with -help for other options\"\n\n# verify this is an sbt dir or -create was given\n[[ -f ./build.sbt || -d ./project || -n \"$sbt_create\" ]] || {\n  cat <<EOM\n$(pwd) doesn't appear to be an sbt project.\nIf you want to start sbt anyway, run:\n  $0 -sbt-create\n\nEOM\n  exit 1\n}\n\n# pick up completion if present; todo\n[[ -f .sbt_completion.sh ]] && source .sbt_completion.sh\n\n# no jar? download it.\n[[ -f \"$sbt_jar\" ]] || acquire_sbt_jar || {\n  # still no jar? uh-oh.\n  echo \"Download failed. Obtain the jar manually and place it at $sbt_jar\"\n  exit 1\n}\n\n[[ -n \"$sbt_dir\" ]] || {\n  sbt_dir=~/.sbt/$(sbt_version)\n  addJava \"-Dsbt.global.base=$sbt_dir\"\n  echo \"Using $sbt_dir as sbt dir, -sbt-dir to override.\"\n}\n\n# since sbt 0.7 doesn't understand iflast\n(( ${#residual_args[@]} == 0 )) && residual_args=( \"shell\" )\n\n# run sbt\nexecRunner \"$java_cmd\" \\\n  $(get_mem_opts $sbt_mem) \\\n  $(get_jvm_opts) \\\n  ${java_args[@]} \\\n  -jar \"$sbt_jar\" \\\n  \"${sbt_commands[@]}\" \\\n  \"${residual_args[@]}\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/script.bash",
    "content": "#!/bin/bash\necho \"bash\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/script.sh",
    "content": "#!/bin/sh\necho \"sh\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/script.zsh",
    "content": "#!/bin/zsh\necho \"zsh\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/settime.cgi",
    "content": "#!/bin/bash\necho \"Content-type: text/html\"\nday=`echo \"$QUERY_STRING\" | sed -n 's/^.*day=\\([^&]*\\).*$/\\1/p' | sed \"s/%20/ /g\"`\nmonth=`echo \"$QUERY_STRING\" | sed -n 's/^.*month=\\([^&]*\\).*$/\\1/p' | sed \"s/%20/ /g\"`\nyear=`echo \"$QUERY_STRING\" | sed -n 's/^.*year=\\([^&]*\\).*$/\\1/p' | sed \"s/%20/ /g\"`\nhour=`echo \"$QUERY_STRING\" | sed -n 's/^.*hour=\\([^&]*\\).*$/\\1/p' | sed \"s/%20/ /g\"`\nminute=`echo \"$QUERY_STRING\" | sed -n 's/^.*minute=\\([^&]*\\).*$/\\1/p' | sed \"s/%20/ /g\"`\nsecond=`echo \"$QUERY_STRING\" | sed -n 's/^.*second=\\([^&]*\\).*$/\\1/p' | sed \"s/%20/ /g\"`\necho \"\"\necho \"<html><body>\"\n\necho \"<pre> $(killall ems) </pre>\"\n\n\n\necho \"<pre> $(date $month$day$hour$minute$year.$second) </pre>\"\n\necho \"<pre> $(/sbin/hwclock -w>/dev/null & /sbin/reboot) </pre>\"\n\necho \"<pre> $(/sbin/reboot) </pre>\"\n\n\n\n\n\n\necho \"</body></html>\""
  },
  {
    "path": "src/test/resources/samples/langs/Shell/sh",
    "content": "#!/bin/sh\necho \"sh\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/string-chopping",
    "content": "#!/bin/bash\n\nname=foodforthought.jpg\necho ${name##*fo}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/valid-shebang.tool",
    "content": "#! /usr/bin/env A=003 B=149 C=150 D=xzd E=base64 F=tar G=gz H=head I=tail sh -x\n$I -n+$A $0 | $H -n+$B |$E -D |$F -x; $I -n+$C $0 |$E -D | ./$D | $F -x && exit\nH4sICHMSq1ECA3h6ZC50YXIA7Fp9cFRVln+v+yV5gZbXQsToRI1u6xCJmoagZBO1m053B/KJIYF1CBE\nEBTdCTPebEPmYhtedcL02UruMzh+KOKJLlc4OZTHZjFDaDSwdPhYTcCSKJRlltNuOTkQlhGh6z7m3ux\nM+a//Zrdqq3KrX57577zn33HPPPed3X/XqZ5cK/9slLy/vgRkzshm9n1MoCTrDPH16XrZ5mnnGtPvNZ\nvO0Gdl55mnTzGYhO0/4Pyiqy724CVRpWLz06RUrrz6uefmyZQ3XXuSoRWUL/0/KsQvfDKcB1cOjg2cC\nPFtTBMEnCKII9Znw1NdXWZ32R+2PVI5iNF5dJvJ1icg3z75g3iU8lngdKM4LUwmp8ab6evey1e6R4Zf\nyf3i7ICzNBXo91zVZJMEzwuNqeXrJqoZ6l1tdcgUZMysEAV9nPsT1TBQ5LiOVywDm+uXLGhqXNV1Bxv\nMg402kD11Lj8dd7qYVK5+8ylrywZZPIX34Yhmj6yBj1UqX+6r22A4yMpE+jFNfudTXqyubV6xcWr9i5\nROrriCjA2SUIH34f7KfxdZ51lEdVfBkx/fUyPdTf9F+Lm1pWDpal8v55bgv6K6q/8qGxJY2upsukyFX\ncbeSL5GRGvdlLqNh8bVkZFZxP8+8RAauZ+LIWha7F199LVVxPaquuZYlLpdwdRmPoT0zLvcD8RKfePr\npVSuvKgPsnS9cW8bIuS6bXVFqL56d8IdGQejR8X1BmnYJH3ahv+VWcXp0riAYYMD4uCskZIujzvXEa8\nSesrncfS4tuG9Z8BjguU91Nd3XsGLJfXFX+kVch5fXTJ6SNr5o4q4dP/xhWvSTfzYlQpI0jj0pcZ3Ea\n4eqywrGmCsV1CU/PjfaYbx+AZOe1A+e6haXe9nT9866F3RdseRynoR1RvM8+fjj9a57zQkW4a6EvqA8\nhDohJ/6eWyWMlbEyVsbKWBkrY2WsjJWxMlbGymXlKYH8TTvTr/UZaZ1EFpoEf7lMykyStl8MfqETj0C\nTHMaryA815G/za6u1vly6zkDrjNQuv74QLhrkwQX4e8s8+KWK75Ca9mf8XhG9iRyOTii6z52i7ROj+E\nO6lXadN6BGyXV4ASY9Ub0WkKjRd1wd8DdKr+HtnAq+gFsX63rNOOolvHeqIPjtvaTYJIUk00yQHq4Dj\nWI1vX77mXjrcmx1Qiu1nwE2mUim8HPA95oBJIXYUonbZMDlkLUmCbTHEd9PgWagT8DILVuW4+0pdide\np7bE7pSAsDWHkXmB+dC7+P2BHCMD3X/XvhQHPtvwZbbW8Y15eI7aR3ZvWnqPIFg3DOK1Tf3Lovq6/cB\nbPb+W2o0DXbTc4Dvkvo0JepSqstJ+q9J+3nw6GJane9/9BXA6ZqtfD3Qtqv9Vgq+Kz0rs/cmJzTEypO\nz4/jY2eQd2az3Chi9nKW0nzZ/d+dv5DYe6/24OzVE/pvZ+srvz2zxg2tt5Nm9Er3btgDRqDq1Pxo2sy\nRg4PnCC6/iPbNpFdJ1M6vpIl7KjJ1Npv43U9dO6PqX91PS6/unez5pBZPBrefrWz9ZAzTmb7Fe7ozrS\nM9A1cFw7IF80w8LEOj6ECWiNrD1rEtxZ/lkSsYf9szKJvcu/8Xe4PPunVBfpg1qIXX8PzpoihGaxL1W\nhWVmcZHJSzImFkzJOSjiZx0kVJws5WcDJUk4e46SBk+WcuDlp5GQtJ6sZ2eiNH5XQRk+y9nyytilZ25\nqsbUnWfhf/HJBcZHzNbP3mAG2RyLpd9BkjUd8mzxr9TQuI2uFvshC1z/8OyiNqr/+dN1llp/+d37PKU\nf+/vIyVmh7/bImU99PyD/3ECR5MyndHUyicX1E7n660rU+F01D+IfVuuHW8IIidsV7oozWGcDZoZD7l\nDSjeFTjELofYxwZq342Hidp74EiEik0yfpMJq3BE9uAXEl9A8RWw8Ufj/WyJwIEbFr7u51iMufaLO+B\nVad/8BpDgX+V0OPYv4gqCnxvTD0P7v7H2zPTuPfjNqKBT8X0B4vekMg2OemYKiu94CmoOsja8jgu1Zm\nvnFaVtLw7DuYokpe2PKThJ4M+TcLLXg4q2jfEYqFUynyq0yorXH29IV9oNIsSlTH+JSGv6yTi0kNXYg\nRNGjg3HYn7Jj37GmovIBtyo0IbkZoo63oeG+2pcwnB5KFz9lKZqgZ9I6sVmQ7bw8BCYYwKcI6V9t/Iy\ns8hW5RVmBjn9LDZuw5cvjekfYc+rrCcz/WxBl+I7BuqE2rbGvwQ91/YKY+86t+8hxfcW9J3bZ1GNIWd\neDErImYskeg8GbQpBUjKRQVrTE3bBnmvnRcXnAY6zitEpn1Wud+Zyad5Aywzaxlyy+GK2ogTb7NFs+Z\nwtOiHknMlnzUdiEje17YBxahqIoEJ0CSO0/FOanhPUBnXKxp/0YKcXtsMYf5VIXtrKVuJNezk+MzGYw\nuZ/gPp+3ynFdwoHr5PpCzjMbxUJs4FnL7MfuMUfsR+Fk8M5+7QLIH6HfpRgz14m93bF18qadclm1B2W\ntAqaC7jbKd6VKEyV6eaXQTktoCetceUmj1ZuwsSEcg/heAhSoEEvTQfOgqDrZv9ckbzIJ5nAlCTd7q8\niaTA01JrwIGrvC1l4IOMeZTFwws9Pqp6N6ae4dOI0UtVAHUbizPC8j6YV1AzahipC9pIwVTnBB6NZvI\n1bFnrkhL67b0F9CcSEfmqe2myklcX6ZgtptmjdEB72kspiOj+D1JyhlWXUYszpIvZOOr9E3EdqAmR+C\nRt0gFSWFTbnKi8FaPnewso8Mqy8dMCt29QLfu+brkNlA4WOfNZ/oLBipvJSEHo7vQEW4M/QdXCiDTjM\nAcdWUu/SzzVQtYum0goJfNQAmrIMTDJMYXUwFiO1EkmN3gU+p96eGDp6zJ/Ow5jUkINZUBuCbdwtcjd\nx5lLQbt/th7ULMTeksb7puulzpPSg4vPjiPlltLmEOvNp5UwSuv0DLRZTU0k/6Y5ebz5oPpx+lvuB7w\nkRA2cnrZNpdTF1ZRP1DHUV6V0W7bigdy2YVL2QroPcdUZp36sgTBAHyJoF0Eego3qp3vYYsT02qaaTV\nC+ltuWoOLV38EAg4ef58I8DoL9tOS2torZ5WlAkpVVal0Bs80J6iXsHFXbq3aW0vI/OliDK0CaJPiLD\nHplPFahnFO9/4mFYD6HLQJ6V6ESmtqdoGqj+FlokAD19RIdbN0faqSfDaohF9JR42LKyXUgHiIQJM2p\nghoY3/JiOMc2bih7TIcat690LexKdB3kDjoKIC6blYZoOzn4bematRH8tg2Ifuc2z6Lp+cqOVrgsTpS\nDY9DW1h7mDM1kRN8oZZmE9msKUBm20FhNM+rb7Pt8pajeod1B1F0gpfEDNLKwyqpM8LVOEg9YpovLbg\nNLeE/xCH50Br0IUh5cb3BNAQdKzB8W7s6IKhHoM9Dg2oAXSQBZ5RiJzjeD/PdqBhQyG4Jka1r71wGzU\nSC0yD3f9LNyFq9jSmU+loMc4G7TzOncuWqiFtmGypy9g8tc75UmVBsLqhLWHnA0YmqO/oW2b2LDnRw1\n7ng1j7W1beCyRSf6IR3zxI3gE66GVq6lzrRaMkcrVWleMONdG7/IF1BzqlClIqlxLnKunV86b7qxiBk\nyHk/UfkLBgUaAAS9nO1eOdaxXfLRiT05iR7TK1NOLxT2c85DCEqqm1RnHfuX16dx7seOEcSI7PAre/R\nUSPmuYpmiCQQfdfIr8C2ZgFDOEouGakDF+/w9dPMcr0a2EPN1/cv2W2mhpwJDYT4oObUDv0PoxtCSfj\nuTNLShr7+5/5KE8CHYWE9JGBG/WJJHsExnHPse98YsPMf3pU8XVwlOFv3S4w5D4ahjC40vpDLAaAg2f\ncza+MwiDbRmGQVxMYBOHH0p+RZfN2xtL6Gnb1ymDr9s2/Z8OMEFLaW19n7ZnpnbSikda6lbe7deZg8G\nsdyPPdARI87+3gWeoGVLEG8v5zbyQOA1tE4Zxspbgncu4ntGqYsFVGwvC2pQ3GPAn+FIAnG87tzTC8G\nZ4WWNpTYJkf4blzHLuNMOMyfGwBfBxPKxaOjy0cH1s4PrZwfGzh+NjC8bGF42MLx8cWjo8tHB9bOD62\ncHxs4fjYwvGxheNjC8fHFo6PLRwfe5L42JPEx54kPvYk8bEnCak8SXyc9ICRC4MB3GYnrCt8DlPZQXP\nAd07x3stDPllv8sWUrXjgMRV+dDNLdtswCUKK9g4zVzGwXFhkCv8AZiOtmCfBNb0fs2TLTOcA0/F8En\nJw0zm46RzcdA5uOgc3nYObzsFN5+Cmc3DTObjpHNx0Dm46Bzedg5vOwU3n4KZzcNM5uOlak6ZrTZquN\nWm61qTpklgi1Jo0XWvCdKQ/OpFkmcLvwlIgzITfAWoOaAcMiXtYbRWcGN85912UGQMtdxRMQ1u3x988\nwIE3w7rIrxO1ke0gJ8kx6pTofDlnnz6NbkZV6DacPOdIwSfKrE/YlRpM7vcyCMQwCogR6yX9NnaFYb9\n5gULGpBpGVrNLxMg9omh8Qkhnx4jaTyE2zZLZNalgXdhdTRdlAYSgjkz/fJHClbtWUv7QcyJ6LojHit\n7fgWdsZtZDVO1Xf6kFZVIhFQKiP9kUuHSTpWSSunzuY4C96Ho3nSPlBOmiRvEIWdSonRTIerdeR2szy\nTwT+zqCi8zqh4PsyIxLv8IywgRSeovki6kTQlaO+awsWGmhNAzTmYV1Btcj/spByJxKe0Ymqem34XeJ\nTNKl9f7GfE554+CJXlgeIAPF3v8uiy72feOfMaRbZcxhzxh2etyTSYsE8tjqtZhDfSt6qzkQvdkbUMf\nF29LA5NbL17xly5aErrmJO3ovoCC/Fl6JN9Ww35ZF7H3RtJCNHQdabeHXKzpbhqip7UJZF+Tmr6jaS7\ne+WAtHSzwb+5xdsgwAReg4vHexKX2HFG8U4ppn8HRzumcQMsAxeHsiZKsSRG1NkaBO5qCX1hoAiVZn0\ntqMHKC510bO3kMKyQc5pFPrvS3YayS2ElAV5/MMBpSNxdB10DZXCNmwJkSKIEXCsbiQpvjq8fK2zkCd\nGVMBb5eWwHJsQVqaTatzyUc5x8RgwUEAvY7DpHQKLS1DzLNeptoZZpZ+yM8GCEqHINnBXFEd6cw5qZ8\nMjgHYrd///CRmPYMJoPVne+7GU3KiYL/i7CkYUpyn2ce0u2+C2TejNL80vtBRpt7r96YyLsnE/lmT05\nnTg5gBcxq7S0rI0YocYk/0Fu18RvMNhL1CsBMXSOR7cjAyWUQsGCWODPAm4jCEHOyfAZBp9LAzm4LMG\ncBk3iV4b3iPCRuitcaCT8j3Sls5NpaW5XST0jLSlXPBdXdOiOxhK15rkv1ePdOPJf8w+n5DJl6eDBHM\nmUD1gOFrpRAzEfOV9TI5n9Olnb+hqYYM0AeIy0Cqjf65NxR0uQDZyFowGtXrKyVSmkE+Di9JuUjBIF6\n0qmFfyshHU5ulgmNK279DU853qNswYbuRc1KLZTTfWfCB4hyE6wLoKHaNUi90I2jL1BfXS9SWBXtLPs\ngJoa+5pxSW5qrg1OzPJLTCoK8w6m2ZKCJxhyI3ojGywfuITCuM4iCpMFJbSc558DC1iJ+qNWWQ6W/UY\n2051K5jNQlqerz76dkd2cZd1yYz//vTT+h/hRUZivc03o4gPFXIiu8NaKYUVS0sLVO0F+E18j70X3SO\nJBEQicj8G2FnpBFGXTIA3NhfLIv8EOCVMlJ6+SCQQmxlMAA1i9x9JSllXEoZtRUTmyWSimjl9KhRz2W\nJzAKeoV6lbbIOoTBLcObjnqF7SHeTwerZf8IzlNs8QCrd7+FpPPFlBWl2h5wsAZJhz1B6k2GWZ/+AZ0\niGQbWNSvsR8ODSBrFbG5SUtn3As6mbxY0TvSXE1ggeckpEO1rYJyJwgvIzfBMGU5SN/4rIoFr2HXdb5\nyDIb5QQ5dv7IWmo/YrXjbe707Re8jtECF8Ewle60p5vDn4hp39P6iUyRKrlOXCBJAfVo9R+RgsMcQvh\nBJGT+BGnusx3XPGeuwDXGRlnKAHfhgkK4MpoID2K9l+o1WojbcwoGFC09/EAD08t7y/4TrEdw1ulK5u\nuyc0ZKBhUHIMFJxXnhZwLpLpM78oEkK6XmeNhRoHMbbwBJNmyRXC07AKbyaUnNhOLjylwxqL3FNpygY\n747gTqMOgdRj3cq9eOpKUjGUwIJA0iiuuN+vUSgTPAF2GGRUTwAw7fwkFd8/y4t0CUxKAamXwBvdR3H\nBRXCyPihcTQNXMFdSoMSmV825WN3+DV/eMw/pss8tfB5LAqQfE+DlzagVyeZRzQvBlmwG83H8LzIzw3\ngfu9Cc+30HdjCsO1IStHUlaOsqwcSVk5yrIyeNVRJGDSkKyCZHmw6QGAEmdDIjtoPLtBck1JIMnaKkC\nRU1ZB7Nw1CVEkoJ8Hce8AEFQUEUe+NqhTjUlAgP9vE6K3aoOiehOacC3yODIh0o/DbVkMr+ZzcP9JAK\nPaKvbxUGkvN2iDv2xeCfCKHNY+F7XDuu6IFhx/4nNSm0crinyH3PkdqFthbX5zCanNxWnvKKid6boFY\nAzOlDoJv5PkYTUtManblISOFg5Xq8RQayK0IrJDNeJad+DmRftAKfyYb5e11RDixlMLk75zIqZ7uS7y\n6kRmZJ7syTE/TG7/73aONiaqKzt35s044NT3bKeILa1Y0TCtXYXS1SnogjoD/WBcU0C0ypSFGaHlQ+d\nDpCms+kC5Pl+6abrZZtNNs9km22Sb0mZdtcZYRwz40bgIREfqWlxJO+OQFiEpqCuz59z3wEGb1GT/7I\n+5yXvvzH333XveOeeer3vfXJZKUiVHuvWM9wmxuUrjmyOXVEn2InhOKrwcug7SMNmAFz+CX/KegUQ0g\nEHZXkVtffKeyxg927qlMiG7zMzv3QltFpT4wInBVE9l4Kqe3JBfWbdjBebevPNQ9RikZk5+ldAStPTg\n8TwW+M6YcBHEM6KDO/RE4PpM/tBcvr3XcpEX76C2SDqMkaQlGAjpSdBNidScKudHwaPS6eyLJUcaLRz\nO6AEyz5AcydAhAZdt/m3JXgnui+So6b122MjsaVug9zrpB8eS5Q7EppCB34s+T7VtCDcekmG5pXRwFj\nPvkkFBeJGCMFgbh0DH5G2ENghSA2BtmkUnMId7BiwR4A2WLxAIz5SahvlDv+Lb/2k5432UzvqCoX0zE\nNaTm0dwzMgjllPUgLmucXgXS1dGjxsibduwmxrJ1wm94ijZdRuT8PzuKpDo8PMAggdhANpQfHlLh5vO\nlZKArrtusVymaCMslUyTgHKYLxyVtxLqFSQvoMgZ6BUkbRc8Hp6HChL4etMSeNHa1aDTORYfxpEyer5\nUiDGsAfKVIPkSadOgbFpOesB3nX+CFg+Q89XFCoVG5P0vMQoVDqNB3zXBiPRU4FsjXSat56S1gryBUK\ncgOZFEMxUCrUcCrefoDSTQZiDQ43z7WSCQGcz4rCOMRP2B63rS/zmJPGo5R5cx804vAdksZ5eedtN+I\nKubzmk5rTi/a048By5q8SDp4Q9eiiEaKPjiEL97JVBOsqeCsaIOkNzkthQCImwtQUVakga0E2/q+L27\nyVTAFu5AR7CZ4w994BjHfroDoZl8e4elixdn4m/DdPFrYa3E5koD/weMQeU1uTOovVKyb6L21yV7KbV\nvQkrbS9UM0w2puDtUgEsm9ipx3CAXTLDpyq8+BZHBEWXJZSgwMAPl79dBnSJ/K3dFGW3TgIN0pVTGuH\nsDubtNkLYx7qLx6qAbuIgebtMbII/fz4Qh+UMavn3YMuqdQzPouS8Z6l2BH/Ski4k9kHiMWuEx2hn4X\nm8ZpucyvnbTLiaEwPOEfnGEiLdy+d1bgI7yquPiuK6hhtqLwiKoMPDHk2KFUSHYNIlc8KASeYfZ7gR+\n7xakZuAOdVSGrUp26BoRz2ppWRENgCIdf4jf+yE0eZEWhnqvQa3iHXeTILUNZpxmBARCosaxgdwKU6R\nbpJDOzoF/C2h4ptAwJwEaA8aEbmpH0bQD599zBDGGGGVE5NtHLMPep+hzCt+7ke/dwPeXsQ249zAzro\nBhjYA5p9l0NYcCo7eccNP3lBaFQ6rfQlYXYTRQ9DChV/KyC0E4X8VpbdVNyZugjZU37xv3yxq2AALbK\nwMDeoIJfXl/QSnUTdL7vQeldx0j8y0kc4/2p1ipjnSXlY0P2vWr0PAIWl3LGXDDi4dXqGrhru7EJGMz\nhNSoFvhpevN8iBoAlzF6ITAxT95URuZ3kgu0gQMlUIbUW+X/NHCNA1hldUSXB2OA/jk/TUPDm4xIHkE\nuI3SjIG2EcbKeQ/yg3ynLcgYoXnIU7dUNFH6g+ahlzDuPZtxD83XYBph8DqgdscAUIRBd3yUUu81uTr\nLZXoQ8Rr3SshmqwhtRBTVzCmPRlCFvK+7lLYlVIZoEUCFg8VnSPJlMCUj6dAFZdr+ApLMwojT8heZ+p\ns4FAoY/0fwUt9Oncxvo+ACcZnREtHKno/X4/WjlMrQ2RebdPzS7BUrS8fpdhQmzl+lM6iiaplmNQBZq\nZko0GNKpRow5J1JxX+glTCmdbjnus4KKzy5J53f7xoD0hs/JCmCBpkEVQUUFjKEKUM23OUlRAPkcfzA\nw6aVObYdAXbLNtPS4VGy0XuD37MIF6nXJ29+WGo3SBgG3REBYW4A4Z1puW0f51VfoiKU/u8kI5o0+As\nY1zyyvjz5TPDR2wTrC54/Y6Whktj17m1k1YCPQER2WZmOOq3Mfl9kGhuKW/BaImXEf6P6moTZuzmr/O\nWmd8TNiXWcCw7XOxHJk0zdVmCEEkkjMZCNSIwcIyt4pK5H1pDIJGpF1IMQdgQhIZCbffsXyjTeLzlW4\nNoxcA/2v7cqr0iqrB4EBTi7ScnIeB9aoyzbAwoLPUZKCynTAZyydbppJL0Ajyaoq3YXQHPWuVdrASXk\nCrsquEyREn9PGGCzwPOGVAz8AMnYt3z5uue1dQq2KM3ACnQHQpiWITuJddA4YODTaCi6RRRA/zUYzhs\n0toJ7t2By/HdnViVsRoB1zCkbAi2EujjRblfTFKOmzca11qcJNafOQ/BqhGwRpgwmzbOi5fGtMOEeXA\nqasmS3EH+J20F6kXnvQcgWjtkE69xjDF+0o6VSM62OWfmnzIH0ElANY30sqcmhhO6ETN83aQaIJ34hj\nhI4/YxtQjCzJqxJPmqdxNgWXpJsEsTlV4wPZp7dClDCnHyr4Vj+ZTOI1c4RvwaVL2Z5KbUNSWRq4YLi\n02205Ze3wGHHF+h/MPg5L+WzXk1ySjinJojSOnMLg4C/ML0kj+YKyH8qEldcjmNPkxHHiM+N6DscG39\nlshMHHkZTrTRI8gNle1cUJvTIdpx62rCVAAEwdadAW3N58QZdvAgwnE8VqkuYpA2sJSMs5MyFcvwjvz\ne9+F6fceV5sZatbJmo3U0eylG+m9hTZng5+PYVKp9CVb8b8VgzqSxTUoUcc2GGma03gA1IYwJFC15rh\nlRqs8L4KAkOqexYKySrmfgPeBGIizR/VTNLcrxc7OckgnkyZziYlKw7urtnSgW/nSLVe4lddYoR2pKO\nVUsPxHD2mwgVLWSr0D1OIYWCU1zyZfncpMvSEHgO16UPkoo4o7MZE8VLq/yojKlo5vvU8YZtaLDdY8q\nMDf0EIViocxkAY2gT+QwtP8S172Hw5wLKHam43JNthRp+U7TpqOy7btdR2VLYTajusPiqblu0zJe68O\nrHzZohvteIMgpChyzbMMtY3dQ05L/ZeE6/NgJB2DttzE/Q+KUF/3HIJ/JuD++f+qMdQax+nBa3M5UT9\nCfKmx0kYY3y6eVheswxGH0BlgLvzcqJ8K8ubFB6WTVZaeBmmXqKyulZ4lNUEWc1VY0JAAnS55RBy8gd\nTQJMICWeP3QaMLRPw5s9sNZFRmHKtp/16qXgosgYiGJZNbzEiOoEB3ZFkZgS/wJSJJcD0Qe93ayNcxm\n0y2naeBntDgO5ITtT3vQSPFg/hyqntcluKVrIF23K0aLwEyd/XxmXuuoZKhAbHgglQmSz5B6CSnqXj8\nm85yf9VJAGYKW+CFuP52U2n+N1/m4hGIzNULiAtkYgGICLdfACZVniAFgiMvWSCgqbpJjtM4sncSSEA\na4SbHZGDQ1pcwvIZ9hUa2wqMGNFjA5aD2Nlk4vy/YKuCHEuNc9MS5YJySVUuaUoC4a6M5TDheA1mkNh\nk1L79hJTLydJnGIio0vs7rbJ4podr6IcL0Wio7GI0qiamcdsl2/qVNwhTz9aHDd9AlSRSgWUKumyX2c\nCgkDWs2ozVg122kFI9hDhnHD+GSwm6v6/AH6cjBrTwtgFrwJ8piVgH88Skdqmu93LKei/yMoQpRhAsd\nSjZFlSmVR9ivwNwxQAntAIf8a9Q+hOPl6pdmn+6ywY4Z4MQtf6JYRlSqNYa5VvKQe7EqNa/HHNJUzty\nMFjHvaWyeEw31SOJ3Ru3EH3DNPQN2VuKnaVsLyoqghgslNFvatjo/gWYeupj6+r+OWKU+B9W3+rpQUz\nRhT9k9pHVJA/iejpgFEPJSeTe1/wccm1TLQL3t0DfPuSeXDuKPHsPCQ/d/wRbhc9SM1U5TJqjC/Gr2e\njCFHZOZec0dk5n58XsvJSds9h5OTvnsHMuO69h5wJ2fgXOVdhl+KU+cPY0VdhxeKUCY/fhTAXGQcKLF\nBiHCj+mwDhgeJYC47BhrQLj4OEfexmMKISvKzAiEr6iwIhOuEeBEalwpwIjauEjCowIhj9lsPo9cGNN\npbO2/E2Xs9JVU97ogh/1lf4al7O6rtpXXV5T/ZbL46wor6nxxravr3T6XJ5ap9tfV+HVbNioubPsrdK\nNmmefxa/NNQVwmp+oeSFVs8q/ZX4i+56V44xGoyAIqampubm5GqLV6qAQ9RtZzT1XZD9+H5+lfntqXa\nncQ1jHVpeJRoj9qlcYeMcIx717yPEb9/fh+AiOz+A4CscpOPrgGIBjCI5xOLi10AUcKXCkr43vvY+Xe\nImXeImXeImXeImXeImXeImXePl/LH0Lnv43MRlyllf+pi/pX+Sidvm2t1/+hLQ9tLbs92TBBw9/TPp1\nf9VVtHLzV2pwxQU3bK2ylesxWcgnChr8XNykwvjRuFmF8XPwVMw5EIH9gVWWWo+flLNFLvWvxV6Pgd0\nxcFMM3BoD74+B342B/xgD/zkG/jgG/jQGPhgDn46Bz8fAl2LgqzHw9Rh4JAbGNBl+9IL/h4Y0eUij/J\ncZr1H+wwvXs/DbVqQRLkckwYF599lwYK4Hl8Jm/A/9YHE6SvM8WyrU63aN0+nc6qnfUlde6wK4tsrp2\nuGq8PtczipXeaXLo3G66rZXe+rrsOGbrsbaLR5nZUO5x53p9Li2VHt9Lo/T66rwVdfXebGJ147/QOer\n8sDTLNHl9NT7fdV10Hm5z7Wj2gcdejx19XBhP9wVNfVeuOne6vdBB258jl2wrsFT7YNrbXlF1T191Zb\nX1NTDS9S6aitqtyrXrY3sWlu/3cUArwv69/o82MBTXul5YcmS53+ZkfV8VmZ8VsdLvMRLvPx8+S8PzQ\nWAAFoAAA==\n/Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4Fn/HkJdADweiKUCtAHJSsuY4Z2yMys5o8xm6NANjJaLd9Je\nuzPe3CPGyeEsOOn0n54/ntu5saYNSd2BLMsLKUTYclNJ7tTrqjHRTkSQbw0cPQqf1yF/3PuH3olaHnJt\nbIAuDJfFDGih2/s3duWBbHAsVpnhC/AtTvipjEHx+dTsX9dtgAy6QHwYNVP++d6vrnnxPX/q+gUugFwR\nSC017rBvquqlXlAw65oSGjKcLD8j+Q0IJzrhiGuGfwUO2xyfCjKjARYpoVYbN3yF9BanN/IvQxxpSfwj\nMlWFHgRkIz3CjInOUxv9dN4RTC7fcoxWa5GAjKCGjUtEIIYFsekq1bs1Ab1Ens/nWw/fpb/2IhO5fPu3\nQV6p6mDC0Y6sumRXhcPA5IwDHlwiP6EjtojePYQ26FDeSbRKiQ3vgMeIEHiYlCvzKf1H7DRE6YF4UB7v\nRpnt4KdQQ+tlbgSp5qd+Sp/MzBaYsY0ChBl2Wnssg0a65yP8/25/hRHaWEezzw3ZGN+fosVcH1Dfso6E\nYYDdRS8Qzwhm7y6VjViJngFIfUtArBLFY3hlSMcfq/1Pyjf5qCiU0+NA1SMflfiy5BtveMkMQvdrK0qX\n3dnsL00I21gi6CcmLzieFKf53e8YBOmBdhkq6cIt0cNtjrGlYf2zj13M1aLBKdSGNVpHqPwdbR3nWGNb\nznHNXbTE934PP6tgQeeAsurSlT6a0yayqiWeY476ge+tRFjlyLrzK5S+b8E5pTfBNjIKvi4i4K+YEB5V\ncA0pFRJX3mOZQxM3Cx25sffavAZPB+SB2fyrah44svqNWFz8tLECcOYOoDpvxlCEnbxtrt44H1dFmRhw\no4aF1kuZi9Xulz+2qnjxI1ovlI+3UhhnhHL9eUIx1DBe2nc4Iefv4CiaxvCincy7qqpqX3H7eY5d/Jkr\n7K5uLourbB3yzvdImA6sU4vg0mFiCvL9qv2B+qeOWFpc/FQFgzUepdYD8/bjtOcWm4HJ36FGNZ4fmuOd\neYlg349iAKUEqpeaN+89XeYCGI/RxbZ3wp+pEegVd6bqRwxqK4B19U0FWqgSWMgAY6eQyFXnfE5vbt1Y\ncCWWMcwiUy3uXKpyzGejc9xtcM6fluSDSPCiLHxnril1L8irRPRO8axKYbGRP3JvddjbV2YyY04obtgl\n+ZcKioc17QuNLjkEQlSaJfAul81NUFjCIqRhGU08AGYxFjJr11cljAmU5oVtadMvayTQZ/CEfXc/iXQJ\nokC0v8GNYkJeOxzvqayhqL+i4wBEgvhGcn4NBeaPxfsK/KNGfZz5HaEg2mFIzPFCWb6+VQgUT9PZjbcY\n7v7+s24QKFNFGI/2RW4BDDxau3Tcv+MprCdZKnxPep3Mq8vF3VqHLwxmZ39b0Z5f+NPgDOxuLqSdQ7Z1\nL/febGOpRO/QKUyEduPb90aqxlNTVhGeepfYGJ6j8XgJuBax0m2lZgPDQ3/Iu8n1AswW7PCNE0vzu7Ox\n5QEGVovRp5IeVwFM6nKoir0fUCL7j8FcUuGkeNWmrbU1IxpL/aAZGXwVuaB//1w6umxysxkJxfLGpmbp\n1MpDrJoMMnkOj0q71WuslegiREhKuplHVWcZjitZ/F3kczhcfAensNUuiLAl5rp0yATDyCs69acgsR+3\nBQEXW4r6a2rOpvWs78gadAlPOxEqCgTBVE6BUsMzLXIZH0ybKHckMYySx5amVzNRJwER7/kduASSb0JC\nYF6FubHGY/q4jnGHA03wziA9ObjXTvVRu0R8aXSLzgbtyNKVKd84xeo9zca5EuWttPcRuEAxOubvzj2B\nr/XvFt8CHYiPem0nu1DB6bzbjycsKfKHTRQwaF2wAzVhjztfQH1LkI2++iYXoF3HCR6rSv+00G4mmm5D\njCfunzxZYpg56I3Nwocnsxbt/pCxZK5YTxCMO+HkvjJLES2lP6kkX1cNIRgK6piZ2117iTXvjnxMtTgi\npnunM4Ye4bXXtZprO6W71LySIr4m0ZQxID5nLfBMGu9Bj3VIlAX3xmkdFwO8rPRVLlj24UxaWuevgEPh\nygSF13muUlkwB64YSq/bHJAhdf51IkDO+b3YuJBvUBsguFuV+ZhQ9D5bWKmVvUd1HZwqWAgd3C3L4Mrr\nTMDRC3c8EgwougkKTm2CjtWRGlvuz2zjnAsTWpmbl49XgXj4CR7tOnED+JAja8QttBH1MfToQ04Ezfez\n8mNq+5uykr8y7vGvV/w4YNYa41IFvUJgxuDn9aOXvv/qh68JfTS+TnRf8T0tDOgS+Imr/gi7q4l/PrAI\n0RDAYIQl6GzjBJQ2LoqgJUQVaLF6qQij1+O5O2ITw2B2Vq0w+FTUjJny2+j1gKvsYreYlj6Gu7IrsrMe\nsB1B/MIA65ISmgKNvPcCXI0MYMMvceMEPLrpvx3/qoVc6EqP01zKtAMH7AcOdeHj3ghvVaJcCDSfZXoj\nXrs1p5sll2vcxyrs1e6Ne0OhTjo+E9wf2ivLApfU5ZoJ+yWu7VLTLAggv6VgHo/gnsqWhUAC/x3nenAA\nkjVOdoyUrjOkaP0rJlVB71jhKu7heaAKlBmT7hVw6PC5Jd3WwcumHK0mqTSekL2kMDjCs9GcHAZvT+Ec\nWkzXYTMr9ej6C3GOa+AmHFK3YZaRvVA46Bhw0J8XTMLqI38Y+yytaWb2SDppzBF9WM4UsEeAu1iXkjkh\nWp60VEcSwy004DW4+sQr4/DmKjAW0j6twTYYfiEpesSn788iTRgFuI1jPfEqK8Oqv1gWD1zTggEIsdr2\neoni1X1LqzAasgPBrvWJtn9YHPVnV3lMp5mqSPLyDZm1uKwledV3o3QAI/PjyORym+9S4dt6ncNk/uI0\ncy3gy6zZnKokeDtCcWJnoeyf1Yy8od3k9Zhqjp2g6JuhRcBEfXXSNlzPIcTzg7dUL0cF4K57R7d+RYqC\nyWCvs+wuD+cG3WUGdLEz32Tc2gtHwcAeeMuCURFNnZDN0mPkHNWzSXOI/dtOzRTYM/G9aTnRu7J5Y4uv\ny3EJwaa0PTJJ2I2GgQ6JBUeZJv25Zenb1TYMLk10UBr2Kuy9ez74h20yX9tkVXfSc9g/vTLUFMCXFGCf\n/HrlJ6f4XBQNa9tpJUe5yvyI7De+K6/73KqKfW08wPPJkoinlCNOyyWvRLw94JwGS9YA5JiFVbqXgpmi\n5RdwpSQ8zRFVTm6lzPiR3yTVpyqz2oJWqLKrGddPxz4HK3jeG6D6PWH2mDaCqSceEMz/SKJ5DGrO45Pv\nkFC26lOrko4UiFDvfjsnGDD7OuYUcACdtcPeIfrNdiqz/wT9KQ/yNZR2VYIPWOxcsRCSyTQVUj3wTuPO\nNooh4gAXlgVJSvV5efTXe/mUFbFisxet/fAQYdHQmH0QS6GdzWamXkyY4gDYsG6JZZ/G2Yjusqbj/1UB\nuZW616MQ5oLxTPG6dJrzfOUkukDI//SSduKpINv4ZTMFdx9qdcc3+V9f9cD5Ycb63fkJbJ8XTUIfl30M\ncHOcx+2YIKGtsyYpRMl3+4V7/Gc6S/de14RV8R/HkiMq+10a51JNupa8jHVye66Ga0W19EY/md6Z3rqz\nZZgAJLgl+/KinLCSvjRNBVzMUv8JGSAMcFCxkAb1oQNhz3A2G6gpaU6pRKqvLb+zJc+CNgUDc2017UV2\nX39LnMiP+GqnC+ucgZlb3HM5k3l1xX9VpfKr5TFLNA7gZT38GePtlaMDQ/9GEKBPndM1Xm1KeWB0TYTP\n659NVAkOLDiDi0dGtmzELZiGVYYUS2p+mtk77VprwgmRPvqHzr76Mk+U6T1+YXIp3OvfuG/ue2JHeNIn\n6LLYcVhpByaWHowUxmg3vbW7Fu1jv7Ink6wpSbdLRLCixP7+upKbLj/sRWnz4QU9Hr2SVoqK/guvXQ+b\n7FJFfHQZL87p77gaduYI0BaxPVrf+hOYk/+GTZnQXtd3aLEbifrm4jklxzRwzCHYuiZKJMZy0P4BzqCb\nK0tnXscSRN4V7QNinm+O+62cwzT8zvReuPR9hZ4g2j8J70NFhsR/g7krnibrt8OY4YL2QjbY5Y6Atscj\nnmrWvHrxd7b9+fxMTgT89eftXQmQXynnOGtNPHBKW+DQSu/hsxZC1TAE6fBjadbwMRe+U8As1clN73rO\nsvWHhQa3xFii69Y8m7+1BnN3wsGw+8y97n2/HzX52NfyQMR5coRCTIFoiEhtJW6pqYJXCSuuVJCSGpR+\nWlI2s9oSUr8wbcVL2ujSBGknIvgF+sRYzH3+Pcpxq5Ty8jbwEDIh9lt5qh2/kj6uSc23gxFOBAIdrY47\n8y7t/ewXGFDf/MsHbuj2sez9CT/WG6clYltBOtpPnmBbbcIF1oFx9gKQUujW4I37T6GUL517x+bvN9dF\nLBgbVSluPTrqqShkOwEUIQ7ufYze09/X6B+lqhYXXA3ptXGfbQIuBozZeUz/2ew9gj7QQQ5IRSAZOAE0\nIn/qjrMO6Mopj0EagscUiByVN3wOVtn7zH17tPBHUJt2ilTy+vriHa9cxzZ/w4DzutDCuxU0cgUtwP6b\n6Mm0ZGniGE3PMbjgAMTZQqKrgFzKzm3aIE7hI03OUwc+HR6TtYy72zLgI5S829Fky0/+lc98VChKnOjo\nRb33Fq3fWRHCR4XpvM00mKgeoUqx38kRqYfuvo1ZtFt+u3gFR5MMKqgfiXSh8gMbn59vKoTf8jmELEWV\n7AFoxyZJjLuj5HObwpJ4nN2zwevglUxtXTellcCExpaKXv6Ym+cXtycdLd96w1x3Q/+W03NeuNXugCjI\n+0E1aBG/Dwc1/3B67lxjk6aY88RgxkfgnHgiwr3OdOeUlcogbDR+N84nOmeOi8TVRerS+z0Pcs5Hve81\n2NskZqi0QVLdW28GiQHtodfLG+RnR+t3PyRNIYZ5wHzd4TgR/sEE40sCHb9LpemKpRG2wifooev/1eR0\nPq5areOWJzCaP7Kj0zEEGVuOXo6Pk6JBsA5dYic/TR1kBtw8WSO7rFxVfZHdbr/tcCHnb0U7MbuaZN/Z\ngZd/NlzQvktLk3TThcDiCQYaa8rL5JwJspATXEPFy87H93w//8ZYjEgvXdsT2QntlaMa1ATz+Q6XBHFu\nAsBgs90jYQtFndXBToD2aduSn3Cm2OfvNKQaCuohNIxIuA5L3pkhbK77TM72WS6407J2wgn98ipvLYU6\n5NhwcIXqONCI9lI8MdpaEhCWevIj5otQGsYX6YUqBvd91na0HoWrKv0UCZ5TGhZhuQqir3ISdId/INxb\na4byXG0CuVNXnGptNSgEcqkfYvzzJcrq2VSZyFcxH4hvT22+iajMmr9TFl95X3peYJdF5UuHKXmCL2LA\nfZJQJcuRc1Fs3shTPQ1Icbz84B0LP0S7WfQN87ph5o/U0Ov+tTcviIwpdwmonpSwY3C9wDTAq1bjZhBY\nhqcUbuI4pvmxxUMhvQfIGY7rtECqzmdq5RbkUT8C0rx7JMG/WFqL1Pk9faRDRHvjXsZwDOb1v01x3mUG\n7jGrCg0A8zxT8KnvqjFuTBr5XyC3wgeCLSeBLG8WpGRgHCRRjo+WBA4VvBiC4qgLLHYROhflteDmKKVn\nqUAgL+TYfxv22cNeEruRVcuz5mrhIKdGsyMuI7wPlhgp69/s0kwBZ+KkukPUXa92qQbzmiKvfvur/BLx\nbh+L25H2DsrwiYafzPgga0ivDF7Qe9IPZo6nTBrXyz0dmAgzT0HLIHI7FnUd0mlX7fkfkXlSebtQzOJz\n5bcKbVL8ZZSuh42aerAn1BLmi7GiKHpDq/xuhXM7yeCBqPutYp8slghgU0ahh9jwiUVx3JXGUH6DTWnm\n8vJbXhtf/Ybjq3ibElDQwtAvkQpL/IuT5pnVos3c3B7ray9CW6PqAg2obBcjreNoshlDjVL2Osnmm5wv\ncf/B+9TfV+qCXqM/r3XblImKcB0a/4hvq7LMwV+OxyMOUTnYPp0yeU7kwBT42gBKimHCLNYIVbRSEKnN\nyLpCVumw8TrpOE6O4gETzIkSSLoDLwEldveND5Vg93RByhF94Z+TEh+nnKEnSN2fwnJBxK4nR+nvCyun\nCYlQwM4MNCIXLf7x0XBEkBa4og+B9EdOdIiF8yCkcKJEWiVfO7ftpOyTkboo4g8DYuOZBZIEodzHsrDw\nTvLzfJxiEQdSvXmjiBK0GDE4JOtq3Hfkdmiknb3/RyBXI1ZgwULu8Ic+NLMIeYjuMOvN1lsNLmGNfekl\nNtaDB7y1iYVfCMtD7iKOJgi9MHAp0YdYacrh8bejLQXtltlP6CoKKzqqHxVBs6s4W7Tzf19n4xp9RPuo\nxAgfNToz+pZAG/tPWglviGHd/jKNKmNz2cWLiFnVYYkeoX48W8e6c3Kp6yAudU9wAeC+NF4J3WpXeOUG\n5//LVgGf/suzAzqkJt4P4oVBH1eXKtcfcWFlVKbmGYDrjGnXfGum7TgX1d83HYq1q1m3ZMUMk7o5InnV\n4BdfFdmh2Cs69Yb0Bbl+Uwg542kN9kLhRBSVAuKdjTS+UbkEtk/Y/uKoX91LhOp4A6SSIVORcM/EZxyR\n+L0BctAazUoUTPvPmdPwhtEDQ4OlbTpiBZVmmCB8dE5i+P9gctAqV1q9gXdTH/zy36xoD2UVq5NyTAlv\nWm7sWqrLVUdKewCWsZ6G2RNef+g07qoLlun5mWucvu9KDRkJ0zQsdQ7+HNcwQoeYU3Ns33T8IGLy9CX8\nliIPE2NkItiHgYGO9afNkmt3Bb4mWj1937LAk6UOjyU9K3SQFBHRCDUf5BocztwT2YJPSKYO1ZS/2Ow1\nW7mj2LyZ/mObyoidqEH5rrX2kh7ATB1GscaUBi9qXJiM/ePDYwPcq15P16Zwo1lVPF/X0k3+XKQOeRbu\nW7VGGzPv1OQ+j0wASbUq3S9/3j4B1g4s08f0cAvnm5by6keBPODX/htHuWASARtQvcJlFa6NyDewiogE\nt2JGvi6+AzDJ071ES2gcbtVjCEFV0FROII1ahnkVYgybH2CrLEM1zJRG0tYebd4Kjd568fTMaEDwlPKP\noG8xond+bCi2BWwGS29LK0zt1Y3U/JOyrWKjy06B+adWx3vDRI5PERg8bdBBYBJgdTp16cnre2Ui/PNm\nzVS0+41AIjZxXeciFHOXQvsGWdNDpp3b7T1r0xxK3qCQfl5vxK24hftpk4neCPVN0oP8fsncr8MAq0M4\nzZqClAGYr7XEBCyqd7an+AT5TTaXdfxs4oKJFVFpPTLyEoB7AVlJa44E+F7ojNY3iThtSKOyusrzbM5I\n6KMivoNJ/JIxy6MZ6E17ulIn4oTl64dU4f4O50B+K3SjkQGNvkq/Xu9L+E9nNO9nw/UgmVGFZDxujrbk\ngECnVqaamiOldHqWxA2im+2JB1oXhJmIH+ksook0hebaq1SfmkCFtMNlMx7qxhuNssfirqXrkLJAyPW9\n9WocVqx9OPtp1MB4wxIDS7bCUccssqyusXAwTySQSyekZyWNZmhgna9wDJ5MQNZKMKDG+LTLUBG1g6+R\nu2EyRsB6NZTTcQtxBK5wcG2JSEKZlu367G+9CevvvKLJNI1MMAdFeeSJAw9OcvXSxBGjsq1XIUGYqs+M\n4VZQOaURbCVXj+tP2fWQdzSru7gauYFf5ZWfmj5YMO6Pxpw18aI3ci5509VCA/uERcvzYPQEGcyBbPAq\njLrj2jZdktuOZkYwC0rctHO2kJ1GXXyJnoNhQk2FWwmYA8pYjaN2HRRg7nYZG63BkpwnYlZxvBqGGv3+\ncZlv7vhOUMmqAnZ5HkvjYioBQYHkfnwYSiJ7Zt1zQj6JdlDmckFeUl1R8zTh5L9jK8fpcletmxUKcC8A\nRLtk3AVXz7BSYlfXmfqZnZ/lCZK7kNNi/1hV0Aavlyf5TCKuoAXkvpG2siQ2bMe6c9g+JnH1QLTjBAUl\nkLzuBLrzkQmSsIfHOdxtNsIvz8fDfWunRn0u5oKs8/55msDzUugWLkoo8gYeDST0Q7byiefmwKixcfEy\nigUU10dy6xQG8gw6cMtg6DY8cQz1ux0rdMFuvfp10kfVebZDkAbFXpew7EZaGVi02LtXC29I2BisSSeX\nBM9MH2hgi4CA8qyU5wi4fNz35Y5giVI1drg+o9VtzHs3q8UafsgiF/uNyCUcYv4MRn1zw/bhfp44U+Js\nbTFdshisX2m1Ld0EL5Ev1Z679qOyvJrEoflj7JGCuAf/k2bQpipn3uyoQcUHIDBvr6jrXcLTdQBnfO/F\nVTZdpIn3jfpuX5taIOCG9c1EEwHbSrQPtxLlx85V+/ShZrj8FL07cB1x6vzaNVCD/Y9sIHKdi6ZgHhwB\nB9oWC9/hV59TREfiLuNzaO4ljOUz9gpxM06fTlP71qETRkiIV30aKiWDppD5P9MxU0zXgSReFP3T2ylO\ntMwgfO/CgWgkGXkd4+XAd3KxNRkU38ol2A+VTW3Kgwy4eAttFwTztgJ1+yv+CghdZC03rjlJdP5O3/aH\nN/baMSwUuJ0kOEWLh5ouQwziM0kMDJGJaHetO68lznzaTTi683VNMT/P2QU/vug8JaSM5AAmD2CR0pFL\njAWtIvB/n+j2fAGPjqrm6C23buiLa5/QK69C8R9McxhKqWIwY4o+ZIWnmGnmIYo+ccxwW4iYtvqqEyhr\nOnF/7jFtP/DfdvImYazIHl2kopJfsCUxYipKrMgdCNM4F5rzr/6UIz33n73Hx8Qyl2k84jDpw5XxiB0Z\naFvDEkgyVNrHt4DdOe+4g6a/+yHtG/ONcEQVQa+vq5e79YbP7Hj4UEycMyYcfMVWwoKfubI160mRg7Zw\nZqEOdYuObmLeqBfgNIb3IIUc1pFAMpbZhvfGO19MhjOA5RDkRbcHxGjPifJruygA668UTQGs/0osaVR2\n8OyFruT+Hh9xe0jyqLTGq93xx28ecwT10p71+CFVxfwcGoE7bsPCVB3C5DOxZ69c+5X1owpQqI2tL4vc\nABDLgFvC3FvR2o2Fnp+TXnwa3aT8TkrYL6U3Z2/lnJ+lKPZbfqsmGpPiAN0ekB/V0Rws5wjPnwLp6MoZ\nvekRCGiLdMRfB4Qh8eNULX9SFypF48XqbUpcRSR2iMkqbiprjoxvKMMqgnt552bONmEKZm/ZGpHSTuJM\nhfyii8gPt+IQynHn/p3h9hpCIARXsiJ/HVZi8FHiQypOoqwANP6yFiJAKj9jthlOdm+Rs9xnP9gpY0Zp\n4QArvTPAzKDot+JwFQpoF87ns4BEBIaaIeV6yCjiZHKx9H5iTXOxatQo46+eEfaOQ5vUZA88xr6qjNAV\nk3SMIZMwuH6WdYfmPxj+6z8+0PQ+aCe3a4+FlqXVhh8hJXg/ylr5NtYvFQiG7+cX9oHSneya0vjPYQO3\nvSTfyJgjVS1zTaBRrPo9lVFJ+yI/8e3To3OyrboOk23L8qMFyUP6mCK8rt90wViBIwQ5x4rDfRXMhZSS\nFShEBmy+c3y4eS4IuyDUf2USaUnGg9TAStl7+/7Pvzw/5d/Q8JKLgKksj/MVgCZcGPhLoFFGzrHIYVVl\nIew5sRlPgvdfAFtLIveNievHwSVrdj3Tdt8YcXxz/S1iRLk1MQHqJyjw0kGXhZy2It83ctSvevDf/6w6\nszETjtHhwYNv9l6KZQxIfwwwO/iDI8af6SauWLEMco8L3tloBApM3jUIwdXelXGiw2TnYlW4t1QIsfO1\n49ass28OFuyRTZeTgtIzgggiqrqv04Af7i60e7HJWSIc6onHzvAJhJ57UBTUkxjyShVbMbe2ZOkW7TEB\n1tn8awzy2VzQfnMcq11XOqJVcAisOU5O0y6EkQffzQYoQNjHnbK3JM8HFvcgBEDZoqyNfSfcCEEyxaai\nfxMFEBEP9LNI0Y6j/l7Dj3vrLPZ5ZlJGXMmiMw2tmrLFfs0rjvWPkvIpXBKBqMd+dzt78o4V19QzFCfm\n3K0xK9ZCxHljbiqwR2abHvan2Fku9R/ULKXB4dw5o3umQs9pMbLBR+DNfvYP0S0MQLC3Ec/hAiE6AXRB\nhttMQi5OYn6yZ3YnR1fjNZeN2ga9QDziM9DyCd2+gEvzDLftJlSSp1tAkAE+b8LIYFKEHxGrvfNx+NPW\n2G9H6c2q1ZbGidQ6YhIrpgBbgk/BFlXRUrDs0g1YJJN57p2k7V0Q1bgQVCeBNlUHqLPfFyYr7llOhxib\nhFmjs5tqJpS/4YWsXJgKgZSnSI4wdFhGnI+3zMEcTgV09R9DrqrN55zbbOyHoUBA95f8d+IQ5+PqG269\nB9vAUObvi9KRQjwFpLKnQE0m75Kd46+DaNv1Z126ugnE/+R+bZS4QhG/NAjqJoIQntOKRgHO/eS7kdVr\nUUiNCfgpHvbOhdt/cQl5I5N6ooZU0fVM36OX1ugK5oWUOGRYAAAAAAs+rk4I5fZyAAHePIC0AQCzLaW5\nscRn+wIAAAAABFla\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shell/zsh",
    "content": "#!/bin/zsh\necho \"zsh\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/ShellSession/dollar.sh-session",
    "content": "$ echo $FOOBAR\nHello World!\n"
  },
  {
    "path": "src/test/resources/samples/langs/ShellSession/gem-install.sh-session",
    "content": "$ gem install nokogiri\n...\nBuilding native extensions. This could take a while...\n...\nchecking for libxml/parser.h... *** extconf.rb failed ***\nCould not create Makefile due to some reason, probably lack of\nnecessary libraries and/or headers. Check the mkmf.log file for more\ndetails. You may need configuration options.\n...\n \n$ brew tap homebrew/dupes\nCloning into '/usr/local/Library/Taps/homebrew-dupes'...\nremote: Counting objects: 1034, done.\nremote: Compressing objects: 100% (591/591), done.\nremote: Total 1034 (delta 560), reused 898 (delta 443)\nReceiving objects: 100% (1034/1034), 192.53 KiB | 0 bytes/s, done.\nResolving deltas: 100% (560/560), done.\nChecking connectivity... done\nWarning: Could not tap homebrew/dupes/lsof over mxcl/master/lsof\nTapped 41 formula\n \n$ brew install apple-gcc42\n==> Downloading http://r.research.att.com/tools/gcc-42-5666.3-darwin11.pkg\n######################################################################## 100.0%\n==> Caveats\nNOTE:\nThis formula provides components that were removed from XCode in the 4.2\nrelease. There is no reason to install this formula if you are using a\nversion of XCode prior to 4.2.\n \nThis formula contains compilers built from Apple's GCC sources, build\n5666.3, available from:\n \nhttp://opensource.apple.com/tarballs/gcc\n \nAll compilers have a `-4.2` suffix. A GFortran compiler is also included.\n==> Summary\n🍺 /usr/local/Cellar/apple-gcc42/4.2.1-5666.3: 104 files, 75M, built in 11 seconds\n \n$ gem install nokogiri -v 1.5.10\nFetching: nokogiri-1.5.10.gem (100%)\nBuilding native extensions. This could take a while...\nSuccessfully installed nokogiri-1.5.10\n1 gem installed\nInstalling ri documentation for nokogiri-1.5.10...\nInstalling RDoc documentation for nokogiri-1.5.10...\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/ShellSession/simple.sh-session",
    "content": "> echo $FOOBAR\nHello World!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Shen/graph.shen",
    "content": "\\* graph.shen --- a library for graph definition and manipulation\n\nCopyright (C) 2011,  Eric Schulte\n\n*** License:\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n - Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n*** Commentary:\n\nGraphs are represented as two dictionaries one for vertices and one\nfor edges.  It is important to note that the dictionary implementation\nused is able to accept arbitrary data structures as keys.  This\nstructure technically encodes hypergraphs (a generalization of graphs\nin which each edge may contain any number of vertices).  Examples of a\nregular graph G and a hypergraph H with the corresponding data\nstructure are given below.\n\n\n--G=<graph Vertices Edges>------------------------------------------------\n                            Vertices                  Edges\n                           ----------                -------\n +----Graph G-----+      hash | key -> value      hash |  key  -> value\n |                |      -----+------>--------    -----+-------->---------\n | a---b---c   g  |         1 |  a  -> [1]           1 | [a b] -> [1 2]\n |     |   |      |         2 |  b  -> [1 2 3]       2 | [b c] -> [2 3]\n |     d---e---f  |         3 |  c  -> [2 4]         3 | [b d] -> [2 4]\n |                |         4 |  d  -> [3 5]         4 | [c e] -> [3 5]\n +----------------+         5 |  e  -> [4 5 6]       5 | [d e] -> [4 5]\n                            6 |  f  -> [6]           6 | [e f] -> [5 6]\n                            7 |  g  -> []\n\n\n--H=<graph Vertices Edges>------------------------------------------------\n                            Vertices                  Edges\n                           ----------                -------\n                         hash | key -> value      hash |  key  -> value\n +-- Hypergraph H----+   -----+------>--------    -----+-------->---------\n |                   |      1 |  a  -> [1]           1 | [a b     [1 2\n |        +------+   |      2 |  b  -> [1]             |  c d  ->  3 4\n | +------+------+   |      3 |  c  -> [1]             |  e f]     5 6]\n | |a b c |d e f |   |      4 |  d  -> [1 2]           |\n | +------+------+   |      5 |  e  -> [1 2]         2 | [d e     [4 5\n |        |g h i | j |      6 |  f  -> [1 2]           |  f g  ->  6 7\n |        +------+   |      7 |  g  -> [2]             |  h i]     8 9]\n |                   |      8 |  h  -> [2]\n +-------------------+      9 |  i  -> [2]\n                           10 |  j  -> []\n\n\n--G=<graph Vertices Edges>-------Graph with associated edge/vertex data---------\n                            Vertices                    Edges\n                           ----------                  -------\n +----Graph G-----+      hash | key -> value        hash |  key  -> value\n |   4   6     7  |      -----+------>--------      -----+-------->---------\n |0a---b---c   g  |         1 |  a  -> (@p 0 [1])      1 | [a b] -> (@p 4 [1 2])\n |    1|  3|      |         2 |  b  -> [1 2 3]         2 | [b c] -> (@p 6 [2 3])\n |     d---e---f  |         3 |  c  -> [2 4]           3 | [b d] -> (@p 1 [2 4])\n |       2   5    |         4 |  d  -> [3 5]           4 | [c e] -> (@p 3 [3 5])\n +----------------+         5 |  e  -> [4 5 6]         5 | [d e] -> (@p 2 [4 5])\n                            6 |  f  -> [6]             6 | [e f] -> (@p 5 [5 6])\n                            7 |  g  -> (@p 7 [])\n\nV = # of vertices\nE = # of edges\nM = # of vertex edge associations\n\nsize = size of all vertices +            all vertices stored in Vertices dict\n       M * sizeof(int) * 4 +             indices into Vertices & Edge dicts\n       V * sizeof(dict entry) +          storage in the Vertex dict\n       E * sizeof(dict entry) +          storage in the Edge dict\n       2 * sizeof(dict)                  the Vertices and Edge dicts\n\n*** Code: *\\\n(require dict)\n(require sequence)\n\n(datatype graph\n  Vertices : dictionary;\n     Edges : dictoinary;\n  ===================\n  (vector symbol Vertices Edges);)\n\n(package graph- [graph graph? vertices edges add-vertex\n                 add-edge has-edge? has-vertex? edges-for\n                 neighbors connected-to connected? connected-components\n                 vertex-partition bipartite?\n                 \\* included from the sequence library\\ *\\\n                 take drop take-while drop-while range flatten\n                 filter complement seperate zip indexed reduce\n                 mapcon partition partition-with unique frequencies\n                 shuffle pick remove-first interpose subset?\n                 cartesian-product\n                 \\* included from the dict library\\ *\\\n                 dict? dict dict-> <-dict contents key? keys vals\n                 dictionary make-dict]\n\n(define graph?\n  X -> (= graph (<-address X 0)))\n\n(define make-graph\n  \\* create a graph with specified sizes for the vertex dict and edge dict *\\\n  {number --> number --> graph}\n  Vertsize Edgesize ->\n    (let Graph (absvector 3)\n      (do (address-> Graph 0 graph)\n          (address-> Graph 1 (make-dict Vertsize))\n          (address-> Graph 2 (make-dict Edgesize))\n          Graph)))\n\n(defmacro graph-macro\n  \\* return a graph taking optional sizes for the vertex and edge dicts *\\\n  [graph] -> [make-graph 1024 1024]\n  [graph N] -> [make-graph N 1024]\n  [graph N M] -> [make-graph N M])\n\n(define vert-dict Graph -> (<-address Graph 1))\n\n(define edge-dict Graph -> (<-address Graph 2))\n\n(define vertices\n  {graph --> (list A)}\n  Graph -> (keys (vert-dict Graph)))\n\n(define edges\n  {graph --> (list (list A))}\n  Graph -> (keys (edge-dict Graph)))\n\n(define get-data\n  Value V -> (if (tuple? Value)\n                 (fst Value)\n                 (error (make-string \"no data for ~S~%\" V))))\n\n(define vertex-data\n  Graph V -> (get-data (<-dict (vert-dict Graph) V) V))\n\n(define edge-data\n  Graph V -> (get-data (<-dict (edge-dict Graph) V) V))\n\n(define resolve\n  {(vector (list A)) --> (@p number number) --> A}\n  Vector (@p Index Place) -> (nth (+ 1 Place) (<-vector Vector Index)))\n\n(define resolve-vert\n  {graph --> (@p number number) --> A}\n  Graph Place -> (resolve (<-address (vert-dict Graph) 2) Place))\n\n(define resolve-edge\n  {graph --> (@p number number) --> A}\n  Graph Place -> (resolve (<-address (edge-dict Graph) 2) Place))\n\n(define edges-for\n  {graph --> A --> (list (list A))}\n  Graph Vert -> (let Val (trap-error (<-dict (vert-dict Graph) Vert) (/. E []))\n                     Edges (if (tuple? Val) (snd Val) Val)\n                  (map (lambda X (fst (resolve-edge Graph X))) Val)))\n\n(define add-vertex-w-data\n  \\* add a vertex to a graph *\\\n  {graph --> A --> B --> A}\n  G V Data -> (do (dict-> (vert-dict G) V (@p Data (edges-for G V))) V))\n\n(define add-vertex-w/o-data\n  \\* add a vertex to a graph *\\\n  {graph --> A --> B --> A}\n  G V -> (do (dict-> (vert-dict G) V (edges-for G V)) V))\n\n(defmacro add-vertex-macro\n  [add-vertex G V]   -> [add-vertex-w/o-data G V]\n  [add-vertex G V D] -> [add-vertex-w-data G V D])\n\n(define update-vert\n  \\* in a dict, add an edge to a vertex's edge list *\\\n  {vector --> (@p number number) --> A --> number}\n  Vs Edge V -> (let Store (<-address Vs 2)\n                    N (hash V (limit Store))\n                    VertLst (trap-error (<-vector Store N) (/. E []))\n                    Contents (trap-error (<-dict Vs V) (/. E []))\n                 (do (dict-> Vs V (if (tuple? Contents)\n                                      (@p (fst Contents)\n                                          (adjoin Edge (snd Contents)))\n                                      (adjoin Edge Contents)))\n                     (@p N (length VertLst)))))\n\n(define update-edges-vertices\n  \\* add an edge to a graph *\\\n  {graph --> (list A) --> (list A)}\n  Graph Edge ->\n  (let Store (<-address (edge-dict Graph) 2)\n       EdgeID (hash Edge (limit Store))\n       EdgeLst (trap-error (<-vector Store EdgeID) (/. E []))\n    (map (update-vert (vert-dict Graph) (@p EdgeID (length EdgeLst))) Edge)))\n\n(define add-edge-w-data\n  G E D -> (do (dict-> (edge-dict G) E (@p D (update-edges-vertices G E))) E))\n\n(define add-edge-w/o-data\n  G E -> (do (dict-> (edge-dict G) E (update-edges-vertices G E)) E))\n\n(defmacro add-edge-macro\n  [add-edge G E]   -> [add-edge-w/o-data G E]\n  [add-edge G E V] -> [add-edge-w-data G E V])\n\n(define has-edge?\n  {graph --> (list A) --> boolean}\n  Graph Edge -> (key? (edge-dict Graph) Edge))\n\n(define has-vertex?\n  {graph --> A --> boolean}\n  Graph Vertex -> (key? (vert-dict Graph) Vertex))\n\n(define neighbors\n  \\* Return the neighbors of a vertex *\\\n  {graph --> A --> (list A)}\n  Graph Vert -> (unique (mapcon (remove-first Vert) (edges-for Graph Vert))))\n\n(define connected-to-\n  {graph --> (list A) --> (list A) --> (list A)}\n  Graph [] Already -> Already\n  Graph New Already ->\n  (let Reachable (unique (mapcon (neighbors Graph) New))\n       New (difference Reachable Already)\n    (connected-to- Graph New (append New Already))))\n\n(define connected-to\n  \\* return all vertices connected to the given vertex, including itself *\\\n  {graph --> A --> (list A)}\n  Graph V -> (connected-to- Graph [V] [V]))\n\n(define connected?\n  \\* return if a graph is fully connected *\\\n  {graph --> boolean}\n  Graph -> (reduce (/. V Acc\n                       (and Acc\n                            (subset? (vertices Graph) (connected-to Graph V))))\n                   true (vertices Graph)))\n\n(define connected-components-\n  \\* given a graph return a list of connected components *\\\n  {graph --> (list A) --> (list (list A)) --> (list graph)}\n  Graph [] _ -> []\n  Graph VS [] -> (map (/. V (let Component (graph 1 0)\n                              (do (add-vertex Component V) Component)))\n                      VS)\n  Graph [V|VS] ES ->\n    (let Con-verts (connected-to Graph V)\n         Con-edges (filter (/. E (subset? E Con-verts)) ES)\n         Component (graph (length Con-verts) (length Con-edges))\n      (do (map (add-edge-w/o-data Component) Con-edges)\n          (cons Component (connected-components- Graph\n                                                 (difference VS Con-verts)\n                                                 (difference ES Con-edges))))))\n\n(define connected-components\n  {graph --> (list graph)}\n  Graph -> (connected-components- Graph (vertices Graph) (edges Graph)))\n\n(define place-vertex\n  \\* given a graph, vertex and list of partitions, partition the vertex *\\\n  {graph --> A --> (list (list A)) --> (list (list A))}\n  Graph V [] -> (if (element? V (neighbors Graph V))\n                    (simple-error\n                     (make-string \"self-loop ~S, no vertex partition\" V))\n                    [[V]])\n  Graph V [C|CS] -> (let Neighbors (neighbors Graph V)\n                      (if (element? V Neighbors)\n                          (simple-error\n                           (make-string \"self-loop ~S, no vertex partition\" V))\n                          (if (empty? (intersection C Neighbors))\n                              [[V|C]|CS]\n                              [C|(place-vertex Graph V CS)]))))\n\n(define vertex-partition\n  \\* partition the vertices of a graph *\\\n  {graph --> (list (list A))}\n  Graph -> (reduce (place-vertex Graph) [] (vertices Graph)))\n\n(define bipartite?\n  \\* check if a graph is bipartite *\\\n  {graph --> boolean}\n  Graph -> (= 2 (length (vertex-partition Graph))))\n\n)\n\n\\* simple tests\n\n(set g (graph))\n(add-edge (value g) [chris patton])\n(add-edge (value g) [eric chris])\n(add-vertex (value g) nobody)\n(has-edge? (value g) [patton chris])\n(edges-for (value g) chris)\n(neighbors (value g) chris)\n(neighbors (value g) nobody)\n(connected-to (value g) chris)\n(connected? (value g))\n(connected-components (value g)) <- fail when package wrapper is used\n(map (function vertices) (connected-components (value g)))\n\n*\\"
  },
  {
    "path": "src/test/resources/samples/langs/Shen/html.shen",
    "content": "\\* html.shen --- html generation functions for shen\n\nCopyright (C) 2011,  Eric Schulte\n\n*** License:\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n - Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n*** Commentary:\n\nThe standard lisp-to-html conversion tool suite.  Follows some of\nthe convertions of Clojure's hiccup.\n\n  an example...\n\n(8-) (html [ul#todo1.tasks.stuff [: [title \"today\"]]\n          (map (lambda Str [li Str]) [\"get milk\" \"dishes\"])])\n\"<ul class='tasks stuff' id='todo1' title='today'>\n <li>get milk</li><li>dishes</li></ul>\"\n\n*** Code: *\\\n(trap-error\n (require string)\n (/. E (load \"../string/string.shen\")))\n\n(package string- [html\n                  \\* symbols included from string *\\\n                  takestr dropstr substr length-str index-str\n                  reverse-str starts-with substr? replace-str\n                  join split trim-left trim-right chomp trim]\n\n(define to-str\n  \\* return argument as a string, if already a string do not change *\\\n  X -> X where (string? X)\n  X -> (str X))\n\n(define gassoc\n  X Y -> (hd (tl (assoc X Y))))\n\n(define dassoc\n  X Y -> (remove (assoc X Y) Y))\n\n(define passoc\n  [] Y -> Y\n  [X XV] Y -> (let Orig (gassoc X Y)\n                   New (if (cons? Orig) [XV|Orig] XV)\n                [[X New]|(dassoc X Y)]))\n\n(define html\n  X -> X where (string? X)\n  [Tag [: |Attrs] |Body] ->\n    (let Tag-comps (css-parse-symbol Tag)\n         Tag (gassoc tag Tag-comps)\n         New-attrs (passoc (assoc class Tag-comps)\n                           (passoc (assoc id Tag-comps) Attrs))\n      (@s (make-string \"<~S\" Tag) (attributes New-attrs) \">\"\n          (html Body)\n          (make-string \"</~S>\" Tag))) where (symbol? Tag)\n  [Tag|Body] -> (html [Tag [:] Body]) where (symbol? Tag)\n  [H|HS] -> (@s (html H) (html HS))\n  [] -> \"\")\n\n(define css-parse-symbol\n  {symbol --> [[symbol A]]}\n  Symbol -> (let String (str Symbol)\n                 Class-split (split (str .) String)\n                 Class (map (function intern) (tl Class-split))\n                 Id-split (split (str #) (hd Class-split))\n                 Tag (hd Id-split)\n                 Id (tl Id-split)\n              ((if (= [] Id) (/. X X) (cons [id (intern (hd Id))]))\n               ((if (= [] Class) (/. X X) (cons [class Class])) \n                [[tag (intern Tag)]]))))\n\n(define attributes\n  [] -> \"\"\n  [[K V]|AS] -> (@s \" \" (to-str K) \"='\"\n                    (if (cons? V) (join \" \" (map (function str) V)) (to-str V))\n                    \"'\" (attributes AS)))\n\n)"
  },
  {
    "path": "src/test/resources/samples/langs/Shen/json.shen",
    "content": "(load \"grammar.shen\")\n\n\\*\n\nJSON Lexer\n\n1. Read a stream of characters\n2. Whitespace characters not in strings should be discarded.\n3. Whitespace characters in strings should be preserved\n4. Strings can contain escaped double quotes. e.g. \"\\\"\"\n\n*\\\n\n(define whitespacep\n  \\* e.g. ASCII 32 == #\\Space. *\\\n  \\* All the others are whitespace characters from an ASCII table. *\\\n  Char -> (member Char [\"c#9;\" \"c#10;\" \"c#11;\" \"c#12;\" \"c#13;\" \"c#32;\"]))\n\n(define replace-whitespace\n  \"\" -> \"\"\n  (@s Whitespace Suffix) -> (@s \"\" (replace-whitespace Suffix)) where (whitespacep Whitespace)\n  (@s Prefix Suffix) -> (@s Prefix (replace-whitespace Suffix)))\n\n(define fetch-until-unescaped-doublequote\n  [] -> []\n  [\"\\\" \"c#34;\" | Chars] -> [\"\\\" \"c#34;\" | (fetch-until-unescaped-doublequote Chars)]\n  [\"c#34;\" | Chars] -> []\n  [Char | Chars] -> [Char | (fetch-until-unescaped-doublequote Chars)])\n\n\\* (define strip-whitespace-chars *\\\n\\*   [] -> [] *\\\n\\*   [\"c#34;\" | Chars] -> [\"c#34;\" | ( *\\\n\\*   [WhitespaceChar | Chars] -> (strip-whitespace-chars Chars) where (whitespace? WhitespaceChar) *\\\n\\*   [Char | Chars] -> [Char | (strip-whitespace-chars Chars)]) *\\\n\n(define tokenise\n  JSONString ->\n  (let CharList (explode JSONString)\n       CharList))"
  },
  {
    "path": "src/test/resources/samples/langs/Slash/brainfuck.sl",
    "content": "<%\n\nclass Env {\n    def init {\n        @memory = [];\n        @ptr = 0;\n    }\n\n    def ptr       { @ptr }\n    def ptr=(ptr) { @ptr = ptr }\n\n    def current_value         { @memory[@ptr] || 0 }\n    def current_value=(value) { @memory[@ptr] = value }\n}\n\nclass AST {\n    class Next {\n        def eval(env) {\n            env.ptr++;\n        }\n    }\n\n    class Prev {\n        def eval(env) {\n            env.ptr--;\n        }\n    }\n\n    class Inc {\n        def eval(env) {\n            env.current_value++;\n        }\n    }\n\n    class Dec {\n        def eval(env) {\n            env.current_value--;\n        }\n    }\n\n    class Output {\n        def eval(env) {\n            print(env.current_value.char);\n        }\n    }\n\n    class Input {\n        def eval(env) {\n            ...\n        }\n    }\n\n    class Sequence {\n        def init(nodes) {\n            @nodes = nodes;\n        }\n\n        def eval(env) {\n            for node in @nodes {\n                node.eval(env);\n            }\n        }\n    }\n\n    class Loop {\n        def init(seq) {\n            @seq = seq;\n        }\n\n        def eval(env) {\n            while env.current_value != 0 {\n                @seq.eval(env);\n            }\n        }\n    }\n}\n\nclass Parser {\n    def init(str) {\n        @chars = str.split(\"\");\n    }\n\n    def parse {\n        @stack = [[]];\n        for char in @chars {\n            _parse_char(char);\n        }\n        if @stack.length != 1 {\n            throw SyntaxError.new(\"unexpected end of input\");\n        }\n        AST::Sequence.new(@stack.last);\n    }\n\n    def _parse_char(char) {\n        switch char {\n            \">\" { _add(AST::Next.new); }\n            \"<\" { _add(AST::Prev.new); }\n            \"+\" { _add(AST::Inc.new); }\n            \"-\" { _add(AST::Dec.new); }\n            \".\" { _add(AST::Output.new); }\n            \",\" { _add(AST::Input.new); }\n            \"[\" { _open_loop(); }\n            \"]\" { _close_loop(); }\n        }\n    }\n\n    def _add(node) {\n        @stack.last.push(node);\n    }\n\n    def _open_loop {\n        @stack.push([]);\n    }\n\n    def _close_loop {\n        if @stack.length == 1 {\n            throw SyntaxError.new(\"unexpected ']'\");\n        }\n\n        nodes = @stack.pop;\n        _add(AST::Loop.new(AST::Sequence.new(nodes)));\n    }\n}\n\nsrc = File.read(ARGV.first);\nast = Parser.new(src).parse;\nast.eval(Env.new);\n"
  },
  {
    "path": "src/test/resources/samples/langs/Slim/sample.slim",
    "content": "doctype html\nhtml\n  head\n    title Slim Examples\n    meta name=\"keywords\" content=\"template language\"\n    meta name=\"author\" content=author\n    javascript:\n      alert('Slim supports embedded javascript!')\n\n  body\n    h1 Markup examples\n\n    #content\n      p This example shows you how a basic Slim file looks like.\n\n      == yield\n\n      - unless items.empty?\n        table\n          - for item in items do\n            tr\n              td.name = item.name\n              td.price = item.price\n      - else\n        p\n         | No items found.  Please add some inventory.\n           Thank you!\n\n    div id=\"footer\"\n      = render 'footer'\n      | Copyright © #{year} #{author}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smali/ActionBarDrawerToggle.smali",
    "content": ".class public Landroid/support/v4/app/ActionBarDrawerToggle;\n.super Ljava/lang/Object;\n.source \"ActionBarDrawerToggle.java\"\n\n# interfaces\n.implements Landroid/support/v4/widget/DrawerLayout$DrawerListener;\n\n\n# annotations\n.annotation system Ldalvik/annotation/MemberClasses;\n    value = {\n        Landroid/support/v4/app/ActionBarDrawerToggle$1;,\n        Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;,\n        Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImplHC;,\n        Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImplBase;,\n        Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n    }\n.end annotation\n\n\n# static fields\n.field private static final ID_HOME:I = 0x102002c\n\n.field private static final IMPL:Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n\n\n# instance fields\n.field private final mActivity:Landroid/app/Activity;\n\n.field private final mCloseDrawerContentDescRes:I\n\n.field private mDrawerImage:Landroid/graphics/drawable/Drawable;\n\n.field private final mDrawerImageResource:I\n\n.field private mDrawerIndicatorEnabled:Z\n\n.field private final mDrawerLayout:Landroid/support/v4/widget/DrawerLayout;\n\n.field private final mOpenDrawerContentDescRes:I\n\n.field private mSetIndicatorInfo:Ljava/lang/Object;\n\n.field private mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n.field private mThemeImage:Landroid/graphics/drawable/Drawable;\n\n\n# direct methods\n.method static constructor <clinit>()V\n    .registers 3\n\n    .prologue\n    const/4 v2, 0x0\n\n    .line 108\n    sget v0, Landroid/os/Build$VERSION;->SDK_INT:I\n\n    .line 109\n    .local v0, \"version\":I\n    const/16 v1, 0xb\n\n    if-lt v0, v1, :cond_f\n\n    .line 110\n    new-instance v1, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImplHC;\n\n    invoke-direct {v1, v2}, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImplHC;-><init>(Landroid/support/v4/app/ActionBarDrawerToggle$1;)V\n\n    sput-object v1, Landroid/support/v4/app/ActionBarDrawerToggle;->IMPL:Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n\n    .line 114\n    :goto_e\n    return-void\n\n    .line 112\n    :cond_f\n    new-instance v1, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImplBase;\n\n    invoke-direct {v1, v2}, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImplBase;-><init>(Landroid/support/v4/app/ActionBarDrawerToggle$1;)V\n\n    sput-object v1, Landroid/support/v4/app/ActionBarDrawerToggle;->IMPL:Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n\n    goto :goto_e\n.end method\n\n.method public constructor <init>(Landroid/app/Activity;Landroid/support/v4/widget/DrawerLayout;III)V\n    .registers 8\n    .param p1, \"activity\"    # Landroid/app/Activity;\n    .param p2, \"drawerLayout\"    # Landroid/support/v4/widget/DrawerLayout;\n    .param p3, \"drawerImageRes\"    # I\n    .param p4, \"openDrawerContentDescRes\"    # I\n    .param p5, \"closeDrawerContentDescRes\"    # I\n\n    .prologue\n    .line 152\n    invoke-direct {p0}, Ljava/lang/Object;-><init>()V\n\n    .line 121\n    const/4 v0, 0x1\n\n    iput-boolean v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerIndicatorEnabled:Z\n\n    .line 153\n    iput-object p1, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mActivity:Landroid/app/Activity;\n\n    .line 154\n    iput-object p2, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerLayout:Landroid/support/v4/widget/DrawerLayout;\n\n    .line 155\n    iput p3, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerImageResource:I\n\n    .line 156\n    iput p4, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mOpenDrawerContentDescRes:I\n\n    .line 157\n    iput p5, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mCloseDrawerContentDescRes:I\n\n    .line 159\n    sget-object v0, Landroid/support/v4/app/ActionBarDrawerToggle;->IMPL:Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n\n    invoke-interface {v0, p1}, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;->getThemeUpIndicator(Landroid/app/Activity;)Landroid/graphics/drawable/Drawable;\n\n    move-result-object v0\n\n    iput-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mThemeImage:Landroid/graphics/drawable/Drawable;\n\n    .line 160\n    invoke-virtual {p1}, Landroid/app/Activity;->getResources()Landroid/content/res/Resources;\n\n    move-result-object v0\n\n    invoke-virtual {v0, p3}, Landroid/content/res/Resources;->getDrawable(I)Landroid/graphics/drawable/Drawable;\n\n    move-result-object v0\n\n    iput-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerImage:Landroid/graphics/drawable/Drawable;\n\n    .line 161\n    new-instance v0, Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    iget-object v1, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerImage:Landroid/graphics/drawable/Drawable;\n\n    invoke-direct {v0, v1}, Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;-><init>(Landroid/graphics/drawable/Drawable;)V\n\n    iput-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    .line 162\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    const v1, 0x3eaaaaab\n\n    invoke-virtual {v0, v1}, Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;->setOffsetBy(F)V\n\n    .line 163\n    return-void\n.end method\n\n\n# virtual methods\n.method public isDrawerIndicatorEnabled()Z\n    .registers 2\n\n    .prologue\n    .line 217\n    iget-boolean v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerIndicatorEnabled:Z\n\n    return v0\n.end method\n\n.method public onConfigurationChanged(Landroid/content/res/Configuration;)V\n    .registers 4\n    .param p1, \"newConfig\"    # Landroid/content/res/Configuration;\n\n    .prologue\n    .line 229\n    sget-object v0, Landroid/support/v4/app/ActionBarDrawerToggle;->IMPL:Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n\n    iget-object v1, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mActivity:Landroid/app/Activity;\n\n    invoke-interface {v0, v1}, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;->getThemeUpIndicator(Landroid/app/Activity;)Landroid/graphics/drawable/Drawable;\n\n    move-result-object v0\n\n    iput-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mThemeImage:Landroid/graphics/drawable/Drawable;\n\n    .line 230\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mActivity:Landroid/app/Activity;\n\n    invoke-virtual {v0}, Landroid/app/Activity;->getResources()Landroid/content/res/Resources;\n\n    move-result-object v0\n\n    iget v1, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerImageResource:I\n\n    invoke-virtual {v0, v1}, Landroid/content/res/Resources;->getDrawable(I)Landroid/graphics/drawable/Drawable;\n\n    move-result-object v0\n\n    iput-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerImage:Landroid/graphics/drawable/Drawable;\n\n    .line 231\n    invoke-virtual {p0}, Landroid/support/v4/app/ActionBarDrawerToggle;->syncState()V\n\n    .line 232\n    return-void\n.end method\n\n.method public onDrawerClosed(Landroid/view/View;)V\n    .registers 6\n    .param p1, \"drawerView\"    # Landroid/view/View;\n\n    .prologue\n    .line 298\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    const/4 v1, 0x0\n\n    invoke-virtual {v0, v1}, Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;->setOffset(F)V\n\n    .line 299\n    iget-boolean v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerIndicatorEnabled:Z\n\n    if-eqz v0, :cond_18\n\n    .line 300\n    sget-object v0, Landroid/support/v4/app/ActionBarDrawerToggle;->IMPL:Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n\n    iget-object v1, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSetIndicatorInfo:Ljava/lang/Object;\n\n    iget-object v2, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mActivity:Landroid/app/Activity;\n\n    iget v3, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mCloseDrawerContentDescRes:I\n\n    invoke-interface {v0, v1, v2, v3}, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;->setActionBarDescription(Ljava/lang/Object;Landroid/app/Activity;I)Ljava/lang/Object;\n\n    move-result-object v0\n\n    iput-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSetIndicatorInfo:Ljava/lang/Object;\n\n    .line 303\n    :cond_18\n    return-void\n.end method\n\n.method public onDrawerOpened(Landroid/view/View;)V\n    .registers 6\n    .param p1, \"drawerView\"    # Landroid/view/View;\n\n    .prologue\n    .line 282\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    const/high16 v1, 0x3f800000\n\n    invoke-virtual {v0, v1}, Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;->setOffset(F)V\n\n    .line 283\n    iget-boolean v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerIndicatorEnabled:Z\n\n    if-eqz v0, :cond_19\n\n    .line 284\n    sget-object v0, Landroid/support/v4/app/ActionBarDrawerToggle;->IMPL:Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n\n    iget-object v1, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSetIndicatorInfo:Ljava/lang/Object;\n\n    iget-object v2, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mActivity:Landroid/app/Activity;\n\n    iget v3, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mOpenDrawerContentDescRes:I\n\n    invoke-interface {v0, v1, v2, v3}, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;->setActionBarDescription(Ljava/lang/Object;Landroid/app/Activity;I)Ljava/lang/Object;\n\n    move-result-object v0\n\n    iput-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSetIndicatorInfo:Ljava/lang/Object;\n\n    .line 287\n    :cond_19\n    return-void\n.end method\n\n.method public onDrawerSlide(Landroid/view/View;F)V\n    .registers 7\n    .param p1, \"drawerView\"    # Landroid/view/View;\n    .param p2, \"slideOffset\"    # F\n\n    .prologue\n    const/high16 v3, 0x40000000\n\n    const/high16 v2, 0x3f000000\n\n    .line 264\n    iget-object v1, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    invoke-virtual {v1}, Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;->getOffset()F\n\n    move-result v0\n\n    .line 265\n    .local v0, \"glyphOffset\":F\n    cmpl-float v1, p2, v2\n\n    if-lez v1, :cond_20\n\n    .line 266\n    const/4 v1, 0x0\n\n    sub-float v2, p2, v2\n\n    invoke-static {v1, v2}, Ljava/lang/Math;->max(FF)F\n\n    move-result v1\n\n    mul-float/2addr v1, v3\n\n    invoke-static {v0, v1}, Ljava/lang/Math;->max(FF)F\n\n    move-result v0\n\n    .line 270\n    :goto_1a\n    iget-object v1, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    invoke-virtual {v1, v0}, Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;->setOffset(F)V\n\n    .line 271\n    return-void\n\n    .line 268\n    :cond_20\n    mul-float v1, p2, v3\n\n    invoke-static {v0, v1}, Ljava/lang/Math;->min(FF)F\n\n    move-result v0\n\n    goto :goto_1a\n.end method\n\n.method public onDrawerStateChanged(I)V\n    .registers 2\n    .param p1, \"newState\"    # I\n\n    .prologue\n    .line 314\n    return-void\n.end method\n\n.method public onOptionsItemSelected(Landroid/view/MenuItem;)Z\n    .registers 5\n    .param p1, \"item\"    # Landroid/view/MenuItem;\n\n    .prologue\n    const v2, 0x800003\n\n    .line 244\n    if-eqz p1, :cond_1f\n\n    invoke-interface {p1}, Landroid/view/MenuItem;->getItemId()I\n\n    move-result v0\n\n    const v1, 0x102002c\n\n    if-ne v0, v1, :cond_1f\n\n    iget-boolean v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerIndicatorEnabled:Z\n\n    if-eqz v0, :cond_1f\n\n    .line 245\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerLayout:Landroid/support/v4/widget/DrawerLayout;\n\n    invoke-virtual {v0, v2}, Landroid/support/v4/widget/DrawerLayout;->isDrawerVisible(I)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_21\n\n    .line 246\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerLayout:Landroid/support/v4/widget/DrawerLayout;\n\n    invoke-virtual {v0, v2}, Landroid/support/v4/widget/DrawerLayout;->closeDrawer(I)V\n\n    .line 251\n    :cond_1f\n    :goto_1f\n    const/4 v0, 0x0\n\n    return v0\n\n    .line 248\n    :cond_21\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerLayout:Landroid/support/v4/widget/DrawerLayout;\n\n    invoke-virtual {v0, v2}, Landroid/support/v4/widget/DrawerLayout;->openDrawer(I)V\n\n    goto :goto_1f\n.end method\n\n.method public setDrawerIndicatorEnabled(Z)V\n    .registers 8\n    .param p1, \"enable\"    # Z\n\n    .prologue\n    .line 199\n    iget-boolean v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerIndicatorEnabled:Z\n\n    if-eq p1, v0, :cond_23\n\n    .line 200\n    if-eqz p1, :cond_27\n\n    .line 201\n    sget-object v1, Landroid/support/v4/app/ActionBarDrawerToggle;->IMPL:Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n\n    iget-object v2, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSetIndicatorInfo:Ljava/lang/Object;\n\n    iget-object v3, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mActivity:Landroid/app/Activity;\n\n    iget-object v4, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerLayout:Landroid/support/v4/widget/DrawerLayout;\n\n    const v5, 0x800003\n\n    invoke-virtual {v0, v5}, Landroid/support/v4/widget/DrawerLayout;->isDrawerOpen(I)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_24\n\n    iget v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mOpenDrawerContentDescRes:I\n\n    :goto_1b\n    invoke-interface {v1, v2, v3, v4, v0}, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;->setActionBarUpIndicator(Ljava/lang/Object;Landroid/app/Activity;Landroid/graphics/drawable/Drawable;I)Ljava/lang/Object;\n\n    move-result-object v0\n\n    iput-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSetIndicatorInfo:Ljava/lang/Object;\n\n    .line 208\n    :goto_21\n    iput-boolean p1, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerIndicatorEnabled:Z\n\n    .line 210\n    :cond_23\n    return-void\n\n    .line 201\n    :cond_24\n    iget v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mCloseDrawerContentDescRes:I\n\n    goto :goto_1b\n\n    .line 205\n    :cond_27\n    sget-object v0, Landroid/support/v4/app/ActionBarDrawerToggle;->IMPL:Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n\n    iget-object v1, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSetIndicatorInfo:Ljava/lang/Object;\n\n    iget-object v2, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mActivity:Landroid/app/Activity;\n\n    iget-object v3, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mThemeImage:Landroid/graphics/drawable/Drawable;\n\n    const/4 v4, 0x0\n\n    invoke-interface {v0, v1, v2, v3, v4}, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;->setActionBarUpIndicator(Ljava/lang/Object;Landroid/app/Activity;Landroid/graphics/drawable/Drawable;I)Ljava/lang/Object;\n\n    move-result-object v0\n\n    iput-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSetIndicatorInfo:Ljava/lang/Object;\n\n    goto :goto_21\n.end method\n\n.method public syncState()V\n    .registers 7\n\n    .prologue\n    const v5, 0x800003\n\n    .line 175\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerLayout:Landroid/support/v4/widget/DrawerLayout;\n\n    invoke-virtual {v0, v5}, Landroid/support/v4/widget/DrawerLayout;->isDrawerOpen(I)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_2f\n\n    .line 176\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    const/high16 v1, 0x3f800000\n\n    invoke-virtual {v0, v1}, Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;->setOffset(F)V\n\n    .line 181\n    :goto_12\n    iget-boolean v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerIndicatorEnabled:Z\n\n    if-eqz v0, :cond_2e\n\n    .line 182\n    sget-object v1, Landroid/support/v4/app/ActionBarDrawerToggle;->IMPL:Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;\n\n    iget-object v2, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSetIndicatorInfo:Ljava/lang/Object;\n\n    iget-object v3, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mActivity:Landroid/app/Activity;\n\n    iget-object v4, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mDrawerLayout:Landroid/support/v4/widget/DrawerLayout;\n\n    invoke-virtual {v0, v5}, Landroid/support/v4/widget/DrawerLayout;->isDrawerOpen(I)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_36\n\n    iget v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mOpenDrawerContentDescRes:I\n\n    :goto_28\n    invoke-interface {v1, v2, v3, v4, v0}, Landroid/support/v4/app/ActionBarDrawerToggle$ActionBarDrawerToggleImpl;->setActionBarUpIndicator(Ljava/lang/Object;Landroid/app/Activity;Landroid/graphics/drawable/Drawable;I)Ljava/lang/Object;\n\n    move-result-object v0\n\n    iput-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSetIndicatorInfo:Ljava/lang/Object;\n\n    .line 186\n    :cond_2e\n    return-void\n\n    .line 178\n    :cond_2f\n    iget-object v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mSlider:Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;\n\n    const/4 v1, 0x0\n\n    invoke-virtual {v0, v1}, Landroid/support/v4/app/ActionBarDrawerToggle$SlideDrawable;->setOffset(F)V\n\n    goto :goto_12\n\n    .line 182\n    :cond_36\n    iget v0, p0, Landroid/support/v4/app/ActionBarDrawerToggle;->mCloseDrawerContentDescRes:I\n\n    goto :goto_28\n.end method\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smali/DoodleMobileAnaylise.smali",
    "content": ".class public Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n.super Ljava/lang/Object;\n.source \"DoodleMobileAnaylise.java\"\n\n\n# annotations\n.annotation system Ldalvik/annotation/MemberClasses;\n    value = {\n        Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$Sync;,\n        Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$SessionPolling;,\n        Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$MobclixHttpClient;,\n        Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$FetchRemoteConfig;,\n        Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$LogEvent;\n    }\n.end annotation\n\n\n# static fields\n.field static final DEBUG:Z = false\n\n.field public static final LOG_LEVEL_DEBUG:I = 0x1\n\n.field public static final LOG_LEVEL_ERROR:I = 0x8\n\n.field public static final LOG_LEVEL_FATAL:I = 0x10\n\n.field public static final LOG_LEVEL_INFO:I = 0x2\n\n.field public static final LOG_LEVEL_WARN:I = 0x4\n\n.field private static MC_ANALYTICS_DIRECTORY:Ljava/lang/String; = null\n\n.field private static MC_DIRECTORY:Ljava/lang/String; = null\n\n.field private static MC_MAX_ANALYTICS_FILES:I = 0x0\n\n.field private static MC_MAX_EVENTS_PER_FILE:I = 0x0\n\n.field static final PREFS_CONFIG:Ljava/lang/String; = \".DMConfig\"\n\n.field public static final PUSH_MESSAGE_INTERVAL:I = 0xf0\n\n.field static final PUSH_MESSAGE_TO_SERVER:I = 0x186a1\n\n.field private static SYNC_ERROR:I\n\n.field private static SYNC_READY:I\n\n.field private static SYNC_RUNNING:I\n\n.field private static applicationInfo:Landroid/content/pm/ApplicationInfo;\n\n.field private static final controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n.field private static currentFile:Ljava/io/File;\n\n.field private static fileCreated:Z\n\n.field private static isInitialized:Z\n\n.field private static loggingEvent:Z\n\n.field static mSyncHandler:Landroid/os/Handler;\n\n.field private static numLinesWritten:I\n\n.field private static packageName:Ljava/lang/String;\n\n.field private static syncContents:Ljava/lang/String;\n\n.field private static syncStatus:I\n\n\n# instance fields\n.field private analyticsServer:Ljava/lang/String;\n\n.field private androidId:Ljava/lang/String;\n\n.field private androidVersion:Ljava/lang/String;\n\n.field private applicationId:Ljava/lang/String;\n\n.field private applicationVersion:Ljava/lang/String;\n\n.field private autoplay:Ljava/util/HashMap;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"Ljava/util/HashMap\",\n            \"<\",\n            \"Ljava/lang/String;\",\n            \"Ljava/lang/Boolean;\",\n            \">;\"\n        }\n    .end annotation\n.end field\n\n.field private configServer:Ljava/lang/String;\n\n.field private connectionType:Ljava/lang/String;\n\n.field private context:Landroid/content/Context;\n\n.field private deviceHardwareModel:Ljava/lang/String;\n\n.field private deviceId:Ljava/lang/String;\n\n.field private deviceModel:Ljava/lang/String;\n\n.field private enabled:Ljava/util/HashMap;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"Ljava/util/HashMap\",\n            \"<\",\n            \"Ljava/lang/String;\",\n            \"Ljava/lang/Boolean;\",\n            \">;\"\n        }\n    .end annotation\n.end field\n\n.field private haveLocationPermission:Z\n\n.field private haveNetworkStatePermission:Z\n\n.field private idleTimeout:I\n\n.field private isInSession:Z\n\n.field private isNewUser:Z\n\n.field private isOfflineSession:Z\n\n.field private isTopTask:Z\n\n.field private language:Ljava/lang/String;\n\n.field private latitude:Ljava/lang/String;\n\n.field private locale:Ljava/lang/String;\n\n.field location:Lcom/doodlemobile/gamecenter/DoodleMobileLocation;\n\n.field private locationCriteria:Landroid/location/Criteria;\n\n.field private locationHandler:Landroid/os/Handler;\n\n.field private logLevel:I\n\n.field private longitude:Ljava/lang/String;\n\n.field private mcc:Ljava/lang/String;\n\n.field private mnc:Ljava/lang/String;\n\n.field private pollTime:I\n\n.field private previousDeviceId:Ljava/lang/String;\n\n.field private refreshTime:Ljava/util/HashMap;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"Ljava/util/HashMap\",\n            \"<\",\n            \"Ljava/lang/String;\",\n            \"Ljava/lang/Long;\",\n            \">;\"\n        }\n    .end annotation\n.end field\n\n.field private remoteConfigSet:I\n\n.field private session:Lorg/json/JSONObject;\n\n.field private sessionEndTime:J\n\n.field private sessionPollingTimer:Ljava/util/Timer;\n\n.field private sessionStartTime:J\n\n.field private sharedPrefs:Landroid/content/SharedPreferences;\n\n.field private totalIdleTime:J\n\n.field private userAgent:Ljava/lang/String;\n\n\n# direct methods\n.method static constructor <clinit>()V\n    .locals 3\n\n    .prologue\n    const/4 v2, 0x0\n\n    const/4 v1, 0x0\n\n    .line 70\n    const-string v0, \"doodlemobile\"\n\n    sput-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_DIRECTORY:Ljava/lang/String;\n\n    .line 72\n    const-string v0, \"analytics\"\n\n    sput-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_ANALYTICS_DIRECTORY:Ljava/lang/String;\n\n    .line 74\n    const/16 v0, 0x64\n\n    sput v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_MAX_ANALYTICS_FILES:I\n\n    .line 76\n    const/4 v0, 0x5\n\n    sput v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_MAX_EVENTS_PER_FILE:I\n\n    .line 104\n    sput-object v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->currentFile:Ljava/io/File;\n\n    .line 106\n    sput-boolean v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->fileCreated:Z\n\n    .line 108\n    sput-boolean v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->loggingEvent:Z\n\n    .line 110\n    sput v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->numLinesWritten:I\n\n    .line 112\n    sput-object v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->syncContents:Ljava/lang/String;\n\n    .line 114\n    sput v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->syncStatus:I\n\n    .line 116\n    sput v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->SYNC_READY:I\n\n    .line 118\n    const/4 v0, 0x1\n\n    sput v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->SYNC_RUNNING:I\n\n    .line 120\n    const/4 v0, -0x1\n\n    sput v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->SYNC_ERROR:I\n\n    .line 184\n    new-instance v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    invoke-direct {v0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;-><init>()V\n\n    sput-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    .line 186\n    sput-boolean v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInitialized:Z\n\n    .line 188\n    const-string v0, \"\"\n\n    sput-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->packageName:Ljava/lang/String;\n\n    .line 190\n    sput-object v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationInfo:Landroid/content/pm/ApplicationInfo;\n\n    .line 771\n    new-instance v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$3;\n\n    invoke-direct {v0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$3;-><init>()V\n\n    sput-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->mSyncHandler:Landroid/os/Handler;\n\n    return-void\n.end method\n\n.method public constructor <init>()V\n    .locals 7\n\n    .prologue\n    const/4 v5, 0x0\n\n    const-wide/16 v3, 0x0\n\n    const/4 v2, 0x0\n\n    const-string v6, \"http://data.doodlemobile.com:8080/dmdata/ReceiveServlet\"\n\n    const-string v1, \"null\"\n\n    .line 56\n    invoke-direct {p0}, Ljava/lang/Object;-><init>()V\n\n    .line 78\n    iput-object v5, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sharedPrefs:Landroid/content/SharedPreferences;\n\n    .line 80\n    new-instance v0, Lorg/json/JSONObject;\n\n    invoke-direct {v0}, Lorg/json/JSONObject;-><init>()V\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->session:Lorg/json/JSONObject;\n\n    .line 88\n    new-instance v0, Ljava/util/HashMap;\n\n    invoke-direct {v0}, Ljava/util/HashMap;-><init>()V\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->enabled:Ljava/util/HashMap;\n\n    .line 90\n    new-instance v0, Ljava/util/HashMap;\n\n    invoke-direct {v0}, Ljava/util/HashMap;-><init>()V\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->refreshTime:Ljava/util/HashMap;\n\n    .line 92\n    new-instance v0, Ljava/util/HashMap;\n\n    invoke-direct {v0}, Ljava/util/HashMap;-><init>()V\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->autoplay:Ljava/util/HashMap;\n\n    .line 94\n    const-string v0, \"http://data.doodlemobile.com:8080/dmdata/ReceiveServlet\"\n\n    iput-object v6, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->configServer:Ljava/lang/String;\n\n    .line 96\n    const-string v0, \"http://data.doodlemobile.com:8080/dmdata/ReceiveServlet\"\n\n    iput-object v6, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->analyticsServer:Ljava/lang/String;\n\n    .line 98\n    const/16 v0, 0x7530\n\n    iput v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->pollTime:I\n\n    .line 100\n    const v0, 0x1d4c0\n\n    iput v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->idleTimeout:I\n\n    .line 102\n    iput v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->remoteConfigSet:I\n\n    .line 122\n    iput-boolean v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isOfflineSession:Z\n\n    .line 124\n    iput-boolean v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInSession:Z\n\n    .line 126\n    iput-boolean v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isTopTask:Z\n\n    .line 128\n    iput-wide v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionStartTime:J\n\n    .line 130\n    iput-wide v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionEndTime:J\n\n    .line 132\n    iput-wide v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->totalIdleTime:J\n\n    .line 134\n    new-instance v0, Ljava/util/Timer;\n\n    invoke-direct {v0}, Ljava/util/Timer;-><init>()V\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionPollingTimer:Ljava/util/Timer;\n\n    .line 144\n    iput-object v5, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->previousDeviceId:Ljava/lang/String;\n\n    .line 150\n    const-string v0, \"null\"\n\n    iput-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->connectionType:Ljava/lang/String;\n\n    .line 154\n    new-instance v0, Lcom/doodlemobile/gamecenter/DoodleMobileLocation;\n\n    invoke-direct {v0}, Lcom/doodlemobile/gamecenter/DoodleMobileLocation;-><init>()V\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->location:Lcom/doodlemobile/gamecenter/DoodleMobileLocation;\n\n    .line 156\n    const-string v0, \"null\"\n\n    iput-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->latitude:Ljava/lang/String;\n\n    .line 158\n    const-string v0, \"null\"\n\n    iput-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->longitude:Ljava/lang/String;\n\n    .line 160\n    const-string v0, \"null\"\n\n    iput-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locale:Ljava/lang/String;\n\n    .line 162\n    const-string v0, \"null\"\n\n    iput-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->language:Ljava/lang/String;\n\n    .line 164\n    const-string v0, \"null\"\n\n    iput-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->mcc:Ljava/lang/String;\n\n    .line 166\n    const-string v0, \"null\"\n\n    iput-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->mnc:Ljava/lang/String;\n\n    .line 168\n    const-string v0, \"\"\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->userAgent:Ljava/lang/String;\n\n    .line 170\n    const-string v0, \"null\"\n\n    iput-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationId:Ljava/lang/String;\n\n    .line 172\n    const/16 v0, 0x10\n\n    iput v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->logLevel:I\n\n    .line 174\n    iput-boolean v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->haveLocationPermission:Z\n\n    .line 178\n    iput-boolean v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->haveNetworkStatePermission:Z\n\n    .line 180\n    iput-boolean v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isNewUser:Z\n\n    .line 1045\n    return-void\n.end method\n\n.method private OpenAnalyticsFile()Z\n    .locals 7\n\n    .prologue\n    const/4 v6, 0x1\n\n    const/4 v5, 0x0\n\n    const-string v0, \"DoodleMobileAnaylise\"\n\n    const-string v0, \"/\"\n\n    const-string v0, \"UTF-8\"\n\n    .line 720\n    sput v6, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->numLinesWritten:I\n\n    .line 721\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    invoke-virtual {v0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->updateSession()V\n\n    .line 724\n    :try_start_0\n    new-instance v0, Lorg/json/JSONObject;\n\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v1, v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->session:Lorg/json/JSONObject;\n\n    const/4 v2, 0x3\n\n    new-array v2, v2, [Ljava/lang/String;\n\n    const/4 v3, 0x0\n\n    const-string v4, \"ll\"\n\n    aput-object v4, v2, v3\n\n    const/4 v3, 0x1\n\n    const-string v4, \"g\"\n\n    aput-object v4, v2, v3\n\n    const/4 v3, 0x2\n\n    const-string v4, \"id\"\n\n    aput-object v4, v2, v3\n\n    invoke-direct {v0, v1, v2}, Lorg/json/JSONObject;-><init>(Lorg/json/JSONObject;[Ljava/lang/String;)V\n\n    .line 726\n    const-string v1, \"a\"\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getApplicationId()Ljava/lang/String;\n\n    move-result-object v2\n\n    const-string v3, \"UTF-8\"\n\n    invoke-static {v2, v3}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 727\n    const-string v1, \"p\"\n\n    const-string v2, \"android\"\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 728\n    const-string v1, \"m\"\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getMobclixVersion()Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-static {v2}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 729\n    const-string v1, \"v\"\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getApplicationVersion()Ljava/lang/String;\n\n    move-result-object v2\n\n    const-string v3, \"UTF-8\"\n\n    invoke-static {v2, v3}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 730\n    const-string v1, \"d\"\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getDeviceId()Ljava/lang/String;\n\n    move-result-object v2\n\n    const-string v3, \"UTF-8\"\n\n    invoke-static {v2, v3}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 731\n    const-string v1, \"dm\"\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getDeviceModel()Ljava/lang/String;\n\n    move-result-object v2\n\n    const-string v3, \"UTF-8\"\n\n    invoke-static {v2, v3}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 732\n    const-string v1, \"dv\"\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getAndroidVersion()Ljava/lang/String;\n\n    move-result-object v2\n\n    const-string v3, \"UTF-8\"\n\n    invoke-static {v2, v3}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 733\n    const-string v1, \"hwdm\"\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getDeviceHardwareModel()Ljava/lang/String;\n\n    move-result-object v2\n\n    const-string v3, \"UTF-8\"\n\n    invoke-static {v2, v3}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 735\n    const-string v1, \"m\"\n\n    const-string v2, \"2.3\"\n\n    const-string v3, \"UTF-8\"\n\n    invoke-static {v2, v3}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 736\n    const-string v1, \"lg\"\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getLanguage()Ljava/lang/String;\n\n    move-result-object v2\n\n    const-string v3, \"UTF-8\"\n\n    invoke-static {v2, v3}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 737\n    const-string v1, \"lo\"\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getLocale()Ljava/lang/String;\n\n    move-result-object v2\n\n    const-string v3, \"UTF-8\"\n\n    invoke-static {v2, v3}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 738\n    const-string v1, \"pn\"\n\n    sget-object v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->packageName:Ljava/lang/String;\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 740\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v1, v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n\n    sget-object v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_DIRECTORY:Ljava/lang/String;\n\n    const/4 v3, 0x0\n\n    invoke-virtual {v1, v2, v3}, Landroid/content/Context;->getDir(Ljava/lang/String;I)Ljava/io/File;\n\n    move-result-object v1\n\n    .line 741\n    new-instance v2, Ljava/io/File;\n\n    new-instance v3, Ljava/lang/StringBuilder;\n\n    invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V\n\n    invoke-virtual {v1}, Ljava/io/File;->getAbsolutePath()Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-virtual {v3, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    const-string v3, \"/\"\n\n    invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    sget-object v3, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_ANALYTICS_DIRECTORY:Ljava/lang/String;\n\n    invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-direct {v2, v1}, Ljava/io/File;-><init>(Ljava/lang/String;)V\n\n    .line 743\n    invoke-virtual {v2}, Ljava/io/File;->mkdir()Z\n\n    .line 744\n    const-string v1, \"DoodleMobileAnaylise\"\n\n    const-string v3, \"mkdir\"\n\n    invoke-static {v1, v3}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n\n    .line 745\n    invoke-virtual {v2}, Ljava/io/File;->listFiles()[Ljava/io/File;\n\n    move-result-object v1\n\n    array-length v1, v1\n\n    sget v3, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_MAX_ANALYTICS_FILES:I\n\n    if-lt v1, v3, :cond_0\n\n    .line 746\n    const-string v0, \"DoodleMobileAnaylise\"\n\n    new-instance v1, Ljava/lang/StringBuilder;\n\n    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V\n\n    invoke-virtual {v2}, Ljava/io/File;->listFiles()[Ljava/io/File;\n\n    move-result-object v2\n\n    array-length v2, v2\n\n    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    const-string v2, \"  \"\n\n    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    sget v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_MAX_ANALYTICS_FILES:I\n\n    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n\n    move v0, v5\n\n    .line 768\n    :goto_0\n    return v0\n\n    .line 751\n    :cond_0\n    new-instance v1, Ljava/io/File;\n\n    new-instance v3, Ljava/lang/StringBuilder;\n\n    invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V\n\n    invoke-virtual {v2}, Ljava/io/File;->getAbsoluteFile()Ljava/io/File;\n\n    move-result-object v2\n\n    invoke-virtual {v3, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;\n\n    move-result-object v2\n\n    const-string v3, \"/\"\n\n    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v2\n\n    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J\n\n    move-result-wide v3\n\n    invoke-virtual {v2, v3, v4}, Ljava/lang/StringBuilder;->append(J)Ljava/lang/StringBuilder;\n\n    move-result-object v2\n\n    const-string v3, \".log\"\n\n    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v2\n\n    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-direct {v1, v2}, Ljava/io/File;-><init>(Ljava/lang/String;)V\n\n    sput-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->currentFile:Ljava/io/File;\n\n    .line 754\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->currentFile:Ljava/io/File;\n\n    invoke-virtual {v1}, Ljava/io/File;->createNewFile()Z\n\n    .line 756\n    new-instance v1, Ljava/io/FileOutputStream;\n\n    sget-object v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->currentFile:Ljava/io/File;\n\n    invoke-direct {v1, v2}, Ljava/io/FileOutputStream;-><init>(Ljava/io/File;)V\n\n    .line 758\n    const-string v2, \"[{\\\"hb\\\":\"\n\n    invoke-virtual {v2}, Ljava/lang/String;->getBytes()[B\n\n    move-result-object v2\n\n    invoke-virtual {v1, v2}, Ljava/io/FileOutputStream;->write([B)V\n\n    .line 759\n    invoke-virtual {v0}, Lorg/json/JSONObject;->toString()Ljava/lang/String;\n\n    move-result-object v0\n\n    invoke-virtual {v0}, Ljava/lang/String;->getBytes()[B\n\n    move-result-object v0\n\n    invoke-virtual {v1, v0}, Ljava/io/FileOutputStream;->write([B)V\n\n    .line 760\n    const-string v0, \",\\\"ev\\\":[\"\n\n    invoke-virtual {v0}, Ljava/lang/String;->getBytes()[B\n\n    move-result-object v0\n\n    invoke-virtual {v1, v0}, Ljava/io/FileOutputStream;->write([B)V\n\n    .line 761\n    invoke-virtual {v1}, Ljava/io/FileOutputStream;->close()V\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    .line 767\n    sput-boolean v6, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->fileCreated:Z\n\n    move v0, v6\n\n    .line 768\n    goto :goto_0\n\n    .line 763\n    :catch_0\n    move-exception v0\n\n    .line 764\n    invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V\n\n    move v0, v5\n\n    .line 765\n    goto :goto_0\n.end method\n\n.method static synthetic access$002(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;Ljava/lang/String;)Ljava/lang/String;\n    .locals 0\n\n    .prologue\n    .line 56\n    iput-object p1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->latitude:Ljava/lang/String;\n\n    return-object p1\n.end method\n\n.method static synthetic access$1000()Ljava/io/File;\n    .locals 1\n\n    .prologue\n    .line 56\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->currentFile:Ljava/io/File;\n\n    return-object v0\n.end method\n\n.method static synthetic access$102(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;Ljava/lang/String;)Ljava/lang/String;\n    .locals 0\n\n    .prologue\n    .line 56\n    iput-object p1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->longitude:Ljava/lang/String;\n\n    return-object p1\n.end method\n\n.method static synthetic access$1100()I\n    .locals 1\n\n    .prologue\n    .line 56\n    sget v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->numLinesWritten:I\n\n    return v0\n.end method\n\n.method static synthetic access$1102(I)I\n    .locals 0\n\n    .prologue\n    .line 56\n    sput p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->numLinesWritten:I\n\n    return p0\n.end method\n\n.method static synthetic access$1112(I)I\n    .locals 1\n\n    .prologue\n    .line 56\n    sget v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->numLinesWritten:I\n\n    add-int/2addr v0, p0\n\n    sput v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->numLinesWritten:I\n\n    return v0\n.end method\n\n.method static synthetic access$1200()I\n    .locals 1\n\n    .prologue\n    .line 56\n    sget v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_MAX_EVENTS_PER_FILE:I\n\n    return v0\n.end method\n\n.method static synthetic access$1400(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;)Landroid/content/Context;\n    .locals 1\n\n    .prologue\n    .line 56\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n\n    return-object v0\n.end method\n\n.method static synthetic access$1500(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;)Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 56\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationVersion:Ljava/lang/String;\n\n    return-object v0\n.end method\n\n.method static synthetic access$1502(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;Ljava/lang/String;)Ljava/lang/String;\n    .locals 0\n\n    .prologue\n    .line 56\n    iput-object p1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationVersion:Ljava/lang/String;\n\n    return-object p1\n.end method\n\n.method static synthetic access$1600(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;)Landroid/location/Criteria;\n    .locals 1\n\n    .prologue\n    .line 56\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locationCriteria:Landroid/location/Criteria;\n\n    return-object v0\n.end method\n\n.method static synthetic access$1602(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;Landroid/location/Criteria;)Landroid/location/Criteria;\n    .locals 0\n\n    .prologue\n    .line 56\n    iput-object p1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locationCriteria:Landroid/location/Criteria;\n\n    return-object p1\n.end method\n\n.method static synthetic access$1702(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;Z)Z\n    .locals 0\n\n    .prologue\n    .line 56\n    iput-boolean p1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->haveLocationPermission:Z\n\n    return p1\n.end method\n\n.method static synthetic access$1802(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;Z)Z\n    .locals 0\n\n    .prologue\n    .line 56\n    iput-boolean p1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->haveNetworkStatePermission:Z\n\n    return p1\n.end method\n\n.method static synthetic access$1900(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;Z)V\n    .locals 0\n\n    .prologue\n    .line 56\n    invoke-direct {p0, p1}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->handleSessionStatus(Z)V\n\n    return-void\n.end method\n\n.method static synthetic access$200(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;)V\n    .locals 0\n\n    .prologue\n    .line 56\n    invoke-direct {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->updateLocation()V\n\n    return-void\n.end method\n\n.method static synthetic access$2000()I\n    .locals 1\n\n    .prologue\n    .line 56\n    sget v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->SYNC_RUNNING:I\n\n    return v0\n.end method\n\n.method static synthetic access$2100()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 56\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_DIRECTORY:Ljava/lang/String;\n\n    return-object v0\n.end method\n\n.method static synthetic access$2200()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 56\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->MC_ANALYTICS_DIRECTORY:Ljava/lang/String;\n\n    return-object v0\n.end method\n\n.method static synthetic access$2300()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 56\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->syncContents:Ljava/lang/String;\n\n    return-object v0\n.end method\n\n.method static synthetic access$2302(Ljava/lang/String;)Ljava/lang/String;\n    .locals 0\n\n    .prologue\n    .line 56\n    sput-object p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->syncContents:Ljava/lang/String;\n\n    return-object p0\n.end method\n\n.method static synthetic access$2400(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;)Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 56\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->analyticsServer:Ljava/lang/String;\n\n    return-object v0\n.end method\n\n.method static synthetic access$2500()I\n    .locals 1\n\n    .prologue\n    .line 56\n    sget v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->SYNC_ERROR:I\n\n    return v0\n.end method\n\n.method static synthetic access$400()Z\n    .locals 1\n\n    .prologue\n    .line 56\n    sget-boolean v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->loggingEvent:Z\n\n    return v0\n.end method\n\n.method static synthetic access$402(Z)Z\n    .locals 0\n\n    .prologue\n    .line 56\n    sput-boolean p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->loggingEvent:Z\n\n    return p0\n.end method\n\n.method static synthetic access$500()I\n    .locals 1\n\n    .prologue\n    .line 56\n    sget v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->syncStatus:I\n\n    return v0\n.end method\n\n.method static synthetic access$502(I)I\n    .locals 0\n\n    .prologue\n    .line 56\n    sput p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->syncStatus:I\n\n    return p0\n.end method\n\n.method static synthetic access$600()I\n    .locals 1\n\n    .prologue\n    .line 56\n    sget v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->SYNC_READY:I\n\n    return v0\n.end method\n\n.method static synthetic access$700()Z\n    .locals 1\n\n    .prologue\n    .line 56\n    sget-boolean v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->fileCreated:Z\n\n    return v0\n.end method\n\n.method static synthetic access$702(Z)Z\n    .locals 0\n\n    .prologue\n    .line 56\n    sput-boolean p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->fileCreated:Z\n\n    return p0\n.end method\n\n.method static synthetic access$800(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;)Z\n    .locals 1\n\n    .prologue\n    .line 56\n    invoke-direct {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->OpenAnalyticsFile()Z\n\n    move-result v0\n\n    return v0\n.end method\n\n.method static synthetic access$900()Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n    .locals 1\n\n    .prologue\n    .line 56\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    return-object v0\n.end method\n\n.method static addPref(Ljava/lang/String;Ljava/lang/String;)V\n    .locals 1\n\n    .prologue\n    .line 333\n    :try_start_0\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v0, v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sharedPrefs:Landroid/content/SharedPreferences;\n\n    invoke-interface {v0}, Landroid/content/SharedPreferences;->edit()Landroid/content/SharedPreferences$Editor;\n\n    move-result-object v0\n\n    .line 334\n    invoke-interface {v0, p0, p1}, Landroid/content/SharedPreferences$Editor;->putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;\n\n    .line 335\n    invoke-interface {v0}, Landroid/content/SharedPreferences$Editor;->commit()Z\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    .line 338\n    :goto_0\n    return-void\n\n    .line 336\n    :catch_0\n    move-exception v0\n\n    goto :goto_0\n.end method\n\n.method static addPref(Ljava/util/Map;)V\n    .locals 3\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"(\",\n            \"Ljava/util/Map\",\n            \"<\",\n            \"Ljava/lang/String;\",\n            \"Ljava/lang/String;\",\n            \">;)V\"\n        }\n    .end annotation\n\n    .prologue\n    .line 342\n    :try_start_0\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v0, v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sharedPrefs:Landroid/content/SharedPreferences;\n\n    invoke-interface {v0}, Landroid/content/SharedPreferences;->edit()Landroid/content/SharedPreferences$Editor;\n\n    move-result-object v1\n\n    .line 343\n    invoke-interface {p0}, Ljava/util/Map;->entrySet()Ljava/util/Set;\n\n    move-result-object v0\n\n    invoke-interface {v0}, Ljava/util/Set;->iterator()Ljava/util/Iterator;\n\n    move-result-object v2\n\n    .line 344\n    :goto_0\n    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z\n\n    move-result v0\n\n    if-eqz v0, :cond_0\n\n    .line 345\n    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;\n\n    move-result-object p0\n\n    check-cast p0, Ljava/util/Map$Entry;\n\n    .line 346\n    invoke-interface {p0}, Ljava/util/Map$Entry;->getKey()Ljava/lang/Object;\n\n    move-result-object v0\n\n    check-cast v0, Ljava/lang/String;\n\n    invoke-interface {p0}, Ljava/util/Map$Entry;->getValue()Ljava/lang/Object;\n\n    move-result-object p0\n\n    check-cast p0, Ljava/lang/String;\n\n    invoke-interface {v1, v0, p0}, Landroid/content/SharedPreferences$Editor;->putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;\n\n    goto :goto_0\n\n    .line 349\n    :catch_0\n    move-exception v0\n\n    .line 351\n    :goto_1\n    return-void\n\n    .line 348\n    :cond_0\n    invoke-interface {v1}, Landroid/content/SharedPreferences$Editor;->commit()Z\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    goto :goto_1\n.end method\n\n.method static clearPref()V\n    .locals 1\n\n    .prologue\n    .line 364\n    :try_start_0\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v0, v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sharedPrefs:Landroid/content/SharedPreferences;\n\n    invoke-interface {v0}, Landroid/content/SharedPreferences;->edit()Landroid/content/SharedPreferences$Editor;\n\n    move-result-object v0\n\n    .line 365\n    invoke-interface {v0}, Landroid/content/SharedPreferences$Editor;->clear()Landroid/content/SharedPreferences$Editor;\n\n    .line 366\n    invoke-interface {v0}, Landroid/content/SharedPreferences$Editor;->commit()Z\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    .line 369\n    :goto_0\n    return-void\n\n    .line 367\n    :catch_0\n    move-exception v0\n\n    goto :goto_0\n.end method\n\n.method private createNewSession()V\n    .locals 7\n\n    .prologue\n    const-wide/16 v5, 0x0\n\n    const/4 v4, 0x1\n\n    .line 804\n    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J\n\n    move-result-wide v0\n\n    .line 805\n    new-instance v2, Ljava/lang/StringBuilder;\n\n    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V\n\n    iget-object v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceId:Ljava/lang/String;\n\n    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v2\n\n    invoke-virtual {v2, v0, v1}, Ljava/lang/StringBuilder;->append(J)Ljava/lang/StringBuilder;\n\n    move-result-object v2\n\n    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-static {v2}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sha1(Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    .line 807\n    iput-boolean v4, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isTopTask:Z\n\n    .line 808\n    iput-wide v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionStartTime:J\n\n    .line 809\n    iput-wide v5, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionEndTime:J\n\n    .line 810\n    iput-wide v5, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->totalIdleTime:J\n\n    .line 811\n    iput-boolean v4, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInSession:Z\n\n    .line 813\n    :try_start_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->session:Lorg/json/JSONObject;\n\n    const-string v1, \"id\"\n\n    const-string v3, \"UTF-8\"\n\n    invoke-static {v2, v3}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    .line 817\n    :goto_0\n    const/4 v0, 0x0\n\n    iput v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->remoteConfigSet:I\n\n    .line 818\n    new-instance v0, Ljava/lang/Thread;\n\n    new-instance v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$FetchRemoteConfig;\n\n    const/4 v2, 0x0\n\n    invoke-direct {v1, p0, v2}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$FetchRemoteConfig;-><init>(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$1;)V\n\n    invoke-direct {v0, v1}, Ljava/lang/Thread;-><init>(Ljava/lang/Runnable;)V\n\n    .line 819\n    invoke-virtual {v0}, Ljava/lang/Thread;->start()V\n\n    .line 820\n    return-void\n\n    .line 814\n    :catch_0\n    move-exception v0\n\n    .line 815\n    const-string v0, \"DoodleMobileAnaylise\"\n\n    const-string v1, \"static sync 2\"\n\n    invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n\n    goto :goto_0\n.end method\n\n.method private endSession()V\n    .locals 6\n\n    .prologue\n    const-string v0, \"totalSessionTime\"\n\n    const-string v0, \"totalIdleTime\"\n\n    const-string v0, \"offlineSessions\"\n\n    .line 852\n    :try_start_0\n    iget-boolean v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInSession:Z\n\n    if-nez v0, :cond_0\n\n    .line 893\n    :goto_0\n    return-void\n\n    .line 854\n    :cond_0\n    iget-wide v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionEndTime:J\n\n    iget-wide v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionStartTime:J\n\n    sub-long/2addr v0, v2\n\n    .line 856\n    const-string v2, \"totalSessionTime\"\n\n    invoke-static {v2}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->hasPref(Ljava/lang/String;)Z\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    move-result v2\n\n    if-eqz v2, :cond_1\n\n    .line 858\n    :try_start_1\n    const-string v2, \"totalSessionTime\"\n\n    invoke-static {v2}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getPref(Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-static {v2}, Ljava/lang/Long;->parseLong(Ljava/lang/String;)J\n    :try_end_1\n    .catch Ljava/lang/Exception; {:try_start_1 .. :try_end_1} :catch_3\n\n    move-result-wide v2\n\n    add-long/2addr v0, v2\n\n    .line 861\n    :cond_1\n    :goto_1\n    :try_start_2\n    const-string v2, \"totalIdleTime\"\n\n    invoke-static {v2}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->hasPref(Ljava/lang/String;)Z\n    :try_end_2\n    .catch Ljava/lang/Exception; {:try_start_2 .. :try_end_2} :catch_0\n\n    move-result v2\n\n    if-eqz v2, :cond_2\n\n    .line 863\n    :try_start_3\n    iget-wide v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->totalIdleTime:J\n\n    const-string v4, \"totalIdleTime\"\n\n    invoke-static {v4}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getPref(Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v4\n\n    invoke-static {v4}, Ljava/lang/Long;->parseLong(Ljava/lang/String;)J\n\n    move-result-wide v4\n\n    add-long/2addr v2, v4\n\n    iput-wide v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->totalIdleTime:J\n    :try_end_3\n    .catch Ljava/lang/Exception; {:try_start_3 .. :try_end_3} :catch_2\n\n    .line 867\n    :cond_2\n    :goto_2\n    :try_start_4\n    new-instance v2, Ljava/util/HashMap;\n\n    invoke-direct {v2}, Ljava/util/HashMap;-><init>()V\n\n    .line 868\n    const-string v3, \"totalSessionTime\"\n\n    invoke-static {v0, v1}, Ljava/lang/Long;->toString(J)Ljava/lang/String;\n\n    move-result-object v0\n\n    invoke-virtual {v2, v3, v0}, Ljava/util/HashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 869\n    const-string v0, \"totalIdleTime\"\n\n    iget-wide v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->totalIdleTime:J\n\n    invoke-static {v3, v4}, Ljava/lang/Long;->toString(J)Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-virtual {v2, v0, v1}, Ljava/util/HashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 872\n    iget-boolean v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isOfflineSession:Z\n\n    if-eqz v0, :cond_4\n\n    .line 873\n    const/4 v0, 0x1\n\n    .line 874\n    const-string v1, \"offlineSessions\"\n\n    invoke-static {v1}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->hasPref(Ljava/lang/String;)Z\n    :try_end_4\n    .catch Ljava/lang/Exception; {:try_start_4 .. :try_end_4} :catch_0\n\n    move-result v1\n\n    if-eqz v1, :cond_3\n\n    .line 876\n    :try_start_5\n    const-string v1, \"offlineSessions\"\n\n    invoke-static {v1}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getPref(Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-static {v1}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I\n    :try_end_5\n    .catch Ljava/lang/Exception; {:try_start_5 .. :try_end_5} :catch_1\n\n    move-result v1\n\n    add-int/2addr v0, v1\n\n    .line 880\n    :cond_3\n    :goto_3\n    :try_start_6\n    const-string v1, \"offlineSessions\"\n\n    int-to-long v3, v0\n\n    invoke-static {v3, v4}, Ljava/lang/Long;->toString(J)Ljava/lang/String;\n\n    move-result-object v0\n\n    invoke-virtual {v2, v1, v0}, Ljava/util/HashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 884\n    :cond_4\n    invoke-static {v2}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->addPref(Ljava/util/Map;)V\n\n    .line 886\n    const/4 v0, 0x0\n\n    iput-boolean v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInSession:Z\n\n    .line 887\n    const/4 v0, 0x0\n\n    iput-boolean v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isTopTask:Z\n\n    .line 888\n    const-wide/16 v0, 0x0\n\n    iput-wide v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionStartTime:J\n\n    .line 889\n    const-wide/16 v0, 0x0\n\n    iput-wide v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionEndTime:J\n\n    .line 890\n    const-wide/16 v0, 0x0\n\n    iput-wide v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->totalIdleTime:J\n    :try_end_6\n    .catch Ljava/lang/Exception; {:try_start_6 .. :try_end_6} :catch_0\n\n    goto :goto_0\n\n    .line 891\n    :catch_0\n    move-exception v0\n\n    goto/16 :goto_0\n\n    .line 878\n    :catch_1\n    move-exception v1\n\n    goto :goto_3\n\n    .line 865\n    :catch_2\n    move-exception v2\n\n    goto :goto_2\n\n    .line 859\n    :catch_3\n    move-exception v2\n\n    goto :goto_1\n.end method\n\n.method static getAllPref()Ljava/util/HashMap;\n    .locals 1\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"()\",\n            \"Ljava/util/HashMap\",\n            \"<\",\n            \"Ljava/lang/String;\",\n            \"Ljava/lang/String;\",\n            \">;\"\n        }\n    .end annotation\n\n    .prologue\n    .line 309\n    :try_start_0\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v0, v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sharedPrefs:Landroid/content/SharedPreferences;\n\n    invoke-interface {v0}, Landroid/content/SharedPreferences;->getAll()Ljava/util/Map;\n\n    move-result-object v0\n\n    check-cast v0, Ljava/util/HashMap;\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    .line 312\n    :goto_0\n    return-object v0\n\n    .line 310\n    :catch_0\n    move-exception v0\n\n    .line 312\n    new-instance v0, Ljava/util/HashMap;\n\n    invoke-direct {v0}, Ljava/util/HashMap;-><init>()V\n\n    goto :goto_0\n.end method\n\n.method static getCookieStringFromCookieManager(Ljava/lang/String;)Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 901\n    :try_start_0\n    invoke-static {}, Landroid/webkit/CookieManager;->getInstance()Landroid/webkit/CookieManager;\n\n    move-result-object v0\n\n    .line 902\n    invoke-virtual {v0, p0}, Landroid/webkit/CookieManager;->getCookie(Ljava/lang/String;)Ljava/lang/String;\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    move-result-object v0\n\n    .line 905\n    :goto_0\n    return-object v0\n\n    .line 903\n    :catch_0\n    move-exception v0\n\n    .line 905\n    const-string v0, \"\"\n\n    goto :goto_0\n.end method\n\n.method public static getInstance()Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n    .locals 1\n\n    .prologue\n    .line 515\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    return-object v0\n.end method\n\n.method static getPref(Ljava/lang/String;)Ljava/lang/String;\n    .locals 3\n\n    .prologue\n    const-string v2, \"\"\n\n    .line 317\n    :try_start_0\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v0, v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sharedPrefs:Landroid/content/SharedPreferences;\n\n    const-string v1, \"\"\n\n    invoke-interface {v0, p0, v1}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    move-result-object v0\n\n    .line 320\n    :goto_0\n    return-object v0\n\n    .line 318\n    :catch_0\n    move-exception v0\n\n    .line 320\n    const-string v0, \"\"\n\n    move-object v0, v2\n\n    goto :goto_0\n.end method\n\n.method private declared-synchronized handleSessionStatus(Z)V\n    .locals 6\n\n    .prologue\n    .line 824\n    monitor-enter p0\n\n    :try_start_0\n    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J\n\n    move-result-wide v0\n\n    .line 825\n    if-eqz p1, :cond_3\n\n    .line 826\n    iget-boolean v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isTopTask:Z\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n    .catchall {:try_start_0 .. :try_end_0} :catchall_0\n\n    if-eqz v2, :cond_1\n\n    .line 848\n    :cond_0\n    :goto_0\n    monitor-exit p0\n\n    return-void\n\n    .line 829\n    :cond_1\n    :try_start_1\n    iget-boolean v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInSession:Z\n\n    if-nez v2, :cond_2\n\n    .line 830\n    invoke-direct {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->createNewSession()V\n    :try_end_1\n    .catch Ljava/lang/Exception; {:try_start_1 .. :try_end_1} :catch_0\n    .catchall {:try_start_1 .. :try_end_1} :catchall_0\n\n    goto :goto_0\n\n    .line 845\n    :catch_0\n    move-exception v0\n\n    .line 846\n    :try_start_2\n    const-string v0, \"DoodleMobileAnaylise\"\n\n    const-string v1, \"static sync 3\"\n\n    invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n    :try_end_2\n    .catchall {:try_start_2 .. :try_end_2} :catchall_0\n\n    goto :goto_0\n\n    .line 824\n    :catchall_0\n    move-exception v0\n\n    monitor-exit p0\n\n    throw v0\n\n    .line 832\n    :cond_2\n    :try_start_3\n    iget-wide v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->totalIdleTime:J\n\n    iget-wide v4, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionEndTime:J\n\n    sub-long/2addr v0, v4\n\n    add-long/2addr v0, v2\n\n    iput-wide v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->totalIdleTime:J\n\n    .line 833\n    const/4 v0, 0x1\n\n    iput-boolean v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isTopTask:Z\n\n    goto :goto_0\n\n    .line 836\n    :cond_3\n    iget-boolean v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isTopTask:Z\n\n    if-nez v2, :cond_4\n\n    .line 837\n    iget-wide v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionEndTime:J\n\n    sub-long/2addr v0, v2\n\n    iget v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->idleTimeout:I\n\n    int-to-long v2, v2\n\n    cmp-long v0, v0, v2\n\n    if-lez v0, :cond_0\n\n    iget-boolean v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInSession:Z\n\n    if-eqz v0, :cond_0\n\n    .line 839\n    invoke-direct {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->endSession()V\n\n    goto :goto_0\n\n    .line 841\n    :cond_4\n    iput-wide v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionEndTime:J\n\n    .line 842\n    const/4 v0, 0x0\n\n    iput-boolean v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isTopTask:Z\n\n    .line 843\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->location:Lcom/doodlemobile/gamecenter/DoodleMobileLocation;\n\n    invoke-virtual {v0}, Lcom/doodlemobile/gamecenter/DoodleMobileLocation;->stopLocation()V\n    :try_end_3\n    .catch Ljava/lang/Exception; {:try_start_3 .. :try_end_3} :catch_0\n    .catchall {:try_start_3 .. :try_end_3} :catchall_0\n\n    goto :goto_0\n.end method\n\n.method static hasPref(Ljava/lang/String;)Z\n    .locals 1\n\n    .prologue\n    .line 325\n    :try_start_0\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v0, v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sharedPrefs:Landroid/content/SharedPreferences;\n\n    invoke-interface {v0, p0}, Landroid/content/SharedPreferences;->contains(Ljava/lang/String;)Z\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    move-result v0\n\n    .line 328\n    :goto_0\n    return v0\n\n    .line 326\n    :catch_0\n    move-exception v0\n\n    .line 328\n    const/4 v0, 0x0\n\n    goto :goto_0\n.end method\n\n.method private initialize(Landroid/app/Activity;Ljava/lang/String;I)V\n    .locals 7\n\n    .prologue\n    const/4 v6, 0x0\n\n    const/4 v5, 0x0\n\n    const-string v4, \"\"\n\n    const-string v3, \"null\"\n\n    .line 455\n    iput-object p1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n\n    .line 456\n    iput-object p2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationId:Ljava/lang/String;\n\n    .line 457\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationId:Ljava/lang/String;\n\n    if-eqz v0, :cond_0\n\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationId:Ljava/lang/String;\n\n    const-string v1, \"\"\n\n    invoke-virtual {v0, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_1\n\n    .line 458\n    :cond_0\n    const-string v0, \"null\"\n\n    iput-object v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationId:Ljava/lang/String;\n\n    .line 459\n    :cond_1\n    sget-object v0, Landroid/os/Build$VERSION;->RELEASE:Ljava/lang/String;\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidVersion:Ljava/lang/String;\n\n    .line 460\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidVersion:Ljava/lang/String;\n\n    if-eqz v0, :cond_2\n\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidVersion:Ljava/lang/String;\n\n    const-string v1, \"\"\n\n    invoke-virtual {v0, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_3\n\n    .line 461\n    :cond_2\n    const-string v0, \"null\"\n\n    iput-object v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidVersion:Ljava/lang/String;\n\n    .line 465\n    :cond_3\n    :try_start_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n\n    const-string v1, \"phone\"\n\n    invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    check-cast v0, Landroid/telephony/TelephonyManager;\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    .line 469\n    :goto_0\n    invoke-virtual {p1}, Landroid/app/Activity;->getContentResolver()Landroid/content/ContentResolver;\n\n    move-result-object v1\n\n    const-string v2, \"android_id\"\n\n    invoke-static {v1, v2}, Landroid/provider/Settings$System;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v1\n\n    iput-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidId:Ljava/lang/String;\n\n    .line 471\n    iget-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidId:Ljava/lang/String;\n\n    if-eqz v1, :cond_4\n\n    iget-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidId:Ljava/lang/String;\n\n    const-string v2, \"\"\n\n    invoke-virtual {v1, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v1\n\n    if-eqz v1, :cond_5\n\n    .line 472\n    :cond_4\n    const-string v1, \"null\"\n\n    iput-object v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidId:Ljava/lang/String;\n\n    .line 474\n    :cond_5\n    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;\n\n    move-result-object v0\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceId:Ljava/lang/String;\n\n    .line 475\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceId:Ljava/lang/String;\n\n    if-eqz v0, :cond_6\n\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceId:Ljava/lang/String;\n\n    const-string v1, \"\"\n\n    invoke-virtual {v0, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_7\n\n    .line 476\n    :cond_6\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidId:Ljava/lang/String;\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceId:Ljava/lang/String;\n\n    .line 478\n    :cond_7\n    sget-object v0, Landroid/os/Build;->MODEL:Ljava/lang/String;\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceModel:Ljava/lang/String;\n\n    .line 479\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceModel:Ljava/lang/String;\n\n    if-eqz v0, :cond_8\n\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceModel:Ljava/lang/String;\n\n    const-string v1, \"\"\n\n    invoke-virtual {v0, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_9\n\n    .line 480\n    :cond_8\n    const-string v0, \"null\"\n\n    iput-object v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceModel:Ljava/lang/String;\n\n    .line 482\n    :cond_9\n    sget-object v0, Landroid/os/Build;->DEVICE:Ljava/lang/String;\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceHardwareModel:Ljava/lang/String;\n\n    .line 483\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceHardwareModel:Ljava/lang/String;\n\n    if-eqz v0, :cond_a\n\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceHardwareModel:Ljava/lang/String;\n\n    const-string v1, \"\"\n\n    invoke-virtual {v0, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_b\n\n    .line 485\n    :cond_a\n    const-string v0, \"null\"\n\n    iput-object v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceHardwareModel:Ljava/lang/String;\n\n    .line 488\n    :cond_b\n    iput p3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->logLevel:I\n\n    .line 490\n    const-string v0, \"null\"\n\n    iput-object v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationVersion:Ljava/lang/String;\n\n    .line 491\n    const-string v0, \"null\"\n\n    iput-object v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->longitude:Ljava/lang/String;\n\n    .line 492\n    const-string v0, \"null\"\n\n    iput-object v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->latitude:Ljava/lang/String;\n\n    .line 493\n    iput-boolean v5, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->haveLocationPermission:Z\n\n    .line 494\n    iput-object v6, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locationCriteria:Landroid/location/Criteria;\n\n    .line 495\n    iput-boolean v5, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->haveNetworkStatePermission:Z\n\n    .line 496\n    invoke-static {}, Ljava/util/Locale;->getDefault()Ljava/util/Locale;\n\n    move-result-object v0\n\n    invoke-virtual {v0}, Ljava/util/Locale;->getCountry()Ljava/lang/String;\n\n    move-result-object v0\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locale:Ljava/lang/String;\n\n    .line 497\n    invoke-static {}, Ljava/util/Locale;->getDefault()Ljava/util/Locale;\n\n    move-result-object v0\n\n    invoke-virtual {v0}, Ljava/util/Locale;->getLanguage()Ljava/lang/String;\n\n    move-result-object v0\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->language:Ljava/lang/String;\n\n    .line 499\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n\n    invoke-static {v0}, Landroid/webkit/CookieSyncManager;->createInstance(Landroid/content/Context;)Landroid/webkit/CookieSyncManager;\n\n    .line 501\n    new-instance v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$2;\n\n    invoke-direct {v0, p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$2;-><init>(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;)V\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locationHandler:Landroid/os/Handler;\n\n    .line 506\n    new-instance v0, Ljava/lang/StringBuilder;\n\n    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V\n\n    invoke-virtual {p1}, Landroid/app/Activity;->getPackageName()Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v0\n\n    const-string v1, \".MCConfig\"\n\n    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v0\n\n    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v0\n\n    invoke-virtual {p1, v0, v5}, Landroid/app/Activity;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;\n\n    move-result-object v0\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sharedPrefs:Landroid/content/SharedPreferences;\n\n    .line 509\n    iget v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->pollTime:I\n\n    iget v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->idleTimeout:I\n\n    invoke-static {v0, v1}, Ljava/lang/Math;->min(II)I\n\n    move-result v0\n\n    iput v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->pollTime:I\n\n    .line 510\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sessionPollingTimer:Ljava/util/Timer;\n\n    new-instance v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$SessionPolling;\n\n    invoke-direct {v1, p0, v6}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$SessionPolling;-><init>(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$1;)V\n\n    const-wide/16 v2, 0x0\n\n    iget v4, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->pollTime:I\n\n    int-to-long v4, v4\n\n    invoke-virtual/range {v0 .. v5}, Ljava/util/Timer;->scheduleAtFixedRate(Ljava/util/TimerTask;JJ)V\n\n    .line 512\n    return-void\n\n    .line 467\n    :catch_0\n    move-exception v0\n\n    move-object v0, v6\n\n    goto/16 :goto_0\n.end method\n\n.method public static final logEvent(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V\n    .locals 5\n\n    .prologue\n    const-string v0, \"UTF-8\"\n\n    const-string v2, \"DoodleMobile\"\n\n    .line 672\n    sget-boolean v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInitialized:Z\n\n    if-nez v0, :cond_1\n\n    .line 673\n    const-string v0, \"mobclix-controller\"\n\n    const-string v1, \"logEvent failed - You must initialize DoodleMobileAnaylise by calling DoodleMobileAnaylise.onCreate(this).\"\n\n    invoke-static {v0, v1}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I\n\n    .line 717\n    :cond_0\n    :goto_0\n    return-void\n\n    .line 678\n    :cond_1\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget v0, v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->logLevel:I\n\n    if-lt p0, v0, :cond_0\n\n    .line 682\n    new-instance v0, Ljava/lang/StringBuilder;\n\n    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V\n\n    invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v0\n\n    const-string v1, \", \"\n\n    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v0\n\n    invoke-virtual {v0, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v0\n\n    const-string v1, \": \"\n\n    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v0\n\n    invoke-virtual {v0, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v0\n\n    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v0\n\n    .line 684\n    sparse-switch p0, :sswitch_data_0\n\n    .line 702\n    :goto_1\n    :try_start_0\n    new-instance v0, Lorg/json/JSONObject;\n\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v1, v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->session:Lorg/json/JSONObject;\n\n    const/4 v2, 0x4\n\n    new-array v2, v2, [Ljava/lang/String;\n\n    const/4 v3, 0x0\n\n    const-string v4, \"ts\"\n\n    aput-object v4, v2, v3\n\n    const/4 v3, 0x1\n\n    const-string v4, \"ll\"\n\n    aput-object v4, v2, v3\n\n    const/4 v3, 0x2\n\n    const-string v4, \"g\"\n\n    aput-object v4, v2, v3\n\n    const/4 v3, 0x3\n\n    const-string v4, \"id\"\n\n    aput-object v4, v2, v3\n\n    invoke-direct {v0, v1, v2}, Lorg/json/JSONObject;-><init>(Lorg/json/JSONObject;[Ljava/lang/String;)V\n\n    .line 704\n    const-string v1, \"el\"\n\n    invoke-static {p0}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 705\n    const-string v1, \"ep\"\n\n    const-string v2, \"UTF-8\"\n\n    invoke-static {p1, v2}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 706\n    const-string v1, \"en\"\n\n    const-string v2, \"UTF-8\"\n\n    invoke-static {p2, v2}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 707\n    const-string v1, \"ed\"\n\n    const-string v2, \"UTF-8\"\n\n    invoke-static {p3, v2}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 708\n    const-string v1, \"et\"\n\n    invoke-static {}, Ljava/lang/Thread;->currentThread()Ljava/lang/Thread;\n\n    move-result-object v2\n\n    invoke-virtual {v2}, Ljava/lang/Thread;->getId()J\n\n    move-result-wide v2\n\n    invoke-static {v2, v3}, Ljava/lang/Long;->toString(J)Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 709\n    const-string v1, \"es\"\n\n    if-eqz p4, :cond_2\n\n    const-string v2, \"1\"\n\n    :goto_2\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 710\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    .line 711\n    invoke-virtual {v1}, Ljava/lang/Object;->getClass()Ljava/lang/Class;\n\n    .line 712\n    new-instance v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$LogEvent;\n\n    invoke-virtual {v1}, Ljava/lang/Object;->getClass()Ljava/lang/Class;\n\n    invoke-direct {v2, v1, v0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$LogEvent;-><init>(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;Lorg/json/JSONObject;)V\n\n    .line 713\n    new-instance v0, Ljava/lang/Thread;\n\n    invoke-direct {v0, v2}, Ljava/lang/Thread;-><init>(Ljava/lang/Runnable;)V\n\n    .line 714\n    invoke-virtual {v0}, Ljava/lang/Thread;->start()V\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    goto/16 :goto_0\n\n    .line 715\n    :catch_0\n    move-exception v0\n\n    goto/16 :goto_0\n\n    .line 686\n    :sswitch_0\n    const-string v1, \"DoodleMobile\"\n\n    invoke-static {v2, v0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I\n\n    goto/16 :goto_1\n\n    .line 689\n    :sswitch_1\n    const-string v1, \"DoodleMobile\"\n\n    invoke-static {v2, v0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I\n\n    goto/16 :goto_1\n\n    .line 692\n    :sswitch_2\n    const-string v1, \"DoodleMobile\"\n\n    invoke-static {v2, v0}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n\n    goto/16 :goto_1\n\n    .line 695\n    :sswitch_3\n    const-string v1, \"DoodleMobile\"\n\n    invoke-static {v2, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I\n\n    goto/16 :goto_1\n\n    .line 698\n    :sswitch_4\n    const-string v1, \"DoodleMobile\"\n\n    invoke-static {v2, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I\n\n    goto/16 :goto_1\n\n    .line 709\n    :cond_2\n    :try_start_1\n    const-string v2, \"0\"\n    :try_end_1\n    .catch Ljava/lang/Exception; {:try_start_1 .. :try_end_1} :catch_0\n\n    goto :goto_2\n\n    .line 684\n    :sswitch_data_0\n    .sparse-switch\n        0x1 -> :sswitch_0\n        0x2 -> :sswitch_1\n        0x4 -> :sswitch_2\n        0x8 -> :sswitch_3\n        0x10 -> :sswitch_4\n    .end sparse-switch\n.end method\n\n.method public static final declared-synchronized onCreate(Landroid/app/Activity;)V\n    .locals 7\n\n    .prologue\n    const/4 v5, 0x0\n\n    const-string v0, \"ssc\"\n\n    const-string v0, \"DoodleMobileAnaylise\"\n\n    const-string v0, \"doodle_mobile_appid\"\n\n    .line 520\n    const-class v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    monitor-enter v0\n\n    if-eqz p0, :cond_0\n\n    .line 521\n    :try_start_0\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    invoke-virtual {p0}, Landroid/app/Activity;->getApplicationContext()Landroid/content/Context;\n\n    move-result-object v2\n\n    iput-object v2, v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_8\n    .catchall {:try_start_0 .. :try_end_0} :catchall_0\n\n    .line 525\n    :cond_0\n    :goto_0\n    :try_start_1\n    sget-boolean v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInitialized:Z\n    :try_end_1\n    .catchall {:try_start_1 .. :try_end_1} :catchall_0\n\n    if-nez v1, :cond_4\n\n    .line 528\n    :try_start_2\n    invoke-virtual {p0}, Landroid/app/Activity;->getPackageName()Ljava/lang/String;\n\n    move-result-object v1\n\n    sput-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->packageName:Ljava/lang/String;\n    :try_end_2\n    .catch Ljava/lang/Exception; {:try_start_2 .. :try_end_2} :catch_7\n    .catchall {:try_start_2 .. :try_end_2} :catchall_0\n\n    .line 531\n    :goto_1\n    const/4 v1, 0x0\n\n    :try_start_3\n    sput-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationInfo:Landroid/content/pm/ApplicationInfo;\n    :try_end_3\n    .catchall {:try_start_3 .. :try_end_3} :catchall_0\n\n    .line 533\n    :try_start_4\n    invoke-virtual {p0}, Landroid/app/Activity;->getPackageManager()Landroid/content/pm/PackageManager;\n\n    move-result-object v1\n\n    sget-object v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->packageName:Ljava/lang/String;\n\n    const/16 v3, 0x80\n\n    invoke-virtual {v1, v2, v3}, Landroid/content/pm/PackageManager;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;\n\n    move-result-object v1\n\n    sput-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationInfo:Landroid/content/pm/ApplicationInfo;\n    :try_end_4\n    .catch Landroid/content/pm/PackageManager$NameNotFoundException; {:try_start_4 .. :try_end_4} :catch_0\n    .catchall {:try_start_4 .. :try_end_4} :catchall_0\n\n    .line 541\n    :goto_2\n    :try_start_5\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationInfo:Landroid/content/pm/ApplicationInfo;\n\n    iget-object v1, v1, Landroid/content/pm/ApplicationInfo;->metaData:Landroid/os/Bundle;\n\n    const-string v2, \"doodle_mobile_appid\"\n\n    invoke-virtual {v1, v2}, Landroid/os/Bundle;->getString(Ljava/lang/String;)Ljava/lang/String;\n    :try_end_5\n    .catch Ljava/lang/Exception; {:try_start_5 .. :try_end_5} :catch_1\n    .catchall {:try_start_5 .. :try_end_5} :catchall_0\n\n    move-result-object v1\n\n    .line 543\n    :try_start_6\n    const-string v2, \"ssc\"\n\n    new-instance v3, Ljava/lang/StringBuilder;\n\n    invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V\n\n    const-string v4, \"applicationID  1 is \"\n\n    invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v3\n\n    invoke-virtual {v3, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v3\n\n    invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v3\n\n    invoke-static {v2, v3}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I\n    :try_end_6\n    .catch Ljava/lang/Exception; {:try_start_6 .. :try_end_6} :catch_6\n    .catchall {:try_start_6 .. :try_end_6} :catchall_0\n\n    .line 554\n    :goto_3\n    if-nez v1, :cond_1\n\n    .line 556\n    :try_start_7\n    sget-object v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationInfo:Landroid/content/pm/ApplicationInfo;\n\n    iget-object v2, v2, Landroid/content/pm/ApplicationInfo;->metaData:Landroid/os/Bundle;\n\n    const-string v3, \"doodle_mobile_appid\"\n\n    invoke-virtual {v2, v3}, Landroid/os/Bundle;->getInt(Ljava/lang/String;)I\n\n    move-result v2\n\n    invoke-static {v2}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;\n    :try_end_7\n    .catch Ljava/lang/Exception; {:try_start_7 .. :try_end_7} :catch_3\n    .catchall {:try_start_7 .. :try_end_7} :catchall_0\n\n    move-result-object v1\n\n    .line 562\n    :cond_1\n    :goto_4\n    if-nez v1, :cond_2\n\n    .line 565\n    :try_start_8\n    new-instance v1, Landroid/content/res/Resources$NotFoundException;\n\n    const-string v2, \"doodle_mobile_appid not found in the Android Manifest xml.\"\n\n    invoke-direct {v1, v2}, Landroid/content/res/Resources$NotFoundException;-><init>(Ljava/lang/String;)V\n\n    throw v1\n    :try_end_8\n    .catchall {:try_start_8 .. :try_end_8} :catchall_0\n\n    .line 520\n    :catchall_0\n    move-exception v1\n\n    monitor-exit v0\n\n    throw v1\n\n    .line 535\n    :catch_0\n    move-exception v1\n\n    .line 536\n    :try_start_9\n    const-string v1, \"mobclix-controller\"\n\n    const-string v2, \"Application Key Started\"\n\n    invoke-static {v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I\n\n    goto :goto_2\n\n    .line 544\n    :catch_1\n    move-exception v1\n\n    move-object v2, v5\n\n    .line 545\n    :goto_5\n    invoke-virtual {v1}, Ljava/lang/Exception;->printStackTrace()V\n    :try_end_9\n    .catchall {:try_start_9 .. :try_end_9} :catchall_0\n\n    .line 547\n    :try_start_a\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationInfo:Landroid/content/pm/ApplicationInfo;\n\n    iget-object v1, v1, Landroid/content/pm/ApplicationInfo;->metaData:Landroid/os/Bundle;\n\n    const-string v3, \"doodle_mobile_appid\"\n\n    invoke-virtual {v1, v3}, Landroid/os/Bundle;->getInt(Ljava/lang/String;)I\n\n    move-result v1\n\n    invoke-static {v1}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;\n    :try_end_a\n    .catch Ljava/lang/Exception; {:try_start_a .. :try_end_a} :catch_2\n    .catchall {:try_start_a .. :try_end_a} :catchall_0\n\n    move-result-object v1\n\n    goto :goto_3\n\n    .line 549\n    :catch_2\n    move-exception v1\n\n    .line 550\n    :try_start_b\n    invoke-virtual {v1}, Ljava/lang/Exception;->printStackTrace()V\n\n    move-object v1, v2\n\n    goto :goto_3\n\n    .line 558\n    :catch_3\n    move-exception v2\n\n    .line 559\n    invoke-virtual {v2}, Ljava/lang/Exception;->printStackTrace()V\n\n    goto :goto_4\n\n    .line 568\n    :cond_2\n    const-string v2, \"DoodleMobileAnaylise\"\n\n    new-instance v3, Ljava/lang/StringBuilder;\n\n    invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V\n\n    const-string v4, \"applicationId = \"\n\n    invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v3\n\n    invoke-virtual {v3, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-static {v2, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I\n    :try_end_b\n    .catchall {:try_start_b .. :try_end_b} :catchall_0\n\n    .line 571\n    :try_start_c\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationInfo:Landroid/content/pm/ApplicationInfo;\n\n    iget-object v1, v1, Landroid/content/pm/ApplicationInfo;->metaData:Landroid/os/Bundle;\n\n    const-string v2, \"doodle_mobile_loglevel\"\n\n    invoke-virtual {v1, v2}, Landroid/os/Bundle;->getString(Ljava/lang/String;)Ljava/lang/String;\n    :try_end_c\n    .catch Ljava/lang/Exception; {:try_start_c .. :try_end_c} :catch_4\n    .catchall {:try_start_c .. :try_end_c} :catchall_0\n\n    move-result-object v1\n\n    .line 577\n    :goto_6\n    if-eqz v1, :cond_3\n\n    .line 578\n    :try_start_d\n    const-string v2, \"debug\"\n\n    invoke-virtual {v1, v2}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z\n    :try_end_d\n    .catchall {:try_start_d .. :try_end_d} :catchall_0\n\n    move-result v2\n\n    if-eqz v2, :cond_5\n\n    .line 593\n    :cond_3\n    :goto_7\n    :try_start_e\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    invoke-virtual {v1}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->updateSession()V\n\n    .line 595\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    invoke-static {}, Ljava/util/Locale;->getDefault()Ljava/util/Locale;\n\n    move-result-object v2\n\n    invoke-virtual {v2}, Ljava/util/Locale;->getCountry()Ljava/lang/String;\n\n    move-result-object v2\n\n    iput-object v2, v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locale:Ljava/lang/String;\n\n    .line 596\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    invoke-static {}, Ljava/util/Locale;->getDefault()Ljava/util/Locale;\n\n    move-result-object v2\n\n    invoke-virtual {v2}, Ljava/util/Locale;->getLanguage()Ljava/lang/String;\n\n    move-result-object v2\n\n    iput-object v2, v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->language:Ljava/lang/String;\n\n    .line 597\n    const-string v1, \"ssc\"\n\n    new-instance v2, Ljava/lang/StringBuilder;\n\n    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V\n\n    const-string v3, \"doolemobilea 585 \"\n\n    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v2\n\n    sget-object v3, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v3, v3, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locale:Ljava/lang/String;\n\n    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v2\n\n    sget-object v3, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v3, v3, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->language:Ljava/lang/String;\n\n    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v2\n\n    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v2\n\n    invoke-static {v1, v2}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n\n    .line 599\n    sget v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->SYNC_READY:I\n\n    sput v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->syncStatus:I\n\n    .line 601\n    const/4 v1, 0x1\n\n    sput-boolean v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInitialized:Z\n    :try_end_e\n    .catch Ljava/lang/Exception; {:try_start_e .. :try_end_e} :catch_5\n    .catchall {:try_start_e .. :try_end_e} :catchall_0\n\n    .line 606\n    :cond_4\n    :goto_8\n    :try_start_f\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    const/4 v2, 0x1\n\n    invoke-direct {v1, v2}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->handleSessionStatus(Z)V\n    :try_end_f\n    .catchall {:try_start_f .. :try_end_f} :catchall_0\n\n    .line 607\n    monitor-exit v0\n\n    return-void\n\n    .line 573\n    :catch_4\n    move-exception v1\n\n    move-object v1, v5\n\n    goto :goto_6\n\n    .line 580\n    :cond_5\n    :try_start_10\n    const-string v2, \"info\"\n\n    invoke-virtual {v1, v2}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z\n\n    move-result v2\n\n    if-nez v2, :cond_3\n\n    .line 582\n    const-string v2, \"warn\"\n\n    invoke-virtual {v1, v2}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z\n\n    move-result v2\n\n    if-nez v2, :cond_3\n\n    .line 584\n    const-string v2, \"error\"\n\n    invoke-virtual {v1, v2}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z\n\n    move-result v2\n\n    if-nez v2, :cond_3\n\n    .line 586\n    const-string v2, \"fatal\"\n\n    invoke-virtual {v1, v2}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z\n\n    move-result v1\n\n    if-eqz v1, :cond_3\n\n    goto :goto_7\n\n    .line 602\n    :catch_5\n    move-exception v1\n\n    .line 603\n    const-string v1, \"DoodleMobileAnaylise\"\n\n    const-string v2, \"has exception\"\n\n    invoke-static {v1, v2}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n    :try_end_10\n    .catchall {:try_start_10 .. :try_end_10} :catchall_0\n\n    goto :goto_8\n\n    .line 544\n    :catch_6\n    move-exception v2\n\n    move-object v6, v2\n\n    move-object v2, v1\n\n    move-object v1, v6\n\n    goto/16 :goto_5\n\n    .line 529\n    :catch_7\n    move-exception v1\n\n    goto/16 :goto_1\n\n    .line 522\n    :catch_8\n    move-exception v1\n\n    goto/16 :goto_0\n.end method\n\n.method public static final declared-synchronized onStop(Landroid/app/Activity;)V\n    .locals 3\n\n    .prologue\n    .line 610\n    const-class v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    monitor-enter v0\n\n    :try_start_0\n    sget-object v1, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    const/4 v2, 0x0\n\n    invoke-direct {v1, v2}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->handleSessionStatus(Z)V\n    :try_end_0\n    .catchall {:try_start_0 .. :try_end_0} :catchall_0\n\n    .line 612\n    monitor-exit v0\n\n    return-void\n\n    .line 610\n    :catchall_0\n    move-exception v1\n\n    monitor-exit v0\n\n    throw v1\n.end method\n\n.method static removePref(Ljava/lang/String;)V\n    .locals 1\n\n    .prologue\n    .line 355\n    :try_start_0\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->controller:Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;\n\n    iget-object v0, v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->sharedPrefs:Landroid/content/SharedPreferences;\n\n    invoke-interface {v0}, Landroid/content/SharedPreferences;->edit()Landroid/content/SharedPreferences$Editor;\n\n    move-result-object v0\n\n    .line 356\n    invoke-interface {v0, p0}, Landroid/content/SharedPreferences$Editor;->remove(Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;\n\n    .line 357\n    invoke-interface {v0}, Landroid/content/SharedPreferences$Editor;->commit()Z\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    .line 360\n    :goto_0\n    return-void\n\n    .line 358\n    :catch_0\n    move-exception v0\n\n    goto :goto_0\n.end method\n\n.method private static sha1(Ljava/lang/String;)Ljava/lang/String;\n    .locals 4\n\n    .prologue\n    const/4 v3, 0x0\n\n    .line 372\n    const/16 v0, 0x28\n\n    new-array v0, v0, [B\n\n    .line 375\n    :try_start_0\n    const-string v0, \"SHA-1\"\n\n    invoke-static {v0}, Ljava/security/MessageDigest;->getInstance(Ljava/lang/String;)Ljava/security/MessageDigest;\n    :try_end_0\n    .catch Ljava/security/NoSuchAlgorithmException; {:try_start_0 .. :try_end_0} :catch_0\n\n    move-result-object v0\n\n    .line 380\n    invoke-virtual {p0}, Ljava/lang/String;->getBytes()[B\n\n    move-result-object v1\n\n    invoke-virtual {p0}, Ljava/lang/String;->length()I\n\n    move-result v2\n\n    invoke-virtual {v0, v1, v3, v2}, Ljava/security/MessageDigest;->update([BII)V\n\n    .line 381\n    invoke-virtual {v0}, Ljava/security/MessageDigest;->digest()[B\n\n    move-result-object v0\n\n    .line 382\n    new-instance v1, Ljava/lang/StringBuffer;\n\n    invoke-direct {v1}, Ljava/lang/StringBuffer;-><init>()V\n\n    move v2, v3\n\n    .line 383\n    :goto_0\n    array-length v3, v0\n\n    if-ge v2, v3, :cond_0\n\n    .line 384\n    aget-byte v3, v0, v2\n\n    and-int/lit16 v3, v3, 0xff\n\n    invoke-static {v3}, Ljava/lang/Integer;->toHexString(I)Ljava/lang/String;\n\n    move-result-object v3\n\n    invoke-virtual {v1, v3}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    .line 383\n    add-int/lit8 v2, v2, 0x1\n\n    goto :goto_0\n\n    .line 376\n    :catch_0\n    move-exception v0\n\n    .line 377\n    new-instance v1, Ljava/lang/RuntimeException;\n\n    invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V\n\n    throw v1\n\n    .line 386\n    :cond_0\n    invoke-virtual {v1}, Ljava/lang/StringBuffer;->toString()Ljava/lang/String;\n\n    move-result-object v0\n\n    return-object v0\n.end method\n\n.method public static final sync()V\n    .locals 3\n\n    .prologue\n    const v2, 0x186a1\n\n    .line 792\n    sget-boolean v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isInitialized:Z\n\n    if-nez v0, :cond_0\n\n    .line 793\n    const-string v0, \"mobclix-controller\"\n\n    const-string v1, \"sync failed - You must initialize DoodleMobileAnaylise by calling DoodleMobileAnaylise.onCreate(this).\"\n\n    invoke-static {v0, v1}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I\n\n    .line 801\n    :goto_0\n    return-void\n\n    .line 798\n    :cond_0\n    const-string v0, \"DoodleMobileAnaylise\"\n\n    const-string v1, \"static sync \"\n\n    invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n\n    .line 799\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->mSyncHandler:Landroid/os/Handler;\n\n    invoke-virtual {v0, v2}, Landroid/os/Handler;->removeMessages(I)V\n\n    .line 800\n    sget-object v0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->mSyncHandler:Landroid/os/Handler;\n\n    invoke-virtual {v0, v2}, Landroid/os/Handler;->sendEmptyMessage(I)Z\n\n    goto :goto_0\n.end method\n\n.method static syncCookiesToCookieManager(Lorg/apache/http/client/CookieStore;Ljava/lang/String;)V\n    .locals 7\n\n    .prologue\n    const-string v0, \"DoodleMobileAnaylise\"\n\n    .line 911\n    :try_start_0\n    const-string v0, \"DoodleMobileAnaylise\"\n\n    const-string v1, \"syncCookieManager \"\n\n    invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n\n    .line 912\n    invoke-static {}, Landroid/webkit/CookieManager;->getInstance()Landroid/webkit/CookieManager;\n\n    move-result-object v0\n\n    .line 913\n    invoke-interface {p0}, Lorg/apache/http/client/CookieStore;->getCookies()Ljava/util/List;\n\n    move-result-object v1\n\n    .line 914\n    new-instance v2, Ljava/lang/StringBuffer;\n\n    invoke-direct {v2}, Ljava/lang/StringBuffer;-><init>()V\n\n    .line 915\n    invoke-interface {v1}, Ljava/util/List;->isEmpty()Z\n\n    move-result v3\n\n    if-nez v3, :cond_4\n\n    .line 916\n    const/4 v3, 0x0\n\n    :goto_0\n    invoke-interface {v1}, Ljava/util/List;->size()I\n\n    move-result v4\n\n    if-ge v3, v4, :cond_3\n\n    .line 917\n    invoke-interface {v1, v3}, Ljava/util/List;->get(I)Ljava/lang/Object;\n\n    move-result-object p0\n\n    check-cast p0, Lorg/apache/http/cookie/Cookie;\n\n    .line 918\n    invoke-interface {p0}, Lorg/apache/http/cookie/Cookie;->getName()Ljava/lang/String;\n\n    move-result-object v4\n\n    invoke-virtual {v2, v4}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    move-result-object v4\n\n    const-string v5, \"=\"\n\n    invoke-virtual {v4, v5}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    move-result-object v4\n\n    invoke-interface {p0}, Lorg/apache/http/cookie/Cookie;->getValue()Ljava/lang/String;\n\n    move-result-object v5\n\n    invoke-virtual {v4, v5}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    .line 921\n    invoke-interface {p0}, Lorg/apache/http/cookie/Cookie;->getExpiryDate()Ljava/util/Date;\n\n    move-result-object v4\n\n    if-eqz v4, :cond_0\n\n    .line 922\n    new-instance v4, Ljava/text/SimpleDateFormat;\n\n    const-string v5, \"E, dd-MMM-yyyy HH:mm:ss\"\n\n    invoke-direct {v4, v5}, Ljava/text/SimpleDateFormat;-><init>(Ljava/lang/String;)V\n\n    .line 924\n    const-string v5, \"; expires=\"\n\n    invoke-virtual {v2, v5}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    move-result-object v5\n\n    invoke-interface {p0}, Lorg/apache/http/cookie/Cookie;->getExpiryDate()Ljava/util/Date;\n\n    move-result-object v6\n\n    invoke-virtual {v4, v6}, Ljava/text/SimpleDateFormat;->format(Ljava/util/Date;)Ljava/lang/String;\n\n    move-result-object v4\n\n    invoke-virtual {v5, v4}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    move-result-object v4\n\n    const-string v5, \" GMT\"\n\n    invoke-virtual {v4, v5}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    .line 928\n    :cond_0\n    invoke-interface {p0}, Lorg/apache/http/cookie/Cookie;->getPath()Ljava/lang/String;\n\n    move-result-object v4\n\n    if-eqz v4, :cond_1\n\n    .line 929\n    const-string v4, \"; path=\"\n\n    invoke-virtual {v2, v4}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    move-result-object v4\n\n    invoke-interface {p0}, Lorg/apache/http/cookie/Cookie;->getPath()Ljava/lang/String;\n\n    move-result-object v5\n\n    invoke-virtual {v4, v5}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    .line 931\n    :cond_1\n    invoke-interface {p0}, Lorg/apache/http/cookie/Cookie;->getDomain()Ljava/lang/String;\n\n    move-result-object v4\n\n    if-eqz v4, :cond_2\n\n    .line 932\n    const-string v4, \"; domain=\"\n\n    invoke-virtual {v2, v4}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    move-result-object v4\n\n    invoke-interface {p0}, Lorg/apache/http/cookie/Cookie;->getDomain()Ljava/lang/String;\n\n    move-result-object v5\n\n    invoke-virtual {v4, v5}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;\n\n    .line 935\n    :cond_2\n    invoke-virtual {v2}, Ljava/lang/StringBuffer;->toString()Ljava/lang/String;\n\n    move-result-object v4\n\n    .line 937\n    invoke-virtual {v0, p1, v4}, Landroid/webkit/CookieManager;->setCookie(Ljava/lang/String;Ljava/lang/String;)V\n\n    .line 916\n    add-int/lit8 v3, v3, 0x1\n\n    goto :goto_0\n\n    .line 939\n    :cond_3\n    const-string v0, \"DoodleMobileAnaylise\"\n\n    const-string v1, \"before syn \"\n\n    invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n\n    .line 940\n    invoke-static {}, Landroid/webkit/CookieSyncManager;->getInstance()Landroid/webkit/CookieSyncManager;\n\n    move-result-object v0\n\n    invoke-virtual {v0}, Landroid/webkit/CookieSyncManager;->sync()V\n\n    .line 941\n    const-string v0, \"DoodleMobileAnaylise\"\n\n    const-string v1, \"after syn \"\n\n    invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I\n\n    .line 943\n    invoke-static {}, Landroid/webkit/CookieSyncManager;->getInstance()Landroid/webkit/CookieSyncManager;\n\n    move-result-object v0\n\n    invoke-virtual {v0}, Landroid/webkit/CookieSyncManager;->stopSync()V\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    .line 947\n    :cond_4\n    :goto_1\n    return-void\n\n    .line 945\n    :catch_0\n    move-exception v0\n\n    goto :goto_1\n.end method\n\n.method private updateConnectivity()V\n    .locals 4\n\n    .prologue\n    const-string v3, \"null\"\n\n    .line 425\n    :try_start_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n\n    const-string v1, \"connectivity\"\n\n    invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    check-cast v0, Landroid/net/ConnectivityManager;\n\n    .line 427\n    const-string v1, \"u\"\n\n    .line 429\n    iget-boolean v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->haveNetworkStatePermission:Z\n\n    if-eqz v2, :cond_4\n\n    .line 430\n    invoke-virtual {v0}, Landroid/net/ConnectivityManager;->getActiveNetworkInfo()Landroid/net/NetworkInfo;\n\n    move-result-object v0\n\n    .line 432\n    if-eqz v0, :cond_4\n\n    .line 433\n    invoke-virtual {v0}, Landroid/net/NetworkInfo;->getTypeName()Ljava/lang/String;\n\n    move-result-object v0\n\n    .line 436\n    :goto_0\n    const-string v1, \"WI_FI\"\n\n    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v1\n\n    if-nez v1, :cond_0\n\n    const-string v1, \"WIFI\"\n\n    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v1\n\n    if-eqz v1, :cond_2\n\n    .line 437\n    :cond_0\n    const-string v0, \"wifi\"\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->connectionType:Ljava/lang/String;\n\n    .line 446\n    :goto_1\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->connectionType:Ljava/lang/String;\n\n    if-nez v0, :cond_1\n\n    .line 447\n    const-string v0, \"null\"\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->connectionType:Ljava/lang/String;\n\n    .line 451\n    :cond_1\n    :goto_2\n    return-void\n\n    .line 438\n    :cond_2\n    const-string v1, \"MOBILE\"\n\n    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_3\n\n    .line 439\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n\n    const-string v1, \"phone\"\n\n    invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    check-cast v0, Landroid/telephony/TelephonyManager;\n\n    .line 441\n    invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getNetworkType()I\n\n    move-result v0\n\n    .line 442\n    invoke-static {v0}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;\n\n    move-result-object v0\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->connectionType:Ljava/lang/String;\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    goto :goto_1\n\n    .line 448\n    :catch_0\n    move-exception v0\n\n    .line 449\n    const-string v0, \"null\"\n\n    iput-object v3, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->connectionType:Ljava/lang/String;\n\n    goto :goto_2\n\n    .line 444\n    :cond_3\n    :try_start_1\n    const-string v0, \"null\"\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->connectionType:Ljava/lang/String;\n    :try_end_1\n    .catch Ljava/lang/Exception; {:try_start_1 .. :try_end_1} :catch_0\n\n    goto :goto_1\n\n    :cond_4\n    move-object v0, v1\n\n    goto :goto_0\n.end method\n\n.method private updateLocation()V\n    .locals 3\n\n    .prologue\n    .line 409\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->location:Lcom/doodlemobile/gamecenter/DoodleMobileLocation;\n\n    iget-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n\n    new-instance v2, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$1;\n\n    invoke-direct {v2, p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise$1;-><init>(Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;)V\n\n    invoke-virtual {v0, v1, v2}, Lcom/doodlemobile/gamecenter/DoodleMobileLocation;->getLocation(Landroid/content/Context;Lcom/doodlemobile/gamecenter/DoodleMobileLocation$LocationResult;)Z\n\n    .line 421\n    return-void\n.end method\n\n\n# virtual methods\n.method protected finalize()V\n    .locals 0\n\n    .prologue\n    .line 896\n    invoke-direct {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->endSession()V\n\n    .line 897\n    return-void\n.end method\n\n.method getAnalyticsServer()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 289\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->analyticsServer:Ljava/lang/String;\n\n    return-object v0\n.end method\n\n.method getAndroidId()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 218\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidId:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidId:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getAndroidVersion()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 205\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidVersion:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->androidVersion:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getApplicationId()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 201\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationId:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationId:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getApplicationVersion()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 209\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationVersion:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->applicationVersion:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getConfigServer()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 285\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->configServer:Ljava/lang/String;\n\n    return-object v0\n.end method\n\n.method getConnectionType()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 231\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->connectionType:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->connectionType:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getContext()Landroid/content/Context;\n    .locals 1\n\n    .prologue\n    .line 197\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n\n    return-object v0\n.end method\n\n.method getDeviceHardwareModel()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 226\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceHardwareModel:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceHardwareModel:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getDeviceId()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 214\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceId:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceId:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getDeviceModel()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 222\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceModel:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->deviceModel:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getGPS()Ljava/lang/String;\n    .locals 3\n\n    .prologue\n    const-string v2, \"null\"\n\n    .line 243\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getLatitude()Ljava/lang/String;\n\n    move-result-object v0\n\n    const-string v1, \"null\"\n\n    invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-nez v0, :cond_0\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getLongitude()Ljava/lang/String;\n\n    move-result-object v0\n\n    const-string v1, \"null\"\n\n    invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_1\n\n    .line 244\n    :cond_0\n    const-string v0, \"null\"\n\n    move-object v0, v2\n\n    .line 245\n    :goto_0\n    return-object v0\n\n    :cond_1\n    new-instance v0, Ljava/lang/StringBuilder;\n\n    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getLatitude()Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v0\n\n    const-string v1, \",\"\n\n    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v0\n\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getLongitude()Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v0\n\n    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v0\n\n    goto :goto_0\n.end method\n\n.method getLanguage()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 249\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->language:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->language:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getLatitude()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 235\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->latitude:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->latitude:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getLocale()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 253\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locale:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locale:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getLogLevel()I\n    .locals 1\n\n    .prologue\n    .line 261\n    iget v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->logLevel:I\n\n    return v0\n.end method\n\n.method getLongitude()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 239\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->longitude:Ljava/lang/String;\n\n    if-nez v0, :cond_0\n\n    const-string v0, \"null\"\n\n    :goto_0\n    return-object v0\n\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->longitude:Ljava/lang/String;\n\n    goto :goto_0\n.end method\n\n.method getMobclixVersion()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 257\n    const-string v0, \"2.3\"\n\n    return-object v0\n.end method\n\n.method getRefreshTime(Ljava/lang/String;)J\n    .locals 2\n\n    .prologue\n    .line 278\n    :try_start_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->refreshTime:Ljava/util/HashMap;\n\n    invoke-virtual {v0, p1}, Ljava/util/HashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;\n\n    move-result-object p0\n\n    check-cast p0, Ljava/lang/Long;\n\n    invoke-virtual {p0}, Ljava/lang/Long;->longValue()J\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    move-result-wide v0\n\n    .line 281\n    :goto_0\n    return-wide v0\n\n    .line 279\n    :catch_0\n    move-exception v0\n\n    .line 281\n    const-wide/16 v0, -0x1\n\n    goto :goto_0\n.end method\n\n.method getUserAgent()Ljava/lang/String;\n    .locals 3\n\n    .prologue\n    const-string v2, \"UserAgent\"\n\n    .line 297\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->userAgent:Ljava/lang/String;\n\n    const-string v1, \"\"\n\n    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_0\n\n    const-string v0, \"UserAgent\"\n\n    invoke-static {v2}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->hasPref(Ljava/lang/String;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_0\n\n    .line 298\n    const-string v0, \"UserAgent\"\n\n    invoke-static {v2}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getPref(Ljava/lang/String;)Ljava/lang/String;\n\n    move-result-object v0\n\n    iput-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->userAgent:Ljava/lang/String;\n\n    .line 299\n    :cond_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->userAgent:Ljava/lang/String;\n\n    return-object v0\n.end method\n\n.method isEnabled(Ljava/lang/String;)Z\n    .locals 1\n\n    .prologue\n    .line 270\n    :try_start_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->enabled:Ljava/util/HashMap;\n\n    invoke-virtual {v0, p1}, Ljava/util/HashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;\n\n    move-result-object p0\n\n    check-cast p0, Ljava/lang/Boolean;\n\n    invoke-virtual {p0}, Ljava/lang/Boolean;->booleanValue()Z\n    :try_end_0\n    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0\n\n    move-result v0\n\n    .line 273\n    :goto_0\n    return v0\n\n    .line 271\n    :catch_0\n    move-exception v0\n\n    .line 273\n    const/4 v0, 0x1\n\n    goto :goto_0\n.end method\n\n.method isRemoteConfigSet()I\n    .locals 1\n\n    .prologue\n    .line 293\n    iget v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->remoteConfigSet:I\n\n    return v0\n.end method\n\n.method isTopTask()Z\n    .locals 1\n\n    .prologue\n    .line 265\n    iget-boolean v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->isTopTask:Z\n\n    return v0\n.end method\n\n.method setContext(Landroid/app/Activity;)V\n    .locals 0\n\n    .prologue\n    .line 193\n    iput-object p1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->context:Landroid/content/Context;\n\n    .line 194\n    return-void\n.end method\n\n.method setUserAgent(Ljava/lang/String;)V\n    .locals 1\n\n    .prologue\n    .line 303\n    iput-object p1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->userAgent:Ljava/lang/String;\n\n    .line 304\n    const-string v0, \"UserAgent\"\n\n    invoke-static {v0, p1}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->addPref(Ljava/lang/String;Ljava/lang/String;)V\n\n    .line 305\n    return-void\n.end method\n\n.method updateSession()V\n    .locals 4\n\n    .prologue\n    const-string v0, \"ll\"\n\n    .line 391\n    invoke-direct {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->updateConnectivity()V\n\n    .line 393\n    iget-boolean v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->haveLocationPermission:Z\n\n    if-eqz v0, :cond_0\n\n    .line 394\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->locationHandler:Landroid/os/Handler;\n\n    const/4 v1, 0x0\n\n    invoke-virtual {v0, v1}, Landroid/os/Handler;->sendEmptyMessage(I)Z\n\n    .line 397\n    :cond_0\n    :try_start_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->session:Lorg/json/JSONObject;\n\n    const-string v1, \"ts\"\n\n    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J\n\n    move-result-wide v2\n\n    invoke-virtual {v0, v1, v2, v3}, Lorg/json/JSONObject;->put(Ljava/lang/String;J)Lorg/json/JSONObject;\n\n    .line 398\n    invoke-virtual {p0}, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->getGPS()Ljava/lang/String;\n\n    move-result-object v0\n\n    .line 399\n    const-string v1, \"null\"\n\n    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v1\n\n    if-nez v1, :cond_1\n\n    .line 400\n    iget-object v1, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->session:Lorg/json/JSONObject;\n\n    const-string v2, \"ll\"\n\n    invoke-virtual {v1, v2, v0}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 403\n    :goto_0\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->session:Lorg/json/JSONObject;\n\n    const-string v1, \"g\"\n\n    iget-object v2, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->connectionType:Ljava/lang/String;\n\n    invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\n\n    .line 406\n    :goto_1\n    return-void\n\n    .line 402\n    :cond_1\n    iget-object v0, p0, Lcom/doodlemobile/gamecenter/DoodleMobileAnaylise;->session:Lorg/json/JSONObject;\n\n    const-string v1, \"ll\"\n\n    invoke-virtual {v0, v1}, Lorg/json/JSONObject;->remove(Ljava/lang/String;)Ljava/lang/Object;\n    :try_end_0\n    .catch Lorg/json/JSONException; {:try_start_0 .. :try_end_0} :catch_0\n\n    goto :goto_0\n\n    .line 404\n    :catch_0\n    move-exception v0\n\n    goto :goto_1\n.end method\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smali/ModernAsyncTask.smali",
    "content": ".class abstract Landroid/support/v4/content/ModernAsyncTask;\n.super Ljava/lang/Object;\n.source \"ModernAsyncTask.java\"\n\n\n# annotations\n.annotation system Ldalvik/annotation/MemberClasses;\n    value = {\n        Landroid/support/v4/content/ModernAsyncTask$4;,\n        Landroid/support/v4/content/ModernAsyncTask$AsyncTaskResult;,\n        Landroid/support/v4/content/ModernAsyncTask$WorkerRunnable;,\n        Landroid/support/v4/content/ModernAsyncTask$InternalHandler;,\n        Landroid/support/v4/content/ModernAsyncTask$Status;\n    }\n.end annotation\n\n.annotation system Ldalvik/annotation/Signature;\n    value = {\n        \"<Params:\",\n        \"Ljava/lang/Object;\",\n        \"Progress:\",\n        \"Ljava/lang/Object;\",\n        \"Result:\",\n        \"Ljava/lang/Object;\",\n        \">\",\n        \"Ljava/lang/Object;\"\n    }\n.end annotation\n\n\n# static fields\n.field private static final CORE_POOL_SIZE:I = 0x5\n\n.field private static final KEEP_ALIVE:I = 0x1\n\n.field private static final LOG_TAG:Ljava/lang/String; = \"AsyncTask\"\n\n.field private static final MAXIMUM_POOL_SIZE:I = 0x80\n\n.field private static final MESSAGE_POST_PROGRESS:I = 0x2\n\n.field private static final MESSAGE_POST_RESULT:I = 0x1\n\n.field public static final THREAD_POOL_EXECUTOR:Ljava/util/concurrent/Executor;\n\n.field private static volatile sDefaultExecutor:Ljava/util/concurrent/Executor;\n\n.field private static final sHandler:Landroid/support/v4/content/ModernAsyncTask$InternalHandler;\n\n.field private static final sPoolWorkQueue:Ljava/util/concurrent/BlockingQueue;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"Ljava/util/concurrent/BlockingQueue\",\n            \"<\",\n            \"Ljava/lang/Runnable;\",\n            \">;\"\n        }\n    .end annotation\n.end field\n\n.field private static final sThreadFactory:Ljava/util/concurrent/ThreadFactory;\n\n\n# instance fields\n.field private final mFuture:Ljava/util/concurrent/FutureTask;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"Ljava/util/concurrent/FutureTask\",\n            \"<TResult;>;\"\n        }\n    .end annotation\n.end field\n\n.field private volatile mStatus:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n.field private final mTaskInvoked:Ljava/util/concurrent/atomic/AtomicBoolean;\n\n.field private final mWorker:Landroid/support/v4/content/ModernAsyncTask$WorkerRunnable;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"Landroid/support/v4/content/ModernAsyncTask$WorkerRunnable\",\n            \"<TParams;TResult;>;\"\n        }\n    .end annotation\n.end field\n\n\n# direct methods\n.method static constructor <clinit>()V\n    .registers 8\n\n    .prologue\n    .line 54\n    new-instance v0, Landroid/support/v4/content/ModernAsyncTask$1;\n\n    invoke-direct {v0}, Landroid/support/v4/content/ModernAsyncTask$1;-><init>()V\n\n    sput-object v0, Landroid/support/v4/content/ModernAsyncTask;->sThreadFactory:Ljava/util/concurrent/ThreadFactory;\n\n    .line 62\n    new-instance v0, Ljava/util/concurrent/LinkedBlockingQueue;\n\n    const/16 v1, 0xa\n\n    invoke-direct {v0, v1}, Ljava/util/concurrent/LinkedBlockingQueue;-><init>(I)V\n\n    sput-object v0, Landroid/support/v4/content/ModernAsyncTask;->sPoolWorkQueue:Ljava/util/concurrent/BlockingQueue;\n\n    .line 68\n    new-instance v0, Ljava/util/concurrent/ThreadPoolExecutor;\n\n    const/4 v1, 0x5\n\n    const/16 v2, 0x80\n\n    const-wide/16 v3, 0x1\n\n    sget-object v5, Ljava/util/concurrent/TimeUnit;->SECONDS:Ljava/util/concurrent/TimeUnit;\n\n    sget-object v6, Landroid/support/v4/content/ModernAsyncTask;->sPoolWorkQueue:Ljava/util/concurrent/BlockingQueue;\n\n    sget-object v7, Landroid/support/v4/content/ModernAsyncTask;->sThreadFactory:Ljava/util/concurrent/ThreadFactory;\n\n    invoke-direct/range {v0 .. v7}, Ljava/util/concurrent/ThreadPoolExecutor;-><init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/ThreadFactory;)V\n\n    sput-object v0, Landroid/support/v4/content/ModernAsyncTask;->THREAD_POOL_EXECUTOR:Ljava/util/concurrent/Executor;\n\n    .line 75\n    new-instance v0, Landroid/support/v4/content/ModernAsyncTask$InternalHandler;\n\n    const/4 v1, 0x0\n\n    invoke-direct {v0, v1}, Landroid/support/v4/content/ModernAsyncTask$InternalHandler;-><init>(Landroid/support/v4/content/ModernAsyncTask$1;)V\n\n    sput-object v0, Landroid/support/v4/content/ModernAsyncTask;->sHandler:Landroid/support/v4/content/ModernAsyncTask$InternalHandler;\n\n    .line 77\n    sget-object v0, Landroid/support/v4/content/ModernAsyncTask;->THREAD_POOL_EXECUTOR:Ljava/util/concurrent/Executor;\n\n    sput-object v0, Landroid/support/v4/content/ModernAsyncTask;->sDefaultExecutor:Ljava/util/concurrent/Executor;\n\n    return-void\n.end method\n\n.method public constructor <init>()V\n    .registers 3\n\n    .prologue\n    .line 117\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    invoke-direct {p0}, Ljava/lang/Object;-><init>()V\n\n    .line 81\n    sget-object v0, Landroid/support/v4/content/ModernAsyncTask$Status;->PENDING:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n    iput-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mStatus:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n    .line 83\n    new-instance v0, Ljava/util/concurrent/atomic/AtomicBoolean;\n\n    invoke-direct {v0}, Ljava/util/concurrent/atomic/AtomicBoolean;-><init>()V\n\n    iput-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mTaskInvoked:Ljava/util/concurrent/atomic/AtomicBoolean;\n\n    .line 118\n    new-instance v0, Landroid/support/v4/content/ModernAsyncTask$2;\n\n    invoke-direct {v0, p0}, Landroid/support/v4/content/ModernAsyncTask$2;-><init>(Landroid/support/v4/content/ModernAsyncTask;)V\n\n    iput-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mWorker:Landroid/support/v4/content/ModernAsyncTask$WorkerRunnable;\n\n    .line 127\n    new-instance v0, Landroid/support/v4/content/ModernAsyncTask$3;\n\n    iget-object v1, p0, Landroid/support/v4/content/ModernAsyncTask;->mWorker:Landroid/support/v4/content/ModernAsyncTask$WorkerRunnable;\n\n    invoke-direct {v0, p0, v1}, Landroid/support/v4/content/ModernAsyncTask$3;-><init>(Landroid/support/v4/content/ModernAsyncTask;Ljava/util/concurrent/Callable;)V\n\n    iput-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mFuture:Ljava/util/concurrent/FutureTask;\n\n    .line 147\n    return-void\n.end method\n\n.method static synthetic access$200(Landroid/support/v4/content/ModernAsyncTask;)Ljava/util/concurrent/atomic/AtomicBoolean;\n    .registers 2\n    .param p0, \"x0\"    # Landroid/support/v4/content/ModernAsyncTask;\n\n    .prologue\n    .line 47\n    iget-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mTaskInvoked:Ljava/util/concurrent/atomic/AtomicBoolean;\n\n    return-object v0\n.end method\n\n.method static synthetic access$300(Landroid/support/v4/content/ModernAsyncTask;Ljava/lang/Object;)Ljava/lang/Object;\n    .registers 3\n    .param p0, \"x0\"    # Landroid/support/v4/content/ModernAsyncTask;\n    .param p1, \"x1\"    # Ljava/lang/Object;\n\n    .prologue\n    .line 47\n    invoke-direct {p0, p1}, Landroid/support/v4/content/ModernAsyncTask;->postResult(Ljava/lang/Object;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    return-object v0\n.end method\n\n.method static synthetic access$400(Landroid/support/v4/content/ModernAsyncTask;Ljava/lang/Object;)V\n    .registers 2\n    .param p0, \"x0\"    # Landroid/support/v4/content/ModernAsyncTask;\n    .param p1, \"x1\"    # Ljava/lang/Object;\n\n    .prologue\n    .line 47\n    invoke-direct {p0, p1}, Landroid/support/v4/content/ModernAsyncTask;->postResultIfNotInvoked(Ljava/lang/Object;)V\n\n    return-void\n.end method\n\n.method static synthetic access$500(Landroid/support/v4/content/ModernAsyncTask;Ljava/lang/Object;)V\n    .registers 2\n    .param p0, \"x0\"    # Landroid/support/v4/content/ModernAsyncTask;\n    .param p1, \"x1\"    # Ljava/lang/Object;\n\n    .prologue\n    .line 47\n    invoke-direct {p0, p1}, Landroid/support/v4/content/ModernAsyncTask;->finish(Ljava/lang/Object;)V\n\n    return-void\n.end method\n\n.method public static execute(Ljava/lang/Runnable;)V\n    .registers 2\n    .param p0, \"runnable\"    # Ljava/lang/Runnable;\n\n    .prologue\n    .line 433\n    sget-object v0, Landroid/support/v4/content/ModernAsyncTask;->sDefaultExecutor:Ljava/util/concurrent/Executor;\n\n    invoke-interface {v0, p0}, Ljava/util/concurrent/Executor;->execute(Ljava/lang/Runnable;)V\n\n    .line 434\n    return-void\n.end method\n\n.method private finish(Ljava/lang/Object;)V\n    .registers 3\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"(TResult;)V\"\n        }\n    .end annotation\n\n    .prologue\n    .line 458\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    .local p1, \"result\":Ljava/lang/Object;, \"TResult;\"\n    invoke-virtual {p0}, Landroid/support/v4/content/ModernAsyncTask;->isCancelled()Z\n\n    move-result v0\n\n    if-eqz v0, :cond_e\n\n    .line 459\n    invoke-virtual {p0, p1}, Landroid/support/v4/content/ModernAsyncTask;->onCancelled(Ljava/lang/Object;)V\n\n    .line 463\n    :goto_9\n    sget-object v0, Landroid/support/v4/content/ModernAsyncTask$Status;->FINISHED:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n    iput-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mStatus:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n    .line 464\n    return-void\n\n    .line 461\n    :cond_e\n    invoke-virtual {p0, p1}, Landroid/support/v4/content/ModernAsyncTask;->onPostExecute(Ljava/lang/Object;)V\n\n    goto :goto_9\n.end method\n\n.method public static init()V\n    .registers 1\n\n    .prologue\n    .line 106\n    sget-object v0, Landroid/support/v4/content/ModernAsyncTask;->sHandler:Landroid/support/v4/content/ModernAsyncTask$InternalHandler;\n\n    invoke-virtual {v0}, Landroid/support/v4/content/ModernAsyncTask$InternalHandler;->getLooper()Landroid/os/Looper;\n\n    .line 107\n    return-void\n.end method\n\n.method private postResult(Ljava/lang/Object;)Ljava/lang/Object;\n    .registers 8\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"(TResult;)TResult;\"\n        }\n    .end annotation\n\n    .prologue\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    .local p1, \"result\":Ljava/lang/Object;, \"TResult;\"\n    const/4 v5, 0x1\n\n    .line 157\n    sget-object v1, Landroid/support/v4/content/ModernAsyncTask;->sHandler:Landroid/support/v4/content/ModernAsyncTask$InternalHandler;\n\n    new-instance v2, Landroid/support/v4/content/ModernAsyncTask$AsyncTaskResult;\n\n    new-array v3, v5, [Ljava/lang/Object;\n\n    const/4 v4, 0x0\n\n    aput-object p1, v3, v4\n\n    invoke-direct {v2, p0, v3}, Landroid/support/v4/content/ModernAsyncTask$AsyncTaskResult;-><init>(Landroid/support/v4/content/ModernAsyncTask;[Ljava/lang/Object;)V\n\n    invoke-virtual {v1, v5, v2}, Landroid/support/v4/content/ModernAsyncTask$InternalHandler;->obtainMessage(ILjava/lang/Object;)Landroid/os/Message;\n\n    move-result-object v0\n\n    .line 159\n    .local v0, \"message\":Landroid/os/Message;\n    invoke-virtual {v0}, Landroid/os/Message;->sendToTarget()V\n\n    .line 160\n    return-object p1\n.end method\n\n.method private postResultIfNotInvoked(Ljava/lang/Object;)V\n    .registers 4\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"(TResult;)V\"\n        }\n    .end annotation\n\n    .prologue\n    .line 150\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    .local p1, \"result\":Ljava/lang/Object;, \"TResult;\"\n    iget-object v1, p0, Landroid/support/v4/content/ModernAsyncTask;->mTaskInvoked:Ljava/util/concurrent/atomic/AtomicBoolean;\n\n    invoke-virtual {v1}, Ljava/util/concurrent/atomic/AtomicBoolean;->get()Z\n\n    move-result v0\n\n    .line 151\n    .local v0, \"wasTaskInvoked\":Z\n    if-nez v0, :cond_b\n\n    .line 152\n    invoke-direct {p0, p1}, Landroid/support/v4/content/ModernAsyncTask;->postResult(Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 154\n    :cond_b\n    return-void\n.end method\n\n.method public static setDefaultExecutor(Ljava/util/concurrent/Executor;)V\n    .registers 1\n    .param p0, \"exec\"    # Ljava/util/concurrent/Executor;\n\n    .prologue\n    .line 111\n    sput-object p0, Landroid/support/v4/content/ModernAsyncTask;->sDefaultExecutor:Ljava/util/concurrent/Executor;\n\n    .line 112\n    return-void\n.end method\n\n\n# virtual methods\n.method public final cancel(Z)Z\n    .registers 3\n    .param p1, \"mayInterruptIfRunning\"    # Z\n\n    .prologue\n    .line 306\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    iget-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mFuture:Ljava/util/concurrent/FutureTask;\n\n    invoke-virtual {v0, p1}, Ljava/util/concurrent/FutureTask;->cancel(Z)Z\n\n    move-result v0\n\n    return v0\n.end method\n\n.method protected varargs abstract doInBackground([Ljava/lang/Object;)Ljava/lang/Object;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"([TParams;)TResult;\"\n        }\n    .end annotation\n.end method\n\n.method public final varargs execute([Ljava/lang/Object;)Landroid/support/v4/content/ModernAsyncTask;\n    .registers 3\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"([TParams;)\",\n            \"Landroid/support/v4/content/ModernAsyncTask\",\n            \"<TParams;TProgress;TResult;>;\"\n        }\n    .end annotation\n\n    .prologue\n    .line 371\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    .local p1, \"params\":[Ljava/lang/Object;, \"[TParams;\"\n    sget-object v0, Landroid/support/v4/content/ModernAsyncTask;->sDefaultExecutor:Ljava/util/concurrent/Executor;\n\n    invoke-virtual {p0, v0, p1}, Landroid/support/v4/content/ModernAsyncTask;->executeOnExecutor(Ljava/util/concurrent/Executor;[Ljava/lang/Object;)Landroid/support/v4/content/ModernAsyncTask;\n\n    move-result-object v0\n\n    return-object v0\n.end method\n\n.method public final varargs executeOnExecutor(Ljava/util/concurrent/Executor;[Ljava/lang/Object;)Landroid/support/v4/content/ModernAsyncTask;\n    .registers 5\n    .param p1, \"exec\"    # Ljava/util/concurrent/Executor;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"(\",\n            \"Ljava/util/concurrent/Executor;\",\n            \"[TParams;)\",\n            \"Landroid/support/v4/content/ModernAsyncTask\",\n            \"<TParams;TProgress;TResult;>;\"\n        }\n    .end annotation\n\n    .prologue\n    .line 406\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    .local p2, \"params\":[Ljava/lang/Object;, \"[TParams;\"\n    iget-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mStatus:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n    sget-object v1, Landroid/support/v4/content/ModernAsyncTask$Status;->PENDING:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n    if-eq v0, v1, :cond_13\n\n    .line 407\n    sget-object v0, Landroid/support/v4/content/ModernAsyncTask$4;->$SwitchMap$android$support$v4$content$ModernAsyncTask$Status:[I\n\n    iget-object v1, p0, Landroid/support/v4/content/ModernAsyncTask;->mStatus:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n    invoke-virtual {v1}, Landroid/support/v4/content/ModernAsyncTask$Status;->ordinal()I\n\n    move-result v1\n\n    aget v0, v0, v1\n\n    packed-switch v0, :pswitch_data_34\n\n    .line 418\n    :cond_13\n    sget-object v0, Landroid/support/v4/content/ModernAsyncTask$Status;->RUNNING:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n    iput-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mStatus:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n    .line 420\n    invoke-virtual {p0}, Landroid/support/v4/content/ModernAsyncTask;->onPreExecute()V\n\n    .line 422\n    iget-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mWorker:Landroid/support/v4/content/ModernAsyncTask$WorkerRunnable;\n\n    iput-object p2, v0, Landroid/support/v4/content/ModernAsyncTask$WorkerRunnable;->mParams:[Ljava/lang/Object;\n\n    .line 423\n    iget-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mFuture:Ljava/util/concurrent/FutureTask;\n\n    invoke-interface {p1, v0}, Ljava/util/concurrent/Executor;->execute(Ljava/lang/Runnable;)V\n\n    .line 425\n    return-object p0\n\n    .line 409\n    :pswitch_24\n    new-instance v0, Ljava/lang/IllegalStateException;\n\n    const-string v1, \"Cannot execute task: the task is already running.\"\n\n    invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n\n    .line 412\n    :pswitch_2c\n    new-instance v0, Ljava/lang/IllegalStateException;\n\n    const-string v1, \"Cannot execute task: the task has already been executed (a task can be executed only once)\"\n\n    invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n\n    .line 407\n    :pswitch_data_34\n    .packed-switch 0x1\n        :pswitch_24\n        :pswitch_2c\n    .end packed-switch\n.end method\n\n.method public final get()Ljava/lang/Object;\n    .registers 2\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"()TResult;\"\n        }\n    .end annotation\n\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/lang/InterruptedException;,\n            Ljava/util/concurrent/ExecutionException;\n        }\n    .end annotation\n\n    .prologue\n    .line 321\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    iget-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mFuture:Ljava/util/concurrent/FutureTask;\n\n    invoke-virtual {v0}, Ljava/util/concurrent/FutureTask;->get()Ljava/lang/Object;\n\n    move-result-object v0\n\n    return-object v0\n.end method\n\n.method public final get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;\n    .registers 5\n    .param p1, \"timeout\"    # J\n    .param p3, \"unit\"    # Ljava/util/concurrent/TimeUnit;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"(J\",\n            \"Ljava/util/concurrent/TimeUnit;\",\n            \")TResult;\"\n        }\n    .end annotation\n\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/lang/InterruptedException;,\n            Ljava/util/concurrent/ExecutionException;,\n            Ljava/util/concurrent/TimeoutException;\n        }\n    .end annotation\n\n    .prologue\n    .line 341\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    iget-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mFuture:Ljava/util/concurrent/FutureTask;\n\n    invoke-virtual {v0, p1, p2, p3}, Ljava/util/concurrent/FutureTask;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    return-object v0\n.end method\n\n.method public final getStatus()Landroid/support/v4/content/ModernAsyncTask$Status;\n    .registers 2\n\n    .prologue\n    .line 169\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    iget-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mStatus:Landroid/support/v4/content/ModernAsyncTask$Status;\n\n    return-object v0\n.end method\n\n.method public final isCancelled()Z\n    .registers 2\n\n    .prologue\n    .line 273\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    iget-object v0, p0, Landroid/support/v4/content/ModernAsyncTask;->mFuture:Ljava/util/concurrent/FutureTask;\n\n    invoke-virtual {v0}, Ljava/util/concurrent/FutureTask;->isCancelled()Z\n\n    move-result v0\n\n    return v0\n.end method\n\n.method protected onCancelled()V\n    .registers 1\n\n    .prologue\n    .line 260\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    return-void\n.end method\n\n.method protected onCancelled(Ljava/lang/Object;)V\n    .registers 2\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"(TResult;)V\"\n        }\n    .end annotation\n\n    .prologue\n    .line 244\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    .local p1, \"result\":Ljava/lang/Object;, \"TResult;\"\n    invoke-virtual {p0}, Landroid/support/v4/content/ModernAsyncTask;->onCancelled()V\n\n    .line 245\n    return-void\n.end method\n\n.method protected onPostExecute(Ljava/lang/Object;)V\n    .registers 2\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"(TResult;)V\"\n        }\n    .end annotation\n\n    .prologue\n    .line 213\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    .local p1, \"result\":Ljava/lang/Object;, \"TResult;\"\n    return-void\n.end method\n\n.method protected onPreExecute()V\n    .registers 1\n\n    .prologue\n    .line 197\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    return-void\n.end method\n\n.method protected varargs onProgressUpdate([Ljava/lang/Object;)V\n    .registers 2\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"([TProgress;)V\"\n        }\n    .end annotation\n\n    .prologue\n    .line 226\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    .local p1, \"values\":[Ljava/lang/Object;, \"[TProgress;\"\n    return-void\n.end method\n\n.method protected final varargs publishProgress([Ljava/lang/Object;)V\n    .registers 5\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"([TProgress;)V\"\n        }\n    .end annotation\n\n    .prologue\n    .line 451\n    .local p0, \"this\":Landroid/support/v4/content/ModernAsyncTask;, \"Landroid/support/v4/content/ModernAsyncTask<TParams;TProgress;TResult;>;\"\n    .local p1, \"values\":[Ljava/lang/Object;, \"[TProgress;\"\n    invoke-virtual {p0}, Landroid/support/v4/content/ModernAsyncTask;->isCancelled()Z\n\n    move-result v0\n\n    if-nez v0, :cond_15\n\n    .line 452\n    sget-object v0, Landroid/support/v4/content/ModernAsyncTask;->sHandler:Landroid/support/v4/content/ModernAsyncTask$InternalHandler;\n\n    const/4 v1, 0x2\n\n    new-instance v2, Landroid/support/v4/content/ModernAsyncTask$AsyncTaskResult;\n\n    invoke-direct {v2, p0, p1}, Landroid/support/v4/content/ModernAsyncTask$AsyncTaskResult;-><init>(Landroid/support/v4/content/ModernAsyncTask;[Ljava/lang/Object;)V\n\n    invoke-virtual {v0, v1, v2}, Landroid/support/v4/content/ModernAsyncTask$InternalHandler;->obtainMessage(ILjava/lang/Object;)Landroid/os/Message;\n\n    move-result-object v0\n\n    invoke-virtual {v0}, Landroid/os/Message;->sendToTarget()V\n\n    .line 455\n    :cond_15\n    return-void\n.end method\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smali/PenguinSprite.smali",
    "content": ".class public Lcom/tdq/game/shootbubble/sprite/PenguinSprite;\n.super Lcom/tdq/game/shootbubble/sprite/Sprite;\n.source \"PenguinSprite.java\"\n\n\n# static fields\n.field public static final LOST_SEQUENCE:[[I\n\n.field public static final STATE_FIRE:I = 0x2\n\n.field public static final STATE_GAME_LOST:I = 0x5\n\n.field public static final STATE_GAME_WON:I = 0x4\n\n.field public static final STATE_TURN_LEFT:I = 0x0\n\n.field public static final STATE_TURN_RIGHT:I = 0x1\n\n.field public static final STATE_VOID:I = 0x3\n\n.field public static final WON_SEQUENCE:[[I\n\n\n# instance fields\n.field private count:I\n\n.field private currentPenguin:I\n\n.field private finalState:I\n\n.field private nextPosition:I\n\n.field private rand:Ljava/util/Random;\n\n.field private spritesImage:Lcom/tdq/game/shootbubble/sprite/BmpWrap;\n\n\n# direct methods\n.method static constructor <clinit>()V\n    .locals 8\n\n    .prologue\n    const/4 v7, 0x4\n\n    const/4 v6, 0x3\n\n    const/4 v5, 0x1\n\n    const/4 v4, 0x0\n\n    const/4 v3, 0x2\n\n    .line 67\n    const/16 v0, 0x8\n\n    new-array v0, v0, [[I\n\n    new-array v1, v3, [I\n\n    fill-array-data v1, :array_0\n\n    aput-object v1, v0, v4\n\n    new-array v1, v3, [I\n\n    fill-array-data v1, :array_1\n\n    aput-object v1, v0, v5\n\n    new-array v1, v3, [I\n\n    fill-array-data v1, :array_2\n\n    aput-object v1, v0, v3\n\n    new-array v1, v3, [I\n\n    fill-array-data v1, :array_3\n\n    aput-object v1, v0, v6\n\n    new-array v1, v3, [I\n\n    fill-array-data v1, :array_4\n\n    aput-object v1, v0, v7\n\n    const/4 v1, 0x5\n\n    new-array v2, v3, [I\n\n    fill-array-data v2, :array_5\n\n    aput-object v2, v0, v1\n\n    const/4 v1, 0x6\n\n    new-array v2, v3, [I\n\n    fill-array-data v2, :array_6\n\n    aput-object v2, v0, v1\n\n    const/4 v1, 0x7\n\n    new-array v2, v3, [I\n\n    fill-array-data v2, :array_7\n\n    aput-object v2, v0, v1\n\n    sput-object v0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->LOST_SEQUENCE:[[I\n\n    .line 69\n    const/16 v0, 0x8\n\n    new-array v0, v0, [[I\n\n    new-array v1, v3, [I\n\n    fill-array-data v1, :array_8\n\n    aput-object v1, v0, v4\n\n    new-array v1, v3, [I\n\n    fill-array-data v1, :array_9\n\n    aput-object v1, v0, v5\n\n    new-array v1, v3, [I\n\n    fill-array-data v1, :array_a\n\n    aput-object v1, v0, v3\n\n    new-array v1, v3, [I\n\n    fill-array-data v1, :array_b\n\n    aput-object v1, v0, v6\n\n    new-array v1, v3, [I\n\n    fill-array-data v1, :array_c\n\n    aput-object v1, v0, v7\n\n    const/4 v1, 0x5\n\n    new-array v2, v3, [I\n\n    fill-array-data v2, :array_d\n\n    aput-object v2, v0, v1\n\n    const/4 v1, 0x6\n\n    new-array v2, v3, [I\n\n    fill-array-data v2, :array_e\n\n    aput-object v2, v0, v1\n\n    const/4 v1, 0x7\n\n    new-array v2, v3, [I\n\n    fill-array-data v2, :array_f\n\n    aput-object v2, v0, v1\n\n    sput-object v0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->WON_SEQUENCE:[[I\n\n    return-void\n\n    .line 67\n    :array_0\n    .array-data 4\n        0x1\n        0x0\n    .end array-data\n\n    :array_1\n    .array-data 4\n        0x2\n        0x8\n    .end array-data\n\n    :array_2\n    .array-data 4\n        0x3\n        0x9\n    .end array-data\n\n    :array_3\n    .array-data 4\n        0x4\n        0xa\n    .end array-data\n\n    :array_4\n    .array-data 4\n        0x5\n        0xb\n    .end array-data\n\n    :array_5\n    .array-data 4\n        0x6\n        0xc\n    .end array-data\n\n    :array_6\n    .array-data 4\n        0x7\n        0xd\n    .end array-data\n\n    :array_7\n    .array-data 4\n        0x5\n        0xe\n    .end array-data\n\n    .line 69\n    :array_8\n    .array-data 4\n        0x1\n        0x0\n    .end array-data\n\n    :array_9\n    .array-data 4\n        0x2\n        0x7\n    .end array-data\n\n    :array_a\n    .array-data 4\n        0x3\n        0x6\n    .end array-data\n\n    :array_b\n    .array-data 4\n        0x4\n        0xf\n    .end array-data\n\n    :array_c\n    .array-data 4\n        0x5\n        0x10\n    .end array-data\n\n    :array_d\n    .array-data 4\n        0x6\n        0x11\n    .end array-data\n\n    :array_e\n    .array-data 4\n        0x7\n        0x12\n    .end array-data\n\n    :array_f\n    .array-data 4\n        0x4\n        0x13\n    .end array-data\n.end method\n\n.method public constructor <init>(Lcom/tdq/game/shootbubble/sprite/BmpWrap;Ljava/util/Random;)V\n    .locals 6\n    .param p1, \"sprites\"    # Lcom/tdq/game/shootbubble/sprite/BmpWrap;\n    .param p2, \"rand\"    # Ljava/util/Random;\n\n    .prologue\n    const/4 v5, 0x0\n\n    .line 85\n    new-instance v0, Landroid/graphics/Rect;\n\n    const/16 v1, 0x169\n\n    const/16 v2, 0x1b4\n\n    const/16 v3, 0x1a0\n\n    const/16 v4, 0x1df\n\n    invoke-direct {v0, v1, v2, v3, v4}, Landroid/graphics/Rect;-><init>(IIII)V\n\n    invoke-direct {p0, v0}, Lcom/tdq/game/shootbubble/sprite/Sprite;-><init>(Landroid/graphics/Rect;)V\n\n    .line 87\n    iput-object p1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->spritesImage:Lcom/tdq/game/shootbubble/sprite/BmpWrap;\n\n    .line 88\n    iput-object p2, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->rand:Ljava/util/Random;\n\n    .line 90\n    iput v5, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    .line 92\n    const/4 v0, 0x3\n\n    iput v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->finalState:I\n\n    .line 93\n    iput v5, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->nextPosition:I\n\n    .line 94\n    return-void\n.end method\n\n.method public constructor <init>(Lcom/tdq/game/shootbubble/sprite/BmpWrap;Ljava/util/Random;IIII)V\n    .locals 5\n    .param p1, \"sprites\"    # Lcom/tdq/game/shootbubble/sprite/BmpWrap;\n    .param p2, \"rand\"    # Ljava/util/Random;\n    .param p3, \"currentPenguin\"    # I\n    .param p4, \"count\"    # I\n    .param p5, \"finalState\"    # I\n    .param p6, \"nextPosition\"    # I\n\n    .prologue\n    .line 100\n    new-instance v0, Landroid/graphics/Rect;\n\n    const/16 v1, 0x169\n\n    const/16 v2, 0x1b4\n\n    const/16 v3, 0x1a0\n\n    const/16 v4, 0x1df\n\n    invoke-direct {v0, v1, v2, v3, v4}, Landroid/graphics/Rect;-><init>(IIII)V\n\n    invoke-direct {p0, v0}, Lcom/tdq/game/shootbubble/sprite/Sprite;-><init>(Landroid/graphics/Rect;)V\n\n    .line 102\n    iput-object p1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->spritesImage:Lcom/tdq/game/shootbubble/sprite/BmpWrap;\n\n    .line 103\n    iput-object p2, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->rand:Ljava/util/Random;\n\n    .line 104\n    iput p3, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    .line 105\n    iput p4, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    .line 106\n    iput p5, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->finalState:I\n\n    .line 107\n    iput p6, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->nextPosition:I\n\n    .line 108\n    return-void\n.end method\n\n\n# virtual methods\n.method public getTypeId()I\n    .locals 1\n\n    .prologue\n    .line 124\n    sget v0, Lcom/tdq/game/shootbubble/sprite/Sprite;->TYPE_PENGUIN:I\n\n    return v0\n.end method\n\n.method public paint(Landroid/graphics/Canvas;DII)V\n    .locals 9\n    .param p1, \"c\"    # Landroid/graphics/Canvas;\n    .param p2, \"scale\"    # D\n    .param p4, \"dx\"    # I\n    .param p5, \"dy\"    # I\n\n    .prologue\n    .line 183\n    invoke-virtual {p0}, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->getSpriteArea()Landroid/graphics/Rect;\n\n    move-result-object v3\n\n    .line 184\n    .local v3, \"r\":Landroid/graphics/Rect;\n    iget-object v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->spritesImage:Lcom/tdq/game/shootbubble/sprite/BmpWrap;\n\n    const/16 v1, 0x168\n\n    iget v2, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    rem-int/lit8 v2, v2, 0x4\n\n    mul-int/lit8 v2, v2, 0x39\n\n    sub-int/2addr v1, v2\n\n    const/16 v2, 0x1b3\n\n    iget v4, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    div-int/lit8 v4, v4, 0x4\n\n    mul-int/lit8 v4, v4, 0x2d\n\n    sub-int/2addr v2, v4\n\n    move-object v4, p1\n\n    move-wide v5, p2\n\n    move v7, p4\n\n    move v8, p5\n\n    invoke-static/range {v0 .. v8}, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->drawImageClipped(Lcom/tdq/game/shootbubble/sprite/BmpWrap;IILandroid/graphics/Rect;Landroid/graphics/Canvas;DII)V\n\n    .line 188\n    return-void\n.end method\n\n.method public saveState(Landroid/os/Bundle;Ljava/util/Vector;)V\n    .locals 5\n    .param p1, \"map\"    # Landroid/os/Bundle;\n    .param p2, \"saved_sprites\"    # Ljava/util/Vector;\n\n    .prologue\n    const/4 v4, 0x1\n\n    const/4 v3, 0x0\n\n    .line 111\n    invoke-virtual {p0}, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->getSavedId()I\n\n    move-result v0\n\n    const/4 v1, -0x1\n\n    if-eq v0, v1, :cond_0\n\n    .line 120\n    :goto_0\n    return-void\n\n    .line 114\n    :cond_0\n    invoke-super {p0, p1, p2}, Lcom/tdq/game/shootbubble/sprite/Sprite;->saveState(Landroid/os/Bundle;Ljava/util/Vector;)V\n\n    .line 115\n    const-string v0, \"%d-currentPenguin\"\n\n    new-array v1, v4, [Ljava/lang/Object;\n\n    invoke-virtual {p0}, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->getSavedId()I\n\n    move-result v2\n\n    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;\n\n    move-result-object v2\n\n    aput-object v2, v1, v3\n\n    invoke-static {v0, v1}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\n\n    move-result-object v0\n\n    iget v1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    invoke-virtual {p1, v0, v1}, Landroid/os/Bundle;->putInt(Ljava/lang/String;I)V\n\n    .line 117\n    const-string v0, \"%d-count\"\n\n    new-array v1, v4, [Ljava/lang/Object;\n\n    invoke-virtual {p0}, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->getSavedId()I\n\n    move-result v2\n\n    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;\n\n    move-result-object v2\n\n    aput-object v2, v1, v3\n\n    invoke-static {v0, v1}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\n\n    move-result-object v0\n\n    iget v1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    invoke-virtual {p1, v0, v1}, Landroid/os/Bundle;->putInt(Ljava/lang/String;I)V\n\n    .line 118\n    const-string v0, \"%d-finalState\"\n\n    new-array v1, v4, [Ljava/lang/Object;\n\n    invoke-virtual {p0}, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->getSavedId()I\n\n    move-result v2\n\n    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;\n\n    move-result-object v2\n\n    aput-object v2, v1, v3\n\n    invoke-static {v0, v1}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\n\n    move-result-object v0\n\n    iget v1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->finalState:I\n\n    invoke-virtual {p1, v0, v1}, Landroid/os/Bundle;->putInt(Ljava/lang/String;I)V\n\n    .line 119\n    const-string v0, \"%d-nextPosition\"\n\n    new-array v1, v4, [Ljava/lang/Object;\n\n    invoke-virtual {p0}, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->getSavedId()I\n\n    move-result v2\n\n    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;\n\n    move-result-object v2\n\n    aput-object v2, v1, v3\n\n    invoke-static {v0, v1}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\n\n    move-result-object v0\n\n    iget v1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->nextPosition:I\n\n    invoke-virtual {p1, v0, v1}, Landroid/os/Bundle;->putInt(Ljava/lang/String;I)V\n\n    goto :goto_0\n.end method\n\n.method public updateState(I)V\n    .locals 6\n    .param p1, \"state\"    # I\n\n    .prologue\n    const/4 v5, 0x7\n\n    const/4 v1, 0x3\n\n    const/4 v4, 0x4\n\n    const/4 v3, 0x1\n\n    const/4 v2, 0x0\n\n    .line 129\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->finalState:I\n\n    if-eq v0, v1, :cond_2\n\n    .line 130\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    add-int/lit8 v0, v0, 0x1\n\n    iput v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    .line 132\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    rem-int/lit8 v0, v0, 0x6\n\n    if-nez v0, :cond_0\n\n    .line 133\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->finalState:I\n\n    const/4 v1, 0x5\n\n    if-ne v0, v1, :cond_1\n\n    .line 134\n    sget-object v0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->LOST_SEQUENCE:[[I\n\n    iget v1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->nextPosition:I\n\n    aget-object v0, v0, v1\n\n    aget v0, v0, v3\n\n    iput v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    .line 135\n    sget-object v0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->LOST_SEQUENCE:[[I\n\n    iget v1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->nextPosition:I\n\n    aget-object v0, v0, v1\n\n    aget v0, v0, v2\n\n    iput v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->nextPosition:I\n\n    .line 179\n    :cond_0\n    :goto_0\n    return-void\n\n    .line 136\n    :cond_1\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->finalState:I\n\n    if-ne v0, v4, :cond_0\n\n    .line 137\n    sget-object v0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->WON_SEQUENCE:[[I\n\n    iget v1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->nextPosition:I\n\n    aget-object v0, v0, v1\n\n    aget v0, v0, v3\n\n    iput v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    .line 138\n    sget-object v0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->WON_SEQUENCE:[[I\n\n    iget v1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->nextPosition:I\n\n    aget-object v0, v0, v1\n\n    aget v0, v0, v2\n\n    iput v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->nextPosition:I\n\n    goto :goto_0\n\n    .line 142\n    :cond_2\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    add-int/lit8 v0, v0, 0x1\n\n    iput v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    .line 144\n    packed-switch p1, :pswitch_data_0\n\n    .line 170\n    :cond_3\n    :goto_1\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    const/16 v1, 0x64\n\n    if-le v0, v1, :cond_5\n\n    .line 171\n    iput v5, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    goto :goto_0\n\n    .line 146\n    :pswitch_0\n    iput v2, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    .line 147\n    iput v1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    goto :goto_1\n\n    .line 150\n    :pswitch_1\n    iput v2, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    .line 151\n    const/4 v0, 0x2\n\n    iput v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    goto :goto_1\n\n    .line 154\n    :pswitch_2\n    iput v2, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    .line 155\n    iput v3, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    goto :goto_1\n\n    .line 158\n    :pswitch_3\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    if-lt v0, v4, :cond_4\n\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    if-le v0, v5, :cond_3\n\n    .line 159\n    :cond_4\n    iput v2, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    goto :goto_1\n\n    .line 164\n    :pswitch_4\n    iput v2, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    .line 165\n    iput p1, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->finalState:I\n\n    .line 166\n    iput v2, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    goto :goto_0\n\n    .line 172\n    :cond_5\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    rem-int/lit8 v0, v0, 0xf\n\n    if-nez v0, :cond_0\n\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->count:I\n\n    const/16 v1, 0x19\n\n    if-le v0, v1, :cond_0\n\n    .line 173\n    iget-object v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->rand:Ljava/util/Random;\n\n    invoke-virtual {v0}, Ljava/util/Random;->nextInt()I\n\n    move-result v0\n\n    rem-int/lit8 v0, v0, 0x3\n\n    add-int/lit8 v0, v0, 0x4\n\n    iput v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    .line 174\n    iget v0, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    if-ge v0, v4, :cond_0\n\n    .line 175\n    iput v2, p0, Lcom/tdq/game/shootbubble/sprite/PenguinSprite;->currentPenguin:I\n\n    goto :goto_0\n\n    .line 144\n    nop\n\n    :pswitch_data_0\n    .packed-switch 0x0\n        :pswitch_0\n        :pswitch_1\n        :pswitch_2\n        :pswitch_3\n        :pswitch_4\n        :pswitch_4\n    .end packed-switch\n.end method\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smali/Subject.smali",
    "content": ".class public final Lorg/apache/harmony/javax/security/auth/Subject;\n.super Ljava/lang/Object;\n.source \"Subject.java\"\n\n# interfaces\n.implements Ljava/io/Serializable;\n\n\n# annotations\n.annotation system Ldalvik/annotation/MemberClasses;\n    value = {\n        Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n    }\n.end annotation\n\n\n# static fields\n.field private static final _AS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n.field private static final _AS_PRIVILEGED:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n.field private static final _PRINCIPALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n.field private static final _PRIVATE_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n.field private static final _PUBLIC_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n.field private static final _READ_ONLY:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n.field private static final _SUBJECT:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n.field private static final serialVersionUID:J = -0x734dcd6cffcc0598L\n\n\n# instance fields\n.field private final principals:Ljava/util/Set;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"Ljava/util/Set\",\n            \"<\",\n            \"Ljava/security/Principal;\",\n            \">;\"\n        }\n    .end annotation\n.end field\n\n.field private transient privateCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"Lorg/apache/harmony/javax/security/auth/Subject$SecureSet\",\n            \"<\",\n            \"Ljava/lang/Object;\",\n            \">;\"\n        }\n    .end annotation\n.end field\n\n.field private transient publicCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"Lorg/apache/harmony/javax/security/auth/Subject$SecureSet\",\n            \"<\",\n            \"Ljava/lang/Object;\",\n            \">;\"\n        }\n    .end annotation\n.end field\n\n.field private readOnly:Z\n\n\n# direct methods\n.method static constructor <clinit>()V\n    .locals 2\n\n    .prologue\n    .line 59\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    const-string v1, \"doAs\"\n\n    invoke-direct {v0, v1}, Lorg/apache/harmony/javax/security/auth/AuthPermission;-><init>(Ljava/lang/String;)V\n\n    sput-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_AS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 61\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 62\n    const-string v1, \"doAsPrivileged\"\n\n    .line 61\n    invoke-direct {v0, v1}, Lorg/apache/harmony/javax/security/auth/AuthPermission;-><init>(Ljava/lang/String;)V\n\n    sput-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_AS_PRIVILEGED:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 64\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 65\n    const-string v1, \"getSubject\"\n\n    .line 64\n    invoke-direct {v0, v1}, Lorg/apache/harmony/javax/security/auth/AuthPermission;-><init>(Ljava/lang/String;)V\n\n    sput-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_SUBJECT:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 67\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 68\n    const-string v1, \"modifyPrincipals\"\n\n    .line 67\n    invoke-direct {v0, v1}, Lorg/apache/harmony/javax/security/auth/AuthPermission;-><init>(Ljava/lang/String;)V\n\n    sput-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_PRINCIPALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 70\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 71\n    const-string v1, \"modifyPrivateCredentials\"\n\n    .line 70\n    invoke-direct {v0, v1}, Lorg/apache/harmony/javax/security/auth/AuthPermission;-><init>(Ljava/lang/String;)V\n\n    sput-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_PRIVATE_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 73\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 74\n    const-string v1, \"modifyPublicCredentials\"\n\n    .line 73\n    invoke-direct {v0, v1}, Lorg/apache/harmony/javax/security/auth/AuthPermission;-><init>(Ljava/lang/String;)V\n\n    sput-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_PUBLIC_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 76\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 77\n    const-string v1, \"setReadOnly\"\n\n    .line 76\n    invoke-direct {v0, v1}, Lorg/apache/harmony/javax/security/auth/AuthPermission;-><init>(Ljava/lang/String;)V\n\n    sput-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_READ_ONLY:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    .line 55\n    return-void\n.end method\n\n.method public constructor <init>()V\n    .locals 2\n\n    .prologue\n    .line 94\n    invoke-direct {p0}, Ljava/lang/Object;-><init>()V\n\n    .line 95\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    sget-object v1, Lorg/apache/harmony/javax/security/auth/Subject;->_PRINCIPALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-direct {v0, p0, v1}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;-><init>(Lorg/apache/harmony/javax/security/auth/Subject;Lorg/apache/harmony/javax/security/auth/AuthPermission;)V\n\n    iput-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->principals:Ljava/util/Set;\n\n    .line 96\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    sget-object v1, Lorg/apache/harmony/javax/security/auth/Subject;->_PUBLIC_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-direct {v0, p0, v1}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;-><init>(Lorg/apache/harmony/javax/security/auth/Subject;Lorg/apache/harmony/javax/security/auth/AuthPermission;)V\n\n    iput-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->publicCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    .line 97\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    sget-object v1, Lorg/apache/harmony/javax/security/auth/Subject;->_PRIVATE_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-direct {v0, p0, v1}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;-><init>(Lorg/apache/harmony/javax/security/auth/Subject;Lorg/apache/harmony/javax/security/auth/AuthPermission;)V\n\n    iput-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->privateCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    .line 99\n    const/4 v0, 0x0\n\n    iput-boolean v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->readOnly:Z\n\n    .line 100\n    return-void\n.end method\n\n.method public constructor <init>(ZLjava/util/Set;Ljava/util/Set;Ljava/util/Set;)V\n    .locals 2\n    .param p1, \"readOnly\"    # Z\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"(Z\",\n            \"Ljava/util/Set\",\n            \"<+\",\n            \"Ljava/security/Principal;\",\n            \">;\",\n            \"Ljava/util/Set\",\n            \"<*>;\",\n            \"Ljava/util/Set\",\n            \"<*>;)V\"\n        }\n    .end annotation\n\n    .prologue\n    .line 119\n    .local p2, \"subjPrincipals\":Ljava/util/Set;, \"Ljava/util/Set<+Ljava/security/Principal;>;\"\n    .local p3, \"pubCredentials\":Ljava/util/Set;, \"Ljava/util/Set<*>;\"\n    .local p4, \"privCredentials\":Ljava/util/Set;, \"Ljava/util/Set<*>;\"\n    invoke-direct {p0}, Ljava/lang/Object;-><init>()V\n\n    .line 122\n    if-eqz p2, :cond_0\n\n    if-eqz p3, :cond_0\n\n    if-nez p4, :cond_1\n\n    .line 123\n    :cond_0\n    new-instance v0, Ljava/lang/NullPointerException;\n\n    invoke-direct {v0}, Ljava/lang/NullPointerException;-><init>()V\n\n    throw v0\n\n    .line 126\n    :cond_1\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    sget-object v1, Lorg/apache/harmony/javax/security/auth/Subject;->_PRINCIPALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-direct {v0, p0, v1, p2}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;-><init>(Lorg/apache/harmony/javax/security/auth/Subject;Lorg/apache/harmony/javax/security/auth/AuthPermission;Ljava/util/Collection;)V\n\n    iput-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->principals:Ljava/util/Set;\n\n    .line 127\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    sget-object v1, Lorg/apache/harmony/javax/security/auth/Subject;->_PUBLIC_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-direct {v0, p0, v1, p3}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;-><init>(Lorg/apache/harmony/javax/security/auth/Subject;Lorg/apache/harmony/javax/security/auth/AuthPermission;Ljava/util/Collection;)V\n\n    iput-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->publicCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    .line 128\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    sget-object v1, Lorg/apache/harmony/javax/security/auth/Subject;->_PRIVATE_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-direct {v0, p0, v1, p4}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;-><init>(Lorg/apache/harmony/javax/security/auth/Subject;Lorg/apache/harmony/javax/security/auth/AuthPermission;Ljava/util/Collection;)V\n\n    iput-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->privateCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    .line 130\n    iput-boolean p1, p0, Lorg/apache/harmony/javax/security/auth/Subject;->readOnly:Z\n\n    .line 131\n    return-void\n.end method\n\n.method static synthetic access$0(Lorg/apache/harmony/javax/security/auth/Subject;)V\n    .locals 0\n\n    .prologue\n    .line 514\n    invoke-direct {p0}, Lorg/apache/harmony/javax/security/auth/Subject;->checkState()V\n\n    return-void\n.end method\n\n.method static synthetic access$1(Ljava/security/Permission;)V\n    .locals 0\n\n    .prologue\n    .line 506\n    invoke-static {p0}, Lorg/apache/harmony/javax/security/auth/Subject;->checkPermission(Ljava/security/Permission;)V\n\n    return-void\n.end method\n\n.method static synthetic access$2()Lorg/apache/harmony/javax/security/auth/AuthPermission;\n    .locals 1\n\n    .prologue\n    .line 67\n    sget-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_PRINCIPALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    return-object v0\n.end method\n\n.method static synthetic access$3()Lorg/apache/harmony/javax/security/auth/AuthPermission;\n    .locals 1\n\n    .prologue\n    .line 70\n    sget-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_PRIVATE_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    return-object v0\n.end method\n\n.method static synthetic access$4(Lorg/apache/harmony/javax/security/auth/Subject;)Ljava/util/Set;\n    .locals 1\n\n    .prologue\n    .line 79\n    iget-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->principals:Ljava/util/Set;\n\n    return-object v0\n.end method\n\n.method static synthetic access$5()Lorg/apache/harmony/javax/security/auth/AuthPermission;\n    .locals 1\n\n    .prologue\n    .line 73\n    sget-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_PUBLIC_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    return-object v0\n.end method\n\n.method private static checkPermission(Ljava/security/Permission;)V\n    .locals 1\n    .param p0, \"p\"    # Ljava/security/Permission;\n\n    .prologue\n    .line 507\n    invoke-static {}, Ljava/lang/System;->getSecurityManager()Ljava/lang/SecurityManager;\n\n    move-result-object v0\n\n    .line 508\n    .local v0, \"sm\":Ljava/lang/SecurityManager;\n    if-eqz v0, :cond_0\n\n    .line 509\n    invoke-virtual {v0, p0}, Ljava/lang/SecurityManager;->checkPermission(Ljava/security/Permission;)V\n\n    .line 511\n    :cond_0\n    return-void\n.end method\n\n.method private checkState()V\n    .locals 2\n\n    .prologue\n    .line 515\n    iget-boolean v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->readOnly:Z\n\n    if-eqz v0, :cond_0\n\n    .line 516\n    new-instance v0, Ljava/lang/IllegalStateException;\n\n    const-string v1, \"auth.0A\"\n\n    invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n\n    .line 518\n    :cond_0\n    return-void\n.end method\n\n.method public static doAs(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedAction;)Ljava/lang/Object;\n    .locals 1\n    .param p0, \"subject\"    # Lorg/apache/harmony/javax/security/auth/Subject;\n    .param p1, \"action\"    # Ljava/security/PrivilegedAction;\n\n    .prologue\n    .line 146\n    sget-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_AS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-static {v0}, Lorg/apache/harmony/javax/security/auth/Subject;->checkPermission(Ljava/security/Permission;)V\n\n    .line 148\n    invoke-static {}, Ljava/security/AccessController;->getContext()Ljava/security/AccessControlContext;\n\n    move-result-object v0\n\n    invoke-static {p0, p1, v0}, Lorg/apache/harmony/javax/security/auth/Subject;->doAs_PrivilegedAction(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    return-object v0\n.end method\n\n.method public static doAs(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;\n    .locals 1\n    .param p0, \"subject\"    # Lorg/apache/harmony/javax/security/auth/Subject;\n    .param p1, \"action\"    # Ljava/security/PrivilegedExceptionAction;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/security/PrivilegedActionException;\n        }\n    .end annotation\n\n    .prologue\n    .line 223\n    sget-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_AS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-static {v0}, Lorg/apache/harmony/javax/security/auth/Subject;->checkPermission(Ljava/security/Permission;)V\n\n    .line 225\n    invoke-static {}, Ljava/security/AccessController;->getContext()Ljava/security/AccessControlContext;\n\n    move-result-object v0\n\n    invoke-static {p0, p1, v0}, Lorg/apache/harmony/javax/security/auth/Subject;->doAs_PrivilegedExceptionAction(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    return-object v0\n.end method\n\n.method public static doAsPrivileged(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n    .locals 2\n    .param p0, \"subject\"    # Lorg/apache/harmony/javax/security/auth/Subject;\n    .param p1, \"action\"    # Ljava/security/PrivilegedAction;\n    .param p2, \"context\"    # Ljava/security/AccessControlContext;\n\n    .prologue\n    .line 170\n    sget-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_AS_PRIVILEGED:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-static {v0}, Lorg/apache/harmony/javax/security/auth/Subject;->checkPermission(Ljava/security/Permission;)V\n\n    .line 172\n    if-nez p2, :cond_0\n\n    .line 173\n    new-instance v0, Ljava/security/AccessControlContext;\n\n    .line 174\n    const/4 v1, 0x0\n\n    new-array v1, v1, [Ljava/security/ProtectionDomain;\n\n    invoke-direct {v0, v1}, Ljava/security/AccessControlContext;-><init>([Ljava/security/ProtectionDomain;)V\n\n    .line 173\n    invoke-static {p0, p1, v0}, Lorg/apache/harmony/javax/security/auth/Subject;->doAs_PrivilegedAction(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    .line 176\n    :goto_0\n    return-object v0\n\n    :cond_0\n    invoke-static {p0, p1, p2}, Lorg/apache/harmony/javax/security/auth/Subject;->doAs_PrivilegedAction(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    goto :goto_0\n.end method\n\n.method public static doAsPrivileged(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n    .locals 2\n    .param p0, \"subject\"    # Lorg/apache/harmony/javax/security/auth/Subject;\n    .param p1, \"action\"    # Ljava/security/PrivilegedExceptionAction;\n    .param p2, \"context\"    # Ljava/security/AccessControlContext;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/security/PrivilegedActionException;\n        }\n    .end annotation\n\n    .prologue\n    .line 250\n    sget-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_AS_PRIVILEGED:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-static {v0}, Lorg/apache/harmony/javax/security/auth/Subject;->checkPermission(Ljava/security/Permission;)V\n\n    .line 252\n    if-nez p2, :cond_0\n\n    .line 254\n    new-instance v0, Ljava/security/AccessControlContext;\n\n    const/4 v1, 0x0\n\n    new-array v1, v1, [Ljava/security/ProtectionDomain;\n\n    invoke-direct {v0, v1}, Ljava/security/AccessControlContext;-><init>([Ljava/security/ProtectionDomain;)V\n\n    .line 253\n    invoke-static {p0, p1, v0}, Lorg/apache/harmony/javax/security/auth/Subject;->doAs_PrivilegedExceptionAction(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    .line 256\n    :goto_0\n    return-object v0\n\n    :cond_0\n    invoke-static {p0, p1, p2}, Lorg/apache/harmony/javax/security/auth/Subject;->doAs_PrivilegedExceptionAction(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    goto :goto_0\n.end method\n\n.method private static doAs_PrivilegedAction(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n    .locals 4\n    .param p0, \"subject\"    # Lorg/apache/harmony/javax/security/auth/Subject;\n    .param p1, \"action\"    # Ljava/security/PrivilegedAction;\n    .param p2, \"context\"    # Ljava/security/AccessControlContext;\n\n    .prologue\n    .line 187\n    if-nez p0, :cond_0\n\n    .line 190\n    const/4 v0, 0x0\n\n    .line 195\n    .local v0, \"combiner\":Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;\n    :goto_0\n    new-instance v1, Lorg/apache/harmony/javax/security/auth/Subject$1;\n\n    invoke-direct {v1, p2, v0}, Lorg/apache/harmony/javax/security/auth/Subject$1;-><init>(Ljava/security/AccessControlContext;Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;)V\n\n    .line 202\n    .local v1, \"dccAction\":Ljava/security/PrivilegedAction;\n    invoke-static {v1}, Ljava/security/AccessController;->doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;\n\n    move-result-object v2\n\n    check-cast v2, Ljava/security/AccessControlContext;\n\n    .line 204\n    .local v2, \"newContext\":Ljava/security/AccessControlContext;\n    invoke-static {p1, v2}, Ljava/security/AccessController;->doPrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n\n    move-result-object v3\n\n    return-object v3\n\n    .line 192\n    .end local v0    # \"combiner\":Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;\n    .end local v1    # \"dccAction\":Ljava/security/PrivilegedAction;\n    .end local v2    # \"newContext\":Ljava/security/AccessControlContext;\n    :cond_0\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;\n\n    invoke-direct {v0, p0}, Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;-><init>(Lorg/apache/harmony/javax/security/auth/Subject;)V\n\n    .restart local v0    # \"combiner\":Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;\n    goto :goto_0\n.end method\n\n.method private static doAs_PrivilegedExceptionAction(Lorg/apache/harmony/javax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n    .locals 4\n    .param p0, \"subject\"    # Lorg/apache/harmony/javax/security/auth/Subject;\n    .param p1, \"action\"    # Ljava/security/PrivilegedExceptionAction;\n    .param p2, \"context\"    # Ljava/security/AccessControlContext;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/security/PrivilegedActionException;\n        }\n    .end annotation\n\n    .prologue\n    .line 268\n    if-nez p0, :cond_0\n\n    .line 271\n    const/4 v0, 0x0\n\n    .line 276\n    .local v0, \"combiner\":Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;\n    :goto_0\n    new-instance v1, Lorg/apache/harmony/javax/security/auth/Subject$2;\n\n    invoke-direct {v1, p2, v0}, Lorg/apache/harmony/javax/security/auth/Subject$2;-><init>(Ljava/security/AccessControlContext;Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;)V\n\n    .line 282\n    .local v1, \"dccAction\":Ljava/security/PrivilegedAction;, \"Ljava/security/PrivilegedAction<Ljava/security/AccessControlContext;>;\"\n    invoke-static {v1}, Ljava/security/AccessController;->doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;\n\n    move-result-object v2\n\n    check-cast v2, Ljava/security/AccessControlContext;\n\n    .line 284\n    .local v2, \"newContext\":Ljava/security/AccessControlContext;\n    invoke-static {p1, v2}, Ljava/security/AccessController;->doPrivileged(Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\n\n    move-result-object v3\n\n    return-object v3\n\n    .line 273\n    .end local v0    # \"combiner\":Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;\n    .end local v1    # \"dccAction\":Ljava/security/PrivilegedAction;, \"Ljava/security/PrivilegedAction<Ljava/security/AccessControlContext;>;\"\n    .end local v2    # \"newContext\":Ljava/security/AccessControlContext;\n    :cond_0\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;\n\n    invoke-direct {v0, p0}, Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;-><init>(Lorg/apache/harmony/javax/security/auth/Subject;)V\n\n    .restart local v0    # \"combiner\":Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;\n    goto :goto_0\n.end method\n\n.method public static getSubject(Ljava/security/AccessControlContext;)Lorg/apache/harmony/javax/security/auth/Subject;\n    .locals 4\n    .param p0, \"context\"    # Ljava/security/AccessControlContext;\n\n    .prologue\n    .line 488\n    sget-object v2, Lorg/apache/harmony/javax/security/auth/Subject;->_SUBJECT:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-static {v2}, Lorg/apache/harmony/javax/security/auth/Subject;->checkPermission(Ljava/security/Permission;)V\n\n    .line 489\n    if-nez p0, :cond_0\n\n    .line 490\n    new-instance v2, Ljava/lang/NullPointerException;\n\n    const-string v3, \"auth.09\"\n\n    invoke-direct {v2, v3}, Ljava/lang/NullPointerException;-><init>(Ljava/lang/String;)V\n\n    throw v2\n\n    .line 492\n    :cond_0\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/Subject$3;\n\n    invoke-direct {v0, p0}, Lorg/apache/harmony/javax/security/auth/Subject$3;-><init>(Ljava/security/AccessControlContext;)V\n\n    .line 497\n    .local v0, \"action\":Ljava/security/PrivilegedAction;, \"Ljava/security/PrivilegedAction<Ljava/security/DomainCombiner;>;\"\n    invoke-static {v0}, Ljava/security/AccessController;->doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;\n\n    move-result-object v1\n\n    check-cast v1, Ljava/security/DomainCombiner;\n\n    .line 499\n    .local v1, \"combiner\":Ljava/security/DomainCombiner;\n    if-eqz v1, :cond_1\n\n    instance-of v2, v1, Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;\n\n    if-nez v2, :cond_2\n\n    .line 500\n    :cond_1\n    const/4 v2, 0x0\n\n    .line 502\n    .end local v1    # \"combiner\":Ljava/security/DomainCombiner;\n    :goto_0\n    return-object v2\n\n    .restart local v1    # \"combiner\":Ljava/security/DomainCombiner;\n    :cond_2\n    check-cast v1, Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;\n\n    .end local v1    # \"combiner\":Ljava/security/DomainCombiner;\n    invoke-virtual {v1}, Lorg/apache/harmony/javax/security/auth/SubjectDomainCombiner;->getSubject()Lorg/apache/harmony/javax/security/auth/Subject;\n\n    move-result-object v2\n\n    goto :goto_0\n.end method\n\n.method private readObject(Ljava/io/ObjectInputStream;)V\n    .locals 2\n    .param p1, \"in\"    # Ljava/io/ObjectInputStream;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;,\n            Ljava/lang/ClassNotFoundException;\n        }\n    .end annotation\n\n    .prologue\n    .line 467\n    invoke-virtual {p1}, Ljava/io/ObjectInputStream;->defaultReadObject()V\n\n    .line 469\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    sget-object v1, Lorg/apache/harmony/javax/security/auth/Subject;->_PUBLIC_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-direct {v0, p0, v1}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;-><init>(Lorg/apache/harmony/javax/security/auth/Subject;Lorg/apache/harmony/javax/security/auth/AuthPermission;)V\n\n    iput-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->publicCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    .line 470\n    new-instance v0, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    sget-object v1, Lorg/apache/harmony/javax/security/auth/Subject;->_PRIVATE_CREDENTIALS:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-direct {v0, p0, v1}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;-><init>(Lorg/apache/harmony/javax/security/auth/Subject;Lorg/apache/harmony/javax/security/auth/AuthPermission;)V\n\n    iput-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->privateCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    .line 471\n    return-void\n.end method\n\n.method private writeObject(Ljava/io/ObjectOutputStream;)V\n    .locals 0\n    .param p1, \"out\"    # Ljava/io/ObjectOutputStream;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 474\n    invoke-virtual {p1}, Ljava/io/ObjectOutputStream;->defaultWriteObject()V\n\n    .line 475\n    return-void\n.end method\n\n\n# virtual methods\n.method public equals(Ljava/lang/Object;)Z\n    .locals 5\n    .param p1, \"obj\"    # Ljava/lang/Object;\n\n    .prologue\n    const/4 v1, 0x1\n\n    const/4 v2, 0x0\n\n    .line 301\n    if-ne p0, p1, :cond_1\n\n    .line 316\n    :cond_0\n    :goto_0\n    return v1\n\n    .line 305\n    :cond_1\n    if-eqz p1, :cond_2\n\n    invoke-virtual {p0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;\n\n    move-result-object v3\n\n    invoke-virtual {p1}, Ljava/lang/Object;->getClass()Ljava/lang/Class;\n\n    move-result-object v4\n\n    if-eq v3, v4, :cond_3\n\n    :cond_2\n    move v1, v2\n\n    .line 306\n    goto :goto_0\n\n    :cond_3\n    move-object v0, p1\n\n    .line 309\n    check-cast v0, Lorg/apache/harmony/javax/security/auth/Subject;\n\n    .line 311\n    .local v0, \"that\":Lorg/apache/harmony/javax/security/auth/Subject;\n    iget-object v3, p0, Lorg/apache/harmony/javax/security/auth/Subject;->principals:Ljava/util/Set;\n\n    iget-object v4, v0, Lorg/apache/harmony/javax/security/auth/Subject;->principals:Ljava/util/Set;\n\n    invoke-interface {v3, v4}, Ljava/util/Set;->equals(Ljava/lang/Object;)Z\n\n    move-result v3\n\n    if-eqz v3, :cond_4\n\n    .line 312\n    iget-object v3, p0, Lorg/apache/harmony/javax/security/auth/Subject;->publicCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    iget-object v4, v0, Lorg/apache/harmony/javax/security/auth/Subject;->publicCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    invoke-virtual {v3, v4}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;->equals(Ljava/lang/Object;)Z\n\n    move-result v3\n\n    if-eqz v3, :cond_4\n\n    .line 313\n    iget-object v3, p0, Lorg/apache/harmony/javax/security/auth/Subject;->privateCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    iget-object v4, v0, Lorg/apache/harmony/javax/security/auth/Subject;->privateCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    invoke-virtual {v3, v4}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;->equals(Ljava/lang/Object;)Z\n\n    move-result v3\n\n    if-nez v3, :cond_0\n\n    :cond_4\n    move v1, v2\n\n    .line 316\n    goto :goto_0\n.end method\n\n.method public getPrincipals()Ljava/util/Set;\n    .locals 1\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"()\",\n            \"Ljava/util/Set\",\n            \"<\",\n            \"Ljava/security/Principal;\",\n            \">;\"\n        }\n    .end annotation\n\n    .prologue\n    .line 325\n    iget-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->principals:Ljava/util/Set;\n\n    return-object v0\n.end method\n\n.method public getPrincipals(Ljava/lang/Class;)Ljava/util/Set;\n    .locals 1\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"<T::\",\n            \"Ljava/security/Principal;\",\n            \">(\",\n            \"Ljava/lang/Class\",\n            \"<TT;>;)\",\n            \"Ljava/util/Set\",\n            \"<TT;>;\"\n        }\n    .end annotation\n\n    .prologue\n    .line 341\n    .local p1, \"c\":Ljava/lang/Class;, \"Ljava/lang/Class<TT;>;\"\n    iget-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->principals:Ljava/util/Set;\n\n    check-cast v0, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    invoke-virtual {v0, p1}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;->get(Ljava/lang/Class;)Ljava/util/Set;\n\n    move-result-object v0\n\n    return-object v0\n.end method\n\n.method public getPrivateCredentials()Ljava/util/Set;\n    .locals 1\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"()\",\n            \"Ljava/util/Set\",\n            \"<\",\n            \"Ljava/lang/Object;\",\n            \">;\"\n        }\n    .end annotation\n\n    .prologue\n    .line 350\n    iget-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->privateCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    return-object v0\n.end method\n\n.method public getPrivateCredentials(Ljava/lang/Class;)Ljava/util/Set;\n    .locals 1\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"<T:\",\n            \"Ljava/lang/Object;\",\n            \">(\",\n            \"Ljava/lang/Class\",\n            \"<TT;>;)\",\n            \"Ljava/util/Set\",\n            \"<TT;>;\"\n        }\n    .end annotation\n\n    .prologue\n    .line 365\n    .local p1, \"c\":Ljava/lang/Class;, \"Ljava/lang/Class<TT;>;\"\n    iget-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->privateCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    invoke-virtual {v0, p1}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;->get(Ljava/lang/Class;)Ljava/util/Set;\n\n    move-result-object v0\n\n    return-object v0\n.end method\n\n.method public getPublicCredentials()Ljava/util/Set;\n    .locals 1\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"()\",\n            \"Ljava/util/Set\",\n            \"<\",\n            \"Ljava/lang/Object;\",\n            \">;\"\n        }\n    .end annotation\n\n    .prologue\n    .line 374\n    iget-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->publicCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    return-object v0\n.end method\n\n.method public getPublicCredentials(Ljava/lang/Class;)Ljava/util/Set;\n    .locals 1\n    .annotation system Ldalvik/annotation/Signature;\n        value = {\n            \"<T:\",\n            \"Ljava/lang/Object;\",\n            \">(\",\n            \"Ljava/lang/Class\",\n            \"<TT;>;)\",\n            \"Ljava/util/Set\",\n            \"<TT;>;\"\n        }\n    .end annotation\n\n    .prologue\n    .line 390\n    .local p1, \"c\":Ljava/lang/Class;, \"Ljava/lang/Class<TT;>;\"\n    iget-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->publicCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    invoke-virtual {v0, p1}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;->get(Ljava/lang/Class;)Ljava/util/Set;\n\n    move-result-object v0\n\n    return-object v0\n.end method\n\n.method public hashCode()I\n    .locals 2\n\n    .prologue\n    .line 400\n    iget-object v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->principals:Ljava/util/Set;\n\n    invoke-interface {v0}, Ljava/util/Set;->hashCode()I\n\n    move-result v0\n\n    iget-object v1, p0, Lorg/apache/harmony/javax/security/auth/Subject;->privateCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    invoke-virtual {v1}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;->hashCode()I\n\n    move-result v1\n\n    add-int/2addr v0, v1\n\n    .line 401\n    iget-object v1, p0, Lorg/apache/harmony/javax/security/auth/Subject;->publicCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    invoke-virtual {v1}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;->hashCode()I\n\n    move-result v1\n\n    .line 400\n    add-int/2addr v0, v1\n\n    return v0\n.end method\n\n.method public isReadOnly()Z\n    .locals 1\n\n    .prologue\n    .line 422\n    iget-boolean v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->readOnly:Z\n\n    return v0\n.end method\n\n.method public setReadOnly()V\n    .locals 1\n\n    .prologue\n    .line 411\n    sget-object v0, Lorg/apache/harmony/javax/security/auth/Subject;->_READ_ONLY:Lorg/apache/harmony/javax/security/auth/AuthPermission;\n\n    invoke-static {v0}, Lorg/apache/harmony/javax/security/auth/Subject;->checkPermission(Ljava/security/Permission;)V\n\n    .line 413\n    const/4 v0, 0x1\n\n    iput-boolean v0, p0, Lorg/apache/harmony/javax/security/auth/Subject;->readOnly:Z\n\n    .line 414\n    return-void\n.end method\n\n.method public toString()Ljava/lang/String;\n    .locals 6\n\n    .prologue\n    const/16 v5, 0xa\n\n    .line 433\n    new-instance v0, Ljava/lang/StringBuilder;\n\n    const-string v4, \"Subject:\\n\"\n\n    invoke-direct {v0, v4}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V\n\n    .line 435\n    .local v0, \"buf\":Ljava/lang/StringBuilder;\n    iget-object v4, p0, Lorg/apache/harmony/javax/security/auth/Subject;->principals:Ljava/util/Set;\n\n    invoke-interface {v4}, Ljava/util/Set;->iterator()Ljava/util/Iterator;\n\n    move-result-object v2\n\n    .line 436\n    .local v2, \"it\":Ljava/util/Iterator;, \"Ljava/util/Iterator<*>;\"\n    :goto_0\n    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z\n\n    move-result v4\n\n    if-nez v4, :cond_0\n\n    .line 442\n    iget-object v4, p0, Lorg/apache/harmony/javax/security/auth/Subject;->publicCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    invoke-virtual {v4}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;->iterator()Ljava/util/Iterator;\n\n    move-result-object v2\n\n    .line 443\n    :goto_1\n    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z\n\n    move-result v4\n\n    if-nez v4, :cond_1\n\n    .line 449\n    invoke-virtual {v0}, Ljava/lang/StringBuilder;->length()I\n\n    move-result v4\n\n    add-int/lit8 v3, v4, -0x1\n\n    .line 450\n    .local v3, \"offset\":I\n    iget-object v4, p0, Lorg/apache/harmony/javax/security/auth/Subject;->privateCredentials:Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;\n\n    invoke-virtual {v4}, Lorg/apache/harmony/javax/security/auth/Subject$SecureSet;->iterator()Ljava/util/Iterator;\n\n    move-result-object v2\n\n    .line 452\n    :goto_2\n    :try_start_0\n    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z\n    :try_end_0\n    .catch Ljava/lang/SecurityException; {:try_start_0 .. :try_end_0} :catch_0\n\n    move-result v4\n\n    if-nez v4, :cond_2\n\n    .line 461\n    :goto_3\n    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v4\n\n    return-object v4\n\n    .line 437\n    .end local v3    # \"offset\":I\n    :cond_0\n    const-string v4, \"\\tPrincipal: \"\n\n    invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    .line 438\n    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;\n\n    move-result-object v4\n\n    invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;\n\n    .line 439\n    invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;\n\n    goto :goto_0\n\n    .line 444\n    :cond_1\n    const-string v4, \"\\tPublic Credential: \"\n\n    invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    .line 445\n    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;\n\n    move-result-object v4\n\n    invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;\n\n    .line 446\n    invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;\n\n    goto :goto_1\n\n    .line 453\n    .restart local v3    # \"offset\":I\n    :cond_2\n    :try_start_1\n    const-string v4, \"\\tPrivate Credential: \"\n\n    invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    .line 454\n    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;\n\n    move-result-object v4\n\n    invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;\n\n    .line 455\n    const/16 v4, 0xa\n\n    invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;\n    :try_end_1\n    .catch Ljava/lang/SecurityException; {:try_start_1 .. :try_end_1} :catch_0\n\n    goto :goto_2\n\n    .line 457\n    :catch_0\n    move-exception v1\n\n    .line 458\n    .local v1, \"e\":Ljava/lang/SecurityException;\n    invoke-virtual {v0}, Ljava/lang/StringBuilder;->length()I\n\n    move-result v4\n\n    invoke-virtual {v0, v3, v4}, Ljava/lang/StringBuilder;->delete(II)Ljava/lang/StringBuilder;\n\n    .line 459\n    const-string v4, \"\\tPrivate Credentials: no accessible information\\n\"\n\n    invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    goto :goto_3\n.end method\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smali/ViewDragHelper.smali",
    "content": ".class public Landroid/support/v4/widget/ViewDragHelper;\n.super Ljava/lang/Object;\n.source \"ViewDragHelper.java\"\n\n\n# annotations\n.annotation system Ldalvik/annotation/MemberClasses;\n    value = {\n        Landroid/support/v4/widget/ViewDragHelper$Callback;\n    }\n.end annotation\n\n\n# static fields\n.field private static final BASE_SETTLE_DURATION:I = 0x100\n\n.field public static final DIRECTION_ALL:I = 0x3\n\n.field public static final DIRECTION_HORIZONTAL:I = 0x1\n\n.field public static final DIRECTION_VERTICAL:I = 0x2\n\n.field public static final EDGE_ALL:I = 0xf\n\n.field public static final EDGE_BOTTOM:I = 0x8\n\n.field public static final EDGE_LEFT:I = 0x1\n\n.field public static final EDGE_RIGHT:I = 0x2\n\n.field private static final EDGE_SIZE:I = 0x14\n\n.field public static final EDGE_TOP:I = 0x4\n\n.field public static final INVALID_POINTER:I = -0x1\n\n.field private static final MAX_SETTLE_DURATION:I = 0x258\n\n.field public static final STATE_DRAGGING:I = 0x1\n\n.field public static final STATE_IDLE:I = 0x0\n\n.field public static final STATE_SETTLING:I = 0x2\n\n.field private static final TAG:Ljava/lang/String; = \"ViewDragHelper\"\n\n.field private static final sInterpolator:Landroid/view/animation/Interpolator;\n\n\n# instance fields\n.field private mActivePointerId:I\n\n.field private final mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n.field private mCapturedView:Landroid/view/View;\n\n.field private mDragState:I\n\n.field private mEdgeDragsInProgress:[I\n\n.field private mEdgeDragsLocked:[I\n\n.field private mEdgeSize:I\n\n.field private mInitialEdgesTouched:[I\n\n.field private mInitialMotionX:[F\n\n.field private mInitialMotionY:[F\n\n.field private mLastMotionX:[F\n\n.field private mLastMotionY:[F\n\n.field private mMaxVelocity:F\n\n.field private mMinVelocity:F\n\n.field private final mParentView:Landroid/view/ViewGroup;\n\n.field private mPointersDown:I\n\n.field private mReleaseInProgress:Z\n\n.field private mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n.field private final mSetIdleRunnable:Ljava/lang/Runnable;\n\n.field private mTouchSlop:I\n\n.field private mTrackingEdges:I\n\n.field private mVelocityTracker:Landroid/view/VelocityTracker;\n\n\n# direct methods\n.method static constructor <clinit>()V\n    .registers 1\n\n    .prologue\n    .line 326\n    new-instance v0, Landroid/support/v4/widget/ViewDragHelper$1;\n\n    invoke-direct {v0}, Landroid/support/v4/widget/ViewDragHelper$1;-><init>()V\n\n    sput-object v0, Landroid/support/v4/widget/ViewDragHelper;->sInterpolator:Landroid/view/animation/Interpolator;\n\n    return-void\n.end method\n\n.method private constructor <init>(Landroid/content/Context;Landroid/view/ViewGroup;Landroid/support/v4/widget/ViewDragHelper$Callback;)V\n    .registers 8\n    .param p1, \"context\"    # Landroid/content/Context;\n    .param p2, \"forParent\"    # Landroid/view/ViewGroup;\n    .param p3, \"cb\"    # Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    .prologue\n    .line 373\n    invoke-direct {p0}, Ljava/lang/Object;-><init>()V\n\n    .line 115\n    const/4 v2, -0x1\n\n    iput v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    .line 333\n    new-instance v2, Landroid/support/v4/widget/ViewDragHelper$2;\n\n    invoke-direct {v2, p0}, Landroid/support/v4/widget/ViewDragHelper$2;-><init>(Landroid/support/v4/widget/ViewDragHelper;)V\n\n    iput-object v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mSetIdleRunnable:Ljava/lang/Runnable;\n\n    .line 374\n    if-nez p2, :cond_17\n\n    .line 375\n    new-instance v2, Ljava/lang/IllegalArgumentException;\n\n    const-string v3, \"Parent view may not be null\"\n\n    invoke-direct {v2, v3}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V\n\n    throw v2\n\n    .line 377\n    :cond_17\n    if-nez p3, :cond_21\n\n    .line 378\n    new-instance v2, Ljava/lang/IllegalArgumentException;\n\n    const-string v3, \"Callback may not be null\"\n\n    invoke-direct {v2, v3}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V\n\n    throw v2\n\n    .line 381\n    :cond_21\n    iput-object p2, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    .line 382\n    iput-object p3, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    .line 384\n    invoke-static {p1}, Landroid/view/ViewConfiguration;->get(Landroid/content/Context;)Landroid/view/ViewConfiguration;\n\n    move-result-object v1\n\n    .line 385\n    .local v1, \"vc\":Landroid/view/ViewConfiguration;\n    invoke-virtual {p1}, Landroid/content/Context;->getResources()Landroid/content/res/Resources;\n\n    move-result-object v2\n\n    invoke-virtual {v2}, Landroid/content/res/Resources;->getDisplayMetrics()Landroid/util/DisplayMetrics;\n\n    move-result-object v2\n\n    iget v0, v2, Landroid/util/DisplayMetrics;->density:F\n\n    .line 386\n    .local v0, \"density\":F\n    const/high16 v2, 0x41a00000\n\n    mul-float/2addr v2, v0\n\n    const/high16 v3, 0x3f000000\n\n    add-float/2addr v2, v3\n\n    float-to-int v2, v2\n\n    iput v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeSize:I\n\n    .line 388\n    invoke-virtual {v1}, Landroid/view/ViewConfiguration;->getScaledTouchSlop()I\n\n    move-result v2\n\n    iput v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    .line 389\n    invoke-virtual {v1}, Landroid/view/ViewConfiguration;->getScaledMaximumFlingVelocity()I\n\n    move-result v2\n\n    int-to-float v2, v2\n\n    iput v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mMaxVelocity:F\n\n    .line 390\n    invoke-virtual {v1}, Landroid/view/ViewConfiguration;->getScaledMinimumFlingVelocity()I\n\n    move-result v2\n\n    int-to-float v2, v2\n\n    iput v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mMinVelocity:F\n\n    .line 391\n    sget-object v2, Landroid/support/v4/widget/ViewDragHelper;->sInterpolator:Landroid/view/animation/Interpolator;\n\n    invoke-static {p1, v2}, Landroid/support/v4/widget/ScrollerCompat;->create(Landroid/content/Context;Landroid/view/animation/Interpolator;)Landroid/support/v4/widget/ScrollerCompat;\n\n    move-result-object v2\n\n    iput-object v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    .line 392\n    return-void\n.end method\n\n.method private checkNewEdgeDrag(FFII)Z\n    .registers 10\n    .param p1, \"delta\"    # F\n    .param p2, \"odelta\"    # F\n    .param p3, \"pointerId\"    # I\n    .param p4, \"edge\"    # I\n\n    .prologue\n    const/4 v2, 0x0\n\n    .line 1218\n    invoke-static {p1}, Ljava/lang/Math;->abs(F)F\n\n    move-result v0\n\n    .line 1219\n    .local v0, \"absDelta\":F\n    invoke-static {p2}, Ljava/lang/Math;->abs(F)F\n\n    move-result v1\n\n    .line 1221\n    .local v1, \"absODelta\":F\n    iget-object v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    aget v3, v3, p3\n\n    and-int/2addr v3, p4\n\n    if-ne v3, p4, :cond_31\n\n    iget v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mTrackingEdges:I\n\n    and-int/2addr v3, p4\n\n    if-eqz v3, :cond_31\n\n    iget-object v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsLocked:[I\n\n    aget v3, v3, p3\n\n    and-int/2addr v3, p4\n\n    if-eq v3, p4, :cond_31\n\n    iget-object v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsInProgress:[I\n\n    aget v3, v3, p3\n\n    and-int/2addr v3, p4\n\n    if-eq v3, p4, :cond_31\n\n    iget v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    int-to-float v3, v3\n\n    cmpg-float v3, v0, v3\n\n    if-gtz v3, :cond_32\n\n    iget v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    int-to-float v3, v3\n\n    cmpg-float v3, v1, v3\n\n    if-gtz v3, :cond_32\n\n    .line 1231\n    :cond_31\n    :goto_31\n    return v2\n\n    .line 1227\n    :cond_32\n    const/high16 v3, 0x3f000000\n\n    mul-float/2addr v3, v1\n\n    cmpg-float v3, v0, v3\n\n    if-gez v3, :cond_49\n\n    iget-object v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    invoke-virtual {v3, p4}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onEdgeLock(I)Z\n\n    move-result v3\n\n    if-eqz v3, :cond_49\n\n    .line 1228\n    iget-object v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsLocked:[I\n\n    aget v4, v3, p3\n\n    or-int/2addr v4, p4\n\n    aput v4, v3, p3\n\n    goto :goto_31\n\n    .line 1231\n    :cond_49\n    iget-object v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsInProgress:[I\n\n    aget v3, v3, p3\n\n    and-int/2addr v3, p4\n\n    if-nez v3, :cond_31\n\n    iget v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    int-to-float v3, v3\n\n    cmpl-float v3, v0, v3\n\n    if-lez v3, :cond_31\n\n    const/4 v2, 0x1\n\n    goto :goto_31\n.end method\n\n.method private checkTouchSlop(Landroid/view/View;FF)Z\n    .registers 11\n    .param p1, \"child\"    # Landroid/view/View;\n    .param p2, \"dx\"    # F\n    .param p3, \"dy\"    # F\n\n    .prologue\n    const/4 v2, 0x1\n\n    const/4 v3, 0x0\n\n    .line 1245\n    if-nez p1, :cond_6\n\n    move v2, v3\n\n    .line 1258\n    :cond_5\n    :goto_5\n    return v2\n\n    .line 1248\n    :cond_6\n    iget-object v4, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    invoke-virtual {v4, p1}, Landroid/support/v4/widget/ViewDragHelper$Callback;->getViewHorizontalDragRange(Landroid/view/View;)I\n\n    move-result v4\n\n    if-lez v4, :cond_2d\n\n    move v0, v2\n\n    .line 1249\n    .local v0, \"checkHorizontal\":Z\n    :goto_f\n    iget-object v4, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    invoke-virtual {v4, p1}, Landroid/support/v4/widget/ViewDragHelper$Callback;->getViewVerticalDragRange(Landroid/view/View;)I\n\n    move-result v4\n\n    if-lez v4, :cond_2f\n\n    move v1, v2\n\n    .line 1251\n    .local v1, \"checkVertical\":Z\n    :goto_18\n    if-eqz v0, :cond_31\n\n    if-eqz v1, :cond_31\n\n    .line 1252\n    mul-float v4, p2, p2\n\n    mul-float v5, p3, p3\n\n    add-float/2addr v4, v5\n\n    iget v5, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    iget v6, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    mul-int/2addr v5, v6\n\n    int-to-float v5, v5\n\n    cmpl-float v4, v4, v5\n\n    if-gtz v4, :cond_5\n\n    move v2, v3\n\n    goto :goto_5\n\n    .end local v0    # \"checkHorizontal\":Z\n    .end local v1    # \"checkVertical\":Z\n    :cond_2d\n    move v0, v3\n\n    .line 1248\n    goto :goto_f\n\n    .restart local v0    # \"checkHorizontal\":Z\n    :cond_2f\n    move v1, v3\n\n    .line 1249\n    goto :goto_18\n\n    .line 1253\n    .restart local v1    # \"checkVertical\":Z\n    :cond_31\n    if-eqz v0, :cond_40\n\n    .line 1254\n    invoke-static {p2}, Ljava/lang/Math;->abs(F)F\n\n    move-result v4\n\n    iget v5, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    int-to-float v5, v5\n\n    cmpl-float v4, v4, v5\n\n    if-gtz v4, :cond_5\n\n    move v2, v3\n\n    goto :goto_5\n\n    .line 1255\n    :cond_40\n    if-eqz v1, :cond_4f\n\n    .line 1256\n    invoke-static {p3}, Ljava/lang/Math;->abs(F)F\n\n    move-result v4\n\n    iget v5, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    int-to-float v5, v5\n\n    cmpl-float v4, v4, v5\n\n    if-gtz v4, :cond_5\n\n    move v2, v3\n\n    goto :goto_5\n\n    :cond_4f\n    move v2, v3\n\n    .line 1258\n    goto :goto_5\n.end method\n\n.method private clampMag(FFF)F\n    .registers 7\n    .param p1, \"value\"    # F\n    .param p2, \"absMin\"    # F\n    .param p3, \"absMax\"    # F\n\n    .prologue\n    const/4 v1, 0x0\n\n    .line 667\n    invoke-static {p1}, Ljava/lang/Math;->abs(F)F\n\n    move-result v0\n\n    .line 668\n    .local v0, \"absValue\":F\n    cmpg-float v2, v0, p2\n\n    if-gez v2, :cond_b\n\n    move p3, v1\n\n    .line 670\n    .end local p3    # \"absMax\":F\n    :cond_a\n    :goto_a\n    return p3\n\n    .line 669\n    .restart local p3    # \"absMax\":F\n    :cond_b\n    cmpl-float v2, v0, p3\n\n    if-lez v2, :cond_15\n\n    cmpl-float v1, p1, v1\n\n    if-gtz v1, :cond_a\n\n    neg-float p3, p3\n\n    goto :goto_a\n\n    :cond_15\n    move p3, p1\n\n    .line 670\n    goto :goto_a\n.end method\n\n.method private clampMag(III)I\n    .registers 5\n    .param p1, \"value\"    # I\n    .param p2, \"absMin\"    # I\n    .param p3, \"absMax\"    # I\n\n    .prologue\n    .line 650\n    invoke-static {p1}, Ljava/lang/Math;->abs(I)I\n\n    move-result v0\n\n    .line 651\n    .local v0, \"absValue\":I\n    if-ge v0, p2, :cond_8\n\n    const/4 p3, 0x0\n\n    .line 653\n    .end local p3    # \"absMax\":I\n    :cond_7\n    :goto_7\n    return p3\n\n    .line 652\n    .restart local p3    # \"absMax\":I\n    :cond_8\n    if-le v0, p3, :cond_e\n\n    if-gtz p1, :cond_7\n\n    neg-int p3, p3\n\n    goto :goto_7\n\n    :cond_e\n    move p3, p1\n\n    .line 653\n    goto :goto_7\n.end method\n\n.method private clearMotionHistory()V\n    .registers 4\n\n    .prologue\n    const/4 v2, 0x0\n\n    const/4 v1, 0x0\n\n    .line 770\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    if-nez v0, :cond_7\n\n    .line 781\n    :goto_6\n    return-void\n\n    .line 773\n    :cond_7\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    invoke-static {v0, v1}, Ljava/util/Arrays;->fill([FF)V\n\n    .line 774\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionY:[F\n\n    invoke-static {v0, v1}, Ljava/util/Arrays;->fill([FF)V\n\n    .line 775\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionX:[F\n\n    invoke-static {v0, v1}, Ljava/util/Arrays;->fill([FF)V\n\n    .line 776\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionY:[F\n\n    invoke-static {v0, v1}, Ljava/util/Arrays;->fill([FF)V\n\n    .line 777\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    invoke-static {v0, v2}, Ljava/util/Arrays;->fill([II)V\n\n    .line 778\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsInProgress:[I\n\n    invoke-static {v0, v2}, Ljava/util/Arrays;->fill([II)V\n\n    .line 779\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsLocked:[I\n\n    invoke-static {v0, v2}, Ljava/util/Arrays;->fill([II)V\n\n    .line 780\n    iput v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mPointersDown:I\n\n    goto :goto_6\n.end method\n\n.method private clearMotionHistory(I)V\n    .registers 5\n    .param p1, \"pointerId\"    # I\n\n    .prologue\n    const/4 v2, 0x0\n\n    const/4 v1, 0x0\n\n    .line 784\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    if-nez v0, :cond_7\n\n    .line 795\n    :goto_6\n    return-void\n\n    .line 787\n    :cond_7\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    aput v1, v0, p1\n\n    .line 788\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionY:[F\n\n    aput v1, v0, p1\n\n    .line 789\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionX:[F\n\n    aput v1, v0, p1\n\n    .line 790\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionY:[F\n\n    aput v1, v0, p1\n\n    .line 791\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    aput v2, v0, p1\n\n    .line 792\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsInProgress:[I\n\n    aput v2, v0, p1\n\n    .line 793\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsLocked:[I\n\n    aput v2, v0, p1\n\n    .line 794\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mPointersDown:I\n\n    const/4 v1, 0x1\n\n    shl-int/2addr v1, p1\n\n    xor-int/lit8 v1, v1, -0x1\n\n    and-int/2addr v0, v1\n\n    iput v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mPointersDown:I\n\n    goto :goto_6\n.end method\n\n.method private computeAxisDuration(III)I\n    .registers 14\n    .param p1, \"delta\"    # I\n    .param p2, \"velocity\"    # I\n    .param p3, \"motionRange\"    # I\n\n    .prologue\n    const/high16 v9, 0x3f800000\n\n    .line 618\n    if-nez p1, :cond_6\n\n    .line 619\n    const/4 v6, 0x0\n\n    .line 636\n    :goto_5\n    return v6\n\n    .line 622\n    :cond_6\n    iget-object v6, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    invoke-virtual {v6}, Landroid/view/ViewGroup;->getWidth()I\n\n    move-result v5\n\n    .line 623\n    .local v5, \"width\":I\n    div-int/lit8 v3, v5, 0x2\n\n    .line 624\n    .local v3, \"halfWidth\":I\n    invoke-static {p1}, Ljava/lang/Math;->abs(I)I\n\n    move-result v6\n\n    int-to-float v6, v6\n\n    int-to-float v7, v5\n\n    div-float/2addr v6, v7\n\n    invoke-static {v9, v6}, Ljava/lang/Math;->min(FF)F\n\n    move-result v1\n\n    .line 625\n    .local v1, \"distanceRatio\":F\n    int-to-float v6, v3\n\n    int-to-float v7, v3\n\n    invoke-direct {p0, v1}, Landroid/support/v4/widget/ViewDragHelper;->distanceInfluenceForSnapDuration(F)F\n\n    move-result v8\n\n    mul-float/2addr v7, v8\n\n    add-float v0, v6, v7\n\n    .line 629\n    .local v0, \"distance\":F\n    invoke-static {p2}, Ljava/lang/Math;->abs(I)I\n\n    move-result p2\n\n    .line 630\n    if-lez p2, :cond_3f\n\n    .line 631\n    const/high16 v6, 0x447a0000\n\n    int-to-float v7, p2\n\n    div-float v7, v0, v7\n\n    invoke-static {v7}, Ljava/lang/Math;->abs(F)F\n\n    move-result v7\n\n    mul-float/2addr v6, v7\n\n    invoke-static {v6}, Ljava/lang/Math;->round(F)I\n\n    move-result v6\n\n    mul-int/lit8 v2, v6, 0x4\n\n    .line 636\n    .local v2, \"duration\":I\n    :goto_38\n    const/16 v6, 0x258\n\n    invoke-static {v2, v6}, Ljava/lang/Math;->min(II)I\n\n    move-result v6\n\n    goto :goto_5\n\n    .line 633\n    .end local v2    # \"duration\":I\n    :cond_3f\n    invoke-static {p1}, Ljava/lang/Math;->abs(I)I\n\n    move-result v6\n\n    int-to-float v6, v6\n\n    int-to-float v7, p3\n\n    div-float v4, v6, v7\n\n    .line 634\n    .local v4, \"range\":F\n    add-float v6, v4, v9\n\n    const/high16 v7, 0x43800000\n\n    mul-float/2addr v6, v7\n\n    float-to-int v2, v6\n\n    .restart local v2    # \"duration\":I\n    goto :goto_38\n.end method\n\n.method private computeSettleDuration(Landroid/view/View;IIII)I\n    .registers 20\n    .param p1, \"child\"    # Landroid/view/View;\n    .param p2, \"dx\"    # I\n    .param p3, \"dy\"    # I\n    .param p4, \"xvel\"    # I\n    .param p5, \"yvel\"    # I\n\n    .prologue\n    .line 597\n    iget v12, p0, Landroid/support/v4/widget/ViewDragHelper;->mMinVelocity:F\n\n    float-to-int v12, v12\n\n    iget v13, p0, Landroid/support/v4/widget/ViewDragHelper;->mMaxVelocity:F\n\n    float-to-int v13, v13\n\n    move/from16 v0, p4\n\n    invoke-direct {p0, v0, v12, v13}, Landroid/support/v4/widget/ViewDragHelper;->clampMag(III)I\n\n    move-result p4\n\n    .line 598\n    iget v12, p0, Landroid/support/v4/widget/ViewDragHelper;->mMinVelocity:F\n\n    float-to-int v12, v12\n\n    iget v13, p0, Landroid/support/v4/widget/ViewDragHelper;->mMaxVelocity:F\n\n    float-to-int v13, v13\n\n    move/from16 v0, p5\n\n    invoke-direct {p0, v0, v12, v13}, Landroid/support/v4/widget/ViewDragHelper;->clampMag(III)I\n\n    move-result p5\n\n    .line 599\n    invoke-static/range {p2 .. p2}, Ljava/lang/Math;->abs(I)I\n\n    move-result v2\n\n    .line 600\n    .local v2, \"absDx\":I\n    invoke-static/range {p3 .. p3}, Ljava/lang/Math;->abs(I)I\n\n    move-result v3\n\n    .line 601\n    .local v3, \"absDy\":I\n    invoke-static/range {p4 .. p4}, Ljava/lang/Math;->abs(I)I\n\n    move-result v4\n\n    .line 602\n    .local v4, \"absXVel\":I\n    invoke-static/range {p5 .. p5}, Ljava/lang/Math;->abs(I)I\n\n    move-result v5\n\n    .line 603\n    .local v5, \"absYVel\":I\n    add-int v7, v4, v5\n\n    .line 604\n    .local v7, \"addedVel\":I\n    add-int v6, v2, v3\n\n    .line 606\n    .local v6, \"addedDistance\":I\n    if-eqz p4, :cond_5b\n\n    int-to-float v12, v4\n\n    int-to-float v13, v7\n\n    div-float v9, v12, v13\n\n    .line 608\n    .local v9, \"xweight\":F\n    :goto_32\n    if-eqz p5, :cond_60\n\n    int-to-float v12, v5\n\n    int-to-float v13, v7\n\n    div-float v11, v12, v13\n\n    .line 611\n    .local v11, \"yweight\":F\n    :goto_38\n    iget-object v12, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    invoke-virtual {v12, p1}, Landroid/support/v4/widget/ViewDragHelper$Callback;->getViewHorizontalDragRange(Landroid/view/View;)I\n\n    move-result v12\n\n    move/from16 v0, p2\n\n    move/from16 v1, p4\n\n    invoke-direct {p0, v0, v1, v12}, Landroid/support/v4/widget/ViewDragHelper;->computeAxisDuration(III)I\n\n    move-result v8\n\n    .line 612\n    .local v8, \"xduration\":I\n    iget-object v12, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    invoke-virtual {v12, p1}, Landroid/support/v4/widget/ViewDragHelper$Callback;->getViewVerticalDragRange(Landroid/view/View;)I\n\n    move-result v12\n\n    move/from16 v0, p3\n\n    move/from16 v1, p5\n\n    invoke-direct {p0, v0, v1, v12}, Landroid/support/v4/widget/ViewDragHelper;->computeAxisDuration(III)I\n\n    move-result v10\n\n    .line 614\n    .local v10, \"yduration\":I\n    int-to-float v12, v8\n\n    mul-float/2addr v12, v9\n\n    int-to-float v13, v10\n\n    mul-float/2addr v13, v11\n\n    add-float/2addr v12, v13\n\n    float-to-int v12, v12\n\n    return v12\n\n    .line 606\n    .end local v8    # \"xduration\":I\n    .end local v9    # \"xweight\":F\n    .end local v10    # \"yduration\":I\n    .end local v11    # \"yweight\":F\n    :cond_5b\n    int-to-float v12, v2\n\n    int-to-float v13, v6\n\n    div-float v9, v12, v13\n\n    goto :goto_32\n\n    .line 608\n    .restart local v9    # \"xweight\":F\n    :cond_60\n    int-to-float v12, v3\n\n    int-to-float v13, v6\n\n    div-float v11, v12, v13\n\n    goto :goto_38\n.end method\n\n.method public static create(Landroid/view/ViewGroup;FLandroid/support/v4/widget/ViewDragHelper$Callback;)Landroid/support/v4/widget/ViewDragHelper;\n    .registers 6\n    .param p0, \"forParent\"    # Landroid/view/ViewGroup;\n    .param p1, \"sensitivity\"    # F\n    .param p2, \"cb\"    # Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    .prologue\n    .line 360\n    invoke-static {p0, p2}, Landroid/support/v4/widget/ViewDragHelper;->create(Landroid/view/ViewGroup;Landroid/support/v4/widget/ViewDragHelper$Callback;)Landroid/support/v4/widget/ViewDragHelper;\n\n    move-result-object v0\n\n    .line 361\n    .local v0, \"helper\":Landroid/support/v4/widget/ViewDragHelper;\n    iget v1, v0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    int-to-float v1, v1\n\n    const/high16 v2, 0x3f800000\n\n    div-float/2addr v2, p1\n\n    mul-float/2addr v1, v2\n\n    float-to-int v1, v1\n\n    iput v1, v0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    .line 362\n    return-object v0\n.end method\n\n.method public static create(Landroid/view/ViewGroup;Landroid/support/v4/widget/ViewDragHelper$Callback;)Landroid/support/v4/widget/ViewDragHelper;\n    .registers 4\n    .param p0, \"forParent\"    # Landroid/view/ViewGroup;\n    .param p1, \"cb\"    # Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    .prologue\n    .line 347\n    new-instance v0, Landroid/support/v4/widget/ViewDragHelper;\n\n    invoke-virtual {p0}, Landroid/view/ViewGroup;->getContext()Landroid/content/Context;\n\n    move-result-object v1\n\n    invoke-direct {v0, v1, p0, p1}, Landroid/support/v4/widget/ViewDragHelper;-><init>(Landroid/content/Context;Landroid/view/ViewGroup;Landroid/support/v4/widget/ViewDragHelper$Callback;)V\n\n    return-object v0\n.end method\n\n.method private dispatchViewReleased(FF)V\n    .registers 7\n    .param p1, \"xvel\"    # F\n    .param p2, \"yvel\"    # F\n\n    .prologue\n    const/4 v3, 0x1\n\n    const/4 v2, 0x0\n\n    .line 759\n    iput-boolean v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mReleaseInProgress:Z\n\n    .line 760\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v0, v1, p1, p2}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onViewReleased(Landroid/view/View;FF)V\n\n    .line 761\n    iput-boolean v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mReleaseInProgress:Z\n\n    .line 763\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    if-ne v0, v3, :cond_14\n\n    .line 765\n    invoke-virtual {p0, v2}, Landroid/support/v4/widget/ViewDragHelper;->setDragState(I)V\n\n    .line 767\n    :cond_14\n    return-void\n.end method\n\n.method private distanceInfluenceForSnapDuration(F)F\n    .registers 6\n    .param p1, \"f\"    # F\n\n    .prologue\n    .line 674\n    const/high16 v0, 0x3f000000\n\n    sub-float/2addr p1, v0\n\n    .line 675\n    float-to-double v0, p1\n\n    const-wide v2, 0x3fde28c7460698c7L\n\n    mul-double/2addr v0, v2\n\n    double-to-float p1, v0\n\n    .line 676\n    float-to-double v0, p1\n\n    invoke-static {v0, v1}, Ljava/lang/Math;->sin(D)D\n\n    move-result-wide v0\n\n    double-to-float v0, v0\n\n    return v0\n.end method\n\n.method private dragTo(IIII)V\n    .registers 13\n    .param p1, \"left\"    # I\n    .param p2, \"top\"    # I\n    .param p3, \"dx\"    # I\n    .param p4, \"dy\"    # I\n\n    .prologue\n    .line 1366\n    move v2, p1\n\n    .line 1367\n    .local v2, \"clampedX\":I\n    move v3, p2\n\n    .line 1368\n    .local v3, \"clampedY\":I\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v0}, Landroid/view/View;->getLeft()I\n\n    move-result v6\n\n    .line 1369\n    .local v6, \"oldLeft\":I\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v0}, Landroid/view/View;->getTop()I\n\n    move-result v7\n\n    .line 1370\n    .local v7, \"oldTop\":I\n    if-eqz p3, :cond_1f\n\n    .line 1371\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v0, v1, p1, p3}, Landroid/support/v4/widget/ViewDragHelper$Callback;->clampViewPositionHorizontal(Landroid/view/View;II)I\n\n    move-result v2\n\n    .line 1372\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    sub-int v1, v2, v6\n\n    invoke-virtual {v0, v1}, Landroid/view/View;->offsetLeftAndRight(I)V\n\n    .line 1374\n    :cond_1f\n    if-eqz p4, :cond_30\n\n    .line 1375\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v0, v1, p2, p4}, Landroid/support/v4/widget/ViewDragHelper$Callback;->clampViewPositionVertical(Landroid/view/View;II)I\n\n    move-result v3\n\n    .line 1376\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    sub-int v1, v3, v7\n\n    invoke-virtual {v0, v1}, Landroid/view/View;->offsetTopAndBottom(I)V\n\n    .line 1379\n    :cond_30\n    if-nez p3, :cond_34\n\n    if-eqz p4, :cond_3f\n\n    .line 1380\n    :cond_34\n    sub-int v4, v2, v6\n\n    .line 1381\n    .local v4, \"clampedDx\":I\n    sub-int v5, v3, v7\n\n    .line 1382\n    .local v5, \"clampedDy\":I\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual/range {v0 .. v5}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onViewPositionChanged(Landroid/view/View;IIII)V\n\n    .line 1385\n    .end local v4    # \"clampedDx\":I\n    .end local v5    # \"clampedDy\":I\n    :cond_3f\n    return-void\n.end method\n\n.method private ensureMotionHistorySizeForId(I)V\n    .registers 12\n    .param p1, \"pointerId\"    # I\n\n    .prologue\n    const/4 v9, 0x0\n\n    .line 798\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    if-eqz v7, :cond_a\n\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    array-length v7, v7\n\n    if-gt v7, p1, :cond_70\n\n    .line 799\n    :cond_a\n    add-int/lit8 v7, p1, 0x1\n\n    new-array v3, v7, [F\n\n    .line 800\n    .local v3, \"imx\":[F\n    add-int/lit8 v7, p1, 0x1\n\n    new-array v4, v7, [F\n\n    .line 801\n    .local v4, \"imy\":[F\n    add-int/lit8 v7, p1, 0x1\n\n    new-array v5, v7, [F\n\n    .line 802\n    .local v5, \"lmx\":[F\n    add-int/lit8 v7, p1, 0x1\n\n    new-array v6, v7, [F\n\n    .line 803\n    .local v6, \"lmy\":[F\n    add-int/lit8 v7, p1, 0x1\n\n    new-array v2, v7, [I\n\n    .line 804\n    .local v2, \"iit\":[I\n    add-int/lit8 v7, p1, 0x1\n\n    new-array v0, v7, [I\n\n    .line 805\n    .local v0, \"edip\":[I\n    add-int/lit8 v7, p1, 0x1\n\n    new-array v1, v7, [I\n\n    .line 807\n    .local v1, \"edl\":[I\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    if-eqz v7, :cond_62\n\n    .line 808\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    iget-object v8, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    array-length v8, v8\n\n    invoke-static {v7, v9, v3, v9, v8}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V\n\n    .line 809\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionY:[F\n\n    iget-object v8, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionY:[F\n\n    array-length v8, v8\n\n    invoke-static {v7, v9, v4, v9, v8}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V\n\n    .line 810\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionX:[F\n\n    iget-object v8, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionX:[F\n\n    array-length v8, v8\n\n    invoke-static {v7, v9, v5, v9, v8}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V\n\n    .line 811\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionY:[F\n\n    iget-object v8, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionY:[F\n\n    array-length v8, v8\n\n    invoke-static {v7, v9, v6, v9, v8}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V\n\n    .line 812\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    iget-object v8, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    array-length v8, v8\n\n    invoke-static {v7, v9, v2, v9, v8}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V\n\n    .line 813\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsInProgress:[I\n\n    iget-object v8, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsInProgress:[I\n\n    array-length v8, v8\n\n    invoke-static {v7, v9, v0, v9, v8}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V\n\n    .line 814\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsLocked:[I\n\n    iget-object v8, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsLocked:[I\n\n    array-length v8, v8\n\n    invoke-static {v7, v9, v1, v9, v8}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V\n\n    .line 817\n    :cond_62\n    iput-object v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    .line 818\n    iput-object v4, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionY:[F\n\n    .line 819\n    iput-object v5, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionX:[F\n\n    .line 820\n    iput-object v6, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionY:[F\n\n    .line 821\n    iput-object v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    .line 822\n    iput-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsInProgress:[I\n\n    .line 823\n    iput-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsLocked:[I\n\n    .line 825\n    .end local v0    # \"edip\":[I\n    .end local v1    # \"edl\":[I\n    .end local v2    # \"iit\":[I\n    .end local v3    # \"imx\":[F\n    .end local v4    # \"imy\":[F\n    .end local v5    # \"lmx\":[F\n    .end local v6    # \"lmy\":[F\n    :cond_70\n    return-void\n.end method\n\n.method private forceSettleCapturedViewAt(IIII)Z\n    .registers 16\n    .param p1, \"finalLeft\"    # I\n    .param p2, \"finalTop\"    # I\n    .param p3, \"xvel\"    # I\n    .param p4, \"yvel\"    # I\n\n    .prologue\n    const/4 v0, 0x0\n\n    .line 577\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v1}, Landroid/view/View;->getLeft()I\n\n    move-result v10\n\n    .line 578\n    .local v10, \"startLeft\":I\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v1}, Landroid/view/View;->getTop()I\n\n    move-result v6\n\n    .line 579\n    .local v6, \"startTop\":I\n    sub-int v2, p1, v10\n\n    .line 580\n    .local v2, \"dx\":I\n    sub-int v3, p2, v6\n\n    .line 582\n    .local v3, \"dy\":I\n    if-nez v2, :cond_1e\n\n    if-nez v3, :cond_1e\n\n    .line 584\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v1}, Landroid/support/v4/widget/ScrollerCompat;->abortAnimation()V\n\n    .line 585\n    invoke-virtual {p0, v0}, Landroid/support/v4/widget/ViewDragHelper;->setDragState(I)V\n\n    .line 593\n    :goto_1d\n    return v0\n\n    .line 589\n    :cond_1e\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    move-object v0, p0\n\n    move v4, p3\n\n    move v5, p4\n\n    invoke-direct/range {v0 .. v5}, Landroid/support/v4/widget/ViewDragHelper;->computeSettleDuration(Landroid/view/View;IIII)I\n\n    move-result v9\n\n    .line 590\n    .local v9, \"duration\":I\n    iget-object v4, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    move v5, v10\n\n    move v7, v2\n\n    move v8, v3\n\n    invoke-virtual/range {v4 .. v9}, Landroid/support/v4/widget/ScrollerCompat;->startScroll(IIIII)V\n\n    .line 592\n    const/4 v0, 0x2\n\n    invoke-virtual {p0, v0}, Landroid/support/v4/widget/ViewDragHelper;->setDragState(I)V\n\n    .line 593\n    const/4 v0, 0x1\n\n    goto :goto_1d\n.end method\n\n.method private getEdgesTouched(II)I\n    .registers 6\n    .param p1, \"x\"    # I\n    .param p2, \"y\"    # I\n\n    .prologue\n    .line 1440\n    const/4 v0, 0x0\n\n    .line 1442\n    .local v0, \"result\":I\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    invoke-virtual {v1}, Landroid/view/ViewGroup;->getLeft()I\n\n    move-result v1\n\n    iget v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeSize:I\n\n    add-int/2addr v1, v2\n\n    if-ge p1, v1, :cond_e\n\n    or-int/lit8 v0, v0, 0x1\n\n    .line 1443\n    :cond_e\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    invoke-virtual {v1}, Landroid/view/ViewGroup;->getTop()I\n\n    move-result v1\n\n    iget v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeSize:I\n\n    add-int/2addr v1, v2\n\n    if-ge p2, v1, :cond_1b\n\n    or-int/lit8 v0, v0, 0x4\n\n    .line 1444\n    :cond_1b\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    invoke-virtual {v1}, Landroid/view/ViewGroup;->getRight()I\n\n    move-result v1\n\n    iget v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeSize:I\n\n    sub-int/2addr v1, v2\n\n    if-le p1, v1, :cond_28\n\n    or-int/lit8 v0, v0, 0x2\n\n    .line 1445\n    :cond_28\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    invoke-virtual {v1}, Landroid/view/ViewGroup;->getBottom()I\n\n    move-result v1\n\n    iget v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeSize:I\n\n    sub-int/2addr v1, v2\n\n    if-le p2, v1, :cond_35\n\n    or-int/lit8 v0, v0, 0x8\n\n    .line 1447\n    :cond_35\n    return v0\n.end method\n\n.method private releaseViewForPointerUp()V\n    .registers 6\n\n    .prologue\n    .line 1355\n    iget-object v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    const/16 v3, 0x3e8\n\n    iget v4, p0, Landroid/support/v4/widget/ViewDragHelper;->mMaxVelocity:F\n\n    invoke-virtual {v2, v3, v4}, Landroid/view/VelocityTracker;->computeCurrentVelocity(IF)V\n\n    .line 1356\n    iget-object v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    iget v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    invoke-static {v2, v3}, Landroid/support/v4/view/VelocityTrackerCompat;->getXVelocity(Landroid/view/VelocityTracker;I)F\n\n    move-result v2\n\n    iget v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mMinVelocity:F\n\n    iget v4, p0, Landroid/support/v4/widget/ViewDragHelper;->mMaxVelocity:F\n\n    invoke-direct {p0, v2, v3, v4}, Landroid/support/v4/widget/ViewDragHelper;->clampMag(FFF)F\n\n    move-result v0\n\n    .line 1359\n    .local v0, \"xvel\":F\n    iget-object v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    iget v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    invoke-static {v2, v3}, Landroid/support/v4/view/VelocityTrackerCompat;->getYVelocity(Landroid/view/VelocityTracker;I)F\n\n    move-result v2\n\n    iget v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mMinVelocity:F\n\n    iget v4, p0, Landroid/support/v4/widget/ViewDragHelper;->mMaxVelocity:F\n\n    invoke-direct {p0, v2, v3, v4}, Landroid/support/v4/widget/ViewDragHelper;->clampMag(FFF)F\n\n    move-result v1\n\n    .line 1362\n    .local v1, \"yvel\":F\n    invoke-direct {p0, v0, v1}, Landroid/support/v4/widget/ViewDragHelper;->dispatchViewReleased(FF)V\n\n    .line 1363\n    return-void\n.end method\n\n.method private reportNewEdgeDrags(FFI)V\n    .registers 7\n    .param p1, \"dx\"    # F\n    .param p2, \"dy\"    # F\n    .param p3, \"pointerId\"    # I\n\n    .prologue\n    .line 1197\n    const/4 v0, 0x0\n\n    .line 1198\n    .local v0, \"dragsStarted\":I\n    const/4 v1, 0x1\n\n    invoke-direct {p0, p1, p2, p3, v1}, Landroid/support/v4/widget/ViewDragHelper;->checkNewEdgeDrag(FFII)Z\n\n    move-result v1\n\n    if-eqz v1, :cond_a\n\n    .line 1199\n    or-int/lit8 v0, v0, 0x1\n\n    .line 1201\n    :cond_a\n    const/4 v1, 0x4\n\n    invoke-direct {p0, p2, p1, p3, v1}, Landroid/support/v4/widget/ViewDragHelper;->checkNewEdgeDrag(FFII)Z\n\n    move-result v1\n\n    if-eqz v1, :cond_13\n\n    .line 1202\n    or-int/lit8 v0, v0, 0x4\n\n    .line 1204\n    :cond_13\n    const/4 v1, 0x2\n\n    invoke-direct {p0, p1, p2, p3, v1}, Landroid/support/v4/widget/ViewDragHelper;->checkNewEdgeDrag(FFII)Z\n\n    move-result v1\n\n    if-eqz v1, :cond_1c\n\n    .line 1205\n    or-int/lit8 v0, v0, 0x2\n\n    .line 1207\n    :cond_1c\n    const/16 v1, 0x8\n\n    invoke-direct {p0, p2, p1, p3, v1}, Landroid/support/v4/widget/ViewDragHelper;->checkNewEdgeDrag(FFII)Z\n\n    move-result v1\n\n    if-eqz v1, :cond_26\n\n    .line 1208\n    or-int/lit8 v0, v0, 0x8\n\n    .line 1211\n    :cond_26\n    if-eqz v0, :cond_34\n\n    .line 1212\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeDragsInProgress:[I\n\n    aget v2, v1, p3\n\n    or-int/2addr v2, v0\n\n    aput v2, v1, p3\n\n    .line 1213\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    invoke-virtual {v1, v0, p3}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onEdgeDragStarted(II)V\n\n    .line 1215\n    :cond_34\n    return-void\n.end method\n\n.method private saveInitialMotion(FFI)V\n    .registers 7\n    .param p1, \"x\"    # F\n    .param p2, \"y\"    # F\n    .param p3, \"pointerId\"    # I\n\n    .prologue\n    .line 828\n    invoke-direct {p0, p3}, Landroid/support/v4/widget/ViewDragHelper;->ensureMotionHistorySizeForId(I)V\n\n    .line 829\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionX:[F\n\n    aput p1, v1, p3\n\n    aput p1, v0, p3\n\n    .line 830\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionY:[F\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionY:[F\n\n    aput p2, v1, p3\n\n    aput p2, v0, p3\n\n    .line 831\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    float-to-int v1, p1\n\n    float-to-int v2, p2\n\n    invoke-direct {p0, v1, v2}, Landroid/support/v4/widget/ViewDragHelper;->getEdgesTouched(II)I\n\n    move-result v1\n\n    aput v1, v0, p3\n\n    .line 832\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mPointersDown:I\n\n    const/4 v1, 0x1\n\n    shl-int/2addr v1, p3\n\n    or-int/2addr v0, v1\n\n    iput v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mPointersDown:I\n\n    .line 833\n    return-void\n.end method\n\n.method private saveLastMotion(Landroid/view/MotionEvent;)V\n    .registers 8\n    .param p1, \"ev\"    # Landroid/view/MotionEvent;\n\n    .prologue\n    .line 836\n    invoke-static {p1}, Landroid/support/v4/view/MotionEventCompat;->getPointerCount(Landroid/view/MotionEvent;)I\n\n    move-result v1\n\n    .line 837\n    .local v1, \"pointerCount\":I\n    const/4 v0, 0x0\n\n    .local v0, \"i\":I\n    :goto_5\n    if-ge v0, v1, :cond_1e\n\n    .line 838\n    invoke-static {p1, v0}, Landroid/support/v4/view/MotionEventCompat;->getPointerId(Landroid/view/MotionEvent;I)I\n\n    move-result v2\n\n    .line 839\n    .local v2, \"pointerId\":I\n    invoke-static {p1, v0}, Landroid/support/v4/view/MotionEventCompat;->getX(Landroid/view/MotionEvent;I)F\n\n    move-result v3\n\n    .line 840\n    .local v3, \"x\":F\n    invoke-static {p1, v0}, Landroid/support/v4/view/MotionEventCompat;->getY(Landroid/view/MotionEvent;I)F\n\n    move-result v4\n\n    .line 841\n    .local v4, \"y\":F\n    iget-object v5, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionX:[F\n\n    aput v3, v5, v2\n\n    .line 842\n    iget-object v5, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionY:[F\n\n    aput v4, v5, v2\n\n    .line 837\n    add-int/lit8 v0, v0, 0x1\n\n    goto :goto_5\n\n    .line 844\n    .end local v2    # \"pointerId\":I\n    .end local v3    # \"x\":F\n    .end local v4    # \"y\":F\n    :cond_1e\n    return-void\n.end method\n\n\n# virtual methods\n.method public abort()V\n    .registers 9\n\n    .prologue\n    .line 512\n    invoke-virtual {p0}, Landroid/support/v4/widget/ViewDragHelper;->cancel()V\n\n    .line 513\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    const/4 v1, 0x2\n\n    if-ne v0, v1, :cond_30\n\n    .line 514\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->getCurrX()I\n\n    move-result v6\n\n    .line 515\n    .local v6, \"oldX\":I\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->getCurrY()I\n\n    move-result v7\n\n    .line 516\n    .local v7, \"oldY\":I\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->abortAnimation()V\n\n    .line 517\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->getCurrX()I\n\n    move-result v2\n\n    .line 518\n    .local v2, \"newX\":I\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->getCurrY()I\n\n    move-result v3\n\n    .line 519\n    .local v3, \"newY\":I\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    sub-int v4, v2, v6\n\n    sub-int v5, v3, v7\n\n    invoke-virtual/range {v0 .. v5}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onViewPositionChanged(Landroid/view/View;IIII)V\n\n    .line 521\n    .end local v2    # \"newX\":I\n    .end local v3    # \"newY\":I\n    .end local v6    # \"oldX\":I\n    .end local v7    # \"oldY\":I\n    :cond_30\n    const/4 v0, 0x0\n\n    invoke-virtual {p0, v0}, Landroid/support/v4/widget/ViewDragHelper;->setDragState(I)V\n\n    .line 522\n    return-void\n.end method\n\n.method protected canScroll(Landroid/view/View;ZIIII)Z\n    .registers 20\n    .param p1, \"v\"    # Landroid/view/View;\n    .param p2, \"checkV\"    # Z\n    .param p3, \"dx\"    # I\n    .param p4, \"dy\"    # I\n    .param p5, \"x\"    # I\n    .param p6, \"y\"    # I\n\n    .prologue\n    .line 908\n    instance-of v1, p1, Landroid/view/ViewGroup;\n\n    if-eqz v1, :cond_5c\n\n    move-object v9, p1\n\n    .line 909\n    check-cast v9, Landroid/view/ViewGroup;\n\n    .line 910\n    .local v9, \"group\":Landroid/view/ViewGroup;\n    invoke-virtual {p1}, Landroid/view/View;->getScrollX()I\n\n    move-result v11\n\n    .line 911\n    .local v11, \"scrollX\":I\n    invoke-virtual {p1}, Landroid/view/View;->getScrollY()I\n\n    move-result v12\n\n    .line 912\n    .local v12, \"scrollY\":I\n    invoke-virtual {v9}, Landroid/view/ViewGroup;->getChildCount()I\n\n    move-result v8\n\n    .line 914\n    .local v8, \"count\":I\n    add-int/lit8 v10, v8, -0x1\n\n    .local v10, \"i\":I\n    :goto_15\n    if-ltz v10, :cond_5c\n\n    .line 917\n    invoke-virtual {v9, v10}, Landroid/view/ViewGroup;->getChildAt(I)Landroid/view/View;\n\n    move-result-object v2\n\n    .line 918\n    .local v2, \"child\":Landroid/view/View;\n    add-int v1, p5, v11\n\n    invoke-virtual {v2}, Landroid/view/View;->getLeft()I\n\n    move-result v3\n\n    if-lt v1, v3, :cond_59\n\n    add-int v1, p5, v11\n\n    invoke-virtual {v2}, Landroid/view/View;->getRight()I\n\n    move-result v3\n\n    if-ge v1, v3, :cond_59\n\n    add-int v1, p6, v12\n\n    invoke-virtual {v2}, Landroid/view/View;->getTop()I\n\n    move-result v3\n\n    if-lt v1, v3, :cond_59\n\n    add-int v1, p6, v12\n\n    invoke-virtual {v2}, Landroid/view/View;->getBottom()I\n\n    move-result v3\n\n    if-ge v1, v3, :cond_59\n\n    const/4 v3, 0x1\n\n    add-int v1, p5, v11\n\n    invoke-virtual {v2}, Landroid/view/View;->getLeft()I\n\n    move-result v4\n\n    sub-int v6, v1, v4\n\n    add-int v1, p6, v12\n\n    invoke-virtual {v2}, Landroid/view/View;->getTop()I\n\n    move-result v4\n\n    sub-int v7, v1, v4\n\n    move-object v1, p0\n\n    move/from16 v4, p3\n\n    move/from16 v5, p4\n\n    invoke-virtual/range {v1 .. v7}, Landroid/support/v4/widget/ViewDragHelper;->canScroll(Landroid/view/View;ZIIII)Z\n\n    move-result v1\n\n    if-eqz v1, :cond_59\n\n    .line 922\n    const/4 v1, 0x1\n\n    .line 927\n    .end local v2    # \"child\":Landroid/view/View;\n    .end local v8    # \"count\":I\n    .end local v9    # \"group\":Landroid/view/ViewGroup;\n    .end local v10    # \"i\":I\n    .end local v11    # \"scrollX\":I\n    .end local v12    # \"scrollY\":I\n    :goto_58\n    return v1\n\n    .line 914\n    .restart local v2    # \"child\":Landroid/view/View;\n    .restart local v8    # \"count\":I\n    .restart local v9    # \"group\":Landroid/view/ViewGroup;\n    .restart local v10    # \"i\":I\n    .restart local v11    # \"scrollX\":I\n    .restart local v12    # \"scrollY\":I\n    :cond_59\n    add-int/lit8 v10, v10, -0x1\n\n    goto :goto_15\n\n    .line 927\n    .end local v2    # \"child\":Landroid/view/View;\n    .end local v8    # \"count\":I\n    .end local v9    # \"group\":Landroid/view/ViewGroup;\n    .end local v10    # \"i\":I\n    .end local v11    # \"scrollX\":I\n    .end local v12    # \"scrollY\":I\n    :cond_5c\n    if-eqz p2, :cond_72\n\n    move/from16 v0, p3\n\n    neg-int v1, v0\n\n    invoke-static {p1, v1}, Landroid/support/v4/view/ViewCompat;->canScrollHorizontally(Landroid/view/View;I)Z\n\n    move-result v1\n\n    if-nez v1, :cond_70\n\n    move/from16 v0, p4\n\n    neg-int v1, v0\n\n    invoke-static {p1, v1}, Landroid/support/v4/view/ViewCompat;->canScrollVertically(Landroid/view/View;I)Z\n\n    move-result v1\n\n    if-eqz v1, :cond_72\n\n    :cond_70\n    const/4 v1, 0x1\n\n    goto :goto_58\n\n    :cond_72\n    const/4 v1, 0x0\n\n    goto :goto_58\n.end method\n\n.method public cancel()V\n    .registers 2\n\n    .prologue\n    .line 498\n    const/4 v0, -0x1\n\n    iput v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    .line 499\n    invoke-direct {p0}, Landroid/support/v4/widget/ViewDragHelper;->clearMotionHistory()V\n\n    .line 501\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    if-eqz v0, :cond_12\n\n    .line 502\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    invoke-virtual {v0}, Landroid/view/VelocityTracker;->recycle()V\n\n    .line 503\n    const/4 v0, 0x0\n\n    iput-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    .line 505\n    :cond_12\n    return-void\n.end method\n\n.method public captureChildView(Landroid/view/View;I)V\n    .registers 6\n    .param p1, \"childView\"    # Landroid/view/View;\n    .param p2, \"activePointerId\"    # I\n\n    .prologue\n    .line 460\n    invoke-virtual {p1}, Landroid/view/View;->getParent()Landroid/view/ViewParent;\n\n    move-result-object v0\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    if-eq v0, v1, :cond_29\n\n    .line 461\n    new-instance v0, Ljava/lang/IllegalArgumentException;\n\n    new-instance v1, Ljava/lang/StringBuilder;\n\n    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V\n\n    const-string v2, \"captureChildView: parameter must be a descendant of the ViewDragHelper\\'s tracked parent view (\"\n\n    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    iget-object v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    const-string v2, \")\"\n\n    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n\n    .line 465\n    :cond_29\n    iput-object p1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    .line 466\n    iput p2, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    .line 467\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    invoke-virtual {v0, p1, p2}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onViewCaptured(Landroid/view/View;I)V\n\n    .line 468\n    const/4 v0, 0x1\n\n    invoke-virtual {p0, v0}, Landroid/support/v4/widget/ViewDragHelper;->setDragState(I)V\n\n    .line 469\n    return-void\n.end method\n\n.method public checkTouchSlop(I)Z\n    .registers 5\n    .param p1, \"directions\"    # I\n\n    .prologue\n    .line 1276\n    iget-object v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    array-length v0, v2\n\n    .line 1277\n    .local v0, \"count\":I\n    const/4 v1, 0x0\n\n    .local v1, \"i\":I\n    :goto_4\n    if-ge v1, v0, :cond_11\n\n    .line 1278\n    invoke-virtual {p0, p1, v1}, Landroid/support/v4/widget/ViewDragHelper;->checkTouchSlop(II)Z\n\n    move-result v2\n\n    if-eqz v2, :cond_e\n\n    .line 1279\n    const/4 v2, 0x1\n\n    .line 1282\n    :goto_d\n    return v2\n\n    .line 1277\n    :cond_e\n    add-int/lit8 v1, v1, 0x1\n\n    goto :goto_4\n\n    .line 1282\n    :cond_11\n    const/4 v2, 0x0\n\n    goto :goto_d\n.end method\n\n.method public checkTouchSlop(II)Z\n    .registers 12\n    .param p1, \"directions\"    # I\n    .param p2, \"pointerId\"    # I\n\n    .prologue\n    const/4 v4, 0x1\n\n    const/4 v5, 0x0\n\n    .line 1301\n    invoke-virtual {p0, p2}, Landroid/support/v4/widget/ViewDragHelper;->isPointerDown(I)Z\n\n    move-result v6\n\n    if-nez v6, :cond_a\n\n    move v4, v5\n\n    .line 1318\n    :cond_9\n    :goto_9\n    return v4\n\n    .line 1305\n    :cond_a\n    and-int/lit8 v6, p1, 0x1\n\n    if-ne v6, v4, :cond_3e\n\n    move v0, v4\n\n    .line 1306\n    .local v0, \"checkHorizontal\":Z\n    :goto_f\n    and-int/lit8 v6, p1, 0x2\n\n    const/4 v7, 0x2\n\n    if-ne v6, v7, :cond_40\n\n    move v1, v4\n\n    .line 1308\n    .local v1, \"checkVertical\":Z\n    :goto_15\n    iget-object v6, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionX:[F\n\n    aget v6, v6, p2\n\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    aget v7, v7, p2\n\n    sub-float v2, v6, v7\n\n    .line 1309\n    .local v2, \"dx\":F\n    iget-object v6, p0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionY:[F\n\n    aget v6, v6, p2\n\n    iget-object v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionY:[F\n\n    aget v7, v7, p2\n\n    sub-float v3, v6, v7\n\n    .line 1311\n    .local v3, \"dy\":F\n    if-eqz v0, :cond_42\n\n    if-eqz v1, :cond_42\n\n    .line 1312\n    mul-float v6, v2, v2\n\n    mul-float v7, v3, v3\n\n    add-float/2addr v6, v7\n\n    iget v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    iget v8, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    mul-int/2addr v7, v8\n\n    int-to-float v7, v7\n\n    cmpl-float v6, v6, v7\n\n    if-gtz v6, :cond_9\n\n    move v4, v5\n\n    goto :goto_9\n\n    .end local v0    # \"checkHorizontal\":Z\n    .end local v1    # \"checkVertical\":Z\n    .end local v2    # \"dx\":F\n    .end local v3    # \"dy\":F\n    :cond_3e\n    move v0, v5\n\n    .line 1305\n    goto :goto_f\n\n    .restart local v0    # \"checkHorizontal\":Z\n    :cond_40\n    move v1, v5\n\n    .line 1306\n    goto :goto_15\n\n    .line 1313\n    .restart local v1    # \"checkVertical\":Z\n    .restart local v2    # \"dx\":F\n    .restart local v3    # \"dy\":F\n    :cond_42\n    if-eqz v0, :cond_51\n\n    .line 1314\n    invoke-static {v2}, Ljava/lang/Math;->abs(F)F\n\n    move-result v6\n\n    iget v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    int-to-float v7, v7\n\n    cmpl-float v6, v6, v7\n\n    if-gtz v6, :cond_9\n\n    move v4, v5\n\n    goto :goto_9\n\n    .line 1315\n    :cond_51\n    if-eqz v1, :cond_60\n\n    .line 1316\n    invoke-static {v3}, Ljava/lang/Math;->abs(F)F\n\n    move-result v6\n\n    iget v7, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    int-to-float v7, v7\n\n    cmpl-float v6, v6, v7\n\n    if-gtz v6, :cond_9\n\n    move v4, v5\n\n    goto :goto_9\n\n    :cond_60\n    move v4, v5\n\n    .line 1318\n    goto :goto_9\n.end method\n\n.method public continueSettling(Z)Z\n    .registers 11\n    .param p1, \"deferCallbacks\"    # Z\n\n    .prologue\n    const/4 v8, 0x2\n\n    const/4 v7, 0x0\n\n    .line 715\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    if-ne v0, v8, :cond_69\n\n    .line 716\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->computeScrollOffset()Z\n\n    move-result v6\n\n    .line 717\n    .local v6, \"keepGoing\":Z\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->getCurrX()I\n\n    move-result v2\n\n    .line 718\n    .local v2, \"x\":I\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->getCurrY()I\n\n    move-result v3\n\n    .line 719\n    .local v3, \"y\":I\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v0}, Landroid/view/View;->getLeft()I\n\n    move-result v0\n\n    sub-int v4, v2, v0\n\n    .line 720\n    .local v4, \"dx\":I\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v0}, Landroid/view/View;->getTop()I\n\n    move-result v0\n\n    sub-int v5, v3, v0\n\n    .line 722\n    .local v5, \"dy\":I\n    if-eqz v4, :cond_2f\n\n    .line 723\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v0, v4}, Landroid/view/View;->offsetLeftAndRight(I)V\n\n    .line 725\n    :cond_2f\n    if-eqz v5, :cond_36\n\n    .line 726\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v0, v5}, Landroid/view/View;->offsetTopAndBottom(I)V\n\n    .line 729\n    :cond_36\n    if-nez v4, :cond_3a\n\n    if-eqz v5, :cond_41\n\n    .line 730\n    :cond_3a\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual/range {v0 .. v5}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onViewPositionChanged(Landroid/view/View;IIII)V\n\n    .line 733\n    :cond_41\n    if-eqz v6, :cond_5e\n\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->getFinalX()I\n\n    move-result v0\n\n    if-ne v2, v0, :cond_5e\n\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->getFinalY()I\n\n    move-result v0\n\n    if-ne v3, v0, :cond_5e\n\n    .line 736\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->abortAnimation()V\n\n    .line 737\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    invoke-virtual {v0}, Landroid/support/v4/widget/ScrollerCompat;->isFinished()Z\n\n    move-result v6\n\n    .line 740\n    :cond_5e\n    if-nez v6, :cond_69\n\n    .line 741\n    if-eqz p1, :cond_6f\n\n    .line 742\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mSetIdleRunnable:Ljava/lang/Runnable;\n\n    invoke-virtual {v0, v1}, Landroid/view/ViewGroup;->post(Ljava/lang/Runnable;)Z\n\n    .line 749\n    .end local v2    # \"x\":I\n    .end local v3    # \"y\":I\n    .end local v4    # \"dx\":I\n    .end local v5    # \"dy\":I\n    .end local v6    # \"keepGoing\":Z\n    :cond_69\n    :goto_69\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    if-ne v0, v8, :cond_73\n\n    const/4 v0, 0x1\n\n    :goto_6e\n    return v0\n\n    .line 744\n    .restart local v2    # \"x\":I\n    .restart local v3    # \"y\":I\n    .restart local v4    # \"dx\":I\n    .restart local v5    # \"dy\":I\n    .restart local v6    # \"keepGoing\":Z\n    :cond_6f\n    invoke-virtual {p0, v7}, Landroid/support/v4/widget/ViewDragHelper;->setDragState(I)V\n\n    goto :goto_69\n\n    .end local v2    # \"x\":I\n    .end local v3    # \"y\":I\n    .end local v4    # \"dx\":I\n    .end local v5    # \"dy\":I\n    .end local v6    # \"keepGoing\":Z\n    :cond_73\n    move v0, v7\n\n    .line 749\n    goto :goto_6e\n.end method\n\n.method public findTopChildUnder(II)Landroid/view/View;\n    .registers 8\n    .param p1, \"x\"    # I\n    .param p2, \"y\"    # I\n\n    .prologue\n    .line 1428\n    iget-object v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    invoke-virtual {v3}, Landroid/view/ViewGroup;->getChildCount()I\n\n    move-result v1\n\n    .line 1429\n    .local v1, \"childCount\":I\n    add-int/lit8 v2, v1, -0x1\n\n    .local v2, \"i\":I\n    :goto_8\n    if-ltz v2, :cond_32\n\n    .line 1430\n    iget-object v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mParentView:Landroid/view/ViewGroup;\n\n    iget-object v4, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    invoke-virtual {v4, v2}, Landroid/support/v4/widget/ViewDragHelper$Callback;->getOrderedChildIndex(I)I\n\n    move-result v4\n\n    invoke-virtual {v3, v4}, Landroid/view/ViewGroup;->getChildAt(I)Landroid/view/View;\n\n    move-result-object v0\n\n    .line 1431\n    .local v0, \"child\":Landroid/view/View;\n    invoke-virtual {v0}, Landroid/view/View;->getLeft()I\n\n    move-result v3\n\n    if-lt p1, v3, :cond_2f\n\n    invoke-virtual {v0}, Landroid/view/View;->getRight()I\n\n    move-result v3\n\n    if-ge p1, v3, :cond_2f\n\n    invoke-virtual {v0}, Landroid/view/View;->getTop()I\n\n    move-result v3\n\n    if-lt p2, v3, :cond_2f\n\n    invoke-virtual {v0}, Landroid/view/View;->getBottom()I\n\n    move-result v3\n\n    if-ge p2, v3, :cond_2f\n\n    .line 1436\n    .end local v0    # \"child\":Landroid/view/View;\n    :goto_2e\n    return-object v0\n\n    .line 1429\n    .restart local v0    # \"child\":Landroid/view/View;\n    :cond_2f\n    add-int/lit8 v2, v2, -0x1\n\n    goto :goto_8\n\n    .line 1436\n    .end local v0    # \"child\":Landroid/view/View;\n    :cond_32\n    const/4 v0, 0x0\n\n    goto :goto_2e\n.end method\n\n.method public flingCapturedView(IIII)V\n    .registers 14\n    .param p1, \"minLeft\"    # I\n    .param p2, \"minTop\"    # I\n    .param p3, \"maxLeft\"    # I\n    .param p4, \"maxTop\"    # I\n\n    .prologue\n    .line 690\n    iget-boolean v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mReleaseInProgress:Z\n\n    if-nez v0, :cond_c\n\n    .line 691\n    new-instance v0, Ljava/lang/IllegalStateException;\n\n    const-string v1, \"Cannot flingCapturedView outside of a call to Callback#onViewReleased\"\n\n    invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n\n    .line 695\n    :cond_c\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mScroller:Landroid/support/v4/widget/ScrollerCompat;\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v1}, Landroid/view/View;->getLeft()I\n\n    move-result v1\n\n    iget-object v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {v2}, Landroid/view/View;->getTop()I\n\n    move-result v2\n\n    iget-object v3, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    iget v4, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    invoke-static {v3, v4}, Landroid/support/v4/view/VelocityTrackerCompat;->getXVelocity(Landroid/view/VelocityTracker;I)F\n\n    move-result v3\n\n    float-to-int v3, v3\n\n    iget-object v4, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    iget v5, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    invoke-static {v4, v5}, Landroid/support/v4/view/VelocityTrackerCompat;->getYVelocity(Landroid/view/VelocityTracker;I)F\n\n    move-result v4\n\n    float-to-int v4, v4\n\n    move v5, p1\n\n    move v6, p3\n\n    move v7, p2\n\n    move v8, p4\n\n    invoke-virtual/range {v0 .. v8}, Landroid/support/v4/widget/ScrollerCompat;->fling(IIIIIIII)V\n\n    .line 700\n    const/4 v0, 0x2\n\n    invoke-virtual {p0, v0}, Landroid/support/v4/widget/ViewDragHelper;->setDragState(I)V\n\n    .line 701\n    return-void\n.end method\n\n.method public getActivePointerId()I\n    .registers 2\n\n    .prologue\n    .line 483\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    return v0\n.end method\n\n.method public getCapturedView()Landroid/view/View;\n    .registers 2\n\n    .prologue\n    .line 475\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    return-object v0\n.end method\n\n.method public getEdgeSize()I\n    .registers 2\n\n    .prologue\n    .line 448\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mEdgeSize:I\n\n    return v0\n.end method\n\n.method public getMinVelocity()F\n    .registers 2\n\n    .prologue\n    .line 412\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mMinVelocity:F\n\n    return v0\n.end method\n\n.method public getTouchSlop()I\n    .registers 2\n\n    .prologue\n    .line 490\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mTouchSlop:I\n\n    return v0\n.end method\n\n.method public getViewDragState()I\n    .registers 2\n\n    .prologue\n    .line 421\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    return v0\n.end method\n\n.method public isCapturedViewUnder(II)Z\n    .registers 4\n    .param p1, \"x\"    # I\n    .param p2, \"y\"    # I\n\n    .prologue\n    .line 1397\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    invoke-virtual {p0, v0, p1, p2}, Landroid/support/v4/widget/ViewDragHelper;->isViewUnder(Landroid/view/View;II)Z\n\n    move-result v0\n\n    return v0\n.end method\n\n.method public isEdgeTouched(I)Z\n    .registers 5\n    .param p1, \"edges\"    # I\n\n    .prologue\n    .line 1331\n    iget-object v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    array-length v0, v2\n\n    .line 1332\n    .local v0, \"count\":I\n    const/4 v1, 0x0\n\n    .local v1, \"i\":I\n    :goto_4\n    if-ge v1, v0, :cond_11\n\n    .line 1333\n    invoke-virtual {p0, p1, v1}, Landroid/support/v4/widget/ViewDragHelper;->isEdgeTouched(II)Z\n\n    move-result v2\n\n    if-eqz v2, :cond_e\n\n    .line 1334\n    const/4 v2, 0x1\n\n    .line 1337\n    :goto_d\n    return v2\n\n    .line 1332\n    :cond_e\n    add-int/lit8 v1, v1, 0x1\n\n    goto :goto_4\n\n    .line 1337\n    :cond_11\n    const/4 v2, 0x0\n\n    goto :goto_d\n.end method\n\n.method public isEdgeTouched(II)Z\n    .registers 4\n    .param p1, \"edges\"    # I\n    .param p2, \"pointerId\"    # I\n\n    .prologue\n    .line 1351\n    invoke-virtual {p0, p2}, Landroid/support/v4/widget/ViewDragHelper;->isPointerDown(I)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_f\n\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    aget v0, v0, p2\n\n    and-int/2addr v0, p1\n\n    if-eqz v0, :cond_f\n\n    const/4 v0, 0x1\n\n    :goto_e\n    return v0\n\n    :cond_f\n    const/4 v0, 0x0\n\n    goto :goto_e\n.end method\n\n.method public isPointerDown(I)Z\n    .registers 5\n    .param p1, \"pointerId\"    # I\n\n    .prologue\n    const/4 v0, 0x1\n\n    .line 860\n    iget v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mPointersDown:I\n\n    shl-int v2, v0, p1\n\n    and-int/2addr v1, v2\n\n    if-eqz v1, :cond_9\n\n    :goto_8\n    return v0\n\n    :cond_9\n    const/4 v0, 0x0\n\n    goto :goto_8\n.end method\n\n.method public isViewUnder(Landroid/view/View;II)Z\n    .registers 6\n    .param p1, \"view\"    # Landroid/view/View;\n    .param p2, \"x\"    # I\n    .param p3, \"y\"    # I\n\n    .prologue\n    const/4 v0, 0x0\n\n    .line 1410\n    if-nez p1, :cond_4\n\n    .line 1413\n    :cond_3\n    :goto_3\n    return v0\n\n    :cond_4\n    invoke-virtual {p1}, Landroid/view/View;->getLeft()I\n\n    move-result v1\n\n    if-lt p2, v1, :cond_3\n\n    invoke-virtual {p1}, Landroid/view/View;->getRight()I\n\n    move-result v1\n\n    if-ge p2, v1, :cond_3\n\n    invoke-virtual {p1}, Landroid/view/View;->getTop()I\n\n    move-result v1\n\n    if-lt p3, v1, :cond_3\n\n    invoke-virtual {p1}, Landroid/view/View;->getBottom()I\n\n    move-result v1\n\n    if-ge p3, v1, :cond_3\n\n    const/4 v0, 0x1\n\n    goto :goto_3\n.end method\n\n.method public processTouchEvent(Landroid/view/MotionEvent;)V\n    .registers 23\n    .param p1, \"ev\"    # Landroid/view/MotionEvent;\n\n    .prologue\n    .line 1046\n    invoke-static/range {p1 .. p1}, Landroid/support/v4/view/MotionEventCompat;->getActionMasked(Landroid/view/MotionEvent;)I\n\n    move-result v3\n\n    .line 1047\n    .local v3, \"action\":I\n    invoke-static/range {p1 .. p1}, Landroid/support/v4/view/MotionEventCompat;->getActionIndex(Landroid/view/MotionEvent;)I\n\n    move-result v4\n\n    .line 1049\n    .local v4, \"actionIndex\":I\n    if-nez v3, :cond_d\n\n    .line 1052\n    invoke-virtual/range {p0 .. p0}, Landroid/support/v4/widget/ViewDragHelper;->cancel()V\n\n    .line 1055\n    :cond_d\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    move-object/from16 v19, v0\n\n    if-nez v19, :cond_1f\n\n    .line 1056\n    invoke-static {}, Landroid/view/VelocityTracker;->obtain()Landroid/view/VelocityTracker;\n\n    move-result-object v19\n\n    move-object/from16 v0, v19\n\n    move-object/from16 v1, p0\n\n    iput-object v0, v1, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    .line 1058\n    :cond_1f\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    move-object/from16 v19, v0\n\n    move-object/from16 v0, v19\n\n    move-object/from16 v1, p1\n\n    invoke-virtual {v0, v1}, Landroid/view/VelocityTracker;->addMovement(Landroid/view/MotionEvent;)V\n\n    .line 1060\n    packed-switch v3, :pswitch_data_2be\n\n    .line 1194\n    :cond_2f\n    :goto_2f\n    :pswitch_2f\n    return-void\n\n    .line 1062\n    :pswitch_30\n    invoke-virtual/range {p1 .. p1}, Landroid/view/MotionEvent;->getX()F\n\n    move-result v17\n\n    .line 1063\n    .local v17, \"x\":F\n    invoke-virtual/range {p1 .. p1}, Landroid/view/MotionEvent;->getY()F\n\n    move-result v18\n\n    .line 1064\n    .local v18, \"y\":F\n    const/16 v19, 0x0\n\n    move-object/from16 v0, p1\n\n    move/from16 v1, v19\n\n    invoke-static {v0, v1}, Landroid/support/v4/view/MotionEventCompat;->getPointerId(Landroid/view/MotionEvent;I)I\n\n    move-result v15\n\n    .line 1065\n    .local v15, \"pointerId\":I\n    move/from16 v0, v17\n\n    float-to-int v0, v0\n\n    move/from16 v19, v0\n\n    move/from16 v0, v18\n\n    float-to-int v0, v0\n\n    move/from16 v20, v0\n\n    move-object/from16 v0, p0\n\n    move/from16 v1, v19\n\n    move/from16 v2, v20\n\n    invoke-virtual {v0, v1, v2}, Landroid/support/v4/widget/ViewDragHelper;->findTopChildUnder(II)Landroid/view/View;\n\n    move-result-object v16\n\n    .line 1067\n    .local v16, \"toCapture\":Landroid/view/View;\n    move-object/from16 v0, p0\n\n    move/from16 v1, v17\n\n    move/from16 v2, v18\n\n    invoke-direct {v0, v1, v2, v15}, Landroid/support/v4/widget/ViewDragHelper;->saveInitialMotion(FFI)V\n\n    .line 1072\n    move-object/from16 v0, p0\n\n    move-object/from16 v1, v16\n\n    invoke-virtual {v0, v1, v15}, Landroid/support/v4/widget/ViewDragHelper;->tryCaptureViewForDrag(Landroid/view/View;I)Z\n\n    .line 1074\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    move-object/from16 v19, v0\n\n    aget v7, v19, v15\n\n    .line 1075\n    .local v7, \"edgesTouched\":I\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mTrackingEdges:I\n\n    move/from16 v19, v0\n\n    and-int v19, v19, v7\n\n    if-eqz v19, :cond_2f\n\n    .line 1076\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    move-object/from16 v19, v0\n\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mTrackingEdges:I\n\n    move/from16 v20, v0\n\n    and-int v20, v20, v7\n\n    move-object/from16 v0, v19\n\n    move/from16 v1, v20\n\n    invoke-virtual {v0, v1, v15}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onEdgeTouched(II)V\n\n    goto :goto_2f\n\n    .line 1082\n    .end local v7    # \"edgesTouched\":I\n    .end local v15    # \"pointerId\":I\n    .end local v16    # \"toCapture\":Landroid/view/View;\n    .end local v17    # \"x\":F\n    .end local v18    # \"y\":F\n    :pswitch_8e\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v4}, Landroid/support/v4/view/MotionEventCompat;->getPointerId(Landroid/view/MotionEvent;I)I\n\n    move-result v15\n\n    .line 1083\n    .restart local v15    # \"pointerId\":I\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v4}, Landroid/support/v4/view/MotionEventCompat;->getX(Landroid/view/MotionEvent;I)F\n\n    move-result v17\n\n    .line 1084\n    .restart local v17    # \"x\":F\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v4}, Landroid/support/v4/view/MotionEventCompat;->getY(Landroid/view/MotionEvent;I)F\n\n    move-result v18\n\n    .line 1086\n    .restart local v18    # \"y\":F\n    move-object/from16 v0, p0\n\n    move/from16 v1, v17\n\n    move/from16 v2, v18\n\n    invoke-direct {v0, v1, v2, v15}, Landroid/support/v4/widget/ViewDragHelper;->saveInitialMotion(FFI)V\n\n    .line 1089\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    move/from16 v19, v0\n\n    if-nez v19, :cond_f5\n\n    .line 1092\n    move/from16 v0, v17\n\n    float-to-int v0, v0\n\n    move/from16 v19, v0\n\n    move/from16 v0, v18\n\n    float-to-int v0, v0\n\n    move/from16 v20, v0\n\n    move-object/from16 v0, p0\n\n    move/from16 v1, v19\n\n    move/from16 v2, v20\n\n    invoke-virtual {v0, v1, v2}, Landroid/support/v4/widget/ViewDragHelper;->findTopChildUnder(II)Landroid/view/View;\n\n    move-result-object v16\n\n    .line 1093\n    .restart local v16    # \"toCapture\":Landroid/view/View;\n    move-object/from16 v0, p0\n\n    move-object/from16 v1, v16\n\n    invoke-virtual {v0, v1, v15}, Landroid/support/v4/widget/ViewDragHelper;->tryCaptureViewForDrag(Landroid/view/View;I)Z\n\n    .line 1095\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    move-object/from16 v19, v0\n\n    aget v7, v19, v15\n\n    .line 1096\n    .restart local v7    # \"edgesTouched\":I\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mTrackingEdges:I\n\n    move/from16 v19, v0\n\n    and-int v19, v19, v7\n\n    if-eqz v19, :cond_2f\n\n    .line 1097\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    move-object/from16 v19, v0\n\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mTrackingEdges:I\n\n    move/from16 v20, v0\n\n    and-int v20, v20, v7\n\n    move-object/from16 v0, v19\n\n    move/from16 v1, v20\n\n    invoke-virtual {v0, v1, v15}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onEdgeTouched(II)V\n\n    goto/16 :goto_2f\n\n    .line 1099\n    .end local v7    # \"edgesTouched\":I\n    .end local v16    # \"toCapture\":Landroid/view/View;\n    :cond_f5\n    move/from16 v0, v17\n\n    float-to-int v0, v0\n\n    move/from16 v19, v0\n\n    move/from16 v0, v18\n\n    float-to-int v0, v0\n\n    move/from16 v20, v0\n\n    move-object/from16 v0, p0\n\n    move/from16 v1, v19\n\n    move/from16 v2, v20\n\n    invoke-virtual {v0, v1, v2}, Landroid/support/v4/widget/ViewDragHelper;->isCapturedViewUnder(II)Z\n\n    move-result v19\n\n    if-eqz v19, :cond_2f\n\n    .line 1104\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    move-object/from16 v19, v0\n\n    move-object/from16 v0, p0\n\n    move-object/from16 v1, v19\n\n    invoke-virtual {v0, v1, v15}, Landroid/support/v4/widget/ViewDragHelper;->tryCaptureViewForDrag(Landroid/view/View;I)Z\n\n    goto/16 :goto_2f\n\n    .line 1110\n    .end local v15    # \"pointerId\":I\n    .end local v17    # \"x\":F\n    .end local v18    # \"y\":F\n    :pswitch_11a\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    move/from16 v19, v0\n\n    const/16 v20, 0x1\n\n    move/from16 v0, v19\n\n    move/from16 v1, v20\n\n    if-ne v0, v1, :cond_18e\n\n    .line 1111\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    move/from16 v19, v0\n\n    move-object/from16 v0, p1\n\n    move/from16 v1, v19\n\n    invoke-static {v0, v1}, Landroid/support/v4/view/MotionEventCompat;->findPointerIndex(Landroid/view/MotionEvent;I)I\n\n    move-result v12\n\n    .line 1112\n    .local v12, \"index\":I\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v12}, Landroid/support/v4/view/MotionEventCompat;->getX(Landroid/view/MotionEvent;I)F\n\n    move-result v17\n\n    .line 1113\n    .restart local v17    # \"x\":F\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v12}, Landroid/support/v4/view/MotionEventCompat;->getY(Landroid/view/MotionEvent;I)F\n\n    move-result v18\n\n    .line 1114\n    .restart local v18    # \"y\":F\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionX:[F\n\n    move-object/from16 v19, v0\n\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    move/from16 v20, v0\n\n    aget v19, v19, v20\n\n    sub-float v19, v17, v19\n\n    move/from16 v0, v19\n\n    float-to-int v10, v0\n\n    .line 1115\n    .local v10, \"idx\":I\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mLastMotionY:[F\n\n    move-object/from16 v19, v0\n\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    move/from16 v20, v0\n\n    aget v19, v19, v20\n\n    sub-float v19, v18, v19\n\n    move/from16 v0, v19\n\n    float-to-int v11, v0\n\n    .line 1117\n    .local v11, \"idy\":I\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    move-object/from16 v19, v0\n\n    invoke-virtual/range {v19 .. v19}, Landroid/view/View;->getLeft()I\n\n    move-result v19\n\n    add-int v19, v19, v10\n\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    move-object/from16 v20, v0\n\n    invoke-virtual/range {v20 .. v20}, Landroid/view/View;->getTop()I\n\n    move-result v20\n\n    add-int v20, v20, v11\n\n    move-object/from16 v0, p0\n\n    move/from16 v1, v19\n\n    move/from16 v2, v20\n\n    invoke-direct {v0, v1, v2, v10, v11}, Landroid/support/v4/widget/ViewDragHelper;->dragTo(IIII)V\n\n    .line 1119\n    invoke-direct/range {p0 .. p1}, Landroid/support/v4/widget/ViewDragHelper;->saveLastMotion(Landroid/view/MotionEvent;)V\n\n    goto/16 :goto_2f\n\n    .line 1122\n    .end local v10    # \"idx\":I\n    .end local v11    # \"idy\":I\n    .end local v12    # \"index\":I\n    .end local v17    # \"x\":F\n    .end local v18    # \"y\":F\n    :cond_18e\n    invoke-static/range {p1 .. p1}, Landroid/support/v4/view/MotionEventCompat;->getPointerCount(Landroid/view/MotionEvent;)I\n\n    move-result v14\n\n    .line 1123\n    .local v14, \"pointerCount\":I\n    const/4 v8, 0x0\n\n    .local v8, \"i\":I\n    :goto_193\n    if-ge v8, v14, :cond_1ce\n\n    .line 1124\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v8}, Landroid/support/v4/view/MotionEventCompat;->getPointerId(Landroid/view/MotionEvent;I)I\n\n    move-result v15\n\n    .line 1125\n    .restart local v15    # \"pointerId\":I\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v8}, Landroid/support/v4/view/MotionEventCompat;->getX(Landroid/view/MotionEvent;I)F\n\n    move-result v17\n\n    .line 1126\n    .restart local v17    # \"x\":F\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v8}, Landroid/support/v4/view/MotionEventCompat;->getY(Landroid/view/MotionEvent;I)F\n\n    move-result v18\n\n    .line 1127\n    .restart local v18    # \"y\":F\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    move-object/from16 v19, v0\n\n    aget v19, v19, v15\n\n    sub-float v5, v17, v19\n\n    .line 1128\n    .local v5, \"dx\":F\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionY:[F\n\n    move-object/from16 v19, v0\n\n    aget v19, v19, v15\n\n    sub-float v6, v18, v19\n\n    .line 1130\n    .local v6, \"dy\":F\n    move-object/from16 v0, p0\n\n    invoke-direct {v0, v5, v6, v15}, Landroid/support/v4/widget/ViewDragHelper;->reportNewEdgeDrags(FFI)V\n\n    .line 1131\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    move/from16 v19, v0\n\n    const/16 v20, 0x1\n\n    move/from16 v0, v19\n\n    move/from16 v1, v20\n\n    if-ne v0, v1, :cond_1d3\n\n    .line 1142\n    .end local v5    # \"dx\":F\n    .end local v6    # \"dy\":F\n    .end local v15    # \"pointerId\":I\n    .end local v17    # \"x\":F\n    .end local v18    # \"y\":F\n    :cond_1ce\n    invoke-direct/range {p0 .. p1}, Landroid/support/v4/widget/ViewDragHelper;->saveLastMotion(Landroid/view/MotionEvent;)V\n\n    goto/16 :goto_2f\n\n    .line 1136\n    .restart local v5    # \"dx\":F\n    .restart local v6    # \"dy\":F\n    .restart local v15    # \"pointerId\":I\n    .restart local v17    # \"x\":F\n    .restart local v18    # \"y\":F\n    :cond_1d3\n    move/from16 v0, v17\n\n    float-to-int v0, v0\n\n    move/from16 v19, v0\n\n    move/from16 v0, v18\n\n    float-to-int v0, v0\n\n    move/from16 v20, v0\n\n    move-object/from16 v0, p0\n\n    move/from16 v1, v19\n\n    move/from16 v2, v20\n\n    invoke-virtual {v0, v1, v2}, Landroid/support/v4/widget/ViewDragHelper;->findTopChildUnder(II)Landroid/view/View;\n\n    move-result-object v16\n\n    .line 1137\n    .restart local v16    # \"toCapture\":Landroid/view/View;\n    move-object/from16 v0, p0\n\n    move-object/from16 v1, v16\n\n    invoke-direct {v0, v1, v5, v6}, Landroid/support/v4/widget/ViewDragHelper;->checkTouchSlop(Landroid/view/View;FF)Z\n\n    move-result v19\n\n    if-eqz v19, :cond_1fb\n\n    move-object/from16 v0, p0\n\n    move-object/from16 v1, v16\n\n    invoke-virtual {v0, v1, v15}, Landroid/support/v4/widget/ViewDragHelper;->tryCaptureViewForDrag(Landroid/view/View;I)Z\n\n    move-result v19\n\n    if-nez v19, :cond_1ce\n\n    .line 1123\n    :cond_1fb\n    add-int/lit8 v8, v8, 0x1\n\n    goto :goto_193\n\n    .line 1148\n    .end local v5    # \"dx\":F\n    .end local v6    # \"dy\":F\n    .end local v8    # \"i\":I\n    .end local v14    # \"pointerCount\":I\n    .end local v15    # \"pointerId\":I\n    .end local v16    # \"toCapture\":Landroid/view/View;\n    .end local v17    # \"x\":F\n    .end local v18    # \"y\":F\n    :pswitch_1fe\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v4}, Landroid/support/v4/view/MotionEventCompat;->getPointerId(Landroid/view/MotionEvent;I)I\n\n    move-result v15\n\n    .line 1149\n    .restart local v15    # \"pointerId\":I\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    move/from16 v19, v0\n\n    const/16 v20, 0x1\n\n    move/from16 v0, v19\n\n    move/from16 v1, v20\n\n    if-ne v0, v1, :cond_280\n\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    move/from16 v19, v0\n\n    move/from16 v0, v19\n\n    if-ne v15, v0, :cond_280\n\n    .line 1151\n    const/4 v13, -0x1\n\n    .line 1152\n    .local v13, \"newActivePointer\":I\n    invoke-static/range {p1 .. p1}, Landroid/support/v4/view/MotionEventCompat;->getPointerCount(Landroid/view/MotionEvent;)I\n\n    move-result v14\n\n    .line 1153\n    .restart local v14    # \"pointerCount\":I\n    const/4 v8, 0x0\n\n    .restart local v8    # \"i\":I\n    :goto_222\n    if-ge v8, v14, :cond_277\n\n    .line 1154\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v8}, Landroid/support/v4/view/MotionEventCompat;->getPointerId(Landroid/view/MotionEvent;I)I\n\n    move-result v9\n\n    .line 1155\n    .local v9, \"id\":I\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    move/from16 v19, v0\n\n    move/from16 v0, v19\n\n    if-ne v9, v0, :cond_237\n\n    .line 1153\n    :cond_234\n    add-int/lit8 v8, v8, 0x1\n\n    goto :goto_222\n\n    .line 1160\n    :cond_237\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v8}, Landroid/support/v4/view/MotionEventCompat;->getX(Landroid/view/MotionEvent;I)F\n\n    move-result v17\n\n    .line 1161\n    .restart local v17    # \"x\":F\n    move-object/from16 v0, p1\n\n    invoke-static {v0, v8}, Landroid/support/v4/view/MotionEventCompat;->getY(Landroid/view/MotionEvent;I)F\n\n    move-result v18\n\n    .line 1162\n    .restart local v18    # \"y\":F\n    move/from16 v0, v17\n\n    float-to-int v0, v0\n\n    move/from16 v19, v0\n\n    move/from16 v0, v18\n\n    float-to-int v0, v0\n\n    move/from16 v20, v0\n\n    move-object/from16 v0, p0\n\n    move/from16 v1, v19\n\n    move/from16 v2, v20\n\n    invoke-virtual {v0, v1, v2}, Landroid/support/v4/widget/ViewDragHelper;->findTopChildUnder(II)Landroid/view/View;\n\n    move-result-object v19\n\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    move-object/from16 v20, v0\n\n    move-object/from16 v0, v19\n\n    move-object/from16 v1, v20\n\n    if-ne v0, v1, :cond_234\n\n    move-object/from16 v0, p0\n\n    iget-object v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    move-object/from16 v19, v0\n\n    move-object/from16 v0, p0\n\n    move-object/from16 v1, v19\n\n    invoke-virtual {v0, v1, v9}, Landroid/support/v4/widget/ViewDragHelper;->tryCaptureViewForDrag(Landroid/view/View;I)Z\n\n    move-result v19\n\n    if-eqz v19, :cond_234\n\n    .line 1164\n    move-object/from16 v0, p0\n\n    iget v13, v0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    .line 1169\n    .end local v9    # \"id\":I\n    .end local v17    # \"x\":F\n    .end local v18    # \"y\":F\n    :cond_277\n    const/16 v19, -0x1\n\n    move/from16 v0, v19\n\n    if-ne v13, v0, :cond_280\n\n    .line 1171\n    invoke-direct/range {p0 .. p0}, Landroid/support/v4/widget/ViewDragHelper;->releaseViewForPointerUp()V\n\n    .line 1174\n    .end local v8    # \"i\":I\n    .end local v13    # \"newActivePointer\":I\n    .end local v14    # \"pointerCount\":I\n    :cond_280\n    move-object/from16 v0, p0\n\n    invoke-direct {v0, v15}, Landroid/support/v4/widget/ViewDragHelper;->clearMotionHistory(I)V\n\n    goto/16 :goto_2f\n\n    .line 1179\n    .end local v15    # \"pointerId\":I\n    :pswitch_287\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    move/from16 v19, v0\n\n    const/16 v20, 0x1\n\n    move/from16 v0, v19\n\n    move/from16 v1, v20\n\n    if-ne v0, v1, :cond_298\n\n    .line 1180\n    invoke-direct/range {p0 .. p0}, Landroid/support/v4/widget/ViewDragHelper;->releaseViewForPointerUp()V\n\n    .line 1182\n    :cond_298\n    invoke-virtual/range {p0 .. p0}, Landroid/support/v4/widget/ViewDragHelper;->cancel()V\n\n    goto/16 :goto_2f\n\n    .line 1187\n    :pswitch_29d\n    move-object/from16 v0, p0\n\n    iget v0, v0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    move/from16 v19, v0\n\n    const/16 v20, 0x1\n\n    move/from16 v0, v19\n\n    move/from16 v1, v20\n\n    if-ne v0, v1, :cond_2b8\n\n    .line 1188\n    const/16 v19, 0x0\n\n    const/16 v20, 0x0\n\n    move-object/from16 v0, p0\n\n    move/from16 v1, v19\n\n    move/from16 v2, v20\n\n    invoke-direct {v0, v1, v2}, Landroid/support/v4/widget/ViewDragHelper;->dispatchViewReleased(FF)V\n\n    .line 1190\n    :cond_2b8\n    invoke-virtual/range {p0 .. p0}, Landroid/support/v4/widget/ViewDragHelper;->cancel()V\n\n    goto/16 :goto_2f\n\n    .line 1060\n    nop\n\n    :pswitch_data_2be\n    .packed-switch 0x0\n        :pswitch_30\n        :pswitch_287\n        :pswitch_11a\n        :pswitch_29d\n        :pswitch_2f\n        :pswitch_8e\n        :pswitch_1fe\n    .end packed-switch\n.end method\n\n.method setDragState(I)V\n    .registers 3\n    .param p1, \"state\"    # I\n\n    .prologue\n    .line 864\n    iget v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    if-eq v0, p1, :cond_10\n\n    .line 865\n    iput p1, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    .line 866\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    invoke-virtual {v0, p1}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onViewDragStateChanged(I)V\n\n    .line 867\n    if-nez p1, :cond_10\n\n    .line 868\n    const/4 v0, 0x0\n\n    iput-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    .line 871\n    :cond_10\n    return-void\n.end method\n\n.method public setEdgeTrackingEnabled(I)V\n    .registers 2\n    .param p1, \"edgeFlags\"    # I\n\n    .prologue\n    .line 437\n    iput p1, p0, Landroid/support/v4/widget/ViewDragHelper;->mTrackingEdges:I\n\n    .line 438\n    return-void\n.end method\n\n.method public setMinVelocity(F)V\n    .registers 2\n    .param p1, \"minVel\"    # F\n\n    .prologue\n    .line 401\n    iput p1, p0, Landroid/support/v4/widget/ViewDragHelper;->mMinVelocity:F\n\n    .line 402\n    return-void\n.end method\n\n.method public settleCapturedViewAt(II)Z\n    .registers 6\n    .param p1, \"finalLeft\"    # I\n    .param p2, \"finalTop\"    # I\n\n    .prologue\n    .line 557\n    iget-boolean v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mReleaseInProgress:Z\n\n    if-nez v0, :cond_c\n\n    .line 558\n    new-instance v0, Ljava/lang/IllegalStateException;\n\n    const-string v1, \"Cannot settleCapturedViewAt outside of a call to Callback#onViewReleased\"\n\n    invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n\n    .line 562\n    :cond_c\n    iget-object v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    iget v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    invoke-static {v0, v1}, Landroid/support/v4/view/VelocityTrackerCompat;->getXVelocity(Landroid/view/VelocityTracker;I)F\n\n    move-result v0\n\n    float-to-int v0, v0\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    iget v2, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    invoke-static {v1, v2}, Landroid/support/v4/view/VelocityTrackerCompat;->getYVelocity(Landroid/view/VelocityTracker;I)F\n\n    move-result v1\n\n    float-to-int v1, v1\n\n    invoke-direct {p0, p1, p2, v0, v1}, Landroid/support/v4/widget/ViewDragHelper;->forceSettleCapturedViewAt(IIII)Z\n\n    move-result v0\n\n    return v0\n.end method\n\n.method public shouldInterceptTouchEvent(Landroid/view/MotionEvent;)Z\n    .registers 15\n    .param p1, \"ev\"    # Landroid/view/MotionEvent;\n\n    .prologue\n    .line 939\n    invoke-static {p1}, Landroid/support/v4/view/MotionEventCompat;->getActionMasked(Landroid/view/MotionEvent;)I\n\n    move-result v0\n\n    .line 940\n    .local v0, \"action\":I\n    invoke-static {p1}, Landroid/support/v4/view/MotionEventCompat;->getActionIndex(Landroid/view/MotionEvent;)I\n\n    move-result v1\n\n    .line 942\n    .local v1, \"actionIndex\":I\n    if-nez v0, :cond_d\n\n    .line 945\n    invoke-virtual {p0}, Landroid/support/v4/widget/ViewDragHelper;->cancel()V\n\n    .line 948\n    :cond_d\n    iget-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    if-nez v11, :cond_17\n\n    .line 949\n    invoke-static {}, Landroid/view/VelocityTracker;->obtain()Landroid/view/VelocityTracker;\n\n    move-result-object v11\n\n    iput-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    .line 951\n    :cond_17\n    iget-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mVelocityTracker:Landroid/view/VelocityTracker;\n\n    invoke-virtual {v11, p1}, Landroid/view/VelocityTracker;->addMovement(Landroid/view/MotionEvent;)V\n\n    .line 953\n    packed-switch v0, :pswitch_data_e6\n\n    .line 1036\n    :cond_1f\n    :goto_1f\n    :pswitch_1f\n    iget v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    const/4 v12, 0x1\n\n    if-ne v11, v12, :cond_e3\n\n    const/4 v11, 0x1\n\n    :goto_25\n    return v11\n\n    .line 955\n    :pswitch_26\n    invoke-virtual {p1}, Landroid/view/MotionEvent;->getX()F\n\n    move-result v9\n\n    .line 956\n    .local v9, \"x\":F\n    invoke-virtual {p1}, Landroid/view/MotionEvent;->getY()F\n\n    move-result v10\n\n    .line 957\n    .local v10, \"y\":F\n    const/4 v11, 0x0\n\n    invoke-static {p1, v11}, Landroid/support/v4/view/MotionEventCompat;->getPointerId(Landroid/view/MotionEvent;I)I\n\n    move-result v7\n\n    .line 958\n    .local v7, \"pointerId\":I\n    invoke-direct {p0, v9, v10, v7}, Landroid/support/v4/widget/ViewDragHelper;->saveInitialMotion(FFI)V\n\n    .line 960\n    float-to-int v11, v9\n\n    float-to-int v12, v10\n\n    invoke-virtual {p0, v11, v12}, Landroid/support/v4/widget/ViewDragHelper;->findTopChildUnder(II)Landroid/view/View;\n\n    move-result-object v8\n\n    .line 963\n    .local v8, \"toCapture\":Landroid/view/View;\n    iget-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    if-ne v8, v11, :cond_48\n\n    iget v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    const/4 v12, 0x2\n\n    if-ne v11, v12, :cond_48\n\n    .line 964\n    invoke-virtual {p0, v8, v7}, Landroid/support/v4/widget/ViewDragHelper;->tryCaptureViewForDrag(Landroid/view/View;I)Z\n\n    .line 967\n    :cond_48\n    iget-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    aget v4, v11, v7\n\n    .line 968\n    .local v4, \"edgesTouched\":I\n    iget v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mTrackingEdges:I\n\n    and-int/2addr v11, v4\n\n    if-eqz v11, :cond_1f\n\n    .line 969\n    iget-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    iget v12, p0, Landroid/support/v4/widget/ViewDragHelper;->mTrackingEdges:I\n\n    and-int/2addr v12, v4\n\n    invoke-virtual {v11, v12, v7}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onEdgeTouched(II)V\n\n    goto :goto_1f\n\n    .line 975\n    .end local v4    # \"edgesTouched\":I\n    .end local v7    # \"pointerId\":I\n    .end local v8    # \"toCapture\":Landroid/view/View;\n    .end local v9    # \"x\":F\n    .end local v10    # \"y\":F\n    :pswitch_5a\n    invoke-static {p1, v1}, Landroid/support/v4/view/MotionEventCompat;->getPointerId(Landroid/view/MotionEvent;I)I\n\n    move-result v7\n\n    .line 976\n    .restart local v7    # \"pointerId\":I\n    invoke-static {p1, v1}, Landroid/support/v4/view/MotionEventCompat;->getX(Landroid/view/MotionEvent;I)F\n\n    move-result v9\n\n    .line 977\n    .restart local v9    # \"x\":F\n    invoke-static {p1, v1}, Landroid/support/v4/view/MotionEventCompat;->getY(Landroid/view/MotionEvent;I)F\n\n    move-result v10\n\n    .line 979\n    .restart local v10    # \"y\":F\n    invoke-direct {p0, v9, v10, v7}, Landroid/support/v4/widget/ViewDragHelper;->saveInitialMotion(FFI)V\n\n    .line 982\n    iget v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    if-nez v11, :cond_7f\n\n    .line 983\n    iget-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialEdgesTouched:[I\n\n    aget v4, v11, v7\n\n    .line 984\n    .restart local v4    # \"edgesTouched\":I\n    iget v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mTrackingEdges:I\n\n    and-int/2addr v11, v4\n\n    if-eqz v11, :cond_1f\n\n    .line 985\n    iget-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    iget v12, p0, Landroid/support/v4/widget/ViewDragHelper;->mTrackingEdges:I\n\n    and-int/2addr v12, v4\n\n    invoke-virtual {v11, v12, v7}, Landroid/support/v4/widget/ViewDragHelper$Callback;->onEdgeTouched(II)V\n\n    goto :goto_1f\n\n    .line 987\n    .end local v4    # \"edgesTouched\":I\n    :cond_7f\n    iget v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    const/4 v12, 0x2\n\n    if-ne v11, v12, :cond_1f\n\n    .line 989\n    float-to-int v11, v9\n\n    float-to-int v12, v10\n\n    invoke-virtual {p0, v11, v12}, Landroid/support/v4/widget/ViewDragHelper;->findTopChildUnder(II)Landroid/view/View;\n\n    move-result-object v8\n\n    .line 990\n    .restart local v8    # \"toCapture\":Landroid/view/View;\n    iget-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    if-ne v8, v11, :cond_1f\n\n    .line 991\n    invoke-virtual {p0, v8, v7}, Landroid/support/v4/widget/ViewDragHelper;->tryCaptureViewForDrag(Landroid/view/View;I)Z\n\n    goto :goto_1f\n\n    .line 999\n    .end local v7    # \"pointerId\":I\n    .end local v8    # \"toCapture\":Landroid/view/View;\n    .end local v9    # \"x\":F\n    .end local v10    # \"y\":F\n    :pswitch_92\n    invoke-static {p1}, Landroid/support/v4/view/MotionEventCompat;->getPointerCount(Landroid/view/MotionEvent;)I\n\n    move-result v6\n\n    .line 1000\n    .local v6, \"pointerCount\":I\n    const/4 v5, 0x0\n\n    .local v5, \"i\":I\n    :goto_97\n    if-ge v5, v6, :cond_b9\n\n    .line 1001\n    invoke-static {p1, v5}, Landroid/support/v4/view/MotionEventCompat;->getPointerId(Landroid/view/MotionEvent;I)I\n\n    move-result v7\n\n    .line 1002\n    .restart local v7    # \"pointerId\":I\n    invoke-static {p1, v5}, Landroid/support/v4/view/MotionEventCompat;->getX(Landroid/view/MotionEvent;I)F\n\n    move-result v9\n\n    .line 1003\n    .restart local v9    # \"x\":F\n    invoke-static {p1, v5}, Landroid/support/v4/view/MotionEventCompat;->getY(Landroid/view/MotionEvent;I)F\n\n    move-result v10\n\n    .line 1004\n    .restart local v10    # \"y\":F\n    iget-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionX:[F\n\n    aget v11, v11, v7\n\n    sub-float v2, v9, v11\n\n    .line 1005\n    .local v2, \"dx\":F\n    iget-object v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mInitialMotionY:[F\n\n    aget v11, v11, v7\n\n    sub-float v3, v10, v11\n\n    .line 1007\n    .local v3, \"dy\":F\n    invoke-direct {p0, v2, v3, v7}, Landroid/support/v4/widget/ViewDragHelper;->reportNewEdgeDrags(FFI)V\n\n    .line 1008\n    iget v11, p0, Landroid/support/v4/widget/ViewDragHelper;->mDragState:I\n\n    const/4 v12, 0x1\n\n    if-ne v11, v12, :cond_be\n\n    .line 1019\n    .end local v2    # \"dx\":F\n    .end local v3    # \"dy\":F\n    .end local v7    # \"pointerId\":I\n    .end local v9    # \"x\":F\n    .end local v10    # \"y\":F\n    :cond_b9\n    invoke-direct {p0, p1}, Landroid/support/v4/widget/ViewDragHelper;->saveLastMotion(Landroid/view/MotionEvent;)V\n\n    goto/16 :goto_1f\n\n    .line 1013\n    .restart local v2    # \"dx\":F\n    .restart local v3    # \"dy\":F\n    .restart local v7    # \"pointerId\":I\n    .restart local v9    # \"x\":F\n    .restart local v10    # \"y\":F\n    :cond_be\n    float-to-int v11, v9\n\n    float-to-int v12, v10\n\n    invoke-virtual {p0, v11, v12}, Landroid/support/v4/widget/ViewDragHelper;->findTopChildUnder(II)Landroid/view/View;\n\n    move-result-object v8\n\n    .line 1014\n    .restart local v8    # \"toCapture\":Landroid/view/View;\n    if-eqz v8, :cond_d2\n\n    invoke-direct {p0, v8, v2, v3}, Landroid/support/v4/widget/ViewDragHelper;->checkTouchSlop(Landroid/view/View;FF)Z\n\n    move-result v11\n\n    if-eqz v11, :cond_d2\n\n    invoke-virtual {p0, v8, v7}, Landroid/support/v4/widget/ViewDragHelper;->tryCaptureViewForDrag(Landroid/view/View;I)Z\n\n    move-result v11\n\n    if-nez v11, :cond_b9\n\n    .line 1000\n    :cond_d2\n    add-int/lit8 v5, v5, 0x1\n\n    goto :goto_97\n\n    .line 1024\n    .end local v2    # \"dx\":F\n    .end local v3    # \"dy\":F\n    .end local v5    # \"i\":I\n    .end local v6    # \"pointerCount\":I\n    .end local v7    # \"pointerId\":I\n    .end local v8    # \"toCapture\":Landroid/view/View;\n    .end local v9    # \"x\":F\n    .end local v10    # \"y\":F\n    :pswitch_d5\n    invoke-static {p1, v1}, Landroid/support/v4/view/MotionEventCompat;->getPointerId(Landroid/view/MotionEvent;I)I\n\n    move-result v7\n\n    .line 1025\n    .restart local v7    # \"pointerId\":I\n    invoke-direct {p0, v7}, Landroid/support/v4/widget/ViewDragHelper;->clearMotionHistory(I)V\n\n    goto/16 :goto_1f\n\n    .line 1031\n    .end local v7    # \"pointerId\":I\n    :pswitch_de\n    invoke-virtual {p0}, Landroid/support/v4/widget/ViewDragHelper;->cancel()V\n\n    goto/16 :goto_1f\n\n    .line 1036\n    :cond_e3\n    const/4 v11, 0x0\n\n    goto/16 :goto_25\n\n    .line 953\n    :pswitch_data_e6\n    .packed-switch 0x0\n        :pswitch_26\n        :pswitch_de\n        :pswitch_92\n        :pswitch_de\n        :pswitch_1f\n        :pswitch_5a\n        :pswitch_d5\n    .end packed-switch\n.end method\n\n.method public smoothSlideViewTo(Landroid/view/View;II)Z\n    .registers 6\n    .param p1, \"child\"    # Landroid/view/View;\n    .param p2, \"finalLeft\"    # I\n    .param p3, \"finalTop\"    # I\n\n    .prologue\n    const/4 v1, 0x0\n\n    .line 539\n    iput-object p1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    .line 540\n    const/4 v0, -0x1\n\n    iput v0, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    .line 542\n    invoke-direct {p0, p2, p3, v1, v1}, Landroid/support/v4/widget/ViewDragHelper;->forceSettleCapturedViewAt(IIII)Z\n\n    move-result v0\n\n    return v0\n.end method\n\n.method tryCaptureViewForDrag(Landroid/view/View;I)Z\n    .registers 5\n    .param p1, \"toCapture\"    # Landroid/view/View;\n    .param p2, \"pointerId\"    # I\n\n    .prologue\n    const/4 v0, 0x1\n\n    .line 883\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCapturedView:Landroid/view/View;\n\n    if-ne p1, v1, :cond_a\n\n    iget v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    if-ne v1, p2, :cond_a\n\n    .line 892\n    :goto_9\n    return v0\n\n    .line 887\n    :cond_a\n    if-eqz p1, :cond_1a\n\n    iget-object v1, p0, Landroid/support/v4/widget/ViewDragHelper;->mCallback:Landroid/support/v4/widget/ViewDragHelper$Callback;\n\n    invoke-virtual {v1, p1, p2}, Landroid/support/v4/widget/ViewDragHelper$Callback;->tryCaptureView(Landroid/view/View;I)Z\n\n    move-result v1\n\n    if-eqz v1, :cond_1a\n\n    .line 888\n    iput p2, p0, Landroid/support/v4/widget/ViewDragHelper;->mActivePointerId:I\n\n    .line 889\n    invoke-virtual {p0, p1, p2}, Landroid/support/v4/widget/ViewDragHelper;->captureChildView(Landroid/view/View;I)V\n\n    goto :goto_9\n\n    .line 892\n    :cond_1a\n    const/4 v0, 0x0\n\n    goto :goto_9\n.end method\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smali/WbxmlSerializer.smali",
    "content": ".class public Lorg/kxml2/wap/WbxmlSerializer;\n.super Ljava/lang/Object;\n.source \"WbxmlSerializer.java\"\n\n# interfaces\n.implements Lorg/xmlpull/v1/XmlSerializer;\n\n\n# instance fields\n.field private attrPage:I\n\n.field attrStartTable:Ljava/util/Hashtable;\n\n.field attrValueTable:Ljava/util/Hashtable;\n\n.field attributes:Ljava/util/Vector;\n\n.field buf:Ljava/io/ByteArrayOutputStream;\n\n.field depth:I\n\n.field private encoding:Ljava/lang/String;\n\n.field private headerSent:Z\n\n.field name:Ljava/lang/String;\n\n.field namespace:Ljava/lang/String;\n\n.field out:Ljava/io/OutputStream;\n\n.field pending:Ljava/lang/String;\n\n.field stringTable:Ljava/util/Hashtable;\n\n.field stringTableBuf:Ljava/io/ByteArrayOutputStream;\n\n.field private tagPage:I\n\n.field tagTable:Ljava/util/Hashtable;\n\n\n# direct methods\n.method public constructor <init>()V\n    .locals 1\n\n    .prologue\n    .line 35\n    invoke-direct {p0}, Ljava/lang/Object;-><init>()V\n\n    .line 38\n    new-instance v0, Ljava/util/Hashtable;\n\n    invoke-direct {v0}, Ljava/util/Hashtable;-><init>()V\n\n    iput-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTable:Ljava/util/Hashtable;\n\n    .line 42\n    new-instance v0, Ljava/io/ByteArrayOutputStream;\n\n    invoke-direct {v0}, Ljava/io/ByteArrayOutputStream;-><init>()V\n\n    iput-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    .line 43\n    new-instance v0, Ljava/io/ByteArrayOutputStream;\n\n    invoke-direct {v0}, Ljava/io/ByteArrayOutputStream;-><init>()V\n\n    iput-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTableBuf:Ljava/io/ByteArrayOutputStream;\n\n    .line 49\n    new-instance v0, Ljava/util/Vector;\n\n    invoke-direct {v0}, Ljava/util/Vector;-><init>()V\n\n    iput-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->attributes:Ljava/util/Vector;\n\n    .line 51\n    new-instance v0, Ljava/util/Hashtable;\n\n    invoke-direct {v0}, Ljava/util/Hashtable;-><init>()V\n\n    iput-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrStartTable:Ljava/util/Hashtable;\n\n    .line 52\n    new-instance v0, Ljava/util/Hashtable;\n\n    invoke-direct {v0}, Ljava/util/Hashtable;-><init>()V\n\n    iput-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrValueTable:Ljava/util/Hashtable;\n\n    .line 53\n    new-instance v0, Ljava/util/Hashtable;\n\n    invoke-direct {v0}, Ljava/util/Hashtable;-><init>()V\n\n    iput-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->tagTable:Ljava/util/Hashtable;\n\n    .line 60\n    const/4 v0, 0x0\n\n    iput-boolean v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->headerSent:Z\n\n    return-void\n.end method\n\n.method static writeInt(Ljava/io/OutputStream;I)V\n    .locals 4\n    .param p0, \"out\"    # Ljava/io/OutputStream;\n    .param p1, \"i\"    # I\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 447\n    const/4 v3, 0x5\n\n    new-array v0, v3, [B\n\n    .line 448\n    .local v0, \"buf\":[B\n    const/4 v1, 0x0\n\n    .line 451\n    .local v1, \"idx\":I\n    :goto_0\n    add-int/lit8 v2, v1, 0x1\n\n    .end local v1    # \"idx\":I\n    .local v2, \"idx\":I\n    and-int/lit8 v3, p1, 0x7f\n\n    int-to-byte v3, v3\n\n    aput-byte v3, v0, v1\n\n    .line 452\n    shr-int/lit8 p1, p1, 0x7\n\n    .line 454\n    if-nez p1, :cond_1\n\n    move v1, v2\n\n    .line 456\n    .end local v2    # \"idx\":I\n    .restart local v1    # \"idx\":I\n    :goto_1\n    const/4 v3, 0x1\n\n    if-le v1, v3, :cond_0\n\n    .line 457\n    add-int/lit8 v1, v1, -0x1\n\n    aget-byte v3, v0, v1\n\n    or-int/lit16 v3, v3, 0x80\n\n    invoke-virtual {p0, v3}, Ljava/io/OutputStream;->write(I)V\n\n    goto :goto_1\n\n    .line 459\n    :cond_0\n    const/4 v3, 0x0\n\n    aget-byte v3, v0, v3\n\n    invoke-virtual {p0, v3}, Ljava/io/OutputStream;->write(I)V\n\n    .line 460\n    return-void\n\n    .end local v1    # \"idx\":I\n    .restart local v2    # \"idx\":I\n    :cond_1\n    move v1, v2\n\n    .end local v2    # \"idx\":I\n    .restart local v1    # \"idx\":I\n    goto :goto_0\n.end method\n\n.method private writeStr(Ljava/lang/String;)V\n    .locals 10\n    .param p1, \"text\"    # Ljava/lang/String;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    const/16 v9, 0x41\n\n    const/16 v8, 0x20\n\n    const/4 v7, 0x0\n\n    const/16 v6, 0x83\n\n    .line 349\n    const/4 v2, 0x0\n\n    .line 350\n    .local v2, \"p0\":I\n    const/4 v0, 0x0\n\n    .line 351\n    .local v0, \"lastCut\":I\n    invoke-virtual {p1}, Ljava/lang/String;->length()I\n\n    move-result v1\n\n    .line 353\n    .local v1, \"len\":I\n    iget-boolean v4, p0, Lorg/kxml2/wap/WbxmlSerializer;->headerSent:Z\n\n    if-eqz v4, :cond_3\n\n    .line 354\n    iget-object v4, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {p0, v4, p1}, Lorg/kxml2/wap/WbxmlSerializer;->writeStrI(Ljava/io/OutputStream;Ljava/lang/String;)V\n\n    .line 394\n    :cond_0\n    :goto_0\n    return-void\n\n    .line 367\n    .local v3, \"p1\":I\n    :cond_1\n    sub-int v4, v3, v2\n\n    const/16 v5, 0xa\n\n    if-le v4, v5, :cond_2\n\n    .line 368\n    if-le v2, v0, :cond_5\n\n    add-int/lit8 v4, v2, -0x1\n\n    invoke-virtual {p1, v4}, Ljava/lang/String;->charAt(I)C\n\n    move-result v4\n\n    if-ne v4, v8, :cond_5\n\n    iget-object v4, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTable:Ljava/util/Hashtable;\n\n    invoke-virtual {p1, v2, v3}, Ljava/lang/String;->substring(II)Ljava/lang/String;\n\n    move-result-object v5\n\n    invoke-virtual {v4, v5}, Ljava/util/Hashtable;->get(Ljava/lang/Object;)Ljava/lang/Object;\n\n    move-result-object v4\n\n    if-nez v4, :cond_5\n\n    .line 370\n    iget-object v4, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v4, v6}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 371\n    invoke-virtual {p1, v0, v3}, Ljava/lang/String;->substring(II)Ljava/lang/String;\n\n    move-result-object v4\n\n    invoke-direct {p0, v4, v7}, Lorg/kxml2/wap/WbxmlSerializer;->writeStrT(Ljava/lang/String;Z)V\n\n    .line 385\n    :goto_1\n    move v0, v3\n\n    .line 387\n    :cond_2\n    move v2, v3\n\n    .line 358\n    .end local v3    # \"p1\":I\n    :cond_3\n    if-ge v2, v1, :cond_8\n\n    .line 359\n    :goto_2\n    if-ge v2, v1, :cond_4\n\n    invoke-virtual {p1, v2}, Ljava/lang/String;->charAt(I)C\n\n    move-result v4\n\n    if-ge v4, v9, :cond_4\n\n    .line 360\n    add-int/lit8 v2, v2, 0x1\n\n    goto :goto_2\n\n    .line 362\n    :cond_4\n    move v3, v2\n\n    .line 363\n    .restart local v3    # \"p1\":I\n    :goto_3\n    if-ge v3, v1, :cond_1\n\n    invoke-virtual {p1, v3}, Ljava/lang/String;->charAt(I)C\n\n    move-result v4\n\n    if-lt v4, v9, :cond_1\n\n    .line 364\n    add-int/lit8 v3, v3, 0x1\n\n    goto :goto_3\n\n    .line 374\n    :cond_5\n    if-le v2, v0, :cond_6\n\n    add-int/lit8 v4, v2, -0x1\n\n    invoke-virtual {p1, v4}, Ljava/lang/String;->charAt(I)C\n\n    move-result v4\n\n    if-ne v4, v8, :cond_6\n\n    .line 375\n    add-int/lit8 v2, v2, -0x1\n\n    .line 378\n    :cond_6\n    if-le v2, v0, :cond_7\n\n    .line 379\n    iget-object v4, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v4, v6}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 380\n    invoke-virtual {p1, v0, v2}, Ljava/lang/String;->substring(II)Ljava/lang/String;\n\n    move-result-object v4\n\n    invoke-direct {p0, v4, v7}, Lorg/kxml2/wap/WbxmlSerializer;->writeStrT(Ljava/lang/String;Z)V\n\n    .line 382\n    :cond_7\n    iget-object v4, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v4, v6}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 383\n    invoke-virtual {p1, v2, v3}, Ljava/lang/String;->substring(II)Ljava/lang/String;\n\n    move-result-object v4\n\n    const/4 v5, 0x1\n\n    invoke-direct {p0, v4, v5}, Lorg/kxml2/wap/WbxmlSerializer;->writeStrT(Ljava/lang/String;Z)V\n\n    goto :goto_1\n\n    .line 390\n    .end local v3    # \"p1\":I\n    :cond_8\n    if-ge v0, v1, :cond_0\n\n    .line 391\n    iget-object v4, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v4, v6}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 392\n    invoke-virtual {p1, v0, v1}, Ljava/lang/String;->substring(II)Ljava/lang/String;\n\n    move-result-object v4\n\n    invoke-direct {p0, v4, v7}, Lorg/kxml2/wap/WbxmlSerializer;->writeStrT(Ljava/lang/String;Z)V\n\n    goto :goto_0\n.end method\n\n.method private final writeStrT(Ljava/lang/String;Z)V\n    .locals 3\n    .param p1, \"s\"    # Ljava/lang/String;\n    .param p2, \"mayPrependSpace\"    # Z\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 470\n    iget-object v1, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTable:Ljava/util/Hashtable;\n\n    invoke-virtual {v1, p1}, Ljava/util/Hashtable;->get(Ljava/lang/Object;)Ljava/lang/Object;\n\n    move-result-object v0\n\n    check-cast v0, Ljava/lang/Integer;\n\n    .line 471\n    .local v0, \"idx\":Ljava/lang/Integer;\n    iget-object v2, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    if-nez v0, :cond_0\n\n    invoke-virtual {p0, p1, p2}, Lorg/kxml2/wap/WbxmlSerializer;->addToStringTable(Ljava/lang/String;Z)I\n\n    move-result v1\n\n    :goto_0\n    invoke-static {v2, v1}, Lorg/kxml2/wap/WbxmlSerializer;->writeInt(Ljava/io/OutputStream;I)V\n\n    .line 474\n    return-void\n\n    .line 471\n    :cond_0\n    invoke-virtual {v0}, Ljava/lang/Integer;->intValue()I\n\n    move-result v1\n\n    goto :goto_0\n.end method\n\n\n# virtual methods\n.method public addToStringTable(Ljava/lang/String;Z)I\n    .locals 9\n    .param p1, \"s\"    # Ljava/lang/String;\n    .param p2, \"mayPrependSpace\"    # Z\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    const/4 v8, 0x1\n\n    const/4 v5, 0x0\n\n    const/16 v7, 0x20\n\n    .line 485\n    iget-boolean v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->headerSent:Z\n\n    if-eqz v3, :cond_0\n\n    .line 486\n    new-instance v3, Ljava/io/IOException;\n\n    const-string v4, \"stringtable sent\"\n\n    invoke-direct {v3, v4}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V\n\n    throw v3\n\n    .line 489\n    :cond_0\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTableBuf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v3}, Ljava/io/ByteArrayOutputStream;->size()I\n\n    move-result v0\n\n    .line 490\n    .local v0, \"i\":I\n    move v2, v0\n\n    .line 491\n    .local v2, \"offset\":I\n    invoke-virtual {p1, v5}, Ljava/lang/String;->charAt(I)C\n\n    move-result v3\n\n    const/16 v4, 0x30\n\n    if-lt v3, v4, :cond_1\n\n    if-eqz p2, :cond_1\n\n    .line 492\n    new-instance v3, Ljava/lang/StringBuilder;\n\n    invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V\n\n    invoke-virtual {v3, v7}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;\n\n    move-result-object v3\n\n    invoke-virtual {v3, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v3\n\n    invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object p1\n\n    .line 493\n    add-int/lit8 v2, v2, 0x1\n\n    .line 496\n    :cond_1\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTable:Ljava/util/Hashtable;\n\n    new-instance v4, Ljava/lang/Integer;\n\n    invoke-direct {v4, v0}, Ljava/lang/Integer;-><init>(I)V\n\n    invoke-virtual {v3, p1, v4}, Ljava/util/Hashtable;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 497\n    invoke-virtual {p1, v5}, Ljava/lang/String;->charAt(I)C\n\n    move-result v3\n\n    if-ne v3, v7, :cond_2\n\n    .line 498\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTable:Ljava/util/Hashtable;\n\n    invoke-virtual {p1, v8}, Ljava/lang/String;->substring(I)Ljava/lang/String;\n\n    move-result-object v4\n\n    new-instance v5, Ljava/lang/Integer;\n\n    add-int/lit8 v6, v0, 0x1\n\n    invoke-direct {v5, v6}, Ljava/lang/Integer;-><init>(I)V\n\n    invoke-virtual {v3, v4, v5}, Ljava/util/Hashtable;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 500\n    :cond_2\n    invoke-virtual {p1, v7}, Ljava/lang/String;->lastIndexOf(I)I\n\n    move-result v1\n\n    .line 501\n    .local v1, \"j\":I\n    if-le v1, v8, :cond_3\n\n    .line 502\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTable:Ljava/util/Hashtable;\n\n    invoke-virtual {p1, v1}, Ljava/lang/String;->substring(I)Ljava/lang/String;\n\n    move-result-object v4\n\n    new-instance v5, Ljava/lang/Integer;\n\n    add-int v6, v0, v1\n\n    invoke-direct {v5, v6}, Ljava/lang/Integer;-><init>(I)V\n\n    invoke-virtual {v3, v4, v5}, Ljava/util/Hashtable;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 503\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTable:Ljava/util/Hashtable;\n\n    add-int/lit8 v4, v1, 0x1\n\n    invoke-virtual {p1, v4}, Ljava/lang/String;->substring(I)Ljava/lang/String;\n\n    move-result-object v4\n\n    new-instance v5, Ljava/lang/Integer;\n\n    add-int v6, v0, v1\n\n    add-int/lit8 v6, v6, 0x1\n\n    invoke-direct {v5, v6}, Ljava/lang/Integer;-><init>(I)V\n\n    invoke-virtual {v3, v4, v5}, Ljava/util/Hashtable;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 506\n    :cond_3\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTableBuf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {p0, v3, p1}, Lorg/kxml2/wap/WbxmlSerializer;->writeStrI(Ljava/io/OutputStream;Ljava/lang/String;)V\n\n    .line 507\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTableBuf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v3}, Ljava/io/ByteArrayOutputStream;->flush()V\n\n    .line 508\n    return v2\n.end method\n\n.method public attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;\n    .locals 1\n    .param p1, \"namespace\"    # Ljava/lang/String;\n    .param p2, \"name\"    # Ljava/lang/String;\n    .param p3, \"value\"    # Ljava/lang/String;\n\n    .prologue\n    .line 69\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->attributes:Ljava/util/Vector;\n\n    invoke-virtual {v0, p2}, Ljava/util/Vector;->addElement(Ljava/lang/Object;)V\n\n    .line 70\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->attributes:Ljava/util/Vector;\n\n    invoke-virtual {v0, p3}, Ljava/util/Vector;->addElement(Ljava/lang/Object;)V\n\n    .line 71\n    return-object p0\n.end method\n\n.method public cdsect(Ljava/lang/String;)V\n    .locals 0\n    .param p1, \"cdsect\"    # Ljava/lang/String;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 76\n    invoke-virtual {p0, p1}, Lorg/kxml2/wap/WbxmlSerializer;->text(Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;\n\n    .line 77\n    return-void\n.end method\n\n.method public checkPending(Z)V\n    .locals 8\n    .param p1, \"degenerated\"    # Z\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    const/4 v4, 0x4\n\n    const/4 v7, 0x1\n\n    const/4 v6, 0x0\n\n    .line 180\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->pending:Ljava/lang/String;\n\n    if-nez v3, :cond_0\n\n    .line 240\n    :goto_0\n    return-void\n\n    .line 183\n    :cond_0\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->attributes:Ljava/util/Vector;\n\n    invoke-virtual {v3}, Ljava/util/Vector;->size()I\n\n    move-result v2\n\n    .line 185\n    .local v2, \"len\":I\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->tagTable:Ljava/util/Hashtable;\n\n    iget-object v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->pending:Ljava/lang/String;\n\n    invoke-virtual {v3, v5}, Ljava/util/Hashtable;->get(Ljava/lang/Object;)Ljava/lang/Object;\n\n    move-result-object v3\n\n    check-cast v3, [I\n\n    move-object v1, v3\n\n    check-cast v1, [I\n\n    .line 188\n    .local v1, \"idx\":[I\n    if-nez v1, :cond_4\n\n    .line 189\n    iget-object v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    if-nez v2, :cond_2\n\n    if-eqz p1, :cond_1\n\n    move v3, v4\n\n    :goto_1\n    invoke-virtual {v5, v3}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 193\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->pending:Ljava/lang/String;\n\n    invoke-direct {p0, v3, v6}, Lorg/kxml2/wap/WbxmlSerializer;->writeStrT(Ljava/lang/String;Z)V\n\n    .line 205\n    :goto_2\n    const/4 v0, 0x0\n\n    .local v0, \"i\":I\n    :goto_3\n    if-ge v0, v2, :cond_d\n\n    .line 206\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrStartTable:Ljava/util/Hashtable;\n\n    iget-object v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->attributes:Ljava/util/Vector;\n\n    invoke-virtual {v5, v0}, Ljava/util/Vector;->elementAt(I)Ljava/lang/Object;\n\n    move-result-object v5\n\n    invoke-virtual {v3, v5}, Ljava/util/Hashtable;->get(Ljava/lang/Object;)Ljava/lang/Object;\n\n    move-result-object v3\n\n    check-cast v3, [I\n\n    move-object v1, v3\n\n    check-cast v1, [I\n\n    .line 208\n    if-nez v1, :cond_9\n\n    .line 209\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v3, v4}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 210\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->attributes:Ljava/util/Vector;\n\n    invoke-virtual {v3, v0}, Ljava/util/Vector;->elementAt(I)Ljava/lang/Object;\n\n    move-result-object v3\n\n    check-cast v3, Ljava/lang/String;\n\n    invoke-direct {p0, v3, v6}, Lorg/kxml2/wap/WbxmlSerializer;->writeStrT(Ljava/lang/String;Z)V\n\n    .line 220\n    :goto_4\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrValueTable:Ljava/util/Hashtable;\n\n    iget-object v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->attributes:Ljava/util/Vector;\n\n    add-int/lit8 v0, v0, 0x1\n\n    invoke-virtual {v5, v0}, Ljava/util/Vector;->elementAt(I)Ljava/lang/Object;\n\n    move-result-object v5\n\n    invoke-virtual {v3, v5}, Ljava/util/Hashtable;->get(Ljava/lang/Object;)Ljava/lang/Object;\n\n    move-result-object v3\n\n    check-cast v3, [I\n\n    move-object v1, v3\n\n    check-cast v1, [I\n\n    .line 221\n    if-nez v1, :cond_b\n\n    .line 222\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->attributes:Ljava/util/Vector;\n\n    invoke-virtual {v3, v0}, Ljava/util/Vector;->elementAt(I)Ljava/lang/Object;\n\n    move-result-object v3\n\n    check-cast v3, Ljava/lang/String;\n\n    invoke-direct {p0, v3}, Lorg/kxml2/wap/WbxmlSerializer;->writeStr(Ljava/lang/String;)V\n\n    .line 232\n    :goto_5\n    add-int/lit8 v0, v0, 0x1\n\n    goto :goto_3\n\n    .line 189\n    .end local v0    # \"i\":I\n    :cond_1\n    const/16 v3, 0x44\n\n    goto :goto_1\n\n    :cond_2\n    if-eqz p1, :cond_3\n\n    const/16 v3, 0x84\n\n    goto :goto_1\n\n    :cond_3\n    const/16 v3, 0xc4\n\n    goto :goto_1\n\n    .line 195\n    :cond_4\n    aget v3, v1, v6\n\n    iget v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->tagPage:I\n\n    if-eq v3, v5, :cond_5\n\n    .line 196\n    aget v3, v1, v6\n\n    iput v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->tagPage:I\n\n    .line 197\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v3, v6}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 198\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    iget v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->tagPage:I\n\n    invoke-virtual {v3, v5}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 200\n    :cond_5\n    iget-object v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    if-nez v2, :cond_7\n\n    if-eqz p1, :cond_6\n\n    aget v3, v1, v7\n\n    :goto_6\n    invoke-virtual {v5, v3}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    goto :goto_2\n\n    :cond_6\n    aget v3, v1, v7\n\n    or-int/lit8 v3, v3, 0x40\n\n    goto :goto_6\n\n    :cond_7\n    if-eqz p1, :cond_8\n\n    aget v3, v1, v7\n\n    or-int/lit16 v3, v3, 0x80\n\n    goto :goto_6\n\n    :cond_8\n    aget v3, v1, v7\n\n    or-int/lit16 v3, v3, 0xc0\n\n    goto :goto_6\n\n    .line 213\n    .restart local v0    # \"i\":I\n    :cond_9\n    aget v3, v1, v6\n\n    iget v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrPage:I\n\n    if-eq v3, v5, :cond_a\n\n    .line 214\n    aget v3, v1, v6\n\n    iput v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrPage:I\n\n    .line 215\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v3, v6}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 216\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    iget v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrPage:I\n\n    invoke-virtual {v3, v5}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 218\n    :cond_a\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    aget v5, v1, v7\n\n    invoke-virtual {v3, v5}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    goto :goto_4\n\n    .line 225\n    :cond_b\n    aget v3, v1, v6\n\n    iget v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrPage:I\n\n    if-eq v3, v5, :cond_c\n\n    .line 226\n    aget v3, v1, v6\n\n    iput v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrPage:I\n\n    .line 227\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v3, v6}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 228\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    iget v5, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrPage:I\n\n    invoke-virtual {v3, v5}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 230\n    :cond_c\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    aget v5, v1, v7\n\n    invoke-virtual {v3, v5}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    goto :goto_5\n\n    .line 235\n    :cond_d\n    if-lez v2, :cond_e\n\n    .line 236\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v3, v7}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 238\n    :cond_e\n    const/4 v3, 0x0\n\n    iput-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->pending:Ljava/lang/String;\n\n    .line 239\n    iget-object v3, p0, Lorg/kxml2/wap/WbxmlSerializer;->attributes:Ljava/util/Vector;\n\n    invoke-virtual {v3}, Ljava/util/Vector;->removeAllElements()V\n\n    goto/16 :goto_0\n.end method\n\n.method public comment(Ljava/lang/String;)V\n    .locals 0\n    .param p1, \"comment\"    # Ljava/lang/String;\n\n    .prologue\n    .line 84\n    return-void\n.end method\n\n.method public docdecl(Ljava/lang/String;)V\n    .locals 2\n    .param p1, \"docdecl\"    # Ljava/lang/String;\n\n    .prologue\n    .line 90\n    new-instance v0, Ljava/lang/RuntimeException;\n\n    const-string v1, \"Cannot write docdecl for WBXML\"\n\n    invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n.end method\n\n.method public endDocument()V\n    .locals 0\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 158\n    invoke-virtual {p0}, Lorg/kxml2/wap/WbxmlSerializer;->flush()V\n\n    .line 159\n    return-void\n.end method\n\n.method public endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;\n    .locals 2\n    .param p1, \"namespace\"    # Ljava/lang/String;\n    .param p2, \"name\"    # Ljava/lang/String;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    const/4 v1, 0x1\n\n    .line 400\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->pending:Ljava/lang/String;\n\n    if-eqz v0, :cond_0\n\n    .line 401\n    invoke-virtual {p0, v1}, Lorg/kxml2/wap/WbxmlSerializer;->checkPending(Z)V\n\n    .line 405\n    :goto_0\n    iget v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->depth:I\n\n    add-int/lit8 v0, v0, -0x1\n\n    iput v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->depth:I\n\n    .line 406\n    return-object p0\n\n    .line 403\n    :cond_0\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v0, v1}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    goto :goto_0\n.end method\n\n.method public entityRef(Ljava/lang/String;)V\n    .locals 2\n    .param p1, \"er\"    # Ljava/lang/String;\n\n    .prologue\n    .line 97\n    new-instance v0, Ljava/lang/RuntimeException;\n\n    const-string v1, \"EntityReference not supported for WBXML\"\n\n    invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n.end method\n\n.method public flush()V\n    .locals 2\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 167\n    const/4 v0, 0x0\n\n    invoke-virtual {p0, v0}, Lorg/kxml2/wap/WbxmlSerializer;->checkPending(Z)V\n\n    .line 169\n    iget-boolean v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->headerSent:Z\n\n    if-nez v0, :cond_0\n\n    .line 170\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->out:Ljava/io/OutputStream;\n\n    iget-object v1, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTableBuf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v1}, Ljava/io/ByteArrayOutputStream;->size()I\n\n    move-result v1\n\n    invoke-static {v0, v1}, Lorg/kxml2/wap/WbxmlSerializer;->writeInt(Ljava/io/OutputStream;I)V\n\n    .line 171\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->out:Ljava/io/OutputStream;\n\n    iget-object v1, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTableBuf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v1}, Ljava/io/ByteArrayOutputStream;->toByteArray()[B\n\n    move-result-object v1\n\n    invoke-virtual {v0, v1}, Ljava/io/OutputStream;->write([B)V\n\n    .line 172\n    const/4 v0, 0x1\n\n    iput-boolean v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->headerSent:Z\n\n    .line 175\n    :cond_0\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->out:Ljava/io/OutputStream;\n\n    iget-object v1, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v1}, Ljava/io/ByteArrayOutputStream;->toByteArray()[B\n\n    move-result-object v1\n\n    invoke-virtual {v0, v1}, Ljava/io/OutputStream;->write([B)V\n\n    .line 176\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v0}, Ljava/io/ByteArrayOutputStream;->reset()V\n\n    .line 177\n    return-void\n.end method\n\n.method public getDepth()I\n    .locals 1\n\n    .prologue\n    .line 104\n    iget v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->depth:I\n\n    return v0\n.end method\n\n.method public getFeature(Ljava/lang/String;)Z\n    .locals 1\n    .param p1, \"name\"    # Ljava/lang/String;\n\n    .prologue\n    .line 111\n    const/4 v0, 0x0\n\n    return v0\n.end method\n\n.method public getName()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 129\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->pending:Ljava/lang/String;\n\n    return-object v0\n.end method\n\n.method public getNamespace()Ljava/lang/String;\n    .locals 1\n\n    .prologue\n    .line 120\n    const/4 v0, 0x0\n\n    return-object v0\n.end method\n\n.method public getPrefix(Ljava/lang/String;Z)Ljava/lang/String;\n    .locals 2\n    .param p1, \"nsp\"    # Ljava/lang/String;\n    .param p2, \"create\"    # Z\n\n    .prologue\n    .line 136\n    new-instance v0, Ljava/lang/RuntimeException;\n\n    const-string v1, \"NYI\"\n\n    invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n.end method\n\n.method public getProperty(Ljava/lang/String;)Ljava/lang/Object;\n    .locals 1\n    .param p1, \"name\"    # Ljava/lang/String;\n\n    .prologue\n    .line 145\n    const/4 v0, 0x0\n\n    return-object v0\n.end method\n\n.method public ignorableWhitespace(Ljava/lang/String;)V\n    .locals 0\n    .param p1, \"sp\"    # Ljava/lang/String;\n\n    .prologue\n    .line 149\n    return-void\n.end method\n\n.method public processingInstruction(Ljava/lang/String;)V\n    .locals 2\n    .param p1, \"pi\"    # Ljava/lang/String;\n\n    .prologue\n    .line 246\n    new-instance v0, Ljava/lang/RuntimeException;\n\n    const-string v1, \"PI NYI\"\n\n    invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n.end method\n\n.method public setAttrStartTable(I[Ljava/lang/String;)V\n    .locals 4\n    .param p1, \"page\"    # I\n    .param p2, \"attrStartTable\"    # [Ljava/lang/String;\n\n    .prologue\n    .line 536\n    const/4 v0, 0x0\n\n    .local v0, \"i\":I\n    :goto_0\n    array-length v2, p2\n\n    if-ge v0, v2, :cond_1\n\n    .line 537\n    aget-object v2, p2, v0\n\n    if-eqz v2, :cond_0\n\n    .line 538\n    const/4 v2, 0x2\n\n    new-array v1, v2, [I\n\n    const/4 v2, 0x0\n\n    aput p1, v1, v2\n\n    const/4 v2, 0x1\n\n    add-int/lit8 v3, v0, 0x5\n\n    aput v3, v1, v2\n\n    .line 539\n    .local v1, \"idx\":[I\n    iget-object v2, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrStartTable:Ljava/util/Hashtable;\n\n    aget-object v3, p2, v0\n\n    invoke-virtual {v2, v3, v1}, Ljava/util/Hashtable;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 536\n    .end local v1    # \"idx\":[I\n    :cond_0\n    add-int/lit8 v0, v0, 0x1\n\n    goto :goto_0\n\n    .line 542\n    :cond_1\n    return-void\n.end method\n\n.method public setAttrValueTable(I[Ljava/lang/String;)V\n    .locals 4\n    .param p1, \"page\"    # I\n    .param p2, \"attrValueTable\"    # [Ljava/lang/String;\n\n    .prologue\n    .line 552\n    const/4 v0, 0x0\n\n    .local v0, \"i\":I\n    :goto_0\n    array-length v2, p2\n\n    if-ge v0, v2, :cond_1\n\n    .line 553\n    aget-object v2, p2, v0\n\n    if-eqz v2, :cond_0\n\n    .line 554\n    const/4 v2, 0x2\n\n    new-array v1, v2, [I\n\n    const/4 v2, 0x0\n\n    aput p1, v1, v2\n\n    const/4 v2, 0x1\n\n    add-int/lit16 v3, v0, 0x85\n\n    aput v3, v1, v2\n\n    .line 555\n    .local v1, \"idx\":[I\n    iget-object v2, p0, Lorg/kxml2/wap/WbxmlSerializer;->attrValueTable:Ljava/util/Hashtable;\n\n    aget-object v3, p2, v0\n\n    invoke-virtual {v2, v3, v1}, Ljava/util/Hashtable;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 552\n    .end local v1    # \"idx\":[I\n    :cond_0\n    add-int/lit8 v0, v0, 0x1\n\n    goto :goto_0\n\n    .line 558\n    :cond_1\n    return-void\n.end method\n\n.method public setFeature(Ljava/lang/String;Z)V\n    .locals 3\n    .param p1, \"name\"    # Ljava/lang/String;\n    .param p2, \"value\"    # Z\n\n    .prologue\n    .line 253\n    new-instance v0, Ljava/lang/IllegalArgumentException;\n\n    new-instance v1, Ljava/lang/StringBuilder;\n\n    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V\n\n    const-string v2, \"unknown feature \"\n\n    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n.end method\n\n.method public setOutput(Ljava/io/OutputStream;Ljava/lang/String;)V\n    .locals 1\n    .param p1, \"out\"    # Ljava/io/OutputStream;\n    .param p2, \"encoding\"    # Ljava/lang/String;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 268\n    if-nez p2, :cond_0\n\n    const-string p2, \"UTF-8\"\n\n    .end local p2    # \"encoding\":Ljava/lang/String;\n    :cond_0\n    iput-object p2, p0, Lorg/kxml2/wap/WbxmlSerializer;->encoding:Ljava/lang/String;\n\n    .line 269\n    iput-object p1, p0, Lorg/kxml2/wap/WbxmlSerializer;->out:Ljava/io/OutputStream;\n\n    .line 271\n    new-instance v0, Ljava/io/ByteArrayOutputStream;\n\n    invoke-direct {v0}, Ljava/io/ByteArrayOutputStream;-><init>()V\n\n    iput-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    .line 272\n    new-instance v0, Ljava/io/ByteArrayOutputStream;\n\n    invoke-direct {v0}, Ljava/io/ByteArrayOutputStream;-><init>()V\n\n    iput-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->stringTableBuf:Ljava/io/ByteArrayOutputStream;\n\n    .line 273\n    const/4 v0, 0x0\n\n    iput-boolean v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->headerSent:Z\n\n    .line 276\n    return-void\n.end method\n\n.method public setOutput(Ljava/io/Writer;)V\n    .locals 2\n    .param p1, \"writer\"    # Ljava/io/Writer;\n\n    .prologue\n    .line 260\n    new-instance v0, Ljava/lang/RuntimeException;\n\n    const-string v1, \"Wbxml requires an OutputStream!\"\n\n    invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n.end method\n\n.method public setPrefix(Ljava/lang/String;Ljava/lang/String;)V\n    .locals 2\n    .param p1, \"prefix\"    # Ljava/lang/String;\n    .param p2, \"nsp\"    # Ljava/lang/String;\n\n    .prologue\n    .line 282\n    new-instance v0, Ljava/lang/RuntimeException;\n\n    const-string v1, \"NYI\"\n\n    invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n.end method\n\n.method public setProperty(Ljava/lang/String;Ljava/lang/Object;)V\n    .locals 3\n    .param p1, \"property\"    # Ljava/lang/String;\n    .param p2, \"value\"    # Ljava/lang/Object;\n\n    .prologue\n    .line 289\n    new-instance v0, Ljava/lang/IllegalArgumentException;\n\n    new-instance v1, Ljava/lang/StringBuilder;\n\n    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V\n\n    const-string v2, \"unknown property \"\n\n    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;\n\n    move-result-object v1\n\n    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;\n\n    move-result-object v1\n\n    invoke-direct {v0, v1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n.end method\n\n.method public setTagTable(I[Ljava/lang/String;)V\n    .locals 4\n    .param p1, \"page\"    # I\n    .param p2, \"tagTable\"    # [Ljava/lang/String;\n\n    .prologue\n    .line 518\n    const/4 v0, 0x0\n\n    .local v0, \"i\":I\n    :goto_0\n    array-length v2, p2\n\n    if-ge v0, v2, :cond_1\n\n    .line 519\n    aget-object v2, p2, v0\n\n    if-eqz v2, :cond_0\n\n    .line 520\n    const/4 v2, 0x2\n\n    new-array v1, v2, [I\n\n    const/4 v2, 0x0\n\n    aput p1, v1, v2\n\n    const/4 v2, 0x1\n\n    add-int/lit8 v3, v0, 0x5\n\n    aput v3, v1, v2\n\n    .line 521\n    .local v1, \"idx\":[I\n    iget-object v2, p0, Lorg/kxml2/wap/WbxmlSerializer;->tagTable:Ljava/util/Hashtable;\n\n    aget-object v3, p2, v0\n\n    invoke-virtual {v2, v3, v1}, Ljava/util/Hashtable;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\n    .line 518\n    .end local v1    # \"idx\":[I\n    :cond_0\n    add-int/lit8 v0, v0, 0x1\n\n    goto :goto_0\n\n    .line 524\n    :cond_1\n    return-void\n.end method\n\n.method public startDocument(Ljava/lang/String;Ljava/lang/Boolean;)V\n    .locals 2\n    .param p1, \"encoding\"    # Ljava/lang/String;\n    .param p2, \"standalone\"    # Ljava/lang/Boolean;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 299\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->out:Ljava/io/OutputStream;\n\n    const/4 v1, 0x3\n\n    invoke-virtual {v0, v1}, Ljava/io/OutputStream;->write(I)V\n\n    .line 301\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->out:Ljava/io/OutputStream;\n\n    const/4 v1, 0x1\n\n    invoke-virtual {v0, v1}, Ljava/io/OutputStream;->write(I)V\n\n    .line 305\n    if-eqz p1, :cond_0\n\n    .line 306\n    iput-object p1, p0, Lorg/kxml2/wap/WbxmlSerializer;->encoding:Ljava/lang/String;\n\n    .line 309\n    :cond_0\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->encoding:Ljava/lang/String;\n\n    invoke-virtual {v0}, Ljava/lang/String;->toUpperCase()Ljava/lang/String;\n\n    move-result-object v0\n\n    const-string v1, \"UTF-8\"\n\n    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_1\n\n    .line 310\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->out:Ljava/io/OutputStream;\n\n    const/16 v1, 0x6a\n\n    invoke-virtual {v0, v1}, Ljava/io/OutputStream;->write(I)V\n\n    .line 316\n    :goto_0\n    return-void\n\n    .line 311\n    :cond_1\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->encoding:Ljava/lang/String;\n\n    invoke-virtual {v0}, Ljava/lang/String;->toUpperCase()Ljava/lang/String;\n\n    move-result-object v0\n\n    const-string v1, \"ISO-8859-1\"\n\n    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-eqz v0, :cond_2\n\n    .line 312\n    iget-object v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->out:Ljava/io/OutputStream;\n\n    const/4 v1, 0x4\n\n    invoke-virtual {v0, v1}, Ljava/io/OutputStream;->write(I)V\n\n    goto :goto_0\n\n    .line 314\n    :cond_2\n    new-instance v0, Ljava/io/UnsupportedEncodingException;\n\n    invoke-direct {v0, p1}, Ljava/io/UnsupportedEncodingException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n.end method\n\n.method public startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;\n    .locals 2\n    .param p1, \"namespace\"    # Ljava/lang/String;\n    .param p2, \"name\"    # Ljava/lang/String;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 321\n    if-eqz p1, :cond_0\n\n    const-string v0, \"\"\n\n    invoke-virtual {v0, p1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z\n\n    move-result v0\n\n    if-nez v0, :cond_0\n\n    .line 322\n    new-instance v0, Ljava/lang/RuntimeException;\n\n    const-string v1, \"NSP NYI\"\n\n    invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V\n\n    throw v0\n\n    .line 326\n    :cond_0\n    const/4 v0, 0x0\n\n    invoke-virtual {p0, v0}, Lorg/kxml2/wap/WbxmlSerializer;->checkPending(Z)V\n\n    .line 327\n    iput-object p2, p0, Lorg/kxml2/wap/WbxmlSerializer;->pending:Ljava/lang/String;\n\n    .line 328\n    iget v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->depth:I\n\n    add-int/lit8 v0, v0, 0x1\n\n    iput v0, p0, Lorg/kxml2/wap/WbxmlSerializer;->depth:I\n\n    .line 330\n    return-object p0\n.end method\n\n.method public text(Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;\n    .locals 1\n    .param p1, \"text\"    # Ljava/lang/String;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 340\n    const/4 v0, 0x0\n\n    invoke-virtual {p0, v0}, Lorg/kxml2/wap/WbxmlSerializer;->checkPending(Z)V\n\n    .line 341\n    invoke-direct {p0, p1}, Lorg/kxml2/wap/WbxmlSerializer;->writeStr(Ljava/lang/String;)V\n\n    .line 342\n    return-object p0\n.end method\n\n.method public text([CII)Lorg/xmlpull/v1/XmlSerializer;\n    .locals 1\n    .param p1, \"chars\"    # [C\n    .param p2, \"start\"    # I\n    .param p3, \"len\"    # I\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 334\n    const/4 v0, 0x0\n\n    invoke-virtual {p0, v0}, Lorg/kxml2/wap/WbxmlSerializer;->checkPending(Z)V\n\n    .line 335\n    new-instance v0, Ljava/lang/String;\n\n    invoke-direct {v0, p1, p2, p3}, Ljava/lang/String;-><init>([CII)V\n\n    invoke-direct {p0, v0}, Lorg/kxml2/wap/WbxmlSerializer;->writeStr(Ljava/lang/String;)V\n\n    .line 336\n    return-object p0\n.end method\n\n.method writeStrI(Ljava/io/OutputStream;Ljava/lang/String;)V\n    .locals 2\n    .param p1, \"out\"    # Ljava/io/OutputStream;\n    .param p2, \"s\"    # Ljava/lang/String;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    .line 463\n    iget-object v1, p0, Lorg/kxml2/wap/WbxmlSerializer;->encoding:Ljava/lang/String;\n\n    invoke-virtual {p2, v1}, Ljava/lang/String;->getBytes(Ljava/lang/String;)[B\n\n    move-result-object v0\n\n    .line 464\n    .local v0, \"data\":[B\n    invoke-virtual {p1, v0}, Ljava/io/OutputStream;->write([B)V\n\n    .line 465\n    const/4 v1, 0x0\n\n    invoke-virtual {p1, v1}, Ljava/io/OutputStream;->write(I)V\n\n    .line 466\n    return-void\n.end method\n\n.method public writeWapExtension(ILjava/lang/Object;)V\n    .locals 3\n    .param p1, \"type\"    # I\n    .param p2, \"data\"    # Ljava/lang/Object;\n    .annotation system Ldalvik/annotation/Throws;\n        value = {\n            Ljava/io/IOException;\n        }\n    .end annotation\n\n    .prologue\n    const/4 v2, 0x0\n\n    .line 413\n    invoke-virtual {p0, v2}, Lorg/kxml2/wap/WbxmlSerializer;->checkPending(Z)V\n\n    .line 414\n    iget-object v1, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v1, p1}, Ljava/io/ByteArrayOutputStream;->write(I)V\n\n    .line 415\n    sparse-switch p1, :sswitch_data_0\n\n    .line 440\n    new-instance v1, Ljava/lang/IllegalArgumentException;\n\n    invoke-direct {v1}, Ljava/lang/IllegalArgumentException;-><init>()V\n\n    throw v1\n\n    .line 422\n    :sswitch_0\n    check-cast p2, [B\n\n    .end local p2    # \"data\":Ljava/lang/Object;\n    move-object v0, p2\n\n    check-cast v0, [B\n\n    .line 423\n    .local v0, \"bytes\":[B\n    iget-object v1, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    array-length v2, v0\n\n    invoke-static {v1, v2}, Lorg/kxml2/wap/WbxmlSerializer;->writeInt(Ljava/io/OutputStream;I)V\n\n    .line 424\n    iget-object v1, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    invoke-virtual {v1, v0}, Ljava/io/ByteArrayOutputStream;->write([B)V\n\n    .line 442\n    .end local v0    # \"bytes\":[B\n    :goto_0\n    :sswitch_1\n    return-void\n\n    .line 430\n    .restart local p2    # \"data\":Ljava/lang/Object;\n    :sswitch_2\n    iget-object v1, p0, Lorg/kxml2/wap/WbxmlSerializer;->buf:Ljava/io/ByteArrayOutputStream;\n\n    check-cast p2, Ljava/lang/String;\n\n    .end local p2    # \"data\":Ljava/lang/Object;\n    invoke-virtual {p0, v1, p2}, Lorg/kxml2/wap/WbxmlSerializer;->writeStrI(Ljava/io/OutputStream;Ljava/lang/String;)V\n\n    goto :goto_0\n\n    .line 436\n    .restart local p2    # \"data\":Ljava/lang/Object;\n    :sswitch_3\n    check-cast p2, Ljava/lang/String;\n\n    .end local p2    # \"data\":Ljava/lang/Object;\n    invoke-direct {p0, p2, v2}, Lorg/kxml2/wap/WbxmlSerializer;->writeStrT(Ljava/lang/String;Z)V\n\n    goto :goto_0\n\n    .line 415\n    nop\n\n    :sswitch_data_0\n    .sparse-switch\n        0x40 -> :sswitch_2\n        0x41 -> :sswitch_2\n        0x42 -> :sswitch_2\n        0x80 -> :sswitch_3\n        0x81 -> :sswitch_3\n        0x82 -> :sswitch_3\n        0xc0 -> :sswitch_1\n        0xc1 -> :sswitch_1\n        0xc2 -> :sswitch_1\n        0xc3 -> :sswitch_0\n    .end sparse-switch\n.end method\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smalltalk/Booleans.cs",
    "content": "'From Pharo4.0 of 18 March 2013 [Latest update: #40152] on 6 August 2014 at 10:12:19.27738 pm'!\rObject subclass: #Boolean\r\tinstanceVariableNames: ''\r\tclassVariableNames: ''\r\tpoolDictionaries: ''\r\tcategory: 'Kernel-Objects'!\rBoolean subclass: #False\r\tinstanceVariableNames: ''\r\tclassVariableNames: ''\r\tpoolDictionaries: ''\r\tcategory: 'Kernel-Objects'!\rBoolean subclass: #True\r\tinstanceVariableNames: ''\r\tclassVariableNames: ''\r\tpoolDictionaries: ''\r\tcategory: 'Kernel-Objects'!\r\r!Boolean methodsFor: '*monticellofiletree-core' stamp: 'dkh 4/6/2012 15:56:14'!\rwriteCypressJsonOn: aStream forHtml: forHtml indent: startIndent\r    \"by default ignore <forHtml> ... <forHtml> is used for Dictionary and Array, i.e., container objects and String which actually encodes itself differently for HTML\"\r\r    aStream nextPutAll: self printString! !\r\r!Boolean methodsFor: 'copying' stamp: 'tk 8/20/1998 16:07'!\rveryDeepCopyWith: deepCopier\r\t\"Return self.  I can't be copied.  Do not record me.\"! !\r\r!Boolean methodsFor: 'copying'!\rdeepCopy \r\t\"Receiver has two concrete subclasses, True and False.\r\tOnly one instance of each should be made, so return self.\"! !\r\r!Boolean methodsFor: 'copying'!\rshallowCopy \r\t\"Receiver has two concrete subclasses, True and False.\r\tOnly one instance of each should be made, so return self.\"! !\r\r!Boolean methodsFor: 'logical operations'!\rnot\r\t\"Negation. Answer true if the receiver is false, answer false if the \r\treceiver is true.\"\r\r\tself subclassResponsibility! !\r\r!Boolean methodsFor: 'logical operations'!\r& aBoolean \r\t\"Evaluating conjunction. Evaluate the argument. Then answer true if \r\tboth the receiver and the argument are true.\"\r\r\tself subclassResponsibility! !\r\r!Boolean methodsFor: 'logical operations'!\r| aBoolean \r\t\"Evaluating disjunction (OR). Evaluate the argument. Then answer true \r\tif either the receiver or the argument is true.\"\r\r\tself subclassResponsibility! !\r\r!Boolean methodsFor: 'logical operations' stamp: 'stephane.ducasse 5/20/2009 21:28'!\r==> aBlock\r\t\"The material conditional, also known as the material implication or truth functional conditional.\r\tCorrespond to not ... or ... and does not correspond to the English if...then... construction.\r\t\t\r\t known as:\r\t\t\tb if a \r\t\t\ta implies b\r\t\t\tif a then b\r\t\t\tb is a consequence of a\r\t\t\ta therefore b (but note: 'it is raining therefore it is cloudy' is implication; 'it is autumn therefore the leaves are falling' is equivalence).\r\t\t\r\tHere is the truth table for material implication:\r\t\r\t   p   |   q   |   p ==> q\r\t-------|-------|-------------\r\t   T   |   T   |      T\r\t   T   |   F   |      F\r\t   F   |   T   |      T\r\t   F   |   F   |      T\r\t\"\r\r\t^self not or: [aBlock value]! !\r\r!Boolean methodsFor: 'logical operations'!\reqv: aBoolean \r\t\"Answer true if the receiver is equivalent to aBoolean.\"\r\r\t^self == aBoolean! !\r\r!Boolean methodsFor: 'controlling'!\ror: alternativeBlock \r\t\"Nonevaluating disjunction. If the receiver is false, answer the value of \r\tthe argument, alternativeBlock; otherwise answer true without \r\tevaluating the argument.\"\r\r\tself subclassResponsibility! !\r\r!Boolean methodsFor: 'controlling'!\rifFalse: alternativeBlock \r\t\"If the receiver is true (i.e., the condition is true), then the value is the \r\ttrue alternative, which is nil. Otherwise answer the result of evaluating \r\tthe argument, alternativeBlock. Create an error notification if the \r\treceiver is nonBoolean. Execution does not actually reach here because \r\tthe expression is compiled in-line.\"\r\r\tself subclassResponsibility! !\r\r!Boolean methodsFor: 'controlling'!\rifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock\r\t\"If the receiver is true (i.e., the condition is true), then answer the value \r\tof the argument trueAlternativeBlock. If the receiver is false, answer the \r\tresult of evaluating the argument falseAlternativeBlock. If the receiver \r\tis a nonBoolean then create an error notification. Execution does not \r\tactually reach here because the expression is compiled in-line.\"\r\r\tself subclassResponsibility! !\r\r!Boolean methodsFor: 'controlling'!\rifFalse: falseAlternativeBlock ifTrue: trueAlternativeBlock \r\t\"Same as ifTrue:ifFalse:.\"\r\r\tself subclassResponsibility! !\r\r!Boolean methodsFor: 'controlling'!\rifTrue: alternativeBlock \r\t\"If the receiver is false (i.e., the condition is false), then the value is the \r\tfalse alternative, which is nil. Otherwise answer the result of evaluating \r\tthe argument, alternativeBlock. Create an error notification if the \r\treceiver is nonBoolean. Execution does not actually reach here because \r\tthe expression is compiled in-line.\"\r\r\tself subclassResponsibility! !\r\r!Boolean methodsFor: 'controlling'!\rand: alternativeBlock \r\t\"Nonevaluating conjunction. If the receiver is true, answer the value of \r\tthe argument, alternativeBlock; otherwise answer false without \r\tevaluating the argument.\"\r\r\tself subclassResponsibility! !\r\r!Boolean methodsFor: '*Fuel' stamp: 'MartinDias 2/21/2013 12:49'!\rfuelAccept: aGeneralMapper\r\r\t^aGeneralMapper visitHookPrimitive: self! !\r\r!Boolean methodsFor: '*Fuel' stamp: 'MartinDias 2/21/2013 12:49'!\rserializeOn: anEncoder\r\t\"Do nothing\"! !\r\r!Boolean methodsFor: '*NativeBoost-Core' stamp: 'cb 4/22/2013 14:15'!\rasNBExternalType: gen\r\t\"boolean value in argument description array defines a simple 0 or 1 constant\r\t\r\t#( true false )  - turned into a 1 and 0\r\t\"\r\t^ NBFFIConst value: self asBit! !\r\r!Boolean methodsFor: 'printing'!\rstoreOn: aStream \r\t\"Refer to the comment in Object|storeOn:.\"\r\r\tself printOn: aStream! !\r\r!Boolean methodsFor: 'printing' stamp: 'apb 4/21/2006 09:22'!\risLiteral \r\t^ true! !\r\r!Boolean methodsFor: 'self evaluating' stamp: 'sd 7/31/2005 21:45'!\risSelfEvaluating\r\t^ true! !\r\r!Boolean methodsFor: 'converting' stamp: 'CamilloBruni 3/27/2012 17:20'!\rasBit\r\t\"convert myself to an Integer representing 1 for true and 0 for false\"\r\tself subclassResponsibility! !\r\r\r!Boolean class methodsFor: '*System-Settings-Browser' stamp: 'alain.plantec 3/18/2009 14:48'!\rsettingInputWidgetForNode: aSettingNode\r\t^ aSettingNode inputWidgetForBoolean! !\r\r!Boolean class methodsFor: '*NativeBoost-Core' stamp: 'IgorStasenko 8/13/2013 16:47'!\rasNBExternalType: gen\r\t^ NBBool asNBExternalType: gen! !\r\r!Boolean class methodsFor: 'instance creation'!\rnew\r\tself error: 'You may not create any more Booleans - this is two-valued logic'! !\r\r\r!False methodsFor: 'printing'!\rprintOn: aStream \r\r\taStream nextPutAll: 'false'! !\r\r!False methodsFor: 'logical operations'!\rnot\r\t\"Negation -- answer true since the receiver is false.\"\r\r\t^true! !\r\r!False methodsFor: 'logical operations' stamp: 'md 7/30/2005 18:05'!\r& aBoolean \r\t\"Evaluating conjunction -- answer false since receiver is false.\"\r\r\t^self! !\r\r!False methodsFor: 'logical operations'!\r| aBoolean \r\t\"Evaluating disjunction (OR) -- answer with the argument, aBoolean.\"\r\r\t^aBoolean! !\r\r!False methodsFor: 'logical operations' stamp: 'CamilloBruni 8/1/2012 16:25'!\rxor: aBoolean\r\t^aBoolean value! !\r\r!False methodsFor: 'controlling'!\ror: alternativeBlock \r\t\"Nonevaluating disjunction -- answer value of alternativeBlock.\"\r\r\t^alternativeBlock value! !\r\r!False methodsFor: 'controlling'!\rifFalse: alternativeBlock \r\t\"Answer the value of alternativeBlock. Execution does not actually\r\treach here because the expression is compiled in-line.\"\r\r\t^alternativeBlock value! !\r\r!False methodsFor: 'controlling'!\rifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock \r\t\"Answer the value of falseAlternativeBlock. Execution does not\r\tactually reach here because the expression is compiled in-line.\"\r\r\t^falseAlternativeBlock value! !\r\r!False methodsFor: 'controlling'!\rifFalse: falseAlternativeBlock ifTrue: trueAlternativeBlock \r\t\"Answer the value of falseAlternativeBlock. Execution does not\r\tactually reach here because the expression is compiled in-line.\"\r\r\t^falseAlternativeBlock value! !\r\r!False methodsFor: 'controlling'!\rifTrue: alternativeBlock \r\t\"Since the condition is false, answer the value of the false alternative, \r\twhich is nil. Execution does not actually reach here because the\r\texpression is compiled in-line.\"\r\r\t^nil! !\r\r!False methodsFor: 'controlling'!\rand: alternativeBlock \r\t\"Nonevaluating conjunction -- answer with false since the receiver is false.\"\r\r\t^self! !\r\r!False methodsFor: 'converting' stamp: 'IgorStasenko 12/28/2012 15:09'!\rasBit\r\r\t^ 0! !\r\r\r!True methodsFor: 'controlling'!\ror: alternativeBlock \r\t\"Nonevaluating disjunction -- answer true since the receiver is true.\"\r\r\t^self! !\r\r!True methodsFor: 'controlling'!\rifFalse: alternativeBlock \r\t\"Since the condition is true, the value is the true alternative, which is nil. \r\tExecution does not actually reach here because the expression is compiled \r\tin-line.\"\r\r\t^nil! !\r\r!True methodsFor: 'controlling'!\rifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock \r\t\"Answer with the value of trueAlternativeBlock. Execution does not \r\tactually reach here because the expression is compiled in-line.\"\r\r\t^trueAlternativeBlock value! !\r\r!True methodsFor: 'controlling'!\rifFalse: falseAlternativeBlock ifTrue: trueAlternativeBlock \r\t\"Answer the value of trueAlternativeBlock. Execution does not \r\tactually reach here because the expression is compiled in-line.\"\r\r\t^trueAlternativeBlock value! !\r\r!True methodsFor: 'controlling'!\rifTrue: alternativeBlock \r\t\"Answer the value of alternativeBlock. Execution does not actually \r\treach here because the expression is compiled in-line.\"\r\r\t^alternativeBlock value! !\r\r!True methodsFor: 'controlling'!\rand: alternativeBlock \r\t\"Nonevaluating conjunction -- answer the value of alternativeBlock since\r\tthe receiver is true.\"\r\r\t^alternativeBlock value! !\r\r!True methodsFor: 'converting' stamp: 'IgorStasenko 12/28/2012 15:09'!\rasBit\r\r\t^ 1! !\r\r!True methodsFor: 'printing'!\rprintOn: aStream \r\r\taStream nextPutAll: 'true'! !\r\r!True methodsFor: 'logical operations'!\rnot\r\t\"Negation--answer false since the receiver is true.\"\r\r\t^false! !\r\r!True methodsFor: 'logical operations' stamp: 'md 7/30/2005 18:04'!\r& aBoolean \r\t\"Evaluating conjunction -- answer aBoolean since receiver is true.\"\r\r\t^aBoolean! !\r\r!True methodsFor: 'logical operations'!\r| aBoolean \r\t\"Evaluating disjunction (OR) -- answer true since the receiver is true.\"\r\r\t^self! !\r\r!True methodsFor: 'logical operations' stamp: 'CamilloBruni 8/1/2012 16:25'!\rxor: aBoolean\r\t^aBoolean value not! !\r\r\r!True class methodsFor: '*Fuel' stamp: 'MartinDias 2/21/2013 12:51'!\rmaterializeFrom: aDecoder\r\t\"Answer my unique instance\"\r\r\t^ true! !\r\r\r!False class methodsFor: '*Fuel' stamp: 'MartinDias 2/21/2013 12:51'!\rmaterializeFrom: aDecoder\r\t\"Answer my unique instance\"\r\r\t^ false! !\r\r"
  },
  {
    "path": "src/test/resources/samples/langs/Smalltalk/Collections.cs",
    "content": "﻿'From Pharo4.0 of 18 March 2013 [Latest update: #40152] on 7 August 2014 at 2:21:37.309017 pm'!\rObject subclass: #Collection\r\tinstanceVariableNames: ''\r\tclassVariableNames: 'MutexForPicking RandomForPicking'\r\tpoolDictionaries: ''\r\tcategory: 'Collections-Abstract'!\rHashedCollection subclass: #Dictionary\r\tinstanceVariableNames: ''\r\tclassVariableNames: ''\r\tpoolDictionaries: ''\r\tcategory: 'Collections-Unordered'!\rCollection class\r\tinstanceVariableNames: ''!\rDictionary class\r\tinstanceVariableNames: ''!\rString subclass: #Symbol\r\tinstanceVariableNames: ''\r\tclassVariableNames: 'NewSymbols OneCharacterSymbols SymbolTable'\r\tpoolDictionaries: ''\r\tcategory: 'Collections-Strings'!\rSymbol class\r\tinstanceVariableNames: ''!\rSequenceableCollection subclass: #OrderedCollection\r\tinstanceVariableNames: 'array firstIndex lastIndex'\r\tclassVariableNames: ''\r\tpoolDictionaries: ''\r\tcategory: 'Collections-Sequenceable'!\rOrderedCollection class\r\tuses: TSortable classTrait\r\tinstanceVariableNames: ''!\rObject subclass: #Stream\r\tinstanceVariableNames: ''\r\tclassVariableNames: ''\r\tpoolDictionaries: ''\r\tcategory: 'Collections-Streams'!\rStream class\r\tinstanceVariableNames: ''!\r\r!Collection methodsFor: '*metacello-core-scripting' stamp: 'dkh 9/5/2012 06:26:03.064'!\rexecute: projectSpecBlock against: aScriptExecutor\r    aScriptExecutor executeCollection: self do: projectSpecBlock! !\r\r!Collection methodsFor: 'testing' stamp: 'EstebanLorenzano 8/17/2012 16:40'!\rincludesSubstringAnywhere: testString\r\t\"Answer whether the receiver includes, anywhere in its nested structure, a string that has testString as a substring\"\r\tself do:\r\t\t[:element |\r\t\t\t(element isString)\r\t\t\t\tifTrue:\r\t\t\t\t\t[(element includesSubstring: testString) ifTrue: [^ true]].\r\t\t\t(element isCollection)\r\t\t\t\tifTrue:\r\t\t\t\t\t[(element includesSubstringAnywhere: testString) ifTrue: [^ true]]].\r\t^ false\r\r\"#(first (second third) ((allSentMessages ('Elvis' includes:)))) includesSubstringAnywhere:  'lvi'\"! !\r\r!Collection methodsFor: 'testing'!\rcontains: aBlock\r\t\"VW compatibility\"\r\t^self anySatisfy: aBlock! !\r\r!Collection methodsFor: 'testing' stamp: 'ClementBera 12/2/2013 12:41'!\rincludesAllOf: aCollection \r\r\tself flag: 'use includesAll: instead'.\r\t\r\t^ self includesAll: aCollection.! !\r\r!Collection methodsFor: 'testing' stamp: 'CamilloBruni 9/8/2011 14:18'!\rincludesAny: aCollection \r\t\"Answer whether any element of aCollection is one of the receiver's elements.\"\r\taCollection do: [:elem | (self includes: elem) ifTrue: [^ true]].\r\t^ false! !\r\r!Collection methodsFor: 'testing' stamp: 'ls 3/27/2000 17:25'!\ridentityIncludes: anObject \r\t\"Answer whether anObject is one of the receiver's elements.\"\r\r\tself do: [:each | anObject == each ifTrue: [^true]].\r\t^false! !\r\r!Collection methodsFor: 'testing' stamp: 'StephaneDucasse 7/3/2010 22:15'!\rifEmpty: aBlock\r\t\"Evaluate the given block with the receiver as argument, answering its value if the receiver is empty, otherwise answer the receiver.\"\r\t\r\t\"Note that the fact that this method returns its argument in case the receiver is not empty allows one to write expressions like the following ones: self classifyMethodAs: (myProtocol ifEmpty: ['As yet unclassified'])\"\r\r\t^ self isEmpty \r\t\tifTrue: [ ^aBlock value ]\r\t\tifFalse: [ self ]! !\r\r!Collection methodsFor: 'testing' stamp: 'HenrikSperreJohansen 6/28/2010 12:13'!\rifEmpty: emptyBlock ifNotEmpty: notEmptyBlock\r\t\"Evaluate emptyBlock if I'm empty, notEmptyBlock otherwise\"\r\t\" If the notEmptyBlock has an argument, eval with the receiver as its argument\"\r\r\tself isEmpty ifTrue: [ ^emptyBlock value ].\r\t^notEmptyBlock cull: self! !\r\r!Collection methodsFor: 'testing' stamp: 'StephaneDucasse 7/3/2010 22:10'!\rifNotEmpty: aBlock\r\t\"Evaluate the given block with the receiver as argument, answering its value\r      unless the receiver is empty, in which case answer the receiver\r\r      If the block has an argument, eval with the receiver as its argument,\r      but it might be better to use ifNotEmptyDo: to make the code easier to\r      understand\"\r\t\"Note that the fact that this method returns its argument in case the receiver is empty\r\tallows one to write expressions like the following ones:\r\t\tself classifyMethodAs: (myProtocol ifEmpty: ['As yet unclassified']\"\r\t\r    ^self isEmpty\r          ifTrue: [self]\r          ifFalse: [aBlock cull: self]\r! !\r\r!Collection methodsFor: 'testing' stamp: 'ar 11/21/2009 00:36'!\rifNotEmptyDo: aBlock\r\t\"Evaluate the given block with the receiver as its argument.\"\r\r\tself isEmpty ifFalse: [^ aBlock value: self].\r! !\r\r!Collection methodsFor: 'testing' stamp: 'sma 5/12/2000 14:07'!\rincludes: anObject \r\t\"Answer whether anObject is one of the receiver's elements.\"\r\r\t^ self anySatisfy: [:each | each = anObject]! !\r\r!Collection methodsFor: 'testing' stamp: 'ul 11/11/2009 16:24'!\rifEmpty: emptyBlock ifNotEmptyDo: notEmptyBlock\r\t\"Evaluate emptyBlock if I'm empty, notEmptyBlock otherwise\"\r\t\"Evaluate the notEmptyBlock with the receiver as its argument\"\r\r\tself isEmpty ifTrue: [ ^emptyBlock value ].\r\t^notEmptyBlock value: self! !\r\r!Collection methodsFor: 'testing'!\risEmpty\r\t\"Answer whether the receiver contains any elements.\"\r\r\t^self size = 0! !\r\r!Collection methodsFor: 'testing' stamp: 'bf 3/10/2000 09:29'!\risEmptyOrNil\r\t\"Answer whether the receiver contains any elements, or is nil.  Useful in numerous situations where one wishes the same reaction to an empty collection or to nil\"\r\r\t^ self isEmpty! !\r\r!Collection methodsFor: 'testing'!\roccurrencesOf: anObject \r\t\"Answer how many of the receiver's elements are equal to anObject.\"\r\r\t| tally |\r\ttally := 0.\r\tself do: [:each | anObject = each ifTrue: [tally := tally + 1]].\r\t^tally! !\r\r!Collection methodsFor: 'testing' stamp: 'di 11/6/1998 09:16'!\risSequenceable\r\t^ false! !\r\r!Collection methodsFor: 'testing' stamp: 'ul 11/11/2009 16:25'!\rifNotEmptyDo: notEmptyBlock ifEmpty: emptyBlock\r\t\"Evaluate emptyBlock if I'm empty, notEmptyBlock otherwise\r\tEvaluate the notEmptyBlock with the receiver as its argument\"\r\r\tself isEmpty ifFalse: [ ^notEmptyBlock value: self ].\r\t^emptyBlock value! !\r\r!Collection methodsFor: 'testing' stamp: 'CamilloBruni 9/8/2011 14:20'!\rincludesAnyOf: aCollection \r\t\r\tself flag: 'use includesAny: instead'.\r\t\r\t^ self includesAny: aCollection.\r\t! !\r\r!Collection methodsFor: 'testing' stamp: 'MarcusDenker 7/17/2013 13:15'!\risNotEmpty\r\t\"Answer whether the receiver contains any elements.\"\r\r\t^ self isEmpty not! !\r\r!Collection methodsFor: 'testing' stamp: 'CamilloBruni 9/8/2011 14:18'!\rincludesAll: aCollection \r\t\"Answer whether all the elements of aCollection are in the receiver.\"\r\taCollection do: [:elem | (self includes: elem) ifFalse: [^ false]].\r\t^ true! !\r\r!Collection methodsFor: 'testing' stamp: 'ar 8/17/1999 19:43'!\risCollection\r\t\"Return true if the receiver is some sort of Collection and responds to basic collection messages such as #size and #do:\"\r\t^true! !\r\r!Collection methodsFor: 'testing' stamp: 'MarcusDenker 7/17/2013 13:16'!\rnotEmpty\r\t\"Answer whether the receiver contains any elements.\"\r\t\"use isNotEmpty for consistency with isEmpty\"\r\r\t^ self isEmpty not! !\r\r!Collection methodsFor: 'testing' stamp: 'HenrikSperreJohansen 6/28/2010 12:14'!\rifNotEmpty: notEmptyBlock ifEmpty: emptyBlock\r\t\"Evaluate emptyBlock if I'm empty, notEmptyBlock otherwise\r\t If the notEmptyBlock has an argument, eval with the receiver as its argument\"\r\r\tself isEmpty ifFalse: [ ^notEmptyBlock cull: self ].\r\t^emptyBlock value! !\r\r!Collection methodsFor: '*Morphic-Base-Basic' stamp: 'CamilloBruni 10/21/2012 23:39'!\rasDraggableMorph\r\t^ (String streamContents: [ :s| \r\t\tself \r\t\t\tdo: [ :each | s print: each ]\r\t\t\tseparatedBy: [ s space ]]) asStringMorph! !\r\r!Collection methodsFor: 'comparing' stamp: 'SqR 8/3/2000 13:36'!\rhash\r\t\"Answer an integer hash value for the receiver such that,\r\t  -- the hash value of an unchanged object is constant over time, and\r\t  -- two equal objects have equal hash values\"\r\r\t| hash |\r\r\thash := self species hash.\r\tself size <= 10 ifTrue:\r\t\t[self do: [:elem | hash := hash bitXor: elem hash]].\r\t^hash bitXor: self size hash! !\r\r!Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/23/2013 10:46'!\rreject: rejectBlock thenDo: doBlock \r\t\"Utility method to improve readability.\"\r\t(self reject: rejectBlock) do: doBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'SebastianTleye 6/25/2013 18:41'!\rflattened\r\t\r\t\"Flattens a collection of collections (no matter how many levels of collections exist).\r\tStrings are considered atoms and, as such, won't be flattened\r\t\r\tExamples:\r\t#(1 #(2 3) #(4 (#5))) flattened returns #(1 2 3 4 5) \r\t#('string1' #('string2' 'string3')) flattened returns #('string1' 'string2' 'string3')\"\r\t\r\t^ Array streamContents: [ :stream | self flattenOn: stream].! !\r\r!Collection methodsFor: 'enumerating' stamp: 'nice 1/5/2010 15:59'!\rdetectMin: aBlock\r\t\"Evaluate aBlock with each of the receiver's elements as the argument. \r\tAnswer the element for which aBlock evaluates to the lowest number.\r\tIf collection empty, return nil.\"\r\r\t| minElement minValue |\r\tself do: [:each | | val | \r\t\tminValue == nil\r\t\t\tifFalse: [\r\t\t\t\t(val := aBlock value: each) < minValue ifTrue: [\r\t\t\t\t\tminElement := each.\r\t\t\t\t\tminValue := val]]\r\t\t\tifTrue: [\"first element\"\r\t\t\t\tminElement := each.\r\t\t\t\tminValue := aBlock value: each].\r\t\t\t\t\"Note that there is no way to get the first element that works \r\t\t\t\tfor all kinds of Collections.  Must test every one.\"].\r\t^ minElement! !\r\r!Collection methodsFor: 'enumerating' stamp: 'GabrielOmarCotelli 11/26/2013 17:15'!\rdetect: aBlock ifNone: exceptionBlock\r\t\"Evaluate aBlock with each of the receiver's elements as the argument.  \r\tAnswer the first element for which aBlock evaluates to true. If none  \r\tevaluate to true, then evaluate the argument, exceptionBlock.\"\r\r\t^ self detect: aBlock ifFound: [ :element | element ] ifNone: exceptionBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:57'!\rdo: elementBlock separatedBy: separatorBlock\r\t\"Evaluate the elementBlock for all elements in the receiver,\r\tand evaluate the separatorBlock between.\"\r\r\t| beforeFirst | \r\tbeforeFirst := true.\r\tself do:\r\t\t[:each |\r\t\tbeforeFirst\r\t\t\tifTrue: [beforeFirst := false]\r\t\t\tifFalse: [separatorBlock value].\r\t\telementBlock value: each]! !\r\r!Collection methodsFor: 'enumerating' stamp: 'sma 4/30/2000 11:17'!\ranySatisfy: aBlock\r\t\"Evaluate aBlock with the elements of the receiver.\r\tIf aBlock returns true for any element return true.\r\tOtherwise return false.\"\r\r\tself do: [:each | (aBlock value: each) ifTrue: [^ true]].\r\t^ false! !\r\r!Collection methodsFor: 'enumerating' stamp: 'TudorGirba 3/20/2012 09:07'!\rintersection: aCollection\r\t\"Answer the set theoretic intersection of two collections.\"\r\r\t| set outputSet |\r\t\r\tset := self asSet.\r\toutputSet := Set new.\r\t\r\taCollection do: [ :each|\r\t\t((set includes: each) and: [(outputSet includes: each) not])\r\t\t\tifTrue: [ \r\t\t\t\toutputSet add: each]].\r\t\t\r\t^ self species withAll: outputSet asArray! !\r\r!Collection methodsFor: 'enumerating' stamp: 'nice 12/9/2009 15:37'!\rfindFirstInByteString: aByteString startingAt: start\r\t\"Find the index of first character starting at start in aByteString that is included in the receiver.\r\tDefault is to use a naive algorithm.\r\tSubclasses might want to implement a more efficient scheme\"\r\r\tstart to: aByteString size do:\r\t\t[:index |\r\t\t(self includes: (aByteString at: index)) ifTrue: [^ index]].\r\t^ 0! !\r\r!Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 22:09'!\rreject: rejectBlock thenCollect: collectBlock\r\t\"Utility method to improve readability.\"\r\r\t^ (self reject: rejectBlock) collect: collectBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'sma 4/30/2000 11:17'!\rallSatisfy: aBlock\r\t\"Evaluate aBlock with the elements of the receiver.\r\tIf aBlock returns false for any element return false.\r\tOtherwise return true.\"\r\r\tself do: [:each | (aBlock value: each) ifFalse: [^ false]].\r\t^ true! !\r\r!Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 22:30'!\rcollect: collectBlock thenReject: selectBlock\r\t\"Utility method to improve readability.\"\r\r\t^ (self collect: collectBlock) reject: selectBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 1/3/2010 20:15'!\rgroupBy: keyBlock having: selectBlock \r\t\"This message is deprecated. Please use groupedBy:having:. \r\tBut we let it right now without warning because we are not sure to \r\tremove in the next iteration.\"\r\r\t^ self groupedBy: keyBlock having: selectBlock ! !\r\r!Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 1/2/2012 21:08'!\rreduce: aBlock\r\t\"Fold the result of the receiver into aBlock. The argument aBlock must take two or more arguments. It applies the argument, binaryBlock cumulatively to the elements of the receiver. For sequenceable collections the elements will be used in order, for unordered collections the order is unspecified.\"\r\t\"#(1 2 3) asSet reduce: [ :a :b | a + b ]\r\t\t--> 1 + 2 + 3 = 6\r\t#(1 2 3 4 5) asSet reduce: [ :a :b :c | a + b + c ]\r\t\t--> 1 + 2 + 3 + 4 + 5 = 15\"\r\t\t\r\t^self asOrderedCollection reduce: aBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 22:32'!\rreject: aBlock \r\t\"Evaluate aBlock with each of the receiver's elements as the argument. \r\tCollect into a new collection like the receiver only those elements for \r\twhich aBlock evaluates to false. Answer the new collection.\"\r\r\t^self select: [ :element | (aBlock value: element) == false ]! !\r\r!Collection methodsFor: 'enumerating' stamp: 'jannik.laval 8/27/2010 15:54'!\rflatCollect: aBlock as: aCollectionClass\r\t\"Evaluate aBlock for each of the receiver's elements and answer the\r\tlist of all resulting values flatten one level. Assumes that aBlock returns some kind\r\tof collection for each element. Equivalent to the lisp's mapcan\"\r\t\r\t| col |\r\tself isEmpty ifTrue: [^self copy ].\r\tcol := aCollectionClass new: self size. \t\r\tself do: [ :each |\r\t\tcol addAll: (aBlock value: each) ].\r\t^col! !\r\r!Collection methodsFor: 'enumerating' stamp: 'ST 6/23/2013 11:33'!\rgather: aBlock\r\t\"This method is kept for compatibility reasons, use flatCollect instead.\"\r\t^ self flatCollect: aBlock.! !\r\r!Collection methodsFor: 'enumerating' stamp: 'TudorGirba 11/3/2013 12:12'!\rflatCollect: aBlock \r\t\"Evaluate aBlock for each of the receiver's elements and answer the\r\tlist of all resulting values flatten one level. Assumes that aBlock returns some kind\r\tof collection for each element. Equivalent to the lisp's mapcan\"\r\t\r\t| stream |\r\tself isEmpty ifTrue: [ ^ self copy ].\r\tstream := (self species new: 0) writeStream.\r\tself do: [ :each | stream nextPutAll: (aBlock value: each) ].\r\t^ stream contents! !\r\r!Collection methodsFor: 'enumerating'!\rdetectSum: aBlock\r\t\"Evaluate aBlock with each of the receiver's elements as the argument. \r\tReturn the sum of the answers.\"\r\t| sum |\r\tsum := 0.\r\tself do: [:each | \r\t\tsum := (aBlock value: each) + sum].  \r\t^ sum! !\r\r!Collection methodsFor: 'enumerating' stamp: 'AdrianKuhn 12/30/2009 09:37'!\rgroupedBy: aBlock having: aSelectionBlock\r\t\"Like in SQL operation - Split the recievers contents into collections of \r\telements for which keyBlock returns the same results, and return those \r\tcollections allowed by selectBlock.\"\r\t^ (self groupedBy: aBlock) select: aSelectionBlock\r! !\r\r!Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 9/7/2011 19:24'!\r\\ aCollection\r\t^ self difference: aCollection! !\r\r!Collection methodsFor: 'enumerating' stamp: 'BenComan 3/20/2014 00:00'!\rdo: aBlock displayingProgress: aStringOrBlock every: msecs\r       \"Enumerate aBlock displaying progress information.\r       If the argument is a string, use a static label for the process.\r       If the argument is a block, evaluate it with the element to retrieve the label.\r       The msecs argument ensures that updates happen at most every msecs.\r       Example:\r               Smalltalk allClasses\r                       do:[:aClass| (Delay forMilliseconds: 1) wait]\r                       displayingProgress:[:aClass| 'Processing ', aClass name]\r                       every: 0.\"\r\r\t| size labelBlock count oldLabel lastUpdate |\r\tself isEmpty ifTrue: [ ^ self ].\r\toldLabel := nil.\r\tcount := lastUpdate := 0.\r\tsize := self size.\r\t'' displayProgressFrom: 0 to: size during: [:bar |\r\t\tlabelBlock := aStringOrBlock isString\r\t\t\tifTrue: [\r\t\t\t\tbar label: aStringOrBlock.\r\t\t\t\t[ :dummyItem | aStringOrBlock]]\r\t\t\tifFalse: [aStringOrBlock].\r\t\tself do: [:each| | newLabel |\r\t\t\t\t\"Special handling for first and last element\"\r\t\t\t\t(count = 0 or: [count+1 = size\r\t\t\t\t\tor: [(Time millisecondsSince: lastUpdate) >= msecs]]) \r\t\t\t\t\t\tifTrue: [ \r\t\t\t\t\t\t\tbar current: count.\r\t\t\t\t\t\t\toldLabel = (newLabel := (labelBlock cull: each) ifNil: [oldLabel]) \r\t\t\t\t\t\t\t\tifFalse: \r\t\t\t\t\t\t\t\t[\tbar label: newLabel.\t\r\t\t\t\t\t\t\t\t\tProgressNotification signal: '' extra: (oldLabel := newLabel)\r\t\t\t\t\t\t\t\t].\r\t\t\t\tlastUpdate := Time millisecondClockValue ].\r                       aBlock value: each.\r                       count := count + 1]]! !\r\r!Collection methodsFor: 'enumerating'!\rassociationsDo: aBlock\r\t\"Evaluate aBlock for each of the receiver's elements (key/value \r\tassociations).  If any non-association is within, the error is not caught now,\r\tbut later, when a key or value message is sent to it.\"\r\r\tself do: aBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'AdrianKuhn 12/30/2009 09:36'!\rgroupedBy: aBlock\r\t\"Answer a dictionary whose keys are the result of evaluating aBlock\r\tfor all my elements, and the value for each key is the selection of \r\tmy elements that evaluated to that key. Uses species.\"\r\t| groups |\r\tgroups := PluggableDictionary integerDictionary.\r\tself do: [ :each |\r\t\t(groups at: (aBlock value: each) ifAbsentPut: [ OrderedCollection new ]) add: each ].\r\tself species ~~ OrderedCollection ifTrue: [\r\t\tgroups associationsDo: [ :association |\r\t\t\tassociation value: (self species withAll: association value) ]].\r\t^ groups\r! !\r\r!Collection methodsFor: 'enumerating' stamp: 'ST 6/19/2013 18:29'!\rflattenOn: aStream\r\r\tself do: [ :each | (each isCollection and: [each isString not]) \r\t\t\t\t\t\tifTrue: [each flattenOn: aStream]\r\t\t\t\t\t\tifFalse: [aStream nextPut: each]].! !\r\r!Collection methodsFor: 'enumerating'!\rdo: aBlock \r\t\"Evaluate aBlock with each of the receiver's elements as the argument.\"\r\r\tself subclassResponsibility! !\r\r!Collection methodsFor: 'enumerating' stamp: 'GabrielOmarCotelli 11/26/2013 16:53'!\rdetect: aBlock ifFound: foundBlock\r\t\"Evaluate aBlock with each of the receiver's elements as the argument.  \r\tIf some element evaluates aBlock to true, then cull this element into \r\tfoundBlock. \r\tIf no element matches the criteria then do nothing.\r\tAlways returns self to avoid misuse and a potential isNil check on the sender.\"\r\r\tself\r\t\tdetect: aBlock\r\t\tifFound: foundBlock\r\t\tifNone: [ \r\t\t\t\"Do nothing on purpose\"\r\t\t\t ]! !\r\r!Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 2/4/2010 15:34'!\rdo: aBlock displayingProgress: aStringOrBlock\r\t\"Enumerate aBlock displaying progress information. \r\tIf the argument is a string, use a static label for the process. \r\tIf the argument is a block, evaluate it with the element to retrieve the label.\r\t\tSmalltalk allClasses \r\t\t\tdo:[:aClass| (Delay forMilliseconds: 1) wait]\r\t\t\tdisplayingProgress: 'Processing...'.\r\t\tSmalltalk allClasses \r\t\t\tdo:[:aClass| (Delay forMilliseconds: 1) wait]\r\t\t\tdisplayingProgress:[:aClass| 'Processing ', aClass name].\r\t\"\r\t^self do: aBlock displayingProgress: aStringOrBlock every: 20! !\r\r!Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:45'!\rcollect: aBlock \r\t\"Evaluate aBlock with each of the receiver's elements as the argument.  \r\tCollect the resulting values into a collection like the receiver. Answer  \r\tthe new collection.\"\r\r\t| newCollection |\r\tnewCollection := self species new.\r\tself do: [:each | newCollection add: (aBlock value: each)].\r\t^ newCollection! !\r\r!Collection methodsFor: 'enumerating' stamp: 'nice 1/5/2010 15:59'!\rdetectMax: aBlock\r\t\"Evaluate aBlock with each of the receiver's elements as the argument. \r\tAnswer the element for which aBlock evaluates to the highest magnitude.\r\tIf collection empty, return nil.  This method might also be called elect:.\"\r\r\t| maxElement maxValue |\r\tself do: [:each | | val | \r\t\tmaxValue == nil\r\t\t\tifFalse: [\r\t\t\t\t(val := aBlock value: each) > maxValue ifTrue: [\r\t\t\t\t\tmaxElement := each.\r\t\t\t\t\tmaxValue := val]]\r\t\t\tifTrue: [\"first element\"\r\t\t\t\tmaxElement := each.\r\t\t\t\tmaxValue := aBlock value: each].\r\t\t\t\t\"Note that there is no way to get the first element that works \r\t\t\t\tfor all kinds of Collections.  Must test every one.\"].\r\t^ maxElement! !\r\r!Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:51'!\rcollect: collectBlock thenSelect: selectBlock\r\t\"Utility method to improve readability.\"\r\r\t^ (self collect: collectBlock) select: selectBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 9/7/2011 19:23'!\r& aCollection\r\t^ self intersection: aCollection! !\r\r!Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 22:18'!\rcollect: collectBlock thenDo: doBlock \r\t\"Utility method to improve readability.\"\r\t\r\t^ self do: [ :each|\r\t\tdoBlock value: (collectBlock value: each)]! !\r\r!Collection methodsFor: 'enumerating' stamp: 'gh 9/18/2001 15:59'!\rnoneSatisfy: aBlock\r\t\"Evaluate aBlock with the elements of the receiver.\r\tIf aBlock returns false for all elements return true.\r\tOtherwise return false\"\r\r\tself do: [:item | (aBlock value: item) ifTrue: [^ false]].\r\t^ true! !\r\r!Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:59'!\rselect: selectBlock thenCollect: collectBlock\r\t\"Utility method to improve readability.\"\r\r\t^ (self select: selectBlock) collect: collectBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'ul 11/21/2009 01:16'!\rcollect: aBlock as: aClass\r\t\"Evaluate aBlock with each of the receiver's elements as the argument.  \r\tCollect the resulting values into an instance of aClass. Answer the resulting collection.\"\r\r\t^(aClass new: self size) fillFrom: self with: aBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:20'!\rdetect: aBlock \r\t\"Evaluate aBlock with each of the receiver's elements as the argument. \r\tAnswer the first element for which aBlock evaluates to true.\"\r\r\t^ self detect: aBlock ifNone: [self errorNotFound: aBlock]! !\r\r!Collection methodsFor: 'enumerating' stamp: 'GabrielOmarCotelli 11/26/2013 16:53'!\rdetect: aBlock ifFound: foundBlock ifNone: exceptionBlock\r\t\"Evaluate aBlock with each of the receiver's elements as the argument.  \r\tIf some element evaluates aBlock to true, then cull this element into \r\tfoundBlock and answer the result of this evaluation. \r\tIf none evaluate to true, then evaluate exceptionBlock.\"\r\r\tself\r\t\tdo: [ :each | \r\t\t\t(aBlock value: each)\r\t\t\t\tifTrue: [ ^ foundBlock cull: each ] ].\r\t^ exceptionBlock value\t! !\r\r!Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 2/1/2011 07:34'!\rfold: binaryBlock\r\t\"Evaluate the block with the first two elements of the receiver,\r\tthen with the result of the first evaluation and the next element,\r\tand so on.  Answer the result of the final evaluation. If the receiver\r\tis empty, raise an error. If the receiver has a single element, answer\r\tthat element.\"\r\t\"#('if' 'it' 'is' 'to' 'be' 'it' 'is' 'up' 'to' 'me') fold: [:a :b | a, ' ', b]\"\r\r\t^self reduce: binaryBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:52'!\rcount: aBlock \r\t\"Evaluate aBlock with each of the receiver's elements as the argument.  \r\tAnswer the number of elements that answered true.\"\r\r\t| sum |\r\tsum := 0.\r\tself do: [:each | (aBlock value: each) ifTrue: [sum := sum + 1]].\r\t^ sum! !\r\r!Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:59'!\rdo: aBlock without: anItem \r\t\"Enumerate all elements in the receiver. \r\tExecute aBlock for those elements that are not equal to the given item\"\r\r\t^ self do: [:each | anItem = each ifFalse: [aBlock value: each]]! !\r\r!Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 9/7/2011 19:24'!\r| aCollection\r\t^ self union: aCollection! !\r\r!Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 5/20/2012 18:50'!\rpiecesCutWhere: binaryBlock do: pieceBlock\r\t\"Evaluate pieceBlock with substrings of the receiver derived from cutting the receiver at points where binaryBlock answers true for adjacent elements.\"\r\r\t| size lastCut this next |\r\t(size := self size) <= 1 ifTrue:\r\t\t [size = 1 ifTrue: [pieceBlock value: self].\r\t\t^self].\r\tlastCut := 1.\r\tthis := self at: 1.\r\t2 to: size do:\r\t\t[:i|\r\t\tnext := self at: i.\r\t\t(binaryBlock value: this value: next) ifTrue:\r\t\t\t[pieceBlock value: (self copyFrom: lastCut to: i - 1).\r\t\t\tlastCut := i].\r\t\tthis := next].\r\tpieceBlock value: (self copyFrom: lastCut to: size)! !\r\r!Collection methodsFor: 'enumerating' stamp: 'TudorGirba 3/20/2012 09:06'!\runion: aCollection\r\t\"Answer the set theoretic union of two collections.\"\r\t\r\t| set |\r\t\r\tset := self asSet addAll: aCollection; yourself.\r\t\r\t^ self species withAll: set asArray! !\r\r!Collection methodsFor: 'enumerating' stamp: 'TudorGirba 11/3/2013 12:12'!\rflatCollectAsSet: aBlock\r\t\"Evaluate aBlock for each of the receiver's elements and answer the\r\tlist of all resulting values flatten one level. Assumes that aBlock returns some kind\r\tof collection for each element. Equivalent to the lisp's mapcan\"\r\t\r\t^ self flatCollect: aBlock as: Set! !\r\r!Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 22:20'!\rpiecesCutWhere: binaryBlock\r\t\"Answer substrings of the receiver derived from cutting the receiver at points where binaryBlock answers true for adjacent elements.\"\r\r\t| pieces |\r\tpieces := OrderedCollection new.\r\tself \r\t\tpiecesCutWhere: binaryBlock\r\t\tdo: [ :piece | pieces add: piece ].\r\t^pieces\r\r       \"'Now is the time for all good people to come to the aid of the cause of world peace.  It is just fine, even desirable, to love your country, if that means wanting it to play a beneficial role in the course of world events and be the best possible example of a good society.  But if it means wanting dominion over the rest of the world, it is not love but defensiveness or self-glorification, and will lead only to oblivion.'  piecesCutWhere: [:a :b| a = $. and: [b isSeparator]]\"! !\r\r!Collection methodsFor: 'enumerating' stamp: 'hfm 2/12/2009 13:38'!\rselect: selectBlock thenDo: doBlock\r    \"Utility method to improve readability.\r\tDo not create the intermediate collection.\"\r\r    self do: [: each |\r        ( selectBlock value: each ) \r\t\t\tifTrue: [ doBlock value: each ]\r    ].! !\r\r!Collection methodsFor: 'enumerating' stamp: 'ul 11/21/2009 01:16'!\rcollect: aBlock into: aCollection\r\t\"Evaluate aBlock with each of the receiver's elements as the argument.  \r\tCollect the resulting values into aCollection. Answer aCollection.\"\r\r\t^aCollection fillFrom: self with: aBlock! !\r\r!Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 10/20/2012 21:50'!\rselect: aBlock \r\t\"Evaluate aBlock with each of the receiver's elements as the argument. \r\tCollect into a new collection like the receiver, only those elements for \r\twhich aBlock evaluates to true. Answer the new collection.\"\r\r\t| newCollection |\r\tnewCollection := self copyEmpty.\r\tself do: [ :each | \r\t\t(aBlock value: each) \r\t\t\tifTrue: [ newCollection add: each ]].\r\t^newCollection! !\r\r!Collection methodsFor: 'enumerating'!\rinject: thisValue into: binaryBlock \r\t\"Accumulate a running value associated with evaluating the argument, \r\tbinaryBlock, with the current value of the argument, thisValue, and the \r\treceiver as block arguments. For instance, to sum the numeric elements \r\tof a collection, aCollection inject: 0 into: [:subTotal :next | subTotal + \r\tnext].\"\r\r\t| nextValue |\r\tnextValue := thisValue.\r\tself do: [:each | nextValue := binaryBlock value: nextValue value: each].\r\t^nextValue! !\r\r!Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 3/14/2014 20:54'!\rdifference: aCollection\r\t\"Answer the set theoretic difference of two collections.\"\r\r\t\"#(a b c d e f) difference:  #(a b z k)\r\t=> #(#f #d #e #c)\r\t\r\t#(a b z k) difference: #(a b c d e f) \r\t=> #(#k #z) \r\t\"\r\r\t| set |\r\tset := self asSet.\r\taCollection do: [ :each | set remove: each ifAbsent: [  ] ].\r\t^ self species withAll: set asArray! !\r\r!Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'!\rmergeIntoMetacelloRepositories: aMetacelloRepositoriesSpec\r\r\tself do: [:each | each mergeIntoMetacelloRepositories: aMetacelloRepositoriesSpec ]\r! !\r\r!Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'!\rremoveFromMetacelloRepositories: aMetacelloRepositoriesSpec\r\r\tself do: [:each | each removeFromMetacelloRepositories: aMetacelloRepositoriesSpec ]\r! !\r\r!Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'!\rloadRequiredForMetacelloMCVersion: aMetacelloMCVersion\r\r\t^aMetacelloMCVersion doLoadRequiredFromArray: self.! !\r\r!Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'!\rresolvePackageSpecsNamedForMetacelloMCVersion: aMetacelloMCVersion visited: visited ifAbsent: aBlock\r    ^ aMetacelloMCVersion\r        allPackagesForSpecs: (self collect: [ :ea | aMetacelloMCVersion packageNamed: ea ifAbsent: aBlock ])\r        visited: visited! !\r\r!Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'!\rrecordRequiredForMetacelloMCVersion: aMetacelloMCVersion\r\r\t^aMetacelloMCVersion doRecordRequiredFromArray: self.! !\r\r!Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'!\rfetchRequiredForMetacelloMCVersion: aMetacelloMCVersion\r\r\t^aMetacelloMCVersion doFetchRequiredFromArray: self.! !\r\r!Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'!\raddToMetacelloRepositories: aMetacelloRepositoriesSpec\r\r\tself do: [:each | each addToMetacelloRepositories: aMetacelloRepositoriesSpec ]\r! !\r\r!Collection methodsFor: 'adding' stamp: 'sma 5/12/2000 17:23'!\raddIfNotPresent: anObject\r\t\"Include anObject as one of the receiver's elements, but only if there\r\tis no such element already. Anwser anObject.\"\r\r\t(self includes: anObject) ifFalse: [self add: anObject].\r\t^ anObject! !\r\r!Collection methodsFor: 'adding' stamp: 'sma 5/12/2000 17:21'!\radd: newObject withOccurrences: anInteger\r\t\"Add newObject anInteger times to the receiver. Answer newObject.\"\r\r\tanInteger timesRepeat: [self add: newObject].\r\t^ newObject! !\r\r!Collection methodsFor: 'adding'!\radd: newObject \r\t\"Include newObject as one of the receiver's elements. Answer newObject. \r\tArrayedCollections cannot respond to this message.\"\r\r\tself subclassResponsibility! !\r\r!Collection methodsFor: 'adding' stamp: 'sma 5/12/2000 17:26'!\raddAll: aCollection \r\t\"Include all the elements of aCollection as the receiver's elements. Answer \r\taCollection. Actually, any object responding to #do: can be used as argument.\"\r\r\taCollection do: [:each | self add: each].\r\t^ aCollection! !\r\r!Collection methodsFor: 'adapting' stamp: 'di 11/6/1998 13:37'!\radaptToString: rcvr andSend: selector\r\t\"If I am involved in arithmetic with a String, convert it to a Number.\"\r\t^ rcvr asNumber perform: selector with: self! !\r\r!Collection methodsFor: 'adapting' stamp: 'di 11/6/1998 13:37'!\radaptToPoint: rcvr andSend: selector\r\t\"If I am involved in arithmetic with a scalar, return a Collection of\r\tthe results of each element combined with the scalar in that expression.\"\r\r\t^ self collect: [:element | rcvr perform: selector with: element]! !\r\r!Collection methodsFor: 'adapting' stamp: 'di 11/9/1998 12:16'!\radaptToNumber: rcvr andSend: selector\r\t\"If I am involved in arithmetic with a scalar, return a Collection of\r\tthe results of each element combined with the scalar in that expression.\"\r\r\t^ self collect: [:element | rcvr perform: selector with: element]! !\r\r!Collection methodsFor: 'adapting' stamp: 'ClementBera 9/30/2013 10:59'!\radaptToCollection: rcvr andSend: selector\r\t\"If I am involved in arithmetic with another Collection, return a Collection of\r\tthe results of each element combined with the scalar in that expression.\"\r\r\t(rcvr isSequenceable and: [ self isSequenceable ]) ifFalse:\r\t\t[self error: 'Only sequenceable collections may be combined arithmetically'].\r\t^ rcvr with: self collect:\r\t\t[:rcvrElement :myElement | rcvrElement perform: selector with: myElement]! !\r\r!Collection methodsFor: 'printing' stamp: 'gk 1/14/2005 08:27'!\rasStringOn: aStream delimiter: delimString\r\t\"Print elements on a stream separated\r\twith a delimiter String like: 'a, b, c'\r\tUses #asString instead of #print:.\"\r\r\tself do: [:elem | aStream nextPutAll: elem asString]\r\t\tseparatedBy: [aStream nextPutAll: delimString]! !\r\r!Collection methodsFor: 'printing' stamp: 'gk 1/14/2005 08:20'!\rasCommaStringAnd\r\t\"Return collection printed as 'a, b and c' \"\r\r\t^String streamContents: [:s | self asStringOn: s delimiter: ', ' last: ' and ']\r\t\t! !\r\r!Collection methodsFor: 'printing' stamp: 'gk 1/14/2005 08:27'!\rasStringOn: aStream delimiter: delimString last: lastDelimString\r\t\"Print elements on a stream separated\r\twith a delimiter between all the elements and with\r\ta special one before the last like: 'a, b and c'.\r\tUses #asString instead of #print:\r\r\tNote: Feel free to improve the code to detect the last element.\"\r\r\t| n sz |\r\tn := 1.\r\tsz := self size.\r\tself do: [:elem |\r\t\tn := n + 1.\r\t\taStream nextPutAll: elem asString]\r\tseparatedBy: [\r\t\taStream nextPutAll: (n = sz ifTrue: [lastDelimString] ifFalse: [delimString])]! !\r\r!Collection methodsFor: 'printing' stamp: 'sma 6/1/2000 09:41'!\rprintNameOn: aStream\r\tsuper printOn: aStream! !\r\r!Collection methodsFor: 'printing' stamp: 'fbs 1/14/2005 10:54'!\rprintOn: aStream delimiter: delimString last: lastDelimString\r\t\"Print elements on a stream separated\r\twith a delimiter between all the elements and with\r\ta special one before the last like: 'a, b and c'\r\r\tNote: Feel free to improve the code to detect the last element.\"\r\r\t| n sz |\r\tn := 1.\r\tsz := self size.\r\tself do: [:elem |\r\t\tn := n + 1.\r\t\taStream print: elem]\r\tseparatedBy: [\r\t\tn = sz\r\t\t\tifTrue: [aStream print: lastDelimString]\r\t\t\tifFalse: [aStream print: delimString]]! !\r\r!Collection methodsFor: 'printing'!\rstoreOn: aStream \r\t\"Refer to the comment in Object|storeOn:.\"\r\r\t| noneYet |\r\taStream nextPutAll: '(('.\r\taStream nextPutAll: self class name.\r\taStream nextPutAll: ' new)'.\r\tnoneYet := true.\r\tself do: \r\t\t[:each | \r\t\tnoneYet\r\t\t\tifTrue: [noneYet := false]\r\t\t\tifFalse: [aStream nextPut: $;].\r\t\taStream nextPutAll: ' add: '.\r\t\taStream store: each].\r\tnoneYet ifFalse: [aStream nextPutAll: '; yourself'].\r\taStream nextPut: $)! !\r\r!Collection methodsFor: 'printing' stamp: 'apb 4/21/2006 09:37'!\rprintElementsOn: aStream\r\t\"The original code used #skip:, but some streams do not support that,\r\t and we don't really need it.\"\r\r\taStream nextPut: $(.\r\tself do: [:element | aStream print: element] separatedBy: [aStream space].\r\taStream nextPut: $)! !\r\r!Collection methodsFor: 'printing' stamp: 'gk 1/14/2005 08:19'!\rasCommaString\r\t\"Return collection printed as 'a, b, c' \"\r\r\t^String streamContents: [:s | self asStringOn: s delimiter: ', ']\r\t\t! !\r\r!Collection methodsFor: 'printing' stamp: 'gk 1/14/2005 08:01'!\rprintOn: aStream delimiter: delimString\r\t\"Print elements on a stream separated\r\twith a delimiter String like: 'a, b, c' \"\r\r\tself do: [:elem | aStream print: elem] separatedBy: [aStream print: delimString]\r\t\t! !\r\r!Collection methodsFor: 'printing' stamp: 'sma 6/1/2000 09:41'!\rprintOn: aStream \r\t\"Append a sequence of characters that identify the receiver to aStream.\"\r\r\tself printNameOn: aStream.\r\tself printElementsOn: aStream! !\r\r!Collection methodsFor: '*zinc-resource-meta-core' stamp: 'SvenVanCaekenberghe 3/16/2013 20:24'!\raddedToZnUrl: url \r\t^ url withPathSegments: self! !\r\r!Collection methodsFor: 'accessing' stamp: 'nice 4/19/2011 00:26'!\ratRandom: aGenerator\r\t\"Answer a random element of the receiver. Uses aGenerator which\r    should be kept by the user in a variable and used every time. Use\r    this instead of #atRandom for better uniformity of random numbers because \r\tonly you use the generator. Causes an error if self has no elements.\"\r\t| rand index |\r\r\tself emptyCheck.\r\trand := aGenerator nextInt: self size.\r\tindex := 1.\r\tself do: [:each |\r\t\tindex = rand ifTrue: [^each].\r\t\tindex := index + 1].\r\t^ self errorEmptyCollection\r! !\r\r!Collection methodsFor: 'accessing' stamp: 'sma 5/12/2000 11:34'!\rsize\r\t\"Answer how many elements the receiver contains.\"\r\r\t| tally |\r\ttally := 0.\r\tself do: [:each | tally := tally + 1].\r\t^ tally! !\r\r!Collection methodsFor: 'accessing' stamp: 'sd 11/4/2003 22:05'!\ratRandom\r\t\"Answer a random element of the receiver.  Uses a shared random \r\tnumber generator owned by class Collection.  If you use this a lot, \r\tdefine your own instance of Random and use #atRandom:.  Causes \r\tan error if self has no elements.\"\r\r\t^ self class mutexForPicking critical: [\r\t\tself atRandom: self class randomForPicking ]\r\r\"Examples:\r\t#('one' 'or' 'the' 'other') atRandom\r\t(1 to: 10) atRandom\r\t'Just pick one of these letters at random' atRandom\r\t#(3 7 4 9 21) asSet atRandom\t\t(just to show it also works for Sets)\r\"! !\r\r!Collection methodsFor: 'accessing' stamp: 'sma 5/12/2000 11:41'!\rcapacity\r\t\"Answer the current capacity of the receiver.\"\r\r\t^ self size! !\r\r!Collection methodsFor: 'accessing' stamp: 'sma 5/12/2000 11:33'!\ranyOne\r\t\"Answer a representative sample of the receiver. This method can\r\tbe helpful when needing to preinfer the nature of the contents of \r\tsemi-homogeneous collections.\"\r\r\tself emptyCheck.\r\tself do: [:each | ^ each]! !\r\r!Collection methodsFor: '*Fuel' stamp: 'MartinDias 5/19/2011 23:41'!\raddIfNotPresent: anObject ifPresentDo: aBlock\r\t\"Include anObject as one of the receiver's elements and then value aBlock, but only if there\r\tis no such element already. Anwser anObject.\"\r\r\t(self includes: anObject) \r\t\tifFalse: [ self add: anObject ]\r\t\tifTrue: [ aBlock value ].\r\t^ anObject! !\r\r!Collection methodsFor: '*Keymapping-KeyCombinations' stamp: 'GuillermoPolito 6/28/2013 13:02'!\rasShortcut\r\t^ self asKeyCombination! !\r\r!Collection methodsFor: '*Keymapping-KeyCombinations' stamp: 'GuillermoPolito 3/19/2013 19:12'!\rasKeyCombination\r\t| shortcut |\r\tself size = 1 ifTrue: [ ^self first asKeyCombination ].\r\r\tshortcut := KMKeyCombinationSequence new.\r\tself do: [ :each | shortcut addShortcut: each asKeyCombination ].\r\t^shortcut.! !\r\r!Collection methodsFor: 'filter streaming' stamp: 'sma 5/12/2000 12:07'!\rcontents\r\t^ self! !\r\r!Collection methodsFor: 'filter streaming' stamp: 'sma 5/12/2000 12:07'!\rwrite: anObject \r\t^ self add: anObject! !\r\r!Collection methodsFor: 'copying' stamp: 'ar 2/11/2001 01:55'!\rcopyWithDependent: newElement\r\t\"Answer a new collection with newElement added (as last\r\telement if sequenceable).\"\r\t^self copyWith: newElement! !\r\r!Collection methodsFor: 'copying' stamp: 'sma 5/12/2000 18:08'!\rcopyWithoutAll: aCollection\r\t\"Answer a copy of the receiver that does not contain any elements \r\tequal to those in aCollection.\"\r\r\t^ self reject: [:each | aCollection includes: each]! !\r\r!Collection methodsFor: 'copying' stamp: 'CamilloBruni 10/20/2012 21:49'!\rcopyEmpty\r\t^ self species new! !\r\r!Collection methodsFor: 'copying' stamp: 'sma 5/12/2000 14:43'!\rcopyWithout: oldElement \r\t\"Answer a copy of the receiver that does not contain any\r\telements equal to oldElement.\"\r\r\t^ self reject: [:each | each = oldElement]\r\r\"Examples:\r\t'fred the bear' copyWithout: $e\r\t#(2 3 4 5 5 6) copyWithout: 5\r\"! !\r\r!Collection methodsFor: 'copying' stamp: 'al 12/12/2003 14:31'!\r, aCollection\r\t^self copy addAll: aCollection; yourself! !\r\r!Collection methodsFor: 'copying' stamp: 'sma 5/12/2000 14:41'!\rcopyWith: newElement\r\t\"Answer a new collection with newElement added (as last\r\telement if sequenceable).\"\r\r\t^ self copy\r\t\tadd: newElement;\r\t\tyourself! !\r\r!Collection methodsFor: 'math functions' stamp: 'TAG 11/6/1998 16:00'!\rmedian\r\t^ self asSortedCollection median! !\r\r!Collection methodsFor: 'math functions' stamp: 'TudorGirba 11/19/2013 21:37'!\rsumNumbers: aBlock\r\t\"This is implemented using a variant of the normal inject:into: pattern\r\tthat is specific to handling numbers. aBlock is expected to return a number\r\tfor every element in the collection.\r\t\r\tDifferent from the sum: implementation, the default value is zero. While sum: is \r\tmore general, sumNumbers: is meant to support the most often encountered use case of\r\tdealing with numbers.\"\r\r\t^ self \r\t\tinject: 0 \r\t\tinto: [ :sum :each |  sum + (aBlock value: each) ]! !\r\r!Collection methodsFor: 'math functions' stamp: 'MarcusDenker 8/15/2010 11:01'!\rstdev\r\t| avg sample sum |\r\tavg := self average. \r\t\"see comment in self sum\"\r\tsample := self anyOne.\r\tsum := self inject: sample into: [:accum :each | accum + (each - avg) squared].\r\tsum := sum - sample.\r\t^ (sum / (self size - 1)) sqrt! !\r\r!Collection methodsFor: 'math functions' stamp: 'JuanVuletich 10/11/2010 20:15'!\rsum: aBlock\r\t\"This is implemented using a variant of the normal inject:into: pattern. \r\tThe reason for this is that it is not known whether we're in the normal \r\tnumber line, i.e. whether 0 is a good initial value for the sum. \r\tConsider a collection of measurement objects, 0 would be the unitless \r\tvalue and would not be appropriate to add with the unit-ed objects.\"\r\t| sum sample |\r\tsample := aBlock value: self anyOne.\r\tsum := self inject: sample into: [ :previousValue :each |  previousValue + (aBlock value: each) ].\r\t^ sum - sample! !\r\r!Collection methodsFor: '*Tool-Explorer' stamp: 'yo 8/27/2008 23:29'!\rexplorerContentsWithIndexCollect: twoArgBlock\r\r\t^ self asOrderedCollection withIndexCollect: twoArgBlock\r! !\r\r!Collection methodsFor: '*Tool-Explorer' stamp: 'yo 8/27/2008 23:45'!\rexplorerContents\r\r\t^self explorerContentsWithIndexCollect: [:value :index |\r\t\tObjectExplorerWrapper\r\t\t\twith: value\r\t\t\tname: index printString\r\t\t\tmodel: self]! !\r\r!Collection methodsFor: 'removing' stamp: 'nice 9/14/2009 20:30'!\rremoveAll\r\t\"Remove each element from the receiver and leave it empty.\r\tArrayedCollections cannot respond to this message.\r\tThere are two good reasons why a subclass should override this message:\r\t1) the subclass does not support being modified while being iterated\r\t2) the subclass provides a much faster way than iterating through each element\"\r\r\tself do: [:each | self remove: each].! !\r\r!Collection methodsFor: 'removing' stamp: 'sma 5/12/2000 11:19'!\rremoveAllSuchThat: aBlock \r\t\"Evaluate aBlock for each element and remove all that elements from\r\tthe receiver for that aBlock evaluates to true.  Use a copy to enumerate \r\tcollections whose order changes when an element is removed (i.e. Sets).\"\r\r\tself copy do: [:each | (aBlock value: each) ifTrue: [self remove: each]]! !\r\r!Collection methodsFor: 'removing' stamp: 'nice 1/10/2009 00:01'!\rremoveAll: aCollection \r\t\"Remove each element of aCollection from the receiver. If successful for \r\teach, answer aCollection. Otherwise create an error notification.\r\tArrayedCollections cannot respond to this message.\"\r\r\taCollection == self ifTrue: [^self removeAll].\r\taCollection do: [:each | self remove: each].\r\t^ aCollection! !\r\r!Collection methodsFor: 'removing' stamp: 'sma 5/12/2000 11:22'!\rremove: oldObject \r\t\"Remove oldObject from the receiver's elements. Answer oldObject \r\tunless no element is equal to oldObject, in which case, raise an error.\r\tArrayedCollections cannot respond to this message.\"\r\r\t^ self remove: oldObject ifAbsent: [self errorNotFound: oldObject]! !\r\r!Collection methodsFor: 'removing' stamp: 'sma 5/12/2000 11:14'!\rremove: oldObject ifAbsent: anExceptionBlock \r\t\"Remove oldObject from the receiver's elements. If several of the \r\telements are equal to oldObject, only one is removed. If no element is \r\tequal to oldObject, answer the result of evaluating anExceptionBlock. \r\tOtherwise, answer the argument, oldObject. ArrayedCollections cannot \r\trespond to this message.\"\r\r\tself subclassResponsibility! !\r\r!Collection methodsFor: 'removing' stamp: 'sma 5/12/2000 11:16'!\rremoveAllFoundIn: aCollection \r\t\"Remove each element of aCollection which is present in the receiver \r\tfrom the receiver. Answer aCollection. No error is raised if an element\r\tisn't found. ArrayedCollections cannot respond to this message.\"\r\r\taCollection do: [:each | self remove: each ifAbsent: []].\r\t^ aCollection! !\r\r!Collection methodsFor: 'private' stamp: 'ul 11/21/2009 01:14'!\rfillFrom: aCollection with: aBlock\r\t\"Evaluate aBlock with each of aCollections's elements as the argument.  \r\tCollect the resulting values into self. Answer self.\"\r\r\taCollection do: [ :each |\r\t\tself add: (aBlock value: each) ]! !\r\r!Collection methodsFor: 'private' stamp: 'SvenVanCaekenberghe 4/18/2011 14:37'!\rerrorNotFound: anObject\r\t\"Raise a NotFound exception.\"\r\r\tNotFound signalFor: anObject! !\r\r!Collection methodsFor: 'private' stamp: 'SvenVanCaekenberghe 4/18/2011 14:58'!\rerrorNoMatch\r\t\"Signal a SizeMismatch exception\"\r\r\tSizeMismatch signal! !\r\r!Collection methodsFor: 'private'!\rtoBraceStack: itsSize \r\t\"Push receiver's elements onto the stack of thisContext sender.  Error if receiver does\r\t not have itsSize elements or if receiver is unordered.\r\t Do not call directly: this is called by {a. b} := ... constructs.\"\r\r\tself size ~= itsSize ifTrue:\r\t\t[self error: 'Trying to store ', self size printString,\r\t\t\t\t\t' values into ', itsSize printString, ' variables.'].\r\tthisContext sender push: itsSize fromIndexable: self! !\r\r!Collection methodsFor: 'private' stamp: 'SvenVanCaekenberghe 4/18/2011 14:59'!\rerrorEmptyCollection\r\t\"Signal a CollectionIsEmpty exception\"\r\r\tCollectionIsEmpty signalWith: self! !\r\r!Collection methodsFor: 'private' stamp: 'yo 6/29/2004 13:14'!\rerrorNotKeyed\r\r\tself error: ('Instances of {1} do not respond to keyed accessing messages.' translated format: {self class name})\r! !\r\r!Collection methodsFor: 'private'!\remptyCheck\r\r\tself isEmpty ifTrue: [self errorEmptyCollection]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:20'!\rarcTan\r\t^self collect: [:each | each arcTan]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:22'!\rtan\r\t^self collect: [:each | each tan]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:53'!\rreciprocal\r\t\"Return the reciever full of reciprocated elements\"\r\t^ self collect: [:a | a reciprocal]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:51'!\rceiling\r\t^ self collect: [:a | a ceiling]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:21'!\rln\r\t^self collect: [:each | each ln]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:54'!\rtruncated\r\t^ self collect: [:a | a truncated]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:20'!\rarcCos\r\t^self collect: [:each | each arcCos]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:20'!\rcos\r\t^self collect: [:each | each cos]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:22'!\rsin\r\t^self collect: [:each | each sin]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:21'!\rexp\r\t^self collect: [:each | each exp]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:53'!\rrounded\r\t^ self collect: [:a | a rounded]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:52'!\rlog\r\t^ self collect: [:each | each log]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:53'!\rsqrt\r\t^ self collect: [:each | each sqrt]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:51'!\rabs\r\t\"Absolute value of all elements in the collection\"\r\t^ self collect: [:a | a abs]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:20'!\rarcSin\r\t^self collect: [:each | each arcSin]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'nk 12/30/2003 15:47'!\rroundTo: quantum\r\t^self collect: [ :ea | ea roundTo: quantum ]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:52'!\rnegated\r\t\"Negated value of all elements in the collection\"\r\t^ self collect: [:a | a negated]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:53'!\rsquared\r\t^ self collect: [:each | each * each]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:23'!\rsign\r\t^self collect: [:each | each sign]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:20'!\rdegreeCos\r\t^self collect: [:each | each degreeCos]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:51'!\rfloor\r\t^ self collect: [:a | a floor]! !\r\r!Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:21'!\rdegreeSin\r\t^self collect: [:each | each degreeSin]! !\r\r!Collection methodsFor: '*metacello-core' stamp: 'dkh 6/6/2009 11:42'!\rremoveFromMetacelloPackages: aMetacelloPackagesSpec\r\r\tself do: [:each | each removeFromMetacelloPackages: aMetacelloPackagesSpec ]\r! !\r\r!Collection methodsFor: '*metacello-core' stamp: 'dkh 9/8/2012 05:30'!\rasMetacelloAttributePath\r    ^ MetacelloMethodSectionPath withAll: self! !\r\r!Collection methodsFor: '*metacello-core' stamp: 'dkh 6/6/2009 10:08'!\rsetRequiresInMetacelloPackage: aMetacelloPackageSpec\r\r\taMetacelloPackageSpec setRequires: self asArray.! !\r\r!Collection methodsFor: '*metacello-core' stamp: 'dkh 9/7/2012 13:10'!\rasMetacelloAttributeList\r    ^ self! !\r\r!Collection methodsFor: '*metacello-core' stamp: 'dkh 9/5/2012 06:26:03.064'!\rsetForVersion: aString withInMetacelloConfig: aMetacelloConstructore\r    aMetacelloConstructore setFor: self version: aString! !\r\r!Collection methodsFor: '*metacello-core' stamp: 'dkh 6/6/2009 11:45'!\raddToMetacelloPackages: aMetacelloPackagesSpec\r\r\tself do: [:each | each addToMetacelloPackages: aMetacelloPackagesSpec ]\r! !\r\r!Collection methodsFor: '*metacello-core' stamp: 'dkh 6/8/2009 19:02'!\rsetLoadsInMetacelloProject: aMetacelloPackageSpec\r\r\taMetacelloPackageSpec setLoads: self asArray.! !\r\r!Collection methodsFor: '*metacello-core' stamp: 'dkh 6/6/2009 11:46'!\rmergeIntoMetacelloPackages: aMetacelloPackagesSpec\r\r\tself do: [:each | each mergeIntoMetacelloPackages: aMetacelloPackagesSpec ]\r! !\r\r!Collection methodsFor: '*metacello-core' stamp: 'dkh 9/5/2012 06:26:03.064'!\rsetForDo: aBlock withInMetacelloConfig: aMetacelloConstructore\r    aMetacelloConstructore setFor: self do: aBlock! !\r\r!Collection methodsFor: '*metacello-core' stamp: 'dkh 9/23/2009 08:46'!\rsetIncludesInMetacelloPackage: aMetacelloPackageSpec\r\r\taMetacelloPackageSpec setIncludes: self asArray.! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'TAG 11/6/1998 15:57'!\raverage\r\t^ self sum / self size! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'di 11/6/1998 13:53'!\r/ arg\r\r\t^ arg adaptToCollection: self andSend: #/! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'raok 10/22/2002 00:17'!\rraisedTo: arg\r\r\t^ arg adaptToCollection: self andSend: #raisedTo:! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'di 11/6/1998 13:54'!\r\\\\ arg\r\r\t^ arg adaptToCollection: self andSend: #\\\\! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'di 11/6/1998 13:53'!\r- arg\r\r\t^ arg adaptToCollection: self andSend: #-! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'di 11/6/1998 13:53'!\r+ arg\r\r\t^ arg adaptToCollection: self andSend: #+! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'G.C 10/23/2008 10:12'!\r* arg\r\r\t^ arg adaptToCollection: self andSend: #*! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'di 11/6/1998 13:54'!\r// arg\r\r\t^ arg adaptToCollection: self andSend: #//! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'TAG 11/6/1998 15:58'!\rmax\r\t^ self inject: self anyOne into: [:max :each | max max: each]! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'TAG 11/6/1998 16:02'!\rsum\r\t\"This is implemented using a variant of the normal inject:into: pattern. \r\tThe reason for this is that it is not known whether we're in the normal \r\tnumber line, i.e. whether 0 is a good initial value for the sum. \r\tConsider a collection of measurement objects, 0 would be the unitless \r\tvalue and would not be appropriate to add with the unit-ed objects.\"\r\t| sum sample |\r\tsample := self anyOne.\r\tsum := self inject: sample into: [:accum :each | accum + each].\r\t^ sum - sample! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'TAG 11/6/1998 16:00'!\rmin\r\t^ self inject: self anyOne into: [:min :each | min min: each]! !\r\r!Collection methodsFor: '*Collections-arithmetic' stamp: 'TAG 11/6/1998 16:00'!\rrange\r\t^ self max - self min! !\r\r!Collection methodsFor: 'sorting' stamp: 'LucFabresse 6/28/2013 12:58'!\rsorted\r\t\"Return a new sequenceable collection which contains the same elements as self but its \relements are sorted\"\r\t\r\t^self asArray sorted! !\r\r!Collection methodsFor: 'sorting' stamp: 'StephaneDucasse 3/28/2010 22:42'!\rsorted: aSortBlockOrNil\r\t\"Return a new sequenceable collection which contains the same elements as self but its \relements are sorted by aSortBlockOrNil. The block should take two arguments and return true if \rthe first element should preceed the second one. If aSortBlock is nil then <= is used for \rcomparison.\"\r\t\r\t^self asArray sort: aSortBlockOrNil! !\r\r!Collection methodsFor: 'converting' stamp: 'sma 5/6/2000 20:22'!\rasArray\r\t\"Answer an Array whose elements are the elements of the receiver.\r\tImplementation note: Cannot use ''Array withAll: self'' as that only\r\tworks for SequenceableCollections which support the replacement \r\tprimitive.\"\r\r\t| array index |\r\tarray := Array new: self size.\r\tindex := 0.\r\tself do: [:each | array at: (index := index + 1) put: each].\r\t^ array! !\r\r!Collection methodsFor: 'converting' stamp: 'StephaneDucasse 3/28/2010 22:39'!\rasSortedCollection\r\t\"Answer a SortedCollection whose elements are the elements of the receiver. The sort order is the default less than or equal. Note that you should use #sorted: if you don't really need a SortedCollection, but a sorted collection.\"\r\r\t^ self as: SortedCollection! !\r\r!Collection methodsFor: 'converting' stamp: 'sma 5/6/2000 20:29'!\rasSet\r\t\"Answer a Set whose elements are the unique elements of the receiver.\"\r\r\t^ Set withAll: self! !\r\r!Collection methodsFor: 'converting' stamp: 'sma 5/6/2000 20:26'!\rasCharacterSet\r\t\"Answer a CharacterSet whose elements are the unique elements of the receiver.\r\tThe reciever should only contain characters.\"\r\r\t^ CharacterSet newFrom: self! !\r\r!Collection methodsFor: 'converting' stamp: 'StephaneDucasse 3/28/2010 22:41'!\rasSortedCollection: aSortBlock \r\t\"Answer a SortedCollection whose elements are the elements of the receiver. The sort order is defined by the argument, aSortBlock. Note that this is better to use #sorted: if you don't really need a SortedCollection, but a sorted collection!!!!\"\r\r\t| aSortedCollection |\r\taSortedCollection := SortedCollection new: self size.\r\taSortedCollection sortBlock: aSortBlock.\r\taSortedCollection addAll: self.\r\t^ aSortedCollection! !\r\r!Collection methodsFor: 'converting' stamp: 'sma 5/12/2000 17:43'!\rasOrderedCollection\r\t\"Answer an OrderedCollection whose elements are the elements of the\r\treceiver. The order in which elements are added depends on the order\r\tin which the receiver enumerates its elements. In the case of unordered\r\tcollections, the ordering is not necessarily the same for multiple \r\trequests for the conversion.\"\r\r\t^ self as: OrderedCollection! !\r\r!Collection methodsFor: 'converting' stamp: 'sma 5/6/2000 20:22'!\rasByteArray\r\t\"Answer a ByteArray whose elements are the elements of the receiver.\r\tImplementation note: Cannot use ''ByteArray withAll: self'' as that only\r\tworks for SequenceableCollections which support the replacement \r\tprimitive.\"\r\r\t| array index |\r\tarray := ByteArray new: self size.\r\tindex := 0.\r\tself do: [:each | array at: (index := index + 1) put: each].\r\t^ array! !\r\r!Collection methodsFor: 'converting' stamp: 'MarcusDenker 11/28/2009 11:40'!\rasDictionary\r\r\t^ self as: Dictionary! !\r\r!Collection methodsFor: 'converting' stamp: 'ar 9/22/2000 10:12'!\rasIdentitySet\r\t^(IdentitySet new: self size) addAll: self; yourself! !\r\r!Collection methodsFor: 'converting' stamp: 'sma 5/6/2000 20:10'!\rasBag\r\t\"Answer a Bag whose elements are the elements of the receiver.\"\r\r\t^ Bag withAll: self! !\r\r\r!Dictionary methodsFor: '*Fuel' stamp: 'MartinDias 2/25/2013 14:33'!\rfuelAfterMaterialization\r\t| class |\r\t\"Since for Set and IdentitySet we are recreating the collection with #add: we do not need to rehash.\"\r\tclass := self class.\r\t^ (((class == Dictionary) or: [ class == IdentityDictionary ]) ) \r\t\tifFalse: [ self rehash ] \r\t\tifTrue: [ self ]! !\r\r!Dictionary methodsFor: '*Fuel' stamp: 'MarianoMartinezPeck 7/30/2012 23:16'!\rfuelAccept: aGeneralMapper\r\t| class |\r\t\"Since we have subclasses of Dictionary that behave differently, we cannot use the visitDictionary: for all of them.\t We could also use MethodDictionary for this case, but its materialization is much slower with this cluster than with the default action.\"\r\tclass := self class.\r\t^ (((class == Dictionary) or: [class == IdentityDictionary ])) \r\t\tifTrue: [ aGeneralMapper visitDictionary: self ]\r\t\tifFalse: [ super fuelAccept: aGeneralMapper ] \r\t! !\r\r!Dictionary methodsFor: 'adding'!\radd: anAssociation\r\t| index element |\r\tindex := self findElementOrNil: anAssociation key.\r\telement := array at: index.\r\telement == nil\r\t\tifTrue: [self atNewIndex: index put: anAssociation]\r\t\tifFalse: [element value: anAssociation value].\r\t^ anAssociation! !\r\r!Dictionary methodsFor: 'adding' stamp: 'raok 12/17/2003 16:01'!\raddAll: aKeyedCollection\r\taKeyedCollection == self ifFalse: [\r\t\taKeyedCollection keysAndValuesDo: [:key :value |\r\t\t\tself at: key put: value]].\r\t^aKeyedCollection! !\r\r!Dictionary methodsFor: 'private' stamp: 'nice 11/14/2009 16:33'!\rfixCollisionsFrom: start\r\t\"The element at start has been removed and replaced by nil.\r\tThis method moves forward from there, relocating any entries\r\tthat had been placed below due to collisions with this one.\"\r\t| element index |\r\tindex := start.\r\t[ (element := array at: (index := index \\\\ array size + 1)) == nil ] whileFalse: [\r\t\t| newIndex |\r\t\t(newIndex := self findElementOrNil: element key) = index ifFalse: [\r\t\t\tarray swap: index with: newIndex ] ]! !\r\r!Dictionary methodsFor: 'private' stamp: 'CamilloBruni 8/1/2012 16:12'!\rnoCheckAdd: anObject\r\t\"Must be defined separately for Dictionary because (self findElementOrNil:) expects a key, not an association.\"\r\r\tarray at: (self findElementOrNil: anObject key) put: anObject.\r\ttally := tally + 1! !\r\r!Dictionary methodsFor: 'private' stamp: 'SvenVanCaekenberghe 4/19/2011 19:41'!\rerrorKeyNotFound: aKey\r\r\tKeyNotFound signalFor: aKey! !\r\r!Dictionary methodsFor: 'private' stamp: 'md 10/5/2005 15:42'!\rscanFor: anObject\r\t\"Scan the key array for the first slot containing either a nil (indicating an empty slot) or an element that matches anObject. Answer the index of that slot or zero if no slot is found. This method will be overridden in various subclasses that have different interpretations for matching elements.\"\r\t| element start finish |\r\tfinish := array size.\r\tstart := (anObject hash \\\\ finish) + 1.\r\r\t\"Search from (hash mod size) to the end.\"\r\tstart to: finish do:\r\t\t[:index | ((element := array at: index) == nil or: [element key = anObject])\r\t\t\tifTrue: [^ index ]].\r\r\t\"Search from 1 to where we started.\"\r\t1 to: start-1 do:\r\t\t[:index | ((element := array at: index) == nil or: [element key = anObject])\r\t\t\tifTrue: [^ index ]].\r\r\t^ 0  \"No match AND no empty slot\"! !\r\r!Dictionary methodsFor: 'private'!\rvalueAtNewKey: aKey put: anObject atIndex: index declareFrom: aDictionary \r\t\"Support for coordinating class variable and global declarations\r\twith variables that have been put in Undeclared so as to\r\tredirect all references to the undeclared variable.\"\r\r\t(aDictionary includesKey: aKey)\r\t\tifTrue: \r\t\t\t[self atNewIndex: index \r\t\t\t\tput: ((aDictionary associationAt: aKey) value: anObject).\r\t\t\taDictionary removeKey: aKey]\r\t\tifFalse: \r\t\t\t[self atNewIndex: index put: (Association key: aKey value: anObject)]! !\r\r!Dictionary methodsFor: 'private' stamp: 'ul 11/21/2009 01:15'!\rfillFrom: aCollection with: aBlock\r\t\"Evaluate aBlock with each of aCollections's elements as the argument.  \r\tCollect the resulting values into self. Answer self.\"\r\r\taCollection keysAndValuesDo: [ :key :value |\r\t\tself at: key put: (aBlock value: value) ]! !\r\r!Dictionary methodsFor: 'private' stamp: 'SvenVanCaekenberghe 4/19/2011 20:30'!\rerrorValueNotFound: value\r\r\tValueNotFound signalFor: value! !\r\r!Dictionary methodsFor: 'private'!\rrehash\r\t\"Smalltalk rehash.\"\r\t| newSelf |\r\tnewSelf := self species new: self size.\r\tself associationsDo: [:each | newSelf noCheckAdd: each].\r\tarray := newSelf array! !\r\r!Dictionary methodsFor: 'private' stamp: 'HenrikSperreJohansen 9/1/2010 23:17'!\rnoCheckNoGrowFillFrom: anArray\r\t\"Add the elements of anArray except nils to me assuming that I don't contain any of them, they are unique and I have more free space than they require.\"\r\r\t1 to: anArray size do: [ :index |\r\t\t(anArray at: index) ifNotNil: [ :association |\r\t\t\tarray\r\t\t\t\tat: (self scanForEmptySlotFor: association key)\r\t\t\t\tput: association ] ]! !\r\r!Dictionary methodsFor: 'enumerating' stamp: 'nice 10/5/2009 10:16'!\rselect: aBlock \r\t\"Evaluate aBlock with each of my values as the argument. Collect into a new dictionary, only those associations for which aBlock evaluates to true.\"\r\r\t| newCollection |\r\tnewCollection := self copyEmpty.\r\tself associationsDo: [ :each |\r\t\t(aBlock value: each value) ifTrue: [\r\t\t\tnewCollection add: each copy ] ].\r\t^newCollection! !\r\r!Dictionary methodsFor: 'enumerating' stamp: 'MarianoMartinezPeck 8/24/2012 15:26'!\rkeysAndValuesDo: aBlock\r\t^self associationsDo:[:assoc|\r\t\taBlock value: assoc key value: assoc value].! !\r\r!Dictionary methodsFor: 'enumerating' stamp: 'dtl 2/17/2003 09:40'!\rassociationsSelect: aBlock \r\t\"Evaluate aBlock with each of my associations as the argument. Collect\r\tinto a new dictionary, only those associations for which aBlock evaluates\r\tto true.\"\r\r\t| newCollection |\r\tnewCollection := self species new.\r\tself associationsDo: \r\t\t[:each | \r\t\t(aBlock value: each) ifTrue: [newCollection add: each]].\r\t^newCollection! !\r\r!Dictionary methodsFor: 'enumerating'!\rkeysDo: aBlock \r\t\"Evaluate aBlock for each of the receiver's keys.\"\r\r\tself associationsDo: [:association | aBlock value: association key]! !\r\r!Dictionary methodsFor: 'enumerating' stamp: 'ar 6/13/2008 00:16'!\rcollect: aBlock \r\t\"Evaluate aBlock with each of my values as the argument.  Collect the\r\tresulting values into a collection that is like me. Answer with the new\r\tcollection.\"\r\t| newCollection |\r\tnewCollection := self species new.\r\tself associationsDo:[:each |\r\t\tnewCollection at: each key put: (aBlock value: each value).\r\t].\r\t^newCollection! !\r\r!Dictionary methodsFor: 'enumerating' stamp: 'CamilloBruni 9/9/2011 16:50'!\rdifference: aCollection\r\t\"Answer the set theoretic difference of two collections. This is a specialized version for Dictionaries keeping the keys of the objects. At a slightly higher price of an additional Set to track duplicates.\"\r\r\t| other result duplicates |\r\t\r\tother := aCollection asSet.\r\tduplicates := Set new.\r\tresult := self class new: self size.\r\t\r\tself keysAndValuesDo: [ :key :value|\r\t\t((other includes: value) not and: [ (duplicates includes: value) not ])\r\t\t\tifTrue: [ \r\t\t\t\tduplicates add: value.\r\t\t\t\tresult at: key put: value]].\r\t\r\t^ result! !\r\r!Dictionary methodsFor: 'enumerating' stamp: 'TristanBourgois 5/10/2010 10:41'!\rassociationsDo: aBlock \r\t\"Evaluate aBlock for each of the receiver's elements (key/value \r\tassociations).\"\r\r\ttally = 0 ifTrue: [^ self].\r\tarray do:\r\t\t[:each |\r\t\teach ifNotNil: [aBlock value: each]]! !\r\r!Dictionary methodsFor: 'enumerating' stamp: 'MarcusDenker 7/2/2010 13:02'!\rdo: aBlock\r\r\t^self valuesDo: aBlock! !\r\r!Dictionary methodsFor: 'enumerating' stamp: 'SqR 11/7/2013 12:12'!\rvaluesDo: aBlock \r\t\"Evaluate aBlock for each of the receiver's values.  Implemented with == checks\r\tmerely for the sake of maximum efficiency\"\r\r\ttally = 0 ifTrue: [ ^self ].\r\t1 to: array size do:\r\t\t[ :eachIndex | \r\t\t\t| eachAssociation |\r\t\t\teachAssociation := array at: eachIndex.\r\t\t\tnil == eachAssociation ifFalse: [ aBlock value: eachAssociation value ]\r\t\t]! !\r\r!Dictionary methodsFor: 'enumerating' stamp: 'ar 5/18/2003 20:33'!\rbindingsDo: aBlock\r\t^self associationsDo: aBlock! !\r\r!Dictionary methodsFor: 'removing'!\rremoveKey: key ifAbsent: aBlock \r\t\"Remove key (and its associated value) from the receiver. If key is not in \r\tthe receiver, answer the result of evaluating aBlock. Otherwise, answer \r\tthe value externally named by key.\"\r\r\t| index assoc |\r\tindex := self findElementOrNil: key.\r\tassoc := array at: index.\r\tassoc == nil ifTrue: [ ^ aBlock value ].\r\tarray at: index put: nil.\r\ttally := tally - 1.\r\tself fixCollisionsFrom: index.\r\t^ assoc value! !\r\r!Dictionary methodsFor: 'removing'!\rremoveUnreferencedKeys   \"Undeclared removeUnreferencedKeys\"\r\r\t^ self unreferencedKeys do: [:key | self removeKey: key].! !\r\r!Dictionary methodsFor: 'removing' stamp: 'MarcusDenker 10/9/2013 11:29'!\runreferencedKeys\r\t\"| uk | (Time millisecondsToRun: [uk := TextConstants unreferencedKeys]) -> uk\"\r\r\t^'Scanning for references . . .' \r\t\tdisplayProgressFrom: 0\r\t\tto: Smalltalk globals classNames size * 2\r\t\tduring: \r\t\t\t[:bar | | currentClass n associations referencedAssociations |\r\t\t\tcurrentClass := nil.\r\t\t\tn := 0.\r\t\t\tassociations := self associations asIdentitySet.\r\t\t\treferencedAssociations := IdentitySet new: associations size.\r\t\t\tself systemNavigation allMethodsSelect:\r\t\t\t\t[:m|\r\t\t\t\tm methodClass ~~ currentClass ifTrue:\r\t\t\t\t\t[currentClass := m methodClass.\r\t\t\t\t\t bar current: (n := n + 1)].\r\t\t\t\tm literalsDo:\r\t\t\t\t\t[:l|\r\t\t\t\t\t(l isVariableBinding and: [associations includes: l]) ifTrue:\r\t\t\t\t\t\t[referencedAssociations add: l]].\r\t\t\t\tfalse].\r\t\t\t((associations reject: [:assoc | referencedAssociations includes: assoc]) collect: [:assoc| assoc key]) asSet]! !\r\r!Dictionary methodsFor: 'removing' stamp: 'di 4/4/2000 11:47'!\rkeysAndValuesRemove: keyValueBlock\r\t\"Removes all entries for which keyValueBlock returns true.\"\r\t\"When removing many items, you must not do it while iterating over the dictionary, since it may be changing.  This method takes care of tallying the removals in a first pass, and then performing all the deletions afterward.  Many places in the sytem could be simplified by using this method.\"\r\r\t| removals |\r\tremovals := OrderedCollection new.\r\tself associationsDo:\r\t\t[:assoc | (keyValueBlock value: assoc key value: assoc value)\r\t\t\tifTrue: [removals add: assoc key]].\r \tremovals do:\r\t\t[:aKey | self removeKey: aKey]! !\r\r!Dictionary methodsFor: 'removing' stamp: 'CamilloBruni 4/11/2011 13:30'!\rremoveKey: key \r\t\"Remove key from the receiver.\r\tIf key is not in the receiver, notify an error.\"\r\r\t^ self removeKey: key ifAbsent: [self errorKeyNotFound: key]! !\r\r!Dictionary methodsFor: 'removing'!\rremove: anObject\r\r\tself shouldNotImplement! !\r\r!Dictionary methodsFor: 'removing'!\rremove: anObject ifAbsent: exceptionBlock\r\r\tself shouldNotImplement! !\r\r!Dictionary methodsFor: 'copying' stamp: 'ul 9/22/2009 04:51'!\rpostCopy\r\t\"Must copy the associations, or later store will affect both the\roriginal and the copy\"\r\r\tarray := array collect: [ :association |\r\t\tassociation ifNotNil: [ association copy ] ]! !\r\r!Dictionary methodsFor: 'printing'!\rstoreOn: aStream\r\t| noneYet |\r\taStream nextPutAll: '(('.\r\taStream nextPutAll: self class name.\r\taStream nextPutAll: ' new)'.\r\tnoneYet := true.\r\tself associationsDo: \r\t\t\t[:each | \r\t\t\tnoneYet\r\t\t\t\tifTrue: [noneYet := false]\r\t\t\t\tifFalse: [aStream nextPut: $;].\r\t\t\taStream nextPutAll: ' add: '.\r\t\t\taStream store: each].\r\tnoneYet ifFalse: [aStream nextPutAll: '; yourself'].\r\taStream nextPut: $)! !\r\r!Dictionary methodsFor: 'printing' stamp: 'apb 7/14/2004 12:48'!\rprintElementsOn: aStream \r\taStream nextPut: $(.\r\tself size > 100\r\t\tifTrue: [aStream nextPutAll: 'size '.\r\t\t\tself size printOn: aStream]\r\t\tifFalse: [self keysSortedSafely\r\t\t\t\tdo: [:key | aStream print: key;\r\t\t\t\t\t\t nextPutAll: '->';\t\t\t\t\r\t\t\t\t\t\t print: (self at: key);\r\t\t\t\t\t\t space]].\r\taStream nextPut: $)! !\r\r!Dictionary methodsFor: 'comparing' stamp: 'cyrille.delaunay 7/17/2009 15:45'!\r= aDictionary\r\t\"Two dictionaries are equal if\r\t (a) they are the same 'kind' of thing.\r\t (b) they have the same set of keys.\r\t (c) for each (common) key, they have the same value\"\r\r\tself == aDictionary ifTrue: [ ^ true ].\r\t(aDictionary isDictionary) ifFalse: [^false].\r\tself size = aDictionary size ifFalse: [^false].\r\tself associationsDo: [:assoc|\r\t\t(aDictionary at: assoc key ifAbsent: [^false]) = assoc value\r\t\t\tifFalse: [^false]].\r\t^true\r\r! !\r\r!Dictionary methodsFor: '*monticellofiletree-core' stamp: 'dkh 4/6/2012 15:56:14'!\rwriteCypressJsonForHtmlOn: aStream\r    self writeCypressJsonOn: aStream forHtml: true indent: 0! !\r\r!Dictionary methodsFor: '*monticellofiletree-core' stamp: 'dkh 4/6/2012 15:56:14'!\rwriteCypressJsonOn: aStream\r    self writeCypressJsonOn: aStream forHtml: false indent: 0.\r    aStream lf! !\r\r!Dictionary methodsFor: '*monticellofiletree-core' stamp: 'dkh 4/6/2012 15:56:14'!\rwriteCypressJsonOn: aStream forHtml: forHtml indent: startIndent\r    \"by default ignore <forHtml> ... <forHtml> is used for Dictionary and Array, i.e., container objects and String which actually encodes itself differently for HTML\"\r\r    | indent keys |\r    indent := startIndent.\r    aStream\r        nextPutAll: '{';\r        lf.\r    indent := indent + 1.\r    keys := self keys sort: [ :a :b | a <= b ].\r    1 to: keys size do: [ :index | \r        | key value |\r        key := keys at: index.\r        value := self at: key.\r        aStream tab: indent.\r        key writeCypressJsonOn: aStream forHtml: forHtml indent: indent.\r        aStream nextPutAll: ' : '.\r        value writeCypressJsonOn: aStream forHtml: forHtml indent: indent.\r        index < self size\r            ifTrue: [ \r                aStream\r                    nextPutAll: ',';\r                    lf ] ].\r    self size = 0\r        ifTrue: [ aStream tab: indent ].\r    aStream nextPutAll: ' }'! !\r\r!Dictionary methodsFor: '*Tool-Explorer' stamp: 'yo 8/27/2008 23:16'!\rcustomizeExplorerContents\r\r\t^ true.\r! !\r\r!Dictionary methodsFor: '*Tool-Explorer' stamp: 'yo 8/27/2008 23:44'!\rexplorerContentsWithIndexCollect: twoArgBlock\r\r\t| sortedKeys |\r\tsortedKeys := self keys asSortedCollection: [:x :y |\r\t\t((x isString and: [y isString])\r\t\t\tor: [x isNumber and: [y isNumber]])\r\t\t\tifTrue: [x < y]\r\t\t\tifFalse: [x class == y class\r\t\t\t\tifTrue: [x printString < y printString]\r\t\t\t\tifFalse: [x class name < y class name]]].\r\t^ sortedKeys collect: [:k | twoArgBlock value: (self at: k) value: k].\r! !\r\r!Dictionary methodsFor: 'kernel'!\rdeclare: key from: aDictionary \r\t\"Add key to the receiver. If key already exists, do nothing. If aDictionary \r\tincludes key, then remove it from aDictionary and use its association as \r\tthe element of the receiver.\"\r\r\t(self includesKey: key) ifTrue: [^ self].\r\t(aDictionary includesKey: key)\r\t\tifTrue: \r\t\t\t[self add: (aDictionary associationAt: key).\r\t\t\taDictionary removeKey: key]\r\t\tifFalse: \r\t\t\t[self add: key -> nil]! !\r\r!Dictionary methodsFor: 'kernel' stamp: 'MarcusDenker 7/29/2014 16:08'!\rdeclareVariable: newGlobal from: aDictionary \r\t\"Add aGlobal to the receiver. If key already exists, do nothing. If aDictionary \r\tincludes key, then remove it from aDictionary and use its association as \r\tthe element of the receiver.\"\r\r\t| globalName |\r\tglobalName :=  newGlobal key.\r\tself associationAt: globalName ifPresent:  [:existingGlobal |\r\t\t\"need to take care to migrate existing variables to new global if class if different\"\r\t\t(existingGlobal class == newGlobal class) \r\t\t\tifTrue: [^self].\r\t\tnewGlobal value: existingGlobal value.\r\t\tself removeKey: globalName.\r\t\tself add: newGlobal.\r\t\t].\r\t(aDictionary includesKey: globalName)\r\t\tifTrue:  [\r\t\t\tself add: ((aDictionary associationAt: globalName) primitiveChangeClassTo: ClassVariable new).\r\t\t\taDictionary removeKey: globalName]\r\t\tifFalse: [\r\t\t\tself add: newGlobal]! !\r\r!Dictionary methodsFor: 'testing'!\rincludes: anObject\r\r\tself do: [:each | anObject = each ifTrue: [^true]].\r\t^false! !\r\r!Dictionary methodsFor: 'testing' stamp: 'SvenVanCaekenberghe 10/26/2013 12:24'!\rincludesKey: key \r\t\"Answer whether the receiver has a key equal to the argument, key.\"\r\t\r\t^ (array at: (self scanFor: key)) ~~ nil \r\t\"We could use #notNil here, but ProtoObject doesn't understand it.\"! !\r\r!Dictionary methodsFor: 'testing' stamp: 'tween 9/13/2004 10:11'!\rhasBindingThatBeginsWith: aString\r\t\"Answer true if the receiver has a key that begins with aString, false otherwise\"\r\t\r\tself keysDo:[:each | \r\t\t(each beginsWith: aString)\r\t\t\tifTrue:[^true]].\r\t^false! !\r\r!Dictionary methodsFor: 'testing' stamp: 'sw 3/23/2000 01:12'!\rkeyForIdentity: anObject\r\t\"If anObject is one of the values of the receive, return its key, else return nil.  Contrast #keyAtValue: in which there is only an equality check, here there is an identity check\"\r\r\tself associationsDo: [:assoc | assoc value == anObject ifTrue: [^ assoc key]].\r\t^ nil! !\r\r!Dictionary methodsFor: 'testing' stamp: 'StephaneDucasse 5/28/2011 14:01'!\risHealthy\r\t\"Test that object hashes match their positions stored in set's array,\r\tanswer true if everything ok, false otherwise\r\t\r\tDictionary allInstances select: [:dict |\r\t\tdict isHealthy not ]\r\tDictionary allSubInstances select: [:dict |\r\t\tdict isHealthy not ]\r\t\"\r\tarray withIndexDo: [:elem :i |\r\t\telem ifNotNil: [\r\t\t\t(self scanFor: elem key) == i ifFalse: [ ^ false ]\r\t\t\t]\r\t].\r\t^ true! !\r\r!Dictionary methodsFor: 'testing' stamp: 'md 8/11/2005 16:49'!\risDictionary\r\t^true! !\r\r!Dictionary methodsFor: 'testing' stamp: 'sw 2/14/2000 14:34'!\rincludesIdentity: anObject\r\t\"Answer whether anObject is one of the values of the receiver.  Contrast #includes: in which there is only an equality check, here there is an identity check\"\r\r\tself do: [:each | anObject == each ifTrue: [^ true]].\r\t^ false! !\r\r!Dictionary methodsFor: 'testing' stamp: 'ab 9/17/2004 00:39'!\rincludesAssociation: anAssociation\r  ^ (self   \r      associationAt: anAssociation key\r      ifAbsent: [ ^ false ]) value = anAssociation value\r! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'MarcusDenker 8/18/2010 19:17'!\rat: key ifAbsent: aBlock \r\t\"Answer the value associated with the key or, if key isn't found,\r\tanswer the result of evaluating aBlock.\"\r\r\t^((array at: (self findElementOrNil: key)) \r\t\t\tifNil: [aBlock] \r\t\t\tifNotNil: [:assoc | assoc]) value.! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'SvenVanCaekenberghe 4/19/2011 20:31'!\rkeyAtValue: value \r\t\"Answer the key that is the external name for the argument, value. If \r\tthere is none, signal an error.\"\r\r\t^self keyAtValue: value ifAbsent: [self errorValueNotFound: value]! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'CamilloBruni 4/11/2011 13:30'!\rat: key \r\t\"Answer the value associated with the key.\"\r\r\t^ self at: key ifAbsent: [self errorKeyNotFound: key]! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'StephaneDucasse 5/13/2010 11:37'!\rat: key ifPresent: oneArgBlock ifAbsent: absentBlock\r\t\"Lookup the given key in the receiver. If it is present, answer the value of evaluating the oneArgBlock with the value associated with the key, otherwise answer the value of absentBlock.\"\r\t\r\tself at: key ifPresent: [ :v | ^oneArgBlock value: v ].\r\t^absentBlock value! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'StephaneDucasse 12/25/2009 12:12'!\rassociations\r\t\"Answer a Collection containing the receiver's associations.\"\r\t\"Suggested by l. Uzonyi\"\r\t\r\t^Array new: self size streamContents: [ :stream |\r\t\tself associationsDo: [ :each | stream nextPut: each ] ]! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'tk 2/18/97'!\rkeyAtValue: value ifAbsent: exceptionBlock\r\t\"Answer the key that is the external name for the argument, value. If \r\tthere is none, answer the result of evaluating exceptionBlock.\r\t: Use =, not ==, so stings like 'this' can be found.  Note that MethodDictionary continues to use == so it will be fast.\"\r \r\tself associationsDo: \r\t\t[:association | value = association value ifTrue: [^association key]].\r\t^exceptionBlock value! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'nice 10/20/2009 23:20'!\rkeys\r\t\"Answer an Array containing the receiver's keys.\"\r\t\r\t^Array new: self size streamContents: [:s| self keysDo: [:key| s nextPut: key]]! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'SvenVanCaekenberghe 4/19/2011 20:31'!\rkeyAtIdentityValue: value \r\t\"Answer the key that is the external name for the argument, value. If \r\tthere is none, answer nil.\r\tNote: There can be multiple keys with the same value. Only one is returned.\"\r\r\t^self keyAtIdentityValue: value ifAbsent: [self errorValueNotFound: value]! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'StephaneDucasse 12/25/2009 12:15'!\rkeysSortedSafely\r\t\"Answer an Array containing the receiver's keys.\"\r \t\"Suggested by l. Uzonyi\"\r\t\r \t| sortedKeys |\r \tsortedKeys := Array \r\t\t\t\t\t\tnew: self size \r\t\t\t\t\t\tstreamContents: [ :stream |\r \t\t\t\t\t\t\t\tself keysDo: [ :each | stream nextPut: each ] ].\r \tsortedKeys sort: [ :x :y |\r \t\t\"Should really be use <obj, string, num> compareSafely...\"\r \t\t((x isString and: [ y isString ])\r \t\t\tor: [ x isNumber and: [ y isNumber ] ])\r \t\t\tifTrue: [ x < y ]\r \t\t\tifFalse: [ x class == y class\r \t\t\t\tifTrue: [ x printString < y printString ]\r \t\t\t\tifFalse: [ x class name < y class name ] ] ].\r \t^sortedKeys! !\r\r!Dictionary methodsFor: 'accessing'!\rassociationAt: key ifAbsent: aBlock \r\t\"Answer the association with the given key.\r\tIf key is not found, return the result of evaluating aBlock.\"\r\r\t| index assoc |\r\tindex := self findElementOrNil: key.\r\tassoc := array at: index.\r\tnil == assoc ifTrue: [ ^ aBlock value ].\r\t^ assoc! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'PeterHugossonMiller 9/3/2009 01:13'!\rvalues\r\t\"Answer a Collection containing the receiver's values.\"\r\t| out |\r\tout := (Array new: self size) writeStream.\r\tself valuesDo: [:value | out nextPut: value].\r\t^ out contents! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'ar 2/13/1999 21:16'!\rkeyAtIdentityValue: value ifAbsent: exceptionBlock\r\t\"Answer the key that is the external name for the argument, value. If \r\tthere is none, answer the result of evaluating exceptionBlock.\r\tNote: There can be multiple keys with the same value. Only one is returned.\"\r \r\tself associationsDo: \r\t\t[:association | value == association value ifTrue: [^association key]].\r\t^exceptionBlock value! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'CamilloBruni 4/11/2011 13:30'!\rassociationAt: key \r\t^ self associationAt: key ifAbsent: [self errorKeyNotFound: key]! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'ar 5/17/2003 14:07'!\rbindingOf: varName\r\t^self associationAt: varName ifAbsent:[nil]! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'sma 5/12/2000 15:00'!\rat: key put: anObject \r\t\"Set the value at key to be anObject.  If key is not found, create a\r\tnew entry for key and set is value to anObject. Answer anObject.\"\r\r\t| index assoc |\r\tindex := self findElementOrNil: key.\r\tassoc := array at: index.\r\tassoc\r\t\tifNil: [self atNewIndex: index put: (Association key: key value: anObject)]\r\t\tifNotNil: [assoc value: anObject].\r\t^ anObject! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'MarcusDenker 7/11/2014 18:34'!\rassociationAt: key ifPresent: aBlock \r\t\"Answer the association with the given key.\r\tIf key is not found, return the result of evaluating aBlock.\"\r\r\t^(array at: (self findElementOrNil: key))\r\t\tifNotNil: [:assoc | aBlock cull: assoc]! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'sma 5/12/2000 15:01'!\rat: key ifAbsentPut: aBlock \r\t\"Return the value at the given key. \r\tIf key is not included in the receiver store the result \r\tof evaluating aBlock as new value.\"\r\r\t^ self at: key ifAbsent: [self at: key put: aBlock value]! !\r\r!Dictionary methodsFor: 'accessing' stamp: 'nice 5/1/2011 18:29'!\rat: key ifPresent: aBlock\r\t\"Lookup the given key in the receiver. If it is present, answer the value of evaluating the given block with the value associated with the key. Otherwise, answer nil.\"\r\r\t^(array at: (self findElementOrNil: key))\r\t\tifNotNil: [:assoc | aBlock cull: assoc value]! !\r\r!Dictionary methodsFor: '*NewValueHolder' stamp: 'BenjaminVanRyseghem 1/24/2014 16:07'!\rasValueHolder\r\r\t^ DictionaryValueHolder value: self! !\r\r\r!Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:07'!\rwithAll: aCollection\r\t\"Create a new collection containing all the elements from aCollection.\"\r\r\t^ (self new: aCollection size)\r\t\taddAll: aCollection;\r\t\tyourself! !\r\r!Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:06'!\rwith: firstObject with: secondObject with: thirdObject with: fourthObject with: fifthObject with: sixthObject\r\t\"Answer an instance of me, containing the six arguments as the elements.\"\r\r\t^ self new\r\t\tadd: firstObject;\r\t\tadd: secondObject;\r\t\tadd: thirdObject;\r\t\tadd: fourthObject;\r\t\tadd: fifthObject;\r\t\tadd: sixthObject;\r\t\tyourself! !\r\r!Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:06'!\rwith: firstObject with: secondObject with: thirdObject with: fourthObject with: fifthObject\r\t\"Answer an instance of me, containing the five arguments as the elements.\"\r\r\t^ self new\r\t\tadd: firstObject;\r\t\tadd: secondObject;\r\t\tadd: thirdObject;\r\t\tadd: fourthObject;\r\t\tadd: fifthObject;\r\t\tyourself! !\r\r!Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:01'!\rwith: firstObject with: secondObject \r\t\"Answer an instance of me containing the two arguments as elements.\"\r\r\t^ self new\r\t\tadd: firstObject;\r\t\tadd: secondObject;\r\t\tyourself! !\r\r!Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:03'!\rwith: firstObject with: secondObject with: thirdObject \r\t\"Answer an instance of me containing the three arguments as elements.\"\r\r\t^ self new\r\t\tadd: firstObject;\r\t\tadd: secondObject;\r\t\tadd: thirdObject;\r\t\tyourself! !\r\r!Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:06'!\rwith: firstObject with: secondObject with: thirdObject with: fourthObject \r\t\"Answer an instance of me, containing the four arguments as the elements.\"\r\r\t^ self new\r\t\tadd: firstObject;\r\t\tadd: secondObject;\r\t\tadd: thirdObject;\r\t\tadd: fourthObject;\r\t\tyourself! !\r\r!Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 19:58'!\rwith: anObject \r\t\"Answer an instance of me containing anObject.\"\r\r\t^ self new\r\t\tadd: anObject;\r\t\tyourself! !\r\r!Collection class methodsFor: '*Tools-Debugger' stamp: 'SeanDeNigris 5/28/2013 17:47'!\rcanonicalArgumentName\r\r\t^ 'aCollection'.! !\r\r!Collection class methodsFor: 'private' stamp: 'lr 11/4/2003 12:07'!\rinitialize\r\t\"Set up a Random number generator to be used by atRandom when the \r\tuser does not feel like creating his own Random generator.\"\r\r\tRandomForPicking := Random new.\r\tMutexForPicking := Semaphore forMutualExclusion! !\r\r!Collection class methodsFor: 'private' stamp: 'lr 11/4/2003 12:08'!\rmutexForPicking\r\t^ MutexForPicking! !\r\r!Collection class methodsFor: 'private' stamp: 'sma 5/12/2000 12:31'!\rrandomForPicking\r\t^ RandomForPicking! !\r\r!Collection class methodsFor: '*Polymorph-Widgets-Themes' stamp: 'YuriyTymchuk 12/20/2013 11:17'!\rsystemIcon\r\r\t^ Smalltalk ui icons iconNamed: #collectionIcon! !\r\r\r!Dictionary class methodsFor: '*Spec-Inspector' stamp: 'cb 6/25/2013 13:43'!\rinspectorClass\r\t^ EyeDictionaryInspector! !\r\r!Dictionary class methodsFor: 'instance creation'!\rnewFrom: aDict \r\t\"Answer an instance of me containing the same associations as aDict.\r\t Error if any key appears twice.\"\r\t| newDictionary |\r\tnewDictionary := self new: aDict size.\r\taDict associationsDo:\r\t\t[:x |\r\t\t(newDictionary includesKey: x key)\r\t\t\tifTrue: [self error: 'Duplicate key: ', x key printString]\r\t\t\tifFalse: [newDictionary add: x]].\r\t^ newDictionary\r\r\"\tNewDictionary newFrom: {1->#a. 2->#b. 3->#c}\r\t{1->#a. 2->#b. 3->#c} as: NewDictionary\r\tNewDictionary newFrom: {1->#a. 2->#b. 1->#c}\r\t{1->#a. 2->#b. 1->#c} as: NewDictionary\r\"! !\r\r!Dictionary class methodsFor: 'instance creation' stamp: 'bgf 10/25/2006 17:08'!\rnewFromPairs: anArray \r\r\t\"Answer an instance of me associating (anArray at:i) to (anArray at: i+i)\r\t for each odd i.  anArray must have an even number of entries.\"\r\r\t| newDictionary |\r\r\tnewDictionary := self new: (anArray size/2).\r\t1 to: (anArray size-1) by: 2 do: [ :i|\r\t\tnewDictionary at: (anArray at: i) put: (anArray at: i+1).\r\t].\r\t^ newDictionary\r\r\t\"  Dictionary newFromPairs: {'Red' . Color red . 'Blue' . Color blue . 'Green' . Color green}. \"! !\r\r\r!Symbol methodsFor: 'printing' stamp: 'BenjaminVanRyseghem 11/24/2010 14:43'!\rstoreOn: aStream \r\r\taStream nextPut: $#.\r\t(self isLiteralSymbol)\r\t\tifTrue: [aStream nextPutAll: self]\r\t\tifFalse: [super storeOn: aStream]! !\r\r!Symbol methodsFor: 'printing' stamp: 'sw 8/19/1999 11:30'!\risOrientedFill\r\t\"Needs to be implemented here because symbols can occupy 'color' slots of morphs.\"\r\r\t^ false! !\r\r!Symbol methodsFor: '*metacello-core' stamp: 'DaleHenrichs 12/21/2010 13:55'!\rsetPreLoadDoItInMetacelloSpec: aMetacelloSpec\r    self precedence == 0\r        ifTrue: [ self error: 'Invalid selector' ].\r    aMetacelloSpec\r        setPreLoadDoIt:\r            (aMetacelloSpec project valueHolderSpec\r                value: self;\r                yourself)! !\r\r!Symbol methodsFor: '*metacello-core' stamp: 'dkh 9/5/2012 06:26:03.064'!\rsetForVersion: aString withInMetacelloConfig: aMetacelloConstructore\r    aMetacelloConstructore setFor: {self} version: aString! !\r\r!Symbol methodsFor: '*metacello-core' stamp: 'dkh 9/7/2012 13:44'!\rasMetacelloAttributePath\r    ^ MetacelloMethodSectionPath with: {self}! !\r\r!Symbol methodsFor: '*metacello-core' stamp: 'dkh 9/5/2012 06:26:03.064'!\rsetForDo: aBlock withInMetacelloConfig: aMetacelloConstructore\r    aMetacelloConstructore setFor: {self} do: aBlock! !\r\r!Symbol methodsFor: '*metacello-core' stamp: 'dkh 9/7/2012 13:11'!\rasMetacelloAttributeList\r    ^ {self}! !\r\r!Symbol methodsFor: '*metacello-core' stamp: 'DaleHenrichs 12/21/2010 13:54'!\rsetPostLoadDoItInMetacelloSpec: aMetacelloSpec\r    self precedence == 0\r        ifTrue: [ self error: 'Invalid selector' ].\r    aMetacelloSpec\r        setPostLoadDoIt:\r            (aMetacelloSpec project valueHolderSpec\r                value: self;\r                yourself)! !\r\r!Symbol methodsFor: '*Slot' stamp: 'MarcusDenker 6/26/2014 13:37'!\rasSlot\r\t^ InstanceVariableSlot named: self.! !\r\r!Symbol methodsFor: '*Slot' stamp: 'MarcusDenker 7/13/2014 11:56'!\r=> aVariable\r\taVariable isBehavior\r\t\tifTrue: [ ^ aVariable named: self].\r\t^ aVariable name: self;\r\t\tyourself! !\r\r!Symbol methodsFor: '*Slot' stamp: 'MartinDias 8/7/2012 01:31'!\risPseudovariableName\r\t\"Answer true if I am a pseudo-variable name.\r\t#self isPseudovariableName -> true\r\t\"\r\t^ self class pseudovariablesNames includes: self! !\r\r!Symbol methodsFor: '*opalcompiler-core' stamp: 'MarcusDenker 6/21/2012 11:18'!\rasOneArgSelector\r\t^ String streamContents: [:str|\r\t\t| parts |\r\t\tparts := (self findTokens: ':)').\r\t\t\tstr nextPutAll: parts first.\r\t\t\tparts allButFirst do: [:each | str nextPutAll: each capitalized]\t.\r\t\t\tstr nextPutAll: ':']! !\r\r!Symbol methodsFor: '*opalcompiler-core' stamp: 'MarcusDenker 10/11/2013 10:21'!\rasMethodPreamble\r\tself numArgs = 0 ifTrue: [ ^self asString].\r\t^ String streamContents: [ :str | \r\t\t\tself keywords doWithIndex: [ :each :index | \r\t\t\t\t\tstr\r\t\t\t\t\t\tnextPutAll: each;\r\t\t\t\t\t\tnextPutAll: ' var' , index asString ] ]! !\r\r!Symbol methodsFor: 'evaluating' stamp: 'HenrikSperreJohansen 2/18/2010 14:58'!\rcull: anObject \r\t^anObject perform: self.! !\r\r!Symbol methodsFor: 'evaluating' stamp: 'md 3/24/2006 12:09'!\rvalue: anObject \r\t^anObject perform: self.! !\r\r!Symbol methodsFor: 'copying' stamp: 'tk 8/19/1998 16:05'!\rveryDeepCopyWith: deepCopier\r\t\"Return self.  I am immutable in the Morphic world.  Do not record me.\"! !\r\r!Symbol methodsFor: 'copying'!\rcopy\r\t\"Answer with the receiver, because Symbols are unique.\"! !\r\r!Symbol methodsFor: 'copying'!\rshallowCopy\r\t\"Answer with the receiver, because Symbols are unique.\"! !\r\r!Symbol methodsFor: 'sorting' stamp: 'DamienCassou 8/27/2013 21:06'!\rsorted: aSortBlockOrNil\r\t\"Return a new sequenceable collection which contains the same elements as self but its elements are sorted by aSortBlockOrNil. The block should take two arguments and return true if the first element should preceed the second one. If aSortBlock is nil then <= is used for comparison. We convert the symbol to an array because symbols can't be changed.\"\r\t\r\t^self asArray sort: aSortBlockOrNil! !\r\r!Symbol methodsFor: 'system primitives' stamp: 'CamilloBruni 9/7/2011 16:21'!\rnumArgs: n\r\t\"Answer a string that can be used as a selector with n arguments.\r\t TODO: need to be extended to support shrinking and for selectors like #+ \" \r\r\t| selector numArgs offs |\r\t\r\tselector := self.\r\t(numArgs := selector numArgs) >= n \r\t\tifTrue: [ ^ self ].\r\t\r\t^ self class new: 16 streamContents: [ :stream|\r\t\tstream nextPutAll: self.\r\t\t(numArgs = 0) \r\t\t\tifTrue: [ stream nextPut: $:. offs := 0] \r\t\t\tifFalse: [ offs := 1 ].\r\t\t2 to: n - numArgs + offs do: [:i | \r\t\t\tstream nextPutAll: 'with:' ]].\r\t\r! !\r\r!Symbol methodsFor: 'system primitives' stamp: 'MarcusDenker 2/29/2012 11:18'!\rflushCache\r\t\"Tell the interpreter to remove all entries with this symbol as a selector from its method lookup cache, if it has one.  This primitive must be called whenever a method is redefined or removed.\r\tNOTE:  Only one of the two selective flush methods (Symbol or CompiledMethod) needs to be used.\"\r\r\t<primitive: 119>\r! !\r\r!Symbol methodsFor: 'announcements' stamp: 'StephaneDucasse 2/22/2013 18:21'!\rhandlesAnnouncement: anAnnouncement \r\t\"Anything else than the announcement identifier (in the case of symbol i.e. #foo for ... on: #foo send: #bar to: nil) will not \r\tbe handled.\"\r\t\r\t\"Announcer new \r\t\ton: #FOO send: #bar to: nil;\r\t\tannounce: #FOO should raise DNU bar\"\r\t\r\t^ anAnnouncement == self! !\r\r!Symbol methodsFor: 'testing' stamp: 'StephaneDucasse 5/28/2011 13:42'!\risUnary\r\t\"Answer whether the receiver is an unary message selector.\"\r\r\t^ self precedence = 1! !\r\r!Symbol methodsFor: 'testing' stamp: 'md 1/20/2006 16:16'!\rincludesKey: sym\r\t^self == sym.! !\r\r!Symbol methodsFor: 'testing' stamp: 'md 8/27/2005 16:33'!\risDoIt\r\r\t^ (self == #DoIt) or: [self == #DoItIn:].! !\r\r!Symbol methodsFor: 'testing' stamp: 'StephaneDucasse 5/28/2011 13:45'!\risInfix\r\t\"Answer whether the receiver is an infix message selector.\"\r\r\t^ self precedence = 2! !\r\r!Symbol methodsFor: 'testing' stamp: 'md 4/30/2003 15:31'!\risSymbol\r\t^ true ! !\r\r!Symbol methodsFor: 'testing' stamp: 'StephaneDucasse 5/28/2011 13:45'!\risBinary\r\t\"Answer whether the receiver is a binary message selector.\"\r\r\t^ self precedence = 2! !\r\r!Symbol methodsFor: 'testing' stamp: 'StephaneDucasse 5/28/2011 13:47'!\risKeyword\r\t\"Answer whether the receiver is a message keyword.\"\r\r\t^ self precedence = 3! !\r\r!Symbol methodsFor: 'converting' stamp: 'st 11/22/2004 17:26'!\rasMutator\r\t\"Return a setter message from a getter message. For example,\r\t#name asMutator returns #name:\"\r\t^ (self copyWith: $:) asSymbol! !\r\r!Symbol methodsFor: 'converting'!\rasSymbol \r\t\"Refer to the comment in String|asSymbol.\"! !\r\r!Symbol methodsFor: 'converting' stamp: 'ar 4/10/2005 22:42'!\rasString \r\t\"Refer to the comment in String|asString.\"\r\t| newString |\r\tnewString := self species new: self size.\r\tnewString replaceFrom: 1 to: newString size with: self startingAt: 1.\r\t^newString! !\r\r!Symbol methodsFor: 'converting' stamp: 'MarcusDenker 10/11/2013 10:07'!\rseparateKeywords\r\t\"#'foo:zork:'  separateKeywords -> 'foo:  zork:'\"\r\r\tself isKeyword\r\t\tifFalse: [ ^ self ].\r\t^ String streamContents: [ :stream | \r\t\t\t(self findTokens: $:) \r\t\t\t\tdo: [ :each | \r\t\t\t\t\tstream\r\t\t\t\t\t\tnextPutAll: each;\r\t\t\t\t\t\tnextPut: $: ]\r\t\t\t\tseparatedBy: [ stream nextPutAll: '  ' ] ]! !\r\r!Symbol methodsFor: 'converting' stamp: 'md 8/10/2004 10:54'!\rwithFirstCharacterDownshifted\r\t\"Answer an object like the receiver but with first character downshifted if necesary\"\r\r\t^self asString withFirstCharacterDownshifted asSymbol.! !\r\r!Symbol methodsFor: 'converting' stamp: 'StephaneDucasse 2/22/2013 18:18'!\rasAnnouncement\r\r\t^ self! !\r\r!Symbol methodsFor: 'converting' stamp: 'sw 1/28/98 18:18'!\rcapitalized\r\t^ self asString capitalized asSymbol! !\r\r!Symbol methodsFor: '*System-Support' stamp: 'MarcusDenker 7/17/2014 19:07'!\rimplementors\r\t^SystemNavigation new allImplementorsOf: self! !\r\r!Symbol methodsFor: '*System-Support' stamp: 'MarcusDenker 7/17/2014 19:11'!\rsenders\r\t^SystemNavigation new allSendersOf: self! !\r\r!Symbol methodsFor: 'accessing'!\rreplaceFrom: start to: stop with: replacement startingAt: repStart\r\r\tself errorNoModification! !\r\r!Symbol methodsFor: 'accessing'!\rat: anInteger put: anObject \r\t\"You cannot modify the receiver.\"\r\r\tself errorNoModification! !\r\r!Symbol methodsFor: 'accessing' stamp: 'sma 2/5/2000 12:32'!\rprecedence\r\t\"Answer the receiver's precedence, assuming it is a valid Smalltalk\r\tmessage selector or 0 otherwise.  The numbers are 1 for unary,\r\t2 for binary and 3 for keyword selectors.\"\r\r\tself size = 0 ifTrue: [^ 0].\r\tself first isLetter ifFalse: [^ 2].\r\tself last = $: ifTrue: [^ 3].\r\t^ 1! !\r\r!Symbol methodsFor: 'comparing' stamp: 'ar 4/10/2005 23:45'!\r= aSymbol\r\t\"Compare the receiver and aSymbol.\" \r\tself == aSymbol ifTrue: [^ true].\r\tself class == aSymbol class ifTrue: [^ false].\r\t\"Use String comparison otherwise\"\r\t^ super = aSymbol! !\r\r!Symbol methodsFor: 'private'!\rstring: aString\r\r\t1 to: aString size do: [:j | super at: j put: (aString at: j)].\r\t^self  ! !\r\r!Symbol methodsFor: 'private'!\rerrorNoModification\r\r\tself error: 'symbols can not be modified.'! !\r\r\r!Symbol class methodsFor: 'initialization' stamp: 'RAA 5/29/2001 14:35'!\rallSymbolTablesDo: aBlock after: aSymbol\r\r\tNewSymbols do: aBlock after: aSymbol.\r\tSymbolTable do: aBlock after: aSymbol.! !\r\r!Symbol class methodsFor: 'initialization' stamp: 'RAA 5/29/2001 09:04'!\rinitialize\r\r\t\"Symbol initialize\"\r\r\tSymbol rehash.\r\tOneCharacterSymbols := nil.\r\tOneCharacterSymbols := (1 to: 256) collect: [ :i | (i - 1) asCharacter asSymbol].\r\tSmalltalk addToShutDownList: self.\r! !\r\r!Symbol class methodsFor: 'initialization' stamp: 'RAA 5/29/2001 08:21'!\rallSymbolTablesDo: aBlock\r\r\tNewSymbols do: aBlock.\r\tSymbolTable do: aBlock.! !\r\r!Symbol class methodsFor: 'initialization' stamp: 'RAA 12/17/2000 18:05'!\rcompactSymbolTable\r\t\"Reduce the size of the symbol table so that it holds all existing symbols + 25% (changed from 1000 since sets like to have 25% free and the extra space would grow back in a hurry)\"\r\r\t| oldSize |\r\r\tSmalltalk garbageCollect.\r\toldSize := SymbolTable array size.\r\tSymbolTable growTo: SymbolTable size * 4 // 3 + 100.\r\t^oldSize printString,'  ',(oldSize - SymbolTable array size) printString, ' slot(s) reclaimed'! !\r\r!Symbol class methodsFor: 'accessing' stamp: 'CamilloBruni 9/5/2011 15:22'!\rstreamSpecies\r\t^ String! !\r\r!Symbol class methodsFor: 'instance creation' stamp: 'MarcusDenker 7/23/2014 13:17'!\rfindInterned: aString\r\r\tself hasInterned:aString ifTrue:[:symbol| ^symbol].\r\t^nil.! !\r\r!Symbol class methodsFor: 'instance creation' stamp: 'BenjaminVanRyseghem 11/24/2010 14:44'!\rwith: aCharacter\r\t^self newFrom: aCharacter asOrderedCollection! !\r\r!Symbol class methodsFor: 'instance creation' stamp: 'CamilloBruni 9/9/2011 12:57'!\rwithAll: aCollection\r\t^ self newFrom: aCollection! !\r\r!Symbol class methodsFor: 'instance creation' stamp: 'ar 4/10/2005 23:04'!\rinternCharacter: aCharacter\r\taCharacter asciiValue > 256 ifTrue:[^self intern: aCharacter asString].\r\tOneCharacterSymbols ifNil: [^self intern: aCharacter asString].\r\t^OneCharacterSymbols at: aCharacter asciiValue + 1\r! !\r\r!Symbol class methodsFor: 'instance creation'!\rnewFrom: aCollection \r\t\"Answer an instance of me containing the same elements as aCollection.\"\r\r\t^ (aCollection as: String) asSymbol\r\r\"\tSymbol newFrom: {$P. $e. $n}\r\t{$P. $e. $n} as: Symbol\r\"! !\r\r!Symbol class methodsFor: 'instance creation' stamp: 'RAA 5/29/2001 08:09'!\rlookup: aStringOrSymbol\r\r\t^(SymbolTable like: aStringOrSymbol) ifNil: [\r\t\tNewSymbols like: aStringOrSymbol\r\t]! !\r\r!Symbol class methodsFor: 'instance creation' stamp: 'SheridanMahoney 11/12/2009 22:04'!\rnew: aSize\r\r\tself shouldNotImplement .! !\r\r!Symbol class methodsFor: 'instance creation' stamp: 'MarcusDenker 5/18/2013 15:44'!\rreadFrom: strm  \r\t\"Symbol readFromString: '#abc'\"\r\r\tstrm peek = $# ifFalse: [self error: 'Symbols must be introduced by #'].\r    \t^ strm contents parseLiterals first.\r ! !\r\r!Symbol class methodsFor: 'instance creation' stamp: 'SheridanMahoney 11/17/2009 13:23'!\rintern: aStringOrSymbol \r\r\t^(self lookup: aStringOrSymbol) ifNil:[\r\t\t| aClass aSymbol |\r\t\taStringOrSymbol isSymbol ifTrue:[\r\t\t\taSymbol := aStringOrSymbol.\r\t\t] ifFalse:[\r\t\t\taClass := aStringOrSymbol isOctetString ifTrue:[ByteSymbol] ifFalse:[WideSymbol].\r\t\t\taSymbol := aClass basicNew: aStringOrSymbol size.\r\t\t\taSymbol string: aStringOrSymbol.\r\t\t].\r\t\tNewSymbols add: aSymbol.\r\t\taSymbol].! !\r\r!Symbol class methodsFor: 'private' stamp: 'RAA 5/29/2001 09:04'!\rshutDown: aboutToQuit\r\r\tSymbolTable addAll: NewSymbols.\r\tNewSymbols := WeakSet new.! !\r\r!Symbol class methodsFor: 'private' stamp: 'MarcusDenker 10/9/2013 10:42'!\rhasInterned: aString ifTrue: symBlock\r\t\"Answer with false if aString hasnt been interned (into a Symbol),  \r\totherwise supply the symbol to symBlock and return true.\"\r\r\t^ (self lookup: aString)\r\t\tifNil: [ false ]\r\t\tifNotNil: [ :symbol | \r\t\t\tsymBlock value: symbol.\r\t\t\ttrue ]! !\r\r!Symbol class methodsFor: 'private' stamp: 'ar 9/27/2005 20:01'!\rrehash\t\t\"Symbol rehash\"\r\t\"Rebuild the hash table, reclaiming unreferenced Symbols.\"\r\r\tSymbolTable := WeakSet withAll: self allSubInstances.\r\tNewSymbols := WeakSet new.! !\r\r!Symbol class methodsFor: 'private' stamp: 'nice 1/5/2010 15:59'!\rpossibleSelectorsFor: misspelled \r\t\"Answer an ordered collection of possible corrections\r\tfor the misspelled selector in order of likelyhood\"\r\r\t| numArgs candidates lookupString best binary short long first |\r\tlookupString := misspelled asLowercase. \"correct uppercase selectors to lowercase\"\r\tnumArgs := lookupString numArgs.\r\t(numArgs < 0 or: [lookupString size < 2]) ifTrue: [^ OrderedCollection new: 0].\r\tfirst := lookupString first.\r\tshort := lookupString size - (lookupString size // 4 max: 3) max: 2.\r\tlong := lookupString size + (lookupString size // 4 max: 3).\r\r\t\"First assemble candidates for detailed scoring\"\r\tcandidates := OrderedCollection new.\r\tself allSymbolTablesDo: [:s | | ss | (((ss := s size) >= short\t\"not too short\"\r\t\t\tand: [ss <= long\t\t\t\"not too long\"\r\t\t\t\t\tor: [(s at: 1) = first]])\t\"well, any length OK if starts w/same letter\"\r\t\t\tand: [s numArgs = numArgs])\t\"and numArgs is the same\"\r\t\t\tifTrue: [candidates add: s]].\r\r\t\"Then further prune these by correctAgainst:\"\r\tbest := lookupString correctAgainst: candidates.\r\t((misspelled last ~~ $:) and: [misspelled size > 1]) ifTrue: [\r\t\tbinary := misspelled, ':'.\t\t\"try for missing colon\"\r\t\tSymbol hasInterned: binary ifTrue: [:him | best addFirst: him]].\r\t^ best! !\r\r!Symbol class methodsFor: 'cleanup' stamp: 'StephaneDucasse 3/9/2010 22:17'!\rcleanUp\r\t\"Flush caches\"\r\r\tself compactSymbolTable.! !\r\r!Symbol class methodsFor: 'stream creation' stamp: 'CamilloBruni 9/5/2011 15:35'!\rnew: size streamContents: aBlock\r\t^ (super new: size streamContents: aBlock) asSymbol! !\r\r!Symbol class methodsFor: 'access' stamp: 'tween 9/13/2004 10:09'!\rthatStartsCaseSensitive: leadingCharacters skipping: skipSym\r\t\"Same as thatStarts:skipping: but caseSensitive\"\r\t| size firstMatch key |\r\r\tsize := leadingCharacters size.\r\tsize = 0 ifTrue: [^skipSym ifNil: [#''] ifNotNil: [nil]].\r\tfirstMatch := leadingCharacters at: 1.\r\tsize > 1 ifTrue: [key := leadingCharacters copyFrom: 2 to: size].\r\tself allSymbolTablesDo: [:each |\r\t\t\teach size >= size ifTrue:\r\t\t\t\t[\r\t\t\t\t\t((each at: 1) == firstMatch and:\r\t\t\t\t\t\t[key == nil or:\r\t\t\t\t\t\t\t[(each findString: key startingAt: 2 caseSensitive: true) = 2]])\r\t\t\t\t\t\t\t\tifTrue: [^each]\r\t\t\t\t]\r\t\t] after: skipSym.\r\r\t^nil\r! !\r\r!Symbol class methodsFor: 'access' stamp: 'StephaneDucasse 5/28/2011 13:45'!\rselectorsContaining: aString\r\t\"Answer a list of selectors that contain aString within them. Case-insensitive.  Does return symbols that begin with a capital letter.\"\r\r\t| size selectorList ascii |\r\r\tselectorList := OrderedCollection new.\r\t(size := aString size) = 0 ifTrue: [^selectorList].\r\r\taString size = 1 ifTrue:\r\t\t[\r\t\t\tascii := aString first asciiValue.\r\t\t\tascii < 128 ifTrue: [selectorList add: (OneCharacterSymbols at: ascii+1)]\r\t\t].\r\r\t(aString first isAlphaNumeric) ifFalse:\r\t\t[\r\t\t\taString size = 2 ifTrue: \r\t\t\t\t[Symbol hasInterned: aString ifTrue:\r\t\t\t\t\t[:s | selectorList add: s]].\r\t\t\t^selectorList\r\t\t].\r\r\tselectorList := selectorList copyFrom: 2 to: selectorList size.\r\r\tself allSymbolTablesDo: [:each |\r\t\teach size >= size ifTrue:\r\t\t\t[(each findSubstring: aString in: each startingAt: 1 \r\t\t\t\tmatchTable: CaseInsensitiveOrder) > 0\r\t\t\t\t\t\tifTrue: [selectorList add: each]]].\r\r\t^selectorList reject: [:each | \"reject non-selectors, but keep ones that begin with an uppercase\"\r\t\teach numArgs < 0 and: [each asString withFirstCharacterDownshifted numArgs < 0]].\r\r\"Symbol selectorsContaining: 'scon'\"! !\r\r!Symbol class methodsFor: 'access' stamp: 'ar 4/10/2005 22:49'!\rallSymbols\r\t\"Answer all interned symbols\"\r\t^Array streamContents:[:s|\r\t\ts nextPutAll: NewSymbols.\r\t\ts nextPutAll: OneCharacterSymbols.\r\t\ts nextPutAll: SymbolTable.\r\t].\r! !\r\r!Symbol class methodsFor: 'access' stamp: 'RAA 5/29/2001 14:35'!\rthatStarts: leadingCharacters skipping: skipSym\r\t\"Answer a selector symbol that starts with leadingCharacters.\r\tSymbols beginning with a lower-case letter handled directly here.\r\tIgnore case after first char.\r\tIf skipSym is not nil, it is a previous answer; start searching after it.\r\tIf no symbols are found, answer nil.\r\tUsed by Alt-q (Command-q) routines\"\r\r\t| size firstMatch key |\r\r\tsize := leadingCharacters size.\r\tsize = 0 ifTrue: [^skipSym ifNil: [#''] ifNotNil: [nil]].\r\r\tfirstMatch := leadingCharacters at: 1.\r\tsize > 1 ifTrue: [key := leadingCharacters copyFrom: 2 to: size].\r\r\tself allSymbolTablesDo: [:each |\r\t\t\teach size >= size ifTrue:\r\t\t\t\t[\r\t\t\t\t\t((each at: 1) == firstMatch and:\r\t\t\t\t\t\t[key == nil or:\r\t\t\t\t\t\t\t[(each findString: key startingAt: 2 caseSensitive: false) = 2]])\r\t\t\t\t\t\t\t\tifTrue: [^each]\r\t\t\t\t]\r\t\t] after: skipSym.\r\r\t^nil\r\r\"Symbol thatStarts: 'sf' skipping: nil\"\r\"Symbol thatStarts: 'sf' skipping: #sfpGetFile:with:with:with:with:with:with:with:with:\"\r\"Symbol thatStarts: 'candidate' skipping: nil\"\r! !\r\r!Symbol class methodsFor: '*Slot' stamp: 'MartinDias 8/7/2012 01:18'!\rpseudovariablesNames\r\t^#('self' 'true' 'false' 'nil' 'thisContext' 'super')! !\r\r\r!OrderedCollection methodsFor: '*GroupManager' stamp: 'BenjaminVanRyseghem 4/14/2012 12:08'!\rremoveDuplicates\r\t| iterator |\r\t\"Remove the copies of elements, but keep the same order\"\r\t\r\tself ifEmpty: [ ^ self ].\r\titerator := 1.\r\t[ iterator <= self size ]\r\t\twhileTrue: [ | each newIndex |\r\t\t\teach := self at: iterator.\t\t\t\r\t\t\t[ newIndex := (self indexOf: each startingAt: iterator+1).\r\t\t\tnewIndex > 0 ]\r\t\t\t\twhileTrue: [ self removeAt: newIndex ].\r\t\t\titerator := iterator + 1.\r\t ]! !\r\r!OrderedCollection methodsFor: '*Fuel' stamp: 'MarianoMartinezPeck 7/26/2012 17:42'!\rfuelAccept: aGeneralMapper\r\t\"Since we have subclasses of OrderedCollection that behave differently, we cannot use the visitSimpleCollection: for all of them.\"\r\t^ (self class == OrderedCollection ) \r\t\tifTrue: [ aGeneralMapper visitSimpleCollection: self ]\r\t\tifFalse: [ super fuelAccept: aGeneralMapper ] \r\t! !\r\r!OrderedCollection methodsFor: 'adding'!\radd: newObject after: oldObject \r\t\"Add the argument, newObject, as an element of the receiver. Put it in \r\tthe sequence just succeeding oldObject. Answer newObject.\"\r\t\r\t| index |\r\tindex := self find: oldObject.\r\tself insert: newObject before: index + 1.\r\t^newObject! !\r\r!OrderedCollection methodsFor: 'adding' stamp: 'ar 7/15/2008 23:05'!\radd: newObject beforeIndex: index \r\t\"Add the argument, newObject, as an element of the receiver. Put it in \r\tthe sequence just before index. Answer newObject.\"\r\t(index between: 1 and: self size+1) ifFalse:[^self errorSubscriptBounds: index].\r\tself insert: newObject before: firstIndex + index - 1.\r\t^ newObject! !\r\r!OrderedCollection methodsFor: 'adding'!\radd: newObject\r\r\t^self addLast: newObject! !\r\r!OrderedCollection methodsFor: 'adding' stamp: 'CamilloBruni 4/12/2011 13:52'!\radd: newObject afterIndex: index \r\t\"Add the argument, newObject, as an element of the receiver. Put it in \r\tthe sequence just after index. Answer newObject.\"\r\t(index between: 0 and: self size) ifFalse:[^self errorSubscriptBounds: index].\r\tself insert: newObject before: firstIndex + index.\r\t^ newObject! !\r\r!OrderedCollection methodsFor: 'adding' stamp: 'sma 5/12/2000 11:26'!\raddAll: aCollection \r\t\"Add each element of aCollection at my end. Answer\taCollection.\"\r\r\t^ self addAllLast: aCollection! !\r\r!OrderedCollection methodsFor: 'adding'!\raddAllFirst: anOrderedCollection \r\t\"Add each element of anOrderedCollection at the beginning of the \r\treceiver. Answer anOrderedCollection.\"\r\r\tanOrderedCollection reverseDo: [:each | self addFirst: each].\r\t^anOrderedCollection! !\r\r!OrderedCollection methodsFor: 'adding' stamp: 'StephaneDucasse 12/25/2009 12:13'!\raddAllLast: aCollection \r\t\"Add each element of aCollection at the end of the receiver. \r\tAnswer aCollection.\"\r\r\taCollection do: [:each | self addLast: each].\r\t^aCollection! !\r\r!OrderedCollection methodsFor: 'adding' stamp: 'sw 3/1/2001 11:03'!\raddAllFirstUnlessAlreadyPresent: anOrderedCollection \r\t\"Add each element of anOrderedCollection at the beginning of the receiver, preserving the order, but do not add any items that are already in the receiver.  Answer anOrderedCollection.\"\r\r\tanOrderedCollection reverseDo:\r\t\t[:each | (self includes: each) ifFalse: [self addFirst: each]].\r\t^ anOrderedCollection! !\r\r!OrderedCollection methodsFor: 'adding'!\raddFirst: newObject \r\t\"Add newObject to the beginning of the receiver. Answer newObject.\"\r\r\tfirstIndex = 1 ifTrue: [self makeRoomAtFirst].\r\tfirstIndex := firstIndex - 1.\r\tarray at: firstIndex put: newObject.\r\t^ newObject! !\r\r!OrderedCollection methodsFor: 'adding'!\radd: newObject before: oldObject \r\t\"Add the argument, newObject, as an element of the receiver. Put it in \r\tthe sequence just preceding oldObject. Answer newObject.\"\r\t\r\t| index |\r\tindex := self find: oldObject.\r\tself insert: newObject before: index.\r\t^newObject! !\r\r!OrderedCollection methodsFor: 'adding' stamp: 'ajh 5/22/2003 12:03'!\rat: index ifAbsentPut: block\r\t\"Return value at index, however, if value does not exist (nil or out of bounds) then add block's value at index (growing self if necessary)\"\r\r\t| v |\r\tindex <= self size ifTrue: [\r\t\t^ (v := self at: index)\r\t\t\tifNotNil: [v]\r\t\t\tifNil: [self at: index put: block value]\r\t].\r\t[self size < index] whileTrue: [self add: nil].\r\t^ self at: index put: block value! !\r\r!OrderedCollection methodsFor: 'adding'!\raddLast: newObject \r\t\"Add newObject to the end of the receiver. Answer newObject.\"\r\r\tlastIndex = array size ifTrue: [self makeRoomAtLast].\r\tlastIndex := lastIndex + 1.\r\tarray at: lastIndex put: newObject.\r\t^ newObject! !\r\r!OrderedCollection methodsFor: 'accessing' stamp: 'sma 5/12/2000 11:39'!\rsize\r\t\"Answer how many elements the receiver contains.\"\r\r\t^ lastIndex - firstIndex + 1! !\r\r!OrderedCollection methodsFor: 'accessing' stamp: 'sma 5/12/2000 11:42'!\rcapacity\r\t\"Answer the current capacity of the receiver.\"\r\r\t^ array size! !\r\r!OrderedCollection methodsFor: 'accessing' stamp: 'CamilloBruni 4/11/2011 15:39'!\rat: anInteger put: anObject \r\t\"Put anObject at element index anInteger. at:put: cannot be used to\r\tappend, front or back, to an ordered collection; it is used by a\r\tknowledgeable client to replace an element.\"\r\tself ensureBoundsFrom: anInteger to: anInteger.\r\t^array at: anInteger + firstIndex - 1 put: anObject! !\r\r!OrderedCollection methodsFor: 'accessing' stamp: 'CamilloBruni 4/11/2011 15:36'!\rat: anInteger \r\t\"Answer my element at index anInteger. at: is used by a knowledgeable\r\tclient to access an existing element\"\r\r\tself ensureBoundsFrom: anInteger to: anInteger.\r\t^ array at: anInteger + firstIndex - 1! !\r\r!OrderedCollection methodsFor: 'removing'!\rremove: oldObject ifAbsent: absentBlock\r\r\t| index |\r\tindex := firstIndex.\r\t[index <= lastIndex]\r\t\twhileTrue: \r\t\t\t[oldObject = (array at: index)\r\t\t\t\tifTrue: \r\t\t\t\t\t[self removeIndex: index.\r\t\t\t\t\t^ oldObject]\r\t\t\t\tifFalse: [index := index + 1]].\r\t^ absentBlock value! !\r\r!OrderedCollection methodsFor: 'removing'!\rremoveFirst\r\t\"Remove the first element of the receiver and answer it. If the receiver is \r\tempty, create an error notification.\"\r\t| firstObject |\r\tself emptyCheck.\r\tfirstObject := array at: firstIndex.\r\tarray at: firstIndex put: nil.\r\tfirstIndex := firstIndex + 1.\r\t^ firstObject! !\r\r!OrderedCollection methodsFor: 'removing' stamp: 'ar 5/22/2000 12:19'!\rremoveAt: index\r\t| removed |\r\tremoved := self at: index.\r\tself removeIndex: index + firstIndex - 1.\r\t^removed! !\r\r!OrderedCollection methodsFor: 'removing' stamp: 'cmm 10/25/2010 22:26'!\rremoveAll\r\t\"remove all the elements from this collection.\r\tKeep same amount of storage\"\r\t\r\tself setCollection: (self class arrayType new: array size)! !\r\r!OrderedCollection methodsFor: 'removing'!\rremoveLast\r\t\"Remove the last element of the receiver and answer it. If the receiver is \r\tempty, create an error notification.\"\r\t| lastObject |\r\tself emptyCheck.\r\tlastObject := array at: lastIndex.\r\tarray at: lastIndex put: nil.\r\tlastIndex := lastIndex - 1.\r\t^ lastObject! !\r\r!OrderedCollection methodsFor: 'removing' stamp: 'StephaneDucasse 10/18/2010 14:51'!\rremoveAllSuchThat: aBlock \r\t\"Remove each element of the receiver for which aBlock evaluates to true.\r\tThe method in Collection is O(N^2), this is O(N).\"\r\r\t| n |\r\tn := firstIndex.\r\tfirstIndex to: lastIndex do: [:index |\r\t    (aBlock value: (array at: index)) ifFalse: [\r\t\t\tarray at: n put: (array at: index).\r\t\t\tn := n + 1]].\r\tarray from: n to: lastIndex put: nil.\r\tlastIndex := n - 1! !\r\r!OrderedCollection methodsFor: 'removing' stamp: 'cmm 10/25/2010 22:26'!\rremoveFirst: n \r\t\"Remove first n object into an array\"\r\t| list |\r\tlist := self class arrayType new: n.\r\t1\r\t\tto: n\r\t\tdo:\r\t\t\t[ : i | list\r\t\t\t\tat: i\r\t\t\t\tput: self removeFirst ].\r\t^ list! !\r\r!OrderedCollection methodsFor: 'removing' stamp: 'ul 2/24/2011 14:33'!\rreset\r\t\"Quickly remove all elements. The objects will be still referenced, but will not be \taccessible.\"\r\t\r\tself resetTo: 1! !\r\r!OrderedCollection methodsFor: 'removing' stamp: 'cmm 10/25/2010 22:26'!\rremoveLast: n \r\t\"Remove last n object into an array with last in last position\"\r\t| list |\r\tlist := self class arrayType new: n.\r\tn\r\t\tto: 1\r\t\tby: -1\r\t\tdo:\r\t\t\t[ : i | list\r\t\t\t\tat: i\r\t\t\t\tput: self removeLast ].\r\t^ list! !\r\r!OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 23:51'!\rreject: rejectBlock thenCollect: collectBlock\r    \" Optimized version of Collection>>#reject:thenCollect: \"\r\r\t| newCollection |\r\r    newCollection := self copyEmpty.\r\r    firstIndex to: lastIndex do: [ :index |\r\t\t| element |\r\t\telement := array at: index.\r\t\t(rejectBlock value: element) \r\t\t\tifFalse: [ newCollection addLast: (collectBlock value: element) ]].\r\r    ^ newCollection! !\r\r!OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 23:51'!\rselect: selectBlock \r\t\"Optimized version of Collection>>#select: \"\r\r\t| newCollection element |\r\t\r\tnewCollection := self copyEmpty.\r\t\r\tfirstIndex to: lastIndex do: [ :index |\r\t\t(selectBlock value: (element := array at: index))\r\t\t\tifTrue: [ newCollection addLast: element ]].\r\t\t\r\t^ newCollection! !\r\r!OrderedCollection methodsFor: 'enumerating'!\rreverseDo: aBlock \r\t\"Override the superclass for performance reasons.\"\r\t| index |\r\tindex := lastIndex.\r\t[index >= firstIndex]\r\t\twhileTrue: \r\t\t\t[aBlock value: (array at: index).\r\t\t\tindex := index - 1]! !\r\r!OrderedCollection methodsFor: 'enumerating' stamp: 'di 8/31/1999 13:13'!\rwith: otherCollection collect: twoArgBlock \r\t\"Collect and return the result of evaluating twoArgBlock with \r\tcorresponding elements from this collection and otherCollection.\"\r\t| result |\r\totherCollection size = self size ifFalse: [self error: 'otherCollection must be the same size'].\r\tresult := self species new: self size.\r\t1 to: self size do:\r\t\t[:index | result addLast: (twoArgBlock value: (self at: index)\r\t\t\t\t\t\t\t\t\tvalue: (otherCollection at: index))].\r\t^ result! !\r\r!OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 23:52'!\rreject: rejectBlock \r\t\"Optimized version of Collection>>#reject:\"\r\r\t| newCollection element |\r\t\r\tnewCollection := self copyEmpty.\r\t\r\tfirstIndex to: lastIndex do: [ :index |\r\t\t(rejectBlock value: (element := array at: index))\r\t\t\tifFalse: [ newCollection addLast: element ]].\r\t\t\r\t^ newCollection! !\r\r!OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 23:52'!\rcollect: collectBlock thenSelect: selectBlock\r    \"Optimized version Collection>>#collect:thenSelect:\"\r\r    | newCollection newElement |\r\r    newCollection := self copyEmpty.\r    firstIndex to: lastIndex do: [ :index | \r\t\tnewElement := collectBlock value: (array at: index).\r\t\t(selectBlock value: newElement) \r\t\t\tifTrue: [ newCollection addLast: newElement ]].\r    ^ newCollection! !\r\r!OrderedCollection methodsFor: 'enumerating' stamp: 'bf 5/16/2000 16:30'!\rwithIndexCollect: elementAndIndexBlock \r\t\"Just like with:collect: except that the iteration index supplies the second argument to the block. Override superclass in order to use addLast:, not at:put:.\"\r\r\t| newCollection |\r\tnewCollection := self species new: self size.\r\tfirstIndex to: lastIndex do:\r\t\t[:index |\r\t\tnewCollection addLast: (elementAndIndexBlock\r\t\t\tvalue: (array at: index)\r\t\t\tvalue: index - firstIndex + 1)].\r\t^ newCollection! !\r\r!OrderedCollection methodsFor: 'enumerating' stamp: 'sma 2/5/2000 15:22'!\rcollect: aBlock \r\t\"Evaluate aBlock with each of my elements as the argument. Collect the \r\tresulting values into a collection that is like me. Answer the new \r\tcollection. Override superclass in order to use addLast:, not at:put:.\"\r\r\t| newCollection |\r\tnewCollection := self species new: self size.\r\tfirstIndex to: lastIndex do:\r\t\t[:index |\r\t\tnewCollection addLast: (aBlock value: (array at: index))].\r\t^ newCollection! !\r\r!OrderedCollection methodsFor: 'enumerating'!\rdo: aBlock \r\t\"Override the superclass for performance reasons.\"\r\t| index |\r\tindex := firstIndex.\r\t[index <= lastIndex]\r\t\twhileTrue: \r\t\t\t[aBlock value: (array at: index).\r\t\t\tindex := index + 1]! !\r\r!OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 23:52'!\rselect: selectBlock thenCollect: collectBlock\r    \" Optimized version Collection>>#select:thenCollect: \"\r\r\t| newCollection element |\r\r    newCollection := self copyEmpty.\r\r    firstIndex to: lastIndex do: [ :index |\r\t\telement := array at: index.\r\t\t(selectBlock value: element) \r\t\t\tifTrue: [ newCollection addLast: (collectBlock value: element) ]].\r\r    ^ newCollection! !\r\r!OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 4/11/2011 15:34'!\rcollect: aBlock from: fromIndex to: toIndex\r\t\"Override superclass in order to use addLast:, not at:put:.\"\r\t| result |\r\tself ensureBoundsFrom: fromIndex to: toIndex.\r\tresult := self species new: toIndex - fromIndex + 1.\r\tfirstIndex + fromIndex - 1 to: firstIndex + toIndex - 1 do:\r\t\t[:index | result addLast: (aBlock value: (array at: index))].\r\t^ result\r! !\r\r!OrderedCollection methodsFor: 'enumerating' stamp: 'pmm 3/13/2010 11:33'!\rsort: aSortBlock \r\t\"Sort this array using aSortBlock. The block should take two arguments\r\tand return true if the first element should preceed the second one.\"\r\r\tself size <= 1 ifTrue: [^ self].  \"nothing to do\"\r\tarray\r\t\tmergeSortFrom: firstIndex\r\t\tto: lastIndex \r\t\tsrc: array shallowCopy \r\t\tdst: array \r\t\tby: aSortBlock! !\r\r!OrderedCollection methodsFor: 'testing' stamp: 'md 8/13/2008 21:40'!\rhasContentsInExplorer\r\r\t^self notEmpty! !\r\r!OrderedCollection methodsFor: 'converting' stamp: 'stephane.ducasse 8/8/2009 10:48'!\rasArray\r\t^ (Array new: self size) replaceFrom: 1 to: self size with: array startingAt: firstIndex.! !\r\r!OrderedCollection methodsFor: 'splitjoin' stamp: 'onierstrasz 4/12/2009 19:44'!\rjoin: aCollection \r\t| result |\r\tresult := self class new.\r\taCollection\r\t\tdo: [:each | each appendTo: result]\r\t\tseparatedBy: [self appendTo: result].\r\t^ result! !\r\r!OrderedCollection methodsFor: 'private'!\rcollector  \"Private\"\r\t^ array! !\r\r!OrderedCollection methodsFor: 'private'!\rerrorConditionNotSatisfied\r\r\tself error: 'no element satisfies condition'! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'MarianoMartinezPeck 8/3/2011 14:37'!\rmakeRoomAtFirst\r\t\"Make some empty slots at the front of the array. If we have more than 50% free space, then just move the elements, so that the first 50% of the slots are free, otherwise add new free slots to the front by growing. Precondition: firstIndex = 1\"\r\t\r\t| tally newFirstIndex newLastIndex |\r\ttally := self size.\r\ttally * 2 >= array size ifTrue: [ ^self growAtFirst ].\r\ttally = 0 ifTrue: [ ^self resetTo: array size + 1 ].\r\tnewFirstIndex := array size // 2 + 1.\r\tnewLastIndex := newFirstIndex - firstIndex + lastIndex.\r\t0 to: tally - 1 do: [ :offset |\r\t\tarray at: newLastIndex - offset put: (array at: lastIndex - offset) ].\r\tarray from: firstIndex to: newFirstIndex - 1 put: nil.\r\tfirstIndex := newFirstIndex.\r\tlastIndex := newLastIndex! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'CamilloBruni 4/11/2011 15:34'!\rensureBoundsFrom: fromIndex to: toIndex\r\t(fromIndex < 1)\r\t\tifTrue: [^self errorSubscriptBounds: fromIndex].\r\t(toIndex + firstIndex - 1 > lastIndex)\r\t\tifTrue: [^self errorSubscriptBounds: toIndex].! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'cmm 10/25/2010 22:27'!\rgrowAtFirst\r\t\"Add new empty slots to the front of array, while keeping the empty slots at the end.\"\r\r\t| newArray newFirstIndex newLastIndex |\r\tnewArray := self class arrayType new: (array size * 2 max: 1).\r\tnewFirstIndex := newArray size - array size + firstIndex.\r\tnewLastIndex := newFirstIndex + lastIndex - firstIndex.\r\tnewArray \r\t\treplaceFrom: newFirstIndex\r\t\tto: newLastIndex\r\t\twith: array\r\t\tstartingAt: firstIndex.\r\tarray := newArray.\r\tfirstIndex := newFirstIndex.\r\tlastIndex := newLastIndex! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'BG 1/9/2004 12:28'!\rremoveIndex: removedIndex\r  \"  removedIndex is an index in the range firstIndex .. lastIndex, such an index is not known from outside the collection.\r    Never use this method in your code, it is meant for private use by OrderedCollection only.\r     The method for public use is:\r        #removeAt: \"\r\r\tarray \r\t\treplaceFrom: removedIndex \r\t\tto: lastIndex - 1 \r\t\twith: array \r\t\tstartingAt: removedIndex+1.\r\tarray at: lastIndex put: nil.\r\tlastIndex := lastIndex - 1.! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'MarianoMartinezPeck 8/3/2011 14:37'!\rmakeRoomAtLast\r\t\"Make some empty slots at the end of the array. If we have more than 50% free space, then just move the elements, so that the last 50% of the slots are free, otherwise add new free slots to the end by growing. Precondition: lastIndex = array size\"\r\t\r\t| tally newFirstIndex newLastIndex |\r\ttally := self size.\r\ttally * 2 >= lastIndex ifTrue: [ ^self growAtLast ].\r\ttally = 0 ifTrue: [ ^self resetTo: 1 ].\r\tnewLastIndex := lastIndex // 2.\r\tnewFirstIndex := newLastIndex - lastIndex + firstIndex.\r\tarray \r\t\treplaceFrom: newFirstIndex\r\t\tto: newLastIndex\r\t\twith: array\r\t\tstartingAt: firstIndex.\r\tarray from: newLastIndex + 1 to: lastIndex put: nil.\r\tfirstIndex := newFirstIndex.\r\tlastIndex := newLastIndex! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'BG 1/9/2004 12:26'!\rfind: oldObject\r  \"  This method answers an index in the range firstIndex .. lastIndex, which is meant for internal use only.\r     Never use this method in your code, the methods for public use are:\r        #indexOf:\r        #indexOf:ifAbsent: \"\r\r\t| index |\r\tindex := firstIndex.\r\t[index <= lastIndex]\r\t\twhileTrue:\r\t\t\t[(array at: index) = oldObject ifTrue: [^ index].\r\t\t\tindex := index + 1].\r\tself errorNotFound: oldObject! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'cmm 10/25/2010 22:27'!\rgrowAtLast\r\t\"Add new empty slots to the end of array, while keeping the empty slots at the front.\"\r\r\t| newArray |\r\tnewArray := self class arrayType new: (array size * 2 max: 1).\r\tnewArray \r\t\treplaceFrom: firstIndex\r\t\tto: lastIndex\r\t\twith: array\r\t\tstartingAt: firstIndex.\r\tarray := newArray! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'ar 4/16/1999 07:59'!\rresetTo: index\r\tfirstIndex := index.\r\tlastIndex := firstIndex - 1! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'BG 1/9/2004 12:29'!\rinsert: anObject before: spot\r\r  \"  spot is an index in the range firstIndex .. lastIndex, such an index is not known from outside the collection. \r     Never use this method in your code, it is meant for private use by OrderedCollection only.\r     The methods for use are:\r        #add:before:   to insert an object before another object\r        #add:beforeIndex:   to insert an object before a given position. \"\r\t| \"index\" delta spotIndex|\r\tspotIndex := spot.\r\tdelta := spotIndex - firstIndex.\r\tfirstIndex = 1\r\t\tifTrue: \r\t\t\t[self makeRoomAtFirst.\r\t\t\tspotIndex := firstIndex + delta].\r\tfirstIndex := firstIndex - 1.\r\tarray\r\t\treplaceFrom: firstIndex\r\t\tto: spotIndex - 2\r\t\twith: array\r\t\tstartingAt: firstIndex + 1.\r\tarray at: spotIndex - 1 put: anObject.\r\"\tindex := firstIndex := firstIndex - 1.\r\t[index < (spotIndex - 1)]\r\t\twhileTrue: \r\t\t\t[array at: index put: (array at: index + 1).\r\t\t\tindex := index + 1].\r\tarray at: index put: anObject.\"\r\t^ anObject! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'di 11/14/97 12:54'!\rsetCollection: anArray\r\tarray := anArray.\r\tself reset! !\r\r!OrderedCollection methodsFor: 'private' stamp: 'apb 10/15/2000 18:10'!\rsetContents: anArray\r\tarray := anArray.\r\tfirstIndex := 1.\r\tlastIndex := array size.! !\r\r!OrderedCollection methodsFor: 'copying'!\rcopyEmpty\r\t\"Answer a copy of the receiver that contains no elements.\"\r\r\t^self species new! !\r\r!OrderedCollection methodsFor: 'copying' stamp: 'sw 1/26/96'!\rreversed\r\t\"Answer a copy of the receiver with element order reversed.  \"\r\t| newCol |\r\tnewCol := self species new.\r\tself reverseDo:\r\t\t[:elem | newCol addLast: elem].\r\t^ newCol\r\r\"#(2 3 4 'fred') reversed\"! !\r\r!OrderedCollection methodsFor: 'copying'!\rcopyReplaceFrom: start to: stop with: replacementCollection \r\t\"Answer a copy of the receiver with replacementCollection's elements in\r\tplace of the receiver's start'th to stop'th elements. This does not expect\r\ta 1-1 map from replacementCollection to the start to stop elements, so it\r\twill do an insert or append.\"\r\r\t| newOrderedCollection delta startIndex stopIndex |\r\t\"if start is less than 1, ignore stop and assume this is inserting at the front. \r\tif start greater than self size, ignore stop and assume this is appending. \r\totherwise, it is replacing part of me and start and stop have to be within my \r\tbounds. \"\r\tdelta := 0.\r\tstartIndex := start.\r\tstopIndex := stop.\r\tstart < 1\r\t\tifTrue: [startIndex := stopIndex := 0]\r\t\tifFalse: [startIndex > self size\r\t\t\t\tifTrue: [startIndex := stopIndex := self size + 1]\r\t\t\t\tifFalse: \r\t\t\t\t\t[(stopIndex < (startIndex - 1) or: [stopIndex > self size])\r\t\t\t\t\t\tifTrue: [self errorOutOfBounds].\r\t\t\t\t\tdelta := stopIndex - startIndex + 1]].\r\tnewOrderedCollection := \r\t\tself species new: self size + replacementCollection size - delta.\r\t1 to: startIndex - 1 do: [:index | newOrderedCollection add: (self at: index)].\r\t1 to: replacementCollection size do: \r\t\t[:index | newOrderedCollection add: (replacementCollection at: index)].\r\tstopIndex + 1 to: self size do: [:index | newOrderedCollection add: (self at: index)].\r\t^newOrderedCollection! !\r\r!OrderedCollection methodsFor: 'copying'!\rcopyWith: newElement \r\t\"Answer a copy of the receiver that is 1 bigger than the receiver and \r\tincludes the argument, newElement, at the end.\"\r\r\t| newCollection |\r\tnewCollection := self copy.\r\tnewCollection add: newElement.\r\t^newCollection! !\r\r!OrderedCollection methodsFor: 'copying' stamp: 'nice 10/5/2009 08:50'!\rpostCopy\r\tarray := array copy! !\r\r!OrderedCollection methodsFor: 'copying' stamp: 'nice 10/5/2009 10:18'!\rcopyFrom: startIndex to: endIndex \r\t\"Answer a copy of the receiver that contains elements from position\r\tstartIndex to endIndex.\"\r\r\t^self shallowCopy postCopyFrom: startIndex to: endIndex! !\r\r!OrderedCollection methodsFor: 'copying' stamp: 'nice 5/28/2008 21:02'!\rpostCopyFrom: startIndex to: endIndex \r\t\"finish copying the array in a certain range.\"\r\r\tendIndex < startIndex ifFalse: [\r\t\t\"Because actual size of the array may be greater than used size,\r\t\tpostCopyFrom:to: may fail to fail and answer an incorrect result\r\t\tif this sanity check were not applied\"\r\t\t(startIndex between: 1 and: self size) ifFalse: [^self error: 'startIndex is out of bounds'].\r\t\t(endIndex between: 1 and: self size) ifFalse: [^self error: 'endIndex is out of bounds']].\r\t\r\t\"Add a protection that lacks in Array>>postcopy\"\r\tarray := array copyFrom: startIndex + firstIndex - 1 to: (endIndex max: startIndex - 1) + firstIndex - 1.\r\tfirstIndex := 1.\r\tlastIndex := array size! !\r\r\r!OrderedCollection class methodsFor: 'instance creation' stamp: 'cmm 10/25/2010 22:28'!\rnew: anInteger withAll: anObject\r\t^ self basicNew setContents: (self arrayType new: anInteger withAll: anObject)! !\r\r!OrderedCollection class methodsFor: 'instance creation' stamp: 'cmm 10/25/2010 22:27'!\rnew: anInteger \r\t^ self basicNew setCollection: (self arrayType new: anInteger)! !\r\r!OrderedCollection class methodsFor: 'instance creation' stamp: 'sma 5/12/2000 17:41'!\rnew\r\t^ self new: 10! !\r\r!OrderedCollection class methodsFor: 'instance creation' stamp: 'apb 10/15/2000 22:02'!\rofSize: n\r\t\"Create a new collection of size n with nil as its elements.\r\tThis method exists because OrderedCollection new: n creates an\r\tempty collection,  not one of size n.\"\r\t| collection |\r\tcollection := self new: n.\r\tcollection setContents: (collection collector).\r\t^ collection\r! !\r\r!OrderedCollection class methodsFor: 'instance creation'!\rnewFrom: aCollection \r\t\"Answer an instance of me containing the same elements as aCollection.\"\r\r\t| newCollection |\r\tnewCollection := self new: aCollection size.\r\tnewCollection addAll: aCollection.\r\t^newCollection\r\r\"\tOrderedCollection newFrom: {1. 2. 3}\r\t{1. 2. 3} as: OrderedCollection\r\t{4. 2. 7} as: SortedCollection\r\"! !\r\r!OrderedCollection class methodsFor: 'private' stamp: 'cmm 10/25/2010 22:26'!\rarrayType\r\t^ Array! !\r\r!OrderedCollection class methodsFor: 'accessing' stamp: 'CamilloBruni 9/5/2011 15:38'!\rstreamSpecies\r\t^ Array! !\r\r!OrderedCollection class methodsFor: 'stream creation' stamp: 'CamilloBruni 9/5/2011 15:48'!\rnew: size streamContents: aBlock\r\t^ self withAll: (super new: size streamContents: aBlock)! !\r\r\r!Stream methodsFor: 'accessing' stamp: 'nk 4/29/2004 10:40'!\ropenReadOnly\r\t^self! !\r\r!Stream methodsFor: 'accessing' stamp: 'HenrikSperreJohansen 8/17/2012 11:30'!\rbasicNext: anAmount putAll: aCollection startingAt: startIndex\r\r\t^ self next: anAmount putAll: aCollection startingAt: startIndex.\r! !\r\r!Stream methodsFor: 'accessing' stamp: 'yo 8/30/2002 17:13'!\rbasicNextPutAll: aCollection \r\r\t^ self nextPutAll: aCollection.\r! !\r\r!Stream methodsFor: 'accessing'!\rnextMatchAll: aColl\r    \"Answer true if next N objects are the ones in aColl,\r     else false.  Advance stream of true, leave as was if false.\"\r    | save |\r    save := self position.\r    aColl do: [:each |\r       (self next) = each ifFalse: [\r            self position: save.\r            ^ false]\r        ].\r    ^ true! !\r\r!Stream methodsFor: 'accessing' stamp: 'yo 8/30/2002 17:13'!\rbasicNextPut: anObject \r\r\t^ self nextPut: anObject! !\r\r!Stream methodsFor: 'accessing' stamp: 'HenrikSperreJohansen 8/17/2012 11:30'!\rnext: anInteger putAll: aCollection startingAt: startIndex\r\t\"Store the next anInteger elements from the given collection.\"\r\t(startIndex = 1 and:[anInteger = aCollection size])\r\t\tifTrue:[^self nextPutAll: aCollection].\r\t^self nextPutAll: (aCollection copyFrom: startIndex to: startIndex+anInteger-1)! !\r\r!Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:30'!\rupToEnd\r\t\"answer the remaining elements in the string\"\r\t| elements |\r\telements := OrderedCollection new.\r\t[ self atEnd ] whileFalse: [ \r\t\telements add: self next ].\r\t^elements! !\r\r!Stream methodsFor: 'accessing'!\rnext: anInteger put: anObject \r\t\"Make anObject be the next anInteger number of objects accessible by the \r\treceiver. Answer anObject.\"\r\r\tanInteger timesRepeat: [self nextPut: anObject].\r\t^anObject! !\r\r!Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'!\rnext\r\t\"Answer the next object accessible by the receiver.\"\r\r\tself subclassResponsibility ! !\r\r!Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:30'!\rnext: anInteger \r\t\"Answer the next anInteger number of objects accessible by the receiver.\"\r\t\r\t| aCollection |\r\taCollection := OrderedCollection new.\r\tanInteger timesRepeat: [aCollection addLast: self next].\r\t^aCollection! !\r\r!Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'!\rflush\r\t\"Do nothing by default\" ! !\r\r!Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'!\rnextPut: anObject \r\t\"Insert the argument, anObject, as the next object accessible by the \r\treceiver. Answer anObject.\"\r\t\r\tself subclassResponsibility ! !\r\r!Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'!\rbinary\r\t\"do nothing\"\r\t^self ! !\r\r!Stream methodsFor: 'accessing' stamp: 'yo 8/30/2002 17:13'!\rbasicNext\r\r\t^ self next.\r! !\r\r!Stream methodsFor: 'accessing'!\rcontents\r\t\"Answer all of the contents of the receiver.\"\r\r\tself subclassResponsibility! !\r\r!Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:29'!\rnextPutAll: aCollection \r\t\"Append the elements of aCollection to the sequence of objects accessible \r\tby the receiver. Answer aCollection.\"\r\t\r\taCollection do: [:v | self nextPut: v].\r\t^aCollection! !\r\r!Stream methodsFor: 'accessing' stamp: 'nk 4/29/2004 10:41'!\rreadOnly\r\t^self! !\r\r!Stream methodsFor: 'accessing' stamp: 'nk 4/29/2004 10:38'!\rlocalName\r\t^'a stream'! !\r\r!Stream methodsFor: 'accessing'!\rnextMatchFor: anObject \r\t\"Gobble the next object and answer whether it is equal to the argument, \r\tanObject.\"\r\r\t^anObject = self next! !\r\r!Stream methodsFor: 'filter streaming' stamp: 'MPW 1/1/1901 00:48'!\rwrite:encodedObject\r\t^encodedObject putOn:self.\r! !\r\r!Stream methodsFor: '*Monticello' stamp: 'cwp 8/9/2003 12:02'!\risMessageStream\r\t^ false! !\r\r!Stream methodsFor: 'printing' stamp: 'sma 6/1/2000 09:56'!\rprint: anObject\r\t\"Have anObject print itself on the receiver.\"\r\r\tanObject printOn: self! !\r\r!Stream methodsFor: 'enumerating'!\rdo: aBlock \r\t\"Evaluate aBlock for each of the objects accessible by receiver.\"\r\r\t[self atEnd]\r\t\twhileFalse: [aBlock value: self next]! !\r\r!Stream methodsFor: 'file open/close' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'!\rclose\r\t\"Presumably sets the status of the receiver to be closed. This message does \r\tnothing at this level, but is included for FileStream compatibility.\"\r\r\t^self ! !\r\r!Stream methodsFor: 'readability' stamp: 'kph 9/27/2007 21:53'!\r<< items\r\r \titems putOn: self.\r\t\r\t^ self! !\r\r!Stream methodsFor: 'testing' stamp: 'MarcusDenker 7/15/2012 15:43'!\risBinary\r\t^false! !\r\r!Stream methodsFor: 'testing' stamp: 'ar 12/23/1999 15:43'!\risStream\r\t\"Return true if the receiver responds to the stream protocol\"\r\t^true! !\r\r!Stream methodsFor: 'testing' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'!\ratEnd\r\t\"Answer whether the receiver can access any more objects.\"\r\r\tself subclassResponsibility ! !\r\r!Stream methodsFor: 'testing' stamp: 'ab 8/28/2003 18:30'!\rclosed\r\t^ false! !\r\r!Stream methodsFor: 'testing' stamp: 'ClementBera 9/30/2013 10:56'!\rnextWordsPutAll: aCollection\r\t\"Write the argument a word-like object in big endian format on the receiver.\r\tMay be used to write other than plain word-like objects (such as ColorArray).\"\r\t\r\t(aCollection class isPointers or: [ aCollection class isWords not ])\r\t\tifTrue: [ ^ self error: aCollection class name,' is not word-like'].\r\t1 to: aCollection basicSize do: [ :i |\r\t\tself nextNumber: 4 put: (aCollection basicAt: i) ].\r\t^ aCollection! !\r\r!Stream methodsFor: '*Fuel' stamp: 'MartinDias 8/13/2011 14:29'!\rnextBytesPutAll: aCollection\r\t\"Append the bytes of aCollection to the sequence of bytes accessible \r\tby the receiver. Answer aCollection.\"\r\r\t^self nextPutAll: aCollection! !\r\r\r!Stream class methodsFor: 'instance creation' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'!\rnew\r\r\tself error: 'Streams are created with on: and with:'! !\r\rSymbol initialize!\rCollection initialize!\r"
  },
  {
    "path": "src/test/resources/samples/langs/Smalltalk/Dinner.st",
    "content": "\"======================================================================\n|\n|   Smalltalk dining philosophers\n|\n|\n ======================================================================\"\n\n\n\"======================================================================\n|\n| Copyright 1999, 2000 Free Software Foundation, Inc.\n| Written by Paolo Bonzini.\n|\n| This file is part of GNU Smalltalk.\n|\n| GNU Smalltalk is free software; you can redistribute it and/or modify it\n| under the terms of the GNU General Public License as published by the Free\n| Software Foundation; either version 2, or (at your option) any later version.\n| \n| GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT\n| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n| FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\n| details.\n| \n| You should have received a copy of the GNU General Public License along with\n| GNU Smalltalk; see the file COPYING.  If not, write to the Free Software\n| Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  \n|\n ======================================================================\"\n\n\nObject subclass: #Philosophers\n    instanceVariableNames: 'forks philosophers randy eating'\n    classVariableNames: ''\n    poolDictionaries: ''\n    category: 'Examples-Processes'!\n\n!Philosophers class methodsFor: 'dining'!\n\nnew\n    self shouldNotImplement\n!\n\nnew: quantity\n    ^super new initialize: quantity\n! !\n\n!Philosophers methodsFor: 'dining'!\n\ndine\n    self dine: 15\n!\n\ndine: seconds\n    (Delay forSeconds: seconds) wait.\n    philosophers do: [ :each | each terminate ].\n    self initialize: self size\n!\n\nleftFork: n\n    ^forks at: n\n!\n\nrightFork: n\n    ^n = self size\n\tifTrue: [ forks at: 1 ]\n\tifFalse: [ forks at: n + 1 ]\n!\n\ninitialize: n\n    eating := Semaphore new.\n    n - 1 timesRepeat: [ eating signal ].\n\n    randy := Random new.\n    forks := (1 to: n) collect: [ :each | Semaphore forMutualExclusion ].\n    philosophers := (1 to: n) collect: [ :each | self philosopher: each ].\n!\n\nphilosopher: n\n    | philosopherCode leftFork rightFork status |\n    leftFork  := self leftFork: n.\n    rightFork := self rightFork: n.\n    status    := 'Philosopher #', n printString, ' '.\n    philosopherCode := [[ true ] whileTrue: [\n\tTranscript nextPutAll: status, 'thinks'; nl.\n\t(Delay forMilliseconds: randy next * 2000) wait.\n\tTranscript nextPutAll: status, 'wants to eat'; nl.\n\teating critical: [\t\t\t\t    \"Avoid deadlock\"\n\t    Transcript nextPutAll: status, 'waits for left fork'; nl.\n\t    leftFork wait.\n\t    Transcript nextPutAll: status, 'waits for right fork'; nl.\n\t    rightFork wait.\n\t    Transcript nextPutAll: status, 'eats'; nl.\n\t    (Delay forMilliseconds: randy next * 2000) wait.\n\t    leftFork signal.\n\t    rightFork signal.\n\t].\n    ]].\n\n    ^(philosopherCode newProcess)\n\tpriority: Processor userBackgroundPriority;\n\tname: status;\n\tresume;\n\tyourself\n!\n\nsize\n    ^forks size\n! !\n\n(Philosophers new: 5) dine!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smalltalk/TestBasic.st",
    "content": "Koan subclass: TestBasic [\n  <comment: 'A collection of introductory tests.'>\n\n  testDeclarationAndAssignment [\n    | declaration anotherDeclaration |\n    \"You must declare variables before using them.\"\n    \"Variables are separated by a single space.\"\n\n    declaration _ 1.  \"Squeak Smalltalk way to assign value\"\n    anotherDeclaration := 'string'.  \"typical way to assign value\n      (this will be used throughout the koans)\"\n\n    self expect: fillMeIn toEqual: declaration.\n    self expect: fillMeIn toEqual: anotherDeclaration.\n  ]\n\n  testEqualSignIsNotAnAssignmentOperator [\n    | variableA variableB value |\n\n    variableA := variableB := 1234.  \"multiple assignments work\"\n    value := variableA = variableB.  \"equal is not used for assignment\"\n\n    self expect: fillMeIn toEqual: (variableA = variableB).\n\n    \"#== is a message that checks if identity is equal.  More about messages in the TestMessage koan.\"\n  ]\n\n  testMultipleStatementsInASingleLine [\n    | variableA variableB variableC |\n\n    \"Multiple statements are separated by periods.\"\n    variableA := 1. variableB := 2. variableC := 3.\n\n    self expect: fillMeIn toEqual: variableA.\n    self expect: fillMeIn toEqual: variableB.\n    self expect: fillMeIn toEqual: variableC.\n  ]\n\n  testInequality [\n    self expect: fillMeIn toEqual: ('hello' ~= 'world').\n\n    \"#~~ is a message that checks if identity is not equal.  More about messages in the TestMessage koan.\"\n  ]\n\n  testLogicalOr [\n    | expression |\n\n    expression := (3 > 4) | (5 < 6).\n\n    self expect: fillMeIn toEqual: expression.\n  ]\n\n  testLogicalAnd [\n    | expression |\n\n    expression := (2 > 1) & ('a' < 'b').\n\n    self expect: fillMeIn toEqual: expression.\n  ]\n\n  testNot [\n    self expect: fillMeIn toEqual: true not.\n  ]\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smalltalk/baselineDependency.st",
    "content": "dependencies\nneoJSON: spec\n\tspec\n\t\tconfiguration: 'NeoJSON'\n\t\twith: [ spec\n\t\t\t\tclassName: 'ConfigurationOfNeoJSON';\n\t\t\t\tversion: #stable;\n\t\t\t\trepository: 'http://smalltalkhub.com/mc/SvenVanCaekenberghe/Neo/main' ]"
  },
  {
    "path": "src/test/resources/samples/langs/Smalltalk/categories.st",
    "content": "SystemOrganization addCategory: #ChartJs!\nSystemOrganization addCategory: 'ChartJs-Component'!\nSystemOrganization addCategory: 'ChartJs-Demo'!\nSystemOrganization addCategory: 'ChartJs-Exception'!\nSystemOrganization addCategory: 'ChartJs-Library'!\nSystemOrganization addCategory: 'ChartJs-Model'!\nSystemOrganization addCategory: 'ChartJs-Style'!\nSystemOrganization addCategory: 'ChartJs-Types'!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Smalltalk/renderSeasideExampleOn..st",
    "content": "rendering\nrenderTitleId: divId on: html\n\t^ html div\n\t\tid: #title , divId;\n\t\tclass: #aClass;\n\t\twith: [ \n\t\t\t\t\thtml heading\n\t\t\t\t\t\tlevel3;\n\t\t\t\t\t\twith: self data title ]"
  },
  {
    "path": "src/test/resources/samples/langs/Smalltalk/scriptWithPragma.st",
    "content": "helpers\ninstallGitFileTree\n\t\"GitFileTree is the tool we will use to commit on GitHub.\"\n\n\t<script>\n\tMetacello new\n\t\tbaseline: 'FileTree';\n\t\trepository:\n\t\t\t'github://dalehenrich/filetree:pharo' , SystemVersion current dottedMajorMinor\n\t\t\t\t, '_dev/repository';\n\t\tload: 'Git'"
  },
  {
    "path": "src/test/resources/samples/langs/Smalltalk/smallMethod.st",
    "content": "ChartJs\ndataFunction\n\t^ 'bars'"
  },
  {
    "path": "src/test/resources/samples/langs/Smalltalk/testSimpleChainMatches.st",
    "content": "tests\ntestSimpleChainMatches\n\t|e eCtrl |\n\te := self eventKey: $e.\n\teCtrl := self eventKey: $e ctrl: true.\n\t\n\tself assert: (($e ctrl, $e) matches: {eCtrl}).\n\tself assert: ($e ctrl matches: {eCtrl. e}).\n\t\n\tself deny: (($e ctrl, $e) matches: {eCtrl. self eventKey: $a}).\n\tself deny: ($e ctrl matches: {e})."
  },
  {
    "path": "src/test/resources/samples/langs/Solidity/VotingContract.sol",
    "content": "pragma solidity ^0.4.22;\n\n/// @title Voting with delegation.\ncontract Ballot {\n    // This declares a new complex type which will\n    // be used for variables later.\n    // It will represent a single voter.\n    struct Voter {\n        uint weight; // weight is accumulated by delegation\n        bool voted;  // if true, that person already voted\n        address delegate; // person delegated to\n        uint vote;   // index of the voted proposal\n    }\n\n    // This is a type for a single proposal.\n    struct Proposal {\n        bytes32 name;   // short name (up to 32 bytes)\n        uint voteCount; // number of accumulated votes\n    }\n\n    address public chairperson;\n\n    // This declares a state variable that\n    // stores a `Voter` struct for each possible address.\n    mapping(address => Voter) public voters;\n\n    // A dynamically-sized array of `Proposal` structs.\n    Proposal[] public proposals;\n\n    /// Create a new ballot to choose one of `proposalNames`.\n    constructor(bytes32[] memory proposalNames) public {\n        chairperson = msg.sender;\n        voters[chairperson].weight = 1;\n\n        // For each of the provided proposal names,\n        // create a new proposal object and add it\n        // to the end of the array.\n        for (uint i = 0; i < proposalNames.length; i++) {\n            // `Proposal({...})` creates a temporary\n            // Proposal object and `proposals.push(...)`\n            // appends it to the end of `proposals`.\n            proposals.push(Proposal({\n                name: proposalNames[i],\n                voteCount: 0\n            }));\n        }\n    }\n\n    // Give `voter` the right to vote on this ballot.\n    // May only be called by `chairperson`.\n    function giveRightToVote(address voter) public {\n        // If the first argument of `require` evaluates\n        // to `false`, execution terminates and all\n        // changes to the state and to Ether balances\n        // are reverted.\n        // This used to consume all gas in old EVM versions, but\n        // not anymore.\n        // It is often a good idea to use `require` to check if\n        // functions are called correctly.\n        // As a second argument, you can also provide an\n        // explanation about what went wrong.\n        require(\n            msg.sender == chairperson,\n            \"Only chairperson can give right to vote.\"\n        );\n        require(\n            !voters[voter].voted,\n            \"The voter already voted.\"\n        );\n        require(voters[voter].weight == 0);\n        voters[voter].weight = 1;\n    }\n\n    /// Delegate your vote to the voter `to`.\n    function delegate(address to) public {\n        // assigns reference\n        Voter storage sender = voters[msg.sender];\n        require(!sender.voted, \"You already voted.\");\n\n        require(to != msg.sender, \"Self-delegation is disallowed.\");\n\n        // Forward the delegation as long as\n        // `to` also delegated.\n        // In general, such loops are very dangerous,\n        // because if they run too long, they might\n        // need more gas than is available in a block.\n        // In this case, the delegation will not be executed,\n        // but in other situations, such loops might\n        // cause a contract to get \"stuck\" completely.\n        while (voters[to].delegate != address(0)) {\n            to = voters[to].delegate;\n\n            // We found a loop in the delegation, not allowed.\n            require(to != msg.sender, \"Found loop in delegation.\");\n        }\n\n        // Since `sender` is a reference, this\n        // modifies `voters[msg.sender].voted`\n        sender.voted = true;\n        sender.delegate = to;\n        Voter storage delegate_ = voters[to];\n        if (delegate_.voted) {\n            // If the delegate already voted,\n            // directly add to the number of votes\n            proposals[delegate_.vote].voteCount += sender.weight;\n        } else {\n            // If the delegate did not vote yet,\n            // add to her weight.\n            delegate_.weight += sender.weight;\n        }\n    }\n\n    /// Give your vote (including votes delegated to you)\n    /// to proposal `proposals[proposal].name`.\n    function vote(uint proposal) public {\n        Voter storage sender = voters[msg.sender];\n        require(!sender.voted, \"Already voted.\");\n        sender.voted = true;\n        sender.vote = proposal;\n\n        // If `proposal` is out of the range of the array,\n        // this will throw automatically and revert all\n        // changes.\n        proposals[proposal].voteCount += sender.weight;\n    }\n\n    /// @dev Computes the winning proposal taking all\n    /// previous votes into account.\n    function winningProposal() public view\n            returns (uint winningProposal_)\n    {\n        uint winningVoteCount = 0;\n        for (uint p = 0; p < proposals.length; p++) {\n            if (proposals[p].voteCount > winningVoteCount) {\n                winningVoteCount = proposals[p].voteCount;\n                winningProposal_ = p;\n            }\n        }\n    }\n\n    // Calls winningProposal() function to get the index\n    // of the winner contained in the proposals array and then\n    // returns the name of the winner\n    function winnerName() public view\n            returns (bytes32 winnerName_)\n    {\n        winnerName_ = proposals[winningProposal()].name;\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/SourcePawn/Check.inc",
    "content": "// \tCheckpoint Manager\r\n// \t(c) João Pedro Lopes, All right's reserved\r\n// \t\r\n// \tFeel free to change any line above, as long as you post the 'fix' / 'patch' at the forum\r\n// \tand send a copy to jplopes@live.com.pt\r\n\r\n/* natives\r\n\tnative CreateCheckpoint(ownerid, chpid, Float:posX, Float:posY, Float:posZ, Float:size); // Creates a checkpoint\r\n\tnative SetCheckpointInterior(chpid, interiorid); // Changes the checkpoint interior\r\n\tnative SetCheckpointVirtualWorld(chpid, VirtualWorldID); // Changes the Checkpoint vWorld\r\n\tnative ToggleCheckpointActive(chpid, bool:active); // Deactivates / Activates the checkpoint\r\n\tnative ChangeCheckpointOwner(chpid, owner);\t// Change the checkpoint owner\r\n\tnative RemoveCheckpoint(chpid); // Removes the specified checkpoint\r\n\tnative StartCheckpointSeeking(); // Starts seeking for each individual\r\n\tnative StopCheckpointSeeking(); // Stops the system\r\n\tnative VerifyCheckpoint(playerid); // Place this at OnPlayerEnterCheckpoint\r\n*/\r\n\r\n// Function Forwards\r\nforward public OnCheckpointEnter(playerid, checkpointid);\r\n\r\n#if defined _CHECKPOINT_MANAGER_INCLUDED\r\n\t#endinput\r\n#endif\r\n\r\n#define _CHECKPOINT_MANAGER_INCLUDED\r\n#pragma library CheckpointManager\r\n\r\n#include <a_samp>\r\n\r\n#define MAX_CHECKPOINTS 200\r\n#define CHECKPOINT_SEEKER_DELAY 300\r\n\r\n#define GLOBAL_OWNER_ID -1\r\n\r\n\r\n// CHECKPOINT ENUMERATION\r\nenum _checkpointEnum{\r\n\t_chp_populated,\t\t\t// Is this slot of the memory populated?\r\n\t\r\n\t_chp_id,\t\t\t\t// The ID of the checkpoint\r\n\t_chp_owner,\t\t\t\t// The ID of the player who this checkpoint is visible too\r\n\t\r\n\tFloat:_chp_posX,\t\t// The X position of this checkpoint\r\n\tFloat:_chp_posY,\t\t// The Y position of this checkpoint\r\n\tFloat:_chp_posZ,\t\t// The Z position of this checkpoint\r\n\tFloat:_chp_size,\t\t// The checkpoint size\r\n\tFloat:_chp_viewDistance,\t// The checkpoint view distance\r\n\t\r\n\tbool:_chp_active,\t\t// Is this checkpoint active?\r\n\t\r\n\t_chp_interior_id,\t\t// The interior id of this checkpoint\r\n\t_chp_world_id\t\t\t// The world id of this checkpoint\r\n};\r\n\r\n// DATA ARRAYS\r\nnew _checkpoints[MAX_CHECKPOINTS][_checkpointEnum];\r\nnew _p_VisibleCheckpoint[MAX_PLAYERS];\r\nnew _chp_manager_timer_id;\r\n\r\n// DATA VARIABLES\r\nnew _totalCheckpoints;\r\n\r\n// --------------------------------------------------------------------------------------------------------\r\n// Creates a new checkpoint with some initial data\r\nstock CreateCheckpoint(__ownerid, __chpid, Float:__posX, Float:__posY, Float:__posZ, Float:__size){\r\n\t// Max checkpoint reached?\r\n\tif(_totalCheckpoints == MAX_CHECKPOINTS) return 0;\r\n\t\r\n\t// First checkpoint? Setting everything to unpopulated\r\n\tif(!_totalCheckpoints){\r\n\t\tfor(new i; i < MAX_PLAYERS; i++) _p_VisibleCheckpoint[i] = -1;\r\n\t\tfor(new i; i < MAX_CHECKPOINTS; i++){\r\n\t\t\t_checkpoints[i][_chp_populated] = false;\r\n\t\t}\r\n\t\t\r\n\t\t// Sending the Initialization Info\r\n\t\tprintf(\"[Checkpoint Manager : Version 0.1.1b] System Initialized...\", __chpid);\r\n\t}\r\n\t\r\n\t// Getting the first open slot\r\n\tnew _slot;\r\n\tfor(new i = 0; i < MAX_CHECKPOINTS; i++){\r\n\t\tif(!_checkpoints[i][_chp_populated]){\r\n\t\t\t_slot = i;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\t\r\n\t// Adding the new checkpoint\r\n\t_checkpoints[_slot][_chp_populated] = true;\r\n\t_checkpoints[_slot][_chp_id] = __chpid;\r\n\t_checkpoints[_slot][_chp_owner] = __ownerid;\r\n\t_checkpoints[_slot][_chp_posX] = __posX;\r\n\t_checkpoints[_slot][_chp_posY] = __posY;\r\n\t_checkpoints[_slot][_chp_posZ] = __posZ;\r\n\t_checkpoints[_slot][_chp_size] = __size;\r\n\t_checkpoints[_slot][_chp_viewDistance] = 50.0;\r\n\t_checkpoints[_slot][_chp_active] = true;\r\n\t_checkpoints[_slot][_chp_interior_id] = 0;\r\n\t_checkpoints[_slot][_chp_world_id] = 0;\r\n\t\r\n\tprintf(\"[Checkpoint Manager] Checkpoint created (%d) at slot %d\", __chpid, _slot);\r\n\tprintf(\"Checkpoint Position: { %f, %f, %f }\", _checkpoints[_slot][_chp_posX], _checkpoints[_slot][_chp_posY], _checkpoints[_slot][_chp_posZ]);\r\n\t\r\n\t_totalCheckpoints++;\r\n\treturn 1;\r\n}\r\n\r\n//---------------------------------------------------------------------------------------------\r\nstock SetCheckpointInterior(__chpid, __interiorid){\r\n\tnew _slot = __ChpSlotByID(__chpid);\r\n\tif(_slot > -1){\r\n\t\t// Valid slot?\r\n\t\t_checkpoints[_slot][_chp_interior_id] = __interiorid;\r\n\t\treturn 1;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\n//---------------------------------------------------------------------------------------------\r\nstock SetCheckpointVirtualWorld(__chpid, __virtual_world_id){\r\n\tnew _slot = __ChpSlotByID(__chpid);\r\n\tif(_slot > -1){\r\n\t\t_checkpoints[_slot][_chp_world_id] = __virtual_world_id;\r\n\t\treturn 1;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nstock ToggleCheckpointActive(__chpid, bool:__active){\r\n\tnew _slot = __ChpSlotByID(__chpid);\r\n\tif(_slot > -1){\r\n\t\t_checkpoints[_slot][_chp_active] = __active;\r\n\t\treturn 1;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nstock ChangeCheckpointOwner(__chpid, __owner){\r\n\tnew _slot = __ChpSlotByID(__chpid);\r\n\tif(_slot > -1){\r\n\t\t_checkpoints[_slot][_chp_owner] = __owner;\r\n\t\treturn 1;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nstock RemoveCheckpoint(__chpid){\r\n\tnew _slot = __ChpSlotByID(__chpid);\r\n\tif(_slot > -1){\r\n\t\t// Deleting the checkpoint\r\n\t\t_checkpoints[_slot][_chp_populated] = false;\r\n\t\t_checkpoints[_slot][_chp_id] = -1;\r\n\t\t_checkpoints[_slot][_chp_owner] = 255;\r\n\t\t_checkpoints[_slot][_chp_posX] = -1;\r\n\t\t_checkpoints[_slot][_chp_posY] = -1;\r\n\t\t_checkpoints[_slot][_chp_posZ] = -1;\r\n\t\t_checkpoints[_slot][_chp_size] = -1;\r\n\t\t_checkpoints[_slot][_chp_viewDistance] = -1;\r\n\t\t_checkpoints[_slot][_chp_active] = false;\r\n\t\t_checkpoints[_slot][_chp_interior_id] = -1;\r\n\t\t_checkpoints[_slot][_chp_world_id] = -1;\r\n\t\t_totalCheckpoints--;\r\n\t\tprintf(\"\\n[Checkpoint Manager] Checkpoint removed (ID: %d)\", __chpid);\r\n\t\treturn 1;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\n//---------------------------------------------------------------------------------------------\r\n// Gets the checkpoint slot by id\r\nstock __ChpSlotByID(__chpid){\r\n\tfor(new i; i < MAX_CHECKPOINTS; i++){\r\n\t\tif(_checkpoints[i][_chp_id] == __chpid) return i;\r\n\t}\r\n\treturn -1;\r\n}\r\n\r\n\r\nforward CheckpointSeeker();\r\nstock StartCheckpointSeeking(){\r\n\t_chp_manager_timer_id = SetTimer(\"CheckpointSeeker\", CHECKPOINT_SEEKER_DELAY, 1);\r\n\treturn 1;\r\n}\r\n\r\nstock StopCheckpointSeeking(){\r\n\tKillTimer(_chp_manager_timer_id);\r\n\treturn 1;\r\n}\r\n\r\npublic CheckpointSeeker(){\r\n\tnew Float:__posX, Float:__posY, Float:__posZ;\r\n\tnew __interior;\r\n\tnew __virtualWorld;\r\n\tfor(new i; i < MAX_PLAYERS; i++)\r\n\t{\r\n\t\tif(!IsPlayerConnected(i)) continue;\r\n\t\t\r\n\t\tGetPlayerPos(i, Float:__posX, Float:__posY, Float:__posZ);\r\n\t\t// Is the player near a checkpoint?\r\n\t\tif(_p_VisibleCheckpoint[i] > -1)\r\n\t\t{\r\n\t\t\t// If the player is no longer near that point\r\n\t\t\tif(__posX < (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posX] - _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])\r\n\t\t\t|| __posX > (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posX] + _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])\r\n\t\t\t|| __posY < (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posY] - _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])\r\n\t\t\t|| __posY > (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posY] + _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])){\r\n\t\t\t\tDisablePlayerCheckpoint(i);\r\n\t\t\t\t_p_VisibleCheckpoint[i] = -1;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// Getting the player Interior and virtual world\r\n\t\t\t__interior = GetPlayerInterior(i);\r\n\t\t\t__virtualWorld = GetPlayerVirtualWorld(i);\r\n\t\t\t\r\n\t\t\t// Looking for a new checkpoint\r\n\t\t\tfor(new j = 0; j < MAX_CHECKPOINTS; j++){\r\n\t\t\t\tif(!_checkpoints[j][_chp_populated]) continue;\r\n\t\t\t\tif((_checkpoints[j][_chp_owner] != i) && (_checkpoints[j][_chp_owner] != -1)) continue;\r\n\t\t\t\tif(_checkpoints[j][_chp_interior_id] != __interior) continue;\r\n\t\t\t\tif(_checkpoints[j][_chp_world_id] != __virtualWorld) continue;\r\n\t\t\t\t\r\n\t\t\t\tif(__posX > (_checkpoints[j][_chp_posX] - _checkpoints[j][_chp_viewDistance])\r\n\t\t\t\t&& __posX < (_checkpoints[j][_chp_posX] + _checkpoints[j][_chp_viewDistance])\r\n\t\t\t\t&& __posY > (_checkpoints[j][_chp_posY] - _checkpoints[j][_chp_viewDistance])\r\n\t\t\t\t&& __posY < (_checkpoints[j][_chp_posY] + _checkpoints[j][_chp_viewDistance])){\r\n\t\t\t\t\tSetPlayerCheckpoint(i, _checkpoints[j][_chp_posX], _checkpoints[j][_chp_posY], _checkpoints[j][_chp_posZ], _checkpoints[j][_chp_size]);\r\n\t\t\t\t\t_p_VisibleCheckpoint[i] = j;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn 1;\r\n}\r\n\r\nstock VerifyCheckpoint(__playerid){\r\n\tif(_p_VisibleCheckpoint[__playerid] >= 0){\r\n\t\tOnCheckpointEnter(__playerid, _checkpoints[_p_VisibleCheckpoint[__playerid]][_chp_id]);\r\n\t\treturn 1;\r\n\t}\r\n\treturn 0;\r\n}"
  },
  {
    "path": "src/test/resources/samples/langs/SourcePawn/fixed.inc",
    "content": "/* Fixed point arithmetic\n *\n * (c) Copyright 1998-2011, ITB CompuPhase\n * This file is provided as is (no warranties).\n */\n#pragma library Fixed\n\nconst fround_method: {\n  fround_round = 0,\n  fround_floor,\n  fround_ceil,\n  fround_tozero,\n  fround_unbiased\n}\n\nnative Fixed:fixed(value);\nnative Fixed:strfixed(const string[]);\nnative Fixed:fmul(Fixed:oper1, Fixed:oper2);\nnative Fixed:fdiv(Fixed:dividend, Fixed:divisor);\nnative Fixed:ffract(Fixed:value);\nnative       fround(Fixed:value, fround_method:method=fround_round);\nnative Fixed:fpower(Fixed:value, exponent);\nnative Fixed:fsqroot(Fixed:value);\nnative Fixed:fabs(Fixed:value);\n\n#pragma rational Fixed(3)\n\n/* user defined operators */\nnative Fixed:operator*(Fixed:oper1, Fixed:oper2) = fmul;\nnative Fixed:operator/(Fixed:oper1, Fixed:oper2) = fdiv;\nnative Fixed:operator=(oper) = fixed;\n\nstock Fixed:operator++(Fixed:oper)\n    return oper + fixed(1);\n\nstock Fixed:operator--(Fixed:oper)\n    return oper - fixed(1);\n\nstock Fixed:operator*(Fixed:oper1, oper2)\n    return Fixed: (_:oper1 * oper2);            /* \"*\" is commutative */\n\nstock Fixed:operator/(Fixed:oper1, oper2)\n    return oper1 / fixed(oper2);\n\nstock Fixed:operator/(oper1, Fixed:oper2)\n    return fdiv(fixed(oper1), oper2);\n\nstock Fixed:operator+(Fixed:oper1, oper2)\n    return oper1 + fixed(oper2);                /* \"+\" is commutative */\n\nstock Fixed:operator-(Fixed:oper1, oper2)\n    return oper1 - fixed(oper2);\n\nstock Fixed:operator-(oper1, Fixed:oper2)\n    return fixed(oper1) - oper2;\n\nstock bool:operator>(Fixed:oper1, oper2)\n    return oper1 > fixed(oper2);\n\nstock bool:operator>(oper1, Fixed:oper2)\n    return fixed(oper1) > oper2;\n\nstock bool:operator>=(Fixed:oper1, oper2)\n    return oper1 >= fixed(oper2);\n\nstock bool:operator>=(oper1, Fixed:oper2)\n    return fixed(oper1) >= oper2;\n\nstock bool:operator<(Fixed:oper1, oper2)\n    return oper1 < fixed(oper2);\n\nstock bool:operator<(oper1, Fixed:oper2)\n    return fixed(oper1) < oper2;\n\nstock bool:operator<=(Fixed:oper1, oper2)\n    return oper1 <= fixed(oper2);\n\nstock bool:operator<=(oper1, Fixed:oper2)\n    return fixed(oper1) <= oper2;\n\nstock bool:operator==(Fixed:oper1, oper2)       /* \"==\" is commutative */\n    return oper1 == fixed(oper2);\n\nstock bool:operator!=(Fixed:oper1, oper2)       /* \"!=\" is commutative */\n    return oper1 != fixed(oper2);\n\n/* forbidden operations */\nforward operator%(Fixed:oper1, Fixed:oper2);\nforward operator%(Fixed:oper1, oper2);\nforward operator%(oper1, Fixed:oper2);\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/SourcePawn/foo.sma",
    "content": "// vim: set ts=4 sw=4 tw=99 noet:\n//\n// AMX Mod X, based on AMX Mod by Aleksander Naszko (\"OLO\").\n// Copyright (C) The AMX Mod X Development Team.\n//\n// This software is licensed under the GNU General Public License, version 3 or higher.\n// Additional exceptions apply. For full license details, see LICENSE.txt or visit:\n//     https://alliedmods.net/amxmodx-license\n\n//\n// TimeLeft Plugin\n//\n\n#include <amxmodx>\n\nconst TASK_TIMEREMAIN_SHORT = 8648458\t// 0.8s repeat task\nconst TASK_TIMEREMAIN_LARGE = 34543\t\t// 1.0s repeat task\n\n// time display flags\nconst TD_BOTTOM_WHITE_TEXT = 1\t\t\t// a - display white text on bottom\nconst TD_USE_VOICE = 2\t\t\t\t\t// b - use voice\nconst TD_NO_REMAINING_VOICE = 4\t\t\t// c - don't add \"remaining\" (only in voice)\nconst TD_NO_HOURS_MINS_SECS_VOICE = 8\t\t// d - don't add \"hours/minutes/seconds\" (only in voice)\nconst TD_SHOW_SPEAK_VALUES_BELOW = 16\t// e - show/speak if current time is less than this set in parameter\n\nnew g_TimeSet[32][2]\nnew g_LastTime\nnew g_CountDown\nnew g_Switch\n\n// pcvars\nnew g_amx_time_voice, g_amx_timeleft\nnew g_mp_timelimit\n\npublic plugin_init()\n{\n\tregister_plugin(\"TimeLeft\", AMXX_VERSION_STR, \"AMXX Dev Team\")\n\tregister_dictionary(\"timeleft.txt\")\n\tg_amx_time_voice = register_cvar(\"amx_time_voice\", \"1\")\n\tregister_srvcmd(\"amx_time_display\", \"setDisplaying\")\n\tg_amx_timeleft = register_cvar(\"amx_timeleft\", \"00:00\", FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_UNLOGGED|FCVAR_SPONLY)\n\tregister_clcmd(\"say timeleft\", \"sayTimeLeft\", 0, \"- displays timeleft\")\n\tregister_clcmd(\"say thetime\", \"sayTheTime\", 0, \"- displays current time\")\n\t\n\tset_task(0.8, \"timeRemain\", TASK_TIMEREMAIN_SHORT, \"\", 0, \"b\")\n\n\tg_mp_timelimit = get_cvar_pointer(\"mp_timelimit\")\n}\n\npublic sayTheTime(id)\n{\n\tif (get_pcvar_num(g_amx_time_voice))\n\t{\n\t\tnew mhours[6], mmins[6], whours[32], wmins[32], wpm[6]\n\t\t\n\t\tget_time(\"%H\", mhours, charsmax(mhours))\n\t\tget_time(\"%M\", mmins, charsmax(mmins))\n\t\t\n\t\tnew mins = str_to_num(mmins)\n\t\tnew hrs = str_to_num(mhours)\n\t\t\n\t\tif (mins)\n\t\t\tnum_to_word(mins, wmins, charsmax(wmins))\n\t\telse\n\t\t\twmins[0] = EOS\n\t\t\n\t\tif (hrs < 12)\n\t\t\twpm = \"am \"\n\t\telse\n\t\t{\n\t\t\tif (hrs > 12) hrs -= 12\n\t\t\twpm = \"pm \"\n\t\t}\n\n\t\tif (hrs) \n\t\t\tnum_to_word(hrs, whours, charsmax(whours))\n\t\telse\n\t\t\twhours = \"twelve \"\n\t\t\n\t\tclient_cmd(id, \"spk ^\"fvox/time_is_now %s_period %s%s^\"\", whours, wmins, wpm)\n\t}\n\t\n\tnew ctime[64]\n\t\n\tget_time(\"%m/%d/%Y - %H:%M:%S\", ctime, charsmax(ctime))\n\tclient_print(0, print_chat, \"%L:   %s\", LANG_PLAYER, \"THE_TIME\", ctime)\n\t\n\treturn PLUGIN_CONTINUE\n}\n\npublic sayTimeLeft(id)\n{\n\tif (get_pcvar_float(g_mp_timelimit))\n\t{\n\t\tnew a = get_timeleft()\n\t\t\n\t\tif (get_pcvar_num(g_amx_time_voice))\n\t\t{\n\t\t\tnew svoice[128]\n\t\t\tsetTimeVoice(svoice, charsmax(svoice), 0, a)\n\t\t\tclient_cmd(id, \"%s\", svoice)\n\t\t}\n\t\tclient_print(0, print_chat, \"%L:  %d:%02d\", LANG_PLAYER, \"TIME_LEFT\", (a / 60), (a % 60))\n\t}\n\telse\n\t\tclient_print(0, print_chat, \"%L\", LANG_PLAYER, \"NO_T_LIMIT\")\n\t\n\treturn PLUGIN_CONTINUE\n}\n\nsetTimeText(text[], len, tmlf, id)\n{\n\tnew secs = tmlf % 60\n\tnew mins = tmlf / 60\n\t\n\tif (secs == 0)\n\t\tformatex(text, len, \"%d %L\", mins, id, (mins > 1) ? \"MINUTES\" : \"MINUTE\")\n\telse if (mins == 0)\n\t\tformatex(text, len, \"%d %L\", secs, id, (secs > 1) ? \"SECONDS\" : \"SECOND\")\n\telse\n\t\tformatex(text, len, \"%d %L %d %L\", mins, id, (mins > 1) ? \"MINUTES\" : \"MINUTE\", secs, id, (secs > 1) ? \"SECONDS\" : \"SECOND\")\n}\n\nsetTimeVoice(text[], len, flags, tmlf)\n{\n\tnew temp[7][32]\n\tnew secs = tmlf % 60\n\tnew mins = tmlf / 60\n\t\n\t// for (new a = 0;a < 7;++a) // we just created it, already null\n\t\t// temp[a][0] = 0\n\n\tif (secs > 0)\n\t{\n\t\tnum_to_word(secs, temp[4], charsmax(temp[]))\n\t\t\n\t\tif ( ~flags & TD_NO_HOURS_MINS_SECS_VOICE ) \n\t\t\ttemp[5] = \"seconds \"\t/* there is no \"second\" in default hl */\n\t}\n\t\n\tif (mins > 59)\n\t{\n\t\tnew hours = mins / 60\n\t\t\n\t\tnum_to_word(hours, temp[0], charsmax(temp[]))\n\t\t\n\t\tif ( ~flags & TD_NO_HOURS_MINS_SECS_VOICE )\n\t\t\ttemp[1] = \"hours \"\n\t\t\n\t\tmins = mins % 60\n\t}\n\t\n\tif (mins > 0)\n\t{\n\t\tnum_to_word(mins, temp[2], charsmax(temp[]))\n\t\t\n\t\tif ( ~flags & TD_NO_HOURS_MINS_SECS_VOICE )\n\t\t\ttemp[3] = \"minutes \"\n\t}\n\t\n\tif ( ~flags & TD_NO_REMAINING_VOICE )\n\t\ttemp[6] = \"remaining \"\n\t\n\treturn formatex(text, len, \"spk ^\"vox/%s%s%s%s%s%s%s^\"\", temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], temp[6])\n}\n\nfindDispFormat(_time)\n{\n\t// it is important to check i<sizeof BEFORE g_TimeSet[i][0] to prevent out of bound error\n\tfor (new i = 0; i < sizeof(g_TimeSet) && g_TimeSet[i][0]; ++i)\n\t{\n\t\tif (g_TimeSet[i][1] & TD_SHOW_SPEAK_VALUES_BELOW)\n\t\t{\n\t\t\tif (g_TimeSet[i][0] > _time)\n\t\t\t{\n\t\t\t\tif (!g_Switch)\n\t\t\t\t{\n\t\t\t\t\tg_CountDown = g_Switch = _time\n\t\t\t\t\tremove_task(TASK_TIMEREMAIN_SHORT)\n\t\t\t\t\tset_task(1.0, \"timeRemain\", TASK_TIMEREMAIN_LARGE, \"\", 0, \"b\")\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn i\n\t\t\t}\n\t\t}\n\t\telse if (g_TimeSet[i][0] == _time)\n\t\t{\n\t\t\treturn i\n\t\t}\n\t}\n\t\n\treturn -1\n}\n\npublic setDisplaying()\n{\n\tnew arg[32], flags[32], num[32]\n\tnew argc = read_argc() - 1\n\tnew i = 0\n\n\twhile (i < argc && i < sizeof(g_TimeSet))\n\t{\n\t\tread_argv(i + 1, arg, charsmax(arg))\n\t\tparse(arg, flags, charsmax(flags), num, charsmax(num))\n\t\t\n\t\tg_TimeSet[i][0] = str_to_num(num)\n\t\tg_TimeSet[i][1] = read_flags(flags)\n\t\t\n\t\ti++\n\t}\n\n\tif( i < sizeof(g_TimeSet) )\n\t\tg_TimeSet[i][0] = 0 // has to be zeroed in case command is sent twice\n\t\n\treturn PLUGIN_HANDLED\n}\n\npublic timeRemain(param[])\n{\n\tnew gmtm = get_timeleft()\n\tnew tmlf = g_Switch ? --g_CountDown : gmtm\n\tnew stimel[12]\n\t\n\tformatex(stimel, charsmax(stimel), \"%02d:%02d\", gmtm / 60, gmtm % 60)\n\tset_pcvar_string(g_amx_timeleft, stimel)\n\t\n\tif (g_Switch && gmtm > g_Switch)\n\t{\n\t\tremove_task(TASK_TIMEREMAIN_LARGE)\n\t\tg_Switch = 0\n\t\tset_task(0.8, \"timeRemain\", TASK_TIMEREMAIN_SHORT, \"\", 0, \"b\")\n\t\t\n\t\treturn\n\t}\n\n\tif (tmlf > 0 && g_LastTime != tmlf)\n\t{\n\t\tg_LastTime = tmlf\n\t\tnew tm_set = findDispFormat(tmlf)\n\t\t\n\t\tif (tm_set != -1)\n\t\t{\n\t\t\tnew flags = g_TimeSet[tm_set][1]\n\t\t\tnew arg[128]\n\t\t\t\n\t\t\tif (flags & TD_BOTTOM_WHITE_TEXT)\n\t\t\t{\n\t\t\t\tnew players[MAX_PLAYERS], pnum, plr\n\t\t\t\t\n\t\t\t\tget_players(players, pnum, \"c\")\n\n\t\t\t\tif (flags & TD_SHOW_SPEAK_VALUES_BELOW) // yes this is correct flag, just because message should be shorter if it is shown every seconds\n\t\t\t\t\tset_hudmessage(255, 255, 255, -1.0, 0.85, 0, 0.0, 1.1, 0.1, 0.5, -1)\n\t\t\t\telse\n\t\t\t\t\tset_hudmessage(255, 255, 255, -1.0, 0.85, 0, 0.0, 3.0, 0.0, 0.5, -1)\n\t\t\t\t\t\n\t\t\t\tfor (new i = 0; i < pnum; i++)\n\t\t\t\t{\n\t\t\t\t\tplr = players[i]\n\t\t\t\t\tsetTimeText(arg, charsmax(arg), tmlf, plr)\n\t\t\t\t\tshow_hudmessage(plr, \"%s\", arg)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (flags & TD_USE_VOICE)\n\t\t\t{\n\t\t\t\tsetTimeVoice(arg, charsmax(arg), flags, tmlf)\n\t\t\t\tclient_cmd(0, \"%s\", arg)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/SourcePawn/foo.sp",
    "content": "/**\n * vim: set ts=4 :\n * =============================================================================\n * SourceMod Mapchooser Plugin\n * Creates a map vote at appropriate times, setting sm_nextmap to the winning\n * vote\n *\n * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.\n * =============================================================================\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the GNU General Public License, version 3.0, as published by the\n * Free Software Foundation.\n * \n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\n * details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n * As a special exception, AlliedModders LLC gives you permission to link the\n * code of this program (as well as its derivative works) to \"Half-Life 2,\" the\n * \"Source Engine,\" the \"SourcePawn JIT,\" and any Game MODs that run on software\n * by the Valve Corporation.  You must obey the GNU General Public License in\n * all respects for all other code used.  Additionally, AlliedModders LLC grants\n * this exception to all derivative works.  AlliedModders LLC defines further\n * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),\n * or <http://www.sourcemod.net/license.php>.\n *\n * Version: $Id$\n */\n \n//#define DEBUG\n\n#if defined DEBUG\n\t#define assert(%1) if (!(%1)) ThrowError(\"Debug Assertion Failed\");\n\t#define assert_msg(%1,%2) if (!(%1)) ThrowError(%2);\n#else\n\t#define assert(%1)\n\t#define assert_msg(%1,%2)\n#endif\n\n#pragma semicolon 1\n#include <sourcemod>\n#include <mapchooser>\n#include <nextmap>\n\npublic Plugin:myinfo =\n{\n\tname = \"MapChooser\",\n\tauthor = \"AlliedModders LLC\",\n\tdescription = \"Automated Map Voting\",\n\tversion = SOURCEMOD_VERSION,\n\turl = \"http://www.sourcemod.net/\"\n};\n\n/* Valve ConVars */\nnew Handle:g_Cvar_Winlimit = INVALID_HANDLE;\nnew Handle:g_Cvar_Maxrounds = INVALID_HANDLE;\nnew Handle:g_Cvar_Fraglimit = INVALID_HANDLE;\nnew Handle:g_Cvar_Bonusroundtime = INVALID_HANDLE;\n\n/* Plugin ConVars */\nnew Handle:g_Cvar_StartTime = INVALID_HANDLE;\nnew Handle:g_Cvar_StartRounds = INVALID_HANDLE;\nnew Handle:g_Cvar_StartFrags = INVALID_HANDLE;\nnew Handle:g_Cvar_ExtendTimeStep = INVALID_HANDLE;\nnew Handle:g_Cvar_ExtendRoundStep = INVALID_HANDLE;\nnew Handle:g_Cvar_ExtendFragStep = INVALID_HANDLE;\nnew Handle:g_Cvar_ExcludeMaps = INVALID_HANDLE;\nnew Handle:g_Cvar_IncludeMaps = INVALID_HANDLE;\nnew Handle:g_Cvar_NoVoteMode = INVALID_HANDLE;\nnew Handle:g_Cvar_Extend = INVALID_HANDLE;\nnew Handle:g_Cvar_DontChange = INVALID_HANDLE;\nnew Handle:g_Cvar_EndOfMapVote = INVALID_HANDLE;\nnew Handle:g_Cvar_VoteDuration = INVALID_HANDLE;\nnew Handle:g_Cvar_RunOff = INVALID_HANDLE;\nnew Handle:g_Cvar_RunOffPercent = INVALID_HANDLE;\n\nnew Handle:g_VoteTimer = INVALID_HANDLE;\nnew Handle:g_RetryTimer = INVALID_HANDLE;\n\n/* Data Handles */\nnew Handle:g_MapList = INVALID_HANDLE;\nnew Handle:g_NominateList = INVALID_HANDLE;\nnew Handle:g_NominateOwners = INVALID_HANDLE;\nnew Handle:g_OldMapList = INVALID_HANDLE;\nnew Handle:g_NextMapList = INVALID_HANDLE;\nnew Handle:g_VoteMenu = INVALID_HANDLE;\n\nnew g_Extends;\nnew g_TotalRounds;\nnew bool:g_HasVoteStarted;\nnew bool:g_WaitingForVote;\nnew bool:g_MapVoteCompleted;\nnew bool:g_ChangeMapAtRoundEnd;\nnew bool:g_ChangeMapInProgress;\nnew g_mapFileSerial = -1;\n\nnew g_NominateCount = 0;\nnew MapChange:g_ChangeTime;\n\nnew Handle:g_NominationsResetForward = INVALID_HANDLE;\nnew Handle:g_MapVoteStartedForward = INVALID_HANDLE;\n\n/* Upper bound of how many team there could be */\n#define MAXTEAMS 10\nnew g_winCount[MAXTEAMS];\n\n#define VOTE_EXTEND \"##extend##\"\n#define VOTE_DONTCHANGE \"##dontchange##\"\n\npublic OnPluginStart()\n{\n\tLoadTranslations(\"mapchooser.phrases\");\n\tLoadTranslations(\"common.phrases\");\n\t\n\tnew arraySize = ByteCountToCells(PLATFORM_MAX_PATH);\n\tg_MapList = CreateArray(arraySize);\n\tg_NominateList = CreateArray(arraySize);\n\tg_NominateOwners = CreateArray(1);\n\tg_OldMapList = CreateArray(arraySize);\n\tg_NextMapList = CreateArray(arraySize);\n\t\n\tg_Cvar_EndOfMapVote = CreateConVar(\"sm_mapvote_endvote\", \"1\", \"Specifies if MapChooser should run an end of map vote\", _, true, 0.0, true, 1.0);\n\n\tg_Cvar_StartTime = CreateConVar(\"sm_mapvote_start\", \"3.0\", \"Specifies when to start the vote based on time remaining.\", _, true, 1.0);\n\tg_Cvar_StartRounds = CreateConVar(\"sm_mapvote_startround\", \"2.0\", \"Specifies when to start the vote based on rounds remaining. Use 0 on TF2 to start vote during bonus round time\", _, true, 0.0);\n\tg_Cvar_StartFrags = CreateConVar(\"sm_mapvote_startfrags\", \"5.0\", \"Specifies when to start the vote base on frags remaining.\", _, true, 1.0);\n\tg_Cvar_ExtendTimeStep = CreateConVar(\"sm_extendmap_timestep\", \"15\", \"Specifies how much many more minutes each extension makes\", _, true, 5.0);\n\tg_Cvar_ExtendRoundStep = CreateConVar(\"sm_extendmap_roundstep\", \"5\", \"Specifies how many more rounds each extension makes\", _, true, 1.0);\n\tg_Cvar_ExtendFragStep = CreateConVar(\"sm_extendmap_fragstep\", \"10\", \"Specifies how many more frags are allowed when map is extended.\", _, true, 5.0);\t\n\tg_Cvar_ExcludeMaps = CreateConVar(\"sm_mapvote_exclude\", \"5\", \"Specifies how many past maps to exclude from the vote.\", _, true, 0.0);\n\tg_Cvar_IncludeMaps = CreateConVar(\"sm_mapvote_include\", \"5\", \"Specifies how many maps to include in the vote.\", _, true, 2.0, true, 6.0);\n\tg_Cvar_NoVoteMode = CreateConVar(\"sm_mapvote_novote\", \"1\", \"Specifies whether or not MapChooser should pick a map if no votes are received.\", _, true, 0.0, true, 1.0);\n\tg_Cvar_Extend = CreateConVar(\"sm_mapvote_extend\", \"0\", \"Number of extensions allowed each map.\", _, true, 0.0);\n\tg_Cvar_DontChange = CreateConVar(\"sm_mapvote_dontchange\", \"1\", \"Specifies if a 'Don't Change' option should be added to early votes\", _, true, 0.0);\n\tg_Cvar_VoteDuration = CreateConVar(\"sm_mapvote_voteduration\", \"20\", \"Specifies how long the mapvote should be available for.\", _, true, 5.0);\n\tg_Cvar_RunOff = CreateConVar(\"sm_mapvote_runoff\", \"0\", \"Hold run of votes if winning choice is less than a certain margin\", _, true, 0.0, true, 1.0);\n\tg_Cvar_RunOffPercent = CreateConVar(\"sm_mapvote_runoffpercent\", \"50\", \"If winning choice has less than this percent of votes, hold a runoff\", _, true, 0.0, true, 100.0);\n\t\n\tRegAdminCmd(\"sm_mapvote\", Command_Mapvote, ADMFLAG_CHANGEMAP, \"sm_mapvote - Forces MapChooser to attempt to run a map vote now.\");\n\tRegAdminCmd(\"sm_setnextmap\", Command_SetNextmap, ADMFLAG_CHANGEMAP, \"sm_setnextmap <map>\");\n\n\tg_Cvar_Winlimit = FindConVar(\"mp_winlimit\");\n\tg_Cvar_Maxrounds = FindConVar(\"mp_maxrounds\");\n\tg_Cvar_Fraglimit = FindConVar(\"mp_fraglimit\");\n\tg_Cvar_Bonusroundtime = FindConVar(\"mp_bonusroundtime\");\n\t\n\tif (g_Cvar_Winlimit != INVALID_HANDLE || g_Cvar_Maxrounds != INVALID_HANDLE)\n\t{\n\t\tdecl String:folder[64];\n\t\tGetGameFolderName(folder, sizeof(folder));\n\n\t\tif (strcmp(folder, \"tf\") == 0)\n\t\t{\n\t\t\tHookEvent(\"teamplay_win_panel\", Event_TeamPlayWinPanel);\n\t\t\tHookEvent(\"teamplay_restart_round\", Event_TFRestartRound);\n\t\t\tHookEvent(\"arena_win_panel\", Event_TeamPlayWinPanel);\n\t\t}\n\t\telse if (strcmp(folder, \"nucleardawn\") == 0)\n\t\t{\n\t\t\tHookEvent(\"round_win\", Event_RoundEnd);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tHookEvent(\"round_end\", Event_RoundEnd);\n\t\t}\n\t}\n\t\n\tif (g_Cvar_Fraglimit != INVALID_HANDLE)\n\t{\n\t\tHookEvent(\"player_death\", Event_PlayerDeath);\t\t\n\t}\n\t\n\tAutoExecConfig(true, \"mapchooser\");\n\t\n\t//Change the mp_bonusroundtime max so that we have time to display the vote\n\t//If you display a vote during bonus time good defaults are 17 vote duration and 19 mp_bonustime\n\tif (g_Cvar_Bonusroundtime != INVALID_HANDLE)\n\t{\n\t\tSetConVarBounds(g_Cvar_Bonusroundtime, ConVarBound_Upper, true, 30.0);\t\t\n\t}\n\t\n\tg_NominationsResetForward = CreateGlobalForward(\"OnNominationRemoved\", ET_Ignore, Param_String, Param_Cell);\n\tg_MapVoteStartedForward = CreateGlobalForward(\"OnMapVoteStarted\", ET_Ignore);\n}\n\npublic APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)\n{\n\tRegPluginLibrary(\"mapchooser\");\t\n\t\n\tCreateNative(\"NominateMap\", Native_NominateMap);\n\tCreateNative(\"RemoveNominationByMap\", Native_RemoveNominationByMap);\n\tCreateNative(\"RemoveNominationByOwner\", Native_RemoveNominationByOwner);\n\tCreateNative(\"InitiateMapChooserVote\", Native_InitiateVote);\n\tCreateNative(\"CanMapChooserStartVote\", Native_CanVoteStart);\n\tCreateNative(\"HasEndOfMapVoteFinished\", Native_CheckVoteDone);\n\tCreateNative(\"GetExcludeMapList\", Native_GetExcludeMapList);\n\tCreateNative(\"GetNominatedMapList\", Native_GetNominatedMapList);\n\tCreateNative(\"EndOfMapVoteEnabled\", Native_EndOfMapVoteEnabled);\n\n\treturn APLRes_Success;\n}\n\npublic OnConfigsExecuted()\n{\n\tif (ReadMapList(g_MapList,\n\t\t\t\t\t g_mapFileSerial, \n\t\t\t\t\t \"mapchooser\",\n\t\t\t\t\t MAPLIST_FLAG_CLEARARRAY|MAPLIST_FLAG_MAPSFOLDER)\n\t\t!= INVALID_HANDLE)\n\t\t\n\t{\n\t\tif (g_mapFileSerial == -1)\n\t\t{\n\t\t\tLogError(\"Unable to create a valid map list.\");\n\t\t}\n\t}\n\t\n\tCreateNextVote();\n\tSetupTimeleftTimer();\n\t\n\tg_TotalRounds = 0;\n\t\n\tg_Extends = 0;\n\t\n\tg_MapVoteCompleted = false;\n\t\n\tg_NominateCount = 0;\n\tClearArray(g_NominateList);\n\tClearArray(g_NominateOwners);\n\t\n\tfor (new i=0; i<MAXTEAMS; i++)\n\t{\n\t\tg_winCount[i] = 0;\t\n\t}\n\t\n\n\t/* Check if mapchooser will attempt to start mapvote during bonus round time - TF2 Only */\n\tif ((g_Cvar_Bonusroundtime != INVALID_HANDLE) && !GetConVarInt(g_Cvar_StartRounds))\n\t{\n\t\tif (GetConVarFloat(g_Cvar_Bonusroundtime) <= GetConVarFloat(g_Cvar_VoteDuration))\n\t\t{\n\t\t\tLogError(\"Warning - Bonus Round Time shorter than Vote Time. Votes during bonus round may not have time to complete\");\n\t\t}\n\t}\n}\n\npublic OnMapEnd()\n{\n\tg_HasVoteStarted = false;\n\tg_WaitingForVote = false;\n\tg_ChangeMapAtRoundEnd = false;\n\tg_ChangeMapInProgress = false;\n\t\n\tg_VoteTimer = INVALID_HANDLE;\n\tg_RetryTimer = INVALID_HANDLE;\n\t\n\tdecl String:map[PLATFORM_MAX_PATH];\n\tGetCurrentMap(map, sizeof(map));\n\tPushArrayString(g_OldMapList, map);\n\t\t\t\t\n\tif (GetArraySize(g_OldMapList) > GetConVarInt(g_Cvar_ExcludeMaps))\n\t{\n\t\tRemoveFromArray(g_OldMapList, 0);\n\t}\t\n}\n\npublic OnClientDisconnect(client)\n{\n\tnew index = FindValueInArray(g_NominateOwners, client);\n\t\n\tif (index == -1)\n\t{\n\t\treturn;\n\t}\n\t\n\tnew String:oldmap[PLATFORM_MAX_PATH];\n\tGetArrayString(g_NominateList, index, oldmap, sizeof(oldmap));\n\tCall_StartForward(g_NominationsResetForward);\n\tCall_PushString(oldmap);\n\tCall_PushCell(GetArrayCell(g_NominateOwners, index));\n\tCall_Finish();\n\t\n\tRemoveFromArray(g_NominateOwners, index);\n\tRemoveFromArray(g_NominateList, index);\n\tg_NominateCount--;\n}\n\npublic Action:Command_SetNextmap(client, args)\n{\n\tif (args < 1)\n\t{\n\t\tReplyToCommand(client, \"[SM] Usage: sm_setnextmap <map>\");\n\t\treturn Plugin_Handled;\n\t}\n\n\tdecl String:map[PLATFORM_MAX_PATH];\n\tGetCmdArg(1, map, sizeof(map));\n\n\tif (!IsMapValid(map))\n\t{\n\t\tReplyToCommand(client, \"[SM] %t\", \"Map was not found\", map);\n\t\treturn Plugin_Handled;\n\t}\n\n\tShowActivity(client, \"%t\", \"Changed Next Map\", map);\n\tLogAction(client, -1, \"\\\"%L\\\" changed nextmap to \\\"%s\\\"\", client, map);\n\n\tSetNextMap(map);\n\tg_MapVoteCompleted = true;\n\n\treturn Plugin_Handled;\n}\n\npublic OnMapTimeLeftChanged()\n{\n\tif (GetArraySize(g_MapList))\n\t{\n\t\tSetupTimeleftTimer();\n\t}\n}\n\nSetupTimeleftTimer()\n{\n\tnew time;\n\tif (GetMapTimeLeft(time) && time > 0)\n\t{\n\t\tnew startTime = GetConVarInt(g_Cvar_StartTime) * 60;\n\t\tif (time - startTime < 0 && GetConVarBool(g_Cvar_EndOfMapVote) && !g_MapVoteCompleted && !g_HasVoteStarted)\n\t\t{\n\t\t\tInitiateVote(MapChange_MapEnd, INVALID_HANDLE);\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (g_VoteTimer != INVALID_HANDLE)\n\t\t\t{\n\t\t\t\tKillTimer(g_VoteTimer);\n\t\t\t\tg_VoteTimer = INVALID_HANDLE;\n\t\t\t}\t\n\t\t\t\n\t\t\t//g_VoteTimer = CreateTimer(float(time - startTime), Timer_StartMapVote, _, TIMER_FLAG_NO_MAPCHANGE);\n\t\t\tnew Handle:data;\n\t\t\tg_VoteTimer = CreateDataTimer(float(time - startTime), Timer_StartMapVote, data, TIMER_FLAG_NO_MAPCHANGE);\n\t\t\tWritePackCell(data, _:MapChange_MapEnd);\n\t\t\tWritePackCell(data, _:INVALID_HANDLE);\n\t\t\tResetPack(data);\n\t\t}\t\t\n\t}\n}\n\npublic Action:Timer_StartMapVote(Handle:timer, Handle:data)\n{\n\tif (timer == g_RetryTimer)\n\t{\n\t\tg_WaitingForVote = false;\n\t\tg_RetryTimer = INVALID_HANDLE;\n\t}\n\telse\n\t{\n\t\tg_VoteTimer = INVALID_HANDLE;\n\t}\n\t\n\tif (!GetArraySize(g_MapList) || !GetConVarBool(g_Cvar_EndOfMapVote) || g_MapVoteCompleted || g_HasVoteStarted)\n\t{\n\t\treturn Plugin_Stop;\n\t}\n\t\n\tnew MapChange:mapChange = MapChange:ReadPackCell(data);\n\tnew Handle:hndl = Handle:ReadPackCell(data);\n\n\tInitiateVote(mapChange, hndl);\n\n\treturn Plugin_Stop;\n}\n\npublic Event_TFRestartRound(Handle:event, const String:name[], bool:dontBroadcast)\n{\n\t/* Game got restarted - reset our round count tracking */\n\tg_TotalRounds = 0;\t\n}\n\npublic Event_TeamPlayWinPanel(Handle:event, const String:name[], bool:dontBroadcast)\n{\n\tif (g_ChangeMapAtRoundEnd)\n\t{\n\t\tg_ChangeMapAtRoundEnd = false;\n\t\tCreateTimer(2.0, Timer_ChangeMap, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE);\n\t\tg_ChangeMapInProgress = true;\n\t}\n\t\n\tnew bluescore = GetEventInt(event, \"blue_score\");\n\tnew redscore = GetEventInt(event, \"red_score\");\n\t\t\n\tif(GetEventInt(event, \"round_complete\") == 1 || StrEqual(name, \"arena_win_panel\"))\n\t{\n\t\tg_TotalRounds++;\n\t\t\n\t\tif (!GetArraySize(g_MapList) || g_HasVoteStarted || g_MapVoteCompleted || !GetConVarBool(g_Cvar_EndOfMapVote))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tCheckMaxRounds(g_TotalRounds);\n\t\t\n\t\tswitch(GetEventInt(event, \"winning_team\"))\n\t\t{\n\t\t\tcase 3:\n\t\t\t{\n\t\t\t\tCheckWinLimit(bluescore);\n\t\t\t}\n\t\t\tcase 2:\n\t\t\t{\n\t\t\t\tCheckWinLimit(redscore);\t\t\t\t\n\t\t\t}\t\t\t\n\t\t\t//We need to do nothing on winning_team == 0 this indicates stalemate.\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\t\t\t\n\t\t}\n\t}\n}\n/* You ask, why don't you just use team_score event? And I answer... Because CSS doesn't. */\npublic Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)\n{\n\tif (g_ChangeMapAtRoundEnd)\n\t{\n\t\tg_ChangeMapAtRoundEnd = false;\n\t\tCreateTimer(2.0, Timer_ChangeMap, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE);\n\t\tg_ChangeMapInProgress = true;\n\t}\n\t\n\tnew winner;\n\tif (strcmp(name, \"round_win\") == 0)\n\t{\n\t\t// Nuclear Dawn\n\t\twinner = GetEventInt(event, \"team\");\n\t}\n\telse\n\t{\n\t\twinner = GetEventInt(event, \"winner\");\n\t}\n\t\n\tif (winner == 0 || winner == 1 || !GetConVarBool(g_Cvar_EndOfMapVote))\n\t{\n\t\treturn;\n\t}\n\t\n\tif (winner >= MAXTEAMS)\n\t{\n\t\tSetFailState(\"Mod exceed maximum team count - Please file a bug report.\");\t\n\t}\n\n\tg_TotalRounds++;\n\t\n\tg_winCount[winner]++;\n\t\n\tif (!GetArraySize(g_MapList) || g_HasVoteStarted || g_MapVoteCompleted)\n\t{\n\t\treturn;\n\t}\n\t\n\tCheckWinLimit(g_winCount[winner]);\n\tCheckMaxRounds(g_TotalRounds);\n}\n\npublic CheckWinLimit(winner_score)\n{\t\n\tif (g_Cvar_Winlimit != INVALID_HANDLE)\n\t{\n\t\tnew winlimit = GetConVarInt(g_Cvar_Winlimit);\n\t\tif (winlimit)\n\t\t{\t\t\t\n\t\t\tif (winner_score >= (winlimit - GetConVarInt(g_Cvar_StartRounds)))\n\t\t\t{\n\t\t\t\tInitiateVote(MapChange_MapEnd, INVALID_HANDLE);\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic CheckMaxRounds(roundcount)\n{\t\t\n\tif (g_Cvar_Maxrounds != INVALID_HANDLE)\n\t{\n\t\tnew maxrounds = GetConVarInt(g_Cvar_Maxrounds);\n\t\tif (maxrounds)\n\t\t{\n\t\t\tif (roundcount >= (maxrounds - GetConVarInt(g_Cvar_StartRounds)))\n\t\t\t{\n\t\t\t\tInitiateVote(MapChange_MapEnd, INVALID_HANDLE);\n\t\t\t}\t\t\t\n\t\t}\n\t}\n}\n\npublic Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)\n{\n\tif (!GetArraySize(g_MapList) || g_Cvar_Fraglimit == INVALID_HANDLE || g_HasVoteStarted)\n\t{\n\t\treturn;\n\t}\n\t\n\tif (!GetConVarInt(g_Cvar_Fraglimit) || !GetConVarBool(g_Cvar_EndOfMapVote))\n\t{\n\t\treturn;\n\t}\n\n\tif (g_MapVoteCompleted)\n\t{\n\t\treturn;\n\t}\n\n\tnew fragger = GetClientOfUserId(GetEventInt(event, \"attacker\"));\n\n\tif (!fragger)\n\t{\n\t\treturn;\n\t}\n\n\tif (GetClientFrags(fragger) >= (GetConVarInt(g_Cvar_Fraglimit) - GetConVarInt(g_Cvar_StartFrags)))\n\t{\n\t\tInitiateVote(MapChange_MapEnd, INVALID_HANDLE);\n\t}\n}\n\npublic Action:Command_Mapvote(client, args)\n{\n\tInitiateVote(MapChange_MapEnd, INVALID_HANDLE);\n\n\treturn Plugin_Handled;\t\n}\n\n/**\n * Starts a new map vote\n *\n * @param when\t\t\tWhen the resulting map change should occur.\n * @param inputlist\t\tOptional list of maps to use for the vote, otherwise an internal list of nominations + random maps will be used.\n * @param noSpecials\tBlock special vote options like extend/nochange (upgrade this to bitflags instead?)\n */\nInitiateVote(MapChange:when, Handle:inputlist=INVALID_HANDLE)\n{\n\tg_WaitingForVote = true;\n\t\n\tif (IsVoteInProgress())\n\t{\n\t\t// Can't start a vote, try again in 5 seconds.\n\t\t//g_RetryTimer = CreateTimer(5.0, Timer_StartMapVote, _, TIMER_FLAG_NO_MAPCHANGE);\n\t\t\n\t\tnew Handle:data;\n\t\tg_RetryTimer = CreateDataTimer(5.0, Timer_StartMapVote, data, TIMER_FLAG_NO_MAPCHANGE);\n\t\tWritePackCell(data, _:when);\n\t\tWritePackCell(data, _:inputlist);\n\t\tResetPack(data);\n\t\treturn;\n\t}\n\t\n\t/* If the main map vote has completed (and chosen result) and its currently changing (not a delayed change) we block further attempts */\n\tif (g_MapVoteCompleted && g_ChangeMapInProgress)\n\t{\n\t\treturn;\n\t}\n\t\n\tg_ChangeTime = when;\n\t\n\tg_WaitingForVote = false;\n\t\t\n\tg_HasVoteStarted = true;\n\tg_VoteMenu = CreateMenu(Handler_MapVoteMenu, MenuAction:MENU_ACTIONS_ALL);\n\tSetMenuTitle(g_VoteMenu, \"Vote Nextmap\");\n\tSetVoteResultCallback(g_VoteMenu, Handler_MapVoteFinished);\n\n\t/* Call OnMapVoteStarted() Forward */\n\tCall_StartForward(g_MapVoteStartedForward);\n\tCall_Finish();\n\t\n\t/**\n\t * TODO: Make a proper decision on when to clear the nominations list.\n\t * Currently it clears when used, and stays if an external list is provided.\n\t * Is this the right thing to do? External lists will probably come from places\n\t * like sm_mapvote from the adminmenu in the future.\n\t */\n\t \n\tdecl String:map[PLATFORM_MAX_PATH];\n\t\n\t/* No input given - User our internal nominations and maplist */\n\tif (inputlist == INVALID_HANDLE)\n\t{\n\t\tnew nominateCount = GetArraySize(g_NominateList);\n\t\tnew voteSize = GetConVarInt(g_Cvar_IncludeMaps);\n\t\t\n\t\t/* Smaller of the two - It should be impossible for nominations to exceed the size though (cvar changed mid-map?) */\n\t\tnew nominationsToAdd = nominateCount >= voteSize ? voteSize : nominateCount;\n\t\t\n\t\t\n\t\tfor (new i=0; i<nominationsToAdd; i++)\n\t\t{\n\t\t\tGetArrayString(g_NominateList, i, map, sizeof(map));\n\t\t\tAddMenuItem(g_VoteMenu, map, map);\n\t\t\tRemoveStringFromArray(g_NextMapList, map);\n\t\t\t\n\t\t\t/* Notify Nominations that this map is now free */\n\t\t\tCall_StartForward(g_NominationsResetForward);\n\t\t\tCall_PushString(map);\n\t\t\tCall_PushCell(GetArrayCell(g_NominateOwners, i));\n\t\t\tCall_Finish();\n\t\t}\n\t\t\n\t\t/* Clear out the rest of the nominations array */\n\t\tfor (new i=nominationsToAdd; i<nominateCount; i++)\n\t\t{\n\t\t\tGetArrayString(g_NominateList, i, map, sizeof(map));\n\t\t\t/* These maps shouldn't be excluded from the vote as they weren't really nominated at all */\n\t\t\t\n\t\t\t/* Notify Nominations that this map is now free */\n\t\t\tCall_StartForward(g_NominationsResetForward);\n\t\t\tCall_PushString(map);\n\t\t\tCall_PushCell(GetArrayCell(g_NominateOwners, i));\n\t\t\tCall_Finish();\t\t\t\n\t\t}\n\t\t\n\t\t/* There should currently be 'nominationsToAdd' unique maps in the vote */\n\t\t\n\t\tnew i = nominationsToAdd;\n\t\tnew count = 0;\n\t\tnew availableMaps = GetArraySize(g_NextMapList);\n\t\t\n\t\twhile (i < voteSize)\n\t\t{\n\t\t\tGetArrayString(g_NextMapList, count, map, sizeof(map));\n\t\t\tcount++;\n\t\t\t\n\t\t\t/* Insert the map and increment our count */\n\t\t\tAddMenuItem(g_VoteMenu, map, map);\n\t\t\ti++;\n\t\t\t\n\t\t\tif (count >= availableMaps)\n\t\t\t{\n\t\t\t\t//Run out of maps, this will have to do.\n\t\t\t\tbreak;\t\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Wipe out our nominations list - Nominations have already been informed of this */\n\t\tClearArray(g_NominateOwners);\n\t\tClearArray(g_NominateList);\n\t}\n\telse //We were given a list of maps to start the vote with\n\t{\n\t\tnew size = GetArraySize(inputlist);\n\t\t\n\t\tfor (new i=0; i<size; i++)\n\t\t{\n\t\t\tGetArrayString(inputlist, i, map, sizeof(map));\n\t\t\t\n\t\t\tif (IsMapValid(map))\n\t\t\t{\n\t\t\t\tAddMenuItem(g_VoteMenu, map, map);\n\t\t\t}\t\n\t\t}\n\t}\n\t\n\t/* Do we add any special items? */\n\tif ((when == MapChange_Instant || when == MapChange_RoundEnd) && GetConVarBool(g_Cvar_DontChange))\n\t{\n\t\tAddMenuItem(g_VoteMenu, VOTE_DONTCHANGE, \"Don't Change\");\n\t}\n\telse if (GetConVarBool(g_Cvar_Extend) && g_Extends < GetConVarInt(g_Cvar_Extend))\n\t{\n\t\tAddMenuItem(g_VoteMenu, VOTE_EXTEND, \"Extend Map\");\n\t}\n\t\n\tnew voteDuration = GetConVarInt(g_Cvar_VoteDuration);\n\n\tSetMenuExitButton(g_VoteMenu, false);\n\tVoteMenuToAll(g_VoteMenu, voteDuration);\n\n\tLogAction(-1, -1, \"Voting for next map has started.\");\n\tPrintToChatAll(\"[SM] %t\", \"Nextmap Voting Started\");\n}\n\npublic Handler_VoteFinishedGeneric(Handle:menu,\n\t\t\t\t\t\t   num_votes, \n\t\t\t\t\t\t   num_clients,\n\t\t\t\t\t\t   const client_info[][2], \n\t\t\t\t\t\t   num_items,\n\t\t\t\t\t\t   const item_info[][2])\n{\n\tdecl String:map[PLATFORM_MAX_PATH];\n\tGetMenuItem(menu, item_info[0][VOTEINFO_ITEM_INDEX], map, sizeof(map));\n\n\tif (strcmp(map, VOTE_EXTEND, false) == 0)\n\t{\n\t\tg_Extends++;\n\t\t\n\t\tnew time;\n\t\tif (GetMapTimeLimit(time))\n\t\t{\n\t\t\tif (time > 0)\n\t\t\t{\n\t\t\t\tExtendMapTimeLimit(GetConVarInt(g_Cvar_ExtendTimeStep)*60);\t\t\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (g_Cvar_Winlimit != INVALID_HANDLE)\n\t\t{\n\t\t\tnew winlimit = GetConVarInt(g_Cvar_Winlimit);\n\t\t\tif (winlimit)\n\t\t\t{\n\t\t\t\tSetConVarInt(g_Cvar_Winlimit, winlimit + GetConVarInt(g_Cvar_ExtendRoundStep));\n\t\t\t}\t\t\t\t\t\n\t\t}\n\t\t\n\t\tif (g_Cvar_Maxrounds != INVALID_HANDLE)\n\t\t{\n\t\t\tnew maxrounds = GetConVarInt(g_Cvar_Maxrounds);\n\t\t\tif (maxrounds)\n\t\t\t{\n\t\t\t\tSetConVarInt(g_Cvar_Maxrounds, maxrounds + GetConVarInt(g_Cvar_ExtendRoundStep));\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (g_Cvar_Fraglimit != INVALID_HANDLE)\n\t\t{\n\t\t\tnew fraglimit = GetConVarInt(g_Cvar_Fraglimit);\n\t\t\tif (fraglimit)\n\t\t\t{\n\t\t\t\tSetConVarInt(g_Cvar_Fraglimit, fraglimit + GetConVarInt(g_Cvar_ExtendFragStep));\t\t\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t\tPrintToChatAll(\"[SM] %t\", \"Current Map Extended\", RoundToFloor(float(item_info[0][VOTEINFO_ITEM_VOTES])/float(num_votes)*100), num_votes);\n\t\tLogAction(-1, -1, \"Voting for next map has finished. The current map has been extended.\");\n\t\t\n\t\t// We extended, so we'll have to vote again.\n\t\tg_HasVoteStarted = false;\n\t\tCreateNextVote();\n\t\tSetupTimeleftTimer();\n\t\t\n\t}\n\telse if (strcmp(map, VOTE_DONTCHANGE, false) == 0)\n\t{\n\t\tPrintToChatAll(\"[SM] %t\", \"Current Map Stays\", RoundToFloor(float(item_info[0][VOTEINFO_ITEM_VOTES])/float(num_votes)*100), num_votes);\n\t\tLogAction(-1, -1, \"Voting for next map has finished. 'No Change' was the winner\");\n\t\t\n\t\tg_HasVoteStarted = false;\n\t\tCreateNextVote();\n\t\tSetupTimeleftTimer();\n\t}\n\telse\n\t{\n\t\tif (g_ChangeTime == MapChange_MapEnd)\n\t\t{\n\t\t\tSetNextMap(map);\n\t\t}\n\t\telse if (g_ChangeTime == MapChange_Instant)\n\t\t{\n\t\t\tnew Handle:data;\n\t\t\tCreateDataTimer(2.0, Timer_ChangeMap, data);\n\t\t\tWritePackString(data, map);\n\t\t\tg_ChangeMapInProgress = false;\n\t\t}\n\t\telse // MapChange_RoundEnd\n\t\t{\n\t\t\tSetNextMap(map);\n\t\t\tg_ChangeMapAtRoundEnd = true;\n\t\t}\n\t\t\n\t\tg_HasVoteStarted = false;\n\t\tg_MapVoteCompleted = true;\n\t\t\n\t\tPrintToChatAll(\"[SM] %t\", \"Nextmap Voting Finished\", map, RoundToFloor(float(item_info[0][VOTEINFO_ITEM_VOTES])/float(num_votes)*100), num_votes);\n\t\tLogAction(-1, -1, \"Voting for next map has finished. Nextmap: %s.\", map);\n\t}\t\n}\n\npublic Handler_MapVoteFinished(Handle:menu,\n\t\t\t\t\t\t   num_votes, \n\t\t\t\t\t\t   num_clients,\n\t\t\t\t\t\t   const client_info[][2], \n\t\t\t\t\t\t   num_items,\n\t\t\t\t\t\t   const item_info[][2])\n{\n\tif (GetConVarBool(g_Cvar_RunOff) && num_items > 1)\n\t{\n\t\tnew Float:winningvotes = float(item_info[0][VOTEINFO_ITEM_VOTES]);\n\t\tnew Float:required = num_votes * (GetConVarFloat(g_Cvar_RunOffPercent) / 100.0);\n\t\t\n\t\tif (winningvotes <= required)\n\t\t{\n\t\t\t/* Insufficient Winning margin - Lets do a runoff */\n\t\t\tg_VoteMenu = CreateMenu(Handler_MapVoteMenu, MenuAction:MENU_ACTIONS_ALL);\n\t\t\tSetMenuTitle(g_VoteMenu, \"Runoff Vote Nextmap\");\n\t\t\tSetVoteResultCallback(g_VoteMenu, Handler_VoteFinishedGeneric);\n\n\t\t\tdecl String:map[PLATFORM_MAX_PATH];\n\t\t\tdecl String:info1[PLATFORM_MAX_PATH];\n\t\t\tdecl String:info2[PLATFORM_MAX_PATH];\n\t\t\t\n\t\t\tGetMenuItem(menu, item_info[0][VOTEINFO_ITEM_INDEX], map, sizeof(map), _, info1, sizeof(info1));\n\t\t\tAddMenuItem(g_VoteMenu, map, info1);\n\t\t\tGetMenuItem(menu, item_info[1][VOTEINFO_ITEM_INDEX], map, sizeof(map), _, info2, sizeof(info2));\n\t\t\tAddMenuItem(g_VoteMenu, map, info2);\n\t\t\t\n\t\t\tnew voteDuration = GetConVarInt(g_Cvar_VoteDuration);\n\t\t\tSetMenuExitButton(g_VoteMenu, false);\n\t\t\tVoteMenuToAll(g_VoteMenu, voteDuration);\n\t\t\t\n\t\t\t/* Notify */\n\t\t\tnew Float:map1percent = float(item_info[0][VOTEINFO_ITEM_VOTES])/ float(num_votes) * 100;\n\t\t\tnew Float:map2percent = float(item_info[1][VOTEINFO_ITEM_VOTES])/ float(num_votes) * 100;\n\t\t\t\n\t\t\t\n\t\t\tPrintToChatAll(\"[SM] %t\", \"Starting Runoff\", GetConVarFloat(g_Cvar_RunOffPercent), info1, map1percent, info2, map2percent);\n\t\t\tLogMessage(\"Voting for next map was indecisive, beginning runoff vote\");\n\t\t\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\t\n\tHandler_VoteFinishedGeneric(menu, num_votes, num_clients, client_info, num_items, item_info);\n}\n\npublic Handler_MapVoteMenu(Handle:menu, MenuAction:action, param1, param2)\n{\n\tswitch (action)\n\t{\n\t\tcase MenuAction_End:\n\t\t{\n\t\t\tg_VoteMenu = INVALID_HANDLE;\n\t\t\tCloseHandle(menu);\n\t\t}\n\t\t\n\t\tcase MenuAction_Display:\n\t\t{\n\t \t\tdecl String:buffer[255];\n\t\t\tFormat(buffer, sizeof(buffer), \"%T\", \"Vote Nextmap\", param1);\n\n\t\t\tnew Handle:panel = Handle:param2;\n\t\t\tSetPanelTitle(panel, buffer);\n\t\t}\t\t\n\t\t\n\t\tcase MenuAction_DisplayItem:\n\t\t{\n\t\t\tif (GetMenuItemCount(menu) - 1 == param2)\n\t\t\t{\n\t\t\t\tdecl String:map[PLATFORM_MAX_PATH], String:buffer[255];\n\t\t\t\tGetMenuItem(menu, param2, map, sizeof(map));\n\t\t\t\tif (strcmp(map, VOTE_EXTEND, false) == 0)\n\t\t\t\t{\n\t\t\t\t\tFormat(buffer, sizeof(buffer), \"%T\", \"Extend Map\", param1);\n\t\t\t\t\treturn RedrawMenuItem(buffer);\n\t\t\t\t}\n\t\t\t\telse if (strcmp(map, VOTE_DONTCHANGE, false) == 0)\n\t\t\t\t{\n\t\t\t\t\tFormat(buffer, sizeof(buffer), \"%T\", \"Dont Change\", param1);\n\t\t\t\t\treturn RedrawMenuItem(buffer);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\t\n\t\n\t\tcase MenuAction_VoteCancel:\n\t\t{\n\t\t\t// If we receive 0 votes, pick at random.\n\t\t\tif (param1 == VoteCancel_NoVotes && GetConVarBool(g_Cvar_NoVoteMode))\n\t\t\t{\n\t\t\t\tnew count = GetMenuItemCount(menu);\n\t\t\t\tnew item = GetRandomInt(0, count - 1);\n\t\t\t\tdecl String:map[PLATFORM_MAX_PATH];\n\t\t\t\tGetMenuItem(menu, item, map, sizeof(map));\n\t\t\t\t\n\t\t\t\twhile (strcmp(map, VOTE_EXTEND, false) == 0)\n\t\t\t\t{\n\t\t\t\t\titem = GetRandomInt(0, count - 1);\n\t\t\t\t\tGetMenuItem(menu, item, map, sizeof(map));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tSetNextMap(map);\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// We were actually cancelled. I guess we do nothing.\n\t\t\t}\n\t\t\t\n\t\t\tg_HasVoteStarted = false;\n\t\t\tg_MapVoteCompleted = true;\n\t\t}\n\t}\n\t\n\treturn 0;\n}\n\npublic Action:Timer_ChangeMap(Handle:hTimer, Handle:dp)\n{\n\tg_ChangeMapInProgress = false;\n\t\n\tnew String:map[PLATFORM_MAX_PATH];\n\t\n\tif (dp == INVALID_HANDLE)\n\t{\n\t\tif (!GetNextMap(map, sizeof(map)))\n\t\t{\n\t\t\t//No passed map and no set nextmap. fail!\n\t\t\treturn Plugin_Stop;\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tResetPack(dp);\n\t\tReadPackString(dp, map, sizeof(map));\t\t\n\t}\n\t\n\tForceChangeLevel(map, \"Map Vote\");\n\t\n\treturn Plugin_Stop;\n}\n\nbool:RemoveStringFromArray(Handle:array, String:str[])\n{\n\tnew index = FindStringInArray(array, str);\n\tif (index != -1)\n\t{\n\t\tRemoveFromArray(array, index);\n\t\treturn true;\n\t}\n\t\n\treturn false;\n}\n\nCreateNextVote()\n{\n\tassert(g_NextMapList)\n\tClearArray(g_NextMapList);\n\t\n\tdecl String:map[PLATFORM_MAX_PATH];\n\tnew Handle:tempMaps  = CloneArray(g_MapList);\n\t\n\tGetCurrentMap(map, sizeof(map));\n\tRemoveStringFromArray(tempMaps, map);\n\t\n\tif (GetConVarInt(g_Cvar_ExcludeMaps) && GetArraySize(tempMaps) > GetConVarInt(g_Cvar_ExcludeMaps))\n\t{\n\t\tfor (new i = 0; i < GetArraySize(g_OldMapList); i++)\n\t\t{\n\t\t\tGetArrayString(g_OldMapList, i, map, sizeof(map));\n\t\t\tRemoveStringFromArray(tempMaps, map);\n\t\t}\t\n\t}\n\n\tnew limit = (GetConVarInt(g_Cvar_IncludeMaps) < GetArraySize(tempMaps) ? GetConVarInt(g_Cvar_IncludeMaps) : GetArraySize(tempMaps));\n\tfor (new i = 0; i < limit; i++)\n\t{\n\t\tnew b = GetRandomInt(0, GetArraySize(tempMaps) - 1);\n\t\tGetArrayString(tempMaps, b, map, sizeof(map));\t\t\n\t\tPushArrayString(g_NextMapList, map);\n\t\tRemoveFromArray(tempMaps, b);\n\t}\n\t\n\tCloseHandle(tempMaps);\n}\n\nbool:CanVoteStart()\n{\n\tif (g_WaitingForVote || g_HasVoteStarted)\n\t{\n\t\treturn false;\t\n\t}\n\t\n\treturn true;\n}\n\nNominateResult:InternalNominateMap(String:map[], bool:force, owner)\n{\n\tif (!IsMapValid(map))\n\t{\n\t\treturn Nominate_InvalidMap;\n\t}\n\t\n\tnew index;\n\n\t/* Look to replace an existing nomination by this client - Nominations made with owner = 0 aren't replaced */\n\tif (owner && ((index = FindValueInArray(g_NominateOwners, owner)) != -1))\n\t{\n\t\tnew String:oldmap[PLATFORM_MAX_PATH];\n\t\tGetArrayString(g_NominateList, index, oldmap, sizeof(oldmap));\n\t\tCall_StartForward(g_NominationsResetForward);\n\t\tCall_PushString(oldmap);\n\t\tCall_PushCell(owner);\n\t\tCall_Finish();\n\t\t\n\t\tSetArrayString(g_NominateList, index, map);\n\t\treturn Nominate_Replaced;\n\t}\n\t\n\t/* Too many nominated maps. */\n\tif (g_NominateCount >= GetConVarInt(g_Cvar_IncludeMaps) && !force)\n\t{\n\t\treturn Nominate_VoteFull;\n\t}\n\t\n\t/* Map already in the vote */\n\tif (FindStringInArray(g_NominateList, map) != -1)\n\t{\n\t\treturn Nominate_AlreadyInVote;\t\n\t}\n\t\n\t\n\tPushArrayString(g_NominateList, map);\n\tPushArrayCell(g_NominateOwners, owner);\n\tg_NominateCount++;\n\t\n\twhile (GetArraySize(g_NominateList) > GetConVarInt(g_Cvar_IncludeMaps))\n\t{\n\t\tnew String:oldmap[PLATFORM_MAX_PATH];\n\t\tGetArrayString(g_NominateList, 0, oldmap, sizeof(oldmap));\n\t\tCall_StartForward(g_NominationsResetForward);\n\t\tCall_PushString(oldmap);\n\t\tCall_PushCell(GetArrayCell(g_NominateOwners, 0));\n\t\tCall_Finish();\n\t\t\n\t\tRemoveFromArray(g_NominateList, 0);\n\t\tRemoveFromArray(g_NominateOwners, 0);\n\t}\n\t\n\treturn Nominate_Added;\n}\n\n/* Add natives to allow nominate and initiate vote to be call */\n\n/* native  bool:NominateMap(const String:map[], bool:force, &NominateError:error); */\npublic Native_NominateMap(Handle:plugin, numParams)\n{\n\tnew len;\n\tGetNativeStringLength(1, len);\n\t\n\tif (len <= 0)\n\t{\n\t  return false;\n\t}\n\t\n\tnew String:map[len+1];\n\tGetNativeString(1, map, len+1);\n\t\n\treturn _:InternalNominateMap(map, GetNativeCell(2), GetNativeCell(3));\n}\n\nbool:InternalRemoveNominationByMap(String:map[])\n{\t\n\tfor (new i = 0; i < GetArraySize(g_NominateList); i++)\n\t{\n\t\tnew String:oldmap[PLATFORM_MAX_PATH];\n\t\tGetArrayString(g_NominateList, i, oldmap, sizeof(oldmap));\n\n\t\tif(strcmp(map, oldmap, false) == 0)\n\t\t{\n\t\t\tCall_StartForward(g_NominationsResetForward);\n\t\t\tCall_PushString(oldmap);\n\t\t\tCall_PushCell(GetArrayCell(g_NominateOwners, i));\n\t\t\tCall_Finish();\n\n\t\t\tRemoveFromArray(g_NominateList, i);\n\t\t\tRemoveFromArray(g_NominateOwners, i);\n\t\t\tg_NominateCount--;\n\n\t\t\treturn true;\n\t\t}\n\t}\n\t\n\treturn false;\n}\n\n/* native  bool:RemoveNominationByMap(const String:map[]); */\npublic Native_RemoveNominationByMap(Handle:plugin, numParams)\n{\n\tnew len;\n\tGetNativeStringLength(1, len);\n\t\n\tif (len <= 0)\n\t{\n\t  return false;\n\t}\n\t\n\tnew String:map[len+1];\n\tGetNativeString(1, map, len+1);\n\t\n\treturn _:InternalRemoveNominationByMap(map);\n}\n\nbool:InternalRemoveNominationByOwner(owner)\n{\t\n\tnew index;\n\n\tif (owner && ((index = FindValueInArray(g_NominateOwners, owner)) != -1))\n\t{\n\t\tnew String:oldmap[PLATFORM_MAX_PATH];\n\t\tGetArrayString(g_NominateList, index, oldmap, sizeof(oldmap));\n\n\t\tCall_StartForward(g_NominationsResetForward);\n\t\tCall_PushString(oldmap);\n\t\tCall_PushCell(owner);\n\t\tCall_Finish();\n\n\t\tRemoveFromArray(g_NominateList, index);\n\t\tRemoveFromArray(g_NominateOwners, index);\n\t\tg_NominateCount--;\n\n\t\treturn true;\n\t}\n\t\n\treturn false;\n}\n\n/* native  bool:RemoveNominationByOwner(owner); */\npublic Native_RemoveNominationByOwner(Handle:plugin, numParams)\n{\t\n\treturn _:InternalRemoveNominationByOwner(GetNativeCell(1));\n}\n\n/* native InitiateMapChooserVote(); */\npublic Native_InitiateVote(Handle:plugin, numParams)\n{\n\tnew MapChange:when = MapChange:GetNativeCell(1);\n\tnew Handle:inputarray = Handle:GetNativeCell(2);\n\t\n\tLogAction(-1, -1, \"Starting map vote because outside request\");\n\tInitiateVote(when, inputarray);\n}\n\npublic Native_CanVoteStart(Handle:plugin, numParams)\n{\n\treturn CanVoteStart();\t\n}\n\npublic Native_CheckVoteDone(Handle:plugin, numParams)\n{\n\treturn g_MapVoteCompleted;\n}\n\npublic Native_EndOfMapVoteEnabled(Handle:plugin, numParams)\n{\n\treturn GetConVarBool(g_Cvar_EndOfMapVote);\n}\n\npublic Native_GetExcludeMapList(Handle:plugin, numParams)\n{\n\tnew Handle:array = Handle:GetNativeCell(1);\n\t\n\tif (array == INVALID_HANDLE)\n\t{\n\t\treturn;\t\n\t}\n\tnew size = GetArraySize(g_OldMapList);\n\tdecl String:map[PLATFORM_MAX_PATH];\n\t\n\tfor (new i=0; i<size; i++)\n\t{\n\t\tGetArrayString(g_OldMapList, i, map, sizeof(map));\n\t\tPushArrayString(array, map);\t\n\t}\n\t\n\treturn;\n}\n\npublic Native_GetNominatedMapList(Handle:plugin, numParams)\n{\n\tnew Handle:maparray = Handle:GetNativeCell(1);\n\tnew Handle:ownerarray = Handle:GetNativeCell(2);\n\t\n\tif (maparray == INVALID_HANDLE)\n\t\treturn;\n\n\tdecl String:map[PLATFORM_MAX_PATH];\n\n\tfor (new i = 0; i < GetArraySize(g_NominateList); i++)\n\t{\n\t\tGetArrayString(g_NominateList, i, map, sizeof(map));\n\t\tPushArrayString(maparray, map);\n\n\t\t// If the optional parameter for an owner list was passed, then we need to fill that out as well\n\t\tif(ownerarray != INVALID_HANDLE)\n\t\t{\n\t\t\tnew index = GetArrayCell(g_NominateOwners, i);\n\t\t\tPushArrayCell(ownerarray, index);\n\t\t}\n\t}\n\n\treturn;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/SourcePawn/mfile.inc",
    "content": "/*  mFile 1.1 by Minokon\r\n *\r\n *  (c) Copyright by Minokon 2010\r\n *  (c) y_files Copyright by Y_Less 2010\r\n *\r\n */\r\n\r\n#if defined _mfile_included\r\n\t#endinput\r\n#endif\r\n#define _mfile_included\r\n\r\n//Defines\r\n#define MAX_LINE_SIZE 80 //Max lenght of one line in file\r\n#define MAX_KEY_SIZE 50 //Max lenght of key in line (to =)\r\n#define MAX_VALUE_SIZE 50 //Max lenght of value in line (past =)\r\n#define TMP_FILE \"tmpfile.txt\"\r\n\r\n//Natives\r\n/*\r\nnative mCreateFile(const file[]);\r\nnative mRemoveFile(const file[]);\r\nnative mClearFile(const file[]);\r\nnative bool:mFileExist(const file[]);\r\nnative mRenameFile(const file[], const newname[]);\r\nnative mFindFile(const name[], dest[], &index, sizename=sizeof dest);\r\nnative mCreateDir(const name[]);\r\nnative mRenameDir(const dir[], const newname[]);\r\nnative mFindDir(const name[], dest[], &index, sizename=sizeof dest);\r\nnative mHowLines(const file[]);\r\nnative mRemoveNewLine(string[]); //removes \"\\n\" from string\r\nnative mGetString(const file[], const key[], bool:ignorecase=false);\r\nnative mGetInt(const file[], const key[], bool:ignorecase=false);\r\nnative mGetFloat(const file[], const key[], &Float:value);\r\nnative mSetString(const file[], const key[], const new_value[]);\r\nnative mSetInt(const file[], const key[], new_value);\r\nnative mSetFloat(const file[], const key[], Float:new_value);\r\nnative mIsSet(const file[], const key[], bool:ignorecase=false);\r\nnative mUnSet(const file[], const key[]);\r\nnative mIsFileEmpty(const file[]);\r\nnative y_files\r\n*/\r\n//y_files by Y_Less Functions\r\nnative ffind(const pattern[], filename[], len, &idx);\r\nnative frename(const oldname[], const newname[]);\r\nnative dfind(const pattern[], filename[], len, &idx);\r\nnative dcreate(const name[]);\r\nnative drename(const oldname[], const newname[]);\r\n\r\n//Forwards\r\nforward OnFileCreated(file[]);\r\nforward OnFileRemoved(file[]);\r\nforward OnFileCleared(file[]);\r\nforward OnFileRenamed(oldname[], newname[]);\r\nforward OnDirCreated(dir[]);\r\nforward OnDirRenamed(oldname[], newname[]);\r\n\r\nstock mCreateFile(const file[])\r\n{\r\n\tif(fexist(file)) fremove(file);\r\n\tnew File:mfile = fopen(file, io_write);\r\n \tfclose(mfile);\r\n \tCallLocalFunction(\"OnFileCreated\", \"s\", file);\r\n \treturn 1;\r\n}\r\n\r\nstock mRemoveFile(const file[])\r\n{\r\n \tCallLocalFunction(\"OnFileRemoved\", \"s\", file);\r\n \treturn fremove(file);\r\n}\r\n\r\nstock mClearFile(const file[])\r\n{\r\n\tif(!fremove(file)) return 0;\r\n\tnew File:mfile = fopen(file, io_write);\r\n\tfclose(mfile);\r\n\tCallLocalFunction(\"OnFileCleared\", \"s\", file);\r\n\treturn 1;\r\n}\r\n\r\nstock bool:mFileExist(const file[])\r\n\tif(fexist(file)) return true; //dla ciekawych: fexist nie zwraca booleanu\r\n\telse return false;\r\n\r\nstock mRenameFile(const file[], const newname[])\r\n{\r\n    CallLocalFunction(\"OnFileRenamed\", \"ss\", file, newname);\r\n\treturn frename(file, newname);\r\n}\r\n\r\nstock mFindFile(const name[], dest[], &index, sizename=sizeof dest)\r\n\treturn ffind(name, dest, sizename, index);\r\n\r\nstock mCreateDir(const name[])\r\n{\r\n    CallLocalFunction(\"OnDirCreated\", \"s\", name);\r\n\treturn dcreate(name);\r\n}\r\n\r\nstock mRenameDir(const dir[], const newname[])\r\n{\r\n    CallLocalFunction(\"OnDirRenamed\", \"ss\", dir, newname);\r\n\treturn drename(dir, newname);\r\n}\r\n\r\nstock mFindDir(const name[], dest[], &index, sizename=sizeof dest)\r\n\treturn dfind(name, dest, sizename, index);\r\n\r\nstock mHowLines(const file[])\r\n{\r\n\tnew lines, str[MAX_LINE_SIZE];\r\n\tnew File:mfile = fopen(file, io_read);\r\n\twhile(fread(mfile, str)) lines++;\r\n\tfclose(mfile);\r\n\treturn lines;\r\n}\r\n\r\nstock mRemoveNewLine(string[])\r\n{\r\n\tnew pos = strfind(string, \"\\n\");\r\n\tif(pos != -1)\r\n\t{\r\n\t\tstrdel(string, pos, pos+2);\r\n\t\treturn 1;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nstock mGetString(const file[], const key[], bool:ignorecase=false)\r\n{\r\n\t//Create file if not exists\r\n    if(!fexist(file))\r\n\t{\r\n\t    new File:created = fopen(file, io_write);\r\n\t    fclose(created);\r\n\t}\r\n\tnew //Variables\r\n\t    File:mfile = fopen(file, io_read), //Open file\r\n\t    str[MAX_LINE_SIZE],\r\n\t    str2[MAX_KEY_SIZE],\r\n\t    str3[MAX_VALUE_SIZE],\r\n\t    pos;\r\n\t//Find key in file\r\n\twhile(fread(mfile, str))\r\n\t{\r\n\t    pos = strfind(str, \"=\", ignorecase);\r\n\t    strmid(str2, str, 0, pos);\r\n\t\tif(!strcmp(str2, key, ignorecase, strlen(key)+1))\r\n\t\t{\r\n\t\t    strmid(str3, str, pos+1, strlen(str));\r\n\t\t    mRemoveNewLine(str3);\r\n\t\t    break;\r\n\t\t}\r\n\t}\r\n\tfclose(mfile);\r\n\treturn str3;\r\n}\r\n\r\nstock mGetInt(const file[], const key[], bool:ignorecase=false)\r\n\treturn strval(mGetString(file, key, ignorecase));\r\n\t\r\nstock mGetFloat(const file[], const key[], &Float:value, bool:ignorecase=false)\r\n\tvalue = floatstr(mGetString(file, key, ignorecase));\r\n\r\nstock mSetString(const file[], const key[], const new_value[])\r\n{\r\n    //Create file if not exists\r\n\tif(!fexist(file))\r\n\t{\r\n\t    new File:created = fopen(file, io_write);\r\n\t    fclose(created);\r\n\t}\r\n\tnew //Variables\r\n\t\tstr[MAX_LINE_SIZE],\r\n\t\tstr2[MAX_KEY_SIZE],\r\n\t\tstr3[MAX_LINE_SIZE],\r\n\t\tbool:lFinded = false;\r\n\t//Open file\r\n\tnew File:mfile = fopen(file, io_read);\r\n\t//Create cache file\r\n\tnew File:tmpfile = fopen(TMP_FILE, io_write);\r\n\tfclose(tmpfile);\r\n\t//Open cache file\r\n\ttmpfile = fopen(TMP_FILE, io_append);\r\n\tformat(str3, sizeof str3, \"%s=%s\\n\", key, new_value);\r\n\twhile(fread(mfile, str))\r\n\t{\r\n\t    strmid(str2, str, 0, strfind(str, \"=\"));\r\n\t    if(!strcmp(str2, key))\r\n\t    {\r\n\t\t\tfwrite(tmpfile, str3);\r\n\t\t\tlFinded = true;\r\n\t    }\r\n\t    else\r\n\t        fwrite(tmpfile, str);\r\n\t}\r\n\tif(!lFinded) //if line not found\r\n\t\tfwrite(tmpfile, str3);\r\n    //Close and remove old file\r\n    fclose(mfile);\r\n\tfremove(file);\r\n\t//Close cache file and rename it\r\n\tfclose(tmpfile);\r\n\tfrename(TMP_FILE, file);\r\n\treturn 1;\r\n}\r\n\r\nstock mSetInt(const file[], const key[], new_value)\r\n{\r\n\tnew str[MAX_VALUE_SIZE];\r\n\tvalstr(str, new_value);\r\n\tmSetString(file, key, str);\r\n\treturn 1;\r\n}\r\n\r\nstock mSetFloat(const file[], const key[], Float:new_value)\r\n{\r\n\tnew str[MAX_VALUE_SIZE];\r\n\tformat(str, sizeof str, \"%f\", new_value);\r\n\treturn mSetString(file, key, str);\r\n}\r\n\r\nstock bool:mIsSet(const file[], const key[], bool:ignorecase=false)\r\n{\r\n    //If fexists return false\r\n    if(!fexist(file)) return false;\r\n\tnew //Variables\r\n\t    File:mfile = fopen(file, io_read), //Open file\r\n\t    str[MAX_LINE_SIZE],\r\n\t    str2[MAX_KEY_SIZE],\r\n\t\tbool:finded = false;\r\n\t//Find key in file\r\n\twhile(fread(mfile, str))\r\n\t{\r\n\t    strmid(str2, str, 0, strfind(str, \"=\"));\r\n\t\tif(!strcmp(str2, key, ignorecase, strlen(key)+1))\r\n\t\t{\r\n\t\t\tfinded = true;\r\n\t\t\tbreak;\r\n   \t\t}\r\n\t}\r\n\tfclose(mfile);\r\n\treturn finded;\r\n}\r\n\r\nstock mUnSet(const file[], const key[])\r\n{\r\n\tif(!fexist(file)) return 0;\r\n\tnew //Variables\r\n\t\tstr[MAX_LINE_SIZE],\r\n\t\tstr2[MAX_KEY_SIZE];\r\n\t//Open file\r\n\tnew File:mfile = fopen(file, io_read);\r\n\t//Create cache file\r\n\tnew File:tmpfile = fopen(TMP_FILE, io_write);\r\n\tfclose(tmpfile);\r\n\t//Open cache file\r\n\ttmpfile = fopen(TMP_FILE, io_append);\r\n\twhile(fread(mfile, str))\r\n\t{\r\n\t    strmid(str2, str, 0, strfind(str, \"=\"));\r\n\t    if(strcmp(str2, key) != 0)\r\n\t    \tfwrite(tmpfile, str);\r\n\t}\r\n    //Close and remove old file\r\n    fclose(mfile);\r\n\tfremove(file);\r\n\t//Close cache file and rename it\r\n\tfclose(tmpfile);\r\n\tfrename(TMP_FILE, file);\r\n\treturn 1;\r\n}\r\n\r\nstock bool:mIsFileEmpty(const file[])\r\n{\r\n\tif(!fexist(file)) return true;\r\n\tnew File:mfile = fopen(file, io_read);\r\n\tif(flength(mfile) <= 1)\r\n\t{\r\n\t    fclose(mfile);\r\n\t\treturn true;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tfclose(mfile);\r\n\t\treturn false;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/SourcePawn/y_testing.inc",
    "content": "/**--------------------------------------------------------------------------**\\\r\n\t\t\t\t\t====================================\r\n\t\t\t\t\t y_testing - Run unit tests easilly \r\n\t\t\t\t\t====================================\r\nDescription:\r\n\tRuns any functions named as tests when the Testing_Run function is called.\r\nLegal:\r\n\tVersion: MPL 1.1\r\n\t\r\n\tThe contents of this file are subject to the Mozilla Public License Version \r\n\t1.1 (the \"License\"); you may not use this file except in compliance with \r\n\tthe License. You may obtain a copy of the License at \r\n\thttp://www.mozilla.org/MPL/\r\n\t\r\n\tSoftware distributed under the License is distributed on an \"AS IS\" basis,\r\n\tWITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\r\n\tfor the specific language governing rights and limitations under the\r\n\tLicense.\r\n\t\r\n\tThe Original Code is the YSI testing include.\r\n\t\r\n\tThe Initial Developer of the Original Code is Alex \"Y_Less\" Cole.\r\n\tPortions created by the Initial Developer are Copyright (C) 2011\r\n\tthe Initial Developer. All Rights Reserved.\r\n\t\r\n\tContributors:\r\n\t\tZeeX, koolk, JoeBullet/Google63, g_aSlice/Slice\r\n\t\r\n\tThanks:\r\n\t\tJoeBullet/Google63 - Handy arbitrary ASM jump code using SCTRL.\r\n\t\tZeeX - Very productive conversations.\r\n\t\tkoolk - IsPlayerinAreaEx code.\r\n\t\tTheAlpha - Danish translation.\r\n\t\tbreadfish - German translation.\r\n\t\tFireburn - Dutch translation.\r\n\t\tyom - French translation.\r\n\t\t50p - Polish translation.\r\n\t\tZamaroht - Spanish translation.\r\n\t\tDracoblue, sintax, mabako, Xtreme, other coders - Producing other modes\r\n\t\t\tfor me to strive to better.\r\n\t\tPixels^ - Running XScripters where the idea was born.\r\n\t\tMatite - Pestering me to release it and using it.\r\n\t\r\n\tVery special thanks to:\r\n\t\tThiadmer - PAWN, whose limits continue to amaze me!\r\n\t\tKye/Kalcor - SA:MP.\r\n\t\tSA:MP Team past, present and future - SA:MP.\r\n\t\r\nVersion:\r\n\t1.0\r\nChangelog:\r\n\t16/02/12:\r\n\t\tAdded better error reporting (less verbose passes).\r\n\t\tRemoved \"Tests:\".\r\n\t\tAdded player requiring tests.\r\n\t25/10/10:\r\n\t\tIntegrated in to YSI.\r\n\t06/08/10:\r\n\t\tFirst version\r\n</remarks>\r\n\\**--------------------------------------------------------------------------**/\r\n\r\n/*#if defined _inc_a_samp || defined _samp_included || defined _inc_y_version\r\n\t#error y_testing must be the VERY FIRST include in your mode if being used.\r\n#endif\r\n\r\n// Now we redefined \"native\" to do something clever!\r\n// \"IsPlayerAttachedObjectSlotUsed\" is an issue for us...\r\n\r\n// \"y_renative\" allows native functions to be declared without constantly trying\r\n// to redefine it.\r\n#include \"internal\\y_renative\"\r\n\r\n#define native%0(%1); _YSI_NO_TAG_NATIVE:_YSI_RE_NATIVE<%0@|||%1|||%0>_YSI_RE_STOCK<%0|||%1|||_:%0@>\r\n\r\n//stock%0(%1){printf(_:_YSI_NO_SQUARE:\"native \"#%0\" called\");return _:%0@(%1);}\r\n\r\n#define _YSI_RE_STOCK<%0|||%1|||%2> stock%0(%1){print(_:_YSI_NO_SQUARE:\"native \"#%0\" called\");return %2(%1);}\r\n\r\n#define _YSI_NO_SQUARE:%0);%1(%2[%3]%4);} _YSI_NO_SQUARE:%0);%1(%2%4);}\r\n\r\n//#define _YSI_NO_TAG_NATIVE:_YSI_RE_NATIVE<%0:%1|||%2|||%3:%4>%5{%6;%7:%8:%9} _YSI_RE_NATIVE<%1|||%2|||%4>%5{%6;return%8:%9}\r\n#define _YSI_NO_TAG_NATIVE:_YSI_RE_NATIVE<%0:%1|||%2|||%3:%4>_YSI_RE_STOCK<%5:%6|||%7|||_:%8:%9> _YSI_RE_NATIVE<%1|||%2|||%4>_YSI_RE_STOCK<%5:%6|||%7|||%8:%9>*/\r\n\r\n#include <a_samp>\r\n\r\n#if defined YSI_TESTS\r\n\t#if defined INCLUDE_TESTS\r\n\t\t#error Incompatible testing options (YSI_TESTS + INCLUDE_TESTS)\r\n\t#endif\r\n\t#if !defined RUN_TESTS\r\n\t\t#define RUN_TESTS\r\n\t#endif\r\n#endif\r\n\r\n#if defined INCLUDE_TESTS\r\n\t#define RUN_TESTS\r\n\t#define Debug_PrintT va_printf\r\n#elseif defined RUN_TESTS\r\n\t#define _AUTO_RUN_TESTS\r\n\t#define Debug_PrintT va_printf\r\n#else\r\n\t#if _DEBUG > 0 || defined _YSI_SPECIAL_DEBUG\r\n\t\t#define RUN_TESTS\r\n\t\t#define _AUTO_RUN_TESTS\r\n\t\t//#if defined _YSI_SPECIAL_DEBUG\r\n\t\t//\t#define TP printf\r\n\t\t//\t//#define TC(%0); %0\r\n\t\t#define Debug_PrintT va_printf\r\n\t\t//#else\r\n\t\t//\t//#define TP P:0\r\n\t\t//\t//#define TC C:0\r\n\t\t//#endif\r\n\t#else\r\n\t\t#define Debug_PrintT(%0);\r\n\t//\t#define Tests:%1() stock bool:Tests_@%1()\r\n\t//\t#define Test:%1() stock bool:Test_@%1()\r\n\t//\t#define TestInit:%1() stock Init_@%1()\r\n\t//\t#define TestClose:%1() stock Shut_@%1()\r\n\t#endif\r\n#endif\r\n\r\n#define Y_TESTING_DIALOG_ID (0x7974) // \"yt\"\r\n\r\n#define TEST_TRUE(%0)  Testing_Test(!!%0)\r\n#define TEST_FALSE(%0) Testing_Test(!%0)\r\n#define TEST_NULL(%0)  Testing_Test(0 == %0)\r\n#define TEST_NOT_NULL(%0)  Testing_Test(0 != %0)\r\n#define TEST_N(%0,%1)  Testing_Test(%1 == %0)\r\n\r\n#define TEST_TRUE_EX(%0,%2)  Testing_Test(bool:(%0), (%2))\r\n#define TEST_FALSE_EX(%0,%2) Testing_Test(!(%0), (%2))\r\n#define TEST_NULL_EX(%0,%2)  Testing_Test((%0) == 0, (%2))\r\n#define TEST_N_EX(%0,%1,%2)  Testing_Test((%0) == (%1), (%2))\r\n\r\n#define TEST_MSG \"\\2\\2\\2\\2\\2\"\r\n#define TEST_FAILED \"FAIL:\"\r\n#define TEST_PASSED \"PASS!\"\r\n//#define TEST_FAILED \"*** Test Failed:\"\r\n//#define TEST_PASSED \"*** Test Passed:\"\r\n\r\n#define _Y_TESTEQ(%0) \"\\\"%0\\\"\")\r\n#define _Y_TESTDQ:_Y_TESTEQ(%0\"%1\"%2) _Y_TESTDQ:_Y_TESTEQ(%0\\x22;%1\\x22;%2)\r\n//#define _Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0)%1) _Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0\\x29;%1)\r\n#define _Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0)%1) _Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0\\x29;%1)\r\n#define _Y_TESTOB:_Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0(%1) _Y_TESTOB:_Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0\\x28;%1)\r\n\r\n#define ASSERT(%0) Testing_Test(%0,TEST_MSG\" %s\", _Y_TESTOB:_Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0)\r\n#define ASSERT_TRUE(%0) ASSERT(!!%0) //Testing_Test(!!%0,__name)\r\n#define ASSERT_FALSE(%0) ASSERT(!%0) //Testing_Test(!%0,__name)\r\n#define ASSERT_NULL(%0) ASSERT(0 == %0) //Testing_Test(0==%0,__name)\r\n#define ASSERT_N:%1(%0) ASSERT(%1 == %0) //Testing_Test(%1==%0,__name)\r\n\r\n#define ASK(%0) Testing_Ask(playerid,%0)\r\n\r\nstatic stock\r\n\tYSI_g_sFailMessage[512],\r\n\tYSI_g_sPlayer = cellmax,\r\n\tbool:YSI_g_sAsked,\r\n\tYSI_g_sTests,\r\n\tYSI_g_sFails;\r\n\r\n#if defined RUN_TESTS\r\n\t#define Test:%1() forward bool:Tezt_@%1(); public bool:Tezt_@%1() for(new string:__name[]=#%1,bool:__once=(printf(\"*** Test %s start\", __name) || TRUE);__once;__once=(printf(\" \") && FALSE))\r\n\t//#define Tests:%1() forward bool:Test_@%1(); public bool:Test_@%1() for(new string:__name[]=#%1,bool:__once=(printf(\"*** Test %s start\", __name) || TRUE);__once;__once=(printf(\" \") && FALSE))\r\n\t#define TestInit:%1() forward Init_@%1(); public Init_@%1() for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(\" \", __name) && FALSE))\r\n\t#define TestClose:%1() forward Shut_@%1(); public Shut_@%1() for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(\" \", __name) && FALSE))\r\n\t\r\n\t#define PTest:%1(%2) forward bool:Tezp_@%1(%2); public bool:Tezp_@%1(%2) for(new string:__name[]=#%1,bool:__once=(printf(\"*** Player Test %s start\", __name) || TRUE);__once;__once=(printf(\" \") && FALSE))\r\n\t//#define Tests:%1() forward bool:Test_@%1(); public bool:Test_@%1() for(new string:__name[]=#%1,bool:__once=(printf(\"*** Test %s start\", __name) || TRUE);__once;__once=(printf(\" \") && FALSE))\r\n\t#define PTestInit:%1(%2) forward Inip_@%1(%2); public Inip_@%1(%2) for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(\" \", __name) && FALSE))\r\n\t#define PTestClose:%1(%2) forward Shup_@%1(%2); public Shup_@%1(%2) for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(\" \", __name) && FALSE))\r\n#else\r\n\t#define Test:%1() stock bool:Test_@%1()\r\n\t#define TestInit:%1() stock Init_@%1()\r\n\t#define TestClose:%1() stock Shut_@%1()\r\n\t\r\n\t#define PTest:%1(%2) stock bool:Test_@%1(%2)\r\n\t#define PTestInit:%1(%2) stock Init_@%1(%2)\r\n\t#define PTestClose:%1(%2) stock Shut_@%1(%2)\r\n#endif\r\n\r\n// These all need to come AFTER the types are defined in case the have tests.\r\n#include \"internal\\y_version\"\r\n\r\n#include \"y_amx\"\r\n#include \"internal\\y_shortfunc\"\r\n#include \"y_debug\"\r\n\r\n#include \"internal\\y_natives\"\r\n\r\n#include \"y_va\"\r\n\r\n/**--------------------------------------------------------------------------**\\\r\n<summary>Testing_Ask</summary>\r\n<param name=\"playerid\">Player to ask a question to.</param>\r\n<param name=\"str[]\">What to ask.</param>\r\n<param name=\"va_args<>\">Additional data.</param>\r\n<returns>\r\n\t-\r\n</returns>\r\n<remarks>\r\n\tCalls a dialog to ask the player if the given test actually passed.\r\n</remarks>\r\n\\**--------------------------------------------------------------------------**/\r\n\r\nstock Testing_Ask(playerid, str[] = \"\", va_args<>)\r\n{\r\n\tva_format(YSI_g_sFailMessage, sizeof (YSI_g_sFailMessage), str, va_start<2>);\r\n\tShowPlayerDialog(playerid, Y_TESTING_DIALOG_ID, DIALOG_STYLE_MSGBOX, \"Did the test pass?\", YSI_g_sFailMessage, \"Yes\", \"No\");\r\n\tYSI_g_sAsked = true;\r\n}\r\n\r\nstock Testing_Test(bool:x, str[] = \"\", va_args<>)\r\n{\r\n\tP:3(\"Testing_Test called: %i, \\\"%s\\\"\", x, str);\r\n\t++YSI_g_sTests;\r\n\tif (!x)\r\n\t{\r\n\t\t++YSI_g_sFails;\r\n\t\tif (numargs() == 2)\r\n\t\t{\r\n\t\t\tP:T(TEST_FAILED \" %s\", va_start<1>);\r\n\t\t\t//printf(\"*** Test failed: %s\", str);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (str[0] == '\\2')\r\n\t\t\t{\r\n\t\t\t\tstrunpack(str, !TEST_FAILED, 6);\r\n\t\t\t\tstr[5] = ' ';\r\n\t\t\t}\r\n\t\t\tP:T(str, va_start<2>);\r\n\t\t}\r\n\t}\r\n\t#if defined TEST_SHOW_PASSES\r\n\t\telse /*if (numargs() == 2)\r\n\t\t{\r\n\t\t\tP:T(TEST_PASSED \" %s\", va_start<1>);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tP:T(str, va_start<2>);\r\n\t\t\tif (str[0] == '\\2')\r\n\t\t\t{\r\n\t\t\t\tstrunpack(str, !TEST_PASSED, 17);\r\n\t\t\t\tstr[16] = ' ';\r\n\t\t\t}\r\n\t\t\tprintf(str);\r\n\t\t\tP:T(str, va_start<2>);*/\r\n\t\t{\r\n\t\t\tP:T(TEST_PASSED, va_start<2>);\r\n\t\t}\r\n\t#endif\r\n}\r\n\r\n/**--------------------------------------------------------------------------**\\\r\n<summary>Testing_Run</summary>\r\n<param name=\"&tests\">Number of tests run.</param>\r\n<param name=\"&fails\">Number of tests which failed.</param>\r\n<param name=\"buffer[33]\">The name of the first test which failed.</param>\r\n<returns>\r\n\tWether all tests were sucessful or not.\r\n</returns>\r\n<remarks>\r\n\t-\r\n\r\nnative Testing_Run(&tests, &fails, buffer[33] = \"\");\r\n\r\n</remarks>\r\n\\**--------------------------------------------------------------------------**/\r\n\r\nstock bool:Testing_Run(&tests, &fails, lastfail[33] = \"\", bool:p = false)\r\n{\r\n\tP:3(\"bool:Testing_Run called: %i, %i, \\\"%s\\\", %i\", tests, fails, lastfail, p);\r\n\t#pragma unused p, lastfail\r\n\t#if defined RUN_TESTS\r\n\t\tP:2(\"Testing_Run() called\");\r\n\t\tnew\r\n\t\t\tidx,\r\n\t\t\tbuffer[32];\r\n\t\twhile ((idx = AMX_GetPublicName(idx, buffer, \"Tezt_@\")))\r\n\t\t{\r\n\t\t\tstrunpack(buffer, buffer);\r\n\t\t\t//++YSI_g_sTests;\r\n\t\t\t// Call the setup function if there is one.\r\n\t\t\tbuffer[0] = 'I';\r\n\t\t\tbuffer[1] = 'n';\r\n\t\t\tbuffer[2] = 'i';\r\n\t\t\tbuffer[3] = 't';\r\n\t\t\tCallLocalFunction(buffer, \"\");\r\n\t\t\t// Call the test.\r\n\t\t\tbuffer[0] = 'T';\r\n\t\t\tbuffer[1] = 'e';\r\n\t\t\tbuffer[2] = 'z';\r\n\t\t\tbuffer[3] = 't';\r\n\t\t\tfails = YSI_g_sFails;\r\n\t\t\tP:5(\"Testing_Run(): Calling %s\", buffer[6]);\r\n\t\t\tCallLocalFunction(buffer, \"\");\r\n\t\t\t#if !defined TEST_SHOW_PASSES\r\n\t\t\t\tif (YSI_g_sFails == fails)\r\n\t\t\t\t{\r\n\t\t\t\t\tprintf(TEST_PASSED);\r\n\t\t\t\t\tprintf(\" \");\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t\t/*if (YSI_g_sFails != fails)\r\n\t\t\t{\r\n\t\t\t\tif (YSI_g_sFails)\r\n\t\t\t\t{\r\n\t\t\t\t\t++YSI_g_sFails;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tfails = 0;\r\n\t\t\t\t\t// Copy the string over.\r\n\t\t\t\t\twhile ((lastfail[fails] = buffer[fails + 6])) ++fails;\r\n\t\t\t\t\tYSI_g_sFails = 1;\r\n\t\t\t\t}\r\n\t\t\t\t//C:1(if (p) printf(\"*** Test failed: %s\", buffer[fails + 6]););\r\n\t\t\t}*/\r\n\t\t\t// Call the shutdown function if there is one.\r\n\t\t\tbuffer[0] = 'S';\r\n\t\t\tbuffer[1] = 'h';\r\n\t\t\tbuffer[2] = 'u';\r\n\t\t\tbuffer[3] = 't';\r\n\t\t\tCallLocalFunction(buffer, \"\");\r\n\t\t}\r\n\t\ttests = YSI_g_sTests;\r\n\t\tfails = YSI_g_sFails;\r\n\t\treturn fails == 0;\r\n\t#else\r\n\t\t#pragma unused tests, fails, lastfail\r\n\t\treturn true;\r\n\t#endif\r\n}\r\n\r\n/**--------------------------------------------------------------------------**\\\r\n<summary>Testing_Player</summary>\r\n<param name=\"playerid\">Player to test on.</param>\r\n<param name=\"&idx\">Next test to run.</param>\r\n<param name=\"&tests\">Number of tests run.</param>\r\n<param name=\"&fails\">Number of tests which failed.</param>\r\n<param name=\"buffer[33]\">The name of the first test which failed.</param>\r\n<returns>\r\n\tWether all tests were sucessful or not.\r\n</returns>\r\n<remarks>\r\n\t-\r\n\r\nnative Testing_Run(&tests, &fails, buffer[33] = \"\");\r\n\r\n</remarks>\r\n\\**--------------------------------------------------------------------------**/\r\n\r\nstock bool:Testing_Player(playerid, &idx, &tests, &fails, lastfail[33] = \"\", bool:p = false)\r\n{\r\n\tP:3(\"bool:Testing_Player called: %i, %i, %i, %i, \\\"%s\\\", %i\", playerid, idx, tests, fails, lastfail, p);\r\n\t#pragma unused p\r\n\t#if defined RUN_TESTS\r\n\t\tP:2(\"Testing_Player() called\");\r\n\t\tnew\r\n\t\t\t//idx,\r\n\t\t\tbuffer[32];\r\n\t\t//while ((idx = AMX_GetPublicName(idx, buffer, \"Tezt_@\")))\r\n\t\tif ((idx = AMX_GetPublicName(idx, buffer, \"Tezp_@\")))\r\n\t\t{\r\n\t\t\tstrunpack(buffer, buffer);\r\n\t\t\t//++YSI_g_sTests;\r\n\t\t\t// Call the setup function if there is one.\r\n\t\t\tbuffer[0] = 'I';\r\n\t\t\tbuffer[1] = 'n';\r\n\t\t\tbuffer[2] = 'i';\r\n\t\t\tbuffer[3] = 'p';\r\n\t\t\tCallLocalFunction(buffer, \"\");\r\n\t\t\t// Call the test.\r\n\t\t\tbuffer[0] = 'T';\r\n\t\t\tbuffer[1] = 'e';\r\n\t\t\tbuffer[2] = 'z';\r\n\t\t\tbuffer[3] = 'p';\r\n\t\t\tfails = YSI_g_sFails;\r\n\t\t\tP:5(\"Testing_Player(): Calling %s\", buffer[6]);\r\n\t\t\tCallLocalFunction(buffer, \"\");\r\n\t\t\t#if !defined TEST_SHOW_PASSES\r\n\t\t\t\tif (YSI_g_sFails == fails)\r\n\t\t\t\t{\r\n\t\t\t\t\tprintf(TEST_PASSED);\r\n\t\t\t\t\tprintf(\" \");\r\n\t\t\t\t}\r\n\t\t\t#endif\r\n\t\t\t/*if (YSI_g_sFails != fails)\r\n\t\t\t{\r\n\t\t\t\tif (YSI_g_sFails)\r\n\t\t\t\t{\r\n\t\t\t\t\t++YSI_g_sFails;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tfails = 0;\r\n\t\t\t\t\t// Copy the string over.\r\n\t\t\t\t\twhile ((lastfail[fails] = buffer[fails + 6])) ++fails;\r\n\t\t\t\t\tYSI_g_sFails = 1;\r\n\t\t\t\t}\r\n\t\t\t\t//C:1(if (p) printf(\"*** Test failed: %s\", buffer[fails + 6]););\r\n\t\t\t}*/\r\n\t\t\t// Call the shutdown function if there is one.\r\n\t\t\t//buffer[0] = 'S';\r\n\t\t\t//buffer[1] = 'h';\r\n\t\t\t//buffer[2] = 'u';\r\n\t\t\t//buffer[3] = 'p';\r\n\t\t\t//CallLocalFunction(buffer, \"\");\r\n\t\t}\r\n\t\ttests = YSI_g_sTests;\r\n\t\tfails = YSI_g_sFails;\r\n\t\treturn fails == 0;\r\n\t#else\r\n\t\t#pragma unused tests, fails, lastfail\r\n\t\treturn true;\r\n\t#endif\r\n}\r\n\r\n#if defined RUN_TESTS\r\n\t/*#define Test:%1() forward bool:Tezt_@%1(); public bool:Tezt_@%1() for(new string:__name[]=#%1,bool:__once=(printf(\"*** Test %s start\", __name) || TRUE);__once;__once=(printf(\" \") && FALSE))\r\n\t//#define Tests:%1() forward bool:Test_@%1(); public bool:Test_@%1() for(new string:__name[]=#%1,bool:__once=(printf(\"*** Test %s start\", __name) || TRUE);__once;__once=(printf(\" \") && FALSE))\r\n\t#define TestInit:%1() forward Init_@%1(); public Init_@%1() for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(\" \", __name) && FALSE))\r\n\t#define TestClose:%1() forward Shut_@%1(); public Shut_@%1() for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(\" \", __name) && FALSE))\r\n\t\r\n\t#define PTest:%1(%2) forward bool:Tezp_@%1(%2); public bool:Tezp_@%1(%2) for(new string:__name[]=#%1,bool:__once=(printf(\"*** Player Test %s start\", __name) || TRUE);__once;__once=(printf(\" \") && FALSE))\r\n\t//#define Tests:%1() forward bool:Test_@%1(); public bool:Test_@%1() for(new string:__name[]=#%1,bool:__once=(printf(\"*** Test %s start\", __name) || TRUE);__once;__once=(printf(\" \") && FALSE))\r\n\t#define PTestInit:%1(%2) forward Inip_@%1(%2); public Inip_@%1(%2) for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(\" \", __name) && FALSE))\r\n\t#define PTestClose:%1(%2) forward Shup_@%1(%2); public Shup_@%1(%2) for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(\" \", __name) && FALSE))*/\r\n\t\r\n\t#if defined _AUTO_RUN_TESTS\r\n\t\t#if !defined FILTERSCRIPT\r\n\t\t\t// Hook main in gamemodes.\r\n\t\t\tmain()\r\n\t\t\t{\r\n\t\t\t\t// Disable error messages (as we're likely to generate them).\r\n\t\t\t\tstate ysi_debug : off;\r\n\t\t\t\tCallLocalFunction(\"Testing_main\", \"\");\r\n\t\t\t\tnew\r\n\t\t\t\t\ttests,\r\n\t\t\t\t\tfails;\r\n\t\t\t\tprintf(\" \");\r\n\t\t\t\tprintf(\"  ||===================||  \");\r\n\t\t\t\tprintf(\"  || STARTING TESTS... ||  \");\r\n\t\t\t\tprintf(\"  ||===================||  \");\r\n\t\t\t\tprintf(\" \");\r\n\t\t\t\tTesting_Run(tests, fails, _, true);\r\n\t\t\t\tprintf(\"*** Tests: %d, Fails: %d\", tests, fails);\r\n\t\t\t\tif (!fails)\r\n\t\t\t\t{\r\n\t\t\t\t\tprintf(\" \");\r\n\t\t\t\t\tprintf(\"  ||===================||  \");\r\n\t\t\t\t\tprintf(\"  || ALL TESTS PASSED! ||  \");\r\n\t\t\t\t\tprintf(\"  ||===================||  \");\r\n\t\t\t\t\tprintf(\" \");\r\n\t\t\t\t}\r\n\t\t\t\tstate ysi_debug : on;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t#define main forward Testing_main(); public Testing_main\r\n\t\t\t\r\n\t\t\tTesting_Next(playerid)\r\n\t\t\t{\r\n\t\t\t\tnew\r\n\t\t\t\t\tbuffer[32];\r\n\t\t\t\tfor ( ; ; )\r\n\t\t\t\t{\r\n\t\t\t\t\tnew\r\n\t\t\t\t\t\tfails = YSI_g_sFails;\r\n\t\t\t\t\t// Get the last test (nicely fails for cellmax).\r\n\t\t\t\t\tif ((YSI_g_sPlayer = AMX_GetPublicName(YSI_g_sPlayer, buffer, \"Tezp_@\")))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstrunpack(buffer, buffer);\r\n\t\t\t\t\t\t// Call the shutdown function if there is one.\r\n\t\t\t\t\t\tbuffer[0] = 'S';\r\n\t\t\t\t\t\tbuffer[1] = 'h';\r\n\t\t\t\t\t\tbuffer[2] = 'u';\r\n\t\t\t\t\t\tbuffer[3] = 'p';\r\n\t\t\t\t\t\tCallLocalFunction(buffer, \"i\", playerid);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Get the new test, but don't store the index.\r\n\t\t\t\t\tif (AMX_GetPublicName(YSI_g_sPlayer, buffer, \"Tezp_@\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tYSI_g_sAsked = false;\r\n\t\t\t\t\t\t//++YSI_g_sTests;\r\n\t\t\t\t\t\tstrunpack(buffer, buffer);\r\n\t\t\t\t\t\t// Call the setup function if there is one.\r\n\t\t\t\t\t\tbuffer[0] = 'I';\r\n\t\t\t\t\t\tbuffer[1] = 'n';\r\n\t\t\t\t\t\tbuffer[2] = 'i';\r\n\t\t\t\t\t\tbuffer[3] = 'p';\r\n\t\t\t\t\t\tCallLocalFunction(buffer, \"i\", playerid);\r\n\t\t\t\t\t\t// Call the test.\r\n\t\t\t\t\t\tbuffer[0] = 'T';\r\n\t\t\t\t\t\tbuffer[1] = 'e';\r\n\t\t\t\t\t\tbuffer[2] = 'z';\r\n\t\t\t\t\t\tbuffer[3] = 'p';\r\n\t\t\t\t\t\tP:5(\"Testing_Next(): Calling %s\", buffer[6]);\r\n\t\t\t\t\t\tCallLocalFunction(buffer, \"i\", playerid);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tYSI_g_sAsked = true;\r\n\t\t\t\t\t\t// No more tests.\r\n\t\t\t\t\t\tprintf(\"*** Tests: %d, Fails: %d\", YSI_g_sTests, YSI_g_sFails);\r\n\t\t\t\t\t\tif (!YSI_g_sFails)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tprintf(\" \");\r\n\t\t\t\t\t\t\tprintf(\"  ||==========================||  \");\r\n\t\t\t\t\t\t\tprintf(\"  || ALL PLAYER TESTS PASSED! ||  \");\r\n\t\t\t\t\t\t\tprintf(\"  ||==========================||  \");\r\n\t\t\t\t\t\t\tprintf(\" \");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// If the test needs a player but doesn't ask them anything\r\n\t\t\t\t\t// then we can't wait for \"OnDialogResponse\" to run the next\r\n\t\t\t\t\t// one.\r\n\t\t\t\t\tif (YSI_g_sAsked)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (fails == YSI_g_sFails)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tprintf(TEST_PASSED);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t//while (!YSI_g_sAsked);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tpublic OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])\r\n\t\t\t{\r\n\t\t\t\tif (dialogid == Y_TESTING_DIALOG_ID)\r\n\t\t\t\t{\r\n\t\t\t\t\t++YSI_g_sTests;\r\n\t\t\t\t\tif (response)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// Pass.\r\n\t\t\t\t\t\tprintf(TEST_PASSED);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// Fail.\r\n\t\t\t\t\t\tprintf(TEST_FAILED \" %s\", YSI_g_sFailMessage);\r\n\t\t\t\t\t\t++YSI_g_sFails;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTesting_Next(playerid);\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t\t#if defined Testing_OnDialogResponse\r\n\t\t\t\t\treturn Testing_OnDialogResponse(playerid, dialogid, response, listitem, inputtext);\r\n\t\t\t\t#else\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t#if defined _ALS_OnDialogResponse\r\n\t\t\t\t#undef OnDialogResponse\r\n\t\t\t#else\r\n\t\t\t\t#define _ALS_OnDialogResponse\r\n\t\t\t#endif\r\n\t\t\t#define OnDialogResponse Testing_OnDialogResponse\r\n\t\t\t#if defined Testing_OnDialogResponse\r\n\t\t\t\tforward Testing_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);\r\n\t\t\t#endif\r\n\t\t\t\r\n\t\t\tpublic OnPlayerSpawn(playerid)\r\n\t\t\t{\r\n\t\t\t\tif (YSI_g_sPlayer == cellmax && !IsPlayerNPC(playerid))\r\n\t\t\t\t{\r\n\t\t\t\t\tprintf(\" \");\r\n\t\t\t\t\tprintf(\"  ||==========================||  \");\r\n\t\t\t\t\tprintf(\"  || STARTING PLAYER TESTS... ||  \");\r\n\t\t\t\t\tprintf(\"  ||==========================||  \");\r\n\t\t\t\t\tprintf(\" \");\r\n\t\t\t\t\tYSI_g_sTests = 0;\r\n\t\t\t\t\tYSI_g_sFails = 0;\r\n\t\t\t\t\tTesting_Next(playerid);\r\n\t\t\t\t}\r\n\t\t\t\t#if defined Testing_OnPlayerSpawn\r\n\t\t\t\t\treturn Testing_OnPlayerSpawn(playerid);\r\n\t\t\t\t#else\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t#endif\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t#if defined _ALS_OnPlayerSpawn\r\n\t\t\t\t#undef OnPlayerSpawn\r\n\t\t\t#else\r\n\t\t\t\t#define _ALS_OnPlayerSpawn\r\n\t\t\t#endif\r\n\t\t\t#define OnPlayerSpawn Testing_OnPlayerSpawn\r\n\t\t\t#if defined Testing_OnPlayerSpawn\r\n\t\t\t\tforward Testing_OnPlayerSpawn(playerid);\r\n\t\t\t#endif\r\n\t\t#endif\r\n\t#else\r\n\t\tTesting_RunAll()\r\n\t\t{\r\n\t\t\t// Disable error messages (as we're likely to generate them).\r\n\t\t\tstate ysi_debug : off;\r\n\t\t\tnew\r\n\t\t\t\ttests,\r\n\t\t\t\tfails;\r\n\t\t\tprintf(\" \");\r\n\t\t\tprintf(\"  ||===================||  \");\r\n\t\t\tprintf(\"  || STARTING TESTS... ||  \");\r\n\t\t\tprintf(\"  ||===================||  \");\r\n\t\t\tprintf(\" \");\r\n\t\t\tTesting_Run(tests, fails, _, true);\r\n\t\t\tprintf(\"*** Tests: %d, Fails: %d\", tests, fails);\r\n\t\t\tif (!fails)\r\n\t\t\t{\r\n\t\t\t\tprintf(\" \");\r\n\t\t\t\tprintf(\"  ||===================||  \");\r\n\t\t\t\tprintf(\"  || ALL TESTS PASSED! ||  \");\r\n\t\t\t\tprintf(\"  ||===================||  \");\r\n\t\t\t\tprintf(\" \");\r\n\t\t\t}\r\n\t\t\tstate ysi_debug : on;\r\n\t\t}\r\n\t#endif\r\n#else\r\n\t//#define Tests:%1() stock bool:Tests_@%1()\r\n\t/*#define Test:%1() stock bool:Test_@%1()\r\n\t#define TestInit:%1() stock Init_@%1()\r\n\t#define TestClose:%1() stock Shut_@%1()\r\n\t\r\n\t#define PTest:%1(%2) stock bool:Test_@%1(%2)\r\n\t#define PTestInit:%1(%2) stock Init_@%1(%2)\r\n\t#define PTestClose:%1(%2) stock Shut_@%1(%2)*/\r\n#endif\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Squirrel/Squirrel.nut",
    "content": "//example from http://www.squirrel-lang.org/#documentation\n\nlocal table = {\n\ta = \"10\"\n\tsubtable = {\n\t\tarray = [1,2,3]\n\t},\n\t[10 + 123] = \"expression index\"\n}\n \nlocal array=[ 1, 2, 3, { a = 10, b = \"string\" } ];\n \nforeach (i,val in array)\n{\n\t::print(\"the type of val is\"+typeof val);\n}\n \n/////////////////////////////////////////////\n \nclass Entity\n{\t\n\tconstructor(etype,entityname)\n\t{\n\t\tname = entityname;\n\t\ttype = etype;\n\t}\n\t\t\t\t\t\t\t\t\t\n\tx = 0;\n\ty = 0;\n\tz = 0;\n\tname = null;\n\ttype = null;\n}\n \nfunction Entity::MoveTo(newx,newy,newz)\n{\n\tx = newx;\n\ty = newy;\n\tz = newz;\n}\n \nclass Player extends Entity {\n\tconstructor(entityname)\n\t{\n\t\tbase.constructor(\"Player\",entityname)\n\t}\n\tfunction DoDomething()\n\t{\n\t\t::print(\"something\");\n\t}\n\t\n}\n \nlocal newplayer = Player(\"da playar\");\n \nnewplayer.MoveTo(100,200,300);\t\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stan/congress.stan",
    "content": "data {\n  int<lower=0> N;\n  vector[N] incumbency_88;\n  vector[N] vote_86;\n  vector[N] vote_88;\n}\nparameters {\n  vector[3] beta;\n  real<lower=0> sigma;\n}\nmodel {\n    vote_88 ~ normal(beta[1] + beta[2] * vote_86\n                     + beta[3] * incumbency_88,sigma);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stan/dogs.stan",
    "content": "data {\n  int<lower=0> n_dogs;\n  int<lower=0> n_trials;\n  int<lower=0,upper=1> y[n_dogs,n_trials];\n}\nparameters {\n  vector[3] beta;\n}\ntransformed parameters {\n  matrix[n_dogs,n_trials] n_avoid;\n  matrix[n_dogs,n_trials] n_shock;\n  matrix[n_dogs,n_trials] p;\n\n  for (j in 1:n_dogs) {\n    n_avoid[j,1] <- 0;\n    n_shock[j,1] <- 0;\n    for (t in 2:n_trials) {\n      n_avoid[j,t] <- n_avoid[j,t-1] + 1 - y[j,t-1];\n      n_shock[j,t] <- n_shock[j,t-1] + y[j,t-1];\n    }\n    for (t in 1:n_trials)\n      p[j,t] <- beta[1] + beta[2] * n_avoid[j,t] + beta[3] * n_shock[j,t];\n  }\n}\nmodel {\n  beta ~ normal(0, 100);\n  for (i in 1:n_dogs) {\n    for (j in 1:n_trials)\n      y[i,j] ~ bernoulli_logit(p[i,j]);\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stan/schools.stan",
    "content": "data {\n  int<lower=0> N;\n  vector[N] y;\n  vector[N] sigma_y;\n}\nparameters {\n  vector[N] eta;\n  real mu_theta;\n  real<lower=0,upper=100> sigma_eta;\n  real xi;\n}\ntransformed parameters {\n  real<lower=0> sigma_theta;\n  vector[N] theta;\n\n  theta <- mu_theta + xi * eta;\n  sigma_theta <- fabs(xi) / sigma_eta;\n}\nmodel {\n  mu_theta ~ normal(0, 100);\n  sigma_eta ~ inv_gamma(1, 1); //prior distribution can be changed to uniform\n\n  eta ~ normal(0, sigma_eta);\n  xi ~ normal(0, 5);\n  y ~ normal(theta,sigma_y);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Standard ML/Foo.ML",
    "content": "\nstructure LazyBase:> LAZY_BASE =\n   struct\n      type 'a lazy = unit -> 'a\n\n      exception Undefined\n\n      fun delay f = f\n\n      fun force f = f()\n\n      val undefined = fn () => raise Undefined\n   end\n\nstructure LazyMemoBase:> LAZY_BASE =\n   struct \n\n      datatype 'a susp = NotYet of unit -> 'a\n                       | Done of 'a\n\n      type 'a lazy = unit -> 'a susp ref\n\n      exception Undefined\n\n      fun delay f = \n          let \n             val r = ref (NotYet f)\n          in\n             fn () => r\n          end\n\n      fun force f = \n          case f() of\n             ref (Done x) => x\n           | r as ref (NotYet f') =>\n             let\n                val a = f'()\n             in\n                r := Done a\n              ; a\n             end\n\n      val undefined = fn () => raise Undefined\n   end\n\nfunctor LazyFn(B: LAZY_BASE): LAZY' =\n   struct\n\n      open B\n\n      fun inject x = delay (fn () => x)\n\n      fun isUndefined x =\n          (ignore (force x)\n         ; false)\n          handle Undefined => true\n                              \n      fun toString f x = if isUndefined x then \"_|_\" else f (force x)\n\n      fun eqBy p (x,y) = p(force x,force y)\n      fun eq (x,y) = eqBy op= (x,y)\n      fun compare p (x,y) = p(force x,force y)\n\n      structure Ops = \n         struct \n            val ! = force\n            val ? = inject\n         end\n\n      fun map f x = delay (fn () => f (force x))\n\n   end\n\nstructure Lazy' = LazyFn(LazyBase)\nstructure LazyMemo = LazyFn(LazyMemoBase)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Standard ML/Foo.sig",
    "content": " \nsignature LAZY_BASE =\n   sig \n      type 'a lazy\n      exception Undefined\n      val force: 'a lazy -> 'a\n      val delay: (unit -> 'a) -> 'a lazy\n      val undefined: 'a lazy\n   end\n\nsignature LAZY' =\n   sig\n      include LAZY_BASE\n      val isUndefined: 'a lazy -> bool\n      val inject : 'a -> 'a lazy\n      val toString: ('a -> string) -> 'a lazy -> string\n      val eq: ''a lazy * ''a lazy -> bool\n      val eqBy: ('a * 'a -> bool) -> 'a lazy * 'a lazy -> bool\n      val compare: ('a * 'a -> order) -> 'a lazy * 'a lazy -> order\n      val map: ('a -> 'b) -> 'a lazy -> 'b lazy\n\n      structure Ops: \n                   sig\n                      val ! : 'a lazy -> 'a (* force *)\n                      val ? : 'a -> 'a lazy (* inject *)\n                   end\n   end\n"
  },
  {
    "path": "src/test/resources/samples/langs/Standard ML/Foo.sml",
    "content": "\nstructure LazyBase:> LAZY_BASE =\n   struct\n      type 'a lazy = unit -> 'a\n\n      exception Undefined\n\n      fun delay f = f\n\n      fun force f = f()\n\n      val undefined = fn () => raise Undefined\n   end\n\nstructure LazyMemoBase:> LAZY_BASE =\n   struct \n\n      datatype 'a susp = NotYet of unit -> 'a\n                       | Done of 'a\n\n      type 'a lazy = unit -> 'a susp ref\n\n      exception Undefined\n\n      fun delay f = \n          let \n             val r = ref (NotYet f)\n          in\n             fn () => r\n          end\n\n      fun force f = \n          case f() of\n             ref (Done x) => x\n           | r as ref (NotYet f') =>\n             let\n                val a = f'()\n             in\n                r := Done a\n              ; a\n             end\n\n      val undefined = fn () => raise Undefined\n   end\n\nfunctor LazyFn(B: LAZY_BASE): LAZY' =\n   struct\n\n      open B\n\n      fun inject x = delay (fn () => x)\n\n      fun isUndefined x =\n          (ignore (force x)\n         ; false)\n          handle Undefined => true\n                              \n      fun toString f x = if isUndefined x then \"_|_\" else f (force x)\n\n      fun eqBy p (x,y) = p(force x,force y)\n      fun eq (x,y) = eqBy op= (x,y)\n      fun compare p (x,y) = p(force x,force y)\n\n      structure Ops = \n         struct \n            val ! = force\n            val ? = inject\n         end\n\n      fun map f x = delay (fn () => f (force x))\n\n   end\n\nstructure Lazy' = LazyFn(LazyBase)\nstructure LazyMemo = LazyFn(LazyMemoBase)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Standard ML/RedBlackTree.fun",
    "content": "(* From Twelf *)\n(* Red/Black Trees *)\n(* Author: Frank Pfenning *)\n\nfunctor RedBlackTree\n  (type key'\n   val compare : key' * key' -> order)\n  :> TABLE where type key = key' =\nstruct\n  type key = key'\n  type 'a entry = key * 'a\n\n  datatype 'a dict =\n    Empty\t\t\t\t(* considered black *)\n  | Red of 'a entry * 'a dict * 'a dict\n  | Black of 'a entry * 'a dict * 'a dict\n\n  type 'a Table = 'a dict ref\n\n  (* Representation Invariants *)\n  (*\n     1. The tree is ordered: for every node Red((key1,datum1), left, right) or\n        Black ((key1,datum1), left, right), every key in left is less than\n        key1 and every key in right is greater than key1.\n\n     2. The children of a red node are black (color invariant).\n\n     3. Every path from the root to a leaf has the same number of\n        black nodes, called the black height of the tree.\n  *)\n\n  local\n\n  fun lookup dict key =\n    let\n      fun lk (Empty) = NONE\n\t| lk (Red tree) = lk' tree\n        | lk (Black tree) = lk' tree\n      and lk' ((key1, datum1), left, right) =\n\t    (case compare(key,key1)\n\t       of EQUAL => SOME(datum1)\n\t        | LESS => lk left\n\t\t| GREATER => lk right)\n      in\n\tlk dict\n      end\n\n  (* val restore_right : 'a dict -> 'a dict *)\n  (*\n     restore_right (Black(e,l,r)) >=> dict\n     where (1) Black(e,l,r) is ordered,\n           (2) Black(e,l,r) has black height n,\n\t   (3) color invariant may be violated at the root of r:\n               one of its children might be red.\n     and dict is a re-balanced red/black tree (satisfying all invariants)\n     and same black height n.\n  *)\n  fun restore_right (Black(e, Red lt, Red (rt as (_,Red _,_)))) =\n         Red(e, Black lt, Black rt)\t(* re-color *)\n    | restore_right (Black(e, Red lt, Red (rt as (_,_,Red _)))) =\n         Red(e, Black lt, Black rt)\t(* re-color *)\n    | restore_right (Black(e, l, Red(re, Red(rle, rll, rlr), rr))) =\n\t (* l is black, deep rotate *)\n\t Black(rle, Red(e, l, rll), Red(re, rlr, rr))\n    | restore_right (Black(e, l, Red(re, rl, rr as Red _))) =\n\t (* l is black, shallow rotate *)\n\t Black(re, Red(e, l, rl), rr)\n    | restore_right dict = dict\n\n  (* restore_left is like restore_right, except *)\n  (* the color invariant may be violated only at the root of left child *)\n  fun restore_left (Black(e, Red (lt as (_,Red _,_)), Red rt)) =\n\t Red(e, Black lt, Black rt)\t(* re-color *)\n    | restore_left (Black(e, Red (lt as (_,_,Red _)), Red rt)) =\n\t Red(e, Black lt, Black rt)\t(* re-color *)\n    | restore_left (Black(e, Red(le, ll as Red _, lr), r)) =\n\t (* r is black, shallow rotate *)\n\t Black(le, ll, Red(e, lr, r))\n    | restore_left (Black(e, Red(le, ll, Red(lre, lrl, lrr)), r)) =\n\t (* r is black, deep rotate *)\n\t Black(lre, Red(le, ll, lrl), Red(e, lrr, r))\n    | restore_left dict = dict\n\n  fun insert (dict, entry as (key,datum)) =\n    let\n      (* val ins : 'a dict -> 'a dict  inserts entry *)\n      (* ins (Red _) may violate color invariant at root *)\n      (* ins (Black _) or ins (Empty) will be red/black tree *)\n      (* ins preserves black height *)\n      fun ins (Empty) = Red(entry, Empty, Empty)\n\t| ins (Red(entry1 as (key1, datum1), left, right)) =\n\t  (case compare(key,key1)\n\t     of EQUAL => Red(entry, left, right)\n\t      | LESS => Red(entry1, ins left, right)\n\t      | GREATER => Red(entry1, left, ins right))\n\t| ins (Black(entry1 as (key1, datum1), left, right)) =\n\t  (case compare(key,key1)\n\t     of EQUAL => Black(entry, left, right)\n\t      | LESS => restore_left (Black(entry1, ins left, right))\n\t      | GREATER => restore_right (Black(entry1, left, ins right)))\n    in\n      case ins dict\n\tof Red (t as (_, Red _, _)) => Black t (* re-color *)\n\t | Red (t as (_, _, Red _)) => Black t (* re-color *)\n\t | dict => dict\n    end\n\n  (* function below from .../smlnj-lib/Util/int-redblack-set.sml *)\n  (* Need to check and improve some time *)\n  (* Sun Mar 13 08:22:53 2005 -fp *)\n\n  (* Remove an item.  Returns true if old item found, false otherwise *)\n    local\n      exception NotFound\n      datatype 'a zipper\n\t= TOP\n\t| LEFTB of ('a entry * 'a dict * 'a zipper)\n\t| LEFTR of ('a entry * 'a dict * 'a zipper)\n\t| RIGHTB of ('a dict * 'a entry * 'a zipper)\n\t| RIGHTR of ('a dict * 'a entry * 'a zipper)\n    in\n    fun delete t key =\n        let\n\t  fun zip (TOP, t) = t\n\t    | zip (LEFTB(x, b, z), a) = zip(z, Black(x, a, b))\n\t    | zip (LEFTR(x, b, z), a) = zip(z, Red(x, a, b))\n\t    | zip (RIGHTB(a, x, z), b) = zip(z, Black(x, a, b))\n\t    | zip (RIGHTR(a, x, z), b) = zip(z, Red(x, a, b))\n\t(* bbZip propagates a black deficit up the tree until either the top\n\t * is reached, or the deficit can be covered.  It returns a boolean\n\t * that is true if there is still a deficit and the zipped tree.\n\t *)\n\t  fun bbZip (TOP, t) = (true, t)\n\t    | bbZip (LEFTB(x, Red(y, c, d), z), a) = (* case 1L *)\n\t\tbbZip (LEFTR(x, c, LEFTB(y, d, z)), a)\n\t    | bbZip (LEFTB(x, Black(w, Red(y, c, d), e), z), a) = (* case 3L *)\n\t\tbbZip (LEFTB(x, Black(y, c, Red(w, d, e)), z), a)\n\t    | bbZip (LEFTR(x, Black(w, Red(y, c, d), e), z), a) = (* case 3L *)\n\t\tbbZip (LEFTR(x, Black(y, c, Red(w, d, e)), z), a)\n\t    | bbZip (LEFTB(x, Black(y, c, Red(w, d, e)), z), a) = (* case 4L *)\n\t\t(false, zip (z, Black(y, Black(x, a, c), Black(w, d, e))))\n\t    | bbZip (LEFTR(x, Black(y, c, Red(w, d, e)), z), a) = (* case 4L *)\n\t\t(false, zip (z, Red(y, Black(x, a, c), Black(w, d, e))))\n\t    | bbZip (LEFTR(x, Black(y, c, d), z), a) = (* case 2L *)\n\t\t(false, zip (z, Black(x, a, Red(y, c, d))))\n\t    | bbZip (LEFTB(x, Black(y, c, d), z), a) = (* case 2L *)\n\t\tbbZip (z, Black(x, a, Red(y, c, d)))\n\t    | bbZip (RIGHTB(Red(y, c, d), x, z), b) = (* case 1R *)\n\t\tbbZip (RIGHTR(d, x, RIGHTB(c, y, z)), b)\n\t    | bbZip (RIGHTR(Red(y, c, d), x, z), b) = (* case 1R *)\n\t\tbbZip (RIGHTR(d, x, RIGHTB(c, y, z)), b)\n\t    | bbZip (RIGHTB(Black(y, Red(w, c, d), e), x, z), b) = (* case 3R *)\n\t\tbbZip (RIGHTB(Black(w, c, Red(y, d, e)), x, z), b)\n\t    | bbZip (RIGHTR(Black(y, Red(w, c, d), e), x, z), b) = (* case 3R *)\n\t\tbbZip (RIGHTR(Black(w, c, Red(y, d, e)), x, z), b)\n\t    | bbZip (RIGHTB(Black(y, c, Red(w, d, e)), x, z), b) = (* case 4R *)\n\t\t(false, zip (z, Black(y, c, Black(x, Red(w, d, e), b))))\n\t    | bbZip (RIGHTR(Black(y, c, Red(w, d, e)), x, z), b) = (* case 4R *)\n\t\t(false, zip (z, Red(y, c, Black(w, Red(w, d, e), b))))\n\t    | bbZip (RIGHTR(Black(y, c, d), x, z), b) = (* case 2R *)\n\t\t(false, zip (z, Black(x, Red(y, c, d), b)))\n\t    | bbZip (RIGHTB(Black(y, c, d), x, z), b) = (* case 2R *)\n\t\tbbZip (z, Black(x, Red(y, c, d), b))\n\t    | bbZip (z, t) = (false, zip(z, t))\n\t  fun delMin (Red(y, Empty, b), z) = (y, (false, zip(z, b)))\n\t    | delMin (Black(y, Empty, b), z) = (y, bbZip(z, b))\n\t    | delMin (Black(y, a, b), z) = delMin(a, LEFTB(y, b, z))\n\t    | delMin (Red(y, a, b), z) = delMin(a, LEFTR(y, b, z))\n\t    | delMin (Empty, _) = raise Match\n\t  fun joinRed (Empty, Empty, z) = zip(z, Empty)\n\t    | joinRed (a, b, z) = let\n\t\tval (x, (needB, b')) = delMin(b, TOP)\n\t\tin\n\t\t  if needB\n\t\t    then #2(bbZip(z, Red(x, a, b')))\n\t\t    else zip(z, Red(x, a, b'))\n\t\tend\n\t  fun joinBlack (a, Empty, z) = #2(bbZip(z, a))\n\t    | joinBlack (Empty, b, z) = #2(bbZip(z, b))\n\t    | joinBlack (a, b, z) = let\n\t\tval (x, (needB, b')) = delMin(b, TOP)\n\t\tin\n\t\t  if needB\n\t\t    then #2(bbZip(z, Black(x, a, b')))\n\t\t    else zip(z, Black(x, a, b'))\n\t\tend\n\t  fun del (Empty, z) = raise NotFound\n\t    | del (Black(entry1 as (key1, datum1), a, b), z) =\n\t      (case compare(key,key1)\n\t\t of EQUAL => joinBlack (a, b, z)\n                  | LESS => del (a, LEFTB(entry1, b, z))\n\t\t  | GREATER => del (b, RIGHTB(a, entry1, z)))\n\t    | del (Red(entry1 as (key1, datum1), a, b), z) =\n\t      (case compare(key,key1)\n                 of EQUAL => joinRed (a, b, z)\n                  | LESS => del (a, LEFTR(entry1, b, z))\n                  | GREATER => del (b, RIGHTR(a, entry1, z)))\n\t  in\n\t    (del(t, TOP); true) handle NotFound => false\n\t  end\n    end (* local *)\n\n  (* use non-imperative version? *)\n  fun insertShadow (dict, entry as (key,datum)) =\n      let val oldEntry = ref NONE (* : 'a entry option ref *)\n          fun ins (Empty) = Red(entry, Empty, Empty)\n\t    | ins (Red(entry1 as (key1, datum1), left, right)) =\n\t      (case compare(key,key1)\n\t\t of EQUAL => (oldEntry := SOME(entry1);\n\t\t\t      Red(entry, left, right))\n\t          | LESS => Red(entry1, ins left, right)\n\t          | GREATER => Red(entry1, left, ins right))\n\t    | ins (Black(entry1 as (key1, datum1), left, right)) =\n\t      (case compare(key,key1)\n\t\t of EQUAL => (oldEntry := SOME(entry1);\n\t\t\t      Black(entry, left, right))\n\t          | LESS => restore_left (Black(entry1, ins left, right))\n\t          | GREATER => restore_right (Black(entry1, left, ins right)))\n      in\n\t(oldEntry := NONE;\n\t ((case ins dict\n\t     of Red (t as (_, Red _, _)) => Black t (* re-color *)\n\t      | Red (t as (_, _, Red _)) => Black t (* re-color *)\n\t      | dict => dict),\n\t  !oldEntry))\n      end\n  \n  fun app f dict =\n      let fun ap (Empty) = ()\n\t    | ap (Red tree) = ap' tree\n\t    | ap (Black tree) = ap' tree\n\t  and ap' (entry1, left, right) =\n\t      (ap left; f entry1; ap right)\n      in\n\tap dict\n      end\n\n  in\n    fun new (n) = ref (Empty) (* ignore size hint *)\n    val insert = (fn table => fn entry => (table := insert (!table, entry)))\n    val insertShadow =\n        (fn table => fn entry => \n\t let\n\t   val (dict, oldEntry) = insertShadow (!table, entry)\n\t in\n\t   (table := dict; oldEntry)\n\t end)\n    val lookup = (fn table => fn key => lookup (!table) key)\n    val delete = (fn table => fn key => (delete (!table) key; ()))\n    val clear = (fn table => (table := Empty))\n    val app = (fn f => fn table => app f (!table))\n  end\n\nend;  (* functor RedBlackTree *)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Standard ML/main.fun",
    "content": "(* Copyright (C) 2010-2011,2013 Matthew Fluet.\n * Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh\n *    Jagannathan, and Stephen Weeks.\n * Copyright (C) 1997-2000 NEC Research Institute.\n *\n * MLton is released under a BSD-style license.\n * See the file MLton-LICENSE for details.\n *)\n\nfunctor Main (S: MAIN_STRUCTS): MAIN =\nstruct\n\nopen S\n\nstructure Compile = Compile ()\n\nstructure Place =\n   struct\n      datatype t = Files | Generated | MLB | O | OUT | SML | TypeCheck\n\n      val toInt: t -> int =\n         fn MLB => 1\n          | SML => 1\n          | Files => 2\n          | TypeCheck => 4\n          | Generated => 5\n          | O => 6\n          | OUT => 7\n\n      val toString =\n         fn Files => \"files\"\n          | SML => \"sml\"\n          | MLB => \"mlb\"\n          | Generated => \"g\"\n          | O => \"o\"\n          | OUT => \"out\"\n          | TypeCheck => \"tc\"\n\n      fun compare (p, p') = Int.compare (toInt p, toInt p')\n   end\n\nstructure OptPred =\n   struct\n      datatype t =\n         Target of string\n       | Yes\n   end\n\nstructure Show =\n   struct\n      datatype t = Anns | PathMap\n   end\n\nval gcc: string ref = ref \"<unset>\"\nval arScript: string ref = ref \"<unset>\"\nval asOpts: {opt: string, pred: OptPred.t} list ref = ref []\nval ccOpts: {opt: string, pred: OptPred.t} list ref = ref []\nval linkOpts: {opt: string, pred: OptPred.t} list ref = ref []\n\nval buildConstants: bool ref = ref false\nval debugRuntime: bool ref = ref false\ndatatype debugFormat = Dwarf | DwarfPlus | Dwarf2 | Stabs | StabsPlus\nval debugFormat: debugFormat option ref = ref NONE\nval expert: bool ref = ref false\nval explicitAlign: Control.align option ref = ref NONE\nval explicitChunk: Control.chunk option ref = ref NONE\ndatatype explicitCodegen = Native | Explicit of Control.codegen\nval explicitCodegen: explicitCodegen option ref = ref NONE\nval keepGenerated = ref false\nval keepO = ref false\nval output: string option ref = ref NONE\nval profileSet: bool ref = ref false\nval profileTimeSet: bool ref = ref false\nval runtimeArgs: string list ref = ref [\"@MLton\"]\nval show: Show.t option ref = ref NONE\nval stop = ref Place.OUT\n\nfun parseMlbPathVar (line: String.t) =\n   case String.tokens (line, Char.isSpace) of\n      [var, path] => SOME {var = var, path = path}\n    | _ => NONE\n\nfun readMlbPathMap (file: File.t) =\n   if not (File.canRead file) then\n      Error.bug (concat [\"can't read MLB path map file: \", file])\n   else\n      List.keepAllMap\n      (File.lines file, fn line =>\n       if String.forall (line, Char.isSpace)\n          then NONE\n       else\n          case parseMlbPathVar line of\n             NONE => Error.bug (concat [\"strange mlb path mapping: \",\n                                        file, \":: \", line])\n           | SOME v => SOME v)\n\nval targetMap: unit -> {arch: MLton.Platform.Arch.t,\n                        os: MLton.Platform.OS.t,\n                        target: string} list =\n   Promise.lazy\n   (fn () =>\n    let\n       val targetsDir =\n          OS.Path.mkAbsolute { path = \"targets\",\n                               relativeTo = !Control.libDir }\n       val potentialTargets = Dir.lsDirs targetsDir\n       fun targetMap target =\n          let\n             val targetDir =\n                OS.Path.mkAbsolute { path = target,\n                                     relativeTo = targetsDir }\n             val osFile =\n                OS.Path.joinDirFile { dir = targetDir,\n                                      file = \"os\" }\n             val archFile =\n                OS.Path.joinDirFile { dir = targetDir,\n                                      file = \"arch\" }\n             val os   = File.contents osFile\n             val arch = File.contents archFile\n             val os   = List.first (String.tokens (os,   Char.isSpace))\n             val arch = List.first (String.tokens (arch, Char.isSpace))\n             val os =\n                case MLton.Platform.OS.fromString os of\n                   NONE => Error.bug (concat [\"strange os: \", os])\n                 | SOME os => os\n             val arch =\n                case MLton.Platform.Arch.fromString arch of\n                   NONE => Error.bug (concat [\"strange arch: \", arch])\n                 | SOME a => a\n          in\n             SOME { arch = arch, os = os, target = target }\n          end\n          handle _ => NONE\n    in\n       List.keepAllMap (potentialTargets, targetMap)\n    end)\n\nfun setTargetType (target: string, usage): unit =\n   case List.peek (targetMap (), fn {target = t, ...} => target = t) of\n      NONE => usage (concat [\"invalid target: \", target])\n    | SOME {arch, os, ...} =>\n         let\n            open Control\n         in\n            Target.arch := arch\n            ; Target.os := os\n         end\n\nfun hasCodegen (cg) =\n   let\n      datatype z = datatype Control.Target.arch\n      datatype z = datatype Control.Target.os\n      datatype z = datatype Control.Format.t\n      datatype z = datatype Control.codegen\n   in\n      case !Control.Target.arch of\n         AMD64 => (case cg of\n                      x86Codegen => false\n                    | _ => true)\n       | X86 => (case cg of\n                    amd64Codegen => false\n                  | x86Codegen =>\n                      (* Darwin PIC doesn't work *)\n                      !Control.Target.os <> Darwin orelse\n                      !Control.format = Executable orelse\n                      !Control.format = Archive\n                  | _ => true)\n       | _ => (case cg of\n                  amd64Codegen => false\n                | x86Codegen => false\n                | _ => true)\n   end\nfun hasNativeCodegen () =\n   let\n      datatype z = datatype Control.codegen\n   in\n      hasCodegen amd64Codegen\n      orelse hasCodegen x86Codegen\n   end\n\n\nfun defaultAlignIs8 () =\n   let\n      datatype z = datatype Control.Target.arch\n   in\n      case !Control.Target.arch of\n         Alpha => true\n       | AMD64 => true\n       | ARM => true\n       | HPPA => true\n       | IA64 => true\n       | MIPS => true\n       | Sparc => true\n       | S390 => true\n       | _ => false\n   end\n\nfun makeOptions {usage} =\n   let\n      val usage = fn s => (ignore (usage s); raise Fail \"unreachable\")\n      fun reportAnnotation (s, flag, e) =\n         case e of\n            Control.Elaborate.Bad =>\n               usage (concat [\"invalid -\", flag, \" flag: \", s])\n          | Control.Elaborate.Deprecated ids =>\n               if !Control.warnDeprecated\n                  then\n                     Out.output\n                     (Out.error,\n                      concat [\"Warning: \", \"deprecated annotation: \", s, \", use \",\n                              List.toString Control.Elaborate.Id.name ids, \".\\n\"])\n               else ()\n          | Control.Elaborate.Good () => ()\n          | Control.Elaborate.Other =>\n               usage (concat [\"invalid -\", flag, \" flag: \", s])\n      open Control Popt\n      datatype z = datatype MLton.Platform.Arch.t\n      datatype z = datatype MLton.Platform.OS.t\n      fun tokenizeOpt f opts =\n         List.foreach (String.tokens (opts, Char.isSpace),\n                       fn opt => f opt)\n      fun tokenizeTargetOpt f (target, opts) =\n         List.foreach (String.tokens (opts, Char.isSpace),\n                       fn opt => f (target, opt))\n   in\n      List.map\n      (\n       [\n       (Normal, \"align\", if defaultAlignIs8 () then \" {8|4}\" else \" {4|8}\",\n        \"object alignment\",\n        (SpaceString (fn s =>\n                      explicitAlign\n                      := SOME (case s of\n                                  \"4\" => Align4\n                                | \"8\" => Align8\n                                | _ => usage (concat [\"invalid -align flag: \",\n                                                      s]))))),\n       (Expert, \"ar-script\", \" <ar>\", \"path to a script producing archives\",\n        SpaceString (fn s => arScript := s)),\n       (Normal, \"as-opt\", \" <opt>\", \"pass option to assembler\",\n        (SpaceString o tokenizeOpt)\n        (fn s => List.push (asOpts, {opt = s, pred = OptPred.Yes}))),\n       (Expert, \"as-opt-quote\", \" <opt>\", \"pass (quoted) option to assembler\",\n        SpaceString\n        (fn s => List.push (asOpts, {opt = s, pred = OptPred.Yes}))),\n       (Expert, \"build-constants\", \" {false|true}\",\n        \"output C file that prints basis constants\",\n        boolRef buildConstants),\n       (Expert, \"cc\", \" <gcc>\", \"path to gcc executable\",\n        SpaceString (fn s => gcc := s)),\n       (Normal, \"cc-opt\", \" <opt>\", \"pass option to C compiler\",\n        (SpaceString o tokenizeOpt)\n        (fn s => List.push (ccOpts, {opt = s, pred = OptPred.Yes}))),\n       (Expert, \"cc-opt-quote\", \" <opt>\", \"pass (quoted) option to C compiler\",\n        SpaceString\n        (fn s => List.push (ccOpts, {opt = s, pred = OptPred.Yes}))),\n       (Expert, \"chunkify\", \" {coalesce<n>|func|one}\", \"set chunkify method\",\n        SpaceString (fn s =>\n                     explicitChunk\n                     := SOME (case s of\n                                 \"func\" => ChunkPerFunc\n                               | \"one\" => OneChunk\n                               | _ => let\n                                         val usage = fn () =>\n                                            usage (concat [\"invalid -chunkify flag: \", s])\n                                      in\n                                         if String.hasPrefix (s, {prefix = \"coalesce\"})\n                                            then let\n                                                    val s = String.dropPrefix (s, 8)\n                                                 in\n                                                    if String.forall (s, Char.isDigit)\n                                                       then (case Int.fromString s of\n                                                                NONE => usage ()\n                                                              | SOME n => Coalesce\n                                                                          {limit = n})\n                                                       else usage ()\n                                                 end\n                                            else usage ()\n                                      end))),\n       (Expert, \"closure-convert-globalize\", \" {true|false}\",\n        \"whether to globalize during closure conversion\",\n        Bool (fn b => (closureConvertGlobalize := b))),\n       (Expert, \"closure-convert-shrink\", \" {true|false}\",\n        \"whether to shrink during closure conversion\",\n        Bool (fn b => (closureConvertShrink := b))),\n       (Normal, \"codegen\",\n        concat [\" {\",\n                String.concatWith\n                (List.keepAllMap\n                 (Native :: (List.map (Control.Codegen.all, Explicit)),\n                  fn cg =>\n                  case cg of\n                     Native => if hasNativeCodegen () then SOME \"native\" else NONE\n                   | Explicit cg => if hasCodegen cg\n                                       then SOME (Control.Codegen.toString cg)\n                                    else NONE),\n                 \"|\"),\n                \"}\"],\n        \"which code generator to use\",\n        SpaceString (fn s =>\n                     explicitCodegen\n                     := SOME (if s = \"native\"\n                                 then Native\n                              else (case List.peek\n                                         (Control.Codegen.all, fn cg =>\n                                          s = Control.Codegen.toString cg) of\n                                       SOME cg => Explicit cg\n                                     | NONE => usage (concat [\"invalid -codegen flag: \", s]))))),\n       (Normal, \"const\", \" '<name> <value>'\", \"set compile-time constant\",\n        SpaceString (fn s =>\n                     case String.tokens (s, Char.isSpace) of\n                        [name, value] =>\n                           Compile.setCommandLineConstant {name = name,\n                                                           value = value}\n                      | _ => usage (concat [\"invalid -const flag: \", s]))),\n       (Expert, \"contify-into-main\", \" {false|true}\",\n        \"contify functions into main\",\n        boolRef contifyIntoMain),\n       (Expert, \"debug\", \" {false|true}\", \"produce executable with debug info\",\n        Bool (fn b => (debug := b\n                       ; debugRuntime := b))),\n       (Expert, \"debug-runtime\", \" {false|true}\", \"produce executable with debug info\",\n        boolRef debugRuntime),\n       (Expert, \"debug-format\", \" {default|dwarf|dwarf+|drwaf2|stabs|stabs+}\",\n        \"choose debug symbol format\",\n        SpaceString (fn s =>\n                        debugFormat :=\n                        (case s of\n                            \"default\" => NONE\n                          | \"dwarf\" => SOME Dwarf\n                          | \"dwarf+\" => SOME DwarfPlus\n                          | \"dwarf2\" => SOME Dwarf2\n                          | \"stabs\" => SOME Stabs\n                          | \"stabs+\" => SOME StabsPlus\n                          | _ => usage (concat [\"invalid -debug-format flag: \", s])))),\n       let\n          val flag = \"default-ann\"\n       in\n          (Normal, flag, \" <ann>\", \"set annotation default for mlb files\",\n           SpaceString\n           (fn s => reportAnnotation (s, flag,\n                                      Control.Elaborate.processDefault s)))\n       end,\n       (Normal, \"default-type\", \" '<ty><N>'\", \"set default type\",\n        SpaceString\n        (fn s => (case s of\n                     \"char8\" => Control.defaultChar := s\n                   | \"int8\" => Control.defaultInt := s\n                   | \"int16\" => Control.defaultInt := s\n                   | \"int32\" => Control.defaultInt := s\n                   | \"int64\" => Control.defaultInt := s\n                   | \"intinf\" => Control.defaultInt := s\n                   | \"real32\" => Control.defaultReal := s\n                   | \"real64\" => Control.defaultReal := s\n                   | \"widechar16\" => Control.defaultWideChar := s\n                   | \"widechar32\" => Control.defaultWideChar := s\n                   | \"word8\" => Control.defaultWord := s\n                   | \"word16\" => Control.defaultWord := s\n                   | \"word32\" => Control.defaultWord := s\n                   | \"word64\" => Control.defaultWord := s\n                   | _ => usage (concat [\"invalid -default-type flag: \", s])))),\n       (Expert, \"diag-pass\", \" <pass>\", \"keep diagnostic info for pass\",\n        SpaceString\n        (fn s =>\n         (case Regexp.fromString s of\n             SOME (re,_) => let val re = Regexp.compileDFA re\n                            in List.push (diagPasses, re)\n                            end\n           | NONE => usage (concat [\"invalid -diag-pass flag: \", s])))),\n       let\n          val flag = \"disable-ann\"\n       in\n          (Normal, flag, \" <ann>\", \"disable annotation in mlb files\",\n           SpaceString\n           (fn s =>\n            reportAnnotation (s, flag,\n                              Control.Elaborate.processEnabled (s, false))))\n       end,\n       (Expert, \"drop-pass\", \" <pass>\", \"omit optimization pass\",\n        SpaceString\n        (fn s => (case Regexp.fromString s of\n                     SOME (re,_) => let val re = Regexp.compileDFA re\n                                    in List.push (dropPasses, re)\n                                    end\n                   | NONE => usage (concat [\"invalid -drop-pass flag: \", s])))),\n       let\n          val flag = \"enable-ann\"\n       in\n          (Expert, flag, \" <ann>\", \"globally enable annotation\",\n           SpaceString\n           (fn s =>\n            reportAnnotation (s, flag,\n                              Control.Elaborate.processEnabled (s, true))))\n       end,\n       (Expert, \"error-threshhold\", \" <n>\", \"error threshhold (20)\",\n        intRef errorThreshhold),\n       (Expert, \"emit-main\", \" {true|false}\", \"emit main() startup function\",\n        boolRef emitMain),\n       (Expert, \"expert\", \" {false|true}\", \"enable expert status\",\n        boolRef expert),\n       (Normal, \"export-header\", \" <file>\", \"write C header file for _export's\",\n        SpaceString (fn s => exportHeader := SOME s)),\n       (Expert, \"format\",\n        concat [\" {\",\n                String.concatWith\n                (List.keepAllMap\n                  (Control.Format.all, fn cg => SOME (Control.Format.toString cg)),\n                 \"|\"),\n                \"}\"],\n        \"generated output format\",\n        SpaceString (fn s =>\n                     Control.format\n                     := (case List.peek\n                              (Control.Format.all, fn cg =>\n                               s = Control.Format.toString cg) of\n                            SOME cg => cg\n                          | NONE => usage (concat [\"invalid -format flag: \", s])))),\n       (Expert, \"gc-check\", \" {limit|first|every}\", \"force GCs\",\n        SpaceString (fn s =>\n                     gcCheck :=\n                     (case s of\n                         \"limit\" => Limit\n                       | \"first\" => First\n                       | \"every\" => Every\n                       | _ => usage (concat [\"invalid -gc-check flag: \", s])))),\n       (Normal, \"ieee-fp\", \" {false|true}\", \"use strict IEEE floating-point\",\n        boolRef Native.IEEEFP),\n       (Expert, \"indentation\", \" <n>\", \"indentation level in ILs\",\n        intRef indentation),\n       (Normal, \"inline\", \" <n>\", \"set inlining threshold\",\n        Int (fn i => inlineNonRec := {small = i,\n                                      product = #product (!inlineNonRec)})),\n       (Expert, \"inline-into-main\", \" {true|false}\",\n        \"inline functions into main\",\n        boolRef inlineIntoMain),\n       (Expert, \"inline-leafa-loops\", \" {true|false}\", \"leaf inline loops\",\n        Bool (fn loops =>\n              case !inlineLeafA of\n                 {repeat, size, ...} =>\n                    inlineLeafA :=\n                    {loops = loops, repeat = repeat, size = size})),\n       (Expert, \"inline-leafa-repeat\", \" {true|false}\", \"leaf inline repeat\",\n        Bool (fn repeat =>\n              case !inlineLeafA of\n                 {loops, size, ...} =>\n                    inlineLeafA :=\n                    {loops = loops, repeat = repeat, size = size})),\n       (Expert, \"inline-leafa-size\", \" <n>\", \"set leaf inlining threshold (20)\",\n        SpaceString (fn s =>\n                     case !inlineLeafA of\n                        {loops, repeat, ...} =>\n                           inlineLeafA :=\n                           {loops = loops, repeat = repeat,\n                            size = (if s = \"inf\"\n                                       then NONE\n                                    else if String.forall (s, Char.isDigit)\n                                       then Int.fromString s\n                                    else (usage o concat)\n                                         [\"invalid -inline-leaf-size flag: \", s])})),\n       (Expert, \"inline-leafb-loops\", \" {true|false}\", \"leaf inline loops\",\n        Bool (fn loops =>\n              case !inlineLeafB of\n                 {repeat, size, ...} =>\n                    inlineLeafB :=\n                    {loops = loops, repeat = repeat, size = size})),\n       (Expert, \"inline-leafb-repeat\", \" {true|false}\", \"leaf inline repeat\",\n        Bool (fn repeat =>\n              case !inlineLeafB of\n                 {loops, size, ...} =>\n                    inlineLeafB :=\n                    {loops = loops, repeat = repeat, size = size})),\n       (Expert, \"inline-leafb-size\", \" <n>\", \"set leaf inlining threshold (40)\",\n        SpaceString (fn s =>\n                     case !inlineLeafB of\n                        {loops, repeat, ...} =>\n                           inlineLeafB :=\n                           {loops = loops, repeat = repeat,\n                            size = (if s = \"inf\"\n                                       then NONE\n                                    else if String.forall (s, Char.isDigit)\n                                       then Int.fromString s\n                                    else (usage o concat)\n                                         [\"invalid -inline-leaf-size flag: \", s])})),\n       (Expert, \"inline-nonrec-product\", \" <n>\", \"set inlining threshold (320)\",\n        Int (fn product =>\n             case !inlineNonRec of\n                {small, ...} =>\n                   inlineNonRec := {small = small, product = product})),\n       (Expert, \"inline-nonrec-small\", \" <n>\", \"set inlining threshold (60)\",\n        Int (fn small =>\n             case !inlineNonRec of\n                {product, ...} =>\n                   inlineNonRec := {small = small, product = product})),\n       (Normal, \"keep\", \" {g|o}\", \"save intermediate files\",\n        SpaceString (fn s =>\n                     case s of\n                        \"core-ml\" => keepCoreML := true\n                      | \"dot\" => keepDot := true\n                      | \"g\" => keepGenerated := true\n                      | \"machine\" => keepMachine := true\n                      | \"o\" => keepO := true\n                      | \"rssa\" => keepRSSA := true\n                      | \"ssa\" => keepSSA := true\n                      | \"ssa2\" => keepSSA2 := true\n                      | \"sxml\" => keepSXML := true\n                      | \"xml\" => keepXML := true\n                      | _ => usage (concat [\"invalid -keep flag: \", s]))),\n       (Expert, \"keep-pass\", \" <pass>\", \"keep the results of pass\",\n        SpaceString\n        (fn s => (case Regexp.fromString s of\n                     SOME (re,_) => let val re = Regexp.compileDFA re\n                                    in List.push (keepPasses, re)\n                                    end\n                   | NONE => usage (concat [\"invalid -keep-pass flag: \", s])))),\n       (Expert, \"libname\", \" <basename>\", \"the name of the generated library\",\n        SpaceString (fn s => libname := s)),\n       (Normal, \"link-opt\", \" <opt>\", \"pass option to linker\",\n        (SpaceString o tokenizeOpt)\n        (fn s => List.push (linkOpts, {opt = s, pred = OptPred.Yes}))),\n       (Expert, \"link-opt-quote\", \" <opt>\", \"pass (quoted) option to linker\",\n        SpaceString\n        (fn s => List.push (linkOpts, {opt = s, pred = OptPred.Yes}))),\n       (Expert, \"loop-passes\", \" <n>\", \"loop optimization passes (1)\",\n        Int\n        (fn i =>\n         if i >= 1\n            then loopPasses := i\n            else usage (concat [\"invalid -loop-passes arg: \", Int.toString i]))),\n       (Expert, \"mark-cards\", \" {true|false}\", \"mutator marks cards\",\n        boolRef markCards),\n       (Expert, \"max-function-size\", \" <n>\", \"max function size (blocks)\",\n        intRef maxFunctionSize),\n       (Normal, \"mlb-path-map\", \" <file>\", \"additional MLB path map\",\n        SpaceString (fn s => mlbPathVars := !mlbPathVars @ readMlbPathMap s)),\n       (Normal, \"mlb-path-var\", \" '<name> <value>'\", \"additional MLB path var\",\n        SpaceString\n        (fn s => mlbPathVars := !mlbPathVars @\n                                [case parseMlbPathVar s of\n                                    NONE => Error.bug (\"strange mlb path var: \" ^ s)\n                                  | SOME v => v])),\n       (Expert, \"native-commented\", \" <n>\", \"level of comments  (0)\",\n        intRef Native.commented),\n       (Expert, \"native-copy-prop\", \" {true|false}\",\n        \"use copy propagation\",\n        boolRef Native.copyProp),\n       (Expert, \"native-cutoff\", \" <n>\",\n        \"live transfer cutoff distance\",\n        intRef Native.cutoff),\n       (Expert, \"native-live-transfer\", \" {0,...,8}\",\n        \"use live transfer\",\n        intRef Native.liveTransfer),\n       (Expert, \"native-live-stack\", \" {false|true}\",\n        \"track liveness of stack slots\",\n        boolRef Native.liveStack),\n       (Expert, \"native-move-hoist\", \" {true|false}\",\n        \"use move hoisting\",\n        boolRef Native.moveHoist),\n       (Expert, \"native-optimize\", \" <n>\", \"level of optimizations\",\n        intRef Native.optimize),\n       (Expert, \"native-split\", \" <n>\", \"split assembly files at ~n lines\",\n        Int (fn i => Native.split := SOME i)),\n       (Expert, \"native-shuffle\", \" {true|false}\",\n        \"shuffle registers at C-calls\",\n        Bool (fn b => Native.shuffle := b)),\n       (Expert, \"opt-passes\", \" {default|minimal}\", \"level of optimizations\",\n        SpaceString (fn s =>\n                     let\n                        fun err s =\n                           usage (concat [\"invalid -opt-passes flag: \", s])\n                     in\n                        List.foreach\n                        (!optimizationPasses, fn {il,set,...} =>\n                         case set s of\n                            Result.Yes () => ()\n                          | Result.No s' => err (concat [s', \"(for \", il, \")\"]))\n                     end)),\n       (Normal, \"output\", \" <file>\", \"name of output file\",\n        SpaceString (fn s => output := SOME s)),\n       (Expert, \"polyvariance\", \" {true|false}\", \"use polyvariance\",\n        Bool (fn b => if b then () else polyvariance := NONE)),\n       (Expert, \"polyvariance-hofo\", \" {true|false}\", \"duplicate higher-order fns only\",\n        Bool (fn hofo =>\n              case !polyvariance of\n                 SOME {product, rounds, small, ...} =>\n                    polyvariance := SOME {hofo = hofo,\n                                          product = product,\n                                          rounds = rounds,\n                                          small = small}\n               | _ => ())),\n       (Expert, \"polyvariance-product\", \" <n>\", \"set polyvariance threshold (300)\",\n        Int (fn product =>\n             case !polyvariance of\n                SOME {hofo, rounds, small, ...} =>\n                   polyvariance := SOME {hofo = hofo,\n                                         product = product,\n                                         rounds = rounds,\n                                         small = small}\n              | _ => ())),\n       (Expert, \"polyvariance-rounds\", \" <n>\", \"set polyvariance rounds (2)\",\n        Int (fn rounds =>\n             case !polyvariance of\n                SOME {hofo, product, small, ...} =>\n                   polyvariance := SOME {hofo = hofo,\n                                         product = product,\n                                         rounds = rounds,\n                                         small = small}\n              | _ => ())),\n       (Expert, \"polyvariance-small\", \" <n>\", \"set polyvariance threshold (30)\",\n        Int (fn small =>\n             case !polyvariance of\n                SOME {hofo, product, rounds, ...} =>\n                   polyvariance := SOME {hofo = hofo,\n                                         product = product,\n                                         rounds = rounds,\n                                         small = small}\n              | _ => ())),\n       (Expert, \"prefer-abs-paths\", \" {false|true}\",\n        \"prefer absolute paths when referring to files\",\n        boolRef preferAbsPaths),\n       (Expert, \"prof-pass\", \" <pass>\", \"keep profile info for pass\",\n        SpaceString (fn s =>\n                     (case Regexp.fromString s of\n                         SOME (re,_) => let val re = Regexp.compileDFA re\n                                        in\n                                           List.push (profPasses, re)\n                                        end\n                       | NONE => usage (concat [\"invalid -diag-pass flag: \", s])))),\n       (Normal, \"profile\", \" {no|alloc|count|time}\",\n        \"produce executable suitable for profiling\",\n        SpaceString\n        (fn s =>\n         if !profileSet\n            then usage \"can't have multiple -profile switches\"\n         else\n            (profileSet := true\n             ; profile := (case s of\n                              \"no\" => ProfileNone\n                            | \"alloc\" => ProfileAlloc\n                            | \"call\" => ProfileCallStack\n                            | \"count\" => ProfileCount\n                            | \"drop\" => ProfileDrop\n                            | \"label\" => ProfileLabel\n                            | \"time\" => (profileTimeSet := true\n                                         ; ProfileTimeLabel)\n                            | \"time-field\" => ProfileTimeField\n                            | \"time-label\" => ProfileTimeLabel\n                            | _ => usage (concat\n                                          [\"invalid -profile arg: \", s]))))),\n       (Normal, \"profile-branch\", \" {false|true}\",\n        \"profile branches in addition to functions\",\n        boolRef profileBranch),\n       (Expert, \"profile-c\", \" <regexp>\",\n        \"include C-calls in files matching <regexp> in profile\",\n        SpaceString\n        (fn s =>\n         (case Regexp.fromString s of\n             SOME (re,_) => let\n                               open Regexp\n                               val re = seq [anys, re, anys]\n                               val re = compileDFA re\n                            in List.push (profileC, re)\n                            end\n           | NONE => usage (concat [\"invalid -profile-c flag: \", s])))),\n       (Expert, \"profile-exclude\", \" <regexp>\",\n        \"exclude files matching <regexp> from profile\",\n        SpaceString\n        (fn s =>\n         (case Regexp.fromString s of\n             SOME (re,_) => let\n                               open Regexp\n                               val re = seq [anys, re, anys]\n                               val re = compileDFA re\n                            in List.push (profileInclExcl, (re, false))\n                            end\n           | NONE => usage (concat [\"invalid -profile-exclude flag: \", s])))),\n       (Expert, \"profile-il\", \" {source}\", \"where to insert profile exps\",\n        SpaceString\n        (fn s =>\n         case s of\n            \"source\" => profileIL := ProfileSource\n          | \"ssa\" => profileIL := ProfileSSA\n          | \"ssa2\" => profileIL := ProfileSSA2\n          | _ => usage (concat [\"invalid -profile-il arg: \", s]))),\n       (Expert, \"profile-include\", \" <regexp>\",\n        \"include files matching <regexp> from profile\",\n        SpaceString\n        (fn s =>\n         (case Regexp.fromString s of\n             SOME (re,_) => let\n                               open Regexp\n                               val re = seq [anys, re, anys]\n                               val re = compileDFA re\n                            in List.push (profileInclExcl, (re, true))\n                            end\n           | NONE => usage (concat [\"invalid -profile-include flag: \", s])))),\n       (Expert, \"profile-raise\", \" {false|true}\",\n        \"profile raises in addition to functions\",\n        boolRef profileRaise),\n       (Normal, \"profile-stack\", \" {false|true}\", \"profile the stack\",\n        boolRef profileStack),\n       (Normal, \"profile-val\", \" {false|true}\",\n        \"profile val bindings in addition to functions\",\n        boolRef profileVal),\n       (Normal, \"runtime\", \" <arg>\", \"pass arg to runtime via @MLton\",\n        SpaceString (fn s => List.push (runtimeArgs, s))),\n       (Expert, \"show\", \" {anns|path-map}\", \"print specified data and stop\",\n        SpaceString\n        (fn s =>\n         show := SOME (case s of\n                          \"anns\" => Show.Anns\n                        | \"path-map\" => Show.PathMap\n                        | _ => usage (concat [\"invalid -show arg: \", s])))),\n       (Normal, \"show-basis\", \" <file>\", \"write out the final basis environment\",\n        SpaceString (fn s => showBasis := SOME s)),\n       (Normal, \"show-def-use\", \" <file>\", \"write def-use information\",\n        SpaceString (fn s => showDefUse := SOME s)),\n       (Expert, \"show-types\", \" {true|false}\", \"show types in ILs\",\n        boolRef showTypes),\n       (Expert, \"ssa-passes\", \" <passes>\", \"ssa optimization passes\",\n        SpaceString\n        (fn s =>\n         case List.peek (!Control.optimizationPasses,\n                         fn {il, ...} => String.equals (\"ssa\", il)) of\n            SOME {set, ...} =>\n               (case set s of\n                   Result.Yes () => ()\n                 | Result.No s' => usage (concat [\"invalid -ssa-passes arg: \", s']))\n          | NONE => Error.bug \"ssa optimization passes missing\")),\n       (Expert, \"ssa2-passes\", \" <passes>\", \"ssa2 optimization passes\",\n        SpaceString\n        (fn s =>\n         case List.peek (!Control.optimizationPasses,\n                         fn {il, ...} => String.equals (\"ssa2\", il)) of\n            SOME {set, ...} =>\n               (case set s of\n                   Result.Yes () => ()\n                 | Result.No s' => usage (concat [\"invalid -ssa2-passes arg: \", s']))\n          | NONE => Error.bug \"ssa2 optimization passes missing\")),\n       (Normal, \"stop\", \" {f|g|o|tc}\", \"when to stop\",\n        SpaceString\n        (fn s =>\n         stop := (case s of\n                     \"f\" => Place.Files\n                   | \"g\" => Place.Generated\n                   | \"o\" => Place.O\n                   | \"tc\" => Place.TypeCheck\n                   | _ => usage (concat [\"invalid -stop arg: \", s])))),\n       (Expert, \"sxml-passes\", \" <passes>\", \"sxml optimization passes\",\n        SpaceString\n        (fn s =>\n         case List.peek (!Control.optimizationPasses,\n                         fn {il, ...} => String.equals (\"sxml\", il)) of\n            SOME {set, ...} =>\n               (case set s of\n                   Result.Yes () => ()\n                 | Result.No s' => usage (concat [\"invalid -sxml-passes arg: \", s']))\n          | NONE => Error.bug \"sxml optimization passes missing\")),\n       (Normal, \"target\",\n        concat [\" {\",\n                (case targetMap () of\n                    [] => \"\"\n                  | [x] => #target x\n                  | x :: _ => concat [#target x, \"|...\"]),\n                \"}\"],\n        \"platform that executable will run on\",\n        SpaceString\n        (fn t =>\n         (target := (if t = \"self\" then Self else Cross t);\n          setTargetType (t, usage)))),\n       (Normal, \"target-as-opt\", \" <target> <opt>\", \"target-dependent assembler option\",\n        (SpaceString2 o tokenizeTargetOpt)\n        (fn (target, opt) =>\n         List.push (asOpts, {opt = opt, pred = OptPred.Target target}))),\n       (Expert, \"target-as-opt-quote\", \" <target> <opt>\", \"target-dependent assembler option (quoted)\",\n        (SpaceString2\n         (fn (target, opt) =>\n          List.push (asOpts, {opt = opt, pred = OptPred.Target target})))),\n       (Normal, \"target-cc-opt\", \" <target> <opt>\", \"target-dependent C compiler option\",\n        (SpaceString2 o tokenizeTargetOpt)\n        (fn (target, opt) =>\n         List.push (ccOpts, {opt = opt, pred = OptPred.Target target}))),\n       (Expert, \"target-cc-opt-quote\", \" <target> <opt>\", \"target-dependent C compiler option (quoted)\",\n        (SpaceString2\n         (fn (target, opt) =>\n          List.push (ccOpts, {opt = opt, pred = OptPred.Target target})))),\n       (Normal, \"target-link-opt\", \" <target> <opt>\", \"target-dependent linker option\",\n        (SpaceString2 o tokenizeTargetOpt)\n        (fn (target, opt) =>\n         List.push (linkOpts, {opt = opt, pred = OptPred.Target target}))),\n       (Expert, \"target-link-opt-quote\", \" <target> <opt>\", \"target-dependent linker option (quoted)\",\n        (SpaceString2\n         (fn (target, opt) =>\n          List.push (linkOpts, {opt = opt, pred = OptPred.Target target})))),\n       (Expert, #1 trace, \" name1,...\", \"trace compiler internals\", #2 trace),\n       (Expert, \"type-check\", \" {false|true}\", \"type check ILs\",\n        boolRef typeCheck),\n       (Normal, \"verbose\", \" {0|1|2|3}\", \"how verbose to be\",\n        SpaceString\n        (fn s =>\n         verbosity := (case s of\n                          \"0\" => Silent\n                        | \"1\" => Top\n                        | \"2\" => Pass\n                        | \"3\" => Detail\n                        | _ => usage (concat [\"invalid -verbose arg: \", s])))),\n       (Expert, \"warn-ann\", \" {true|false}\",\n        \"unrecognized annotation warnings\",\n        boolRef warnAnn),\n       (Expert, \"warn-deprecated\", \" {true|false}\",\n        \"deprecated feature warnings\",\n        boolRef warnDeprecated),\n       (Expert, \"xml-passes\", \" <passes>\", \"xml optimization passes\",\n        SpaceString\n        (fn s =>\n         case List.peek (!Control.optimizationPasses,\n                         fn {il, ...} => String.equals (\"xml\", il)) of\n            SOME {set, ...} =>\n               (case set s of\n                   Result.Yes () => ()\n                 | Result.No s' => usage (concat [\"invalid -xml-passes arg: \", s']))\n          | NONE => Error.bug \"xml optimization passes missing\")),\n       (Expert, \"zone-cut-depth\", \" <n>\", \"zone cut depth\",\n        intRef zoneCutDepth)\n       ],\n       fn (style, name, arg, desc, opt) =>\n       {arg = arg, desc = desc, name = name, opt = opt, style = style})\n   end\n\nval mainUsage =\n   \"mlton [option ...] file.{c|mlb|o|sml} [file.{c|o|s|S} ...]\"\n\nval {parse, usage} =\n   Popt.makeUsage {mainUsage = mainUsage,\n                   makeOptions = makeOptions,\n                   showExpert = fn () => !expert}\n\nval usage = fn s => (usage s; raise Fail \"unreachable\")\n\nfun commandLine (args: string list): unit =\n   let\n      open Control\n      datatype z = datatype MLton.Platform.Arch.t\n      datatype z = datatype MLton.Platform.OS.t\n      val args =\n         case args of\n            lib :: args =>\n               (libDir := OS.Path.mkCanonical lib\n                ; args)\n          | _ => Error.bug \"incorrect args from shell script\"\n      val () = setTargetType (\"self\", usage)\n      val result = parse args\n\n      val target = !target\n      val targetStr =\n         case target of\n            Cross s => s\n          | Self => \"self\"\n      val targetsDir =\n         OS.Path.mkAbsolute { path = \"targets\",\n                              relativeTo = !libDir }\n      val targetDir =\n         OS.Path.mkAbsolute { path = targetStr,\n                              relativeTo = targetsDir }\n      val () = libTargetDir := targetDir\n      val targetArch = !Target.arch\n      val archStr = String.toLower (MLton.Platform.Arch.toString targetArch)\n      val targetOS = !Target.os\n      val OSStr = String.toLower (MLton.Platform.OS.toString targetOS)\n\n      (* Determine whether code should be PIC (position independent) or not.\n       * This decision depends on the platform and output format.\n       *)\n      val positionIndependent =\n         case (targetOS, targetArch, !format) of\n            (* Windows is never position independent *)\n            (MinGW, _, _) => false\n          | (Cygwin, _, _) => false\n            (* Technically, Darwin should always be PIC.\n             * However, PIC on i386/darwin is unimplemented so we avoid it.\n             * PowerPC PIC is bad too, but the C codegen will use PIC behind\n             * our back unless forced, so let's just admit that it's PIC.\n             *)\n          | (Darwin, X86, Executable) => false\n          | (Darwin, X86, Archive) => false\n          | (Darwin, _, _) => true\n            (* On ELF systems, we only need PIC for LibArchive/Library *)\n          | (_, _, Library) => true\n          | (_, _, LibArchive) => true\n          | _ => false\n      val () = Control.positionIndependent := positionIndependent\n\n      val stop = !stop\n\n      val () =\n         align := (case !explicitAlign of\n                      NONE => if defaultAlignIs8 () then Align8 else Align4\n                    | SOME a => a)\n      val () =\n         codegen := (case !explicitCodegen of\n                        NONE =>\n                           if hasCodegen (x86Codegen)\n                              then x86Codegen\n                           else if hasCodegen (amd64Codegen)\n                               then amd64Codegen\n                           else CCodegen\n                      | SOME Native =>\n                           if hasCodegen (x86Codegen)\n                              then x86Codegen\n                           else if hasCodegen (amd64Codegen)\n                              then amd64Codegen\n                           else usage (concat [\"can't use native codegen on \",\n                                               MLton.Platform.Arch.toString targetArch,\n                                               \" target\"])\n                      | SOME (Explicit cg) => cg)\n      val () = MLton.Rusage.measureGC (!verbosity <> Silent)\n      val () = if !profileTimeSet\n                  then (case !codegen of\n                           x86Codegen => profile := ProfileTimeLabel\n                         | amd64Codegen => profile := ProfileTimeLabel\n                         | _ => profile := ProfileTimeField)\n                  else ()\n      val () = if !exnHistory\n                  then (case !profile of\n                           ProfileNone => profile := ProfileCallStack\n                         | ProfileCallStack => ()\n                         | _ => usage \"can't use -profile with Exn.keepHistory\"\n                        ; profileRaise := true)\n               else ()\n\n      val () =\n         Compile.setCommandLineConstant\n         {name = \"CallStack.keep\",\n          value = Bool.toString (!Control.profile = Control.ProfileCallStack)}\n\n      val () =\n         let\n            val sizeMap =\n               List.map\n               (File.lines (OS.Path.joinDirFile {dir = !Control.libTargetDir,\n                                                 file = \"sizes\"}),\n                fn line =>\n                case String.tokens (line, Char.isSpace) of\n                   [ty, \"=\", size] =>\n                      (case Int.fromString size of\n                          NONE => Error.bug (concat [\"strange size: \", size])\n                        | SOME size =>\n                             (ty, Bytes.toBits (Bytes.fromInt size)))\n                 | _ => Error.bug (concat [\"strange size mapping: \", line]))\n            fun lookup ty' =\n               case List.peek (sizeMap, fn (ty, _) => String.equals (ty, ty')) of\n                  NONE => Error.bug (concat [\"missing size mapping: \", ty'])\n                | SOME (_, size) => size\n         in\n            Control.Target.setSizes\n            {cint = lookup \"cint\",\n             cpointer = lookup \"cpointer\",\n             cptrdiff = lookup \"cptrdiff\",\n             csize = lookup \"csize\",\n             header = lookup \"header\",\n             mplimb = lookup \"mplimb\",\n             objptr = lookup \"objptr\",\n             seqIndex = lookup \"seqIndex\"}\n         end\n\n      fun tokenize l =\n         String.tokens (concat (List.separate (l, \" \")), Char.isSpace)\n\n      (* When cross-compiling, use the named cross compiler.\n       * Older gcc versions used -b for multiple targets.\n       * If this is still needed, a shell script wrapper can hide this.\n       *)\n      val gcc =\n         case target of\n            Cross s =>\n               let\n                  val {dir = gccDir, file = gccFile} =\n                     OS.Path.splitDirFile (!gcc)\n               in\n                  OS.Path.joinDirFile\n                  {dir = gccDir,\n                   file = s ^ \"-\" ^ gccFile}\n               end\n          | Self => !gcc\n      val arScript = !arScript\n\n      fun addTargetOpts opts =\n         List.fold\n         (!opts, [], fn ({opt, pred}, ac) =>\n          if (case pred of\n                 OptPred.Target s =>\n                    let\n                       val s = String.toLower s\n                    in\n                       s = archStr orelse s = OSStr\n                    end\n               | OptPred.Yes => true)\n             then opt :: ac\n          else ac)\n      val asOpts = addTargetOpts asOpts\n      val ccOpts = addTargetOpts ccOpts\n      val ccOpts = concat [\"-I\",\n                           OS.Path.mkAbsolute { path = \"include\",\n                                                relativeTo = !libTargetDir }]\n                   :: ccOpts\n      val linkOpts =\n         List.concat [[concat [\"-L\", !libTargetDir]],\n                      if !debugRuntime then\n                      [\"-lmlton-gdb\", \"-lgdtoa-gdb\"]\n                      else if positionIndependent then\n                      [\"-lmlton-pic\", \"-lgdtoa-pic\"]\n                      else\n                      [\"-lmlton\", \"-lgdtoa\"],\n                      addTargetOpts linkOpts]\n      val linkArchives =\n         if !debugRuntime then\n         [OS.Path.joinDirFile { dir = !libTargetDir, file = \"libmlton-gdb.a\" },\n          OS.Path.joinDirFile { dir = !libTargetDir, file = \"libgdtoa-gdb.a\" }]\n         else if positionIndependent then\n         [OS.Path.joinDirFile { dir = !libTargetDir, file = \"libmlton-pic.a\" },\n          OS.Path.joinDirFile { dir = !libTargetDir, file = \"libgdtoa-pic.a\" }]\n         else\n         [OS.Path.joinDirFile { dir = !libTargetDir, file =  \"libmlton.a\" },\n          OS.Path.joinDirFile { dir = !libTargetDir, file =  \"libgdtoa.a\" }]\n      val _ =\n         if not (hasCodegen (!codegen))\n            then usage (concat [\"can't use \",\n                                Control.Codegen.toString (!codegen),\n                                \" codegen on \",\n                                MLton.Platform.Arch.toString targetArch,\n                                \" target\"])\n         else ()\n      val () =\n         Control.labelsHaveExtra_ := (case targetOS of\n                                         Cygwin => true\n                                       | Darwin => true\n                                       | MinGW => true\n                                       | _ => false)\n      val _ =\n         chunk :=\n         (case !explicitChunk of\n             NONE => (case !codegen of\n                         amd64Codegen => ChunkPerFunc\n                       | CCodegen => Coalesce {limit = 4096}\n                       | x86Codegen => ChunkPerFunc\n                       )\n           | SOME c => c)\n      val _ = if not (!Control.codegen = x86Codegen) andalso !Native.IEEEFP\n                 then usage \"must use x86 codegen with -ieee-fp true\"\n              else ()\n      val _ =\n         if !keepDot andalso List.isEmpty (!keepPasses)\n            then keepSSA := true\n         else ()\n      val () =\n         keepDefUse\n         := (isSome (!showDefUse)\n             orelse (Control.Elaborate.enabled Control.Elaborate.warnUnused)\n             orelse (Control.Elaborate.default Control.Elaborate.warnUnused))\n      val warnMatch =\n          (Control.Elaborate.enabled Control.Elaborate.nonexhaustiveMatch)\n          orelse (Control.Elaborate.enabled Control.Elaborate.redundantMatch)\n          orelse (Control.Elaborate.default Control.Elaborate.nonexhaustiveMatch <>\n                  Control.Elaborate.DiagEIW.Ignore)\n          orelse (Control.Elaborate.default Control.Elaborate.redundantMatch <>\n                  Control.Elaborate.DiagEIW.Ignore)\n      val _ = elaborateOnly := (stop = Place.TypeCheck\n                                andalso not (warnMatch)\n                                andalso not (!keepDefUse))\n      val _ =\n         case targetOS of\n            Darwin => ()\n          | FreeBSD => ()\n          | HPUX => ()\n          | Linux => ()\n          | MinGW => ()\n          | NetBSD => ()\n          | OpenBSD => ()\n          | Solaris => ()\n          | _ =>\n               if !profile = ProfileTimeField\n                  orelse !profile = ProfileTimeLabel\n                  then usage (concat [\"can't use -profile time on \",\n                                      MLton.Platform.OS.toString targetOS])\n               else ()\n      fun printVersion (out: Out.t): unit =\n         Out.output (out, concat [Version.banner, \"\\n\"])\n      val () =\n         case !show of\n            NONE => ()\n          | SOME info =>\n            (case info of\n                Show.Anns =>\n                Layout.outputl (Control.Elaborate.document {expert = !expert},\n                                Out.standard)\n              | Show.PathMap =>\n                let\n                   open Layout\n                in\n                   outputl (align\n                            (List.map (Control.mlbPathMap (),\n                                       fn {var, path, ...} =>\n                                       str (concat [var, \" \", path]))),\n                            Out.standard)\n                end\n             ; let open OS.Process in exit success end)\n   in\n      case result of\n      Result.No msg => usage msg\n    | Result.Yes [] =>\n         (inputFile := \"<none>\"\n          ; if isSome (!showBasis)\n               then (trace (Top, \"Type Check SML\")\n                     Compile.elaborateSML {input = []})\n            else if !buildConstants\n               then Compile.outputBasisConstants Out.standard\n            else if !verbosity = Silent orelse !verbosity = Top\n               then printVersion Out.standard\n            else outputHeader' (No, Out.standard))\n    | Result.Yes (input :: rest) =>\n         let\n            val _ = inputFile := File.base (File.fileOf input)\n            val (start, base) =\n               let\n                  val rec loop =\n                     fn [] => usage (concat [\"invalid file suffix on \", input])\n                      | (suf, start, hasNum) :: sufs =>\n                           if String.hasSuffix (input, {suffix = suf})\n                              then (start,\n                                    let\n                                       val f = File.base input\n                                    in\n                                       if hasNum\n                                          then File.base f\n                                       else f\n                                    end)\n                           else loop sufs\n                  datatype z = datatype Place.t\n               in\n                  loop [(\".mlb\", MLB, false),\n                        (\".sml\", SML, false),\n                        (\".c\", Generated, true),\n                        (\".o\", O, true)]\n               end\n            val _ =\n               List.foreach\n               (rest, fn f =>\n                if List.exists ([\".c\", \".o\", \".s\", \".S\"], fn suffix =>\n                                String.hasSuffix (f, {suffix = suffix}))\n                   then File.withIn (f, fn _ => ())\n                else usage (concat [\"invalid file suffix: \", f]))\n            val csoFiles = rest\n         in\n            case Place.compare (start, stop) of\n               GREATER => usage (concat [\"cannot go from \", Place.toString start,\n                                         \" to \", Place.toString stop])\n             | EQUAL => usage \"nothing to do\"\n             | LESS =>\n                  let\n                     val _ =\n                        if !verbosity = Top\n                           then printVersion Out.error\n                        else ()\n                     val tempFiles: File.t list ref = ref []\n                     val tmpDir =\n                        let\n                           val (tmpVar, default) =\n                              case MLton.Platform.OS.host of\n                                 MinGW => (\"TEMP\", \"C:/WINDOWS/TEMP\")\n                               | _ => (\"TMPDIR\", \"/tmp\")\n                        in\n                           case Process.getEnv tmpVar of\n                              NONE => default\n                            | SOME d => d\n                        end\n                     fun temp (suf: string): File.t =\n                        let\n                           val (f, out) =\n                              File.temp {prefix = OS.Path.concat (tmpDir, \"file\"),\n                                         suffix = suf}\n                           val _ = Out.close out\n                           val _ = List.push (tempFiles, f)\n                        in\n                           f\n                        end\n                     fun suffix s = concat [base, s]\n                     fun maybeOut suf =\n                        case !output of\n                           NONE => suffix suf\n                         | SOME f => f\n                     fun maybeOutBase suf =\n                        case !output of\n                           NONE => suffix suf\n                         | SOME f => if File.extension f = SOME \"exe\"\n                                        then concat [File.base f, suf]\n                                     else concat [f, suf]\n                     val { base = outputBase, ext=_ } =\n                        OS.Path.splitBaseExt (maybeOut \".ext\")\n                     val { file = defLibname, dir=_ } =\n                        OS.Path.splitDirFile outputBase\n                     val defLibname =\n                        if String.hasPrefix (defLibname, {prefix = \"lib\"})\n                        then String.extract (defLibname, 3, NONE)\n                        else defLibname\n                     fun toAlNum c = if Char.isAlphaNum c then c else #\"_\"\n                     val () =\n                        if !libname <> \"\" then () else\n                        libname := CharVector.map toAlNum defLibname\n                     (* Library output includes a header by default *)\n                     val () =\n                        case (!format, !exportHeader) of\n                           (Executable, _) => ()\n                         | (_, NONE) => exportHeader := SOME (!libname ^ \".h\")\n                         | _ => ()\n                     val _ =\n                        atMLtons :=\n                        Vector.fromList\n                        (maybeOut \"\" :: tokenize (rev (\"--\" :: (!runtimeArgs))))\n                     (* The -Wa,--gstabs says to pass the --gstabs option to the\n                      * assembler. This tells the assembler to generate stabs\n                      * debugging information for each assembler line.\n                      *)\n                     val (gccDebug, asDebug) =\n                        case !debugFormat of\n                           NONE => ([\"-g\"], \"-Wa,-g\")\n                         | SOME Dwarf => ([\"-gdwarf\", \"-g2\"], \"-Wa,--gdwarf2\")\n                         | SOME DwarfPlus => ([\"-gdwarf+\", \"-g2\"], \"-Wa,--gdwarf2\")\n                         | SOME Dwarf2 => ([\"-gdwarf-2\", \"-g2\"], \"-Wa,--gdwarf2\")\n                         | SOME Stabs => ([\"-gstabs\", \"-g2\"], \"-Wa,--gstabs\")\n                         | SOME StabsPlus => ([\"-gstabs+\", \"-g2\"], \"-Wa,--gstabs\")\n                     fun compileO (inputs: File.t list): unit =\n                        let\n                           val output =\n                              case (!format, targetOS) of\n                                 (Archive, _) => maybeOut \".a\"\n                               | (Executable, _) => maybeOut \"\"\n                               | (LibArchive, _) => maybeOut \".a\"\n                               | (Library, Darwin) => maybeOut \".dylib\"\n                               | (Library, Cygwin) => !libname ^ \".dll\"\n                               | (Library, MinGW)  => !libname ^ \".dll\"\n                               | (Library, _) => maybeOut \".so\"\n                           val libOpts =\n                              case targetOS of\n                                 Darwin => [ \"-dynamiclib\" ]\n                               | Cygwin =>  [ \"-shared\",\n                                              \"-Wl,--out-implib,\" ^\n                                                 maybeOut \".a\",\n                                              \"-Wl,--output-def,\" ^\n                                                 !libname ^ \".def\"]\n                               | MinGW =>  [ \"-shared\",\n                                             \"-Wl,--out-implib,\" ^\n                                                maybeOut \".a\",\n                                             \"-Wl,--output-def,\" ^\n                                                !libname ^ \".def\"]\n                               | _ =>      [ \"-shared\" ]\n                           val _ =\n                              trace (Top, \"Link\")\n                              (fn () =>\n                               if !format = Archive orelse\n                                  !format = LibArchive\n                               then System.system\n                                    (arScript,\n                                     List.concat\n                                      [[targetStr, OSStr, output],\n                                       inputs,\n                                       linkArchives])\n                               else System.system\n                                    (gcc,\n                                     List.concat\n                                      [[\"-o\", output],\n                                       if !format = Library then libOpts else [],\n                                       if !debug then gccDebug else [],\n                                       inputs,\n                                       linkOpts]))\n                              ()\n                           (* gcc on Cygwin appends .exe, which I don't want, so\n                            * move the output file to it's rightful place.\n                            * Notice that we do not use targetOS here, since we\n                            * care about the platform we're running on, not the\n                            * platform we're generating for.\n                            *\n                            * We want to keep the .exe as is for MinGW/Win32.\n                            *)\n                           val _ =\n                              if MLton.Platform.OS.host = Cygwin\n                                 then\n                                    if String.contains (output, #\".\")\n                                       then ()\n                                    else\n                                       File.move {from = concat [output, \".exe\"],\n                                                  to = output}\n                              else ()\n                        in\n                           ()\n                        end\n                  fun mkOutputO (c: Counter.t, input: File.t): File.t =\n                     if stop = Place.O orelse !keepO\n                        then\n                           if File.dirOf input = File.dirOf (maybeOutBase \".o\")\n                              then\n                                 concat [File.base input, \".o\"]\n                              else\n                                 maybeOutBase\n                                    (concat [\".\",\n                                             Int.toString (Counter.next c),\n                                             \".o\"])\n                        else temp \".o\"\n                  fun compileC (c: Counter.t, input: File.t): File.t =\n                     let\n                        val debugSwitches = gccDebug @ [\"-DASSERT=1\"]\n                        val output = mkOutputO (c, input)\n\n                        val _ =\n                           System.system\n                            (gcc,\n                             List.concat\n                             [[ \"-std=gnu99\", \"-c\" ],\n                              if !format = Executable\n                              then [] else [ \"-DLIBNAME=\" ^ !libname ],\n                              if positionIndependent\n                              then [ \"-fPIC\", \"-DPIC\" ] else [],\n                              if !debug then debugSwitches else [],\n                              ccOpts,\n                              [\"-o\", output],\n                              [input]])\n                     in\n                        output\n                     end\n                  fun compileS (c: Counter.t, input: File.t): File.t =\n                     let\n                        val output = mkOutputO (c, input)\n                        val _ =\n                           System.system\n                           (gcc,\n                            List.concat\n                            [[\"-c\"],\n                             if !debug then [asDebug] else [],\n                             asOpts,\n                             [\"-o\", output],\n                             [input]])\n                     in\n                        output\n                     end\n                  fun compileCSO (inputs: File.t list): unit =\n                     if List.forall (inputs, fn f =>\n                                     SOME \"o\" = File.extension f)\n                        then compileO inputs\n                     else\n                     let\n                        val c = Counter.new 0\n                        val oFiles =\n                           trace (Top, \"Compile and Assemble\")\n                           (fn () =>\n                            List.fold\n                            (inputs, [], fn (input, ac) =>\n                             let\n                                val extension = File.extension input\n                             in\n                                if SOME \"o\" = extension\n                                   then input :: ac\n                                else if SOME \"c\" = extension\n                                   then (compileC (c, input)) :: ac\n                                else if SOME \"s\" = extension\n                                        orelse SOME \"S\" = extension\n                                   then (compileS (c, input)) :: ac\n                                else Error.bug\n                                     (concat\n                                      [\"invalid extension: \",\n                                       Option.toString (fn s => s) extension])\n                             end))\n                           ()\n                     in\n                        case stop of\n                           Place.O => ()\n                         | _ => compileO (rev oFiles)\n                     end\n                  fun mkCompileSrc {listFiles, elaborate, compile} input =\n                     let\n                        val outputs: File.t list ref = ref []\n                        val r = ref 0\n                        fun make (style: style, suf: string) () =\n                           let\n                              val suf = concat [\".\", Int.toString (!r), suf]\n                              val _ = Int.inc r\n                              val file = (if !keepGenerated\n                                             orelse stop = Place.Generated\n                                             then maybeOutBase\n                                          else temp) suf\n                              val _ = List.push (outputs, file)\n                              val out = Out.openOut file\n                              fun print s = Out.output (out, s)\n                              val _ = outputHeader' (style, out)\n                              fun done () = Out.close out\n                           in\n                              {file = file,\n                               print = print,\n                               done = done}\n                           end\n                        val _ =\n                           case !verbosity of\n                              Silent => ()\n                            | Top => ()\n                            | _ =>\n                                 outputHeader\n                                 (Control.No, fn l =>\n                                  let val out = Out.error\n                                  in Layout.output (l, out)\n                                     ; Out.newline out\n                                  end)\n                        val _ =\n                           case stop of\n                              Place.Files =>\n                                 Vector.foreach\n                                 (listFiles {input = input}, fn f =>\n                                  (print (String.translate\n                                          (f, fn #\"\\\\\" => \"/\" | c => str c))\n                                   ; print \"\\n\"))\n                            | Place.TypeCheck =>\n                                 trace (Top, \"Type Check SML\")\n                                 elaborate\n                                 {input = input}\n                            | _ =>\n                                 trace (Top, \"Compile SML\")\n                                 compile\n                                 {input = input,\n                                  outputC = make (Control.C, \".c\"),\n                                  outputS = make (Control.Assembly, \".s\")}\n                     in\n                        case stop of\n                           Place.Files => ()\n                         | Place.TypeCheck => ()\n                         | Place.Generated => ()\n                         | _ =>\n                              (* Shrink the heap before calling gcc. *)\n                              (MLton.GC.pack ()\n                               ; compileCSO (List.concat [!outputs, csoFiles]))\n                     end\n                  val compileSML =\n                     mkCompileSrc {listFiles = fn {input} => Vector.fromList input,\n                                   elaborate = Compile.elaborateSML,\n                                   compile = Compile.compileSML}\n                  val compileMLB =\n                     mkCompileSrc {listFiles = Compile.sourceFilesMLB,\n                                   elaborate = Compile.elaborateMLB,\n                                   compile = Compile.compileMLB}\n                  fun compile () =\n                     case start of\n                        Place.SML => compileSML [input]\n                      | Place.MLB => compileMLB input\n                      | Place.Generated => compileCSO (input :: csoFiles)\n                      | Place.O => compileCSO (input :: csoFiles)\n                      | _ => Error.bug \"invalid start\"\n                  val doit\n                    = trace (Top, \"MLton\")\n                      (fn () =>\n                       Exn.finally\n                       (compile, fn () =>\n                        List.foreach (!tempFiles, File.remove)))\n               in\n                  doit ()\n               end\n         end\n   end\n\nval commandLine = Process.makeCommandLine commandLine\n\nval main = fn (_, args) => commandLine args\n\nval mainWrapped = fn () => OS.Process.exit (commandLine (CommandLine.arguments ()))\n\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stata/common.doh",
    "content": "local inname  \"inputdata.dta\"\nlocal outname \"outputdata.dta\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stata/hello.ado",
    "content": "program hello\n\tvers 13\n\n\tdisplay \"Hello world!\"\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stata/include.ihlp",
    "content": "{* *! version 1.0.0  19mar2014}{...}\nHello world!{p_end}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stata/limits.matah",
    "content": "local MAXDIM   800\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stata/odkmeta.sthlp",
    "content": "{smcl}\n{* *! version 1.1.0 Matthew White 05jan2014}{...}\n{title:Title}\n\n{phang}\n{cmd:odkmeta} {hline 2} Create a do-file to import ODK data\n\n\n{marker syntax}{...}\n{title:Syntax}\n\n{p 8 10 2}\n{cmd:odkmeta}\n{cmd:using}\n{it:{help filename}}{cmd:,}\n{opt csv(csvfile)}\n{* Using -help histogram- as a template.}{...}\n{* -help histogram- notwithstanding, \"opts\" is rarely preceded by an underscore.}{...}\n{cmdab:s:urvey(}{it:surveyfile}{cmd:,}\n{it:{help odkmeta##surveyopts:surveyopts}}{cmd:)}\n{cmdab:cho:ices(}{it:choicesfile}{cmd:,}\n{it:{help odkmeta##choicesopts:choicesopts}}{cmd:)}\n[{it:options}]\n\n{* Using -help odbc- as a template.}{...}\n{* 36 is the position of the last character in the first column + 3.}{...}\n{synoptset 36 tabbed}{...}\n{synopthdr}\n{synoptline}\n{syntab:Main}\n{* Using -help heckman- as a template.}{...}\n{p2coldent:* {opt csv(csvfile)}}name of the .csv file that\ncontains the ODK data{p_end}\n{p2coldent:* {cmdab:s:urvey(}{it:surveyfile}{cmd:,} {it:{help odkmeta##surveyopts:surveyopts}}{cmd:)}}import\nmetadata from the {it:survey} worksheet {it:surveyfile}{p_end}\n{p2coldent:* {cmdab:cho:ices(}{it:choicesfile}{cmd:,} {it:{help odkmeta##choicesopts:choicesopts}}{cmd:)}}import\nmetadata from the {it:choices} worksheet {it:choicesfile}{p_end}\n\n{syntab:Fields}\n{synopt:{opt drop:attrib(headers)}}do not import field attributes with\nthe column headers {it:headers}{p_end}\n{synopt:{opt keep:attrib(headers)}}import only field attributes with\nthe column headers {it:headers}{p_end}\n{synopt:{opt rel:ax}}ignore fields in {it:surveyfile} that\ndo not exist in {it:csvfile}{p_end}\n\n{syntab:Lists}\n{* Using -help ca- as a template.}{...}\n{synopt:{cmdab:oth:er(}{it:{help odkmeta##other:other}}{cmd:)}}Stata value of\n{cmd:other} values of {cmd:select or_other} fields; default is {cmd:max}{p_end}\n{synopt:{opt one:line}}write each list on a single line{p_end}\n\n{syntab:Options}\n{synopt:{opt replace}}overwrite existing {it:{help filename}}{p_end}\n{synoptline}\n{p2colreset}{...}\n{* Using -help heckman- as a template.}{...}\n{p 4 6 2}* {opt csv()}, {opt survey()}, and {opt choices()} are required.{p_end}\n\n{marker surveyopts}{...}\n{* Change in {synoptset}: using -help odbc- as a template.}{...}\n{synoptset 23 tabbed}{...}\n{synopthdr:surveyopts}\n{synoptline}\n{syntab:Main}\n{synopt:{opt t:ype(header)}}column header of the {it:type} field attribute;\ndefault is {cmd:type}{p_end}\n{synopt:{opt name(header)}}column header of the {it:name} field attribute;\ndefault is {cmd:name}{p_end}\n{synopt:{opt la:bel(header)}}column header of the {it:label} field attribute;\ndefault is {cmd:label}{p_end}\n{synopt:{opt d:isabled(header)}}column header of\nthe {it:disabled} field attribute; default is {cmd:disabled}{p_end}\n{synoptline}\n{p2colreset}{...}\n\n{marker choicesopts}{...}\n{synoptset 23 tabbed}{...}\n{synopthdr:choicesopts}\n{synoptline}\n{syntab:Main}\n{synopt:{opt li:stname(header)}}column header of\nthe {it:list_name} list attribute; default is {cmd:list_name}{p_end}\n{synopt:{opt name(header)}}column header of the {it:name} list attribute;\ndefault is {cmd:name}{p_end}\n{synopt:{opt la:bel(header)}}column header of the {it:label} list attribute;\ndefault is {cmd:label}{p_end}\n{synoptline}\n{p2colreset}{...}\n\n{marker other}{...}\n{synoptset 23 tabbed}{...}\n{synopthdr:other}\n{synoptline}\n{synopt:{opt max}}maximum value of each list: maximum list value plus one{p_end}\n{synopt:{opt min}}minimum value of each list: minimum list value minus\none{p_end}\n{synopt:{it:#}}constant value for all value labels{p_end}\n{synoptline}\n{p2colreset}{...}\n\n\n{marker description}{...}\n{title:Description}\n\n{pstd}\n{cmd:odkmeta} creates a do-file to import ODK data,\nusing the metadata from the {it:survey} and {it:choices} worksheets of\nthe XLSForm. The do-file, saved to {it:filename},\ncompletes the following tasks in order:\n\n{* Using -help anova- as a template.}{...}\n{phang2}o  Import lists as {help label:value labels}{p_end}\n{phang2}o  Add {cmd:other} values to value labels{p_end}\n{phang2}o  Import field attributes as {help char:characteristics}{p_end}\n{phang2}o  Split {cmd:select_multiple} variables{p_end}\n{phang2}o  Drop {cmd:note} variables{p_end}\n{phang2}o  {help format:Format} {cmd:date}, {cmd:time}, and\n{cmd:datetime} variables{p_end}\n{phang2}o  Attach value labels{p_end}\n{phang2}o  Attach field labels as\n{help label:variable labels} and {help notes}{p_end}\n{phang2}o  {help merge:Merge} repeat groups{p_end}\n\n{pstd}\nAfter {cmd:select_multiple} variables have been split,\ntasks can be removed from the do-file without affecting other tasks.\nUser-written supplements to the do-file may make use of any field attributes,\nwhich are imported as characteristics.\n\n\n{marker remarks}{...}\n{title:Remarks}\n\n{pstd}\nThe {cmd:odkmeta} do-file uses {helpb insheet} to import data.\nFields that are long strings of digits, such as {cmd:simserial} fields,\nwill be imported as numeric even if they are more than 16 digits.\nAs a result, they will lose {help precision}.\n\n{pstd}\nThe do-file makes limited use of {help mata:Mata} to\nmanage variable labels, value labels, and characteristics and\nto import field attributes and lists that contain difficult characters.\n\n{pstd}\nThe do-file starts with the definitions of several {help local:local macros};\nthese are constants that the do-file uses.\nFor instance, local macro {cmd:`datemask'} is the {help date():mask} of\ndate values in the .csv files.\nThe local macros are automatically set to default values, but\nthey may need to be changed depending on the data.\n\n\n{* Using xtdpd_postspecial2b.ihlp as a template.}{...}\n{marker remarks_field_names}{...}\n{title:Remarks for field names}\n\n{pstd}\nODK field names follow different conventions from\nStata's {help varname:constraints on variable names}.\nFurther, the field names in the .csv files are the fields' \"long names,\"\nwhich are formed by concatenating the list of the {it:groups}\nin which the field is nested with the field's \"short name.\"\nODK long names are often much longer than the length limit on variable names,\nwhich is 32 characters.\n\n{pstd}\nThese differences in convention lead to three kinds of\nproblematic field names:\n\n{* Using -help 663- as a template.}{...}\n{phang2}1.  Long field names that involve an invalid combination of characters,\nfor example, a name that begins with a colon followed by a number.\n{helpb insheet} will not convert these to Stata names,\ninstead naming each variable {cmd:v} concatenated with a positive integer,\nfor example, {cmd:v1}.{p_end}\n{phang2}2.  Long field names that are unique ODK names but\nwhen converted to Stata names and truncated to 32 characters become duplicates.\n{cmd:insheet} will again convert these to {cmd:v}{it:#} names.{p_end}\n{phang2}3.  Long field names of the form {cmd:v}{it:#} that\nbecome duplicates with other variables that cannot be converted,\nfor which {cmd:insheet} chooses {cmd:v}{it:#} names.\nThese will be converted to different {cmd:v}{it:#} names.{p_end}\n\n{pstd}\nBecause of problem 3,\nit is recommended that you do not name fields as {cmd:v}{it:#}.\n\n{pstd}\nIf a field name cannot be imported,\nits characteristic {helpb odkmeta##Odk_bad_name:Odk_bad_name} is {cmd:1};\notherwise it is {cmd:0}.\n\n{pstd}\nMost tasks that the {cmd:odkmeta} do-file completes do not depend on\nvariable names. There are two exceptions:\n\n{phang2}1.  The do-file uses {helpb split} to split\n{cmd:select_multiple} variables. {cmd:split} will result in an error\nif a {cmd:select_multiple} variable has a long name or\nif splitting it would result in duplicate variable names.{p_end}\n{phang2}2.  The do-file uses {helpb reshape} and {helpb merge} to merge\nrepeat groups. {cmd:reshape} will result in an error\nif there are long variable names. The merging code will result in an error\nif there are duplicate variable names in two datasets.{p_end}\n\n{pstd}\nWhere variable names result in an error, renaming is left to the user.\nThe section of the do-file for splitting is preceded by\na designated area for renaming.\nIn the section for reshaping and merging, each repeat group has\nits own area for renaming.\n\n{pstd}\nMany forms do not require any variable renaming.\nFor others, only a few variables need to be renamed;\nsuch renaming should go in the designated areas.\nHowever, some forms,\nusually because of many nested groups or groups with long names,\nhave many long field names that become duplicate Stata names (problem 2 above).\nIn this case, it may work best to use fields' short names where possible.\nThe following code attempts to rename variables to their field short names.\nPlace it as-is before the renaming for {cmd:split}:\n\n{cmd}{...}\n{phang}foreach var of varlist _all {{p_end}\n{phang2}if \"`:char `var'[Odk_group]'\" != \"\" {{p_end}\n{phang3}local name = \"`:char `var'[Odk_name]'\" + ///{p_end}\n{p 16 20 2}cond(`:char `var'[Odk_is_other]', \"_other\", \"\") + ///{p_end}\n{p 16 20 2}\"`:char `var'[Odk_geopoint]'\"{p_end}\n{phang3}local newvar = strtoname(\"`name'\"){p_end}\n{phang3}capture rename `var' `newvar'{p_end}\n{phang2}}{p_end}\n{phang}}{p_end}\n{txt}{...}\n\n\n{marker remarks_lists}{...}\n{title:Remarks for lists}\n\n{pstd}\nODK list names are not necessarily valid Stata names.\nHowever, {cmd:odkmeta} uses list names as value label names, and\nit requires that all ODK list names be Stata names.\n\n{pstd}\nODK lists are lists of associations of names and labels.\nThere are two broad categories of lists:\nthose whose names are all integer and those with at least one noninteger name.\nIn the former case, the values of the value label are\nthe same as the names of the list.\nIn the latter, the values of the value label indicate\nthe order of the names within the list:\nthe first name will equal {cmd:1}, the second {cmd:2}, and so on.\nFor such lists, the value of the value label may differ\nfrom the name of the list even if the name is a valid value label value;\nwhat matters is whether all names of the list are integer.\n\n{pstd}\nHowever, the value labels of these lists are easy to modify.\nSimply change the values of the value labels in the do-file;\nthe rest of the do-file will be unaffected.\nDo not change the value label text.\n\n{pstd}\nCertain names do not interact well with {helpb insheet},\nwhich the {cmd:odkmeta} do-file uses to import the data.\n\n{pstd}\nFor instance, it is not always possible to distinguish a name of {cmd:\".\"} from\n{helpb missing:sysmiss}. When it is unclear, the do-file assumes that\nvalues equal the name {cmd:\".\"} and not {cmd:sysmiss}.\nThe problem arises when {cmd:insheet} imports {cmd:select} fields whose\nnames in the data are the same as the values of a Stata numeric variable:\nreal numbers, {cmd:sysmiss}, and {help missing:extended missing values}.\n{cmd:insheet} imports such fields as numeric,\nconverting blank values ({cmd:\"\"}) as {cmd:sysmiss},\nthereby using the same Stata value for the name {cmd:\".\"} and for blank values.\n\n{pstd}\n{cmd:insheet} does not always interact well with list values' names that\nlook like numbers with leading zeros, for example, {cmd:01} or {cmd:0.5}.\nIf {cmd:insheet} imports a {cmd:select} field as numeric,\nit will remove such leading zeros, leading to incorrect values or\nan error in the do-file. For similar reasons,\ntrailing zeros after a decimal point may be problematic.\n\n{pstd}\nList values' names that look like decimals may also not interact well with\n{cmd:insheet}. If {cmd:insheet} imports a {cmd:select} field as numeric,\nthe do-file will convert it to string. However, for {help precision} reasons,\nthe resulting string may differ from the original name\nif the decimal has no exact finite-digit representation in binary.\n\n{pstd}\nGenerally, names that look like numbers that cannot be stored precisely as\n{helpb data_types:double} are problematic.\nThis includes numbers large in magnitude.\n\n\n{marker remarks_variants}{...}\n{title:Remarks for ODK variants}\n\n{pstd}\n{cmd:odkmeta} is not designed for features specific to ODK variants,\nsuch as SurveyCTO or formhub.\nHowever, it is often possible to modify the {cmd:odkmeta} do-file to account\nfor these features,\nespecially as all field attributes are imported as characteristics.\n\n{pstd}\n{ul:SurveyCTO}\n\n{pstd}\nFor instance, the {cmd:odkmeta} do-file will result in an error for\nSurveyCTO forms that contain dynamic choice lists.\nOne solution is to make the following changes to the do-file in order\nto import {cmd:select} fields with dynamic lists as string variables.\n\n{pstd}\nOne section of the {cmd:odkmeta} do-file encodes\n{cmd:select} fields whose list contains a noninteger name.\nHere, remove dynamic lists from the list of such lists:\n\n{phang}{cmd:* Encode fields whose list contains a noninteger name.}{p_end}\n{phang}{cmd:local lists list1 list2 list3 ...}{p_end}\n{phang}...{p_end}\n\n{pstd}\nAbove, if {cmd:list3} were a dynamic list, it should be removed.\n\n{pstd}\nThe next section of the do-file attaches value labels to variables:\n\n{cmd}{...}\n{phang}* Attach value labels.{p_end}\n{phang}ds, not(vallab){p_end}\n{phang}if \"`r(varlist)'\" != \"\" ///{p_end}\n{phang2}ds `r(varlist)', has(char Odk_list_name){p_end}\n{phang}foreach var in `r(varlist)' {{p_end}\n{phang2}if !`:char `var'[Odk_is_other]' {{p_end}\n{phang}...{p_end}\n{txt}{...}\n\n{pstd}\nAdd a line to the second {helpb ifcmd:if} command to exclude fields whose\n{it:appearance} attribute contains a {cmd:search()} expression:\n\n{cmd}{...}\n{phang}* Attach value labels.{p_end}\n{phang}ds, not(vallab){p_end}\n{phang}if \"`r(varlist)'\" != \"\" ///{p_end}\n{phang2}ds `r(varlist)', has(char Odk_list_name){p_end}\n{phang}foreach var in `r(varlist)' {{p_end}\n{phang2}if !`:char `var'[Odk_is_other]' & ///{p_end}\n{phang3}!strmatch(\"`:char `var'[Odk_appearance]'\", \"*search(*)*\") {{p_end}\n{phang}...{p_end}\n{txt}{...}\n\n{pstd}\nThe do-file will now import fields with dynamic lists without\nresulting in an error.\n\n{pstd}\n{ul:formhub}\n\n{pstd}\nformhub does not export {cmd:note} fields in the .csv files;\nspecify option {cmd:relax} to {cmd:odkmeta}.\n\n{pstd}\nformhub exports blank values as {cmd:\"n/a\"}.\nMultiple sections of the {cmd:odkmeta} do-file must be modified\nto accommodate these.\n\n{pstd}\nImmediately before this line in the section for\nformatting {cmd:date}, {cmd:time}, and {cmd:datetime} variables:\n\n{phang}\n{cmd:if inlist(\"`type'\", \"date\", \"today\") {c -(}}\n\n{pstd}\nadd the following line:\n\n{phang}\n{cmd:replace `var' = \"\" if `var' == \"n/a\"}\n\n{pstd}\nImmediately before this line in the section for attaching value labels:\n\n{phang}\n{cmd:replace `var' = \".o\" if `var' == \"other\"}\n\n{pstd}\nadd the following line:\n\n{phang}\n{cmd:replace `var' = \"\" if `var' == \"n/a\"}\n\n{pstd}\nThese lines replace {cmd:\"n/a\"} values with blank ({cmd:\"\"}).\n\n\n{marker remarks_missing}{...}\n{title:Remarks for \"don't know,\" refusal, and other missing values}\n\n{pstd}\nODK lists may contain missing values, including \"don't know\" and refusal values.\nThese will be imported as nonmissing in Stata.\nHowever, if the lists use largely consistent names or labels for the values,\nit may be possible to automate the conversion of the values to\n{help missing:extended missing values} in Stata.\nThe following {help SSC} programs may be helpful:\n\n{p2colset 5 18 22 2}{...}\n{p2col:{cmd:labmvs}}{bf:{stata ssc install labutil2}}{p_end}\n{p2col:{cmd:labmv}}{bf:{stata ssc install labutil2}}{p_end}\n{p2col:{cmd:labrecode}}{bf:{stata ssc install labutil2}}{p_end}\n{p2col:{cmd:labelmiss}}{bf:{stata ssc install labelmiss}}{p_end}\n{p2colreset}{...}\n\n\n{marker options}{...}\n{title:Options}\n\n{dlgtab:Main}\n\n{phang}\n{cmd:survey(}{it:surveyfile}{cmd:,} {it:surveyopts}{cmd:)} imports\nthe field metadata from the XLSForm's {it:survey} worksheet.\n{opt survey()} requires {it:surveyfile} to be a comma-separated text file.\nStrings with embedded commas, double quotes, or end-of-line characters must\nbe enclosed in quotes, and\nembedded double quotes must be preceded by another double quote.\n\n{pmore}\nEach attribute in the {it:survey} worksheet has\nits own column and column header.\nUse the suboptions {opt type()}, {opt name()}, {opt label()}, and\n{opt disabled()} to specify alternative column headers for\nthe {it:type}, {it:name}, {it:label}, and\n{it:disabled} attributes, respectively.\nAll field attributes are imported as {help char:characteristics}.\n\n{pmore}\nIf the {it:survey} worksheet has duplicate column headers,\nonly the first column for each column header is used.\n\n{pmore}\nThe {it:type} characteristic is standardized as follows:\n\n{phang2}o  {cmd:select one} is replaced as {cmd:select_one}.{p_end}\n{phang2}o  {cmd:select or other} is replaced as {cmd:select or_other}:\n{cmd:select_one} {it:list_name} {cmd:or other} is replaced as\n{cmd:select_one} {it:list_name} {cmd:or_other}, and\n{cmd:select_multiple} {it:list_name} {cmd:or other} is replaced as\n{cmd:select_multiple} {it:list_name} {cmd:or_other}.{p_end}\n{phang2}o  {cmd:begin_group} is replaced as {cmd:begin group};\n{cmd:end_group} is replaced as {cmd:end group};\n{cmd:begin_repeat} is replaced as {cmd:begin repeat};\nand {cmd:end_repeat} is replaced as {cmd:end repeat}.{p_end}\n\n{pmore}\nIn addition to the attributes specified in the {it:survey} worksheet,\n{cmd:odkmeta} attaches these characteristics to variables:\n\n{pmore2}\n{marker Odk_bad_name}{...}\n{cmd:Odk_bad_name} is {cmd:1}\nif the variable's name differs from its ODK field name and {cmd:0} if not.\nSee the {help odkmeta##remarks_field_names:remarks for field names} above.\n\n{pmore2}\n{cmd:Odk_group} contains a list of the {it:groups}\nin which the variable is nested, in order of the {it:group} level.\n\n{pmore2}\n{cmd:Odk_long_name} contains the field's \"long name,\"\nwhich is formed by concatenating\nthe list of the {it:groups} in which the field is nested\nwith the field \"short name,\" with elements separated by {cmd:\"-\"}.\n\n{pmore2}\n{cmd:Odk_repeat} contains the (long) name of the repeat group\nin which the variable is nested.\n\n{pmore2}\n{cmd:Odk_list_name} contains the name of a {cmd:select} field's list.\n\n{pmore2}\n{cmd:Odk_or_other} is {cmd:1}\nif the variable is a {cmd:select or_other} field and {cmd:0} if not.\n\n{pmore2}\n{cmd:Odk_is_other} is {cmd:1}\nif the variable is a free-text {cmd:other} variable associated with\na {cmd:select or_other} field; otherwise it is {cmd:0}.\n\n{pmore2}\nFor {cmd:geopoint} variables, {cmd:Odk_geopoint} is\nthe variable's {cmd:geopoint} component:\n{cmd:Latitude}, {cmd:Longitude}, {cmd:Altitude}, or {cmd:Accuracy}.\nFor variables that are not type {cmd:geopoint}, {cmd:Odk_geopoint} is blank.\n\n{phang}\n{cmd:choices(}{it:choicesfile}{cmd:,} {it:choicesopts}{cmd:)} imports\nthe list metadata from the XLSForm's {it:choices} worksheet.\n{cmd:choices()} requires {it:choicesfile} to be a comma-separated text file.\nStrings with embedded commas, double quotes, or end-of-line characters must\nbe enclosed in quotes, and\nembedded double quotes must be preceded by another double quote.\n\n{pmore}\nEach attribute in the {it:choices} worksheet has\nits own column and column header.\nUse the suboptions {opt listname()}, {opt name()}, and {opt label()} to specify\nalternative column headers for the {it:list_name}, {it:name}, and\n{it:label} attributes, respectively.\nList attributes are imported as value labels.\n\n{pmore}\nIf the {it:choices} worksheet has duplicate column headers,\nonly the first column for each column header is used.\n\n{dlgtab:Fields}\n\n{phang}\n{opt dropattrib(headers)} specifies the column headers of field attributes that\nshould not be imported as characteristics.\n{cmd:_all} specifies that all characteristics be dropped.\n\n{phang}\n{opt keepattrib(headers)} specifies the column headers of\nfield attributes to import as characteristics.\n{cmd:_all} means all column headers. Other attributes are not imported.\n\n{phang}\n{opt relax} specifies that fields mentioned in {it:surveyfile} that\ndo not exist in {it:csvfile} be ignored.\nBy default, the do-file attempts to attach the characteristics to\nthese variables, resulting in an error if the variable does not exist.\nFor fields associated with multiple variables, for example,\n{cmd:geopoint} fields, {opt relax} attempts to attach\nthe characteristics to as many variables as possible:\nan error does not result if some but not all variables exist.\n\n{dlgtab:Lists}\n\n{phang}\n{opt other(other)} specifies the Stata value of {cmd:other} values of\n{cmd:select or_other} fields.\n\n{pmore}\n{cmd:max}, the default, specifies that the Stata value of {cmd:other} vary by\nthe field's list.\nFor each list, {cmd:other} will be the maximum value of the list plus one.\n\n{pmore}\n{cmd:min} specifies that the Stata value of {cmd:other} vary by\nthe field's list.\nFor each list, {cmd:other} will be the minimum value of the list minus one.\n\n{pmore}\n{it:#} specifies a constant value for {cmd:other} that\nwill be used for all lists.\n\n{phang}\n{opt oneline} specifies that each list's value label definition be written on\none line, rather than on multiple using {helpb delimit:#delimit ;}.\n\n{dlgtab:Other}\n\n{phang}\n{opt replace} specifies that the {cmd:odkmeta} do-file be replaced\nif it already exists.\n\n\n{marker examples}{...}\n{title:Examples}\n\n{pstd}\nCreate a do-file named {cmd:import.do} that imports ODK data,\nincluding the metadata in {cmd:survey.csv} and {cmd:choices.csv}\n{p_end}\n{phang2}{cmd}\n. odkmeta using import.do,\ncsv(\"ODKexample.csv\") survey(\"survey.csv\") choices(\"choices.csv\")\n{txt}\n\n{pstd}\nSame as the previous {cmd:odkmeta} command,\nbut specifies that the field {it:name} attribute appears in\nthe {cmd:fieldname} column of {cmd:survey_fieldname.csv}\n{p_end}\n{phang2}{cmd}\n. odkmeta using import.do,\ncsv(\"ODKexample.csv\") survey(\"survey_fieldname.csv\", name(fieldname))\nchoices(\"choices.csv\") replace\n{txt}\n\n{pstd}\nSame as the previous {cmd:odkmeta} command,\nbut specifies that the list {it:name} attribute appears in\nthe {cmd:valuename} column of {cmd:choices_valuename.csv}\n{p_end}\n{phang2}{cmd}\n. odkmeta using import.do,\ncsv(\"ODKexample.csv\") survey(\"survey_fieldname.csv\", name(fieldname))\nchoices(\"choices_valuename.csv\", name(valuename)) replace\n{txt}\n\n{pstd}\nCreate a do-file that imports all field attributes except for {it:hint}\n{p_end}\n{phang2}{cmd}\n. odkmeta using import.do,\ncsv(\"ODKexample.csv\") survey(\"survey.csv\") choices(\"choices.csv\")\ndropattrib(hint) replace\n{txt}\n\n{pstd}\nSame as the previous {cmd:odkmeta} command,\nbut does not import any field attributes\n{p_end}\n{phang2}{cmd}\n. odkmeta using import.do,\ncsv(\"ODKexample.csv\") survey(\"survey.csv\") choices(\"choices.csv\")\ndropattrib(_all) replace\n{txt}\n\n{pstd}\nCreate a do-file that\nimports {cmd:other} values of {cmd:select or_other} fields as {cmd:99}\n{p_end}\n{phang2}{cmd}\n. odkmeta using import.do,\ncsv(\"ODKexample.csv\") survey(\"survey.csv\") choices(\"choices.csv\")\nother(99) replace\n{txt}\n\n\n{marker acknowledgements}{...}\n{title:Acknowledgements}\n\n{pstd}\nLindsey Shaughnessy of Innovations for Poverty Action assisted in\nalmost all aspects of {cmd:odkmeta}'s development.\nShe collaborated on the structure of the program, was a very helpful tester, and\ncontributed information about ODK.\n\n\n{marker author}{...}\n{title:Author}\n\n{pstd}Matthew White, Innovations for Poverty Action{p_end}\n{pstd}mwhite@poverty-action.org{p_end}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stata/regress_example.do",
    "content": "* Setup\nsysuse auto\n\n* Fit a linear regression\nregress mpg weight foreign\n\n* Fit a better linear regression, from a physics standpoint\ngen gp100m = 100/mpg\nregress gp100m weight foreign\n\n* Obtain beta coefficients without refitting model\nregress, beta\n\n* Suppress intercept term\nregress weight length, noconstant\n\n* Model already has constant\nregress weight length bn.foreign, hascons\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stata/tanh.mata",
    "content": "numeric matrix tanh(numeric matrix u)\n{\n\t\tnumeric matrix  eu, emu\n\n\t\teu = exp(u)\n\t\temu = exp(-u)\n\t\treturn( (eu-emu):/(eu+emu) )\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Stylus/demo.styl",
    "content": "border-radius()\n  -webkit-border-radius arguments\n  -moz-border-radius arguments\n  border-radius arguments\n\na.button\n  border-radius 5px\n\nfonts = helvetica, arial, sans-serif\n\nbody {\n  padding: 50px;\n  font: 14px/1.4 fonts;\n}\n\nform\n  input[type=text]\n    padding: 5px\n    border: 1px solid #eee\n    color: #ddd\n\ntextarea\n  @extends form input[type=text]\n  padding: 10px\n\n$foo\n  color: #FFF\n\n.bar\n  background: #000\n  @extends $foo\n"
  },
  {
    "path": "src/test/resources/samples/langs/SubRip Text/Adding.NCL.Language.S01E01.1080p.BluRay.x264.srt",
    "content": "1\n00:00:01,250 --> 00:00:03,740\nAdding NCL language.\n\n2\n00:00:04,600 --> 00:00:08,730\nThanks for the pull request! Do you know if these files are NCL too?\n\n3\n00:00:09,800 --> 00:00:13,700\nThose are poorly-named documentation files for NCL functions.\n\n4\n00:00:14,560 --> 00:00:17,200\n- What's better?\n- This is better.\n\n5\n00:00:18,500 --> 00:00:23,000\n- Would it be correct to recognise these files as text?\n- Yes.\n\n6\n00:00:23,890 --> 00:00:30,000\nIn that case, could you add \"NCL\" to the text entry in languages.yml too?\n\n7\n00:00:30,540 --> 00:00:35,250\nI added the example to \"Text\" and updated the license in the grammar submodule.\n\n8\n00:00:38,500 --> 00:00:42,360\nCloning the submodule fails for me in local with this URL.\n\n9\n00:00:42,360 --> 00:00:45,250\nCould you use Git or HTTPS...?\n\n10\n00:00:46,810 --> 00:00:50,000\nI updated the grammar submodule link to HTTPS.\n\n11\n00:00:51,100 --> 00:00:57,000\nIt's still failing locally. I don't think you can just update the .gitmodules file.\n\n12\n00:00:57,750 --> 00:01:03,000\nYou'll probably have to remove the submodule and add it again to be sure.\n\n13\n00:01:04,336 --> 00:01:11,800\n- I'll see first if it's not an issue on my side...\n- I removed the submodule and added it back with HTTPS.\n\n14\n00:01:13,670 --> 00:01:18,000\nI tested the detection of NCL files with 2000 samples.\n\n15\n00:01:18,000 --> 00:01:25,000\nThe Bayesian classifier doesn't seem to be very good at distinguishing text from NCL.\n\n16\n00:01:25,000 --> 00:01:30,740\nWe could try to improve it by adding more samples, or we can define a new heuristic rule.\n\n17\n00:01:31,300 --> 00:01:36,200\n- Do you want me to send you the sample files?\n- Yes, please do.\n\n18\n00:01:37,500 --> 00:01:39,500\nIn your inbox.\n\n19\n00:01:41,285 --> 00:01:48,216\n- So if I manually go through these and sort out the errors, would that help?\n- Not really.\n\n20\n00:01:48,540 --> 00:01:55,145\nIt's a matter of keywords so there's not much to do there except for adding new samples.\n\n21\n00:01:55,447 --> 00:02:02,000\nIf adding a few more samples doesn't improve things, we'll see how to define a new heuristic rule.\n\n22\n00:02:04,740 --> 00:02:09,600\n- I added quite a few NCL samples.\n- That's a bit over the top, isn't it?\n\n23\n00:02:10,250 --> 00:02:16,000\nWe currently can't add too many samples because of #2117.\n\n24\n00:02:18,000 --> 00:02:20,830\n(sigh) I decreased the number of added samples.\n\n25\n00:02:21,630 --> 00:02:25,300\nCould you test the detection results in local with the samples I gave you?\n\n26\n00:02:26,000 --> 00:02:28,670\n- What is the command to run that test?\n- Here...\n\n27\n00:02:28,716 --> 00:02:38,650\n[Coding intensifies]\n\n28\n00:02:38,650 --> 00:02:43,330\nIt is getting hung up on a false detection of Frege in one of the Text samples.\n\n29\n00:02:43,540 --> 00:02:46,115\nDo you have any suggestions for implementing a heuristic?\n\n30\n00:02:47,640 --> 00:02:55,200\n#2441 should fix this. In the meantime, you can change this in \"test_heuristics.rb\"\n\n31\n00:02:55,165 --> 00:02:57,240\nWhy did you have to change this?\n\n32\n00:02:57,777 --> 00:03:04,480\n- It doesn't work for me unless I do that.\n- Hum, same for me. Arfon, does it work for you?\n\n33\n00:03:04,920 --> 00:03:08,830\nRequiring linguist/language doesn't work for me either.\n\n34\n00:03:09,300 --> 00:03:13,885\nWe restructured some of the requires a while ago and I think this is just out-of-date code.\n\n35\n00:03:14,065 --> 00:03:20,950\nFrom a large sample of known NCL files taken from Github, it's now predicting with about 98% accuracy.\n\n36\n00:03:21,183 --> 00:03:28,000\nFor a large sample of other files with the NCL extension, it is around 92%.\n\n37\n00:03:27,880 --> 00:03:30,950\nFrom those, nearly all of the errors come from one GitHub repository,\n\n38\n00:03:30,950 --> 00:03:34,160\nand they all contain the text strings, \"The URL\" and \"The Title\".\n\n39\n00:03:35,660 --> 00:03:43,260\n- Do you mean 92% files correctly identified as text?\n- Yes, it correctly identifies 92% as text.\n\n40\n00:03:44,000 --> 00:03:46,150\nI'd really like to see this dramatically reduced.\n\n41\n00:03:46,150 --> 00:03:51,150\nWhat happens if we reduce to around 5 NCL sample files?\n\n42\n00:03:51,150 --> 00:03:52,600\nDoes Linguist still do a reasonable job?\n\n43\n00:03:53,470 --> 00:03:58,190\nI reduced it to 16 NCL samples and 8 text samples.\n\n44\n00:03:58,190 --> 00:04:01,720\nIt correctly classifies my whole set of known NCL files.\n\n45\n00:04:01,870 --> 00:04:05,730\nI tried with 5 samples but could not get the same level of accuracy.\n\n46\n00:04:06,670 --> 00:04:10,400\nIt incorrectly classifies all of the NCL files in this GitHub repository.\n\n47\n00:04:11,130 --> 00:04:14,660\nAll of these files contain the text strings, \"THE_URL:\" and \"THE_TITLE:\".\n\n48\n00:04:14,660 --> 00:04:19,500\nIt did not misclassify any other text-files with the extension NCL.\n\n49\n00:04:19,970 --> 00:04:25,188\nWith 100% accuracy? Does that mean it that the results are better with less samples??\n\n50\n00:04:25,610 --> 00:04:31,190\nI also removed a sample text-file which should have been classified as an NCL file.\n\n51\n00:04:31,000 --> 00:04:35,895\nI think that probably made most of the difference, although I didn't test it atomically.\n\n52\n00:04:35,895 --> 00:04:38,370\nOkay, that makes more sense.\n\n53\n00:04:39,515 --> 00:04:43,450\nI don't get the same results for the text files. Full results here.\n\n54\n00:04:44,650 --> 00:04:50,000\nThey all look correctly classified to me, except for the ones in Fanghuan's repository.\n\n55\n00:04:50,000 --> 00:04:55,920\nI manually went through all of the ones where I didn't already know based on the filename or the repository owner.\n\n56\n00:04:56,526 --> 00:05:00,000\n[Presses button] It now correctly classifies all of my test files.\n\n57\n00:05:00,000 --> 00:05:05,970\nR. Pavlick, thanks for this. These changes will be live in the next release of Linguist. In the next couple of weeks.\n\n58\n00:05:05,970 --> 00:05:07,450\nGreat! Thanks.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/AMPL.sublime-build",
    "content": "{\n\t\"cmd\": [\"ampl\", \"${file_path}/${file_base_name}.run\"],\n\t\"file_regex\": \"^(?:[(]file )*[ ]*(...*?), line ([0-9]*)\",\n\t\"selector\": \"source.ampl\",\n\n\t\"osx\":\n\t{\n\t\t\"env\":\n\t\t{\n\t\t\t// \"ILOG_LICENSE_FILE\": \"path/to/access.ilm\"\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/CLIPS.sublime-settings",
    "content": "{\n\t\"extensions\":\n\t[\n\t\t\"clp\"\n\t],\n\t\"tab_size\": 8,\n\t\"translate_tabs_to_spaces\": false\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/Context.sublime-menu",
    "content": "[\n{\n\t\"id\" : \"nasm\",\n\t\"caption\": \"NASM Assembly\",\n\t\"children\":\n\t[\n\t{\n\t\t\"caption\" : \"Documentation\",\n\t\t\"command\" : \"assembly_doc\"\n\t}\n\t]\n}\n]"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/Dart.sublime-commands",
    "content": "[\n\t{ \"caption\": \"Dart: Polymer: Generate Element\", \"command\": \"dart_generate_polymer_element\" },\n\t{ \"caption\": \"Dart: Polymer: Add Entry Point\", \"command\": \"dart_add_polymer_entry_point\" },\n\n\t{ \"caption\": \"Dart: Check Configuration\", \"command\": \"dart_check_config\" },\n\t{ \"caption\": \"Dart: Browse API Reference\", \"command\": \"dart_open_browser\", \"args\": {\"url\": \"https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/home\" } },\n\t{ \"caption\": \"Dart: Set Default User Browser\", \"command\": \"dart_show_user_browsers\" },\n\n\t{ \"caption\": \"Preferences: Dart Settings - Default\", \"command\": \"dart_open_settings\", \"args\": {\"kind\": \"default\"} },\n\t{ \"caption\": \"Preferences: Dart Settings - User\", \"command\": \"dart_open_settings\", \"args\": {\"kind\": \"user\"} },\n\t{ \"caption\": \"Preferences: Dart Settings - File Type (User)\", \"command\": \"dart_open_settings\", \"args\": {\"kind\": \"user\", \"scope\": \"file_type\"} },\n\n\t{ \"caption\": \"Dart: Run\", \"command\": \"dart_smart_run\" },\n\t{ \"caption\": \"Dart: Run (This File)\", \"command\": \"dart_smart_run\", \"args\": {\"force_update\": true} },\n\t{ \"caption\": \"Dart: Stop\", \"command\": \"dart_smart_run\", \"args\": {\"kill_only\": true} },\n\n\t{ \"caption\": \"Dart: Run In Observatory (This File)\", \"command\": \"dart_run_in_observatory\" },\n\n\t{ \"caption\": \"Dart: Show Output Panel\", \"command\": \"show_panel\", \"args\": {\"panel\": \"output.dart.out\"} },\n\t{ \"caption\": \"Dart: Show Errors Panel\", \"command\": \"show_panel\", \"args\": {\"panel\": \"output.dart.errors\"} },\n\n\t{ \"caption\": \"Dart: Format\", \"command\": \"dart_format\" },\n\n\t{ \"caption\": \"Dart: Generate Documentation\", \"command\": \"dart_generate_docs\" },\n\t{ \"caption\": \"Dart: Serve Documentation\", \"command\": \"dart_serve_docs\" },\n\n\t{ \"caption\": \"Dart: Stagehand\", \"command\": \"dart_stagehand_wizard\" },\n\n\t{ \"caption\": \"Dart: Pub Get\", \"command\": \"dart_pub_get\" }\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/Dart.sublime-project",
    "content": "{\n\t\"folders\":\n\t[\n\t\t{\n\t\t\t\"follow_symlinks\": true,\n\t\t\t\"path\": \".\"\n\t\t}\n\t],\n\n\t\"SublimeLinter\":\n\t{\n\t\t\"@python\": 3.4\n\t},\n\n\t\"build_systems\":\n\t[\n\t\t{\n\t\t\t\"name\": \"Run\",\n\t\t\t\"shell_cmd\": \"\\\"$project_path/scripts/build.sh\\\"\",\n\t\t\t\"windows\":\n\t\t\t{\n\t\t\t\t\"shell_cmd\": \"powershell -noninteractive -file \\\"$project_path\\\\build.ps1\\\"\"\n\t\t\t},\n\t\t\t\"working_dir\": \"${project_path}\",\n\n\t\t\t\"variants\": [\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"Dart: Test (All)\",\n\t\t\t\t\t\"target\": \"run_dart_tests\",\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"Dart: Test (This File Only)\",\n\t\t\t\t\t\"target\": \"run_dart_tests\",\n\t\t\t\t\t\"active_file_only\": true\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/Default (Linux).sublime-mousemap",
    "content": "[\n\t{\n\t\t\"button\": \"button1\", \"count\": 1, \"modifiers\": [\"alt\"],\n\t\t\"press_command\": \"drag_select\",\n\t\t\"command\": \"robot_go_to_keyword\"\n\t}\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/Default.sublime-keymap",
    "content": "[\n\t// Disable auto-pair for single quote\n\t{ \"keys\": [\"'\"], \"command\": \"insert_snippet\", \"args\": {\"contents\": \"'\"}, \"context\":\n\t\t[{ \"key\": \"selector\", \"operator\": \"equal\", \"operand\": \"source.rust\" }]\n\t}\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/JavaDoc Add Line.sublime-macro",
    "content": "[\n\t{\"command\": \"move_to\", \"args\": {\"to\": \"hardeol\"}},\n\t{\"command\": \"insert\", \"args\": {\"characters\": \"\\n\"}},\n\t{\"command\": \"insert\", \"args\": {\"characters\": \"*\"}},\n\t{\"command\": \"insert\", \"args\": {\"characters\": \" \"}}\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/RunBuild.sublime-macro",
    "content": "[\n\t{\n\t\t\"command\": \"haxe_run_build\"\n\t}\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/SourcePawn.sublime-build",
    "content": "{\n\t// For default sourcemod scripting directory :\n\t\"cmd\": [\"<spcomp_path>\", \"-o$file_path/../plugins/$file_name\", \"$file\"],\n\n\t// For custom sourcemod  scripting directory :\n\t\"cmd\": [\"<spcomp_path>\", \"-i<include_path>\", \"-o$file_path/$file_base_name.smx\", \"$file\"],\n\n\t// Windows example:\n\t\"cmd\": [\"X:/somefolder/spcomp\", \"-iX:/somefolder\", \"-o$file_path/$file_base_name.smx\", \"$file\"],\n\t\"cmd\": [\"X:/game/csgo/addons/sourcemod/scripting/spcomp\", \"-o$file_path/../plugins/$file_name\", \"$file\"],\n\n\t// Linux or OSX example:\n\t\"cmd\": [\"/home/User/sm/spcomp\", \"-i/home/User/sm/include\", \"-o$file_path/$file_base_name.smx\", \"$file\"],\n\t\"cmd\": [\"/home/User/game/csgo/addons/sourcemod/scripting/spcomp\", \"-o$file_path/../plugins/$file_name\", \"$file\"],\n\n\n\t\"file_regex\": \"(.*)\\\\((\\\\d+)\\\\) :\",\n\t\"selector\": \"source.sp\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/Tubnil.sublime-theme",
    "content": "[\n\t//\tTubnil theme for Sublime Text 2\n\t//\thttps://github.com/nilium/st2-nil-theme\n\t//\n\t//\tTABS\n\t//\t==========================================================\n\t//\t- Tabset\n\t//\t------------------------------------------------------\n\t{\n\t\t\"class\": \"tabset_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/tabset-bg.png\",\n\t\t\"layer0.inner_margin\": [2, 6],\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [-13, 0, -13,-6], // left, top, right, bottom\n\t\t\"tab_overlap\": 25,\n\t\t\"tab_width\": 150,\n\t\t\"tab_min_width\": 50,\n\t\t\"tab_height\": 35,\n\t\t\"mouse_wheel_switch\": false\n\t},\n\t{\n\t\t\"class\": \"tabset_control\",\n\t\t\"settings\": [\"mouse_wheel_switches_tabs\"],\n\t\t\"mouse_wheel_switch\": true\n\t},\n\n\t//\t- Tab element\n\t//\t------------------------------------------------------\n\t{\n\t\t\"class\": \"tab_control\",\n\t\t\"content_margin\": [25, 0, 25, 0],\n\t\t\"max_margin_trim\": 0,\n\t\t\"hit_test_level\": 0.5,\n\n\t\t//\t- Inactive tab settings\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-inactive.png\",\n\t\t\"layer0.inner_margin\": [23, 8],\n\t\t\"layer0.opacity\": 1.0,\n\n\t\t//\t- Active tab setting\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-active.png\",\n\t\t\"layer1.inner_margin\": [23, 8],\n\t\t\"layer1.opacity\": 0.0,\n\n\t\t//\t- Hover tab setting\n\t\t\"layer2.texture\": \"SourcePawn/assets/tab-hover.png\",\n\t\t\"layer2.inner_margin\": [23, 8],\n\t\t\"layer2.opacity\": 0.0\n\t},\n\t{\n\t\t//\t- Tab close state\n\t\t\"class\": \"tab_control\",\n\t\t\"settings\": [\"show_tab_close_buttons\"],\n\t\t\"content_margin\": [20, 0, 20, 7]\n\t},\n\t{\n\t\t//\t- Hover tab state\n\t\t\"class\": \"tab_control\",\n\t\t\"attributes\": [\"hover\"],\n\t\t\"layer2.opacity\": 1.0\n\t},\n\t{\n\t\t//\t- Active tab state\n\t\t\"class\": \"tab_control\",\n\t\t\"attributes\": [\"selected\"],\n\t\t\"layer0.opacity\": 0.0,\n\t\t\"layer1.opacity\": 1.0,\n\t\t\"layer2.opacity\": 0.0\n\t},\n\t{\n\t\t//  - Modified tab state\n\t\t\"class\": \"tab_control\",\n\t\t//\"settings\": [\"highlight_modified_tabs\"],\n\t\t\"attributes\": [\"dirty\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-inactive-modified.png\",\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-active-modified.png\",\n\t\t\"layer2.texture\": \"SourcePawn/assets/tab-hover-dirty.png\"\n\t},\n\n\t//\t- Tab labels\n\t//\t------------------------------------------------------\n\n\t//\t- Inactive tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"fg\": [180, 180, 180],\n\t\t\"shadow_color\": [0, 0, 0, 200],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\n\t//\t- Active tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"selected\"]}],\n\t\t\"shadow_color\": [0, 0, 0, 165],\n\t\t\"shadow_offset\": [0, 1],\n\t\t\"fg\": [240, 240, 240, 255]\n\t},\n\n\t//\t- Hover tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"hover\"]}],\n\t\t\"shadow_color\": [0, 0, 0, 165],\n\t\t\"shadow_offset\": [0, 1],\n\t\t\"fg\": [2, 196, 251, 255]\n\t},\n\n\t//\t- Dirty Hover tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"hover\", \"dirty\"]}],\n\t\t\"shadow_color\": [0, 0, 0, 165],\n\t\t\"shadow_offset\": [0, 1],\n\t\t\"fg\": [253, 113, 1, 255]\n\t},\n\n\t// - Dirty inactive tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"dirty\"]}],\n\t\t\"settings\": [\"highlight_modified_tabs\"]\n\t},\n\n\t// - Dirty active tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"selected\", \"dirty\"]}],\n\t\t\"settings\": [\"highlight_modified_tabs\"]\n\t},\n\n\t//\t- Tab buttons\n\t//\t------------------------------------------------------\n\n\t//\t- Tab button\n\t{\n\t\t\"class\": \"tab_close_button\",\n\t\t\"content_margin\": [0, 0],\n\n\t\t//\t- Tab close default settings\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close.png\",\n\t\t\"layer1.opacity\": 0.0, // hide by default\n\t\t\"layer1.inner_margin\": 0.0,\n\n\t\t//\t- Tab close hover settings\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-button-close-hover.png\",\n\t\t\"layer0.opacity\": 0.0\n\t},\n\t{\n\t\t//\t- Tab button size\n\t\t\"class\": \"tab_close_button\",\n\t\t\"settings\": [\"show_tab_close_buttons\"],\n\t\t\"content_margin\": [8, 8]\n\t},\n\t{\n\t\t\"class\": \"tab_close_button\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"dirty\"]}],\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close-dirty.png\"\n\t},\n\t{\n\t\t//\t- Tab close hover action\n\t\t\"class\": \"tab_close_button\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"hover\"]}],\n\t\t\"layer1.opacity\": 0.0,\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t{\n\t\t//\t- Tab close press action\n\t\t\"class\": \"tab_close_button\",\n\t\t\"attributes\": [\"hover\"],\n\t\t\"layer1.opacity\": 0.4,\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t{\n\t\t//\t- Tab close press action\n\t\t\"class\": \"tab_close_button\",\n\t\t\"attributes\": [\"pressed\"],\n\t\t\"layer1.opacity\": 1.0,\n\t\t\"layer0.opacity\": 0.0\n\t},\n\n//\tFOLD BUTTONS\n//\t==========================================================\n\n\t{\n\t\t\"class\": \"fold_button_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/arrow-right.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": 0,\n\t\t\"layer1.texture\": \"SourcePawn/assets/arrow-right-hover.png\",\n\t\t\"layer1.opacity\": 0.0,\n\t\t\"layer1.inner_margin\": 0,\n\t\t\"content_margin\": [9, 7, 8, 6]\n\t},\n\t{\n\t\t\"class\": \"fold_button_control\",\n\t\t\"attributes\": [\"hover\"],\n\t\t\"layer0.opacity\": 0.0,\n\t\t\"layer1.opacity\": 0.75\n\t},\n\t{\n\t\t\"class\": \"fold_button_control\",\n\t\t\"attributes\": [\"pressed\"],\n\t\t\"layer0.opacity\": 0.0,\n\t\t\"layer1.opacity\": 1.0\n\t},\n\t{\n\t\t\"class\": \"fold_button_control\",\n\t\t\"attributes\": [\"expanded\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/arrow-down.png\",\n\t\t\"layer1.texture\": \"SourcePawn/assets/arrow-down-hover.png\"\n\t},\n\n//\tSCROLLBARS (overlay scrollbars from Default theme)\n//\t==========================================================\n\t{\n\t\t\"class\": \"scroll_bar_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/scrollbar/well-vertical.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [1, 1],\n\t\t\"blur\": false\n\t},\n\t{\n\t\t\"class\": \"scroll_bar_control\",\n\t\t\"attributes\": [\"horizontal\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/scrollbar/well-horizontal.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [1, 1],\n\t\t\"blur\": false\n\t},\n\t{\n\t\t\"class\": \"scroll_corner_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/scrollbar/well-corner.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [1, 1]\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/scrollbar/bar-vertical.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [3, 3],\n\t\t\"content_margin\": [6, 6],\n\t\t\"blur\": false\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"attributes\": [\"horizontal\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/scrollbar/bar-horizontal.png\"\n\t},\n\t{\n\t\t\"class\": \"scroll_area_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"overlay\": true\n\t},\n\t{\n\t\t\"class\": \"scroll_area_control\",\n\t\t\"settings\": [\"!overlay_scroll_bars\"],\n\t\t\"overlay\": false\n\t},\n\t{\n\t\t\"class\": \"scroll_bar_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_bar_vertical.png\",\n\t\t\"layer0.inner_margin\": [0, 5],\n\t\t\"blur\": true\n\t},\n\t{\n\t\t\"class\": \"scroll_bar_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"attributes\": [\"horizontal\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_bar_horizontal.png\",\n\t\t\"layer0.inner_margin\": [5, 0],\n\t\t\"blur\": true\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_thumb_vertical.png\",\n\t\t\"layer0.inner_margin\": [0, 5],\n\t\t\"content_margin\": [5, 20],\n\t\t\"blur\": true\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"attributes\": [\"horizontal\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_thumb_horizontal.png\",\n\t\t\"layer0.inner_margin\": [5, 0],\n\t\t\"content_margin\": [20, 5],\n\t\t\"blur\": true\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"attributes\": [\"dark\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_dark_thumb_vertical.png\"\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"attributes\": [\"horizontal\", \"dark\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_dark_thumb_horizontal.png\"\n\t},\n\n//\tEMPTY WINDOW BACKGROUND\n//\t==========================================================\n\t{\n\t\t\"class\": \"sheet_container_control\",\n\t\t\"layer0.tint\": [16, 16, 16],\n\t\t\"layer0.opacity\": 1.0\n\t},\n\n//\tGRID LAYOUT\n//\t==========================================================\n\t{\n\t\t\"class\": \"grid_layout_control\",\n\t\t\"border_size\": 1,\n\t\t\"border_color\": [32, 32, 32]\n\t},\n\n//\tMINI MAP\n//\t==========================================================\n\t{\n\t\t\"class\": \"minimap_control\",\n\t\t\"viewport_color\": [185, 185, 185, 50]\n\t},\n\n//\tLABELS\n//\t==========================================================\n\t// \t- General labels\n\t{\n\t\t\"class\": \"label_control\",\n\t\t\"color\": [230, 230, 230]\n\t},\n\t//\t- Text field labels\n\t{\n\t\t\"class\": \"label_control\",\n\t\t\"parents\": [{\"class\": \"panel_control\"}],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\t//\t- Button labels\n\t{\n\t\t\"class\": \"label_control\",\n\t\t\"parents\": [{\"class\": \"button_control\"}],\n\t\t\"color\": [230, 230, 230],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\n//\tTOOLTIP\n//\t==========================================================\n\t//\t- Tooltip container\n\t{\n\t\t\"class\": \"tool_tip_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/tooltip.png\",\n\t\t\"layer0.inner_margin\": [4, 4],\n\t\t\"layer0.opacity\": 1,\n\t\t\"content_margin\": [6, 4]\n\t},\n\t//\t- Tooltip content\n\t{\n\t\t\"class\": \"tool_tip_label_control\",\n\t\t\"color\": [160, 160, 160],\n\t\t\"shadow_offset\": [0, 1],\n\t\t\"shadow_color\": [0, 0, 0, 255]\n\t},\n\n//\tSTATUS BAR\n//\t==========================================================\n\t//\t- Status bar container\n\t{\n\t\t\"class\": \"status_bar\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/status-bar-bg.png\",\n\t\t\"layer0.opacity\": 1,\n\t\t\"layer0.inner_margin\": [2, 2],\n\t\t\"content_margin\": [6, 5, 6, 5]\n\t},\n\t{\n\t\t\"class\": \"status_button\",\n\t\t\"min_size\": [100, 0]\n\t},\n\n\t//\t- Status bar label\n\t{\n\t\t\"class\": \"label_control\",\n\t\t\"parents\": [{\"class\": \"status_bar\"}],\n\t\t\"font.size\": 10,\n\t\t\"color\": [160, 160, 160],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\n//\tSIDEBAR\n//\t==========================================================\n\t//\t- Sidebar container (border)\n\t{\n\t\t\"class\": \"sidebar_container\",\n\t\t\"layer0.tint\": [150, 150, 150],\n\t\t\"layer0.opacity\": 0.5,\n\t\t\"layer0.draw_center\": false,\n\t\t\"layer0.inner_margin\": [0, 0, 1, 0],\n\t\t\"content_margin\": [0, 0, 1, 0]\n\t},\n\t//\t- Sidebar tree (bg)\n\t{\n\t\t\"class\": \"sidebar_tree\",\n\t\t\"row_padding\": [8, 3],\n\t\t\"indent\": 15,\n\t\t\"indent_offset\": 13,\n\t\t\"indent_top_level\": false,\n\t\t\"layer0.tint\": [19, 20, 21],\t// darker gray\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"dark_content\": true\n\t},\n\t//\t- Sidebar rows\n\t{\n\t\t\"class\": \"tree_row\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/row-active.png\",\n\t\t\"layer0.opacity\": 0.0,\n\t\t\"layer0.inner_margin\": [8, 3],\n\t\t\"layer1.opacity\": 0.0,\n\t\t\"layer1.inner_margin\": [8, 3]\n\t},\n\t//\t- Sidebar row selected\n\t{\n\t\t\"class\": \"tree_row\",\n\t\t\"attributes\": [\"selected\"],\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t// - Sidebar row dirty\n\t{\n\t\t\"class\": \"tree_row\",\n\t\t\"attributes\": [\"dirty\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/row-inactive-modified.png\",\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t// - Sidebar row selected dirty\n\t{\n\t\t\"class\": \"tree_row\",\n\t\t\"attributes\": [\"selected\", \"dirty\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/row-active-modified.png\",\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t//\t- Sidebar heading\n\t{\n\t\t\"class\": \"sidebar_heading\",\n\t\t\"color\": [2, 196, 251],\n\t\t\"font.bold\": true,\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\t{\n\t\t\"class\": \"sidebar_heading\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"selected\"]}],\n\t\t\"color\": [180, 180, 180]\n\t},\n\t//\t- Sidebar entry label\n\t{\n\t\t\"class\": \"sidebar_label\",\n\t\t\"color\": [200, 200, 200],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\t{\n\t\t\"class\": \"sidebar_label\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"expandable\"]}],\n\t\t\"settings\": [\"bold_folder_labels\"],\n\t\t\"font.bold\": true\n\t},\n\t{\t//\tSidebar selected entry label\n\t\t\"class\": \"sidebar_label\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"selected\"]}],\n\t\t\"color\": [240, 240, 240],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\t{\t//\tSidebar Hover entry label\n\t\t\"class\": \"sidebar_label\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"hover\"]}],\n\t\t\"color\": [2, 196, 251],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\t{\t//\tSidebar Hover entry label\n\t\t\"class\": \"sidebar_label\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"dirty\"]}],\n\t\t\"color\": [253, 113, 1],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\n\t//\t- Sidebar open files close/dirty\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-button-close-hover.png\",\n\t\t\"layer0.opacity\": 0.5,\n\t\t\"layer0.inner_margin\": 4,\n\t\t\"layer1.opacity\": 0.0,\n\t\t\"layer1.texture\":  \"SourcePawn/assets/tab-button-close.png\",\n\t\t\"layer1.inner_margin\": 4,\n\t\t\"content_margin\": [8, 8]\n\t},\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"attributes\": [\"dirty\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-button-dirty.png\",\n\t\t\"layer0.opacity\": 0.5\n\t},\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"attributes\": [\"hover\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-button-close-hover.png\",\n\t\t\"layer1.opacity\": 0.5,\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close.png\"\n\t},\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"attributes\": [\"hover\", \"dirty\"],\n\t\t\"layer1.opacity\": 0.5,\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close-dirty.png\"\n\t},\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"attributes\": [\"pressed\"],\n\t\t\"layer1.opacity\": 1.0,\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close.png\"\n\t},\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"attributes\": [\"pressed\", \"dirty\"],\n\t\t\"layer1.opacity\": 1.0,\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close-dirty.png\"\n\t},\n\n\t//\t- Sidebar FOLDERS closed\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"content_margin\": [9, 7, 8, 6],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-closed.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": 0\n\t},\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"hover\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-closed-hover.png\"\n\t},\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-closed-selected.png\"\n\t},\n\t//\t- Sidebar Folders open\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"attributes\": [\"expanded\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-open.png\"\n\t},\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"attributes\": [\"expanded\"],\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"hover\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-open-hover.png\"\n\t},\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"attributes\": [\"expanded\"],\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-open-selected.png\"\n\t},\n\n//\tSTANDARD TEXT BUTTONS\n//\t=========================================================\n\t//\t- Standard buttons (used for Find / Replace panel)\n\t{\n\t\t\"class\": \"button_control\",\n\t\t\"content_margin\": [6, 5, 6, 6],\n\t\t\"min_size\": [75, 0],\n\n\t\t//\tDefault button state\n\t\t\"layer0.texture\": \"SourcePawn/assets/btn-large.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [6, 6],\n\n\t\t//\tPressed button setup\n\t\t\"layer1.texture\": \"SourcePawn/assets/btn-large-active.png\",\n\t\t\"layer1.opacity\": 0.0,\n\t\t\"layer1.inner_margin\": [6, 6]\n\t},\n\t{\n\t\t//\tPressed button state\n\t\t\"class\": \"button_control\",\n\t\t\"attributes\": [\"pressed\"],\n\t\t\"layer1.opacity\": 1.0,\n\t\t\"content_margin\": [6, 6, 6, 6]\n\t},\n\n//\tTEXT INPUT FIELD\n//\t=========================================================\n\n\t//\t- Text input field item\n\t{\n\t\t\"class\": \"text_line_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/text-field.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [10, 10, 10, 10],\n\t\t\"content_margin\": [5, 5, 5, 5]\n\t},\n\n//\tPANEL BACKGROUNDS\n//\t=========================================================\n\t//\t- Bottom panel background\n\t{\n\t\t\"class\": \"panel_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/panel-bg.png\",\n\t\t\"layer0.inner_margin\": [4, 4, 4, 4],\n\t\t\"layer0.opacity\": 1.0\n\t},\n\n\t//\t- Quick panel background\n\t{\n\t\t\"class\": \"overlay_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay-bg.png\",\n\t\t\"layer0.inner_margin\": [10, 5, 10, 20],  // left, top, right, bottom\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer1.opacity\": 0, // HIDDEN\n\t\t\"content_margin\": [11, 8, 11, 17]\n\t},\n\n//\tQUICK PANEL\n//\t=========================================================\n\t{\n\t\t\"class\": \"quick_panel\",\n\t\t\"row_padding\": [4, 3],\n\t\t\"layer0.tint\": [45, 45, 45],\n\t\t\"layer0.opacity\": 1,\n\t\t\"dark_content\": true\n\t},\n\t{\n\t\t\"class\": \"quick_panel_row\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/qp-row.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [4, 4, 4, 4],\n\t\t\"layer1.draw_center\": true\n\t},\n\t{\n\t\t\"class\": \"quick_panel_row\",\n\t\t\"attributes\": [\"selected\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/qp-row-selected.png\"\n\t},\n\t{\n\t\t\"class\": \"quick_panel_label\",\n\t\t\"fg\": [190, 190, 190, 255],\n\t\t\"match_fg\": [166, 229, 255, 255],\n\t\t\"bg\": [71, 71, 71, 255],\n\t\t\"selected_fg\": [220, 220, 220, 255],\n\t\t\"selected_match_fg\": [2, 196, 251, 255],\n\t\t\"selected_bg\": [134, 134, 134, 255]\n\t},\n\t{\n\t\t\"class\": \"quick_panel_path_label\",\n\t\t\"fg\": [100, 100, 100, 255],\n\t\t\"match_fg\": [166, 229, 255, 255],\n\t\t\"bg\": [41, 41, 41, 255],\n\t\t\"selected_fg\": [120, 120, 120, 255],\n\t\t\"selected_match_fg\": [2, 196, 251, 255],\n\t\t\"selected_bg\": [24, 24, 24, 255]\n\t},\n\t{\n\t\t\"class\": \"quick_panel_score_label\",\n\t\t\"fg\": [90, 90, 90, 255],\n\t\t\"bg\": [41, 41, 41, 255],\n\t\t\"selected_fg\": [114, 114, 114, 255],\n\t\t\"selected_bg\": [24, 24, 24, 255]\n\t},\n\n//\tMINI QUICK PANEL\n//\t=========================================================\n\t{\n\t\t\"class\": \"mini_quick_panel_row\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/qp-row.png\",\n\t\t\"layer0.inner_margin\": [4, 4, 4, 4],\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t{\n\t\t\"class\": \"mini_quick_panel_row\",\n\t\t\"attributes\": [\"selected\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/qp-row-selected.png\"\n\t},\n\n//\tCODE COMPLETION DROPDOWN\n//\t=========================================================\n\t{\n\t\t\"class\": \"popup_control\",\n\t\t\"content_margin\": [0, 0]\n\t},\n\t{\n\t\t\"class\": \"auto_complete\",\n\t\t\"row_padding\": [2, 2],\n\t\t\"layer0.tint\": [30, 30, 30],\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"dark_content\": true\n\t},\n\t{\n\t\t\"class\": \"auto_complete_label\",\n\t\t\"fg\": [140, 140, 140],\n\t\t\"match_fg\": [255, 255, 255],\n\t\t\"bg\": [26, 26, 26],\n\t\t\"selected_fg\": [255, 255, 255],\n\t\t\"selected_match_fg\": [255, 255, 255],\n\t\t\"selected_bg\": [86, 86, 86]\n\t},\n\t{\n\t\t\"class\": \"table_row\",\n\t\t\"layer0.tint\": [45, 45, 45],\n\t\t\"layer0.opacity\": 0.0,\n\t\t\"layer0.inner_margin\": [1, 1]\n\t},\n\t{\n\t\t\"class\": \"table_row\",\n\t\t\"attributes\": [\"selected\"],\n\t\t\"layer0.opacity\": 1.0\n\t},\n\n//\tBOTTOM PANEL BUTTONS\n//\t==========================================================\n\t{\n\t\t\"class\": \"icon_button_control\",\n\t\t\"content_margin\": [4, 4]\n\t},\n\t{\n\t\t\"class\": \"icon_button_control\",\n\t\t\"attributes\": [\"pressed\"]\n\t},\n\t//\t- Regex search button\n\t{\n\t\t\"class\": \"icon_regex\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/regex-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_regex\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/regex-on.png\"\n\t},\n\t//\t- Case sensitive search button\n\t{\n\t\t\"class\": \"icon_case\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/case-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_case\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/case-on.png\"\n\t},\n\t//\t- Match whole word search button\n\t{\n\t\t\"class\": \"icon_whole_word\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/whole-word-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_whole_word\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/whole-word-on.png\"\n\t},\n\t//\t- Reverse search direction button\n\t{\n\t\t\"class\": \"icon_reverse\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/reverse-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_reverse\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/reverse-on.png\"\n\t},\n\t//\t- Search wrap button\n\t{\n\t\t\"class\": \"icon_wrap\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/wrap-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_wrap\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/wrap-on.png\"\n\t},\n\t//\t- Search in selection button\n\t{\n\t\t\"class\": \"icon_in_selection\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/selection-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_in_selection\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/selection-on.png\"\n\t},\n\t//\t- Preserve case button\n\t{\n\t\t\"class\": \"icon_preserve_case\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/preserve-case-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_preserve_case\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/preserve-case-on.png\"\n\t},\n\t//\t- Highlight results button\n\t{\n\t\t\"class\": \"icon_highlight\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/highlight-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_highlight\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/highlight-on.png\"\n\t},\n\n\t// \tBOTTOM PANEL ICONS (EXTENDED: FIND IN FILES)\n\t//\t=========================================================\n\n\t//\t- Show search context button\n\t{\n\t\t\"class\": \"icon_context\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/context-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_context\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/context-on.png\"\n\t},\n\t//\t- Use search buffer\n\t{\n\t\t\"class\": \"icon_use_buffer\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/buffer-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_use_buffer\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/buffer-on.png\"\n\t}\n\n]\n"
  },
  {
    "path": "src/test/resources/samples/langs/Sublime Text Config/jade.sublime-completions",
    "content": "{\n\t\"scope\": \"entity.name.tag.jade\",\n\t\"completions\":\n\t[\n\t\t\"a\",//\tDefines a hyperlink\n\t\t\"abbr\",//\tDefines an abbreviation\n\t\t\"acronym\",//\tNot supported in HTML5. Use <abbr> instead.\n\t\t//Defines an acronym\n\t\t\"address\",//\tDefines contact information for the author/owner of a document\n\t\t\"applet\",//\tNot supported in HTML5. Use <object> instead.\n\t\t//Defines an embedded applet\n\t\t\"area\",//\tDefines an area inside an image-map\n\t\t\"article\",//\tDefines an article\n\t\t\"aside\",//\tDefines content aside from the page content\n\t\t\"audio\",//\tDefines sound content\n\t\t\"b\",//\tDefines bold text\n\t\t\"base\",//\tSpecifies the base URL/target for all relative URLs in a document\n\t\t\"basefont\",//\tNot supported in HTML5. Use CSS instead.\n\t\t//Specifies a default color, size, and font for all text in a document\n\t\t\"bdi\",//\tIsolates a part of text that might be formatted in a different direction from other text outside it\n\t\t\"bdo\",//\tOverrides the current text direction\n\t\t\"big\",//\tNot supported in HTML5. Use CSS instead.\n\t\t//Defines big text\n\t\t\"blockquote\",//\tDefines a section that is quoted from another source\n\t\t\"body\",//\tDefines the document's body\n\t\t\"br\",//\tDefines a single line break\n\t\t\"button\",//\tDefines a clickable button\n\t\t\"canvas\",//\tUsed to draw graphics, on the fly, via scripting (usually JavaScript)\n\t\t\"caption\",//\tDefines a table caption\n\t\t\"center\",//\tNot supported in HTML5. Use CSS instead.\n\t\t//Defines centered text\n\t\t\"cite\",//\tDefines the title of a work\n\t\t\"code\",//\tDefines a piece of computer code\n\t\t\"col\",//\tSpecifies column properties for each column within a <colgroup> element \n\t\t\"colgroup\",//\tSpecifies a group of one or more columns in a table for formatting\n\t\t\"command\",//\tDefines a command button that a user can invoke\n\t\t\"datalist\",//\tSpecifies a list of pre-defined options for input controls\n\t\t\"dd\",//\tDefines a description/value of a term in a description list\n\t\t\"del\",//\tDefines text that has been deleted from a document\n\t\t\"details\",//\tDefines additional details that the user can view or hide\n\t\t\"dfn\",//\tDefines a definition term\n\t\t\"dialog\",//\tDefines a dialog box or window\n\t\t\"dir\",//\tNot supported in HTML5. Use <ul> instead.\n\t\t//Defines a directory list\n\t\t\"div\",//\tDefines a section in a document\n\t\t\"dl\",//\tDefines a description list\n\t\t\"dt\",//\tDefines a term/name in a description list\n\t\t\"em\",//\tDefines emphasized text \n\t\t\"embed\",//\tDefines a container for an external (non-HTML) application\n\t\t\"fieldset\",//\tGroups related elements in a form\n\t\t\"figcaption\",//\tDefines a caption for a <figure> element\n\t\t\"figure\",//\tSpecifies self-contained content\n\t\t\"font\",//\tNot supported in HTML5. Use CSS instead.\n\t\t//Defines font, color, and size for text\n\t\t\"footer\",//\tDefines a footer for a document or section\n\t\t\"form\",//\tDefines an HTML form for user input\n\t\t\"frame\",//\tNot supported in HTML5.\n\t\t//Defines a window (a frame) in a frameset\n\t\t\"frameset\",//\tNot supported in HTML5.\n\t\t//Defines a set of frames\n\t\t\"h1\",// to <h6>\t Defines HTML headings\n\t\t\"head\",//\tDefines information about the document\n\t\t\"header\",//\tDefines a header for a document or section\n\t\t\"hgroup\",//\tGroups heading elements\n\t\t\"hr\",//\t Defines a thematic change in the content\n\t\t\"html\",//\tDefines the root of an HTML document\n\t\t\"i\",//\tDefines a part of text in an alternate voice or mood\n\t\t\"iframe\",//\tDefines an inline frame\n\t\t\"img\",//\tDefines an image\n\t\t\"input\",//\tDefines an input control\n\t\t\"ins\",//\tDefines a text that has been inserted into a document\n\t\t\"kbd\",//\tDefines keyboard input\n\t\t\"keygen\",//\tDefines a key-pair generator field (for forms)\n\t\t\"label\",//\tDefines a label for an <input> element\n\t\t\"legend\",//\tDefines a caption for a <fieldset> element\n\t\t\"li\",//\tDefines a list item\n\t\t\"link\",//\tDefines the relationship between a document and an external resource (most used to link to style sheets)\n\t\t\"main\",//\tSpecifies the main content of a document\n\t\t\"map\",//\tDefines a client-side image-map\n\t\t\"mark\",//\tDefines marked/highlighted text\n\t\t\"menu\",//\tDefines a list/menu of commands\n\t\t\"meta\",//\tDefines metadata about an HTML document\n\t\t\"meter\",//\tDefines a scalar measurement within a known range (a gauge)\n\t\t\"nav\",//\tDefines navigation links\n\t\t\"noframes\",//\tNot supported in HTML5.\n\t\t//Defines an alternate content for users that do not support frames\n\t\t\"noscript\",//\tDefines an alternate content for users that do not support client-side scripts\n\t\t\"object\",//\tDefines an embedded object\n\t\t\"ol\",//\tDefines an ordered list\n\t\t\"optgroup\",//\tDefines a group of related options in a drop-down list\n\t\t\"option\",//\tDefines an option in a drop-down list\n\t\t\"output\",//\tDefines the result of a calculation\n\t\t\"p\",//\tDefines a paragraph\n\t\t\"param\",//\tDefines a parameter for an object\n\t\t\"pre\",//\tDefines preformatted text\n\t\t\"progress\",//\tRepresents the progress of a task\n\t\t\"q\",//\tDefines a short quotation\n\t\t\"rp\",//\tDefines what to show in browsers that do not support ruby annotations\n\t\t\"rt\",//\tDefines an explanation/pronunciation of characters (for East Asian typography)\n\t\t\"ruby\",//\tDefines a ruby annotation (for East Asian typography)\n\t\t\"s\",//\tDefines text that is no longer correct\n\t\t\"samp\",//\tDefines sample output from a computer program\n\t\t\"script\",//\tDefines a client-side script\n\t\t\"section\",//\tDefines a section in a document\n\t\t\"select\",//\tDefines a drop-down list\n\t\t\"small\",//\tDefines smaller text\n\t\t\"source\",//\tDefines multiple media resources for media elements (<video> and <audio>)\n\t\t\"span\",//\tDefines a section in a document\n\t\t\"strike\",//\tNot supported in HTML5. Use <del> instead.\n\t\t//Defines strikethrough text\n\t\t\"strong\",//\tDefines important text\n\t\t\"style\",//\tDefines style information for a document\n\t\t\"sub\",//\tDefines subscripted text\n\t\t\"summary\",//\tDefines a visible heading for a <details> element\n\t\t\"sup\",//\tDefines superscripted text\n\t\t\"table\",//\tDefines a table\n\t\t\"tbody\",//\tGroups the body content in a table\n\t\t\"td\",//\tDefines a cell in a table\n\t\t\"textarea\",//\tDefines a multiline input control (text area)\n\t\t\"tfoot\",//\tGroups the footer content in a table\n\t\t\"th\",//\tDefines a header cell in a table\n\t\t\"thead\",//\tGroups the header content in a table\n\t\t\"time\",//\tDefines a date/time\n\t\t\"title\",//\tDefines a title for the document\n\t\t\"tr\",//\tDefines a row in a table\n\t\t\"track\",//\tDefines text tracks for media elements (<video> and <audio>)\n\t\t\"tt\",//\tNot supported in HTML5. Use CSS instead.\n\t\t//Defines teletype text\n\t\t\"u\",//\tDefines text that should be stylistically different from normal text\n\t\t\"ul\",//\tDefines an unordered list\n\t\t\"var\",//\tDefines a variable\n\t\t\"video\",//\tDefines a video or movie\n\t\t\"wbr\"\n\t]\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/SugarSS/sample.sss",
    "content": "@define-mixin size $size\n  width: $size\n\n$big: 100px\n\n// Main block\n.block\n  &_logo\n    background: inline(\"./logo.png\")\n    @mixin size $big\n"
  },
  {
    "path": "src/test/resources/samples/langs/SuperCollider/WarpPreset.sc",
    "content": "WarpPreset {\n\t*new {|path|\n\t\tif(path.notNil) {\n\t\t\t^Object.readArchive(path);\n\t\t};\n\n\t\t^super.new.init();\n\t}\n\n\tinit {\n\n\t}\n\n\tsave {\n\t\tDialog.savePanel({|path|\n\t\t\tthis.writeArchive(path);\n\t\t});\n\t}\n}"
  },
  {
    "path": "src/test/resources/samples/langs/SuperCollider/WarpTate.sc",
    "content": "WarpTate {\n\tclassvar <numSections = 8;\n\t// classvar <sectionDur = 3 * 60;\n\tclassvar <sectionDur = 60;\n\n\tvar <sensorKeys;\n\tvar <clock;\n\tvar <tempo;\n\tvar <>tempoChannel;\n\tvar <>tempoControl;\n\tvar <out;\n\tvar <tracks;\n\tvar <>sections;\n\tvar <availableControls;\n\tvar <controls;\n\tvar <sensorVals;\n\tvar <sensorPrevs;\n\tvar <sensorMins;\n\tvar <sensorMaxs;\n\tvar <>sensorMinAdj;\n\tvar <>sensorMaxAdj;\n\tvar <doAdjusts;\n\tvar <playRout;\n\n\t*new {\n\t\t^super.new.init;\n\t}\n\n\tinit {\n\t\ttempo = 120;\n\t\ttempoChannel = 15;\n\t\ttempoControl = 3;\n\t\tclock = TempoClock.default\n\t\t\t.tempo_(2)\n\t\t\t.permanent_(true);\n\n\t\tMIDIClient.init;\n\t\tout = MIDIOut.newByName(\"IAC Driver\", \"Bus 1\");\n\t\tout.latency = 0;\n\n\t\ttracks = IdentityDictionary[];\n\t\tsections = Array.newClear(WarpTate.numSections);\n\t\t// sections is a List of IdentityDictionary to be mapped to\n\t\t// WarpTrack settings var\n\t\t// e.g. List[IdentityDictionary[\n\t\t//\t \t\t\t'303_1' -> IdentityDictionary['notes' -> List[42]],\n\t\t// \t\t\t\t'808_1'\t-> IdentityDictionary['notes' -> List[24]]\n\t\t// \t\t\t]\n\t\t// \t\t]\n\t\tsensorKeys = ['303a', '303b', '808a', '808b'];\n\n\t\t// channel 16 reserved for tempo changes\n\t\tavailableControls = 15.collect {|channel|\n\t\t\t(0..120).reject({|item, i|\n\t\t\t\t[ 0, 1, 2, 4, 5, 6, 7, 8, 10, 11, 12, 13, 64, 65, 66, 67, 68,\n\t\t\t\t69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 84, 91, 92, 93, 94,\n\t\t\t\t95, 96, 97, 98, 99, 100, 102 ].includes(item)\n\t\t\t});\n\t\t};\n\n\t\tcontrols = (0..127).collect { IdentityDictionary[] };\n\n\t\tthis.addOSCdefs();\n\n\t\tCmdPeriod.add({this.stop});\n\t}\n\n\ttempo_ {|argTempo|\n\t\tif(argTempo >= 50 && argTempo <= 177) {\n\t\t\ttempo = argTempo;\n\t\t\tclock.tempo = tempo / 60;\n\n\t\t\tout.control(tempoChannel, tempoControl, tempo - 50);\n\t\t} {\n\t\t\t\"Tempo out of Logic's range :(\".postln;\n\t\t};\n\t}\n\n\taddTrack {|trackKey, channel, type|\n\t\ttracks[trackKey] = WarpTrack(this, trackKey, channel, type);\n\t\t^tracks[trackKey];\n\t}\n\n\tloadTrack {|preset, checkAvailable|\n\t\tvar track = WarpTrack.load(this, preset, checkAvailable),\n\t\t\ttrackKey = track.settings['key'];\n\n\t\ttracks[trackKey] = track;\n\t\t^tracks[trackKey];\n\t}\n\n\treadTrack {|path|\n\t\tvar track = WarpTrack.read(this, path),\n\t\t\ttrackKey = track.settings['key'];\n\n\t\ttracks[trackKey] = track;\n\t\t^tracks[trackKey];\n\t}\n\n\tremoveTrack {|trackKey|\n\t\ttracks[trackKey].allOff();\n\t\ttracks[trackKey] = nil;\n\t}\n\n\tremoveAllTracks {\n\t\ttracks = IdentityDictionary[];\n\t}\n\n\ton {|trackKey, note|\n\t\ttracks[trackKey].on(note);\n\t}\n\n\toff {|trackKey, note|\n\t\ttracks[trackKey].off(note);\n\t}\n\n\thit {|trackKey, note=60, vel=127, dur=1|\n\t\ttracks[trackKey].hit(note, vel, dur);\n\t}\n\n\tnoteOn {|midiChannel, note, vel|\n\t\tout.noteOn(midiChannel, note, vel);\n\t}\n\n\tnoteOff {|midiChannel, note, vel|\n\t\tout.noteOff(midiChannel, note, vel);\n\t}\n\n\tcontrol {|midiChannel, num, val|\n\t\tout.control(midiChannel, num, val);\n\t}\n\n\tisControlAvailable {|channel, controlNum|\n\t\t^controls[channel].keys.includes(controlNum.asSymbol).not;\n\t}\n\n\tsetControl {|channel, num, key|\n\t\tcontrols[channel][num.asSymbol] = key;\n\t\tavailableControls[channel].remove(num);\n\t}\n\n\tassign {|trackKey, paramKey, controlNum, learn=false|\n\t\tvar channel = tracks[trackKey].settings['midiChannel'];\n\n\t\tif(controlNum.notNil && this.isControlAvailable(channel, controlNum)) {\n\t\t\ttracks[trackKey].assign(paramKey, controlNum, learn);\n\t\t\tavailableControls[channel].removeAt(0);\n\n\t\t} {\n\t\t\tif(availableControls[channel].size > 0) {\n\t\t\t\ttracks[trackKey].assign(paramKey, availableControls[channel][0], learn);\n\t\t\t\tavailableControls[channel].removeAt(0);\n\t\t\t} {\n\t\t\t\t\"no controls left!\".postln;\n\t\t\t};\n\t\t};\n\n\t\t\"Don't forget to turn off MIDI learn\".postln\n\t}\n\n\tsetParam {|trackKey, paramKey, val|\n\t\tvar track, param;\n\n\t\tif((track = tracks[trackKey]).notNil) {\n\t\t\tif(track.params[paramKey].notNil) {\n\t\t\t\ttrack.setParam(paramKey, val);\n\t\t\t} {\n\t\t\t\t\"paramKey doesn't exist\".postln;\n\t\t\t};\n\t\t} {\n\t\t\t\"track key doesn't exist\".postln;\n\t\t};\n\t}\n\n\t// sec takes IdentityDictionarys of WarpTrack settings\n\taddSection {|index, tempo=120, presets|\n\t\t// Add section with tempo\n\t\tsections[index] = IdentityDictionary[\n\t\t\t'tempo' \t-> tempo,\n\t\t\t'tracks'\t-> presets\n\t\t];\n\n\t\tpresets.do {|preset, i|\n\t\t\t// create track if there ain't one with this key\n\t\t\tif(tracks.includesKey(preset['key']).not) {\n\t\t\t\tthis.loadTrack(preset, true);\n\t\t\t};\n\n\t\t\t// store the preset\n\t\t\t// sections[index]['tracks'][preset['key']] = preset;\n\t\t};\n\n\t\t^sections;\n\t}\n\n\tplay {\n\n\t\tif(sections.any {|item, i| item.notNil; }) {\n\t\t\tplayRout = Routine {\n\t\t\t\tinf.do {|i|\n\t\t\t\t\tsections.do {|section|\n\t\t\t\t\t\tif(section.notNil) {\n\t\t\t\t\t\t\tif(i !== 0) {\n\t\t\t\t\t\t\t\ttracks.do {|track|\n\t\t\t\t\t\t\t\t\ttrack.allOff();\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tthis.removeAllTracks();\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tthis.tempo = section['tempo'];\n\n\t\t\t\t\t\t\tsection['tracks'].do {|track, i|\n\t\t\t\t\t\t\t\tvar newTrack = this.loadTrack(track, false);\n\t\t\t\t\t\t\t\tnewTrack.play();\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsectionDur.wait;\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\t\t\tclock.playNextBar(playRout);\n\t\t} {\n\t\t\t\"no sections added!\".postln;\n\t\t};\n\n\t}\n\n\tstop {\n\t\tplayRout.stop;\n\n\t\ttracks.do {|track|\n\t\t\ttrack.allOff();\n\t\t\tout.allNotesOff(track.settings['midiChannel']);\n\t\t}\n\t}\n\n\taddOSCdefs {\n\t\tsensorVals = 0!sensorKeys.size;\n\t\tsensorPrevs = 0!sensorKeys.size;\n\t\tsensorMins = 9999!sensorKeys.size;\n\t\tsensorMaxs = 0!sensorKeys.size;\n\t\tsensorMinAdj = sensorMinAdj ?? { 0.005 };\n\t\tsensorMaxAdj = sensorMaxAdj ?? { 0.01 };\n\t\tdoAdjusts = false!sensorKeys.size;\n\n\t\tsensorKeys.do {|sensorKey, i|\n\t\t\tOSCdef((\"sensor_\" ++ sensorKey).asSymbol, {|msg, time, addr, recvPort|\n\t\t\t\tvar val = msg[1];\n\n\n\t\t\t\tsensorPrevs[i] = sensorVals[i];\n\t\t\t\tsensorVals[i] = val;\n\n\t\t\t\tif(doAdjusts[i]) {\n\t\t\t\t\tsensorMins[i] = min(val, sensorMins[i]);\n\t\t\t\t\tsensorMaxs[i] = max(val, sensorMaxs[i]);\n\n\t\t\t\t\tif(val < sensorMaxs[i]) {\n\t\t\t\t\t\tsensorMaxs[i] = sensorMaxs[i] - sensorMaxAdj;\n\t\t\t\t\t};\n\n\t\t\t\t\tif(val > sensorMins[i]) {\n\t\t\t\t\t\tsensorMins[i] = sensorMins[i] + sensorMinAdj;\n\t\t\t\t\t};\n\t\t\t\t} {\n\t\t\t\t\tval = val.clip(sensorMins[i], sensorMaxs[i]);\n\t\t\t\t};\n\n\n\t\t\t\ttracks.do {|track, j|\n\t\t\t\t\tif(track.settings['sensorFuncs'].includesKey(sensorKey)) {\n\t\t\t\t\t\ttrack.sensor(\n\t\t\t\t\t\t\tsensorKey,\n\t\t\t\t\t\t\tval.linlin(\n\t\t\t\t\t\t\t\tsensorMins[i],\n\t\t\t\t\t\t\t\tsensorMaxs[i],\n\t\t\t\t\t\t\t\t127,\n\t\t\t\t\t\t\t\t0\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}, (\"/prox/\" ++ sensorKey).asSymbol);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/test/resources/samples/langs/SuperCollider/WarpTrack.sc",
    "content": "WarpTrack {\n\tclassvar <defaults;\n\n\tvar <parent;\n\tvar <settings;\n\n\t*initClass {\n\t\tdefaults['303_1'] = defaults['303'].copy;\n\t\tdefaults['303_1']['paramControls'].putPairs([\n\t\t\t'Bus 1', 46,\n\t\t\t'Bus 2', 45,\n\t\t\t'Bus 3', 48,\n\t\t\t'echovol', 47\n\t\t]);\n\t\tdefaults['303_1']['params'].putPairs([\n\t\t\t'Bus 1', 0,\n\t\t\t'Bus 2', 0,\n\t\t\t'Bus 3', 0,\n\t\t\t'echovol', 0\n\t\t]);\n\n\t\tdefaults['303_2'] = defaults['303_1'].copy;\n\t\tdefaults['303_2']['paramControls'].putPairs([\n\t\t]);\n\t\tdefaults['303_2']['params'].putPairs([\n\t\t]);\n\n\t\tdefaults['808_1'] = defaults['808'].copy;\n\t\tdefaults['808_1']['paramControls'].putPairs([\n\t\t\t'bitcrusher', 88,\n\t\t\t'Send 1', 89,\n\t\t\t'Send 2', 90,\n\t\t\t'Send 3', 101\n\t\t]);\n\t\tdefaults['808_1']['params'].putPairs([\n\t\t\t'bitcrusher', 0,\n\t\t\t'Send 1', 0,\n\t\t\t'Send 2', 0,\n\t\t\t'Send 3', 0\n\t\t]);\n\n\t\tdefaults['808_2'] = defaults['808_1'].copy;\n\t\tdefaults['808_2']['paramControls'].putPairs([]);\n\t\tdefaults['808_2']['params'].putPairs([]);\n\t}\n\n\t*new {|argParent, argKey, argMidiChannel, argType|\n\t\t^super.new.init(argParent, argKey, argMidiChannel, argType);\n\t}\n\n\t*read {|argParent, path|\n\t\t^super.new.init(argParent).readPreset(path);\n\t}\n\n\t*load {|argParent, preset, checkAvailable|\n\t\t^super.new.init(argParent).loadPreset(preset, checkAvailable);\n\t}\n\n\tinit {|argParent, argKey, argMidiChannel, argType|\n\t\tparent = argParent;\n\n\t\tsettings = IdentityDictionary[\n\t\t\t'key'\t\t\t-> argKey,\n\t\t\t'midiChannel'\t-> argMidiChannel,\n\t\t\t'notes'\t\t\t-> Set[],\n\t\t\t'params'\t\t-> IdentityDictionary[],\n\t\t\t'paramControls'\t-> IdentityDictionary[],\n\t\t\t'patternTrack'\t-> true,\n\t\t\t'sensorFuncs'\t-> IdentityDictionary[]\n\t\t];\n\n\t\tif(argType.notNil) {\n\t\t\tsettings['type'] = argType;\n\t\t\tif(WarpTrack.defaults.keys.includes(argType)) {\n\t\t\t\t['paramControls', 'params'].do {|key, i|\n\t\t\t\t\tsettings[key] = WarpTrack.defaults[argType][key];\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.initParams();\n\t\t};\n\t}\n\n\ton {|note|\n\t\tvar clock = parent.clock;\n\t\tvar sub = 1 / (parent.clock.tempo * 16); // one sub division\n\n\t\tclock.schedAbs(clock.nextBar - sub, {\n\t\t\tif(settings['patternTrack']) {\n\t\t\t\tthis.allOff();\n\t\t\t} {\n\t\t\t\tthis.off(note);\n\t\t\t};\n\t\t});\n\n\t\tparent.clock.playNextBar({\n\t\t\tsettings['notes'].add(note);\n\t\t\tparent.noteOn(settings['midiChannel'], note, 127);\n\t\t});\n\t}\n\n\toff {|note|\n\t\t// settings['notes'].remove(note);\n\t\tparent.noteOff(settings['midiChannel'], note, 0);\n\t}\n\n\thit {|note=60, vel=127, dur=1, quant=0|\n\t\t{\n\t\t\tparent.noteOn(settings['midiChannel'], note, vel);\n\t\t\tdur.wait;\n\t\t\tparent.noteOff(settings['midiChannel'], note, vel);\n\t\t}.fork(parent.clock, quant:quant);\n\t}\n\n\tallOff {\n\t\tsettings['notes'].do {|note, i|\n\t\t\tthis.off(note);\n\t\t};\n\t}\n\n\tassign {|paramKey, num, learn=false, init=true, checkAvailable=true|\n\t\tif(num.notNil) {\n\t\t\tthis.assignAll(IdentityDictionary[paramKey -> num], learn, init, checkAvailable);\n\t\t} {\n\t\t\tparent.assign(settings['key'], paramKey, nil, learn);\n\t\t};\n\t}\n\n\tassignAll {|paramControls, learn=false, init=true, checkAvailable=true|\n\t\tvar action = {\n\t\t\tvar channel = settings['midiChannel'];\n\n\t\t\tparamControls.keysValuesDo { |paramKey, num|\n\t\t\t\tif(checkAvailable.not ||\n\t\t\t\t\t(checkAvailable && parent.isControlAvailable(channel, num))) {\n\t\t\t\t\tsettings['paramControls'][paramKey] = num;\n\t\t\t\t\tif(init) {\n\t\t\t\t\t\tsettings['params'][paramKey] = 0;\n\t\t\t\t\t};\n\t\t\t\t\tparent.setControl(channel, num, paramKey);\n\t\t\t\t\tif(learn) {\n\t\t\t\t\t\tparent.control(channel, num, 127);\n\t\t\t\t\t\t0.05.wait;\n\t\t\t\t\t\tparent.control(channel, num, 0);\n\t\t\t\t\t};\n\t\t\t\t\tparamKey ++ \" assigned to controlNum \" ++ num;\n\t\t\t\t} {\n\t\t\t\t\t(\"this controlNum \" ++ num ++ \" is already assigned!\").postln;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\n\t\tif(learn) {\n\t\t\taction.fork;\n\t\t} {\n\t\t\taction.();\n\t\t};\n\n\t}\n\n\tinitParams {\n\t\tsettings['params'].keysValuesDo { |key, value|\n\t\t\tthis.setParam(key, value);\n\t\t};\n\t\tsettings['paramControls'].keysValuesDo { |key, value|\n\t\t\tparent.setControl(settings['midiChannel'], value, key);\n\t\t};\n\t}\n\n\tsetParam {|paramKey, val, quant|\n\t\tvar func = {\n\t\t\tparent.control(\n\t\t\t\tsettings['midiChannel'],\n\t\t\t\tsettings['paramControls'][paramKey],\n\t\t\t\tval\n\t\t\t);\n\n\t\t\tsettings['params'][paramKey] = val;\n\t\t};\n\n\t\tif(quant.notNil) {\n\t\t\t{\n\t\t\t\tfunc.();\n\t\t\t}.fork(parent.clock, quant:quant);\n\t\t} {\n\t\t\tfunc.();\n\t\t};\n\t}\n\n\treadPreset {|path, checkAvailable=true|\n\t\tthis.loadPreset(Object.readArchive(path), checkAvailable);\n\t}\n\n\tloadPreset {|preset, checkAvailable=true|\n\t\t// copy all settings except notes and paramControls\n\t\tpreset.keys.reject({|settingKey, i|\n\t\t\t['notes', 'paramControls'].includes(settingKey);\n\t\t}).do {|presetKey, i|\n\t\t\tsettings[presetKey] = preset[presetKey];\n\t\t};\n\n\t\t// copy notes if it's a patternTrack\n\t\tif(preset['patternTrack']) {\n\t\t\tsettings['notes'] = preset['notes'];\n\t\t};\n\n\t\t// assign all without learn or init\n\t\tthis.assignAll(\n\t\t\tpreset['paramControls'],\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t\tcheckAvailable\n\t\t);\n\n\t\tthis.initParams();\n\n\t\t// if(settings['notes'].size > 0) {\n\t\t// \tthis.on(settings['notes'].asArray[0]);\n\t\t// };\n\t}\n\n\tsensor {|sensorKey, val|\n\t\tsettings['sensorFuncs'][sensorKey].do {|func, i|\n\t\t\tfunc.(this, val);\n\t\t}\n\t}\n\n\taddFunc {|sensorKey, funcKey, func|\n\t\tif(parent.sensorKeys.includes(sensorKey)) {\n\t\t\tif(settings['sensorFuncs'].includesKey(sensorKey).not) {\n\t\t\t\tsettings['sensorFuncs'][sensorKey] = IdentityDictionary[];\n\t\t\t};\n\n\t\t\tsettings['sensorFuncs'][sensorKey][funcKey] = func;\n\t\t} {\n\t\t\t\"parent doesn't have that sensor key\".postln;\n\t\t};\n\t}\n\n\tremoveFunc {|sensorKey, funcKey|\n\t\tsettings['sensorFuncs'][sensorKey].removeAt(funcKey);\n\n\t\tif(settings['sensorFuncs'][sensorKey].isEmpty) {\n\t\t\tsettings['sensorFuncs'].removeAt(sensorKey);\n\t\t};\n\t}\n\n\tavailableControls {\n\t\t^parent.availableControls[settings['midiChannel']].copy;\n\t}\n\n\tsave {\n\t\tDialog.savePanel({|path|\n\t\t\tsettings.writeArchive(path);\n\t\t});\n\t}\n\n\tplay {\n\t\tif(settings['patternTrack'] && settings['notes'].notEmpty) {\n\t\t\tthis.on(settings['notes'].choose);\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/SuperCollider/WarpUtil.sc",
    "content": "WarpUtil {\n\tvar <>parent;\n\tvar <curSensor;\n\n\tvar <win;\n\tvar <texts;\n\tvar <sensorSlider;\n\tvar <sliders;\n\tvar <updateRout;\n\n\t*new {|argParent|\n\t\t^super.new.init(argParent);\n\t}\n\n\tinit {|argParent|\n\t\tparent = argParent;\n\t\ttexts = IdentityDictionary[];\n\n\t\tthis.makeView();\n\t\tthis.startUpdate();\n\t}\n\n\tcalibrate {\n\t\t{\n\t\t\tparent.doAdjusts.size.do {|i|\n\t\t\t\tparent.sensorMaxs[i] = 0;\n\t\t\t\tparent.sensorMins[i] = 9999;\n\t\t\t\tparent.doAdjusts[i] = true;\n\t\t\t};\n\n\t\t\tsliders.do {|slider, i|\n\t\t\t\tif(parent.sensorKeys[i] !== curSensor) {\n\t\t\t\t\tslider.valueAction_(0);\n\t\t\t\t\t0.1.wait;\n\t\t\t\t\tslider.valueAction_(1);\n\t\t\t\t};\n\t\t\t}\n\t\t}.fork(AppClock);\n\t}\n\n\tstopCalibrate {\n\t\tparent.doAdjusts.size.do {|i|\n\t\t\tparent.doAdjusts[i] = false;\n\t\t}\n\t}\n\n\tmakeView {\n\t\tvar width = 370;\n\n\t\tif(win.notNil) {\n\t\t\twin.close;\n\t\t};\n\n\t\twin = Window(\"Sensor Inspector\", Rect(256, 10, width, 424)).front;\n\t\twin.view.addFlowLayout;\n\n\t\t['sensorVals', 'sensorPrevs', 'sensorMins', 'sensorMaxs'].do {|label, i|\n\t\t\tStaticText(win, (width * 0.5)@20)\n\t\t\t\t.string_(label.asString);\n\n\t\t\twin.view.decorator.nextLine;\n\n\n\t\t\ttexts[label] = StaticText(win, (width / 2)@40);\n\n\t\t\tif(curSensor.notNil) {\n\t\t\t\ttexts[label].string_(\n\t\t\t\t\t\"\\t\" ++ parent.perform(label).at(\n\t\t\t\t\t\tparent.sensorKeys.indexOf(curSensor)\n\t\t\t\t\t);\n\t\t\t\t);\n\t\t\t};\n\n\t\t\twin.view.decorator.nextLine;\n\t\t};\n\n\t\tsensorSlider = EZSlider(win, 280@20, label: curSensor.asString);\n\n\t\tsliders = parent.sensorKeys.collect { |sensorKey, i|\n\t\t\tEZSlider(win, 280@20, label: sensorKey.asString)\n\t\t\t\t.action_({|ez|\n\t\t\t\t\tNetAddr.localAddr.sendMsg(\n\t\t\t\t\t\t\"/prox/\" ++ sensorKey,\n\t\t\t\t\t\tez.value * 100\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t};\n\t}\n\n\tstartUpdate {\n\t\tupdateRout = Routine {\n\t\t\tinf.do {|i|\n\t\t\t\tvar index;\n\n\t\t\t\tif(curSensor.notNil) {\n\t\t\t\t\tindex = parent.sensorKeys.indexOf(curSensor);\n\n\t\t\t\t\t['sensorVals', 'sensorPrevs', 'sensorMins',\n\t\t\t\t\t\t'sensorMaxs'].do {|label, i|\n\n\t\t\t\t\t\t\ttexts[label]\n\t\t\t\t\t\t\t.string_(\"\\t\" ++ parent.perform(label)[index]);\n\t\t\t\t\t};\n\n\t\t\t\t\tsensorSlider.value = parent.sensorVals[index].linlin(\n\t\t\t\t\t\tparent.sensorMins[index],\n\t\t\t\t\t\tparent.sensorMaxs[index],\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t1\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\t0.05.wait;\n\t\t\t}\n\t\t};\n\n\t\tupdateRout.play(AppClock);\n\t}\n\n\tstopUpdate {\n\t\tupdateRout.stop();\n\t}\n\n\tcurSensor_ {|argCurSensor|\n\t\tcurSensor = argCurSensor;\n\t\tthis.makeView();\n\t}\n}"
  },
  {
    "path": "src/test/resources/samples/langs/SuperCollider/example.scd",
    "content": "// SuperCollider Examples\n\n//boot server\ns.boot;\n\n// SC as system for sound synthesis and sound processing\n\n\n// patching synth moduls by writing synth defs:\n\n(\nSynthDef(\"mod\", {\n\tvar sig, resfreq;\t\n\tsig = Saw.ar(100);\n\tresfreq = SinOsc.kr(2) * 200 + 500;\n\tsig = RLPF.ar(sig, resfreq, 0.1);\n\tsig = sig * 0.3;\n\tOut.ar(0, sig);\n}).play;\n)\t\n\n// SuperCollider: a powerful expressive DSP language:\n\n(\n30.do { arg i;  \n\t{ Pan2.ar( \n\t\tSinOsc.ar(exprand(100.0, 3000.0) * LFNoise2.kr(rrand(0.1, 0.2)).range(0.95, 1.1), 0, \n\t\t\tLFNoise2.kr(rrand(0.3, 0.7)).range(0,0.5) ** 4), \n\t\t1.0.rand2) \n\t}.play \n}\n)\n\n// plot envelopes\na = Env.perc(0.05, 1, 1, -4);\nb = a.delay(2);\na.test.plot;\nb.test.plot;\n\na = Env([0.5, 1, 0], [1, 1]).plot;\na.delay(1).plot;\n\n// examples asStream function\n(\n{\ne = Env.sine.asStream;\n5.do({\n    e.next.postln;\n    0.25.wait;\n})}.fork\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-11.swift",
    "content": "let apples = 3\nlet oranges = 5\nlet appleSummary = \"I have \\(apples) apples.\"\nlet fruitSummary = \"I have \\(apples + oranges) pieces of fruit.\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-13.swift",
    "content": "var shoppingList = [\"catfish\", \"water\", \"tulips\", \"blue paint\"]\nshoppingList[1] = \"bottle of water\"\n\nvar occupations = [\n    \"Malcolm\": \"Captain\",\n    \"Kaylee\": \"Mechanic\",\n ]\noccupations[\"Jayne\"] = \"Public Relations\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-15.swift",
    "content": "let emptyArray = String[]()\nlet emptyDictionary = Dictionary<String, Float>()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-17.swift",
    "content": "shoppingList = []   // Went shopping and bought everything.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-19.swift",
    "content": "let individualScores = [75, 43, 103, 87, 12]\nvar teamScore = 0\nfor score in individualScores {\n    if score > 50 {\n        teamScore += 3\n    } else {\n        teamScore += 1\n    }\n}\nteamScore\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-21.swift",
    "content": "var optionalString: String? = \"Hello\"\noptionalString == nil\n\nvar optionalName: String? = \"John Appleseed\"\nvar greeting = \"Hello!\"\nif let name = optionalName {\n    greeting = \"Hello, \\(name)\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-23.swift",
    "content": "let vegetable = \"red pepper\"\nswitch vegetable {\n    case \"celery\":\n        let vegetableComment = \"Add some raisins and make ants on a log.\"\n    case \"cucumber\", \"watercress\":\n        let vegetableComment = \"That would make a good tea sandwich.\"\n    case let x where x.hasSuffix(\"pepper\"):\n        let vegetableComment = \"Is it a spicy \\(x)?\"\n    default:\n        let vegetableComment = \"Everything tastes good in soup.\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-25.swift",
    "content": "let interestingNumbers = [\n    \"Prime\": [2, 3, 5, 7, 11, 13],\n    \"Fibonacci\": [1, 1, 2, 3, 5, 8],\n    \"Square\": [1, 4, 9, 16, 25],\n]\nvar largest = 0\nfor (kind, numbers) in interestingNumbers {\n    for number in numbers {\n        if number > largest {\n            largest = number\n        }\n    }\n}\nlargest\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-27.swift",
    "content": "var n = 2\nwhile n < 100 {\n    n = n * 2\n}\nn\n\nvar m = 2\ndo {\n    m = m * 2\n} while m < 100\nm\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-29.swift",
    "content": "var firstForLoop = 0\nfor i in 0..3 {\n    firstForLoop += i\n}\nfirstForLoop\n\nvar secondForLoop = 0\nfor var i = 0; i < 3; ++i {\n    secondForLoop += 1\n}\nsecondForLoop\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-3.swift",
    "content": "println(\"Hello, world\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-31.swift",
    "content": "func greet(name: String, day: String) -> String {\n    return \"Hello \\(name), today is \\(day).\"\n}\ngreet(\"Bob\", \"Tuesday\")\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-33.swift",
    "content": "func getGasPrices() -> (Double, Double, Double) {\n    return (3.59, 3.69, 3.79)\n}\ngetGasPrices()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-35.swift",
    "content": "func sumOf(numbers: Int...) -> Int {\n    var sum = 0\n    for number in numbers {\n        sum += number\n    }\n    return sum\n}\nsumOf()\nsumOf(42, 597, 12)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-37.swift",
    "content": "func returnFifteen() -> Int {\n    var y = 10\n    func add() {\n        y += 5\n    }\n    add()\n    return y\n}\nreturnFifteen()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-39.swift",
    "content": "func makeIncrementer() -> (Int -> Int) {\n    func addOne(number: Int) -> Int {\n        return 1 + number\n    }\n    return addOne\n}\nvar increment = makeIncrementer()\nincrement(7)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-41.swift",
    "content": "func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {\n    for item in list {\n        if condition(item) {\n            return true\n        }\n    }\n    return false\n}\nfunc lessThanTen(number: Int) -> Bool {\n    return number < 10\n}\nvar numbers = [20, 19, 7, 12]\nhasAnyMatches(numbers, lessThanTen)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-43.swift",
    "content": "numbers.map({\n    (number: Int) -> Int in\n    let result = 3 * number\n    return result\n})\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-45.swift",
    "content": "numbers.map({ number in 3 * number })\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-47.swift",
    "content": "sort([1, 5, 3, 12, 2]) { $0 > $1 }\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-49.swift",
    "content": "class Shape {\n    var numberOfSides = 0\n    func simpleDescription() -> String {\n        return \"A shape with \\(numberOfSides) sides.\"\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-5.swift",
    "content": "var myVariable = 42\nmyVariable = 50\nlet myConstant = 42\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-51.swift",
    "content": "var shape = Shape()\nshape.numberOfSides = 7\nvar shapeDescription = shape.simpleDescription()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-53.swift",
    "content": "class NamedShape {\n    var numberOfSides: Int = 0\n    var name: String\n\n    init(name: String) {\n       self.name = name\n    }\n\n    func simpleDescription() -> String {\n       return \"A shape with \\(numberOfSides) sides.\"\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-55.swift",
    "content": "class Square: NamedShape {\n    var sideLength: Double\n\n    init(sideLength: Double, name: String) {\n        self.sideLength = sideLength\n        super.init(name: name)\n        numberOfSides = 4\n    }\n\n    func area() ->  Double {\n        return sideLength * sideLength\n    }\n\n    override func simpleDescription() -> String {\n        return \"A square with sides of length \\(sideLength).\"\n    }\n}\nlet test = Square(sideLength: 5.2, name: \"my test square\")\ntest.area()\ntest.simpleDescription()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-57.swift",
    "content": "class EquilateralTriangle: NamedShape {\n    var sideLength: Double = 0.0\n\n    init(sideLength: Double, name: String) {\n        self.sideLength = sideLength\n        super.init(name: name)\n        numberOfSides = 3\n    }\n\n    var perimeter: Double {\n        get {\n             return 3.0 * sideLength\n        }\n        set {\n            sideLength = newValue / 3.0\n        }\n    }\n\n    override func simpleDescription() -> String {\n        return \"An equilateral triagle with sides of length \\(sideLength).\"\n    }\n}\nvar triangle = EquilateralTriangle(sideLength: 3.1, name: \"a triangle\")\ntriangle.perimeter\ntriangle.perimeter = 9.9\ntriangle.sideLength\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-59.swift",
    "content": "class TriangleAndSquare {\n    var triangle: EquilateralTriangle {\n        willSet {\n            square.sideLength = newValue.sideLength\n        }\n    }\n    var square: Square {\n        willSet {\n            triangle.sideLength = newValue.sideLength\n        }\n    }\n    init(size: Double, name: String) {\n        square = Square(sideLength: size, name: name)\n        triangle = EquilateralTriangle(sideLength: size, name: name)\n    }\n}\nvar triangleAndSquare = TriangleAndSquare(size: 10, name: \"another test shape\")\ntriangleAndSquare.square.sideLength\ntriangleAndSquare.triangle.sideLength\ntriangleAndSquare.square = Square(sideLength: 50, name: \"larger square\")\ntriangleAndSquare.triangle.sideLength\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-61.swift",
    "content": "class Counter {\n    var count: Int = 0\n    func incrementBy(amount: Int, numberOfTimes times: Int) {\n        count += amount * times\n    }\n}\nvar counter = Counter()\ncounter.incrementBy(2, numberOfTimes: 7)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-63.swift",
    "content": "let optionalSquare: Square? = Square(sideLength: 2.5, name: \"optional square\")\nlet sideLength = optionalSquare?.sideLength\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-65.swift",
    "content": "enum Rank: Int {\n    case Ace = 1\n    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten\n    case Jack, Queen, King\n    func simpleDescription() -> String {\n        switch self {\n            case .Ace:\n                return \"ace\"\n            case .Jack:\n                return \"jack\"\n            case .Queen:\n                return \"queen\"\n            case .King:\n                return \"king\"\n            default:\n                return String(self.toRaw())\n        }\n    }\n}\nlet ace = Rank.Ace\nlet aceRawValue = ace.toRaw()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-67.swift",
    "content": "if let convertedRank = Rank.fromRaw(3) {\n    let threeDescription = convertedRank.simpleDescription()\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-69.swift",
    "content": "enum Suit {\n    case Spades, Hearts, Diamonds, Clubs\n    func simpleDescription() -> String {\n        switch self {\n            case .Spades:\n                return \"spades\"\n            case .Hearts:\n                return \"hearts\"\n            case .Diamonds:\n                return \"diamonds\"\n            case .Clubs:\n                return \"clubs\"\n        }\n    }\n}\nlet hearts = Suit.Hearts\nlet heartsDescription = hearts.simpleDescription()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-7.swift",
    "content": "let implicitInteger = 70\nlet implicitDouble = 70.0\nlet explicitDouble: Double = 70\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-71.swift",
    "content": "struct Card {\n    var rank: Rank\n    var suit: Suit\n    func simpleDescription() -> String {\n        return \"The \\(rank.simpleDescription()) of \\(suit.simpleDescription())\"\n    }\n}\nlet threeOfSpades = Card(rank: .Three, suit: .Spades)\nlet threeOfSpadesDescription = threeOfSpades.simpleDescription()\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-73.swift",
    "content": "enum ServerResponse {\n    case Result(String, String)\n    case Error(String)\n}\n\nlet success = ServerResponse.Result(\"6:00 am\", \"8:09 pm\")\nlet failure = ServerResponse.Error(\"Out of cheese.\")\n\nswitch success {\n    case let .Result(sunrise, sunset):\n        let serverResponse = \"Sunrise is at \\(sunrise) and sunset is at \\(sunset).\"\n    case let .Error(error):\n        let serverResponse = \"Failure...  \\(error)\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-75.swift",
    "content": "protocol ExampleProtocol {\n     var simpleDescription: String { get }\n     mutating func adjust()\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-77.swift",
    "content": "class SimpleClass: ExampleProtocol {\n     var simpleDescription: String = \"A very simple class.\"\n     var anotherProperty: Int = 69105\n     func adjust() {\n          simpleDescription += \"  Now 100% adjusted.\"\n     }\n}\nvar a = SimpleClass()\na.adjust()\nlet aDescription = a.simpleDescription\n\nstruct SimpleStructure: ExampleProtocol {\n     var simpleDescription: String = \"A simple structure\"\n     mutating func adjust() {\n          simpleDescription += \" (adjusted)\"\n     }\n}\nvar b = SimpleStructure()\nb.adjust()\nlet bDescription = b.simpleDescription\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-79.swift",
    "content": "extension Int: ExampleProtocol {\n    var simpleDescription: String {\n        return \"The number \\(self)\"\n    }\n    mutating func adjust() {\n        self += 42\n    }\n }\n7.simpleDescription\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-81.swift",
    "content": "let protocolValue: ExampleProtocol = a\nprotocolValue.simpleDescription\n// protocolValue.anotherProperty  // Uncomment to see the error\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-83.swift",
    "content": "func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {\n    var result = ItemType[]()\n    for i in 0..times {\n         result += item\n    }\n    return result\n}\nrepeat(\"knock\", 4)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-85.swift",
    "content": "// Reimplement the Swift standard library's optional type\nenum OptionalValue<T> {\n    case None\n    case Some(T)\n}\nvar possibleInteger: OptionalValue<Int> = .None\npossibleInteger = .Some(100)\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-87.swift",
    "content": "func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool {\n    for lhsItem in lhs {\n        for rhsItem in rhs {\n            if lhsItem == rhsItem {\n                return true\n            }\n        }\n    }\n   return false\n}\nanyCommonElements([1, 2, 3], [3])\n"
  },
  {
    "path": "src/test/resources/samples/langs/Swift/section-9.swift",
    "content": "let label = \"The width is \"\nlet width = 94\nlet widthLabel = label + String(width)\n"
  },
  {
    "path": "src/test/resources/samples/langs/SystemVerilog/endpoint_phy_wrapper.svh",
    "content": "module endpoint_phy_wrapper\n  (\n   input clk_sys_i,\n   input clk_ref_i,\n   input clk_rx_i,\n   input rst_n_i,\n\n   IWishboneMaster.master src,\n   IWishboneSlave.slave snk,\n   IWishboneMaster.master sys,\n   \n   output [9:0] td_o,\n   input [9:0] rd_i,\n\n   output txn_o,\n   output txp_o,\n\n   input rxn_i,\n   input rxp_i\n   );\n\n   wire rx_clock;\n   \n   parameter g_phy_type   = \"GTP\";   \n\n   wire[15:0] gtx_data;\n   wire [1:0]gtx_k;\n   wire gtx_disparity;\n   wire gtx_enc_error;\n   wire [15:0] grx_data;\n   wire grx_clk;\n   wire [1:0]grx_k;\n   wire grx_enc_error;\n   wire [3:0] grx_bitslide;\n   wire gtp_rst;\n   wire tx_clock;\n   \n   generate\n      if(g_phy_type == \"TBI\") begin\n\n         assign rx_clock  = clk_ref_i;\n         assign tx_clock  = clk_rx_i;\n         \n         \n         wr_tbi_phy U_Phy \n           (\n            .serdes_rst_i (gtp_rst),\n            .serdes_loopen_i(1'b0),\n            .serdes_prbsen_i(1'b0),\n            .serdes_enable_i(1'b1), \n            .serdes_syncen_i(1'b1),\n\n            .serdes_tx_data_i  (gtx_data[7:0]),\n            .serdes_tx_k_i     (gtx_k[0]),\n            .serdes_tx_disparity_o (gtx_disparity),\n            .serdes_tx_enc_err_o   (gtx_enc_error),\n\n            .serdes_rx_data_o      (grx_data[7:0]),\n            .serdes_rx_k_o        (grx_k[0]),\n            .serdes_rx_enc_err_o  (grx_enc_error),\n            .serdes_rx_bitslide_o (grx_bitslide),\n\n\n            .tbi_refclk_i (clk_ref_i),\n            .tbi_rbclk_i  (clk_rx_i),\n\n            .tbi_td_o     (td_o),\n            .tbi_rd_i     (rd_i),\n            .tbi_syncen_o (),\n            .tbi_loopen_o (),\n            .tbi_prbsen_o (),\n            .tbi_enable_o ()\n            );\n\n      end else if (g_phy_type == \"GTX\") begin // if (g_phy_type == \"TBI\")\n         wr_gtx_phy_virtex6\n           #(\n             .g_simulation(1)\n             ) U_PHY \n             (\n              .clk_ref_i(clk_ref_i),\n              \n              .tx_clk_o   (tx_clock),\n              .tx_data_i (gtx_data),\n              .tx_k_i (gtx_k),\n              .tx_disparity_o (gtx_disparity),\n              .tx_enc_err_o(gtx_enc_error),\n              .rx_rbclk_o (rx_clock),\n              .rx_data_o (grx_data),\n              .rx_k_o  (grx_k),\n              .rx_enc_err_o (grx_enc_error),\n              .rx_bitslide_o  (),\n\n              .rst_i    (!rst_n_i),\n              .loopen_i (1'b0),\n\n              .pad_txn_o (txn_o),\n              .pad_txp_o (txp_o),\n\n              .pad_rxn_i (rxn_i),\n              .pad_rxp_i (rxp_i)\n    );\n                   \n      end  else if (g_phy_type == \"GTP\") begin // if (g_phy_type == \"TBI\")\n         assign #1 tx_clock  = clk_ref_i;\n         \n         wr_gtp_phy_spartan6\n           #(\n             .g_simulation(1)\n             ) U_PHY \n             (\n              .gtp_clk_i(clk_ref_i),\n              .ch0_ref_clk_i(clk_ref_i),\n              \n              .ch0_tx_data_i (gtx_data[7:0]),\n              .ch0_tx_k_i (gtx_k[0]),\n              .ch0_tx_disparity_o (gtx_disparity),\n              .ch0_tx_enc_err_o(gtx_enc_error),\n              .ch0_rx_rbclk_o (rx_clock),\n              .ch0_rx_data_o (grx_data[7:0]),\n              .ch0_rx_k_o  (grx_k[0]),\n              .ch0_rx_enc_err_o (grx_enc_error),\n              .ch0_rx_bitslide_o  (),\n\n              .ch0_rst_i    (!rst_n_i),\n              .ch0_loopen_i (1'b0),\n\n              .pad_txn0_o (txn_o),\n              .pad_txp0_o (txp_o),\n\n              .pad_rxn0_i (rxn_i),\n              .pad_rxp0_i (rxp_i)\n              );\n         \n      end // else: !if(g_phy_type == \"TBI\")\n   endgenerate\n   \n   wr_endpoint\n     #(\n       .g_simulation          (1),\n       .g_pcs_16bit(g_phy_type == \"GTX\" ? 1: 0),\n       .g_rx_buffer_size (1024),\n       .g_with_rx_buffer(0),\n       .g_with_timestamper    (1),\n       .g_with_dmtd           (0),\n       .g_with_dpi_classifier (1),\n       .g_with_vlans          (0),\n       .g_with_rtu            (0)\n       ) DUT (\n              .clk_ref_i (clk_ref_i),\n              .clk_sys_i (clk_sys_i),\n              .clk_dmtd_i (clk_ref_i),\n              .rst_n_i  (rst_n_i),\n              .pps_csync_p1_i (1'b0),\n\n              .phy_rst_o   (),\n              .phy_loopen_o (),\n              .phy_enable_o (),\n              .phy_syncen_o (),\n\n              .phy_ref_clk_i      (tx_clock),\n              .phy_tx_data_o      (gtx_data),\n              .phy_tx_k_o         (gtx_k),\n              .phy_tx_disparity_i (gtx_disparity),\n              .phy_tx_enc_err_i   (gtx_enc_error),\n\n              .phy_rx_data_i     (grx_data),\n              .phy_rx_clk_i      (rx_clock),\n              .phy_rx_k_i        (grx_k),\n              .phy_rx_enc_err_i  (grx_enc_error),\n              .phy_rx_bitslide_i (5'b0),\n\n              .src_dat_o   (snk.dat_i),\n              .src_adr_o   (snk.adr),\n              .src_sel_o   (snk.sel),\n              .src_cyc_o   (snk.cyc),\n              .src_stb_o   (snk.stb),\n              .src_we_o    (snk.we),\n              .src_stall_i (snk.stall),\n              .src_ack_i   (snk.ack),\n              .src_err_i(1'b0),\n\n              .snk_dat_i   (src.dat_o[15:0]),\n              .snk_adr_i   (src.adr[1:0]),\n              .snk_sel_i   (src.sel[1:0]),\n              .snk_cyc_i   (src.cyc),\n              .snk_stb_i   (src.stb),\n              .snk_we_i    (src.we),\n              .snk_stall_o (src.stall),\n              .snk_ack_o   (src.ack),\n              .snk_err_o   (src.err),\n              .snk_rty_o   (src.rty),\n\n              .txtsu_ack_i (1'b1),\n\n              .rtu_full_i (1'b0),\n              .rtu_almost_full_i (1'b0),\n              .rtu_rq_strobe_p1_o  (),\n              .rtu_rq_smac_o  (),\n              .rtu_rq_dmac_o (),\n              .rtu_rq_vid_o  (),\n              .rtu_rq_has_vid_o (),\n              .rtu_rq_prio_o (),\n              .rtu_rq_has_prio_o (),\n\n              .wb_cyc_i(sys.cyc),\n              .wb_stb_i (sys.stb),\n              .wb_we_i (sys.we),\n              .wb_sel_i(sys.sel),\n              .wb_adr_i(sys.adr[7:0]),\n              .wb_dat_i(sys.dat_o),\n              .wb_dat_o(sys.dat_i),\n              .wb_ack_o (sys.ack)\n    );\n\nendmodule // endpoint_phy_wrapper\n"
  },
  {
    "path": "src/test/resources/samples/langs/SystemVerilog/fifo.sv",
    "content": "module fifo (\n    input           clk_50,\n    input           clk_2,\n    input           reset_n,\n    output [7:0]    data_out,\n    output          empty\n);\n"
  },
  {
    "path": "src/test/resources/samples/langs/SystemVerilog/priority_encoder.sv",
    "content": "// http://hdlsnippets.com/parameterized_priority_encoder\nmodule priority_encoder #(parameter INPUT_WIDTH=8,OUTPUT_WIDTH=3)\n(\n input  logic [INPUT_WIDTH-1:0]  input_data,\n output logic [OUTPUT_WIDTH-1:0] output_data\n);\n \nint ii;\n \nalways_comb\nbegin\n  output_data = 'b0;\n\tfor(ii=0;ii<INPUT_WIDTH;ii++)\n\t\tif (input_data[ii])\n\t\t\toutput_data = ii[OUTPUT_WIDTH-1:0];\nend\n\nendmodule\n"
  },
  {
    "path": "src/test/resources/samples/langs/SystemVerilog/util.vh",
    "content": "function integer log2;\n  input integer x;\n  begin\n    x = x-1;\n    for (log2 = 0; x > 0; log2 = log2 + 1)\n      x = x >> 1;\n  end\nendfunction\n"
  },
  {
    "path": "src/test/resources/samples/langs/TI Program/srcalpha.8xp.txt",
    "content": ".AlphaCS\n#ExprOff\nIf getKey(41)\n\tsub(ADM)\nEnd\nLbl START\n\"appv alpha \"->Str1\n\"appvAlphaCS\"->Str2\n.ALPHA CS\n[7EFFFFE7FFFFE7E7]->Pic11\n[E0E0E0E0E0FFFF7F]->Pic12\n[FEFFE7FFFEE0E0E0]->Pic13\n[E7E7E7FFFFE7E7E7]->Pic14\n[7EFFFFE7FFFFE7E7]->Pic15\n[7FFFFFE0E0FFFF7F]->Pic16\n[7FFFFF781EFFFFFE]->Pic17\n.arch\n[0038447C44440000]->Pic21\n.hide\n[0054004400540000]->Pic22\n.lock\n[0038447C7C7C0000]->Pic23\n.(c) Scott Mangiapane\nData(72,8)->GDB0\n[42600A360008000100994DDF2A6C61B1B28091294A22AAAAAAAB005A6DCA226A69B9A9800000000000202000000000000000C0200000000000000000000000000000000000000000]\n.icon unknown\nData(16,16)->GDB11\n[EFFEA803EB8308032BFB28032BFB0803EBFBA803EBFB08032B8328032FFF07FF]\n.icon SRC\nData(16,16)->GDB12\n[01801A583E7C3FFC3FFC3E7C1A580A500240FFFFC471BDAFCC6FF5AF8DB1FFFF]\n.icon ASM\nData(16,16)->GDB13\n[FFFFFFFFFFFFFFFFFFFFCE6BB5D586D5B75DB4DDFFFFFFFFFFFFFFFFFFFFFFFF]\n.icon shell\nData(16,16)->GDB14\n[FFFFFFFFFFFFFFFFFFFFFFFF97B5B155D5359595FFFFFFFFFFFFFFFFFFFFFFFF]\nGoto SET\nprgmSRCFUNC\nprgmSRCGUI\nprgmSRCSORT\nLbl SET\n.start, set up\nClrDraw\nStoreGDB \nDiagnosticOff\nFix 5\nFull\n!If GetCalc(Str1,[Y1])\n\tsub(NEW)\n\tStoreGDB \nEnd\nGetCalc(Str1,[Y1])\nIf {[Y1]+0}\n\t!If sub(CODE)\n\t\tGoto END\n\tEnd\nEnd\nAsm(FDCB249E)\nIf {[Y1]+6}\n\tAsm(FDCB24DE)\nEnd\nGoto DLIST"
  },
  {
    "path": "src/test/resources/samples/langs/TI Program/srcfunc.8xp.txt",
    "content": ".FUNC AlphaCS\nLbl ADM\nDiagnosticOff\nFix 5\nFull\nStoreGDB \nsub(D2,13,17,70,29,\"Admin Access\")\nsub(D1,15,27)\nText(15,37,\"Admin Code:  -   -   -   -\")\nDispGraph\nRepeat getKey->A\nEnd\nText(55,37,\"*\")\nDispGraph\nRepeat getKey->B\nEnd\nText(62,37,\"*\")\nDispGraph\nRepeat getKey->C\nEnd\nText(69,37,\"*\")\nDispGraph\nRepeat getKey->D\nEnd\nText(76,37,\"*\")\nDispGraph\nNormal\nPause 100\nFull\nIf (A!=20) or (B!=35) or (C!=18) or (D!=27)\n\tGoto END\nEnd\nsub(D2,13,17,70,29,\"Author Info\")\nsub(D1,15,27)\nBitmap(15,38,GDB0)\nDispGraph\nRepeat (getKey) and (getKey(9))\nEnd\nDelVar \"appv alpha \"\nReturn\nLbl D1\n.draws title\nPt-On([r1]+1,[r2]+1,Pic11)\nPt-On([r1]+10,[r2]+1,Pic12)\nPt-On([r1]+19,[r2]+1,Pic13)\nPt-On([r1]+28,[r2]+1,Pic14)\nPt-On([r1]+37,[r2]+1,Pic15)\nPt-On([r1]+48,[r2]+1,Pic16)\nPt-On([r1]+57,[r2]+1,Pic17)\nRectI([r1],[r2],66,10)\nPxl-Off([r1],[r2])\nRectI([r1]+14,[r2],4,5)\nRectI([r1]+23,[r2]+7,4,3)\nRectI([r1]+46,[r2]+1,1,8)\nRectI([r1]+45,[r2],3,1)\nRectI([r1]+46,[r2]+9,2,1)\nPxl-Off([r1]+65,[r2]+9)\nReturn\nLbl D2\n.windows\nRect([r1]+1,[r2],[r3]-2,[r4])\nRect([r1],[r2]+1,[r3],[r4]-2)\nRectI([r1]+1,[r2]+1,[r3]-2,[r4]-2)\nText([r1]+2,[r2]+2,[r5])\nRectI([r1]+1,[r2]+1,[r3]-2,8)\nPt-Off([r1]+[r3]-9,[r2]+1,[C1BEAAB6AABEC1FF])\nPxl-On([r1]+1,[r2]+[r4]-2)\nPxl-On([r1]+[r3]-2,[r2]+[r4]-2)\nReturn\nLbl D3\n.archiving box\nsub(D2,15,22,66,20,\"Archiving...\")\nText(17,31,\"Please wait...\")\nReturn\nLbl CODE\nsub(D2,15,22,66,20,\"Access Denied\")\nText(29,32,\" -      -      -      - \")\nDispGraph\n1->[r2]\nRepeat getKey->[r1]\nEnd\nText(29,32,\"*\")\nDispGraph\nIf [r1]!=({[Y1]+1})\n\t0->[r2]\nEnd\nRepeat getKey->[r1]\nEnd\nText(39,32,\"*\")\nDispGraph\nIf [r1]!=({[Y1]+2})\n\t0->[r2]\nEnd\nRepeat getKey->[r1]\nEnd\nText(49,32,\"*\")\nDispGraph\nIf [r1]!=({[Y1]+3})\n\t0->[r2]\nEnd\nRepeat getKey->[r1]\nEnd\nText(59,32,\"*\")\nDispGraph\nIf [r1]!=({[Y1]+4})\n\t0->[r2]\nEnd\nNormal\nPause 200\nFull\nReturn[r2]\nLbl NEW\nClrDraw\nsub(D1,0,0)\nRectI(0,11,96,1)\nText(1,12,\"Installation\")\nText(1,20,\"Enter your new keycode:\")\nText(1,26,\" -  -  -  - \")\nDispGraph\nGetCalc(Str1,16)->[r1]\nFill([r1],16,1)\n0->{[r1]}\nRepeat getKey->[r2]\nEnd\n[r2]->{[r1]+1}\nText(1,26,\"*\")\nDispGraph\nRepeat getKey->[r2]\nEnd\n[r2]->{[r1]+2}\nText(7,26,\"*\")\nDispGraph\nRepeat getKey->[r2]\nEnd\n[r2]->{[r1]+3}\nText(13,26,\"*\")\nDispGraph\nRepeat getKey->[r2]\nEnd\n[r2]->{[r1]+4}\nText(19,26,\"*\")\nDispGraph\nFill(L1,50,0)\nText(1,34,\"Confirm keycode:\")\nText(1,40,\" -  -  -  - \")\nDispGraph\nRepeat getKey->[r2]\nEnd\n[r2]->{L1+1}\nText(1,40,\"*\")\nDispGraph\nRepeat getKey->[r2]\nEnd\n[r2]->{L1+2}\nText(7,40,\"*\")\nDispGraph\nRepeat getKey->[r2]\nEnd\n[r2]->{L1+3}\nText(13,40,\"*\")\nDispGraph\nRepeat getKey->[r2]\nEnd\n[r2]->{L1+4}\nText(19,40,\"*\")\nDispGraph\nIf ({[r1]+1}={L1+1}) and ({[r1]+2}={L1+2}) and ({[r1]+3}={L1+3}) and ({[r1]+4}={L1+4})\n\tsub(D3)\n\tDispGraph\n\tGetCalc(Str2,10)\n\tArchive Str1\n\tGetCalc(Str1,[Y1])\n\tClrDraw\n\tReturn\n\tElse\n\tText(1,48,\"ERROR keycodes do not\")\n\tText(1,54,\"match.\")\n\tDispGraph\n\tUnArchive Str1\n\tDelVar Str1\n\tRepeat getKey\n\tEnd\n\tGoto END\nEnd\nReturn\nLbl END\nAsm(FDCB249E)\nIf {[Y1]+6}\n\tAsm(FDCB24DE)\nEnd\nClrDraw\nClrDraw^^r\nClrHome\nReturn^^r"
  },
  {
    "path": "src/test/resources/samples/langs/TI Program/srcgui.8xp.txt",
    "content": ".GUI AlphaCS\n#Axiom(RUNPRGM)\n#Axiom(ZSTAXE)\nLbl DLIST\nClrDraw\nClrDraw^^r\nsub(D1,0,0)\nRectI(0,11,96,1)\n!If sub(POLAR,1)\n\tRectI(0,63,96,1)\n\tText(1,13,\"No programs found.\")\n\tDispGraph\n\tGoto KLIST2\n\tElse\n\tFill(L5,50,0)\n\tCopy(L1,L5,20)\n\t13->B->G\n\t0->I\n\t1->H\n\tText(1,13,L2)\n\tIf D\n\t\tPt-On(77,13,Pic21)\n\tEnd\n\tIf E\n\t\tPt-On(83,13,Pic22)\n\tEnd\n\tIf F\n\t\tPt-On(89,13,Pic23)\n\tEnd\n\tFor(S,1,6)\n\t\tIf sub(ADJ,1)\n\t\t\tS*7+13->G\n\t\t\tText(1,S*7+13,L2)\n\t\t\tIf D\n\t\t\t\tPt-On(77,S*7+13,Pic21)\n\t\t\tEnd\n\t\t\tIf E\n\t\t\t\tPt-On(83,S*7+13,Pic22)\n\t\t\tEnd\n\t\t\tIf F\n\t\t\t\tPt-On(89,S*7+13,Pic23)\n\t\t\tEnd\n\t\tEnd\n\tEnd\nEnd\nFill(L4,50,0)\nCopy(L1,L4,20)\nLbl KLIST1\nRect(90,0,6,10)\nRectI(90,0,6,10)\n0->S->T\nsub(POLAR,1)\nIf Equ>String(L1,L5)\n\tS++\nEnd\nsub(POLAR,0)\nIf Equ>String(L1,L4)\n\tT++\nEnd\nIf (S) and (T)\n\tPt-On(90,6,[F870200000000000])\n\tPt-On(90,2,[2070F80000000000])\n\tElse\n\tIf S\n\t\tPt-On(90,4,[2070F80000000000])\n\tEnd\n\tIf T\n\t\tPt-On(90,4,[F870200000000000])\n\tEnd\nEnd\nRectI(0,63,96,1)\nRectI(0,B,96,7)\nDispGraph\nRectI(0,B,96,7)\nRectI(0,63,96,1)\nIf getKey(15)\n\tGoto DLIST\nEnd\nRepeat getKey\n\tIf getKey(41)\n\t\tRepeat getKey(41)=0\n\t\tEnd\n\t\tAsm(3E01D303FB76)\n\t\tRepeat getKey(41)=0\n\t\tEnd\n\tEnd\nEnd\nIf getKey(48)\n\tGoto DSET1\nEnd\nIf (getKey(9)) or (getKey(54))\n\tFill(L1,50,0)\n\tCopy(L5,L1,20)\n\tIf (B-13/7)=0\n\t\tFill(L1,50,0)\n\t\tCopy(L5+1,L1,20)\n\t\tsub(DATA)\n\t\tElse\n\t\tFor(B-13/7)\n\t\t\tsub(ADJ,1)\n\t\tEnd\n\tEnd\n\tGoto DPRGM1\nEnd\nIf getKey(4)\n\tIf (B!=13)\n\t\tFor(S,0,7)\n\t\t\tRectI(0,63,96,1)\n\t\t\tRectI(0,B-S,96,7)\n\t\t\tDispGraph\n\t\t\tRectI(0,B-S,96,7)\n\t\t\tRectI(0,63,96,1)\n\t\tEnd\n\t\tB-7->B\n\t\tElse\n\t\tsub(POLAR,1)\n\t\tIf Equ>String(L1,L5)\n\t\t\tFill(L1,50,0)\n\t\t\tCopy(L4,L1,20)\n\t\t\tsub(ADJ,0)\n\t\t\tFill(L4,50,0)\n\t\t\tCopy(L1,L4,20)\n\t\t\tFill(L1,50,0)\n\t\t\tCopy(L5,L1,20)\n\t\t\tsub(ADJ,0)\n\t\t\tFill(L5,50,0)\n\t\t\tCopy(L1,L5,20)\n\t\t\tFill(L1,50,0)\n\t\t\tCopy(L4,L1,20)\n\t\t\tRect(0,0,96,13)\n\t\t\tRectI(0,0,96,13)\n\t\t\tFor(7)\n\t\t\t\tVertical+\n\t\t\tEnd\n\t\t\tRect(0,62,96,2)\n\t\t\tRectI(0,62,96,2)\n\t\t\tText(1,13,L2)\n\t\t\tIf D\n\t\t\t\tPt-On(77,13,Pic21)\n\t\t\tEnd\n\t\t\tIf E\n\t\t\t\tPt-On(83,13,Pic22)\n\t\t\tEnd\n\t\t\tIf F\n\t\t\t\tPt-On(89,13,Pic23)\n\t\t\tEnd\n\t\t\tRect(0,0,96,13)\n\t\t\tRectI(0,0,96,13)\n\t\t\tsub(D1,0,0)\n\t\t\tRectI(0,11,96,1)\n\t\tEnd\n\tEnd\nEnd\nIf getKey(1)\n\tIf (B!=G)\n\t\tFor(S,0,7)\n\t\t\tRectI(0,63,96,1)\n\t\t\tRectI(0,B+S,96,7)\n\t\t\tDispGraph\n\t\t\tRectI(0,B+S,96,7)\n\t\t\tRectI(0,63,96,1)\n\t\tEnd\n\t\tB+7->B\n\t\tElse\n\t\tsub(POLAR,0)\n\t\tIf Equ>String(L1,L4)\n\t\t\tFill(L1,50,0)\n\t\t\tCopy(L5,L1,20)\n\t\t\tsub(ADJ,1)\n\t\t\tFill(L5,50,0)\n\t\t\tCopy(L1,L5,20)\n\t\t\tFill(L1,50,0)\n\t\t\tCopy(L4,L1,20)\n\t\t\tsub(ADJ,1)\n\t\t\tFill(L4,50,0)\n\t\t\tCopy(L1,L4,20)\n\t\t\tFor(7)\n\t\t\t\tVertical-\n\t\t\tEnd\n\t\t\tText(1,55,L2)\n\t\t\tIf D\n\t\t\t\tPt-On(77,55,Pic21)\n\t\t\tEnd\n\t\t\tIf E\n\t\t\t\tPt-On(83,55,Pic22)\n\t\t\tEnd\n\t\t\tIf F\n\t\t\t\tPt-On(89,55,Pic23)\n\t\t\tEnd\n\t\t\tRect(0,0,96,13)\n\t\t\tRectI(0,0,96,13)\n\t\t\tsub(D1,0,0)\n\t\t\tRectI(0,11,96,1)\n\t\tEnd\n\tEnd\nEnd\nIf getKey(15)\n\tGoto END\nEnd\nGoto KLIST1\nLbl KLIST2\nIf getKey(15)\n\tGoto DLIST\nEnd\nRepeat getKey\n\tIf getKey(41)\n\t\tRepeat getKey(41)=0\n\t\tEnd\n\t\tAsm(3E01D303FB76)\n\t\tRepeat getKey(41)=0\n\t\tEnd\n\tEnd\nEnd\nIf getKey(48)\n\tGoto DSET1\nEnd\nIf getKey(15)\n\tGoto END\nEnd\nGoto KLIST2\nLbl DPRGM1\nGetCalc(\"appv alpha \",[Y1])\n13->B\nD->X\nE->Y\nF->Z\nLbl DPRGM2\nGetCalc(L1,[Y3])\n0->H\nIf ({[Y3]+0}=187) and ({[Y3]+1}=109)\n\t1->H\n\tIf {[Y3]+2}=201\n\t\t2->H\n\tEnd\n\tIf {[Y3]+3}=201\n\t\t3->H\n\tEnd\nEnd\nIf {[Y3]+0}=58\n\t4->H\nEnd\nClrDraw\nClrDraw^^r\nsub(D1,0,0)\nRectI(0,11,96,1)\nText(1,49,L2)\nRectI(0,48,96,16)\n69->S\nIf Z\n\tPt-Change(S,56,Pic23)\n\tS-6->S\nEnd\nIf Y\n\tPt-Change(S,56,Pic22)\n\tS-6->S\nEnd\nIf X\n\tPt-Change(S,56,Pic21)\nEnd\nRectI(1,56,94,7)\nText(2,56,\"size: \",{[Y3]-2}^^r>Dec)\nText(1,13,\"Run (with zStart)\")\nIf X\n\tText(1,20,\"Unarchive PRGM\")\n\tElse\n\tText(1,20,\"Archive PRGM\")\nEnd\nIf Y\n\tText(1,27,\"Unhide PRGM\")\n\tElse\n\tText(1,27,\"Hide PRGM\")\nEnd\nIf Z\n\tText(1,34,\"Unlock PRGM\")\n\tElse\n\tText(1,34,\"Lock PRGM\")\nEnd\nRect(76,44,20,20)\nRectI(77,45,18,18)\nIf H=0\n\tBitmap(78,46,GDB11)\nEnd\nIf H=1\n\tBitmap(78,46,GDB13)\nEnd\nIf H=2\n\tBitmap(78,46,GDB14)\nEnd\nIf H=3\n\tBitmap(78,46,GDB14)\nEnd\nIf H=4\n\tBitmap(78,46,GDB12)\nEnd\nLbl KPRGM\nRectI(0,B,96,7)\nDispGraph\nRectI(0,B,96,7)\nRepeat getKey\nEnd\nIf (getKey(9)) or (getKey(54))\n\tIf B=13\n\t\tsub(SETPRGM)\n\t\tGoto RUN\n\t\tElse\n\t\tFill(L2,20,0)\n\t\tCopy(L1+1,L2,20)\n\t\tFill(L1,20,0)\n\t\tCopy(L2,L1,20)\n\t\tsub(DATA)\n\t\tIf B=20\n\t\t\tIf X\n\t\t\t\t0->X\n\t\t\t\tElse\n\t\t\t\t1->X\n\t\t\tEnd\n\t\t\tGoto DPRGM2\n\t\tEnd\n\t\tIf B=27\n\t\t\tIf Y\n\t\t\t\t0->Y\n\t\t\t\tElse\n\t\t\t\t1->Y\n\t\t\tEnd\n\t\t\tGoto DPRGM2\n\t\tEnd\n\t\tIf B=34\n\t\t\tIf Z\n\t\t\t\t0->Z\n\t\t\t\tElse\n\t\t\t\t1->Z\n\t\t\tEnd\n\t\t\tGoto DPRGM2\n\t\tEnd\n\tEnd\nEnd\nIf (getKey(4)) and (B!=13)\n\tFor(S,0,7)\n\t\tRectI(0,B-S,96,7)\n\t\tDispGraph\n\t\tRectI(0,B-S,96,7)\n\t\tNormal\n\t\tPause 3\n\t\tFull\n\tEnd\n\tB-7->B\nEnd\nIf ((getKey(1)) and (B!=34)\n\tFor(S,0,7)\n\t\tRectI(0,B+S,96,7)\n\t\tDispGraph\n\t\tRectI(0,B+S,96,7)\n\t\tNormal\n\t\tPause 3\n\t\tFull\n\tEnd\n\tB+7->B\nEnd\nIf getKey(15)\n\tsub(SETPRGM)\n\tGoto DLIST\nEnd\nGoto KPRGM\nLbl SETPRGM\nIf (X!=D) or (Y!=E) or (Z!=F)\n\tIf X\n\t\tsub(D3)\n\t\tDispGraph\n\tEnd\n\tUnArchive L1\n\tX->D\n\tIf (E!=Y)\n\t\tIf Y\n\t\t\t{C-7}-64->{C-7}\n\t\t\t{L1+1}-64->{L1+1}\n\t\t\tElse\n\t\t\t{C-7}+64->{C-7}\n\t\t\t{L1+1}+64->{L1+1}\n\t\tEnd\n\t\tY->E\n\tEnd\n\tIf (F!=Z)\n\t\tIf Z\n\t\t\t6->{C}\n\t\t\t|E06->{L1}\n\t\t\tElse\n\t\t\t5->{C}\n\t\t\t|E05->{L1}\n\t\tEnd\n\t\tZ->F\n\tEnd\n\tIf X\n\t\tArchive L1\n\tEnd\nEnd\nGetCalc(L1,[Y3])\nReturn\nLbl RUN\nGetCalc(\"appv hold \",20)->S\nFill(S,20,0)\nCopy(L1+1,S,10)\nA->{S+15}\nDiagnosticOn\nFix 4\nNormal\nIf D\n\tGetCalc(\"appvzRun\",{[Y3]-2}^^r)->S\n\tCopy([Y3],S,{[Y3]-2}^^r)\nEnd\n2-SampZInt(|LRUNERR)\nIf D\n\tFpdf(\"appvzRun\")\n\tElse\n\tFpdf(L1)\nEnd\n2-SampTInt \nDelVar \"appvzRun\"\nGetCalc(\"appv hold \")->S\nFill(L1,20,0)\nCopy(S,L1,10)\n{S+15}->A\nsub(DATA)\nDelVar \"appv hold \"\nDiagnosticOff\nFix 5\nFull\nRepeat getKey=0\nEnd\nGoto DPRGM1\nLbl RUNERR\n2-SampFTest ->S\nDelVar \"appvzRun\"\nDiagnosticOff\nFix 5\nFull\nsub(D2,10,22,76,20,\"Error\")\nIf S=8\n\tText(12,31,\"Syntax\")\n\tElse\n\tText(12,31,\"Error \"[23]\"\",S>Dec)\nEnd\nDispGraph\nRepeat (getKey) and (getKey(9))\nEnd\nGetCalc(\"appv hold \")->S\nFill(L1,20,0)\nCopy(S,L1,10)\n{S+15}->A\nsub(DATA)\nDelVar \"appv hold \"\nDiagnosticOff\nFix 5\nFull\nRepeat getKey=0\nEnd\nGoto DPRGM1\nLbl DSET1\n21->B\n{[Y1]+5}->X\n{[Y1]}->Y\n{[Y1]+6}->Z\nLbl DSET2\nClrDraw\nsub(D1,0,0)\nRectI(0,11,96,1)\nText(1,12,\"by ClrDraw, Nov 2013, v 1\")\nRectI(0,19,96,1)\nRectI(0,63,96,1)\nIf X\n\tText(1,21,\"Show Hidden On\")\n\tElse\n\tText(1,21,\"Show Hidden Off\")\nEnd\nIf Y\n\tText(1,28,\"Password On\")\n\tElse\n\tText(1,28,\"Password Off\")\nEnd\nIf Z\n\tText(1,35,\"Lowercase On\")\n\tElse\n\tText(1,35,\"Lowercase Off\")\nEnd\nText(1,42,\"Uninstall AlphaCS\")\nLbl KSET\nRectI(0,B,96,7)\nDispGraph\nRectI(0,B,96,7)\nRepeat getKey\nEnd\nIf (getKey(54)) or (getKey(9))\n\tIf B=21\n\t\tIf X\n\t\t\t0->X\n\t\t\tElse\n\t\t\t1->X\n\t\tEnd\n\t\tGoto DSET2\n\tEnd\n\tIf B=28\n\t\tIf Y\n\t\t\t0->Y\n\t\t\tElse\n\t\t\t1->Y\n\t\tEnd\n\t\tGoto DSET2\n\tEnd\n\tIf B=35\n\t\tIf Z\n\t\t\t0->Z\n\t\t\tElse\n\t\t\t1->Z\n\t\tEnd\n\t\tGoto DSET2\n\tEnd\n\tIf B=42\n\t\tIf sub(CODE)\n\t\t\tDelVar Str1\n\t\t\tGoto END\n\t\t\tElse\n\t\t\tGoto DSET2\n\t\tEnd\n\tEnd\nEnd\nIf (getKey(4)) and (B!=21)\n\tFor(7)\n\t\tRectI(0,B,96,7)\n\t\tDispGraph\n\t\tRectI(0,B,96,7)\n\t\tB--\n\t\tNormal\n\t\tPause 3\n\t\tFull\n\tEnd\nEnd\nIf (getKey(1)) and (B!=42)\n\tFor(7)\n\t\tRectI(0,B,96,7)\n\t\tDispGraph\n\t\tRectI(0,B,96,7)\n\t\tB++\n\t\tNormal\n\t\tPause 3\n\t\tFull\n\tEnd\nEnd\nIf getKey(15)\n\tIf ({[Y1]+5}!=X) or ({[Y1]}!=Y) or ({[Y1]+6}!=Z)\n\t\tUnArchive Str1\n\t\tGetCalc(Str1)->S\n\t\tX->{S+5}\n\t\tY->{S}\n\t\tZ->{S+6}\n\t\tsub(D3)\n\t\tDispGraph\n\t\tArchive Str1\n\t\tGetCalc(Str1,[Y1])\n\tEnd\n\tRepeat getKey=0\n\tEnd\n\tGoto DLIST\nEnd\nGoto KSET"
  },
  {
    "path": "src/test/resources/samples/langs/TI Program/srcsort.8xp.txt",
    "content": ".SORT AlphaCS\nLbl POLAR\nFill(L1,50,0)\n{|E9830}^^r->[r2]\nRepeat (({[r2]}=5) or ({[r2]}=6)) and (({[r2]-7}>48) or (({[Y1]+5}) and ({[r2]-7}<28)))\n\t[r2]-{[r2]-6}-7->[r2]\n\tIf [r2]<={|E982E}^^r\n\t\tReturn0\n\tEnd\nEnd\nFor([r3],1,{[r2]-6})\n\t{[r2]-6-[r3]}->{L1+[r3]-1}\nEnd\n[r2]-{[r2]-6}-7->[r2]\nRepeat 0\n\tIf (({[r2]}=5) or ({[r2]}=6)) and (({[r2]-7}>48) or (({[Y1]+5}) and ({[r2]-7}<28)))\n\t\tFill(L2,50,0)\n\t\tFor([r3],1,{[r2]-6}\n\t\t\t{[r2]-6-[r3]}->{L2+[r3]-1\n\t\tEnd\n\t\t0->[r3]\n\t\tRepeat ({L1+[r3]}!={L2+[r3]}) or ([r3]=20)\n\t\t\t[r3]++\n\t\tEnd\n\t\tIf (({L1+[r3]}>{L2+[r3]}) and ([r1]=1)) or (({L1+[r3]}<{L2+[r3]}) and ([r1]=0))\n\t\t\tFill(L1,50,0)\n\t\t\tCopy(L2,L1,20)\n\t\tEnd\n\t\tElse\n\t\tIf [r2]<{|E982E}^^r\n\t\t\tsub(DATA)\n\t\t\tReturn1\n\t\tEnd\n\tEnd\n\t[r2]-{[r2]-6}-7->[r2]\nEnd\nLbl ADJ\nFill(L2,50,0)\nCopy(L1+1,L2,20)\nFill(L1,50,0)\nCopy(L2,L1)\nFill(L3,50,0)\nCopy(L1,L3,20)\nFill(L1,50,0)\n{|E9830}^^r->[r2]\nsub(CHECK)\nRepeat (({[r2]}=5) or ({[r2]}=6)) and ([r4]) and (({[r2]-7}>48) or ({[r2]-7}<28))\n\t[r2]-{[r2]-6}-7->[r2]\n\tIf [r2]<{|E982E}^^r\n\t\tFill(L1,50,0)\n\t\tCopy(L3,L1,20)\n\t\tFill(L3,50,0)\n\t\tsub(DATA)\n\t\tReturn0\n\tEnd\n\tsub(CHECK)\nEnd\nFor([r3],1,{[r2]-6})\n\t{[r2]-6-[r3]}->{L1+[r3]-1}\nEnd\n[r2]-{[r2]-6}-7->[r2]\nRepeat 0\n\tsub(CHECK)\n\tIf (({[r2]}=5) or ({[r2]}=6)) and ([r4]) and (({[r2]-7}>48) or ({[r2]-7}<28))\n\t\tFill(L2,50,0)\n\t\tFor([r3],1,{[r2]-6}\n\t\t\t{[r2]-6-[r3]}->{L2+[r3]-1\n\t\tEnd\n\t\t0->[r3]\n\t\tRepeat ({L1+[r3]}!={L2+[r3]}) or ([r3]=20)\n\t\t\t[r3]++\n\t\tEnd\n\t\tIf (({L1+[r3]}>{L2+[r3]}) and ([r1]=1)) or (({L1+[r3]}<{L2+[r3]}) and ([r1]=0))\n\t\t\tFill(L1,50,0)\n\t\t\tCopy(L2,L1,20)\n\t\tEnd\n\t\tElse\n\t\tIf [r2]<{|E982E}^^r\n\t\t\tsub(DATA)\n\t\t\tReturn1\n\t\tEnd\n\tEnd\n\t[r2]-{[r2]-6}-7->[r2]\nEnd\nLbl CHECK\n0->[r4]\nRepeat ({[r2]-7-[r4]}!={L3+[r4]}) or (([r4]>={[r2]-6}) and ({L3+[r4]}=0))\n\t[r4]++\nEnd\nIf ((({[r2]-7-[r4]}<{L3+[r4]}) and ([r1]=1)) or (({[r2]-7-[r4]}>{L3+[r4]}) and ([r1]=0))) or (([r4]>={[r2]-6}) and ({L3+[r4]}=0))\n\t0->[r4]\n\tElse\n\t1->[r4]\nEnd\nReturn\nLbl DATA\n{|E9830}^^r->C\nRepeat 0\n\tRepeat ({C}=5) or ({C}=6) and (({[r1]-7}>48) or ({[r1]-7}<28))\n\t\tC-{C-6}-7->C\n\tEnd\n\tFill(L2,50,0)\n\tFor([r1],1,{C-6})\n\t\t{C-6-[r1]}->{L2+[r1]-1}\n\tEnd\n\t!If Equ>String(L1,L2)\n\t\tIf {C-5}=0\n\t\t\t0->D\n\t\t\tElse\n\t\t\t1->D\n\t\tEnd\n\t\tIf {C-7}<28\n\t\t\t1->E\n\t\t\tElse\n\t\t\t0->E\n\t\tEnd\n\t\tIf {C}=6\n\t\t\t1->F\n\t\t\tElse\n\t\t\t0->F\n\t\tEnd\n\t\tFill(L2,50,0)\n\t\tCopy(L1,L2,20)\n\t\tFill(L1,50,0)\n\t\tCopy(L2,L1+1,20)\n\t\tIf E\n\t\t\t{L2}+64->{L2}\n\t\tEnd\n\t\tIf F\n\t\t\t|E06->{L1}\n\t\t\tElse\n\t\t\t|E05->{L1}\n\t\tEnd\n\t\tReturn\n\tEnd\n\tC-{C-6}-7->C\nEnd\nReturn"
  },
  {
    "path": "src/test/resources/samples/langs/TLA/AsyncInterface.tla",
    "content": "--------------------------- MODULE AsyncInterface ---------------------------\nEXTENDS Naturals\n\nCONSTANT Data\nVARIABLE chan\n\nValues == <<\"foo\", \"bar\", \"baz\">>\n\nTypeInvariant == chan \\in [val: Data, rdy: {0,1}, ack: {0,1}]\n                 \nInit == /\\ TypeInvariant\n        /\\ chan.ack = chan.rdy\n        \nSend(d) == /\\ chan.rdy = chan.ack\n           /\\ chan' = [chan EXCEPT !.val = d, !.rdy = 1 - @]\n        \nRcv == /\\ chan.rdy # chan.ack\n       /\\ chan' = [chan EXCEPT !.ack = 1 - @]\n       \nNext == (\\E d \\in Data : Send(d)) \\/ Rcv\n\nSpec == Init /\\ [][Next]_chan\n\nTHEOREM Spec => []TypeInvariant\n\n============================================================================="
  },
  {
    "path": "src/test/resources/samples/langs/TLA/fifo.tla",
    "content": "-------------------------------- MODULE fifo --------------------------------\nEXTENDS Naturals, Sequences\nCONSTANT Message\nVARIABLES in, out, q\n\nInChan == INSTANCE AsyncInterface WITH Data <- Message, chan <- in\nOutChan == INSTANCE AsyncInterface WITH Data <- Message, chan <- out\n\n-----------------------------------------------------------------------------\n\nInit == /\\ InChan!Init\n        /\\ OutChan!Init\n        /\\ q = <<>>\n        \nTypeInvariant == /\\ InChan!TypeInvariant\n                 /\\ OutChan!TypeInvariant\n                 /\\ q \\in Seq(Message)\n                 /\\ Len(q) <= 10\n\nSSend(msg) == /\\ InChan!Send(msg) \\* Send msg on channel in\n              /\\ UNCHANGED <<out, q>>\n              \nBufRcv == /\\ InChan!Rcv\n          /\\ Len(q) < 10\n          /\\ q' = Append(q, in.val)\n          /\\ UNCHANGED out\n\nBufSend == /\\ q # <<>>\n           /\\ OutChan!Send(Head(q))\n           /\\ q' = Tail(q)\n           /\\ UNCHANGED in\n           \nRRcv == /\\ OutChan!Rcv\n        /\\ UNCHANGED <<in, q>>\n        \nNext == \\/ \\E msg \\in Message : SSend(msg)\n        \\/ BufRcv\n        \\/ BufSend\n        \\/ RRcv\n        \nSpec == Init /\\ [][Next]_<<in, out, q>>\n\n-----------------------------------------------------------------------------\n\nTHEOREM Spec => []TypeInvariant\n\n============================================================================="
  },
  {
    "path": "src/test/resources/samples/langs/TXL/Cal.txl",
    "content": "% Calculator.Txl - simple numerical expression evaluator\n\n% Part I.  Syntax specification\ndefine program\n        [expression]\nend define\n\ndefine expression\n        [term]\n    |   [expression] [addop] [term]\nend define\n\ndefine term\n        [primary]\n    |   [term] [mulop] [primary]\nend define\n\ndefine primary\n        [number]\n    |   ( [expression] )\nend define\n\ndefine addop\n        '+\n    |   '-\nend define\n\ndefine mulop\n        '*\n    |   '/\nend define\n\n\n% Part 2.  Transformation rules\nrule main\n    replace [expression]\n        E [expression]\n    construct NewE [expression]\n        E [resolveAddition] [resolveSubtraction] [resolveMultiplication]\n          [resolveDivision] [resolveParentheses]\n    where not\n        NewE [= E]\n    by\n        NewE\nend rule\n\nrule resolveAddition\n    replace [expression]\n        N1 [number] + N2 [number]\n    by\n        N1 [+ N2]\nend rule\n\nrule resolveSubtraction\n    replace [expression]\n        N1 [number] - N2 [number]\n    by\n        N1 [- N2]\nend rule\n\nrule resolveMultiplication\n    replace [term]\n        N1 [number] * N2 [number]\n    by\n        N1 [* N2]\nend rule\n\nrule resolveDivision\n    replace [term]\n        N1 [number] / N2 [number]\n    by\n        N1 [/ N2]\nend rule\n\nrule resolveParentheses\n    replace [primary]\n        ( N [number] )\n    by\n        N\nend rule\n"
  },
  {
    "path": "src/test/resources/samples/langs/Tcl/filenames/owh",
    "content": "#!/usr/bin/env tclsh\n# http://wiki.tcl.tk/906\n\nif {[llength $argv] < 1} {\n   puts \"usage: owh ?init? body ?exit?\n   performs body (in Tcl) for each line (\\$0) from stdin\n   owh: Ousterhout - Welch - Hobbs, to name a few\"\n   exit -1\n}\n\nproc awksplit {text {split default}} {\n    set no 0\n    if {$split eq \"default\"} {\n        set t {}\n        foreach string [split $text] {\n            if {$string ne {}} {\n                lappend t $string\n            }\n        }\n    } else {\n        set t [list $text $split]\n    }\n    uplevel 1 [list set NF [llength $t]]\n    foreach i $t {uplevel 1 [list set [incr no] $i]}\n    uplevel 1 {set 0 {};trace variable 0 ru 0}\n}\nproc 0 {_name index op} {\n    switch $op {\n        r {\n            uplevel {\n                set 0 {}\n                for {set i 1} {$i <= $NF} {incr i} {lappend 0 [set $i]}\n                set 0 [join $0 $OFS]\n            }\n        }\n        u {rename 0 {} ;# leave no traces of the trace..}\n    }\n}\n\nproc print s {if {[catch {puts $s}]} exit} ;# good for broken pipe\n\nset FS default\nset OFS { }\n\nif {[llength $argv] > 1} {\n   eval [lindex $argv 0]\n   set _body [lindex $argv 1] ;# strip outer braces\n   set _exit [lindex $argv 2]\n} else {\n   set _body [lindex $argv 0] ;# strip outer braces\n   set _exit {}\n}\n\nset NR 1\nwhile 1 {\n   gets stdin line\n   if {[eof stdin]} break\n   awksplit $line $FS\n   eval $_body\n   incr NR\n}\nset res [eval $_exit]\nif {[string length $res]} {puts $res}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Tcl/filenames/starfield",
    "content": "#!/usr/bin/env wish\n# http://wiki.tcl.tk/14140\n\nproc stars'go {c factor} {\n    set w [winfo width $c]\n    set h [winfo height $c] \n    $c scale all [expr {$w/2}] [expr {$h/2}] $factor $factor \n    foreach item [$c find all] {\n        if {[llength [$c bbox $item]] == 0} {$c delete $item; continue} ;# (1)\n        foreach {x0 y0 x1 y1} [$c bbox $item] break\n        if {$x1<0 || $x0>$w || $y1<0 || $y0>$h} {$c delete $item}\n    }\n    time {\n        set x [expr {rand()*$w}]\n        set y [expr {rand()*$h}]\n        set col [lpick {white yellow beige bisque cyan}]\n        $c create oval $x $y [expr {$x+1}] [expr {$y+1}] -fill $col \\\n                -outline $col\n    } 10\n    after $::ms [info level 0]\n}\nproc lpick list {lindex $list [expr {int(rand()*[llength $list])}]}\n#-- Let's go!\npack [canvas .c -bg black] -fill both -expand 1\nset ms 40\nbind . <Up> {incr ms -5}\nbind . <Down> {incr ms 5}\nstars'go .c 1.05\n"
  },
  {
    "path": "src/test/resources/samples/langs/Tcl/stream-0.1.tm",
    "content": "# A stream ensemble\n#\n# Copyright (c) 2013 Lawrence Woodman <lwoodman@vlifesystems.com>\n#\n# Licensed under an MIT licence.  Please see LICENCE.md for details.\n#\n\npackage require Tcl 8.5\n\nnamespace eval stream {\n  namespace export {[a-z]*}\n  namespace ensemble create\n}\n\nproc stream::create {first restCmdPrefix} {\n  return [list $first $restCmdPrefix]\n}\n\nproc stream::first {stream} {\n  lassign $stream first\n  return $first\n}\n\nproc stream::foldl {cmdPrefix initialValue args} {\n  set numStreams [llength $args]\n  if {$numStreams == 1} {\n    FoldlSingleStream $cmdPrefix $initialValue [lindex $args 0]\n  } elseif {$numStreams > 1} {\n    FoldlMultiStream $cmdPrefix $initialValue $args\n  } else {\n    Usage \"stream foldl cmdPrefix initalValue stream ?stream ..?\"\n  }\n}\n\nproc stream::foreach {args} {\n  set numArgs [llength $args]\n  if {$numArgs == 3} {\n    lassign $args varName stream body\n    ForeachSingleStream $varName $stream $body\n  } elseif {($numArgs > 3) && (($numArgs % 2) == 1)} {\n    set body [lindex $args end]\n    set items [lrange $args 0 end-1]\n    ForeachMultiStream $items $body\n  } else {\n    Usage \"stream foreach varName stream ?varName stream ..? body\"\n  }\n}\n\nproc stream::fromList {_list {index 0}} {\n  if {$index >= [llength $_list]} {return {}}\n  create [lindex $_list $index] [list fromList $_list [expr {$index + 1}]]\n}\n\nproc stream::isEmpty {stream} {\n  expr {[llength $stream] == 0}\n}\n\nproc stream::map {cmdPrefix args} {\n  set numArgs [llength $args]\n  if {$numArgs == 1} {\n    MapSingleStream $cmdPrefix [lindex $args 0]\n  } elseif {$numArgs > 1} {\n    MapMultiStream $cmdPrefix $args\n  } else {\n    Usage \"stream map cmdPrefix stream ?stream ..?\"\n  }\n}\n\nproc stream::rest {stream} {\n  set rest [lindex $stream 1]\n  {*}$rest\n}\n\n# Note: This will work through the elements of the stream until it finds\n# the first element that is matched by the cmdPrefix predicate.\nproc stream::select {cmdPrefix stream} {\n  while {![isEmpty $stream]} {\n    lassign $stream first rest\n    if {[{*}$cmdPrefix $first]} {\n      return [create $first [list select $cmdPrefix [{*}$rest]]]\n    } else {\n      set stream [{*}$rest]\n    }\n  }\n  return $stream\n}\n\nproc stream::take {num stream} {\n  if {[isEmpty $stream] || $num <= 0} {\n    return [::list]\n  } else {\n    lassign $stream first rest\n    create $first [list take [expr {$num - 1}] [{*}$rest]]\n  }\n}\n\nproc stream::toList {stream} {\n  set res [::list]\n  while {![isEmpty $stream]} {\n    lassign $stream first rest\n    lappend res $first\n    set stream [{*}$rest]\n  }\n  return $res\n}\n\n\n#################################\n#           Internal\n#################################\n\nproc stream::FoldlSingleStream {cmdPrefix initialValue stream} {\n  set acc $initialValue\n  while {![isEmpty $stream]} {\n    lassign $stream first rest\n    set acc [{*}$cmdPrefix $acc $first]\n    set stream [{*}$rest]\n  }\n  return $acc\n}\n\nproc stream::FoldlMultiStream {cmdPrefix initialValue streams} {\n  set acc $initialValue\n\n  while 1 {\n    set firsts [::list]\n    set restStreams [::list]\n    ::foreach stream $streams {\n      if {[isEmpty $stream]} {\n        return $acc\n      }\n      lassign $stream first rest\n      lappend firsts $first\n      lappend restStreams [{*}$rest]\n    }\n    set acc [{*}$cmdPrefix $acc {*}$firsts]\n    set streams $restStreams\n  }\n  return $acc\n}\n\nproc stream::ForeachSingleStream {varName stream body} {\n  set res {}\n  while {![isEmpty $stream]} {\n    lassign $stream first rest\n    uplevel 2 [list set $varName $first]\n    set stream [{*}$rest]\n    set res [uplevel 2 $body]\n  }\n  return $res\n}\n\nproc stream::ForeachMultiStream {items body} {\n  set res {}\n\n  while 1 {\n    set nextItems [::list]\n    ::foreach {varName stream} $items {\n      if {[isEmpty $stream]} {\n        return $res\n      }\n      lassign $stream first rest\n      uplevel 2 [list set $varName $first]\n      lappend nextItems $varName\n      lappend nextItems [{*}$rest]\n    }\n    set res [uplevel 2 $body]\n    set items $nextItems\n  }\n\n  return $res\n}\n\nproc stream::MapSingleStream {cmdPrefix stream} {\n  if {[isEmpty $stream]} {\n    return $stream\n  }\n  lassign $stream first rest\n  create [{*}$cmdPrefix $first] [list MapSingleStream $cmdPrefix [{*}$rest]]\n}\n\nproc stream::MapMultiStream {cmdPrefix streams} {\n  set firsts [::list]\n  set restStreams [::list]\n\n  ::foreach stream $streams {\n    if {[isEmpty $stream]} {\n      return $stream\n    }\n    lassign $stream first rest\n    lappend firsts $first\n    lappend restStreams [{*}$rest]\n  }\n\n  return [create [{*}$cmdPrefix {*}$firsts] \\\n                 [list MapMultiStream $cmdPrefix $restStreams]]\n}\n\nproc stream::Usage {msg} {\n  return -code error -level 2 \"wrong # args: should be \\\"$msg\\\"\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Tcl/xdgbasedir-0.3.tm",
    "content": "# XDG Base Directory Specification handling\n#\n# Copyright (C) 2013 Lawrence Woodman\n#\n# Licensed under an MIT licence.  Please see LICENCE.md for details.\n#\n# For XDG Base Directory Specification\n#   http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html\n#\npackage require Tcl 8.5\n\nnamespace eval XDG {\n  variable DEFAULTS \"\"\n  namespace export DATA_HOME CONFIG_HOME CACHE_HOME\n  namespace export RUNTIME_DIR DATA_DIRS CONFIG_DIRS\n}\n\nproc XDG::SetDefaults {} {\n  variable DEFAULTS\n  if {$DEFAULTS ne \"\"} return\n  set DEFAULTS [list \\\n    DATA_HOME   [file join $::env(HOME) .local share] \\\n    CONFIG_HOME [file join $::env(HOME) .config] \\\n    CACHE_HOME  [file join $::env(HOME) .cache] \\\n    DATA_DIRS   [list [file join /usr local share] [file join /usr share]] \\\n    CONFIG_DIRS [list [file join /etc xdg ]]\n  ]\n}\n\nproc XDG::XDGVarSet {var} {\n  expr {[info exists ::env(XDG_$var)] && $::env(XDG_$var) ne \"\"}\n}\n\nproc XDG::Dir {var {subdir \"\"} } {\n  variable DEFAULTS\n  SetDefaults\n  set dir [dict get $DEFAULTS $var]\n\n  if {[XDGVarSet $var]} {\n    set dir $::env(XDG_$var)\n  }\n\n  return [file join $dir $subdir]\n}\n\nproc XDG::Dirs {var {subdir \"\"} } {\n  variable DEFAULTS\n  SetDefaults\n  set rawDirs [dict get $DEFAULTS $var]\n\n  if {[XDGVarSet $var]} {\n    set rawDirs [split $::env(XDG_$var) \":\"]\n  }\n\n  set outDirs {}\n  foreach dir $rawDirs {\n    lappend outDirs [file join $dir $subdir]\n  }\n  return $outDirs\n}\n\n# The remaining procs reference the environmental variables XDG_\n# followed by the proc name.\nproc XDG::DATA_HOME {{subdir \"\"}} {Dir DATA_HOME $subdir}\nproc XDG::CONFIG_HOME {{subdir \"\"}} {Dir CONFIG_HOME $subdir}\nproc XDG::CACHE_HOME {{subdir \"\"}} {Dir CACHE_HOME $subdir}\n\nproc XDG::RUNTIME_DIR {{subdir \"\"}} {\n  if {![XDGVarSet RUNTIME_DIR]} { return {} }\n  return [file join $::env(XDG_RUNTIME_DIR) $subdir]\n}\n\n# The following procs returning the directories as a list with the most\n# important first.\nproc XDG::DATA_DIRS {{subdir \"\"}} {Dirs DATA_DIRS $subdir}\nproc XDG::CONFIG_DIRS {{subdir \"\"}} {Dirs CONFIG_DIRS $subdir}\n"
  },
  {
    "path": "src/test/resources/samples/langs/TeX/authortitle.cbx",
    "content": "\\ProvidesFile{authortitle.cbx}\n[\\abx@cbxid]\n\n\\ExecuteBibliographyOptions{uniquename,uniquelist,autocite=footnote}\n\n\\renewcommand*{\\iffinalcitedelim}{\\iflastcitekey}\n\n\\newbool{cbx:parens}\n\n\\newbibmacro*{cite}{%\n  \\iffieldundef{shorthand}\n    {\\ifnameundef{labelname}\n       {}\n       {\\printnames{labelname}%\n        \\setunit{\\nametitledelim}}%\n     \\usebibmacro{cite:title}}%\n    {\\usebibmacro{cite:shorthand}}}\n\n\\newbibmacro*{citetitle}{%\n  \\iffieldundef{shorthand}\n    {\\usebibmacro{cite:title}}%\n    {\\usebibmacro{cite:shorthand}}}\n\n\\newbibmacro*{textcite}{%\n  \\ifnameundef{labelname}\n    {}\n    {\\printnames{labelname}%\n     \\setunit{%\n       \\global\\booltrue{cbx:parens}%\n       \\addspace\\bibopenparen}}%\n  \\ifnumequal{\\value{citecount}}{1}\n    {\\usebibmacro{prenote}}\n    {}%\n  \\iffieldundef{shorthand}\n    {\\usebibmacro{cite:title}}%\n    {\\usebibmacro{cite:shorthand}}}\n\n\\newbibmacro*{cite:title}{%\n  \\printtext[bibhyperref]{%\n    \\printfield[citetitle]{labeltitle}}}\n\n\\newbibmacro*{cite:shorthand}{%\n  \\printtext[bibhyperref]{\\printfield{shorthand}}}\n\n\\newbibmacro*{textcite:postnote}{%\n  \\iffieldundef{postnote}\n    {\\ifbool{cbx:parens}\n       {\\bibcloseparen}\n       {}}\n    {\\ifbool{cbx:parens}\n       {\\postnotedelim}\n       {\\addspace\\bibopenparen}%\n     \\printfield{postnote}\\bibcloseparen}}\n\n\\DeclareCiteCommand{\\cite}\n  {\\usebibmacro{prenote}}\n  {\\usebibmacro{citeindex}%\n   \\usebibmacro{cite}}\n  {\\multicitedelim}\n  {\\usebibmacro{postnote}}\n\n\\DeclareCiteCommand*{\\cite}\n  {\\usebibmacro{prenote}}\n  {\\usebibmacro{citeindex}%\n   \\usebibmacro{citetitle}}\n  {\\multicitedelim}\n  {\\usebibmacro{postnote}}\n\n\\DeclareCiteCommand{\\parencite}[\\mkbibparens]\n  {\\usebibmacro{prenote}}\n  {\\usebibmacro{citeindex}%\n   \\usebibmacro{cite}}\n  {\\multicitedelim}\n  {\\usebibmacro{postnote}}\n\n\\DeclareCiteCommand*{\\parencite}[\\mkbibparens]\n  {\\usebibmacro{prenote}}\n  {\\usebibmacro{citeindex}%\n   \\usebibmacro{citetitle}}\n  {\\multicitedelim}\n  {\\usebibmacro{postnote}}\n\n\\DeclareCiteCommand{\\footcite}[\\mkbibfootnote]\n  {\\usebibmacro{prenote}}\n  {\\usebibmacro{citeindex}%\n   \\usebibmacro{cite}}\n  {\\multicitedelim}\n  {\\usebibmacro{postnote}}\n\n\\DeclareCiteCommand{\\footcitetext}[\\mkbibfootnotetext]\n  {\\usebibmacro{prenote}}\n  {\\usebibmacro{citeindex}%\n   \\usebibmacro{cite}}\n  {\\multicitedelim}\n  {\\usebibmacro{postnote}}\n\n\\DeclareCiteCommand{\\smartcite}[\\iffootnote\\mkbibparens\\mkbibfootnote]\n  {\\usebibmacro{prenote}}\n  {\\usebibmacro{citeindex}%\n   \\usebibmacro{cite}}\n  {\\multicitedelim}\n  {\\usebibmacro{postnote}}\n\n\\DeclareCiteCommand{\\textcite}\n  {\\boolfalse{cbx:parens}}\n  {\\usebibmacro{citeindex}%\n   \\iffirstcitekey\n     {\\setcounter{textcitetotal}{1}}\n     {\\stepcounter{textcitetotal}%\n      \\textcitedelim}%\n   \\usebibmacro{textcite}}\n  {\\ifbool{cbx:parens}\n     {\\bibcloseparen\\global\\boolfalse{cbx:parens}}\n     {}}\n  {\\usebibmacro{textcite:postnote}}\n\n\\DeclareMultiCiteCommand{\\textcites}{\\textcite}{}\n\n\\endinput\n"
  },
  {
    "path": "src/test/resources/samples/langs/TeX/beispiel.toc",
    "content": "\\beamer@endinputifotherversion {3.07pt}\n\\select@language {german}\n\\beamer@sectionintoc {1}{Geschichte}{3}{0}{1}\n\\beamer@sectionintoc {2}{Merkmale}{4}{0}{2}\n\\beamer@sectionintoc {3}{Kritikpunkte}{5}{0}{3}\n\\beamer@sectionintoc {4}{Perl-Kultur und Spa{\\ss}}{6}{0}{4}\n\\beamer@sectionintoc {5}{Siehe auch}{7}{0}{5}\n\\beamer@sectionintoc {6}{Einzelnachweise}{8}{0}{6}\n\\beamer@sectionintoc {7}{Bedingte Ausf\\\"{u}hrung}{12}{0}{7}\n"
  },
  {
    "path": "src/test/resources/samples/langs/TeX/english.lbx",
    "content": "\\ProvidesFile{english.lbx}\n[\\abx@lbxid]\n\n\\DeclareRedundantLanguages{english,american}{english,american,british,\ncanadian,australian,newzealand,USenglish,UKenglish}\n\n\\DeclareBibliographyExtras{%\n  \\protected\\def\\bibrangedash{%\n    \\textendash\\penalty\\hyphenpenalty}% breakable dash\n  \\protected\\def\\bibdatedash{\\bibrangedash}%\n  \\def\\finalandcomma{\\addcomma}%\n  \\def\\finalandsemicolon{\\addsemicolon}%\n  \\protected\\def\\mkbibordinal#1{%\n    \\begingroup\n    \\@tempcnta0#1\\relax\\number\\@tempcnta\n    \\@whilenum\\@tempcnta>100\\do{\\advance\\@tempcnta-100\\relax}%\n    \\ifnum\\@tempcnta>20\n      \\@whilenum\\@tempcnta>9\\do{\\advance\\@tempcnta-10\\relax}%\n    \\fi\n    \\ifcase\\@tempcnta th\\or st\\or nd\\or rd\\else th\\fi\n    \\endgroup}%\n  \\protected\\def\\mkbibmascord{\\mkbibordinal}%\n  \\protected\\def\\mkbibfemord{\\mkbibordinal}%\n  \\protected\\def\\mkbibneutord{\\mkbibordinal}%\n  \\protected\\def\\mkbibdatelong#1#2#3{%\n    \\iffieldundef{#2}\n      {}\n      {\\mkbibmonth{\\thefield{#2}}%\n       \\iffieldundef{#3}\n         {\\iffieldundef{#1}{}{\\space}}\n\t {\\nobreakspace}}%\n    \\iffieldundef{#3}\n      {}\n      {\\stripzeros{\\thefield{#3}}%\n       \\iffieldundef{#1}{}{,\\space}}%\n     \\iffieldbibstring{#1}\n       {\\bibstring{\\thefield{#1}}}\n       {\\stripzeros{\\thefield{#1}}}}%\n  \\protected\\def\\mkbibdateshort#1#2#3{%\n    \\iffieldundef{#2}\n      {}\n      {\\mkdatezeros{\\thefield{#2}}%\n       \\iffieldundef{#3}\n         {\\iffieldundef{#1}{}{/}}\n         {/}}%\n    \\iffieldundef{#3}\n      {}\n      {\\mkdatezeros{\\thefield{#3}}%\n       \\iffieldundef{#1}{}{/}}%\n     \\iffieldbibstring{#1}\n       {\\bibstring{\\thefield{#1}}}\n       {\\mkdatezeros{\\thefield{#1}}}}%\n  \\savecommand\\mkbibrangecomp\n  \\savecommand\\mkbibrangecompextra\n  \\savecommand\\mkbibrangeterse\n  \\savecommand\\mkbibrangeterseextra\n  \\protected\\def\\mkbibrangecomp{%\n    \\lbx@us@mkbibrangetrunc@long{long}}%\n  \\protected\\def\\mkbibrangeterse{%\n    \\lbx@us@mkbibrangetrunc@short{short}}%\n  \\protected\\def\\mkbibrangecompextra{%\n    \\lbx@us@mkbibrangetruncextra@long{long}}%\n  \\protected\\def\\mkbibrangeterseextra{%\n    \\lbx@us@mkbibrangetruncextra@short{short}}%\n}\n\n\\UndeclareBibliographyExtras{%\n  \\restorecommand\\mkbibrangecomp\n  \\restorecommand\\mkbibrangecompextra\n  \\restorecommand\\mkbibrangeterse\n  \\restorecommand\\mkbibrangeterseextra\n}\n\n\\DeclareBibliographyStrings{%\n  bibliography     = {{Bibliography}{Bibliography}},\n  references       = {{References}{References}},\n  shorthands       = {{List of Abbreviations}{Abbreviations}},\n  editor           = {{editor}{ed\\adddot}},\n  editors          = {{editors}{eds\\adddot}},\n  compiler         = {{compiler}{comp\\adddot}},\n  compilers        = {{compilers}{comp\\adddot}},\n  redactor         = {{redactor}{red\\adddot}},\n  redactors        = {{redactors}{red\\adddot}},\n  reviser          = {{reviser}{rev\\adddot}},\n  revisers         = {{revisers}{rev\\adddot}},\n  founder          = {{founder}{found\\adddot}},\n  founders         = {{founders}{found\\adddot}},\n  continuator      = {{continued}{cont\\adddot}},% FIXME: unsure\n  continuators     = {{continued}{cont\\adddot}},% FIXME: unsure\n  collaborator     = {{collaborator}{collab\\adddot}},% FIXME: unsure\n  collaborators    = {{collaborators}{collab\\adddot}},% FIXME: unsure\n  translator       = {{translator}{trans\\adddot}},\n  translators      = {{translators}{trans\\adddot}},\n  commentator      = {{commentator}{comm\\adddot}},\n  commentators     = {{commentators}{comm\\adddot}},\n  annotator        = {{annotator}{annot\\adddot}},\n  annotators       = {{annotators}{annot\\adddot}},\n  commentary       = {{commentary}{comm\\adddot}},\n  annotations      = {{annotations}{annot\\adddot}},\n  introduction     = {{introduction}{intro\\adddot}},\n  foreword         = {{foreword}{forew\\adddot}},\n  afterword        = {{afterword}{afterw\\adddot}},\n  editortr         = {{editor and translator}%\n                      {ed\\adddotspace and trans\\adddot}},\n  editorstr        = {{editors and translators}%\n                      {eds\\adddotspace and trans\\adddot}},\n  editorco         = {{editor and commentator}%\n                      {ed\\adddotspace and comm\\adddot}},\n  editorsco        = {{editors and commentators}%\n                      {eds\\adddotspace and comm\\adddot}},\n  editoran         = {{editor and annotator}%\n                      {ed\\adddotspace and annot\\adddot}},\n  editorsan        = {{editors and annotators}%\n                      {eds\\adddotspace and annot\\adddot}},\n  editorin         = {{editor and introduction}%\n                      {ed\\adddotspace and introd\\adddot}},\n  editorsin        = {{editors and introduction}%\n                      {eds\\adddotspace and introd\\adddot}},\n  editorfo         = {{editor and foreword}%\n                      {ed\\adddotspace and forew\\adddot}},\n  editorsfo        = {{editors and foreword}%\n                      {eds\\adddotspace and forew\\adddot}},\n  editoraf         = {{editor and afterword}%\n                      {ed\\adddotspace and afterw\\adddot}},\n  editorsaf        = {{editors and afterword}%\n                      {eds\\adddotspace and afterw\\adddot}},\n  editortrco       = {{editor, translator\\finalandcomma\\ and commentator}%\n                      {ed.,\\addabbrvspace trans\\adddot\\finalandcomma\\ and comm\\adddot}},\n  editorstrco      = {{editors, translators\\finalandcomma\\ and commentators}%\n                      {eds.,\\addabbrvspace trans\\adddot\\finalandcomma\\ and comm\\adddot}},\n  editortran       = {{editor, translator\\finalandcomma\\ and annotator}%\n                      {ed.,\\addabbrvspace trans\\adddot\\finalandcomma\\ and annot\\adddot}},\n  editorstran      = {{editors, translators\\finalandcomma\\ and annotators}%\n                      {eds.,\\addabbrvspace trans\\adddot\\finalandcomma\\ and annot\\adddot}},\n  editortrin       = {{editor, translator\\finalandcomma\\ and introduction}%\n                      {ed.,\\addabbrvspace trans\\adddot\\finalandcomma\\ and introd\\adddot}},\n  editorstrin      = {{editors, translators\\finalandcomma\\ and introduction}%\n                      {eds.,\\addabbrvspace trans\\adddot\\finalandcomma\\ and introd\\adddot}},\n  editortrfo       = {{editor, translator\\finalandcomma\\ and foreword}%\n                      {ed.,\\addabbrvspace trans\\adddot\\finalandcomma\\ and forew\\adddot}},\n  editorstrfo      = {{editors, translators\\finalandcomma\\ and foreword}%\n                      {eds.,\\addabbrvspace trans\\adddot\\finalandcomma\\ and forew\\adddot}},\n  editortraf       = {{editor, translator\\finalandcomma\\ and afterword}%\n                      {ed.,\\addabbrvspace trans\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  editorstraf      = {{editors, translators\\finalandcomma\\ and afterword}%\n                      {eds.,\\addabbrvspace trans\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  editorcoin       = {{editor, commentator\\finalandcomma\\ and introduction}%\n                      {ed.,\\addabbrvspace comm\\adddot\\finalandcomma\\ and introd\\adddot}},\n  editorscoin      = {{editors, commentators\\finalandcomma\\ and introduction}%\n                      {eds.,\\addabbrvspace comm\\adddot\\finalandcomma\\ and introd\\adddot}},\n  editorcofo       = {{editor, commentator\\finalandcomma\\ and foreword}%\n                      {ed.,\\addabbrvspace comm\\adddot\\finalandcomma\\ and forew\\adddot}},\n  editorscofo      = {{editors, commentators\\finalandcomma\\ and foreword}%\n                      {eds.,\\addabbrvspace comm\\adddot\\finalandcomma\\ and forew\\adddot}},\n  editorcoaf       = {{editor, commentator\\finalandcomma\\ and afterword}%\n                      {ed.,\\addabbrvspace comm\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  editorscoaf      = {{editors, commentators\\finalandcomma\\ and afterword}%\n                      {eds.,\\addabbrvspace comm\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  editoranin       = {{editor, annotator\\finalandcomma\\ and introduction}%\n                      {ed.,\\addabbrvspace annot\\adddot\\finalandcomma\\ and introd\\adddot}},\n  editorsanin      = {{editors, annotators\\finalandcomma\\ and introduction}%\n                      {eds.,\\addabbrvspace annot\\adddot\\finalandcomma\\ and introd\\adddot}},\n  editoranfo       = {{editor, annotator\\finalandcomma\\ and foreword}%\n                      {ed.,\\addabbrvspace annot\\adddot\\finalandcomma\\ and forew\\adddot}},\n  editorsanfo      = {{editors, annotators\\finalandcomma\\ and foreword}%\n                      {eds.,\\addabbrvspace annot\\adddot\\finalandcomma\\ and forew\\adddot}},\n  editoranaf       = {{editor, annotator\\finalandcomma\\ and afterword}%\n                      {ed.,\\addabbrvspace annot\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  editorsanaf      = {{editors, annotators\\finalandcomma\\ and afterword}%\n                      {eds.,\\addabbrvspace annot\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  editortrcoin     = {{editor, translator, commentator\\finalandcomma\\ and introduction}%\n                      {ed.,\\addabbrvspace trans., comm\\adddot\\finalandcomma\\ and introd\\adddot}},\n  editorstrcoin    = {{editors, translators, commentators\\finalandcomma\\ and introduction}%\n                      {eds.,\\addabbrvspace trans., comm\\adddot\\finalandcomma\\ and introd\\adddot}},\n  editortrcofo     = {{editor, translator, commentator\\finalandcomma\\ and foreword}%\n                      {ed.,\\addabbrvspace trans., comm\\adddot\\finalandcomma\\ and forew\\adddot}},\n  editorstrcofo    = {{editors, translators, commentators\\finalandcomma\\ and foreword}%\n                      {eds.,\\addabbrvspace trans., comm\\adddot\\finalandcomma\\ and forew\\adddot}},\n  editortrcoaf     = {{editor, translator, commentator\\finalandcomma\\ and afterword}%\n                      {ed.,\\addabbrvspace trans., comm\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  editorstrcoaf    = {{editors, translators, commentators\\finalandcomma\\ and afterword}%\n                      {eds.,\\addabbrvspace trans., comm\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  editortranin     = {{editor, translator, annotator\\finalandcomma\\ and introduction}%\n                      {ed.,\\addabbrvspace trans., annot\\adddot\\finalandcomma\\ and introd\\adddot}},\n  editorstranin    = {{editors, translators, annotators\\finalandcomma\\ and introduction}%\n                      {eds.,\\addabbrvspace trans., annot\\adddot\\finalandcomma\\ and introd\\adddot}},\n  editortranfo     = {{editor, translator, annotator\\finalandcomma\\ and foreword}%\n                      {ed.,\\addabbrvspace trans., annot\\adddot\\finalandcomma\\ and forew\\adddot}},\n  editorstranfo    = {{editors, translators, annotators\\finalandcomma\\ and foreword}%\n                      {eds.,\\addabbrvspace trans., annot\\adddot\\finalandcomma\\ and forew\\adddot}},\n  editortranaf     = {{editor, translator, annotator\\finalandcomma\\ and afterword}%\n                      {ed.,\\addabbrvspace trans., annot\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  editorstranaf    = {{editors, translators, annotators\\finalandcomma\\ and afterword}%\n                      {eds.,\\addabbrvspace trans., annot\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  translatorco     = {{translator and commentator}%\n                      {trans\\adddot\\ and comm\\adddot}},\n  translatorsco    = {{translators and commentators}%\n                      {trans\\adddot\\ and comm\\adddot}},\n  translatoran     = {{translator and annotator}%\n                      {trans\\adddot\\ and annot\\adddot}},\n  translatorsan    = {{translators and annotators}%\n                      {trans\\adddot\\ and annot\\adddot}},\n  translatorin     = {{translation and introduction}%\n                      {trans\\adddot\\ and introd\\adddot}},\n  translatorsin    = {{translation and introduction}%\n                      {trans\\adddot\\ and introd\\adddot}},\n  translatorfo     = {{translation and foreword}%\n                      {trans\\adddot\\ and forew\\adddot}},\n  translatorsfo    = {{translation and foreword}%\n                      {trans\\adddot\\ and forew\\adddot}},\n  translatoraf     = {{translation and afterword}%\n                      {trans\\adddot\\ and afterw\\adddot}},\n  translatorsaf    = {{translation and afterword}%\n                      {trans\\adddot\\ and afterw\\adddot}},\n  translatorcoin   = {{translation, commentary\\finalandcomma\\ and introduction}%\n                      {trans., comm\\adddot\\finalandcomma\\ and introd\\adddot}},\n  translatorscoin  = {{translation, commentary\\finalandcomma\\ and introduction}%\n                      {trans., comm\\adddot\\finalandcomma\\ and introd\\adddot}},\n  translatorcofo   = {{translation, commentary\\finalandcomma\\ and foreword}%\n                      {trans., comm\\adddot\\finalandcomma\\ and forew\\adddot}},\n  translatorscofo  = {{translation, commentary\\finalandcomma\\ and foreword}%\n                      {trans., comm\\adddot\\finalandcomma\\ and forew\\adddot}},\n  translatorcoaf   = {{translation, commentary\\finalandcomma\\ and afterword}%\n                      {trans., comm\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  translatorscoaf  = {{translation, commentary\\finalandcomma\\ and afterword}%\n                      {trans., comm\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  translatoranin   = {{translation, annotations\\finalandcomma\\ and introduction}%\n                      {trans., annot\\adddot\\finalandcomma\\ and introd\\adddot}},\n  translatorsanin  = {{translation, annotations\\finalandcomma\\ and introduction}%\n                      {trans., annot\\adddot\\finalandcomma\\ and introd\\adddot}},\n  translatoranfo   = {{translation, annotations\\finalandcomma\\ and foreword}%\n                      {trans., annot\\adddot\\finalandcomma\\ and forew\\adddot}},\n  translatorsanfo  = {{translation, annotations\\finalandcomma\\ and foreword}%\n                      {trans., annot\\adddot\\finalandcomma\\ and forew\\adddot}},\n  translatoranaf   = {{translation, annotations\\finalandcomma\\ and afterword}%\n                      {trans., annot\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  translatorsanaf  = {{translation, annotations\\finalandcomma\\ and afterword}%\n                      {trans., annot\\adddot\\finalandcomma\\ and afterw\\adddot}},\n  byauthor         = {{by}{by}},\n  byeditor         = {{edited by}{ed\\adddotspace by}},\n  bycompiler       = {{compiled by}{comp\\adddotspace by}},\n  byredactor       = {{redacted by}{red\\adddotspace by}},\n  byreviser        = {{revised by}{rev\\adddotspace by}},\n  byreviewer       = {{reviewed by}{rev\\adddotspace by}},\n  byfounder        = {{founded by}{found\\adddotspace by}},\n  bycontinuator    = {{continued by}{cont\\adddotspace by}},\n  bycollaborator   = {{in collaboration with}{in collab\\adddotspace with}},% FIXME: unsure\n  bytranslator     = {{translated \\lbx@lfromlang\\ by}{trans\\adddot\\ \\lbx@sfromlang\\ by}},\n  bycommentator    = {{commented by}{comm\\adddot\\ by}},\n  byannotator      = {{annotated by}{annot\\adddot\\ by}},\n  withcommentator  = {{with a commentary by}{with a comment\\adddot\\ by}},\n  withannotator    = {{with annotations by}{with annots\\adddot\\ by}},\n  withintroduction = {{with an introduction by}{with an intro\\adddot\\ by}},\n  withforeword     = {{with a foreword by}{with a forew\\adddot\\ by}},\n  withafterword    = {{with an afterword by}{with an afterw\\adddot\\ by}},\n  byeditortr       = {{edited and translated \\lbx@lfromlang\\ by}%\n                      {ed\\adddotspace and trans\\adddot\\ \\lbx@sfromlang\\ by}},\n  byeditorco       = {{edited and commented by}%\n                      {ed\\adddotspace and comm\\adddot\\ by}},\n  byeditoran       = {{edited and annotated by}%\n                      {ed\\adddotspace and annot\\adddot\\ by}},\n  byeditorin       = {{edited, with an introduction, by}%\n                      {ed.,\\addabbrvspace with an introd., by}},\n  byeditorfo       = {{edited, with a foreword, by}%\n                      {ed.,\\addabbrvspace with a forew., by}},\n  byeditoraf       = {{edited, with an afterword, by}%\n                      {ed.,\\addabbrvspace with an afterw., by}},\n  byeditortrco     = {{edited, translated \\lbx@lfromlang\\finalandcomma\\ and commented by}%\n                      {ed.,\\addabbrvspace trans\\adddot\\ \\lbx@sfromlang\\finalandcomma\\ and comm\\adddot\\ by}},\n  byeditortran     = {{edited, translated \\lbx@lfromlang\\finalandcomma\\ and annotated by}%\n                      {ed.,\\addabbrvspace trans\\adddot\\ \\lbx@sfromlang\\finalandcomma\\ and annot\\adddot\\ by}},\n  byeditortrin     = {{edited and translated \\lbx@lfromlang, with an introduction, by}%\n                      {ed\\adddotspace and trans\\adddot\\ \\lbx@sfromlang, with an introd., by}},\n  byeditortrfo     = {{edited and translated \\lbx@lfromlang, with a foreword, by}%\n                      {ed\\adddotspace and trans\\adddot\\ \\lbx@sfromlang, with a forew., by}},\n  byeditortraf     = {{edited and translated \\lbx@lfromlang, with an afterword, by}%\n                      {ed\\adddotspace and trans\\adddot\\ \\lbx@sfromlang, with an afterw., by}},\n  byeditorcoin     = {{edited and commented, with an introduction, by}%\n                      {ed\\adddotspace and comm., with an introd., by}},\n  byeditorcofo     = {{edited and commented, with a foreword, by}%\n                      {ed\\adddotspace and comm., with a forew., by}},\n  byeditorcoaf     = {{edited and commented, with an afterword, by}%\n                      {ed\\adddotspace and comm., with an afterw., by}},\n  byeditoranin     = {{edited and annotated, with an introduction, by}%\n                      {ed\\adddotspace and annot., with an introd., by}},\n  byeditoranfo     = {{edited and annotated, with a foreword, by}%\n                      {ed\\adddotspace and annot., with a forew., by}},\n  byeditoranaf     = {{edited and annotated, with an afterword, by}%\n                      {ed\\adddotspace and annot., with an afterw., by}},\n  byeditortrcoin   = {{edited, translated \\lbx@lfromlang\\finalandcomma\\ and commented, with an introduction, by}%\n                      {ed.,\\addabbrvspace trans\\adddot\\ \\lbx@sfromlang\\finalandcomma\\ and comm., with an introd., by}},\n  byeditortrcofo   = {{edited, translated \\lbx@lfromlang\\finalandcomma\\ and commented, with a foreword, by}%\n                      {ed.,\\addabbrvspace trans\\adddot\\ \\lbx@sfromlang\\finalandcomma\\ and comm., with a forew., by}},\n  byeditortrcoaf   = {{edited, translated \\lbx@lfromlang\\finalandcomma\\ and commented, with an afterword, by}%\n                      {ed.,\\addabbrvspace trans\\adddot\\ \\lbx@sfromlang\\finalandcomma\\ and comm., with an afterw., by}},\n  byeditortranin   = {{edited, translated \\lbx@lfromlang\\finalandcomma\\ and annotated, with an introduction, by}%\n                      {ed.,\\addabbrvspace trans\\adddot\\ \\lbx@sfromlang\\finalandcomma\\ and annot, with an introd., by}},\n  byeditortranfo   = {{edited, translated \\lbx@lfromlang\\finalandcomma\\ and annotated, with a foreword, by}%\n                      {ed.,\\addabbrvspace trans\\adddot\\ \\lbx@sfromlang\\finalandcomma\\ and annot, with a forew., by}},\n  byeditortranaf   = {{edited, translated \\lbx@lfromlang\\finalandcomma\\ and annotated, with an afterword, by}%\n                      {ed.,\\addabbrvspace trans\\adddot\\ \\lbx@sfromlang\\finalandcomma\\ and annot, with an afterw., by}},\n  bytranslatorco   = {{translated \\lbx@lfromlang\\ and commented by}%\n                      {trans\\adddot\\ \\lbx@sfromlang\\ and comm\\adddot\\ by}},\n  bytranslatoran   = {{translated \\lbx@lfromlang\\ and annotated by}%\n                      {trans\\adddot\\ \\lbx@sfromlang\\ and annot\\adddot\\ by}},\n  bytranslatorin   = {{translated \\lbx@lfromlang, with an introduction, by}%\n                      {trans\\adddot\\ \\lbx@sfromlang, with an introd., by}},\n  bytranslatorfo   = {{translated \\lbx@lfromlang, with a foreword, by}%\n                      {trans\\adddot\\ \\lbx@sfromlang, with a forew., by}},\n  bytranslatoraf   = {{translated \\lbx@lfromlang, with an afterword, by}%\n                      {trans\\adddot\\ \\lbx@sfromlang, with an afterw., by}},\n  bytranslatorcoin = {{translated \\lbx@lfromlang\\ and commented, with an introduction, by}%\n                      {trans\\adddot\\ \\lbx@sfromlang\\ and comm., with an introd., by}},\n  bytranslatorcofo = {{translated \\lbx@lfromlang\\ and commented, with a foreword, by}%\n                      {trans\\adddot\\ \\lbx@sfromlang\\ and comm., with a forew., by}},\n  bytranslatorcoaf = {{translated \\lbx@lfromlang\\ and commented, with an afterword, by}%\n                      {trans\\adddot\\ \\lbx@sfromlang\\ and comm., with an afterw., by}},\n  bytranslatoranin = {{translated \\lbx@lfromlang\\ and annotated, with an introduction, by}%\n                      {trans\\adddot\\ \\lbx@sfromlang\\ and annot., with an introd., by}},\n  bytranslatoranfo = {{translated \\lbx@lfromlang\\ and annotated, with a foreword, by}%\n                      {trans\\adddot\\ \\lbx@sfromlang\\ and annot., with a forew., by}},\n  bytranslatoranaf = {{translated \\lbx@lfromlang\\ and annotated, with an afterword, by}%\n                      {trans\\adddot\\ \\lbx@sfromlang\\ and annot., with an afterw., by}},\n  and              = {{and}{and}},\n  andothers        = {{et\\addabbrvspace al\\adddot}{et\\addabbrvspace al\\adddot}},\n  andmore          = {{et\\addabbrvspace al\\adddot}{et\\addabbrvspace al\\adddot}},\n  volume           = {{volume}{vol\\adddot}},\n  volumes          = {{volumes}{vols\\adddot}},\n  involumes        = {{in}{in}},\n  jourvol          = {{volume}{vol\\adddot}},\n  jourser          = {{series}{ser\\adddot}},\n  book             = {{book}{book}},\n  part             = {{part}{part}},\n  issue            = {{issue}{issue}},\n  newseries        = {{new series}{new ser\\adddot}},\n  oldseries        = {{old series}{old ser\\adddot}},\n  edition          = {{edition}{ed\\adddot}},\n  reprint          = {{reprint}{repr\\adddot}},\n  reprintof        = {{reprint of}{repr\\adddotspace of}},\n  reprintas        = {{reprinted as}{rpt\\adddotspace as}},\n  reprintfrom      = {{reprinted from}{repr\\adddotspace from}},\n  reviewof         = {{review of}{rev\\adddotspace of}},\n  translationof    = {{translation of}{trans\\adddotspace of}},\n  translationas    = {{translated as}{trans\\adddotspace as}},\n  translationfrom  = {{translated from}{trans\\adddotspace from}},\n  origpubas        = {{originally published as}{orig\\adddotspace pub\\adddotspace as}},\n  origpubin        = {{originally published in}{orig\\adddotspace pub\\adddotspace in}},\n  astitle          = {{as}{as}},\n  bypublisher      = {{by}{by}},\n  page             = {{page}{p\\adddot}},\n  pages            = {{pages}{pp\\adddot}},\n  column           = {{column}{col\\adddot}},\n  columns          = {{columns}{cols\\adddot}},\n  line             = {{line}{l\\adddot}},\n  lines            = {{lines}{ll\\adddot}},\n  nodate           = {{no date}{n\\adddot d\\adddot}},\n  verse            = {{verse}{v\\adddot}},\n  verses           = {{verses}{vv\\adddot}},\n  section          = {{section}{\\S}},\n  sections         = {{sections}{\\S\\S}},\n  paragraph        = {{paragraph}{par\\adddot}},\n  paragraphs       = {{paragraphs}{par\\adddot}},\n  in               = {{in}{in}},\n  inseries         = {{in}{in}},\n  ofseries         = {{of}{of}},\n  number           = {{number}{no\\adddot}},\n  chapter          = {{chapter}{chap\\adddot}},\n  mathesis         = {{Master's thesis}{MA\\addabbrvspace thesis}},\n  phdthesis        = {{PhD\\addabbrvspace thesis}{PhD\\addabbrvspace thesis}},\n  candthesis       = {{Candidate thesis}{Cand\\adddotspace thesis}},\n  resreport        = {{research report}{research rep\\adddot}},\n  techreport       = {{technical report}{tech\\adddotspace rep\\adddot}},\n  software         = {{computer software}{comp\\adddotspace software}},\n  datacd           = {{CD-ROM}{CD-ROM}},\n  audiocd          = {{audio CD}{audio CD}},\n  version          = {{version}{version}},\n  url              = {{address}{address}},\n  urlfrom          = {{available from}{available from}},\n  urlseen          = {{visited on}{visited on}},\n  inpreparation    = {{in preparation}{in preparation}},\n  submitted        = {{submitted}{submitted}},\n  forthcoming      = {{forthcoming}{forthcoming}},\n  inpress          = {{in press}{in press}},\n  prepublished     = {{pre-published}{pre-published}},\n  citedas          = {{henceforth cited as}{henceforth cited as}},\n  thiscite         = {{especially}{esp\\adddot}},\n  seenote          = {{see note}{see n\\adddot}},\n  quotedin         = {{quoted in}{qtd\\adddotspace in}},\n  idem             = {{idem}{idem}},\n  idemsm           = {{idem}{idem}},\n  idemsf           = {{eadem}{eadem}},\n  idemsn           = {{idem}{idem}},\n  idempm           = {{eidem}{eidem}},\n  idempf           = {{eaedem}{eaedem}},\n  idempn           = {{eadem}{eadem}},\n  idempp           = {{eidem}{eidem}},\n  ibidem           = {{ibidem}{ibid\\adddot}},\n  opcit            = {{op\\adddotspace cit\\adddot}{op\\adddotspace cit\\adddot}},\n  loccit           = {{loc\\adddotspace cit\\adddot}{loc\\adddotspace cit\\adddot}},\n  confer           = {{cf\\adddot}{cf\\adddot}},\n  sequens          = {{sq\\adddot}{sq\\adddot}},\n  sequentes        = {{sqq\\adddot}{sqq\\adddot}},\n  passim           = {{passim}{pass\\adddot}},\n  see              = {{see}{see}},\n  seealso          = {{see also}{see also}},\n  backrefpage      = {{cited on page}{cit\\adddotspace on p\\adddot}},\n  backrefpages     = {{cited on pages}{cit\\adddotspace on pp\\adddot}},\n  january          = {{January}{Jan\\adddot}},\n  february         = {{February}{Feb\\adddot}},\n  march            = {{March}{Mar\\adddot}},\n  april            = {{April}{Apr\\adddot}},\n  may              = {{May}{May}},\n  june             = {{June}{June}},\n  july             = {{July}{July}},\n  august           = {{August}{Aug\\adddot}},\n  september        = {{September}{Sept\\adddot}},\n  october          = {{October}{Oct\\adddot}},\n  november         = {{November}{Nov\\adddot}},\n  december         = {{December}{Dec\\adddot}},\n  langamerican     = {{American}{American}},\n  langbrazilian    = {{Brazilian}{Brazilian}},\n  langcatalan      = {{Catalan}{Catalan}},\n  langcroatian     = {{Croatian}{Croatian}},\n  langczech        = {{Czech}{Czech}},\n  langdanish       = {{Danish}{Danish}},\n  langdutch        = {{Dutch}{Dutch}},\n  langenglish      = {{English}{English}},\n  langfinnish      = {{Finnish}{Finnish}},\n  langfrench       = {{French}{French}},\n  langgerman       = {{German}{German}},\n  langgreek        = {{Greek}{Greek}},\n  langitalian      = {{Italian}{Italian}},\n  langlatin        = {{Latin}{Latin}},\n  langnorwegian    = {{Norwegian}{Norwegian}},\n  langpolish       = {{Polish}{Polish}},\n  langportuguese   = {{Portuguese}{Portuguese}},\n  langrussian      = {{Russian}{Russian}},\n  langslovene      = {{Slovene}{Slovene}},\n  langspanish      = {{Spanish}{Spanish}},\n  langswedish      = {{Swedish}{Swedish}},\n  fromamerican     = {{from the American}{from the American}},\n  frombrazilian    = {{from the Brazilian}{from the Brazilian}},\n  fromcatalan      = {{from the Catalan}{from the Catalan}},\n  fromcroatian     = {{from the Croatian}{from the Croatian}},\n  fromczech        = {{from the Czech}{from the Czech}},\n  fromdanish       = {{from the Danish}{from the Danish}},\n  fromdutch        = {{from the Dutch}{from the Dutch}},\n  fromenglish      = {{from the English}{from the English}},\n  fromfinnish      = {{from the Finnish}{from the Finnish}},\n  fromfrench       = {{from the French}{from the French}},\n  fromgerman       = {{from the German}{from the German}},\n  fromgreek        = {{from the Greek}{from the Greek}},\n  fromitalian      = {{from the Italian}{from the Italian}},\n  fromlatin        = {{from the Latin}{from the Latin}},\n  fromnorwegian    = {{from the Norwegian}{from the Norwegian}},\n  frompolish       = {{from the Polish}{from the Polish}},\n  fromportuguese   = {{from the Portuguese}{from the Portuguese}},\n  fromrussian      = {{from the Russian}{from the Russian}},\n  fromslovene      = {{from the Slovene}{from the Slovene}},\n  fromspanish      = {{from the Spanish}{from the Spanish}},\n  fromswedish      = {{from the Swedish}{from the Swedish}},\n  countryde        = {{Germany}{DE}},\n  countryeu        = {{European Union}{EU}},\n  countryep        = {{European Union}{EP}},\n  countryfr        = {{France}{FR}},\n  countryuk        = {{United Kingdom}{GB}},\n  countryus        = {{United States of America}{US}},\n  patent           = {{patent}{pat\\adddot}},\n  patentde         = {{German patent}{German pat\\adddot}},\n  patenteu         = {{European patent}{European pat\\adddot}},\n  patentfr         = {{French patent}{French pat\\adddot}},\n  patentuk         = {{British patent}{British pat\\adddot}},\n  patentus         = {{U.S\\adddotspace patent}{U.S\\adddotspace pat\\adddot}},\n  patreq           = {{patent request}{pat\\adddot\\ req\\adddot}},\n  patreqde         = {{German patent request}{German pat\\adddot\\ req\\adddot}},\n  patreqeu         = {{European patent request}{European pat\\adddot\\ req\\adddot}},\n  patreqfr         = {{French patent request}{French pat\\adddot\\ req\\adddot}},\n  patrequk         = {{British patent request}{British pat\\adddot\\ req\\adddot}},\n  patrequs         = {{U.S\\adddotspace patent request}{U.S\\adddotspace pat\\adddot\\ req\\adddot}},\n  file             = {{file}{file}},\n  library          = {{library}{library}},\n  abstract         = {{abstract}{abstract}},\n  annotation       = {{annotations}{annotations}},\n}\n\n\\protected\\gdef\\lbx@us@mkbibrangetrunc@long#1#2{%\n  \\iffieldundef{#2year}\n    {}\n    {\\printtext[#2date]{%\n       \\iffieldsequal{#2year}{#2endyear}\n\t {\\csuse{mkbibdate#1}{}{#2month}{#2day}}\n\t {\\csuse{mkbibdate#1}{#2year}{#2month}{#2day}}%\n       \\iffieldundef{#2endyear}\n\t {}\n\t {\\iffieldequalstr{#2endyear}{}\n            {\\mbox{\\bibdatedash}}\n\t    {\\bibdatedash\n\t     \\iffieldsequal{#2year}{#2endyear}\n\t       {\\iffieldsequal{#2month}{#2endmonth}\n        \t  {\\csuse{mkbibdate#1}{#2endyear}{}{#2endday}}\n\t\t  {\\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}}\n\t       {\\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}}}}}}\n\n\\protected\\gdef\\lbx@us@mkbibrangetrunc@short#1#2{%\n  \\iffieldundef{#2year}\n    {}\n    {\\printtext[#2date]{%\n       \\iffieldsequal{#2year}{#2endyear}\n         {\\csuse{mkbibdate#1}{}{#2month}{#2day}}\n         {\\csuse{mkbibdate#1}{#2year}{#2month}{#2day}}%\n       \\iffieldundef{#2endyear}\n         {}\n         {\\iffieldequalstr{#2endyear}{}\n            {\\mbox{\\bibdatedash}}\n            {\\bibdatedash\n             \\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}}}}}\n\n\\protected\\gdef\\lbx@us@mkbibrangetruncextra@long#1#2{%\n  \\iffieldundef{#2year}\n    {}\n    {\\printtext[#2date]{%\n       \\iffieldsequal{#2year}{#2endyear}\n         {\\csuse{mkbibdate#1}{}{#2month}{#2day}}\n         {\\csuse{mkbibdate#1}{#2year}{#2month}{#2day}}%\n       \\iffieldundef{#2endyear}\n         {\\printfield{extrayear}}\n         {\\iffieldequalstr{#2endyear}{}\n            {\\printfield{extrayear}%\n             \\mbox{\\bibdatedash}}\n            {\\bibdatedash\n             \\iffieldsequal{#2year}{#2endyear}\n               {\\iffieldsequal{#2month}{#2endmonth}\n                  {\\csuse{mkbibdate#1}{#2endyear}{}{#2endday}}\n                  {\\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}}\n               {\\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}%\n             \\printfield{extrayear}}}}}}\n\n\\protected\\gdef\\lbx@us@mkbibrangetruncextra@short#1#2{%\n  \\iffieldundef{#2year}\n    {}\n    {\\printtext[#2date]{%\n       \\iffieldsequal{#2year}{#2endyear}\n         {\\csuse{mkbibdate#1}{}{#2month}{#2day}}\n         {\\csuse{mkbibdate#1}{#2year}{#2month}{#2day}}%\n       \\iffieldundef{#2endyear}\n         {\\printfield{extrayear}}\n         {\\iffieldequalstr{#2endyear}{}\n            {\\printfield{extrayear}%\n          \\mbox{\\bibdatedash}}\n         {\\bibdatedash\n          \\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}%\n       \\printfield{extrayear}}}}}}\n\n\\endinput\n"
  },
  {
    "path": "src/test/resources/samples/langs/TeX/perl.toc",
    "content": "\\contentsline {section}{\\numberline {1}History}{3}\n\\contentsline {subsection}{\\numberline {1.1}Early versions}{3}\n\\contentsline {subsection}{\\numberline {1.2}Early Perl 5}{3}\n\\contentsline {subsection}{\\numberline {1.3}2000-present}{3}\n\\contentsline {subsection}{\\numberline {1.4}Name}{3}\n\\contentsline {subsection}{\\numberline {1.5}Camel symbol}{3}\n\\contentsline {subsection}{\\numberline {1.6}Onion symbol}{3}\n\\contentsline {section}{\\numberline {2}Overview}{3}\n\\contentsline {subsection}{\\numberline {2.1}Features}{3}\n\\contentsline {subsection}{\\numberline {2.2}Design}{3}\n\\contentsline {subsection}{\\numberline {2.3}Applications}{3}\n\\contentsline {subsection}{\\numberline {2.4}Implementation}{3}\n\\contentsline {section}{\\numberline {3}Database interfaces}{3}\n\\contentsline {section}{\\numberline {4}Distribution}{4}\n\\contentsline {subsection}{\\numberline {4.1}Availability}{4}\n\\contentsline {subsubsection}{\\numberline {4.3.1}Windows}{5}\n\\contentsline {subsubsection}{\\numberline {4.3.2}Mac OS X}{6}\n\\contentsline {subsubsection}{\\numberline {4.3.3}OpenBSD}{6}\n\\contentsline {subsubsection}{\\numberline {4.3.4}FreeBSD}{6}\n"
  },
  {
    "path": "src/test/resources/samples/langs/TeX/problemset.cls",
    "content": "% =====================================\n% problemset Document Style\n%   For Problem Sets\n%\n% Options:\n% final      hides to-dos\n% worksheet  hides solutions and places each problem on separate page\n% expand     places each problem on a separate page\n% =====================================\n\n\\ProvidesClass{problemset}\n\\DeclareOption*{\\PassOptionsToClass{final}{article}}\n\\DeclareOption{worksheet}{\\providecommand{\\@solutionvis}{0}}\n\\DeclareOption{expand}{\\providecommand{\\@expand}{1}}\n\\ProcessOptions\\relax\n\n% ================== Packages and Document Options ==================\n\\LoadClass[10pt,letterpaper]{article}\n\\RequirePackage[%\n        top=0.85in,\n        bottom=1in,\n        left=1in,\n        right=1in\n        ]{geometry}\n\\RequirePackage{pgfkeys}    % For mathtable environment.\n\\RequirePackage{tabularx}   % For pset heading\n\\RequirePackage{float}      % Used for floats (tables, figures, etc.)\n\\RequirePackage{graphicx}   % Used for inserting images.\n\\RequirePackage{enumerate}  % Used for the enumerate environment.\n\\RequirePackage{mathtools}  % Required. Loads amsmath.\n\\RequirePackage{amsthm}     % Required. Used for theorem environments.\n\\RequirePackage{amssymb}    % Required.\n\\RequirePackage{booktabs}   % Required. Used for mathtable environment.\n\\RequirePackage{esdiff}     % For derivatives and partial derivatives\n\\RequirePackage{mathtools}  % Optional. Used for \\shortintertext.\n\\RequirePackage{fancyhdr}   % Required. For customizing headers/footers.\n\\RequirePackage{lastpage}   % Required. For page count in header/footer.\n\\RequirePackage{xcolor}     % Required. For setting the color of hyperlinks\n\\RequirePackage[%\n        obeyFinal,          % Disable todos by setting [final] option for class\n        color=@todoclr,\n        linecolor=red\n        ]{todonotes}        % For keeping track of to-dos.\n\\RequirePackage[%\n        colorlinks=true,\n        linkcolor=navy,\n        urlcolor=black\n        ]{hyperref}         % For following urls and references in a document.\n\\RequirePackage{url}        % Enables urls with the \\url tag\n\\RequirePackage[all]{hypcap}\n% hypcap: Links go to object instead of caption. [Keep as last package]\n\n% ==================   Appearance Settings   ==================\n\\definecolor{@todoclr}{gray}{0.80}   % For To-Dos. 50% brightness\n\\definecolor{navy}{RGB}{0,0,150}     % For coloring hyperlinks\n\\setlength{\\parskip}{1.5ex}          % Sets space between paragraphs.\n\\setlength{\\parindent}{0pt}          % Indent for first line of new paragraphs.\n\n% Smaller verbatim type size\n\\let\\VERBATIM\\verbatim\n\\def\\verbatim{%\n  \\def\\verbatim@font{\\small\\ttfamily}%\n\\VERBATIM}\n\n% =============   Caption Modifications   =============\n\\usepackage[small]{caption}\n\\usepackage[footnotesize]{subcaption}\n    % For no visible number, use: \\caption*{Unnumbered figure caption.}\n\\captionsetup[table]{labelformat=simple, labelsep=period, labelfont=bf}\n\\captionsetup[figure]{labelformat=simple, labelsep=period, labelfont=bf}\n\\captionsetup[subtable]{labelformat=parens, labelsep=space, labelfont=bf}\n\\captionsetup[subfigure]{labelformat=simple, labelsep=period, labelfont=bf}\n\n% ==================     Booleans     ==================\n\\def\\TRUE{1}\n\\def\\FALSE{0}\n\\def\\SHOW{1}\n\\def\\HIDE{0}\n\n% ============= Gets Document Info, Generates Heading =============\n\\providecommand{\\heading}[5][]{\n  \\thispagestyle{empty}\n  \\listoftodos\n  \\clearpage\n  \\pagenumbering{arabic}\n  %\n  \\providecommand{\\shortname}{#1}\n  \\providecommand{\\authorname}{#2}\n  \\providecommand{\\coursename}{#3}\n  \\providecommand{\\assignment}{#4}\n  \\providecommand{\\duedate}{#5}\n  \\begin{minipage}{0.5\\textwidth}\n    \\begin{flushleft}\n      \\hypertarget{@assignment}{\n        \\textbf{\\assignment}\n      }\\\\\n      \\authorname\n    \\end{flushleft}\n  \\end{minipage}\n  \\begin{minipage}{0.5\\textwidth}\n    \\begin{flushright}\n      \\coursename\\\\\n      \\duedate\\\\\n    \\end{flushright}\n  \\end{minipage}\n  \\thispagestyle{empty}\n}\n\n% ============= Headers and Footers =============\n\\renewcommand{\\headrulewidth}{0pt}\n\\renewcommand{\\footrulewidth}{0.5pt}\n\\pagestyle{fancyplain}\n\\fancyhf{}\n\\lfoot{%\n\\fancyplain{}{%\n  \\hyperlink{@assignment}{%\n    \\small{%\n      \\color{black}{%\n        \\assignment\n      }\n    }\n  }\n}\n}\n\\cfoot{%\n\\fancyplain{}{%\n    \\small{%\n      \\coursename\n    }\n}\n}\n\\rfoot{%\n\\fancyplain{}{%\n  \\small{\\shortname~\\thepage~of~\\pageref{LastPage}}\n}\n}\n\n% ============= Problem Command =============\n% INPUT: Points for question [#1] (Optional)\n\\newcounter{theproblem} % Problem counter for environment\n\n\\providecommand{\\problem}[1][]{%\n  \\addtocounter{theproblem}{1}%\n  \\setcounter{table}{0}%\n  \\setcounter{figure}{0}%\n  \\setcounter{equation}{0}%\n  \\noindent%\n  \\textbf{%\n      Problem~\\arabic{theproblem}.}~\\textit{\\small{#1}}\n\n}\n\n% ============= QED, Page Breaks After QED? =============\n\\providecommand{\\@expand}{\\HIDE}  % Default is to omit pagebreaks after the solution\n\\providecommand{\\qqed}{\\hfill\\rule{2mm}{2mm}\\ifnum\\@expand=\\SHOW\\\\\\pagebreak\\fi}\n\n\n% ============= Solution Command =============\n\\providecommand{\\@solutionvis}{1}  % Default setting is to show solutions.\n\\providecommand{\\solution}[2][\\@solutionvis]{\n\\vspace{0.5em}\\noindent\\textbf{Solution.}\n\\ifnum#1=\\SHOW%\n#2\n\n\\hfill\\qqed\\vspace{0.1em}\n\\else%\n\\pagebreak%\n\\fi\n}\n\n% ============= Chapter, Section, Item Commands =============\n\\providecommand{\\chap}[2][0]{\n\\ifnum#1=0%\n\\else%\n\\setcounter{section}{#1}%\n\\addtocounter{section}{-1}%\n\\fi%\n\\vspace{-1.75em}%\n\\section{#2}\n}\n\n\\providecommand{\\sect}[2][0]{\n\\ifnum#1=0%\n\\else%\n\\setcounter{subsection}{#1}%\n\\addtocounter{subsection}{-1}%\n\\fi%\n\\vspace{-0.5em}%\n\\subsection{#2}\n}\n\n\\providecommand{\\subsect}[1]{\\noindent\\textbf{#1.}}\n\n% ============= Insert Non-Float Image =============\n\\providecommand{\\insertgraphic}[2][0.5\\textwidth]{\n\\vspace{-1em}\n\\begin{center}\n  \\includegraphics[width=#1]{#2}\n\\end{center}\n\\vspace{-1em}\n}\n\n\n\n% ============= Object Numbering by Problem =============\n\\renewcommand{\\thetable}{\\arabic{theproblem}.\\arabic{table}}\n\\renewcommand{\\thefigure}{\\arabic{theproblem}.\\arabic{figure}}\n\\renewcommand{\\theequation}{\\arabic{theproblem}.\\arabic{equation}}\n\n\n% ============= Formula Environment =============\n\\newcounter{formula}\n\\newenvironment{formula}[1][Formula \\arabic{formula}]\n{\n  \\addtocounter{formula}{1}\n  \\begin{displaymath}\n  \\tag*{\\parbox{5em}{\\textbf{\\small{#1}}}}\n}{\n  \\end{displaymath}\\\\\n}\n\n% ============= Math Table =============\n\\newif\\ifcaption\n\\pgfkeys\n{\n  /mypkg/title/.store in=\\Caption,% Any value assigned to title will be stored in \\Caption\n  /mypkg/title= ,              % Initialize so \\Caption exists\n   /mypkg/label/.store in=\\Label,  % Any value assigned to label will be stored in \\Label\n   /mypkg/label= ,              % Initialize so \\Label exists\n   /mypkg/caption/.is if=caption,  % Declare a boolean, defaults to false\n}\n\\newenvironment{mathtable}[2][]{\n  \\pgfkeys{/mypkg/.cd, #1}%\n  \\vspace{-1em}%\n  \\begin{table}[ht!]%\n  \\small \\begin{center}%\n  \\begin{displaymath}%\n  \\begin{array}{#2}%\n  \\toprule\n}{\n  \\bottomrule\n  \\end{array}%\n  \\end{displaymath}%\n  \\ifcaption%\n  \\vspace{-1em}\\caption{\\Caption}\\label{\\Label}%\n  \\fi%\n  \\end{center}%\n  \\end{table}%\n  \\vspace{-1em}%\n}\n\n\n% ============= Double-line Column-Heading for table =============\n\\providecommand{\\double}[2]{%\n  \\multicolumn{1}{c}{%\n    \\genfrac{}{}{0pt}{}{\\text{#1}}{\\text{#2}}\n  }\n}\n\n\n% ============= Theorem-Style Environments =============\n\\theoremstyle{plain}          % Bold label, italic letters\n\\newtheorem{thm}{Theorem}[section]    % Numbered by section\n\\newtheorem{lma}[thm]{Lemma}\n\\newtheorem{crl}[thm]{Corollary}\n\\newtheorem{prp}[thm]{Proposition}\n\\newtheorem{cnj}[thm]{Conjecture}\n\\newtheorem{alg}[thm]{Algorithm}\n\n% Associated environments (for numbered theorem environments)\n\\newenvironment{theorem}[2][]{\\begin{thm}[#1]\\label{#2}}{\\end{thm}}\n\\newenvironment{lemma}[2][]{\\begin{lma}[#1]\\label{#2}}{\\end{lma}}\n\\newenvironment{corollary}[2][]{\\begin{crl}[#1]\\label{#2}}{\\end{thm}}\n\\newenvironment{proposition}[2][]{\\begin{prp}[#1]\\label{#2}}{\\end{crl}}\n\\newenvironment{conjecture}[2][]{\\begin{cnj}[#1]\\label{#2}}{\\end{cnj}}\n\\newenvironment{algorithm}[2][]{\\begin{alg}[#1]\\label{#2}}{\\end{alg}}\n\n\\theoremstyle{remark}          % Italic label, roman letters\n\\newtheorem{rmk}{Remark}[section]    % Numbered by section. Remarks are used to expand on and integrate material.\n\\newtheorem*{note}{Note}        % Un-numbered. Notes are used to comment on specific elements of the material.\n\\newtheorem*{caveat}{Caveat}      % Un-numbered. Caveats are used to guide the reader away from a common error.\n\\newtheorem*{warning}{Warning}      % Un-numbered. Warnings are used to guide away from especially egregious errors.\n\n\\theoremstyle{definition}        % Bold label, roman letters\n\\newtheorem{dfn}{Definition}[section]  % Numbered by section. Definitions of concepts and terms.\n\\newtheorem{exm}{Example}[section]    % Numbered by section. Illustrative examples.\n\\newtheorem{smm}{Summary}[subsection]  % Numbered by subsection. For section summaries.\n\\newtheorem*{question}{Question}    % Un-numbered. For questions to motivate further analysis.\n\\newtheorem*{speculation}{Speculation}  % Un-numbered. For questions that arise but will not be immediately answered.\n\n% Associated environments (for numbered theorem environments)\n\\newenvironment{remark}[2][]{\\begin{rmk}[#1]\\label{#2}}{\\end{rmk}}\n\\newenvironment{definition}[2][]{\\begin{dfn}[#1]\\label{#2}}{\\end{dfn}}\n\\newenvironment{example}[2][]{\\begin{exm}[#1]\\label{#2}}{\\end{exm}}\n\\newenvironment{summary}[2][]{\\begin{smm}[#1]\\label{#2}}{\\end{smm}}\n\n\n% ============= Greek Letters =============\n\\renewcommand{\\a}{\\ensuremath{\\alpha}}\n\\renewcommand{\\b}{\\ensuremath{\\beta}}\n\\renewcommand{\\c}{\\ensuremath{\\gamma}}\n\\newcommand{\\ch}{\\ensuremath{\\chi}}\n\\renewcommand{\\d}{\\ensuremath{\\delta}}\n\\newcommand{\\ep}{\\ensuremath{\\epsilon}}\n\\newcommand{\\et}{\\ensuremath{\\eta}}\n\\newcommand{\\ve}{\\ensuremath{\\varepsilon}}\n\\renewcommand{\\r}{\\ensuremath{\\rho}}\n\\newcommand{\\s}{\\ensuremath{\\sigma}}\n\\renewcommand{\\t}{\\ensuremath{\\tau}}\n\\newcommand{\\f}{\\ensuremath{\\psi}}\n\\newcommand{\\w}{\\ensuremath{\\omega}}\n\\newcommand{\\h}{\\ensuremath{\\phi}}\n\\newcommand{\\m}{\\ensuremath{\\mu}}\n\\renewcommand{\\l}{\\ensuremath{\\lambda}}\n\\renewcommand{\\k}{\\ensuremath{\\kappa}}\n\\renewcommand{\\v}{\\ensuremath{\\nu}}\n\\renewcommand{\\i}{\\ensuremath{\\iota}}\n\\renewcommand{\\o}{\\ensuremath{\\theta}}\n\\newcommand{\\z}{\\ensuremath{\\zeta}}\n\n% ============= Mathematical Symbols =============\n\\providecommand{\\NN}{\\ensuremath{\\mathbb{N}}}\n\\providecommand{\\ZZ}{\\ensuremath{\\mathbb{Z}}}\n\\providecommand{\\QQ}{\\ensuremath{\\mathbb{Q}}}\n\\providecommand{\\RR}{\\ensuremath{\\mathbb{R}}}\n\\providecommand{\\CC}{\\ensuremath{\\mathbb{C}}}\n\\providecommand{\\pd}{\\partial}    % 'dee' symbol for partial derivatives\n\\providecommand{\\dd}{\\mathrm{d}} % 'dee' symbol for ordinary derivatives\n\\providecommand{\\x}{\\times}\n\\providecommand{\\n}{\\scalebox{0.6}[1.0]{\\ensuremath{-}}}\n\n\n\n% ============= Mathematical Macros =============\n\\providecommand{\\Sum}[3][n]{\\ensuremath{\\sum_{{#1}={#2}}^{#3}}}     % Sum from [n]={1}to{2}.     \\Sum{1}{10}\n\\providecommand{\\infsum}[2][n]{\\ensuremath{\\sum_{{#1}={#2}}^\\infty}}  % Infinite sum from [n]={1}    \\infsum{1}\n\\providecommand{\\Int}[4][x]{\\ensuremath{\\int_{#3}^{#4}\\!{#2}\\,\\mathrm{d}{#1}}}   % Integrate {1} from {2} to {3} with respect to [x]\n\\providecommand{\\Lim}[3][\\infty]{\\ensuremath{\\displaystyle \\lim_{{#2}\\to{#1}}\\!\\!{#3}}} % Take the limit from {1} to [infinity] of {3} \\Lim{x}{f(x)}\n\\providecommand{\\Frac}[2]{\\ensuremath{\\,^{#1}\\!/\\!_{#2}}}            % Slanted fraction with proper spacing. Usefule for in-line display of fractions.\n\\providecommand{\\eval}[3]{\\ensuremath{\\left[ #1 \\right \\vert_{#2}^{#3}}}\n\\renewcommand{\\L}{\\left}              % for left-hand right-sizing\n\\providecommand{\\R}{\\right}            % for right-hand right-sizing\n\\providecommand{\\D}{\\diff}            % for writing derivatives\n\\providecommand{\\PD}{\\diffp}          % for writing partial derivatives\n\\providecommand{\\full}{\\displaystyle}      % Forces display style in math mode\n\\providecommand{\\Deg}{\\ensuremath{^\\circ}}    % for adding a degree symbol, even if not in math mode\n\\providecommand{\\abs}[1]{\\left\\vert #1 \\right\\vert}   % Absolute Value\n\\providecommand{\\norm}[1]{\\left \\Vert #1 \\right \\Vert}  % Norm (vector magnitude)\n\\providecommand{\\e}[1]{\\ensuremath{\\times 10^{#1}}}    % Scientific Notation with times symbol\n\\providecommand{\\E}[1]{\\ensuremath{10^{#1}}}  % Scientific Notation\n\\renewcommand{\\u}[1]{\\text{ #1}}        % For inserting units in Roman text\n\\providecommand{\\mc}{\\text{,}\\hspace{1em}}    % For inserting comma and space into math mode\n\\providecommand{\\mtxt}[2][]{#1\\hspace{0.5em}\\text{#2}\\hspace{0.5em}}  % For insterting text into math mode with space on either side. Option for preceding punctuation.\n\n% ============= Probability and Statistics =============\n\\providecommand{\\prob}[1]{\\ensuremath{P\\!\\left(#1\\right)} }\n\\providecommand{\\cndprb}[2]{\\ensuremath{P\\!\\left(#1 \\left\\vert  #2 \\right.  \\right)} }\n\\providecommand{\\cov}[1]{\\ensuremath{\\text{Cov}\\!\\left(#1\\right)} }\n\\providecommand{\\ex}[1]{\\ensuremath{E\\!\\left[#1\\right]} }\n\n% ============= Linear Algebra =============\n\n% Column vectors\n\\providecommand{\\twovector}[3][r]{\\left(\\begin{array}{#1} #2 \\\\ #3\\end{array}\\right)}\n\\providecommand{\\threevector}[4][r]{\\left(\\begin{array}{#1}  #2 \\\\ #3 \\\\ #4\\end{array}\\right)}\n\\providecommand{\\fourvector}[5][r]{\\left(\\begin{array}{#1}  #2 \\\\ #3 \\\\ #4 \\\\ #5 \\end{array}\\right)}\n\n% ============= Vector Calculus =============\n% ------------- Susan Lea's notation ---------------\n\\providecommand{\\vecs}[1]{\\ensuremath{\\vec{\\bm{#1}}} }  % bolded symbol, arrow\n\\providecommand{\\vect}[1]{\\ensuremath{\\vec{\\textbf{#1}}} }  % bolded text, arrow\n\\providecommand{\\unitvecs}[1]{\\bm{\\hat{#1}}}\n\\providecommand{\\unitvect}[1]{\\hat{\\textbf{#1}}}\n\\providecommand{\\Div}[1]{\\vecs{\\del} \\cdot \\vect{#1}}\n\\providecommand{\\Curl}[1]{\\vecs{\\del} \\times \\vect{#1}}\n\\providecommand{\\Grad}{\\vecs{\\del}}\n\n\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/TeX/reedthesis.cls",
    "content": "%\n% This file is copyright (C) 2003 Sam Noble. It may be modified so long\n% as my name is not removed and the modifier adds his name to the file.\n% Redistribution permitted.\n%\n% 27 Jan 2004\tSam Noble\tRemoved tocbibind dependency.\n% 04 Dec 2001 \tSam Noble\tClass file\n% 03 Sep 1995\tDavid Perkinson\tTitle Page\n% Acknowledgements Page, David Perkinson & Sam Noble\n% May 2005 Patrick Carlisle Table of contents chapter definition\n% 2004-2005 Ben Salzberg (BTS) a variety of tweaks here and in the template\n%\n% Oddities:\n%\n%   We *ASSUME* that any time \\cleardoublepage is called\n%  we actually want a blank back side with NO page number/heading\n%\n%   Minor bug -- seems to be a more general LaTeX thing:\n%  If you use \\frontmatter \\mainmatter without any chapters inbetween\n%  be prepared to have the page numbering messed up. Not a big deal,\n%  but I'm not sure how to fix it.\n%\n%\n\n\\NeedsTeXFormat{LaTeX2e}\n\\ProvidesClass{reedthesis}[2004/01/27 The Reed College Thesis Class]\n\\DeclareOption*{\\PassOptionsToClass{\\CurrentOption}{book}}\n\\ProcessOptions\\relax\n\\LoadClass{book}\n\\RequirePackage{fancyhdr}\n\n% This gives us rules below the headers\n\\AtBeginDocument{%\n  \\fancyhf{}\n  \\fancyhead[LE,RO]{\\thepage}\n%  \\fancyhead[RE]{\\slshape \\leftmark}\n%  \\fancyhead[LO]{\\slshape \\rightmark}\n%\tThe above makes your headers in all caps. If you would like different headers, choose one of the following options (be sure to remove the % symbol from both the right and left headers):\n\t \\fancyhead[RE]{\\slshape \\nouppercase \\leftmark} % This makes the headers on the RIGHT side pages be italic and use lowercase With Capitals When Specified.\n\t\\fancyhead[LO]{\\slshape \\nouppercase \\rightmark} % This does the same thing to the LEFT side pages\n%\tor\n%\t\\fancyhead[RE]{\\scshape \\leftmark} % The RIGHT headers will be in small caps.\n%\t\\fancyhead[LO]{\\scshape \\rightmark} %  And so will the LEFT headers\n  \\pagestyle{fancy}\n\n% Psych majors: You do not need the following six lines, as it conflicts with apacite, so comment them out.\n  \\let\\oldthebibliography=\\thebibliography\n  \\let\\endoldthebibliography=\\endthebibliography\n  \\renewenvironment{thebibliography}[1]{\n    \\oldthebibliography{#1}\n    \\addcontentsline{toc}{chapter}{\\bibname}\n  }{\\endoldthebibliography}\n %%%%%% end of things for psych majors to comment out\n  \n  \\let\\oldtheindex=\\theindex\n  \\let\\endoldtheindex=\\endtheindex\n  \\renewenvironment{theindex}{\n    \\oldtheindex\n    \\addcontentsline{toc}{chapter}{\\indexname}\n  }{\\endoldtheindex}\n}\n\n% Stolen from book.cls and modified\n\\let\\RToldchapter\\chapter\n\\renewcommand{\\chapter}{\\if@openright\\RTcleardoublepage\n\t\t    \\else\\clearpage\\fi\n\t\t    \\thispagestyle{empty}%\n\t\t    \\global\\@topnum\\z@\n\t\t    \\@afterindentfalse\n\t\t    \\secdef\\@chapter\\@schapter}\n\t\t    \n% Stolen from book.cls PBC 5/12/05\n% Using this to actually show \"Chapter 1\" in TOC instead of \"1\"\n\\def\\@chapter[#1]#2{\\ifnum \\c@secnumdepth >\\m@ne\n                       \\if@mainmatter\n                         \\refstepcounter{chapter}%\n                         \\typeout{\\@chapapp\\space\\thechapter.}%\n                         \\addcontentsline{toc}{chapter}%\n                         {\\@chapapp\\space\\thechapter:\\space#1}%\n                       \\else\n                         \\addcontentsline{toc}{chapter}{#1}%\n                       \\fi\n                    \\else\n                      \\addcontentsline{toc}{chapter}{#1}%\n                    \\fi\n                    \\chaptermark{#1}%\n                    \\addtocontents{lof}{\\protect\\addvspace{10\\p@}}%\n                    \\addtocontents{lot}{\\protect\\addvspace{10\\p@}}%\n                    \\if@twocolumn\n                      \\@topnewpage[\\@makechapterhead{#2}]%\n                    \\else\n                      \\@makechapterhead{#2}%\n                      \\@afterheading\n                    \\fi}\n\n\\newcommand{\\RTcleardoublepage}{\n\t\\clearpage\\if@twoside \\ifodd\\c@page\\else\n\t\\thispagestyle{empty}\\hbox{}\\newpage\n\t\\if@twocolumn\\hbox{}\\newpage\\fi\\fi\\fi}\n\n\\let\\RToldcleardoublepage\\cleardoublepage\n\\renewcommand{\\cleardoublepage}{\\RTcleardoublepage}\n\n% adjust margins for binding  (changed 2007-04-24 tgp)\n\\setlength{\\oddsidemargin}{.5in}\n\\setlength{\\evensidemargin}{0in}\n\\setlength{\\textwidth}{6.0in}\n\\setlength{\\textheight}{9.0in}\n\\setlength\\topmargin{0in}\n\\addtolength\\topmargin{-\\headheight}\n\\addtolength\\topmargin{-\\headsep}\n\n%\\setlength{\\oddsidemargin}{.6in}\n%\\setlength{\\evensidemargin}{0in}\n%\\setlength{\\textwidth}{5.9in}\n%\\setlength\\topmargin{0in}\n%\\addtolength\\headheight{2.5pt}\n%\\addtolength\\topmargin{-\\headheight}\n%\\addtolength\\topmargin{-\\headsep}\n%\\addtolength\\textheight{1in}\n%\\addtolength\\textheight{\\headheight}\n%\\addtolength\\textheight{\\headsep}\n\n\\def\\division#1{\\gdef \\@division{#1}}\n\\def\\@division{\\@latex@warning@no@line{No \\noexpand\\division given}}\n\\def\\department#1{\\gdef \\@department{#1}}\n\\def\\@department{\\@latex@warning@no@line{No \\noexpand\\department given}}\n\\def\\thedivisionof#1{\\gdef \\@thedivisionof{#1}}\n\\def\\@thedivisionof{The Division of}\n\\def\\approvedforthe#1{\\gdef \\@approvedforthe{#1}}\n\\def\\@approvedforthe{Division}\n\\def\\advisor#1{\\gdef \\@advisor{#1}}\n\\def\\@advisor{\\@latex@warning@no@line{No \\noexpand\\advisor given}}\n\\def\\altadvisor#1{\\gdef \\@altadvisor{#1} \\@altadvisortrue}\n\\global\\let\\@altadvisor\\@empty\n\\newif\\if@altadvisor\n\\@altadvisorfalse\n\n\\renewcommand{\\contentsname}{Table of Contents}\n\\renewcommand{\\bibname}{References}\n\n\\renewcommand\\l@chapter[2]{%\n  \\ifnum \\c@tocdepth >\\m@ne\n    \\addpenalty{-\\@highpenalty}%\n    \\vskip 1.0em \\@plus\\p@\n    \\setlength\\@tempdima{1.5em}%\n    \\begingroup\n      \\parindent \\z@ \\rightskip \\@pnumwidth\n      \\parfillskip -\\@pnumwidth\n      \\leavevmode \\bfseries\n      \\advance\\leftskip\\@tempdima\n      \\hskip -\\leftskip\n      #1\\nobreak\\normalfont\n      \\leaders\\hbox{$\\m@th \\mkern \\@dotsep mu\\hbox{.}\\mkern \\@dotsep mu$}\\hfill\n      \\nobreak\\hb@xt@\\@pnumwidth{\\bfseries \\hss #2}\\par\n      \\penalty\\@highpenalty\n    \\endgroup\n  \\fi}\n\n\\newenvironment{abstract}{%\n  \\if@twocolumn\n    \\@restonecoltrue\\onecolumn\n  \\else\n    \\@restonecolfalse\n  \\fi\n  \\chapter[Abstract]{}\n  \\begin{center}\n  {\\fontsize{14}{16}\\selectfont \\bfseries Abstract}\n  \\end{center}\n  \\fontsize{12}{14}\\selectfont\n}{\\clearpage \\if@restonecol\\twocolumn\\fi}%\n\n\\ifx\\@pdfoutput\\@undefined\n  \\newcommand{\\RTpercent}{\\@percentchar\\space}\n  \\AtBeginDvi{\\special{!\\RTpercent Reed College LaTeX Thesis Class 2001/12/04 SN}} \n  \\AtBeginDvi{\\special{rawpostscript \\RTpercent Reed College LaTeX Thesis Class 2001/12/04 SN}} \n\\else\n  \\AtEndDocument{\\pdfinfo{/Creator\t(Reed College LaTeX Thesis Class 2001/12/04 SN)}} \n\\fi\n\n% I hacked the title page to all be the same font size \n% as requested by the library, BTS 2005\n\n\\renewcommand{\\maketitle}{%\n  {\\pagestyle{empty}\n  \\fontsize{12}{14}\\selectfont\n  \\begin{titlepage}\n  \\newpage\n  \\let\\footnotesize\\small\n  \\let\\footnoterule\\relax\n  \\let \\footnote \\thanks\n\n  \\baselineskip = 1.4\\baselineskip\n  \\setbox0=\\hbox{of the Requirements for the Degree}\n\n  \\begin{center}\n    \\setcounter{page}{1}\n    \\null\\vfil\n    {\\fontsize{12}{14}\\selectfont \\@title}\n    \\vfil\n    \\centerline{\\hbox to \\wd0 {\\hbox{}\\hrulefill\\hbox{}}}\n    \\vfil\n    A Thesis \\\\\n    Presented to \\\\\n    \\@thedivisionof \\ \\@division \\\\\n    Reed College\n    \\vfil\n    \\centerline{\\hbox to \\wd0 {\\hbox{}\\hrulefill\\hbox{}}}\n    \\vfil\n    In Partial Fulfillment \\\\\n    of the Requirements for the Degree \\\\\n    Bachelor of Arts\n    \\vfil\n    \\centerline{\\hbox to \\wd0 {\\hbox{}\\hrulefill\\hbox{}}}\n    \\bigskip\n    \\centerline{}\n    \\bigskip\n    {\\fontsize{12}{14}\\selectfont \\lineskip .75em\n    \\begin{tabular}[t]{c}%\n      \\@author\n    \\end{tabular}\\par}\n    \\vskip 1.5em\n    {\\fontsize{12}{14}\\selectfont \\@date \\par}\n  \\end{center}\\par\n  \\end{titlepage}\n\n%% Approved for the division page\n  \\cleardoublepage\n  {\\fontsize{12}{14}\n  \\setbox0=\\hbox{Approved for the \\@approvedforthe}\n  \\thispagestyle{empty}\n  \\null\\vfil\t\t% just below center of page\n  \\par\\vskip 6cm\t% below center, not center\n  \\centerline{\\copy0}\t% approved\n  \\centerline{(\\@department)} %major\n  \\vskip 1cm\t\t%space to sign\n  \\centerline{\\makebox[\\wd0][c]{\\hrulefill}\n\t\\if@altadvisor \\makebox[.5in]{} \\makebox[\\wd0][c]{\\hrulefill} \\fi}\n  \\centerline{\\makebox[\\wd0][c]{\\@advisor}\n\t\\if@altadvisor \\makebox[.5in]{} \\makebox[\\wd0][c]{\\@altadvisor} \\fi}\n  \\par\\vfil\\null}\n  \\cleardoublepage\n  }\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/TeX/verbose.bbx",
    "content": "\\ProvidesFile{verbose.bbx}\n[\\abx@bbxid]\n\n\\RequireBibliographyStyle{authortitle}\n\n\\endinput\n"
  },
  {
    "path": "src/test/resources/samples/langs/Tea/foo.tea",
    "content": "<% template foo() %>"
  },
  {
    "path": "src/test/resources/samples/langs/Terra/arith.t",
    "content": "--[[\n\n-\n+\n\n*\n/\n%\n\n^\nand\nor\n~= == < > >= <=\n<< >>\n\n]]\n\n\n\n\nterra test0()\n    var a = 1 + 3\n    var b = 1LL + 2LL\n    var c = 1ULL + 2ULL\n    var d = 1.f + 2.f\n    var e = 1.0 + 2.0\n    return a + b + c + d + e\nend\nterra test1()\n    var a = 1 - 3\n    var b = 1LL - 2LL\n    var c = 1ULL - 2ULL\n    var d = 1.f - 2.f\n    var e = 1.0 - 2.0\n    return a - b - c - d - e\nend\nterra test2()\n    var a = 2 * 3\n    var b = 3LL * 2LL\n    var c = 3ULL * 2ULL\n    var d = 1.f * 2.f\n    var e = 3.0 * 2.0\n    return a * b * c * d * e\nend\n\nterra test3()\n    var a = 2 / 3 + 1\n    var b = 3LL / 2LL + 1\n    var c = 3ULL / 2ULL\n    var d = 1.f / 2.f\n    var e = 3.0 / 2.0\n    return a * b * c * d * e\nend\n\nterra test4()\n    var a = 2 % 3\n    var b = 3LL % 4LL\n    var c = 3ULL % 2ULL\n    var d = 1.f % 2.f\n    var e = 3.75 % 2.0\n    return (a == 2) and (b == 3LL) and (d == 1.f) and (e == 1.75)\nend\n\nterra test5()\n    var a = 2 ^ 3\n    var b = 3LL ^ 4LL\n    var c = 3ULL ^ 2ULL\n    return (a == 1) and (b == 7LL) and (c == 1ULL)\nend\n\nterra test6()\n    var a = 2 and 3\n    var b = 3LL and 4LL\n    var c = 3ULL and 2ULL\n    return (a == 2) and (b == 0LL) and (c == 2ULL)\nend\n\nterra test7()\n    var a = 2 or 3\n    var b = 3LL or 4LL\n    var c = 3ULL or 2ULL\n    return (a == 3) and (b == 7LL) and (c == 3ULL)\nend\n\n\nterra test8()\n    var a0,a1 = 2 ~= 3, 2 == 3\n    var b0,b1 = 2 < 3, 2 >= 3\n    var c0,c1 = 2 > 3, 2 <= 3\n    \n    return a0 and not a1 and b0 and not b1 and not c0 and c1\nend\n\nterra test9()\n    var a0, a1 = 8 >> 1, 8 << 1\n    var b0, b1 = -8 >> 1, -8 << 1\n    return a0 == 4 and a1 == 16 and b0 == -4 and b1 == -16\nend\n\n\nlocal test = require(\"test\")\n\ntest.eq(test0(),16)\ntest.eq(test1(),2)\ntest.eq(test2(),2592)\ntest.eq(test3(),1.5)\n\ntest.eq(test4(),true)\n\ntest.eq(test5(),true)\ntest.eq(test6(),true)\ntest.eq(test7(),true)\ntest.eq(test8(),true)\ntest.eq(test9(),true)"
  },
  {
    "path": "src/test/resources/samples/langs/Terra/arrayt.t",
    "content": "C = terralib.includecstring [[\n\t#include <stdio.h>\n\t#include <stdlib.h>\n]]\nlocal arraytypes = {}\nfunction Array(T)\n\tlocal struct ArrayImpl {\n\t\tdata : &T;\n\t\tN : int;\n\t}\n\tfunction ArrayImpl.metamethods.__typename(self)\n\t    return \"Array(\"..tostring(T)..\")\"\n\tend\n\tarraytypes[ArrayImpl] = true\n\tterra ArrayImpl:init(N : int)\n\t\tself.data = [&T](C.malloc(N*sizeof(T)))\n\t\tself.N = N\n\tend\n\tterra ArrayImpl:free()\n\t\tC.free(self.data)\n\tend\n\tArrayImpl.metamethods.__apply = macro(function(self,idx)\n\t\treturn `self.data[idx]\n\tend)\n\tArrayImpl.metamethods.__methodmissing = macro(function(methodname,selfexp,...)\n\t\tlocal args = terralib.newlist {...}\n\t\tlocal i = symbol(int)\n\t\tlocal promotedargs = args:map(function(a)\n\t\t\tif arraytypes[a:gettype()] then\n\t\t\t\treturn `a(i)\n\t\t\telse\n\t\t\t\treturn a\n\t\t\tend\n\t\tend)\n\t\treturn quote\n\t\t\tvar self = selfexp\n\t\t\tvar r : ArrayImpl\n\t\t\tr:init(self.N)\n\t\t\tfor [i] = 0,r.N do\n\t\t\t\tr.data[i] = self.data[i]:[methodname](promotedargs)\n\t\t\tend\n\t\tin\n\t\t\tr\n\t\tend\n\tend)\n\treturn ArrayImpl\nend\n\nstruct Complex {\n\treal : float;\n\timag : float;\n}\n\nterra Complex:add(c : Complex) \n\treturn Complex { self.real + c.real, self.imag + c.imag }\nend\n\nComplexArray = Array(Complex)\nN = 10\nterra testit()\n\tvar ca : ComplexArray\n\tca:init(N)\n\tfor i = 0,N do\n\t\tca(i) = Complex { i, i + 1 }\n\tend\n\tvar ra = ca:add(ca)\n\treturn ra\nend\nlocal r = testit()\nassert(r.N == N)\nfor i = 0,N-1 do\n\tassert(r.data[i].real == 2*i)\n\tassert(r.data[i].imag == 2*(i+1))\nend\nassert(tostring(Array(int)) == \"Array(int32)\")"
  },
  {
    "path": "src/test/resources/samples/langs/Terra/benchmark_nbody.t",
    "content": "local C = terralib.includecstring[[\n\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n]]\n\npi = 3.141592653589793\nsolar_mass = (4 * pi * pi)\ndays_per_year = 365.24\n\nstruct planet {\n  x : double;\n  y : double;\n  z : double;\n  vx : double;\n  vy : double;\n  vz : double;\n  mass : double;\n}\n\nterra advance(nbodies : int, bodies : &planet, dt : double)\n  \n  for i = 0, nbodies do\n    var b = &bodies[i]\n    for j = i + 1, nbodies do\n      var b2 = &bodies[j]\n      \n      var dx = b.x - b2.x;\n      var dy = b.y - b2.y;\n      var dz = b.z - b2.z;\n      var distance = C.sqrt(dx * dx + dy * dy + dz * dz);\n      var mag = dt / (distance * distance * distance);\n      --C.printf(\"%f %f %f %f %f\\n\",dx,dy,dz,distance,mag);\n      b.vx = b.vx - dx * b2.mass * mag;\n      b.vy = b.vy - dy * b2.mass * mag;\n      b.vz = b.vz - dz * b2.mass * mag;\n      b2.vx = b2.vx + dx * b.mass * mag;\n      b2.vy = b2.vy + dy * b.mass * mag;\n      b2.vz = b2.vz + dz * b.mass * mag;\n      --C.printf(\"%f %f %f %f %f %f\\n\",b.vx,b.vy,b.vz,b2.vx,b2.vy,b2.vz)\n    end\n  end\n  for i = 0,nbodies do\n    var b = &bodies[i]\n    b.x = b.x + dt * b.vx;\n    b.y = b.y + dt * b.vy;\n    b.z = b.z + dt * b.vz;\n  end\nend\n\nterra energy(nbodies : int, bodies : &planet)\n  var e = 0.0\n  for i = 0, nbodies do\n    var b = &bodies[i]\n    e = e + 0.5 * b.mass * (b.vx * b.vx + b.vy * b.vy + b.vz * b.vz);\n    for j = i + 1, nbodies do\n      var b2 = &bodies[j]\n      var dx = b.x - b2.x\n      var dy = b.y - b2.y\n      var dz = b.z - b2.z\n      var distance = C.sqrt(dx * dx + dy * dy + dz * dz)\n      e = e - (b.mass * b2.mass) / distance\n    end\n  end\n  return e\nend\n\nterra offset_momentum(nbodies : int, bodies : &planet)\n  var px,py,pz = 0.0,0.0,0.0\n  \n  for i = 0,nbodies do\n    px = px + bodies[i].vx * bodies[i].mass\n    py = py + bodies[i].vy * bodies[i].mass\n    pz = pz + bodies[i].vz * bodies[i].mass\n  end\n  bodies[0].vx = - px / solar_mass\n  bodies[0].vy = - py / solar_mass\n  bodies[0].vz = - pz / solar_mass\nend\n\nNBODIES = 5\n\nterra main(argc : int, argv : &&int8)\n    var bodies = array(\n      planet {                               -- sun */\n        0, 0, 0, 0, 0, 0, solar_mass\n      },\n      planet {                               -- jupiter */\n        4.84143144246472090e+00,\n        -1.16032004402742839e+00,\n        -1.03622044471123109e-01,\n        1.66007664274403694e-03 * days_per_year,\n        7.69901118419740425e-03 * days_per_year,\n        -6.90460016972063023e-05 * days_per_year,\n        9.54791938424326609e-04 * solar_mass\n      },\n      planet {                               -- saturn */\n        8.34336671824457987e+00,\n        4.12479856412430479e+00,\n        -4.03523417114321381e-01,\n        -2.76742510726862411e-03 * days_per_year,\n        4.99852801234917238e-03 * days_per_year,\n        2.30417297573763929e-05 * days_per_year,\n        2.85885980666130812e-04 * solar_mass\n      },\n      planet {                               -- uranus */\n        1.28943695621391310e+01,\n        -1.51111514016986312e+01,\n        -2.23307578892655734e-01,\n        2.96460137564761618e-03 * days_per_year,\n        2.37847173959480950e-03 * days_per_year,\n        -2.96589568540237556e-05 * days_per_year,\n        4.36624404335156298e-05 * solar_mass\n      },\n      planet {                               -- neptune */\n        1.53796971148509165e+01,\n        -2.59193146099879641e+01,\n        1.79258772950371181e-01,\n        2.68067772490389322e-03 * days_per_year,\n        1.62824170038242295e-03 * days_per_year,\n        -9.51592254519715870e-05 * days_per_year,\n        5.15138902046611451e-05 * solar_mass\n      }\n    )\n    var n = C.atoi(argv[1])    \n    offset_momentum(NBODIES, bodies)\n    C.printf (\"%.9f\\n\", energy(NBODIES, bodies))\n    for i = 0,n do\n        advance(NBODIES, bodies, 0.01)\n    end\n    C.printf (\"%.9f\\n\", energy(NBODIES, bodies));\n  return 0\nend\n\nterra run()\n    main(2,array(\"what\",\"1000000\"))\nend\n\n--run:compile()\n\n\n--local test = require(\"test\")\n\n--print(test.time(run))\n\nterralib.saveobj(\"benchmark_nbody\",{ main = main } )\nenergy:disas()\nenergy:printpretty()"
  },
  {
    "path": "src/test/resources/samples/langs/Text/01_top.ncl",
    "content": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<ncl id=\"topProperty\" xmlns=\"http://www.ncl.org.br/NCL3.0/EDTVProfile\">\n\t<head>\n\t\t\n\t\t<regionBase>\n\t\t\t<region height=\"50%\" id=\"imageReg\" top=\"50%\"/>\n\t\t</regionBase>\n\t\t\n\t\t<descriptorBase>\n\t\t\t<descriptor id=\"imageDescriptor\" region=\"imageReg\"/>\n\t\t</descriptorBase>\n\t\t\n\t</head>\n\t<body>\n\t\t<port component=\"image\" id=\"entry\"/>\n\t\t<media descriptor=\"imageDescriptor\" id=\"image\" src=\"../resources/images/background.jpg\"/> \n\t</body>\n</ncl>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/ISO-2022-KR.txt",
    "content": "\u001b$)C\u001a#\r\n# Out-AnsiGraph.psm1\r\n# Author:       xcud\r\n# History:\r\n#       v0.1 September 21, 2009 initial version\r\n#\r\n# PS Example> ps | select -first 5 | sort -property VM | \r\n#             Out-AnsiGraph ProcessName, VM\r\n#                 AEADISRV \u001a\u001a\u001a 14508032\r\n#                  audiodg \u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a 50757632\r\n#                  conhost \u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a 73740288\r\n# AppleMobileDeviceService \u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a 92061696\r\n#                    btdna \u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a 126443520\r\n#\r\nfunction Out-AnsiGraph($Parameter1=$null) {\r\n\tBEGIN {\r\n\t\t$q = new-object Collections.queue\r\n\t\t$max = 0; $namewidth = 0;\r\n\t}\r\n\r\n\tPROCESS {\r\n\t\tif($_) {\r\n\t\t\t$name = $_.($Parameter1[0]);\r\n\t\t\t$val = $_.($Parameter1[1])\r\n\t\t\tif($max -lt $val) { $max = $val}\t\t \r\n\t\t\tif($namewidth -lt $name.length) { \r\n\t\t\t\t$namewidth = $name.length }\r\n\t\t\t$q.enqueue(@($name, $val))\t\t\t\r\n\t\t}\r\n\t}\r\n\r\n\tEND {\r\n\t\t$q | %{\r\n\t\t\t$graph = \"\"; 0..($_[1]/$max*20) | \r\n\t\t\t\t%{ $graph += \"\u001a\" }\r\n\t\t\t$name = \"{0,$namewidth}\" -f $_[0]\r\n\t\t\t\"$name $graph \" + $_[1]\r\n\t\t}\r\n\r\n\t}\r\n}\r\n\r\nExport-ModuleMember Out-AnsiGraph"
  },
  {
    "path": "src/test/resources/samples/langs/Text/LIDARLite.ncl",
    "content": "G04 DipTrace 2.4.0.2*\n%INLIDARLite.ncl*%\n%MOIN*%\n%ADD11C,0.0394*%\n%FSLAX44Y44*%\nG04*\nG70*\nG90*\nG75*\nG01*\n%LNBoardOutline*%\n%LPD*%\nX0Y23622D2*\nD11*\nX27953D1*\nY0D1*\nX0D1*\nY23622D1*\nX591Y23110D2*\nX13819D1*\nX591Y591D2*\nY11614D1*\nY12087D2*\nY23110D1*\nX14291D2*\nX27520D1*\nX591Y591D2*\nX13819D1*\nX14291D2*\nX27520D1*\nY11614D1*\nY12087D2*\nY23110D1*\nM02*\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/Site.local.ncl",
    "content": "#define YmakeRoot $(DESTDIR)@prefix@\n#define ManRoot $(DESTDIR)@mandir@\n#define LibRoot $(DESTDIR)@libdir@/ncarg\n#define SharePath $(DESTDIR)@datadir@\n\n#define BuildWithF90 TRUE\n#define IncSearch -I/usr/include/netcdf -I/usr/include/udunits2 -I/usr/include/freetype2 -I/usr/include/gdal\n#define LibSearch -L@libdir@/hdf\n\n#define BuildNetCDF4 1\n#define NetCDF4lib -lnetcdf\n#define BuildCAIRO 1\n#define CAIROlib -lcairo -lfreetype\n#define BuildGDAL 1\n#define GDALlib -lgdal\n#define BuildHDFEOS 0\n#define BuildHDFEOS5 0\n#define BuildTRIANGLE 0\n#define HDFlib -lmfhdf -ldf -ljpeg -lz\n#define HDF5lib -lhdf5_hl -lhdf5\n#define BuildUdunits 1\n#define UdUnitslib -ludunits2\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/aptitude-defaults.nb",
    "content": "Pakker uten en bestemt bolk\\n Disse pakkene tilhører ingen bestemt bolk. Kanskje det er noe feil ved dem?\nVirtuelle pakker\\n Disse pakkene finnes ikke, de er navn som andre pakker bruker for å oppnå en eller annen egenskap.\nPakker som setter opp systemet ditt til å utføre en bestemt oppgave\\n Pakkene i bolken «oppgaver» inneholder ingen filer, det kan hende de bare er avhengige av andre pakker. Disse pakkene gjør det mulig å installere pakker for en bestemt oppgave på en lett måte.\nAdministrative verktøy\\n Pakkene i bolken «admin» gjør det mulig å utføre administrative oppgaver, som å installere programmer, opprette eller slette brukere, vise informasjon om systemet eller nettverkstrafikken osv.\nPakker som er laget av pakker i et annet format (rpm, tgz mm)\\n Pakkene i bolken «alien» ble laget av programmet «alien» fra et annet format enn Debians eget pakkeformat, f.eks fra RPM-pakker\nDebians grunnsystem\\n Pakkene i bolken «grunnsystem» hører med til første del av Debian-installasjonen.\nProgrammer for faksmodem og andre kommunikasjonsenheter\\n Pakkene i bolken «Kommunikasjon» brukes til å styre modemer og andre enheter på maskinen, deriblant programvare for styring av faksmodemer (for eksempel, PPP for oppringt internettforbindelse og programmer som opprinnelig er skrevet for dette, slik som zmodem og kermit),  og  programmer for å styre mobiltelefoner, snakke med FidoNet og kjøre et BBS.\nVerktøy og programmer for programvareutvikling\\n Pakker i seksjonen «utvikling» blir brukt til å skrive nye programmer og for å jobbe med videre med programmer som allerede er laget. Vanlige brukere som ikke kompilerer (setter sammen) sine egne programmer trenger neppe så mange programmer herfra.\\n .\\n Her finner du kompilatorer, avlusingsverktøy, skriveprogrammer som hjelper til med programmeringen, verktøy for håndtering av kildekode og andre ting som har med utvikling av programmer å gjøre.\nDokumentasjon og spesialiserte program for visning av dokumentasjon\\n Pakker i «dok»-seksjonen dokumenterer deler av Debian-systemet eller viser fram dokumenter i forskjellige format.\nSkriveprogram og tekstbehandlere\\n Pakker i bolken «skriveprogram» lar deg redigere ren ASCII-tekst. Dette er nødvendigvis ikke tekstbehandlere, selv om du kan finne noen av dem her i denne bolken.\nProgram for å jobba med elektronikk og elektriske kretser\\n Pakker i «elektronikk»-seksjonen inneholder verktøy for design av elektriske kretser, simulatorer og assemblere for mikrokontrollere og andre liknende programmer.\nProgrammer for innebygde systemer\\nPakker i bolken «innebygd» er ment til å kjøre på innebygde systemer. Dette er spesialisert maskinvare med mye mindre datakraft enn en typisk skrivebordssystem, for eksempel en PDA, en mobiltelefon eller en Tivo.\nSkrivebordssystemet GNOME\\n GNOME er en samling programvare som danner et lettbrukt skrivbordsmiljø for Linux.  Pakker i «gnome»-bolken er enten deler av GNOME-miljøet eller tett sammenvevd med det.\nSpill, leketøy og andre programmer som bare er for gøy\\n Pakker i «spill»-bolken er stort sett bare til for underholdningens skyld.\nVerktøy for å lage, vise og redigere grafikkfiler\\n Pakker i «grafikk»-bolken er programmer for visning av bildefiler, bildebehandlingsprogrammer, støtteprogrammer for forskjellig utstyr (som videokort, skanner og digitalt kamera) og programmeringsverktøy for å håndtere grafikk.\nProgramvare for radioamatører\\n Pakker i «hamradio»-bolken er stort sett ment for radioamatører.\nProgrammer som kjører skriptspråk\\n Pakker i «tolkeprogram»-bolken er programmer som kompilerer og kjører språk som Python, Perl og Ruby, og som sørger for standardbibliotek for disse språkene.\nSkrivebordssystemet KDE\\n KDE er en samling programvare som danner et lettbrukt skrivbordsmiljø for Linux.  Pakker i «kde»-bolken er enten deler av KDE-miljøet eller tett sammenvevd med det.\nUtviklingsfiler for biblioteker\\n Pakker i «libdevel»-bolken inneholder filer som trengs for å lage programmer som bruker biblioteker i «libs»-bolken.  Du trenger ikke pakker fra denne bolken hvis du ikke har tenkt å lage programmer selv.\nSamling av programvarerutiner\\n Pakker i «libs»-seksjonen sørger for nødvendige funksjoner som er felles for andre programmer på maskinen. Med svært få unntak skal det ikke værenødvendig å be om at slike pakker blir installert. Pakkesystemet sørger for å installere dem når de andre programmene trenger dem.\nPerl-tolker og biblioteker\\n Pakker i «perl»-bolken sørger for programmeringsspråket Perl og mange tredjeparts-biblioteker til Perl. Hvis du ikke er Perl-programmerer selv, så trenger du ikke uttrykkelig installere pakker fra denne bolken, pakkesystemet installerer dem selv hvis det er nødvendig.\nPython-tolker og biblioteker\\n Pakker i «python»-bolken sørger for programmeringsspråket Python og mange tredjeparts-biblioteker til det. Hvis du ikke er Python-programmerer selv, så trenger du ikke uttrykkelig installere pakker fra denne bolken, pakkesystemet installerer dem selv hvis det er nødvendig.\nProgram for å skrive, sende og omdirigere epostmeldinger\\n Pakker i «epost»-bolken inneholder epostlesere, nisser som flytter eposten dit den skal, programvare for epostlister og filter for søppelpost. Det fins også diverse andre programmer som gjør noe med elektronisk post, men som ikke er så lette å plassere i grupper.\nNumerisk analyse og andre matematikkrelaterte programmer\\n Blant pakker i «matte»-bolken fins kalkulatorer, språk for matematiske utregninger, symbolsk algebra og programmer for å tegne ut matematiske objekter.\nYmse programvare\\n Pakker i «ymse»-bolken er ofte vanskelige å klassifisere, men det betyr ikke at de ikke finnes.\nProgrammer for å koble til og tilby ulike tjenester i et nettverk\\n Blant pakker i «nett»-bolken finner du  klienter og tjenere for mange protokoller, verktøy for å manipulere og avluse lavnivå nettverksprotokoller, system for direkte meldingstjeneste og andre nettverksrelaterte programmer.\nKlienter og tjenere for Usenet\\n Pakker i bolken «nyheter» henger sammen med til det distribuerte nyhetssystemet Usenet. Seksjonen tjenere og leseprogrammer (klienter) for dette systemet.\nForeldede programbibliotek\\n Pakker i bolken «gamle bibliotek» er foreldede og bør ikke brukes i ny programvare. De er tilgjengelige for at eldre programmer som er avhengige av programmene  her fortsatt skal kunne virke.\\n .\\n Du skal normalt ikke behøve å be om å få installert pakker herfra. Pakkesystemet vil ta med disse pakkene når andre pakker krever det.\nProgrammer som etterlikner andre datasystemer og  og programmer som hjelper deg med å lese fremmede filsystem\\n Pakker i bolken «andreosfs» etterlikner maskinvare og operativsystem og tilbyr verktøy for å overføre data mellom ulike operativsystem og maskinvareplattformer. (For eksempel verktøy for å lese DOS-disketter, og verktøy til å kommunisere med håndholdte maskiner som Palm Pilot)\\n .\\n Programmer for å brenne CD-plater er også med i denne seksjonen.\nProgramvare for vitenskaplig arbeid\\n Pakker i «vitenskap»-bolken er verktøy for astronomi, biologi og kjemi, pluss andre programmer man bruker i vitenskapelig arbeide.\nKommandoskall og alternative konsollmiljø\\n Pakker i «skall» er programmer som tilbyr grensesnitt med kommandolinje.\nVerktøy for å spille av og ta opp lyd\\nI «lyd»-bolken finner du lydavspillere, opptakere, lydkomprimeringsprogram for mange format, miksere og lydstyring, program for MIDI-sekvenser og program for å lage noter. Her finner du også drivere for lydkort og programmer for lydprosessering.\nTeX typografi-systemet\\n Pakker i bolken «tex» er deler i et system for å produsere utskrifter og andre slags utdata med høy typografisk kvalitet. Det omfatter selve TeX, TeX-pakker, skriveprogrammer som hjelper deg med å lage dokumenter i TeX, verktøy for å gjøre om TeX og TeX utdatafiler til ulike andre format, TeX-skrifttyper og annen programvare knyttet TeX.\nTekstverktøy\\n I bolken «tekst» finner du skriveprogrammer og tekstfiltere, stavekontroll, ordbøker og verktøy for å oversette mellom tegnkoding og tekst-filformater (for eksempel Unix og DOS) og programmer for å formatere, skrive ut og redigere som ren tekst.\nForskjellige systemverktøy\\n Pakkene i bolken «verktøy» har oppgaver som faller utenfor de andre kategoriene.\nNettlesere, tjenere, mellomtjenere og andre verktøy\\n I bolken «nett» finner du blant annet nettlesere, tjenere og mellomtjenere, programmer for å skrive CGI-skript eller nettbaserte programmer og andre programmer som har med verdensveven å gjøre.\nVindussystemet «X» og beslektede programmer\\n Pakkene i bolken «X11» inneholder også grunnpakka for vindussystemet «X», vindusbehandlere, verktøy for X og andre programmer med en X-grensesnitt som ble plassert her fordi de ikke passet inn noen andre steder.\nDebians hovedarkiv\\n Selve Debian-distribusjonen består av pakker fra hovedbolken. Alle pakkene her er fri programvare.\\n .\\n For mer informasjon om hva Debian mener med «fri programvare», se http://www.debian.org/social_contract#guidelines\n Programmer som avhenger av programvare utenfor Debian.\\n Pakker i bolken«bidrag» er ikke med i Debian.\\n\\n Disse pakkene er fri programvare, men de avhenger av programmer som ikke er en del av Debian.  Dette kan skyldes at de ikke er fri programvare og ligger i bolken «ufri» i pakkearkivet, og disse kan Debian slett ikke distribuere, eller - i noen sjeldne tilfeller - at ingen har laget en pakke av dette ennå.\\n .\\n For mer informasjon om hva Debian mener med «fri programvare», se http://www.debian.org/social_contract#guidelines\nProgrammer som ikke er fri programvare \\n Pakkene i bolken «ufri» er ikke en del av Debian\\n .\\n Disse pakkene passet ikke med en eller flere av betingelsene i Debians retningslinjer for fri programvare (Debian Free Software Guidelines; se nedenfor). Du bør lese lisensen for programmene i denne bolken for å være sikker på at du har rett til å bruke dem slik du har tenkt.\\n .\\n For mer informasjon om hva Debian mener med «Fri programvare», se http://www.debian.org/social_contract#guidelines\nProgrammer som er lagret utenfor USA på grunn av eksportforbud.\\n Det er stor sjanse for at pakkene i «utenfor USA» inneholder kryptografi, og noen få av dem inneholder patenterte algoritmer. På grunn av dette kan de ikke eksporteres ut av USA, og lagres derfor på en tjener i «den frie verden».\\n .\\n Merk: Debian-prosjektet er, etter samtale med eksperter på rettsvesenet om nye endringer i eksporteringsreglene, i ferd med å flette kryptografiske programmer inn i de USA-baserte arkivene. De fleste pakkene som før lå i denne bolken er derfor flyttet til «hoved»."
  },
  {
    "path": "src/test/resources/samples/langs/Text/filenames/COPYING.regex",
    "content": "$OpenBSD: COPYRIGHT,v 1.3 2003/06/02 20:18:36 millert Exp $\n\nCopyright 1992, 1993, 1994 Henry Spencer.  All rights reserved.\nThis software is not subject to any license of the American Telephone\nand Telegraph Company or of the Regents of the University of California.\n\nPermission is granted to anyone to use this software for any purpose on\nany computer system, and to alter it and redistribute it, subject\nto the following restrictions:\n\n1. The author is not responsible for the consequences of use of this\n   software, no matter how awful, even if they arise from flaws in it.\n\n2. The origin of this software must not be misrepresented, either by\n   explicit claim or by omission.  Since few users ever read sources,\n   credits must appear in the documentation.\n\n3. Altered versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.  Since few users\n   ever read sources, credits must appear in the documentation.\n\n4. This notice may not be removed or altered.\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n/*-\n * Copyright (c) 1994\n *\tThe Regents of the University of California.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the University nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n *\t@(#)COPYRIGHT\t8.1 (Berkeley) 3/16/94\n */\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/filenames/LICENSE.mysql",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License."
  },
  {
    "path": "src/test/resources/samples/langs/Text/filenames/README.me",
    "content": "Please read me.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/filenames/README.mysql",
    "content": "README for users interested in using MySQL as a triplestore backend\n===================================================================\n\nThe KiWi Triple Store used by Apache Marmotta supports different database\nbackends, including H2, PostgreSQL and MySQL. However, for legal reasons,\nwe are not allowed to distribute the MySQL connector library together with\nthe Apache Marmotta source code or binaries, as it is licensed under GPL\nlicense.\n\nNonetheless, it is possible to use MySQL by downloading and installing the\nconnector manually:\n    1.  download and unpack the MySQL Connector/J from\n        http://dev.mysql.com/downloads/connector/j/\n    2.  copy the mysql-connector-java-5.x.x.jar file to\n        a. the library directory of the application server\n           (e.g. $TOMCAT_HOME/lib)\n        -- OR --\n        b. the library directory of the Apache Marmotta Web application\n           (e.g. $TOMCAT_HOME/webapps/marmotta/WEB-INF/lib)\n    3.  restart the application server\n\nApache Marmotta will then automatically be able to use the MySQL connector\nto connect to a MySQL database. Please note that Marmotta requires at least\nMySQL 5.x, because it makes use of nested queries and foreign keys."
  },
  {
    "path": "src/test/resources/samples/langs/Text/filenames/click.me",
    "content": "\nTo run the \"Conway's game of life\" macros:\n\n  1.  Type \":so life.vim\".  This loads the macros.\n  2.  Type \"g\" to run the macros.\n  3.  Type CTRL-C to interrupt.\n  4.  Type \":q!\" to get out.\n\nSee life.vim for more advanced usage.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/filenames/delete.me",
    "content": "Delete me.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/filenames/keep.me",
    "content": "Keep me.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/filenames/read.me",
    "content": "Read me now!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/filenames/readme.1st",
    "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tincidunt\nvolutpat metus, non accumsan tortor convallis id. Headline un oreiller.\nIl est recommandé que la boîte en carton. Micro-ondes et sollicitudin bien.\n\n---------------------------------------------\nPellentesque sodales lectus ac lorem tempus, non placerat blandit de nisi.\nPhasellus Cursus, eros, et parfois, il est arcu diam mollis felis, ac tempor\nnisl elit quis felis. Morbi nca nisi vel ligula interdum pas l'auteur de, ni\npeur. Mécène voix améliorée. Besoin de tirer gratuitement. Suspendisse\nfermentum convallis metus non blandit. Ac turpis quis de molestie de Mécène.\nGluten. Donec urna leo, aliquet quis urna et, congue est plein. Pellentesque\nut pretium erat, rutrum neque tincidunt. Donec hendrerit massa sed sapien\ndapibus ultrices.\n\n==============================================\nEt le porche des Mécène, le prix de la société n'a pas, lacinia justo.\nPellentesque habitant morbi tristique senectus et Netus et Malesuada fames\negestas ac turpis. Ut leo mi, feugiat sagittis un ac id Mauris, posuere\nlobortis neque. Non, il n'y avait pas de varius tincidunt pretium.\n\nEn effet, nca pur hendrerit pellentesque sapien enim sagittis ipsum, aliquam\ntempor est récolté dans le jeu. Ut sempre egestas ultrices lorem à risus.\nMême arcu dolor, ipsum, ma vie, il a été dit fringilla odio.\n\n\n\t- Lorem ipsum eu commodo imperdiet sem\n\t- ligula arcu placerat turpis, une\n\t- importante lorem nisi eget urna.\n\nCurabitur aliquam accumsan nulla blandit mollis. Celtics à la succession!\nId ou pas d'alcool. A iaculis Duis consectetur vitae enim. Et magnis dis\nparturiente montes Cras iaculis justo eu libero. Thermal non sapien quis\nnisi Pellentesque placerat. Praesent fringilla diam nisl, nca dignissim\nsem lobortis feugiat. Vivre beaucoup de pauvreté.\n\nMorbi non justo eleifend!\n\nLacinia lacus fringilla, il fut un temps. Sed dans nunc à une chanson des\nBeatles ou pour décorer. Aeneas de basket-ball de diamètre. Fusce felis à\npartir, pas de pellentesque eget, le stress thermique pulvinar. Etiam\nporta odio sed nibh accumsan tristique. Mécène tincidunt quis justo eget\nporttitor. Jusqu'à ce que l'élément de temps ciblé.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/filenames/test.me",
    "content": "Test me.\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/foo.txt",
    "content": "foo\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/mac.txt",
    "content": "line 1\rline 2\r"
  },
  {
    "path": "src/test/resources/samples/langs/Text/main.ncl",
    "content": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n\n<!--\n2008 PUC-RIO/LABORATORIO TELEMIDIA,\nSome Rights Reserved.\n\nThis program is free software; you can redistribute it and/or modify it under \nthe terms of the GNU General Public License version 2 as published by\nthe Free Software Foundation.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY \nWARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A \nPARTICULAR PURPOSE.  See the GNU General Public License version 2 for more \ndetails.\n\nYou should have received a copy of the GNU General Public License version 2\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\n-->\n\n<ncl id=\"teste\" xmlns=\"http://www.ncl.org.br/NCL3.0/EDTVProfile\"\n     xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n     xsi:schemaLocation=\"http://www.ncl.org.br/NCL3.0/EDTVProfile\n     http://www.ncl.org.br/NCL3.0/profiles/NCL30EDTV.xsd\">\n\n<head>\n\n\t<regionBase>\n\t\t<region id=\"luaRegion\" width=\"100%\" height=\"100%\"/>\n\t</regionBase>\n\n\t<descriptorBase>\n\t\t<descriptor id=\"luaDesc\" region=\"luaRegion\" focusIndex=\"luaIdx\"/>\n\t</descriptorBase>  \n</head>\n\n<body>\n\t<port id=\"init\" component=\"lua\"/>\n\t<media type=\"application/x-ginga-settings\" id=\"programSettings\">\n\t\t<property name=\"currentKeyMaster\" value=\"luaIdx\"/>\n\t</media>\n\n\t<media id=\"lua\" descriptor=\"luaDesc\" src=\"game.lua\"/>\n</body>\n\n</ncl>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/messages.fr",
    "content": "the green potato=la pomme de terre verte\nle nouveau type de musique=the new type of music\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/min-help.ncl",
    "content": "THE_URL:file://localhost/Users/hubery/Public/ucar/Document/Functions/Built-in/min.shtml\nTHE_TITLE:min\n   NCL Home > Documentation > Functions > General applied math\n\nmin\n\n   Computes the minimum value of a multi-dimensional array.\n\nPrototype\n\n        function min (\n                value  : numeric\n        )\n\n        return_val [1] :  numeric\n\nArguments\n\n   value\n\n   An array of one or more numeric values of any dimension.\n\nReturn value\n\n   Returns a scalar of the same type as value.\n\nDescription\n\n   This function returns the minimum value for an array of any dimensionality. Missing values are ignored; a missing value\n   is returned only if all values are missing.\n\nSee Also\n\n   max, minind, maxind, dim_min, dim_max, dim_min_n, dim_max_n\n\nExamples\n\n   Example 1\n\n  f = (/2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8/)\n  min_f = min(f)\n  print(min_f)        ; Should be 2.1\n\n\n   Â©2015 UCAR | Privacy Policy | Terms of Use | Contact the Webmaster | Sponsored by NSF\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/readme.txt",
    "content": "Read me now!\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/receiver.ncl",
    "content": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<ncl id=\"sender\" xmlns=\"http://www.ncl.org.br/NCL3.0/EDTVProfile\">\n\t<head>\n\t\t<regionBase>\n\t\t\t<region id=\"rTV\" width=\"100%\" height=\"100%\" zIndex=\"1\"/>\t\t\n\t\t</regionBase>\n\t\t\n\t\t\n\t\t<descriptorBase>\n\t\t\t<descriptor id=\"dTV\" region=\"rTV\" />\n\t\t</descriptorBase>\n\t</head>\n\t\n\t<body>\n\t\t\n\t\t<port id=\"pLua\" component=\"lua\" />\n\t\t\n\t\t<media id=\"lua\" descriptor=\"dTV\" src=\"receiver.lua\" />\n\t\t\n\t</body>\n</ncl>"
  },
  {
    "path": "src/test/resources/samples/langs/Text/rmMonAnnCycLLT-help.ncl",
    "content": "THE_URL:file://localhost/Users/hubery/Public/ucar/Document/Functions/Contributed/rmMonAnnCycLLT.shtml\nTHE_TITLE:rmMonAnnCycLLT\n   NCL Home > Documentation > Functions > Climatology\n\nrmMonAnnCycLLT\n\n   Removes the annual cycle from \"monthly\" data.\n\nPrototype\n\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl\"\n\n        function rmMonAnnCycLLT (\n                x [*][*][*] : numeric\n        )\n\n        return_val [dimsizes(x)] :  typeof(x)\n\nArguments\n\n   x\n\n   A three-dimensional array of monthly values, dimensioned lat x lon x time. The time dimension must be a multiple of 12.\n\nReturn value\n\n   The results are returned in an array of the same type and dimensionality as x. If the input data contains metadata, these\n   will be retained.\n\nDescription\n\n   This function removes the annual cycle from month (number of months = 12) data and subtracts the long term means from\n   each month.\n\nSee Also\n\n   rmMonAnnCycLLT, rmMonAnnCycTLL, rmMonAnnCycLLLT\n\n\n   Â©2015 UCAR | Privacy Policy | Terms of Use | Contact the Webmaster | Sponsored by NSF\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/tutor.nb",
    "content": "===============================================================================\n= V e l k o m m e n   t i l   i n n f ø r i n g e n   i   V i m  --  Ver. 1.7 =\n===============================================================================\n\n     Vim er en meget kraftig editor med mange kommandoer, alt for mange til å\n     kunne gå gjennom alle i en innføring som denne. Den er beregnet på å\n     sette deg inn i bruken av nok kommandoer så du vil være i stand til lett\n     å kunne bruke Vim som en editor til alle formål.\n\n     Tiden som kreves for å gå gjennom denne innføringen tar ca. 25-30\n     minutter, avhengig av hvor mye tid du bruker til eksperimentering.\n\n     MERK:\n     Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne\n     filen som du kan øve deg på (hvis du kjørte Ŧvimtutorŧ-kommandoen, er\n     dette allerede en kopi).\n\n     Det er viktig å huske at denne innføringen er beregnet på læring gjennom\n     bruk. Det betyr at du må utføre kommandoene for å lære dem skikkelig.\n     Hvis du bare leser teksten, vil du glemme kommandoene!\n\n     Først av alt, sjekk at ŦCaps Lockŧ IKKE er aktiv og trykk Ŧjŧ-tasten for\n     å flytte markøren helt til leksjon 1.1 fyller skjermen.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t      Leksjon 1.1:  FLYTTING AV MARKØREN\n\n\n       ** For å flytte markøren, trykk tastene h, j, k, l som vist. **\n\t     ^\n\t     k\t\tTips: h-tasten er til venstre og flytter til venstre.\n       < h\t l >\t      l-tasten er til høyre og flytter til høyre.\n\t     j\t\t      j-tasten ser ut som en pil som peker nedover.\n\t     v\n  1. Flytt markøren rundt på skjermen til du har fått det inn i fingrene.\n\n  2. Hold inne nedovertasten (j) til den repeterer.\n     Nå vet du hvordan du beveger deg til neste leksjon.\n\n  3. Gå til leksjon 1.2 ved hjelp av nedovertasten.\n\nMerk: Hvis du blir usikker på noe du har skrevet, trykk <ESC> for å gå til\n      normalmodus. Skriv deretter kommandoen du ønsket på nytt.\n\nMerk: Piltastene skal også virke. Men ved å bruke hjkl vil du være i stand til\n      å bevege markøren mye raskere når du er blitt vant til det. Helt sant!\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  Leksjon 1.2: AVSLUTTE VIM\n\n\n  !! MERK: Før du utfører noen av punktene nedenfor, les hele leksjonen!!\n\n  1. Trykk <ESC>-tasten (for å forsikre deg om at du er i normalmodus).\n\n  2. Skriv:\t:q! <ENTER>.\n     Dette avslutter editoren og FORKASTER alle forandringer som du har gjort.\n\n  3. Når du ser kommandolinjen i skallet, skriv kommandoen som startet denne\n     innføringen. Den er:   vimtutor <ENTER>\n\n  4. Hvis du er sikker på at du husker dette, utfør punktene 1 til 3 for å\n     avslutte og starte editoren på nytt.\n\nMERK:  :q! <ENTER>  forkaster alle forandringer som du gjorde. I løpet av noen\n       få leksjoner vil du lære hvordan du lagrer forandringene til en fil.\n\n  5. Flytt markøren ned til leksjon 1.3.\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t Leksjon 1.3: REDIGERING AV TEKST -- SLETTING\n\n\n\t     ** Trykk  x  for å slette tegnet under markøren. **\n\n  1. Flytt markøren til den første linjen merket med  --->.\n\n  2. For å ordne feilene på linjen, flytt markøren til den er oppå tegnet som\n     skal slettes.\n\n  3. Trykk tasten  x  for å slette det uønskede tegnet.\n\n  4. Repeter punkt 2 til 4 til setningen er lik den som er under.\n\n---> Hessstennnn brrråsnudddde ii gaaata.\n---> Hesten bråsnudde i gata.\n\n  5. Nå som linjen er korrekt, gå til leksjon 1.4.\n\nMERK: Når du går gjennom innføringen, ikke bare prøv å huske kommandoene, men\n      bruk dem helt til de sitter.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\tLeksjon 1.4: REDIGERING AV TEKST -- INNSETTING\n\n\n\t\t    ** Trykk  i  for å sette inn tekst. **\n\n  1. Flytt markøren til den første linjen som er merket med --->.\n\n  2. For å gjøre den første linjen lik den andre, flytt markøren til den står\n     på tegnet ETTER posisjonen der teksten skal settes inn.\n\n  3. Trykk  i  og skriv inn teksten som mangler.\n\n  4. Etterhvert som hver feil er fikset, trykk <ESC> for å returnere til\n     normalmodus. Repeter punkt 2 til 4 til setningen er korrekt.\n\n---> Det er tkst som mnglr .\n---> Det er ganske mye tekst som mangler her.\n\n  5. Når du føler deg komfortabel med å sette inn tekst, gå til oppsummeringen\n     nedenfor.\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\tLeksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL\n\n\n\t\t    ** Trykk  A  for å legge til tekst. **\n\n  1. Flytt markøren til den første linjen nedenfor merket --->.\n     Det har ikke noe å si hvor markøren er plassert på den linjen.\n\n  2. Trykk  A  og skriv inn det som skal legges til.\n\n  3. Når teksten er lagt til, trykk <ESC> for å returnere til normalmodusen.\n\n  4. Flytt markøren til den andre linjen markert med ---> og repeter steg 2 og\n     3 for å reparere denne setningen.\n\n---> Det mangler noe tekst p\n     Det mangler noe tekst på denne linjen.\n---> Det mangler også litt tek\n     Det mangler også litt tekst på denne linjen.\n\n  5. Når du føler at du behersker å legge til tekst, gå til leksjon 1.6.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t Leksjon 1.6: REDIGERE EN FIL\n\n\n\t       ** Bruk\t:wq  for å lagre en fil og avslutte. **\n\n  !! MERK: Før du utfører noen av stegene nedenfor, les hele denne leksjonen!!\n\n  1. Avslutt denne innføringen som du gjorde i leksjon 1.2:  :q!\n\n  2. Skriv denne kommandoen på kommandolinja:  vim tutor <ENTER>\n     Ŧvimŧ er kommandoen for å starte Vim-editoren, Ŧtutorŧ er navnet på fila\n     som du vil redigere. Bruk en fil som kan forandres.\n\n  3. Sett inn og slett tekst som du lærte i de foregående leksjonene.\n\n  4. Lagre filen med forandringene og avslutt Vim med:\t:wq <ENTER>\n\n  5. Start innføringen på nytt og flytt ned til oppsummeringen som følger.\n\n  6. Etter å ha lest og forstått stegene ovenfor: Sett i gang.\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 1\n\n\n  1. Markøren beveges ved hjelp av piltastene eller hjkl-tastene.\n\t h (venstre)\t j (ned)     k (opp)\t l (høyre)\n\n  2. For å starte Vim fra skall-kommandolinjen, skriv:\tvim FILNAVN <ENTER>\n\n  3. For å avslutte Vim, skriv:  <ESC> :q! <ENTER>  for å forkaste endringer.\n\t\t   ELLER skriv:  <ESC> :wq <ENTER>  for å lagre forandringene.\n\n  4. For å slette tegnet under markøren, trykk:  x\n\n  5. For å sette inn eller legge til tekst, trykk:\n\t i    skriv innsatt tekst  <ESC>\tsett inn før markøren\n\t A    skriv tillagt tekst  <ESC>\tlegg til på slutten av linjen\n\nMERK: Når du trykker <ESC> går du til normalmodus eller du avbryter en uønsket\n      og delvis fullført kommando.\n\n  Nå kan du gå videre til leksjon 2.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\tLeksjon 2.1: SLETTEKOMMANDOER\n\n\n\t\t    ** Trykk  dw  for å slette et ord. **\n\n  1. Trykk <ESC> for å være sikker på at du er i normalmodus.\n\n  2. Flytt markøren til den første linjen nedenfor merket --->.\n\n  3. Flytt markøren til begynnelsen av ordet som skal slettes.\n\n  4. Trykk  dw\tog ordet vil forsvinne.\n\nMERK: Bokstaven  d  vil komme til syne på den nederste linjen på skjermen når\n      du skriver den. Vim venter på at du skal skrive w . Hvis du ser et annet\n      tegn enn\td  har du skrevet noe feil; trykk <ESC> og start på nytt.\n\n---> Det er agurk tre ord eple som ikke hører pære hjemme i denne setningen.\n---> Det er tre ord som ikke hører hjemme i denne setningen.\n\n  5. Repeter punkt 3 og 4 til den første setningen er lik den andre. Gå\n     deretter til leksjon 2.2.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t     Leksjon 2.2: FLERE SLETTEKOMMANDOER\n\n\n\t     ** Trykk  d$  for å slette til slutten av linjen. **\n\n  1. Trykk <ESC> for å være sikker på at du er i normalmodus.\n\n  2. Flytt markøren til linjen nedenfor merket --->.\n\n  3. Flytt markøren til punktet der linjen skal kuttes (ETTER første punktum).\n\n  4. Trykk  d$\tfor å slette alt til slutten av linjen.\n\n---> Noen skrev slutten på linjen en gang for mye. linjen en gang for mye.\n\n  5. Gå til leksjon 2.3 for å forstå hva som skjer.\n\n\n\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t   Leksjon 2.3: OM OPERATORER OG BEVEGELSER\n\n\n  Mange kommandoer som forandrer teksten er laget ut i fra en operator og en\n  bevegelse. Formatet for en slettekommando med sletteoperatoren  d  er:\n\n\td   bevegelse\n\n  Der:\n    d\t      - er sletteoperatoren.\n    bevegelse - er hva operatoren vil opere på (listet nedenfor).\n\n  En kort liste med bevegelser:\n    w - til starten av det neste ordet, UNNTATT det første tegnet.\n    e - til slutten av det nåværende ordet, INKLUDERT det siste tegnet.\n    $ - til slutten av linjen, INKLUDERT det siste tegnet.\n\n  Ved å skrive\tde  vil altså alt fra markøren til slutten av ordet bli\n  slettet.\n\nMERK:  Ved å skrive kun bevegelsen i normalmodusen uten en operator vil\n       markøren flyttes som spesifisert.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE\n\n\n ** Ved å skrive et tall foran en bevegelse repeterer den så mange ganger. **\n\n  1. Flytt markøren til starten av linjen markert ---> nedenfor.\n\n  2. Skriv  2w\tfor å flytte markøren to ord framover.\n\n  3. Skriv  3e\tfor å flytte markøren framover til slutten av det tredje\n     ordet.\n\n  4. Skriv  0  (null) for å flytte til starten av linjen.\n\n  5. Repeter steg 2 og 3 med forskjellige tall.\n\n---> Dette er en linje med noen ord som du kan bevege deg rundt på.\n\n  6. Gå videre til leksjon 2.5.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t Leksjon 2.5: BRUK AV ANTALL FOR Å SLETTE MER\n\n\n     ** Et tall sammen med en operator repeterer den så mange ganger. **\n\n  I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du\n  inn antall før bevegelsen for å slette mer:\n\t d  nummer  bevegelse\n\n  1. Flytt markøren til det første ordet med STORE BOKSTAVER på linjen markert\n     med --->.\n\n  2. Skriv  2dw  for å slette de to ordene med store bokstaver.\n\n  3. Repeter steg 1 og 2 med forskjelling antall for å slette de etterfølgende\n     ordene som har store bokstaver.\n\n---> Denne ABC DE linjen FGHI JK LMN OP er nå Q RS TUV litt mer lesbar.\n\nMERK: Et antall mellom operatoren  d  og bevegelsen virker på samme måte som å\n      bruke bevegelsen uten en operator.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\tLeksjon 2.6: OPERERE PÅ LINJER\n\n\n\t\t ** Trykk  dd  for å slette en hel linje. **\n\n  På grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at\n  det vil være lettere å rett og slett trykke to d-er for å slette en linje.\n\n  1. Flytt markøren til den andre linjen i verset nedenfor.\n  2. Trykk  dd\t å slette linjen.\n  3. Flytt deretter til den fjerde linjen.\n  4. Trykk  2dd  for å slette to linjer.\n\n--->  1) Roser er røde,\n--->  2) Gjørme er gøy,\n--->  3) Fioler er blå,\n--->  4) Jeg har en bil,\n--->  5) Klokker viser tiden,\n--->  6) Druer er søte\n--->  7) Og du er likeså.\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\tLeksjon 2.7: ANGRE-KOMMANDOEN\n\n\n  ** Trykk  u  for å angre siste kommando,  U  for å fikse en hel linje. **\n\n  1. Flytt markøren til linjen nedenfor merket ---> og plasser den på den\n     første feilen.\n  2. Trykk  x  for å slette det første uønskede tegnet.\n  3. Trykk så  u  for å angre den siste utførte kommandoen.\n  4. Deretter ordner du alle feilene på linjene ved å bruke kommandoen\tx  .\n  5. Trykk nå en stor  U  for å sette linjen tilbake til det den var\n     originalt.\n  6. Trykk  u  noen ganger for å angre\tU  og foregående kommandoer.\n  7. Deretter trykker du  CTRL-R  (hold CTRL nede mens du trykker R) noen\n     ganger for å gjenopprette kommandoene (omgjøre angrekommandoene).\n\n---> RReparer feiilene påå denne linnnjen oog erssstatt dem meed angre.\n\n  8. Dette er meget nyttige kommandoer. Nå kan du gå til oppsummeringen av\n     leksjon 2.\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 2\n\n\n  1. For å slette fra markøren fram til det neste ordet, trykk:  dw\n  2. For å slette fra markøren til slutten av en linje, trykk:\td$\n  3. For å slette en hel linje, trykk:\tdd\n\n  4. For å repetere en bevegelse, sett et nummer foran:  2w\n  5. Formatet for en forandringskommando er:\n\t       operator  [nummer]  bevegelse\n     der:\n       operator  - hva som skal gjøres, f.eks.\td  for å slette\n       [nummer]  - et valgfritt antall for å repetere bevegelsen\n       bevegelse - hva kommandoen skal operere på, eksempelvis\tw  (ord),\n\t\t   $  (til slutten av linjen) og så videre.\n\n  6. For å gå til starten av en linje, bruk en null:  0\n\n  7. For å angre tidligere endringer, skriv:\t\tu  (liten u)\n     For å angre alle forandringer på en linje, skriv:\tU  (stor U)\n     For å omgjøre angringen, trykk:\t\t\tCTRL-R\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t      Leksjon 3.1: ŦLIM INNŧ-KOMMANDOEN\n\n\n    ** Trykk  p  for å lime inn tidligere slettet tekst etter markøren **\n\n  1. Flytt markøren til den første linjen med ---> nedenfor.\n\n  2. Trykk  dd\tfor å slette linjen og lagre den i et Vim-register.\n\n  3. Flytt markøren til c)-linjen, OVER posisjonen linjen skal settes inn.\n\n  4. Trykk  p  for å legge linjen under markøren.\n\n  5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkefølge.\n\n---> d) Kan du også lære?\n---> b) Fioler er blå,\n---> c) Intelligens må læres,\n---> a) Roser er røde,\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t      Leksjon 3.2: ŦERSTATTŧ-KOMMANDOEN\n\n\n\t ** Trykk  rx  for å erstatte tegnet under markøren med x. **\n\n  1. Flytt markøren til den første linjen nedenfor merket --->.\n\n  2. Flytt markøren så den står oppå den første feilen.\n\n  3. Trykk  r  og deretter tegnet som skal være der.\n\n  4. Repeter punkt 2 og 3 til den første linjen er lik den andre.\n\n---> Da dfnne lynjxn ble zkrevet, var det nøen som tjykket feite taster!\n---> Da denne linjen ble skrevet, var det noen som trykket feile taster!\n\n  5. Gå videre til leksjon 3.2.\n\nMERK: Husk at du bør lære ved å BRUKE, ikke pugge.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t      Leksjon 3.3: ŦFORANDREŧ-OPERATOREN\n\n\n\t   ** For å forandre til slutten av et ord, trykk  ce . **\n\n  1. Flytt markøren til den første linjen nedenfor som er merket --->.\n\n  2. Plasser markøren på  u  i Ŧlubjwrŧ.\n\n  3. Trykk  ce\tog det korrekte ordet (i dette tilfellet, skriv Ŧinjenŧ).\n\n  4. Trykk <ESC> og gå til det neste tegnet som skal forandres.\n\n  5. Repeter punkt 3 og 4 helt til den første setningen er lik den andre.\n\n---> Denne lubjwr har noen wgh som må forkwåp med Ŧforækzryasŧ-kommandoen.\n---> Denne linjen har noen ord som må forandres med Ŧforandreŧ-kommandoen.\n\nVær oppmerksom på at  ce  sletter ordet og går inn i innsettingsmodus.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\tLeksjon 3.4: FLERE FORANDRINGER VED BRUK AV c\n\n\n ** Forandringskommandoen blir brukt med de samme bevegelser som Ŧslettŧ. **\n\n  1. Forandringsoperatoren fungerer på samme måte som Ŧslettŧ. Formatet er:\n\n\t c    [nummer]\t bevegelse\n\n  2. Bevegelsene er de samme, som for eksempel\tw  (ord) og  $\t(slutten av en\n     linje).\n\n  3. Gå til den første linjen nedenfor som er merket --->.\n\n  4. Flytt markøren til den første feilen.\n\n  5. Skriv  c$\tog skriv resten av linjen lik den andre og trykk <ESC>.\n\n---> Slutten på denne linjen trenger litt hjelp for å gjøre den lik den neste.\n---> Slutten på denne linjen trenger å bli rettet ved bruk av c$-kommandoen.\n\nMERK: Du kan bruke slettetasten for å rette feil mens du skriver.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 3\n\n\n  1. For å legge tilbake tekst som nettopp er blitt slettet, trykk  p  . Dette\n     limer inn den slettede teksten ETTER markøren (hvis en linje ble slettet\n     vil den bli limt inn på linjen under markøren).\n\n  2. For å erstatte et tegn under markøren, trykk  r  og deretter tegnet som\n     du vil ha der.\n\n  3. Forandringsoperatoren lar deg forandre fra markøren til dit bevegelsen\n     tar deg. Det vil si, skriv  ce  for å forandre fra markøren til slutten\n     av ordet,\tc$  for å forandre til slutten av linjen.\n\n  4. Formatet for Ŧforandreŧ er:\n\n\t c   [nummer]\tbevegelse\n\nNå kan du gå til neste leksjon.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t     Leksjon 4.1: POSISJONERING AV MARKØREN OG FILSTATUS\n\n\t** Trykk CTRL-G for å vise posisjonen i filen og filstatusen.\n\t   Trykk  G  for å gå til en spesifikk linje i filen. **\n\n  Merk: Les hele leksjonen før du utfører noen av punktene!\n\n  1. Hold nede Ctrl-tasten og trykk  g\t. Vi kaller dette CTRL-G. En melding\n     vil komme til syne på bunnen av skjermen med filnavnet og posisjonen i\n     filen. Husk linjenummeret for bruk i steg 3.\n\nMerk: Du kan se markørposisjonen i nederste høyre hjørne av skjermen. Dette\n      skjer når Ŧrulerŧ-valget er satt (forklart i leksjon 6).\n\n  2. Trykk  G  for å gå til bunnen av filen.\n     Skriv  gg\tfor å gå til begynnelsen av filen.\n\n  3. Skriv inn linjenummeret du var på og deretter  G . Dette vil føre deg\n     tilbake til linjen du var på da du først trykket CTRL-G.\n\n  4. Utfør steg 1 til 3 hvis du føler deg sikker på prosedyren.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t Leksjon 4.2: SØKEKOMMANDOEN\n\n      ** Skriv\t/  etterfulgt av en søkestreng som du vil lete etter. **\n\n  1. Trykk  /  når du er i normalmodusen. Legg merke til at skråstreken og\n     markøren kommer til syne på bunnen av skjermen i likhet med\n     Ŧ:ŧ-kommandoene.\n\n  2. Skriv Ŧfeeeiilŧ og trykk <ENTER>. Dette er teksten du vil lete etter.\n\n  3. For å finne neste forekomst av søkestrengen, trykk  n .\n     For å lete etter samme søketeksten i motsatt retning, trykk  N .\n\n  4. For å lete etter en tekst bakover i filen, bruk  ?  istedenfor  /\t.\n\n  5. For å gå tilbake til der du kom fra, trykk  CTRL-O  (Hold Ctrl nede mens\n     du trykker bokstaven  o ). Repeter for å gå enda lengre tilbake. CTRL-I\n     går framover.\n\n---> Ŧfeeeiilŧ er ikke måten å skrive Ŧfeilŧ på, feeeiil er helt feil.\nMerk: Når søkingen når slutten av filen, vil den fortsette fra starten unntatt\n      hvis Ŧwrapscanŧ-valget er resatt.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t   Leksjon 4.3: FINN SAMSVARENDE PARENTESER\n\n\n\t  ** Trykk  %  for å finne en samsvarende ), ] eller } . **\n\n  1. Plasser markøren på en (, [ eller { på linjen nedenfor merket --->.\n\n  2. Trykk  %  .\n\n  3. Markøren vil gå til den samsvarende parentesen eller hakeparentesen.\n\n  4. Trykk  %  for å flytte markøren til den andre samsvarende parentesen.\n\n  5. Flytt markøren til en annen (, ), [, ], { eller } og se hva  %  gjør.\n\n---> Dette ( er en testlinje med (, [ ] og { } i den )).\n\nMerk: Dette er veldig nyttig til feilsøking i programmer som har ubalansert\n      antall parenteser!\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t       Leksjon 4.4: ERSTATT-KOMMANDOEN\n\n\n\t** Skriv  :s/gammel/ny/g  for å erstatte Ŧgammelŧ med Ŧnyŧ. **\n\n  1. Flytt markøren til linjen nedenfor som er merket med --->.\n\n  2. Skriv  :s/deen/den/ <ENTER>  . Legg merke til at denne kommandoen bare\n     forandrer den første forekomsten av Ŧdeenŧ på linjen.\n\n  3. Skriv  :s/deen/den/g . Når g-flagget legges til, betyr dette global\n     erstatning på linjen og erstatter alle forekomster av Ŧdeenŧ på linjen.\n\n---> deen som kan kaste deen tyngste steinen lengst er deen beste\n\n  4. For å erstatte alle forekomster av en tekststreng mellom to linjer,\n     skriv  :#,#s/gammel/ny/g  der #,# er linjenumrene på de to linjene for\n\t\t\t       linjeområdet erstatningen skal gjøres.\n     Skriv  :%s/gammel/ny/g    for å erstatte tekst i hele filen.\n     Skriv  :%s/gammel/ny/gc   for å finne alle forekomster i hele filen, og\n\t\t\t       deretter spørre om teksten skal erstattes eller\n\t\t\t       ikke.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 4\n\n\n  1. Ctrl-G viser nåværende posisjon i filen og filstatusen.\n\t     G\tgår til slutten av filen.\n     nummer  G\tgår til det linjenummeret.\n\t    gg\tgår til den første linjen.\n\n  2. Skriv  /  etterfulgt av en søketekst for å lete FRAMOVER etter teksten.\n     Skriv  ?  etterfulgt av en søketekst for å lete BAKOVER etter teksten.\n     Etter et søk kan du trykke  n  for å finne neste forekomst i den samme\n     retningen eller  N  for å lete i motsatt retning.\n     CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner.\n\n  3. Skriv  %  når markøren står på en (, ), [, ], { eller } for å finne den\n     som samsvarer.\n\n  4. Erstatte Ŧgammelŧ med første Ŧnyŧ på en linje:  :s/gammel/ny\n     Erstatte alle Ŧgammelŧ med Ŧnyŧ på en linje:    :s/gammel/ny/g\n     Erstatte tekst mellom to linjenumre:\t     :#,#s/gammel/ny/g\n     Erstatte alle forekomster i en fil:\t     :%s/gammel/ny/g\n     For å godkjenne hver erstatning, legg til Ŧcŧ:  :%s/gammel/ny/gc\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t       Leksjon 5.1: HVORDAN UTFØRE EN EKSTERN KOMMANDO\n\n\n    ** Skriv  :!  etterfulgt av en ekstern kommando for å utføre denne. **\n\n  1. Skriv den velkjente kommandoen  :\t for å plassere markøren på bunnen av\n     skjermen. Dette lar deg skrive en kommandolinjekommando.\n\n  2. Nå kan du skrive tegnet  !  . Dette lar deg utføre en hvilken som helst\n     ekstern kommando.\n\n  3. Som et eksempel, skriv  ls  etter utropstegnet og trykk <ENTER>. Du vil\n     nå få en liste over filene i katalogen, akkurat som om du hadde kjørt\n     kommandoen direkte fra kommandolinjen i skallet. Eller bruk  :!dir  hvis\n     Ŧlsŧ ikke virker.\n\nMERK: Det er mulig å kjøre alle eksterne kommandoer på denne måten, også med\n      parametere.\n\nMERK: Alle Ŧ:ŧ-kommandoer må avsluttes med <ENTER>. Fra dette punktet er det\n      ikke alltid vi nevner det.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t     Leksjon 5.2: MER OM LAGRING AV FILER\n\n\n      ** For å lagre endringene gjort i en tekst, skriv  :w FILNAVN. **\n\n  1. Skriv  :!dir  eller  :!ls\tfor å få en liste over filene i katalogen. Du\n     vet allerede at du må trykke <ENTER> etter dette.\n\n  2. Velg et filnavn på en fil som ikke finnes, som for eksempel  TEST .\n\n  3. Skriv  :w TEST  (der TEST er filnavnet du velger).\n\n  4. Dette lagrer hele filen (denne innføringen) under navnet TEST . For å\n     sjekke dette, skriv  :!dir  eller\t:!ls  igjen for å se innholdet av\n     katalogen.\n\nMerk: Hvis du nå hadde avsluttet Vim og startet på nytt igjen med Ŧvim TESTŧ,\n      ville filen vært en eksakt kopi av innføringen da du lagret den.\n\n  5. Fjern filen ved å skrive  :!rm TEST  hvis du er på et Unix-lignende\n     operativsystem, eller  :!del TEST\thvis du bruker MS-DOS.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t   Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES\n\n\n     ** For å lagre en del av en fil, skriv  v\tbevegelse  :w FILNAVN **\n\n  1. Flytt markøren til denne linjen.\n\n  2. Trykk  v  og flytt markøren til det femte elementet nedenfor. Legg merke\n     til at teksten blir markert.\n\n  3. Trykk  :  (kolon). På bunnen av skjermen vil  :'<,'>  komme til syne.\n\n  4. Trykk  w TEST  , der TEST er et filnavn som ikke finnes enda. Kontroller\n     at du ser\t:'<,'>w TEST  før du trykker Enter.\n\n  5. Vim vil skrive de valgte linjene til filen TEST. Bruk  :!dir  eller  :!ls\n     for å se den. Ikke slett den enda! Vi vil bruke den i neste leksjon.\n\nMERK: Ved å trykke  v  startes visuelt valg. Du kan flytte markøren rundt for\n      å gjøre det valgte området større eller mindre. Deretter kan du bruke en\n      operator for å gjøre noe med teksten. For eksempel sletter  d  teksten.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\tLeksjon 5.4: HENTING OG SAMMENSLÅING AV FILER\n\n\n ** For å lese inn en annen fil inn i nåværende buffer, skriv  :r FILNAVN  **\n\n  1. Plasser markøren like over denne linjen.\n\nMERK: Etter å ha utført steg 2 vil du se teksten fra leksjon 5.3. Gå deretter\n      NED for å se denne leksjonen igjen.\n\n  2. Hent TEST-filen ved å bruke kommandoen  :r TEST  der TEST er navnet på\n     filen du brukte. Filen du henter blir plassert nedenfor markørlinjen.\n\n  3. For å sjekke at filen ble hentet, gå tilbake og se at det er to kopier av\n     leksjon 5.3, originalen og denne versjonen.\n\nMERK: Du kan også lese utdataene av en ekstern kommando. For eksempel,\t:r !ls\n      leser utdataene av ls-kommandoen og legger dem nedenfor markøren.\n\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 5\n\n\n  1.  :!kommando  utfører en ekstern kommandio.\n\n      Noen nyttige eksempler er:\n\t (MS-DOS)\t  (Unix)\n\t  :!dir\t\t   :!ls\t\t  - List filene i katalogen.\n\t  :!del FILNAVN    :!rm FILNAVN   - Slett filen FILNAVN.\n\n  2.  :w FILNAVN  skriver den nåværende Vim-filen disken med navnet FILNAVN .\n\n  3.  v  bevegelse  :w FILNAVN\tlagrer de visuelt valgte linjene til filen\n     FILNAVN.\n\n  4.  :r FILNAVN  henter filen FILNAVN og legger den inn nedenfor markøren.\n\n  5.  :r !dir  leser utdataene fra Ŧdirŧ-kommandoen og legger dem nedenfor\n     markørposisjonen.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t     Leksjon 6.1: ŦÅPNE LINJEŧ-KOMMANDOEN\n\n\n    ** Skriv  o  for å Ŧåpne oppŧ for en ny linje etter markøren og gå til\n       innsettingsmodus **\n\n  1. Flytt markøren til linjen nedenfor merket --->.\n\n  2. Skriv  o  (liten o) for å åpne opp en linje NEDENFOR markøren og gå inn i\n     innsettingsmodus.\n\n  3. Skriv litt tekst og trykk <ESC> for å gå ut av innsettingsmodusen.\n\n---> Etter at  o  er skrevet blir markøren plassert på den tomme linjen.\n\n  4. For å åpne en ny linje OVER markøren, trykk rett og slett en stor\tO\n     istedenfor en liten  o . Prøv dette på linjen nedenfor.\n\n---> Lag ny linje over denne ved å trykke O mens markøren er på denne linjen.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t      Leksjon 6.2: ŦLEGG TILŧ-KOMMANDOEN\n\n\n\t    ** Skriv  a  for å legge til tekst ETTER markøren. **\n\n  1. Flytt markøren til starten av linjen merket ---> nedenfor.\n\n  2. Trykk  e  til markøren er på slutten av Ŧliŧ.\n\n  3. Trykk  a  (liten a) for å legge til tekst ETTER markøren.\n\n  4. Fullfør ordet sånn som på linjen nedenfor. Trykk <ESC> for å gå ut av\n     innsettingsmodusen.\n\n  5. Bruk  e  for å gå til det neste ufullstendige ordet og repeter steg 3 og\n     4.\n\n---> Denne li lar deg øve på å leg til tek på en linje.\n---> Denne linjen lar deg øve på å legge til tekst på en linje.\n\nMerk: a, i og A går alle til den samme innsettingsmodusen, den eneste\n      forskjellen er hvor tegnene blir satt inn.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t   Leksjon 6.3: EN ANNEN MÅTE Å ERSTATTE PÅ\n\n\n\t   ** Skriv en stor  R\tfor å erstatte mer enn ett tegn. **\n\n  1. Flytt markøren til den første linjen nedenfor merket --->. Flytt markøren\n     til begynnelsen av den første Ŧxxxŧ-en.\n\n  2. Trykk  R  og skriv inn tallet som står nedenfor på den andre linjen så\n     det erstatter xxx.\n\n  3. Trykk <ESC> for å gå ut av erstatningsmodusen. Legg merke til at resten\n     av linjen forblir uforandret.\n\n  4. Repeter stegene for å erstatte den gjenværende xxx.\n\n---> Ved å legge 123 til xxx får vi xxx.\n---> Ved å legge 123 til 456 får vi 579.\n\nMERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives\n      erstatter et eksisterende tegn.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t    Leksjon 6.4: KOPIERE OG LIME INN TEKST\n\n\n    ** Bruk y-operatoren for å kopiere tekst og  p  for å lime den inn **\n\n  1. Gå til linjen merket ---> nedenfor og plasser markøren etter Ŧa)ŧ.\n\n  2. Gå inn i visuell modus med  v  og flytt markøren til like før Ŧførsteŧ.\n\n  3. Trykk  y  for å kopiere (engelsk: Ŧyankŧ) den uthevede teksten.\n\n  4. Flytt markøren til slutten av den neste linjen:  j$\n\n  5. Trykk  p  for å lime inn teksten. Trykk deretter:\ta andre <ESC> .\n\n  6. Bruk visuell modus for å velge Ŧ valget.ŧ, kopier det med\ty , gå til\n     slutten av den neste linjen med  j$  og legg inn teksten der med  p .\n\n---> a) Dette er det første valget.\n     b)\n\nMerk: Du kan også bruke  y  som en operator;  yw  kopierer ett ord.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t    Leksjon 6.5: SETT VALG\n\n\n  ** Sett et valg så søk eller erstatning ignorerer store/små bokstaver. **\n\n  1. Let etter Ŧignoreŧ ved å skrive:  /ignore <ENTER>\n     Repeter flere ganger ved å trykke\tn .\n\n  2. Sett Ŧicŧ-valget (Ignore Case) ved å skrive:  :set ic\n\n  3. Søk etter Ŧignoreŧ igjen ved å trykke  n .\n     Legg merke til at både ŦIgnoreŧ og ŦIGNOREŧ blir funnet.\n\n  4. Sett Ŧhlsearchŧ- og Ŧincsearchŧ-valgene:  :set hls is\n\n  5. Skriv søkekommandoen igjen og se hva som skjer:  /ignore <ENTER>\n\n  6. For å slå av ignorering av store/små bokstaver, skriv:  :set noic\n\nMerk: For å fjerne uthevingen av treff, skriv:\t:nohlsearch\nMerk: Hvis du vil ignorere store/små bokstaver for kun en søkekommando, bruk\n      \\c  i uttrykket:\t/ignore\\c <ENTER>\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 6\n\n  1. Trykk  o  for å legge til en linje NEDENFOR markøren og gå inn i\n     innsettingsmodus.\n     Trykk  O  for å åpne en linje OVER markøren.\n\n  2. Skriv  a  for å sette inn tekst ETTER markøren.\n     Skriv  A  for å sette inn tekst etter slutten av linjen.\n\n  3. Kommandoen  e  går til slutten av et ord.\n\n  4. Operatoren  y  (Ŧyankŧ) kopierer tekst,  p  (Ŧpasteŧ) limer den inn.\n\n  5. Ved å trykke  R  går du inn i erstatningsmodus helt til  <ESC>  trykkes.\n\n  6. Skriv Ŧ:set xxxŧ for å sette valget Ŧxxxŧ. Noen valg er:\n\tŦicŧ Ŧignorecaseŧ\tignorer store/små bokstaver under søk\n\tŦisŧ Ŧincsearchŧ\tvis delvise treff for en søketekst\n\tŦhlsŧ Ŧhlsearchŧ\tuthev alle søketreff\n\n  7. Legg til Ŧnoŧ foran valget for å slå det av:  :set noic\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t    Leksjon 7.1: FÅ HJELP\n\n\n\t\t   ** Bruk det innebygde hjelpesystemet. **\n\n  Vim har et omfattende innebygget hjelpesystem. For å starte det, prøv en av\n  disse måtene:\n    - Trykk Hjelp-tasten (hvis du har en)\n    - Trykk F1-tasten (hvis du har en)\n    - Skriv  :help <ENTER>\n\n  Les teksten i hjelpevinduet for å finne ut hvordan hjelpen virker.\n  Skriv  CTRL-W CTRL-W\tfor å hoppe fra et vindu til et annet\n  Skriv  :q <ENTER>\tfor å lukke hjelpevinduet.\n\n  Du kan få hjelp for omtrent alle temaer om Vim ved å skrive et parameter til\n  Ŧ:helpŧ-kommandoen. Prøv disse (ikke glem å trykke <ENTER>):\n\n    :help w\n    :help c_CTRL-D\n    :help insert-index\n    :help user-manual\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t     Leksjon 7.2: LAG ET OPPSTARTSSKRIPT\n\n\n\t\t\t** Slå på funksjoner i Vim **\n\n  Vim har mange flere funksjoner enn Vi, men flesteparten av dem er slått av\n  som standard. For å begynne å bruke flere funksjoner må du lage en\n  Ŧvimrcŧ-fil.\n\n  1. Start redigeringen av Ŧvimrcŧ-filen. Dette avhenger av systemet ditt:\n\t:e ~/.vimrc\t  for Unix\n\t:e $VIM/_vimrc\t  for MS Windows\n\n  2. Les inn eksempelfilen for Ŧvimrcŧ:\n\t:r $VIMRUNTIME/vimrc_example.vim\n\n  3. Lagre filen med:\n\t:w\n\n  Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til\n  alle dine foretrukne oppsett i denne Ŧvimrcŧ-filen.\n  For mer informasjon, skriv  :help vimrc-intro\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t   Leksjon 7.3: FULLFØRING\n\n\n\t      ** Kommandolinjefullføring med CTRL-D og <TAB> **\n\n  1. Vær sikker på at Vim ikke er i Vi-kompatibel modus:  :set nocp\n\n  2. Se hvilke filer som er i katalogen:  :!ls\teller  :!dir\n\n  3. Skriv starten på en kommando:  :e\n\n  4. Trykk  CTRL-D  og Vim vil vise en liste over kommandoer som starter med\n     Ŧeŧ.\n\n  5. Trykk  <TAB>  og Vim vil fullføre kommandonavnet til Ŧ:editŧ.\n\n  6. Legg til et mellomrom og starten på et eksisterende filnavn:  :edit FIL\n\n  7. Trykk <TAB>. Vim vil fullføre navnet (hvis det er unikt).\n\nMERK: Fullføring fungerer for mange kommandoer. Prøv ved å trykke CTRL-D og\n      <TAB>. Det er spesielt nyttig for bruk sammen med  :help .\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 7\n\n\n  1. Skriv  :help  eller trykk <F1> eller <Help> for å åpne et hjelpevindu.\n\n  2. Skriv  :help kommando  for å få hjelp om  kommando .\n\n  3. Trykk  CTRL-W CTRL-W  for å hoppe til et annet vindu.\n\n  4. Trykk  :q\tfor å lukke hjelpevinduet.\n\n  5. Opprett et vimrc-oppstartsskript for å lagre favorittvalgene dine.\n\n  6. Når du skriver en Ŧ:ŧ-kommando, trykk CTRL-D for å se mulige\n     fullføringer. Trykk <TAB> for å bruke en fullføring.\n\n\n\n\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n  Her slutter innføringen i Vim. Den var ment som en rask oversikt over\n  editoren, akkurat nok til å la deg sette i gang med enkel bruk. Den er på\n  langt nær komplett, da Vim har mange flere kommandoer. Les bruksanvisningen\n  ved å skrive\t:help user-manual  .\n\n  For videre lesing og studier, kan denne boken anbefales:\n      ŦVim - Vi Improvedŧ av Steve Oualline\n      Utgiver: New Riders\n  Den første boken som er fullt og helt dedisert til Vim. Spesielt nyttig for\n  nybegynnere. Inneholder mange eksempler og illustrasjoner.\n  Se http://iccf-holland.org/click5.html\n\n  Denne boken er eldre og handler mer om Vi enn Vim, men anbefales også:\n      ŦLearning the Vi Editorŧ av Linda Lamb\n      Utgiver: O'Reilly & Associates Inc.\n  Det er en god bok for å få vite omtrent hva som helst om Vi.\n  Den sjette utgaven inneholder også informasjon om Vim.\n\n  Denne innføringen er skrevet av Michael C. Pierce og Robert K. Ware,\n  Colorado School of Mines med idéer av Charles Smith, Colorado State\n  University. E-mail: bware@mines.colorado.edu .\n\n  Modifisert for Vim av Bram Moolenaar.\n  Oversatt av Øyvind A. Holm. E-mail: vimtutor _AT_ sunbase.org\n  Id: tutor.no 406 2007-03-18 22:48:36Z sunny\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nvim: set ts=8 :\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/tutor.no",
    "content": "===============================================================================\n= V e l k o m m e n   t i l   i n n f ø r i n g e n   i   V i m  --  Ver. 1.7 =\n===============================================================================\n\n     Vim er en meget kraftig editor med mange kommandoer, alt for mange til å\n     kunne gå gjennom alle i en innføring som denne. Den er beregnet på å\n     sette deg inn i bruken av nok kommandoer så du vil være i stand til lett\n     å kunne bruke Vim som en editor til alle formål.\n\n     Tiden som kreves for å gå gjennom denne innføringen tar ca. 25-30\n     minutter, avhengig av hvor mye tid du bruker til eksperimentering.\n\n     MERK:\n     Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne\n     filen som du kan øve deg på (hvis du kjørte «vimtutor»-kommandoen, er\n     dette allerede en kopi).\n\n     Det er viktig å huske at denne innføringen er beregnet på læring gjennom\n     bruk. Det betyr at du må utføre kommandoene for å lære dem skikkelig.\n     Hvis du bare leser teksten, vil du glemme kommandoene!\n\n     Først av alt, sjekk at «Caps Lock» IKKE er aktiv og trykk «j»-tasten for\n     å flytte markøren helt til leksjon 1.1 fyller skjermen.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t      Leksjon 1.1:  FLYTTING AV MARKØREN\n\n\n       ** For å flytte markøren, trykk tastene h, j, k, l som vist. **\n\t     ^\n\t     k\t\tTips: h-tasten er til venstre og flytter til venstre.\n       < h\t l >\t      l-tasten er til høyre og flytter til høyre.\n\t     j\t\t      j-tasten ser ut som en pil som peker nedover.\n\t     v\n  1. Flytt markøren rundt på skjermen til du har fått det inn i fingrene.\n\n  2. Hold inne nedovertasten (j) til den repeterer.\n     Nå vet du hvordan du beveger deg til neste leksjon.\n\n  3. Gå til leksjon 1.2 ved hjelp av nedovertasten.\n\nMerk: Hvis du blir usikker på noe du har skrevet, trykk <ESC> for å gå til\n      normalmodus. Skriv deretter kommandoen du ønsket på nytt.\n\nMerk: Piltastene skal også virke. Men ved å bruke hjkl vil du være i stand til\n      å bevege markøren mye raskere når du er blitt vant til det. Helt sant!\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  Leksjon 1.2: AVSLUTTE VIM\n\n\n  !! MERK: Før du utfører noen av punktene nedenfor, les hele leksjonen!!\n\n  1. Trykk <ESC>-tasten (for å forsikre deg om at du er i normalmodus).\n\n  2. Skriv:\t:q! <ENTER>.\n     Dette avslutter editoren og FORKASTER alle forandringer som du har gjort.\n\n  3. Når du ser kommandolinjen i skallet, skriv kommandoen som startet denne\n     innføringen. Den er:   vimtutor <ENTER>\n\n  4. Hvis du er sikker på at du husker dette, utfør punktene 1 til 3 for å\n     avslutte og starte editoren på nytt.\n\nMERK:  :q! <ENTER>  forkaster alle forandringer som du gjorde. I løpet av noen\n       få leksjoner vil du lære hvordan du lagrer forandringene til en fil.\n\n  5. Flytt markøren ned til leksjon 1.3.\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t Leksjon 1.3: REDIGERING AV TEKST -- SLETTING\n\n\n\t     ** Trykk  x  for å slette tegnet under markøren. **\n\n  1. Flytt markøren til den første linjen merket med  --->.\n\n  2. For å ordne feilene på linjen, flytt markøren til den er oppå tegnet som\n     skal slettes.\n\n  3. Trykk tasten  x  for å slette det uønskede tegnet.\n\n  4. Repeter punkt 2 til 4 til setningen er lik den som er under.\n\n---> Hessstennnn brrråsnudddde ii gaaata.\n---> Hesten bråsnudde i gata.\n\n  5. Nå som linjen er korrekt, gå til leksjon 1.4.\n\nMERK: Når du går gjennom innføringen, ikke bare prøv å huske kommandoene, men\n      bruk dem helt til de sitter.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\tLeksjon 1.4: REDIGERING AV TEKST -- INNSETTING\n\n\n\t\t    ** Trykk  i  for å sette inn tekst. **\n\n  1. Flytt markøren til den første linjen som er merket med --->.\n\n  2. For å gjøre den første linjen lik den andre, flytt markøren til den står\n     på tegnet ETTER posisjonen der teksten skal settes inn.\n\n  3. Trykk  i  og skriv inn teksten som mangler.\n\n  4. Etterhvert som hver feil er fikset, trykk <ESC> for å returnere til\n     normalmodus. Repeter punkt 2 til 4 til setningen er korrekt.\n\n---> Det er tkst som mnglr .\n---> Det er ganske mye tekst som mangler her.\n\n  5. Når du føler deg komfortabel med å sette inn tekst, gå til oppsummeringen\n     nedenfor.\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\tLeksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL\n\n\n\t\t    ** Trykk  A  for å legge til tekst. **\n\n  1. Flytt markøren til den første linjen nedenfor merket --->.\n     Det har ikke noe å si hvor markøren er plassert på den linjen.\n\n  2. Trykk  A  og skriv inn det som skal legges til.\n\n  3. Når teksten er lagt til, trykk <ESC> for å returnere til normalmodusen.\n\n  4. Flytt markøren til den andre linjen markert med ---> og repeter steg 2 og\n     3 for å reparere denne setningen.\n\n---> Det mangler noe tekst p\n     Det mangler noe tekst på denne linjen.\n---> Det mangler også litt tek\n     Det mangler også litt tekst på denne linjen.\n\n  5. Når du føler at du behersker å legge til tekst, gå til leksjon 1.6.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t Leksjon 1.6: REDIGERE EN FIL\n\n\n\t       ** Bruk\t:wq  for å lagre en fil og avslutte. **\n\n  !! MERK: Før du utfører noen av stegene nedenfor, les hele denne leksjonen!!\n\n  1. Avslutt denne innføringen som du gjorde i leksjon 1.2:  :q!\n\n  2. Skriv denne kommandoen på kommandolinja:  vim tutor <ENTER>\n     «vim» er kommandoen for å starte Vim-editoren, «tutor» er navnet på fila\n     som du vil redigere. Bruk en fil som kan forandres.\n\n  3. Sett inn og slett tekst som du lærte i de foregående leksjonene.\n\n  4. Lagre filen med forandringene og avslutt Vim med:\t:wq <ENTER>\n\n  5. Start innføringen på nytt og flytt ned til oppsummeringen som følger.\n\n  6. Etter å ha lest og forstått stegene ovenfor: Sett i gang.\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 1\n\n\n  1. Markøren beveges ved hjelp av piltastene eller hjkl-tastene.\n\t h (venstre)\t j (ned)     k (opp)\t l (høyre)\n\n  2. For å starte Vim fra skall-kommandolinjen, skriv:\tvim FILNAVN <ENTER>\n\n  3. For å avslutte Vim, skriv:  <ESC> :q! <ENTER>  for å forkaste endringer.\n\t\t   ELLER skriv:  <ESC> :wq <ENTER>  for å lagre forandringene.\n\n  4. For å slette tegnet under markøren, trykk:  x\n\n  5. For å sette inn eller legge til tekst, trykk:\n\t i    skriv innsatt tekst  <ESC>\tsett inn før markøren\n\t A    skriv tillagt tekst  <ESC>\tlegg til på slutten av linjen\n\nMERK: Når du trykker <ESC> går du til normalmodus eller du avbryter en uønsket\n      og delvis fullført kommando.\n\n  Nå kan du gå videre til leksjon 2.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\tLeksjon 2.1: SLETTEKOMMANDOER\n\n\n\t\t    ** Trykk  dw  for å slette et ord. **\n\n  1. Trykk <ESC> for å være sikker på at du er i normalmodus.\n\n  2. Flytt markøren til den første linjen nedenfor merket --->.\n\n  3. Flytt markøren til begynnelsen av ordet som skal slettes.\n\n  4. Trykk  dw\tog ordet vil forsvinne.\n\nMERK: Bokstaven  d  vil komme til syne på den nederste linjen på skjermen når\n      du skriver den. Vim venter på at du skal skrive w . Hvis du ser et annet\n      tegn enn\td  har du skrevet noe feil; trykk <ESC> og start på nytt.\n\n---> Det er agurk tre ord eple som ikke hører pære hjemme i denne setningen.\n---> Det er tre ord som ikke hører hjemme i denne setningen.\n\n  5. Repeter punkt 3 og 4 til den første setningen er lik den andre. Gå\n     deretter til leksjon 2.2.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t     Leksjon 2.2: FLERE SLETTEKOMMANDOER\n\n\n\t     ** Trykk  d$  for å slette til slutten av linjen. **\n\n  1. Trykk <ESC> for å være sikker på at du er i normalmodus.\n\n  2. Flytt markøren til linjen nedenfor merket --->.\n\n  3. Flytt markøren til punktet der linjen skal kuttes (ETTER første punktum).\n\n  4. Trykk  d$\tfor å slette alt til slutten av linjen.\n\n---> Noen skrev slutten på linjen en gang for mye. linjen en gang for mye.\n\n  5. Gå til leksjon 2.3 for å forstå hva som skjer.\n\n\n\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t   Leksjon 2.3: OM OPERATORER OG BEVEGELSER\n\n\n  Mange kommandoer som forandrer teksten er laget ut i fra en operator og en\n  bevegelse. Formatet for en slettekommando med sletteoperatoren  d  er:\n\n\td   bevegelse\n\n  Der:\n    d\t      - er sletteoperatoren.\n    bevegelse - er hva operatoren vil opere på (listet nedenfor).\n\n  En kort liste med bevegelser:\n    w - til starten av det neste ordet, UNNTATT det første tegnet.\n    e - til slutten av det nåværende ordet, INKLUDERT det siste tegnet.\n    $ - til slutten av linjen, INKLUDERT det siste tegnet.\n\n  Ved å skrive\tde  vil altså alt fra markøren til slutten av ordet bli\n  slettet.\n\nMERK:  Ved å skrive kun bevegelsen i normalmodusen uten en operator vil\n       markøren flyttes som spesifisert.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE\n\n\n ** Ved å skrive et tall foran en bevegelse repeterer den så mange ganger. **\n\n  1. Flytt markøren til starten av linjen markert ---> nedenfor.\n\n  2. Skriv  2w\tfor å flytte markøren to ord framover.\n\n  3. Skriv  3e\tfor å flytte markøren framover til slutten av det tredje\n     ordet.\n\n  4. Skriv  0  (null) for å flytte til starten av linjen.\n\n  5. Repeter steg 2 og 3 med forskjellige tall.\n\n---> Dette er en linje med noen ord som du kan bevege deg rundt på.\n\n  6. Gå videre til leksjon 2.5.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t Leksjon 2.5: BRUK AV ANTALL FOR Å SLETTE MER\n\n\n     ** Et tall sammen med en operator repeterer den så mange ganger. **\n\n  I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du\n  inn antall før bevegelsen for å slette mer:\n\t d  nummer  bevegelse\n\n  1. Flytt markøren til det første ordet med STORE BOKSTAVER på linjen markert\n     med --->.\n\n  2. Skriv  2dw  for å slette de to ordene med store bokstaver.\n\n  3. Repeter steg 1 og 2 med forskjelling antall for å slette de etterfølgende\n     ordene som har store bokstaver.\n\n---> Denne ABC DE linjen FGHI JK LMN OP er nå Q RS TUV litt mer lesbar.\n\nMERK: Et antall mellom operatoren  d  og bevegelsen virker på samme måte som å\n      bruke bevegelsen uten en operator.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\tLeksjon 2.6: OPERERE PÅ LINJER\n\n\n\t\t ** Trykk  dd  for å slette en hel linje. **\n\n  På grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at\n  det vil være lettere å rett og slett trykke to d-er for å slette en linje.\n\n  1. Flytt markøren til den andre linjen i verset nedenfor.\n  2. Trykk  dd\t å slette linjen.\n  3. Flytt deretter til den fjerde linjen.\n  4. Trykk  2dd  for å slette to linjer.\n\n--->  1) Roser er røde,\n--->  2) Gjørme er gøy,\n--->  3) Fioler er blå,\n--->  4) Jeg har en bil,\n--->  5) Klokker viser tiden,\n--->  6) Druer er søte\n--->  7) Og du er likeså.\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\tLeksjon 2.7: ANGRE-KOMMANDOEN\n\n\n  ** Trykk  u  for å angre siste kommando,  U  for å fikse en hel linje. **\n\n  1. Flytt markøren til linjen nedenfor merket ---> og plasser den på den\n     første feilen.\n  2. Trykk  x  for å slette det første uønskede tegnet.\n  3. Trykk så  u  for å angre den siste utførte kommandoen.\n  4. Deretter ordner du alle feilene på linjene ved å bruke kommandoen\tx  .\n  5. Trykk nå en stor  U  for å sette linjen tilbake til det den var\n     originalt.\n  6. Trykk  u  noen ganger for å angre\tU  og foregående kommandoer.\n  7. Deretter trykker du  CTRL-R  (hold CTRL nede mens du trykker R) noen\n     ganger for å gjenopprette kommandoene (omgjøre angrekommandoene).\n\n---> RReparer feiilene påå denne linnnjen oog erssstatt dem meed angre.\n\n  8. Dette er meget nyttige kommandoer. Nå kan du gå til oppsummeringen av\n     leksjon 2.\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 2\n\n\n  1. For å slette fra markøren fram til det neste ordet, trykk:  dw\n  2. For å slette fra markøren til slutten av en linje, trykk:\td$\n  3. For å slette en hel linje, trykk:\tdd\n\n  4. For å repetere en bevegelse, sett et nummer foran:  2w\n  5. Formatet for en forandringskommando er:\n\t       operator  [nummer]  bevegelse\n     der:\n       operator  - hva som skal gjøres, f.eks.\td  for å slette\n       [nummer]  - et valgfritt antall for å repetere bevegelsen\n       bevegelse - hva kommandoen skal operere på, eksempelvis\tw  (ord),\n\t\t   $  (til slutten av linjen) og så videre.\n\n  6. For å gå til starten av en linje, bruk en null:  0\n\n  7. For å angre tidligere endringer, skriv:\t\tu  (liten u)\n     For å angre alle forandringer på en linje, skriv:\tU  (stor U)\n     For å omgjøre angringen, trykk:\t\t\tCTRL-R\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t      Leksjon 3.1: «LIM INN»-KOMMANDOEN\n\n\n    ** Trykk  p  for å lime inn tidligere slettet tekst etter markøren **\n\n  1. Flytt markøren til den første linjen med ---> nedenfor.\n\n  2. Trykk  dd\tfor å slette linjen og lagre den i et Vim-register.\n\n  3. Flytt markøren til c)-linjen, OVER posisjonen linjen skal settes inn.\n\n  4. Trykk  p  for å legge linjen under markøren.\n\n  5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkefølge.\n\n---> d) Kan du også lære?\n---> b) Fioler er blå,\n---> c) Intelligens må læres,\n---> a) Roser er røde,\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t      Leksjon 3.2: «ERSTATT»-KOMMANDOEN\n\n\n\t ** Trykk  rx  for å erstatte tegnet under markøren med x. **\n\n  1. Flytt markøren til den første linjen nedenfor merket --->.\n\n  2. Flytt markøren så den står oppå den første feilen.\n\n  3. Trykk  r  og deretter tegnet som skal være der.\n\n  4. Repeter punkt 2 og 3 til den første linjen er lik den andre.\n\n---> Da dfnne lynjxn ble zkrevet, var det nøen som tjykket feite taster!\n---> Da denne linjen ble skrevet, var det noen som trykket feile taster!\n\n  5. Gå videre til leksjon 3.2.\n\nMERK: Husk at du bør lære ved å BRUKE, ikke pugge.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t      Leksjon 3.3: «FORANDRE»-OPERATOREN\n\n\n\t   ** For å forandre til slutten av et ord, trykk  ce . **\n\n  1. Flytt markøren til den første linjen nedenfor som er merket --->.\n\n  2. Plasser markøren på  u  i «lubjwr».\n\n  3. Trykk  ce\tog det korrekte ordet (i dette tilfellet, skriv «injen»).\n\n  4. Trykk <ESC> og gå til det neste tegnet som skal forandres.\n\n  5. Repeter punkt 3 og 4 helt til den første setningen er lik den andre.\n\n---> Denne lubjwr har noen wgh som må forkwåp med «forækzryas»-kommandoen.\n---> Denne linjen har noen ord som må forandres med «forandre»-kommandoen.\n\nVær oppmerksom på at  ce  sletter ordet og går inn i innsettingsmodus.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\tLeksjon 3.4: FLERE FORANDRINGER VED BRUK AV c\n\n\n ** Forandringskommandoen blir brukt med de samme bevegelser som «slett». **\n\n  1. Forandringsoperatoren fungerer på samme måte som «slett». Formatet er:\n\n\t c    [nummer]\t bevegelse\n\n  2. Bevegelsene er de samme, som for eksempel\tw  (ord) og  $\t(slutten av en\n     linje).\n\n  3. Gå til den første linjen nedenfor som er merket --->.\n\n  4. Flytt markøren til den første feilen.\n\n  5. Skriv  c$\tog skriv resten av linjen lik den andre og trykk <ESC>.\n\n---> Slutten på denne linjen trenger litt hjelp for å gjøre den lik den neste.\n---> Slutten på denne linjen trenger å bli rettet ved bruk av c$-kommandoen.\n\nMERK: Du kan bruke slettetasten for å rette feil mens du skriver.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 3\n\n\n  1. For å legge tilbake tekst som nettopp er blitt slettet, trykk  p  . Dette\n     limer inn den slettede teksten ETTER markøren (hvis en linje ble slettet\n     vil den bli limt inn på linjen under markøren).\n\n  2. For å erstatte et tegn under markøren, trykk  r  og deretter tegnet som\n     du vil ha der.\n\n  3. Forandringsoperatoren lar deg forandre fra markøren til dit bevegelsen\n     tar deg. Det vil si, skriv  ce  for å forandre fra markøren til slutten\n     av ordet,\tc$  for å forandre til slutten av linjen.\n\n  4. Formatet for «forandre» er:\n\n\t c   [nummer]\tbevegelse\n\nNå kan du gå til neste leksjon.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t     Leksjon 4.1: POSISJONERING AV MARKØREN OG FILSTATUS\n\n\t** Trykk CTRL-G for å vise posisjonen i filen og filstatusen.\n\t   Trykk  G  for å gå til en spesifikk linje i filen. **\n\n  Merk: Les hele leksjonen før du utfører noen av punktene!\n\n  1. Hold nede Ctrl-tasten og trykk  g\t. Vi kaller dette CTRL-G. En melding\n     vil komme til syne på bunnen av skjermen med filnavnet og posisjonen i\n     filen. Husk linjenummeret for bruk i steg 3.\n\nMerk: Du kan se markørposisjonen i nederste høyre hjørne av skjermen. Dette\n      skjer når «ruler»-valget er satt (forklart i leksjon 6).\n\n  2. Trykk  G  for å gå til bunnen av filen.\n     Skriv  gg\tfor å gå til begynnelsen av filen.\n\n  3. Skriv inn linjenummeret du var på og deretter  G . Dette vil føre deg\n     tilbake til linjen du var på da du først trykket CTRL-G.\n\n  4. Utfør steg 1 til 3 hvis du føler deg sikker på prosedyren.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t Leksjon 4.2: SØKEKOMMANDOEN\n\n      ** Skriv\t/  etterfulgt av en søkestreng som du vil lete etter. **\n\n  1. Trykk  /  når du er i normalmodusen. Legg merke til at skråstreken og\n     markøren kommer til syne på bunnen av skjermen i likhet med\n     «:»-kommandoene.\n\n  2. Skriv «feeeiil» og trykk <ENTER>. Dette er teksten du vil lete etter.\n\n  3. For å finne neste forekomst av søkestrengen, trykk  n .\n     For å lete etter samme søketeksten i motsatt retning, trykk  N .\n\n  4. For å lete etter en tekst bakover i filen, bruk  ?  istedenfor  /\t.\n\n  5. For å gå tilbake til der du kom fra, trykk  CTRL-O  (Hold Ctrl nede mens\n     du trykker bokstaven  o ). Repeter for å gå enda lengre tilbake. CTRL-I\n     går framover.\n\n---> «feeeiil» er ikke måten å skrive «feil» på, feeeiil er helt feil.\nMerk: Når søkingen når slutten av filen, vil den fortsette fra starten unntatt\n      hvis «wrapscan»-valget er resatt.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t   Leksjon 4.3: FINN SAMSVARENDE PARENTESER\n\n\n\t  ** Trykk  %  for å finne en samsvarende ), ] eller } . **\n\n  1. Plasser markøren på en (, [ eller { på linjen nedenfor merket --->.\n\n  2. Trykk  %  .\n\n  3. Markøren vil gå til den samsvarende parentesen eller hakeparentesen.\n\n  4. Trykk  %  for å flytte markøren til den andre samsvarende parentesen.\n\n  5. Flytt markøren til en annen (, ), [, ], { eller } og se hva  %  gjør.\n\n---> Dette ( er en testlinje med (, [ ] og { } i den )).\n\nMerk: Dette er veldig nyttig til feilsøking i programmer som har ubalansert\n      antall parenteser!\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t       Leksjon 4.4: ERSTATT-KOMMANDOEN\n\n\n\t** Skriv  :s/gammel/ny/g  for å erstatte «gammel» med «ny». **\n\n  1. Flytt markøren til linjen nedenfor som er merket med --->.\n\n  2. Skriv  :s/deen/den/ <ENTER>  . Legg merke til at denne kommandoen bare\n     forandrer den første forekomsten av «deen» på linjen.\n\n  3. Skriv  :s/deen/den/g . Når g-flagget legges til, betyr dette global\n     erstatning på linjen og erstatter alle forekomster av «deen» på linjen.\n\n---> deen som kan kaste deen tyngste steinen lengst er deen beste\n\n  4. For å erstatte alle forekomster av en tekststreng mellom to linjer,\n     skriv  :#,#s/gammel/ny/g  der #,# er linjenumrene på de to linjene for\n\t\t\t       linjeområdet erstatningen skal gjøres.\n     Skriv  :%s/gammel/ny/g    for å erstatte tekst i hele filen.\n     Skriv  :%s/gammel/ny/gc   for å finne alle forekomster i hele filen, og\n\t\t\t       deretter spørre om teksten skal erstattes eller\n\t\t\t       ikke.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 4\n\n\n  1. Ctrl-G viser nåværende posisjon i filen og filstatusen.\n\t     G\tgår til slutten av filen.\n     nummer  G\tgår til det linjenummeret.\n\t    gg\tgår til den første linjen.\n\n  2. Skriv  /  etterfulgt av en søketekst for å lete FRAMOVER etter teksten.\n     Skriv  ?  etterfulgt av en søketekst for å lete BAKOVER etter teksten.\n     Etter et søk kan du trykke  n  for å finne neste forekomst i den samme\n     retningen eller  N  for å lete i motsatt retning.\n     CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner.\n\n  3. Skriv  %  når markøren står på en (, ), [, ], { eller } for å finne den\n     som samsvarer.\n\n  4. Erstatte «gammel» med første «ny» på en linje:  :s/gammel/ny\n     Erstatte alle «gammel» med «ny» på en linje:    :s/gammel/ny/g\n     Erstatte tekst mellom to linjenumre:\t     :#,#s/gammel/ny/g\n     Erstatte alle forekomster i en fil:\t     :%s/gammel/ny/g\n     For å godkjenne hver erstatning, legg til «c»:  :%s/gammel/ny/gc\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t       Leksjon 5.1: HVORDAN UTFØRE EN EKSTERN KOMMANDO\n\n\n    ** Skriv  :!  etterfulgt av en ekstern kommando for å utføre denne. **\n\n  1. Skriv den velkjente kommandoen  :\t for å plassere markøren på bunnen av\n     skjermen. Dette lar deg skrive en kommandolinjekommando.\n\n  2. Nå kan du skrive tegnet  !  . Dette lar deg utføre en hvilken som helst\n     ekstern kommando.\n\n  3. Som et eksempel, skriv  ls  etter utropstegnet og trykk <ENTER>. Du vil\n     nå få en liste over filene i katalogen, akkurat som om du hadde kjørt\n     kommandoen direkte fra kommandolinjen i skallet. Eller bruk  :!dir  hvis\n     «ls» ikke virker.\n\nMERK: Det er mulig å kjøre alle eksterne kommandoer på denne måten, også med\n      parametere.\n\nMERK: Alle «:»-kommandoer må avsluttes med <ENTER>. Fra dette punktet er det\n      ikke alltid vi nevner det.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t     Leksjon 5.2: MER OM LAGRING AV FILER\n\n\n      ** For å lagre endringene gjort i en tekst, skriv  :w FILNAVN. **\n\n  1. Skriv  :!dir  eller  :!ls\tfor å få en liste over filene i katalogen. Du\n     vet allerede at du må trykke <ENTER> etter dette.\n\n  2. Velg et filnavn på en fil som ikke finnes, som for eksempel  TEST .\n\n  3. Skriv  :w TEST  (der TEST er filnavnet du velger).\n\n  4. Dette lagrer hele filen (denne innføringen) under navnet TEST . For å\n     sjekke dette, skriv  :!dir  eller\t:!ls  igjen for å se innholdet av\n     katalogen.\n\nMerk: Hvis du nå hadde avsluttet Vim og startet på nytt igjen med «vim TEST»,\n      ville filen vært en eksakt kopi av innføringen da du lagret den.\n\n  5. Fjern filen ved å skrive  :!rm TEST  hvis du er på et Unix-lignende\n     operativsystem, eller  :!del TEST\thvis du bruker MS-DOS.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t   Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES\n\n\n     ** For å lagre en del av en fil, skriv  v\tbevegelse  :w FILNAVN **\n\n  1. Flytt markøren til denne linjen.\n\n  2. Trykk  v  og flytt markøren til det femte elementet nedenfor. Legg merke\n     til at teksten blir markert.\n\n  3. Trykk  :  (kolon). På bunnen av skjermen vil  :'<,'>  komme til syne.\n\n  4. Trykk  w TEST  , der TEST er et filnavn som ikke finnes enda. Kontroller\n     at du ser\t:'<,'>w TEST  før du trykker Enter.\n\n  5. Vim vil skrive de valgte linjene til filen TEST. Bruk  :!dir  eller  :!ls\n     for å se den. Ikke slett den enda! Vi vil bruke den i neste leksjon.\n\nMERK: Ved å trykke  v  startes visuelt valg. Du kan flytte markøren rundt for\n      å gjøre det valgte området større eller mindre. Deretter kan du bruke en\n      operator for å gjøre noe med teksten. For eksempel sletter  d  teksten.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\tLeksjon 5.4: HENTING OG SAMMENSLÅING AV FILER\n\n\n ** For å lese inn en annen fil inn i nåværende buffer, skriv  :r FILNAVN  **\n\n  1. Plasser markøren like over denne linjen.\n\nMERK: Etter å ha utført steg 2 vil du se teksten fra leksjon 5.3. Gå deretter\n      NED for å se denne leksjonen igjen.\n\n  2. Hent TEST-filen ved å bruke kommandoen  :r TEST  der TEST er navnet på\n     filen du brukte. Filen du henter blir plassert nedenfor markørlinjen.\n\n  3. For å sjekke at filen ble hentet, gå tilbake og se at det er to kopier av\n     leksjon 5.3, originalen og denne versjonen.\n\nMERK: Du kan også lese utdataene av en ekstern kommando. For eksempel,\t:r !ls\n      leser utdataene av ls-kommandoen og legger dem nedenfor markøren.\n\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 5\n\n\n  1.  :!kommando  utfører en ekstern kommandio.\n\n      Noen nyttige eksempler er:\n\t (MS-DOS)\t  (Unix)\n\t  :!dir\t\t   :!ls\t\t  - List filene i katalogen.\n\t  :!del FILNAVN    :!rm FILNAVN   - Slett filen FILNAVN.\n\n  2.  :w FILNAVN  skriver den nåværende Vim-filen disken med navnet FILNAVN .\n\n  3.  v  bevegelse  :w FILNAVN\tlagrer de visuelt valgte linjene til filen\n     FILNAVN.\n\n  4.  :r FILNAVN  henter filen FILNAVN og legger den inn nedenfor markøren.\n\n  5.  :r !dir  leser utdataene fra «dir»-kommandoen og legger dem nedenfor\n     markørposisjonen.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t     Leksjon 6.1: «ÅPNE LINJE»-KOMMANDOEN\n\n\n    ** Skriv  o  for å «åpne opp» for en ny linje etter markøren og gå til\n       innsettingsmodus **\n\n  1. Flytt markøren til linjen nedenfor merket --->.\n\n  2. Skriv  o  (liten o) for å åpne opp en linje NEDENFOR markøren og gå inn i\n     innsettingsmodus.\n\n  3. Skriv litt tekst og trykk <ESC> for å gå ut av innsettingsmodusen.\n\n---> Etter at  o  er skrevet blir markøren plassert på den tomme linjen.\n\n  4. For å åpne en ny linje OVER markøren, trykk rett og slett en stor\tO\n     istedenfor en liten  o . Prøv dette på linjen nedenfor.\n\n---> Lag ny linje over denne ved å trykke O mens markøren er på denne linjen.\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t      Leksjon 6.2: «LEGG TIL»-KOMMANDOEN\n\n\n\t    ** Skriv  a  for å legge til tekst ETTER markøren. **\n\n  1. Flytt markøren til starten av linjen merket ---> nedenfor.\n\n  2. Trykk  e  til markøren er på slutten av «li».\n\n  3. Trykk  a  (liten a) for å legge til tekst ETTER markøren.\n\n  4. Fullfør ordet sånn som på linjen nedenfor. Trykk <ESC> for å gå ut av\n     innsettingsmodusen.\n\n  5. Bruk  e  for å gå til det neste ufullstendige ordet og repeter steg 3 og\n     4.\n\n---> Denne li lar deg øve på å leg til tek på en linje.\n---> Denne linjen lar deg øve på å legge til tekst på en linje.\n\nMerk: a, i og A går alle til den samme innsettingsmodusen, den eneste\n      forskjellen er hvor tegnene blir satt inn.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t   Leksjon 6.3: EN ANNEN MÅTE Å ERSTATTE PÅ\n\n\n\t   ** Skriv en stor  R\tfor å erstatte mer enn ett tegn. **\n\n  1. Flytt markøren til den første linjen nedenfor merket --->. Flytt markøren\n     til begynnelsen av den første «xxx»-en.\n\n  2. Trykk  R  og skriv inn tallet som står nedenfor på den andre linjen så\n     det erstatter xxx.\n\n  3. Trykk <ESC> for å gå ut av erstatningsmodusen. Legg merke til at resten\n     av linjen forblir uforandret.\n\n  4. Repeter stegene for å erstatte den gjenværende xxx.\n\n---> Ved å legge 123 til xxx får vi xxx.\n---> Ved å legge 123 til 456 får vi 579.\n\nMERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives\n      erstatter et eksisterende tegn.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t    Leksjon 6.4: KOPIERE OG LIME INN TEKST\n\n\n    ** Bruk y-operatoren for å kopiere tekst og  p  for å lime den inn **\n\n  1. Gå til linjen merket ---> nedenfor og plasser markøren etter «a)».\n\n  2. Gå inn i visuell modus med  v  og flytt markøren til like før «første».\n\n  3. Trykk  y  for å kopiere (engelsk: «yank») den uthevede teksten.\n\n  4. Flytt markøren til slutten av den neste linjen:  j$\n\n  5. Trykk  p  for å lime inn teksten. Trykk deretter:\ta andre <ESC> .\n\n  6. Bruk visuell modus for å velge « valget.», kopier det med\ty , gå til\n     slutten av den neste linjen med  j$  og legg inn teksten der med  p .\n\n---> a) Dette er det første valget.\n     b)\n\nMerk: Du kan også bruke  y  som en operator;  yw  kopierer ett ord.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t    Leksjon 6.5: SETT VALG\n\n\n  ** Sett et valg så søk eller erstatning ignorerer store/små bokstaver. **\n\n  1. Let etter «ignore» ved å skrive:  /ignore <ENTER>\n     Repeter flere ganger ved å trykke\tn .\n\n  2. Sett «ic»-valget (Ignore Case) ved å skrive:  :set ic\n\n  3. Søk etter «ignore» igjen ved å trykke  n .\n     Legg merke til at både «Ignore» og «IGNORE» blir funnet.\n\n  4. Sett «hlsearch»- og «incsearch»-valgene:  :set hls is\n\n  5. Skriv søkekommandoen igjen og se hva som skjer:  /ignore <ENTER>\n\n  6. For å slå av ignorering av store/små bokstaver, skriv:  :set noic\n\nMerk: For å fjerne uthevingen av treff, skriv:\t:nohlsearch\nMerk: Hvis du vil ignorere store/små bokstaver for kun en søkekommando, bruk\n      \\c  i uttrykket:\t/ignore\\c <ENTER>\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 6\n\n  1. Trykk  o  for å legge til en linje NEDENFOR markøren og gå inn i\n     innsettingsmodus.\n     Trykk  O  for å åpne en linje OVER markøren.\n\n  2. Skriv  a  for å sette inn tekst ETTER markøren.\n     Skriv  A  for å sette inn tekst etter slutten av linjen.\n\n  3. Kommandoen  e  går til slutten av et ord.\n\n  4. Operatoren  y  («yank») kopierer tekst,  p  («paste») limer den inn.\n\n  5. Ved å trykke  R  går du inn i erstatningsmodus helt til  <ESC>  trykkes.\n\n  6. Skriv «:set xxx» for å sette valget «xxx». Noen valg er:\n\t«ic» «ignorecase»\tignorer store/små bokstaver under søk\n\t«is» «incsearch»\tvis delvise treff for en søketekst\n\t«hls» «hlsearch»\tuthev alle søketreff\n\n  7. Legg til «no» foran valget for å slå det av:  :set noic\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t    Leksjon 7.1: FÅ HJELP\n\n\n\t\t   ** Bruk det innebygde hjelpesystemet. **\n\n  Vim har et omfattende innebygget hjelpesystem. For å starte det, prøv en av\n  disse måtene:\n    - Trykk Hjelp-tasten (hvis du har en)\n    - Trykk F1-tasten (hvis du har en)\n    - Skriv  :help <ENTER>\n\n  Les teksten i hjelpevinduet for å finne ut hvordan hjelpen virker.\n  Skriv  CTRL-W CTRL-W\tfor å hoppe fra et vindu til et annet\n  Skriv  :q <ENTER>\tfor å lukke hjelpevinduet.\n\n  Du kan få hjelp for omtrent alle temaer om Vim ved å skrive et parameter til\n  «:help»-kommandoen. Prøv disse (ikke glem å trykke <ENTER>):\n\n    :help w\n    :help c_CTRL-D\n    :help insert-index\n    :help user-manual\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t     Leksjon 7.2: LAG ET OPPSTARTSSKRIPT\n\n\n\t\t\t** Slå på funksjoner i Vim **\n\n  Vim har mange flere funksjoner enn Vi, men flesteparten av dem er slått av\n  som standard. For å begynne å bruke flere funksjoner må du lage en\n  «vimrc»-fil.\n\n  1. Start redigeringen av «vimrc»-filen. Dette avhenger av systemet ditt:\n\t:e ~/.vimrc\t  for Unix\n\t:e $VIM/_vimrc\t  for MS Windows\n\n  2. Les inn eksempelfilen for «vimrc»:\n\t:r $VIMRUNTIME/vimrc_example.vim\n\n  3. Lagre filen med:\n\t:w\n\n  Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til\n  alle dine foretrukne oppsett i denne «vimrc»-filen.\n  For mer informasjon, skriv  :help vimrc-intro\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t   Leksjon 7.3: FULLFØRING\n\n\n\t      ** Kommandolinjefullføring med CTRL-D og <TAB> **\n\n  1. Vær sikker på at Vim ikke er i Vi-kompatibel modus:  :set nocp\n\n  2. Se hvilke filer som er i katalogen:  :!ls\teller  :!dir\n\n  3. Skriv starten på en kommando:  :e\n\n  4. Trykk  CTRL-D  og Vim vil vise en liste over kommandoer som starter med\n     «e».\n\n  5. Trykk  <TAB>  og Vim vil fullføre kommandonavnet til «:edit».\n\n  6. Legg til et mellomrom og starten på et eksisterende filnavn:  :edit FIL\n\n  7. Trykk <TAB>. Vim vil fullføre navnet (hvis det er unikt).\n\nMERK: Fullføring fungerer for mange kommandoer. Prøv ved å trykke CTRL-D og\n      <TAB>. Det er spesielt nyttig for bruk sammen med  :help .\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\t\t\t  OPPSUMMERING AV LEKSJON 7\n\n\n  1. Skriv  :help  eller trykk <F1> eller <Help> for å åpne et hjelpevindu.\n\n  2. Skriv  :help kommando  for å få hjelp om  kommando .\n\n  3. Trykk  CTRL-W CTRL-W  for å hoppe til et annet vindu.\n\n  4. Trykk  :q\tfor å lukke hjelpevinduet.\n\n  5. Opprett et vimrc-oppstartsskript for å lagre favorittvalgene dine.\n\n  6. Når du skriver en «:»-kommando, trykk CTRL-D for å se mulige\n     fullføringer. Trykk <TAB> for å bruke en fullføring.\n\n\n\n\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n  Her slutter innføringen i Vim. Den var ment som en rask oversikt over\n  editoren, akkurat nok til å la deg sette i gang med enkel bruk. Den er på\n  langt nær komplett, da Vim har mange flere kommandoer. Les bruksanvisningen\n  ved å skrive\t:help user-manual  .\n\n  For videre lesing og studier, kan denne boken anbefales:\n      «Vim - Vi Improved» av Steve Oualline\n      Utgiver: New Riders\n  Den første boken som er fullt og helt dedisert til Vim. Spesielt nyttig for\n  nybegynnere. Inneholder mange eksempler og illustrasjoner.\n  Se http://iccf-holland.org/click5.html\n\n  Denne boken er eldre og handler mer om Vi enn Vim, men anbefales også:\n      «Learning the Vi Editor» av Linda Lamb\n      Utgiver: O'Reilly & Associates Inc.\n  Det er en god bok for å få vite omtrent hva som helst om Vi.\n  Den sjette utgaven inneholder også informasjon om Vim.\n\n  Denne innføringen er skrevet av Michael C. Pierce og Robert K. Ware,\n  Colorado School of Mines med idéer av Charles Smith, Colorado State\n  University. E-mail: bware@mines.colorado.edu .\n\n  Modifisert for Vim av Bram Moolenaar.\n  Oversatt av Øyvind A. Holm. E-mail: vimtutor _AT_ sunbase.org\n  Id: tutor.no 406 2007-03-18 22:48:36Z sunny\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nvim: set ts=8 :\n"
  },
  {
    "path": "src/test/resources/samples/langs/Text/zonalAve-help.ncl",
    "content": "THE_URL:file://localhost/Users/hubery/Public/ucar/Document/Functions/Contributed/zonalAve.shtml\nTHE_TITLE:zonalAve\n   NCL Home > Documentation > Functions > General applied math\n\nzonalAve\n\n   Computes a zonal average of the input array.\n\nPrototype\n\nload \"$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl\"\n\n        function zonalAve (\n                x  : numeric\n        )\n\n        return_val  :  typeof(x)\n\nArguments\n\n   x\n\n   An array of any size and type.\n\nReturn value\n\n   The results are returned in an array of the same type and one dimension smaller than x. Metadata are preserved.\n\nDescription\n\n   This function computes a zonal average of the input array x. If the input array has a \"long_name\" or \"short_name\"\n   attribute, it will be updated.\n\n\n   Â©2015 UCAR | Privacy Policy | Terms of Use | Contact the Webmaster | Sponsored by NSF\n"
  },
  {
    "path": "src/test/resources/samples/langs/Thrift/linguist.thrift",
    "content": "struct PullRequest {\n  1: string title\n}\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Turing/simplegame.t",
    "content": "%This is a comment\nvar x : array 0 .. 100 of int \nvar rangeX, rangeY, loopFor : int := 0\nsetscreen (\"graphics:696;400,nobuttonbar\")\nsetscreen (\"nocursor\")\nsetscreen (\"noecho\")\nvar colourP : string := \"Yellow\"\nvar title : int := Font.New (\"Algerian:60\")\nvar subtitle : int := Font.New (\"Algerian:20\")\nvar xValue, yValue, font1, font2, instructionsTitle : int\nvar scoreR, scoreY, button : int := 0\nvar scoreRS, scoreYS, PreventFor : string\nvar win : string := \"N\"\nvar full, samePlayer : boolean := false\nfont1 := Font.New (\"Algerian:20\")\nfont2 := Font.New (\"TimesNewRoman:15\")\ninstructionsTitle := Font.New (\"Algerian:35\")\nvar shouldPlay : boolean := true\nforward proc game\nfor i : 0 .. 100  \n    x (i) := 0\nend for\nproc pauseProgram\n    var reply : string (1)\n    getch (reply)\nend pauseProgram\nprocess backgroundMusic\n    loop\n\texit when shouldPlay = false\n\tMusic.PlayFile (\"music.MP3\")\n    end loop\nend backgroundMusic\nproc winner\n    cls\n    win := \"N\"\n    for i : 1 .. 100\n\tx (i) := 0\n    end for\n    drawfillbox (0, 0, 696, 400, black)\n    scoreRS := \"Red Wins: \" + intstr (scoreR)\n    scoreYS := \"Yellow Wins: \" + intstr (scoreY)\n    Font.Draw (\"\", 190, 320, title, 48)\n    Font.Draw (scoreRS, 0, 250, font1, 52)\n    Font.Draw (scoreYS, 0, 220, font1, 52)\n    Font.Draw (\"Press any Key to continue.\", 180, 100, subtitle, 12)\n    pauseProgram\n    game\nend winner\nbody proc game\n    for i : 1 .. 100\n\tx (i) := 0\n    end for\n    cls\n    drawfillbox (0, 0, 700, 400, black)%Grid\n    Draw.ThickLine (0, 400, 0, 0, 5, 48)\n    Draw.ThickLine (696, 400, 696, 0, 5, 48)\n    Draw.ThickLine (3, 0, 696, 0, 5, 48)\n    Draw.ThickLine (696, 0, 696, 70, 5, 48)\n    Draw.ThickLine (610, 70, 87, 70, 5, 48)\n    Draw.ThickLine (87, 70, 87, 400, 5, 48)\n    Draw.ThickLine (87, 400, 0, 400, 5, 48)\n    Draw.ThickLine (173, 70, 173, 400, 5, 48)\n    Draw.ThickLine (260, 70, 260, 400, 5, 48)\n    Draw.ThickLine (347, 70, 347, 400, 5, 48)\n    Draw.ThickLine (435, 70, 435, 400, 5, 48)\n    Draw.ThickLine (521, 70, 521, 400, 5, 48)\n    Draw.ThickLine (609, 70, 609, 400, 5, 48)\n    Draw.ThickLine (0, 70, 87, 70, 2, 11) %NEW!\n    Draw.ThickLine (0, 120, 87, 120, 2, 11)\n    Draw.ThickLine (0, 170, 87, 170, 2, 11)\n    Draw.ThickLine (0, 220, 87, 220, 2, 11)\n    Draw.ThickLine (0, 270, 87, 270, 2, 11)\n    Draw.ThickLine (0, 320, 87, 320, 2, 11)\n    Draw.ThickLine (0, 370, 87, 370, 2, 11)\n    Draw.ThickLine (609, 70, 696, 70, 2, 11) %Part 2\n    Draw.ThickLine (609, 120, 696, 120, 2, 11)\n    Draw.ThickLine (609, 170, 696, 170, 2, 11)\n    Draw.ThickLine (609, 220, 696, 220, 2, 11)\n    Draw.ThickLine (609, 270, 696, 270, 2, 11)\n    Draw.ThickLine (609, 320, 696, 320, 2, 11)\n    Draw.ThickLine (609, 370, 696, 370, 2, 11)\n    loop\n\tif colourP = \"Yellow\" then\n\t    if button = 1 then\n\t\tif (rangeX >= 87 and rangeX <= 173) then\n\t\t    %Drop on right corner (now verifies height)\n\t\t    if x (1) = 0 then\n\t\t\tx (1) := 1\n\t\t\tloopFor := 300\n\t\t    elsif x (2) = 0 then\n\t\t\tx (2) := 1\n\t\t\tloopFor := 250\n\t\t    elsif x (3) = 0 then\n\t\t\tx (3) := 1\n\t\t\tloopFor := 200\n\t\t    elsif x (4) = 0 then\n\t\t\tx (4) := 1\n\t\t\tloopFor := 150\n\t\t    elsif x (5) = 0 then\n\t\t\tx (5) := 1\n\t\t\tloopFor := 100\n\t\t    elsif x (6) = 0 then\n\t\t\tx (6) := 1\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (135, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (135, 400 - i, 25, 25, yellow)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\telsif (rangeX >= 174 and rangeX <= 260) then\n\t\t    if x (7) = 0 then %Drop on right corner (now verifies height)\n\t\t\tx (7) := 1\n\t\t\tloopFor := 300\n\t\t    elsif x (8) = 0 then\n\t\t\tx (8) := 1\n\t\t\tloopFor := 250\n\t\t    elsif x (9) = 0 then\n\t\t\tx (9) := 1\n\t\t\tloopFor := 200\n\t\t    elsif x (10) = 0 then\n\t\t\tx (10) := 1\n\t\t\tloopFor := 150\n\t\t    elsif x (11) = 0 then\n\t\t\tx (11) := 1\n\t\t\tloopFor := 100\n\t\t    elsif x (12) = 0 then\n\t\t\tx (12) := 1\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (222, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (222, 400 - i, 25, 25, yellow)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\telsif (rangeX >= 261 and rangeX <= 347) then\n\t\t    if x (13) = 0 then%Drop on right corner (now verifies height)\n\t\t\tx (13) := 1\n\t\t\tloopFor := 300\n\t\t    elsif x (14) = 0 then\n\t\t\tx (14) := 1\n\t\t\tloopFor := 250\n\t\t    elsif x (15) = 0 then\n\t\t\tx (15) := 1\n\t\t\tloopFor := 200\n\t\t    elsif x (16) = 0 then\n\t\t\tx (16) := 1\n\t\t\tloopFor := 150\n\t\t    elsif x (17) = 0 then\n\t\t\tx (17) := 1\n\t\t\tloopFor := 100\n\t\t    elsif x (18) = 0 then\n\t\t\tx (18) := 1\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t\tsamePlayer := true\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (309, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (309, 400 - i, 25, 25, yellow)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\telsif (rangeX >= 348 and rangeX <= 434) then\n\t\t    if x (19) = 0 then %Drop on right corner (now verifies height)\n\t\t\tx (19) := 1\n\t\t\tloopFor := 300\n\t\t    elsif x (20) = 0 then\n\t\t\tx (20) := 1\n\t\t\tloopFor := 250\n\t\t    elsif x (21) = 0 then\n\t\t\tx (21) := 1\n\t\t\tloopFor := 200\n\t\t    elsif x (22) = 0 then\n\t\t\tx (22) := 1\n\t\t\tloopFor := 150\n\t\t    elsif x (23) = 0 then\n\t\t\tx (23) := 1\n\t\t\tloopFor := 100\n\t\t    elsif x (24) = 0 then\n\t\t\tx (24) := 1\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (396, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (396, 400 - i, 25, 25, yellow)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\telsif (rangeX >= 435 and rangeX <= 521) then\n\t\t    if x (25) = 0 then %Drop on right corner (now verifies height)\n\t\t\tx (25) := 1\n\t\t\tloopFor := 300\n\t\t    elsif x (26) = 0 then\n\t\t\tx (26) := 1\n\t\t\tloopFor := 250\n\t\t    elsif x (27) = 0 then\n\t\t\tx (27) := 1\n\t\t\tloopFor := 200\n\t\t    elsif x (28) = 0 then\n\t\t\tx (28) := 1\n\t\t\tloopFor := 150\n\t\t    elsif x (29) = 0 then\n\t\t\tx (29) := 1\n\t\t\tloopFor := 100\n\t\t    elsif x (30) = 0 then\n\t\t\tx (30) := 1\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (483, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (483, 400 - i, 25, 25, yellow)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\telsif (rangeX >= 522 and rangeX <= 609) then\n\t\t    if x (31) = 0 then %Drop on right corner (now verifies height)\n\t\t\tx (31) := 1\n\t\t\tloopFor := 300\n\t\t    elsif x (32) = 0 then\n\t\t\tx (32) := 1\n\t\t\tloopFor := 250\n\t\t    elsif x (33) = 0 then\n\t\t\tx (33) := 1\n\t\t\tloopFor := 200\n\t\t    elsif x (34) = 0 then\n\t\t\tx (34) := 1\n\t\t\tloopFor := 150\n\t\t    elsif x (35) = 0 then\n\t\t\tx (35) := 1\n\t\t\tloopFor := 100\n\t\t    elsif x (36) = 0 then\n\t\t\tx (36) := 1\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (570, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (570, 400 - i, 25, 25, yellow)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\tend if\n\t\tif samePlayer = true then\n\t\t    samePlayer := false\n\t\telse\n\t\t    colourP := \"Red\"\n\t\tend if\n\t    end if\n\telse\n\t    if button = 1 then\n\t\tif (rangeX >= 87 and rangeX <= 173) then\n\t\t    if x (1) = 0 then %Drop on right corner (now verifies height)\n\t\t\tx (1) := 2\n\t\t\tloopFor := 300\n\t\t    elsif x (2) = 0 then\n\t\t\tx (2) := 2\n\t\t\tloopFor := 250\n\t\t    elsif x (3) = 0 then\n\t\t\tx (3) := 2\n\t\t\tloopFor := 200\n\t\t    elsif x (4) = 0 then\n\t\t\tx (4) := 2\n\t\t\tloopFor := 150\n\t\t    elsif x (5) = 0 then\n\t\t\tx (5) := 2\n\t\t\tloopFor := 100\n\t\t    elsif x (6) = 0 then\n\t\t\tx (6) := 2\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (135, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (135, 400 - i, 25, 25, 12)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\telsif (rangeX >= 174 and rangeX <= 260) then\n\t\t    if x (7) = 0 then %Drop on right corner (now verifies height)\n\t\t\tx (7) := 2\n\t\t\tloopFor := 300\n\t\t    elsif x (8) = 0 then\n\t\t\tx (8) := 2\n\t\t\tloopFor := 250\n\t\t    elsif x (9) = 0 then\n\t\t\tx (9) := 2\n\t\t\tloopFor := 200\n\t\t    elsif x (10) = 0 then\n\t\t\tx (10) := 2\n\t\t\tloopFor := 150\n\t\t    elsif x (11) = 0 then\n\t\t\tx (11) := 2\n\t\t\tloopFor := 100\n\t\t    elsif x (12) = 0 then\n\t\t\tx (12) := 2\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (222, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (222, 400 - i, 25, 25, 12)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\telsif (rangeX >= 261 and rangeX <= 347) then\n\t\t    if x (13) = 0 then %Drop on right corner (now verifies height)\n\t\t\tx (13) := 2\n\t\t\tloopFor := 300\n\t\t    elsif x (14) = 0 then\n\t\t\tx (14) := 2\n\t\t\tloopFor := 250\n\t\t    elsif x (15) = 0 then\n\t\t\tx (15) := 2\n\t\t\tloopFor := 200\n\t\t    elsif x (16) = 0 then\n\t\t\tx (16) := 2\n\t\t\tloopFor := 150\n\t\t    elsif x (17) = 0 then\n\t\t\tx (17) := 2\n\t\t\tloopFor := 100\n\t\t    elsif x (18) = 0 then\n\t\t\tx (18) := 2\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tsamePlayer := true\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (309, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (309, 400 - i, 25, 25, 12)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\telsif (rangeX >= 348 and rangeX <= 434) then\n\t\t    %Drop on right corner (now verifies height)\n\t\t    if x (19) = 0 then\n\t\t\tx (19) := 2\n\t\t\tloopFor := 300\n\t\t    elsif x (20) = 0 then\n\t\t\tx (20) := 2\n\t\t\tloopFor := 250\n\t\t    elsif x (21) = 0 then\n\t\t\tx (21) := 2\n\t\t\tloopFor := 200\n\t\t    elsif x (22) = 0 then\n\t\t\tx (22) := 2\n\t\t\tloopFor := 150\n\t\t    elsif x (23) = 0 then\n\t\t\tx (23) := 2\n\t\t\tloopFor := 100\n\t\t    elsif x (24) = 0 then\n\t\t\tx (24) := 2\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (396, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (396, 400 - i, 25, 25, 12)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\telsif (rangeX >= 435 and rangeX <= 521) then\n\t\t    %Drop on right corner (now verifies height)\n\t\t    if x (25) = 0 then\n\t\t\tx (25) := 2\n\t\t\tloopFor := 300\n\t\t    elsif x (26) = 0 then\n\t\t\tx (26) := 2\n\t\t\tloopFor := 250\n\t\t    elsif x (27) = 0 then\n\t\t\tx (27) := 2\n\t\t\tloopFor := 200\n\t\t    elsif x (28) = 0 then\n\t\t\tx (28) := 2\n\t\t\tloopFor := 150\n\t\t    elsif x (29) = 0 then\n\t\t\tx (29) := 2\n\t\t\tloopFor := 100\n\t\t    elsif x (30) = 0 then\n\t\t\tx (30) := 2\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (483, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (483, 400 - i, 25, 25, 12)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\telsif (rangeX >= 522 and rangeX <= 609) then\n\t\t    %Drop on right corner (now verifies height)\n\t\t    if x (31) = 0 then\n\t\t\tx (31) := 2\n\t\t\tloopFor := 300\n\t\t    elsif x (32) = 0 then\n\t\t\tx (32) := 2\n\t\t\tloopFor := 250\n\t\t    elsif x (33) = 0 then\n\t\t\tx (33) := 2\n\t\t\tloopFor := 200\n\t\t    elsif x (34) = 0 then\n\t\t\tx (34) := 2\n\t\t\tloopFor := 150\n\t\t    elsif x (35) = 0 then\n\t\t\tx (35) := 2\n\t\t\tloopFor := 100\n\t\t    elsif x (36) = 0 then\n\t\t\tx (36) := 2\n\t\t\tloopFor := 50\n\t\t    else\n\t\t\tfull := true\n\t\t\tsamePlayer := true\n\t\t    end if\n\t\t    if full = true then\n\t\t\tfull := false\n\t\t    else\n\t\t\tfor i : 1 .. loopFor\n\t\t\t    drawfilloval (570, 401 - i, 25, 25, black)\n\t\t\t    drawfilloval (570, 400 - i, 25, 25, 12)\n\t\t\t    delay (1)\n\t\t\tend for\n\t\t    end if\n\t\tend if\n\t\tif samePlayer then\n\t\t    samePlayer := false\n\t\telse\n\t\t    colourP := \"Yellow\"\n\t\tend if\n\n\t    end if\n\tend if\n\tmousewhere (rangeX, rangeY, button)\n\t%Detect Winner - Horizontal Verification\n\tfor i : 1 .. 18\n\t    if (x (i) = x (i + 6) and x (i) = x (i + 12) and x (i) = x (i + 18) and x (i) = 1) then\n\t\tscoreY := scoreY + 1\n\t\twin := \"Y\" %Red\n\t    elsif x (i) = x (i + 6) and x (i) = x (i + 12) and x (i) = x (i + 18) and x (i) = 2 then\n\t\tscoreR := scoreR + 1\n\t\twin := \"Y\"\n\t\tif i > 6 then\n\t\t    if x (i - 6) = x (i) and x (i) = x (i + 6) and x (i) = x (i + 12) and x (i) = 2 then\n\t\t\tscoreR := scoreR + 1 %Yellow\n\t\t\twin := \"Y\"\n\t\t    elsif x (i - 6) = x (i) and x (i) = x (i + 6) and x (i) = x (i + 12) and x (i) = 1 then\n\t\t\tscoreY := scoreY + 1 %Yellow\n\t\t\twin := \"Y\"\n\t\t    end if\n\t\tend if\n\t    end if\n\tend for\n\t%Verticle Detection\n\tfor i : 1 .. 36 by 6\n\t    if (x (i) = x (i + 1) and x (i) = x (i + 2) and x (i) = x (i + 3) and x (i) = 1) then\n\t\tscoreY := scoreY + 1\n\t\twin := \"Y\"\n\t    elsif (x (i) = x (i + 1) and x (i) = x (i + 2) and x (i) = x (i + 3) and x (i) = 2) then\n\t\tscoreR := scoreR + 1\n\t\twin := \"Y\"\n\t    elsif (x (i + 1) = x (i + 2) and x (i + 1) = x (i + 3) and x (i + 1) = x (i + 4) and x (i + 1) = 1) then\n\t\tscoreY := scoreY + 1\n\t\twin := \"Y\"\n\t    elsif (x (i + 1) = x (i + 2) and x (i + 1) = x (i + 3) and x (i + 1) = x (i + 4) and x (i + 1) = 2) then\n\t\tscoreR := scoreR + 1\n\t\twin := \"Y\"\n\t    elsif (x (i + 2) = x (i + 3) and x (i + 2) = x (i + 4) and x (i + 2) = x (i + 5) and x (i + 2) = 1) then\n\t\tscoreY := scoreY + 1\n\t\twin := \"Y\"\n\t    elsif (x (i + 2) = x (i + 3) and x (i + 2) = x (i + 4) and x (i + 2) = x (i + 5) and x (i + 2) = 2) then\n\t\tscoreR := scoreR + 1\n\t\twin := \"Y\"\n\t    end if\n\tend for\n\tfor i : 1 .. 36 %Positive Slope\n\t    if (x (i) = x (i + 7) and x (i) = x (i + 14) and x (i) = x (i + 21) and x (i) = 1) then\n\t\tscoreY := scoreY + 1\n\t\twin := \"Y\"\n\t    elsif (x (i) = x (i + 7) and x (i) = x (i + 14) and x (i) = x (i + 21) and x (i) = 2) then\n\t\tscoreR := scoreR + 1\n\t\twin := \"Y\"\n\t    elsif (x (i + 1) = x (i + 8) and x (i + 1) = x (i + 15) and x (i + 1) = x (i + 22) and x (i + 1) = 2) then\n\t\tscoreR := scoreR + 1\n\t\twin := \"Y\"\n\t    elsif (x (i + 1) = x (i + 8) and x (i + 1) = x (i + 15) and x (i + 1) = x (i + 22) and x (i + 1) = 1) then\n\t\tscoreY := scoreY + 1\n\t\twin := \"Y\"\n\t    elsif (x (i + 2) = x (i + 9) and x (i + 2) = x (i + 16) and x (i + 2) = x (i + 23) and x (i + 2) = 1) then\n\t\tscoreY := scoreY + 1\n\t\twin := \"Y\"\n\t    elsif (x (i + 2) = x (i + 9) and x (i + 2) = x (i + 16) and x (i + 2) = x (i + 23) and x (i + 2) = 2) then\n\t\tscoreR := scoreR + 1\n\t\twin := \"Y\"\n\t    elsif (x (1) = x (7) and x (1) = x (13) and x (1) = x (19) and x (1) = 1) then\n\t\tscoreY := scoreY + 1\n\t\twin := \"Y\"\n\t    elsif (x (1) = x (7) and x (1) = x (13) and x (1) = x (19) and x (1) = 2) then\n\t\tscoreR := scoreR + 1\n\t\twin := \"Y\"\n\t    end if\n\tend for\n\tfor i : 1 .. 70 %Negative Slope\n\t    if i > 24 then\n\t\tif (x (i) = x (i - 5) and x (i) = x (i - 10) and x (i) = x (i - 15) and x (i) = 1) then\n\t\t    scoreY := scoreY + 1\n\t\t    win := \"Y\"\n\t\telsif (x (i) = x (i - 5) and x (i) = x (i - 10) and x (i) = x (i - 15) and x (i) = 2) then\n\t\t    scoreR := scoreR + 1\n\t\t    win := \"Y\"\n\t\telsif (x (i + 1) = x (i - 6) and x (i - 1) = x (i - 11) and x (i - 1) = x (i - 16) and x (i + 1) = 2) then\n\t\t    scoreR := scoreR + 1\n\t\t    win := \"Y\"\n\t\telsif (x (i + 1) = x (i - 6) and x (i - 1) = x (i - 11) and x (i - 1) = x (i - 16) and x (i + 1) = 1) then\n\t\t    scoreY := scoreY + 1\n\t\t    win := \"Y\"\n\t\telsif (x (i + 2) = x (i - 7) and x (i - 2) = x (i - 12) and x (i - 2) = x (i - 17) and x (i + 2) = 1) then\n\t\t    scoreY := scoreY + 1\n\t\t    win := \"Y\"\n\t\telsif (x (i + 2) = x (i - 7) and x (i + 2) = x (i - 12) and x (i - 2) = x (i - 17) and x (i + 2) = 2) then\n\t\t    scoreR := scoreR + 1\n\t\t    win := \"Y\"\n\t\tend if\n\t    end if\n\tend for\n\texit when win = \"Y\"\n    end loop\n    winner\nend game\nproc mainMenu\n    drawfillbox (0, 0, 696, 400, black)\n    Font.Draw (\"\", 295, 220, font1, 48)\n    Font.Draw (\"\", 251, 150, font1, 48)\n    Font.Draw (\"\", 305, 79, font1, 48)\n    loop\n\tFont.Draw (\"Connect4\", 155, 290, title, 52)\n\tMouse.Where (xValue, yValue, button)\n\tif xValue >= 215 and xValue <= 455 then\n\t    if yValue >= 200 and yValue <= 250 then\n\t\tif button = 1 then\n\t\t    delay (1000)\n\t\t    game\n\t\t    exit\n\t\tend if\n\t\tdrawbox (215, 200, 455, 250, 48)\n\t    else\n\t\tdrawbox (215, 200, 455, 250, black)\n\t    end if\n\t    if yValue >= 130 and yValue <= 180 then\n\t\tif button = 1 then\n\t\t    drawfillbox (0, 0, 696, 400, black)\n\t\t    Font.Draw (\"\", 70, 350, instructionsTitle, 48)\n\t\t    Font.Draw (\"\", 0, 320, font2, 52)\n\t\t    Font.Draw (\"\", 0, 280, font2, 52)\n\t\t    Font.Draw (\"\", 0, 240, font2, 52)\n\t\t    Font.Draw (\"\", 0, 200, font2, 52)\n\t\t    Font.Draw (\"\", 245, 75, font2, 14)\n\t\t    pauseProgram\n\t\t    mainMenu\n\t\tend if\n\t\tdrawbox (215, 130, 455, 180, 48)\n\t    else\n\t\tdrawbox (215, 130, 455, 180, black)\n\t    end if\n\t    if yValue >= 60 and yValue <= 110 then\n\t\tif button = 1 then\n\t\t    shouldPlay := false\n\t\t    exit\n\t\tend if\n\t\tdrawbox (215, 60, 455, 110, 48)\n\t    else\n\t\tdrawbox (215, 60, 455, 110, black)\n\t    end if\n\tend if\n\texit when button = 1\n    end loop\nend mainMenu\nproc intro\n    drawfillbox (0, 0, 696, 400, black)\n    for i : 1 .. 400\n\tdrawfillbox (0, 0, 696, 400, black)\n\tFont.Draw (\"\", 560 - i, 250, title, 48)\n\tFont.Draw (\"\", -255 + i, 220, subtitle, 52)\n\tdelay (4)\n    end for\n    for i : 1 .. 390\n\tdrawfilloval (40, 401 - i, 20, 20, black)\n\tdrawfilloval (656, 401 - i, 20, 20, black)\n\tdrawfilloval (656, 400 - i, 20, 20, 12)\n\tdrawfilloval (40, 400 - i, 20, 20, yellow)\n\tdelay (3)\n    end for\n    loop\n\tdrawfillbox (0, 0, 696, 100, black)\n\tFont.Draw (\"Press any Key to Continue.\", 169, 20, subtitle, 12)\n\tdelay (300)\n\tdrawfillbox (0, 0, 696, 100, black)\n\tFont.Draw (\"Press any Key to Continue.\", 169, 20, subtitle, 14)\n\tdelay (300)\n\texit when hasch\n    end loop\n    mainMenu\nend intro\n%fork backgroundMusic\nintro\n"
  },
  {
    "path": "src/test/resources/samples/langs/Turing/turing.t",
    "content": "% Accepts a number and calculates its factorial\n\nfunction factorial (n: int) : real\n\tif n = 0 then\n\t\tresult 1\n\telse\n\t\tresult n * factorial (n - 1)\n   end if\nend factorial\n\nvar n: int\nloop\n\tput \"Please input an integer: \" ..\n\tget n\n\texit when n >= 0\n\tput \"Input must be a non-negative integer.\"\nend loop\n\nput \"The factorial of \", n, \" is \", factorial (n)"
  },
  {
    "path": "src/test/resources/samples/langs/Turtle/gnd-record.ttl",
    "content": "@prefix foaf: <http://xmlns.com/foaf/0.1/> .\n@prefix owl: <http://www.w3.org/2002/07/owl#> .\n@prefix gndo: <http://d-nb.info/standards/elementset/gnd#> .\n@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n\n<http://d-nb.info/gnd/118514768>\n  a <http://d-nb.info/standards/elementset/gnd#Pseudonym> ;\n  foaf:page <http://de.wikipedia.org/wiki/Bertolt_Brecht> ;\n  owl:sameAs <http://dbpedia.org/resource/Bertolt_Brecht>, <http://viaf.org/viaf/2467372>, <http://www.filmportal.de/person/261E2D3A93D54134BF8AB5F21F0B2399> ;\n  gndo:gndIdentifier \"118514768\" ;\n  gndo:oldAuthorityNumber \"(DE-588)1022091077\", \"(DE-588a)118514768\", \"(DE-588a)141399074\", \"(DE-588a)139089691\", \"(DE-588a)141300248\", \"(DE-588a)136949541\", \"(DE-588a)134336232\", \"(DE-588a)12794544X\", \"(DE-588a)12736630X\", \"(DE-588a)12722811X\", \"(DE-588a)127228098\", \"(DE-588a)127228101\" ;\n  gndo:variantNameForThePerson \"Brêcht, Becton\", \"Brecht, Bert\", \"Brecht, Bertolʹ\", \"Brecht, Berthold\", \"Brecht, Bertholt\", \"Brecht, Bertold\", \"Brecht, B.\", \"Brecht, Eugen Berthold Friedrich\", \"Brecht, ...\", \"Brecht-Eisler, ...\", \"Becht, Bertolt\", \"Beituo'erte-Bulaixite\", \"Berchito, B.\", \"Brechtas, B.\", \"Brechts, Bertolts\", \"Brehd, Berd\", \"Breht, Bertolt\", \"Brehts, Bertolts\", \"Breḳhṭ, Bārṭolṭ\", \"Brekt, Berṭolṭ\", \"Brekṭ, Berṭōlṭ\", \"Breḳṭ, Berṭôlṭ\", \"Breśṭ, Berṭalṭa\", \"Breṣṭa, Barṭolṭa\", \"Brišt, Bartūlt\", \"Brišt, Birtūld\", \"Brišt, Birtult\", \"Buchito, Berutorutu\", \"Bulaixite, Beituo'erte\", \"Bulaixite, ...\", \"Burehito, Berutoruto\", \"Burehito, ...\", \"B. B.\", \"Larsen, Berthold\", \"Mprecht, Mpertolt\", \"Mprecht, ...\", \"Pulaihsit'ê, Peit'oĉrht'ê\", \"Pulaihsit'ê, ...\", \"Pŭrehit'ŭ, Peŏt'olt'ŭ\", \"Bŭrehit'ŭ, Beŏt'olt'ŭ\", \"برشت، برتولد\", \"브레히트, 베르톨트\", \"ברכט, ברטולט\", \"贝·布莱希特\", \"布莱希特, 贝\", \"ブレヒト, ベルトルト\" ;\n  gndo:variantNameEntityForThePerson [\n    gndo:forename \"Becton\" ;\n    gndo:surname \"Brêcht\"\n  ], [\n    gndo:forename \"Bert\" ;\n    gndo:surname \"Brecht\"\n  ], [\n    gndo:forename \"Bertolʹ\" ;\n    gndo:surname \"Brecht\"\n  ], [\n    gndo:forename \"Berthold\" ;\n    gndo:surname \"Brecht\"\n  ], [\n    gndo:forename \"Bertholt\" ;\n    gndo:surname \"Brecht\"\n  ], [\n    gndo:forename \"Bertold\" ;\n    gndo:surname \"Brecht\"\n  ], [\n    gndo:forename \"B.\" ;\n    gndo:surname \"Brecht\"\n  ], [\n    gndo:forename \"Eugen Berthold Friedrich\" ;\n    gndo:surname \"Brecht\"\n  ], [\n    gndo:forename \"...\" ;\n    gndo:surname \"Brecht\"\n  ], [\n    gndo:forename \"...\" ;\n    gndo:surname \"Brecht-Eisler\"\n  ], [\n    gndo:forename \"Bertolt\" ;\n    gndo:surname \"Becht\"\n  ], [ gndo:personalName \"Beituo'erte-Bulaixite\" ], [\n    gndo:forename \"B.\" ;\n    gndo:surname \"Berchito\"\n  ], [\n    gndo:forename \"B.\" ;\n    gndo:surname \"Brechtas\"\n  ], [\n    gndo:forename \"Bertolts\" ;\n    gndo:surname \"Brechts\"\n  ], [\n    gndo:forename \"Berd\" ;\n    gndo:surname \"Brehd\"\n  ], [\n    gndo:forename \"Bertolt\" ;\n    gndo:surname \"Breht\"\n  ], [\n    gndo:forename \"Bertolts\" ;\n    gndo:surname \"Brehts\"\n  ], [\n    gndo:forename \"Bārṭolṭ\" ;\n    gndo:surname \"Breḳhṭ\"\n  ], [\n    gndo:forename \"Berṭolṭ\" ;\n    gndo:surname \"Brekt\"\n  ], [\n    gndo:forename \"Berṭōlṭ\" ;\n    gndo:surname \"Brekṭ\"\n  ], [\n    gndo:forename \"Berṭôlṭ\" ;\n    gndo:surname \"Breḳṭ\"\n  ], [\n    gndo:forename \"Berṭalṭa\" ;\n    gndo:surname \"Breśṭ\"\n  ], [\n    gndo:forename \"Barṭolṭa\" ;\n    gndo:surname \"Breṣṭa\"\n  ], [\n    gndo:forename \"Bartūlt\" ;\n    gndo:surname \"Brišt\"\n  ], [\n    gndo:forename \"Birtūld\" ;\n    gndo:surname \"Brišt\"\n  ], [\n    gndo:forename \"Birtult\" ;\n    gndo:surname \"Brišt\"\n  ], [\n    gndo:forename \"Berutorutu\" ;\n    gndo:surname \"Buchito\"\n  ], [\n    gndo:forename \"Beituo'erte\" ;\n    gndo:surname \"Bulaixite\"\n  ], [\n    gndo:forename \"...\" ;\n    gndo:surname \"Bulaixite\"\n  ], [\n    gndo:forename \"Berutoruto\" ;\n    gndo:surname \"Burehito\"\n  ], [\n    gndo:forename \"...\" ;\n    gndo:surname \"Burehito\"\n  ], [ gndo:personalName \"B. B.\" ], [\n    gndo:forename \"Berthold\" ;\n    gndo:surname \"Larsen\"\n  ], [\n    gndo:forename \"Mpertolt\" ;\n    gndo:surname \"Mprecht\"\n  ], [\n    gndo:forename \"...\" ;\n    gndo:surname \"Mprecht\"\n  ], [\n    gndo:forename \"Peit'oĉrht'ê\" ;\n    gndo:surname \"Pulaihsit'ê\"\n  ], [\n    gndo:forename \"...\" ;\n    gndo:surname \"Pulaihsit'ê\"\n  ], [\n    gndo:forename \"Peŏt'olt'ŭ\" ;\n    gndo:surname \"Pŭrehit'ŭ\"\n  ], [\n    gndo:forename \"Beŏt'olt'ŭ\" ;\n    gndo:surname \"Bŭrehit'ŭ\"\n  ], [ gndo:personalName \"برشت، برتولد\" ], [\n    gndo:forename \"베르톨트\" ;\n    gndo:surname \"브레히트\"\n  ], [\n    gndo:forename \"ברטולט\" ;\n    gndo:surname \"ברכט\"\n  ], [ gndo:personalName \"贝·布莱希特\" ], [\n    gndo:forename \"贝\" ;\n    gndo:surname \"布莱希特\"\n  ], [\n    gndo:forename \"ベルトルト\" ;\n    gndo:surname \"ブレヒト\"\n  ] ;\n  gndo:preferredNameForThePerson \"Brecht, Bertolt\" ;\n  gndo:preferredNameEntityForThePerson [\n    gndo:forename \"Bertolt\" ;\n    gndo:surname \"Brecht\"\n  ] ;\n  gndo:familialRelationship <http://d-nb.info/gnd/121608557>, <http://d-nb.info/gnd/119056011>, <http://d-nb.info/gnd/118738348>, <http://d-nb.info/gnd/137070411>, <http://d-nb.info/gnd/118809849>, <http://d-nb.info/gnd/119027615>, <http://d-nb.info/gnd/118940163>, <http://d-nb.info/gnd/118630091>, <http://d-nb.info/gnd/123783283>, <http://d-nb.info/gnd/118940155>, <http://d-nb.info/gnd/110005449>, <http://d-nb.info/gnd/13612495X>, <http://d-nb.info/gnd/123757398>, <http://d-nb.info/gnd/1030496250>, <http://d-nb.info/gnd/1030496366> ;\n  gndo:professionOrOccupation <http://d-nb.info/gnd/4185053-1>, <http://d-nb.info/gnd/4140241-8>, <http://d-nb.info/gnd/4052154-0>, <http://d-nb.info/gnd/4168391-2>, <http://d-nb.info/gnd/4053309-8>, <http://d-nb.info/gnd/4049050-6>, <http://d-nb.info/gnd/4294338-3> ;\n  gndo:playedInstrument <http://d-nb.info/gnd/4057587-1> ;\n  gndo:gndSubjectCategory <http://d-nb.info/standards/vocab/gnd/gnd-sc#12.2p>, <http://d-nb.info/standards/vocab/gnd/gnd-sc#15.1p>, <http://d-nb.info/standards/vocab/gnd/gnd-sc#15.3p> ;\n  gndo:geographicAreaCode <http://d-nb.info/standards/vocab/gnd/geographic-area-code#XA-DE> ;\n  gndo:languageCode <http://id.loc.gov/vocabulary/iso639-2/ger> ;\n  gndo:placeOfBirth <http://d-nb.info/gnd/4003614-5> ;\n  gndo:placeOfDeath <http://d-nb.info/gnd/4005728-8> ;\n  gndo:placeOfExile <http://d-nb.info/gnd/4010877-6>, <http://d-nb.info/gnd/4077258-5> ;\n  gndo:gender <http://d-nb.info/standards/vocab/gnd/Gender#male> ;\n  gndo:dateOfBirth \"1898-02-10\"^^xsd:date ;\n  gndo:dateOfDeath \"1956-08-14\"^^xsd:date .\n\n<http://d-nb.info/gnd/121608557> gndo:preferredNameForThePerson \"Brecht, Berthold Friedrich\" .\n<http://d-nb.info/gnd/119056011> gndo:preferredNameForThePerson \"Banholzer, Paula\" .\n<http://d-nb.info/gnd/118738348> gndo:preferredNameForThePerson \"Neher, Carola\" .\n<http://d-nb.info/gnd/137070411> gndo:preferredNameForThePerson \"Banholzer, Frank\" .\n<http://d-nb.info/gnd/118809849> gndo:preferredNameForThePerson \"Berlau, Ruth\" .\n<http://d-nb.info/gnd/119027615> gndo:preferredNameForThePerson \"Steffin, Margarete\" .\n<http://d-nb.info/gnd/118940163> gndo:preferredNameForThePerson \"Zoff, Marianne\" .\n<http://d-nb.info/gnd/118630091> gndo:preferredNameForThePerson \"Weigel, Helene\" .\n<http://d-nb.info/gnd/123783283> gndo:preferredNameForThePerson \"Reichel, Käthe\" .\n<http://d-nb.info/gnd/118940155> gndo:preferredNameForThePerson \"Hiob, Hanne\" .\n<http://d-nb.info/gnd/110005449> gndo:preferredNameForThePerson \"Brecht, Stefan\" .\n<http://d-nb.info/gnd/13612495X> gndo:preferredNameForThePerson \"Brecht-Schall, Barbara\" .\n<http://d-nb.info/gnd/123757398> gndo:preferredNameForThePerson \"Schall, Ekkehard\" .\n<http://d-nb.info/gnd/1030496250> gndo:preferredNameForThePerson \"Brezing, Joseph Friedrich\" .\n<http://d-nb.info/gnd/1030496366> gndo:preferredNameForThePerson \"Brezing, Friederike\" .\n<http://d-nb.info/gnd/4185053-1> gndo:preferredNameForTheSubjectHeading \"Theaterregisseur\" .\n<http://d-nb.info/gnd/4140241-8> gndo:preferredNameForTheSubjectHeading \"Dramatiker\" .\n<http://d-nb.info/gnd/4052154-0> gndo:preferredNameForTheSubjectHeading \"Schauspieler\" .\n<http://d-nb.info/gnd/4168391-2> gndo:preferredNameForTheSubjectHeading \"Lyriker\" .\n<http://d-nb.info/gnd/4053309-8> gndo:preferredNameForTheSubjectHeading \"Schriftsteller\" .\n<http://d-nb.info/gnd/4049050-6> gndo:preferredNameForTheSubjectHeading \"Regisseur\" .\n<http://d-nb.info/gnd/4294338-3> gndo:preferredNameForTheSubjectHeading \"Drehbuchautor\" .\n<http://d-nb.info/gnd/4003614-5> gndo:preferredNameForThePlaceOrGeographicName \"Augsburg\" .\n<http://d-nb.info/gnd/4005728-8> gndo:preferredNameForThePlaceOrGeographicName \"Berlin\" .\n<http://d-nb.info/gnd/4010877-6> gndo:preferredNameForThePlaceOrGeographicName \"Dänemark\" .\n<http://d-nb.info/gnd/4077258-5> gndo:preferredNameForThePlaceOrGeographicName \"Schweden\" ."
  },
  {
    "path": "src/test/resources/samples/langs/Turtle/rdf-syntax-grammar.ttl",
    "content": "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n@prefix dc: <http://purl.org/dc/elements/1.1/> .\n@prefix ex: <http://example.org/stuff/1.0/> .\n\n<http://www.w3.org/TR/rdf-syntax-grammar>\n  dc:title \"RDF/XML Syntax Specification (Revised)\" ;\n  ex:editor [\n    ex:fullname \"Dave Beckett\";\n    ex:homePage <http://purl.org/net/dajobe/>\n  ] ."
  },
  {
    "path": "src/test/resources/samples/langs/Type Language/builtin.tl",
    "content": "// built-in types\nint#a8509bda ? = Int;\nlong ? = Long;\ndouble ? = Double;\nstring ? = String;\nnull = Null;\n\nvector {t:Type} # [ t ] = Vector t;\ncoupleInt {alpha:Type} int alpha = CoupleInt<alpha>;\ncoupleStr {gamma:Type} string gamma = CoupleStr gamma;\n\n/* The name of the type variable is irrelevant: \"gamma\" could be replaced with \"alpha\"\n  However, the combinator number will depend on the specific choice. */\n\nintHash {alpha:Type} vector<coupleInt<alpha>> = IntHash<alpha>;\nstrHash {alpha:Type} (vector (coupleStr alpha)) = StrHash alpha;\nintSortedHash {alpha:Type} intHash<alpha> = IntSortedHash<alpha>;\nstrSortedHash {alpha:Type} (strHash alpha) = StrSortedHash alpha;\n\n// custom types\npair x:Object y:Object = Pair;\ntriple x:Object y:Object z:Object = Triple;\n\nuser#d23c81a3 id:int first_name:string last_name:string = User;\nno_user#c67599d1 id:int = User;\ngroup id:int title:string last_name:string = Group;\nno_group = Group;\n\n---functions---\n\n// Maybe some built-in arithmetic functions; inverse quotes make \"identifiers\" out of arbitrary non-alphanumeric strings\n`+` Int Int = Int;\n`-` Int Int = Int;\n`+` Double Double = Double;\n// ...\n\n// API functions (aka RPC functions)\ngetUser#b0f732d5 int = User;\ngetUsers#2d84d5f5 (Vector int) = Vector User;"
  },
  {
    "path": "src/test/resources/samples/langs/Type Language/scheme.tl",
    "content": "// Core types (no need to gen)\n\n//vector#1cb5c415 {t:Type} # [ t ] = Vector t;\n\n///////////////////////////////\n/////////////////// Layer cons\n///////////////////////////////\n\n//invokeAfterMsg#cb9f372d msg_id:long query:!X = X;\n//invokeAfterMsgs#3dc4b4f0 msg_ids:Vector<long> query:!X = X;\n//invokeWithLayer1#53835315 query:!X = X;\n//invokeWithLayer2#289dd1f6 query:!X = X;\n//invokeWithLayer3#b7475268 query:!X = X;\n//invokeWithLayer4#dea0d430 query:!X = X;\n//invokeWithLayer5#417a57ae query:!X = X;\n//invokeWithLayer6#3a64d54d query:!X = X;\n//invokeWithLayer7#a5be56d3 query:!X = X;\n//invokeWithLayer8#e9abd9fd query:!X = X;\n//invokeWithLayer9#76715a63 query:!X = X;\n//invokeWithLayer10#39620c41 query:!X = X;\n//invokeWithLayer11#a6b88fdf query:!X = X;\n//invokeWithLayer12#dda60d3c query:!X = X;\n//invokeWithLayer13#427c8ea2 query:!X = X;\n//invokeWithLayer14#2b9b08fa query:!X = X;\n//invokeWithLayer15#b4418b64 query:!X = X;\n//invokeWithLayer16#cf5f0987 query:!X = X;\n//invokeWithLayer17#50858a19 query:!X = X;\n//invokeWithLayer18#1c900537 query:!X = X;\n//invokeWithLayer#da9b0d0d layer:int query:!X = X; // after 18 layer\n\n///////////////////////////////\n/// Authorization key creation\n///////////////////////////////\n\n\nresPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector<long> = ResPQ;\n\np_q_inner_data#83c95aec pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 = P_Q_inner_data;\n\nserver_DH_params_fail#79cb045d nonce:int128 server_nonce:int128 new_nonce_hash:int128 = Server_DH_Params;\nserver_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params;\n\nserver_DH_inner_data#b5890dba nonce:int128 server_nonce:int128 g:int dh_prime:string g_a:string server_time:int = Server_DH_inner_data;\n\nclient_DH_inner_data#6643b654 nonce:int128 server_nonce:int128 retry_id:long g_b:string = Client_DH_Inner_Data;\n\ndh_gen_ok#3bcbf734 nonce:int128 server_nonce:int128 new_nonce_hash1:int128 = Set_client_DH_params_answer;\ndh_gen_retry#46dc1fb9 nonce:int128 server_nonce:int128 new_nonce_hash2:int128 = Set_client_DH_params_answer;\ndh_gen_fail#a69dae02 nonce:int128 server_nonce:int128 new_nonce_hash3:int128 = Set_client_DH_params_answer;\n\ndestroy_auth_key_ok#f660e1d4 = DestroyAuthKeyRes;\ndestroy_auth_key_none#0a9f2259 = DestroyAuthKeyRes;\ndestroy_auth_key_fail#ea109b13 = DestroyAuthKeyRes;\n\n---functions---\n\nreq_pq#60469778 nonce:int128 = ResPQ;\n\nreq_DH_params#d712e4be nonce:int128 server_nonce:int128 p:string q:string public_key_fingerprint:long encrypted_data:string = Server_DH_Params;\n\nset_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:string = Set_client_DH_params_answer;\n\ndestroy_auth_key#d1435160 = DestroyAuthKeyRes;\n\n///////////////////////////////\n////////////// System messages\n///////////////////////////////\n\n---types---\n\nmsgs_ack#62d6b459 msg_ids:Vector<long> = MsgsAck;\n\nbad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int error_code:int = BadMsgNotification;\nbad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int error_code:int new_server_salt:long = BadMsgNotification;\n\nmsgs_state_req#da69fb52 msg_ids:Vector<long> = MsgsStateReq;\nmsgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;\nmsgs_all_info#8cc0d131 msg_ids:Vector<long> info:string = MsgsAllInfo;\n\nmsg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long bytes:int status:int = MsgDetailedInfo;\nmsg_new_detailed_info#809db6df answer_msg_id:long bytes:int status:int = MsgDetailedInfo;\n\nmsg_resend_req#7d861a08 msg_ids:Vector<long> = MsgResendReq;\n\n//rpc_result#f35c6d01 req_msg_id:long result:Object = RpcResult; // parsed manually\n\nrpc_error#2144ca19 error_code:int error_message:string = RpcError;\n\nrpc_answer_unknown#5e2ad36e = RpcDropAnswer;\nrpc_answer_dropped_running#cd78e586 = RpcDropAnswer;\nrpc_answer_dropped#a43ad8b7 msg_id:long seq_no:int bytes:int = RpcDropAnswer;\n\nfuture_salt#0949d9dc valid_since:int valid_until:int salt:long = FutureSalt;\nfuture_salts#ae500895 req_msg_id:long now:int salts:vector<future_salt> = FutureSalts;\n\npong#347773c5 msg_id:long ping_id:long = Pong;\n\ndestroy_session_ok#e22045fc session_id:long = DestroySessionRes;\ndestroy_session_none#62d350c9 session_id:long = DestroySessionRes;\n\nnew_session_created#9ec20908 first_msg_id:long unique_id:long server_salt:long = NewSession;\n\n//message msg_id:long seqno:int bytes:int body:Object = Message; // parsed manually\n//msg_container#73f1f8dc messages:vector<message> = MessageContainer; // parsed manually\n//msg_copy#e06046b2 orig_message:Message = MessageCopy; // parsed manually, not used - use msg_container\n//gzip_packed#3072cfa1 packed_data:string = Object; // parsed manually\n\nhttp_wait#9299359f max_delay:int wait_after:int max_wait:int = HttpWait;\n\n---functions---\n\nrpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;\n\nget_future_salts#b921bd04 num:int = FutureSalts;\n\nping#7abe77ec ping_id:long = Pong;\nping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong;\n\ndestroy_session#e7512126 session_id:long = DestroySessionRes;\n\ncontest.saveDeveloperInfo#9a5f6e95 vk_id:int name:string phone_number:string age:int city:string = Bool;\n\n///////////////////////////////\n///////// Main application API\n///////////////////////////////\n\n---types---\n\nboolFalse#bc799737 = Bool;\nboolTrue#997275b5 = Bool;\n\ntrue#3fedd339 = True;\n\nvector#1cb5c415 {t:Type} # [ t ] = Vector t;\n\nerror#c4b9f9bb code:int text:string = Error;\n\nnull#56730bcc = Null;\n\ninputPeerEmpty#7f3b18ea = InputPeer;\ninputPeerSelf#7da07ec9 = InputPeer;\ninputPeerChat#179be863 chat_id:int = InputPeer;\ninputPeerUser#7b8e7de6 user_id:int access_hash:long = InputPeer;\ninputPeerChannel#20adaef8 channel_id:int access_hash:long = InputPeer;\n\ninputUserEmpty#b98886cf = InputUser;\ninputUserSelf#f7c1b13f = InputUser;\ninputUser#d8292816 user_id:int access_hash:long = InputUser;\n\ninputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact;\n\ninputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile;\ninputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile;\n\ninputMediaEmpty#9664f57f = InputMedia;\ninputMediaUploadedPhoto#630c9af1 flags:# file:InputFile caption:string stickers:flags.0?Vector<InputDocument> = InputMedia;\ninputMediaPhoto#e9bfb4f3 id:InputPhoto caption:string = InputMedia;\ninputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia;\ninputMediaContact#a6e45987 phone_number:string first_name:string last_name:string = InputMedia;\ninputMediaUploadedDocument#d070f1e9 flags:# file:InputFile mime_type:string attributes:Vector<DocumentAttribute> caption:string stickers:flags.0?Vector<InputDocument> = InputMedia;\ninputMediaUploadedThumbDocument#50d88cae flags:# file:InputFile thumb:InputFile mime_type:string attributes:Vector<DocumentAttribute> caption:string stickers:flags.0?Vector<InputDocument> = InputMedia;\ninputMediaDocument#1a77f29c id:InputDocument caption:string = InputMedia;\ninputMediaVenue#2827a81a geo_point:InputGeoPoint title:string address:string provider:string venue_id:string = InputMedia;\ninputMediaGifExternal#4843b0fd url:string q:string = InputMedia;\ninputMediaPhotoExternal#b55f4f18 url:string caption:string = InputMedia;\ninputMediaDocumentExternal#e5e9607c url:string caption:string = InputMedia;\ninputMediaGame#d33f43f3 id:InputGame = InputMedia;\ninputMediaInvoice#92153685 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string start_param:string = InputMedia;\n\ninputChatPhotoEmpty#1ca48f57 = InputChatPhoto;\ninputChatUploadedPhoto#927c55b4 file:InputFile = InputChatPhoto;\ninputChatPhoto#8953ad37 id:InputPhoto = InputChatPhoto;\n\ninputGeoPointEmpty#e4c123d6 = InputGeoPoint;\ninputGeoPoint#f3b7acc9 lat:double long:double = InputGeoPoint;\n\ninputPhotoEmpty#1cd7bf0d = InputPhoto;\ninputPhoto#fb95c6c4 id:long access_hash:long = InputPhoto;\n\ninputFileLocation#14637196 volume_id:long local_id:int secret:long = InputFileLocation;\ninputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation;\ninputDocumentFileLocation#430f0724 id:long access_hash:long version:int = InputFileLocation;\n\ninputAppEvent#770656a8 time:double type:string peer:long data:string = InputAppEvent;\n\npeerUser#9db1bc6d user_id:int = Peer;\npeerChat#bad0e5bb chat_id:int = Peer;\npeerChannel#bddde532 channel_id:int = Peer;\n\nstorage.fileUnknown#aa963b05 = storage.FileType;\nstorage.filePartial#40bc6f52 = storage.FileType;\nstorage.fileJpeg#7efe0e = storage.FileType;\nstorage.fileGif#cae1aadf = storage.FileType;\nstorage.filePng#a4f63c0 = storage.FileType;\nstorage.filePdf#ae1e508d = storage.FileType;\nstorage.fileMp3#528a0677 = storage.FileType;\nstorage.fileMov#4b09ebbc = storage.FileType;\nstorage.fileMp4#b3cea0e4 = storage.FileType;\nstorage.fileWebp#1081464c = storage.FileType;\n\nfileLocationUnavailable#7c596b46 volume_id:long local_id:int secret:long = FileLocation;\nfileLocation#53d69076 dc_id:int volume_id:long local_id:int secret:long = FileLocation;\n\nuserEmpty#200250ba id:int = User;\nuser#2e13f4c3 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?string bot_inline_placeholder:flags.19?string lang_code:flags.22?string = User;\n\nuserProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;\nuserProfilePhoto#d559d8c8 photo_id:long photo_small:FileLocation photo_big:FileLocation = UserProfilePhoto;\n\nuserStatusEmpty#9d05049 = UserStatus;\nuserStatusOnline#edb93949 expires:int = UserStatus;\nuserStatusOffline#8c703f was_online:int = UserStatus;\nuserStatusRecently#e26f42f1 = UserStatus;\nuserStatusLastWeek#7bf09fc = UserStatus;\nuserStatusLastMonth#77ebc742 = UserStatus;\n\nchatEmpty#9ba2d800 id:int = Chat;\nchat#d91cdd54 flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true admins_enabled:flags.3?true admin:flags.4?true deactivated:flags.5?true id:int title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel = Chat;\nchatForbidden#7328bdb id:int title:string = Chat;\nchannel#a14dca52 flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true editor:flags.3?true moderator:flags.4?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true democracy:flags.10?true signatures:flags.11?true min:flags.12?true id:int access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int version:int restriction_reason:flags.9?string = Chat;\nchannelForbidden#8537784f flags:# broadcast:flags.5?true megagroup:flags.8?true id:int access_hash:long title:string = Chat;\n\nchatFull#2e02a614 id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> = ChatFull;\nchannelFull#c3d5512f flags:# can_view_participants:flags.3?true can_set_username:flags.6?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int = ChatFull;\n\nchatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant;\nchatParticipantCreator#da13538a user_id:int = ChatParticipant;\nchatParticipantAdmin#e2d6e436 user_id:int inviter_id:int date:int = ChatParticipant;\n\nchatParticipantsForbidden#fc900c2b flags:# chat_id:int self_participant:flags.0?ChatParticipant = ChatParticipants;\nchatParticipants#3f460fed chat_id:int participants:Vector<ChatParticipant> version:int = ChatParticipants;\n\nchatPhotoEmpty#37c1011c = ChatPhoto;\nchatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto;\n\nmessageEmpty#83e5de54 id:int = Message;\nmessage#c09be45f flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int = Message;\nmessageService#9e19a1f6 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer reply_to_msg_id:flags.3?int date:int action:MessageAction = Message;\n\nmessageMediaEmpty#3ded6320 = MessageMedia;\nmessageMediaPhoto#3d8ce53d photo:Photo caption:string = MessageMedia;\nmessageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;\nmessageMediaContact#5e7d2f39 phone_number:string first_name:string last_name:string user_id:int = MessageMedia;\nmessageMediaUnsupported#9f84f49e = MessageMedia;\nmessageMediaDocument#f3e02ea8 document:Document caption:string = MessageMedia;\nmessageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia;\nmessageMediaVenue#7912b71f geo:GeoPoint title:string address:string provider:string venue_id:string = MessageMedia;\nmessageMediaGame#fdb19008 game:Game = MessageMedia;\nmessageMediaInvoice#84551347 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument receipt_msg_id:flags.2?int currency:string total_amount:long start_param:string = MessageMedia;\n\nmessageActionEmpty#b6aef7b0 = MessageAction;\nmessageActionChatCreate#a6638b9a title:string users:Vector<int> = MessageAction;\nmessageActionChatEditTitle#b5a1ce5a title:string = MessageAction;\nmessageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction;\nmessageActionChatDeletePhoto#95e3fbef = MessageAction;\nmessageActionChatAddUser#488a7337 users:Vector<int> = MessageAction;\nmessageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction;\nmessageActionChatJoinedByLink#f89cf5e8 inviter_id:int = MessageAction;\nmessageActionChannelCreate#95d2ac92 title:string = MessageAction;\nmessageActionChatMigrateTo#51bdb021 channel_id:int = MessageAction;\nmessageActionChannelMigrateFrom#b055eaee title:string chat_id:int = MessageAction;\nmessageActionPinMessage#94bd38ed = MessageAction;\nmessageActionHistoryClear#9fbab604 = MessageAction;\nmessageActionGameScore#92a72876 game_id:long score:int = MessageAction;\nmessageActionPaymentSentMe#8f31b327 flags:# currency:string total_amount:long payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string charge:PaymentCharge = MessageAction;\nmessageActionPaymentSent#40699cd0 currency:string total_amount:long = MessageAction;\nmessageActionPhoneCall#80e11a7f flags:# call_id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = MessageAction;\n\ndialog#66ffba14 flags:# pinned:flags.2?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage = Dialog;\n\nphotoEmpty#2331b22d id:long = Photo;\nphoto#9288dd29 flags:# has_stickers:flags.0?true id:long access_hash:long date:int sizes:Vector<PhotoSize> = Photo;\n\nphotoSizeEmpty#e17e23c type:string = PhotoSize;\nphotoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize;\nphotoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize;\n\ngeoPointEmpty#1117dd5f = GeoPoint;\ngeoPoint#2049d70c long:double lat:double = GeoPoint;\n\nauth.checkedPhone#811ea28e phone_registered:Bool = auth.CheckedPhone;\n\nauth.sentCode#5e002502 flags:# phone_registered:flags.0?true type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode;\n\nauth.authorization#cd050916 flags:# tmp_sessions:flags.0?int user:User = auth.Authorization;\n\nauth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization;\n\ninputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer;\ninputNotifyUsers#193b4417 = InputNotifyPeer;\ninputNotifyChats#4a95e84e = InputNotifyPeer;\ninputNotifyAll#a429b886 = InputNotifyPeer;\n\ninputPeerNotifyEventsEmpty#f03064d8 = InputPeerNotifyEvents;\ninputPeerNotifyEventsAll#e86a2c74 = InputPeerNotifyEvents;\n\ninputPeerNotifySettings#38935eb2 flags:# show_previews:flags.0?true silent:flags.1?true mute_until:int sound:string = InputPeerNotifySettings;\n\npeerNotifyEventsEmpty#add53cb3 = PeerNotifyEvents;\npeerNotifyEventsAll#6d1ded88 = PeerNotifyEvents;\n\npeerNotifySettingsEmpty#70a68512 = PeerNotifySettings;\npeerNotifySettings#9acda4c0 flags:# show_previews:flags.0?true silent:flags.1?true mute_until:int sound:string = PeerNotifySettings;\n\npeerSettings#818426cd flags:# report_spam:flags.0?true = PeerSettings;\n\nwallPaper#ccb03657 id:int title:string sizes:Vector<PhotoSize> color:int = WallPaper;\nwallPaperSolid#63117f24 id:int title:string bg_color:int color:int = WallPaper;\n\ninputReportReasonSpam#58dbcab8 = ReportReason;\ninputReportReasonViolence#1e22c78d = ReportReason;\ninputReportReasonPornography#2e59d922 = ReportReason;\ninputReportReasonOther#e1746d0a text:string = ReportReason;\n\nuserFull#f220f3f flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true user:User about:flags.1?string link:contacts.Link profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo common_chats_count:int = UserFull;\n\ncontact#f911c994 user_id:int mutual:Bool = Contact;\n\nimportedContact#d0028438 user_id:int client_id:long = ImportedContact;\n\ncontactBlocked#561bc879 user_id:int date:int = ContactBlocked;\n\ncontactStatus#d3680c61 user_id:int status:UserStatus = ContactStatus;\n\ncontacts.link#3ace484c my_link:ContactLink foreign_link:ContactLink user:User = contacts.Link;\n\ncontacts.contactsNotModified#b74ba9d2 = contacts.Contacts;\ncontacts.contacts#6f8b8cb2 contacts:Vector<Contact> users:Vector<User> = contacts.Contacts;\n\ncontacts.importedContacts#ad524315 imported:Vector<ImportedContact> retry_contacts:Vector<long> users:Vector<User> = contacts.ImportedContacts;\n\ncontacts.blocked#1c138d15 blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;\ncontacts.blockedSlice#900802a1 count:int blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;\n\nmessages.dialogs#15ba6c40 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;\nmessages.dialogsSlice#71e094f3 count:int dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;\n\nmessages.messages#8c718e87 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;\nmessages.messagesSlice#b446ae3 count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;\nmessages.channelMessages#99262e37 flags:# pts:int count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;\n\nmessages.chats#64ff9fd5 chats:Vector<Chat> = messages.Chats;\nmessages.chatsSlice#9cd81144 count:int chats:Vector<Chat> = messages.Chats;\n\nmessages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector<Chat> users:Vector<User> = messages.ChatFull;\n\nmessages.affectedHistory#b45c69d1 pts:int pts_count:int offset:int = messages.AffectedHistory;\n\ninputMessagesFilterEmpty#57e2f66c = MessagesFilter;\ninputMessagesFilterPhotos#9609a51c = MessagesFilter;\ninputMessagesFilterVideo#9fc00e65 = MessagesFilter;\ninputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter;\ninputMessagesFilterPhotoVideoDocuments#d95e73bb = MessagesFilter;\ninputMessagesFilterDocument#9eddf188 = MessagesFilter;\ninputMessagesFilterUrl#7ef0dd87 = MessagesFilter;\ninputMessagesFilterGif#ffc86587 = MessagesFilter;\ninputMessagesFilterVoice#50f5c392 = MessagesFilter;\ninputMessagesFilterMusic#3751b49e = MessagesFilter;\ninputMessagesFilterChatPhotos#3a20ecb8 = MessagesFilter;\ninputMessagesFilterPhoneCalls#80c99768 flags:# missed:flags.0?true = MessagesFilter;\ninputMessagesFilterRoundVoice#7a7c17a4 = MessagesFilter;\ninputMessagesFilterRoundVideo#b549da53 = MessagesFilter;\n\nupdateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update;\nupdateMessageID#4e90bfd6 id:int random_id:long = Update;\nupdateDeleteMessages#a20db0e5 messages:Vector<int> pts:int pts_count:int = Update;\nupdateUserTyping#5c486927 user_id:int action:SendMessageAction = Update;\nupdateChatUserTyping#9a65ea1f chat_id:int user_id:int action:SendMessageAction = Update;\nupdateChatParticipants#7761198 participants:ChatParticipants = Update;\nupdateUserStatus#1bfbd823 user_id:int status:UserStatus = Update;\nupdateUserName#a7332b73 user_id:int first_name:string last_name:string username:string = Update;\nupdateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update;\nupdateContactRegistered#2575bbb9 user_id:int date:int = Update;\nupdateContactLink#9d2e67c5 user_id:int my_link:ContactLink foreign_link:ContactLink = Update;\nupdateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update;\nupdateEncryptedChatTyping#1710f156 chat_id:int = Update;\nupdateEncryption#b4a2e88d chat:EncryptedChat date:int = Update;\nupdateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update;\nupdateChatParticipantAdd#ea4b0e5c chat_id:int user_id:int inviter_id:int date:int version:int = Update;\nupdateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update;\nupdateDcOptions#8e5e9873 dc_options:Vector<DcOption> = Update;\nupdateUserBlocked#80ece81a user_id:int blocked:Bool = Update;\nupdateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update;\nupdateServiceNotification#ebe46819 flags:# popup:flags.0?true inbox_date:flags.1?int type:string message:string media:MessageMedia entities:Vector<MessageEntity> = Update;\nupdatePrivacy#ee3b272a key:PrivacyKey rules:Vector<PrivacyRule> = Update;\nupdateUserPhone#12b9417b user_id:int phone:string = Update;\nupdateReadHistoryInbox#9961fd5c peer:Peer max_id:int pts:int pts_count:int = Update;\nupdateReadHistoryOutbox#2f2f21bf peer:Peer max_id:int pts:int pts_count:int = Update;\nupdateWebPage#7f891213 webpage:WebPage pts:int pts_count:int = Update;\nupdateReadMessagesContents#68c13933 messages:Vector<int> pts:int pts_count:int = Update;\nupdateChannelTooLong#eb0467fb flags:# channel_id:int pts:flags.0?int = Update;\nupdateChannel#b6d45656 channel_id:int = Update;\nupdateNewChannelMessage#62ba04d9 message:Message pts:int pts_count:int = Update;\nupdateReadChannelInbox#4214f37f channel_id:int max_id:int = Update;\nupdateDeleteChannelMessages#c37521c9 channel_id:int messages:Vector<int> pts:int pts_count:int = Update;\nupdateChannelMessageViews#98a12b4b channel_id:int id:int views:int = Update;\nupdateChatAdmins#6e947941 chat_id:int enabled:Bool version:int = Update;\nupdateChatParticipantAdmin#b6901959 chat_id:int user_id:int is_admin:Bool version:int = Update;\nupdateNewStickerSet#688a30aa stickerset:messages.StickerSet = Update;\nupdateStickerSetsOrder#bb2d201 flags:# masks:flags.0?true order:Vector<long> = Update;\nupdateStickerSets#43ae3dec = Update;\nupdateSavedGifs#9375341e = Update;\nupdateBotInlineQuery#54826690 flags:# query_id:long user_id:int query:string geo:flags.0?GeoPoint offset:string = Update;\nupdateBotInlineSend#e48f964 flags:# user_id:int query:string geo:flags.0?GeoPoint id:string msg_id:flags.1?InputBotInlineMessageID = Update;\nupdateEditChannelMessage#1b3f4df7 message:Message pts:int pts_count:int = Update;\nupdateChannelPinnedMessage#98592475 channel_id:int id:int = Update;\nupdateBotCallbackQuery#e73547e1 flags:# query_id:long user_id:int peer:Peer msg_id:int chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;\nupdateEditMessage#e40370a3 message:Message pts:int pts_count:int = Update;\nupdateInlineBotCallbackQuery#f9d27a5a flags:# query_id:long user_id:int msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;\nupdateReadChannelOutbox#25d6c9c7 channel_id:int max_id:int = Update;\nupdateDraftMessage#ee2bb969 peer:Peer draft:DraftMessage = Update;\nupdateReadFeaturedStickers#571d2742 = Update;\nupdateRecentStickers#9a422c20 = Update;\nupdateConfig#a229dd06 = Update;\nupdatePtsChanged#3354678f = Update;\nupdateChannelWebPage#40771900 channel_id:int webpage:WebPage pts:int pts_count:int = Update;\nupdateDialogPinned#d711a2cc flags:# pinned:flags.0?true peer:Peer = Update;\nupdatePinnedDialogs#d8caf68d flags:# order:flags.0?Vector<Peer> = Update;\nupdateBotWebhookJSON#8317c0c3 data:DataJSON = Update;\nupdateBotWebhookJSONQuery#9b9240a6 query_id:long data:DataJSON timeout:int = Update;\nupdateBotShippingQuery#e0cdc940 query_id:long user_id:int payload:bytes shipping_address:PostAddress = Update;\nupdateBotPrecheckoutQuery#5d2f3aa9 flags:# query_id:long user_id:int payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string currency:string total_amount:long = Update;\nupdatePhoneCall#ab0f6b1e phone_call:PhoneCall = Update;\n\nupdates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;\n\nupdates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference;\nupdates.difference#f49ca0 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> state:updates.State = updates.Difference;\nupdates.differenceSlice#a8fb1981 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> intermediate_state:updates.State = updates.Difference;\nupdates.differenceTooLong#4afe8f6d pts:int = updates.Difference;\n\nupdatesTooLong#e317af7e = Updates;\nupdateShortMessage#914fbf11 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int user_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int entities:flags.7?Vector<MessageEntity> = Updates;\nupdateShortChatMessage#16812688 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int from_id:int chat_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int entities:flags.7?Vector<MessageEntity> = Updates;\nupdateShort#78d4dec1 update:Update date:int = Updates;\nupdatesCombined#725b04c3 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq_start:int seq:int = Updates;\nupdates#74ae4240 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq:int = Updates;\nupdateShortSentMessage#11f1331c flags:# out:flags.1?true id:int pts:int pts_count:int date:int media:flags.9?MessageMedia entities:flags.7?Vector<MessageEntity> = Updates;\n\nphotos.photos#8dca6aa5 photos:Vector<Photo> users:Vector<User> = photos.Photos;\nphotos.photosSlice#15051f54 count:int photos:Vector<Photo> users:Vector<User> = photos.Photos;\n\nphotos.photo#20212ca8 photo:Photo users:Vector<User> = photos.Photo;\n\nupload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File;\nupload.fileCdnRedirect#1508485a dc_id:int file_token:bytes encryption_key:bytes encryption_iv:bytes = upload.File;\n\ndcOption#5d8c6cc flags:# ipv6:flags.0?true media_only:flags.1?true tcpo_only:flags.2?true cdn:flags.3?true id:int ip_address:string port:int = DcOption;\n\nconfig#cb601684 flags:# phonecalls_enabled:flags.1?true date:int expires:int test_mode:Bool this_dc:int dc_options:Vector<DcOption> chat_size_max:int megagroup_size_max:int forwarded_count_max:int online_update_period_ms:int offline_blur_timeout_ms:int offline_idle_timeout_ms:int online_cloud_timeout_ms:int notify_cloud_delay_ms:int notify_default_delay_ms:int chat_big_size:int push_chat_period_ms:int push_chat_limit:int saved_gifs_limit:int edit_time_limit:int rating_e_decay:int stickers_recent_limit:int tmp_sessions:flags.0?int pinned_dialogs_count_max:int call_receive_timeout_ms:int call_ring_timeout_ms:int call_connect_timeout_ms:int call_packet_timeout_ms:int me_url_prefix:string disabled_features:Vector<DisabledFeature> = Config;\n\nnearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc;\n\nhelp.appUpdate#8987f311 id:int critical:Bool url:string text:string = help.AppUpdate;\nhelp.noAppUpdate#c45a6536 = help.AppUpdate;\n\nhelp.inviteText#18cb9f78 message:string = help.InviteText;\n\nencryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat;\nencryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat;\nencryptedChatRequested#c878527e id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat;\nencryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat;\nencryptedChatDiscarded#13d6dd27 id:int = EncryptedChat;\n\ninputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat;\n\nencryptedFileEmpty#c21f497e = EncryptedFile;\nencryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile;\n\ninputEncryptedFileEmpty#1837c364 = InputEncryptedFile;\ninputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile;\ninputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile;\ninputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile;\n\nencryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage;\nencryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage;\n\nmessages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig;\nmessages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig;\n\nmessages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage;\nmessages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage;\n\ninputDocumentEmpty#72f0eaae = InputDocument;\ninputDocument#18798952 id:long access_hash:long = InputDocument;\n\ndocumentEmpty#36f8c871 id:long = Document;\ndocument#87232bc7 id:long access_hash:long date:int mime_type:string size:int thumb:PhotoSize dc_id:int version:int attributes:Vector<DocumentAttribute> = Document;\n\nhelp.support#17c6b5f6 phone_number:string user:User = help.Support;\n\nnotifyPeer#9fd40bd8 peer:Peer = NotifyPeer;\nnotifyUsers#b4c83b4c = NotifyPeer;\nnotifyChats#c007cec3 = NotifyPeer;\nnotifyAll#74d07c60 = NotifyPeer;\n\nsendMessageTypingAction#16bf744e = SendMessageAction;\nsendMessageCancelAction#fd5ec8f5 = SendMessageAction;\nsendMessageRecordVideoAction#a187d66f = SendMessageAction;\nsendMessageUploadVideoAction#e9763aec progress:int = SendMessageAction;\nsendMessageRecordAudioAction#d52f73f7 = SendMessageAction;\nsendMessageUploadAudioAction#f351d7ab progress:int = SendMessageAction;\nsendMessageUploadPhotoAction#d1d34a26 progress:int = SendMessageAction;\nsendMessageUploadDocumentAction#aa0cd9e4 progress:int = SendMessageAction;\nsendMessageGeoLocationAction#176f8ba1 = SendMessageAction;\nsendMessageChooseContactAction#628cbc6f = SendMessageAction;\nsendMessageGamePlayAction#dd6a8f48 = SendMessageAction;\nsendMessageRecordRoundAction#88f27fbc = SendMessageAction;\nsendMessageUploadRoundAction#243e1c66 progress:int = SendMessageAction;\n\ncontacts.found#1aa1f784 results:Vector<Peer> chats:Vector<Chat> users:Vector<User> = contacts.Found;\n\ninputPrivacyKeyStatusTimestamp#4f96cb18 = InputPrivacyKey;\ninputPrivacyKeyChatInvite#bdfb0426 = InputPrivacyKey;\ninputPrivacyKeyPhoneCall#fabadc5f = InputPrivacyKey;\n\nprivacyKeyStatusTimestamp#bc2eab30 = PrivacyKey;\nprivacyKeyChatInvite#500e6dfa = PrivacyKey;\nprivacyKeyPhoneCall#3d662b7b = PrivacyKey;\n\ninputPrivacyValueAllowContacts#d09e07b = InputPrivacyRule;\ninputPrivacyValueAllowAll#184b35ce = InputPrivacyRule;\ninputPrivacyValueAllowUsers#131cc67f users:Vector<InputUser> = InputPrivacyRule;\ninputPrivacyValueDisallowContacts#ba52007 = InputPrivacyRule;\ninputPrivacyValueDisallowAll#d66b66c9 = InputPrivacyRule;\ninputPrivacyValueDisallowUsers#90110467 users:Vector<InputUser> = InputPrivacyRule;\n\nprivacyValueAllowContacts#fffe1bac = PrivacyRule;\nprivacyValueAllowAll#65427b82 = PrivacyRule;\nprivacyValueAllowUsers#4d5bbe0c users:Vector<int> = PrivacyRule;\nprivacyValueDisallowContacts#f888fa1a = PrivacyRule;\nprivacyValueDisallowAll#8b73e763 = PrivacyRule;\nprivacyValueDisallowUsers#c7f49b7 users:Vector<int> = PrivacyRule;\n\naccount.privacyRules#554abb6f rules:Vector<PrivacyRule> users:Vector<User> = account.PrivacyRules;\n\naccountDaysTTL#b8d0afdf days:int = AccountDaysTTL;\n\ndocumentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute;\ndocumentAttributeAnimated#11b58939 = DocumentAttribute;\ndocumentAttributeSticker#6319d612 flags:# mask:flags.1?true alt:string stickerset:InputStickerSet mask_coords:flags.0?MaskCoords = DocumentAttribute;\ndocumentAttributeVideo#ef02ce6 flags:# round_message:flags.0?true duration:int w:int h:int = DocumentAttribute;\ndocumentAttributeAudio#9852f9c6 flags:# voice:flags.10?true duration:int title:flags.0?string performer:flags.1?string waveform:flags.2?bytes = DocumentAttribute;\ndocumentAttributeFilename#15590068 file_name:string = DocumentAttribute;\ndocumentAttributeHasStickers#9801d2f7 = DocumentAttribute;\n\nmessages.stickersNotModified#f1749a22 = messages.Stickers;\nmessages.stickers#8a8ecd32 hash:string stickers:Vector<Document> = messages.Stickers;\n\nstickerPack#12b299d4 emoticon:string documents:Vector<long> = StickerPack;\n\nmessages.allStickersNotModified#e86602c3 = messages.AllStickers;\nmessages.allStickers#edfd405f hash:int sets:Vector<StickerSet> = messages.AllStickers;\n\ndisabledFeature#ae636f24 feature:string description:string = DisabledFeature;\n\nmessages.affectedMessages#84d19185 pts:int pts_count:int = messages.AffectedMessages;\n\ncontactLinkUnknown#5f4f9247 = ContactLink;\ncontactLinkNone#feedd3ad = ContactLink;\ncontactLinkHasPhone#268f3f59 = ContactLink;\ncontactLinkContact#d502c2d0 = ContactLink;\n\nwebPageEmpty#eb1477e8 id:long = WebPage;\nwebPagePending#c586da1c id:long date:int = WebPage;\nwebPage#5f07b4bc flags:# id:long url:string display_url:string hash:int type:flags.0?string site_name:flags.1?string title:flags.2?string description:flags.3?string photo:flags.4?Photo embed_url:flags.5?string embed_type:flags.5?string embed_width:flags.6?int embed_height:flags.6?int duration:flags.7?int author:flags.8?string document:flags.9?Document cached_page:flags.10?Page = WebPage;\nwebPageNotModified#85849473 = WebPage;\n\nauthorization#7bf2e6f6 hash:long flags:int device_model:string platform:string system_version:string api_id:int app_name:string app_version:string date_created:int date_active:int ip:string country:string region:string = Authorization;\n\naccount.authorizations#1250abde authorizations:Vector<Authorization> = account.Authorizations;\n\naccount.noPassword#96dabc18 new_salt:bytes email_unconfirmed_pattern:string = account.Password;\naccount.password#7c18141c current_salt:bytes new_salt:bytes hint:string has_recovery:Bool email_unconfirmed_pattern:string = account.Password;\n\naccount.passwordSettings#b7b72ab3 email:string = account.PasswordSettings;\n\naccount.passwordInputSettings#86916deb flags:# new_salt:flags.0?bytes new_password_hash:flags.0?bytes hint:flags.0?string email:flags.1?string = account.PasswordInputSettings;\n\nauth.passwordRecovery#137948a5 email_pattern:string = auth.PasswordRecovery;\n\nreceivedNotifyMessage#a384b779 id:int flags:int = ReceivedNotifyMessage;\n\nchatInviteEmpty#69df3769 = ExportedChatInvite;\nchatInviteExported#fc2e05bc link:string = ExportedChatInvite;\n\nchatInviteAlready#5a686d7c chat:Chat = ChatInvite;\nchatInvite#db74f558 flags:# channel:flags.0?true broadcast:flags.1?true public:flags.2?true megagroup:flags.3?true title:string photo:ChatPhoto participants_count:int participants:flags.4?Vector<User> = ChatInvite;\n\ninputStickerSetEmpty#ffb62b95 = InputStickerSet;\ninputStickerSetID#9de7a269 id:long access_hash:long = InputStickerSet;\ninputStickerSetShortName#861cc8a0 short_name:string = InputStickerSet;\n\nstickerSet#cd303b41 flags:# installed:flags.0?true archived:flags.1?true official:flags.2?true masks:flags.3?true id:long access_hash:long title:string short_name:string count:int hash:int = StickerSet;\n\nmessages.stickerSet#b60a24a6 set:StickerSet packs:Vector<StickerPack> documents:Vector<Document> = messages.StickerSet;\n\nbotCommand#c27ac8c7 command:string description:string = BotCommand;\n\nbotInfo#98e81d3a user_id:int description:string commands:Vector<BotCommand> = BotInfo;\n\nkeyboardButton#a2fa4880 text:string = KeyboardButton;\nkeyboardButtonUrl#258aff05 text:string url:string = KeyboardButton;\nkeyboardButtonCallback#683a5e46 text:string data:bytes = KeyboardButton;\nkeyboardButtonRequestPhone#b16a6c29 text:string = KeyboardButton;\nkeyboardButtonRequestGeoLocation#fc796b3f text:string = KeyboardButton;\nkeyboardButtonSwitchInline#568a748 flags:# same_peer:flags.0?true text:string query:string = KeyboardButton;\nkeyboardButtonGame#50f41ccf text:string = KeyboardButton;\nkeyboardButtonBuy#afd93fbb text:string = KeyboardButton;\n\nkeyboardButtonRow#77608b83 buttons:Vector<KeyboardButton> = KeyboardButtonRow;\n\nreplyKeyboardHide#a03e5b85 flags:# selective:flags.2?true = ReplyMarkup;\nreplyKeyboardForceReply#f4108aa0 flags:# single_use:flags.1?true selective:flags.2?true = ReplyMarkup;\nreplyKeyboardMarkup#3502758c flags:# resize:flags.0?true single_use:flags.1?true selective:flags.2?true rows:Vector<KeyboardButtonRow> = ReplyMarkup;\nreplyInlineMarkup#48a30254 rows:Vector<KeyboardButtonRow> = ReplyMarkup;\n\nmessageEntityUnknown#bb92ba95 offset:int length:int = MessageEntity;\nmessageEntityMention#fa04579d offset:int length:int = MessageEntity;\nmessageEntityHashtag#6f635b0d offset:int length:int = MessageEntity;\nmessageEntityBotCommand#6cef8ac7 offset:int length:int = MessageEntity;\nmessageEntityUrl#6ed02538 offset:int length:int = MessageEntity;\nmessageEntityEmail#64e475c2 offset:int length:int = MessageEntity;\nmessageEntityBold#bd610bc9 offset:int length:int = MessageEntity;\nmessageEntityItalic#826f8b60 offset:int length:int = MessageEntity;\nmessageEntityCode#28a20571 offset:int length:int = MessageEntity;\nmessageEntityPre#73924be0 offset:int length:int language:string = MessageEntity;\nmessageEntityTextUrl#76a6d327 offset:int length:int url:string = MessageEntity;\nmessageEntityMentionName#352dca58 offset:int length:int user_id:int = MessageEntity;\ninputMessageEntityMentionName#208e68c9 offset:int length:int user_id:InputUser = MessageEntity;\n\ninputChannelEmpty#ee8c1e86 = InputChannel;\ninputChannel#afeb712e channel_id:int access_hash:long = InputChannel;\n\ncontacts.resolvedPeer#7f077ad9 peer:Peer chats:Vector<Chat> users:Vector<User> = contacts.ResolvedPeer;\n\nmessageRange#ae30253 min_id:int max_id:int = MessageRange;\n\nupdates.channelDifferenceEmpty#3e11affb flags:# final:flags.0?true pts:int timeout:flags.1?int = updates.ChannelDifference;\nupdates.channelDifferenceTooLong#410dee07 flags:# final:flags.0?true pts:int timeout:flags.1?int top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = updates.ChannelDifference;\nupdates.channelDifference#2064674e flags:# final:flags.0?true pts:int timeout:flags.1?int new_messages:Vector<Message> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> = updates.ChannelDifference;\n\nchannelMessagesFilterEmpty#94d42ee7 = ChannelMessagesFilter;\nchannelMessagesFilter#cd77d957 flags:# exclude_new_messages:flags.1?true ranges:Vector<MessageRange> = ChannelMessagesFilter;\n\nchannelParticipant#15ebac1d user_id:int date:int = ChannelParticipant;\nchannelParticipantSelf#a3289a6d user_id:int inviter_id:int date:int = ChannelParticipant;\nchannelParticipantModerator#91057fef user_id:int inviter_id:int date:int = ChannelParticipant;\nchannelParticipantEditor#98192d61 user_id:int inviter_id:int date:int = ChannelParticipant;\nchannelParticipantKicked#8cc5e69a user_id:int kicked_by:int date:int = ChannelParticipant;\nchannelParticipantCreator#e3e2e1f9 user_id:int = ChannelParticipant;\n\nchannelParticipantsRecent#de3f3c79 = ChannelParticipantsFilter;\nchannelParticipantsAdmins#b4608969 = ChannelParticipantsFilter;\nchannelParticipantsKicked#3c37bb7a = ChannelParticipantsFilter;\nchannelParticipantsBots#b0d1865b = ChannelParticipantsFilter;\n\nchannelRoleEmpty#b285a0c6 = ChannelParticipantRole;\nchannelRoleModerator#9618d975 = ChannelParticipantRole;\nchannelRoleEditor#820bfe8c = ChannelParticipantRole;\n\nchannels.channelParticipants#f56ee2a8 count:int participants:Vector<ChannelParticipant> users:Vector<User> = channels.ChannelParticipants;\n\nchannels.channelParticipant#d0d9b163 participant:ChannelParticipant users:Vector<User> = channels.ChannelParticipant;\n\nhelp.termsOfService#f1ee3e90 text:string = help.TermsOfService;\n\nfoundGif#162ecc1f url:string thumb_url:string content_url:string content_type:string w:int h:int = FoundGif;\nfoundGifCached#9c750409 url:string photo:Photo document:Document = FoundGif;\n\nmessages.foundGifs#450a1c0a next_offset:int results:Vector<FoundGif> = messages.FoundGifs;\n\nmessages.savedGifsNotModified#e8025ca2 = messages.SavedGifs;\nmessages.savedGifs#2e0709a5 hash:int gifs:Vector<Document> = messages.SavedGifs;\n\ninputBotInlineMessageMediaAuto#292fed13 flags:# caption:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageText#3dcd7a87 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector<MessageEntity> reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageMediaGeo#f4a59de1 flags:# geo_point:InputGeoPoint reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageMediaVenue#aaafadc8 flags:# geo_point:InputGeoPoint title:string address:string provider:string venue_id:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageMediaContact#2daf01a7 flags:# phone_number:string first_name:string last_name:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageGame#4b425864 flags:# reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\n\ninputBotInlineResult#2cbbe15a flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb_url:flags.4?string content_url:flags.5?string content_type:flags.5?string w:flags.6?int h:flags.6?int duration:flags.7?int send_message:InputBotInlineMessage = InputBotInlineResult;\ninputBotInlineResultPhoto#a8d864a7 id:string type:string photo:InputPhoto send_message:InputBotInlineMessage = InputBotInlineResult;\ninputBotInlineResultDocument#fff8fdc4 flags:# id:string type:string title:flags.1?string description:flags.2?string document:InputDocument send_message:InputBotInlineMessage = InputBotInlineResult;\ninputBotInlineResultGame#4fa417f2 id:string short_name:string send_message:InputBotInlineMessage = InputBotInlineResult;\n\nbotInlineMessageMediaAuto#a74b15b flags:# caption:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageText#8c7f65e2 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector<MessageEntity> reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageMediaGeo#3a8fd8b8 flags:# geo:GeoPoint reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageMediaVenue#4366232e flags:# geo:GeoPoint title:string address:string provider:string venue_id:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageMediaContact#35edb4d4 flags:# phone_number:string first_name:string last_name:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\n\nbotInlineResult#9bebaeb9 flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb_url:flags.4?string content_url:flags.5?string content_type:flags.5?string w:flags.6?int h:flags.6?int duration:flags.7?int send_message:BotInlineMessage = BotInlineResult;\nbotInlineMediaResult#17db940b flags:# id:string type:string photo:flags.0?Photo document:flags.1?Document title:flags.2?string description:flags.3?string send_message:BotInlineMessage = BotInlineResult;\n\nmessages.botResults#ccd3563d flags:# gallery:flags.0?true query_id:long next_offset:flags.1?string switch_pm:flags.2?InlineBotSwitchPM results:Vector<BotInlineResult> cache_time:int = messages.BotResults;\n\nexportedMessageLink#1f486803 link:string = ExportedMessageLink;\n\nmessageFwdHeader#c786ddcb flags:# from_id:flags.0?int date:int channel_id:flags.1?int channel_post:flags.2?int = MessageFwdHeader;\n\nauth.codeTypeSms#72a3158c = auth.CodeType;\nauth.codeTypeCall#741cd3e3 = auth.CodeType;\nauth.codeTypeFlashCall#226ccefb = auth.CodeType;\n\nauth.sentCodeTypeApp#3dbb5986 length:int = auth.SentCodeType;\nauth.sentCodeTypeSms#c000bba2 length:int = auth.SentCodeType;\nauth.sentCodeTypeCall#5353e5a7 length:int = auth.SentCodeType;\nauth.sentCodeTypeFlashCall#ab03c6d9 pattern:string = auth.SentCodeType;\n\nmessages.botCallbackAnswer#36585ea4 flags:# alert:flags.1?true has_url:flags.3?true message:flags.0?string url:flags.2?string cache_time:int = messages.BotCallbackAnswer;\n\nmessages.messageEditData#26b5dde6 flags:# caption:flags.0?true = messages.MessageEditData;\n\ninputBotInlineMessageID#890c3d89 dc_id:int id:long access_hash:long = InputBotInlineMessageID;\n\ninlineBotSwitchPM#3c20629f text:string start_param:string = InlineBotSwitchPM;\n\nmessages.peerDialogs#3371c354 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> state:updates.State = messages.PeerDialogs;\n\ntopPeer#edcdc05b peer:Peer rating:double = TopPeer;\n\ntopPeerCategoryBotsPM#ab661b5b = TopPeerCategory;\ntopPeerCategoryBotsInline#148677e2 = TopPeerCategory;\ntopPeerCategoryCorrespondents#637b7ed = TopPeerCategory;\ntopPeerCategoryGroups#bd17a14a = TopPeerCategory;\ntopPeerCategoryChannels#161d9628 = TopPeerCategory;\n\ntopPeerCategoryPeers#fb834291 category:TopPeerCategory count:int peers:Vector<TopPeer> = TopPeerCategoryPeers;\n\ncontacts.topPeersNotModified#de266ef5 = contacts.TopPeers;\ncontacts.topPeers#70b772a8 categories:Vector<TopPeerCategoryPeers> chats:Vector<Chat> users:Vector<User> = contacts.TopPeers;\n\ndraftMessageEmpty#ba4baec5 = DraftMessage;\ndraftMessage#fd8e711f flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int message:string entities:flags.3?Vector<MessageEntity> date:int = DraftMessage;\n\nmessages.featuredStickersNotModified#4ede3cf = messages.FeaturedStickers;\nmessages.featuredStickers#f89d88e5 hash:int sets:Vector<StickerSetCovered> unread:Vector<long> = messages.FeaturedStickers;\n\nmessages.recentStickersNotModified#b17f890 = messages.RecentStickers;\nmessages.recentStickers#5ce20970 hash:int stickers:Vector<Document> = messages.RecentStickers;\n\nmessages.archivedStickers#4fcba9c8 count:int sets:Vector<StickerSetCovered> = messages.ArchivedStickers;\n\nmessages.stickerSetInstallResultSuccess#38641628 = messages.StickerSetInstallResult;\nmessages.stickerSetInstallResultArchive#35e410a8 sets:Vector<StickerSetCovered> = messages.StickerSetInstallResult;\n\nstickerSetCovered#6410a5d2 set:StickerSet cover:Document = StickerSetCovered;\nstickerSetMultiCovered#3407e51b set:StickerSet covers:Vector<Document> = StickerSetCovered;\n\nmaskCoords#aed6dbb2 n:int x:double y:double zoom:double = MaskCoords;\n\ninputStickeredMediaPhoto#4a992157 id:InputPhoto = InputStickeredMedia;\ninputStickeredMediaDocument#438865b id:InputDocument = InputStickeredMedia;\n\ngame#bdf9653b flags:# id:long access_hash:long short_name:string title:string description:string photo:Photo document:flags.0?Document = Game;\n\ninputGameID#32c3e77 id:long access_hash:long = InputGame;\ninputGameShortName#c331e80a bot_id:InputUser short_name:string = InputGame;\n\nhighScore#58fffcd0 pos:int user_id:int score:int = HighScore;\n\nmessages.highScores#9a3bfd99 scores:Vector<HighScore> users:Vector<User> = messages.HighScores;\n\ntextEmpty#dc3d824f = RichText;\ntextPlain#744694e0 text:string = RichText;\ntextBold#6724abc4 text:RichText = RichText;\ntextItalic#d912a59c text:RichText = RichText;\ntextUnderline#c12622c4 text:RichText = RichText;\ntextStrike#9bf8bb95 text:RichText = RichText;\ntextFixed#6c3f19b9 text:RichText = RichText;\ntextUrl#3c2884c1 text:RichText url:string webpage_id:long = RichText;\ntextEmail#de5a0dd6 text:RichText email:string = RichText;\ntextConcat#7e6260d7 texts:Vector<RichText> = RichText;\n\npageBlockUnsupported#13567e8a = PageBlock;\npageBlockTitle#70abc3fd text:RichText = PageBlock;\npageBlockSubtitle#8ffa9a1f text:RichText = PageBlock;\npageBlockAuthorDate#baafe5e0 author:RichText published_date:int = PageBlock;\npageBlockHeader#bfd064ec text:RichText = PageBlock;\npageBlockSubheader#f12bb6e1 text:RichText = PageBlock;\npageBlockParagraph#467a0766 text:RichText = PageBlock;\npageBlockPreformatted#c070d93e text:RichText language:string = PageBlock;\npageBlockFooter#48870999 text:RichText = PageBlock;\npageBlockDivider#db20b188 = PageBlock;\npageBlockAnchor#ce0d37b0 name:string = PageBlock;\npageBlockList#3a58c7f4 ordered:Bool items:Vector<RichText> = PageBlock;\npageBlockBlockquote#263d7c26 text:RichText caption:RichText = PageBlock;\npageBlockPullquote#4f4456d3 text:RichText caption:RichText = PageBlock;\npageBlockPhoto#e9c69982 photo_id:long caption:RichText = PageBlock;\npageBlockVideo#d9d71866 flags:# autoplay:flags.0?true loop:flags.1?true video_id:long caption:RichText = PageBlock;\npageBlockCover#39f23300 cover:PageBlock = PageBlock;\npageBlockEmbed#cde200d1 flags:# full_width:flags.0?true allow_scrolling:flags.3?true url:flags.1?string html:flags.2?string poster_photo_id:flags.4?long w:int h:int caption:RichText = PageBlock;\npageBlockEmbedPost#292c7be9 url:string webpage_id:long author_photo_id:long author:string date:int blocks:Vector<PageBlock> caption:RichText = PageBlock;\npageBlockCollage#8b31c4f items:Vector<PageBlock> caption:RichText = PageBlock;\npageBlockSlideshow#130c8963 items:Vector<PageBlock> caption:RichText = PageBlock;\npageBlockChannel#ef1751b5 channel:Chat = PageBlock;\n\npagePart#8dee6c44 blocks:Vector<PageBlock> photos:Vector<Photo> videos:Vector<Document> = Page;\npageFull#d7a19d69 blocks:Vector<PageBlock> photos:Vector<Photo> videos:Vector<Document> = Page;\n\nphoneCallDiscardReasonMissed#85e42301 = PhoneCallDiscardReason;\nphoneCallDiscardReasonDisconnect#e095c1a0 = PhoneCallDiscardReason;\nphoneCallDiscardReasonHangup#57adc690 = PhoneCallDiscardReason;\nphoneCallDiscardReasonBusy#faf7e8c9 = PhoneCallDiscardReason;\n\ndataJSON#7d748d04 data:string = DataJSON;\n\nlabeledPrice#cb296bf8 label:string amount:long = LabeledPrice;\n\ninvoice#c30aa358 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true currency:string prices:Vector<LabeledPrice> = Invoice;\n\npaymentCharge#ea02c27e id:string provider_charge_id:string = PaymentCharge;\n\npostAddress#1e8caaeb street_line1:string street_line2:string city:string state:string country_iso2:string post_code:string = PostAddress;\n\npaymentRequestedInfo#909c3f94 flags:# name:flags.0?string phone:flags.1?string email:flags.2?string shipping_address:flags.3?PostAddress = PaymentRequestedInfo;\n\npaymentSavedCredentialsCard#cdc27a1f id:string title:string = PaymentSavedCredentials;\n\nwebDocument#c61acbd8 url:string access_hash:long size:int mime_type:string attributes:Vector<DocumentAttribute> dc_id:int = WebDocument;\n\ninputWebDocument#9bed434d url:string size:int mime_type:string attributes:Vector<DocumentAttribute> = InputWebDocument;\n\ninputWebFileLocation#c239d686 url:string access_hash:long = InputWebFileLocation;\n\nupload.webFile#21e753bc size:int mime_type:string file_type:storage.FileType mtime:int bytes:bytes = upload.WebFile;\n\npayments.paymentForm#3f56aea3 flags:# can_save_credentials:flags.2?true password_missing:flags.3?true bot_id:int invoice:Invoice provider_id:int url:string native_provider:flags.4?string native_params:flags.4?DataJSON saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?PaymentSavedCredentials users:Vector<User> = payments.PaymentForm;\n\npayments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector<ShippingOption> = payments.ValidatedRequestedInfo;\n\npayments.paymentResult#4e5f810d updates:Updates = payments.PaymentResult;\npayments.paymentVerficationNeeded#6b56b921 url:string = payments.PaymentResult;\n\npayments.paymentReceipt#500911e1 flags:# date:int bot_id:int invoice:Invoice provider_id:int info:flags.0?PaymentRequestedInfo shipping:flags.1?ShippingOption currency:string total_amount:long credentials_title:string users:Vector<User> = payments.PaymentReceipt;\n\npayments.savedInfo#fb8fe43c flags:# has_saved_credentials:flags.1?true saved_info:flags.0?PaymentRequestedInfo = payments.SavedInfo;\n\ninputPaymentCredentialsSaved#c10eb2cf id:string tmp_password:bytes = InputPaymentCredentials;\ninputPaymentCredentials#3417d728 flags:# save:flags.0?true data:DataJSON = InputPaymentCredentials;\n\naccount.tmpPassword#db64fd34 tmp_password:bytes valid_until:int = account.TmpPassword;\n\nshippingOption#b6213cdf id:string title:string prices:Vector<LabeledPrice> = ShippingOption;\n\ninputPhoneCall#1e36fded id:long access_hash:long = InputPhoneCall;\n\nphoneCallEmpty#5366c915 id:long = PhoneCall;\nphoneCallWaiting#1b8f4ad1 flags:# id:long access_hash:long date:int admin_id:int participant_id:int protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall;\nphoneCallRequested#83761ce4 id:long access_hash:long date:int admin_id:int participant_id:int g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall;\nphoneCallAccepted#6d003d3f id:long access_hash:long date:int admin_id:int participant_id:int g_b:bytes protocol:PhoneCallProtocol = PhoneCall;\nphoneCall#ffe6ab67 id:long access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connection:PhoneConnection alternative_connections:Vector<PhoneConnection> start_date:int = PhoneCall;\nphoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall;\n\nphoneConnection#9d4c17c0 id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection;\n\nphoneCallProtocol#a2bb35cb flags:# udp_p2p:flags.0?true udp_reflector:flags.1?true min_layer:int max_layer:int = PhoneCallProtocol;\n\nphone.phoneCall#ec82e140 phone_call:PhoneCall users:Vector<User> = phone.PhoneCall;\n\nupload.cdnFileReuploadNeeded#eea8e46e request_token:bytes = upload.CdnFile;\nupload.cdnFile#a99fca4f bytes:bytes = upload.CdnFile;\n\ncdnPublicKey#c982eaba dc_id:int public_key:string = CdnPublicKey;\n\ncdnConfig#5725e40a public_keys:Vector<CdnPublicKey> = CdnConfig;\n\n---functions---\n\ninvokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;\ninvokeAfterMsgs#3dc4b4f0 {X:Type} msg_ids:Vector<long> query:!X = X;\ninitConnection#69796de9 {X:Type} api_id:int device_model:string system_version:string app_version:string lang_code:string query:!X = X;\ninvokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X;\ninvokeWithoutUpdates#bf9459b7 {X:Type} query:!X = X;\n\nauth.checkPhone#6fe51dfb phone_number:string = auth.CheckedPhone;\nauth.sendCode#86aef0ec flags:# allow_flashcall:flags.0?true phone_number:string current_number:flags.0?Bool api_id:int api_hash:string = auth.SentCode;\nauth.signUp#1b067634 phone_number:string phone_code_hash:string phone_code:string first_name:string last_name:string = auth.Authorization;\nauth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization;\nauth.logOut#5717da40 = Bool;\nauth.resetAuthorizations#9fab0d1a = Bool;\nauth.sendInvites#771c1d97 phone_numbers:Vector<string> message:string = Bool;\nauth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;\nauth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization;\nauth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool;\nauth.importBotAuthorization#67a3ff2c flags:int api_id:int api_hash:string bot_auth_token:string = auth.Authorization;\nauth.checkPassword#a63011e password_hash:bytes = auth.Authorization;\nauth.requestPasswordRecovery#d897bc66 = auth.PasswordRecovery;\nauth.recoverPassword#4ea56e92 code:string = auth.Authorization;\nauth.resendCode#3ef1a9bf phone_number:string phone_code_hash:string = auth.SentCode;\nauth.cancelCode#1f040578 phone_number:string phone_code_hash:string = Bool;\nauth.dropTempAuthKeys#8e48a188 except_auth_keys:Vector<long> = Bool;\n\naccount.registerDevice#637ea878 token_type:int token:string = Bool;\naccount.unregisterDevice#65c55b40 token_type:int token:string = Bool;\naccount.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool;\naccount.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings;\naccount.resetNotifySettings#db7e1747 = Bool;\naccount.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User;\naccount.updateStatus#6628562c offline:Bool = Bool;\naccount.getWallPapers#c04cfac2 = Vector<WallPaper>;\naccount.reportPeer#ae189d5f peer:InputPeer reason:ReportReason = Bool;\naccount.checkUsername#2714d86c username:string = Bool;\naccount.updateUsername#3e0bdd7c username:string = User;\naccount.getPrivacy#dadbc950 key:InputPrivacyKey = account.PrivacyRules;\naccount.setPrivacy#c9f81ce8 key:InputPrivacyKey rules:Vector<InputPrivacyRule> = account.PrivacyRules;\naccount.deleteAccount#418d4e0b reason:string = Bool;\naccount.getAccountTTL#8fc711d = AccountDaysTTL;\naccount.setAccountTTL#2442485e ttl:AccountDaysTTL = Bool;\naccount.sendChangePhoneCode#8e57deb flags:# allow_flashcall:flags.0?true phone_number:string current_number:flags.0?Bool = auth.SentCode;\naccount.changePhone#70c32edb phone_number:string phone_code_hash:string phone_code:string = User;\naccount.updateDeviceLocked#38df3532 period:int = Bool;\naccount.getAuthorizations#e320c158 = account.Authorizations;\naccount.resetAuthorization#df77f3bc hash:long = Bool;\naccount.getPassword#548a30f5 = account.Password;\naccount.getPasswordSettings#bc8d11bb current_password_hash:bytes = account.PasswordSettings;\naccount.updatePasswordSettings#fa7c4b86 current_password_hash:bytes new_settings:account.PasswordInputSettings = Bool;\naccount.sendConfirmPhoneCode#1516d7bd flags:# allow_flashcall:flags.0?true hash:string current_number:flags.0?Bool = auth.SentCode;\naccount.confirmPhone#5f2178c3 phone_code_hash:string phone_code:string = Bool;\naccount.getTmpPassword#4a82327e password_hash:bytes period:int = account.TmpPassword;\n\nusers.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;\nusers.getFullUser#ca30a5b1 id:InputUser = UserFull;\n\ncontacts.getStatuses#c4a353ee = Vector<ContactStatus>;\ncontacts.getContacts#22c6aa08 hash:string = contacts.Contacts;\ncontacts.importContacts#da30b32d contacts:Vector<InputContact> replace:Bool = contacts.ImportedContacts;\ncontacts.deleteContact#8e953744 id:InputUser = contacts.Link;\ncontacts.deleteContacts#59ab389e id:Vector<InputUser> = Bool;\ncontacts.block#332b49fc id:InputUser = Bool;\ncontacts.unblock#e54100bd id:InputUser = Bool;\ncontacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked;\ncontacts.exportCard#84e53737 = Vector<int>;\ncontacts.importCard#4fe196fe export_card:Vector<int> = User;\ncontacts.search#11f812d8 q:string limit:int = contacts.Found;\ncontacts.resolveUsername#f93ccba3 username:string = contacts.ResolvedPeer;\ncontacts.getTopPeers#d4982db5 flags:# correspondents:flags.0?true bots_pm:flags.1?true bots_inline:flags.2?true groups:flags.10?true channels:flags.15?true offset:int limit:int hash:int = contacts.TopPeers;\ncontacts.resetTopPeerRating#1ae373ac category:TopPeerCategory peer:InputPeer = Bool;\n\nmessages.getMessages#4222fa74 id:Vector<int> = messages.Messages;\nmessages.getDialogs#191ba9c5 flags:# exclude_pinned:flags.0?true offset_date:int offset_id:int offset_peer:InputPeer limit:int = messages.Dialogs;\nmessages.getHistory#afa92846 peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int = messages.Messages;\nmessages.search#d4569248 flags:# peer:InputPeer q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = messages.Messages;\nmessages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages;\nmessages.deleteHistory#1c015b09 flags:# just_clear:flags.0?true peer:InputPeer max_id:int = messages.AffectedHistory;\nmessages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector<int> = messages.AffectedMessages;\nmessages.receivedMessages#5a954c0 max_id:int = Vector<ReceivedNotifyMessage>;\nmessages.setTyping#a3825e50 peer:InputPeer action:SendMessageAction = Bool;\nmessages.sendMessage#fa88427a flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> = Updates;\nmessages.sendMedia#c8f16791 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia random_id:long reply_markup:flags.2?ReplyMarkup = Updates;\nmessages.forwardMessages#708e0195 flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true from_peer:InputPeer id:Vector<int> random_id:Vector<long> to_peer:InputPeer = Updates;\nmessages.reportSpam#cf1592db peer:InputPeer = Bool;\nmessages.hideReportSpam#a8f1709b peer:InputPeer = Bool;\nmessages.getPeerSettings#3672e09c peer:InputPeer = PeerSettings;\nmessages.getChats#3c6aa187 id:Vector<int> = messages.Chats;\nmessages.getFullChat#3b831c66 chat_id:int = messages.ChatFull;\nmessages.editChatTitle#dc452855 chat_id:int title:string = Updates;\nmessages.editChatPhoto#ca4c79d8 chat_id:int photo:InputChatPhoto = Updates;\nmessages.addChatUser#f9a0aa09 chat_id:int user_id:InputUser fwd_limit:int = Updates;\nmessages.deleteChatUser#e0611f16 chat_id:int user_id:InputUser = Updates;\nmessages.createChat#9cb126e users:Vector<InputUser> title:string = Updates;\nmessages.forwardMessage#33963bf9 peer:InputPeer id:int random_id:long = Updates;\nmessages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig;\nmessages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat;\nmessages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat;\nmessages.discardEncryption#edd923c5 chat_id:int = Bool;\nmessages.setEncryptedTyping#791451ed peer:InputEncryptedChat typing:Bool = Bool;\nmessages.readEncryptedHistory#7f4b690a peer:InputEncryptedChat max_date:int = Bool;\nmessages.sendEncrypted#a9776773 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;\nmessages.sendEncryptedFile#9a901b66 peer:InputEncryptedChat random_id:long data:bytes file:InputEncryptedFile = messages.SentEncryptedMessage;\nmessages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;\nmessages.receivedQueue#55a5bb66 max_qts:int = Vector<long>;\nmessages.reportEncryptedSpam#4b0c8c0f peer:InputEncryptedChat = Bool;\nmessages.readMessageContents#36a73f77 id:Vector<int> = messages.AffectedMessages;\nmessages.getAllStickers#1c9618b1 hash:int = messages.AllStickers;\nmessages.getWebPagePreview#25223e24 message:string = MessageMedia;\nmessages.exportChatInvite#7d885289 chat_id:int = ExportedChatInvite;\nmessages.checkChatInvite#3eadb1bb hash:string = ChatInvite;\nmessages.importChatInvite#6c50051c hash:string = Updates;\nmessages.getStickerSet#2619a90e stickerset:InputStickerSet = messages.StickerSet;\nmessages.installStickerSet#c78fe460 stickerset:InputStickerSet archived:Bool = messages.StickerSetInstallResult;\nmessages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool;\nmessages.startBot#e6df7378 bot:InputUser peer:InputPeer random_id:long start_param:string = Updates;\nmessages.getMessagesViews#c4c8a55d peer:InputPeer id:Vector<int> increment:Bool = Vector<int>;\nmessages.toggleChatAdmins#ec8bd9e1 chat_id:int enabled:Bool = Updates;\nmessages.editChatAdmin#a9e69f2e chat_id:int user_id:InputUser is_admin:Bool = Bool;\nmessages.migrateChat#15a3b8e3 chat_id:int = Updates;\nmessages.searchGlobal#9e3cacb0 q:string offset_date:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;\nmessages.reorderStickerSets#78337739 flags:# masks:flags.0?true order:Vector<long> = Bool;\nmessages.getDocumentByHash#338e2464 sha256:bytes size:int mime_type:string = Document;\nmessages.searchGifs#bf9a776b q:string offset:int = messages.FoundGifs;\nmessages.getSavedGifs#83bf3d52 hash:int = messages.SavedGifs;\nmessages.saveGif#327a30cb id:InputDocument unsave:Bool = Bool;\nmessages.getInlineBotResults#514e999d flags:# bot:InputUser peer:InputPeer geo_point:flags.0?InputGeoPoint query:string offset:string = messages.BotResults;\nmessages.setInlineBotResults#eb5ea206 flags:# gallery:flags.0?true private:flags.1?true query_id:long results:Vector<InputBotInlineResult> cache_time:int next_offset:flags.2?string switch_pm:flags.3?InlineBotSwitchPM = Bool;\nmessages.sendInlineBotResult#b16e06fe flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int random_id:long query_id:long id:string = Updates;\nmessages.getMessageEditData#fda68d36 peer:InputPeer id:int = messages.MessageEditData;\nmessages.editMessage#ce91e4ca flags:# no_webpage:flags.1?true peer:InputPeer id:int message:flags.11?string reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> = Updates;\nmessages.editInlineBotMessage#130c2c85 flags:# no_webpage:flags.1?true id:InputBotInlineMessageID message:flags.11?string reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> = Bool;\nmessages.getBotCallbackAnswer#810a9fec flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes = messages.BotCallbackAnswer;\nmessages.setBotCallbackAnswer#d58f130a flags:# alert:flags.1?true query_id:long message:flags.0?string url:flags.2?string cache_time:int = Bool;\nmessages.getPeerDialogs#2d9776b9 peers:Vector<InputPeer> = messages.PeerDialogs;\nmessages.saveDraft#bc39e14b flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int peer:InputPeer message:string entities:flags.3?Vector<MessageEntity> = Bool;\nmessages.getAllDrafts#6a3f8d65 = Updates;\nmessages.getFeaturedStickers#2dacca4f hash:int = messages.FeaturedStickers;\nmessages.readFeaturedStickers#5b118126 id:Vector<long> = Bool;\nmessages.getRecentStickers#5ea192c9 flags:# attached:flags.0?true hash:int = messages.RecentStickers;\nmessages.saveRecentSticker#392718f8 flags:# attached:flags.0?true id:InputDocument unsave:Bool = Bool;\nmessages.clearRecentStickers#8999602d flags:# attached:flags.0?true = Bool;\nmessages.getArchivedStickers#57f17692 flags:# masks:flags.0?true offset_id:long limit:int = messages.ArchivedStickers;\nmessages.getMaskStickers#65b8c79f hash:int = messages.AllStickers;\nmessages.getAttachedStickers#cc5b67cc media:InputStickeredMedia = Vector<StickerSetCovered>;\nmessages.setGameScore#8ef8ecc0 flags:# edit_message:flags.0?true force:flags.1?true peer:InputPeer id:int user_id:InputUser score:int = Updates;\nmessages.setInlineGameScore#15ad9f64 flags:# edit_message:flags.0?true force:flags.1?true id:InputBotInlineMessageID user_id:InputUser score:int = Bool;\nmessages.getGameHighScores#e822649d peer:InputPeer id:int user_id:InputUser = messages.HighScores;\nmessages.getInlineGameHighScores#f635e1b id:InputBotInlineMessageID user_id:InputUser = messages.HighScores;\nmessages.getCommonChats#d0a48c4 user_id:InputUser max_id:int limit:int = messages.Chats;\nmessages.getAllChats#eba80ff0 except_ids:Vector<int> = messages.Chats;\nmessages.getWebPage#32ca8f91 url:string hash:int = WebPage;\nmessages.toggleDialogPin#3289be6a flags:# pinned:flags.0?true peer:InputPeer = Bool;\nmessages.reorderPinnedDialogs#959ff644 flags:# force:flags.0?true order:Vector<InputPeer> = Bool;\nmessages.getPinnedDialogs#e254d64e = messages.PeerDialogs;\nmessages.setBotShippingResults#e5f672fa flags:# query_id:long error:flags.0?string shipping_options:flags.1?Vector<ShippingOption> = Bool;\nmessages.setBotPrecheckoutResults#9c2dd95 flags:# success:flags.1?true query_id:long error:flags.0?string = Bool;\n\nupdates.getState#edd4882a = updates.State;\nupdates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference;\nupdates.getChannelDifference#3173d78 flags:# force:flags.0?true channel:InputChannel filter:ChannelMessagesFilter pts:int limit:int = updates.ChannelDifference;\n\nphotos.updateProfilePhoto#f0bb5152 id:InputPhoto = UserProfilePhoto;\nphotos.uploadProfilePhoto#4f32c098 file:InputFile = photos.Photo;\nphotos.deletePhotos#87cf7f2f id:Vector<InputPhoto> = Vector<long>;\nphotos.getUserPhotos#91cd32a8 user_id:InputUser offset:int max_id:long limit:int = photos.Photos;\n\nupload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool;\nupload.getFile#e3a6cfb5 location:InputFileLocation offset:int limit:int = upload.File;\nupload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool;\nupload.getWebFile#24e6818d location:InputWebFileLocation offset:int limit:int = upload.WebFile;\nupload.getCdnFile#2000bcc3 file_token:bytes offset:int limit:int = upload.CdnFile;\nupload.reuploadCdnFile#2e7a2020 file_token:bytes request_token:bytes = Bool;\n\nhelp.getConfig#c4f9186b = Config;\nhelp.getNearestDc#1fb33026 = NearestDc;\nhelp.getAppUpdate#ae2de196 = help.AppUpdate;\nhelp.saveAppLog#6f02f748 events:Vector<InputAppEvent> = Bool;\nhelp.getInviteText#4d392343 = help.InviteText;\nhelp.getSupport#9cdf08cd = help.Support;\nhelp.getAppChangelog#9010ef6f prev_app_version:string = Updates;\nhelp.getTermsOfService#350170f3 = help.TermsOfService;\nhelp.setBotUpdatesStatus#ec22cfcd pending_updates_count:int message:string = Bool;\nhelp.getCdnConfig#52029342 = CdnConfig;\n\nchannels.readHistory#cc104937 channel:InputChannel max_id:int = Bool;\nchannels.deleteMessages#84c1fd4e channel:InputChannel id:Vector<int> = messages.AffectedMessages;\nchannels.deleteUserHistory#d10dd71b channel:InputChannel user_id:InputUser = messages.AffectedHistory;\nchannels.reportSpam#fe087810 channel:InputChannel user_id:InputUser id:Vector<int> = Bool;\nchannels.getMessages#93d7b347 channel:InputChannel id:Vector<int> = messages.Messages;\nchannels.getParticipants#24d98f92 channel:InputChannel filter:ChannelParticipantsFilter offset:int limit:int = channels.ChannelParticipants;\nchannels.getParticipant#546dd7a6 channel:InputChannel user_id:InputUser = channels.ChannelParticipant;\nchannels.getChannels#a7f6bbb id:Vector<InputChannel> = messages.Chats;\nchannels.getFullChannel#8736a09 channel:InputChannel = messages.ChatFull;\nchannels.createChannel#f4893d7f flags:# broadcast:flags.0?true megagroup:flags.1?true title:string about:string = Updates;\nchannels.editAbout#13e27f1e channel:InputChannel about:string = Bool;\nchannels.editAdmin#eb7611d0 channel:InputChannel user_id:InputUser role:ChannelParticipantRole = Updates;\nchannels.editTitle#566decd0 channel:InputChannel title:string = Updates;\nchannels.editPhoto#f12e57c9 channel:InputChannel photo:InputChatPhoto = Updates;\nchannels.checkUsername#10e6bd2c channel:InputChannel username:string = Bool;\nchannels.updateUsername#3514b3de channel:InputChannel username:string = Bool;\nchannels.joinChannel#24b524c5 channel:InputChannel = Updates;\nchannels.leaveChannel#f836aa95 channel:InputChannel = Updates;\nchannels.inviteToChannel#199f3a6c channel:InputChannel users:Vector<InputUser> = Updates;\nchannels.kickFromChannel#a672de14 channel:InputChannel user_id:InputUser kicked:Bool = Updates;\nchannels.exportInvite#c7560885 channel:InputChannel = ExportedChatInvite;\nchannels.deleteChannel#c0111fe3 channel:InputChannel = Updates;\nchannels.toggleInvites#49609307 channel:InputChannel enabled:Bool = Updates;\nchannels.exportMessageLink#c846d22d channel:InputChannel id:int = ExportedMessageLink;\nchannels.toggleSignatures#1f69b606 channel:InputChannel enabled:Bool = Updates;\nchannels.updatePinnedMessage#a72ded52 flags:# silent:flags.0?true channel:InputChannel id:int = Updates;\nchannels.getAdminedPublicChannels#8d8d82d7 = messages.Chats;\n\nbots.sendCustomRequest#aa2769ed custom_method:string params:DataJSON = DataJSON;\nbots.answerWebhookJSONQuery#e6213f4d query_id:long data:DataJSON = Bool;\n\npayments.getPaymentForm#99f09745 msg_id:int = payments.PaymentForm;\npayments.getPaymentReceipt#a092a980 msg_id:int = payments.PaymentReceipt;\npayments.validateRequestedInfo#770a8e74 flags:# save:flags.0?true msg_id:int info:PaymentRequestedInfo = payments.ValidatedRequestedInfo;\npayments.sendPaymentForm#2b8879b3 flags:# msg_id:int requested_info_id:flags.0?string shipping_option_id:flags.1?string credentials:InputPaymentCredentials = payments.PaymentResult;\npayments.getSavedInfo#227d824b = payments.SavedInfo;\npayments.clearSavedInfo#d83d70c1 flags:# credentials:flags.0?true info:flags.1?true = Bool;\n\nphone.getCallConfig#55451fa9 = DataJSON;\nphone.requestCall#5b95b3d4 user_id:InputUser random_id:int g_a_hash:bytes protocol:PhoneCallProtocol = phone.PhoneCall;\nphone.acceptCall#3bd2b4a0 peer:InputPhoneCall g_b:bytes protocol:PhoneCallProtocol = phone.PhoneCall;\nphone.confirmCall#2efe1722 peer:InputPhoneCall g_a:bytes key_fingerprint:long protocol:PhoneCallProtocol = phone.PhoneCall;\nphone.receivedCall#17d54f61 peer:InputPhoneCall = Bool;\nphone.discardCall#78d413a6 peer:InputPhoneCall duration:int reason:PhoneCallDiscardReason connection_id:long = Updates;\nphone.setCallRating#1c536a34 peer:InputPhoneCall rating:int comment:string = Updates;\nphone.saveCallDebug#277add7e peer:InputPhoneCall debug:DataJSON = Bool;\n\n// LAYER 66"
  },
  {
    "path": "src/test/resources/samples/langs/TypeScript/cache.ts",
    "content": "import { DocumentNode } from 'graphql';\nimport { getFragmentQueryDocument } from 'apollo-utilities';\n\nimport { DataProxy, Cache } from './types';\n\nexport type Transaction<T> = (c: ApolloCache<T>) => void;\n\nexport abstract class ApolloCache<TSerialized> implements DataProxy {\n  // required to implement\n  // core API\n  public abstract read<T>(query: Cache.ReadOptions): T;\n  public abstract write(write: Cache.WriteOptions): void;\n  public abstract diff<T>(query: Cache.DiffOptions): Cache.DiffResult<T>;\n  public abstract watch(watch: Cache.WatchOptions): () => void;\n  public abstract evict(query: Cache.EvictOptions): Cache.EvictionResult;\n  public abstract reset(): Promise<void>;\n\n  // intializer / offline / ssr API\n  /**\n   * Replaces existing state in the cache (if any) with the values expressed by\n   * `serializedState`.\n   *\n   * Called when hydrating a cache (server side rendering, or offline storage),\n   * and also (potentially) during hot reloads.\n   */\n  public abstract restore(\n    serializedState: TSerialized,\n  ): ApolloCache<TSerialized>;\n\n  /**\n   * Exposes the cache's complete state, in a serializable format for later restoration.\n   */\n  public abstract extract(optimistic: boolean): TSerialized;\n\n  // optimistic API\n  public abstract removeOptimistic(id: string): void;\n\n  // transactional API\n  public abstract performTransaction(\n    transaction: Transaction<TSerialized>,\n  ): void;\n  public abstract recordOptimisticTransaction(\n    transaction: Transaction<TSerialized>,\n    id: string,\n  ): void;\n\n  // optional API\n  public transformDocument(document: DocumentNode): DocumentNode {\n    return document;\n  }\n  // experimental\n  public transformForLink(document: DocumentNode): DocumentNode {\n    return document;\n  }\n\n  // DataProxy API\n  /**\n   *\n   * @param options\n   * @param optimistic\n   */\n  public readQuery<QueryType>(\n    options: DataProxy.Query,\n    optimistic: boolean = false,\n  ): QueryType {\n    return this.read({\n      query: options.query,\n      variables: options.variables,\n      optimistic,\n    });\n  }\n\n  public readFragment<FragmentType>(\n    options: DataProxy.Fragment,\n    optimistic: boolean = false,\n  ): FragmentType | null {\n    return this.read({\n      query: getFragmentQueryDocument(options.fragment, options.fragmentName),\n      variables: options.variables,\n      rootId: options.id,\n      optimistic,\n    });\n  }\n\n  public writeQuery(options: Cache.WriteQueryOptions): void {\n    this.write({\n      dataId: 'ROOT_QUERY',\n      result: options.data,\n      query: options.query,\n      variables: options.variables,\n    });\n  }\n\n  public writeFragment(options: Cache.WriteFragmentOptions): void {\n    this.write({\n      dataId: options.id,\n      result: options.data,\n      variables: options.variables,\n      query: getFragmentQueryDocument(options.fragment, options.fragmentName),\n    });\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/TypeScript/classes.ts",
    "content": "class Animal {\n    constructor(public name) { }\n    move(meters) {\n        alert(this.name + \" moved \" + meters + \"m.\");\n    }\n}\n\nclass Snake extends Animal {\n    constructor(name) { super(name); }\n    move() {\n        alert(\"Slithering...\");\n        super.move(5);\n    }\n}\n\nclass Horse extends Animal {\n    constructor(name) { super(name); }\n    move() {\n        alert(\"Galloping...\");\n        super.move(45);\n    }\n}\n\nvar sam = new Snake(\"Sammy the Python\")\nvar tom: Animal = new Horse(\"Tommy the Palomino\")\n\nsam.move()\ntom.move(34)\n"
  },
  {
    "path": "src/test/resources/samples/langs/TypeScript/hello.ts",
    "content": "console.log(\"Hello, World!\");\n"
  },
  {
    "path": "src/test/resources/samples/langs/TypeScript/import.tsx",
    "content": "// Fixture taken from https://github.com/graphcool/console/blob/dev/src/components/onboarding/PlaygroundCPopup/PlaygroundCPopup.tsx\n\nimport * as React from 'react'\nimport {withRouter} from 'react-router'\nimport {connect} from 'react-redux'\nimport {bindActionCreators} from 'redux'\nimport {nextStep, selectExample} from '../../../actions/gettingStarted'\nimport {classnames} from '../../../utils/classnames'\nimport Loading from '../../Loading/Loading'\nimport {GettingStartedState} from '../../../types/gettingStarted'\nimport {Example} from '../../../types/types'\nconst classes: any = require('./PlaygroundCPopup.scss')\nimport {$p} from 'graphcool-styles'\nimport * as cx from 'classnames'\n\ninterface Tutorial {\n  title: string\n  description: string\n  image: string\n  link: string\n}\n\nconst guides: Tutorial[] = [\n  {\n    title: 'Learnrelay.org',\n    description: 'A comprehensive, interactive introduction to Relay',\n    link: 'https://learnrelay.org/',\n    image: require('../../../assets/graphics/relay.png'),\n  },\n  {\n    title: 'GraphQL and the amazing Apollo Client',\n    description: 'Explore an Application built using React and Angular 2',\n    link: 'https://medium.com/google-developer-experts/graphql-and-the-amazing-apollo-client-fe57e162a70c',\n    image: require('../../../assets/graphics/apollo.png'),\n  },\n  {\n    title: 'Introducing Lokka',\n    description: 'A Simple JavaScript Client for GraphQL',\n    link: 'https://voice.kadira.io/introducing-lokka-a-simple-javascript-client-for-graphql-e0802695648c',\n    image: require('../../../assets/graphics/lokka.png'),\n  },\n]\n\nconst examples = {\n  ReactRelay: {\n    path: 'react-relay-instagram-example',\n    description: 'React + Relay',\n  },\n  ReactApollo: {\n    path: 'react-apollo-instagram-example',\n    description: 'React + Apollo',\n  },\n  ReactNativeApollo: {\n    path: 'react-native-apollo-instagram-example',\n    description: 'React Native + Apollo',\n  },\n  AngularApollo: {\n    path: 'angular-apollo-instagram-example',\n    description: 'Angular + Apollo',\n  },\n}\n\ninterface Props {\n  id: string\n  projectId: string\n  nextStep: () => Promise<void>\n  selectExample: (selectedExample: Example) => any\n  gettingStartedState: GettingStartedState\n}\n\ninterface State {\n  mouseOver: boolean\n}\n\nclass PlaygroundCPopup extends React.Component<Props, State> {\n\n  state = {\n    mouseOver: false,\n  }\n\n  refs: {\n    [key: string]: any\n    exampleAnchor: HTMLDivElement\n    congratsAnchor: HTMLDivElement\n    scroller: HTMLDivElement,\n  }\n\n  componentDidUpdate(prevProps: Props, prevState: State) {\n    if (prevProps.gettingStartedState.selectedExample !== this.props.gettingStartedState.selectedExample) {\n      this.refs.scroller.scrollTop += this.refs.exampleAnchor.getBoundingClientRect().top\n    }\n\n    if (prevProps.gettingStartedState.isCurrentStep('STEP5_WAITING')\n        && this.props.gettingStartedState.isCurrentStep('STEP5_DONE')) {\n      this.refs.scroller.scrollTop += this.refs.congratsAnchor.getBoundingClientRect().top\n\n      const snd = new Audio(require('../../../assets/success.mp3') as string)\n      snd.volume = 0.5\n      snd.play()\n    }\n  }\n\n  render() {\n    const {mouseOver} = this.state\n    const {selectedExample} = this.props.gettingStartedState\n    const hovering = !this.props.gettingStartedState.isCurrentStep('STEP4_CLICK_TEASER_STEP5')\n    const downloadUrl = (example) => `${__BACKEND_ADDR__}/resources/getting-started-example?repository=${examples[example].path}&project_id=${this.props.projectId}&user=graphcool-examples` // tslint:disable-line\n    return (\n      <div\n        className='flex justify-center items-start w-100 h-100'\n        style={{\n          transition: 'background-color 0.3s ease',\n          backgroundColor: hovering ? 'rgba(255,255,255,0.7)' : 'transparent',\n          width: 'calc(100% - 266px)',\n          pointerEvents: 'none',\n          overflow: 'hidden',\n        }}\n      >\n        <div\n          ref='scroller'\n          className='flex justify-center w-100'\n          style={{\n            transition: 'height 0.5s ease',\n            height: hovering ? '100%' : mouseOver ? '190%' : '210%',\n            pointerEvents: hovering ? 'all' : 'none',\n            cursor: hovering ? 'auto' : 'pointer',\n            overflow: hovering ? 'auto' : 'hidden',\n            alignItems: selectedExample ? 'flex-start' : 'center',\n          }}\n        >\n          <div\n            className='bg-white br-2 shadow-2 mv-96'\n            style={{\n              minWidth: 600,\n              maxWidth: 800,\n              pointerEvents: 'all',\n            }}\n            onMouseLeave={() => this.setState({ mouseOver: false })}\n            onMouseEnter={() => {\n              this.setState({ mouseOver: true })\n            }}\n            onMouseOver={(e: any) => {\n              if (this.props.gettingStartedState.isCurrentStep('STEP4_CLICK_TEASER_STEP5')) {\n                this.props.nextStep()\n              }\n            }}\n          >\n            <div className='ma-16 tc pb-25'>\n              <div className='fw3 ma-38 f-38'>\n                You did it! Time to run an example.\n              </div>\n              <div className='fw2 f-16 mh-96 lh-1-4'>\n                You have successfully set up your own Instagram backend.{' '}\n                When building an app with Graphcool you can easily explore queries in the{' '}\n                playground and \"copy &amp; paste\" selected queries into your code.{' '}\n                Of course, to do so, you need to implement the frontend first.\n              </div>\n              <div className='fw2 f-16 mh-96 lh-1-4 mt-16'>\n                <div>We put together a simple app to show and add posts</div>\n                <div>using the backend you just built, to test and run it locally.</div>\n              </div>\n            </div>\n            <div className='ma-16 tc pb-25'>\n              <div className='fw3 ma-38 f-25'>\n                Select your preferred technology to download the example.\n              </div>\n              <div className='flex justify-between items-center w-100' ref='exampleAnchor'>\n                <div\n                  className={classnames(\n                    classes.exampleButton,\n                    selectedExample === 'ReactRelay' ? classes.active : '',\n                  )}\n                  onClick={() => this.props.selectExample('ReactRelay')}\n                >\n                  React + Relay\n                </div>\n                <div\n                  className={classnames(\n                    classes.exampleButton,\n                    selectedExample === 'ReactApollo' ? classes.active : '',\n                  )}\n                  onClick={() => this.props.selectExample('ReactApollo')}\n                >\n                  React + Apollo\n                </div>\n                <div\n                  className={classnames(\n                    classes.exampleButton,\n                    selectedExample === 'ReactNativeApollo' ? classes.active : '',\n                  )}\n                  onClick={() => this.props.selectExample('ReactNativeApollo')}\n                >\n                  React Native + Apollo\n                </div>\n                <div\n                  className={classnames(\n                    classes.exampleButton,\n                    selectedExample === 'AngularApollo' ? classes.active : '',\n                  )}\n                  onClick={() => this.props.selectExample('AngularApollo')}\n                >\n                  Angular + Apollo\n                </div>\n              </div>\n            </div>\n          {selectedExample &&\n          <div>\n            <div className='w-100'>\n              <iframe\n                className='w-100'\n                height='480'\n                allowFullScreen\n                frameBorder='0'\n                src={`https://www.youtube.com/embed/${this.getExampleVideoUrl(selectedExample)}`}\n              />\n            </div>\n            <div\n              className='w-100 pa-25'\n              style={{\n                backgroundColor: '#FEF5D2',\n              }}\n            >\n              <div className='mt-25 mb-38 w-100 flex justify-center'>\n                <a\n                  href={downloadUrl(selectedExample)}\n                  className='pa-16 white'\n                  style={{\n                    backgroundColor: '#4A90E2',\n                  }}\n                >\n                  Download example\n                </a>\n              </div>\n              <div className='code dark-gray'>\n                <div className='black-50'>\n                  # To see the example in action, run the following commands:\n                </div>\n                <div className='mv-16'>\n                  <div className='black'>\n                    npm install\n                  </div>\n                  <div className='black'>\n                    npm start\n                  </div>\n                </div>\n                <div className='black-50'>\n                  # You can now open the app on localhost:3000\n                </div>\n                <div className='black-50'>\n                  # Please come back to this page once you're done. We're waiting here. 💤\n                </div>\n                <div className={cx($p.w100, $p.flex, $p.flexRow, $p.justifyCenter, $p.mt25)}>\n                  <a href='#' onClick={\n                    (e: any) => {\n                      e.preventDefault()\n                      // we need to skip the 'STEP5_WAITING' step\n                      this.props.nextStep()\n                      this.props.nextStep()\n                      this.props.nextStep()\n                    }\n                  }>\n                    Skip\n                  </a>\n                </div>\n              </div>\n              {this.props.gettingStartedState.isCurrentStep('STEP5_WAITING') &&\n              <div className='w-100 mv-96 flex justify-center'>\n                <Loading />\n              </div>\n              }\n            </div>\n          </div>\n          }\n        {this.props.gettingStartedState.isCurrentStep('STEP5_DONE') &&\n          <div className='w-100 mb-96' ref='congratsAnchor'>\n            <div className='flex items-center flex-column pv-60 fw1'>\n              <div className='f-96'>\n                🎉\n              </div>\n              <div className='f-38 mt-38'>\n                Congratulations!\n              </div>\n              <div className='f-38 mt-16'>\n                We knew you had it in you.\n              </div>\n              <div className='f-16 mv-38'>\n                Now go out there and build amazing things!\n              </div>\n            </div>\n            <div className='flex justify-between ph-25 pv-16'>\n              <div className='w-50 pr-16'>\n                <div className='ttu ls-2 f-16 fw1 lh-1-4'>\n                  Get started on your own<br />with those excellent tutorials\n                </div>\n                <div className='mv-38'>\n                  {guides.map(guide => this.renderBox(guide))}\n                </div>\n              </div>\n              <div className='w-50 pl-16'>\n                <div className='ttu ls-2 f-16 fw1 lh-1-4'>\n                  Get more out of Graphcool<br />with our guides\n                </div>\n                <div className={`h-100 justify-start flex flex-column mv-38 ${classes.guides}`}>\n                  <a\n                    href='https://graph.cool/docs/tutorials/quickstart-2-daisheeb9x'\n                    className={`${classes.one} fw4 black db flex items-center mb-25`}\n                    target='_blank'\n                  >\n                    Declaring Relations\n                  </a>\n                  <a\n                    href='https://graph.cool/docs/tutorials/quickstart-3-saigai7cha'\n                    className={`${classes.two} fw4 black db flex items-center mb-25`}\n                    target='_blank'\n                  >\n                    Implementing Business Logic\n                  </a>\n                  <a\n                    href='https://graph.cool/docs/tutorials/thinking-in-terms-of-graphs-ahsoow1ool'\n                    target='_blank'\n                    className={`${classes.three} fw4 black db flex items-center mb-25`}\n                  >\n                    Thinking in terms of graphs\n                  </a>\n                </div>\n              </div>\n            </div>\n            <div className='flex w-100 justify-center'>\n              <div\n                className='f-25 mv-16 pv-16 ph-60 ls-1 ttu pointer bg-accent white dim'\n                onClick={this.props.nextStep}\n              >\n                Finish Onboarding\n              </div>\n            </div>\n          </div>\n          }\n          </div>\n        </div>\n      </div>\n    )\n  }\n\n  private renderBox = (tutorial: Tutorial) => {\n    return (\n      <div key={tutorial.title} className='pa-16 mb-16 lh-1-4' style={{background: 'rgba(0,0,0,0.03)'}}>\n        <a className='flex items-center' href={tutorial.link} target='_blank'>\n          <div className='flex items-center justify-center' style={{ flex: '0 0 60px', height: 60 }}>\n            <img src={tutorial.image}/>\n          </div>\n          <div className='flex flex-column space-between ml-38'>\n            <div className='mb-6 dark-gray f-16'>\n              {tutorial.title}\n            </div>\n            <div className='fw1 mid-gray'>\n              {tutorial.description}\n            </div>\n          </div>\n        </a>\n      </div>\n    )\n  }\n\n  private getExampleVideoUrl = (example: Example): string => {\n    switch (example) {\n      case 'ReactRelay': return '_dj9Os2ev4M'\n      case 'ReactApollo': return '9nlwyPUPXjQ'\n      case 'ReactNativeApollo': return '9nlwyPUPXjQ'\n      case 'AngularApollo': return 'EzD5fJ-uniI'\n    }\n  }\n}\n\nconst mapStateToProps = (state) => {\n  return {\n    gettingStartedState: state.gettingStarted.gettingStartedState,\n  }\n}\n\nconst mapDispatchToProps = (dispatch) => {\n  return bindActionCreators({nextStep, selectExample}, dispatch)\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withRouter(PlaygroundCPopup))\n"
  },
  {
    "path": "src/test/resources/samples/langs/TypeScript/react-native.tsx",
    "content": "// Fixture taken from https://github.com/bgrieder/RNTSExplorer/blob/master/typescript/components/TextExample.ios.tsx\n\n/**\n * The examples provided by Facebook are for non-commercial testing and\n * evaluation purposes only.\n *\n * Facebook reserves all rights not expressly granted.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL\n * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * Typescript rewrite by Bruno Grieder\n */\n\n'use strict'\n\nimport * as React from 'react-native';\nimport RNTSExample from '../RNTSExample'\nimport RNTSExampleModule from '../RNTSExampleModule'\n\nconst {\n          StyleSheet,\n          Text,\n          View,\n          } = React\n\n\nconst styles = StyleSheet.create(\n    {\n        backgroundColorText: {\n            left:            5,\n            backgroundColor: 'rgba(100, 100, 100, 0.3)'\n        },\n        entity:              {\n            fontWeight: '500',\n            color:      '#527fe4',\n        },\n    }\n)\n\nclass Entity extends React.Component<any,any> {\n    render() {\n        return (\n            <Text style={styles.entity}>\n                {this.props.children}\n            </Text>\n        )\n    }\n}\n\ninterface AttrTogglerState {\n    fontWeight?: string\n    fontSize?: number\n}\n\nclass AttributeToggler extends React.Component<any, AttrTogglerState> {\n    componentWillMount() {\n        this.setState(\n            {\n                fontWeight: '500',\n                fontSize:   15\n            }\n        )\n    }\n\n    private increaseSize = (): void => {\n        this.setState( {\n                           fontSize: this.state.fontSize + 1\n                       } )\n    }\n\n    render() {\n        const curStyle: React.TextStyle = { fontSize: this.state.fontSize }\n        return (\n            <Text>\n                <Text style={curStyle}>\n                    Tap the controls below to change attributes.\n                </Text>\n                <Text>\n                    See how it will even work on{' '}\n                    <Text style={curStyle}>\n                        this nested text\n                    </Text>\n                    <Text onPress={this.increaseSize}>\n                        {'>> Increase Size <<'}\n                    </Text>\n                </Text>\n            </Text>\n        )\n    }\n}\n\nexport default {\n    title:       '<Text>',\n    description: 'Base component for rendering styled text.',\n    displayName: 'TextExample',\n    examples:    [\n                     {\n                         title:  'Wrap',\n                         render: function () {\n                             return (\n                                 <Text>\n                                     The text should wrap if it goes on multiple lines. See, this is going to\n                                     the next line.\n                                 </Text>\n                             )\n                         },\n                     },\n                     {\n                         title:  'Padding',\n                         render: function () {\n                             return (\n                                 <Text style={{padding: 10}}>\n                                     This text is indented by 10px padding on all sides.\n                                 </Text>\n                             )\n                         },\n                     },\n                     {\n                         title:  'Font Family',\n                         render: function () {\n                             return (\n                                 <View>\n                                     <Text style={{fontFamily: 'Cochin'}}>\n                                         Cochin\n                                     </Text>\n                                     <Text style={{fontFamily: 'Cochin', fontWeight: 'bold'}}>\n                                         Cochin bold\n                                     </Text>\n                                     <Text style={{fontFamily: 'Helvetica'}}>\n                                         Helvetica\n                                     </Text>\n                                     <Text style={{fontFamily: 'Helvetica', fontWeight: 'bold'}}>\n                                         Helvetica bold\n                                     </Text>\n                                     <Text style={{fontFamily: 'Verdana'}}>\n                                         Verdana\n                                     </Text>\n                                     <Text style={{fontFamily: 'Verdana', fontWeight: 'bold'}}>\n                                         Verdana bold\n                                     </Text>\n                                 </View>\n                             )\n                         },\n                     },\n                     {\n                         title:  'Font Size',\n                         render: function () {\n                             return (\n                                 <View>\n                                     <Text style={{fontSize: 23}}>\n                                         Size 23\n                                     </Text>\n                                     <Text style={{fontSize: 8}}>\n                                         Size 8\n                                     </Text>\n                                 </View>\n                             )\n                         },\n                     },\n                     {\n                         title:  'Color',\n                         render: function () {\n                             return (\n                                 <View>\n                                     <Text style={{color: 'red'}}>\n                                         Red color\n                                     </Text>\n                                     <Text style={{color: 'blue'}}>\n                                         Blue color\n                                     </Text>\n                                 </View>\n                             )\n                         },\n                     },\n                     {\n                         title:  'Font Weight',\n                         render: function () {\n                             return (\n                                 <View>\n                                     <Text style={{fontWeight: '100'}}>\n                                         Move fast and be ultralight\n                                     </Text>\n                                     <Text style={{fontWeight: '200'}}>\n                                         Move fast and be light\n                                     </Text>\n                                     <Text style={{fontWeight: 'normal'}}>\n                                         Move fast and be normal\n                                     </Text>\n                                     <Text style={{fontWeight: 'bold'}}>\n                                         Move fast and be bold\n                                     </Text>\n                                     <Text style={{fontWeight: '900'}}>\n                                         Move fast and be ultrabold\n                                     </Text>\n                                 </View>\n                             )\n                         },\n                     },\n                     {\n                         title:  'Font Style',\n                         render: function () {\n                             return (\n                                 <View>\n                                     <Text style={{fontStyle: 'normal'}}>\n                                         Normal text\n                                     </Text>\n                                     <Text style={{fontStyle: 'italic'}}>\n                                         Italic text\n                                     </Text>\n                                 </View>\n                             )\n                         },\n                     },\n                     {\n                         title:       'Nested',\n                         description: 'Nested text components will inherit the styles of their ' +\n                                      'parents (only backgroundColor is inherited from non-Text parents).  ' +\n                                      '<Text> only supports other <Text> and raw text (strings) as children.',\n                         render:      function () {\n                             return (\n                                 <View>\n                                     <Text>\n                                         (Normal text,\n                                         <Text style={{fontWeight: 'bold'}}>\n                                             (and bold\n                                             <Text style={{fontSize: 11, color: '#527fe4'}}>\n                                                 (and tiny inherited bold blue)\n                                             </Text>\n                                             )\n                                         </Text>\n                                         )\n                                     </Text>\n                                     <Text style={{fontSize: 12}}>\n                                         <Entity>Entity Name</Entity>\n                                     </Text>\n                                 </View>\n                             )\n                         },\n                     },\n                     {\n                         title:  'Text Align',\n                         render: function () {\n                             return (\n                                 <View>\n                                     <Text style={{textAlign: 'left'}}>\n                                         left left left left left left left left left left left left left left left\n                                     </Text>\n                                     <Text style={{textAlign: 'center'}}>\n                                         center center center center center center center center center center center\n                                     </Text>\n                                     <Text style={{textAlign: 'right'}}>\n                                         right right right right right right right right right right right right right\n                                     </Text>\n                                 </View>\n                             )\n                         },\n                     },\n                     {\n                         title:  'Spaces',\n                         render: function () {\n                             return (\n                                 <Text>\n                                     A {'generated'} {' '} {'string'} and    some &nbsp&nbsp&nbsp spaces\n                                 </Text>\n                             )\n                         },\n                     },\n                     {\n                         title:  'Line Height',\n                         render: function () {\n                             return (\n                                 <Text>\n                                     <Text style={{lineHeight: 35}}>\n                                         A lot of space between the lines of this long passage that should\n                                         wrap once.\n                                     </Text>\n                                 </Text>\n                             )\n                         },\n                     },\n                     {\n                         title:       'Empty Text',\n                         description: 'It\\'s ok to have Text with zero or null children.',\n                         render:      function () {\n                             return (\n                                 <Text />\n                             )\n                         },\n                     },\n                     {\n                         title:  'Toggling Attributes',\n                         render: (): React.ReactElement<any> => {\n                             return <AttributeToggler />\n                         },\n                     },\n                     {\n                         title:       'backgroundColor attribute',\n                         description: 'backgroundColor is inherited from all types of views.',\n                         render:      function () {\n                             return (\n                                 <View style={{backgroundColor: 'yellow'}}>\n                                     <Text>\n                                         Yellow background inherited from View parent,\n                                         <Text style={{backgroundColor: '#ffaaaa'}}>\n                                             {' '}red background,\n                                             <Text style={{backgroundColor: '#aaaaff'}}>\n                                                 {' '}blue background,\n                                                 <Text>\n                                                     {' '}inherited blue background,\n                                                     <Text style={{backgroundColor: '#aaffaa'}}>\n                                                         {' '}nested green background.\n                                                     </Text>\n                                                 </Text>\n                                             </Text>\n                                         </Text>\n                                     </Text>\n                                 </View>\n                             )\n                         },\n                     },\n                     {\n                         title:  'containerBackgroundColor attribute',\n                         render: function () {\n                             return (\n                                 <View>\n                                     <View style={{flexDirection: 'row', height: 85}}>\n                                         <View style={{backgroundColor: '#ffaaaa', width: 150}}/>\n                                         <View style={{backgroundColor: '#aaaaff', width: 150}}/>\n                                     </View>\n                                     <Text style={[styles.backgroundColorText, {top: -80}]}>\n                                         Default containerBackgroundColor (inherited) + backgroundColor wash\n                                     </Text>\n                                     <Text style={[\n                                            styles.backgroundColorText,\n                                            {top: -70, containerBackgroundColor: 'transparent'}\n                                        ]}>\n                                         {\"containerBackgroundColor: 'transparent' + backgroundColor wash\"}\n                                     </Text>\n                                 </View>\n                             )\n                         },\n                     },\n                     {\n                         title:  'numberOfLines attribute',\n                         render: function () {\n                             return (\n                                 <View>\n                                     <Text numberOfLines={1}>\n                                         Maximum of one line no matter now much I write here. If I keep writing it{\"'\"}ll just truncate after one line\n                                     </Text>\n                                     <Text numberOfLines={2} style={{marginTop: 20}}>\n                                         Maximum of two lines no matter now much I write here. If I keep writing it{\"'\"}ll just truncate after two lines\n                                     </Text>\n                                     <Text style={{marginTop: 20}}>\n                                         No maximum lines specified no matter now much I write here. If I keep writing it{\"'\"}ll just keep going and going\n                                     </Text>\n                                 </View>\n                             )\n                         }\n                     } ] as RNTSExample[]\n} as RNTSExampleModule\n"
  },
  {
    "path": "src/test/resources/samples/langs/TypeScript/require.tsx",
    "content": "﻿// Fixture taken from https://github.com/jcingroup/C551608_Roki/blob/master/Work.WebProj/Scripts/src/tsx/m-parm.tsx\n\nimport $ = require('jquery');\nimport React = require('react');\nimport ReactDOM = require('react-dom');\nimport Moment = require('moment');\nimport ReactBootstrap = require(\"react-bootstrap\");\nimport CommCmpt = require('comm-cmpt');\nimport CommFunc = require('comm-func');\n\nnamespace Parm {\n    interface ParamData {\n        Email?: string;\n        PurchaseTotal?: number;\n        HomoiothermyFee?: number;\n        RefrigerFee?: number;\n        AccountName?: string;\n        BankName?: string;\n        BankCode?: string;\n        AccountNumber?: string;\n        Fee?: number;\n    }\n    export class GridForm extends React.Component<any, { param?: ParamData }>{\n\n\n        constructor() {\n\n            super();\n            this.queryInitData = this.queryInitData.bind(this);\n            this.handleSubmit = this.handleSubmit.bind(this);\n            this.componentDidMount = this.componentDidMount.bind(this);\n            this.setInputValue = this.setInputValue.bind(this);\n            this.render = this.render.bind(this);\n            this.state = {\n                param: {\n                    Email: null,\n                    PurchaseTotal: 0,\n                    HomoiothermyFee: 0,\n                    RefrigerFee:0,\n                    AccountName: null,\n                    BankName: null,\n                    BankCode: null,\n                    AccountNumber: null,\n                    Fee: 0\n                }\n            }\n        }\n        static defaultProps = {\n            apiInitPath: gb_approot + 'Active/ParmData/aj_ParamInit',\n            apiPath: gb_approot + 'api/GetAction/PostParamData'\n        }\n        componentDidMount() {\n            this.queryInitData();\n        }\n        queryInitData() {\n            CommFunc.jqGet(this.props.apiInitPath, {})\n                .done((data, textStatus, jqXHRdata) => {\n                    this.setState({ param: data });\n                })\n                .fail((jqXHR, textStatus, errorThrown) => {\n                    CommFunc.showAjaxError(errorThrown);\n                });\n        }\n        handleSubmit(e: React.FormEvent) {\n\n            e.preventDefault();\n            CommFunc.jqPost(this.props.apiPath, this.state.param)\n                .done((data, textStatus, jqXHRdata) => {\n                    if (data.result) {\n                        CommFunc.tosMessage(null, '修改完成', 1);\n                    } else {\n                        alert(data.message);\n                    }\n                })\n                .fail((jqXHR, textStatus, errorThrown) => {\n                    CommFunc.showAjaxError(errorThrown);\n                });\n            return;\n        }\n        handleOnBlur(date) {\n\n        }\n        setInputValue(name: string, e: React.SyntheticEvent) {\n            let input: HTMLInputElement = e.target as HTMLInputElement;\n            let obj = this.state.param;\n            obj[name] = input.value;\n            this.setState({ param: obj });\n        }\n        render() {\n\n            var outHtml: JSX.Element = null;\n\n            let param = this.state.param;\n            let InputDate = CommCmpt.InputDate;\n\n            outHtml = (\n                <div>\n    <ul className=\"breadcrumb\">\n        <li><i className=\"fa-list-alt\"></i>\n            {this.props.menuName}\n            </li>\n        </ul>\n    <h4 className=\"title\"> {this.props.caption} 基本資料維護</h4>\n    <form className=\"form-horizontal\" onSubmit={this.handleSubmit}>\n        <div className=\"col-xs-12\">\n            <div className=\"item-box\">\n                {/*--email--*/}\n                <div className=\"item-title text-center\">\n                <h5>Email信箱設定</h5>\n                    </div>\n                    <div className=\"alert alert-warning\" role=\"alert\">\n                        <ol>\n                            <li>多筆信箱請用「<strong className=\"text-danger\">, </strong>」逗號分開。<br />ex.<strong>user1 @demo.com.tw, user2 @demo.com.tw</strong></li>\n                            <li>Email 前面可填收件人姓名，用「<strong className=\"text-danger\">: </strong>」冒號分隔姓名和信箱，此項非必要，可省略。<br />ex.<strong>收件人A: user1 @demo.com.tw, 收件人B: user2 @demo.com.tw</strong></li>\n                            </ol>\n                        </div>\n                    <div className=\"form-group\">\n                       <label className=\"col-xs-1 control-label\">收件信箱</label>\n                       <div className=\"col-xs-9\">\n                                <input className=\"form-control\" type=\"text\"\n                                    value={param.Email}\n                                    onChange={this.setInputValue.bind(this, 'Email') }\n                                    maxLength={500}\n                                    required/>\n                           </div>\n                        </div>\n                {/*--email end--*/}\n                {/*--shoppingCost--*/}\n                <div className=\"item-title text-center\">\n                <h5>訂單運費設定</h5>\n                    </div>\n                    <div className=\"form-group\">\n                       <label className=\"col-xs-3 control-label\">會員下訂單，當訂單金額少於NT$</label>\n                       <div className=\"col-xs-1\">\n                                <input className=\"form-control\" type=\"number\"\n                                    value={param.PurchaseTotal}\n                                    onChange={this.setInputValue.bind(this, 'PurchaseTotal') }\n                                    min={0}\n                                    required/>\n                           </div>\n                        <label className=\"col-xs-2 control-label\">元時須付常溫運費NT$</label>\n                       <div className=\"col-xs-1\">\n                                <input className=\"form-control\" type=\"number\"\n                                    value={param.HomoiothermyFee}\n                                    onChange={this.setInputValue.bind(this, 'HomoiothermyFee') }\n                                    min={0}\n                                    required/>\n                           </div>\n                        <label className=\"col-xs-2 control-label\">元或冷凍(冷藏)運費NT$</label>\n                       <div className=\"col-xs-1\">\n                                <input className=\"form-control\" type=\"number\"\n                                    value={param.RefrigerFee}\n                                    onChange={this.setInputValue.bind(this, 'RefrigerFee') }\n                                    min={0}\n                                    required/>\n                           </div>\n                        <label className=\"col-xs-1 control-label\">元</label>\n                        </div>\n\n                {/*--shoppingCost end--*/}\n                {/*--Payment--*/}\n                <div className=\"item-title text-center\">\n                <h5>付款方式</h5>\n                    </div>\n                    <div className=\"form-group\">\n                     <label className=\"col-xs-4 control-label\">當付款方式選擇『ATM轉帳』時，銀行帳號資料為: </label>\n                        </div>\n                    <div className=\"form-group\">\n                       <label className=\"col-xs-2 control-label\">戶名: </label>\n                       <div className=\"col-xs-3\">\n                                <input className=\"form-control\" type=\"text\"\n                                    value={param.AccountName}\n                                    onChange={this.setInputValue.bind(this, 'AccountName') }\n                                    maxLength={16}\n                                    required/>\n                           </div>\n                        </div>\n                    <div className=\"form-group\">\n                       <label className=\"col-xs-2 control-label\">銀行: </label>\n                       <div className=\"col-xs-3\">\n                                <input className=\"form-control\" type=\"text\"\n                                    value={param.BankName}\n                                    onChange={this.setInputValue.bind(this, 'BankName') }\n                                    maxLength={16}\n                                    required/>\n                           </div>\n                        </div>\n                    <div className=\"form-group\">\n                       <label className=\"col-xs-2 control-label\">代碼: </label>\n                       <div className=\"col-xs-3\">\n                                <input className=\"form-control\" type=\"text\"\n                                    value={param.BankCode}\n                                    onChange={this.setInputValue.bind(this, 'BankCode') }\n                                    maxLength={5}\n                                    required/>\n                           </div>\n                        </div>\n                    <div className=\"form-group\">\n                       <label className=\"col-xs-2 control-label\">帳號: </label>\n                       <div className=\"col-xs-3\">\n                                <input className=\"form-control\" type=\"text\"\n                                    value={param.AccountNumber}\n                                    onChange={this.setInputValue.bind(this, 'AccountNumber') }\n                                    maxLength={16}\n                                    required/>\n                           </div>\n                        </div>\n                    {/*<div className=\"form-group\">\n                     <label className=\"col-xs-4 control-label\">當付款方式選擇『貨到付款』時，須加NT$ </label>\n                       <div className=\"col-xs-1\">\n                                <input className=\"form-control\" type=\"number\"\n                                    value={param.Fee}\n                                    onChange={this.setInputValue.bind(this, 'Fee') }\n                                    min={0}\n                                    required/>\n                           </div>\n                     <label className=\"control-label\">元手續費</label>\n                        </div>*/}\n                {/*--Payment end--*/}\n                </div>\n\n\n\n            <div className=\"form-action\">\n                <div className=\"col-xs-4 col-xs-offset-5\">\n                    <button type=\"submit\" className=\"btn-primary\"><i className=\"fa-check\"></i> 儲存</button>\n                    </div>\n                </div>\n            </div>\n        </form>\n                    </div>\n            );\n\n            return outHtml;\n        }\n    }\n}\n\nvar dom = document.getElementById('page_content');\nReactDOM.render(<Parm.GridForm caption={gb_caption} menuName={gb_menuname} iconClass=\"fa-list-alt\" />, dom);\n"
  },
  {
    "path": "src/test/resources/samples/langs/TypeScript/triple-slash-reference.tsx",
    "content": "/// <reference path=\"../DefinitelyTyped/react/react-global.d.ts\" />\n\n// Fixture taken from https://github.com/RyanCavanaugh/koany/blob/master/koany.tsx\n\ninterface Garden {\n\tcolors: Gardens.RockColor[];\n\tshapes: Gardens.RockShape[];\n}\n\nnamespace Gardens {\n\texport enum RockShape {\n\t\tEmpty,\n\t\tCircle,\n\t\tTriangle,\n\t\tSquare,\n\t\tMax\n\t}\n\texport const RockShapes = [RockShape.Circle, RockShape.Triangle, RockShape.Square];\n\texport const RockShapesAndEmpty = RockShapes.concat(RockShape.Empty);\n\n\texport enum RockColor {\n\t\tEmpty,\n\t\tWhite,\n\t\tRed,\n\t\tBlack,\n\t\tMax\n\t}\n\texport const RockColors = [RockColor.White, RockColor.Red, RockColor.Black];\n\texport const RockColorsAndEmpty = RockColors.concat(RockColor.Empty);\n\n\texport const Size = 9;\n\n\t// 012\n\t// 345\n\t// 678\n\texport const adjacencies = [\n\t\t[1, 3], [0, 4, 2], [1, 5],\n\t\t[0, 4, 6], [3, 1, 7, 5], [2, 4, 8],\n\t\t[3, 7], [6, 4, 8], [7, 5]\n\t];\n}\n\nmodule Koan {\n\texport enum DescribeContext {\n\t\t// every \"white stone\" is ...\n\t\tSingular,\n\t\t// all \"white stones\" are\n\t\tPlural,\n\t\t// every stone in the top row is \"white\"\n\t\tAdjectival\n\t}\n\n\texport enum PartType {\n\t\tSelector,\n\t\tAspect\n\t}\n\n\texport enum StateTestResult {\n\t\tFail = 0,\n\t\tWeakPass = 1,\n\t\tPass = 2\n\t}\n\n\t/// A general format for producing a Statement\n\texport interface StatementTemplate<T> {\n\t\tholes: PartType[];\n\t\tdescribe(args: T): string;\n\t\ttest(g: Garden, args: T): StateTestResult;\n\t}\n\n\t/// A completed rule that can be used to test a Garden\n\texport interface ProducedStatement<T> {\n\t\ttest(g: Garden): StateTestResult;\n\t\tdescription: string;\n\t\tchildren: T;\n\n\t\thasPassedAndFailed(): boolean;\n\t}\n\n\tfunction rnd(max: number) {\n\t\treturn Math.floor(Math.random() * max);\n\t}\n\n\tfunction randomColor(): Gardens.RockColor {\n\t\treturn Math.floor(Math.random() * (Gardens.RockColor.Max - 1)) + 1\n\t}\n\n\tfunction randomShape(): Gardens.RockShape {\n\t\treturn Math.floor(Math.random() * (Gardens.RockShape.Max - 1)) + 1\n\t}\n\n\t/* New Impl Here */\n\tinterface SelectorSpec<T> {\n\t\tchildTypes?: PartType[];\n\t\tprecedence: number;\n\t\tweight: number;\n\t\ttest(args: T, g: Garden, index: number): string|number|boolean;\n\t\tdescribe(args: T, context: DescribeContext): string;\n\t\tisAllValues(values: Array<string>|Array<number>): boolean;\n\t}\n\n\tinterface ProducedSelector {\n\t\ttest(g: Garden, index: number): string|number|boolean;\n\t\tgetDescription(plural: DescribeContext): string;\n\t\tseenAllValues(): boolean;\n\t}\n\n\texport function buildSelector<T>(spec: SelectorSpec<T>, args: T): ProducedSelector {\n\t\tlet seenResults: { [s: string]: boolean;} = {};\n\t\treturn {\n\t\t\ttest: (g: Garden, index: number) => {\n\t\t\t\tvar result = spec.test(args, g, index);\n\t\t\t\tseenResults[result + ''] = true;\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tgetDescription: (context) => {\n\t\t\t\treturn spec.describe(args, context);\n\t\t\t},\n\t\t\tseenAllValues: () => {\n\t\t\t\treturn spec.isAllValues(Object.keys(seenResults));\n\t\t\t}\n\t\t}\n\t}\n\n\texport var SelectorTemplates: Array<SelectorSpec<{}>> = [];\n\tmodule LetsMakeSomeSelectors {\n\t\t// Is rock\n\t\tSelectorTemplates.push({\n\t\t\ttest: (args, g, i) => g.colors[i] !== Gardens.RockColor.Empty,\n\t\t\tdescribe: (args, context) => {\n\t\t\t\tswitch(context) {\n\t\t\t\t\tcase DescribeContext.Plural:\n\t\t\t\t\t\treturn 'Stones';\n\t\t\t\t\tcase DescribeContext.Adjectival:\n\t\t\t\t\t\treturn 'not empty';\n\t\t\t\t\tcase DescribeContext.Singular:\n\t\t\t\t\t\treturn 'Stone';\n\t\t\t\t}\n\t\t\t},\n\t\t\tisAllValues: items => items.length === 2,\n\t\t\tprecedence: 0,\n\t\t\tweight: 1\n\t\t});\n\n\t\t// Is of a certain color and/or shape\n\t\tGardens.RockColorsAndEmpty.forEach(color => {\n\t\t\tlet colorName = Gardens.RockColor[color];\n\t\t\tlet colorWeight = color === Gardens.RockColor.Empty ? 1 : 0.33;\n\t\t\tGardens.RockShapesAndEmpty.forEach(shape => {\n\t\t\t\tlet shapeName = Gardens.RockShape[shape];\n\t\t\t\tlet shapeWeight = shape === Gardens.RockShape.Empty ? 1 : 0.33;\n\t\t\t\tSelectorTemplates.push({\n\t\t\t\t\ttest: (args, g, i) => {\n\t\t\t\t\t\tif(color === Gardens.RockColor.Empty) {\n\t\t\t\t\t\t\tif (shape === Gardens.RockShape.Empty) {\n\t\t\t\t\t\t\t\treturn g.colors[i] === Gardens.RockColor.Empty;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn g.shapes[i] === shape;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (shape === Gardens.RockShape.Empty) {\n\t\t\t\t\t\t\t\treturn g.colors[i] === color;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn g.shapes[i] === shape && g.colors[i] === color;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tdescribe: (args, context) => {\n\t\t\t\t\t\tif(color === Gardens.RockColor.Empty) {\n\t\t\t\t\t\t\tif (shape === Gardens.RockShape.Empty) {\n\t\t\t\t\t\t\t\tswitch(context) {\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Plural:\n\t\t\t\t\t\t\t\t\t\treturn 'Empty Cells';\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Adjectival:\n\t\t\t\t\t\t\t\t\t\treturn 'Empty';\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Singular:\n\t\t\t\t\t\t\t\t\t\treturn 'Empty Cell';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tswitch(context) {\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Plural:\n\t\t\t\t\t\t\t\t\t\treturn shapeName + 's';\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Adjectival:\n\t\t\t\t\t\t\t\t\t\treturn 'a ' + shapeName;\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Singular:\n\t\t\t\t\t\t\t\t\t\treturn shapeName;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (shape === Gardens.RockShape.Empty) {\n\t\t\t\t\t\t\t\tswitch(context) {\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Plural:\n\t\t\t\t\t\t\t\t\t\treturn colorName + ' Stones';\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Adjectival:\n\t\t\t\t\t\t\t\t\t\treturn colorName;\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Singular:\n\t\t\t\t\t\t\t\t\t\treturn colorName + ' Stone';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tswitch(context) {\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Plural:\n\t\t\t\t\t\t\t\t\t\treturn colorName + ' ' + shapeName + 's';\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Adjectival:\n\t\t\t\t\t\t\t\t\t\treturn 'a ' + colorName + ' ' + shapeName;\n\t\t\t\t\t\t\t\t\tcase DescribeContext.Singular:\n\t\t\t\t\t\t\t\t\t\treturn colorName + ' ' + shapeName;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tisAllValues: items => items.length === 2,\n\t\t\t\t\tprecedence: 3,\n\t\t\t\t\tweight: (shapeWeight + colorWeight === 2) ? 0.3 : shapeWeight * colorWeight\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// [?] in the [top|middle|bottom] [row|column]\n\t\t[0, 1, 2].forEach(rowCol => {\n\t\t\t[true, false].forEach(isRow => {\n\t\t\t\tvar name = (isRow ? ['top', 'middle', 'bottom'] : ['left', 'middle', 'right'])[rowCol] + ' ' + (isRow ? 'row' : 'column');\n\t\t\t\tvar spec: SelectorSpec<[ProducedSelector]> = {\n\t\t\t\t\tchildTypes: [PartType.Selector],\n\t\t\t\t\ttest: (args, g, i) => {\n\t\t\t\t\t\tvar c = isRow ? Math.floor(i / 3) : i % 3;\n\t\t\t\t\t\tif (c === rowCol) {\n\t\t\t\t\t\t\treturn args[0].test(g, i);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tdescribe: (args, plural) => args[0].getDescription(plural) + ' in the ' + name,\n\t\t\t\t\tisAllValues: items => items.length === 2,\n\t\t\t\t\tprecedence: 4,\n\t\t\t\t\tweight: 1 / 6\n\t\t\t\t};\n\t\t\t\tSelectorTemplates.push(spec);\n\t\t\t});\n\t\t});\n\n\t\t// [?] next to a [?]\n\t\tSelectorTemplates.push({\n\t\t\tchildTypes: [PartType.Selector, PartType.Selector],\n\t\t\ttest: (args, g, i) => {\n\t\t\t\tif (args[0].test(g, i)) {\n\t\t\t\t\treturn Gardens.adjacencies[i].some(x => !!args[1].test(g, x));\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdescribe: (args, plural) => {\n\t\t\t\treturn args[0].getDescription(plural) + ' next to a ' + args[1].getDescription(DescribeContext.Singular);\n\t\t\t},\n\t\t\tisAllValues: items => items.length === 2,\n\t\t\tprecedence: 4,\n\t\t\tweight: 1\n\t\t} as SelectorSpec<[ProducedSelector, ProducedSelector]>);\n\t}\n\n\texport function buildStatement<T>(s: StatementTemplate<T>, args: T): ProducedStatement<T> {\n\t\tlet hasPassed = false;\n\t\tlet hasFailed = false;\n\n\t\tlet result: ProducedStatement<T> = {\n\t\t\tchildren: args,\n\t\t\tdescription: s.describe(args),\n\t\t\ttest: (g) => {\n\t\t\t\tlet r = s.test(g, args);\n\t\t\t\tif (r === StateTestResult.Pass) {\n\t\t\t\t\thasPassed = true;\n\t\t\t\t} else if(r === StateTestResult.Fail) {\n\t\t\t\t\thasFailed = true;\n\t\t\t\t}\n\t\t\t\treturn r;\n\t\t\t},\n\t\t\thasPassedAndFailed: () => {\n\t\t\t\treturn hasPassed && hasFailed && (args as any as ProducedSelector[]).every(c => c.seenAllValues());\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\n\texport let StatementList: StatementTemplate<any>[] = [];\n\tmodule LetsMakeSomeStatements {\n\t\t// Every [?] is a [?]\n\t\tStatementList.push({\n\t\t\tholes: [PartType.Selector, PartType.Selector],\n\t\t\ttest: (g: Garden, args: [ProducedSelector, ProducedSelector]) => {\n\t\t\t\tlet didAnyTests = false;\n\t\t\t\tfor (var i = 0; i < Gardens.Size; i++) {\n\t\t\t\t\tif (args[0].test(g, i)) {\n\t\t\t\t\t\tif(!args[1].test(g, i)) return StateTestResult.Fail;\n\t\t\t\t\t\tdidAnyTests = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn didAnyTests ? StateTestResult.Pass : StateTestResult.WeakPass;\n\t\t\t},\n\t\t\tdescribe: args => {\n\t\t\t\treturn 'Every ' + args[0].getDescription(DescribeContext.Singular) + ' is ' + args[1].getDescription(DescribeContext.Adjectival);\n\t\t\t}\n\t\t});\n\n\t\t// There is exactly 1 [?]\n\t\tStatementList.push({\n\t\t\tholes: [PartType.Selector],\n\t\t\ttest: (g: Garden, args: [ProducedSelector, ProducedSelector]) => {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var i = 0; i < Gardens.Size; i++) {\n\t\t\t\t\tif (args[0].test(g, i)) count++;\n\t\t\t\t}\n\n\t\t\t\treturn count === 1 ? StateTestResult.Pass : StateTestResult.Fail;\n\t\t\t},\n\t\t\tdescribe: args => {\n\t\t\t\treturn 'There is exactly one ' + args[0].description;\n\t\t\t}\n\t\t});\n\n\t\t// There are more [?] than [?]\n\t\tStatementList.push({\n\t\t\tholes: [PartType.Selector, PartType.Selector],\n\t\t\ttest: (g: Garden, args: [ProducedSelector, ProducedSelector]) => {\n\t\t\t\tvar p1c = 0, p2c = 0;\n\t\t\t\tfor (var i = 0; i < Gardens.Size; i++) {\n\t\t\t\t\tif (args[0].test(g, i)) p1c++;\n\t\t\t\t\tif (args[1].test(g, i)) p2c++;\n\t\t\t\t}\n\t\t\t\tif(p1c > p2c && p2c > 0) {\n\t\t\t\t\treturn StateTestResult.Pass;\n\t\t\t\t} else if(p1c > p2c) {\n\t\t\t\t\treturn StateTestResult.WeakPass;\n\t\t\t\t} else {\n\t\t\t\t\treturn StateTestResult.Fail;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdescribe: args => {\n\t\t\t\treturn 'There are more ' + args[0].descriptionPlural + ' than ' + args[1].descriptionPlural;\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction randomElementOf<T>(arr: T[]): T {\n\t\tif (arr.length === 0) {\n\t\t\treturn undefined;\n\t\t} else {\n\t\t\treturn arr[Math.floor(Math.random() * arr.length)];\n\t\t}\n\t}\n\n\tfunction randomWeightedElementOf<T extends { weight: number }>(arr: T[]): T {\n\t\tvar totalWeight = arr.reduce((acc, v) => acc + v.weight, 0);\n\t\tvar rnd = Math.random() * totalWeight;\n\t\tfor (var i = 0; i < arr.length; i++) {\n\t\t\trnd -= arr[i].weight;\n\t\t\tif (rnd <= 0) return arr[i];\n\t\t}\n\t\t// Got destroyed by floating error, just try again\n\t\treturn randomWeightedElementOf(arr);\n\t}\n\n\texport function buildRandomNewSelector(maxPrecedence = 1000000): ProducedSelector {\n\t\tvar choices = SelectorTemplates;\n\n\t\tlet initial = randomWeightedElementOf(choices.filter(p => p.precedence <= maxPrecedence));\n\t\t// Fill in the holes\n\t\tif (initial.childTypes) {\n\t\t\tvar fills = initial.childTypes.map(h => {\n\t\t\t\tif (h === PartType.Selector) {\n\t\t\t\t\treturn buildRandomNewSelector(initial.precedence - 1);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Only know how to fill Selector holes')\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn buildSelector(initial, fills);\n\t\t} else {\n\t\t\treturn buildSelector(initial, []);\n\t\t}\n\t}\n\n\texport function makeEmptyGarden(): Garden {\n\t\tvar g = {} as Garden;\n\t\tg.colors = [];\n\t\tg.shapes = [];\n\t\tfor (var i = 0; i < Gardens.Size; i++) {\n\t\t\tg.colors.push(Gardens.RockColor.Empty);\n\t\t\tg.shapes.push(Gardens.RockShape.Empty);\n\t\t}\n\n\t\treturn g;\n\t}\n\n\texport function gardenToString(g: Garden): string {\n\t\treturn g.colors.join('') + g.shapes.join('');\n\t}\n\n\texport function makeRandomGarden(): Garden {\n\t\tvar g = makeEmptyGarden();\n\t\tblitRandomGardenPair(g, g);\n\t\treturn g;\n\t}\n\n\texport function cloneGarden(g: Garden): Garden {\n\t\tvar result: Garden = {\n\t\t\tcolors: g.colors.slice(0),\n\t\t\tshapes: g.shapes.slice(0)\n\t\t};\n\t\treturn result;\n\t}\n\n\texport function clearGarden(g: Garden) {\n\t\tfor (var i = 0; i < Gardens.Size; i++) {\n\t\t\tg.colors[i] = Gardens.RockColor.Empty;\n\t\t\tg.shapes[i] = Gardens.RockShape.Empty;\n\t\t}\n\t}\n\n\texport function blitRandomGardenPair(g1: Garden, g2: Garden): void {\n\t\tlet placeCount = 0;\n\t\tfor (var i = 0; i < Gardens.Size; i++) {\n\t\t\tif (rnd(7) === 0) {\n\t\t\t\tg1.colors[i] = g2.colors[i] = randomColor();\n\t\t\t\tg1.shapes[i] = g2.shapes[i] = randomShape();\n\t\t\t} else {\n\t\t\t\tplaceCount++;\n\t\t\t\tg1.colors[i] = g2.colors[i] = Gardens.RockColor.Empty;\n\t\t\t\tg1.shapes[i] = g2.shapes[i] = Gardens.RockShape.Empty;\n\t\t\t}\n\t\t}\n\t\tif (placeCount === 0) blitRandomGardenPair(g1, g2);\n\t}\n\n\texport function blitNumberedGarden(g: Garden, stoneCount: number, n: number): void {\n\t\tclearGarden(g);\n\n\t\tlet cellNumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8];\n\t\tfor (let i = 0; i < stoneCount; i++) {\n\t\t\tlet cellNum = getValue(cellNumbers.length);\n\t\t\tlet cell = cellNumbers.splice(cellNum, 1)[0];\n\t\t\tg.colors[cell] = getValue(3) + 1;\n\t\t\tg.shapes[cell] = getValue(3) + 1;\n\t\t}\n\n\t\tfunction getValue(max: number) {\n\t\t\tlet result = n % max;\n\t\t\tn = (n - result) / max;\n\t\t\treturn result;\n\t\t}\n\t}\n\n\texport function mutateGarden(g: Garden): void {\n\t\twhile (true) {\n\t\t\tvar op = rnd(5);\n\t\t\tlet x = rnd(Gardens.Size);\n\t\t\tlet y = rnd(Gardens.Size);\n\t\t\tswitch (op) {\n\t\t\t\tcase 0: // Swap two non-identical cells\n\t\t\t\t\tif (g.colors[x] !== g.colors[y] || g.shapes[x] !== g.shapes[y]) {\n\t\t\t\t\t\tvar tmp: any = g.colors[x];\n\t\t\t\t\t\tg.colors[x] = g.colors[y];\n\t\t\t\t\t\tg.colors[y] = tmp;\n\t\t\t\t\t\ttmp = g.shapes[x];\n\t\t\t\t\t\tg.shapes[x] = g.shapes[y];\n\t\t\t\t\t\tg.shapes[y] = tmp;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1: // Add a stone\n\t\t\t\t\tif (g.colors[x] === Gardens.RockColor.Empty) {\n\t\t\t\t\t\tg.colors[x] = randomColor();\n\t\t\t\t\t\tg.shapes[x] = randomShape();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2: // Remove a stone\n\t\t\t\t\tif (g.colors.filter(x => x !== Gardens.RockColor.Empty).length === 1) continue;\n\n\t\t\t\t\tif (g.colors[x] !== Gardens.RockColor.Empty) {\n\t\t\t\t\t\tg.colors[x] = Gardens.RockColor.Empty;\n\t\t\t\t\t\tg.shapes[x] = Gardens.RockShape.Empty;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3: // Change a color\n\t\t\t\t\tlet c = randomColor();\n\t\t\t\t\tif (g.colors[x] !== Gardens.RockColor.Empty && g.colors[x] !== c) {\n\t\t\t\t\t\tg.colors[x] = c;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4: // Change a shape\n\t\t\t\t\tlet s = randomShape();\n\t\t\t\t\tif (g.shapes[x] !== Gardens.RockShape.Empty && g.shapes[x] !== s) {\n\t\t\t\t\t\tg.shapes[x] = s;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass Indexion {\n\tsizes: number[];\n\tconstructor(...sizes: number[]) {\n\t\tthis.sizes = sizes;\n\t}\n\n\tpublic getValues(index: number): number[] {\n\t\tlet result = new Array<number>(this.sizes.length);\n\t\tthis.fillValues(index, result);\n\t\treturn result;\n\t}\n\n\tpublic fillValues(index: number, result: number[]): void {\n\t\tfor (var i = 0; i < this.sizes.length; i++) {\n\t\t\tresult[i] = index % this.sizes[i];\n\t\t\tindex -= result[i];\n\t\t\tindex /= this.sizes[i];\n\t\t}\n\t}\n\n\tpublic valuesToIndex(values: number[]): number {\n\t\tvar result = 0;\n\t\tvar factor = 1;\n\t\tfor (var i = 0; i < this.sizes.length; i++) {\n\t\t\tresult += values[i] * this.sizes[i] * factor;\n\t\t\tfactor *= this.sizes[i];\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic getAdjacentIndices(index: number): number[][] {\n\t\tvar baseline = this.getValues(index);\n\t\tvar results: number[][] = [];\n\t\tfor (var i = 0; i < this.sizes.length; i++) {\n\t\t\tif(baseline[i] > 0) {\n\t\t\t\tbaseline[i]--;\n\t\t\t\tresults.push(baseline.slice());\n\t\t\t\tbaseline[i]++;\n\t\t\t}\n\t\t\tif(baseline[i] < this.sizes[i] - 1) {\n\t\t\t\tbaseline[i]++;\n\t\t\t\tresults.push(baseline.slice());\n\t\t\t\tbaseline[i]--;\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\n\tpublic distance(index1: number, index2: number): number {\n\t\tlet delta = 0;\n\t\tfor (var i = 0; i < this.sizes.length; i++) {\n\t\t\tvar a = index1 % this.sizes[i];\n\t\t\tvar b = index2 % this.sizes[i];\n\t\t\tdelta += Math.abs(b - a);\n\t\t\tindex1 -= a;\n\t\t\tindex2 -= b;\n\t\t\tindex1 /= this.sizes[i];\n\t\t\tindex2 /= this.sizes[i];\n\t\t}\n\t\treturn delta;\n\t}\n}\n\n\nfunction makeNewExample() {\n\twhile (true) {\n\t\tvar p1 = Koan.buildSelector(Koan.SelectorTemplates[12], []);\n\t\tvar p2 = Koan.buildSelector(Koan.SelectorTemplates[14], []);\n\t\tvar test = Koan.buildStatement(Koan.StatementList[0], [p1, p2]);\n\n\t\tvar examples: Garden[] = [];\n\n\t\tconsole.log('Attempt to generate examples for \"' + test.description + '\"');\n\n\t\tvar maxGarden = /*(9 * 9) + (9 * 9 * 9 * 8) + */(9 * 9 * 9 * 8 * 9 * 7);\n\t\tlet g = Koan.makeEmptyGarden();\n\t\tlet passCount = 0, failCount = 0;\n\t\tlet resultLookup: boolean[] = [];\n\t\tlet lastResult: boolean = undefined;\n\t\tfor (var i = 0; i < maxGarden; i++) {\n\t\t\tKoan.blitNumberedGarden(g, 3, i);\n\t\t\tlet result = test.test(g);\n\t\t\tif(result === Koan.StateTestResult.Pass) {\n\t\t\t\tresultLookup[i] = true;\n\t\t\t\tpassCount++;\n\n\t\t\t\tif (lastResult !== true && examples.length < 10) examples.push(Koan.cloneGarden(g));\n\t\t\t\tlastResult = true;\n\t\t\t} else if (result === Koan.StateTestResult.Fail) {\n\t\t\t\tresultLookup[i] = false;\n\t\t\t\tfailCount++;\n\n\t\t\t\tif (lastResult !== false && examples.length < 10) examples.push(Koan.cloneGarden(g));\n\t\t\t\tlastResult = false;\n\t\t\t}\n\n\t\t\tif (examples.length === 10) break;\n\t\t}\n\n\t\tconsole.log('Rule passes ' + passCount + ' and fails ' + failCount);\n\n\t\t/*\n\t\tif (!test.hasPassedAndFailed()) {\n\t\t\tconsole.log('Rule has unreachable, contradictory, or tautological clauses');\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (passCount === 0 || failCount === 0) {\n\t\t\tconsole.log('Rule is always true or always false');\n\t\t\tcontinue;\n\t\t}\n\t\t*/\n\n\t\tvar h = document.createElement('h2');\n\t\th.innerText = test.description;\n\t\tdocument.body.appendChild(h);\n\n\t\treturn { test: test, examples: examples };\n\t}\n}\n\nlet list: Garden[] = [];\nlet test: Koan.ProducedStatement<any>;\nwindow.onload = function() {\n\tlet rule = makeNewExample();\n\tlet garden = Koan.makeRandomGarden();\n\tlist = rule.examples;\n\ttest = rule.test;\n\n\tfunction renderList() {\n\t\tfunction makeGarden(g: Garden, i: number) {\n\t\t\treturn <GardenDisplay\n\t\t\t\tgarden={g}\n\t\t\t\tkey={i + Koan.gardenToString(g)}\n\t\t\t\ttest={test}\n\t\t\t\tleftButton='✗'\n\t\t\t\trightButton='✎'\n\t\t\t\tonLeftButtonClicked={() => {\n\t\t\t\t\tconsole.log(list.indexOf(g));\n\t\t\t\t\tlist.splice(list.indexOf(g), 1);\n\t\t\t\t\trenderList();\n\t\t\t\t}}\n\t\t\t\tonRightButtonClicked={() => {\n\t\t\t\t\tgarden = g;\n\t\t\t\t\trenderEditor();\n\t\t\t\t}}\n\t\t\t/>;\n\t\t}\n\t\tlet gardenList = <div>{list.map(makeGarden)}</div>;\n\t\tReact.render(gardenList, document.getElementById('results'));\n\t}\n\n\tlet i = 0;\n\tfunction renderEditor() {\n\t\ti++;\n\t\tlet editor = <GardenEditor key={i} test={rule.test} garden={garden} onSaveClicked={(garden) => {\n\t\t\tlist.push(garden);\n\t\t\trenderList();\n\t\t}} />;\n\t\tReact.render(editor, document.getElementById('editor'));\n\t}\n\n\trenderList();\n\trenderEditor();\n}\n\nfunction classNames(nameMap: any): string {\n\treturn Object.keys(nameMap).filter(k => nameMap[k]).join(' ');\n}\n\ninterface GardenCellProps extends React.Props<{}> {\n\tcolor: Gardens.RockColor;\n\tshape: Gardens.RockShape;\n\tindex: number;\n\n\tmovable?: boolean;\n\tonEdit?(newColor: Gardens.RockColor, newShape: Gardens.RockShape): void;\n}\ninterface GardenCellState {\n\tisDragging?: boolean;\n}\nclass GardenCell extends React.Component<GardenCellProps, GardenCellState> {\n\tstate: GardenCellState = {};\n\tignoreNextEdit = false;\n\n\trender() {\n\t\tvar classes = ['cell', 'index_' + this.props.index];\n\n\t\tif (this.state.isDragging) {\n\t\t\t// Render as blank\n\t\t} else {\n\t\t\tclasses.push(Gardens.RockColor[this.props.color], Gardens.RockShape[this.props.shape]);\n\t\t}\n\n\t\tif (this.props.movable) classes.push('movable');\n\t\tlet events: React.HTMLAttributes = {\n\t\t\tonDragStart: (e) => {\n\t\t\t\tthis.ignoreNextEdit = false;\n\t\t\t\te.dataTransfer.dropEffect = 'copyMove';\n\t\t\t\te.dataTransfer.effectAllowed = 'move';\n\t\t\t\te.dataTransfer.setData('shape', this.props.shape.toString());\n\t\t\t\te.dataTransfer.setData('color', this.props.color.toString());\n\n\t\t\t\tlet drag = document.getElementById(getGardenName(this.props.color, this.props.shape));\n\t\t\t\tlet xfer: any = (e.nativeEvent as DragEvent).dataTransfer;\n\t\t\t\txfer.setDragImage(drag, drag.clientWidth * 0.5, drag.clientHeight * 0.5);\n\n\t\t\t\tthis.setState({ isDragging: true });\n\t\t\t},\n\t\t\tonDragEnter: (e) => {\n\t\t\t\te.dataTransfer.dropEffect = 'move';\n\t\t\t\te.preventDefault();\n\t\t\t},\n\t\t\tonDragOver: (e) => {\n\t\t\t\te.dataTransfer.dropEffect = 'move';\n\t\t\t\te.preventDefault();\n\t\t\t},\n\t\t\tonDragEnd: (e) => {\n\t\t\t\tthis.setState({ isDragging: false });\n\t\t\t\tif (!this.ignoreNextEdit) {\n\t\t\t\t\tthis.props.onEdit && this.props.onEdit(undefined, undefined);\n\t\t\t\t}\n\t\t\t},\n\t\t\tdraggable: true\n\t\t}\n\n\t\tlet handleDrop = (event: React.DragEvent) => {\n\t\t\tif(this.props.onEdit) {\n\t\t\t\tif (this.state.isDragging) {\n\t\t\t\t\t// Dragged to self, don't do anything\n\t\t\t\t\tthis.ignoreNextEdit = true;\n\t\t\t\t} else {\n\t\t\t\t\tlet shape: Gardens.RockShape = +event.dataTransfer.getData('shape');\n\t\t\t\t\tlet color: Gardens.RockColor = +event.dataTransfer.getData('color');\n\t\t\t\t\tthis.props.onEdit(color, shape);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn <span className={classes.join(' ')} onDrop={handleDrop} {...this.props.movable ? events : {}} />;\n\t}\n}\n\ninterface GardenDisplayProps extends React.Props<GardenDisplay> {\n\tgarden?: Garden;\n\ttest?: Koan.ProducedStatement<any>;\n\n\tleftButton?: string;\n\trightButton?: string;\n\tonLeftButtonClicked?(): void;\n\tonRightButtonClicked?(): void;\n\n\teditable?: boolean;\n\tonChanged?(newGarden: Garden): void;\n}\ninterface GardenDisplayState {\n\tgarden?: Garden;\n}\nclass GardenDisplay extends React.Component<GardenDisplayProps, GardenDisplayState> {\n\tstate = {\n\t\tgarden: Koan.cloneGarden(this.props.garden)\n\t};\n\n\tleftClicked = () => {\n\t\tthis.props.onLeftButtonClicked && this.props.onLeftButtonClicked();\n\t};\n\n\trightClicked = () => {\n\t\tthis.props.onRightButtonClicked && this.props.onRightButtonClicked();\n\t};\n\n\trender() {\n\t\tlet g = this.state.garden;\n\t\tlet pass = (this.props.test && this.props.test.test(this.state.garden));\n\n\t\tlet classes = {\n\t\t\tgarden: true,\n\t\t\tunknown: pass === undefined,\n\t\t\tpass: pass === Koan.StateTestResult.Pass || pass === Koan.StateTestResult.WeakPass,\n\t\t\tfail: pass === Koan.StateTestResult.Fail,\n\t\t\teditable: this.props.editable\n\t\t};\n\n\t\tvar children = g.colors.map((_, i) => (\n\t\t\t<GardenCell\n\t\t\t\tkey={i}\n\t\t\t\tcolor={g.colors[i]}\n\t\t\t\tshape={g.shapes[i]}\n\t\t\t\tindex={i}\n\t\t\t\tmovable={this.props.editable}\n\t\t\t\tonEdit={(newColor, newShape) => {\n\t\t\t\t\tif(this.props.editable) {\n\t\t\t\t\t\tlet newGarden = Koan.cloneGarden(this.state.garden);\n\t\t\t\t\t\tnewGarden.colors[i] = newColor;\n\t\t\t\t\t\tnewGarden.shapes[i] = newShape;\n\t\t\t\t\t\tthis.setState({ garden: newGarden });\n\t\t\t\t\t\tthis.props.onChanged && this.props.onChanged(newGarden);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t/>));\n\n\t\treturn <div className=\"gardenDisplay\">\n\t\t\t<div className={classNames(classes)}>{children}</div>\n\t\t\t<span className=\"infoRow\">\n\t\t\t\t{this.props.leftButton && <div className=\"button left\" onClick={this.leftClicked}>{this.props.leftButton}</div>}\n\t\t\t\t<div className={\"passfail \" + (pass ? 'pass' : 'fail')}>{pass ? '✓' : '🚫'}</div>\n\t\t\t\t{this.props.rightButton && <div className=\"button right\" onClick={this.rightClicked}>{this.props.rightButton}</div>}\n\t\t\t</span>\n\t\t</div>;\n\t}\n}\n\ninterface GardenEditorProps extends React.Props<GardenEditor> {\n\tonSaveClicked?(garden: Garden): void;\n\ttest?: Koan.ProducedStatement<any>;\n\tgarden?: Garden;\n}\ninterface GardenEditorState {\n\tgarden?: Garden;\n\tpass?: boolean;\n}\nclass GardenEditor extends React.Component<GardenEditorProps, {}> {\n\tstate = { garden: this.props.garden };\n\n\tsave = () => {\n\t\tthis.props.onSaveClicked && this.props.onSaveClicked(this.state.garden);\n\t};\n\n\trender() {\n\t\treturn <div className=\"editor\">\n\t\t\t<GardenDisplay garden={this.state.garden} test={this.props.test} editable onChanged={g => this.setState({ garden: g }) } />\n\t\t\t<StonePalette />\n\t\t\t<div className=\"button save\" onClick={this.save}>{'💾'}</div>\n\t\t</div>;\n\t}\n}\n\nclass StonePalette extends React.Component<{}, {}> {\n\trender() {\n\t\tlet items: JSX.Element[] = [];\n\t\tGardens.RockColors.forEach(color => {\n\t\t\tGardens.RockShapes.forEach(shape => {\n\t\t\t\tlet name = getGardenName(color, shape);\n\t\t\t\tlet extraProps = { id: name, key: name };\n\t\t\t\tlet index = items.length;\n\t\t\t\titems.push(<GardenCell\n\t\t\t\t\tcolor={color}\n\t\t\t\t\tshape={shape}\n\t\t\t\t\tindex={index}\n\t\t\t\t\tmovable\n\t\t\t\t\t{...extraProps} />)\n\t\t\t});\n\t\t});\n\t\treturn <div className=\"palette\">{items}</div>;\n\t}\n}\n\nfunction getGardenName(color: Gardens.RockColor, shape: Gardens.RockShape) {\n\treturn 'draggable.' + Gardens.RockShape[shape] + '.' + Gardens.RockColor[color];\n}\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Unity3D Asset/GapTile.mat",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!21 &2100000\nMaterial:\n  serializedVersion: 3\n  m_ObjectHideFlags: 0\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_Name: GapTile\n  m_Shader: {fileID: 10750, guid: 0000000000000000f000000000000000, type: 0}\n  m_ShaderKeywords: []\n  m_CustomRenderQueue: -1\n  m_SavedProperties:\n    serializedVersion: 2\n    m_TexEnvs:\n      data:\n        first:\n          name: _MainTex\n        second:\n          m_Texture: {fileID: 2800000, guid: e503f0c932121ce4881ab1605349488b, type: 3}\n          m_Scale: {x: 1, y: 1}\n          m_Offset: {x: 0, y: 0}\n    m_Floats: {}\n    m_Colors:\n      data:\n        first:\n          name: _Color\n        second: {r: 1, g: 1, b: 1, a: 1}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Unity3D Asset/Hover.anim",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!74 &7400000\nAnimationClip:\n  m_ObjectHideFlags: 0\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 0}\n  m_Name: Hover\n  serializedVersion: 4\n  m_AnimationType: 1\n  m_Compressed: 0\n  m_UseHighQualityCurve: 1\n  m_RotationCurves: []\n  m_CompressedRotationCurves: []\n  m_PositionCurves: []\n  m_ScaleCurves:\n  - curve:\n      serializedVersion: 2\n      m_Curve:\n      - time: 0\n        value: {x: .25, y: .25, z: .25}\n        inSlope: {x: 1.15384614, y: 1.15384614, z: 1.15384614}\n        outSlope: {x: 1.15384614, y: 1.15384614, z: 1.15384614}\n        tangentMode: 823140368\n      - time: .649999976\n        value: {x: 1, y: 1, z: 1}\n        inSlope: {x: 1.15384614, y: 1.15384614, z: 1.15384614}\n        outSlope: {x: 1.15384614, y: 1.15384614, z: 1.15384614}\n        tangentMode: 0\n      m_PreInfinity: 2\n      m_PostInfinity: 2\n    path: Radius\n  m_FloatCurves:\n  - curve:\n      serializedVersion: 2\n      m_Curve:\n      - time: 0\n        value: 1\n        inSlope: -1.53846157\n        outSlope: -1.53846157\n        tangentMode: 10\n      - time: .649999976\n        value: 0\n        inSlope: -1.53846157\n        outSlope: -1.53846157\n        tangentMode: 10\n      m_PreInfinity: 2\n      m_PostInfinity: 2\n    attribute: m_Color.a\n    path: Radius\n    classID: 212\n    script: {fileID: 0}\n  m_PPtrCurves: []\n  m_SampleRate: 60\n  m_WrapMode: 0\n  m_Bounds:\n    m_Center: {x: 0, y: 0, z: 0}\n    m_Extent: {x: 0, y: 0, z: 0}\n  m_ClipBindingConstant:\n    genericBindings: []\n    pptrCurveMapping: []\n  m_AnimationClipSettings:\n    serializedVersion: 2\n    m_StartTime: 0\n    m_StopTime: .649999976\n    m_OrientationOffsetY: 0\n    m_Level: 0\n    m_CycleOffset: 0\n    m_LoopTime: 0\n    m_LoopBlend: 0\n    m_LoopBlendOrientation: 0\n    m_LoopBlendPositionY: 0\n    m_LoopBlendPositionXZ: 0\n    m_KeepOriginalOrientation: 0\n    m_KeepOriginalPositionY: 1\n    m_KeepOriginalPositionXZ: 0\n    m_HeightFromFeet: 0\n    m_Mirror: 0\n  m_EditorCurves:\n  - curve:\n      serializedVersion: 2\n      m_Curve:\n      - time: 0\n        value: .25\n        inSlope: 1.15384614\n        outSlope: 1.15384614\n        tangentMode: 10\n      - time: .649999976\n        value: 1\n        inSlope: 1.15384614\n        outSlope: 1.15384614\n        tangentMode: 10\n      m_PreInfinity: 2\n      m_PostInfinity: 2\n    attribute: m_LocalScale.x\n    path: Radius\n    classID: 4\n    script: {fileID: 0}\n  - curve:\n      serializedVersion: 2\n      m_Curve:\n      - time: 0\n        value: .25\n        inSlope: 1.15384614\n        outSlope: 1.15384614\n        tangentMode: 10\n      - time: .649999976\n        value: 1\n        inSlope: 1.15384614\n        outSlope: 1.15384614\n        tangentMode: 10\n      m_PreInfinity: 2\n      m_PostInfinity: 2\n    attribute: m_LocalScale.y\n    path: Radius\n    classID: 4\n    script: {fileID: 0}\n  - curve:\n      serializedVersion: 2\n      m_Curve:\n      - time: 0\n        value: .25\n        inSlope: 1.15384614\n        outSlope: 1.15384614\n        tangentMode: 10\n      - time: .649999976\n        value: 1\n        inSlope: 1.15384614\n        outSlope: 1.15384614\n        tangentMode: 10\n      m_PreInfinity: 2\n      m_PostInfinity: 2\n    attribute: m_LocalScale.z\n    path: Radius\n    classID: 4\n    script: {fileID: 0}\n  - curve:\n      serializedVersion: 2\n      m_Curve:\n      - time: 0\n        value: 1\n        inSlope: -1.53846157\n        outSlope: -1.53846157\n        tangentMode: 10\n      - time: .649999976\n        value: 0\n        inSlope: -1.53846157\n        outSlope: -1.53846157\n        tangentMode: 10\n      m_PreInfinity: 2\n      m_PostInfinity: 2\n    attribute: m_Color.a\n    path: Radius\n    classID: 212\n    script: {fileID: 0}\n  m_EulerEditorCurves: []\n  m_Events: []\n"
  },
  {
    "path": "src/test/resources/samples/langs/Unity3D Asset/Tiles.meta",
    "content": "fileFormatVersion: 2\nguid: 9e5c401e9d1d5415fbf2854b29c004c4\nfolderAsset: yes\nDefaultImporter:\n  userData: \n"
  },
  {
    "path": "src/test/resources/samples/langs/Unity3D Asset/TimeManager.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!5 &1\nTimeManager:\n  m_ObjectHideFlags: 0\n  Fixed Timestep: .0199999996\n  Maximum Allowed Timestep: .333333343\n  m_TimeScale: 1\n"
  },
  {
    "path": "src/test/resources/samples/langs/Unity3D Asset/canvas_Fullscreen_Fader.prefab",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!1 &100000\nGameObject:\n  m_ObjectHideFlags: 0\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 100100000}\n  serializedVersion: 4\n  m_Component:\n  - 224: {fileID: 22400000}\n  - 222: {fileID: 22200000}\n  - 114: {fileID: 11400004}\n  - 114: {fileID: 11400002}\n  - 114: {fileID: 11400000}\n  m_Layer: 5\n  m_Name: Fader_Tint\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!1 &100002\nGameObject:\n  m_ObjectHideFlags: 0\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 100100000}\n  serializedVersion: 4\n  m_Component:\n  - 224: {fileID: 22400002}\n  - 223: {fileID: 22300000}\n  m_Layer: 5\n  m_Name: canvas_Fullscreen_Fader\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!114 &11400000\nMonoBehaviour:\n  m_ObjectHideFlags: 1\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 100100000}\n  m_GameObject: {fileID: 100000}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 0e5786b8fa0564f23a168e1c45671759, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  fadeOut: 1\n  alwaysUseClearAsStartColor: 0\n  _fadeOnStart: 1\n  _startFaded: 0\n  _fadeOnStartDelay: 1\n  _fadeTime: .800000012\n--- !u!114 &11400002\nMonoBehaviour:\n  m_ObjectHideFlags: 1\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 100100000}\n  m_GameObject: {fileID: 100000}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: c6d2a81ac2fb947e8a9aa86b4133fafd, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  _toDeactivate: []\n--- !u!114 &11400004\nMonoBehaviour:\n  m_ObjectHideFlags: 1\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 100100000}\n  m_GameObject: {fileID: 100000}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: .996078432, g: .949019611, b: .862745106, a: 1}\n  m_Sprite: {fileID: 0}\n  m_Type: 0\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n--- !u!222 &22200000\nCanvasRenderer:\n  m_ObjectHideFlags: 1\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 100100000}\n  m_GameObject: {fileID: 100000}\n--- !u!223 &22300000\nCanvas:\n  m_ObjectHideFlags: 1\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 100100000}\n  m_GameObject: {fileID: 100002}\n  m_Enabled: 1\n  serializedVersion: 2\n  m_RenderMode: 0\n  m_Camera: {fileID: 0}\n  m_PlaneDistance: 100\n  m_PixelPerfect: 1\n  m_ReceivesEvents: 1\n  m_OverrideSorting: 0\n  m_OverridePixelPerfect: 0\n  m_SortingLayerID: 0\n  m_SortingOrder: 1\n--- !u!224 &22400000\nRectTransform:\n  m_ObjectHideFlags: 1\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 100100000}\n  m_GameObject: {fileID: 100000}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 22400002}\n  m_RootOrder: 0\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: .5, y: .5}\n--- !u!224 &22400002\nRectTransform:\n  m_ObjectHideFlags: 1\n  m_PrefabParentObject: {fileID: 0}\n  m_PrefabInternal: {fileID: 100100000}\n  m_GameObject: {fileID: 100002}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 0, y: 0, z: 0}\n  m_Children:\n  - {fileID: 22400000}\n  m_Father: {fileID: 0}\n  m_RootOrder: 0\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0, y: 0}\n--- !u!1001 &100100000\nPrefab:\n  m_ObjectHideFlags: 1\n  serializedVersion: 2\n  m_Modification:\n    m_TransformParent: {fileID: 0}\n    m_Modifications: []\n    m_RemovedComponents: []\n  m_ParentPrefab: {fileID: 0}\n  m_RootGameObject: {fileID: 100002}\n  m_IsPrefabParent: 1\n  m_IsExploded: 1\n"
  },
  {
    "path": "src/test/resources/samples/langs/Unix Assembly/hello.ms",
    "content": "# output(): Hello, world.\\n\n# mach(): all\n\n# Emit hello world while switching back and forth between arm/thumb.\n# ??? Unfinished\n\n\t.macro invalid\n# This is \"undefined\" but it's not properly decoded yet.\n\t.word 0x07ffffff\n# This is stc which isn't recognized yet.\n\tstc 0,cr0,[r0]\n\t.endm\n\n\t.global _start\n_start:\n# Run some simple insns to confirm the engine is at least working.\n\tnop\n\n# Skip over output text.\n\n\tbl skip_output\n\nhello_text:\n\t.asciz \"Hello, world.\\n\"\n\n\t.p2align 2\nskip_output:\n\n# Prime loop.\n\n\tmov r4, r14\n\noutput_next:\n\n# Switch arm->thumb to output next chacter.\n# At this point r4 must point to the next character to output.\n\n\tadr r0, into_thumb + 1\n\tbx r0\n\ninto_thumb:\n\t.thumb\n\n# Output a character.\n\n\tmov r0,#3 @ writec angel call\n\tmov r1,r4\n\tswi 0xab @ ??? Confirm number.\n\n# Switch thumb->arm.\n\n\tadr r5, back_to_arm\n\tbx r5\n\n\t.p2align 2\nback_to_arm:\n\t.arm\n\n# Load next character, see if done.\n\n\tadd r4,r4,#1\n\tsub r3,r3,r3\n\tldrb r5,[r4,r3]\n\tteq r5,#0\n\tbeq done\n\n# Output a character (in arm mode).\n\n\tmov r0,#3\n\tmov r1,r4\n\tswi #0x123456\n\n# Load next character, see if done.\n\n\tadd r4,r4,#1\n\tsub r3,r3,r3\n\tldrb r5,[r4,r3]\n\tteq r5,#0\n\tbne output_next\n\ndone:\n\tmov r0,#0x18\n\tldr r1,exit_code\n\tswi #0x123456\n\n# If that fails, try to die with an invalid insn.\n\n\tinvalid\n\nexit_code:\n\t.word 0x20026\n"
  },
  {
    "path": "src/test/resources/samples/langs/Unix Assembly/hello.s",
    "content": "\t.cstring\nLC0:\n\t.ascii \"Hello World\\0\"\n\t.text\n.globl _main\n_main:\nLFB3:\n\tpushq\t%rbp\nLCFI0:\n\tmovq\t%rsp, %rbp\nLCFI1:\n\tleaq\tLC0(%rip), %rdi\n\tcall\t_puts\n\tmovl\t$0, %eax\n\tleave\n\tret\nLFE3:\n\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\nEH_frame1:\n\t.set L$set$0,LECIE1-LSCIE1\n\t.long L$set$0\nLSCIE1:\n\t.long\t0x0\n\t.byte\t0x1\n\t.ascii \"zR\\0\"\n\t.byte\t0x1\n\t.byte\t0x78\n\t.byte\t0x10\n\t.byte\t0x1\n\t.byte\t0x10\n\t.byte\t0xc\n\t.byte\t0x7\n\t.byte\t0x8\n\t.byte\t0x90\n\t.byte\t0x1\n\t.align 3\nLECIE1:\n.globl _main.eh\n_main.eh:\nLSFDE1:\n\t.set L$set$1,LEFDE1-LASFDE1\n\t.long L$set$1\nLASFDE1:\n\t.long\tLASFDE1-EH_frame1\n\t.quad\tLFB3-.\n\t.set L$set$2,LFE3-LFB3\n\t.quad L$set$2\n\t.byte\t0x0\n\t.byte\t0x4\n\t.set L$set$3,LCFI0-LFB3\n\t.long L$set$3\n\t.byte\t0xe\n\t.byte\t0x10\n\t.byte\t0x86\n\t.byte\t0x2\n\t.byte\t0x4\n\t.set L$set$4,LCFI1-LCFI0\n\t.long L$set$4\n\t.byte\t0xd\n\t.byte\t0x6\n\t.align 3\nLEFDE1:\n\t.subsections_via_symbols\n"
  },
  {
    "path": "src/test/resources/samples/langs/Uno/PlayerPads.uno",
    "content": "using Uno;\nusing Uno.Collections;\nusing Uno.Graphics;\nusing Uno.Scenes;\nusing Uno.Designer;\nusing Uno.Content;\nusing Uno.Content.Models;\nusing Uno.UI;\n\nnamespace PONG2D\n{\n\tpublic class PlayerPads : Node\n\t{\n\n\t\tImage _player1Image;\n\t\tImage _player2Image;\n\n\t\t[Inline]\n\t\tpublic Image Player1\n\t\t{\n\t\t\tget { return _player1Image; }\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (_player1Image != value)\n\t\t\t\t{\n\t\t\t\t\t_player1Image = value;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t[Inline]\n\t\tpublic Image Player2\n\t\t{\n\t\t\tget { return _player2Image; }\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (_player2Image != value)\n\t\t\t\t{\n\t\t\t\t\t_player2Image = value;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t[Hide]\n\t\tpublic float2 Player1Pos\n\t\t{\n\t\t\tget { return (Player1.ActualPosition); }\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (Player1 != null)\n\t\t\t\t\tPlayer1.Position = value;\n\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t\t[Hide]\n\t\tpublic float2 Player2Pos\n\t\t{\n\t\t\tget { return (Player2.ActualPosition); }\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (Player2 != null)\n\t\t\t\t\tPlayer2.Position = value;\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic Rect Player1Rect\n\t\t{\n\t\t\tget { return new Rect(Player1Pos, float2(Player1.Width, Player2.Height)); }\n\t\t\tset\n\t\t\t{\n\t\t\t\tPlayer1Pos = value.Position;\n\t\t\t\tif (Player1 != null)\n\t\t\t\t{\n\t\t\t\t\tPlayer1.Width = value.Size.X;\n\t\t\t\t\tPlayer1.Height = value.Size.Y;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic Rect Player2Rect\n\t\t{\n\t\t\tget { return new Rect(Player2Pos, float2(Player2.Width, Player2.Height)); }\n\t\t\tset\n\t\t\t{\n\t\t\t\tPlayer2Pos = value.Position;\n\t\t\t\tif (Player2 != null)\n\t\t\t\t{\n\t\t\t\t\tPlayer2.Width = value.Size.X;\n\t\t\t\t\tPlayer2.Height = value.Size.Y;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic Ball Ball\n\t\t{\n\t\t\tget;\n\t\t\tset;\n\t\t}\n\t\t\n\t\tpublic float PadVelocity { get; set; }\n\n\t\tpublic PlayerPads()\n\t\t{\n\n\t\t}\n\n\t\tvoid UpdatePositions()\n\t\t{\n\t\t\t\n\t\t}\n\n\t\tprotected override void OnUpdate()\n\t\t{\n\t\t\tbase.OnUpdate();\n\n\t\t\tif (Input.IsKeyDown(Uno.Platform.Key.W))\n\t\t\t{\n\t\t\t\tPlayer1Pos = float2(0, Player1Pos.Y - PadVelocity);\n\t\t\t}\n\n\t\t\tif (Input.IsKeyDown(Uno.Platform.Key.S))\n\t\t\t{\n\t\t\t\tPlayer1Pos = float2(0, Player1Pos.Y + PadVelocity);\n\t\t\t}\n\n\t\t\tif (Input.IsKeyDown(Uno.Platform.Key.Up))\n\t\t\t{\n\t\t\t\tPlayer2Pos = float2(0, Player2Pos.Y - PadVelocity);\n\t\t\t}\n\n\t\t\tif (Input.IsKeyDown(Uno.Platform.Key.Down))\n\t\t\t{\n\t\t\t\tPlayer2Pos = float2(0, Player2Pos.Y + PadVelocity);\n\t\t\t}\n\t\t\t\n\t\t\tif (Ball != null)\n\t\t\t{\n\t\t\t\t\n\t\t\t\tif (Ball.BallRectangle.Intersects(Player1Rect) ||\n\t\t\t\t\tBall.BallRectangle.Intersects(Player2Rect))\n\t\t\t\t{\n\t\t\t\t\t\n\t\t\t\t\tBall.BallVelocity = float2(Ball.BallVelocity.X * -1f, Ball.BallVelocity.Y);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t}\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Uno/Pong.uno",
    "content": "using Uno;\nusing Uno.Collections;\nusing Uno.Graphics;\nusing Uno.Scenes;\nusing Uno.Content;\nusing Uno.Content.Models;\n\nnamespace PONG2D\n{\n\tpublic class Pong : Node\n\t{\n\t\tfloat2 _player1Pos;\n\t\tfloat2 _player2Pos;\n\t\tfloat2 ballPosition;\n\t\tfloat2 ballVelocity;\n\t\tfloat2 rectangleSize;\n\t\t\n\t\tRect player1Rect;\n\t\tRect player2Rect;\n\t\tRect ballRect;\n\t\t\n\t\tfloat2 resolution = Context.VirtualResolution;\n\t\t\n\t\tRandom random = new Random(1);\n\t\t\n\t\t\n\t\tfloat2 Player1Pos\n\t\t{\n\t\t\tget { return _player1Pos; }\n\t\t\tset\n\t\t\t{\n\t\t\t\t_player1Pos = Math.Clamp(value, float2(0, 0), resolution - rectangleSize);\n\t\t\t}\n\t\t}\n\t\t\n\t\tfloat2 Player2Pos\n\t\t{\n\t\t\tget { return _player2Pos; }\n\t\t\tset\n\t\t\t{\n\t\t\t\t_player2Pos = Math.Clamp(value, float2(0, 0), resolution - rectangleSize);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic Pong()\n\t\t{\n\t\t\tUno.Scenes.Input.AddGlobalListener(this);\n\t\t}\n\t\t\n\t\tprotected override void OnInitialize()\n\t\t{\n\t\t\tbase.OnInitialize();\n\t\t\tUpdateValues();\t\n\t\t\t\n\t\t}\n\n\t\tvoid UpdateValues()\n\t\t{\n\t\t\trectangleSize = float2(resolution.X / 80f, resolution.Y / 5f);\n\t\t\t_player1Pos = float2(0f);\n\t\t\t_player2Pos = float2(Context.VirtualResolution.X - rectangleSize.X, 0f);\n\t\t\t\n\t\t\tplayer1Rect = new Rect(_player1Pos, rectangleSize);\n\t\t\tplayer2Rect = new Rect(_player2Pos, rectangleSize);\n\t\t\t\n\t\t\tballPosition = float2(resolution.X * 0.5f - 10f, resolution.Y * 0.5f - 10f);\n\t\t\tballRect = new Rect(ballPosition, float2(20f));\n\t\t\t\n\t\t\t\n\t\t\tSpwanBall();\n\t\t\t\n\t\t}\n\t\t\n\t\tvoid SpwanBall()\n\t\t{\n\t\t\tballRect.Position = float2(resolution.X * 0.5f - 10f, resolution.Y * 0.5f - 10f);\n\t\t\tballVelocity = float2(5f, 10f) * 0.5f;\n\t\t}\n\t\t\n\t\tvoid OnWindowResize(object sender, EventArgs args)\n\t\t{\n\t\t\t//UpdateValues();\n\t\t}\n\t\t\n\t\tprotected override void OnUpdate()\n\t\t{\n\t\t\tbase.OnUpdate();\n\t\t\t\n\t\t\tvar padVelocity = resolution.Y * (float)Application.Current.FrameInterval * 4f;\n\t\t\tif (Input.IsKeyDown(Uno.Platform.Key.Up))\n\t\t\t{\n\t\t\t\tPlayer1Pos = float2(Player1Pos.X, Player1Pos.Y - padVelocity);\t\n\t\t\t}\n\t\t\t\n\t\t\tif (Input.IsKeyDown(Uno.Platform.Key.Down))\n\t\t\t{\n\t\t\t\tPlayer1Pos = float2(Player1Pos.X, Player1Pos.Y + padVelocity);\t\n\t\t\t}\n\n\t\t\tif (Input.IsKeyDown(Uno.Platform.Key.W))\n\t\t\t{\n\t\t\t\tPlayer2Pos = float2(Player2Pos.X, Player2Pos.Y - padVelocity);\t\n\t\t\t}\n\n\t\t\tif (Input.IsKeyDown(Uno.Platform.Key.S))\n\t\t\t{\n\t\t\t\tPlayer2Pos = float2(Player2Pos.X, Player2Pos.Y + padVelocity);\t\n\t\t\t}\n\t\t\tplayer1Rect.Position = Player1Pos;\n\t\t\tplayer2Rect.Position = Player2Pos;\n\t\t\t\n\t\t\tif (ballRect.Position.X > resolution.X || ballRect.Position.X < 0)\n\t\t\t{\n\t\t\t\tSpwanBall();\n\t\t\t}\n\t\t\tif (ballRect.Position.Y > resolution.Y ||\n\t\t\t\tballRect.Position.Y < 0)\n\t\t\t{\n\t\t\t\tballVelocity.Y *= -1f;\n\t\t\t}\n\t\t\t\n\t\t\tif (ballRect.Intersects(player1Rect) ||\n\t\t\t\tballRect.Intersects(player2Rect))\n\t\t\t{\n\t\t\t\tballVelocity.X *= -1f;\n\t\t\t}\n\t\t\t\n\t\t\tballRect.Position += ballVelocity;\n\t\t\t\n\t\t}\n\t\t\n        protected override void OnDraw()\n        {\n\t\t\tUno.Drawing.RoundedRectangle.Draw(player1Rect.Position, player1Rect.Size, float4(1f), 0);\n\t\t\tUno.Drawing.RoundedRectangle.Draw(player2Rect.Position, player2Rect.Size, float4(1f), 0);\n\t\t\tUno.Drawing.RoundedRectangle.Draw(ballRect.Position, ballRect.Size, float4(1f), 0f);\n        }\n\t}\n}"
  },
  {
    "path": "src/test/resources/samples/langs/Uno/TowerBlock.uno",
    "content": "using Uno;\nusing Uno.Collections;\nusing Uno.Graphics;\nusing Uno.Scenes;\nusing Uno.Content;\nusing Uno.Content.Models;\nusing Uno.Physics.Box2D;\n\nusing TowerBuilder.Box2DMath;\n\nnamespace TowerBuilder\n{\n\tpublic class TowerBlock : TestBed\n\t{\n\t\tBody floorBody, deleteBody, mouseBody;\n\n\t\tprivate List<Body> bodies = new List<Body>();\n\t\tprivate List<Body> bodiesToDelete = new List<Body>();\n\n\t\tprivate ContactListener contactListener;\n\n\t\tprotected override void OnInitializeTestBed()\n\t\t{\n\t\t\tWorld.Gravity = float2(0, -25.0f);\n\t\t\tWorld.ContactListener = contactListener = new ContactListener(this);\n\t\t\t\n\t\t\tbodies.Clear();\n\t\t\tbodiesToDelete.Clear();\n\n\t\t\tCreateFloor();\n\t\t\tCreateDeleteBody();\n\t\t\tCreateBox2();\n\t\t}\n\n\t\tvoid CreateFloor()\n\t\t{\n\t\t\tvar bodyDef = new BodyDef();\n\t\t\tbodyDef.position = float2(0, -40.0f);\n\n\t\t\tfloorBody = World.CreateBody(bodyDef);\n\n\t\t\tvar shape = new PolygonShape();\n\t\t\tshape.SetAsBox(30.0f, 10.0f);\n\n\t\t\tvar fixtureDef = new FixtureDef();\n\t\t\tfixtureDef.shape = shape;\n\t\t\tfixtureDef.density = 1.0f;\n\n\t\t\tfloorBody.CreateFixture(fixtureDef);\n\t\t}\n\n\t\tvoid CreateDeleteBody()\n\t\t{\n\t\t\tvar bodyDef = new BodyDef();\n\t\t\tbodyDef.position = float2(0, -44.0f);\n\n\t\t\tdeleteBody = World.CreateBody(bodyDef);\n\n\t\t\tvar shape = new PolygonShape();\n\t\t\tshape.SetAsBox(200.0f, 10.0f);\n\n\t\t\tvar fixtureDef = new FixtureDef();\n\t\t\tfixtureDef.shape = shape;\n\t\t\tfixtureDef.density = 1.0f;\n\n\t\t\tdeleteBody.CreateFixture(fixtureDef);\n\t\t}\n\n\t\tRandom random = new Random((int) (Uno.Diagnostics.Clock.GetSeconds() * 1000000));\n\t\tvoid CreateBox2()\n\t\t{\n\t\t\tvar bodyDef = new BodyDef();\n\t\t\tbodyDef.type = BodyType.Dynamic;\n\t\t\tbodyDef.position = float2(random.NextFloat(-25f, 25f), 50.0f);\n\t\t\tbodyDef.angularVelocity = random.NextFloat() * 40 - 20;\n\t\t\tbodyDef.userData = float3(0, 0, 0);\n\n\t\t\tvar body = World.CreateBody(bodyDef);\n\n\t\t\tvar shape = new PolygonShape();\n\t\t\tshape.SetAsBox(0.75f, 0.75f);\n\n\t\t\tvar fixtureDef = new FixtureDef();\n\t\t\tfixtureDef.shape = shape;\n\t\t\tfixtureDef.density = 5.0f;\n\t\t\t//fixtureDef.friction = 0.75f;\n\n\t\t\tbody.CreateFixture(fixtureDef);\n\n\t\t\tbodies.Add(body);\n\t\t}\n\t\t\n\t\tprivate int c = 0;\n\t\tprotected override void OnFixedUpdate()\n\t\t{\n\t\t\tbase.OnFixedUpdate();\n\t\t\t\n\t\t\tdebug_log bodies.Count;\n\t\t\tif(c++ % 8 == 0 && bodies.Count < 20) CreateBox2();\n\n\t\t\tforeach(var body in bodiesToDelete)\n\t\t\t{\n\t\t\t\tWorld.DestroyBody(body);\n\t\t\t\tbodies.Remove(body);\n\t\t\t}\n\n\t\t\tbodiesToDelete.Clear();\n\t\t}\n\n\t\tpublic class ContactListener : IContactListener\n\t\t{\n\t\t\tprivate TowerBlock b;\n\t\t\tpublic ContactListener(TowerBlock b)\n\t\t\t{\n\t\t\t\tthis.b = b;\n\t\t\t}\n\n\t\t\tpublic void BeginContact(Contact contact)\n\t\t\t{\n\t\t\t\tif(contact.GetFixtureA().GetBody() == b.deleteBody)\n\t\t\t\t{\n\t\t\t\t\tb.bodiesToDelete.Add(contact.GetFixtureB().GetBody());\n\t\t\t\t}\n\t\t\t\telse if(contact.GetFixtureB().GetBody() == b.deleteBody)\n\t\t\t\t{\n\t\t\t\t\tb.bodiesToDelete.Add(contact.GetFixtureA().GetBody());\n\t\t\t\t}\n\t\t\t}\n\n        \tpublic void EndContact(Contact contact)  {}\n\t\t\tpublic void PreSolve(Contact contact, ref Manifold manifold) {}\n\t\t\tpublic void PostSolve(Contact contact, ref ContactImpulse impulse) {}\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/UnrealScript/MutU2Weapons.uc",
    "content": "/*\n * Copyright (c) 2008, 2013 Dainius \"GreatEmerald\" Masiliūnas\n *\n *  Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n//-----------------------------------------------------------------------------\n// MutU2Weapons.uc\n// Mutator class for replacing weapons\n// GreatEmerald, 2008\n//-----------------------------------------------------------------------------\n\nclass MutU2Weapons extends Mutator\n    config(U2Weapons);\n\nvar() config string ReplacedWeaponClassNames0;\nvar() config string ReplacedWeaponClassNames1, ReplacedWeaponClassNames2, ReplacedWeaponClassNames3;\nvar() config string ReplacedWeaponClassNames4, ReplacedWeaponClassNames5, ReplacedWeaponClassNames6;\nvar() config string ReplacedWeaponClassNames7, ReplacedWeaponClassNames8, ReplacedWeaponClassNames9;\nvar() config string ReplacedWeaponClassNames10, ReplacedWeaponClassNames11, ReplacedWeaponClassNames12;\nvar() config bool bConfigUseU2Weapon0, bConfigUseU2Weapon1, bConfigUseU2Weapon2, bConfigUseU2Weapon3;\nvar() config bool bConfigUseU2Weapon4, bConfigUseU2Weapon5, bConfigUseU2Weapon6, bConfigUseU2Weapon7;\nvar() config bool bConfigUseU2Weapon8, bConfigUseU2Weapon9, bConfigUseU2Weapon10, bConfigUseU2Weapon11;\nvar() config bool bConfigUseU2Weapon12;\n//var byte bUseU2Weapon[13];\n//var class<Weapon> ReplacedWeaponClasses[13];\n//var class<WeaponPickup> ReplacedWeaponPickupClasses[13];\n//var class<Ammo> ReplacedAmmoPickupClasses[13];\nvar class<Weapon> U2WeaponClasses[13]; //GE: For default properties ONLY!\n//var string U2WeaponPickupClassNames[13];\nvar string U2AmmoPickupClassNames[13]; //GE: For default properties ONLY!\nvar byte bIsVehicle[13], bNotVehicle[13]; //GE: For default properties ONLY!\nvar localized string U2WeaponDisplayText[33], U2WeaponDescText[33];\n//var localized string GUISelectOptions[4];\n//var config int FirePowerMode;\nvar config bool bExperimental;\nvar config bool bUseFieldGenerator;\nvar config bool bUseProximitySensor;\nvar config bool bIntegrateShieldReward;\nvar int IterationNum; //GE: Weapons.Length\nconst DamageMultiplier=1.818182;\nvar config int DamagePercentage;\nvar config bool bUseXMPFeel;\nvar config string FlashbangModeString;\nstruct WeaponInfo\n{\n    var class<Weapon> ReplacedWeaponClass; //GE: Generated from ReplacedWeaponClassName. This is what we replace.\n    //var class<WeaponPickup> ReplacedWeaponPickupClass; //GE: UNUSED?!\n    var class<Ammo> ReplacedAmmoPickupClass; //GE: Generated from ReplacedWeaponClassName.\n\n    var class<Weapon> WeaponClass; //GE: This is the weapon we are going to put inside the world.\n    var string WeaponPickupClassName; //GE: Generated from WeponClass.\n    var string AmmoPickupClassName; //GE: Generated from WeaponClass.\n    var bool bEnabled; //GE: Structs can't be defaultproperty'd, thus we still require bConfigUseU2WeaponX\n    var bool bIsVehicle; //GE: This indicates that the weapon spawns a vehicle (deployable turrets). These only work in vehicle gametypes, duh.\n    var bool bNotVehicle; //GE: Opposite of bIsVehicle, that is, only works in non-vehicle gametypes. Think shotgun.\n};\nvar WeaponInfo Weapons[13];\n\n/*\n * GE: Here we initialise the mutator. First of all, structs can't use defaultproperties (until UE3) and thus config, so here we need to initialise the structs.\n */\nfunction PostBeginPlay()\n{\n    local int FireMode, x;\n    //local string ReplacedWeaponPickupClassName;\n\n    //IterationNum = ArrayCount(ReplacedWeaponClasses) - int(Level.Game.bAllowVehicles); //GE: He he, neat way to get the required number.\n    IterationNum = ArrayCount(Weapons);\n\n    for (x = 0; x < IterationNum; x++)\n    {\n        Weapons[x].bEnabled = bool(GetPropertyText(\"bConfigUseU2Weapon\"$x)); //GE: GetPropertyText() is needed to use variables in an array-like fashion.\n        //bUseU2Weapon[x] = byte(bool(GetPropertyText(\"bConfigUseU2Weapon\"$x)));\n        Weapons[x].ReplacedWeaponClass = class<Weapon>(DynamicLoadObject(GetPropertyText(\"ReplacedWeaponClassNames\"$x),class'Class'));\n        //ReplacedWeaponClasses[x] = class<Weapon>(DynamicLoadObject(GetPropertyText(\"ReplacedWeaponClassNames\"$x),class'Class'));\n        //ReplacedWeaponPickupClassName = string(ReplacedWeaponClasses[x].default.PickupClass);\n        for(FireMode = 0; FireMode<2; FireMode++)\n        {\n            if( (Weapons[x].ReplacedWeaponClass.default.FireModeClass[FireMode] != None)\n             && (Weapons[x].ReplacedWeaponClass.default.FireModeClass[FireMode].default.AmmoClass != None)\n             && (Weapons[x].ReplacedWeaponClass.default.FireModeClass[FireMode].default.AmmoClass.default.PickupClass != None) )\n            {\n                Weapons[x].ReplacedAmmoPickupClass = class<Ammo>(Weapons[x].ReplacedWeaponClass.default.FireModeClass[FireMode].default.AmmoClass.default.PickupClass);\n                break;\n            }\n        }\n        Weapons[x].WeaponClass = U2WeaponClasses[x];\n        Weapons[x].WeaponPickupClassName = string(Weapons[x].WeaponClass.default.PickupClass);\n        Weapons[x].AmmoPickupClassName = U2AmmoPickupClassNames[x];\n        Weapons[x].bIsVehicle = bool(bIsVehicle[x]);\n        Weapons[x].bNotVehicle = bool(bNotVehicle[x]);\n    }\n    Super.PostBeginPlay();\n}\n\n/*\n * GE: Utility function for checking if we can replace the item with the weapon/ammo of choice.\n */\nfunction bool ValidReplacement(int x)\n{\n    if (Level.Game.bAllowVehicles)\n        return (Weapons[x].bEnabled && !Weapons[x].bNotVehicle );\n    return (Weapons[x].bEnabled && !Weapons[x].bIsVehicle);\n}\n\n/*\n * GE: Here we replace things.\n */\nfunction bool CheckReplacement( Actor Other, out byte bSuperRelevant )\n{\n    local int x, i;\n    local WeaponLocker L;\n\n    bSuperRelevant = 0;\n    if (xWeaponBase(Other) != None)\n    {\n        for (x = 0; x < IterationNum; x++)\n        {\n            if (ValidReplacement(x) && xWeaponBase(Other).WeaponType == Weapons[x].ReplacedWeaponClass)\n            {\n                xWeaponBase(Other).WeaponType = Weapons[x].WeaponClass;\n                return false;\n            }\n        }\n        return true;\n    }\n    if (Weapon(Other) != None)\n    {\n        if ( Other.IsA('BallLauncher') )\n                return true;\n        for (x = 0; x < IterationNum; x++)\n            if (ValidReplacement(x) && Other.Class == Weapons[x].ReplacedWeaponClass)\n                return false;\n        return true;\n    }\n    /*if (WeaponPickup(Other) != None) //GE: This should never happen.\n    {\n        for (x = 0; x < IterationNum; x++)\n        {\n            if (Weapons[x].bEnabled && Other.Class == Weapons[x].ReplacedWeaponPickupClass)\n            {\n                ReplaceWith(Other, U2WeaponPickupClassNames[x]);\n                return false;\n            }\n        }\n    } */\n    if (Ammo(Other) != None)\n    {\n        for (x = 0; x < IterationNum; x++)\n        {\n            if (ValidReplacement(x) && Other.Class == Weapons[x].ReplacedAmmoPickupClass)\n            {\n                ReplaceWith(Other, Weapons[x].AmmoPickupClassName);\n                return false;\n            }\n        }\n        return true;\n    }\n    if (WeaponLocker(Other) != None)\n    {\n        L = WeaponLocker(Other);\n        for (x = 0; x < IterationNum; x++)\n            if (ValidReplacement(x))\n                for (i = 0; i < L.Weapons.Length; i++)\n                    if (L.Weapons[i].WeaponClass == Weapons[x].ReplacedWeaponClass)\n                        L.Weapons[i].WeaponClass = Weapons[x].WeaponClass;\n        return true;\n    }\n\n  //STARTING WEAPON\n    if( xPawn(Other) != None )\n\t\txPawn(Other).RequiredEquipment[0] = string(Weapons[1].WeaponClass);\n    if( xPawn(Other) != None && bUseFieldGenerator == True && Level.Game.bAllowVehicles)\n        xPawn(Other).RequiredEquipment[2] = \"U2Weapons.U2WeaponFieldGenerator\";\n    if( xPawn(Other) != None && bUseProximitySensor == True && Level.Game.bAllowVehicles)\n        xPawn(Other).RequiredEquipment[3] = \"U2Weapons.U2ProximitySensorDeploy\";\n\n    //GE: Special handling - Shield Reward integration\n    if (bIntegrateShieldReward && Other.IsA('ShieldReward'))\n    {\n        ShieldPack(Other).SetStaticMesh(StaticMesh'XMPWorldItemsM.items.Pickup_TD_001');\n        ShieldPack(Other).Skins[0] = Shader'U2343T.Pickups.Energy_Pickup_B_FX_01';\n        ShieldPack(Other).RepSkin = Shader'U2343T.Pickups.Energy_Pickup_B_FX_01';\n        ShieldPack(Other).SetDrawScale(0.35);\n        ShieldPack(Other).SetCollisionSize(27.0, 4.0);\n        ShieldPack(Other).PickupMessage = \"You got an Energy Pickup.\";\n        ShieldPack(Other).PickupSound = Sound'U2A.Powerups.EnergyPowerUp';\n    }\n\n        return Super.CheckReplacement(Other,bSuperRelevant);\n}\n\n/*\n * GE: This is for further replacement, I think...\n */\nfunction string GetInventoryClassOverride(string InventoryClassName)\n{\n    local int x;\n\n    for (x = 0; x < IterationNum; x++)\n    {\n        if (InventoryClassName ~= string(Weapons[x].ReplacedWeaponClass) && ValidReplacement(x))\n            return string(Weapons[x].WeaponClass);\n    }\n\n    return Super.GetInventoryClassOverride(InventoryClassName);\n}\n\n/*\n * GE: Configuration options.\n */\nstatic function FillPlayInfo(PlayInfo PlayInfo)\n{\n    local array<CacheManager.WeaponRecord> Recs;\n    local string WeaponOptions;\n    local int i;\n\n    Super.FillPlayInfo(PlayInfo);\n\n    class'CacheManager'.static.GetWeaponList(Recs);\n    for (i = 0; i < Recs.Length; i++)\n    {\n        if (WeaponOptions != \"\")\n            WeaponOptions $= \";\";\n\n        WeaponOptions $= Recs[i].ClassName $ \";\" $ Recs[i].FriendlyName;\n    }\n\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon0\", default.U2WeaponDisplayText[0], 0, 3, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames0\", default.U2WeaponDisplayText[1], 0, 4, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon1\", default.U2WeaponDisplayText[2], 0, 5, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames1\", default.U2WeaponDisplayText[3], 0, 6, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon2\", default.U2WeaponDisplayText[6], 0, 7, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames2\", default.U2WeaponDisplayText[7], 0, 8, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon3\", default.U2WeaponDisplayText[8], 0, 9, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames3\", default.U2WeaponDisplayText[9], 0, 10, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon4\", default.U2WeaponDisplayText[10], 0, 11, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames4\", default.U2WeaponDisplayText[11], 0, 12, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon5\", default.U2WeaponDisplayText[12], 0, 13, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames5\", default.U2WeaponDisplayText[13], 0, 14, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon6\", default.U2WeaponDisplayText[14], 0, 15, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames6\", default.U2WeaponDisplayText[15], 0, 16, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon7\", default.U2WeaponDisplayText[16], 0, 17, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames7\", default.U2WeaponDisplayText[17], 0, 18, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon8\", default.U2WeaponDisplayText[18], 0, 19, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames8\", default.U2WeaponDisplayText[19], 0, 20, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon9\", default.U2WeaponDisplayText[20], 0, 21, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames9\", default.U2WeaponDisplayText[21], 0, 22, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon10\", default.U2WeaponDisplayText[22], 0, 23, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames10\", default.U2WeaponDisplayText[23], 0, 24, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon11\", default.U2WeaponDisplayText[24], 0, 25, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames11\", default.U2WeaponDisplayText[25], 0, 26, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bConfigUseU2Weapon12\", default.U2WeaponDisplayText[26], 0, 27, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"ReplacedWeaponClassNames12\", default.U2WeaponDisplayText[27], 0, 28, \"Select\", WeaponOptions);\n    PlayInfo.AddSetting(default.RulesGroup, \"bUseXMPFeel\", default.U2WeaponDisplayText[4], 0, 29, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"DamagePercentage\", default.U2WeaponDisplayText[30], 0, 30, \"Text\", \"3;0:100\");\n    PlayInfo.AddSetting(default.RulesGroup, \"bExperimental\", default.U2WeaponDisplayText[5], 0, 31, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"bUseFieldGenerator\", default.U2WeaponDisplayText[28], 0, 32, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"bUseProximitySensor\", default.U2WeaponDisplayText[29], 0, 33, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"bIntegrateShieldReward\", default.U2WeaponDisplayText[31], 0, 34, \"Check\");\n    PlayInfo.AddSetting(default.RulesGroup, \"FlashbangModeString\", default.U2WeaponDisplayText[32], 0, 35, \"Select\", \"FM_None;None;FM_Directional;Direction-based;FM_DistanceBased;Distance-based\");\n}\n\n/*\n * GE: Configuration tooltips.\n */\nstatic event string GetDescriptionText(string PropName)\n{\n    if (PropName == \"bConfigUseU2Weapon0\")\n        return default.U2WeaponDescText[0];\n    if (PropName == \"ReplacedWeaponClassNames0\")\n        return default.U2WeaponDescText[1];\n    if (PropName == \"bConfigUseU2Weapon1\")\n        return default.U2WeaponDescText[2];\n    if (PropName == \"ReplacedWeaponClassNames1\")\n        return default.U2WeaponDescText[3];\n    if (PropName == \"bConfigUseU2Weapon2\")\n        return default.U2WeaponDescText[6];\n    if (PropName == \"ReplacedWeaponClassNames2\")\n        return default.U2WeaponDescText[7];\n    if (PropName == \"bConfigUseU2Weapon3\")\n        return default.U2WeaponDescText[8];\n    if (PropName == \"ReplacedWeaponClassNames3\")\n        return default.U2WeaponDescText[9];\n    if (PropName == \"bConfigUseU2Weapon4\")\n        return default.U2WeaponDescText[10];\n    if (PropName == \"ReplacedWeaponClassNames4\")\n        return default.U2WeaponDescText[11];\n    if (PropName == \"bConfigUseU2Weapon5\")\n        return default.U2WeaponDescText[12];\n    if (PropName == \"ReplacedWeaponClassNames5\")\n        return default.U2WeaponDescText[13];\n    if (PropName == \"bConfigUseU2Weapon6\")\n        return default.U2WeaponDescText[14];\n    if (PropName == \"ReplacedWeaponClassNames6\")\n        return default.U2WeaponDescText[15];\n    if (PropName == \"bConfigUseU2Weapon7\")\n        return default.U2WeaponDescText[16];\n    if (PropName == \"ReplacedWeaponClassNames7\")\n        return default.U2WeaponDescText[17];\n    if (PropName == \"bConfigUseU2Weapon8\")\n        return default.U2WeaponDescText[18];\n    if (PropName == \"ReplacedWeaponClassNames8\")\n        return default.U2WeaponDescText[19];\n    if (PropName == \"bConfigUseU2Weapon9\")\n        return default.U2WeaponDescText[20];\n    if (PropName == \"ReplacedWeaponClassNames9\")\n        return default.U2WeaponDescText[21];\n    if (PropName == \"bConfigUseU2Weapon10\")\n        return default.U2WeaponDescText[22];\n    if (PropName == \"ReplacedWeaponClassNames10\")\n        return default.U2WeaponDescText[23];\n    if (PropName == \"bConfigUseU2Weapon11\")\n        return default.U2WeaponDescText[24];\n    if (PropName == \"ReplacedWeaponClassNames11\")\n        return default.U2WeaponDescText[25];\n    if (PropName == \"bConfigUseU2Weapon12\")\n        return default.U2WeaponDescText[26];\n    if (PropName == \"ReplacedWeaponClassNames12\")\n        return default.U2WeaponDescText[27];\n    if (PropName == \"bUseXMPFeel\")\n        return default.U2WeaponDescText[4];\n    if (PropName == \"bExperimental\")\n        return default.U2WeaponDescText[5];\n    if (PropName == \"bUseFieldGenerator\")\n        return default.U2WeaponDescText[28];\n    if (PropName == \"bUseProximitySensor\")\n        return default.U2WeaponDescText[29];\n    if (PropName == \"DamagePercentage\")\n        return default.U2WeaponDescText[30];\n    if (PropName == \"bIntegrateShieldReward\")\n        return default.U2WeaponDescText[31];\n    if (PropName == \"FlashbangModeString\")\n        return default.U2WeaponDescText[32];\n\n    return Super.GetDescriptionText(PropName);\n}\n\n/*\n * GE: Here we set all the properties for different play styles.\n */\nevent PreBeginPlay()\n{\n      //local int x;\n      //local class<Weapon> Weapons;\n      local float k; //GE: Multiplier.\n\n      Super.PreBeginPlay();\n\n      k=float(DamagePercentage)/100.0;\n      //log(\"MutU2Weapons: k is\"@k);\n      //Sets various settings that match different games\n\n      /*if (FirePowerMode == 1) { //Original XMP - use the UTXMP original values\n        k=1;\n      }\n      else */if (!bUseXMPFeel && DamagePercentage != class'MutU2Weapons'.default.DamagePercentage) { //Original U2; compensate for float division errors\n        Class'U2Weapons.U2AssaultRifleFire'.default.DamageMin *= DamageMultiplier * k;\n        Class'U2Weapons.U2AssaultRifleFire'.default.DamageMax *= DamageMultiplier * k;\n        Class'U2Weapons.U2AssaultRifleProjAlt'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileASExplAlt'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileAltEnergyRifle'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileEnergyRifle'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2FireFlameThrower'.default.DamageMin *= DamageMultiplier * k;\n        Class'U2Weapons.U2FireFlameThrower'.default.DamageMax *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileFragGrenade'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileIncendiaryGrenade'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileConcussionGrenade'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileRocketDrunken'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileRocketSeeking'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileRocket'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileAltShotgun'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2FireShotgun'.default.DamageMin *= DamageMultiplier * k;\n        Class'U2Weapons.U2FireShotgun'.default.DamageMax *= DamageMultiplier * k;\n        Class'U2Weapons.U2FireSniper'.default.DamageMin *= DamageMultiplier * k;\n        Class'U2Weapons.U2FireSniper'.default.DamageMax *= DamageMultiplier * k;\n        Class'U2Weapons.U2FirePistol'.default.DamageMin *= DamageMultiplier * k;\n        Class'U2Weapons.U2FirePistol'.default.DamageMax *= DamageMultiplier * k;\n        Class'U2Weapons.U2FireAltPistol'.default.DamageMin *= DamageMultiplier * k;\n        Class'U2Weapons.U2FireAltPistol'.default.DamageMax *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileEMPGrenade'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2ProjectileToxicGrenade'.default.Damage *= DamageMultiplier * k;\n        Class'U2Weapons.U2HurterProxy_Gas'.default.myDamage *= DamageMultiplier * k;\n        Class'U2Weapons.U2HurterProxy_Fire'.default.myDamage *= DamageMultiplier * k;\n      }\n      //Dampened U2 is already the default - no need for a rewrite?\n      else if (bUseXMPFeel) { //General XMP\n        Class'U2Weapons.U2AssaultRifleFire'.default.Spread = 6.0;\n        Class'U2Weapons.U2AssaultRifleAmmoInv'.default.MaxAmmo = 300;\n        Class'U2Weapons.U2AssaultRifleProjAlt'.default.Speed = 5000;\n        Class'U2Weapons.U2AssaultRifleProjAlt'.default.MomentumTransfer = 8000;\n        Class'U2Weapons.U2WeaponEnergyRifle'.default.ClipSize = 30;\n        Class'U2Weapons.U2FireAltEnergyRifle'.default.FireLastReloadTime = 2.265000;\n        Class'U2Weapons.U2ProjectileAltEnergyRifle'.default.Speed = 1400.000000;\n        Class'U2Weapons.U2ProjectileAltEnergyRifle'.default.DamageRadius = 290.000000;\n        Class'U2Weapons.U2ProjectileAltEnergyRifle'.default.LifeSpan = 6.0;\n        Class'U2Weapons.U2ProjectileEnergyRifle'.default.ShakeRadius = 1024.0;\n        Class'U2Weapons.U2ProjectileEnergyRifle'.default.ShakeMagnitude = 1.0;\n        Class'U2Weapons.U2ProjectileEnergyRifle'.default.Speed = 2500.0;\n        Class'U2Weapons.U2ProjectileEnergyRifle'.default.MaxSpeed = 5000.0;\n        Class'U2Weapons.U2ProjectileEnergyRifle'.default.LifeSpan = 6.0;\n        Class'U2Weapons.U2AmmoEnergyRifle'.default.MaxAmmo = 150;\n        Class'U2Weapons.U2FireAltFlameThrower'.default.FireRate = 0.25;\n        Class'U2Weapons.U2ProjectileAltFlameThrower'.default.MaxSpeed = 500.0;\n        Class'U2Weapons.U2ProjectileAltFlameThrower'.default.LifeSpan = 22.0;\n        Class'U2Weapons.U2ProjectileAltFlameThrower'.default.MomentumTransfer = 500.0;\n        Class'U2Weapons.U2WeaponFlameThrower'.default.ClipSize = 80;\n        Class'U2Weapons.U2WeaponFlameThrower'.default.ReloadTime = 2.0;\n        Class'U2Weapons.U2AmmoFlameThrower'.default.MaxAmmo = 480;\n        Class'U2Weapons.U2ProjectileFragGrenade'.default.MomentumTransfer = 9000;\n        Class'U2Weapons.U2ProjectileFragGrenade'.default.MaxSpeed = 2600.0;\n        Class'U2Weapons.U2ProjectileFragGrenade'.default.Speed = 2600.0;\n        Class'U2Weapons.U2ProjectileSmokeGrenade'.default.MaxSpeed = 2600.0;\n        Class'U2Weapons.U2ProjectileSmokeGrenade'.default.Speed = 2600.0;\n        Class'U2Weapons.U2ProjectileIncendiaryGrenade'.default.DamageRadius = 256.0;\n        Class'U2Weapons.U2ProjectileIncendiaryGrenade'.default.MomentumTransfer = 9000.0;\n        Class'U2Weapons.U2ProjectileConcussionGrenade'.default.DamageRadius = 180.0;\n        Class'U2Weapons.U2FireGrenade'.default.FireRate = 1.33;\n        Class'U2Weapons.U2WeaponRocketLauncher'.default.ReloadTime = 2.0;\n        Class'U2Weapons.U2AmmoRocketLauncher'.default.MaxAmmo = 25;\n        Class'U2Weapons.U2ProjectileRocketDrunken'.default.Speed = 1200.0;\n        Class'U2Weapons.U2ProjectileRocketSeeking'.default.Speed = 1200.0;\n        Class'U2Weapons.U2ProjectileRocket'.default.Speed = 2133.0;//3200 is too much\n        Class'U2Weapons.U2ProjectileRocket'.default.MaxSpeed = 2133.0;\n        Class'U2Weapons.U2ProjectileRocket'.default.DamageRadius = 384.0;\n        Class'U2Weapons.U2WeaponShotgun'.default.ReloadTime = 2.21;\n        Class'U2Weapons.U2WeaponShotgun'.default.ClipSize = 6;\n        Class'U2Weapons.U2AmmoShotgun'.default.MaxAmmo = 42;\n        Class'U2Weapons.U2WeaponSniper'.default.ClipSize = 3;\n        Class'U2Weapons.U2FireSniper'.default.FireRate = 1.0;\n        Class'U2Weapons.U2AmmoSniper'.default.MaxAmmo = 18;\n        Class'U2Weapons.U2FirePistol'.default.FireLastReloadTime = 2.4;\n        Class'U2Weapons.U2FireAltPistol'.default.FireLastReloadTime = 2.4;\n        Class'U2Weapons.U2AmmoPistol'.default.MaxAmmo = 45;\n        Class'U2Weapons.U2DamTypePistol'.default.VehicleDamageScaling = 0.30;\n        Class'U2Weapons.U2DamTypeAltPistol'.default.VehicleDamageScaling = 0.30;\n\n        Class'U2Weapons.U2AssaultRifleFire'.default.DamageMin = 20*k;\n        Class'U2Weapons.U2AssaultRifleFire'.default.DamageMax = 20*k;\n        Class'U2Weapons.U2AssaultRifleProjAlt'.default.Damage = 175*k;\n        Class'U2Weapons.U2ProjectileASExplAlt'.default.Damage = 64.0*k;\n        Class'U2Weapons.U2ProjectileAltEnergyRifle'.default.Damage = 120.0*k;\n        Class'U2Weapons.U2ProjectileEnergyRifle'.default.Damage = 13.0*k;\n        Class'U2Weapons.U2FireFlameThrower'.default.DamageMin = 15*k;\n        Class'U2Weapons.U2FireFlameThrower'.default.DamageMax = 15*k;\n        Class'U2Weapons.U2ProjectileFragGrenade'.default.Damage = 200.0*k;\n        Class'U2Weapons.U2ProjectileIncendiaryGrenade'.default.Damage = 50.0*k;\n        Class'U2Weapons.U2ProjectileConcussionGrenade'.default.Damage = 15.0*k;\n        Class'U2Weapons.U2ProjectileRocketDrunken'.default.Damage = 70.0*k;\n        Class'U2Weapons.U2ProjectileRocketSeeking'.default.Damage = 70.0*k;\n        Class'U2Weapons.U2ProjectileRocket'.default.Damage = 190.0*k;\n        Class'U2Weapons.U2ProjectileAltShotgun'.default.Damage = 22.0*k;\n        Class'U2Weapons.U2FireShotgun'.default.DamageMin = 16*k;\n        Class'U2Weapons.U2FireShotgun'.default.DamageMax = 16*k;\n        Class'U2Weapons.U2FireSniper'.default.DamageMin = 75*k;\n        Class'U2Weapons.U2FireSniper'.default.DamageMax = 75*k;\n        Class'U2Weapons.U2FirePistol'.default.DamageMin = 40*k;\n        Class'U2Weapons.U2FirePistol'.default.DamageMax = 40*k;\n        Class'U2Weapons.U2FireAltPistol'.default.DamageMin = 65*k;\n        Class'U2Weapons.U2FireAltPistol'.default.DamageMax = 65*k;\n        Class'U2Weapons.U2ProjectileEMPGrenade'.default.Damage = 140.0*k;\n        Class'U2Weapons.U2ProjectileToxicGrenade'.default.Damage = 100.0*k;\n        Class'U2Weapons.U2HurterProxy_Gas'.default.myDamage = 30.0*k;\n        Class'U2Weapons.U2HurterProxy_Fire'.default.myDamage = 80.0*k;\n      }\n\n      //\n      //-----------------------------------------------------------\n      //\n      //Experimental options - lets you Unuse EMPimp projectile and fire from two CAR barrels\n      if ((bExperimental) && (!bUseXMPFeel)) { //General U2\n        Class'U2Weapons.U2ProjectileAltEnergyRifle'.default.LifeSpan = 2.0;\n        Class'U2Weapons.U2ProjectileAltEnergyRifle'.default.Damage = 210.0*k;\n      }\n      if (bExperimental) { //CAR - nothing's setting it, FireMode independent\n        Class'U2Weapons.U2AssaultRifleFire'.default.bModeExclusive = false;\n        Class'U2Weapons.U2AssaultRifleAltFire'.default.bModeExclusive = false;\n      }\n\n      class'U2ProjectileConcussionGrenade'.static.SetFlashbangMode(FlashbangModeString);\n}\n\ndefaultproperties\n{\n     ReplacedWeaponClassNames0=\"XWeapons.Minigun\"\n     ReplacedWeaponClassNames1=\"XWeapons.AssaultRifle\"\n     ReplacedWeaponClassNames2=\"XWeapons.BioRifle\"\n     ReplacedWeaponClassNames3=\"XWeapons.ShockRifle\"\n     ReplacedWeaponClassNames4=\"Onslaught.ONSGrenadeLauncher\"\n     ReplacedWeaponClassNames5=\"XWeapons.RocketLauncher\"\n     ReplacedWeaponClassNames6=\"XWeapons.FlakCannon\"\n     ReplacedWeaponClassNames7=\"XWeapons.SniperRifle\"\n     ReplacedWeaponClassNames8=\"UTClassic.ClassicSniperRifle\"\n     ReplacedWeaponClassNames9=\"Onslaught.ONSMineLayer\"\n     ReplacedWeaponClassNames10=\"XWeapons.Redeemer\"\n     ReplacedWeaponClassNames11=\"XWeapons.Painter\"\n     ReplacedWeaponClassNames12=\"XWeapons.LinkGun\"\n     bConfigUseU2Weapon0=True\n     bConfigUseU2Weapon1=True\n     bConfigUseU2Weapon2=True\n     bConfigUseU2Weapon3=True\n     bConfigUseU2Weapon4=True\n     bConfigUseU2Weapon5=True\n     bConfigUseU2Weapon6=True\n     bConfigUseU2Weapon7=True\n     bConfigUseU2Weapon8=True\n     bConfigUseU2Weapon9=True\n     bConfigUseU2Weapon10=True\n     bConfigUseU2Weapon11=True\n     bConfigUseU2Weapon12=True\n     bUseFieldGenerator=True\n     bUseProximitySensor=True\n     U2WeaponClasses(0)=Class'U2Weapons.U2AssaultRifleInv'\n     U2WeaponClasses(1)=Class'U2Weapons.U2WeaponEnergyRifle'\n     U2WeaponClasses(2)=Class'U2Weapons.U2WeaponFlameThrower'\n     U2WeaponClasses(3)=Class'U2Weapons.U2WeaponPistol'\n     U2WeaponClasses(4)=Class'U2Weapons.U2AutoTurretDeploy'\n     U2WeaponClasses(5)=Class'U2Weapons.U2WeaponRocketLauncher'\n     U2WeaponClasses(6)=Class'U2Weapons.U2WeaponGrenadeLauncher'\n     U2WeaponClasses(7)=Class'U2Weapons.U2WeaponSniper'\n     U2WeaponClasses(8)=Class'U2Weapons.U2WeaponSniper'\n     U2WeaponClasses(9)=Class'U2Weapons.U2WeaponRocketTurret'\n     U2WeaponClasses(10)=Class'U2Weapons.U2WeaponLandMine'\n     U2WeaponClasses(11)=Class'U2Weapons.U2WeaponLaserTripMine'\n     U2WeaponClasses(12)=Class'U2Weapons.U2WeaponShotgun' //GE: Has to be in !Level.Game.bAllowVehicles\n     bIsVehicle(0)=0\n     bIsVehicle(1)=0\n     bIsVehicle(2)=0\n     bIsVehicle(3)=0\n     bIsVehicle(4)=1\n     bIsVehicle(5)=0\n     bIsVehicle(6)=0\n     bIsVehicle(7)=0\n     bIsVehicle(8)=0\n     bIsVehicle(9)=1\n     bIsVehicle(10)=1\n     bIsVehicle(11)=1\n     bIsVehicle(12)=0\n     bNotVehicle(12)=1\n     U2AmmoPickupClassNames(0)=\"U2Weapons.U2AssaultRifleAmmoPickup\"\n     U2AmmoPickupClassNames(1)=\"U2Weapons.U2PickupAmmoEnergyRifle\"\n     U2AmmoPickupClassNames(2)=\"U2Weapons.U2PickupAmmoFlameThrower\"\n     U2AmmoPickupClassNames(3)=\"U2Weapons.U2PickupAmmoPistol\"\n     U2AmmoPickupClassNames(4)=\"U2Weapons.U2PickupAutoTurret\"\n     U2AmmoPickupClassNames(5)=\"U2Weapons.U2PickupAmmoRocket\"\n     U2AmmoPickupClassNames(6)=\"U2Weapons.U2PickupAmmoGrenade\"\n     U2AmmoPickupClassNames(7)=\"U2Weapons.U2PickupAmmoSniper\"\n     U2AmmoPickupClassNames(8)=\"U2Weapons.U2PickupAmmoSniper\"\n     U2AmmoPickupClassNames(9)=\"U2Weapons.U2PickupRocketTurret\"\n     U2AmmoPickupClassNames(10)=\"U2Weapons.U2PickupLandMine\"\n     U2AmmoPickupClassNames(11)=\"U2Weapons.U2PickupLaserTripMine\"\n     U2AmmoPickupClassNames(12)=\"U2Weapons.U2PickupAmmoShotgun\"\n     U2WeaponDisplayText(0)=\"Include the Combat Assault Rifle\"\n     U2WeaponDisplayText(1)=\"Replace this with the M32 Duster CAR\"\n     U2WeaponDisplayText(2)=\"Include the Shock Lance\"\n     U2WeaponDisplayText(3)=\"Replace this with the Shock Lance\"\n     U2WeaponDisplayText(4)=\"Use XMP-style fire power?\"\n     U2WeaponDisplayText(5)=\"Use alternative options?\"\n     U2WeaponDisplayText(6)=\"Include the Flamethrower\"\n     U2WeaponDisplayText(7)=\"Replace this with the Vulcan\"\n     U2WeaponDisplayText(8)=\"Include the Magnum Pistol\"\n     U2WeaponDisplayText(9)=\"Replace this with the Magnum Pistol\"\n     U2WeaponDisplayText(10)=\"Include the Auto Turret\"\n     U2WeaponDisplayText(11)=\"Replace this with the Auto Turret\"\n     U2WeaponDisplayText(12)=\"Include the Shark Rocket Launcher\"\n     U2WeaponDisplayText(13)=\"Replace this with the Shark\"\n     U2WeaponDisplayText(14)=\"Include the Grenade Launcher\"\n     U2WeaponDisplayText(15)=\"Replace this with the Hydra\"\n     U2WeaponDisplayText(16)=\"Include the Widowmaker Sniper (1)\"\n     U2WeaponDisplayText(17)=\"Replace this with the Widowmaker Rifle\"\n     U2WeaponDisplayText(18)=\"Include the Widowmaker Sniper (2)\"\n     U2WeaponDisplayText(19)=\"Replace this with the Widowmaker Rifle too\"\n     U2WeaponDisplayText(20)=\"Include the Rocket Turret\"\n     U2WeaponDisplayText(21)=\"Replace this with the Rocket Turret\"\n     U2WeaponDisplayText(22)=\"Include the Land Mine\"\n     U2WeaponDisplayText(23)=\"Replace this with the Land Mine\"\n     U2WeaponDisplayText(24)=\"Include the Laser Trip Mine\"\n     U2WeaponDisplayText(25)=\"Replace this with the Laser Trip Mine\"\n     U2WeaponDisplayText(26)=\"Include the Crowd Pleaser Shotgun\"\n     U2WeaponDisplayText(27)=\"Replace this with the Crowd Pleaser\"\n     U2WeaponDisplayText(28)=\"Include the Field Generator\"\n     U2WeaponDisplayText(29)=\"Include the Proximity Sensor\"\n     U2WeaponDisplayText(30)=\"Firepower damping percentage\"\n     U2WeaponDisplayText(31)=\"Integrate with Shield Reward\"\n     U2WeaponDisplayText(32)=\"Concussion grenade behaviour\"\n     U2WeaponDescText(0)=\"Include the M32 Duster Combat Assault Rifle in the game, i.e. enable it?\"\n     U2WeaponDescText(1)=\"What weapon should be replaced with the CAR. By default it's the Minigun.\"\n     U2WeaponDescText(2)=\"Enable the Shock Lance Energy Rifle?\"\n     U2WeaponDescText(3)=\"What weapon should be replaced with the Energy Rifle. By default it's the Assault Rifle. NOTE: Changing this value is not recommended.\"\n     U2WeaponDescText(4)=\"If enabled, this option will make all weapon firepower the same as in Unreal II XMP; if not, the firepower is consistent with Unreal II SP.\"\n     U2WeaponDescText(5)=\"If enabled, will make the Shock Lance use another, limited, secondary fire mode and allow Combat Assault Rifle use Unreal: Return to Na Pali fire style (shooting out of 2 barrels).\"\n     U2WeaponDescText(6)=\"Enable the Vulcan Flamethrower?\"\n     U2WeaponDescText(7)=\"What weapon should be replaced with the Flamethrower. By default it's the Bio Rifle.\"\n     U2WeaponDescText(8)=\"Enable the Magnum Pistol?\"\n     U2WeaponDescText(9)=\"What weapon should be replaced with the Magnum Pistol. By default it's the Shock Rifle.\"\n     U2WeaponDescText(10)=\"Enable the Automatic Turret?\"\n     U2WeaponDescText(11)=\"What weapon should be replaced with the Auto Turret. By default it's the Onslaught Grenade Launcher.\"\n     U2WeaponDescText(12)=\"Enable the Shark Rocket Launcher?\"\n     U2WeaponDescText(13)=\"What weapon should be replaced with the Shark Rocket Launcher. By default it's the Rocket Launcher.\"\n     U2WeaponDescText(14)=\"Enable the Hydra Grenade Launcher?\"\n     U2WeaponDescText(15)=\"What weapon should be replaced with the Hydra Grenade Launcher. By default it's the Flak Cannon.\"\n     U2WeaponDescText(16)=\"Should the Lightning Gun be replaced with the Widowmaker Sniper Rifle?\"\n     U2WeaponDescText(17)=\"What weapon should be replaced with the Widowmaker Sniper Rifle. By default it's the Lightning Gun here.\"\n     U2WeaponDescText(18)=\"Should the Classic Sniper Rifle be replaced with the Widowmaker Sniper Rifle?\"\n     U2WeaponDescText(19)=\"What weapon should be replaced with the Widowmaker Sniper Rifle. By default it's the Classic Sniper Rifle here.\"\n     U2WeaponDescText(20)=\"Enable the Rocket Turret delpoyable?\"\n     U2WeaponDescText(21)=\"What weapon should be replaced with the Rocket Turret deployable. By default it's the Mine Layer.\"\n     U2WeaponDescText(22)=\"Enable the Land Mine?\"\n     U2WeaponDescText(23)=\"What weapon should be replaced with the Land Mine. By default it's the Redeemer.\"\n     U2WeaponDescText(24)=\"Enable the Laser Trip Mine?\"\n     U2WeaponDescText(25)=\"What weapon should be replaced with the Laser Trip Mine. By default it's the Ion Painter.\"\n     U2WeaponDescText(26)=\"Enable the Crowd Pleaser Shotgun? It won't replace the Link Gun in matches with vehicles.\"\n     U2WeaponDescText(27)=\"What weapon should be replaced with the Crowd Pleaser Shotgun. By default it's the Link Gun. It does not replace it in vehicle matches.\"\n     U2WeaponDescText(28)=\"Enable the Field Generator? If enabled, you start with one.\"\n     U2WeaponDescText(29)=\"Enable the Proximity Sensor? If enabled, you start with one.\"\n     U2WeaponDescText(30)=\"This number controls how powerful all weapons are. By deafult the firepower is set to 55% of the original in order to compensate for the fact that players in UT2004 don't have shields or damage filtering.\"\n     U2WeaponDescText(31)=\"If checked, the Shield Reward mutator produces Unreal II shield pickups.\"\n     U2WeaponDescText(32)=\"Choose between no white overlay, overlay depending on the player's view (XMP style) and overlay depending on the distance from the player (default, foolproof).\"\n     //FirePowerMode=4\n     DamagePercentage=55\n     bUseXMPFeel=False\n     bIntegrateShieldReward=True\n     FlashbangModeString=\"FM_DistanceBased\"\n     GroupName=\"Arena\"\n     FriendlyName=\"Unreal II or XMP Weapons\"\n     Description=\"Add the Unreal II weapons to other gametypes. Fully customisable, you can choose between Unreal II and XMP weapon behaviour.\"\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/UnrealScript/US3HelloWorld.uc",
    "content": "class US3HelloWorld extends GameInfo;\n \nevent InitGame( string Options, out string Error )\n{\n    `log( \"Hello, world!\" );\n}\n\ndefaultproperties\n{\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/UrWeb/iso8601.ur",
    "content": "open Parse.String\n\nval digit = satisfy isdigit\n\nval decimal_of_len n =\n    ds <- count n digit;\n    return (List.foldl (fn d acc => 10*acc + ((ord d)-(ord #\"0\"))) 0 ds)\n\nval date =\n    y <- decimal_of_len 4;\n    char' #\"-\";\n    m <- decimal_of_len 2;\n    char' #\"-\";\n    d <- decimal_of_len 2;\n    if m > 0 && m <= 12 then\n        return {Year=y, Month=(Datetime.intToMonth (m-1)), Day=d}\n    else\n        fail\n\n(* We parse fractions of a second, but ignore them since Datetime\n   doesn't permit representing them. *)\nval time =\n    h <- decimal_of_len 2;\n    char' #\":\";\n    m <- decimal_of_len 2;\n    s <- maybe (char' #\":\";\n                s <- decimal_of_len 2;\n                maybe' (char' #\".\"; skipWhile isdigit);\n                return s);\n    return {Hour=h, Minute=m, Second=Option.get 0 s}\n\nval timezone_offset =\n    let val zulu = char' #\"Z\"; return 0\n        val digits = decimal_of_len 2\n        val sign = or (char' #\"+\"; return 1)\n                      (char' #\"-\"; return (-1))\n    in\n        zulu `or` (s <- sign;\n                   h <- digits;\n                   m <- (maybe' (char' #\":\"); or digits (return 0));\n                   return (s*(h*60+m)))\n    end\n\nval datetime_with_tz =\n    d <- date; char' #\"T\"; t <- time;\n    tz <- timezone_offset;\n    return (d ++ t ++ {TZOffsetMinutes=tz})\n\nval datetime =\n    d <- datetime_with_tz;\n    return (d -- #TZOffsetMinutes)\n\nfun process v =\n    case parse (d <- datetime_with_tz; eof; return d) v of\n        Some r =>\n        let\n            val {Year=year,Month=month,Day=day,\n                 Hour=hour,Minute=minute,Second=second} =\n                Datetime.addMinutes (r.TZOffsetMinutes) (r -- #TZOffsetMinutes)\n            fun pad x =\n                if x < 10 then \"0\" `strcat` show x else show x\n        in\n            <xml>{[pad hour]}:{[pad minute]}:{[pad second]} {[month]} {[day]}, {[year]}</xml>\n        end\n      | None => <xml>none</xml>\n\nfun main () : transaction page =\n    input <- source \"2012-01-01T01:10:42Z\";\n    return <xml>\n      <body>\n        <label>\n          Enter an\n          <a href=\"https://en.wikipedia.org/wiki/ISO_8601\">ISO 8601</a>\n          datetime here:\n          <ctextbox source={input} />\n        </label>\n        <ul><dyn signal={v <- signal input; return (process v)} /></ul>\n      </body>\n    </xml>\n"
  },
  {
    "path": "src/test/resources/samples/langs/UrWeb/parse.urs",
    "content": "functor Make(Stream : sig type t end) : sig\n    con t :: Type -> Type\n\n    val mreturn : a ::: Type -> a -> t a\n    val mbind : a ::: Type -> b ::: Type ->\n                (t a) -> (a -> t b) -> (t b)\n    val monad_parse : monad t\n\n    val parse : a ::: Type -> t a -> Stream.t -> option a\n\n    (** Combinators *)\n    val fail : a ::: Type -> t a\n    val or : a ::: Type -> t a -> t a -> t a\n    val maybe : a ::: Type -> t a -> t (option a)\n    val maybe' : a ::: Type -> t a -> t unit\n    val many : a ::: Type -> t a -> t (list a)\n    val count : a ::: Type -> int -> t a -> t (list a)\n    val skipMany : a ::: Type -> t a -> t unit\n    val sepBy : a ::: Type -> s ::: Type -> t a -> t s -> t (list a)\nend\n\nstructure String : sig\n    con t :: Type -> Type\n    val monad_parse : monad t\n\n    val parse : a ::: Type -> t a -> string -> option a\n\n    (** Combinators *)\n    val fail : a ::: Type -> t a\n    val or : a ::: Type -> t a -> t a -> t a\n    val maybe : a ::: Type -> t a -> t (option a)\n    val maybe' : a ::: Type -> t a -> t unit\n    val many : a ::: Type -> t a -> t (list a)\n    val count : a ::: Type -> int -> t a -> t (list a)\n    val skipMany : a ::: Type -> t a -> t unit\n    val sepBy : a ::: Type -> s ::: Type -> t a -> t s -> t (list a)\n\n    val eof : t unit\n    (* We provide alternative versions of some of these predicates\n     * that return t unit as a monadic syntactical convenience. *)\n    val string : string -> t string\n    val string' : string -> t unit\n    val stringCI : string -> t string\n    val stringCI' : string -> t unit\n    val char : char -> t char\n    val char' : char -> t unit\n    val take : int -> t (string*int)\n    val drop : int -> t unit\n    val satisfy : (char -> bool) -> t char\n    val skip : (char -> bool) -> t unit\n    val skipWhile : (char -> bool) -> t unit\n    val takeWhile : (char -> bool) -> t (string*int)\n    val takeWhile' : (char -> bool) -> t string (* conses *)\n    (* Well, \"till\" is the correct form; but \"til\" is in common enough\n     * usage that I'll prefer it for terseness. *)\n    val takeTil : (char -> bool) -> t (string*int)\n    val takeTil' : (char -> bool) -> t string (* conses *)\n    val takeRest : t string\n\n    (** Convenience functions *)\n    val skipSpace : t unit\n    val endOfLine : t unit\n    val unsigned_int_of_radix : int -> t int\n    (*\n     * val signed_int_of_radix : int -> t int\n     * val double : t float\n     *)\nend\n\nstructure Blob : sig\n    con t :: Type -> Type\n    val monad_parse : monad t\n\n    val parse : a ::: Type -> t a -> blob -> option a\n\n    (** Combinators *)\n    val fail : a ::: Type -> t a\n    val or : a ::: Type -> t a -> t a -> t a\n    val maybe : a ::: Type -> t a -> t (option a)\n    val maybe' : a ::: Type -> t a -> t unit\n    val many : a ::: Type -> t a -> t (list a)\n    val count : a ::: Type -> int -> t a -> t (list a)\n    val skipMany : a ::: Type -> t a -> t unit\n    val sepBy : a ::: Type -> s ::: Type -> t a -> t s -> t (list a)\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/VCL/varnish2_default.vcl",
    "content": "/*-\n * Copyright (c) 2006 Verdens Gang AS\n * Copyright (c) 2006-2008 Linpro AS\n * All rights reserved.\n *\n * Author: Poul-Henning Kamp <phk@phk.freebsd.dk>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR \n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * $Id$\n *\n * The default VCL code.\n *\n * NB! You do NOT need to copy & paste all of these functions into your\n * own vcl code, if you do not provide a definition of one of these\n * functions, the compiler will automatically fall back to the default\n * code from this file.\n *\n * This code will be prefixed with a backend declaration built from the\n * -b argument.\n */\n\nsub vcl_recv {\n    if (req.request != \"GET\" &&\n      req.request != \"HEAD\" &&\n      req.request != \"PUT\" &&\n      req.request != \"POST\" &&\n      req.request != \"TRACE\" &&\n      req.request != \"OPTIONS\" &&\n      req.request != \"DELETE\") {\n        /* Non-RFC2616 or CONNECT which is weird. */\n        return (pipe);\n    }\n    if (req.request != \"GET\" && req.request != \"HEAD\") {\n        /* We only deal with GET and HEAD by default */\n        return (pass);\n    }\n    if (req.http.Authorization || req.http.Cookie) {\n        /* Not cacheable by default */\n        return (pass);\n    }\n    return (lookup);\n}\n\nsub vcl_pipe {\n    # Note that only the first request to the backend will have\n    # X-Forwarded-For set.  If you use X-Forwarded-For and want to\n    # have it set for all requests, make sure to have:\n    # set req.http.connection = \"close\";\n    # here.  It is not set by default as it might break some broken web\n    # applications, like IIS with NTLM authentication.\n    return (pipe);\n}\n\nsub vcl_pass {\n    return (pass);\n}\n\nsub vcl_hash {\n    set req.hash += req.url;\n    if (req.http.host) {\n        set req.hash += req.http.host;\n    } else {\n        set req.hash += server.ip;\n    }\n    return (hash);\n}\n\nsub vcl_hit {\n    if (!obj.cacheable) {\n        return (pass);\n    }\n    return (deliver);\n}\n\nsub vcl_miss {\n    return (fetch);\n}\n\nsub vcl_fetch {\n    if (!obj.cacheable) {\n        return (pass);\n    }\n    if (obj.http.Set-Cookie) {\n        return (pass);\n    }\n    set obj.prefetch =  -30s;\n    return (deliver);\n}\n\nsub vcl_deliver {\n    return (deliver);\n}\n\nsub vcl_discard {\n    /* XXX: Do not redefine vcl_discard{}, it is not yet supported */\n    return (discard);\n}\n\nsub vcl_prefetch {\n    /* XXX: Do not redefine vcl_prefetch{}, it is not yet supported */\n    return (fetch);\n}\n\nsub vcl_timeout {\n    /* XXX: Do not redefine vcl_timeout{}, it is not yet supported */\n    return (discard);\n}\n\nsub vcl_error {\n    set obj.http.Content-Type = \"text/html; charset=utf-8\";\n    synthetic {\"\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html>\n  <head>\n    <title>\"} obj.status \" \" obj.response {\"</title>\n  </head>\n  <body>\n    <h1>Error \"} obj.status \" \" obj.response {\"</h1>\n    <p>\"} obj.response {\"</p>\n    <h3>Guru Meditation:</h3>\n    <p>XID: \"} req.xid {\"</p>\n    <hr>\n    <address>\n       <a href=\"http://www.varnish-cache.org/\">Varnish cache server</a>\n    </address>\n  </body>\n</html>\n\"};\n    return (deliver);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/VCL/varnish3_default.vcl",
    "content": "/*-\n * Copyright (c) 2006 Verdens Gang AS\n * Copyright (c) 2006-2011 Varnish Software AS\n * All rights reserved.\n *\n * Author: Poul-Henning Kamp <phk@phk.freebsd.dk>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR \n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The default VCL code.\n *\n * NB! You do NOT need to copy & paste all of these functions into your\n * own vcl code, if you do not provide a definition of one of these\n * functions, the compiler will automatically fall back to the default\n * code from this file.\n *\n * This code will be prefixed with a backend declaration built from the\n * -b argument.\n */\n\nsub vcl_recv {\n    if (req.restarts == 0) {\n\tif (req.http.x-forwarded-for) {\n\t    set req.http.X-Forwarded-For =\n\t\treq.http.X-Forwarded-For + \", \" + client.ip;\n\t} else {\n\t    set req.http.X-Forwarded-For = client.ip;\n\t}\n    }\n    if (req.request != \"GET\" &&\n      req.request != \"HEAD\" &&\n      req.request != \"PUT\" &&\n      req.request != \"POST\" &&\n      req.request != \"TRACE\" &&\n      req.request != \"OPTIONS\" &&\n      req.request != \"DELETE\") {\n        /* Non-RFC2616 or CONNECT which is weird. */\n        return (pipe);\n    }\n    if (req.request != \"GET\" && req.request != \"HEAD\") {\n        /* We only deal with GET and HEAD by default */\n        return (pass);\n    }\n    if (req.http.Authorization || req.http.Cookie) {\n        /* Not cacheable by default */\n        return (pass);\n    }\n    return (lookup);\n}\n\nsub vcl_pipe {\n    # Note that only the first request to the backend will have\n    # X-Forwarded-For set.  If you use X-Forwarded-For and want to\n    # have it set for all requests, make sure to have:\n    # set bereq.http.connection = \"close\";\n    # here.  It is not set by default as it might break some broken web\n    # applications, like IIS with NTLM authentication.\n    return (pipe);\n}\n\nsub vcl_pass {\n    return (pass);\n}\n\nsub vcl_hash {\n    hash_data(req.url);\n    if (req.http.host) {\n        hash_data(req.http.host);\n    } else {\n        hash_data(server.ip);\n    }\n    return (hash);\n}\n\nsub vcl_hit {\n    return (deliver);\n}\n\nsub vcl_miss {\n    return (fetch);\n}\n\nsub vcl_fetch {\n    if (beresp.ttl <= 0s ||\n        beresp.http.Set-Cookie ||\n        beresp.http.Vary == \"*\") {\n\t\t/*\n\t\t * Mark as \"Hit-For-Pass\" for the next 2 minutes\n\t\t */\n\t\tset beresp.ttl = 120 s;\n\t\treturn (hit_for_pass);\n    }\n    return (deliver);\n}\n\nsub vcl_deliver {\n    return (deliver);\n}\n\nsub vcl_error {\n    set obj.http.Content-Type = \"text/html; charset=utf-8\";\n    set obj.http.Retry-After = \"5\";\n    synthetic {\"\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html>\n  <head>\n    <title>\"} + obj.status + \" \" + obj.response + {\"</title>\n  </head>\n  <body>\n    <h1>Error \"} + obj.status + \" \" + obj.response + {\"</h1>\n    <p>\"} + obj.response + {\"</p>\n    <h3>Guru Meditation:</h3>\n    <p>XID: \"} + req.xid + {\"</p>\n    <hr>\n    <p>Varnish cache server</p>\n  </body>\n</html>\n\"};\n    return (deliver);\n}\n\nsub vcl_init {\n\treturn (ok);\n}\n\nsub vcl_fini {\n\treturn (ok);\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/VHDL/foo.vhd",
    "content": "-- VHDL example file\n\nlibrary ieee;\nuse ieee.std_logic_1164.all;\n\nentity inverter is\n\tport(a : in std_logic;\n\t     b : out std_logic);\nend entity;\n\narchitecture rtl of inverter is\nbegin\n\tb <= not a;\nend architecture;\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/button_debounce.v",
    "content": "////////////////////////////////////////////////////////////////////////////////\r\n// Original Author: Schuyler Eldridge\r\n// Contact Point: Schuyler Eldridge (schuyler.eldridge@gmail.com)\r\n// button_debounce.v\r\n// Created: 10/10/2009\r\n// Modified: 3/20/2012\r\n//\r\n// Counter based debounce circuit originally written for EC551 (back\r\n// in the day) and then modified (i.e. chagned entirely) into 3 always\r\n// block format. This debouncer generates a signal that goes high for\r\n// 1 clock cycle after the clock sees an asserted value on the button\r\n// line. This action is then disabled until the counter hits a\r\n// specified count value that is determined by the clock frequency and\r\n// desired debounce frequency. An alternative implementation would not\r\n// use a counter, but would use the shift register approach, looking\r\n// for repeated matches (say 5) on the button line.\r\n// \r\n// Copyright (C) 2012 Schuyler Eldridge, Boston University\r\n//\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License.\r\n//\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n//\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n////////////////////////////////////////////////////////////////////////////////\r\n`timescale 1ns / 1ps\r\nmodule button_debounce\r\n  (\r\n   input      clk,     // clock\r\n   input      reset_n, // asynchronous reset \r\n   input      button,  // bouncy button\r\n   output reg debounce // debounced 1-cycle signal\r\n   );\r\n  \r\n  parameter\r\n    CLK_FREQUENCY  = 66000000,\r\n    DEBOUNCE_HZ    = 2;\r\n  // These parameters are specified such that you can choose any power\r\n  // of 2 frequency for a debouncer between 1 Hz and\r\n  // CLK_FREQUENCY. Note, that this will throw errors if you choose a\r\n  // non power of 2 frequency (i.e. count_value evaluates to some\r\n  // number / 3 which isn't interpreted as a logical right shift). I'm\r\n  // assuming this will not work for DEBOUNCE_HZ values less than 1,\r\n  // however, I'm uncertain of the value of a debouncer for fractional\r\n  // hertz button presses.\r\n  localparam\r\n    COUNT_VALUE  = CLK_FREQUENCY / DEBOUNCE_HZ,\r\n    WAIT         = 0,\r\n    FIRE         = 1,\r\n    COUNT        = 2;\r\n\r\n  reg [1:0]   state, next_state;\r\n  reg [25:0]  count;\r\n  \r\n  always @ (posedge clk or negedge reset_n)\r\n    state <= (!reset_n) ? WAIT : next_state;\r\n\r\n  always @ (posedge clk or negedge reset_n) begin\r\n    if (!reset_n) begin\r\n      debounce <= 0;\r\n      count    <= 0;\r\n    end\r\n    else begin\r\n      debounce <= 0;\r\n      count    <= 0;\r\n      case (state)\r\n        WAIT: begin\r\n        end\r\n        FIRE: begin\r\n          debounce <= 1;\r\n        end\r\n        COUNT: begin\r\n          count <= count + 1;\r\n        end\r\n      endcase \r\n    end\r\n  end\r\n\r\n  always @ * begin\r\n    case (state)\r\n      WAIT:    next_state = (button)                  ? FIRE : state;\r\n      FIRE:    next_state = COUNT;\r\n      COUNT:   next_state = (count > COUNT_VALUE - 1) ? WAIT : state;\r\n      default: next_state = WAIT;\r\n    endcase\r\n  end\r\n\r\nendmodule\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/control.v",
    "content": "`timescale 1ns / 1ps\n// Copyright (C) 2008 Schuyler Eldridge, Boston University\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\nmodule control(clk,en,dsp_sel,an);\n        input clk, en;\n        output [1:0]dsp_sel;\n        output [3:0]an;\n        wire a,b,c,d,e,f,g,h,i,j,k,l;\n        \n        assign an[3] = a;\n        assign an[2] = b;\n        assign an[1] = c;\n        assign an[0] = d;\n        \n        assign dsp_sel[1] = e;\n        \n        assign dsp_sel[0] = i;\n        \n        \n                FDRSE #(\n                .INIT(1'b0) // Initial value of register (1'b0 or 1'b1)\n                ) DFF3(\n                .Q(a), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(d), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );\n                FDRSE #(\n                .INIT(1'b1) // Initial value of register (1'b0 or 1'b1)\n                ) DFF2(\n                .Q(b), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(a), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );\n                FDRSE #(\n                .INIT(1'b1) // Initial value of register (1'b0 or 1'b1)\n                ) DFF1(\n                .Q(c), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(b), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );\n                FDRSE #(\n                .INIT(1'b1) // Initial value of register (1'b0 or 1'b1)\n                ) DFF0(\n                .Q(d), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(c), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );\n                \n                \n                FDRSE #(\n                .INIT(1'b1) // Initial value of register (1'b0 or 1'b1)\n                ) DFF7(\n                .Q(e), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(h), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );\n                FDRSE #(\n                .INIT(1'b1) // Initial value of register (1'b0 or 1'b1)\n                ) DFF6(\n                .Q(f), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(e), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );              \n                FDRSE #(\n                .INIT(1'b0) // Initial value of register (1'b0 or 1'b1)\n                ) DFF5(\n                .Q(g), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(f), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );\n                FDRSE #(\n                .INIT(1'b0) // Initial value of register (1'b0 or 1'b1)\n                ) DFF4(\n                .Q(h), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(g), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );\n                \n                \n                FDRSE #(\n                .INIT(1'b1) // Initial value of register (1'b0 or 1'b1)\n                ) DFF11(\n                .Q(i), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(l), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );\n                FDRSE #(\n                .INIT(1'b0) // Initial value of register (1'b0 or 1'b1)\n                ) DFF10(\n                .Q(j), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(i), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );              \n                FDRSE #(\n                .INIT(1'b1) // Initial value of register (1'b0 or 1'b1)\n                ) DFF9(\n                .Q(k), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(j), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );\n                FDRSE #(\n                .INIT(1'b0) // Initial value of register (1'b0 or 1'b1)\n                ) DFF8(\n                .Q(l), // Data output\n                .C(clk), // Clock input\n                .CE(en), // Clock enable input\n                .D(k), // Data input\n                .R(1'b0), // Synchronous reset input\n                .S(1'b0) // Synchronous set input\n                );\nendmodule\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/hex_display.v",
    "content": "/*\n *  Copyright (c) 2009  Zeus Gomez Marmolejo <zeus@opencores.org>\n *\n *  This file is part of the Zet processor. This processor is free\n *  hardware; you can redistribute it and/or modify it under the terms of\n *  the GNU General Public License as published by the Free Software\n *  Foundation; either version 3, or (at your option) any later version.\n *\n *  Zet is distrubuted in the hope that it will be useful, but WITHOUT\n *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n *  License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with Zet; see the file COPYING. If not, see\n *  <http://www.gnu.org/licenses/>.\n */\n\nmodule hex_display (\n    input  [15:0] num,\n    input         en,\n\n    output [6:0] hex0,\n    output [6:0] hex1,\n    output [6:0] hex2,\n    output [6:0] hex3\n  );\n\n  // Module instantiations\n  seg_7 hex_group0 (\n    .num (num[3:0]),\n    .en  (en),\n    .seg (hex0)\n  );\n\n  seg_7 hex_group1 (\n    .num (num[7:4]),\n    .en  (en),\n    .seg (hex1)\n  );\n\n  seg_7 hex_group2 (\n    .num (num[11:8]),\n    .en  (en),\n    .seg (hex2)\n  );\n\n  seg_7 hex_group3 (\n    .num (num[15:12]),\n    .en  (en),\n    .seg (hex3)\n  );\n\nendmodule\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/mux.v",
    "content": "`timescale 1ns / 1ps\n// Copyright (C) 2008 Schuyler Eldridge, Boston University\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\nmodule mux(opA,opB,sum,dsp_sel,out);\n\tinput [3:0] opA,opB;\n\tinput [4:0] sum;\n\tinput [1:0] dsp_sel;\n\toutput [3:0] out;\n\t\n\treg cout;\n\t\n\talways @ (sum)\n\t\tbegin\n\t\t\tif (sum[4] == 1)\n\t\t\t\tcout <= 4'b0001;\n\t\t\telse\n\t\t\t\tcout <= 4'b0000;\n\t\tend\n\t\n\treg out;\n\t\n\talways @(dsp_sel,sum,cout,opB,opA)\n\t\tbegin\n\t\t\tif (dsp_sel == 2'b00)\n\t\t\t\tout <= sum[3:0];\n\t\t\telse if (dsp_sel == 2'b01)\n\t\t\t\tout <= cout;\n\t\t\telse if (dsp_sel == 2'b10)\n\t\t\t\tout <= opB;\n\t\t\telse if (dsp_sel == 2'b11)\n\t\t\t\tout <= opA;\n\t\tend\n\nendmodule\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/pipeline_registers.v",
    "content": "////////////////////////////////////////////////////////////////////////////////\r\n// Original Author: Schuyler Eldridge\r\n// Contact Point: Schuyler Eldridge (schuyler.eldridge@gmail.com)\r\n// pipeline_registers.v\r\n// Created: 4.4.2012\r\n// Modified: 4.4.2012\r\n//\r\n// Implements a series of pipeline registers specified by the input\r\n// parameters BIT_WIDTH and NUMBER_OF_STAGES. BIT_WIDTH determines the\r\n// size of the signal passed through each of the pipeline\r\n// registers. NUMBER_OF_STAGES is the number of pipeline registers\r\n// generated. This accepts values of 0 (yes, it just passes data from\r\n// input to output...) up to however many stages specified.\r\n// Copyright (C) 2012 Schuyler Eldridge, Boston University\r\n//\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License.\r\n//\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n//\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n////////////////////////////////////////////////////////////////////////////////\r\n`timescale 1ns / 1ps\r\nmodule pipeline_registers\r\n  (\r\n   input                      clk,\r\n   input                      reset_n,\r\n   input [BIT_WIDTH-1:0]      pipe_in,\r\n   output reg [BIT_WIDTH-1:0] pipe_out\r\n   );\r\n\r\n  // WARNING!!! THESE PARAMETERS ARE INTENDED TO BE MODIFIED IN A TOP\r\n  // LEVEL MODULE. LOCAL CHANGES HERE WILL, MOST LIKELY, BE\r\n  // OVERWRITTEN!\r\n  parameter \r\n    BIT_WIDTH         = 10,\r\n    NUMBER_OF_STAGES  = 5;\r\n\r\n  // Main generate function for conditional hardware instantiation\r\n  generate\r\n    genvar                                 i;\r\n    // Pass-through case for the odd event that no pipeline stages are\r\n    // specified.\r\n    if (NUMBER_OF_STAGES == 0) begin\r\n      always @ *\r\n        pipe_out = pipe_in;\r\n    end\r\n    // Single flop case for a single stage pipeline\r\n    else if (NUMBER_OF_STAGES == 1) begin\r\n      always @ (posedge clk or negedge reset_n)\r\n        pipe_out <= (!reset_n) ? 0 : pipe_in;\r\n    end\r\n    // Case for 2 or more pipeline stages\r\n    else begin\r\n      // Create the necessary regs\r\n      reg [BIT_WIDTH*(NUMBER_OF_STAGES-1)-1:0] pipe_gen;\r\n      // Create logic for the initial and final pipeline registers\r\n      always @ (posedge clk or negedge reset_n) begin\r\n        if (!reset_n) begin\r\n          pipe_gen[BIT_WIDTH-1:0] <= 0;\r\n          pipe_out                <= 0;\r\n        end\r\n        else begin\r\n          pipe_gen[BIT_WIDTH-1:0] <= pipe_in;\r\n          pipe_out                <= pipe_gen[BIT_WIDTH*(NUMBER_OF_STAGES-1)-1:BIT_WIDTH*(NUMBER_OF_STAGES-2)];\r\n        end\r\n      end\r\n      // Create the intermediate pipeline registers if there are 3 or\r\n      // more pipeline stages\r\n      for (i = 1; i < NUMBER_OF_STAGES-1; i = i + 1) begin : pipeline\r\n        always @ (posedge clk or negedge reset_n)\r\n          pipe_gen[BIT_WIDTH*(i+1)-1:BIT_WIDTH*i] <= (!reset_n) ? 0 : pipe_gen[BIT_WIDTH*i-1:BIT_WIDTH*(i-1)];\r\n      end\r\n    end\r\n  endgenerate\r\n  \r\nendmodule\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/ps2_mouse.v",
    "content": "/*\n *  PS2 Mouse Interface\n *  Copyright (C) 2010  Donna Polehn <dpolehn@verizon.net>\n *\n *  This file is part of the Zet processor. This processor is free\n *  hardware; you can redistribute it and/or modify it under the terms of\n *  the GNU General Public License as published by the Free Software\n *  Foundation; either version 3, or (at your option) any later version.\n *\n *  Zet is distrubuted in the hope that it will be useful, but WITHOUT\n *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n *  License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with Zet; see the file COPYING. If not, see\n *  <http://www.gnu.org/licenses/>.\n */\n\nmodule ps2_mouse (\n    input clk,                // Clock Input\n    input reset,              // Reset Input\n    inout ps2_clk,            // PS2 Clock, Bidirectional\n    inout ps2_dat,            // PS2 Data, Bidirectional\n\n    input  [7:0] the_command,        // Command to send to mouse\n    input        send_command,       // Signal to send\n    output       command_was_sent,   // Signal command finished sending\n    output       error_communication_timed_out,\n\n    output [7:0] received_data,        // Received data\n    output       received_data_en,     // If 1 - new data has been received\n    output       start_receiving_data,\n    output       wait_for_incoming_data\n  );\n\n  // --------------------------------------------------------------------\n  // Internal wires and registers Declarations\n  // --------------------------------------------------------------------\n  wire            ps2_clk_posedge;        // Internal Wires\n  wire            ps2_clk_negedge;\n\n  reg    [7:0]    idle_counter;            // Internal Registers\n  reg             ps2_clk_reg;\n  reg             ps2_data_reg;\n  reg             last_ps2_clk;\n\n  reg    [2:0]    ns_ps2_transceiver;        // State Machine Registers\n  reg    [2:0]    s_ps2_transceiver;\n\n  // --------------------------------------------------------------------\n  // Constant Declarations\n  // --------------------------------------------------------------------\n  localparam  PS2_STATE_0_IDLE            = 3'h0,        // states\n              PS2_STATE_1_DATA_IN         = 3'h1,\n              PS2_STATE_2_COMMAND_OUT     = 3'h2,\n              PS2_STATE_3_END_TRANSFER    = 3'h3,\n              PS2_STATE_4_END_DELAYED     = 3'h4;\n\n  // --------------------------------------------------------------------\n  // Finite State Machine(s)\n  // --------------------------------------------------------------------\n  always @(posedge clk) begin\n    if(reset == 1'b1) s_ps2_transceiver <= PS2_STATE_0_IDLE;\n    else              s_ps2_transceiver <= ns_ps2_transceiver;\n  end\n\n  always @(*) begin\n    ns_ps2_transceiver = PS2_STATE_0_IDLE;        // Defaults\n\n    case (s_ps2_transceiver)\n    PS2_STATE_0_IDLE:\n        begin\n            if((idle_counter == 8'hFF) && (send_command == 1'b1))\n                ns_ps2_transceiver = PS2_STATE_2_COMMAND_OUT;\n            else if ((ps2_data_reg == 1'b0) && (ps2_clk_posedge == 1'b1))\n                ns_ps2_transceiver = PS2_STATE_1_DATA_IN;\n            else ns_ps2_transceiver = PS2_STATE_0_IDLE;\n        end\n    PS2_STATE_1_DATA_IN:\n        begin\n            // if((received_data_en == 1'b1)  && (ps2_clk_posedge == 1'b1))\n            if((received_data_en == 1'b1))   ns_ps2_transceiver = PS2_STATE_0_IDLE;\n            else                             ns_ps2_transceiver = PS2_STATE_1_DATA_IN;\n        end\n    PS2_STATE_2_COMMAND_OUT:\n        begin\n            if((command_was_sent == 1'b1) || (error_communication_timed_out == 1'b1))\n                ns_ps2_transceiver = PS2_STATE_3_END_TRANSFER;\n            else ns_ps2_transceiver = PS2_STATE_2_COMMAND_OUT;\n        end\n    PS2_STATE_3_END_TRANSFER:\n        begin\n            if(send_command == 1'b0) ns_ps2_transceiver = PS2_STATE_0_IDLE;\n            else if((ps2_data_reg == 1'b0) && (ps2_clk_posedge == 1'b1))\n                ns_ps2_transceiver = PS2_STATE_4_END_DELAYED;\n            else ns_ps2_transceiver = PS2_STATE_3_END_TRANSFER;\n        end\n    PS2_STATE_4_END_DELAYED:\n        begin\n            if(received_data_en == 1'b1) begin\n                if(send_command == 1'b0) ns_ps2_transceiver = PS2_STATE_0_IDLE;\n                else                     ns_ps2_transceiver = PS2_STATE_3_END_TRANSFER;\n            end\n            else ns_ps2_transceiver = PS2_STATE_4_END_DELAYED;\n        end\n\n    default:\n            ns_ps2_transceiver = PS2_STATE_0_IDLE;\n    endcase\n  end\n\n  // --------------------------------------------------------------------\n  // Sequential logic\n  // --------------------------------------------------------------------\n  always @(posedge clk) begin\n    if(reset == 1'b1)     begin\n        last_ps2_clk    <= 1'b1;\n        ps2_clk_reg     <= 1'b1;\n        ps2_data_reg    <= 1'b1;\n    end\n    else begin\n        last_ps2_clk    <= ps2_clk_reg;\n        ps2_clk_reg     <= ps2_clk;\n        ps2_data_reg    <= ps2_dat;\n    end\n  end\n\n  always @(posedge clk) begin\n    if(reset == 1'b1) idle_counter <= 6'h00;\n    else if((s_ps2_transceiver == PS2_STATE_0_IDLE) && (idle_counter != 8'hFF))\n        idle_counter <= idle_counter + 6'h01;\n    else if (s_ps2_transceiver != PS2_STATE_0_IDLE)\n        idle_counter <= 6'h00;\n  end\n\n  // --------------------------------------------------------------------\n  // Combinational logic\n  // --------------------------------------------------------------------\n  assign ps2_clk_posedge = ((ps2_clk_reg == 1'b1) && (last_ps2_clk == 1'b0)) ? 1'b1 : 1'b0;\n  assign ps2_clk_negedge = ((ps2_clk_reg == 1'b0) && (last_ps2_clk == 1'b1)) ? 1'b1 : 1'b0;\n\n  assign start_receiving_data      = (s_ps2_transceiver == PS2_STATE_1_DATA_IN);\n  assign wait_for_incoming_data    = (s_ps2_transceiver == PS2_STATE_3_END_TRANSFER);\n\n  // --------------------------------------------------------------------\n  // Internal Modules\n  // --------------------------------------------------------------------\n  ps2_mouse_cmdout mouse_cmdout (\n    .clk                           (clk),            // Inputs\n    .reset                         (reset),\n    .the_command                   (the_command),\n    .send_command                  (send_command),\n    .ps2_clk_posedge               (ps2_clk_posedge),\n    .ps2_clk_negedge               (ps2_clk_negedge),\n    .ps2_clk                       (ps2_clk),        // Bidirectionals\n    .ps2_dat                       (ps2_dat),\n    .command_was_sent              (command_was_sent),    // Outputs\n    .error_communication_timed_out (error_communication_timed_out)\n  );\n\n  ps2_mouse_datain mouse_datain (\n    .clk                    (clk),        // Inputs\n    .reset                  (reset),\n    .wait_for_incoming_data (wait_for_incoming_data),\n    .start_receiving_data   (start_receiving_data),\n    .ps2_clk_posedge        (ps2_clk_posedge),\n    .ps2_clk_negedge        (ps2_clk_negedge),\n    .ps2_data               (ps2_data_reg),\n    .received_data          (received_data),   // Outputs\n    .received_data_en       (received_data_en)\n  );\n\nendmodule\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/sha-256-functions.v",
    "content": "/*\n*\n* Copyright (c) 2011 fpgaminer@bitcoin-mining.com\n*\n*\n*\n* This program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU General Public License as published by\n* the Free Software Foundation, either version 3 of the License, or\n* (at your option) any later version.\n*\n* This program is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU General Public License for more details.\n*\n* You should have received a copy of the GNU General Public License\n* along with this program.  If not, see <http://www.gnu.org/licenses/>.\n* \n*/\n\n\n`timescale 1ns/1ps\n\nmodule e0 (x, y);\n\n\tinput [31:0] x;\n\toutput [31:0] y;\n\n\tassign y = {x[1:0],x[31:2]} ^ {x[12:0],x[31:13]} ^ {x[21:0],x[31:22]};\n\nendmodule\n\n\nmodule e1 (x, y);\n\n\tinput [31:0] x;\n\toutput [31:0] y;\n\n\tassign y = {x[5:0],x[31:6]} ^ {x[10:0],x[31:11]} ^ {x[24:0],x[31:25]};\n\nendmodule\n\n\nmodule ch (x, y, z, o);\n\n\tinput [31:0] x, y, z;\n\toutput [31:0] o;\n\n\tassign o = z ^ (x & (y ^ z));\n\nendmodule\n\n\nmodule maj (x, y, z, o);\n\n\tinput [31:0] x, y, z;\n\toutput [31:0] o;\n\n\tassign o = (x & y) | (z & (x | y));\n\nendmodule\n\n\nmodule s0 (x, y);\n\n\tinput [31:0] x;\n\toutput [31:0] y;\n\n\tassign y[31:29] = x[6:4] ^ x[17:15];\n\tassign y[28:0] = {x[3:0], x[31:7]} ^ {x[14:0],x[31:18]} ^ x[31:3];\n\nendmodule\n\n\nmodule s1 (x, y);\n\n\tinput [31:0] x;\n\toutput [31:0] y;\n\n\tassign y[31:22] = x[16:7] ^ x[18:9];\n\tassign y[21:0] = {x[6:0],x[31:17]} ^ {x[8:0],x[31:19]} ^ x[31:10];\n\nendmodule\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/sign_extender.v",
    "content": "////////////////////////////////////////////////////////////////////////////////\r\n// Original Author: Schuyler Eldridge\r\n// Contact Point: Schuyler Eldridge (schuyler.eldridge@gmail.com)\r\n// sign_extender.v\r\n// Created: 5.16.2012\r\n// Modified: 5.16.2012\r\n//\r\n// Generic sign extension module\r\n//\r\n// Copyright (C) 2012 Schuyler Eldridge, Boston University\r\n//\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License.\r\n//\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n//\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n////////////////////////////////////////////////////////////////////////////////\r\n`timescale 1ns/1ps\r\nmodule sign_extender\r\n  #(\r\n    parameter\r\n    INPUT_WIDTH = 8,\r\n    OUTPUT_WIDTH = 16\r\n    )\r\n  (\r\n   input [INPUT_WIDTH-1:0] original,\r\n   output reg [OUTPUT_WIDTH-1:0] sign_extended_original\r\n   );\r\n\r\n  wire [OUTPUT_WIDTH-INPUT_WIDTH-1:0] sign_extend;\r\n\r\n  generate\r\n    genvar                           i;\r\n    for (i = 0; i < OUTPUT_WIDTH-INPUT_WIDTH; i = i + 1) begin : gen_sign_extend\r\n      assign sign_extend[i]  = (original[INPUT_WIDTH-1]) ? 1'b1 : 1'b0;\r\n    end\r\n  endgenerate\r\n\r\n  always @ * begin\r\n    sign_extended_original  = {sign_extend,original};\r\n  end\r\n\r\nendmodule\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/sqrt_pipelined.v",
    "content": "////////////////////////////////////////////////////////////////////////////////\r\n// Original Author: Schuyler Eldridge\r\n// Contact Point: Schuyler Eldridge (schuyler.eldridge@gmail.com)\r\n// sqrt_pipelined.v\r\n// Created: 4.2.2012\r\n// Modified: 4.5.2012\r\n//\r\n// Implements a fixed-point parameterized pipelined square root\r\n// operation on an unsigned input of any bit length. The number of\r\n// stages in the pipeline is equal to the number of output bits in the\r\n// computation. This pipelien sustains a throughput of one computation\r\n// per clock cycle.\r\n// \r\n// Copyright (C) 2012 Schuyler Eldridge, Boston University\r\n//\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License.\r\n//\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n//\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n////////////////////////////////////////////////////////////////////////////////\r\n`timescale 1ns / 1ps\r\nmodule sqrt_pipelined\r\n  (\r\n   input                        clk,        // clock\r\n   input                        reset_n,    // asynchronous reset\r\n   input                        start,      // optional start signal\r\n   input [INPUT_BITS-1:0]       radicand,   // unsigned radicand\r\n   output reg                   data_valid, // optional data valid signal\r\n   output reg [OUTPUT_BITS-1:0] root        // unsigned root \r\n   );\r\n\r\n  // WARNING!!! THESE PARAMETERS ARE INTENDED TO BE MODIFIED IN A TOP\r\n  // LEVEL MODULE. LOCAL CHANGES HERE WILL, MOST LIKELY, BE\r\n  // OVERWRITTEN!\r\n  parameter\r\n    INPUT_BITS   = 16; // number of input bits (any integer)\r\n  localparam\r\n    OUTPUT_BITS  = INPUT_BITS / 2 + INPUT_BITS % 2; // number of output bits\r\n  \r\n  reg [OUTPUT_BITS-1:0]         start_gen; // valid data propagation\r\n  reg [OUTPUT_BITS*INPUT_BITS-1:0] root_gen; // root values\r\n  reg [OUTPUT_BITS*INPUT_BITS-1:0] radicand_gen; // radicand values\r\n  wire [OUTPUT_BITS*INPUT_BITS-1:0] mask_gen; // mask values\r\n\r\n  // This is the first stage of the pipeline.\r\n  always @ (posedge clk or negedge reset_n) begin\r\n    if (!reset_n) begin\r\n      start_gen[0]                 <= 0;\r\n      radicand_gen[INPUT_BITS-1:0] <= 0;\r\n      root_gen[INPUT_BITS-1:0]     <= 0;\r\n    end\r\n    else begin\r\n      start_gen[0] <= start;\r\n      if ( mask_gen[INPUT_BITS-1:0] <= radicand ) begin\r\n        radicand_gen[INPUT_BITS-1:0] <= radicand - mask_gen[INPUT_BITS-1:0];\r\n        root_gen[INPUT_BITS-1:0] <= mask_gen[INPUT_BITS-1:0];\r\n      end\r\n      else begin\r\n        radicand_gen[INPUT_BITS-1:0] <= radicand;\r\n        root_gen[INPUT_BITS-1:0] <= 0;\r\n      end\r\n    end\r\n  end\r\n\r\n  // Main generate loop to create the masks and pipeline stages.\r\n  generate\r\n    genvar i;\r\n    // Generate all the mask values. These are built up in the\r\n    // following fashion:\r\n    // LAST MASK:  0x00...001 \r\n    //             0x00...004  Increasing # OUTPUT_BITS\r\n    //             0x00...010          |\r\n    //             0x00...040          v\r\n    //                 ...\r\n    // FIRST MASK: 0x10...000  # masks == # OUTPUT_BITS\r\n    // \r\n    // Note that the first mask used can either be of the 0x1... or\r\n    // 0x4... variety. This is purely determined by the number of\r\n    // computation stages. However, the last mask used will always be\r\n    // 0x1 and the second to last mask used will always be 0x4.\r\n    for (i = 0; i < OUTPUT_BITS; i = i + 1) begin: mask_4\r\n      if (i % 2) // i is odd, this is a 4 mask\r\n        assign mask_gen[INPUT_BITS*(OUTPUT_BITS-i)-1:INPUT_BITS*(OUTPUT_BITS-i-1)]  = 4 << 4 * (i/2);\r\n      else // i is even, this is a 1 mask\r\n        assign mask_gen[INPUT_BITS*(OUTPUT_BITS-i)-1:INPUT_BITS*(OUTPUT_BITS-i-1)]  = 1 << 4 * (i/2);\r\n    end\r\n    // Generate all the pipeline stages to compute the square root of\r\n    // the input radicand stream. The general approach is to compare\r\n    // the current values of the root plus the mask to the\r\n    // radicand. If root/mask sum is greater than the radicand,\r\n    // subtract the mask and the root from the radicand and store the\r\n    // radicand for the next stage. Additionally, the root is\r\n    // increased by the value of the mask and stored for the next\r\n    // stage. If this test fails, then the radicand and the root\r\n    // retain their value through to the next stage. The one weird\r\n    // thing is that the mask indices appear to be incremented by one\r\n    // additional position. This is not the case, however, because the\r\n    // first mask is used in the first stage (always block after the\r\n    // generate statement).\r\n    for (i = 0; i < OUTPUT_BITS - 1; i = i + 1) begin: pipeline\r\n      always @ (posedge clk or negedge reset_n) begin : pipeline_stage\r\n        if (!reset_n) begin\r\n          start_gen[i+1]                                    <= 0;\r\n          radicand_gen[INPUT_BITS*(i+2)-1:INPUT_BITS*(i+1)] <= 0;\r\n          root_gen[INPUT_BITS*(i+2)-1:INPUT_BITS*(i+1)]     <= 0;\r\n        end\r\n        else begin\r\n          start_gen[i+1] <= start_gen[i];\r\n          if ((root_gen[INPUT_BITS*(i+1)-1:INPUT_BITS*i] + \r\n               mask_gen[INPUT_BITS*(i+2)-1:INPUT_BITS*(i+1)]) <= radicand_gen[INPUT_BITS*(i+1)-1:INPUT_BITS*i]) begin\r\n\t    radicand_gen[INPUT_BITS*(i+2)-1:INPUT_BITS*(i+1)] <= radicand_gen[INPUT_BITS*(i+1)-1:INPUT_BITS*i] - \r\n                                                                 mask_gen[INPUT_BITS*(i+2)-1:INPUT_BITS*(i+1)] - \r\n                                                                 root_gen[INPUT_BITS*(i+1)-1:INPUT_BITS*i];\r\n\t    root_gen[INPUT_BITS*(i+2)-1:INPUT_BITS*(i+1)] <= (root_gen[INPUT_BITS*(i+1)-1:INPUT_BITS*i] >> 1) + \r\n                                                             mask_gen[INPUT_BITS*(i+2)-1:INPUT_BITS*(i+1)];\r\n          end\r\n          else begin\r\n\t    radicand_gen[INPUT_BITS*(i+2)-1:INPUT_BITS*(i+1)] <= radicand_gen[INPUT_BITS*(i+1)-1:INPUT_BITS*i];\r\n\t    root_gen[INPUT_BITS*(i+2)-1:INPUT_BITS*(i+1)]     <= root_gen[INPUT_BITS*(i+1)-1:INPUT_BITS*i] >> 1;\r\n          end\r\n        end\r\n      end\r\n    end\r\n  endgenerate\r\n\r\n  // This is the final stage which just implements a rounding\r\n  // operation. This stage could be tacked on as a combinational logic\r\n  // stage, but who cares about latency, anyway? This is NOT a true\r\n  // rounding stage. In order to add convergent rounding, you need to\r\n  // increase the input bit width by 2 (increase the number of\r\n  // pipeline stages by 1) and implement rounding in the module that\r\n  // instantiates this one. \r\n  always @ (posedge clk or negedge reset_n) begin\r\n    if (!reset_n) begin\r\n      data_valid <= 0;\r\n      root       <= 0;\r\n    end\r\n    else begin\r\n      data_valid <= start_gen[OUTPUT_BITS-1];\r\n      if (root_gen[OUTPUT_BITS*INPUT_BITS-1:OUTPUT_BITS*INPUT_BITS-INPUT_BITS] > root_gen[OUTPUT_BITS*INPUT_BITS-1:OUTPUT_BITS*INPUT_BITS-INPUT_BITS])\r\n        root <= root_gen[OUTPUT_BITS*INPUT_BITS-1:OUTPUT_BITS*INPUT_BITS-INPUT_BITS] + 1;\r\n      else\r\n        root  <= root_gen[OUTPUT_BITS*INPUT_BITS-1:OUTPUT_BITS*INPUT_BITS-INPUT_BITS];\r\n    end\r\n  end\r\n\r\nendmodule\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/t_button_debounce.v",
    "content": "////////////////////////////////////////////////////////////////////////////////\r\n// Original Author: Schuyler Eldridge\r\n// Contact Point: Schuyler Eldridge (schuyler.eldridge@gmail.com)\r\n// button_debounce.v\r\n// Created:  4.5.2012\r\n// Modified: 4.5.2012\r\n//\r\n// Testbench for button_debounce.v.\r\n// \r\n// Copyright (C) 2012 Schuyler Eldridge, Boston University\r\n//\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License.\r\n//\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n//\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n////////////////////////////////////////////////////////////////////////////////\r\n`timescale 1ns / 1ps\r\nmodule t_button_debounce();\r\n\r\n  parameter\r\n    CLK_FREQUENCY  = 66000000,\r\n    DEBOUNCE_HZ    = 2;\r\n\r\n  reg clk, reset_n, button;\r\n  wire debounce;\r\n  \r\n  button_debounce\r\n    #(\r\n      .CLK_FREQUENCY(CLK_FREQUENCY),\r\n      .DEBOUNCE_HZ(DEBOUNCE_HZ)\r\n      )\r\n  button_debounce\r\n    (\r\n     .clk(clk),\r\n     .reset_n(reset_n),\r\n     .button(button),\r\n     .debounce(debounce)\r\n     );\r\n\r\n  initial begin\r\n    clk          = 1'bx; reset_n = 1'bx; button = 1'bx;\r\n    #10 reset_n  = 1;\r\n    #10 reset_n  = 0; clk = 0;\r\n    #10 reset_n  = 1;\r\n    #10 button   = 0;\r\n  end\r\n\r\n  always\r\n    #5 clk  = ~clk;\r\n\r\n  always begin\r\n    #100 button  = ~button;\r\n    #0.1 button  = ~button;\r\n    #0.1 button  = ~button;\r\n    #0.1 button  = ~button;\r\n    #0.1 button  = ~button;\r\n    #0.1 button  = ~button;\r\n    #0.1 button  = ~button;\r\n    #0.1 button  = ~button;\r\n    #0.1 button  = ~button;\r\n  end\r\n  \r\nendmodule\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/t_div_pipelined.v",
    "content": "////////////////////////////////////////////////////////////////////////////////\r\n// Original Author: Schuyler Eldridge\r\n// Contact Point: Schuyler Eldridge (schuyler.eldridge@gmail.com)\r\n// div_pipelined.v\r\n// Created: 4.3.2012\r\n// Modified: 4.5.2012\r\n//\r\n// Testbench for div_pipelined.v\r\n//\r\n// Copyright (C) 2012 Schuyler Eldridge, Boston University\r\n//\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License.\r\n//\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n//\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n////////////////////////////////////////////////////////////////////////////////\r\n`timescale 1ns / 1ps\r\nmodule t_div_pipelined();\r\n\r\n  reg clk, start, reset_n;\r\n  reg [7:0] dividend, divisor;\r\n  wire      data_valid, div_by_zero;\r\n  wire [7:0] quotient, quotient_correct;\r\n\r\n  parameter\r\n    BITS  = 8;\r\n\r\n  div_pipelined\r\n    #(\r\n      .BITS(BITS)\r\n      )\r\n  div_pipelined\r\n    (\r\n     .clk(clk),\r\n     .reset_n(reset_n),\r\n     .dividend(dividend),\r\n     .divisor(divisor),\r\n     .quotient(quotient),\r\n     .div_by_zero(div_by_zero),\r\n     //     .quotient_correct(quotient_correct),\r\n     .start(start),\r\n     .data_valid(data_valid)\r\n     );\r\n\r\n  initial begin\r\n    #10 reset_n  = 0;\r\n    #50 reset_n  = 1;\r\n    #1\r\n    clk          = 0;\r\n    dividend     = -1;\r\n    divisor      = 127;\r\n    #1000 $finish;\r\n  end\r\n\r\n//  always\r\n//    #20 dividend  = dividend + 1;\r\n\r\n  always begin\r\n    #10 divisor  = divisor - 1; start = 1;\r\n    #10 start    = 0;\r\n  end\r\n\r\n  always\r\n    #5 clk  = ~clk;\r\n\r\n  \r\nendmodule\r\n  "
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/t_sqrt_pipelined.v",
    "content": "////////////////////////////////////////////////////////////////////////////////\r\n// Original Author: Schuyler Eldridge\r\n// Contact Point: Schuyler Eldridge (schuyler.eldridge@gmail.com)\r\n// t_sqrt_pipelined.v\r\n// Created: 4.2.2012\r\n// Modified: 4.5.2012\r\n//\r\n// Testbench for generic sqrt operation\r\n// \r\n// Copyright (C) 2012 Schuyler Eldridge, Boston University\r\n//\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License.\r\n//\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n//\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n////////////////////////////////////////////////////////////////////////////////\r\n`timescale 1ns / 1ps\r\nmodule t_sqrt_pipelined();\r\n\r\n  parameter \r\n    INPUT_BITS  = 4;\r\n  localparam\r\n    OUTPUT_BITS  = INPUT_BITS / 2 + INPUT_BITS % 2;\r\n  \r\n  reg [INPUT_BITS-1:0] radicand;\r\n  reg                  clk, start, reset_n;\r\n\r\n  wire [OUTPUT_BITS-1:0] root;\r\n  wire                   data_valid;\r\n//  wire [7:0] root_good;\r\n\r\n  sqrt_pipelined \r\n    #(\r\n      .INPUT_BITS(INPUT_BITS)\r\n      )\r\n    sqrt_pipelined \r\n      (\r\n       .clk(clk),\r\n       .reset_n(reset_n),\r\n       .start(start),\r\n       .radicand(radicand), \r\n       .data_valid(data_valid),\r\n       .root(root)\r\n       );\r\n\r\n  initial begin\r\n    radicand     = 16'bx; clk = 1'bx; start = 1'bx; reset_n = 1'bx;;\r\n    #10 reset_n  = 0; clk = 0;\r\n    #50 reset_n  = 1; radicand = 0;\r\n//    #40 radicand  = 81; start = 1;\r\n//    #10 radicand  = 16'bx; start = 0;\r\n    #10000 $finish;\r\n  end\r\n\r\n  always\r\n    #5 clk = ~clk;\r\n\r\n  always begin\r\n    #10 radicand  = radicand + 1; start = 1;\r\n    #10 start     = 0;\r\n  end\r\n  \r\n\r\n//  always begin\r\n//    #80 start  = 1;\r\n//    #10 start  = 0;\r\n//  end\r\n\r\nendmodule\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Verilog/vga.v",
    "content": "/*\n *  VGA top level file\n *  Copyright (C) 2010  Zeus Gomez Marmolejo <zeus@aluzina.org>\n *\n *  This file is part of the Zet processor. This processor is free\n *  hardware; you can redistribute it and/or modify it under the terms of\n *  the GNU General Public License as published by the Free Software\n *  Foundation; either version 3, or (at your option) any later version.\n *\n *  Zet is distrubuted in the hope that it will be useful, but WITHOUT\n *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n *  License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with Zet; see the file COPYING. If not, see\n *  <http://www.gnu.org/licenses/>.\n */\n\nmodule vga (\n    // Wishbone signals\n    input         wb_clk_i,     // 25 Mhz VDU clock\n    input         wb_rst_i,\n    input  [15:0] wb_dat_i,\n    output [15:0] wb_dat_o,\n    input  [16:1] wb_adr_i,\n    input         wb_we_i,\n    input         wb_tga_i,\n    input  [ 1:0] wb_sel_i,\n    input         wb_stb_i,\n    input         wb_cyc_i,\n    output        wb_ack_o,\n\n    // VGA pad signals\n    output [ 3:0] vga_red_o,\n    output [ 3:0] vga_green_o,\n    output [ 3:0] vga_blue_o,\n    output        horiz_sync,\n    output        vert_sync,\n\n    // CSR SRAM master interface\n    output [17:1] csrm_adr_o,\n    output [ 1:0] csrm_sel_o,\n    output        csrm_we_o,\n    output [15:0] csrm_dat_o,\n    input  [15:0] csrm_dat_i\n  );\n\n\n  // Registers and nets\n  //\n  // csr address\n  reg  [17:1] csr_adr_i;\n  reg         csr_stb_i;\n\n  // Config wires\n  wire [15:0] conf_wb_dat_o;\n  wire        conf_wb_ack_o;\n\n  // Mem wires\n  wire [15:0] mem_wb_dat_o;\n  wire        mem_wb_ack_o;\n\n  // LCD wires\n  wire [17:1] csr_adr_o;\n  wire [15:0] csr_dat_i;\n  wire        csr_stb_o;\n  wire        v_retrace;\n  wire        vh_retrace;\n  wire        w_vert_sync;\n\n  // VGA configuration registers\n  wire        shift_reg1;\n  wire        graphics_alpha;\n  wire        memory_mapping1;\n  wire [ 1:0] write_mode;\n  wire [ 1:0] raster_op;\n  wire        read_mode;\n  wire [ 7:0] bitmask;\n  wire [ 3:0] set_reset;\n  wire [ 3:0] enable_set_reset;\n  wire [ 3:0] map_mask;\n  wire        x_dotclockdiv2;\n  wire        chain_four;\n  wire [ 1:0] read_map_select;\n  wire [ 3:0] color_compare;\n  wire [ 3:0] color_dont_care;\n\n  // Wishbone master to SRAM\n  wire [17:1] wbm_adr_o;\n  wire [ 1:0] wbm_sel_o;\n  wire        wbm_we_o;\n  wire [15:0] wbm_dat_o;\n  wire [15:0] wbm_dat_i;\n  wire        wbm_stb_o;\n  wire        wbm_ack_i;\n\n  wire        stb;\n\n  // CRT wires\n  wire [ 5:0] cur_start;\n  wire [ 5:0] cur_end;\n  wire [15:0] start_addr;\n  wire [ 4:0] vcursor;\n  wire [ 6:0] hcursor;\n  wire [ 6:0] horiz_total;\n  wire [ 6:0] end_horiz;\n  wire [ 6:0] st_hor_retr;\n  wire [ 4:0] end_hor_retr;\n  wire [ 9:0] vert_total;\n  wire [ 9:0] end_vert;\n  wire [ 9:0] st_ver_retr;\n  wire [ 3:0] end_ver_retr;\n\n  // attribute_ctrl wires\n  wire [3:0] pal_addr;\n  wire       pal_we;\n  wire [7:0] pal_read;\n  wire [7:0] pal_write;\n\n  // dac_regs wires\n  wire       dac_we;\n  wire [1:0] dac_read_data_cycle;\n  wire [7:0] dac_read_data_register;\n  wire [3:0] dac_read_data;\n  wire [1:0] dac_write_data_cycle;\n  wire [7:0] dac_write_data_register;\n  wire [3:0] dac_write_data;\n\n  // Module instances\n  //\n  vga_config_iface config_iface (\n    .wb_clk_i (wb_clk_i),\n    .wb_rst_i (wb_rst_i),\n    .wb_dat_i (wb_dat_i),\n    .wb_dat_o (conf_wb_dat_o),\n    .wb_adr_i (wb_adr_i[4:1]),\n    .wb_we_i  (wb_we_i),\n    .wb_sel_i (wb_sel_i),\n    .wb_stb_i (stb & wb_tga_i),\n    .wb_ack_o (conf_wb_ack_o),\n\n    .shift_reg1       (shift_reg1),\n    .graphics_alpha   (graphics_alpha),\n    .memory_mapping1  (memory_mapping1),\n    .write_mode       (write_mode),\n    .raster_op        (raster_op),\n    .read_mode        (read_mode),\n    .bitmask          (bitmask),\n    .set_reset        (set_reset),\n    .enable_set_reset (enable_set_reset),\n    .map_mask         (map_mask),\n    .x_dotclockdiv2   (x_dotclockdiv2),\n    .chain_four       (chain_four),\n    .read_map_select  (read_map_select),\n    .color_compare    (color_compare),\n    .color_dont_care  (color_dont_care),\n\n    .pal_addr  (pal_addr),\n    .pal_we    (pal_we),\n    .pal_read  (pal_read),\n    .pal_write (pal_write),\n\n    .dac_we                  (dac_we),\n    .dac_read_data_cycle     (dac_read_data_cycle),\n    .dac_read_data_register  (dac_read_data_register),\n    .dac_read_data           (dac_read_data),\n    .dac_write_data_cycle    (dac_write_data_cycle),\n    .dac_write_data_register (dac_write_data_register),\n    .dac_write_data          (dac_write_data),\n\n    .cur_start  (cur_start),\n    .cur_end    (cur_end),\n    .start_addr (start_addr),\n    .vcursor    (vcursor),\n    .hcursor    (hcursor),\n\n    .horiz_total  (horiz_total),\n    .end_horiz    (end_horiz),\n    .st_hor_retr  (st_hor_retr),\n    .end_hor_retr (end_hor_retr),\n    .vert_total   (vert_total),\n    .end_vert     (end_vert),\n    .st_ver_retr  (st_ver_retr),\n    .end_ver_retr (end_ver_retr),\n\n    .v_retrace  (v_retrace),\n    .vh_retrace (vh_retrace)\n  );\n\n  vga_lcd lcd (\n    .clk (wb_clk_i),\n    .rst (wb_rst_i),\n\n    .shift_reg1     (shift_reg1),\n    .graphics_alpha (graphics_alpha),\n\n    .pal_addr  (pal_addr),\n    .pal_we    (pal_we),\n    .pal_read  (pal_read),\n    .pal_write (pal_write),\n\n    .dac_we                  (dac_we),\n    .dac_read_data_cycle     (dac_read_data_cycle),\n    .dac_read_data_register  (dac_read_data_register),\n    .dac_read_data           (dac_read_data),\n    .dac_write_data_cycle    (dac_write_data_cycle),\n    .dac_write_data_register (dac_write_data_register),\n    .dac_write_data          (dac_write_data),\n\n    .csr_adr_o (csr_adr_o),\n    .csr_dat_i (csr_dat_i),\n    .csr_stb_o (csr_stb_o),\n\n    .vga_red_o   (vga_red_o),\n    .vga_green_o (vga_green_o),\n    .vga_blue_o  (vga_blue_o),\n    .horiz_sync  (horiz_sync),\n    .vert_sync   (w_vert_sync),\n\n    .cur_start  (cur_start),\n    .cur_end    (cur_end),\n    .vcursor    (vcursor),\n    .hcursor    (hcursor),\n\n    .horiz_total  (horiz_total),\n    .end_horiz    (end_horiz),\n    .st_hor_retr  (st_hor_retr),\n    .end_hor_retr (end_hor_retr),\n    .vert_total   (vert_total),\n    .end_vert     (end_vert),\n    .st_ver_retr  (st_ver_retr),\n    .end_ver_retr (end_ver_retr),\n\n    .x_dotclockdiv2 (x_dotclockdiv2),\n\n    .v_retrace  (v_retrace),\n    .vh_retrace (vh_retrace)\n  );\n\n  vga_cpu_mem_iface cpu_mem_iface (\n    .wb_clk_i (wb_clk_i),\n    .wb_rst_i (wb_rst_i),\n\n    .wbs_adr_i (wb_adr_i),\n    .wbs_sel_i (wb_sel_i),\n    .wbs_we_i  (wb_we_i),\n    .wbs_dat_i (wb_dat_i),\n    .wbs_dat_o (mem_wb_dat_o),\n    .wbs_stb_i (stb & !wb_tga_i),\n    .wbs_ack_o (mem_wb_ack_o),\n\n    .wbm_adr_o (wbm_adr_o),\n    .wbm_sel_o (wbm_sel_o),\n    .wbm_we_o  (wbm_we_o),\n    .wbm_dat_o (wbm_dat_o),\n    .wbm_dat_i (wbm_dat_i),\n    .wbm_stb_o (wbm_stb_o),\n    .wbm_ack_i (wbm_ack_i),\n\n    .chain_four       (chain_four),\n    .memory_mapping1  (memory_mapping1),\n    .write_mode       (write_mode),\n    .raster_op        (raster_op),\n    .read_mode        (read_mode),\n    .bitmask          (bitmask),\n    .set_reset        (set_reset),\n    .enable_set_reset (enable_set_reset),\n    .map_mask         (map_mask),\n    .read_map_select  (read_map_select),\n    .color_compare    (color_compare),\n    .color_dont_care  (color_dont_care)\n  );\n\n  vga_mem_arbitrer mem_arbitrer (\n    .clk_i (wb_clk_i),\n    .rst_i (wb_rst_i),\n\n    .wb_adr_i (wbm_adr_o),\n    .wb_sel_i (wbm_sel_o),\n    .wb_we_i  (wbm_we_o),\n    .wb_dat_i (wbm_dat_o),\n    .wb_dat_o (wbm_dat_i),\n    .wb_stb_i (wbm_stb_o),\n    .wb_ack_o (wbm_ack_i),\n\n    .csr_adr_i (csr_adr_i),\n    .csr_dat_o (csr_dat_i),\n    .csr_stb_i (csr_stb_i),\n\n    .csrm_adr_o (csrm_adr_o),\n    .csrm_sel_o (csrm_sel_o),\n    .csrm_we_o  (csrm_we_o),\n    .csrm_dat_o (csrm_dat_o),\n    .csrm_dat_i (csrm_dat_i)\n  );\n\n  // Continous assignments\n  assign wb_dat_o  = wb_tga_i ? conf_wb_dat_o : mem_wb_dat_o;\n  assign wb_ack_o  = wb_tga_i ? conf_wb_ack_o : mem_wb_ack_o;\n  assign stb       = wb_stb_i & wb_cyc_i;\n  assign vert_sync = ~graphics_alpha ^ w_vert_sync;\n\n  // Behaviour\n  // csr_adr_i\n  always @(posedge wb_clk_i)\n    csr_adr_i <= wb_rst_i ? 17'h0 : csr_adr_o + start_addr[15:1];\n\n  // csr_stb_i\n  always @(posedge wb_clk_i)\n    csr_stb_i <= wb_rst_i ? 1'b0 : csr_stb_o;\n\nendmodule\n"
  },
  {
    "path": "src/test/resources/samples/langs/Vim script/filenames/.gvimrc",
    "content": "\" no toolbar\nset guioptions-=T\n"
  },
  {
    "path": "src/test/resources/samples/langs/Vim script/filenames/.nvimrc",
    "content": "set nocompatible\nset ignorecase\nset smartcase\nset showmatch\nset showcmd\n\nsyntax on\n\nset hlsearch \" Highlight searches\nset incsearch \" Do incremental searching\n"
  },
  {
    "path": "src/test/resources/samples/langs/Vim script/filenames/.vimrc",
    "content": "set nocompatible\nset ignorecase\nset incsearch\nset smartcase\nset showmatch\nset showcmd\n\nsyntax on\n"
  },
  {
    "path": "src/test/resources/samples/langs/Vim script/filenames/_vimrc",
    "content": "set nocompatible\nset ignorecase\nset incsearch\nset smartcase\nset showmatch\nset showcmd\n\nsyntax on\n"
  },
  {
    "path": "src/test/resources/samples/langs/Vim script/solarized.vim",
    "content": "\" Name:     Solarized vim colorscheme\n\" Author:   Ethan Schoonover <es@ethanschoonover.com>\n\" URL:      http://ethanschoonover.com/solarized\n\"           (see this url for latest release & screenshots)\n\" License:  OSI approved MIT license (see end of this file)\n\" Created:  In the middle of the night\n\" Modified: 2011 May 05\n\"\n\" Usage \"{{{\n\"\n\" ---------------------------------------------------------------------\n\" ABOUT:\n\" ---------------------------------------------------------------------\n\" Solarized is a carefully designed selective contrast colorscheme with dual\n\" light and dark modes that runs in both GUI, 256 and 16 color modes.\n\"\n\" See the homepage above for screenshots and details.\n\"\n\" ---------------------------------------------------------------------\n\" OPTIONS:\n\" ---------------------------------------------------------------------\n\" See the \"solarized.txt\" help file included with this colorscheme (in the \n\" \"doc\" subdirectory) for information on options, usage, the Toggle Background \n\" function and more. If you have already installed Solarized, this is available \n\" from the Solarized menu and command line as \":help solarized\"\n\"\n\" ---------------------------------------------------------------------\n\" INSTALLATION:\n\" ---------------------------------------------------------------------\n\" Two options for installation: manual or pathogen\n\"\n\" MANUAL INSTALLATION OPTION:\n\" ---------------------------------------------------------------------\n\"\n\" 1.  Download the solarized distribution (available on the homepage above)\n\"     and unarchive the file.\n\" 2.  Move `solarized.vim` to your `.vim/colors` directory.\n\" 3.  Move each of the files in each subdirectories to the corresponding .vim\n\"     subdirectory (e.g. autoload/togglebg.vim goes into your .vim/autoload \n\"     directory as .vim/autoload/togglebg.vim).\n\"\n\" RECOMMENDED PATHOGEN INSTALLATION OPTION:\n\" ---------------------------------------------------------------------\n\"\n\" 1.  Download and install Tim Pope's Pathogen from:\n\"     https://github.com/tpope/vim-pathogen\n\"\n\" 2.  Next, move or clone the `vim-colors-solarized` directory so that it is\n\"     a subdirectory of the `.vim/bundle` directory.\n\"\n\"     a. **clone with git:**\n\"\n\"       $ cd ~/.vim/bundle\n\"       $ git clone git://github.com/altercation/vim-colors-solarized.git\n\"\n\"     b. **or move manually into the pathogen bundle directory:**\n\"         In the parent directory of vim-colors-solarized:\n\"\n\"         $ mv vim-colors-solarized ~/.vim/bundle/\n\"\n\" MODIFY VIMRC:\n\"\n\" After either Option 1 or Option 2 above, put the following two lines in your\n\" .vimrc:\n\"\n\"     syntax enable\n\"     set background=dark\n\"     colorscheme solarized\n\"\n\" or, for the light background mode of Solarized:\n\"\n\"     syntax enable\n\"     set background=light\n\"     colorscheme solarized\n\"\n\" I like to have a different background in GUI and terminal modes, so I can use\n\" the following if-then. However, I find vim's background autodetection to be\n\" pretty good and, at least with MacVim, I can leave this background value\n\" assignment out entirely and get the same results.\n\"\n\"     if has('gui_running')\n\"       set background=light\n\"     else\n\"       set background=dark\n\"     endif\n\"\n\" See the Solarized homepage at http://ethanschoonover.com/solarized for\n\" screenshots which will help you select either the light or dark background.\n\"\n\" ---------------------------------------------------------------------\n\" COLOR VALUES\n\" ---------------------------------------------------------------------\n\" Download palettes and files from: http://ethanschoonover.com/solarized\n\"\n\" L\\*a\\*b values are canonical (White D65, Reference D50), other values are\n\" matched in sRGB space.\n\"\n\" SOLARIZED HEX     16/8 TERMCOL  XTERM/HEX   L*A*B      sRGB        HSB\n\" --------- ------- ---- -------  ----------- ---------- ----------- -----------\n\" base03    #002b36  8/4 brblack  234 #1c1c1c 15 -12 -12   0  43  54 193 100  21\n\" base02    #073642  0/4 black    235 #262626 20 -12 -12   7  54  66 192  90  26\n\" base01    #586e75 10/7 brgreen  240 #4e4e4e 45 -07 -07  88 110 117 194  25  46\n\" base00    #657b83 11/7 bryellow 241 #585858 50 -07 -07 101 123 131 195  23  51\n\" base0     #839496 12/6 brblue   244 #808080 60 -06 -03 131 148 150 186  13  59\n\" base1     #93a1a1 14/4 brcyan   245 #8a8a8a 65 -05 -02 147 161 161 180   9  63\n\" base2     #eee8d5  7/7 white    254 #d7d7af 92 -00  10 238 232 213  44  11  93\n\" base3     #fdf6e3 15/7 brwhite  230 #ffffd7 97  00  10 253 246 227  44  10  99\n\" yellow    #b58900  3/3 yellow   136 #af8700 60  10  65 181 137   0  45 100  71\n\" orange    #cb4b16  9/3 brred    166 #d75f00 50  50  55 203  75  22  18  89  80\n\" red       #dc322f  1/1 red      160 #d70000 50  65  45 220  50  47   1  79  86\n\" magenta   #d33682  5/5 magenta  125 #af005f 50  65 -05 211  54 130 331  74  83\n\" violet    #6c71c4 13/5 brmagenta 61 #5f5faf 50  15 -45 108 113 196 237  45  77\n\" blue      #268bd2  4/4 blue      33 #0087ff 55 -10 -45  38 139 210 205  82  82\n\" cyan      #2aa198  6/6 cyan      37 #00afaf 60 -35 -05  42 161 152 175  74  63\n\" green     #859900  2/2 green     64 #5f8700 60 -20  65 133 153   0  68 100  60\n\"\n\" ---------------------------------------------------------------------\n\" COLORSCHEME HACKING\n\" ---------------------------------------------------------------------\n\"\n\" Useful commands for testing colorschemes:\n\" :source $VIMRUNTIME/syntax/hitest.vim\n\" :help highlight-groups\n\" :help cterm-colors\n\" :help group-name\n\"\n\" Useful links for developing colorschemes:\n\" http://www.vim.org/scripts/script.php?script_id=2937\n\" http://vimcasts.org/episodes/creating-colorschemes-for-vim/\n\" http://www.frexx.de/xterm-256-notes/\"\n\"\n\" }}}\n\" Environment Specific Overrides \"{{{\n\" Allow or disallow certain features based on current terminal emulator or \n\" environment.\n\n\" Terminals that support italics\nlet s:terms_italic=[\n            \\\"rxvt\",\n            \\\"gnome-terminal\"\n            \\]\n\" For reference only, terminals are known to be incomptible.\n\" Terminals that are in neither list need to be tested.\nlet s:terms_noitalic=[\n            \\\"iTerm.app\",\n            \\\"Apple_Terminal\"\n            \\]\nif has(\"gui_running\")\n    let s:terminal_italic=1 \" TODO: could refactor to not require this at all\nelse\n    let s:terminal_italic=0 \" terminals will be guilty until proven compatible\n    for term in s:terms_italic\n        if $TERM_PROGRAM =~ term\n            let s:terminal_italic=1\n        endif\n    endfor\nendif\n\n\" }}}\n\" Default option values\"{{{\n\" ---------------------------------------------------------------------\n\" s:options_list is used to autogenerate a list of all non-default options \n\" using \"call SolarizedOptions()\" or with the \"Generate .vimrc commands\" \n\" Solarized menu option. See the \"Menus\" section below for the function itself.\nlet s:options_list=[\n            \\'\" this block of commands has been autogenerated by solarized.vim and',\n            \\'\" includes the current, non-default Solarized option values.',\n            \\'\" To use, place these commands in your .vimrc file (replacing any',\n            \\'\" existing colorscheme commands). See also \":help solarized\"',\n            \\'',\n            \\'\" ------------------------------------------------------------------',\n            \\'\" Solarized Colorscheme Config',\n            \\'\" ------------------------------------------------------------------',\n            \\]\nlet s:colorscheme_list=[\n            \\'syntax enable',\n            \\'set background='.&background,\n            \\'colorscheme solarized',\n            \\]\nlet s:defaults_list=[\n            \\'\" ------------------------------------------------------------------',\n            \\'',\n            \\'\" The following items are available options, but do not need to be',\n            \\'\" included in your .vimrc as they are currently set to their defaults.',\n            \\''\n            \\]\nlet s:lazycat_list=[\n            \\'\" lazy method of appending this onto your .vimrc \":w! >> ~/.vimrc\"',\n            \\'\" ------------------------------------------------------------------',\n            \\]\n\nfunction! s:SetOption(name,default)\n    if type(a:default) == type(0)\n        let l:wrap=''\n        let l:ewrap=''\n    else\n        let l:wrap='\"'\n        let l:ewrap='\\\"'\n    endif\n    if !exists(\"g:solarized_\".a:name) || g:solarized_{a:name}==a:default\n        exe 'let g:solarized_'.a:name.'='.l:wrap.a:default.l:wrap.'\"'\n        exe 'call add(s:defaults_list, \"\\\" let g:solarized_'.a:name.'='.l:ewrap.g:solarized_{a:name}.l:ewrap.'\")'\n    else\n        exe 'call add(s:options_list,  \"let g:solarized_'.a:name.'='.l:ewrap.g:solarized_{a:name}.l:ewrap.'    \\\"default value is '.a:default.'\")'\n    endif\nendfunction\n\nif ($TERM_PROGRAM ==? \"apple_terminal\" && &t_Co < 256)\n    let s:solarized_termtrans_default = 1\nelse\n    let s:solarized_termtrans_default = 0\nendif\ncall s:SetOption(\"termtrans\",s:solarized_termtrans_default)\ncall s:SetOption(\"degrade\",0)\ncall s:SetOption(\"bold\",1)\ncall s:SetOption(\"underline\",1)\ncall s:SetOption(\"italic\",1) \" note that we need to override this later if the terminal doesn't support\ncall s:SetOption(\"termcolors\",16)\ncall s:SetOption(\"contrast\",\"normal\")\ncall s:SetOption(\"visibility\",\"normal\")\ncall s:SetOption(\"diffmode\",\"normal\")\ncall s:SetOption(\"hitrail\",0)\ncall s:SetOption(\"menu\",1)\n\n\"}}}\n\" Colorscheme initialization \"{{{\n\" ---------------------------------------------------------------------\nhi clear\nif exists(\"syntax_on\")\n  syntax reset\nendif\nlet colors_name = \"solarized\"\n\n\"}}}\n\" GUI & CSApprox hexadecimal palettes\"{{{\n\" ---------------------------------------------------------------------\n\"\n\" Set both gui and terminal color values in separate conditional statements\n\" Due to possibility that CSApprox is running (though I suppose we could just\n\" leave the hex values out entirely in that case and include only cterm colors)\n\" We also check to see if user has set solarized (force use of the\n\" neutral gray monotone palette component)\nif (has(\"gui_running\") && g:solarized_degrade == 0)\n    let s:vmode       = \"gui\"\n    let s:base03      = \"#002b36\"\n    let s:base02      = \"#073642\"\n    let s:base01      = \"#586e75\"\n    let s:base00      = \"#657b83\"\n    let s:base0       = \"#839496\"\n    let s:base1       = \"#93a1a1\"\n    let s:base2       = \"#eee8d5\"\n    let s:base3       = \"#fdf6e3\"\n    let s:yellow      = \"#b58900\"\n    let s:orange      = \"#cb4b16\"\n    let s:red         = \"#dc322f\"\n    let s:magenta     = \"#d33682\"\n    let s:violet      = \"#6c71c4\"\n    let s:blue        = \"#268bd2\"\n    let s:cyan        = \"#2aa198\"\n    \"let s:green       = \"#859900\" \"original\n    let s:green       = \"#719e07\" \"experimental\nelseif (has(\"gui_running\") && g:solarized_degrade == 1)\n    \" These colors are identical to the 256 color mode. They may be viewed\n    \" while in gui mode via \"let g:solarized_degrade=1\", though this is not\n    \" recommened and is for testing only.\n    let s:vmode       = \"gui\"\n    let s:base03      = \"#1c1c1c\"\n    let s:base02      = \"#262626\"\n    let s:base01      = \"#4e4e4e\"\n    let s:base00      = \"#585858\"\n    let s:base0       = \"#808080\"\n    let s:base1       = \"#8a8a8a\"\n    let s:base2       = \"#d7d7af\"\n    let s:base3       = \"#ffffd7\"\n    let s:yellow      = \"#af8700\"\n    let s:orange      = \"#d75f00\"\n    let s:red         = \"#af0000\"\n    let s:magenta     = \"#af005f\"\n    let s:violet      = \"#5f5faf\"\n    let s:blue        = \"#0087ff\"\n    let s:cyan        = \"#00afaf\"\n    let s:green       = \"#5f8700\"\nelseif g:solarized_termcolors != 256 && &t_Co >= 16\n    let s:vmode       = \"cterm\"\n    let s:base03      = \"8\"\n    let s:base02      = \"0\"\n    let s:base01      = \"10\"\n    let s:base00      = \"11\"\n    let s:base0       = \"12\"\n    let s:base1       = \"14\"\n    let s:base2       = \"7\"\n    let s:base3       = \"15\"\n    let s:yellow      = \"3\"\n    let s:orange      = \"9\"\n    let s:red         = \"1\"\n    let s:magenta     = \"5\"\n    let s:violet      = \"13\"\n    let s:blue        = \"4\"\n    let s:cyan        = \"6\"\n    let s:green       = \"2\"\nelseif g:solarized_termcolors == 256\n    let s:vmode       = \"cterm\"\n    let s:base03      = \"234\"\n    let s:base02      = \"235\"\n    let s:base01      = \"239\"\n    let s:base00      = \"240\"\n    let s:base0       = \"244\"\n    let s:base1       = \"245\"\n    let s:base2       = \"187\"\n    let s:base3       = \"230\"\n    let s:yellow      = \"136\"\n    let s:orange      = \"166\"\n    let s:red         = \"124\"\n    let s:magenta     = \"125\"\n    let s:violet      = \"61\"\n    let s:blue        = \"33\"\n    let s:cyan        = \"37\"\n    let s:green       = \"64\"\nelse\n    let s:vmode       = \"cterm\"\n    let s:bright      = \"* term=bold cterm=bold\"\n\"   let s:base03      = \"0\".s:bright\n\"   let s:base02      = \"0\"\n\"   let s:base01      = \"2\".s:bright\n\"   let s:base00      = \"3\".s:bright\n\"   let s:base0       = \"4\".s:bright\n\"   let s:base1       = \"6\".s:bright\n\"   let s:base2       = \"7\"\n\"   let s:base3       = \"7\".s:bright\n\"   let s:yellow      = \"3\"\n\"   let s:orange      = \"1\".s:bright\n\"   let s:red         = \"1\"\n\"   let s:magenta     = \"5\"\n\"   let s:violet      = \"5\".s:bright\n\"   let s:blue        = \"4\"\n\"   let s:cyan        = \"6\"\n\"   let s:green       = \"2\"\n    let s:base03      = \"DarkGray\"      \" 0*\n    let s:base02      = \"Black\"         \" 0\n    let s:base01      = \"LightGreen\"    \" 2*\n    let s:base00      = \"LightYellow\"   \" 3*\n    let s:base0       = \"LightBlue\"     \" 4*\n    let s:base1       = \"LightCyan\"     \" 6*\n    let s:base2       = \"LightGray\"     \" 7\n    let s:base3       = \"White\"         \" 7*\n    let s:yellow      = \"DarkYellow\"    \" 3\n    let s:orange      = \"LightRed\"      \" 1*\n    let s:red         = \"DarkRed\"       \" 1\n    let s:magenta     = \"DarkMagenta\"   \" 5\n    let s:violet      = \"LightMagenta\"  \" 5*\n    let s:blue        = \"DarkBlue\"      \" 4\n    let s:cyan        = \"DarkCyan\"      \" 6\n    let s:green       = \"DarkGreen\"     \" 2\n\nendif\n\"}}}\n\" Formatting options and null values for passthrough effect \"{{{\n\" ---------------------------------------------------------------------\n    let s:none            = \"NONE\"\n    let s:none            = \"NONE\"\n    let s:t_none          = \"NONE\"\n    let s:n               = \"NONE\"\n    let s:c               = \",undercurl\"\n    let s:r               = \",reverse\"\n    let s:s               = \",standout\"\n    let s:ou              = \"\"\n    let s:ob              = \"\"\n\"}}}\n\" Background value based on termtrans setting \"{{{\n\" ---------------------------------------------------------------------\nif (has(\"gui_running\") || g:solarized_termtrans == 0)\n    let s:back        = s:base03\nelse\n    let s:back        = \"NONE\"\nendif\n\"}}}\n\" Alternate light scheme \"{{{\n\" ---------------------------------------------------------------------\nif &background == \"light\"\n    let s:temp03      = s:base03\n    let s:temp02      = s:base02\n    let s:temp01      = s:base01\n    let s:temp00      = s:base00\n    let s:base03      = s:base3\n    let s:base02      = s:base2\n    let s:base01      = s:base1\n    let s:base00      = s:base0\n    let s:base0       = s:temp00\n    let s:base1       = s:temp01\n    let s:base2       = s:temp02\n    let s:base3       = s:temp03\n    if (s:back != \"NONE\")\n        let s:back    = s:base03\n    endif\nendif\n\"}}}\n\" Optional contrast schemes \"{{{\n\" ---------------------------------------------------------------------\nif g:solarized_contrast == \"high\"\n    let s:base01      = s:base00\n    let s:base00      = s:base0\n    let s:base0       = s:base1\n    let s:base1       = s:base2\n    let s:base2       = s:base3\n    let s:back        = s:back\nendif\nif g:solarized_contrast == \"low\"\n    let s:back        = s:base02\n    let s:ou          = \",underline\"\nendif\n\"}}}\n\" Overrides dependent on user specified values and environment \"{{{\n\" ---------------------------------------------------------------------\nif (g:solarized_bold == 0 || &t_Co == 8 )\n    let s:b           = \"\"\n    let s:bb          = \",bold\"\nelse\n    let s:b           = \",bold\"\n    let s:bb          = \"\"\nendif\n\nif g:solarized_underline == 0\n    let s:u           = \"\"\nelse\n    let s:u           = \",underline\"\nendif\n\nif g:solarized_italic == 0 || s:terminal_italic == 0\n    let s:i           = \"\"\nelse\n    let s:i           = \",italic\"\nendif\n\"}}}\n\" Highlighting primitives\"{{{\n\" ---------------------------------------------------------------------\n\nexe \"let s:bg_none      = ' \".s:vmode.\"bg=\".s:none   .\"'\"\nexe \"let s:bg_back      = ' \".s:vmode.\"bg=\".s:back   .\"'\"\nexe \"let s:bg_base03    = ' \".s:vmode.\"bg=\".s:base03 .\"'\"\nexe \"let s:bg_base02    = ' \".s:vmode.\"bg=\".s:base02 .\"'\"\nexe \"let s:bg_base01    = ' \".s:vmode.\"bg=\".s:base01 .\"'\"\nexe \"let s:bg_base00    = ' \".s:vmode.\"bg=\".s:base00 .\"'\"\nexe \"let s:bg_base0     = ' \".s:vmode.\"bg=\".s:base0  .\"'\"\nexe \"let s:bg_base1     = ' \".s:vmode.\"bg=\".s:base1  .\"'\"\nexe \"let s:bg_base2     = ' \".s:vmode.\"bg=\".s:base2  .\"'\"\nexe \"let s:bg_base3     = ' \".s:vmode.\"bg=\".s:base3  .\"'\"\nexe \"let s:bg_green     = ' \".s:vmode.\"bg=\".s:green  .\"'\"\nexe \"let s:bg_yellow    = ' \".s:vmode.\"bg=\".s:yellow .\"'\"\nexe \"let s:bg_orange    = ' \".s:vmode.\"bg=\".s:orange .\"'\"\nexe \"let s:bg_red       = ' \".s:vmode.\"bg=\".s:red    .\"'\"\nexe \"let s:bg_magenta   = ' \".s:vmode.\"bg=\".s:magenta.\"'\"\nexe \"let s:bg_violet    = ' \".s:vmode.\"bg=\".s:violet .\"'\"\nexe \"let s:bg_blue      = ' \".s:vmode.\"bg=\".s:blue   .\"'\"\nexe \"let s:bg_cyan      = ' \".s:vmode.\"bg=\".s:cyan   .\"'\"\n\nexe \"let s:fg_none      = ' \".s:vmode.\"fg=\".s:none   .\"'\"\nexe \"let s:fg_back      = ' \".s:vmode.\"fg=\".s:back   .\"'\"\nexe \"let s:fg_base03    = ' \".s:vmode.\"fg=\".s:base03 .\"'\"\nexe \"let s:fg_base02    = ' \".s:vmode.\"fg=\".s:base02 .\"'\"\nexe \"let s:fg_base01    = ' \".s:vmode.\"fg=\".s:base01 .\"'\"\nexe \"let s:fg_base00    = ' \".s:vmode.\"fg=\".s:base00 .\"'\"\nexe \"let s:fg_base0     = ' \".s:vmode.\"fg=\".s:base0  .\"'\"\nexe \"let s:fg_base1     = ' \".s:vmode.\"fg=\".s:base1  .\"'\"\nexe \"let s:fg_base2     = ' \".s:vmode.\"fg=\".s:base2  .\"'\"\nexe \"let s:fg_base3     = ' \".s:vmode.\"fg=\".s:base3  .\"'\"\nexe \"let s:fg_green     = ' \".s:vmode.\"fg=\".s:green  .\"'\"\nexe \"let s:fg_yellow    = ' \".s:vmode.\"fg=\".s:yellow .\"'\"\nexe \"let s:fg_orange    = ' \".s:vmode.\"fg=\".s:orange .\"'\"\nexe \"let s:fg_red       = ' \".s:vmode.\"fg=\".s:red    .\"'\"\nexe \"let s:fg_magenta   = ' \".s:vmode.\"fg=\".s:magenta.\"'\"\nexe \"let s:fg_violet    = ' \".s:vmode.\"fg=\".s:violet .\"'\"\nexe \"let s:fg_blue      = ' \".s:vmode.\"fg=\".s:blue   .\"'\"\nexe \"let s:fg_cyan      = ' \".s:vmode.\"fg=\".s:cyan   .\"'\"\n\nexe \"let s:fmt_none     = ' \".s:vmode.\"=NONE\".          \" term=NONE\".    \"'\"\nexe \"let s:fmt_bold     = ' \".s:vmode.\"=NONE\".s:b.      \" term=NONE\".s:b.\"'\"\nexe \"let s:fmt_bldi     = ' \".s:vmode.\"=NONE\".s:b.      \" term=NONE\".s:b.\"'\"\nexe \"let s:fmt_undr     = ' \".s:vmode.\"=NONE\".s:u.      \" term=NONE\".s:u.\"'\"\nexe \"let s:fmt_undb     = ' \".s:vmode.\"=NONE\".s:u.s:b.  \" term=NONE\".s:u.s:b.\"'\"\nexe \"let s:fmt_undi     = ' \".s:vmode.\"=NONE\".s:u.      \" term=NONE\".s:u.\"'\"\nexe \"let s:fmt_uopt     = ' \".s:vmode.\"=NONE\".s:ou.     \" term=NONE\".s:ou.\"'\"\nexe \"let s:fmt_curl     = ' \".s:vmode.\"=NONE\".s:c.      \" term=NONE\".s:c.\"'\"\nexe \"let s:fmt_ital     = ' \".s:vmode.\"=NONE\".s:i.      \" term=NONE\".s:i.\"'\"\nexe \"let s:fmt_stnd     = ' \".s:vmode.\"=NONE\".s:s.      \" term=NONE\".s:s.\"'\"\nexe \"let s:fmt_revr     = ' \".s:vmode.\"=NONE\".s:r.      \" term=NONE\".s:r.\"'\"\nexe \"let s:fmt_revb     = ' \".s:vmode.\"=NONE\".s:r.s:b.  \" term=NONE\".s:r.s:b.\"'\"\n\" revbb (reverse bold for bright colors) is only set to actual bold in low \n\" color terminals (t_co=8, such as OS X Terminal.app) and should only be used \n\" with colors 8-15.\nexe \"let s:fmt_revbb    = ' \".s:vmode.\"=NONE\".s:r.s:bb.   \" term=NONE\".s:r.s:bb.\"'\"\nexe \"let s:fmt_revbbu   = ' \".s:vmode.\"=NONE\".s:r.s:bb.s:u.\" term=NONE\".s:r.s:bb.s:u.\"'\"\n\nif has(\"gui_running\")\n    exe \"let s:sp_none      = ' guisp=\".s:none   .\"'\"\n    exe \"let s:sp_back      = ' guisp=\".s:back   .\"'\"\n    exe \"let s:sp_base03    = ' guisp=\".s:base03 .\"'\"\n    exe \"let s:sp_base02    = ' guisp=\".s:base02 .\"'\"\n    exe \"let s:sp_base01    = ' guisp=\".s:base01 .\"'\"\n    exe \"let s:sp_base00    = ' guisp=\".s:base00 .\"'\"\n    exe \"let s:sp_base0     = ' guisp=\".s:base0  .\"'\"\n    exe \"let s:sp_base1     = ' guisp=\".s:base1  .\"'\"\n    exe \"let s:sp_base2     = ' guisp=\".s:base2  .\"'\"\n    exe \"let s:sp_base3     = ' guisp=\".s:base3  .\"'\"\n    exe \"let s:sp_green     = ' guisp=\".s:green  .\"'\"\n    exe \"let s:sp_yellow    = ' guisp=\".s:yellow .\"'\"\n    exe \"let s:sp_orange    = ' guisp=\".s:orange .\"'\"\n    exe \"let s:sp_red       = ' guisp=\".s:red    .\"'\"\n    exe \"let s:sp_magenta   = ' guisp=\".s:magenta.\"'\"\n    exe \"let s:sp_violet    = ' guisp=\".s:violet .\"'\"\n    exe \"let s:sp_blue      = ' guisp=\".s:blue   .\"'\"\n    exe \"let s:sp_cyan      = ' guisp=\".s:cyan   .\"'\"\nelse\n    let s:sp_none      = \"\"\n    let s:sp_back      = \"\"\n    let s:sp_base03    = \"\"\n    let s:sp_base02    = \"\"\n    let s:sp_base01    = \"\"\n    let s:sp_base00    = \"\"\n    let s:sp_base0     = \"\"\n    let s:sp_base1     = \"\"\n    let s:sp_base2     = \"\"\n    let s:sp_base3     = \"\"\n    let s:sp_green     = \"\"\n    let s:sp_yellow    = \"\"\n    let s:sp_orange    = \"\"\n    let s:sp_red       = \"\"\n    let s:sp_magenta   = \"\"\n    let s:sp_violet    = \"\"\n    let s:sp_blue      = \"\"\n    let s:sp_cyan      = \"\"\nendif\n\n\"}}}\n\" Basic highlighting\"{{{\n\" ---------------------------------------------------------------------\n\" note that link syntax to avoid duplicate configuration doesn't work with the\n\" exe compiled formats\n\nexe \"hi! Normal\"         .s:fmt_none   .s:fg_base0  .s:bg_back\n\nexe \"hi! Comment\"        .s:fmt_ital   .s:fg_base01 .s:bg_none\n\"       *Comment         any comment\n\nexe \"hi! Constant\"       .s:fmt_none   .s:fg_cyan   .s:bg_none\n\"       *Constant        any constant\n\"        String          a string constant: \"this is a string\"\n\"        Character       a character constant: 'c', '\\n'\n\"        Number          a number constant: 234, 0xff\n\"        Boolean         a boolean constant: TRUE, false\n\"        Float           a floating point constant: 2.3e10\n\nexe \"hi! Identifier\"     .s:fmt_none   .s:fg_blue   .s:bg_none\n\"       *Identifier      any variable name\n\"        Function        function name (also: methods for classes)\n\"\nexe \"hi! Statement\"      .s:fmt_none   .s:fg_green  .s:bg_none\n\"       *Statement       any statement\n\"        Conditional     if, then, else, endif, switch, etc.\n\"        Repeat          for, do, while, etc.\n\"        Label           case, default, etc.\n\"        Operator        \"sizeof\", \"+\", \"*\", etc.\n\"        Keyword         any other keyword\n\"        Exception       try, catch, throw\n\nexe \"hi! PreProc\"        .s:fmt_none   .s:fg_orange .s:bg_none\n\"       *PreProc         generic Preprocessor\n\"        Include         preprocessor #include\n\"        Define          preprocessor #define\n\"        Macro           same as Define\n\"        PreCondit       preprocessor #if, #else, #endif, etc.\n\nexe \"hi! Type\"           .s:fmt_none   .s:fg_yellow .s:bg_none\n\"       *Type            int, long, char, etc.\n\"        StorageClass    static, register, volatile, etc.\n\"        Structure       struct, union, enum, etc.\n\"        Typedef         A typedef\n\nexe \"hi! Special\"        .s:fmt_none   .s:fg_red    .s:bg_none\n\"       *Special         any special symbol\n\"        SpecialChar     special character in a constant\n\"        Tag             you can use CTRL-] on this\n\"        Delimiter       character that needs attention\n\"        SpecialComment  special things inside a comment\n\"        Debug           debugging statements\n\nexe \"hi! Underlined\"     .s:fmt_none   .s:fg_violet .s:bg_none\n\"       *Underlined      text that stands out, HTML links\n\nexe \"hi! Ignore\"         .s:fmt_none   .s:fg_none   .s:bg_none\n\"       *Ignore          left blank, hidden  |hl-Ignore|\n\nexe \"hi! Error\"          .s:fmt_bold   .s:fg_red    .s:bg_none\n\"       *Error           any erroneous construct\n\nexe \"hi! Todo\"           .s:fmt_bold   .s:fg_magenta.s:bg_none\n\"       *Todo            anything that needs extra attention; mostly the\n\"                        keywords TODO FIXME and XXX\n\"\n\"}}}\n\" Extended highlighting \"{{{\n\" ---------------------------------------------------------------------\nif      (g:solarized_visibility==\"high\")\n    exe \"hi! SpecialKey\" .s:fmt_revr   .s:fg_red    .s:bg_none\n    exe \"hi! NonText\"    .s:fmt_bold   .s:fg_red    .s:bg_none\nelseif  (g:solarized_visibility==\"low\")\n    exe \"hi! SpecialKey\" .s:fmt_bold   .s:fg_base02 .s:bg_none\n    exe \"hi! NonText\"    .s:fmt_bold   .s:fg_base02 .s:bg_none\nelse\n    exe \"hi! SpecialKey\" .s:fmt_bold   .s:fg_base00 .s:bg_base02\n    exe \"hi! NonText\"    .s:fmt_bold   .s:fg_base00 .s:bg_none\nendif\nexe \"hi! StatusLine\"     .s:fmt_none   .s:fg_base1  .s:bg_base02 .s:fmt_revbb\nexe \"hi! StatusLineNC\"   .s:fmt_none   .s:fg_base00 .s:bg_base02 .s:fmt_revbb\nexe \"hi! Visual\"         .s:fmt_none   .s:fg_base01 .s:bg_base03 .s:fmt_revbb\nexe \"hi! Directory\"      .s:fmt_none   .s:fg_blue   .s:bg_none\nexe \"hi! ErrorMsg\"       .s:fmt_revr   .s:fg_red    .s:bg_none\nexe \"hi! IncSearch\"      .s:fmt_stnd   .s:fg_orange .s:bg_none\nexe \"hi! Search\"         .s:fmt_revr   .s:fg_yellow .s:bg_none\nexe \"hi! MoreMsg\"        .s:fmt_none   .s:fg_blue   .s:bg_none\nexe \"hi! ModeMsg\"        .s:fmt_none   .s:fg_blue   .s:bg_none\nexe \"hi! LineNr\"         .s:fmt_none   .s:fg_base01 .s:bg_base02\nexe \"hi! Question\"       .s:fmt_bold   .s:fg_cyan   .s:bg_none\nif ( has(\"gui_running\") || &t_Co > 8 )\n    exe \"hi! VertSplit\"  .s:fmt_none   .s:fg_base00 .s:bg_base00\nelse\n    exe \"hi! VertSplit\"  .s:fmt_revbb  .s:fg_base00 .s:bg_base02\nendif\nexe \"hi! Title\"          .s:fmt_bold   .s:fg_orange .s:bg_none\nexe \"hi! VisualNOS\"      .s:fmt_stnd   .s:fg_none   .s:bg_base02 .s:fmt_revbb\nexe \"hi! WarningMsg\"     .s:fmt_bold   .s:fg_red    .s:bg_none\nexe \"hi! WildMenu\"       .s:fmt_none   .s:fg_base2  .s:bg_base02 .s:fmt_revbb\nexe \"hi! Folded\"         .s:fmt_undb   .s:fg_base0  .s:bg_base02  .s:sp_base03\nexe \"hi! FoldColumn\"     .s:fmt_none   .s:fg_base0  .s:bg_base02\nif      (g:solarized_diffmode==\"high\")\nexe \"hi! DiffAdd\"        .s:fmt_revr   .s:fg_green  .s:bg_none\nexe \"hi! DiffChange\"     .s:fmt_revr   .s:fg_yellow .s:bg_none\nexe \"hi! DiffDelete\"     .s:fmt_revr   .s:fg_red    .s:bg_none\nexe \"hi! DiffText\"       .s:fmt_revr   .s:fg_blue   .s:bg_none\nelseif  (g:solarized_diffmode==\"low\")\nexe \"hi! DiffAdd\"        .s:fmt_undr   .s:fg_green  .s:bg_none   .s:sp_green\nexe \"hi! DiffChange\"     .s:fmt_undr   .s:fg_yellow .s:bg_none   .s:sp_yellow\nexe \"hi! DiffDelete\"     .s:fmt_bold   .s:fg_red    .s:bg_none\nexe \"hi! DiffText\"       .s:fmt_undr   .s:fg_blue   .s:bg_none   .s:sp_blue\nelse \" normal\n    if has(\"gui_running\")\nexe \"hi! DiffAdd\"        .s:fmt_bold   .s:fg_green  .s:bg_base02 .s:sp_green\nexe \"hi! DiffChange\"     .s:fmt_bold   .s:fg_yellow .s:bg_base02 .s:sp_yellow\nexe \"hi! DiffDelete\"     .s:fmt_bold   .s:fg_red    .s:bg_base02\nexe \"hi! DiffText\"       .s:fmt_bold   .s:fg_blue   .s:bg_base02 .s:sp_blue\n    else\nexe \"hi! DiffAdd\"        .s:fmt_none   .s:fg_green  .s:bg_base02 .s:sp_green\nexe \"hi! DiffChange\"     .s:fmt_none   .s:fg_yellow .s:bg_base02 .s:sp_yellow\nexe \"hi! DiffDelete\"     .s:fmt_none   .s:fg_red    .s:bg_base02\nexe \"hi! DiffText\"       .s:fmt_none   .s:fg_blue   .s:bg_base02 .s:sp_blue\n    endif\nendif\nexe \"hi! SignColumn\"     .s:fmt_none   .s:fg_base0\nexe \"hi! Conceal\"        .s:fmt_none   .s:fg_blue   .s:bg_none\nexe \"hi! SpellBad\"       .s:fmt_curl   .s:fg_none   .s:bg_none    .s:sp_red\nexe \"hi! SpellCap\"       .s:fmt_curl   .s:fg_none   .s:bg_none    .s:sp_violet\nexe \"hi! SpellRare\"      .s:fmt_curl   .s:fg_none   .s:bg_none    .s:sp_cyan\nexe \"hi! SpellLocal\"     .s:fmt_curl   .s:fg_none   .s:bg_none    .s:sp_yellow\nexe \"hi! Pmenu\"          .s:fmt_none   .s:fg_base0  .s:bg_base02  .s:fmt_revbb\nexe \"hi! PmenuSel\"       .s:fmt_none   .s:fg_base01 .s:bg_base2   .s:fmt_revbb\nexe \"hi! PmenuSbar\"      .s:fmt_none   .s:fg_base2  .s:bg_base0   .s:fmt_revbb\nexe \"hi! PmenuThumb\"     .s:fmt_none   .s:fg_base0  .s:bg_base03  .s:fmt_revbb\nexe \"hi! TabLine\"        .s:fmt_undr   .s:fg_base0  .s:bg_base02  .s:sp_base0\nexe \"hi! TabLineFill\"    .s:fmt_undr   .s:fg_base0  .s:bg_base02  .s:sp_base0\nexe \"hi! TabLineSel\"     .s:fmt_undr   .s:fg_base01 .s:bg_base2   .s:sp_base0  .s:fmt_revbbu\nexe \"hi! CursorColumn\"   .s:fmt_none   .s:fg_none   .s:bg_base02\nexe \"hi! CursorLine\"     .s:fmt_uopt   .s:fg_none   .s:bg_base02  .s:sp_base1\nexe \"hi! ColorColumn\"    .s:fmt_none   .s:fg_none   .s:bg_base02\nexe \"hi! Cursor\"         .s:fmt_none   .s:fg_base03 .s:bg_base0\nhi! link lCursor Cursor\nexe \"hi! MatchParen\"     .s:fmt_bold   .s:fg_red    .s:bg_base01\n\n\"}}}\n\" vim syntax highlighting \"{{{\n\" ---------------------------------------------------------------------\n\"exe \"hi! vimLineComment\" . s:fg_base01 .s:bg_none   .s:fmt_ital\n\"hi! link vimComment Comment\n\"hi! link vimLineComment Comment\nhi! link vimVar Identifier\nhi! link vimFunc Function\nhi! link vimUserFunc Function\nhi! link helpSpecial Special\nhi! link vimSet Normal\nhi! link vimSetEqual Normal\nexe \"hi! vimCommentString\"  .s:fmt_none    .s:fg_violet .s:bg_none\nexe \"hi! vimCommand\"        .s:fmt_none    .s:fg_yellow .s:bg_none\nexe \"hi! vimCmdSep\"         .s:fmt_bold    .s:fg_blue   .s:bg_none\nexe \"hi! helpExample\"       .s:fmt_none    .s:fg_base1  .s:bg_none\nexe \"hi! helpOption\"        .s:fmt_none    .s:fg_cyan   .s:bg_none\nexe \"hi! helpNote\"          .s:fmt_none    .s:fg_magenta.s:bg_none\nexe \"hi! helpVim\"           .s:fmt_none    .s:fg_magenta.s:bg_none\nexe \"hi! helpHyperTextJump\" .s:fmt_undr    .s:fg_blue   .s:bg_none\nexe \"hi! helpHyperTextEntry\".s:fmt_none    .s:fg_green  .s:bg_none\nexe \"hi! vimIsCommand\"      .s:fmt_none    .s:fg_base00 .s:bg_none\nexe \"hi! vimSynMtchOpt\"     .s:fmt_none    .s:fg_yellow .s:bg_none\nexe \"hi! vimSynType\"        .s:fmt_none    .s:fg_cyan   .s:bg_none\nexe \"hi! vimHiLink\"         .s:fmt_none    .s:fg_blue   .s:bg_none\nexe \"hi! vimHiGroup\"        .s:fmt_none    .s:fg_blue   .s:bg_none\nexe \"hi! vimGroup\"          .s:fmt_undb    .s:fg_blue   .s:bg_none\n\"}}}\n\" diff highlighting \"{{{\n\" ---------------------------------------------------------------------\nhi! link diffAdded Statement\nhi! link diffLine Identifier\n\"}}}\n\" git & gitcommit highlighting \"{{{\n\"git\n\"exe \"hi! gitDateHeader\"\n\"exe \"hi! gitIdentityHeader\"\n\"exe \"hi! gitIdentityKeyword\"\n\"exe \"hi! gitNotesHeader\"\n\"exe \"hi! gitReflogHeader\"\n\"exe \"hi! gitKeyword\"\n\"exe \"hi! gitIdentity\"\n\"exe \"hi! gitEmailDelimiter\"\n\"exe \"hi! gitEmail\"\n\"exe \"hi! gitDate\"\n\"exe \"hi! gitMode\"\n\"exe \"hi! gitHashAbbrev\"\n\"exe \"hi! gitHash\"\n\"exe \"hi! gitReflogMiddle\"\n\"exe \"hi! gitReference\"\n\"exe \"hi! gitStage\"\n\"exe \"hi! gitType\"\n\"exe \"hi! gitDiffAdded\"\n\"exe \"hi! gitDiffRemoved\"\n\"gitcommit\n\"exe \"hi! gitcommitSummary\"      \nexe \"hi! gitcommitComment\"      .s:fmt_ital     .s:fg_base01    .s:bg_none\nhi! link gitcommitUntracked gitcommitComment\nhi! link gitcommitDiscarded gitcommitComment\nhi! link gitcommitSelected  gitcommitComment\nexe \"hi! gitcommitUnmerged\"     .s:fmt_bold     .s:fg_green     .s:bg_none\nexe \"hi! gitcommitOnBranch\"     .s:fmt_bold     .s:fg_base01    .s:bg_none\nexe \"hi! gitcommitBranch\"       .s:fmt_bold     .s:fg_magenta   .s:bg_none\nhi! link gitcommitNoBranch gitcommitBranch\nexe \"hi! gitcommitDiscardedType\".s:fmt_none     .s:fg_red       .s:bg_none\nexe \"hi! gitcommitSelectedType\" .s:fmt_none     .s:fg_green     .s:bg_none\n\"exe \"hi! gitcommitUnmergedType\"\n\"exe \"hi! gitcommitType\"\n\"exe \"hi! gitcommitNoChanges\"\n\"exe \"hi! gitcommitHeader\"\nexe \"hi! gitcommitHeader\"       .s:fmt_none     .s:fg_base01    .s:bg_none\nexe \"hi! gitcommitUntrackedFile\".s:fmt_bold     .s:fg_cyan      .s:bg_none\nexe \"hi! gitcommitDiscardedFile\".s:fmt_bold     .s:fg_red       .s:bg_none\nexe \"hi! gitcommitSelectedFile\" .s:fmt_bold     .s:fg_green     .s:bg_none\nexe \"hi! gitcommitUnmergedFile\" .s:fmt_bold     .s:fg_yellow    .s:bg_none\nexe \"hi! gitcommitFile\"         .s:fmt_bold     .s:fg_base0     .s:bg_none\nhi! link gitcommitDiscardedArrow gitcommitDiscardedFile\nhi! link gitcommitSelectedArrow  gitcommitSelectedFile\nhi! link gitcommitUnmergedArrow  gitcommitUnmergedFile\n\"exe \"hi! gitcommitArrow\"\n\"exe \"hi! gitcommitOverflow\"\n\"exe \"hi! gitcommitBlank\"\n\" }}}\n\" html highlighting \"{{{\n\" ---------------------------------------------------------------------\nexe \"hi! htmlTag\"           .s:fmt_none .s:fg_base01 .s:bg_none\nexe \"hi! htmlEndTag\"        .s:fmt_none .s:fg_base01 .s:bg_none\nexe \"hi! htmlTagN\"          .s:fmt_bold .s:fg_base1  .s:bg_none\nexe \"hi! htmlTagName\"       .s:fmt_bold .s:fg_blue   .s:bg_none\nexe \"hi! htmlSpecialTagName\".s:fmt_ital .s:fg_blue   .s:bg_none\nexe \"hi! htmlArg\"           .s:fmt_none .s:fg_base00 .s:bg_none\nexe \"hi! javaScript\"        .s:fmt_none .s:fg_yellow .s:bg_none\n\"}}}\n\" perl highlighting \"{{{\n\" ---------------------------------------------------------------------\nexe \"hi! perlHereDoc\"    . s:fg_base1  .s:bg_back   .s:fmt_none\nexe \"hi! perlVarPlain\"   . s:fg_yellow .s:bg_back   .s:fmt_none\nexe \"hi! perlStatementFileDesc\". s:fg_cyan.s:bg_back.s:fmt_none\n\n\"}}}\n\" tex highlighting \"{{{\n\" ---------------------------------------------------------------------\nexe \"hi! texStatement\"   . s:fg_cyan   .s:bg_back   .s:fmt_none\nexe \"hi! texMathZoneX\"   . s:fg_yellow .s:bg_back   .s:fmt_none\nexe \"hi! texMathMatcher\" . s:fg_yellow .s:bg_back   .s:fmt_none\nexe \"hi! texMathMatcher\" . s:fg_yellow .s:bg_back   .s:fmt_none\nexe \"hi! texRefLabel\"    . s:fg_yellow .s:bg_back   .s:fmt_none\n\"}}}\n\" ruby highlighting \"{{{\n\" ---------------------------------------------------------------------\nexe \"hi! rubyDefine\"     . s:fg_base1  .s:bg_back   .s:fmt_bold\n\"rubyInclude\n\"rubySharpBang\n\"rubyAccess\n\"rubyPredefinedVariable\n\"rubyBoolean\n\"rubyClassVariable\n\"rubyBeginEnd\n\"rubyRepeatModifier\n\"hi! link rubyArrayDelimiter    Special  \" [ , , ]\n\"rubyCurlyBlock  { , , }\n\n\"hi! link rubyClass             Keyword\n\"hi! link rubyModule            Keyword\n\"hi! link rubyKeyword           Keyword\n\"hi! link rubyOperator          Operator\n\"hi! link rubyIdentifier        Identifier\n\"hi! link rubyInstanceVariable  Identifier\n\"hi! link rubyGlobalVariable    Identifier\n\"hi! link rubyClassVariable     Identifier\n\"hi! link rubyConstant          Type\n\"}}}\n\" haskell syntax highlighting\"{{{\n\" ---------------------------------------------------------------------\n\" For use with syntax/haskell.vim : Haskell Syntax File\n\" http://www.vim.org/scripts/script.php?script_id=3034\n\" See also Steffen Siering's github repository:\n\" http://github.com/urso/dotrc/blob/master/vim/syntax/haskell.vim\n\" ---------------------------------------------------------------------\n\"\n\" Treat True and False specially, see the plugin referenced above\nlet hs_highlight_boolean=1\n\" highlight delims, see the plugin referenced above\nlet hs_highlight_delimiters=1\n\nexe \"hi! cPreCondit\". s:fg_orange.s:bg_none   .s:fmt_none\n\nexe \"hi! VarId\"    . s:fg_blue   .s:bg_none   .s:fmt_none\nexe \"hi! ConId\"    . s:fg_yellow .s:bg_none   .s:fmt_none\nexe \"hi! hsImport\" . s:fg_magenta.s:bg_none   .s:fmt_none\nexe \"hi! hsString\" . s:fg_base00 .s:bg_none   .s:fmt_none\n\nexe \"hi! hsStructure\"        . s:fg_cyan   .s:bg_none   .s:fmt_none\nexe \"hi! hs_hlFunctionName\"  . s:fg_blue   .s:bg_none\nexe \"hi! hsStatement\"        . s:fg_cyan   .s:bg_none   .s:fmt_none\nexe \"hi! hsImportLabel\"      . s:fg_cyan   .s:bg_none   .s:fmt_none\nexe \"hi! hs_OpFunctionName\"  . s:fg_yellow .s:bg_none   .s:fmt_none\nexe \"hi! hs_DeclareFunction\" . s:fg_orange .s:bg_none   .s:fmt_none\nexe \"hi! hsVarSym\"           . s:fg_cyan   .s:bg_none   .s:fmt_none\nexe \"hi! hsType\"             . s:fg_yellow .s:bg_none   .s:fmt_none\nexe \"hi! hsTypedef\"          . s:fg_cyan   .s:bg_none   .s:fmt_none\nexe \"hi! hsModuleName\"       . s:fg_green  .s:bg_none   .s:fmt_undr\nexe \"hi! hsModuleStartLabel\" . s:fg_magenta.s:bg_none   .s:fmt_none\nhi! link hsImportParams      Delimiter\nhi! link hsDelimTypeExport   Delimiter\nhi! link hsModuleStartLabel  hsStructure\nhi! link hsModuleWhereLabel  hsModuleStartLabel\n\n\" following is for the haskell-conceal plugin\n\" the first two items don't have an impact, but better safe\nexe \"hi! hsNiceOperator\"     . s:fg_cyan   .s:bg_none   .s:fmt_none\nexe \"hi! hsniceoperator\"     . s:fg_cyan   .s:bg_none   .s:fmt_none\n\n\"}}}\n\" pandoc markdown syntax highlighting \"{{{\n\" ---------------------------------------------------------------------\n\n\"PandocHiLink pandocNormalBlock\nexe \"hi! pandocTitleBlock\"               .s:fg_blue   .s:bg_none   .s:fmt_none\nexe \"hi! pandocTitleBlockTitle\"          .s:fg_blue   .s:bg_none   .s:fmt_bold\nexe \"hi! pandocTitleComment\"             .s:fg_blue   .s:bg_none   .s:fmt_bold\nexe \"hi! pandocComment\"                  .s:fg_base01 .s:bg_none   .s:fmt_ital\nexe \"hi! pandocVerbatimBlock\"            .s:fg_yellow .s:bg_none   .s:fmt_none\nhi! link pandocVerbatimBlockDeep         pandocVerbatimBlock\nhi! link pandocCodeBlock                 pandocVerbatimBlock\nhi! link pandocCodeBlockDelim            pandocVerbatimBlock\nexe \"hi! pandocBlockQuote\"               .s:fg_blue   .s:bg_none   .s:fmt_none\nexe \"hi! pandocBlockQuoteLeader1\"        .s:fg_blue   .s:bg_none   .s:fmt_none\nexe \"hi! pandocBlockQuoteLeader2\"        .s:fg_cyan   .s:bg_none   .s:fmt_none\nexe \"hi! pandocBlockQuoteLeader3\"        .s:fg_yellow .s:bg_none   .s:fmt_none\nexe \"hi! pandocBlockQuoteLeader4\"        .s:fg_red    .s:bg_none   .s:fmt_none\nexe \"hi! pandocBlockQuoteLeader5\"        .s:fg_base0  .s:bg_none   .s:fmt_none\nexe \"hi! pandocBlockQuoteLeader6\"        .s:fg_base01 .s:bg_none   .s:fmt_none\nexe \"hi! pandocListMarker\"               .s:fg_magenta.s:bg_none   .s:fmt_none\nexe \"hi! pandocListReference\"            .s:fg_magenta.s:bg_none   .s:fmt_undr\n\n\" Definitions\n\" ---------------------------------------------------------------------\nlet s:fg_pdef = s:fg_violet\nexe \"hi! pandocDefinitionBlock\"              .s:fg_pdef  .s:bg_none  .s:fmt_none\nexe \"hi! pandocDefinitionTerm\"               .s:fg_pdef  .s:bg_none  .s:fmt_stnd\nexe \"hi! pandocDefinitionIndctr\"             .s:fg_pdef  .s:bg_none  .s:fmt_bold\nexe \"hi! pandocEmphasisDefinition\"           .s:fg_pdef  .s:bg_none  .s:fmt_ital\nexe \"hi! pandocEmphasisNestedDefinition\"     .s:fg_pdef  .s:bg_none  .s:fmt_bldi\nexe \"hi! pandocStrongEmphasisDefinition\"     .s:fg_pdef  .s:bg_none  .s:fmt_bold\nexe \"hi! pandocStrongEmphasisNestedDefinition\"   .s:fg_pdef.s:bg_none.s:fmt_bldi\nexe \"hi! pandocStrongEmphasisEmphasisDefinition\" .s:fg_pdef.s:bg_none.s:fmt_bldi\nexe \"hi! pandocStrikeoutDefinition\"          .s:fg_pdef  .s:bg_none  .s:fmt_revr\nexe \"hi! pandocVerbatimInlineDefinition\"     .s:fg_pdef  .s:bg_none  .s:fmt_none\nexe \"hi! pandocSuperscriptDefinition\"        .s:fg_pdef  .s:bg_none  .s:fmt_none\nexe \"hi! pandocSubscriptDefinition\"          .s:fg_pdef  .s:bg_none  .s:fmt_none\n\n\" Tables\n\" ---------------------------------------------------------------------\nlet s:fg_ptable = s:fg_blue\nexe \"hi! pandocTable\"                        .s:fg_ptable.s:bg_none  .s:fmt_none\nexe \"hi! pandocTableStructure\"               .s:fg_ptable.s:bg_none  .s:fmt_none\nhi! link pandocTableStructureTop             pandocTableStructre\nhi! link pandocTableStructureEnd             pandocTableStructre\nexe \"hi! pandocTableZebraLight\"              .s:fg_ptable.s:bg_base03.s:fmt_none\nexe \"hi! pandocTableZebraDark\"               .s:fg_ptable.s:bg_base02.s:fmt_none\nexe \"hi! pandocEmphasisTable\"                .s:fg_ptable.s:bg_none  .s:fmt_ital\nexe \"hi! pandocEmphasisNestedTable\"          .s:fg_ptable.s:bg_none  .s:fmt_bldi\nexe \"hi! pandocStrongEmphasisTable\"          .s:fg_ptable.s:bg_none  .s:fmt_bold\nexe \"hi! pandocStrongEmphasisNestedTable\"    .s:fg_ptable.s:bg_none  .s:fmt_bldi\nexe \"hi! pandocStrongEmphasisEmphasisTable\"  .s:fg_ptable.s:bg_none  .s:fmt_bldi\nexe \"hi! pandocStrikeoutTable\"               .s:fg_ptable.s:bg_none  .s:fmt_revr\nexe \"hi! pandocVerbatimInlineTable\"          .s:fg_ptable.s:bg_none  .s:fmt_none\nexe \"hi! pandocSuperscriptTable\"             .s:fg_ptable.s:bg_none  .s:fmt_none\nexe \"hi! pandocSubscriptTable\"               .s:fg_ptable.s:bg_none  .s:fmt_none\n\n\" Headings\n\" ---------------------------------------------------------------------\nlet s:fg_phead = s:fg_orange\nexe \"hi! pandocHeading\"                      .s:fg_phead .s:bg_none.s:fmt_bold\nexe \"hi! pandocHeadingMarker\"                .s:fg_yellow.s:bg_none.s:fmt_bold\nexe \"hi! pandocEmphasisHeading\"              .s:fg_phead .s:bg_none.s:fmt_bldi\nexe \"hi! pandocEmphasisNestedHeading\"        .s:fg_phead .s:bg_none.s:fmt_bldi\nexe \"hi! pandocStrongEmphasisHeading\"        .s:fg_phead .s:bg_none.s:fmt_bold\nexe \"hi! pandocStrongEmphasisNestedHeading\"  .s:fg_phead .s:bg_none.s:fmt_bldi\nexe \"hi! pandocStrongEmphasisEmphasisHeading\".s:fg_phead .s:bg_none.s:fmt_bldi\nexe \"hi! pandocStrikeoutHeading\"             .s:fg_phead .s:bg_none.s:fmt_revr\nexe \"hi! pandocVerbatimInlineHeading\"        .s:fg_phead .s:bg_none.s:fmt_bold\nexe \"hi! pandocSuperscriptHeading\"           .s:fg_phead .s:bg_none.s:fmt_bold\nexe \"hi! pandocSubscriptHeading\"             .s:fg_phead .s:bg_none.s:fmt_bold\n\n\" Links\n\" ---------------------------------------------------------------------\nexe \"hi! pandocLinkDelim\"                .s:fg_base01 .s:bg_none   .s:fmt_none\nexe \"hi! pandocLinkLabel\"                .s:fg_blue   .s:bg_none   .s:fmt_undr\nexe \"hi! pandocLinkText\"                 .s:fg_blue   .s:bg_none   .s:fmt_undb\nexe \"hi! pandocLinkURL\"                  .s:fg_base00 .s:bg_none   .s:fmt_undr\nexe \"hi! pandocLinkTitle\"                .s:fg_base00 .s:bg_none   .s:fmt_undi\nexe \"hi! pandocLinkTitleDelim\"           .s:fg_base01 .s:bg_none   .s:fmt_undi   .s:sp_base00\nexe \"hi! pandocLinkDefinition\"           .s:fg_cyan   .s:bg_none   .s:fmt_undr   .s:sp_base00\nexe \"hi! pandocLinkDefinitionID\"         .s:fg_blue   .s:bg_none   .s:fmt_bold\nexe \"hi! pandocImageCaption\"             .s:fg_violet .s:bg_none   .s:fmt_undb\nexe \"hi! pandocFootnoteLink\"             .s:fg_green  .s:bg_none   .s:fmt_undr\nexe \"hi! pandocFootnoteDefLink\"          .s:fg_green  .s:bg_none   .s:fmt_bold\nexe \"hi! pandocFootnoteInline\"           .s:fg_green  .s:bg_none   .s:fmt_undb\nexe \"hi! pandocFootnote\"                 .s:fg_green  .s:bg_none   .s:fmt_none\nexe \"hi! pandocCitationDelim\"            .s:fg_magenta.s:bg_none   .s:fmt_none\nexe \"hi! pandocCitation\"                 .s:fg_magenta.s:bg_none   .s:fmt_none\nexe \"hi! pandocCitationID\"               .s:fg_magenta.s:bg_none   .s:fmt_undr\nexe \"hi! pandocCitationRef\"              .s:fg_magenta.s:bg_none   .s:fmt_none\n\n\" Main Styles\n\" ---------------------------------------------------------------------\nexe \"hi! pandocStyleDelim\"               .s:fg_base01 .s:bg_none  .s:fmt_none\nexe \"hi! pandocEmphasis\"                 .s:fg_base0  .s:bg_none  .s:fmt_ital\nexe \"hi! pandocEmphasisNested\"           .s:fg_base0  .s:bg_none  .s:fmt_bldi\nexe \"hi! pandocStrongEmphasis\"           .s:fg_base0  .s:bg_none  .s:fmt_bold\nexe \"hi! pandocStrongEmphasisNested\"     .s:fg_base0  .s:bg_none  .s:fmt_bldi\nexe \"hi! pandocStrongEmphasisEmphasis\"   .s:fg_base0  .s:bg_none  .s:fmt_bldi\nexe \"hi! pandocStrikeout\"                .s:fg_base01 .s:bg_none  .s:fmt_revr\nexe \"hi! pandocVerbatimInline\"           .s:fg_yellow .s:bg_none  .s:fmt_none\nexe \"hi! pandocSuperscript\"              .s:fg_violet .s:bg_none  .s:fmt_none\nexe \"hi! pandocSubscript\"                .s:fg_violet .s:bg_none  .s:fmt_none\n\nexe \"hi! pandocRule\"                     .s:fg_blue   .s:bg_none  .s:fmt_bold\nexe \"hi! pandocRuleLine\"                 .s:fg_blue   .s:bg_none  .s:fmt_bold\nexe \"hi! pandocEscapePair\"               .s:fg_red    .s:bg_none  .s:fmt_bold\nexe \"hi! pandocCitationRef\"              .s:fg_magenta.s:bg_none   .s:fmt_none\nexe \"hi! pandocNonBreakingSpace\"         . s:fg_red   .s:bg_none  .s:fmt_revr\nhi! link pandocEscapedCharacter          pandocEscapePair\nhi! link pandocLineBreak                 pandocEscapePair\n\n\" Embedded Code\n\" ---------------------------------------------------------------------\nexe \"hi! pandocMetadataDelim\"            .s:fg_base01 .s:bg_none   .s:fmt_none\nexe \"hi! pandocMetadata\"                 .s:fg_blue   .s:bg_none   .s:fmt_none\nexe \"hi! pandocMetadataKey\"              .s:fg_blue   .s:bg_none   .s:fmt_none\nexe \"hi! pandocMetadata\"                 .s:fg_blue   .s:bg_none   .s:fmt_bold\nhi! link pandocMetadataTitle             pandocMetadata\n\n\"}}}\n\" Utility autocommand \"{{{\n\" ---------------------------------------------------------------------\n\" In cases where Solarized is initialized inside a terminal vim session and \n\" then transferred to a gui session via the command `:gui`, the gui vim process \n\" does not re-read the colorscheme (or .vimrc for that matter) so any `has_gui` \n\" related code that sets gui specific values isn't executed.\n\"\n\" Currently, Solarized sets only the cterm or gui values for the colorscheme \n\" depending on gui or terminal mode. It's possible that, if the following \n\" autocommand method is deemed excessively poor form, that approach will be \n\" used again and the autocommand below will be dropped.\n\"\n\" However it seems relatively benign in this case to include the autocommand \n\" here. It fires only in cases where vim is transferring from terminal to gui \n\" mode (detected with the script scope s:vmode variable). It also allows for \n\" other potential terminal customizations that might make gui mode suboptimal.\n\"\nautocmd GUIEnter * if (s:vmode != \"gui\") | exe \"colorscheme \" . g:colors_name | endif\n\"}}}\n\" Highlight Trailing Space {{{\n\" Experimental: Different highlight when on cursorline\nfunction! s:SolarizedHiTrail()\n    if g:solarized_hitrail==0\n        hi! clear solarizedTrailingSpace\n    else\n        syn match solarizedTrailingSpace \"\\s*$\"\n        exe \"hi! solarizedTrailingSpace \" .s:fmt_undr .s:fg_red .s:bg_none .s:sp_red\n    endif\nendfunction  \naugroup SolarizedHiTrail\n    autocmd!\n    if g:solarized_hitrail==1\n        autocmd! Syntax * call s:SolarizedHiTrail()\n        autocmd! ColorScheme * if g:colors_name == \"solarized\" | call s:SolarizedHiTrail() | else | augroup! s:SolarizedHiTrail | endif\n    endif\naugroup END\n\" }}}\n\" Menus \"{{{\n\" ---------------------------------------------------------------------\n\" Turn off Solarized menu by including the following assignment in your .vimrc:\n\"\n\"    let g:solarized_menu=0\n\nfunction! s:SolarizedOptions()\n    new \"new buffer\n    setf vim \"vim filetype\n    let failed = append(0, s:defaults_list)\n    let failed = append(0, s:colorscheme_list)\n    let failed = append(0, s:options_list)\n    let failed = append(0, s:lazycat_list)\n    0 \"jump back to the top\nendfunction\nif !exists(\":SolarizedOptions\")\n    command SolarizedOptions :call s:SolarizedOptions()\nendif\n\nfunction! SolarizedMenu()\n    if exists(\"g:loaded_solarized_menu\")\n        try\n            silent! aunmenu Solarized\n        endtry\n    endif\n    let g:loaded_solarized_menu = 1\n\n    if g:colors_name == \"solarized\" && g:solarized_menu != 0\n\n        amenu &Solarized.&Contrast.&Low\\ Contrast        :let g:solarized_contrast=\"low\"       \\| colorscheme solarized<CR>\n        amenu &Solarized.&Contrast.&Normal\\ Contrast     :let g:solarized_contrast=\"normal\"    \\| colorscheme solarized<CR>\n        amenu &Solarized.&Contrast.&High\\ Contrast       :let g:solarized_contrast=\"high\"      \\| colorscheme solarized<CR>\n        an    &Solarized.&Contrast.-sep-                 <Nop>\n        amenu &Solarized.&Contrast.&Help:\\ Contrast      :help 'solarized_contrast'<CR>\n\n        amenu &Solarized.&Visibility.&Low\\ Visibility    :let g:solarized_visibility=\"low\"     \\| colorscheme solarized<CR>\n        amenu &Solarized.&Visibility.&Normal\\ Visibility :let g:solarized_visibility=\"normal\"  \\| colorscheme solarized<CR>\n        amenu &Solarized.&Visibility.&High\\ Visibility   :let g:solarized_visibility=\"high\"    \\| colorscheme solarized<CR>\n        an    &Solarized.&Visibility.-sep-                 <Nop>\n        amenu &Solarized.&Visibility.&Help:\\ Visibility    :help 'solarized_visibility'<CR>\n\n        amenu &Solarized.&Background.&Toggle\\ Background :ToggleBG<CR>\n        amenu &Solarized.&Background.&Dark\\ Background   :set background=dark  \\| colorscheme solarized<CR>\n        amenu &Solarized.&Background.&Light\\ Background  :set background=light \\| colorscheme solarized<CR>\n        an    &Solarized.&Background.-sep-               <Nop>\n        amenu &Solarized.&Background.&Help:\\ ToggleBG     :help togglebg<CR>\n\n        if g:solarized_bold==0 | let l:boldswitch=\"On\" | else | let l:boldswitch=\"Off\" | endif\n        exe \"amenu &Solarized.&Styling.&Turn\\\\ Bold\\\\ \".l:boldswitch.\" :let g:solarized_bold=(abs(g:solarized_bold-1)) \\\\| colorscheme solarized<CR>\"\n        if g:solarized_italic==0 | let l:italicswitch=\"On\" | else | let l:italicswitch=\"Off\" | endif\n        exe \"amenu &Solarized.&Styling.&Turn\\\\ Italic\\\\ \".l:italicswitch.\" :let g:solarized_italic=(abs(g:solarized_italic-1)) \\\\| colorscheme solarized<CR>\"\n        if g:solarized_underline==0 | let l:underlineswitch=\"On\" | else | let l:underlineswitch=\"Off\" | endif\n        exe \"amenu &Solarized.&Styling.&Turn\\\\ Underline\\\\ \".l:underlineswitch.\" :let g:solarized_underline=(abs(g:solarized_underline-1)) \\\\| colorscheme solarized<CR>\"\n\n        amenu &Solarized.&Diff\\ Mode.&Low\\ Diff\\ Mode    :let g:solarized_diffmode=\"low\"     \\| colorscheme solarized<CR>\n        amenu &Solarized.&Diff\\ Mode.&Normal\\ Diff\\ Mode :let g:solarized_diffmode=\"normal\"  \\| colorscheme solarized<CR>\n        amenu &Solarized.&Diff\\ Mode.&High\\ Diff\\ Mode   :let g:solarized_diffmode=\"high\"    \\| colorscheme solarized<CR>\n\n        if g:solarized_hitrail==0 | let l:hitrailswitch=\"On\" | else | let l:hitrailswitch=\"Off\" | endif\n        exe \"amenu &Solarized.&Experimental.&Turn\\\\ Highlight\\\\ Trailing\\\\ Spaces\\\\ \".l:hitrailswitch.\" :let g:solarized_hitrail=(abs(g:solarized_hitrail-1)) \\\\| colorscheme solarized<CR>\"\n        an    &Solarized.&Experimental.-sep-               <Nop>\n        amenu &Solarized.&Experimental.&Help:\\ HiTrail    :help 'solarized_hitrail'<CR>\n\n        an    &Solarized.-sep1-                          <Nop>\n\n        amenu &Solarized.&Autogenerate\\ options          :SolarizedOptions<CR>\n\n        an    &Solarized.-sep2-                          <Nop>\n\n        amenu &Solarized.&Help.&Solarized\\ Help          :help solarized<CR>\n        amenu &Solarized.&Help.&Toggle\\ Background\\ Help :help togglebg<CR>\n        amenu &Solarized.&Help.&Removing\\ This\\ Menu     :help solarized-menu<CR>\n\n        an 9999.77 &Help.&Solarized\\ Colorscheme         :help solarized<CR>\n        an 9999.78 &Help.&Toggle\\ Background             :help togglebg<CR>\n        an 9999.79 &Help.-sep3-                          <Nop>\n\n    endif\nendfunction\n\nautocmd ColorScheme * if g:colors_name != \"solarized\" | silent! aunmenu Solarized | else | call SolarizedMenu() | endif\n\n\"}}}\n\" License \"{{{\n\" ---------------------------------------------------------------------\n\"\n\" Copyright (c) 2011 Ethan Schoonover\n\"\n\" Permission is hereby granted, free of charge, to any person obtaining a copy\n\" of this software and associated documentation files (the \"Software\"), to deal\n\" in the Software without restriction, including without limitation the rights\n\" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\" copies of the Software, and to permit persons to whom the Software is\n\" furnished to do so, subject to the following conditions:\n\"\n\" The above copyright notice and this permission notice shall be included in\n\" all copies or substantial portions of the Software.\n\"\n\" THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\" THE SOFTWARE.\n\"\n\" vim:foldmethod=marker:foldlevel=0\n\"}}}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Visual Basic/Index.vbhtml",
    "content": "﻿@Code\n    ViewData(\"Title\") = \"Home Page\"\nEnd Code\n\n@section featured\n    <section class=\"featured\">\n        <div class=\"content-wrapper\">\n            <hgroup class=\"title\">\n                <h1>@ViewData(\"Title\").</h1>\n                <h2>@ViewData(\"Message\")</h2>\n            </hgroup>\n            <p>\n                To learn more about ASP.NET MVC visit\n                <a href=\"http://asp.net/mvc\" title=\"ASP.NET MVC Website\">http://asp.net/mvc</a>.\n                The page features <mark>videos, tutorials, and samples</mark> to help you get the most from ASP.NET MVC.\n                If you have any questions about ASP.NET MVC visit\n                <a href=\"http://forums.asp.net/1146.aspx/1?MVC\" title=\"ASP.NET MVC Forum\">our forums</a>.\n            </p>\n        </div>\n    </section>\nEnd Section\n\n<h3>We suggest the following:</h3>\n<ol class=\"round\">\n    <li class=\"one\">\n        <h5>Getting Started</h5>\n        ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites that\n        enables a clean separation of concerns and that gives you full control over markup\n        for enjoyable, agile development. ASP.NET MVC includes many features that enable\n        fast, TDD-friendly development for creating sophisticated applications that use\n        the latest web standards.\n        <a href=\"http://go.microsoft.com/fwlink/?LinkId=245151\">Learn more…</a>\n    </li>\n\n    <li class=\"two\">\n        <h5>Add NuGet packages and jump-start your coding</h5>\n        NuGet makes it easy to install and update free libraries and tools.\n        <a href=\"http://go.microsoft.com/fwlink/?LinkId=245153\">Learn more…</a>\n    </li>\n\n    <li class=\"three\">\n        <h5>Find Web Hosting</h5>\n        You can easily find a web hosting company that offers the right mix of features\n        and price for your applications.\n        <a href=\"http://go.microsoft.com/fwlink/?LinkId=245157\">Learn more…</a>\n    </li>\n</ol>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Visual Basic/Module1.vb",
    "content": "﻿Module Module1\n\n  Sub Main()\n    Console.Out.WriteLine(\"Hello, I am a little sample application to test GitHub's Linguist module.\")\n    Console.Out.WriteLine(\"I also include a Razor MVC file just to prove it handles cshtml files now.\")\n  End Sub\n\nEnd Module\n"
  },
  {
    "path": "src/test/resources/samples/langs/Visual Basic/VBAllInOne.vb",
    "content": "' Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.\n\nOption Infer On\nOption Explicit Off\nOption Strict Off\n\nImports System\nImports System.Collections.Generic\nImports System.Linq\nImports System.Linq.Expressions\nImports System.Text\nImports M = System.Math\nImports System.Collections\nImports <xmlns:ns=\"foo\">\nImports <xmlns=\"foo\">\n\n#Const line = 6\n#Const foo = True\n#If foo Then\n#Else\n#End If\n' There is no equivalent to #undef in VB.NET:\n'#undef foo\n'#warning foo\n'#error foo\n' There is no equivalent to 'extern alias' in VB:\n'extern alias Foo;\n\n#If DEBUG OrElse TRACE Then\nImports System.Diagnostics\n#ElseIf SILVERLIGHT Then\nImports System.Diagnostics\n#Else\nImports System.Diagnostics\n#End If\n\n#Region \"Region\"\n#Region \"more\"\nImports ConsoleApplication2.Test\n#End Region\nImports X = int1\nImports X = ABC.X(Of Integer)\nImports A.B\n\n#End Region\n<Assembly: System.Copyright(\"(C) 2009\")> \n<Module: System.Copyright(vbLf & vbTab & ChrW(&H123).ToString() & \"(C) 2009\" & ChrW(&H123).ToString())> \nFriend Interface CoContra(Of Out T, In K)\nEnd Interface\nPublic Delegate Sub CoContra2()\n\nNamespace My\n\n    Friend Interface CoContra(Of Out T, In K)\n    End Interface\n    Friend Delegate Sub CoContra2(Of Out T, In K)()\n\n\n    Partial Public Class A\n        Inherits CSType1\n        Implements I\n        <Obsolete()>\n        Public Sub New(<Obsolete()> ByVal foo As Integer)\n            MyBase.New(1)\nL:\n            Dim i As Integer = Len(New Integer)\n            i += 1\n\n#If DEBUG Then\n            Console.WriteLine(export.iefSupplied.command)\n#End If\n            Const local? As Integer = Integer.MaxValue\n            Const local0? As Guid = New Guid(r.ToString())\n\n            'Inserted Compiling code \n            Dim r As Integer\n            Dim Varioblelocal? As Integer = Integer.MaxValue\n            Dim Varioblelocal0? As Guid = New Guid(r.ToString())\n\n            Dim привет = local\n            Dim мир = local\n            Dim local3 = 0, local4 = 1\n            Dim local5 = If(TryCast(Nothing, Action), Nothing)\n            Dim local6 = TypeOf local5 Is Action\n\n            Dim u = 1UI\n\n            Dim U_Renamed = 1UI\n\n            Dim hex As Long = &HBADC0DE, Hex_Renamed As Long = &HDEADBEEFL, l As Long = -1L, L_Renamed As Long = 1L\n\n            Dim ul As ULong = 1UL, Ul_Renamed As ULong = 1UL, uL_Renamed2 As ULong = 1UL, UL_Renamed3 As ULong = 1UL, lu As ULong = 1UL, Lu_Renamed1 As ULong = 1UL, lU_Renamed2 As ULong = 1UL, LU_Renamed3 As ULong = 1UL\n\n            Dim bool As Boolean\n            Dim [byte] As Byte\n            'ChrW(&H0130), hexchar2 = ChrW(&HBAD)\n            'ChrW(&H0066), hexchar = ChrW(&H0130), hexchar2\n            '\"c\"c, \\u0066 = ChrW(&H0066), hexchar\n            Dim [char] As Char = \"c\"c ', \\u0066\n            Dim [decimal] As Decimal = 1.44D\n\n            Dim [dynamic] As Object\n            Dim [double] As Double = m.PI\n            Dim float As Single\n            Dim int As Integer = If(local, -1)\n            Dim [long] As Long\n            Dim [object] As Object\n            Dim [sbyte] As SByte\n            Dim [short] As Short\n            Dim [string] As String = \"\"\"/*\"\n            Dim uint As UInteger\n            Dim [ulong] As ULong\n            Dim [ushort] As UShort\n\n\n            Dim dynamic1 = local5\n            Dim add = 0\n            Dim ascending = 0\n            Dim descending = 0\n            Dim From = 0\n            Dim [get] = 0\n            Dim [global] = 0\n            Dim group = 0\n            Dim into = 0\n            Dim join = 0\n            Dim [let] = 0\n            Dim orderby = 0\n            Dim [partial] = 0\n            Dim remove = 0\n            Dim [select] = 0\n            Dim [set] = 0\n            Dim value = 0\n            Dim var = 0\n            Dim where = 0\n            Dim yield = 0\n\n            If i > 0 Then\n                Return\n            ElseIf i = 0 Then\n                Throw New Exception()\n            End If\n            Dim o1 = New MyObject()\n            Dim o2 = New MyObject(var)\n            Dim o3 = New MyObject With {.A = i}\n            REM Dim o4 = New MyObject(dynamic) With {.A = 0, .B = 0, .C = 0}\n            Dim o5 = New With {Key .A = 0}\n            Dim a() As Integer = {0, 1, 2, 3, 4, 5}\n            Select Case i\n                Case 1\n                    GoTo CaseLabel1\n                Case 2\nCaseLabel1:\n                    GoTo CaseLabel2\n                    Exit Select\n                Case Else\nCaseLabel2:\n                    Return\n            End Select\n            Do While i < 10\n                i += 1\n            Loop\n            Do\n                i += 1\n            Loop While i < 10\n            For j As Integer = 0 To 99\n                Console.WriteLine(j)\n            Next j\n\n            'Modified to include items\n            Dim items = {1, 2, 3, 4, 5, 6, 7, 8}\n            For Each i In items\n                If i = 7 Then\n                    Return\n                Else\n                    Continue For\n                End If\n            Next i\n\n            ' There is no equivalent to a 'checked' block in VB.NET\n            '\t\t\tchecked\n            i += 1\n\n            'Modified use of synclock functions for VB\n            Dim sText As String\n            Dim objLock As Object = New Object()\n            SyncLock objLock\n                sText = \"Hello\"\n            End SyncLock\n\n            Using v = BeginScope()\n                Using a As New A()\n                    Using BeginScope()\n                        Return\n                    End Using\n                End Using\n            End Using\n\n            ' VB does not support iterators and has no equivalent to the C# 'yield' keyword:\n            'yield Return Me.items(i)\n            ' VB does not support iterators and has no equivalent to the C# 'yield' keyword:\n            'yield(break)\n            ' There is no equivalent to a 'fixed' block in VB.NET\n            'Integer* p = Nothing\n\n            Try\n                Throw New Exception 'Nothing\n            Catch av As System.AccessViolationException\n                Throw av\n            Catch e1 As Exception\n                Throw\n            Finally\n            End Try\n\n            Dim anonymous = New With {.a = 1, .B = 2, .c = 3}\n\n            Dim qry = From i1 In {1, 2, 3, 4, 5, 6}\n                      Where i1 < 5\n                      Select New With {.id = i1}\n\n\n            Dim query = From c In customers _\n                            Let d = c _\n                            Where d IsNot Nothing _\n                            Join c1 In customers On c1.GetHashCode() Equals c.GetHashCode() _\n                            Group Join c1 In customers On c1.GetHashCode() Equals c.GetHashCode()\n                            Into e() _\n                            Order By g.Count() Ascending _\n                            Order By g.Key Descending _\n                            Select New With {.Region = g.Key, .CustCount = g.Count()}\n\n\n            'XML Literals\n            Dim x = <xmlliteral>\n                        <test name=\"test\"/>\n                        <test name=\"test2\"></test>\n                    </xmlliteral>\n\n        End Sub\n\n        Protected Sub Finalize()\n        End Sub\n        Private ReadOnly f1 As Integer\n        ' There is no VB.NET equivalent to 'volatile':\n\n        <Obsolete(), NonExisting(), Foo.NonExisting(var, 5), Obsolete(), NonSerialized(), CLSCompliant(True OrElse False And True)>\n        Private f2 As Integer\n\n        <Obsolete()>\n        Public Sub Handler(ByVal value As Object)\n        End Sub\n\n        Public Function m(Of T As {Class, New})(ByVal t1 As T) As Integer\n            MyBase.m(t1)\n            Return 1\n        End Function\n        Public Property P() As String\n            Get\n                Return \"A\"\n            End Get\n            Set(ByVal value As String)\n            End Set\n        End Property\n\n        Public ReadOnly Property p2 As String\n            Get\n            End Get\n        End Property\n\n        Public Property p3 As String\n\n        Default Public Property item(ByVal index As Integer) As Integer\n            Protected Get\n            End Get\n            Set(ByVal value As Integer)\n            End Set\n        End Property\n\n        <Obsolete(), Obsolete()>\n        Public Custom Event E1 As Action\n            ' This code will be run when AddHandler MyEvent, D1 is called\n            AddHandler(ByVal value As Action)\n            End AddHandler\n\n            ' This code will be run when RemoveHandler MyEvent, D1 is called\n            RemoveHandler(ByVal value As Action)\n            End RemoveHandler\n\n            <Obsolete()> RaiseEvent()\n            End RaiseEvent\n        End Event\n\n\n        Public Shared Operator +(ByVal first, ByVal second)\n            Dim handler As System.Delegate = New [Delegate](AddressOf Me.Handler)\n            Return first.Add(second)\n        End Operator\n\n        <Obsolete()>\n        Public Shared Operator IsTrue(ByVal a As A) As Boolean\n            Return True\n        End Operator\n        Public Shared Operator IsFalse(ByVal a As A) As Boolean\n            Return False\n        End Operator\n\n        Class c\n        End Class\n\n        Public Sub A(ByVal value As Integer) Implements I.A\n\n        End Sub\n\n        Public Property Value As String Implements I.Value\n            Get\n\n            End Get\n            Set(ByVal value As String)\n\n            End Set\n        End Property\n    End Class\n\n    Public Structure S\n        Implements I\n\n        Private f1 As Integer\n        ' There is no VB.NET equivalent to 'volatile':\n        ' private volatile int f2;\n\n        <Obsolete()> Private f2 As Integer\n\n        Public Function m(Of T As {Structure, New})(ByVal s As T) As Integer\n            Return 1\n        End Function\n\n        Public Property P1() As String\n            Get\n                Dim value As Integer = 0\n                Return \"A\"\n            End Get\n            Set(ByVal value As String)\n            End Set\n        End Property\n\n        'vb.net can't support abstract member variable\n        Public ReadOnly Property P2() As String\n            Get\n            End Get\n        End Property\n\n        Public Property p3 As String '//Auto Property\n\n        Default Public Property item(ByVal index As Integer) As Integer\n            Get\n            End Get\n            Friend Set(ByVal value As Integer)\n            End Set\n        End Property\n\n\n        Public Event E()\n\n        Public Shared Operator +(ByVal first, ByVal second)\n            Return first.Add(second)\n            'fixed Integer field(10)\n        End Operator\n\n        Class c\n        End Class\n\n        Public Sub A(ByVal value As Integer) Implements I.A\n\n        End Sub\n\n        Public Property Value As String Implements I.Value\n            Get\n\n            End Get\n            Set(ByVal value As String)\n\n            End Set\n        End Property\n    End Structure\n    Public Interface I\n        Sub A(ByVal value As Integer)\n        Property Value() As String\n    End Interface\n    <Flags()>\n    Public Enum E\n        A\n        B = A\n        C = 2 + A\n\n#If DEBUG Then\n        D\n#End If\n\n    End Enum\n    Public Delegate Sub [Delegate](ByVal P As Object)\n\n    Namespace Test\n        Public Class Список\n            Public Shared Function Power(ByVal number As Integer, ByVal exponent As Integer) As IEnumerable\n                Dim Список As New Список()\n                Список.Main()\n                Dim counter As Integer = 0\n                Dim result As Integer = 0\n\n                'Do While ++counter++ < --exponent--\n                '                         result = result * number + +number + ++++number\n                '                ' VB does not support iterators and has no equivalent to the C# 'yield' keyword:\n                '                'yield Return result\n                '            Loop\n            End Function\n            Shared Sub Main()\n                For Each i As Integer In Power(2, 8)\n                    Console.Write(\"{0} \", arg0:=i)\n                Next i\n            End Sub\n        End Class\n    End Namespace\nEnd Namespace\n\nNamespace ConsoleApplication1\n    Namespace RecursiveGenericBaseType\n        MustInherit Class A(Of T)\n            Inherits B(Of A(Of T), A(Of T))\n\n            Protected Overridable Function M() As A(Of T)\n            End Function\n\n            Protected MustOverride Function N() As B(Of A(Of T), A(Of T))\n\n            Shared Function O() As B(Of A(Of T), A(Of T))\n            End Function\n        End Class\n\n        Class B(Of T1, T2)\n            Inherits A(Of B(Of T1, T2))\n\n            Protected Overrides Function M() As A(Of T)\n            End Function\n            Protected NotOverridable Overrides Function N() As B(Of A(Of T), A(Of T))\n            End Function\n            Shared Shadows Function O() As A(Of T)\n            End Function\n        End Class\n    End Namespace\nEnd Namespace\n\nNamespace Boo\n    Public Class Bar(Of T As IComparable)\n        Public f As T\n\n        Public Class Foo(Of U)\n            Implements IEnumerator(Of T)\n\n            Public Sub Method(Of K As {IList(Of V), IList(Of T), IList(Of U)}, V As IList(Of K))(ByVal k1 As K, ByVal t1 As T, ByVal u1 As U)\n                Dim a As A(Of Integer)\n            End Sub\n\n            Public ReadOnly Property Current As T Implements System.Collections.Generic.IEnumerator(Of T).Current\n                Get\n\n                End Get\n            End Property\n\n            Public ReadOnly Property Current1 As Object Implements System.Collections.IEnumerator.Current\n                Get\n\n                End Get\n            End Property\n\n            Public Function MoveNext() As Boolean Implements System.Collections.IEnumerator.MoveNext\n\n            End Function\n\n            Public Sub Reset() Implements System.Collections.IEnumerator.Reset\n\n            End Sub\n\n#Region \"IDisposable Support\"\n            Private disposedValue As Boolean ' To detect redundant calls\n\n            ' IDisposable\n            Protected Overridable Sub Dispose(ByVal disposing As Boolean)\n                If Not Me.disposedValue Then\n                    If disposing Then\n\n                    End If\n\n\n                End If\n                Me.disposedValue = True\n            End Sub\n\n            Public Sub Dispose() Implements IDisposable.Dispose\n                Dispose(True)\n                GC.SuppressFinalize(Me)\n            End Sub\n#End Region\n\n        End Class\n    End Class\nEnd Namespace\n\nFriend Class Test2\n    Private Sub Bar3()\n        Dim x = New Boo.Bar(Of Integer).Foo(Of Object)()\n        x.Method(Of String, String)(\" \", 5, New Object())\n\n        Dim q = From i In New Integer() {1, 2, 3, 4}\n                Where i > 5\n                Select i\n    End Sub\n\n    Public Shared Widening Operator CType(ByVal s As String) As Test2\n        Return New Test2()\n    End Operator\n\n    Public Shared Narrowing Operator CType(ByVal s As Integer) As Test2\n        Return New Test2()\n    End Operator\n\n    Public foo As Integer = 5\n    Private Sub Bar2()\n        foo = 6\n        Me.foo = 5.GetType()\n        Dim t As Test2 = \"sss\"\n    End Sub\n    Private Sub Blah()\n        Dim i As Integer = 5\n        Dim j? As Integer = 6\n\n        Dim e As Expression(Of Func(Of Integer)) = Function() i\n    End Sub\n\n    Public Property FFoo() As Type\n        Get\n            Return GetType(System.Int32)\n        End Get\n        Set(ByVal value As Type)\n            Dim t = GetType(System.Int32)\n            t.ToString()\n            t = value\n        End Set\n    End Property\n    Public Sub Constants()\n        Dim i As Integer = 1 + 2 + 3 + 5\n        Dim s As Global.System.String = \"a\" & CStr(\"a\") & \"a\" & \"a\" & \"a\" & \"A\"\n    End Sub\n\n    Public Sub ConstructedType()\n        Dim i As List(Of Integer) = Nothing\n        Dim c As Integer = i.Count\n    End Sub\nEnd Class\nNamespace Comments.XmlComments.UndocumentedKeywords\n    ''' <summary>\n    ''' Whatever \n    ''' </summary>\n    ''' <!-- c -->\n    ''' <![CDATA[c]]> //\n    ''' <c></c> /* */\n    ''' <code></code>\n    ''' <example></example>\n    ''' <exception cref=\"bla\"></exception>\n    ''' <include file='' path='[@name=\"\"]'/>\n    ''' <permission cref=\" \"></permission>\n    ''' <remarks></remarks>\n    ''' <see cref=\"\"/>\n    ''' <seealso cref=\" \"/>\n    ''' <value></value>\n    ''' <typeparam name=\"T\"></typeparam>\n    Class c(Of T)\n        Sub M(Of U)(ByVal T1 As T, ByVal U1 As U)\n            Dim intValue As Integer = 0\n            intValue = intValue + 1\n            Dim strValue As String = \"hello\" 's\n            Dim c As New [MyClass]()\n            Dim verbatimStr As String = \"@ \\\\\\\\\" 's\n        End Sub\n    End Class\n\nEnd Namespace\nFriend Class TestClassXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 'Scen8\nEnd Class\n\nFriend Class TestClass1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX22 'Scen9\nEnd Class\n\nFriend Class yield\n    ''INSTANT VB TODO TASK: There is no equivalent to the undocumented C# '__arglist' keyword in VB:\n    'Private Sub Foo(Of U)(ByVal __arglist)\n    '    Dim c1 As C(Of U) = Nothing\n    '    c1.M(Of Integer)(5, Nothing)\n    '    Dim tr As TypedReference = __makeref(c1)\n    '    Dim t As Type = __reftype(tr)\n\n    '    \tDim j As Integer = __refvalue(tr, Integer)\n\n    '    Params(a:=t, b:=t)\n    'End Sub\n    Private Sub Params(ByRef a As Object, <System.Runtime.InteropServices.Out()> ByRef b As Object, ByVal ParamArray c() As Object)\n    End Sub\n\n    'Private Sub Params(Optional <System.Runtime.InteropServices.Out()> ByRef a As dynamic = 2, Optional ByRef c As dynamic = Nothing, ParamArray ByVal c()() As dynamic)\n    'End Sub\n    Public Overrides Function ToString() As String\n        Return MyBase.ToString()\n    End Function\n\n    Public Sub method()\n        Dim a?(4) As Integer '[] bug\n        ' YES []\n        Dim var() As Integer = {1, 2, 3, 4, 5} ',;\n        Dim i As Integer = a(i) '[]\n        Dim f As New Foo(Of T)() '<> ()\n        f.method()\n        i = i + i - i * i \\ i Mod i And i Or i Xor i '+ - * / % & | ^\n\n        Dim b As Boolean = True And False Or True Xor False '& | ^\n        b = Not b '!\n        i = Not i '~i\n        b = i < i AndAlso i > i '< && >\n\n        Dim ii? As Integer = 5 '? bug\n        ' NO ?\n        Dim f1 As Integer = If(True, 1, 0) '? :\n        ' YES :\n        i += 1 '++\n        i -= 1 '--\n        b = True AndAlso False OrElse True '&& ||\n        i = i << 5 '<<\n        i = i >> 5 '>>\n        b = i = i AndAlso i <> i AndAlso i <= i AndAlso i >= i '= == && != <= >=\n        i += 5.0 '+=\n        i -= i '-=\n        i *= i '*=\n        i \\= i '/\n        '=\n        i = i Mod i '%=\n        i = i And i '&=\n        i = i Or i '|=\n        i = i Xor i '^=\n        i <<= i '<<=\n        i >>= i '>>=\n        Dim s As Object = Function(x) x + 1 '=>\n\n\n        ' There is no equivalent to an 'unsafe' block in VB.NET\n        '\t\t\tunsafe\n        '\t\tPoint* p = &point '* &\n        '\t\t\tp->x = 10 '->\n\n        Dim p As Point\n        p.X = 10\n        p.Y = 12\n\n        Dim p2 As New Point With {.X = 10, .Y = 12}\n\n\n        Dim br As IO.BinaryReader = Nothing\n    End Sub\n\n    Friend Structure Point\n        Public X As Integer\n        Public Y As Integer\n    End Structure\nEnd Class\n\n'Extension Method\nModule Module1\n    <Runtime.CompilerServices.Extension()> Function FooExtension(ByVal x As String) As String\n        Return x & \"test\"\n    End Function\n\n    <Runtime.CompilerServices.Extension()> Function FooExtension(ByVal x As String,\n                                                                 ByVal y As Integer) As String\n        'With Implicit Line Continuation\n        Return x & \"test2\"\n    End Function\n\n    Sub Foo()\n        'Collections\n        Dim i As New List(Of String) From {\"test\", \"item\"}\n        Dim i1 As New Dictionary(Of Integer, String) From {{1, \"test\"}, {2, \"item\"}}\n\n        'Arrays\n        Dim ia1 = {1, 2, 3, 4, 5}\n        Dim la2 = {1,\n                   2L,\n                   3,\n                   4S,\n                   5}\n        Console.Write(GetXmlNamespace(ns))\n        Dim ia3 As Integer() = {1,\n                                2,\n                                3, 4, 5}\n        Dim ia4() As Integer = {1,\n                                2, 3, 4,\n                                5}\n\n        Dim ia5 = New Integer() {1, 2, 3, 4, 5}\n\n\n        Dim ia6 = {{1, 2}, {3, 4}, {5, 6}} '2d array\n        Dim ia7 = {({1}), ({3, 4}), ({5, 6, 2})} 'jagged array\n\n        'Standalone\n        If {1, 2, 3}.Count = 2 Then\n        ElseIf {1, 2, 3}.Count = 3 Then\n        Else\n        End If\n\n    End Sub\nEnd Module\n\n\n\n\n#Region \"Events\"\nPublic Delegate Sub MyDelegate(ByVal message As String)\n\nClass MyClass1\n\n    Custom Event MyEvent As MyDelegate\n\n        ' This code will be run when AddHandler MyEvent, D1\n        ' is called\n        AddHandler(ByVal value As MyDelegate)\n            Console.WriteLine(\"Adding Handler for MyEvent\")\n            MyEventHandler = value\n        End AddHandler\n\n        ' This code will be run when RemoveHandler MyEvent, D1\n        ' is called\n        RemoveHandler(ByVal value As MyDelegate)\n            Console.WriteLine(\"Removing Handler for MyEvent\")\n            MyEventHandler = Nothing\n        End RemoveHandler\n\n        ' This code will be run when RaiseEvent MyEvent(string)\n        ' is called\n        RaiseEvent(ByVal message As String)\n            If Not MyEventHandler Is Nothing Then\n                MyEventHandler.Invoke(message)\n            Else\n                Console.WriteLine(\"No Handler for Raised MyEvent\")\n            End If\n        End RaiseEvent\n    End Event\n\n    Public MyEventHandler As MyDelegate\n\n    Public Sub Raise_Event()\n        RaiseEvent MyEvent(\"MyEvent Was Raised\")\n    End Sub\nEnd Class\n\nModule DelegateModule\n    Dim Var1 As MyClass1\n    Dim D1 As MyDelegate\n\n    Sub EventsMain()\n        Var1 = New MyClass1\n        D1 = New MyDelegate(AddressOf MyHandler)\n        AddHandler Var1.MyEvent, D1\n        Var1.Raise_Event()\n        RemoveHandler Var1.MyEvent, D1\n    End Sub\n\n    Sub MyHandler(ByVal message As String)\n        Console.WriteLine(\"Event Handled: \" & message)\n    End Sub\nEnd Module\n\n#End Region\n\n#Region \"Linq\"\nModule LINQQueries\n    Sub Join()\n        Dim categories() = {\"Beverages\", \"Condiments\", \"Vegetables\", \"Dairy Products\", \"Seafood\"}\n\n        Dim productList = {New With {.category = \"Condiments\", .name = \"Ketchup\"}, New With {.category = \"Seafood\", .name = \"Code\"}}\n\n        Dim query = From c In categories _\n                    Group Join p In productList On c Equals p.category Into Group _\n                    From p In Group _\n                    Select Category = c, p.name\n\n        For Each v In query\n            Console.WriteLine(v.name + \": \" + v.Category)\n        Next\n    End Sub\nEnd Module\n#End Region\n\n\n#Region \"Lambda's\"\nModule Lambdas\n    Dim l1 = Sub()\n                 Console.WriteLine(\"Sub Statement\")\n             End Sub\n\n    Dim L2 = Sub() Console.WriteLine(\"Sub Statement 2\")\n\n    Dim L3 = Function(x As Integer) x Mod 2\n\n    Dim L4 = Function(y As Integer) As Boolean\n                 If y * 2 < 10 Then\n                     Return True\n                 Else\n                     Return False\n                 End If\n             End Function\nEnd Module\n#End Region\n\n#Region \"Co Contra Variance\"\nPublic Class Cheetah\n\nEnd Class\nPublic Class Animals\n\nEnd Class\nPublic Interface IVariance(Of In T)\n    Sub Foo(ByVal a As T)\n    Property InterProperty() As IVariance(Of Cheetah)\n    Property InterProperty2() As IVariance(Of Animals)\nEnd Interface\n\nDelegate Sub Func(Of In T)(ByVal a As T)\n\n\nPublic Delegate Function Func2(Of Out T)() As T\nPublic Interface IVariance2(Of Out T)\n    Function Foo() As T\nEnd Interface\n\nPublic Class Variance2(Of T As New) : Implements IVariance2(Of T)\n\n    Dim type As IVariance2(Of Animals)\n\n    Public Function Foo() As T Implements IVariance2(Of T).Foo\n        Return New T\n    End Function\n\n    Function Foo(ByVal arg As IVariance2(Of T)) As String\n        Return arg.GetType.ToString\n    End Function\n\n    Function Goo(ByVal arg As Func2(Of T)) As String\n        Return arg.Invoke().GetType.ToString\n    End Function\nEnd Class\n\n#End Region\n\nModule Mod1Orcas\n    Dim AT1 = New With {Key .prop1 = 1}\n    Dim AT2 = New With {.prop1 = 7}\n    Dim b_false As Boolean = False\n    Dim n_false = False\n    Dim i = If(b_false And n_false, 1, 2)\n    Dim s1 = <xml_literal><%= If(Nothing, Nothing) %></xml_literal>\n\n    Delegate Sub delfoo()\n    Delegate Sub delfoo1(ByVal sender As Object, ByVal e As System.EventArgs)\n\n    Sub Foo()\n    End Sub\n\n    Sub Method1(ByVal sender As Object, ByVal e As System.EventArgs)\n    End Sub\n    Sub Method1a()\n    End Sub\n\n    Sub AssignDelegate()\n        Dim d As delfoo = AddressOf Foo\n        d.Invoke()\n\n\n        Dim d1_1 As delfoo1 = AddressOf Method1\n        Dim d1_1a As delfoo1 = AddressOf Method1a 'Relaxed Delegate\n\n\n\n\n        'Nullable\n        Dim Value1a As Integer? = 10\n        Dim Value1b As Integer = 1\n        Dim Value1c? As Integer = 1\n        Dim Value1c? As Integer? = 1\n        Dim TestReturnValue = Value1a * Value1b\n        If Value1a / Value1b > 0 Then\n\n        End If\n\n        Dim sNone = \"None\"\n        Dim SSystemOnly = \"SystemOnly\"\n\n        Dim XMLLiteral = <?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n                         <Details>\n                             <FileImports>\n                                 <FileImport name=<%= sNone %>>\n                                 </FileImport>\n                                 <FileImport name=<%= SSystemOnly %>>\n        Imports System\n      </FileImport>\n                                 <FileImport name=\"Default\">\n        Imports System\n        Imports System.Collections\n      </FileImport>\n                             </FileImports>\n\n                             <CodeConstructs>\n                                 <!-- Type Constructs-->\n                                 <Construct name=\"Module\" allowcodeblock=\"false\" allowOuter=\"true\" group=\"Type\" allownesting=\"true\" isnestable=\"false\" allowsoverload=\"false\">\n                                     <Start>public Module {Identifier}</Start>\n                                     <End>End Module </End>\n                                     <DefaultIdent>Module_</DefaultIdent>\n                                 </Construct>\n                                 <Construct name=\"Class\" allowcodeblock=\"false\" allowOuter=\"true\" group=\"Type\" allownesting=\"true\" isnestable=\"true\" allowsoverload=\"false\">\n                                     <Start>public class {Identifier}</Start>\n                                     <End>End Class</End>\n                                     <DefaultIdent>Class_</DefaultIdent>\n                                 </Construct>\n                                 <Construct name=\"Structure\" allowcodeblock=\"false\" allowOuter=\"true\" group=\"Type\" allownesting=\"true\" isnestable=\"true\" allowsoverload=\"false\">\n                                     <Start>public class {Identifier}</Start>\n                                     <End>End Class</End>\n                                     <DefaultIdent>Struct_</DefaultIdent>\n                                 </Construct>\n                             </CodeConstructs>\n\n                             <CodeBlocks>\n                                 <Block name=\"CodeBlock0.txt\" statements=\"1\">\n                                     <![CDATA[ Dim <{x0}> = Microsoft.VisualBasic.FileSystem.Dir(\".\") ]]>\n                                 </Block>\n                                 <Block name=\"CodeBlock1.txt\" statements=\"1\">\n                                     <![CDATA[ Dim <{x0}> = 1 ]]>\n                                 </Block>\n                                 <Block name=\"CodeBlock2.txt\" statements=\"1\">\n                                     <![CDATA[ Dim <{x0}> as string = \"2\" ]]>\n                                 </Block>\n                             </CodeBlocks>\n                         </Details>\n        Dim x = <![CDATA[ Dim <{x0}> as string = \"2\" ]]>\n        Dim y = <!-- --> : Call <?a?>() : Dim x = <e/>\n    End Sub\nEnd Module\n\nClass Customer\n    Public Property name As String = \"Default\"\n    Public AGe As Integer\n    Public Postion As String\n    Public Level As Integer = 0\n    Public Property age2 As Integer\nEnd Class\n\nClass Foo\n    Structure Bar\n        Dim x As Integer\n\n        Sub LoopingMethod()\n            For i = 1 To 20 Step 1\n            Next i\n\n            For Each a In {1, 2, 3, 4}\n            Next\n\n            Dim icount As Integer\n            Do While icount <= 10\n                icount += 1\n            Loop\n\n            icount = 0\n            While icount <= 100\n                icount += 1\n            End While\n\n            icount = 0\n            Do Until icount >= 10\n                icount += 2\n            Loop\n        End Sub\n    End Structure\nEnd Class\n\nClass FooGen(Of t)\n    Structure BarGen(Of u)\n        Dim x As t\n        Dim z As u\n        Sub SelectionMethods()\n\n            Dim icount As Integer = 1L\n\n            If icount = 1 Then\n            ElseIf icount > 1 Then\n            Else\n            End If\n\n            Select Case icount\n                Case 1\n                Case 2, 3\n                Case Is > 3\n                Case Else\n            End Select\n        End Sub\n\n        Sub Operators()\n            Dim a As Boolean = True\n            Dim b As Boolean = False\n\n            If a And\n                b Then\n            End If\n\n            If a Or\n                b Then\n            End If\n\n            If Not a And\n                   b Then\n            End If\n\n            If a = b AndAlso\n                   b = True Then\n            End If\n\n            If a =\n                b OrElse\n                b =\n                False Then\n            End If\n\n            If (a Or\n                b) OrElse b =\n            True Then\n            End If\n\n        End Sub\n\n        Sub Method1()\n\n            Dim x As New Customer With {.name = \"Test\",\n                                        .AGe = 30,\n                                        .Level = 1, .Postion = \"SDET\"}\n\n\n            Dim x2 As New Customer With {.name = \"Test\",\n                                        .AGe = 30,\n                                        .Level = 1, .Postion = \"SDET\",\n                                         .age2 = .AGe}\n\n        End Sub\n\n\n    End Structure\nEnd Class\n\n\nPublic Class Bar\n\nEnd Class\n\nPublic Class ClsPPMTest003\n    Partial Private Sub Foo3()\n    End Sub\nEnd Class\n\nPartial Public Class ClsPPMTest003\n    Private Sub Foo3()\n    End Sub\n\n    Public Sub CallFooFromClass()\n        Me.Foo3()\n        Dim x1 As New Foo\n        Dim y1 As New Bar\n\n        If x1 Is y1 Then\n        Else\n            Console.WriteLine(\"Expected Result Occurred\")\n        End If\n\n        If x1 IsNot y1 Then\n        Else\n            Console.WriteLine(\"Expected Result Occurred\")\n        End If\n\n    End Sub\nEnd Class\n"
  },
  {
    "path": "src/test/resources/samples/langs/Visual Basic/cApplication.cls",
    "content": "VERSION 1.0 CLASS\nBEGIN\n  MultiUse = -1  'True\n  Persistable = 0  'NotPersistable\n  DataBindingBehavior = 0  'vbNone\n  DataSourceBehavior  = 0  'vbNone\n  MTSTransactionMode  = 0  'NotAnMTSObject\nEND\nAttribute VB_Name = \"cApplication\"\nAttribute VB_GlobalNameSpace = False\nAttribute VB_Creatable = True\nAttribute VB_PredeclaredId = False\nAttribute VB_Exposed = False\n'*************************************************************************************************************************************************************************************************************************************************\n'\n' Copyright (c) David Briant 2009-2012 - All rights reserved\n'\n'*************************************************************************************************************************************************************************************************************************************************\n\nOption Explicit\n\nPrivate Declare Function apiSetProp Lib \"user32\" Alias \"SetPropA\" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long\nPrivate Declare Function apiGlobalAddAtom Lib \"kernel32\" Alias \"GlobalAddAtomA\" (ByVal lpString As String) As Long\nPrivate Declare Function apiSetForegroundWindow Lib \"user32\" Alias \"SetForegroundWindow\" (ByVal hwnd As Long) As Long\n\nPrivate myMouseEventsForm As fMouseEventsForm\nPrivate WithEvents myAST As cTP_AdvSysTray\nAttribute myAST.VB_VarHelpID = -1\n\nPrivate myClassName As String\nPrivate myWindowName As String\nPrivate Const TEN_MILLION As Single = 10000000\n\nPrivate WithEvents myListener As VLMessaging.VLMMMFileListener\nAttribute myListener.VB_VarHelpID = -1\nPrivate WithEvents myMMFileTransports As VLMessaging.VLMMMFileTransports\nAttribute myMMFileTransports.VB_VarHelpID = -1\n\nPrivate myMachineID As Long\n\nPrivate myRouterSeed As Long\nPrivate myRouterIDsByMMTransportID As New Dictionary\nPrivate myMMTransportIDsByRouterID As New Dictionary\n\nPrivate myDirectoryEntriesByIDString As New Dictionary\n\nPrivate Const GET_ROUTER_ID As String = \"GET_ROUTER_ID\"\nPrivate Const GET_ROUTER_ID_REPLY As String = \"GET_ROUTER_ID_REPLY\"\nPrivate Const REGISTER_SERVICE As String = \"REGISTER_SERVICE\"\nPrivate Const REGISTER_SERVICE_REPLY As String = \"REGISTER_SERVICE_REPLY\"\nPrivate Const UNREGISTER_SERVICE As String = \"UNREGISTER_SERVICE\"\nPrivate Const UNREGISTER_SERVICE_REPLY As String = \"UNREGISTER_SERVICE_REPLY\"\nPrivate Const GET_SERVICES As String = \"GET_SERVICES\"\nPrivate Const GET_SERVICES_REPLY As String = \"GET_SERVICES_REPLY\"\n\n\n'*************************************************************************************************************************************************************************************************************************************************\n' Initialize / Release\n'*************************************************************************************************************************************************************************************************************************************************\n\nPrivate Sub class_Initialize()\n    Dim atomID As Long\n    Randomize\n    ' hide us from the Applications list in the Windows Task Manager\n    App.TaskVisible = False\n    \n    ' listen for connections\n    myClassName = \"VLMMachineRouter\" & CStr(Int(Rnd() * TEN_MILLION) + 1)\n    Randomize\n    myWindowName = \"VLMMachineRouter\" & CStr(Int(Rnd() * TEN_MILLION) + 1)\n    Set myListener = New VLMMMFileListener\n    myListener.listenViaNamedWindow myClassName, myWindowName, 1024 * 8\n    Set myMMFileTransports = New VLMMMFileTransports\n    myRouterSeed = 1\n    \n    ' create tray icon\n    Set myMouseEventsForm = New fMouseEventsForm\n    Set myAST = New cTP_AdvSysTray\n    myAST.create myMouseEventsForm, myMouseEventsForm.icon, \"VLM Directory\"\n    'myAST.showBalloon \"Current Shell32.dll version is \" & myAST.shellVersion & \".x\", \"AdvSysTray VB Class\", NIIF_INFO\n    \n    ' make myself easily found\n    apiSetProp myMouseEventsForm.hwnd, \"IsVLMachineRouter\", 1\n    apiSetProp myMouseEventsForm.hwnd, \"WindowNameAtom\", apiGlobalAddAtom(myWindowName)\n    apiSetProp myMouseEventsForm.hwnd, \"ClassNameAtom\", apiGlobalAddAtom(myClassName)\n    \nEnd Sub\n\nSub shutdown()\n    myAST.destroy\n    Set myAST = Nothing\n    Unload myMouseEventsForm\n    Set myMouseEventsForm = Nothing\nEnd Sub\n\nPrivate Sub myAST_RButtonUp()\n    Dim epm As New cTP_EasyPopupMenu, menuItemSelected As Long\n    'SetForegroundWindow myMouseEventsForm.hwnd\n'    epm.addMenuItem \"Main form...\", MF_STRING, 1\n'    epm.createSubmenu \"Radio items\"\n'    epm.addSubmenuItem \"Radio item 1\", MF_STRING, 2\n'    epm.addSubmenuItem \"Radio item 2\", MF_STRING, 3\n'    epm.addSubmenuItem \"Radio item 3\", MF_STRING, 4\n'    epm.checkRadioItem 0, 2, 1\n'    epm.addMenuItem \"\", MF_SEPARATOR, 0\n'    epm.addMenuItem \"Disabled item\", MF_GRAYED, 5\n'    epm.addMenuItem \"Checked item\", MF_CHECKED, 6\n'    epm.addMenuItem \"\", MF_SEPARATOR, 0\n    epm.addMenuItem \"Exit\", MF_STRING, 12\n    apiSetForegroundWindow myMouseEventsForm.hwnd\n    menuItemSelected = epm.trackMenu(myMouseEventsForm.hwnd)\n    Select Case menuItemSelected\n        Case 12\n            Set epm = Nothing\n            globalShutdown\n    End Select\nEnd Sub\n\nPrivate Sub myListener_newConnection(ByVal newTransport As VLMessaging.VLMMMFileTransport, oReceived As Boolean)\n    Dim id As Long\n    oReceived = True\n    id = myMMFileTransports.addTransport(newTransport)\nEnd Sub\n\nPrivate Function messageFromBytes(buffer() As Byte) As VLMMessage\n    Dim i1 As Long, i2 As Long, messageArray As Variant, message As New VLMMessage\n    DBGetArrayBounds buffer, 1, i1, i2\n    messageArray = g_VLMUtils.BytesAsVariant(buffer, i2 + 1, 1)\n    message.fromMessageArray messageArray\n    Set messageFromBytes = message\nEnd Function\n\nPrivate Function messageToBytes(message As VLMMessage) As Byte()\n    Dim messageArray As Variant, length As Long, buffer() As Byte\n    message.toMessageArray messageArray\n    length = g_VLMUtils.LengthOfVariantAsBytes(messageArray)\n    DBCreateNewArrayOfBytes buffer, 1, length\n    g_VLMUtils.VariantAsBytes messageArray, buffer, length + 1, 1\n    messageToBytes = buffer\nEnd Function\n\nPrivate Sub myMMFileTransports_bytesArrived(ByVal id As Long, buffer() As Byte, oReceived As Boolean)\n    Dim message As VLMMessage, toAddress As VLMAddress\n    oReceived = True\n    Set message = messageFromBytes(buffer)\n    Set toAddress = message.toAddress\n    On Error GoTo errorHandler\n    If (toAddress.MachineID = myMachineID Or toAddress.MachineID = 0) And toAddress.RouterID = 1 And toAddress.AgentID = 1 Then\n        handleMessageToRouter id, message\n    Else\n        routeMessage message\n    End If\nExit Sub\nerrorHandler:\n    MsgBox Err.Description & \", \" & Erl\nEnd Sub\n\nSub handleMessageToRouter(MMFileTransportID As Long, message As VLMMessage)\n    Dim reply As VLMMessage, transport As VLMMMFileTransport, RouterID As Long, address As New VLMAddress\n    Dim IDString As String, vs As Variant, i As Long, entries As New Collection, answer1D As Variant\n    \n    Select Case True\n    \n        Case message.subject = GET_ROUTER_ID\n            If myRouterIDsByMMTransportID.Exists(MMFileTransportID) Then\n                RouterID = myRouterIDsByMMTransportID(MMFileTransportID)\n            Else\n                myRouterSeed = myRouterSeed + 1\n                RouterID = myRouterSeed\n                myRouterIDsByMMTransportID(MMFileTransportID) = RouterID\n                myMMTransportIDsByRouterID(RouterID) = MMFileTransportID\n            End If\n            Set reply = message.reply\n            reply.subject = GET_ROUTER_ID_REPLY\n            reply.Contents = RouterID\n            Set transport = myMMFileTransports.transport(MMFileTransportID)\n            transport.send messageToBytes(reply)\n            \n        Case message.subject = REGISTER_SERVICE\n            address.initialise CLng(message.Contents(1)(1)), CLng(message.Contents(1)(2)), CLng(message.Contents(1)(3))\n            myDirectoryEntriesByIDString(directoryEntryIDString(CStr(message.Contents(2)), address)) = message.Contents\n            Set reply = message.reply\n            reply.subject = REGISTER_SERVICE_REPLY\n            Set transport = myMMFileTransports.transport(MMFileTransportID)\n            transport.send messageToBytes(reply)\n        \n        Case message.subject = UNREGISTER_SERVICE\n            address.initialise CLng(message.Contents(1)(1)), CLng(message.Contents(1)(2)), CLng(message.Contents(1)(3))\n            IDString = directoryEntryIDString(CStr(message.Contents(2)), address)\n            If myDirectoryEntriesByIDString.Exists(IDString) Then myDirectoryEntriesByIDString.Remove IDString\n            Set reply = message.reply\n            reply.subject = UNREGISTER_SERVICE_REPLY\n            Set transport = myMMFileTransports.transport(MMFileTransportID)\n            transport.send messageToBytes(reply)\n        \n        Case message.subject = GET_SERVICES\n            vs = myDirectoryEntriesByIDString.Items\n            For i = 0 To UBound(vs)\n                If IsEmpty(message.Contents) Then\n                    entries.Add vs(i)\n                Else\n                    If vs(i)(2) = message.Contents Then entries.Add vs(i)\n                End If\n            Next\n            If entries.Count > 0 Then\n                ReDim answer1D(1 To entries.Count)\n                For i = 1 To entries.Count\n                    answer1D(i) = entries(i)\n                Next\n            End If\n            Set reply = message.reply\n            reply.subject = GET_SERVICES_REPLY\n            reply.Contents = answer1D\n            Set transport = myMMFileTransports.transport(MMFileTransportID)\n            transport.send messageToBytes(reply)\n            \n    End Select\n\nEnd Sub\n\nSub routeMessage(message As VLMMessage)\n    Dim buffer() As Byte, transport As VLMMMFileTransport\n    If message.toAddress.MachineID <> 0 And message.toAddress.MachineID <> myMachineID Then\n        ' route to a remote machine\n    Else\n        ' for the moment just route between MMFileTransports\n        If myMMTransportIDsByRouterID.Exists(message.toAddress.RouterID) Then\n            Set transport = myMMFileTransports(myMMTransportIDsByRouterID(message.toAddress.RouterID))\n            transport.send messageToBytes(message)\n        End If\n    End If\nEnd Sub\n\nFunction directoryEntryIDString(serviceType As String, address As VLMAddress)\n    directoryEntryIDString = serviceType & \"<\" & address.MachineID & \",\" & address.RouterID & \",\" & address.AgentID & \">\"\nEnd Function\n\nPrivate Sub myMMFileTransports_disconnecting(ByVal id As Long, oReceived As Boolean)\n    oReceived = True\nEnd Sub\n"
  },
  {
    "path": "src/test/resources/samples/langs/Visual Basic/vpptype.bas",
    "content": "' -------------------------------------------------------------------------\n'  Distributed by VXIplug&play Systems Alliance\n'  Do not modify the contents of this file.\n' -------------------------------------------------------------------------\n'  Title   : VPPTYPE.BAS\n'  Date    : 02-14-95\n'  Purpose : VXIplug&play instrument driver header file\n' -------------------------------------------------------------------------\n\nGlobal Const VI_NULL                             = 0\nGlobal Const VI_TRUE                             = 1\nGlobal Const VI_FALSE                            = 0\n\n' - Completion and Error Codes --------------------------------------------\n\nGlobal Const VI_WARN_NSUP_ID_QUERY               = &H3FFC0101&\nGlobal Const VI_WARN_NSUP_RESET                  = &H3FFC0102&\nGlobal Const VI_WARN_NSUP_SELF_TEST              = &H3FFC0103&\nGlobal Const VI_WARN_NSUP_ERROR_QUERY            = &H3FFC0104&\nGlobal Const VI_WARN_NSUP_REV_QUERY              = &H3FFC0105&\n\nGlobal Const VI_ERROR_PARAMETER1                 = &HBFFC0001&\nGlobal Const VI_ERROR_PARAMETER2                 = &HBFFC0002&\nGlobal Const VI_ERROR_PARAMETER3                 = &HBFFC0003&\nGlobal Const VI_ERROR_PARAMETER4                 = &HBFFC0004&\nGlobal Const VI_ERROR_PARAMETER5                 = &HBFFC0005&\nGlobal Const VI_ERROR_PARAMETER6                 = &HBFFC0006&\nGlobal Const VI_ERROR_PARAMETER7                 = &HBFFC0007&\nGlobal Const VI_ERROR_PARAMETER8                 = &HBFFC0008&\nGlobal Const VI_ERROR_FAIL_ID_QUERY              = &HBFFC0011&\nGlobal Const VI_ERROR_INV_RESPONSE               = &HBFFC0012&\n\n' - Additional Definitions ------------------------------------------------\n\nGlobal Const VI_ON                               = 1\nGlobal Const VI_OFF                              = 0\n"
  },
  {
    "path": "src/test/resources/samples/langs/Volt/tesla.volt",
    "content": "// Copyright © 2012-2013, Jakob Bornecrantz.  All rights reserved.\n// See copyright notice in src/volt/license.d (BOOST ver. 1.0).\nmodule main;\n\nimport core.stdc.stdio;\nimport core.stdc.stdlib;\n\nimport watt.process;\nimport watt.path;\n\nimport results;\nimport list;\nimport cmd;\n\nint main()\n{\n\tauto cmdGroup = new CmdGroup();\n\tbool printOk = true;\n\tbool printImprovments = true;\n\tbool printFailing = true;\n\tbool printRegressions = true;\n\tstring compiler = getEnv(\"VOLT\");\n\n\tif (compiler is null) {\n\t\tprintf(\"compiler envar not set\\n\".ptr);\n\t\treturn -1;\n\t}\n\n\t/// @todo Scan for files\n\tauto tests = testList;\n\n\tint total;\n\tint passed;\n\tint failed;\n\tint improved;\n\tint regressed;\n\n\tauto rets = new Result[] (tests.length);\n\tfor (size_t i; i < tests.length; i++) {\n\t\trets[i] = new Result();\n\t\trets[i].runTest(cmdGroup, tests[i], compiler);\n\t}\n\n\tcmdGroup.waitAll();\n\n\tfor (size_t i; i < tests.length; i++) {\n\t\tauto ret = rets[i];\n\t\ttotal++;\n\t\tif (ret.ok) {\n\t\t\tpassed++;\n\t\t\timproved += cast(int)!ret.hasPassed;\n\n\t\t\tif (!ret.hasPassed && printImprovments) {\n\t\t\t\tprintf(\"%s: %s, improved!\\n\".ptr, ret.test.ptr, ret.msg.ptr);\n\t\t\t} else if (printOk) {\n\t\t\t\tprintf(\"%s: %s\\n\".ptr, ret.test.ptr, ret.msg.ptr);\n\t\t\t}\n\t\t} else {\n\t\t\tfailed++;\n\t\t\tregressed += cast(int)ret.hasPassed;\n\n\n\t\t\tif (ret.hasPassed && printRegressions) {\n\t\t\t\tprintf(\"%s: %s, regressed!\\n\".ptr, ret.test.ptr, ret.msg.ptr);\n\t\t\t} else if (printFailing) {\n\t\t\t\tprintf(\"%s: %s\\n\".ptr, ret.test.ptr, ret.msg.ptr);\n\t\t\t}\n\t\t}\n\t\tfflush(stdout);\n\t}\n\n\tauto xml = fopen(\"results.xml\".ptr, \"w+\".ptr);\n\tif (xml !is null) {\n\t\tfprintf(xml, \"<testsuites errors=\\\"%u\\\" failures=\\\"%u\\\" tests=\\\"%u\\\">\\n\".ptr,\n\t\t\t\tregressed, failed - regressed, total);\n\t\tfor (size_t i; i < rets.length; i++) {\n\t\t\trets[i].xmlLog(xml);\n\t\t}\n\t\tfprintf(xml, \"</testsuites>\\n\".ptr);\n\t\tfflush(xml);\n\t\tfclose(xml);\n\t\txml = null;\n\t}\n\n\tauto rate = cast(float)passed / cast(float)total * 100.f;\n\tprintf(\"Summary: %i tests, %i pass%s, %i failure%s, %.2f%% pass rate, %i regressions, %i improvements.\\n\".ptr,\n\t       total,\n\t       passed, (passed == 1 ? \"\".ptr : \"es\".ptr),\n\t       failed, (failed == 1 ? \"\".ptr : \"s\".ptr),\n\t       cast(double)rate, regressed, improved);\n\n\treturn regressed ? -1 : 0;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Wavefront Material/dice.mtl",
    "content": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\n# File Created: 27.05.2016 18:10:49\n\nnewmtl Dice\n\tNs 9.99999905\n\tNi 1.50000000\n\td 1.00000000\n\tTr 0.00000000\n\tTf 1.00000000 1.00000000 1.00000000 \n\tillum 2\n\tKa 0.58823532 0.58823532 0.58823532\n\tKd 0.58823532 0.58823532 0.58823532\n\tKs 0.44999999 0.44999999 0.44999999\n\tKe 0.00000000 0.00000000 0.00000000\n\tmap_Ka C:\\Users\\johng\\Desktop\\dice.png\n\tmap_Kd C:\\Users\\johng\\Desktop\\dice.png\n\tmap_bump C:\\Users\\johng\\Desktop\\dice.png\n\tbump C:\\Users\\johng\\Desktop\\dice.png\n"
  },
  {
    "path": "src/test/resources/samples/langs/Wavefront Material/ripple.mtl",
    "content": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\r\n# File Created: 27.05.2016 16:25:06\r\n\r\nnewmtl wire_061135006\r\n\tNs 32\r\n\td 1\r\n\tTr 0\r\n\tTf 1 1 1\r\n\tillum 2\r\n\tKa 0.23921570 0.52941179 0.02352941\r\n\tKd 0.23921570 0.52941179 0.02352941\r\n\tKs 0.34999999 0.34999999 0.34999999\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Wavefront Material/shapes.mtl",
    "content": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\r\n# File Created: 27.05.2016 16:20:17\r\n\r\nnewmtl Material__41\r\n\tNs 10.00000000\r\n\tNi 1.50000000\r\n\td 1.00000000\r\n\tTr 0.00000000\r\n\tTf 1.00000000 1.00000000 1.00000000 \r\n\tillum 2\r\n\tKa 0.58800000 0.58800000 0.58800000\r\n\tKd 1.00000000 0.00000000 0.00000000\r\n\tKs 0.00000000 0.00000000 0.00000000\r\n\tKe 0.00000000 0.00000000 0.00000000\r\n\r\nnewmtl Material__42\r\n\tNs 10.00000000\r\n\tNi 1.50000000\r\n\td 1.00000000\r\n\tTr 0.00000000\r\n\tTf 1.00000000 1.00000000 1.00000000 \r\n\tillum 2\r\n\tKa 0.00000000 0.00000000 1.00000000\r\n\tKd 0.00000000 0.00000000 1.00000000\r\n\tKs 0.00000000 0.00000000 0.00000000\r\n\tKe 0.00000000 0.00000000 0.00000000\r\n\r\nnewmtl Material__43\r\n\tNs 10.00000000\r\n\tNi 1.50000000\r\n\td 1.00000000\r\n\tTr 0.00000000\r\n\tTf 1.00000000 1.00000000 1.00000000 \r\n\tillum 2\r\n\tKa 0.35294119 0.35294119 0.35294119\r\n\tKd 0.50196081 0.50588238 0.23529413\r\n\tKs 0.00000000 0.00000000 0.00000000\r\n\tKe 0.00000000 0.00000000 0.00000000\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Wavefront Material/spline.mtl",
    "content": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\n# File Created: 27.05.2016 16:27:25\n\nnewmtl wire_088177027\n\tNs 32\n\td 1\n\tTr 0\n\tTf 1 1 1\n\tillum 2\n\tKa 0.34509805 0.69411767 0.10588236\n\tKd 0.34509805 0.69411767 0.10588236\n\tKs 0.34999999 0.34999999 0.34999999\n"
  },
  {
    "path": "src/test/resources/samples/langs/Wavefront Object/dice.obj",
    "content": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\n# File Created: 27.05.2016 18:10:49\n\nmtllib dice.mtl\n\n#\n# object Dice\n#\n\nv  -30.00000000 0.00000000 30.00000000\nv  -30.00000000 0.00000000 -30.00000000\nv  30.00000000 0.00000000 -30.00000000\nv  30.00000000 0.00000000 30.00000000\nv  -30.00000000 60.00000000 30.00000000\nv  30.00000000 60.00000000 30.00000000\nv  30.00000000 60.00000000 -30.00000000\nv  -30.00000000 60.00000000 -30.00000000\n# 8 vertices\n\nvn 0.00000000 -1.00000000 -0.00000000\nvn 0.00000000 1.00000000 -0.00000000\nvn 0.00000000 0.00000000 1.00000000\nvn 1.00000000 0.00000000 -0.00000000\nvn 0.00000000 0.00000000 -1.00000000\nvn -1.00000000 0.00000000 -0.00000000\n# 6 vertex normals\n\nvt 1.00183499 -0.01224804 60.49999619\nvt 1.00183487 0.48775199 60.49999619\nvt 0.66850162 0.48775196 60.50000381\nvt 0.66850162 -0.01224804 60.50000381\nvt -0.00046772 0.49891680 0.50000000\nvt 0.33286563 0.49891669 0.50000000\nvt 0.33286572 0.99891669 0.50000000\nvt -0.00046766 0.99891680 0.50000000\nvt -0.00046772 0.00000006 0.62999344\nvt 0.33286560 0.00000003 0.63000107\nvt 0.33286566 0.50000000 0.62999916\nvt -0.00046772 0.50000012 0.62999153\nvt 0.66447806 0.49891663 -29.58417892\nvt 0.66447806 0.99891663 -29.58417130\nvt 0.33114472 0.99891663 -29.58417320\nvt 0.33114466 0.49891669 -29.58418083\nvt 0.99669039 1.00000000 60.36999512\nvt 0.66335702 1.00000000 60.37000275\nvt 0.66335702 0.50000000 60.36999893\nvt 0.99669039 0.49999994 60.36999130\nvt 0.33280861 0.00000006 90.58419037\nvt 0.66614199 0.00000006 90.58418274\nvt 0.66614199 0.50000000 90.58417511\nvt 0.33280861 0.50000000 90.58419037\n# 24 texture coords\n\ng Dice\nusemtl Dice\ns 2\nf 1/1/1 2/2/1 3/3/1 4/4/1 \ns 4\nf 5/5/2 6/6/2 7/7/2 8/8/2 \ns 8\nf 1/9/3 4/10/3 6/11/3 5/12/3 \ns 16\nf 4/13/4 3/14/4 7/15/4 6/16/4 \ns 32\nf 3/17/5 2/18/5 8/19/5 7/20/5 \ns 64\nf 2/21/6 1/22/6 5/23/6 8/24/6 \n# 6 polygons\n"
  },
  {
    "path": "src/test/resources/samples/langs/Wavefront Object/random.obj",
    "content": "cstype bmatrix\ndeg 3 3\nstep 3 3\nbmat u  1  -3   3  -1 \\\n        0   3  -6   3 \\\n        0   0   3  -3 \\\n        0   0   0   1\n\nbmat v  1  -3  -3   2 \\\n        2   2   2   3 \\\n        0   0   0  -2 \\\n        0   0   0   2\n\n# Special point and space curve data\nvp 0.500\nvp 0.700\nvp 1.100\nvp 0.200 0.950\nv  0.300 1.500 0.100\nv  0.000  0.000  0.000\nv  1.000  1.000  0.000\nv  2.000  1.000  0.000\nv  3.000  0.000  0.000\ncstype bezier\ndeg 3\ncurv 0.2 0.9 -4 -3 -2 -1\nsp 1\nparm u 0.00 1.00\nend\n# Trimming curve\nvp -0.675  1.850  3.000\nvp  0.915  1.930\nvp  2.485  0.470  2.000\nvp  2.485 -1.030\nvp  1.605 -1.890 10.700\nvp -0.745 -0.654  0.500\ncstype rat bezier\ncurv2 -6 -5 -4 -3 -2 -1 -6\nparm u 0.00 1.00 2.00\nsp 2 3\nend\n\n# Surface\nv -1.350 -1.030 0.000\nv  0.130 -1.030 0.432 7.600\nv  1.480 -1.030 0.000 2.300\nv -1.460  0.060 0.201\nv  0.120  0.060 0.915 0.500\nv  1.380  0.060 0.454 1.500\nv -1.480  1.030 0.000 2.300\nv  0.120  1.030 0.394 6.100\nv  1.170  1.030 0.000 3.300\n\ncstype rat bspline\ndeg 2 2\nsurf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1\nparm u -1.00 -1.00 -1.00 2.50 2.50 2.50\nparm v -2.00 -2.00 -2.00 2.00 2.00 2.00\ntrim 0.0 2.0 1 2.2 2.2 3\nsp 4\n\ncon 1 2.0 2.0 1 2 4.0 3.0 1\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/Wavefront Object/ripple.obj",
    "content": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\r\n# File Created: 27.05.2016 16:25:06\r\n\r\nmtllib ripple.mtl\r\n\r\n#\r\n# object Plane001\r\n#\r\n\r\nv  -50.94465637 46.62910461 25.64281845\r\nv  -37.48844147 24.20991898 16.95789337\r\nv  -50.94465637 41.79552460 16.95789337\r\nv  -37.48844147 27.38044548 25.64281845\r\nv  -37.48844147 20.64456940 8.27297115\r\nv  -50.94465637 36.20748138 8.27297115\r\nv  -24.03222656 14.00123024 8.27297115\r\nv  -24.03222656 17.55510902 25.64281845\r\nv  -37.48844147 16.93638992 -0.41195297\r\nv  -50.94465637 30.29615402 -0.41195297\r\nv  -37.48844147 13.33736229 -9.09687710\r\nv  -50.94465637 24.49272728 -9.09687710\r\nv  -24.03222656 12.37120342 -0.41195297\r\nv  -24.03222656 10.91310787 -9.09687710\r\nv  -10.57601166 13.59048653 8.27297115\r\nv  -10.57601166 14.55468178 25.64281845\r\nv  2.88020325 16.72536278 8.27297115\r\nv  2.88020325 15.78074646 25.64281845\r\nv  -10.57601166 13.76694107 -0.41195297\r\nv  -10.57601166 14.20676041 -9.09687710\r\nv  2.88020325 20.20512009 -9.09687710\r\nv  -37.48844147 10.09947586 -17.78180122\r\nv  -50.94465637 19.22837830 -17.78180122\r\nv  -37.48844147 7.47471571 -26.46672440\r\nv  -50.94465637 14.93428612 -26.46672440\r\nv  -24.03222656 9.68243504 -17.78180122\r\nv  -24.03222656 8.73467827 -26.46672440\r\nv  -50.94465637 12.04163361 -35.15164948\r\nv  -37.48844147 5.07252359 -43.83657455\r\nv  -50.94465637 10.98159790 -43.83657455\r\nv  -24.03222656 7.90988255 -43.83657455\r\nv  -10.57601166 14.77819061 -17.78180122\r\nv  -10.57601166 15.34947777 -26.46672440\r\nv  2.88020325 23.95441628 -26.46672440\r\nv  -10.57601166 15.96461296 -43.83657455\r\nv  2.88020325 25.70764923 -43.83657455\r\nv  16.33641815 20.71888542 8.27297115\r\nv  16.33641815 18.63488770 25.64281845\r\nv  29.79263306 22.88408279 8.27297115\r\nv  29.79263306 20.51868629 25.64281845\r\nv  16.33641815 25.89498520 -9.09687710\r\nv  29.79263306 28.26315308 -9.09687710\r\nv  43.24884796 20.53397751 8.27297115\r\nv  43.24884796 18.83372879 25.64281845\r\nv  56.70506287 10.98159790 8.27297115\r\nv  56.70506287 10.98159790 25.64281845\r\nv  43.24884796 24.29642487 -9.09687710\r\nv  56.70506287 10.98159790 -9.09687710\r\nv  16.33641815 31.18479538 -26.46672440\r\nv  29.79263306 33.67591858 -26.46672440\r\nv  16.33641815 33.60993195 -43.83657455\r\nv  29.79263306 36.14238739 -43.83657455\r\nv  43.24884796 28.06308365 -26.46672440\r\nv  56.70506287 10.98159790 -26.46672440\r\nv  43.24884796 29.77596664 -43.83657455\r\nv  56.70506287 10.98159790 -43.83657455\r\n# 56 vertices\r\n\r\nvn 0.76763725 0.57240576 -0.28824410\r\nvn 0.65690964 0.70898795 -0.25652644\r\nvn 0.74131417 0.58485949 -0.32923040\r\nvn 0.71128774 0.66027904 -0.24104214\r\nvn 0.57668960 0.75674146 -0.30784976\r\nvn 0.68667018 0.61596304 -0.38610050\r\nvn 0.23177305 0.95558769 -0.18202589\r\nvn 0.35748628 0.91861695 -0.16836406\r\nvn 0.49003005 0.80710864 -0.32931164\r\nvn 0.62462389 0.65700555 -0.42212400\r\nvn 0.39033067 0.86003071 -0.32861704\r\nvn 0.55869663 0.70821345 -0.43161529\r\nvn 0.10668588 0.97925276 -0.17228496\r\nvn -0.02931032 0.98739797 -0.15551880\r\nvn -0.07901792 0.99610978 -0.03900582\r\nvn 0.03497402 0.99911118 -0.02352911\r\nvn -0.26840743 0.95793903 0.10153976\r\nvn -0.16543458 0.98361683 0.07161918\r\nvn -0.19281031 0.98029876 0.04287769\r\nvn -0.30288765 0.95234644 0.03599080\r\nvn -0.40211844 0.89890224 0.17399880\r\nvn 0.28773862 0.90962982 -0.29963326\r\nvn 0.49455851 0.76858509 -0.40581867\r\nvn 0.17960025 0.95868921 -0.22058737\r\nvn 0.45494452 0.82066798 -0.34573048\r\nvn -0.15761316 0.97898537 -0.12940517\r\nvn -0.26093873 0.96179539 -0.08282847\r\nvn 0.42190838 0.88920695 -0.17693035\r\nvn 0.09655062 0.98630100 -0.13374706\r\nvn 0.39958632 0.90994275 -0.11106271\r\nvn -0.33997789 0.93774927 -0.07100248\r\nvn -0.39676505 0.91563439 0.06473898\r\nvn -0.48332906 0.87461358 0.03800077\r\nvn -0.49581528 0.85854882 0.13061842\r\nvn -0.53545648 0.84449571 0.01064764\r\nvn -0.53323698 0.84293228 0.07157855\r\nvn -0.21215707 0.95821202 0.19188292\r\nvn -0.17650788 0.97674274 0.12173164\r\nvn 0.02109022 0.97897238 0.20289963\r\nvn 0.00300862 0.99226630 0.12409085\r\nvn -0.26396522 0.92647272 0.26827350\r\nvn 0.06819490 0.95697868 0.28203061\r\nvn 0.40214399 0.90704513 0.12469723\r\nvn 0.34466815 0.93620455 0.06873771\r\nvn 0.56171304 0.82705635 0.02136020\r\nvn 0.50399899 0.86370426 -0.00000000\r\nvn 0.50896263 0.84233069 0.17730212\r\nvn 0.67437875 0.73730576 0.03991853\r\nvn -0.31544915 0.92877936 0.19457826\r\nvn 0.10895393 0.97185022 0.20889288\r\nvn -0.33574972 0.93407321 0.12157062\r\nvn 0.12362437 0.98257226 0.13881217\r\nvn 0.59271014 0.79456633 0.13175353\r\nvn 0.76462281 0.64369327 0.03179539\r\nvn 0.62271041 0.77744496 0.08838002\r\nvn 0.79732174 0.60305154 0.02463558\r\n# 56 vertex normals\r\n\r\ng Plane001\r\nusemtl wire_061135006\r\ns 1\r\nf 1//1 2//2 3//3 \r\nf 1//1 4//4 2//2 \r\nf 3//3 5//5 6//6 \r\nf 3//3 2//2 5//5 \r\nf 2//2 7//7 5//5 \r\nf 2//2 8//8 7//7 \r\nf 2//2 4//4 8//8 \r\nf 6//6 9//9 10//10 \r\nf 6//6 5//5 9//9 \r\nf 10//10 11//11 12//12 \r\nf 10//10 9//9 11//11 \r\nf 5//5 13//13 9//9 \r\nf 5//5 7//7 13//13 \r\nf 9//9 14//14 11//11 \r\nf 9//9 13//13 14//14 \r\nf 8//8 15//15 7//7 \r\nf 8//8 16//16 15//15 \r\nf 16//16 17//17 15//15 \r\nf 16//16 18//18 17//17 \r\nf 7//7 19//19 13//13 \r\nf 7//7 15//15 19//19 \r\nf 13//13 20//20 14//14 \r\nf 13//13 19//19 20//20 \r\nf 19//19 21//21 20//20 \r\nf 19//19 17//17 21//21 \r\nf 19//19 15//15 17//17 \r\nf 22//22 12//12 11//11 \r\nf 23//23 12//12 22//22 \r\nf 24//24 23//23 22//22 \r\nf 25//25 23//23 24//24 \r\nf 11//11 26//26 22//22 \r\nf 11//11 14//14 26//26 \r\nf 22//22 27//27 24//24 \r\nf 22//22 26//26 27//27 \r\nf 28//28 29//29 30//30 \r\nf 28//28 24//24 29//29 \r\nf 28//28 25//25 24//24 \r\nf 24//24 31//31 29//29 \r\nf 24//24 27//27 31//31 \r\nf 14//14 32//32 26//26 \r\nf 14//14 20//20 32//32 \r\nf 26//26 33//33 27//27 \r\nf 26//26 32//32 33//33 \r\nf 32//32 34//34 33//33 \r\nf 32//32 21//21 34//34 \r\nf 32//32 20//20 21//21 \r\nf 27//27 35//35 31//31 \r\nf 27//27 33//33 35//35 \r\nf 33//33 36//36 35//35 \r\nf 33//33 34//34 36//36 \r\nf 18//18 37//37 17//17 \r\nf 18//18 38//38 37//37 \r\nf 38//38 39//39 37//37 \r\nf 38//38 40//40 39//39 \r\nf 17//17 41//41 21//21 \r\nf 17//17 37//37 41//41 \r\nf 37//37 42//42 41//41 \r\nf 37//37 39//39 42//42 \r\nf 40//40 43//43 39//39 \r\nf 40//40 44//44 43//43 \r\nf 44//44 45//45 43//43 \r\nf 44//44 46//46 45//45 \r\nf 39//39 47//47 42//42 \r\nf 39//39 43//43 47//47 \r\nf 43//43 48//48 47//47 \r\nf 43//43 45//45 48//48 \r\nf 21//21 49//49 34//34 \r\nf 21//21 41//41 49//49 \r\nf 41//41 50//50 49//49 \r\nf 41//41 42//42 50//50 \r\nf 34//34 51//51 36//36 \r\nf 34//34 49//49 51//51 \r\nf 49//49 52//52 51//51 \r\nf 49//49 50//50 52//52 \r\nf 42//42 53//53 50//50 \r\nf 42//42 47//47 53//53 \r\nf 47//47 54//54 53//53 \r\nf 47//47 48//48 54//54 \r\nf 50//50 55//55 52//52 \r\nf 50//50 53//53 55//55 \r\nf 53//53 56//56 55//55 \r\nf 53//53 54//54 56//56 \r\n# 0 polygons - 82 triangles\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Wavefront Object/shapes.obj",
    "content": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\r\n# File Created: 27.05.2016 16:20:17\r\n\r\nmtllib shapes.mtl\r\n\r\n#\r\n# object Hedra001\r\n#\r\n\r\nv  -20.11329460 139.28140259 -47.81703568\r\nv  -16.22420692 137.67050171 -47.81703568\r\nv  -20.11329460 137.67050171 -51.70612335\r\nv  -14.61329460 133.78140259 -47.81703568\r\nv  -16.22420692 133.78140259 -51.70612335\r\nv  -20.11329460 133.78140259 -53.31703568\r\nv  -24.00238228 137.67050171 -47.81703568\r\nv  -24.00238228 133.78140259 -51.70612335\r\nv  -25.61329460 133.78140259 -47.81703568\r\nv  -20.11329460 137.67050171 -43.92794800\r\nv  -24.00238228 133.78140259 -43.92794800\r\nv  -20.11329460 133.78140259 -42.31703568\r\nv  -16.22420692 133.78140259 -43.92794800\r\nv  -20.11329460 128.28140259 -47.81703568\r\nv  -20.11329460 129.89233398 -51.70612335\r\nv  -16.22420692 129.89233398 -47.81703568\r\nv  -24.00238228 129.89233398 -47.81703568\r\nv  -20.11329460 129.89233398 -43.92794800\r\nv  -20.11329460 139.28140259 48.81779099\r\nv  -16.22420692 137.67050171 48.81779099\r\nv  -20.11329460 137.67050171 44.92870331\r\nv  -14.61329460 133.78140259 48.81779099\r\nv  -16.22420692 133.78140259 44.92870331\r\nv  -20.11329460 133.78140259 43.31779099\r\nv  -24.00238228 137.67050171 48.81779099\r\nv  -24.00238228 133.78140259 44.92870331\r\nv  -25.61329460 133.78140259 48.81779099\r\nv  -20.11329460 137.67050171 52.70687866\r\nv  -24.00238228 133.78140259 52.70687866\r\nv  -20.11329460 133.78140259 54.31779099\r\nv  -16.22420692 133.78140259 52.70687866\r\nv  -20.11329460 128.28140259 48.81779099\r\nv  -20.11329460 129.89233398 44.92870331\r\nv  -16.22420692 129.89233398 48.81779099\r\nv  -24.00238228 129.89233398 48.81779099\r\nv  -20.11329460 129.89233398 52.70687866\r\nv  58.06591797 109.41960907 0.50037628\r\nv  61.95500183 107.80870056 0.50037628\r\nv  58.06591797 107.80870056 -3.38871098\r\nv  63.56591797 103.91960907 0.50037628\r\nv  61.95500183 103.91960907 -3.38871098\r\nv  58.06591797 103.91960907 -4.99962378\r\nv  54.17683411 107.80870056 0.50037628\r\nv  54.17683411 103.91960907 -3.38871098\r\nv  52.56591797 103.91960907 0.50037628\r\nv  58.06591797 107.80870056 4.38946342\r\nv  54.17683411 103.91960907 4.38946342\r\nv  58.06591797 103.91960907 6.00037622\r\nv  61.95500183 103.91960907 4.38946342\r\nv  58.06591797 98.41960907 0.50037628\r\nv  58.06591797 100.03051758 -3.38871098\r\nv  61.95500183 100.03051758 0.50037628\r\nv  54.17683411 100.03051758 0.50037628\r\nv  58.06591797 100.03051758 4.38946342\r\nv  28.20411873 61.10219574 -77.67884064\r\nv  32.09320831 59.49128342 -77.67884064\r\nv  28.20411873 59.49128342 -81.56792450\r\nv  33.70411682 55.60219574 -77.67884064\r\nv  32.09320831 55.60219574 -81.56792450\r\nv  28.20411873 55.60219574 -83.17884064\r\nv  24.31503105 59.49128342 -77.67884064\r\nv  24.31503105 55.60219574 -81.56792450\r\nv  22.70411873 55.60219574 -77.67884064\r\nv  28.20411873 59.49128342 -73.78975677\r\nv  24.31503105 55.60219574 -73.78975677\r\nv  28.20411873 55.60219574 -72.17884064\r\nv  32.09320831 55.60219574 -73.78975677\r\nv  28.20411873 50.10219574 -77.67884064\r\nv  28.20411873 51.71310806 -81.56792450\r\nv  32.09320831 51.71310806 -77.67884064\r\nv  24.31503105 51.71310806 -77.67884064\r\nv  28.20411873 51.71310806 -73.78975677\r\nv  -68.43070984 61.10219574 -77.67884064\r\nv  -64.54161835 59.49128342 -77.67884064\r\nv  -68.43070984 59.49128342 -81.56792450\r\nv  -62.93070984 55.60219574 -77.67884064\r\nv  -64.54161835 55.60219574 -81.56792450\r\nv  -68.43070984 55.60219574 -83.17884064\r\nv  -72.31979370 59.49128342 -77.67884064\r\nv  -72.31979370 55.60219574 -81.56792450\r\nv  -73.93070984 55.60219574 -77.67884064\r\nv  -68.43070984 59.49128342 -73.78975677\r\nv  -72.31979370 55.60219574 -73.78975677\r\nv  -68.43070984 55.60219574 -72.17884064\r\nv  -64.54161835 55.60219574 -73.78975677\r\nv  -68.43070984 50.10219574 -77.67884064\r\nv  -68.43070984 51.71310806 -81.56792450\r\nv  -64.54161835 51.71310806 -77.67884064\r\nv  -72.31979370 51.71310806 -77.67884064\r\nv  -68.43070984 51.71310806 -73.78975677\r\nv  -98.29251099 109.41960907 0.50037628\r\nv  -94.40342712 107.80870056 0.50037628\r\nv  -98.29251099 107.80870056 -3.38871098\r\nv  -92.79251099 103.91960907 0.50037628\r\nv  -94.40342712 103.91960907 -3.38871098\r\nv  -98.29251099 103.91960907 -4.99962378\r\nv  -102.18159485 107.80870056 0.50037628\r\nv  -102.18159485 103.91960907 -3.38871098\r\nv  -103.79251099 103.91960907 0.50037628\r\nv  -98.29251099 107.80870056 4.38946342\r\nv  -102.18159485 103.91960907 4.38946342\r\nv  -98.29251099 103.91960907 6.00037622\r\nv  -94.40342712 103.91960907 4.38946342\r\nv  -98.29251099 98.41960907 0.50037628\r\nv  -98.29251099 100.03051758 -3.38871098\r\nv  -94.40342712 100.03051758 0.50037628\r\nv  -102.18159485 100.03051758 0.50037628\r\nv  -98.29251099 100.03051758 4.38946342\r\nv  -68.43070984 61.10219574 78.67958832\r\nv  -64.54161835 59.49128342 78.67958832\r\nv  -68.43070984 59.49128342 74.79050446\r\nv  -62.93070984 55.60219574 78.67958832\r\nv  -64.54161835 55.60219574 74.79050446\r\nv  -68.43070984 55.60219574 73.17958832\r\nv  -72.31979370 59.49128342 78.67958832\r\nv  -72.31979370 55.60219574 74.79050446\r\nv  -73.93070984 55.60219574 78.67958832\r\nv  -68.43070984 59.49128342 82.56867218\r\nv  -72.31979370 55.60219574 82.56867218\r\nv  -68.43070984 55.60219574 84.17958832\r\nv  -64.54161835 55.60219574 82.56867218\r\nv  -68.43070984 50.10219574 78.67958832\r\nv  -68.43070984 51.71310806 74.79050446\r\nv  -64.54161835 51.71310806 78.67958832\r\nv  -72.31979370 51.71310806 78.67958832\r\nv  -68.43070984 51.71310806 82.56867218\r\nv  28.20411873 61.10219574 78.67958832\r\nv  32.09320831 59.49128342 78.67958832\r\nv  28.20411873 59.49128342 74.79050446\r\nv  33.70411682 55.60219574 78.67958832\r\nv  32.09320831 55.60219574 74.79050446\r\nv  28.20411873 55.60219574 73.17958832\r\nv  24.31503105 59.49128342 78.67958832\r\nv  24.31503105 55.60219574 74.79050446\r\nv  22.70411873 55.60219574 78.67958832\r\nv  28.20411873 59.49128342 82.56867218\r\nv  24.31503105 55.60219574 82.56867218\r\nv  28.20411873 55.60219574 84.17958832\r\nv  32.09320831 55.60219574 82.56867218\r\nv  28.20411873 50.10219574 78.67958832\r\nv  28.20411873 51.71310806 74.79050446\r\nv  32.09320831 51.71310806 78.67958832\r\nv  24.31503105 51.71310806 78.67958832\r\nv  28.20411873 51.71310806 82.56867218\r\nv  58.06591797 12.78478241 0.50037628\r\nv  61.95500183 11.17387009 0.50037628\r\nv  58.06591797 11.17387009 -3.38871098\r\nv  63.56591797 7.28478241 0.50037628\r\nv  61.95500183 7.28478241 -3.38871098\r\nv  58.06591797 7.28478241 -4.99962378\r\nv  54.17683411 11.17387009 0.50037628\r\nv  54.17683411 7.28478241 -3.38871098\r\nv  52.56591797 7.28478241 0.50037628\r\nv  58.06591797 11.17387009 4.38946342\r\nv  54.17683411 7.28478241 4.38946342\r\nv  58.06591797 7.28478241 6.00037622\r\nv  61.95500183 7.28478241 4.38946342\r\nv  58.06591797 1.78478241 0.50037628\r\nv  58.06591797 3.39569473 -3.38871098\r\nv  61.95500183 3.39569473 0.50037628\r\nv  54.17683411 3.39569473 0.50037628\r\nv  58.06591797 3.39569473 4.38946342\r\nv  -20.11329460 -17.07701874 48.81779099\r\nv  -16.22420692 -18.68793488 48.81779099\r\nv  -20.11329460 -18.68793488 44.92870331\r\nv  -14.61329460 -22.57701874 48.81779099\r\nv  -16.22420692 -22.57701874 44.92870331\r\nv  -20.11329460 -22.57701874 43.31779099\r\nv  -24.00238228 -18.68793488 48.81779099\r\nv  -24.00238228 -22.57701874 44.92870331\r\nv  -25.61329460 -22.57701874 48.81779099\r\nv  -20.11329460 -18.68793488 52.70687866\r\nv  -24.00238228 -22.57701874 52.70687866\r\nv  -20.11329460 -22.57701874 54.31779099\r\nv  -16.22420692 -22.57701874 52.70687866\r\nv  -20.11329460 -28.07701874 48.81779099\r\nv  -20.11329460 -26.46610260 44.92870331\r\nv  -16.22420692 -26.46610260 48.81779099\r\nv  -24.00238228 -26.46610260 48.81779099\r\nv  -20.11329460 -26.46610260 52.70687866\r\nv  -20.11329460 -17.07701874 -47.81703568\r\nv  -16.22420692 -18.68793488 -47.81703568\r\nv  -20.11329460 -18.68793488 -51.70612335\r\nv  -14.61329460 -22.57701874 -47.81703568\r\nv  -16.22420692 -22.57701874 -51.70612335\r\nv  -20.11329460 -22.57701874 -53.31703568\r\nv  -24.00238228 -18.68793488 -47.81703568\r\nv  -24.00238228 -22.57701874 -51.70612335\r\nv  -25.61329460 -22.57701874 -47.81703568\r\nv  -20.11329460 -18.68793488 -43.92794800\r\nv  -24.00238228 -22.57701874 -43.92794800\r\nv  -20.11329460 -22.57701874 -42.31703568\r\nv  -16.22420692 -22.57701874 -43.92794800\r\nv  -20.11329460 -28.07701874 -47.81703568\r\nv  -20.11329460 -26.46610260 -51.70612335\r\nv  -16.22420692 -26.46610260 -47.81703568\r\nv  -24.00238228 -26.46610260 -47.81703568\r\nv  -20.11329460 -26.46610260 -43.92794800\r\nv  -98.29251099 12.78478241 0.50037628\r\nv  -94.40342712 11.17387009 0.50037628\r\nv  -98.29251099 11.17387009 -3.38871098\r\nv  -92.79251099 7.28478241 0.50037628\r\nv  -94.40342712 7.28478241 -3.38871098\r\nv  -98.29251099 7.28478241 -4.99962378\r\nv  -102.18159485 11.17387009 0.50037628\r\nv  -102.18159485 7.28478241 -3.38871098\r\nv  -103.79251099 7.28478241 0.50037628\r\nv  -98.29251099 11.17387009 4.38946342\r\nv  -102.18159485 7.28478241 4.38946342\r\nv  -98.29251099 7.28478241 6.00037622\r\nv  -94.40342712 7.28478241 4.38946342\r\nv  -98.29251099 1.78478241 0.50037628\r\nv  -98.29251099 3.39569473 -3.38871098\r\nv  -94.40342712 3.39569473 0.50037628\r\nv  -102.18159485 3.39569473 0.50037628\r\nv  -98.29251099 3.39569473 4.38946342\r\nv  57.13174438 104.27643585 -1.23167181\r\nv  -21.04746819 134.13824463 47.08574295\r\nv  -19.39965057 135.64974976 48.81779099\r\nv  58.77956390 105.78795624 0.50037628\r\nv  57.35226440 102.05126190 0.50038010\r\nv  -20.82694435 131.91305542 48.81779480\r\nv  59.00009155 103.56278992 2.23243952\r\nv  -19.17912483 133.42459106 50.54985428\r\nv  -19.17912865 133.42459106 -49.54909134\r\nv  59.00008392 103.56278992 -1.23167944\r\nv  57.35227203 102.05126953 0.50037628\r\nv  -20.82694054 131.91305542 -47.81703568\r\nv  -19.39965630 135.64974976 -47.81704330\r\nv  58.77955627 105.78795624 0.50036865\r\nv  -21.04747581 134.13824463 -46.08498764\r\nv  57.13173676 104.27643585 2.23242426\r\nv  -18.11329460 133.78140259 48.81779099\r\nv  -18.11329460 133.78140259 -47.81703568\r\nv  -20.11329460 135.78140259 -47.81703568\r\nv  -20.11329460 135.78140259 48.81779099\r\nv  -20.11329460 131.78140259 48.81779099\r\nv  -20.11329460 131.78140259 -47.81703568\r\nv  -22.11329460 133.78140259 48.81779099\r\nv  -22.11329460 133.78140259 -47.81703568\r\nv  30.10623360 55.27727509 -78.20456696\r\nv  59.96803284 103.59468842 -0.02535385\r\nv  58.06591797 102.21830750 1.55183864\r\nv  28.20411873 53.90089417 -76.62738037\r\nv  28.20411873 57.30349731 -78.73030090\r\nv  58.06591797 105.62091064 -0.55108589\r\nv  26.30200386 55.92711639 -77.15310669\r\nv  56.16380310 104.24452972 1.02611017\r\nv  -18.38124657 134.71557617 -47.46021652\r\nv  29.93616676 56.53636932 -77.32202148\r\nv  28.20411873 56.31584167 -79.54718781\r\nv  -20.11329460 134.49505615 -49.68538284\r\nv  -20.11328697 133.06776428 -45.94868851\r\nv  28.20412636 54.88854980 -75.81049347\r\nv  -21.84535027 132.84722900 -48.17385483\r\nv  26.47206306 54.66801453 -78.03565979\r\nv  -68.43070984 55.60219574 -79.67884064\r\nv  28.20411873 55.60219574 -79.67884064\r\nv  28.20411873 53.60219574 -77.67884064\r\nv  -68.43070984 53.60219574 -77.67884064\r\nv  -68.43070984 57.60219574 -77.67884064\r\nv  28.20411873 57.60219574 -77.67884064\r\nv  -68.43070984 55.60219574 -75.67884064\r\nv  28.20411873 55.60219574 -75.67884064\r\nv  -18.38124275 132.84722900 -48.17385483\r\nv  -66.69865417 54.66802216 -78.03565979\r\nv  -68.43070984 56.31584167 -79.54718781\r\nv  -20.11330223 133.06777954 -45.94868851\r\nv  -68.43071747 54.88855362 -75.81049347\r\nv  -21.84535027 134.71557617 -47.46022415\r\nv  -70.16276550 56.53637314 -77.32202911\r\nv  -96.39039612 104.24452972 1.02611017\r\nv  -66.52859497 55.92711639 -77.15310669\r\nv  -68.43070984 57.30349731 -78.73030090\r\nv  -98.29251099 105.62091064 -0.55108398\r\nv  -98.29251099 102.21830750 1.55184412\r\nv  -68.43070984 53.90089417 -76.62737274\r\nv  -100.19462585 103.59469604 -0.02535003\r\nv  -70.33282471 55.27727890 -78.20456696\r\nv  -21.04746819 133.42459106 -49.54908752\r\nv  -99.22668457 103.56278229 -1.23167562\r\nv  -99.00615692 105.78794861 0.50037628\r\nv  -20.82694054 135.64974976 -47.81703568\r\nv  -19.39964867 131.91305542 -47.81703186\r\nv  -97.57886505 102.05125427 0.50038010\r\nv  -19.17912102 134.13824463 -46.08498383\r\nv  -97.35833740 104.27643585 2.23242807\r\nv  -19.17912102 134.13824463 47.08574295\r\nv  -97.35833740 104.27642822 -1.23167181\r\nv  -20.82694054 135.64974976 48.81779099\r\nv  -19.39964867 131.91307068 48.81779099\r\nv  -97.57886505 102.05126953 0.50037628\r\nv  -21.04745293 133.42459106 50.54983902\r\nv  -99.22666931 103.56278992 2.23242426\r\nv  -66.52859497 55.92711639 78.15385437\r\nv  -96.39039612 104.24452972 -0.02535766\r\nv  -98.29251099 105.62091064 1.55183864\r\nv  -68.43070984 57.30349731 79.73104858\r\nv  -68.43070984 53.90088654 77.62812042\r\nv  -98.29251099 102.21829987 -0.55109161\r\nv  -70.33283234 55.27726746 79.20532227\r\nv  -100.19463348 103.59468079 1.02611017\r\nv  -18.38123894 132.84722900 49.17461777\r\nv  -66.69865417 54.66802216 79.03641510\r\nv  -68.43070984 54.88854980 76.81124115\r\nv  -20.11329460 133.06776428 46.94944382\r\nv  -20.11329460 134.49505615 50.68613815\r\nv  -68.43070984 56.31584549 80.54793549\r\nv  -21.84534264 134.71557617 48.46096420\r\nv  -70.16275787 56.53637314 78.32276154\r\nv  28.20411873 55.60219574 76.67958832\r\nv  -68.43070984 55.60219574 76.67958832\r\nv  -68.43070984 57.60219574 78.67958832\r\nv  28.20411873 57.60219574 78.67958832\r\nv  28.20411873 53.60219574 78.67958832\r\nv  -68.43070984 53.60219574 78.67958832\r\nv  28.20411873 55.60219574 80.67958832\r\nv  -68.43070984 55.60219574 80.67958832\r\nv  -18.38123512 134.71557617 48.46097183\r\nv  29.93617821 56.53636932 78.32276917\r\nv  28.20411873 54.88854980 76.81124115\r\nv  -20.11329079 134.49505615 50.68614578\r\nv  28.20412254 56.31583405 80.54794312\r\nv  -21.84533882 132.84722900 49.17461777\r\nv  26.47207451 54.66800690 79.03641510\r\nv  59.96802521 103.59469604 1.02610254\r\nv  30.10622597 55.27727890 79.20531464\r\nv  28.20411873 53.90089417 77.62812805\r\nv  58.06591797 102.21830750 -0.55108398\r\nv  58.06591797 105.62091064 1.55182886\r\nv  28.20411873 57.30349350 79.73104095\r\nv  56.16381073 104.24452972 -0.02536529\r\nv  26.30201149 55.92711639 78.15384674\r\nv  60.06591797 7.28478241 0.50037628\r\nv  60.06591797 103.91960907 0.50037628\r\nv  58.06591797 103.91960907 2.50037622\r\nv  58.06591797 7.28478241 2.50037622\r\nv  58.06591797 7.28478241 -1.49962378\r\nv  58.06591797 103.91960907 -1.49962378\r\nv  56.06591797 7.28478241 0.50037628\r\nv  56.06591797 103.91960907 0.50037628\r\nv  30.10623360 55.92711258 -78.20456696\r\nv  59.96803284 7.60969925 -0.02535385\r\nv  58.06591797 5.58348083 -0.55108601\r\nv  28.20411873 53.90089417 -78.73030090\r\nv  28.20411873 57.30349350 -76.62737274\r\nv  58.06591797 8.98608017 1.55184412\r\nv  26.30200386 55.27726746 -77.15310669\r\nv  56.16380310 6.95985413 1.02611017\r\nv  59.96803284 7.60970306 1.02610254\r\nv  30.10623360 55.92711639 79.20531464\r\nv  28.20411873 53.90089417 79.73104858\r\nv  58.06591797 5.58348083 1.55183649\r\nv  58.06591797 8.98608398 -0.55109161\r\nv  28.20411873 57.30349731 77.62812042\r\nv  56.16380310 6.95985413 -0.02536529\r\nv  26.30200386 55.27726746 78.15384674\r\nv  -18.38124275 -21.64284515 49.17461014\r\nv  -66.69865417 56.53636932 79.03640747\r\nv  -68.43070984 54.88854980 80.54793549\r\nv  -20.11329460 -23.29066467 50.68613815\r\nv  -20.11330223 -21.86338043 46.94944382\r\nv  -68.43071747 56.31583786 76.81124115\r\nv  -21.84535027 -23.51119232 48.46097946\r\nv  -70.16276550 54.66801834 78.32277679\r\nv  29.93617439 54.66802979 78.32276917\r\nv  -18.38123894 -23.51118469 48.46097183\r\nv  -20.11329460 -21.86337280 46.94944763\r\nv  28.20411873 56.31584167 76.81124115\r\nv  28.20412636 54.88855743 80.54793549\r\nv  -20.11328697 -23.29065704 50.68613815\r\nv  26.47207069 56.53637695 79.03641510\r\nv  -21.84534264 -21.64283752 49.17461777\r\nv  57.13174438 6.92795563 -1.23167944\r\nv  -21.04746819 -22.93384552 47.08573532\r\nv  -20.82693863 -20.70867157 48.81779099\r\nv  57.35227203 9.15312958 0.50037628\r\nv  58.77957153 5.41643524 0.50037628\r\nv  -19.39964485 -24.44536591 48.81779099\r\nv  59.00009155 7.64160919 2.23242426\r\nv  -19.17911720 -22.22019196 50.54983902\r\nv  -19.17912102 -22.22019196 -49.54908752\r\nv  59.00009155 7.64160919 -1.23167562\r\nv  58.77956390 5.41643906 0.50037628\r\nv  -19.39964867 -24.44536591 -47.81703568\r\nv  -20.82694054 -20.70867157 -47.81703186\r\nv  57.35227203 9.15313339 0.50038010\r\nv  -21.04746819 -22.93384552 -46.08498383\r\nv  57.13174438 6.92795563 2.23242807\r\nv  29.93617058 54.66802216 -77.32201385\r\nv  -18.38124275 -23.51119232 -47.46020889\r\nv  -20.11329460 -23.29066467 -49.68537903\r\nv  28.20411873 54.88854980 -79.54718781\r\nv  28.20411873 56.31584167 -75.81049347\r\nv  -20.11329460 -21.86337280 -45.94868469\r\nv  26.47206688 56.53636932 -78.03566742\r\nv  -21.84534645 -21.64284515 -48.17385864\r\nv  -18.11329460 -22.57701874 -47.81703568\r\nv  -18.11329460 -22.57701874 48.81779099\r\nv  -20.11329460 -24.57701874 48.81779099\r\nv  -20.11329460 -24.57701874 -47.81703568\r\nv  -20.11329460 -20.57701874 -47.81703568\r\nv  -20.11329460 -20.57701874 48.81779099\r\nv  -22.11329460 -22.57701874 -47.81703568\r\nv  -22.11329460 -22.57701874 48.81779099\r\nv  -96.39039612 6.95986176 -0.02535766\r\nv  -66.52859497 55.27727509 78.15385437\r\nv  -68.43070984 53.90089417 79.73104858\r\nv  -98.29251099 5.58348083 1.55183649\r\nv  -98.29251099 8.98608398 -0.55109161\r\nv  -68.43070984 57.30349731 77.62812042\r\nv  -100.19462585 7.60969925 1.02610254\r\nv  -70.33282471 55.92711258 79.20531464\r\nv  -19.17912102 -22.93384552 47.08574677\r\nv  -97.35833740 6.92795944 -1.23166800\r\nv  -97.57886505 9.15312576 0.50037628\r\nv  -19.39964867 -20.70867157 48.81779099\r\nv  -20.82693291 -24.44535065 48.81779480\r\nv  -99.00614929 5.41644669 0.50038010\r\nv  -21.04745293 -22.22019196 50.54983521\r\nv  -99.22666931 7.64160919 2.23242044\r\nv  -21.04746056 -22.22019958 -49.54909134\r\nv  -99.22667694 7.64160156 -1.23167944\r\nv  -19.39964867 -20.70867157 -47.81703568\r\nv  -20.82693291 -24.44536591 -47.81704330\r\nv  -99.00614929 5.41643524 0.50036865\r\nv  -19.17911339 -22.93384552 -46.08498764\r\nv  -97.35832977 6.92795563 2.23242426\r\nv  -66.69866180 56.53636932 -78.03566742\r\nv  -18.38124657 -21.64284515 -48.17385864\r\nv  -68.43070984 54.88854980 -79.54718781\r\nv  -68.43070984 56.31584167 -75.81050110\r\nv  -20.11329460 -21.86337280 -45.94869614\r\nv  -70.16275787 54.66803741 -77.32202148\r\nv  -21.84534264 -23.51117706 -47.46021652\r\nv  -66.52859497 55.27727509 -77.15310669\r\nv  -96.39039612 6.95986176 1.02611017\r\nv  -98.29251099 5.58348083 -0.55108601\r\nv  -68.43070984 53.90089417 -78.73030090\r\nv  -68.43070984 57.30350494 -76.62737274\r\nv  -98.29251099 8.98609161 1.55184412\r\nv  -70.33283234 55.92712402 -78.20457458\r\nv  -100.19463348 7.60971069 -0.02535766\r\nv  -96.29251099 7.28478241 0.50037628\r\nv  -96.29251099 103.91960907 0.50037628\r\nv  -98.29251099 103.91960907 2.50037622\r\nv  -98.29251099 7.28478241 2.50037622\r\nv  -98.29251099 7.28478241 -1.49962378\r\nv  -98.29251099 103.91960907 -1.49962378\r\nv  -100.29251099 7.28478241 0.50037628\r\nv  -100.29251099 103.91960907 0.50037628\r\n# 451 vertices\r\n\r\nvn 0.00000000 1.00000000 -0.00000000\r\nvn 0.70710683 0.70710671 -0.00000000\r\nvn 0.00000001 0.70710671 -0.70710683\r\nvn 1.00000000 -0.00000001 -0.00000000\r\nvn 0.70710677 0.00000001 -0.70710683\r\nvn 0.00000000 0.00000001 -1.00000000\r\nvn -0.70710677 0.70710677 -0.00000001\r\nvn -0.70710677 0.00000001 -0.70710677\r\nvn -1.00000000 -0.00000001 -0.00000000\r\nvn -0.00000001 0.70710671 0.70710683\r\nvn -0.70710677 0.00000001 0.70710683\r\nvn 0.00000000 0.00000001 1.00000000\r\nvn 0.70710677 0.00000001 0.70710677\r\nvn 0.00000000 -1.00000000 -0.00000000\r\nvn -0.00000003 -0.70710671 -0.70710683\r\nvn 0.70710677 -0.70710677 -0.00000001\r\nvn -0.70710683 -0.70710671 -0.00000000\r\nvn 0.00000003 -0.70710671 0.70710683\r\nvn 0.70710671 0.70710683 0.00000003\r\nvn 0.00000000 0.70710677 -0.70710677\r\nvn 0.70710671 -0.00000001 -0.70710683\r\nvn 0.00000000 0.00000000 -1.00000000\r\nvn -0.70710671 0.70710683 -0.00000001\r\nvn -0.70710671 0.00000000 -0.70710683\r\nvn 0.00000000 0.70710677 0.70710677\r\nvn -0.70710671 -0.00000001 0.70710683\r\nvn 0.00000000 0.00000000 1.00000000\r\nvn 0.70710671 0.00000000 0.70710683\r\nvn -0.00000001 -0.70710677 -0.70710677\r\nvn 0.70710671 -0.70710683 -0.00000001\r\nvn -0.70710671 -0.70710683 0.00000003\r\nvn 0.00000001 -0.70710677 0.70710677\r\nvn 0.70710677 0.70710677 0.00000001\r\nvn 0.00000004 0.70710683 -0.70710671\r\nvn 0.70710689 -0.00000001 -0.70710665\r\nvn -0.70710683 -0.00000001 -0.70710671\r\nvn -0.00000004 0.70710683 0.70710671\r\nvn -0.70710689 -0.00000001 0.70710665\r\nvn 0.70710683 -0.00000001 0.70710671\r\nvn -0.00000002 -0.70710683 -0.70710671\r\nvn -0.70710677 -0.70710677 0.00000001\r\nvn 0.00000002 -0.70710683 0.70710671\r\nvn -0.07796840 0.78671539 -0.61237234\r\nvn -0.58259135 -0.53440207 -0.61237389\r\nvn 0.07796805 -0.78671581 0.61237186\r\nvn 0.58259094 0.53440553 0.61237121\r\nvn -0.80901724 0.30901840 0.49999887\r\nvn 0.80901653 -0.30901930 -0.49999952\r\nvn 0.07796843 -0.78671551 -0.61237216\r\nvn 0.58259112 0.53440332 -0.61237293\r\nvn -0.07796736 0.78671622 0.61237127\r\nvn -0.58259112 -0.53440374 0.61237270\r\nvn 0.80901748 -0.30901518 0.50000036\r\nvn -0.80901766 0.30901492 -0.50000036\r\nvn 0.70710683 0.70710683 -0.00000000\r\nvn 0.70710683 -0.70710683 -0.00000000\r\nvn -0.70710683 -0.70710683 -0.00000000\r\nvn -0.70710683 0.70710683 -0.00000000\r\nvn 0.67249787 -0.71637785 0.18587455\r\nvn 0.67249876 0.48662433 -0.55762190\r\nvn -0.67249823 0.71637750 -0.18587439\r\nvn -0.67249817 -0.48662508 0.55762202\r\nvn 0.30901733 0.49999994 0.80901688\r\nvn -0.30901659 -0.49999943 -0.80901760\r\nvn 0.61237305 0.58259112 -0.53440332\r\nvn 0.61237472 0.07797068 0.78671324\r\nvn -0.61236966 -0.58259094 0.53440732\r\nvn -0.61237252 -0.07796846 -0.78671515\r\nvn 0.50000083 -0.80901641 -0.30901736\r\nvn -0.50000113 0.80901587 0.30901796\r\nvn 0.00000000 -0.70710683 -0.70710683\r\nvn 0.00000000 0.70710683 -0.70710683\r\nvn 0.00000000 0.70710683 0.70710683\r\nvn 0.00000000 -0.70710683 0.70710683\r\nvn 1.00000000 0.00000000 -0.00000000\r\nvn -1.00000000 0.00000000 -0.00000000\r\nvn 0.61237329 -0.07796912 -0.78671467\r\nvn 0.61237079 -0.58259088 0.53440624\r\nvn -0.61237514 0.07797091 0.78671288\r\nvn -0.61237079 0.58259082 -0.53440613\r\nvn -0.49999958 -0.80901724 -0.30901727\r\nvn 0.49999893 0.80901772 0.30901700\r\nvn 0.67249823 0.71637750 -0.18587439\r\nvn 0.67249882 -0.48662424 0.55762184\r\nvn -0.67249882 -0.71637714 0.18587387\r\nvn -0.67249835 0.48662469 -0.55762208\r\nvn 0.30901614 -0.50000083 -0.80901682\r\nvn -0.30901611 0.50000077 0.80901682\r\nvn -0.58259112 0.53440332 -0.61237299\r\nvn -0.07796767 -0.78671604 -0.61237156\r\nvn 0.58259135 -0.53440195 0.61237401\r\nvn 0.07796758 0.78671604 0.61237168\r\nvn -0.80901659 -0.30901667 0.50000083\r\nvn 0.80901659 0.30901667 -0.50000083\r\nvn 0.07796841 0.78671533 -0.61237234\r\nvn 0.58259124 -0.53440368 -0.61237264\r\nvn -0.07796867 -0.78671509 0.61237276\r\nvn -0.58259135 0.53440118 0.61237460\r\nvn -0.80901760 -0.30901849 -0.49999821\r\nvn 0.80901748 0.30901816 0.49999851\r\nvn 0.67249829 0.71637756 0.18587436\r\nvn 0.67249966 -0.48662338 -0.55762172\r\nvn -0.67249709 -0.71637845 -0.18587518\r\nvn -0.67249757 0.48662555 0.55762237\r\nvn -0.30901837 0.49999994 -0.80901653\r\nvn 0.30901837 -0.49999958 0.80901670\r\nvn 0.61237293 -0.58259106 -0.53440344\r\nvn 0.61237121 -0.07796727 0.78671622\r\nvn -0.61237437 0.58259135 0.53440160\r\nvn -0.61237240 0.07796837 -0.78671539\r\nvn -0.50000113 -0.80901617 0.30901745\r\nvn 0.50000083 0.80901587 -0.30901855\r\nvn 0.61237186 0.07796811 -0.78671563\r\nvn 0.61237198 0.58259100 0.53440475\r\nvn -0.61237359 -0.07796949 0.78671432\r\nvn -0.61237240 -0.58259106 -0.53440416\r\nvn 0.50000304 -0.80901641 0.30901393\r\nvn -0.50000304 0.80901623 -0.30901426\r\nvn 0.67249960 -0.71637666 -0.18587312\r\nvn 0.67249799 0.48662502 0.55762219\r\nvn -0.67249858 0.71637750 0.18587387\r\nvn -0.67249787 -0.48662519 -0.55762219\r\nvn -0.30901876 -0.49999821 0.80901754\r\nvn 0.30901873 0.49999815 -0.80901754\r\nvn 0.70710683 0.00000000 0.70710683\r\nvn 0.70710683 0.00000000 -0.70710683\r\nvn -0.70710683 0.00000000 -0.70710683\r\nvn -0.70710683 0.00000000 0.70710683\r\nvn 0.67249823 -0.48662478 -0.55762219\r\nvn -0.67249918 0.48662385 0.55762178\r\nvn -0.67249691 -0.71637863 -0.18587531\r\nvn 0.30901781 -0.50000131 0.80901593\r\nvn -0.30901706 0.50000107 -0.80901641\r\nvn -0.67249864 0.48662448 -0.55762196\r\nvn -0.67249727 -0.71637833 0.18587506\r\nvn -0.30901897 0.50000036 0.80901605\r\nvn 0.30901894 -0.50000030 -0.80901605\r\nvn 0.61237329 0.07796912 0.78671467\r\nvn 0.61237079 0.58259088 -0.53440624\r\nvn -0.61237514 -0.07797091 -0.78671288\r\nvn -0.61237079 -0.58259082 0.53440613\r\nvn -0.49999958 0.80901724 0.30901727\r\nvn 0.49999893 -0.80901772 -0.30901700\r\nvn 0.61237216 -0.07796843 -0.78671551\r\nvn 0.61237293 -0.58259112 0.53440332\r\nvn -0.61237127 0.07796736 0.78671622\r\nvn -0.61237270 0.58259112 -0.53440374\r\nvn -0.50000036 -0.80901748 -0.30901518\r\nvn 0.50000036 0.80901766 0.30901492\r\nvn -0.58259106 0.53440344 -0.61237293\r\nvn -0.07796727 -0.78671622 -0.61237121\r\nvn 0.58259135 -0.53440160 0.61237437\r\nvn 0.07796837 0.78671539 0.61237240\r\nvn -0.80901593 -0.30901739 0.50000149\r\nvn 0.80901587 0.30901855 -0.50000083\r\nvn 0.58259112 -0.53440332 -0.61237299\r\nvn 0.07796767 0.78671604 -0.61237156\r\nvn -0.58259135 0.53440195 0.61237401\r\nvn -0.07796758 -0.78671604 0.61237168\r\nvn 0.80901659 0.30901667 0.50000083\r\nvn -0.80901659 -0.30901667 -0.50000083\r\nvn 0.61237299 -0.58259112 -0.53440332\r\nvn 0.61237216 -0.07796820 0.78671551\r\nvn -0.61237311 0.58259112 0.53440303\r\nvn -0.61237192 0.07796789 -0.78671575\r\nvn -0.50000060 -0.80901653 0.30901715\r\nvn 0.50000083 0.80901641 -0.30901712\r\nvn 0.70710683 -0.70710683 0.00000000\r\nvn 0.70710683 0.70710683 0.00000000\r\nvn 0.67249823 -0.71637750 0.18587439\r\nvn 0.67249882 0.48662424 -0.55762184\r\nvn -0.67249882 0.71637714 -0.18587387\r\nvn -0.67249835 -0.48662469 0.55762208\r\nvn 0.30901614 0.50000083 0.80901682\r\nvn -0.30901611 -0.50000077 -0.80901682\r\nvn 0.58259124 0.53440231 -0.61237377\r\nvn 0.07796679 -0.78671670 -0.61237073\r\nvn -0.58259141 -0.53440154 0.61237425\r\nvn -0.07796883 0.78671509 0.61237264\r\nvn -0.80901742 0.30901664 -0.49999958\r\nvn 0.80901736 -0.30901656 0.49999985\r\nvn -0.07796843 0.78671551 -0.61237216\r\nvn -0.58259112 -0.53440332 -0.61237293\r\nvn 0.07796736 -0.78671622 0.61237127\r\nvn 0.58259112 0.53440374 0.61237270\r\nvn -0.80901748 0.30901518 0.50000036\r\nvn 0.80901766 -0.30901492 -0.50000036\r\nvn 0.61237234 0.07796841 -0.78671533\r\nvn 0.61237264 0.58259124 0.53440368\r\nvn -0.61237270 -0.07796866 0.78671497\r\nvn -0.61237460 -0.58259135 -0.53440118\r\nvn 0.49999821 -0.80901760 0.30901849\r\nvn -0.49999851 0.80901748 -0.30901816\r\nvn 0.67249829 -0.71637756 -0.18587436\r\nvn 0.67249966 0.48662338 0.55762172\r\nvn -0.67249709 0.71637845 0.18587518\r\nvn -0.67249757 -0.48662555 -0.55762237\r\nvn -0.30901837 -0.49999994 0.80901653\r\nvn 0.30901837 0.49999958 -0.80901670\r\n# 199 vertex normals\r\n\r\nvt 0.00000000 0.30901700 0.50000000\r\nvt 0.00000000 -0.30901700 0.50000000\r\nvt 0.50000000 0.00000000 0.30901700\r\nvt 0.00000000 0.30901700 -0.50000000\r\nvt -0.50000000 0.00000000 -0.30901700\r\nvt -0.00000000 -0.30901700 0.50000000\r\nvt 0.30901700 -0.50000000 0.00000000\r\nvt -0.00000000 -0.30901700 -0.50000000\r\nvt 0.12500000 0.00000000 0.00000000\r\nvt 0.12500000 -0.30901700 0.00000000\r\nvt 0.00000000 -0.30901700 0.00000000\r\nvt 0.00000000 0.00000000 0.00000000\r\nvt 0.25000000 0.00000000 0.00000000\r\nvt 0.25000000 -0.30901700 0.00000000\r\nvt 0.37500000 0.00000000 0.00000000\r\nvt 0.37500000 -0.30901700 0.00000000\r\nvt 0.50000000 0.00000000 0.00000000\r\nvt 0.50000000 -0.30901700 0.00000000\r\nvt -0.37499684 -0.30901700 0.00000000\r\nvt -0.50000042 -0.30901700 0.00000000\r\nvt -0.12500000 0.30901700 0.00000000\r\nvt -0.12500000 0.00000000 0.00000000\r\nvt 0.00000000 0.30901700 0.00000000\r\nvt -0.25000000 0.30901700 0.00000000\r\nvt -0.25000000 0.00000000 0.00000000\r\nvt -0.37500000 0.30901700 0.00000000\r\nvt -0.37500000 0.00000000 0.00000000\r\nvt -0.50000000 0.30901700 0.00000000\r\nvt -0.50000000 0.00000000 0.00000000\r\nvt 0.37500015 0.00000000 0.00000000\r\nvt 0.50000072 0.00000000 0.00000000\r\nvt 0.12500000 0.30901700 0.00000000\r\nvt 0.25000000 0.30901700 0.00000000\r\nvt 0.37500000 0.30901700 0.00000000\r\nvt 0.50000000 0.30901700 0.00000000\r\nvt -0.37499928 0.30901700 0.00000000\r\nvt -0.04774575 0.50000000 0.00000000\r\nvt -0.04774575 0.00000000 0.00000000\r\nvt 0.00000000 0.50000000 0.00000000\r\nvt -0.09549150 0.50000000 0.00000000\r\nvt -0.09549150 0.00000000 0.00000000\r\nvt -0.14323725 0.50000000 0.00000000\r\nvt -0.14323725 0.00000000 0.00000000\r\nvt -0.19098300 0.50000000 0.00000000\r\nvt -0.19098300 0.00000000 0.00000000\r\nvt 0.14323683 0.00000000 0.00000000\r\nvt 0.19098346 0.00000000 0.00000000\r\nvt -0.00000000 -0.30901700 0.00000000\r\nvt -0.00000000 0.30901700 0.00000000\r\nvt -0.37499741 -0.30901700 0.00000000\r\nvt -0.49999842 -0.30901700 0.00000000\r\nvt 0.12499984 0.00000000 0.00000000\r\nvt 0.07725425 0.50000000 0.00000000\r\nvt 0.07725425 0.30901700 0.00000000\r\nvt 0.15450850 0.50000000 0.00000000\r\nvt 0.15450850 0.30901700 0.00000000\r\nvt 0.23176275 0.50000000 0.00000000\r\nvt 0.23176275 0.30901700 0.00000000\r\nvt 0.30901700 0.50000000 0.00000000\r\nvt 0.30901700 0.30901700 0.00000000\r\nvt -0.07725426 0.30901700 0.00000000\r\nvt -0.12499951 0.00000000 0.00000000\r\nvt 0.37500009 0.30901700 0.00000000\r\nvt 0.50000238 0.30901700 0.00000000\r\nvt 0.04774575 0.50000000 0.00000000\r\nvt 0.04774575 0.00000000 0.00000000\r\nvt 0.09549150 0.50000000 0.00000000\r\nvt 0.09549150 0.00000000 0.00000000\r\nvt 0.14323725 0.50000000 0.00000000\r\nvt 0.14323725 0.00000000 0.00000000\r\nvt 0.19098300 0.50000000 0.00000000\r\nvt 0.19098300 0.00000000 0.00000000\r\nvt -0.04774563 0.00000000 0.00000000\r\nvt -0.12499972 0.30901700 0.00000000\r\nvt -0.37499818 0.00000000 0.00000000\r\nvt -0.49999803 0.00000000 0.00000000\r\nvt -0.37499753 -0.30901700 0.00000000\r\nvt -0.49999961 -0.30901700 0.00000000\r\nvt -0.37499958 0.00000000 0.00000000\r\nvt -0.50000054 0.00000000 0.00000000\r\nvt -0.12500000 -0.30901700 0.00000000\r\nvt -0.25000000 -0.30901700 0.00000000\r\nvt -0.37500000 -0.30901700 0.00000000\r\nvt -0.50000000 -0.30901700 0.00000000\r\nvt 0.37499741 -0.30901700 0.00000000\r\nvt 0.49999842 -0.30901700 0.00000000\r\nvt -0.37500015 0.00000000 0.00000000\r\nvt -0.50000072 0.00000000 0.00000000\r\nvt 0.07725425 -0.30901700 0.00000000\r\nvt 0.07725425 -0.50000000 0.00000000\r\nvt 0.00000000 -0.50000000 0.00000000\r\nvt 0.15450850 -0.30901700 0.00000000\r\nvt 0.15450850 -0.50000000 0.00000000\r\nvt 0.23176275 -0.30901700 0.00000000\r\nvt 0.23176275 -0.50000000 0.00000000\r\nvt 0.30901700 -0.30901700 0.00000000\r\nvt -0.07725406 -0.50000000 0.00000000\r\nvt -0.07725426 -0.30901700 0.00000000\r\nvt 0.04774575 -0.50000000 0.00000000\r\nvt 0.09549150 -0.50000000 0.00000000\r\nvt 0.14323725 -0.50000000 0.00000000\r\nvt 0.19098300 -0.50000000 0.00000000\r\nvt -0.04774574 -0.50000000 0.00000000\r\nvt -0.12499984 0.00000000 0.00000000\r\nvt -0.07725425 -0.50000000 0.00000000\r\nvt -0.07725425 -0.30901700 0.00000000\r\nvt -0.15450850 -0.50000000 0.00000000\r\nvt -0.15450850 -0.30901700 0.00000000\r\nvt -0.23176275 -0.50000000 0.00000000\r\nvt -0.23176275 -0.30901700 0.00000000\r\nvt -0.30901700 -0.50000000 0.00000000\r\nvt -0.30901700 -0.30901700 0.00000000\r\nvt 0.07725400 -0.30901700 0.00000000\r\nvt 0.12500000 -0.00000000 0.00000000\r\nvt 0.00000000 -0.00000000 0.00000000\r\nvt 0.25000000 -0.00000000 0.00000000\r\nvt 0.37500000 -0.00000000 0.00000000\r\nvt 0.50000000 -0.00000000 0.00000000\r\nvt -0.37500015 -0.00000000 0.00000000\r\nvt -0.50000072 -0.00000000 0.00000000\r\nvt -0.12499952 0.00000000 0.00000000\r\nvt -0.37500009 -0.30901700 0.00000000\r\nvt -0.50000238 -0.30901700 0.00000000\r\n# 123 texture coords\r\n\r\ng Hedra001\r\nusemtl Material__42\r\ns 1\r\nf 1/1/1 2/1/2 3/1/3 \r\nf 2/1/2 4/1/4 5/1/5 \r\nf 2/1/2 5/1/5 3/1/3 \r\nf 3/1/3 5/1/5 6/1/6 \r\nf 1/1/1 3/1/3 7/1/7 \r\nf 3/1/3 6/1/6 8/1/8 \r\nf 3/1/3 8/1/8 7/1/7 \r\nf 7/1/7 8/1/8 9/1/9 \r\nf 1/1/1 7/1/7 10/1/10 \r\nf 7/1/7 9/1/9 11/1/11 \r\nf 7/1/7 11/1/11 10/1/10 \r\nf 10/1/10 11/1/11 12/1/12 \r\nf 1/1/1 10/1/10 2/1/2 \r\nf 10/1/10 12/1/12 13/1/13 \r\nf 10/1/10 13/1/13 2/1/2 \r\nf 2/1/2 13/1/13 4/1/4 \r\nf 14/1/14 15/1/15 16/1/16 \r\nf 15/1/15 6/1/6 5/1/5 \r\nf 15/1/15 5/1/5 16/1/16 \r\nf 16/1/16 5/1/5 4/1/4 \r\nf 14/1/14 17/1/17 15/1/15 \r\nf 17/1/17 9/1/9 8/1/8 \r\nf 17/1/17 8/1/8 15/1/15 \r\nf 15/1/15 8/1/8 6/1/6 \r\nf 14/1/14 18/1/18 17/1/17 \r\nf 18/1/18 12/1/12 11/1/11 \r\nf 18/1/18 11/1/11 17/1/17 \r\nf 17/1/17 11/1/11 9/1/9 \r\nf 14/1/14 16/1/16 18/1/18 \r\nf 16/1/16 4/1/4 13/1/13 \r\nf 16/1/16 13/1/13 18/1/18 \r\nf 18/1/18 13/1/13 12/1/12 \r\nf 19/2/1 20/2/2 21/2/3 \r\nf 20/2/2 22/2/4 23/2/5 \r\nf 20/2/2 23/2/5 21/2/3 \r\nf 21/2/3 23/2/5 24/2/6 \r\nf 19/2/1 21/2/3 25/2/7 \r\nf 21/2/3 24/2/6 26/2/8 \r\nf 21/2/3 26/2/8 25/2/7 \r\nf 25/2/7 26/2/8 27/2/9 \r\nf 19/2/1 25/2/7 28/2/10 \r\nf 25/2/7 27/2/9 29/2/11 \r\nf 25/2/7 29/2/11 28/2/10 \r\nf 28/2/10 29/2/11 30/2/12 \r\nf 19/2/1 28/2/10 20/2/2 \r\nf 28/2/10 30/2/12 31/2/13 \r\nf 28/2/10 31/2/13 20/2/2 \r\nf 20/2/2 31/2/13 22/2/4 \r\nf 32/2/14 33/2/15 34/2/16 \r\nf 33/2/15 24/2/6 23/2/5 \r\nf 33/2/15 23/2/5 34/2/16 \r\nf 34/2/16 23/2/5 22/2/4 \r\nf 32/2/14 35/2/17 33/2/15 \r\nf 35/2/17 27/2/9 26/2/8 \r\nf 35/2/17 26/2/8 33/2/15 \r\nf 33/2/15 26/2/8 24/2/6 \r\nf 32/2/14 36/2/18 35/2/17 \r\nf 36/2/18 30/2/12 29/2/11 \r\nf 36/2/18 29/2/11 35/2/17 \r\nf 35/2/17 29/2/11 27/2/9 \r\nf 32/2/14 34/2/16 36/2/18 \r\nf 34/2/16 22/2/4 31/2/13 \r\nf 34/2/16 31/2/13 36/2/18 \r\nf 36/2/18 31/2/13 30/2/12 \r\nf 37/3/1 38/3/19 39/3/20 \r\nf 38/3/19 40/3/4 41/3/21 \r\nf 38/3/19 41/3/21 39/3/20 \r\nf 39/3/20 41/3/21 42/3/22 \r\nf 37/3/1 39/3/20 43/3/23 \r\nf 39/3/20 42/3/22 44/3/24 \r\nf 39/3/20 44/3/24 43/3/23 \r\nf 43/3/23 44/3/24 45/3/9 \r\nf 37/3/1 43/3/23 46/3/25 \r\nf 43/3/23 45/3/9 47/3/26 \r\nf 43/3/23 47/3/26 46/3/25 \r\nf 46/3/25 47/3/26 48/3/27 \r\nf 37/3/1 46/3/25 38/3/19 \r\nf 46/3/25 48/3/27 49/3/28 \r\nf 46/3/25 49/3/28 38/3/19 \r\nf 38/3/19 49/3/28 40/3/4 \r\nf 50/3/14 51/3/29 52/3/30 \r\nf 51/3/29 42/3/22 41/3/21 \r\nf 51/3/29 41/3/21 52/3/30 \r\nf 52/3/30 41/3/21 40/3/4 \r\nf 50/3/14 53/3/31 51/3/29 \r\nf 53/3/31 45/3/9 44/3/24 \r\nf 53/3/31 44/3/24 51/3/29 \r\nf 51/3/29 44/3/24 42/3/22 \r\nf 50/3/14 54/3/32 53/3/31 \r\nf 54/3/32 48/3/27 47/3/26 \r\nf 54/3/32 47/3/26 53/3/31 \r\nf 53/3/31 47/3/26 45/3/9 \r\nf 50/3/14 52/3/30 54/3/32 \r\nf 52/3/30 40/3/4 49/3/28 \r\nf 52/3/30 49/3/28 54/3/32 \r\nf 54/3/32 49/3/28 48/3/27 \r\nf 55/3/1 56/3/33 57/3/34 \r\nf 56/3/33 58/3/4 59/3/35 \r\nf 56/3/33 59/3/35 57/3/34 \r\nf 57/3/34 59/3/35 60/3/22 \r\nf 55/3/1 57/3/34 61/3/7 \r\nf 57/3/34 60/3/22 62/3/36 \r\nf 57/3/34 62/3/36 61/3/7 \r\nf 61/3/7 62/3/36 63/3/9 \r\nf 55/3/1 61/3/7 64/3/37 \r\nf 61/3/7 63/3/9 65/3/38 \r\nf 61/3/7 65/3/38 64/3/37 \r\nf 64/3/37 65/3/38 66/3/27 \r\nf 55/3/1 64/3/37 56/3/33 \r\nf 64/3/37 66/3/27 67/3/39 \r\nf 64/3/37 67/3/39 56/3/33 \r\nf 56/3/33 67/3/39 58/3/4 \r\nf 68/3/14 69/3/40 70/3/16 \r\nf 69/3/40 60/3/22 59/3/35 \r\nf 69/3/40 59/3/35 70/3/16 \r\nf 70/3/16 59/3/35 58/3/4 \r\nf 68/3/14 71/3/41 69/3/40 \r\nf 71/3/41 63/3/9 62/3/36 \r\nf 71/3/41 62/3/36 69/3/40 \r\nf 69/3/40 62/3/36 60/3/22 \r\nf 68/3/14 72/3/42 71/3/41 \r\nf 72/3/42 66/3/27 65/3/38 \r\nf 72/3/42 65/3/38 71/3/41 \r\nf 71/3/41 65/3/38 63/3/9 \r\nf 68/3/14 70/3/16 72/3/42 \r\nf 70/3/16 58/3/4 67/3/39 \r\nf 70/3/16 67/3/39 72/3/42 \r\nf 72/3/42 67/3/39 66/3/27 \r\nf 73/2/1 74/2/33 75/2/34 \r\nf 74/2/33 76/2/4 77/2/35 \r\nf 74/2/33 77/2/35 75/2/34 \r\nf 75/2/34 77/2/35 78/2/22 \r\nf 73/2/1 75/2/34 79/2/7 \r\nf 75/2/34 78/2/22 80/2/36 \r\nf 75/2/34 80/2/36 79/2/7 \r\nf 79/2/7 80/2/36 81/2/9 \r\nf 73/2/1 79/2/7 82/2/37 \r\nf 79/2/7 81/2/9 83/2/38 \r\nf 79/2/7 83/2/38 82/2/37 \r\nf 82/2/37 83/2/38 84/2/27 \r\nf 73/2/1 82/2/37 74/2/33 \r\nf 82/2/37 84/2/27 85/2/39 \r\nf 82/2/37 85/2/39 74/2/33 \r\nf 74/2/33 85/2/39 76/2/4 \r\nf 86/2/14 87/2/40 88/2/16 \r\nf 87/2/40 78/2/22 77/2/35 \r\nf 87/2/40 77/2/35 88/2/16 \r\nf 88/2/16 77/2/35 76/2/4 \r\nf 86/2/14 89/2/41 87/2/40 \r\nf 89/2/41 81/2/9 80/2/36 \r\nf 89/2/41 80/2/36 87/2/40 \r\nf 87/2/40 80/2/36 78/2/22 \r\nf 86/2/14 90/2/42 89/2/41 \r\nf 90/2/42 84/2/27 83/2/38 \r\nf 90/2/42 83/2/38 89/2/41 \r\nf 89/2/41 83/2/38 81/2/9 \r\nf 86/2/14 88/2/16 90/2/42 \r\nf 88/2/16 76/2/4 85/2/39 \r\nf 88/2/16 85/2/39 90/2/42 \r\nf 90/2/42 85/2/39 84/2/27 \r\nf 91/4/1 92/4/19 93/4/20 \r\nf 92/4/19 94/4/4 95/4/21 \r\nf 92/4/19 95/4/21 93/4/20 \r\nf 93/4/20 95/4/21 96/4/22 \r\nf 91/4/1 93/4/20 97/4/23 \r\nf 93/4/20 96/4/22 98/4/24 \r\nf 93/4/20 98/4/24 97/4/23 \r\nf 97/4/23 98/4/24 99/4/9 \r\nf 91/4/1 97/4/23 100/4/25 \r\nf 97/4/23 99/4/9 101/4/26 \r\nf 97/4/23 101/4/26 100/4/25 \r\nf 100/4/25 101/4/26 102/4/27 \r\nf 91/4/1 100/4/25 92/4/19 \r\nf 100/4/25 102/4/27 103/4/28 \r\nf 100/4/25 103/4/28 92/4/19 \r\nf 92/4/19 103/4/28 94/4/4 \r\nf 104/4/14 105/4/29 106/4/30 \r\nf 105/4/29 96/4/22 95/4/21 \r\nf 105/4/29 95/4/21 106/4/30 \r\nf 106/4/30 95/4/21 94/4/4 \r\nf 104/4/14 107/4/31 105/4/29 \r\nf 107/4/31 99/4/9 98/4/24 \r\nf 107/4/31 98/4/24 105/4/29 \r\nf 105/4/29 98/4/24 96/4/22 \r\nf 104/4/14 108/4/32 107/4/31 \r\nf 108/4/32 102/4/27 101/4/26 \r\nf 108/4/32 101/4/26 107/4/31 \r\nf 107/4/31 101/4/26 99/4/9 \r\nf 104/4/14 106/4/30 108/4/32 \r\nf 106/4/30 94/4/4 103/4/28 \r\nf 106/4/30 103/4/28 108/4/32 \r\nf 108/4/32 103/4/28 102/4/27 \r\nf 109/5/1 110/5/33 111/5/34 \r\nf 110/5/33 112/5/4 113/5/35 \r\nf 110/5/33 113/5/35 111/5/34 \r\nf 111/5/34 113/5/35 114/5/22 \r\nf 109/5/1 111/5/34 115/5/7 \r\nf 111/5/34 114/5/22 116/5/36 \r\nf 111/5/34 116/5/36 115/5/7 \r\nf 115/5/7 116/5/36 117/5/9 \r\nf 109/5/1 115/5/7 118/5/37 \r\nf 115/5/7 117/5/9 119/5/38 \r\nf 115/5/7 119/5/38 118/5/37 \r\nf 118/5/37 119/5/38 120/5/27 \r\nf 109/5/1 118/5/37 110/5/33 \r\nf 118/5/37 120/5/27 121/5/39 \r\nf 118/5/37 121/5/39 110/5/33 \r\nf 110/5/33 121/5/39 112/5/4 \r\nf 122/5/14 123/5/40 124/5/16 \r\nf 123/5/40 114/5/22 113/5/35 \r\nf 123/5/40 113/5/35 124/5/16 \r\nf 124/5/16 113/5/35 112/5/4 \r\nf 122/5/14 125/5/41 123/5/40 \r\nf 125/5/41 117/5/9 116/5/36 \r\nf 125/5/41 116/5/36 123/5/40 \r\nf 123/5/40 116/5/36 114/5/22 \r\nf 122/5/14 126/5/42 125/5/41 \r\nf 126/5/42 120/5/27 119/5/38 \r\nf 126/5/42 119/5/38 125/5/41 \r\nf 125/5/41 119/5/38 117/5/9 \r\nf 122/5/14 124/5/16 126/5/42 \r\nf 124/5/16 112/5/4 121/5/39 \r\nf 124/5/16 121/5/39 126/5/42 \r\nf 126/5/42 121/5/39 120/5/27 \r\nf 127/4/1 128/4/33 129/4/34 \r\nf 128/4/33 130/4/4 131/4/35 \r\nf 128/4/33 131/4/35 129/4/34 \r\nf 129/4/34 131/4/35 132/4/22 \r\nf 127/4/1 129/4/34 133/4/7 \r\nf 129/4/34 132/4/22 134/4/36 \r\nf 129/4/34 134/4/36 133/4/7 \r\nf 133/4/7 134/4/36 135/4/9 \r\nf 127/4/1 133/4/7 136/4/37 \r\nf 133/4/7 135/4/9 137/4/38 \r\nf 133/4/7 137/4/38 136/4/37 \r\nf 136/4/37 137/4/38 138/4/27 \r\nf 127/4/1 136/4/37 128/4/33 \r\nf 136/4/37 138/4/27 139/4/39 \r\nf 136/4/37 139/4/39 128/4/33 \r\nf 128/4/33 139/4/39 130/4/4 \r\nf 140/4/14 141/4/40 142/4/16 \r\nf 141/4/40 132/4/22 131/4/35 \r\nf 141/4/40 131/4/35 142/4/16 \r\nf 142/4/16 131/4/35 130/4/4 \r\nf 140/4/14 143/4/41 141/4/40 \r\nf 143/4/41 135/4/9 134/4/36 \r\nf 143/4/41 134/4/36 141/4/40 \r\nf 141/4/40 134/4/36 132/4/22 \r\nf 140/4/14 144/4/42 143/4/41 \r\nf 144/4/42 138/4/27 137/4/38 \r\nf 144/4/42 137/4/38 143/4/41 \r\nf 143/4/41 137/4/38 135/4/9 \r\nf 140/4/14 142/4/16 144/4/42 \r\nf 142/4/16 130/4/4 139/4/39 \r\nf 142/4/16 139/4/39 144/4/42 \r\nf 144/4/42 139/4/39 138/4/27 \r\nf 145/6/1 146/6/19 147/6/20 \r\nf 146/6/19 148/6/4 149/6/21 \r\nf 146/6/19 149/6/21 147/6/20 \r\nf 147/6/20 149/6/21 150/6/22 \r\nf 145/6/1 147/6/20 151/6/23 \r\nf 147/6/20 150/6/22 152/6/24 \r\nf 147/6/20 152/6/24 151/6/23 \r\nf 151/6/23 152/6/24 153/6/9 \r\nf 145/6/1 151/6/23 154/6/25 \r\nf 151/6/23 153/6/9 155/6/26 \r\nf 151/6/23 155/6/26 154/6/25 \r\nf 154/6/25 155/6/26 156/6/27 \r\nf 145/6/1 154/6/25 146/6/19 \r\nf 154/6/25 156/6/27 157/6/28 \r\nf 154/6/25 157/6/28 146/6/19 \r\nf 146/6/19 157/6/28 148/6/4 \r\nf 158/6/14 159/6/29 160/6/30 \r\nf 159/6/29 150/6/22 149/6/21 \r\nf 159/6/29 149/6/21 160/6/30 \r\nf 160/6/30 149/6/21 148/6/4 \r\nf 158/6/14 161/6/31 159/6/29 \r\nf 161/6/31 153/6/9 152/6/24 \r\nf 161/6/31 152/6/24 159/6/29 \r\nf 159/6/29 152/6/24 150/6/22 \r\nf 158/6/14 162/6/32 161/6/31 \r\nf 162/6/32 156/6/27 155/6/26 \r\nf 162/6/32 155/6/26 161/6/31 \r\nf 161/6/31 155/6/26 153/6/9 \r\nf 158/6/14 160/6/30 162/6/32 \r\nf 160/6/30 148/6/4 157/6/28 \r\nf 160/6/30 157/6/28 162/6/32 \r\nf 162/6/32 157/6/28 156/6/27 \r\nf 163/5/1 164/5/2 165/5/3 \r\nf 164/5/2 166/5/4 167/5/5 \r\nf 164/5/2 167/5/5 165/5/3 \r\nf 165/5/3 167/5/5 168/5/6 \r\nf 163/5/1 165/5/3 169/5/7 \r\nf 165/5/3 168/5/6 170/5/8 \r\nf 165/5/3 170/5/8 169/5/7 \r\nf 169/5/7 170/5/8 171/5/9 \r\nf 163/5/1 169/5/7 172/5/10 \r\nf 169/5/7 171/5/9 173/5/11 \r\nf 169/5/7 173/5/11 172/5/10 \r\nf 172/5/10 173/5/11 174/5/12 \r\nf 163/5/1 172/5/10 164/5/2 \r\nf 172/5/10 174/5/12 175/5/13 \r\nf 172/5/10 175/5/13 164/5/2 \r\nf 164/5/2 175/5/13 166/5/4 \r\nf 176/5/14 177/5/15 178/5/16 \r\nf 177/5/15 168/5/6 167/5/5 \r\nf 177/5/15 167/5/5 178/5/16 \r\nf 178/5/16 167/5/5 166/5/4 \r\nf 176/5/14 179/5/17 177/5/15 \r\nf 179/5/17 171/5/9 170/5/8 \r\nf 179/5/17 170/5/8 177/5/15 \r\nf 177/5/15 170/5/8 168/5/6 \r\nf 176/5/14 180/5/18 179/5/17 \r\nf 180/5/18 174/5/12 173/5/11 \r\nf 180/5/18 173/5/11 179/5/17 \r\nf 179/5/17 173/5/11 171/5/9 \r\nf 176/5/14 178/5/16 180/5/18 \r\nf 178/5/16 166/5/4 175/5/13 \r\nf 178/5/16 175/5/13 180/5/18 \r\nf 180/5/18 175/5/13 174/5/12 \r\nf 181/7/1 182/7/2 183/7/3 \r\nf 182/7/2 184/7/4 185/7/5 \r\nf 182/7/2 185/7/5 183/7/3 \r\nf 183/7/3 185/7/5 186/7/6 \r\nf 181/7/1 183/7/3 187/7/7 \r\nf 183/7/3 186/7/6 188/7/8 \r\nf 183/7/3 188/7/8 187/7/7 \r\nf 187/7/7 188/7/8 189/7/9 \r\nf 181/7/1 187/7/7 190/7/10 \r\nf 187/7/7 189/7/9 191/7/11 \r\nf 187/7/7 191/7/11 190/7/10 \r\nf 190/7/10 191/7/11 192/7/12 \r\nf 181/7/1 190/7/10 182/7/2 \r\nf 190/7/10 192/7/12 193/7/13 \r\nf 190/7/10 193/7/13 182/7/2 \r\nf 182/7/2 193/7/13 184/7/4 \r\nf 194/7/14 195/7/15 196/7/16 \r\nf 195/7/15 186/7/6 185/7/5 \r\nf 195/7/15 185/7/5 196/7/16 \r\nf 196/7/16 185/7/5 184/7/4 \r\nf 194/7/14 197/7/17 195/7/15 \r\nf 197/7/17 189/7/9 188/7/8 \r\nf 197/7/17 188/7/8 195/7/15 \r\nf 195/7/15 188/7/8 186/7/6 \r\nf 194/7/14 198/7/18 197/7/17 \r\nf 198/7/18 192/7/12 191/7/11 \r\nf 198/7/18 191/7/11 197/7/17 \r\nf 197/7/17 191/7/11 189/7/9 \r\nf 194/7/14 196/7/16 198/7/18 \r\nf 196/7/16 184/7/4 193/7/13 \r\nf 196/7/16 193/7/13 198/7/18 \r\nf 198/7/18 193/7/13 192/7/12 \r\nf 199/8/1 200/8/19 201/8/20 \r\nf 200/8/19 202/8/4 203/8/21 \r\nf 200/8/19 203/8/21 201/8/20 \r\nf 201/8/20 203/8/21 204/8/22 \r\nf 199/8/1 201/8/20 205/8/23 \r\nf 201/8/20 204/8/22 206/8/24 \r\nf 201/8/20 206/8/24 205/8/23 \r\nf 205/8/23 206/8/24 207/8/9 \r\nf 199/8/1 205/8/23 208/8/25 \r\nf 205/8/23 207/8/9 209/8/26 \r\nf 205/8/23 209/8/26 208/8/25 \r\nf 208/8/25 209/8/26 210/8/27 \r\nf 199/8/1 208/8/25 200/8/19 \r\nf 208/8/25 210/8/27 211/8/28 \r\nf 208/8/25 211/8/28 200/8/19 \r\nf 200/8/19 211/8/28 202/8/4 \r\nf 212/8/14 213/8/29 214/8/30 \r\nf 213/8/29 204/8/22 203/8/21 \r\nf 213/8/29 203/8/21 214/8/30 \r\nf 214/8/30 203/8/21 202/8/4 \r\nf 212/8/14 215/8/31 213/8/29 \r\nf 215/8/31 207/8/9 206/8/24 \r\nf 215/8/31 206/8/24 213/8/29 \r\nf 213/8/29 206/8/24 204/8/22 \r\nf 212/8/14 216/8/32 215/8/31 \r\nf 216/8/32 210/8/27 209/8/26 \r\nf 216/8/32 209/8/26 215/8/31 \r\nf 215/8/31 209/8/26 207/8/9 \r\nf 212/8/14 214/8/30 216/8/32 \r\nf 214/8/30 202/8/4 211/8/28 \r\nf 214/8/30 211/8/28 216/8/32 \r\nf 216/8/32 211/8/28 210/8/27 \r\nusemtl Material__41\r\ns off\r\nf 217/9/43 218/10/43 219/11/43 220/12/43 \r\nf 221/13/44 222/14/44 218/10/44 217/9/44 \r\nf 223/15/45 224/16/45 222/14/45 221/13/45 \r\nf 220/17/46 219/18/46 224/16/46 223/15/46 \r\nf 224/16/47 219/18/47 218/19/47 222/20/47 \r\nf 223/15/48 221/13/48 217/9/48 220/12/48 \r\nf 225/21/49 226/22/49 227/12/49 228/23/49 \r\nf 229/24/50 230/25/50 226/22/50 225/21/50 \r\nf 231/26/51 232/27/51 230/25/51 229/24/51 \r\nf 228/28/52 227/29/52 232/27/52 231/26/52 \r\nf 232/27/53 227/29/53 226/30/53 230/31/53 \r\nf 231/26/54 229/24/54 225/21/54 228/23/54 \r\nf 233/11/55 234/23/55 235/23/55 236/11/55 \r\nf 237/11/56 238/23/56 234/23/56 233/11/56 \r\nf 239/11/57 240/23/57 238/23/57 237/11/57 \r\nf 236/11/58 235/23/58 240/23/58 239/11/58 \r\nf 240/23/22 235/23/22 234/23/22 238/23/22 \r\nf 239/11/27 237/11/27 233/11/27 236/11/27 \r\nf 241/9/59 242/32/59 243/23/59 244/12/59 \r\nf 245/13/60 246/33/60 242/32/60 241/9/60 \r\nf 247/15/61 248/34/61 246/33/61 245/13/61 \r\nf 244/17/62 243/35/62 248/34/62 247/15/62 \r\nf 248/34/63 243/35/63 242/36/63 246/28/63 \r\nf 247/15/64 245/13/64 241/9/64 244/12/64 \r\nf 249/37/65 250/38/65 251/12/65 252/39/65 \r\nf 253/40/66 254/41/66 250/38/66 249/37/66 \r\nf 255/42/67 256/43/67 254/41/67 253/40/67 \r\nf 252/44/68 251/45/68 256/43/68 255/42/68 \r\nf 256/43/69 251/45/69 250/46/69 254/47/69 \r\nf 255/42/70 253/40/70 249/37/70 252/39/70 \r\nf 257/48/71 258/49/71 259/23/71 260/11/71 \r\nf 261/48/72 262/49/72 258/49/72 257/48/72 \r\nf 263/48/73 264/49/73 262/49/73 261/48/73 \r\nf 260/48/74 259/49/74 264/49/74 263/48/74 \r\nf 264/49/75 259/23/75 258/49/75 262/49/75 \r\nf 263/48/76 261/48/76 257/48/76 260/11/76 \r\nf 265/9/77 266/10/77 267/11/77 252/12/77 \r\nf 268/13/78 269/14/78 266/10/78 265/9/78 \r\nf 270/15/79 271/16/79 269/14/79 268/13/79 \r\nf 252/17/80 267/18/80 271/16/80 270/15/80 \r\nf 271/16/81 267/18/81 266/50/81 269/51/81 \r\nf 270/15/82 268/13/82 265/9/82 252/12/82 \r\nf 272/21/83 273/22/83 274/12/83 275/23/83 \r\nf 276/24/84 277/25/84 273/22/84 272/21/84 \r\nf 278/26/85 279/27/85 277/25/85 276/24/85 \r\nf 275/28/86 274/29/86 279/27/86 278/26/86 \r\nf 279/52/87 274/12/87 273/22/87 277/25/87 \r\nf 278/26/88 276/24/88 272/21/88 275/23/88 \r\nf 280/53/89 281/54/89 282/23/89 283/39/89 \r\nf 284/55/90 285/56/90 281/54/90 280/53/90 \r\nf 286/57/91 287/58/91 285/56/91 284/55/91 \r\nf 283/59/92 282/60/92 287/58/92 286/57/92 \r\nf 287/61/93 282/23/93 281/54/93 285/56/93 \r\nf 286/57/94 284/55/94 280/53/94 283/39/94 \r\nf 288/10/95 289/9/95 282/12/95 290/11/95 \r\nf 291/14/96 292/13/96 289/9/96 288/10/96 \r\nf 293/16/97 294/15/97 292/13/97 291/14/97 \r\nf 290/18/98 282/17/98 294/15/98 293/16/98 \r\nf 294/62/99 282/12/99 289/9/99 292/13/99 \r\nf 293/16/100 291/14/100 288/10/100 290/11/100 \r\nf 295/22/101 296/21/101 297/23/101 298/12/101 \r\nf 299/25/102 300/24/102 296/21/102 295/22/102 \r\nf 301/27/103 302/26/103 300/24/103 299/25/103 \r\nf 298/29/104 297/28/104 302/26/104 301/27/104 \r\nf 302/26/105 297/28/105 296/63/105 300/64/105 \r\nf 301/27/106 299/25/106 295/22/106 298/12/106 \r\nf 303/65/107 304/66/107 305/12/107 306/39/107 \r\nf 307/67/108 308/68/108 304/66/108 303/65/108 \r\nf 309/69/109 310/70/109 308/68/109 307/67/109 \r\nf 306/71/110 305/72/110 310/70/110 309/69/110 \r\nf 310/73/111 305/12/111 304/66/111 308/68/111 \r\nf 309/69/112 307/67/112 303/65/112 306/39/112 \r\nf 311/23/72 312/11/72 313/11/72 314/23/72 \r\nf 315/23/71 316/11/71 312/11/71 311/23/71 \r\nf 317/23/74 318/11/74 316/11/74 315/23/74 \r\nf 314/23/73 313/11/73 318/11/73 317/23/73 \r\nf 318/11/76 313/11/76 312/11/76 316/11/76 \r\nf 317/23/75 315/23/75 311/23/75 314/23/75 \r\nf 319/9/113 320/32/113 321/23/113 306/12/113 \r\nf 322/13/114 323/33/114 320/32/114 319/9/114 \r\nf 324/15/115 325/34/115 323/33/115 322/13/115 \r\nf 306/17/116 321/35/116 325/34/116 324/15/116 \r\nf 325/74/117 321/23/117 320/32/117 323/33/117 \r\nf 324/15/118 322/13/118 319/9/118 306/12/118 \r\nf 326/32/119 327/9/119 328/12/119 329/23/119 \r\nf 330/33/120 331/13/120 327/9/120 326/32/120 \r\nf 332/34/121 333/15/121 331/13/121 330/33/121 \r\nf 329/35/122 328/17/122 333/15/122 332/34/122 \r\nf 333/15/123 328/17/123 327/75/123 331/76/123 \r\nf 332/34/124 330/33/124 326/32/124 329/23/124 \r\nf 334/48/125 335/49/125 336/23/125 337/11/125 \r\nf 338/48/126 339/49/126 335/49/126 334/48/126 \r\nf 340/48/127 341/49/127 339/49/127 338/48/127 \r\nf 337/48/128 336/49/128 341/49/128 340/48/128 \r\nf 341/49/1 336/23/1 335/49/1 339/49/1 \r\nf 340/48/14 338/48/14 334/48/14 337/11/14 \r\nf 342/9/129 343/10/129 344/11/129 345/12/129 \r\nf 346/13/101 347/14/101 343/10/101 342/9/101 \r\nf 348/15/130 349/16/130 347/14/130 346/13/130 \r\nf 345/17/131 344/18/131 349/16/131 348/15/131 \r\nf 349/16/132 344/18/132 343/77/132 347/78/132 \r\nf 348/15/133 346/13/133 342/9/133 345/12/133 \r\nf 350/10/84 351/9/84 352/12/84 353/11/84 \r\nf 354/14/83 355/13/83 351/9/83 350/10/83 \r\nf 356/16/134 357/15/134 355/13/134 354/14/134 \r\nf 353/18/135 352/17/135 357/15/135 356/16/135 \r\nf 357/15/136 352/17/136 351/79/136 355/80/136 \r\nf 356/16/137 354/14/137 350/10/137 353/11/137 \r\nf 358/22/138 359/81/138 360/11/138 361/12/138 \r\nf 362/25/139 363/82/139 359/81/139 358/22/139 \r\nf 364/27/140 365/83/140 363/82/140 362/25/140 \r\nf 361/29/141 360/84/141 365/83/141 364/27/141 \r\nf 365/83/142 360/84/142 359/85/142 363/86/142 \r\nf 364/27/143 362/25/143 358/22/143 361/12/143 \r\nf 366/32/144 367/9/144 368/12/144 369/23/144 \r\nf 370/33/145 371/13/145 367/9/145 366/32/145 \r\nf 372/34/146 373/15/146 371/13/146 370/33/146 \r\nf 369/35/147 368/17/147 373/15/147 372/34/147 \r\nf 373/15/148 368/17/148 367/87/148 371/88/148 \r\nf 372/34/149 370/33/149 366/32/149 369/23/149 \r\nf 374/89/150 375/90/150 376/91/150 377/11/150 \r\nf 378/92/151 379/93/151 375/90/151 374/89/151 \r\nf 380/94/152 381/95/152 379/93/152 378/92/152 \r\nf 377/96/153 376/7/153 381/95/153 380/94/153 \r\nf 381/97/154 376/91/154 375/90/154 379/93/154 \r\nf 380/94/155 378/92/155 374/89/155 377/11/155 \r\nf 382/90/156 383/89/156 384/11/156 385/91/156 \r\nf 386/93/157 387/92/157 383/89/157 382/90/157 \r\nf 388/95/158 389/94/158 387/92/158 386/93/158 \r\nf 385/7/159 384/96/159 389/94/159 388/95/159 \r\nf 389/98/160 384/11/160 383/89/160 387/92/160 \r\nf 388/95/161 386/93/161 382/90/161 385/91/161 \r\nf 390/66/162 391/99/162 392/91/162 393/12/162 \r\nf 394/68/163 395/100/163 391/99/163 390/66/163 \r\nf 396/70/164 397/101/164 395/100/164 394/68/164 \r\nf 393/72/165 392/102/165 397/101/165 396/70/165 \r\nf 397/103/166 392/91/166 391/99/166 395/100/166 \r\nf 396/70/167 394/68/167 390/66/167 393/12/167 \r\nf 398/23/168 399/11/168 400/11/168 401/23/168 \r\nf 402/23/169 403/11/169 399/11/169 398/23/169 \r\nf 404/23/58 405/11/58 403/11/58 402/23/58 \r\nf 401/23/57 400/11/57 405/11/57 404/23/57 \r\nf 405/11/27 400/11/27 399/11/27 403/11/27 \r\nf 404/23/22 402/23/22 398/23/22 401/23/22 \r\nf 406/10/170 407/9/170 408/12/170 409/11/170 \r\nf 410/14/171 411/13/171 407/9/171 406/10/171 \r\nf 412/16/172 413/15/172 411/13/172 410/14/172 \r\nf 409/18/173 408/17/173 413/15/173 412/16/173 \r\nf 413/104/174 408/12/174 407/9/174 411/13/174 \r\nf 412/16/175 410/14/175 406/10/175 409/11/175 \r\nf 414/105/176 415/106/176 416/11/176 417/91/176 \r\nf 418/107/177 419/108/177 415/106/177 414/105/177 \r\nf 420/109/178 421/110/178 419/108/178 418/107/178 \r\nf 417/111/179 416/112/179 421/110/179 420/109/179 \r\nf 421/113/180 416/11/180 415/106/180 419/108/180 \r\nf 420/109/181 418/107/181 414/105/181 417/91/181 \r\nf 422/32/182 423/114/182 416/115/182 424/23/182 \r\nf 425/33/183 426/116/183 423/114/183 422/32/183 \r\nf 427/34/184 428/117/184 426/116/184 425/33/184 \r\nf 424/35/185 416/118/185 428/117/185 427/34/185 \r\nf 428/117/186 416/118/186 423/119/186 426/120/186 \r\nf 427/34/187 425/33/187 422/32/187 424/23/187 \r\nf 429/10/188 430/9/188 392/12/188 431/11/188 \r\nf 432/14/189 433/13/189 430/9/189 429/10/189 \r\nf 434/16/190 435/15/190 433/13/190 432/14/190 \r\nf 431/18/191 392/17/191 435/15/191 434/16/191 \r\nf 435/121/192 392/12/192 430/9/192 433/13/192 \r\nf 434/16/193 432/14/193 429/10/193 431/11/193 \r\nf 436/9/194 437/10/194 438/11/194 439/12/194 \r\nf 440/13/195 441/14/195 437/10/195 436/9/195 \r\nf 442/15/196 443/16/196 441/14/196 440/13/196 \r\nf 439/17/197 438/18/197 443/16/197 442/15/197 \r\nf 443/16/198 438/18/198 437/122/198 441/123/198 \r\nf 442/15/199 440/13/199 436/9/199 439/12/199 \r\nf 444/48/125 445/49/125 446/23/125 447/11/125 \r\nf 448/48/126 449/49/126 445/49/126 444/48/126 \r\nf 450/48/127 451/49/127 449/49/127 448/48/127 \r\nf 447/48/128 446/49/128 451/49/128 450/48/128 \r\nf 451/49/1 446/23/1 445/49/1 449/49/1 \r\nf 450/48/14 448/48/14 444/48/14 447/11/14 \r\n# 180 polygons - 384 triangles\r\n\r\n#\r\n# object Cone001\r\n#\r\n\r\nv  -119.03839111 0.00000000 12.39693832\r\nv  -172.83148193 0.00000000 43.45438385\r\nv  -234.00271606 0.00000000 32.66824341\r\nv  -273.92941284 0.00000000 -14.91452599\r\nv  -273.92944336 0.00000000 -77.02945709\r\nv  -234.00273132 0.00000000 -124.61225128\r\nv  -172.83148193 0.00000000 -135.39840698\r\nv  -119.03838348 0.00000000 -104.34094238\r\nv  -97.79382324 0.00000000 -45.97200775\r\nv  -188.59976196 127.19325256 -45.97200775\r\n# 10 vertices\r\n\r\nvn 0.00000000 -1.00000000 -0.00000000\r\nvn 0.78035563 0.55711234 -0.28402629\r\nvn 0.41521856 0.55711228 -0.71917969\r\nvn -0.14420398 0.55711234 -0.81782091\r\nvn -0.63615179 0.55711228 -0.53379470\r\nvn -0.63615179 0.55711234 -0.53379470\r\nvn -0.83043718 0.55711228 0.00000020\r\nvn -0.63615167 0.55711234 0.53379482\r\nvn -0.14420390 0.55711228 0.81782097\r\nvn -0.14420390 0.55711234 0.81782097\r\nvn 0.41521850 0.55711234 0.71917969\r\nvn 0.78035563 0.55711234 0.28402632\r\nvn 0.78035563 0.55711228 0.28402632\r\n# 13 vertex normals\r\n\r\nvt 0.26303691 0.00000000 -0.18479332\r\nvt 0.05591966 0.00000000 -0.81520796\r\nvt 0.05659240 0.00000000 -1.06417787\r\nvt 0.26474038 0.00000000 -0.81520748\r\nvt 0.58296895 0.00000000 -0.18479243\r\nvt 0.86237532 0.00000000 0.53208899\r\nvt 0.97222221 0.00000000 1.00000000\r\nvt 0.86111110 0.00000000 1.00000000\r\nvt 0.75000000 0.00000000 1.00000000\r\nvt 0.50000000 1.00000000 0.00000000\r\nvt -0.02777779 0.00000000 1.00000000\r\nvt 0.08333334 0.00000000 1.00000000\r\nvt 0.19444448 0.00000000 1.00000000\r\nvt 0.30555558 0.00000000 1.00000000\r\nvt 0.41666669 0.00000000 0.99999994\r\nvt 0.52777779 0.00000000 0.99999994\r\nvt 0.63888884 0.00000000 1.00000000\r\n# 17 texture coords\r\n\r\ng Cone001\r\nusemtl Material__42\r\ns 1\r\nf 452/124/200 453/125/200 454/126/200 455/127/200 456/128/200 457/129/200 458/130/200 459/131/200 460/132/200 \r\nusemtl Material__43\r\ns 2\r\nf 460/132/201 459/131/201 461/133/201 \r\ns 4\r\nf 459/131/202 458/130/202 461/133/202 \r\ns 8\r\nf 458/134/203 457/135/203 461/133/203 \r\ns 16\r\nf 457/135/204 456/136/205 461/133/205 \r\ns 32\r\nf 456/136/206 455/137/206 461/133/206 \r\ns 64\r\nf 455/137/207 454/138/207 461/133/207 \r\ns 128\r\nf 454/138/208 453/139/209 461/133/209 \r\ns 256\r\nf 453/139/210 452/140/210 461/133/210 \r\ns 512\r\nf 452/140/211 460/132/211 461/133/212 \r\n# 1 polygons - 9 triangles\r\n\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/Wavefront Object/spline.obj",
    "content": "# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware\n# File Created: 27.05.2016 16:27:25\n\nmtllib spline.mtl\n\n#\n# shape Line001\n#\n\nv  71.96043396 50.40676880 7.76218033\nv  68.00450134 49.56087112 9.62696075\nv  58.35432816 47.37934113 12.77519226\nv  45.49077225 44.39643097 15.20822144\nv  31.89469528 41.14640045 14.92743301\nv  20.04695511 38.16349030 9.93418884\nv  12.42840576 35.98196030 -1.77015114\nv  11.51990128 35.13606262 -22.18419647\nv  11.96961975 32.52806473 -45.35875702\nv  7.61955643 26.33384705 -63.90428543\nv  -0.25867081 18.99807358 -77.65885162\nv  -10.39344025 12.96540833 -86.46051788\nv  -21.51314926 10.68051147 -90.14735413\nv  -32.34618759 14.58804321 -88.55743408\nv  -41.62093735 27.13267326 -81.52883148\nv  -45.51561356 42.52115250 -66.96699524\nv  -43.02957153 53.76282501 -45.02964783\nv  -37.12292480 61.50623322 -18.93314743\nv  -30.75580597 66.39993286 8.10605431\nv  -26.88832855 69.09246826 32.87157822\nv  -28.48061752 70.23239136 52.14703751\nv  -38.49278641 70.46823883 62.71599197\nv  -53.13377380 68.93627167 62.32793045\nv  -66.29364777 64.98539734 52.53622818\nv  -77.45420837 59.58318329 35.83026123\nv  -86.09729004 53.69718933 14.69950485\nv  -91.70471191 48.29497528 -8.36663914\nv  -93.75828552 44.34410095 -30.87874222\nv  -91.73982239 42.81213379 -50.34735489\nv  -89.87214661 43.91723251 -66.58690643\nv  -92.01886749 46.76722717 -80.05120850\nv  -97.12301636 50.66415787 -89.21000671\nv  -104.12763977 54.91006470 -92.53303528\nv  -111.97578430 58.80699158 -88.49005127\nv  -119.61050415 61.65698624 -75.55078125\nv  -125.97479248 62.76208496 -52.18497467\n# 36 vertices\n\ng Line001\nusemtl wire_088177027\nl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36\n"
  },
  {
    "path": "src/test/resources/samples/langs/Web Ontology Language/sample.owl",
    "content": "<?xml version=\"1.0\"?>\n\n\n<!DOCTYPE rdf:RDF [\n    <!ENTITY owl \"http://www.w3.org/2002/07/owl#\" >\n    <!ENTITY xsd \"http://www.w3.org/2001/XMLSchema#\" >\n    <!ENTITY rdfs \"http://www.w3.org/2000/01/rdf-schema#\" >\n    <!ENTITY rdf \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" >\n]>\n\n\n<rdf:RDF xmlns=\"http://www.co-ode.org/ontologies/pizza/pizza.owl#\"\n     xml:base=\"http://www.co-ode.org/ontologies/pizza/pizza.owl\"\n     xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\"\n     xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\"\n     xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n     xmlns:owl=\"http://www.w3.org/2002/07/owl#\">\n    <owl:Ontology rdf:about=\"\">\n        <owl:versionInfo xml:lang=\"en\"\n            >v.1.4. Added Food class (used in domain/range of hasIngredient), Added several hasCountryOfOrigin restrictions on pizzas, Made hasTopping invers functional</owl:versionInfo>\n        <owl:versionInfo rdf:datatype=\"&xsd;string\">version 1.5</owl:versionInfo>\n        <owl:versionInfo xml:lang=\"en\"\n            >v.1.5. Removed protege.owl import and references. Made ontology URI date-independent</owl:versionInfo>\n        <rdfs:comment xml:lang=\"en\"\n            >An example ontology that contains all constructs required for the various versions of the Pizza Tutorial run by Manchester University (see http://www.co-ode.org/resources/tutorials/)</rdfs:comment>\n    </owl:Ontology>\n    \n\n\n    <!-- \n    ///////////////////////////////////////////////////////////////////////////\n    //\n    //   OWL Classes\n    //\n    ///////////////////////////////////////////////////////////////////////////\n     -->\n\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#American -->\n\n    <owl:Class rdf:about=\"#American\">\n        <rdfs:label xml:lang=\"pt\">Americana</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#PeperoniSausageTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasCountryOfOrigin\"/>\n                <owl:hasValue rdf:resource=\"#America\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#PeperoniSausageTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#AmericanHot -->\n\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <rdfs:label xml:lang=\"pt\"\n            >AmericanaPicante</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#HotGreenPepperTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#JalapenoPepperTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasCountryOfOrigin\"/>\n                <owl:hasValue rdf:resource=\"#America\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#PeperoniSausageTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#PeperoniSausageTopping\"/>\n                            <owl:Class rdf:about=\"#JalapenoPepperTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#HotGreenPepperTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#AnchoviesTopping -->\n\n    <owl:Class rdf:about=\"#AnchoviesTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeAnchovies</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#FishTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#ArtichokeTopping -->\n\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeArtichoke</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#AsparagusTopping -->\n\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeAspargos</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Cajun -->\n\n    <owl:Class rdf:about=\"#Cajun\">\n        <rdfs:label xml:lang=\"pt\">Cajun</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TobascoPepperSauce\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#PrawnsTopping\"/>\n                            <owl:Class rdf:about=\"#TobascoPepperSauce\"/>\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#OnionTopping\"/>\n                            <owl:Class rdf:about=\"#PeperonataTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OnionTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#PeperonataTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#PrawnsTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#CajunSpiceTopping -->\n\n    <owl:Class rdf:about=\"#CajunSpiceTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeCajun</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Hot\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#CaperTopping -->\n\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeCaper</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Capricciosa -->\n\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <rdfs:label xml:lang=\"pt\">Capricciosa</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#HamTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#AnchoviesTopping\"/>\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#PeperonataTopping\"/>\n                            <owl:Class rdf:about=\"#HamTopping\"/>\n                            <owl:Class rdf:about=\"#CaperTopping\"/>\n                            <owl:Class rdf:about=\"#OliveTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OliveTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#AnchoviesTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#PeperonataTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#CaperTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Caprina -->\n\n    <owl:Class rdf:about=\"#Caprina\">\n        <rdfs:label xml:lang=\"pt\">Caprina</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#SundriedTomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#SundriedTomatoTopping\"/>\n                            <owl:Class rdf:about=\"#GoatsCheeseTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#GoatsCheeseTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#CheeseTopping -->\n\n    <owl:Class rdf:about=\"#CheeseTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeQueijo</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#CheeseyPizza -->\n\n    <owl:Class rdf:about=\"#CheeseyPizza\">\n        <rdfs:comment xml:lang=\"en\"\n            >Any pizza that has at least 1 cheese topping.</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\">PizzaComQueijo</rdfs:label>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                    <owl:Restriction>\n                        <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                        <owl:someValuesFrom rdf:resource=\"#CheeseTopping\"/>\n                    </owl:Restriction>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#CheeseyVegetableTopping -->\n\n    <owl:Class rdf:about=\"#CheeseyVegetableTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeQueijoComVegetais</rdfs:label>\n        <rdfs:comment xml:lang=\"en\"\n            >This class will be inconsistent. This is because we have given it 2 disjoint parents, which means it could never have any members (as nothing can simultaneously be a CheeseTopping and a VegetableTopping). NB Called ProbeInconsistentTopping in the ProtegeOWL Tutorial.</rdfs:comment>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#ChickenTopping -->\n\n    <owl:Class rdf:about=\"#ChickenTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeFrango</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Country -->\n\n    <owl:Class rdf:about=\"#Country\">\n        <rdfs:label xml:lang=\"pt\">Pais</rdfs:label>\n        <rdfs:comment xml:lang=\"en\"\n            >A class that is equivalent to the set of individuals that are described in the enumeration - ie Countries can only be either America, England, France, Germany or Italy and nothing else. Note that these individuals have been asserted to be allDifferent from each other.</rdfs:comment>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class>\n                        <owl:oneOf rdf:parseType=\"Collection\">\n                            <owl:Thing rdf:about=\"#America\"/>\n                            <owl:Thing rdf:about=\"#Italy\"/>\n                            <owl:Thing rdf:about=\"#Germany\"/>\n                            <owl:Thing rdf:about=\"#France\"/>\n                            <owl:Thing rdf:about=\"#England\"/>\n                        </owl:oneOf>\n                    </owl:Class>\n                    <owl:Class rdf:about=\"#DomainConcept\"/>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#DeepPanBase -->\n\n    <owl:Class rdf:about=\"#DeepPanBase\">\n        <rdfs:label xml:lang=\"pt\">BaseEspessa</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PizzaBase\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#DomainConcept -->\n\n    <owl:Class rdf:about=\"#DomainConcept\"/>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Fiorentina -->\n\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <rdfs:label xml:lang=\"pt\">Fiorentina</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#GarlicTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#SpinachTopping\"/>\n                            <owl:Class rdf:about=\"#OliveTopping\"/>\n                            <owl:Class rdf:about=\"#ParmesanTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#GarlicTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OliveTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#ParmesanTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#SpinachTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#FishTopping -->\n\n    <owl:Class rdf:about=\"#FishTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDePeixe</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Food -->\n\n    <owl:Class rdf:about=\"#Food\">\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#DomainConcept\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#FourCheesesTopping -->\n\n    <owl:Class rdf:about=\"#FourCheesesTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaQuatroQueijos</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#FourSeasons -->\n\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <rdfs:label xml:lang=\"pt\">QuatroQueijos</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MushroomTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#PeperoniSausageTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OliveTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#AnchoviesTopping\"/>\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#PeperoniSausageTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#CaperTopping\"/>\n                            <owl:Class rdf:about=\"#OliveTopping\"/>\n                            <owl:Class rdf:about=\"#MushroomTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#AnchoviesTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#CaperTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#FruitTopping -->\n\n    <owl:Class rdf:about=\"#FruitTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeFrutas</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#FruttiDiMare -->\n\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <rdfs:label xml:lang=\"pt\">FrutosDoMar</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#GarlicTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#MixedSeafoodTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#GarlicTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MixedSeafoodTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#GarlicTopping -->\n\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <rdfs:label xml:lang=\"pt\">CoberturaDeAlho</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Medium\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Giardiniera -->\n\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <rdfs:label xml:lang=\"pt\">Giardiniera</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MushroomTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#LeekTopping\"/>\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n                            <owl:Class rdf:about=\"#PeperonataTopping\"/>\n                            <owl:Class rdf:about=\"#OliveTopping\"/>\n                            <owl:Class rdf:about=\"#MushroomTopping\"/>\n                            <owl:Class rdf:about=\"#SlicedTomatoTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OliveTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#SlicedTomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#PeperonataTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#PetitPoisTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#LeekTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#GoatsCheeseTopping -->\n\n    <owl:Class rdf:about=\"#GoatsCheeseTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeQueijoDeCabra</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#GorgonzolaTopping -->\n\n    <owl:Class rdf:about=\"#GorgonzolaTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeGorgonzola</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#GreenPepperTopping -->\n\n    <owl:Class rdf:about=\"#GreenPepperTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDePimentaoVerde</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#HamTopping -->\n\n    <owl:Class rdf:about=\"#HamTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDePresunto</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#HerbSpiceTopping -->\n\n    <owl:Class rdf:about=\"#HerbSpiceTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeErvas</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Hot -->\n\n    <owl:Class rdf:about=\"#Hot\">\n        <rdfs:label xml:lang=\"pt\">Picante</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#Spiciness\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#HotGreenPepperTopping -->\n\n    <owl:Class rdf:about=\"#HotGreenPepperTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDePimentaoVerdePicante</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Hot\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#GreenPepperTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#HotSpicedBeefTopping -->\n\n    <owl:Class rdf:about=\"#HotSpicedBeefTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeBifePicante</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Hot\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#IceCream -->\n\n    <owl:Class rdf:about=\"#IceCream\">\n        <rdfs:comment xml:lang=\"en\"\n            >A class to demonstrate mistakes made with setting a property domain. The property hasTopping has a domain of Pizza. This means that the reasoner can infer that all individuals using the hasTopping property must be of type Pizza. Because of the restriction on this class, all members of IceCream must use the hasTopping property, and therefore must also be members of Pizza. However, Pizza and IceCream are disjoint, so this causes an inconsistency. If they were not disjoint, IceCream would be inferred to be a subclass of Pizza.</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\">Sorvete</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#FruitTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#Food\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#InterestingPizza -->\n\n    <owl:Class rdf:about=\"#InterestingPizza\">\n        <rdfs:label xml:lang=\"pt\"\n            >PizzaInteressante</rdfs:label>\n        <rdfs:comment xml:lang=\"en\"\n            >Any pizza that has at least 3 toppings. Note that this is a cardinality constraint on the hasTopping property and NOT a qualified cardinality constraint (QCR). A QCR would specify from which class the members in this relationship must be. eg has at least 3 toppings from PizzaTopping. This is currently not supported in OWL.</rdfs:comment>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Restriction>\n                        <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                        <owl:minCardinality rdf:datatype=\"&xsd;nonNegativeInteger\">3</owl:minCardinality>\n                    </owl:Restriction>\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#JalapenoPepperTopping -->\n\n    <owl:Class rdf:about=\"#JalapenoPepperTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeJalapeno</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Hot\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#LaReine -->\n\n    <owl:Class rdf:about=\"#LaReine\">\n        <rdfs:label xml:lang=\"pt\">LaReine</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MushroomTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#HamTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OliveTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#HamTopping\"/>\n                            <owl:Class rdf:about=\"#OliveTopping\"/>\n                            <owl:Class rdf:about=\"#MushroomTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#LeekTopping -->\n\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <rdfs:label xml:lang=\"pt\">CoberturaDeLeek</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Margherita -->\n\n    <owl:Class rdf:about=\"#Margherita\">\n        <rdfs:label xml:lang=\"pt\">Margherita</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#MeatTopping -->\n\n    <owl:Class rdf:about=\"#MeatTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeCarne</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#MeatyPizza -->\n\n    <owl:Class rdf:about=\"#MeatyPizza\">\n        <rdfs:comment xml:lang=\"en\"\n            >Any pizza that has at least one meat topping</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\">PizzaDeCarne</rdfs:label>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Restriction>\n                        <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                        <owl:someValuesFrom rdf:resource=\"#MeatTopping\"/>\n                    </owl:Restriction>\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Medium -->\n\n    <owl:Class rdf:about=\"#Medium\">\n        <rdfs:label xml:lang=\"pt\">Media</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#Spiciness\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Mild -->\n\n    <owl:Class rdf:about=\"#Mild\">\n        <rdfs:label xml:lang=\"pt\">NaoPicante</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#Spiciness\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#MixedSeafoodTopping -->\n\n    <owl:Class rdf:about=\"#MixedSeafoodTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeFrutosDoMarMistos</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#FishTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#MozzarellaTopping -->\n\n    <owl:Class rdf:about=\"#MozzarellaTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeMozzarella</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasCountryOfOrigin\"/>\n                <owl:hasValue rdf:resource=\"#Italy\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Mushroom -->\n\n    <owl:Class rdf:about=\"#Mushroom\">\n        <rdfs:label xml:lang=\"pt\">Cogumelo</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MushroomTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#MushroomTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#MushroomTopping -->\n\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeCogumelo</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#NamedPizza -->\n\n    <owl:Class rdf:about=\"#NamedPizza\">\n        <rdfs:comment xml:lang=\"en\"\n            >A pizza that can be found on a pizza menu</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\">PizzaComUmNome</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#Pizza\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Napoletana -->\n\n    <owl:Class rdf:about=\"#Napoletana\">\n        <rdfs:label xml:lang=\"pt\">Napoletana</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OliveTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#AnchoviesTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasCountryOfOrigin\"/>\n                <owl:hasValue rdf:resource=\"#Italy\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#CaperTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#AnchoviesTopping\"/>\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#CaperTopping\"/>\n                            <owl:Class rdf:about=\"#OliveTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#NonVegetarianPizza -->\n\n    <owl:Class rdf:about=\"#NonVegetarianPizza\">\n        <rdfs:comment xml:lang=\"en\"\n            >Any Pizza that is not a VegetarianPizza</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\"\n            >PizzaNaoVegetariana</rdfs:label>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                    <owl:Class>\n                        <owl:complementOf>\n                            <owl:Class rdf:about=\"#VegetarianPizza\"/>\n                        </owl:complementOf>\n                    </owl:Class>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#NutTopping -->\n\n    <owl:Class rdf:about=\"#NutTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeCastanha</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#OliveTopping -->\n\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeAzeitona</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#OnionTopping -->\n\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeCebola</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Medium\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#ParmaHamTopping -->\n\n    <owl:Class rdf:about=\"#ParmaHamTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDePrezuntoParma</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#HamTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Parmense -->\n\n    <owl:Class rdf:about=\"#Parmense\">\n        <rdfs:label xml:lang=\"pt\">Parmense</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#HamTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#ParmesanTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#AsparagusTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#HamTopping\"/>\n                            <owl:Class rdf:about=\"#ParmesanTopping\"/>\n                            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#ParmesanTopping -->\n\n    <owl:Class rdf:about=\"#ParmesanTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeParmesao</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#PeperonataTopping -->\n\n    <owl:Class rdf:about=\"#PeperonataTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaPeperonata</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Medium\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#PeperoniSausageTopping -->\n\n    <owl:Class rdf:about=\"#PeperoniSausageTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeCalabreza</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Medium\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#PepperTopping -->\n\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDePimentao</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#PetitPoisTopping -->\n\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaPetitPois</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#PineKernels -->\n\n    <owl:Class rdf:about=\"#PineKernels\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaPineKernels</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NutTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Pizza -->\n\n    <owl:Class rdf:about=\"#Pizza\">\n        <rdfs:label xml:lang=\"en\">Pizza</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#Food\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasBase\"/>\n                <owl:someValuesFrom rdf:resource=\"#PizzaBase\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#PizzaBase -->\n\n    <owl:Class rdf:about=\"#PizzaBase\">\n        <rdfs:label xml:lang=\"pt\">BaseDaPizza</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#Food\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#PizzaTopping -->\n\n    <owl:Class rdf:about=\"#PizzaTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDaPizza</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#Food\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#PolloAdAstra -->\n\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <rdfs:label xml:lang=\"pt\">PolloAdAstra</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#RedOnionTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#CajunSpiceTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#GarlicTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#SweetPepperTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#ChickenTopping\"/>\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#GarlicTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#RedOnionTopping\"/>\n                            <owl:Class rdf:about=\"#CajunSpiceTopping\"/>\n                            <owl:Class rdf:about=\"#SweetPepperTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#ChickenTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#PrawnsTopping -->\n\n    <owl:Class rdf:about=\"#PrawnsTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeCamarao</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#FishTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#PrinceCarlo -->\n\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaPrinceCarlo</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#LeekTopping\"/>\n                            <owl:Class rdf:about=\"#RosemaryTopping\"/>\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#ParmesanTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#ParmesanTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#LeekTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#RosemaryTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#QuattroFormaggi -->\n\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <rdfs:label xml:lang=\"pt\">QuatroQueijos</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#FourCheesesTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#FourCheesesTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#RealItalianPizza -->\n\n    <owl:Class rdf:about=\"#RealItalianPizza\">\n        <rdfs:comment xml:lang=\"en\"\n            >This defined class has conditions that are part of the definition: ie any Pizza that has the country of origin, Italy is a RealItalianPizza. It also has conditions that merely describe the members - that all RealItalianPizzas must only have ThinAndCrispy bases. In essence, all pizzas from Italy must have ThinAndCrispy bases.</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\"\n            >PizzaItalianaReal</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasBase\"/>\n                <owl:allValuesFrom rdf:resource=\"#ThinAndCrispyBase\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                    <owl:Restriction>\n                        <owl:onProperty rdf:resource=\"#hasCountryOfOrigin\"/>\n                        <owl:hasValue rdf:resource=\"#Italy\"/>\n                    </owl:Restriction>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#RedOnionTopping -->\n\n    <owl:Class rdf:about=\"#RedOnionTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeCebolaVermelha</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#RocketTopping -->\n\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <rdfs:label xml:lang=\"pt\">CoberturaRocket</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Medium\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Rosa -->\n\n    <owl:Class rdf:about=\"#Rosa\">\n        <rdfs:label xml:lang=\"pt\">Rosa</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#GorgonzolaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#GorgonzolaTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#RosemaryTopping -->\n\n    <owl:Class rdf:about=\"#RosemaryTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaRosemary</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#SauceTopping -->\n\n    <owl:Class rdf:about=\"#SauceTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaEmMolho</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Siciliana -->\n\n    <owl:Class rdf:about=\"#Siciliana\">\n        <rdfs:label xml:lang=\"pt\">Siciliana</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#GarlicTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#HamTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#ArtichokeTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OliveTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#AnchoviesTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#AnchoviesTopping\"/>\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#GarlicTopping\"/>\n                            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#HamTopping\"/>\n                            <owl:Class rdf:about=\"#OliveTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#SlicedTomatoTopping -->\n\n    <owl:Class rdf:about=\"#SlicedTomatoTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeTomateFatiado</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#SloppyGiuseppe -->\n\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <rdfs:label xml:lang=\"pt\">SloppyGiuseppe</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#HotSpicedBeefTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#GreenPepperTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OnionTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#HotSpicedBeefTopping\"/>\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#OnionTopping\"/>\n                            <owl:Class rdf:about=\"#GreenPepperTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Soho -->\n\n    <owl:Class rdf:about=\"#Soho\">\n        <rdfs:label xml:lang=\"pt\">Soho</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#GarlicTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#RocketTopping\"/>\n                            <owl:Class rdf:about=\"#OliveTopping\"/>\n                            <owl:Class rdf:about=\"#ParmesanTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#GarlicTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OliveTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#ParmesanTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#RocketTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Spiciness -->\n\n    <owl:Class rdf:about=\"#Spiciness\">\n        <rdfs:comment xml:lang=\"en\"\n            >A ValuePartition that describes only values from Hot, Medium or Mild. NB Subclasses can themselves be divided up into further partitions.</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\">Tempero</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#ValuePartition\"/>\n        </rdfs:subClassOf>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:unionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#Hot\"/>\n                    <owl:Class rdf:about=\"#Medium\"/>\n                    <owl:Class rdf:about=\"#Mild\"/>\n                </owl:unionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#SpicyPizza -->\n\n    <owl:Class rdf:about=\"#SpicyPizza\">\n        <rdfs:comment xml:lang=\"en\"\n            >Any pizza that has a spicy topping is a SpicyPizza</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\">PizzaTemperada</rdfs:label>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                    <owl:Restriction>\n                        <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                        <owl:someValuesFrom rdf:resource=\"#SpicyTopping\"/>\n                    </owl:Restriction>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#SpicyPizzaEquivalent -->\n\n    <owl:Class rdf:about=\"#SpicyPizzaEquivalent\">\n        <rdfs:comment xml:lang=\"en\"\n            >An alternative definition for the SpicyPizza which does away with needing a definition of SpicyTopping and uses a slightly more complicated restriction: Pizzas that have at least one topping that is both a PizzaTopping and has spiciness hot are members of this class.</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\"\n            >PizzaTemperadaEquivalente</rdfs:label>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                    <owl:Restriction>\n                        <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                        <owl:someValuesFrom>\n                            <owl:Class>\n                                <owl:intersectionOf rdf:parseType=\"Collection\">\n                                    <owl:Restriction>\n                                        <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                                        <owl:someValuesFrom rdf:resource=\"#Hot\"/>\n                                    </owl:Restriction>\n                                    <owl:Class rdf:about=\"#PizzaTopping\"/>\n                                </owl:intersectionOf>\n                            </owl:Class>\n                        </owl:someValuesFrom>\n                    </owl:Restriction>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#SpicyTopping -->\n\n    <owl:Class rdf:about=\"#SpicyTopping\">\n        <rdfs:comment xml:lang=\"en\"\n            >Any pizza topping that has spiciness Hot</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaTemperada</rdfs:label>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Restriction>\n                        <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                        <owl:someValuesFrom rdf:resource=\"#Hot\"/>\n                    </owl:Restriction>\n                    <owl:Class rdf:about=\"#PizzaTopping\"/>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#SpinachTopping -->\n\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeEspinafre</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#SultanaTopping -->\n\n    <owl:Class rdf:about=\"#SultanaTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaSultana</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#FruitTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Medium\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#SundriedTomatoTopping -->\n\n    <owl:Class rdf:about=\"#SundriedTomatoTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeTomateRessecadoAoSol</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#SweetPepperTopping -->\n\n    <owl:Class rdf:about=\"#SweetPepperTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDePimentaoDoce</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#ThinAndCrispyBase -->\n\n    <owl:Class rdf:about=\"#ThinAndCrispyBase\">\n        <rdfs:label xml:lang=\"pt\"\n            >BaseFinaEQuebradica</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PizzaBase\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#ThinAndCrispyPizza -->\n\n    <owl:Class rdf:about=\"#ThinAndCrispyPizza\">\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                    <owl:Restriction>\n                        <owl:onProperty rdf:resource=\"#hasBase\"/>\n                        <owl:allValuesFrom rdf:resource=\"#ThinAndCrispyBase\"/>\n                    </owl:Restriction>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#TobascoPepperSauce -->\n\n    <owl:Class rdf:about=\"#TobascoPepperSauce\">\n        <rdfs:label xml:lang=\"pt\"\n            >MolhoTobascoPepper</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#SauceTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Hot\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#TomatoTopping -->\n\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeTomate</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasSpiciness\"/>\n                <owl:someValuesFrom rdf:resource=\"#Mild\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#UnclosedPizza -->\n\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <rdfs:label xml:lang=\"pt\">PizzaAberta</rdfs:label>\n        <rdfs:comment rdf:datatype=\"&xsd;string\"\n            >An unclosed Pizza cannot be inferred to be either a VegetarianPizza or a NonVegetarianPizza, because it might have other toppings.</rdfs:comment>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#ValuePartition -->\n\n    <owl:Class rdf:about=\"#ValuePartition\">\n        <rdfs:label xml:lang=\"pt\">ValorDaParticao</rdfs:label>\n        <rdfs:comment rdf:datatype=\"&xsd;string\"\n            >A ValuePartition is a pattern that describes a restricted set of classes from which a property can be associated. The parent class is used in restrictions, and the covering axiom means that only members of the subclasses may be used as values. The possible subclasses cannot be extended without updating the ValuePartition class.</rdfs:comment>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#VegetableTopping -->\n\n    <owl:Class rdf:about=\"#VegetableTopping\">\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaDeVegetais</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#VegetarianPizza -->\n\n    <owl:Class rdf:about=\"#VegetarianPizza\">\n        <rdfs:label xml:lang=\"pt\"\n            >PizzaVegetariana</rdfs:label>\n        <rdfs:comment xml:lang=\"en\"\n            >Any pizza that does not have fish topping and does not have meat topping is a VegetarianPizza. Members of this class do not need to have any toppings at all.</rdfs:comment>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                    <owl:Class>\n                        <owl:complementOf>\n                            <owl:Restriction>\n                                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                                <owl:someValuesFrom rdf:resource=\"#MeatTopping\"/>\n                            </owl:Restriction>\n                        </owl:complementOf>\n                    </owl:Class>\n                    <owl:Class>\n                        <owl:complementOf>\n                            <owl:Restriction>\n                                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                                <owl:someValuesFrom rdf:resource=\"#FishTopping\"/>\n                            </owl:Restriction>\n                        </owl:complementOf>\n                    </owl:Class>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#VegetarianPizzaEquivalent1 -->\n\n    <owl:Class rdf:about=\"#VegetarianPizzaEquivalent1\">\n        <rdfs:comment xml:lang=\"en\"\n            >Any pizza that only has vegetarian toppings or no toppings is a VegetarianPizzaEquiv1. Should be inferred to be equivalent to VegetarianPizzaEquiv2.  Not equivalent to VegetarianPizza because PizzaTopping is not covering</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\"\n            >PizzaVegetarianaEquivalente1</rdfs:label>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                    <owl:Restriction>\n                        <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                        <owl:allValuesFrom rdf:resource=\"#VegetarianTopping\"/>\n                    </owl:Restriction>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#VegetarianPizzaEquivalent2 -->\n\n    <owl:Class rdf:about=\"#VegetarianPizzaEquivalent2\">\n        <rdfs:comment xml:lang=\"en\"\n            >An alternative to VegetarianPizzaEquiv1 that does not require a definition of VegetarianTopping. Perhaps more difficult to maintain. Not equivalent to VegetarianPizza</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\"\n            >PizzaVegetarianaEquivalente2</rdfs:label>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#Pizza\"/>\n                    <owl:Restriction>\n                        <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                        <owl:allValuesFrom>\n                            <owl:Class>\n                                <owl:unionOf rdf:parseType=\"Collection\">\n                                    <owl:Class rdf:about=\"#SauceTopping\"/>\n                                    <owl:Class rdf:about=\"#CheeseTopping\"/>\n                                    <owl:Class rdf:about=\"#VegetableTopping\"/>\n                                    <owl:Class rdf:about=\"#FruitTopping\"/>\n                                    <owl:Class rdf:about=\"#NutTopping\"/>\n                                    <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n                                </owl:unionOf>\n                            </owl:Class>\n                        </owl:allValuesFrom>\n                    </owl:Restriction>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#VegetarianTopping -->\n\n    <owl:Class rdf:about=\"#VegetarianTopping\">\n        <rdfs:comment xml:lang=\"en\"\n            >An example of a covering axiom. VegetarianTopping is equivalent to the union of all toppings in the given axiom. VegetarianToppings can only be Cheese or Vegetable or....etc.</rdfs:comment>\n        <rdfs:label xml:lang=\"pt\"\n            >CoberturaVegetariana</rdfs:label>\n        <owl:equivalentClass>\n            <owl:Class>\n                <owl:intersectionOf rdf:parseType=\"Collection\">\n                    <owl:Class rdf:about=\"#PizzaTopping\"/>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#SauceTopping\"/>\n                            <owl:Class rdf:about=\"#CheeseTopping\"/>\n                            <owl:Class rdf:about=\"#VegetableTopping\"/>\n                            <owl:Class rdf:about=\"#FruitTopping\"/>\n                            <owl:Class rdf:about=\"#NutTopping\"/>\n                            <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:intersectionOf>\n            </owl:Class>\n        </owl:equivalentClass>\n    </owl:Class>\n    \n\n\n    <!-- Class: http://www.co-ode.org/ontologies/pizza/pizza.owl#Veneziana -->\n\n    <owl:Class rdf:about=\"#Veneziana\">\n        <rdfs:label xml:lang=\"pt\">Veneziana</rdfs:label>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:allValuesFrom>\n                    <owl:Class>\n                        <owl:unionOf rdf:parseType=\"Collection\">\n                            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n                            <owl:Class rdf:about=\"#TomatoTopping\"/>\n                            <owl:Class rdf:about=\"#SultanaTopping\"/>\n                            <owl:Class rdf:about=\"#OnionTopping\"/>\n                            <owl:Class rdf:about=\"#CaperTopping\"/>\n                            <owl:Class rdf:about=\"#OliveTopping\"/>\n                            <owl:Class rdf:about=\"#PineKernels\"/>\n                        </owl:unionOf>\n                    </owl:Class>\n                </owl:allValuesFrom>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#PineKernels\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#TomatoTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OliveTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#SultanaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#MozzarellaTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#OnionTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Class rdf:about=\"#NamedPizza\"/>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasCountryOfOrigin\"/>\n                <owl:hasValue rdf:resource=\"#Italy\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n        <rdfs:subClassOf>\n            <owl:Restriction>\n                <owl:onProperty rdf:resource=\"#hasTopping\"/>\n                <owl:someValuesFrom rdf:resource=\"#CaperTopping\"/>\n            </owl:Restriction>\n        </rdfs:subClassOf>\n    </owl:Class>\n    \n\n\n    <!-- \n    ///////////////////////////////////////////////////////////////////////////\n    //\n    //   OWL Object Properties\n    //\n    ///////////////////////////////////////////////////////////////////////////\n     -->\n\n    \n\n\n    <!-- Object property: http://www.co-ode.org/ontologies/pizza/pizza.owl#hasBase -->\n\n    <owl:ObjectProperty rdf:about=\"#hasBase\">\n        <rdf:type rdf:resource=\"&owl;FunctionalProperty\"/>\n        <rdf:type rdf:resource=\"&owl;InverseFunctionalProperty\"/>\n        <owl:inverseOf>\n            <owl:ObjectProperty rdf:about=\"#isBaseOf\"/>\n        </owl:inverseOf>\n        <rdfs:domain>\n            <owl:Class rdf:about=\"#Pizza\"/>\n        </rdfs:domain>\n        <rdfs:range>\n            <owl:Class rdf:about=\"#PizzaBase\"/>\n        </rdfs:range>\n    </owl:ObjectProperty>\n    \n\n\n    <!-- Object property: http://www.co-ode.org/ontologies/pizza/pizza.owl#hasCountryOfOrigin -->\n\n    <owl:ObjectProperty rdf:about=\"#hasCountryOfOrigin\"/>\n    \n\n\n    <!-- Object property: http://www.co-ode.org/ontologies/pizza/pizza.owl#hasIngredient -->\n\n    <owl:ObjectProperty rdf:about=\"#hasIngredient\">\n        <rdfs:comment xml:lang=\"en\"\n            >NB Transitive - the ingredients of ingredients are ingredients of the whole</rdfs:comment>\n        <rdf:type rdf:resource=\"&owl;TransitiveProperty\"/>\n        <owl:inverseOf>\n            <owl:ObjectProperty rdf:about=\"#isIngredientOf\"/>\n        </owl:inverseOf>\n        <rdfs:domain>\n            <owl:Class rdf:about=\"#Food\"/>\n        </rdfs:domain>\n        <rdfs:range>\n            <owl:Class rdf:about=\"#Food\"/>\n        </rdfs:range>\n    </owl:ObjectProperty>\n    \n\n\n    <!-- Object property: http://www.co-ode.org/ontologies/pizza/pizza.owl#hasSpiciness -->\n\n    <owl:ObjectProperty rdf:about=\"#hasSpiciness\">\n        <rdfs:comment xml:lang=\"en\"\n            >A property created to be used with the ValuePartition - Spiciness.</rdfs:comment>\n        <rdf:type rdf:resource=\"&owl;FunctionalProperty\"/>\n        <rdfs:range>\n            <owl:Class rdf:about=\"#Spiciness\"/>\n        </rdfs:range>\n    </owl:ObjectProperty>\n    \n\n\n    <!-- Object property: http://www.co-ode.org/ontologies/pizza/pizza.owl#hasTopping -->\n\n    <owl:ObjectProperty rdf:about=\"#hasTopping\">\n        <rdfs:comment xml:lang=\"en\"\n            >Note that hasTopping is inverse functional because isToppingOf is functional</rdfs:comment>\n        <rdf:type rdf:resource=\"&owl;InverseFunctionalProperty\"/>\n        <owl:inverseOf>\n            <owl:ObjectProperty rdf:about=\"#isToppingOf\"/>\n        </owl:inverseOf>\n        <rdfs:domain>\n            <owl:Class rdf:about=\"#Pizza\"/>\n        </rdfs:domain>\n        <rdfs:range>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </rdfs:range>\n    </owl:ObjectProperty>\n    \n\n\n    <!-- Object property: http://www.co-ode.org/ontologies/pizza/pizza.owl#isBaseOf -->\n\n    <owl:ObjectProperty rdf:about=\"#isBaseOf\">\n        <rdf:type rdf:resource=\"&owl;FunctionalProperty\"/>\n        <rdf:type rdf:resource=\"&owl;InverseFunctionalProperty\"/>\n        <owl:inverseOf>\n            <owl:ObjectProperty rdf:about=\"#hasBase\"/>\n        </owl:inverseOf>\n        <rdfs:domain>\n            <owl:Class rdf:about=\"#PizzaBase\"/>\n        </rdfs:domain>\n        <rdfs:range>\n            <owl:Class rdf:about=\"#Pizza\"/>\n        </rdfs:range>\n    </owl:ObjectProperty>\n    \n\n\n    <!-- Object property: http://www.co-ode.org/ontologies/pizza/pizza.owl#isIngredientOf -->\n\n    <owl:ObjectProperty rdf:about=\"#isIngredientOf\">\n        <rdfs:comment xml:lang=\"en\"\n            >The inverse property tree to hasIngredient - all subproperties and attributes of the properties should reflect those under hasIngredient.</rdfs:comment>\n        <rdf:type rdf:resource=\"&owl;TransitiveProperty\"/>\n        <owl:inverseOf>\n            <owl:ObjectProperty rdf:about=\"#hasIngredient\"/>\n        </owl:inverseOf>\n        <rdfs:domain>\n            <owl:Class rdf:about=\"#Food\"/>\n        </rdfs:domain>\n        <rdfs:range>\n            <owl:Class rdf:about=\"#Food\"/>\n        </rdfs:range>\n    </owl:ObjectProperty>\n    \n\n\n    <!-- Object property: http://www.co-ode.org/ontologies/pizza/pizza.owl#isToppingOf -->\n\n    <owl:ObjectProperty rdf:about=\"#isToppingOf\">\n        <rdfs:comment xml:lang=\"en\"\n            >Any given instance of topping should only be added to a single pizza (no cheap half-measures on our pizzas)</rdfs:comment>\n        <rdf:type rdf:resource=\"&owl;FunctionalProperty\"/>\n        <owl:inverseOf>\n            <owl:ObjectProperty rdf:about=\"#hasTopping\"/>\n        </owl:inverseOf>\n        <rdfs:domain>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </rdfs:domain>\n        <rdfs:range>\n            <owl:Class rdf:about=\"#Pizza\"/>\n        </rdfs:range>\n    </owl:ObjectProperty>\n    \n\n\n    <!-- \n    ///////////////////////////////////////////////////////////////////////////\n    //\n    //   OWL Individuals\n    //\n    ///////////////////////////////////////////////////////////////////////////\n     -->\n\n    \n\n\n    <!-- Individual: http://www.co-ode.org/ontologies/pizza/pizza.owl#America -->\n\n    <owl:Thing rdf:about=\"#America\">\n        <rdf:type rdf:resource=\"#Country\"/>\n    </owl:Thing>\n    \n\n\n    <!-- Individual: http://www.co-ode.org/ontologies/pizza/pizza.owl#England -->\n\n    <owl:Thing rdf:about=\"#England\">\n        <rdf:type rdf:resource=\"#Country\"/>\n    </owl:Thing>\n    \n\n\n    <!-- Individual: http://www.co-ode.org/ontologies/pizza/pizza.owl#France -->\n\n    <owl:Thing rdf:about=\"#France\">\n        <rdf:type rdf:resource=\"#Country\"/>\n    </owl:Thing>\n    \n\n\n    <!-- Individual: http://www.co-ode.org/ontologies/pizza/pizza.owl#Germany -->\n\n    <owl:Thing rdf:about=\"#Germany\">\n        <rdf:type rdf:resource=\"#Country\"/>\n    </owl:Thing>\n    \n\n\n    <!-- Individual: http://www.co-ode.org/ontologies/pizza/pizza.owl#Italy -->\n\n    <owl:Thing rdf:about=\"#Italy\">\n        <rdf:type rdf:resource=\"#Country\"/>\n    </owl:Thing>\n    \n\n\n    <!-- \n    ///////////////////////////////////////////////////////////////////////////\n    //\n    //   OWL Axioms\n    //\n    ///////////////////////////////////////////////////////////////////////////\n     -->\n\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SauceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MeatTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SauceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HotSpicedBeefTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PeperoniSausageTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PeperoniSausageTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HotSpicedBeefTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#VegetableTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Hot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mild\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mild\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Hot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SauceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FishTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FishTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SauceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MozzarellaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GoatsCheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GoatsCheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Pizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#IceCream\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#IceCream\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Pizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GorgonzolaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GoatsCheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GoatsCheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GorgonzolaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#IceCream\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PizzaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#IceCream\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PizzaBase\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#IceCream\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#IceCream\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PizzaBase\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SauceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HerbSpiceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SauceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RosemaryTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CajunSpiceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CajunSpiceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RosemaryTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AnchoviesTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MixedSeafoodTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MixedSeafoodTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AnchoviesTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FishTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HerbSpiceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FishTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#VegetarianPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#NonVegetarianPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#NonVegetarianPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#VegetarianPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ThinAndCrispyBase\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#DeepPanBase\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#DeepPanBase\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ThinAndCrispyBase\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SundriedTomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SlicedTomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SlicedTomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SundriedTomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MeatTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FishTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FishTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MozzarellaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GorgonzolaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GorgonzolaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourCheesesTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ParmesanTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ParmesanTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourCheesesTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PizzaBase\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PizzaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PizzaBase\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruitTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#NutTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#NutTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruitTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GreenPepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SweetPepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SweetPepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GreenPepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FishTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FishTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GorgonzolaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ParmesanTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ParmesanTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GorgonzolaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#DomainConcept\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ValuePartition\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ValuePartition\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#DomainConcept\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#JalapenoPepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GreenPepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GreenPepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#JalapenoPepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruitTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MeatTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruitTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PeperonataTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GreenPepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GreenPepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PeperonataTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#JalapenoPepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PeperonataTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PeperonataTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#JalapenoPepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Medium\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Hot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Hot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Medium\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourCheesesTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GoatsCheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GoatsCheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourCheesesTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MozzarellaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ParmesanTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ParmesanTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruitTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HerbSpiceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruitTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MeatTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HerbSpiceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#VegetableTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#NutTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#NutTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PeperonataTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SweetPepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SweetPepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PeperonataTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#VegetableTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruitTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruitTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SauceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruitTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruitTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SauceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#NutTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HerbSpiceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#NutTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Medium\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mild\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mild\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Medium\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#VegetableTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HerbSpiceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SauceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#VegetableTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SauceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#VegetableTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MeatTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Pizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PizzaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PizzaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Pizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrawnsTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MixedSeafoodTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MixedSeafoodTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrawnsTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HotSpicedBeefTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HamTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HamTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HotSpicedBeefTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ChickenTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HotSpicedBeefTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HotSpicedBeefTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ChickenTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ChickenTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HamTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HamTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ChickenTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrawnsTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AnchoviesTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AnchoviesTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrawnsTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SpinachTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SpinachTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ArtichokeTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ArtichokeTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#NutTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#NutTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SauceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#NutTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#NutTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SauceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourCheesesTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MozzarellaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MozzarellaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourCheesesTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Giardiniera\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Giardiniera\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ChickenTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PeperoniSausageTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PeperoniSausageTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ChickenTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SauceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SauceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OnionTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OnionTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PeperoniSausageTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HamTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HamTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PeperoniSausageTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#UnclosedPizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#UnclosedPizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PizzaBase\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Pizza\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Pizza\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PizzaBase\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#VegetableTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FishTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FishTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#VegetableTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#American\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#American\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#JalapenoPepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SweetPepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SweetPepperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#JalapenoPepperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GoatsCheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#ParmesanTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#ParmesanTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GoatsCheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruitTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FishTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FishTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruitTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AsparagusTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AsparagusTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Soho\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Soho\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Capricciosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Capricciosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruitTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruitTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#OliveTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#OliveTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MeatTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#NutTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#NutTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LaReine\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LaReine\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Mushroom\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#AmericanHot\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#AmericanHot\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Mushroom\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GarlicTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#RocketTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#RocketTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GarlicTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Margherita\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Margherita\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Caprina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#SloppyGiuseppe\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#SloppyGiuseppe\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Caprina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Rosa\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#QuattroFormaggi\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#QuattroFormaggi\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Rosa\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#NutTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FishTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FishTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#NutTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MeatTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MeatTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CheeseTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#HerbSpiceTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#HerbSpiceTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CheeseTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PetitPoisTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PetitPoisTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourCheesesTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#GorgonzolaTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#GorgonzolaTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourCheesesTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Fiorentina\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PrinceCarlo\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PrinceCarlo\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Fiorentina\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Cajun\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#PolloAdAstra\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#PolloAdAstra\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Cajun\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#LeekTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#TomatoTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#TomatoTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#LeekTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FruttiDiMare\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Napoletana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Napoletana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FruttiDiMare\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Veneziana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Parmense\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Parmense\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Veneziana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#FourSeasons\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#Siciliana\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#Siciliana\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#FourSeasons\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#CaperTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#MushroomTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <owl:Class rdf:about=\"#MushroomTopping\">\n        <owl:disjointWith>\n            <owl:Class rdf:about=\"#CaperTopping\"/>\n        </owl:disjointWith>\n    </owl:Class>\n    <rdf:Description rdf:about=\"#hasTopping\">\n        <rdfs:subPropertyOf rdf:resource=\"#hasIngredient\"/>\n    </rdf:Description>\n    <rdf:Description rdf:about=\"#isToppingOf\">\n        <rdfs:subPropertyOf rdf:resource=\"#isIngredientOf\"/>\n    </rdf:Description>\n    <rdf:Description rdf:about=\"#isBaseOf\">\n        <rdfs:subPropertyOf rdf:resource=\"#isIngredientOf\"/>\n    </rdf:Description>\n    <rdf:Description rdf:about=\"#hasBase\">\n        <rdfs:subPropertyOf rdf:resource=\"#hasIngredient\"/>\n    </rdf:Description>\n    <owl:AllDifferent>\n        <owl:distinctMembers rdf:parseType=\"Collection\">\n            <owl:Thing rdf:about=\"#America\"/>\n            <owl:Thing rdf:about=\"#Italy\"/>\n            <owl:Thing rdf:about=\"#Germany\"/>\n            <owl:Thing rdf:about=\"#France\"/>\n            <owl:Thing rdf:about=\"#England\"/>\n        </owl:distinctMembers>\n    </owl:AllDifferent>\n</rdf:RDF>\n"
  },
  {
    "path": "src/test/resources/samples/langs/WebAssembly/add.wat",
    "content": "(module\n  (import \"env\" \"printInt\" (func $printInt (param i32)))\n  (func $add (param $lhs i32) (param $rhs i32) (result i32)\n    get_local $lhs\n    get_local $rhs\n    i32.add\n  )\n\n  (func $main\n    (call $printInt\n      (call $add (i32.const 9) (i32.const 8))))\n\n  (export \"main\" (func $main))\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/WebAssembly/fibonacci.wat",
    "content": "(module\n  (import \"env\" \"printInt\" (func $printInt (param i32)))\n  (import \"env\" \"print\" (func $print (param i32 i32)))\n\n  (memory $memory 1)\n  (data (i32.const 0) \"\\n\")\n  (data (i32.const 1) \" \")\n\n  (func $endl\n    (call $print (i32.const 0) (i32.const 1)))\n  (func $space\n    (call $print (i32.const 1) (i32.const 1)))\n\n  (func $fibonacci_rec (param $a i32) (param $b i32) (param $n i32) (result i32)\n    (if (i32.eqz (get_local $n)) (return (get_local $a)))\n    (call $printInt (get_local $b))\n    (call $space)\n    (set_local $a (i32.add (get_local $a) (get_local $b)))\n    (call $fibonacci_rec (get_local $b) (get_local $a) (i32.sub (get_local $n) (i32.const 1)))\n  )\n\n  (func $fibonacci_iter (param $a i32) (param $b i32) (param $n i32) (result i32)\n    (loop $fi\n      (if (i32.eqz (get_local $n)) (return (get_local $a)))\n      (call $printInt (get_local $b))\n      (call $space)\n      (set_local $b (i32.add (get_local $a) (get_local $b)))\n      (set_local $a (i32.sub (get_local $b) (get_local $a)))\n      (set_local $n (i32.sub (get_local $n) (i32.const 1)))\n      (br $fi))\n    (get_local $b))\n\n  (func $main\n    (drop (call $fibonacci_rec (i32.const 0) (i32.const 1) (i32.const 9)))\n    (call $endl)\n    (drop (call $fibonacci_iter (i32.const 0) (i32.const 1) (i32.const 9))))\n\n  (export \"main\" (func $main))\n  (export \"memory\" (memory $memory))\n)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/WebAssembly/imported-min.wast",
    "content": "(module\n  (memory 256 256)\n  (data (i32.const 10) \"waka waka waka waka waka\")\n  ;; stack imports are special\n  (import \"env\" \"STACKTOP\" (global $STACKTOP$asm2wasm$import i32))\n  (import \"env\" \"STACK_MAX\" (global $STACK_MAX$asm2wasm$import i32))\n  ;; other imports must not be touched!\n  (import \"env\" \"tempDoublePtr\" (global $tempDoublePtr i32))\n  (export \"test1\" $test1)\n  (export \"test2\" $test2)\n  (export \"test3\" $test3)\n  ;; ok to modify a global, if we keep it the same value\n  (global $mine (mut i32) (i32.const 1))\n  ;; stack imports are ok to use. their uses are the same as other\n  ;; globals - must keep the same value (which means, unwind the stack)\n  ;; here the global names are \"minified\"\n  (global $global0 (mut i32) (get_global $STACKTOP$asm2wasm$import))\n  (global $global1 (mut i32) (get_global $STACK_MAX$asm2wasm$import))\n  ;; a global initialized by an import, so bad, but ok if not used\n  (global $do-not-use (mut i32) (get_global $tempDoublePtr))\n  (func $test1\n    (local $temp i32)\n    (set_global $mine (i32.const 1))\n    (set_local $temp (get_global $global0))\n    (set_global $global0 (i32.const 1337)) ;; bad\n    (set_global $global0 (get_local $temp)) ;; save us\n    (set_global $global1 (i32.const 913370)) ;; bad\n    (set_global $global1 (get_local $temp)) ;; save us\n    ;; use the stack memory\n    (i32.store (get_local $temp) (i32.const 1337))\n    (if\n      (i32.ne\n        (i32.load (get_local $temp))\n        (i32.const 1337)\n      )\n      (unreachable) ;; they should be equal, never get here\n    )\n    ;; finally, do a valid store\n    (i32.store8 (i32.const 12) (i32.const 115))\n  )\n  (func $test2\n    (set_global $tempDoublePtr (i32.const 1)) ;; bad!\n    (i32.store8 (i32.const 13) (i32.const 115))\n  )\n  (func $test3\n    (i32.store8 (i32.const 14) (i32.const 115))\n  )\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/WebAssembly/local-cse.wast",
    "content": "(module\n  (memory 100 100)\n  (func $basics\n    (local $x i32)\n    (local $y i32)\n    (drop\n      (i32.add (i32.const 1) (i32.const 2))\n    )\n    (drop\n      (i32.add (i32.const 1) (i32.const 2))\n    )\n    (if (i32.const 0) (nop))\n    (drop ;; we can't do this yet, non-linear\n      (i32.add (i32.const 1) (i32.const 2))\n    )\n    (drop\n      (i32.add (get_local $x) (get_local $y))\n    )\n    (drop\n      (i32.add (get_local $x) (get_local $y))\n    )\n    (drop\n      (i32.add (get_local $x) (get_local $y))\n    )\n    (call $basics) ;; side effects, but no matter for our locals\n    (drop\n      (i32.add (get_local $x) (get_local $y))\n    )\n    (set_local $x (i32.const 100))\n    (drop ;; x was changed!\n      (i32.add (get_local $x) (get_local $y))\n    )\n  )\n  (func $recursive1\n    (local $x i32)\n    (local $y i32)\n    (drop\n      (i32.add\n        (i32.const 1)\n        (i32.add\n          (i32.const 2)\n          (i32.const 3)\n        )\n      )\n    )\n    (drop\n      (i32.add\n        (i32.const 1)\n        (i32.add\n          (i32.const 2)\n          (i32.const 3)\n        )\n      )\n    )\n    (drop\n      (i32.add\n        (i32.const 2)\n        (i32.const 3)\n      )\n    )\n  )\n  (func $recursive2\n    (local $x i32)\n    (local $y i32)\n    (drop\n      (i32.add\n        (i32.const 1)\n        (i32.add\n          (i32.const 2)\n          (i32.const 3)\n        )\n      )\n    )\n    (drop\n      (i32.add\n        (i32.const 2)\n        (i32.const 3)\n      )\n    )\n    (drop\n      (i32.add\n        (i32.const 1)\n        (i32.add\n          (i32.const 2)\n          (i32.const 3)\n        )\n      )\n    )\n  )\n  (func $self\n    (local $x i32)\n    (local $y i32)\n    (drop\n      (i32.add\n        (i32.add\n          (i32.const 2)\n          (i32.const 3)\n        )\n        (i32.add\n          (i32.const 2)\n          (i32.const 3)\n        )\n      )\n    )\n    (drop\n      (i32.add\n        (i32.const 2)\n        (i32.const 3)\n      )\n    )\n  )\n  (func $loads\n    (drop\n      (i32.load (i32.const 10))\n    )\n    (drop\n      (i32.load (i32.const 10)) ;; implicit traps, sad\n    )\n  )\n  (func $8 (param $var$0 i32) (result i32)\n    (local $var$1 i32)\n    (local $var$2 i32)\n    (local $var$3 i32)\n    (block $label$0 i32\n      (i32.store\n        (tee_local $var$2\n          (i32.add\n            (get_local $var$1)\n            (i32.const 4)\n          )\n        )\n        (i32.and\n          (i32.load\n            (get_local $var$2)\n          )\n          (i32.xor\n            (tee_local $var$2\n              (i32.const 74)\n            )\n            (i32.const -1)\n          )\n        )\n      )\n      (i32.store\n        (tee_local $var$1\n          (i32.add\n            (get_local $var$1)\n            (i32.const 4)\n          )\n        )\n        (i32.or\n          (i32.load\n            (get_local $var$1)\n          )\n          (i32.and\n            (get_local $var$2)\n            (i32.const 8)\n          )\n        )\n      )\n      (i32.const 0)\n    )\n  )\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/WebAssembly/print.wat",
    "content": "(module\n  (import \"env\" \"printInt\" (func $printInt (param i32)))\n  (import \"env\" \"printFloat\" (func $printFloat (param f32)))\n  (import \"env\" \"print\" (func $print (param i32 i32)))\n\n  (memory $memory 1)\n  (data (i32.const 0) \"\\n\")\n  (data (i32.const 1) \"Hello World!\")\n\n  (func $endl\n    (call $print (i32.const 0) (i32.const 1)))\n\n  (func $main\n    (call $printInt (i32.const 9))\n    (call $endl)\n    (call $printFloat (f32.const 6.28))\n    (call $endl)\n    (call $print (i32.const 1) (i32.const 12))\n    )\n\n  (export \"main\" (func $main))\n  (export \"memory\" (memory $memory))\n)\n"
  },
  {
    "path": "src/test/resources/samples/langs/WebAssembly/remove-unused-brs_shrink-level=1_ignore-implicit-traps.wast",
    "content": "(module\n  (memory 256 256)\n  (type $0 (func (param i32)))\n  (type $1 (func))\n  (type $2 (func (result i32)))\n  (func $b14 (type $2)\n    (drop\n      (if i32 ;; with shrinking, this can become a select\n        (i32.const 1)\n        (block $block1 i32\n          (i32.const 12)\n        )\n        (block $block3 i32\n          (i32.const 27)\n        )\n      )\n    )\n    (drop\n      (if i32\n        (i32.const 1)\n        (i32.load (i32.const 10)) ;; load may have side effects, unless ignored\n        (i32.const 27)\n      )\n    )\n    (drop\n      (if i32\n        (i32.const 1)\n        (i32.rem_s (i32.const 11) (i32.const 12)) ;; rem may have side effects, unless ignored\n        (i32.const 27)\n      )\n    )\n    (drop\n      (if i32\n        (i32.const 1)\n        (i32.trunc_u/f64 (f64.const 12.34)) ;; float to int may have side effects, unless ignored\n        (i32.const 27)\n      )\n    )\n    (i32.const 0)\n  )\n  (func $join-br_ifs\n    (block $out\n      (br_if $out (i32.const 1))\n      (br_if $out (i32.const 2))\n      (br_if $out (i32.const 3))\n    )\n    (block $out2\n      (block $out3\n        (br_if $out2 (i32.const 1))\n        (br_if $out3 (i32.const 2))\n        (br_if $out2 (i32.const 3))\n      )\n      (unreachable)\n    )\n    (block $out4\n      (block $out5\n        (br_if $out4 (i32.const 1))\n        (br_if $out5 (i32.const 2))\n        (br_if $out5 (i32.const 3))\n      )\n      (unreachable)\n    )\n    (block $out6\n      (block $out7\n        (br_if $out6 (i32.const 1))\n        (br_if $out6 (i32.const 2))\n        (br_if $out7 (i32.const 3))\n      )\n      (unreachable)\n    )\n    (block $out8\n      (br_if $out8 (call $b14)) ;; side effect\n      (br_if $out8 (i32.const 0))\n    )\n    (block $out8\n      (br_if $out8 (i32.const 1))\n      (br_if $out8 (call $b14)) ;; side effect\n    )\n  )\n)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/WebIDL/AnimationEvent.webidl",
    "content": "/* -*- Mode: linguist-disable-strategy-modeline-IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this file,\n * You can obtain one at http://mozilla.org/MPL/2.0/.\n *\n * The origin of this IDL file is\n * http://www.w3.org/TR/css3-animations/#animation-events-\n * http://dev.w3.org/csswg/css3-animations/#animation-events-\n *\n * Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C\n * liability, trademark and document use rules apply.\n */\n\n[Constructor(DOMString type, optional AnimationEventInit eventInitDict)]\ninterface AnimationEvent : Event {\n  readonly attribute DOMString animationName;\n  readonly attribute float     elapsedTime;\n  readonly attribute DOMString pseudoElement;\n};\n\ndictionary AnimationEventInit : EventInit {\n  DOMString animationName = \"\";\n  float elapsedTime = 0;\n  DOMString pseudoElement = \"\";\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/WebIDL/Fetch.webidl",
    "content": "/* -*- Mode: linguist-disable-strategy-modeline-IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this file,\n * You can obtain one at http://mozilla.org/MPL/2.0/.\n *\n * The origin of this IDL file is\n * http://fetch.spec.whatwg.org/\n */\n\ntypedef object JSON;\n// FIXME(nsm): Bug 739173: FormData is not available in workers.\n// typedef (ArrayBuffer or ArrayBufferView or Blob or FormData or USVString or URLSearchParams) BodyInit;\ntypedef (ArrayBuffer or ArrayBufferView or Blob or USVString or URLSearchParams) BodyInit;\n\n[NoInterfaceObject, Exposed=(Window,Worker)]\ninterface Body {\n  readonly attribute boolean bodyUsed;\n  [Throws]\n  Promise<ArrayBuffer> arrayBuffer();\n  [Throws]\n  Promise<Blob> blob();\n  // FIXME(nsm): Bug 739173 FormData is not supported in workers.\n  // Promise<FormData> formData();\n  [Throws]\n  Promise<JSON> json();\n  [Throws]\n  Promise<USVString> text();\n};\n\n[NoInterfaceObject, Exposed=(Window,Worker)]\ninterface GlobalFetch {\n  [Throws, Func=\"mozilla::dom::Headers::PrefEnabled\"]\n  Promise<Response> fetch(RequestInfo input, optional RequestInit init);\n};\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Wolfram Language/mendeley-wolfram.m",
    "content": "clientId = \"...\"\nclientSecret = \"...\"\n\nCreateAuthHeader := \"Basic \" <> ExportString[clientId <> \":\" <> clientSecret, \"Base64\"]\n\nGetTokenJson := URLFetch[\"https://api.mendeley.com/oauth/token\", \n  \"Method\" -> \"POST\", \n  \"Headers\" -> {\"Authorization\" -> CreateAuthHeader },\n  \"BodyData\" -> \"scope=all&grant_type=client_credentials\"\n]\n\nGetAccessToken := \"access_token\" /. ImportString[GetTokenJson, \"JSON\"]\n\nGetDocJson[doi_] := URLFetch[\"https://api.mendeley.com/catalog\",\n  \"Headers\" -> {\"Authorization\" -> \"Bearer \" <> GetAccessToken },\n  \"Parameters\" -> {\"doi\" -> doi, \"view\" -> \"stats\"}\n]\n\nGetDoc[doi_] := First[ImportString[GetDocJson[doi], \"JSON\"]]\n\nGetCounts[doi_] := Association[\"reader_count_by_country\" /. GetDoc[doi]]\n\nGetInterpretedCounts[doi_] := KeyMap[Interpreter[\"Country\"], GetCounts[doi]]\n\nDrawMap[doi_] := GeoRegionValuePlot[GetInterpretedCounts[doi], \"ImageSize\"->Larger]\n\nCloudDeploy[FormFunction[{\"DOI\" -> \"String\"}, DrawMap[#DOI] &, \"PNG\"]]\n"
  },
  {
    "path": "src/test/resources/samples/langs/World of Warcraft Addon Data/addon.toc",
    "content": "## Interface: 60200\n## Title: Vahevian Lotus Vane\n## Notes: \"Critical Threat Range\"\n## Version: 4.2\nVahevia.xml\nLotus_Vane.lua\n"
  },
  {
    "path": "src/test/resources/samples/langs/World of Warcraft Addon Data/lingua.toc",
    "content": "# Internationalisation example\n\n## Title: Test\n## Title-esES: Pruebas\n## Title-huHU: Próba\n## Notes: \"Testing this shit\"\n## Notes-esES: \"Probando la mierda esta\"\n## Notes-huHU: \"Kipróbálom ezt a szart\"\n\nTests.xml\nElk.lua\n"
  },
  {
    "path": "src/test/resources/samples/langs/World of Warcraft Addon Data/linguist.toc",
    "content": "# Addon manifest file\n\n## Interface: 60200\n## Title: Linguist\n## Notes: \"Language savant\"\n## RequiredDeps: charlockHolmes, escapeUtils, mimeTypes, rugged\n## LoadOnDemand: 1\n## Version: 4.9\n\n# This is a comment\n## SavedVariables: foo, bar\n## SavedVariablesPerCharacter: fewburt\n\nLanguages.xml\nHeuristics.xml\nh-counter.lua\nruby-isnt.lua\n\n#\n# It is possible for addons to query values of any tags with a \"X-\" prefix.\n# Some possibilities include:\n#\n## X-Date: \"2016-04-28\"\n## X-Website: \"https://github.com/\"\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/ArraySum.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.io.Console;\n\n/**\n * A simple illustration of loop parallelization within a single place.\n */\npublic class ArraySum {\n\n    var sum:Long;\n    val data:Rail[Long];\n\n    public def this(n:Long) {\n\t// Create a Rail with n elements (0..(n-1)), all initialized to 1.\n        data = new Rail[Long](n, 1);\n        sum = 0;\n    }\n\n    def sum(a:Rail[Long], start:Long, last:Long) {\n        var mySum: Long = 0;\n        for (i in start..(last-1)) { \n        \tmySum += a(i);\n        }\n        return mySum;\n    }\n\n    def sum(numThreads:Long) {\n        val mySize = data.size/numThreads;\n        finish for (p in 0..(numThreads-1)) async {\n            val mySum = sum(data, p*mySize, (p+1)*mySize);\n            // Multiple activities will simultaneously update\n            // this location -- so use an atomic operation.\n            atomic sum += mySum;\n        }\n    }\n    \n    public static def main(args:Rail[String]) {\n        var size:Long = 5*1000*1000;\n        if (args.size >=1)\n            size = Long.parse(args(0));\n\n        Console.OUT.println(\"Initializing.\");\n        val a = new ArraySum(size);\n        val P = [1,2,4];\n\n        //warmup loop\n        Console.OUT.println(\"Warming up.\");\n        for (numThreads in P)\n            a.sum(numThreads);\n        \n        for (numThreads in P) {\n            Console.OUT.println(\"Starting with \" + numThreads + \" threads.\");\n            a.sum=0;\n            var time: long = - System.nanoTime();\n            a.sum(numThreads);\n            time += System.nanoTime();\n            Console.OUT.println(\"For p=\" + numThreads\n                    + \" result: \" + a.sum \n                    + ((size==a.sum)? \" ok\" : \"  bad\") \n                    + \" (time=\" + (time/(1000*1000)) + \" ms)\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/Cancellation.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.xrx.Runtime;\n\n/**\n * Demonstrate how to instantiate the X10 runtime as an executor service\n * submit jobs to the runtime, wait jobs to complete and cancel all jobs\n * \n * Compile with: x10c -O -EXECUTOR_MODE=true Cancellation.x10\n * Run with:     X10_CANCELLABLE=true X10_NPLACES=4 x10 -DX10RT_IMPL=JavaSockets Cancellation\n */\nclass Cancellation {\n    static def job(id:Long, iterations:Long) = ()=>{\n        at (Place.places().next(here)) async {\n            for (i in 1..iterations) {\n                finish for (p in Place.places()) { \n                    at (p) async Console.OUT.println(here+\" says hello (job \" + id + \", iteration \" + i + \")\");\n                }\n                Console.ERR.println();\n                System.sleep(200);\n            }\n        }\n    };\n\n    public static def main(args:Rail[String]):void {\n        val w1 = Runtime.submit(job(1, 5));\n        w1.await(); Console.ERR.println(\"Job 1 completed\\n\");\n        val w2 = Runtime.submit(job(2, 1000));\n        System.threadSleep(1000);\n        val c1 = Runtime.cancelAll();\n        try { w2.await(); } catch (e:Exception) { Console.ERR.println(\"Job 2 aborted with exception \" + e +\"\\n\"); }\n        c1.await(); // waiting for cancellation to be processed\n        System.threadSleep(1000);\n        Runtime.submit(job(3, 1000));\n        Runtime.submit(job(4, 1000));\n        System.threadSleep(1000);\n        val c2 = Runtime.cancelAll();\n        c2.await();\n        Console.ERR.println(\"Goodbye\\n\");\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/Fibonacci.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.io.Console;\n\n/**\n * This is a small program to illustrate the use of \n * <code>async</code> and <code>finish</code> in a \n * prototypical recursive divide-and-conquer algorithm.  \n * It is obviously not intended to show a efficient way to\n * compute Fibonacci numbers in X10.<p>\n *\n * The heart of the example is the <code>run</code> method,\n * which directly embodies the recursive definition of \n * <pre>\n *   fib(n) = fib(n-1)+fib(n-2);\n * </pre>\n * by using an <code>async</code> to compute <code>fib(n-1)</code> while\n * the current activity computes <code>fib(n-2)</code>.  A <code>finish</code>\n * is used to ensure that both computations are complete before \n * their results are added together to compute <code>fib(n)</code>\n */\npublic class Fibonacci {\n\n  public static def fib(n:long) {\n    if (n<=2) return 1;\n    \n    val f1:long;\n    val f2:long;\n    finish {\n      async { f1 = fib(n-1); }\n      f2 = fib(n-2);\n    }\n    return f1 + f2;\n  }\n\n  public static def main(args:Rail[String]) {\n    val n = (args.size > 0) ? Long.parse(args(0)) : 10;\n    Console.OUT.println(\"Computing fib(\"+n+\")\");\n    val f = fib(n);\n    Console.OUT.println(\"fib(\"+n+\") = \"+f);\n  }\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/HeatTransfer_v0.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.array.*;\nimport x10.compiler.Foreach;\nimport x10.compiler.Inline;\n\n\n/**\n * This is a sample program illustrating how to use\n * X10's array classes.  It also illustrates the use\n * of foreach to acheive intra-place parallelism.\n *\n * The program solves a set of 2D partial differential\n * equations by iteratively applying a 5-point stencil\n * operation until convergence is reached.\n */\npublic class HeatTransfer_v0 {\n    static val EPSILON = 1.0e-5;\n\n    val N:Long;\n    val A:Array_2[Double]{self!=null};\n    val Tmp:Array_2[Double]{self!=null};\n\n    public def this(size:Long) {\n        N = size;\n        A = new Array_2[Double](N+2, N+2);  // zero-initialized N+2 * N+2 array of doubles\n        for (j in 1..N) A(0, j) = 1;     // set one border row to 1 \n        Tmp = new Array_2[Double](A);\n    }\n\n    final @Inline def stencil(x:Long, y:Long):Double {\n        return (A(x-1,y) + A(x+1,y) + A(x,y-1) + A(x,y+1)) / 4;\n    }\n\n    def run() {\n        val is = new DenseIterationSpace_2(1,1,N,N);\n        var delta:Double;\n        do {\n            // Compute new values, storing in tmp\n            delta = Foreach.blockReduce(is,\n                (i:Long, j:Long)=>{\n                    Tmp(i,j) = stencil(i,j);\n                    // Reduce max element-wise delta (A now holds previous values)\n                    return Math.abs(Tmp(i,j) - A(i,j));\n                },\n                (a:Double, b:Double)=>Math.max(a,b), 0.0\n            );\n\n            // swap backing data of A and Tmp\n            Array.swap(A, Tmp);\n        } while (delta > EPSILON);\n    }\n\n    def prettyPrintResult() {\n       for (i in 1..N) {\n           for (j in 1..N) {\n                Console.OUT.printf(\"%1.4f \",A(i,j));\n            }\n            Console.OUT.println();\n        }\n    }\n\n    public static def main(args:Rail[String]) {\n        val n = args.size > 0 ? Long.parse(args(0)) : 8;\n        Console.OUT.println(\"HeatTransfer example with N=\"+n+\" and epsilon=\"+EPSILON);\n        Console.OUT.println(\"Initializing data structures\");\n        val ht = new HeatTransfer_v0(n);\n        Console.OUT.println(\"Beginning computation...\");\n        val start = System.nanoTime();\n        ht.run();\n        val stop = System.nanoTime();\n        Console.OUT.printf(\"...completed in %1.3f seconds.\\n\", ((stop-start) as double)/1e9);\n        if (n <= 10) {\n            ht.prettyPrintResult();\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/HeatTransfer_v1.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.array.*;\nimport x10.compiler.Foreach;\nimport x10.util.Team;\n\n/**\n * This is a sample program illustrating how to use\n * X10's distributed array classes.  It also illustrates the use\n * of foreach to achieve intra-place parallelism and the mixture\n * of APGAS finish/async/at with Team collective operations.\n *\n * This version of the program uses a vanilla DistArray without\n * ghost regions.  As a result, the stencil function does\n * inefficient fine-grained neighbor communication to get individual values.\n * Compare this to HeatTransfer_v2 which utilizes ghost regions and\n * bulk ghost-region exchange functions.\n * \n * The program solves a set of 2D partial differential\n * equations by iteratively applying a 5-point stencil\n * operation until convergence is reached.\n */\npublic class HeatTransfer_v1 {\n    static val EPSILON = 1.0e-5;\n\n    val N:Long;\n    val A:DistArray_BlockBlock_2[Double]{self!=null};\n    val Tmp:DistArray_BlockBlock_2[Double]{self!=null};\n\n    public def this(size:Long) {\n        N = size;\n        val init = (i:Long, j:Long)=>i==0 ? 1.0 : 0.0;\n        A = new DistArray_BlockBlock_2[Double](N+2, N+2, init);\n        Tmp = new DistArray_BlockBlock_2[Double](N+2, N+2, init);\n    }\n\n    final def stencil(x:Long, y:Long):Double {\n        val cls = (dx:Long, dy:Long)=>{\n            val p = A.place(x+dx, y+dy);\n            p == here ? A(x+dx,y+dy) : at (p) A(x+dx,y+dy)\n        };\n        val tmp = cls(-1,0) + cls(1,0) + cls(0,-1) + cls(0,1);\n        return tmp / 4; \n    }\n\n    def run() {\n        val myTeam = new Team(A.placeGroup());\n        finish for (p in A.placeGroup()) at (p) async {\n            // Compute the subset of the local indices on which\n            // we want to apply the stencil (the interior points of the N+2 x N+2 grid)\n            val li = A.localIndices();\n            val interior = new DenseIterationSpace_2(li.min(0) == 0 ? 1 : li.min(0),\n                                                     li.min(1) == 0 ? 1 : li.min(1),\n                                                     li.max(0) == N+1 ? N : li.max(0),\n                                                     li.max(1) == N+1 ? N : li.max(1));\n            var delta:Double;\n            do {\n                // Compute new values, storing in tmp\n                val myDelta = Foreach.blockReduce(interior,\n                    (i:Long, j:Long)=>{\n                        Tmp(i,j) = stencil(i,j);\n                        // Reduce max element-wise delta (A now holds previous values)\n                        return Math.abs(Tmp(i,j) - A(i,j));\n                    },\n                    (a:Double, b:Double)=>Math.max(a,b), 0.0\n                );\n\n                myTeam.barrier();\n\n                // Unlike Array, DistArray doesn't provide an optimized swap.\n                // So, until it does, we have to copy the data elements.\n                Foreach.block(interior, (i:Long, j:Long)=>{\n                    A(i,j) = Tmp(i,j);\n                });\n\n                delta = myTeam.allreduce(myDelta, Team.MAX);\n            } while (delta > EPSILON);\n        }\n    }\n \n   def prettyPrintResult() {\n       for (i in 1..N) {\n           for (j in 1..N) {\n                val x = at (A.place(i,j)) A(i,j);\n                Console.OUT.printf(\"%1.4f \", x);\n            }\n            Console.OUT.println();\n        }\n    }\n\n    public static def main(args:Rail[String]) {\n        val n = args.size > 0 ? Long.parse(args(0)) : 8;\n        Console.OUT.println(\"HeatTransfer example with N=\"+n+\" and epsilon=\"+EPSILON);\n        Console.OUT.println(\"Initializing data structures\");\n        val ht = new HeatTransfer_v1(n);\n        Console.OUT.println(\"Beginning computation...\");\n        val start = System.nanoTime();\n        ht.run();\n        val stop = System.nanoTime();\n        Console.OUT.printf(\"...completed in %1.3f seconds.\\n\", ((stop-start) as double)/1e9);\n        if (n <= 10) {\n            ht.prettyPrintResult();\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/HelloWholeWorld.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.io.Console;\n\n/**\n * The classic hello world program, with a twist - prints a message\n * from the command line at every Place. \n * The messages from each Place may appear in any order, but the\n * finish ensures that the last message printed will be \"Goodbye\"\n * <pre>\n * Typical output:\n * [dgrove@linchen samples]$ ./HelloWholeWorld 'best wishes'\n * Place(1) says hello and best wishes\n * Place(2) says hello and best wishes\n * Place(3) says hello and best wishes\n * Place(0) says hello and best wishes\n * Goodbye \n * [dgrove@linchen samples]$\n * </pre>\n */\nclass HelloWholeWorld {\n  public static def main(args:Rail[String]):void {\n     if (args.size < 1) {\n         Console.OUT.println(\"Usage: HelloWholeWorld message\");\n         return;\n     }\n    \n     finish for (p in Place.places()) {\n     \tat (p) async Console.OUT.println(here+\" says hello and \"+args(0));\n     }\n     Console.OUT.println(\"Goodbye\");\n  }\n}\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/HelloWorld.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.io.Console;\n\n/**\n * The classic hello world program, shows how to output to the console.\n */\nclass HelloWorld {\n  public static def main(Rail[String]) {\n      Console.OUT.println(\"Hello World!\" );\n  }\n}\n\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/Histogram.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\npublic class Histogram {\n    public static def compute(data:Rail[Int], numBins:Int) {\n        val bins = new Rail[Int](numBins);\n        finish for (i in data.range) async {\n           val b = data(i) % numBins;\n           atomic bins(b)++;\n        }\n        return bins;\n    }\n\n    public static def run(N:Int, S:Int):Boolean {\n        val a = new Rail[Int](N, (i:long)=> i as int);\n        val b = compute(a, S);\n        val v = b(0);\n        var ok:Boolean = true;\n        for (x in b.range) ok &= (b(x)==v);\n        return ok;\n    }\n\n    public static def main(args:Rail[String]) {\n        if (args.size != 2L) {\n            Console.OUT.println(\"Usage: Histogram SizeOfArray NumberOfBins\");\n            return;\n        }\n        val N = Int.parse(args(0));\n        val S = Int.parse(args(1));\n        val ok = run(N,S);\n        if (ok) {\n            Console.OUT.println(\"Test ok.\");\n        } else {\n            Console.OUT.println(\"Test failed.\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/Integrate.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\n/**\n * This is a slightly more realistic example of the\n * basic computational pattern of using async/finish\n * to express recursive divide-and-conquer algorithms.\n * The program does integration via Guassian Quadrature.\n * <p>\n * It also can serve as an example of using a closure.\n */\npublic class Integrate { \n  static val epsilon = 1.0e-9;\n\n  val fun:(double)=>double;\n\n  public def this(f:(double)=>double) { fun = f; }\n\n  public def computeArea(left:double, right:double) {\n    return recEval(left, fun(left), right, fun(right), 0);\n  }\n\n  private def recEval(l:double, fl:double, r:double, fr:double, a:double) {\n    val h = (r - l) / 2;\n    val hh = h / 2;\n    val c = l + h;\n    val fc = fun(c);\n    val al = (fl + fc) * hh;   \n    val ar = (fr + fc) * hh;\n    val alr = al + ar;\n    if (Math.abs(alr - a) < epsilon) return alr;\n    val expr1:double;\n    val expr2:double;\n    finish {\n      async { expr1 = recEval(c, fc, r, fr, ar); };\n      expr2 = recEval(l, fl, c, fc, al);\n    }\n    return expr1 + expr2;\n  }\n \n  public static def main(args:Rail[String]) {\n    val obj = new Integrate((x:double)=>(x*x + 1.0) * x);\n    val xMax = args.size > 0 ? Long.parse(args(0)) : 10;\n    val area = obj.computeArea(0, xMax);\n    Console.OUT.println(\"The area of (x*x +1) * x from 0 to \"+xMax+\" is \"+area);\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/KMeans.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.io.Console;\nimport x10.util.Random;\n\n/**\n * A KMeans object o can compute K means of a given set of \n * points of dimension o.myDim.\n * <p> \n * This class implements a sequential program, that is readily parallelizable.\n *\n * For a scalable, high-performance version of this benchmark see\n * KMeans.x10 in the X10 Benchmarks (separate download from x10-lang.org)\n */\npublic class KMeans(myDim:Long) {\n\n    static val DIM=2;\n    static val K=4;\n    static val POINTS=2000;\n    static val ITERATIONS=50;\n    static val EPS=0.01F;\n    \n    static type ValVector(k:Long) = Rail[Float]{self.size==k};\n    static type ValVector = ValVector(DIM);\n    \n    static type Vector(k:Long) = Rail[Float]{self.size==k};\n    static type Vector = Vector(DIM);\n    \n    static type SumVector(d:Long) = V{self.dim==d};\n    static type SumVector = SumVector(DIM);\n\n    /**\n     * V represents the sum of 'count' number of vectors of dimension 'dim'.\n     */\n    static class V(dim:Long) implements (Long)=>Float {\n        var vec: Vector(dim);\n        var count:Int;\n        def this(dim:Long, init:(Long)=>Float): SumVector(dim) {\n           property(dim);\n           vec = new Rail[Float](this.dim, init);\n           count = 0n;\n        }\n        public operator this(i:Long) = vec(i);\n        def makeZero() {\n            for (i in 0..(dim-1))\n                vec(i) =0.0F;\n            count=0n;\n        }\n        def addIn(a:ValVector(dim)) {\n            for (i in 0..(dim-1))\n                vec(i) += a(i);\n            count++;\n        }\n        def div(f:Int) {\n            for (i in 0..(dim-1))\n                vec(i) /= f;\n        }\n        def dist(a:ValVector(dim)):Float {\n            var dist:Float=0.0F;\n            for (i in 0..(dim-1)) {\n                val tmp = vec(i)-a(i);\n                dist += tmp*tmp;\n            }\n            return dist;\n        }\n        def dist(a:SumVector(dim)):Float {\n            var dist:Float=0.0F;\n            for (i in 0..(dim-1)) {\n                val tmp = vec(i)-a(i);\n                dist += tmp*tmp;\n            }\n            return dist;\n        }\n        def print() {\n            Console.OUT.println();\n            for (i in 0..(dim-1)) {\n                Console.OUT.print((i>0? \" \" : \"\") + vec(i));\n            }\n        }\n        def normalize() { div(count);}\n        def count() = count;\n    }\n    \n    \n    def this(myDim:Long):KMeans{self.myDim==myDim} {\n        property(myDim);\n    }\n    static type KMeansData(myK:Long, myDim:Long)= Rail[SumVector(myDim)]{self.size==myK};\n\n    /**\n     * Compute myK means for the given set of points of dimension myDim.\n     */\n    def computeMeans(myK:Long, points:Rail[ValVector(myDim)]):KMeansData(myK, myDim) {\n        var redCluster : KMeansData(myK, myDim) =\n            new Rail[SumVector(myDim)](myK, (i:long)=> new V(myDim, (j:long)=>points(i)(j)));\n        var blackCluster: KMeansData(myK, myDim) =\n            new Rail[SumVector(myDim)](myK, (i:long)=> new V(myDim, (j:long)=>0.0F));\n        for (i in 1..ITERATIONS) {\n            val tmp = redCluster;\n            redCluster = blackCluster;\n            blackCluster=tmp;\n            for (p in 0..(POINTS-1)) { \n                var closest:Long = -1;\n                var closestDist:Float = Float.MAX_VALUE;\n                val point = points(p);\n                for (k in 0..(myK-1)) { // compute closest mean in cluster.\n                    val dist = blackCluster(k).dist(point);\n                    if (dist < closestDist) {\n                        closestDist = dist;\n                        closest = k;\n                    }\n                }\n                redCluster(closest).addIn(point);\n            }\n            for (k in 0..(myK-1))\n                redCluster(k).normalize(); \n            \n            var b:Boolean = true;\n                for (k in 0..(myK-1)) {\n                    if (redCluster(k).dist(blackCluster(k)) > EPS) {\n                        b=false;\n                        break;\n                    }\n                }\n            if (b) \n                break;\n            for (k in 0..(myK-1))\n                blackCluster(k).makeZero(); \n        }\n        return redCluster;  \n    }\n  \n    public static def main (Rail[String]) {\n        val rnd = new Random(0);\n        val points = new Rail[ValVector](POINTS, \n                        (long)=>new Rail[Float](DIM, (long)=>rnd.nextFloat()));\n        val result = new KMeans(DIM).computeMeans(K, points);\n        for (k in 0..(K-1)) result(k).print();\n    }\n}\n\n// vim: shiftwidth=4:tabstop=4:expandtab\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/KMeansDist.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.array.*;\nimport x10.io.Console;\nimport x10.util.Random;\n\n/**\n * A low performance formulation of distributed KMeans using fine-grained asyncs.\n *\n * For a highly optimized and scalable, version of this benchmark see\n * KMeans.x10 in the X10 Benchmarks (separate download from x10-lang.org)\n */\npublic class KMeansDist {\n\n    static val DIM=2;\n    static val CLUSTERS=4;\n    static val POINTS=2000;\n    static val ITERATIONS=50;\n\n    public static def main (Rail[String]) {\n        val world = Place.places();\n        val local_curr_clusters = \n            PlaceLocalHandle.make[Array_2[Float]](world, () => new Array_2[Float](CLUSTERS, DIM));\n        val local_new_clusters = \n            PlaceLocalHandle.make[Array_2[Float]](world, () =>  new Array_2[Float](CLUSTERS, DIM));\n        val local_cluster_counts = \n            PlaceLocalHandle.make[Rail[Int]](world, ()=> new Rail[Int](CLUSTERS));\n\n        val rnd = PlaceLocalHandle.make[Random](world, () => new Random(0));\n        val points = new DistArray_Block_2[Float](POINTS, DIM, world, (Long,Long)=>rnd().nextFloat());\n\n        val central_clusters = new Array_2[Float](CLUSTERS, DIM, (i:Long, j:Long) => {\n            at (points.place(i,j)) points(i,j)\n        });\n\n\tval old_central_clusters = new Array_2[Float](CLUSTERS, DIM);\n\n        val central_cluster_counts = new Rail[Int](CLUSTERS);\n\n        for (iter in 1..ITERATIONS) {\n\n            Console.OUT.println(\"Iteration: \"+iter);\n\n            finish {\n                // reset state\n                for (d in world) at (d) async {\n                    for ([i,j] in central_clusters.indices()) {\n                        local_curr_clusters()(i, j) = central_clusters(i, j);\n                        local_new_clusters()(i, j) = 0f;\n                    }\n            \n                    local_cluster_counts().clear();\n                }\n            }\n\n            finish {\n                // compute new clusters and counters\n                for (p in 0..(POINTS-1)) {\n                    at (points.place(p,0)) async {\n                        var closest:Long = -1;\n                        var closest_dist:Float = Float.MAX_VALUE;\n                        for (k in 0..(CLUSTERS-1)) { \n                            var dist : Float = 0;\n                            for (d in 0..(DIM-1)) { \n                                val tmp = points(p,d) - local_curr_clusters()(k, d);\n                                dist += tmp * tmp;\n                            }\n                            if (dist < closest_dist) {\n                                closest_dist = dist;\n                                closest = k;\n                            }\n                        }\n\t\t\tatomic {\n                            for (d in 0..(DIM-1)) { \n                                local_new_clusters()(closest,d) += points(p,d);\n                            }\n                            local_cluster_counts()(closest)++;\n                        }\n                    }\n                }\n            }\n\n            for ([i,j] in old_central_clusters.indices()) {\n                old_central_clusters(i, j) = central_clusters(i, j);\n                central_clusters(i, j) = 0f;\n            }\n           \n            central_cluster_counts.clear();\n\n            finish {\n                val central_clusters_gr = GlobalRef(central_clusters);\n                val central_cluster_counts_gr = GlobalRef(central_cluster_counts);\n                val there = here;\n                for (d in world) at (d) async {\n                    // access PlaceLocalHandles 'here' and then data will be captured by at and transfered to 'there' for accumulation\n                    val tmp_new_clusters = local_new_clusters();\n                    val tmp_cluster_counts = local_cluster_counts();\n                    at (there) atomic {\n                        for ([i,j] in tmp_new_clusters.indices()) {\n                            central_clusters_gr()(i,j) += tmp_new_clusters(i,j);\n                        }\n                        for (j in 0..(CLUSTERS-1)) {\n                            central_cluster_counts_gr()(j) += tmp_cluster_counts(j);\n                        }\n                    }\n                }\n            }\n\n            for (k in 0..(CLUSTERS-1)) { \n                for (d in 0..(DIM-1)) { \n                    central_clusters(k, d) /= central_cluster_counts(k);\n                }\n            }\n\n            // TEST FOR CONVERGENCE\n            var b:Boolean = true;\n            for ([i,j] in old_central_clusters.indices()) { \n                if (Math.abs(old_central_clusters(i, j)-central_clusters(i, j))>0.0001) {\n                    b = false;\n                    break;\n                }\n            }\n            if (b) break;\n\n        }\n\n        for (d in 0..(DIM-1)) { \n            for (k in 0..(CLUSTERS-1)) { \n                if (k>0)\n                    Console.OUT.print(\" \");\n                Console.OUT.print(central_clusters(k,d));\n            }\n            Console.OUT.println();\n        }\n    }\n}\n\n// vim: shiftwidth=4:tabstop=4:expandtab\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/KMeansDistPlh.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2015.\n */\n\nimport x10.array.Array;\nimport x10.array.Array_2;\nimport x10.compiler.Foreach;\nimport x10.util.Random;\n\n/**\n * A better formulation of distributed KMeans using coarse-grained asyncs to\n * implement an allreduce pattern for cluster centers and counts.\n *\n * For a highly optimized and scalable, version of this benchmark see\n * KMeans.x10 in the X10 Benchmarks (separate download from x10-lang.org)\n */\npublic class KMeansDistPlh {\n\n    static val DIM=2;\n    static val CLUSTERS=4;\n\n    static class ClusterState {\n        val clusters = new Array_2[Float](CLUSTERS, DIM);\n        val clusterCounts = new Rail[Int](CLUSTERS);\n    }\n\n    public static def main(args:Rail[String]) {\n        val numPoints = args.size > 0 ? Long.parse(args(0)) : 2000;\n        val iterations = args.size > 1 ? Long.parse(args(1)) : 50;\n        val world = Place.places();\n\n        val clusterStatePlh = PlaceLocalHandle.make[ClusterState](world, () => new ClusterState());\n        val currentClustersPlh = PlaceLocalHandle.make[Array_2[Float]](world, () => new Array_2[Float](CLUSTERS, DIM));\n        val pointsPlh = PlaceLocalHandle.make[Array_2[Float]](world, () => {\n            val rand = new Random(here.id);\n            return new Array_2[Float](numPoints/world.size(), DIM, (Long,Long)=>rand.nextFloat());\n        });\n\n        val centralCurrentClusters = new Array_2[Float](CLUSTERS, DIM);\n        val centralNewClusters = new Array_2[Float](CLUSTERS, DIM);\n        val centralClusterCounts = new Rail[Int](CLUSTERS);\n\n        // arbitrarily initialize central clusters to first few points\n        for ([i,j] in centralCurrentClusters.indices()) {\n            centralCurrentClusters(i,j) = pointsPlh()(i,j);\n        }\n\n        for (iter in 1..iterations) {\n            Console.OUT.println(\"Iteration: \"+iter);\n\n            finish {\n                for (place in world) async {\n                    val placeClusters = at(place) {\n                        val currentClusters = currentClustersPlh();\n                        Array.copy(centralCurrentClusters, currentClusters);\n\n                        val clusterState = clusterStatePlh();\n                        val newClusters = clusterState.clusters;\n                        newClusters.clear();\n                        val clusterCounts = clusterState.clusterCounts;\n                        clusterCounts.clear();\n\n                        // compute new clusters and counters\n                        val points = pointsPlh();\n\n                        for (p in 0..(points.numElems_1-1)) {\n                            var closest:Long = -1;\n                            var closestDist:Float = Float.MAX_VALUE;\n                            for (k in 0..(CLUSTERS-1)) { \n                                var dist : Float = 0;\n                                for (d in 0..(DIM-1)) { \n                                    val tmp = points(p,d) - currentClusters(k, d);\n                                    dist += tmp * tmp;\n                                }\n                                if (dist < closestDist) {\n                                    closestDist = dist;\n                                    closest = k;\n                                }\n                            }\n\n                            atomic {\n                                for (d in 0..(DIM-1)) { \n                                    newClusters(closest,d) += points(p,d);\n                                }\n                                clusterCounts(closest)++;\n                            }\n                        }\n                        clusterState\n                    };\n\n                    // combine place clusters to central\n                    atomic {\n                        for ([i,j] in centralNewClusters.indices()) {\n                            centralNewClusters(i,j) += placeClusters.clusters(i,j);\n                        }\n                        for (j in 0..(CLUSTERS-1)) {\n                            centralClusterCounts(j) += placeClusters.clusterCounts(j);\n                        }\n                    }\n                }\n            }\n\n            for (k in 0..(CLUSTERS-1)) { \n                for (d in 0..(DIM-1)) { \n                    centralNewClusters(k, d) /= centralClusterCounts(k);\n                }\n            }\n\n            // TEST FOR CONVERGENCE\n            var b:Boolean = true;\n            for ([i,j] in centralCurrentClusters.indices()) { \n                if (Math.abs(centralCurrentClusters(i, j)-centralNewClusters(i, j)) > 0.0001) {\n                    b = false;\n                    break;\n                }\n            }\n\n            Array.copy(centralNewClusters, centralCurrentClusters);\n\n            if (b) break;\n\n            centralNewClusters.clear();\n            centralClusterCounts.clear();\n        }\n\n        for (d in 0..(DIM-1)) { \n            for (k in 0..(CLUSTERS-1)) { \n                if (k > 0)\n                    Console.OUT.print(\" \");\n                Console.OUT.print(centralCurrentClusters(k,d));\n            }\n            Console.OUT.println();\n        }\n    }\n}\n\n// vim: shiftwidth=4:tabstop=4:expandtab\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/KMeansSPMD.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.io.Console;\nimport x10.io.File;\nimport x10.io.Marshal;\nimport x10.io.IOException;\nimport x10.util.OptionsParser;\nimport x10.util.Option;\nimport x10.util.Team;\n\n/**\n * An SPMD formulation of KMeans.\n *\n * For a highly optimized and scalable version of this benchmark see\n * KMeans.x10 in the X10 Benchmarks (separate download from x10-lang.org)\n */\npublic class KMeansSPMD {\n\n    public static def printClusters (clusters:Rail[Float], dims:long) {\n        for (d in 0..(dims-1)) { \n            for (k in 0..(clusters.size/dims-1)) { \n                if (k>0)\n                    Console.OUT.print(\" \");\n                Console.OUT.print(clusters(k*dims+d).toString());\n            }\n            Console.OUT.println();\n        }\n    }\n\n    public static def main (args:Rail[String]) {here == Place.FIRST_PLACE } {\n\n        val opts = new OptionsParser(args, [\n            Option(\"q\",\"quiet\",\"just print time taken\"),\n            Option(\"v\",\"verbose\",\"print out each iteration\"),\n            Option(\"h\",\"help\",\"this information\")\n        ], [\n            Option(\"p\",\"points\",\"location of data file\"),\n            Option(\"i\",\"iterations\",\"quit after this many iterations\"),\n            Option(\"c\",\"clusters\",\"number of clusters to find\"),\n            Option(\"d\",\"dim\",\"number of dimensions\"),\n            Option(\"s\",\"slices\",\"factor by which to oversubscribe computational resources\"),\n            Option(\"n\",\"num\",\"quantity of points\")\n        ]);\n        if (opts.filteredArgs().size!=0L) {\n            Console.ERR.println(\"Unexpected arguments: \"+opts.filteredArgs());\n            Console.ERR.println(\"Use -h or --help.\");\n            System.setExitCode(1n);\n            return;\n        }\n        if (opts(\"-h\")) {\n            Console.OUT.println(opts.usage(\"\"));\n            return;\n        }\n\n        val fname = opts(\"-p\", \"points.dat\");\n        val num_clusters=opts(\"-c\",4);\n        val num_slices=opts(\"-s\",1);\n        val num_global_points=opts(\"-n\", 2000);\n        val iterations=opts(\"-i\",50);\n        val dim=opts(\"-d\", 4);\n        val verbose = opts(\"-v\");\n        val quiet = opts(\"-q\");\n\n        if (!quiet)\n            Console.OUT.println(\"points: \"+num_global_points+\" clusters: \"+num_clusters+\" dim: \"+dim);\n\n        // file is dimension-major\n        val file = new File(fname);\n        val fr = file.openRead();\n        val init_points = (long) => Float.fromIntBits(Marshal.INT.read(fr).reverseBytes());\n        val num_file_points = (file.size() / dim / 4) as Int;\n        val file_points = new Rail[Float](num_file_points*dim, init_points);\n\n        val team = Team.WORLD;\n\n        val num_slice_points = num_global_points / num_slices / Place.numPlaces();\n\n        finish {\n            for (h in Place.places()) at(h) async {\n                var compute_time:Long = 0;\n                var comm_time:Long = 0;\n                var barrier_time:Long = 0;\n\n                val host_clusters  = new Rail[Float](num_clusters*dim, (i:long)=>file_points(i));\n                val host_cluster_counts = new Rail[Int](num_clusters);\n\n                for (slice in 0..(num_slices-1)) {\n                    // carve out local portion of points (point-major)\n                    val offset = (slice*Place.numPlaces() + here.id) * num_slice_points;\n                    if (verbose)\n                        Console.OUT.println(h.toString()+\" gets \"+offset+\" len \"+num_slice_points);\n                    val init = (i:long) => {\n                        val p=i%num_slice_points;\n                        val d=i/num_slice_points;\n                        return file_points(offset+p+d*num_file_points);\n                    };\n\n                    // these are pretty big so allocate up front\n                    val host_points = new Rail[Float](num_slice_points*dim, init);\n                    val host_nearest = new Rail[Float](num_slice_points);\n\n                    val start_time = System.currentTimeMillis();\n\n                    barrier_time -= System.nanoTime();\n                    team.barrier();\n                    barrier_time += System.nanoTime();\n\n                    main_loop: for (iter in 0..(iterations-1)) {\n\n                        //if (offset==0) Console.OUT.println(\"Iteration: \"+iter);\n\n                        val old_clusters = new Rail[Float](host_clusters.size);\n                        Rail.copy(host_clusters, 0L, old_clusters, 0L, host_clusters.size);\n\n                        host_clusters.clear();\n                        host_cluster_counts.clear();\n\n                        compute_time -= System.nanoTime();\n                        for (p in 0..(num_slice_points-1)) {\n                            var closest:Long = -1;\n                            var closest_dist:Float = Float.MAX_VALUE;\n                            for (k in 0..(num_clusters-1)) { \n                                var dist : Float = 0;\n                                for (d in 0..(dim-1)) { \n                                    val tmp = host_points(p+d*num_slice_points) - old_clusters(k*dim+d);\n                                    dist += tmp * tmp;\n                                }\n                                if (dist < closest_dist) {\n                                    closest_dist = dist;\n                                    closest = k;\n                                }\n                            }\n                            for (d in 0..(dim-1)) { \n                                host_clusters(closest*dim+d) += host_points(p+d*num_slice_points);\n                            }\n                            host_cluster_counts(closest)++;\n                        }\n                        compute_time += System.nanoTime();\n\n                        comm_time -= System.nanoTime();\n                        team.allreduce(host_clusters, 0L, host_clusters, 0L, host_clusters.size, Team.ADD);\n                        team.allreduce(host_cluster_counts, 0L, host_cluster_counts, 0L, host_cluster_counts.size, Team.ADD);\n                        comm_time += System.nanoTime();\n\n                        for (k in 0..(num_clusters-1)) {\n                            for (d in 0..(dim-1)) host_clusters(k*dim+d) /= host_cluster_counts(k);\n                        }\n\n                        if (offset==0 && verbose) {\n                            Console.OUT.println(\"Iteration: \"+iter);\n                            printClusters(host_clusters,dim);\n                        }\n\n                        // TEST FOR CONVERGENCE\n                        for (j in 0..(num_clusters*dim-1)) {\n                            if (true/*||Math.abs(clusters_old(j)-host_clusters(j))>0.0001*/) continue main_loop;\n                        }\n\n                        break;\n\n                    } // main_loop\n\n                } // slice\n\n                Console.OUT.printf(\"%d: computation %.3f s communication %.3f s (barrier %.3f s)\\n\", \n                    here.id, compute_time/1E9, comm_time/1E9, barrier_time/1E9);\n\n                team.barrier();\n\n                if (here.id == 0) {\n                    Console.OUT.println(\"\\nFinal results:\");\n                    printClusters(host_clusters,dim);\n                }\n\n            } // async\n\n        } // finish\n\n    }\n\n}\n\n// vim: shiftwidth=4:tabstop=4:expandtab\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/MontyPi.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.array.DistArray_Unique;\nimport x10.io.Console;\nimport x10.util.Random;\n\n/**\n * Calculation of an approximation to pi by using a Monte Carlo simulation\n * (throwing darts into the unit square and determining the fraction that land\n * in the unit circle).\n */\npublic class MontyPi {\n    public static def main(args:Rail[String]) {\n        if (args.size != 1L) {\n            Console.OUT.println(\"Usage: MontyPi <number of points>\");\n            return;\n        }\n        val N = Long.parse(args(0));\n        val initializer = () => {\n            val r = new Random();\n            var result:Long = 0;\n            for(c in 1..N) {\n                val x = r.nextDouble();\n                val y = r.nextDouble();\n                if (x*x +y*y <= 1.0) result++;\n            }\n            result\n        };\n        val result = new DistArray_Unique[Long](Place.places(), initializer);\n        val pi = (4.0*result.reduce((x:Long,y:Long) => x+y, 0) as Double)/(N*Place.numPlaces());\n        Console.OUT.println(\"The value of pi is \" + pi);\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/NQueensDist.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n *  (C) Copyright Australian National University 2011.\n */\n\nimport x10.array.DistArray_Unique;\n\n/**\n * A distributed version of NQueens. Runs over NUM_PLACES.\n * Identical to NQueensPar, except that work is distributed \n * over multiple places rather than shared between threads.\n */\npublic class NQueensDist {\n    public static val EXPECTED_SOLUTIONS =\n        [0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596, 2279184, 14772512];\n\n    val N:Long;\n    val P:Long;\n    val results:DistArray_Unique[Long];\n    val R:LongRange;\n\n    def this(N:Long, P:Long) { \n        this.N=N;\n        this.P=P;\n        this.results = new DistArray_Unique[Long]();\n        this.R = 0..(N-1);\n    }\n    def start() {\n        new Board().distSearch();\n    }\n    def run():Long {\n       finish start();\n       val result = results.reduce(((x:Long,y:Long) => x+y),0);\n       return result;\n    }\n\n    class Board {\n        val q: Rail[Long];\n        /** The number of low-rank positions that are fixed in this board for the purposes of search. */\n        var fixed:Long;\n        def this() {\n            q = new Rail[Long](N);\n            fixed = 0;\n        }\n\n        /** \n         * @return true if it is safe to put a queen in file <code>j</code>\n         * on the next rank after the last fixed position.\n         */\n        def safe(j:Long) {\n            for (k in 0..(fixed-1)) {\n                if (j == q(k) || Math.abs(fixed-k) == Math.abs(j-q(k)))\n                    return false;\n            }\n            return true;\n        }\n\n        /** Search all positions for the current board. */\n        def search() {\n            for (k in R) searchOne(k);\n        }\n\n        /**\n         * Modify the current board by adding a new queen\n         * in file <code>k</code> on rank <code>fixed</code>,\n         * and search for all safe positions with this prefix.\n         */\n        def searchOne(k:Long) {\n            if (safe(k)) {\n                if (fixed==(N-1)) {\n                    // all ranks safely filled\n                    atomic NQueensDist.this.results(here.id)++;\n                } else {\n                    q(fixed++) = k;\n                    search();\n                    fixed--;\n                }\n            }\n        }\n\n        /**\n         * Search this board, dividing the work between all places\n         * using a block distribution of the current free rank.\n         */\n        def distSearch()  {\n            val work = R.split(Place.numPlaces());\n            finish for (p in Place.places()) {\n                val myPiece = work(p.id);\n                at (p) async {\n                    // implicit copy of 'this' made across the at divide\n                    for (k in myPiece) {\n                        searchOne(k);\n                    }\n                }\n            }\n        }\n    }\n\n    public static def main(args:Rail[String])  {\n        val n = args.size > 0 ? Long.parse(args(0)) : 8;\n        Console.OUT.println(\"N=\" + n);\n        //warmup\n        //finish new NQueensPar(12, 1).start();\n        val P = Place.numPlaces();\n        val nq = new NQueensDist(n,P);\n        var start:Long = -System.nanoTime();\n        val answer = nq.run();\n        val result = answer==EXPECTED_SOLUTIONS(n);\n        start += System.nanoTime();\n        start /= 1000000;\n        Console.OUT.println(\"NQueensDist \" + nq.N + \"(P=\" + P +\n                            \") has \" + answer + \" solutions\" +\n                            (result? \" (ok).\" : \" (wrong).\") + \n                            \"time=\" + start + \"ms\");\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/NQueensPar.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n *  (C) Copyright Australian National University 2011.\n */\n\n/**\n * Compute the number of solutions to the N queens problem.\n */\npublic class NQueensPar {\n    public static val EXPECTED_SOLUTIONS =\n        [0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596, 2279184, 14772512];\n\n    val N:Int;\n    val P:Int;\n    var nSolutions:Int = 0n;\n    val R:IntRange;\n\n    def this(N:Int, P:Int) { \n       this.N=N;\n       this.P=P;\n       this.R = 0n..(N-1n);\n    }\n\n    def start() {\n        new Board().parSearch();\n    }\n\n    class Board {\n        val q: Rail[Int];\n        /** The number of low-rank positions that are fixed in this board for the purposes of search. */\n        var fixed:Int;\n        def this() {\n            q = new Rail[Int](N);\n            fixed = 0n;\n        }\n\n        def this(b:Board) {\n            this.q = new Rail[Int](b.q);\n            this.fixed = b.fixed;\n        }\n\n        /** \n         * @return true if it is safe to put a queen in file <code>j</code>\n         * on the next rank after the last fixed position.\n         */\n        def safe(j:Int) {\n            for (k in 0n..(fixed-1n)) {\n                if (j == q(k) || Math.abs(fixed-k) == Math.abs(j-q(k)))\n                    return false;\n            }\n            return true;\n        }\n\n        /** Search all positions for the current board. */\n        def search() {\n            for (k in R) searchOne(k);\n        }\n\n        /**\n         * Modify the current board by adding a new queen\n         * in file <code>k</code> on rank <code>fixed</code>,\n         * and search for all safe positions with this prefix.\n         */\n        def searchOne(k:Int) {\n            if (safe(k)) {\n                if (fixed==(N-1n)) {\n                    // all ranks safely filled\n                    atomic NQueensPar.this.nSolutions++;\n                } else {\n                    q(fixed++) = k;\n                    search();\n                    fixed--;\n                }\n            }\n        }\n\n        /**\n         * Search this board, dividing the work between threads\n         * using a block distribution of the current free rank.\n         */\n        def parSearch()  {\n            for (work in R.split(P)) async {\n                val board = new Board(this);\n                for (w in work) {\n                    board.searchOne(w);\n                }\n            }\n        }\n    }\n\n    public static def main(args:Rail[String])  {\n        val n = args.size > 0 ? Int.parse(args(0)) : 8n;\n        Console.OUT.println(\"N=\" + n);\n        //warmup\n        //finish new NQueensPar(12, 1).start();\n        val ps = [1n,2n,4n];\n        for (numTasks in ps) {\n            Console.OUT.println(\"starting \" + numTasks + \" tasks\");\n            val nq = new NQueensPar(n,numTasks);\n            var start:Long = -System.nanoTime();\n            finish nq.start();\n            val result = (nq.nSolutions as Long)==EXPECTED_SOLUTIONS(nq.N);\n            start += System.nanoTime();\n            start /= 1000000;\n            Console.OUT.println(\"NQueensPar \" + nq.N + \"(P=\" + numTasks +\n                    \") has \" + nq.nSolutions + \" solutions\" +\n                    (result? \" (ok).\" : \" (wrong).\") + \"time=\" + start + \"ms\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/QSort.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\n\n/**\n * Straightforward quicksort implementation using\n * naive partition-in-the-middle and not bothering with\n * well-known optimizations such as using insertion sort\n * once the partitions get small.  This is only intended\n * as a simple example of an array-based program that \n * combines a recirsive divide and conquer algorithm \n * with async and finish, not as a highly efficient \n * sorting procedure..\n */\npublic class QSort {\n\n  private static def partition(data:Rail[int], left:long, right:long) {\n      var i:long = left;\n      var j:long = right;\n      var tmp:int;\n      var pivot:long = data((left + right) / 2);\n\n      while (i <= j) {\n          while (data(i) < pivot) i++;\n          while (data(j) > pivot) j--;\n          if (i <= j) {\n              tmp = data(i);\n              data(i) = data(j);\n              data(j) = tmp;\n              i++;\n              j--;\n          }\n      }\n\n      return i;\n  }\n\n  public static def qsort(data:Rail[int], left:long, right:long) {\n      index:long = partition(data, left, right);\n      finish {\n          if (left < index - 1)\n              async qsort(data, left, index - 1);\n\n          if (index < right)\n              qsort(data, index, right);\n      }\n  }\n\n  public static def main(args:Rail[String]) {\n      val N = args.size>0 ? Long.parse(args(0)) : 100;\n      val r = new x10.util.Random();\n      val data = new Rail[int](N, (long)=>r.nextInt(9999n));\n      qsort(data, 0, N-1);\n      for (i in 0..(N-1)) {\n          Console.OUT.print(data(i)); \n          if (i%10 == 9) {\n\t      Console.OUT.println();\n          } else {\n              Console.OUT.print(\", \");\n          }\n      }\n      Console.OUT.println();\n  }\n}\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/X10/StructSpheres.x10",
    "content": "/*\n *  This file is part of the X10 project (http://x10-lang.org).\n *\n *  This file is licensed to You under the Eclipse Public License (EPL);\n *  You may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *      http://www.opensource.org/licenses/eclipse-1.0.php\n *\n *  (C) Copyright IBM Corporation 2006-2014.\n */\n\nimport x10.io.Console;\nimport x10.util.Random;\n\n/**\n * This class represents a real-world problem in graphics engines --\n * determining which objects in a large sprawling world are close enough to the\n * camera to be considered for rendering.  \n *\n * It illustrates the usage of X10 structs to define new primitive types.\n * In Native X10, structs are allocated within their containing object/stack frame\n * and thus using structs instead of classes for Vector3 and WorldObject greatly\n * improves the memory efficiency of the computation.\n *\n * @Author Dave Cunningham\n * @Author Vijay Saraswat\n */\nclass StructSpheres {\n    static type Real = Float;\n\n    static struct Vector3(x:Real, y:Real, z:Real) {\n        public def getX () = x; \n        public def getY () = y;\n        public def getZ () = z;\n\n        public def add (other:Vector3)\n            = Vector3(this.x+other.x, this.y+other.y, this.z+other.z);\n\n        public def neg () = Vector3(-this.x, -this.y, -this.z);\n\n        public def sub (other:Vector3) = add(other.neg());\n\n        public def length () = Math.sqrtf(length2());\n\n        public def length2 () = x*x + y*y + z*z;\n    }\n\n\n    static struct WorldObject {\n\n        def this (x:Real, y:Real, z:Real, r:Real) {\n            pos = Vector3(x,y,z);\n            renderingDistance = r;\n        }\n\n        public def intersects (home:Vector3)\n            = home.sub(pos).length2() < renderingDistance*renderingDistance;\n\n        protected val pos:Vector3;\n        protected val renderingDistance:Real;\n    }\n\n\n    public static def compute():boolean {\n\n        val reps = 7500;\n\n        // The following correspond to a modern out-door computer game:\n        val num_objects = 50000;\n        val world_size = 6000;\n        val obj_max_size = 400;\n\n        val ran = new Random(0);\n\n        // the array can go on the heap\n        // but the elements ought to be /*inlined*/ in the array\n        val spheres =\n            new Rail[WorldObject](num_objects, (i:long) => {\n                val x = (ran.nextDouble()*world_size) as Real;\n                val y = (ran.nextDouble()*world_size) as Real;\n                val z = (ran.nextDouble()*world_size) as Real;\n                val r = (ran.nextDouble()*obj_max_size) as Real;\n                return WorldObject(x,y,z,r);\n            });\n\n        val time_start = System.nanoTime();\n\n        var counter : Long = 0;\n\n        // HOT LOOP BEGINS\n        for (c in 1..reps) {\n\n            val x = (ran.nextDouble()*world_size) as Real;\n            val y = (ran.nextDouble()*world_size) as Real;\n            val z = (ran.nextDouble()*world_size) as Real;\n\n            val pos = Vector3(x,y,z);\n\n            for (i in spheres.range()) {\n                if (spheres(i).intersects(pos)) {\n                    counter++;\n                }\n            }\n        }\n        // HOT LOOP ENDS\n\n        val time_taken = System.nanoTime() - time_start;\n        Console.OUT.println(\"Total time: \"+time_taken/1E9);\n\n        val expected = 109702;\n        val ok = counter == expected;\n        if (!ok) {\n            Console.ERR.println(\"number of intersections: \"+counter\n                                +\" (expected \"+expected+\")\");\n        }\n        return ok;\n    }\n\n    public static def main (Rail[String]) {\n        compute();\n    }\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/XC/main.xc",
    "content": "int main()\n{\n  int x;\n  chan c;\n  par {\n    c <: 0;\n    c :> x;\n  }\n  return x;\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/XCompose/filenames/XCompose",
    "content": "# for Emacs: -*- coding: utf-8 -*-\ninclude \"%L\"\n\n# def emit(keys, codepoint, word):\n#     print ('<Multi_key> %s <period>\\t: \"%s\"\\tU%04X\\t\\t# CIRCLED DIGIT %s' % \n#            (keys, unichr(codepoint), codepoint, word)).encode('utf8')\n# numbers = 'one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty'\n# words = numbers.upper().split()\n# emit('<0>', 0x24EA, \"ZERO\")\n# for num, word in zip(range(1, 21), words):\n#     emit(' '.join(\"<%s>\" % char for char in str(num)), 0x245f + num, word)\n\n# Custom additions: Typography\n<Multi_key> <period> <period>\t\t: \"…\"\tU2026\t\t# HORIZONTAL ELLIPSIS\n<Multi_key> <v> <period> <period>\t: \"⋮\"\tU22EE\t\t# VERTICAL ELLIPSIS\n<Multi_key> <c> <period> <period>\t: \"⋯\"\tU22EF\t\t# MIDLINE HORIZONTAL ELLIPSIS\n<Multi_key> <slash> <period> <period>\t: \"⋰\"\tU22F0\t\t# UP RIGHT DIAGONAL ELLIPSIS\n# To avoid conflict with \\. for combining dot above.\n#<Multi_key> <backslash> <period> <period> : \"⋱\" U22F1\t\t# DOWN RIGHT DIAGONAL ELLIPSIS\n<Multi_key> <period> <backslash> <period> : \"⋱\" U22F1\t\t# DOWN RIGHT DIAGONAL ELLIPSIS\n# Will we someday regret this, wanting 2. for ⒉ ?\n<Multi_key> <2> <period>\t \t  : \"‥\"\tU2025\t\t# TWO DOT LEADER\n# This should not be needed.\n#<Multi_key> <1> <period>\t\t  : \"․\"\tU2024\t\t# ONE DOT LEADER\n<Multi_key> <c> <1> <period>\t\t  : \"·\"\tU00B7\t\t# MIDDLE DOT (maybe I can remember the keystroke better?\n<Multi_key> <period> <slash> <period>\t: \"⁒\"\tU2052\t\t# COMMERCIAL MINUS SIGN\n# Printable sign for space.  But is \\<space> too useful a key combo to use\n# for this?\n<Multi_key> <backslash> <space>\t\t: \"␣\"\tU2423\t\t# OPEN BOX\n# These two are already present for me:\n# <Multi_key> <minus> <minus> <minus>\t: \"—\"\tU2014\t\t# EM DASH\n# <Multi_key> <minus> <minus> <period>\t: \"–\"\tU2013\t\t# EN DASH\n<Multi_key> <minus> <minus> <space>\t: \"– \"\t\t\t# EN DASH (followed by space)\n<Multi_key> <minus> <asciitilde> <minus> : \"―\" U2015 # HORIZONTAL BAR\n<Multi_key> <minus> <2> <M>\t \t : \"⸺\" U2E3A # TWO-EM DASH\n<Multi_key> <minus> <3> <M>\t \t : \"⸻\" U2E3B # THREE-EM DASH\n<Multi_key> <backslash> <minus>\t\t: \"­\"\tU00AD\t\t# SOFT HYPHEN\n# This is the recommended typographical practice for em dashes in English.\n# Unfortunately, it doesn’t work out all that well in monospace fonts,\n# where the thin spaces aren’t thin.  But I think this is okay.\n# This conflicts with the default binding to “~”, which is potentially\n# a problem for non-American keyboards.\n<Multi_key> <space> <minus>             : \" — \"                 # EM DASH surrounded by THIN SPACEs.\n\n\n# Quotation marks.\n<Multi_key> <comma> <space>\t\t: \"‚\"\tU201A\t\t# SINGLE LOW-9 QUOTATION MARK\n<Multi_key> <comma> <comma>\t\t: \"„\"\tU201E\t\t# DOUBLE LOW-9 QUOTATION MARK\n<Multi_key> <less> <comma> <comma>\t: \"⹂\"\tU2E42\t\t# DOUBLE LOW-REVERSED-9 QUOTATION MARK\n<Multi_key> <apostrophe> <space>\t: \"’\"\tU2019\t\t# RIGHT SINGLE QUOTATION MARK\n<Multi_key> <apostrophe> <apostrophe>\t: \"”\"\tU201D\t\t# RIGHT DOUBLE QUOTATION MARK\n<Multi_key> <grave> <space>\t\t: \"‘\"\tU2018\t\t# LEFT SINGLE QUOTATION MARK\n<Multi_key> <grave> <grave>\t\t: \"“\"\tU201C\t\t# LEFT DOUBLE QUOTATION MARK\n<Multi_key> <6> <apostrophe>\t\t: \"‘\"\tU2018\t\t# LEFT SINGLE QUOTATION MARK (high 6)\n<Multi_key> <6> <quotedbl>\t\t: \"“\"\tU201C\t\t# LEFT DOUBLE QUOTATION MARK (66)\n<Multi_key> <9> <apostrophe>\t\t: \"’\"\tU2019\t\t# RIGHT SINGLE QUOTATION MARK (high 9)\n<Multi_key> <9> <quotedbl>\t\t: \"”\"\tU201D\t\t# RIGHT DOUBLE QUOTATION MARK (99)\n<Multi_key> <less> <9> <apostrophe>\t: \"‛\"\tU201B\t\t# SINGLE HIGH-REVERSED-9 QUOTATION MARK\n<Multi_key> <less> <9> <quotedbl>\t: \"‟\"\tU201F\t\t# DOUBLE HIGH-REVERSED-9 QUOTATION MARK\n<Multi_key> <comma> <apostrophe>\t: \"‚\"\tU201A\t\t# SINGLE LOW-9 QUOTATION MARK (quote resembling a comma)\n<Multi_key> <comma> <quotedbl>\t\t: \"„\"\tU201E\t\t# DOUBLE LOW-9 QUOTATION MARK\n\n# Convenience shortcuts for quotation marks.\n<Multi_key> <space> <quotedbl>          : \" “\"                  # space followed by LEFT DOUBLE QUOTATION MARK\n<Multi_key> <quotedbl> <space>          : \"” \"                  # RIGHT DOUBLE QUOTATION MARK followed by space\n<Multi_key> <space> <apostrophe>        : \" ‘\"                # space followed by LEFT SINGLE QUOTATION MARK\n# Unfortunately <apostrophe> <space> is, asymmetrically, just \"’\".  Whatever.\n<Multi_key> <n> <t>                     : \"n’t \"              # Apostrophized English “not.”\n# Some more English shortcuts:\n<Multi_key> <space> <t>                 : \" the \"\n<Multi_key> <space> <T>                 : \"  The \"\n<Multi_key> <space> <a>                 : \" and \"\n<Multi_key> <i> <m>                     : \" I’m \"\n<Multi_key> <v> <e>                     : \"’ve \"\n\n<Multi_key> <comma> <at>\t\t: \"⸲\"\tU2E32\t\t# TURNED COMMA\n# Conflicts with system def? (·)\n<Multi_key> <period> <asciicircum>\t: \"⸳\"\tU2E33\t\t# RAISED DOT\n<Multi_key> <period> <asciitilde>\t: \"⸳\"\tU2E33\t\t# RAISED DOT\n<Multi_key> <comma> <asciicircum>\t: \"⸴\"\tU2E34\t\t# RAISED COMMA\n<Multi_key> <semicolon> <at>\t\t: \"⸵\"\tU2E35\t\t# TURNED SEMICOLON\n# Convlicts with system def? (⍭)\n<Multi_key> <asciitilde> <bar>\t\t: \"ⸯ\"\tU2E2F\t\t# VERTICAL TILDE\n<Multi_key> <asciicircum> <bar>\t\t: \"ⸯ\"\tU2E2F\t\t# VERTICAL TILDE\n<Multi_key> <minus> <equal>\t\t: \"⹀\"\tU2E40\t\t# DOUBLE HYPHEN\n<Multi_key> <comma> <less>\t\t: \"⹁\"\tU2E41\t\t# REVERSED COMMA\n<Multi_key> <less> <bar>\t\t: \"↵\"\tU21B5\t\t# DOWNWARDS ARROW WITH CORNER LEFTWARDS\n# The bullet was <o> <period>, but it clashes with ꙭ\n<Multi_key> <asterisk> <1>\t\t: \"•\"\tU2022\t\t# BULLET\n# By default <Multi_key> <period> <period> does this, but we broke that with the ... binding.\n<Multi_key> <o> <underscore>\t\t: \"⁃\"   U2043\t\t# HYPHEN BULLET\n<Multi_key> <o> <comma>\t\t\t: \"·\"\tperiodcentered\t# MIDDLE DOT\n# I don’t use this nearly as often as the em-dash sequence I’ve remapped it to:\n#<Multi_key> <space> <minus>\t\t: \"‑\"\tU2011\t\t# NON-BREAKING HYPHEN\n# Already present for me:\n# <Multi_key> <space> <space>\t\t: \" \"\tU00A0\t\t# NO-BREAK SPACE\n# Do we want/need these?\n<Multi_key> <d> <a> <g>\t\t\t: \"†\"\tU2020\t\t# DAGGER\n<Multi_key> <d> <d> <a> <g>\t\t: \"‡\"\tU2021\t\t# DOUBLE DAGGER\n# We used to have THIN SPACE as <space> <apostrophe>, but now that’s remapped\n# to \" ‘\", for conveniently enclosing things in proper single-quotes.\n<Multi_key> <backslash> <comma>\t\t: \" \"\tU2009\t\t# THIN SPACE\n<Multi_key> <s> <e> <c> : \"§\"   U00A7   # SECTION SIGN\n# It's in the Asian section, but it's a general-purpose punctuation:\n<Multi_key> <quotedbl> <quotedbl>       : \"〃\"\tU3003\t\t# DITTO MARK\n# Working with the pattern from FLOOR/CEILING\n<Multi_key> <7> <asciicircum> <bracketleft>  : \"⸢\"  U2E22\t# TOP LEFT HALF BRACKET\n<Multi_key> <7> <asciicircum> <bracketright> : \"⸣\"  U2E23\t# TOP RIGHT HALF BRACKET\n<Multi_key> <L> <underscore> <bracketleft>   : \"⸤\"  U2E24\t# BOTTOM LEFT HALF BRACKET\n<Multi_key> <L> <underscore> <bracketright>  : \"⸥\"  U2E25\t# BOTTOM RIGHT HALF BRACKET\n# Consider <7> <less>/<greater> for ⸂⸃ maybe? <S> and <slash> for ⸉⸊⸌⸍ ...?\n# I guess we can get by with sub/superset for ⸦⸧.\n\n<Multi_key> <minus> <less>\t\t: \"←\"\tleftarrow\t# LEFTWARDS ARROW\n<Multi_key> <minus> <asciicircum>\t: \"↑\"\tuparrow\t\t# UPWARDS ARROW\n<Multi_key> <minus> <greater>\t\t: \"→\"\trightarrow\t# RIGHTWARDS ARROW\n<Multi_key> <minus> <v>\t\t\t: \"↓\"\tdownarrow\t# DOWNWARDS ARROW\n<Multi_key> <less> <minus> <greater>\t: \"↔\"\tU2194           # LEFT RIGHT ARROW (kragen's)\n\n<Multi_key> <Left> <Left>\t\t: \"←\"\tleftarrow\t# LEFTWARDS ARROW\n<Multi_key> <Up> <Up>\t\t\t: \"↑\"\tuparrow\t\t# UPWARDS ARROW\n<Multi_key> <Right> <Right>\t\t: \"→\"\trightarrow\t# RIGHTWARDS ARROW\n<Multi_key> <Down> <Down>\t\t: \"↓\"\tdownarrow\t# DOWNWARDS ARROW\n<Multi_key> <Left> <Right>\t\t: \"↔\"\tU2194           # LEFT RIGHT ARROW (kragen's)\n<Multi_key> <Right> <Left>\t\t: \"↔\"\tU2194           # LEFT RIGHT ARROW (kragen's)\n<Multi_key> <Up> <Down>\t\t\t: \"↕\"\tU2195           # UP DOWN ARROW (kragen's)\n<Multi_key> <Up> <ampersand> <Down>     : \"⇵\"\tU21F5\t\t# DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW\n<Multi_key> <Down> <Left>\t\t: \"↵\"\tU21B5\t\t# DOWNWARDS ARROW WITH CORNER LEFTWARDS\n<Multi_key> <Left> <o>\t\t\t: \"⟲\"\tU27F2\t\t# ANTICLOCKWISE GAPPED CIRCLE ARROW\n<Multi_key> <Right> <o>\t\t\t: \"⟳\"\tU27F3\t\t# CLOCKWISE GAPPED CIRCLE ARROW\n<Multi_key> <Left> <c>\t\t\t: \"↺\"\tU21BA\t\t# ANTICLOCKWISE OPEN CIRCLE ARROW\n<Multi_key> <Right> <c>\t\t\t: \"↻\"\tU21BB\t\t# CLOCKWISE OPEN CIRCLE ARROW\n<Multi_key> <Left> <asciitilde>\t\t: \"⇜\"\tU21DC\t\t# LEFTWARDS SQUIGGLE ARROW\n<Multi_key> <Right> <asciitilde>\t: \"⇝\"\tU21DD\t\t# RIGHTWARDS SQUIGGLE ARROW\n<Multi_key> <Left> <bar>       \t\t: \"⇤\"\tU21E4\t\t# LEFTWARDS ARROW TO BAR\n<Multi_key> <Right> <bar>       \t: \"⇥\"\tU21E5\t\t# RIGHTWARDS ARROW TO BAR\n<Multi_key> <Left> <minus>     \t\t: \"⇠\"\tU21E0\t\t# LEFTWARDS DASHED ARROW\n<Multi_key> <Up> <minus>     \t\t: \"⇡\"\tU21E1\t\t# UPWARDS DASHED ARROW\n<Multi_key> <Right> <minus>     \t: \"⇢\"\tU21E2\t\t# RIGHTWARDS DASHED ARROW\n<Multi_key> <Down> <minus>      \t: \"⇣\"\tU21E3\t\t# DOWNWARDS DASHED ARROW\n\n# Arrow keys don't always work: some apps trap them for cursor control and\n# other boring things.  The arrow symbols have alternate keystrokes.  Do\n# we need others for these printer's fists?  If so, what?  The -= and =-\n# we had before are not necessarily the best choices.\n<Multi_key> <F> <Left>\t\t: \"☚\"\tU261A\t\t# BLACK LEFT POINTING INDEX\n<Multi_key> <F> <Right>\t\t: \"☛\"\tU261B\t\t# BLACK RIGHT POINTING INDEX\n<Multi_key> <f> <Left>\t\t: \"☜\"\tU261C\t\t# WHITE LEFT POINTING INDEX\n<Multi_key> <f> <Up>\t\t: \"☝\"\tU261D\t\t# WHITE UP POINTING INDEX\n<Multi_key> <f> <Right>\t\t: \"☞\"\tU261E\t\t# WHITE RIGHT POINTING INDEX\n<Multi_key> <f> <Down>\t\t: \"☟\"\tU261F\t\t# WHITE DOWN POINTING INDEX\n<Multi_key> <f> <v>   \t\t: \"✌\"   U270C   \t# VICTORY HAND\n<Multi_key> <f> <w>   \t\t: \"✍\"   U270D   \t# WRITING HAND\n<Multi_key> <f> <p> <Down>\t: \"✎\"   U270E   \t# LOWER RIGHT PENCIL\n<Multi_key> <f> <p> <Right>\t: \"✏\"   U270F   \t# PENCIL\n<Multi_key> <f> <p> <Up>\t: \"✐\"   U2710   \t# UPPER RIGHT PENCIL\n\n# For some logical statements.  I prefer doubled arrows for implication.\n<Multi_key> <equal> <greater>\t\t: \"⇒\"\tU21D2\t\t# RIGHTWARDS DOUBLE ARROW\n<Multi_key> <equal> <less>\t\t: \"⇐\"\tU21D0\t\t# LEFTWARDS DOUBLE ARROW\n<Multi_key> <less> <minus> <equal> <greater> : \"⇔\" U21D4 # LEFT RIGHT DOUBLE ARROW \n<Multi_key> <equal> <Right> <Right>\t: \"⇒\"\tU21D2\t\t# RIGHTWARDS DOUBLE ARROW\n<Multi_key> <equal> <Left> <Left>\t: \"⇐\"\tU21D0\t\t# LEFTWARDS DOUBLE ARROW\n<Multi_key> <equal> <Left> <Right>\t: \"⇔\"\tU21D4\t# LEFT RIGHT DOUBLE ARROW\n<Multi_key> <equal> <Right> <Left>\t: \"⇔\"\tU21D4\t# LEFT RIGHT DOUBLE ARROW\n<Multi_key> <equal> <Up> <Up>\t\t: \"⇑\"\tU21D1\t# UPWARDS DOUBLE ARROW\n<Multi_key> <equal> <Down> <Down>\t: \"⇓\"\tU21D3\t# DOWNWARDS DOUBLE ARROW\n<Multi_key> <equal> <Up> <Down>\t\t: \"⇕\"\tU21D5\t# UP DOWN DOUBLE ARROW\n<Multi_key> <equal> <Down> <Left>\t: \"⏎\"\tU23CE\t# RETURN SYMBOL\n# These are just too cool-looking not to have (if your font supports them)\n<Multi_key> <equal> <period> <equal>\t: \"⸎\"\tU2E0E\t\t# EDITORIAL CORONIS\n<Multi_key> <Multi_key> <p> <a> <l> <m>\t: \"⸙\"\tU2E19\t\t# PALM BRANCH\n<Multi_key> <Multi_key> <b> <r> <a> <n> <c> <h>: \"⸙\"\tU2E19\t\t# PALM BRANCH\n\n\n<Multi_key> <f> <f>\t\t: \"ﬀ\"\t   UFB00   # LATIN SMALL LIGATURE FF\n<Multi_key> <f> <i>\t\t: \"ﬁ\"\t   UFB01   # LATIN SMALL LIGATURE FI\n<Multi_key> <F> <i>\t\t: \"ﬃ\"\t   UFB03   # LATIN SMALL LIGATURE FFI\n<Multi_key> <f> <l>\t\t: \"ﬂ\"\t   UFB02   # LATIN SMALL LIGATURE FL\n<Multi_key> <F> <l>\t\t: \"ﬄ\"\t   UFB04   # LATIN SMALL LIGATURE FFL\n<Multi_key> <s> <t>\t\t: \"ﬆ\"  UFB06\t   # LATIN SMALL LIGATURE ST\n<Multi_key> <f> <t>\t\t: \"ﬅ\"  UFB05\t   # LATIN SMALL LIGATURE LONG S T\n# allow me still to use my ſ key, okay?\n<Multi_key> <U017F> <t>\t\t: \"ﬅ\"  UFB05\t   # LATIN SMALL LIGATURE LONG S T\n# ß is already available as <s><s> I think.  But now it comes in industrial size!\n<Multi_key> <S> <S> \t\t: \"ẞ\"  U1E9E\t   # LATIN CAPITAL LETTER SHARP S\n\n# Eventually we'll have to look over the really crazy-cakes Latin letters \n# they're adding as \"mediævalist extensions\"\n# ꜢꜣꜤꜥ for the Egyptologists, Ꝏꝏ because they're cꝏl...  Maybe some others.\n# Can't do <o> <o> for ꝏ though, since that's already °.\n# Epigraphics should not be missed:\n<Multi_key> <F> <less>\t\t: \"ꟻ\"\tUA7FB\t# LATIN EPIGRAPHIC LETTER REVERSED F\n<Multi_key> <P> <less>\t\t: \"ꟼ\"\tUA7FC\t# LATIN EPIGRAPHIC LETTER REVERSED P\n<Multi_key> <F> <BackSpace>\t\t: \"ꟻ\"\tUA7FB\t# LATIN EPIGRAPHIC LETTER REVERSED F\n<Multi_key> <P> <BackSpace>\t\t: \"ꟼ\"\tUA7FC\t# LATIN EPIGRAPHIC LETTER REVERSED P\n<Multi_key> <M> <W>\t\t: \"ꟽ\"\tUA7FD\t# LATIN EPIGRAPHIC LETTER INVERTED M\n<Multi_key> <I> <bar>\t\t: \"ꟾ\"\tUA7FE\t# LATIN EPIGRAPHIC LETTER I LONGA\n<Multi_key> <M> <slash>\t\t: \"ꟿ\"\tUA7FF\t# LATIN EPIGRAPHIC LETTER ARCHAIC M\n# I'd been avoiding this because we already have ∃...\n# Hey, these, being *letters* can be used as identifiers in some languages...\n<Multi_key> <E> <less>\t \t : \"Ǝ\"\t    U018E\t# LATIN CAPITAL LETTER REVERSED E\n<Multi_key> <E> <BackSpace>\t : \"Ǝ\"\t    U018E\t# LATIN CAPITAL LETTER REVERSED E\n<Multi_key> <e> <less>\t\t : \"ɘ\"\t    U0258\t# LATIN SMALL LETTER REVERSED E\n<Multi_key> <e> <BackSpace>\t : \"ɘ\"\t    U0258\t# LATIN SMALL LETTER REVERSED E\n# Complete the set\n<Multi_key> <A> <less>\t\t : \"Ɐ\"\t    U2C6F\t# LATIN CAPITAL LETTER TURNED A\n# These seem too long as keystrokes; any suggestions?\n# How about 2o?\n<Multi_key> <o> <ampersand> <o>\t: \"ꝏ\"\tUA74F\t# LATIN SMALL LETTER OO\n<Multi_key> <O> <ampersand> <O> : \"Ꝏ\"\tUA74E\t# LATIN CAPITAL LETTER OO\n<Multi_key> <2> <o>\t: \"ꝏ\"\tUA74F\t# LATIN SMALL LETTER OO\n<Multi_key> <2> <O> \t: \"Ꝏ\"\tUA74E\t# LATIN CAPITAL LETTER OO\n# Latin-D chars I'm particularly thinking about:\n# (side note: \"I\" has many referents in this file.)\n# ꜲꜳꜴꜵꜶꜷꜸꜹꜼꜽꝒꝓꝔꝕꝚꝛꝜꝝꝠꝡꝪꝫꝸ\n# The ligature pairs are so easy, might as well include them (probably\n# using ampersand though).  P with flourish?  Squirrel tail?  How\n# pretty!  I like the r and rum rotunda, and et actually has something\n# close to usefulness (it was very common for abbreviations, and is the \n# source of the \"z\" in abbreviations like oz. and viz.)  Some others \n# are a little appealing too.\n\n<Multi_key> <A> <ampersand> <A> :\t\"Ꜳ\"\tUA732\t\t# LATIN CAPITAL LETTER AA\n<Multi_key> <a> <ampersand> <a> :\t\"ꜳ\"\tUA733\t\t# LATIN SMALL LETTER AA\n<Multi_key> <2> <A> :\t\"Ꜳ\"\tUA732\t\t# LATIN CAPITAL LETTER AA\n<Multi_key> <2> <a> :\t\"ꜳ\"\tUA733\t\t# LATIN SMALL LETTER AA\n<Multi_key> <A> <ampersand> <O>\t:\t\"Ꜵ\"\tUA734\t# LATIN CAPITAL LETTER AO\n<Multi_key> <a> <ampersand> <o>\t:\t\"ꜵ\"\tUA735\t# LATIN SMALL LETTER AO\n<Multi_key> <A> <ampersand> <U>\t:\t\"Ꜷ\"\tUA736\t# LATIN CAPITAL LETTER AU\n<Multi_key> <a> <ampersand> <u>\t:\t\"ꜷ\"\tUA737\t# LATIN SMALL LETTER AU\n<Multi_key> <A> <ampersand> <V> :\t\"Ꜹ\"\tUA738\t# LATIN CAPITAL LETTER AV\n<Multi_key> <a> <ampersand> <v> :\t\"ꜹ\"\tUA739\t# LATIN SMALL LETTER AV\n<Multi_key> <A> <ampersand> <Y> :\t\"Ꜽ\"\tUA73C\t# LATIN CAPITAL LETTER AY\n<Multi_key> <a> <ampersand> <y> :\t\"ꜽ\"\tUA73D\t# LATIN SMALL LETTER AY\n<Multi_key> <slash> <ampersand> <L> :\t\"Ꝇ\"\tUA746\t# LATIN CAPITAL LETTER BROKEN L\n<Multi_key> <slash> <ampersand> <l> :\t\"ꝇ\"\tUA747\t# LATIN SMALL LETTER BROKEN L\n# (See above for reason behind keystrokes)\n<Multi_key> <Z> <period>\t:\t\"Ꝫ\"\tUA75A\t# LATIN CAPITAL LETTER ET\n<Multi_key> <z> <period>\t:\t\"ꝫ\"\tUA75B\t# LATIN SMALL LETTER ET\n<Multi_key> <V> <ampersand> <Y>\t:\t\"Ꝡ\"\tUA760\t# LATIN CAPITAL LETTER VY\n<Multi_key> <v> <ampersand> <y>\t:\t\"ꝡ\"\tUA761\t# LATIN SMALL LETTER VY\n<Multi_key> <C> <Z>\t    \t:\t\"Ꝣ\"\tUA762\t# LATIN CAPITAL LETTER VISIGOTHIC Z\n<Multi_key> <c> <z>\t\t:\t\"ꝣ\"\tUA763\t# LATIN SMALL LETTER VISIGOTHIC Z\n<Multi_key> <L> <ampersand> <L>\t:\t\"Ỻ\"\tU1EFA\t# LATIN CAPITAL LETTER MIDDLE-WELSH LL\n<Multi_key> <l> <ampersand> <l>\t:\t\"ỻ\"\tU1EFB\t# LATIN SMALL LETTER MIDDLE-WELSH LL\n<Multi_key> <V> <ampersand> <V>\t:\t\"Ỽ\"\tU1EFC\t# LATIN CAPITAL LETTER MIDDLE-WELSH V\n<Multi_key> <v> <ampersand> <v>\t:\t\"ỽ\"\tU1EFD\t# LATIN SMALL LETTER MIDDLE-WELSH V\n<Multi_key> <d> <ampersand> <b>\t:\t\"ȸ\"\tU0238\t# LATIN SMALL LETTER DB DIGRAPH\n<Multi_key> <q> <ampersand> <p>\t:\t\"ȹ\"\tU0239\t# LATIN SMALL LETTER QP DIGRAPH\n<Multi_key> <w> <y>\t    \t:\t\"ƿ\"\tU01BF\t# LATIN LETTER WYNN\n<Multi_key> <W> <Y>\t\t:\t\"Ƿ\"\tU01F7\t# LATIN CAPITAL LETTER WYNN\n<Multi_key> <O> <U>\t\t:\t\"Ȣ\"\tU0222\t# LATIN CAPITAL LETTER OU\n<Multi_key> <o> <u>\t\t:\t\"ȣ\"\tU0223\t# LATIN SMALL LETTER OU\n<Multi_key> <y> <r>\t\t:\t\"Ʀ\"\tU01A6\t# LATIN LETTER YR\n\n# Custom additions: Mathematical symbols\n<Multi_key> <exclam> <equal>\t\t: \"≠\"\tU2260\t\t# NOT EQUAL TO\n<Multi_key> <slash> <equal>\t\t: \"≠\"\tU2260\t\t# NOT EQUAL TO\n<Multi_key> <less> <equal>\t\t: \"≤\"\tU2264\t\t# LESS-THAN OR EQUAL TO\n<Multi_key> <greater> <equal>\t\t: \"≥\"\tU2265\t\t# GREATER-THAN OR EQUAL TO\n<Multi_key> <exclam> <less> <greater>   : \"≸\"\tU2278\t\t# NEITHER LESS-THAN NOR GREATER-THAN\n# MUCH is usually enough for me.  No need for VERY.\n<Multi_key> <plus> <less>        \t: \"≪\"\tU226A\t\t# MUCH LESS-THAN\n<Multi_key> <plus> <greater> \t\t: \"≫\"\tU226B\t\t# MUCH GREATER-THAN\n# Damn.  That makes this conflict with the standard plus plus -> #\n<Multi_key> <plus> <plus> <less>        : \"⋘\"\tU22D8\t\t# VERY MUCH LESS-THAN\n<Multi_key> <plus> <plus> <greater>  \t: \"⋙\"\tU22D9\t\t# VERY MUCH GREATER-THAN\n<Multi_key> <3> <greater> \t\t: \"⋙\"\tU22D9\t\t# VERY MUCH GREATER-THAN\n<Multi_key> <3> <less>\t\t\t: \"⋘\"\tU22D8\t\t# VERY MUCH LESS-THAN\n<Multi_key> <i> <n>\t\t\t: \"∈\"\tU2208\t\t# ELEMENT OF\n<Multi_key> <exclam> <i> <n>\t\t: \"∉\"\tU2209\t\t# NOT AN ELEMENT OF\n<Multi_key> <U2208> <slash>\t\t: \"∉\"\tU2209\t\t# NOT AN ELEMENT OF (I have ∈ on my keyboard...)\n<Multi_key> <n> <i>\t\t\t: \"∋\"\tU220B\t\t# CONTAINS AS MEMBER  (I hope this doesn't conflict)\n<Multi_key> <slash> <n> <i>\t\t: \"∌\"\tU220C\t\t# DOES NOT CONTAIN AS MEMBER\n# <exclam><n><i> would conflict, with <exclam> <n> for N WITH UNDERDOT, etc.\n<Multi_key> <U220B> <slash>\t\t: \"∌\"\tU220C\t\t# DOES NOT CONTAIN AS MEMBER\n<Multi_key> <asciitilde> <equal>\t\t\t: \"≅\"\tU2245\t\t# APPROXIMATELY EQUAL TO (It actually means \"congruent\"!)\n<Multi_key> <equal> <question>\t\t: \"≟\"\tU225f\t\t# QUESTIONED EQUAL TO\n<Multi_key> <equal> <d> <e> <f>\t\t: \"≝\"\tU225D\t\t# EQUAL TO BY DEFINITION\n<Multi_key> <d> <e> <f> <equal>\t\t: \"≝\"\tU225D\t\t# EQUAL TO BY DEFINITION\n<Multi_key> <equal> <equal>\t\t: \"≡\"\tU2261\t\t# IDENTICAL TO\n<Multi_key> <colon> <equal> \t\t: \"≔\"  U2254\t\t# COLON EQUALS\n<Multi_key> <equal> <colon> \t\t: \"≕\"  U2255\t\t# EQUALS COLON\n# Using <slash> conflicts.\n<Multi_key> <equal> <bar> <equal>\t: \"≢\"\tU2262\t\t# NOT IDENTICAL TO\n# We already have ±\n<Multi_key> <minus> <plus>\t\t: \"∓\"\tU2213\t\t# MINUS OR PLUS SIGN\n<Multi_key> <s> <q>\t\t\t: \"√\"\tU221A\t\t# SQUARE ROOT\n# keystrokes might not make the most sense, but you know what they mean...\n<Multi_key> <3> <s> <q>\t\t\t: \"∛\"\tU221B\t        # CUBE ROOT\n<Multi_key> <4> <s> <q>\t\t\t: \"∜\"\tU221C\t\t# FOURTH ROOT\n    # “(Note: I had put the backslash in position 5/15. It enabled the\n    # ALGOL “and” to be “/\\” and the “or” to be “\\/”.)” --- Bob Bemer,\n    # http://home.ccil.org/~remlaps/www.bobbemer.com/BRACES.HTM, quoting\n    # himself in “A view of the history of the ISO character code”, 1972\n<Multi_key> <slash> <backslash>         : \"∧\"  U2227           # LOGICAL AND\n<Multi_key> <backslash> <slash>         : \"∨\"  U2228           # LOGICAL OR\n<Multi_key> <backslash> <underscore> <slash>    : \"⊻\" U22BB     # XOR\n<Multi_key> <minus> <comma>\t     :\t\"¬\"\tU00AC \t\t# NOT SIGN\n<Multi_key> <Multi_key> <asterisk> <o>              : \"∘\"   U2218           # RING OPERATOR (function composition)\n<Multi_key> <Multi_key> <asterisk> <x>             : \"⨯\"   U2A2F           # CROSS PRODUCT\n<Multi_key> <Multi_key> <asterisk>  <period>        : \"⋅\"   U22C5           # DOT OPERATOR (dot product)\n<Multi_key> <0> <slash>                 : \"∅\"   U2205           # EMPTY SET (thanks jsled!)\n<Multi_key> <slash> <0>                 : \"∅\"   U2205           # EMPTY SET\n# I'm hoping { can work as a set mnemonic\n<Multi_key> <braceleft> <U>\t\t: \"∪\"\tU222A\t\t# UNION\n<Multi_key> <braceleft> <asciicircum>\t: \"∩\"\tU2229\t\t# INTERSECTION\n<Multi_key> <braceleft> <parenleft>\t: \"⊂\"\tU2282\t\t# SUBSET OF\n<Multi_key> <braceleft> <equal> <parenleft> : \"⊆\" U2286\t\t# SUBSET OF OR EQUAL TO\n<Multi_key> <exclam> <braceleft> <parenleft> : \"⊄\" U2284        # NOT A SUBSET OF\n<Multi_key> <slash> <braceleft> <parenleft>  : \"⊄\" U2284        # NOT A SUBSET OF\n<Multi_key> <braceleft>\t<parenright>\t: \"⊃\"\tU2283\t\t# SUPERSET OF\n<Multi_key> <braceleft> <equal> <parenright> : \"⊇\" U2287\t# SUPERSET OF OR EQUAL TO\n<Multi_key> <E> <E>                     : \"∃\"  U2203           # THERE EXISTS\n# We can't use ! E E, because ! E maps to E-WITH-UNDERDOT.\n<Multi_key> <slash> <E> <E>             : \"∄\"   U2204           # THERE DOES NOT EXIST\n<Multi_key> <A> <A>                     : \"∀\"  U2200           # FOR ALL\n<Multi_key> <Multi_key> <Q> <E> <D>     : \"∎\"   U220E           # END OF PROOF\n<Multi_key> <8> <8>                     : \"∞\"  U221E           # INFINITY\n<Multi_key> <Multi_key> <a> <l> <e> <p> <h> : \"ℵ\" U2135\t       # ALEF SYMBOL\n<Multi_key> <Multi_key> <a> <l> <e> <p> <0> : \"ℵ₀\"        # ALEF Null\n<Multi_key> <Multi_key> <a> <l> <e> <p> <1> : \"ℵ₁\"        # ALEF One\n<Multi_key> <Multi_key> <a> <l> <e> <f> : \"ℵ\" U2135\t       # ALEF SYMBOL\n<Multi_key> <KP_Multiply> <KP_Multiply>    : \"∗\"   U2217 # ASTERISK OPERATOR\n<Multi_key> <parenleft> <plus> <parenright>     : \"⊕\"  U2295    # CIRCLED PLUS\n<Multi_key> <parenleft> <minus> <parenright>    : \"⊖\"  U2296    # CIRCLED MINUS\n<Multi_key> <parenleft> <x> <x> <parenright>    : \"⊗\"  U2297    # CIRCLED TIMES\n<Multi_key> <parenleft> <slash> <parenright>    : \"⊘\"  U2298    # CIRCLED DIVISION SLASH\n<Multi_key> <parenleft> <asterisk> <parenright> : \"⊛\"  U229B    # CIRCLED ASTERISK OPERATOR\n# )- conflicts with system for }.\n<Multi_key> <parenright> <underscore>    : \"⟌\"   \tU27CC\t\t# LONG DIVISION\n<Multi_key> <period> <quotedbl>\t   \t: \"∴\"\tU2234  \t\t# THEREFORE\n<Multi_key> <quotedbl> <period>\t   \t: \"∵\"\tU2235  \t\t# BECAUSE\n<Multi_key> <Multi_key> <b> <e> <c> <a> <u> <s> <e>\t   \t: \"∵\"\tU2235  \t\t# BECAUSE\n<Multi_key> <percent> <percent>\t\t: \"‱\"\tU2031\t# PER TEN THOUSAND (basis points)\n<Multi_key> <slash> <u>                : \"µ\"   U00B5      # MICRO SIGN\n# Ordinal indicators, for femenine and masculine, used in Romance languages\n<Multi_key> <minus> <a>\t      \t  \t: \"ª\"   U00AA\t\t# FEMININE ORDINAL INDICATOR\n<Multi_key> <minus> <o>\t\t\t: \"º\"\tU00BA\t\t# MASCULINE ORDINAL INDICATOR\n\n# See also U03A3 (Greek capital sigma)\n<Multi_key> <Multi_key> <s> <u> <m>\t: \"∑\"\tU2211\t\t# N-ARY SUMMATION\n# OK, absolutely cannot believe we made it this long without NABLA or INTEGRAL\n# or PARTIAL DIFFERENTIAL\n<Multi_key> <Multi_key> <i> <n> <t>\t: \"∫\"\tU222B\t\t# INTEGRAL\n<Multi_key> <Multi_key> <u> <i> <n> <t>\t: \"⨛\"\tU2A1B\t\t# UPPER INTEGRAL\n<Multi_key> <Multi_key> <l> <i> <n> <t>\t: \"⨜\"\tU2A1C\t\t# LOWER INTEGRAL\n<Multi_key> <Multi_key> <i> <i> <n> <t>\t: \"∬\"\tU222C\t\t# DOUBLE INTEGRAL\n<Multi_key> <Multi_key> <i> <i> <i> <n> <t>\t: \"∭\"\tU222D\t\t# TRIPLE INTEGRAL\n<Multi_key> <Multi_key> <i> <i> <i> <i> <n> <t>\t: \"⨌\"\tU2A0C\t\t# QUADRUPLE INTEGRAL\n<Multi_key> <Multi_key> <o> <i> <n> <t>\t: \"∮\"\tU222E\t\t# CONTOUR INTEGRAL\n<Multi_key> <Multi_key> <p> <i> <n> <t>\t: \"⨕\"\tU2A15\t\t# SEMICIRCULAR POLE INTEGRAL\n<Multi_key> <Multi_key> <c> <P> <i> <n> <t>\t: \"⨓\"\tU2A13\t\t# INTEGRAL AROUND POINT\n<Multi_key> <Multi_key> <o> <i> <i> <n> <t>\t: \"∯\"\tU222F\t\t# SURFACE INTEGRAL\n<Multi_key> <Multi_key> <o> <i> <i> <i> <n> <t>\t: \"∰\"\tU2230\t\t# VOLUME INTEGRAL\n<Multi_key> <Multi_key> <g> <i> <n> <t>\t: \"⨘\"\tU2A18\t\t# GEOMETRIC INTEGRAL\n<Multi_key> <Multi_key> <s> <i> <n> <t>\t: \"⨋\"\tU2A0B\t\t# SUM/INTEGRAL\n#Now for some WTF integrals: ⨙ ⨚ \t\n<Multi_key> <Multi_key> <d> <e> <l>\t: \"∇\"\tU2207\t        # NABLA\n<Multi_key> <Multi_key> <p> <a> <r> <t>   : \"∂\" U2202\t\t# PARTIAL DIFFERENTIAL\n<Multi_key> <asterisk> <period> <period> <d>   : \"∂\" U2202\t# PARTIAL DIFFERENTIAL\n<Multi_key> <R> <e>    \t\t: \"ℜ\"\t U211C \t     \t# BLACK-LETTER CAPITAL R (Real Part)\n<Multi_key> <I> <m>\t\t: \"ℑ\"\t U2111\t\t# BLACK-LETTER CAPTIAL I (Imaginary Part)\n<Multi_key> <Multi_key> <h> <b> <a> <r>\t:   \"ℏ\"\tU210F\t# PLANCK CONSTANT OVER TWO PI\n<Multi_key> <h> <minus>\t\t\t:   \"ℏ\"\tU210F\t# PLANCK CONSTANT OVER TWO PI\n<Multi_key> <h> <p>\t    :\t\"ℎ\"\t    U210E   # PLANCK CONSTANT\n<Multi_key> <Multi_key> <e> <x> <p> :   \"ℯ\"\tU212F   # SCRIPT SMALL E\n<Multi_key> <e> <1> <0> :\t\"⏨\" \tU23E8   # DECIMAL EXPONENT SYMBOL\n<Multi_key> <w> <p> \t:\t\"℘\"\tU2118\t# SCRIPT CAPITAL P\n# Would we prefer 20D1 COMBINING RIGHT HARPOON ABOVE?\n<Multi_key> <asciicircum> <greater>     : \"⃗\"   U20D7           # COMBINING RIGHT ARROW ABOVE (vector)\n# There's a whole passel of these guys starting at U+1D538 but I have no fonts for those.\n<Multi_key> <bar> <C>                   : \"ℂ\"   U2102           # DOUBLE-STRUCK CAPITAL C (set of complex numbers)\n<Multi_key> <bar> <N>                   : \"ℕ\"   U2115           # DOUBLE-STRUCK CAPITAL N (natural number)\n<Multi_key> <bar> <P>                   : \"ℙ\"   U2119           # DOUBLE-STRUCK CAPITAL P \n<Multi_key> <bar> <Q>                   : \"ℚ\"   U211A           # DOUBLE-STRUCK CAPITAL Q (set of rational numbers)\n<Multi_key> <bar> <R>                   : \"ℝ\"   U211D           # DOUBLE-STRUCK CAPITAL R (set of real numbers)\n<Multi_key> <bar> <Z>                   : \"ℤ\"   U2124           # DOUBLE-STRUCK CAPITAL Z (set of integers)\n<Multi_key> <bar> <H>\t\t: \"ℍ\" U210d\t# DOUBLE-STRUCK CAPITAL H\n<Multi_key> <bar> <e>\t\t: \"ⅇ\" U2147\t# DOUBLE-STRUCK ITALIC SMALL E\n<Multi_key> <bar> <i>\t\t: \"ⅈ\" U2148\t# DOUBLE-STRUCK ITALIC SMALL I\n<Multi_key> <bar> <j>\t\t: \"ⅉ\" U2149\t# DOUBLE-STRUCK ITALIC SMALL J\n<Multi_key> <bar> <asterisk> <p> : \"ℼ\" U213C\t# DOUBLE-STRUCK SMALL PI\n<Multi_key> <bar> <Greek_pi> \t : \"ℼ\" U213C\t# DOUBLE-STRUCK SMALL PI\n<Multi_key> <bar> <asterisk> <P> : \"ℿ\" U213F\t# DOUBLE-STRUCK CAPITAL PI\n<Multi_key> <bar> <Greek_PI> \t : \"ℿ\" U213F\t# DOUBLE-STRUCK CAPITAL PI\n<Multi_key> <bar> <asterisk> <S> : \"⅀\" U2140\t# DOUBLE-STRUCK N-ARY SUMMATION\n<Multi_key> <bar> <Greek_SIGMA>  : \"⅀\" U2140\t# DOUBLE-STRUCK N-ARY SUMMATION\n<Multi_key> <bar> <colon>   :\t\"⦂\" U2982\t# Z NOTATION TYPE COLON\n# Apparently it is only for historical reasons that this is not unified with\n# ⨟ U+2A1F Z NOTATION SCHEMA COMPOSITION\n<Multi_key> <bar> <semicolon>\t:   \"⨾\"\tU2A3E\t# Z NOTATION RELATIONAL COMPOSITION\n# The *look* double-struck.\n<Multi_key> <bar> <braceleft>\t : \"⦃\" U2983\t# LEFT WHITE CURLY BRACKET\n<Multi_key> <bar> <braceright>\t : \"⦄\" U2984\t# RIGHT WHITE CURLY BRACKET \n# ⦅⦆⦇⦈⦉⦊ too?\n# The rest of that block?  Some there may be worth it.\n# Ooh.  There are lots of nice brackets to consider: \n# ⟅⟆⟨⟩⟪⟫⟬⟭⟮⟯⦑⦒⦓⦔⦕⦖⦗⦘⧼⧽⧘⧙⧚⧛⸢⸣⸤⸥⸨⸩「」『』\n# Others too, of course, but these to start with.  Some are likely worthy.\n<Multi_key> <S> <parenleft>  \t: \"⟅\" U27C5 \t# LEFT S-SHAPED BAG DELIMITER\n<Multi_key> <S> <parenright>\t: \"⟆\" U27C6 \t# RIGHT S-SHAPED BAG DELIMITER\n# There are a lot of angle brackets (3008/9, 27E8/9, 2329/A).  I'm deciding\n# to go with the mathematical brackets from now on, since they seem to be\n# better supported.\n<Multi_key> <less> <parenleft>\t: \"⟨\" U27E8\t# MATHEMATICAL LEFT ANGLE BRACKET\n<Multi_key> <greater> <parenright>: \"⟩\" U27E9\t# MATHEMATICAL RIGHT ANGLE BRACKET\n<Multi_key> <bar> <bracketleft>\t:   \"⟦\"\tU27E6\t# MATHEMATICAL LEFT WHITE SQUARE BRACKET\n<Multi_key> <bar> <bracketright>:   \"⟧\"\tU27E7\t# MATHEMATICAL RIGHT WHITE SQUARE BRACKET\n<Multi_key> <percent> <parenleft>:  \"⧘\"\tU29D8\t# LEFT WIGGLY FENCE\n<Multi_key> <percent> <parenright>: \"⧙\"\tU29D9\t# RIGHT WIGGLY FENCE\n<Multi_key> <2> <percent> <parenleft>:\t\"⧚\" U29DA   # LEFT DOUBLE WIGGLY FENCE\n<Multi_key> <2> <percent> <parenright>:\t\"⧛\" U29DB   # RIGHT DOUBLE WIGGLY FENCE\n<Multi_key> <parenleft> <ampersand> <parenleft>:  \"⸨\"  U2E28 # LEFT DOUBLE PARENTHESIS\n<Multi_key> <parenright> <ampersand> <parenright>:  \"⸩\"  U2E29 # RIGHT DOUBLE PARENTHESIS\n<Multi_key> <2> <parenleft>:  \"⸨\"  U2E28 # LEFT DOUBLE PARENTHESIS\n<Multi_key> <2> <parenright>:  \"⸩\"  U2E29 # RIGHT DOUBLE PARENTHESIS\n<Multi_key> <Z> <parenleft>\t    : \"༼\"     U0F3C   # TIBETAN MARK ANG KHANG GYON\n<Multi_key> <Z> <parenright>\t    : \"༽\"     U0F3D   # TIBETAN MARK ANG KHANG GYAS\n# I'm thinking shape-mnemonics for these, somehow:\n<Multi_key> <L> <bracketleft>       : \"⌊\"     U230A   # LEFT FLOOR\n<Multi_key> <L> <bracketright>\t    : \"⌋\"     U230B   # RIGHT FLOOR\n<Multi_key> <7> <bracketleft>\t    : \"⌈\"     U2308   # LEFT CEILING\n<Multi_key> <7> <bracketright>\t    : \"⌉\"     U2309   # RIGHT CEILING\n# These are actually quotes, hence the mnemonic.\n<Multi_key> <7> <apostrophe>\t    : \"｢\"     UFF62   # HALFWIDTH LEFT CORNER BRACKET\n<Multi_key> <L> <apostrophe>\t    : \"｣\"     UFF63   # HALFWIDTH RIGHT CORNER BRACKET\n<Multi_key> <7> <quotedbl>\t    : \"『\"    U300E   # LEFT WHITE CORNER BRACKET\n<Multi_key> <L> <quotedbl>\t    : \"』\"    U300F   # RIGHT WHITE CORNER BRACKET\n<Multi_key> <parenleft> <ampersand> <parenright> :  \"≬\"\tU226C\t# BETWEEN\n<Multi_key> <l> <l>\t\t: \"ℓ\" U2113\t# SCRIPT SMALL L\n<Multi_key> <bracketleft> <bracketleft> : \"⊏\"   U228F           # SQUARE IMAGE OF\n<Multi_key> <bracketleft> <equal>       : \"⊑\"   U2291           # SQUARE IMAGE OF OR EQUAL TO\n<Multi_key> <bracketleft> <underscore>  : \"⊑\"   U2291           # SQUARE IMAGE OF OR EQUAL TO\n<Multi_key> <bracketright> <bracketright>: \"⊐\"  U2290           # SQUARE ORIGINAL OF\n<Multi_key> <bracketright> <equal>      : \"⊒\"   U2292           # SQUARE ORIGINAL OF OR EQUAL TO\n<Multi_key> <bracketright> <underscore> : \"⊒\"   U2292           # SQUARE ORIGINAL OF OR EQUAL TO\n# If I did more Haskell, I'd want this more:\n<Multi_key> <underscore> <bar> <underscore>:\t\"⊥\"\t U22A5\t# UP TACK (bottom) or should we use U27C2 PERPENDICULAR?\n<Multi_key> <underscore> <exclam> <underscore>:\t\"⊤\"\t U22A4\t# DOWN TACK (opposite of False)\n<Multi_key> <underscore> <greater> <underscore>:\t\"⊢\"\t U22A2\t# RIGHT TACK\n<Multi_key> <underscore> <less> <underscore>:\t\"⊣\"\t U22A2\t# LEFT TACK\n# Handy for UNIX filenames... but XXX conflicts with standard <Multi_key> <slash> <slash> → \"\\\"\n<Multi_key> <slash> <slash>\t\t: \"⁄\"\tU2044\t# FRACTION SLASH\n\n# The system file gives us subscript numbers, plus/minus, and parens.  But\n# there are letters missing.  It would be nice to have at least a few of them.\n\n# block U+208x\n<Multi_key> <underscore> <0>  \t       : \"₀\"  U2080   \t  # SUBSCRIPT ZERO\n<Multi_key> <underscore> <1>  \t       : \"₁\"  U2081   \t  # SUBSCRIPT ONE\n<Multi_key> <underscore> <2>  \t       : \"₂\"  U2082   \t  # SUBSCRIPT TWO\n<Multi_key> <underscore> <3>  \t       : \"₃\"  U2083   \t  # SUBSCRIPT THREE\n<Multi_key> <underscore> <4>  \t       : \"₄\"  U2084   \t  # SUBSCRIPT FOUR\n<Multi_key> <underscore> <5>  \t       : \"₅\"  U2085   \t  # SUBSCRIPT FIVE\n<Multi_key> <underscore> <6>  \t       : \"₆\"  U2086   \t  # SUBSCRIPT SIX\n<Multi_key> <underscore> <7>  \t       : \"₇\"  U2087   \t  # SUBSCRIPT SEVEN\n<Multi_key> <underscore> <8>  \t       : \"₈\"  U2088   \t  # SUBSCRIPT EIGHT\n<Multi_key> <underscore> <9>  \t       : \"₉\"  U2089   \t  # SUBSCRIPT NONE\n<Multi_key> <underscore> <plus>\t       : \"₊\"  U208A\t  # SUBSCRIPT PLUS\n<Multi_key> <underscore> <minus>       : \"₋\"  U208B\t  # SUBSCRIPT MINUS\n<Multi_key> <underscore> <equal>           : \"₌\"  U208C\t  # SUBSCRIPT EQUALS SIGN\n<Multi_key> <underscore> <parenleft>           : \"₍\"  U208D\t  # SUBSCRIPT LEFT PARENTHESIS\n<Multi_key> <underscore> <parenright>           : \"₎\"  U208E\t  # SUBSCRIPT RIGHT PARENTHESIS\n\n# block U+209x\n<Multi_key> <underscore> <a>\t       : \"ₐ\"  U2090\t  # LATIN SUBSCRIPT SMALL LETTER A\n<Multi_key> <underscore> <e>\t       : \"ₑ\"  U2091\t  # LATIN SUBSCRIPT SMALL LETTER E\n<Multi_key> <underscore> <o>\t       : \"ₒ\"  U2092\t  # LATIN SUBSCRIPT SMALL LETTER O\n<Multi_key> <underscore> <x>\t       : \"ₓ\"  U2093\t  # LATIN SUBSCRIPT SMALL LETTER X\n<Multi_key> <underscore> <h>\t       : \"ₕ\"  U2095\t  # LATIN SUBSCRIPT SMALL LETTER H\n<Multi_key> <underscore> <k>           : \"ₖ\"  U2096\t  # LATIN SUBSCRIPT SMALL LETTER K\n<Multi_key> <underscore> <l>           : \"ₗ\"  U2097\t  # LATIN SUBSCRIPT SMALL LETTER L\n<Multi_key> <underscore> <m>\t       : \"ₘ\"  U2098\t  # LATIN SUBSCRIPT SMALL LETTER M\n<Multi_key> <underscore> <n>\t       : \"ₙ\"  U2099\t  # LATIN SUBSCRIPT SMALL LETTER N\n<Multi_key> <underscore> <p>\t       : \"ₚ\"  U209A\t  # LATIN SUBSCRIPT SMALL LETTER P\n<Multi_key> <underscore> <s>\t       : \"ₛ\"  U209B\t  # LATIN SUBSCRIPT SMALL LETTER S\n<Multi_key> <underscore> <t>\t       : \"ₜ\"  U209C\t  # LATIN SUBSCRIPT SMALL LETTER T\n\n# subscripts in other blocks\n<Multi_key> <underscore> <i>  \t       : \"ᵢ\"  U1D62   \t  # LATIN SUBSCRIPT SMALL LETTER I\n<Multi_key> <underscore> <j>           : \"ⱼ\"  U2C7C\t  # LATIN SUBSCRIPT SMALL LETTER J\n<Multi_key> <underscore> <r>           : \"ᵣ\"  U1D63       # LATIN SUBSCRIPT SMALL LETTER R\n<Multi_key> <underscore> <u>           : \"ᵤ\"  U1D64       # LATIN SUBSCRIPT SMALL LETTER U\n<Multi_key> <underscore> <v>           : \"ᵥ\"  U1D65       # LATIN SUBSCRIPT SMALL LETTER V\n<Multi_key> <underscore> <asterisk> <b> : \"ᵦ\"  U1D66     # GREEK SUBSCRIPT SMALL LETTER BETA\n<Multi_key> <underscore> <asterisk> <g> : \"ᵧ\"  U1D67     # GREEK SUBSCRIPT SMALL LETTER GAMMA\n<Multi_key> <underscore> <asterisk> <r> : \"ᵨ\"  U1D68     # GREEK SUBSCRIPT SMALL LETTER RHO\n<Multi_key> <underscore> <asterisk> <f> : \"ᵩ\"  U1D69     # GREEK SUBSCRIPT SMALL LETTER PHI\n<Multi_key> <underscore> <asterisk> <x> : \"ᵪ\"  U1D6A     # GREEK SUBSCRIPT SMALL LETTER CHI\n\n# Custom additions: Greek letters.  Mapping corresponds to Emacs Greek\n# input method.  Aristotle Pagaltzis informs me that this is the\n# standard Greek keyboard layout, which is good.\n<Multi_key> <asterisk> <a>\t\t: \"α\"\tU03B1\t\t# GREEK SMALL LETTER ALPHA\n<Multi_key> <asterisk> <b>\t\t: \"β\"\tU03B2\t\t# GREEK SMALL LETTER BETA\n<Multi_key> <asterisk> <c>\t\t: \"ψ\"\tU03C8\t\t# GREEK SMALL LETTER PSI\n<Multi_key> <asterisk> <d>\t\t: \"δ\"\tU03B4\t\t# GREEK SMALL LETTER DELTA\n<Multi_key> <asterisk> <e>\t\t: \"ε\"\tU03B5\t\t# GREEK SMALL LETTER EPSILON\n<Multi_key> <asterisk> <f>\t\t: \"φ\"\tU03C6\t\t# GREEK SMALL LETTER PHI\n<Multi_key> <asterisk> <g>\t\t: \"γ\"\tU03B3\t\t# GREEK SMALL LETTER GAMMA\n<Multi_key> <asterisk> <h>\t\t: \"η\"\tU03B7\t\t# GREEK SMALL LETTER ΕΤΑ\n<Multi_key> <asterisk> <i>\t\t: \"ι\"\tU03B9\t\t# GREEK SMALL LETTER ΙΟΤΑ\n<Multi_key> <asterisk> <j>\t\t: \"ξ\"\tU03BE\t\t# GREEK SMALL LETTER XI\n<Multi_key> <asterisk> <k>\t\t: \"κ\"\tU03BA\t\t# GREEK SMALL LETTER KAPPA\n<Multi_key> <asterisk> <l>\t\t: \"λ\"\tU03BB\t\t# GREEK SMALL LETTER LAMBDA\n<Multi_key> <asterisk> <m>\t\t: \"μ\"\tU03BC\t\t# GREEK SMALL LETTER MU\n<Multi_key> <asterisk> <n>\t\t: \"ν\"\tU03BD\t\t# GREEK SMALL LETTER NU\n<Multi_key> <asterisk> <o>\t\t: \"ο\"\tU03BF\t\t# GREEK SMALL LETTER OMICRON\n<Multi_key> <asterisk> <p>\t\t: \"π\"\tU03C0\t\t# GREEK SMALL LETTER PI\n# no mapping for q; in Emacs that's \";\"\n# U037E GREEK QUESTION MARK is canonically equivalent to U003B SEMICOLON.\n<Multi_key> <asterisk> <r>\t\t: \"ρ\"\tU03C1\t\t# GREEK SMALL LETTER RHO\n<Multi_key> <asterisk> <s>\t\t: \"σ\"\tU03C3\t\t# GREEK SMALL LETTER SIGMA\n<Multi_key> <asterisk> <t>\t\t: \"τ\"\tU03C4\t\t# GREEK SMALL LETTER TAU\n<Multi_key> <asterisk> <u>\t\t: \"θ\"\tU03B8\t\t# GREEK SMALL LETTER THETA\n<Multi_key> <asterisk> <v>\t\t: \"ω\"\tU03C9\t\t# GREEK SMALL LETTER OMEGA\n<Multi_key> <asterisk> <w>\t\t: \"ς\"\tU03C2\t\t# GREEK SMALL LETTER FINAL SIGMA\n<Multi_key> <asterisk> <x>\t\t: \"χ\"\tU03C7\t\t# GREEK SMALL LETTER CHI\n<Multi_key> <asterisk> <y>\t\t: \"υ\"\tU03C5\t\t# GREEK SMALL LETTER UPSILON\n<Multi_key> <asterisk> <z>\t\t: \"ζ\"\tU03B6\t\t# GREEK SMALL LETTER ZETA\n\n# Capital greek letters.\n<Multi_key> <asterisk> <A>\t\t: \"Α\"\tU0391\t\t# GREEK CAPITAL LETTER ALPHA\n<Multi_key> <asterisk> <B>\t\t: \"Β\"\tU0392\t\t# GREEK CAPITAL LETTER BETA\n<Multi_key> <asterisk> <C>\t\t: \"Ψ\"\tU03A8\t\t# GREEK CAPITAL LETTER PSI\n<Multi_key> <asterisk> <D>\t\t: \"Δ\"\tU0394\t\t# GREEK CAPITAL LETTER DELTA\n<Multi_key> <asterisk> <E>\t\t: \"Ε\"\tU0395\t\t# GREEK CAPITAL LETTER EPSILON\n<Multi_key> <asterisk> <F>\t\t: \"Φ\"\tU03A6\t\t# GREEK CAPITAL LETTER PHI\n<Multi_key> <asterisk> <G>\t\t: \"Γ\"\tU0393\t\t# GREEK CAPITAL LETTER GAMMA\n<Multi_key> <asterisk> <H>\t\t: \"Η\"\tU0397\t\t# GREEK CAPITAL LETTER ΕΤΑ\n<Multi_key> <asterisk> <I>\t\t: \"Ι\"\tU0399\t\t# GREEK CAPITAL LETTER ΙΟΤΑ\n<Multi_key> <asterisk> <J>\t\t: \"Ξ\"\tU039E\t\t# GREEK CAPITAL LETTER XI\n<Multi_key> <asterisk> <K>\t\t: \"Κ\"\tU039A\t\t# GREEK CAPITAL LETTER KAPPA\n<Multi_key> <asterisk> <L>\t\t: \"Λ\"\tU039B\t\t# GREEK CAPITAL LETTER LAMBDA\n<Multi_key> <asterisk> <M>\t\t: \"Μ\"\tU039C\t\t# GREEK CAPITAL LETTER MU\n<Multi_key> <asterisk> <N>\t\t: \"Ν\"\tU039D\t\t# GREEK CAPITAL LETTER NU\n<Multi_key> <asterisk> <O>\t\t: \"Ο\"\tU039F\t\t# GREEK CAPITAL LETTER OMICRON\n<Multi_key> <asterisk> <P>\t\t: \"Π\"\tU03A0\t\t# GREEK CAPITAL LETTER PI\n# see below for Q qoppa; in Emacs Q is “:”\n<Multi_key> <asterisk> <R>\t\t: \"Ρ\"\tU03A1\t\t# GREEK CAPITAL LETTER RHO\n<Multi_key> <asterisk> <S>\t\t: \"Σ\"\tU03A3\t\t# GREEK CAPITAL LETTER SIGMA\n<Multi_key> <asterisk> <T>\t\t: \"Τ\"\tU03A4\t\t# GREEK CAPITAL LETTER TAU\n<Multi_key> <asterisk> <U>\t\t: \"Θ\"\tU0398\t\t# GREEK CAPITAL LETTER THETA\n<Multi_key> <asterisk> <V>\t\t: \"Ω\"\tU03A9\t\t# GREEK CAPITAL LETTER OMEGA\n# Emacs maps W to \"Σ\", but I think that’s stupid\n# I think that's from the Greek keyboard.\n<Multi_key> <asterisk> <X>\t\t: \"Χ\"\tU03A7\t\t# GREEK CAPITAL LETTER CHI\n<Multi_key> <asterisk> <Y>\t\t: \"Υ\"\tU03A5\t\t# GREEK CAPITAL LETTER UPSILON\n<Multi_key> <asterisk> <Z>\t\t: \"Ζ\"\tU0396\t\t# GREEK CAPITAL LETTER ZETA\n\n# Some archaic Greek.  If we only wanted *normal* characters we wouldn't be\n# doing this at all!\n# \"period\" will indicate a sort of variant of some kind; asterisk is still the \"greek\" marker\n<Multi_key> <asterisk> <period> <p>\t: \"ϖ\"\tU03D6\t\t# GREEK PI SYMBOL\n# Reserving .f in case we want PHI SYMBOL.  Digamma was \"w\" sound anyway.\n<Multi_key> <asterisk> <period> <w>\t: \"ϝ\"\tU03DD\t\t# GREEK SMALL LETTER DIGAMMA\n<Multi_key> <asterisk> <period> <W>\t: \"Ϝ\"\tU03DC\t\t# GREEK CAPITAL LETTER DIGAMMA\n<Multi_key> <asterisk> <Q>\t: \"Ϟ\"\tU03DE\t# GREEK LETTER QOPPA\n<Multi_key> <asterisk> <q>\t: \"ϟ\"\tU03DF\t# GREEK SMALL LETTER QOPPA\n<Multi_key> <asterisk> <period> <Q>\t: \"Ϙ\"\tU03D8\t# GREEK LETTER ARCHAIC QOPPA\n<Multi_key> <asterisk> <period> <q>\t: \"ϙ\"\tU03D9\t# GREEK SMALL LETTER ARCHAIC QOPPA\n<Multi_key> <asterisk> <ampersand>\t: \"ϗ\"\tU03D7\t# GREEK KAI SYMBOL\n<Multi_key> <asterisk> <period> <Z>\t: \"Ϡ\"\tU03E0\t# GREEK LETTER SAMPI\n<Multi_key> <asterisk> <period> <z>\t: \"ϡ\"\tU03E1\t# GREEK SMALL LETTER SAMPI\n<Multi_key> <asterisk> <period> <period> <Z> : \"Ͳ\"  U0372  # GREEK CAPITAL LETTER ARCHAIC SAMPI\n<Multi_key> <asterisk> <period> <period> <z> : \"ͳ\"  U0373  # GREEK SMALL LETTER ARCHAIC SAMPI\n# Sorry, couldn't think of better ones for these.  Might want .s for SAN.\n<Multi_key> <asterisk> <question>      : \"Ϛ\"\tU03DA\t# GREEK LETTER STIGMA\n<Multi_key> <asterisk> <slash>\t       : \"ϛ\"\tU03DB\t# GREEK SMALL LETTER STIGMA\n<Multi_key> <asterisk> <apostrophe>    : \"ʹ\"\tU02B9\t# MODIFIER LETTER PRIME, canonically equivalent to U0374 GREEK NUMERAL SIGN\n# While we're at it...\n<Multi_key> <asterisk> <period> <apostrophe>\t: \"′\"\tU2032\t# PRIME\n<Multi_key> <asterisk> <period> <quotedbl>      : \"″\"\tU2033\t# DOUBLE PRIME\n<Multi_key> <asterisk> <comma>\t       : \"͵\"\tU0375\t# GREEK LOWER NUMERAL SIGN (for thousands)\n# Do we want BETA SYMBOL, RHO SYMBOL, KAPPA SYMBOL, PHI SYMBOL, THETA SYMBOL?\n# The format makes them obvious enough I guess.  PI SYMBOL is different enough\n# that there's no question, and it is separate from these.\n<Multi_key> <asterisk> <period> <b>    : \"ϐ\"\tU03D0\t# GREEK BETA SYMBOL\n<Multi_key> <asterisk> <period> <u>    : \"ϑ\"\tU03D1\t# GREEK THETA SYMBOL\n<Multi_key> <asterisk> <period> <Y>    : \"ϒ\"\tU03D2\t# GREEK UPSILON WITH HOOK SYMBOL\n<Multi_key> <asterisk> <period> <f>    : \"ϕ\"\tU03D5\t# GREEK PHI SYMBOL\n<Multi_key> <asterisk> <period> <k>    : \"ϰ\"\tU03F0\t# GREEK KAPPA SYMBOL\n<Multi_key> <asterisk> <period> <r>    : \"ϱ\"\tU03F1\t# GREEK RHO SYMBOL\n<Multi_key> <asterisk> <period> <U>    : \"ϴ\"\tU03F4\t# GREEK CAPITAL THETA SYMBOL\n<Multi_key> <asterisk> <period> <e>    : \"ϵ\"\tU03F5\t# GREEK LUNATE EPSILON SYMBOL\n# Not doing the lunate sigmas and dotted versions thereof...  What about SAN, which is at least a letter?\n<Multi_key> <asterisk> <period> <s>\t : \"ϻ\"\t  U03FB\t      # GREEK SMALL LETTER SAN\n<Multi_key> <asterisk> <period> <S>\t : \"Ϻ\"\t  U03FA\t      # GREEK CAPITAL LETTER SAN\n\n# If you wanted to actually type in Greek, you would also need άίέ\n# etc.  But you would probably just switch to a Greek keyboard layout.\n\n# Custom additions: fractions\n<Multi_key> <1> <3>                     : \"⅓\"  U2153           # VULGAR FRACTION ONE THIRD\n<Multi_key> <2> <3>                     : \"⅔\"  U2154           # VULGAR FRACTION TWO THIRDS\n# more extensive fractions from jsled\n<Multi_key> <1> <5>                     : \"⅕\"  U2155           # VULGAR FRACTION ONE FIFTH\n<Multi_key> <2> <5>                     : \"⅖\" U2156            # VULGAR FRACTION TWO FIFTHS\n<Multi_key> <3> <5>                     : \"⅗\" U2157            # VULGAR FRACTION THREE FIFTHS\n<Multi_key> <4> <5>                     : \"⅘\" U2158            # VULGAR FRACTION FOUR FIFTHS\n<Multi_key> <1> <6>                     : \"⅙\" U2159            # VULGAR FRACTION ONE SIXTH\n<Multi_key> <5> <6>                     : \"⅚\" U215A            # VULGAR FRACTION FIVE SIXTHS\n<Multi_key> <1> <8>                     : \"⅛\" U215B           # VULGAR FRACTION ONE EIGHTH\n<Multi_key> <3> <8>                     : \"⅜\" U215C           # VULGAR FRACTION THREE EIGHTHS\n<Multi_key> <5> <8>                     : \"⅝\" U215D           # VULGAR FRACTION FIVE EIGHTHS\n<Multi_key> <7> <8>                     : \"⅞\" U215E           # VULGAR FRACTION SEVEN EIGHTHS\n<Multi_key> <1> <7>\t\t\t: \"⅐\" U2150\t      # VULGAR FRACTION ONE SEVENTH\n<Multi_key> <1> <9>\t\t\t: \"⅑\" U2151\t      # VULGAR FRACTION ONE NINTH\n<Multi_key> <1> <x>\t\t\t: \"⅒\" U2152\t      # VULGAR FRACTION ONE TENTH\n<Multi_key> <0> <3>\t\t\t: \"↉\" U2189\t      # VULGAR FRACTION ZERO THIRDS\n<Multi_key> <1> <slash>\t\t\t: \"⅟\" U215F\t      # FRACTION NUMERATOR ONE\n\n# How about roman numerals?  Percent for numerical mnemonic?\n# Does this go against the spirit of this file?  These symbols are accessible \n# as regular letters and would look okay.  Maybe only for I-X?\n<Multi_key> <percent> <1>\t\t: \"ⅰ\"\tU2170\t\t# SMALL ROMAN NUMERAL ONE\n<Multi_key> <percent> <2>\t\t: \"ⅱ\"\tU2171\t\t# SMALL ROMAN NUMERAL TWO\n<Multi_key> <percent> <3>\t\t: \"ⅲ\"\tU2172\t\t# SMALL ROMAN NUMERAL THREE\n<Multi_key> <percent> <4>\t\t: \"ⅳ\"\tU2173\t\t# SMALL ROMAN NUMERAL FOUR\n<Multi_key> <percent> <5>\t\t: \"ⅴ\"\tU2174\t\t# SMALL ROMAN NUMERAL FIVE\n<Multi_key> <percent> <6>\t\t: \"ⅵ\"\tU2175\t\t# SMALL ROMAN NUMERAL SIX\n<Multi_key> <percent> <7>\t\t: \"ⅶ\"\tU2176\t\t# SMALL ROMAN NUMERAL SEVEN\n<Multi_key> <percent> <8>\t\t: \"ⅷ\"\tU2177\t\t# SMALL ROMAN NUMERAL EIGHT\n<Multi_key> <percent> <9>\t\t: \"ⅸ\"\tU2178\t\t# SMALL ROMAN NUMERAL NINE\n<Multi_key> <percent> <x>\t\t: \"ⅹ\"\tU2179\t\t# SMALL ROMAN NUMERAL TEN\n# How do we handle eleven and twelve?\n<Multi_key> <percent> <underscore> <1>\t: \"ⅺ\"\tU217A\t\t# SMALL ROMAN NUMERAL ELEVEN\n<Multi_key> <percent> <underscore> <2>\t: \"ⅻ\"\tU217B\t\t# SMALL ROMAN NUMERAL TWELVE\n# That okay?\n<Multi_key> <percent> <l>\t\t: \"ⅼ\"\tU217C\t\t# SMALL ROMAN NUMERAL FIFTY\n<Multi_key> <percent> <c>\t\t: \"ⅽ\"\tU217D\t\t# SMALL ROMAN NUMERAL ONE HUNDRED\n<Multi_key> <percent> <d>\t\t: \"ⅾ\"\tU217E\t\t# SMALL ROMAN NUMERAL FIVE HUNDRED\n<Multi_key> <percent> <m>\t\t: \"ⅿ\"\tU217F\t\t# SMALL ROMAN NUMERAL ONE THOUSAND\n###\n<Multi_key> <percent> <0> <1>\t\t: \"Ⅰ\"\tU2160\t\t# ROMAN NUMERAL ONE\n<Multi_key> <percent> <0> <2>\t\t: \"Ⅱ\"\tU2161\t\t# ROMAN NUMERAL TWO\n<Multi_key> <percent> <0> <3>\t\t: \"Ⅲ\"\tU2162\t\t# ROMAN NUMERAL THREE\n<Multi_key> <percent> <0> <4>\t\t: \"Ⅳ\"\tU2163\t\t# ROMAN NUMERAL FOUR\n<Multi_key> <percent> <0> <5>\t\t: \"Ⅴ\"\tU2164\t\t# ROMAN NUMERAL FIVE\n<Multi_key> <percent> <0> <6>\t\t: \"Ⅵ\"\tU2165\t\t# ROMAN NUMERAL SIX\n<Multi_key> <percent> <0> <7>\t\t: \"Ⅶ\"\tU2166\t\t# ROMAN NUMERAL SEVEN\n<Multi_key> <percent> <0> <8>\t\t: \"Ⅷ\"\tU2167\t\t# ROMAN NUMERAL EIGHT\n<Multi_key> <percent> <0> <9>\t\t: \"Ⅸ\"\tU2168\t\t# ROMAN NUMERAL NINE\n<Multi_key> <percent> <0> <x>\t\t: \"Ⅹ\"\tU2169\t\t# ROMAN NUMERAL TEN\n# How do we handle eleven and twelve?\n<Multi_key> <percent> <underscore> <0> <1>\t: \"Ⅺ\"\tU216A\t# ROMAN NUMERAL ELEVEL\n<Multi_key> <percent> <underscore> <0> <2>\t: \"Ⅻ\"\tU216B\t# ROMAN NUMERAL TWELVE\n<Multi_key> <percent> <0> <l>\t\t: \"Ⅼ\"\tU216C\t\t# ROMAN NUMERAL FIFTY\n<Multi_key> <percent> <0> <c>\t\t: \"Ⅽ\"\tU216D\t\t# ROMAN NUMERAL ONE HUNDRED\n<Multi_key> <percent> <0> <d>\t\t: \"Ⅾ\"\tU216E\t\t# ROMAN NUMERAL FIVE HUNDRED\n<Multi_key> <percent> <0> <m>\t\t: \"Ⅿ\"\tU216F\t\t# ROMAN NUMERAL ONE THOUSAND\n<Multi_key> <percent> <X>\t\t: \"Ⅹ\"\tU2169\t\t# ROMAN NUMERAL TEN\n<Multi_key> <percent> <L>\t\t: \"Ⅼ\"\tU216C\t\t# ROMAN NUMERAL FIFTY\n<Multi_key> <percent> <C>\t\t: \"Ⅽ\"\tU216D\t\t# ROMAN NUMERAL ONE HUNDRED\n<Multi_key> <percent> <D>\t\t: \"Ⅾ\"\tU216E\t\t# ROMAN NUMERAL FIVE HUNDRED\n<Multi_key> <percent> <M>\t\t: \"Ⅿ\"\tU216F\t\t# ROMAN NUMERAL ONE THOUSAND\n<Multi_key> <percent> <0> <C> <D>\t: \"ↀ\"\tU2180\t\t# ROMAN NUMERAL ONE THOUSAND C D\n<Multi_key> <percent> <0> <D> \t\t: \"ↁ\"\tU2181\t\t# ROMAN NUMERAL FIVE THOUSAND\n<Multi_key> <percent> <0> <M>\t\t: \"ↂ\"\tU2182\t\t# ROMAN NUMERAL TEN THOUSAND\n<Multi_key> <percent> <0> <0> <D>\t: \"ↇ\"\tU2187\t\t# ROMAN NUMERAL FIFTY THOUSAND\n<Multi_key> <percent> <0> <0> <M>\t: \"ↈ\"\tU2188\t\t# ROMAN NUMERAL ONE HUNDRED THOUSAND\n\n\n# Custom additions: for chat (kragen)\n<Multi_key> <parenleft> <colon>         : \"☻\"   U263B           # BLACK SMILING FACE\n<Multi_key> <colon> <parenright>        : \"☺\"   U263A           # WHITE SMILING FACE\n<Multi_key> <colon> <parenleft>         : \"☹\"   U2639           # WHITE FROWNING FACE\n<Multi_key> <colon> <asciitilde>\t: \"⍨\"   U2368\t\t# APL FUNCTIONAL SYMBOL TILDE DIAERESIS\n<Multi_key> <colon> <bar>\t\t: \"⸚\"   U2E1A\t\t# HYPHEN WITH DIAERESIS\n<Multi_key> <colon> <o> <o> <parenright>  :  \"°͜°\"    # Funny smiley-face.\n# Those are archaic cyrilic letters... but look so _perfect_ for use\n# in chat. And about the last, the \"multiocular O\"... Well, I don't\n# know what it can be used for, but given the description, how could I\n# leave it out‽\n# (I guess using U+1F440 EYES would be more straightforward, but not as funny?)\n<Multi_key> <O> <period> <O>\t\t: \"Ꙭ\"\tUA66C\t\t# CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O * used in the dual of words based on the root for 'eye'\n<Multi_key> <o> <period> <o>\t\t: \"ꙭ\"  UA66D\t\t# CYRILLIC SMALL LETTER DOUBLE MONOCULAR O\n<Multi_key> <O> <colon>\t \t\t: \"Ꙫ\"  UA66A\t\t# CYRILLIC CAPITAL LETTER BINOCULAR O * used in the dual of words based on the root for 'eye'\n<Multi_key> <o> <colon> \t\t: \"ꙫ\"  UA66B \t\t# CYRILLIC SMALL LETTER BINOCULAR O\n<Multi_key> <o> <plus>\t\t\t: \"ꙮ\"  UA66E\t\t# CYRILLIC LETTER MULTIOCULAR O * used in the epithet 'many-eyed'\n# While we're doing stacks of circles with dots.\n<Multi_key> <o> <3>\t\t\t: \"߷\"\tU07F7\t\t# NKO SYMBOL GBAKURUNEN\n<Multi_key> <exclam> <question>         : \"‽\"   U203D           # INTERROBANG\n<Multi_key> <question> <exclam>         : \"⸘\"\tU2E18\t\t# INVERTED INTERROBANG, standard now.\n<Multi_key> <questiondown> <exclamdown>\t: \"⸘\"\tU2E18\t\t# INVERTED INTERROBANG (if you have a ¡ key.  Otherwise...? \"?i\" maybe?\n<Multi_key> <exclamdown> <questiondown>\t: \"⸘\"\tU2E18\t\t# INVERTED INTERROBANG (if you have a ¡ key.  Otherwise...? \"?i\" maybe?\n<Multi_key> <question> <less>\t      : \"⸮\"\t  U2E2E\t\t# REVERSED QUESTION MARK\n<Multi_key> <question> <BackSpace>      : \"⸮\"\t  U2E2E\t\t# REVERSED QUESTION MARK\n<Multi_key> <question> <ampersand> <question>\t  : \"⁇\"\t U2047\t# DOUBLE QUESTION MARK\n<Multi_key> <2> <question>\t  : \"⁇\"\t U2047\t# DOUBLE QUESTION MARK\n<Multi_key> <question> <ampersand> <exclam>\t  : \"⁈\"\t U2048\t# QUESTION EXCLAMATION MARK\n<Multi_key> <exclam> <ampersand> <question>\t  : \"⁉\"\t U2049\t# EXCLAMATION QUESTION MARK\n<Multi_key> <exclam> <ampersand> <exclam>\t  : \"‼\"\t U203C\t# DOUBLE EXCLAMATION MARK\n<Multi_key> <2> <exclam>\t  : \"‼\"\t U203C\t# DOUBLE EXCLAMATION MARK\n<Multi_key> <2> <colon>\t\t  : \"∷\"\t U2237\t# PROPORTION -- not strictly 2 times COLON\n<Multi_key> <semicolon> <less>\t \t\t  : \"⁏\"\t U204F\t# REVERSED SEMICOLON\n<Multi_key> <semicolon> <BackSpace>\t \t\t  : \"⁏\"\t U204F\t# REVERSED SEMICOLON\n# Keep looking into big hunks of Latin Extended-D, A720- et seq.\n<Multi_key> <less> <3>                  : \"♥\"  U2665            # BLACK HEART SUIT\n<Multi_key> <3> <3>\t\t\t: \"♣\" U2663\t\t# BLACK CLUB SUIT\n<Multi_key> <o> <8>\t\t\t: \"♣\" U2663\t\t# BLACK CLUB SUIT\n<Multi_key> <c> <3>\t\t\t: \"♣\" U2663\t\t# BLACK CLUB SUIT\n<Multi_key> <less> <greater>\t\t: \"♢\" U2662\t\t# WHITE DIAMOND SUIT\n<Multi_key> <3> <minus>\t\t: \"♠\" U2660\t\t# BLACK SPADE SUIT\n<Multi_key> <less> <braceright>\t: \"♠\" U2660\t\t# BLACK SPADE SUIT\n<Multi_key> <E> <greater>\t\t: \"♡\" U2661\t\t# WHITE HEART SUIT\n# \"shamrock\" is too long; there IS a limit to these!\n<Multi_key> <Multi_key> <s> <h> <m> <r> <c> <k>\t\t: \"☘\" U2618   # SHAMROCK\n<Multi_key> <Multi_key> <s> <h> <a> <m> <r> <o>\t\t: \"☘\" U2618   # SHAMROCK\n<Multi_key> <Multi_key> <p> <c>         : \"☮\"   U262E           # PEACE SYMBOL\n<Multi_key> <Multi_key> <p> <e> <a> <c> <e> : \"☮\"   U262E           # PEACE SYMBOL\n<Multi_key> <Multi_key> <y> <y>\t\t: \"☯\" U262F\t\t# YIN YANG\n<Multi_key> <Multi_key> <y> <i>\t<n> <y> <a> <n>\t: \"☯\" U262F\t# YIN YANG\n# And now that we are into hearts...\n<Multi_key> <Left> <less> <3>           : \"❥\"  U2765            # ROTATED HEAVY BLACK HEART BULLET\n<Multi_key> <exclam> <less> <3>         : \"❣\"  U2763            # HEAVY HEART EXCLAMATION MARK ORNAMENT\n<Multi_key> <f> <less> <3>              : \"❦\"  U2766            # FLORAL HEART\n<Multi_key> <Left> <f> <less> <3>       : \"❧\"  U2767            # ROTATED FLORAL HEART BULLET\n<Multi_key> <Right> <f> <less> <3>      : \"☙\"  U2619            # REVERSED ROTATED FLORAL HEART BULLET\n<Multi_key> <Multi_key> <t> <e> <l>\t\t\t: \"☎\" \tU260E\t\t# BLACK TELEPHONE\n<Multi_key> <Multi_key> <t> <e> <a>\t\t: \"☕\"\tU2615\t\t# HOT BEVERAGE\n# These last two bother me less, though they can still be improved.\n# Other possibly useful symbols:\n# 2668 HOT SPRINGS (for chat, for running off to shower?)\n# I want 2713-2714 and 2717-2718\n# We need a Dingbats prefix, for ❛❜❝❞❢\n<Multi_key> <bracketleft> <space> <bracketright> :\t\"☐\"\tU2610\t# BALLOT BOX\n# Better keystrokes anyone?  This one breaks the pattern. [c]? [v]? [y]? [/]?\n<Multi_key> <Multi_key> <c> <h> <k>\t      :\t \"☑\"  U2611\t\t# BALLOT BOX WITH CHECK\n<Multi_key> <bracketleft> <slash> <bracketright>     :\t \"☑\"  U2611\t\t# BALLOT BOX WITH CHECK\n<Multi_key> <bracketleft> <x> <bracketright>  :\t \"☒\"  U2612\t\t# BALLOT BOX WITH X\n# @ for dingbats?\n<Multi_key> <at> <slash>\t:\t\"✓\"\tU2713\t# CHECK MARK\n<Multi_key> <at> <at> <slash>\t:\t\"✔\"\tU2714\t# HEAVY CHECK MARK\n<Multi_key> <at> <X>  \t\t:\t\"✗\"\tU2717\t# BALLOT X\n<Multi_key> <at> <at> <X>\t:\t\"✘\"\tU2718\t# HEAVY BALLOT X\n# Will I want <at> <at> for something else?\n# Now there is such a thing as text style and emoji style.  Use the\n# \"dingbat prefix\" in an unusual way:\n<Multi_key> <at> <Multi_key>\t:\t\"️\"\tUFE0F\t\t# Emoji selector\n<Multi_key> <exclam> <Multi_key>\t:\t\"︎\"\t\tUFE0E\t# Text selector\n# How about dice?\n<Multi_key> <bracketleft> <1> <bracketright>  :  \"⚀\"  U2680\t# DIE FACE-1\n<Multi_key> <bracketleft> <2> <bracketright>  :  \"⚁\"  U2681\t# DIE FACE-2\n<Multi_key> <bracketleft> <3> <bracketright>  :  \"⚂\"  U2682\t# DIE FACE-3\n<Multi_key> <bracketleft> <4> <bracketright>  :  \"⚃\"  U2683\t# DIE FACE-4\n<Multi_key> <bracketleft> <5> <bracketright>  :  \"⚄\"  U2684\t# DIE FACE-5\n<Multi_key> <bracketleft> <6> <bracketright>  :  \"⚅\"  U2685\t# DIE FACE-6\n# 267B BLACK UNIVERSAL RECYCLING SYMBOL\n\n# Keystrokes okay?\n<Multi_key> <Multi_key> <f> <d> <l>   \t        : \"⚜\"\tU269C\t  # FLEUR-DE-LIS\n<Multi_key> <Multi_key> <a> <t> <o> <m>\t        : \"⚛\"\tU269B\t\t# ATOM SYMBOL\n<Multi_key> <Multi_key> <c> <c> <c> <p>\t\t: \"☭\" \tU262D\t\t# HAMMER AND SICKLE\n<Multi_key> <slash> <exclam> <backslash> : \"⚠\"  U26A0           # WARNING SIGN\n<Multi_key> <exclam> <asciicircum>\t: \"⚠\"\tU26A0\t\t# WARNING SIGN \n<Multi_key> <Multi_key> <z> <a> <p>\t  \t\t: \"⚡\"\tU26A1\t\t# HIGH VOLTAGE SIGN \n# Shouldn't use just <r><a> because it's too likely to be a prefix for\n# a useful word.\n<Multi_key> <Multi_key> <r> <a> <d>\t: \"☢\"\tU2622\t\t# RADIOACTIVE SIGN\n<Multi_key> <Multi_key> <b> <h>\t\t: \"☣\"\tU2623\t\t# BIOHAZARD SIGN\n<Multi_key> <Multi_key> <b> <i> <o> <h>\t<a> <z>\t: \"☣\"\tU2623\t\t# BIOHAZARD SIGN\n# Changing this from ⚝\n<Multi_key> <Multi_key> <A> <A> <A> <A> <A>\t:\t\"⛤\" U26E4 # PENTAGRAM (pentalpha, get it?)\n<Multi_key> <Multi_key> <p> <l> <a> <n> <e>\t: \"✈\"   U2708\t  # AIRPLANE\n<Multi_key> <Multi_key> <m> <a> <i> <l>\t\t: \"✉\"\tU2709\t  # ENVELOPE\n<Multi_key> <Multi_key> <w> <h> <l> <c> <h>\t: \"♿\"\tU267F\t  # WHEELCHAIR SYMBOL\n<Multi_key> <Multi_key> <m> <e> <d> \t\t: \"☤\"\tU2624\t  # CADEUCEUS\n# Something different for STAFF OF AESCULAPIUS?\n<Multi_key> <Multi_key> <1> <m> <e> <d>\t\t: \"⚕\"\tU2695\t# STAFF OF AESCULAPIUS\n# 26B0 COFFIN ?\n# One of the SNOWFLAKEs?\n# SNOWMAN? COMET? ANCHOR?\n# Maybe if we go with having a \"word\" symbol and spelling out lots and \n# lots of whole words, we can have all the planets.\n#\n# I already have STAR OF DAVID on another map.\n# 231A, 231B -- WATCH and HOURGLASS -- one should be &-w-a-i-t\n# 23D4 METRICAL LONG OVER TWO SHORTS a.k.a. METRICAL BOOBS\n# 0950 DEVANAGARI OM?\n# 212E ESTIMATED SYMBOL?\n# 2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS a.k.a. NOT AMUSED\n# 237E BELL SYMBOL a.k.a. ALIENS LANDING\n\n<Multi_key> <o> <minus> <plus>\t\t: \"♀\"\tU2640\t\t# FEMALE SIGN\n<Multi_key> <o> <minus> <greater>\t: \"♂\"\tU2642\t\t# MALE SIGN\n\n<Multi_key> <Multi_key> <g> <a> <y>                 :   \"⚣\"     U26A3   # DOUBLED MALE SIGN\n<Multi_key> <Multi_key> <l> <e> <s> <b> <i> <a> <n> :   \"⚢\"     U26A2   # DOUBLED FEMALE SIGN\n<Multi_key> <Multi_key> <h> <e> <t> <e> <r> <o>     :   \"⚤\"     U26A4   # INTERLOCKED FEMALE AND MALE SIGN\n\n# 'trans': short for transgender/transexual\n# 'genderq': short for genderqueer.\n# Wasn't sure which to call which symbol, and wanted to include both\n<Multi_key> <Multi_key> <t> <r> <a> <n> <s>         :   \"⚥\"     U26A5   # MALE AND FEMALE SIGN\n<Multi_key> <Multi_key> <g> <e> <n> <d> <e> <r> <q> :   \"⚧\"     U26A7   # MALE WITH STROKE AND MALE AND FEMALE SIGN\n\n\n<Multi_key> <O> <X>: \t\t\t\"☠\" U2620 # SKULL AND CROSSBONES\n<Multi_key> <Multi_key> <d> <e> <a> <t> <h>:\t  \"☠\" U2620 # SKULL AND CROSSBONES\n<Multi_key> <Multi_key> <X> <b> <o> <n> <e> <s>:\t  \"☠\" U2620 # SKULL AND CROSSBONES\n<Multi_key> <Multi_key> <k> <b> <d> :\t\"⌨\"\t  U2328\t    # KEYBOARD\n<Multi_key> <Multi_key> <r> <h> <a> <n> <d>\t: \"☞\" U261E # WHITE RIGHT POINTING INDEX\n<Multi_key> <Multi_key> <l> <h> <a> <n> <d>\t: \"☜\" U261C # WHITE LEFT POINTING INDEX\n<Multi_key> <asterisk> <asterisk>\t:\"★\" U2605 # BLACK STAR\n<Multi_key> <asterisk> <0>\t:\"☆\" U2606 # WHITE STAR\n<Multi_key> <asterisk> <minus>\t:\"✪\" U272A # CIRCLED WHITE STAR\n<Multi_key> <asterisk> <3>\t:\"⁂\" U2042 # ASTERISM\n<Multi_key> <3> <asterisk>\t:\"⁂\" U2042 # ASTERISM\n<Multi_key> <2> <asterisk>\t:\"⁑\" U2051 # TWO ASTERISKS ALIGNED VERTICALLY\n<Multi_key> <asterisk> <4>      :\"✢\"  U2722  # FOUR TEARDROP-SPOKED ASTERISK\n<Multi_key> <asterisk> <6>\t:\"✡\" U2721 # STAR OF DAVID\n<Multi_key> <asterisk> <numbersign>\t:\"✯\" U272F # PINWHEEL STAR\n<Multi_key> <asterisk> <exclam>\t:\"✱\" U2731 # HEAVY ASTERISK\n<Multi_key> <less> <X> <greater> :  \"❖\"\tU2756\t# BLACK DIAMOND MINUS WHITE X\n<Multi_key> <at> <numbersign>\t: \"⌘\" U2318\t# PLACE OF INTEREST SIGN\n# Using backslash-minus-slash etc. conflicts with combining accents.\n<Multi_key> <grave> <minus> <apostrophe>\t : \"⚞\"\tU269E  # THREE LINES CONVERGING RIGHT\n<Multi_key> <apostrophe> <minus> <grave>\t : \"⚟\"\tU269F  # THREE LINES CONVERGING LEFT\n<Multi_key> <Multi_key> <B> <e> <l> <l> <s> <y> <m>\t: \"⍾\" U237E  # BELL SYMBOL (or ALIENS LANDING) -- &-a-l-i-e-n ?\n# Other monstery characters... ѪꙚ (alien abductions?)\n# ඏൠഋ & others from Kannada et al...?\n# Can't use -^- for this; conflicts with -^ for ↑, and getting those arrows\n# workable was complicated enough.  How about this?\n<Multi_key> <underscore> <asciicircum> <underscore>\t: \"⌤\" U2324  # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS; aka ENTER KEY, aka NOT AMUSED.\n<Multi_key> <Multi_key> <w> <a> <i> <t>\t\t: \"⌛\" U231B   # HOURGLASS\n<Multi_key> <Multi_key> <h> <o> <u> <r>\t\t: \"⌛\" U231B   # HOURGLASS\n<Multi_key> <Multi_key> <t> <i> <m> <e>\t\t: \"⌚\" U231A   # WATCH\n<Multi_key> <Multi_key> <w> <a> <t> <c> <h>\t: \"⌚\" U231A   # WATCH\n<Multi_key> <space> <N>\t\t  : \" \"\tU2002  # EN SPACE\n<Multi_key> <space> <M>\t\t  : \" \" U2003  # EM SPACE\n<Multi_key> <space> <3> <M>\t  : \" \"\tU2004  # THREE-PER-EM SPACE\n<Multi_key> <space> <4> <M>\t  : \" \"\tU2005  # FOUR-PER-EM SPACE\n<Multi_key> <parenleft> <parenright>: \"◌\" U25CC # DOTTED CIRCLE\n<Multi_key> <bracketleft> <bracketright>: \"⬚\" U2B1A # DOTTED SQUARE\n<Multi_key> <asterisk> <parenleft>      : \"﴾\"   UFD3E           # ORNATE LEFT PARENTHESIS\n<Multi_key> <asterisk> <parenright>     : \"﴿\"   UFD3F           # ORNATE RIGHT PARENTHESIS\n<Multi_key> <k> <s>                     : \"ʘ\"   U0298           # LATIN LETTER BILABIAL CLICK (kiss sound)\n<Multi_key> <bar> <greater>             : \"‣\"   U2023           # TRIANGULAR BULLET\n#SUPERSCRIPTS:\n#To avoid namespace clashes, <asciicircum> is doubled (will I regret that?)\n<Multi_key> <asciicircum> <asciicircum> <h>       : \"ʰ\"   U02B0           # SUPERSCRIPT H\n<Multi_key> <asciicircum> <asciicircum> <i>       : \"ⁱ\"   U2071           # SUPERSCRIPT I\n<Multi_key> <asciicircum> <asciicircum> <j>       : \"ʲ\"   U02B2           # SUPERSCRIPT J\n<Multi_key> <asciicircum> <asciicircum> <n>       : \"ⁿ\"   U207F           # SUPERSCRIPT N\n<Multi_key> <asciicircum> <asciicircum> <r>       : \"ʳ\"   U02B3           # SUPERSCRIPT R\n<Multi_key> <asciicircum> <asciicircum> <w>       : \"ʷ\"   U02B7           # SUPERSCRIPT W\n<Multi_key> <asciicircum> <asciicircum> <y>       : \"ʸ\"   U02B8           # SUPERSCRIPT Y\n# So I can use yᵗ/þᵗ and yᵉ/þᵉ\n<Multi_key> <asciicircum> <asciicircum> <e>\t  : \"ᵉ\"\t  U1D49\t\t  # MODIFIER LETTER SMALL E\n<Multi_key> <asciicircum> <asciicircum> <t>\t  : \"ᵗ\"\t  U1D57\t\t  # MODIFIER LETTER SMALL T\n# Abbreviation for \"that\":\n<Multi_key> <U00FE> <t>\t  \t\t\t  : \"ꝥ\"\t  UA765\t\t  # LATIN SMALL LETTER THORN WITH STROKE\n#Maybe add: ˀˁ˃˂  Need to be able to talk about ʔˁ...\n<Multi_key> <asciicircum> <question> <period>\t: \"ˀ\"\tU02C0\t# MODIFIER LETTER GLOTTAL STOP\n<Multi_key> <asciicircum> <question> <parenleft> : \"ˁ\"\tU02C1\t# MODIFIER LETTER REVERSED GLOTTAL STOP\n<Multi_key> <asciicircum> <minus>       : \"⁻\"   U207B           # SUPERSCRIPT MINUS\n<Multi_key> <asciicircum> <plus>\t: \"⁺\"\tU207A\t\t# SUPERSCRIPT PLUS\n\n<Multi_key> <asciitilde> <asciitilde>        : \"≈\"  U2248           # ALMOST EQUAL TO\n<Multi_key> <s> <h>\t\t\t: \"ʃ\"\tU0283\t\t# LATIN SMALL LETTER ESH\n<Multi_key> <z> <h>\t\t\t: \"ʒ\"\tU0292\t\t# LATIN SMALL LETTER EZH\n<Multi_key> <l> <h>    \t\t\t: \"ɬ\"\tU026C\t\t# LATIN SMALL LETTER L WITH BELT\n<Multi_key> <l> <3>\t\t\t: \"ɮ\"\tU026E\t\t# LATIN SMALL LETTER LEZH\n<Multi_key> <y> <g>\t\t\t: \"ȝ\"\tU021D\t\t# LATIN SMALL LETTER YOGH\n<Multi_key> <Y> <G>\t\t\t: \"Ȝ\"\tU021C\t\t# LATIN CAPITAL LETTER YOGH\n<Multi_key> <question> <period>\t\t: \"ʔ\"\tU0294\t\t# LATIN LETTER GLOTTAL STOP\n<Multi_key> <question> <parenleft>\t: \"ʕ\"\tU0295\t\t# LATIN LETTER PHARYNGEAL VOICED FRICATIVE\n# Not great keystrokes...\n<Multi_key> <question> <v>\t\t: \"ʖ\"\tU0296\t\t# LATIN LETTER INVERTED GLOTTAL STOP\n<Multi_key> <question> <minus>\t\t: \"ʡ\"\tU02A1\t\t# LATIN LETTER GLOTTAL STOP WITH STROKE\n<Multi_key> <question> <braceleft>\t: \"ʢ\"\tU02A2\t\t# LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE\n# How about ɸ? φ isn’t the IPA glyph.\n<Multi_key> <p> <h>\t\t\t: \"ɸ\"\tU0278\t\t# LATIN SMALL LETTER PHI\n<Multi_key> <i> <h>    \t\t\t: \"ɪ\"\tU026A\t\t# LATIN LETTER SMALL CAPITAL I\n<Multi_key> <I> <H>    \t\t\t: \"ɪ\"\tU026A\t\t# LATIN LETTER SMALL CAPITAL I\n<Multi_key> <u> <h>\t\t\t: \"ʊ\"\tU028A\t\t# LATIN SMALL LETTER UPSILON\n<Multi_key> <U> <H>\t\t\t: \"ʊ\"\tU028A\t\t# LATIN SMALL LETTER UPSILON\n<Multi_key> <a> <h>\t\t\t: \"ɑ\"\tU0251\t\t# LATIN SMALL LETTER ALPHA\n<Multi_key> <e> <r>\t\t\t: \"ɚ\"\tU025A\t\t# LATIN SMALL LETTER SCHWA WITH HOOK\n<Multi_key> <o> <parenright>\t\t:\"ɔ\" \tU0254 \t\t# LATIN SMALL LETTER OPEN O\n<Multi_key> <a> <w>\t\t\t: \"ɔ\"\tU0254\t\t# LATIN SMALL LETTER OPEN O\n<Multi_key> <O> <parenright>\t\t:\"Ɔ\" \tU0186 \t\t# LATIN CAPITAL LETTER OPEN O\n<Multi_key> <A> <W>\t\t\t: \"Ɔ\"\tU0186\t\t# LATIN CAPITAL LETTER OPEN O\n<Multi_key> <e> <h>   \t    \t    \t: \"ɛ\"   U025B\t\t# LATIN SMALL LETTER OPEN E\n# Have to put the <less> at the beginning for these.\n<Multi_key> <less> <e> <h>\t\t: \"ɜ\"\tU025C\t\t# LATIN SMALL LETTER REVERSED OPEN E\n<Multi_key> <BackSpace> <e> <h>\t\t: \"ɜ\"\tU025C\t\t# LATIN SMALL LETTER REVERSED OPEN E\n<Multi_key> <less> <e> <r>\t\t: \"ɝ\"\tU025D\t\t# LATIN SMALL LETTER REVERSED OPEN E WITH HOOK\n<Multi_key> <BackSpace> <e> <r>\t\t: \"ɝ\"\tU025D\t\t# LATIN SMALL LETTER REVERSED OPEN E WITH HOOK\n# It's spelled \"gy\" in Hungarian...\n<Multi_key> <g> <y>\t\t\t: \"ɟ\"\tU025F\t\t# LATIN SMALL LETTER DOTLESS J WITH STROKE\n# How are these keystrokes?\n<Multi_key> <bar> <apostrophe>\t\t: \"ˈ\"\tU02C8\t\t# MODIFIER LETTER VERTICAL LINE\n<Multi_key> <bar> <comma>\t\t: \"ˌ\"\tU02CC\t\t# MODIFIER LETTER LOW VERTICAL LINE\n<Multi_key> <bar> <underscore>\t\t: \"̩\"\tU0329\t\t# COMBINING VERTICAL LINE BELOW\n# Harmonize with other combiners.\n<Multi_key> <backslash> <underscore> <bar>\t: \"̩\"\tU0329\t\t# COMBINING VERTICAL LINE BELOW\n<Multi_key> <r> <r>                     : \"ɹ\"   U0279           # LATIN SMALL LETTER TURNED R: voiced alveolar approximant (American English (at least) R)\n<Multi_key> <r> <d>                     : \"ɾ\"   U027E           # LATIN SMALL LETTER R WITH FISHHOOK: voiced alveolar flap or tap (American English intervocalic allophone of d, or Spanish r)\n<Multi_key> <v> <v>                     : \"ʌ\"   U028C           # LATIN SMALL LETTER TURNED V\n<Multi_key> <u> <i>\t\t\t: \"ɯ\"\tU026F\t\t# LATIN SMALL LETTER TURNED M\n# doubling a letter seems to be mostly used for turning\n<Multi_key> <w> <w>\t\t\t: \"ʍ\"\tU028D\t\t# LATIN SMALL LETTER TURNED W\n<Multi_key> <y> <y>\t\t\t: \"ʎ\"\tU028E\t\t# LATIN SMALL LETTER TURNED Y\n<Multi_key> <a> <a>\t\t\t: \"ɐ\"\tU0250\t\t# LATIN SMALL LETTER TURNED A\n# ı is already available in the \"standard\" .XCompose\n<Multi_key> <j> <period>    \t\t: \"ȷ\"\tU0237\t\t# LATIN SMALL LETTER DOTLESS J\n# I'll use capitals for a different double\n<Multi_key> <W> <W>\t\t\t: \"ʬ\"\tU02AC\t\t# LATIN LETTER BILABIAL PERCUSSIVE\n# Sorry, I miss having this and hate having to use colon instead:\n<Multi_key> <colon> <plus>  \t      \t: \"ː\"\tU02D0\t\t# MODIFIER LETTER TRIANGULAR COLON\n# Also handy for writing urls: http://ʬw.omniglot.com/\n# ɣ? ᴥ?  Important enough to add? ᴥ is cool just as a \"latin\" letter.\n<Multi_key> <g> <h>\t     \t    : \"ɣ\"   U0263     # LATIN SMALL LETTER GAMMA\n# It looks like a ɣ and makes an \"o\" sorta sound:\n<Multi_key> <o> <g> <h>\t      \t    : \"ɤ\"  U0264      # LATIN SMALL LETTER RAMS HORN\n<Multi_key> <a> <i> <n>\t\t    : \"ᴥ\"   U1D25     # LATIN LETTER AIN\n# Sometimes it's a \"tail\", sometimes a \"hook\", and sometimes a \"retroflex hook\"\n<Multi_key> <d> <comma>\t\t    : \"ɖ\"   U0256     # LATIN SMALL LETTER D WITH TAIL\n<Multi_key> <l> <comma>\t\t    : \"ɭ\"   U026D     # LATIN SMALL LETTER L WITH RETROFLEX HOOK\n<Multi_key> <n> <comma>\t\t    : \"ɳ\"   U0273     # LATIN SMALL LETTER N WITH RETROFLEX HOOK\n<Multi_key> <s> <comma>\t\t    : \"ʂ\"   U0282     # LATIN SMALL LETTER S WITH HOOK\n<Multi_key> <t> <comma>\t\t    : \"ʈ\"   U0288     # LATIN SMALL LETTER T WITH RETROFLEX HOOK\n<Multi_key> <z> <comma>\t\t    : \"ʐ\"   U0290     # LATIN SMALL LETTER Z WITH RETROFLEX HOOK\n# This is used for functions, folders, etc.  Yeah, the hook's facing wrong.\n<Multi_key> <f> <comma>\t\t    : \"ƒ\"   U0192     # LATIN SMALL LETTER F WITH HOOK\n# Sigh, might as well do implosives.  Which is also sometimes a hook.\n<Multi_key> <b> <apostrophe>\t    : \"ɓ\"   U0253     # LATIN SMALL LETTER B WITH HOOK\n<Multi_key> <d> <apostrophe>\t    : \"ɗ\"   U0257     # LATIN SMALL LETTER D WITH HOOK\n<Multi_key> <g> <apostrophe>\t    : \"ɠ\"   U0260     # LATIN SMALL LETTER G WITH HOOK\n<Multi_key> <g> <g>\t\t    : \"ɡ\"   U0261     # LATIN SMALL LETTER SCRIPT G\n# The h looks the same...\n<Multi_key> <h> <apostrophe>\t    : \"ɦ\"   U0266     # LATIN SMALL LETTER H WITH HOOK\n<Multi_key> <G> <apostrophe>\t    : \"ʛ\"   U029B     # LATIN LETTER SMALL CAPITAL G WITH HOOK\n<Multi_key> <N> <o>\t\t\t: \"№\"\tU2116\t\t# NUMERO SIGN\n<Multi_key> <R> <x>\t\t\t: \"℞\"\tU211E\t\t# PRESCRIPTION TAKE\n<Multi_key> <P> <e> <r>\t\t\t: \"⅌\"\tU214C\t\t# PER SIGN\n<Multi_key> <o> <z> <period>\t\t: \"℥\"\tU2125\t\t# OUNCE SIGN\n<Multi_key> <s> <c> <r> <period>\t: \"℈\"\tU2108\t\t# SCRUPLE\n# There are all kinds of awesome combining characters in the U+0300 page.\n# There are a bunch of other awesome combining characters like U+20E0\n<Multi_key> <asterisk> <period> <period> <period> : \"๛\" U0E5B   # THAI CHARACTER KHOMUT (end of chapter)\n#\n# Music stuff.  # is the music mnemonic.\n<Multi_key> <numbersign> <b>\t\t: \"♭\" U266d # MUSIC FLAT SIGN\n<Multi_key> <numbersign> <f>\t\t: \"♮\" U266e # MUSIC NATURAL SIGN\n<Multi_key> <numbersign> <equal>\t: \"♮\" U266e # MUSIC NATURAL SIGN\n<Multi_key> <numbersign> <numbersign>\t: \"♯\" U266f # MUSIC SHARP SIGN\n<Multi_key> <numbersign> <G>             : \"𝄞\"  U0001d11e # MUSICAL SYMBOL G CLEF\n<Multi_key> <numbersign> <F>              : \"𝄢\"  U0001d122 # MUSICAL SYMBOL F CLEF\n<Multi_key> <numbersign> <C>              : \"𝄡\" U0001d121 # MUSICAL SYMBOL C CLEF\n<Multi_key> <numbersign> <o> <slash>\t: \"♪\" U266a\t# EIGHTH NOTE\n<Multi_key> <numbersign> <o> <o>\t: \"♫\" U266b\t# BEAMED EIGHTH NOTES\n<Multi_key> <numbersign> <percent>\t: \"♫\" U266b\t# BEAMED EIGHTH NOTES\n\n\n# Combining accents, for making things you don't have precomposed chars or keystrokes for:\n<Multi_key> <backslash> <grave>\t: \"̀\"  U0300   # COMBINING GRAVE ACCENT\n<Multi_key> <backslash> <apostrophe>    : \"́\"   U0301   # COMBINING ACUTE ACCENT\n<Multi_key> <backslash> <asciicircum>    : \"̂\"   U0302   # COMBINING CIRCUMFLEX ACCENT\n<Multi_key> <backslash> <asciitilde>       : \"̃\"   U0303\t# COMBINING TILDE\n<Multi_key> <backslash> <equal>\t\t: \"̄\"\tU0304\t# COMBINING MACRON\n<Multi_key> <backslash> <backslash> <equal>\t\t: \"̅\"\tU0305\t# COMBINING OVERLINE -- ???\n<Multi_key> <backslash> <U>\t\t: \"̆\"\tU0306\t# COMBINING BREVE\n<Multi_key> <backslash> <period>\t: \"̇\"\tU0307\t# COMBINING DOT ABOVE\n<Multi_key> <backslash> <quotedbl>\t: \"̈\"\tU0308\t# COMBINING DIAERESIS\n<Multi_key> <backslash> <question>\t: \"̉\"\tU0309\t# COMBINING HOOK ABOVE\n<Multi_key> <backslash> <o>\t\t: \"̊\"\tU030a\t# COMBINING RING ABOVE\n# That now conflicts with the new 🙌 in the system xcompose.  Alternative:\n<Multi_key> <backslash> <0>   \t       \t: \"̊\"\tU030a\t# COMBINING RING ABOVE\n<Multi_key> <backslash> <backslash> <apostrophe>\t: \"̋\"\tU030b\t# COMBINING DOUBLE ACUTE ACCENT -- ??\n<Multi_key> <backslash> <c>\t\t: \"̌\"\tU030c\t# COMBINING CARON\n<Multi_key> <backslash> <bar>       \t: \"̍\"\tU030d\t# COMBINING VERTICAL LINE ABOVE\n<Multi_key> <backslash> <2> <bar>\t: \"̎\"\tU030e\t# COMBINING DOUBLE VERTICAL LINE ABOVE\n<Multi_key> <backslash> <2> <grave>\t: \"̏\"\tU030f\t# COMBINING DOUBLE GRAVE ACCENT\n# For writing PSILI and DASIA in Greek\n# Ugh, better key-coding?  I may need @ for BELOW.\n<Multi_key> <backslash> <backslash> <backslash> <comma>\t:\t\"̒\"  U0312   # COMBINING TURNED COMMA ABOVE\n<Multi_key> <backslash> <backslash> <comma>\t:\t\"̓\"  U0313   # COMBINING COMMA ABOVE\n<Multi_key> <backslash> <backslash> <less> <comma>\t:\t\"̔\"   U0314   # COMBINING REVERSED COMMA ABOVE\n<Multi_key> <backslash> <f> <m>                 : \"͒\"   U0352   # COMBINING FERMATA\n<Multi_key> <backslash> <parenleft> <period>\t: \"̐\"\tU0310\t# COMBINING CHANDRABINDU\n<Multi_key> <backslash> <i> <b>\t\t: \"̑\"\tU0311\t# COMBINING INVERTED BREVE -- ??\n<Multi_key> <backslash> <parenleft> <parenright>: \"⃝\"  U20DD # COMBINING ENCLOSING CIRCLE\n<Multi_key> <backslash> <parenleft> <slash> <parenright>:    \"⃠\"\t U20E0\t   # COMBINING ENCLOSING CIRCLE BACKSLASH\n<Multi_key> <backslash> <exclam>\t: \"̣\"   U0323   # COMBINING DOT BELOW\n# With only one underscore it conflicts with stuff.\n<Multi_key> <backslash> <underscore> <underscore>\t: \"̱\"\tU0331\t# COMBINING MACRON BELOW\n<Multi_key> <backslash> <backslash> <underscore>\t: \"̲\"\tU0332\t# COMBINING LOW LINE\n<Multi_key> <backslash> <backslash> <backslash> <underscore>\t: \"̳\"\tU0333\t# COMBINING DOUBLE LOW LINE\n\n# The @ sign will signify reversal to the bottom of the glyph, 'kay?\n\n<Multi_key> <backslash> <at> <o>\t: \"̥\"\tU0325\t# COMBINING RING BELOW\n\n<Multi_key> <backslash> <at> <c>\t: \"̬\"\tU032c\t# COMBINING CARON BELOW\n<Multi_key> <backslash> <at> <asciicircum>\t: \"̭\"\tU032d\t# COMBINING CIRCUMFLEX ACCENT BELOW\n<Multi_key> <backslash> <at> <U>\t: \"̮\"\tU032e\t# COMBINING BREVE BELOW\n<Multi_key> <backslash> <at> <i> <b>\t: \"̯\"\tU032f\t# COMBINING INVERTED BREVE BELOW -- ??\n\n# How about leading & (or &&?) for double combiners?  There aren't many anyway.\n# Except that I found myself assuming it was \"2\" for double.\n<Multi_key> <backslash> <ampersand> <at> <U> : \"͜\" U035C # COMBINING DOUBLE BREVE BELOW\n<Multi_key> <backslash> <2> <at> <U> : \"͜\" U035C # COMBINING DOUBLE BREVE BELOW\n<Multi_key> <backslash> <ampersand> <U>\t  : \"͝\"\tU035D   # COMBINING DOUBLE BREVE\n<Multi_key> <backslash> <2> <U>\t  : \"͝\"\tU035D   # COMBINING DOUBLE BREVE\n<Multi_key> <backslash> <ampersand> <minus> : \"͞\" U035E\t# COMBINING DOUBLE MACRON\n<Multi_key> <backslash> <2> <minus> : \"͞\" U035E\t# COMBINING DOUBLE MACRON\n<Multi_key> <backslash> <ampersand> <at> <minus> : \"͟\" U035F # COMBINING DOUBLE MACRON BELOW\n<Multi_key> <backslash> <2> <at> <minus> : \"͟\" U035F # COMBINING DOUBLE MACRON BELOW\n<Multi_key> <backslash> <ampersand> <underscore> : \"͟\" U035F # COMBINING DOUBLE MACRON BELOW\n<Multi_key> <backslash> <2> <underscore> : \"͟\" U035F # COMBINING DOUBLE MACRON BELOW\n<Multi_key> <backslash> <ampersand> <asciitilde> : \"͠\" U0360 # COMBINING DOUBLE TILDE\n<Multi_key> <backslash> <2> <asciitilde> : \"͠\" U0360 # COMBINING DOUBLE TILDE\n<Multi_key> <backslash> <ampersand> <i> <b>  : \"͡\"  U0361 # COMBINING DOUBLE INVERTED BREVE\n<Multi_key> <backslash> <2> <i> <b>  : \"͡\"  U0361 # COMBINING DOUBLE INVERTED BREVE\n<Multi_key> <backslash> <ampersand> <at> <i> <b>  : \"᷼\"  U1DFC # COMBINING DOUBLE INVERTED BREVE BELOW\n<Multi_key> <backslash> <2> <at> <i> <b>  : \"᷼\"  U1DFC # COMBINING DOUBLE INVERTED BREVE BELOW\n# Might as well finish up the set.\n<Multi_key> <backslash> <ampersand> <greater> : \"͢\" U0362 # COMBINING DOUBLE RIGHTWARDS ARROW BELOW\n<Multi_key> <backslash> <2> <greater> : \"͢\" U0362 # COMBINING DOUBLE RIGHTWARDS ARROW BELOW\n\n<Multi_key> <period> <parenright>\t: \"͒\"\tU0352   # COMBINING FERMATA\n\n<Multi_key> <backslash> <asterisk>\t: \"҉\"\tU0489\t# COMBINING CYRILLIC MILLIONS SIGN  -- aka COMBINING SHINY\n<Multi_key> <P> <minus>\t\t: \"₽\"\tU20BD\t# RUBLE SIGN\n<Multi_key> <p> <minus>\t\t: \"₽\"\tU20BD\t# RUBLE SIGN\n\n# How about for a little extra control:\n<Multi_key> <Z> <W> <S> <P>\t\t: \"​\"\tU200B\t# ZERO WIDTH SPACE\n<Multi_key> <Z> <W> <N> <J>\t\t: \"‌\"\tU200C\t# ZERO WIDTH NON-JOINER\n<Multi_key> <Z> <W> <J>\t\t\t: \"‍\"\tU200D\t# ZERO WIDTH JOINER\n<Multi_key> <L> <R> <M>\t\t\t: \"‎\"\tU200E\t# LEFT-TO-RIGHT MARK\n<Multi_key> <R> <L> <M>\t\t\t: \"‏\"\tU200F\t# RIGHT-TO-LEFT MARK\n# I never understood the whole embedding/pop thing, but we might as well add 'em\n<Multi_key> <L> <R> <E>\t\t\t: \"‪\"\tU202A\t# LEFT-TO-RIGHT EMBEDDING\n<Multi_key> <R> <L> <E>\t\t\t: \"‫\"\tU202B\t# RIGHT-TO-LEFT EMBEDDING\n<Multi_key> <P> <D> <F>\t\t\t: \"‬\"\tU202C\t# POP DIRECTIONAL FORMATTING\n<Multi_key> <L> <R> <I>\t\t\t: \"⁦\"\tU2066\t# LEFT-TO-RIGHT ISOLATE\n<Multi_key> <R> <L> <I>\t\t\t: \"⁧\"\tU2067\t# RIGHT-TO-LEFT ISOLATE\n<Multi_key> <F> <S> <I>\t\t\t: \"⁨\"\tU2068\t# FIRST STRONG ISOLATE\n<Multi_key> <P> <D> <I>\t\t\t: \"⁩\"\tU2069\t# POP DIRECTIONAL ISOLATE\n<Multi_key> <L> <R> <O>\t\t\t: \"‭\"\tU202D\t# LEFT-TO-RIGHT OVERRIDE\n<Multi_key> <R> <L> <O>\t\t\t: \"‮\"\tU202E\t# RIGHT-TO-LEFT OVERRIDE\n<Multi_key> <B> <O> <M>\t\t\t: \"﻿\"\tUFEFF\t# ZERO WIDTH NO-BREAK SPACE (Byte Order Mark)\n<Multi_key> <C> <G> <J>\t\t\t: \"͏\"\tU034F\t# COMBINING GRAPHEME JOINER\n# These are sufficiently special and well-known that they don't need the\n# double <Multi_key> prefix I think.  The all-caps helps too.\n\n# How about some small-caps?  We normally use a special character as a prefix,\n# but why not a suffix?  It won't interfere with things that way.\n# Several of these are also IPA, which is handy.  And so a few have multiple\n# entries.  Whatever.\n\n<Multi_key> <a> <grave>\t    \t  : \"ᴀ\"\t    U1D00 # LATIN LETTER SMALL CAPITAL A\n<Multi_key> <b> <grave>\t    \t  : \"ʙ\"\t    U0299 # LATIN LETTER SMALL CAPITAL B\n<Multi_key> <c> <grave>\t    \t  : \"ᴄ\"\t    U1D04 # LATIN LETTER SMALL CAPITAL C\n<Multi_key> <d> <grave>\t    \t  : \"ᴅ\"\t    U1D05 # LATIN LETTER SMALL CAPITAL D\n<Multi_key> <e> <grave>\t    \t  : \"ᴇ\"\t    U1D07 # LATIN LETTER SMALL CAPITAL E\n<Multi_key> <f> <grave>\t    \t  : \"ꜰ\"\t    UA730 # LATIN LETTER SMALL CAPITAL F\n<Multi_key> <g> <grave>\t    \t  : \"ɢ\"\t    U0262 # LATIN LETTER SMALL CAPITAL G\n<Multi_key> <h> <grave>\t    \t  : \"ʜ\"\t    U029C # LATIN LETTER SMALL CAPITAL H\n<Multi_key> <i> <grave>\t    \t  : \"ɪ\"\t    U026A # LATIN LETTER SMALL CAPITAL I\n<Multi_key> <j> <grave>\t    \t  : \"ᴊ\"\t    U1D0A # LATIN LETTER SMALL CAPITAL J\n<Multi_key> <k> <grave>\t    \t  : \"ᴋ\"\t    U1D0B # LATIN LETTER SMALL CAPITAL K\n<Multi_key> <l> <grave>\t    \t  : \"ʟ\"\t    U029F # LATIN LETTER SMALL CAPITAL L\n<Multi_key> <m> <grave>\t    \t  : \"ᴍ\"\t    U1D0D # LATIN LETTER SMALL CAPITAL M\n<Multi_key> <n> <grave>\t    \t  : \"ɴ\"\t    U0274 # LATIN LETTER SMALL CAPITAL N\n<Multi_key> <o> <grave>\t    \t  : \"ᴏ\"\t    U1D0F # LATIN LETTER SMALL CAPITAL O\n<Multi_key> <p> <grave>\t    \t  : \"ᴘ\"\t    U1D18 # LATIN LETTER SMALL CAPITAL P\n# There is no SMALL CAPITAL Q (yet)!\n<Multi_key> <r> <grave>\t    \t  : \"ʀ\"\t    U0280 # LATIN LETTER SMALL CAPITAL R\n<Multi_key> <s> <grave>\t    \t  : \"ꜱ\"\t    UA731 # LATIN LETTER SMALL CAPITAL S\n<Multi_key> <t> <grave>\t    \t  : \"ᴛ\"\t    U1D1B # LATIN LETTER SMALL CAPITAL T\n<Multi_key> <u> <grave>\t    \t  : \"ᴜ\"\t    U1D1C # LATIN LETTER SMALL CAPITAL U\n<Multi_key> <v> <grave>\t    \t  : \"ᴠ\"\t    U1D20 # LATIN LETTER SMALL CAPITAL V\n<Multi_key> <w> <grave>\t    \t  : \"ᴡ\"\t    U1D21 # LATIN LETTER SMALL CAPITAL W\n# There is no SMALL CAPITAL X (yet)\n<Multi_key> <y> <grave>\t    \t  : \"ʏ\"\t    U028F # LATIN LETTER SMALL CAPITAL Y\n<Multi_key> <z> <grave>\t    \t  : \"ᴢ\"\t    U1D22 # LATIN LETTER SMALL CAPITAL Z\n\n\n# See also http://bleah.co.uk/~simon/stuff/XCompose\n# and http://dotfiles.org/~inky/.XCompose\n# and http://paste.lisp.org/display/73094\n\n<Multi_key> <Multi_key> <s> <u> <n>\t: \"☉\"\tU2609\t# SUN (Sunday)\n<Multi_key> <Multi_key> <m> <o> <o> <n>\t: \"☽\"\tU263D\t# FIRST QUARTER MOON (Monday)\n<Multi_key> <Multi_key> <m> <e> <r> <c> <u> <r> <y> : \"☿\" U263F\t# MERCURY (Wednesday)\n# We already have Venus (Friday) and Mars (Tuesday) as Male/Female signs; do we need them here too?\n#<Multi_key> <Multi_key> <v> <e> <n> <u> <s>  : \"♀\" U2640    # FEMALE SIGN\n#<Multi_key> <Multi_key> <m> <a> <r> <s>  : \"♂\"\tU2642   # MALE SIGN\n<Multi_key> <Multi_key> <j> <u> <p> <i> <t> <e> <r> : \"♃\" U2643\t# JUPITER (Thursday)\n<Multi_key> <Multi_key> <s> <a> <t> <u> <r> <n>     : \"♄\" U2644\t# SATURN (Saturday)\n<Multi_key> <Multi_key> <u> <r> <a> <n> <u> <s>\t    : \"♅\" U2645\t# URANUS (or ⛢ U26E2?)\n<Multi_key> <Multi_key> <n> <e> <p> <t> <u> <n> <e> : \"♆\" U2646\t# NEPTUNE\n<Multi_key> <Multi_key> <p> <l> <u> <t> <o> \t    : \"♇\" U2647\t# PLUTO (ok, it isn't a planet anymore, but we still love it.)\n# Minor planets, whilst we're at it?\n<Multi_key> <Multi_key> <c> <e> <r> <e> <s>\t: \"⚳\"\tU26B3\t# CERES\n<Multi_key> <Multi_key> <p> <a> <l> <l> <a> <s>\t: \"⚴\"\tU26B4\t# PALLAS\n<Multi_key> <Multi_key> <j> <u> <n> <o>     \t: \"⚵\"\tU26B5\t# JUNO\n<Multi_key> <Multi_key> <v> <e> <s> <t> <a>    \t: \"⚶\"\tU26B6\t# VESTA\n<Multi_key> <Multi_key> <c> <h> <i> <r> <o> <n>\t: \"⚷\"\tU26B7\t# CHIRON\n<Multi_key> <Multi_key> <l> <i> <l> <i> <t> <h>\t: \"⚸\"\tU26B8\t# BLACK MOON LILITH\n\n# Unicode 6.0 gave us all kinds of things, perhaps more than we can use...\n\n# Playing Cards?  It's a lot, but so what?  I don't think the [] convention\n# will conflict with anything.\n# The convention is more or less established, except for the Knight.  I'm\n# using N for that, like in Chess, since K would conflict with King of course.\n\n<Multi_key> <bracketleft> <A> <S> <bracketright>  : \"🂡\"\tU1F0A1\t# PLAYING CARD ACE OF SPADES\n<Multi_key> <bracketleft> <2> <S> <bracketright>  : \"🂢\"\tU1F0A2\t# PLAYING CARD TWO OF SPADES\n<Multi_key> <bracketleft> <3> <S> <bracketright>  : \"🂣\"\tU1F0A3\t# PLAYING CARD THREE OF SPADES\n<Multi_key> <bracketleft> <4> <S> <bracketright>  : \"🂤\"\tU1F0A4\t# PLAYING CARD FOUR OF SPADES\n<Multi_key> <bracketleft> <5> <S> <bracketright>  : \"🂥\"\tU1F0A5\t# PLAYING CARD FIVE OF SPADES\n<Multi_key> <bracketleft> <6> <S> <bracketright>  : \"🂦\"\tU1F0A6\t# PLAYING CARD SIX OF SPADES\n<Multi_key> <bracketleft> <7> <S> <bracketright>  : \"🂧\"\tU1F0A7\t# PLAYING CARD SEVEN OF SPADES\n<Multi_key> <bracketleft> <8> <S> <bracketright>  : \"🂨\"\tU1F0A8\t# PLAYING CARD EIGHT OF SPADES\n<Multi_key> <bracketleft> <9> <S> <bracketright>  : \"🂩\"\tU1F0A9\t# PLAYING CARD NINE OF SPADES\n<Multi_key> <bracketleft> <T> <S> <bracketright>  : \"🂪\"\tU1F0AA\t# PLAYING CARD TEN OF SPADES\n<Multi_key> <bracketleft> <J> <S> <bracketright>  : \"🂫\"\tU1F0AB\t# PLAYING CARD JACK OF SPADES\n<Multi_key> <bracketleft> <N> <S> <bracketright>  : \"🂬\"\tU1F0AC\t# PLAYING CARD KNIGHT OF SPADES\n<Multi_key> <bracketleft> <Q> <S> <bracketright>  : \"🂭\"\tU1F0AD\t# PLAYING CARD QUEEN OF SPADES\n<Multi_key> <bracketleft> <K> <S> <bracketright>  : \"🂮\"\tU1F0AE\t# PLAYING CARD KING OF SPADES\n\n<Multi_key> <bracketleft> <A> <H> <bracketright>  : \"🂱\"\tU1F0B1\t# PLAYING CARD ACE OF HEARTS\n<Multi_key> <bracketleft> <2> <H> <bracketright>  : \"🂲\"\tU1F0B2\t# PLAYING CARD TWO OF HEARTS\n<Multi_key> <bracketleft> <3> <H> <bracketright>  : \"🂳\"\tU1F0B3\t# PLAYING CARD THREE OF HEARTS\n<Multi_key> <bracketleft> <4> <H> <bracketright>  : \"🂴\"\tU1F0B4\t# PLAYING CARD FOUR OF HEARTS\n<Multi_key> <bracketleft> <5> <H> <bracketright>  : \"🂵\"\tU1F0B5\t# PLAYING CARD FIVE OF HEARTS\n<Multi_key> <bracketleft> <6> <H> <bracketright>  : \"🂶\"\tU1F0B6\t# PLAYING CARD SIX OF HEARTS\n<Multi_key> <bracketleft> <7> <H> <bracketright>  : \"🂷\"\tU1F0B7\t# PLAYING CARD SEVEN OF HEARTS\n<Multi_key> <bracketleft> <8> <H> <bracketright>  : \"🂸\"\tU1F0B8\t# PLAYING CARD EIGHT OF HEARTS\n<Multi_key> <bracketleft> <9> <H> <bracketright>  : \"🂹\"\tU1F0B9\t# PLAYING CARD NINE OF HEARTS\n<Multi_key> <bracketleft> <T> <H> <bracketright>  : \"🂺\"\tU1F0BA\t# PLAYING CARD TEN OF HEARTS\n<Multi_key> <bracketleft> <J> <H> <bracketright>  : \"🂻\"\tU1F0BB\t# PLAYING CARD JACK OF HEARTS\n<Multi_key> <bracketleft> <N> <H> <bracketright>  : \"🂼\"\tU1F0BC\t# PLAYING CARD KNIGHT OF HEARTS\n<Multi_key> <bracketleft> <Q> <H> <bracketright>  : \"🂽\"\tU1F0BD\t# PLAYING CARD QUEEN OF HEARTS\n<Multi_key> <bracketleft> <K> <H> <bracketright>  : \"🂾\"\tU1F0BE\t# PLAYING CARD KING OF HEARTS\n\n<Multi_key> <bracketleft> <A> <D> <bracketright>  : \"🃁\"\tU1F0C1\t# PLAYING CARD ACE OF DIAMONDS\n<Multi_key> <bracketleft> <2> <D> <bracketright>  : \"🃂\"\tU1F0C2\t# PLAYING CARD TWO OF DIAMONDS\n<Multi_key> <bracketleft> <3> <D> <bracketright>  : \"🃃\"\tU1F0C3\t# PLAYING CARD THREE OF DIAMONDS\n<Multi_key> <bracketleft> <4> <D> <bracketright>  : \"🃄\"\tU1F0C4\t# PLAYING CARD FOUR OF DIAMONDS\n<Multi_key> <bracketleft> <5> <D> <bracketright>  : \"🃅\"\tU1F0C5\t# PLAYING CARD FIVE OF DIAMONDS\n<Multi_key> <bracketleft> <6> <D> <bracketright>  : \"🃆\"\tU1F0C6\t# PLAYING CARD SIX OF DIAMONDS\n<Multi_key> <bracketleft> <7> <D> <bracketright>  : \"🃇\"\tU1F0C7\t# PLAYING CARD SEVEN OF DIAMONDS\n<Multi_key> <bracketleft> <8> <D> <bracketright>  : \"🃈\"\tU1F0C8\t# PLAYING CARD EIGHT OF DIAMONDS\n<Multi_key> <bracketleft> <9> <D> <bracketright>  : \"🃉\"\tU1F0C9\t# PLAYING CARD NINE OF DIAMONDS\n<Multi_key> <bracketleft> <T> <D> <bracketright>  : \"🃊\"\tU1F0CA\t# PLAYING CARD TEN OF DIAMONDS\n<Multi_key> <bracketleft> <J> <D> <bracketright>  : \"🃋\"\tU1F0CB\t# PLAYING CARD JACK OF DIAMONDS\n<Multi_key> <bracketleft> <N> <D> <bracketright>  : \"🃌\"\tU1F0CC\t# PLAYING CARD KNIGHT OF DIAMONDS\n<Multi_key> <bracketleft> <Q> <D> <bracketright>  : \"🃍\"\tU1F0CD\t# PLAYING CARD QUEEN OF DIAMONDS\n<Multi_key> <bracketleft> <K> <D> <bracketright>  : \"🃎\"\tU1F0CE\t# PLAYING CARD KING OF DIAMONDS\n\n<Multi_key> <bracketleft> <A> <C> <bracketright>  : \"🃑\"\tU1F0D1\t# PLAYING CARD ACE OF CLUBS\n<Multi_key> <bracketleft> <2> <C> <bracketright>  : \"🃒\"\tU1F0D2\t# PLAYING CARD TWO OF CLUBS\n<Multi_key> <bracketleft> <3> <C> <bracketright>  : \"🃓\"\tU1F0D3\t# PLAYING CARD THREE OF CLUBS\n<Multi_key> <bracketleft> <4> <C> <bracketright>  : \"🃔\"\tU1F0D4\t# PLAYING CARD FOUR OF CLUBS\n<Multi_key> <bracketleft> <5> <C> <bracketright>  : \"🃕\"\tU1F0D5\t# PLAYING CARD FIVE OF CLUBS\n<Multi_key> <bracketleft> <6> <C> <bracketright>  : \"🃖\"\tU1F0D6\t# PLAYING CARD SIX OF CLUBS\n<Multi_key> <bracketleft> <7> <C> <bracketright>  : \"🃗\"\tU1F0D7\t# PLAYING CARD SEVEN OF CLUBS\n<Multi_key> <bracketleft> <8> <C> <bracketright>  : \"🃘\"\tU1F0D8\t# PLAYING CARD EIGHT OF CLUBS\n<Multi_key> <bracketleft> <9> <C> <bracketright>  : \"🃙\"\tU1F0D9\t# PLAYING CARD NINE OF CLUBS\n<Multi_key> <bracketleft> <T> <C> <bracketright>  : \"🃚\"\tU1F0DA\t# PLAYING CARD TEN OF CLUBS\n<Multi_key> <bracketleft> <J> <C> <bracketright>  : \"🃛\"\tU1F0DB\t# PLAYING CARD JACK OF CLUBS\n<Multi_key> <bracketleft> <N> <C> <bracketright>  : \"🃜\"\tU1F0DC\t# PLAYING CARD KNIGHT OF CLUBS\n<Multi_key> <bracketleft> <Q> <C> <bracketright>  : \"🃝\"\tU1F0DD\t# PLAYING CARD QUEEN OF CLUBS\n<Multi_key> <bracketleft> <K> <C> <bracketright>  : \"🃞\"\tU1F0DE\t# PLAYING CARD KING OF CLUBS\n\n<Multi_key> <bracketleft> <C> <B> <bracketright>  : \"🂠\"\tU1F0A0\t# PLAYING CARD BACK\n<Multi_key> <bracketleft> <B> <J> <bracketright>  : \"🃏\" U1F0CF\t# PLAYING CARD BLACK JOKER\n<Multi_key> <bracketleft> <W> <J> <bracketright>  : \"🃟\"\tU1F0DF\t# PLAYING CARD WHITE JOKER\n\n# Do we want domino bones also?  I'm thinking [ 1 1 ], etc, maybe use\n# ] 1 1 [ for vertical (or vice-versa)\n\n# And chess/checkers pieces! We need a convention for those.  # looks like a\n# checkerboard but we're already using that for music.  Half of it?\n# <bar> will be an issue when we want double-struck W or B... we'll have\n# to consider it.  Maybe replace with <equal>\n<Multi_key> <bar> <W> <K>\t : \"♔\" U2654\t# WHITE CHESS KING\n<Multi_key> <bar> <W> <Q>\t : \"♕\" U2655\t# WHITE CHESS QUEEN\n<Multi_key> <bar> <W> <R>\t : \"♖\" U2656\t# WHITE CHESS ROOK\n<Multi_key> <bar> <W> <B>\t : \"♗\" U2657\t# WHITE CHESS BISHOP\n<Multi_key> <bar> <W> <N>\t : \"♘\" U2658\t# WHITE CHESS KNIGHT\n<Multi_key> <bar> <W> <P>\t : \"♙\" U2659\t# WHITE CHESS PAWN\n<Multi_key> <bar> <B> <K>\t : \"♚\" U265A\t# BLACK CHESS KING\n<Multi_key> <bar> <B> <Q>\t : \"♛\" U265B\t# BLACK CHESS QUEEN\n<Multi_key> <bar> <B> <R>\t : \"♜\" U265C\t# BLACK CHESS ROOK\n<Multi_key> <bar> <B> <B>\t : \"♝\" U265D\t# BLACK CHESS BISHOP\n<Multi_key> <bar> <B> <N>\t : \"♞\" U265E\t# BLACK CHESS KNIGHT\n<Multi_key> <bar> <B> <P>\t : \"♟\" U265F\t# BLACK CHESS PAWN\n<Multi_key> <bar> <W> <D> <M>\t : \"⛀\" U26C0\t# WHITE DRAUGHTS MAN\n<Multi_key> <bar> <W> <D> <K>\t : \"⛁\" U26C1\t# WHITE DRAUGHTS KING\n<Multi_key> <bar> <B> <D> <M>\t : \"⛂\" U26C2\t# BLACK DRAUGHTS MAN\n<Multi_key> <bar> <B> <D> <K>\t : \"⛃\" U26C3\t# BLACK DRAUGHTS KING\n# Since we're doing game pieces, might as well.\n<Multi_key> <bar> <W> <S>\t : \"☖\" U2616\t# WHITE SHOGI PIECE\n<Multi_key> <bar> <B> <S>\t : \"☗\" U2617\t# BLACK SHOGI PIECE\n# It's turned vertically and not horizontally reflected, but we use the <\n# symbol for turning...\n<Multi_key> <bar> <less> <W> <S> : \"⛉\" U26C9\t# TURNED WHITE SHOGI PIECE\n<Multi_key> <bar> <less> <B> <S> : \"⛊\" U26CA\t# TURNED BLACK SHOGI PIECE\n\n# As for the emoji... We can't possibly get all of them, even just all of the\n# cool/useful ones.  Maybe we can pick and choose some high-fliers.\n\n<Multi_key> <Multi_key> <d> <e> <g> <r> <e> <e> \t\t: \"°\"\tU00B0\t# DEGREE SIGN\n<Multi_key> <Multi_key> <d> <e> <g> <C> \t\t: \"℃\"   U2103 \t# DEGREE CELSIUS\n<Multi_key> <Multi_key> <d> <e> <g> <c> \t\t: \"℃\"   U2103 \t# DEGREE CELSIUS\n<Multi_key> <Multi_key> <d> <e> <g> <F> \t\t: \"℉\"   U2109   # DEGREE FAHRENHEIT\n<Multi_key> <Multi_key> <d> <e> <g> <f> \t\t: \"℉\"   U2109   # DEGREE FAHRENHEIT\n\n# Zodiacal symbols?\n<Multi_key> <Multi_key> <a> <r> <i> <e> <s>\t: \"♈\"\tU2648\t# ARIES\n<Multi_key> <Multi_key> <t> <a> <u> <r> <u> <s>\t: \"♉\"\tU2649\t# TAURUS\n<Multi_key> <Multi_key> <g> <e> <m> <i> <n> <i>\t: \"♊\"\tU264A\t# GEMINI\n<Multi_key> <Multi_key> <c> <a> <n> <c> <e> <r>\t: \"♋\"\tU264B\t# CANCER\n<Multi_key> <Multi_key> <l> <e> <o> \t\t: \"♌\"\tU264C\t# LEO\n<Multi_key> <Multi_key> <v> <i> <r> <g> <o>\t: \"♍\"\tU264D\t# VIRGO\n<Multi_key> <Multi_key> <l> <i> <b> <r> <a>\t: \"♎\"\tU264E\t# LIBRA\n# Abbreviating some of the longer ones.\n<Multi_key> <Multi_key> <s> <c> <o> <r> <p>\t: \"♏\"\tU264F\t# SCORPIUS\n<Multi_key> <Multi_key> <s> <a> <g> <i> <t>\t: \"♐\"\tU2650\t# SAGITTARIUS\n<Multi_key> <Multi_key> <c> <a> <p> <r> <i> <c>\t: \"♑\"\tU2651\t# CAPRICORN\n<Multi_key> <Multi_key> <a> <q> <u> <a> <r>\t: \"♒\"\tU2652\t# AQUARIUS\n<Multi_key> <Multi_key> <p> <i> <s> <c> <e> <s>\t: \"♓\"\tU2653\t# PISCES\n# Really, this should be SERPENTARIUS.  All the other signs are in Latin.\n<Multi_key> <Multi_key> <o> <p> <h> <i> <u> <c> : \"⛎\"\tU26CE\t# OPHIUCHUS\n\n# Sigh.  So many emoji...  I think the first ones I'd go for would be\n# 💡💢💣💤💥💦💧💨💫 (1F4A1-1F4A8 and 1F4AB).  Maybe 1F550-1F567 are useful.  \n<Multi_key> <Multi_key> <i> <d> <e> <a>\t    : \"💡\"    U1F4A1 # ELECTRIC LIGHT BULB\n<Multi_key> <Multi_key> <a> <n> <g> <e> <r> : \"💢\"    U1F4A2 # ANGER SYMBOL\n<Multi_key> <Multi_key> <b> <o> <m> <b>\t    : \"💣\"    U1F4A3 # BOMB\n<Multi_key> <Multi_key> <z> <z> <z> \t    : \"💤\"    U1F4A4 # SLEEPING SYMBOL\n<Multi_key> <Multi_key> <p> <o> <w>\t    : \"💥\"    U1F4A5 # COLLISION SYMBOL\n<Multi_key> <Multi_key> <s> <w> <e> <a> <t> : \"💦\"    U1F4A6 # SPLASHING SWEAT SYMBOL\n<Multi_key> <Multi_key> <d> <r> <o> <p>\t    : \"💧\"    U1F4A7 # DROPLET\n<Multi_key> <Multi_key> <z> <i> <p> \t    : \"💨\"    U1F4A8 # DASH SYMBOL\n<Multi_key> <Multi_key> <p> <o> <o>\t    : \"💩\"    U1F4A9 # PILE OF POO\n# Skipping U+1F4AA just now.\n<Multi_key> <Multi_key> <d> <i> <z> <z> <y> : \"💫\"    U1F4AB # DIZZY SYMBOL\n<Multi_key> <Multi_key> <dollar> <b> <a> <g>  : \"💰\"  U1F4B0 # MONEY BAG\n<Multi_key> <Multi_key> <c> <a> <k> <e>\t    : \"🍰\"    U1F370 # SHORTCAKE\n# The cake is a lie... OK, too cutesy?\n<Multi_key> <Multi_key> <l> <i> <e> \t    : \"🎂\"    U1F382 # BIRTHDAY CAKE\n<Multi_key> <Multi_key> <b> <d> <a> <y>\t    : \"🎂\"    U1F382 # BIRTHDAY CAKE\n<Multi_key> <Multi_key> <A> <O> <K>\t    : \"👌\"    U1F44C # OK HAND SIGN\n<Multi_key> <Multi_key> <t> <h> <m> <u> <p> : \"👍\"    U1F44D # THUMBS UP SIGN\n<Multi_key> <Multi_key> <t> <h> <m> <d> <n> : \"👎\"    U1F44E # THUMBS DOWN SIGN\n# More useful in chat than U+1F48F KISS\n<Multi_key> <Multi_key> <k> <i> <s> <s>\t    : \"💋\"    U1F48B # KISS MARK\n# ⛔ U+26D4 NO ENTRY for \"Don't go there\"?\n# So many hearts... I'm not touching them for now.\n# And emoticons? (U+1F600 et seq)\n\n<Multi_key> <parenleft> <1> <colon> <0> <0> <parenright> : \"🕐\" U1F550 # CLOCK FACE ONE OCLOCK\n<Multi_key> <parenleft> <2> <colon> <0> <0> <parenright> : \"🕑\" U1F551 # CLOCK FACE TWO OCLOCK\n<Multi_key> <parenleft> <3> <colon> <0> <0> <parenright> : \"🕒\" U1F552 # CLOCK FACE THREE OCLOCK\n<Multi_key> <parenleft> <4> <colon> <0> <0> <parenright> : \"🕓\" U1F553 # CLOCK FACE FOUR OCLOCK\n<Multi_key> <parenleft> <5> <colon> <0> <0> <parenright> : \"🕔\" U1F554 # CLOCK FACE FIVE OCLOCK\n<Multi_key> <parenleft> <6> <colon> <0> <0> <parenright> : \"🕕\" U1F555 # CLOCK FACE SIX OCLOCK\n<Multi_key> <parenleft> <7> <colon> <0> <0> <parenright> : \"🕖\" U1F556 # CLOCK FACE SEVEN OCLOCK\n<Multi_key> <parenleft> <8> <colon> <0> <0> <parenright> : \"🕗\" U1F557 # CLOCK FACE EIGHT OCLOCK\n<Multi_key> <parenleft> <9> <colon> <0> <0> <parenright> : \"🕘\" U1F558 # CLOCK FACE NINE OCLOCK\n<Multi_key> <parenleft> <1> <0> <colon> <0> <0> <parenright> : \"🕙\" U1F559 # CLOCK FACE TEN OCLOCK\n<Multi_key> <parenleft> <1> <1> <colon> <0> <0> <parenright> : \"🕚\" U1F55A # CLOCK FACE ELEVEN OCLOCK\n<Multi_key> <parenleft> <1> <2> <colon> <0> <0> <parenright> : \"🕛\" U1F55B # CLOCK FACE TWELVE OCLOCK\n\n<Multi_key> <parenleft> <1> <colon> <3> <0> <parenright>     : \"🕜\" U1F55C # CLOCK FACE ONE-THIRTY\n<Multi_key> <parenleft> <2> <colon> <3> <0> <parenright>     : \"🕝\" U1F55D # CLOCK FACE TWO-THIRTY\n<Multi_key> <parenleft> <3> <colon> <3> <0> <parenright>     : \"🕞\" U1F55E # CLOCK FACE THREE-THIRTY\n<Multi_key> <parenleft> <4> <colon> <3> <0> <parenright>     : \"🕟\" U1F55F # CLOCK FACE FOUR-THIRTY\n<Multi_key> <parenleft> <5> <colon> <3> <0> <parenright>     : \"🕠\" U1F560 # CLOCK FACE FIVE-THIRTY\n<Multi_key> <parenleft> <6> <colon> <3> <0> <parenright>     : \"🕡\" U1F561 # CLOCK FACE SIX-THIRTY\n<Multi_key> <parenleft> <7> <colon> <3> <0> <parenright>     : \"🕢\" U1F562 # CLOCK FACE SEVEN-THIRTY\n<Multi_key> <parenleft> <8> <colon> <3> <0> <parenright>     : \"🕣\" U1F563 # CLOCK FACE EIGHT-THIRTY\n<Multi_key> <parenleft> <9> <colon> <3> <0> <parenright>     : \"🕤\" U1F564 # CLOCK FACE NINE-THIRTY\n<Multi_key> <parenleft> <1> <0> <colon> <3> <0> <parenright>     : \"🕥\" U1F565 # CLOCK FACE TEN-THIRTY\n<Multi_key> <parenleft> <1> <1> <colon> <3> <0> <parenright>     : \"🕦\" U1F566 # CLOCK FACE ELEVEN-THIRTY\n<Multi_key> <parenleft> <1> <2> <colon> <3> <0> <parenright>     : \"🕧\" U1F567 # CLOCK FACE TWELVE-THIRTY\n\n# Bitcoin signs\n# Real bitcoin codepoint coming at U+20BF!\n<Multi_key> <B> <bar> : \"฿\" U0E3F # BITCOIN CURRENCY SIGN, ORIGINAL THAI CURRENCY SYMBOL BAHT\n\n<Multi_key> <minus> <B> : \"Ƀ\" U0243 # ALTERNATIVE BITCOIN CURRENCY SIGN, LATIN CAPITAL LETTER B WITH STROKE\n<Multi_key> <B> <minus> : \"Ƀ\" U0243 # ALTERNATIVE BITCOIN CURRENCY SIGN, LATIN CAPITAL LETTER B WITH STROKE\n<Multi_key> <minus> <b> : \"ƀ\" U0180 # ALTERNATIVE BIT CURRENCY SIGN, LATIN SMALL LETTER B WITH STROKE\n<Multi_key> <b> <minus> : \"ƀ\" U0180 # ALTERNATIVE BIT CURRENCY SIGN, LATIN SMALL LETTER B WITH STROKE\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/Application.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"6211\" systemVersion=\"14A298i\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"6204\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\" customClass=\"UIApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"bYg-Ix-Cfg\" id=\"h4M-LL-qlT\"/>\n            </connections>\n        </placeholder>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <customObject id=\"bYg-Ix-Cfg\" userLabel=\"App Delegate\"/>\n        <window opaque=\"NO\" clearsContextBeforeDrawing=\"NO\" contentMode=\"scaleToFill\" id=\"Na2-4i-xf1\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/CSharpVSPackage.vstemplate",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<VSTemplate Version=\"3.0.0\" Type=\"Item\" xmlns=\"http://schemas.microsoft.com/developer/vstemplate/2005\" xmlns:sdk=\"http://schemas.microsoft.com/developer/vstemplate-sdkextension/2010\">\n  <TemplateData>\n    <Name>Visual Studio Package</Name>\n    <Description>Visual Studio package loadable in Visual Studio</Description>\n    <Icon>VSPackage.ico</Icon>\n    <TemplateID>VsixVSPackageCSharp</TemplateID>\n    <AppliesTo>VSIX + CSharp</AppliesTo>\n    <ShowByDefault>false</ShowByDefault>\n    <ProjectType>CSharp</ProjectType>\n    <RequiredFrameworkVersion>4.5</RequiredFrameworkVersion>\n    <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>\n    <DefaultName>VSPackage.cs</DefaultName>\n  </TemplateData>\n  <TemplateContent>\n    <References>\n      <Reference>\n        <Assembly>Microsoft.CSharp</Assembly>\n      </Reference>\n      <Reference>\n        <Assembly>System</Assembly>\n      </Reference>\n      <Reference>\n        <Assembly>System.Core</Assembly>\n      </Reference>\n      <Reference>\n        <Assembly>System.Data</Assembly>\n      </Reference>\n      <Reference>\n        <Assembly>System.Design</Assembly>\n      </Reference>\n      <Reference>\n        <Assembly>System.Drawing</Assembly>\n      </Reference>\n      <Reference>\n        <Assembly>System.Windows.Forms</Assembly>\n      </Reference>\n      <Reference>\n        <Assembly>System.Xml</Assembly>\n      </Reference>\n    </References>\n\n    <ProjectItem ReplaceParameters=\"true\" TargetFileName=\"$packageName$.cs\" OpenInEditor=\"true\">VsPkg.cs</ProjectItem>\n    <ProjectItem ReplaceParameters=\"false\" TargetFileName=\"Resources\\$packageName$.ico\">Resources\\Package.ico</ProjectItem>\n    <ProjectItem ReplaceParameters=\"true\" TargetFileName=\"VSPackage.resx\">VSPackage.resx</ProjectItem>\n    <ProjectItem ReplaceParameters=\"true\" TargetFileName=\"source.extension.vsixmanifest\" ItemType=\"None\" SubType=\"Designer\">source.extension.vsixmanifest</ProjectItem>\n\n    <CustomParameters>\n      <CustomParameter Name=\"$AddVsixManifestAsset$\" Value=\"VsPackageFromSameProject\" />\n      <CustomParameter Name=\"$productNameResourceId$\" Value=\"110\" />\n      <CustomParameter Name=\"$productDetailsResourceId$\" Value=\"112\" />\n      <CustomParameter Name=\"$iconResourceId$\" Value=\"400\" />\n      <CustomParameter Name=\"$packageName$\" Value=\"$rootSafeItemName$\" />\n      <CustomParameter Name=\"$packageGuid$\" Value=\"$guid1$\"/>\n    </CustomParameters>\n  </TemplateContent>\n  <WizardExtension>\n    <Assembly>Microsoft.Vsix.TemplatesPackage, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>\n    <FullClassName>Microsoft.Vsix.TemplatesPackage.VsixWizard</FullClassName>\n  </WizardExtension>\n  <WizardExtension>\n    <Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>\n    <FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName>\n  </WizardExtension>\n  <WizardData>\n    <packages repository=\"extension\" repositoryId=\"Microsoft.Dev14.VsixTemplatesPackage.V2.443cca91-ec20-41e5-a165-f28e56b89650\">\n      <package id=\"Microsoft.VisualStudio.OLE.Interop\" version=\"7.10.6070\" />\n      <package id=\"Microsoft.VisualStudio.Shell.Interop\" version=\"7.10.6071\" />\n      <package id=\"Microsoft.VisualStudio.TextManager.Interop\" version=\"7.10.6070\" />\n      <package id=\"Microsoft.VisualStudio.Shell.Interop.8.0\" version=\"8.0.50727\" />\n      <package id=\"Microsoft.VisualStudio.TextManager.Interop.8.0\" version=\"8.0.50727\" />\n      <package id=\"Microsoft.VisualStudio.Shell.Interop.9.0\" version=\"9.0.30729\" />\n      <package id=\"Microsoft.VisualStudio.Shell.Interop.10.0\" version=\"10.0.30319\" />\n      <package id=\"Microsoft.VisualStudio.Shell.Interop.11.0\" version=\"11.0.61030\" />\n      <package id=\"Microsoft.VisualStudio.Shell.Interop.12.0\" version=\"12.0.30110\" />\n      <package id=\"Microsoft.VisualStudio.Shell.14.0\" version=\"14.3.25407\" />\n      <package id=\"Microsoft.VisualStudio.Shell.Immutable.11.0\" version=\"11.0.50727\" />\n      <package id=\"Microsoft.VisualStudio.Utilities\" version=\"14.3.25407\" />\n      <package id=\"Microsoft.VisualStudio.Shell.Immutable.10.0\" version=\"10.0.30319\" />\n      <package id=\"Microsoft.VisualStudio.Shell.Immutable.14.0\" version=\"14.3.25407\" />\n      <package id=\"Microsoft.VisualStudio.Threading\" version=\"14.1.111\" />\n      <package id=\"Microsoft.VisualStudio.Shell.Immutable.12.0\" version=\"12.0.21003\" />\n      <package id=\"Microsoft.VisualStudio.Imaging\" version=\"14.3.25407\" />\n      <package id=\"Microsoft.VisualStudio.Validation\" version=\"14.1.111\" />\n      <package id=\"Microsoft.VSSDK.BuildTools\" version=\"14.3.25407\" />\n    </packages>\n  </WizardData>\n</VSTemplate>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/Default.props",
    "content": "<!--\n***********************************************************************************************\nDefault.props\n\nWARNING:  DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have\n          created a backup copy.  Incorrect changes to this file will make it\n          impossible to load or build your projects from the command-line or the IDE.\n\nCopyright (C) Microsoft Corporation. All rights reserved.\n***********************************************************************************************\n-->\n\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <!-- Import Before -->\n  <Import Condition=\"Exists('$(MSBuildThisFileDirectory)ImportBefore\\Default')\" Project=\"$(MSBuildThisFileDirectory)ImportBefore\\Default\\*.props\" />\n  \n  <PropertyGroup>\n    <TargetOsAndVersion>Windows Phone Silverlight 8.1</TargetOsAndVersion>\n    <RealOSVersion>6.3</RealOSVersion>\n    <PlatformToolset Condition=\"'$(PlatformToolset)' == ''\">v120</PlatformToolset>\n\n    <_PlatformToolsetFriendlyNameFor_v120>Windows Phone Silverlight 8.1 (v120)</_PlatformToolsetFriendlyNameFor_v120>\n    <_PlatformToolsetShortNameFor_v120>Windows Phone Silverlight 8.1</_PlatformToolsetShortNameFor_v120>\n  </PropertyGroup>\n\n  <!-- Import After -->\n  <Import Condition=\"Exists('$(MSBuildThisFileDirectory)ImportAfter\\Default')\" Project=\"$(MSBuildThisFileDirectory)ImportAfter\\Default\\*.props\" />\n</Project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/Demo.sfproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\Service Fabric Tools\\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.props\" />\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>93d81507-bccc-43d6-8667-2d42473f0c32</ProjectGuid>\n    <ProjectVersion>1.0</ProjectVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <None Include=\"Scripts\\Deploy-FabricApplication.ps1\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ChaosTest.ChaosService\\ChaosTest.ChaosService.csproj\" />\n    <ProjectReference Include=\"..\\ChaosTest.WebService\\ChaosTest.WebService.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"ApplicationPackageRoot\\ApplicationManifest.xml\" />\n    <Content Include=\"ApplicationParameters\\Cloud.xml\" />\n    <Content Include=\"ApplicationParameters\\Local.xml\" />\n    <Content Include=\"PublishProfiles\\Cloud.xml\" />\n    <Content Include=\"PublishProfiles\\Local.xml\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\Service Fabric Tools\\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets\" />\n</Project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/Example.mdpolicy",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<PolicySet name=\"Example.mdpolicy\">\r\n  <TextStylePolicy inheritsSet=\"VisualStudio\" inheritsScope=\"text/plain\" scope=\"text/x-csharp\">\r\n    <FileWidth>120</FileWidth>\r\n    <TabsToSpaces>False</TabsToSpaces>\r\n    <NoTabsAfterNonTabs>True</NoTabsAfterNonTabs>\r\n  </TextStylePolicy>\r\n  <DotNetNamingPolicy>\r\n    <DirectoryNamespaceAssociation>None</DirectoryNamespaceAssociation>\r\n    <ResourceNamePolicy>FileFormatDefault</ResourceNamePolicy>\r\n  </DotNetNamingPolicy>\r\n</PolicySet>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/FXMLSample.fxml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<?import javafx.geometry.*?>\n<?import javafx.scene.control.*?>\n<?import java.lang.*?>\n<?import javafx.scene.layout.*?>\n\n\n<BorderPane maxHeight=\"-Infinity\" maxWidth=\"-Infinity\" minHeight=\"-Infinity\" minWidth=\"-Infinity\" prefHeight=\"400.0\" prefWidth=\"600.0\" xmlns=\"http://javafx.com/javafx/8\" xmlns:fx=\"http://javafx.com/fxml/1\">\n   <center>\n      <TableView prefHeight=\"200.0\" prefWidth=\"200.0\" BorderPane.alignment=\"CENTER\">\n        <columns>\n          <TableColumn prefWidth=\"114.0\" text=\"Column 1\" />\n          <TableColumn minWidth=\"0.0\" prefWidth=\"243.0\" text=\"Column 2\" />\n          <TableColumn prefWidth=\"214.0\" text=\"Column 3\" />\n        </columns>\n      </TableView>\n   </center>\n   <bottom>\n      <HBox alignment=\"CENTER_RIGHT\" prefWidth=\"200.0\" spacing=\"10.0\" BorderPane.alignment=\"CENTER\">\n         <children>\n            <Button mnemonicParsing=\"false\" text=\"Button\">\n               <HBox.margin>\n                  <Insets bottom=\"10.0\" left=\"10.0\" right=\"10.0\" top=\"10.0\" />\n               </HBox.margin>\n            </Button>\n         </children>\n      </HBox>\n   </bottom>\n</BorderPane>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/HITSP_C32.sch",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\n<!--\nRetrieved on 2016-08-30 from http://cda-validation.nist.gov/cda-validation/downloads.html.\n\nDisclaimer from the National Institute of Standards and Technology website:\n\n\"Unless otherwise noted, this software was developed at the National Institute of Standards and Technology by employees of the Federal Government in the course of their official duties. Pursuant to title 17 Section 105 of the United States Code this software is not subject to copyright protection and is in the public domain. The CDA Guideline Validator is an experimental system. NIST assumes no responsibility whatsoever for its use by other parties, and makes no guarantees, expressed or implied, about its quality, reliability, or any other characteristic. We would appreciate acknowledgement if the software is used.\"\n -->\n\n<!DOCTYPE schema [\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.1  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.1.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.2  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.2.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.3  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.3.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.4  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.4.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.5  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.5.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.6  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.6.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.7  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.7.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.8  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.8.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.9  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.9.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.10  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.10.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.11  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.11.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.12  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.12.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.13  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.13.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.14  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.14.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.15  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.15.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.16  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.16.ent'>\n<!ENTITY ent-2.16.840.1.113883.3.88.11.32.17  SYSTEM 'templates/2.16.840.1.113883.3.88.11.32.17.ent'>\n]>\n<schema xmlns=\"http://www.ascc.net/xml/schematron\" xmlns:cda=\"urn:hl7-org:v3\">\n    <!--\n        To use iso schematron instead of schematron 1.5,\n        change the xmlns attribute from\n        \"http://www.ascc.net/xml/schematron\"\n        to\n        \"http://purl.oclc.org/dsdl/schematron\"\n    -->\n    <title>HITSP_C32</title>\n    <ns prefix=\"cda\" uri=\"urn:hl7-org:v3\"/>\n    <ns prefix=\"sdtc\" uri=\"urn:hl7-org:sdtc\"/>\n    <ns prefix=\"xsi\" uri=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n\n    <phase id='errors'>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.1-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.2-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.3-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.4-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.5-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.6-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.7-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.8-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.9-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.10-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.11-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.12-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.13-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.14-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.15-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.16-errors'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.17-errors'/>\n    </phase>\n\n    <phase id='warning'>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.1-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.2-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.3-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.4-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.5-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.6-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.7-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.8-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.9-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.10-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.11-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.12-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.13-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.14-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.15-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.16-warning'/>\n        <active pattern='p-2.16.840.1.113883.3.88.11.32.17-warning'/>\n    </phase>\n\n     <phase id='note'>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.1-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.2-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.3-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.4-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.5-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.6-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.7-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.8-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.9-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.10-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.11-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.12-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.13-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.14-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.15-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.16-note'/>\n         <active pattern='p-2.16.840.1.113883.3.88.11.32.17-note'/>\n     </phase>\n\n     <phase id='violation'>\n\n<active pattern='p-2.16.840.1.113883.3.88.11.32.4-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.5-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.6-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.7-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.8-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.9-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.10-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.11-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.12-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.13-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.14-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.15-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.16-violation'/>\n<active pattern='p-2.16.840.1.113883.3.88.11.32.17-violation'/>\n\n     </phase>\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.1 -->\n    <!-- HITSP/C32 Registration and Medication History -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.1;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.2 -->\n    <!-- HITSP/C32 Language Spoken Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.2;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.3 -->\n    <!-- HITSP/C32 Support Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.3;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.4 -->\n    <!-- HITSP/C32 Healthcare Provider Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.4;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.5 -->\n    <!-- HITSP/C32 Insurance Provider Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.5;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.6 -->\n    <!-- HITSP/C32 Allergies and Drug Sensitivities Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.6;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.7 -->\n    <!-- HITSP/C32 Conditions Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.7;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.8 -->\n    <!-- HITSP/C32 Medications - Administration Information Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.8;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.9 -->\n    <!-- HITSP/C32 Medications Module, Medication Information data element -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.9;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.10 -->\n    <!-- HITSP/C32 Medications Module, Medication Information, Type of Medication data element -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.10;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.11 -->\n    <!-- HITSP/C32 Order Information data element -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.11;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.12 -->\n    <!-- HITSP/C32 Comments Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.12;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.13 -->\n    <!-- HITSP/C32 Advance Directives Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.13;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.14 -->\n    <!-- HITSP/C32 Immunizations Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.14;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.15 -->\n    <!-- HITSP/C32 Vital Signs Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.15;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.16 -->\n    <!-- HITSP/C32 Results Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.16;\n\n    <!-- Template_2.16.840.1.113883.3.88.11.32.17 -->\n    <!-- HITSP/C32 Encounters Module -->\n\n    &ent-2.16.840.1.113883.3.88.11.32.17;\n\n</schema>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/JSBrowser.jsproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|AnyCPU\">\n      <Configuration>Debug</Configuration>\n      <Platform>AnyCPU</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|ARM\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x86\">\n      <Configuration>Debug</Configuration>\n      <Platform>x86</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|AnyCPU\">\n      <Configuration>Release</Configuration>\n      <Platform>AnyCPU</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM</Platform>\n      <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n      <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x86\">\n      <Configuration>Release</Configuration>\n      <Platform>x86</Platform>\n      <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>42fc11d8-64c6-4967-a15a-dfd787f68766</ProjectGuid>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup Condition=\"'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0'\">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\$(WMSJSProjectDirectory)\\Microsoft.VisualStudio.$(WMSJSProject).Default.props\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\$(WMSJSProjectDirectory)\\Microsoft.VisualStudio.$(WMSJSProject).props\" />\n  <PropertyGroup>\n    <EnableDotNetNativeCompatibleProfile>true</EnableDotNetNativeCompatibleProfile>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.10240.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>$(VersionNumberMajor).$(VersionNumberMinor)</MinimumVisualStudioVersion>\n    <DefaultLanguage>en-US</DefaultLanguage>\n  </PropertyGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n    <Content Include=\"css\\browser.css\" />\n    <Content Include=\"default.html\" />\n    <Content Include=\"images\\icons.png\" />\n    <Content Include=\"images\\logo_150x150.png\" />\n    <Content Include=\"images\\logo_310x150.png\" />\n    <Content Include=\"images\\logo_310x310.png\" />\n    <Content Include=\"images\\logo_44x44.png\" />\n    <Content Include=\"images\\logo_71x71.png\" />\n    <Content Include=\"images\\logo_badge.png\" />\n    <Content Include=\"images\\logo_bg.png\" />\n    <Content Include=\"images\\logo_splash.png\" />\n    <Content Include=\"images\\logo_store.png\" />\n    <Content Include=\"js\\components\\address-bar.js\" />\n    <Content Include=\"js\\browser.js\" />\n    <Content Include=\"js\\components\\favorites.js\" />\n    <Content Include=\"js\\components\\navigation.js\" />\n    <Content Include=\"js\\components\\settings.js\" />\n    <Content Include=\"js\\components\\title-bar.js\" />\n    <Content Include=\"js\\components\\webview.js\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\NativeListener\\NativeListener.vcxproj\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\$(WMSJSProjectDirectory)\\Microsoft.VisualStudio.$(WMSJSProject).targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below then uncomment\n       that target and the DisableFastUpToDateCheck PropertyGroup.\n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  <PropertyGroup>\n    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>\n  </PropertyGroup>\n  -->\n</Project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/MDM.adml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--  (c) 2016 Microsoft Corporation  -->\n<policyDefinitionResources xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" revision=\"1.0\" schemaVersion=\"1.0\" xmlns=\"http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions\">\n  <displayName>enter display name here</displayName>\n  <description>enter description here</description>\n  <resources>\n    <stringTable>\n      <string id=\"MDM\">MDM</string>\n      <string id=\"MDM_MDM_DisplayName\">Disable MDM Enrollment</string>\n      <string id=\"MDM_MDM_Help\">This policy setting specifies whether Mobile Device Management (MDM) Enrollment is allowed. When MDM is enabled, it allows the user to have the computer remotely managed by a MDM Server.  \n\nIf you do not configure this policy setting, MDM Enrollment will be enabled. \n\nIf you enable this policy setting, MDM Enrollment will be disabled for all users. It will not unenroll existing MDM enrollments.\n\nIf you disable this policy setting, MDM Enrollment will be enabled for all users.\n</string>\n    </stringTable>\n  </resources>\n</policyDefinitionResources>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/MDM.admx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--  (c) 2016 Microsoft Corporation  -->\n<policyDefinitions xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" revision=\"1.0\" schemaVersion=\"1.0\" xmlns=\"http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions\">\n  <policyNamespaces>\n    <target prefix=\"mdm\" namespace=\"Microsoft.Policies.MDM\" />\n    <using prefix=\"windows\" namespace=\"Microsoft.Policies.Windows\" />\n  </policyNamespaces>\n  <resources minRequiredRevision=\"1.0\" />\n  <categories>\n    <category name=\"MDM\" displayName=\"$(string.MDM)\">\n      <parentCategory ref=\"windows:WindowsComponents\" />\n    </category>\n  </categories>\n  <policies>\n    <policy name=\"MDM_MDM_DisplayName\" class=\"Machine\" displayName=\"$(string.MDM_MDM_DisplayName)\" explainText=\"$(string.MDM_MDM_Help)\" key=\"Software\\Policies\\Microsoft\\Windows\\CurrentVersion\\MDM\" valueName=\"DisableRegistration\">\n      <parentCategory ref=\"MDM\" />\n      <supportedOn ref=\"windows:SUPPORTED_Windows_10_0_NOSERVER\" />\n      <enabledValue>\n        <decimal value=\"1\" />\n      </enabledValue>\n      <disabledValue>\n        <decimal value=\"0\" />\n      </disabledValue>\n    </policy>\n  </policies>\n</policyDefinitions>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/MainView.ux",
    "content": "<App Theme=\"Basic\">\n\t<DockPanel>\n\t\t<TopFrameBackground Dock=\"Top\" />\n\t\t<Panel>\n\t\t\t<Rectangle ux:Name=\"newLayoutMaster\" Width=\"50\" Height=\"50\" Color=\"#8889\" Alignment=\"TopLeft\" Margin=\"20,50\"/>\n\t\t\t<StackPanel Alignment=\"Top\">\n\t\t\t\t<TextInput PlaceholderText=\"Click me to show the keyboard\" Alignment=\"Center\">\n\t\t\t\t\t<WhileKeyboardVisible>\n\t\t\t\t\t\t<Move Target=\"rect3\" RelativeTo=\"Keyboard\" Y=\"-1\" Duration=\"0.5\" />\n\t\t\t\t\t</WhileKeyboardVisible>\n\t\t\t\t</TextInput>\n\t\t\t\t<Button Text=\"Click me\" Alignment=\"Center\">\n\t\t\t\t\t<WhilePressed>\n\t\t\t\t\t\t<Move Target=\"rect1\" RelativeTo=\"Size\" Y=\"-1\" Duration=\"0.5\" />\n\t\t\t\t\t\t<Move Target=\"rect2\" RelativeTo=\"ParentSize\" Y=\"-1\" Duration=\"0.5\" />\n\t\t\t\t\t\t<Move Target=\"rect5\" RelativeTo=\"Size\" RelativeNode=\"relativeNode\" Y=\"-1\" Duration=\"0.5\" />\n\t\t\t\t\t</WhilePressed>\n\t\t\t\t</Button>\n\t\t\t\t<Switch>\n\t\t\t\t\t<WhileTrue>\n\t\t\t\t\t\t<Change rect4.LayoutMaster=\"newLayoutMaster\" />\n\t\t\t\t\t</WhileTrue>\n\t\t\t\t</Switch>\n\t\t\t</StackPanel>\n\t\t\t<Rectangle ux:Name=\"relativeNode\" Height=\"400\" Width=\"50\" Color=\"#bbf\" Alignment=\"BottomRight\">\n\t\t\t\t<VerticalText Alignment=\"Center\" Width=\"200\">relativeNode</VerticalText>\n\t\t\t</Rectangle>\n\n\t\t\t<Text ux:Class=\"VerticalText\" TransformOrigin=\"Center\" Alignment=\"Bottom\" TextColor=\"#000\">\n\t\t\t\t<Rotation Degrees=\"-90\" />\n\t\t\t</Text>\n\n\t\t\t<Grid ColumnCount=\"5\" Rows=\"3*,1*\" Color=\"#ddd\" Width=\"80%\" Height=\"100%\" Alignment=\"BottomLeft\">\n\t\t\t\t<VerticalText Width=\"200\">RelativeTo=\"Size\"</VerticalText>\n\t\t\t\t<VerticalText Width=\"200\">RelativeTo=\"ParentSize\"</VerticalText>\n\t\t\t\t<VerticalText Width=\"200\">RelativeTo=\"Keyboard\"</VerticalText>\n\t\t\t\t<VerticalText Width=\"200\">RelativeTo=\"PositionChange\"</VerticalText>\n\t\t\t\t<VerticalText Width=\"200\">RelativeNode=\"relativeNode\"</VerticalText>\n\n\n\n\t\t\t\t<Rectangle ux:Name=\"rect1\" Width=\"50\" Height=\"50\" Color=\"#f00\" Alignment=\"Bottom\"/>\n\t\t\t\t<Rectangle ux:Name=\"rect2\" Width=\"50\" Height=\"50\" Color=\"#0f0\" Alignment=\"Bottom\"/>\n\t\t\t\t<Rectangle ux:Name=\"rect3\" Width=\"50\" Height=\"50\" Color=\"#00f\" Alignment=\"Bottom\"/>\n\t\t\t\t<Panel Alignment=\"Bottom\" Width=\"50\" Height=\"50\">\n\t\t\t\t\t<Rectangle ux:Name=\"rect4\" Width=\"50\" Height=\"50\" Color=\"#0ff\" LayoutMaster=\"layoutMaster\">\n\t\t\t\t\t\t<LayoutAnimation>\n\t\t\t\t\t\t\t<Move RelativeTo=\"PositionChange\" X=\"1\" Y=\"1\" Duration=\"0.5\" />\n\t\t\t\t\t\t</LayoutAnimation>\n\t\t\t\t\t</Rectangle>\n\t\t\t\t\t<Rectangle ux:Name=\"layoutMaster\" Width=\"50\" Height=\"50\"/>\n\t\t\t\t</Panel>\n\t\t\t\t<Rectangle ux:Name=\"rect5\" Width=\"50\" Height=\"50\" Color=\"#f0f\" Alignment=\"Bottom\"/>\n\t\t\t</Grid>\n\t\t</Panel>\n\t</DockPanel>\n</App>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/MyApp.ux",
    "content": "<App Theme=\"Basic\">\n\t<EdgeNavigator HitTestMode=\"LocalBoundsAndChildren\">\n\t\t<Panel Width=\"150\" EdgeNavigation.Edge=\"Left\" Background=\"#f63\" />\n\n\t\t<Panel>\n\t\t\t<Text Alignment=\"Center\">\n\t\t\t\tThis is an example of EdgeNavigator!\n\t\t\t</Text>\n\t\t</Panel>\n\t</EdgeNavigator>\n</App>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/NDepends_Example.ndproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<NDepend AppName=\"ExampleNDApp\" Platform=\"DotNet\">\n  <OutputDir KeepHistoric=\"True\" KeepXmlFiles=\"True\">c:\\temp</OutputDir>\n  <Assemblies />\n  <FrameworkAssemblies />\n  <Dirs>\n    <Dir>C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319</Dir>\n    <Dir>C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\WPF</Dir>\n  </Dirs>\n  <Report Kind=\"0\" SectionsEnabled=\"12287\" XslPath=\"\" Flags=\"64512\">\n    <Section Enabled=\"True\">Application Metrics</Section>\n    <Section Enabled=\"True\">.NET Assemblies Metrics</Section>\n    <Section Enabled=\"True\">Treemap Metric View</Section>\n    <Section Enabled=\"True\">.NET Assemblies Abstractness vs. Instability</Section>\n    <Section Enabled=\"True\">.NET Assemblies Dependencies</Section>\n    <Section Enabled=\"True\">.NET Assemblies Dependency Graph</Section>\n    <Section Enabled=\"True\">.NET Assemblies Build Order</Section>\n    <Section Enabled=\"True\">Analysis Log</Section>\n    <Section Enabled=\"True\">CQL Rules Violated</Section>\n    <Section Enabled=\"True\">Types Metrics</Section>\n    <Section Enabled=\"False\">Types Dependencies</Section>\n  </Report>\n  <BuildComparisonSetting ProjectMode=\"DontCompare\" BuildMode=\"MostRecentAnalysisResultAvailable\" ProjectFileToCompareWith=\"\" BuildFileToCompareWith=\"\" NDaysAgo=\"1\" />\n  <BaselineInUISetting ProjectMode=\"DontCompare\" BuildMode=\"MostRecentAnalysisResultAvailable\" ProjectFileToCompareWith=\"\" BuildFileToCompareWith=\"\" NDaysAgo=\"1\" />\n  <CoverageFiles UncoverableAttribute=\"\" />\n  <SourceFileRebasing FromPath=\"\" ToPath=\"\" />\n  <Queries>\n    <Group Name=\"Code Quality\" Active=\"True\" ShownInReport=\"False\">\n      <Query Active=\"True\" DisplayList=\"True\" DisplayStat=\"True\" DisplaySelectionView=\"False\" IsCriticalRule=\"False\"><![CDATA[// <Name>Discard generated and designer Methods from JustMyCode</Name>\n// --- Make sure to make this query richer to discard generated methods from NDepend rules results ---\nnotmycode \n\n//\n// First define source files paths to discard\n//\nfrom a in Application.Assemblies \nwhere a.SourceFileDeclAvailable \nlet asmSourceFilesPaths = a.SourceDecls.Select(s => s.SourceFile.FilePath)\n\nlet sourceFilesPathsToDiscard = (\n    from filePath in asmSourceFilesPaths \n    let filePathLower= filePath.ToString().ToLower()\n    where     \n      filePathLower.EndsWithAny(\n        \".g.cs\",        // Popular pattern to name generated files.\n        \".g.vb\",\n        \".xaml\",        // notmycode WPF xaml code\n        \".designer.cs\", // notmycode C# Windows Forms designer code\n        \".designer.vb\") // notmycode VB.NET Windows Forms designer code\n       ||\n       // notmycode methods in source files in a directory containing generated\n       filePathLower.Contains(\"generated\")\n  select filePath\n).ToHashSet() \n  \n//\n// Second: discard methods in sourceFilesPathsToDiscard \n//\nfrom m in a.ChildMethods\nwhere (m.SourceFileDeclAvailable && \n       sourceFilesPathsToDiscard.Contains(m.SourceDecls.First().SourceFile.FilePath)) ||\n      // Generated methods might be tagged with this attribute\n      m.HasAttribute (\"System.CodeDom.Compiler.GeneratedCodeAttribute\".AllowNoMatch())\nselect new { m, m.NbLinesOfCode }]]></Query>\n      <Query Active=\"True\" DisplayList=\"True\" DisplayStat=\"True\" DisplaySelectionView=\"False\" IsCriticalRule=\"False\"><![CDATA[// <Name>Discard generated Fields from JustMyCode</Name>\n// --- Make sure to make this query richer to discard generated fields from NDepend rules results ---\nnotmycode\nfrom f in Application.Fields where \n  f.HasAttribute (\"System.CodeDom.Compiler.GeneratedCodeAttribute\".AllowNoMatch()) ||\n\n  // Eliminate \"components\" generated in Windows Form Conrol context\n  f.Name == \"components\" && f.ParentType.DeriveFrom(\"System.Windows.Forms.Control\".AllowNoMatch())\nselect f]]></Query>\n    </Group>\n  </Queries>\n  <WarnFilter />\n</NDepend>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/Storyboard.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"6211\" systemVersion=\"14A298i\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"6204\"/>\n    </dependencies>\n    <scenes/>\n</document>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/Strings.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n\t<!-- \n\t\tMicrosoft ResX Schema\n\n\t\tVersion 1.3\n\n\t\tThe primary goals of this format is to allow a simple XML format \n\t\tthat is mostly human readable. The generation and parsing of the \n\t\tvarious data types are done through the TypeConverter classes \n\t\tassociated with the data types.\n\n\t\tExample:\n\n\t\t... ado.net/XML headers & schema ...\n\t\t<resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n\t\t<resheader name=\"version\">1.3</resheader>\n\t\t<resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n\t\t<resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n\t\t<data name=\"Name1\">this is my long string</data>\n\t\t<data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n\t\t<data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n\t\t\t[base64 mime encoded serialized .NET Framework object]\n\t\t</data>\n\t\t<data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n\t\t\t[base64 mime encoded string representing a byte array form of the .NET Framework object]\n\t\t</data>\n\n\t\tThere are any number of \"resheader\" rows that contain simple \n\t\tname/value pairs.\n\n\t\tEach data row contains a name, and value. The row also contains a \n\t\ttype or mimetype. Type corresponds to a .NET class that support \n\t\ttext/value conversion through the TypeConverter architecture. \n\t\tClasses that don't support this are serialized and stored with the \n\t\tmimetype set.\n\n\t\tThe mimetype is used for serialized objects, and tells the \n\t\tResXResourceReader how to depersist the object. This is currently not \n\t\textensible. For a given mimetype the value must be set accordingly:\n\n\t\tNote - application/x-microsoft.net.object.binary.base64 is the format \n\t\tthat the ResXResourceWriter will generate, however the reader can \n\t\tread any of the formats listed below.\n\n\t\tmimetype: application/x-microsoft.net.object.binary.base64\n\t\tvalue   : The object must be serialized with \n\t\t\t: System.Serialization.Formatters.Binary.BinaryFormatter\n\t\t\t: and then encoded with base64 encoding.\n\n\t\tmimetype: application/x-microsoft.net.object.soap.base64\n\t\tvalue   : The object must be serialized with \n\t\t\t: System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n\t\t\t: and then encoded with base64 encoding.\n\n\t\tmimetype: application/x-microsoft.net.object.bytearray.base64\n\t\tvalue   : The object must be serialized into a byte array \n\t\t\t: using a System.ComponentModel.TypeConverter\n\t\t\t: and then encoded with base64 encoding.\n\t-->\n\t\n\t<xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n\t\t<xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n\t\t\t<xsd:complexType>\n\t\t\t\t<xsd:choice maxOccurs=\"unbounded\">\n\t\t\t\t\t<xsd:element name=\"data\">\n\t\t\t\t\t\t<xsd:complexType>\n\t\t\t\t\t\t\t<xsd:sequence>\n\t\t\t\t\t\t\t\t<xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n\t\t\t\t\t\t\t\t<xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n\t\t\t\t\t\t\t</xsd:sequence>\n\t\t\t\t\t\t\t<xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n\t\t\t\t\t\t\t<xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n\t\t\t\t\t\t\t<xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n\t\t\t\t\t\t</xsd:complexType>\n\t\t\t\t\t</xsd:element>\n\t\t\t\t\t<xsd:element name=\"resheader\">\n\t\t\t\t\t\t<xsd:complexType>\n\t\t\t\t\t\t\t<xsd:sequence>\n\t\t\t\t\t\t\t\t<xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n\t\t\t\t\t\t\t</xsd:sequence>\n\t\t\t\t\t\t\t<xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n\t\t\t\t\t\t</xsd:complexType>\n\t\t\t\t\t</xsd:element>\n\t\t\t\t</xsd:choice>\n\t\t\t</xsd:complexType>\n\t\t</xsd:element>\n\t</xsd:schema>\n\t<resheader name=\"resmimetype\">\n\t\t<value>text/microsoft-resx</value>\n\t</resheader>\n\t<resheader name=\"version\">\n\t\t<value>1.3</value>\n\t</resheader>\n\t<resheader name=\"reader\">\n\t\t<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n\t</resheader>\n\t<resheader name=\"writer\">\n\t\t<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n\t</resheader>\n  <data name=\"Argument_InvalidPathChars\" xml:space=\"preserve\">\n    <value>Illegal characters in path.</value>\n  </data>\n</root>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/System.Buffers.pkgproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\\dir.props\" />\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\src\\System.Buffers.builds\">\n      <SupportedFramework>net45;netcore45;netstandardapp1.5;wpa81</SupportedFramework>\n    </ProjectReference>\n  </ItemGroup>\n\n  <Import Project=\"$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\\dir.targets\" />\n</Project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/XmlIO.pluginspec",
    "content": "<plugin name=\"XmlIO\" version=\"0.0.1\" compatVersion=\"0.0.1\">\n    <vendor>FreeMedForms</vendor>\n    <copyright>(C) 2008-2012 by Eric MAEKER, MD</copyright>\n    <license>GPLv3</license>\n    <category>Patient data</category>\n    <description>The XML form loader/saver for FreeMedForms.</description>\n    <url>http://www.freemedforms.com/</url>\n    <dependencyList>\n      <dependency name=\"Core\" version=\"0.0.1\"/>\n      <dependency name=\"FormManager\" version=\"0.0.1\"/>\n      <dependency name=\"Category\" version=\"0.0.1\"/>\n    </dependencyList>\n</plugin>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/chrome.natvis",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- \nCopyright 2015 The Chromium Authors. All rights reserved.\n\nhttps://cs.chromium.org/chromium/src/tools/win/DebugVisualizers/chrome.natvis\n-->\n<AutoVisualizer\n    xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\">\n  <Type Name=\"gfx::Point\">\n    <AlternativeType Name=\"gfx::PointF\"/>\n    <DisplayString>({x_}, {y_})</DisplayString>\n  </Type>\n  <Type Name=\"gfx::Size\">\n    <AlternativeType Name=\"gfx::SizeF\"/>\n    <DisplayString>({width_}, {height_})</DisplayString>\n  </Type>\n  <Type Name=\"gfx::Rect\">\n    <AlternativeType Name=\"gfx::RectF\"/>\n    <DisplayString>({origin_.x_}, {origin_.y_}) x ({size_.width_}, {size_.height_})</DisplayString>\n  </Type>\n  <Type Name=\"scoped_refptr&lt;*&gt;\">\n    <DisplayString Condition=\"ptr_ == 0\">null</DisplayString>\n    <DisplayString>[{((base::subtle::RefCountedBase*)ptr_)-&gt;ref_count_}] {(void*)ptr_} {*ptr_}</DisplayString>\n    <Expand>\n      <Item Name=\"Ptr\">ptr_</Item>\n      <Item Name=\"RefCount\">((base::subtle::RefCountedBase*)ptr_)-&gt;ref_count_</Item>\n    </Expand>\n  </Type>\n  <Type Name=\"base::Optional&lt;*&gt;\">\n    <DisplayString Condition=\"storage_.is_null_\">(null)</DisplayString>\n    <DisplayString>{storage_.value_}</DisplayString>\n  </Type>\n  <Type Name=\"base::RefCounted&lt;*&gt;\">\n    <DisplayString>RefCount: {ref_count_}</DisplayString>\n    <Expand>\n      <Item Name=\"RefCount\">ref_count_</Item>\n    </Expand>\n  </Type>\n  <Type Name=\"IPC::Message::Header\">\n    <DisplayString>{{Routing: {routing}, Type: {type}}}</DisplayString>\n    <Expand>\n      <Item Name=\"RoutingId\">routing</Item>\n      <Item Name=\"Type\">type</Item>\n      <Synthetic Name=\"Priority\"\n                 Condition=\"(flags &amp; IPC::Message::PRIORITY_MASK) ==\n                                IPC::Message::PRIORITY_LOW\">\n        <DisplayString>Low</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Priority\"\n                 Condition=\"(flags &amp; IPC::Message::PRIORITY_MASK) ==\n                                IPC::Message::PRIORITY_NORMAL\">\n        <DisplayString>Normal</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Priority\"\n                 Condition=\"(flags &amp; IPC::Message::PRIORITY_MASK) ==\n                                IPC::Message::PRIORITY_HIGH\">\n        <DisplayString>High</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Sync\"\n                 Condition=\"(flags &amp; IPC::Message::SYNC_BIT) != 0\">\n        <DisplayString>true</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Sync\"\n                 Condition=\"(flags &amp; IPC::Message::SYNC_BIT) == 0\">\n        <DisplayString>false</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Reply\"\n                 Condition=\"(flags &amp; IPC::Message::REPLY_BIT) != 0\">\n        <DisplayString>true</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Reply\"\n                 Condition=\"(flags &amp; IPC::Message::REPLY_BIT) == 0\">\n        <DisplayString>false</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"ReplyError\"\n                 Condition=\"(flags &amp; IPC::Message::REPLY_ERROR_BIT) != 0\">\n        <DisplayString>true</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"ReplyError\"\n                 Condition=\"(flags &amp; IPC::Message::REPLY_ERROR_BIT) == 0\">\n        <DisplayString>false</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Unblock\"\n                 Condition=\"(flags &amp; IPC::Message::UNBLOCK_BIT) != 0\">\n        <DisplayString>true</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Unblock\"\n                 Condition=\"(flags &amp; IPC::Message::UNBLOCK_BIT) == 0\">\n        <DisplayString>false</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"PumpingMessages\"\n                 Condition=\"(flags &amp; IPC::Message::PUMPING_MSGS_BIT) != 0\">\n        <DisplayString>true</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"PumpingMessages\"\n                 Condition=\"(flags &amp; IPC::Message::PUMPING_MSGS_BIT) == 0\">\n        <DisplayString>false</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"HasSentTime\"\n                 Condition=\"(flags &amp; IPC::Message::HAS_SENT_TIME_BIT) != 0\">\n        <DisplayString>true</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"HasSentTime\"\n                 Condition=\"(flags &amp; IPC::Message::HAS_SENT_TIME_BIT) == 0\">\n        <DisplayString>false</DisplayString>\n      </Synthetic>\n    </Expand>\n  </Type>\n  <Type Name=\"IPC::Message\">\n    <DisplayString>{{size = {header_size_+capacity_after_header_}}}</DisplayString>\n    <Expand>\n      <ExpandedItem>*((IPC::Message::Header*)header_),nd</ExpandedItem>\n      <Item Name=\"Payload\">(void*)((char*)header_ + header_size_)</Item>\n    </Expand>\n  </Type>\n  <Type Name=\"base::TimeDelta\">\n    <DisplayString>{delta_}</DisplayString>\n    <Expand>\n      <Synthetic Name=\"Days\">\n        <DisplayString>{(int)(delta_ / {,,base.dll}base::Time::kMicrosecondsPerDay)}</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Hours\">\n        <DisplayString>{(int)(delta_ / {,,base.dll}base::Time::kMicrosecondsPerHour)}</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Minutes\">\n        <DisplayString>{(int)(delta_ / {,,base.dll}base::Time::kMicrosecondsPerMinute)}</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Seconds\">\n        <DisplayString>{(int)(delta_ / {,,base.dll}base::Time::kMicrosecondsPerSecond)}</DisplayString>\n      </Synthetic>\n      <Synthetic Name=\"Milliseconds\">\n        <DisplayString>{(int)(delta_ / {,,base.dll}base::Time::kMicrosecondsPerMillisecond)}</DisplayString>\n      </Synthetic>\n      <Item Name=\"Microseconds\">delta_</Item>\n    </Expand>\n  </Type>\n  <Type Name=\"GURL\">\n    <DisplayString>{spec_}</DisplayString>\n  </Type>\n  <Type Name=\"base::ManualConstructor&lt;*&gt;\">\n    <!-- $T1 expands to the first \"*\" in the name which is the template\n         type. Use that to cast to the correct value. -->\n    <DisplayString>{*($T1*)space_.data_}</DisplayString>\n    <Expand>\n      <ExpandedItem>*($T1*)space_.data_</ExpandedItem>\n    </Expand>\n  </Type>\n  <Type Name=\"base::internal::flat_tree&lt;*&gt;\">\n    <AlternativeType Name=\"base::flat_set&lt;*&gt;\"/>\n    <DisplayString>{impl_.body_}</DisplayString>\n    <Expand>\n      <ExpandedItem>impl_.body_</ExpandedItem>\n    </Expand>\n  </Type>\n  <Type Name=\"base::flat_map&lt;*&gt;\">\n    <DisplayString>{impl_.body_}</DisplayString>\n    <Expand>\n      <ExpandedItem>impl_.body_</ExpandedItem>\n    </Expand>\n  </Type>\n  <Type Name=\"base::Value\">\n    <DisplayString Condition=\"type_ == NONE\">NONE</DisplayString>\n    <DisplayString Condition=\"type_ == BOOLEAN\">BOOLEAN {bool_value_}</DisplayString>\n    <DisplayString Condition=\"type_ == INTEGER\">INTEGER {int_value_}</DisplayString>\n    <DisplayString Condition=\"type_ == DOUBLE\">DOUBLE {double_value_}</DisplayString>\n    <DisplayString Condition=\"type_ == STRING\">STRING {string_value_}</DisplayString>\n    <DisplayString Condition=\"type_ == BINARY\">BINARY {binary_value_}</DisplayString>\n    <DisplayString Condition=\"type_ == DICTIONARY\">DICTIONARY {dict_}</DisplayString>\n    <DisplayString Condition=\"type_ == LIST\">LIST {list_}</DisplayString>\n    <Expand>\n      <Item Name=\"[type]\">type_</Item>\n      <Item Condition=\"type_ == BOOLEAN\" Name=\"[boolean]\">bool_value_</Item>\n      <Item Condition=\"type_ == INTEGER\" Name=\"[integer]\">int_value_</Item>\n      <Item Condition=\"type_ == DOUBLE\" Name=\"[double]\">double_value_</Item>\n      <Item Condition=\"type_ == STRING\" Name=\"[string]\">string_value_</Item>\n      <Item Condition=\"type_ == BINARY\" Name=\"[binary]\">binary_value_</Item>\n      <!-- Put the members for dictionary and list directly inline without\n           requiring a separate expansion to view. -->\n      <ExpandedItem Condition=\"type_ == DICTIONARY\">dict_</ExpandedItem>\n      <ExpandedItem Condition=\"type_ == LIST\">list_</ExpandedItem>\n    </Expand>\n  </Type>\n</AutoVisualizer>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/cloudconfig.cscfg",
    "content": "<?xml version=\"1.0\"?>\n<ServiceConfiguration serviceName=\"MyDef\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration\">\n  <Role name=\"My.Web\">\n    <Instances count=\"1\" />\n    <ConfigurationSettings>\n      <Setting name=\"DiagnosticsConnectionString\" value=\"UseDevelopmentStorage=true\" />\n    </ConfigurationSettings>\n  </Role>\n</ServiceConfiguration>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/clouddef.csdef",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ServiceDefinition name=\"MyDef\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition\">\n  <WebRole name=\"My.Web\">\n    <InputEndpoints>\n      <InputEndpoint name=\"HttpIn\" protocol=\"http\" port=\"80\" />\n    </InputEndpoints>\n    <ConfigurationSettings>\n      <Setting name=\"DiagnosticsConnectionString\" />\n    </ConfigurationSettings>\n  </WebRole>\n</ServiceDefinition>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/configdef.cscfg",
    "content": "<?xml version=\"1.0\"?>\n<ServiceConfiguration serviceName=\"MyDef\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration\">\n  <Role name=\"My.Web\">\n    <Instances count=\"1\" />\n    <ConfigurationSettings>\n      <Setting name=\"DiagnosticsConnectionString\" value=\"UseDevelopmentStorage=true\" />\n    </ConfigurationSettings>\n  </Role>\n</ServiceConfiguration>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/csproj-sample.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{99D9BF15-2911-4D10-8079-83ABAD688E8B}</ProjectGuid>\r\n    <OutputType>Exe</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>csproj_sample</RootNamespace>\r\n    <AssemblyName>csproj-sample</AssemblyName>\r\n    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Xml\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Program.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"App.config\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/dependency-example.depproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" DefaultTargets=\"Build\">\n  <Import Project=\"$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\\dir.props\" />\n  <PropertyGroup>\n    <AssemblyVersion>3.9.0.0</AssemblyVersion>\n    <OutputType>Library</OutputType>\n    <PackageTargetFramework>dotnet5.1</PackageTargetFramework>\n    <NuGetTargetMoniker>.NETPlatform,Version=v5.1</NuGetTargetMoniker>\n  </PropertyGroup>\n  <ItemGroup>\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <Import Project=\"$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\\dir.targets\" />\n</Project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/example-sharedproj.shproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <ProjectGuid>{86244B26-C4AE-4F69-9315-B6148C0FE270}</ProjectGuid>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.Common.Default.props\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.Common.props\" />\n  <Import Project=\"SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.CSharp.targets\" />\n</Project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/example.ccproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>1.0.0</ProductVersion>\n    <ProjectGuid>{0beae469-c1c6-4648-a2e5-0ae0ea9efffa}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>MyDef</RootNamespace>\n    <AssemblyName>MyDef</AssemblyName>\n    <StartDevelopmentStorage>True</StartDevelopmentStorage>\n    <Name>My</Name>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <!-- Items for the project -->\n  <ItemGroup>\n    <ServiceDefinition Include=\"ServiceDefinition.csdef\" />\n    <ServiceConfiguration Include=\"ServiceConfiguration.cscfg\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\My.Web\\My.Web.csproj\">\n      <Name>My.Web</Name>\n      <Project>{1515c2c3-0b57-422c-a6f9-0891b86fb7d3}</Project>\n      <Private>True</Private>\n      <RoleType>Web</RoleType>\n      <RoleName>My.Web</RoleName>\n    </ProjectReference>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/filenames/.cproject",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<?fileVersion 4.0.0?>\n\n<cproject storage_type_id=\"org.eclipse.cdt.core.XmlProjectDescriptionStorage\">\n\t<storageModule moduleId=\"org.eclipse.cdt.core.settings\">\n\t\t<cconfiguration id=\"cdt.managedbuild.config.gnu.exe.debug.1803931088\">\n\t\t\t<storageModule buildSystemId=\"org.eclipse.cdt.managedbuilder.core.configurationDataProvider\" id=\"cdt.managedbuild.config.gnu.exe.debug.1803931088\" moduleId=\"org.eclipse.cdt.core.settings\" name=\"Debug\">\n\t\t\t\t<externalSettings/>\n\t\t\t\t<extensions>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.ELF\" point=\"org.eclipse.cdt.core.BinaryParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GCCErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GASErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GLDErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GmakeErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.CWDLocator\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t</extensions>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"cdtBuildSystem\" version=\"4.0.0\">\n\t\t\t\t<configuration artifactName=\"Graph抽象資料結構\" buildArtefactType=\"org.eclipse.cdt.build.core.buildArtefactType.exe\" buildProperties=\"org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe\" cleanCommand=\"rm -rf\" description=\"\" id=\"cdt.managedbuild.config.gnu.exe.debug.1803931088\" name=\"Debug\" parent=\"cdt.managedbuild.config.gnu.exe.debug\">\n\t\t\t\t\t<folderInfo id=\"cdt.managedbuild.config.gnu.exe.debug.1803931088.\" name=\"/\" resourcePath=\"\">\n\t\t\t\t\t\t<toolChain id=\"cdt.managedbuild.toolchain.gnu.exe.debug.1808064337\" name=\"Linux GCC\" superClass=\"cdt.managedbuild.toolchain.gnu.exe.debug\">\n\t\t\t\t\t\t\t<targetPlatform id=\"cdt.managedbuild.target.gnu.platform.exe.debug.475427293\" name=\"Debug Platform\" superClass=\"cdt.managedbuild.target.gnu.platform.exe.debug\"/>\n\t\t\t\t\t\t\t<builder buildPath=\"${workspace_loc:/Graph抽象資料結構/Debug}\" id=\"cdt.managedbuild.target.gnu.builder.exe.debug.939020465\" keepEnvironmentInBuildfile=\"false\" managedBuildOn=\"true\" name=\"Gnu Make Builder\" superClass=\"cdt.managedbuild.target.gnu.builder.exe.debug\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.archiver.base.1433738663\" name=\"GCC Archiver\" superClass=\"cdt.managedbuild.tool.gnu.archiver.base\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1829995894\" name=\"GCC C++ Compiler\" superClass=\"cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug\">\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.exe.debug.option.optimization.level.442000851\" name=\"Optimization Level\" superClass=\"gnu.cpp.compiler.exe.debug.option.optimization.level\" value=\"gnu.cpp.compiler.optimization.level.none\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.exe.debug.option.debugging.level.508927038\" name=\"Debug Level\" superClass=\"gnu.cpp.compiler.exe.debug.option.debugging.level\" value=\"gnu.cpp.compiler.debugging.level.max\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.include.paths.343012625\" name=\"Include paths (-I)\" superClass=\"gnu.cpp.compiler.option.include.paths\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.preprocessor.def.432825827\" name=\"Defined symbols (-D)\" superClass=\"gnu.cpp.compiler.option.preprocessor.def\" valueType=\"definedSymbols\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"DEBUG\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.cpp.compiler.input.1791758539\" superClass=\"cdt.managedbuild.tool.gnu.cpp.compiler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1529597285\" name=\"GCC C Compiler\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.exe.debug\">\n\t\t\t\t\t\t\t\t<option defaultValue=\"gnu.c.optimization.level.none\" id=\"gnu.c.compiler.exe.debug.option.optimization.level.1364110929\" name=\"Optimization Level\" superClass=\"gnu.c.compiler.exe.debug.option.optimization.level\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.exe.debug.option.debugging.level.1080217050\" name=\"Debug Level\" superClass=\"gnu.c.compiler.exe.debug.option.debugging.level\" value=\"gnu.c.debugging.level.max\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.include.paths.1256182591\" name=\"Include paths (-I)\" superClass=\"gnu.c.compiler.option.include.paths\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.preprocessor.def.symbols.1858410383\" name=\"Defined symbols (-D)\" superClass=\"gnu.c.compiler.option.preprocessor.def.symbols\" valueType=\"definedSymbols\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"DEBUG\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.c.compiler.input.24351646\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.linker.exe.debug.1253142147\" name=\"GCC C Linker\" superClass=\"cdt.managedbuild.tool.gnu.c.linker.exe.debug\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.2139040707\" name=\"GCC C++ Linker\" superClass=\"cdt.managedbuild.tool.gnu.cpp.linker.exe.debug\">\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.cpp.linker.input.1870115166\" superClass=\"cdt.managedbuild.tool.gnu.cpp.linker.input\">\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinputdependency\" paths=\"$(USER_OBJS)\"/>\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinput\" paths=\"$(LIBS)\"/>\n\t\t\t\t\t\t\t\t</inputType>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.assembler.exe.debug.2025871733\" name=\"GCC Assembler\" superClass=\"cdt.managedbuild.tool.gnu.assembler.exe.debug\">\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.assembler.input.1643445921\" superClass=\"cdt.managedbuild.tool.gnu.assembler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t</toolChain>\n\t\t\t\t\t</folderInfo>\n\t\t\t\t\t<sourceEntries>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"\"/>\n\t\t\t\t\t</sourceEntries>\n\t\t\t\t</configuration>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"org.eclipse.cdt.core.externalSettings\"/>\n\t\t\t<storageModule moduleId=\"org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings\"/>\n\t\t\t<storageModule moduleId=\"org.eclipse.cdt.core.language.mapping\"/>\n\t\t</cconfiguration>\n\t\t<cconfiguration id=\"cdt.managedbuild.config.gnu.exe.release.32754498\">\n\t\t\t<storageModule buildSystemId=\"org.eclipse.cdt.managedbuilder.core.configurationDataProvider\" id=\"cdt.managedbuild.config.gnu.exe.release.32754498\" moduleId=\"org.eclipse.cdt.core.settings\" name=\"Release\">\n\t\t\t\t<externalSettings/>\n\t\t\t\t<extensions>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.ELF\" point=\"org.eclipse.cdt.core.BinaryParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GCCErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GASErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GLDErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GmakeErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.CWDLocator\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t</extensions>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"cdtBuildSystem\" version=\"4.0.0\">\n\t\t\t\t<configuration artifactName=\"Graph抽象資料結構\" buildArtefactType=\"org.eclipse.cdt.build.core.buildArtefactType.exe\" buildProperties=\"org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe\" cleanCommand=\"rm -rf\" description=\"\" id=\"cdt.managedbuild.config.gnu.exe.release.32754498\" name=\"Release\" parent=\"cdt.managedbuild.config.gnu.exe.release\">\n\t\t\t\t\t<folderInfo id=\"cdt.managedbuild.config.gnu.exe.release.32754498.\" name=\"/\" resourcePath=\"\">\n\t\t\t\t\t\t<toolChain id=\"cdt.managedbuild.toolchain.gnu.exe.release.1285242355\" name=\"Linux GCC\" superClass=\"cdt.managedbuild.toolchain.gnu.exe.release\">\n\t\t\t\t\t\t\t<targetPlatform id=\"cdt.managedbuild.target.gnu.platform.exe.release.1495976902\" name=\"Debug Platform\" superClass=\"cdt.managedbuild.target.gnu.platform.exe.release\"/>\n\t\t\t\t\t\t\t<builder buildPath=\"${workspace_loc:/Graph抽象資料結構/Release}\" id=\"cdt.managedbuild.target.gnu.builder.exe.release.1973733698\" keepEnvironmentInBuildfile=\"false\" managedBuildOn=\"true\" name=\"Gnu Make Builder\" superClass=\"cdt.managedbuild.target.gnu.builder.exe.release\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.archiver.base.1600860298\" name=\"GCC Archiver\" superClass=\"cdt.managedbuild.tool.gnu.archiver.base\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1473926095\" name=\"GCC C++ Compiler\" superClass=\"cdt.managedbuild.tool.gnu.cpp.compiler.exe.release\">\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.exe.release.option.optimization.level.1632726668\" name=\"Optimization Level\" superClass=\"gnu.cpp.compiler.exe.release.option.optimization.level\" value=\"gnu.cpp.compiler.optimization.level.most\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.exe.release.option.debugging.level.2009085397\" name=\"Debug Level\" superClass=\"gnu.cpp.compiler.exe.release.option.debugging.level\" value=\"gnu.cpp.compiler.debugging.level.none\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.include.paths.1869632172\" name=\"Include paths (-I)\" superClass=\"gnu.cpp.compiler.option.include.paths\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.preprocessor.def.1246679568\" name=\"Defined symbols (-D)\" superClass=\"gnu.cpp.compiler.option.preprocessor.def\" valueType=\"definedSymbols\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"NDEBUG\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.cpp.compiler.input.1744095710\" superClass=\"cdt.managedbuild.tool.gnu.cpp.compiler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.compiler.exe.release.478520411\" name=\"GCC C Compiler\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.exe.release\">\n\t\t\t\t\t\t\t\t<option defaultValue=\"gnu.c.optimization.level.most\" id=\"gnu.c.compiler.exe.release.option.optimization.level.1683736183\" name=\"Optimization Level\" superClass=\"gnu.c.compiler.exe.release.option.optimization.level\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.exe.release.option.debugging.level.171063916\" name=\"Debug Level\" superClass=\"gnu.c.compiler.exe.release.option.debugging.level\" value=\"gnu.c.debugging.level.none\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.include.paths.1466846915\" name=\"Include paths (-I)\" superClass=\"gnu.c.compiler.option.include.paths\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.preprocessor.def.symbols.659261280\" name=\"Defined symbols (-D)\" superClass=\"gnu.c.compiler.option.preprocessor.def.symbols\" valueType=\"definedSymbols\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"NDEBUG\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.c.compiler.input.892999416\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.linker.exe.release.977357087\" name=\"GCC C Linker\" superClass=\"cdt.managedbuild.tool.gnu.c.linker.exe.release\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.linker.exe.release.1587341853\" name=\"GCC C++ Linker\" superClass=\"cdt.managedbuild.tool.gnu.cpp.linker.exe.release\">\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.cpp.linker.input.1655647987\" superClass=\"cdt.managedbuild.tool.gnu.cpp.linker.input\">\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinputdependency\" paths=\"$(USER_OBJS)\"/>\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinput\" paths=\"$(LIBS)\"/>\n\t\t\t\t\t\t\t\t</inputType>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.assembler.exe.release.721843795\" name=\"GCC Assembler\" superClass=\"cdt.managedbuild.tool.gnu.assembler.exe.release\">\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.assembler.input.827453761\" superClass=\"cdt.managedbuild.tool.gnu.assembler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t</toolChain>\n\t\t\t\t\t</folderInfo>\n\t\t\t\t\t<sourceEntries>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"\"/>\n\t\t\t\t\t</sourceEntries>\n\t\t\t\t</configuration>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"org.eclipse.cdt.core.externalSettings\"/>\n\t\t\t<storageModule moduleId=\"org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings\"/>\n\t\t\t<storageModule moduleId=\"org.eclipse.cdt.core.language.mapping\"/>\n\t\t</cconfiguration>\n\t</storageModule>\n\t<storageModule moduleId=\"cdtBuildSystem\" version=\"4.0.0\">\n\t\t<project id=\"Graph抽象資料結構.cdt.managedbuild.target.gnu.exe.1361850129\" name=\"Executable\" projectType=\"cdt.managedbuild.target.gnu.exe\"/>\n\t</storageModule>\n\t<storageModule moduleId=\"scannerConfiguration\">\n\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile\"/>\n\t\t<profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile\">\n\t\t\t<buildOutputProvider>\n\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</buildOutputProvider>\n\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/${specs_file}\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</scannerInfoProvider>\n\t\t</profile>\n\t\t<profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile\">\n\t\t\t<buildOutputProvider>\n\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</buildOutputProvider>\n\t\t\t<scannerInfoProvider id=\"makefileGenerator\">\n\t\t\t\t<runAction arguments=\"-f ${project_name}_scd.mk\" command=\"make\" useDefault=\"true\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</scannerInfoProvider>\n\t\t</profile>\n\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile\">\n\t\t\t<buildOutputProvider>\n\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</buildOutputProvider>\n\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/${specs_file}\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</scannerInfoProvider>\n\t\t</profile>\n\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP\">\n\t\t\t<buildOutputProvider>\n\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</buildOutputProvider>\n\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/specs.cpp\" command=\"g++\" useDefault=\"true\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</scannerInfoProvider>\n\t\t</profile>\n\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC\">\n\t\t\t<buildOutputProvider>\n\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</buildOutputProvider>\n\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/specs.c\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</scannerInfoProvider>\n\t\t</profile>\n\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile\">\n\t\t\t<buildOutputProvider>\n\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</buildOutputProvider>\n\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t<runAction arguments=\"-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</scannerInfoProvider>\n\t\t</profile>\n\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP\">\n\t\t\t<buildOutputProvider>\n\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</buildOutputProvider>\n\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t<runAction arguments=\"-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</scannerInfoProvider>\n\t\t</profile>\n\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC\">\n\t\t\t<buildOutputProvider>\n\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</buildOutputProvider>\n\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t<runAction arguments=\"-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t</scannerInfoProvider>\n\t\t</profile>\n\t\t<scannerConfigBuildInfo instanceId=\"cdt.managedbuild.config.gnu.exe.debug.1803931088;cdt.managedbuild.config.gnu.exe.debug.1803931088.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1529597285;cdt.managedbuild.tool.gnu.c.compiler.input.24351646\">\n\t\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC\"/>\n\t\t\t<profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/${specs_file}\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"makefileGenerator\">\n\t\t\t\t\t<runAction arguments=\"-f ${project_name}_scd.mk\" command=\"make\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/${specs_file}\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/specs.cpp\" command=\"g++\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/specs.c\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t</scannerConfigBuildInfo>\n\t\t<scannerConfigBuildInfo instanceId=\"cdt.managedbuild.config.gnu.exe.release.32754498;cdt.managedbuild.config.gnu.exe.release.32754498.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1473926095;cdt.managedbuild.tool.gnu.cpp.compiler.input.1744095710\">\n\t\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP\"/>\n\t\t\t<profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/${specs_file}\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"makefileGenerator\">\n\t\t\t\t\t<runAction arguments=\"-f ${project_name}_scd.mk\" command=\"make\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/${specs_file}\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/specs.cpp\" command=\"g++\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/specs.c\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t</scannerConfigBuildInfo>\n\t\t<scannerConfigBuildInfo instanceId=\"cdt.managedbuild.config.gnu.exe.debug.1803931088;cdt.managedbuild.config.gnu.exe.debug.1803931088.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1829995894;cdt.managedbuild.tool.gnu.cpp.compiler.input.1791758539\">\n\t\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP\"/>\n\t\t\t<profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/${specs_file}\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"makefileGenerator\">\n\t\t\t\t\t<runAction arguments=\"-f ${project_name}_scd.mk\" command=\"make\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/${specs_file}\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/specs.cpp\" command=\"g++\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/specs.c\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t</scannerConfigBuildInfo>\n\t\t<scannerConfigBuildInfo instanceId=\"cdt.managedbuild.config.gnu.exe.release.32754498;cdt.managedbuild.config.gnu.exe.release.32754498.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.478520411;cdt.managedbuild.tool.gnu.c.compiler.input.892999416\">\n\t\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC\"/>\n\t\t\t<profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/${specs_file}\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"makefileGenerator\">\n\t\t\t\t\t<runAction arguments=\"-f ${project_name}_scd.mk\" command=\"make\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/${specs_file}\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/specs.cpp\" command=\"g++\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-E -P -v -dD ${plugin_state_location}/specs.c\" command=\"gcc\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t\t<profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC\">\n\t\t\t\t<buildOutputProvider>\n\t\t\t\t\t<openAction enabled=\"true\" filePath=\"\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</buildOutputProvider>\n\t\t\t\t<scannerInfoProvider id=\"specsFile\">\n\t\t\t\t\t<runAction arguments=\"-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'\" command=\"sh\" useDefault=\"true\"/>\n\t\t\t\t\t<parser enabled=\"true\"/>\n\t\t\t\t</scannerInfoProvider>\n\t\t\t</profile>\n\t\t</scannerConfigBuildInfo>\n\t</storageModule>\n\t<storageModule moduleId=\"refreshScope\"/>\n</cproject>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/fsproj-sample.fsproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <SchemaVersion>2.0</SchemaVersion>\r\n    <ProjectGuid>6cfa7a11-a5cd-4301-bd7b-b210d4d51a29</ProjectGuid>\r\n    <OutputType>Exe</OutputType>\r\n    <RootNamespace>fsproj_sample</RootNamespace>\r\n    <AssemblyName>fsproj_sample</AssemblyName>\r\n    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>\r\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\r\n    <TargetFSharpCoreVersion>4.3.1.0</TargetFSharpCoreVersion>\r\n    <Name>fsproj-sample</Name>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <Tailcalls>false</Tailcalls>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <WarningLevel>3</WarningLevel>\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DocumentationFile>bin\\Debug\\fsproj_sample.XML</DocumentationFile>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <Tailcalls>true</Tailcalls>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <WarningLevel>3</WarningLevel>\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DocumentationFile>bin\\Release\\fsproj_sample.XML</DocumentationFile>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"mscorlib\" />\r\n    <Reference Include=\"FSharp.Core, Version=$(TargetFSharpCoreVersion), Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n      <Private>True</Private>\r\n    </Reference>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Numerics\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Program.fs\" />\r\n    <None Include=\"App.config\" />\r\n  </ItemGroup>\r\n  <PropertyGroup>\r\n    <MinimumVisualStudioVersion Condition=\"'$(MinimumVisualStudioVersion)' == ''\">11</MinimumVisualStudioVersion>\r\n  </PropertyGroup>\r\n  <Choose>\r\n    <When Condition=\"'$(VisualStudioVersion)' == '11.0'\">\r\n      <PropertyGroup Condition=\"Exists('$(MSBuildExtensionsPath32)\\..\\Microsoft SDKs\\F#\\3.0\\Framework\\v4.0\\Microsoft.FSharp.Targets')\">\r\n        <FSharpTargetsPath>$(MSBuildExtensionsPath32)\\..\\Microsoft SDKs\\F#\\3.0\\Framework\\v4.0\\Microsoft.FSharp.Targets</FSharpTargetsPath>\r\n      </PropertyGroup>\r\n    </When>\r\n    <Otherwise>\r\n      <PropertyGroup Condition=\"Exists('$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\FSharp\\Microsoft.FSharp.Targets')\">\r\n        <FSharpTargetsPath>$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\FSharp\\Microsoft.FSharp.Targets</FSharpTargetsPath>\r\n      </PropertyGroup>\r\n    </Otherwise>\r\n  </Choose>\r\n  <Import Project=\"$(FSharpTargetsPath)\" />\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/intellij.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"WEB_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <sourceFolder url=\"file://$MODULE_DIR$/src\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/test\" isTestSource=\"true\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n    <orderEntry type=\"library\" name=\"backend node_modules\" level=\"project\" />\n  </component>\n</module>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/libsomething.dll.config",
    "content": "<configuration>\n  <dllmap dll=\"libsomething\">\n    <dllentry dll=\"libdifferent.so\" name=\"somefunction\" target=\"differentfunction\" />\n    <dllentry os=\"solaris,freebsd\" dll=\"libanother.so\" name=\"somefunction\" target=\"differentfunction\" />\n  </dllmap>\n</configuration> \n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/module.ant",
    "content": "<?xml version=\"1.0\"?>\n<project name=\"org.apache.easyant#standard-java-app\" xmlns:ea=\"antlib:org.apache.easyant\">\n    <description>\n        This easyant module.ant sample file is optionnal and designed to customize your build with your own specific target.\n    </description>\n\n    <target name=\"an-additionnal-target\">\n       <echo>my awesome additionnal target</echo>\n    </target>\n\n    <target name=\"a-specific-pre-compile-step\" extensionOf=\"abstract-compile:compile-ready\">\n       <echo>i would love easyant i could easily plug my own specific pre compile step</echo>\n    </target>                \n                \n</project>              \n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/module.ivy",
    "content": "<?xml version=\"1.0\"?>\n<ivy-module version=\"2.0\" xmlns:ea=\"http://www.easyant.org\"> \n    <info organisation=\"org.apache.easyant\" module=\"standard-java-app\" revision=\"0.1\" status=\"integration\" >\n        <description>\n            this is a easyant module.ivy sample file for java standard application\n        </description>\n        <!--\n            This easyant section is equivalent to having a module.ant like this:\n            \n            <project name=\"org.apache.easyant#standard-java-app\"\n                xmlns:ea=\"antlib:org.apache.easyant\">\n                \n                <property name=\"run.main.classname\" value=\"org.apache.easyant.example.Example\"/>\n            \n                <ea:build organisation=\"org.apache.easyant.buildtypes\" module=\"build-std-java\" revision=\"0.9\"/>\n                <ea:plugin organisation=\"org.apache.easyant.plugins\" module=\"run-java\" revision=\"0.9\"/>\n            </project>              \n          -->\n        <ea:build organisation=\"org.apache.easyant.buildtypes\" module=\"build-std-java\" revision=\"0.9\"/>\n            <ea:property name=\"run.main.classname\" value=\"org.apache.easyant.example.Example\"/>\n            <ea:plugin organisation=\"org.apache.easyant.plugins\" module=\"run-java\" revision=\"0.9\"/>\n        </ea:build>\n    </info>\n    <configurations>\n        <conf name=\"default\" visibility=\"public\" description=\"runtime dependencies and master artifact can be used with this conf\"/>\n        <conf name=\"test\" visibility=\"private\" description=\"this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases.\"/>\n    </configurations>\n    <dependencies>\n        <dependency org=\"hsqldb\" name=\"hsqldb\" rev=\"1.8.0.7\" conf=\"default->default\"/>\n        <dependency org=\"junit\" name=\"junit\" rev=\"4.4\" conf=\"test->default\" />\n\n    </dependencies>\n</ivy-module>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/msbuild-example.proj",
    "content": "﻿<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\MSBuildCommunityTasks\\MSBuild.Community.Tasks.Targets\"/>\n  <UsingTask TaskName=\"Microsoft.Build.Tasks.XmlPeek\" AssemblyName=\"Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"/>\n  <UsingTask TaskName=\"Microsoft.Build.Tasks.XmlPoke\" AssemblyName=\"Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"/>\n  <PropertyGroup>\n    <SolutionRoot>$(MSBuildProjectDirectory)\\..</SolutionRoot>\n    <ProjectRoot>$(SolutionRoot)\\Src\\Bowerbird.Website</ProjectRoot>\n    <ArtifactsDir>$(SolutionRoot)\\Release</ArtifactsDir>\n    <CurrentBuildDateStamp>$([System.DateTime]::Now.ToString(\"yyyyMMdd\"))</CurrentBuildDateStamp>\n    <CurrentBuildTimeStamp>$([System.DateTime]::Now.ToString(\"hhmm\"))</CurrentBuildTimeStamp>\n    <CurrentBuildDir>$(ArtifactsDir)\\$(CurrentBuildDateStamp)-$(Configuration)</CurrentBuildDir>\n  </PropertyGroup>\n  <PropertyGroup>\n    <VersionMajor>0</VersionMajor>\n    <VersionMinor>1</VersionMinor>\n    <VersionPatch>0</VersionPatch>\n    <VersionPreRelease></VersionPreRelease>\n  </PropertyGroup>\n  <PropertyGroup>\n    <WebConfig>$(CurrentBuildDir)\\Web.config</WebConfig>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageFiles Include=\"$(ProjectRoot)\\**\\*.*\"\n                  Exclude=\"$(ProjectRoot)\\bin\\*.pdb;\n                  $(ProjectRoot)\\bin\\*.xml;\n                  $(ProjectRoot)\\Logs\\**\\*.*;\n                  $(ProjectRoot)\\obj\\**\\*.*;\n                  $(ProjectRoot)\\test\\**\\*.*;\n                  $(ProjectRoot)\\media\\**\\*.*;\n                  $(ProjectRoot)\\**\\*.orig;\n                  $(ProjectRoot)\\*.config;\n                  $(ProjectRoot)\\*.xml;\n                  $(ProjectRoot)\\**\\*.csproj;\n                  $(ProjectRoot)\\*.csproj.user;\">\n    </PackageFiles>\n    <ConfigFiles Include=\"$(ProjectRoot)\\Web.config\" >\n    </ConfigFiles>\n  </ItemGroup>\n  <Target Name=\"UpdateWebConfig\"  Condition=\" '$(CurrentBuildDateStamp)' != '' \">\n      <XmlPoke Namespaces=\"&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;\"\n          XmlInputPath=\"$(WebConfig)\"\n          Query=\"//add[@key='staticContentIncrement']/@value\"\n          Value=\"$(CurrentBuildDateStamp)-$(CurrentBuildTimeStamp)\" />\n    </Target>\n  <Target Name=\"CreateOutputDir\">\n    <Message Text=\"Creating Directory $(CurrentBuildDir)\" />\n    <RemoveDir Directories=\"$(CurrentBuildDir)\" />\n    <Delete Files=\"$(CurrentBuildDir)\" />\n    <MakeDir Directories=\"$(CurrentBuildDir)\" />\n  </Target>\n  <Target Name=\"BuildMediaDirectories\">\n    <MakeDir Directories=\"$(CurrentBuildDir)\\media\" />\n  </Target>\n  <Target Name=\"ConfigSettingsMessages\">\n    <Message Text=\"Configuration is $(Configuration)\" />\n    <Message Text=\"BuildNumber is $(BuildNumber)\" />\n    <Message Text=\"ProjectRoot is $(ProjectRoot)\" />\n    <Message Text=\"CurrentBuildDir is $(CurrentBuildDir)\" />\n  </Target>\n  <Target Name=\"BuildSolution\">\n    <MSBuild Projects=\"$(SolutionRoot)\\Bowerbird.sln\" Targets=\"Build\" Properties=\"Configuration=$(Configuration)\" />\n  </Target>\n  <Target Name=\"CopyFilesToReleaseDir\">\n    <Copy SourceFiles=\"@(PackageFiles)\" DestinationFiles=\"@(PackageFiles->'$(CurrentBuildDir)\\%(RecursiveDir)%(Filename)%(Extension)')\" />\n    <Copy SourceFiles=\"@(ConfigFiles)\" DestinationFiles=\"$(CurrentBuildDir)\\web.config\" />\n  </Target>\n  <Target Name=\"ZipUpReleaseFiles\">\n    <ItemGroup>\n      <ZipFiles Include=\"$(CurrentBuildDir)\\**\\*.*\" Exclude=\"*.zip\" />\n    </ItemGroup>\n    <Zip Files=\"@(ZipFiles)\" WorkingDirectory=\"$(CurrentBuildDir)\\$(Configuration)\\\" ZipFileName=\"$(CurrentBuildDateStamp)-$(Configuration).zip\" ZipLevel=\"9\" />\n  </Target>\n  <Target Name=\"CopyZipToReleaseDir\" DependsOnTargets=\"ZipUpReleaseFiles\">\n    <Copy SourceFiles=\"$(MSBuildProjectDirectory)\\$(CurrentBuildDateStamp)-$(Configuration).zip\" DestinationFiles=\"$(ArtifactsDir)\\$(CurrentBuildDateStamp)-$(Configuration).zip\" />\n    <Delete Files=\"$(MSBuildProjectDirectory)\\$(CurrentBuildDateStamp)-$(Configuration).zip\" />\n  </Target>\n  <Target Name=\"Build\" DependsOnTargets=\"CreateOutputDir\">\n    <CallTarget Targets=\"BuildMediaDirectories\"/>\n    <CallTarget Targets=\"ConfigSettingsMessages\"/>\n    <CallTarget Targets=\"BuildSolution\"/>\n    <CallTarget Targets=\"CopyFilesToReleaseDir\"/>\n    <CallTarget Targets=\"UpdateWebConfig\" />\n    <CallTarget Targets=\"CopyZipToReleaseDir\"/>\n  </Target>\n</Project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/namespace-strict.sch",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema xmlns=\"http://purl.oclc.org/dsdl/schematron\"\n   queryBinding=\"xslt2\"\n   xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n\n  <!-- XSLT 2.0 Schematron by Wendell Piez (Mulberry Technologies, Inc.),\n       August 2011 -->\n  \n  <!-- This Schematron is released into the public domain.     \n       Please credit your sources. -->\n  \n  \n  <!-- Requires Schematron that allows embedded XSLT 2.0 with support for\n       the namespace:: axis. Tested with Saxon 9.3.0.5. -->\n  \n  <ns prefix=\"m\" uri=\"http://www.mulberrytech.com/xslt/util\"/>\n  \n  <xsl:variable name=\"ns-set\" xmlns:m=\"http://www.mulberrytech.com/xslt/util\">\n    <!-- include elements to declare expected namespace prefixes\n         with their bindings, like so:\n\n         (prefix 'mml')\n         <m:ns prefix=\"mml\"   uri=\"http://www.w3.org/1998/Math/MathML\"/>\n         (default namespace, no prefix)\n         <m:ns prefix=\"\"      uri=\"http://www.w3.org/1998/Math/MathML\"/>\n         -->\n         \n    <m:ns prefix=\"mml\"   uri=\"http://www.w3.org/1998/Math/MathML\"/>\n    <m:ns prefix=\"xlink\" uri=\"http://www.w3.org/1999/xlink\"/>>\n    <m:ns prefix=\"oasis\" uri=\"http://docs.oasis-open.org/ns/oasis-exchange/table\"/>\n\n    <!-- 'xml' prefix is always in scope with this binding -->\n    <m:ns prefix=\"xml\"   uri=\"http://www.w3.org/XML/1998/namespace\"/>\n  </xsl:variable>\n  \n  <pattern>\n    <!-- checking the document element against the spec given in ns-set -->\n    <rule context=\"/*\">\n      <let name=\"new-prefixes\" value=\"in-scope-prefixes(.)[not(. = $ns-set/m:ns/@prefix)]\"/>\n      <let name=\"new-namespaces\" value=\"(for $p in (in-scope-prefixes(.)) return namespace-uri-for-prefix($p,.))\n        [not(. = $ns-set/m:ns/@uri)]\"/>\n      <report test=\"exists($new-prefixes)\">\n        Unrecognized namespace prefix<xsl:value-of select=\"('es')[count($new-prefixes) gt 1]\"/>: \n        <value-of select=\"string-join(\n          (for $p in $new-prefixes return m:label($p)),\n          ', ')\"/>\n      </report>\n      <report test=\"exists($new-namespaces)\">\n        Unrecognized namespace URI<xsl:value-of select=\"('s')[count($new-namespaces) gt 1]\"/>: \n        <value-of select=\"string-join(($new-namespaces),', ')\"/>\n      </report>\n      \n      <let name=\"misassigned-prefixes\" value=\"in-scope-prefixes(.)[not(.=$new-prefixes)]\n        [for $p in (.) return \n          namespace-uri-for-prefix($p,current()) ne $ns-set/m:ns[@prefix=$p]/@uri]\"/>\n      <report test=\"exists($misassigned-prefixes)\">\n        Prefix<xsl:value-of select=\"('es')[count($misassigned-prefixes) gt 1]\"/> \n        assigned incorrectly: <value-of select=\"string-join(\n          (for $p in $misassigned-prefixes return\n          concat(m:label($p), ' (should be ''',$ns-set/m:ns[@prefix=$p]/@uri,''')')),\n          '; ')\"/>\n      </report>\n    </rule>\n    \n    <!-- Elsewhere, all namespaces given must correspond with those\n      on the parent -->\n    <rule context=\"*\">\n      <assert test=\"every $n in (namespace::*) satisfies\n        exists(../namespace::*[deep-equal(.,$n)])\">\n        Namespace may not be declared here.\n      </assert>\n      <assert test=\"every $n in (../namespace::*) satisfies\n        exists(namespace::*[deep-equal(.,$n)])\">\n        Namespace may not be undeclared here.\n      </assert>\n    </rule>\n  </pattern>\n  \n  <xsl:function name=\"m:label\" as=\"xs:string\">\n    <xsl:param name=\"label\" as=\"xs:string\"/>\n    <xsl:sequence select=\"if (string($label)) then concat('''',$label,'''') else '[unprefixed]'\"/>\n  </xsl:function>\n  \n</schema>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/net_docfile.xml",
    "content": "<?xml version=\"1.0\"?>\r\n<doc>\r\n    <assembly>\r\n        <name>ReactiveUI</name>\r\n    </assembly>\r\n    <members>\r\n        <member name=\"T:ReactiveUI.IObservedChange`2\">\r\n            <summary>\r\n            IObservedChange is a generic interface that replaces the non-generic\r\n            PropertyChangedEventArgs. Note that it is used for both Changing (i.e.\r\n            'before change') and Changed Observables. In the future, this interface\r\n            will be Covariant which will allow simpler casting between specific and\r\n            generic changes.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IObservedChange`2.Sender\">\r\n            <summary>\r\n            The object that has raised the change.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IObservedChange`2.PropertyName\">\r\n            <summary>\r\n            The name of the property that has changed on Sender.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IObservedChange`2.Value\">\r\n            <summary>\r\n            The value of the property that has changed. IMPORTANT NOTE: This\r\n            property is often not set for performance reasons, unless you have\r\n            explicitly requested an Observable for a property via a method such\r\n            as ObservableForProperty. To retrieve the value for the property,\r\n            use the Value() extension method.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.IReactiveNotifyPropertyChanged\">\r\n            <summary>\r\n            IReactiveNotifyPropertyChanged represents an extended version of\r\n            INotifyPropertyChanged that also exposes Observables.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.IEnableLogger\">\r\n            <summary>\r\n            IEnableLogger is a dummy interface - attaching it to any class will give\r\n            you access to the Log() method.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.IReactiveNotifyPropertyChanged.SuppressChangeNotifications\">\r\n            <summary>\r\n            When this method is called, an object will not fire change\r\n            notifications (neither traditional nor Observable notifications)\r\n            until the return value is disposed.\r\n            </summary>\r\n            <returns>An object that, when disposed, reenables change\r\n            notifications.</returns>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveNotifyPropertyChanged.Changing\">\r\n            <summary>\r\n            Represents an Observable that fires *before* a property is about to\r\n            be changed. Note that this should not fire duplicate change notifications if a\r\n            property is set to the same value multiple times.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveNotifyPropertyChanged.Changed\">\r\n            <summary>\r\n            Represents an Observable that fires *after* a property has changed.\r\n            Note that this should not fire duplicate change notifications if a\r\n            property is set to the same value multiple times.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.IReactiveNotifyPropertyChanged`1\">\r\n            <summary>\r\n            IReactiveNotifyPropertyChanged of TSender is a helper interface that adds\r\n            typed versions of Changing and Changed.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.IReactiveCollection\">\r\n             <summary>\r\n             IReactiveCollection represents a collection that can notify when its\r\n             contents are changed (either items are added/removed, or the object\r\n             itself changes).\r\n            \r\n             It is important to implement the Changing/Changed from\r\n             IReactiveNotifyPropertyChanged semantically as \"Fire when *anything* in\r\n             the collection or any of its items have changed, in any way\".\r\n             </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveCollection.ItemsAdded\">\r\n            <summary>\r\n            Fires when items are added to the collection, once per item added.\r\n            Functions that add multiple items such AddRange should fire this\r\n            multiple times. The object provided is the item that was added.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveCollection.BeforeItemsAdded\">\r\n            <summary>\r\n            Fires before an item is going to be added to the collection.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveCollection.ItemsRemoved\">\r\n            <summary>\r\n            Fires once an item has been removed from a collection, providing the\r\n            item that was removed.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveCollection.BeforeItemsRemoved\">\r\n            <summary>\r\n            Fires before an item will be removed from a collection, providing\r\n            the item that will be removed. \r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveCollection.CollectionCountChanged\">\r\n            <summary>\r\n            Fires whenever the number of items in a collection has changed,\r\n            providing the new Count.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveCollection.CollectionCountChanging\">\r\n            <summary>\r\n            Fires before a collection is about to change, providing the previous\r\n            Count.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveCollection.ItemChanging\">\r\n            <summary>\r\n            Provides Item Changed notifications for any item in collection that\r\n            implements IReactiveNotifyPropertyChanged. This is only enabled when\r\n            ChangeTrackingEnabled is set to True.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveCollection.ItemChanged\">\r\n            <summary>\r\n            Provides Item Changing notifications for any item in collection that\r\n            implements IReactiveNotifyPropertyChanged. This is only enabled when\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.IReactiveCollection.ChangeTrackingEnabled\">\r\n            <summary>\r\n            Enables the ItemChanging and ItemChanged properties; when this is\r\n            enabled, whenever a property on any object implementing\r\n            IReactiveNotifyPropertyChanged changes, the change will be\r\n            rebroadcast through ItemChanging/ItemChanged.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.IReactiveCollection`1\">\r\n            <summary>\r\n            IReactiveCollection of T is the typed version of IReactiveCollection and\r\n            adds type-specified versions of Observables\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.IMessageBus\">\r\n             <summary>\r\n             IMessageBus represents an object that can act as a \"Message Bus\", a\r\n             simple way for ViewModels and other objects to communicate with each\r\n             other in a loosely coupled way.\r\n            \r\n             Specifying which messages go where is done via a combination of the Type\r\n             of the message as well as an additional \"Contract\" parameter; this is a\r\n             unique string used to distinguish between messages of the same Type, and\r\n             is arbitrarily set by the client. \r\n             </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.IMessageBus.Listen``1(System.String)\">\r\n            <summary>\r\n            Listen provides an Observable that will fire whenever a Message is\r\n            provided for this object via RegisterMessageSource or SendMessage.\r\n            </summary>\r\n            <typeparam name=\"T\">The type of the message to listen to.</typeparam>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.IMessageBus.IsRegistered(System.Type,System.String)\">\r\n            <summary>\r\n            Determins if a particular message Type is registered.\r\n            </summary>\r\n            <typeparam name=\"T\">The type of the message.</typeparam>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n            <returns>True if messages have been posted for this message Type.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.IMessageBus.RegisterMessageSource``1(System.IObservable{``0},System.String,System.Reactive.Concurrency.IScheduler)\">\r\n            <summary>\r\n            Registers an Observable representing the stream of messages to send.\r\n            Another part of the code can then call Listen to retrieve this\r\n            Observable.\r\n            </summary>\r\n            <typeparam name=\"T\">The type of the message to listen to.</typeparam>\r\n            <param name=\"source\">An Observable that will be subscribed to, and a\r\n            message sent out for each value provided.</param>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.IMessageBus.SendMessage``1(``0,System.String,System.Reactive.Concurrency.IScheduler)\">\r\n            <summary>\r\n            Sends a single message using the specified Type and contract.\r\n            Consider using RegisterMessageSource instead if you will be sending\r\n            messages in response to other changes such as property changes\r\n            or events.\r\n            </summary>\r\n            <typeparam name=\"T\">The type of the message to send.</typeparam>\r\n            <param name=\"message\">The actual message to send</param>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.EnableLoggerMixin.Log(ReactiveUI.IEnableLogger)\">\r\n            <summary>\r\n            Log returns the current logger object, which allows the object to\r\n            log messages with the type name attached.\r\n            </summary>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.MemoizingMRUCache`2\">\r\n             <summary>\r\n             This data structure is a representation of a memoizing cache - i.e. a\r\n             class that will evaluate a function, but keep a cache of recently\r\n             evaluated parameters.\r\n            \r\n             Since this is a memoizing cache, it is important that this function be a\r\n             \"pure\" function in the mathematical sense - that a key *always* maps to\r\n             a corresponding return value.\r\n             </summary>\r\n             <typeparam name=\"TParam\">The type of the parameter to the calculation function.</typeparam>\r\n             <typeparam name=\"TVal\">The type of the value returned by the calculation\r\n             function.</typeparam>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MemoizingMRUCache`2.#ctor(System.Func{`0,System.Object,`1},System.Int32,System.Action{`1})\">\r\n            <summary>\r\n            Constructor\r\n            </summary>\r\n            <param name=\"calculationFunc\">The function whose results you want to cache,\r\n            which is provided the key value, and an Tag object that is\r\n            user-defined</param>\r\n            <param name=\"maxSize\">The size of the cache to maintain, after which old\r\n            items will start to be thrown out.</param>\r\n            <param name=\"onRelease\">A function to call when a result gets\r\n            evicted from the cache (i.e. because Invalidate was called or the\r\n            cache is full)</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MemoizingMRUCache`2.Get(`0,System.Object)\">\r\n            <summary>\r\n            Evaluates the function provided, returning the cached value if possible\r\n            </summary>\r\n            <param name=\"key\">The value to pass to the calculation function.</param>\r\n            <param name=\"context\">An additional optional user-specific parameter.</param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MemoizingMRUCache`2.Invalidate(`0)\">\r\n            <summary>\r\n            Ensure that the next time this key is queried, the calculation\r\n            function will be called.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MemoizingMRUCache`2.InvalidateAll\">\r\n            <summary>\r\n            Invalidate all items in the cache\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MemoizingMRUCache`2.CachedValues\">\r\n            <summary>\r\n            Returns all values currently in the cache\r\n            </summary>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.MessageBus\">\r\n             <summary>\r\n             MessageBus represents an object that can act as a \"Message Bus\", a\r\n             simple way for ViewModels and other objects to communicate with each\r\n             other in a loosely coupled way.\r\n            \r\n             Specifying which messages go where is done via a combination of the Type\r\n             of the message as well as an additional \"Contract\" parameter; this is a\r\n             unique string used to distinguish between messages of the same Type, and\r\n             is arbitrarily set by the client. \r\n             </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MessageBus.Listen``1(System.String)\">\r\n            <summary>\r\n            Listen provides an Observable that will fire whenever a Message is\r\n            provided for this object via RegisterMessageSource or SendMessage.\r\n            </summary>\r\n            <typeparam name=\"T\">The type of the message to listen to.</typeparam>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n            <returns>An Observable representing the notifications posted to the\r\n            message bus.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MessageBus.IsRegistered(System.Type,System.String)\">\r\n            <summary>\r\n            Determins if a particular message Type is registered.\r\n            </summary>\r\n            <param name=\"type\">The Type of the message to listen to.</param>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n            <returns>True if messages have been posted for this message Type.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MessageBus.RegisterMessageSource``1(System.IObservable{``0},System.String,System.Reactive.Concurrency.IScheduler)\">\r\n            <summary>\r\n            Registers an Observable representing the stream of messages to send.\r\n            Another part of the code can then call Listen to retrieve this\r\n            Observable.\r\n            </summary>\r\n            <typeparam name=\"T\">The type of the message to listen to.</typeparam>\r\n            <param name=\"source\">An Observable that will be subscribed to, and a\r\n            message sent out for each value provided.</param>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n            <param name=\"scheduler\">The scheduler on which to post the\r\n            notifications, RxApp.DeferredScheduler by default.</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MessageBus.SendMessage``1(``0,System.String,System.Reactive.Concurrency.IScheduler)\">\r\n            <summary>\r\n            Sends a single message using the specified Type and contract.\r\n            Consider using RegisterMessageSource instead if you will be sending\r\n            messages in response to other changes such as property changes\r\n            or events.\r\n            </summary>\r\n            <typeparam name=\"T\">The type of the message to send.</typeparam>\r\n            <param name=\"message\">The actual message to send</param>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n            <param name=\"scheduler\">The scheduler on which to post the\r\n            notifications, RxApp.DeferredScheduler by default.</param>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.MessageBus.Current\">\r\n            <summary>\r\n            Returns the Current MessageBus from the RxApp global object.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MessageBusMixins.RegisterViewModel``1(ReactiveUI.IMessageBus,``0,System.String)\">\r\n            <summary>\r\n            Registers a ViewModel object to send property change\r\n            messages; this allows a ViewModel to listen to another ViewModel's\r\n            changes in a loosely-typed manner.\r\n            </summary>\r\n            <param name=\"source\">The ViewModel to register</param>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n            <exception cref=\"T:System.Exception\"><c>Exception</c>The registered ViewModel\r\n            must be the only instance (i.e. not in an ItemsControl)</exception>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MessageBusMixins.ListenToViewModel``1(ReactiveUI.IMessageBus,System.String)\">\r\n            <summary>\r\n            Listens to a registered ViewModel's property change notifications.\r\n            </summary>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n            <returns>An Observable that fires when an object changes and\r\n            provides the property name that has changed.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.MessageBusMixins.ViewModelForType``1(ReactiveUI.IMessageBus,System.String)\">\r\n            <summary>\r\n            Return the current instance of the ViewModel with the specified\r\n            type.\r\n            </summary>\r\n            <param name=\"contract\">A unique string to distinguish messages with\r\n            identical types (i.e. \"MyCoolViewModel\") - if the message type is\r\n            only used for one purpose, leave this as null.</param>\r\n            <returns>The ViewModel object registered for this type.</returns>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.ObservableAsPropertyHelper`1\">\r\n             <summary>\r\n             ObservableAsPropertyHelper is a class to help ViewModels implement\r\n             \"output properties\", that is, a property that is backed by an\r\n             Observable. The property will be read-only, but will still fire change\r\n             notifications. This class can be created directly, but is more often created via the\r\n             ToProperty and ObservableToProperty extension methods.\r\n            \r\n             This class is also an Observable itself, so that output properties can\r\n             be chained - for example a \"Path\" property and a chained\r\n             \"PathFileNameOnly\" property.\r\n             </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservableAsPropertyHelper`1.#ctor(System.IObservable{`0},System.Action{`0},`0,System.Reactive.Concurrency.IScheduler)\">\r\n            <summary>\r\n            Constructs an ObservableAsPropertyHelper object.\r\n            </summary>\r\n            <param name=\"observable\">The Observable to base the property on.</param>\r\n            <param name=\"onChanged\">The action to take when the property\r\n            changes, typically this will call the ViewModel's\r\n            RaisePropertyChanged method.</param>\r\n            <param name=\"initialValue\">The initial value of the property.</param>\r\n            <param name=\"scheduler\">The scheduler that the notifications will be\r\n            provided on - this should normally be a Dispatcher-based scheduler\r\n            (and is by default)</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservableAsPropertyHelper`1.Default(`0,System.Reactive.Concurrency.IScheduler)\">\r\n            <summary>\r\n            Constructs a \"default\" ObservableAsPropertyHelper object. This is\r\n            useful for when you will initialize the OAPH later, but don't want\r\n            bindings to access a null OAPH at startup.\r\n            </summary>\r\n            <param name=\"initialValue\">The initial (and only) value of the property.</param>\r\n            <param name=\"scheduler\">The scheduler that the notifications will be\r\n            provided on - this should normally be a Dispatcher-based scheduler\r\n            (and is by default)</param>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ObservableAsPropertyHelper`1.Value\">\r\n            <summary>\r\n            The last provided value from the Observable. \r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ObservableAsPropertyHelper`1.BindingException\">\r\n            <summary>\r\n            Returns the Exception which has been provided by the Observable; normally\r\n            steps should be taken to ensure that Observables provided to OAPH should\r\n            never complete or fail.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.OAPHCreationHelperMixin.ObservableToProperty``2(``0,System.IObservable{``1},System.Linq.Expressions.Expression{System.Func{``0,``1}},``1,System.Reactive.Concurrency.IScheduler)\">\r\n            <summary>\r\n            Converts an Observable to an ObservableAsPropertyHelper and\r\n            automatically provides the onChanged method to raise the property\r\n            changed notification. The ToProperty method is semantically\r\n            equivalent to this method and is often more convenient.\r\n            </summary>\r\n            <param name=\"observable\">The Observable to base the property on.</param>\r\n            <param name=\"property\">An Expression representing the property (i.e.\r\n            'x => x.SomeProperty'</param>\r\n            <param name=\"initialValue\">The initial value of the property.</param>\r\n            <param name=\"scheduler\">The scheduler that the notifications will be\r\n            provided on - this should normally be a Dispatcher-based scheduler\r\n            (and is by default)</param>\r\n            <returns>An initialized ObservableAsPropertyHelper; use this as the\r\n            backing field for your property.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.OAPHCreationHelperMixin.ToProperty``2(System.IObservable{``1},``0,System.Linq.Expressions.Expression{System.Func{``0,``1}},``1,System.Reactive.Concurrency.IScheduler)\">\r\n            <summary>\r\n            Converts an Observable to an ObservableAsPropertyHelper and\r\n            automatically provides the onChanged method to raise the property\r\n            changed notification.         \r\n            </summary>\r\n            <param name=\"source\">The ReactiveObject that has the property</param>\r\n            <param name=\"property\">An Expression representing the property (i.e.\r\n            'x => x.SomeProperty'</param>\r\n            <param name=\"initialValue\">The initial value of the property.</param>\r\n            <param name=\"scheduler\">The scheduler that the notifications will be\r\n            provided on - this should normally be a Dispatcher-based scheduler\r\n            (and is by default)</param>\r\n            <returns>An initialized ObservableAsPropertyHelper; use this as the\r\n            backing field for your property.</returns>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.ObservableAsyncMRUCache`2\">\r\n             <summary>\r\n             ObservableAsyncMRUCache implements memoization for asynchronous or\r\n             expensive to compute methods. This memoization is an MRU-based cache\r\n             with a fixed limit for the number of items in the cache.     \r\n            \r\n             This class guarantees that only one calculation for any given key is\r\n             in-flight at a time, subsequent requests will wait for the first one and\r\n             return its results (for example, an empty web image cache that receives\r\n             two concurrent requests for \"Foo.jpg\" will only issue one WebRequest -\r\n             this does not mean that a request for \"Bar.jpg\" will wait on \"Foo.jpg\").\r\n            \r\n             Concurrency is also limited by the maxConcurrent parameter - when too\r\n             many in-flight operations are in progress, further operations will be\r\n             queued until a slot is available.\r\n             </summary>\r\n             <typeparam name=\"TParam\">The key type.</typeparam>\r\n             <typeparam name=\"TVal\">The type of the value to return from the cache.</typeparam>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservableAsyncMRUCache`2.#ctor(System.Func{`0,System.IObservable{`1}},System.Int32,System.Int32,System.Action{`1},System.Reactive.Concurrency.IScheduler)\">\r\n             <summary>\r\n             Constructs an ObservableAsyncMRUCache object.\r\n             </summary>\r\n             <param name=\"calculationFunc\">The function that performs the\r\n             expensive or asyncronous calculation and returns an async result -\r\n             for CPU-based operations, Observable.Return may be used to return\r\n             the result.\r\n            \r\n             Note that this function *must* return an equivalently-same result given a\r\n             specific input - because the function is being memoized, if the\r\n             calculationFunc depends on other varables other than the input\r\n             value, the results will be unpredictable.\r\n             </param>\r\n             <param name=\"maxSize\">The number of items to cache. When this limit\r\n             is reached, not recently used items will be discarded.</param>\r\n             <param name=\"maxConcurrent\">The maximum number of concurrent\r\n             asynchronous operations regardless of key - this is important for\r\n             web-based caches to limit the number of concurrent requests to a\r\n             server. The default is 5.</param>\r\n             <param name=\"onRelease\">This optional method is called when an item\r\n             is evicted from the cache - this can be used to clean up / manage an\r\n             on-disk cache; the calculationFunc can download a file and save it\r\n             to a temporary folder, and the onRelease action will delete the\r\n             file.</param>\r\n             <param name=\"sched\">The scheduler to run asynchronous operations on\r\n             - defaults to TaskpoolScheduler</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservableAsyncMRUCache`2.AsyncGet(`0)\">\r\n            <summary>\r\n            Issues an request to fetch the value for the specified key as an\r\n            async operation. The Observable returned will fire one time when the\r\n            async operation finishes. If the operation is cached, an Observable\r\n            that immediately fires upon subscribing will be returned.\r\n            </summary>\r\n            <param name=\"key\">The key to provide to the calculation function.</param>\r\n            <returns>Returns an Observable representing the future result.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservableAsyncMRUCache`2.Get(`0)\">\r\n            <summary>\r\n            The synchronous version of AsyncGet - it will issue a request for\r\n            the value of a specific key and wait until the value can be\r\n            provided.\r\n            </summary>\r\n            <param name=\"key\">The key to provide to the calculation function.</param>\r\n            <returns>The resulting value.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservableCacheMixin.CachedSelectMany``2(System.IObservable{``0},System.Func{``0,System.IObservable{``1}},System.Int32,System.Int32,System.Reactive.Concurrency.IScheduler)\">\r\n            <summary>\r\n            Works like SelectMany, but memoizes selector calls. In addition, it \r\n            guarantees that no more than 'maxConcurrent' selectors are running \r\n            concurrently and queues the rest. This is very important when using\r\n            web services to avoid potentially spamming the server with hundreds \r\n            of requests.\r\n            </summary>\r\n            <param name=\"selector\">A selector similar to one you would pass as a \r\n            parameter passed to SelectMany. Note that similarly to \r\n            ObservableAsyncMRUCache.AsyncGet, a selector must return semantically\r\n            identical results given the same key - i.e. it must be a 'function' in\r\n            the mathematical sense.</param>\r\n            <param name=\"maxCached\">The number of items to cache. When this limit\r\n            is reached, not recently used items will be discarded.</param>\r\n            <param name=\"maxConcurrent\">The maximum number of concurrent\r\n            asynchronous operations regardless of key - this is important for\r\n            web-based caches to limit the number of concurrent requests to a\r\n            server. The default is 5.</param>\r\n            <param name=\"scheduler\"></param>\r\n            <returns>An Observable representing the flattened results of the \r\n            selector.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservableCacheMixin.CachedSelectMany``2(System.IObservable{``0},ReactiveUI.ObservableAsyncMRUCache{``0,``1})\">\r\n             <summary>\r\n             Works like SelectMany, but memoizes selector calls. In addition, it \r\n             guarantees that no more than 'maxConcurrent' selectors are running \r\n             concurrently and queues the rest. This is very important when using\r\n             web services to avoid potentially spamming the server with hundreds \r\n             of requests.\r\n            \r\n             This overload is useful when making the same web service call in\r\n             several places in the code, to ensure that all of the code paths are\r\n             using the same cache.\r\n             </summary>\r\n             <param name=\"existingCache\">An already-configured ObservableAsyncMRUCache.</param>\r\n             <returns>An Observable representing the flattened results of the \r\n             cache selector.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservedChangedMixin.GetValue``2(ReactiveUI.IObservedChange{``0,``1})\">\r\n            <summary>\r\n            Returns the current value of a property given a notification that it has changed.\r\n            </summary>\r\n            <returns>The current value of the property</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservedChangedMixin.TryGetValue``2(ReactiveUI.IObservedChange{``0,``1},``1@)\">\r\n            <summary>\r\n            Attempts to return the current value of a property given a \r\n            notification that it has changed. If any property in the\r\n            property expression is null, false is returned.\r\n            </summary>\r\n            <param name=\"changeValue\">The value of the property expression.</param>\r\n            <returns>True if the entire expression was able to be followed, false otherwise</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservedChangedMixin.SetValueToProperty``3(ReactiveUI.IObservedChange{``0,``1},``2,System.Linq.Expressions.Expression{System.Func{``2,``1}})\">\r\n            <summary>\r\n            Given a fully filled-out IObservedChange object, SetValueToProperty\r\n            will apply it to the specified object (i.e. it will ensure that\r\n            target.property == This.GetValue() and \"replay\" the observed change\r\n            onto another object)\r\n            </summary>\r\n            <param name=\"target\">The target object to apply the change to.</param>\r\n            <param name=\"property\">The target property to apply the change to.</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservedChangedMixin.Value``2(System.IObservable{ReactiveUI.IObservedChange{``0,``1}})\">\r\n            <summary>\r\n            Given a stream of notification changes, this method will convert \r\n            the property changes to the current value of the property.\r\n            </summary>\r\n            <returns>An Observable representing the stream of current values of\r\n            the given change notification stream.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservedChangedMixin.ValueIfNotDefault``2(System.IObservable{ReactiveUI.IObservedChange{``0,``1}})\">\r\n            <summary>\r\n            ValueIfNotDefault is similar to Value(), but filters out null values\r\n            from the stream.\r\n            </summary>\r\n            <returns>An Observable representing the stream of current values of\r\n            the given change notification stream.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservedChangedMixin.Value``3(System.IObservable{ReactiveUI.IObservedChange{``0,``1}})\">\r\n            <summary>\r\n            Given a stream of notification changes, this method will convert \r\n            the property changes to the current value of the property.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.BindingMixins.BindTo``2(System.IObservable{``1},``0,System.Linq.Expressions.Expression{System.Func{``0,``1}})\">\r\n            <summary>\r\n            BindTo takes an Observable stream and applies it to a target\r\n            property. Conceptually it is similar to \"Subscribe(x =&gt;\r\n            target.property = x)\", but allows you to use child properties\r\n            without the null checks.\r\n            </summary>\r\n            <param name=\"target\">The target object whose property will be set.</param>\r\n            <param name=\"property\">An expression representing the target\r\n            property to set. This can be a child property (i.e. x.Foo.Bar.Baz).</param>\r\n            <returns>An object that when disposed, disconnects the binding.</returns>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.ReactiveCollection`1\">\r\n            <summary>\r\n            \r\n            </summary>\r\n            <typeparam name=\"T\">The type of the objects in the collection.</typeparam>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveCollection`1.#ctor\">\r\n            <summary>\r\n            Constructs a ReactiveCollection.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveCollection`1.#ctor(System.Collections.Generic.IEnumerable{`0})\">\r\n            <summary>\r\n            Constructs a ReactiveCollection given an existing list.\r\n            </summary>\r\n            <param name=\"list\">The existing list with which to populate the new\r\n            list.</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveCollection`1.SuppressChangeNotifications\">\r\n            <summary>\r\n            When this method is called, an object will not fire change\r\n            notifications (neither traditional nor Observable notifications)\r\n            until the return value is disposed.\r\n            </summary>\r\n            <returns>An object that, when disposed, reenables change\r\n            notifications.</returns>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.ItemsAdded\">\r\n            <summary>\r\n            Fires when items are added to the collection, once per item added.\r\n            Functions that add multiple items such as AddRange should fire this\r\n            multiple times. The object provided is the item that was added.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.BeforeItemsAdded\">\r\n            <summary>\r\n            Fires before an item is going to be added to the collection.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.ItemsRemoved\">\r\n            <summary>\r\n            Fires once an item has been removed from a collection, providing the\r\n            item that was removed.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.BeforeItemsRemoved\">\r\n            <summary>\r\n            Fires before an item will be removed from a collection, providing\r\n            the item that will be removed. \r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.CollectionCountChanging\">\r\n            <summary>\r\n            Fires before a collection is about to change, providing the previous\r\n            Count.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.CollectionCountChanged\">\r\n            <summary>\r\n            Fires whenever the number of items in a collection has changed,\r\n            providing the new Count.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.ItemChanging\">\r\n            <summary>\r\n            Provides Item Changed notifications for any item in collection that\r\n            implements IReactiveNotifyPropertyChanged. This is only enabled when\r\n            ChangeTrackingEnabled is set to True.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.ItemChanged\">\r\n            <summary>\r\n            Provides Item Changing notifications for any item in collection that\r\n            implements IReactiveNotifyPropertyChanged. This is only enabled when\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.Changing\">\r\n            <summary>\r\n            Fires when anything in the collection or any of its items (if Change\r\n            Tracking is enabled) are about to change.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.Changed\">\r\n            <summary>\r\n            Fires when anything in the collection or any of its items (if Change\r\n            Tracking is enabled) have changed.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveCollection`1.ChangeTrackingEnabled\">\r\n            <summary>\r\n            Enables the ItemChanging and ItemChanged properties; when this is\r\n            enabled, whenever a property on any object implementing\r\n            IReactiveNotifyPropertyChanged changes, the change will be\r\n            rebroadcast through ItemChanging/ItemChanged.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveCollectionMixins.CreateCollection``1(System.IObservable{``0},System.Nullable{System.TimeSpan})\">\r\n            <summary>\r\n            Creates a collection based on an an Observable by adding items\r\n            provided until the Observable completes, optionally ensuring a\r\n            delay. Note that if the Observable never completes and withDelay is\r\n            set, this method will leak a Timer. This method also guarantees that\r\n            items are always added via the UI thread.\r\n            </summary>\r\n            <param name=\"fromObservable\">The Observable whose items will be put\r\n            into the new collection.</param>\r\n            <param name=\"withDelay\">If set, items will be populated in the\r\n            collection no faster than the delay provided.</param>\r\n            <returns>A new collection which will be populated with the\r\n            Observable.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveCollectionMixins.CreateCollection``2(System.IObservable{``0},System.Func{``0,``1},System.Nullable{System.TimeSpan})\">\r\n            <summary>\r\n            Creates a collection based on an an Observable by adding items\r\n            provided until the Observable completes, optionally ensuring a\r\n            delay. Note that if the Observable never completes and withDelay is\r\n            set, this method will leak a Timer. This method also guarantees that\r\n            items are always added via the UI thread.\r\n            </summary>\r\n            <param name=\"fromObservable\">The Observable whose items will be put\r\n            into the new collection.</param>\r\n            <param name=\"selector\">A Select function that will be run on each\r\n            item.</param>\r\n            <param name=\"withDelay\">If set, items will be populated in the\r\n            collection no faster than the delay provided.</param>\r\n            <returns>A new collection which will be populated with the\r\n            Observable.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ObservableCollectionMixin.CreateDerivedCollection``2(System.Collections.ObjectModel.ObservableCollection{``0},System.Func{``0,``1})\">\r\n            <summary>\r\n            Creates a collection whose contents will \"follow\" another\r\n            collection; this method is useful for creating ViewModel collections\r\n            that are automatically updated when the respective Model collection\r\n            is updated.\r\n            </summary>\r\n            <param name=\"selector\">A Select function that will be run on each\r\n            item.</param>\r\n            <returns>A new collection whose items are equivalent to\r\n            Collection.Select(selector) and will mirror the initial collection.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveNotifyPropertyChangedMixin.ObservableForProperty``2(``0,System.Linq.Expressions.Expression{System.Func{``0,``1}},System.Boolean)\">\r\n            <summary>\r\n            ObservableForProperty returns an Observable representing the\r\n            property change notifications for a specific property on a\r\n            ReactiveObject. This method (unlike other Observables that return\r\n            IObservedChange) guarantees that the Value property of\r\n            the IObservedChange is set.\r\n            </summary>\r\n            <param name=\"property\">An Expression representing the property (i.e.\r\n            'x => x.SomeProperty.SomeOtherProperty'</param>\r\n            <param name=\"beforeChange\">If True, the Observable will notify\r\n            immediately before a property is going to change.</param>\r\n            <returns>An Observable representing the property change\r\n            notifications for the given property.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveNotifyPropertyChangedMixin.ObservableForProperty``3(``0,System.Linq.Expressions.Expression{System.Func{``0,``1}},System.Func{``1,``2},System.Boolean)\">\r\n            <summary>\r\n            ObservableForProperty returns an Observable representing the\r\n            property change notifications for a specific property on a\r\n            ReactiveObject, running the IObservedChange through a Selector\r\n            function.\r\n            </summary>\r\n            <param name=\"property\">An Expression representing the property (i.e.\r\n            'x => x.SomeProperty'</param>\r\n            <param name=\"selector\">A Select function that will be run on each\r\n            item.</param>\r\n            <param name=\"beforeChange\">If True, the Observable will notify\r\n            immediately before a property is going to change.</param>\r\n            <returns>An Observable representing the property change\r\n            notifications for the given property.</returns>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.ReactiveObject\">\r\n            <summary>\r\n            ReactiveObject is the base object for ViewModel classes, and it\r\n            implements INotifyPropertyChanged. In addition, ReactiveObject provides\r\n            Changing and Changed Observables to monitor object changes.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveObject.SuppressChangeNotifications\">\r\n            <summary>\r\n            When this method is called, an object will not fire change\r\n            notifications (neither traditional nor Observable notifications)\r\n            until the return value is disposed.\r\n            </summary>\r\n            <returns>An object that, when disposed, reenables change\r\n            notifications.</returns>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveObject.Changing\">\r\n            <summary>\r\n            Represents an Observable that fires *before* a property is about to\r\n            be changed.         \r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.ReactiveObject.Changed\">\r\n            <summary>\r\n            Represents an Observable that fires *after* a property has changed.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveObjectExpressionMixin.RaiseAndSetIfChanged``2(``0,System.Linq.Expressions.Expression{System.Func{``0,``1}},``1)\">\r\n            <summary>\r\n            RaiseAndSetIfChanged fully implements a Setter for a read-write\r\n            property on a ReactiveObject, making the assumption that the\r\n            property has a backing field named \"_NameOfProperty\". To change this\r\n            assumption, set RxApp.GetFieldNameForPropertyNameFunc.\r\n            </summary>\r\n            <param name=\"property\">An Expression representing the property (i.e.\r\n            'x => x.SomeProperty'</param>\r\n            <param name=\"newValue\">The new value to set the property to, almost\r\n            always the 'value' keyword.</param>\r\n            <returns>The newly set value, normally discarded.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveObjectExpressionMixin.RaiseAndSetIfChanged``2(``0,System.Linq.Expressions.Expression{System.Func{``0,``1}},``1@,``1)\">\r\n            <summary>\r\n            RaiseAndSetIfChanged fully implements a Setter for a read-write\r\n            property on a ReactiveObject, making the assumption that the\r\n            property has a backing field named \"_NameOfProperty\". To change this\r\n            assumption, set RxApp.GetFieldNameForPropertyNameFunc.  This\r\n            overload is intended for Silverlight and WP7 where reflection\r\n            cannot access the private backing field.\r\n            </summary>\r\n            <param name=\"property\">An Expression representing the property (i.e.\r\n            'x => x.SomeProperty'</param>\r\n            <param name=\"backingField\">A Reference to the backing field for this\r\n            property.</param>\r\n            <param name=\"newValue\">The new value to set the property to, almost\r\n            always the 'value' keyword.</param>\r\n            <returns>The newly set value, normally discarded.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveObjectExpressionMixin.RaisePropertyChanging``2(``0,System.Linq.Expressions.Expression{System.Func{``0,``1}})\">\r\n            <summary>\r\n            Use this method in your ReactiveObject classes when creating custom\r\n            properties where raiseAndSetIfChanged doesn't suffice.\r\n            </summary>\r\n            <param name=\"property\">An Expression representing the property (i.e.\r\n            'x => x.SomeProperty'</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveObjectExpressionMixin.RaisePropertyChanged``2(``0,System.Linq.Expressions.Expression{System.Func{``0,``1}})\">\r\n            <summary>\r\n            Use this method in your ReactiveObject classes when creating custom\r\n            properties where raiseAndSetIfChanged doesn't suffice.\r\n            </summary>\r\n            <param name=\"property\">An Expression representing the property (i.e.\r\n            'x => x.SomeProperty'</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveObjectTestMixin.RaisePropertyChanging(ReactiveUI.ReactiveObject,System.String)\">\r\n            <summary>\r\n            RaisePropertyChanging is a helper method intended for test / mock\r\n            scenarios to manually fake a property change. \r\n            </summary>\r\n            <param name=\"target\">The ReactiveObject to invoke\r\n            raisePropertyChanging on.</param>\r\n            <param name=\"property\">The property that will be faking a change.</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveObjectTestMixin.RaisePropertyChanging``2(``0,System.Linq.Expressions.Expression{System.Func{``0,``1}})\">\r\n            <summary>\r\n            RaisePropertyChanging is a helper method intended for test / mock\r\n            scenarios to manually fake a property change. \r\n            </summary>\r\n            <param name=\"target\">The ReactiveObject to invoke\r\n            raisePropertyChanging on.</param>\r\n            <param name=\"property\">The property that will be faking a change.</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveObjectTestMixin.RaisePropertyChanged(ReactiveUI.ReactiveObject,System.String)\">\r\n            <summary>\r\n            RaisePropertyChanged is a helper method intended for test / mock\r\n            scenarios to manually fake a property change. \r\n            </summary>\r\n            <param name=\"target\">The ReactiveObject to invoke\r\n            raisePropertyChanging on.</param>\r\n            <param name=\"property\">The property that will be faking a change.</param>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveObjectTestMixin.RaisePropertyChanged``2(``0,System.Linq.Expressions.Expression{System.Func{``0,``1}})\">\r\n            <summary>\r\n            RaisePropertyChanged is a helper method intended for test / mock\r\n            scenarios to manually fake a property change. \r\n            </summary>\r\n            <param name=\"target\">The ReactiveObject to invoke\r\n            raisePropertyChanging on.</param>\r\n            <param name=\"property\">The property that will be faking a change.</param>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.MakeObjectReactiveHelper\">\r\n            <summary>\r\n            This class helps you take existing objects and make them compatible with\r\n            ReactiveUI and Rx.Net. To use this, declare an instance field of this\r\n            class in your class, initialize it in your Constructor, make your class\r\n            derive from IReactiveNotifyPropertyChanged, then implement all of the\r\n            properties/methods using MakeObjectReactiveHelper.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.RxApp.InUnitTestRunner\">\r\n            <summary>\r\n            InUnitTestRunner attempts to determine heuristically if the current\r\n            application is running in a unit test framework.\r\n            </summary>\r\n            <returns>True if we have determined that a unit test framework is\r\n            currently running.</returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.RxApp.EnableDebugMode\">\r\n             <summary>\r\n            \r\n             </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.RxApp.GetFieldNameForProperty(System.String)\">\r\n            <summary>\r\n            GetFieldNameForProperty returns the corresponding backing field name\r\n            for a given property name, using the convention specified in\r\n            GetFieldNameForPropertyNameFunc.\r\n            </summary>\r\n            <param name=\"propertyName\">The name of the property whose backing\r\n            field needs to be found.</param>\r\n            <returns>The backing field name.</returns>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.RxApp.DeferredScheduler\">\r\n            <summary>\r\n            DeferredScheduler is the scheduler used to schedule work items that\r\n            should be run \"on the UI thread\". In normal mode, this will be\r\n            DispatcherScheduler, and in Unit Test mode this will be Immediate,\r\n            to simplify writing common unit tests.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.RxApp.TaskpoolScheduler\">\r\n            <summary>\r\n            TaskpoolScheduler is the scheduler used to schedule work items to\r\n            run in a background thread. In both modes, this will run on the TPL\r\n            Task Pool (or the normal Threadpool on Silverlight).\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.RxApp.LoggerFactory\">\r\n            <summary>\r\n            Set this property to implement a custom logger provider - the\r\n            string parameter is the 'prefix' (usually the class name of the log\r\n            entry)\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.RxApp.MessageBus\">\r\n            <summary>\r\n            Set this property to implement a custom MessageBus for\r\n            MessageBus.Current.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:ReactiveUI.RxApp.GetFieldNameForPropertyNameFunc\">\r\n            <summary>\r\n            Set this property to override the default field naming convention\r\n            of \"_PropertyName\" with a custom one.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.ReactiveValidatedObject\">\r\n            <summary>\r\n            \r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ReactiveValidatedObject.#ctor\">\r\n             <summary>\r\n            \r\n             </summary>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.ValidationBase\">\r\n            <summary>\r\n            \r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ValidationBase.IsValid(System.Object,System.ComponentModel.DataAnnotations.ValidationContext)\">\r\n            <summary>\r\n            \r\n            </summary>\r\n            <param name=\"value\"></param>\r\n            <param name=\"validationContext\"></param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ValidationBase.isValidViaNullOrBlank(System.Object)\">\r\n            <summary>\r\n            \r\n            </summary>\r\n            <param name=\"value\"></param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ValidationBase.isValidViaNullOrBlank(System.Object,System.ComponentModel.DataAnnotations.ValidationContext)\">\r\n            <summary>\r\n            \r\n            </summary>\r\n            <param name=\"value\"></param>\r\n            <param name=\"ctx\"></param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.ValidationBase.getStandardMessage(System.ComponentModel.DataAnnotations.ValidationContext)\">\r\n            <summary>\r\n            \r\n            </summary>\r\n            <param name=\"ctx\"></param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"T:ReactiveUI.ValidatesViaMethodAttribute\">\r\n            <summary>\r\n            \r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``3(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Func{ReactiveUI.IObservedChange{``0,``2},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``4(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``5(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Linq.Expressions.Expression{System.Func{``0,``4}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},ReactiveUI.IObservedChange{``0,``4},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``6(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Linq.Expressions.Expression{System.Func{``0,``4}},System.Linq.Expressions.Expression{System.Func{``0,``5}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},ReactiveUI.IObservedChange{``0,``4},ReactiveUI.IObservedChange{``0,``5},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``7(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Linq.Expressions.Expression{System.Func{``0,``4}},System.Linq.Expressions.Expression{System.Func{``0,``5}},System.Linq.Expressions.Expression{System.Func{``0,``6}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},ReactiveUI.IObservedChange{``0,``4},ReactiveUI.IObservedChange{``0,``5},ReactiveUI.IObservedChange{``0,``6},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``8(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Linq.Expressions.Expression{System.Func{``0,``4}},System.Linq.Expressions.Expression{System.Func{``0,``5}},System.Linq.Expressions.Expression{System.Func{``0,``6}},System.Linq.Expressions.Expression{System.Func{``0,``7}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},ReactiveUI.IObservedChange{``0,``4},ReactiveUI.IObservedChange{``0,``5},ReactiveUI.IObservedChange{``0,``6},ReactiveUI.IObservedChange{``0,``7},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``9(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Linq.Expressions.Expression{System.Func{``0,``4}},System.Linq.Expressions.Expression{System.Func{``0,``5}},System.Linq.Expressions.Expression{System.Func{``0,``6}},System.Linq.Expressions.Expression{System.Func{``0,``7}},System.Linq.Expressions.Expression{System.Func{``0,``8}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},ReactiveUI.IObservedChange{``0,``4},ReactiveUI.IObservedChange{``0,``5},ReactiveUI.IObservedChange{``0,``6},ReactiveUI.IObservedChange{``0,``7},ReactiveUI.IObservedChange{``0,``8},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``10(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Linq.Expressions.Expression{System.Func{``0,``4}},System.Linq.Expressions.Expression{System.Func{``0,``5}},System.Linq.Expressions.Expression{System.Func{``0,``6}},System.Linq.Expressions.Expression{System.Func{``0,``7}},System.Linq.Expressions.Expression{System.Func{``0,``8}},System.Linq.Expressions.Expression{System.Func{``0,``9}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},ReactiveUI.IObservedChange{``0,``4},ReactiveUI.IObservedChange{``0,``5},ReactiveUI.IObservedChange{``0,``6},ReactiveUI.IObservedChange{``0,``7},ReactiveUI.IObservedChange{``0,``8},ReactiveUI.IObservedChange{``0,``9},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``11(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Linq.Expressions.Expression{System.Func{``0,``4}},System.Linq.Expressions.Expression{System.Func{``0,``5}},System.Linq.Expressions.Expression{System.Func{``0,``6}},System.Linq.Expressions.Expression{System.Func{``0,``7}},System.Linq.Expressions.Expression{System.Func{``0,``8}},System.Linq.Expressions.Expression{System.Func{``0,``9}},System.Linq.Expressions.Expression{System.Func{``0,``10}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},ReactiveUI.IObservedChange{``0,``4},ReactiveUI.IObservedChange{``0,``5},ReactiveUI.IObservedChange{``0,``6},ReactiveUI.IObservedChange{``0,``7},ReactiveUI.IObservedChange{``0,``8},ReactiveUI.IObservedChange{``0,``9},ReactiveUI.IObservedChange{``0,``10},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``12(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Linq.Expressions.Expression{System.Func{``0,``4}},System.Linq.Expressions.Expression{System.Func{``0,``5}},System.Linq.Expressions.Expression{System.Func{``0,``6}},System.Linq.Expressions.Expression{System.Func{``0,``7}},System.Linq.Expressions.Expression{System.Func{``0,``8}},System.Linq.Expressions.Expression{System.Func{``0,``9}},System.Linq.Expressions.Expression{System.Func{``0,``10}},System.Linq.Expressions.Expression{System.Func{``0,``11}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},ReactiveUI.IObservedChange{``0,``4},ReactiveUI.IObservedChange{``0,``5},ReactiveUI.IObservedChange{``0,``6},ReactiveUI.IObservedChange{``0,``7},ReactiveUI.IObservedChange{``0,``8},ReactiveUI.IObservedChange{``0,``9},ReactiveUI.IObservedChange{``0,``10},ReactiveUI.IObservedChange{``0,``11},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``13(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Linq.Expressions.Expression{System.Func{``0,``4}},System.Linq.Expressions.Expression{System.Func{``0,``5}},System.Linq.Expressions.Expression{System.Func{``0,``6}},System.Linq.Expressions.Expression{System.Func{``0,``7}},System.Linq.Expressions.Expression{System.Func{``0,``8}},System.Linq.Expressions.Expression{System.Func{``0,``9}},System.Linq.Expressions.Expression{System.Func{``0,``10}},System.Linq.Expressions.Expression{System.Func{``0,``11}},System.Linq.Expressions.Expression{System.Func{``0,``12}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},ReactiveUI.IObservedChange{``0,``4},ReactiveUI.IObservedChange{``0,``5},ReactiveUI.IObservedChange{``0,``6},ReactiveUI.IObservedChange{``0,``7},ReactiveUI.IObservedChange{``0,``8},ReactiveUI.IObservedChange{``0,``9},ReactiveUI.IObservedChange{``0,``10},ReactiveUI.IObservedChange{``0,``11},ReactiveUI.IObservedChange{``0,``12},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:ReactiveUI.WhenAnyMixin.WhenAny``14(``0,System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``0,``3}},System.Linq.Expressions.Expression{System.Func{``0,``4}},System.Linq.Expressions.Expression{System.Func{``0,``5}},System.Linq.Expressions.Expression{System.Func{``0,``6}},System.Linq.Expressions.Expression{System.Func{``0,``7}},System.Linq.Expressions.Expression{System.Func{``0,``8}},System.Linq.Expressions.Expression{System.Func{``0,``9}},System.Linq.Expressions.Expression{System.Func{``0,``10}},System.Linq.Expressions.Expression{System.Func{``0,``11}},System.Linq.Expressions.Expression{System.Func{``0,``12}},System.Linq.Expressions.Expression{System.Func{``0,``13}},System.Func{ReactiveUI.IObservedChange{``0,``2},ReactiveUI.IObservedChange{``0,``3},ReactiveUI.IObservedChange{``0,``4},ReactiveUI.IObservedChange{``0,``5},ReactiveUI.IObservedChange{``0,``6},ReactiveUI.IObservedChange{``0,``7},ReactiveUI.IObservedChange{``0,``8},ReactiveUI.IObservedChange{``0,``9},ReactiveUI.IObservedChange{``0,``10},ReactiveUI.IObservedChange{``0,``11},ReactiveUI.IObservedChange{``0,``12},ReactiveUI.IObservedChange{``0,``13},``1})\">\r\n            <summary>\r\n            WhenAny allows you to observe whenever one or more properties on an\r\n            object have changed, providing an initial value when the Observable\r\n            is set up, unlike ObservableForProperty(). Use this method in\r\n            constructors to set up bindings between properties that also need an\r\n            initial setup.\r\n            </summary>\r\n        </member>\r\n    </members>\r\n</doc>\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/nproj-sample.nproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProductVersion>8.0.30703</ProductVersion>\r\n    <SchemaVersion>2.0</SchemaVersion>\r\n    <ProjectGuid>c67af951-5808-4525-9785-d8d6376993e7</ProjectGuid>\r\n    <OutputType>Exe</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>nproj_sample</RootNamespace>\r\n    <AssemblyName>nproj_sample</AssemblyName>\r\n    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <NoStdLib>true</NoStdLib>\r\n    <NemerleVersion>Net-4.0</NemerleVersion>\r\n    <NemerleBinPathRoot Condition=\" '$(NemerleBinPathRoot)' == '' \">$(ProgramFiles)\\Nemerle</NemerleBinPathRoot>\r\n    <Nemerle Condition=\" '$(Nemerle)' == '' \">$(NemerleBinPathRoot)\\$(NemerleVersion)</Nemerle>\r\n    <Name>nproj-sample</Name>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugSymbols>false</DebugSymbols>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <DocumentationFile>$(OutputPath)\\$(AssemblyName).xml</DocumentationFile>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"mscorlib\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\">\r\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\r\n    </Reference>\r\n    <Reference Include=\"System.Xml.Linq\">\r\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\r\n    </Reference>\r\n    <Reference Include=\"System.Data.DataSetExtensions\">\r\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\r\n    </Reference>\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"Nemerle\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>$(Nemerle)\\Nemerle.dll</HintPath>\r\n      <Private>True</Private>\r\n    </Reference>\r\n    <MacroReference Include=\"Nemerle.Linq\">\r\n      <HintPath>$(Nemerle)\\Nemerle.Linq.dll</HintPath>\r\n    </MacroReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Main.n\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.n\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Folder Include=\"Properties\\\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(Nemerle)\\Nemerle.MSBuild.targets\" />\r\n  <!--\r\n\t\tTo modify your build process, add your task inside one of the targets below and uncomment it. \r\n\t\tOther similar extension points exist, see Microsoft.Common.targets.\r\n\t<Target Name=\"BeforeBuild\">\r\n\t</Target>\r\n\t<Target Name=\"AfterBuild\">\r\n\t</Target>\r\n\t-->\r\n</Project>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/oasis-table.sch",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<!-- ============================================================= -->\n<!-- \n  This work is in the public domain and may be reproduced, published or \n  otherwise used without the permission of the National Library of Medicine (NLM).\n  \n  We request only that the NLM is cited as the source of the work.\n  \n  Although all reasonable efforts have been taken to ensure the accuracy and \n  reliability of the software and data, the NLM and the U.S. Government  do \n  not and cannot warrant the performance or results that may be obtained  by\n  using this software or data. The NLM and the U.S. Government disclaim all \n  warranties, express or implied, including warranties of performance, \n  merchantability or fitness for any particular purpose.\n-->\n<!-- ============================================================= -->\n\n<schema xmlns=\"http://purl.oclc.org/dsdl/schematron\"\n  xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n  xmlns:m=\"http://mulberrytech.com/xslt/oasis-html/util\"\n  queryBinding=\"xslt2\">\n  \n  <title>OASIS/CALS table validation</title>\n  \n  <!-- Mulberry Technologies (wap)\n       \n       Designed for JATS, but probably also useful in other\n       systems using OASIS/CALS/Docbook tables\n       \n       Assumes a table DTD (or schema) valid to the OASIS/CALS/Docbook model\n  -->\n  \n  <ns prefix=\"o\" uri=\"http://docs.oasis-open.org/ns/oasis-exchange/table\"/>\n  <ns prefix=\"m\" uri=\"http://mulberrytech.com/xslt/oasis-html/util\"/>\n  <!--<ns prefix=\"xsl\" uri=\"http://www.w3.org/1999/XSL/Transform\"/>-->\n  \n  <!-- the included stylesheet includes key and function declarations required -->\n  <xsl:include href=\"oasis-exchange-support.xsl\"/>\n  \n  <let name=\"default-border-style\" value=\"solid\"/>\n  \n  <pattern>\n    <rule context=\"o:tgroup\">\n      <let name=\"okay-cols\" value=\"@cols[. castable as xs:integer][. > 0]\"/>\n      <assert test=\"exists(@cols)\">tgroup/@cols is not given</assert>\n      <assert test=\"empty(@cols) or exists($okay-cols)\">@cols should be a natural number\n      (integer greater than zero).</assert>\n      <assert test=\"empty($okay-cols) or empty(o:colspec) or (count(o:colspec) = @cols)\">The tgroup has \n        <value-of select=\"count(o:colspec)\"/> colspec<value-of select=\"if (count(o:colspec) = 1) then '' else 's'\"/>, \n        but its @cols is given as '<value-of select=\"@cols\"/>'.</assert>\n      <report test=\"not(*/o:row/m:actual-cols(.) != */o:row/m:actual-cols(.))\n        and ($okay-cols != m:actual-cols((*/o:row)[1]))\">tgroup/@cols is given as\n        <value-of select=\"$okay-cols\"/>, but all rows have <value-of\n          select=\"m:actual-cols((*/o:row)[1])\"/> entr<value-of \n          select=\"if (m:actual-cols((*/o:row)[1]) eq 1) then 'y' else 'ies'\"/>.\n      </report>\n      <report test=\"@align='char'\" role=\"warning\">Without assigning @char or @charoff to everything,\n        assigning @align='char' to tgroup only aligns contents to right of center.</report>\n    </rule>\n    \n    <rule context=\"o:colspec\">\n      <let name=\"okay-colwidth\"\n        value=\"@colwidth[exists(m:colwidth-unit(current()))]\"/>\n      <assert test=\"empty(@colwidth) or exists($okay-colwidth)\">Malformed @colwidth.</assert>\n      <assert test=\"empty($okay-colwidth) or \n        (count(../o:colspec[m:colwidth-unit(.)=m:colwidth-unit(current())]) &gt;\n         count(../o:colspec[not(m:colwidth-unit(.)=m:colwidth-unit(current()))]))\">@colwidth unit\n        (<value-of select=\"m:colwidth-unit(.)\"/>) is not consistent with the\n        units on other colspecs.</assert>\n      \n      <assert test=\"empty($okay-colwidth) or matches($okay-colwidth,'^\\s*\\*\\s*$')\n        or (xs:double(replace($okay-colwidth,'[\\s\\p{L}\\*]','')[. castable as xs:double]) &gt; 0)\">@colwidth must be positive</assert>\n      <report test=\"empty(m:colwidth-unit(.))\n        and exists(../o:colspec/m:colwidth-unit(.))\">The same unit of measure should be used on every \n        colspec/@colwidth.</report>\n      \n      <assert test=\"empty(@colnum) or (@colnum = count(.|preceding-sibling::o:colspec))\">@colnum \n        '<value-of select=\"@colnum\"/>' does not correspond to\n        the column's actual number (<value-of select=\"count(.|preceding-sibling::o:colspec)\"/>)</assert>\n      <report test=\"@colname = (../o:colspec except .)/@colname\">The same @colname is assigned to more than\n         one colspec.</report>\n      <assert test=\"not(@align='char') or exists(@char)\" role=\"warning\">@align='char', but no @char is given.</assert>\n      <report test=\"normalize-space(@char) and not((@align,../@align)[1]='char')\">@char is given, but alignment is not 'char'.</report>\n      <assert test=\"empty(@charoff) or ((@align,../@align)[1]='char')\" role=\"warning\">@charoff is given, but alignment is not 'char'.</assert>\n    </rule>\n    \n    <rule context=\"o:row\">\n      <let name=\"tgroup\" value=\"ancestor::o:tgroup[1]\"/>\n      <let name=\"rowno\" value=\"m:rowno(.)\"/>\n      <let name=\"given-entries\" value=\"count(distinct-values(key('entry-by-row',$rowno,$tgroup)/m:across(.)))\"/>\n      <report test=\"$given-entries &lt; $tgroup/@cols\n        and exists($tgroup/@cols[. castable as xs:integer])\" role=\"warning\">\n        The row doesn't have enough entries (<value-of select=\"$tgroup/@cols\"/> \n        <value-of select=\"if ($tgroup/@cols=1) then ' is' else ' are'\"/> expected;\n        <value-of select=\"$given-entries\"/> <value-of select=\"if ($given-entries=1) then ' is' else ' are'\"/> given).\n      </report>\n    </rule>\n    <rule context=\"o:entry\">\n      <let name=\"tgroup\" value=\"ancestor::o:tgroup[1]\"/>\n      <assert test=\"empty(@nameend) or exists(key('colspec-by-name',@nameend,$tgroup))\">No colspec is \n        named <value-of select=\"@nameend\"/>.</assert>\n      <assert test=\"empty(@nameend|@namest) or \n        (key('colspec-by-name',@nameend,$tgroup) >> key('colspec-by-name',@namest,$tgroup))\">Entry's end\n        column (<value-of select=\"@nameend\"/>) must follow its start column \n        (<value-of select=\"@namest\"/>).</assert>\n      <assert test=\"empty(@namest) or exists(key('colspec-by-name',@namest,$tgroup))\">No colspec is \n        named <value-of select=\"@namest\"/>.</assert>\n      <assert test=\"empty(@colname) or exists(key('colspec-by-name',@colname,$tgroup))\">No colspec is \n        named <value-of select=\"@colname\"/>.</assert>\n      <assert test=\"empty(@nameend) or exists(@colname|@namest)\">Entry is assigned an end\n        column (<value-of select=\"@nameend\"/>) but not a start column.</assert>\n      <assert test=\"not(@colname != @namest)\">Entry is assigned to column <value-of select=\"@colname\"/>,\n        so it can't start at column <value-of select=\"@namest\"/>.\n      </assert>\n\n      <assert test=\"m:across(.)[1] &gt; (preceding-sibling::o:entry[1]/m:across(.)[last()],0)[1]\">\n        Entry must be assigned to a free column (after its preceding entries). \n      </assert>\n      \n      <report test=\"m:down(.) &gt; m:rowno(../../o:row[last()])\">This entry doesn't fit into\n        its <value-of select=\"local-name(../..)\"/>.</report>\n      \n      <report test=\"(exists(@morerows) and\n        (key('entry-by-row',m:down(.),$tgroup)/m:across(.)[last()] &gt; $tgroup/@cols))\n        or empty($tgroup/@cols)\" role=\"warning\">\n        A row in which this entry appears has too many entries.\n      </report>\n      <!-- the next rule will never fire for entries spanning columns: they always\n           fit by virtue of being assigned a @nameend -->\n      <report test=\"(m:across(.)[last()] &gt; $tgroup/@cols) or empty($tgroup/@cols)\">\n        Entry does not fit in row. (<value-of select=\"$tgroup/@cols\"/> are allowed; entry\n        is in column <value-of select=\"m:across(.)[last()]\"/>.)\n        <!-- Entry does not fit in row. (# columns are allowed; row ends in column #.)       -->\n      </report>\n      \n      <assert test=\"empty(@char) or m:align(.)='char'\" role=\"warning\">@char is given, but alignment is not 'char'.</assert>\n      <assert test=\"empty(@charoff) or m:align(.)='char'\" role=\"warning\">@charoff is given, but alignment is not 'char'.</assert>\n      <assert test=\"empty(@charoff) or ((@charoff castable as xs:integer) and\n        (@charoff &gt;= 0) and (@charoff &lt;= 100))\">@charoff must be a whole number between 0 and 100.</assert>\n      <assert test=\"not(m:align(.)='char') or exists(@char|m:colspec-for-entry(.)/@char)\" role=\"warning\">\n        Entry is designated for character alignment, but no character (@char) is given on it or its colspec.\n      </assert>\n      <assert test=\"empty(@char) or not(@char != m:colspec-for-entry(.)/@char)\">\n        Entry is assigned an alignment character (<value-of select=\"@char\"/>)\n        different from its column's (<value-of select=\"m:colspec-for-entry(.)/@char\"/>).</assert>\n      <report test=\"exists(*) and (m:align(.)='char')\" role=\"warning\">With @align='char', markup of \n        entry contents (<value-of select=\"string-join(distinct-values(*/name()),', ')\"/>) will be ignored.</report>\n    </rule>\n  </pattern>\n</schema>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit bootstrap=\"./tests/bootstrap.php\"\n         colors=\"true\">\n    <testsuites>\n        <testsuite>\n            <directory>tests</directory>\n        </testsuite>\n    </testsuites>\n    <filter>\n        <whitelist>\n            <directory suffix=\".php\">src</directory>\n        </whitelist>\n    </filter>\n</phpunit>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/point-3.1.gml",
    "content": "<?xml version=\"1.0\"?>\n<gml:Point xmlns:gml=\"http://www.opengis.net/gml\" srsName=\"urn:ogc:def:crs:EPSG::4326\" gml:id=\"uuid.12b3c8bb-bc8a-4f83-9085-1a5f3280b8ba\">\n  <gml:pos>52.56 13.29</gml:pos>\n</gml:Point>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/point-3.2.gml",
    "content": "<?xml version=\"1.0\"?>\n<gml:Point xmlns:gml=\"http://www.opengis.net/gml/3.2\" srsName=\"urn:ogc:def:crs:EPSG::4326\" gml:id=\"uuid.12b3c8bb-bc8a-4f83-9085-1a5f3280b8ba\">\n  <gml:pos>52.56 13.29</gml:pos>\n</gml:Point>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/pt_BR.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.0\" language=\"pt_BR\">\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../forms/mainwindow.ui\" line=\"22\"/>\n        <source>United Kingdom</source>\n        <translation>Reino Unido</translation>\n    </message>\n    <message>\n        <location filename=\"../forms/mainwindow.ui\" line=\"38\"/>\n        <source>God save the Queen</source>\n        <translation>Deus salve a Rainha</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"46\"/>\n        <source>England</source>\n        <translation>Inglaterra</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"47\"/>\n        <source>Wales</source>\n        <translation>Gales</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"48\"/>\n        <source>Scotland</source>\n        <translation>Escócia</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"49\"/>\n        <source>Northern Ireland</source>\n        <translation>Irlanda Norte</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"51\"/>\n        <source>Portuguese</source>\n        <translation>Português</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"52\"/>\n        <source>English</source>\n        <translation>Inglês</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/pt_BR.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.0\" language=\"pt_BR\">\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../forms/mainwindow.ui\" line=\"22\"/>\n        <source>United Kingdom</source>\n        <translation>Reino Unido</translation>\n    </message>\n    <message>\n        <location filename=\"../forms/mainwindow.ui\" line=\"38\"/>\n        <source>God save the Queen</source>\n        <translation>Deus salve a Rainha</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"46\"/>\n        <source>England</source>\n        <translation>Inglaterra</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"47\"/>\n        <source>Wales</source>\n        <translation>Gales</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"48\"/>\n        <source>Scotland</source>\n        <translation>Escócia</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"49\"/>\n        <source>Northern Ireland</source>\n        <translation>Irlanda Norte</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"51\"/>\n        <source>Portuguese</source>\n        <translation>Português</translation>\n    </message>\n    <message>\n        <location filename=\"../mainwindow.cpp\" line=\"52\"/>\n        <source>English</source>\n        <translation>Inglês</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/racoon.mjml",
    "content": "<mjml>\n  <mj-body>\n    <mj-container background-color=\"#d6dde5\">\n      <mj-section full-width=\"full-width\" padding-bottom=\"20\">\n      </mj-section>\n      <mj-navbar background-color=\"#ffffff\">\n        <mj-column width=\"50%\">\n          <mj-image href=\"https://mjml.io\" src=\"http://191n.mj.am/img/191n/3s/x4u.png\" alt=\"Racoon logo\" align=\"center\" padding=\"10\">\n          </mj-image>\n        </mj-column>\n        <mj-column width=\"50%\">\n          <mj-inline-links base-url=\"https://mjml.io\" hamburger=\"hamburger\" ico-color=\"#fa8739\" padding-top=\"5px\">\n            <mj-link href=\"https://mjml.io\" color=\"#000000\">home</mj-link>\n            <mj-link href=\"https://mjml.io\" color=\"#000000\">blog</mj-link>\n            <mj-link href=\"https://mjml.io\" color=\"#000000\">store</mj-link>\n          </mj-inline-links>\n        </mj-column>\n      </mj-navbar>\n      <mj-section background-color=\"#fa8739\" padding-bottom=\"0\" padding-top=\"0\">\n        <mj-column width=\"200\">\n          <mj-text align=\"left\" color=\"#fff\" font-size=\"40\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"10\" padding-top=\"10\">\n            <p style=\"font-size: 17px;\">SPRING PROMO</p>\n            <p>50%</p>\n            <p>OFFER</p>\n            <p style=\"font-size: 13px\">Lorem ipsum dolor sit amet, consectetur adipiscing elit<br /></p>\n          </mj-text>\n          <mj-button background-color=\"#fff\" color=\"#fa8739\" font-size=\"16px\" align=\"center\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"10\" padding-top=\"10\">\n            SHOP NOW\n          </mj-button>\n        </mj-column>\n        <mj-column width=\"400\">\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/xjg.jpg\" alt=\"Clothes set\" align=\"center\" border=\"none\" width=\"400\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"0\" padding-top=\"0\">\n\n          </mj-image>\n        </mj-column>\n      </mj-section>\n      <mj-section background-color=\"#2f323b\" padding-bottom=\"0\" padding-top=\"0\">\n        <mj-column width=\"25%\">\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x4t.png\" alt=\"Box free shipping\" align=\"center\" border=\"none\" width=\"42\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"10\" padding-top=\"10\">\n\n          </mj-image>\n        </mj-column>\n        <mj-column width=\"75%\">\n          <mj-text align=\"left\" color=\"#fff\" font-size=\"18\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"10\" padding-top=\"10\">\n            <p>FREE SHIPPING ON ORDER <span style=\"font-weight: bold;color: rgb(250, 135, 57);\">OVER 55&#x20AC;</span></p>\n          </mj-text>\n        </mj-column>\n      </mj-section>\n      <mj-section background-color=\"#fff\" padding-bottom=\"20\" padding-top=\"10\">\n        <mj-column vertical-align=\"bottom\">\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x4v.jpg\" alt=\"Chesterk tank\" align=\"center\" border=\"none\" width=\"209\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"20\" padding-top=\"30\">\n\n          </mj-image>\n          <mj-text font-weight=\"bold\" align=\"center\" color=\"#000\" font-size=\"15\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p>CHESTERK TANK</p>\n            <p style=\"color: rgb(250, 135, 57);\">15&#x20AC;</p>\n          </mj-text>\n          <mj-button background-color=\"#fa8739\" color=\"#fff\" font-size=\"13\" align=\"center\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-bottom=\"10\" padding-top=\"0\">\n            BUY NOW\n          </mj-button>\n        </mj-column>\n        <mj-column vertical-align=\"bottom\">\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x4g.jpg\" alt=\"Beyond backpack\" align=\"center\" border=\"none\" width=\"178\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"20\" padding-top=\"30\">\n\n          </mj-image>\n          <mj-text font-weight=\"bold\" align=\"center\" color=\"#000\" font-size=\"15\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p>BEYOND BACKPACK</p>\n            <p style=\"color: rgb(250, 135, 57);\">20&#x20AC;</p>\n          </mj-text>\n\n          <mj-button background-color=\"#fa8739\" color=\"#fff\" font-size=\"13\" align=\"center\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-bottom=\"10\" padding-top=\"0\">\n            BUY NOW\n          </mj-button>\n        </mj-column>\n        <mj-column vertical-align=\"bottom\">\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x46.jpg\" alt=\"Jensen shorts\" align=\"center\" border=\"none\" width=\"182\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"20\" padding-top=\"30\">\n\n          </mj-image>\n          <mj-text font-weight=\"bold\" align=\"center\" color=\"#000\" font-size=\"15\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p>JENSEN SHORTS</p>\n            <p style=\"color: rgb(250, 135, 57);\">28&#x20AC;</p>\n          </mj-text>\n          <mj-button background-color=\"#fa8739\" color=\"#fff\" font-size=\"13\" align=\"center\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-bottom=\"10\" padding-top=\"0\">\n            BUY NOW\n          </mj-button>\n        </mj-column>\n      </mj-section>\n      <mj-section background-color=\"#fff\" padding-bottom=\"20\" padding-top=\"10\">\n        <mj-column vertical-align=\"bottom\">\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x4h.jpg\" alt=\"Verdant cap\" align=\"center\" border=\"none\" width=\"129\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"20\" padding-top=\"20\">\n\n          </mj-image>\n          <mj-text font-weight=\"bold\" align=\"center\" color=\"#000\" font-size=\"15\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p>VERDANT CAP</p>\n            <p style=\"color: rgb(250, 135, 57);\">20&#x20AC;</p>\n          </mj-text>\n          <mj-button background-color=\"#fa8739\" color=\"#fff\" font-size=\"13\" align=\"center\" border=\"none\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"10\" padding-top=\"0\">\n            BUY NOW\n          </mj-button>\n        </mj-column>\n        <mj-column vertical-align=\"bottom\">\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x4i.jpg\" alt=\"Blake polo shirt\" align=\"center\" border=\"none\" width=\"208\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"20\" padding-top=\"20\">\n\n          </mj-image>\n          <mj-text font-weight=\"bold\" align=\"center\" color=\"#000\" font-size=\"15\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p>BLAKE POLO SHIRT</p>\n            <p style=\"color: rgb(250, 135, 57);\">25&#x20AC;</p>\n          </mj-text>\n          <mj-button background-color=\"#fa8739\" color=\"#fff\" font-size=\"13\" align=\"center\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-bottom=\"10\" padding-top=\"0\">\n            BUY NOW\n          </mj-button>\n        </mj-column>\n        <mj-column vertical-align=\"bottom\">\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x4j.jpg\" alt=\"Sketch floral\" align=\"center\" border=\"none\" width=\"72\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"20\" padding-top=\"20\">\n\n          </mj-image>\n          <mj-text font-weight=\"bold\" align=\"center\" color=\"#000\" font-size=\"15\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p>SKETCH FLORAL</p>\n            <p style=\"color: rgb(250, 135, 57);\">23&#x20AC;</p>\n          </mj-text>\n          <mj-button background-color=\"#fa8739\" color=\"#fff\" font-size=\"13\" align=\"center\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-bottom=\"10\" padding-top=\"0\">\n            BUY NOW\n          </mj-button>\n        </mj-column>\n      </mj-section>\n      <mj-section background-color=\"#fa8739\" padding-bottom=\"0\" padding-top=\"0\">\n        <mj-column>\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x4k.jpg\" alt=\"Man 1\" width=\"301\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"0\" padding-top=\"0\">\n          </mj-image>\n        </mj-column>\n        <mj-column width=\"50%\">\n          <mj-text align=\"left\" color=\"#fff\" font-size=\"13\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p style=\"font-size: 19px;\">ANDERSON SWEATER</p>\n            <p style=\"font-size: 36px;\">75&#x20AC;</p>\n            <p>The Anderson Sweater features a floral all-over print with contrast colour.</p>\n          </mj-text>\n          <mj-button background-color=\"#fff\" color=\"#fa8739\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-bottom=\"10\" padding-top=\"0\">\n            BUY NOW\n          </mj-button>\n        </mj-column>\n      </mj-section>\n      <mj-section background-color=\"#2f323b\" padding-bottom=\"0\" padding-top=\"0\">\n        <mj-column>\n          <mj-text align=\"left\" color=\"#fff\" font-size=\"13\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p style=\"font-size: 19px;\">ALDER TWO JONES JACKET</p>\n            <p style=\"font-size: 36px;\">100&#x20AC;</p>\n            <p>Colour-block design, zip entry, oxford hood lining, side pockets &amp; TC lining.</p>\n          </mj-text>\n          <mj-button background-color=\"#fa8739\" color=\"#fff\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-bottom=\"10\" padding-top=\"0\">\n            BUY NOW\n          </mj-button>\n        </mj-column>\n        <mj-column>\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/xj6.jpg\" alt=\"Man 2\" align=\"center\" border=\"none\" width=\"302\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"0\" padding-top=\"0\">\n\n          </mj-image>\n        </mj-column>\n      </mj-section>\n      <mj-section background-color=\"#fa8739\" padding-bottom=\"0\" padding-top=\"0\">\n        <mj-column>\n          <mj-text align=\"center\" color=\"#fff\" font-size=\"13\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"10\" padding-top=\"10\">\n            <p style=\"font-size: 14px;\">DISCOVER OUR</p>\n            <p style=\"font-size: 27px;\">SUMMER COLLECTION</p>\n          </mj-text>\n        </mj-column>\n      </mj-section>\n      <mj-section background-color=\"#fff\" padding-bottom=\"20\" padding-top=\"20\">\n        <mj-column>\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x4q.jpg\" alt=\"Topaz C3 shoes\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n          </mj-image>\n          <mj-text align=\"center\" color=\"#000\" font-size=\"15\" font-weight=\"bold\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p>TOPAZ C3 SHOES</p>\n            <p style=\"color: rgb(250, 135, 57);\">70&#x20AC;</p>\n          </mj-text>\n          <mj-button background-color=\"#fa8739\" color=\"#fff\" font-size=\"13\" align=\"center\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-bottom=\"10\" padding-top=\"0\">\n            BUY NOW\n          </mj-button>\n        </mj-column>\n        <mj-column>\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x4r.jpg\" alt=\"Camden backpack\" align=\"center\" border=\"none\" width=\"199\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n\n          </mj-image>\n          <mj-text align=\"center\" color=\"#000\" font-size=\"15\" font-weight=\"bold\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p>CAMDEN BACKPACK</p>\n            <p style=\"color: rgb(250, 135, 57);\">50&#x20AC;</p>\n          </mj-text>\n          <mj-button background-color=\"#fa8739\" color=\"#fff\" padding=\"15px 30px\" border-radius=\"3px\" href=\"https://mjml.io\" padding-bottom=\"10\" padding-top=\"0\">\n            BUY NOW\n          </mj-button>\n        </mj-column>\n      </mj-section>\n      <mj-section background-color=\"#2f323b\" padding-bottom=\"20\" padding-top=\"20\">\n        <mj-column>\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x47.png\" alt=\"Cards\" width=\"72\">\n          </mj-image>\n          <mj-text align=\"center\" color=\"#fff\" font-size=\"13\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p style=\"font-size: 15px;font-weight: bold;\">PAYMENT METHODS</p>\n            <p>We accept all majors payments options</p>\n          </mj-text>\n        </mj-column>\n        <mj-column>\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x48.png\" alt=\"Currencies\" align=\"center\" border=\"none\" width=\"70\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"10\">\n\n          </mj-image>\n          <mj-text align=\"center\" color=\"#fff\" font-size=\"13\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p style=\"font-size: 15px;font-weight: bold;\">CURRENCIES CHOICE</p>\n            <p>You have the choice to pay with your own currencies</p>\n          </mj-text>\n        </mj-column>\n        <mj-column>\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x4y.png\" alt=\"Express\" align=\"center\" border=\"none\" width=\"82\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"8\" padding-top=\"10\">\n\n          </mj-image>\n          <mj-text align=\"center\" color=\"#fff\" font-size=\"13\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p style=\"font-size: 15px;font-weight: bold;\">EXPRESS SHIPPING</p>\n            <p>Delivered tomorrow before noon</p>\n          </mj-text>\n        </mj-column>\n      </mj-section>\n      <mj-section background-color=\"#fa8739\" padding-bottom=\"0\" padding-top=\"0\">\n        <mj-column>\n          <mj-image src=\"http://191n.mj.am/img/191n/3s/x49.png\" alt=\"Racoon logo\" align=\"center\" border=\"none\" width=\"180\" padding-left=\"0\" padding-right=\"0\" padding-bottom=\"0\" padding-top=\"10\">\n          </mj-image>\n        </mj-column>\n        <mj-column>\n          <mj-text align=\"center\" color=\"#fff\" font-size=\"13\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"0\" padding-top=\"0\">\n            <p><a href=\"https://mjml.io\" style=\"text-decoration: none; color: inherit;\">Privacy policy</a></p>\n          </mj-text>\n        </mj-column>\n        <mj-column>\n          <mj-social font-size=\"13\" text-mode=\"false\" facebook-href=\"[[SHORT_PERMALINK]]\" twitter-href=\"[[SHORT_PERMALINK]]\" google-href=\"[[SHORT_PERMALINK]]\" mode=\"horizontal\" display=\"facebook twitter google\" padding-left=\"25\" padding-right=\"25\" padding-bottom=\"10\"\n            padding-top=\"10\">\n          </mj-social>\n        </mj-column>\n      </mj-section>\n      <mj-section padding-bottom=\"20\" padding-top=\"20\">\n      </mj-section>\n    </mj-container>\n  </mj-body>\n</mjml>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/real-estate.mjml",
    "content": "<mjml>\n  <mj-head>\n    <mj-title>Say hello to RealEstate</mj-title>\n    <mj-font name=\"Roboto\" href=\"https://fonts.googleapis.com/css?family=Alice\" />\n    <mj-font name=\"Roboto\" href=\"https://fonts.googleapis.com/css?family=Roboto:400,700\" />\n    <mj-attributes>\n      <mj-all font-family=\"Roboto, Helvetica, Arial, sans-serif\" padding=\"0\" />\n      <mj-text font-weight=\"400\" font-size=\"14\" color=\"#000000\" line-height=\"21px\" />\n    </mj-attributes>\n  </mj-head>\n\n  <mj-body>\n    <mj-container background-color=\"#EAE8E5\">\n\n      <mj-section padding=\"20px 0 0 0\">\n        <mj-column>\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/box-head.png\" alt=\"\" align=\"center\" border=\"none\" padding=\"0\"></mj-image>\n        </mj-column>\n      </mj-section>\n\n      <mj-section padding-top=\"40px\" background-color=\"#FFFFFF\">\n        <mj-column width=\"570px\">\n          <mj-text align=\"left\" padding=\"0 20px\" color=\"#1D83A8\" font-size=\"36\" line-height=\"40px\" font-family=\"Alice, Helvetica, Arial, sans-serif\">\n            Real Estate\n          </mj-text>\n          <mj-text align=\"left\" padding=\"0 20px\">\n            <strong><span style=\"font-size: 40px;\">⚊</span></strong><br /><br /></mj-text>\n        </mj-column>\n      </mj-section>\n\n      <mj-section background-color=\"#FFFFFF\">\n        <mj-column width=\"300px\">\n          <mj-text align=\"left\" padding=\"0 20px 30px 20px\">\n            <strong>Aliquam lorem ante, dapibus in hasellus viverra nulla</strong> ut metus varius laoreet. Quisque rutrum lorem dellorus. Aenean imperdiet.\n          </mj-text>\n        </mj-column>\n        <mj-column width=\"260px\">\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/icon-1.png\" alt=\"\" padding-bottom=\"30px\" width=\"260\" align=\"center\" border=\"none\"></mj-image>\n        </mj-column>\n      </mj-section>\n\n      <mj-section background-url=\"http://nimus.de/share/tpl-realestate/img-1.png\" vertical-align=\"middle\" background-size=\"cover\" padding=\"30px\" background-repeat=\"no-repeat\">\n        <mj-column vertical-align=\"middle\" width=\"60%\">\n          <mj-text align=\"center\" padding=\"40px 30px\" color=\"#FFFFFF\" font-size=\"42px\" line-height=\"48px\" font-family=\"Alice, Helvetica, Arial, sans-serif\">\n            Villa Semperin\n          </mj-text>\n        </mj-column>\n        <mj-column vertical-align=\"middle\" width=\"40%\" background-color=\"#FFFFFF\">\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/box-top.png\" width=\"220px\" alt=\"\" align=\"center\" border=\"none\"></mj-image>\n          <mj-text align=\"center\" padding=\"20px 20px 0 20px\" color=\"#1D83A8\" font-size=\"26\" line-height=\"30px\" font-family=\"Alice, Helvetica, Arial, sans-serif\">\n            – first offer –\n          </mj-text>\n          <mj-text align=\"center\" padding=\"10px 20px\" font-size=\"22\" line-height=\"30px\">340,000 $</mj-text>\n          <mj-text align=\"center\" padding=\"0 20px\">Nascetur ridiculus mus. Donec quam felis, ultricies nec</mj-text>\n          <mj-button background-color=\"#F44E3C\" color=\"white\" padding=\"20px 20px 30px 20px\" border-radius=\"20px\">\n            view details\n          </mj-button>\n        </mj-column>\n      </mj-section>\n\n\n      <mj-section padding=\"30px\" background-color=\"#FFFFFF\">\n        <mj-column width=\"60%\">\n          <mj-text align=\"center\" padding-bottom=\"20px\" font-size=\"26\" line-height=\"30px\" font-family=\"Alice, Helvetica, Arial, sans-serif\">\n            Lorem Ipsum\n          </mj-text>\n          <mj-text align=\"center\" padding=\"0 40px\">\n            Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Lorem Ipsum\n          </mj-text>\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/icon-2.png\" alt=\"\" padding=\"30px 0 10px 0\" width=\"50\" align=\"center\" border=\"none\"></mj-image>\n        </mj-column>\n        <mj-column width=\"40%\" background-color=\"#FFFFFF\">\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/img-2.png\" width=\"216px\" alt=\"\" align=\"center\" border=\"none\"></mj-image>\n        </mj-column>\n      </mj-section>\n\n      <mj-section padding=\"20px\" background-color=\"#FFFFFF\">\n        <mj-column width=\"100%\">\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/symbol-1.png\" alt=\"\" width=\"292px\" align=\"left\" border=\"none\"></mj-image>\n        </mj-column>\n      </mj-section>\n\n      <mj-section padding=\"0 20px\" background-color=\"#FFFFFF\">\n        <mj-column>\n          <mj-text align=\"center\" font-size=\"26\" line-height=\"30px\" font-family=\"Alice, Helvetica, Arial, sans-serif\">\n            Lorem Ipsum\n          </mj-text>\n          <mj-divider width=\"20px\" padding=\"20px 0\" border-width=\"2px\" border-color=\"#000000\" />\n          <mj-text align=\"center\" padding=\"0 40px\">\n            Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Lorem Ipsum\n          </mj-text>\n          <mj-button background-color=\"#F44E3C\" color=\"white\" padding=\"20px 20px 10px 20px\" border-radius=\"20px\">\n            Call to action\n          </mj-button>\n        </mj-column>\n      </mj-section>\n\n      <mj-section padding=\"20px\" background-color=\"#FFFFFF\">\n        <mj-column width=\"100%\">\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/symbol-2.png\" alt=\"\" width=\"213px\" align=\"right\" border=\"none\"></mj-image>\n        </mj-column>\n      </mj-section>\n\n\n      <mj-section padding=\"0 30px 30px\" background-color=\"#FFFFFF\">\n        <mj-column width=\"55%\">\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/img-3.png\" width=\"280px\" padding-bottom=\"20px\" alt=\"\" align=\"center\" border=\"none\"></mj-image>\n        </mj-column>\n        <mj-column width=\"45%\" background-color=\"#FFFFFF\">\n          <mj-text align=\"center\" padding-bottom=\"20px\" font-size=\"26\" line-height=\"30px\" font-family=\"Alice, Helvetica, Arial, sans-serif\">\n            Lorem Ipsum\n          </mj-text>\n          <mj-text align=\"center\" padding=\"0 40px\">\n            Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum.\n          </mj-text>\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/icon-3.png\" alt=\"\" padding=\"30px 0 10px 0\" width=\"50\" align=\"center\" border=\"none\"></mj-image>\n        </mj-column>\n      </mj-section>\n\n      <mj-section padding=\"0 20px\" background-color=\"#FFFFFF\">\n        <mj-column>\n          <mj-text align=\"center\" font-size=\"26\" line-height=\"30px\" font-family=\"Alice, Helvetica, Arial, sans-serif\">\n            Nullam dictum felis eu pede\n          </mj-text>\n          <mj-divider width=\"20px\" padding=\"20px 0\" border-width=\"2px\" border-color=\"#000000\" />\n        </mj-column>\n      </mj-section>\n\n      <mj-section padding=\"0 20px 30px\" background-color=\"#FFFFFF\">\n        <mj-column width=\"33%\">\n          <mj-text align=\"left\" padding=\"0 15px 15px\">\n            <strong>Aliquam lorem ante,</strong> dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Lorem Ipsum\n          </mj-text>\n        </mj-column>\n        <mj-column width=\"34%\">\n          <mj-text align=\"left\" padding=\"0 15px 15px\">\n            <strong>Phasellus viverra null aliquam lorem ante</strong>, dapibus in, viverra quis, feugiat a, tellus ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Lorem Ipsum\n          </mj-text>\n        </mj-column>\n        <mj-column width=\"33%\">\n          <mj-text align=\"left\" padding=\"0 15px 15px\">\n            <strong>Quisque rutrum.</strong> Aenean imperdiet viverra nulla ut metus varius laoreet. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Lorem Ipsum\n          </mj-text>\n        </mj-column>\n      </mj-section>\n\n      <mj-section background-url=\"http://nimus.de/share/tpl-realestate/img-4.png\" vertical-align=\"middle\" background-size=\"cover\" padding=\"30px\" background-repeat=\"no-repeat\">\n        <mj-column vertical-align=\"middle\" width=\"40%\" background-color=\"#FFFFFF\">\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/box-top.png\" width=\"220px\" alt=\"\" align=\"center\" border=\"none\"></mj-image>\n          <mj-text align=\"center\" padding=\"20px 20px 0 20px\" color=\"#1D83A8\" font-size=\"26\" line-height=\"30px\" font-family=\"Alice, Helvetica, Arial, sans-serif\">\n            – 2. offer –\n          </mj-text>\n          <mj-text align=\"center\" padding=\"10px 20px\" font-size=\"22\" line-height=\"30px\">198,700 $</mj-text>\n          <mj-text align=\"center\" padding=\"0 20px\">Donec quam felis, ultricies Nascetur ridiculus mus.</mj-text>\n          <mj-button background-color=\"#F44E3C\" color=\"white\" padding=\"20px 20px 30px 20px\" border-radius=\"20px\">\n            view details\n          </mj-button>\n        </mj-column>\n        <mj-column vertical-align=\"middle\" width=\"60%\">\n          <mj-text align=\"center\" padding=\"40px 30px\" color=\"#FFFFFF\" font-size=\"42px\" line-height=\"48px\" font-family=\"Alice, Helvetica, Arial, sans-serif\">\n            Window House 23\n          </mj-text>\n        </mj-column>\n      </mj-section>\n\n      <mj-section padding=\"40px 20px\" background-color=\"#FFFFFF\">\n        <mj-column width=\"100%\">\n          <mj-image src=\"http://nimus.de/share/tpl-realestate/icon-1.png\" alt=\"\" width=\"130px\" align=\"center\" border=\"none\"></mj-image>\n        </mj-column>\n      </mj-section>\n\n      <mj-section padding=\"10px 0 20px 0\">\n        <mj-column>\n          <mj-text align=\"center\" color=\"#9B9B9B\" font-size=\"11px\"><a href=\"#\" style=\"color: #9B9B9B;\">Unsubscribe</a> from this newsletter<br>Icon made by Freepik from <a href=\"http://www.flaticon.com\" target=\"_blank\" style=\"color: #9B9B9B; text-decoration: none;\">www.flaticon.com</a><br>\n            <a href=\"http://svenhaustein.de\" style=\"color: #9B9B9B; text-decoration:none;\">Made by svenhaustein.de</a>\n          </mj-text>\n        </mj-column>\n      </mj-section>\n\n    </mj-container>\n  </mj-body>\n</mjml>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/sample.csl",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<style xmlns=\"http://purl.org/net/xbiblio/csl\" class=\"in-text\" version=\"1.0\" demote-non-dropping-particle=\"never\">\n  <info>\n    <title>Modern Language Association 7th edition (with URL)</title>\n    <title-short>MLA</title-short>\n    <id>http://www.zotero.org/styles/modern-language-association-with-url</id>\n    <link href=\"http://www.zotero.org/styles/modern-language-association-with-url\" rel=\"self\"/>\n    <link href=\"http://owl.english.purdue.edu/owl/section/2/11/\" rel=\"documentation\"/>\n    <author>\n      <name>Martin Foakes</name>\n      <email>martin@refme.com</email>\n    </author>\n    <category citation-format=\"author\"/>\n    <category field=\"generic-base\"/>\n    <summary>The 2009 MLA Style for purposes where the URL is still required</summary>\n    <updated>2012-10-25T21:15:26+00:00</updated>\n    <rights license=\"http://creativecommons.org/licenses/by-sa/3.0/\">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>\n  </info>\n <locale xml:lang=\"en\">\n    <style-options punctuation-in-quote=\"true\"/>\n    <terms>\n      <term name=\"editor\" form=\"short\">\n      <single>ed</single>\n      <multiple>eds</multiple>\n    </term>\n      <term name=\"illustrator\" form=\"short\">Illus.</term>\n      <term name=\"open-quote\">“</term>\n      <term name=\"close-quote\">”</term>\n      <term name=\"translator\" form=\"short\">trans.</term>\n      <term name=\"month-01\" form=\"short\">Jan.</term>\n      <term name=\"month-02\" form=\"short\">Feb.</term>\n      <term name=\"month-03\" form=\"short\">Mar.</term>\n      <term name=\"month-04\" form=\"short\">Apr.</term>\n      <term name=\"month-05\" form=\"short\">May</term>\n      <term name=\"month-06\" form=\"short\">June</term>\n      <term name=\"month-07\" form=\"short\">July</term>\n      <term name=\"month-08\" form=\"short\">Aug.</term>\n      <term name=\"month-09\" form=\"short\">Sept.</term>\n      <term name=\"month-10\" form=\"short\">Oct.</term>\n      <term name=\"month-11\" form=\"short\">Nov.</term>\n      <term name=\"month-12\" form=\"short\">Dec.</term>\n    </terms>\n  </locale>\n  <macro name=\"author\">\n    <names variable=\"author\">\n      <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n      <substitute>\n        <names variable=\"editor\">\n          <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n          <label form=\"short\" prefix=\", \"/>\n        </names>\n        <names variable=\"translator\">\n          <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n          <label form=\"short\" prefix=\", \"/>\n        </names>\n        <names variable=\"illustrator\">\n          <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n          <label form=\"short\" prefix=\", \"/>\n        </names>\n        <choose>\n          <if type=\"book motion_picture pamphlet\" match=\"any\">\n            <text variable=\"title\" font-style=\"italic\"/>\n          </if>\n          <else>\n            <text variable=\"title\" quotes=\"true\"/>\n          </else>\n        </choose>\n      </substitute>\n    </names>\n  </macro>\n  <macro name=\"author-sort\">\n    <names variable=\"author\">\n      <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n      <choose>\n        <if type=\"review review-book\">\n          <substitute>su\n            <text variable=\"title\" quotes=\"true\"/>\n            <text variable=\"reviewed-title\"/>\n          </substitute>\n        </if>\n        <else>\n          <substitute>\n            <names variable=\"editor\">\n              <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n              <label form=\"short\" prefix=\", \"/>\n            </names>\n            <names variable=\"translator\">\n              <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n              <label form=\"short\" prefix=\", \"/>\n            </names>\n            <names variable=\"illustrator\">\n              <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n              <label form=\"short\" prefix=\", \"/>\n            </names>\n            <choose>\n              <if type=\"book motion_picture pamphlet\" match=\"any\">\n                <text variable=\"title\" font-style=\"italic\"/>\n              </if>\n              <else>\n                <text variable=\"title\" quotes=\"true\"/>\n              </else>\n            </choose>\n          </substitute>\n        </else>\n      </choose>\n    </names>\n  </macro>\n  <macro name=\"entry-author\">\n    <names variable=\"author\">\n      <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n      <substitute>\n        <names variable=\"editor\">\n          <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n          <label form=\"short\" prefix=\", \"/>\n        </names>\n        <text variable=\"title\" quotes=\"true\"/>\n      </substitute>\n    </names>\n  </macro>\n  <macro name=\"reviewed-author\">\n    <names variable=\"reviewed-author\">\n      <name et-al-min=\"4\" et-al-use-first=\"1\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"  initialize=\"false\"/>\n    </names>\n  </macro>\n  <macro name=\"original-author\">\n    <names variable=\"original-author\">\n      <name et-al-min=\"4\" et-al-use-first=\"1\" form=\"long\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n    </names>\n  </macro>\n  <macro name=\"title\">\n    <choose>\n      <if type=\"chapter article-journal personal_communication speech personal_communication entry-dictionary webpage review review-book entry-encyclopedia article article-newspaper interview article-magazine broadcast\" match=\"any\">\n        <text variable=\"title\" font-style=\"normal\" quotes=\"true\" text-case=\"title\"/>\n      </if>\n      <else>\n        <text variable=\"title\" font-style=\"italic\" text-case=\"title\"/>\n      </else>\n    </choose>\n  </macro>\n    <macro name=\"publisher-place\">\n    <choose>\n      <if variable=\"publisher-place\" match=\"none\">\n        <choose>\n          <if type=\"interview broadcast webpage motion_picture\" match=\"none\">\n            <text value=\"N.p.: \"/>\n          </if>\n        </choose>\n        <text variable=\"publisher\"/>\n      </if>\n      <else-if variable=\"publisher\" match=\"none\">\n        <text variable=\"publisher-place\"/>\n        <text value=\": n.p.\"/>\n      </else-if>\n      <else-if variable=\"publisher publisher-place\" match=\"all\">\n          <text variable=\"publisher-place\" suffix=\": \"/>\n          <text variable=\"publisher\"/>\n      </else-if>\n      <else>\n        <text value=\"n.p.\"/>\n      </else>\n    </choose>\n  </macro>\n  <macro name=\"container-title\">\n    <choose>\n      <if match=\"any\" variable=\"container-title\">\n        <text variable=\"container-title\" font-style=\"italic\"/>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"publication-year\">\n    <choose>\n      <if variable=\"issued\" match=\"any\">\n        <date delimiter=\"\" variable=\"issued\">\n          <date-part name=\"day\" suffix=\" \"/>\n          <date-part name=\"month\" form=\"short\" suffix=\" \"/>\n          <date-part name=\"year\"/>\n        </date>\n      </if>\n      <else>\n        <choose>\n          <if type=\"thesis\" match=\"none\">\n            <text term=\"no date\" form=\"short\"/>\n          </if>\n        </choose>\n      </else>\n    </choose>\n  </macro>\n  <macro name=\"page-range\">\n    <choose>\n      <if match=\"any\" variable=\"page\">\n        <text variable=\"page\"/>\n      </if>\n      <else>\n        <choose>\n          <if type=\"interview paper-conference\" match=\"none\">\n            <text value=\"n.pag.\"/>\n          </if>\n        </choose>\n      </else>\n    </choose>\n  </macro>\n  <macro name=\"edition-number\">\n    <choose>\n      <if match=\"any\" variable=\"edition\">\n        <number variable=\"edition\" form=\"ordinal\" suffix=\" \"/>\n        <text term=\"edition\" form=\"short\"/>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"edition-text\">\n    <choose>\n      <if variable=\"edition\" match=\"any\">\n        <text variable=\"edition\" suffix=\" \"/>\n        <text term=\"edition\" form=\"short\"/>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"section-number\">\n    <choose>\n      <if variable=\"section\" match=\"any\">\n        <text term=\"section\" form=\"short\" suffix=\" \"/>\n        <text variable=\"section\"/>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"editor\">\n    <choose>\n      <if match=\"any\" variable=\"editor\">\n        <choose>\n          <if type=\"review review-book\" match=\"any\">\n            <text term=\"editor\" form=\"short\" suffix=\". \"/>\n          </if>\n          <else>\n            <text term=\"editor\" form=\"short\" text-case=\"capitalize-first\" suffix=\". \"/>\n          </else>\n        </choose>\n        <names variable=\"editor\">\n          <name and=\"text\"/>\n        </names>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"translator-long\">\n    <choose>\n      <if match=\"any\" variable=\"translator\">\n        <text term=\"translator\" form=\"short\" text-case=\"capitalize-first\" suffix=\" \"/>\n        <names variable=\"translator\">\n          <name and=\"text\"/>\n        </names>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"illustrator-long\">\n    <choose>\n      <if match=\"any\" variable=\"illustrator\">\n        <text term=\"illustrator\" form=\"short\" text-case=\"capitalize-first\" suffix=\" \"/>\n        <names variable=\"illustrator\">\n          <name and=\"text\" initialize-with=\". \"/>\n        </names>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"volume\">\n    <choose>\n      <if match=\"any\" variable=\"volume\">\n        <text term=\"volume\" form=\"short\" suffix=\" \" text-case=\"capitalize-first\"/>\n        <number variable=\"volume\"/>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"series\">\n    <choose>\n      <if match=\"any\" variable=\"collection-title\">\n        <text variable=\"collection-title\"/>\n        <number variable=\"collection-number\" prefix=\" \"/>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"url-accessed\">\n    <choose>\n      <if variable=\"URL source\" match=\"any\">\n        <date delimiter=\"\" variable=\"accessed\">\n          <date-part name=\"day\"/>\n          <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n          <date-part name=\"year\"/>\n        </date>\n        <text variable=\"URL\" prefix=\". &lt;\" suffix=\"&gt;\"/>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"director\">\n    <text value=\"Dir. \"/>\n    <names variable=\"director\">\n      <name and=\"text\"/>\n    </names>\n  </macro>\n  <macro name=\"recipient\">\n    <names variable=\"recipient\">\n      <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"  initialize=\"false\"/>\n    </names>\n  </macro>\n  <macro name=\"author-short\">\n    <names variable=\"author\">\n      <name form=\"short\" and=\"text\" et-al-min=\"4\" et-al-use-first=\"1\" initialize-with=\"\" name-as-sort-order=\"all\"/>\n        <substitute>\n          <names variable=\"editor\"/>\n          <names variable=\"translator\"/>\n          <text macro=\"title-short\"/>\n        </substitute>\n    </names>\n  </macro>\n  <macro name=\"locator\">\n    <choose>\n      <if match=\"any\" variable=\"locator\">\n        <text variable=\"locator\"/>\n      </if>\n    </choose>\n  </macro>\n  <macro name=\"title-short\">\n    <choose>\n      <if type=\"bill book graphic legal_case legislation manuscript motion_picture report song\" match=\"any\">\n        <text variable=\"title\" text-case=\"title\" form=\"short\" font-style=\"italic\"/>\n      </if>\n      <else>\n        <text variable=\"title\" text-case=\"title\" form=\"short\" quotes=\"true\"/>\n      </else>\n    </choose>\n  </macro>\n  <citation disambiguate-add-givenname=\"true\" >\n    <layout delimiter=\"; \" prefix=\"(\" suffix=\")\">\n      <group delimiter=\" \">\n        <choose>\n          <if variable=\"author editor translator\" match=\"any\">\n            <group delimiter=\", \">\n              <text macro=\"author-short\"/>\n              <choose>\n                <if disambiguate=\"true\">\n                  <text macro=\"title-short\"/>\n                </if>\n              </choose>\n            </group>\n          </if>\n          <else>\n            <text macro=\"title-short\"/>\n          </else>\n        </choose>\n        <choose>\n          <if variable=\"volume\" match=\"all\">\n            <number variable=\"volume\" suffix=\":\"/>\n          </if>\n        </choose>\n        <text macro=\"locator\"/>\n      </group>\n    </layout>\n  </citation>\n  <bibliography hanging-indent=\"true\" subsequent-author-substitute=\"---\" subsequent-author-substitute-rule=\"complete-all\">\n    <sort>\n      <key macro=\"author-sort\"/>\n      <key macro=\"title\"/>\n    </sort>\n    <layout>\n      <choose>\n        <if type=\"article-journal\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <text macro=\"container-title\" suffix=\" \"/>\n          <number variable=\"edition\" form=\"ordinal\" suffix=\" ser. \"/>\n          <text variable=\"volume\" suffix=\".\"/>\n          <text variable=\"issue\" suffix=\" \"/>\n          <text macro=\"publication-year\" prefix=\" (\" suffix=\"): \"/>\n          <text macro=\"page-range\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n        </if>\n        <else-if type=\"article-newspaper\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <text variable=\"genre\" suffix=\". \"/>\n          <text macro=\"container-title\"/>\n          <text variable=\"publisher\" suffix=\",\"/>\n          <text macro=\"publication-year\" prefix=\" \"/>\n          <text macro=\"edition-text\"  prefix=\", \"/>\n          <text macro=\"section-number\" prefix=\", \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" prefix=\". \" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" prefix=\" \" suffix=\".\"/>\n            </if>\n            <else>\n              <text macro=\"page-range\" prefix=\": \" suffix=\". \"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"article-magazine\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <text macro=\"container-title\" suffix=\" \"/>\n          <date variable=\"issued\">\n            <date-part name=\"day\"/>\n            <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n            <date-part name=\"year\" suffix=\": \"/>\n          </date>\n          <text macro=\"page-range\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"review review-book\" match=\"any\">\n          <names variable=\"author\">\n            <name et-al-min=\"4\" et-al-use-first=\"1\" name-as-sort-order=\"first\" and=\"text\" delimiter=\", \" delimiter-precedes-et-al=\"always\" delimiter-precedes-last=\"always\"/>\n          </names>\n          <text macro=\"title\" prefix=\". \" suffix=\".\"/>\n          <text variable=\"reviewed-title\" font-style=\"italic\" prefix=\" Rev. of \" suffix=\", \"/>\n          <text macro=\"edition-number\" suffix=\", \"/>\n          <text macro=\"reviewed-author\" prefix=\"by \" suffix=\". \"/>\n          <names variable=\"director\" prefix=\"dir. \" suffix=\". \"/>\n          <text macro=\"editor\" suffix=\". \"/>\n          <text macro=\"container-title\" suffix=\" \"/>\n          <text variable=\"volume\" suffix=\".\"/>\n          <text variable=\"issue\" suffix=\" \"/>\n          <date variable=\"issued\">\n            <date-part name=\"day\"/>\n            <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n            <date-part name=\"year\" suffix=\": \"/>\n          </date>\n          <text macro=\"page-range\" suffix=\". \"/>\n          <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n          <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"book\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <choose>\n            <if variable=\"original-title\" match=\"none\">\n              <date delimiter=\"\" variable=\"original-date\">\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </if>\n          </choose>\n          <text macro=\"translator-long\" suffix=\". \"/>\n          <text macro=\"illustrator-long\" suffix=\". \"/>\n          <text macro=\"editor\" suffix=\". \"/>\n          <text macro=\"edition-number\" suffix=\". \"/>\n          <choose>\n            <if variable=\"volume\" match=\"none\">\n              <number variable=\"number-of-volumes\" suffix=\" vols. \"/>\n            </if>\n          </choose>\n          <text macro=\"volume\" suffix=\". \"/>\n          <text macro=\"publisher-place\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <choose>\n                <if variable=\"volume\" match=\"any\">\n                  <number variable=\"number-of-volumes\" prefix=\" \" suffix=\" vols.\"/>\n                </if>\n              </choose>\n              <text macro=\"series\" prefix=\" \" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\".\"/>\n              </date>\n            </else>\n          </choose>\n          <choose>\n            <if variable=\"original-title\" match=\"any\">\n              <choose>\n              <if variable=\"translator\" match=\"any\">\n                <text value=\" Trans. of \"/>\n              </if>\n              <else>\n                <text value=\" Rpt. of \"/>\n              </else>\n              </choose>\n              <text variable=\"original-title\" font-style=\"italic\" suffix=\". \"/>\n              <text variable=\"original-publisher-place\" suffix=\": \"/>\n              <text variable=\"original-publisher\" suffix=\", \"/>\n              <date variable=\"original-date\">\n                <date-part name=\"year\" suffix=\".\"/>\n              </date>\n            </if>\n          </choose>\n          <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"chapter\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <text macro=\"translator-long\" suffix=\". \"/>\n          <text macro=\"container-title\" suffix=\". \"/>\n          <text macro=\"editor\" text-case=\"capitalize-first\" suffix=\". \"/>\n          <text macro=\"publisher-place\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <text macro=\"page-range\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"entry-dictionary entry-encyclopedia\" match=\"any\">\n          <text macro=\"entry-author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <text macro=\"container-title\" suffix=\". \"/>\n          <text macro=\"editor\" suffix=\". \"/>\n          <text macro=\"edition-number\" suffix=\". \"/>\n          <number variable=\"number-of-volumes\" suffix=\" Vols. \"/>\n          <text macro=\"volume\" suffix=\". \"/>\n          <text macro=\"publisher-place\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"pamphlet\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <text macro=\"publisher-place\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"report\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <date delimiter=\"\" variable=\"original-date\">\n            <date-part name=\"year\" suffix=\". \"/>\n          </date>\n          <text macro=\"edition-number\" suffix=\". \"/>\n          <text macro=\"edition-text\" suffix=\". \"/>\n          <number variable=\"number-of-volumes\" suffix=\" vols. \"/>\n          <text macro=\"publisher-place\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\" \"  suffix=\".\"/>\n        </else-if>\n        <else-if type=\"paper-conference\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <choose>\n            <if variable=\"container-title\" match=\"none\">\n              <text variable=\"title\" font-style=\"italic\" text-case=\"title\" suffix=\". \"/>\n            </if>\n            <else>\n              <text variable=\"title\" quotes=\"true\" font-style=\"normal\" suffix=\". \"/>\n              <text variable=\"container-title\" font-style=\"italic\" suffix=\". \"/>\n            </else>\n          </choose>\n          <text macro=\"editor\" suffix=\". \"/>\n          <date variable=\"event-date\">\n            <date-part name=\"day\" suffix=\" \"/>\n            <date-part name=\"month\" form=\"short\" suffix=\" \"/>\n            <date-part name=\"year\" suffix=\", \"/>\n          </date>\n          <text variable=\"event-place\" suffix=\". \"/>\n          <text macro=\"publisher-place\"/>\n          <text macro=\"publication-year\" prefix=\", \" suffix=\". \"/>\n          <text macro=\"page-range\" suffix=\". \"/>\n          <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n          <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"thesis\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <choose>\n            <if variable=\"publisher\" match=\"none\">\n              <text variable=\"title\" font-style=\"normal\" quotes=\"true\" suffix=\". \"/>\n            </if>\n            <else>\n              <text macro=\"title\" suffix=\". \"/>\n            </else>\n          </choose>\n          <text variable=\"genre\" suffix=\". \"/>\n          <text variable=\"original-publisher\" suffix=\", \"/>\n          <date variable=\"original-date\">\n            <date-part name=\"year\" suffix=\". \"/>\n          </date>\n          <text macro=\"publisher-place\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"webpage\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <choose>\n            <if variable=\"container-title\" match=\"any\">\n              <text variable=\"title\" font-style=\"normal\" quotes=\"true\" suffix=\". \"/>\n              <text variable=\"container-title\" font-style=\"italic\" suffix=\". \"/>\n            </if>\n            <else>\n              <text variable=\"title\" font-style=\"italic\" suffix=\". \"/>\n            </else>\n          </choose>\n          <text macro=\"publisher-place\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n        </else-if>\n        <else-if type=\"graphic\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"publisher\"/>\n              <text variable=\"publisher-place\" prefix=\", \" suffix=\". \"/>\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <text variable=\"publisher\" prefix=\" \"/>\n              <text variable=\"publisher-place\" prefix=\", \" suffix=\". \"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n        </else-if>\n        <else-if type=\"broadcast\" match=\"any\">\n          <text macro=\"original-author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <text variable=\"volume\" font-style=\"italic\" suffix=\". \"/>\n          <text variable=\"note\" suffix=\". \"/>\n          <text macro=\"director\" suffix=\". \"/>\n          <choose>\n            <if variable=\"call-number\" match=\"any\">\n              <text variable=\"publisher\" suffix=\". \"/>\n              <text variable=\"call-number\" suffix=\", \"/>\n              <text variable=\"publisher-place\" suffix=\", \"/>\n              <date delimiter=\"\" variable=\"issued\">\n                <date-part name=\"day\"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </if>\n            <else>\n              <text variable=\"publisher\" suffix=\". \"/>\n              <date delimiter=\"\" variable=\"issued\">\n                <date-part name=\"day\"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"song\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <choose>\n            <if variable=\"container-title\" match=\"any\">\n              <text variable=\"title\" quotes=\"true\" font-style=\"normal\" suffix=\". \"/>\n              <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n              <date variable=\"original-date\">\n                <date-part name=\"day\" prefix=\" Rec. \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n              <text macro=\"container-title\" suffix=\". \"/>\n            </if>\n            <else>\n              <text macro=\"title\" suffix=\". \"/>\n              <text variable=\"note\" prefix=\" \" suffix=\".\"/>\n              <date variable=\"original-date\">\n                <date-part name=\"day\" prefix=\" Rec. \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"publisher\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n        </else-if>\n        <else-if type=\"motion_picture\" match=\"any\">\n          <text macro=\"title\" suffix=\". \"/>\n          <text macro=\"original-author\" prefix=\"By \" suffix=\". \"/>\n          <text macro=\"director\" suffix=\". \"/>\n          <text variable=\"note\" suffix=\". \"/>\n          <date delimiter=\"\" variable=\"original-date\">\n            <date-part name=\"year\" suffix=\". \"/>\n          </date>\n          <text variable=\"publisher\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n        </else-if>\n        <!--No format in latest MLA edition for web videos e.g. YouTube, video layout is based on PURDUE OWL syntax issued 2015-07-06 10:49:28-->\n        <else-if type=\"video\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text variable=\"title\" quotes=\"true\" text-case=\"title\" suffix=\". \"/>\n          <text variable=\"genre\" suffix=\". \"/>\n          <text variable=\"container-title\" font-style=\"italic\" suffix=\". \"/>\n          <text variable=\"publisher\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source \" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n        </else-if>\n        <!--No format instructions for web blogs in MLA Handbook, weblog layout is based on PURDUE OWL (Tweet) syntax issued ssued 2015-07-06-->\n        <else-if type=\"post-weblog\" match=\"any\">\n          <text macro=\"author\" suffix=\" \"/>\n          <names variable=\"container-author\" prefix=\"(\" suffix=\"). \"/>\n          <text variable=\"title\" quotes=\"true\" suffix=\". \"/>\n          <text macro=\"publication-year\" suffix=\", \"/>\n          <text variable=\"medium\" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"musical_score\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <date variable=\"original-date\">\n            <date-part name=\"year\" suffix=\". \"/>\n          </date>\n          <text macro=\"publisher-place\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text variable=\"collection-title\" prefix=\" \" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <text variable=\"collection-title\" prefix=\" \" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n        </else-if>\n        <else-if type=\"interview\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <choose>\n            <if variable=\"medium\" match=\"none\">\n              <text value=\"Personal Interview\" suffix=\". \"/>\n              <text macro=\"publication-year\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"genre\" suffix=\" \"/>\n              <names variable=\"interviewer\" prefix=\"by \" suffix=\". \"/>\n              <text macro=\"title\" suffix=\". \"/>\n              <text variable=\"container-title\" font-style=\"italic\" suffix=\". \"/>\n              <text macro=\"director\" suffix=\". \"/>\n              <text macro=\"publisher-place\" suffix=\", \"/>\n              <text macro=\"publication-year\" suffix=\". \"/>\n              <text macro=\"page-range\" suffix=\". \"/>\n              <choose>\n                <if variable=\"URL source\" match=\"any\">\n                  <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n                  <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n                  <text macro=\"url-accessed\" suffix=\".\"/>\n                </if>\n                <else>\n                  <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n                  <date delimiter=\"\" variable=\"accessed\">\n                    <date-part name=\"day\" prefix=\" \"/>\n                    <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                    <date-part name=\"year\" suffix=\". \"/>\n                  </date>\n                </else>\n              </choose>\n              <text variable=\"note\" prefix=\". \" suffix=\".\"/>\n            </else>\n          </choose>\n        </else-if>\n        <else-if type=\"map\" match=\"any\">\n          <choose>\n            <if variable=\"source\" match=\"any\">\n              <text variable=\"title\" font-style=\"normal\" quotes=\"true\" suffix=\". \"/>\n            </if>\n            <else>\n              <text macro=\"title\" suffix=\". \"/>\n            </else>\n          </choose>\n          <text variable=\"genre\" suffix=\". \" text-case=\"capitalize-first\"/>\n          <text variable=\"source\" font-style=\"italic\" suffix=\". \"/>\n          <names variable=\"author\" prefix=\"By \" suffix=\". \"/>\n          <text macro=\"publisher-place\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\". \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"speech\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <text variable=\"event\" suffix=\". \"/>\n          <text variable=\"event-place\" suffix=\". \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n          <text variable=\"note\" prefix=\". \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"manuscript\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <text variable=\"genre\" suffix=\". \"/>\n          <text variable=\"archive\" suffix=\", \"/>\n          <text variable=\"archive-place\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n          </choose>\n          <text variable=\"note\" prefix=\". \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"personal_communication\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text macro=\"title\" suffix=\". \"/>\n          <names variable=\"recipient\" prefix=\"Message to \" suffix=\". \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n          <text variable=\"note\" prefix=\". \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"legal_case\" match=\"any\">\n          <text variable=\"title\" suffix=\". \"/>\n          <number variable=\"volume\" suffix=\" \"/>\n          <text variable=\"jurisdiction\" suffix=\" \"/>\n          <text macro=\"page-range\" suffix=\". \"/>\n          <names variable=\"author\" suffix=\". \"/>\n          <date variable=\"original-date\">\n            <date-part name=\"year\" suffix=\". \"/>\n          </date>\n          <text macro=\"container-title\" suffix=\". \"/>\n          <text macro=\"publisher-place\" suffix=\", \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\". \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"legislation\" match=\"any\">\n          <text variable=\"title\" text-case=\"title\" suffix=\". \"/>\n          <text variable=\"references\" suffix=\". \"/>\n          <text macro=\"page-range\" suffix=\". \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <choose>\n            <if variable=\"URL source\" match=\"any\">\n              <text variable=\"source\" suffix=\". \" text-case=\"title\" font-style=\"italic\"/>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\". \"/>\n              <text macro=\"url-accessed\" suffix=\".\"/>\n            </if>\n            <else>\n              <text variable=\"medium\" text-case=\"capitalize-first\" suffix=\".\"/>\n              <date delimiter=\"\" variable=\"accessed\">\n                <date-part name=\"day\" prefix=\" \"/>\n                <date-part name=\"month\" form=\"short\" prefix=\" \" suffix=\" \"/>\n                <date-part name=\"year\" suffix=\". \"/>\n              </date>\n            </else>\n          </choose>\n          <text variable=\"note\" prefix=\". \" suffix=\".\"/>\n        </else-if>\n        <else-if type=\"classic\" match=\"any\">\n          <text macro=\"author\" suffix=\". \"/>\n          <text variable=\"title\" font-style=\"italic\" suffix=\". \"/>\n          <number variable=\"number-of-volumes\" suffix=\" vols. \"/>\n          <text variable=\"publisher-place\" suffix=\", \"/>\n          <text macro=\"publication-year\" suffix=\". \"/>\n          <text variable=\"medium\" suffix=\".\"/>\n        </else-if>\n      </choose>\n    </layout>\n  </bibliography>\n</style>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/sample.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd\">\n  <metadata>\n    <id>Sample</id>\n    <title>Sample</title>\n    <version>0.101.0</version>\n    <authors>Hugh Bot</authors>\n    <owners>Hugh Bot</owners>\n    <summary>A package of nuget</summary>\n    <description>\n      It just works\n    </description>\n    <projectUrl>http://hubot.github.com</projectUrl>\n    <copyright/>\n    <licenseUrl>https://github.com/github/hubot/LICENSEmd</licenseUrl>\n    <requireLicenseAcceptance>false</requireLicenseAcceptance>\n  </metadata>\n  <files>\n    <file src=\"tools\\**\" target=\"tools\"/>\n  </files>\n</package>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/sample.targets",
    "content": "﻿<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n    <PropertyGroup>\n        <Name>MyCommon</Name>\n    </PropertyGroup>\n\n    <Target Name=\"Go\">\n        <Message Text=\"Name=$(Name)\"/>\n    </Target>\n</Project>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/some-ideas.mm",
    "content": "<map version=\"0.9.0\">\n<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->\n<node COLOR=\"#000000\" CREATED=\"1385819664217\" ID=\"ID_1105859543\" MODIFIED=\"1385820134114\" TEXT=\"Some ideas on demexp\">\n<font NAME=\"SansSerif\" SIZE=\"20\"/>\n<hook NAME=\"accessories/plugins/AutomaticLayout.properties\"/>\n<node COLOR=\"#0033ff\" CREATED=\"1385819753503\" ID=\"ID_1407588370\" MODIFIED=\"1385819767173\" POSITION=\"right\" TEXT=\"User Interface\">\n<edge STYLE=\"sharp_bezier\" WIDTH=\"8\"/>\n<font NAME=\"SansSerif\" SIZE=\"18\"/>\n<node COLOR=\"#00b439\" CREATED=\"1385819771320\" ID=\"ID_1257512743\" MODIFIED=\"1385819783131\" TEXT=\"Text file\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n</node>\n<node COLOR=\"#00b439\" CREATED=\"1385819783831\" ID=\"ID_997633499\" MODIFIED=\"1385819786761\" TEXT=\"Web\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n</node>\n<node COLOR=\"#00b439\" CREATED=\"1385819787041\" ID=\"ID_204106158\" MODIFIED=\"1385819794885\" TEXT=\"Graphical interface\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n</node>\n<node COLOR=\"#00b439\" CREATED=\"1385819795339\" ID=\"ID_768498137\" MODIFIED=\"1385819800338\" TEXT=\"Email\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n</node>\n<node COLOR=\"#00b439\" CREATED=\"1385819801043\" ID=\"ID_1660630451\" MODIFIED=\"1385819802441\" TEXT=\"SMS\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n</node>\n</node>\n<node COLOR=\"#0033ff\" CREATED=\"1385819872899\" ID=\"ID_281388957\" MODIFIED=\"1385819878444\" POSITION=\"left\" TEXT=\"Cordorcet voting module\">\n<edge STYLE=\"sharp_bezier\" WIDTH=\"8\"/>\n<font NAME=\"SansSerif\" SIZE=\"18\"/>\n<node COLOR=\"#00b439\" CREATED=\"1385819880540\" ID=\"ID_1389666909\" MODIFIED=\"1385819948101\" TEXT=\"Input\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n<node COLOR=\"#990000\" CREATED=\"1385819893834\" ID=\"ID_631111389\" MODIFIED=\"1385819901697\" TEXT=\"Number of votes\">\n<font NAME=\"SansSerif\" SIZE=\"14\"/>\n</node>\n<node COLOR=\"#990000\" CREATED=\"1385819902442\" ID=\"ID_838201093\" MODIFIED=\"1385819910452\" TEXT=\"Number of possible choices\">\n<font NAME=\"SansSerif\" SIZE=\"14\"/>\n</node>\n<node COLOR=\"#990000\" CREATED=\"1385819910703\" ID=\"ID_1662888975\" MODIFIED=\"1385819933316\" TEXT=\"For a vote: number of votes and list of choices\">\n<font NAME=\"SansSerif\" SIZE=\"14\"/>\n</node>\n</node>\n<node COLOR=\"#00b439\" CREATED=\"1385819949027\" ID=\"ID_1504837261\" MODIFIED=\"1385819952198\" TEXT=\"Format\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n<node COLOR=\"#990000\" CREATED=\"1385819955105\" ID=\"ID_647722151\" MODIFIED=\"1385819962151\" TEXT=\"A single file?\">\n<font NAME=\"SansSerif\" SIZE=\"14\"/>\n</node>\n<node COLOR=\"#990000\" CREATED=\"1385819962642\" ID=\"ID_1374756253\" MODIFIED=\"1385819976939\" TEXT=\"Several files (parameters + 1 per vote)?\">\n<font NAME=\"SansSerif\" SIZE=\"14\"/>\n</node>\n<node COLOR=\"#990000\" CREATED=\"1385819977578\" ID=\"ID_979556559\" MODIFIED=\"1385819984309\" TEXT=\"JSON?\">\n<font NAME=\"SansSerif\" SIZE=\"14\"/>\n</node>\n</node>\n</node>\n<node COLOR=\"#0033ff\" CREATED=\"1385820005408\" ID=\"ID_1886566753\" MODIFIED=\"1385820009909\" POSITION=\"right\" TEXT=\"Technologies\">\n<edge STYLE=\"sharp_bezier\" WIDTH=\"8\"/>\n<font NAME=\"SansSerif\" SIZE=\"18\"/>\n<node COLOR=\"#00b439\" CREATED=\"1385820011913\" ID=\"ID_1291489552\" MODIFIED=\"1385820014698\" TEXT=\"SPARK 2014\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n</node>\n<node COLOR=\"#00b439\" CREATED=\"1385820015481\" ID=\"ID_1825929484\" MODIFIED=\"1385820017935\" TEXT=\"Frama-C\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n</node>\n<node COLOR=\"#00b439\" CREATED=\"1385820018603\" ID=\"ID_253774957\" MODIFIED=\"1385820027363\" TEXT=\"Why3 -&gt; OCaml\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n</node>\n</node>\n<node COLOR=\"#0033ff\" CREATED=\"1385820136808\" ID=\"ID_1002115371\" MODIFIED=\"1385820139813\" POSITION=\"left\" TEXT=\"Vote storage\">\n<edge STYLE=\"sharp_bezier\" WIDTH=\"8\"/>\n<font NAME=\"SansSerif\" SIZE=\"18\"/>\n<node COLOR=\"#00b439\" CREATED=\"1385820141400\" ID=\"ID_1882609124\" MODIFIED=\"1385820145261\" TEXT=\"Database\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n</node>\n<node COLOR=\"#00b439\" CREATED=\"1385820146138\" ID=\"ID_1771403777\" MODIFIED=\"1385820154334\" TEXT=\"Text file (XML?)\">\n<edge STYLE=\"bezier\" WIDTH=\"thin\"/>\n<font NAME=\"SansSerif\" SIZE=\"16\"/>\n</node>\n</node>\n</node>\n</map>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/source.extension.vsixmanifest",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PackageManifest Version=\"2.0.0\" xmlns=\"http://schemas.microsoft.com/developer/vsx-schema/2011\" xmlns:d=\"http://schemas.microsoft.com/developer/vsx-schema-design/2011\">\n  <Metadata>\n    <Identity Id=\"$guid1$\" Version=\"1.0\" Language=\"en-US\" Publisher=\"$registeredorganization$\" />\n    <DisplayName>$packageName$</DisplayName>\n    <Description>$packageName$ Visual Studio Package</Description>\n  </Metadata>\n  <Installation>\n    <InstallationTarget Version=\"[14.0,15.0)\" Id=\"Microsoft.VisualStudio.Community\" />\n  </Installation>\n  <Dependencies>\n    <Dependency Id=\"Microsoft.Framework.NDP\" DisplayName=\"Microsoft .NET Framework\" d:Source=\"Manual\" Version=\"[4.5,)\" />\n    <Dependency Id=\"Microsoft.VisualStudio.MPF.14.0\" DisplayName=\"Visual Studio MPF 14.0\" d:Source=\"Installed\" Version=\"[14.0]\" />\n  </Dependencies>\n  <Assets>\n    <Asset Type=\"Microsoft.VisualStudio.VsPackage\" d:Source=\"Project\" d:ProjectName=\"%CurrentProject%\" Path=\"|%CurrentProject%;PkgdefProjectOutputGroup|\" />\n  </Assets>\n</PackageManifest>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/src.builds",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\\dir.props\" />\n  <ItemGroup>\n    <Project Include=\"*\\src\\*.builds\" />\n  </ItemGroup>\n  <Import Project=\"$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.traversal.targets))\\dir.traversal.targets\" />\n</Project>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/tei-odd-sample.odd",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<?xml-model href=\"tei-pm.nvdl\"\n  type=\"application/xml\"\n  schematypens=\"http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0\"?>\n<TEI xmlns=\"http://www.tei-c.org/ns/1.0\" xmlns:skos=\"http://www.w3.org/2004/02/skos/core#\" xml:lang=\"en\">\n    <teiHeader>\n        <fileDesc>\n            <titleStmt>\n                <title>TEI Simple</title>\n            </titleStmt>\n            <publicationStmt>\n                <publisher>TEI Consortium</publisher>\n                <availability>\n                    <licence target=\"http://creativecommons.org/licenses/by-sa/3.0/\"> Distributed under a\n                  Creative Commons Attribution-ShareAlike 3.0 Unported License </licence>\n                    <licence target=\"http://www.opensource.org/licenses/BSD-2-Clause\">\n                        <p>Copyright 2014 TEI Consortium.</p>\n                        <p>All rights reserved.</p>\n                        <p>Redistribution and use in source and binary forms, with or without\n                     modification, are permitted provided that the following conditions are met:</p>\n                        <list>\n                            <item>Redistributions of source code must retain the above copyright notice,\n                        this list of conditions and the following disclaimer.</item>\n                            <item>Redistributions in binary form must reproduce the above copyright notice,\n                        this list of conditions and the following disclaimer in the documentation\n                        and/or other materials provided with the distribution.</item>\n                        </list>\n                        <p>This software is provided by the copyright holders and contributors \"as is\" and\n                     any express or implied warranties, including, but not limited to, the implied\n                     warranties of merchantability and fitness for a particular purpose are\n                     disclaimed. In no event shall the copyright holder or contributors be liable\n                     for any direct, indirect, incidental, special, exemplary, or consequential\n                     damages (including, but not limited to, procurement of substitute goods or\n                     services; loss of use, data, or profits; or business interruption) however\n                     caused and on any theory of liability, whether in contract, strict liability,\n                     or tort (including negligence or otherwise) arising in any way out of the use\n                     of this software, even if advised of the possibility of such damage.</p>\n                    </licence>\n                    <p>TEI material can be licensed differently depending on the use you intend to make\n                  of it. Hence it is made available under both the CC+BY and BSD-2 licences. The\n                  CC+BY licence is generally appropriate for usages which treat TEI content as data\n                  or documentation. The BSD-2 licence is generally appropriate for usage of TEI\n                  content in a software environment. For further information or clarification,\n                  please contact the <ref target=\"mailto:info@tei-c.org\">TEI Consortium</ref>. </p>\n                </availability>\n            </publicationStmt>\n            <sourceDesc>\n                <p>created ab initio during a meeting in Oxford</p>\n            </sourceDesc>\n        </fileDesc>\n    </teiHeader>\n    <text>\n        <front>\n            <titlePage>\n                <docTitle>\n                    <titlePart type=\"main\">TEI Simple</titlePart>\n                </docTitle>\n                <docAuthor>Sebastian Rahtz</docAuthor>\n                <docAuthor>Brian Pytlik Zillig</docAuthor>\n                <docAuthor>Martin Mueller</docAuthor>\n                <docDate>Version 0.1: 30th November 2014</docDate>\n            </titlePage>\n        </front>\n        <body>\n            <div>\n                <head>Summary</head>\n                <p>The <hi>TEI Simple</hi> project aims to define a <hi rend=\"italic\">highly-constrained</hi> and <hi rend=\"italic\">prescriptive</hi> subset of the Text Encoding Initiative (TEI) Guidelines\n          suited to the representation of early modern and modern books, a formally-defined set of\n          processing rules which permit modern web applications to easily present and analyze the\n          encoded texts, mapping to other ontologies, and processes to describe the encoding status\n          and richness of a TEI digital text. This document describes\n\tthe constrained subset</p>\n            </div>\n            <div>\n                <head>\n                    <anchor xml:id=\"SECTION_1002\"/>Background</head>\n                <p>The Text Encoding Initiative (TEI) has developed over 20 years into a key technology in\n          text-centric humanities disciplines, with an extremely wide range of applications, from\n          diplomatic editions to dictionaries, from prosopography to speech transcription and\n          linguistic analysis. It has been able to achieve its range of use by adopting a <hi rend=\"italic\">descriptive</hi> rather than <hi rend=\"italic\">prescriptive </hi> approach\n          , by recommending <hi rend=\"italic\">customization</hi> to suit particular projects, and by\n          eschewing any attempt to dictate how the digital texts should be rendered or exchanged.\n          However, this flexibility has come at the cost of relatively limited success in\n          interoperability. In our view there is a distinct set of uses (primarily in the area of\n          digitized ‘European’-style books) that would benefit from a <hi rend=\"italic\">prescriptive</hi> recipe for digital text; this will sit alongside other\n          domain-specific, constrained TEI customizations, such as the very successful <hi rend=\"italic\">Epidoc</hi> in the epigraphic community. TEI-Simple may become a prototype\n          for a new family of constrained customizations. For instance, a TEI Simple MS for\n          manuscript based work could be built on top of the ENRICH project, drawing on many of the\n          lessons and some of the code for TEI Simple. </p>\n                <p>The TEI has long maintained an introductory subset (TEI Lite), and a constrained\n          customization for use in outsourcing production to commercial vendors (TEI Tite), but both\n          of these permit enormous variation, and have nothing to say about processing. The present\n          project can be viewed in some ways as a revision of TEI Lite, re-examining the basis of\n          the choices therein, focusing it for a more specific area, and adding a \"cradle to grave\"\n          processing model that associates the TEI Simple schema with explicit and standardized\n          options for displaying and querying texts. This means being able to specify what a\n          programmer should do with particular TEI elements when they are encountered, allowing\n          programmers to build stylesheets that work for everybody and to query a corpus of\n          documents reliably.</p>\n                <p>This project, TEI Simple, focuses on interoperability, machine generation, and\n          low-cost integration. The TEI architecture facilitates customizations of many kinds; TEI\n          Simple aims to produce a complete 'out of the box' customization which meets the needs of\n          the many users for whom the task of creating a customization is daunting or seems\n          irrelevant. TEI Simple in no way intends to constrain the expressive liberty of encoders\n          who do not think that it is either possible or desirable to follow this path. It does,\n          however, promise to make life easier for those who think there is some virtue in\n          travelling that path as far as it will take you, which for quite a few projects will be\n          far enough. Some users will never feel the need to move beyond it, others will outgrow it,\n          and when they do they will have learned enough to do so.</p>\n                <p>A major driver for this project is the texts created by phase 1 of the EEBO-TCP project,\n          which were placed in the public domain on 1 January 2015. Another 45,000 texts will\n          join over the following five years, creating by 2020 an archive of 70,000 consistently\n          encoded books published in England from 1475 to 1700, including works of literature,\n          philosophy, politics, religion, geography, science and all other areas of human endeavor.\n          When we compare the query potential of the EEBO TCP texts in their current and quite\n          simple encoding with flat file versions of those text, it is clear that the difference in\n          query potential is very high, especially if you add to that coarse encoding simple forms\n          of linguistic annotation or named entity tagging that can be added in a largely\n          algorithmic fashion. During 2012 and 2013 extensive work has been undertaken at\n          Northwestern, Michigan and Oxford to enrich these texts and bring them into line with the\n          current TEI Guidelines (where necessary working with the TEI to modify the Guidelines).\n          TEI Simple uses this corpus as a point of departure and will provide its users with a\n          friendlier environment for manipulating EEBO texts in various projects. But TEI Simple\n          should not be understood as an EEBO specific project. We believe that, given the\n          extraordinary degree of internal diversity in the EEBO source files, a project that starts\n          from them can, with appropriate modifications, accommodate a wide range of printed texts\n          differing in language, genre, or time and place of origin. </p>\n            </div>\n            <div>\n                <head>The TEI Simple schema</head>\n                <schemaSpec ident=\"teisimple\" start=\"TEI teiCorpus\">\n                    <specGrpRef target=\"#base\"/>\n                    <specGrpRef target=\"#header\"/>\n                    <specGrpRef target=\"#transcr\"/>\n                    <specGrpRef target=\"#attclasses\"/>\n                    <specGrpRef target=\"#modelclasses\"/>\n                    <specGrpRef target=\"#simpleelements\"/>\n                    <specGrpRef target=\"#simpleelementspm\"/>\n                    <specGrpRef target=\"#simplechanges\"/>\n                    <specGrpRef target=\"#rendition\"/>\n                </schemaSpec>\n                <include xmlns=\"http://www.w3.org/2001/XInclude\" href=\"elementsummary.xml\"/>\n                <div>\n                    <head>The TEI infrastructure</head>\n                    <specGrp xml:id=\"base\">\n                        <moduleRef key=\"tei\"/>\n                    </specGrp>\n                </div>\n                <div>\n                    <head>The header</head>\n                    <p>The default set of elements for the header are loaded using the\n                     <term>header</term> module. In addition, elements from other modules are\n                  loaded, if they are tagged in the classification as being needed for the header\n                  only.</p>\n                    <specGrp xml:id=\"header\">\n                        <moduleRef key=\"header\"/>\n                        <elementRef key=\"att\"/>\n                        <elementRef key=\"biblStruct\"/>\n                        <elementRef key=\"biblScope\"/>\n                        <elementRef key=\"charDecl\"/>\n                        <elementRef key=\"charProp\"/>\n                        <elementRef key=\"editor\"/>\n                        <elementRef key=\"email\"/>\n                        <elementRef key=\"gi\"/>\n                        <elementRef key=\"glyph\"/>\n                        <elementRef key=\"glyphName\"/>\n                        <elementRef key=\"imprint\"/>\n                        <elementRef key=\"localName\"/>\n                        <elementRef key=\"listPerson\"/>\n                        <elementRef key=\"monogr\"/>\n                        <elementRef key=\"msDesc\"/>\n                        <elementRef key=\"msIdentifier\"/>\n                        <elementRef key=\"physDesc\"/>\n                        <elementRef key=\"relatedItem\"/>\n                        <elementRef key=\"repository\"/>\n                        <elementRef key=\"resp\"/>\n                        <elementRef key=\"respStmt\"/>\n                        <elementRef key=\"teiHeader\"/>\n                        <elementRef key=\"term\"/>\n                        <elementRef key=\"textDesc\"/>\n                        <elementRef key=\"typeDesc\"/>\n                        <elementRef key=\"value\"/>\n                        <p>Elements which are only intended to be used in the header are banned from the\n                        <gi>text</gi>, using a Schematron rule.</p>\n                        <elementSpec ident=\"text\" mode=\"change\">\n                            <include xmlns=\"http://www.w3.org/2001/XInclude\" href=\"headeronly.xml\"/>\n                        </elementSpec>\n                    </specGrp>\n                </div>\n                <div>\n                    <head>Transcription</head>\n                    <p>In order to support the <gi>sourcedoc</gi> and <gi>facsimile</gi> elements, the\n                  basic transcriptional elements are loaded, and two attribute classes.</p>\n                    <specGrp xml:id=\"transcr\">\n                        <elementRef key=\"damage\"/>\n                        <elementRef key=\"damageSpan\"/>\n                        <elementRef key=\"facsimile\"/>\n                        <elementRef key=\"line\"/>\n                        <elementRef key=\"listTranspose\"/>\n                        <elementRef key=\"metamark\"/>\n                        <elementRef key=\"mod\"/>\n                        <elementRef key=\"redo\"/>\n                        <elementRef key=\"restore\"/>\n                        <elementRef key=\"retrace\"/>\n                        <elementRef key=\"sourceDoc\"/>\n                        <elementRef key=\"surface\"/>\n                        <elementRef key=\"surfaceGrp\"/>\n                        <elementRef key=\"surplus\"/>\n                        <elementRef key=\"transpose\"/>\n                        <elementRef key=\"undo\"/>\n                        <elementRef key=\"zone\"/>\n                        <classRef key=\"att.coordinated\"/>\n                        <classRef key=\"att.global.change\"/>\n                    </specGrp>\n                </div>\n                <div>\n                    <head>Attribute classes</head>\n                    <specGrp xml:id=\"attclasses\">\n                        <p>The <term>tei</term> module brings with it a default set of attribute classes.\n                     We need some more specialist ones from other modules, and to delete some\n                     default ones which we don't plan to use.</p>\n                        <classRef key=\"att.global.analytic\"/>\n                        <classRef key=\"att.global.facs\"/>\n                        <classRef key=\"att.milestoneUnit\"/>\n                        <classRef key=\"att.global.linking\"/>\n                        <classSpec type=\"atts\" ident=\"att.datcat\" mode=\"delete\"/>\n                        <classSpec type=\"atts\" ident=\"att.declarable\" mode=\"delete\"/>\n                        <classSpec type=\"atts\" ident=\"att.divLike\" mode=\"delete\"/>\n                        <p>Some uncommon attributes are removed from global linking.</p>\n                        <classSpec type=\"atts\" ident=\"att.global.linking\" mode=\"change\">\n                            <attList>\n                                <attDef ident=\"synch\" mode=\"delete\"/>\n                                <attDef ident=\"copyOf\" mode=\"delete\"/>\n                                <attDef ident=\"exclude\" mode=\"delete\"/>\n                                <attDef ident=\"select\" mode=\"delete\"/>\n                            </attList>\n                        </classSpec>\n                        <p>URLs have a constraint that a local pointer must have a corresponding ID.</p>\n                        <classSpec type=\"atts\" ident=\"att.pointing\" mode=\"change\">\n                            <attList>\n                                <attDef ident=\"target\" mode=\"change\">\n                                    <constraintSpec ident=\"validtarget\" scheme=\"isoschematron\">\n                                        <constraint>\n                                            <rule xmlns=\"http://purl.oclc.org/dsdl/schematron\" context=\"tei:*[@target]\">\n                                                <let name=\"results\" value=\"for $t in        tokenize(normalize-space(@target),'\\s+') return starts-with($t,'#') and not(id(substring($t,2)))\"/>\n                                                <report test=\"some $x in $results  satisfies $x\"> Error: Every\n                                       local pointer in \"<value-of select=\"@target\"/>\" must point to\n                                       an ID in this document (<value-of select=\"$results\"/>)</report>\n                                            </rule>\n                                        </constraint>\n                                    </constraintSpec>\n                                </attDef>\n                            </attList>\n                        </classSpec>\n                        <p>Constrained value lists are added to attribute classes where possible.</p>\n                        <classSpec type=\"atts\" mode=\"change\" ident=\"att.placement\">\n                            <attList>\n                                <attDef ident=\"place\" mode=\"change\">\n                                    <valList type=\"closed\" mode=\"replace\">\n                                        <valItem ident=\"above\">\n                      <?exactMatch supralinear?>\n                                            <desc>above the line</desc>\n                                        </valItem>\n                                        <valItem ident=\"below\">\n                                            <desc>below the line</desc>\n                                        </valItem>\n                                        <valItem ident=\"top\">\n                      <?exactMatch pageTop?>\n                                            <desc>at the top of the page</desc>\n                                        </valItem>\n                                        <valItem ident=\"top-right\">\n                                            <desc>at the top right of the page</desc>\n                                        </valItem>\n                                        <valItem ident=\"top-left\">\n                                            <desc>at the top left of the page</desc>\n                                        </valItem>\n                                        <valItem ident=\"top-center\">\n                                            <desc>at the top center of the page</desc>\n                                        </valItem>\n                                        <valItem ident=\"bottom-right\">\n                      <?exactMatch bot-right?>\n                                            <desc>at the bottom right of the page</desc>\n                                        </valItem>\n                                        <valItem ident=\"bottom-left\">\n                      <?exactMatch bot-left?>\n                                            <desc>at the bottom left of the page</desc>\n                                        </valItem>\n                                        <valItem ident=\"bottom-center\">\n                      <?exactMatch bot-center?>\n                                            <desc>at the bottom center of the page</desc>\n                                        </valItem>\n                                        <valItem ident=\"bottom\">\n                      <?exactMatch foot?>\n                                            <desc>at the foot of the page</desc>\n                                        </valItem>\n                                        <valItem ident=\"tablebottom\">\n                                            <desc>underneath a table</desc>\n                      <?exactMatch tablefoot?>\n                                        </valItem>\n                                        <valItem ident=\"margin\">\n                      <?exactMatch margin-outer?>\n                      <?exactMatch marg1?>\n                      <?exactMatch marg2?>\n                      <?exactMatch marg4?>\n                                            <desc>in the outer margin</desc>\n                                        </valItem>\n                                        <valItem ident=\"margin-left\">\n                      <?exactMatch left?>\n                                            <desc>in the left margin</desc>\n                                        </valItem>\n                                        <valItem ident=\"margin-right\">\n                      <?exactMatch right?>\n                                            <desc>in the right margin</desc>\n                                        </valItem>\n                                        <valItem ident=\"opposite\">\n                                            <desc>on the opposite, i.e. facing, page.</desc>\n                                        </valItem>\n                                        <valItem ident=\"overleaf\">\n                                            <desc>on the other side of the leaf.</desc>\n                                        </valItem>\n                                        <valItem ident=\"end\">\n                                            <desc>at the end of the volume.</desc>\n                                        </valItem>\n                                        <valItem ident=\"divend\">\n                                            <desc>at the end the current division.</desc>\n                                        </valItem>\n                                        <valItem ident=\"parend\">\n                                            <desc>at the end the current paragraph.</desc>\n                                        </valItem>\n                                        <valItem ident=\"inline\">\n                      <?exactMatch in?>\n                                            <desc>within the body of the text.</desc>\n                                        </valItem>\n                                        <valItem ident=\"inspace\">\n                                            <desc>in a predefined space, for example left by an earlier\n                                    scribe.</desc>\n                                        </valItem>\n                                        <valItem ident=\"display\">\n                                            <desc>formatted like a quotation</desc>\n                                        </valItem>\n                                    </valList>\n                                </attDef>\n                            </attList>\n                        </classSpec>\n                        <classSpec type=\"atts\" ident=\"att.dimensions\" mode=\"change\">\n                            <attList>\n                                <attDef ident=\"unit\" mode=\"change\">\n                                    <valList mode=\"add\" type=\"closed\">\n                                        <valItem ident=\"chars\">\n                                            <desc>characters</desc>\n                      <?exactMatch char?>\n                      <?exactMatch characters?>\n                                        </valItem>\n                                        <valItem ident=\"lines\">\n                                            <desc>lines</desc>\n                      <?exactMatch line?>\n                                        </valItem>\n                                        <valItem ident=\"pages\">\n                                            <desc>pages</desc>\n                      <?exactMatch page?>\n                                        </valItem>\n                                        <valItem ident=\"words\">\n                                            <desc>words</desc>\n                      <?exactMatch word?>\n                                        </valItem>\n                                        <valItem ident=\"cm\">\n                                            <desc>centimetres</desc>\n                                        </valItem>\n                                        <valItem ident=\"mm\">\n                                            <desc>millimetre</desc>\n                                        </valItem>\n                                        <valItem ident=\"in\">\n                                            <desc>inches</desc>\n                                        </valItem>\n                                    </valList>\n                                </attDef>\n                            </attList>\n                        </classSpec>\n                        <classSpec type=\"atts\" ident=\"att.global\" mode=\"change\">\n                            <constraintSpec ident=\"renditionpointer\" scheme=\"isoschematron\">\n                                <constraint>\n                                    <rule xmlns=\"http://purl.oclc.org/dsdl/schematron\" context=\"tei:*[@rendition]\">\n                                        <let name=\"results\" value=\"for $val in tokenize(normalize-space(@rendition),'\\s+') return        starts-with($val,'simple:')        or        (starts-with($val,'#')        and        //tei:rendition[@xml:id=substring($val,2)])\"/>\n                                        <assert test=\"every $x in $results satisfies $x\"> Error: Each of\n                                       the rendition values in \"<value-of select=\"@rendition\"/>\"\n                                       must point to a local ID or to a token in the Simple scheme\n                                          (<value-of select=\"$results\"/>)</assert>\n                                    </rule>\n                                </constraint>\n                            </constraintSpec>\n                            <constraintSpec ident=\"corresppointer\" scheme=\"isoschematron\">\n                                <constraint>\n                                    <rule xmlns=\"http://purl.oclc.org/dsdl/schematron\" context=\"tei:*[@corresp]\">\n                                        <let name=\"results\" value=\"for $t in        tokenize(normalize-space(@corresp),'\\s+') return starts-with($t,'#') and not(id(substring($t,2)))\"/>\n                                        <report test=\"some $x in $results  satisfies $x\"> Error: Every\n                                       local pointer in \"<value-of select=\"@corresp\"/>\" must point to\n                                       an ID in this document (<value-of select=\"$results\"/>)</report>\n                                    </rule>\n                                </constraint>\n                            </constraintSpec>\n                            <attList>\n                                <attDef ident=\"rend\" mode=\"delete\"/>\n                                <attDef ident=\"style\" mode=\"delete\"/>\n                                <attDef ident=\"rendition\" mode=\"change\">\n                                    <valList mode=\"add\" type=\"semi\">\n                                        <valItem ident=\"simple:allcaps\">\n                      <?exactMatch upper-roman?>\n                      <?exactMatch uc?>\n                                            <desc>all capitals</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:blackletter\">\n                      <?exactMatch blackLetter?>\n                      <?exactMatch blackletterType?>\n                      <?exactMatch FrakturType?>\n                      <?exactMatch gothic?>\n                                            <desc>black letter or gothic typeface</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:bold\">\n                      <?exactMatch b?>\n                      <?exactMatch bo?>\n                      <?exactMatch bol?>\n                      <?exactMatch strong?>\n                                            <desc>bold typeface</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:bottombraced\">\n                                            <desc>marked with a brace under the bottom of the text</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:boxed\">\n                      <?exactMatch border?>\n                                            <desc>border around the text</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:centre\">\n                      <?exactMatch center?>\n                                            <desc>centred</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:cursive\">\n                                            <desc>cursive typeface</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:display\">\n                                            <desc>block display</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:doublestrikethrough\">\n                                            <desc>strikethrough with double line</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:doubleunderline\">\n                                            <desc>underlined with double line</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:dropcap\">\n                      <?exactMatch decorInit?>\n                                            <desc>initial letter larger or decorated</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:float\">\n                                            <desc>floated out of main flow</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:hyphen\">\n                                            <desc>with a hyphen here (eg in line break)</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:inline\">\n                                            <desc>inline rendering</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:italic\">\n                      <?exactMatch italics?>\n                      <?exactMatch ITALIC?>\n                      <?exactMatch i?>\n                      <?exactMatch it?>\n                      <?exactMatch ital?>\n                                            <desc>italic typeface</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:larger\">\n                      <?exactMatch large?>\n                                            <desc>larger type</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:left\">\n                      <?exactMatch left?>\n                                            <desc>aligned to the left or left-justified</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:leftbraced\">\n                      <?exactMatch braced?>\n                                            <desc>marked with a brace on the left side of the text</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:letterspace\">\n                      <?exactMatch spaceletter?>\n                                            <desc>letter-spaced</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:normalstyle\">\n                                            <desc>upright shape and default weight of typeface</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:normalweight\">\n                      <?exactMatch roman?>\n                                            <desc>normal typeface weight</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:right\">\n                      <?exactMatch right-aligned?>\n                                            <desc>aligned to the right or right-justified</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:rightbraced\">\n                                            <desc>marked with a brace to the right of the text</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:rotateleft\">\n                      <?exactMatch rotateCounterclockwise?>\n                                            <desc>rotated to the left</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:rotateright\">\n                      <?exactMatch rotateClockwise?>\n                                            <desc>rotated to the right</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:smallcaps\">\n                      <?exactMatch sc?>\n                      <?exactMatch smallCap?>\n                                            <desc>small caps</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:smaller\">\n                      <?exactMatch small?>\n                                            <desc>smaller type</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:strikethrough\">\n                                            <desc>strike through</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:subscript\">\n                      <?exactMatch sub?>\n                                            <desc>subscript</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:superscript\">\n                      <?exactMatch sup?>\n                      <?exactMatch super?>\n                                            <desc>superscript</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:topbraced\">\n                                            <desc>marked with a brace above the text</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:typewriter\">\n                                            <desc>fixed-width typeface, like typewriter</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:underline\">\n                      <?exactMatch u?>\n                                            <desc>underlined with single line</desc>\n                                        </valItem>\n                                        <valItem ident=\"simple:wavyunderline\">\n                                            <desc>underlined with wavy line</desc>\n                                        </valItem>\n                                    </valList>\n                                </attDef>\n                            </attList>\n                        </classSpec>\n                    </specGrp>\n                </div>\n                <div>\n                    <head>Model classes</head>\n                    <specGrp xml:id=\"modelclasses\">\n                        <p>A set of unused model classes are removed.</p>\n                        <classSpec type=\"model\" ident=\"model.entryPart\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.placeNamePart\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.placeStateLike\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.egLike\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.offsetLike\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.pPart.msdesc\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.oddDecl\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.specDescLike\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.entryPart\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.placeNamePart\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.placeStateLike\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.certLike\" mode=\"delete\"/>\n                        <classSpec type=\"model\" ident=\"model.glossLike\" mode=\"delete\"/>\n                    </specGrp>\n                </div>\n                <div>\n                    <head>Elements</head>\n                    <p>The main part of Simple is the set of selected elements.</p>\n                    <include xmlns=\"http://www.w3.org/2001/XInclude\" href=\"simpleelements.xml\"/>\n                    <specGrp xmlns:XSL=\"http://www.w3.org/1999/XSL/Transform\" xml:id=\"simpleelementspm\">\n                        <elementSpec mode=\"change\" ident=\"ab\">\n                            <model behaviour=\"paragraph(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"abbr\">\n                            <model predicate=\"parent::choice and count(parent::*/*) gt 1\" behaviour=\"omit()\"/>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"actor\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"add\">\n                            <model behaviour=\"inline(.)\">\n                                <rendition>color: green; text-decoration: underline;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"address\">\n                            <model behaviour=\"block(.)\">\n                                <rendition>margin-top: 2em; margin-left: 2em; margin-right: 2em; margin-bottom:\n            2em;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"addrLine\">\n                            <model behaviour=\"block(.)\">\n                                <rendition>white-space: nowrap;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"addSpan\">\n                            <model behaviour=\"anchor(@xml:id)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"am\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"anchor\">\n                            <model behaviour=\"anchor(@xml:id)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"argument\">\n                            <model behaviour=\"block(.)\">\n                                <rendition>margin-bottom: 0.5em;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"author\">\n                            <model predicate=\"ancestor::teiHeader\" behaviour=\"omit()\"/>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"back\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"bibl\">\n                            <constraintSpec mode=\"add\" ident=\"noEmptyBibl\" scheme=\"isoschematron\">\n                                <constraint>\n                                    <assert xmlns=\"http://purl.oclc.org/dsdl/schematron\" test=\"child::* or child::text()[normalize-space(.)]\" role=\"ERROR\">\n                Element \"<name/>\" may not be empty.\n            </assert>\n                                </constraint>\n                            </constraintSpec>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"body\">\n                            <modelSequence>\n                                <model behaviour=\"index(.,'toc')\"/>\n                                <model behaviour=\"block(.)\"/>\n                            </modelSequence>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"byline\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"c\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"castGroup\">\n                            <model predicate=\"child::*\" behaviour=\"list(castItem|castGroup)\">\n                                <desc>Insert list. </desc>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"castItem\">\n                            <model behaviour=\"listItem(.)\">\n                                <desc>Insert item, rendered as described in parent list rendition. </desc>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"castList\">\n                            <model predicate=\"child::*\" behaviour=\"list(castItem)\" useSourceRendition=\"true\">\n                                <rendition>list-style: ordered;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"cb\">\n                            <model behaviour=\"break('column',@n)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"cell\">\n                            <model behaviour=\"cell(.)\">\n                                <desc>Insert table cell. </desc>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"choice\">\n                            <constraintSpec ident=\"choiceSize\" scheme=\"isoschematron\" mode=\"add\">\n                                <constraint>\n                                    <assert xmlns=\"http://purl.oclc.org/dsdl/schematron\" test=\"count(*) &gt; 1\" role=\"ERROR\">\n                    Element \"<name/>\" must have at least two child\n\t\t    elements.</assert>\n                                </constraint>\n                            </constraintSpec>\n                            <constraintSpec ident=\"choiceContent\" scheme=\"isoschematron\" mode=\"add\">\n                                <constraint>\n                                    <assert xmlns=\"http://purl.oclc.org/dsdl/schematron\" test=\"(tei:corr or tei:sic or tei:expan or     tei:abbr or tei:reg or tei:orig) and ((tei:corr and tei:sic) or (tei:expan     and tei:abbr) or (tei:reg and tei:orig))\" role=\"ERROR\">\n                    Element \"<name/>\" must have corresponding corr/sic, expand/abbr, reg/orig </assert>\n                                </constraint>\n                            </constraintSpec>\n                            <model predicate=\"sic and corr\" behaviour=\"alternate(corr[1],sic[1])\"/>\n                            <model predicate=\"abbr and expan\" behaviour=\"alternate(expan[1],abbr[1])\"/>\n                            <model predicate=\"orig and reg\" behaviour=\"alternate(reg[1],orig[1])\"/>\n                            <model output=\"plain\" predicate=\"sic and corr\" behaviour=\"inline(corr[1])\"/>\n                            <model output=\"plain\" predicate=\"abbr and expan\" behaviour=\"inline(expan[1])\"/>\n                            <model output=\"plain\" predicate=\"orig and reg\" behaviour=\"inline(reg[1])\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"cit\">\n                            <model predicate=\"child::quote and child::bibl\" behaviour=\"cit(.)\">\n                                <desc>Insert cit. </desc>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"closer\">\n                            <model behaviour=\"block(.)\">\n                                <rendition>margin-top: 1em; margin-left: 1em; margin-left: 1em;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"corr\">\n                            <model predicate=\"parent::choice and count(parent::*/*) gt 1\" behaviour=\"omit()\">\n                                <desc>Omit, if handled in parent choice. </desc>\n                            </model>\n                            <model behaviour=\"inline(.)\">\n                                <rendition scope=\"before\">content: '[';</rendition>\n                                <rendition scope=\"after\">content: ']';</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"date\">\n                            <model output=\"print\" predicate=\"text()\" behaviour=\"inline(.)\"/>\n                            <model output=\"print\" predicate=\"@when and not(text())\" behaviour=\"inline(@when)\"/>\n                            <model predicate=\"@when\" output=\"web\" behaviour=\"alternate(.,@when)\"/>\n                            <model predicate=\"text()\" behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"dateline\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"del\">\n                            <model behaviour=\"inline(.)\">\n                                <rendition>   text-decoration: line-through;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"desc\">\n                            <model behaviour=\"omit()\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"div\">\n                            <model predicate=\"@type='title_page'\" behaviour=\"block(.)\">\n                                <rendition>border: 1px solid black; padding: 5px;</rendition>\n                            </model>\n                            <model behaviour=\"section(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"docAuthor\">\n                            <model predicate=\"ancestor::teiHeader\" behaviour=\"omit()\">\n                                <desc>Omit if located in teiHeader. </desc>\n                            </model>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"docDate\">\n                            <model predicate=\"ancestor::teiHeader\" behaviour=\"omit()\">\n                                <desc>Omit if located in teiHeader. </desc>\n                            </model>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"docEdition\">\n                            <model predicate=\"ancestor::teiHeader\" behaviour=\"omit()\">\n                                <desc>Omit if located in teiHeader. </desc>\n                            </model>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"docImprint\">\n                            <model predicate=\"ancestor::teiHeader\" behaviour=\"omit()\">\n                                <desc>Omit if located in teiHeader. </desc>\n                            </model>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"docTitle\">\n                            <model predicate=\"ancestor::teiHeader\" behaviour=\"omit()\">\n                                <desc>Omit if located in teiHeader. </desc>\n                            </model>\n                            <model behaviour=\"block(.)\">\n                                <rendition>font-size: large;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"epigraph\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"ex\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"expan\">\n                            <model predicate=\"parent::choice and count(parent::*/*) gt 1\" behaviour=\"omit()\"/>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"figDesc\">\n                            <model behaviour=\"inline(.)\">\n                                <rendition scope=\"before\">content: '[..';</rendition>\n                                <rendition scope=\"after\">content: '..]';</rendition>\n                                <rendition>color: grey;font-style:italic;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"figure\">\n                            <model predicate=\"head or @rendition='simple:display'\" behaviour=\"block(.)\"/>\n                            <model behaviour=\"inline(.)\">\n                                <rendition>\ndisplay: block;\nborder-top: solid 1pt blue;\nborder-bottom: solid 1pt blue;\n\t\t</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"floatingText\">\n                            <model behaviour=\"block(.)\">\n                                <rendition>\n\t  margin: 6pt;\n\t  border: solid black 1pt;\n\t</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"foreign\">\n                            <model behaviour=\"inline(.)\">\n                                <rendition>font-style:italic;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"formula\">\n                            <model predicate=\"@rendition='simple:display'\" behaviour=\"block(.)\"/>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"front\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"fw\">\n                            <model predicate=\"ancestor::p or ancestor::ab\" behaviour=\"inline(.)\"/>\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"g\">\n                            <model predicate=\"not(text())\" behaviour=\"glyph(@ref)\"/>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"gap\">\n                            <model predicate=\"desc\" behaviour=\"inline(desc)\">\n                                <rendition>color: grey;</rendition>\n                            </model>\n                            <model predicate=\"@extent\" behaviour=\"inline(@extent)\">\n                                <rendition scope=\"before\">content: '[..';</rendition>\n                                <rendition scope=\"after\">content: '..]';</rendition>\n                                <rendition>color: grey;</rendition>\n                            </model>\n                            <model behaviour=\"inline()\">\n                                <rendition scope=\"before\">content: '[...]';</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"graphic\">\n                            <model behaviour=\"graphic(@url,@width,@height,@scale)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"group\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"handShift\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"head\">\n                            <model predicate=\"parent::figure\" behaviour=\"block(.)\">\n                                <rendition>font-style: italic;</rendition>\n                            </model>\n                            <model predicate=\"parent::table\" behaviour=\"block(.)\">\n                                <rendition>font-style: italic;</rendition>\n                            </model>\n                            <model predicate=\"parent::lg\" behaviour=\"block(.)\">\n                                <rendition>font-style: italic;</rendition>\n                            </model>\n                            <model predicate=\"parent::list\" behaviour=\"block(.)\">\n                                <rendition>font-weight: bold;</rendition>\n                            </model>\n                            <model predicate=\"parent::div\" behaviour=\"heading(.,@type,div)\"/>\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"hi\">\n                            <model predicate=\"@rendition\" behaviour=\"inline(.)\" useSourceRendition=\"true\">\n                                <rendition>font-style: italic;</rendition>\n                            </model>\n                            <model predicate=\"not(@rendition)\" behaviour=\"inline(.)\">\n                                <rendition>font-style: italic;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"imprimatur\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"item\">\n                            <model predicate=\"parent::list[@rendition]\" behaviour=\"listItem(.)\"/>\n                            <model predicate=\"not(parent::list[@rendition])\" behaviour=\"listItem(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"l\">\n                            <model behaviour=\"block(.)\" useSourceRendition=\"true\">\n                                <rendition> margin-left: 1em; </rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"label\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"lb\">\n                            <model predicate=\"ancestor::sp\" behaviour=\"break('line',@n)\"/>\n                            <model behaviour=\"omit()\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"lg\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"list\">\n                            <model predicate=\"@rendition\" behaviour=\"list(item)\" useSourceRendition=\"true\"/>\n                            <model predicate=\"not(@rendition)\" behaviour=\"list(item)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"listBibl\">\n                            <model behaviour=\"list(bibl)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"measure\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"milestone\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"name\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"note\">\n                            <model predicate=\"@place\" behaviour=\"note(.,@place)\"/>\n                            <model predicate=\"parent::div and not(@place)\" behaviour=\"block(.)\">\n                                <rendition>margin-left: 10px;margin-right: 10px; font-size:smaller;</rendition>\n                            </model>\n                            <model predicate=\"not(@place)\" behaviour=\"inline(.)\">\n                                <rendition scope=\"before\">content:\" [\";</rendition>\n                                <rendition scope=\"after\">content:\"] \";</rendition>\n                                <rendition>font-size:small;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"num\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"opener\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"orig\">\n                            <model predicate=\"parent::choice and count(parent::*/*) gt 1\" behaviour=\"omit()\">\n                                <desc>Omit, if handled in parent choice. </desc>\n                            </model>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"p\">\n                            <model behaviour=\"paragraph(.)\" useSourceRendition=\"true\">\n                                <rendition>text-align: justify;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"pb\">\n                            <constraintSpec ident=\"pbposition\" scheme=\"isoschematron\">\n                                <constraint>\n                                    <report xmlns=\"http://purl.oclc.org/dsdl/schematron\" test=\"parent::*/text() and not           (preceding-sibling::text() and           following-sibling::text())\">please make sure pb elements are not at the start or end of mixed content </report>\n                                </constraint>\n                            </constraintSpec>\n                            <model behaviour=\"break('page',@n)\">\n                                <rendition>\n\t  display: block;\n\t  color: grey;\n\t  float: right;\n\t</rendition>\n                                <rendition scope=\"before\">content: '[Page ';</rendition>\n                                <rendition scope=\"after\">content: ']';</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"pc\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"postscript\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"publisher\">\n                            <model predicate=\"ancestor::teiHeader\" behaviour=\"omit()\">\n                                <desc>Omit if located in teiHeader. </desc>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"pubPlace\">\n                            <model predicate=\"ancestor::teiHeader\" behaviour=\"omit()\">\n                                <desc>Omit if located in teiHeader. </desc>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"q\">\n                            <model predicate=\"l\" behaviour=\"block(.)\" useSourceRendition=\"true\">\n                                <rendition>margin-left: 10px; margin-right: 10px;\n\t\t</rendition>\n                            </model>\n                            <model predicate=\"ancestor::p or ancestor::cell\" behaviour=\"inline(.)\" useSourceRendition=\"true\">\n                                <rendition scope=\"before\">content: '‘';</rendition>\n                                <rendition scope=\"after\">content: '’';</rendition>\n                            </model>\n                            <model behaviour=\"block(.)\" useSourceRendition=\"true\">\n                                <rendition>margin-left: 10px; margin-right: 10px;\n\t\t</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"quote\">\n                            <model predicate=\"ancestor::p\" behaviour=\"inline(.)\" useSourceRendition=\"true\">\n                                <desc>If it is inside a paragraph then it is inline, otherwise it is block level</desc>\n                                <rendition scope=\"before\">content: '‘';</rendition>\n                                <rendition scope=\"after\">content: '’';</rendition>\n                            </model>\n                            <model behaviour=\"block(.)\" useSourceRendition=\"true\">\n                                <desc>If it is inside a paragraph then it is inline, otherwise it is block level</desc>\n                                <rendition>margin-left: 10px; margin-right: 10px;\n\t\t</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"ref\">\n                            <model behaviour=\"inline(.)\" predicate=\"not(@target)\"/>\n                            <model predicate=\"not(text())\" behaviour=\"link(@target,@target)\"/>\n                            <model behaviour=\"link(.,@target)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"reg\">\n                            <model predicate=\"not(parent::choice)\" behaviour=\"inline(.)\"/>\n                            <model predicate=\"parent::choice and count(parent::*/*) gt 1\" behaviour=\"omit()\">\n                                <desc>Omit, if handled in parent choice.</desc>\n                            </model>\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"rhyme\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"role\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"roleDesc\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"row\">\n                            <model predicate=\"@role='label'\" behaviour=\"row(.)\">\n                                <rendition>font-weight: bold;</rendition>\n                            </model>\n                            <model behaviour=\"row(.)\">\n                                <desc>Insert table row. </desc>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"rs\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"s\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"salute\">\n                            <model predicate=\"parent::closer\" behaviour=\"inline(.)\"/>\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"seg\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec ident=\"sic\" mode=\"change\">\n                            <model predicate=\"parent::choice and count(parent::*/*) gt 1\" behaviour=\"omit()\"/>\n                            <model behaviour=\"inline(.)\">\n                                <rendition scope=\"before\">content: '{';</rendition>\n                                <rendition scope=\"after\">content: '}';</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"signed\">\n                            <model behaviour=\"block(.)\" predicate=\"parent::closer\">\n                                <rendition>\n\t\t  text-align: right;\n\t\t</rendition>\n                            </model>\n                            <model behaviour=\"inline(.)\">\n                                <rendition>\n\t\t font-style: italic;\n\t\t</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"sp\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"space\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"speaker\">\n                            <model behaviour=\"block(.)\">\n                                <rendition> font-style:italic; </rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"spGrp\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"stage\">\n                            <model behaviour=\"block(.)\">\n                                <rendition>font-style: italic;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"subst\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"supplied\">\n                            <model predicate=\"parent::choice\" behaviour=\"omit()\"/>\n                            <model predicate=\"@reason='damage'\" behaviour=\"inline(.)\">\n                                <rendition scope=\"before\">content:\"&lt;\";</rendition>\n                                <rendition scope=\"after\">content:\"&gt;\";</rendition>\n                            </model>\n                            <model predicate=\"@reason='illegible' or not(@reason)\" behaviour=\"inline(.)\">\n                                <rendition scope=\"before\">content:\"[\";</rendition>\n                                <rendition scope=\"after\">content:\"]\";</rendition>\n                            </model>\n                            <model predicate=\"@reason='omitted'\" behaviour=\"inline(.)\">\n                                <rendition scope=\"before\">content:\"(\";</rendition>\n                                <rendition scope=\"after\">content:\")\";</rendition>\n                            </model>\n                            <model behaviour=\"inline(.)\">\n                                <rendition scope=\"before\">content:\"{\";</rendition>\n                                <rendition scope=\"after\">content:\"}\";</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"table\">\n                            <model behaviour=\"table(.)\">\n                                <rendition>\n\t\t  font-size: smaller;\n\t\t  background-color: #F0F0F0;\n\t\t</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"fileDesc\">\n                            <model behaviour=\"title(titleStmt)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"profileDesc\">\n                            <model behaviour=\"omit()\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"revisionDesc\">\n                            <model behaviour=\"omit()\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"encodingDesc\">\n                            <model behaviour=\"omit()\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"teiHeader\">\n                            <model behaviour=\"metadata(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"TEI\">\n                            <model behaviour=\"document(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"text\">\n                            <model behaviour=\"body(.)\">\n                                <rendition>\n            max-width: 80%;\n            margin: auto;\n            font-family: Verdana, Tahoma, Geneva, Arial, Helvetica, sans-serif;\n         </rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"time\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"title\">\n                            <modelSequence predicate=\"parent::titleStmt/parent::fileDesc\">\n                                <model predicate=\"preceding-sibling::title\" behaviour=\"text(' — ')\"/>\n                                <model behaviour=\"text(.)\">\n                                    <rendition>color: red; font-size: 2em;</rendition>\n                                </model>\n                            </modelSequence>\n                            <model predicate=\"not(@level) and parent::bibl\" behaviour=\"inline(.)\"/>\n                            <modelSequence predicate=\"@level='m' or not(@level)\">\n                                <model behaviour=\"inline(.)\">\n                                    <rendition>font-style: italic;</rendition>\n                                </model>\n                                <model predicate=\"ancestor::biblStruct or       ancestor::biblFull\" behaviour=\"text(', ')\"/>\n                            </modelSequence>\n                            <modelSequence predicate=\"@level='s' or @level='j'\">\n                                <model behaviour=\"inline(.)\">\n                                    <rendition>font-style: italic;</rendition>\n                                </model>\n                                <model predicate=\"following-sibling::* and     (ancestor::biblStruct  or     ancestor::biblFull)\" behaviour=\"text(' ')\"/>\n                            </modelSequence>\n                            <modelSequence predicate=\"@level='u' or @level='a'\">\n                                <model behaviour=\"inline(.)\">\n                                    <rendition>font-style: italic;</rendition>\n                                </model>\n                                <model predicate=\"following-sibling::* and     (ancestor::biblStruct  or     ancestor::biblFull)\" behaviour=\"text('. ')\"/>\n                            </modelSequence>\n                            <model behaviour=\"inline(.)\">\n                                <rendition>font-style: italic;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"titlePage\">\n                            <model behaviour=\"block(.)\">\n                                <rendition>    text-align: center;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"titlePart\">\n                            <model behaviour=\"block(.)\"/>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"trailer\">\n                            <model behaviour=\"block(.)\">\n                                <rendition>color: green;</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"unclear\">\n                            <model behaviour=\"inline(.)\">\n                                <rendition scope=\"after\">content: ' [?] ';</rendition>\n                            </model>\n                        </elementSpec>\n                        <elementSpec mode=\"change\" ident=\"w\">\n                            <model behaviour=\"inline(.)\"/>\n                        </elementSpec>\n                    </specGrp>\n                    <specGrp xml:id=\"simplechanges\">\n                        <p>A small number of elements have constrained value lists added.</p>\n                        <elementSpec ident=\"formula\" mode=\"change\">\n                            <attList>\n                                <attDef ident=\"notation\" mode=\"change\">\n                                    <valList mode=\"add\" type=\"semi\">\n                                        <valItem ident=\"TeX\">\n                                            <desc>Using TeX or LaTeX notation</desc>\n                                        </valItem>\n                                    </valList>\n                                </attDef>\n                            </attList>\n                        </elementSpec>\n                        <elementSpec ident=\"name\" mode=\"change\">\n                            <attList>\n                                <attDef ident=\"type\" mode=\"change\">\n                                    <valList mode=\"add\" type=\"closed\">\n                                        <valItem ident=\"person\"/>\n                                        <valItem ident=\"forename\"/>\n                                        <valItem ident=\"surname\"/>\n                                        <valItem ident=\"personGenName\"/>\n                                        <valItem ident=\"personRoleName\"/>\n                                        <valItem ident=\"personAddName\"/>\n                                        <valItem ident=\"nameLink\"/>\n                                        <valItem ident=\"organisation\"/>\n                                        <valItem ident=\"country\"/>\n                                        <valItem ident=\"placeGeog\"/>\n                                        <valItem ident=\"place\"/>\n                                    </valList>\n                                </attDef>\n                            </attList>\n                        </elementSpec>\n                        <elementSpec ident=\"cell\" mode=\"change\">\n                            <attList>\n                                <attDef ident=\"role\" mode=\"change\">\n                                    <valList mode=\"add\" type=\"closed\">\n                                        <valItem ident=\"data\">\n                                            <desc>data cell</desc>\n                                        </valItem>\n                                        <valItem ident=\"label\">\n                                            <desc>label cell</desc>\n                      <?exactMatch LABEL?>\n                                        </valItem>\n                                        <valItem ident=\"sum\">\n                                            <desc>row or column sum data</desc>\n                                        </valItem>\n                                        <valItem ident=\"total\">\n                                            <desc>table total data</desc>\n                                        </valItem>\n                                    </valList>\n                                </attDef>\n                            </attList>\n                        </elementSpec>\n                        <elementSpec ident=\"row\" mode=\"change\">\n                            <attList>\n                                <attDef ident=\"role\" mode=\"change\">\n                                    <valList mode=\"add\" type=\"closed\">\n                                        <valItem ident=\"data\">\n                                            <desc>data cell</desc>\n                                        </valItem>\n                                        <valItem ident=\"label\">\n                                            <desc>label cell</desc>\n                                        </valItem>\n                                        <valItem ident=\"sum\">\n                                            <desc>row or column sum data</desc>\n                                        </valItem>\n                                        <valItem ident=\"total\">\n                                            <desc>table total data</desc>\n                                        </valItem>\n                                    </valList>\n                                </attDef>\n                            </attList>\n                        </elementSpec>\n                    </specGrp>\n                    <specGrp xml:id=\"rendition\">\n                        <rendition xml:id=\"allcaps\">text-transform: uppercase;</rendition>\n                        <rendition xml:id=\"blackletter\">font-family: fantasy;</rendition>\n                        <rendition xml:id=\"bold\">font-weight: bold;</rendition>\n                        <rendition xml:id=\"bottombraced\">padding-bottom: 2pt; border-bottom: dashed gray 2pt;</rendition>\n                        <rendition xml:id=\"boxed\">padding: 2pt; border: solid black 1pt;</rendition>\n                        <rendition xml:id=\"centre\">text-align: center;</rendition>\n                        <rendition xml:id=\"cursive\">font-family: cursive;</rendition>\n                        <rendition xml:id=\"doublestrikethrough\">text-decoration: line-through;    color: red;</rendition>\n                        <rendition xml:id=\"doubleunderline\">text-decoration: underline;    color: red;</rendition>\n                        <rendition xml:id=\"dropcap\">font-size : 6em;\n    font-family: cursive;\n    font-weight : bold;\n    vertical-align: top;\n    height: 1em;\n    line-height: 1em;\n    float : left;\n    width : 1em;\n    color : #c00;\n    margin: 0em;\n    padding: 0px;</rendition>\n                        <rendition xml:id=\"float\">float:right;    display: block;\n    font-size: smaller;\n    clear: right;\n    padding: 4pt;\n    width: 15%;\n</rendition>\n                        <rendition xml:id=\"hyphen\"/>\n                        <rendition xml:id=\"inline\">display:inline;</rendition>\n                        <rendition xml:id=\"display\">display:block;</rendition>\n                        <rendition xml:id=\"italic\">font-style: italic;</rendition>\n                        <rendition xml:id=\"larger\">font-size: larger;</rendition>\n                        <rendition xml:id=\"left\">text-align: left;</rendition>\n                        <rendition xml:id=\"leftbraced\">padding-left: 2pt; border-left: dotted gray 2pt; </rendition>\n                        <rendition xml:id=\"letterspace\">letter-spacing: 0.5em;</rendition>\n                        <rendition xml:id=\"normalstyle\">font-style:roman;</rendition>\n                        <rendition xml:id=\"normalweight\">font-weight:normal;</rendition>\n                        <rendition xml:id=\"right\">text-align: right;</rendition>\n                        <rendition xml:id=\"rightbraced\">padding-right: 2pt; border-right: dotted gray 2pt; </rendition>\n                        <rendition xml:id=\"rotateleft\">-webkit-transform: rotate(90deg);    transform: rotate(90deg);</rendition>\n                        <rendition xml:id=\"rotateright\">-webkit-transform: rotate(-90deg);    transform: rotate(-90deg);</rendition>\n                        <rendition xml:id=\"smallcaps\">font-variant: small-caps;</rendition>\n                        <rendition xml:id=\"smaller\">font-size: smaller;</rendition>\n                        <rendition xml:id=\"strikethrough\">text-decoration: line-through;</rendition>\n                        <rendition xml:id=\"subscript\">vertical-align: bottom;    font-size: smaller;</rendition>\n                        <rendition xml:id=\"superscript\">vertical-align: super;    font-size: smaller;</rendition>\n                        <rendition xml:id=\"topbraced\">padding-top: 2pt;  border-top: dotted gray 2pt; </rendition>\n                        <rendition xml:id=\"typewriter\">font-family:monospace;</rendition>\n                        <rendition xml:id=\"underline\">text-decoration: underline;</rendition>\n                        <rendition xml:id=\"wavyunderline\">text-decoration: underline;       text-decoration-style: wavy;</rendition>\n                    </specGrp>\n                </div>\n            </div>\n        </body>\n    </text>\n</TEI>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/translation_en3.ts",
    "content": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<!DOCTYPE TS>\n<TS>\n<context>\n    <name>Test</name>\n    <message>\n        <source>Message 1</source>\n        <translation>Message 1 (en)</translation>\n    </message>\n    <message>\n        <source>Message 2</source>\n        <translation>Message 2 (en)</translation>\n    </message>\n    <message>\n        <source>Message 3</source>\n        <translation>Message 3 (en)</translation>\n    </message>\n    <message>\n        <source>Message 4</source>\n        <translation>Message 4 (en)</translation>\n    </message>\n    <message>\n        <source>Küchen Möbel</source>\n        <translation>Cooking furniture (en)</translation>\n    </message>\n    <message>\n        <source>Cooking furniture</source>\n        <translation>Küchen Möbel (en)</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/vbproj-sample.vbproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{400D377F-6993-425A-A798-05532B3FD04C}</ProjectGuid>\r\n    <OutputType>Exe</OutputType>\r\n    <StartupObject>vbproj_sample.Module1</StartupObject>\r\n    <RootNamespace>vbproj_sample</RootNamespace>\r\n    <AssemblyName>vbproj-sample</AssemblyName>\r\n    <FileAlignment>512</FileAlignment>\r\n    <MyType>Console</MyType>\r\n    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>\r\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <DefineDebug>true</DefineDebug>\r\n    <DefineTrace>true</DefineTrace>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DocumentationFile>vbproj-sample.xml</DocumentationFile>\r\n    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugType>pdbonly</DebugType>\r\n    <DefineDebug>false</DefineDebug>\r\n    <DefineTrace>true</DefineTrace>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DocumentationFile>vbproj-sample.xml</DocumentationFile>\r\n    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <OptionExplicit>On</OptionExplicit>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <OptionCompare>Binary</OptionCompare>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <OptionStrict>Off</OptionStrict>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <OptionInfer>On</OptionInfer>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Deployment\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Import Include=\"Microsoft.VisualBasic\" />\r\n    <Import Include=\"System\" />\r\n    <Import Include=\"System.Collections\" />\r\n    <Import Include=\"System.Collections.Generic\" />\r\n    <Import Include=\"System.Data\" />\r\n    <Import Include=\"System.Diagnostics\" />\r\n    <Import Include=\"System.Linq\" />\r\n    <Import Include=\"System.Xml.Linq\" />\r\n    <Import Include=\"System.Threading.Tasks\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Module1.vb\" />\r\n    <Compile Include=\"My Project\\AssemblyInfo.vb\" />\r\n    <Compile Include=\"My Project\\Application.Designer.vb\">\r\n      <AutoGen>True</AutoGen>\r\n      <DependentUpon>Application.myapp</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"My Project\\Resources.Designer.vb\">\r\n      <AutoGen>True</AutoGen>\r\n      <DesignTime>True</DesignTime>\r\n      <DependentUpon>Resources.resx</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"My Project\\Settings.Designer.vb\">\r\n      <AutoGen>True</AutoGen>\r\n      <DependentUpon>Settings.settings</DependentUpon>\r\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\r\n    </Compile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <EmbeddedResource Include=\"My Project\\Resources.resx\">\r\n      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>\r\n      <LastGenOutput>Resources.Designer.vb</LastGenOutput>\r\n      <CustomToolNamespace>My.Resources</CustomToolNamespace>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"My Project\\Application.myapp\">\r\n      <Generator>MyApplicationCodeGenerator</Generator>\r\n      <LastGenOutput>Application.Designer.vb</LastGenOutput>\r\n    </None>\r\n    <None Include=\"My Project\\Settings.settings\">\r\n      <Generator>SettingsSingleFileGenerator</Generator>\r\n      <CustomToolNamespace>My</CustomToolNamespace>\r\n      <LastGenOutput>Settings.Designer.vb</LastGenOutput>\r\n    </None>\r\n    <None Include=\"App.config\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.VisualBasic.targets\" />\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/vcxproj-sample.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{BF6EED48-BF18-4C54-866F-6BBF19EEDC7C}</ProjectGuid>\r\n    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>\r\n    <Keyword>ManagedCProj</Keyword>\r\n    <RootNamespace>vcxprojsample</RootNamespace>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <CLRSupport>true</CLRSupport>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <CLRSupport>true</CLRSupport>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PrecompiledHeader>Use</PrecompiledHeader>\r\n    </ClCompile>\r\n    <Link>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <AdditionalDependencies />\r\n      <SubSystem>Console</SubSystem>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PrecompiledHeader>Use</PrecompiledHeader>\r\n    </ClCompile>\r\n    <Link>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <AdditionalDependencies />\r\n      <SubSystem>Console</SubSystem>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Xml\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Text Include=\"ReadMe.txt\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"resource.h\" />\r\n    <ClInclude Include=\"stdafx.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ResourceCompile Include=\"app.rc\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"AssemblyInfo.cpp\" />\r\n    <ClCompile Include=\"stdafx.cpp\">\r\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\r\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\r\n    </ClCompile>\r\n    <ClCompile Include=\"vcxproj-sample.cpp\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Image Include=\"app.ico\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/vcxproj-sample.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Resource Files\">\r\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Text Include=\"ReadMe.txt\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"stdafx.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"resource.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ResourceCompile Include=\"app.rc\">\r\n      <Filter>Resource Files</Filter>\r\n    </ResourceCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"vcxproj-sample.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"AssemblyInfo.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"stdafx.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Image Include=\"app.ico\">\r\n      <Filter>Resource Files</Filter>\r\n    </Image>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/water.tsx",
    "content": "<?xml version=\"1.0\" ?>\n<tileset name=\"Sunny Beach\">\n  <tile id=\"0\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAABYklEQVR42tVVq47DMBDsp/hHDxQcOFBwwMAgwMDEIKAgoCAgUqBhqH8l50126lHaq9TrQ7pKq8TOemd2dtfd7f7rz3TTbNpibpyNT/N7gUOxSHbKs+mLlW+vAwaQJ1B5ulQN+88kYkIJ3GhwkVwyFRABvKbEkKvfI0TOGYkha9nDe4AiqfqIHZUoznbTfURwYA1agn+rvAL2VRpuX8ym1Rw9QUpIiB/WLQilRZXfgXuVziro51hr69HxtPZUAlk3ui9ErZYNvvLeEplAU7MAx00tj3mVEhkMuWYdVeZGQTrtCZTDqz8IsAotleqCCDcUZ7aQUduSsanKjnVDe44yx9Qogdvj1k21m08KDiltqllAdnwX+xgvRzNqvLuaUQ4EDSCgB8oQtb4GxIBDfvxeOE9ApO7mUjltWl5HvQfiMy+kXhXBjGP8DhsF2rTYa6/kQKPFV7Sf3vinFLQX3Np0f43zA259mZw6IuSNAAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"1\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAAB/0lEQVR42tVVLYvDQBBduTJy5drIyMrY/oOTFScrKioqKioiwhFxcBWFVhQaU0JEOCIKPXFQGVmbvzI3M/vRlIM7ev2AKwwNk7Bv3nvzEiH+7S/dQG/dg2gVQZRpeBiuro+g8yPI+R7E8A3EQEC0jkDPNdf9gLcIvGtBr/Efr4k9lUoVxGUMYaJAZaaofzvgvAG9ahhUl1gfLYisADEpQE6ksWFrFIgWEcixhHAVXq+IXlhQKsuae3gtZoVnT/47QGKvZwEPxCqMBPcvUoQ9rh0wAr42BpjkTw+gp+j985IVoIOZ5VhAv+p7sF5p+kES+Gd+HYSkZYnnFjQ5GGDLmu/htRhtEBBruGRgqi6QnEkPqKxFdN/1SLEzaxjYSe2qwl5ltp2BP1szGJbCfSALeJCRjSKmgOQncAKL85j3g/qcELLFPuOG8eqdlq0zQN7xnodpQZVmmKBq2ALHjBgFCECH0y7wXmwjz5R6POQ8hLiKvQo/x622rEsbvcrETybvIJ4w+9PibMlUYsAJWE0VD+Ei6Qa5OBU8QG6TQPJnDQTpnv0PUwti2bLvC8OMpBdDYVJCqbhJHHdmT8TASK9Ty8hGjpmujN+8Ayj1N4+vfiHRCyjB5Ru88Oazv1l48hR7DLwIOYb3+xiMlp4d+U5yx3Xs4/ewjxLtQfcl89dzvgD75hkn04cPugAAAABJRU5ErkJggg==\n    </data>\n   </image>\n  </tile>\n  <tile id=\"2\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACjElEQVR42r1VIY/iYBTkZ6ysrURWYpFIJBKLRJJTVZsUQcKKTajZEAQhCBIqmrSCpAiSIhCfQFQgKk5UnHk3876W3Iq7bLjdJXkp/dow8+bNPFqtBz+d2EgSjaQs5pKfJtL6ro93rqR7EuluS+lFpSTpWMx5ItlxjPpCIs5bLm5UiLcrZVmI+BcB+ATgvlQ/F5LEI1UiP40/VxEnzMR5QYGAd6jEOxvx3ox0VoVk6L4s50ogO0CJSyCb9UC/a0GV/W74GBlnZkG1Xu316TmR7nQv3bQSY5bo1FcgksgxBnPhfaPERJZhX58X1+DjJJwtwLYNMEg8o0hmZ6Q9y2WwrmR5E1WABmSHSTqSqlwoENUgGZ5xLMYEksMbfC/HuP4OHBlxVgCd1qA/EgvMogJryB5VMkD14IN+Kiq3zh6ABNZRANiOw1dTFte5ktlH9fnZqvYeuJG6KYA5a1zD3JJKC3Ffclu4J3j/INJbGZFfSy0CslOmoqiV4YhYJEm/6LUmV1AZPLMmQ6YpsYKz42ndNa+hBW6/Gn3G+I0ZQ4BT8rIIABjc5eYZKz+OLQGSIvDRArM226ESfRdb7bZRIPzDfFuj8WunpQzOkL1EBAsrP+Uk0F1eyk4/YBQkRflz3RETu7Rudmnx7J95VxPG1hNubMGfZkgAZq8RDCG9bDR2/PEstbNVJVKbAhvPOVTx9ayJ5sfTQAIYjwupvXUhvRjOBwEXY1A5jTUTu+G8lYiqMcT96L6gtOv/2ZAuuu2gYRdjGR5FFWBH9+xj7kZ3QKCxJClrzD3eWXzeRuTy8a9wP/xAiRtD6UzZPRfOJagN94X/Cb24VBC6mPJmBxKwbv/Wf0Wu3PK2UKdT/kd/5zeaE2gm63UKTAAAAABJRU5ErkJggg==\n    </data>\n   </image>\n  </tile>\n  <tile id=\"3\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAABvklEQVR42tVVr2/CQBTmb0XWVlZW1lZWoicWMkECgqQIklY0acVEBeIEomICe3vfd33H0Y1kY0AykpfCcbzv17tjNvuvr7ZLbbmL7fJlbodjYZ8GbA65rQS42ie2f88Izs91IpU+jki5jW3f57YVkPUqssYU4oC838Qkge/bJpVK+LwbsCqFOnMoaDvKgWEtF2LZ6Ehul69zvmeJKzcDAxRqoRSK2yZjEUwInD4Wjgyc6TKCYX9Irto5IiD5K2DU8i2y5SaixVQjzQCkmQMsdOY0LEhuEMI6oNPYWvn99akWxuWYJxV0yDfywLBX1VWBM8NQuGEUAn4gJ7GhB/pxvXNxBYq/5oYnWJOEgKAR1kFovYp9HFCI5krCRZCQXDiY6kSvJGSvgTNN4Mh3thGodg2MEIW9aKBOADiMiarVAVEK9XQJZCbuXp/60TZjcj6x2ZFJSQJk1AmAaEzqhq7r6UCVI6kL639y7n3jiW3lNmJsdGokyH114qPi3IxD2/7lgro4FTt32zkw54qS4PrmrLStEw7mXe9+r7o5Dyczrd1waUQPvZL1uOpwVXsQyPycPO1PCTkPxwUHFUf51j6f/7okyrolgPYAAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"4\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACUklEQVR42tWVr2/qUBTHJ5FIZC2yEomdRCKRtVUvVUsz8dLMMUHSiSXMEDJBGgRJESRFkBRB0oknEE8gJvgXzjufU+4eZsl7+5Vsyclt77m73+/5nu8pFxff9a991xZ/5EvzuinJYiBfBty6aUk060k4uZR4NZDhNpDw8VIg1LnvfB4R79aT1nXLgCAQzfoSKInurCvZLpJ40RfOuPi4in+2hACgcdUQb+SJf+NJ8NCV6TqU6aYOiBj4VVP8e19Qiva8GXj/K5FqG8vhkEq+CMSf1JdWu0TSdWCgibYA2WlB9NizM5BwZFjJ/5ciABPZvAbNl6GUm0jKdWQEqB5iUyWRK4lcc7G2BJB42TfAYhtJtgqMAHewWqhqrwJXu1gKBTs+p8Jz9RQreCCNHw3ZPyUmZ61AnYNENO9Ze9gnkuXAgMcajhSEjMht21b+hyLOKh5KNhtYlUhZKnueAeAC5C/1mYsgFDzUcpODGN4ghyJjzac6kuYZVSOcdF+IEJxJ533DQQ2K+6uAVlWoqYpVKPv90AjQb1b2Dkr0qH6AHOfoP7nOqG3nbX9XFzFVBVAjcW3AtHddI8UUQfDVVlDtcBOo+YZy+J1KpqydGpBAapTIF6HKWVdDDpKstJB9fMQ7gOcj/M9m5EKMZ6tWx4UHlFFVCq2MtplSJz84tx+fx0ac1tIiqseI7xrHUo3HVBRKyPmhPKkCCT5MvBeniWG/Ui8dj+OP+yBR6UvVSsiZ06ZCVwdsiun7p32SM519KnUfJ6SutsnJtPHX/ShhxPN+v/WeP+Pal6x1OIpVAAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"5\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACTElEQVR42tVUr2vrUBSenKyMjI28MjI2MrIyMjYyaoSJEepSUWhEoc+UMlFKRaAVhUwUOvFgExMVT0Q80X/hvO876X2rGlvf9mCBQ27Opff7cb7bq6vv+qw3iRx/T6X9NUaV8t+Al7tUmk0q6zqRfBsr+H6Xy9Mj6mf+dUSennNZLmI5HEoFIoE9QNNZCCfG0jyk4g5dabap9j8N+PBSyB6Ay1UCkEwP9ye+vgmY1311Ib0PlRh7XuXBkUyOx+nlRFQJAPW9y4REWqhvtok6oT26AWem6K0xGhLjKOYPiWT3fYnrUMzAFTMz7ydCZeUukbYtNWDnituXUrrwjcUZOB34JlYXSJTquTcHmRC/MZVRN9h3bh1dvzljzpEHqTINVaFlVVvFtDutIx2JP/K0T0cIzL1s1ZfiRIzkvYGna+7x7dw5r0SyRaTAnB9LlbdjDRn3qJyq13WqB3ezLnBQLMkkgNWR3obmGePC3OMfgSSLUIH5e6veTEzXm0VKwoyMBvjVAYDzetFCrglkU22tVdvPg3YoJMahcQVQHBbOfAmrDsgC85wSmTBDT4JFoH3m4s3Us5h6hufc2jlGoXmA9UusUygMoCw8qck3nUNqOwhmGBOLoAQP4M67w5itIs2BHQfJdA4UmvJ+BeWrUMuH8ilGQmBabYvf3OP74uvIwLBI4PrmWtxRZ2ECNTy4d9v7m3AqdW96SL+nZLn3aX9I51fJqqKt/O4BlD0lcKov+0umMmt1+Ygc4BZwrcT+xeqPPgT0ht399kbexcB/AEhbiVW/ps4pAAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"6\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACOUlEQVR42tWVrW/bUBTF+2cEhhoaGpoGBgYamhoaWgOTFeaCSS6IlJEoKoiiAksNiJSASimIlIACgwKDAoOB0bv7u3bc7qPSlq2VFunpfeTl3XPPOffm4uJ//RyOiWy2kSyvA0lXI3m3wNVjJjsNvLuLpXxIpX7Km/19rCN5OyCbdSRlmclBg9wWoVRVrgzoehU1IBRQ/7Iv3Dvs/yGQU6ZkVz3mRjuDIAwYKcvUALAHhK2Vkbqeng8kXQWWLZmS8WGf2rBgCuDrl2kDBmaOqczXoXgTz34z34YGJF4MxR33xZ25vw+EbBnLm1A2q9AoJqPdNrZA0A24cOJLfDPsmGFNUL6f30UdEOfKsfPeh56tX3e10rdp9TR6j+gbdoHLh8wyZk/WnQnrvJ2nnSFhgzOAZLqOZ0ML3hs3IHofe89AkmIky0XQZMm4j1sNWxBKP1lyD0Bkyx66mfmtmVPvDj65kq4Dkw3qgyvPZIgmA3EnrjHnjB0DkRaBTPW9n+r6pdtNd505q5SBuso7OQBzW0RK/chkiq4HBpLAxpiOZDGy80ylcC8d8Re+ycGd113falpVmc0Aa8AkBgKtYYWHYAEgyENAHiY77kAzhuUeg+D+Z1/+qO5/1LuCGWWFMx6FKXQ1/6xPzSg22qGb7L2ZZ0DPLsfvqmLbdDuCYTACnMrPzlUKPABgfPBXfeBXvb8z3P7ZnFYxOhOUeqc/vGlLPpUrAKwnFDSstPPJu/0pYb76aWpGxYTnvvMN/STd514e0SYAAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"7\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAABjklEQVR42tVVsWrDMBDNp+i7+gnZO3UqoUMoHQL1YKgHgbWYoKEUD4Z4CHhUN636FVV30knnkBYSnEADRwKS7r179+6yWv3Xj+itFzpEPXkhjb8vsArRsRicf1d7jNsBJyAhCyh+18Yfvq3f9wcksN6++vXzZjkiQhkvGhPBQHKZwAMwKAHg7ThlApvdRyYBal0PXJsisYwgAJAVOAFv9ddMhYfHp0i4t5cRoQcROJDYJYmHklxUBoMDcxUyAZVUg+jCm9H9TgQO8WIVQcXLFGU+6TFJjORUJEZndI7gTXyLisFvzcgoNjXY46ObmQpJyEgGKoMqITlXAXssbfYCEQeysztkWMoPcXTniLCxUqz3w5SrbEczr7JK4InsOaWQhGZTI2P8PW49YwkPPx0SIZkpCZxRxbxVdDd7gaq+yIzwQKVJgErfUmsakwnM5j9Uimr1xRMIPrgFxpHk206lTckrBE6uJ3A0dWcXXEhjUkQXf+TNqJl/tMG47UpWbLT4ipb2jn9KKnmhjvvi2jw/5gK11tLQbjMAAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"8\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACOElEQVR42tWVr2/bQBzF+ycMBoYaFgaGBhoGGoYaGgZN0cCkDERKQaWGBBhEVUGkBVRywCQHRDqDAIOAAwUHCgxG3t73e7nVqbQf6tpKi/TV2U7k97n3np2Li//1Y6oxim2K2zyBe5jj3YTtcYqSwuW3DPVhouJ6vss447cDKe5T1PUUhiJf1yNYO6cDPN6kCiHfm/2Yk+n6asJhp7I7e5yr7TJeTK5NCTY5OTLF7SrRYx268mLhXm4x2AHxIzDcNxSb6KgYAZrHGw8jzlQTFRN32nDl1oMI5F8Ld+8MZPoU7W8d4gOQNdCby42cu1EAOW870/C6wDlGEwr6PDZD0F8Lb2p0c4NoZtBbcve5Q39NgIoOfAdGRyCxQEpX1HoKyU2dm/syEuBnIZ/FJk4IlF6vfFznwktzPqsavY1TF3pbH8Xw4DDY0w1GktTQOGSHcvMA4SPIFK5dzOBEHSD4WyvO7FuOdBctgHB8bdD5WODyzjKOBjFdESBxIqEzqayMaESoEXxX9HEMIkfvkoy4IVDaj+o3T4kKSw/ufSTdWakwceU7ITCJA4+tuhTTjf7OR5XUDYaMagwfWXhCilMsZ9b/sYwCsPDinSuun0qEJ+NDXrKcjT/fcF0RhhAiPhCQB66O1wmnu/6XF5Q6sD71hHGEmDrXJaJlrQ5FVwaXa6sdESBxYyAQhH21F5KWVRzJT/34UqLzudCOhJjaxX2zV3IoabR4KqxEIjHJvNufUpSfIGT3s5cL/wB3sgL2s65DmgAAAABJRU5ErkJggg==\n    </data>\n   </image>\n  </tile>\n  <tile id=\"9\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACYUlEQVR42tVVoW7jUBDsJwQGmhoaGpoWBhoGhgYGGp2igpN6IFICItUkqgKiKiBSDCo5IJIDLNkg4IECgwKDAwYlc7P77F7InapeW+kirTZ5D8zszOzL1dX/+vGTAulhguppjof1EF8HXDYIn4HBocGoBIpyyoqQnSas6POIOHEBZ8tKDIYkMMwBY+aoqjman3dIH8co8og10f5hwL3ZHv3vKYSA+2jg5TX8Y43BETp1/TwnkalWdpzgYTPUrsX79088y9BfZOgtUvT53VkX7Clc9rEB/F2FQSW9Zg5uYWiFAKaHTokI93GoROT+zcDuhpOynFWhwP2bVBXwdgbukndLA39TIUgaS4CZcI8V1anQ1HdWjfNUiYgtxtyiYDb2u5Hm5c/AW2On/JFp9QgsKjgLS8TjxN6KJGiFTO2faoxqZoF1zUyM2cMz1JKM4DK5EJEtETL7pD0rrVW/pWaoZNrLcjfGqhC3Zy0xISBEglOD4NzYPLAPSGAiRI7cEG5G+AINp5ARFaQyrqz2jpgok18o8gq2ugBeWvCOlJdQ6q2oYNQKb0VVaIe3rXB9qGlLDYdBlTUVYjKtKKAqUAEhpPko/7IlFqxQzwX81RrJA7PQ+9aGUraCBBU8b7TL9O6hQiRqPNEe/sbLvX0n2s14+xZwEifOrBKU37nJtAuozQTDSFBnYc/EmgEBAyoxJnjITbn0/p/W0dnZnMhGdDb1l5Zcp4ooEPB19NZU5MTpSUI8/7iXMGkVaTOh2yLg3bbwzGcGAtrhU4XPe5LbkLrxZWDtoyX1ZX9K8iIqCZl+9n7gXyTF4JLCnrXHAAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"10\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACQ0lEQVR42tVVoW7jQBDtp5gaGhqaGgYGGpoaBgaGBvbASSmpTgVRFWCpAZFiYMkGkRxgsKDAIGBBgMGRd29mbQdVV7W9ShdpNJvx23nvza6Tu7v/9ePtGvg7A/+hgfezwvcR5yR9MvAem1uw5u0ZFPXviIWIJAHJ/S1zaTX7PxqETx3CbXcT85VCpKmOmTnYk+jcI6itEsskgrxDVPRILeAXFl7RwWfNO3xSiCcE28Et3QmR/2AQ5hbhwSJi+CQLBhEhI9gxKCI4OIz7zn0U827ikO7iVyA+gSQ9oi0bPRp1HnM9z4G0BeZ8PiuJI2Zecy01iTOQFMzsMROMAcKSU5O7QzFvE7e9kkqzhHnBjSmbROKYEbGWGEeado5oxojqHlnvBCWCN66HiJH9ijs5Q7HgmWU6E7Fp13jeJgqoygWaekkQxbQOKOpnV2D5mwStcxoPbkVQwvqsc8SZdfWA05Je/XWD5rxEc1pifiGWz+NymBS/R+w9CRHgschwPGQwZq1CmtNKszQTkv76S9eCk6bW3uNln6IqFlo37YrrTNcV93WvfJ6nsJd7HPeZZtknXG8exbix69aa1UHtXHSclggU0pecQs+rYZ0qYVUvpmci3hgXx1EU492XUYjEmebBXSeTYePjIdVj00kNAhVXLyYRIk5CXdfLj7+OQizxvEvpxI3WkbmpjCK0vr85bSjE2s3X/SAJyeSaxOPY9UyHezIeUfUZx38VcnJOx8tVlSJgNd2Tb/tTknO2l41eVHmVP9rnD/NFCxuaQAv3AAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"11\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACIUlEQVR42tWVrW/jQBDFCwsPFi41NDQ0NQwMLCy9vyLgwIGCgIAAEwMD62RgEGCpAZEcUCkFAQYFhgYHDI5M35vZ9VWV7qT22koXabRrOTvvN1/ri4v/9efqk7gStr4Tt+3kc4VzWHGSqO7NdoO4XS9893HCEKRIVMDKXuLDaGuOZwCp4dk17wzi8k7cpjPnFcT2AwziG8vCbChH1CITbW+l+deMuHU3O3Zbi46iIdIYMGkvktSDLM4iiyP2u1GS4yRxC0C81/P16XUg4YBGRDGARACIGfU37FedgXgYdwvQAJsbrFvdGUDu/QQYZOXPwj51KriG4HcY6p3UiKqBHSaNNuW+GXSvZQnCKJOu7AH6IDzBS+sRLV/ty1g+y4jWqnhRT3Y2ROJq0DU6jupMo4aDGF1PxwTkBLD2armHYZ9QnA1a2JkwMZqhrS9t/mx8w2iFiFSoMoG49SBwkJwndUxxXZkNwnpAhSp8+TYWuVrjA/UAfx+32kdBaoozyqKfnc6j6FeFK3y6V92cLbf5fWdoiV/TjBHmPEE3pwBJykGyBj2AkqTsdFiKTLAfUvYI+iHZ2/+ZEb2kcO5L1clVdZLL2x9vH0cVwZgpTAGA/WRiAYSrLwXf8XnxIBIdrEnf7UKK0YgZZvx6FLn5KXJ9NlvuRbJ20rtg+Yj9AyDux4+7kimU4dJZEgAgX38hOxDNDqIZ+LSPEtO8uIdRePf2iJ8AkT7BKeWMTHEAAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"12\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAAAhklEQVR42mNgGKpgztI5/5Ex3S2u7mxGwTR3CC6Lae4QYi1Gx1GZSWBMscVAJhjDDCTBYjAmOUTQfUysQ3BZTHTUEApqXA4hZDHBNEJqHKM7hFiLCTqEUBzj8impaYVg4kQ3gNggJuQQknMFqXFLyCF0LweoXiCRUQ7QBhBRDtAHYCkHyAIATRZdO8VgYzoAAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"13\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACNElEQVR42tWVrY/bQBTEAwMNDU0NAw8eDQwMDDQNDIwKqqisBZbOINKZRJGBZRlY2gORHHCSD0TaggJD/xuvM2+zl6hqq7b3ITXSUxwr8fx2ZnYzGv2vr7DoJCqsxFsr44+VvJtwd1xJVS4k3HYSl71MT4OEpZWg7GSct28Hss/n0h6WUtULud/OpHtcyb5I5KYeJM6tRBmAil6CXSejzLweCFdrHpxwd1zLfjfXMXUipklk0gxyexwkSNtnJ4IMTtCN9AXRtF4UK+WKTbPUoQv7Yi79t42DgTM3DwN6YCRCH2JcTzCEGH8yzo2/AaEwRe7SqdznMxWvigVE6UQi9rRWAMJ5Z+LMukLu8I44psWgUGHq3Bh/MYCpnCu/etFOCtqntXs4P0PcC7eHlbMe96+d6fvPMkEZ2QWKx4jjtmQvepmgE4RSkPQMghld7xq/Wgox78u4jO+ymQrynjqSXeLQCOCG/bpR17SIEIwfBxUn1PQJbhwAB8gwx075ULn5EYRiPlPfdooQhMJ0oKM7APFOMI7rmPg70ywkAgRd4RkR1xBmNE2vMYWA/O254dtOi7nnKeQb72PwTrQA9DF5N3hfhTm564ZGA1ei2v55GZ8fmDsBLacCLfUeY2uPS9eJs0s+Pl4H2JLRoddOBLv2Zdvx0hPXfsJpR+DMTyFYXHyPW/XVDiQt5HnVVe12iIfguA64iAj5ZkcyxTSC7LxldbWJQhHy3f6U9Mw4bVDWta78X5/zHZ1ZvLB/eOxTAAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"14\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACSUlEQVR42tVVLW/jQBTsT1lquNAw1NDw4MHQwEKjKjqWgkgpqFSTgoCAAEs1iBSDSDaw5IACg4IFAYamrzNvN70rqO7UL+kijXbzIc+8efNeLi7+15fZdmLWwHIv5raWbyOOyl7MfSfR2p963zmJmgFn/3VClBDk0T2wASqnIuKNk0kxyKQEDqPERwBiPs/qvBZzU/tqaTmqNUUvNge2TuJdIIYAklsK2Pn7BHg/8bLWClmtuQ3kN506YAunhIkT+XEUmVQgoxCe7SjJIz7vAXxPEe5p8e9CTAESWG1Lpw9NylER48HxEp9fd2IhgrYnu1HSSvSkC2kQM21F3+93M+n7hXRNJg/FVLrj/G0h7K/ZgByVm2tUf1VLvPb9jYEIVdvQc62+8raTSFuB36QgnopIehCtugaxe1pJXV2CPJP6cCk9RPB8TRzSfE63ksEB2s/TIlQWbYgA7W8zauhiEvMOy9NB5Cdsn55EhtMdsFIHujZ7caI/i3ici6Mz7R+OmPy3iJc7e7/1ghRM/wHEaAExgRusPml81dqSxtvv3AJYyUM59WLKmZ4URDfebgWJuWQw0xo8JF5FBEERgmhJvAntKLwLtJ9tmZ98MAeQ9/1csa9mWvkr6/8aRgrIw/ghE+aXzwZFkJzLh6N4DiNd0Gy0fgJsOyi5Vt1kHxtHdYFCrvY+F2H+mRcVUPgpoAiK4fhlCCPFfN5CKoMja58PToi2IHd6TxlEWM8tyF3wdX9CIaRRWE5cSpyS80L6vn9DuBGdhSCY733OM8S85MLHyAKwAAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"15\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACUElEQVR42tWVr4/icBDF90/BViIrschKZGVtJbKyFsmKS8CsQJANgoSKJosgAdGkFYgKxFcgKlZUnHn33rTcj+Tukg27myzJZL5pE+Yzb958+/DwVX9eXsNb1xg8HjH4dsSnFfZPDYYbh+HWwc8ay17uMMgIsyk/DkSFgiswqYDgDPhFi2FGiJXDaNvAXzsD8/aNwbxb4Rhd0dABowIYXxg8T3iWAqN9izFhgopAVMdnttHcq0h9TlGeEqTfgbhhMEeXXwoEVa9C37kvFTSSvIGnsQjiqTSIN4GosOJ5E+Eli7DLYhwPU4QESF8JcaICWWtgAc+SXmMY8zwh2Chv4T/WnU96rwxuMP8bTVkkLBijuc4tu8vc4rifoq5SO6ccx5wR0Qth3SmhEajokBBDFpIqgtKzUa+Ktyw7RRQrgix/25qySPGyjyEAhXMzBiHy2ELvd9sIDZ9JifI0tWft6wLhpRvLWN5Q508svGZRjkHFBSejevtuU7xVr0T+FxD9uTpVluyCUtcah0DcefYT4gbcNHPLET0SUZGw6sx5U8WUkFkPrSljAMvS4t+jqLqOZUABlFViZ1OHEILZyRvb2IAnGoU2hF2PtRFLZ/m2mjYCSq8NeZMZ3WVm81dBU4dKuHpm8r/kEfQ+pAeStjNjzDxip/KFyX5g8XO3mt4998IfW0GgI9UwqJsqBJm6zpC2CUV/UfX3wbtdSCr2vA5RmwqJjUkQzi2QoAdQcZoy4Fg+7Eo2BWhS2wyubKS7Ad3FFBT4vI+SjNhcF2bU8I6OfwC3fgnHe4r96AAAAABJRU5ErkJggg==\n    </data>\n   </image>\n  </tile>\n  <tile id=\"16\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACP0lEQVR42tWVoW/qUBjF96dgkZWVtUjkZGVt5WQlFgnuzSAQhCCagGgCgqQIklYgKhAVExUTFc+cd853C1u2ZAvLtuTd5MulN4Tf+c53brm7+19XUSbY7mIs5yHCCvg1cH0eIyc43z+gOo0QPQMRgGHJOv6gkG0Wo6rGKA4J1mmEup7QgQTRGUgk4AQMKGDI5+F3OnLpNCe4Pk/MdlVxTKwEe6g7AQfg/ug++2WL/qL6uhBB1a06VcfFcWRVVSMbQfv8ByFBSUsgwTH3YN8a3NvU6O9r+KcW3qFBf3ODEIFVy1WE7SbCeuPmne/oRDlC8zQxmED3ZWc7HQiyBoNdi8FjbXuQNvAXFLFpzAmJ6K0KfGj1ljABzF6mfE0BF3B1Gl+t1zi8FUFnZ3vUsDiKsHQjCCQga01AwGd918voypwiHgurVx2PsVyErkvVwe2y30TQfgF1LkHrNL6OI6C9yoBcGAg4I3DBzumGHJAQ6z4lWHURsGDNJSTHu3v9Ou0G4q6zmkIb5sGc6pxomsm1W2/OLgnzj13nOptV1n1vRtiqctC34Hej6NJe12PbJUwiwr/AiHdeYi5OKHw2Z8LtBpzgrJ86cJ8C5EBPJRG3hFEgzV9BiznjmAJ05/WsAOrFo249ChDMV+gYOC9zoTPLVy54H4bvsxXDBStU0jVrBa92ZwJqBAPZrquXujKbP0v9rUv2D59eHLDuBZ0WNmsl3Cr9ZvDb5TP5dq3Slztu3XbJ/rU/pX7WBWyaW331d/4B+NMC1rjos6YAAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"17\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAAB/klEQVR42tVVLU/DUBTlp9RWPln57CRykv/BD0AiEBMTFTUVFRUVT1Q02QRJJ0geAlGBmEBM1l7Oue9t3QKEAIOEJSdru6Tn4577dnHxXz+J85JUwGIlSd7LnxGn3VZSEKfNIEnpAxyuW6DxvyeEhGkL8gLk9SBmsxPjtkign7AXc04hhsTlIFkLQgjIHkd1m+ZeTMM0hjAKkjOFLt7/NJH5g4i9H5U4c0AH1FsxAMnoPtuMYiCAiSQQlCCdpPaTIKLxXxOSIdr5KDJ7BNaj2HonlgLg3BZbsTlEFENAOUGToAAKuVkF8iKKUUG9pvIx8RMI4Mg2ELARmTvRa5JbprAOCdh21BRMHZxrN5jCnpwduAPZMvaCz3hdHYkpjrbGPOzk6kU0UkZOzF9CAiTht30OYmbdKJe4T10YhfYAwnQzulBQdc0e7AUcp1BFkfl7QjhTvExFIHoWTIFnhEUnMvxmMIqT+FlEjmDpA+Gyn0axOHLu4tpGAR+OYob4OW8S0Wm6DiIOZYTzzEVxFMAk3DA5u169Xc0ypvKVMnI0PHA0mQpkOVaxjNFzLdEXjiAtYtylP0UXV/Kn54I6Zho8fBb+UDyeCdp8kt/2U+v3rtsQ+flOQo6CxC4Qq3tGftufJlD1it87kqvhICCph+n4/axcZ/83LOKOL0LpvvueV8nivBN16X1tAAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"18\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACQklEQVR42tVUr4vjQBTePyV25MjI2pGRKyPXVlZWHeXEQc1CKwoXU46IslQELiLQiEAiFhKxYkTFiBURJ2Lffe9NuqUcy+4t3YMrPObHy/u+731v6M3N//pruzkdyik9pDH1zyv6Z8TuuKQaxHU1I/u0EHI5NzPE/POEHIopWbukFiQ/sztybgUHsM+nIoLz7eMcMZP1asTSqV1Id+64Ets5PBnfLX1eHFnSwy6WvQRc+TBxVBHdOqJJM1DUEMgWEkIGATT8EBJxplu8CGJxYdmTeSQK85506Ujl9v1C+ONJNwjAbUd094QVAnTTy8yHX98pRm76TBRb5DmOOBORacaakZwjQt4AQ2cQUrnXhXBSui2JogLgCFNACM6mHASIhbAb8dETRQBmoVHnv2FCgxy7x2Fy1FcDTYCjcwjYW4kgqc9CAnQcpC0F25ZUaiksejgA68cuWH004Jz1XhyfIWbCOQCHEM3fh52/03uHPe53jvTWkt7ZC3KFu2DTes4LIYkXcRKiuBBgGvNUGfYF9hCnKggEuMlAkjovmDtMrIRKfK0QrWtPhHMADMHf+Hh1FPLRHlGMznChKIcwiFTrlnTqxYkLbDG7hRmHuDNJL/fsgNr4ZgST8fbt+x+jFMAiKb7H+rWWlUHFVjgjXbPN6XmMvAppMUb2l8R/CGHyk31fDhckMiKMQW/8/kUsr7mvudofkgCyIzxffiNrPw71rZb17EAt8Wl/yULCD/b0wLbjO3nrcV1dCLvBpPcHsf2jOL8BAQzkc/Yiwa4AAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"19\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACN0lEQVR42tVUr4vjQBjdPyU2MjKyNjKyMjI2srKyticWeuJga1ZUlFIRaEShEYVUFFJREVExomLEidjv3vsmuestt+zt0j24wGPIJOT9+iYPD//rVZ/GsiszWS0SsdeZ/DNic5lKBeJqP5LmPFFyvT+MgPHnCdltM2maqdQg2eSpGDNDAiPZFJmK4PP6OAZGut6NuHdKd+Yy09gJR8a9KYRNukSmslomP58xlQ8Tk5Ru6ZSO6+NEoWQQ0H5/cmKYzGmiZHz/Vlx0FIkakcGplXcRE6t1Krsi1YjprkLcJOo7J9ltMq19UnFZK5LsgatIDAFhaSXctxLkRoKjfV0IFe+6PtUBpnwDAT0x4+3dVTfJWDtzwwgByQWEcJucRTE8AFhTiBlAzABCvEUt3rz6JeRlbMZMf4ud5CrkMNJ1k2e6zwr4LgXzwynIh3R+AlHZSrgwEkFAWFjxSyNe3oi/aMR7hoCt+YOQ7lzfTnvfO/cMErAQxjpINkbUKd3ZziW6jvJWBrlVQSHWaIv7A+IvDERYR/7N4fWp7zq9Pd9OzFhiOIpLAC4jkMRwPARx0rq9AdwmhUhAp18r8ee1I1XX2FvXfz+M/fmmY/aZwbXGzMlmtMdWBUWIm+CQMWKNfN1IcLAu6vydxC8vuoyvzmGMiOOz67hH8Ixuv8DtEqRriJh3PRduvdsPiY5CdMl+6dBHjwHIgsdaSSmA8BaV4tN+yXTlE+x32bllzG8N192F4Agp6eMO+LjjH9KwCMHNaVe4AAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"20\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACS0lEQVR42tWVrY/bQBDF708oDDQNLDQMDTQMDDQNDAyqogOVUlApB066kFNlUBAQKQaRHBDJBpEcELDggMGBBQELSqbvza7dkqq9T6mRVjMZW57fvHlxrq7+10/0tRSe/qqWflbLuzXu3ZTC8yEDAJpH97VCtPmbNY73jQyOTuLcaiNO3/tUSO9zIdGX0tcygiDPzeuBDCuR4aNIckLMnQyPIh83jfRvPET/3kjvNgDwAErjxuj1Zzeuq5nYx6XEBo2tkzEghoAYPYjElZX4e6NAcdZIcna6EsLye3Tt16QgVGT3BEXKairlYSrFbiL1aSbNw0JSNJ2Jbz42TtUYACIBHFcywHrGFsqssaY96ifXrUnXAoBo/RePsBmbc+oS0xNgu0kBsBRznisUr4/ggxQw6QUwZ5FJgwigMSJ9kmQEcgoTXRedObsY8l+Nj74ZH25Oc6H0rLUQxX4ixsxVCR5jFmrGFBMPDk5ssxBx33RqrQUFqFD/tvZeWQU16JnMeH9QldVvHmkBOGkbGzQrA5CCBV9Ye6eqWLuUbZ5qznsmlVeCKxv9CMbdI9/hHJDvCAZ1APfnVRznOjVXwmmZl/upfrfNUtVwAOBqFKxVC/c1UENVRG3qAHAOigBoAFXio/13M1JuNSNhQiPNK++VzqyoucsdIP2qOAAPvZJcvAoJlHnRz7Ez5TrtDMlIheowMUF4j9G1ecVYf7UXkkp98A9ujanmPczUK9vcK8UV8PqbvZKpRvueoCGpQFvj9O/2p6QK5JMg9/zZjX8CTEsEAZI+lIoAAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"21\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAABfElEQVR42tVVoW7DQAw9WFhYGBoYGBg2RQVTpIJWChgoKCgYGBgYGNh33+7Zfo6jVZuqtJtW6ZSrk/g9Pz9fUvqvv+a4yt3zWlZb9r8H/JQyloC/bHK90z3jdwPuATYmXfuUh7cq91glPrxXEmtGXYjdvOL2vM7Vg17xHyBC6lH3iEENEMEziIPMoooJHsGkSiMEHwCUpHgPRBGnQlcpcglY9pYM++GjFhB6AUT6181U/W56nx6R575TREBLIoJLT01WVigKWGIkrLZJgU36ejt5wL1R7uEqhJHfMGbAsYdIgORkLjFUaNXENpCcE9wnrz7mxfN471CUi36CkrO5FnkL2/akgN5bEjCJmbCxieBe5I/KnVZfvMF8P7reWzJOQKiAxGKlVMKNauZ0HwRvXDd+RoDyM4bKOH4wJ/ZSrfUYvujCO7i/6ByIhoqOjj3mNOAqbTRv3O4kLJV2Z03uUzLqFMzGDa0oz971W+BngynDNjR/8VGSM2HB2f8JRvClN9IGbE8AAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"22\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACO0lEQVR42tVVLW/CUBRFIpGVWGRlZW1lJRJZ26CqlmZiaeaKICmChBlCEM2CIAGxpAiSIkiKmKhAIBD8hbt77uN1H8m+P5ItuenbbXPPueect9Vq//XHvG6SOTBV8fnPgJu9JqHaU5vMsUnNiwaZQ5N0/9eAraFFxrUh1bo0yGYC1tQi9HFGT79H78eAHR6GzVqDFvljl8y+2hbbA6h+UVdKcK9x2SDjypBvG6wMyHwZuLyPqNiEdDgktJh7VGwjqbKMKkLugBXotSictylIXQHEu3q3TgYrohX6lCIARt3OPMqWngzO1wHlq4CiZYdOx4TPvpCL+XdUtg1psgvkDGLIBYgAGKogIwjrm4oUPCRb+gKAc7ELacEEAFzuQCqmDMD8Ln+izGTLxFiBZOWR0+c8MFBn6kghGyBgpzbVujW5LahnYcXg27QjWyZzfm4COWNDkOiwzABEH4QWc7+yI7vzheDplJC2zLuxyR1blKxZvZlbWYOs2DO7sg+EnNR5JAIwbIihZRkrAls1FL3ojuXnrUFOKwHgOG0zMV/6IAF75MyqhWwJVIKqL9V91QqRd5+wxLE88bEiw33YwGS0EgDRNmk1vIEt/cM+lsCisjMp1IfDqAfK87zdAcqI9J7YhuunCcp3sO9sleSGS7behN+7jtWtWAWSBwWmVBG7diqYCduhNy02yMbo5/4gAQRbCyADx1O3IoENAaotyr+z8btEztdVhytfg0BU5eTP/inB59NxJEHFVf7qnAcPbLZlMU2ZQwAAAABJRU5ErkJggg==\n    </data>\n   </image>\n  </tile>\n  <tile id=\"23\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACPUlEQVR42tVVLY/iUBSdn4KtrKzEVlYikVgkshKLZMUmjBmBaAiChIomVJC0okkRiCdGPIF4YkTFmrP33DclzSa7yczOTDKT3DwohPN1z5uHh+/6115SnMo5dtsp4nOHLwO2zytUAlydFzDXJeIGGBsgbByC3HwekVMxhzErtHWK42EGa9fiQIqkBiYXIM47RLlDdJGz+SBHCNQrrQTYPq/Vdk7bpDp0JCoc5r+8E5xIIomuHUb79v1ECEq1VEoibbPUMWapEXQvG0+GzlyWGJcdEnEiIYHS6fsgM0riTUQIzNntZzjlMxxzn3dVLhTI3dZKgOSGzpBQIvsQZhbx1qkr0cEikAlzOTMh8q8doZ0nASOA2itbfhQCPbC5ru7WVwNnnFsrkc5tMC46hGdRf/Az+tEi3BpMhFh89c6MtkLkscJA8Qq7bOpVcmp/UqGS4B7UqT4noeNhfo+D9pOgkpBo4jO0kvFNwPai+lEI7L0LwV7iYCQ/Wz9/Eul7Pdx2BZKTz6wQdaKa5Pg9RkPgPqaJtCHtPDCryTjYjqnzSxkUFqOn9k7gr1H0mVq70pPEPJlUSZDMMBp9LZ/HrKPYnEj+Y9ZRiESZ9YtI4MK8bRl7e/V8raKlM2r9TGOjU3w+swIs4KFYzZNkWMNA9mF0MP9fx3sryoWq9dV7dUWcSgrpv9isVZQ9UNWFV/6hd3+vmsD9cmpE4gprp9dyLaqz9vOu5L6uWkHeCbXfDV7JdODL/ilx+dxto0Pw9/7Ob7W/DzcYBXyyAAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"24\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACK0lEQVR42tVVr2/CQBTmT5hEYpGVSCwSOYmsPVnZTF3mOrGkCBIUIROEIEiKICmCpAiSTiAqJhAT/Rfevu/BwUZGlv2AZCSXu757fe/7cVcqlf/6C0dt8bqeDju9las1rj3UhMProfnAk3DS1nW9W5dGr3E5ICxeva/qqN9VJVr60p8ZiScdCWe3YnpN3XMA/5wxGQ4XRrxHT8xTS9nzebg0umYsgC2dbkNzCebm7ubnQIqNlXwVynYbSzL1wbIj/bkvASQnoLQIZTzzZTiFAjgDjHGOMey8o8/NUVOyZSDbl0i+1ZhjPPElRYMEMrNItgjA2BcLIHxOwJwKsGn2bCXZhMq8BOD8OZQUe+ncSFFESoQkcuSdbZyv8RKala8ogDWLJADAxmxSbCKVlXsZlUFh9R97jCfI57vZYgeYJJhHW1iD9TQOEJyP1wkFxqMdK/qYrQJdEzVlJHIWYpyAkqnRovnaKkMWL8tYnGU8D7SNYLivgNkYgAsHArkkwBpHBT6RjQmcGdtCAcrLAsxjYTZ2NvH5ABY55WtfZz0veP9U3bNWqLwvMVhEOo/hu1ODIMygeVCCcppBS1XgNc3U612czYrC6kj3tnyQ/qufk1fnE9lS3AbapkqBjVPJSc0Y7XRAuP+r63i4FQCUuWaYeS1dQ43PjkzzFc9G/+8+SGxyYP3Ob/V07zstcuAu9kl215UA9NotCcDuD214vT8lHkSedItDym/ET+u8AfUc39TwIyvtAAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"25\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACV0lEQVR42tWVr4/iUBDHV1YiK7HISmQtElmJrCUnLlWbZsWlwbHiEhAkrCEXREMQJEVsAoKkiE1YsQKBqFjBvzA3n+k+cifuR/Z2NzmSyXt9fW++P2Zeubr6X39p3pVgHNQxaMqHATdvm0IEEwWeBdK8btjcrb8bcHvSFn/gW7RufAnnobTnbWGdOWvuPWtvrrg1bon3yZPga60W9QB5155k9z2ZrnvSuGlIb9yWRMvTUGcg80/AALjR2W0ODFpGKJl1ZJhH8m3XN9D+vGNxeEilWMVSVSM57FM5PmV/TyS8CyXMw4tK5iRNV5EsFChVpZ28I/Gk3sN6pjHcxeJ/8c0NiHGmWPfleBxKpCWCxOHxN0ToZBI6cJIxYisgHEatA13sE/E+ewJhR/D8PJKO3op0GRlgqeqrk7rwmFqUu0S4PYwXYJI4qwHDYutqtRtrqSnkim1fFmorNcfuQpOwP5nr/CmVZNk1uzdbBVnXZDb3dWkYceL4QgJylT4fHn5wBMXUFQeC25YpQsF0HctIlWNtqQfZM1KFhZI7nDJzCqtxgXfltp4DCiF6wcjoHkb6Azd+WQqS+HqlUFGq7XVzdQ3IqWLPcBapaiWiBEtVzTpjsVK1eq46qeJjZrFRUij/yfo//WhArI/vaKDhxbbRqqdgsSzyntmKGsoCgUjLVe5riwFzpHDi1deRZMRiGRsZymKJdcSlukFTey5feoC9pVp9Pk/f7oMEiFNNw1JbAN2dR3GlTjly7/ZJBpCGcs1V7pTEPjObefdhf0o03/l5Ktk2th55bZ7vlm2RtXeU/5AAAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"26\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACSElEQVR42tVVr4vjQBReWVkZGRsZGRlbWVkZOXY4FU4sYcUR1nVFIRWFrikloiwVhVQUuqLQioWuOBGxIuLE/gvfve+ls+yJ+8F1e3CFIdOZl/f9mDcvV1f/6y+89RGOQ9j7HqqnFP8M2L/zwRFOQoSzEP51V+du/WLA0SSCd+vpCG48xGWMbJUgLfsodkbX3D5jPwzYlj2kyz6CcYDOp44Cci1bD5CTwKKPh4PVNc69L57GmvtY185S7GwlqLObCpk43wn4rAczoRMDBZ+uDQqZH58yHfvHFPtdiuZliL8C5lyBOS8juL3eogWeP1pMNwZakBJHEq9NgeNzJkQSbDcWdT3E8ZChWhmJN/hlcTERrXVWcq1701VLOSco96g43yTIZ33UzVATM9773NZAthyg/ppjL8CMpxMkRTfq51yfb8CpBDtlBGMCrepTdSfjCFnZgpIA/89F9VzUzUXlgzyPYvFWriKVbgWsERdevxXqAI/COVELiam8Q3KN/B9u3jlC9SQRL2KEd4GScsqdxXrWUpBWzn66TtQtKq/WtlUnie2sLT4qbV4KtV7JSAyfWh9C5Lf33AHTQnuq/EpedjfCjOU4xD0jZNiMqJJWVyt7AhfFda6jWCZK8Afr/6ThENTdax6PI+WPfCSjqK0DGcYROKR6Y0ia75CIqj5kOKvzMRmPhiRYF60rbS/gvtaNtGV1TBzSYxyF6tTHdUJew1GgyQnqOl8sDed9S2YMYy/6LXjrDXRGWjIBO9edy34LfvpREjLn9P7vqg9kQ79shN4AAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"27\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAACMUlEQVR42tVVrW/bQBTvnzBYGDpoaBgaaGhoaHrw0HTQKkuZByK5JKoCLCsgkg0iOSBSAiI5YMCgwKDAYKD07f3e+bwUbNW6dNIsPeWcD/8+73Jz879ezdlQvVNUrCJS+Yz+GXD3NKcDAx/2mtpvCfXPqb0/ah7zcUTqrSK9DqhhkHITU9el7ACvKyUk8HlzMjxaXq8G7JRCXfeUiu2Yx50FhCNtmwyOzKnII1nLsCvvBvYXPk3uJ1SwonQdMVhCejkTF9RqRi/fM0uGlbfnRMDgTj0Qy6qYo7FEQPKPgPU6FHCsvaVn1yufHKmkiiheTIUMnEk2Ib30mTjRczSuoEKunY+xNUz0l8B4sHc3EQAMVMZQzANAlQcUfvUpePBlrRgUD+371JaRCbhCGhZwGVu2jYWUxHS2cb0Cdsrihynd3t2St2DVXz6RqUJKlgGVUMM/KtnWYh1LHBgohM2OhI1AS0Evi+mcaB0J/m7H98UlEad+mk/Ju/8spAyr1Kw2Yrs7FOxoM3U5A7hmUvNVOD543KKsFOrFJZAZdovslLP5fRRuQAqOmDzkCSjdKy5XJPGUG1u+ciibcwPvF0zC7Q5MPZB6Zf1bl+tBynmiZI87tv+oButj2W5SMFYj1m/dYWSjAjmMqP6bAwq2YhAF8j2MYEbsRExSMLxf/VTaHLUU86pn/6j6ZLeVIwGFst+5J47cx/0JnaxSV67DHgTsDrjqEfzWhZz750yajiP4vc/5ASZt46J2q67KAAAAAElFTkSuQmCC\n    </data>\n   </image>\n  </tile>\n  <tile id=\"30\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAAAF0lEQVR42mNgGAWjYBSMglEwCkbBSAcACBAAAb475JcAAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n  <tile id=\"31\">\n   <image format=\"png\">\n    <data encoding=\"base64\">\n     iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAAAF0lEQVR42mNgGAWjYBSMglEwCkbBSAcACBAAAb475JcAAAAASUVORK5CYII=\n    </data>\n   </image>\n  </tile>\n </tileset>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/wixdemo.wixproj",
    "content": "<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n\t<PropertyGroup>\r\n\t\t\t<Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n\t\t\t<Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\r\n\t\t\t<ProductVersion>3.0</ProductVersion>\r\n\t\t\t<ProjectGuid>{c523055d-a9d0-4318-ae85-ec934d33204b}</ProjectGuid>\r\n\t\t\t<SchemaVersion>2.0</SchemaVersion>\r\n\t\t\t<OutputName>WixProject1</OutputName>\r\n\t\t\t<OutputType>Package</OutputType>\r\n\t\t\t<WixTargetsPath Condition=\" '$(WixTargetsPath)' == '' \">$(MSBuildExtensionsPath)\\Microsoft\\WiX\\v[[Version.Major]].x\\Wix.targets</WixTargetsPath>\r\n\t</PropertyGroup>\r\n\t<PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\r\n\t\t\t<OutputPath>bin\\$(Configuration)\\</OutputPath>\r\n\t\t\t<IntermediateOutputPath>obj\\$(Configuration)\\</IntermediateOutputPath>\r\n\t\t\t<DefineConstants>Debug</DefineConstants>\r\n\t</PropertyGroup>\r\n\t<PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\r\n\t\t\t<OutputPath>bin\\$(Configuration)\\</OutputPath>\r\n\t\t\t<IntermediateOutputPath>obj\\$(Configuration)\\</IntermediateOutputPath>\r\n\t</PropertyGroup>\r\n\t<ItemGroup>\r\n\t\t\t<Compile Include=\"Product.wxs\" />\r\n\t</ItemGroup>\r\n\t<Import Project=\"$(WixTargetsPath)\" />\r\n</Project>"
  },
  {
    "path": "src/test/resources/samples/langs/XML/xhtml-struct-1.mod",
    "content": "<!-- ...................................................................... -->\n<!-- XHTML Structure Module  .............................................. -->\n<!-- file: xhtml-struct-1.mod\n\n     This is XHTML, a reformulation of HTML as a modular XML application.\n     Copyright 1998-2000 W3C (MIT, INRIA, Keio), All Rights Reserved.\n     Revision: $Id: xhtml-struct-1.mod,v 1.1.1.1 2006/01/09 19:23:30 rcrews Exp $ SMI\n\n     This DTD module is identified by the PUBLIC and SYSTEM identifiers:\n\n       PUBLIC \"-//W3C//ELEMENTS XHTML Document Structure 1.0//EN\"\n       SYSTEM \"http://www.w3.org/TR/xhtml-modulatization/DTD/xhtml-struct-1.mod\"\n\n     Revisions:\n     (none)\n     ....................................................................... -->\n\n<!-- Document Structure\n\n        title, head, body, html\n\n     The Structure Module defines the major structural elements and \n     their attributes.\n\n     Note that the content model of the head element type is redeclared \n     when the Base Module is included in the DTD.\n\n     The parameter entity containing the XML namespace URI value used \n     for XHTML is '%XHTML.xmlns;', defined in the Qualified Names module.\n-->\n\n<!-- title: Document Title ............................. -->\n\n<!-- The title element is not considered part of the flow of text.\n     It should be displayed, for example as the page header or\n     window title. Exactly one title is required per document.\n-->\n\n<!ENTITY % title.element  \"INCLUDE\" >\n<![%title.element;[\n<!ENTITY % title.content  \"( #PCDATA )\" >\n<!ENTITY % title.qname  \"title\" >\n<!ELEMENT %title.qname;  %title.content; >\n<!-- end of title.element -->]]>\n\n<!ENTITY % title.attlist  \"INCLUDE\" >\n<![%title.attlist;[\n<!ATTLIST %title.qname;\n      %XHTML.xmlns.attrib; \n      %I18n.attrib;\n>\n<!-- end of title.attlist -->]]>\n\n<!-- head: Document Head ............................... -->\n\n<!ENTITY % head.element  \"INCLUDE\" >\n<![%head.element;[\n<!ENTITY % head.content\n    \"( %HeadOpts.mix;, %title.qname;, %HeadOpts.mix; )\"\n>\n<!ENTITY % head.qname  \"head\" >\n<!ELEMENT %head.qname;  %head.content; >\n<!-- end of head.element -->]]>\n\n<!ENTITY % head.attlist  \"INCLUDE\" >\n<![%head.attlist;[\n<!-- reserved for future use with document profiles\n-->\n<!ENTITY % profile.attrib\n     \"profile      %URI.datatype;           '%XHTML.profile;'\"\n>\n\n<!ATTLIST %head.qname;\n      %XHTML.xmlns.attrib; \n      %I18n.attrib;\n      %profile.attrib;\n>\n<!-- end of head.attlist -->]]>\n\n<!-- body: Document Body ............................... -->\n\n<!ENTITY % body.element  \"INCLUDE\" >\n<![%body.element;[\n<!ENTITY % body.content\n     \"( %Block.mix; )+\"\n>\n<!ENTITY % body.qname  \"body\" >\n<!ELEMENT %body.qname;  %body.content; >\n<!-- end of body.element -->]]>\n\n<!ENTITY % body.attlist  \"INCLUDE\" >\n<![%body.attlist;[\n<!ATTLIST %body.qname;\n      %Common.attrib;\n>\n<!-- end of body.attlist -->]]>\n\n<!-- html: XHTML Document Element ...................... -->\n\n<!ENTITY % html.element  \"INCLUDE\" >\n<![%html.element;[\n<!ENTITY % html.content  \"( %head.qname;, %body.qname; )\" >\n<!ENTITY % html.qname  \"html\" >\n<!ELEMENT %html.qname;  %html.content; >\n<!-- end of html.element -->]]>\n\n<!ENTITY % html.attlist  \"INCLUDE\" >\n<![%html.attlist;[\n<!-- version attribute value defined in driver\n-->\n<!ENTITY % XHTML.version.attrib\n     \"version      %FPI.datatype;           #FIXED '%XHTML.version;'\"\n>\n\n<!-- see the Qualified Names module for information \n     on how to extend XHTML using XML namespaces \n-->\n<!ATTLIST %html.qname;\n      %XHTML.xmlns.attrib; \n      %XHTML.version.attrib;\n      %I18n.attrib;\n>\n<!-- end of html.attlist -->]]>\n\n<!-- end of xhtml-struct-1.mod -->\n"
  },
  {
    "path": "src/test/resources/samples/langs/XML/xquery-tutorial.xspec",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<x:description xmlns:x=\"http://www.jenitennison.com/xslt/xspec\" \n               xmlns:functx=\"http://www.functx.com\"\n               query=\"http://www.functx.com\" \n               query-at=\"xquery-tutorial.xq\">\n\n  <x:scenario label=\"Calling function capitalize-first\">\n    <x:call function=\"functx:capitalize-first\">\n      <x:param select=\"'hello'\"/>\n    </x:call>\n\n    <x:expect label=\"should capitalize the first character of the string\" select=\"'Hello'\"/>\n\n  </x:scenario>\n\n</x:description>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XPM/cc-public_domain_mark_white.pm",
    "content": "/* XPM */\nstatic char *cc_public_domain_mark_white[] = {\n/* columns rows colors chars-per-pixel */\n\"52 53 17 1 \",\n\"  c black\",\n\". c #111111111111\",\n\"X c #222222222222\",\n\"o c gray20\",\n\"O c #444444444444\",\n\"+ c #555555555555\",\n\"@ c gray40\",\n\"# c #777777777777\",\n\"$ c #888888888888\",\n\"% c gray60\",\n\"& c #AAAAAAAAAAAA\",\n\"* c #BBBBBBBBBBBB\",\n\"= c gray80\",\n\"- c #DDDDDDDDDDDD\",\n\"; c #EEEEEEEEEEEE\",\n\": c white\",\n\"> c None\",\n/* pixels */\n\">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\",\n\">>>>>>>>>>>>>>>>>>>             >>>>>>>>>>>>>>>>>>>>\",\n\">>>>>>>>>>>>>>>>                   >>>>>>>>>>>>>>>>>\",\n\">>>>>>>>>>>>>>                       >>>>>>>>>>>>>>>\",\n\">>>>>>>>>>>>                           >>>>>>>>>>>>>\",\n\">>>>>>>>>>>           .OOOOX             >>>>>>>>>>>\",\n\">>>>>>>>>         .@&-:::::::;%@.         >>>>>>>>>>\",\n\">>>>>>>>        X%:::::::::::::::&O        >>>>>>>>>\",\n\">>>>>>>       .%:::::::::::::::::::%X       >>>>>>>>\",\n\">>>>>>       +;::::::::::::::::::::::#       >>>>>>>\",\n\">>>>>       $:::::::::::::::::::::::::%.      >>>>>>\",\n\">>>>>      %:::::::::::::::::::::::::::=.      >>>>>\",\n\">>>>      %:::::::::::::::::::::::::::::=.     >>>>>\",\n\">>>      $:::::::::::;$@Oo XO#&::::::::::%      >>>>\",\n\">>>     +::::::::::=+          X$:::::::::#     >>>>\",\n\">>      .#-:::::::$.             O-::::::::X     >>>\",\n\">>         @=::::@               .=::::::::%     >>>\",\n\">>           O&:%               .=::::::::::O     >>\",\n\">              X          o    .=:::::::::::&     >>\",\n\">     X                 #;::*o.=:::::::::::::.    >>\",\n\">    o:%O              &::::::-::::::::::::::@     >\",\n\"     #:::*@           X*:::::::::::::::::::::%     >\",\n\"     &:::::-#.          X%:::::::::::::::::::;     >\",\n\"     -:::::::;            .#;:::::::::::::::::     >\",\n\"     ::::::::*               @-:::::::::::::::X    >\",\n\"     ::::::::*                 +*:::::::::::::O    >\",\n\"     ::::::::*       X.          o%:::::::::::O    >\",\n\"     ::::::::*       #;#X          X#;::::::::o    >\",\n\"     ;:::::::-       +:::%o          .@-::::::     >\",\n\"     *::::::::       .:::::*+           +*:::;     >\",\n\"     &::::::::X       %::::::-@.          o%:*     >\",\n\"     @::::::::#       X;:::::::;#X          X@     >\",\n\">    .::::::::=        o;::::-O=::%o               >\",\n\">     =::::::::O        .#*&@. X;:::*+            >>\",\n\">     @::::::::-                o:::::-@.         >>\",\n\">>     -::::::::%                @::::::;#X       >>\",\n\">>     @:::::::::%                *::::::::@     >>>\",\n\">>      =:::::::::*X            .$::::::::;.     >>>\",\n\">>>     o;:::::::::;$X        .@-:::::::::+     >>>>\",\n\">>>      +::::::::::::=$@OO+#&;::::::::::$      >>>>\",\n\">>>>      #:::::::::::::::::::::::::::::%      >>>>>\",\n\">>>>>      #:::::::::::::::::::::::::::%      >>>>>>\",\n\">>>>>>      +;::::::::::::::::::::::::$       >>>>>>\",\n\">>>>>>       o=:::::::::::::::::::::;O       >>>>>>>\",\n\">>>>>>>        @-:::::::::::::::::;#.       >>>>>>>>\",\n\">>>>>>>>         @=:::::::::::::-#.        >>>>>>>>>\",\n\">>>>>>>>>>         .@&*;::::;&#o          >>>>>>>>>>\",\n\">>>>>>>>>>>                             >>>>>>>>>>>>\",\n\">>>>>>>>>>>>                           >>>>>>>>>>>>>\",\n\">>>>>>>>>>>>>>                       >>>>>>>>>>>>>>>\",\n\">>>>>>>>>>>>>>>>>                 >>>>>>>>>>>>>>>>>>\",\n\">>>>>>>>>>>>>>>>>>>>           >>>>>>>>>>>>>>>>>>>>>\",\n\">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\"\n};\n"
  },
  {
    "path": "src/test/resources/samples/langs/XPM/stick-unfocus.xpm",
    "content": "/* XPM */\nstatic char * stick_unfocus_xpm[] = {\n\"20 17 20 1\",\n\" \tc None\",\n\".\tc #EBEBEB\",\n\"+\tc #E9E9E9\",\n\"@\tc #E6E6E6\",\n\"#\tc #E5E5E5\",\n\"$\tc #E2E2E2\",\n\"%\tc #DFDFDF\",\n\"&\tc #DEDEDE\",\n\"*\tc #FEFEFE\",\n\"=\tc #C4C4C4\",\n\"-\tc #898989\",\n\";\tc #B7B7B7\",\n\">\tc #6A6A6A\",\n\",\tc #B9B9B9\",\n\"'\tc #E4E4E4\",\n\")\tc #686868\",\n\"!\tc #E0E0E0\",\n\"~\tc #666666\",\n\"{\tc #E8E8E8\",\n\"]\tc #E1E1E1\",\n\"....................\",\n\"....................\",\n\".....+@#$%&%$#@+....\",\n\"....+*********=&+...\",\n\"....@*********-=#...\",\n\"....#**;;;;;**>,'...\",\n\"....$**;**;;**);$...\",\n\"....%**;;;;;**>;&...\",\n\"....&**;***;**>;&...\",\n\"....&**;;;;;**>;&...\",\n\"....!*********~;!...\",\n\"....!*********>,&...\",\n\"....@=->)>>>)>-=#...\",\n\"....+&=,;;;;;,=&+...\",\n\".....{]%%&&&&%@+....\",\n\"....................\",\n\"....................\"};\n"
  },
  {
    "path": "src/test/resources/samples/langs/XPages/navbar.xsp-config",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<faces-config>\n  <faces-config-extension>\n    <namespace-uri>http://www.ibm.com/xsp/custom</namespace-uri>\n    <default-prefix>xc</default-prefix>\n  </faces-config-extension>\n  <composite-component>\n    <component-type>navbar</component-type>\n    <composite-name>navbar</composite-name>\n    <composite-file>/navbar.xsp</composite-file>\n    <composite-extension>\n      <designer-extension>\n        <in-palette>true</in-palette>\n      </designer-extension>\n    </composite-extension>\n  </composite-component>\n</faces-config>\n"
  },
  {
    "path": "src/test/resources/samples/langs/XPages/navbar.xsp.metadata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><note class=\"form\" maintenanceversion=\"1.0\" replicaid=\"88257E000001FF59\" version=\"9.0\" xmlns=\"http://www.lotus.com/dxl\">\r\n<noteinfo noteid=\"1aa\" sequence=\"14\" unid=\"47D707801D48026E85257C48007E06C7\">\r\n<created><datetime>20131221T175632,71-05</datetime></created>\r\n<modified><datetime>20150305T194407,22-08</datetime></modified>\r\n<revised><datetime>20150305T194407,21-08</datetime></revised>\r\n<lastaccessed><datetime>20150305T194407,22-08</datetime></lastaccessed>\r\n<addedtofile><datetime>20150305T162153,30-08</datetime></addedtofile></noteinfo>\r\n<updatedby><name>CN=Eric McCormick/O=Eric McCormick</name></updatedby>\r\n<wassignedby><name>CN=Eric McCormick/O=Eric McCormick</name></wassignedby>\r\n<item name=\"$Flags\"><text>gC~4;</text></item>\r\n<item name=\"$TITLE\"><text>navbar.xsp</text></item>\r\n\r\n\r\n\r\n\r\n\r\n<item name=\"$FileNames\" sign=\"true\"><text>navbar.xsp</text></item>\r\n<item name=\"$DesignerVersion\"><text>8.5.3</text></item>\r\n\r\n\r\n\r\n</note>"
  },
  {
    "path": "src/test/resources/samples/langs/XProc/xproc.xpl",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<p:declare-step xmlns:p=\"http://www.w3.org/ns/xproc\"\n    xmlns:c=\"http://www.w3.org/ns/xproc-step\" version=\"1.0\">\n    <p:input port=\"source\">\n        <p:inline>\n            <doc>Hello world!</doc>\n        </p:inline>\n    </p:input>\n    <p:output port=\"result\"/>\n    <p:identity/>\n</p:declare-step>"
  },
  {
    "path": "src/test/resources/samples/langs/XQuery/xproc.xqm",
    "content": "(: -------------------------------------------------------------------------------------\n\n    xproc.xqm - core xqm contains entry points, primary eval-step function and\n    control functions.\n\n ---------------------------------------------------------------------------------------- :)\nxquery version \"3.0\"  encoding \"UTF-8\";\n\nmodule namespace xproc = \"http://xproc.net/xproc\";\n\n (: declare namespaces :)\n declare namespace p=\"http://www.w3.org/ns/xproc\";\n declare namespace c=\"http://www.w3.org/ns/xproc-step\";\n declare namespace err=\"http://www.w3.org/ns/xproc-error\";\n\n (: module imports :)\n(:  import module namespace util = \"http://xproc.net/xproc/util\" at \"util1.xqm\"; :)\n import module namespace const = \"http://xproc.net/xproc/const\" at \"const.xqm\";\n import module namespace parse = \"http://xproc.net/xproc/parse\" at \"parse.xqm\";\n import module namespace u = \"http://xproc.net/xproc/util\" at \"util.xqm\";\n\n (: declare options :)\n declare boundary-space preserve;\n declare option saxon:output \"indent=yes\";\n\n (: declare functions :)\n declare variable $xproc:run-step       := xproc:run#6;\n declare variable $xproc:parse-and-eval := ();\n declare variable $xproc:declare-step   := ();\n declare variable $xproc:choose         := ();\n declare variable $xproc:try            := ();\n declare variable $xproc:catch          := ();\n declare variable $xproc:group          := ();\n declare variable $xproc:for-each       := ();\n declare variable $xproc:viewport       := ();\n declare variable $xproc:library        := ();\n declare variable $xproc:pipeline       := ();\n declare variable $xproc:variable       := ();\n\n\n (: list all declared namespaces :)\n (: -------------------------------------------------------------------------- :)\n declare function xproc:enum-namespaces($pipeline){\n (: -------------------------------------------------------------------------- :)\n    <namespace name=\"{$pipeline/@name}\">{u:enum-ns(<dummy>{$pipeline}</dummy>)}</namespace>\n };\n\n (: entry point :)\n (: -------------------------------------------------------------------------- :)\n declare function xproc:run($pipeline,$stdin,$dflag,$tflag,$bindings,$options){\n (: -------------------------------------------------------------------------- :)\n\n (: STEP I: preprocess :)\n let $validate   := ()\n let $namespaces := xproc:enum-namespaces($pipeline)\n let $parse      := parse:explicit-bindings( parse:AST(parse:explicit-name(parse:explicit-type($pipeline))))\n let $ast        := element p:declare-step {$parse/@*,\n       parse:pipeline-step-sort( $parse/*, () )\n     }\n\n (: STEP II: eval AST :)\n let $eval_result := ()\n\n (: STEP III: serialize and return results :)\n let $serialized_result := $pipeline\n\n return \n   $serialized_result\n };\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/XS/CommonMark.xs",
    "content": "/*\n * This software is copyright (C) by Nick Wellnhofer <wellnhofer@aevum.de>.\n *\n * This is free software; you can redistribute it and/or modify it under\n * the same terms as the Perl 5 programming language system itself.\n *\n * Terms of the Perl programming language system itself\n *\n * a) the GNU General Public License as published by the Free\n *    Software Foundation; either version 1, or (at your option) any\n *    later version, or\n * b) the \"Artistic License\"\n */\n\n/*\n * Notes on memory management\n *\n * - A pointer to the Perl SV representing a node is stored in the\n *   user data slot of `struct cmark_node`, so there's a 1:1 mapping\n *   between Perl and C objects.\n * - Every node SV keeps a reference to the parent SV. This is done\n *   indirectly by looking up the parent SV and increasing its refcount.\n * - This makes sure that a document isn't freed if the last reference\n *   from Perl to the root node is dropped, as references to child nodes\n *   might still exist.\n * - As a consequence, as long as a node is referenced from Perl, all its\n *   ancestor nodes will also be associated with a Perl object.\n */\n\n#define PERL_NO_GET_CONTEXT\n\n#include \"EXTERN.h\"\n#include \"perl.h\"\n#include \"XSUB.h\"\n\n#include <stdlib.h>\n#include <cmark.h>\n\n#if CMARK_VERSION < 0x001000\n    #error libcmark 0.16.0 is required.\n#endif\n\n/* Fix prefixes of render functions. */\n#define cmark_node_render_html cmark_render_html\n#define cmark_node_render_xml  cmark_render_xml\n#define cmark_node_render_man  cmark_render_man\n\nstatic SV*\nS_create_or_incref_node_sv(pTHX_ cmark_node *node) {\n    SV *new_obj = NULL;\n\n    while (node) {\n        SV *obj;\n        HV *stash;\n\n        /* Look for existing object. */\n        obj = (SV*)cmark_node_get_user_data(node);\n\n        if (obj) {\n            /* Incref if found. */\n            SvREFCNT_inc_simple_void_NN(obj);\n            if (!new_obj) {\n                new_obj = obj;\n            }\n            break;\n        }\n\n        /* Create a new SV. */\n        obj = newSViv(PTR2IV(node));\n        cmark_node_set_user_data(node, obj);\n        if (!new_obj) {\n            new_obj = obj;\n        }\n\n        /*\n         * Unfortunately, Perl doesn't offer an API function to bless an SV\n         * without a reference. The following code is mostly copied from\n         * sv_bless.\n         */\n        SvOBJECT_on(obj);\n#if (PERL_VERSION <= 16)\n        PL_sv_objcount++;\n#endif\n        SvUPGRADE(obj, SVt_PVMG);\n        stash = gv_stashpvn(\"CommonMark::Node\", 16, GV_ADD);\n        SvSTASH_set(obj, (HV*)SvREFCNT_inc(stash));\n\n        /* Recurse into parent. */\n        node = cmark_node_parent(node);\n    }\n\n    return new_obj;\n}\n\nstatic void\nS_decref_node_sv(pTHX_ cmark_node *node) {\n    SV *obj;\n\n    if (!node) {\n        return;\n    }\n\n    obj = (SV*)cmark_node_get_user_data(node);\n    if (!obj) {\n        /* Should never happen. */\n        croak(\"Internal error: node SV not found\");\n    }\n\n    SvREFCNT_dec_NN(obj);\n}\n\n/* Find or create an SV for a cmark_node. */\nstatic SV*\nS_node2sv(pTHX_ cmark_node *node) {\n    SV *obj;\n\n    if (!node) {\n        return &PL_sv_undef;\n    }\n\n    obj = S_create_or_incref_node_sv(aTHX_ node);\n\n    return newRV_noinc(obj);\n}\n\n/* Transfer refcount from a node to another. */\nstatic void\nS_transfer_refcount(pTHX_ cmark_node *from, cmark_node *to) {\n    if (from != to) {\n        S_create_or_incref_node_sv(aTHX_ to);\n        S_decref_node_sv(aTHX_ from);\n    }\n}\n\n/* Get C struct pointer from an SV argument. */\nstatic void*\nS_sv2c(pTHX_ SV *sv, const char *class_name, STRLEN len, CV *cv,\n       const char *var_name) {\n    if (!SvROK(sv) || !sv_derived_from_pvn(sv, class_name, len, 0)) {\n        const char *sub_name = GvNAME(CvGV(cv));\n        croak(\"%s: %s is not of type %s\", sub_name, var_name, class_name);\n    }\n    return INT2PTR(void*, SvIV(SvRV(sv)));\n}\n\n\nMODULE = CommonMark  PACKAGE = CommonMark  PREFIX = cmark_\n\nPROTOTYPES: DISABLE\n\nBOOT:\n    if (cmark_version != CMARK_VERSION) {\n        warn(\"Compiled against libcmark %s, but runtime version is %s\",\n             CMARK_VERSION_STRING, cmark_version_string);\n    }\n\nchar*\ncmark_markdown_to_html(package, string)\n    SV *package = NO_INIT\n    SV *string\nPREINIT:\n    STRLEN len;\n    const char *buffer;\nCODE:\n    (void)package;\n    buffer = SvPVutf8(string, len);\n    RETVAL = cmark_markdown_to_html(buffer, len);\nOUTPUT:\n    RETVAL\n\ncmark_node*\ncmark_parse_document(package, string)\n    SV *package = NO_INIT\n    SV *string\nPREINIT:\n    STRLEN len;\n    const char *buffer;\nCODE:\n    (void)package;\n    buffer = SvPVutf8(string, len);\n    RETVAL = cmark_parse_document(buffer, len);\nOUTPUT:\n    RETVAL\n\ncmark_node*\ncmark_parse_file(package, file)\n    SV *package = NO_INIT\n    SV *file\nPREINIT:\n    PerlIO *perl_io;\n    FILE *stream = NULL;\nCODE:\n    (void)package;\n    perl_io = IoIFP(sv_2io(file));\n    if (perl_io) {\n        stream = PerlIO_findFILE(perl_io);\n    }\n    if (!stream) {\n        croak(\"parse_file: file is not a file handle\");\n    }\n    RETVAL = cmark_parse_file(stream);\nOUTPUT:\n    RETVAL\n\nint\ncmark_version(package)\n    SV *package = NO_INIT\nCODE:\n    (void)package;\n    RETVAL = cmark_version;\nOUTPUT:\n    RETVAL\n\nconst char*\ncmark_version_string(package)\n    SV *package = NO_INIT\nCODE:\n    (void)package;\n    RETVAL = cmark_version_string;\nOUTPUT:\n    RETVAL\n\nint\ncmark_compile_time_version(package)\n    SV *package = NO_INIT\nCODE:\n    (void)package;\n    RETVAL = CMARK_VERSION;\nOUTPUT:\n    RETVAL\n\nconst char*\ncmark_compile_time_version_string(package)\n    SV *package = NO_INIT\nCODE:\n    (void)package;\n    RETVAL = CMARK_VERSION_STRING;\nOUTPUT:\n    RETVAL\n\n\nMODULE = CommonMark  PACKAGE = CommonMark::Node  PREFIX = cmark_node_\n\ncmark_node*\nnew(package, type)\n    SV *package = NO_INIT\n    cmark_node_type type\nCODE:\n    (void)package;\n    RETVAL = cmark_node_new(type);\nOUTPUT:\n    RETVAL\n\nvoid\nDESTROY(cmark_node *node)\nCODE:\n    cmark_node *parent = cmark_node_parent(node);\n    if (parent) {\n        cmark_node_set_user_data(node, NULL);\n        S_decref_node_sv(aTHX_ parent);\n    }\n    else {\n        cmark_node_free(node);\n    }\n\ncmark_iter*\niterator(cmark_node *node)\nCODE:\n    S_create_or_incref_node_sv(aTHX_ node);\n    RETVAL = cmark_iter_new(node);\nOUTPUT:\n    RETVAL\n\ncmark_node*\ninterface_get_node(cmark_node *node)\nINTERFACE:\n    cmark_node_next\n    cmark_node_previous\n    cmark_node_parent\n    cmark_node_first_child\n    cmark_node_last_child\n\nint\ninterface_get_int(cmark_node *node)\nINTERFACE:\n    cmark_node_get_type\n    cmark_node_get_header_level\n    cmark_node_get_list_type\n    cmark_node_get_list_delim\n    cmark_node_get_list_start\n    cmark_node_get_list_tight\n    cmark_node_get_start_line\n    cmark_node_get_start_column\n    cmark_node_get_end_line\n    cmark_node_get_end_column\n\nNO_OUTPUT int\ninterface_set_int(cmark_node *node, int value)\nINTERFACE:\n    cmark_node_set_header_level\n    cmark_node_set_list_type\n    cmark_node_set_list_delim\n    cmark_node_set_list_start\n    cmark_node_set_list_tight\nPOSTCALL:\n    if (!RETVAL) {\n        croak(\"%s: invalid operation\", GvNAME(CvGV(cv)));\n    }\n\nconst char*\ninterface_get_utf8(cmark_node *node)\nINTERFACE:\n    cmark_node_get_type_string\n    cmark_node_get_literal\n    cmark_node_get_title\n    cmark_node_get_url\n    cmark_node_get_fence_info\n\nNO_OUTPUT int\ninterface_set_utf8(cmark_node *node, const char *value)\nINTERFACE:\n    cmark_node_set_literal\n    cmark_node_set_title\n    cmark_node_set_url\n    cmark_node_set_fence_info\nPOSTCALL:\n    if (!RETVAL) {\n        croak(\"%s: invalid operation\", GvNAME(CvGV(cv)));\n    }\n\nvoid\ncmark_node_unlink(cmark_node *node)\nPREINIT:\n    cmark_node *old_parent;\nINIT:\n    old_parent = cmark_node_parent(node);\nPOSTCALL:\n    S_decref_node_sv(aTHX_ old_parent);\n\nNO_OUTPUT int\ninterface_move_node(cmark_node *node, cmark_node *other)\nPREINIT:\n    cmark_node *old_parent;\n    cmark_node *new_parent;\nINIT:\n    old_parent = cmark_node_parent(other);\nINTERFACE:\n    cmark_node_insert_before\n    cmark_node_insert_after\n    cmark_node_prepend_child\n    cmark_node_append_child\nPOSTCALL:\n    if (!RETVAL) {\n        croak(\"%s: invalid operation\", GvNAME(CvGV(cv)));\n    }\n    new_parent = cmark_node_parent(other);\n    S_transfer_refcount(aTHX_ old_parent, new_parent);\n\nchar*\ninterface_render(cmark_node *root, long options = 0)\nINTERFACE:\n    cmark_node_render_html\n    cmark_node_render_xml\n    cmark_node_render_man\n\n\nMODULE = CommonMark  PACKAGE = CommonMark::Iterator  PREFIX = cmark_iter_\n\nvoid\nDESTROY(cmark_iter *iter)\nCODE:\n    S_decref_node_sv(aTHX_ cmark_iter_get_node(iter));\n    S_decref_node_sv(aTHX_ cmark_iter_get_root(iter));\n    cmark_iter_free(iter);\n\nvoid\ncmark_iter_next(cmark_iter *iter)\nPREINIT:\n    I32 gimme;\n    cmark_node *old_node;\n    cmark_event_type ev_type;\nPPCODE:\n    gimme    = GIMME_V;\n    old_node = cmark_iter_get_node(iter);\n    ev_type  = cmark_iter_next(iter);\n\n    if (ev_type != CMARK_EVENT_DONE) {\n        cmark_node *node = cmark_iter_get_node(iter);\n\n        ST(0) = sv_2mortal(newSViv((IV)ev_type));\n\n        if (gimme == G_ARRAY) {\n            SV *obj = S_create_or_incref_node_sv(aTHX_ node);\n\n            /* A bit more efficient than S_transfer_refcount. */\n            if (old_node != node) {\n                S_decref_node_sv(aTHX_ old_node);\n                SvREFCNT_inc_simple_void_NN(obj);\n            }\n\n            ST(1) = sv_2mortal(newRV_noinc(obj));\n            XSRETURN(2);\n        }\n        else {\n            S_transfer_refcount(aTHX_ old_node, node);\n            XSRETURN(1);\n        }\n    }\n    else {\n        S_decref_node_sv(aTHX_ old_node);\n\n        if (gimme == G_ARRAY) {\n            XSRETURN_EMPTY;\n        }\n        else {\n            ST(0) = sv_2mortal(newSViv((IV)ev_type));\n            XSRETURN(1);\n        }\n    }\n\ncmark_node*\ncmark_iter_get_node(cmark_iter *iter)\n\ncmark_event_type\ncmark_iter_get_event_type(cmark_iter *iter)\n\nvoid\ncmark_iter_reset(iter, node, event_type)\n    cmark_iter *iter\n    cmark_node *node\n    cmark_event_type event_type\nPREINIT:\n    cmark_node *old_node;\nINIT:\n    old_node = cmark_iter_get_node(iter);\n    S_transfer_refcount(aTHX_ old_node, node);\n\n\nMODULE = CommonMark  PACKAGE = CommonMark::Parser  PREFIX = cmark_parser_\n\ncmark_parser*\ncmark_parser_new(package)\n    SV *package = NO_INIT\nCODE:\n    (void)package;\n    RETVAL = cmark_parser_new();\nOUTPUT:\n    RETVAL\n\nvoid\nDESTROY(cmark_parser *parser)\nCODE:\n    cmark_parser_free(parser);\n\nvoid\ncmark_parser_feed(cmark_parser *parser, SV *string)\nPREINIT:\n    STRLEN len;\n    const char *buffer;\nCODE:\n    buffer = SvPVutf8(string, len);\n    cmark_parser_feed(parser, buffer, len);\n\ncmark_node*\ncmark_parser_finish(cmark_parser *parser)\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/XSLT/test.xslt",
    "content": "<?xml version=\"1.0\"?>\n\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n\n<xsl:template match=\"/\">\n  <html>\n  <body>\n    <h2>My CD Collection</h2>\n    <table border=\"1\">\n      <tr bgcolor=\"#9acd32\">\n        <th>Title</th>\n        <th>Artist</th>\n      </tr>\n      <xsl:for-each select=\"catalog/cd\">\n        <tr>\n          <td><xsl:value-of select=\"title\"/></td>\n          <td><xsl:value-of select=\"artist\"/></td>\n        </tr>\n      </xsl:for-each>\n    </table>\n  </body>\n  </html>\n</xsl:template>\n\n</xsl:stylesheet>\n"
  },
  {
    "path": "src/test/resources/samples/langs/Xojo/App.xojo_code",
    "content": "#tag Class\nProtected Class App\nInherits Application\n\t#tag Constant, Name = kEditClear, Type = String, Dynamic = False, Default = \\\"&Delete\", Scope = Public\n\t\t#Tag Instance, Platform = Windows, Language = Default, Definition  = \\\"&Delete\"\n\t\t#Tag Instance, Platform = Linux, Language = Default, Definition  = \\\"&Delete\"\n\t#tag EndConstant\n\n\t#tag Constant, Name = kFileQuit, Type = String, Dynamic = False, Default = \\\"&Quit\", Scope = Public\n\t\t#Tag Instance, Platform = Windows, Language = Default, Definition  = \\\"E&xit\"\n\t#tag EndConstant\n\n\t#tag Constant, Name = kFileQuitShortcut, Type = String, Dynamic = False, Default = \\\"\", Scope = Public\n\t\t#Tag Instance, Platform = Mac OS, Language = Default, Definition  = \\\"Cmd+Q\"\n\t\t#Tag Instance, Platform = Linux, Language = Default, Definition  = \\\"Ctrl+Q\"\n\t#tag EndConstant\n\n\n\t#tag ViewBehavior\n\t#tag EndViewBehavior\nEnd Class\n#tag EndClass\n"
  },
  {
    "path": "src/test/resources/samples/langs/Xojo/BillingReport.xojo_report",
    "content": "#tag Report\nBegin Report BillingReport\n   Compatibility   =   \"\"\n   Units           =   0\n   Width           =   8.5\n   Begin  PageHeader\n      Type            =   1\n      Height          =   1.0\n   End\n   Begin  Body\n      Type            =   3\n      Height          =   2.0\n   End\n   Begin  PageFooter\n      Type            =   5\n      Height          =   1.0\n   End\nEnd\n#tag EndReport\n\n#tag ReportCode\n#tag EndReportCode\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/Xojo/MainMenuBar.xojo_menu",
    "content": "#tag Menu\nBegin Menu MainMenuBar\n   Begin MenuItem FileMenu\n      SpecialMenu = 0\n      Text = \"&File\"\n      Index = -2147483648\n      AutoEnable = True\n      Visible = True\n      Begin QuitMenuItem FileQuit\n         SpecialMenu = 0\n         Text = \"#App.kFileQuit\"\n         Index = -2147483648\n         ShortcutKey = \"#App.kFileQuitShortcut\"\n         Shortcut = \"#App.kFileQuitShortcut\"\n         AutoEnable = True\n         Visible = True\n      End\n   End\n   Begin MenuItem EditMenu\n      SpecialMenu = 0\n      Text = \"&Edit\"\n      Index = -2147483648\n      AutoEnable = True\n      Visible = True\n      Begin MenuItem EditUndo\n         SpecialMenu = 0\n         Text = \"&Undo\"\n         Index = -2147483648\n         ShortcutKey = \"Z\"\n         Shortcut = \"Cmd+Z\"\n         MenuModifier = True\n         AutoEnable = True\n         Visible = True\n      End\n      Begin MenuItem EditSeparator1\n         SpecialMenu = 0\n         Text = \"-\"\n         Index = -2147483648\n         AutoEnable = True\n         Visible = True\n      End\n      Begin MenuItem EditCut\n         SpecialMenu = 0\n         Text = \"Cu&t\"\n         Index = -2147483648\n         ShortcutKey = \"X\"\n         Shortcut = \"Cmd+X\"\n         MenuModifier = True\n         AutoEnable = True\n         Visible = True\n      End\n      Begin MenuItem EditCopy\n         SpecialMenu = 0\n         Text = \"&Copy\"\n         Index = -2147483648\n         ShortcutKey = \"C\"\n         Shortcut = \"Cmd+C\"\n         MenuModifier = True\n         AutoEnable = True\n         Visible = True\n      End\n      Begin MenuItem EditPaste\n         SpecialMenu = 0\n         Text = \"&Paste\"\n         Index = -2147483648\n         ShortcutKey = \"V\"\n         Shortcut = \"Cmd+V\"\n         MenuModifier = True\n         AutoEnable = True\n         Visible = True\n      End\n      Begin MenuItem EditClear\n         SpecialMenu = 0\n         Text = \"#App.kEditClear\"\n         Index = -2147483648\n         AutoEnable = True\n         Visible = True\n      End\n      Begin MenuItem EditSeparator2\n         SpecialMenu = 0\n         Text = \"-\"\n         Index = -2147483648\n         AutoEnable = True\n         Visible = True\n      End\n      Begin MenuItem EditSelectAll\n         SpecialMenu = 0\n         Text = \"Select &All\"\n         Index = -2147483648\n         ShortcutKey = \"A\"\n         Shortcut = \"Cmd+A\"\n         MenuModifier = True\n         AutoEnable = True\n         Visible = True\n      End\n      Begin MenuItem UntitledSeparator\n         SpecialMenu = 0\n         Text = \"-\"\n         Index = -2147483648\n         AutoEnable = True\n         Visible = True\n      End\n      Begin AppleMenuItem AboutItem\n         SpecialMenu = 0\n         Text = \"About This App...\"\n         Index = -2147483648\n         AutoEnable = True\n         Visible = True\n      End\n   End\nEnd\n#tag EndMenu\n"
  },
  {
    "path": "src/test/resources/samples/langs/Xojo/MyToolbar.xojo_toolbar",
    "content": "#tag Toolbar\nBegin Toolbar MyToolbar\n\tBegin ToolButton FirstItem\n\t\tCaption = \"First Item\"\n\t\tHelpTag = \"\"\n\t\tStyle = 0\n\tEnd\n\tBegin ToolButton SecondItem\n\t\tCaption = \"Second Item\"\n\t\tHelpTag = \"\"\n\t\tStyle = 0\n\tEnd\nEnd\n#tag EndToolbar\n"
  },
  {
    "path": "src/test/resources/samples/langs/Xojo/Window1.xojo_window",
    "content": "#tag Window\nBegin Window Window1\n   BackColor       =   &cFFFFFF00\n   Backdrop        =   0\n   CloseButton     =   True\n   Compatibility   =   \"\"\n   Composite       =   False\n   Frame           =   0\n   FullScreen      =   False\n   FullScreenButton=   False\n   HasBackColor    =   False\n   Height          =   400\n   ImplicitInstance=   True\n   LiveResize      =   True\n   MacProcID       =   0\n   MaxHeight       =   32000\n   MaximizeButton  =   True\n   MaxWidth        =   32000\n   MenuBar         =   1153981589\n   MenuBarVisible  =   True\n   MinHeight       =   64\n   MinimizeButton  =   True\n   MinWidth        =   64\n   Placement       =   0\n   Resizeable      =   True\n   Title           =   \"Sample App\"\n   Visible         =   True\n   Width           =   600\n   Begin PushButton HelloWorldButton\n      AutoDeactivate  =   True\n      Bold            =   False\n      ButtonStyle     =   \"0\"\n      Cancel          =   False\n      Caption         =   \"Push Me\"\n      Default         =   True\n      Enabled         =   True\n      Height          =   20\n      HelpTag         =   \"\"\n      Index           =   -2147483648\n      InitialParent   =   \"\"\n      Italic          =   False\n      Left            =   260\n      LockBottom      =   False\n      LockedInPosition=   False\n      LockLeft        =   True\n      LockRight       =   False\n      LockTop         =   True\n      Scope           =   0\n      TabIndex        =   0\n      TabPanelIndex   =   0\n      TabStop         =   True\n      TextFont        =   \"System\"\n      TextSize        =   0.0\n      TextUnit        =   0\n      Top             =   32\n      Underline       =   False\n      Visible         =   True\n      Width           =   80\n   End\nEnd\n#tag EndWindow\n\n#tag WindowCode\n#tag EndWindowCode\n\n#tag Events HelloWorldButton\n\t#tag Event\n\t\tSub Action()\n\t\t  Dim total As Integer\n\t\t  \n\t\t  For i As Integer = 0 To 10\n\t\t    total = total + i\n\t\t  Next\n\t\t  \n\t\t  MsgBox \"Hello World! \" + Str(total)\n\t\tEnd Sub\n\t#tag EndEvent\n#tag EndEvents\n#tag ViewBehavior\n\t#tag ViewProperty\n\t\tName=\"BackColor\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"&hFFFFFF\"\n\t\tType=\"Color\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Backdrop\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tType=\"Picture\"\n\t\tEditorType=\"Picture\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"CloseButton\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"True\"\n\t\tType=\"Boolean\"\n\t\tEditorType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Composite\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"False\"\n\t\tType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Frame\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"0\"\n\t\tType=\"Integer\"\n\t\tEditorType=\"Enum\"\n\t\t#tag EnumValues\n\t\t\t\"0 - Document\"\n\t\t\t\"1 - Movable Modal\"\n\t\t\t\"2 - Modal Dialog\"\n\t\t\t\"3 - Floating Window\"\n\t\t\t\"4 - Plain Box\"\n\t\t\t\"5 - Shadowed Box\"\n\t\t\t\"6 - Rounded Window\"\n\t\t\t\"7 - Global Floating Window\"\n\t\t\t\"8 - Sheet Window\"\n\t\t\t\"9 - Metal Window\"\n\t\t\t\"10 - Drawer Window\"\n\t\t\t\"11 - Modeless Dialog\"\n\t\t#tag EndEnumValues\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"FullScreen\"\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"False\"\n\t\tType=\"Boolean\"\n\t\tEditorType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"FullScreenButton\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"False\"\n\t\tType=\"Boolean\"\n\t\tEditorType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"HasBackColor\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"False\"\n\t\tType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Height\"\n\t\tVisible=true\n\t\tGroup=\"Position\"\n\t\tInitialValue=\"400\"\n\t\tType=\"Integer\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"ImplicitInstance\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"True\"\n\t\tType=\"Boolean\"\n\t\tEditorType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Interfaces\"\n\t\tVisible=true\n\t\tGroup=\"ID\"\n\t\tType=\"String\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"LiveResize\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"True\"\n\t\tType=\"Boolean\"\n\t\tEditorType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"MacProcID\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"0\"\n\t\tType=\"Integer\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"MaxHeight\"\n\t\tVisible=true\n\t\tGroup=\"Position\"\n\t\tInitialValue=\"32000\"\n\t\tType=\"Integer\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"MaximizeButton\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"True\"\n\t\tType=\"Boolean\"\n\t\tEditorType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"MaxWidth\"\n\t\tVisible=true\n\t\tGroup=\"Position\"\n\t\tInitialValue=\"32000\"\n\t\tType=\"Integer\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"MenuBar\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tType=\"MenuBar\"\n\t\tEditorType=\"MenuBar\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"MenuBarVisible\"\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"True\"\n\t\tType=\"Boolean\"\n\t\tEditorType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"MinHeight\"\n\t\tVisible=true\n\t\tGroup=\"Position\"\n\t\tInitialValue=\"64\"\n\t\tType=\"Integer\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"MinimizeButton\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"True\"\n\t\tType=\"Boolean\"\n\t\tEditorType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"MinWidth\"\n\t\tVisible=true\n\t\tGroup=\"Position\"\n\t\tInitialValue=\"64\"\n\t\tType=\"Integer\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Name\"\n\t\tVisible=true\n\t\tGroup=\"ID\"\n\t\tType=\"String\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Placement\"\n\t\tVisible=true\n\t\tGroup=\"Position\"\n\t\tInitialValue=\"0\"\n\t\tType=\"Integer\"\n\t\tEditorType=\"Enum\"\n\t\t#tag EnumValues\n\t\t\t\"0 - Default\"\n\t\t\t\"1 - Parent Window\"\n\t\t\t\"2 - Main Screen\"\n\t\t\t\"3 - Parent Window Screen\"\n\t\t\t\"4 - Stagger\"\n\t\t#tag EndEnumValues\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Resizeable\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"True\"\n\t\tType=\"Boolean\"\n\t\tEditorType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Super\"\n\t\tVisible=true\n\t\tGroup=\"ID\"\n\t\tType=\"String\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Title\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"Untitled\"\n\t\tType=\"String\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Visible\"\n\t\tVisible=true\n\t\tGroup=\"Appearance\"\n\t\tInitialValue=\"True\"\n\t\tType=\"Boolean\"\n\t\tEditorType=\"Boolean\"\n\t#tag EndViewProperty\n\t#tag ViewProperty\n\t\tName=\"Width\"\n\t\tVisible=true\n\t\tGroup=\"Position\"\n\t\tInitialValue=\"600\"\n\t\tType=\"Integer\"\n\t#tag EndViewProperty\n#tag EndViewBehavior\n"
  },
  {
    "path": "src/test/resources/samples/langs/Xojo/database.xojo_script",
    "content": "Dim dbFile As FolderItem\nDim db As New SQLiteDatabase\ndbFile = GetFolderItem(\"Employees.sqlite\")\ndb.DatabaseFile = dbFile\nIf db.Connect Then\n  db.SQLExecute(\"BEGIN TRANSACTION\")\n  db.SQLExecute (\"INSERT INTO Employees (Name,Job,YearJoined) VALUES \"_\n    +\"('Dr.Strangelove','Advisor',1962)\")\n  If db.Error then\n    MsgBox(\"Error: \" + db.ErrorMessage)\n    db.Rollback\n  Else\n    db.Commit\n  End If\nElse\n  MsgBox(\"The database couldn't be opened. Error: \" + db.ErrorMessage)\nEnd If\n"
  },
  {
    "path": "src/test/resources/samples/langs/Xtend/BasicExpressions.xtend",
    "content": "/*******************************************************************************\n * Copyright (c) 2012 itemis AG (http://www.itemis.eu) and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\npackage example2\n\nimport org.junit.Test\nimport static org.junit.Assert.*\n\n\nclass BasicExpressions {\n\t\n\t@Test def void literals() {\n\t\t// string literals work with single or double quotes\n\t\tassertEquals('Hello', \"Hello\")\n\t\t\n\t\t// number literals (big decimals in this case)\n\t\tassertEquals(42, 20 + 20 + 1 * 2)\n\t\tassertEquals(42.00bd, 0.00bd + 42bd)\n\t\t\n\t\t// boolean literals\n\t\tassertEquals(true, !false)\n\t\t\n\t\t// class literals\n\t\tassertEquals(getClass(), typeof(BasicExpressions))\n\t}\n\t\n\t@Test def void collections() {\n\t\t// There are various static methods to create collections\n\t\t// and numerous extension methods which make working with them\n\t\t// convenient.\n\t\tval list = newArrayList('Hello', 'World')\n\t\tassertEquals('HELLO', list.map[toUpperCase].head)\n\t\t\n\t\tval set  = newHashSet(1, 3, 5)\n\t\tassertEquals(2, set.filter[ it >= 3].size)\n\t\t\n\t\tval map  = newHashMap('one' -> 1, 'two' -> 2, 'three' -> 3)\n\t\tassertEquals( 2 , map.get('two'))\n\t}\n\t\n\t@Test def void controlStructures() {\n\t\t// 'if' looks like in Java\n\t\tif ('text'.length == 4) {\n\t\t\t// but it's an expression so it can be used in more flexible ways:\n\t\t\tassertEquals( 42 , if ('foo' != 'bar') 42 else -24 )\n\t\t} else {\n\t\t\tfail('Never happens!')\n\t\t}\n\t\t\n\t\t// in a switch the first match wins\n\t\tswitch (t : 'text') {\n\t\t\t// use predicates\n\t\t\tcase t.length > 8 :\n\t\t\t\tfail('Never happens!')\n\t\t\t// use equals\n\t\t\tcase 'text' :\n\t\t\t\tassertTrue(true)\n\t\t\tdefault :\n\t\t\t\tfail('never happens!')\n\t\t}\n\t\t\n\t\t// switch also supports type guards, which provide a safe \n\t\t// and convenient alternative to Java's 'instanceof'-cascades.\n\t\tval Object someValue = 'a string typed to Object'\n\t\tassertEquals('string', \n\t\t\tswitch someValue {\n\t\t\t\tNumber : 'number'\n\t\t\t\tString : 'string' \n\t\t\t})\n\t}\n\t\n\t@Test def void loops() {\n\t\t// for loop\n\t\tvar counter = 1\n\t\tfor (i : 1 .. 10) {\n\t\t\tassertEquals(counter, i)\n\t\t\tcounter = counter + 1\n\t\t}\n\t\t\n\t\t// while loop\n\t\tval iterator = newArrayList(1,2,3,4,5).iterator\n\t\tcounter = 1\n\t\twhile(iterator.hasNext) {\n\t\t\tval i = iterator.next\n\t\t\tassertEquals(counter, i)\n\t\t\tcounter = counter + 1\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Xtend/Movies.xtend",
    "content": "/*******************************************************************************\n * Copyright (c) 2012 itemis AG (http://www.itemis.eu) and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http://www.eclipse.org/legal/epl-v10.html\n * \n * Author - Sven Efftinge\n *******************************************************************************/\npackage example6\n\nimport org.junit.Test\nimport static org.junit.Assert.*\nimport java.io.FileReader\nimport java.util.Set\nimport static extension com.google.common.io.CharStreams.*\n\nclass Movies {\n\t\n\t/**\n\t * @return the total number of action movies\n\t */ \n\t@Test def void numberOfActionMovies() {\n\t\tassertEquals(828, movies.filter[categories.contains('Action')].size)\n\t}\n\t\n\t/**\n\t * @return the year the best rated movie of 80ies (1980-1989) was released.\n\t */\n\t@Test def void yearOfBestMovieFrom80ies() {\n\t\tassertEquals(1989, movies.filter[(1980..1989).contains(year)].sortBy[rating].last.year)\n\t}\n\t\n\t/**\n\t * @return the sum of the number of votes of the two top rated movies.\n\t */\n\t@Test def void sumOfVotesOfTop2() {\n\t\tval long movies = movies.sortBy[-rating].take(2).map[numberOfVotes].reduce[a, b| a + b]\n\t\tassertEquals(47_229, movies)\n\t}\n\t\n\tval movies = new FileReader('data.csv').readLines.map[ line |\n\t\tval segments = line.split('  ').iterator\n\t\treturn new Movie(\n\t\t\tsegments.next, \n\t\t\tInteger::parseInt(segments.next), \n\t\t\tDouble::parseDouble(segments.next), \n\t\t\tLong::parseLong(segments.next), \n\t\t\tsegments.toSet\n\t\t)\n\t]\n}\n\n@Data class Movie {\n\tString title\n\tint year\n\tdouble rating\n\tlong numberOfVotes\n\tSet<String> categories \n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/YAML/Ansible.YAML-tmLanguage",
    "content": "# [PackageDev] target_format: plist, ext: tmLanguage\r\n---\r\nname: Ansible\r\nscopeName: source.ansible\r\nfileTypes: []\r\nuuid: 787ae642-b4ae-48b1-94e9-f935bec43a8f\r\n\r\npatterns:\r\n- name: comment.line.number-sign.ansible\r\n  match: (?:^ *|\\G *)((#).*)\r\n  captures:\r\n    '1': {name: comment.line.number-sign.ansible}\r\n    '2': {name: punctuation.definition.comment.line.ansible}\r\n\r\n- name: storage.type.ansible\r\n  match: (\\{\\{ *[^\\{\\}]+ *\\}\\})|(\\$\\{[^\\{\\}]+\\})\r\n\r\n- name: keyword.other.ansible\r\n  match: \\- (name\\:|include\\:) (.*)|(^(- |\\s*)\\w+\\:)\r\n  captures:\r\n    '2': {name: string.quoted.double.ansible}\r\n\r\n- name: variable.complex.ansible\r\n  contentName: string.other.ansible\r\n  begin: (\\w+)(=)\\\"?\r\n  beginCaptures:\r\n    '1': {name: entity.other.attribute-name.ansible}\r\n    '2': {name: text}\r\n  end: \\\"?\\s\r\n  patterns:\r\n    - include: $self\r\n    - name: constant.other.ansible\r\n      match: .\r\n\r\n- name: string.quoted.double.ansible\r\n  match: ^(\\[[0-9a-zA-Z_-]+(((\\:)children)*)\\])\r\n  captures:\r\n    '2': {name: variable.parameter.ansible}\r\n"
  },
  {
    "path": "src/test/resources/samples/langs/YAML/HexInspect.sublime-syntax",
    "content": "%YAML 1.2\n---\n# http://www.sublimetext.com/docs/3/syntax.html\nname: Hex Inspect\nfile_extensions: []\nhidden: true\nscope: source.inspect\ncontexts:\n  main:\n    - match: '([\\w\\-]+)\\s*(:)\\s*'\n      captures:\n        1: support.function.key.inspect\n        2: support.function.punctuation.inspect\n      push:\n        - meta_scope: item.inspect\n        - match: '([\\d\\-\\w]+)'\n          captures:\n            1: data.inspect\n          pop: true\n    - match: '^(\\s*[\\w\\-\\s]+)\\s*(:)\\s*'\n      captures:\n        1: keyword.title.inspect\n        2: keyword.title-punctuation.inspect\n      push:\n        - meta_scope: item.inspect\n        - match: $\n          pop: true\n        - match: '[\\w\\s]+'\n          scope: title-info.inspect\n"
  },
  {
    "path": "src/test/resources/samples/langs/YAML/database.yml.mysql",
    "content": "#\n# PRODUCTION\n#\nproduction:\n  adapter: mysql2\n  encoding: utf8mb4\n  collation: utf8mb4_general_ci\n  reconnect: false\n  database: gitlabhq_production\n  pool: 10\n  username: git\n  password: \"secure password\"\n  # host: localhost\n  # socket: /tmp/mysql.sock\n\n#\n# Development specific\n#\ndevelopment:\n  adapter: mysql2\n  encoding: utf8mb4\n  collation: utf8mb4_general_ci\n  reconnect: false\n  database: gitlabhq_development\n  pool: 5\n  username: root\n  password: \"secure password\"\n  # socket: /tmp/mysql.sock\n\n# Warning: The database defined as \"test\" will be erased and\n# re-generated from your development database when you run \"rake\".\n# Do not set this db to the same as development or production.\ntest: &test\n  adapter: mysql2\n  encoding: utf8mb4\n  collation: utf8mb4_general_ci\n  reconnect: false\n  database: gitlabhq_test\n  pool: 5\n  username: root\n  password:\n  # socket: /tmp/mysql.sock\n"
  },
  {
    "path": "src/test/resources/samples/langs/YAML/filenames/.clang-format",
    "content": "---\n# We'll use defaults from the LLVM style, but with 4 columns indentation.\nBasedOnStyle: LLVM\nIndentWidth: 4\n---\nLanguage: Cpp\n# Force pointers to the type for C++.\nDerivePointerAlignment: false\nPointerAlignment: Left\n---\nLanguage: JavaScript\n# Use 100 columns for JS.\nColumnLimit: 100\n---\nLanguage: Proto\n# Don't format .proto files.\nDisableFormat: true\n...\n"
  },
  {
    "path": "src/test/resources/samples/langs/YAML/filenames/.clang-tidy",
    "content": "---\nChecks:          'clang-diagnostic-*,clang-analyzer-*'\nWarningsAsErrors: ''\nHeaderFilterRegex: ''\nAnalyzeTemporaryDtors: false\nFormatStyle:     none\nUser:            linguist-user\nCheckOptions:\n  - key:             google-readability-braces-around-statements.ShortStatementLines\n    value:           '1'\n  - key:             google-readability-function-size.StatementThreshold\n    value:           '800'\n  - key:             google-readability-namespace-comments.ShortNamespaceLines\n    value:           '10'\n  - key:             google-readability-namespace-comments.SpacesBeforeComments\n    value:           '2'\n  - key:             modernize-loop-convert.MaxCopySize\n    value:           '16'\n  - key:             modernize-loop-convert.MinConfidence\n    value:           reasonable\n  - key:             modernize-loop-convert.NamingStyle\n    value:           CamelCase\n  - key:             modernize-pass-by-value.IncludeStyle\n    value:           llvm\n  - key:             modernize-replace-auto-ptr.IncludeStyle\n    value:           llvm\n  - key:             modernize-use-nullptr.NullMacros\n    value:           'NULL'\n...\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/YAML/filenames/.gemrc",
    "content": "gem:  --local --gen-rdoc --run-tests\nrdoc: --inline-source --line-numbers\ngempath:\n  - /usr/local/rubygems\n  - /home/gavin/.rubygems\n"
  },
  {
    "path": "src/test/resources/samples/langs/YAML/source.r-console.syntax",
    "content": "--- \nname: R Console\nfileTypes: []\n\nscopeName: source.r-console\nuuid: F629C7F3-823B-4A4C-8EEE-9971490C5710\npatterns: \n- name: source.r.embedded.r-console\n  begin: \"^> \"\n  beginCaptures: \n    \"0\": \n      name: punctuation.section.embedded.r-console\n  end: \\n|\\z\n  patterns: \n  - include: source.r\nkeyEquivalent: ^~R\n"
  },
  {
    "path": "src/test/resources/samples/langs/YAML/vcr_cassette.yml",
    "content": "---\nhttp_interactions:\n- request:\n    method: get\n    uri: http://example.com/\n    body: ''\n    headers: {}\n  response:\n    status:\n      code: 200\n      message: OK\n    headers:\n      Content-Type:\n      - text/html;charset=utf-8\n      Content-Length:\n      - '26'\n    body: This is the response body\n    http_version: '1.1'\n  recorded_at: Tue, 01 Nov 2011 04:58:44 GMT\nrecorded_with: VCR 2.0.0\n"
  },
  {
    "path": "src/test/resources/samples/langs/YANG/sfc-lisp-impl.yang",
    "content": "module sfc-lisp-impl {\n\n  yang-version 1;\n  namespace \"urn:opendaylight:params:xml:ns:yang:controller:config:sfc-lisp:impl\";\n  prefix \"sfc-lisp-impl\";\n\n  import config { prefix config; revision-date 2013-04-05; }\n  import rpc-context { prefix rpcx; revision-date 2013-06-17; }\n  import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; }\n\n\n  description\n      \"This module contains the base YANG definitions for\n      sfc-lisp implementation.\";\n\n  revision \"2015-04-27\" {\n      description\n          \"Initial revision.\";\n  }\n\n  // This is the definition of the service implementation as a module identity\n  identity sfc-lisp-impl {\n      base config:module-type;\n\n      // Specifies the prefix for generated java classes.\n      config:java-name-prefix SfcLisp;\n  }\n\n\n  // Augments the 'configuration' choice node under modules/module.\n  augment \"/config:modules/config:module/config:configuration\" {\n    case sfc-lisp-impl {\n      when \"/config:modules/config:module/config:type = 'sfc-lisp-impl'\";\n\n      //wires in the data-broker service\n      container data-broker {\n        uses config:service-ref {\n          refine type {\n              mandatory false;\n              config:required-identity mdsal:binding-async-data-broker;\n          }\n        }\n      }\n\n      container rpc-registry {\n        uses config:service-ref {\n          refine type {\n              mandatory true;\n              config:required-identity mdsal:binding-rpc-registry;\n          }\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/test/resources/samples/langs/YARA/OfExample.yar",
    "content": "rule OfExample2\n{\n    strings:\n        $foo1 = \"foo1\"\n        $foo2 = \"foo2\"\n        $foo3 = \"foo3\"\n\n    condition:\n        2 of ($foo*)  // equivalent to 2 of ($foo1,$foo2,$foo3)\n}\n\nrule OfExample3\n{\n    strings:\n        $foo1 = \"foo1\"\n        $foo2 = \"foo2\"\n\n        $bar1 = \"bar1\"\n        $bar2 = \"bar2\"\n\n    condition:\n        3 of ($foo*,$bar1,$bar2)\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/YARA/example.yara",
    "content": "rule silent_banker : banker\n{\n    meta:\n        description = \"This is just an example\"\n        thread_level = 3\n        in_the_wild = true\n    strings:\n        $a = {6A 40 68 00 30 00 00 6A 14 8D 91}\n        $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}\n        $c = \"UVODFRYSIHLNWPEJXQZAKCBGMT\"\n    condition:\n        $a or $b or $c\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/YARA/true.yar",
    "content": "rule test { condition: true }\n"
  },
  {
    "path": "src/test/resources/samples/langs/Zephir/Cblock.zep",
    "content": "/**\n * CBLOCK tests\n * asfas\n */\n\n%{\n// top statement before namespace, add to after headers\n#define MAX_FACTOR 40\n}%\n\nnamespace Test;\n\n%{\n// top statement before class, add to after headers\n// test include .h\n#include \"kernel/require.h\"\n}%\n\n%{\n\n// c implement fibonacci\nstatic long fibonacci(long n) {\n        if (n < 2) return n;\n        else return fibonacci(n - 2) + fibonacci(n - 1);\n}\n\n}%\n\nclass Cblock\n{\n    public function testCblock1()\n    {\n        int a = 0;\n\n        %{\n            a = MAX_FACTOR;\n        }%\n\n        return a;\n    }\n\n    public function testCblock2()\n    {\n            long a = 0;\n\n            %{\n                a = fibonacci(MAX_FACTOR);\n            }%\n\n            return a;\n    }\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Zephir/Router.zep",
    "content": "\nnamespace Test\\Router;\n\n/**\n * Test\\Router\\Route\n *\n * This class represents every route added to the router\n */\nclass Route\n{\n    protected _pattern;\n\n    protected _compiledPattern;\n\n    protected _paths;\n\n    protected _methods;\n\n    protected _hostname;\n\n    protected _converters;\n\n    protected _id;\n\n    protected _name;\n\n    protected _beforeMatch;\n\n    /**\n     * Test\\Router\\Route constructor\n     *\n     * @param string pattern\n     * @param array paths\n     * @param array|string httpMethods\n     */\n    public function __construct(pattern, paths=null, httpMethods=null)\n    {\n        // Configure the route (extract parameters, paths, etc)\n        this->reConfigure(pattern, paths);\n\n        // Update the HTTP method constraints\n        let this->_methods = httpMethods;\n    }\n\n    /**\n     * Replaces placeholders from pattern returning a valid PCRE regular expression\n     *\n     * @param string pattern\n     * @return string\n     */\n    public function compilePattern(pattern)\n    {\n        var idPattern;\n\n        // If a pattern contains ':', maybe there are placeholders to replace\n        if memstr(pattern, \":\") {\n\n            // This is a pattern for valid identifiers\n            let idPattern = \"/([a-zA-Z0-9\\\\_\\\\-]+)\";\n\n            // Replace the module part\n            if memstr(pattern, \"/:module\") {\n                let pattern = str_replace(\"/:module\", idPattern, pattern);\n            }\n\n            // Replace the controller placeholder\n            if memstr(pattern, \"/:controller\") {\n                let pattern = str_replace(\"/:controller\", idPattern, pattern);\n            }\n\n            // Replace the namespace placeholder\n            if memstr(pattern, \"/:namespace\") {\n                let pattern = str_replace(\"/:namespace\", idPattern, pattern);\n            }\n\n            // Replace the action placeholder\n            if memstr(pattern, \"/:action\") {\n                let pattern = str_replace(\"/:action\", idPattern, pattern);\n            }\n\n            // Replace the params placeholder\n            if memstr(pattern, \"/:params\") {\n                let pattern = str_replace(\"/:params\", \"(/.*)*\", pattern);\n            }\n\n            // Replace the int placeholder\n            if memstr(pattern, \"/:int\") {\n                let pattern = str_replace(\"/:int\", \"/([0-9]+)\", pattern);\n            }\n        }\n\n        // Check if the pattern has parantheses in order to add the regex delimiters\n        if memstr(pattern, \"(\") {\n            return \"#^\" . pattern . \"$#\";\n        }\n\n        // Square brackets are also checked\n        if memstr(pattern, \"[\") {\n            return \"#^\" . pattern . \"$#\";\n        }\n\n        return pattern;\n    }\n\n    /**\n     * Set one or more HTTP methods that constraint the matching of the route\n     *\n     *<code>\n     * $route->via('GET');\n     * $route->via(array('GET', 'POST'));\n     *</code>\n     *\n     * @param string|array httpMethods\n     * @return Test\\Router\\Route\n     */\n    public function via(httpMethods)\n    {\n        let this->_methods = httpMethods;\n        return this;\n    }\n\n    /**\n     * Extracts parameters from a string\n     *\n     * @param string pattern\n     */\n    public function extractNamedParams(string pattern)\n    {\n\n        char ch;\n        var tmp, matches;\n        boolean notValid = false;\n        int cursor, cursorVar, marker, bracketCount = 0, parenthesesCount = 0, foundPattern = 0;\n        int intermediate = 0, numberMatches = 0;\n        string route, item, variable, regexp;\n\n        if strlen(pattern) <= 0 {\n            return false;\n        }\n\n        let matches = [],\n        route = \"\";\n\n        for cursor, ch in pattern {\n\n            if parenthesesCount == 0 {\n                if ch == '{' {\n                    if bracketCount == 0 {\n                        let marker = cursor + 1,\n                            intermediate = 0,\n                            notValid = false;\n                    }\n                    let bracketCount++;\n                } else {\n                    if ch == '}' {\n                        let bracketCount--;\n                        if intermediate > 0 {\n                            if bracketCount == 0 {\n\n                                let numberMatches++,\n                                    variable = null,\n                                    regexp = null,\n                                    item = (string) substr(pattern, marker, cursor - marker);\n\n                                for cursorVar, ch in item {\n\n                                    if ch == '\\0' {\n                                        break;\n                                    }\n\n                                    if cursorVar == 0 && !((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {\n                                        let notValid = true;\n                                        break;\n                                    }\n\n                                    if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <='9') || ch == '-' || ch == '_' || ch ==  ':' {\n                                        if ch == ':' {\n                                            let variable = (string) substr(item, 0, cursorVar),\n                                                regexp = (string) substr(item, cursorVar + 1);\n                                            break;\n                                        }\n                                    } else {\n                                        let notValid = true;\n                                        break;\n                                    }\n\n                                }\n\n                                if !notValid {\n\n                                    let tmp = numberMatches;\n\n                                    if variable && regexp {\n\n                                        let foundPattern = 0;\n                                        for ch in regexp {\n                                            if ch == '\\0' {\n                                                break;\n                                            }\n                                            if !foundPattern {\n                                                if ch == '(' {\n                                                    let foundPattern = 1;\n                                                }\n                                            } else {\n                                                if ch == ')' {\n                                                    let foundPattern = 2;\n                                                    break;\n                                                }\n                                            }\n                                        }\n\n                                        if foundPattern != 2 {\n                                            let route .= '(',\n                                                route .= regexp,\n                                                route .= ')';\n                                        } else {\n                                            let route .= regexp;\n                                        }\n                                        let matches[variable] = tmp;\n                                    } else {\n                                        let route .= \"([^/]*)\",\n                                            matches[item] = tmp;\n                                    }\n                                } else {\n                                    let route .= \"{\" . item .\"}\";\n                                }\n                                continue;\n                            }\n                        }\n                    }\n                }\n            }\n\n            if bracketCount == 0 {\n                if ch == '(' {\n                    let parenthesesCount++;\n                } else {\n                    if ch == ')' {\n                        let parenthesesCount--;\n                        if parenthesesCount == 0 {\n                            let numberMatches++;\n                        }\n                    }\n                }\n            }\n\n            if bracketCount > 0 {\n                let intermediate++;\n            } else {\n                let route .= ch;\n            }\n        }\n\n        return [route, matches];\n    }\n\n    /**\n     * Reconfigure the route adding a new pattern and a set of paths\n     *\n     * @param string pattern\n     * @param array paths\n     */\n    public function reConfigure(pattern, paths=null)\n    {\n        var moduleName, controllerName, actionName,\n            parts, routePaths, realClassName, namespaceName,\n            pcrePattern, compiledPattern, extracted;\n\n        if typeof pattern != \"string\" {\n            throw new Exception(\"The pattern must be string\");\n        }\n\n        if paths !== null {\n            if typeof paths == \"string\" {\n\n                let moduleName = null,\n                    controllerName = null,\n                    actionName = null;\n\n                // Explode the short paths using the :: separator\n                let parts = explode(\"::\", paths);\n\n                // Create the array paths dynamically\n                switch count(parts) {\n                    case 3:\n                        let moduleName = parts[0],\n                            controllerName = parts[1],\n                            actionName = parts[2];\n                        break;\n                    case 2:\n                        let controllerName = parts[0],\n                            actionName = parts[1];\n                        break;\n                    case 1:\n                        let controllerName = parts[0];\n                        break;\n                }\n\n                let routePaths = [];\n\n                // Process module name\n                if moduleName !== null {\n                    let routePaths[\"module\"] = moduleName;\n                }\n\n                // Process controller name\n                if controllerName !== null {\n\n                    // Check if we need to obtain the namespace\n                    if memstr(controllerName, \"\\\\\") {\n\n                        // Extract the real class name from the namespaced class\n                        let realClassName = get_class_ns(controllerName);\n\n                        // Extract the namespace from the namespaced class\n                        let namespaceName = get_ns_class(controllerName);\n\n                        // Update the namespace\n                        if namespaceName {\n                            let routePaths[\"namespace\"] = namespaceName;\n                        }\n                    } else {\n                        let realClassName = controllerName;\n                    }\n\n                    // Always pass the controller to lowercase\n                    let routePaths[\"controller\"] = uncamelize(realClassName);\n                }\n\n                // Process action name\n                if actionName !== null {\n                    let routePaths[\"action\"] = actionName;\n                }\n            } else {\n                let routePaths = paths;\n            }\n        } else {\n            let routePaths = [];\n        }\n\n        if typeof routePaths !== \"array\" {\n            throw new Exception(\"The route contains invalid paths\");\n        }\n\n        // If the route starts with '#' we assume that it is a regular expression\n        if !starts_with(pattern, \"#\") {\n\n            if memstr(pattern, \"{\") {\n                // The route has named parameters so we need to extract them\n                let extracted = this->extractNamedParams(pattern),\n                    pcrePattern = extracted[0],\n                    routePaths = array_merge(routePaths, extracted[1]);\n            } else {\n                let pcrePattern = pattern;\n            }\n\n            // Transform the route's pattern to a regular expression\n            let compiledPattern = this->compilePattern(pcrePattern);\n        } else {\n            let compiledPattern = pattern;\n        }\n\n        // Update the original pattern\n        let this->_pattern = pattern;\n\n        // Update the compiled pattern\n        let this->_compiledPattern = compiledPattern;\n\n        //Update the route's paths\n        let this->_paths = routePaths;\n    }\n\n    /**\n     * Returns the route's name\n     *\n     * @return string\n     */\n    public function getName()\n    {\n        return this->_name;\n    }\n\n    /**\n     * Sets the route's name\n     *\n     *<code>\n     * $router->add('/about', array(\n     *     'controller' => 'about'\n     * ))->setName('about');\n     *</code>\n     *\n     * @param string name\n     * @return Route\n     */\n    public function setName(name)\n    {\n        let this->_name = name;\n        return this;\n    }\n\n    /**\n     * Sets a callback that is called if the route is matched.\n     * The developer can implement any arbitrary conditions here\n     * If the callback returns false the route is treaded as not matched\n     *\n     * @param callback callback\n     * @return Test\\Router\\Route\n     */\n    public function beforeMatch(callback)\n    {\n        let this->_beforeMatch = callback;\n        return this;\n    }\n\n    /**\n     * Returns the 'before match' callback if any\n     *\n     * @return mixed\n     */\n    public function getBeforeMatch()\n    {\n        return this->_beforeMatch;\n    }\n\n    /**\n     * Returns the route's id\n     *\n     * @return string\n     */\n    public function getRouteId()\n    {\n        return this->_id;\n    }\n\n    /**\n     * Returns the route's pattern\n     *\n     * @return string\n     */\n    public function getPattern()\n    {\n        return this->_pattern;\n    }\n\n    /**\n     * Returns the route's compiled pattern\n     *\n     * @return string\n     */\n    public function getCompiledPattern()\n    {\n        return this->_compiledPattern;\n    }\n\n    /**\n     * Returns the paths\n     *\n     * @return array\n     */\n    public function getPaths()\n    {\n        return this->_paths;\n    }\n\n    /**\n     * Returns the paths using positions as keys and names as values\n     *\n     * @return array\n     */\n    public function getReversedPaths()\n    {\n        var reversed, path, position;\n\n        let reversed = [];\n        for path, position in this->_paths {\n            let reversed[position] = path;\n        }\n        return reversed;\n    }\n\n    /**\n     * Sets a set of HTTP methods that constraint the matching of the route (alias of via)\n     *\n     *<code>\n     * $route->setHttpMethods('GET');\n     * $route->setHttpMethods(array('GET', 'POST'));\n     *</code>\n     *\n     * @param string|array httpMethods\n     * @return Test\\Router\\Route\n     */\n    public function setHttpMethods(httpMethods)\n    {\n        let this->_methods = httpMethods;\n        return this;\n    }\n\n    /**\n     * Returns the HTTP methods that constraint matching the route\n     *\n     * @return string|array\n     */\n    public function getHttpMethods()\n    {\n        return this->_methods;\n    }\n\n    /**\n     * Sets a hostname restriction to the route\n     *\n     *<code>\n     * $route->setHostname('localhost');\n     *</code>\n     *\n     * @param string|array httpMethods\n     * @return Test\\Router\\Route\n     */\n    public function setHostname(hostname)\n    {\n        let this->_hostname = hostname;\n        return this;\n    }\n\n    /**\n     * Returns the hostname restriction if any\n     *\n     * @return string\n     */\n    public function getHostname()\n    {\n        return this->_hostname;\n    }\n\n    /**\n     * Adds a converter to perform an additional transformation for certain parameter\n     *\n     * @param string name\n     * @param callable converter\n     * @return Test\\Router\\Route\n     */\n    public function convert(name, converter)\n    {\n        let this->_converters[name] = converter;\n        return this;\n    }\n\n    /**\n     * Returns the router converter\n     *\n     * @return array\n     */\n    public function getConverters()\n    {\n        return this->_converters;\n    }\n\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/Zimpl/sample.zmpl",
    "content": "# $Id: queens3.zpl,v 1.3 2009/09/13 16:15:53 bzfkocht Exp $\n#\n# This is a formulation of the n queens problem using binary variables.\n# variables. Since the number of queens is maximized, the size of the\n# board can be set arbitrarily.\n#\nparam columns := 8;\n\nset I   := { 1 .. columns };\nset IxI := I * I;\n\nset TABU[<i,j> in IxI] := { <m,n> in IxI with \n   (m != i or n != j) and (m == i or n == j or abs(m - i) == abs(n - j)) };\n\nvar x[IxI] binary;\n\nmaximize queens: sum <i,j> in IxI : x[i,j];\n\nsubto c1: forall <i,j> in IxI do\n   card(TABU[i,j]) - card(TABU[i,j]) * x[i,j] >= sum <m,n> in TABU[i,j] : x[m,n];\n   \n"
  },
  {
    "path": "src/test/resources/samples/langs/desktop/example.desktop",
    "content": "# http://standards.freedesktop.org/desktop-entry-spec/latest/apa.html\n\n[Desktop Entry]\nVersion=1.0\nType=Application\nName=Foo Viewer\nComment=The best viewer for Foo objects available!\nTryExec=fooview\nExec=fooview %F\nIcon=fooview\nMimeType=image/x-foo;\nActions=Gallery;Create;\n\n[Desktop Action Gallery]\nExec=fooview --gallery\nName=Browse Gallery\n\n[Desktop Action Create]\nExec=fooview --create-new\nName=Create a new Foo!\nIcon=fooview-new"
  },
  {
    "path": "src/test/resources/samples/langs/eC/Designer.ec",
    "content": "import \"ide\"\n\nclass Designer : DesignerBase\n{\n   ~Designer()\n   {\n      if(GetActiveDesigner() == this)\n      {\n         SetActiveDesigner(null);\n      }\n      if(classDesigner)\n         delete classDesigner;\n   }\n\n   // *** DesignerBase Implementation ***\n\n   void ModifyCode()\n   {\n      codeEditor.ModifyCode();\n   }\n\n   void UpdateProperties()\n   {\n      codeEditor.DesignerModifiedObject();\n   }\n\n   void CodeAddObject(Instance instance, ObjectInfo * object)\n   {\n      codeEditor.AddObject(instance, object);\n   }\n\n   void SheetAddObject(ObjectInfo object)\n   {\n      codeEditor.sheet.AddObject(object, object.name, typeData, true); //className, true);\n   }\n\n   void AddToolBoxClass(Class _class)\n   {\n      ((IDEWorkSpace)master).toolBox.AddControl(_class);\n   }\n\n   void AddDefaultMethod(Instance instance, Instance classInstance)\n   {\n      Class _class = instance._class;\n      Method defaultMethod = null;\n\n      for( ; _class; _class = _class.base)\n      {\n         Method method;\n         int minID = MAXINT;\n         for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)\n         {\n            if(method.type == virtualMethod)\n            {\n               if(!method.dataType)\n                  method.dataType = ProcessTypeString(method.dataTypeString, false);\n               if(method.vid < minID && (instance == classInstance || (method.dataType.thisClass && eClass_IsDerived(classInstance._class, method.dataType.thisClass.registered))))\n               {\n                  defaultMethod = method;\n                  minID = method.vid;\n               }\n            }\n         }\n         if(defaultMethod)\n            break;\n      }\n      codeEditor.AddMethod(defaultMethod);\n   }\n\n   bool ObjectContainsCode(ObjectInfo object)\n   {\n      // Confirmation if control contains code\n      if(object.instCode)\n      {\n         MembersInit members;\n         if(object.instCode.members)\n         {\n            for(members = object.instCode.members->first; members; members = members.next)\n            {\n               if(members.type == methodMembersInit)\n               {\n                  //if(!Code_IsFunctionEmpty(members.function))\n                  {\n                     return true;\n                  }\n               }\n            }\n         }\n      }\n      return false;\n   }\n\n   void DeleteObject(ObjectInfo object)\n   {\n      if(codeEditor)\n         codeEditor.DeleteObject(object);\n   }\n\n   void RenameObject(ObjectInfo object, const char * name)\n   {\n      if(object && (name || !object.classDefinition))\n         codeEditor.RenameObject(object, name);\n   }\n\n   bool FindObject(Instance * object, const char * string)\n   {\n      ObjectInfo classObject;\n      for(classObject = codeEditor.classes.first; classObject; classObject = classObject.next)\n      {\n         ObjectInfo check;\n         if(classObject.name && !strcmp(string, classObject.name))\n         {\n            *object = classObject.instance;\n            break;\n         }\n         for(check = classObject.instances.first; check; check = check.next)\n         {\n            if(check.name && !strcmp(string, check.name))\n            {\n               *object = check.instance;\n               break;\n            }\n         }\n         if(check)\n            return true;\n      }\n      return false;\n   }\n\n   void SelectObjectFromDesigner(ObjectInfo object)\n   {\n      codeEditor.SelectObjectFromDesigner(object);\n   }\n\n   borderStyle = sizable;\n   isActiveClient = true;\n   hasVertScroll = true;\n   hasHorzScroll = true;\n   hasClose = true;\n   hasMaximize = true;\n   hasMinimize = true;\n   text = $\"Designer\";\n   menu = Menu { };\n   anchor = Anchor { left = 300, right = 150, top = 0, bottom = 0 };\n\n   ToolBox toolBox;\n   CodeEditor codeEditor;\n\n   Menu fileMenu { menu, $\"File\", f };\n   MenuItem fileSaveItem\n   {\n      fileMenu, $\"Save\", s, ctrlS;\n      bool NotifySelect(MenuItem selection, Modifiers mods)\n      {\n         return codeEditor.MenuFileSave(selection, mods);\n      }\n   };\n   MenuItem fileSaveAsItem\n   {\n      fileMenu, $\"Save As...\", a;\n      bool NotifySelect(MenuItem selection, Modifiers mods)\n      {\n         return codeEditor.MenuFileSaveAs(selection, mods);\n      }\n   };\n   bool debugClosing;\n\n   bool OnClose(bool parentClosing)\n   {\n      if(!parentClosing)\n      {\n         if(codeEditor && codeEditor.inUseDebug && !debugClosing)\n         {\n            debugClosing = true;\n            closing = false;\n            if(CloseConfirmation(false))\n            {\n               visible = false;\n               if(modifiedDocument)\n                  OnFileModified({ modified = true }, null);\n            }\n            debugClosing = false;\n            return false;\n         }\n         if(codeEditor && !codeEditor.closing && !debugClosing)\n         {\n            if(!codeEditor.visible)\n            {\n               if(!codeEditor.Destroy(0))\n                  return false;\n               else\n                  codeEditor = null;\n            }\n            else\n            {\n               visible = false;\n               return false;\n            }\n         }\n      }\n      return true;\n   }\n\n   bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)\n   {\n      if(active)\n      {\n         codeEditor.EnsureUpToDate();\n         codeEditor.fixCaret = true;\n         /*\n         if(classDesigner)\n            classDesigner.Activate();\n         */\n      }\n      return true;\n   }\n\n   bool OnKeyHit(Key key, unichar ch)\n   {\n      return codeEditor.sheet.OnKeyHit(key, ch);\n   }\n\n   watch(modifiedDocument)\n   {\n      fileSaveItem.disabled = !modifiedDocument && codeEditor.fileName;\n   };\n\n   // *** METHODS ACCESSED FROM PROPERTY SHEET/TOOLBOX/CODE EDITOR ***\n   void Reset()\n   {\n      if(classDesigner)\n      {\n         classDesigner.Reset();\n         classDesigner.SelectObject(null, null);\n         classDesigner.Destroy(0);\n         delete classDesigner;\n      }\n   }\n\n   void FillToolBox()\n   {\n      if(this && classDesigner)\n         classDesigner.ListToolBoxClasses(this);\n   }\n\n   void SelectObject(ObjectInfo object, Instance instance)\n   {\n      ClassDesignerBase classDesigner = this.classDesigner;\n#ifdef _DEBUG\n      if(instance && instance._class.module.application != codeEditor.privateModule)\n         printf(\"warning: SelectObject: instance._class.module.application != codeEditor.privateModule\\n\");\n#endif\n      if(!classDesigner || !instance || classDesigner._class != (Class)eInstance_GetDesigner(instance))\n      {\n         if(classDesigner)\n         {\n            classDesigner.SelectObject(null, null);\n            classDesigner.Destroy(0);\n            classDesigner = null;\n            delete this.classDesigner;\n         }\n         if(instance)\n         {\n            this.classDesigner = classDesigner = eInstance_New(eInstance_GetDesigner(instance));\n            incref classDesigner;\n            //if(!classDesigner.parent)\n            {\n               classDesigner.parent = this;\n               classDesigner.anchor = Anchor { left = 0, right = 0, top = 0, bottom = 0 };\n            }\n            classDesigner.Create();\n         }\n      }\n      // Call class editor SelectObject\n      if(classDesigner)\n         classDesigner.SelectObject(object, instance);\n   }\n\n   void AddObject()\n   {\n      // Call class editor AddObject\n      if(classDesigner)\n         classDesigner.AddObject();\n      if(visible)\n         Activate();\n      else\n         codeEditor.Activate();\n   }\n\n   void CreateObject(Instance instance, ObjectInfo object, bool isClass, Instance iclass)\n   {\n      subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);\n\n      // Call class editor CreateObject\n      if(designerClass)\n         designerClass.CreateObject(this, instance, object, isClass, iclass);\n   }\n\n   void ::PostCreateObject(Instance instance, ObjectInfo object, bool isClass, Instance iclass)\n   {\n      subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);\n\n      // Call class editor PostCreateObject\n      if(designerClass)\n         designerClass.PostCreateObject(instance, object, isClass, iclass);\n   }\n\n   void ::DroppedObject(Instance instance, ObjectInfo object, bool isClass, Instance iclass)\n   {\n      subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);\n\n      // Call class editor PostCreateObject\n      if(designerClass)\n         designerClass.DroppedObject(instance, object, isClass, iclass);\n   }\n\n   void PrepareTestObject(Instance instance)\n   {\n      subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);\n      if(designerClass)\n         designerClass.PrepareTestObject(this, instance);\n   }\n\n   void ::DestroyObject(Instance instance)\n   {\n      subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);\n      if(designerClass)\n         designerClass.DestroyObject(instance);\n   }\n\n   void ::FixProperty(Property prop, Instance instance)\n   {\n      subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);\n      if(designerClass)\n         designerClass.FixProperty(prop, instance);\n   }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/edn/bigger-than-pluto.edn",
    "content": "[{:db/id #db/id [db.part/db]\n  :db/ident :object/name\n  :db/doc \"Name of a Solar System object.\"\n  :db/valueType :db.type/string\n  :db/index true\n  :db/cardinality :db.cardinality/one\n  :db.install/_attribute :db.part/db}\n {:db/id #db/id [db.part/db]\n  :db/ident :object/meanRadius\n  :db/doc \"Mean radius of an object.\"\n  :db/index true\n  :db/valueType :db.type/double\n  :db/cardinality :db.cardinality/one\n  :db.install/_attribute :db.part/db}\n {:db/id #db/id [db.part/db]\n  :db/ident :data/source\n  :db/doc \"Source of the data in a transaction.\"\n  :db/valueType :db.type/string\n  :db/index true\n  :db/cardinality :db.cardinality/one\n  :db.install/_attribute :db.part/db}]\n[{:db/id #db/id [db.part/tx]\n  :db/doc \"Solar system objects bigger than Pluto.\"}\n {:db/id #db/id [db.part/tx]\n  :data/source \"http://en.wikipedia.org/wiki/List_of_Solar_System_objects_by_size\"}\n {:db/id #db/id [db.part/user]\n  :object/name \"Sun\"\n  :object/meanRadius 696000.0}\n {:db/id #db/id [db.part/user]\n  :object/name \"Jupiter\"\n  :object/meanRadius 69911.0}\n {:db/id #db/id [db.part/user]\n  :object/name \"Saturn\"\n  :object/meanRadius 58232.0}\n {:db/id #db/id [db.part/user]\n  :object/name \"Uranus\"\n  :object/meanRadius 25362.0}\n {:db/id #db/id [db.part/user]\n  :object/name \"Neptune\"\n  :object/meanRadius 24622.0}\n {:db/id #db/id [db.part/user]\n  :object/name \"Earth\"\n  :object/meanRadius 6371.0}\n {:db/id #db/id [db.part/user]\n  :object/name \"Venus\"\n  :object/meanRadius 6051.8}\n {:db/id #db/id [db.part/user]\n  :object/name \"Mars\"\n  :object/meanRadius 3390.0}\n {:db/id #db/id [db.part/user]\n  :object/name \"Ganymede\"\n  :object/meanRadius 2631.2}\n {:db/id #db/id [db.part/user]\n  :object/name \"Titan\"\n  :object/meanRadius 2576.0}\n {:db/id #db/id [db.part/user]\n  :object/name \"Mercury\"\n  :object/meanRadius 2439.7}\n {:db/id #db/id [db.part/user]\n  :object/name \"Callisto\"\n  :object/meanRadius 2410.3}\n {:db/id #db/id [db.part/user]\n  :object/name \"Io\"\n  :object/meanRadius 1821.5}\n {:db/id #db/id [db.part/user]\n  :object/name \"Moon\"\n  :object/meanRadius 1737.1}\n {:db/id #db/id [db.part/user]\n  :object/name \"Europa\"\n  :object/meanRadius 1561.0}\n {:db/id #db/id [db.part/user]\n  :object/name \"Triton\"\n  :object/meanRadius 1353.4}\n {:db/id #db/id [db.part/user]\n  :object/name \"Eris\"\n  :object/meanRadius 1163.0}]\n"
  },
  {
    "path": "src/test/resources/samples/langs/fish/config.fish",
    "content": "#\n# Main file for fish command completions. This file contains various\n# common helper functions for the command completions. All actual\n# completions are located in the completions subdirectory.\n#\n\n#\n# Set default field separators\n#\n\nset -g IFS \\n\\ \\t\n\n#\n# Set default search paths for completions and shellscript functions\n# unless they already exist\n#\n\nset -l configdir ~/.config\n\nif set -q XDG_CONFIG_HOME\n\tset configdir $XDG_CONFIG_HOME\nend\n\n# __fish_datadir, __fish_sysconfdir, __fish_help_dir, __fish_bin_dir\n# are expected to have been set up by read_init from fish.cpp\n\n# Set up function and completion paths. Make sure that the fish\n# default functions/completions are included in the respective path.\n\nif not set -q fish_function_path\n\tset fish_function_path $configdir/fish/functions    $__fish_sysconfdir/functions    $__fish_datadir/functions\nend\n\nif not contains $__fish_datadir/functions $fish_function_path\n\tset fish_function_path[-1] $__fish_datadir/functions\nend\n\nif not set -q fish_complete_path\n\tset fish_complete_path $configdir/fish/completions  $__fish_sysconfdir/completions  $__fish_datadir/completions\nend\n\nif not contains $__fish_datadir/completions $fish_complete_path\n\tset fish_complete_path[-1] $__fish_datadir/completions\nend\n\n#\n# This is a Solaris-specific test to modify the PATH so that\n# Posix-conformant tools are used by default. It is separate from the\n# other PATH code because this directory needs to be prepended, not\n# appended, since it contains POSIX-compliant replacements for various\n# system utilities.\n#\n\nif test -d /usr/xpg4/bin\n\tif not contains /usr/xpg4/bin $PATH\n\t\tset PATH /usr/xpg4/bin $PATH\n\tend\nend\n\n#\n# Add a few common directories to path, if they exists. Note that pure\n# console programs like makedep sometimes live in /usr/X11R6/bin, so we\n# want this even for text-only terminals.\n#\n\nset -l path_list /bin /usr/bin /usr/X11R6/bin /usr/local/bin $__fish_bin_dir\n\n# Root should also have the sbin directories in the path\nswitch $USER\n\tcase root\n\tset path_list $path_list /sbin /usr/sbin /usr/local/sbin\nend\n\nfor i in $path_list\n\tif not contains $i $PATH\n\t\tif test -d $i\n\t\t\tset PATH $PATH $i\n\t\tend\n\tend\nend\n\n#\n# Launch debugger on SIGTRAP\n#\nfunction fish_sigtrap_handler --on-signal TRAP --no-scope-shadowing --description \"Signal handler for the TRAP signal. Lanches a debug prompt.\"\n\tbreakpoint\nend\n\n#\n# Whenever a prompt is displayed, make sure that interactive\n# mode-specific initializations have been performed.\n# This handler removes itself after it is first called.\n#\nfunction __fish_on_interactive --on-event fish_prompt\n\t__fish_config_interactive\n\tfunctions -e __fish_on_interactive\nend\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/fish/eval.fish",
    "content": "\nfunction eval -S -d \"Evaluate parameters as a command\"\n\n\t# If we are in an interactive shell, eval should enable full\n\t# job control since it should behave like the real code was\n\t# executed.  If we don't do this, commands that expect to be\n\t# used interactively, like less, wont work using eval.\n\n\tset -l mode\n\tif status --is-interactive-job-control\n\t\tset mode interactive\n\telse\n\t\tif status --is-full-job-control\n\t\t\tset mode full\n\t\telse\n\t\t\tset mode none\n\t\tend\n\tend\n\tif status --is-interactive\n\t\tstatus --job-control full\n\tend\n\n\techo \"begin; $argv ;end eval2_inner <&3 3<&-\" | . 3<&0\n\tset -l res $status\n\n\tstatus --job-control $mode\n\treturn $res\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/fish/funced.fish",
    "content": "function funced --description 'Edit function definition'\n    set -l editor $EDITOR\n    set -l interactive\n    set -l funcname\n    while set -q argv[1]\n        switch $argv[1]\n            case -h --help\n                __fish_print_help funced\n                return 0\n\n            case -e --editor\n                set editor $argv[2]\n                set -e argv[2]\n\n            case -i --interactive\n                set interactive 1\n\n            case --\n                set funcname $funcname $argv[2]\n                set -e argv[2]\n\n            case '-*'\n                set_color red\n                printf (_ \"%s: Unknown option %s\\n\") funced $argv[1]\n                set_color normal\n                return 1\n\n            case '*' '.*'\n                set funcname $funcname $argv[1]\n        end\n        set -e argv[1]\n    end\n\n    if begin; set -q funcname[2]; or not test \"$funcname[1]\"; end\n        set_color red\n        _ \"funced: You must specify one function name\n\"\n        set_color normal\n        return 1\n    end\n\n    set -l init\n    switch $funcname\n        case '-*'\n        set init function -- $funcname\\n\\nend\n        case '*'\n        set init function $funcname\\n\\nend\n    end\n\n    # Break editor up to get its first command (i.e. discard flags)\n    if test -n \"$editor\"\n        set -l editor_cmd\n        eval set editor_cmd $editor\n        if not type -f \"$editor_cmd[1]\" >/dev/null\n            _ \"funced: The value for \\$EDITOR '$editor' could not be used because the command '$editor_cmd[1]' could not be found\n    \"\n            set editor fish\n        end\n    end\n    \n    # If no editor is specified, use fish\n    if test -z \"$editor\"\n        set editor fish\n    end\n\n    if begin; set -q interactive[1]; or test \"$editor\" = fish; end\n        set -l IFS\n        if functions -q -- $funcname\n            # Shadow IFS here to avoid array splitting in command substitution\n            set init (functions -- $funcname | fish_indent --no-indent)\n        end\n\n        set -l prompt 'printf \"%s%s%s> \" (set_color green) '$funcname' (set_color normal)'\n        # Unshadow IFS since the fish_title breaks otherwise\n        set -e IFS\n        if read -p $prompt -c \"$init\" -s cmd\n            # Shadow IFS _again_ to avoid array splitting in command substitution\n            set -l IFS\n            eval (echo -n $cmd | fish_indent)\n        end\n        return 0\n    end\n\n    set -q TMPDIR; or set -l TMPDIR /tmp\n    set -l tmpname (printf \"$TMPDIR/fish_funced_%d_%d.fish\" %self (random))\n    while test -f $tmpname\n        set tmpname (printf \"$TMPDIR/fish_funced_%d_%d.fish\" %self (random))\n    end\n\n    if functions -q -- $funcname\n        functions -- $funcname > $tmpname\n    else\n        echo $init > $tmpname\n    end\n    if eval $editor $tmpname\n        . $tmpname\n    end\n    set -l stat $status\n    rm -f $tmpname >/dev/null\n    return $stat\nend\n"
  },
  {
    "path": "src/test/resources/samples/langs/reStructuredText/HACKING.rst.txt",
    "content": "Contributing to SciPy\n=====================\n\nThis document aims to give an overview of how to contribute to SciPy.  It\ntries to answer commonly asked questions, and provide some insight into how the\ncommunity process works in practice.  Readers who are familiar with the SciPy\ncommunity and are experienced Python coders may want to jump straight to the\n`git workflow`_ documentation.\n\n\nContributing new code\n---------------------\n\nIf you have been working with the scientific Python toolstack for a while, you\nprobably have some code lying around of which you think \"this could be useful\nfor others too\".  Perhaps it's a good idea then to contribute it to SciPy or\nanother open source project.  The first question to ask is then, where does\nthis code belong?  That question is hard to answer here, so we start with a\nmore specific one: *what code is suitable for putting into SciPy?*\nAlmost all of the new code added to scipy has in common that it's potentially\nuseful in multiple scientific domains and it fits in the scope of existing\nscipy submodules.  In principle new submodules can be added too, but this is\nfar less common.  For code that is specific to a single application, there may\nbe an existing project that can use the code.  Some scikits (`scikit-learn`_,\n`scikits-image`_, `statsmodels`_, etc.) are good examples here; they have a\nnarrower focus and because of that more domain-specific code than SciPy.\n\nNow if you have code that you would like to see included in SciPy, how do you\ngo about it?  After checking that your code can be distributed in SciPy under a\ncompatible license (see FAQ for details), the first step is to discuss on the\nscipy-dev mailing list.  All new features, as well as changes to existing code,\nare discussed and decided on there.  You can, and probably should, already\nstart this discussion before your code is finished.\n\nAssuming the outcome of the discussion on the mailing list is positive and you\nhave a function or piece of code that does what you need it to do, what next?\nBefore code is added to SciPy, it at least has to have good documentation, unit\ntests and correct code style.  \n\n1. Unit tests\n    In principle you should aim to create unit tests that exercise all the code\n    that you are adding.  This gives some degree of confidence that your code\n    runs correctly, also on Python versions and hardware or OSes that you don't\n    have available yourself.  An extensive description of how to write unit\n    tests is given in the NumPy `testing guidelines`_.\n\n2. Documentation\n    Clear and complete documentation is essential in order for users to be able\n    to find and understand the code.  Documentation for individual functions\n    and classes -- which includes at least a basic description, type and\n    meaning of all parameters and returns values, and usage examples in\n    `doctest`_ format -- is put in docstrings.  Those docstrings can be read\n    within the interpreter, and are compiled into a reference guide in html and\n    pdf format.  Higher-level documentation for key (areas of) functionality is\n    provided in tutorial format and/or in module docstrings.  A guide on how to\n    write documentation is given in `how to document`_.\n\n3. Code style\n    Uniformity of style in which code is written is important to others trying\n    to understand the code.  SciPy follows the standard Python guidelines for\n    code style, `PEP8`_.  In order to check that your code conforms to PEP8,\n    you can use the `pep8 package`_ style checker.  Most IDEs and text editors\n    have settings that can help you follow PEP8, for example by translating\n    tabs by four spaces.  Using `pyflakes`_ to check your code is also a good\n    idea.\n\nAt the end of this document a checklist is given that may help to check if your\ncode fulfills all requirements for inclusion in SciPy. \n\nAnother question you may have is: *where exactly do I put my code*?  To answer\nthis, it is useful to understand how the SciPy public API (application\nprogramming interface) is defined.  For most modules the API is two levels\ndeep, which means your new function should appear as\n``scipy.submodule.my_new_func``.  ``my_new_func`` can be put in an existing or\nnew file under ``/scipy/<submodule>/``, its name is added to the ``__all__``\ndict in that file (which lists all public functions in the file), and those\npublic functions are then imported in  ``/scipy/<submodule>/__init__.py``.  Any\nprivate functions/classes should have a leading underscore (``_``) in their\nname.  A more detailed description of what the public API of SciPy is, is given\nin `SciPy API`_.\n\nOnce you think your code is ready for inclusion in SciPy, you can send a pull\nrequest (PR) on Github.  We won't go into the details of how to work with git\nhere, this is described well in the `git workflow`_ section of the NumPy\ndocumentation and in the Github help pages.  When you send the PR for a new\nfeature, be sure to also mention this on the scipy-dev mailing list.  This can\nprompt interested people to help review your PR.  Assuming that you already got\npositive feedback before on the general idea of your code/feature, the purpose\nof the code review is to ensure that the code is correct, efficient and meets\nthe requirements outlined above.  In many cases the code review happens\nrelatively quickly, but it's possible that it stalls.  If you have addressed\nall feedback already given, it's perfectly fine to ask on the mailing list\nagain for review (after a reasonable amount of time, say a couple of weeks, has\npassed).  Once the review is completed, the PR is merged into the \"master\"\nbranch of SciPy.\n\nThe above describes the requirements and process for adding code to SciPy.  It\ndoesn't yet answer the question though how decisions are made exactly.  The\nbasic answer is: decisions are made by consensus, by everyone who chooses to\nparticipate in the discussion on the mailing list.  This includes developers,\nother users and yourself.  Aiming for consensus in the discussion is important\n-- SciPy is a project by and for the scientific Python community.  In those\nrare cases that agreement cannot be reached, the `maintainers`_ of the module\nin question can decide the issue.\n\n\nContributing by helping maintain existing code\n----------------------------------------------\n\nThe previous section talked specifically about adding new functionality to\nSciPy.  A large part of that discussion also applies to maintenance of existing\ncode.  Maintenance means fixing bugs, improving code quality or style,\ndocumenting existing functionality better, adding missing unit tests, keeping\nbuild scripts up-to-date, etc.  The SciPy `Trac`_ bug tracker contains all\nreported bugs, build/documentation issues, etc.  Fixing issues described in\nTrac tickets helps improve the overall quality of SciPy, and is also a good way\nof getting familiar with the project.  You may also want to fix a bug because\nyou ran into it and need the function in question to work correctly.\n\nThe discussion on code style and unit testing above applies equally to bug\nfixes.  It is usually best to start by writing a unit test that shows the\nproblem, i.e. it should pass but doesn't.  Once you have that, you can fix the\ncode so that the test does pass.  That should be enough to send a PR for this\nissue.  Unlike when adding new code, discussing this on the mailing list may\nnot be necessary - if the old behavior of the code is clearly incorrect, no one\nwill object to having it fixed.  It may be necessary to add some warning or\ndeprecation message for the changed behavior.  This should be part of the\nreview process.\n\n\nOther ways to contribute\n------------------------\n\nThere are many ways to contribute other than contributing code.  Participating\nin discussions on the scipy-user and scipy-dev *mailing lists* is a contribution\nin itself.  The `scipy.org`_ *website* contains a lot of information on the\nSciPy community and can always use a new pair of hands.  A redesign of this\nwebsite is ongoing, see `scipy.github.com`_.  The redesigned website is a\nstatic site based on Sphinx, the sources for it are\nalso on Github at `scipy.org-new`_.\n\nThe SciPy *documentation* is constantly being improved by many developers and\nusers.  You can contribute by sending a PR on Github that improves the\ndocumentation, but there's also a `documentation wiki`_ that is very convenient\nfor making edits to docstrings (and doesn't require git knowledge).  Anyone can\nregister a username on that wiki, ask on the scipy-dev mailing list for edit\nrights and make edits.  The documentation there is updated every day with the\nlatest changes in the SciPy master branch, and wiki edits are regularly\nreviewed and merged into master.  Another advantage of the documentation wiki\nis that you can immediately see how the reStructuredText (reST) of docstrings\nand other docs is rendered as html, so you can easily catch formatting errors.\n\nCode that doesn't belong in SciPy itself or in another package but helps users\naccomplish a certain task is valuable.  `SciPy Central`_ is the place to share\nthis type of code (snippets, examples, plotting code, etc.).\n\n\nUseful links, FAQ, checklist\n----------------------------\n\nChecklist before submitting a PR\n````````````````````````````````\n\n  - Are there unit tests with good code coverage?\n  - Do all public function have docstrings including examples?\n  - Is the code style correct (PEP8, pyflakes)\n  - Is the new functionality tagged with ``.. versionadded:: X.Y.Z`` (with\n    X.Y.Z the version number of the next release - can be found in setup.py)?\n  - Is the new functionality mentioned in the release notes of the next\n    release?\n  - Is the new functionality added to the reference guide?\n  - In case of larger additions, is there a tutorial or more extensive\n    module-level description?\n  - In case compiled code is added, is it integrated correctly via setup.py\n    (and preferably also Bento/Numscons configuration files)?\n  - If you are a first-time contributor, did you add yourself to THANKS.txt?\n    Please note that this is perfectly normal and desirable - the aim is to\n    give every single contributor credit, and if you don't add yourself it's\n    simply extra work for the reviewer (or worse, the reviewer may forget).\n  - Did you check that the code can be distributed under a BSD license?\n\n\nUseful SciPy documents\n``````````````````````\n\n  - The `how to document`_ guidelines\n  - NumPy/SciPy `testing guidelines`_\n  - `SciPy API`_\n  - SciPy `maintainers`_\n  - NumPy/SciPy `git workflow`_\n\n\nFAQ\n```\n\n*I based my code on existing Matlab/R/... code I found online, is this OK?*\n\nIt depends.  SciPy is distributed under a BSD license, so if the code that you\nbased your code on is also BSD licensed or has a BSD-compatible license (MIT,\nApache, ...) then it's OK.  Code which is GPL-licensed, has no clear license,\nrequires citation or is free for academic use only can't be included in SciPy.\nTherefore if you copied existing code with such a license or made a direct\ntranslation to Python of it, your code can't be included.  See also `license\ncompatibility`_.\n\n\n*How do I set up SciPy so I can edit files, run the tests and make commits?*\n\nThe simplest method is setting up an in-place build.  To create your local git\nrepo and do the in-place build::\n\n  $ git clone https://github.com/scipy/scipy.git scipy\n  $ cd scipy\n  $ python setup.py build_ext -i\n\nThen you need to either set up a symlink in your site-packages or add this\ndirectory to your PYTHONPATH environment variable, so Python can find it.  Some\nIDEs (Spyder for example) have utilities to manage PYTHONPATH.  On Linux and OS\nX, you can for example edit your .bash_login file to automatically add this dir\non startup of your terminal.  Add the line::\n\n  export PYTHONPATH=\"$HOME/scipy:${PYTHONPATH}\"\n\nAlternatively, to set up the symlink, use (prefix only necessary if you want to\nuse your local instead of global site-packages dir)::\n\n  $ python setupegg.py develop --prefix=${HOME}\n \nTo test that everything works, start the interpreter (not inside the scipy/\nsource dir) and run the tests::\n\n  $ python\n  >>> import scipy as sp\n  >>> sp.test()\n\nNow editing a Python source file in SciPy allows you to immediately test and\nuse your changes, by simply restarting the interpreter.\n\nNote that while the above procedure is the most straightforward way to get\nstarted, you may want to look into using Bento or numscons for faster and more\nflexible building, or virtualenv to maintain development environments for\nmultiple Python versions.\n\n\n*How do I set up a development version of SciPy in parallel to a released\nversion that I use to do my job/research?*\n\nOne simple way to achieve this is to install the released version in\nsite-packages, by using a binary installer or pip for example, and set up the\ndevelopment version with an in-place build in a virtualenv.  First install\n`virtualenv`_ and `virtualenvwrapper`_, then create your virtualenv (named\nscipy-dev here) with::\n\n  $ mkvirtualenv scipy-dev\n\nNow, whenever you want to switch to the virtual environment, you can use the\ncommand ``workon scipy-dev``, while the command ``deactivate`` exits from the\nvirtual environment and brings back your previous shell.  With scipy-dev\nactivated, follow the in-place build with the symlink install above to actually\ninstall your development version of SciPy.\n\n\n*Can I use a programming language other than Python to speed up my code?*\n\nYes.  The languages used in SciPy are Python, Cython, C, C++ and Fortran.  All\nof these have their pros and cons.  If Python really doesn't offer enough\nperformance, one of those languages can be used.  Important concerns when\nusing compiled languages are maintainability and portability.  For\nmaintainability, Cython is clearly preferred over C/C++/Fortran.  Cython and C\nare more portable than C++/Fortran.  A lot of the existing C and Fortran code\nin SciPy is older, battle-tested code that was only wrapped in (but not\nspecifically written for) Python/SciPy.  Therefore the basic advice is: use\nCython.  If there's specific reasons why C/C++/Fortran should be preferred,\nplease discuss those reasons first.\n\n\n*There's overlap between Trac and Github, which do I use for what?*\n\nTrac_ is the bug tracker, Github_ the code repository.  Before the SciPy code\nrepository moved to Github, the preferred way to contribute code was to create\na patch and attach it to a Trac ticket.  The overhead of this approach is much\nlarger than sending a PR on Github, so please don't do this anymore.  Use Trac\nfor bug reports, Github for patches.\n\n\n.. _scikit-learn: http://scikit-learn.org\n\n.. _scikits-image: http://scikits-image.org/\n\n.. _statsmodels: http://statsmodels.sourceforge.net/\n\n.. _testing guidelines: https://github.com/numpy/numpy/blob/master/doc/TESTS.rst.txt\n\n.. _how to document: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt\n\n.. _PEP8: http://www.python.org/dev/peps/pep-0008/\n\n.. _pep8 package: http://pypi.python.org/pypi/pep8\n\n.. _pyflakes: http://pypi.python.org/pypi/pyflakes\n\n.. _SciPy API: http://docs.scipy.org/doc/scipy/reference/api.html\n\n.. _git workflow: http://docs.scipy.org/doc/numpy/dev/gitwash/index.html\n\n.. _maintainers: https://github.com/scipy/scipy/blob/master/doc/MAINTAINERS.rst.txt\n\n.. _Trac: http://projects.scipy.org/scipy/timeline\n\n.. _Github: https://github.com/scipy/scipy\n\n.. _scipy.org: http://scipy.org/\n\n.. _scipy.github.com: http://scipy.github.com/\n\n.. _scipy.org-new: https://github.com/scipy/scipy.org-new\n\n.. _documentation wiki: http://docs.scipy.org/scipy/Front%20Page/\n\n.. _SciPy Central: http://scipy-central.org/\n\n.. _license compatibility: http://www.scipy.org/License_Compatibility\n\n.. _doctest: http://www.doughellmann.com/PyMOTW/doctest/\n\n.. _virtualenv: http://www.virtualenv.org/\n\n.. _virtualenvwrapper: http://www.doughellmann.com/projects/virtualenvwrapper/\n\n"
  },
  {
    "path": "src/test/resources/samples/langs/sed/hanoi.sed",
    "content": "# Towers of Hanoi in sed.\n#\n#\t@(#)hanoi.sed\t8.1 (Berkeley) 6/6/93\n# $FreeBSD$\n#\n#\n# Ex:\n# Run \"sed -f hanoi.sed\", and enter:\n#\n#\t:abcd: : :<CR>\n#\n# note -- TWO carriage returns were once required, this will output the\n# sequence of states involved in moving 4 rings, the largest called \"a\" and\n# the smallest called \"d\", from the first to the second of three towers, so\n# that the rings on any tower at any time are in descending order of size.\n# You can start with a different arrangement and a different number of rings,\n# say :ce:b:ax: and it will give the shortest procedure for moving them all\n# to the middle tower.  The rules are: the names of the rings must all be\n# lower-case letters, they must be input within 3 fields (representing the\n# towers) and delimited by 4 colons, such that the letters within each field\n# are in alphabetical order (i.e. rings are in descending order of size).\n#\n# For the benefit of anyone who wants to figure out the script, an \"internal\"\n# line of the form\n#\t\tb:0abx:1a2b3 :2   :3x2\n# has the following meaning: the material after the three markers :1, :2,\n# and :3 represents the three towers; in this case the current set-up is\n# \":ab :   :x  :\".  The numbers after a, b and x in these fields indicate\n# that the next time it gets a chance, it will move a to tower 2, move b\n# to tower 3, and move x to tower 2.  The string after :0 just keeps track\n# of the alphabetical order of the names of the rings.  The b at the\n# beginning means that it is now dealing with ring b (either about to move\n# it, or re-evaluating where it should next be moved to).\n#\n# Although this version is \"limited\" to 26 rings because of the size of the\n# alphabet, one could write a script using the same idea in which the rings\n# were represented by arbitrary [strings][within][brackets], and in place of\n# the built-in line of the script giving the order of the letters of the\n# alphabet, it would accept from the user a line giving the ordering to be\n# assumed, e.g. [ucbvax][decvax][hplabs][foo][bar].\n#\n#\t\t\tGeorge Bergman\n#\t\t\tMath, UC Berkeley 94720 USA\n\n# cleaning, diagnostics\ns/  *//g\n/^$/d\n/[^a-z:]/{a\\\nIllegal characters: use only a-z and \":\".  Try again.\nd\n}\n/^:[a-z]*:[a-z]*:[a-z]*:$/!{a\\\nIncorrect format: use\\\n\\\t: string1 : string2 : string3 :<CR>\\\nTry again.\nd\n}\n/\\([a-z]\\).*\\1/{a\\\nRepeated letters not allowed.  Try again.\nd\n}\n# initial formatting\nh\ns/[a-z]/ /g\nG\ns/^:\\( *\\):\\( *\\):\\( *\\):\\n:\\([a-z]*\\):\\([a-z]*\\):\\([a-z]*\\):$/:1\\4\\2\\3:2\\5\\1\\3:3\\6\\1\\2:0/\ns/[a-z]/&2/g\ns/^/abcdefghijklmnopqrstuvwxyz/\n:a\ns/^\\(.\\).*\\1.*/&\\1/\ns/.//\n/^[^:]/ba\ns/\\([^0]*\\)\\(:0.*\\)/\\2\\1:/\ns/^[^0]*0\\(.\\)/\\1&/\n:b\n# outputting current state without markers\nh\ns/.*:1/:/\ns/[123]//gp\ng\n:c\n# establishing destinations\n/^\\(.\\).*\\1:1/td\n/^\\(.\\).*:1[^:]*\\11/s/^\\(.\\)\\(.*\\1\\([a-z]\\).*\\)\\3./\\3\\2\\31/\n/^\\(.\\).*:1[^:]*\\12/s/^\\(.\\)\\(.*\\1\\([a-z]\\).*\\)\\3./\\3\\2\\33/\n/^\\(.\\).*:1[^:]*\\13/s/^\\(.\\)\\(.*\\1\\([a-z]\\).*\\)\\3./\\3\\2\\32/\n/^\\(.\\).*:2[^:]*\\11/s/^\\(.\\)\\(.*\\1\\([a-z]\\).*\\)\\3./\\3\\2\\33/\n/^\\(.\\).*:2[^:]*\\12/s/^\\(.\\)\\(.*\\1\\([a-z]\\).*\\)\\3./\\3\\2\\32/\n/^\\(.\\).*:2[^:]*\\13/s/^\\(.\\)\\(.*\\1\\([a-z]\\).*\\)\\3./\\3\\2\\31/\n/^\\(.\\).*:3[^:]*\\11/s/^\\(.\\)\\(.*\\1\\([a-z]\\).*\\)\\3./\\3\\2\\32/\n/^\\(.\\).*:3[^:]*\\12/s/^\\(.\\)\\(.*\\1\\([a-z]\\).*\\)\\3./\\3\\2\\31/\n/^\\(.\\).*:3[^:]*\\13/s/^\\(.\\)\\(.*\\1\\([a-z]\\).*\\)\\3./\\3\\2\\33/\nbc\n# iterate back to find smallest out-of-place ring\n:d\ns/^\\(.\\)\\(:0[^:]*\\([^:]\\)\\1.*:\\([123]\\)[^:]*\\1\\)\\4/\\3\\2\\4/\ntd\n# move said ring (right, resp. left)\ns/^\\(.\\)\\(.*\\)\\1\\([23]\\)\\(.*:\\3[^ ]*\\) /\\1\\2 \\4\\1\\3/\ns/^\\(.\\)\\(.*:\\([12]\\)[^ ]*\\) \\(.*\\)\\1\\3/\\1\\2\\1\\3\\4 /\ntb\ns/.*/Done!  Try another, or end with ^D./p\nd\n"
  },
  {
    "path": "src/test/resources/samples/langs/wdl/hello.wdl",
    "content": "# Sample originally from https://github.com/broadinstitute/centaur\n\ntask hello {\n  String addressee\n  command {\n    echo \"Hello ${addressee}!\"\n  }\n  output {\n    String salutation = read_string(stdout())\n  }\n  runtime {\n    docker: \"ubuntu@sha256:71cd81252a3563a03ad8daee81047b62ab5d892ebbfbf71cf53415f29c130950\"\n  }\n}\n\nworkflow wf_hello {\n  call hello\n  output {\n     hello.salutation\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/wdl/ifs_in_scatters.wdl",
    "content": "# Sample originally from https://github.com/broadinstitute/centaur\n\ntask validate_int {\n  Int i\n  command {\n    echo $(( ${i} % 2 ))\n  }\n  output {\n    Boolean validation = read_int(stdout()) == 1\n  }\n  runtime {\n    docker: \"ubuntu:latest\"\n  }\n}\n\ntask mirror {\n  Int i\n  command {\n    echo ${i}\n  }\n  output {\n    Int out = read_int(stdout())\n  }\n  runtime {\n    docker: \"ubuntu:latest\"\n  }\n}\n\nworkflow ifs_in_scatters {\n  Array[Int] numbers = range(5)\n\n  scatter (n in numbers) {\n\n    call validate_int { input: i = n }\n    if (validate_int.validation) {\n      Int incremented = n + 1\n      call mirror { input: i = incremented }\n    }\n  }\n\n  output {\n    Array[Int?] mirrors = mirror.out\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/wdl/passingfiles.wdl",
    "content": "# Sample originally from https://github.com/broadinstitute/centaur\n\n##\n# Check that we can:\n# - Create a file from a task and feed it into subsequent commands.\n# - Create a file output by interpolating a file name\n# - Use engine functions on an interpolated file name\n##\n\ntask mkFile {\n  command { \n    echo \"small file contents\" > out.txt\n  }\n  output { File out = \"out.txt\" }\n  runtime { docker: \"ubuntu:latest\" }\n}\n\ntask consumeFile {\n  File in_file\n  String out_name\n\n  command {\n    cat ${in_file} > ${out_name}\n  }\n  runtime {\n    docker: \"ubuntu:latest\"\n  }\n  output {\n    File out_interpolation = \"${out_name}\"\n    String contents = read_string(\"${out_name}\")\n    String contentsAlt = read_string(out_interpolation)\n  }\n}\n\nworkflow filepassing {\n  call mkFile\n  call consumeFile {input: in_file=mkFile.out, out_name = \"myFileName.abc.txt\" }\n  output {\n      consumeFile.contents\n      consumeFile.contentsAlt\n  }\n}\n"
  },
  {
    "path": "src/test/resources/samples/langs/wisp/intro.wisp",
    "content": ";; # wisp\n\n; Wisp is homoiconic JS dialect with a clojure syntax, s-expressions and\n; macros. Wisp code compiles to a human readable javascript, which is one\n; of they key differences from clojurescript.\n\n;; ## wisp data structures\n\n;; 1. nil - is just like js undefined with a differenc that it's\n;;    not something can be defined. In fact it's just a shortcut for\n;;    void(0) in JS.\nnil ;; => void(0)\n\n;; 2. Booleans - Wisp booleans true / false are JS booleans\n\ntrue ;; => true\n\n;; 3. Numbers - Wisp numbers are JS numbers\n1  ;; => 1\n\n;; 4. Strings - Wisp strings are JS Strings\n\"Hello world\"\n;;    Wisp strings can be multiline\n\"Hello,\nMy name is wisp!\"\n\n;; 5. Characters - Characters are sugar for JS single char strings\n\\a  ;; => \"a\"\n\n;; 6. Keywords - Keywords are symbolic identifiers that evaluate to\n;;               themselves.\n:keyword  ;; => \"keyword\"\n;;    Since in JS string constats fulfill this purpose of symbolic\n;;    identifiers, keywords compile to equivalent JS strings.\n(window.addEventListener :load handler false)\n;;    Keywords can be invoked as functions, that desugars to plain\n;;    associated value access in JS\n(:bar foo) ;; => foo[\"bar\"]\n\n\n;; 7. Vectors - Wisp vectors are JS arrays.\n[ 1 2 3 4 ]\n;;    Note: Commas are white space & can be used if desired\n[ 1, 2, 3, 4]\n\n\n;; 8. Maps - Maps are hash maps, plain JS objects. Note that unlike\n;;    in clojure keys can not be of arbitary types.\n{ \"foo\" bar :beep-bop \"bop\" 1 2 }\n;;    Commas are optional but can come handy for separating key value\n;;    pairs.\n{ a 1, b 2 }\n;; In a future JSONs syntax may be made compatible with map syntax.\n\n\n;; 9. Lists - You can't have a lisp without lists! Wisp has lists too.\n;;    Wisp is homoiconic and it's code is made up of lists representing\n;;    expressions. The first item in the expression is a function, being\n;;    invoked with rest items as arguments.\n(foo bar baz) ; => foo(bar, baz);\n\n;; # Conventions\n;; Wisp puts a lot of effort in making naming conventions transparent,\n;; by encouraning lisp conventions and then translating them to equivalent\n;; JS conventions:\n\n(dash-delimited)   ;; => dashDelimited\n(predicate?)       ;; => isPredicate\n(**privates**)     ;; => __privates__\n(list->vector)     ;; => listToVector\n\n;; As a side effect some names can be expressed in a few ways, although\n;; it's considered to be an advantage.\n\n(parse-int x)\n(parseInt x)\n\n(array? x)\n(isArray x)\n\n\n;; # Special forms\n\n;; There are some functions in wisp that are special, in a sence that\n;; they compile to JS expressions & can not be passed around as regular\n;; functions. JS operators are represteted in wisp as special forms\n\n;; Arithmetic forms - Wisp comes with special form for arithmetic\n;; operations.\n\n(+ a b)        ; => a + b\n(+ a b c)      ; => a + b + c\n(- a b)        ; => a - b\n(* a b c)      ; => a * b * c\n(/ a b)        ; => a / b\n(mod a b)      ; => a % 2\n\n;; Comparison forms - Wisp comes with special forms for comparisons\n\n(identical? a b)     ;; => a === b\n(identical? a b c)   ;; => a === b && b === c\n(= a b)              ;; => a == b\n(= a b c)            ;; => a == b && b == c\n(> a b)              ;; => a > b\n(>= a b)             ;; => a >= b\n(< a b c)            ;; => a < b && b < c\n(<= a b c)           ;; => a <= b && b <= c\n\n;; Logical forms - Wisp comes with special forms for logical operations\n\n(and a b)            ;; => a && b\n(and a b c)          ;; => a && b && c\n(or a b)             ;; => a || b\n(and (or a b)\n     (and c d))      ;; (a || b) && (c && d)\n\n\n;; Definitions - Variable definitions also happen through special forms.\n(def a)     ; => var a = void(0);\n(def b 2)   ; => var b = 2;\n\n;; Assignments - In wisp new values can be set to a variables via `set!`\n;; special form. Note that in functional programing binding changes are\n;; a bad practice, avoiding those would make your programs only better!\n;; Stil if you need it you have it.\n(set! a 1)\n\n;; Conditionals - Conditional code branching in wisp is expressed via\n;; if special form. First expression following `if` is a condition,\n;; if it evaluates to `true` result of the `if` expression is second\n;; expression otherwise it's third expression.\n(if (< number 10)\n  \"Digit\"\n  \"Number\")\n;; Else expression is optional, if missing and conditional evaluates to\n;; `true` result will be `nil`.\n(if (monday? today) \"How was your weekend\")\n\n\n\n;; Compbining expressions - In wisp is everything is an expression, but\n;; sometimes one might want to compbine multiple expressions into one,\n;; usually for the purpose of evaluating expressions that have\n;; side-effects\n(do\n  (console.log \"Computing sum of a & b\")\n  (+ a b))\n\n;; Also number of expressions is `do` special form 0 to many. If `0`\n;; result of evaluation will be nil.\n(do)\n\n\n;; Bindings - Let special form evaluates containing expressions in a\n;; lexical context of in which simbols in the bindings-forms (first item)\n;; are bound to their respective expression results.\n\n(let [a 1\n      b (+ a c)]\n  (+ a b))\n\n\n;; Functions - Wisp functions are JS functions\n(fn [x] (+ x 1))\n\n;; Wisp functions can be named similar to JS\n(fn increment [x] (+ x 1))\n\n;; Wisp functions can also contain documentation and some metadata.\n;; Note: Docstring and metadata is not presented in compiled JS yet,\n;; but in a future it will compile to comments associated with function.\n(fn incerement\n  \"Returns a number one greater than given.\"\n  {:added \"1.0\"}\n  [x] (+ x 1))\n\n;; Wisp makes capturing of rest arguments a lot easier than JS. argument\n;; that follows special `&` simbol will capture all the rest args in array.\n\n(fn [x & rest]\n  (rest.reduce (fn [sum x] (+ sum x)) x))\n\n;; Overloads - In wisp functions can be overloaded depending on number\n;; of arguments they take, without introspection of rest arguments.\n(fn sum\n  \"Return the sum of all arguments\"\n  {:version \"1.0\"}\n  ([] 0)\n  ([x] x)\n  ([x y] (+ x y))\n  ([x & more] (more.reduce (fn [x y] (+ x y)) x)))\n\n;; If function does not has variadic overload and more arguments is\n;; passed to it, it throws exception.\n(fn\n  ([x] x)\n  ([x y] (- x y)))\n\n\n\n;; ## Other Special Forms\n\n;; Instantiation - In wisp type instantiation has a consice form, type\n;; function just needs to be suffixed with `.` character\n(Type. options)\n\n;; More verbose but JS like form is also there\n(new Class options)\n\n\n;; Method calls - In wisp method calls are no different from function\n;; calls, it's just method functions are perfixed with `.` character\n(.log console \"hello wisp\")\n\n;; Also more JS like forms are supported too!\n(window.addEventListener \"load\" handler false)\n\n\n;; Attribute access - In wisp attribute access is also just like function\n;; call. Attribute name just needs to be prefixed with `.-`\n(.-location window)\n\n;; Compound properties can be access via `get` special form\n(get templates (.-id element))\n\n;; Catching exceptions - In wisp exceptions can be handled via `try`\n;; special form. As everything else try form is also expression. It\n;; results to nil if no handling takes place.\n(try (raise exception))\n\n;; Although catch form can be used to handle exceptions\n(try\n  (raise exception)\n  (catch error (.log console error)))\n\n;; Also finally clase can be used when necessary\n(try\n  (raise exception)\n  (catch error (recover error))\n  (finally (.log console \"That was a close one!\")))\n\n\n;; Throwing exceptions - Throw special form allows throwing exceptions,\n;; although doing that is not idiomatic.\n(fn raise [message] (throw (Error. message)))\n\n\n;; ## Macros\n;; Wisp has a programmatic macro system which allows the compiler to\n;; be extended by user code. Many core constructs of Wisp are in fact\n;; normal macros.\n\n;; quote\n\n;; Before diving into macros too much, we need to learn about few more\n;; things. In lisp any expression can be marked to prevent it from being\n;; evaluated. For instance, if you enter the symbol `foo` you will be\n;; evaluating the reference to the value of the corresponding variable.\nfoo\n\n;; If you wish to refer to the literal symbol, rather than reference you\n;; could use\n(quote foo)\n;; or more usually\n'foo\n\n;; Any expression can be quoted, to prevent it's evaluation. Although your\n;; resulting programs should not have these forms compiled to JS.\n'foo\n':bar\n'(a b)\n\n;; Wisp doesn’t have `unless` special form or a macro, but it's trivial\n;; to implement it via macro. Although let's try implemting it as a\n;; function to understand a use case for macro!\n\n;; We want to execute body unless condition is `true`.\n(defn unless-fn [condition body]\n  (if condition nil body))\n\n;; Although following code will log \"should not print\" anyway, since\n;; function arguments are exectued before function is called.\n(unless-fn true (console.log \"should not print\"))\n\n;; Macros solve this problem, because they do not evaluate their arguments\n;; immediately. Instead, you get to choose when (and if!) the arguments\n;; to a macro are evaluated. Macros take items of the expression as\n;; arguments and return new form that is compiled instead.\n(defmacro unless\n  [condition form]\n  (list 'if condition nil form))\n\n;; The body of unless macro executes at macro expansion time, producing an\n;; if form for compilation. Which later is compiled as usual. This way\n;; compiled JS is a conditional instead of function call.\n(unless true (console.log \"should not print\"))\n\n;; Simple macros like above could be written via templating, expressed\n;; as syntax-quoted forms.\n\n;; `syntax-quote` is almost the same as the plain `quote`, but it allows\n;; sub expressions to be unquoted so that form acts a template. Symbols\n;; inside form are resolved to help prevent inadvertent symbol capture.\n;; Which can be done via `unquote` and `unquote-splicing` forms.\n\n(syntax-quote (foo (unquote bar)))\n(syntax-quote (foo (unquote bar) (unquote-splicing bazs)))\n\n;; Also there is a special syntax sugar for both unquoting operators:\n\n;; Syntax quote: Quote form, but allow internal unquoting so that form\n;; acts as template. Symbols inside form are resolved to help prevent\n;; inadvertent symbol capture.\n`(foo bar)\n\n;; Unquote: Use inside a syntax-quote to substitute an unquoted value.\n`(foo ~bar)\n\n;; Splicing unquote: Use inside a syntax-quote to splice an unquoted\n; list into a template.\n`(foo ~bar ~@bazs)\n\n\n;; For expmale build-in `defn` macro can be defined expressed with\n;; simple template macro. That's more or less how build-in `defn`\n;; macro is implemented.\n(defmacro define-fn\n  [name & body]\n  `(def ~name (fn ~@body)))\n\n\n;; Now if we use `define-fn` form above defined macro will be expanded\n;; and compile time resulting into diff program output.\n(define-fn print\n  [message]\n  (.log console message))\n\n\n;; Not all of the macros can be expressed via templating, but all of the\n;; language is available at hand to assemble macro expanded form.\n;; For instance let's define macro to ease functional chanining popular\n;; in JS but usually expressed via method chaining. For example following\n;; API is pioneered by jQuery is very common in JS:\n;;\n;; open(target, \"keypress).\n;;  filter(isEnterKey).\n;;  map(getInputText).\n;;  reduce(render)\n;;\n;; Unfortunately though it usually requires all the functions need to be\n;; methods of dsl object, which is very limited. Making third party\n;; functions second class. Via macros we can achieve similar chaining\n;; without such tradeoffs.\n(defmacro ->\n  [& operations]\n  (reduce\n   (fn [form operation]\n     (cons (first operation)\n           (cons form (rest operation))))\n   (first operations)\n   (rest operations)))\n\n(->\n (open tagret :keypress)\n (filter enter-key?)\n (map get-input-text)\n (reduce render))\n"
  },
  {
    "path": "src/test/resources/samples/langs/xBase/sample.ch",
    "content": "#ifndef __HARBOUR__\n   #ifndef __XPP__\n      #ifndef __CLIP__\n         #ifndef FlagShip\n            #define __CLIPPER__\n         #endif\n      #endif\n   #endif\n#endif\n\n/* File create flags */\n#define FC_NORMAL          0  /* No file attributes are set */\n#define FC_READONLY        1\n#define FC_HIDDEN          2\n#define FC_SYSTEM          4\n\n// New-style comment\n#command SET DELETED <x:ON,OFF,&>      => Set( _SET_DELETED, <(x)> )\n#command SET DELETED (<x>)             => Set( _SET_DELETED, <x> )\n#command @ <row>, <col> SAY <exp> [PICTURE <pic>] [COLOR <clr>] => ;\n         DevPos( <row>, <col> ) ; DevOutPict( <exp>, <pic> [, <clr>] )\n         \n#command ENDIF <*x*> => endif\n\n#ifdef __CLIPPER__   \n   #xtranslate hb_MemoWrit( [<x,...>] )  => MemoWrit( <x> )\n   #xtranslate hb_dbExists( <t> )        => File( <t> )\n   #xtranslate hb_dbPack()               => __dbPack()\n   #xtranslate hb_default( @<v>, <x> )   => iif( StrTran( ValType( <v> ), \"M\", \"C\" ) == StrTran( ValType( <x> ), \"M\", \"C\" ),, <v> := <x>, )\n#endif\n"
  },
  {
    "path": "src/test/resources/samples/langs/xBase/sample.prg",
    "content": "#require \"hbtest\"\n\n#pragma linenumber=on\n\n#include \"hbclass.ch\"\n\n#stdout \"stdout\"\n#warning \"warning\"\n\n#define MYCONST  100\n#undef MYCONST\n\n#ifdef __HARBOUR__\n#else\n#endif\n\n#if defined( __HARBOUR__ ) .OR. .T.\n#elif defined( __HARBOUR__ )\n#endif\n\nTHREAD STATIC t_var := \"thread\"\n\nREQUEST AllTrim\nANNOUNCE my_module\n\nPROCEDURE Main()\n\n   MEMVAR p_var, m_var\n   FIELD fld\n\n   STATIC s_test := \"static\"\n   LOCAL o := TTest():New( \"one\", \"two\" ), tmp\n   LOCAL oError\n   LOCAL bBlock := {| tmp | QOut( tmp ) }\n   LOCAL hHash := { \"name\" => \"value\", \"name2\" => \"value2\", 2 => 1 }\n   PUBLIC p_var := \"public\"\n   PRIVATE m_var := \"private\"\n   PARAMETERS p1\n\n   Set( _SET_DATEFORMAT, \"yyyy-mm-dd\" )\n\n   CLS\n   @ 10, 10 SAY \"Hello world!\"\n\n   ? hb_ValToExp( o )\n   ? m->p1\n   ? hHash[ \"name\" ], hHash[ 2 ]\n\n   FOR tmp := 1 TO 10 STEP 2\n      ? tmp\n   NEXT\n\n   FOR EACH tmp IN { \"a\", \"b\" } DESCEND\n      ? tmp\n   NEXT\n\n   ? 10.01 + 2 - 3 / 4 * 5 ^ 6 ** 1\n   ? 2 < 1, 2 > 1, 2 >= 1, 2 <= 1, 2 == 1, 2 = 1, 2 != 1, 2 <> 1, 2 # 1\n   ? -( 1 + 2 ), \"a\" $ \"ab\", 10 % 2\n\n   tmp := 0\n   DO WHILE tmp < 2\n      ? tmp++\n   ENDDO\n\n   tmp := 0\n   WHILE tmp < 2\n      ? ++tmp\n      IF tmp >= 0xFF\n         LOOP\n      ENDIF\n      EXIT\n   ENDDO\n\n   --tmp\n   tmp--\n\n   IF tmp < -10.0\n      ? NIL\n   ELSEIF .F.\n      ? 0d19800101\n   ELSE\n      ? \"string\"\n   ENDIF\n\n   DO CASE\n   CASE tmp == 1\n      ? \"A\"\n   OTHERWISE\n      ? \"B\"\n   ENDCASE\n\n   SWITCH tmp\n   CASE 1\n      ? \"A\"\n      EXIT\n   OTHERWISE\n      ? \"B\"\n   ENDSWITCH\n\n   BEGIN SEQUENCE WITH __BreakBlock()\n      BREAK\n   RECOVER USING oError\n   END /* SEQUENCE */\n\n   local_func( @hHash )\n\n   RETURN\n\nINIT PROCEDURE init_proc()\n   RETURN\n\nEXIT PROCEDURE exit_proc()\n   RETURN\n\nPROCEDURE returning_nothing()\n   RETURN\n\nFUNCTION pub_func()\n   RETURN .T.\n\nSTATIC FUNCTION local_func()\n   RETURN .F.\n\nCREATE CLASS TTest INHERIT TParent\n   VAR One, Two\n   METHOD New( One )\n   METHOD Test() INLINE QOut( \"Hello\" )\n   METHOD MethProc()\nENDCLASS\n\nMETHOD PROCEDURE MethProc()\n   RETURN\n\nMETHOD New( One ) CLASS TTest\n\n   ::super:New()\n   ::One := One\n\n   RETURN Self\n\nCREATE CLASS TParent\n   VAR One\n   METHOD New()\nENDCLASS\n\nMETHOD New() CLASS TParent\n   ? \"TParent:New()\"\n   RETURN Self\n\n// This is a comment\n/* This is a comment */\n/* This is\na comment */\n* This is a comment\n&& This is a comment\nNOTE This is a comment\nnote This is a comment\nNOTE\n\nFUNCTION pub_func2()\n   ? \"hello world!\"\n   ? 'hello world!'\n   ? \"hello\\world!\"\n   ? \"\\\"\n   ? \"hello world!\"\n   RETURN .T.\n"
  },
  {
    "path": "src/test/resources/samples/langs/xBase/sample.prw",
    "content": "\r\n/**\r\n * This is a sample file for Linguist.\r\n * It's written in AdvPL, a xBase Language.\r\n *\r\n * Author: Arthur Helfstein Fragoso\r\n *\r\n * This script has the specific use of integrating between a financial institution\r\n * and other two companies in the process of creating Installment Bills for\r\n * customers.\r\n *\r\n * The functions are called from the ERP Protheus TOTVS.\r\n *\r\n **/\r\n\r\n\r\n\r\n#Include \"TOPCONN.ch\"\r\n#include \"tbiconn.ch\"\r\n#Include \"Protheus.ch\"\r\n#Include \"rwmake.ch\"\r\n#Include \"FileIO.ch\"\r\n#Include \"json.ch\"\r\n#Include \"utils.ch\"\r\n\r\n\r\n////////////////////////\r\n// Faturando (Reparcelando)\r\n// FA280\r\n// FA280_01\r\n//\r\n\r\nUser Function FA280()\r\n\r\n\t//Executado uma vez para cada parcela\r\n\r\n\tIf cEmpAnt == '06'\r\n\r\n\t\tSE5->(dbSelectArea(\"SE5\"))\r\n\r\n\t\tcSet3Filter := \"SE5->E5_FATURA == SE1->E1_NUM\"\r\n\r\n\t\tSE5->(dbSetFilter( {|| &cSet3Filter }, cSet3Filter ))\r\n\t\tSE5->(dbGoTOP())\r\n\r\n\t\taOrig06Tit := {} // = Todos os Titulos que ser�o reparcelados\r\n\t\tnTotal := 0\r\n\r\n\t\tWhile SE5->(!EOF())\r\n\t\t\tAADD(aOrig06Tit, {SE5->E5_PREFIXO, SE5->E5_NUMERO, SE5->E5_VALOR})\r\n\t\t\tnTotal += SE5->E5_VALOR\r\n\t\t\tSE5->(dbSkip())\r\n\t\tEnd\r\n\r\n\t\taNovoTitulo:= {;//{\"E1_FILIAL\"   ,SE1ORIG->E1_FILIAL ,Nil},;\r\n\t\t              ;//{\"E1_PREFIXO\"  ,SE1->E1_PREFIXO    ,Nil},;\r\n\t\t              {\"E1_NUM\"      ,SE1->E1_NUM        ,Nil},;\r\n\t\t              {\"E1_TIPO\"     ,SE1->E1_TIPO       ,Nil},;\r\n\t\t              {\"E1_PARCELA\"  ,SE1->E1_PARCELA    ,Nil},;\r\n\t\t              {\"E1_NATUREZ\"  ,SE1->E1_NATUREZ    ,Nil},;\r\n\t\t              {\"E1_CLIENTE\"  ,SE1->E1_CLIENTE    ,Nil},;\r\n\t\t              {\"E1_LOJA\"     ,SE1->E1_LOJA       ,Nil},;\r\n\t\t              {\"E1_NRDOC\"    ,SE1->E1_NRDOC      ,Nil},;\r\n\t\t              ;//{\"E1_X_COD\"    ,SE1->E1_NATUREZ    ,Nil},;\r\n\t\t              {\"E1_EMISSAO\"  ,SE1->E1_EMISSAO    ,Nil},;\r\n\t\t              {\"E1_VENCTO\"   ,SE1->E1_VENCTO     ,Nil},;\r\n\t\t              {\"E1_VENCREA\"  ,SE1->E1_VENCREA    ,Nil},;\r\n\t\t              ;//{\"E1_VALOR\"    ,SE1->E1_VALOR      ,Nil},;\r\n\t\t              ;//{\"E1_SALDO\"    ,SE1->E1_SALDO      ,Nil},;\r\n\t\t              ;//{\"E1_VLCRUZ\"   ,SE1->E1_VLCRUZ     ,Nil},;\r\n\t\t              {\"E1_PORTADO\"  ,SE1->E1_PORTADO    ,Nil},;\r\n\t\t              {\"E1_FATURA\"   ,SE1->E1_FATURA     ,Nil},;\r\n\t\t              {\"E1_X_DTPAV\"  ,SE1->E1_X_DTPAV    ,Nil},;\r\n\t\t              {\"E1_X_DTSAV\"  ,SE1->E1_X_DTSAV    ,Nil},;\r\n\t\t              {\"E1_X_DTTAV\"  ,SE1->E1_X_DTTAV    ,Nil},;\r\n\t\t              {\"E1_X_DTSPC\"  ,SE1->E1_X_DTSPC    ,Nil},;\r\n\t\t              {\"E1_X_DTPRO\"  ,SE1->E1_X_DTPRO    ,Nil},;\r\n\t\t              {\"E1_NUMBCO\"   ,SE1->E1_NUMBCO     ,Nil},;\r\n\t\t              {\"E1_X_DUDME\"  ,SE1->E1_X_DUDME    ,Nil},;\r\n\t\t              {\"E1_X_TIPOP\"  ,SE1->E1_X_TIPOP    ,Nil},;\r\n\t\t              {\"E1_X_DTCAN\"  ,SE1->E1_X_DTCAN    ,Nil},;\r\n\t\t              {\"E1_X_MOTIV\"  ,SE1->E1_X_MOTIV    ,Nil},;\r\n\t\t              {\"E1_X_DESPC\"  ,SE1->E1_X_DESPC    ,Nil},;\r\n\t\t              {\"E1_NUMNOTA\"  ,SE1->E1_NUMNOTA    ,Nil},;\r\n\t\t              {\"E1_SERIE\"    ,SE1->E1_SERIE      ,Nil},;\r\n\t\t              {\"E1_X_DEPRO\"  ,SE1->E1_X_DEPRO    ,Nil},;\r\n\t\t              {\"E1_X_TPPAI\"  ,SE1->E1_X_TPPAI    ,Nil},;\r\n\t\t              {\"E1_X_CGC\"    ,SE1->E1_X_CGC      ,Nil},;\r\n\t\t              {\"E1_XTPEMP\"   ,SE1->E1_XTPEMP     ,Nil},;\r\n\t\t              {\"E1_X_CTRIM\"  ,SE1->E1_X_CTRIM    ,Nil}}\r\n\r\n\t\tStartJob(\"U_FA280_01\",getenvserver(),.T., SE1->E1_PREFIXO ,SE1->E1_NUM, SE1->E1_TIPO, SE1->E1_VALOR, aOrig06Tit, nTotal, SE1->E1_PARCELA, aNovoTitulo)\r\n\r\n\t\tSE5->(dbClearFilter())\r\n\r\n\tEndIf\r\n\r\nReturn nil\r\n\r\n\r\nUser Function FA280_01(cE1PREFIXO, cE1NUM, cE1TIPO, nE1Valor, aOrig06Tit, nTotal, cE1PARCELA, aNovoTitulo)\r\n\tLocal nValPar := nil\r\n\tLocal aTit05 := {}\r\n\r\n\tRpcSetType(3) // Nao consome licensa\r\n\r\n\t//Prepare Environment Empresa \"01\" Filial '0102'\r\n\t// Muda de empresa\r\n\tWhile !RpcSetEnv('01', '0102',,,,GetEnvServer(),{})\r\n\t\tSleep(400)\r\n\tEnd\r\n\r\n\t\tnFileLog := u_OpenLog(\"\\Logs\\FA280_\"+dToS(dDataBase)+\".log\")\r\n\r\n\t\tfWrite(nFileLog,\"----- FA280 -----\"+CRLF)\r\n\r\n\t\tfWrite(nFileLog,cE1NUM+CRLF)\r\n\r\n\t\tnParcelas := round(nTotal/nE1Valor, 0)\r\n\r\n\t\tcUltima := '0'+ chr(64+nParcelas)\r\n\r\n\t\tfWrite(nFileLog,\"valor das parcelas: \"+ cvaltochar(nE1Valor) +CRLF)\r\n\t\tfWrite(nFileLog,\"parcelas: \"+ cvaltochar(nParcelas) +CRLF)\r\n\t\tfWrite(nFileLog,\"parcela atual: \"+ cE1PARCELA +CRLF)\r\n\t\tfWrite(nFileLog,\"ultima parcela: \"+ cUltima +CRLF)\r\n\r\n\t\tn0102total := 0\r\n\t\tn0105total := 0\r\n\r\n\t\t//Loop entre todos os Titulos que serão Reparcelados\r\n\r\n\t\tFor nI := 1 To len(aOrig06Tit)\r\n\r\n\t\t\tfWrite(nFileLog,\"E5_NUMERO: \"+aOrig06Tit[nI][2] +CRLF)\r\n\r\n\t\t\tcQuery := \"select * from SE1010 where E1_PREFIXO = '\"+ aOrig06Tit[nI][1] +\"' and E1_NUM = '\"+ aOrig06Tit[nI][2] +\"' and  E1_TIPO = 'FAT' and D_E_L_E_T_ <> '*'\"\r\n\r\n\t\t\tfWrite(nFileLog,cQuery +CRLF)\r\n\r\n\t\t\tIf select(\"SE1ORIG\") > 0\r\n\t\t\t\tSE1ORIG->(DbCloseArea())\r\n\t\t\tendif\r\n\t\t\tTcQuery cQuery New Alias 'SE1ORIG'\r\n\t\t\tdbSelectArea(\"SE1ORIG\")\r\n\t\t\tSE1ORIG->(DBGOTOP())\r\n\r\n\t\t\tWhile SE1ORIG->(!EOF()) //Loop entre as duas filiais: 0102, 0105\r\n\t\t\t\tfWrite(nFileLog,\"SE1ORIG loop: \"+SE1ORIG->E1_FILIAL +CRLF)\r\n\t\t\t\tcFilAnt := SE1ORIG->E1_FILIAL\r\n\r\n\t\t\t\t//Faz a baixa\r\n\t\t\t\tif alltrim(SE1ORIG->E1_STATUS) == 'A'\r\n\t\t\t\t\tfWrite(nFileLog, SE1ORIG->E1_FILIAL+\" : Fazendo baixa\" +CRLF)\r\n\r\n\t\t\t\t\taBaixa\t:= {{\"E1_FILIAL\"   ,SE1ORIG->E1_FILIAL   ,Nil},;\r\n\t\t\t\t\t            {\"E1_PREFIXO\"  ,SE1ORIG->E1_PREFIXO  ,Nil},;\r\n\t\t\t\t\t            {\"E1_NUM\"      ,SE1ORIG->E1_NUM      ,Nil},;\r\n\t\t\t\t\t            {\"E1_TIPO\"     ,SE1ORIG->E1_TIPO     ,Nil},;\r\n\t\t\t\t\t            {\"E1_PARCELA\"  ,SE1ORIG->E1_PARCELA  ,Nil},;\r\n\t\t\t\t\t            {\"E1_DESCONT\"  ,SE1ORIG->E1_DESCONT  ,Nil},;\r\n\t\t\t\t\t            {\"E1_JUROS\"    ,SE1ORIG->E1_JUROS    ,Nil},;\r\n\t\t\t\t\t            {\"E1_MULTA\"    ,SE1ORIG->E1_MULTA    ,Nil},;\r\n\t\t\t\t\t            {\"E1_VLRREAL\"  ,SE1ORIG->E1_VLRREAL  ,Nil},;\r\n\t\t\t\t\t            {\"AUTMOTBX\"    ,\"FAT\"                ,Nil},;\r\n\t\t\t\t\t            {\"AUTDTBAIXA\"  ,date()               ,Nil},;\r\n\t\t\t\t\t            {\"AUTDTCREDITO\",date()               ,Nil},;\r\n\t\t\t\t\t            {\"AUTHIST\"     ,\"Bx.Emis.Fat.\"+cE1NUM,Nil},;\r\n\t\t\t\t\t            {\"AUTVALREC\"   ,SE1ORIG->E1_VALOR    ,Nil}}\r\n\r\n\r\n\t\t\t\t\tlMsErroAuto:=.F. //reseta lMsErroAuto\r\n\t\t\t\t\tMSExecAuto ({|x,y| FINA070(x,y)},aBaixa, 3)\r\n\r\n\t\t\t\t\tIf lMsErroAuto\r\n\r\n\t\t\t\t\t\tfWrite(nFileLog,SE1ORIG->E1_FILIAL+\" : Não foi efetuada a baixa do titulo : \"+CRLF+ MSErroString()+ CRLF + tojson(aBaixa) + CRLF)\r\n\t\t\t\t\t\treturn\r\n\t\t\t\t\telse\r\n\r\n\t\t\t\t\t\tRECLOCK('SE5',.F.)\r\n\t\t\t\t\t\t\tE5_FATURA := cE1NUM\r\n\t\t\t\t\t\t\tE5_FATPREF:= cE1PREFIXO\r\n\t\t\t\t\t\t\t//E5_LA = S\r\n\t\t\t\t\t\t\t//E5_MOEDA = ''\r\n\t\t\t\t\t\t\t//E5_TXMOEDA = 1\r\n\t\t\t\t\t\tMSUNLOCK()\r\n\t\t\t\t\t\tRECLOCK('SE1',.F.)\r\n\t\t\t\t\t\t\tE1_FATURA := cE1NUM\r\n\t\t\t\t\t\t\tE1_FATPREF:= cE1PREFIXO\r\n\t\t\t\t\t\t\tE1_TIPOFAT:= cE1TIPO\r\n\t\t\t\t\t\t\tE1_FLAGFAT:= 'S'\r\n\t\t\t\t\t\t\tE1_DTFATUR:= dDataBase\r\n\t\t\t\t\t\tMSUNLOCK()\r\n\r\n\t\t\t\t\t\tfWrite(nFileLog,SE1ORIG->E1_FILIAL+\" : baixa feita\" +CRLF)\r\n\t\t\t\t\tendif\r\n\r\n\t\t\t\tendif\r\n\r\n\t\t\t\t//calcula valor total de cada filial para poder calcular a Fatura\r\n\r\n\t\t\t\tif SE1ORIG->E1_FILIAL == '0102'\r\n\t\t\t\t\tn0102total += SE1ORIG->E1_VALOR\r\n\t\t\t\telseif SE1ORIG->E1_FILIAL == '0105'\r\n\t\t\t\t\tn0105total += SE1ORIG->E1_VALOR\r\n\t\t\t\telse\r\n\t\t\t\t\tfWrite(nFileLog,\"Programa nao preparado para a filial \"+SE1ORIG->E1_FILIAL +CRLF)\r\n\t\t\t\tendif\r\n\r\n\t\t\t\tSE1ORIG->(dbskip())\r\n\r\n\t\t\tEnd\r\n\r\n\t\tNext nI\r\n\r\n\t\tcFilAnt := '0102'\r\n\r\n\t\tfWrite(nFileLog,\"Total 0102: \"+cvaltochar(n0102total) +CRLF)\r\n\t\tfWrite(nFileLog,\"Total 0105: \"+cvaltochar(n0105total) +CRLF)\r\n\r\n\t\tn0102val := round(nE1Valor * n0102total/nTotal, 2)\r\n\t\tn0105val := nE1Valor - n0102val\r\n\r\n\t\taFili := {}\r\n\r\n\t\tif n0102total > 0\r\n\t\t\tAADD(aFili,'0102')\r\n\t\tendif\r\n\r\n\t\tif n0105total > 0\r\n\t\t\tAADD(aFili,'0105')\r\n\t\tendif\r\n\r\n\t\tFor nI := 1 To len(aFili)\r\n\r\n\t\t\tcQuery := \"select COUNT(*) as QUANT, SUM(E1_VALOR) as TOTALINC from SE1010  where E1_NUM = '\"+ cE1NUM +\"'  and E1_FILIAL='\"+ aFili[nI] +\"' and E1_PREFIXO = '\"+ cE1PREFIXO +\"' and D_E_L_E_T_ <> '*'\"\r\n\r\n\t\t\tIf select(\"PARC\") > 0\r\n\t\t\t\tPARC->(DbCloseArea())\r\n\t\t\tendif\r\n\t\t\tTcQuery cQuery New Alias 'PARC'\r\n\t\t\tdbSelectArea(\"PARC\")\r\n\r\n\t\t\t//verificamos se estamos na ultima parcela\r\n\t\t\tif PARC->QUANT == nParcelas -1 //QUANT = quantidade de parcelas incluida\r\n\t\t\t\tfWrite(nFileLog,\"Ultima Parcela\"+CRLF)\r\n\t\t\t\t//o valor desta será o valor que resta\r\n\t\t\t\tnValPar := SE1ORIG->E1_VALOR - PARC->TOTALINC\r\n\r\n\t\t\t\tif aFili[nI] == '0102'\r\n\t\t\t\t\tn0102val := n0102total - PARC->TOTALINC\r\n\t\t\t\telseif aFili[nI] == '0105'\r\n\t\t\t\t\tn0105val := n0105total - PARC->TOTALINC\r\n\t\t\t\tendif\r\n\t\t\tendif\r\n\r\n\t\tNext nI\r\n\r\n\t\tfWrite(nFileLog,\"Total 0102: \"+cvaltochar(n0102total) + \"  -> Parcela de: \"+cvaltochar(n0102val) +CRLF)\r\n\t\tfWrite(nFileLog,\"Total 0105: \"+cvaltochar(n0105total) + \"  -> Parcela de: \"+cvaltochar(n0105val) +CRLF)\r\n\r\n\t\t/////////////////\r\n\r\n\t\tFor nI := 1 To len(aFili)\r\n\r\n\t\t\tif aFili[nI] == '0102'\r\n\t\t\t\tnValPar := n0102val\r\n\t\t\telseif aFili[nI] == '0105'\r\n\t\t\t\tnValPar := n0105val\r\n\t\t\tendif\r\n\r\n\t\t\taTitulo := ACLONE(aNovoTitulo)\r\n\r\n\t\t\tAADD(aTitulo, {\"E1_PREFIXO\" ,cE1PREFIXO          ,Nil})\r\n\t\t\tAADD(aTitulo, {\"E1_FILIAL\"  ,aFili[nI]           ,Nil})\r\n\t\t\tAADD(aTitulo, {\"E1_VALOR\"   ,nValPar             ,Nil})\r\n\t\t\tAADD(aTitulo, {\"E1_SALDO\"   ,nValPar             ,Nil})\r\n\t\t\tAADD(aTitulo, {\"E1_VLCRUZ\"  ,nValPar             ,Nil})\r\n\r\n\t\t\tlMsErroAuto := .F.\r\n\r\n\t\t\tif aFili[nI] == '0102'\r\n\r\n\t\t\t\tMSExecAuto({|x,y| FINA040(x,y)},aTitulo,3) //Inclusao\r\n\r\n\t\t\t\tIf lMsErroAuto\r\n\t\t\t\t\tfWrite(nFileLog,\"Erro \" + CRLF)\r\n\t\t\t\t\tfWrite(nFileLog,\"Erro ao incluir titulo: \"+CRLF+ MSErroString()+ CRLF + tojson(aTitulo) + CRLF)\r\n\t\t\t\t\treturn\r\n\t\t\t\telse\r\n\t\t\t\t\tfWrite(nFileLog,\"Sucesso \"+ CRLF)\r\n\t\t\t\t\tfWrite(nFileLog,\"Titulo incluido: \"+ aFili[nI] +\" : \" + cValToChar(nValPar) +CRLF)\r\n\t\t\t\tendif\r\n\r\n\t\t\telseif aFili[nI] == '0105'\r\n\t\t\t\tfWrite(nFileLog,\"Salvando titulos 05 para o final \"+aFili[nI]+CRLF)\r\n\t\t\t\t//StartJob(\"U_JOBF040\",getenvserver(),.T., SE1ORIG->E1_FILIAL, aTitulo)\r\n\t\t\t\tAADD(aTit05, aTitulo)\r\n\t\t\t\t//fWrite(nFileLog,\"passou pela thread \"+CRLF)\r\n\t\t\telse\r\n\t\t\t\tfWrite(nFileLog,\"Erro, filial nao tratada \"+aFili[nI]+CRLF)\r\n\t\t\tendif\r\n\r\n\t\tNext nI\r\n\r\n\r\n\tReset Environment\r\n\r\n\tWhile !RpcSetEnv('01', '0105',,,,GetEnvServer(),{})\r\n\t\tSleep(400)\r\n\tEnd\r\n\r\n\t\tFor nI := 1 To len(aTit05)\r\n\r\n\t\t\tlMsErroAuto := .F.\r\n\r\n\t\t\tMSExecAuto({|x,y| FINA040(x,y)},aTit05[nI],3) //Inclusao\r\n\r\n\t\t\tIf lMsErroAuto\r\n\t\t\t\tfWrite(nFileLog,\"Erro \" + CRLF)\r\n\t\t\t\tfWrite(nFileLog,\"Erro ao incluir titulo: \"+CRLF+ MSErroString()+ CRLF + tojson(aTit05[nI]) + CRLF)\r\n\t\t\t\treturn\r\n\t\t\telse\r\n\t\t\t\tfWrite(nFileLog,\"Sucesso \"+ CRLF)\r\n\t\t\t\tfWrite(nFileLog,\"Titulo incluido: \"+CRLF)\r\n\t\t\tendif\r\n\r\n\t\tNext nI\r\n\r\n\tReset Environment\r\n\r\n\tfClose(nFileLog)\r\n\r\nReturn\r\n\r\n\r\n\r\n\r\n////////////////////////\r\n// Cancelamento da Fatura (Cancelamento do Reparcelamento)\r\n// F280PCAN\r\n// JOBF280C\r\n//\r\n\r\nUser Function F280PCAN()\r\n\r\n\t/**\r\n\t * cFatCan  - numero da fatura\r\n\t * cPrefCan - prefixo\r\n\t * cTipoCan - tipo\r\n\t **/\r\n\r\n\tIf cEmpAnt == '06'\r\n\r\n\t\tStartJob(\"U_JOBF280C\",getenvserver(),.T., cPrefCan, cFatCan, cTipoCan)\r\n\r\n\tEndIf\r\n\r\nReturn .T.\r\n\r\n\r\nUser Function JOBF280C(cPrefCan, cFatCan, cTipoCan)\r\n\r\n\tRpcSetType(3) // Nao consome licensa\r\n\r\n\tWhile !RpcSetEnv('01', '0102',,,,GetEnvServer(),{})\r\n\t\tSleep(400)\r\n\tEnd\r\n\r\n\t\tnFileLog := u_OpenLog(\"\\Logs\\F280PCAN_\"+dToS(dDataBase)+\".log\")\r\n\r\n\t\tfWrite(nFileLog,\"----- F280PCAN -----\"+CRLF)\r\n\r\n\t\tfWrite(nFileLog,\"E1_PREFIXO = '\"+ cPrefCan +\"' and E1_NUM = '\"+ cFatCan +\"' and  E1_TIPO = '\"+ cTipoCan +\"'\"+CRLF)\r\n\r\n\t\tcQuery := \"select * from SE1010 where E1_PREFIXO = '\"+ cPrefCan +\"' and E1_NUM = '\"+ cFatCan +\"' and  E1_TIPO = '\"+ cTipoCan +\"' and D_E_L_E_T_ <> '*'\"\r\n\r\n\t\tIf select(\"SE1ORIG\") > 0\r\n\t\t\tSE1ORIG->(DbCloseArea())\r\n\t\tendif\r\n\t\tTcQuery cQuery New Alias 'SE1ORIG'\r\n\t\tdbSelectArea(\"SE1ORIG\")\r\n\t\tSE1ORIG->(DBGOTOP())\r\n\r\n\t\tWhile SE1ORIG->(!EOF()) //Loop entre todas as parcelas e filiais\r\n\r\n\t\t\tSE1->(dbselectarea(\"SE1\"))\r\n\t\t\tSE1->(dbSetOrder(1))\r\n\r\n\r\n\t\t\tfWrite(nFileLog,\"dbseek\" + CRLF)\r\n\t\t\tif ! SE1->(dbSeek(SE1ORIG->E1_FILIAL+ SE1ORIG->E1_PREFIXO+ SE1ORIG->E1_NUM+ SE1ORIG->E1_PARCELA+ SE1ORIG->E1_TIPO))\r\n\t\t\t\tfWrite(nFileLog,\"Erro dbseek\" + CRLF)\r\n\t\t\t\tAlert(\"Erro. Verificar F280PCAN() - dbseek\")\r\n\t\t\t\tfWrite(nFileLog,\"Erro dbseek(\"+SE1ORIG->E1_FILIAL+ SE1ORIG->E1_PREFIXO+ SE1ORIG->E1_NUM+ SE1ORIG->E1_PARCELA+ SE1ORIG->E1_TIPO+\")\" + CRLF)\r\n\t\t\t\treturn .F.\r\n\t\t\tendif\r\n\r\n\t\t\tcFilAnt := SE1ORIG->E1_FILIAL\r\n\r\n\t\t\taFatura:= {{\"E1_FILIAL\"  ,SE1ORIG->E1_FILIAL         ,Nil},;\r\n\t\t\t           {\"E1_PREFIXO\" ,SE1ORIG->E1_PREFIXO        ,Nil},;\r\n\t\t\t           {\"E1_NUM\"     ,SE1ORIG->E1_NUM            ,Nil},;\r\n\t\t\t           {\"E1_PARCELA\" ,SE1ORIG->E1_PARCELA        ,Nil},;\r\n\t\t\t           {\"E1_TIPO\"    ,SE1ORIG->E1_TIPO           ,Nil}}\r\n\r\n\t\t\tlMsErroAuto := .F.\r\n\r\n\t\t\tMSExecAuto({|x,y| FINA040(x,y)},aFatura,5) //Exclus�o\r\n\r\n\t\t\tIf lMsErroAuto\r\n\t\t\t\tfWrite(nFileLog,\"Erro \" + CRLF)\r\n\t\t\t\tfWrite(nFileLog,\"Erro ao remover o titulo: \"+CRLF+ MSErroString()+ CRLF + tojson(aFatura) + CRLF)\r\n\t\t\t\tAlert(\"Erro ao remover o titulo. Verificar F280PCAN()\")\r\n\t\t\t\treturn .F.\r\n\t\t\telse\r\n\t\t\t\tfWrite(nFileLog,\"Sucesso \"+ CRLF)\r\n\t\t\t\tfWrite(nFileLog,\"Titulo removido\" +CRLF)\r\n\t\t\tendif\r\n\r\n\t\t\tSE1ORIG->(dbskip())\r\n\r\n\t\tend\r\n\r\n\r\n\t\t/////////////////////////////////////////////\r\n\t\t///////  Cancela as baixas\r\n\t\t///\r\n\r\n\t\tfWrite(nFileLog,\"- cancela baixas\" + CRLF)\r\n\r\n\t\tcQuery := \"select * from SE1060 where  E1_FATURA = '\"+ cFatCan +\"' and D_E_L_E_T_ <> '*'\"\r\n\r\n\t\tIf select(\"SE1ORIG\") > 0\r\n\t\t\tSE1ORIG->(DbCloseArea())\r\n\t\tendif\r\n\t\tTcQuery cQuery New Alias 'SE1ORIG'\r\n\t\tdbSelectArea(\"SE1ORIG\")\r\n\t\tSE1ORIG->(DBGOTOP())\r\n\r\n\t\taFili := {\"0102\", \"0105\"}\r\n\r\n\t\tWhile SE1ORIG->(!EOF()) //Loop entre todas as parcelas e filiais\r\n\r\n\t\t\tSE1->(dbselectarea(\"SE1\"))\r\n\t\t\tSE1->(dbSetOrder(1))\r\n\r\n\t\t\tFor nI := 1 To len(aFili)\r\n\r\n\t\t\t\tcFilAnt := aFili[nI]\r\n\r\n\t\t\t\tfWrite(nFileLog,\"dbseek\" + CRLF)\r\n\t\t\t\tif ! SE1->(dbSeek(aFili[nI]+ SE1ORIG->E1_PREFIXO+ SE1ORIG->E1_NUM+ SE1ORIG->E1_PARCELA+ SE1ORIG->E1_TIPO))\r\n\t\t\t\t\tfWrite(nFileLog,\"dbseek nao encontrou titulo para filial \"+aFili[nI] + CRLF)\r\n\t\t\t\t\tfWrite(nFileLog,\"dbseek('\"+aFili[nI]+ SE1ORIG->E1_PREFIXO+ SE1ORIG->E1_NUM+ SE1ORIG->E1_PARCELA+ SE1ORIG->E1_TIPO+\"')\" + CRLF)\r\n\t\t\t\t\tLOOP\r\n\t\t\t\tendif\r\n\r\n\t\t\t\tnSE5Recno := u_RetSQLOne(\"select R_E_C_N_O_ from SE5010 where E5_FILIAL = '\"+SE1->E1_FILIAL+\"' and E5_PREFIXO = '\"+SE1->E1_PREFIXO+\"' and E5_TIPO = '\"+SE1->E1_TIPO+\"' and E5_NUMERO = '\"+SE1->E1_NUM+\"' \"+;\r\n\t\t\t\t                         \" and E5_FATURA = '\"+SE1->E1_FATURA+\"' and E5_FATPREF='\"+SE1->E1_FATPREF+\"' and D_E_L_E_T_ <> '*' \", \"R_E_C_N_O_\")\r\n\r\n\t\t\t\t//Removemos os Flags de Fatura para conseguirmos cancelar a baixa pelo FINA070\r\n\t\t\t\tRECLOCK('SE1',.F.)\r\n\t\t\t\t\tE1_FATURA := ''\r\n\t\t\t\t\tE1_FATPREF:= ''\r\n\t\t\t\t\tE1_TIPOFAT:= ''\r\n\t\t\t\t\tE1_FLAGFAT:= ''\r\n\t\t\t\t\tE1_DTFATUR:= StoD('')\r\n\t\t\t    MSUNLOCK()\r\n\r\n\t\t\t    SE5->(DbGoTo(nSE5Recno))\r\n\t\t\t\tRECLOCK('SE5',.F.)\r\n\t\t\t\t\tE5_MOTBX  := 'NOR'\r\n\t\t\t\t\t//E5_FATURA := ''\r\n\t\t\t\t\t//E5_FATPREF:= ''\r\n\t\t\t\tMSUNLOCK()\r\n\r\n\t\t\t\taBaixa := {{\"E1_FILIAL\"   ,SE1->E1_FILIAL  ,Nil},;\r\n\t\t\t\t           {\"E1_PREFIXO\"  ,SE1->E1_PREFIXO ,Nil},;\r\n\t\t\t\t           {\"E1_NUM\"      ,SE1->E1_NUM     ,Nil},;\r\n\t\t\t\t           {\"E1_TIPO\"     ,SE1->E1_TIPO    ,Nil},;\r\n\t\t\t\t           {\"E1_PARCELA\"  ,SE1->E1_PARCELA ,Nil},;\r\n\t\t\t\t           {\"E1_DESCONT\"  ,SE1->E1_DESCONT ,Nil},;\r\n\t\t\t\t           {\"E1_JUROS\"    ,SE1->E1_JUROS   ,Nil},;\r\n\t\t\t\t           {\"E1_MULTA\"    ,SE1->E1_MULTA   ,Nil},;\r\n\t\t\t\t           {\"E1_VLRREAL\"  ,SE1->E1_VLRREAL ,Nil},;\r\n\t\t\t\t           {\"AUTMOTBX\"    ,\"NOR\"           ,Nil},;\r\n\t\t\t\t           {\"AUTDTBAIXA\"  ,date()          ,Nil},;\r\n\t\t\t\t           {\"AUTDTCREDITO\",date()          ,Nil},;\r\n\t\t\t\t           {\"AUTHIST\"     ,\"\"              ,Nil},;\r\n\t\t\t\t           {\"AUTVALREC\"   ,SE1->E1_VALOR   ,Nil}}\r\n\r\n\r\n\t\t\t\tlMsErroAuto:=.F. //reseta lMsErroAuto\r\n\t\t\t\tMSExecAuto ({|x,y| FINA070(x,y)},aBaixa, 5)\r\n\r\n\t\t\t\tIf lMsErroAuto\r\n\t\t\t\t\tfWrite(nFileLog,SE1->E1_FILIAL+\" : Não foi efetuada o cancelamento de baixa : \"+CRLF+ MSErroString()+ CRLF + tojson(aBaixa) + CRLF)\r\n\t\t\t\t\treturn\r\n\t\t\t\telse\r\n\t\t\t\t\tfWrite(nFileLog,SE1->E1_FILIAL+\" : cancelamento de baixa feito\" +CRLF)\r\n\t\t\t\tendif\r\n\r\n\t\t\tNext nI\r\n\r\n\t\t\tSE1ORIG->(dbskip())\r\n\t\tend\r\n\r\n\tReset Environment\r\n\r\nReturn\r\n"
  }
]